summaryrefslogtreecommitdiffstats
path: root/master/feeds
diff options
context:
space:
mode:
authorJames <>2015-11-08 10:00:58 +0000
committerJames <>2015-11-08 10:00:58 +0000
commit680ce76497b2d58a3d0abb002984d3dc2bbc8887 (patch)
tree33f63da313b893a7c8707c65cd5d67c16e4c74c6 /master/feeds
downloadtrunk-47381-pq-680ce76497b2d58a3d0abb002984d3dc2bbc8887.tar.gz
trunk-47381-pq-680ce76497b2d58a3d0abb002984d3dc2bbc8887.tar.bz2
trunk-47381-pq-680ce76497b2d58a3d0abb002984d3dc2bbc8887.zip
Diffstat (limited to 'master/feeds')
-rw-r--r--master/feeds826059
1 files changed, 826059 insertions, 0 deletions
diff --git a/master/feeds b/master/feeds
new file mode 100644
index 0000000..e7e592b
--- /dev/null
+++ b/master/feeds
@@ -0,0 +1,826059 @@
+diff --git a/.gitignore b/.gitignore
+index 7b2a802..bba0538 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -10,9 +10,10 @@
+ /staging_dir
+ /tmp
+ /logs
+-/feeds
+-/feeds.conf
+ /files
++/feeds/*.tmp
++/feeds/*.index
++/feeds/*.targetindex
+ /package/feeds
+ /package/openwrt-packages
+ key-build*
+diff --git a/feeds/luci/.buildpath b/feeds/luci/.buildpath
+new file mode 100644
+index 0000000..81fa646
+--- /dev/null
++++ b/feeds/luci/.buildpath
+@@ -0,0 +1,5 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<buildpath>
++ <buildpathentry kind="src" path="src"/>
++ <buildpathentry kind="con" path="org.eclipse.dltk.launching.INTERPRETER_CONTAINER"/>
++</buildpath>
+diff --git a/feeds/luci/.cproject b/feeds/luci/.cproject
+new file mode 100644
+index 0000000..e1a4774
+--- /dev/null
++++ b/feeds/luci/.cproject
+@@ -0,0 +1,221 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<?fileVersion 4.0.0?>
++
++<cproject>
++<storageModule moduleId="org.eclipse.cdt.core.settings">
++<cconfiguration id="preference.org.eclipse.cdt.managedbuilder.core.configurationDataProvider.1510318341">
++<storageModule moduleId="cdtBuildSystem" version="4.0.0">
++<configuration artifactName="luci" buildProperties="" description="" id="preference.org.eclipse.cdt.managedbuilder.core.configurationDataProvider.1510318341" name="Preference Configuration" parent="org.eclipse.cdt.build.core.prefbase.cfg">
++<folderInfo id="preference.org.eclipse.cdt.managedbuilder.core.configurationDataProvider.1510318341." name="/" resourcePath="">
++<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.407447051" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
++<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.407447051.1470931541" name=""/>
++<builder id="org.eclipse.cdt.build.core.settings.default.builder.823611263" keepEnvironmentInBuildfile="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
++<tool id="org.eclipse.cdt.build.core.settings.holder.libs.1685234798" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
++<tool id="org.eclipse.cdt.build.core.settings.holder.570824141" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
++<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.491129717" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
++<listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
++<listOptionValue builtIn="false" value="/usr/include"/>
++</option>
++<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.858094059" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
++</tool>
++<tool id="org.eclipse.cdt.build.core.settings.holder.344617955" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
++<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.564526987" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
++<listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
++<listOptionValue builtIn="false" value="/usr/include"/>
++</option>
++<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1426860237" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
++</tool>
++<tool id="org.eclipse.cdt.build.core.settings.holder.869454750" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
++<option id="org.eclipse.cdt.build.core.settings.holder.incpaths.838425449" name="Include Paths" superClass="org.eclipse.cdt.build.core.settings.holder.incpaths" valueType="includePath">
++<listOptionValue builtIn="false" value="/usr/include/lua5.1"/>
++<listOptionValue builtIn="false" value="/usr/include"/>
++</option>
++<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1755775295" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
++</tool>
++</toolChain>
++</folderInfo>
++</configuration>
++</storageModule>
++<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="preference.org.eclipse.cdt.managedbuilder.core.configurationDataProvider.1510318341" moduleId="org.eclipse.cdt.core.settings" name="Preference Configuration">
++<externalSettings/>
++<extensions>
++<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
++<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
++<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
++<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
++<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
++</extensions>
++</storageModule>
++<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
++<storageModule moduleId="scannerConfiguration">
++<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
++<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="makefileGenerator">
++<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<scannerConfigBuildInfo instanceId="preference.org.eclipse.cdt.managedbuilder.core.configurationDataProvider.1510318341">
++<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
++<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="makefileGenerator">
++<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
++<buildOutputProvider>
++<openAction enabled="true" filePath=""/>
++<parser enabled="true"/>
++</buildOutputProvider>
++<scannerInfoProvider id="specsFile">
++<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
++<parser enabled="true"/>
++</scannerInfoProvider>
++</profile>
++</scannerConfigBuildInfo>
++</storageModule>
++</cconfiguration>
++</storageModule>
++<storageModule moduleId="cdtBuildSystem" version="4.0.0">
++<project id="luci.null.949486034" name="luci"/>
++</storageModule>
++</cproject>
+diff --git a/feeds/luci/.gitignore b/feeds/luci/.gitignore
+new file mode 100644
+index 0000000..07494e9
+--- /dev/null
++++ b/feeds/luci/.gitignore
+@@ -0,0 +1,8 @@
++dist/
++/host
++*.o
++*.so
++*.swp
++*.po~
++/docs
++modules/luci-base/src/po2lmo
+diff --git a/feeds/luci/.project b/feeds/luci/.project
+new file mode 100644
+index 0000000..11b398b
+--- /dev/null
++++ b/feeds/luci/.project
+@@ -0,0 +1,78 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<projectDescription>
++ <name>luci</name>
++ <comment></comment>
++ <projects>
++ </projects>
++ <buildSpec>
++ <buildCommand>
++ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
++ <triggers>clean,full,incremental,</triggers>
++ <arguments>
++ <dictionary>
++ <key>?name?</key>
++ <value></value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.append_environment</key>
++ <value>true</value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
++ <value>all</value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.buildArguments</key>
++ <value></value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.buildCommand</key>
++ <value>make</value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
++ <value>clean</value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.contents</key>
++ <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
++ <value>false</value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
++ <value>true</value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
++ <value>true</value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
++ <value>all</value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.stopOnError</key>
++ <value>true</value>
++ </dictionary>
++ <dictionary>
++ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
++ <value>true</value>
++ </dictionary>
++ </arguments>
++ </buildCommand>
++ <buildCommand>
++ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
++ <arguments>
++ </arguments>
++ </buildCommand>
++ </buildSpec>
++ <natures>
++ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
++ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
++ <nature>org.eclipse.cdt.core.cnature</nature>
++ <nature>org.eclipse.dltk.lua.core.nature</nature>
++ </natures>
++</projectDescription>
+diff --git a/feeds/luci/CONTRIBUTING.md b/feeds/luci/CONTRIBUTING.md
+new file mode 100644
+index 0000000..a392ade
+--- /dev/null
++++ b/feeds/luci/CONTRIBUTING.md
+@@ -0,0 +1,62 @@
++# Contributing Guidelines
++
++## Patches and Pull requests:
++
++If you want to contribute a change to LuCI, please either send a patch using git send-email
++or open a "pull request" against the openwrt/luci repository.
++
++Regardless of whether you send a patch or open a pull request, please try to follow these rules:
++
++* Have a useful subject prefixed with the component name
++ (E.g.: "luci-mod-admin-full: fix wifi channel selection on multiple STA networks")
++* Shortly explain the changes made and - if applicable - the reasoning behind them
++* Include Signed-off-by in the comment
++ (See <https://dev.openwrt.org/wiki/SubmittingPatches#a10.Signyourwork>)
++
++In case you like to send patches by mail, please use the [LuCI mailinglist](https://lists.subsignal.org/mailman/listinfo/luci)
++or the [OpenWrt Development List](https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel).
++
++If you send via the OpenWrt list, include a "[luci]" tag in your subject line.
++For general information on patch submission, follow the [OpenWrt patch submission guideline](https://dev.openwrt.org/wiki/SubmittingPatches).
++
++## Advice on pull requests:
++
++Pull requests are the easiest way to contribute changes to git repos at Github. They are the preferred contribution method, as they offer a nice way for commenting and amending the proposed changes.
++
++* You need a local "fork" of the Github repo.
++* Use a "feature branch" for your changes. That separates the changes in the pull request from your other changes and makes it easy to edit/amend commits in the pull request. Workflow using "feature_x" as the example:
++ - Update your local git fork to the tip (of the master, usually)
++ - Create the feature branch with `git checkout -b feature_x`
++ - Edit changes and commit them locally
++ - Push them to your Github fork by `git push -u origin feature_x`. That creates the "feature_x" branch at your Github fork and sets it as the remote of this branch
++ - When you now visit Github, you should see a proposal to create a pull request
++
++* If you later need to add new commits to the pull request, you can simply commit the changes to the local branch and then use `git push` to automatically update the pull request.
++
++* If you need to change something in the existing pull request (e.g. to add a missing signed-off-by line to the commit message), you can use `git push -f` to overwrite the original commits. That is easy and safe when using a feature branch. Example workflow:
++ - Checkout the feature branch by `git checkout feature_x`
++ - Edit changes and commit them locally. If you are just updating the commit message in the last commit, you can use `git commit --amend` to do that
++ - If you added several new commits or made other changes that require cleaning up, you can use `git rebase -i HEAD~X` (X = number of commits to edit) to possibly squash some commits
++ - Push the changed commits to Github with `git push -f` to overwrite the original commits in the "feature_x" branch with the new ones. The pull request gets automatically updated
++
++## If you have commit access:
++
++* Do NOT use git push --force.
++* Use Pull Requests if you are unsure and to suggest changes to other developers.
++
++## Gaining commit access:
++
++* Commit access will be granted to responsible contributors who have made
++ useful pull requests and / or feedback or patches to this repository or
++ OpenWrt in general. Please include your request for commit access in your
++ next pull request or ticket.
++
++## Release Branches:
++
++* Branches named "for-XX.YY" or "luci-X.Y" (e.g. "for-15.05") are release branches.
++* These branches are built with the respective OpenWrt release and are created
++ during the release stabilisation phase.
++* Please ONLY cherry-pick or commit security and bug-fixes to these branches.
++* Do NOT add new packages and do NOT do major upgrades of packages here.
++* If you are unsure if your change is suitable, please use a pull request.
++
+diff --git a/feeds/luci/LICENSE b/feeds/luci/LICENSE
+new file mode 100644
+index 0000000..f49a4e1
+--- /dev/null
++++ b/feeds/luci/LICENSE
+@@ -0,0 +1,201 @@
++ Apache License
++ Version 2.0, January 2004
++ http://www.apache.org/licenses/
++
++ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
++
++ 1. Definitions.
++
++ "License" shall mean the terms and conditions for use, reproduction,
++ and distribution as defined by Sections 1 through 9 of this document.
++
++ "Licensor" shall mean the copyright owner or entity authorized by
++ the copyright owner that is granting the License.
++
++ "Legal Entity" shall mean the union of the acting entity and all
++ other entities that control, are controlled by, or are under common
++ control with that entity. For the purposes of this definition,
++ "control" means (i) the power, direct or indirect, to cause the
++ direction or management of such entity, whether by contract or
++ otherwise, or (ii) ownership of fifty percent (50%) or more of the
++ outstanding shares, or (iii) beneficial ownership of such entity.
++
++ "You" (or "Your") shall mean an individual or Legal Entity
++ exercising permissions granted by this License.
++
++ "Source" form shall mean the preferred form for making modifications,
++ including but not limited to software source code, documentation
++ source, and configuration files.
++
++ "Object" form shall mean any form resulting from mechanical
++ transformation or translation of a Source form, including but
++ not limited to compiled object code, generated documentation,
++ and conversions to other media types.
++
++ "Work" shall mean the work of authorship, whether in Source or
++ Object form, made available under the License, as indicated by a
++ copyright notice that is included in or attached to the work
++ (an example is provided in the Appendix below).
++
++ "Derivative Works" shall mean any work, whether in Source or Object
++ form, that is based on (or derived from) the Work and for which the
++ editorial revisions, annotations, elaborations, or other modifications
++ represent, as a whole, an original work of authorship. For the purposes
++ of this License, Derivative Works shall not include works that remain
++ separable from, or merely link (or bind by name) to the interfaces of,
++ the Work and Derivative Works thereof.
++
++ "Contribution" shall mean any work of authorship, including
++ the original version of the Work and any modifications or additions
++ to that Work or Derivative Works thereof, that is intentionally
++ submitted to Licensor for inclusion in the Work by the copyright owner
++ or by an individual or Legal Entity authorized to submit on behalf of
++ the copyright owner. For the purposes of this definition, "submitted"
++ means any form of electronic, verbal, or written communication sent
++ to the Licensor or its representatives, including but not limited to
++ communication on electronic mailing lists, source code control systems,
++ and issue tracking systems that are managed by, or on behalf of, the
++ Licensor for the purpose of discussing and improving the Work, but
++ excluding communication that is conspicuously marked or otherwise
++ designated in writing by the copyright owner as "Not a Contribution."
++
++ "Contributor" shall mean Licensor and any individual or Legal Entity
++ on behalf of whom a Contribution has been received by Licensor and
++ subsequently incorporated within the Work.
++
++ 2. Grant of Copyright License. Subject to the terms and conditions of
++ this License, each Contributor hereby grants to You a perpetual,
++ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++ copyright license to reproduce, prepare Derivative Works of,
++ publicly display, publicly perform, sublicense, and distribute the
++ Work and such Derivative Works in Source or Object form.
++
++ 3. Grant of Patent License. Subject to the terms and conditions of
++ this License, each Contributor hereby grants to You a perpetual,
++ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++ (except as stated in this section) patent license to make, have made,
++ use, offer to sell, sell, import, and otherwise transfer the Work,
++ where such license applies only to those patent claims licensable
++ by such Contributor that are necessarily infringed by their
++ Contribution(s) alone or by combination of their Contribution(s)
++ with the Work to which such Contribution(s) was submitted. If You
++ institute patent litigation against any entity (including a
++ cross-claim or counterclaim in a lawsuit) alleging that the Work
++ or a Contribution incorporated within the Work constitutes direct
++ or contributory patent infringement, then any patent licenses
++ granted to You under this License for that Work shall terminate
++ as of the date such litigation is filed.
++
++ 4. Redistribution. You may reproduce and distribute copies of the
++ Work or Derivative Works thereof in any medium, with or without
++ modifications, and in Source or Object form, provided that You
++ meet the following conditions:
++
++ (a) You must give any other recipients of the Work or
++ Derivative Works a copy of this License; and
++
++ (b) You must cause any modified files to carry prominent notices
++ stating that You changed the files; and
++
++ (c) You must retain, in the Source form of any Derivative Works
++ that You distribute, all copyright, patent, trademark, and
++ attribution notices from the Source form of the Work,
++ excluding those notices that do not pertain to any part of
++ the Derivative Works; and
++
++ (d) If the Work includes a "NOTICE" text file as part of its
++ distribution, then any Derivative Works that You distribute must
++ include a readable copy of the attribution notices contained
++ within such NOTICE file, excluding those notices that do not
++ pertain to any part of the Derivative Works, in at least one
++ of the following places: within a NOTICE text file distributed
++ as part of the Derivative Works; within the Source form or
++ documentation, if provided along with the Derivative Works; or,
++ within a display generated by the Derivative Works, if and
++ wherever such third-party notices normally appear. The contents
++ of the NOTICE file are for informational purposes only and
++ do not modify the License. You may add Your own attribution
++ notices within Derivative Works that You distribute, alongside
++ or as an addendum to the NOTICE text from the Work, provided
++ that such additional attribution notices cannot be construed
++ as modifying the License.
++
++ You may add Your own copyright statement to Your modifications and
++ may provide additional or different license terms and conditions
++ for use, reproduction, or distribution of Your modifications, or
++ for any such Derivative Works as a whole, provided Your use,
++ reproduction, and distribution of the Work otherwise complies with
++ the conditions stated in this License.
++
++ 5. Submission of Contributions. Unless You explicitly state otherwise,
++ any Contribution intentionally submitted for inclusion in the Work
++ by You to the Licensor shall be under the terms and conditions of
++ this License, without any additional terms or conditions.
++ Notwithstanding the above, nothing herein shall supersede or modify
++ the terms of any separate license agreement you may have executed
++ with Licensor regarding such Contributions.
++
++ 6. Trademarks. This License does not grant permission to use the trade
++ names, trademarks, service marks, or product names of the Licensor,
++ except as required for reasonable and customary use in describing the
++ origin of the Work and reproducing the content of the NOTICE file.
++
++ 7. Disclaimer of Warranty. Unless required by applicable law or
++ agreed to in writing, Licensor provides the Work (and each
++ Contributor provides its Contributions) on an "AS IS" BASIS,
++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
++ implied, including, without limitation, any warranties or conditions
++ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
++ PARTICULAR PURPOSE. You are solely responsible for determining the
++ appropriateness of using or redistributing the Work and assume any
++ risks associated with Your exercise of permissions under this License.
++
++ 8. Limitation of Liability. In no event and under no legal theory,
++ whether in tort (including negligence), contract, or otherwise,
++ unless required by applicable law (such as deliberate and grossly
++ negligent acts) or agreed to in writing, shall any Contributor be
++ liable to You for damages, including any direct, indirect, special,
++ incidental, or consequential damages of any character arising as a
++ result of this License or out of the use or inability to use the
++ Work (including but not limited to damages for loss of goodwill,
++ work stoppage, computer failure or malfunction, or any and all
++ other commercial damages or losses), even if such Contributor
++ has been advised of the possibility of such damages.
++
++ 9. Accepting Warranty or Additional Liability. While redistributing
++ the Work or Derivative Works thereof, You may choose to offer,
++ and charge a fee for, acceptance of support, warranty, indemnity,
++ or other liability obligations and/or rights consistent with this
++ License. However, in accepting such obligations, You may act only
++ on Your own behalf and on Your sole responsibility, not on behalf
++ of any other Contributor, and only if You agree to indemnify,
++ defend, and hold each Contributor harmless for any liability
++ incurred by, or claims asserted against, such Contributor by reason
++ of your accepting any such warranty or additional liability.
++
++ END OF TERMS AND CONDITIONS
++
++ APPENDIX: How to apply the Apache License to your work.
++
++ To apply the Apache License to your work, attach the following
++ boilerplate notice, with the fields enclosed by brackets "[]"
++ replaced with your own identifying information. (Don't include
++ the brackets!) The text should be enclosed in the appropriate
++ comment syntax for the file format. We also recommend that a
++ file or class name and description of purpose be included on the
++ same "printed page" as the copyright notice for easier
++ identification within third-party archives.
++
++ Copyright [yyyy] [name of copyright owner]
++
++ Licensed under the Apache License, Version 2.0 (the "License");
++ you may not use this file except in compliance with the License.
++ You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++ Unless required by applicable law or agreed to in writing, software
++ distributed under the License is distributed on an "AS IS" BASIS,
++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ See the License for the specific language governing permissions and
++ limitations under the License.
+\ No newline at end of file
+diff --git a/feeds/luci/NOTICE b/feeds/luci/NOTICE
+new file mode 100644
+index 0000000..47e1969
+--- /dev/null
++++ b/feeds/luci/NOTICE
+@@ -0,0 +1,9 @@
++LuCI - Lua Configuration Interface
++Copyright 2008 Steven Barth <steven@midlink.org>
++Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++Licensed under the Apache License, Version 2.0.
++
++Contains code from:
++coxpcall - Copyright 2005 - Kepler Project (www.keplerproject.org)
++ltn12/luasocket - Copyright 2004-2007 Diego Nehab
++axTLS - Copyright 2008 Cameron Rich
+diff --git a/feeds/luci/README.md b/feeds/luci/README.md
+new file mode 100644
+index 0000000..abccff6
+--- /dev/null
++++ b/feeds/luci/README.md
+@@ -0,0 +1,30 @@
++# OpenWrt luci feed
++
++## Description
++
++This is the OpenWrt "luci"-feed containing LuCI - OpenWrt Configuration Interface.
++
++## Usage
++
++This feed is enabled by default. Your feeds.conf.default (or feeds.conf) should contain a line like:
++```
++src-git luci https://github.com/openwrt/luci.git
++```
++
++To install all its package definitions, run:
++```
++./scripts/feeds update luci
++./scripts/feeds install -a -p luci
++```
++
++## API Reference
++
++You can browse the generated API documentation [directly on Github](http://htmlpreview.github.io/?http://raw.githubusercontent.com/openwrt/luci/master/documentation/api/index.html).
++
++## License
++
++See [LICENSE](LICENSE) file.
++
++## Package Guidelines
++
++See [CONTRIBUTING.md](CONTRIBUTING.md) file.
+diff --git a/feeds/luci/THANKYOU b/feeds/luci/THANKYOU
+new file mode 100644
+index 0000000..f0519bd
+--- /dev/null
++++ b/feeds/luci/THANKYOU
+@@ -0,0 +1,26 @@
++I'd like to thank the following people for contributing to this software:
++
++* Anton Popov
++ - for rewriting the openwrt.org theme
++
++* Florian Fainelli (OpenWrt)
++ - for the french translation
++
++* Alina Friedrichsen
++ - for the reworked translation system, help on standards compliance and accessibility
++
++* Yanira
++ - several applications and bugreports
++
++
++Also a big thank you goes to:
++
++* Mono (Freifunk Halle)
++ - for donating a Linksys WRT54GL for development purposes
++
++* tetzlav (Freifunk Leipzig)
++ - for donating several boards for testing and his feedback
++
++* Mickey (Freifunk Hannover)
++ - for his feedback and fixes for the OpenWrt builds
++
+diff --git a/feeds/luci/applications/luci-app-ahcp/Makefile b/feeds/luci/applications/luci-app-ahcp/Makefile
+new file mode 100644
+index 0000000..bb4d415
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for AHCPd
++LUCI_DEPENDS:=+ahcpd
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-ahcp/luasrc/controller/ahcp.lua b/feeds/luci/applications/luci-app-ahcp/luasrc/controller/ahcp.lua
+new file mode 100644
+index 0000000..e97da55
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/luasrc/controller/ahcp.lua
+@@ -0,0 +1,49 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.ahcp", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/ahcpd") then
++ return
++ end
++
++ entry({"admin", "network", "ahcpd"}, cbi("ahcp"), _("AHCP Server"), 90)
++ entry({"admin", "network", "ahcpd", "status"}, call("ahcp_status"))
++end
++
++function ahcp_status()
++ local nfs = require "nixio.fs"
++ local uci = require "luci.model.uci".cursor()
++ local lsd = uci:get_first("ahcpd", "ahcpd", "lease_dir") or "/var/lib/leases"
++ local idf = uci:get_first("ahcpd", "ahcpd", "id_file") or "/var/lib/ahcpd-unique-id"
++
++ local rv = {
++ uid = "00:00:00:00:00:00:00:00",
++ leases = { }
++ }
++
++ idf = nfs.readfile(idf)
++ if idf and #idf == 8 then
++ rv.uid = "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X" %{ idf:byte(1, 8) }
++ end
++
++ local itr = nfs.dir(lsd)
++ if itr then
++ local addr
++ for addr in itr do
++ if addr:match("^%d+%.%d+%.%d+%.%d+$") then
++ local s = nfs.stat(lsd .. "/" .. addr)
++ rv.leases[#rv.leases+1] = {
++ addr = addr,
++ age = s and (os.time() - s.mtime) or 0
++ }
++ end
++ end
++ end
++
++ table.sort(rv.leases, function(a, b) return a.age < b.age end)
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++end
+diff --git a/feeds/luci/applications/luci-app-ahcp/luasrc/model/cbi/ahcp.lua b/feeds/luci/applications/luci-app-ahcp/luasrc/model/cbi/ahcp.lua
+new file mode 100644
+index 0000000..30897eb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/luasrc/model/cbi/ahcp.lua
+@@ -0,0 +1,110 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("ahcpd", translate("AHCP Server"), translate("AHCP is an autoconfiguration protocol " ..
++ "for IPv6 and dual-stack IPv6/IPv4 networks designed to be used in place of router " ..
++ "discovery or DHCP on networks where it is difficult or impossible to configure a " ..
++ "server within every link-layer broadcast domain, for example mobile ad-hoc networks."))
++
++
++m:section(SimpleSection).template = "ahcp_status"
++
++s = m:section(TypedSection, "ahcpd")
++s:tab("general", translate("General Setup"))
++s:tab("advanced", translate("Advanced Settings"))
++s.addremove = false
++s.anonymous = true
++
++
++mode = s:taboption("general", ListValue, "mode", translate("Operation mode"))
++mode:value("server", translate("Server"))
++mode:value("forwarder", translate("Forwarder"))
++
++net = s:taboption("general", Value, "interface", translate("Served interfaces"))
++net.template = "cbi/network_netlist"
++net.widget = "checkbox"
++net.nocreate = true
++
++function net.cfgvalue(self, section)
++ return m.uci:get("ahcpd", section, "interface")
++end
++
++pfx = s:taboption("general", DynamicList, "prefix", translate("Announced prefixes"),
++ translate("Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"))
++pfx.optional = true
++pfx.datatype = "ipaddr"
++pfx:depends("mode", "server")
++
++nss = s:taboption("general", DynamicList, "name_server", translate("Announced DNS servers"),
++ translate("Specifies the announced IPv4 and IPv6 name servers"))
++nss.optional = true
++nss.datatype = "ipaddr"
++nss:depends("mode", "server")
++
++ntp = s:taboption("general", DynamicList, "ntp_server", translate("Announced NTP servers"),
++ translate("Specifies the announced IPv4 and IPv6 NTP servers"))
++ntp.optional = true
++ntp.datatype = "ipaddr"
++ntp:depends("mode", "server")
++
++mca = s:taboption("general", Value, "multicast_address", translate("Multicast address"))
++mca.optional = true
++mca.placeholder = "ff02::cca6:c0f9:e182:5359"
++mca.datatype = "ip6addr"
++
++port = s:taboption("general", Value, "port", translate("Port"))
++port.optional = true
++port.placeholder = 5359
++port.datatype = "port"
++
++fam = s:taboption("general", ListValue, "_family", translate("Protocol family"))
++fam:value("", translate("IPv4 and IPv6"))
++fam:value("ipv4", translate("IPv4 only"))
++fam:value("ipv6", translate("IPv6 only"))
++
++function fam.cfgvalue(self, section)
++ local v4 = m.uci:get_bool("ahcpd", section, "ipv4_only")
++ local v6 = m.uci:get_bool("ahcpd", section, "ipv6_only")
++ if v4 then
++ return "ipv4"
++ elseif v6 then
++ return "ipv6"
++ end
++ return ""
++end
++
++function fam.write(self, section, value)
++ if value == "ipv4" then
++ m.uci:set("ahcpd", section, "ipv4_only", "true")
++ m.uci:delete("ahcpd", section, "ipv6_only")
++ elseif value == "ipv6" then
++ m.uci:set("ahcpd", section, "ipv6_only", "true")
++ m.uci:delete("ahcpd", section, "ipv4_only")
++ end
++end
++
++function fam.remove(self, section)
++ m.uci:delete("ahcpd", section, "ipv4_only")
++ m.uci:delete("ahcpd", section, "ipv6_only")
++end
++
++ltime = s:taboption("general", Value, "lease_time", translate("Lease validity time"))
++ltime.optional = true
++ltime.placeholder = 3666
++ltime.datatype = "uinteger"
++
++
++ld = s:taboption("advanced", Value, "lease_dir", translate("Lease directory"))
++ld.datatype = "directory"
++ld.placeholder = "/var/lib/leases"
++
++id = s:taboption("advanced", Value, "id_file", translate("Unique ID file"))
++--id.datatype = "file"
++id.placeholder = "/var/lib/ahcpd-unique-id"
++
++log = s:taboption("advanced", Value, "log_file", translate("Log file"))
++--log.datatype = "file"
++log.placeholder = "/var/log/ahcpd.log"
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ahcp/luasrc/view/admin_status/index/ahcp.htm b/feeds/luci/applications/luci-app-ahcp/luasrc/view/admin_status/index/ahcp.htm
+new file mode 100644
+index 0000000..ef4cfca
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/luasrc/view/admin_status/index/ahcp.htm
+@@ -0,0 +1 @@
++<%+ahcp_status%>
+diff --git a/feeds/luci/applications/luci-app-ahcp/luasrc/view/ahcp_status.htm b/feeds/luci/applications/luci-app-ahcp/luasrc/view/ahcp_status.htm
+new file mode 100644
+index 0000000..9468289
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/luasrc/view/ahcp_status.htm
+@@ -0,0 +1,53 @@
++<script type="text/javascript">//<![CDATA[
++ XHR.poll(5, '<%=url('admin/network/ahcpd/status')%>', null,
++ function(x, st)
++ {
++ var tb = document.getElementById('ahcpd_status_table');
++ var tx = document.getElementById('ahcpd_status_text');
++ if (st && tb && tx)
++ {
++ /* clear all rows */
++ while( tb.rows.length > 1 )
++ tb.deleteRow(1);
++
++ 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);
++ }
++
++ 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( 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);
++ }
++ }
++ );
++//]]></script>
++
++<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>
++</fieldset>
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/ca/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/ca/ahcp.po
+new file mode 100644
+index 0000000..89108fd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/ca/ahcp.po
+@@ -0,0 +1,117 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-02 21:34+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "Servidor AHCP"
++
++# Minor misspelling corrections
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP és un protocol de configuració automàtica per IPv6 i xarxes de pila "
++"dual IPv6/IPv4 dissenyat per fer servir en lloc del descobriment de rutes o "
++"DHCP en xarxes on es difícil o impossible configurar un servidor dins de "
++"tots els dominis de difusió a la capa d'enllaç, per exemple xarxes mòbils ad-"
++"hoc."
++
++# apòstrof+acrònims http://ca.wikipedia.org/wiki/Ap%C3%B2strof#Observacions
++msgid "Active AHCP Leases"
++msgstr "Leases actius d'AHCP"
++
++msgid "Address"
++msgstr "Adreça"
++
++msgid "Advanced Settings"
++msgstr "Configuració avançada"
++
++msgid "Age"
++msgstr "Edat"
++
++msgid "Announced DNS servers"
++msgstr "Servidors DNS anunciats"
++
++msgid "Announced NTP servers"
++msgstr "Servidors NTP anunciats"
++
++msgid "Announced prefixes"
++msgstr "Prefixos anunciats"
++
++msgid "Collecting data..."
++msgstr "Recopilant informació..."
++
++msgid "Forwarder"
++msgstr "Retransmissor"
++
++msgid "General Setup"
++msgstr "Configuració general"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 i IPv6"
++
++msgid "IPv4 only"
++msgstr "Només IPv4"
++
++msgid "IPv6 only"
++msgstr "Només IPv6"
++
++msgid "Lease directory"
++msgstr "Directori d'arrendament"
++
++msgid "Lease validity time"
++msgstr "Duració d'arrendament"
++
++msgid "Log file"
++msgstr "Fitxer de registre"
++
++msgid "Multicast address"
++msgstr "Adreça de difusió selectiva"
++
++msgid "Operation mode"
++msgstr "Mode d'operació"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol family"
++msgstr "Família de protocol"
++
++msgid "Served interfaces"
++msgstr "Interfícies servides"
++
++msgid "Server"
++msgstr "Servidor"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Especifica els servidors NTP IPv4 i IPv6 anunciats"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Especifica els servidors de noms IPv4 i IPv6 anunciats"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "Especifica els prefixos de xarxa IPv4 i IPv6 anunciats en notació CIDR"
++
++msgid "The AHCP Service is not running."
++msgstr "El servidor AHCP no està funcionant."
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "El servei AHCP està funcionant amb el ID %s."
++
++msgid "There are no active leases."
++msgstr "No hi ha arrendaments actius."
++
++msgid "Unique ID file"
++msgstr "Fitxer ID únic"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/cs/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/cs/ahcp.po
+new file mode 100644
+index 0000000..0a9e0af
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/cs/ahcp.po
+@@ -0,0 +1,114 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-04-23 23:01+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "AHCP Server"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP je autokonfiguraÄní protokol pro IPv6 a dual-stack IPv6/IPv4 sítÄ›, "
++"vytvoÅ™ený pro použití vedle funkcí router discovery (Vyhledávání smÄ›rovaÄů "
++"pomocí ICMP zpráv) a DHCP na sítích kde je obtížné Äi nemožné nakonfigurovat "
++"server v každé vrstvě broadcast domény, například mobilní ad-hoc sítě."
++
++msgid "Active AHCP Leases"
++msgstr "Aktivní AHCP zapůjÄení"
++
++msgid "Address"
++msgstr "Adresa"
++
++msgid "Advanced Settings"
++msgstr "PokroÄilé nastavení"
++
++msgid "Age"
++msgstr "Stáří"
++
++msgid "Announced DNS servers"
++msgstr "Oznámené DNS servery"
++
++msgid "Announced NTP servers"
++msgstr "Oznámené NTP servery"
++
++msgid "Announced prefixes"
++msgstr "Oznámené pÅ™edÄíslí"
++
++msgid "Collecting data..."
++msgstr "Probíhá shromažÄování dat..."
++
++msgid "Forwarder"
++msgstr "Přesměrování"
++
++msgid "General Setup"
++msgstr "Obecné nastavení"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 a IPv6"
++
++msgid "IPv4 only"
++msgstr "pouze IPv4"
++
++msgid "IPv6 only"
++msgstr "Pouze IPv6"
++
++msgid "Lease directory"
++msgstr "ZapůjÄené adresáře"
++
++msgid "Lease validity time"
++msgstr "Doba platnosti zapujÄení"
++
++msgid "Log file"
++msgstr "Soubor protokolu"
++
++msgid "Multicast address"
++msgstr "Vícesměrové adresy"
++
++msgid "Operation mode"
++msgstr "Pracovní režim"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol family"
++msgstr "Rodina protokolů"
++
++msgid "Served interfaces"
++msgstr "Obsluhované rozhraní"
++
++msgid "Server"
++msgstr "Servr"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Specifikuje ohlášené IPv4 a IPv6 NTP servery"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Specifikuje ohlášené IPv4 a IPv6 názvové servery"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "Specifikuje ohlášené IPv4 a IPv6 sítě předpony v CIDR notaci"
++
++msgid "The AHCP Service is not running."
++msgstr "Služba AHCP neběží"
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "Služba AHCP je spuštěna s ID %s."
++
++msgid "There are no active leases."
++msgstr "Neexistují žádná aktivní pronajmutí."
++
++msgid "Unique ID file"
++msgstr "JedineÄný ID soubor"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/de/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/de/ahcp.po
+new file mode 100644
+index 0000000..6df34d8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/de/ahcp.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-30 18:21+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "AHCP Server"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP ist ein Autokonfigurationsprotokoll für IPv6- und IPv4/IPv6 Dualstack-"
++"Netzwerke. Es ist darauf ausgelegt anstelle von Router Advertisements und "
++"DHCP-Servern in Ad-Hoc Netzwerken eingesetzt zu werden."
++
++msgid "Active AHCP Leases"
++msgstr "Aktive AHCP-Leases"
++
++msgid "Address"
++msgstr "Adresse"
++
++msgid "Advanced Settings"
++msgstr "Erweiterte Einstellungen"
++
++msgid "Age"
++msgstr "Alter"
++
++msgid "Announced DNS servers"
++msgstr "Angekündigte DNS-Server"
++
++msgid "Announced NTP servers"
++msgstr "Angekündigte NTP-Server"
++
++msgid "Announced prefixes"
++msgstr "Angekündigte Prefixe"
++
++msgid "Collecting data..."
++msgstr "Sammle Daten..."
++
++msgid "Forwarder"
++msgstr "Forwarder"
++
++msgid "General Setup"
++msgstr "Allgemeine Einstellungen"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 und IPv6"
++
++msgid "IPv4 only"
++msgstr "nur IPv4"
++
++msgid "IPv6 only"
++msgstr "nur IPv6"
++
++msgid "Lease directory"
++msgstr "Lease-Verzeichnis"
++
++msgid "Lease validity time"
++msgstr "Lease-Gültigkeitsdauer"
++
++msgid "Log file"
++msgstr "Protokolldatei"
++
++msgid "Multicast address"
++msgstr "Mutlicast-Adresse"
++
++msgid "Operation mode"
++msgstr "Betriebsmodus"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol family"
++msgstr "Protokollfamilie"
++
++msgid "Served interfaces"
++msgstr "Verwendete Schnittstellen"
++
++msgid "Server"
++msgstr "Server"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Konfiguriert die bekannt gegebenen IPv4- und IPv6-NTP-Server"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Konfiguriert die bekannt gegebenen IPv4- und IPv6-DNS-Server"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++"Konfiguriert die bekannt gegebenen IPv4- und IPv6-Netzwerkprefixe. Angabe in "
++"CIDR-Notation."
++
++msgid "The AHCP Service is not running."
++msgstr "Der AHCP-Dienst läuft nicht."
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "Der AHCP-Dienst läuft mit ID %s."
++
++msgid "There are no active leases."
++msgstr "Es gibt keine aktiven Leases."
++
++msgid "Unique ID file"
++msgstr "UID-Datei"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/el/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/el/ahcp.po
+new file mode 100644
+index 0000000..0d7d6bd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/el/ahcp.po
+@@ -0,0 +1,114 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-18 16:25+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: none\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "AHCP Server"
++msgstr "ΕξυπηÏετητής AHCP"
++
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++
++msgid "Active AHCP Leases"
++msgstr "ΕνεÏγά AHCP Leases"
++
++msgid "Address"
++msgstr "ΔιεÏθυνση"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Age"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Announced NTP servers"
++msgstr ""
++
++msgid "Announced prefixes"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr "Συλλέγονται δεδομένα..."
++
++msgid "Forwarder"
++msgstr "ΠÏοωθητής"
++
++msgid "General Setup"
++msgstr "Γενικές Ïυθμίσεις"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 και IPv6"
++
++msgid "IPv4 only"
++msgstr "μόνο IPv4"
++
++msgid "IPv6 only"
++msgstr "μόνο IPv6"
++
++#, fuzzy
++msgid "Lease directory"
++msgstr "Κατάλογος leases"
++
++msgid "Lease validity time"
++msgstr "ΧÏόνος εγκυÏότητας lease"
++
++msgid "Log file"
++msgstr "ΑÏχείο καταγÏαφής"
++
++msgid "Multicast address"
++msgstr "ΔιεÏθυνση multicast"
++
++msgid "Operation mode"
++msgstr ""
++
++msgid "Port"
++msgstr "ΘÏÏα"
++
++msgid "Protocol family"
++msgstr "Οικογένεια Ï€Ïωτοκόλλου"
++
++msgid "Served interfaces"
++msgstr "ΕξυπηÏετοÏμενες διεπαφές"
++
++msgid "Server"
++msgstr "ΕξυπηÏετητής"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "ΚαθοÏίζει τους εξυπηÏετητές NTP σε IPv4 και IPv6 που ανακοινώνονται"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "ΚαθοÏίζει τους εξυπηÏετητές DNS σε IPv4 και IPv6 που ανακοινώνονται"
++
++#, fuzzy
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++"ΚαθοÏίζει τα Ï€Ïοθέματα διευθÏνσεων IPv4 και IPv6 που ανακοινώνονται, σε "
++"μοÏφή CIDR"
++
++msgid "The AHCP Service is not running."
++msgstr ""
++
++msgid "The AHCP Service is running with ID %s."
++msgstr ""
++
++#, fuzzy
++msgid "There are no active leases."
++msgstr "Δεν υπάÏχουν ενεÏγά leases"
++
++msgid "Unique ID file"
++msgstr "ΑÏχείο Î¼Î¿Î½Î±Î´Î¹ÎºÎ¿Ï Î±Î½Î±Î³Î½Ï‰ÏιστικοÏ"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/en/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/en/ahcp.po
+new file mode 100644
+index 0000000..4ad2ab2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/en/ahcp.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-15 11:31+0200\n"
++"Last-Translator: madanadam <madanadam@gmail.com>\n"
++"Language-Team: none\n"
++"Language: en\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "AHCP Server"
++msgstr "AHCP Server"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery and DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++
++msgid "Active AHCP Leases"
++msgstr "Active AHCP Leases"
++
++msgid "Address"
++msgstr "Address"
++
++msgid "Advanced Settings"
++msgstr "Advanced Settings"
++
++msgid "Age"
++msgstr "Age"
++
++msgid "Announced DNS servers"
++msgstr "Announced DNS servers"
++
++msgid "Announced NTP servers"
++msgstr "Announced NTP servers"
++
++msgid "Announced prefixes"
++msgstr "Announced prefixes"
++
++msgid "Collecting data..."
++msgstr "Collecting data..."
++
++msgid "Forwarder"
++msgstr "Forwarder"
++
++msgid "General Setup"
++msgstr "General Setup"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 and IPv6"
++
++msgid "IPv4 only"
++msgstr "IPv4 only"
++
++msgid "IPv6 only"
++msgstr "IPv6 only"
++
++msgid "Lease directory"
++msgstr "Lease directory"
++
++msgid "Lease validity time"
++msgstr "Lease validity time"
++
++msgid "Log file"
++msgstr "Log file"
++
++msgid "Multicast address"
++msgstr "Multicast address"
++
++msgid "Operation mode"
++msgstr "Operation mode"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol family"
++msgstr "Protocol family"
++
++msgid "Served interfaces"
++msgstr "Served interfaces"
++
++msgid "Server"
++msgstr "Server"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Specifies the announced IPv4 and IPv6 NTP servers"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Specifies the announced IPv4 and IPv6 name servers"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++"Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++
++msgid "The AHCP Service is not running."
++msgstr "The AHCP Service is not running."
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "The AHCP Service is running with ID %s."
++
++msgid "There are no active leases."
++msgstr "There are no active leases."
++
++msgid "Unique ID file"
++msgstr "Unique ID file"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/es/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/es/ahcp.po
+new file mode 100644
+index 0000000..512606a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/es/ahcp.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-09-14 19:30+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "Servidor AHCP"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP es un protocolo de autoconfiguración para redes con IPv6 o duales IPv6/"
++"IPv4 diseñado para ser usado en lugar de router discovery o DHCP en redes en "
++"las que es difícil o imposible configurar un servidor en cada capa de enlace "
++"del dominio de propagación como las redes móviles ad-hoc."
++
++# "Lease" en el sentido usado en DHCP no tiene una traducción clara en español y se puede usar la misma palabra en que en inglés.
++msgid "Active AHCP Leases"
++msgstr "Cesiones activas AHCP"
++
++msgid "Address"
++msgstr "Dirección"
++
++msgid "Advanced Settings"
++msgstr "Configuración avanzada"
++
++msgid "Age"
++msgstr "Vida"
++
++msgid "Announced DNS servers"
++msgstr "Servidores DNS declarados"
++
++msgid "Announced NTP servers"
++msgstr "Servidores NTP declarados"
++
++msgid "Announced prefixes"
++msgstr "Prefijos declarados"
++
++msgid "Collecting data..."
++msgstr "Obteniendo datos..."
++
++msgid "Forwarder"
++msgstr "Transmisor"
++
++msgid "General Setup"
++msgstr "Configuración general"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 only"
++msgstr "Sólo IPv4"
++
++msgid "IPv6 only"
++msgstr "Sólo IPv6"
++
++msgid "Lease directory"
++msgstr "Directorio de cesiones"
++
++msgid "Lease validity time"
++msgstr "Tiempo de validez de la cesión"
++
++msgid "Log file"
++msgstr "Fichero de registro"
++
++msgid "Multicast address"
++msgstr "Dirección multicast"
++
++msgid "Operation mode"
++msgstr "Modo de funcionamiento"
++
++msgid "Port"
++msgstr "Puerto"
++
++msgid "Protocol family"
++msgstr "Familia de protocolos"
++
++msgid "Served interfaces"
++msgstr "Interfaces configurados"
++
++msgid "Server"
++msgstr "Servidor"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Especifica los servidores NTP IPv4 e IPv6 declarados"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Especifica los servidores de nombres IPv4 e IPv6 declarados"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "Especifica los prefijos de red IPv4 e IPv6 declarados en notación CIDR"
++
++msgid "The AHCP Service is not running."
++msgstr "El Servicio AHCP no está funcionando."
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "El Servicio AHCP está funcionando con el ID %s."
++
++msgid "There are no active leases."
++msgstr "No hay cesiones activas."
++
++msgid "Unique ID file"
++msgstr "ID único de fichero"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/fr/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/fr/ahcp.po
+new file mode 100644
+index 0000000..1163518
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/fr/ahcp.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-11-06 13:06+0200\n"
++"Last-Translator: hogsim <hogsim@gmail.com>\n"
++"Language-Team: none\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "Serveur AHCP"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP est un protocole d'auto-configuration pour les réseaux IPv6 et double-"
++"pile IPv6/IPv4, destiné à remplacer la recherche de routeur et le service "
++"DHCP sur des réseaux où il est difficile, voire impossible de configurer un "
++"tel serveur pour tous les domaines de diffusion au niveau lien, par exemple "
++"pour des réseaux ad-hoc mobiles."
++
++msgid "Active AHCP Leases"
++msgstr "Baux AHCP actifs"
++
++msgid "Address"
++msgstr "Adresse"
++
++msgid "Advanced Settings"
++msgstr "Paramètres avancés"
++
++msgid "Age"
++msgstr "Age"
++
++msgid "Announced DNS servers"
++msgstr "Serveurs DNS publiés"
++
++msgid "Announced NTP servers"
++msgstr "Serveurs NTP publiés"
++
++msgid "Announced prefixes"
++msgstr "Préfixes publiés"
++
++msgid "Collecting data..."
++msgstr "Récupération des données…"
++
++msgid "Forwarder"
++msgstr "Transmetteur"
++
++msgid "General Setup"
++msgstr "Paramètres principaux"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 et IPv6"
++
++msgid "IPv4 only"
++msgstr "IPv4 seulement"
++
++msgid "IPv6 only"
++msgstr "IPv6 seulement"
++
++msgid "Lease directory"
++msgstr "Répertoire d'un bail"
++
++msgid "Lease validity time"
++msgstr "Date de validité d'un bail"
++
++msgid "Log file"
++msgstr "Fichier journal"
++
++msgid "Multicast address"
++msgstr "Adresse multidiffusion"
++
++msgid "Operation mode"
++msgstr "Mode de fonctionnement"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol family"
++msgstr "Famille de protocole"
++
++msgid "Served interfaces"
++msgstr "Interfaces gérés"
++
++msgid "Server"
++msgstr "Serveur"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Décrit les serveurs NTP IPv4 et IPv6 publiés"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Décrit les serveurs de noms IPv4 et IPv6 publiés"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "Décrit les préfixes réseaux IPv4 et IPv6 publiés en notation CIDR"
++
++msgid "The AHCP Service is not running."
++msgstr "Le service AHCP n'est pas en fonctionnement."
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "Le service AHCP est en fonctionnement avec l'ID s."
++
++msgid "There are no active leases."
++msgstr "Il n'y a aucun bail actif."
++
++msgid "Unique ID file"
++msgstr "Fichier de l'ID unique"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/he/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/he/ahcp.po
+new file mode 100644
+index 0000000..1c45cc8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/he/ahcp.po
+@@ -0,0 +1,118 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-10 03:44+0200\n"
++"Last-Translator: Snoof <sagim9@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "שרת AHCP"
++
++# מי שמבין ×ת ×”×ž×•× ×—×™× ×”×˜×›× ×™×™× ×©×™×¢×‘×•×¨ על ×–×” ויתקן.
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP ×”×•× ×¤×¨×•×˜×•×§×•×œ להגדרה ×וטומטית של רשתות IPV6 ו- dual-stack IPv6/IPv4, ×שר "
++"עוצב לשימוש כתחליף לגילוי × ×ª×‘×™× ×•×œ- DHCP ברשתות שבהן קשה ×ו בלתי ×פשרי "
++"להגדיר שרת בתוך כל ×©× ×ž×ª×—× ×œ×©×™×“×•×¨ שכבת קישור, לדוגמה רשתות ×ד-הוק ניידות."
++
++#, fuzzy
++msgid "Active AHCP Leases"
++msgstr "החכרות AHCP קיימות"
++
++msgid "Address"
++msgstr "כתובת"
++
++msgid "Advanced Settings"
++msgstr "הגדרות מתקדמות"
++
++msgid "Age"
++msgstr "גיל"
++
++msgid "Announced DNS servers"
++msgstr "שרתי DNS מוכרזי×"
++
++msgid "Announced NTP servers"
++msgstr "שרתי NTP מוכרזי×"
++
++msgid "Announced prefixes"
++msgstr "קידומות מוכרזות"
++
++msgid "Collecting data..."
++msgstr "×וסף נתוני×..."
++
++msgid "Forwarder"
++msgstr ""
++
++msgid "General Setup"
++msgstr "התקנה כללית"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 ו- IPv6"
++
++msgid "IPv4 only"
++msgstr "IPv4 בלבד"
++
++msgid "IPv6 only"
++msgstr "IPv6 בלבד"
++
++#, fuzzy
++msgid "Lease directory"
++msgstr "ספריית החכרות"
++
++# תו
++msgid "Lease validity time"
++msgstr "תוקף ההקצ××”"
++
++msgid "Log file"
++msgstr "קובץ רישו×"
++
++msgid "Multicast address"
++msgstr "כתובת Multicast"
++
++# ×פשר ×’× ×ž×¦×‘ פעולה
++msgid "Operation mode"
++msgstr "מצב הפעלה"
++
++msgid "Port"
++msgstr "פורט"
++
++msgid "Protocol family"
++msgstr "משפחת פרוטוקולי×"
++
++msgid "Served interfaces"
++msgstr "×¡×™×’×ž× ×˜×™× ×ž×•×¤×¢×œ×™×"
++
++msgid "Server"
++msgstr "שרת"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "שרתי NTP ברשתות IPV4 IPV6"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "שרתי DNS ברשתות IPV4 IPV6"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "קידומת ×©×¨×ª×™× (CIDR)"
++
++msgid "The AHCP Service is not running."
++msgstr ""
++
++msgid "The AHCP Service is running with ID %s."
++msgstr ""
++
++msgid "There are no active leases."
++msgstr "×ין הקצ×ות פעילות."
++
++msgid "Unique ID file"
++msgstr "קובץ מזהה יחודי"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/hu/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/hu/ahcp.po
+new file mode 100644
+index 0000000..a0a91be
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/hu/ahcp.po
+@@ -0,0 +1,116 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-31 15:46+0200\n"
++"Last-Translator: juhosg <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "AHCP Server"
++msgstr "AHCP kiszolgáló"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"Az AHCP egy olyan automatikus konfigurációs protokoll IPv6 és kettős IPv6/"
++"IPv4 hálózatokhoz, mely a DHCP és a router dicovery protokoll helyett "
++"használható olyan hálózatokok ahol nehéz vagy lehetetlen beállítani külön "
++"kiszolgálót minden kapcsolati réteg tartományon belül, mint például a mobil "
++"eseti hálózatok."
++
++msgid "Active AHCP Leases"
++msgstr "Aktív AHCP bérletek"
++
++msgid "Address"
++msgstr "Cím"
++
++msgid "Advanced Settings"
++msgstr "Haladó beállítások"
++
++msgid "Age"
++msgstr "Kor"
++
++msgid "Announced DNS servers"
++msgstr "Bejelentett névkiszolgálók"
++
++msgid "Announced NTP servers"
++msgstr "Bejelentett NTP kiszolgálók"
++
++msgid "Announced prefixes"
++msgstr "Bejelentett előtagok"
++
++msgid "Collecting data..."
++msgstr "Adatok összegyűjtése..."
++
++msgid "Forwarder"
++msgstr "Továbbító"
++
++msgid "General Setup"
++msgstr "Ãltalános beállítások"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 és IPv6"
++
++msgid "IPv4 only"
++msgstr "csak IPv4"
++
++msgid "IPv6 only"
++msgstr "csak IPv6"
++
++msgid "Lease directory"
++msgstr "Bérlet könytár"
++
++msgid "Lease validity time"
++msgstr "Bérlet érvényességi ideje"
++
++msgid "Log file"
++msgstr "Napló fájl"
++
++msgid "Multicast address"
++msgstr "Multicast cím"
++
++msgid "Operation mode"
++msgstr "Működési mód"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol family"
++msgstr "Protokoll család"
++
++msgid "Served interfaces"
++msgstr "Kiszolgált interfészek"
++
++msgid "Server"
++msgstr "Kiszolgáló"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "A bejelentett IPv4 és IPv6 NTP kiszolgálók részletezése"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "A bejelentett IPv4 és IPv6 névkiszolgálók részletezése"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++"A bejelentett IPv4 és IPv6 hálózati előtagok részletezése CIDR jelölésben"
++
++msgid "The AHCP Service is not running."
++msgstr "Az AHCP szolgáltatás nem fut"
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "Az AHCP szolgáltatás fut, azonosítója:%s."
++
++msgid "There are no active leases."
++msgstr "Nincsenek aktív bérletek."
++
++msgid "Unique ID file"
++msgstr "Egyedi azonosító fájl"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/it/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/it/ahcp.po
+new file mode 100644
+index 0000000..56d9516
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/it/ahcp.po
+@@ -0,0 +1,114 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-02-03 12:53+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "Server AHCP"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP è un protocollo di configurazione automatica per reti IPv6 e dual-stack "
++"IPv6/IPv4 progettato per essere usato al posto del router discovery e DHCP "
++"su reti dove è difficile o impossibile configurare un server all'interno di "
++"ogni dominio di broadcast, per esempio reti ad-hoc mobili."
++
++msgid "Active AHCP Leases"
++msgstr "Lease AHCP Attivi"
++
++msgid "Address"
++msgstr "Indirizzo"
++
++msgid "Advanced Settings"
++msgstr "Impostazioni Avanzate"
++
++msgid "Age"
++msgstr "Età"
++
++msgid "Announced DNS servers"
++msgstr "Server DNS indicati"
++
++msgid "Announced NTP servers"
++msgstr "Server NTP indicati"
++
++msgid "Announced prefixes"
++msgstr "Prefissi indicati"
++
++msgid "Collecting data..."
++msgstr "Raccolta dei dati..."
++
++msgid "Forwarder"
++msgstr "Mittente"
++
++msgid "General Setup"
++msgstr "Setup Generale"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 only"
++msgstr "Solo IPv4"
++
++msgid "IPv6 only"
++msgstr "Solo IPv6"
++
++msgid "Lease directory"
++msgstr "Directory di Lease"
++
++msgid "Lease validity time"
++msgstr "Tempo di validità del Lease"
++
++msgid "Log file"
++msgstr "File di log"
++
++msgid "Multicast address"
++msgstr "Indirizzo Multicast"
++
++msgid "Operation mode"
++msgstr "Modalità di funzionamento"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Protocol family"
++msgstr "Protocollo famiglia"
++
++msgid "Served interfaces"
++msgstr "Interfacce servite"
++
++msgid "Server"
++msgstr "Server"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Specifica i server NTP IPv4 e IPv6 annunciati"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Specifica il server dei nomi IPv4 e IPv6"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "Specifica i prefissi delle reti IPv4 e IPv6 in notazione CIDR"
++
++msgid "The AHCP Service is not running."
++msgstr "Il servizio AHCP non è in esecuzione."
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "Il servizio AHCP è in esecuzione con ID %s."
++
++msgid "There are no active leases."
++msgstr "Non ci sono leases attivi."
++
++msgid "Unique ID file"
++msgstr "File degli Unique ID"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/ja/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/ja/ahcp.po
+new file mode 100644
+index 0000000..dd78ccd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/ja/ahcp.po
+@@ -0,0 +1,117 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-19 07:54+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: none\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: Pootle 2.0.4\n"
++
++msgid "AHCP Server"
++msgstr "AHCPサーãƒãƒ¼"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCPã¯IPv6åŠã³IPv6/IPv4デュアルスタックを使用ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ãŠã„ã¦ã€ãƒ«ãƒ¼"
++"ターディスカãƒãƒªã®ä»£ã‚ã‚Šã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ãŸã‚ã«ãƒ‡ã‚¶ã‚¤ãƒ³ã•ã‚ŒãŸè‡ªå‹•è¨­å®šãƒ—ロトコル"
++"ã§ã™ã€‚ã¾ãŸã€AHCPã¯ãƒ¢ãƒã‚¤ãƒ«ãƒ»ã‚¢ãƒ‰ãƒ›ãƒƒã‚¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã‚ˆã†ãªã€ãƒªãƒ³ã‚¯å±¤ã®ãƒ‰ãƒ¡ã‚¤"
++"ンブロードキャスト毎ã«è¨­å®šã‚’è¡Œã†ã“ã¨ãŒå›°é›£ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§ã®DHCP機能ã¨ã—ã¦ã‚‚"
++"使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
++
++msgid "Active AHCP Leases"
++msgstr "有効ãªAHCPリース"
++
++msgid "Address"
++msgstr "アドレス"
++
++msgid "Advanced Settings"
++msgstr "詳細設定"
++
++msgid "Age"
++msgstr "Age"
++
++msgid "Announced DNS servers"
++msgstr "通知ã™ã‚‹DNSサーãƒãƒ¼"
++
++msgid "Announced NTP servers"
++msgstr "通知ã™ã‚‹NTPサーãƒãƒ¼"
++
++msgid "Announced prefixes"
++msgstr "通知ã™ã‚‹ãƒ—レフィクス"
++
++msgid "Collecting data..."
++msgstr "データåŽé›†ä¸­ã§ã™..."
++
++msgid "Forwarder"
++msgstr "転é€"
++
++msgid "General Setup"
++msgstr "一般設定"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4åŠã³IPv6"
++
++msgid "IPv4 only"
++msgstr "IPv4ã®ã¿"
++
++msgid "IPv6 only"
++msgstr "IPv6ã®ã¿"
++
++msgid "Lease directory"
++msgstr "リースファイル・ディレクトリ"
++
++msgid "Lease validity time"
++msgstr "リース有効時間"
++
++msgid "Log file"
++msgstr "ログファイル"
++
++msgid "Multicast address"
++msgstr "マルãƒã‚­ãƒ£ã‚¹ãƒˆã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++msgid "Operation mode"
++msgstr "動作モード"
++
++msgid "Port"
++msgstr "ãƒãƒ¼ãƒˆ"
++
++msgid "Protocol family"
++msgstr "プロトコルファミリ"
++
++msgid "Served interfaces"
++msgstr "対象インターフェース"
++
++msgid "Server"
++msgstr "サーãƒãƒ¼"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "通知ã™ã‚‹NTPサーãƒãƒ¼ã®IPv4åŠã³IPv6アドレスを設定ã—ã¾ã™"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "通知ã™ã‚‹DNSサーãƒãƒ¼ã®IPv4åŠã³IPv6アドレスを設定ã—ã¾ã™"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++"通知ã™ã‚‹IPv4åŠã³IPv6アドレスã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ãƒ—レフィクスをCIDRå½¢å¼ã§è¨­å®šã—ã¾"
++"ã™"
++
++msgid "The AHCP Service is not running."
++msgstr "AHCP サービスã¯ç¨¼åƒã—ã¦ã„ã¾ã›ã‚“。"
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "AHCP サービスã¯ç¨¼åƒä¸­ã§ã™ã€‚(ID %s)"
++
++msgid "There are no active leases."
++msgstr "有効ãªãƒªãƒ¼ã‚¹ã¯ã‚ã‚Šã¾ã›ã‚“。"
++
++msgid "Unique ID file"
++msgstr "ユニークIDファイル"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/ms/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/ms/ahcp.po
+new file mode 100644
+index 0000000..0b6963b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/ms/ahcp.po
+@@ -0,0 +1,105 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "AHCP Server"
++msgstr ""
++
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++
++msgid "Active AHCP Leases"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Age"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Announced NTP servers"
++msgstr ""
++
++msgid "Announced prefixes"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Forwarder"
++msgstr ""
++
++msgid "General Setup"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "Lease directory"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "Operation mode"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Served interfaces"
++msgstr ""
++
++msgid "Server"
++msgstr ""
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr ""
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr ""
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++
++msgid "The AHCP Service is not running."
++msgstr ""
++
++msgid "The AHCP Service is running with ID %s."
++msgstr ""
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "Unique ID file"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/no/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/no/ahcp.po
+new file mode 100644
+index 0000000..4c3bc03
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/no/ahcp.po
+@@ -0,0 +1,117 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-06-14 20:11+0200\n"
++"Last-Translator: protx <lars.hardy@gmail.com>\n"
++"Language-Team: none\n"
++"Language: no\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "AHCP Server"
++msgstr "AHCP Server"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP er en autokonfigurasjon protokoll for IPv6, og dual-stack IPv6/IPv4 "
++"nettverk. Det er laget for bruk der DHCP og Ruter oppdagelse er problematisk "
++"eller umulig å bruke for hvert link-lags broadcast domene, f.eks. mobile ad-"
++"hoc nettverk."
++
++msgid "Active AHCP Leases"
++msgstr "Aktive AHCP Leier"
++
++msgid "Address"
++msgstr "Adresse"
++
++msgid "Advanced Settings"
++msgstr "Avanserte Innstillinger"
++
++msgid "Age"
++msgstr "Alder"
++
++msgid "Announced DNS servers"
++msgstr "Annonserte DNS servere"
++
++msgid "Announced NTP servers"
++msgstr "Annonserte NTP servere"
++
++msgid "Announced prefixes"
++msgstr "Annonserte prefikser"
++
++msgid "Collecting data..."
++msgstr "Henter data..."
++
++#, fuzzy
++msgid "Forwarder"
++msgstr "Sender"
++
++msgid "General Setup"
++msgstr "Generelt Oppsett"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 og IPv6"
++
++msgid "IPv4 only"
++msgstr "Kun IPv4"
++
++msgid "IPv6 only"
++msgstr "Kun IPv6"
++
++#, fuzzy
++msgid "Lease directory"
++msgstr "Leie katalog"
++
++msgid "Lease validity time"
++msgstr "Gyldig leietid"
++
++msgid "Log file"
++msgstr "Logg fil"
++
++msgid "Multicast address"
++msgstr "Multicast adresse"
++
++msgid "Operation mode"
++msgstr "Driftsmodus"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol family"
++msgstr "Protokoll familie"
++
++#, fuzzy
++msgid "Served interfaces"
++msgstr "Utdelte grensesnitt"
++
++msgid "Server"
++msgstr "Server"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Angir annonserte IPv4 og IPv6 NTP-servere"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Angir annonserte IPv4 og IPv6 navnetjenere"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "Angir annonserte IPv4 og IPv6 nettverk prefikser i CIDR-notasjon"
++
++msgid "The AHCP Service is not running."
++msgstr ""
++
++msgid "The AHCP Service is running with ID %s."
++msgstr ""
++
++msgid "There are no active leases."
++msgstr "Det er ingen aktive leieavtaler."
++
++msgid "Unique ID file"
++msgstr "Unik ID fil"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/pl/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/pl/ahcp.po
+new file mode 100644
+index 0000000..5095224
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/pl/ahcp.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-14 16:40+0200\n"
++"Last-Translator: Tomecki <przykryweczka@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "AHCP Server"
++msgstr "Serwer AHCP"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP to protokół automatycznej konfiguracji sieci IPv6 i IPv6/IPv4 "
++"przeznaczone do stosowania zamiast DHCP w sieciach, w których jest trudne "
++"lub wręcz niemożliwe, aby skonfigurować serwer w każdej warstwie łącza "
++"domeny rozgłoszeniowej, na przykład w mobilnych sieciach ad-hoc."
++
++msgid "Active AHCP Leases"
++msgstr "Aktywne dzierżawy AHCP"
++
++msgid "Address"
++msgstr "Adres"
++
++msgid "Advanced Settings"
++msgstr "Ustawienia zaawansowane"
++
++msgid "Age"
++msgstr "Wiek"
++
++msgid "Announced DNS servers"
++msgstr "Rozgłaszane serwery DNS"
++
++msgid "Announced NTP servers"
++msgstr "Rozgłaszane serwery NTP"
++
++msgid "Announced prefixes"
++msgstr "Rozgłaszane prefiksy"
++
++msgid "Collecting data..."
++msgstr "Zbieranie informacji..."
++
++msgid "Forwarder"
++msgstr "Przekierowanie"
++
++msgid "General Setup"
++msgstr "Ustawienia podstawowe"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 oraz IPv6"
++
++msgid "IPv4 only"
++msgstr "Tylko IPv4"
++
++msgid "IPv6 only"
++msgstr "Tylko IPv6"
++
++msgid "Lease directory"
++msgstr "Katalog dzierżaw"
++
++msgid "Lease validity time"
++msgstr "Czas dzierżawy"
++
++msgid "Log file"
++msgstr "Plik dziennika"
++
++msgid "Multicast address"
++msgstr "Adres Multicast"
++
++msgid "Operation mode"
++msgstr "Tryb pracy"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol family"
++msgstr "Rodzina protokołów"
++
++msgid "Served interfaces"
++msgstr "Udostępniane interfejsy"
++
++msgid "Server"
++msgstr "Serwer"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Określa rozgłaszane adresy IPv4/6 serwerów NTP"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Określa rozgłaszane adresy IPv4/6 serwerów nazw"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "Określa rozgłaszane prefiksy sieciowe w notacji CIDR"
++
++msgid "The AHCP Service is not running."
++msgstr "Usługa AHCP nie jest uruchomiona."
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "Usługa AHCP jest uruchomiona z ID %s."
++
++msgid "There are no active leases."
++msgstr "Nie ma aktywnych dzierżaw."
++
++msgid "Unique ID file"
++msgstr "Unikalny plik ID"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/pt-br/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/pt-br/ahcp.po
+new file mode 100644
+index 0000000..55ec29c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/pt-br/ahcp.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-03-29 23:07+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "Servidor AHCP"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP é um protocolo de autoconfiguração para redes IPv6 ou IPv6/IPv4 "
++"projetado para ser usado no lugar da \"descoberta de roteador\" ou DHCP em "
++"redes onde é difícil ou impossível configurar um servidor em cada camada de "
++"enlace de domínio de broadcast, como exemplo as redes móvel ad-hoc."
++
++msgid "Active AHCP Leases"
++msgstr "Alocações AHCP Ativas"
++
++msgid "Address"
++msgstr "Endereço"
++
++msgid "Advanced Settings"
++msgstr "Configurações Avançadas"
++
++msgid "Age"
++msgstr "Tempo de vida"
++
++msgid "Announced DNS servers"
++msgstr "Servidores DNS anunciados"
++
++msgid "Announced NTP servers"
++msgstr "Servidores NTP anunciados"
++
++msgid "Announced prefixes"
++msgstr "Prefixos anunciados"
++
++msgid "Collecting data..."
++msgstr "Coletando dados..."
++
++msgid "Forwarder"
++msgstr "Forwarder"
++
++msgid "General Setup"
++msgstr "Configurações Gerais"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 only"
++msgstr "Apenas IPv4"
++
++msgid "IPv6 only"
++msgstr "Apenas IPv6"
++
++msgid "Lease directory"
++msgstr "Diretório de atribuições"
++
++msgid "Lease validity time"
++msgstr "Tempo de validade da atribuição"
++
++msgid "Log file"
++msgstr "Arquivo de registro"
++
++msgid "Multicast address"
++msgstr "Endereço multicast"
++
++msgid "Operation mode"
++msgstr "Modo de operação"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Protocol family"
++msgstr "Família de protocolos"
++
++msgid "Served interfaces"
++msgstr "Interfaces configuradas"
++
++msgid "Server"
++msgstr "Servidor"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Especifica os servidores NTP IPv4 e IPv6 anunciados"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Especifica os servidores de nomes IPv4 e IPv6 anunciados"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++"Especifica os prefixos de rede IPv4 e IPv6, em notação CIDR, anunciados"
++
++msgid "The AHCP Service is not running."
++msgstr "O serviço AHCP está parado"
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "O serviço AHCP esta executando com o ID %s."
++
++msgid "There are no active leases."
++msgstr "Não existe alocações ativas."
++
++msgid "Unique ID file"
++msgstr "Arquivo de identificador único"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/pt/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/pt/ahcp.po
+new file mode 100644
+index 0000000..f96fc45
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/pt/ahcp.po
+@@ -0,0 +1,116 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-06-02 21:12+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "Servidor AHCP"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"O AHCP é um protocolo de auto-configuração para redes IPv6 e IPv6/IPv4 dual-"
++"stack foi desenhado para ser usado no lugar do router discovery e DHCP nas "
++"redes onde é difícil ou impossível configurar o servidor dentro de cada "
++"camada de ligação no dominio de broadcast, por exemplo, redes ad-hoc móveis."
++
++msgid "Active AHCP Leases"
++msgstr "Concessões AHCP Ativas"
++
++msgid "Address"
++msgstr "Endereço"
++
++msgid "Advanced Settings"
++msgstr "Definições Avançadas"
++
++msgid "Age"
++msgstr "Idade"
++
++msgid "Announced DNS servers"
++msgstr "Servidores DNS anunciados"
++
++msgid "Announced NTP servers"
++msgstr "Servidores NTP anunciados"
++
++msgid "Announced prefixes"
++msgstr "Prefixos anunciados"
++
++msgid "Collecting data..."
++msgstr "A obter dados..."
++
++msgid "Forwarder"
++msgstr "Encaminhador"
++
++msgid "General Setup"
++msgstr "Configuração Geral"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 only"
++msgstr "Só IPv4"
++
++msgid "IPv6 only"
++msgstr "Só IPv6"
++
++msgid "Lease directory"
++msgstr "Directório de concessões"
++
++msgid "Lease validity time"
++msgstr "Prazo de validade das concessões"
++
++msgid "Log file"
++msgstr "Ficheiro log"
++
++msgid "Multicast address"
++msgstr "Endereço de multicast"
++
++msgid "Operation mode"
++msgstr "Modo de operação"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Protocol family"
++msgstr "Família do protocolo"
++
++msgid "Served interfaces"
++msgstr "Interfaces servidas"
++
++msgid "Server"
++msgstr "Servidor"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Especifica os servidores NTP anunciados em IPv4 e IPv6"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Especifica os servidores de nomes anunciados em IPv4 e IPv6"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++"Especifica os prefixos de rede na notação CIDR a serem anunciados em IPv4 e "
++"IPv6"
++
++msgid "The AHCP Service is not running."
++msgstr "O serviço AHCP não está a correr."
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "O serviço AHCP está a correr com o ID %s"
++
++msgid "There are no active leases."
++msgstr "Não existem concessões activas."
++
++msgid "Unique ID file"
++msgstr "Ficheiro de ID único"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/ro/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/ro/ahcp.po
+new file mode 100644
+index 0000000..2882b31
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/ro/ahcp.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-28 19:14+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "Server AHCP"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP este un protocol de autoconfigurare pentru IPv6 si IPv4 menit sa "
++"inlocuie \"router discovery\" si DHCP in retele unde este dificil de "
++"configurat un server pentru fiecare domeniu de broadcast pe fiecare "
++"legatura, de exemplu pentru retele mobile ad-hoc."
++
++msgid "Active AHCP Leases"
++msgstr "Conexiuni active AHCP"
++
++msgid "Address"
++msgstr "Adresă"
++
++msgid "Advanced Settings"
++msgstr "Setări avansate"
++
++msgid "Age"
++msgstr "Vârstă"
++
++msgid "Announced DNS servers"
++msgstr "Servere DNS anuntate"
++
++msgid "Announced NTP servers"
++msgstr "Servere NTP anuntate"
++
++msgid "Announced prefixes"
++msgstr "Prefixe anuntate"
++
++msgid "Collecting data..."
++msgstr "Colectare date.."
++
++msgid "Forwarder"
++msgstr "Forwarder"
++
++msgid "General Setup"
++msgstr "Configurare generala"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 si IPv6"
++
++msgid "IPv4 only"
++msgstr "Doar IPv4 "
++
++msgid "IPv6 only"
++msgstr "Doar IPv6 "
++
++msgid "Lease directory"
++msgstr "Director de conexiuni"
++
++msgid "Lease validity time"
++msgstr "Timpul pentru conexiuni valide"
++
++msgid "Log file"
++msgstr "Fisier log"
++
++msgid "Multicast address"
++msgstr "Adresa multicast"
++
++msgid "Operation mode"
++msgstr "Modul de operare"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol family"
++msgstr "Familia de protocol"
++
++msgid "Served interfaces"
++msgstr "Interfetele servite"
++
++msgid "Server"
++msgstr "Server"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Specifica serverele de NTP IPv4 si IPv6 anuntate"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Specifica serverele de DNS IPv4 si IPv6 anuntate"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "Specifica prefixele IPv4 si IPv6 anuntate in format CIDR"
++
++msgid "The AHCP Service is not running."
++msgstr "Serviciul AHCP nu ruleaza"
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "Serviciul AHCP nu ruleaza cu ID %s."
++
++msgid "There are no active leases."
++msgstr "Nu exista conexiuni active."
++
++msgid "Unique ID file"
++msgstr "ID de fisier unic"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/ru/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/ru/ahcp.po
+new file mode 100644
+index 0000000..f08cb70
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/ru/ahcp.po
+@@ -0,0 +1,120 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: ahcp\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2013-09-05 15:29+0200\n"
++"Last-Translator: datasheet <michael.gritsaenko@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++# Ad-Hoc Configuration Protocol - протокол автоматичеÑкой конфигурации IPv6 и Ñетей IPv6/IPv4 двойного Ñтека
++msgid "AHCP Server"
++msgstr "AHCP-Ñервер"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP - Ñто протокол автоматичеÑкой конфигурации Ñетей IPv6 и IPv6/IPv4, "
++"разработанный Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¼ÐµÑто DHCP и протоколов Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ "
++"маршрутизаторов в ÑетÑÑ…, где Ñложно или невозможно наÑтроить Ñервер внутри "
++"каждой широковещательной зоны канального уровнÑ, например, в мобильных ad-"
++"hoc ÑетÑÑ…."
++
++msgid "Active AHCP Leases"
++msgstr "Ðктивные арендованные AHCP-адреÑа"
++
++msgid "Address"
++msgstr "ÐдреÑ"
++
++msgid "Advanced Settings"
++msgstr "Дополнительные наÑтройки"
++
++msgid "Age"
++msgstr "ВозраÑÑ‚"
++
++msgid "Announced DNS servers"
++msgstr "ÐнонÑируемые DNS-Ñерверы"
++
++msgid "Announced NTP servers"
++msgstr "ÐнонÑируемые NTP-Ñерверы"
++
++msgid "Announced prefixes"
++msgstr "ÐнонÑируемые префикÑÑ‹"
++
++msgid "Collecting data..."
++msgstr "Сбор данных..."
++
++#, fuzzy
++msgid "Forwarder"
++msgstr "Перенаправление запроÑов"
++
++msgid "General Setup"
++msgstr "Общие наÑтройки"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 и IPv6"
++
++msgid "IPv4 only"
++msgstr "Только IPv4"
++
++msgid "IPv6 only"
++msgstr "Только IPv6"
++
++msgid "Lease directory"
++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð°Ñ€ÐµÐ½Ð´Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… адреÑов"
++
++msgid "Lease validity time"
++msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ð°Ñ€ÐµÐ½Ð´Ñ‹"
++
++msgid "Log file"
++msgstr "Файл журнала"
++
++msgid "Multicast address"
++msgstr "Групповой адреÑ"
++
++msgid "Operation mode"
++msgstr "Режим работы"
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Protocol family"
++msgstr "Протокол"
++
++msgid "Served interfaces"
++msgstr "ИÑпользуемые интерфейÑÑ‹"
++
++msgid "Server"
++msgstr "Сервер"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "ОпределÑет IPv4 и IPv6 NTP-Ñерверы"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "ОпределÑет IPv4 и IPv6 DNS-Ñерверы"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "ОпределÑет IPv4- и IPv6-префикÑÑ‹ Ñети в нотации CIDR"
++
++msgid "The AHCP Service is not running."
++msgstr "Служба AHCP не запущена."
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "Служба AHCP запущена Ñ ID %s."
++
++msgid "There are no active leases."
++msgstr "Ðет активных арендованных адреÑов."
++
++msgid "Unique ID file"
++msgstr "Файл уникального идентификатора"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/sk/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/sk/ahcp.po
+new file mode 100644
+index 0000000..b618490
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/sk/ahcp.po
+@@ -0,0 +1,106 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "AHCP Server"
++msgstr ""
++
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++
++msgid "Active AHCP Leases"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Age"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Announced NTP servers"
++msgstr ""
++
++msgid "Announced prefixes"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Forwarder"
++msgstr ""
++
++msgid "General Setup"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "Lease directory"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "Operation mode"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Served interfaces"
++msgstr ""
++
++msgid "Server"
++msgstr ""
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr ""
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr ""
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++
++msgid "The AHCP Service is not running."
++msgstr ""
++
++msgid "The AHCP Service is running with ID %s."
++msgstr ""
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "Unique ID file"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/sv/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/sv/ahcp.po
+new file mode 100644
+index 0000000..b5f0b7d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/sv/ahcp.po
+@@ -0,0 +1,109 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-04-27 22:52+0200\n"
++"Last-Translator: Umeaboy <kristoffer.grundstrom1983@gmail.com>\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "AHCP-server"
++
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++
++msgid "Active AHCP Leases"
++msgstr ""
++
++msgid "Address"
++msgstr "Adress"
++
++msgid "Advanced Settings"
++msgstr "Avancerade inställningar"
++
++msgid "Age"
++msgstr "Ã…lder"
++
++msgid "Announced DNS servers"
++msgstr "Aviserade DNS-servrar"
++
++msgid "Announced NTP servers"
++msgstr "Aviserade NTP-servrar"
++
++msgid "Announced prefixes"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr "Samlar in data..."
++
++msgid "Forwarder"
++msgstr ""
++
++msgid "General Setup"
++msgstr "Allmän inställning"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 och IPv6"
++
++msgid "IPv4 only"
++msgstr "Endast IPv4"
++
++msgid "IPv6 only"
++msgstr "Endast IPv6"
++
++msgid "Lease directory"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Log file"
++msgstr "Logg-fil"
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "Operation mode"
++msgstr "Driftsläge"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol family"
++msgstr "Protokoll-familj"
++
++msgid "Served interfaces"
++msgstr ""
++
++msgid "Server"
++msgstr "Server"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Specificerar de aviserade IPv4 och IPv6 NTP-servrarna"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Specificerar de aviserade IPv4 och IPv6 namn-servrarna"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++
++msgid "The AHCP Service is not running."
++msgstr "AHCP-tjänsten körs inte."
++
++msgid "The AHCP Service is running with ID %s."
++msgstr ""
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "Unique ID file"
++msgstr "Unik ID-fil"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/templates/ahcp.pot b/feeds/luci/applications/luci-app-ahcp/po/templates/ahcp.pot
+new file mode 100644
+index 0000000..ea6bb42
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/templates/ahcp.pot
+@@ -0,0 +1,99 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "AHCP Server"
++msgstr ""
++
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++
++msgid "Active AHCP Leases"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Age"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Announced NTP servers"
++msgstr ""
++
++msgid "Announced prefixes"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Forwarder"
++msgstr ""
++
++msgid "General Setup"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "Lease directory"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "Operation mode"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Served interfaces"
++msgstr ""
++
++msgid "Server"
++msgstr ""
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr ""
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr ""
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++
++msgid "The AHCP Service is not running."
++msgstr ""
++
++msgid "The AHCP Service is running with ID %s."
++msgstr ""
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "Unique ID file"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/tr/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/tr/ahcp.po
+new file mode 100644
+index 0000000..ca33071
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/tr/ahcp.po
+@@ -0,0 +1,113 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-11-25 14:51+0200\n"
++"Last-Translator: qbilay <qbilay@mynet.com>\n"
++"Language-Team: none\n"
++"Language: tr\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: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "AHCP Sunucusu"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP bir IPv6 ve IPv4/IPv6 çift ağ için otomatik yapılandırma protokolüdür. "
++"Yönlendirici Bildirimleri ve DHCP sunucuları geçici olarak yerine dağıtılmış "
++"ağlar için tasarlanmıştır."
++
++msgid "Active AHCP Leases"
++msgstr "Aktif ACHP Kiralamaları"
++
++msgid "Address"
++msgstr "Adres"
++
++msgid "Advanced Settings"
++msgstr "GeliÅŸmiÅŸ Ayarlar"
++
++msgid "Age"
++msgstr "YaÅŸ"
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Announced NTP servers"
++msgstr ""
++
++msgid "Announced prefixes"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr "Veriler toplanıyor..."
++
++msgid "Forwarder"
++msgstr ""
++
++msgid "General Setup"
++msgstr "Genel Ayarlar"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 ve IPv6"
++
++msgid "IPv4 only"
++msgstr "Sadece IPv4"
++
++msgid "IPv6 only"
++msgstr "Sadece IPv6"
++
++msgid "Lease directory"
++msgstr "Kiralama Dizini"
++
++msgid "Lease validity time"
++msgstr "Kiralama Geçerlilik Süresi"
++
++msgid "Log file"
++msgstr "Kayıt Dosyası"
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "Operation mode"
++msgstr "Çalışma Modu"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol family"
++msgstr "Protokol Ailesi"
++
++msgid "Served interfaces"
++msgstr "Sunucu Arayüzleri"
++
++msgid "Server"
++msgstr "Sunucu"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr ""
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr ""
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++
++msgid "The AHCP Service is not running."
++msgstr " AHCP Hizmeti Çalışmıyor"
++
++msgid "The AHCP Service is running with ID %s."
++msgstr " AHCP Hizmeti ID %ile çalışıyor"
++
++msgid "There are no active leases."
++msgstr "Aktif Kiralama Yok"
++
++msgid "Unique ID file"
++msgstr "Benzersiz ID Dosyası"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/uk/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/uk/ahcp.po
+new file mode 100644
+index 0000000..7649019
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/uk/ahcp.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-28 21:17+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "AHCP Server"
++msgstr "Сервер AHCP"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP є протоколом автоматичної конфігурації мереж IPv6 та IPv6/IPv4, що "
++"разраблений Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ñ–ÑÑ‚ÑŒ DHCP. Ðаприклад, він викориÑтовуєтьÑÑ Ñƒ "
++"Ñтільникових ad-hoc мережах."
++
++msgid "Active AHCP Leases"
++msgstr "Ðктивні оренди AHCP"
++
++msgid "Address"
++msgstr "ÐдреÑа"
++
++msgid "Advanced Settings"
++msgstr "Додаткові параметри"
++
++msgid "Age"
++msgstr "Вік"
++
++msgid "Announced DNS servers"
++msgstr "Оголошені DNS-Ñервери"
++
++msgid "Announced NTP servers"
++msgstr "Оголошені NTP-Ñервери"
++
++msgid "Announced prefixes"
++msgstr "Оголошені префікÑи"
++
++msgid "Collecting data..."
++msgstr "Ð—Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…..."
++
++msgid "Forwarder"
++msgstr "СпрÑмовувач"
++
++msgid "General Setup"
++msgstr "Загальні параметри"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 та IPv6"
++
++msgid "IPv4 only"
++msgstr "Тільки IPv4"
++
++msgid "IPv6 only"
++msgstr "Тільки IPv6"
++
++msgid "Lease directory"
++msgstr "Каталог оренд"
++
++msgid "Lease validity time"
++msgstr "Термін дії оренди"
++
++msgid "Log file"
++msgstr "Файл журналу"
++
++msgid "Multicast address"
++msgstr "Групова адреÑа"
++
++msgid "Operation mode"
++msgstr "Режим роботи"
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Protocol family"
++msgstr "Протокол"
++
++msgid "Served interfaces"
++msgstr "ІнтерфейÑи, Ñкі обÑлуговуютьÑÑ"
++
++msgid "Server"
++msgstr "Сервер"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "ДозволÑÑ” вказати оголошувані IPv4 та IPv6 NTP-Ñервери"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "ДозволÑÑ” вказати оголошувані IPv4 та IPv6 DNS-Ñервери"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr ""
++"ДозволÑÑ” вказати оголошувані IPv4 та IPv6 префікÑи мережі в нотації CIDR"
++
++msgid "The AHCP Service is not running."
++msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ AHCP не запущено"
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ AHCP запущено з ID %s."
++
++msgid "There are no active leases."
++msgstr "Ðктивних оренд немає."
++
++msgid "Unique ID file"
++msgstr "Файл унікальних ідентифікаторів"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/vi/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/vi/ahcp.po
+new file mode 100644
+index 0000000..1041add
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/vi/ahcp.po
+@@ -0,0 +1,114 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-12-05 04:46+0200\n"
++"Last-Translator: Thành <tienthanh.dqc@gmail.com>\n"
++"Language-Team: none\n"
++"Language: vi\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: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "AHCP Server"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP là một giao thức tự động cấu hình cho IPv6 và mạng IPv6/IPv4 dual-stack "
++"thiết kế để được sử dụng trong địa điểm phát hiện router và DHCP trên mạng, "
++"nơi rất khó hoặc không thể cấu hình một máy chủ trong tất cả các lĩnh vực "
++"phát sóng liên kết lớp, ví dụ như mạng Ad-hoc."
++
++msgid "Active AHCP Leases"
++msgstr "Kích hoạt thuê AHCP"
++
++msgid "Address"
++msgstr "Äịa chỉ"
++
++msgid "Advanced Settings"
++msgstr "Thiết lập nâng cao"
++
++msgid "Age"
++msgstr "Thá»i gian thuê"
++
++msgid "Announced DNS servers"
++msgstr "Quảng bá máy chủ DNS"
++
++msgid "Announced NTP servers"
++msgstr "Quảng bá máy chủ NTP"
++
++msgid "Announced prefixes"
++msgstr "Quảng bá tiá»n tố"
++
++msgid "Collecting data..."
++msgstr "Äang kết xuất dữ liệu..."
++
++msgid "Forwarder"
++msgstr "Chuyển tiếp"
++
++msgid "General Setup"
++msgstr "Thiết lập chung"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 và IPv6"
++
++msgid "IPv4 only"
++msgstr "Chỉ IPv4"
++
++msgid "IPv6 only"
++msgstr "Chỉ IPv6"
++
++msgid "Lease directory"
++msgstr "Thư mục cho thuê"
++
++msgid "Lease validity time"
++msgstr "Thá»i gian cho thuê"
++
++msgid "Log file"
++msgstr "Tệp nhật ký"
++
++msgid "Multicast address"
++msgstr "Äa địa chỉ"
++
++msgid "Operation mode"
++msgstr "Chế độ hoạt động"
++
++msgid "Port"
++msgstr "Cổng"
++
++msgid "Protocol family"
++msgstr "Giao thức"
++
++msgid "Served interfaces"
++msgstr "Giao diện phục vụ"
++
++msgid "Server"
++msgstr "Máy chủ"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "Quy định cụ thể máy chủ IPv4, IPv6 và NTP"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "Quy định cụ thể tên máy chủ IPv4, IPv6 và NTP"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "Äịnh rõ công bố IPv4 và IPv6 mạng tiá»n tố trong ký hiệu CIDR"
++
++msgid "The AHCP Service is not running."
++msgstr "Dịch vụ AHCP khộng hoạt động."
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "Dịch vụ AHCP đang hoạt động với ID %s."
++
++msgid "There are no active leases."
++msgstr "Hiện không có ngÆ°á»i thuê"
++
++msgid "Unique ID file"
++msgstr "Tệp Unique ID"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/zh-cn/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/zh-cn/ahcp.po
+new file mode 100644
+index 0000000..295bbe7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/zh-cn/ahcp.po
+@@ -0,0 +1,113 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-09 03:31+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "AHCP æœåŠ¡å™¨"
++
++#, fuzzy
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++"AHCP是一个自动é…ç½®IPv6å’ŒIPv6/IPv4åŒæ ˆç½‘络的å议,用于在网络上进行路由探测和地"
++"å€åˆ†é…。因为在æŸäº›ç½‘络上为æ¯ä¸ªé“¾è·¯å±‚广播域å‡é…ç½®æœåŠ¡å™¨æ˜¯éžå¸¸å›°éš¾çš„,例如移动"
++"ad-hoc网络。"
++
++msgid "Active AHCP Leases"
++msgstr "活动的AHCP租约"
++
++msgid "Address"
++msgstr "地å€"
++
++msgid "Advanced Settings"
++msgstr "高级设置"
++
++msgid "Age"
++msgstr "有效期"
++
++msgid "Announced DNS servers"
++msgstr "公布DNSæœåŠ¡å™¨"
++
++msgid "Announced NTP servers"
++msgstr "公布NTPæœåŠ¡å™¨"
++
++msgid "Announced prefixes"
++msgstr "公布地å€å‰ç¼€"
++
++msgid "Collecting data..."
++msgstr "æ•°æ®æ”¶é›†ä¸­..."
++
++msgid "Forwarder"
++msgstr "转å‘器"
++
++msgid "General Setup"
++msgstr "通用设置"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4å’ŒIPv6"
++
++msgid "IPv4 only"
++msgstr "ä»…IPv4"
++
++msgid "IPv6 only"
++msgstr "ä»…IPv6"
++
++msgid "Lease directory"
++msgstr "租èµç›®å½•"
++
++msgid "Lease validity time"
++msgstr "租约有效期"
++
++msgid "Log file"
++msgstr "日志文件"
++
++msgid "Multicast address"
++msgstr "多播地å€"
++
++msgid "Operation mode"
++msgstr "工作模å¼"
++
++msgid "Port"
++msgstr "端å£"
++
++msgid "Protocol family"
++msgstr "å议簇"
++
++msgid "Served interfaces"
++msgstr "æœåŠ¡æŽ¥å£"
++
++msgid "Server"
++msgstr "æœåŠ¡å™¨"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "指定IPv4与IPv6 时间æœåŠ¡å™¨"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "指定IPv4与IPv6 域åæœåŠ¡å™¨"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "指定IPv4与IPv6网络地å€å‰ç¼€(CIDR表示法)"
++
++msgid "The AHCP Service is not running."
++msgstr "AHCPæœåŠ¡æ²¡æœ‰è¿è¡Œã€‚"
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "AHCPæœåŠ¡ç¨‹åºè¿›ç¨‹ID %s"
++
++msgid "There are no active leases."
++msgstr "没有活跃租约。"
++
++msgid "Unique ID file"
++msgstr "UID文件"
+diff --git a/feeds/luci/applications/luci-app-ahcp/po/zh-tw/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/zh-tw/ahcp.po
+new file mode 100644
+index 0000000..dc7f6c5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/po/zh-tw/ahcp.po
+@@ -0,0 +1,109 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-10 12:30+0200\n"
++"Last-Translator: mp607 <mickey60711@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "AHCP Server"
++msgstr "AHCP伺æœå™¨"
++
++msgid ""
++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
++"networks designed to be used in place of router discovery or DHCP on "
++"networks where it is difficult or impossible to configure a server within "
++"every link-layer broadcast domain, for example mobile ad-hoc networks."
++msgstr ""
++
++msgid "Active AHCP Leases"
++msgstr ""
++
++msgid "Address"
++msgstr "ä½ç½®"
++
++msgid "Advanced Settings"
++msgstr "進階設定"
++
++msgid "Age"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr "匿åçš„DNS伺æœå™¨"
++
++msgid "Announced NTP servers"
++msgstr "匿åçš„NTP伺æœå™¨"
++
++msgid "Announced prefixes"
++msgstr "匿åçš„å‰ç¶´"
++
++msgid "Collecting data..."
++msgstr "收集資料"
++
++msgid "Forwarder"
++msgstr ""
++
++msgid "General Setup"
++msgstr "一般設定"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 和 IPv6"
++
++msgid "IPv4 only"
++msgstr "åªæœ‰IPv4"
++
++msgid "IPv6 only"
++msgstr "åªæœ‰IPv6"
++
++msgid "Lease directory"
++msgstr "租用目錄"
++
++msgid "Lease validity time"
++msgstr "租用有效時間"
++
++msgid "Log file"
++msgstr "記錄檔"
++
++msgid "Multicast address"
++msgstr "多點廣播ä½ç½®"
++
++msgid "Operation mode"
++msgstr "æ“作模å¼"
++
++msgid "Port"
++msgstr "通訊埠"
++
++msgid "Protocol family"
++msgstr "å”定群組"
++
++msgid "Served interfaces"
++msgstr "æä¾›æœå‹™çš„ç•Œé¢"
++
++msgid "Server"
++msgstr "伺æœå™¨"
++
++msgid "Specifies the announced IPv4 and IPv6 NTP servers"
++msgstr "特別的匿åIPv4 與 IPv6 NTP 伺æœå™¨"
++
++msgid "Specifies the announced IPv4 and IPv6 name servers"
++msgstr "特別的匿åIPv4 與 IPv6 å稱伺æœå™¨"
++
++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
++msgstr "特別的匿åIPv4 與 IPv6 網路CIDRå‰ç¶´"
++
++msgid "The AHCP Service is not running."
++msgstr "AHCPæœå‹™æ²’有é‹ä½œ"
++
++msgid "The AHCP Service is running with ID %s."
++msgstr "AHCPæœå‹™é‹ä½œä¸­ ID為 %s"
++
++msgid "There are no active leases."
++msgstr "沒有使用中的租用"
++
++msgid "Unique ID file"
++msgstr "ç¨ç«‹çš„ID檔案"
+diff --git a/feeds/luci/applications/luci-app-ahcp/root/etc/uci-defaults/luci-ahcp b/feeds/luci/applications/luci-app-ahcp/root/etc/uci-defaults/luci-ahcp
+new file mode 100755
+index 0000000..f2b2487
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ahcp/root/etc/uci-defaults/luci-ahcp
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@ahcpd[-1]
++ add ucitrack ahcpd
++ set ucitrack.@ahcpd[-1].init=ahcpd
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-asterisk/Makefile b/feeds/luci/applications/luci-app-asterisk/Makefile
+new file mode 100644
+index 0000000..3434e16
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/Makefile
+@@ -0,0 +1,13 @@
++#
++# 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_TITLE:=LuCI Support for Asterisk
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk.lua
+new file mode 100644
+index 0000000..ceb738d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk.lua
+@@ -0,0 +1,746 @@
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.asterisk", package.seeall)
++require("luci.asterisk.cc_idd")
++
++local _io = require("io")
++local uci = require("luci.model.uci").cursor()
++local sys = require("luci.sys")
++local util = require("luci.util")
++
++AST_BIN = "/usr/sbin/asterisk"
++AST_FLAGS = "-r -x"
++
++
++--- LuCI Asterisk - Resync uci context
++function uci_resync()
++ uci = luci.model.uci.cursor()
++end
++
++--- LuCI Asterisk io interface
++-- Handles low level io.
++-- @type module
++io = luci.util.class()
++
++--- Execute command and return output
++-- @param command String containing the command to execute
++-- @return String containing the command output
++function io.exec(command)
++ local fh = _io.popen( "%s %s %q" %{ AST_BIN, AST_FLAGS, command }, "r" )
++ assert(fh, "Failed to invoke asterisk")
++
++ local buffer = fh:read("*a")
++ fh:close()
++ return buffer
++end
++
++--- Execute command and invoke given callback for each readed line
++-- @param command String containing the command to execute
++-- @param callback Function to call back for each line
++-- @return Always true
++function io.execl(command, callback)
++ local ln
++ local fh = _io.popen( "%s %s %q" %{ AST_BIN, AST_FLAGS, command }, "r" )
++ assert(fh, "Failed to invoke asterisk")
++
++ repeat
++ ln = fh:read("*l")
++ callback(ln)
++ until not ln
++
++ fh:close()
++ return true
++end
++
++--- Execute command and return an iterator that returns one line per invokation
++-- @param command String containing the command to execute
++-- @return Iterator function
++function io.execi(command)
++ local fh = _io.popen( "%s %s %q" %{ AST_BIN, AST_FLAGS, command }, "r" )
++ assert(fh, "Failed to invoke asterisk")
++
++ return function()
++ local ln = fh:read("*l")
++ if not ln then fh:close() end
++ return ln
++ end
++end
++
++
++--- LuCI Asterisk - core status
++core = luci.util.class()
++
++--- Retrive version string.
++-- @return String containing the reported asterisk version
++function core.version(self)
++ local version = io.exec("core show version")
++ return version:gsub(" *\n", "")
++end
++
++
++--- LuCI Asterisk - SIP information.
++-- @type module
++sip = luci.util.class()
++
++--- Get a list of known SIP peers
++-- @return Table containing each SIP peer
++function sip.peers(self)
++ local head = false
++ local peers = { }
++
++ for line in io.execi("sip show peers") do
++ if not head then
++ head = true
++ elseif not line:match(" sip peers ") then
++ local online, delay, id, uid
++ local name, host, dyn, nat, acl, port, status =
++ line:match("(.-) +(.-) +([D ]) ([N ]) (.) (%d+) +(.+)")
++
++ if host == '(Unspecified)' then host = nil end
++ if port == '0' then port = nil else port = tonumber(port) end
++
++ dyn = ( dyn == 'D' and true or false )
++ nat = ( nat == 'N' and true or false )
++ acl = ( acl ~= ' ' and true or false )
++
++ online, delay = status:match("(OK) %((%d+) ms%)")
++
++ if online == 'OK' then
++ online = true
++ delay = tonumber(delay)
++ elseif status ~= 'Unmonitored' then
++ online = false
++ delay = 0
++ else
++ online = nil
++ delay = 0
++ end
++
++ id, uid = name:match("(.+)/(.+)")
++
++ if not ( id and uid ) then
++ id = name .. "..."
++ uid = nil
++ end
++
++ peers[#peers+1] = {
++ online = online,
++ delay = delay,
++ name = id,
++ user = uid,
++ dynamic = dyn,
++ nat = nat,
++ acl = acl,
++ host = host,
++ port = port
++ }
++ end
++ end
++
++ return peers
++end
++
++--- Get informations of given SIP peer
++-- @param peer String containing the name of the SIP peer
++function sip.peer(peer)
++ local info = { }
++ local keys = { }
++
++ for line in io.execi("sip show peer " .. peer) do
++ if #line > 0 then
++ local key, val = line:match("(.-) *: +(.*)")
++ if key and val then
++
++ key = key:gsub("^ +",""):gsub(" +$", "")
++ val = val:gsub("^ +",""):gsub(" +$", "")
++
++ if key == "* Name" then
++ key = "Name"
++ elseif key == "Addr->IP" then
++ info.address, info.port = val:match("(.+) Port (.+)")
++ info.port = tonumber(info.port)
++ elseif key == "Status" then
++ info.online, info.delay = val:match("(OK) %((%d+) ms%)")
++ if info.online == 'OK' then
++ info.online = true
++ info.delay = tonumber(info.delay)
++ elseif status ~= 'Unmonitored' then
++ info.online = false
++ info.delay = 0
++ else
++ info.online = nil
++ info.delay = 0
++ end
++ end
++
++ if val == 'Yes' or val == 'yes' or val == '<Set>' then
++ val = true
++ elseif val == 'No' or val == 'no' then
++ val = false
++ elseif val == '<Not set>' or val == '(none)' then
++ val = nil
++ end
++
++ keys[#keys+1] = key
++ info[key] = val
++ end
++ end
++ end
++
++ return info, keys
++end
++
++
++--- LuCI Asterisk - Internal helpers
++-- @type module
++tools = luci.util.class()
++
++--- Convert given value to a list of tokens. Split by white space.
++-- @param val String or table value
++-- @return Table containing tokens
++function tools.parse_list(v)
++ local tokens = { }
++
++ v = type(v) == "table" and v or { v }
++ for _, v in ipairs(v) do
++ if type(v) == "string" then
++ for v in v:gmatch("(%S+)") do
++ tokens[#tokens+1] = v
++ end
++ end
++ end
++
++ return tokens
++end
++
++--- Convert given list to a collection of hyperlinks
++-- @param list Table of tokens
++-- @param url String pattern or callback function to construct urls (optional)
++-- @param sep String containing the seperator (optional, default is ", ")
++-- @return String containing the html fragment
++function tools.hyperlinks(list, url, sep)
++ local html
++
++ local function mkurl(p, t)
++ if type(p) == "string" then
++ return p:format(t)
++ elseif type(p) == "function" then
++ return p(t)
++ else
++ return '#'
++ end
++ end
++
++ list = list or { }
++ url = url or "%s"
++ sep = sep or ", "
++
++ for _, token in ipairs(list) do
++ html = ( html and html .. sep or '' ) ..
++ '<a href="%s">%s</a>' %{ mkurl(url, token), token }
++ end
++
++ return html or ''
++end
++
++
++--- LuCI Asterisk - International Direct Dialing Prefixes
++-- @type module
++idd = luci.util.class()
++
++--- Lookup the country name for the given IDD code.
++-- @param country String containing IDD code
++-- @return String containing the country name
++function idd.country(c)
++ for _, v in ipairs(cc_idd.CC_IDD) do
++ if type(v[3]) == "table" then
++ for _, v2 in ipairs(v[3]) do
++ if v2 == tostring(c) then
++ return v[1]
++ end
++ end
++ elseif v[3] == tostring(c) then
++ return v[1]
++ end
++ end
++end
++
++--- Lookup the country code for the given IDD code.
++-- @param country String containing IDD code
++-- @return Table containing the country code(s)
++function idd.cc(c)
++ for _, v in ipairs(cc_idd.CC_IDD) do
++ if type(v[3]) == "table" then
++ for _, v2 in ipairs(v[3]) do
++ if v2 == tostring(c) then
++ return type(v[2]) == "table"
++ and v[2] or { v[2] }
++ end
++ end
++ elseif v[3] == tostring(c) then
++ return type(v[2]) == "table"
++ and v[2] or { v[2] }
++ end
++ end
++end
++
++--- Lookup the IDD code(s) for the given country.
++-- @param idd String containing the country name
++-- @return Table containing the IDD code(s)
++function idd.idd(c)
++ for _, v in ipairs(cc_idd.CC_IDD) do
++ if v[1]:lower():match(c:lower()) then
++ return type(v[3]) == "table"
++ and v[3] or { v[3] }
++ end
++ end
++end
++
++--- Populate given CBI field with IDD codes.
++-- @param field CBI option object
++-- @return (nothing)
++function idd.cbifill(o)
++ for i, v in ipairs(cc_idd.CC_IDD) do
++ o:value("_%i" % i, util.pcdata(v[1]))
++ end
++
++ o.formvalue = function(...)
++ local val = luci.cbi.Value.formvalue(...)
++ if val:sub(1,1) == "_" then
++ val = tonumber((val:gsub("^_", "")))
++ if val then
++ return type(cc_idd.CC_IDD[val][3]) == "table"
++ and cc_idd.CC_IDD[val][3] or { cc_idd.CC_IDD[val][3] }
++ end
++ end
++ return val
++ end
++
++ o.cfgvalue = function(...)
++ local val = luci.cbi.Value.cfgvalue(...)
++ if val then
++ val = tools.parse_list(val)
++ for i, v in ipairs(cc_idd.CC_IDD) do
++ if type(v[3]) == "table" then
++ if v[3][1] == val[1] then
++ return "_%i" % i
++ end
++ else
++ if v[3] == val[1] then
++ return "_%i" % i
++ end
++ end
++ end
++ end
++ return val
++ end
++end
++
++
++--- LuCI Asterisk - Country Code Prefixes
++-- @type module
++cc = luci.util.class()
++
++--- Lookup the country name for the given CC code.
++-- @param country String containing CC code
++-- @return String containing the country name
++function cc.country(c)
++ for _, v in ipairs(cc_idd.CC_IDD) do
++ if type(v[2]) == "table" then
++ for _, v2 in ipairs(v[2]) do
++ if v2 == tostring(c) then
++ return v[1]
++ end
++ end
++ elseif v[2] == tostring(c) then
++ return v[1]
++ end
++ end
++end
++
++--- Lookup the international dialing code for the given CC code.
++-- @param cc String containing CC code
++-- @return String containing IDD code
++function cc.idd(c)
++ for _, v in ipairs(cc_idd.CC_IDD) do
++ if type(v[2]) == "table" then
++ for _, v2 in ipairs(v[2]) do
++ if v2 == tostring(c) then
++ return type(v[3]) == "table"
++ and v[3] or { v[3] }
++ end
++ end
++ elseif v[2] == tostring(c) then
++ return type(v[3]) == "table"
++ and v[3] or { v[3] }
++ end
++ end
++end
++
++--- Lookup the CC code(s) for the given country.
++-- @param country String containing the country name
++-- @return Table containing the CC code(s)
++function cc.cc(c)
++ for _, v in ipairs(cc_idd.CC_IDD) do
++ if v[1]:lower():match(c:lower()) then
++ return type(v[2]) == "table"
++ and v[2] or { v[2] }
++ end
++ end
++end
++
++--- Populate given CBI field with CC codes.
++-- @param field CBI option object
++-- @return (nothing)
++function cc.cbifill(o)
++ for i, v in ipairs(cc_idd.CC_IDD) do
++ o:value("_%i" % i, util.pcdata(v[1]))
++ end
++
++ o.formvalue = function(...)
++ local val = luci.cbi.Value.formvalue(...)
++ if val:sub(1,1) == "_" then
++ val = tonumber((val:gsub("^_", "")))
++ if val then
++ return type(cc_idd.CC_IDD[val][2]) == "table"
++ and cc_idd.CC_IDD[val][2] or { cc_idd.CC_IDD[val][2] }
++ end
++ end
++ return val
++ end
++
++ o.cfgvalue = function(...)
++ local val = luci.cbi.Value.cfgvalue(...)
++ if val then
++ val = tools.parse_list(val)
++ for i, v in ipairs(cc_idd.CC_IDD) do
++ if type(v[2]) == "table" then
++ if v[2][1] == val[1] then
++ return "_%i" % i
++ end
++ else
++ if v[2] == val[1] then
++ return "_%i" % i
++ end
++ end
++ end
++ end
++ return val
++ end
++end
++
++
++--- LuCI Asterisk - Dialzone
++-- @type module
++dialzone = luci.util.class()
++
++--- Parse a dialzone section
++-- @param zone Table containing the zone info
++-- @return Table with parsed information
++function dialzone.parse(z)
++ if z['.name'] then
++ return {
++ trunks = tools.parse_list(z.uses),
++ name = z['.name'],
++ description = z.description or z['.name'],
++ addprefix = z.addprefix,
++ matches = tools.parse_list(z.match),
++ intlmatches = tools.parse_list(z.international),
++ countrycode = z.countrycode,
++ localzone = z.localzone,
++ localprefix = z.localprefix
++ }
++ end
++end
++
++--- Get a list of known dial zones
++-- @return Associative table of zones and table of zone names
++function dialzone.zones()
++ local zones = { }
++ local znames = { }
++ uci:foreach("asterisk", "dialzone",
++ function(z)
++ zones[z['.name']] = dialzone.parse(z)
++ znames[#znames+1] = z['.name']
++ end)
++ return zones, znames
++end
++
++--- Get a specific dial zone
++-- @param name Name of the dial zone
++-- @return Table containing zone information
++function dialzone.zone(n)
++ local zone
++ uci:foreach("asterisk", "dialzone",
++ function(z)
++ if z['.name'] == n then
++ zone = dialzone.parse(z)
++ end
++ end)
++ return zone
++end
++
++--- Find uci section hash for given zone number
++-- @param idx Zone number
++-- @return String containing the uci hash pointing to the section
++function dialzone.ucisection(i)
++ local hash
++ local index = 1
++ i = tonumber(i)
++ uci:foreach("asterisk", "dialzone",
++ function(z)
++ if not hash and index == i then
++ hash = z['.name']
++ end
++ index = index + 1
++ end)
++ return hash
++end
++
++
++--- LuCI Asterisk - Voicemailbox
++-- @type module
++voicemail = luci.util.class()
++
++--- Parse a voicemail section
++-- @param zone Table containing the mailbox info
++-- @return Table with parsed information
++function voicemail.parse(z)
++ if z.number and #z.number > 0 then
++ local v = {
++ id = '%s@%s' %{ z.number, z.context or 'default' },
++ number = z.number,
++ context = z.context or 'default',
++ name = z.name or z['.name'] or 'OpenWrt',
++ zone = z.zone or 'homeloc',
++ password = z.password or '0000',
++ email = z.email or '',
++ page = z.page or '',
++ dialplans = { }
++ }
++
++ uci:foreach("asterisk", "dialplanvoice",
++ function(s)
++ if s.dialplan and #s.dialplan > 0 and
++ s.voicebox == v.number
++ then
++ v.dialplans[#v.dialplans+1] = s.dialplan
++ end
++ end)
++
++ return v
++ end
++end
++
++--- Get a list of known voicemail boxes
++-- @return Associative table of boxes and table of box numbers
++function voicemail.boxes()
++ local vboxes = { }
++ local vnames = { }
++ uci:foreach("asterisk", "voicemail",
++ function(z)
++ local v = voicemail.parse(z)
++ if v then
++ local n = '%s@%s' %{ v.number, v.context }
++ vboxes[n] = v
++ vnames[#vnames+1] = n
++ end
++ end)
++ return vboxes, vnames
++end
++
++--- Get a specific voicemailbox
++-- @param number Number of the voicemailbox
++-- @return Table containing mailbox information
++function voicemail.box(n)
++ local box
++ n = n:gsub("@.+$","")
++ uci:foreach("asterisk", "voicemail",
++ function(z)
++ if z.number == tostring(n) then
++ box = voicemail.parse(z)
++ end
++ end)
++ return box
++end
++
++--- Find all voicemailboxes within the given dialplan
++-- @param plan Dialplan name or table
++-- @return Associative table containing extensions mapped to mailbox info
++function voicemail.in_dialplan(p)
++ local plan = type(p) == "string" and p or p.name
++ local boxes = { }
++ uci:foreach("asterisk", "dialplanvoice",
++ function(s)
++ if s.extension and #s.extension > 0 and s.dialplan == plan then
++ local box = voicemail.box(s.voicebox)
++ if box then
++ boxes[s.extension] = box
++ end
++ end
++ end)
++ return boxes
++end
++
++--- Remove voicemailbox and associated extensions from config
++-- @param box Voicemailbox number or table
++-- @param ctx UCI context to use (optional)
++-- @return Boolean indicating success
++function voicemail.remove(v, ctx)
++ ctx = ctx or uci
++ local box = type(v) == "string" and v or v.number
++ local ok1 = ctx:delete_all("asterisk", "voicemail", {number=box})
++ local ok2 = ctx:delete_all("asterisk", "dialplanvoice", {voicebox=box})
++ return ( ok1 or ok2 ) and true or false
++end
++
++
++--- LuCI Asterisk - MeetMe Conferences
++-- @type module
++meetme = luci.util.class()
++
++--- Parse a meetme section
++-- @param room Table containing the room info
++-- @return Table with parsed information
++function meetme.parse(r)
++ if r.room and #r.room > 0 then
++ local v = {
++ room = r.room,
++ pin = r.pin or '',
++ adminpin = r.adminpin or '',
++ description = r._description or '',
++ dialplans = { }
++ }
++
++ uci:foreach("asterisk", "dialplanmeetme",
++ function(s)
++ if s.dialplan and #s.dialplan > 0 and s.room == v.room then
++ v.dialplans[#v.dialplans+1] = s.dialplan
++ end
++ end)
++
++ return v
++ end
++end
++
++--- Get a list of known meetme rooms
++-- @return Associative table of rooms and table of room numbers
++function meetme.rooms()
++ local mrooms = { }
++ local mnames = { }
++ uci:foreach("asterisk", "meetme",
++ function(r)
++ local v = meetme.parse(r)
++ if v then
++ mrooms[v.room] = v
++ mnames[#mnames+1] = v.room
++ end
++ end)
++ return mrooms, mnames
++end
++
++--- Get a specific meetme room
++-- @param number Number of the room
++-- @return Table containing room information
++function meetme.room(n)
++ local room
++ uci:foreach("asterisk", "meetme",
++ function(r)
++ if r.room == tostring(n) then
++ room = meetme.parse(r)
++ end
++ end)
++ return room
++end
++
++--- Find all meetme rooms within the given dialplan
++-- @param plan Dialplan name or table
++-- @return Associative table containing extensions mapped to room info
++function meetme.in_dialplan(p)
++ local plan = type(p) == "string" and p or p.name
++ local rooms = { }
++ uci:foreach("asterisk", "dialplanmeetme",
++ function(s)
++ if s.extension and #s.extension > 0 and s.dialplan == plan then
++ local room = meetme.room(s.room)
++ if room then
++ rooms[s.extension] = room
++ end
++ end
++ end)
++ return rooms
++end
++
++--- Remove meetme room and associated extensions from config
++-- @param room Voicemailbox number or table
++-- @param ctx UCI context to use (optional)
++-- @return Boolean indicating success
++function meetme.remove(v, ctx)
++ ctx = ctx or uci
++ local room = type(v) == "string" and v or v.number
++ local ok1 = ctx:delete_all("asterisk", "meetme", {room=room})
++ local ok2 = ctx:delete_all("asterisk", "dialplanmeetme", {room=room})
++ return ( ok1 or ok2 ) and true or false
++end
++
++
++--- LuCI Asterisk - Dialplan
++-- @type module
++dialplan = luci.util.class()
++
++--- Parse a dialplan section
++-- @param plan Table containing the plan info
++-- @return Table with parsed information
++function dialplan.parse(z)
++ if z['.name'] then
++ local plan = {
++ zones = { },
++ name = z['.name'],
++ description = z.description or z['.name']
++ }
++
++ -- dialzones
++ for _, name in ipairs(tools.parse_list(z.include)) do
++ local zone = dialzone.zone(name)
++ if zone then
++ plan.zones[#plan.zones+1] = zone
++ end
++ end
++
++ -- voicemailboxes
++ plan.voicemailboxes = voicemail.in_dialplan(plan)
++
++ -- meetme conferences
++ plan.meetmerooms = meetme.in_dialplan(plan)
++
++ return plan
++ end
++end
++
++--- Get a list of known dial plans
++-- @return Associative table of plans and table of plan names
++function dialplan.plans()
++ local plans = { }
++ local pnames = { }
++ uci:foreach("asterisk", "dialplan",
++ function(p)
++ plans[p['.name']] = dialplan.parse(p)
++ pnames[#pnames+1] = p['.name']
++ end)
++ return plans, pnames
++end
++
++--- Get a specific dial plan
++-- @param name Name of the dial plan
++-- @return Table containing plan information
++function dialplan.plan(n)
++ local plan
++ uci:foreach("asterisk", "dialplan",
++ function(p)
++ if p['.name'] == n then
++ plan = dialplan.parse(p)
++ end
++ end)
++ return plan
++end
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk/cc_idd.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk/cc_idd.lua
+new file mode 100644
+index 0000000..6ed8dfd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk/cc_idd.lua
+@@ -0,0 +1,245 @@
++-- Licensed to the public under the Apache License 2.0.
++
++module "luci.asterisk.cc_idd"
++
++CC_IDD = {
++-- Country, CC, IDD
++ { "Afghanistan", "93", "00" },
++ { "Albania", "355", "00" },
++ { "Algeria", "213", "00" },
++ { "American Samoa", "684", "00" },
++ { "Andorra", "376", "00" },
++ { "Angola", "244", "00" },
++ { "Anguilla", "264", "011" },
++ { "Antarctica", "672", "" },
++ { "Antigua", "268", "011" },
++ { "Argentina", "54", "00" },
++ { "Armenia", "374", "00" },
++ { "Aruba", "297", "00" },
++ { "Ascension Island", "247", "00" },
++ { "Australia", "61", "0011" },
++ { "Austria", "43", "00" },
++ { "Azberbaijan", "994", "00" },
++ { "Bahamas", "242", "011" },
++ { "Bahrain", "973", "00" },
++ { "Bangladesh", "880", "00" },
++ { "Barbados", "246", "011" },
++ { "Barbuda", "268", "011" },
++ { "Belarus", "375", "810" },
++ { "Belgium", "32", "00" },
++ { "Belize", "501", "00" },
++ { "Benin", "229", "00" },
++ { "Bermuda", "441", "011" },
++ { "Bhutan", "975", "00" },
++ { "Bolivia", "591", "00" },
++ { "Bosnia", "387", "00" },
++ { "Botswana", "267", "00" },
++ { "Brazil", "55", "00" },
++ { "British Virgin Islands", "284", "011" },
++ { "Brunei", "673", "00" },
++ { "Bulgaria", "359", "00" },
++ { "Burkina Faso", "226", "00" },
++ { "Burma (Myanmar)", "95", "00" },
++ { "Burundi", "257", "00" },
++ { "Cambodia", "855", "001" },
++ { "Cameroon", "237", "00" },
++ { "Canada", "1", "011" },
++ { "Cape Verde Islands", "238", "0" },
++ { "Cayman Islands", "345", "011" },
++ { "Central African Rep.", "236", "00" },
++ { "Chad", "235", "15" },
++ { "Chile", "56", "00" },
++ { "China", "86", "00" },
++ { "Christmas Island", "61", "0011" },
++ { "Cocos Islands", "61", "0011" },
++ { "Colombia", "57", "00" },
++ { "Comoros", "269", "00" },
++ { "Congo", "242", "00" },
++ { "Congo, Dem. Rep. of", "243", "00" },
++ { "Cook Islands", "682", "00" },
++ { "Costa Rica", "506", "00" },
++ { "Croatia", "385", "00" },
++ { "Cuba", "53", "119" },
++ { "Cyprus", "357", "00" },
++ { "Czech Republic", "420", "00" },
++ { "Denmark", "45", "00" },
++ { "Diego Garcia", "246", "00" },
++ { "Djibouti", "253", "00" },
++ { "Dominica", "767", "011" },
++ { "Dominican Rep.", "809", "011" },
++ { "Ecuador", "593", "00" },
++ { "Egypt", "20", "00" },
++ { "El Salvador", "503", "00" },
++ { "Equatorial Guinea", "240", "00" },
++ { "Eritrea", "291", "00" },
++ { "Estonia", "372", "00" },
++ { "Ethiopia", "251", "00" },
++ { "Faeroe Islands", "298", "00" },
++ { "Falkland Islands", "500", "00" },
++ { "Fiji Islands", "679", "00" },
++ { "Finland", "358", "00" },
++ { "France", "33", "00" },
++ { "French Antilles", "596", "00" },
++ { "French Guiana", "594", "00" },
++ { "French Polynesia", "689", "00" },
++ { "Gabon", "241", "00" },
++ { "Gambia", "220", "00" },
++ { "Georgia", "995", "810" },
++ { "Germany", "49", "00" },
++ { "Ghana", "233", "00" },
++ { "Gibraltar", "350", "00" },
++ { "Greece", "30", "00" },
++ { "Greenland", "299", "00" },
++ { "Grenada", "473", "011" },
++ { "Guadeloupe", "590", "00" },
++ { "Guam", "671", "011" },
++ { "Guantanamo Bay", "5399", "00" },
++ { "Guatemala", "502", "00" },
++ { "Guinea", "224", "00" },
++ { "Guinea Bissau", "245", "00" },
++ { "Guyana", "592", "001" },
++ { "Haiti", "509", "00" },
++ { "Honduras", "504", "00" },
++ { "Hong Kong", "852", "001" },
++ { "Hungary", "36", "00" },
++ { "Iceland", "354", "00" },
++ { "India", "91", "00" },
++ { "Indonesia", "62", { "001", "008" } },
++ { "Iran", "98", "00" },
++ { "Iraq", "964", "00" },
++ { "Ireland", "353", "00" },
++ { "Israel", "972", "00" },
++ { "Italy", "39", "00" },
++ { "Ivory Coast", "225", "00" },
++ { "Jamaica", "876", "011" },
++ { "Japan", "81", "001" },
++ { "Jordan", "962", "00" },
++ { "Kazakhstan", "7", "810" },
++ { "Kenya", "254", "000" },
++ { "Kiribati", "686", "00" },
++ { "Korea, North", "850", "00" },
++ { "Korea, South", "82", "001" },
++ { "Kuwait", "965", "00" },
++ { "Kyrgyzstan", "996", "00" },
++ { "Laos", "856", "00" },
++ { "Latvia", "371", "00" },
++ { "Lebanon", "961", "00" },
++ { "Lesotho", "266", "00" },
++ { "Liberia", "231", "00" },
++ { "Libya", "218", "00" },
++ { "Liechtenstein", "423", "00" },
++ { "Lithuania", "370", "00" },
++ { "Luxembourg", "352", "00" },
++ { "Macau", "853", "00" },
++ { "Macedonia", "389", "00" },
++ { "Madagascar", "261", "00" },
++ { "Malawi", "265", "00" },
++ { "Malaysia", "60", "00" },
++ { "Maldives", "960", "00" },
++ { "Mali", "223", "00" },
++ { "Malta", "356", "00" },
++ { "Mariana Islands", "670", "011" },
++ { "Marshall Islands", "692", "011" },
++ { "Martinique", "596", "00" },
++ { "Mauritania", "222", "00" },
++ { "Mauritius", "230", "00" },
++ { "Mayotte Islands", "269", "00" },
++ { "Mexico", "52", "00" },
++ { "Micronesia", "691", "011" },
++ { "Midway Island", "808", "011" },
++ { "Moldova", "373", "00" },
++ { "Monaco", "377", "00" },
++ { "Mongolia", "976", "001" },
++ { "Montserrat", "664", "011" },
++ { "Morocco", "212", "00" },
++ { "Mozambique", "258", "00" },
++ { "Myanmar (Burma)", "95", "00" },
++ { "Namibia", "264", "00" },
++ { "Nauru", "674", "00" },
++ { "Nepal", "977", "00" },
++ { "Netherlands", "31", "00" },
++ { "Netherlands Antilles", "599", "00" },
++ { "Nevis", "869", "011" },
++ { "New Caledonia", "687", "00" },
++ { "New Zealand", "64", "00" },
++ { "Nicaragua", "505", "00" },
++ { "Niger", "227", "00" },
++ { "Nigeria", "234", "009" },
++ { "Niue", "683", "00" },
++ { "Norfolk Island", "672", "00" },
++ { "Norway", "47", "00" },
++ { "Oman", "968", "00" },
++ { "Pakistan", "92", "00" },
++ { "Palau", "680", "011" },
++ { "Palestine", "970", "00" },
++ { "Panama", "507", "00" },
++ { "Papua New Guinea", "675", "05" },
++ { "Paraguay", "595", "002" },
++ { "Peru", "51", "00" },
++ { "Philippines", "63", "00" },
++ { "Poland", "48", "00" },
++ { "Portugal", "351", "00" },
++ { "Puerto Rico", { "787", "939" }, "011" },
++ { "Qatar", "974", "00" },
++ { "Reunion Island", "262", "00" },
++ { "Romania", "40", "00" },
++ { "Russia", "7", "810" },
++ { "Rwanda", "250", "00" },
++ { "St. Helena", "290", "00" },
++ { "St. Kitts", "869", "011" },
++ { "St. Lucia", "758", "011" },
++ { "St. Perre & Miquelon", "508", "00" },
++ { "St. Vincent", "784", "011" },
++ { "San Marino", "378", "00" },
++ { "Sao Tome & Principe", "239", "00" },
++ { "Saudi Arabia", "966", "00" },
++ { "Senegal", "221", "00" },
++ { "Serbia", "381", "99" },
++ { "Seychelles", "248", "00" },
++ { "Sierra Leone", "232", "00" },
++ { "Singapore", "65", "001" },
++ { "Slovakia", "421", "00" },
++ { "Slovenia", "386", "00" },
++ { "Solomon Islands", "677", "00" },
++ { "Somalia", "252", "00" },
++ { "South Africa", "27", "09" },
++ { "Spain", "34", "00" },
++ { "Sri Lanka", "94", "00" },
++ { "Sudan", "249", "00" },
++ { "Suriname", "597", "00" },
++ { "Swaziland", "268", "00" },
++ { "Sweden", "46", "00" },
++ { "Switzerland", "41", "00" },
++ { "Syria", "963", "00" },
++ { "Taiwan", "886", "002" },
++ { "Tajikistan", "992", "810" },
++ { "Tanzania", "255", "00" },
++ { "Thailand", "66", "001" },
++ { "Togo", "228", "00" },
++ { "Tonga", "676", "00" },
++ { "Trinidad & Tobago", "868", "011" },
++ { "Tunisia", "216", "00" },
++ { "Turkey", "90", "00" },
++ { "Turkmenistan", "993", "810" },
++ { "Turks & Caicos", "649", "011" },
++ { "Tuvalu", "688", "00" },
++ { "Uganda", "256", "000" },
++ { "Ukraine", "380", "810" },
++ { "United Arab Emirates", "971", "00" },
++ { "United Kingdom", "44", "00" },
++ { "Uruguay", "598", "00" },
++ { "USA", "1", "011" },
++ { "US Virgin Islands", "340", "011" },
++ { "Uzbekistan", "998", "810" },
++ { "Vanuatu", "678", "00" },
++ { "Vatican City", "39", "00" },
++ { "Venezuela", "58", "00" },
++ { "Vietnam", "84", "00" },
++ { "Wake Island", "808", "00" },
++ { "Wallis & Futuna", "681", "19" },
++ { "Western Samoa", "685", "00" },
++ { "Yemen", "967", "00" },
++ { "Yugoslavia", "381", "99" },
++ { "Zambia", "260", "00" },
++ { "Zimbabwe", "263", "00" }
++}
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/controller/asterisk.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/controller/asterisk.lua
+new file mode 100644
+index 0000000..4923584
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/controller/asterisk.lua
+@@ -0,0 +1,194 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.asterisk", package.seeall)
++
++function index()
++
++ entry({"admin", "services", "asterisk"}, cbi("asterisk"), "Asterisk", 80)
++
++ entry({"admin", "services", "asterisk", "voice"}, cbi("asterisk-voice"), "Voice Functions", 1)
++ entry({"admin", "services", "asterisk", "meetme"}, cbi("asterisk-meetme"), "Meetme Conferences", 2)
++
++ entry({"admin", "services", "asterisk", "iax-conns"}, cbi("asterisk-iax-connections"), "IAX Connections", 3)
++ entry({"admin", "services", "asterisk", "sip-conns"}, cbi("asterisk-sip-connections"), "SIP Connections", 4)
++
++ entry({"admin", "services", "asterisk", "dialplans"}, cbi("asterisk-dialplans"), "Dial Plans", 5)
++
++ entry({"admin", "services", "asterisk", "mod"}, cbi("asterisk-mod-app"), "Modules", 4)
++ entry({"admin", "services", "asterisk", "mod", "app"}, cbi("asterisk-mod-app"), "Applications", 1)
++ entry({"admin", "services", "asterisk", "mod", "cdr"}, cbi("asterisk-mod-cdr"), "Call Detail Records", 2)
++ entry({"admin", "services", "asterisk", "mod", "chan"}, cbi("asterisk-mod-chan"), "Channels", 3)
++ entry({"admin", "services", "asterisk", "mod", "codec"}, cbi("asterisk-mod-codec"), "Codecs", 4)
++ entry({"admin", "services", "asterisk", "mod", "format"}, cbi("asterisk-mod-format"), "Format", 5)
++ entry({"admin", "services", "asterisk", "mod", "func"}, cbi("asterisk-mod-func"), "Functions", 6)
++ entry({"admin", "services", "asterisk", "mod", "pbx"}, cbi("asterisk-mod-pbx"), "PBX", 7)
++ entry({"admin", "services", "asterisk", "mod", "res"}, cbi("asterisk-mod-res"), "Resources", 8)
++ entry({"admin", "services", "asterisk", "mod", "res", "feature"},
++ cbi("asterisk-mod-res-feature"), "Feature Module Configuration", 9 )
++
++
++ entry({"admin", "asterisk"}, cbi("asterisk/main"), "Asterisk", 99).i18n = "asterisk"
++
++ entry({"admin", "asterisk", "phones"}, cbi("asterisk/phones"), "Phones", 1)
++ entry({"admin", "asterisk", "phones", "sip"}, cbi("asterisk/phone_sip"), nil, 1).leaf = true
++ --entry({"admin", "asterisk", "phones", "exten"}, cbi("asterisk/phone_exten"), "Extensions", 2).leaf = true
++
++ entry({"admin", "asterisk", "trunks"}, cbi("asterisk/trunks"), "Trunks", 2)
++ entry({"admin", "asterisk", "trunks", "sip"}, cbi("asterisk/trunk_sip"), nil, 1).leaf = true
++
++ entry({"admin", "asterisk", "voicemail"}, cbi("asterisk/voicemail"), "Voicemail", 3)
++ entry({"admin", "asterisk", "voicemail", "mailboxes"}, cbi("asterisk/voicemail"), "Mailboxes", 1)
++ entry({"admin", "asterisk", "voicemail", "settings"}, cbi("asterisk/voicemail_settings"), "Settings", 2)
++
++ entry({"admin", "asterisk", "meetme"}, cbi("asterisk/meetme"), "MeetMe", 4)
++ entry({"admin", "asterisk", "meetme", "rooms"}, cbi("asterisk/meetme"), "Rooms", 1)
++ entry({"admin", "asterisk", "meetme", "settings"}, cbi("asterisk/meetme_settings"), "Settings", 2)
++
++ entry({"admin", "asterisk", "dialplans"}, call("handle_dialplan"), "Call Routing", 5)
++ entry({"admin", "asterisk", "dialplans", "out"}, cbi("asterisk/dialplan_out"), nil, 1).leaf = true
++ entry({"admin", "asterisk", "dialplans", "zones"}, call("handle_dialzones"), "Dial Zones", 2).leaf = true
++
++end
++
++
++function handle_dialplan()
++ local uci = luci.model.uci.cursor()
++ local ast = require "luci.asterisk"
++ local err = false
++
++ for k, v in pairs(luci.http.formvaluetable("delzone")) do
++ local plan = ast.dialplan.plan(k)
++ if #v > 0 and plan then
++ local newinc = { }
++
++ for _, z in ipairs(plan.zones) do
++ if z.name ~= v then
++ newinc[#newinc+1] = z.name
++ end
++ end
++
++ uci:delete("asterisk", plan.name, "include")
++
++ if #newinc > 0 then
++ uci:set("asterisk", plan.name, "include", newinc)
++ end
++ end
++ end
++
++ for k, v in pairs(luci.http.formvaluetable("addzone")) do
++ local plan = ast.dialplan.plan(k)
++ local zone = ast.dialzone.zone(v)
++ if #v > 0 and plan and zone then
++ local newinc = { zone.name }
++
++ for _, z in ipairs(plan.zones) do
++ newinc[#newinc+1] = z.name
++ end
++
++ uci:delete("asterisk", plan.name, "include")
++
++ if #newinc > 0 then
++ uci:set("asterisk", plan.name, "include", newinc)
++ end
++ end
++ end
++
++ for k, v in pairs(luci.http.formvaluetable("delvbox")) do
++ local plan = ast.dialplan.plan(k)
++ if #v > 0 and plan then
++ uci:delete_all("asterisk", "dialplanvoice",
++ { extension=v, dialplan=plan.name })
++ end
++ end
++
++ for k, v in pairs(luci.http.formvaluetable("addvbox")) do
++ local plan = ast.dialplan.plan(k)
++ local vbox = ast.voicemail.box(v)
++ if plan and vbox then
++ local vext = luci.http.formvalue("addvboxext.%s" % plan.name)
++ vext = ( vext and #vext > 0 ) and vext or vbox.number
++ uci:section("asterisk", "dialplanvoice", nil, {
++ dialplan = plan.name,
++ extension = vext,
++ voicebox = vbox.number,
++ voicecontext = vbox.context
++ })
++ end
++ end
++
++ for k, v in pairs(luci.http.formvaluetable("delmeetme")) do
++ local plan = ast.dialplan.plan(k)
++ if #v > 0 and plan then
++ uci:delete_all("asterisk", "dialplanmeetme",
++ { extension=v, dialplan=plan.name })
++ end
++ end
++
++ for k, v in pairs(luci.http.formvaluetable("addmeetme")) do
++ local plan = ast.dialplan.plan(k)
++ local meetme = ast.meetme.room(v)
++ if plan and meetme then
++ local mext = luci.http.formvalue("addmeetmeext.%s" % plan.name)
++ mext = ( mext and #mext > 0 ) and mext or meetme.room
++ uci:section("asterisk", "dialplanmeetme", nil, {
++ dialplan = plan.name,
++ extension = mext,
++ room = meetme.room
++ })
++ end
++ end
++
++ local aname = luci.http.formvalue("addplan")
++ if aname and #aname > 0 then
++ if aname:match("^[a-zA-Z0-9_]+$") then
++ uci:section("asterisk", "dialplan", aname, { })
++ else
++ err = true
++ end
++ end
++
++ local dname = luci.http.formvalue("delplan")
++ if dname and #dname > 0 then
++ if uci:get("asterisk", dname) == "dialplan" then
++ uci:delete("asterisk", dname)
++ uci:delete_all("asterisk", "dialplanvoice", { dialplan=dname })
++ uci:delete_all("asterisk", "dialplanmeetme", { dialplan=dname })
++ end
++ end
++
++ uci:save("asterisk")
++ ast.uci_resync()
++
++ luci.template.render("asterisk/dialplans", { create_error = err })
++end
++
++function handle_dialzones()
++ local ast = require "luci.asterisk"
++ local uci = luci.model.uci.cursor()
++ local err = false
++
++ if luci.http.formvalue("newzone") then
++ local name = luci.http.formvalue("newzone_name")
++ if name and name:match("^[a-zA-Z0-9_]+$") then
++ uci:section("asterisk", "dialzone", name, {
++ uses = ast.tools.parse_list(luci.http.formvalue("newzone_uses") or {}),
++ match = ast.tools.parse_list(luci.http.formvalue("newzone_match") or {})
++ })
++ uci:save("asterisk")
++ else
++ err = true
++ end
++ end
++
++ if luci.http.formvalue("delzone") then
++ local name = luci.http.formvalue("delzone")
++ if uci:get("asterisk", name) == "dialzone" then
++ uci:delete("asterisk", name)
++ uci:save("asterisk")
++ end
++ end
++
++ luci.template.render("asterisk/dialzones", { create_error = err })
++end
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-dialplans.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-dialplans.lua
+new file mode 100644
+index 0000000..d4daa68
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-dialplans.lua
+@@ -0,0 +1,91 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++dialplan = cbimap:section(TypedSection, "dialplan", "Section dialplan", "")
++dialplan.addremove = true
++dialplan.dynamic = true
++
++include = dialplan:option(MultiValue, "include", "Include zones and plans", "")
++cbimap.uci:foreach( "asterisk", "dialplan", function(s) include:value(s['.name']) end )
++cbimap.uci:foreach( "asterisk", "dialzone", function(s) include:value(s['.name']) end )
++
++dialplanexten = cbimap:section(TypedSection, "dialplanexten", "Dialplan Extension", "")
++dialplanexten.anonymous = true
++dialplanexten.addremove = true
++dialplanexten.dynamic = true
++
++
++dialplangeneral = cbimap:section(TypedSection, "dialplangeneral", "Dialplan General Options", "")
++dialplangeneral.anonymous = true
++dialplangeneral.addremove = true
++
++allowtransfer = dialplangeneral:option(Flag, "allowtransfer", "Allow transfer", "")
++allowtransfer.rmempty = true
++
++canreinvite = dialplangeneral:option(ListValue, "canreinvite", "Reinvite/redirect media connections", "")
++canreinvite:value("yes", "Yes")
++canreinvite:value("nonat", "Yes when not behind NAT")
++canreinvite:value("update", "Use UPDATE rather than INVITE for path redirection")
++canreinvite:value("no", "No")
++canreinvite.rmempty = true
++
++clearglobalvars = dialplangeneral:option(Flag, "clearglobalvars", "Clear global vars", "")
++clearglobalvars.rmempty = true
++
++
++dialplangoto = cbimap:section(TypedSection, "dialplangoto", "Dialplan Goto", "")
++dialplangoto.anonymous = true
++dialplangoto.addremove = true
++dialplangoto.dynamic = true
++
++
++dialplanmeetme = cbimap:section(TypedSection, "dialplanmeetme", "Dialplan Conference", "")
++dialplanmeetme.anonymous = true
++dialplanmeetme.addremove = true
++dialplanmeetme.dynamic = true
++
++
++dialplansaytime = cbimap:section(TypedSection, "dialplansaytime", "Dialplan Time", "")
++dialplansaytime.anonymous = true
++dialplansaytime.addremove = true
++dialplansaytime.dynamic = true
++
++
++dialplanvoice = cbimap:section(TypedSection, "dialplanvoice", "Dialplan Voicemail", "")
++dialplanvoice.anonymous = true
++dialplanvoice.addremove = true
++dialplanvoice.dynamic = true
++
++
++dialzone = cbimap:section(TypedSection, "dialzone", "Dial Zones for Dialplan", "")
++dialzone.addremove = true
++dialzone.template = "cbi/tblsection"
++
++addprefix = dialzone:option(Value, "addprefix", "Prefix to add matching dialplans", "")
++addprefix.rmempty = true
++
++--international = dialzone:option(DynamicList, "international", "Match International prefix", "")
++international = dialzone:option(Value, "international", "Match International prefix", "")
++international.rmempty = true
++
++localprefix = dialzone:option(Value, "localprefix", "Prefix (0) to add/remove to/from intl. numbers", "")
++localprefix.rmempty = true
++
++localzone = dialzone:option(Value, "localzone", "Dialzone for intl. numbers matched as local", "")
++localzone.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "dialplans" )
++cbimap.uci:foreach( "asterisk", "dialplan", function(s) localzone:value(s['.name']) end )
++cbimap.uci:foreach( "asterisk", "dialzone", function(s) localzone:value(s['.name']) end )
++
++match = dialzone:option(Value, "match", "Match plan", "")
++match.rmempty = true
++
++uses = dialzone:option(ListValue, "uses", "Connection to use", "")
++uses.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "sip-conns" )
++cbimap.uci:foreach( "asterisk", "sip", function(s) uses:value('SIP/'..s['.name']) end )
++cbimap.uci:foreach( "asterisk", "iax", function(s) uses:value('IAX/'..s['.name']) end )
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-iax-connections.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-iax-connections.lua
+new file mode 100644
+index 0000000..d0eaf34
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-iax-connections.lua
+@@ -0,0 +1,49 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++iax = cbimap:section(TypedSection, "iax", "IAX Connection", "")
++iax.addremove = true
++
++alwaysinternational = iax:option(Flag, "alwaysinternational", "Always Dial International", "")
++alwaysinternational.optional = true
++
++context = iax:option(ListValue, "context", "Context to use", "")
++context.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "dialplans" )
++cbimap.uci:foreach( "asterisk", "dialplan", function(s) context:value(s['.name']) end )
++cbimap.uci:foreach( "asterisk", "dialzone", function(s) context:value(s['.name']) end )
++
++countrycode = iax:option(Value, "countrycode", "Country Code for connection", "")
++countrycode.optional = true
++
++extension = iax:option(Value, "extension", "Add as Extension", "")
++extension.optional = true
++
++host = iax:option(Value, "host", "Host name (or blank)", "")
++host.optional = true
++
++internationalprefix = iax:option(Value, "internationalprefix", "International Dial Prefix", "")
++internationalprefix.optional = true
++
++prefix = iax:option(Value, "prefix", "Dial Prefix (for external line)", "")
++prefix.optional = true
++
++secret = iax:option(Value, "secret", "Secret", "")
++secret.optional = true
++
++timeout = iax:option(Value, "timeout", "Dial Timeout (sec)", "")
++timeout.optional = true
++
++type = iax:option(ListValue, "type", "Option type", "")
++type:value("friend", "Friend (outbound/inbound)")
++type:value("user", "User (inbound - authenticate by \"from\")")
++type:value("peer", "Peer (outbound - match by host)")
++type.optional = true
++
++username = iax:option(Value, "username", "User name", "")
++username.optional = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-meetme.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-meetme.lua
+new file mode 100644
+index 0000000..dd79e46
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-meetme.lua
+@@ -0,0 +1,22 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++meetmegeneral = cbimap:section(TypedSection, "meetmegeneral", "Meetme Conference General Options", "")
++
++audiobuffers = meetmegeneral:option(Value, "audiobuffers", "Number of 20ms audio buffers to be used", "")
++
++
++meetme = cbimap:section(TypedSection, "meetme", "Meetme Conference", "")
++meetme.addremove = true
++
++adminpin = meetme:option(Value, "adminpin", "Admin PIN", "")
++adminpin.password = true
++
++pin = meetme:option(Value, "pin", "Meeting PIN", "")
++pin.password = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-app.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-app.lua
+new file mode 100644
+index 0000000..0a0a2d5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-app.lua
+@@ -0,0 +1,391 @@
++cbimap = Map("asterisk", "asterisk", "")
++
++module = cbimap:section(TypedSection, "module", "Modules", "")
++module.anonymous = true
++
++app_alarmreceiver = module:option(ListValue, "app_alarmreceiver", "Alarm Receiver Application", "")
++app_alarmreceiver:value("yes", "Load")
++app_alarmreceiver:value("no", "Do Not Load")
++app_alarmreceiver:value("auto", "Load as Required")
++app_alarmreceiver.rmempty = true
++
++app_authenticate = module:option(ListValue, "app_authenticate", "Authentication Application", "")
++app_authenticate:value("yes", "Load")
++app_authenticate:value("no", "Do Not Load")
++app_authenticate:value("auto", "Load as Required")
++app_authenticate.rmempty = true
++
++app_cdr = module:option(ListValue, "app_cdr", "Make sure asterisk doesnt save CDR", "")
++app_cdr:value("yes", "Load")
++app_cdr:value("no", "Do Not Load")
++app_cdr:value("auto", "Load as Required")
++app_cdr.rmempty = true
++
++app_chanisavail = module:option(ListValue, "app_chanisavail", "Check if channel is available", "")
++app_chanisavail:value("yes", "Load")
++app_chanisavail:value("no", "Do Not Load")
++app_chanisavail:value("auto", "Load as Required")
++app_chanisavail.rmempty = true
++
++app_chanspy = module:option(ListValue, "app_chanspy", "Listen in on any channel", "")
++app_chanspy:value("yes", "Load")
++app_chanspy:value("no", "Do Not Load")
++app_chanspy:value("auto", "Load as Required")
++app_chanspy.rmempty = true
++
++app_controlplayback = module:option(ListValue, "app_controlplayback", "Control Playback Application", "")
++app_controlplayback:value("yes", "Load")
++app_controlplayback:value("no", "Do Not Load")
++app_controlplayback:value("auto", "Load as Required")
++app_controlplayback.rmempty = true
++
++app_cut = module:option(ListValue, "app_cut", "Cuts up variables", "")
++app_cut:value("yes", "Load")
++app_cut:value("no", "Do Not Load")
++app_cut:value("auto", "Load as Required")
++app_cut.rmempty = true
++
++app_db = module:option(ListValue, "app_db", "Database access functions", "")
++app_db:value("yes", "Load")
++app_db:value("no", "Do Not Load")
++app_db:value("auto", "Load as Required")
++app_db.rmempty = true
++
++app_dial = module:option(ListValue, "app_dial", "Dialing Application", "")
++app_dial:value("yes", "Load")
++app_dial:value("no", "Do Not Load")
++app_dial:value("auto", "Load as Required")
++app_dial.rmempty = true
++
++app_dictate = module:option(ListValue, "app_dictate", "Virtual Dictation Machine Application", "")
++app_dictate:value("yes", "Load")
++app_dictate:value("no", "Do Not Load")
++app_dictate:value("auto", "Load as Required")
++app_dictate.rmempty = true
++
++app_directed_pickup = module:option(ListValue, "app_directed_pickup", "Directed Call Pickup Support", "")
++app_directed_pickup:value("yes", "Load")
++app_directed_pickup:value("no", "Do Not Load")
++app_directed_pickup:value("auto", "Load as Required")
++app_directed_pickup.rmempty = true
++
++app_directory = module:option(ListValue, "app_directory", "Extension Directory", "")
++app_directory:value("yes", "Load")
++app_directory:value("no", "Do Not Load")
++app_directory:value("auto", "Load as Required")
++app_directory.rmempty = true
++
++app_disa = module:option(ListValue, "app_disa", "DISA (Direct Inward System Access) Application", "")
++app_disa:value("yes", "Load")
++app_disa:value("no", "Do Not Load")
++app_disa:value("auto", "Load as Required")
++app_disa.rmempty = true
++
++app_dumpchan = module:option(ListValue, "app_dumpchan", "Dump channel variables Application", "")
++app_dumpchan:value("yes", "Load")
++app_dumpchan:value("no", "Do Not Load")
++app_dumpchan:value("auto", "Load as Required")
++app_dumpchan.rmempty = true
++
++app_echo = module:option(ListValue, "app_echo", "Simple Echo Application", "")
++app_echo:value("yes", "Load")
++app_echo:value("no", "Do Not Load")
++app_echo:value("auto", "Load as Required")
++app_echo.rmempty = true
++
++app_enumlookup = module:option(ListValue, "app_enumlookup", "ENUM Lookup", "")
++app_enumlookup:value("yes", "Load")
++app_enumlookup:value("no", "Do Not Load")
++app_enumlookup:value("auto", "Load as Required")
++app_enumlookup.rmempty = true
++
++app_eval = module:option(ListValue, "app_eval", "Reevaluates strings", "")
++app_eval:value("yes", "Load")
++app_eval:value("no", "Do Not Load")
++app_eval:value("auto", "Load as Required")
++app_eval.rmempty = true
++
++app_exec = module:option(ListValue, "app_exec", "Executes applications", "")
++app_exec:value("yes", "Load")
++app_exec:value("no", "Do Not Load")
++app_exec:value("auto", "Load as Required")
++app_exec.rmempty = true
++
++app_externalivr = module:option(ListValue, "app_externalivr", "External IVR application interface", "")
++app_externalivr:value("yes", "Load")
++app_externalivr:value("no", "Do Not Load")
++app_externalivr:value("auto", "Load as Required")
++app_externalivr.rmempty = true
++
++app_forkcdr = module:option(ListValue, "app_forkcdr", "Fork The CDR into 2 seperate entities", "")
++app_forkcdr:value("yes", "Load")
++app_forkcdr:value("no", "Do Not Load")
++app_forkcdr:value("auto", "Load as Required")
++app_forkcdr.rmempty = true
++
++app_getcpeid = module:option(ListValue, "app_getcpeid", "Get ADSI CPE ID", "")
++app_getcpeid:value("yes", "Load")
++app_getcpeid:value("no", "Do Not Load")
++app_getcpeid:value("auto", "Load as Required")
++app_getcpeid.rmempty = true
++
++app_groupcount = module:option(ListValue, "app_groupcount", "Group Management Routines", "")
++app_groupcount:value("yes", "Load")
++app_groupcount:value("no", "Do Not Load")
++app_groupcount:value("auto", "Load as Required")
++app_groupcount.rmempty = true
++
++app_ices = module:option(ListValue, "app_ices", "Encode and Stream via icecast and ices", "")
++app_ices:value("yes", "Load")
++app_ices:value("no", "Do Not Load")
++app_ices:value("auto", "Load as Required")
++app_ices.rmempty = true
++
++app_image = module:option(ListValue, "app_image", "Image Transmission Application", "")
++app_image:value("yes", "Load")
++app_image:value("no", "Do Not Load")
++app_image:value("auto", "Load as Required")
++app_image.rmempty = true
++
++app_lookupblacklist = module:option(ListValue, "app_lookupblacklist", "Look up Caller*ID name/number from black", "")
++app_lookupblacklist:value("yes", "Load")
++app_lookupblacklist:value("no", "Do Not Load")
++app_lookupblacklist:value("auto", "Load as Required")
++app_lookupblacklist.rmempty = true
++
++app_lookupcidname = module:option(ListValue, "app_lookupcidname", "Look up CallerID Name from local databas", "")
++app_lookupcidname:value("yes", "Load")
++app_lookupcidname:value("no", "Do Not Load")
++app_lookupcidname:value("auto", "Load as Required")
++app_lookupcidname.rmempty = true
++
++app_macro = module:option(ListValue, "app_macro", "Extension Macros", "")
++app_macro:value("yes", "Load")
++app_macro:value("no", "Do Not Load")
++app_macro:value("auto", "Load as Required")
++app_macro.rmempty = true
++
++app_math = module:option(ListValue, "app_math", "A simple math Application", "")
++app_math:value("yes", "Load")
++app_math:value("no", "Do Not Load")
++app_math:value("auto", "Load as Required")
++app_math.rmempty = true
++
++app_md5 = module:option(ListValue, "app_md5", "MD5 checksum Application", "")
++app_md5:value("yes", "Load")
++app_md5:value("no", "Do Not Load")
++app_md5:value("auto", "Load as Required")
++app_md5.rmempty = true
++
++app_milliwatt = module:option(ListValue, "app_milliwatt", "Digital Milliwatt (mu-law) Test Application", "")
++app_milliwatt:value("yes", "Load")
++app_milliwatt:value("no", "Do Not Load")
++app_milliwatt:value("auto", "Load as Required")
++app_milliwatt.rmempty = true
++
++app_mixmonitor = module:option(ListValue, "app_mixmonitor", "Record a call and mix the audio during the recording", "")
++app_mixmonitor:value("yes", "Load")
++app_mixmonitor:value("no", "Do Not Load")
++app_mixmonitor:value("auto", "Load as Required")
++app_mixmonitor.rmempty = true
++
++app_parkandannounce = module:option(ListValue, "app_parkandannounce", "Call Parking and Announce Application", "")
++app_parkandannounce:value("yes", "Load")
++app_parkandannounce:value("no", "Do Not Load")
++app_parkandannounce:value("auto", "Load as Required")
++app_parkandannounce.rmempty = true
++
++app_playback = module:option(ListValue, "app_playback", "Trivial Playback Application", "")
++app_playback:value("yes", "Load")
++app_playback:value("no", "Do Not Load")
++app_playback:value("auto", "Load as Required")
++app_playback.rmempty = true
++
++app_privacy = module:option(ListValue, "app_privacy", "Require phone number to be entered", "")
++app_privacy:value("yes", "Load")
++app_privacy:value("no", "Do Not Load")
++app_privacy:value("auto", "Load as Required")
++app_privacy.rmempty = true
++
++app_queue = module:option(ListValue, "app_queue", "True Call Queueing", "")
++app_queue:value("yes", "Load")
++app_queue:value("no", "Do Not Load")
++app_queue:value("auto", "Load as Required")
++app_queue.rmempty = true
++
++app_random = module:option(ListValue, "app_random", "Random goto", "")
++app_random:value("yes", "Load")
++app_random:value("no", "Do Not Load")
++app_random:value("auto", "Load as Required")
++app_random.rmempty = true
++
++app_read = module:option(ListValue, "app_read", "Read Variable Application", "")
++app_read:value("yes", "Load")
++app_read:value("no", "Do Not Load")
++app_read:value("auto", "Load as Required")
++app_read.rmempty = true
++
++app_readfile = module:option(ListValue, "app_readfile", "Read in a file", "")
++app_readfile:value("yes", "Load")
++app_readfile:value("no", "Do Not Load")
++app_readfile:value("auto", "Load as Required")
++app_readfile.rmempty = true
++
++app_realtime = module:option(ListValue, "app_realtime", "Realtime Data Lookup/Rewrite", "")
++app_realtime:value("yes", "Load")
++app_realtime:value("no", "Do Not Load")
++app_realtime:value("auto", "Load as Required")
++app_realtime.rmempty = true
++
++app_record = module:option(ListValue, "app_record", "Trivial Record Application", "")
++app_record:value("yes", "Load")
++app_record:value("no", "Do Not Load")
++app_record:value("auto", "Load as Required")
++app_record.rmempty = true
++
++app_sayunixtime = module:option(ListValue, "app_sayunixtime", "Say time", "")
++app_sayunixtime:value("yes", "Load")
++app_sayunixtime:value("no", "Do Not Load")
++app_sayunixtime:value("auto", "Load as Required")
++app_sayunixtime.rmempty = true
++
++app_senddtmf = module:option(ListValue, "app_senddtmf", "Send DTMF digits Application", "")
++app_senddtmf:value("yes", "Load")
++app_senddtmf:value("no", "Do Not Load")
++app_senddtmf:value("auto", "Load as Required")
++app_senddtmf.rmempty = true
++
++app_sendtext = module:option(ListValue, "app_sendtext", "Send Text Applications", "")
++app_sendtext:value("yes", "Load")
++app_sendtext:value("no", "Do Not Load")
++app_sendtext:value("auto", "Load as Required")
++app_sendtext.rmempty = true
++
++app_setcallerid = module:option(ListValue, "app_setcallerid", "Set CallerID Application", "")
++app_setcallerid:value("yes", "Load")
++app_setcallerid:value("no", "Do Not Load")
++app_setcallerid:value("auto", "Load as Required")
++app_setcallerid.rmempty = true
++
++app_setcdruserfield = module:option(ListValue, "app_setcdruserfield", "CDR user field apps", "")
++app_setcdruserfield:value("yes", "Load")
++app_setcdruserfield:value("no", "Do Not Load")
++app_setcdruserfield:value("auto", "Load as Required")
++app_setcdruserfield.rmempty = true
++
++app_setcidname = module:option(ListValue, "app_setcidname", "load => .so ; Set CallerID Name", "")
++app_setcidname:value("yes", "Load")
++app_setcidname:value("no", "Do Not Load")
++app_setcidname:value("auto", "Load as Required")
++app_setcidname.rmempty = true
++
++app_setcidnum = module:option(ListValue, "app_setcidnum", "load => .so ; Set CallerID Number", "")
++app_setcidnum:value("yes", "Load")
++app_setcidnum:value("no", "Do Not Load")
++app_setcidnum:value("auto", "Load as Required")
++app_setcidnum.rmempty = true
++
++app_setrdnis = module:option(ListValue, "app_setrdnis", "Set RDNIS Number", "")
++app_setrdnis:value("yes", "Load")
++app_setrdnis:value("no", "Do Not Load")
++app_setrdnis:value("auto", "Load as Required")
++app_setrdnis.rmempty = true
++
++app_settransfercapability = module:option(ListValue, "app_settransfercapability", "Set ISDN Transfer Capability", "")
++app_settransfercapability:value("yes", "Load")
++app_settransfercapability:value("no", "Do Not Load")
++app_settransfercapability:value("auto", "Load as Required")
++app_settransfercapability.rmempty = true
++
++app_sms = module:option(ListValue, "app_sms", "SMS/PSTN handler", "")
++app_sms:value("yes", "Load")
++app_sms:value("no", "Do Not Load")
++app_sms:value("auto", "Load as Required")
++app_sms.rmempty = true
++
++app_softhangup = module:option(ListValue, "app_softhangup", "Hangs up the requested channel", "")
++app_softhangup:value("yes", "Load")
++app_softhangup:value("no", "Do Not Load")
++app_softhangup:value("auto", "Load as Required")
++app_softhangup.rmempty = true
++
++app_stack = module:option(ListValue, "app_stack", "Stack Routines", "")
++app_stack:value("yes", "Load")
++app_stack:value("no", "Do Not Load")
++app_stack:value("auto", "Load as Required")
++app_stack.rmempty = true
++
++app_system = module:option(ListValue, "app_system", "Generic System() application", "")
++app_system:value("yes", "Load")
++app_system:value("no", "Do Not Load")
++app_system:value("auto", "Load as Required")
++app_system.rmempty = true
++
++app_talkdetect = module:option(ListValue, "app_talkdetect", "Playback with Talk Detection", "")
++app_talkdetect:value("yes", "Load")
++app_talkdetect:value("no", "Do Not Load")
++app_talkdetect:value("auto", "Load as Required")
++app_talkdetect.rmempty = true
++
++app_test = module:option(ListValue, "app_test", "Interface Test Application", "")
++app_test:value("yes", "Load")
++app_test:value("no", "Do Not Load")
++app_test:value("auto", "Load as Required")
++app_test.rmempty = true
++
++app_transfer = module:option(ListValue, "app_transfer", "Transfer", "")
++app_transfer:value("yes", "Load")
++app_transfer:value("no", "Do Not Load")
++app_transfer:value("auto", "Load as Required")
++app_transfer.rmempty = true
++
++app_txtcidname = module:option(ListValue, "app_txtcidname", "TXTCIDName", "")
++app_txtcidname:value("yes", "Load")
++app_txtcidname:value("no", "Do Not Load")
++app_txtcidname:value("auto", "Load as Required")
++app_txtcidname.rmempty = true
++
++app_url = module:option(ListValue, "app_url", "Send URL Applications", "")
++app_url:value("yes", "Load")
++app_url:value("no", "Do Not Load")
++app_url:value("auto", "Load as Required")
++app_url.rmempty = true
++
++app_userevent = module:option(ListValue, "app_userevent", "Custom User Event Application", "")
++app_userevent:value("yes", "Load")
++app_userevent:value("no", "Do Not Load")
++app_userevent:value("auto", "Load as Required")
++app_userevent.rmempty = true
++
++app_verbose = module:option(ListValue, "app_verbose", "Send verbose output", "")
++app_verbose:value("yes", "Load")
++app_verbose:value("no", "Do Not Load")
++app_verbose:value("auto", "Load as Required")
++app_verbose.rmempty = true
++
++app_voicemail = module:option(ListValue, "app_voicemail", "Voicemail", "")
++app_voicemail:value("yes", "Load")
++app_voicemail:value("no", "Do Not Load")
++app_voicemail:value("auto", "Load as Required")
++app_voicemail.rmempty = true
++
++app_waitforring = module:option(ListValue, "app_waitforring", "Waits until first ring after time", "")
++app_waitforring:value("yes", "Load")
++app_waitforring:value("no", "Do Not Load")
++app_waitforring:value("auto", "Load as Required")
++app_waitforring.rmempty = true
++
++app_waitforsilence = module:option(ListValue, "app_waitforsilence", "Wait For Silence Application", "")
++app_waitforsilence:value("yes", "Load")
++app_waitforsilence:value("no", "Do Not Load")
++app_waitforsilence:value("auto", "Load as Required")
++app_waitforsilence.rmempty = true
++
++app_while = module:option(ListValue, "app_while", "While Loops and Conditional Execution", "")
++app_while:value("yes", "Load")
++app_while:value("no", "Do Not Load")
++app_while:value("auto", "Load as Required")
++app_while.rmempty = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-cdr.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-cdr.lua
+new file mode 100644
+index 0000000..13dcba5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-cdr.lua
+@@ -0,0 +1,47 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++module = cbimap:section(TypedSection, "module", "Modules", "")
++module.anonymous = true
++
++cdr_csv = module:option(ListValue, "cdr_csv", "Comma Separated Values CDR Backend", "")
++cdr_csv:value("yes", "Load")
++cdr_csv:value("no", "Do Not Load")
++cdr_csv:value("auto", "Load as Required")
++cdr_csv.rmempty = true
++
++cdr_custom = module:option(ListValue, "cdr_custom", "Customizable Comma Separated Values CDR Backend", "")
++cdr_custom:value("yes", "Load")
++cdr_custom:value("no", "Do Not Load")
++cdr_custom:value("auto", "Load as Required")
++cdr_custom.rmempty = true
++
++cdr_manager = module:option(ListValue, "cdr_manager", "Asterisk Call Manager CDR Backend", "")
++cdr_manager:value("yes", "Load")
++cdr_manager:value("no", "Do Not Load")
++cdr_manager:value("auto", "Load as Required")
++cdr_manager.rmempty = true
++
++cdr_mysql = module:option(ListValue, "cdr_mysql", "MySQL CDR Backend", "")
++cdr_mysql:value("yes", "Load")
++cdr_mysql:value("no", "Do Not Load")
++cdr_mysql:value("auto", "Load as Required")
++cdr_mysql.rmempty = true
++
++cdr_pgsql = module:option(ListValue, "cdr_pgsql", "PostgreSQL CDR Backend", "")
++cdr_pgsql:value("yes", "Load")
++cdr_pgsql:value("no", "Do Not Load")
++cdr_pgsql:value("auto", "Load as Required")
++cdr_pgsql.rmempty = true
++
++cdr_sqlite = module:option(ListValue, "cdr_sqlite", "SQLite CDR Backend", "")
++cdr_sqlite:value("yes", "Load")
++cdr_sqlite:value("no", "Do Not Load")
++cdr_sqlite:value("auto", "Load as Required")
++cdr_sqlite.rmempty = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-chan.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-chan.lua
+new file mode 100644
+index 0000000..425569d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-chan.lua
+@@ -0,0 +1,45 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++
++module = cbimap:section(TypedSection, "module", "Modules", "")
++module.anonymous = true
++
++chan_agent = module:option(ListValue, "chan_agent", "Agent Proxy Channel", "")
++chan_agent:value("yes", "Load")
++chan_agent:value("no", "Do Not Load")
++chan_agent:value("auto", "Load as Required")
++chan_agent.rmempty = true
++
++chan_alsa = module:option(ListValue, "chan_alsa", "Channel driver for GTalk", "")
++chan_alsa:value("yes", "Load")
++chan_alsa:value("no", "Do Not Load")
++chan_alsa:value("auto", "Load as Required")
++chan_alsa.rmempty = true
++
++chan_gtalk = module:option(ListValue, "chan_gtalk", "Channel driver for GTalk", "")
++chan_gtalk:value("yes", "Load")
++chan_gtalk:value("no", "Do Not Load")
++chan_gtalk:value("auto", "Load as Required")
++chan_gtalk.rmempty = true
++
++chan_iax2 = module:option(Flag, "chan_iax2", "Option chan_iax2", "")
++chan_iax2.rmempty = true
++
++chan_local = module:option(ListValue, "chan_local", "Local Proxy Channel", "")
++chan_local:value("yes", "Load")
++chan_local:value("no", "Do Not Load")
++chan_local:value("auto", "Load as Required")
++chan_local.rmempty = true
++
++chan_sip = module:option(ListValue, "chan_sip", "Session Initiation Protocol (SIP)", "")
++chan_sip:value("yes", "Load")
++chan_sip:value("no", "Do Not Load")
++chan_sip:value("auto", "Load as Required")
++chan_sip.rmempty = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-codec.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-codec.lua
+new file mode 100644
+index 0000000..0893c0e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-codec.lua
+@@ -0,0 +1,53 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++module = cbimap:section(TypedSection, "module", "Modules", "")
++module.anonymous = true
++
++codec_a_mu = module:option(ListValue, "codec_a_mu", "A-law and Mulaw direct Coder/Decoder", "")
++codec_a_mu:value("yes", "Load")
++codec_a_mu:value("no", "Do Not Load")
++codec_a_mu:value("auto", "Load as Required")
++codec_a_mu.rmempty = true
++
++codec_adpcm = module:option(ListValue, "codec_adpcm", "Adaptive Differential PCM Coder/Decoder", "")
++codec_adpcm:value("yes", "Load")
++codec_adpcm:value("no", "Do Not Load")
++codec_adpcm:value("auto", "Load as Required")
++codec_adpcm.rmempty = true
++
++codec_alaw = module:option(ListValue, "codec_alaw", "A-law Coder/Decoder", "")
++codec_alaw:value("yes", "Load")
++codec_alaw:value("no", "Do Not Load")
++codec_alaw:value("auto", "Load as Required")
++codec_alaw.rmempty = true
++
++codec_g726 = module:option(ListValue, "codec_g726", "ITU G.726-32kbps G726 Transcoder", "")
++codec_g726:value("yes", "Load")
++codec_g726:value("no", "Do Not Load")
++codec_g726:value("auto", "Load as Required")
++codec_g726.rmempty = true
++
++codec_gsm = module:option(ListValue, "codec_gsm", "GSM/PCM16 (signed linear) Codec Translation", "")
++codec_gsm:value("yes", "Load")
++codec_gsm:value("no", "Do Not Load")
++codec_gsm:value("auto", "Load as Required")
++codec_gsm.rmempty = true
++
++codec_speex = module:option(ListValue, "codec_speex", "Speex/PCM16 (signed linear) Codec Translator", "")
++codec_speex:value("yes", "Load")
++codec_speex:value("no", "Do Not Load")
++codec_speex:value("auto", "Load as Required")
++codec_speex.rmempty = true
++
++codec_ulaw = module:option(ListValue, "codec_ulaw", "Mu-law Coder/Decoder", "")
++codec_ulaw:value("yes", "Load")
++codec_ulaw:value("no", "Do Not Load")
++codec_ulaw:value("auto", "Load as Required")
++codec_ulaw.rmempty = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-format.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-format.lua
+new file mode 100644
+index 0000000..9b59d94
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-format.lua
+@@ -0,0 +1,89 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++module = cbimap:section(TypedSection, "module", "Modules", "")
++module.anonymous = true
++
++format_au = module:option(ListValue, "format_au", "Sun Microsystems AU format (signed linear)", "")
++format_au:value("yes", "Load")
++format_au:value("no", "Do Not Load")
++format_au:value("auto", "Load as Required")
++format_au.rmempty = true
++
++format_g723 = module:option(ListValue, "format_g723", "G.723.1 Simple Timestamp File Format", "")
++format_g723:value("yes", "Load")
++format_g723:value("no", "Do Not Load")
++format_g723:value("auto", "Load as Required")
++format_g723.rmempty = true
++
++format_g726 = module:option(ListValue, "format_g726", "Raw G.726 (16/24/32/40kbps) data", "")
++format_g726:value("yes", "Load")
++format_g726:value("no", "Do Not Load")
++format_g726:value("auto", "Load as Required")
++format_g726.rmempty = true
++
++format_g729 = module:option(ListValue, "format_g729", "Raw G729 data", "")
++format_g729:value("yes", "Load")
++format_g729:value("no", "Do Not Load")
++format_g729:value("auto", "Load as Required")
++format_g729.rmempty = true
++
++format_gsm = module:option(ListValue, "format_gsm", "Raw GSM data", "")
++format_gsm:value("yes", "Load")
++format_gsm:value("no", "Do Not Load")
++format_gsm:value("auto", "Load as Required")
++format_gsm.rmempty = true
++
++format_h263 = module:option(ListValue, "format_h263", "Raw h263 data", "")
++format_h263:value("yes", "Load")
++format_h263:value("no", "Do Not Load")
++format_h263:value("auto", "Load as Required")
++format_h263.rmempty = true
++
++format_jpeg = module:option(ListValue, "format_jpeg", "JPEG (Joint Picture Experts Group) Image", "")
++format_jpeg:value("yes", "Load")
++format_jpeg:value("no", "Do Not Load")
++format_jpeg:value("auto", "Load as Required")
++format_jpeg.rmempty = true
++
++format_pcm = module:option(ListValue, "format_pcm", "Raw uLaw 8khz Audio support (PCM)", "")
++format_pcm:value("yes", "Load")
++format_pcm:value("no", "Do Not Load")
++format_pcm:value("auto", "Load as Required")
++format_pcm.rmempty = true
++
++format_pcm_alaw = module:option(ListValue, "format_pcm_alaw", "load => .so ; Raw aLaw 8khz PCM Audio support", "")
++format_pcm_alaw:value("yes", "Load")
++format_pcm_alaw:value("no", "Do Not Load")
++format_pcm_alaw:value("auto", "Load as Required")
++format_pcm_alaw.rmempty = true
++
++format_sln = module:option(ListValue, "format_sln", "Raw Signed Linear Audio support (SLN)", "")
++format_sln:value("yes", "Load")
++format_sln:value("no", "Do Not Load")
++format_sln:value("auto", "Load as Required")
++format_sln.rmempty = true
++
++format_vox = module:option(ListValue, "format_vox", "Dialogic VOX (ADPCM) File Format", "")
++format_vox:value("yes", "Load")
++format_vox:value("no", "Do Not Load")
++format_vox:value("auto", "Load as Required")
++format_vox.rmempty = true
++
++format_wav = module:option(ListValue, "format_wav", "Microsoft WAV format (8000hz Signed Line", "")
++format_wav:value("yes", "Load")
++format_wav:value("no", "Do Not Load")
++format_wav:value("auto", "Load as Required")
++format_wav.rmempty = true
++
++format_wav_gsm = module:option(ListValue, "format_wav_gsm", "Microsoft WAV format (Proprietary GSM)", "")
++format_wav_gsm:value("yes", "Load")
++format_wav_gsm:value("no", "Do Not Load")
++format_wav_gsm:value("auto", "Load as Required")
++format_wav_gsm.rmempty = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-func.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-func.lua
+new file mode 100644
+index 0000000..04eb974
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-func.lua
+@@ -0,0 +1,29 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++module = cbimap:section(TypedSection, "module", "Modules", "")
++module.anonymous = true
++
++func_callerid = module:option(ListValue, "func_callerid", "Caller ID related dialplan functions", "")
++func_callerid:value("yes", "Load")
++func_callerid:value("no", "Do Not Load")
++func_callerid:value("auto", "Load as Required")
++func_callerid.rmempty = true
++
++func_enum = module:option(ListValue, "func_enum", "ENUM Functions", "")
++func_enum:value("yes", "Load")
++func_enum:value("no", "Do Not Load")
++func_enum:value("auto", "Load as Required")
++func_enum.rmempty = true
++
++func_uri = module:option(ListValue, "func_uri", "URI encoding / decoding functions", "")
++func_uri:value("yes", "Load")
++func_uri:value("no", "Do Not Load")
++func_uri:value("auto", "Load as Required")
++func_uri.rmempty = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-pbx.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-pbx.lua
+new file mode 100644
+index 0000000..cca4f34
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-pbx.lua
+@@ -0,0 +1,53 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++module = cbimap:section(TypedSection, "module", "Modules", "")
++module.anonymous = true
++
++pbx_ael = module:option(ListValue, "pbx_ael", "Asterisk Extension Language Compiler", "")
++pbx_ael:value("yes", "Load")
++pbx_ael:value("no", "Do Not Load")
++pbx_ael:value("auto", "Load as Required")
++pbx_ael.rmempty = true
++
++pbx_config = module:option(ListValue, "pbx_config", "Text Extension Configuration", "")
++pbx_config:value("yes", "Load")
++pbx_config:value("no", "Do Not Load")
++pbx_config:value("auto", "Load as Required")
++pbx_config.rmempty = true
++
++pbx_functions = module:option(ListValue, "pbx_functions", "load => .so ; Builtin dialplan functions", "")
++pbx_functions:value("yes", "Load")
++pbx_functions:value("no", "Do Not Load")
++pbx_functions:value("auto", "Load as Required")
++pbx_functions.rmempty = true
++
++pbx_loopback = module:option(ListValue, "pbx_loopback", "Loopback Switch", "")
++pbx_loopback:value("yes", "Load")
++pbx_loopback:value("no", "Do Not Load")
++pbx_loopback:value("auto", "Load as Required")
++pbx_loopback.rmempty = true
++
++pbx_realtime = module:option(ListValue, "pbx_realtime", "Realtime Switch", "")
++pbx_realtime:value("yes", "Load")
++pbx_realtime:value("no", "Do Not Load")
++pbx_realtime:value("auto", "Load as Required")
++pbx_realtime.rmempty = true
++
++pbx_spool = module:option(ListValue, "pbx_spool", "Outgoing Spool Support", "")
++pbx_spool:value("yes", "Load")
++pbx_spool:value("no", "Do Not Load")
++pbx_spool:value("auto", "Load as Required")
++pbx_spool.rmempty = true
++
++pbx_wilcalu = module:option(ListValue, "pbx_wilcalu", "Wil Cal U (Auto Dialer)", "")
++pbx_wilcalu:value("yes", "Load")
++pbx_wilcalu:value("no", "Do Not Load")
++pbx_wilcalu:value("auto", "Load as Required")
++pbx_wilcalu.rmempty = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res-feature.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res-feature.lua
+new file mode 100644
+index 0000000..783aab2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res-feature.lua
+@@ -0,0 +1,100 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++featuremap = cbimap:section(TypedSection, "featuremap", "Feature Key maps", "")
++featuremap.anonymous = true
++featuremap.addremove = true
++
++atxfer = featuremap:option(Value, "atxfer", "Attended transfer key", "")
++atxfer.rmempty = true
++
++blindxfer = featuremap:option(Value, "blindxfer", "Blind transfer key", "")
++blindxfer.rmempty = true
++
++disconnect = featuremap:option(Value, "disconnect", "Key to Disconnect call", "")
++disconnect.rmempty = true
++
++parkcall = featuremap:option(Value, "parkcall", "Key to Park call", "")
++parkcall.rmempty = true
++
++
++featurepark = cbimap:section(TypedSection, "featurepark", "Parking Feature", "")
++featurepark.anonymous = true
++
++parkenabled = featurepark:option(Flag, "parkenabled", "Enable Parking", "")
++
++adsipark = featurepark:option(Flag, "adsipark", "ADSI Park", "")
++adsipark.rmempty = true
++adsipark:depends({ parkenabled = "1" })
++
++atxfernoanswertimeout = featurepark:option(Value, "atxfernoanswertimeout", "Attended transfer timeout (sec)", "")
++atxfernoanswertimeout.rmempty = true
++atxfernoanswertimeout:depends({ parkenabled = "1" })
++
++automon = featurepark:option(Value, "automon", "One touch record key", "")
++automon.rmempty = true
++automon:depends({ parkenabled = "1" })
++
++context = featurepark:option(Value, "context", "Name of call context for parking", "")
++context.rmempty = true
++context:depends({ parkenabled = "1" })
++
++courtesytone = featurepark:option(Value, "courtesytone", "Sound file to play to parked caller", "")
++courtesytone.rmempty = true
++courtesytone:depends({ parkenabled = "1" })
++
++featuredigittimeout = featurepark:option(Value, "featuredigittimeout", "Max time (ms) between digits for feature activation", "")
++featuredigittimeout.rmempty = true
++featuredigittimeout:depends({ parkenabled = "1" })
++
++findslot = featurepark:option(ListValue, "findslot", "Method to Find Parking slot", "")
++findslot:value("first", "First available slot")
++findslot:value("next", "Next free parking space")
++findslot.rmempty = true
++findslot:depends({ parkenabled = "1" })
++
++parkedmusicclass = featurepark:option(ListValue, "parkedmusicclass", "Music on Hold class for the parked channel", "")
++parkedmusicclass.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk" )
++parkedmusicclass:depends({ parkenabled = "1" })
++cbimap.uci:foreach( "asterisk", "moh", function(s) parkedmusicclass:value(s['.name']) end )
++
++parkedplay = featurepark:option(ListValue, "parkedplay", "Play courtesy tone to", "")
++parkedplay:value("caller", "Caller")
++parkedplay:value("parked", "Parked user")
++parkedplay:value("both", "Both")
++parkedplay.rmempty = true
++parkedplay:depends({ parkenabled = "1" })
++
++parkext = featurepark:option(Value, "parkext", "Extension to dial to park", "")
++parkext.rmempty = true
++parkext:depends({ parkenabled = "1" })
++
++parkingtime = featurepark:option(Value, "parkingtime", "Parking time (secs)", "")
++parkingtime.rmempty = true
++parkingtime:depends({ parkenabled = "1" })
++
++parkpos = featurepark:option(Value, "parkpos", "Range of extensions for call parking", "")
++parkpos.rmempty = true
++parkpos:depends({ parkenabled = "1" })
++
++pickupexten = featurepark:option(Value, "pickupexten", "Pickup extension", "")
++pickupexten.rmempty = true
++pickupexten:depends({ parkenabled = "1" })
++
++transferdigittimeout = featurepark:option(Value, "transferdigittimeout", "Seconds to wait bewteen digits when transferring", "")
++transferdigittimeout.rmempty = true
++transferdigittimeout:depends({ parkenabled = "1" })
++
++xferfailsound = featurepark:option(Value, "xferfailsound", "sound when attended transfer is complete", "")
++xferfailsound.rmempty = true
++xferfailsound:depends({ parkenabled = "1" })
++
++xfersound = featurepark:option(Value, "xfersound", "Sound when attended transfer fails", "")
++xfersound.rmempty = true
++xfersound:depends({ parkenabled = "1" })
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res.lua
+new file mode 100644
+index 0000000..4bef199
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res.lua
+@@ -0,0 +1,77 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++module = cbimap:section(TypedSection, "module", "Modules", "")
++module.anonymous = true
++
++res_config_mysql = module:option(ListValue, "res_config_mysql", "MySQL Config Resource", "")
++res_config_mysql:value("yes", "Load")
++res_config_mysql:value("no", "Do Not Load")
++res_config_mysql:value("auto", "Load as Required")
++res_config_mysql.rmempty = true
++
++res_config_odbc = module:option(ListValue, "res_config_odbc", "ODBC Config Resource", "")
++res_config_odbc:value("yes", "Load")
++res_config_odbc:value("no", "Do Not Load")
++res_config_odbc:value("auto", "Load as Required")
++res_config_odbc.rmempty = true
++
++res_config_pgsql = module:option(ListValue, "res_config_pgsql", "PGSQL Module", "")
++res_config_pgsql:value("yes", "Load")
++res_config_pgsql:value("no", "Do Not Load")
++res_config_pgsql:value("auto", "Load as Required")
++res_config_pgsql.rmempty = true
++
++res_crypto = module:option(ListValue, "res_crypto", "Cryptographic Digital Signatures", "")
++res_crypto:value("yes", "Load")
++res_crypto:value("no", "Do Not Load")
++res_crypto:value("auto", "Load as Required")
++res_crypto.rmempty = true
++
++res_features = module:option(ListValue, "res_features", "Call Parking Resource", "")
++res_features:value("yes", "Load")
++res_features:value("no", "Do Not Load")
++res_features:value("auto", "Load as Required")
++res_features.rmempty = true
++
++res_indications = module:option(ListValue, "res_indications", "Indications Configuration", "")
++res_indications:value("yes", "Load")
++res_indications:value("no", "Do Not Load")
++res_indications:value("auto", "Load as Required")
++res_indications.rmempty = true
++
++res_monitor = module:option(ListValue, "res_monitor", "Call Monitoring Resource", "")
++res_monitor:value("yes", "Load")
++res_monitor:value("no", "Do Not Load")
++res_monitor:value("auto", "Load as Required")
++res_monitor.rmempty = true
++
++res_musiconhold = module:option(ListValue, "res_musiconhold", "Music On Hold Resource", "")
++res_musiconhold:value("yes", "Load")
++res_musiconhold:value("no", "Do Not Load")
++res_musiconhold:value("auto", "Load as Required")
++res_musiconhold.rmempty = true
++
++res_odbc = module:option(ListValue, "res_odbc", "ODBC Resource", "")
++res_odbc:value("yes", "Load")
++res_odbc:value("no", "Do Not Load")
++res_odbc:value("auto", "Load as Required")
++res_odbc.rmempty = true
++
++res_smdi = module:option(ListValue, "res_smdi", "SMDI Module", "")
++res_smdi:value("yes", "Load")
++res_smdi:value("no", "Do Not Load")
++res_smdi:value("auto", "Load as Required")
++res_smdi.rmempty = true
++
++res_snmp = module:option(ListValue, "res_snmp", "SNMP Module", "")
++res_snmp:value("yes", "Load")
++res_snmp:value("no", "Do Not Load")
++res_snmp:value("auto", "Load as Required")
++res_snmp.rmempty = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-sip-connections.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-sip-connections.lua
+new file mode 100644
+index 0000000..a095ec3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-sip-connections.lua
+@@ -0,0 +1,98 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++sip = cbimap:section(TypedSection, "sip", "SIP Connection", "")
++sip.addremove = true
++
++alwaysinternational = sip:option(Flag, "alwaysinternational", "Always Dial International", "")
++alwaysinternational.optional = true
++
++canreinvite = sip:option(ListValue, "canreinvite", "Reinvite/redirect media connections", "")
++canreinvite:value("yes", "Yes")
++canreinvite:value("nonat", "Yes when not behind NAT")
++canreinvite:value("update", "Use UPDATE rather than INVITE for path redirection")
++canreinvite:value("no", "No")
++canreinvite.optional = true
++
++context = sip:option(ListValue, "context", "Context to use", "")
++context.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "dialplans" )
++cbimap.uci:foreach( "asterisk", "dialplan", function(s) context:value(s['.name']) end )
++cbimap.uci:foreach( "asterisk", "dialzone", function(s) context:value(s['.name']) end )
++
++countrycode = sip:option(Value, "countrycode", "Country Code for connection", "")
++countrycode.optional = true
++
++dtmfmode = sip:option(ListValue, "dtmfmode", "DTMF mode", "")
++dtmfmode:value("info", "Use RFC2833 or INFO for the BudgeTone")
++dtmfmode:value("rfc2833", "Use RFC2833 for the BudgeTone")
++dtmfmode:value("inband", "Use Inband (only with ulaw/alaw)")
++dtmfmode.optional = true
++
++extension = sip:option(Value, "extension", "Add as Extension", "")
++extension.optional = true
++
++fromdomain = sip:option(Value, "fromdomain", "Primary domain identity for From: headers", "")
++fromdomain.optional = true
++
++fromuser = sip:option(Value, "fromuser", "From user (required by many SIP providers)", "")
++fromuser.optional = true
++
++host = sip:option(Value, "host", "Host name (or blank)", "")
++host.optional = true
++
++incoming = sip:option(DynamicList, "incoming", "Ring on incoming dialplan contexts", "")
++incoming.optional = true
++
++insecure = sip:option(ListValue, "insecure", "Allow Insecure for", "")
++insecure:value("port", "Allow mismatched port number")
++insecure:value("invite", "Do not require auth of incoming INVITE")
++insecure:value("port,invite", "Allow mismatched port and Do not require auth of incoming INVITE")
++insecure.optional = true
++
++internationalprefix = sip:option(Value, "internationalprefix", "International Dial Prefix", "")
++internationalprefix.optional = true
++
++mailbox = sip:option(Value, "mailbox", "Mailbox for MWI", "")
++mailbox.optional = true
++
++nat = sip:option(Flag, "nat", "NAT between phone and Asterisk", "")
++nat.optional = true
++
++pedantic = sip:option(Flag, "pedantic", "Check tags in headers", "")
++pedantic.optional = true
++
++port = sip:option(Value, "port", "SIP Port", "")
++port.optional = true
++
++prefix = sip:option(Value, "prefix", "Dial Prefix (for external line)", "")
++prefix.optional = true
++
++qualify = sip:option(Value, "qualify", "Reply Timeout (ms) for down connection", "")
++qualify.optional = true
++
++register = sip:option(Flag, "register", "Register connection", "")
++register.optional = true
++
++secret = sip:option(Value, "secret", "Secret", "")
++secret.optional = true
++
++selfmailbox = sip:option(Flag, "selfmailbox", "Dial own extension for mailbox", "")
++selfmailbox.optional = true
++
++timeout = sip:option(Value, "timeout", "Dial Timeout (sec)", "")
++timeout.optional = true
++
++type = sip:option(ListValue, "type", "Client Type", "")
++type:value("friend", "Friend (outbound/inbound)")
++type:value("user", "User (inbound - authenticate by \"from\")")
++type:value("peer", "Peer (outbound - match by host)")
++type.optional = true
++
++username = sip:option(Value, "username", "Username", "")
++username.optional = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-voice.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-voice.lua
+new file mode 100644
+index 0000000..7341dfb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-voice.lua
+@@ -0,0 +1,41 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++voicegeneral = cbimap:section(TypedSection, "voicegeneral", "Voicemail general options", "")
++
++serveremail = voicegeneral:option(Value, "serveremail", "From Email address of server", "")
++
++
++voicemail = cbimap:section(TypedSection, "voicemail", "Voice Mail boxes", "")
++voicemail.addremove = true
++
++attach = voicemail:option(Flag, "attach", "Email contains attachment", "")
++attach.rmempty = true
++
++email = voicemail:option(Value, "email", "Email", "")
++email.rmempty = true
++
++name = voicemail:option(Value, "name", "Display Name", "")
++name.rmempty = true
++
++password = voicemail:option(Value, "password", "Password", "")
++password.rmempty = true
++
++zone = voicemail:option(ListValue, "zone", "Voice Zone", "")
++cbimap.uci:foreach( "asterisk", "voicezone", function(s) zone:value(s['.name']) end )
++
++
++voicezone = cbimap:section(TypedSection, "voicezone", "Voice Zone settings", "")
++voicezone.addremove = true
++
++message = voicezone:option(Value, "message", "Message Format", "")
++message.rmempty = true
++
++zone = voicezone:option(Value, "zone", "Time Zone", "")
++zone.rmempty = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk.lua
+new file mode 100644
+index 0000000..026aab4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk.lua
+@@ -0,0 +1,151 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "asterisk", "")
++
++asterisk = cbimap:section(TypedSection, "asterisk", "Asterisk General Options", "")
++asterisk.anonymous = true
++
++agidir = asterisk:option(Value, "agidir", "AGI directory", "")
++agidir.rmempty = true
++
++cache_record_files = asterisk:option(Flag, "cache_record_files", "Cache recorded sound files during recording", "")
++cache_record_files.rmempty = true
++
++debug = asterisk:option(Value, "debug", "Debug Level", "")
++debug.rmempty = true
++
++dontwarn = asterisk:option(Flag, "dontwarn", "Disable some warnings", "")
++dontwarn.rmempty = true
++
++dumpcore = asterisk:option(Flag, "dumpcore", "Dump core on crash", "")
++dumpcore.rmempty = true
++
++highpriority = asterisk:option(Flag, "highpriority", "High Priority", "")
++highpriority.rmempty = true
++
++initcrypto = asterisk:option(Flag, "initcrypto", "Initialise Crypto", "")
++initcrypto.rmempty = true
++
++internal_timing = asterisk:option(Flag, "internal_timing", "Use Internal Timing", "")
++internal_timing.rmempty = true
++
++logdir = asterisk:option(Value, "logdir", "Log directory", "")
++logdir.rmempty = true
++
++maxcalls = asterisk:option(Value, "maxcalls", "Maximum number of calls allowed", "")
++maxcalls.rmempty = true
++
++maxload = asterisk:option(Value, "maxload", "Maximum load to stop accepting new calls", "")
++maxload.rmempty = true
++
++nocolor = asterisk:option(Flag, "nocolor", "Disable console colors", "")
++nocolor.rmempty = true
++
++record_cache_dir = asterisk:option(Value, "record_cache_dir", "Sound files Cache directory", "")
++record_cache_dir.rmempty = true
++record_cache_dir:depends({ ["cache_record_files"] = "true" })
++
++rungroup = asterisk:option(Flag, "rungroup", "The Group to run as", "")
++rungroup.rmempty = true
++
++runuser = asterisk:option(Flag, "runuser", "The User to run as", "")
++runuser.rmempty = true
++
++spooldir = asterisk:option(Value, "spooldir", "Voicemail Spool directory", "")
++spooldir.rmempty = true
++
++systemname = asterisk:option(Value, "systemname", "Prefix UniquID with system name", "")
++systemname.rmempty = true
++
++transcode_via_sln = asterisk:option(Flag, "transcode_via_sln", "Build transcode paths via SLINEAR, not directly", "")
++transcode_via_sln.rmempty = true
++
++transmit_silence_during_record = asterisk:option(Flag, "transmit_silence_during_record", "Transmit SLINEAR silence while recording a channel", "")
++transmit_silence_during_record.rmempty = true
++
++verbose = asterisk:option(Value, "verbose", "Verbose Level", "")
++verbose.rmempty = true
++
++zone = asterisk:option(Value, "zone", "Time Zone", "")
++zone.rmempty = true
++
++
++hardwarereboot = cbimap:section(TypedSection, "hardwarereboot", "Reload Hardware Config", "")
++
++method = hardwarereboot:option(ListValue, "method", "Reboot Method", "")
++method:value("web", "Web URL (wget)")
++method:value("system", "program to run")
++method.rmempty = true
++
++param = hardwarereboot:option(Value, "param", "Parameter", "")
++param.rmempty = true
++
++
++iaxgeneral = cbimap:section(TypedSection, "iaxgeneral", "IAX General Options", "")
++iaxgeneral.anonymous = true
++iaxgeneral.addremove = true
++
++allow = iaxgeneral:option(MultiValue, "allow", "Allow Codecs", "")
++allow:value("alaw", "alaw")
++allow:value("gsm", "gsm")
++allow:value("g726", "g726")
++allow.rmempty = true
++
++canreinvite = iaxgeneral:option(ListValue, "canreinvite", "Reinvite/redirect media connections", "")
++canreinvite:value("yes", "Yes")
++canreinvite:value("nonat", "Yes when not behind NAT")
++canreinvite:value("update", "Use UPDATE rather than INVITE for path redirection")
++canreinvite:value("no", "No")
++canreinvite.rmempty = true
++
++static = iaxgeneral:option(Flag, "static", "Static", "")
++static.rmempty = true
++
++writeprotect = iaxgeneral:option(Flag, "writeprotect", "Write Protect", "")
++writeprotect.rmempty = true
++
++
++sipgeneral = cbimap:section(TypedSection, "sipgeneral", "Section sipgeneral", "")
++sipgeneral.anonymous = true
++sipgeneral.addremove = true
++
++allow = sipgeneral:option(MultiValue, "allow", "Allow codecs", "")
++allow:value("ulaw", "ulaw")
++allow:value("alaw", "alaw")
++allow:value("gsm", "gsm")
++allow:value("g726", "g726")
++allow.rmempty = true
++
++port = sipgeneral:option(Value, "port", "SIP Port", "")
++port.rmempty = true
++
++realm = sipgeneral:option(Value, "realm", "SIP realm", "")
++realm.rmempty = true
++
++
++moh = cbimap:section(TypedSection, "moh", "Music On Hold", "")
++
++application = moh:option(Value, "application", "Application", "")
++application.rmempty = true
++application:depends({ ["asterisk.moh.mode"] = "custom" })
++
++directory = moh:option(Value, "directory", "Directory of Music", "")
++directory.rmempty = true
++
++mode = moh:option(ListValue, "mode", "Option mode", "")
++mode:value("system", "program to run")
++mode:value("files", "Read files from directory")
++mode:value("quietmp3", "Quite MP3")
++mode:value("mp3", "Loud MP3")
++mode:value("mp3nb", "unbuffered MP3")
++mode:value("quietmp3nb", "Quiet Unbuffered MP3")
++mode:value("custom", "Run a custom application")
++mode.rmempty = true
++
++random = moh:option(Flag, "random", "Random Play", "")
++random.rmempty = true
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplan_out.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplan_out.lua
+new file mode 100644
+index 0000000..b4c81bb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplan_out.lua
+@@ -0,0 +1,125 @@
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ast = require("luci.asterisk")
++
++local function find_outgoing_contexts(uci)
++ local c = { }
++ local h = { }
++
++-- uci:foreach("asterisk", "dialplan",
++-- function(s)
++-- if not h[s['.name']] then
++-- c[#c+1] = { s['.name'], "Dialplan: %s" % s['.name'] }
++-- h[s['.name']] = true
++-- end
++-- end)
++
++ uci:foreach("asterisk", "dialzone",
++ function(s)
++ if not h[s['.name']] then
++ c[#c+1] = { s['.name'], "Dialzone: %s" % s['.name'] }
++ h[s['.name']] = true
++ end
++ end)
++
++ return c
++end
++
++local function find_incoming_contexts(uci)
++ local c = { }
++ local h = { }
++
++ uci:foreach("asterisk", "sip",
++ function(s)
++ if s.context and not h[s.context] and
++ uci:get_bool("asterisk", s['.name'], "provider")
++ then
++ c[#c+1] = { s.context, "Incoming: %s" % s['.name'] or s.context }
++ h[s.context] = true
++ end
++ end)
++
++ return c
++end
++
++local function find_trunks(uci)
++ local t = { }
++
++ uci:foreach("asterisk", "sip",
++ function(s)
++ if uci:get_bool("asterisk", s['.name'], "provider") then
++ t[#t+1] = {
++ "SIP/%s" % s['.name'],
++ "SIP: %s" % s['.name']
++ }
++ end
++ end)
++
++ uci:foreach("asterisk", "iax",
++ function(s)
++ t[#t+1] = {
++ "IAX/%s" % s['.name'],
++ "IAX: %s" % s.extension or s['.name']
++ }
++ end)
++
++ return t
++end
++
++--[[
++
++dialzone {name} - Outgoing zone.
++ uses - Outgoing line to use: TYPE/Name
++ match (list) - Number to match
++ countrycode - The effective country code of this dialzone
++ international (list) - International prefix to match
++ localzone - dialzone for local numbers
++ addprefix - Prexix required to dial out.
++ localprefix - Prefix for a local call
++
++]]
++
++
++--
++-- SIP dialzone configuration
++--
++if arg[1] then
++ cbimap = Map("asterisk", "Edit Dialplan Entry")
++
++ entry = cbimap:section(NamedSection, arg[1])
++
++ back = entry:option(DummyValue, "_overview", "Back to dialplan overview")
++ back.value = ""
++ back.titleref = luci.dispatcher.build_url("admin", "asterisk", "dialplans")
++
++ desc = entry:option(Value, "description", "Description")
++ function desc.cfgvalue(self, s, ...)
++ return Value.cfgvalue(self, s, ...) or s
++ end
++
++ match = entry:option(DynamicList, "match", "Number matches")
++
++ intl = entry:option(DynamicList, "international", "Intl. prefix matches (optional)")
++
++ trunk = entry:option(MultiValue, "uses", "Used trunk")
++ for _, v in ipairs(find_trunks(cbimap.uci)) do
++ trunk:value(unpack(v))
++ end
++
++ aprefix = entry:option(Value, "addprefix", "Add prefix to dial out (optional)")
++ --ast.idd.cbifill(aprefix)
++
++ ccode = entry:option(Value, "countrycode", "Effective countrycode (optional)")
++ ast.cc.cbifill(ccode)
++
++ lzone = entry:option(ListValue, "localzone", "Dialzone for local numbers")
++ lzone:value("", "no special treatment of local numbers")
++ for _, v in ipairs(find_outgoing_contexts(cbimap.uci)) do
++ lzone:value(unpack(v))
++ end
++
++ lprefix = entry:option(Value, "localprefix", "Prefix for local calls (optional)")
++
++ return cbimap
++end
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplans.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplans.lua
+new file mode 100644
+index 0000000..4ffeca4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplans.lua
+@@ -0,0 +1,103 @@
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ast = require("luci.asterisk")
++
++cbimap = Map("asterisk", "Registered Trunks")
++cbimap.pageaction = false
++
++local sip_peers = { }
++cbimap.uci:foreach("asterisk", "sip",
++ function(s)
++ if s.type == "peer" then
++ s.name = s['.name']
++ s.info = ast.sip.peer(s.name)
++ sip_peers[s.name] = s
++ end
++ end)
++
++
++sip_table = cbimap:section(TypedSection, "sip", "SIP Trunks")
++sip_table.template = "cbi/tblsection"
++sip_table.extedit = luci.dispatcher.build_url("admin", "asterisk", "trunks", "sip", "%s")
++sip_table.addremove = true
++sip_table.sectionhead = "Extension"
++
++function sip_table.filter(self, s)
++ return s and (
++ cbimap.uci:get("asterisk", s, "type") == nil or
++ cbimap.uci:get_bool("asterisk", s, "provider")
++ )
++end
++
++function sip_table.create(self, section)
++ if TypedSection.create(self, section) then
++ created = section
++ else
++ self.invalid_cts = true
++ end
++end
++
++function sip_table.parse(self, ...)
++ TypedSection.parse(self, ...)
++ if created then
++ cbimap.uci:tset("asterisk", created, {
++ type = "friend",
++ qualify = "yes",
++ provider = "yes"
++ })
++
++ cbimap.uci:save("asterisk")
++ luci.http.redirect(luci.dispatcher.build_url(
++ "admin", "asterisk", "trunks", "sip", created
++ ))
++ end
++end
++
++
++user = sip_table:option(DummyValue, "username", "Username")
++
++host = sip_table:option(DummyValue, "host", "Hostname")
++function host.cfgvalue(self, s)
++ if sip_peers[s] and sip_peers[s].info.address then
++ return "%s:%i" %{ sip_peers[s].info.address, sip_peers[s].info.port }
++ else
++ return "n/a"
++ end
++end
++
++context = sip_table:option(DummyValue, "context", "Dialplan")
++context.href = luci.dispatcher.build_url("admin", "asterisk", "dialplan")
++function context.cfgvalue(...)
++ return AbstractValue.cfgvalue(...) or "(default)"
++end
++
++online = sip_table:option(DummyValue, "online", "Registered")
++function online.cfgvalue(self, s)
++ if sip_peers[s] and sip_peers[s].info.online == nil then
++ return "n/a"
++ else
++ return sip_peers[s] and sip_peers[s].info.online
++ and "yes" or "no (%s)" %{
++ sip_peers[s] and sip_peers[s].info.Status:lower() or "unknown"
++ }
++ end
++end
++
++delay = sip_table:option(DummyValue, "delay", "Delay")
++function delay.cfgvalue(self, s)
++ if sip_peers[s] and sip_peers[s].info.online then
++ return "%i ms" % sip_peers[s].info.delay
++ else
++ return "n/a"
++ end
++end
++
++info = sip_table:option(Button, "_info", "Info")
++function info.write(self, s)
++ luci.http.redirect(luci.dispatcher.build_url(
++ "admin", "asterisk", "trunks", "sip", s, "info"
++ ))
++end
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialzones.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialzones.lua
+new file mode 100644
+index 0000000..5585c06
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialzones.lua
+@@ -0,0 +1,123 @@
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ast = require("luci.asterisk")
++local uci = require("luci.model.uci").cursor()
++
++--[[
++ Dialzone overview table
++]]
++
++if not arg[1] then
++ zonemap = Map("asterisk", "Dial Zones", [[
++ Dial zones hold patterns of dialed numbers to match.
++ Each zone has one or more trunks assigned. If the first trunk is
++ congested, Asterisk will try to use the next available connection.
++ If all trunks fail, then the following zones in the parent dialplan
++ are tried.
++ ]])
++
++ local zones, znames = ast.dialzone.zones()
++
++ zonetbl = zonemap:section(Table, zones, "Zone Overview")
++ zonetbl.sectionhead = "Zone"
++ zonetbl.addremove = true
++ zonetbl.anonymous = false
++ zonetbl.extedit = luci.dispatcher.build_url(
++ "admin", "asterisk", "dialplans", "zones", "%s"
++ )
++
++ function zonetbl.cfgsections(self)
++ return znames
++ end
++
++ function zonetbl.parse(self)
++ for k, v in pairs(self.map:formvaluetable(
++ luci.cbi.REMOVE_PREFIX .. self.config
++ ) or {}) do
++ if k:sub(-2) == ".x" then k = k:sub(1, #k - 2) end
++ uci:delete("asterisk", k)
++ uci:save("asterisk")
++ self.data[k] = nil
++ for i = 1,#znames do
++ if znames[i] == k then
++ table.remove(znames, i)
++ break
++ end
++ end
++ end
++
++ Table.parse(self)
++ end
++
++ zonetbl:option(DummyValue, "description", "Description")
++ zonetbl:option(DummyValue, "addprefix")
++
++ match = zonetbl:option(DummyValue, "matches")
++ function match.cfgvalue(self, s)
++ return table.concat(zones[s].matches, ", ")
++ end
++
++ trunks = zonetbl:option(DummyValue, "trunk")
++ trunks.template = "asterisk/cbi/cell"
++ function trunks.cfgvalue(self, s)
++ return ast.tools.hyperlinks(zones[s].trunks)
++ end
++
++ return zonemap
++
++--[[
++ Zone edit form
++]]
++
++else
++ zoneedit = Map("asterisk", "Edit Dialzone")
++
++ entry = zoneedit:section(NamedSection, arg[1])
++ entry.title = "Zone %q" % arg[1];
++
++ back = entry:option(DummyValue, "_overview", "Back to dialzone overview")
++ back.value = ""
++ back.titleref = luci.dispatcher.build_url(
++ "admin", "asterisk", "dialplans", "zones"
++ )
++
++ desc = entry:option(Value, "description", "Description")
++ function desc.cfgvalue(self, s, ...)
++ return Value.cfgvalue(self, s, ...) or s
++ end
++
++ trunks = entry:option(MultiValue, "uses", "Used trunks")
++ trunks.widget = "checkbox"
++ uci:foreach("asterisk", "sip",
++ function(s)
++ if s.provider == "yes" then
++ trunks:value(
++ "SIP/%s" % s['.name'],
++ "SIP/%s (%s)" %{ s['.name'], s.host or 'n/a' }
++ )
++ end
++ end)
++
++
++ match = entry:option(DynamicList, "match", "Number matches")
++
++ intl = entry:option(DynamicList, "international", "Intl. prefix matches (optional)")
++
++ aprefix = entry:option(Value, "addprefix", "Add prefix to dial out (optional)")
++ ccode = entry:option(Value, "countrycode", "Effective countrycode (optional)")
++
++ lzone = entry:option(ListValue, "localzone", "Dialzone for local numbers")
++ lzone:value("", "no special treatment of local numbers")
++ for _, z in ipairs(ast.dialzone.zones()) do
++ lzone:value(z.name, "%q (%s)" %{ z.name, z.description })
++ end
++ --for _, v in ipairs(find_outgoing_contexts(zoneedit.uci)) do
++ -- lzone:value(unpack(v))
++ --end
++
++ lprefix = entry:option(Value, "localprefix", "Prefix for local calls (optional)")
++
++ return zoneedit
++
++end
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme.lua
+new file mode 100644
+index 0000000..e409d70
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme.lua
+@@ -0,0 +1,38 @@
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ast = require "luci.asterisk"
++
++cbimap = Map("asterisk", "MeetMe - Rooms")
++
++meetme = cbimap:section(TypedSection, "meetme", "MeetMe Rooms")
++meetme.addremove = true
++meetme.anonymous = true
++meetme.template = "cbi/tblsection"
++meetme:option(Value, "_description", "Description", "Short room description")
++
++room = meetme:option(Value, "room", "Room Number", "Unique room identifier")
++
++function room.write(self, s, val)
++ if val and #val > 0 then
++ local old = self:cfgvalue(s)
++ self.map.uci:foreach("asterisk", "dialplanmeetme",
++ function(v)
++ if v.room == old then
++ self.map:set(v['.name'], "room", val)
++ end
++ end)
++ Value.write(self, s, val)
++ end
++end
++
++
++meetme:option(Value, "pin", "PIN", "PIN required to access")
++meetme:option(Value, "adminpin", "Admin PIN", "PIN required for administration")
++
++function meetme.remove(self, s)
++ return ast.meetme.remove(self.map:get(s, "room"), self.map.uci)
++end
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme_settings.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme_settings.lua
+new file mode 100644
+index 0000000..9e5aed7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme_settings.lua
+@@ -0,0 +1,17 @@
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++cbimap = Map("asterisk", "MeetMe - Common Settings",
++ "Common settings for MeetMe phone conferences.")
++
++meetme = cbimap:section(TypedSection, "meetmegeneral", "General MeetMe Options")
++meetme.addremove = false
++meetme.anonymous = true
++
++audiobuffers = meetme:option(ListValue, "audiobuffers",
++ "Number of 20ms audio buffers to use for conferences")
++
++for i = 2, 32 do audiobuffers:value(i) end
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phone_sip.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phone_sip.lua
+new file mode 100644
+index 0000000..01dfc16
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phone_sip.lua
+@@ -0,0 +1,145 @@
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ast = require("luci.asterisk")
++
++local function find_outgoing_contexts(uci)
++ local c = { }
++ local h = { }
++
++ uci:foreach("asterisk", "dialplan",
++ function(s)
++ if not h[s['.name']] then
++ c[#c+1] = { s['.name'], "Dialplan: %s" % s['.name'] }
++ h[s['.name']] = true
++ end
++ end)
++
++ return c
++end
++
++local function find_incoming_contexts(uci)
++ local c = { }
++ local h = { }
++
++ uci:foreach("asterisk", "sip",
++ function(s)
++ if s.context and not h[s.context] and
++ uci:get_bool("asterisk", s['.name'], "provider")
++ then
++ c[#c+1] = { s.context, "Incoming: %s" % s['.name'] or s.context }
++ h[s.context] = true
++ end
++ end)
++
++ return c
++end
++
++
++--
++-- SIP phone info
++--
++if arg[2] == "info" then
++ form = SimpleForm("asterisk", "SIP Phone Information")
++ form.reset = false
++ form.submit = "Back to overview"
++
++ local info, keys = ast.sip.peer(arg[1])
++ local data = { }
++
++ for _, key in ipairs(keys) do
++ data[#data+1] = {
++ key = key,
++ val = type(info[key]) == "boolean"
++ and ( info[key] and "yes" or "no" )
++ or ( info[key] == nil or #info[key] == 0 )
++ and "(none)"
++ or tostring(info[key])
++ }
++ end
++
++ itbl = form:section(Table, data, "SIP Phone %q" % arg[1])
++ itbl:option(DummyValue, "key", "Key")
++ itbl:option(DummyValue, "val", "Value")
++
++ function itbl.parse(...)
++ luci.http.redirect(
++ luci.dispatcher.build_url("admin", "asterisk", "phones")
++ )
++ end
++
++ return form
++
++--
++-- SIP phone configuration
++--
++elseif arg[1] then
++ cbimap = Map("asterisk", "Edit SIP Client")
++
++ peer = cbimap:section(NamedSection, arg[1])
++ peer.hidden = {
++ type = "friend",
++ qualify = "yes",
++ host = "dynamic",
++ nat = "no",
++ canreinvite = "no"
++ }
++
++ back = peer:option(DummyValue, "_overview", "Back to phone overview")
++ back.value = ""
++ back.titleref = luci.dispatcher.build_url("admin", "asterisk", "phones")
++
++ active = peer:option(Flag, "disable", "Account enabled")
++ active.enabled = "yes"
++ active.disabled = "no"
++ function active.cfgvalue(...)
++ return AbstractValue.cfgvalue(...) or "yes"
++ end
++
++ exten = peer:option(Value, "extension", "Extension Number")
++ cbimap.uci:foreach("asterisk", "dialplanexten",
++ function(s)
++ exten:value(
++ s.extension,
++ "%s (via %s/%s)" %{ s.extension, s.type:upper(), s.target }
++ )
++ end)
++
++ display = peer:option(Value, "callerid", "Display Name")
++
++ username = peer:option(Value, "username", "Authorization ID")
++ password = peer:option(Value, "secret", "Authorization Password")
++ password.password = true
++
++ regtimeout = peer:option(Value, "registertimeout", "Registration Time Value")
++ function regtimeout.cfgvalue(...)
++ return AbstractValue.cfgvalue(...) or "60"
++ end
++
++ sipport = peer:option(Value, "port", "SIP Port")
++ function sipport.cfgvalue(...)
++ return AbstractValue.cfgvalue(...) or "5060"
++ end
++
++ linekey = peer:option(ListValue, "_linekey", "Linekey Mode (broken)")
++ linekey:value("", "Off")
++ linekey:value("trunk", "Trunk Appearance")
++ linekey:value("call", "Call Appearance")
++
++ dialplan = peer:option(ListValue, "context", "Assign Dialplan")
++ dialplan.titleref = luci.dispatcher.build_url("admin", "asterisk", "dialplans")
++ for _, v in ipairs(find_outgoing_contexts(cbimap.uci)) do
++ dialplan:value(unpack(v))
++ end
++
++ incoming = peer:option(StaticList, "incoming", "Receive incoming calls from")
++ for _, v in ipairs(find_incoming_contexts(cbimap.uci)) do
++ incoming:value(unpack(v))
++ end
++
++ --function incoming.cfgvalue(...)
++ --error(table.concat(MultiValue.cfgvalue(...),"."))
++ --end
++
++ return cbimap
++end
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phones.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phones.lua
+new file mode 100644
+index 0000000..a6c44f9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phones.lua
+@@ -0,0 +1,104 @@
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ast = require("luci.asterisk")
++
++cbimap = Map("asterisk", "Registered Phones")
++cbimap.pageaction = false
++
++local sip_peers = { }
++cbimap.uci:foreach("asterisk", "sip",
++ function(s)
++ if s.type ~= "peer" then
++ s.name = s['.name']
++ s.info = ast.sip.peer(s.name)
++ sip_peers[s.name] = s
++ end
++ end)
++
++
++sip_table = cbimap:section(TypedSection, "sip", "SIP Phones")
++sip_table.template = "cbi/tblsection"
++sip_table.extedit = luci.dispatcher.build_url("admin", "asterisk", "phones", "sip", "%s")
++sip_table.addremove = true
++
++function sip_table.filter(self, s)
++ return s and not cbimap.uci:get_bool("asterisk", s, "provider")
++end
++
++function sip_table.create(self, section)
++ if TypedSection.create(self, section) then
++ created = section
++ cbimap.uci:tset("asterisk", section, {
++ type = "friend",
++ qualify = "yes",
++ provider = "no",
++ host = "dynamic",
++ nat = "no",
++ canreinvite = "no",
++ extension = section:match("^%d+$") and section or "",
++ username = section:match("^%d+$") and section or ""
++ })
++ else
++ self.invalid_cts = true
++ end
++end
++
++function sip_table.parse(self, ...)
++ TypedSection.parse(self, ...)
++ if created then
++ cbimap.uci:save("asterisk")
++ luci.http.redirect(luci.dispatcher.build_url(
++ "admin", "asterisk", "phones", "sip", created
++ ))
++ end
++end
++
++
++user = sip_table:option(DummyValue, "username", "Username")
++function user.cfgvalue(self, s)
++ return sip_peers[s] and sip_peers[s].callerid or
++ AbstractValue.cfgvalue(self, s)
++end
++
++host = sip_table:option(DummyValue, "host", "Hostname")
++function host.cfgvalue(self, s)
++ if sip_peers[s] and sip_peers[s].info.address then
++ return "%s:%i" %{ sip_peers[s].info.address, sip_peers[s].info.port }
++ else
++ return "n/a"
++ end
++end
++
++context = sip_table:option(DummyValue, "context", "Dialplan")
++context.href = luci.dispatcher.build_url("admin", "asterisk", "dialplan")
++
++online = sip_table:option(DummyValue, "online", "Registered")
++function online.cfgvalue(self, s)
++ if sip_peers[s] and sip_peers[s].info.online == nil then
++ return "n/a"
++ else
++ return sip_peers[s] and sip_peers[s].info.online
++ and "yes" or "no (%s)" % {
++ sip_peers[s] and sip_peers[s].info.Status:lower() or "unknown"
++ }
++ end
++end
++
++delay = sip_table:option(DummyValue, "delay", "Delay")
++function delay.cfgvalue(self, s)
++ if sip_peers[s] and sip_peers[s].info.online then
++ return "%i ms" % sip_peers[s].info.delay
++ else
++ return "n/a"
++ end
++end
++
++info = sip_table:option(Button, "_info", "Info")
++function info.write(self, s)
++ luci.http.redirect(luci.dispatcher.build_url(
++ "admin", "asterisk", "phones", "sip", s, "info"
++ ))
++end
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunk_sip.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunk_sip.lua
+new file mode 100644
+index 0000000..eedc1c2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunk_sip.lua
+@@ -0,0 +1,86 @@
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ast = require("luci.asterisk")
++
++--
++-- SIP trunk info
++--
++if arg[2] == "info" then
++ form = SimpleForm("asterisk", "SIP Trunk Information")
++ form.reset = false
++ form.submit = "Back to overview"
++
++ local info, keys = ast.sip.peer(arg[1])
++ local data = { }
++
++ for _, key in ipairs(keys) do
++ data[#data+1] = {
++ key = key,
++ val = type(info[key]) == "boolean"
++ and ( info[key] and "yes" or "no" )
++ or ( info[key] == nil or #info[key] == 0 )
++ and "(none)"
++ or tostring(info[key])
++ }
++ end
++
++ itbl = form:section(Table, data, "SIP Trunk %q" % arg[1])
++ itbl:option(DummyValue, "key", "Key")
++ itbl:option(DummyValue, "val", "Value")
++
++ function itbl.parse(...)
++ luci.http.redirect(
++ luci.dispatcher.build_url("admin", "asterisk", "trunks")
++ )
++ end
++
++ return form
++
++--
++-- SIP trunk config
++--
++elseif arg[1] then
++ cbimap = Map("asterisk", "Edit SIP Trunk")
++
++ peer = cbimap:section(NamedSection, arg[1])
++ peer.hidden = {
++ type = "peer",
++ qualify = "yes",
++ }
++
++ back = peer:option(DummyValue, "_overview", "Back to trunk overview")
++ back.value = ""
++ back.titleref = luci.dispatcher.build_url("admin", "asterisk", "trunks")
++
++ sipdomain = peer:option(Value, "host", "SIP Domain")
++ sipport = peer:option(Value, "port", "SIP Port")
++ function sipport.cfgvalue(...)
++ return AbstractValue.cfgvalue(...) or "5060"
++ end
++
++ username = peer:option(Value, "username", "Authorization ID")
++ password = peer:option(Value, "secret", "Authorization Password")
++ password.password = true
++
++ outboundproxy = peer:option(Value, "outboundproxy", "Outbound Proxy")
++ outboundport = peer:option(Value, "outboundproxyport", "Outbound Proxy Port")
++
++ register = peer:option(Flag, "register", "Register with peer")
++ register.enabled = "yes"
++ register.disabled = "no"
++
++ regext = peer:option(Value, "registerextension", "Extension to register (optional)")
++ regext:depends({register="1"})
++
++ didval = peer:option(ListValue, "_did", "Number of assigned DID numbers")
++ didval:value("", "(none)")
++ for i=1,24 do didval:value(i) end
++
++ dialplan = peer:option(ListValue, "context", "Dialplan Context")
++ dialplan:value(arg[1] .. "_inbound", "(default)")
++ cbimap.uci:foreach("asterisk", "dialplan",
++ function(s) dialplan:value(s['.name']) end)
++
++ return cbimap
++end
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunks.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunks.lua
+new file mode 100644
+index 0000000..44c8ca8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunks.lua
+@@ -0,0 +1,94 @@
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ast = require("luci.asterisk")
++
++cbimap = Map("asterisk", "Trunks")
++cbimap.pageaction = false
++
++local sip_peers = { }
++cbimap.uci:foreach("asterisk", "sip",
++ function(s)
++ if s.type == "peer" then
++ s.name = s['.name']
++ s.info = ast.sip.peer(s.name)
++ sip_peers[s.name] = s
++ end
++ end)
++
++
++sip_table = cbimap:section(TypedSection, "sip", "SIP Trunks")
++sip_table.template = "cbi/tblsection"
++sip_table.extedit = luci.dispatcher.build_url("admin", "asterisk", "trunks", "sip", "%s")
++sip_table.addremove = true
++sip_table.sectionhead = "Extension"
++
++function sip_table.filter(self, s)
++ return s and (
++ cbimap.uci:get("asterisk", s, "type") == nil or
++ cbimap.uci:get_bool("asterisk", s, "provider")
++ )
++end
++
++function sip_table.create(self, section)
++ if TypedSection.create(self, section) then
++ created = section
++ else
++ self.invalid_cts = true
++ end
++end
++
++function sip_table.parse(self, ...)
++ TypedSection.parse(self, ...)
++ if created then
++ cbimap.uci:tset("asterisk", created, {
++ type = "friend",
++ qualify = "yes",
++ provider = "yes"
++ })
++
++ cbimap.uci:save("asterisk")
++ luci.http.redirect(luci.dispatcher.build_url(
++ "admin", "asterisk", "trunks", "sip", created
++ ))
++ end
++end
++
++
++user = sip_table:option(DummyValue, "username", "Username")
++
++context = sip_table:option(DummyValue, "context", "Dialplan")
++context.href = luci.dispatcher.build_url("admin", "asterisk", "dialplan")
++function context.cfgvalue(...)
++ return AbstractValue.cfgvalue(...) or "(default)"
++end
++
++online = sip_table:option(DummyValue, "online", "Registered")
++function online.cfgvalue(self, s)
++ if sip_peers[s] and sip_peers[s].info.online == nil then
++ return "n/a"
++ else
++ return sip_peers[s] and sip_peers[s].info.online
++ and "yes" or "no (%s)" %{
++ sip_peers[s] and sip_peers[s].info.Status:lower() or "unknown"
++ }
++ end
++end
++
++delay = sip_table:option(DummyValue, "delay", "Delay")
++function delay.cfgvalue(self, s)
++ if sip_peers[s] and sip_peers[s].info.online then
++ return "%i ms" % sip_peers[s].info.delay
++ else
++ return "n/a"
++ end
++end
++
++info = sip_table:option(Button, "_info", "Info")
++function info.write(self, s)
++ luci.http.redirect(luci.dispatcher.build_url(
++ "admin", "asterisk", "trunks", "sip", s, "info"
++ ))
++end
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail.lua
+new file mode 100644
+index 0000000..51143e6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail.lua
+@@ -0,0 +1,48 @@
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ast = require "luci.asterisk"
++
++cbimap = Map("asterisk", "Voicemail - Mailboxes")
++
++voicemail = cbimap:section(TypedSection, "voicemail", "Voicemail Boxes")
++voicemail.addremove = true
++voicemail.anonymous = true
++voicemail.template = "cbi/tblsection"
++
++context = voicemail:option(ListValue, "context", "Context")
++context:value("default")
++
++number = voicemail:option(Value, "number",
++ "Mailbox Number", "Unique mailbox identifier")
++
++function number.write(self, s, val)
++ if val and #val > 0 then
++ local old = self:cfgvalue(s)
++ self.map.uci:foreach("asterisk", "dialplanvoice",
++ function(v)
++ if v.voicebox == old then
++ self.map:set(v['.name'], "voicebox", val)
++ end
++ end)
++ Value.write(self, s, val)
++ end
++end
++
++
++voicemail:option(Value, "name", "Ownername", "Human readable display name")
++voicemail:option(Value, "password", "Password", "Access protection")
++voicemail:option(Value, "email", "eMail", "Where to send voice messages")
++voicemail:option(Value, "page", "Pager", "Pager number")
++
++zone = voicemail:option(ListValue, "zone", "Timezone", "Used time format")
++zone.titleref = luci.dispatcher.build_url("admin/asterisk/voicemail/settings")
++cbimap.uci:foreach("asterisk", "voicezone",
++ function(s) zone:value(s['.name']) end)
++
++function voicemail.remove(self, s)
++ return ast.voicemail.remove(self.map:get(s, "number"), self.map.uci)
++end
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail_settings.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail_settings.lua
+new file mode 100644
+index 0000000..ef52a32
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail_settings.lua
+@@ -0,0 +1,51 @@
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require "luci.sys.zoneinfo"
++
++
++cbimap = Map("asterisk", "Voicemail - Common Settings")
++
++voicegeneral = cbimap:section(TypedSection, "voicegeneral",
++ "General Voicemail Options", "Common settings for all mailboxes are " ..
++ "defined here. Most of them are optional. The storage format should " ..
++ "never be changed once set.")
++
++voicegeneral.anonymous = true
++voicegeneral.addremove = false
++
++format = voicegeneral:option(MultiValue, "Used storage formats")
++format.widget = "checkbox"
++format:value("wav49")
++format:value("gsm")
++format:value("wav")
++
++voicegeneral:option(Flag, "sendvoicemail", "Enable sending of emails")
++voicegeneral:option(Flag, "attach", "Attach voice messages to emails")
++voicegeneral:option(Value, "serveremail", "Used email sender address")
++voicegeneral:option(Value, "emaildateformat", "Date format used in emails").optional = true
++voicegeneral:option(Value, "maxlogins", "Max. failed login attempts").optional = true
++voicegeneral:option(Value, "maxmsg", "Max. allowed messages per mailbox").optional = true
++voicegeneral:option(Value, "minmessage", "Min. number of seconds for voicemail").optional = true
++voicegeneral:option(Value, "maxmessage", "Max. number of seconds for voicemail").optional = true
++voicegeneral:option(Value, "maxsilence", "Seconds of silence until stop recording").optional = true
++voicegeneral:option(Value, "maxgreet", "Max. number of seconds for greetings").optional = true
++voicegeneral:option(Value, "skipms", "Milliseconds to skip for rew./ff.").optional = true
++voicegeneral:option(Value, "silencethreshold", "Threshold to detect silence").optional = true
++
++
++voicezone = cbimap:section(TypedSection, "voicezone", "Time Zones",
++ "Time zones define how dates and times are expressen when used in " ..
++ "an voice mails. Refer to the asterisk manual for placeholder values.")
++
++voicezone.addremove = true
++voicezone.sectionhead = "Name"
++voicezone.template = "cbi/tblsection"
++
++tz = voicezone:option(ListValue, "zone", "Location")
++for _, z in ipairs(luci.sys.zoneinfo.TZ) do tz:value(z[1]) end
++
++voicezone:option(Value, "message", "Date Format")
++
++
++return cbimap
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/cbi/cell.htm b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/cbi/cell.htm
+new file mode 100644
+index 0000000..3afb26b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/cbi/cell.htm
+@@ -0,0 +1,13 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+cbi/valueheader%>
++<% if self.href then %><a href="<%=self.href%>"><% end -%>
++ <%=self:cfgvalue(section)%>
++<%- if self.href then %></a><%end%>
++&#160;
++<input type="hidden" id="<%=cbid%>" value="<%=luci.util.pcdata(self:cfgvalue(section))%>" />
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm
+new file mode 100644
+index 0000000..9f644ba
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm
+@@ -0,0 +1,245 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<%
++ local uci = luci.model.uci.cursor_state()
++ local ast = require "luci.asterisk"
++
++ function digit_pattern(s,t)
++ return "<code style='padding: 2px; border:1px solid #CCCCCC; background-color: #FFFFFF'%s>%s</code>"
++ %{ t and " title='" .. t .. "'" or "", s }
++ end
++
++ function rowstyle(i)
++ return "cbi-rowstyle-%i" %{
++ ( i % 2 ) == 0 and 2 or 1
++ }
++ end
++
++ function format_matches(z)
++ local html = { }
++
++ if type(z) ~= "table" then
++ z = { matches = { z } }
++ end
++
++ if z.localprefix then
++ for _, m in ipairs(z.matches) do
++ html[#html+1] =
++ digit_pattern(z.localprefix, "local prefix") .. " " ..
++ digit_pattern(m)
++ end
++ end
++
++ if z.intlmatches and #z.intlmatches > 0 then
++ for _, i in ipairs(z.intlmatches) do
++ for _, m in ipairs(z.matches) do
++ html[#html+1] = "%s %s" %{
++ digit_pattern("(%s)" % i, "intl. prefix"),
++ digit_pattern(m)
++ }
++ end
++ end
++ else
++ for _, m in ipairs(z.matches) do
++ html[#html+1] = digit_pattern(m)
++ end
++ end
++
++ return table.concat(html, "; ")
++ end
++%>
++
++
++<form method="post" action="<%=url('admin/asterisk/dialplans')%>" enctype="multipart/form-data">
++ <div>
++ <script type="text/javascript" src="/luci-static/resources/cbi.js"></script>
++ <input type="hidden" name="cbi.submit" value="1" />
++ <input type="submit" value="Save" class="hidden" />
++ </div>
++
++<div class="cbi-map" id="cbi-asterisk">
++ <h2 name="content">Outgoing Call Routing</h2>
++ <div class="cbi-map-descr">
++ Here you can manage your dial plans which are used to route outgoing calls from your local extensions.<br /><br />
++ Related tasks:<br />
++ <a href="<%=url('admin/asterisk/dialplans/zones')%>" class="cbi-title-ref">Manage dialzones</a> |
++ <a href="<%=url('admin/asterisk/voicemail/mailboxes')%>" class="cbi-title-ref">Manage voicemail boxes</a> |
++ <a href="<%=url('admin/asterisk/meetme/rooms')%>" class="cbi-title-ref">Manage meetme rooms</a>
++ </div>
++ <!-- tblsection -->
++ <fieldset class="cbi-section" id="cbi-asterisk-sip">
++ <!--<legend>Dialplans</legend>-->
++ <div class="cbi-section-descr"></div>
++
++ <% 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">
++ <big>Dialplan <em><%=plan.name%></em></big>
++ </th>
++ <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>
++
++ <!-- 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">
++ <strong>&#x2514; Dialzone <em><%=zone.name%></em></strong> (<%=zone.description%>)
++ <p style="padding-left: 1em; margin-bottom:0">
++ Lines:
++ <%=ast.tools.hyperlinks(
++ zone.trunks, function(v)
++ return luci.dispatcher.build_url("admin", "asterisk", "trunks", "%s") % v:lower()
++ end
++ )%><br />
++ Matches:
++ <%=format_matches(zone)%>
++ </p>
++ </td>
++ <td style="width:5%" class="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>
++ <% 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">
++ <strong>&#x2514; Voicemailbox <em><%=box.id%></em></strong> (<%=box.name%>)
++ <p style="padding-left: 1em; margin-bottom:0">
++ Owner: <%=box.name%> |
++ eMail: <%=#box.email > 0 and box.email or 'n/a'%> |
++ 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">
++ <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>
++ <% 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">
++ <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">
++ <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>
++ <% 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">
++ <hr style="margin-bottom:0.5em; border-width:0 0 1px 0" />
++
++ Add Dialzone:<br />
++ <select style="width:30%" name="addzone.<%=plan.name%>">
++ <option value="">-- please select --</option>
++ <% for _, zone in luci.util.kspairs(ast.dialzone.zones()) do %>
++ <% if not zones_used[zone.name] then %>
++ <option value="<%=zone.name%>"><%=zone.name%> (<%=zone.description%>)</option>
++ <% end %>
++ <% end %>
++ </select>
++ <br /><br />
++
++ Add Voicemailbox:<br />
++ <select style="width:20%" name="addvbox.<%=plan.name%>" onchange="this.form['addvboxext.<%=plan.name%>'].value=this.options[this.selectedIndex].value.split('@')[0]">
++ <option value="">-- please select --</option>
++ <% for ext, box in luci.util.kspairs(ast.voicemail.boxes()) do %>
++ <% if not boxes_used[box.id] then %>
++ <option value="<%=box.id%>"><%=box.id%> (<%=box.name%>)</option>
++ <% end %>
++ <% end %>
++ </select>
++ as extension
++ <input type="text" style="width:5%" name="addvboxext.<%=plan.name%>" />
++ <br /><br />
++
++ Add MeetMe Conference:<br />
++ <select style="width:20%" name="addmeetme.<%=plan.name%>" onchange="this.form['addmeetmeext.<%=plan.name%>'].value=this.options[this.selectedIndex].value">
++ <option value="">-- please select --</option>
++ <% for ext, room in luci.util.kspairs(ast.meetme.rooms()) do %>
++ <%# if not rooms_used[room.room] then %>
++ <option value="<%=room.room%>">
++ <%=room.room%>
++ <% if room.description and #room.description > 0 then %>(<%=room.description%>)<% end %>
++ </option>
++ <%# end %>
++ <% end %>
++ </select>
++ as extension
++ <input type="text" style="width:5%" name="addmeetmeext.<%=plan.name%>" />
++ <br /><br />
++
++ <input type="submit" class="cbi-button cbi-button-add" value="Add item &raquo;" title="Add item ..."/>
++ </td>
++ </tr>
++
++ </table>
++
++ <div class="cbi-section-create cbi-tblsection-create"></div>
++ </div>
++ <br />
++ <% end %>
++
++ <div class="cbi-section-node">
++ <div class="cbi-section-create cbi-tblsection-create" style="padding: 3px">
++ <h3>Create a new dialplan</h3>
++ The name is required and must be unique. It may only contain the characters A-Z, a-z, 0-9 and _ .<br />
++
++ <%- if create_error then %>
++ <br /><span style="color:red">Invalid name given!</span><br />
++ <% end -%>
++
++ <br />
++ <input type="text" class="cbi-section-create-name" name="addplan" style="width:200px" />
++ <input type="submit" class="cbi-button cbi-button-add" value="Add dialplan" title="Add dialplan"/>
++ </div>
++ </div>
++
++ </fieldset>
++</div>
++</form>
++<div class="clear"></div>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm
+new file mode 100644
+index 0000000..ffdbbcf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm
+@@ -0,0 +1,165 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<%
++ local uci = luci.model.uci.cursor_state()
++ local ast = require("luci.asterisk")
++
++ function digit_pattern(s)
++ return "<code style='padding: 2px; border:1px solid #CCCCCC; background-color: #FFFFFF'>%s</code>" % s
++ end
++
++ function rowstyle(i)
++ return "cbi-rowstyle-%i" %{
++ ( i % 2 ) == 0 and 2 or 1
++ }
++ end
++
++ local function find_trunks()
++ local t = { }
++
++ uci:foreach("asterisk", "sip",
++ function(s)
++ if uci:get_bool("asterisk", s['.name'], "provider") then
++ t[#t+1] = {
++ "SIP/%s" % s['.name'],
++ "SIP: %s" % s['.name']
++ }
++ end
++ end)
++
++ uci:foreach("asterisk", "iax",
++ function(s)
++ t[#t+1] = {
++ "IAX/%s" % s['.name'],
++ "IAX: %s" % s.extension or s['.name']
++ }
++ end)
++
++ return t
++ end
++
++%>
++
++
++<form method="post" action="<%=url('admin/asterisk/dialplans/zones')%>" enctype="multipart/form-data">
++ <div>
++ <script type="text/javascript" src="/luci-static/resources/cbi.js"></script>
++ <input type="hidden" name="cbi.submit" value="1" />
++ <input type="submit" value="Save" class="hidden" />
++ </div>
++
++<div class="cbi-map" id="cbi-asterisk">
++ <h2 name="content">Dial Zone Management</h2>
++ <div class="cbi-map-descr">
++ <a href="<%=url("admin/asterisk/dialplans")%>" class="cbi-title-ref">Back to dialplan overview</a><br /><br />
++ Here you can manage your dial zones. The zones are used to route outgoing calls to the destination.
++ Each zone groups multiple trunks and number matches to represent a logical destination. Zones can
++ also be used to enforce certain dial restrictions on selected extensions.
++ </div>
++
++ <!-- 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">
++ <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>
++
++ <% 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">
++ <%=rule.name%>
++ </td>
++ <td style="text-align:right" class="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">
++ <% 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">
++ <%=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">
++ <%=rule.description or rule.name%>
++ </td>
++ <td style="text-align:left" class="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>
++ <% end %>
++ </table>
++ <div class="cbi-section-create cbi-tblsection-create"></div>
++ </div>
++ <br />
++
++ <div class="cbi-section-node">
++ <div class="cbi-section-create cbi-tblsection-create" style="padding: 3px">
++ <h3>Create a new dialzone</h3>
++ The name is required and must be unique. It may only contain the characters A-Z, a-z, 0-9 and _ .<br />
++ You can specifiy multiple number matches by separating them with spaces.<br />
++
++ <%- if create_error then %>
++ <br /><span style="color:red">Invalid name given!</span><br />
++ <% end -%>
++
++ <table>
++ <tr>
++ <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">
++ <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>
++ <br />
++
++ <input type="submit" class="cbi-button cbi-button-add" name="newzone" value="Add entry" title="Add entry"/>
++ </div>
++ </div>
++ </fieldset>
++</div>
++</form>
++<div class="clear"></div>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/ca/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/ca/asterisk.po
+new file mode 100644
+index 0000000..9775758
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/ca/asterisk.po
+@@ -0,0 +1,680 @@
++# asterisk.pot
++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2009-05-31 19:18+0200\n"
++"Last-Translator: Eduard Duran <iopahopa@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Opcions Generals d'Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "Directori AGI"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Desa en memòria cau els sons gravats durant la gravació"
++
++#~ msgid "Debug Level"
++#~ msgstr "Nivell de depuració"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Desactiva algunes alertes"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Bolca el nucli en cas de fallada"
++
++#~ msgid "High Priority"
++#~ msgstr "Alta Prioritat"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Inicialitza Crypto"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Utilitza l'hora interna"
++
++#~ msgid "Log directory"
++#~ msgstr "Directori de registres"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Número màxim de trucades permeses"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Càrrega màxima per deixar d'acceptar trucades noves"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Desactiva els colors de consola"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Directori de memòria cau dels fitxers de so"
++
++#~ msgid "The Group to run as"
++#~ msgstr "Executa amb els permisos del Grup"
++
++#~ msgid "The User to run as"
++#~ msgstr "Executa amb els permisos de l'Usuari"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Directori de bústia de correu"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "Prefixa l'UniquID amb el nom del sistema"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr "Munta les rutes de transcodificació via SLINEAR, no directament"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "Transmet silenci SLINEAR mentre s'enregistri un canal"
++
++#~ msgid "Verbose Level"
++#~ msgstr "Nivell de detall"
++
++#~ msgid "Section dialplan"
++#~ msgstr "Secció Dialplan"
++
++#~ msgid "include"
++#~ msgstr "inclou"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "Connector Dialplan"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "Opcions generals de Dialplan"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Permet la transferència"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Buida les variables globals"
++
++#~ msgid "Dialplan Goto"
++#~ msgstr "Dialplan Goto"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "Conferència Dialplan"
++
++#~ msgid "Dialplan Time"
++#~ msgstr "Dialplan Time"
++
++#~ msgid "Dialplan Voicemail"
++#~ msgstr "Bústia de correu Dialplan"
++
++#~ msgid "Dial Zones for Dialplan"
++#~ msgstr "Zones de marcatge per Dialplan"
++
++#~ msgid "Prefix to add matching dialplans"
++#~ msgstr "Prefix per afegir als Dialplan que coincideixin"
++
++#~ msgid "Match International prefix"
++#~ msgstr "Coincideix amb el prefix Internacional"
++
++#~ msgid "Prefix (0) to add/remove to/from international numbers"
++#~ msgstr "Prefix (0) per afegir/esborrar a/des de números internacionals"
++
++#~ msgid "localzone"
++#~ msgstr "zona local"
++
++#~ msgid "Match plan"
++#~ msgstr "Pla coincident"
++
++#~ msgid "Connection to use"
++#~ msgstr "Connexió a fer servir"
++
++#~ msgid "Feature Key maps"
++#~ msgstr "Mapa de Funcions Principals"
++
++#~ msgid "Attended transfer key"
++#~ msgstr "Tecla de transferència assistida"
++
++#~ msgid "Blind transfer key"
++#~ msgstr "Tecla de transferència cega"
++
++#~ msgid "Key to Disconnect call"
++#~ msgstr "Tecla per desconnectar trucada"
++
++#~ msgid "Key to Park call"
++#~ msgstr "Tecla per trucada en espera"
++
++#~ msgid "Parking Feature"
++#~ msgstr "Funció de trucada en espera"
++
++#~ msgid "ADSI Park"
++#~ msgstr "Trucada en espera ADSI"
++
++#~ msgid "Attended transfer timeout (sec)"
++#~ msgstr "Temps d'espera de transferència assistida (seg)"
++
++#~ msgid "One touch record key"
++#~ msgstr "Tecla de registre d'un toc"
++
++#~ msgid "Name of call context for parking"
++#~ msgstr "Nom del context de la trucada en espera"
++
++#~ msgid "Sound file to play to parked caller"
++#~ msgstr "Fitxer de so per reproduir a la trucada en espera"
++
++#~ msgid "Max time (ms) between digits for feature activation"
++#~ msgstr "Temps màxim (en ms) entre dígits per l'activació de funció"
++
++#~ msgid "Method to Find Parking slot"
++#~ msgstr "Mètode per trobar una ranura de trucada en espera"
++
++#~ msgid "parkedmusicclass"
++#~ msgstr "parkedmusicclass"
++
++#~ msgid "Play courtesy tone to"
++#~ msgstr "Reprodueix to de cortesia a"
++
++#~ msgid "Enable Parking"
++#~ msgstr "Activa les trucades en espera"
++
++#~ msgid "Extension to dial to park"
++#~ msgstr "Extensió per marcar per deixar en espera una trucada"
++
++#~ msgid "Parking time (secs)"
++#~ msgstr "Temps de trucada en espera (secs)"
++
++#~ msgid "Range of extensions for call parking"
++#~ msgstr "Rang d'extensions per trucada en espera"
++
++#~ msgid "Pickup extension"
++#~ msgstr "Connector de recol·lecció"
++
++#~ msgid "Seconds to wait bewteen digits when transferring"
++#~ msgstr "Segons a esperar entre dígits quan es transfereix"
++
++#~ msgid "sound when attended transfer is complete"
++#~ msgstr "so quan es completa la transferència assistida"
++
++#~ msgid "Sound when attended transfer fails"
++#~ msgstr "so quan falla la transferència assitida"
++
++#~ msgid "Reload Hardware Config"
++#~ msgstr "Recarrega la configuració de maquinari"
++
++#~ msgid "Reboot Method"
++#~ msgstr "Mètode de Reinici"
++
++#~ msgid "Parameter"
++#~ msgstr "Paràmetre"
++
++#~ msgid "Option type"
++#~ msgstr "Tipus d'opció"
++
++#~ msgid "User name"
++#~ msgstr "Nom d'usuari"
++
++#~ msgid "IAX General Options"
++#~ msgstr "Opcions generals IAX"
++
++#~ msgid "Allow Codecs"
++#~ msgstr "Permet Codecs"
++
++#~ msgid "Static"
++#~ msgstr "Estàtic"
++
++#~ msgid "Write Protect"
++#~ msgstr "Protecció d'escriptura"
++
++#~ msgid "Meetme Conference"
++#~ msgstr "Conferència Meetme"
++
++#~ msgid "Admin PIN"
++#~ msgstr "PIN d'administrador"
++
++#~ msgid "Meeting PIN"
++#~ msgstr "PIN de reunió"
++
++#~ msgid "Meetme Conference General Options"
++#~ msgstr "Opcions generals de conferència Meetme"
++
++#~ msgid "Number of 20ms audio buffers to be used"
++#~ msgstr "Número de memòries intermitges d'àudio de 20 ms a utilitzar"
++
++#~ msgid "Modules"
++#~ msgstr "Mòduls"
++
++#~ msgid "Alarm Receiver Application"
++#~ msgstr "Aplicació de recepció d'alarma"
++
++#~ msgid "Authentication Application"
++#~ msgstr "Aplicació d'autenticació"
++
++#~ msgid "Make sure asterisk doesnt save CDR"
++#~ msgstr "Assegura't que asterisk no desa CDR"
++
++#~ msgid "Check if channel is available"
++#~ msgstr "Comprova que el canal estigui disponible"
++
++#~ msgid "Listen in on any channel"
++#~ msgstr "Escolta a qualsevol canal"
++
++#~ msgid "Control Playback Application"
++#~ msgstr "Aplicació de control de reproducció"
++
++#~ msgid "Cuts up variables"
++#~ msgstr "Talla les variables"
++
++#~ msgid "Database access functions"
++#~ msgstr "Funcions d'accés a base de dades"
++
++#~ msgid "Dialing Application"
++#~ msgstr "Aplicació de marcatge"
++
++#~ msgid "Virtual Dictation Machine Application"
++#~ msgstr "Aplicació de màquina de dictat virtual"
++
++#~ msgid "Directed Call Pickup Support"
++#~ msgstr "Suport de recollida de trucades adreçades"
++
++#~ msgid "Extension Directory"
++#~ msgstr "Directori de connectors"
++
++#~ msgid "DISA (Direct Inward System Access) Application"
++#~ msgstr "Aplicació DISA (Direct Inward System Access)"
++
++#~ msgid "Dump channel variables Application"
++#~ msgstr "Bolca les variables de canal de l'aplicació"
++
++#~ msgid "Simple Echo Application"
++#~ msgstr "Aplicació d'eco simple"
++
++#~ msgid "ENUM Lookup"
++#~ msgstr "Consulta ENUM"
++
++#~ msgid "Reevaluates strings"
++#~ msgstr "Reavalua cadenes"
++
++#~ msgid "Executes applications"
++#~ msgstr "Executa aplicacions"
++
++#~ msgid "External IVR application interface"
++#~ msgstr "Interfície d'aplicació IVR externa"
++
++#~ msgid "Fork The CDR into 2 seperate entities"
++#~ msgstr "Bifurca el CDR en 2 entitats separades"
++
++#~ msgid "Get ADSI CPE ID"
++#~ msgstr "Obtingues la ADSI CPE ID"
++
++#~ msgid "Group Management Routines"
++#~ msgstr "Rutines de gestió de grup"
++
++#~ msgid "Encode and Stream via icecast and ices"
++#~ msgstr "Codifica i emet via icecast i ices"
++
++#~ msgid "Image Transmission Application"
++#~ msgstr "Aplicació de transmissió d'imatge"
++
++#~ msgid "Look up Caller*ID name/number from black"
++#~ msgstr "Cerca la ID/nom/número de qui truca de negre"
++
++#~ msgid "Look up CallerID Name from local databas"
++#~ msgstr "Cerca la ID/nom/número de qui truca de la base de dades local"
++
++#~ msgid "Extension Macros"
++#~ msgstr "Macros de connectors"
++
++#~ msgid "A simple math Application"
++#~ msgstr "Una aplicació de matemàtiques simple"
++
++#~ msgid "MD5 checksum Application"
++#~ msgstr "Aplicació de suma de verificació MD5"
++
++#~ msgid "Digital Milliwatt (mu-law) Test Application"
++#~ msgstr "Aplicació de prova de milliwat digital (mu-law)"
++
++#~ msgid "Record a call and mix the audio during the recording"
++#~ msgstr "Registra una trucada i mescla l'àudio durant la gravació"
++
++#~ msgid "Call Parking and Announce Application"
++#~ msgstr "Aplicació d'anunci de trucades i trucada en espera"
++
++#~ msgid "Trivial Playback Application"
++#~ msgstr "Aplicació de reproducció trivial"
++
++#~ msgid "Require phone number to be entered"
++#~ msgstr "Requereix que s'entri un número de telèfon"
++
++#~ msgid "True Call Queueing"
++#~ msgstr "Encuament de trucades real"
++
++#~ msgid "Random goto"
++#~ msgstr "Goto aleatori"
++
++#~ msgid "Read Variable Application"
++#~ msgstr "Aplicació de lectura de variables"
++
++#~ msgid "Read in a file"
++#~ msgstr "Llegeix en un fitxer"
++
++#~ msgid "Realtime Data Lookup/Rewrite"
++#~ msgstr "Cerca/reescriptura de dades en temps real"
++
++#~ msgid "Trivial Record Application"
++#~ msgstr "Aplicació d'enregistrament trivial"
++
++#~ msgid "Say time"
++#~ msgstr "Digues l'hora"
++
++#~ msgid "Send DTMF digits Application"
++#~ msgstr "Envia aplicació de dígits DTMF"
++
++#~ msgid "Send Text Applications"
++#~ msgstr "Envia aplicacions de text"
++
++#~ msgid "Set CallerID Application"
++#~ msgstr "Estableix l'aplicació CallerID"
++
++#~ msgid "CDR user field apps"
++#~ msgstr "Aplicacions de camp d'usuari CDR"
++
++#~ msgid "load => .so ; Set CallerID Name"
++#~ msgstr "load =&gt; .so ; Estableix el nom CallerID"
++
++#~ msgid "load => .so ; Set CallerID Number"
++#~ msgstr "load =&gt; .so ; Estableix el número CallerID"
++
++#~ msgid "Set RDNIS Number"
++#~ msgstr "Estableix el número RDNIS"
++
++#~ msgid "Set ISDN Transfer Capability"
++#~ msgstr "Estableix la capacitat de transferència XDSI"
++
++#~ msgid "SMS/PSTN handler"
++#~ msgstr "Gestor SMS/PSTN"
++
++#~ msgid "Hangs up the requested channel"
++#~ msgstr "Penja el canal sol·licitat"
++
++#~ msgid "Stack Routines"
++#~ msgstr "Rutines de pila"
++
++#~ msgid "Generic System() application"
++#~ msgstr "Aplicació genèrica de System()"
++
++#~ msgid "Playback with Talk Detection"
++#~ msgstr "Playback amb Detecció de Parla"
++
++#~ msgid "Interface Test Application"
++#~ msgstr "Aplicació de proves d'interfície"
++
++#~ msgid "Transfer"
++#~ msgstr "Transfereix"
++
++#~ msgid "TXTCIDName"
++#~ msgstr "TXTCIDName"
++
++#~ msgid "Send URL Applications"
++#~ msgstr "Envia aplicacions d'URL"
++
++#~ msgid "Custom User Event Application"
++#~ msgstr "Aplicació d'esdeveniments personalitzats d'usuari"
++
++#~ msgid "Send verbose output"
++#~ msgstr "Envia sortida detallada"
++
++#~ msgid "Voicemail"
++#~ msgstr "Bústia de veu"
++
++#~ msgid "Waits until first ring after time"
++#~ msgstr "Espera fins el primer to després del temps"
++
++#~ msgid "Wait For Silence Application"
++#~ msgstr "Espera l'aplicació de silenci"
++
++#~ msgid "While Loops and Conditional Execution"
++#~ msgstr "Execució de bucles while i condicionals"
++
++#~ msgid "Comma Separated Values CDR Backend"
++#~ msgstr "Valors de Backend CDR separats per comes"
++
++#~ msgid "Customizable Comma Separated Values CDR Backend"
++#~ msgstr "Valors de Backend CDR personalitzats separats per comes"
++
++#~ msgid "Asterisk Call Manager CDR Backend"
++#~ msgstr "Backend CDR del gestor de trucades Asterisk"
++
++#~ msgid "MySQL CDR Backend"
++#~ msgstr "Backend CDR MySQL"
++
++#~ msgid "PostgreSQL CDR Backend"
++#~ msgstr "Backend CDR PostgreSQL"
++
++#~ msgid "SQLite CDR Backend"
++#~ msgstr "Backend CDR SQLite"
++
++#~ msgid "Agent Proxy Channel"
++#~ msgstr "Canal de l'Agent Proxy"
++
++#~ msgid "Option chan_iax2"
++#~ msgstr "Opció chan_iax2"
++
++#~ msgid "Local Proxy Channel"
++#~ msgstr "Canal de proxy local"
++
++#~ msgid "Session Initiation Protocol (SIP)"
++#~ msgstr "Protocol d'inicialització de sessió (SIP)"
++
++#~ msgid "Adaptive Differential PCM Coder/Decoder"
++#~ msgstr "Codificador/Decodificador PCM adaptatiu diferencial"
++
++#~ msgid "A-law Coder/Decoder"
++#~ msgstr "Codificador/Decodificador de llei A"
++
++#~ msgid "A-law and Mulaw direct Coder/Decoder"
++#~ msgstr "Codificador/Decodificador directe de llei A i Mu"
++
++#~ msgid "ITU G.726-32kbps G726 Transcoder"
++#~ msgstr "Transcodificador ITU G.726-32kbps G726"
++
++#~ msgid "GSM/PCM16 (signed linear) Codec Translation"
++#~ msgstr "Còdec de traducció GSM/PCM16 (lineal amb signe)"
++
++#~ msgid "Speex/PCM16 (signed linear) Codec Translator"
++#~ msgstr "Còdec de traducció Speex/PCM16 (lineal amb signe)"
++
++#~ msgid "Mu-law Coder/Decoder"
++#~ msgstr "Codificador/Decodificador llei Mu"
++
++#~ msgid "Sun Microsystems AU format (signed linear)"
++#~ msgstr "Format AU de Sun Microsystems (lineal amb signe)"
++
++#~ msgid "G.723.1 Simple Timestamp File Format"
++#~ msgstr "Format de fitxer de marca de temps simple G.723.1"
++
++#~ msgid "Raw G.726 (16/24/32/40kbps) data"
++#~ msgstr "Dades Raw G.726 (16/24/32/40kbps)"
++
++#~ msgid "Raw G729 data"
++#~ msgstr "Dades Raw G729"
++
++#~ msgid "Raw GSM data"
++#~ msgstr "Dades Raw GSM"
++
++#~ msgid "Raw h263 data"
++#~ msgstr "Dades Raw h263"
++
++#~ msgid "JPEG (Joint Picture Experts Group) Image"
++#~ msgstr "Imatge JPEG (Joint Picture Experts Group)"
++
++#~ msgid "Raw uLaw 8khz Audio support (PCM)"
++#~ msgstr "Suport d'àudio Raw llei-u 8khz (PCM)"
++
++#~ msgid "load => .so ; Raw aLaw 8khz PCM Audio support"
++#~ msgstr "load =&gt; .so ; suport d'àudio Raw llei-a 8khz PCM"
++
++#~ msgid "Raw Signed Linear Audio support (SLN)"
++#~ msgstr "Suport d'àudio Raw amb signe lineal (SLN)"
++
++#~ msgid "Dialogic VOX (ADPCM) File Format"
++#~ msgstr "Format de fitxer Dialogic VOX (ADPCM)"
++
++#~ msgid "Microsoft WAV format (8000hz Signed Line"
++#~ msgstr "Format Microsoft WAV (8000hz amb signe lineal)"
++
++#~ msgid "Microsoft WAV format (Proprietary GSM)"
++#~ msgstr "Format Microsoft WAV (GSM propietari)"
++
++#~ msgid "Caller ID related dialplan functions"
++#~ msgstr "Functions de dialplan relacionades amb la ID de qui truca"
++
++#~ msgid "ENUM Functions"
++#~ msgstr "Funcions ENUM"
++
++#~ msgid "URI encoding / decoding functions"
++#~ msgstr "Funcions de codificació / decodificació d'URI"
++
++#~ msgid "Asterisk Extension Language Compiler"
++#~ msgstr "Compilador del llenguatge de connectors d'Asterisk"
++
++#~ msgid "Text Extension Configuration"
++#~ msgstr "Configuració del connector de text"
++
++#~ msgid "load => .so ; Builtin dialplan functions"
++#~ msgstr "load =&gt; .s ; Funcions integrades dialplan"
++
++#~ msgid "Loopback Switch"
++#~ msgstr "Switch loopback"
++
++#~ msgid "Realtime Switch"
++#~ msgstr "Switch en temps real"
++
++#~ msgid "Outgoing Spool Support"
++#~ msgstr "Suport de gestió de cues sortint"
++
++#~ msgid "Wil Cal U (Auto Dialer)"
++#~ msgstr "Wil Cal U (Auto Marcatge)"
++
++#~ msgid "MySQL Config Resource"
++#~ msgstr "Configuració del recurs MySQL"
++
++#~ msgid "ODBC Config Resource"
++#~ msgstr "Configuració del recurs ODBC"
++
++#~ msgid "PGSQL Module"
++#~ msgstr "Mòdul PGSQL"
++
++#~ msgid "Cryptographic Digital Signatures"
++#~ msgstr "Signatures digitals criptogràfiques"
++
++#~ msgid "Call Parking Resource"
++#~ msgstr "Recurs de trucada en espera"
++
++#~ msgid "Indications Configuration"
++#~ msgstr "Configuració d'indicacions"
++
++#~ msgid "Call Monitoring Resource"
++#~ msgstr "Recurs de monitoreig de trucades"
++
++#~ msgid "Music On Hold Resource"
++#~ msgstr "Recurs de música en espera"
++
++#~ msgid "ODBC Resource"
++#~ msgstr "Recurs ODBC"
++
++#~ msgid "SMDI Module"
++#~ msgstr "Mòdul SMDI"
++
++#~ msgid "SNMP Module"
++#~ msgstr "Mòdul SNMP"
++
++#~ msgid "Music On Hold"
++#~ msgstr "Música en espera"
++
++#~ msgid "Application"
++#~ msgstr "Aplicació"
++
++#~ msgid "Directory of Music"
++#~ msgstr "Directori de música"
++
++#~ msgid "Option mode"
++#~ msgstr "Mode d'opció"
++
++#~ msgid "Random Play"
++#~ msgstr "Reproducció aleatòria"
++
++#~ msgid "DTMF mode"
++#~ msgstr "Mode DTMF"
++
++#~ msgid "Primary domain identity for From: headers"
++#~ msgstr "Domini d'identitat primari per les capçaleres From:"
++
++#~ msgid "From user (required by many SIP providers)"
++#~ msgstr "Usuari d'inici (requerit per diversos proveïdors SIP)"
++
++#~ msgid "Ring on incoming dialplan contexts"
++#~ msgstr "Truca en contextos d'entrades dialplan"
++
++#~ msgid "Allow Insecure for"
++#~ msgstr "Permet insegur per"
++
++#~ msgid "Mailbox for MWI"
++#~ msgstr "Bústia de veu per MWI"
++
++#~ msgid "NAT between phone and Asterisk"
++#~ msgstr "NAT entre el telèfon i l'Asterisk"
++
++#~ msgid "Check tags in headers"
++#~ msgstr "Comprova etiquetes a les capçaleres"
++
++#~ msgid "Reply Timeout (ms) for down connection"
++#~ msgstr "Temps d'esperi per contestar (ms) per caigudes de connexió"
++
++#~ msgid "Register connection"
++#~ msgstr "Registra connexió"
++
++#~ msgid "Dial own extension for mailbox"
++#~ msgstr "Truca el propi connector per la bústia de veu"
++
++#~ msgid "Client Type"
++#~ msgstr "Tipus de client"
++
++#~ msgid "Username"
++#~ msgstr "Nom d'usuari"
++
++#~ msgid "Section sipgeneral"
++#~ msgstr "Secció sipgeneral"
++
++#~ msgid "Allow codecs"
++#~ msgstr "Permet còdecs"
++
++#~ msgid "SIP realm"
++#~ msgstr "Reialme SIP"
++
++#~ msgid "Voicemail general options"
++#~ msgstr "Opcions generals de bústia de veu"
++
++#~ msgid "From Email address of server"
++#~ msgstr "Adreça de correu electrònic d'origen del servidor"
++
++#~ msgid "Voice Mail boxes"
++#~ msgstr "Bústies de la bústia de veu"
++
++#~ msgid "Email contains attachment"
++#~ msgstr "El correu electrònic conté fitxers adjunts"
++
++#~ msgid "Email"
++#~ msgstr "Correu electrònic"
++
++#~ msgid "Display Name"
++#~ msgstr "Nom a mostrar"
++
++#~ msgid "Password"
++#~ msgstr "Contrasenya"
++
++#~ msgid "zone"
++#~ msgstr "zona"
++
++#~ msgid "Voice Zone settings"
++#~ msgstr "Configuració de zona de veu"
++
++#~ msgid "Message Format"
++#~ msgstr "Format de missatge"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/cs/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/cs/asterisk.po
+new file mode 100644
+index 0000000..7341d57
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/cs/asterisk.po
+@@ -0,0 +1,11 @@
++# asterisk.pot
++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/de/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/de/asterisk.po
+new file mode 100644
+index 0000000..f289849
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/de/asterisk.po
+@@ -0,0 +1,131 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2012-02-23 16:29+0200\n"
++"Last-Translator: Martin <roecker@empty-v.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Asterisk Grundeinstellungen"
++
++#~ msgid "AGI directory"
++#~ msgstr "AGI - Verzeichnis"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Audiodateien während der Aufnahme zwischenspeichern"
++
++#~ msgid "Debug Level"
++#~ msgstr "Debug Stufe"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Schalte einige Warnungen aus"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Speicherabbild bei Absturz erstellen"
++
++#~ msgid "High Priority"
++#~ msgstr "Hohe Priorität"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Verschlüsselung initialisieren"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Interne Zeitreferenz benutzen"
++
++#~ msgid "Log directory"
++#~ msgstr "Log - Verzeichnis"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Maximale Anruferanzahl"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Maximale CPU Auslastung um eingehende Anrufe anzunehmen"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Farbige Ausgabe auf der Konsole deaktivieren"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Verzeichnis zum Zwischenspeichern von Audiodateien"
++
++#~ msgid "The Group to run as"
++#~ msgstr "zu benutzende Gruppenkennung"
++
++#~ msgid "The User to run as"
++#~ msgstr "zu benutzende Benutzerkennung"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Sprachnachrichten Puffer"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "Systemnamen als Präfix von UniquID benutzen"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr "Transcode Pfade durch SLINEAR bauen, indirekt"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "Übertrage Stille (SLINEAR) während der Aufnahme eines Kanals"
++
++#~ msgid "Verbose Level"
++#~ msgstr "Detailgrad"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Ãœbertragung erlauben"
++
++#~ msgid "Clear global vars"
++#~ msgstr "globale Variablen Zurücksetzen"
++
++#~ msgid "localzone"
++#~ msgstr "Zeitzone"
++
++#~ msgid "Connection to use"
++#~ msgstr "zu verwendende Verbindung"
++
++#~ msgid "One touch record key"
++#~ msgstr "Sofortaufnahmetaste"
++
++#~ msgid "Reload Hardware Config"
++#~ msgstr "Hardwarekonfiguration neuladen"
++
++#~ msgid "Reboot Method"
++#~ msgstr "Neustartmethode"
++
++#~ msgid "Parameter"
++#~ msgstr "Parameter"
++
++#~ msgid "User name"
++#~ msgstr "Benutzername"
++
++#~ msgid "IAX General Options"
++#~ msgstr "IAX Allgemeine Einstellungen"
++
++#~ msgid "Allow Codecs"
++#~ msgstr "Codecs erlauben"
++
++#~ msgid "Admin PIN"
++#~ msgstr "Admin PIN"
++
++#~ msgid "Modules"
++#~ msgstr "Module"
++
++#~ msgid "Check if channel is available"
++#~ msgstr "Prüfen, ob der Kanal verfügbar ist"
++
++#~ msgid "Control Playback Application"
++#~ msgstr "Anwendung zur Wiedergabesteuerung"
++
++#~ msgid "Executes applications"
++#~ msgstr "startet Anwendungen"
++
++#~ msgid "A simple math Application"
++#~ msgstr "Einfache Mathe-Anwendung"
++
++#~ msgid "MD5 checksum Application"
++#~ msgstr "MD5-Prüfsummen Anwendung"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/el/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/el/asterisk.po
+new file mode 100644
+index 0000000..7a0fee7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/el/asterisk.po
+@@ -0,0 +1,71 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2012-03-19 14:55+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Γενικές επιλογές του Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "Φάκελος AGI"
++
++#~ msgid "Debug Level"
++#~ msgstr "Επίπεδο αποσφαλμάτωσης"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "ΑπενεÏγοποίηση οÏισμένων μηνυμάτων"
++
++#~ msgid "High Priority"
++#~ msgstr "Υψηλή ΠÏοτεÏαιότητα"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "ΑÏχικοποίηση Crypto"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "ΧÏήση εσωτεÏÎ¹ÎºÎ¿Ï Ï‡ÏονόμετÏου"
++
++#~ msgid "Log directory"
++#~ msgstr "Φάκελος καταγÏαφής"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Μέγιστος επιτÏεπόμενος αÏιθμός κλήσεων"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Μέγιστος φόÏτος για παÏση εισεÏχόμενων κλήσεων"
++
++#~ msgid "Disable console colors"
++#~ msgstr "ΑπενεÏγοποίηση χÏωμάτων κονσόλας"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "ΚÏυφός φάκελος αÏχείων ήχου"
++
++#~ msgid "include"
++#~ msgstr "πεÏιλαμβάνω"
++
++#~ msgid "Clear global vars"
++#~ msgstr "ΚαθαÏισμός γενικών μεταβλητών"
++
++#~ msgid "Connection to use"
++#~ msgstr "ΧÏήση σÏνδεσης"
++
++#~ msgid "Reboot Method"
++#~ msgstr "Μέθοδος Επανεκκίνησης"
++
++#~ msgid "Parameter"
++#~ msgstr "ΠαÏάμετÏος"
++
++#~ msgid "JPEG (Joint Picture Experts Group) Image"
++#~ msgstr "Εικόνα JPEG (Joint Picture Experts Group)"
++
++#~ msgid "Application"
++#~ msgstr "ΕφαÏμογή"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/en/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/en/asterisk.po
+new file mode 100644
+index 0000000..e462f56
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/en/asterisk.po
+@@ -0,0 +1,680 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:35+0200\n"
++"PO-Revision-Date: 2011-06-03 10:45+0200\n"
++"Last-Translator: Ladislav <suspend@tiscali.cz>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: en\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Asterisk General Options"
++
++#~ msgid "AGI directory"
++#~ msgstr "AGI directory"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Cache recorded sound files during recording"
++
++#~ msgid "Debug Level"
++#~ msgstr "Debug Level"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Disable some warnings"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Dump core on crash"
++
++#~ msgid "High Priority"
++#~ msgstr "High Priority"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Initialise Crypto"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Use Internal Timing"
++
++#~ msgid "Log directory"
++#~ msgstr "Log directory"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Maximum number of calls allowed"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Maximum load to stop accepting new calls"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Disable console colors"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Sound files Cache directory"
++
++#~ msgid "The Group to run as"
++#~ msgstr "The Group to run as"
++
++#~ msgid "The User to run as"
++#~ msgstr "The User to run as"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Voicemail Spool directory"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "Prefix UniquID with system name"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr "Build transcode paths via SLINEAR, not directly"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "Transmit SLINEAR silence while recording a channel"
++
++#~ msgid "Verbose Level"
++#~ msgstr "Verbose Level"
++
++#~ msgid "Section dialplan"
++#~ msgstr "Section dialplan"
++
++#~ msgid "include"
++#~ msgstr "include"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "Dialplan Extension"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "Dialplan General Options"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Allow transfer"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Clear global vars"
++
++#~ msgid "Dialplan Goto"
++#~ msgstr "Dialplan Goto"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "Dialplan Conference"
++
++#~ msgid "Dialplan Time"
++#~ msgstr "Dialplan Time"
++
++#~ msgid "Dialplan Voicemail"
++#~ msgstr "Dialplan Voicemail"
++
++#~ msgid "Dial Zones for Dialplan"
++#~ msgstr "Dial Zones for Dialplan"
++
++#~ msgid "Prefix to add matching dialplans"
++#~ msgstr "Prefix to add matching dialplans"
++
++#~ msgid "Match International prefix"
++#~ msgstr "Match International prefix"
++
++#~ msgid "Prefix (0) to add/remove to/from international numbers"
++#~ msgstr "Prefix (0) to add/remove to/from international numbers"
++
++#~ msgid "localzone"
++#~ msgstr "localzone"
++
++#~ msgid "Match plan"
++#~ msgstr "Match plan"
++
++#~ msgid "Connection to use"
++#~ msgstr "Connection to use"
++
++#~ msgid "Feature Key maps"
++#~ msgstr "Feature Key maps"
++
++#~ msgid "Attended transfer key"
++#~ msgstr "Attended transfer key"
++
++#~ msgid "Blind transfer key"
++#~ msgstr "Blind transfer key"
++
++#~ msgid "Key to Disconnect call"
++#~ msgstr "Key to Disconnect call"
++
++#~ msgid "Key to Park call"
++#~ msgstr "Key to Park call"
++
++#~ msgid "Parking Feature"
++#~ msgstr "Parking Feature"
++
++#~ msgid "ADSI Park"
++#~ msgstr "ADSI Park"
++
++#~ msgid "Attended transfer timeout (sec)"
++#~ msgstr "Attended transfer timeout (sec)"
++
++#~ msgid "One touch record key"
++#~ msgstr "One touch record key"
++
++#~ msgid "Name of call context for parking"
++#~ msgstr "Name of call context for parking"
++
++#~ msgid "Sound file to play to parked caller"
++#~ msgstr "Sound file to play to parked caller"
++
++#~ msgid "Max time (ms) between digits for feature activation"
++#~ msgstr "Max time (ms) between digits for feature activation"
++
++#~ msgid "Method to Find Parking slot"
++#~ msgstr "Method to Find Parking slot"
++
++#~ msgid "parkedmusicclass"
++#~ msgstr "parkedmusicclass"
++
++#~ msgid "Play courtesy tone to"
++#~ msgstr "Play courtesy tone to"
++
++#~ msgid "Enable Parking"
++#~ msgstr "Enable Parking"
++
++#~ msgid "Extension to dial to park"
++#~ msgstr "Extension to dial to park"
++
++#~ msgid "Parking time (secs)"
++#~ msgstr "Parking time (secs)"
++
++#~ msgid "Range of extensions for call parking"
++#~ msgstr "Range of extensions for call parking"
++
++#~ msgid "Pickup extension"
++#~ msgstr "Pickup extension"
++
++#~ msgid "Seconds to wait bewteen digits when transferring"
++#~ msgstr "Seconds to wait bewteen digits when transferring"
++
++#~ msgid "sound when attended transfer is complete"
++#~ msgstr "sound when attended transfer is complete"
++
++#~ msgid "Sound when attended transfer fails"
++#~ msgstr "Sound when attended transfer fails"
++
++#~ msgid "Reload Hardware Config"
++#~ msgstr "Reload Hardware Config"
++
++#~ msgid "Reboot Method"
++#~ msgstr "Reboot Method"
++
++#~ msgid "Parameter"
++#~ msgstr "Parameter"
++
++#~ msgid "Option type"
++#~ msgstr "Option type"
++
++#~ msgid "User name"
++#~ msgstr "User name"
++
++#~ msgid "IAX General Options"
++#~ msgstr "IAX General Options"
++
++#~ msgid "Allow Codecs"
++#~ msgstr "Allow Codecs"
++
++#~ msgid "Static"
++#~ msgstr "Static"
++
++#~ msgid "Write Protect"
++#~ msgstr "Write Protect"
++
++#~ msgid "Meetme Conference"
++#~ msgstr "Meetme Conference"
++
++#~ msgid "Admin PIN"
++#~ msgstr "Admin PIN"
++
++#~ msgid "Meeting PIN"
++#~ msgstr "Meeting PIN"
++
++#~ msgid "Meetme Conference General Options"
++#~ msgstr "Meetme Conference General Options"
++
++#~ msgid "Number of 20ms audio buffers to be used"
++#~ msgstr "Number of 20ms audio buffers to be used"
++
++#~ msgid "Modules"
++#~ msgstr "Modules"
++
++#~ msgid "Alarm Receiver Application"
++#~ msgstr "Alarm Receiver Application"
++
++#~ msgid "Authentication Application"
++#~ msgstr "Authentication Application"
++
++#~ msgid "Make sure asterisk doesnt save CDR"
++#~ msgstr "Make sure asterisk doesnt save CDR"
++
++#~ msgid "Check if channel is available"
++#~ msgstr "Check if channel is available"
++
++#~ msgid "Listen in on any channel"
++#~ msgstr "Listen in on any channel"
++
++#~ msgid "Control Playback Application"
++#~ msgstr "Control Playback Application"
++
++#~ msgid "Cuts up variables"
++#~ msgstr "Cuts up variables"
++
++#~ msgid "Database access functions"
++#~ msgstr "Database access functions"
++
++#~ msgid "Dialing Application"
++#~ msgstr "Dialing Application"
++
++#~ msgid "Virtual Dictation Machine Application"
++#~ msgstr "Virtual Dictation Machine Application"
++
++#~ msgid "Directed Call Pickup Support"
++#~ msgstr "Directed Call Pickup Support"
++
++#~ msgid "Extension Directory"
++#~ msgstr "Extension Directory"
++
++#~ msgid "DISA (Direct Inward System Access) Application"
++#~ msgstr "DISA (Direct Inward System Access) Application"
++
++#~ msgid "Dump channel variables Application"
++#~ msgstr "Dump channel variables Application"
++
++#~ msgid "Simple Echo Application"
++#~ msgstr "Simple Echo Application"
++
++#~ msgid "ENUM Lookup"
++#~ msgstr "ENUM Lookup"
++
++#~ msgid "Reevaluates strings"
++#~ msgstr "Reevaluates strings"
++
++#~ msgid "Executes applications"
++#~ msgstr "Executes applications"
++
++#~ msgid "External IVR application interface"
++#~ msgstr "External IVR application interface"
++
++#~ msgid "Fork The CDR into 2 seperate entities"
++#~ msgstr "Fork The CDR into 2 seperate entities"
++
++#~ msgid "Get ADSI CPE ID"
++#~ msgstr "Get ADSI CPE ID"
++
++#~ msgid "Group Management Routines"
++#~ msgstr "Group Management Routines"
++
++#~ msgid "Encode and Stream via icecast and ices"
++#~ msgstr "Encode and Stream via icecast and ices"
++
++#~ msgid "Image Transmission Application"
++#~ msgstr "Image Transmission Application"
++
++#~ msgid "Look up Caller*ID name/number from black"
++#~ msgstr "Look up Caller*ID name/number from black"
++
++#~ msgid "Look up CallerID Name from local databas"
++#~ msgstr "Look up CallerID Name from local databas"
++
++#~ msgid "Extension Macros"
++#~ msgstr "Extension Macros"
++
++#~ msgid "A simple math Application"
++#~ msgstr "A simple math Application"
++
++#~ msgid "MD5 checksum Application"
++#~ msgstr "MD5 checksum Application"
++
++#~ msgid "Digital Milliwatt (mu-law) Test Application"
++#~ msgstr "Digital Milliwatt (mu-law) Test Application"
++
++#~ msgid "Record a call and mix the audio during the recording"
++#~ msgstr "Record a call and mix the audio during the recording"
++
++#~ msgid "Call Parking and Announce Application"
++#~ msgstr "Call Parking and Announce Application"
++
++#~ msgid "Trivial Playback Application"
++#~ msgstr "Trivial Playback Application"
++
++#~ msgid "Require phone number to be entered"
++#~ msgstr "Require phone number to be entered"
++
++#~ msgid "True Call Queueing"
++#~ msgstr "True Call Queueing"
++
++#~ msgid "Random goto"
++#~ msgstr "Random goto"
++
++#~ msgid "Read Variable Application"
++#~ msgstr "Read Variable Application"
++
++#~ msgid "Read in a file"
++#~ msgstr "Read in a file"
++
++#~ msgid "Realtime Data Lookup/Rewrite"
++#~ msgstr "Realtime Data Lookup/Rewrite"
++
++#~ msgid "Trivial Record Application"
++#~ msgstr "Trivial Record Application"
++
++#~ msgid "Say time"
++#~ msgstr "Say time"
++
++#~ msgid "Send DTMF digits Application"
++#~ msgstr "Send DTMF digits Application"
++
++#~ msgid "Send Text Applications"
++#~ msgstr "Send Text Applications"
++
++#~ msgid "Set CallerID Application"
++#~ msgstr "Set CallerID Application"
++
++#~ msgid "CDR user field apps"
++#~ msgstr "CDR user field apps"
++
++#~ msgid "load => .so ; Set CallerID Name"
++#~ msgstr "load =&gt; .so ; Set CallerID Name"
++
++#~ msgid "load => .so ; Set CallerID Number"
++#~ msgstr "load =&gt; .so ; Set CallerID Number"
++
++#~ msgid "Set RDNIS Number"
++#~ msgstr "Set RDNIS Number"
++
++#~ msgid "Set ISDN Transfer Capability"
++#~ msgstr "Set ISDN Transfer Capability"
++
++#~ msgid "SMS/PSTN handler"
++#~ msgstr "SMS/PSTN handler"
++
++#~ msgid "Hangs up the requested channel"
++#~ msgstr "Hangs up the requested channel"
++
++#~ msgid "Stack Routines"
++#~ msgstr "Stack Routines"
++
++#~ msgid "Generic System() application"
++#~ msgstr "Generic System() application"
++
++#~ msgid "Playback with Talk Detection"
++#~ msgstr "Playback with Talk Detection"
++
++#~ msgid "Interface Test Application"
++#~ msgstr "Interface Test Application"
++
++#~ msgid "Transfer"
++#~ msgstr "Transfer"
++
++#~ msgid "TXTCIDName"
++#~ msgstr "TXTCIDName"
++
++#~ msgid "Send URL Applications"
++#~ msgstr "Send URL Applications"
++
++#~ msgid "Custom User Event Application"
++#~ msgstr "Custom User Event Application"
++
++#~ msgid "Send verbose output"
++#~ msgstr "Send verbose output"
++
++#~ msgid "Voicemail"
++#~ msgstr "Voicemail"
++
++#~ msgid "Waits until first ring after time"
++#~ msgstr "Waits until first ring after time"
++
++#~ msgid "Wait For Silence Application"
++#~ msgstr "Wait For Silence Application"
++
++#~ msgid "While Loops and Conditional Execution"
++#~ msgstr "While Loops and Conditional Execution"
++
++#~ msgid "Comma Separated Values CDR Backend"
++#~ msgstr "Comma Separated Values CDR Backend"
++
++#~ msgid "Customizable Comma Separated Values CDR Backend"
++#~ msgstr "Customizable Comma Separated Values CDR Backend"
++
++#~ msgid "Asterisk Call Manager CDR Backend"
++#~ msgstr "Asterisk Call Manager CDR Backend"
++
++#~ msgid "MySQL CDR Backend"
++#~ msgstr "MySQL CDR Backend"
++
++#~ msgid "PostgreSQL CDR Backend"
++#~ msgstr "PostgreSQL CDR Backend"
++
++#~ msgid "SQLite CDR Backend"
++#~ msgstr "SQLite CDR Backend"
++
++#~ msgid "Agent Proxy Channel"
++#~ msgstr "Agent Proxy Channel"
++
++#~ msgid "Option chan_iax2"
++#~ msgstr "Option chan_iax2"
++
++#~ msgid "Local Proxy Channel"
++#~ msgstr "Local Proxy Channel"
++
++#~ msgid "Session Initiation Protocol (SIP)"
++#~ msgstr "Session Initiation Protocol (SIP)"
++
++#~ msgid "Adaptive Differential PCM Coder/Decoder"
++#~ msgstr "Adaptive Differential PCM Coder/Decoder"
++
++#~ msgid "A-law Coder/Decoder"
++#~ msgstr "A-law Coder/Decoder"
++
++#~ msgid "A-law and Mulaw direct Coder/Decoder"
++#~ msgstr "A-law and Mulaw direct Coder/Decoder"
++
++#~ msgid "ITU G.726-32kbps G726 Transcoder"
++#~ msgstr "ITU G.726-32kbps G726 Transcoder"
++
++#~ msgid "GSM/PCM16 (signed linear) Codec Translation"
++#~ msgstr "GSM/PCM16 (signed linear) Codec Translation"
++
++#~ msgid "Speex/PCM16 (signed linear) Codec Translator"
++#~ msgstr "Speex/PCM16 (signed linear) Codec Translator"
++
++#~ msgid "Mu-law Coder/Decoder"
++#~ msgstr "Mu-law Coder/Decoder"
++
++#~ msgid "Sun Microsystems AU format (signed linear)"
++#~ msgstr "Sun Microsystems AU format (signed linear)"
++
++#~ msgid "G.723.1 Simple Timestamp File Format"
++#~ msgstr "G.723.1 Simple Timestamp File Format"
++
++#~ msgid "Raw G.726 (16/24/32/40kbps) data"
++#~ msgstr "Raw G.726 (16/24/32/40kbps) data"
++
++#~ msgid "Raw G729 data"
++#~ msgstr "Raw G729 data"
++
++#~ msgid "Raw GSM data"
++#~ msgstr "Raw GSM data"
++
++#~ msgid "Raw h263 data"
++#~ msgstr "Raw h263 data"
++
++#~ msgid "JPEG (Joint Picture Experts Group) Image"
++#~ msgstr "JPEG (Joint Picture Experts Group) Image"
++
++#~ msgid "Raw uLaw 8khz Audio support (PCM)"
++#~ msgstr "Raw uLaw 8khz Audio support (PCM)"
++
++#~ msgid "load => .so ; Raw aLaw 8khz PCM Audio support"
++#~ msgstr "load =&gt; .so ; Raw aLaw 8khz PCM Audio support"
++
++#~ msgid "Raw Signed Linear Audio support (SLN)"
++#~ msgstr "Raw Signed Linear Audio support (SLN)"
++
++#~ msgid "Dialogic VOX (ADPCM) File Format"
++#~ msgstr "Dialogic VOX (ADPCM) File Format"
++
++#~ msgid "Microsoft WAV format (8000hz Signed Line"
++#~ msgstr "Microsoft WAV format (8000hz Signed Line"
++
++#~ msgid "Microsoft WAV format (Proprietary GSM)"
++#~ msgstr "Microsoft WAV format (Proprietary GSM)"
++
++#~ msgid "Caller ID related dialplan functions"
++#~ msgstr "Caller ID related dialplan functions"
++
++#~ msgid "ENUM Functions"
++#~ msgstr "ENUM Functions"
++
++#~ msgid "URI encoding / decoding functions"
++#~ msgstr "URI encoding / decoding functions"
++
++#~ msgid "Asterisk Extension Language Compiler"
++#~ msgstr "Asterisk Extension Language Compiler"
++
++#~ msgid "Text Extension Configuration"
++#~ msgstr "Text Extension Configuration"
++
++#~ msgid "load => .so ; Builtin dialplan functions"
++#~ msgstr "load =&gt; .so ; Builtin dialplan functions"
++
++#~ msgid "Loopback Switch"
++#~ msgstr "Loopback Switch"
++
++#~ msgid "Realtime Switch"
++#~ msgstr "Realtime Switch"
++
++#~ msgid "Outgoing Spool Support"
++#~ msgstr "Outgoing Spool Support"
++
++#~ msgid "Wil Cal U (Auto Dialer)"
++#~ msgstr "Wil Cal U (Auto Dialer)"
++
++#~ msgid "MySQL Config Resource"
++#~ msgstr "MySQL Config Resource"
++
++#~ msgid "ODBC Config Resource"
++#~ msgstr "ODBC Config Resource"
++
++#~ msgid "PGSQL Module"
++#~ msgstr "PGSQL Module"
++
++#~ msgid "Cryptographic Digital Signatures"
++#~ msgstr "Cryptographic Digital Signatures"
++
++#~ msgid "Call Parking Resource"
++#~ msgstr "Call Parking Resource"
++
++#~ msgid "Indications Configuration"
++#~ msgstr "Indications Configuration"
++
++#~ msgid "Call Monitoring Resource"
++#~ msgstr "Call Monitoring Resource"
++
++#~ msgid "Music On Hold Resource"
++#~ msgstr "Music On Hold Resource"
++
++#~ msgid "ODBC Resource"
++#~ msgstr "ODBC Resource"
++
++#~ msgid "SMDI Module"
++#~ msgstr "SMDI Module"
++
++#~ msgid "SNMP Module"
++#~ msgstr "SNMP Module"
++
++#~ msgid "Music On Hold"
++#~ msgstr "Music On Hold"
++
++#~ msgid "Application"
++#~ msgstr "Application"
++
++#~ msgid "Directory of Music"
++#~ msgstr "Directory of Music"
++
++#~ msgid "Option mode"
++#~ msgstr "Option mode"
++
++#~ msgid "Random Play"
++#~ msgstr "Random Play"
++
++#~ msgid "DTMF mode"
++#~ msgstr "DTMF mode"
++
++#~ msgid "Primary domain identity for From: headers"
++#~ msgstr "Primary domain identity for From: headers"
++
++#~ msgid "From user (required by many SIP providers)"
++#~ msgstr "From user (required by many SIP providers)"
++
++#~ msgid "Ring on incoming dialplan contexts"
++#~ msgstr "Ring on incoming dialplan contexts"
++
++#~ msgid "Allow Insecure for"
++#~ msgstr "Allow Insecure for"
++
++#~ msgid "Mailbox for MWI"
++#~ msgstr "Mailbox for MWI"
++
++#~ msgid "NAT between phone and Asterisk"
++#~ msgstr "NAT between phone and Asterisk"
++
++#~ msgid "Check tags in headers"
++#~ msgstr "Check tags in headers"
++
++#~ msgid "Reply Timeout (ms) for down connection"
++#~ msgstr "Reply Timeout (ms) for down connection"
++
++#~ msgid "Register connection"
++#~ msgstr "Register connection"
++
++#~ msgid "Dial own extension for mailbox"
++#~ msgstr "Dial own extension for mailbox"
++
++#~ msgid "Client Type"
++#~ msgstr "Client Type"
++
++#~ msgid "Username"
++#~ msgstr "Username"
++
++#~ msgid "Section sipgeneral"
++#~ msgstr "Section sipgeneral"
++
++#~ msgid "Allow codecs"
++#~ msgstr "Allow codecs"
++
++#~ msgid "SIP realm"
++#~ msgstr "SIP realm"
++
++#~ msgid "Voicemail general options"
++#~ msgstr "Voicemail general options"
++
++#~ msgid "From Email address of server"
++#~ msgstr "From Email address of server"
++
++#~ msgid "Voice Mail boxes"
++#~ msgstr "Voice Mail boxes"
++
++#~ msgid "Email contains attachment"
++#~ msgstr "Email contains attachment"
++
++#~ msgid "Email"
++#~ msgstr "Email"
++
++#~ msgid "Display Name"
++#~ msgstr "Display Name"
++
++#~ msgid "Password"
++#~ msgstr "Password"
++
++#~ msgid "zone"
++#~ msgstr "zone"
++
++#~ msgid "Voice Zone settings"
++#~ msgstr "Voice Zone settings"
++
++#~ msgid "Message Format"
++#~ msgstr "Message Format"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/es/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/es/asterisk.po
+new file mode 100644
+index 0000000..8e2fe1e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/es/asterisk.po
+@@ -0,0 +1,355 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-04-16 00:52+0200\n"
++"Last-Translator: Jose <jarre2_es_jose@hotmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Opciones Generales de Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "Directorio AGI"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Almacena los ficheros de sonido mientras se graba"
++
++#~ msgid "Debug Level"
++#~ msgstr "Nivel de Depuración"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Desactivar algunos avisos"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Volcar núcleo en caso de fallo"
++
++#~ msgid "High Priority"
++#~ msgstr "Prioridad Alta"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Inicializar Crypto"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Usar temporización interna"
++
++#~ msgid "Log directory"
++#~ msgstr "Directorio de registro"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Número máximo de llamadas permitidas"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Carga máxima para dejar de admitir nuevas llamadas"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Desactivar colores en la consola"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Directorio de caché de archivos de sonido"
++
++#~ msgid "The Group to run as"
++#~ msgstr "Grupo en el que ejecutarse"
++
++#~ msgid "The User to run as"
++#~ msgstr "Usuario como el que se ejecutará"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Directorio de la cola de mensajes de voz"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "Prefijo UniquID con el nombre del sistema"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr ""
++#~ "Construir las rutas de transcodificación usando SLINEAR, no directamente"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "Transmitir silencio SLINEAR mientras graba un canal"
++
++#~ msgid "Verbose Level"
++#~ msgstr "Nivel de detalle"
++
++#~ msgid "Section dialplan"
++#~ msgstr "Sección Dialplan"
++
++#~ msgid "include"
++#~ msgstr "incluir"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "Extensión Dialplan"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "Opciones generales de Dialplan"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Permitir transferencia"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Limpiar las variables globales"
++
++#~ msgid "Dialplan Goto"
++#~ msgstr "Dialplan Goto"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "Conferencia Dialplan"
++
++#~ msgid "Dialplan Time"
++#~ msgstr "Dialplan Time"
++
++#~ msgid "Dialplan Voicemail"
++#~ msgstr "Buzón de voz de Dialplan"
++
++#~ msgid "Dial Zones for Dialplan"
++#~ msgstr "Zonas de marcado para Dialplan"
++
++#~ msgid "Prefix to add matching dialplans"
++#~ msgstr "Prefijo para añadir coincidencias de plan de marcado"
++
++#~ msgid "Match International prefix"
++#~ msgstr "Coincidir con el prefijo internacional"
++
++#~ msgid "Prefix (0) to add/remove to/from international numbers"
++#~ msgstr "Prefijo (0) para añadir/eliminar a/de números internacionales"
++
++#~ msgid "localzone"
++#~ msgstr "zona local"
++
++#~ msgid "Match plan"
++#~ msgstr "Coincidir con el plan"
++
++#~ msgid "Connection to use"
++#~ msgstr "Conexión que se utilizará"
++
++#~ msgid "Feature Key maps"
++#~ msgstr "Mapa de Funciones Clave"
++
++#~ msgid "Attended transfer key"
++#~ msgstr "Tecla de transferencia asistida"
++
++#~ msgid "Blind transfer key"
++#~ msgstr "Tecla de transferencia ciega"
++
++#~ msgid "Key to Disconnect call"
++#~ msgstr "Tecla para desconectar la llamada"
++
++#~ msgid "Key to Park call"
++#~ msgstr "Tecla para retener la llamada"
++
++#~ msgid "Parking Feature"
++#~ msgstr "Función de llamada en espera"
++
++#~ msgid "ADSI Park"
++#~ msgstr "Llamada en espera ADSI"
++
++#~ msgid "Attended transfer timeout (sec)"
++#~ msgstr "Tiempo de espera de transferencia asistida (seg)"
++
++#~ msgid "One touch record key"
++#~ msgstr "Tecla de grabacion con una sola tecla"
++
++#~ msgid "Name of call context for parking"
++#~ msgstr "Nombre del contexto de la llamada en espera"
++
++#~ msgid "Sound file to play to parked caller"
++#~ msgstr "Archivo de sonido para reproducir en la llamada en espera"
++
++#~ msgid "Max time (ms) between digits for feature activation"
++#~ msgstr "Tiempo máximo (en ms) entre digitos para la activación de funciones"
++
++#~ msgid "Method to Find Parking slot"
++#~ msgstr "Método para encontrar una ranura de llamada en espera"
++
++#~ msgid "parkedmusicclass"
++#~ msgstr "parkedmusicclass"
++
++#~ msgid "Play courtesy tone to"
++#~ msgstr "Reproducir tono de cortesía en"
++
++#~ msgid "Enable Parking"
++#~ msgstr "Activar llamadas en espera"
++
++#~ msgid "Extension to dial to park"
++#~ msgstr "Extensión a marcar para dejar en espera una llamada"
++
++#~ msgid "Parking time (secs)"
++#~ msgstr "Tiempo de llamada en espera (segs)"
++
++#~ msgid "Range of extensions for call parking"
++#~ msgstr "Rango de extensiones para llamadas en espera"
++
++#~ msgid "Pickup extension"
++#~ msgstr "Extensión de Pickup"
++
++#~ msgid "Seconds to wait bewteen digits when transferring"
++#~ msgstr "Segundos de espera entre digitos mientras se transfiere"
++
++#~ msgid "sound when attended transfer is complete"
++#~ msgstr "sonido cuando se completa la transferencia asistida"
++
++#~ msgid "Sound when attended transfer fails"
++#~ msgstr "sonido para cuando falla la transferencia asistida"
++
++#~ msgid "Reload Hardware Config"
++#~ msgstr "Recargar la configuración del Hardware"
++
++#~ msgid "Reboot Method"
++#~ msgstr "Método de reinicio"
++
++#~ msgid "Parameter"
++#~ msgstr "Parámetro"
++
++#~ msgid "Option type"
++#~ msgstr "Tipo de opción"
++
++#~ msgid "User name"
++#~ msgstr "Nombre de Usuario"
++
++#~ msgid "IAX General Options"
++#~ msgstr "Opciones Generales de IAX"
++
++#~ msgid "Allow Codecs"
++#~ msgstr "Permitir Codecs"
++
++#~ msgid "Static"
++#~ msgstr "Estático"
++
++#~ msgid "Write Protect"
++#~ msgstr "Protección contra escritura"
++
++#~ msgid "Meetme Conference"
++#~ msgstr "Conferencia Meetme (entre dos)"
++
++#~ msgid "Admin PIN"
++#~ msgstr "PIN de Administrador"
++
++#~ msgid "Meeting PIN"
++#~ msgstr "PIN de Reunión (Meeting)"
++
++#~ msgid "Meetme Conference General Options"
++#~ msgstr "Opciones generales de conferencia Meetme (entre dos)"
++
++#~ msgid "Number of 20ms audio buffers to be used"
++#~ msgstr "Número de memorias intermedias de audio de 20 ms a utilizar"
++
++#~ msgid "Modules"
++#~ msgstr "Módulos"
++
++#~ msgid "Alarm Receiver Application"
++#~ msgstr "Aplicación de Recepción de Alarma"
++
++#~ msgid "Authentication Application"
++#~ msgstr "Aplicación de autenticación"
++
++#~ msgid "Make sure asterisk doesnt save CDR"
++#~ msgstr "Asegúrate que asterisk no graba CDR"
++
++#~ msgid "Check if channel is available"
++#~ msgstr "Comprueba que el canal esté disponible"
++
++#~ msgid "Listen in on any channel"
++#~ msgstr "Escuchar en cualquier canal"
++
++#~ msgid "Control Playback Application"
++#~ msgstr "Aplicación para el control de reproducción"
++
++#~ msgid "Cuts up variables"
++#~ msgstr "Variables de corte"
++
++#~ msgid "Database access functions"
++#~ msgstr "Funciones de acceso a la Base de Datos"
++
++#~ msgid "Dialing Application"
++#~ msgstr "Aplicación de marcado telefónico"
++
++#~ msgid "Virtual Dictation Machine Application"
++#~ msgstr "Aplicación de máquina de Dictado Virtual"
++
++#~ msgid "Directed Call Pickup Support"
++#~ msgstr "Apoyo a la captura de llamadas dirigidas"
++
++#~ msgid "Extension Directory"
++#~ msgstr "Directorio de Extensiones"
++
++#~ msgid "DISA (Direct Inward System Access) Application"
++#~ msgstr "Aplicación DISA (Acceso directo entrante al sistema)"
++
++#~ msgid "Simple Echo Application"
++#~ msgstr "Aplicación de Eco Simple"
++
++#~ msgid "ENUM Lookup"
++#~ msgstr "Consulta ENUM"
++
++#~ msgid "Reevaluates strings"
++#~ msgstr "Reevaluar secuencia de caracteres"
++
++#~ msgid "Executes applications"
++#~ msgstr "Ejecuta aplicaciones"
++
++#~ msgid "External IVR application interface"
++#~ msgstr "Interfaz de aplicación IVR externa"
++
++#~ msgid "Fork The CDR into 2 seperate entities"
++#~ msgstr "Bifurcar el CDR en 2 entidades separadas"
++
++#~ msgid "Get ADSI CPE ID"
++#~ msgstr "Obtener el ADSI CPE ID"
++
++#~ msgid "Group Management Routines"
++#~ msgstr "Rutinas de Administración de grupo"
++
++#~ msgid "Encode and Stream via icecast and ices"
++#~ msgstr "Codifica y emite a través de icecast e ices"
++
++#~ msgid "Image Transmission Application"
++#~ msgstr "Aplicación de transmisión de imagen"
++
++#~ msgid "Look up Caller*ID name/number from black"
++#~ msgstr "Buscar la identidad del llamante nombre/número en la lista negra"
++
++#~ msgid "Look up CallerID Name from local databas"
++#~ msgstr ""
++#~ "Buscar el nombre de identidad del llamante en las bases de datos locales"
++
++#~ msgid "Extension Macros"
++#~ msgstr "Macros de Extensión"
++
++#~ msgid "A simple math Application"
++#~ msgstr "Una simple aplicación matemática"
++
++#~ msgid "MD5 checksum Application"
++#~ msgstr "Aplicación de suma de verificación MD5"
++
++#~ msgid "Digital Milliwatt (mu-law) Test Application"
++#~ msgstr "Aplicación de testeo de Milivatios Digitales (mu-law)"
++
++#~ msgid "Record a call and mix the audio during the recording"
++#~ msgstr "Grabar una llamada y mezclar el sonido durante la grabación"
++
++#~ msgid "Call Parking and Announce Application"
++#~ msgstr "Aplicación de Anuncio y Llamada en Espera"
++
++#~ msgid "Trivial Playback Application"
++#~ msgstr "Aplicación de reproducción trivial"
++
++#~ msgid "Require phone number to be entered"
++#~ msgstr "Requiere que se introduzca un número de teléfono"
++
++#~ msgid "True Call Queueing"
++#~ msgstr "Lista de espera real de llamadas"
++
++#~ msgid "Random goto"
++#~ msgstr "Goto (ir a) Aleatorio"
++
++#~ msgid "Read Variable Application"
++#~ msgstr "Aplicación de lectura de variables"
++
++#~ msgid "Read in a file"
++#~ msgstr "Leer en un archivo"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/fr/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/fr/asterisk.po
+new file mode 100644
+index 0000000..75c1d38
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/fr/asterisk.po
+@@ -0,0 +1,569 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2011-11-23 22:34+0200\n"
++"Last-Translator: fredb <fblistes+luci@free.fr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Paramètres généraux d'Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "Répertoire AGI"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Mes les sons enregistrés en cache pendant l'enregistrement"
++
++#~ msgid "Debug Level"
++#~ msgstr "Niveau de déboguage"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Désactiver certaines alertes"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Créer une image-core en cas de crash"
++
++#~ msgid "High Priority"
++#~ msgstr "Priorité haute"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Initialise le chiffrage"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Utiliser un délai interne"
++
++#~ msgid "Log directory"
++#~ msgstr "Répertoire des journaux"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Nombre maximum d'appels autorisés"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Charge maximum jusqu'à laquelle on accepte de nouveaux appels"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Désactiver les couleurs de la console"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Répertoire de cache des ficihers-sons"
++
++#~ msgid "The Group to run as"
++#~ msgstr "Exécuté avec ce groupe"
++
++#~ msgid "The User to run as"
++#~ msgstr "Exécuté avec cet utilisateur"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Répertoire de stockage du répondeur"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "Préfixer le « UniquID » avec le nom du système"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr "Construire des chemins de traduction via SLINEAR, pas directement"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "Transmettre le silence SLINEAR lors de l'enregistrement d'un canal"
++
++#~ msgid "Verbose Level"
++#~ msgstr "Niveau de verbosité"
++
++#~ msgid "Section dialplan"
++#~ msgstr "Section du plan de numérotation"
++
++#~ msgid "include"
++#~ msgstr "Inclure"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "Extension du plan de numérotation"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "Paramètres généraux du plan de numérotation"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Permettre le transfert"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Effacer les variables globales"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "Règles d'aiguillage pour la conférence"
++
++#~ msgid "Dialplan Time"
++#~ msgstr "Règles d'aiguillage liées au temps"
++
++#~ msgid "Dialplan Voicemail"
++#~ msgstr "Règles d'aiguillage de la messagerie vocale"
++
++#~ msgid "Match International prefix"
++#~ msgstr "Préfixe correspondant à l'international"
++
++#~ msgid "Prefix (0) to add/remove to/from international numbers"
++#~ msgstr "Préfixe (0) à ajouter à/retirer d'un numéro international"
++
++#~ msgid "localzone"
++#~ msgstr "zone locale"
++
++#~ msgid "Match plan"
++#~ msgstr "Règle de correspondance"
++
++#~ msgid "Connection to use"
++#~ msgstr "Connexion à utiliser"
++
++#~ msgid "Blind transfer key"
++#~ msgstr "Touche de transfert en aveugle"
++
++#~ msgid "Key to Disconnect call"
++#~ msgstr "Touche pour déconnecter un appel"
++
++#~ msgid "Key to Park call"
++#~ msgstr "Touche pour parquer un appel"
++
++#~ msgid "Parking Feature"
++#~ msgstr "Capacité de mise en parking"
++
++#~ msgid "ADSI Park"
++#~ msgstr "Parking ADSI"
++
++#~ msgid "Attended transfer timeout (sec)"
++#~ msgstr "Délai max d'un transfert programmé (secondes)"
++
++#~ msgid "Name of call context for parking"
++#~ msgstr "Nom du contexte d'appel pour une mise en parking"
++
++#~ msgid "Sound file to play to parked caller"
++#~ msgstr "Fichier-son à jouer aux appelants mis en parking"
++
++#~ msgid "Max time (ms) between digits for feature activation"
++#~ msgstr ""
++#~ "Durée max (en ms) entre les chiffres pour l'activation d'une commande"
++
++#~ msgid "Method to Find Parking slot"
++#~ msgstr "Méthode pour trouver une place de parking"
++
++#~ msgid "Play courtesy tone to"
++#~ msgstr "Jouer une tonalité de courtoisie à"
++
++#~ msgid "Enable Parking"
++#~ msgstr "Activer la mise en parking"
++
++#~ msgid "Parking time (secs)"
++#~ msgstr "Durée de mise en parking (secondes)"
++
++#~ msgid "Seconds to wait bewteen digits when transferring"
++#~ msgstr "Attente en secondes entre les chiffres Lors d'un transfert"
++
++#~ msgid "sound when attended transfer is complete"
++#~ msgstr "Son joué quand un transfert programmé est effectué"
++
++#~ msgid "Sound when attended transfer fails"
++#~ msgstr "Son joué quand nu transfert programmé rate"
++
++#~ msgid "Reload Hardware Config"
++#~ msgstr "Relit la configuration matérielle"
++
++#~ msgid "Reboot Method"
++#~ msgstr "Méthode de redémarrage"
++
++#~ msgid "Parameter"
++#~ msgstr "Paramètre"
++
++#~ msgid "Option type"
++#~ msgstr "Type d'option"
++
++#~ msgid "User name"
++#~ msgstr "Nom d'utilisateur"
++
++#~ msgid "IAX General Options"
++#~ msgstr "Paramètres généraux du protocole IAX"
++
++#~ msgid "Allow Codecs"
++#~ msgstr "Codecs autorisés"
++
++#~ msgid "Static"
++#~ msgstr "Statique"
++
++#~ msgid "Write Protect"
++#~ msgstr "Protection contre l'écriture"
++
++#~ msgid "Meetme Conference"
++#~ msgstr "Conférence « Meetme »"
++
++#~ msgid "Admin PIN"
++#~ msgstr "ID d'administrateur"
++
++#~ msgid "Meeting PIN"
++#~ msgstr "Code de conférence"
++
++#~ msgid "Meetme Conference General Options"
++#~ msgstr "Options générales de conférence « Meetme »"
++
++#~ msgid "Number of 20ms audio buffers to be used"
++#~ msgstr "Nombre de buffers audio de 20 ms à utiliser"
++
++#~ msgid "Modules"
++#~ msgstr "Modules"
++
++#~ msgid "Alarm Receiver Application"
++#~ msgstr "Application de réception d'alarme"
++
++#~ msgid "Authentication Application"
++#~ msgstr "Application d'authentification"
++
++#~ msgid "Make sure asterisk doesnt save CDR"
++#~ msgstr "S'assure qu'Asterisk ne sauve pas le CDR"
++
++#~ msgid "Check if channel is available"
++#~ msgstr "Vérifie que le canal est libre"
++
++#~ msgid "Listen in on any channel"
++#~ msgstr "Écoute sur n'importe quel canal"
++
++#~ msgid "Database access functions"
++#~ msgstr "Fonctions d'accès aux bases de données"
++
++#~ msgid "Dialing Application"
++#~ msgstr "Application de numérotation"
++
++#~ msgid "Virtual Dictation Machine Application"
++#~ msgstr "Application de dictaphone virtuel"
++
++#~ msgid "Dump channel variables Application"
++#~ msgstr "Application de copie des variables d'un canal"
++
++#~ msgid "Simple Echo Application"
++#~ msgstr "Application de simple écho"
++
++#~ msgid "ENUM Lookup"
++#~ msgstr "Résolution d'un ENUM"
++
++#~ msgid "Reevaluates strings"
++#~ msgstr "Ré-évaluer les chaînes"
++
++#~ msgid "Executes applications"
++#~ msgstr "Lance les applications"
++
++#~ msgid "External IVR application interface"
++#~ msgstr "Interface d'application SVI externe"
++
++#~ msgid "Fork The CDR into 2 seperate entities"
++#~ msgstr "Dupliquer le CDR en deux entités séparées"
++
++#~ msgid "Get ADSI CPE ID"
++#~ msgstr "Obtenir le « ADSI CPE ID »"
++
++#~ msgid "Group Management Routines"
++#~ msgstr "Fonctions de gestion des groupes"
++
++#~ msgid "Encode and Stream via icecast and ices"
++#~ msgstr "Coder et diffuser via icecast et ices"
++
++#~ msgid "Image Transmission Application"
++#~ msgstr "Application d'envoi d'image"
++
++#~ msgid "Look up CallerID Name from local databas"
++#~ msgstr "Rechercher le nom de l'appelant dans la base locale"
++
++#~ msgid "Extension Macros"
++#~ msgstr "Macros d'extension"
++
++#~ msgid "A simple math Application"
++#~ msgstr "Une simple application mathématique"
++
++#~ msgid "MD5 checksum Application"
++#~ msgstr "Application de signature MD5"
++
++#~ msgid "Record a call and mix the audio during the recording"
++#~ msgstr "Enregistre un appelle et mixe le son pendant l'enregistrement"
++
++#~ msgid "Call Parking and Announce Application"
++#~ msgstr "Application de mise en parking d'appel et annonce"
++
++#~ msgid "Trivial Playback Application"
++#~ msgstr "Application de simple écoute"
++
++#~ msgid "Require phone number to be entered"
++#~ msgstr "Nécessite d'entrer un numéro de téléphone"
++
++#~ msgid "True Call Queueing"
++#~ msgstr "Véritable sérialisation des appels"
++
++#~ msgid "Read Variable Application"
++#~ msgstr "Application de lecture d'une variable"
++
++#~ msgid "Read in a file"
++#~ msgstr "Lire dans un fichier"
++
++#~ msgid "Realtime Data Lookup/Rewrite"
++#~ msgstr "Recherche/ré-écriture de données en temps-réel"
++
++#~ msgid "Trivial Record Application"
++#~ msgstr "Application de simple enregistrement"
++
++#~ msgid "Say time"
++#~ msgstr "Dis l'heure"
++
++#~ msgid "Send DTMF digits Application"
++#~ msgstr "Application d'envoi de chiffres en DTMF"
++
++#~ msgid "Send Text Applications"
++#~ msgstr "Applications d'envoi de texte"
++
++#~ msgid "Set CallerID Application"
++#~ msgstr "Application de positionnement de l'identifiant de l'appelant"
++
++#~ msgid "load => .so ; Set CallerID Name"
++#~ msgstr ""
++#~ "charger => .so ; Positionner le nom dans l'identifiant de l'appelant"
++
++#~ msgid "load => .so ; Set CallerID Number"
++#~ msgstr ""
++#~ "charger => .so ; Positionner le numéro dans l'identifiant de l'appelant"
++
++#~ msgid "Set RDNIS Number"
++#~ msgstr "Positionner le numéro RDNIS"
++
++#~ msgid "Set ISDN Transfer Capability"
++#~ msgstr "Activer la possibilité de transfert RNIS"
++
++#~ msgid "SMS/PSTN handler"
++#~ msgstr "Gestionnaire SMS/RTC"
++
++#~ msgid "Hangs up the requested channel"
++#~ msgstr "Raccroche le canal demandé"
++
++#~ msgid "Stack Routines"
++#~ msgstr "Empile les routines"
++
++#~ msgid "Generic System() application"
++#~ msgstr "Application générique System()"
++
++#~ msgid "Playback with Talk Detection"
++#~ msgstr "Jouer un son avec la détection de parole"
++
++#~ msgid "Interface Test Application"
++#~ msgstr "Application de test d'interface"
++
++#~ msgid "Transfer"
++#~ msgstr "Transfert"
++
++#~ msgid "Send URL Applications"
++#~ msgstr "Applications d'envois d'URL"
++
++#~ msgid "Send verbose output"
++#~ msgstr "Envoyer une sortie détaillée"
++
++#~ msgid "Voicemail"
++#~ msgstr "Répondeur"
++
++#~ msgid "Wait For Silence Application"
++#~ msgstr "Application d'attente de silence"
++
++#~ msgid "Session Initiation Protocol (SIP)"
++#~ msgstr "Session Initiation Protocol (SIP)"
++
++#~ msgid "Adaptive Differential PCM Coder/Decoder"
++#~ msgstr "Codec PCM différentiel adaptatif (ADPCM)"
++
++#~ msgid "A-law Coder/Decoder"
++#~ msgstr "Codec loi-A"
++
++#~ msgid "A-law and Mulaw direct Coder/Decoder"
++#~ msgstr "Codec loi-A et loi-Mu directs"
++
++#~ msgid "ITU G.726-32kbps G726 Transcoder"
++#~ msgstr "Transcodeur G726 (ITU G.726 32 kbit/s)"
++
++#~ msgid "GSM/PCM16 (signed linear) Codec Translation"
++#~ msgstr "Codec de traduction GSM/PCM16 (linéaire signé)"
++
++#~ msgid "Speex/PCM16 (signed linear) Codec Translator"
++#~ msgstr "Codec de traduction Speex/PCM16 (linéaire signé)"
++
++#~ msgid "Mu-law Coder/Decoder"
++#~ msgstr "Codec loi-Mu"
++
++#~ msgid "Sun Microsystems AU format (signed linear)"
++#~ msgstr "Format Sun Microsystems AU (linéaire signé)"
++
++#~ msgid "G.723.1 Simple Timestamp File Format"
++#~ msgstr "Format de fichier G.723.1 à horodatage simple"
++
++#~ msgid "Raw G.726 (16/24/32/40kbps) data"
++#~ msgstr "Données brutes G.726 (16/24/32/40 kbit/s)"
++
++#~ msgid "Raw G729 data"
++#~ msgstr "Données brutes G729"
++
++#~ msgid "Raw GSM data"
++#~ msgstr "Données brutes GSM"
++
++#~ msgid "Raw h263 data"
++#~ msgstr "Données brutes h263"
++
++#~ msgid "JPEG (Joint Picture Experts Group) Image"
++#~ msgstr "Image JPEG (Joint Picture Experts Group)"
++
++#~ msgid "Raw uLaw 8khz Audio support (PCM)"
++#~ msgstr "Gestion de l'audio en loi-µ 8 kHz brute (PCM)"
++
++#~ msgid "load => .so ; Raw aLaw 8khz PCM Audio support"
++#~ msgstr "Charger => .so ; Gestion de l'audio en loi-A brute PCM 8 kHz"
++
++#~ msgid "Raw Signed Linear Audio support (SLN)"
++#~ msgstr "Gestion de l'audio en linéaire signé brut (SLN)"
++
++#~ msgid "Dialogic VOX (ADPCM) File Format"
++#~ msgstr "Format de fichier Dialogic VOX (ADPCM)"
++
++#~ msgid "Microsoft WAV format (8000hz Signed Line"
++#~ msgstr "Format Microsoft WAV (8 kHz linéaire signé)"
++
++#~ msgid "Microsoft WAV format (Proprietary GSM)"
++#~ msgstr "Format Microsoft WAV (GSM propriétaire)"
++
++#~ msgid "Caller ID related dialplan functions"
++#~ msgstr "Fonctions d'aiguillage des appels liées à l'identifiant d'appel"
++
++#~ msgid "ENUM Functions"
++#~ msgstr "Fonctions ENUM"
++
++#~ msgid "URI encoding / decoding functions"
++#~ msgstr "Fonctions de codage/décodage des URI"
++
++#~ msgid "Asterisk Extension Language Compiler"
++#~ msgstr "Compilateur du langage d'extension d'Asterisk"
++
++#~ msgid "Text Extension Configuration"
++#~ msgstr "Configuration de l'extension Texte"
++
++#~ msgid "load => .so ; Builtin dialplan functions"
++#~ msgstr "charger => .so ; fonctions natives d'aiguillages des appels"
++
++#~ msgid "Outgoing Spool Support"
++#~ msgstr "Gestion d'un spool sortant"
++
++#~ msgid "Wil Cal U (Auto Dialer)"
++#~ msgstr "Wil Cal U (composeur automatique)"
++
++#~ msgid "MySQL Config Resource"
++#~ msgstr "Ressource de configuration de MySQL"
++
++#~ msgid "ODBC Config Resource"
++#~ msgstr "Ressource de configuration d'ODBC"
++
++#~ msgid "PGSQL Module"
++#~ msgstr "Module PGSQL"
++
++#~ msgid "Cryptographic Digital Signatures"
++#~ msgstr "Signatures de chiffrage numérique"
++
++#~ msgid "Call Parking Resource"
++#~ msgstr "Ressource de mise en parking des appels"
++
++#~ msgid "Call Monitoring Resource"
++#~ msgstr "Ressource de supervision des appels"
++
++#~ msgid "Music On Hold Resource"
++#~ msgstr "Ressource de mise en attente musicale"
++
++#~ msgid "ODBC Resource"
++#~ msgstr "Ressource ODBC"
++
++#~ msgid "SMDI Module"
++#~ msgstr "Module SMDI"
++
++#~ msgid "SNMP Module"
++#~ msgstr "Module SNMP"
++
++#~ msgid "Music On Hold"
++#~ msgstr "Mise en attente musicale"
++
++#~ msgid "Application"
++#~ msgstr "Application"
++
++#~ msgid "Directory of Music"
++#~ msgstr "Répertoire sonore"
++
++#~ msgid "Random Play"
++#~ msgstr "morceau choisi aléatoirement"
++
++#~ msgid "DTMF mode"
++#~ msgstr "Mode DTMF"
++
++#~ msgid "Primary domain identity for From: headers"
++#~ msgstr "Identité du domaine primaire pour les entêtes « From: »"
++
++#~ msgid "From user (required by many SIP providers)"
++#~ msgstr "Utilisateur « From » (requis par de nombreux fournisseurs SIP)"
++
++#~ msgid "Allow Insecure for"
++#~ msgstr "Autoriser le mode non sécurisé pour"
++
++#~ msgid "Mailbox for MWI"
++#~ msgstr "Boîte aux lettres pour MWI"
++
++#~ msgid "NAT between phone and Asterisk"
++#~ msgstr "NAT entre le téléphone et Asterisk"
++
++#~ msgid "Check tags in headers"
++#~ msgstr "Vérifier les « tags » dans les entêtes"
++
++#~ msgid "Reply Timeout (ms) for down connection"
++#~ msgstr "Délai de réponse (en ms) indiquant une connexion tombée"
++
++#~ msgid "Register connection"
++#~ msgstr "Connexion au registre"
++
++#~ msgid "Client Type"
++#~ msgstr "Type de client"
++
++#~ msgid "Username"
++#~ msgstr "Nom d'utilisateur"
++
++#~ msgid "Section sipgeneral"
++#~ msgstr "Section générale SIP"
++
++#~ msgid "Allow codecs"
++#~ msgstr "Codecs autorisés"
++
++#~ msgid "SIP realm"
++#~ msgstr "Domaine SIP"
++
++#~ msgid "Voicemail general options"
++#~ msgstr "Options générales de la messagerie vocale"
++
++#~ msgid "From Email address of server"
++#~ msgstr "Adresse de courrier électronique source du serveur"
++
++#~ msgid "Voice Mail boxes"
++#~ msgstr "Boîtes de messagerie vocale"
++
++#~ msgid "Email contains attachment"
++#~ msgstr "Courriel contenant une pièce-jointe"
++
++#~ msgid "Email"
++#~ msgstr "Courriel"
++
++#~ msgid "Display Name"
++#~ msgstr "Nom affiché"
++
++#~ msgid "Password"
++#~ msgstr "Mot de passe"
++
++#~ msgid "zone"
++#~ msgstr "zone"
++
++#~ msgid "Voice Zone settings"
++#~ msgstr "Paramètres de la zone Voix"
++
++#~ msgid "Message Format"
++#~ msgstr "Format de message"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/he/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/he/asterisk.po
+new file mode 100644
+index 0000000..25ed5bb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/he/asterisk.po
+@@ -0,0 +1,194 @@
++# asterisk.pot
++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-07-14 12:48+0200\n"
++"Last-Translator: zstorch <zstorch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "הגדרות כלליות של Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "תיקית AGI"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "שמור ×ת קבצי הקול במהלך ההקלטה"
++
++#~ msgid "Debug Level"
++#~ msgstr "רמת מצב ניפוי שגי×ות"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "בטל חלק מה×זהרות"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "תעד ×ת מצב הליבה בעת נפילת המערכת"
++
++#~ msgid "High Priority"
++#~ msgstr "עדיפות גבוהה"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "מפעיל ×ת Crypto"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "השתמש בשעון הפנימי"
++
++#~ msgid "Log directory"
++#~ msgstr "תיקית התיעוד"
++
++# צריך לבדוק ×× ×ž×“×•×‘×¨ על שיחות "בו זמנית" ×× ×›×Ÿ חשוב לציין ×× ×œ× ×”× ×œ טעות חמורה
++#, fuzzy
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "×ž×§×¡×™×ž×•× ×©×™×—×•×ª בו זמנית"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "מקסימות שיחות שבו המערכת תדחה שיחות נוספות"
++
++#~ msgid "Disable console colors"
++#~ msgstr "בטל ×¦×‘×¢×™× ×‘×ž×¡×•×£"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "תיקית קבצי הקול"
++
++#~ msgid "The Group to run as"
++#~ msgstr "הפעל ×¢× ×”×¨×©×ות קבוצת"
++
++#~ msgid "The User to run as"
++#~ msgstr "הפעל ×¢× ×”×¨×©×ות משתמש"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "תיקית ×”×ª× ×§×•×œ×™"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "הוסף לUniquID ×ת ×©× ×”×ž×¢×¨×›×ª"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr "המר תבניות קול ישירות ×¢× SLINEAR"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "שדר שקט של SLINEAR במהלך הקלטה"
++
++#~ msgid "Verbose Level"
++#~ msgstr "רמת דו\"ח המערכת"
++
++#~ msgid "Time Zone"
++#~ msgstr "×זור זמן"
++
++#~ msgid "Section dialplan"
++#~ msgstr "מחלקה בתוכנית השיחות"
++
++#~ msgid "include"
++#~ msgstr "כולל"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "שלוחה בתוכנית השיחות"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "הגדרות כללית של תוכנית השיחות"
++
++#~ msgid "Allow transfer"
++#~ msgstr "×פשר העברה"
++
++#~ msgid "Clear global vars"
++#~ msgstr "נקה ×ž×©×ª× ×™× ×›×œ×œ×™×"
++
++#~ msgid "Dialplan Goto"
++#~ msgstr "\"לך ×ל\" בתוכנית השיחות"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "שיחת ועידה בתוכנית השיחות"
++
++#~ msgid "Dialplan Time"
++#~ msgstr "זמן בתוכנית השיחות"
++
++#~ msgid "Dialplan Voicemail"
++#~ msgstr "×ª× ×§×•×œ×™ בתוכנית השיחות"
++
++#~ msgid "Dial Zones for Dialplan"
++#~ msgstr "×זורי חיוג עבור תוכנית השיחות"
++
++#~ msgid "Prefix to add matching dialplans"
++#~ msgstr "קידומת להוספה עבור תוכניות שיחה דומות"
++
++#~ msgid "Match International prefix"
++#~ msgstr "השווה קידומת בין ל×ומית"
++
++#~ msgid "Prefix (0) to add/remove to/from international numbers"
++#~ msgstr "קידומת (0) להוספה ×ו הסרה במספר בין ל×ומי"
++
++#~ msgid "localzone"
++#~ msgstr "מיקו×"
++
++#~ msgid "Match plan"
++#~ msgstr "תוכנית מת×ימה"
++
++#~ msgid "Connection to use"
++#~ msgstr "השתמש בחיבור מסוג"
++
++#~ msgid "Feature Key maps"
++#~ msgstr "מיפוי ×ž×§×©×™× ×™×¢×•×“×™×™×"
++
++#~ msgid "NAT between phone and Asterisk"
++#~ msgstr "נתב (NAT) בין מכשיר הטלפון לAsterisk"
++
++#~ msgid "Check tags in headers"
++#~ msgstr "בדוק ×ת התגיות בהקדמה"
++
++#, fuzzy
++#~ msgid "Reply Timeout (ms) for down connection"
++#~ msgstr "החזר ×ת פרק זמן (timeout) במילישניות עבור ×—×‘×•×¨×™× ×¡×’×•×¨×™×"
++
++#~ msgid "Register connection"
++#~ msgstr "חיבור ×¨×©×•× (מנוי)"
++
++#~ msgid "Dial own extension for mailbox"
++#~ msgstr "חיוג סיפרה בודדת עבור ×ª× ×“×•×ר"
++
++#~ msgid "Client Type"
++#~ msgstr "סוג הלקוח"
++
++#~ msgid "Username"
++#~ msgstr "×©× ×ž×©×ª×ž×©"
++
++#~ msgid "Allow codecs"
++#~ msgstr "×ž×§×•×“×“×™× ×ž×ושרי×"
++
++#~ msgid "SIP realm"
++#~ msgstr "×ž×ª×—× SIP"
++
++#~ msgid "Voicemail general options"
++#~ msgstr "הגדרות כלליות עבור ×”×ª× ×§×•×œ×™"
++
++#~ msgid "From Email address of server"
++#~ msgstr "שדה דו×ר ×לקטרוני מ×ת (של השרת)"
++
++#~ msgid "Voice Mail boxes"
++#~ msgstr "ת××™× ×§×•×œ×™×™×"
++
++#~ msgid "Email contains attachment"
++#~ msgstr "מצורף תוכן ההודעה"
++
++#~ msgid "Email"
++#~ msgstr "דו×ר ×לקטרוני"
++
++#~ msgid "Display Name"
++#~ msgstr "×©× ×ª×¦×•×’×”"
++
++#~ msgid "Password"
++#~ msgstr "סיסמה"
++
++#~ msgid "zone"
++#~ msgstr "×זור"
++
++#~ msgid "Voice Zone settings"
++#~ msgstr "הגדרות ×זוריות עבור הקול"
++
++#~ msgid "Message Format"
++#~ msgstr "תבנית ההודעה"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/hu/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/hu/asterisk.po
+new file mode 100644
+index 0000000..c6a5d81
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/hu/asterisk.po
+@@ -0,0 +1,134 @@
++# asterisk.pot
++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-18 23:18+0200\n"
++"Last-Translator: Anonymous Pootle User\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Ãltalános Asterisk beállítások"
++
++#~ msgid "AGI directory"
++#~ msgstr "AGI könyvtár"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "A felvett hang fájlok gyorsítótárazása a felvétel alatt"
++
++#~ msgid "Debug Level"
++#~ msgstr "Nyomkövetési szint"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Néhány figyelmeztetés letilása"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Memóriatartalom kiírása összeomláskor"
++
++#~ msgid "High Priority"
++#~ msgstr "Magas prioritás"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Titkosítás inicializálása"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Belső időzítés használata"
++
++#~ msgid "Log directory"
++#~ msgstr "Napló könyvtár"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "A hivások megengedett maximális száma"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "A CPU maximális terhelése új hívások fogadásához"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Konzol színek letiltása"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "A gyorsítótárazott hang fájlok könyvtára"
++
++#~ msgid "The Group to run as"
++#~ msgstr "Csoport futtatása mint"
++
++#~ msgid "The User to run as"
++#~ msgstr "Felhasználó futtatása mint"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Hangposta puffer könyvtár"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "Rendszer név használata UniquID előtagként"
++
++#~ msgid "Verbose Level"
++#~ msgstr "Részletes szint"
++
++#~ msgid "Time Zone"
++#~ msgstr "Időzóna"
++
++#~ msgid "include"
++#~ msgstr "tartalmaz"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Ãtvitel engedélyezése"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Globális változók törlése"
++
++#~ msgid "Enable Parking"
++#~ msgstr "Várakoztatás engedélyezése"
++
++#~ msgid "Parking time (secs)"
++#~ msgstr "Várakoztatási idő (másodperc)"
++
++#~ msgid "Reboot Method"
++#~ msgstr "Újraindítás módja"
++
++#~ msgid "Parameter"
++#~ msgstr "Paraméter"
++
++#~ msgid "IAX General Options"
++#~ msgstr "Ãltalános IAX beállítások"
++
++#~ msgid "Static"
++#~ msgstr "Statikus"
++
++#~ msgid "Write Protect"
++#~ msgstr "Ãrásvédelem"
++
++#~ msgid "Modules"
++#~ msgstr "Modulok"
++
++#~ msgid "DTMF mode"
++#~ msgstr "DTMF mód"
++
++#~ msgid "Client Type"
++#~ msgstr "Ügyfél típusa"
++
++#~ msgid "Username"
++#~ msgstr "Felhasználónév"
++
++#~ msgid "Email"
++#~ msgstr "E-mail"
++
++#~ msgid "Display Name"
++#~ msgstr "Megjelenítendő név"
++
++#~ msgid "Password"
++#~ msgstr "Jelszó"
++
++#~ msgid "zone"
++#~ msgstr "zóna"
++
++#~ msgid "Voice Zone settings"
++#~ msgstr "Hang zóna beállítások"
++
++#~ msgid "Message Format"
++#~ msgstr "Üzenet formátuma"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/it/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/it/asterisk.po
+new file mode 100644
+index 0000000..9eb24da
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/it/asterisk.po
+@@ -0,0 +1,162 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2012-04-19 23:40+0200\n"
++"Last-Translator: claudyus <claudyus84@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Asterisk Opzioni Generali"
++
++#~ msgid "AGI directory"
++#~ msgstr "AGI directory"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Cache dei file audio registrati durante la registrazione"
++
++#~ msgid "Debug Level"
++#~ msgstr "Livello di debug"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Disattivare alcuni avvis"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Effettua il core dump al crash"
++
++#~ msgid "High Priority"
++#~ msgstr "Alta Priorità"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Usa temporizzazione interna"
++
++#~ msgid "Log directory"
++#~ msgstr "Accedi alla directory"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Numero massimo di chiamate consentite"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Smettere di accettare carico massimo di nuove chiamate"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Disabilitare la console dei colori"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Cache directori files suoni"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "Prefisso UniquID con il nome di sistema"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr "Costruire percorsi di transcodifica via SLINEAR, non direttamente"
++
++#~ msgid "Verbose Level"
++#~ msgstr "Livello verbose"
++
++#~ msgid "Section dialplan"
++#~ msgstr "Sezione dialplan"
++
++#~ msgid "include"
++#~ msgstr "include"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "Estensione Dialplan"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "Opzioni generali Dialplan"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Permettere il trasferimento"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Cancella le variabili globali"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "Conferenza Dialplan"
++
++#~ msgid "Prefix to add matching dialplans"
++#~ msgstr "Aggiungere il prefisso corrispondente per Dialplans"
++
++#~ msgid "Prefix (0) to add/remove to/from international numbers"
++#~ msgstr ""
++#~ "Prefisso (0) per aggiungere / rimuovere a / da numeri internazionali"
++
++#~ msgid "localzone"
++#~ msgstr "localzone"
++
++#~ msgid "Connection to use"
++#~ msgstr "Connessione da utilizzare"
++
++#~ msgid "Feature Key maps"
++#~ msgstr "Caratteristica chiave delle mappe"
++
++#~ msgid "Key to Disconnect call"
++#~ msgstr "Chiave per disconnettere una chiamata"
++
++#~ msgid "Key to Park call"
++#~ msgstr "Chiave di riserva per chiamata"
++
++#~ msgid "Parking Feature"
++#~ msgstr "Riserva futura"
++
++#~ msgid "ADSI Park"
++#~ msgstr "Riserva ADSI"
++
++#~ msgid "Play courtesy tone to"
++#~ msgstr "Ascolta il tono di cortesia per"
++
++#~ msgid "Enable Parking"
++#~ msgstr "Abilita la sosta"
++
++#~ msgid "Parking time (secs)"
++#~ msgstr "Ora di sosta (in secondi)"
++
++#~ msgid "Range of extensions for call parking"
++#~ msgstr "Gamma di estensioni per la sosta di chiamata"
++
++#~ msgid "Pickup extension"
++#~ msgstr "Estensione Pickup"
++
++#~ msgid "Seconds to wait bewteen digits when transferring"
++#~ msgstr "Secondi di attesa tra le cifre per il trasferimento"
++
++#~ msgid "Sound when attended transfer fails"
++#~ msgstr "Suono quando il trasferimento non ha partecipato"
++
++#~ msgid "Reload Hardware Config"
++#~ msgstr "Ricarica Hardware Config"
++
++#~ msgid "Reboot Method"
++#~ msgstr "Metodo per riavviare"
++
++#~ msgid "Parameter"
++#~ msgstr "Parametro"
++
++#~ msgid "Option type"
++#~ msgstr "Tipo di opzione"
++
++#~ msgid "User name"
++#~ msgstr "Usare il nome"
++
++#~ msgid "IAX General Options"
++#~ msgstr "Opzione generale per IAX"
++
++#~ msgid "Allow Codecs"
++#~ msgstr "Lasciare il codec"
++
++#~ msgid "Static"
++#~ msgstr "Statico"
++
++#~ msgid "Write Protect"
++#~ msgstr "Protezione da scrittura"
++
++#~ msgid "Message Format"
++#~ msgstr "Formato messaggio"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/ja/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/ja/asterisk.po
+new file mode 100644
+index 0000000..98bd10b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/ja/asterisk.po
+@@ -0,0 +1,44 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-01-08 13:20+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Asterisk ã®å…¨èˆ¬ã‚ªãƒ—ション"
++
++#~ msgid "AGI directory"
++#~ msgstr "AGI ディレクトリ"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "録音ã•ã‚ŒãŸã‚µã‚¦ãƒ³ãƒ‰ã‚’録音中ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥"
++
++#~ msgid "Debug Level"
++#~ msgstr "デãƒãƒƒã‚°ãƒ¬ãƒ™ãƒ«"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "ã„ãã¤ã‹ã®è­¦å‘Šã‚’無効ã«ã™ã‚‹"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "クラッシュ時ã«ã‚³ã‚¢ãƒ€ãƒ³ãƒ—を出力ã™ã‚‹"
++
++#~ msgid "High Priority"
++#~ msgstr "高優先度"
++
++#~ msgid "Log directory"
++#~ msgstr "ログ ディレクトリ"
++
++#~ msgid "Allow transfer"
++#~ msgstr "転é€ã‚’許å¯"
++
++#~ msgid "Clear global vars"
++#~ msgstr "グローãƒãƒ«å¤‰æ•°ã‚’消去"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/ms/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/ms/asterisk.po
+new file mode 100644
+index 0000000..e1260e1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/ms/asterisk.po
+@@ -0,0 +1,611 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-05-03 12:40+1000\n"
++"PO-Revision-Date: 2010-05-05 23:32+1000\n"
++"Last-Translator: Wai Chet Teow <waichet@hotmail.com>\n"
++"Language-Team: LANGUAGE\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Pilihan Umum Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "AGI Direktori"
++
++#, fuzzy
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Cache dicatat semasa rakaman fail bunyi"
++
++#, fuzzy
++#~ msgid "Debug Level"
++#~ msgstr "Tingkatan debug"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Mematikan beberapa amaran"
++
++#, fuzzy
++#~ msgid "Dump core on crash"
++#~ msgstr "Dump teras dalam kemalangan"
++
++#~ msgid "High Priority"
++#~ msgstr "Keutamaan Tinggi"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Menginisialisasinya Crypto"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Gunakan Intern pemilihan waktu"
++
++#, fuzzy
++#~ msgid "Log directory"
++#~ msgstr "Direktori log"
++
++#, fuzzy
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Jumlah maksimum panggilan dibenarkan"
++
++#, fuzzy
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "beban maksimum untuk berhenti menerima panggilan baru"
++
++#, fuzzy
++#~ msgid "Disable console colors"
++#~ msgstr "Matikan warna konsol"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Sound fail Direktori Cache"
++
++#, fuzzy
++#~ msgid "The Group to run as"
++#~ msgstr "Kumpulan untuk menjalankan sebagai"
++
++#, fuzzy
++#~ msgid "The User to run as"
++#~ msgstr "Pengguna untuk menjalankan sebagai"
++
++#, fuzzy
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Surat suara spool Direktori"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "Awalan UniquID dengan nama sistem"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr "Membangun transcode jalan melalui SLINEAR, tidak secara langsung"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "Transmit SLINEAR keheningan ketika sedang merakam saluran"
++
++#, fuzzy
++#~ msgid "Verbose Level"
++#~ msgstr "Tingkat verbose"
++
++#~ msgid "Section dialplan"
++#~ msgstr "Bahagian dial rencana"
++
++#~ msgid "include"
++#~ msgstr "memasukkan"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "Ekstensi dial rencana"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "Pilihan Umum Dialplan"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Membolehkan pemindahan"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Hapus variable global"
++
++#~ msgid "Dialplan Goto"
++#~ msgstr "Buka dial rencana"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "Persidangan dial rencana"
++
++#~ msgid "Dialplan Time"
++#~ msgstr "Masa dial rencana"
++
++#~ msgid "Dialplan Voicemail"
++#~ msgstr "Surat suara dial rencana"
++
++#~ msgid "Dial Zones for Dialplan"
++#~ msgstr "Dial Zon untuk dial rencana"
++
++#~ msgid "Prefix to add matching dialplans"
++#~ msgstr "Prefix untuk menambah pencocokan dial rencana"
++
++#~ msgid "Match International prefix"
++#~ msgstr "Awalan Antarabangsa Match"
++
++#~ msgid "Prefix (0) to add/remove to/from international numbers"
++#~ msgstr "Awalan (0) untuk menambah / memadam ke / dari nombor antarabangsa"
++
++#~ msgid "localzone"
++#~ msgstr "zon tempatan"
++
++#~ msgid "Match plan"
++#~ msgstr "Rencana sesuai"
++
++#~ msgid "Connection to use"
++#~ msgstr "Sambungan yang digunakan"
++
++#~ msgid "Feature Key maps"
++#~ msgstr "Ciri-ciri kunci peta"
++
++#~ msgid "Attended transfer key"
++#~ msgstr "Mengikuti memindahkan kunci"
++
++#~ msgid "Blind transfer key"
++#~ msgstr "kunci pemindahkan buta"
++
++#~ msgid "Key to Disconnect call"
++#~ msgstr "Kunci untuk Putus panggilan"
++
++#~ msgid "Key to Park call"
++#~ msgstr "Kunci untuk Park panggilan"
++
++#~ msgid "Parking Feature"
++#~ msgstr "Parkir Ciri-ciri"
++
++#~ msgid "ADSI Park"
++#~ msgstr "ADSI Park"
++
++#~ msgid "Attended transfer timeout (sec)"
++#~ msgstr "Mengikuti pemindahan timeout (saat)"
++
++#~ msgid "One touch record key"
++#~ msgstr "Satu nota sentuh butang"
++
++#~ msgid "Name of call context for parking"
++#~ msgstr "Nama konteks panggilan untuk parkir"
++
++#~ msgid "Sound file to play to parked caller"
++#~ msgstr "Fail bunyi untuk memainkan ke pemanggil parkir"
++
++#~ msgid "Max time (ms) between digits for feature activation"
++#~ msgstr "Maksimum masa (milidetik) antara nombor untuk pengaktifan ciri"
++
++#~ msgid "Method to Find Parking slot"
++#~ msgstr "Kaedah untuk Menemukan slot Parkir"
++
++#~ msgid "parkedmusicclass"
++#~ msgstr "parkir muzik kelas"
++
++#~ msgid "Play courtesy tone to"
++#~ msgstr "Nada kebaikan yang dimainkan untuk"
++
++#~ msgid "Enable Parking"
++#~ msgstr "Aktifkan Parkir"
++
++#~ msgid "Extension to dial to park"
++#~ msgstr "Extension untuk dial ke taman"
++
++#~ msgid "Parking time (secs)"
++#~ msgstr "Parkir waktu (saat)"
++
++#~ msgid "Range of extensions for call parking"
++#~ msgstr "Rentang sambungan untuk parkir panggilan"
++
++#~ msgid "Pickup extension"
++#~ msgstr "Angkat sambungan"
++
++#~ msgid "Seconds to wait bewteen digits when transferring"
++#~ msgstr "Detik untuk menunggu antara nombor ketika memindahkan"
++
++#~ msgid "sound when attended transfer is complete"
++#~ msgstr "suara saat menghadiri pemindahan selesai"
++
++#~ msgid "Sound when attended transfer fails"
++#~ msgstr "Suara saat menghadiri gagal transfer"
++
++#~ msgid "Reload Hardware Config"
++#~ msgstr "Beban kembali menatarajah peranti keras"
++
++#~ msgid "Reboot Method"
++#~ msgstr "Kaedah Reboot"
++
++#~ msgid "Parameter"
++#~ msgstr "Parameter"
++
++#~ msgid "Option type"
++#~ msgstr "Pilihan jenis"
++
++#~ msgid "User name"
++#~ msgstr "Nama pemakai"
++
++#~ msgid "IAX General Options"
++#~ msgstr "Pilihan Umum IAX"
++
++#~ msgid "Allow Codecs"
++#~ msgstr "Izinkan Codec"
++
++#~ msgid "Static"
++#~ msgstr "Statik"
++
++#~ msgid "Write Protect"
++#~ msgstr "Dilindungi Menulis"
++
++#~ msgid "Meetme Conference"
++#~ msgstr "Persidangan Meetme"
++
++#~ msgid "Admin PIN"
++#~ msgstr "PIN Admin"
++
++#~ msgid "Meeting PIN"
++#~ msgstr "PIN Pertemuan"
++
++#~ msgid "Meetme Conference General Options"
++#~ msgstr "Pilihan Umum Persidangan Meetme"
++
++#~ msgid "Number of 20ms audio buffers to be used"
++#~ msgstr "Jumlah buffer audio yang akan digunakan dalam 20 mili detik"
++
++#~ msgid "Modules"
++#~ msgstr "Modul"
++
++#~ msgid "Alarm Receiver Application"
++#~ msgstr "Penggera Aplikasi Penerima"
++
++#~ msgid "Authentication Application"
++#~ msgstr "Pengesahan Aplikasi"
++
++#~ msgid "Make sure asterisk doesnt save CDR"
++#~ msgstr "Membuat asterisk yakin tidak menyimpan CDR"
++
++#~ msgid "Check if channel is available"
++#~ msgstr "Periksa sama ada saluran sedia"
++
++#~ msgid "Listen in on any channel"
++#~ msgstr "Mendengar pada setiap saluran"
++
++#~ msgid "Control Playback Application"
++#~ msgstr "Kawalan Main Aplikasi"
++
++#~ msgid "Cuts up variables"
++#~ msgstr "Memotong pembolehubah"
++
++#~ msgid "Database access functions"
++#~ msgstr "fungsi untuk mengakses dasar data"
++
++#~ msgid "Dialing Application"
++#~ msgstr "Aplikasi Panggilan"
++
++#~ msgid "Virtual Dictation Machine Application"
++#~ msgstr "Aplikasi Dikte Virtual Machine"
++
++#~ msgid "Directed Call Pickup Support"
++#~ msgstr "Sokongan Pengarah Angkatan Pangillan"
++
++#~ msgid "Extension Directory"
++#~ msgstr "Extension Direktori"
++
++#~ msgid "DISA (Direct Inward System Access) Application"
++#~ msgstr "Aplikasi DISA (Direct Inward System Access)"
++
++#~ msgid "Dump channel variables Application"
++#~ msgstr "Aplikasi membuang variable saluran"
++
++#~ msgid "Simple Echo Application"
++#~ msgstr "Echo Aplikasi Mudah"
++
++#~ msgid "ENUM Lookup"
++#~ msgstr "Pencarian ENUM"
++
++#~ msgid "Reevaluates strings"
++#~ msgstr "Menilai semula string"
++
++#~ msgid "Executes applications"
++#~ msgstr "Menjalankan aplikasi"
++
++#~ msgid "External IVR application interface"
++#~ msgstr "IVR aplikasi antara muka luaran"
++
++#~ msgid "Fork The CDR into 2 seperate entities"
++#~ msgstr "CDR garpu menjadi 2 entiti yang berasingan"
++
++#~ msgid "Get ADSI CPE ID"
++#~ msgstr "Dapatkan ADSI CPE ID"
++
++#~ msgid "Group Management Routines"
++#~ msgstr "Pengurusan Kumpulan Rutinitas"
++
++#~ msgid "Encode and Stream via icecast and ices"
++#~ msgstr "Menyandi dan Stream melalui icecast dan es"
++
++#~ msgid "Image Transmission Application"
++#~ msgstr "Aplikasi Transmisi Gambar"
++
++#~ msgid "Look up Caller*ID name/number from black"
++#~ msgstr "Mencari nama / nombor Pemangil dari hitam"
++
++#~ msgid "Look up CallerID Name from local databas"
++#~ msgstr "Mencari Nama Pemangil dari database tempatan"
++
++#~ msgid "Extension Macros"
++#~ msgstr "Makro Extension"
++
++#~ msgid "A simple math Application"
++#~ msgstr "Sebuah Aplikasi matematik senang"
++
++#~ msgid "MD5 checksum Application"
++#~ msgstr "Aplikasi MD5 checksum"
++
++#~ msgid "Digital Milliwatt (mu-law) Test Application"
++#~ msgstr "Milliwatt digital (mu-law) Aplikasi Uji"
++
++#~ msgid "Record a call and mix the audio during the recording"
++#~ msgstr "Merakam panggilan dan campuran audio semasa rakaman"
++
++#~ msgid "Call Parking and Announce Application"
++#~ msgstr "Panggilan Parkir dan Aplikasi Pengumuman"
++
++#~ msgid "Trivial Playback Application"
++#~ msgstr "Aplikasi Pemain Trivial"
++
++#~ msgid "Require phone number to be entered"
++#~ msgstr "Nombor telefon diperlukan untuk dimasuk"
++
++#~ msgid "True Call Queueing"
++#~ msgstr "Panggilan antrian benar"
++
++#~ msgid "Random goto"
++#~ msgstr "Pergi ke random"
++
++#~ msgid "Read Variable Application"
++#~ msgstr "Aplikasi Baca Variabel"
++
++#~ msgid "Read in a file"
++#~ msgstr "Baca dalam fail"
++
++#~ msgid "Realtime Data Lookup/Rewrite"
++#~ msgstr "Masa benar mencari / menulis kembali data "
++
++#~ msgid "Trivial Record Application"
++#~ msgstr "Aplikasi Trivial Rakam"
++
++#~ msgid "Say time"
++#~ msgstr "Katakan masa"
++
++#~ msgid "Send DTMF digits Application"
++#~ msgstr "Aplikasi Hantar DTMF angka"
++
++#~ msgid "Send Text Applications"
++#~ msgstr "Aplikasi Kirim Mesej"
++
++#~ msgid "Set CallerID Application"
++#~ msgstr "Aplikasi menetapkan CallerID"
++
++#~ msgid "CDR user field apps"
++#~ msgstr "Aplikasi CDR bidang pengguna"
++
++#~ msgid "load => .so ; Set CallerID Name"
++#~ msgstr "beban => .so ; Menetapkan Nama CallerID"
++
++#~ msgid "Set RDNIS Number"
++#~ msgstr "Menetapkan Nombor RDNIS"
++
++#~ msgid "Set ISDN Transfer Capability"
++#~ msgstr "Menetapkan Kemampuan Transfer ISDN"
++
++#~ msgid "SMS/PSTN handler"
++#~ msgstr "Penangan SMS/PSTN"
++
++#~ msgid "Hangs up the requested channel"
++#~ msgstr "Menutup saluran yang diminta"
++
++#~ msgid "Stack Routines"
++#~ msgstr "Rutinitas Stack"
++
++#~ msgid "Generic System() application"
++#~ msgstr "Aplikasi Generic Sistem()"
++
++#~ msgid "Playback with Talk Detection"
++#~ msgstr "Putar dengan Pengesanan Bicara"
++
++#~ msgid "Interface Test Application"
++#~ msgstr "Aplikasi Antarmuka Test"
++
++#~ msgid "Transfer"
++#~ msgstr "Transfer"
++
++#~ msgid "TXTCIDName"
++#~ msgstr "Nama TXTCID"
++
++#~ msgid "Send URL Applications"
++#~ msgstr "Aplikasi Kirim URL"
++
++#~ msgid "Custom User Event Application"
++#~ msgstr "Aplikasi Acara Pengguna Tersuai"
++
++#~ msgid "Send verbose output"
++#~ msgstr "Kirim keluaran verbose"
++
++#~ msgid "Voicemail"
++#~ msgstr "Voicemail"
++
++#~ msgid "Waits until first ring after time"
++#~ msgstr "Menunggu waktu sampai setelah deringan pertama"
++
++#~ msgid "Wait For Silence Application"
++#~ msgstr "Aplikasi Tunggu Untuk Tenang"
++
++#~ msgid "While Loops and Conditional Execution"
++#~ msgstr "Sementara Loops dan Pelaksanaan bersyarat"
++
++#~ msgid "Comma Separated Values CDR Backend"
++#~ msgstr "Hujung belakang nilai-nilai dipisahkan koma CDR"
++
++#~ msgid "Customizable Comma Separated Values CDR Backend"
++#~ msgstr "Nilai-nilai dipisahkan koma CDR hujung belakang yang disesuaikan"
++
++#~ msgid "Asterisk Call Manager CDR Backend"
++#~ msgstr "Hujung belakang asterisk panggilan pengurus CDR "
++
++#~ msgid "MySQL CDR Backend"
++#~ msgstr "Hujung belakang MySQL CDR"
++
++#~ msgid "PostgreSQL CDR Backend"
++#~ msgstr "Hujung belakang PostgreSQL CDR"
++
++#~ msgid "SQLite CDR Backend"
++#~ msgstr "Hujung belakang SQLite CDR"
++
++#~ msgid "Agent Proxy Channel"
++#~ msgstr "Agen Proksi Saluran"
++
++#~ msgid "Option chan_iax2"
++#~ msgstr "Pilihan chan_iax2"
++
++#~ msgid "Local Proxy Channel"
++#~ msgstr "Saluran Proksi Tempatan"
++
++#~ msgid "Session Initiation Protocol (SIP)"
++#~ msgstr "Session Initiation Protocol (SIP)"
++
++#~ msgid "Adaptive Differential PCM Coder/Decoder"
++#~ msgstr "Adaptif Pengkamiran PCM Coder/Decoder"
++
++#~ msgid "GSM/PCM16 (signed linear) Codec Translation"
++#~ msgstr "GSM/PCM16 (ditandatangani linier) Codec Terjemahan"
++
++#~ msgid "Speex/PCM16 (signed linear) Codec Translator"
++#~ msgstr "Speex/PCM16 (ditandatangani linier) Codec Terjemahan"
++
++#~ msgid "Sun Microsystems AU format (signed linear)"
++#~ msgstr "Sun Microsystems AU format (ditandatangani linier)"
++
++#~ msgid "Asterisk Extension Language Compiler"
++#~ msgstr "Asterisk Sambungan Bahasa Compiler"
++
++#~ msgid "Text Extension Configuration"
++#~ msgstr "Teks Sambungan Tatarajah"
++
++#~ msgid "Loopback Switch"
++#~ msgstr "Loop Beralih Kembali"
++
++#~ msgid "MySQL Config Resource"
++#~ msgstr "MySQL menatarajah sumber daya"
++
++#~ msgid "ODBC Config Resource"
++#~ msgstr "ODBC tatarajah sumber daya"
++
++#~ msgid "PGSQL Module"
++#~ msgstr "Modul PGSQL"
++
++#~ msgid "Cryptographic Digital Signatures"
++#~ msgstr "tanda tangan digital kriptografi"
++
++#~ msgid "Call Parking Resource"
++#~ msgstr "Panggilan Parkir Sumber Daya"
++
++#~ msgid "Indications Configuration"
++#~ msgstr "Penunjuk Konfigurasi"
++
++#~ msgid "Call Monitoring Resource"
++#~ msgstr "panggilan pemantauan sumber daya"
++
++#~ msgid "Music On Hold Resource"
++#~ msgstr "Muzik Pada Sumber Daya Tahan"
++
++#~ msgid "ODBC Resource"
++#~ msgstr "Sumber ODBC"
++
++#~ msgid "SMDI Module"
++#~ msgstr "Modul SMDI"
++
++#~ msgid "SNMP Module"
++#~ msgstr "Modul SNMP"
++
++#~ msgid "Music On Hold"
++#~ msgstr "Muzik Di Tahan"
++
++#~ msgid "Application"
++#~ msgstr "Aplikasi"
++
++#~ msgid "Directory of Music"
++#~ msgstr "Direktori Muzik"
++
++#~ msgid "Option mode"
++#~ msgstr "Pilihan mod"
++
++#~ msgid "Random Play"
++#~ msgstr "Bermain Rawak"
++
++#~ msgid "DTMF mode"
++#~ msgstr "Mode DTMF"
++
++#~ msgid "Primary domain identity for From: headers"
++#~ msgstr "Domain utama identiti untuk Dari: header"
++
++#~ msgid "From user (required by many SIP providers)"
++#~ msgstr "Dari pengguna (diperlukan oleh banyak pembekal SIP)"
++
++#~ msgid "Ring on incoming dialplan contexts"
++#~ msgstr "Dering pada konteks rancangan panggilan masuk"
++
++#~ msgid "Allow Insecure for"
++#~ msgstr "Biarkan tidak selamat untuk"
++
++#~ msgid "Mailbox for MWI"
++#~ msgstr "Peti mel untuk MWI"
++
++#~ msgid "NAT between phone and Asterisk"
++#~ msgstr "NAT antara telefon dan asterisk"
++
++#~ msgid "Check tags in headers"
++#~ msgstr "Menyemak tag di header"
++
++#~ msgid "Reply Timeout (ms) for down connection"
++#~ msgstr "Balas Masa tamat (ms) untuk sambungan ke bawah"
++
++#~ msgid "Register connection"
++#~ msgstr "Register sambungan"
++
++#~ msgid "Dial own extension for mailbox"
++#~ msgstr "Dial perpanjangan sendiri untuk peti mel"
++
++#~ msgid "Client Type"
++#~ msgstr "Pelanggan Jenis"
++
++#~ msgid "Section sipgeneral"
++#~ msgstr "Bahagian sipgeneral"
++
++#~ msgid "Allow codecs"
++#~ msgstr "Membenarkan codec"
++
++#~ msgid "SIP realm"
++#~ msgstr "Dunia SIP"
++
++#~ msgid "Voicemail general options"
++#~ msgstr "Pilihan umum Voicemail"
++
++#~ msgid "From Email address of server"
++#~ msgstr "Dari alamat email server"
++
++#~ msgid "Voice Mail boxes"
++#~ msgstr "Kotak mail suara"
++
++#~ msgid "Email contains attachment"
++#~ msgstr "Email mengandungi lampiran"
++
++#~ msgid "Display Name"
++#~ msgstr "Nama Paparan"
++
++#~ msgid "Password"
++#~ msgstr "Kata laluan"
++
++#~ msgid "zone"
++#~ msgstr "daerah"
++
++#~ msgid "Voice Zone settings"
++#~ msgstr "Tetapan Zon Suara"
++
++#~ msgid "Message Format"
++#~ msgstr "Format Mesej"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/no/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/no/asterisk.po
+new file mode 100644
+index 0000000..70c448d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/no/asterisk.po
+@@ -0,0 +1,12 @@
++# asterisk.pot
++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/pl/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/pl/asterisk.po
+new file mode 100644
+index 0000000..f092853
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/pl/asterisk.po
+@@ -0,0 +1,75 @@
++# asterisk.pot
++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-18 01:39+0200\n"
++"Last-Translator: Michał <msjablonsky@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Ustawienia Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "Katalog AGI"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Buforuj nagrane pliki podczas nagrywania"
++
++#~ msgid "Debug Level"
++#~ msgstr "Poziom debugowania"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Wyłącz niektóre ostrzeżenia"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Wykonaj zrzut pamięci podczas awarii"
++
++#~ msgid "High Priority"
++#~ msgstr "Wysoki Priorytet"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Uruchom Crypto"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Użyj wbudowanego próbkowania"
++
++#~ msgid "Log directory"
++#~ msgstr "Katalog logów"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Max. dozwolona ilość połączeń"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Max. obciążenie powodujące odrzucanie nowych połączeń"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Wyłącz kolory konsoli"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Katalog tymczasowy dla plików dźwiękowych"
++
++#~ msgid "The Group to run as"
++#~ msgstr "Grupa dla uruchamiania"
++
++#~ msgid "The User to run as"
++#~ msgstr "Użytkownik dla uruchamiania"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Katalog bufora poczty głosowej"
++
++#~ msgid "Time Zone"
++#~ msgstr "Strefa Czasowa"
++
++#~ msgid "localzone"
++#~ msgstr "localzone"
++
++#~ msgid "parkedmusicclass"
++#~ msgstr "parkedmusicclass"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/pt-br/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/pt-br/asterisk.po
+new file mode 100644
+index 0000000..07d7052
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/pt-br/asterisk.po
+@@ -0,0 +1,691 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2011-10-18 22:20+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Opções Gerais do Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "Diretório do AGI"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Guardar em cache os arquivos de som durante a gravação"
++
++#~ msgid "Debug Level"
++#~ msgstr "Nível de detalhamento"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Desativar alguns avisos"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Guardar o core quando o programa estourar"
++
++#~ msgid "High Priority"
++#~ msgstr "Alta Prioridade"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Inicializar Crypto"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Usar Temporização Interna"
++
++#~ msgid "Log directory"
++#~ msgstr "Diretório de registos"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Número máximo de chamadas permitidas"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Carga máxima para deixar de aceitar novas chamadas"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Desativar cores no console"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Diretório de cache para arquivos de som"
++
++#~ msgid "The Group to run as"
++#~ msgstr "O grupo sob o qual o asterisk será executado"
++
++#~ msgid "The User to run as"
++#~ msgstr "O usuário sob o qual o asterisk será executado"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Directorio da spool de voicemail"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "Prefixar o nome de sistema à UniquID"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr ""
++#~ "Construir os caminhos de transcode atraves de SLINEAR e não directamente"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "Transmitir silencio SLINEAR durante a gravação de um canal"
++
++#~ msgid "Verbose Level"
++#~ msgstr "Nível de Detalhamento"
++
++#~ msgid "Time Zone"
++#~ msgstr "Fuso Horário"
++
++#~ msgid "Section dialplan"
++#~ msgstr "Seção do Plano de Marcação"
++
++#~ msgid "include"
++#~ msgstr "incluir"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "Extensão do Plano de Discagem"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "Opções Gerais do Plano de Discagem"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Permitir transferência"
++
++#~ msgid "Reinvite/redirect media connections"
++#~ msgstr "Reconvidar/redirecionar conexões multimídia"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Limpar variáveis globais"
++
++#~ msgid "Dialplan Goto"
++#~ msgstr "Encaminhamento do Plano de Discagem"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "Conferência do Plano de Discagem"
++
++#~ msgid "Dialplan Time"
++#~ msgstr "Tempo do Plano de Discagem"
++
++#~ msgid "Dialplan Voicemail"
++#~ msgstr "Correio de voz do Plano de Discagem"
++
++#~ msgid "Dial Zones for Dialplan"
++#~ msgstr "Zonas do Plano de Discagem"
++
++#~ msgid "Prefix to add matching dialplans"
++#~ msgstr "Prefixo para adicionar aos planos de discagem correspondentes"
++
++#~ msgid "Match International prefix"
++#~ msgstr "Coincidir com o prefixo internacional"
++
++#~ msgid "Prefix (0) to add/remove to/from international numbers"
++#~ msgstr "Prefixo (0) para adicionar/remover para/de números internacionais"
++
++#~ msgid "localzone"
++#~ msgstr "zona local"
++
++#~ msgid "Match plan"
++#~ msgstr "Plano de combinação"
++
++#~ msgid "Connection to use"
++#~ msgstr "Conexão usada"
++
++#~ msgid "Feature Key maps"
++#~ msgstr "Mapeamentos de Tecla de Função"
++
++#~ msgid "Attended transfer key"
++#~ msgstr "Tecla de transferência assistida"
++
++#~ msgid "Blind transfer key"
++#~ msgstr "Tecla de transferência cega"
++
++#~ msgid "Key to Disconnect call"
++#~ msgstr "Tecla para Desligar a chamada"
++
++#~ msgid "Key to Park call"
++#~ msgstr "Tecla para Estacionar a chamada"
++
++#~ msgid "Parking Feature"
++#~ msgstr "Recurso de Estacionamento"
++
++#~ msgid "ADSI Park"
++#~ msgstr "Estacionamento ADSI"
++
++#~ msgid "Attended transfer timeout (sec)"
++#~ msgstr "Tempo limite (seg) da transferência assistida"
++
++#~ msgid "One touch record key"
++#~ msgstr "Tecla de gravação em um toque"
++
++#~ msgid "Name of call context for parking"
++#~ msgstr "Nome do contexto de chamada para o estacionamento"
++
++#~ msgid "Sound file to play to parked caller"
++#~ msgstr "Arquivo de som para tocar para o chamador estacionado"
++
++#~ msgid "Max time (ms) between digits for feature activation"
++#~ msgstr "Tempo máximo (ms) entre os dígitos para ativação de recursos"
++
++#~ msgid "Method to Find Parking slot"
++#~ msgstr "Método para Encontrar uma Vaga de Estacionamento"
++
++#~ msgid "parkedmusicclass"
++#~ msgstr "parkedmusicclass"
++
++#~ msgid "Play courtesy tone to"
++#~ msgstr "Toque o tom de cortesia para"
++
++#~ msgid "Enable Parking"
++#~ msgstr "Habilitar Estacionamento"
++
++#~ msgid "Extension to dial to park"
++#~ msgstr "Extensão para discar para estacionar"
++
++#~ msgid "Parking time (secs)"
++#~ msgstr "Tempo de estacionamento (seg)"
++
++#~ msgid "Range of extensions for call parking"
++#~ msgstr "faixa de extensões para o estacionamento de chamada"
++
++#~ msgid "Pickup extension"
++#~ msgstr "Extensão de captura"
++
++#~ msgid "Seconds to wait bewteen digits when transferring"
++#~ msgstr "Segundos para esperar entre os dígitos quando transferindo"
++
++#~ msgid "sound when attended transfer is complete"
++#~ msgstr "emitir som quando a transferência assistida estiver completa"
++
++#~ msgid "Sound when attended transfer fails"
++#~ msgstr "Emitir som quando a transferência assistida falhar"
++
++#~ msgid "Reload Hardware Config"
++#~ msgstr "Recarregar a Configuração de Hardware"
++
++#~ msgid "Reboot Method"
++#~ msgstr "Método de Reinicialização"
++
++#~ msgid "Parameter"
++#~ msgstr "Parâmetro"
++
++#~ msgid "Option type"
++#~ msgstr "Tipo de Opção"
++
++#~ msgid "User name"
++#~ msgstr "Nome do usuário"
++
++#~ msgid "IAX General Options"
++#~ msgstr "Opções Gerais do Plano de Discagem"
++
++#~ msgid "Allow Codecs"
++#~ msgstr "Permitir Codificadores (codecs)"
++
++#~ msgid "Static"
++#~ msgstr "Estático"
++
++#~ msgid "Write Protect"
++#~ msgstr "Proteção à Escrita"
++
++#~ msgid "Meetme Conference"
++#~ msgstr "Conferência Encontre-me"
++
++#~ msgid "Admin PIN"
++#~ msgstr "PIN do Administrador"
++
++#~ msgid "Meeting PIN"
++#~ msgstr "PIN da Conferência"
++
++#~ msgid "Meetme Conference General Options"
++#~ msgstr "Opções Gerais da Conferência Encontre-me"
++
++#~ msgid "Number of 20ms audio buffers to be used"
++#~ msgstr "Número de buffers de 20ms que serão usados"
++
++#~ msgid "Modules"
++#~ msgstr "Módulos"
++
++#~ msgid "Alarm Receiver Application"
++#~ msgstr "Aplicativo de Recepção de Alarmes"
++
++#~ msgid "Authentication Application"
++#~ msgstr "Aplicativo de Autenticação"
++
++#~ msgid "Make sure asterisk doesnt save CDR"
++#~ msgstr "Garanta que o asterisk não salva o CDR"
++
++#~ msgid "Check if channel is available"
++#~ msgstr "Verifique se o canal está disponível"
++
++#~ msgid "Listen in on any channel"
++#~ msgstr "Escute em qualquer canal"
++
++#~ msgid "Control Playback Application"
++#~ msgstr "Controlar o Aplicativo de Reprodução"
++
++#~ msgid "Cuts up variables"
++#~ msgstr "Variáveis de Cortes"
++
++#~ msgid "Database access functions"
++#~ msgstr "Funções de acesso ao banco de dados"
++
++#~ msgid "Dialing Application"
++#~ msgstr "Aplicativo de Discagem"
++
++#~ msgid "Virtual Dictation Machine Application"
++#~ msgstr "Aplicativo de Máquina de Ditado Virtual"
++
++#~ msgid "Directed Call Pickup Support"
++#~ msgstr "Suporte a Captura de Chamadas Direcionadas"
++
++#~ msgid "Extension Directory"
++#~ msgstr "Diretório de Extensão"
++
++#~ msgid "DISA (Direct Inward System Access) Application"
++#~ msgstr "Aplicativo DISA (Acesso Direto ao Sistema Interior)"
++
++#~ msgid "Dump channel variables Application"
++#~ msgstr "Descarregar Aplicativo de variáveis do canal"
++
++#~ msgid "Simple Echo Application"
++#~ msgstr "Aplicativo de Eco Simples"
++
++#~ msgid "ENUM Lookup"
++#~ msgstr "Pesquisa ENUM"
++
++#~ msgid "Reevaluates strings"
++#~ msgstr "Reavaliar sequências de caracteres"
++
++#~ msgid "Executes applications"
++#~ msgstr "Executa aplicativos"
++
++#~ msgid "External IVR application interface"
++#~ msgstr "Interface de aplicativo IVR externo"
++
++#~ msgid "Fork The CDR into 2 seperate entities"
++#~ msgstr "Bifurcar o CDR em duas entidades separadas"
++
++#~ msgid "Get ADSI CPE ID"
++#~ msgstr "Pegar o ID do CPE ADSI"
++
++#~ msgid "Group Management Routines"
++#~ msgstr "Rotinas de Gerenciamento e Grupo"
++
++#~ msgid "Encode and Stream via icecast and ices"
++#~ msgstr "Codificar e Transmitir através do icecast e ices"
++
++#~ msgid "Image Transmission Application"
++#~ msgstr "Aplicativo de Transmissão de Imagem"
++
++# what is this black? Seems to be truncated!
++#~ msgid "Look up Caller*ID name/number from black"
++#~ msgstr "Buscar o Identificador de chamadas/nome/número do preto"
++
++#~ msgid "Look up CallerID Name from local databas"
++#~ msgstr "Buscar o Identificador de chamadas/nome/número do banco de dados"
++
++#~ msgid "Extension Macros"
++#~ msgstr "Macros de extensão"
++
++#~ msgid "A simple math Application"
++#~ msgstr "Um Aplicativo simples de matemática"
++
++#~ msgid "MD5 checksum Application"
++#~ msgstr "Aplicativo de soma de verificação MD5"
++
++#~ msgid "Digital Milliwatt (mu-law) Test Application"
++#~ msgstr "Aplicativo de Teste de Miliwatt (mu-law) Digital"
++
++#~ msgid "Record a call and mix the audio during the recording"
++#~ msgstr "Gravar uma ligação e mixar o áudio durante a gravação"
++
++#~ msgid "Call Parking and Announce Application"
++#~ msgstr "Aplicativo de Anúncio e Estacionamento de Chamada"
++
++#~ msgid "Trivial Playback Application"
++#~ msgstr "Aplicativo de Reprodução Trivial"
++
++#~ msgid "Require phone number to be entered"
++#~ msgstr "Requer que seja informado um número de telefone"
++
++#~ msgid "True Call Queueing"
++#~ msgstr "Enfileiramento Real da Chamada"
++
++#~ msgid "Random goto"
++#~ msgstr "Vá para aleatório"
++
++#~ msgid "Read Variable Application"
++#~ msgstr "Aplicativo de Leitura de Variável"
++
++#~ msgid "Read in a file"
++#~ msgstr "Ler em um arquivo"
++
++#~ msgid "Realtime Data Lookup/Rewrite"
++#~ msgstr "Escrita/Consulta de Dados em Tempo Real"
++
++#~ msgid "Trivial Record Application"
++#~ msgstr "Aplicativo de Gravação Trivial"
++
++#~ msgid "Say time"
++#~ msgstr "Dizer a hora"
++
++#~ msgid "Send DTMF digits Application"
++#~ msgstr "Aplicativo para Enviar dígitos DTMF"
++
++#~ msgid "Send Text Applications"
++#~ msgstr "Aplicativos para Enviar Texto"
++
++#~ msgid "Set CallerID Application"
++#~ msgstr "Aplicativo de Definir a Identificação da Chamada"
++
++# I guess there is something wrong with English here
++#~ msgid "CDR user field apps"
++#~ msgstr "Aplicativos do campo do usuário no CDR"
++
++#~ msgid "load => .so ; Set CallerID Name"
++#~ msgstr "Carregar => .so ; Definir o Nome na Identificação da Chamada"
++
++#~ msgid "load => .so ; Set CallerID Number"
++#~ msgstr "Carregar => .so ; Definir o Número na Identificação da Chamada"
++
++#~ msgid "Set RDNIS Number"
++#~ msgstr "Definir o Número do RDNIS"
++
++#~ msgid "Set ISDN Transfer Capability"
++#~ msgstr "Definir Capacidade de Transferência ISDN"
++
++#~ msgid "SMS/PSTN handler"
++#~ msgstr "Tratador do SMS/PSTN"
++
++#~ msgid "Hangs up the requested channel"
++#~ msgstr "Termina a ligação no canal requisitado"
++
++#~ msgid "Stack Routines"
++#~ msgstr "Rotinas de Empilhamento"
++
++#~ msgid "Generic System() application"
++#~ msgstr "Aplicativo de Sistema Genérico"
++
++#~ msgid "Playback with Talk Detection"
++#~ msgstr "Reprodução com Detecção de Conversa"
++
++#~ msgid "Interface Test Application"
++#~ msgstr "Aplicativo de Teste de Interface"
++
++#~ msgid "Transfer"
++#~ msgstr "Transferir"
++
++#~ msgid "TXTCIDName"
++#~ msgstr "TXTCIDName"
++
++#~ msgid "Send URL Applications"
++#~ msgstr "Aplicativo para Enviar URL"
++
++#~ msgid "Custom User Event Application"
++#~ msgstr "Aplicativo para Eventos do Usuário Personalizados"
++
++#~ msgid "Send verbose output"
++#~ msgstr "Enviar saída detalhada"
++
++#~ msgid "Voicemail"
++#~ msgstr "Correio de Voz"
++
++#~ msgid "Waits until first ring after time"
++#~ msgstr "Espere até o primeiro toque após tempo"
++
++#~ msgid "Wait For Silence Application"
++#~ msgstr "Aplicativo para Esperar Por Silêncio"
++
++#~ msgid "While Loops and Conditional Execution"
++#~ msgstr "Laços de Repetição e Execução Condicional"
++
++#~ msgid "Comma Separated Values CDR Backend"
++#~ msgstr "Serviço de CDR em Valores Separados por Vírgula"
++
++#~ msgid "Customizable Comma Separated Values CDR Backend"
++#~ msgstr "Serviço de CDR em Valores Separados por Vírgula Personalizável"
++
++#~ msgid "Asterisk Call Manager CDR Backend"
++#~ msgstr "Serviço de CDR de Gerenciamento de Chamadas Asterisk"
++
++#~ msgid "MySQL CDR Backend"
++#~ msgstr "Serviço de CDR em MySQL"
++
++#~ msgid "PostgreSQL CDR Backend"
++#~ msgstr "Serviço de CDR em PostgreSQL"
++
++#~ msgid "SQLite CDR Backend"
++#~ msgstr "Serviço de CDR em SQLite"
++
++#~ msgid "Agent Proxy Channel"
++#~ msgstr "Canal de Proxy do Agente"
++
++#~ msgid "Option chan_iax2"
++#~ msgstr "Opção chan_iax2"
++
++#~ msgid "Local Proxy Channel"
++#~ msgstr "Canal de Proxy Local"
++
++#~ msgid "Session Initiation Protocol (SIP)"
++#~ msgstr "Protocolo de Iniciação de Sessão (SIP)"
++
++#~ msgid "Adaptive Differential PCM Coder/Decoder"
++#~ msgstr "Codificador/Decodificador PCM Diferencial Adaptativo"
++
++#~ msgid "A-law Coder/Decoder"
++#~ msgstr "Codificador/Decodificador A-law"
++
++#~ msgid "A-law and Mulaw direct Coder/Decoder"
++#~ msgstr "Codificador/Decodificador direto A-law e Mulaw"
++
++#~ msgid "ITU G.726-32kbps G726 Transcoder"
++#~ msgstr "Transcodificador G726 ITU G.726-32kbps"
++
++#~ msgid "GSM/PCM16 (signed linear) Codec Translation"
++#~ msgstr "Tradutor de codificação GSM/PCM16 (linear com sinal)"
++
++#~ msgid "Speex/PCM16 (signed linear) Codec Translator"
++#~ msgstr "Tradutor de codificação Speex/PCM16 (linear com sinal)"
++
++#~ msgid "Mu-law Coder/Decoder"
++#~ msgstr "Codificador/Decodificador Mu-law"
++
++#~ msgid "Sun Microsystems AU format (signed linear)"
++#~ msgstr "Formato AU Sun Microsystems (linear com sinal)"
++
++#~ msgid "G.723.1 Simple Timestamp File Format"
++#~ msgstr "Formato de Arquivo de Selo Temporal Simples G.723.1"
++
++#~ msgid "Raw G.726 (16/24/32/40kbps) data"
++#~ msgstr "Dado G.726 bruto (16/24/32/40kbps)"
++
++#~ msgid "Raw G729 data"
++#~ msgstr "Dado G729 bruto"
++
++#~ msgid "Raw GSM data"
++#~ msgstr "Dado GSM bruto"
++
++#~ msgid "Raw h263 data"
++#~ msgstr "Dado h263 bruto"
++
++#~ msgid "JPEG (Joint Picture Experts Group) Image"
++#~ msgstr "Imagem JPEG ((Joint Picture Experts Group)"
++
++#~ msgid "Raw uLaw 8khz Audio support (PCM)"
++#~ msgstr "Suporte a uLaw 8khz Ãudio bruto (PCM)"
++
++#~ msgid "load => .so ; Raw aLaw 8khz PCM Audio support"
++#~ msgstr "carregar => .so ; Suporte a uLaw 8khz Ãudio PCM bruto"
++
++#~ msgid "Raw Signed Linear Audio support (SLN)"
++#~ msgstr "Suporte a Ãudio Linear com Sinal (SLN)"
++
++#~ msgid "Dialogic VOX (ADPCM) File Format"
++#~ msgstr "Formato de Arquivo Dialogic VOX (ADPCM)"
++
++#~ msgid "Microsoft WAV format (8000hz Signed Line"
++#~ msgstr "Formato WAV da Microsoft (8000hz Linear com Sinal)"
++
++#~ msgid "Microsoft WAV format (Proprietary GSM)"
++#~ msgstr "Formato WAV da Microsoft (GSM Proprietário) "
++
++#~ msgid "Caller ID related dialplan functions"
++#~ msgstr ""
++#~ "Funções do plano de discagem relacionadas ao identificador da chamada"
++
++#~ msgid "ENUM Functions"
++#~ msgstr "Funções ENUM"
++
++#~ msgid "URI encoding / decoding functions"
++#~ msgstr "Funções de codificação / decodificação de URI"
++
++#~ msgid "Asterisk Extension Language Compiler"
++#~ msgstr "Compilador da Linguagem de Extensão do Asterisk"
++
++#~ msgid "Text Extension Configuration"
++#~ msgstr "Configuração da Extensão de Texto"
++
++#~ msgid "load => .so ; Builtin dialplan functions"
++#~ msgstr "carregar => .so ; Funções de plano de discagem embutidas"
++
++#~ msgid "Loopback Switch"
++#~ msgstr "Interruptor loopback"
++
++#~ msgid "Realtime Switch"
++#~ msgstr "Interruptor de Tempo Real"
++
++#~ msgid "Outgoing Spool Support"
++#~ msgstr "Suporte a bufferização da Saída"
++
++#~ msgid "Wil Cal U (Auto Dialer)"
++#~ msgstr "Wil Cal U (Discador Automático)"
++
++#~ msgid "MySQL Config Resource"
++#~ msgstr "Recurso de Configuração do Mysql"
++
++#~ msgid "ODBC Config Resource"
++#~ msgstr "Recurso de Configuração do ODBC"
++
++#~ msgid "PGSQL Module"
++#~ msgstr "Módulo do PGSQL"
++
++#~ msgid "Cryptographic Digital Signatures"
++#~ msgstr "Assinaturas Digitais Criptográficas"
++
++#~ msgid "Call Parking Resource"
++#~ msgstr "Recurso de Estacionamento de Chamadas"
++
++#~ msgid "Indications Configuration"
++#~ msgstr "Configuração dos Indicadores"
++
++#~ msgid "Call Monitoring Resource"
++#~ msgstr "Recurso de Monitoramento de Chamada"
++
++#~ msgid "Music On Hold Resource"
++#~ msgstr "Recurso da Música de Espera"
++
++#~ msgid "ODBC Resource"
++#~ msgstr "Recurso do ODBC"
++
++#~ msgid "SMDI Module"
++#~ msgstr "Módulo SMDI"
++
++#~ msgid "SNMP Module"
++#~ msgstr "Módulo SNMP"
++
++#~ msgid "Music On Hold"
++#~ msgstr "Música de Espera"
++
++#~ msgid "Application"
++#~ msgstr "Aplicativo"
++
++#~ msgid "Directory of Music"
++#~ msgstr "Diretório de Música"
++
++#~ msgid "Option mode"
++#~ msgstr "Modo da opção"
++
++#~ msgid "Random Play"
++#~ msgstr "Toque Aleatoriamente"
++
++#~ msgid "DTMF mode"
++#~ msgstr "Modo DTMF"
++
++#~ msgid "Primary domain identity for From: headers"
++#~ msgstr "Identidade do primeiro domínio para cabeçalhos De:"
++
++#~ msgid "From user (required by many SIP providers)"
++#~ msgstr "Do usuário (necessário para muitos provedores de SIP)"
++
++# I didn't undestand this one
++#~ msgid "Ring on incoming dialplan contexts"
++#~ msgstr "Tocar no contextos de plano de discagem recebidas"
++
++#~ msgid "Allow Insecure for"
++#~ msgstr "Permitir Inseguro para"
++
++#~ msgid "Mailbox for MWI"
++#~ msgstr "Caixa de Correio para MWI"
++
++#~ msgid "NAT between phone and Asterisk"
++#~ msgstr "NAT entre o telefone e o Asterisk"
++
++#~ msgid "Check tags in headers"
++#~ msgstr "Verifique as etiquetas nos cabeçalhos"
++
++#~ msgid "Reply Timeout (ms) for down connection"
++#~ msgstr "Tempo Limite da Resposta (ms) para conexões desconectadas"
++
++#~ msgid "Register connection"
++#~ msgstr "Registro da conexão"
++
++#~ msgid "Dial own extension for mailbox"
++#~ msgstr "Discar extensão própria para a caixa de correio"
++
++#~ msgid "Client Type"
++#~ msgstr "Tipo de Cliente"
++
++#~ msgid "Username"
++#~ msgstr "Usuário"
++
++#~ msgid "Section sipgeneral"
++#~ msgstr "Opções Gerais do SIP"
++
++#~ msgid "Allow codecs"
++#~ msgstr "Permitir codificações"
++
++#~ msgid "SIP realm"
++#~ msgstr "Domínio do SIP (realm)"
++
++#~ msgid "Voicemail general options"
++#~ msgstr "Opções gerais do correio de voz"
++
++#~ msgid "From Email address of server"
++#~ msgstr "Endereço do email de origem do servidor"
++
++#~ msgid "Voice Mail boxes"
++#~ msgstr "Caixas de Correio de Voz"
++
++#~ msgid "Email contains attachment"
++#~ msgstr "O email contém anexos"
++
++#~ msgid "Email"
++#~ msgstr "Email"
++
++#~ msgid "Display Name"
++#~ msgstr "Nome para exibição"
++
++#~ msgid "Password"
++#~ msgstr "Senha"
++
++#~ msgid "zone"
++#~ msgstr "zona"
++
++#~ msgid "Voice Zone settings"
++#~ msgstr "Configuração de Zona da Voz"
++
++#~ msgid "Message Format"
++#~ msgstr "Formato da Mensagem"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/pt/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/pt/asterisk.po
+new file mode 100644
+index 0000000..d1b9836
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/pt/asterisk.po
+@@ -0,0 +1,150 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2009-05-20 11:54+0200\n"
++"Last-Translator: Jose Monteiro <jm@unimos.net>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Opções Gerais do Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "Directorio AGI"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Guardar em cache os ficheiros de som durante a gravação"
++
++#~ msgid "Debug Level"
++#~ msgstr "Nível de debug"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Desactivar alguns avisos"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Guardar o core quando houver crash"
++
++#~ msgid "High Priority"
++#~ msgstr "Alta Prioridade"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Inicializar Crypto"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Usar temporizações internas"
++
++#~ msgid "Log directory"
++#~ msgstr "Directorio de registos"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Maximo de chamadas permitidas"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Maximo de carga para deixar de aceitar novas chamadas"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Desactivar cores na consola"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Directorio de cache para ficheiros de som"
++
++#~ msgid "The Group to run as"
++#~ msgstr "O grupo sob o qual o asterisk será executado"
++
++#~ msgid "The User to run as"
++#~ msgstr "O utilizador sob o qual o asterisk será executado"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Directorio da spool de voicemail"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "Prefixar o nome de sistema à UniquID"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr ""
++#~ "Construir os caminhos de transcode atraves de SLINEAR e não directamente"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "Transmitir silencio SLINEAR durante a gravação de um canal"
++
++#~ msgid "Verbose Level"
++#~ msgstr "Nivel de verbosidade"
++
++#~ msgid "Time Zone"
++#~ msgstr "Fuso Horário"
++
++#~ msgid "Section dialplan"
++#~ msgstr "Secção do Plano de Marcação"
++
++#~ msgid "include"
++#~ msgstr "incluir"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "Extensão do Plano de Marcação"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "Opções Gerais do Plano de Marcação"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Permitir transferência"
++
++#~ msgid "Reinvite/redirect media connections"
++#~ msgstr "Redirigir/Repetir ligações multimedia"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Limpar variaveis globais"
++
++#~ msgid "Dialplan Goto"
++#~ msgstr "Encaminhamento do Plano de Marcação"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "Conferencia do Plano de Marcação"
++
++#, fuzzy
++#~ msgid "Dialplan Time"
++#~ msgstr "Conferencia do Plano de Marcação"
++
++#, fuzzy
++#~ msgid "Dialplan Voicemail"
++#~ msgstr "Encaminhamento do Plano de Marcação"
++
++#, fuzzy
++#~ msgid "Dial Zones for Dialplan"
++#~ msgstr "Secção do Plano de Marcação"
++
++#, fuzzy
++#~ msgid "Connection to use"
++#~ msgstr "Secção do Plano de Marcação"
++
++#, fuzzy
++#~ msgid "IAX General Options"
++#~ msgstr "Opções Gerais do Plano de Marcação"
++
++#, fuzzy
++#~ msgid "Allow Codecs"
++#~ msgstr "Opções Gerais do Plano de Marcação"
++
++#, fuzzy
++#~ msgid "Section sipgeneral"
++#~ msgstr "Opções Gerais do Plano de Marcação"
++
++#, fuzzy
++#~ msgid "Allow codecs"
++#~ msgstr "Opções Gerais do Plano de Marcação"
++
++#, fuzzy
++#~ msgid "SIP realm"
++#~ msgstr "Opções Gerais do Plano de Marcação"
++
++#, fuzzy
++#~ msgid "Voicemail general options"
++#~ msgstr "Opções Gerais do Plano de Marcação"
++
++#, fuzzy
++#~ msgid "Voice Zone settings"
++#~ msgstr "Secção do Plano de Marcação"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/ro/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/ro/asterisk.po
+new file mode 100644
+index 0000000..e271370
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/ro/asterisk.po
+@@ -0,0 +1,54 @@
++# asterisk.pot
++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-07 00:35+0200\n"
++"Last-Translator: Daniel <daniel.petre@pitesti.rcs-rds.ro>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Optiunile generale Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "Director AGI"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Dezactiveaza cateva avertizari"
++
++#~ msgid "High Priority"
++#~ msgstr "Prioritate inalta"
++
++#~ msgid "Log directory"
++#~ msgstr "Director de loguri"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Incarcarea maxima de cand se refuza apeluri noi"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Dezactiveaza culorile in consola"
++
++#~ msgid "The Group to run as"
++#~ msgstr "Ruleaza sub grupul"
++
++#~ msgid "The User to run as"
++#~ msgstr "Ruleaza sub utilizatorul"
++
++#~ msgid "Time Zone"
++#~ msgstr "Fusul orar"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Permite transferul"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Goleste variabilele globale"
++
++#~ msgid "Connection to use"
++#~ msgstr "Conexiunea pentru folosire"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/ru/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/ru/asterisk.po
+new file mode 100644
+index 0000000..acedb82
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/ru/asterisk.po
+@@ -0,0 +1,515 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-04-02 15:02+0200\n"
++"Last-Translator: Kamal <kamal.aliev@epscom.ru>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Общие наÑтройки Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "Каталог AGI"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "КÑшировать звуковые файлы во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи"
++
++#~ msgid "Debug Level"
++#~ msgstr "Уровень отладки"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Отключить некоторые предупреждениÑ"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "СохранÑÑ‚ÑŒ дамп Ñдра при фатальной ошибке"
++
++#~ msgid "High Priority"
++#~ msgstr "Ð’Ñ‹Ñокий приоритет"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Включить шифрование"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "ИÑпользовать внутренние тайминги"
++
++#~ msgid "Log directory"
++#~ msgstr "Каталог файлов журнала"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "МакÑимальное разрешённое количеÑтво вызовов"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‚Ð° приёма новых вызовов"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Выключить цвета конÑоли"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Каталог кÑша звуковых файлов"
++
++#~ msgid "The Group to run as"
++#~ msgstr "Группа, от имени которой запуÑкать"
++
++#~ msgid "The User to run as"
++#~ msgstr "Пользователь, от имени которого запуÑкать"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "ДобавлÑÑ‚ÑŒ Ð¸Ð¼Ñ ÑиÑтемы к уникальному идентификатору (UID)"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "Передавать тишину в формате SLINEAR при запиÑи канала"
++
++#~ msgid "Section dialplan"
++#~ msgstr "Раздел правил набора"
++
++#~ msgid "include"
++#~ msgstr "включить"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "Раcширение правила набора"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "Общие наÑтройки правил набора"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Разрешить перевод"
++
++#~ msgid "Clear global vars"
++#~ msgstr "ОчиÑтить глобальные переменные"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "Правила набора Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð¸"
++
++#~ msgid "Dialplan Time"
++#~ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» набора"
++
++#~ msgid "Dialplan Voicemail"
++#~ msgstr "Правила набора Ð´Ð»Ñ Ð³Ð¾Ð»Ð¾Ñовой почты"
++
++#~ msgid "Dial Zones for Dialplan"
++#~ msgstr "Зоны Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» набора"
++
++#~ msgid "Prefix (0) to add/remove to/from international numbers"
++#~ msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ (0) Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ/ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ðº/из международных номеров"
++
++#~ msgid "localzone"
++#~ msgstr "меÑÑ‚Ð½Ð°Ñ Ð·Ð¾Ð½Ð°"
++
++#~ msgid "Connection to use"
++#~ msgstr "ИÑпользовать Ñоединение"
++
++#~ msgid "Feature Key maps"
++#~ msgstr "ÐÐ°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð»Ð½Ð°Ð»ÑŒÐ½Ñ‹Ñ… клавиш"
++
++#~ msgid "Key to Disconnect call"
++#~ msgstr "Клавиша Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ñ‹Ð²Ð° ÑоединениÑ"
++
++#~ msgid "Key to Park call"
++#~ msgstr "Клавиша Ð´Ð»Ñ \"парковки\" вызова "
++
++#~ msgid "Parking Feature"
++#~ msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ \"Парковка\""
++
++#~ msgid "One touch record key"
++#~ msgstr "Клавиша запиÑи в одно каÑание"
++
++#~ msgid "Sound file to play to parked caller"
++#~ msgstr "Ðудио файл, проигрываемый \"припаркованному\""
++
++#~ msgid "Max time (ms) between digits for feature activation"
++#~ msgstr "МакÑимальное Ð²Ñ€ÐµÐ¼Ñ (мÑ) между нажатиÑми Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ функции"
++
++#~ msgid "Method to Find Parking slot"
++#~ msgstr "Метод поиÑка Ñлота Ð´Ð»Ñ Ð¿Ð°Ñ€ÐºÐ¾Ð²ÐºÐ¸"
++
++#~ msgid "Play courtesy tone to"
++#~ msgstr "Играть тон вежливоÑти длÑ"
++
++#~ msgid "Enable Parking"
++#~ msgstr "Разрешить \"Парковку\""
++
++#~ msgid "Extension to dial to park"
++#~ msgstr "РаÑширение набора Ð´Ð»Ñ \"парковки\""
++
++#~ msgid "Parking time (secs)"
++#~ msgstr "Ð’Ñ€ÐµÐ¼Ñ \"Парковки\" (Ñекунды)"
++
++#~ msgid "Range of extensions for call parking"
++#~ msgstr "Диапазон раÑширений Ð´Ð»Ñ \"парковки\" вызова"
++
++#~ msgid "Reload Hardware Config"
++#~ msgstr "Перезагрузить конфигурацию оборудованиÑ"
++
++#~ msgid "Reboot Method"
++#~ msgstr "Метод перезагрузки"
++
++#~ msgid "Parameter"
++#~ msgstr "Параметр"
++
++#~ msgid "Option type"
++#~ msgstr "Тип параметра"
++
++#~ msgid "User name"
++#~ msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
++
++#~ msgid "IAX General Options"
++#~ msgstr "Общие параметры IAX"
++
++#~ msgid "Allow Codecs"
++#~ msgstr "Разрешить кодеки"
++
++#~ msgid "Static"
++#~ msgstr "СтатичеÑкий"
++
++#~ msgid "Write Protect"
++#~ msgstr "Защита от запиÑи"
++
++#~ msgid "Meetme Conference"
++#~ msgstr "ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Meetme"
++
++#~ msgid "Admin PIN"
++#~ msgstr "PIN админиÑтратора"
++
++#~ msgid "Meeting PIN"
++#~ msgstr "PIN ÑовещаниÑ"
++
++#~ msgid "Meetme Conference General Options"
++#~ msgstr "Общие параметры конференции Meetme"
++
++#~ msgid "Number of 20ms audio buffers to be used"
++#~ msgstr "КоличеÑтво иÑпользуемых 20 Ð¼Ñ Ð±ÑƒÑ„ÐµÑ€Ð¾Ð²"
++
++#~ msgid "Modules"
++#~ msgstr "Модули"
++
++#~ msgid "Alarm Receiver Application"
++#~ msgstr "Приложение Ñбора Ñигналов тревоги"
++
++#~ msgid "Authentication Application"
++#~ msgstr "Приложение аутентификации"
++
++#~ msgid "Make sure asterisk doesnt save CDR"
++#~ msgstr "УбедитеÑÑŒ что Asterisk не ÑохранÑет CDR"
++
++#~ msgid "Check if channel is available"
++#~ msgstr "Проверить канал на доÑтупноÑÑ‚ÑŒ"
++
++#~ msgid "Listen in on any channel"
++#~ msgstr "Слашать на любом канале"
++
++#~ msgid "Database access functions"
++#~ msgstr "Функции доÑтупа базы данных"
++
++#~ msgid "Dialing Application"
++#~ msgstr "Приложение набора"
++
++#~ msgid "DISA (Direct Inward System Access) Application"
++#~ msgstr ""
++#~ "Приложение доÑтупа к добавочной линии путем прÑмого уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ "
++#~ "входÑщего ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (DISA)"
++
++#~ msgid "Dump channel variables Application"
++#~ msgstr "Приложение Ñбора переменных канала"
++
++#~ msgid "Simple Echo Application"
++#~ msgstr "Приложение Ñха"
++
++#~ msgid "Executes applications"
++#~ msgstr "ВыполнÑет приложение"
++
++#~ msgid "External IVR application interface"
++#~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ IVR приложениÑ"
++
++#~ msgid "Group Management Routines"
++#~ msgstr "Операции ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð¹"
++
++#~ msgid "Image Transmission Application"
++#~ msgstr "Приложение передачи изображений"
++
++#~ msgid "Look up Caller*ID name/number from black"
++#~ msgstr "ИÑкать Ð¸Ð¼Ñ CallerID в \"черном\" ÑпиÑке"
++
++#~ msgid "Look up CallerID Name from local databas"
++#~ msgstr "ИÑкать Ð¸Ð¼Ñ CallerID в локальной базе"
++
++#~ msgid "Extension Macros"
++#~ msgstr "ÐœÐ°ÐºÑ€Ð¾Ñ Ñ€Ð°ÑширениÑ"
++
++#~ msgid "A simple math Application"
++#~ msgstr "ПроÑтое математичеÑкое приложение"
++
++#~ msgid "MD5 checksum Application"
++#~ msgstr "Приложение MD5"
++
++#~ msgid "Record a call and mix the audio during the recording"
++#~ msgstr "ЗапиÑать вызов и микшировать аудио во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи"
++
++#~ msgid "Trivial Playback Application"
++#~ msgstr "Приложение Ð´Ð»Ñ Ð²Ð¾ÑпроизведениÑ"
++
++#~ msgid "Require phone number to be entered"
++#~ msgstr "Требовать номер телефона, который необходимо ввеÑти"
++
++#~ msgid "True Call Queueing"
++#~ msgstr "ПоÑтановка вызовов на ожидание"
++
++#~ msgid "Read Variable Application"
++#~ msgstr "Приложение Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ…"
++
++#~ msgid "Read in a file"
++#~ msgstr "Читать в файл"
++
++#~ msgid "Trivial Record Application"
++#~ msgstr "ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
++
++#~ msgid "Send DTMF digits Application"
++#~ msgstr "Приложение отправки DTMF"
++
++#~ msgid "Send Text Applications"
++#~ msgstr "ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ текÑта"
++
++#~ msgid "Set CallerID Application"
++#~ msgstr "Приложение уÑтановки CallerID"
++
++#~ msgid "Set RDNIS Number"
++#~ msgstr "УÑтановить номер RDNIS"
++
++#~ msgid "Set ISDN Transfer Capability"
++#~ msgstr "УÑтановить возможноÑти передачи ISDN "
++
++#~ msgid "SMS/PSTN handler"
++#~ msgstr "Обработчик SMS/PSTN"
++
++#~ msgid "Hangs up the requested channel"
++#~ msgstr "ОтÑоединÑет запрошенный канал"
++
++#~ msgid "Stack Routines"
++#~ msgstr "Функции Ñтека"
++
++#~ msgid "Generic System() application"
++#~ msgstr "Приложение System()"
++
++#~ msgid "Playback with Talk Detection"
++#~ msgstr "ВоÑпроизведение Ñ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸ÐµÐ¼ разговора"
++
++#~ msgid "Interface Test Application"
++#~ msgstr "Приложение Ð´Ð»Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа"
++
++#~ msgid "Transfer"
++#~ msgstr "ПереÑылка"
++
++#~ msgid "TXTCIDName"
++#~ msgstr "Ð˜Ð¼Ñ TXTCID"
++
++#~ msgid "Send URL Applications"
++#~ msgstr "ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ñылки URL"
++
++#~ msgid "Custom User Event Application"
++#~ msgstr "Приложение пользовательÑких Ñобытий"
++
++#~ msgid "Send verbose output"
++#~ msgstr "ОтправлÑÑ‚ÑŒ подробный вывод"
++
++#~ msgid "Voicemail"
++#~ msgstr "ГолоÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°"
++
++#~ msgid "While Loops and Conditional Execution"
++#~ msgstr "Циклы while и уÑловное выполнение"
++
++#~ msgid "Asterisk Call Manager CDR Backend"
++#~ msgstr "БÑкенд CDR менеджера вызовов Asterisk"
++
++#~ msgid "MySQL CDR Backend"
++#~ msgstr "БÑкенд MySQL CDR"
++
++#~ msgid "PostgreSQL CDR Backend"
++#~ msgstr "БÑкенд PostgreSQL CDR"
++
++#~ msgid "SQLite CDR Backend"
++#~ msgstr "БÑкенд SQLite CDR"
++
++#~ msgid "Local Proxy Channel"
++#~ msgstr "Локальный прокÑи-канал"
++
++#~ msgid "Session Initiation Protocol (SIP)"
++#~ msgstr "Session Initiation Protocol - протокол уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑеанÑа (SIP)"
++
++#~ msgid "Adaptive Differential PCM Coder/Decoder"
++#~ msgstr "Ðдаптивный дифференциальный PCM кодер/декодер"
++
++#~ msgid "A-law Coder/Decoder"
++#~ msgstr "A-law кодер/декодер"
++
++#~ msgid "A-law and Mulaw direct Coder/Decoder"
++#~ msgstr "A-law и Mu-law прÑмой кодер/декодер"
++
++#~ msgid "ITU G.726-32kbps G726 Transcoder"
++#~ msgstr "ITU G.726-32кбит/Ñ G726 транÑкодер"
++
++#~ msgid "GSM/PCM16 (signed linear) Codec Translation"
++#~ msgstr "ТранÑлÑтор кодека GSM/PCM16 (знаковый линейный)"
++
++#~ msgid "Speex/PCM16 (signed linear) Codec Translator"
++#~ msgstr "ТранÑлÑтор кодека Speex/PCM16 (знаковый линейный)"
++
++#~ msgid "Mu-law Coder/Decoder"
++#~ msgstr "Mu-law кодер/декодер"
++
++#~ msgid "Sun Microsystems AU format (signed linear)"
++#~ msgstr "Формат Sun Microsystems AU (знаковый линейный)"
++
++#~ msgid "Raw G.726 (16/24/32/40kbps) data"
++#~ msgstr "Ðеобработанные данные G.726 (16/24/32/40кбит/Ñ)"
++
++#~ msgid "Raw G729 data"
++#~ msgstr "Ðеобработанные данные G729"
++
++#~ msgid "Raw GSM data"
++#~ msgstr "Ðеобработанные данные GSM"
++
++#~ msgid "Raw h263 data"
++#~ msgstr "Ðеобработанные данные h263"
++
++#~ msgid "JPEG (Joint Picture Experts Group) Image"
++#~ msgstr "Изображение JPEG (Joint Picture Experts Group) "
++
++#~ msgid "Dialogic VOX (ADPCM) File Format"
++#~ msgstr "Формат Dialogic VOX (ADPCM)"
++
++#~ msgid "Microsoft WAV format (8000hz Signed Line"
++#~ msgstr "Формат Microsoft WAV (800Гц, линейный знаковый)"
++
++#~ msgid "Microsoft WAV format (Proprietary GSM)"
++#~ msgstr "Формат Microsoft WAV (проприетарный GSM)"
++
++#~ msgid "Caller ID related dialplan functions"
++#~ msgstr "Функции правил набора Caller ID"
++
++#~ msgid "ENUM Functions"
++#~ msgstr "Функции ENUM"
++
++#~ msgid "URI encoding / decoding functions"
++#~ msgstr "Функции кодированиÑ/Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ URI"
++
++#~ msgid "Asterisk Extension Language Compiler"
++#~ msgstr "КомпилÑтор Ñзыка раÑширений Asterisk"
++
++#~ msgid "Text Extension Configuration"
++#~ msgstr "ÐаÑтройка текÑтового раÑширениÑ"
++
++#~ msgid "Wil Cal U (Auto Dialer)"
++#~ msgstr "Позвоню тебе (Wil Cal U, автодозвонщик)"
++
++#~ msgid "MySQL Config Resource"
++#~ msgstr "РеÑÑƒÑ€Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ MySQL"
++
++#~ msgid "ODBC Config Resource"
++#~ msgstr "РеÑÑƒÑ€Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ ODBC"
++
++#~ msgid "PGSQL Module"
++#~ msgstr "PGSQL модуль"
++
++#~ msgid "Cryptographic Digital Signatures"
++#~ msgstr "Цифровые подпиÑи"
++
++#~ msgid "Call Parking Resource"
++#~ msgstr "РеÑÑƒÑ€Ñ \"парковки\""
++
++#~ msgid "Indications Configuration"
++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°Ñ†Ð¸Ð¹"
++
++#~ msgid "Call Monitoring Resource"
++#~ msgstr "РеÑÑƒÑ€Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð° вызова"
++
++#~ msgid "ODBC Resource"
++#~ msgstr "РеÑÑƒÑ€Ñ ODBC"
++
++#~ msgid "SMDI Module"
++#~ msgstr "Модуль SMDI"
++
++#~ msgid "SNMP Module"
++#~ msgstr "Модуль SNMP"
++
++#~ msgid "Music On Hold"
++#~ msgstr "Музыка при ожидании"
++
++#~ msgid "Application"
++#~ msgstr "Приложение"
++
++#~ msgid "Directory of Music"
++#~ msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ¸"
++
++#~ msgid "Random Play"
++#~ msgstr "ВоÑпроизведение в Ñлучайном порÑдке"
++
++#~ msgid "DTMF mode"
++#~ msgstr "DTMF режим"
++
++#~ msgid "From user (required by many SIP providers)"
++#~ msgstr "From user (от пользователÑ, требуетÑÑ Ð¼Ð½Ð¾Ð³Ð¸Ð¼Ð¸ SIP-провайдерами)"
++
++#~ msgid "Allow Insecure for"
++#~ msgstr "Разрешить небезопаÑные длÑ"
++
++#~ msgid "Mailbox for MWI"
++#~ msgstr "Почтовый Ñщик Ð´Ð»Ñ MWI"
++
++#~ msgid "NAT between phone and Asterisk"
++#~ msgstr "NAT между телефоном и Asterisk"
++
++#~ msgid "Check tags in headers"
++#~ msgstr "ПроверÑÑ‚ÑŒ метки в заголовках"
++
++#~ msgid "Register connection"
++#~ msgstr "ЗарегиÑтрировать Ñоединение"
++
++#~ msgid "Client Type"
++#~ msgstr "Тип клиента"
++
++#~ msgid "Username"
++#~ msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
++
++#~ msgid "Section sipgeneral"
++#~ msgstr "Общие SIP"
++
++#~ msgid "SIP realm"
++#~ msgstr "SIP realm"
++
++#~ msgid "Voicemail general options"
++#~ msgstr "Общие наÑтройки голоÑовой почты"
++
++#~ msgid "From Email address of server"
++#~ msgstr "От адреÑа Ñл. почты Ñервера"
++
++#~ msgid "Voice Mail boxes"
++#~ msgstr "Ящики голоÑовой почты"
++
++#~ msgid "Email contains attachment"
++#~ msgstr "ПиÑьмо Ñодержит вложение"
++
++#~ msgid "Email"
++#~ msgstr "Эл. почта"
++
++#~ msgid "Display Name"
++#~ msgstr "Отображаемое имÑ"
++
++#~ msgid "Password"
++#~ msgstr "Пароль"
++
++#~ msgid "zone"
++#~ msgstr "зона"
++
++#~ msgid "Voice Zone settings"
++#~ msgstr "ÐаÑтройки голоÑовой зоны"
++
++#~ msgid "Message Format"
++#~ msgstr "Формат ÑообщениÑ"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/sk/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/sk/asterisk.po
+new file mode 100644
+index 0000000..e69de29
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/sv/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/sv/asterisk.po
+new file mode 100644
+index 0000000..e69de29
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/templates/asterisk.pot b/feeds/luci/applications/luci-app-asterisk/po/templates/asterisk.pot
+new file mode 100644
+index 0000000..e69de29
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/tr/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/tr/asterisk.po
+new file mode 100644
+index 0000000..c8b4e58
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/tr/asterisk.po
+@@ -0,0 +1,12 @@
++# asterisk.pot
++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \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"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/uk/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/uk/asterisk.po
+new file mode 100644
+index 0000000..d6dd63e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/uk/asterisk.po
+@@ -0,0 +1,79 @@
++# asterisk.pot
++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-21 14:22+0200\n"
++"Last-Translator: Anonymous Pootle User\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Головні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Asterisk"
++
++#~ msgid "AGI directory"
++#~ msgstr "AGI тека "
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Кешувати файли запиÑів поки йде запиÑ"
++
++#~ msgid "Debug Level"
++#~ msgstr "Рівень налагоджуваннÑ"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Вимкнути деÑкі попередженнÑ"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Зберегти дамп Ñдра в разі фатальної помилки"
++
++#~ msgid "High Priority"
++#~ msgstr "ВиÑокий пріоритет"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Ініціалізувати шифруваннÑ"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "ВикориÑтовувати внутрішні таймінги"
++
++#~ msgid "Log directory"
++#~ msgstr "Тека з журналом"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "МакÑимальна кількіÑÑ‚ÑŒ дозволених дзвінків"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "МакÑимальне навантаженнÑ, при Ñкому зупинÑти прийом дзвінків"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Вимкнути кольори в конÑолі"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Тека з кешованими звуковими файлами"
++
++#~ msgid "The Group to run as"
++#~ msgstr "ЗапуÑтити з правами Групи"
++
++#~ msgid "The User to run as"
++#~ msgstr "ЗапуÑтити з правами КориÑтувача"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Тека з голоÑовою поштою"
++
++#, fuzzy
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Uniquid з назвою ÑиÑтеми "
++
++#~ msgid "Time Zone"
++#~ msgstr "ЧаÑовий поÑÑ"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Дозволити переадреÑацію"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Видалити глобальні змінні"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/vi/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/vi/asterisk.po
+new file mode 100644
+index 0000000..d1cc6b2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/vi/asterisk.po
+@@ -0,0 +1,680 @@
++# asterisk.pot
++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:58+0200\n"
++"PO-Revision-Date: 2009-08-16 08:36+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Asterisk những tùy chá»n căn bản"
++
++#~ msgid "AGI directory"
++#~ msgstr "Thư mục AGI"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "Cache ghi lại tập tin âm thanh trong suốt qua trình recording"
++
++#~ msgid "Debug Level"
++#~ msgstr "Debug Level"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "Vô hiệu hóa một số cảnh báo"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "Dump core on crash"
++
++#~ msgid "High Priority"
++#~ msgstr "High Priority"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "Initialise Crypto"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "Sá»­ dụng thá»i gian ná»™i bá»™"
++
++#~ msgid "Log directory"
++#~ msgstr "Thư mục log"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "Số lượng cuá»™c gá»i tối Ä‘a cho phép"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "Mức Ä‘á»™ tải tối Ä‘a để ngừng thu nhận cuá»™c gá»i má»›i"
++
++#~ msgid "Disable console colors"
++#~ msgstr "Vô hiệu hóa bản Ä‘iá»u khiển màu sắc"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "Thư mục sound files cache"
++
++#~ msgid "The Group to run as"
++#~ msgstr "Nhóm vận hành như"
++
++#~ msgid "The User to run as"
++#~ msgstr "NgÆ°á»i sá»­ dụng vận hành nhÆ°"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "Thư mục Voicemail Spool "
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "Tiá»n tố UniquID vá»›i tên hệ thống"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr "Xây dựng đừng dẫn transcode via SLINEAR, không trực tiếp"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "Truyá»n SLINEAR silence trong khi recording má»™t channel"
++
++#~ msgid "Verbose Level"
++#~ msgstr "Verbose Level"
++
++#~ msgid "Section dialplan"
++#~ msgstr "Section dialplan"
++
++#~ msgid "include"
++#~ msgstr "bao gồm"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "Dialplan Extension"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "Dialplan tùy chá»n tổng quát"
++
++#~ msgid "Allow transfer"
++#~ msgstr "Cho phép chuyển đổi"
++
++#~ msgid "Clear global vars"
++#~ msgstr "Xóa global vars"
++
++#~ msgid "Dialplan Goto"
++#~ msgstr "Dialplan Goto"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "Dialplan Conference"
++
++#~ msgid "Dialplan Time"
++#~ msgstr "Dialplan Time"
++
++#~ msgid "Dialplan Voicemail"
++#~ msgstr "Dialplan Voicemail"
++
++#~ msgid "Dial Zones for Dialplan"
++#~ msgstr "Dial Zones cho Dialplan"
++
++#~ msgid "Prefix to add matching dialplans"
++#~ msgstr "Tiá»n tố để thêm vào matching dialplans"
++
++#~ msgid "Match International prefix"
++#~ msgstr "Match tiá»n tố quốc tê"
++
++#~ msgid "Prefix (0) to add/remove to/from international numbers"
++#~ msgstr "Tiá»n tố để thêm vào/ bá» ra/ từ số gá»i quốc tế"
++
++#~ msgid "localzone"
++#~ msgstr "vùng địa phương"
++
++#~ msgid "Match plan"
++#~ msgstr "Match plan"
++
++#~ msgid "Connection to use"
++#~ msgstr "Kết nối sử dụng"
++
++#~ msgid "Feature Key maps"
++#~ msgstr "Bản đồ phím tính năng"
++
++#~ msgid "Attended transfer key"
++#~ msgstr "Attended transfer key"
++
++#~ msgid "Blind transfer key"
++#~ msgstr "phím chuyển đổi ẩn"
++
++#~ msgid "Key to Disconnect call"
++#~ msgstr "phím để vô hiệu hóa cuá»™c gá»i"
++
++#~ msgid "Key to Park call"
++#~ msgstr "phím để định vị cuá»™c gá»i"
++
++#~ msgid "Parking Feature"
++#~ msgstr "Tính năng định vị"
++
++#~ msgid "ADSI Park"
++#~ msgstr "định vị ADSI"
++
++#~ msgid "Attended transfer timeout (sec)"
++#~ msgstr "Attended transfer timeout (sec)"
++
++#~ msgid "One touch record key"
++#~ msgstr "Phím thu chạm một lần"
++
++#~ msgid "Name of call context for parking"
++#~ msgstr "Tên của call context cho parking"
++
++#~ msgid "Sound file to play to parked caller"
++#~ msgstr "Tập tin âm thanh để play to parked caller"
++
++#~ msgid "Max time (ms) between digits for feature activation"
++#~ msgstr "Thá»i gian tối Ä‘a (ms) giữa các digits cho feature activation"
++
++#~ msgid "Method to Find Parking slot"
++#~ msgstr "Phương pháp tìm điểm định vị"
++
++#~ msgid "parkedmusicclass"
++#~ msgstr "parkedmusicclass"
++
++#~ msgid "Play courtesy tone to"
++#~ msgstr "Play courtesy tone để"
++
++#~ msgid "Enable Parking"
++#~ msgstr "cho phép định vị"
++
++#~ msgid "Extension to dial to park"
++#~ msgstr "nhanh số để gá»i để định vị"
++
++#~ msgid "Parking time (secs)"
++#~ msgstr "Thá»i gian định vị"
++
++#~ msgid "Range of extensions for call parking"
++#~ msgstr "Vùng của đuôi mở rộng cho call parking"
++
++#~ msgid "Pickup extension"
++#~ msgstr "Pickup extension"
++
++#~ msgid "Seconds to wait bewteen digits when transferring"
++#~ msgstr "Thá»i gian chá» giữa những chữ số khi chuyển đổi"
++
++#~ msgid "sound when attended transfer is complete"
++#~ msgstr "âm thanh khi chuyển đổi hoàn tất"
++
++#~ msgid "Sound when attended transfer fails"
++#~ msgstr "âm thanh khi chuyển đổi không thành công"
++
++#~ msgid "Reload Hardware Config"
++#~ msgstr "Tải lại cấu hình phần cứng"
++
++#~ msgid "Reboot Method"
++#~ msgstr "phương pháp khởi động lại"
++
++#~ msgid "Parameter"
++#~ msgstr "Tham số"
++
++#~ msgid "Option type"
++#~ msgstr "Lá»±a chá»n"
++
++#~ msgid "User name"
++#~ msgstr "Tên ngÆ°á»i dùng"
++
++#~ msgid "IAX General Options"
++#~ msgstr "Những lá»±a chá»n tổng quát IAX"
++
++#~ msgid "Allow Codecs"
++#~ msgstr "Cho phép Codecs"
++
++#~ msgid "Static"
++#~ msgstr "TÄ©nh"
++
++#~ msgid "Write Protect"
++#~ msgstr "Viết bảo vệ"
++
++#~ msgid "Meetme Conference"
++#~ msgstr "Gặp mặt thảo luận"
++
++#~ msgid "Admin PIN"
++#~ msgstr "PIN quản trị"
++
++#~ msgid "Meeting PIN"
++#~ msgstr "PIN cuộc gặp"
++
++#~ msgid "Meetme Conference General Options"
++#~ msgstr "Lá»±u chá»n chung vá» thảo luận trá»±c tiếp"
++
++#~ msgid "Number of 20ms audio buffers to be used"
++#~ msgstr "Số của 20ms audio buffers để được dùng"
++
++#~ msgid "Modules"
++#~ msgstr "Modules"
++
++#~ msgid "Alarm Receiver Application"
++#~ msgstr "Ứng dụng nhận báo thức"
++
++#~ msgid "Authentication Application"
++#~ msgstr "Ứng dụng xác thực"
++
++#~ msgid "Make sure asterisk doesnt save CDR"
++#~ msgstr "Bảo đảm asterisk không lưu CDR"
++
++#~ msgid "Check if channel is available"
++#~ msgstr "Kiểm tra xem nếu kênh đã có sẵn"
++
++#~ msgid "Listen in on any channel"
++#~ msgstr "Nghe trên bất kỳ kênh nào"
++
++#~ msgid "Control Playback Application"
++#~ msgstr "Äiá»u khiển ứng dụng phát lại"
++
++#~ msgid "Cuts up variables"
++#~ msgstr "Cuts up variables"
++
++#~ msgid "Database access functions"
++#~ msgstr "Chức năng truy cập cơ sở dữ liệu"
++
++#~ msgid "Dialing Application"
++#~ msgstr "Ứng dụng quay số"
++
++#~ msgid "Virtual Dictation Machine Application"
++#~ msgstr "Ứng dụng virtual Dictation Machine "
++
++#~ msgid "Directed Call Pickup Support"
++#~ msgstr "Directed hỗ trợ call pickup"
++
++#~ msgid "Extension Directory"
++#~ msgstr "Danh bạ nhánh số"
++
++#~ msgid "DISA (Direct Inward System Access) Application"
++#~ msgstr "Ứng dụng DISA (Direct Inward System Access) "
++
++#~ msgid "Dump channel variables Application"
++#~ msgstr "Dump channel variables Application"
++
++#~ msgid "Simple Echo Application"
++#~ msgstr "Ứng dụng Echo đơn giản"
++
++#~ msgid "ENUM Lookup"
++#~ msgstr "ENUM tra cứu"
++
++#~ msgid "Reevaluates strings"
++#~ msgstr "Äánh giá lại strings"
++
++#~ msgid "Executes applications"
++#~ msgstr "thực thi ứng dụng"
++
++#~ msgid "External IVR application interface"
++#~ msgstr "Ứng dụng giao diện bên ngoài IVR"
++
++#~ msgid "Fork The CDR into 2 seperate entities"
++#~ msgstr "Fork The CDR into 2 nhân riêng biệt"
++
++#~ msgid "Get ADSI CPE ID"
++#~ msgstr "Lấy ADSI CPE ID"
++
++#~ msgid "Group Management Routines"
++#~ msgstr "Group Management Routines"
++
++#~ msgid "Encode and Stream via icecast and ices"
++#~ msgstr "Encode và Stream via icecast và ices"
++
++#~ msgid "Image Transmission Application"
++#~ msgstr "Ứng dụng truyá»n hình ảnh"
++
++#~ msgid "Look up Caller*ID name/number from black"
++#~ msgstr "Tra cứu tên/số của ngÆ°á»i gá»i"
++
++#~ msgid "Look up CallerID Name from local databas"
++#~ msgstr "Tra cứu tên ngÆ°á»i gá»i từ cÆ¡ sở dữ liệu địa phÆ°Æ¡ng"
++
++#~ msgid "Extension Macros"
++#~ msgstr "Nhánh số Macro"
++
++#~ msgid "A simple math Application"
++#~ msgstr "Ứng dụng tính toán đơn giản"
++
++#~ msgid "MD5 checksum Application"
++#~ msgstr "Ứng dụng MD5 checksum "
++
++#~ msgid "Digital Milliwatt (mu-law) Test Application"
++#~ msgstr "Ứng dụng kiểm tra Digital Milliwatt (mu-law) "
++
++#~ msgid "Record a call and mix the audio during the recording"
++#~ msgstr "Thu âm cuá»™c gá»i và phối âm trong khi thu"
++
++#~ msgid "Call Parking and Announce Application"
++#~ msgstr "Äịnh vị cuá»™c gá»i và ứng dụng thông báo"
++
++#~ msgid "Trivial Playback Application"
++#~ msgstr "Ứng dụng trivial Playback "
++
++#~ msgid "Require phone number to be entered"
++#~ msgstr "Yêu cầu nhập số điện thoại"
++
++#~ msgid "True Call Queueing"
++#~ msgstr "True Call Queueing"
++
++#~ msgid "Random goto"
++#~ msgstr "Random goto"
++
++#~ msgid "Read Variable Application"
++#~ msgstr "Ứng dụng Ä‘á»c variable "
++
++#~ msgid "Read in a file"
++#~ msgstr "Äá»c trong má»™t tập tin"
++
++#~ msgid "Realtime Data Lookup/Rewrite"
++#~ msgstr "Tra cứu dữ liệu đúng lúc/ Viết lại"
++
++#~ msgid "Trivial Record Application"
++#~ msgstr "Ứng dụng trivial record"
++
++#~ msgid "Say time"
++#~ msgstr "Nói thá»i gian"
++
++#~ msgid "Send DTMF digits Application"
++#~ msgstr "Ứng dụng gửi những chữ số DTMF"
++
++#~ msgid "Send Text Applications"
++#~ msgstr "Gửi ứng dụng tin nhắn"
++
++#~ msgid "Set CallerID Application"
++#~ msgstr "Ứng dụng cài đặt định dạng cuá»™c gá»i"
++
++#~ msgid "CDR user field apps"
++#~ msgstr "CDR user field apps"
++
++#~ msgid "load => .so ; Set CallerID Name"
++#~ msgstr "load =&amp;gt; .so ; Äặt tên CallerID "
++
++#~ msgid "load => .so ; Set CallerID Number"
++#~ msgstr "load =&amp;gt; .so ; Äặt số CallerID "
++
++#~ msgid "Set RDNIS Number"
++#~ msgstr "Cài đặt số RDNIS"
++
++#~ msgid "Set ISDN Transfer Capability"
++#~ msgstr "Cài đặt công suất truyá»n tải ISDN"
++
++#~ msgid "SMS/PSTN handler"
++#~ msgstr "SMS/PSTN handler"
++
++#~ msgid "Hangs up the requested channel"
++#~ msgstr "Bãi bỠkênh yêu cầu"
++
++#~ msgid "Stack Routines"
++#~ msgstr "Ngăn xếp Routines"
++
++#~ msgid "Generic System() application"
++#~ msgstr "Ứng dụng Genetic System"
++
++#~ msgid "Playback with Talk Detection"
++#~ msgstr "Playback với bộ phát hiện tiếng nói"
++
++#~ msgid "Interface Test Application"
++#~ msgstr "Ứng dụng kiểm tra giao diện"
++
++#~ msgid "Transfer"
++#~ msgstr "truyá»n tải"
++
++#~ msgid "TXTCIDName"
++#~ msgstr "TXTCIDName"
++
++#~ msgid "Send URL Applications"
++#~ msgstr "Gửi những ứng dụng URL"
++
++#~ msgid "Custom User Event Application"
++#~ msgstr "Ứng dụng Custom User Event "
++
++#~ msgid "Send verbose output"
++#~ msgstr "Gá»­i verbose output"
++
++#~ msgid "Voicemail"
++#~ msgstr "Thư thoại"
++
++#~ msgid "Waits until first ring after time"
++#~ msgstr "Äợi tá»›i tiếng ring đầu tiên sau khi"
++
++#~ msgid "Wait For Silence Application"
++#~ msgstr "Äợi ứng dụng im lặng"
++
++#~ msgid "While Loops and Conditional Execution"
++#~ msgstr "Trong khi Loops và Conditional Execution"
++
++#~ msgid "Comma Separated Values CDR Backend"
++#~ msgstr "Comma Separated Values CDR Backend"
++
++#~ msgid "Customizable Comma Separated Values CDR Backend"
++#~ msgstr "Tùy chỉnh Comma Separated Values CDR Backend"
++
++#~ msgid "Asterisk Call Manager CDR Backend"
++#~ msgstr "Asterisk Call Manager CDR Backend"
++
++#~ msgid "MySQL CDR Backend"
++#~ msgstr "MySQL CDR Backend"
++
++#~ msgid "PostgreSQL CDR Backend"
++#~ msgstr "PostgreSQL CDR Backend"
++
++#~ msgid "SQLite CDR Backend"
++#~ msgstr "SQLite CDR Backend"
++
++#~ msgid "Agent Proxy Channel"
++#~ msgstr "Agent Proxy Channel"
++
++#~ msgid "Option chan_iax2"
++#~ msgstr "Tùy chá»n chan_iax2"
++
++#~ msgid "Local Proxy Channel"
++#~ msgstr "Local Proxy Channel"
++
++#~ msgid "Session Initiation Protocol (SIP)"
++#~ msgstr "Session Initiation Protocol (SIP)"
++
++#~ msgid "Adaptive Differential PCM Coder/Decoder"
++#~ msgstr "Adaptive Differential PCM Coder/Decoder"
++
++#~ msgid "A-law Coder/Decoder"
++#~ msgstr "A-law Coder/Decoder"
++
++#~ msgid "A-law and Mulaw direct Coder/Decoder"
++#~ msgstr "A-law and Mulaw direct Coder/Decoder"
++
++#~ msgid "ITU G.726-32kbps G726 Transcoder"
++#~ msgstr "ITU G.726-32kbps G726 Transcoder"
++
++#~ msgid "GSM/PCM16 (signed linear) Codec Translation"
++#~ msgstr "GSM/PCM16 (signed linear) Codec Translation"
++
++#~ msgid "Speex/PCM16 (signed linear) Codec Translator"
++#~ msgstr "Speex/PCM16 (signed linear) Codec Translator"
++
++#~ msgid "Mu-law Coder/Decoder"
++#~ msgstr "Mu-law Coder/Decoder"
++
++#~ msgid "Sun Microsystems AU format (signed linear)"
++#~ msgstr "Sun Microsystems AU format (signed linear)"
++
++#~ msgid "G.723.1 Simple Timestamp File Format"
++#~ msgstr "G.723.1 Simple Timestamp File Format"
++
++#~ msgid "Raw G.726 (16/24/32/40kbps) data"
++#~ msgstr "Raw G.726 (16/24/32/40kbps) data"
++
++#~ msgid "Raw G729 data"
++#~ msgstr "Raw G729 data"
++
++#~ msgid "Raw GSM data"
++#~ msgstr "Raw GSM data"
++
++#~ msgid "Raw h263 data"
++#~ msgstr "Raw h263 data"
++
++#~ msgid "JPEG (Joint Picture Experts Group) Image"
++#~ msgstr "JPEG (Joint Picture Experts Group) Image"
++
++#~ msgid "Raw uLaw 8khz Audio support (PCM)"
++#~ msgstr "Raw uLaw 8khz Audio support (PCM)"
++
++#~ msgid "load => .so ; Raw aLaw 8khz PCM Audio support"
++#~ msgstr "load =&amp;gt; .so ; Raw aLaw 8khz PCM Audio support"
++
++#~ msgid "Raw Signed Linear Audio support (SLN)"
++#~ msgstr "Raw Signed Linear Audio support (SLN)"
++
++#~ msgid "Dialogic VOX (ADPCM) File Format"
++#~ msgstr "Dialogic VOX (ADPCM) File Format"
++
++#~ msgid "Microsoft WAV format (8000hz Signed Line"
++#~ msgstr "Microsoft WAV format (8000hz Signed Line"
++
++#~ msgid "Microsoft WAV format (Proprietary GSM)"
++#~ msgstr "Microsoft WAV format (Proprietary GSM)"
++
++#~ msgid "Caller ID related dialplan functions"
++#~ msgstr "Caller ID liên quan đến chức năng dialplan "
++
++#~ msgid "ENUM Functions"
++#~ msgstr "chức năng ENUM"
++
++#~ msgid "URI encoding / decoding functions"
++#~ msgstr "Chức năng URI encoding / decoding "
++
++#~ msgid "Asterisk Extension Language Compiler"
++#~ msgstr "Asterisk Extension Language Compiler"
++
++#~ msgid "Text Extension Configuration"
++#~ msgstr "Cấu hình Text Extension "
++
++#~ msgid "load => .so ; Builtin dialplan functions"
++#~ msgstr "load =&amp;gt; .so ; chức năng Builtin dialplan "
++
++#~ msgid "Loopback Switch"
++#~ msgstr "Loopback Switch"
++
++#~ msgid "Realtime Switch"
++#~ msgstr "Realtime Switch"
++
++#~ msgid "Outgoing Spool Support"
++#~ msgstr "Hỗ trợ outgoing spool"
++
++#~ msgid "Wil Cal U (Auto Dialer)"
++#~ msgstr "Wil Cal U (Auto Dialer)"
++
++#~ msgid "MySQL Config Resource"
++#~ msgstr "MySQL Config Resource"
++
++#~ msgid "ODBC Config Resource"
++#~ msgstr "ODBC Config Resource"
++
++#~ msgid "PGSQL Module"
++#~ msgstr "PGSQL Module"
++
++#~ msgid "Cryptographic Digital Signatures"
++#~ msgstr "Cryptographic Digital Signatures"
++
++#~ msgid "Call Parking Resource"
++#~ msgstr "Call Parking Resource"
++
++#~ msgid "Indications Configuration"
++#~ msgstr "Cấu hình indications"
++
++#~ msgid "Call Monitoring Resource"
++#~ msgstr "Call Monitoring Resource"
++
++#~ msgid "Music On Hold Resource"
++#~ msgstr "Music On Hold Resource"
++
++#~ msgid "ODBC Resource"
++#~ msgstr "ODBC Resource"
++
++#~ msgid "SMDI Module"
++#~ msgstr "SMDI Module"
++
++#~ msgid "SNMP Module"
++#~ msgstr "SNMP Module"
++
++#~ msgid "Music On Hold"
++#~ msgstr "Music On Hold"
++
++#~ msgid "Application"
++#~ msgstr "Ứng dụng"
++
++#~ msgid "Directory of Music"
++#~ msgstr "Thư mục music"
++
++#~ msgid "Option mode"
++#~ msgstr "Chế Ä‘á»™ tùy chá»n"
++
++#~ msgid "Random Play"
++#~ msgstr "Random Play"
++
++#~ msgid "DTMF mode"
++#~ msgstr "chế độ DTMF"
++
++#~ msgid "Primary domain identity for From: headers"
++#~ msgstr "Nhận dạng primary domain cho From: headers"
++
++#~ msgid "From user (required by many SIP providers)"
++#~ msgstr "Từ user (yêu cầu bởi nhiá»u nhà cung cấp SIP)"
++
++#~ msgid "Ring on incoming dialplan contexts"
++#~ msgstr "Ring on incoming dialplan contexts"
++
++#~ msgid "Allow Insecure for"
++#~ msgstr "Cho phép không an toàn cho"
++
++#~ msgid "Mailbox for MWI"
++#~ msgstr "Há»™p thÆ° cho MWI"
++
++#~ msgid "NAT between phone and Asterisk"
++#~ msgstr "NAT giữa điện thoại và Asterisk"
++
++#~ msgid "Check tags in headers"
++#~ msgstr "Kiểm tra tags trong headers"
++
++#~ msgid "Reply Timeout (ms) for down connection"
++#~ msgstr "Trả lá»i Timeout (ms) cho down kết nối"
++
++#~ msgid "Register connection"
++#~ msgstr "Äăng ký kết nối"
++
++#~ msgid "Dial own extension for mailbox"
++#~ msgstr "Gá»i nhánh số cho há»™p thÆ°"
++
++#~ msgid "Client Type"
++#~ msgstr "Loại Client"
++
++#~ msgid "Username"
++#~ msgstr "Username"
++
++#~ msgid "Section sipgeneral"
++#~ msgstr "Section sipgeneral"
++
++#~ msgid "Allow codecs"
++#~ msgstr "Cho phép Codecs"
++
++#~ msgid "SIP realm"
++#~ msgstr "SIP realm"
++
++#~ msgid "Voicemail general options"
++#~ msgstr "ThÆ° thoại tùy chá»n tổng quát"
++
++#~ msgid "From Email address of server"
++#~ msgstr "Từ địa chỉ email của server"
++
++#~ msgid "Voice Mail boxes"
++#~ msgstr "Hộp thư thoại"
++
++#~ msgid "Email contains attachment"
++#~ msgstr "Email bao gồm attachment"
++
++#~ msgid "Email"
++#~ msgstr "Email"
++
++#~ msgid "Display Name"
++#~ msgstr "Tên display"
++
++#~ msgid "Password"
++#~ msgstr "Mật khẩu"
++
++#~ msgid "zone"
++#~ msgstr "zone"
++
++#~ msgid "Voice Zone settings"
++#~ msgstr "Cài đặt voice zone"
++
++#~ msgid "Message Format"
++#~ msgstr "Message Format"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/zh-cn/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/zh-cn/asterisk.po
+new file mode 100644
+index 0000000..9ef2f1f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/zh-cn/asterisk.po
+@@ -0,0 +1,171 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2012-04-02 19:34+0200\n"
++"Last-Translator: Anonymous Pootle User\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: zh_CN\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: Pootle 2.0.4\n"
++
++#~ msgid "Asterisk General Options"
++#~ msgstr "Asterisk 基本选项"
++
++# test
++#~ msgid "AGI directory"
++#~ msgstr "AGI 目录"
++
++#~ msgid "Cache recorded sound files during recording"
++#~ msgstr "录音时缓存录音文件"
++
++#~ msgid "Debug Level"
++#~ msgstr "调试级别"
++
++#~ msgid "Disable some warnings"
++#~ msgstr "å±è”½éƒ¨åˆ†è­¦å‘Š"
++
++#~ msgid "Dump core on crash"
++#~ msgstr "系统崩溃时记录错误信æ¯"
++
++#~ msgid "High Priority"
++#~ msgstr "高优先级"
++
++#~ msgid "Initialise Crypto"
++#~ msgstr "åˆå§‹åŒ–加密"
++
++#~ msgid "Use Internal Timing"
++#~ msgstr "使用内部计时器"
++
++#~ msgid "Log directory"
++#~ msgstr "日志目录"
++
++#~ msgid "Maximum number of calls allowed"
++#~ msgstr "最大å…许呼å«æ•°"
++
++#~ msgid "Maximum load to stop accepting new calls"
++#~ msgstr "å…许接å—新呼å«çš„最大负载"
++
++#~ msgid "Disable console colors"
++#~ msgstr "ç¦ç”¨æŽ§åˆ¶å°è‰²å½©"
++
++#~ msgid "Sound files Cache directory"
++#~ msgstr "音效文件缓存目录"
++
++#~ msgid "The Group to run as"
++#~ msgstr "以此“组â€æƒé™è¿è¡Œ"
++
++#~ msgid "The User to run as"
++#~ msgstr "以此“用户â€èº«ä»½è¿è¡Œ"
++
++#~ msgid "Voicemail Spool directory"
++#~ msgstr "语音邮件缓存目录"
++
++#~ msgid "Prefix UniquID with system name"
++#~ msgstr "UniquIDå‰åŠ ç³»ç»Ÿååšå‰ç¼€"
++
++#~ msgid "Build transcode paths via SLINEAR, not directly"
++#~ msgstr "ç”±SLINEAR间接建立转ç è·¯å¾„"
++
++#~ msgid "Transmit SLINEAR silence while recording a channel"
++#~ msgstr "对频é“录音时传é€SLINEARé™é»˜"
++
++#~ msgid "Verbose Level"
++#~ msgstr "详细级别"
++
++#~ msgid "Time Zone"
++#~ msgstr "时区"
++
++#~ msgid "Section dialplan"
++#~ msgstr "段内拨å·è®¡åˆ’"
++
++#~ msgid "include"
++#~ msgstr "包å«"
++
++#~ msgid "Dialplan Extension"
++#~ msgstr "拨å·è®¡åˆ’ 扩展"
++
++#~ msgid "Dialplan General Options"
++#~ msgstr "拨å·è®¡åˆ’ 基本å‚æ•°"
++
++#~ msgid "Allow transfer"
++#~ msgstr "å…许 呼å«è½¬ç§»"
++
++#~ msgid "Clear global vars"
++#~ msgstr "清除全局å˜é‡"
++
++#~ msgid "Dialplan Goto"
++#~ msgstr "拨å·è®¡åˆ’至"
++
++#~ msgid "Dialplan Conference"
++#~ msgstr "会议拨å·è®¡åˆ’"
++
++#~ msgid "Dialplan Time"
++#~ msgstr "时间拨å·è®¡åˆ’"
++
++#~ msgid "Dialplan Voicemail"
++#~ msgstr "语音信箱拨å·è®¡åˆ’"
++
++#~ msgid "Dial Zones for Dialplan"
++#~ msgstr "适用拨å·è®¡åˆ’的拨å·åŒºåŸŸ"
++
++#~ msgid "Prefix to add matching dialplans"
++#~ msgstr "用于匹é…拨å·è®¡åˆ’çš„å‰ç¼€"
++
++#~ msgid "Match International prefix"
++#~ msgstr "匹é…的国际å‰ç¼€"
++
++#~ msgid "localzone"
++#~ msgstr "本地区域"
++
++#~ msgid "Match plan"
++#~ msgstr "匹é…计划"
++
++#~ msgid "Connection to use"
++#~ msgstr "使用连接"
++
++#~ msgid "Feature Key maps"
++#~ msgstr "特殊键映射"
++
++#~ msgid "Attended transfer key"
++#~ msgstr "加入传输键"
++
++#~ msgid "Blind transfer key"
++#~ msgstr "å±è”½ä¼ è¾“é”®"
++
++#~ msgid "Key to Disconnect call"
++#~ msgstr "结æŸå‘¼å«é”®"
++
++#~ msgid "Key to Park call"
++#~ msgstr "呼å«é©»ç•™é”®"
++
++#~ msgid "Parking Feature"
++#~ msgstr "驻留特性"
++
++#~ msgid "ADSI Park"
++#~ msgstr "ADSI驻留"
++
++#~ msgid "Attended transfer timeout (sec)"
++#~ msgstr "加入传输超时(秒)"
++
++#~ msgid "One touch record key"
++#~ msgstr "一键录制"
++
++#~ msgid "Email"
++#~ msgstr "Email"
++
++#~ msgid "Display Name"
++#~ msgstr "显示åå­—"
++
++#~ msgid "Password"
++#~ msgstr "密ç "
++
++#~ msgid "zone"
++#~ msgstr "区"
++
++#~ msgid "Message Format"
++#~ msgstr "消æ¯æ ¼å¼"
+diff --git a/feeds/luci/applications/luci-app-asterisk/po/zh-tw/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/zh-tw/asterisk.po
+new file mode 100644
+index 0000000..c7eef9d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/po/zh-tw/asterisk.po
+@@ -0,0 +1,13 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-08-06 23:52+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=utf-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.9.0\n"
+diff --git a/feeds/luci/applications/luci-app-asterisk/root/etc/config/asterisk b/feeds/luci/applications/luci-app-asterisk/root/etc/config/asterisk
+new file mode 100644
+index 0000000..2484097
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/root/etc/config/asterisk
+@@ -0,0 +1,231 @@
++config 'asterisk'
++ option 'verbose' 3
++ option 'debug' 3
++ option 'zone' 'Australia/Perth'
++
++config 'hardware' 'reboot'
++ option 'method' 'web'
++ option 'param' 'http://ata.lan/admin/reboot'
++
++config 'feature' 'park'
++ option 'parkenabled' 'yes'
++ option 'parkext' '700'
++ option 'parkpos' '701-720'
++ option 'context' 'parkedcalls'
++ option 'parkingtime' '45'
++ option 'courtesytone' 'beep'
++ option 'parkedplay' 'caller'
++ option 'adsipark' 'yes'
++ option 'findslot' 'first'
++ option 'parkedmusicclass' 'default'
++ option 'transferdigittimeout' '3'
++ option 'xfersound' 'beep'
++ option 'xferfailsound' 'beeperr'
++ option 'pickupexten' '"*8"'
++ option 'featuredigittimeout' '500'
++ option 'atxfernoanswertimeout' '15'
++
++config 'feature' 'map'
++ option 'blindxfer' '#1'
++ option 'disconnect' '*0'
++ option 'automon' '*1'
++ option 'atxfer' '#2'
++ option 'parkcall' '#30'
++
++config 'sipgeneral'
++ option 'realm' 'sip.mydomain.net'
++ option 'allow' 'alaw'
++ option 'extension' '102'
++
++config 'module'
++ option 'res_config_mysql' 'no'
++ option 'res_crypto' 'auto'
++ option 'chan_iax2' 'yes'
++
++config 'sip' 'PAP2T'
++ option 'type' 'friend'
++ option 'extension' '101'
++ option 'username' 'PAP2T'
++ option 'secret' 'mypass'
++ option 'port' '5061'
++ option 'host' ''
++ option 'dtmfmode' 'rfc2833'
++ option 'insecure' 'very'
++ option 'context' 'internal'
++ option 'mailbox' '1001@default'
++ option 'nat' 'no'
++ option 'canreinvite' 'nonat'
++ option 'selfmailbox' 'yes'
++ option 'incoming' 'provider_inbound'
++
++config 'sip' 'PAP2T2'
++ option 'type' 'friend'
++ option 'extension' '101'
++ option 'username' 'PAP2T2'
++ option 'secret' 'mysecret'
++ option 'port' '5060'
++ option 'host' ''
++ option 'dtmfmode' 'rfc2833'
++ option 'insecure' 'very'
++ option 'context' 'internal'
++ option 'mailbox' '1001@default'
++ option 'nat' 'no'
++ option 'canreinvite' 'nonat'
++ option 'selfmailbox' 'yes'
++ option 'incoming' 'provider_inbound'
++
++config 'sip' 'providerphone'
++ option 'provider' 'yes'
++ option 'type' 'friend'
++ option 'timeout' '55'
++ option 'internationalprefix' '0011'
++ option 'alwaysinternational' 'no'
++ option 'countrycode' '63'
++ option 'register' 'yes'
++ option 'host' '200.200.200.200'
++ option 'username' '0899999999'
++ option 'fromuser' '0899999999'
++ option 'secret' 'mysecret'
++ option 'fromdomain' 'providerphone.provider.net.au'
++ option 'context' 'provider_inbound'
++ option 'canreinvite' 'no'
++ option 'nat' 'yes'
++ option 'qualify' 'yes'
++ option 'insecure' 'very'
++ option 'pedantic' 'no'
++ option 'qualify' '1000'
++
++config 'iaxgeneral'
++ option 'static' 'yes'
++ option 'writeprotect' 'no'
++ option 'canreinvite' 'no'
++ option 'allow' 'ulaw,gsm'
++
++config 'iax' 'nell'
++ option 'type' 'friend'
++ option 'extension' '108'
++ option 'host' ''
++ option 'username' 'nell'
++ option 'secret' 'mypass'
++ option 'context' 'internal'
++
++config 'iax' 'iax_vista'
++ option 'extension' '106'
++ option 'type' 'friend'
++ option 'host' ''
++ option 'username' 'vista'
++ option 'secret' 'mysecret'
++ option 'context' 'internal'
++
++config 'iax' 'sam'
++ option 'type' 'friend'
++ option 'extension' '103'
++ option 'host' ''
++ option 'username' 'sam'
++ option 'secret' 'mysecret'
++ option 'context' 'internal'
++
++config 'voicegeneral'
++ option 'serveremail' 'voice@sip.mydomain.net'
++
++config 'voicemail'
++ option 'number' '1001'
++ option 'context' 'default'
++ option 'password' '0000'
++ option 'name' 'Family'
++ option 'email' 'us@mydomain.net'
++ option 'zone' 'wa'
++ option 'attach' 'no'
++
++config 'voicezone' 'wa'
++ option 'zone' 'Australia/Perth'
++ option 'message' 'Q IMp'
++
++config 'voicezone' 'military'
++ option 'zone' 'Zulu'
++ option 'message' '"vm-received" q "digits/at" H N "hours" "phonetic/z_p"'
++
++config 'incominggeneral'
++ option 'allowtransfer' 'no'
++ option 'timeout' '20'
++ option 'answerfirst' 'no'
++ option 'mailbox' '1001@default'
++
++config 'dialplangeneral'
++ option 'static' 'yes'
++ option 'writeprotect' 'no'
++ option 'canreinvite' 'no'
++ option 'clearglobalvars' 'no'
++ option 'allowtransfer' 'no'
++
++config 'dialplan' 'internal'
++ option 'include' 'localcall interstate smartnumber emergency extensions'
++
++config 'dialplanvoice'
++ option 'dialplan' 'internal'
++ option 'extension' '1001'
++ option 'voicecontext' 'default'
++ option 'voicebox' '1001'
++
++config 'dialplansaytime'
++ option 'dialplan' 'internal'
++ option 'extension' '108'
++
++config 'dialplanmeetme'
++ option 'dialplan' 'internal'
++ option 'extension' '109'
++ option 'room' '101'
++
++config 'dialplanmeetme'
++ option 'dialplan' 'internal'
++ option 'extension' '1009'
++ option 'room' ''
++
++config 'dialplan' 'localinternational'
++ option 'include' 'mobile interstate'
++
++config 'dialzone' 'interstate'
++ option 'uses' 'SIP/providerphone'
++ option 'match' '0[235-8]NXXXXXXX'
++ option 'localprefix' '0'
++
++config 'dialzone' 'mobile'
++ option 'uses' 'SIP/providerphone'
++ option 'match' '04XXXXXXXX'
++ option 'localprefix' '0'
++
++config 'dialzone' 'smartnumber'
++ option 'uses' 'SIP/providerphone'
++ option 'match' '1[835]00.'
++ option 'match' '13ZXXX'
++
++config 'dialzone' 'emergency'
++ option 'uses' 'SIP/providerphone'
++ option 'match' '000'
++ option 'match' '112'
++
++config 'dialzone' 'localcall'
++ option 'uses' 'SIP/providerphone'
++ option 'match' 'NXXXXXXX'
++ option 'addprefix' '08'
++ option 'localprefix' '0'
++
++config 'dialzone' 'international'
++ option 'uses' 'SIP/providerphone'
++ option 'international' '0011,+'
++ option 'localzone' 'localinternational'
++ option 'localprefix' '0'
++ option 'addprefix' ''
++
++config 'meetmegeneral'
++ option 'audiobuffers' '32'
++
++config 'meetme'
++ option 'room' '101'
++ option 'pin' ''
++ option 'adminpin' ''
++
++config 'moh' 'default'
++ option 'mode' 'files'
++ option 'directory' '/opt/moh'
++ option 'random' 'no'
+diff --git a/feeds/luci/applications/luci-app-asterisk/root/etc/uci-defaults/luci-asterisk b/feeds/luci/applications/luci-app-asterisk/root/etc/uci-defaults/luci-asterisk
+new file mode 100755
+index 0000000..e45819f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-asterisk/root/etc/uci-defaults/luci-asterisk
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@asterisk[-1]
++ add ucitrack asterisk
++ set ucitrack.@asterisk[-1].init=asterisk
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-commands/Makefile b/feeds/luci/applications/luci-app-commands/Makefile
+new file mode 100644
+index 0000000..dc5d0ca
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Shell Command Module
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-commands/luasrc/controller/commands.lua b/feeds/luci/applications/luci-app-commands/luasrc/controller/commands.lua
+new file mode 100644
+index 0000000..16528d1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/luasrc/controller/commands.lua
+@@ -0,0 +1,227 @@
++-- Copyright 2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.commands", package.seeall)
++
++function index()
++ entry({"admin", "system", "commands"}, firstchild(), _("Custom Commands"), 80)
++ entry({"admin", "system", "commands", "dashboard"}, template("commands"), _("Dashboard"), 1)
++ entry({"admin", "system", "commands", "config"}, cbi("commands"), _("Configure"), 2)
++ entry({"admin", "system", "commands", "run"}, call("action_run"), nil, 3).leaf = true
++ entry({"admin", "system", "commands", "download"}, call("action_download"), nil, 3).leaf = true
++
++ entry({"command"}, call("action_public"), nil, 1).leaf = true
++end
++
++--- Decode a given string into arguments following shell quoting rules
++--- [[abc \def "foo\"bar" abc'def']] -> [[abc def]] [[foo"bar]] [[abcdef]]
++local function parse_args(str)
++ local args = { }
++
++ local function isspace(c)
++ if c == 9 or c == 10 or c == 11 or c == 12 or c == 13 or c == 32 then
++ return c
++ end
++ end
++
++ local function isquote(c)
++ if c == 34 or c == 39 or c == 96 then
++ return c
++ end
++ end
++
++ local function isescape(c)
++ if c == 92 then
++ return c
++ end
++ end
++
++ local function ismeta(c)
++ if c == 36 or c == 92 or c == 96 then
++ return c
++ end
++ end
++
++ --- Convert given table of byte values into a Lua string and append it to
++ --- the "args" table. Segment byte value sequence into chunks of 256 values
++ --- to not trip over the parameter limit for string.char()
++ local function putstr(bytes)
++ local chunks = { }
++ local csz = 256
++ local upk = unpack
++ local chr = string.char
++ local min = math.min
++ local len = #bytes
++ local off
++
++ for off = 1, len, csz do
++ chunks[#chunks+1] = chr(upk(bytes, off, min(off + csz - 1, len)))
++ end
++
++ args[#args+1] = table.concat(chunks)
++ end
++
++ --- Scan substring defined by the indexes [s, e] of the string "str",
++ --- perform unquoting and de-escaping on the fly and store the result in
++ --- a table of byte values which is passed to putstr()
++ local function unquote(s, e)
++ local off, esc, quote
++ local res = { }
++
++ for off = s, e do
++ local byte = str:byte(off)
++ local q = isquote(byte)
++ local e = isescape(byte)
++ local m = ismeta(byte)
++
++ if e then
++ esc = true
++ elseif esc then
++ if m then res[#res+1] = 92 end
++ res[#res+1] = byte
++ esc = false
++ elseif q and quote and q == quote then
++ quote = nil
++ elseif q and not quote then
++ quote = q
++ else
++ if m then res[#res+1] = 92 end
++ res[#res+1] = byte
++ end
++ end
++
++ putstr(res)
++ end
++
++ --- Find substring boundaries in "str". Ignore escaped or quoted
++ --- whitespace, pass found start- and end-index for each substring
++ --- to unquote()
++ local off, esc, start, quote
++ for off = 1, #str + 1 do
++ local byte = str:byte(off)
++ local q = isquote(byte)
++ local s = isspace(byte) or (off > #str)
++ local e = isescape(byte)
++
++ if esc then
++ esc = false
++ elseif e then
++ esc = true
++ elseif q and quote and q == quote then
++ quote = nil
++ elseif q and not quote then
++ start = start or off
++ quote = q
++ elseif s and not quote then
++ if start then
++ unquote(start, off - 1)
++ start = nil
++ end
++ else
++ start = start or off
++ end
++ end
++
++ --- If the "quote" is still set we encountered an unfinished string
++ if quote then
++ unquote(start, #str)
++ end
++
++ return args
++end
++
++local function parse_cmdline(cmdid, args)
++ local uci = require "luci.model.uci".cursor()
++ if uci:get("luci", cmdid) == "command" then
++ local cmd = uci:get_all("luci", cmdid)
++ local argv = parse_args(cmd.command)
++ local i, v
++
++ if cmd.param == "1" and args then
++ for i, v in ipairs(parse_args(luci.http.urldecode(args))) do
++ argv[#argv+1] = v
++ end
++ end
++
++ for i, v in ipairs(argv) do
++ if v:match("[^%w%.%-i/]") then
++ argv[i] = '"%s"' % v:gsub('"', '\\"')
++ end
++ end
++
++ return argv
++ end
++end
++
++function action_run(...)
++ local fs = require "nixio.fs"
++ local argv = parse_cmdline(...)
++ if argv then
++ local outfile = os.tmpname()
++ local errfile = os.tmpname()
++
++ local rv = os.execute(table.concat(argv, " ") .. " >%s 2>%s" %{ outfile, errfile })
++ local stdout = fs.readfile(outfile, 1024 * 512) or ""
++ local stderr = fs.readfile(errfile, 1024 * 512) or ""
++
++ fs.unlink(outfile)
++ fs.unlink(errfile)
++
++ local binary = not not (stdout:match("[%z\1-\8\14-\31]"))
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json({
++ command = table.concat(argv, " "),
++ stdout = not binary and stdout,
++ stderr = stderr,
++ exitcode = rv,
++ binary = binary
++ })
++ else
++ luci.http.status(404, "No such command")
++ end
++end
++
++function action_download(...)
++ local fs = require "nixio.fs"
++ local argv = parse_cmdline(...)
++ if argv then
++ local fd = io.popen(table.concat(argv, " ") .. " 2>/dev/null")
++ if fd then
++ local chunk = fd:read(4096) or ""
++ local name
++ if chunk:match("[%z\1-\8\14-\31]") then
++ luci.http.header("Content-Disposition", "attachment; filename=%s"
++ % fs.basename(argv[1]):gsub("%W+", ".") .. ".bin")
++ luci.http.prepare_content("application/octet-stream")
++ else
++ luci.http.header("Content-Disposition", "attachment; filename=%s"
++ % fs.basename(argv[1]):gsub("%W+", ".") .. ".txt")
++ luci.http.prepare_content("text/plain")
++ end
++
++ while chunk do
++ luci.http.write(chunk)
++ chunk = fd:read(4096)
++ end
++
++ fd:close()
++ else
++ luci.http.status(500, "Failed to execute command")
++ end
++ else
++ luci.http.status(404, "No such command")
++ end
++end
++
++function action_public(cmdid, args)
++ local uci = require "luci.model.uci".cursor()
++ if cmdid and
++ uci:get("luci", cmdid) == "command" and
++ uci:get("luci", cmdid, "public") == "1"
++ then
++ action_download(cmdid, args)
++ else
++ luci.http.status(403, "Access to command denied")
++ end
++end
+diff --git a/feeds/luci/applications/luci-app-commands/luasrc/model/cbi/commands.lua b/feeds/luci/applications/luci-app-commands/luasrc/model/cbi/commands.lua
+new file mode 100644
+index 0000000..7794f15
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/luasrc/model/cbi/commands.lua
+@@ -0,0 +1,27 @@
++-- Copyright 2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local m, s
++
++m = Map("luci", translate("Custom Commands"),
++ translate("This page allows you to configure custom shell commands which can be easily invoked from the web interface."))
++
++s = m:section(TypedSection, "command", "")
++s.template = "cbi/tblsection"
++s.anonymous = true
++s.addremove = true
++
++
++s:option(Value, "name", translate("Description"),
++ translate("A short textual description of the configured command"))
++
++s:option(Value, "command", translate("Command"),
++ translate("Command line to execute"))
++
++s:option(Flag, "param", translate("Custom arguments"),
++ translate("Allow the user to provide additional command line arguments"))
++
++s:option(Flag, "public", translate("Public access"),
++ translate("Allow executing the command and downloading its output without prior authentication"))
++
++return m
+diff --git a/feeds/luci/applications/luci-app-commands/luasrc/view/commands.htm b/feeds/luci/applications/luci-app-commands/luasrc/view/commands.htm
+new file mode 100644
+index 0000000..73b9e6a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/luasrc/view/commands.htm
+@@ -0,0 +1,169 @@
++<%#
++ Copyright 2012 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<% css = [[
++
++.commandbox {
++ height: 12em;
++ width: 30%;
++ float: left;
++ height: 12em;
++ margin: 5px;
++ position: relative;
++}
++
++.commandbox h3 {
++ font-size: 1.5em !important;
++ line-height: 2em !important;
++ margin: 0 !important;
++}
++
++.commandbox input[type="text"] {
++ width: 50% !important;
++}
++
++.commandbox div {
++ position: absolute;
++ left: 0;
++ bottom: 1.5em;
++}
++
++]] -%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ var stxhr = new XHR();
++
++ function command_run(id)
++ {
++ var args;
++ var field = document.getElementById(id);
++ if (field)
++ args = encodeURIComponent(field.value);
++
++ var legend = document.getElementById('command-rc-legend');
++ var output = document.getElementById('command-rc-output');
++
++ if (legend && output)
++ {
++ output.innerHTML =
++ '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' +
++ '<%:Waiting for command to complete...%>'
++ ;
++
++ legend.parentNode.style.display = 'block';
++ legend.style.display = 'inline';
++
++ stxhr.get('<%=url('admin/system/commands/run')%>/' + id + (args ? '/' + args : ''), null,
++ function(x, st)
++ {
++ if (st)
++ {
++ if (st.binary)
++ st.stdout = '[<%:Binary data not displayed, download instead.%>]';
++
++ legend.style.display = 'none';
++ output.innerHTML = String.format(
++ '<pre><strong># %h\n</strong>%h<span style="color:red">%h</span></pre>' +
++ '<div class="alert-message warning">%s (<%:Code:%> %d)</div>',
++ st.command, st.stdout, st.stderr,
++ (st.exitcode == 0) ? '<%:Command successful%>' : '<%:Command failed%>',
++ st.exitcode);
++ }
++ else
++ {
++ legend.style.display = 'none';
++ output.innerHTML = '<span class="error"><%:Failed to execute command!%></span>';
++ }
++
++ location.hash = '#output';
++ }
++ );
++ }
++ }
++
++ function command_download(id)
++ {
++ var args;
++ var field = document.getElementById(id);
++ if (field)
++ args = encodeURIComponent(field.value);
++
++ location.href = '<%=url('admin/system/commands/download')%>/' + id + (args ? '/' + args : '');
++ }
++
++ function command_link(id)
++ {
++ var legend = document.getElementById('command-rc-legend');
++ var output = document.getElementById('command-rc-output');
++
++ var args;
++ var field = document.getElementById(id);
++ if (field)
++ args = encodeURIComponent(field.value);
++
++ if (legend && output)
++ {
++ var link = location.protocol + '//' + location.hostname +
++ (location.port ? ':' + location.port : '') +
++ location.pathname.split(';')[0] + 'command/' +
++ id + (args ? '/' + args : '');
++
++ legend.style.display = 'none';
++ output.parentNode.style.display = 'block';
++ output.innerHTML = String.format(
++ '<div class="alert-message"><%:Access command with%> <a href="%s">%s</a></div>',
++ link, link
++ );
++
++ location.hash = '#output';
++ }
++ }
++
++//]]></script>
++
++<%
++ local uci = require "luci.model.uci".cursor()
++ local commands = { }
++
++ uci:foreach("luci", "command", function(s) commands[#commands+1] = s end)
++%>
++
++<form method="get" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
++ <div class="cbi-map">
++ <h2 name="content"><%:Custom Commands%></h2>
++
++ <fieldset class="cbi-section">
++ <% local _, command; for _, command in ipairs(commands) do %>
++ <div class="commandbox">
++ <h3><%=pcdata(command.name)%></h3>
++ <p><%:Command:%> <code><%=pcdata(command.command)%></code></p>
++ <% if command.param == "1" then %>
++ <p><%:Arguments:%> <input type="text" id="<%=command['.name']%>" /></p>
++ <% end %>
++ <div>
++ <input type="button" value="<%:Run%>" class="cbi-button cbi-button-apply" onclick="command_run('<%=command['.name']%>')" />
++ <input type="button" value="<%:Download%>" class="cbi-button cbi-button-download" onclick="command_download('<%=command['.name']%>')" />
++ <% if command.public == "1" then %>
++ <input type="button" value="<%:Link%>" class="cbi-button cbi-button-link" onclick="command_link('<%=command['.name']%>')" />
++ <% end %>
++ </div>
++ </div>
++ <% end %>
++
++ <br style="clear:both" /><br />
++ <a name="output"></a>
++ </fieldset>
++ </div>
++
++ <fieldset class="cbi-section" style="display:none">
++ <legend id="command-rc-legend"><%:Collecting data...%></legend>
++ <span id="command-rc-output"></span>
++ </fieldset>
++</form>
++
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-commands/po/ca/commands.po b/feeds/luci/applications/luci-app-commands/po/ca/commands.po
+new file mode 100644
+index 0000000..9dc23b2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/ca/commands.po
+@@ -0,0 +1,98 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-06 10:41+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "Una breva descripció textual de l'ordre configurat"
++
++msgid "Access command with"
++msgstr "Accedeix l'ordre amb"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Permet la execució de l'ordre i la baixada de la seva sortida sense "
++"autenticació prèvia"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "Permet que l'usuari proveïa paràmetres de línia de consola addicionals"
++
++msgid "Arguments:"
++msgstr "Paràmetres:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Els dades binaris no es mostren, descarregueu-los."
++
++msgid "Code:"
++msgstr "Codi:"
++
++msgid "Collecting data..."
++msgstr "Recollint dades..."
++
++msgid "Command"
++msgstr "Ordre"
++
++msgid "Command failed"
++msgstr "L'ordre ha fallat"
++
++msgid "Command line to execute"
++msgstr "Línia d'ordre per executar"
++
++msgid "Command successful"
++msgstr "L'ordre ha tingut èxit"
++
++msgid "Command:"
++msgstr "Ordre;"
++
++msgid "Configure"
++msgstr "Configura"
++
++msgid "Custom Commands"
++msgstr "Ordres personalitzats"
++
++msgid "Custom arguments"
++msgstr "Paràmetres personalitzats"
++
++msgid "Dashboard"
++msgstr "Panell"
++
++msgid "Description"
++msgstr "Descripció"
++
++msgid "Download"
++msgstr "Baixa"
++
++msgid "Failed to execute command!"
++msgstr "L'execució de l'ordre ha fallat!"
++
++msgid "Link"
++msgstr "Enllaç"
++
++msgid "Loading"
++msgstr "Carregant"
++
++msgid "Public access"
++msgstr "Accés públic"
++
++msgid "Run"
++msgstr "Executa"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Aquesta pàgina us permet configurar ordres de consola personalitzats que es "
++"poden invocar fàcilment de la interfície web."
++
++msgid "Waiting for command to complete..."
++msgstr "Esperant que l'ordre acabi..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/cs/commands.po b/feeds/luci/applications/luci-app-commands/po/cs/commands.po
+new file mode 100644
+index 0000000..64949bd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/cs/commands.po
+@@ -0,0 +1,96 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-08-04 19:01+0200\n"
++"Last-Translator: KubaCZ <kuba.turek@centrum.cz>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "Krátky popis nastaveného příkazu"
++
++msgid "Access command with"
++msgstr ""
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr "Povolit vykonání příkazu a stažení výstupu bez předchozí autentizace."
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "Povolit uživateli poskytnout dodateÄné argumenty příkazového řádku"
++
++msgid "Arguments:"
++msgstr "Argumenty:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Binární data nezobrazena, stáhněte si je."
++
++msgid "Code:"
++msgstr "Kód:"
++
++msgid "Collecting data..."
++msgstr "Sbírání dat..."
++
++msgid "Command"
++msgstr "Příkaz"
++
++msgid "Command failed"
++msgstr "Příkaz selhal"
++
++msgid "Command line to execute"
++msgstr "Příkazový řádek k vykonání"
++
++msgid "Command successful"
++msgstr "Příkaz úspěšný."
++
++msgid "Command:"
++msgstr "Příkaz:"
++
++msgid "Configure"
++msgstr "Konfigurovat"
++
++msgid "Custom Commands"
++msgstr "Vlastní příkazy"
++
++msgid "Custom arguments"
++msgstr "Vlastní parametry"
++
++msgid "Dashboard"
++msgstr "Řídicí panel"
++
++msgid "Description"
++msgstr "Popis"
++
++msgid "Download"
++msgstr "Stáhnout"
++
++msgid "Failed to execute command!"
++msgstr "Chyba při zpracování příkazu!"
++
++msgid "Link"
++msgstr "Odkaz"
++
++msgid "Loading"
++msgstr "Nahrávám"
++
++msgid "Public access"
++msgstr "Veřejný přístup"
++
++msgid "Run"
++msgstr "Spustit"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Tato stránka umožňuje nastavit vlastní příkazy shellu, které lze snadno "
++"vyvolat z webového rozhraní."
++
++msgid "Waiting for command to complete..."
++msgstr "ÄŒekejte na dokonÄení příkazu..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/de/commands.po b/feeds/luci/applications/luci-app-commands/po/de/commands.po
+new file mode 100644
+index 0000000..2b7c631
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/de/commands.po
+@@ -0,0 +1,98 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-11-21 18:45+0200\n"
++"Last-Translator: Jo-Philipp <jow@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "Kurze Beschreibung des abgespeicherten Kommandos"
++
++msgid "Access command with"
++msgstr "Kommando aufrufen mit"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Ausführen des Kommandos und Herunterladen der Ausgabe ohne vorherige "
++"Authentifizierung ermöglichen"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "Erlaube dem Nutzer zusätzliche Kommandozeilenargumente zu übergeben"
++
++msgid "Arguments:"
++msgstr "Argumente:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Binärdaten ausgeblendet, laden Sie die Ausgaben stattdessen herunter"
++
++msgid "Code:"
++msgstr "Rückgabewert:"
++
++msgid "Collecting data..."
++msgstr "Sammle Daten..."
++
++msgid "Command"
++msgstr "Kommando"
++
++msgid "Command failed"
++msgstr "Kommando fehlgeschlagen"
++
++msgid "Command line to execute"
++msgstr "Auszuführende Kommandozeile"
++
++msgid "Command successful"
++msgstr "Kommando erfolgreich"
++
++msgid "Command:"
++msgstr "Kommando:"
++
++msgid "Configure"
++msgstr "Konfigurieren"
++
++msgid "Custom Commands"
++msgstr "Benutzerdefinierte Kommandos"
++
++msgid "Custom arguments"
++msgstr "Benutzerdefinierte Argumente"
++
++msgid "Dashboard"
++msgstr "Ãœbersicht"
++
++msgid "Description"
++msgstr "Beschreibung"
++
++msgid "Download"
++msgstr "Herunterladen"
++
++msgid "Failed to execute command!"
++msgstr "Kommando konnte nicht ausgeführt werden!"
++
++msgid "Link"
++msgstr "Link"
++
++msgid "Loading"
++msgstr "Lade"
++
++msgid "Public access"
++msgstr "Öffentlicher Zugriff"
++
++msgid "Run"
++msgstr "Ausführen"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Diese Seite ermöglicht die Konfiguration eigener Shell-Kommandos um diese "
++"einfach über das Webinterface ausführen zu können."
++
++msgid "Waiting for command to complete..."
++msgstr "Warte auf die Ausführung des Kommandos..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/el/commands.po b/feeds/luci/applications/luci-app-commands/po/el/commands.po
+new file mode 100644
+index 0000000..0e9e65d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/el/commands.po
+@@ -0,0 +1,91 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "A short textual description of the configured command"
++msgstr ""
++
++msgid "Access command with"
++msgstr ""
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++
++msgid "Arguments:"
++msgstr ""
++
++msgid "Binary data not displayed, download instead."
++msgstr ""
++
++msgid "Code:"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Command failed"
++msgstr ""
++
++msgid "Command line to execute"
++msgstr ""
++
++msgid "Command successful"
++msgstr ""
++
++msgid "Command:"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Custom Commands"
++msgstr ""
++
++msgid "Custom arguments"
++msgstr ""
++
++msgid "Dashboard"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Download"
++msgstr ""
++
++msgid "Failed to execute command!"
++msgstr ""
++
++msgid "Link"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Public access"
++msgstr ""
++
++msgid "Run"
++msgstr ""
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++
++msgid "Waiting for command to complete..."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-commands/po/en/commands.po b/feeds/luci/applications/luci-app-commands/po/en/commands.po
+new file mode 100644
+index 0000000..754a229
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/en/commands.po
+@@ -0,0 +1,95 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "A short textual description of the configured command"
++msgstr "A short textual description of the configured command"
++
++msgid "Access command with"
++msgstr "Access command with"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "Allow the user to provide additional command line arguments"
++
++msgid "Arguments:"
++msgstr "Arguments:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Binary data not displayed, download instead."
++
++msgid "Code:"
++msgstr "Code:"
++
++msgid "Collecting data..."
++msgstr "Collecting data..."
++
++msgid "Command"
++msgstr "Command"
++
++msgid "Command failed"
++msgstr "Command failed"
++
++msgid "Command line to execute"
++msgstr "Command line to execute"
++
++msgid "Command successful"
++msgstr "Command successful"
++
++msgid "Command:"
++msgstr "Command:"
++
++msgid "Configure"
++msgstr "Configure"
++
++msgid "Custom Commands"
++msgstr "Custom Commands"
++
++msgid "Custom arguments"
++msgstr "Custom arguments"
++
++msgid "Dashboard"
++msgstr "Dashboard"
++
++msgid "Description"
++msgstr "Description"
++
++msgid "Download"
++msgstr "Download"
++
++msgid "Failed to execute command!"
++msgstr "Failed to execute command!"
++
++msgid "Link"
++msgstr "Link"
++
++msgid "Loading"
++msgstr "Loading"
++
++msgid "Public access"
++msgstr "Public access"
++
++msgid "Run"
++msgstr "Run"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++
++msgid "Waiting for command to complete..."
++msgstr "Waiting for command to complete..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/es/commands.po b/feeds/luci/applications/luci-app-commands/po/es/commands.po
+new file mode 100644
+index 0000000..8052452
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/es/commands.po
+@@ -0,0 +1,97 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-11-24 10:16+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "Descripción breve del comando a configurar"
++
++msgid "Access command with"
++msgstr "Acceder al comando con"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Permitir ejecutar el comando y descargar su salida sin más autentificación"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "Permitir al usuario añadir parámetros de línea de comandos"
++
++msgid "Arguments:"
++msgstr "Parámetros:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "No se pueden mostrar datos binarios, descárguelos."
++
++msgid "Code:"
++msgstr "Código:"
++
++msgid "Collecting data..."
++msgstr "Recuperando datos..."
++
++msgid "Command"
++msgstr "Comando"
++
++msgid "Command failed"
++msgstr "Falló"
++
++msgid "Command line to execute"
++msgstr "Comando a ejecutar"
++
++msgid "Command successful"
++msgstr "OK"
++
++msgid "Command:"
++msgstr "Comando:"
++
++msgid "Configure"
++msgstr "Configurar"
++
++msgid "Custom Commands"
++msgstr "Comandos propios"
++
++msgid "Custom arguments"
++msgstr "Parámetros propios"
++
++msgid "Dashboard"
++msgstr "Panel"
++
++msgid "Description"
++msgstr "Descripción"
++
++msgid "Download"
++msgstr "Descarga"
++
++msgid "Failed to execute command!"
++msgstr "¡Error al ejecutar el comando!"
++
++msgid "Link"
++msgstr "Enlace"
++
++msgid "Loading"
++msgstr "Cargando"
++
++msgid "Public access"
++msgstr "Acceso público"
++
++msgid "Run"
++msgstr "Ejecutar"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Aquí puede configurar sus propios comandos shell para lanzarlos fácilmente "
++"desde el interfaz web."
++
++msgid "Waiting for command to complete..."
++msgstr "Esperando a que termine el comando..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/fr/commands.po b/feeds/luci/applications/luci-app-commands/po/fr/commands.po
+new file mode 100644
+index 0000000..fac1aff
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/fr/commands.po
+@@ -0,0 +1,100 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-12-12 13:36+0200\n"
++"Last-Translator: maximeguillaud <maxime@mguillaud.net>\n"
++"Language-Team: none\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "Une courte description de la commande configurée"
++
++msgid "Access command with"
++msgstr "Accéder à la commande par"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Autoriser l'exécution de la commande et le téléchargement de son résultat "
++"sans authentification préalable"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++"Autoriser l'utilisateur à fournir des arguments de ligne de commande "
++"supplémentaires"
++
++msgid "Arguments:"
++msgstr "Arguments :"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Données binaires non affichables, elle peuvent être téléchargées."
++
++msgid "Code:"
++msgstr "Code : "
++
++msgid "Collecting data..."
++msgstr "Récupération des données ..."
++
++msgid "Command"
++msgstr "Commande"
++
++msgid "Command failed"
++msgstr "Echec de la commande"
++
++msgid "Command line to execute"
++msgstr "Ligne de commande à exécuter"
++
++msgid "Command successful"
++msgstr "Commande réussie"
++
++msgid "Command:"
++msgstr "Commande :"
++
++msgid "Configure"
++msgstr "Configurer"
++
++msgid "Custom Commands"
++msgstr "Commandes personnalisées"
++
++msgid "Custom arguments"
++msgstr "Arguments personnalisés"
++
++msgid "Dashboard"
++msgstr "Tableau de bord"
++
++msgid "Description"
++msgstr "Description"
++
++msgid "Download"
++msgstr "Télécharger"
++
++msgid "Failed to execute command!"
++msgstr "Echec de l'exécution de la commande ! "
++
++msgid "Link"
++msgstr "Lien"
++
++msgid "Loading"
++msgstr "Chargement"
++
++msgid "Public access"
++msgstr "Accès public"
++
++msgid "Run"
++msgstr "Exécuter"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Cette page vous permet de configurer des commandes shell personnalisées, "
++"pouvant être invoquées facilement depuis l'interface web."
++
++msgid "Waiting for command to complete..."
++msgstr "En attente de la commande pour finir..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/he/commands.po b/feeds/luci/applications/luci-app-commands/po/he/commands.po
+new file mode 100644
+index 0000000..0e9e65d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/he/commands.po
+@@ -0,0 +1,91 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "A short textual description of the configured command"
++msgstr ""
++
++msgid "Access command with"
++msgstr ""
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++
++msgid "Arguments:"
++msgstr ""
++
++msgid "Binary data not displayed, download instead."
++msgstr ""
++
++msgid "Code:"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Command failed"
++msgstr ""
++
++msgid "Command line to execute"
++msgstr ""
++
++msgid "Command successful"
++msgstr ""
++
++msgid "Command:"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Custom Commands"
++msgstr ""
++
++msgid "Custom arguments"
++msgstr ""
++
++msgid "Dashboard"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Download"
++msgstr ""
++
++msgid "Failed to execute command!"
++msgstr ""
++
++msgid "Link"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Public access"
++msgstr ""
++
++msgid "Run"
++msgstr ""
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++
++msgid "Waiting for command to complete..."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-commands/po/hu/commands.po b/feeds/luci/applications/luci-app-commands/po/hu/commands.po
+new file mode 100644
+index 0000000..5cd0ec7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/hu/commands.po
+@@ -0,0 +1,98 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-24 18:47+0200\n"
++"Last-Translator: Gábor <vargalex@freemail.hu>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "A beállított parancs rövid szöveges leírása"
++
++msgid "Access command with"
++msgstr "Parancs hozzáférése"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Engedélyezi a parancs végrehajtását és kimenetének letöltését előzetes "
++"hitelesítés nélkül"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "A felhasználó által további parancsori argumentumok adhatók meg"
++
++msgid "Arguments:"
++msgstr "Argumentumok:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Bináris adat nem jelenik meg, töltse le helyette."
++
++msgid "Code:"
++msgstr "Kód:"
++
++msgid "Collecting data..."
++msgstr "Adatgyűjtés..."
++
++msgid "Command"
++msgstr "Paracs"
++
++msgid "Command failed"
++msgstr "Parancs végrehajtás sikertelen"
++
++msgid "Command line to execute"
++msgstr "Futtatandó parancssor"
++
++msgid "Command successful"
++msgstr "Parancs végrehajtás sikeres"
++
++msgid "Command:"
++msgstr "Parancs:"
++
++msgid "Configure"
++msgstr "Beállítás"
++
++msgid "Custom Commands"
++msgstr "Egyedi parancsok"
++
++msgid "Custom arguments"
++msgstr "Egyedi argumentumok"
++
++msgid "Dashboard"
++msgstr "Vezérlőpult"
++
++msgid "Description"
++msgstr "Leírás"
++
++msgid "Download"
++msgstr "Letöltés"
++
++msgid "Failed to execute command!"
++msgstr "Parancs végrehajtása sikertelen!"
++
++msgid "Link"
++msgstr "Link"
++
++msgid "Loading"
++msgstr "Betöltés"
++
++msgid "Public access"
++msgstr "Nyilvános hozzáférés"
++
++msgid "Run"
++msgstr "Futtatás"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Ezen az oldalon egyéni shell parancsokat állíthat be, amelyeket könnyen "
++"felhasználhat a webes felületen."
++
++msgid "Waiting for command to complete..."
++msgstr "Várakozás a parancs befejezésére..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/it/commands.po b/feeds/luci/applications/luci-app-commands/po/it/commands.po
+new file mode 100644
+index 0000000..c14b910
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/it/commands.po
+@@ -0,0 +1,99 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-02-03 13:52+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "Una breve descrizione testuale del comando configurato"
++
++msgid "Access command with"
++msgstr "Accesso comando con"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Consentire l'esecuzione del comando e il download del suo output senza "
++"previa autenticazione"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++"Consente all'utente di fornire ulteriori argomenti della riga di comando"
++
++msgid "Arguments:"
++msgstr "Argomenti:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "I dati binari non vengono visualizzati, ma possono essere scaricati."
++
++msgid "Code:"
++msgstr "Codice:"
++
++msgid "Collecting data..."
++msgstr "Raccolta dei dati..."
++
++msgid "Command"
++msgstr "Comando"
++
++msgid "Command failed"
++msgstr "Comando fallito"
++
++msgid "Command line to execute"
++msgstr "Riga di comando da eseguire"
++
++msgid "Command successful"
++msgstr "Comando riuscito"
++
++msgid "Command:"
++msgstr "Comando:"
++
++msgid "Configure"
++msgstr "Configura"
++
++msgid "Custom Commands"
++msgstr "Comandi Personalizzati"
++
++msgid "Custom arguments"
++msgstr "Argomenti Personalizzati"
++
++msgid "Dashboard"
++msgstr "Dashboard"
++
++msgid "Description"
++msgstr "Descrizione"
++
++msgid "Download"
++msgstr "Download"
++
++msgid "Failed to execute command!"
++msgstr "Impossibile eseguire il comando!"
++
++msgid "Link"
++msgstr "Collegamento"
++
++msgid "Loading"
++msgstr "Caricamento"
++
++msgid "Public access"
++msgstr "Accesso Pubblico"
++
++msgid "Run"
++msgstr "Esegui"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Questa pagina consente di configurare i comandi della shell personalizzate "
++"che possono essere facilmente richiamati dall'interfaccia web."
++
++msgid "Waiting for command to complete..."
++msgstr "In attesa del comando da completare..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/ja/commands.po b/feeds/luci/applications/luci-app-commands/po/ja/commands.po
+new file mode 100644
+index 0000000..3b01a35
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/ja/commands.po
+@@ -0,0 +1,94 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-05 17:15+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: none\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: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "設定ã—ãŸã‚³ãƒžãƒ³ãƒ‰ã®ç°¡å˜ãªèª¬æ˜Žæ–‡ã‚’記載ã—ã¾ã™"
++
++msgid "Access command with"
++msgstr ""
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "コマンドラインã«å¯¾ã™ã‚‹å¼•æ•°ã®è¿½è¨˜ã‚’許å¯ã™ã‚‹ã‹è¨­å®šã—ã¾ã™"
++
++msgid "Arguments:"
++msgstr "引数:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "ãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿ã¯è¡¨ç¤ºã•ã‚Œãšã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¾ã™ã€‚"
++
++msgid "Code:"
++msgstr "コード:"
++
++msgid "Collecting data..."
++msgstr "データåŽé›†ä¸­ã§ã™..."
++
++msgid "Command"
++msgstr "コマンド"
++
++msgid "Command failed"
++msgstr "コマンド失敗"
++
++msgid "Command line to execute"
++msgstr "実行ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚’記載ã—ã¾ã™"
++
++msgid "Command successful"
++msgstr "コマンドæˆåŠŸ"
++
++msgid "Command:"
++msgstr "コマンド:"
++
++msgid "Configure"
++msgstr "設定"
++
++msgid "Custom Commands"
++msgstr "カスタムコマンド"
++
++msgid "Custom arguments"
++msgstr "カスタム引数"
++
++msgid "Dashboard"
++msgstr "ダッシュボード"
++
++msgid "Description"
++msgstr "説明"
++
++msgid "Download"
++msgstr "ダウンロード"
++
++msgid "Failed to execute command!"
++msgstr "コマンドã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸ!"
++
++msgid "Link"
++msgstr "リンク"
++
++msgid "Loading"
++msgstr "読ã¿è¾¼ã¿ä¸­"
++
++msgid "Public access"
++msgstr "パブリック・アクセス"
++
++msgid "Run"
++msgstr "実行"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€ã‚¦ã‚§ãƒ–インターフェースã‹ã‚‰ç°¡å˜ã«ã‚·ã‚§ãƒ«ãƒ»ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
++
++msgid "Waiting for command to complete..."
++msgstr "コマンド実行中ã§ã™..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/ms/commands.po b/feeds/luci/applications/luci-app-commands/po/ms/commands.po
+new file mode 100644
+index 0000000..6fbb983
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/ms/commands.po
+@@ -0,0 +1,90 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "A short textual description of the configured command"
++msgstr ""
++
++msgid "Access command with"
++msgstr ""
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++
++msgid "Arguments:"
++msgstr ""
++
++msgid "Binary data not displayed, download instead."
++msgstr ""
++
++msgid "Code:"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Command failed"
++msgstr ""
++
++msgid "Command line to execute"
++msgstr ""
++
++msgid "Command successful"
++msgstr ""
++
++msgid "Command:"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Custom Commands"
++msgstr ""
++
++msgid "Custom arguments"
++msgstr ""
++
++msgid "Dashboard"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Download"
++msgstr ""
++
++msgid "Failed to execute command!"
++msgstr ""
++
++msgid "Link"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Public access"
++msgstr ""
++
++msgid "Run"
++msgstr ""
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++
++msgid "Waiting for command to complete..."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-commands/po/no/commands.po b/feeds/luci/applications/luci-app-commands/po/no/commands.po
+new file mode 100644
+index 0000000..29b76e5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/no/commands.po
+@@ -0,0 +1,98 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-03-25 23:38+0200\n"
++"Last-Translator: protx <lars.hardy@gmail.com>\n"
++"Language-Team: none\n"
++"Language: no\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "En kort tekstlig beskrivelse av den konfigurerte kommandoen"
++
++msgid "Access command with"
++msgstr "Ã…pne kommandoen med"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Tillat å utføre kommandoen og laste ned resultatet uten forutgående "
++"godkjenning"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "Tillat brukeren å gi ytterligere kommandolinjeargumenter"
++
++msgid "Arguments:"
++msgstr "Argumenter:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Binære data vises ikke, last ned i stedet."
++
++msgid "Code:"
++msgstr "Kode:"
++
++msgid "Collecting data..."
++msgstr "Henter data..."
++
++msgid "Command"
++msgstr "Kommando"
++
++msgid "Command failed"
++msgstr "Kommando feilet"
++
++msgid "Command line to execute"
++msgstr "Kommandolinje å utføre"
++
++msgid "Command successful"
++msgstr "Kommando vellykket"
++
++msgid "Command:"
++msgstr "Kommando:"
++
++msgid "Configure"
++msgstr "Konfigurer"
++
++msgid "Custom Commands"
++msgstr "Egendefinerte Kommandoer"
++
++msgid "Custom arguments"
++msgstr "Egendefinerte argumenter"
++
++msgid "Dashboard"
++msgstr "Dashboard"
++
++msgid "Description"
++msgstr "Beskrivelse"
++
++msgid "Download"
++msgstr "Nedlasting"
++
++msgid "Failed to execute command!"
++msgstr "Kunne ikke utføre kommandoen!"
++
++msgid "Link"
++msgstr "Link"
++
++msgid "Loading"
++msgstr "Laster"
++
++msgid "Public access"
++msgstr "Tilgjengelig for alle"
++
++msgid "Run"
++msgstr "Kjør"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Denne siden lar deg konfigurere egendefinerte shell-kommandoer som lett kan "
++"startes fra webgrensesnittet."
++
++msgid "Waiting for command to complete..."
++msgstr "Venter på at kommandoen fullføres..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/pl/commands.po b/feeds/luci/applications/luci-app-commands/po/pl/commands.po
+new file mode 100644
+index 0000000..6f660ba
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/pl/commands.po
+@@ -0,0 +1,99 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-02-25 18:03+0200\n"
++"Last-Translator: TheTranslator2238 <mateusz2238@outlook.com>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "Krótki opis konfigurowanej komendy"
++
++msgid "Access command with"
++msgstr "Dostęp do komendy przez"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Zezwól na uruchomienie komendy i pobranie wyjścia bez uprzedniego "
++"uwierzytelnienia"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "Pozwól użytkownikowi dodać argumenty wiersza poleceń"
++
++msgid "Arguments:"
++msgstr "Argumenty:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Nie wyświetlono danych binarnych, możesz je pobrać."
++
++msgid "Code:"
++msgstr "Kod:"
++
++msgid "Collecting data..."
++msgstr "Zbieram dane:"
++
++msgid "Command"
++msgstr "Komenda"
++
++msgid "Command failed"
++msgstr "ZÅ‚a komenda"
++
++msgid "Command line to execute"
++msgstr "Linia Komendy do wykonania"
++
++msgid "Command successful"
++msgstr "Komenda Wykonana"
++
++msgid "Command:"
++msgstr "Komenda:"
++
++msgid "Configure"
++msgstr "Konfiguracja"
++
++msgid "Custom Commands"
++msgstr "WÅ‚asne komendy"
++
++msgid "Custom arguments"
++msgstr "WÅ‚asne argumenty"
++
++msgid "Dashboard"
++msgstr "Tablica"
++
++msgid "Description"
++msgstr "Opis"
++
++msgid "Download"
++msgstr "Download"
++
++msgid "Failed to execute command!"
++msgstr "Nie można wykonać komendy!"
++
++msgid "Link"
++msgstr "ÅÄ…cze"
++
++msgid "Loading"
++msgstr "Åadowanie"
++
++msgid "Public access"
++msgstr "Publiczny dostęp"
++
++msgid "Run"
++msgstr "Uruchom"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Ta strona pozwala ci skonfigurować niestandardową komendę którą można łatwo "
++"użyć z Web Interfejsa"
++
++msgid "Waiting for command to complete..."
++msgstr "Czekanie na wykonanie komendy..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/pt-br/commands.po b/feeds/luci/applications/luci-app-commands/po/pt-br/commands.po
+new file mode 100644
+index 0000000..83c7bd5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/pt-br/commands.po
+@@ -0,0 +1,98 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-03-15 22:02+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "Uma pequena descrição textual do comando configurado"
++
++msgid "Access command with"
++msgstr "Acessar o comando com"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Permitir a execução do comando e descarregar o resultado sem autenticação "
++"prévia"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "Permitir ao usuário inserir argumentos de linha de comando adicionais"
++
++msgid "Arguments:"
++msgstr "Argumentos:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Dados binários não mostrados, mas podem ser baixados."
++
++msgid "Code:"
++msgstr "Código:"
++
++msgid "Collecting data..."
++msgstr "Adquirindo dados..."
++
++msgid "Command"
++msgstr "Comando"
++
++msgid "Command failed"
++msgstr "O comando falhou"
++
++msgid "Command line to execute"
++msgstr "Linha de comandos a executar"
++
++msgid "Command successful"
++msgstr "Comando executado com sucesso"
++
++msgid "Command:"
++msgstr "Comando:"
++
++msgid "Configure"
++msgstr "Configurar"
++
++msgid "Custom Commands"
++msgstr "Comandos Personalizados"
++
++msgid "Custom arguments"
++msgstr "Argumentos personalizados"
++
++msgid "Dashboard"
++msgstr "Painel de Controle"
++
++msgid "Description"
++msgstr "Descrição"
++
++msgid "Download"
++msgstr "Baixar"
++
++msgid "Failed to execute command!"
++msgstr "Falha ao executar comando!"
++
++msgid "Link"
++msgstr "Endereço"
++
++msgid "Loading"
++msgstr "Carregando"
++
++msgid "Public access"
++msgstr "Acesso público"
++
++msgid "Run"
++msgstr "Executar"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Esta página permite a configuração de comandos personalizados que podem ser "
++"facilmente executados através da interface web."
++
++msgid "Waiting for command to complete..."
++msgstr "Aguardando a conclusão do comando..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/pt/commands.po b/feeds/luci/applications/luci-app-commands/po/pt/commands.po
+new file mode 100644
+index 0000000..a46b7d2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/pt/commands.po
+@@ -0,0 +1,99 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-06-02 19:17+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "Uma pequena descrição textual do comando configurado"
++
++msgid "Access command with"
++msgstr "Aceder ao comando com"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Permitir a execução do comando e descarregar o resultado sem autenticação "
++"prévia"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++"Permitir que o utilizador forneça argumentos adicionais na linha de comandos"
++
++msgid "Arguments:"
++msgstr "Argumentos:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Dados binários não mostrados, mas pode descarregar."
++
++msgid "Code:"
++msgstr "Código:"
++
++msgid "Collecting data..."
++msgstr "A obter dados..."
++
++msgid "Command"
++msgstr "Comando"
++
++msgid "Command failed"
++msgstr "O comando falhou"
++
++msgid "Command line to execute"
++msgstr "Linha de comandos a executar"
++
++msgid "Command successful"
++msgstr "Comando executado com sucesso"
++
++msgid "Command:"
++msgstr "Comando:"
++
++msgid "Configure"
++msgstr "Configurar"
++
++msgid "Custom Commands"
++msgstr "Comandos Personalizados"
++
++msgid "Custom arguments"
++msgstr "Argumentos personalizados"
++
++msgid "Dashboard"
++msgstr "Painel de Controlo"
++
++msgid "Description"
++msgstr "Descrição"
++
++msgid "Download"
++msgstr "Descarregar"
++
++msgid "Failed to execute command!"
++msgstr "Falha ao executar comando!"
++
++msgid "Link"
++msgstr "Link"
++
++msgid "Loading"
++msgstr "A carregar"
++
++msgid "Public access"
++msgstr "Acesso público"
++
++msgid "Run"
++msgstr "Executar"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Esta página permite-lhe configurar uma linha de comandos personalizada que "
++"pode facilmente ser executada a partir da interface web."
++
++msgid "Waiting for command to complete..."
++msgstr "A aguardar que o comando termine..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/ro/commands.po b/feeds/luci/applications/luci-app-commands/po/ro/commands.po
+new file mode 100644
+index 0000000..05c4574
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/ro/commands.po
+@@ -0,0 +1,99 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-28 18:45+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "O scurta descriere textuala a comenzii configurate"
++
++msgid "Access command with"
++msgstr "Acces la comanda cu"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Permite executarea comenzii si descarcarea rezultatului fara o autentificare "
++"anterioara"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "Permite utilizatorului sa adauge parametrii in linia de comanda"
++
++msgid "Arguments:"
++msgstr "Parametrii:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Datele binare nu sunt afisate, descarcale in schimb"
++
++msgid "Code:"
++msgstr "Cod:"
++
++msgid "Collecting data..."
++msgstr "Colectare date..."
++
++msgid "Command"
++msgstr "Comandă"
++
++msgid "Command failed"
++msgstr "Comandă eşuată"
++
++msgid "Command line to execute"
++msgstr "Linie de comanda pentru a executa"
++
++msgid "Command successful"
++msgstr "Comanda reusita"
++
++msgid "Command:"
++msgstr "Comanda:"
++
++msgid "Configure"
++msgstr "Configureaza"
++
++msgid "Custom Commands"
++msgstr "Comenzi particulare"
++
++msgid "Custom arguments"
++msgstr "Argumenta particulare"
++
++msgid "Dashboard"
++msgstr "Dashboard"
++
++msgid "Description"
++msgstr "Descriere"
++
++msgid "Download"
++msgstr "Descarca"
++
++msgid "Failed to execute command!"
++msgstr "S-a esuat executarea comenzii!!"
++
++msgid "Link"
++msgstr "Link"
++
++msgid "Loading"
++msgstr "Se incarca"
++
++msgid "Public access"
++msgstr "Access public"
++
++msgid "Run"
++msgstr "Ruleaza"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Aceasta pagina permite configurarea de comenzi personale ce pot fi usor "
++"apelate din interfata grafica"
++
++msgid "Waiting for command to complete..."
++msgstr "Astept finalizarea comenzii..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/ru/commands.po b/feeds/luci/applications/luci-app-commands/po/ru/commands.po
+new file mode 100644
+index 0000000..6197231
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/ru/commands.po
+@@ -0,0 +1,102 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-15 16:48+0200\n"
++"Last-Translator: datasheet <michael.gritsaenko@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "A short textual description of the configured command"
++msgstr "Короткое текÑтовое опиÑание команды"
++
++msgid "Access command with"
++msgstr "ДоÑтуп к команде через"
++
++#, fuzzy
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++"Разрешить выполнение команды и загрузку ее вывода без предварительной "
++"аутентификации"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++"Разрешить пользователÑм иÑпользовать дополнительные аргументы командной "
++"Ñтроки"
++
++msgid "Arguments:"
++msgstr "Ðргументы:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "Двоичные данные не отображаютÑÑ, вмеÑто Ñтого - выгружаютÑÑ"
++
++msgid "Code:"
++msgstr "Код:"
++
++msgid "Collecting data..."
++msgstr "Сбор данных..."
++
++msgid "Command"
++msgstr "Команда"
++
++msgid "Command failed"
++msgstr "Команда не выполнена"
++
++msgid "Command line to execute"
++msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ"
++
++msgid "Command successful"
++msgstr "Команда выполнена"
++
++msgid "Command:"
++msgstr "Команда:"
++
++msgid "Configure"
++msgstr "ÐаÑтроить"
++
++msgid "Custom Commands"
++msgstr "ПользовательÑкие команды"
++
++msgid "Custom arguments"
++msgstr "ПользовательÑкие аргументы"
++
++msgid "Dashboard"
++msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ"
++
++msgid "Description"
++msgstr "ОпиÑание"
++
++msgid "Download"
++msgstr "Скачать"
++
++msgid "Failed to execute command!"
++msgstr "Ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹!"
++
++msgid "Link"
++msgstr "СÑылка"
++
++msgid "Loading"
++msgstr "Загрузка"
++
++msgid "Public access"
++msgstr "Публичный доÑтуп"
++
++msgid "Run"
++msgstr "ЗапуÑк"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Эта Ñтраница предоÑтавлÑет возможноÑÑ‚ÑŒ наÑтраивать пользовательÑкие "
++"конÑольные команды, которые могут быть легко вызваны из веб-интерфейÑа"
++
++msgid "Waiting for command to complete..."
++msgstr "Ожидание Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/sk/commands.po b/feeds/luci/applications/luci-app-commands/po/sk/commands.po
+new file mode 100644
+index 0000000..4133dfb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/sk/commands.po
+@@ -0,0 +1,91 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "A short textual description of the configured command"
++msgstr ""
++
++msgid "Access command with"
++msgstr ""
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++
++msgid "Arguments:"
++msgstr ""
++
++msgid "Binary data not displayed, download instead."
++msgstr ""
++
++msgid "Code:"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Command failed"
++msgstr ""
++
++msgid "Command line to execute"
++msgstr ""
++
++msgid "Command successful"
++msgstr ""
++
++msgid "Command:"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Custom Commands"
++msgstr ""
++
++msgid "Custom arguments"
++msgstr ""
++
++msgid "Dashboard"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Download"
++msgstr ""
++
++msgid "Failed to execute command!"
++msgstr ""
++
++msgid "Link"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Public access"
++msgstr ""
++
++msgid "Run"
++msgstr ""
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++
++msgid "Waiting for command to complete..."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-commands/po/sv/commands.po b/feeds/luci/applications/luci-app-commands/po/sv/commands.po
+new file mode 100644
+index 0000000..9fbe0af
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/sv/commands.po
+@@ -0,0 +1,92 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "A short textual description of the configured command"
++msgstr ""
++
++msgid "Access command with"
++msgstr ""
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++
++msgid "Arguments:"
++msgstr ""
++
++msgid "Binary data not displayed, download instead."
++msgstr ""
++
++msgid "Code:"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Command failed"
++msgstr ""
++
++msgid "Command line to execute"
++msgstr ""
++
++msgid "Command successful"
++msgstr ""
++
++msgid "Command:"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Custom Commands"
++msgstr ""
++
++msgid "Custom arguments"
++msgstr ""
++
++msgid "Dashboard"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Download"
++msgstr ""
++
++msgid "Failed to execute command!"
++msgstr ""
++
++msgid "Link"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Public access"
++msgstr ""
++
++msgid "Run"
++msgstr ""
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++
++msgid "Waiting for command to complete..."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-commands/po/templates/commands.pot b/feeds/luci/applications/luci-app-commands/po/templates/commands.pot
+new file mode 100644
+index 0000000..5d2ffae
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/templates/commands.pot
+@@ -0,0 +1,84 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "A short textual description of the configured command"
++msgstr ""
++
++msgid "Access command with"
++msgstr ""
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++
++msgid "Arguments:"
++msgstr ""
++
++msgid "Binary data not displayed, download instead."
++msgstr ""
++
++msgid "Code:"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Command failed"
++msgstr ""
++
++msgid "Command line to execute"
++msgstr ""
++
++msgid "Command successful"
++msgstr ""
++
++msgid "Command:"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Custom Commands"
++msgstr ""
++
++msgid "Custom arguments"
++msgstr ""
++
++msgid "Dashboard"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Download"
++msgstr ""
++
++msgid "Failed to execute command!"
++msgstr ""
++
++msgid "Link"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Public access"
++msgstr ""
++
++msgid "Run"
++msgstr ""
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++
++msgid "Waiting for command to complete..."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-commands/po/tr/commands.po b/feeds/luci/applications/luci-app-commands/po/tr/commands.po
+new file mode 100644
+index 0000000..4132274
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/tr/commands.po
+@@ -0,0 +1,91 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "A short textual description of the configured command"
++msgstr ""
++
++msgid "Access command with"
++msgstr ""
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++
++msgid "Arguments:"
++msgstr ""
++
++msgid "Binary data not displayed, download instead."
++msgstr ""
++
++msgid "Code:"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Command failed"
++msgstr ""
++
++msgid "Command line to execute"
++msgstr ""
++
++msgid "Command successful"
++msgstr ""
++
++msgid "Command:"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Custom Commands"
++msgstr ""
++
++msgid "Custom arguments"
++msgstr ""
++
++msgid "Dashboard"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Download"
++msgstr ""
++
++msgid "Failed to execute command!"
++msgstr ""
++
++msgid "Link"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Public access"
++msgstr ""
++
++msgid "Run"
++msgstr ""
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++
++msgid "Waiting for command to complete..."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-commands/po/uk/commands.po b/feeds/luci/applications/luci-app-commands/po/uk/commands.po
+new file mode 100644
+index 0000000..74a19f3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/uk/commands.po
+@@ -0,0 +1,103 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-14 12:14+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++
++#, fuzzy
++msgid "A short textual description of the configured command"
++msgstr "Короткий Ð¾Ð¿Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ налаштуваннÑ"
++
++msgid "Access command with"
++msgstr ""
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++
++#, fuzzy
++msgid "Arguments:"
++msgstr "Ðргументи:"
++
++msgid "Binary data not displayed, download instead."
++msgstr ""
++
++msgid "Code:"
++msgstr "Код:"
++
++msgid "Collecting data..."
++msgstr "Ð—Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…..."
++
++msgid "Command"
++msgstr ""
++
++msgid "Command failed"
++msgstr "Команда не виконана"
++
++msgid "Command line to execute"
++msgstr ""
++
++msgid "Command successful"
++msgstr ""
++
++msgid "Command:"
++msgstr ""
++
++msgid "Configure"
++msgstr "КонфігураціÑ"
++
++msgid "Custom Commands"
++msgstr ""
++
++msgid "Custom arguments"
++msgstr ""
++
++#, fuzzy
++msgid "Dashboard"
++msgstr "Панель керуваннÑ"
++
++msgid "Description"
++msgstr "ОпиÑ"
++
++msgid "Download"
++msgstr "Завантажити"
++
++#, fuzzy
++msgid "Failed to execute command!"
++msgstr "Помилка під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку команди!"
++
++msgid "Link"
++msgstr ""
++
++msgid "Loading"
++msgstr "Триває завантаженнÑ"
++
++msgid "Public access"
++msgstr "Відкритий доÑтуп"
++
++msgid "Run"
++msgstr "ЗапуÑтити"
++
++#, fuzzy
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++"Ð¦Ñ Ñторінка дозволÑÑ” налаштувати кориÑтувацькі команди оболонки, Ñка може "
++"бути легко запущена з веб-інтерфейÑу."
++
++#, fuzzy
++msgid "Waiting for command to complete..."
++msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/vi/commands.po b/feeds/luci/applications/luci-app-commands/po/vi/commands.po
+new file mode 100644
+index 0000000..4132274
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/vi/commands.po
+@@ -0,0 +1,91 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "A short textual description of the configured command"
++msgstr ""
++
++msgid "Access command with"
++msgstr ""
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr ""
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr ""
++
++msgid "Arguments:"
++msgstr ""
++
++msgid "Binary data not displayed, download instead."
++msgstr ""
++
++msgid "Code:"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Command failed"
++msgstr ""
++
++msgid "Command line to execute"
++msgstr ""
++
++msgid "Command successful"
++msgstr ""
++
++msgid "Command:"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Custom Commands"
++msgstr ""
++
++msgid "Custom arguments"
++msgstr ""
++
++msgid "Dashboard"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Download"
++msgstr ""
++
++msgid "Failed to execute command!"
++msgstr ""
++
++msgid "Link"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Public access"
++msgstr ""
++
++msgid "Run"
++msgstr ""
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr ""
++
++msgid "Waiting for command to complete..."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-commands/po/zh-cn/commands.po b/feeds/luci/applications/luci-app-commands/po/zh-cn/commands.po
+new file mode 100644
+index 0000000..8b2b032
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/zh-cn/commands.po
+@@ -0,0 +1,94 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-08 15:47+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "简短æ述命令用途"
++
++msgid "Access command with"
++msgstr "访问命令"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr "å…许在ä¸è®¤è¯çš„å‰æ下执行命令,并获å–其输出。"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "å…许用户æä¾›é¢å¤–的命令行å‚æ•°"
++
++msgid "Arguments:"
++msgstr "å‚数:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "ä¸æ˜¾ç¤ºäºŒè¿›åˆ¶æ•°æ®ï¼Œä½¿ç”¨ä¸‹è½½æ–¹å¼æ›¿ä»£ã€‚"
++
++msgid "Code:"
++msgstr "代ç ï¼š"
++
++msgid "Collecting data..."
++msgstr "收集数æ®ï¼š"
++
++msgid "Command"
++msgstr "命令"
++
++msgid "Command failed"
++msgstr "执行命令失败"
++
++msgid "Command line to execute"
++msgstr "执行命令行"
++
++msgid "Command successful"
++msgstr "执行命令æˆåŠŸ"
++
++msgid "Command:"
++msgstr "命令:"
++
++msgid "Configure"
++msgstr "é…ç½®"
++
++msgid "Custom Commands"
++msgstr "自定义命令"
++
++msgid "Custom arguments"
++msgstr "自定义å‚æ•°"
++
++msgid "Dashboard"
++msgstr "看æ¿"
++
++msgid "Description"
++msgstr "æè¿°"
++
++msgid "Download"
++msgstr "下载"
++
++msgid "Failed to execute command!"
++msgstr "执行命令失败ï¼"
++
++msgid "Link"
++msgstr "连接"
++
++msgid "Loading"
++msgstr "加载中"
++
++msgid "Public access"
++msgstr "公共访问"
++
++msgid "Run"
++msgstr "è¿è¡Œ"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr "此页é¢å…许您é…置自定义Shell命令,并å¯ä»¥ä»ŽWebç•Œé¢è°ƒç”¨shell命令。"
++
++msgid "Waiting for command to complete..."
++msgstr "等待命令执行完æˆ... ..."
+diff --git a/feeds/luci/applications/luci-app-commands/po/zh-tw/commands.po b/feeds/luci/applications/luci-app-commands/po/zh-tw/commands.po
+new file mode 100644
+index 0000000..4377ead
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-commands/po/zh-tw/commands.po
+@@ -0,0 +1,94 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-18 19:59+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "A short textual description of the configured command"
++msgstr "以短文æ述設定指令"
++
++msgid "Access command with"
++msgstr "å­˜å–指令"
++
++msgid ""
++"Allow executing the command and downloading its output without prior "
++"authentication"
++msgstr "å…許執行這指令åŠä¸‹è¼‰å®ƒçš„輸出無須事先驗證"
++
++msgid "Allow the user to provide additional command line arguments"
++msgstr "å…許用戶æä¾›é¡å¤–的指令行åƒæ•¸"
++
++msgid "Arguments:"
++msgstr "åƒæ•¸:"
++
++msgid "Binary data not displayed, download instead."
++msgstr "二進進資料未顯示, 以下載替代."
++
++msgid "Code:"
++msgstr "碼:"
++
++msgid "Collecting data..."
++msgstr "收集資料中..."
++
++msgid "Command"
++msgstr "指令"
++
++msgid "Command failed"
++msgstr "命令失敗"
++
++msgid "Command line to execute"
++msgstr "è¦åŸ·è¡Œçš„指令行"
++
++msgid "Command successful"
++msgstr "命令æˆåŠŸ"
++
++msgid "Command:"
++msgstr "命令:"
++
++msgid "Configure"
++msgstr "設定"
++
++msgid "Custom Commands"
++msgstr "自訂指令集"
++
++msgid "Custom arguments"
++msgstr "自訂åƒæ•¸é›†"
++
++msgid "Dashboard"
++msgstr "儀表æ¿"
++
++msgid "Description"
++msgstr "æè¿°"
++
++msgid "Download"
++msgstr "下載"
++
++msgid "Failed to execute command!"
++msgstr "執行指令失敗!"
++
++msgid "Link"
++msgstr "連çµ"
++
++msgid "Loading"
++msgstr "掛載"
++
++msgid "Public access"
++msgstr "公用存å–"
++
++msgid "Run"
++msgstr "執行"
++
++msgid ""
++"This page allows you to configure custom shell commands which can be easily "
++"invoked from the web interface."
++msgstr "åªè¦å¯ä»¥å¾žweb介輕易調用, 這é é¢å…許你自定shell指令."
++
++msgid "Waiting for command to complete..."
++msgstr "等待完整命令中..."
+diff --git a/feeds/luci/applications/luci-app-coovachilli/Makefile b/feeds/luci/applications/luci-app-coovachilli/Makefile
+new file mode 100644
+index 0000000..6120991
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for Coova Chilli
++LUCI_DEPENDS:=@BROKEN
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-coovachilli/luasrc/controller/coovachilli.lua b/feeds/luci/applications/luci-app-coovachilli/luasrc/controller/coovachilli.lua
+new file mode 100644
+index 0000000..f962b9b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/luasrc/controller/coovachilli.lua
+@@ -0,0 +1,15 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.coovachilli", package.seeall)
++
++function index()
++ local cc
++
++ cc = entry( { "admin", "services", "coovachilli" }, cbi("coovachilli"), _("CoovaChilli"), 90)
++ cc.subindex = true
++
++ entry( { "admin", "services", "coovachilli", "network" }, cbi("coovachilli_network"), _("Network Configuration"), 10)
++ entry( { "admin", "services", "coovachilli", "radius" }, cbi("coovachilli_radius"), _("RADIUS configuration"), 20)
++ entry( { "admin", "services", "coovachilli", "auth" }, cbi("coovachilli_auth"), _("UAM and MAC Authentication"), 30)
++end
+diff --git a/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli.lua b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli.lua
+new file mode 100644
+index 0000000..7a2056c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli.lua
+@@ -0,0 +1,19 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("coovachilli")
++
++-- general
++s = m:section(TypedSection, "general")
++s.anonymous = true
++
++s:option( Flag, "debug" )
++s:option( Value, "interval" )
++s:option( Value, "pidfile" ).optional = true
++s:option( Value, "statedir" ).optional = true
++s:option( Value, "cmdsock" ).optional = true
++s:option( Value, "logfacility" ).optional = true
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_auth.lua b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_auth.lua
+new file mode 100644
+index 0000000..4123532
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_auth.lua
+@@ -0,0 +1,64 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("coovachilli")
++
++-- uam config
++s1 = m:section(TypedSection, "uam")
++s1.anonymous = true
++
++s1:option( Value, "uamserver" )
++s1:option( Value, "uamsecret" ).password = true
++
++s1:option( Flag, "uamanydns" )
++s1:option( Flag, "nouamsuccess" )
++s1:option( Flag, "nouamwispr" )
++s1:option( Flag, "chillixml" )
++s1:option( Flag, "uamanyip" ).optional = true
++s1:option( Flag, "dnsparanoia" ).optional = true
++s1:option( Flag, "usestatusfile" ).optional = true
++
++s1:option( Value, "uamhomepage" ).optional = true
++s1:option( Value, "uamlisten" ).optional = true
++s1:option( Value, "uamport" ).optional = true
++s1:option( Value, "uamiport" ).optional = true
++s1:option( DynamicList, "uamdomain" ).optional = true
++s1:option( Value, "uamlogoutip" ).optional = true
++s1:option( DynamicList, "uamallowed" ).optional = true
++s1:option( Value, "uamui" ).optional = true
++
++s1:option( Value, "wisprlogin" ).optional = true
++
++s1:option( Value, "defsessiontimeout" ).optional = true
++s1:option( Value, "defidletimeout" ).optional = true
++s1:option( Value, "definteriminterval" ).optional = true
++
++s1:option( Value, "ssid" ).optional = true
++s1:option( Value, "vlan" ).optional = true
++s1:option( Value, "nasip" ).optional = true
++s1:option( Value, "nasmac" ).optional = true
++s1:option( Value, "wwwdir" ).optional = true
++s1:option( Value, "wwwbin" ).optional = true
++
++s1:option( Value, "localusers" ).optional = true
++s1:option( Value, "postauthproxy" ).optional = true
++s1:option( Value, "postauthproxyport" ).optional = true
++s1:option( Value, "locationname" ).optional = true
++
++
++-- mac authentication
++s2 = m:section(TypedSection, "macauth")
++s2.anonymous = true
++
++s2:option( Flag, "macauth" )
++s2:option( Flag, "macallowlocal" )
++s2:option( DynamicList, "macallowed" )
++
++pw = s2:option( Value, "macpasswd" )
++pw.optional = true
++pw.password = true
++
++s2:option( Value, "macsuffix" ).optional = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_network.lua b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_network.lua
+new file mode 100644
+index 0000000..025bc17
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_network.lua
+@@ -0,0 +1,56 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local sys = require"luci.sys"
++local ip = require "luci.ip"
++
++m = Map("coovachilli")
++
++-- tun
++s1 = m:section(TypedSection, "tun")
++s1.anonymous = true
++
++s1:option( Flag, "usetap" )
++s1:option( Value, "tundev" ).optional = true
++s1:option( Value, "txqlen" ).optional = true
++
++net = s1:option( Value, "net" )
++for _, route in ipairs(ip.routes({ family = 4, type = 1 })) do
++ if route.dest:prefix() > 0 and route.dest:prefix() < 32 then
++ net:value( route.dest:string() )
++ end
++end
++
++s1:option( Value, "dynip" ).optional = true
++s1:option( Value, "statip" ).optional = true
++
++s1:option( Value, "dns1" ).optional = true
++s1:option( Value, "dns2" ).optional = true
++s1:option( Value, "domain" ).optional = true
++
++s1:option( Value, "ipup" ).optional = true
++s1:option( Value, "ipdown" ).optional = true
++
++s1:option( Value, "conup" ).optional = true
++s1:option( Value, "condown" ).optional = true
++
++
++-- dhcp config
++s2 = m:section(TypedSection, "dhcp")
++s2.anonymous = true
++
++dif = s2:option( Value, "dhcpif" )
++for _, nif in ipairs(sys.net.devices()) do
++ if nif ~= "lo" then dif:value(nif) end
++end
++
++s2:option( Value, "dhcpmac" ).optional = true
++s2:option( Value, "lease" ).optional = true
++s2:option( Value, "dhcpstart" ).optional = true
++s2:option( Value, "dhcpend" ).optional = true
++
++s2:option( Flag, "eapolenable" )
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_radius.lua b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_radius.lua
+new file mode 100644
+index 0000000..e2cbe49
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_radius.lua
+@@ -0,0 +1,55 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("coovachilli")
++
++-- radius server
++s1 = m:section(TypedSection, "radius")
++s1.anonymous = true
++
++s1:option( Value, "radiusserver1" )
++s1:option( Value, "radiusserver2" )
++s1:option( Value, "radiussecret" ).password = true
++
++s1:option( Value, "radiuslisten" ).optional = true
++s1:option( Value, "radiusauthport" ).optional = true
++s1:option( Value, "radiusacctport" ).optional = true
++
++s1:option( Value, "radiusnasid" ).optional = true
++s1:option( Value, "radiusnasip" ).optional = true
++
++s1:option( Value, "radiuscalled" ).optional = true
++s1:option( Value, "radiuslocationid" ).optional = true
++s1:option( Value, "radiuslocationname" ).optional = true
++
++s1:option( Value, "radiusnasporttype" ).optional = true
++
++s1:option( Flag, "radiusoriginalurl" )
++
++s1:option( Value, "adminuser" ).optional = true
++rs = s1:option( Value, "adminpassword" )
++rs.optional = true
++rs.password = true
++
++s1:option( Flag, "swapoctets" )
++s1:option( Flag, "openidauth" )
++s1:option( Flag, "wpaguests" )
++s1:option( Flag, "acctupdate" )
++
++s1:option( Value, "coaport" ).optional = true
++s1:option( Flag, "coanoipcheck" )
++
++
++-- radius proxy
++s2 = m:section(TypedSection, "proxy")
++s2.anonymous = true
++
++s2:option( Value, "proxylisten" ).optional = true
++s2:option( Value, "proxyport" ).optional = true
++s2:option( Value, "proxyclient" ).optional = true
++ps = s2:option( Value, "proxysecret" )
++ps.optional = true
++ps.password = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/ca/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/ca/coovachilli.po
+new file mode 100644
+index 0000000..085d991
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/ca/coovachilli.po
+@@ -0,0 +1,655 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-06-01 22:48+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Configuració de xarxa"
++
++msgid "RADIUS configuration"
++msgstr "Configuració RADIUS"
++
++msgid "UAM and MAC Authentication"
++msgstr "Autenticació UAM i MAC"
++
++#~ msgid "General configuration"
++#~ msgstr "Configuració general"
++
++#~ msgid "General CoovaChilli settings"
++#~ msgstr "Configuració CoovaChilli general"
++
++#~ msgid "Command socket"
++#~ msgstr "Socket de comanda"
++
++#~ msgid "UNIX socket used for communication with chilli_query"
++#~ msgstr "SocketUNIX usat per comunicació amb chilli_query"
++
++#~ msgid "Config refresh interval"
++#~ msgstr "Configuració d'interval de refresc"
++
++#~ msgid ""
++#~ "Re-read configuration file and do DNS lookups every interval seconds. "
++#~ "This has the same effect as sending the HUP signal. If interval is 0 "
++#~ "(zero) this feature is disabled. "
++#~ msgstr ""
++#~ "Re-llegeix el fitxer de configuració i les consultes DNS cada interval "
++#~ "segons. Això té el mateix efecte que enviar el senyal HUP. Si l'interval "
++#~ "és 0 (zero) es deshabilita la funció."
++
++#~ msgid "Pid file"
++#~ msgstr "Fitxer PID"
++
++#~ msgid "Filename to put the process id"
++#~ msgstr "Nom de fitxer on posar la ID de procés"
++
++#~ msgid "State directory"
++#~ msgstr "Directori d'estat"
++
++#~ msgid "Directory of non-volatile data"
++#~ msgstr "Directori de dades no volàtils"
++
++#~ msgid "TUN/TAP configuration"
++#~ msgstr "Configuració TUN/TAP"
++
++#~ msgid "Network/Tun configuration"
++#~ msgstr "Configuració de xarxa/tun"
++
++#~ msgid "Network down script"
++#~ msgstr "Script de baixada de xarxa"
++
++#~ msgid ""
++#~ "Script executed after a session has moved from authorized state to "
++#~ "unauthorized"
++#~ msgstr ""
++#~ "Script executat quan es mou una sessió des de l'estat autoritzat a no "
++#~ "autoritzat"
++
++#~ msgid "Network up script"
++#~ msgstr "Script de pujada de xarxa"
++
++#~ msgid "Script executed after the tun network interface has been brought up"
++#~ msgstr "Script executat després que la interfície de xarxa tun s'hagi alçat"
++
++#~ msgid "Primary DNS Server"
++#~ msgstr "Servidor DNS primari"
++
++#~ msgid "Secondary DNS Server"
++#~ msgstr "Servidor DNS secundari"
++
++#~ msgid "Domain name"
++#~ msgstr "Nom de domini"
++
++#~ msgid ""
++#~ "Is used to inform the client about the domain name to use for DNS lookups"
++#~ msgstr ""
++#~ "S'utilitza per informar el client sobre el no mde domini a utilitzar per "
++#~ "les consultes DNS"
++
++#~ msgid "Dynamic IP address pool"
++#~ msgstr "Bateria d'adreces IP dinàmiques"
++
++#~ msgid "Specifies a pool of dynamic IP addresses"
++#~ msgstr "Especifica una bateria d'adreces IP dinàmiques"
++
++#~ msgid "IP down script"
++#~ msgstr "Scripts de baixada IP"
++
++#~ msgid "Script executed after the tun network interface has been taken down"
++#~ msgstr ""
++#~ "Script executat després que s'hagi abaixat la interfície de xarxa tun"
++
++#~ msgid "IP up script"
++#~ msgstr "Script de pujada IP"
++
++#~ msgid ""
++#~ "Script executed after the TUN/TAP network interface has been brought up"
++#~ msgstr ""
++#~ "Script executat després que s'hagi apujat la interfície de xarxa TUN/TAP"
++
++#~ msgid "Uplink subnet"
++#~ msgstr "Subxarxa de pujada"
++
++#~ msgid "Network address of the uplink interface (CIDR notation)"
++#~ msgstr "Adreça de xarxa de la interfície d'enllaç de pujada (notació CIDR)"
++
++#~ msgid "Static IP address pool"
++#~ msgstr "Bateria d'adreces IP estàtiques"
++
++#~ msgid "Specifies a pool of static IP addresses"
++#~ msgstr "Especifica una bateria d'adreces IP estàtiques"
++
++#~ msgid "TUN/TAP device"
++#~ msgstr "Dispositiu TUN/TAP"
++
++#~ msgid "The specific device to use for the TUN/TAP interface"
++#~ msgstr "El dispositiu específic utilitzar per la interfície TUN/TAP"
++
++#~ msgid "TX queue length"
++#~ msgstr "Llargària de la cua TX"
++
++#~ msgid "The TX queue length to set on the TUN/TAP interface"
++#~ msgstr "La llargària de la cua TX per establir la interfície TUN/TAP"
++
++#~ msgid "Use TAP device"
++#~ msgstr "Utilitza dispositiu TAP"
++
++#~ msgid "Use the TAP interface instead of TUN"
++#~ msgstr "Utilitza la interfície TAP en comptes de TUN"
++
++#~ msgid "DHCP configuration"
++#~ msgstr "Configuració DHCP"
++
++#~ msgid "Set DHCP options for connecting clients"
++#~ msgstr "Estebleix les opcions DHCP pels clients connectats"
++
++#~ msgid "DHCP end number"
++#~ msgstr "Número final de DHCP"
++
++#~ msgid "Where to stop assigning IP addresses (default 254)"
++#~ msgstr "Quan deixar d'assignar adreces IP (per defecte 254)"
++
++#~ msgid "DHCP interface"
++#~ msgstr "Interfície DHCP"
++
++#~ msgid "Ethernet interface to listen to for the downlink interface"
++#~ msgstr ""
++#~ "Interfície Ethernet per escoltar les connexions a la interfície de baixada"
++
++#~ msgid "Listen MAC address"
++#~ msgstr "Escolta adreça MAC"
++
++#~ msgid ""
++#~ "MAC address to listen to. If not specified the MAC address of the "
++#~ "interface will be used"
++#~ msgstr ""
++#~ "Adreça MAC per escoltar. Si no s'especifica, s'utilitzarà l'adreça MAC de "
++#~ "la interfície."
++
++#~ msgid "DHCP start number"
++#~ msgstr "Número d'inici de DHCP"
++
++#~ msgid "Where to start assigning IP addresses (default 10)"
++#~ msgstr "Quan començar a assignar adreces IP (per defecte 10)"
++
++#~ msgid "Enable IEEE 802.1x"
++#~ msgstr "Activa IEEE 802.1x"
++
++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests"
++#~ msgstr "Activa l'autenticació IEEE 802.1x i escolta peticions EAP"
++
++#~ msgid "Leasetime"
++#~ msgstr "Temps de Lease"
++
++#~ msgid "Use a DHCP lease of seconds (default 600)"
++#~ msgstr "Utilitza un lease de segons (per defecte 600)"
++
++#~ msgid "Allow session update through RADIUS"
++#~ msgstr "Permet l'actualització de sessió a través de RADIUS"
++
++#~ msgid ""
++#~ "Allow updating of session parameters with RADIUS attributes sent in "
++#~ "Accounting-Response"
++#~ msgstr ""
++#~ "Permet l'actualització dels paràmetres de sessió amb atributs RADIUS "
++#~ "enviats per Accounting-Response"
++
++#~ msgid "Admin password"
++#~ msgstr "Contrasenya d'administració"
++
++#~ msgid ""
++#~ "Password to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr ""
++#~ "Contrasenya per utilitzar per autenticació d'usuari administrador per "
++#~ "agafar configurcions Chilli i establir una sessió \"system\" de dispositiu"
++
++#~ msgid "Admin user"
++#~ msgstr "Usuari administrador"
++
++#~ msgid ""
++#~ "User-name to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr ""
++#~ "Nom d'usuari per utilitzar per autenticació d'usuari administrador per "
++#~ "agafar configurcions Chilli i establir una sessió \"system\" de dispositiu"
++
++#~ msgid "Do not check disconnection requests"
++#~ msgstr "No comprovis les peticions de desconnexió"
++
++#~ msgid "Do not check the source IP address of radius disconnect requests"
++#~ msgstr ""
++#~ "No comprovis l'origen de l'adreça IP de les peticions de desconnexió "
++#~ "RADIUS"
++
++#~ msgid "RADIUS disconnect port"
++#~ msgstr "Port de desconnexió RADIUS"
++
++#~ msgid "UDP port to listen to for accepting radius disconnect requests"
++#~ msgstr "Port UDP per acceptar peticions de desconnexió RADIUS"
++
++#~ msgid "NAS IP"
++#~ msgstr "NAS IP"
++
++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute"
++#~ msgstr "Valor per utilitzar a l'atribut RADIUS adreça NAS-IP"
++
++#~ msgid "NAS MAC"
++#~ msgstr "NAS MAC"
++
++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute"
++#~ msgstr ""
++#~ "Valor d'adreça MAC per utilitzar a l'atribiut RADIUS Called-Station-ID"
++
++#~ msgid "Allow OpenID authentication"
++#~ msgstr "Permet autenticació OpenID"
++
++#~ msgid ""
++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-"
++#~ "openidauth in RADIUS Access-Requests"
++#~ msgstr ""
++#~ "Permet autenticació OpenID enviant ChilliSpot-Config=allow-openidauth als "
++#~ "Access-Requests de RADIUS"
++
++#~ msgid "RADIUS accounting port"
++#~ msgstr "Port d'accounting RADIUS"
++
++#~ msgid ""
++#~ "The UDP port number to use for radius accounting requests (default 1813)"
++#~ msgstr ""
++#~ "Port UDP a utilitzar per les peticions d'accounting RADIUS (per defecte "
++#~ "1813)"
++
++#~ msgid "RADIUS authentication port"
++#~ msgstr "Port d'autenticació RADIUS"
++
++#~ msgid ""
++#~ "The UDP port number to use for radius authentication requests (default "
++#~ "1812)"
++#~ msgstr ""
++#~ "Port UDP a utilitzar per les peticions d'autenticació RADIUS (per defecte "
++#~ "1812)"
++
++#~ msgid "Option radiuscalled"
++#~ msgstr "Opció radiuscalled"
++
++#~ msgid "RADIUS listen address"
++#~ msgstr "Adreça per rebre connexions RADIUS"
++
++#~ msgid "Local interface IP address to use for the radius interface"
++#~ msgstr "Adreça IP d'interfície local per utilitzar per la interfície RADIUS"
++
++#~ msgid "RADIUS location ID"
++#~ msgstr "ID de localització RADIUS"
++
++#~ msgid "WISPr Location ID"
++#~ msgstr "ID de localització WISPr"
++
++#~ msgid "RADIUS location name"
++#~ msgstr "Nom de localització RADIUS"
++
++#~ msgid "WISPr Location Name"
++#~ msgstr "Nom de localització WISPr"
++
++#~ msgid "NAS ID"
++#~ msgstr "NAS ID"
++
++#~ msgid "Network access server identifier"
++#~ msgstr "Identificació de servidor d'accés de xarxa"
++
++#~ msgid "Option radiusnasip"
++#~ msgstr "Opció radiusnasip"
++
++#~ msgid "NAS port type"
++#~ msgstr "Tipus de port NAS"
++
++#~ msgid ""
++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)"
++#~ msgstr ""
++#~ "Valor de l'atribut NAS-Port-Type. Per defecte 19 (Wireless-IEEE-802.11)"
++
++#~ msgid "Send RADIUS VSA"
++#~ msgstr "Envia RADIUS VSA"
++
++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request"
++#~ msgstr "Envia el RADIUS VSA ChilliSpot-OriginalURl al Access-Request"
++
++#~ msgid "RADIUS secret"
++#~ msgstr "Secret RADIUS"
++
++#~ msgid "Radius shared secret for both servers"
++#~ msgstr "Secret compartit RADIUS pels dos servidors"
++
++#~ msgid "RADIUS server 1"
++#~ msgstr "Servidor RADIUS 1"
++
++#~ msgid "The IP address of radius server 1"
++#~ msgstr "L'adreça IP del servidor RADIUS 1"
++
++#~ msgid "RADIUS server 2"
++#~ msgstr "Servidor RADIUS 2"
++
++#~ msgid "The IP address of radius server 2"
++#~ msgstr "L'adreça IP del servidor RADIUS 2"
++
++#~ msgid "Swap octets"
++#~ msgstr "Intercanvia octets"
++
++#~ msgid ""
++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related "
++#~ "to RADIUS attribtues"
++#~ msgstr ""
++#~ "Intercanvia el significat dels \"octets d'entrada\" i els \"octets de "
++#~ "sortida\" com es relacionen els atributs RADIUS"
++
++#~ msgid "Allow WPA guests"
++#~ msgstr "Permet convidats WPA"
++
++#~ msgid ""
++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-"
++#~ "guests in RADIUS Access-Requests"
++#~ msgstr ""
++#~ "Permet l'autenticació de convidats WPA enviant un ChilliSpot-Config=allow-"
++#~ "wpa-guests als Access-Requests de RADIUS"
++
++#~ msgid "Proxy client"
++#~ msgstr "Client proxy"
++
++#~ msgid ""
++#~ "IP address from which radius requests are accepted. If omitted the server "
++#~ "will not accept radius requests"
++#~ msgstr ""
++#~ "Adreça IP des de la qual s'accepten les peticions RADIUS. Si s'omet, el "
++#~ "servidor no acceptarà peticions RADIUS"
++
++#~ msgid "Proxy listen address"
++#~ msgstr "Adreça que rep connexions del proxy"
++
++#~ msgid "Local interface IP address to use for accepting radius requests"
++#~ msgstr ""
++#~ "L'adreça IP de la interfície local a utilitzar per acceptar peticions "
++#~ "RADIUS"
++
++#~ msgid "Proxy port"
++#~ msgstr "Port proxy"
++
++#~ msgid "UDP Port to listen to for accepting radius requests"
++#~ msgstr "Port UDP a rebre connexions per acceptar peticions RADIUS"
++
++#~ msgid "Proxy secret"
++#~ msgstr "Secret de proxy"
++
++#~ msgid "Radius shared secret for clients"
++#~ msgstr "Secret compartit de RADIUS pels clients"
++
++#~ msgid "UAM configuration"
++#~ msgstr "Configuració UAM"
++
++#~ msgid "Unified Configuration Method settings"
++#~ msgstr "Preferències de Mètode de Configuració Unificat"
++
++#~ msgid "Use Chilli XML"
++#~ msgstr "Utilitza XML Chilli"
++
++#~ msgid "Return the so-called Chilli XML along with WISPr XML"
++#~ msgstr "Retorna l'XML Chilli juntament amb l'XML WISPr"
++
++#~ msgid "Default idle timeout"
++#~ msgstr "Temps d'espera d'inactivitat màxim per defecte"
++
++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Temps d'espera d'inactivitat màxim per defecte excepte si s'estableix pel "
++#~ "RADIUS (per defecte 0)"
++
++#~ msgid "Default interim interval"
++#~ msgstr "Interval provisional predeterminat"
++
++#~ msgid ""
++#~ "Default interim-interval for RADIUS accounting unless otherwise set by "
++#~ "RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Interval provisional predeterminat per accounting RADIUS excepte si "
++#~ "s'estableix pel RADIUS (per defecte 0)"
++
++#~ msgid "Default session timeout"
++#~ msgstr "Temps d'espera màxim de sessió per defecte"
++
++#~ msgid ""
++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Temps d'espera màxim de sessió per defecte excepte si s'estableix pel "
++#~ "RADIUS (per defecte 0)"
++
++#~ msgid "Inspect DNS traffic"
++#~ msgstr "Inspeccions tràfic DNS"
++
++#~ msgid ""
++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX "
++#~ "records to prevent dns tunnels (experimental)"
++#~ msgstr ""
++#~ "Inspecciona paquets DNS i descarta ls respostes per qualsevol registre "
++#~ "que no sigui A, CNAME, SOA o MX per prevenir túnels DNS (experimental)"
++
++#~ msgid "Local users file"
++#~ msgstr "Fitxers d'usuaris local"
++
++#~ msgid ""
++#~ "A colon seperated file containing usernames and passwords of locally "
++#~ "authenticated users"
++#~ msgstr ""
++#~ "Un fitxer contenint usuaris i contrasenyes separats per punts d'usuaris "
++#~ "autenticats localment"
++
++#~ msgid "Location name"
++#~ msgstr "Nom de localització"
++
++#~ msgid "Human readable location name used in JSON interface"
++#~ msgstr "Nom de localització llegible utilitzat en l'interfície JSON"
++
++#~ msgid "Do not redirect to UAM server"
++#~ msgstr "No readrecis al servidor UAM"
++
++#~ msgid ""
++#~ "Do not return to UAM server on login success, just redirect to original "
++#~ "URL"
++#~ msgstr ""
++#~ "No retornis al servidor UAM amb quan s'iniciï la sessió amb èxit, "
++#~ "readreça només a la URL original"
++
++#~ msgid "Do not do WISPr"
++#~ msgstr "No facis WISPr"
++
++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead"
++#~ msgstr "No facis cap XML WISPr, assumeix que el back-end ho està fent"
++
++#~ msgid "Post auth proxy"
++#~ msgstr "Proxy post autenticació"
++
++#~ msgid ""
++#~ "Used with postauthproxyport to define a post authentication HTTP proxy "
++#~ "server"
++#~ msgstr ""
++#~ "Utilitzat amb postauthproxyport per definir una autenticació HTTP "
++#~ "posterior de proxy server"
++
++#~ msgid "Post auth proxy port"
++#~ msgstr "Port proxy post autenticació"
++
++#~ msgid ""
++#~ "Used with postauthproxy to define a post authentication HTTP proxy server"
++#~ msgstr ""
++#~ "Utilitzat amb postauthproxy per definir un servidor proxy HTTP "
++#~ "d'autenticació posterior"
++
++#~ msgid "Allowed resources"
++#~ msgstr "Recursos permesos"
++
++#~ msgid "List of resources the client can access without first authenticating"
++#~ msgstr ""
++#~ "Llista dels recursos que el client pot accedir sense autenticar-se primer"
++
++#~ msgid "Allow any DNS server"
++#~ msgstr "Permet qualsevol servidor DNS"
++
++#~ msgid "Allow any DNS server for unauthenticated clients"
++#~ msgstr "Permet qualsevol servidor DNS per clients no autenticats"
++
++#~ msgid "Allow any IP address"
++#~ msgstr "Permet qualsevol adreça IP"
++
++#~ msgid ""
++#~ "Allow clients to use any IP settings they wish by spoofing ARP "
++#~ "(experimental)"
++#~ msgstr ""
++#~ "Permet que els clients utilitzin qualsevol configuració IP que vulguin "
++#~ "fent ARP spoofind (experimental)"
++
++#~ msgid "Allowed domains"
++#~ msgstr "Dominis permesos"
++
++#~ msgid ""
++#~ "Defines a list of domain names to automatically add to the walled garden"
++#~ msgstr ""
++#~ "Defineix una llista de noms de domini per afegir automàticament al jardí "
++#~ "tancat"
++
++#~ msgid "UAM homepage"
++#~ msgstr "Pàgina d'inici UAM"
++
++#~ msgid "URL of homepage to redirect unauthenticated users to"
++#~ msgstr "URL de la pàgina d'inici per readreçar usuari no autenticats"
++
++#~ msgid "UAM static content port"
++#~ msgstr "Port de contingut estàtic UAM"
++
++#~ msgid "TCP port to bind to for only serving embedded content"
++#~ msgstr "Port TCP on escoltar per servir només contingut empotrat"
++
++#~ msgid "UAM listening address"
++#~ msgstr "Adreça per on escoltar UAM"
++
++#~ msgid "IP address to listen to for authentication of clients"
++#~ msgstr "Adreça IP on escoltar pels l'autenticació dels clients"
++
++#~ msgid "UAM logout IP"
++#~ msgstr "IP de final de sessió UAM"
++
++#~ msgid ""
++#~ "Use this IP address to instantly logout a client accessing it (defaults "
++#~ "to 1.1.1.1)"
++#~ msgstr ""
++#~ "Utilitza aquesta adreça IP per finalitzar la sessió d'un que hi accedeix "
++#~ "instantàniament (per defecte 1.1.1.1)"
++
++#~ msgid "UAM listening port"
++#~ msgstr "Port on escoltar UAM"
++
++#~ msgid "TCP port to bind to for authenticating clients (default 3990)"
++#~ msgstr ""
++#~ "Port TCP per on escoltar l'autenticació de clients (per defecte 3990)"
++
++#~ msgid "UAM secret"
++#~ msgstr "Secret UAM"
++
++#~ msgid "Shared secret between uamserver and chilli"
++#~ msgstr "Secret compartit entre el uamserver i el chilli"
++
++#~ msgid "UAM server"
++#~ msgstr "Servidor UAM"
++
++#~ msgid "URL of web server to use for authenticating clients"
++#~ msgstr "URL del servidor URL a utilitzar per clients autenticats"
++
++#~ msgid "UAM user interface"
++#~ msgstr "Interfície d'usuari UAM"
++
++#~ msgid ""
++#~ "An init.d style program to handle local content on the uamuiport web "
++#~ "server"
++#~ msgstr ""
++#~ "Un programa de l'stil init.d per gestionar el contingut local al servidor "
++#~ "web uamuiport"
++
++#~ msgid "Use status file"
++#~ msgstr "Utilitza fitxer d'estat"
++
++#~ msgid ""
++#~ "Write the status of clients in a non-volatile state file (experimental)"
++#~ msgstr ""
++#~ "Escriu l'estat dels clients en un fitxer d'estat no volàtil (experimental)"
++
++#~ msgid "WISPr login url"
++#~ msgstr "URL d'inici de sessió WISPr"
++
++#~ msgid "Specific URL to be given in WISPr XML LoginURL"
++#~ msgstr "URL específica a donar a la URL d'inici de sessió de l'XML WISPr"
++
++#~ msgid "CGI program"
++#~ msgstr "Programa CGI"
++
++#~ msgid ""
++#~ "Executable to run as a CGI type program (like haserl) for URLs with "
++#~ "extention .chi"
++#~ msgstr ""
++#~ "Executable per executar com un programa de tipus CGI (com el haserl) per "
++#~ "URLs amb extensió .chi"
++
++#~ msgid "Web content directory"
++#~ msgstr "Directori de contingut web"
++
++#~ msgid "Directory where embedded local web content is placed"
++#~ msgstr "Directori on se situa el contingut web local empotrat"
++
++#~ msgid "MAC configuration"
++#~ msgstr "Configuració MAC"
++
++#~ msgid "Configure MAC authentication"
++#~ msgstr "Configura l'autenticació MAC"
++
++#~ msgid "Allowed MAC addresses"
++#~ msgstr "Adreces MAC permeses"
++
++#~ msgid "List of MAC addresses for which MAC authentication will be performed"
++#~ msgstr "Llista d'adreces MAC per les que es realitzarà autenticació MAC"
++
++#~ msgid "Authenticate locally allowed MACs"
++#~ msgstr "Autentica localment les MACs permeses"
++
++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS"
++#~ msgstr "Autentica les adreces MAC permeses sense l'ús del RADIUS"
++
++#~ msgid "Enable MAC authentification"
++#~ msgstr "Activa l'autenticació MAC"
++
++#~ msgid "Try to authenticate all users based on their mac address alone"
++#~ msgstr ""
++#~ "Intenta autenticar tots els usuaris basats només en la seva adreça MAC"
++
++#~ msgid "Password"
++#~ msgstr "Contrasenya"
++
++#~ msgid "Password used when performing MAC authentication"
++#~ msgstr "Contrasenya utilitzada quan es realitza autenticació MAC"
++
++#~ msgid "Suffix"
++#~ msgstr "Sufix"
++
++#~ msgid "coovachilli_macauth_macsuffix_desc"
++#~ msgstr ""
++#~ "Sufix per afegir a l'adreça MAC per formar el nm d'usuari, que s'enviarà "
++#~ "al servidor RADIUS"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/cs/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/cs/coovachilli.po
+new file mode 100644
+index 0000000..0dc5fc0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/cs/coovachilli.po
+@@ -0,0 +1,348 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-30 10:33+0200\n"
++"Last-Translator: Astran <martin.hromadko@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Nastavení sítě"
++
++msgid "RADIUS configuration"
++msgstr "Nastavení RADIUS"
++
++msgid "UAM and MAC Authentication"
++msgstr "UAM a MAC ověřování"
++
++#~ msgid "General configuration"
++#~ msgstr "Obecná konfigurace"
++
++#~ msgid "General CoovaChilli settings"
++#~ msgstr "Obecné nastavení CoovaChilli"
++
++#~ msgid "Command socket"
++#~ msgstr "Příkazový socket"
++
++#~ msgid "UNIX socket used for communication with chilli_query"
++#~ msgstr "UNIX socket, používaný pro komunikaci s chilli_query"
++
++#~ msgid "Config refresh interval"
++#~ msgstr "Interval obnovení konfigurace"
++
++#~ msgid "Pid file"
++#~ msgstr "PID soubor"
++
++#~ msgid "TUN/TAP configuration"
++#~ msgstr "Nastavení TUN/TAP"
++
++#~ msgid "Network/Tun configuration"
++#~ msgstr "Nastavení sítě/Tun"
++
++#~ msgid "Network down script"
++#~ msgstr "Network down skript"
++
++#~ msgid "Network up script"
++#~ msgstr "Network up skript"
++
++#~ msgid "Script executed after the tun network interface has been brought up"
++#~ msgstr "Skript, spuštěný po nahození síťového rozhraní TUN"
++
++#~ msgid "Primary DNS Server"
++#~ msgstr "Primární DNS server"
++
++#~ msgid "Secondary DNS Server"
++#~ msgstr "Sekundární DNS server"
++
++#~ msgid "Domain name"
++#~ msgstr "Doménové jméno"
++
++#~ msgid "Dynamic IP address pool"
++#~ msgstr "Pool dynamických IP adres"
++
++#~ msgid "Specifies a pool of dynamic IP addresses"
++#~ msgstr "UrÄi rozsah, z nÄ›hož se budou pÅ™idÄ›lovat dynamické IP adresy"
++
++#~ msgid "IP down script"
++#~ msgstr "IP down skript"
++
++#~ msgid "IP up script"
++#~ msgstr "IP up skript"
++
++#~ msgid "Network address of the uplink interface (CIDR notation)"
++#~ msgstr "Síťová adresa uplink rozhraní (CIDR notace)"
++
++#~ msgid "Static IP address pool"
++#~ msgstr "Pool statických IP adres"
++
++#~ msgid "Specifies a pool of static IP addresses"
++#~ msgstr "UrÄuje rozsah, z nÄ›hož se budou pÅ™idÄ›lovat statické IP adresy"
++
++#~ msgid "TX queue length"
++#~ msgstr "Délka odchozí fronty"
++
++#~ msgid "The TX queue length to set on the TUN/TAP interface"
++#~ msgstr "Délka odchozí fronty na zařízení TUN/TAP"
++
++#~ msgid "Use TAP device"
++#~ msgstr "Použít zařízení TAP"
++
++#~ msgid "Use the TAP interface instead of TUN"
++#~ msgstr "Použít TAP rozhraní namísto TUN"
++
++#~ msgid "DHCP configuration"
++#~ msgstr "Nastavení DHCP"
++
++#~ msgid "Set DHCP options for connecting clients"
++#~ msgstr "Nastavit možnosti DHCP pro příchozí klienty"
++
++#~ msgid "DHCP end number"
++#~ msgstr "DHCP koncové Äíslo"
++
++#~ msgid "Where to stop assigning IP addresses (default 254)"
++#~ msgstr "Kde přestat přidělovat IP adresy (standardně 254)"
++
++#~ msgid "DHCP interface"
++#~ msgstr "DHCP rozhraní"
++
++#~ msgid "Where to start assigning IP addresses (default 10)"
++#~ msgstr "Odkud zaÄít pÅ™idÄ›lovat IP adresy"
++
++#~ msgid "Enable IEEE 802.1x"
++#~ msgstr "Povolit IEEE 802.1x"
++
++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests"
++#~ msgstr "Povolit IEEE 802.1x autentizaci a naslouchat požadavkům EAP"
++
++#~ msgid "Admin password"
++#~ msgstr "Administrátorské heslo"
++
++#~ msgid "Admin user"
++#~ msgstr "Administrátorský uživatel"
++
++#~ msgid "Do not check disconnection requests"
++#~ msgstr "Neověřovat požadavky na odpojení"
++
++#~ msgid "Do not check the source IP address of radius disconnect requests"
++#~ msgstr ""
++#~ "Neověřovat zdrojovou IP adresu požadavku na odpojení protokolu RADIUS"
++
++#~ msgid "NAS IP"
++#~ msgstr "NAS IP"
++
++#~ msgid "NAS MAC"
++#~ msgstr "NAS MAC"
++
++#~ msgid "Allow OpenID authentication"
++#~ msgstr "Povolit autentizaci pomocí OpenID"
++
++#~ msgid "RADIUS server 1"
++#~ msgstr "RADIUS server 1"
++
++#~ msgid "The IP address of radius server 1"
++#~ msgstr "IP adresa prvního radius serveru"
++
++#~ msgid "RADIUS server 2"
++#~ msgstr "RADIUS server 2"
++
++#~ msgid "The IP address of radius server 2"
++#~ msgstr "IP adresa druhého radius serveru"
++
++#~ msgid ""
++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related "
++#~ "to RADIUS attribtues"
++#~ msgstr ""
++#~ "Prohodit významy spojení \"vstupní oktety\" a \"výstupní oktety\", "
++#~ "vztahující se k atributům protokolu RADIUS"
++
++#~ msgid "Allow WPA guests"
++#~ msgstr "Povolit WPA hosty"
++
++#~ msgid "Proxy client"
++#~ msgstr "Proxy klient"
++
++#~ msgid ""
++#~ "IP address from which radius requests are accepted. If omitted the server "
++#~ "will not accept radius requests"
++#~ msgstr ""
++#~ "IP adresa, ze které budou přijímány požadavky radius. Pokud necháte "
++#~ "prázdné, server nebude přijímat požadavky protokolu RADIUS."
++
++#~ msgid "Proxy listen address"
++#~ msgstr "Naslouchající adresa Proxy"
++
++#~ msgid "Local interface IP address to use for accepting radius requests"
++#~ msgstr ""
++#~ "IP adresa místního rozhraní, urÄená pro naslouchání požadavkům protokolu "
++#~ "RADIUS"
++
++#~ msgid "Proxy port"
++#~ msgstr "Port Proxy"
++
++#~ msgid "UDP Port to listen to for accepting radius requests"
++#~ msgstr "UDP port, urÄený pro naslouchání požadavkům protokolu RADIUS"
++
++#~ msgid "UAM configuration"
++#~ msgstr "Konfigurace UAM"
++
++#~ msgid "Unified Configuration Method settings"
++#~ msgstr "Nastavení 'Unified Configuration Method'"
++
++#~ msgid "Use Chilli XML"
++#~ msgstr "Použít Chilli XML"
++
++#~ msgid "Default idle timeout"
++#~ msgstr "Výchozí Äasový limit neÄinnosti"
++
++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Výchozí Äasový limit neÄinnosti, pokud nebyl nastaven pomocí RADIUS "
++#~ "(standardnÄ› 0)"
++
++#~ msgid "Default session timeout"
++#~ msgstr "Výchozí Äasový limit sezení"
++
++#~ msgid ""
++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Výchozí Äasový limit sezení, pokud není RADIUS nastaven jinak (standardnÄ› "
++#~ "0)"
++
++#~ msgid "Inspect DNS traffic"
++#~ msgstr "Kontrolovat DNS provoz"
++
++#~ msgid "Local users file"
++#~ msgstr "Soubor s místními uživateli"
++
++#~ msgid ""
++#~ "A colon seperated file containing usernames and passwords of locally "
++#~ "authenticated users"
++#~ msgstr ""
++#~ "Soubor, obsahující uživatelská jména a hesla místně ověřovaných "
++#~ "uživatelů. Jednotlivé položky jsou oddÄ›leny dvojteÄkou."
++
++#~ msgid "Location name"
++#~ msgstr "Název umístění"
++
++#~ msgid "Human readable location name used in JSON interface"
++#~ msgstr "Čitelný název umístění, používán v rozhraní JSON"
++
++#~ msgid "Do not redirect to UAM server"
++#~ msgstr "Nepřesměrovávat na UAM server"
++
++#~ msgid ""
++#~ "Do not return to UAM server on login success, just redirect to original "
++#~ "URL"
++#~ msgstr ""
++#~ "Při úspěšném přihlášení nevracet na UAM server, pouze přesměrovat na "
++#~ "původní URL"
++
++#~ msgid "Do not do WISPr"
++#~ msgstr "Neprovádět WISPr"
++
++#~ msgid "Allowed resources"
++#~ msgstr "Povolené zdroje"
++
++#~ msgid "List of resources the client can access without first authenticating"
++#~ msgstr "Seznam zdrojů, jež může klient využívat bez nutnosti autentizace"
++
++#~ msgid "Allow any DNS server"
++#~ msgstr "Povolit libovolný DNS server"
++
++#~ msgid "Allow any DNS server for unauthenticated clients"
++#~ msgstr "Povolí libovolný DNS server neověřeným klientům"
++
++#~ msgid "Allow any IP address"
++#~ msgstr "Povolit libovolnou IP adresu"
++
++#~ msgid "Allowed domains"
++#~ msgstr "Povolené domény"
++
++#~ msgid "UAM homepage"
++#~ msgstr "Domovská stránka UAM"
++
++#~ msgid "URL of homepage to redirect unauthenticated users to"
++#~ msgstr ""
++#~ "URL domovské stránky, na kterou budou přesměrováni neověření uživatelé"
++
++#~ msgid "IP address to listen to for authentication of clients"
++#~ msgstr "IP adresa, na které naslouchat za úÄelem ověřování klientů"
++
++#~ msgid "UAM logout IP"
++#~ msgstr "Odhlašovací IP UAM"
++
++#~ msgid ""
++#~ "Use this IP address to instantly logout a client accessing it (defaults "
++#~ "to 1.1.1.1)"
++#~ msgstr ""
++#~ "Adresa, sloužící k okamžitému odhlášení klienta, pokud na ní přistoupí "
++#~ "(standardnÄ› 1.1.1.1)"
++
++#~ msgid "UAM listening port"
++#~ msgstr "Naslouchající port UAM"
++
++#~ msgid "UAM server"
++#~ msgstr "UAM server"
++
++#~ msgid "URL of web server to use for authenticating clients"
++#~ msgstr "URL web serveru, sloužícího k ověřování klientů"
++
++#~ msgid "UAM user interface"
++#~ msgstr "Uživatelské rozhraní UAM"
++
++#~ msgid "Use status file"
++#~ msgstr "Použít stavový soubor"
++
++#~ msgid ""
++#~ "Write the status of clients in a non-volatile state file (experimental)"
++#~ msgstr ""
++#~ "Zapisovat stavy klientů do stálého stavového souboru (experimentální)"
++
++#~ msgid "WISPr login url"
++#~ msgstr "Přihlašovací URL WISPr"
++
++#~ msgid "CGI program"
++#~ msgstr "CGI program"
++
++#~ msgid "Web content directory"
++#~ msgstr "Adresář s webovým obsahem"
++
++#~ msgid "Directory where embedded local web content is placed"
++#~ msgstr "Adresář, ve kterém je umístěn místní webový obsah."
++
++#~ msgid "MAC configuration"
++#~ msgstr "Nastavení MAC"
++
++#~ msgid "Configure MAC authentication"
++#~ msgstr "Nastavit ověřování pomocí MAC"
++
++#~ msgid "Allowed MAC addresses"
++#~ msgstr "Povolené MAC adresy"
++
++#~ msgid "List of MAC addresses for which MAC authentication will be performed"
++#~ msgstr "Seznam MAC adres, pro které bude prováděno ověřování pomocí MAC"
++
++#~ msgid "Authenticate locally allowed MACs"
++#~ msgstr "Ověřit lokálně povolené MAC"
++
++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS"
++#~ msgstr "Ověří povolené MAC adresy bez použití protokolu RADIUS"
++
++#~ msgid "Enable MAC authentification"
++#~ msgstr "Povolit ověřování pomocí MAC"
++
++#~ msgid "Password"
++#~ msgstr "Heslo"
++
++#~ msgid "Suffix"
++#~ msgstr "Přípona"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/de/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/de/coovachilli.po
+new file mode 100644
+index 0000000..d8322db
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/de/coovachilli.po
+@@ -0,0 +1,658 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2012-07-17 15:05+0200\n"
++"Last-Translator: Martin <roecker@empty-v.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Netzwerk-Konfiguration"
++
++msgid "RADIUS configuration"
++msgstr "RADIUS Konfiguration"
++
++msgid "UAM and MAC Authentication"
++msgstr "UAM- und MAC-Authentifizierung"
++
++#~ msgid "General configuration"
++#~ msgstr "Allgemeine Einstellungen"
++
++#~ msgid "General CoovaChilli settings"
++#~ msgstr "Allgemeine Einstellungen zu CoovaChilli"
++
++#, fuzzy
++#~ msgid "Command socket"
++#~ msgstr "Eingabeschnittstelle"
++
++#~ msgid "UNIX socket used for communication with chilli_query"
++#~ msgstr ""
++#~ "UNIX socket der fuer die Kommunikation mit chilli_query benutzt wird"
++
++#, fuzzy
++#~ msgid "Config refresh interval"
++#~ msgstr "Zeit zwischen neuladen der Konfiguration"
++
++#, fuzzy
++#~ msgid ""
++#~ "Re-read configuration file and do DNS lookups every interval seconds. "
++#~ "This has the same effect as sending the HUP signal. If interval is 0 "
++#~ "(zero) this feature is disabled. "
++#~ msgstr "Zeit zwischen neuladen der Konfiguration"
++
++#~ msgid "Pid file"
++#~ msgstr "<abbr title=\"Prozessindentifikationsnummer\">Pid</abbr>-Datei"
++
++#~ msgid "Filename to put the process id"
++#~ msgstr ""
++#~ "Name der Datei, in der die <abbr title=\"Prozessindentifikationsnummer"
++#~ "\">Pid</abbr> gespeichert wird"
++
++#, fuzzy
++#~ msgid "State directory"
++#~ msgstr "Statisches Verzeichniss"
++
++#~ msgid "Directory of non-volatile data"
++#~ msgstr "Verzeichniss für statische Daten"
++
++#, fuzzy
++#~ msgid "TUN/TAP configuration"
++#~ msgstr "TUN/TAP Konfiguration"
++
++#, fuzzy
++#~ msgid "Network/Tun configuration"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Network down script"
++#~ msgstr ""
++#~ "Script, das nach einer Umwandlung von einer autorisierten zu einer "
++#~ "unautorisierten Sitzung ausgeführt wird"
++
++#~ msgid ""
++#~ "Script executed after a session has moved from authorized state to "
++#~ "unauthorized"
++#~ msgstr ""
++#~ "Skript, das nach einer Umwandlung von einer autorisierten zu einer "
++#~ "unautorisierten Sitzung ausgeführt wird"
++
++#~ msgid "Network up script"
++#~ msgstr "Netzwerk Up Skript"
++
++#, fuzzy
++#~ msgid "Script executed after the tun network interface has been brought up"
++#~ msgstr "Script, dass nach erfolgreicher tun - Verbindung ausgeführt wird"
++
++#~ msgid "Primary DNS Server"
++#~ msgstr "Primärer DNS-Server"
++
++#~ msgid "Secondary DNS Server"
++#~ msgstr "Sekundärer DNS-Server"
++
++#, fuzzy
++#~ msgid "Domain name"
++#~ msgstr "Domain Name"
++
++#~ msgid ""
++#~ "Is used to inform the client about the domain name to use for DNS lookups"
++#~ msgstr ""
++#~ "Wird benutzt um Clients ueber den zu benutzenden Domain Namen fuer DNS "
++#~ "Anfragen zu informieren"
++
++#~ msgid "Dynamic IP address pool"
++#~ msgstr "Dynamischer IP-Adressen Pool"
++
++#~ msgid "Specifies a pool of dynamic IP addresses"
++#~ msgstr "Legt einen Bereich von dynamischen IP-Adressen fest"
++
++#~ msgid "IP down script"
++#~ msgstr "IP down Skript"
++
++#, fuzzy
++#~ msgid "Script executed after the tun network interface has been taken down"
++#~ msgstr ""
++#~ "Script, das nach einer Umwandlung von einer autorisierten zu einer "
++#~ "unautorisierten Sitzung ausgeführt wird"
++
++#, fuzzy
++#~ msgid "IP up script"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid ""
++#~ "Script executed after the TUN/TAP network interface has been brought up"
++#~ msgstr "Script, dass nach erfolgreicher tun - Verbindung ausgeführt wird"
++
++#, fuzzy
++#~ msgid "Uplink subnet"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Network address of the uplink interface (CIDR notation)"
++#~ msgstr ""
++#~ "Zur Auflösung der Host-Namen benötigter DNS Server, die an den client "
++#~ "übertragen wird"
++
++#, fuzzy
++#~ msgid "Static IP address pool"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "Specifies a pool of static IP addresses"
++#~ msgstr "Script, dass nach erfolgreicher tun - Verbindung ausgeführt wird"
++
++#, fuzzy
++#~ msgid "TUN/TAP device"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "The specific device to use for the TUN/TAP interface"
++#~ msgstr ""
++#~ "Script, das nach einer Umwandlung von einer autorisierten zu einer "
++#~ "unautorisierten Sitzung ausgeführt wird"
++
++#, fuzzy
++#~ msgid "TX queue length"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "The TX queue length to set on the TUN/TAP interface"
++#~ msgstr ""
++#~ "Script, das nach einer Umwandlung von einer autorisierten zu einer "
++#~ "unautorisierten Sitzung ausgeführt wird"
++
++#, fuzzy
++#~ msgid "Use TAP device"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Use the TAP interface instead of TUN"
++#~ msgstr "Script, dass nach erfolgreicher tun - Verbindung ausgeführt wird"
++
++#, fuzzy
++#~ msgid "DHCP configuration"
++#~ msgstr "TUN/TAP Konfiguration"
++
++#, fuzzy
++#~ msgid "Set DHCP options for connecting clients"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "DHCP end number"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Where to stop assigning IP addresses (default 254)"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "DHCP interface"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Ethernet interface to listen to for the downlink interface"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Listen MAC address"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid ""
++#~ "MAC address to listen to. If not specified the MAC address of the "
++#~ "interface will be used"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "DHCP start number"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Where to start assigning IP addresses (default 10)"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Enable IEEE 802.1x"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Leasetime"
++#~ msgstr "Vorhaltezeit"
++
++#~ msgid "Use a DHCP lease of seconds (default 600)"
++#~ msgstr "Benutze eine DHCP-Vorhaltezeit in Sekunden (voreingestelllt 600)"
++
++#~ msgid "Allow session update through RADIUS"
++#~ msgstr "Erlaube Sitzungsupdates durch RADIUS"
++
++#, fuzzy
++#~ msgid ""
++#~ "Allow updating of session parameters with RADIUS attributes sent in "
++#~ "Accounting-Response"
++#~ msgstr ""
++#~ "Erlaubt das Aktuallisieren der Sitzungsparameter mit RADIUS-attributen, "
++#~ "die im der Konten-Antwort enthalten sind"
++
++#~ msgid "Admin password"
++#~ msgstr "Administratorkennwort"
++
++#, fuzzy
++#~ msgid ""
++#~ "Password to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr ""
++#~ "Kennwort zur Administratoren-Authentifizierung um die chilli- "
++#~ "konfigurationen aufzunehmen und eine Systemsitzung fürs Gerät zu erstellen"
++
++#, fuzzy
++#~ msgid "Admin user"
++#~ msgstr "Adminstratorenkennung"
++
++#, fuzzy
++#~ msgid ""
++#~ "User-name to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr "Benutzername des für Administration berechtigten Benutzers. "
++
++#, fuzzy
++#~ msgid "Do not check disconnection requests"
++#~ msgstr "Ignoriere die Verbindungstrennungsanfragen"
++
++#, fuzzy
++#~ msgid "Do not check the source IP address of radius disconnect requests"
++#~ msgstr "Prüft nicht die Quell-IP einer RADIUS Verbindungstrennungsanfrage."
++
++#, fuzzy
++#~ msgid "RADIUS disconnect port"
++#~ msgstr "Port f&uuml;r die Verbindungstrennung"
++
++#, fuzzy
++#~ msgid "UDP port to listen to for accepting radius disconnect requests"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "NAS IP"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "NAS MAC"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Allow OpenID authentication"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid ""
++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-"
++#~ "openidauth in RADIUS Access-Requests"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "RADIUS accounting port"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid ""
++#~ "The UDP port number to use for radius accounting requests (default 1813)"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "RADIUS authentication port"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid ""
++#~ "The UDP port number to use for radius authentication requests (default "
++#~ "1812)"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Option radiuscalled"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "RADIUS listen address"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Local interface IP address to use for the radius interface"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "RADIUS location ID"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "WISPr Location ID"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "RADIUS location name"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "WISPr Location Name"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "NAS ID"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Network access server identifier"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Option radiusnasip"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "NAS port type"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid ""
++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Send RADIUS VSA"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "RADIUS secret"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Radius shared secret for both servers"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "RADIUS server 1"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "The IP address of radius server 1"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "RADIUS server 2"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "The IP address of radius server 2"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Swap octets"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid ""
++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related "
++#~ "to RADIUS attribtues"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Allow WPA guests"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid ""
++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-"
++#~ "guests in RADIUS Access-Requests"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "UAM configuration"
++#~ msgstr "TUN/TAP Konfiguration"
++
++#, fuzzy
++#~ msgid "Unified Configuration Method settings"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Inspect DNS traffic"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid ""
++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX "
++#~ "records to prevent dns tunnels (experimental)"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Local users file"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid ""
++#~ "A colon seperated file containing usernames and passwords of locally "
++#~ "authenticated users"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Human readable location name used in JSON interface"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Do not redirect to UAM server"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid ""
++#~ "Do not return to UAM server on login success, just redirect to original "
++#~ "URL"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Do not do WISPr"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Allowed resources"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "List of resources the client can access without first authenticating"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Allow any DNS server"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "Allow any DNS server for unauthenticated clients"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "Allow any IP address"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid ""
++#~ "Allow clients to use any IP settings they wish by spoofing ARP "
++#~ "(experimental)"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Allowed domains"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid ""
++#~ "Defines a list of domain names to automatically add to the walled garden"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "UAM homepage"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "URL of homepage to redirect unauthenticated users to"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "UAM static content port"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "TCP port to bind to for only serving embedded content"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "UAM listening address"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "IP address to listen to for authentication of clients"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "UAM logout IP"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid ""
++#~ "Use this IP address to instantly logout a client accessing it (defaults "
++#~ "to 1.1.1.1)"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "UAM listening port"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "TCP port to bind to for authenticating clients (default 3990)"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "UAM secret"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "Shared secret between uamserver and chilli"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "UAM server"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "URL of web server to use for authenticating clients"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "UAM user interface"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid ""
++#~ "An init.d style program to handle local content on the uamuiport web "
++#~ "server"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "WISPr login url"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Specific URL to be given in WISPr XML LoginURL"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "CGI program"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid ""
++#~ "Executable to run as a CGI type program (like haserl) for URLs with "
++#~ "extention .chi"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Web content directory"
++#~ msgstr "Domain Name"
++
++#, fuzzy
++#~ msgid "Directory where embedded local web content is placed"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "MAC configuration"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Configure MAC authentication"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Allowed MAC addresses"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "List of MAC addresses for which MAC authentication will be performed"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Authenticate locally allowed MACs"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Enable MAC authentification"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Try to authenticate all users based on their mac address alone"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Password"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Password used when performing MAC authentication"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "Suffix"
++#~ msgstr "Netzwerk/TUN Konfiguration"
++
++#, fuzzy
++#~ msgid "coovachilli_macauth_macsuffix_desc"
++#~ msgstr "Netzwerk/TUN Konfiguration"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/el/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/el/coovachilli.po
+new file mode 100644
+index 0000000..90d693d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/el/coovachilli.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2012-03-19 15:27+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr ""
++
++msgid "RADIUS configuration"
++msgstr ""
++
++msgid "UAM and MAC Authentication"
++msgstr ""
++
++#~ msgid "General configuration"
++#~ msgstr "Γενική παÏαμετÏοποίηση"
++
++#~ msgid "DHCP configuration"
++#~ msgstr "ΠαÏαμετÏοποίηση DHCP"
++
++#~ msgid "DHCP interface"
++#~ msgstr "Διεπαφή DHCP"
++
++#~ msgid "Enable IEEE 802.1x"
++#~ msgstr "ΕνεÏγοποίηση IEEE 802.1x"
++
++#~ msgid "Admin password"
++#~ msgstr "Κωδικός Ï€Ïόσβασης διαχειÏιστή"
++
++#~ msgid "Location name"
++#~ msgstr "Όνομα τοποθεσίας"
++
++#~ msgid "CGI program"
++#~ msgstr "ΠÏόγÏαμμα CGI"
++
++#~ msgid "Password"
++#~ msgstr "Κωδικός Ï€Ïόσβασης"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/en/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/en/coovachilli.po
+new file mode 100644
+index 0000000..ebaa345
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/en/coovachilli.po
+@@ -0,0 +1,639 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-03-18 05:30+0200\n"
++"Last-Translator: Anonymous Pootle User\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: en\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr ""
++
++msgid "RADIUS configuration"
++msgstr ""
++
++msgid "UAM and MAC Authentication"
++msgstr ""
++
++#, fuzzy
++#~ msgid "General configuration"
++#~ msgstr "General configuration"
++
++#~ msgid "General CoovaChilli settings"
++#~ msgstr "General CoovaChilli settings"
++
++#~ msgid "Command socket"
++#~ msgstr "Command socket"
++
++#~ msgid "UNIX socket used for communication with chilli_query"
++#~ msgstr "UNIX socket used for communication with chilli_query"
++
++#~ msgid "Config refresh interval"
++#~ msgstr "Config refresh interval"
++
++#~ msgid ""
++#~ "Re-read configuration file and do DNS lookups every interval seconds. "
++#~ "This has the same effect as sending the HUP signal. If interval is 0 "
++#~ "(zero) this feature is disabled. "
++#~ msgstr ""
++#~ "Re-read configuration file and do DNS lookups every interval seconds. "
++#~ "This has the same effect as sending the HUP signal. If interval is 0 "
++#~ "(zero) this feature is disabled. "
++
++#~ msgid "Pid file"
++#~ msgstr "Pid file"
++
++#~ msgid "Filename to put the process id"
++#~ msgstr "Filename to put the process id"
++
++#~ msgid "State directory"
++#~ msgstr "State directory"
++
++#~ msgid "Directory of non-volatile data"
++#~ msgstr "Directory of non-volatile data"
++
++#~ msgid "TUN/TAP configuration"
++#~ msgstr "TUN/TAP configuration"
++
++#~ msgid "Network/Tun configuration"
++#~ msgstr "Network/Tun configuration"
++
++#~ msgid "Network down script"
++#~ msgstr "Network down script"
++
++#~ msgid ""
++#~ "Script executed after a session has moved from authorized state to "
++#~ "unauthorized"
++#~ msgstr ""
++#~ "Script executed after a session has moved from authorized state to "
++#~ "unauthorized"
++
++#~ msgid "Network up script"
++#~ msgstr "Network up script"
++
++#~ msgid "Script executed after the tun network interface has been brought up"
++#~ msgstr "Script executed after the tun network interface has been brought up"
++
++#~ msgid "Primary DNS Server"
++#~ msgstr "Primary DNS Server"
++
++#~ msgid "Secondary DNS Server"
++#~ msgstr "Secondary DNS Server"
++
++#~ msgid "Domain name"
++#~ msgstr "Domain name"
++
++#~ msgid ""
++#~ "Is used to inform the client about the domain name to use for DNS lookups"
++#~ msgstr ""
++#~ "Is used to inform the client about the domain name to use for DNS lookups"
++
++#~ msgid "Dynamic IP address pool"
++#~ msgstr "Dynamic IP address pool"
++
++#~ msgid "Specifies a pool of dynamic IP addresses"
++#~ msgstr "Specifies a pool of dynamic IP addresses"
++
++#~ msgid "IP down script"
++#~ msgstr "IP down script"
++
++#~ msgid "Script executed after the tun network interface has been taken down"
++#~ msgstr "Script executed after the tun network interface has been taken down"
++
++#~ msgid "IP up script"
++#~ msgstr "IP up script"
++
++#~ msgid ""
++#~ "Script executed after the TUN/TAP network interface has been brought up"
++#~ msgstr ""
++#~ "Script executed after the TUN/TAP network interface has been brought up"
++
++#~ msgid "Uplink subnet"
++#~ msgstr "Uplink subnet"
++
++#~ msgid "Network address of the uplink interface (CIDR notation)"
++#~ msgstr "Network address of the uplink interface (CIDR notation)"
++
++#~ msgid "Static IP address pool"
++#~ msgstr "Static IP address pool"
++
++#~ msgid "Specifies a pool of static IP addresses"
++#~ msgstr "Specifies a pool of static IP addresses"
++
++#~ msgid "TUN/TAP device"
++#~ msgstr "TUN/TAP device"
++
++#~ msgid "The specific device to use for the TUN/TAP interface"
++#~ msgstr "The specific device to use for the TUN/TAP interface"
++
++#~ msgid "TX queue length"
++#~ msgstr "TX queue length"
++
++#~ msgid "The TX queue length to set on the TUN/TAP interface"
++#~ msgstr "The TX queue length to set on the TUN/TAP interface"
++
++#~ msgid "Use TAP device"
++#~ msgstr "Use TAP device"
++
++#~ msgid "Use the TAP interface instead of TUN"
++#~ msgstr "Use the TAP interface instead of TUN"
++
++#~ msgid "DHCP configuration"
++#~ msgstr "DHCP configuration"
++
++#~ msgid "Set DHCP options for connecting clients"
++#~ msgstr "Set DHCP options for connecting clients"
++
++#~ msgid "DHCP end number"
++#~ msgstr "DHCP end number"
++
++#~ msgid "Where to stop assigning IP addresses (default 254)"
++#~ msgstr "Where to stop assigning IP addresses (default 254)"
++
++#~ msgid "DHCP interface"
++#~ msgstr "DHCP interface"
++
++#~ msgid "Ethernet interface to listen to for the downlink interface"
++#~ msgstr "Ethernet interface to listen to for the downlink interface"
++
++#~ msgid "Listen MAC address"
++#~ msgstr "Listen MAC address"
++
++#~ msgid ""
++#~ "MAC address to listen to. If not specified the MAC address of the "
++#~ "interface will be used"
++#~ msgstr ""
++#~ "MAC address to listen to. If not specified the MAC address of the "
++#~ "interface will be used"
++
++#~ msgid "DHCP start number"
++#~ msgstr "DHCP start number"
++
++#~ msgid "Where to start assigning IP addresses (default 10)"
++#~ msgstr "Where to start assigning IP addresses (default 10)"
++
++#~ msgid "Enable IEEE 802.1x"
++#~ msgstr "Enable IEEE 802.1x"
++
++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests"
++#~ msgstr "Enable IEEE 802.1x authentication and listen for EAP requests"
++
++#~ msgid "Leasetime"
++#~ msgstr "Leasetime"
++
++#~ msgid "Use a DHCP lease of seconds (default 600)"
++#~ msgstr "Use a DHCP lease of seconds (default 600)"
++
++#~ msgid "Allow session update through RADIUS"
++#~ msgstr "Allow session update through RADIUS"
++
++#~ msgid ""
++#~ "Allow updating of session parameters with RADIUS attributes sent in "
++#~ "Accounting-Response"
++#~ msgstr ""
++#~ "Allow updating of session parameters with RADIUS attributes sent in "
++#~ "Accounting-Response"
++
++#~ msgid "Admin password"
++#~ msgstr "Admin password"
++
++#~ msgid ""
++#~ "Password to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr ""
++#~ "Password to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++
++#~ msgid "Admin user"
++#~ msgstr "Admin user"
++
++#~ msgid ""
++#~ "User-name to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr ""
++#~ "User-name to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++
++#~ msgid "Do not check disconnection requests"
++#~ msgstr "Do not check disconnection requests"
++
++#~ msgid "Do not check the source IP address of radius disconnect requests"
++#~ msgstr "Do not check the source IP address of radius disconnect requests"
++
++#~ msgid "RADIUS disconnect port"
++#~ msgstr "RADIUS disconnect port"
++
++#~ msgid "UDP port to listen to for accepting radius disconnect requests"
++#~ msgstr "UDP port to listen to for accepting radius disconnect requests"
++
++#~ msgid "NAS IP"
++#~ msgstr "NAS IP"
++
++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute"
++#~ msgstr "Value to use in RADIUS NAS-IP-Address attribute"
++
++#~ msgid "NAS MAC"
++#~ msgstr "NAS MAC"
++
++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute"
++#~ msgstr "MAC address value to use in RADIUS Called-Station-ID attribute"
++
++#~ msgid "Allow OpenID authentication"
++#~ msgstr "Allow OpenID authentication"
++
++#~ msgid ""
++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-"
++#~ "openidauth in RADIUS Access-Requests"
++#~ msgstr ""
++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-"
++#~ "openidauth in RADIUS Access-Requests"
++
++#~ msgid "RADIUS accounting port"
++#~ msgstr "RADIUS accounting port"
++
++#~ msgid ""
++#~ "The UDP port number to use for radius accounting requests (default 1813)"
++#~ msgstr ""
++#~ "The UDP port number to use for radius accounting requests (default 1813)"
++
++#~ msgid "RADIUS authentication port"
++#~ msgstr "RADIUS authentication port"
++
++#~ msgid ""
++#~ "The UDP port number to use for radius authentication requests (default "
++#~ "1812)"
++#~ msgstr ""
++#~ "The UDP port number to use for radius authentication requests (default "
++#~ "1812)"
++
++#~ msgid "Option radiuscalled"
++#~ msgstr "Option radiuscalled"
++
++#~ msgid "RADIUS listen address"
++#~ msgstr "RADIUS listen address"
++
++#~ msgid "Local interface IP address to use for the radius interface"
++#~ msgstr "Local interface IP address to use for the radius interface"
++
++#~ msgid "RADIUS location ID"
++#~ msgstr "RADIUS location ID"
++
++#~ msgid "WISPr Location ID"
++#~ msgstr "WISPr Location ID"
++
++#~ msgid "RADIUS location name"
++#~ msgstr "RADIUS location name"
++
++#~ msgid "WISPr Location Name"
++#~ msgstr "WISPr Location Name"
++
++#~ msgid "NAS ID"
++#~ msgstr "NAS ID"
++
++#~ msgid "Network access server identifier"
++#~ msgstr "Network access server identifier"
++
++#~ msgid "Option radiusnasip"
++#~ msgstr "Option radiusnasip"
++
++#~ msgid "NAS port type"
++#~ msgstr "NAS port type"
++
++#~ msgid ""
++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)"
++#~ msgstr ""
++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)"
++
++#~ msgid "Send RADIUS VSA"
++#~ msgstr "Send RADIUS VSA"
++
++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request"
++#~ msgstr "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request"
++
++#~ msgid "RADIUS secret"
++#~ msgstr "RADIUS secret"
++
++#~ msgid "Radius shared secret for both servers"
++#~ msgstr "Radius shared secret for both servers"
++
++#~ msgid "RADIUS server 1"
++#~ msgstr "RADIUS server 1"
++
++#~ msgid "The IP address of radius server 1"
++#~ msgstr "The IP address of radius server 1"
++
++#~ msgid "RADIUS server 2"
++#~ msgstr "RADIUS server 2"
++
++#~ msgid "The IP address of radius server 2"
++#~ msgstr "The IP address of radius server 2"
++
++#~ msgid "Swap octets"
++#~ msgstr "Swap octets"
++
++#~ msgid ""
++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related "
++#~ "to RADIUS attribtues"
++#~ msgstr ""
++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related "
++#~ "to RADIUS attribtues"
++
++#~ msgid "Allow WPA guests"
++#~ msgstr "Allow WPA guests"
++
++#~ msgid ""
++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-"
++#~ "guests in RADIUS Access-Requests"
++#~ msgstr ""
++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-"
++#~ "guests in RADIUS Access-Requests"
++
++#~ msgid "Proxy client"
++#~ msgstr "Proxy client"
++
++#~ msgid ""
++#~ "IP address from which radius requests are accepted. If omitted the server "
++#~ "will not accept radius requests"
++#~ msgstr ""
++#~ "IP address from which radius requests are accepted. If omitted the server "
++#~ "will not accept radius requests"
++
++#~ msgid "Proxy listen address"
++#~ msgstr "Proxy listen address"
++
++#~ msgid "Local interface IP address to use for accepting radius requests"
++#~ msgstr "Local interface IP address to use for accepting radius requests"
++
++#~ msgid "Proxy port"
++#~ msgstr "Proxy port"
++
++#~ msgid "UDP Port to listen to for accepting radius requests"
++#~ msgstr "UDP Port to listen to for accepting radius requests"
++
++#~ msgid "Proxy secret"
++#~ msgstr "Proxy secret"
++
++#~ msgid "Radius shared secret for clients"
++#~ msgstr "Radius shared secret for clients"
++
++#~ msgid "UAM configuration"
++#~ msgstr "UAM configuration"
++
++#~ msgid "Unified Configuration Method settings"
++#~ msgstr "Unified Configuration Method settings"
++
++#~ msgid "Use Chilli XML"
++#~ msgstr "Use Chilli XML"
++
++#~ msgid "Return the so-called Chilli XML along with WISPr XML"
++#~ msgstr "Return the so-called Chilli XML along with WISPr XML"
++
++#~ msgid "Default idle timeout"
++#~ msgstr "Default idle timeout"
++
++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr "Default idle timeout unless otherwise set by RADIUS (defaults to 0)"
++
++#~ msgid "Default interim interval"
++#~ msgstr "Default interim interval"
++
++#~ msgid ""
++#~ "Default interim-interval for RADIUS accounting unless otherwise set by "
++#~ "RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Default interim-interval for RADIUS accounting unless otherwise set by "
++#~ "RADIUS (defaults to 0)"
++
++#~ msgid "Default session timeout"
++#~ msgstr "Default session timeout"
++
++#~ msgid ""
++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)"
++
++#~ msgid "Inspect DNS traffic"
++#~ msgstr "Inspect DNS traffic"
++
++#~ msgid ""
++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX "
++#~ "records to prevent dns tunnels (experimental)"
++#~ msgstr ""
++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX "
++#~ "records to prevent dns tunnels (experimental)"
++
++#~ msgid "Local users file"
++#~ msgstr "Local users file"
++
++#~ msgid ""
++#~ "A colon seperated file containing usernames and passwords of locally "
++#~ "authenticated users"
++#~ msgstr ""
++#~ "A colon seperated file containing usernames and passwords of locally "
++#~ "authenticated users"
++
++#~ msgid "Location name"
++#~ msgstr "Location name"
++
++#~ msgid "Human readable location name used in JSON interface"
++#~ msgstr "Human readable location name used in JSON interface"
++
++#~ msgid "Do not redirect to UAM server"
++#~ msgstr "Do not redirect to UAM server"
++
++#~ msgid ""
++#~ "Do not return to UAM server on login success, just redirect to original "
++#~ "URL"
++#~ msgstr ""
++#~ "Do not return to UAM server on login success, just redirect to original "
++#~ "URL"
++
++#~ msgid "Do not do WISPr"
++#~ msgstr "Do not do WISPr"
++
++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead"
++#~ msgstr "Do not do any WISPr XML, assume the back-end is doing this instead"
++
++#~ msgid "Post auth proxy"
++#~ msgstr "Post auth proxy"
++
++#~ msgid ""
++#~ "Used with postauthproxyport to define a post authentication HTTP proxy "
++#~ "server"
++#~ msgstr ""
++#~ "Used with postauthproxyport to define a post authentication HTTP proxy "
++#~ "server"
++
++#~ msgid "Post auth proxy port"
++#~ msgstr "Post auth proxy port"
++
++#~ msgid ""
++#~ "Used with postauthproxy to define a post authentication HTTP proxy server"
++#~ msgstr ""
++#~ "Used with postauthproxy to define a post authentication HTTP proxy server"
++
++#~ msgid "Allowed resources"
++#~ msgstr "Allowed resources"
++
++#~ msgid "List of resources the client can access without first authenticating"
++#~ msgstr ""
++#~ "List of resources the client can access without first authenticating"
++
++#~ msgid "Allow any DNS server"
++#~ msgstr "Allow any DNS server"
++
++#~ msgid "Allow any DNS server for unauthenticated clients"
++#~ msgstr "Allow any DNS server for unauthenticated clients"
++
++#~ msgid "Allow any IP address"
++#~ msgstr "Allow any IP address"
++
++#~ msgid ""
++#~ "Allow clients to use any IP settings they wish by spoofing ARP "
++#~ "(experimental)"
++#~ msgstr ""
++#~ "Allow clients to use any IP settings they wish by spoofing ARP "
++#~ "(experimental)"
++
++#~ msgid "Allowed domains"
++#~ msgstr "Allowed domains"
++
++#~ msgid ""
++#~ "Defines a list of domain names to automatically add to the walled garden"
++#~ msgstr ""
++#~ "Defines a list of domain names to automatically add to the walled garden"
++
++#~ msgid "UAM homepage"
++#~ msgstr "UAM homepage"
++
++#~ msgid "URL of homepage to redirect unauthenticated users to"
++#~ msgstr "URL of homepage to redirect unauthenticated users to"
++
++#~ msgid "UAM static content port"
++#~ msgstr "UAM static content port"
++
++#~ msgid "TCP port to bind to for only serving embedded content"
++#~ msgstr "TCP port to bind to for only serving embedded content"
++
++#~ msgid "UAM listening address"
++#~ msgstr "UAM listening address"
++
++#~ msgid "IP address to listen to for authentication of clients"
++#~ msgstr "IP address to listen to for authentication of clients"
++
++#~ msgid "UAM logout IP"
++#~ msgstr "UAM logout IP"
++
++#~ msgid ""
++#~ "Use this IP address to instantly logout a client accessing it (defaults "
++#~ "to 1.1.1.1)"
++#~ msgstr ""
++#~ "Use this IP address to instantly logout a client accessing it (defaults "
++#~ "to 1.1.1.1)"
++
++#~ msgid "UAM listening port"
++#~ msgstr "UAM listening port"
++
++#~ msgid "TCP port to bind to for authenticating clients (default 3990)"
++#~ msgstr "TCP port to bind to for authenticating clients (default 3990)"
++
++#~ msgid "UAM secret"
++#~ msgstr "UAM secret"
++
++#~ msgid "Shared secret between uamserver and chilli"
++#~ msgstr "Shared secret between uamserver and chilli"
++
++#~ msgid "UAM server"
++#~ msgstr "UAM server"
++
++#~ msgid "URL of web server to use for authenticating clients"
++#~ msgstr "URL of web server to use for authenticating clients"
++
++#~ msgid "UAM user interface"
++#~ msgstr "UAM user interface"
++
++#~ msgid ""
++#~ "An init.d style program to handle local content on the uamuiport web "
++#~ "server"
++#~ msgstr ""
++#~ "An init.d style program to handle local content on the uamuiport web "
++#~ "server"
++
++#~ msgid "Use status file"
++#~ msgstr "Use status file"
++
++#~ msgid ""
++#~ "Write the status of clients in a non-volatile state file (experimental)"
++#~ msgstr ""
++#~ "Write the status of clients in a non-volatile state file (experimental)"
++
++#~ msgid "WISPr login url"
++#~ msgstr "WISPr login url"
++
++#~ msgid "Specific URL to be given in WISPr XML LoginURL"
++#~ msgstr "Specific URL to be given in WISPr XML LoginURL"
++
++#~ msgid "CGI program"
++#~ msgstr "CGI program"
++
++#~ msgid ""
++#~ "Executable to run as a CGI type program (like haserl) for URLs with "
++#~ "extention .chi"
++#~ msgstr ""
++#~ "Executable to run as a CGI type program (like haserl) for URLs with "
++#~ "extention .chi"
++
++#~ msgid "Web content directory"
++#~ msgstr "Web content directory"
++
++#~ msgid "Directory where embedded local web content is placed"
++#~ msgstr "Directory where embedded local web content is placed"
++
++#~ msgid "MAC configuration"
++#~ msgstr "MAC configuration"
++
++#~ msgid "Configure MAC authentication"
++#~ msgstr "Configure MAC authentication"
++
++#~ msgid "Allowed MAC addresses"
++#~ msgstr "Allowed MAC addresses"
++
++#~ msgid "List of MAC addresses for which MAC authentication will be performed"
++#~ msgstr ""
++#~ "List of MAC addresses for which MAC authentication will be performed"
++
++#~ msgid "Authenticate locally allowed MACs"
++#~ msgstr "Authenticate locally allowed MACs"
++
++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS"
++#~ msgstr "Authenticate allowed MAC addresses without the use of RADIUS"
++
++#~ msgid "Enable MAC authentification"
++#~ msgstr "Enable MAC authentification"
++
++#~ msgid "Try to authenticate all users based on their mac address alone"
++#~ msgstr "Try to authenticate all users based on their mac address alone"
++
++#~ msgid "Password"
++#~ msgstr "Password"
++
++#~ msgid "Password used when performing MAC authentication"
++#~ msgstr "Password used when performing MAC authentication"
++
++#~ msgid "Suffix"
++#~ msgstr "Suffix"
++
++#~ msgid "coovachilli_macauth_macsuffix_desc"
++#~ msgstr ""
++#~ "Suffix to add to the MAC address in order to form the User-Name, which is "
++#~ "sent to the radius server"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/es/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/es/coovachilli.po
+new file mode 100644
+index 0000000..886da59
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/es/coovachilli.po
+@@ -0,0 +1,113 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-07-28 23:18+0200\n"
++"Last-Translator: Daniel <danips@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Configuración de Red"
++
++msgid "RADIUS configuration"
++msgstr "Configuración RADIUS"
++
++msgid "UAM and MAC Authentication"
++msgstr "Autenticación UAM y MAC"
++
++#~ msgid "General configuration"
++#~ msgstr "Configuración General"
++
++#~ msgid "General CoovaChilli settings"
++#~ msgstr "Configuración General de CoovaChilli"
++
++#~ msgid "Command socket"
++#~ msgstr "Socket de Comando"
++
++#~ msgid "UNIX socket used for communication with chilli_query"
++#~ msgstr "SocketUNIX utilizado para comunicación con chilli_query"
++
++#~ msgid "Config refresh interval"
++#~ msgstr "Configuración del intervalo de refresco "
++
++#~ msgid ""
++#~ "Re-read configuration file and do DNS lookups every interval seconds. "
++#~ "This has the same effect as sending the HUP signal. If interval is 0 "
++#~ "(zero) this feature is disabled. "
++#~ msgstr ""
++#~ "Vuelve a leer el fichero de configuracion y las consultas DNS cada "
++#~ "intervalo de segundos. Eso tiene el mismo efecto que enviar la señal HUP. "
++#~ "Si el intervalo es 0 (cero) se inhabilita la función."
++
++#~ msgid "Pid file"
++#~ msgstr "Fichero Pid"
++
++#~ msgid "Filename to put the process id"
++#~ msgstr "Nombre de archivo donde poner el ID del proceso"
++
++#~ msgid "State directory"
++#~ msgstr "Directorio de estado"
++
++#~ msgid "Directory of non-volatile data"
++#~ msgstr "Directorio de datos no volátiles"
++
++#~ msgid "TUN/TAP configuration"
++#~ msgstr "Configuración TUN / TAP"
++
++#~ msgid "Network/Tun configuration"
++#~ msgstr "Configuración de Red / Tun"
++
++#~ msgid ""
++#~ "Script executed after a session has moved from authorized state to "
++#~ "unauthorized"
++#~ msgstr ""
++#~ "Script ejecutado cuando el estado de una sesión es alterado de autorizado "
++#~ "a no autorizado"
++
++#~ msgid "Network up script"
++#~ msgstr "Script de subida de red"
++
++#~ msgid "Script executed after the tun network interface has been brought up"
++#~ msgstr ""
++#~ "Script ejecutado después de que la interfaz de red tun haya sido "
++#~ "levantado."
++
++#~ msgid "Primary DNS Server"
++#~ msgstr "Servidor DNS primario"
++
++#~ msgid "Secondary DNS Server"
++#~ msgstr "Servidor DNS secundario"
++
++#~ msgid "Domain name"
++#~ msgstr "Nombre de dominio"
++
++#~ msgid ""
++#~ "Is used to inform the client about the domain name to use for DNS lookups"
++#~ msgstr ""
++#~ "Se utiliza para informar al cliente sobre el nombre de dominio a utilizar "
++#~ "para las consultas DNS"
++
++#~ msgid "Dynamic IP address pool"
++#~ msgstr "Conjunto de direcciones IP Dinámicas"
++
++#~ msgid "Specifies a pool of dynamic IP addresses"
++#~ msgstr "Especifica un conjunto de direcciones IP Dinámicas"
++
++#~ msgid "IP down script"
++#~ msgstr "Scripts de bajada IP"
++
++#~ msgid "Script executed after the tun network interface has been taken down"
++#~ msgstr "Script ejecutado después de que la red de interfaz tun sea bajado"
++
++#~ msgid "IP up script"
++#~ msgstr "Script de subida IP"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/fr/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/fr/coovachilli.po
+new file mode 100644
+index 0000000..b95bb44
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/fr/coovachilli.po
+@@ -0,0 +1,26 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-11-06 13:16+0200\n"
++"Last-Translator: hogsim <hogsim@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Configuration Réseau"
++
++msgid "RADIUS configuration"
++msgstr "Configuration RADIUS"
++
++msgid "UAM and MAC Authentication"
++msgstr "Authentification UAM et MAC"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/he/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/he/coovachilli.po
+new file mode 100644
+index 0000000..04efb54
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/he/coovachilli.po
+@@ -0,0 +1,26 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-10 03:37+0200\n"
++"Last-Translator: Snoof <sagim9@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr ""
++
++msgid "Network Configuration"
++msgstr "תצורת רשת"
++
++msgid "RADIUS configuration"
++msgstr ""
++
++msgid "UAM and MAC Authentication"
++msgstr "×ימות UAM ן- MAC"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/hu/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/hu/coovachilli.po
+new file mode 100644
+index 0000000..5ac8278
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/hu/coovachilli.po
+@@ -0,0 +1,26 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-07-05 16:44+0200\n"
++"Last-Translator: Gyula <pro564@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Hálózati konfiguráció"
++
++msgid "RADIUS configuration"
++msgstr "RADIUS konfiguráció"
++
++msgid "UAM and MAC Authentication"
++msgstr "UAM és MAC azonosítás"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/it/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/it/coovachilli.po
+new file mode 100644
+index 0000000..dbf5b96
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/it/coovachilli.po
+@@ -0,0 +1,75 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2013-02-03 13:43+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Configurazione della Rete"
++
++msgid "RADIUS configuration"
++msgstr "Configurazione RAGGIO"
++
++msgid "UAM and MAC Authentication"
++msgstr "Autenticazione UAM e MAC"
++
++#~ msgid "General configuration"
++#~ msgstr "Configurazione generale"
++
++#~ msgid "General CoovaChilli settings"
++#~ msgstr "Impostazioni generali di CoovaChilli"
++
++#~ msgid "Command socket"
++#~ msgstr "Socket di comando"
++
++#~ msgid "UNIX socket used for communication with chilli_query"
++#~ msgstr "Socket UNIX usato per la comunicazione con chilli_query"
++
++#~ msgid "Config refresh interval"
++#~ msgstr "Intervallo di aggiornamento configurazione"
++
++#~ msgid ""
++#~ "Re-read configuration file and do DNS lookups every interval seconds. "
++#~ "This has the same effect as sending the HUP signal. If interval is 0 "
++#~ "(zero) this feature is disabled. "
++#~ msgstr ""
++#~ "Rilegge il file di configurazione ed esegue una ricerca DNS ogni "
++#~ "intervallo in secondi. Questo ha lo stesso risultato dell'invio del "
++#~ "segnale HUP. Se l'intervallo è 0 (zero) questa funzionalità è "
++#~ "disabilitata."
++
++#~ msgid "Pid file"
++#~ msgstr "File Pid"
++
++#~ msgid "TUN/TAP configuration"
++#~ msgstr "Configurazione TUN/TAP"
++
++#~ msgid "Network/Tun configuration"
++#~ msgstr "Configurazione Rete/TUN"
++
++#~ msgid "Primary DNS Server"
++#~ msgstr "Server DNS Primario"
++
++#~ msgid "Secondary DNS Server"
++#~ msgstr "Server DNS Secondario"
++
++#~ msgid "Domain name"
++#~ msgstr "Nome di dominio"
++
++#~ msgid "Specifies a pool of dynamic IP addresses"
++#~ msgstr "Specifica un pool di indirizzi IP dinamici"
++
++#~ msgid "Network address of the uplink interface (CIDR notation)"
++#~ msgstr "Indirizzo di rete dell'interfaccia di uplink (CIDR notazione)"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/ja/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/ja/coovachilli.po
+new file mode 100644
+index 0000000..9415712
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/ja/coovachilli.po
+@@ -0,0 +1,25 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid "CoovaChilli"
++msgstr ""
++
++msgid "Network Configuration"
++msgstr ""
++
++msgid "RADIUS configuration"
++msgstr ""
++
++msgid "UAM and MAC Authentication"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/ms/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/ms/coovachilli.po
+new file mode 100644
+index 0000000..d910ef2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/ms/coovachilli.po
+@@ -0,0 +1,22 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "CoovaChilli"
++msgstr ""
++
++msgid "Network Configuration"
++msgstr ""
++
++msgid "RADIUS configuration"
++msgstr ""
++
++msgid "UAM and MAC Authentication"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/no/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/no/coovachilli.po
+new file mode 100644
+index 0000000..f37afdd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/no/coovachilli.po
+@@ -0,0 +1,26 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-04-05 08:41+0200\n"
++"Last-Translator: protx <lars.hardy@gmail.com>\n"
++"Language-Team: none\n"
++"Language: no\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Nettverk Konfigurasjon"
++
++msgid "RADIUS configuration"
++msgstr "RADIUS Konfigurasjon"
++
++msgid "UAM and MAC Authentication"
++msgstr "UAM og MAC Autentisering"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/pl/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/pl/coovachilli.po
+new file mode 100644
+index 0000000..7dc2ef8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/pl/coovachilli.po
+@@ -0,0 +1,27 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-25 06:22+0200\n"
++"Last-Translator: obsy <cezary@eko.one.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Konfiguracja sieci"
++
++msgid "RADIUS configuration"
++msgstr "Konfiguracja RADIUS`a"
++
++msgid "UAM and MAC Authentication"
++msgstr "Uwierzytelnianie UAM oraz MAC"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/pt-br/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/pt-br/coovachilli.po
+new file mode 100644
+index 0000000..9c21981
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/pt-br/coovachilli.po
+@@ -0,0 +1,657 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2011-10-18 20:37+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Configuração de rede"
++
++msgid "RADIUS configuration"
++msgstr "Configuração de RADIUS"
++
++msgid "UAM and MAC Authentication"
++msgstr "Autenticação UAM e MAC"
++
++#~ msgid "General configuration"
++#~ msgstr "Configuração Geral"
++
++#~ msgid "General CoovaChilli settings"
++#~ msgstr "Definições gerais do CoovaChilli"
++
++#~ msgid "Command socket"
++#~ msgstr "Soquete de comando"
++
++#~ msgid "UNIX socket used for communication with chilli_query"
++#~ msgstr "Soquete UNIX para comunicação com chilli_query"
++
++#~ msgid "Config refresh interval"
++#~ msgstr "Intervalo de atualização da configuração"
++
++#~ msgid ""
++#~ "Re-read configuration file and do DNS lookups every interval seconds. "
++#~ "This has the same effect as sending the HUP signal. If interval is 0 "
++#~ "(zero) this feature is disabled. "
++#~ msgstr ""
++#~ "Reler o arquivo de configuração e faça a busca DNS a cada intervalo de "
++#~ "segundos. Isto tem o mesmo efeito que o envio do sinal HUP. Se o "
++#~ "intervalo for 0, (zero) esta funcionalidade será desativada."
++
++#~ msgid "Pid file"
++#~ msgstr "Arquivo de PID"
++
++#~ msgid "Filename to put the process id"
++#~ msgstr "Nome do arquivo onde será armazenado o PID"
++
++#~ msgid "State directory"
++#~ msgstr "Diretório de estado"
++
++#~ msgid "Directory of non-volatile data"
++#~ msgstr "Diretório para dados não-voláteis"
++
++#~ msgid "TUN/TAP configuration"
++#~ msgstr "Configuração TUN/TAP"
++
++#~ msgid "Network/Tun configuration"
++#~ msgstr "Configuração de Rede/Tun"
++
++#~ msgid "Network down script"
++#~ msgstr "Script de descida de rede"
++
++#~ msgid ""
++#~ "Script executed after a session has moved from authorized state to "
++#~ "unauthorized"
++#~ msgstr ""
++#~ "Script executado após o estado de uma sessão ser alterado de autorizado "
++#~ "para não-autorizado"
++
++#~ msgid "Network up script"
++#~ msgstr "Script de subida da rede"
++
++#~ msgid "Script executed after the tun network interface has been brought up"
++#~ msgstr "Script executado após a interface tun de rede ter sido levantada"
++
++#~ msgid "Primary DNS Server"
++#~ msgstr "Servidor DNS primário"
++
++#~ msgid "Secondary DNS Server"
++#~ msgstr "Servidor DNS secundário"
++
++#~ msgid "Domain name"
++#~ msgstr "Domínio"
++
++#~ msgid ""
++#~ "Is used to inform the client about the domain name to use for DNS lookups"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o domínio a ser utilizado para "
++#~ "consultas DNS"
++
++#~ msgid "Dynamic IP address pool"
++#~ msgstr "Conjunto de endereços IP dinâmicos"
++
++#~ msgid "Specifies a pool of dynamic IP addresses"
++#~ msgstr "Especifica um conjunto de endereços IP dinâmicos"
++
++#~ msgid "IP down script"
++#~ msgstr "Script de descida da rede IP"
++
++#~ msgid "Script executed after the tun network interface has been taken down"
++#~ msgstr "Script executado após a rede da interface tun seja baixada"
++
++#~ msgid "IP up script"
++#~ msgstr "Script de subida da rede IP"
++
++#~ msgid ""
++#~ "Script executed after the TUN/TAP network interface has been brought up"
++#~ msgstr "Script executado após a rede da interface TUN/TAP seja levantadas"
++
++#~ msgid "Uplink subnet"
++#~ msgstr "Subrede do enlace superior (uplink)"
++
++#~ msgid "Network address of the uplink interface (CIDR notation)"
++#~ msgstr "Endereço de rede da interface do enlace superior (notação CIDR)"
++
++#~ msgid "Static IP address pool"
++#~ msgstr "Conjunto de endereços IP estáticos"
++
++#~ msgid "Specifies a pool of static IP addresses"
++#~ msgstr "Especifica um conjunto de endereços IP estáticos"
++
++#~ msgid "TUN/TAP device"
++#~ msgstr "Dispositivo TUN/TAP"
++
++#~ msgid "The specific device to use for the TUN/TAP interface"
++#~ msgstr "O dispositivo especificado para ser usado pela interface TUN/TAP"
++
++#~ msgid "TX queue length"
++#~ msgstr "Tamanho da fila de envio (TX)"
++
++#~ msgid "The TX queue length to set on the TUN/TAP interface"
++#~ msgstr "O tamanho da fila de envio (TX) para ser usado na interface TUN/TAP"
++
++#~ msgid "Use TAP device"
++#~ msgstr "Use dispositivo TAP"
++
++#~ msgid "Use the TAP interface instead of TUN"
++#~ msgstr "Use o dispositivo TAP ao invés de TUN"
++
++#~ msgid "DHCP configuration"
++#~ msgstr "Configuração do DHCP"
++
++#~ msgid "Set DHCP options for connecting clients"
++#~ msgstr "Ajusta as opções do DHCP para clientes a se conectarem"
++
++#~ msgid "DHCP end number"
++#~ msgstr "Número final do DHCP"
++
++#~ msgid "Where to stop assigning IP addresses (default 254)"
++#~ msgstr "Onde terminar a atribuição de endereços IP (padrão 254)"
++
++#~ msgid "DHCP interface"
++#~ msgstr "Interface DHCP"
++
++#~ msgid "Ethernet interface to listen to for the downlink interface"
++#~ msgstr "Interface Ethernet para escutar por conexões dos clientes"
++
++#~ msgid "Listen MAC address"
++#~ msgstr "Endereço MAC de escuta"
++
++#~ msgid ""
++#~ "MAC address to listen to. If not specified the MAC address of the "
++#~ "interface will be used"
++#~ msgstr ""
++#~ "Endereço MAC de escuta. Se não especificado, o endereço MAC da interface "
++#~ "será usado"
++
++#~ msgid "DHCP start number"
++#~ msgstr "Número inicial do DHCP"
++
++#~ msgid "Where to start assigning IP addresses (default 10)"
++#~ msgstr "A partir de onde iniciará a atribuição de endereços IP (padrão 10)"
++
++#~ msgid "Enable IEEE 802.1x"
++#~ msgstr "Habilite IEEE 802.1x"
++
++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests"
++#~ msgstr "Habilite autenticação IEEE 802.1x e escute por requisições EAP"
++
++#~ msgid "Leasetime"
++#~ msgstr "Tempo de atribuição"
++
++#~ msgid "Use a DHCP lease of seconds (default 600)"
++#~ msgstr "Use o tempo de atribuição do DHCP, em segundos (padrão 600)"
++
++#~ msgid "Allow session update through RADIUS"
++#~ msgstr "Permite a atualização da sessão através do RADIUS"
++
++#~ msgid ""
++#~ "Allow updating of session parameters with RADIUS attributes sent in "
++#~ "Accounting-Response"
++#~ msgstr ""
++#~ "Permite a atualização dos parâmetros da sessão com atributos RADIUS "
++#~ "enviados na Contabilidade-Resposta"
++
++#~ msgid "Admin password"
++#~ msgstr "Senha do Administrador"
++
++#~ msgid ""
++#~ "Password to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr ""
++#~ "Senha para a autenticação do usuário administrador para pegar as "
++#~ "configurações do chili e estabelecer uma sessão de dispositivo \"sistema\""
++
++#~ msgid "Admin user"
++#~ msgstr "Usuário administrador"
++
++#~ msgid ""
++#~ "User-name to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr ""
++#~ "Nome do usuário para a autenticação do usuário administrador para pegar "
++#~ "as configurações do chili e estabelecer uma sessão de dispositivo "
++#~ "\"sistema\""
++
++#~ msgid "Do not check disconnection requests"
++#~ msgstr "Não verifique as requisições de desconexão"
++
++#~ msgid "Do not check the source IP address of radius disconnect requests"
++#~ msgstr ""
++#~ "Não verifique o endereço IP de origem das requisições de desconexão do "
++#~ "radius"
++
++#~ msgid "RADIUS disconnect port"
++#~ msgstr "Porta de desconexão do RADIUS"
++
++#~ msgid "UDP port to listen to for accepting radius disconnect requests"
++#~ msgstr ""
++#~ "Porta UDP de escuta para aceitar requisições de desconexão do radius"
++
++#~ msgid "NAS IP"
++#~ msgstr "IP do NAS"
++
++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute"
++#~ msgstr "Valor para usar no atributo NAS-IP-Address do RADIUS"
++
++#~ msgid "NAS MAC"
++#~ msgstr "MAC do NAS"
++
++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute"
++#~ msgstr "Endereço MAC para usar no atributo Called-Station-ID do RADIUS"
++
++#~ msgid "Allow OpenID authentication"
++#~ msgstr "Permitir autenticação OpenID"
++
++#~ msgid ""
++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-"
++#~ "openidauth in RADIUS Access-Requests"
++#~ msgstr ""
++#~ "Permitir autenticação OpenID enviando ChilliSpot-Config=allow-openidauth "
++#~ "na Resquisição de Acesso do Radius"
++
++#~ msgid "RADIUS accounting port"
++#~ msgstr "Porta de contabilidade do RADIUS"
++
++#~ msgid ""
++#~ "The UDP port number to use for radius accounting requests (default 1813)"
++#~ msgstr ""
++#~ "O número da porta UDP para ser usada pela requisição de contabilização do "
++#~ "radius (padrão 1813)"
++
++#~ msgid "RADIUS authentication port"
++#~ msgstr "Porta de autenticação do RADIUS"
++
++#~ msgid ""
++#~ "The UDP port number to use for radius authentication requests (default "
++#~ "1812)"
++#~ msgstr ""
++#~ "O número da porta UDP para ser usada pela requisição de autenticação do "
++#~ "radius (padrão 1812)"
++
++#~ msgid "Option radiuscalled"
++#~ msgstr "Opção radiuscalled"
++
++#~ msgid "RADIUS listen address"
++#~ msgstr "Endereço de escuta do RADIUS"
++
++#~ msgid "Local interface IP address to use for the radius interface"
++#~ msgstr "Endereço IP da interface local para a interface radius"
++
++#~ msgid "RADIUS location ID"
++#~ msgstr "ID da localização do RADIUS"
++
++#~ msgid "WISPr Location ID"
++#~ msgstr "ID da Localização WISPr"
++
++#~ msgid "RADIUS location name"
++#~ msgstr "Nome da localização do RADIUS"
++
++#~ msgid "WISPr Location Name"
++#~ msgstr "Nome da localização WISPr"
++
++#~ msgid "NAS ID"
++#~ msgstr "ID do NAS"
++
++#~ msgid "Network access server identifier"
++#~ msgstr "Identificador do servidor de acesso à rede"
++
++#~ msgid "Option radiusnasip"
++#~ msgstr "Opção radiusnasip"
++
++#~ msgid "NAS port type"
++#~ msgstr "Tipo de porta NAS"
++
++#~ msgid ""
++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)"
++#~ msgstr ""
++#~ "Valor do atributo do NAS-Port-Type. O padrão é 19 (IEEE-802.11-Sem fio)"
++
++#~ msgid "Send RADIUS VSA"
++#~ msgstr "Enviar VSA do RADIUS"
++
++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request"
++#~ msgstr ""
++#~ "Enviar o ChilliSpot-OriginalURL do VSA do RADIUS na Requisição de Acesso"
++
++#~ msgid "RADIUS secret"
++#~ msgstr "Segredo do RADIUS"
++
++#~ msgid "Radius shared secret for both servers"
++#~ msgstr "Segredo compartilhado entre ambos os servidores Radius"
++
++#~ msgid "RADIUS server 1"
++#~ msgstr "Servidor 1 do RADIUS"
++
++#~ msgid "The IP address of radius server 1"
++#~ msgstr "Endereço IP do servidor 1 do radius"
++
++#~ msgid "RADIUS server 2"
++#~ msgstr "Servidor 2 do RADIUS"
++
++#~ msgid "The IP address of radius server 2"
++#~ msgstr "Endereço IP do servidor 2 do radius"
++
++#~ msgid "Swap octets"
++#~ msgstr "Troque octetos"
++
++#~ msgid ""
++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related "
++#~ "to RADIUS attribtues"
++#~ msgstr ""
++#~ "Troca o significado de \"octetos de entrada\" e \"octetos de saída\" como "
++#~ "está relatado nos atributos RADIUS"
++
++#~ msgid "Allow WPA guests"
++#~ msgstr "Permite convidados WPA"
++
++#~ msgid ""
++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-"
++#~ "guests in RADIUS Access-Requests"
++#~ msgstr ""
++#~ "Permite a autenticação de convidados WPA enviando ChilliSpot-Config=allow-"
++#~ "wpa-guests na Requisição de Acesso do RADIUS"
++
++#~ msgid "Proxy client"
++#~ msgstr "Cliente proxy"
++
++#~ msgid ""
++#~ "IP address from which radius requests are accepted. If omitted the server "
++#~ "will not accept radius requests"
++#~ msgstr ""
++#~ "Endereço IP do qual as requisições radius serão aceitas. Se omitido, o "
++#~ "servidor não vai aceitar requisições radius"
++
++#~ msgid "Proxy listen address"
++#~ msgstr "Endereço de escuta do proxy"
++
++#~ msgid "Local interface IP address to use for accepting radius requests"
++#~ msgstr ""
++#~ "Endereço IP da interface local usado para aceitar as requisições radius"
++
++#~ msgid "Proxy port"
++#~ msgstr "Porta do Proxy"
++
++#~ msgid "UDP Port to listen to for accepting radius requests"
++#~ msgstr "Porta UDP para aceitar requisições radius"
++
++#~ msgid "Proxy secret"
++#~ msgstr "Segredo do Proxy"
++
++#~ msgid "Radius shared secret for clients"
++#~ msgstr "Segredo compartilhado do Radius para clientes"
++
++#~ msgid "UAM configuration"
++#~ msgstr "Configuração UAM"
++
++#~ msgid "Unified Configuration Method settings"
++#~ msgstr "Configurações do Método de Configuração Unificado"
++
++#~ msgid "Use Chilli XML"
++#~ msgstr "Use XML do Chilli"
++
++#~ msgid "Return the so-called Chilli XML along with WISPr XML"
++#~ msgstr "Retorna o famoso XML do Chili juntamente com o XML do WISPr"
++
++#~ msgid "Default idle timeout"
++#~ msgstr "Estouro de tempo de ociosidade padrão"
++
++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Estouro de tempo de ociosidade padrão, a não ser que seja definido pelo "
++#~ "RADIUS (padrão é 0)"
++
++#~ msgid "Default interim interval"
++#~ msgstr "Intervalo padrão como interino"
++
++#~ msgid ""
++#~ "Default interim-interval for RADIUS accounting unless otherwise set by "
++#~ "RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Intervalo padrão como interino para a contabilidade do RADIUS, a não ser "
++#~ "que seja definido pelo RADIUS (padrão é 0)"
++
++#~ msgid "Default session timeout"
++#~ msgstr "Estouro de tempo padrão da sessão"
++
++#~ msgid ""
++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Estouro de tempo padrão da sessão, a não ser que seja definido pelo "
++#~ "RADIUS (padrão é 0)"
++
++#~ msgid "Inspect DNS traffic"
++#~ msgstr "Inspeciona tráfego DNS"
++
++#~ msgid ""
++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX "
++#~ "records to prevent dns tunnels (experimental)"
++#~ msgstr ""
++#~ "Inspeciona os pacotes DNS e descarta respostas para qualquer registro que "
++#~ "não seja A, CNAME, SOA ou MX. Isto evita túneis pelo DNS (experimental)"
++
++#~ msgid "Local users file"
++#~ msgstr "Arquivo de usuários locais"
++
++#~ msgid ""
++#~ "A colon seperated file containing usernames and passwords of locally "
++#~ "authenticated users"
++#~ msgstr ""
++#~ "Um arquivo separado por dois pontos (:) contendo o nome de usuário e "
++#~ "senhas para usuários autenticados localmente"
++
++#~ msgid "Location name"
++#~ msgstr "Nome da localização"
++
++#~ msgid "Human readable location name used in JSON interface"
++#~ msgstr "Nome da localização legível usado na interface JSON"
++
++#~ msgid "Do not redirect to UAM server"
++#~ msgstr "Não redirecionar para servidor UAM"
++
++#~ msgid ""
++#~ "Do not return to UAM server on login success, just redirect to original "
++#~ "URL"
++#~ msgstr ""
++#~ "Não redirecione para o servidor UAM quando o login for bem sucedido. "
++#~ "Somente redirecione para a URL original"
++
++#~ msgid "Do not do WISPr"
++#~ msgstr "Não faça WISPr"
++
++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead"
++#~ msgstr ""
++#~ "Não faça qualquer XML do WISPr. Ao invés disto, assuma que o servidor "
++#~ "está fazendo isto"
++
++#~ msgid "Post auth proxy"
++#~ msgstr "Proxy após a autenticação"
++
++#~ msgid ""
++#~ "Used with postauthproxyport to define a post authentication HTTP proxy "
++#~ "server"
++#~ msgstr ""
++#~ "Usado em conjunto com postauthproxyport para definir um servidor PROXY "
++#~ "HTTP após a autenticação"
++
++#~ msgid "Post auth proxy port"
++#~ msgstr "Porta do proxy após a autenticação"
++
++#~ msgid ""
++#~ "Used with postauthproxy to define a post authentication HTTP proxy server"
++#~ msgstr ""
++#~ "Usado em conjunto com postauthproxyport para definir um servidor PROXY "
++#~ "HTTP após a autenticação"
++
++#~ msgid "Allowed resources"
++#~ msgstr "Recursos permitidos"
++
++#~ msgid "List of resources the client can access without first authenticating"
++#~ msgstr ""
++#~ "Lista de recursos que o cliente pode acessar sem antes se autenticar"
++
++#~ msgid "Allow any DNS server"
++#~ msgstr "Permitir qualquer Servidor DNS"
++
++#~ msgid "Allow any DNS server for unauthenticated clients"
++#~ msgstr "Permitir qualquer servidor DNS para clientes não autenticados"
++
++#~ msgid "Allow any IP address"
++#~ msgstr "Permitir qualquer endereço IP"
++
++#~ msgid ""
++#~ "Allow clients to use any IP settings they wish by spoofing ARP "
++#~ "(experimental)"
++#~ msgstr ""
++#~ "Permitir que clientes usem qualquer configuração de IP desejada usando a "
++#~ "técnica de falsificação de APR (experimental)"
++
++#~ msgid "Allowed domains"
++#~ msgstr "Domínios permitidos"
++
++#~ msgid ""
++#~ "Defines a list of domain names to automatically add to the walled garden"
++#~ msgstr ""
++#~ "Define uma lista de domínios automaticamente adicionados para acesso da "
++#~ "zona controlada"
++
++#~ msgid "UAM homepage"
++#~ msgstr "Página do UAM"
++
++#~ msgid "URL of homepage to redirect unauthenticated users to"
++#~ msgstr "URL da página para onde redirecionar os usuários não autenticados"
++
++#~ msgid "UAM static content port"
++#~ msgstr "Porta de conteúdo estático do UAM"
++
++#~ msgid "TCP port to bind to for only serving embedded content"
++#~ msgstr "Porta TCP para somente servidor conteúdo embutido"
++
++#~ msgid "UAM listening address"
++#~ msgstr "Endereço de escuta do UAM"
++
++#~ msgid "IP address to listen to for authentication of clients"
++#~ msgstr "Endereço IP para escutar pela autenticação dos clientes"
++
++#~ msgid "UAM logout IP"
++#~ msgstr "IP de desautenticação do UAM"
++
++#~ msgid ""
++#~ "Use this IP address to instantly logout a client accessing it (defaults "
++#~ "to 1.1.1.1)"
++#~ msgstr ""
++#~ "Use este endereço IP para instantaneamente desautenticar um cliente que a "
++#~ "acessar (padrão é 1.1.1.1)"
++
++#~ msgid "UAM listening port"
++#~ msgstr "Porta de escuta do UAM"
++
++#~ msgid "TCP port to bind to for authenticating clients (default 3990)"
++#~ msgstr "Porta de escuta do UAM para autenticar clientes (padrão é 3990)"
++
++#~ msgid "UAM secret"
++#~ msgstr "Segredo do UAM"
++
++#~ msgid "Shared secret between uamserver and chilli"
++#~ msgstr "Segredo compatilhado entre o servidor UAM e o chilli"
++
++#~ msgid "UAM server"
++#~ msgstr "Servidor UAM"
++
++#~ msgid "URL of web server to use for authenticating clients"
++#~ msgstr "URL do servidor web usado para autenticar os clientes"
++
++#~ msgid "UAM user interface"
++#~ msgstr "Interface do usuário do UAM"
++
++#~ msgid ""
++#~ "An init.d style program to handle local content on the uamuiport web "
++#~ "server"
++#~ msgstr ""
++#~ "Um programa estilo init.d para tratar o conteúdo local no servidor web "
++#~ "uamuiport"
++
++#~ msgid "Use status file"
++#~ msgstr "Usar o arquivo de estado"
++
++#~ msgid ""
++#~ "Write the status of clients in a non-volatile state file (experimental)"
++#~ msgstr ""
++#~ "Escreva o estado dos clientes em um arquivo de estado não volátil "
++#~ "(experimental)"
++
++#~ msgid "WISPr login url"
++#~ msgstr "URL de login do WISPr"
++
++#~ msgid "Specific URL to be given in WISPr XML LoginURL"
++#~ msgstr "Especifica a URL para ser dada no LoginURL do XML do WISPr"
++
++#~ msgid "CGI program"
++#~ msgstr "Programa CGI"
++
++#~ msgid ""
++#~ "Executable to run as a CGI type program (like haserl) for URLs with "
++#~ "extention .chi"
++#~ msgstr ""
++#~ "Executável para rodar como um programa do tipo CGI (como o haserl) para "
++#~ "URLs com a extensão .chi"
++
++#~ msgid "Web content directory"
++#~ msgstr "Diretório de conteúdo Web"
++
++#~ msgid "Directory where embedded local web content is placed"
++#~ msgstr "Diretório onde o conteúdo web local embutido fica localizado"
++
++#~ msgid "MAC configuration"
++#~ msgstr "Configuração do MAC"
++
++#~ msgid "Configure MAC authentication"
++#~ msgstr "Configurar a autenticação MAC"
++
++#~ msgid "Allowed MAC addresses"
++#~ msgstr "Endereços MAC permitidos"
++
++#~ msgid "List of MAC addresses for which MAC authentication will be performed"
++#~ msgstr ""
++#~ "Lista dos endereços MAC permitidos para os quais a autenticação MAC será "
++#~ "realizada"
++
++#~ msgid "Authenticate locally allowed MACs"
++#~ msgstr "Autenticar MACs autorizados localmente"
++
++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS"
++#~ msgstr "Autenticar os endereços MAC autorizados sem usar o RADIUS"
++
++#~ msgid "Enable MAC authentification"
++#~ msgstr "Habilita a autenticação MAC"
++
++#~ msgid "Try to authenticate all users based on their mac address alone"
++#~ msgstr ""
++#~ "Tente autenticar todos os usuários baseados somente no seu endereço MAC"
++
++#~ msgid "Password"
++#~ msgstr "Senha"
++
++#~ msgid "Password used when performing MAC authentication"
++#~ msgstr "Senha usada para realizar a autenticação MAC"
++
++#~ msgid "Suffix"
++#~ msgstr "Sufixo"
++
++#~ msgid ""
++#~ "Suffix to add to the MAC address in order to form the User-Name, which is "
++#~ "sent to the radius server"
++#~ msgstr ""
++#~ "Sufixo para adicionar ao endereço MAC que forma o nome do usuário, o qual "
++#~ "é enviado ao servidor radius"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/pt/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/pt/coovachilli.po
+new file mode 100644
+index 0000000..115ae03
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/pt/coovachilli.po
+@@ -0,0 +1,372 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-05-01 00:43+0200\n"
++"Last-Translator: pedromrgoncalves <pedromrgoncalves@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Configuração da Rede"
++
++msgid "RADIUS configuration"
++msgstr "Configuração RADIUS"
++
++msgid "UAM and MAC Authentication"
++msgstr "Autenticação UAM e MAC"
++
++#~ msgid "General configuration"
++#~ msgstr "Configuração Geral"
++
++#~ msgid "General CoovaChilli settings"
++#~ msgstr "Definições gerais do CoovaChilli"
++
++#~ msgid "Command socket"
++#~ msgstr "Socket de comando"
++
++#~ msgid "UNIX socket used for communication with chilli_query"
++#~ msgstr "Socket UNIX para comunicação com chilli_query"
++
++#~ msgid "Config refresh interval"
++#~ msgstr "Intervalo de refrescamento da configuração"
++
++#~ msgid ""
++#~ "Re-read configuration file and do DNS lookups every interval seconds. "
++#~ "This has the same effect as sending the HUP signal. If interval is 0 "
++#~ "(zero) this feature is disabled. "
++#~ msgstr ""
++#~ "Reler o ficheiro de configuração e executar verificações DNS n segundos "
++#~ "de intervalo. Tem o mesmo efeito que o envio do sinal HUP. Se o intervalo "
++#~ "for 0 (zero) esta funcionalidade será desactivada."
++
++#~ msgid "Pid file"
++#~ msgstr "Ficheiro PID"
++
++#~ msgid "Filename to put the process id"
++#~ msgstr "Nome do ficheiro onde será guardado o PID"
++
++#~ msgid "State directory"
++#~ msgstr "Directorio de estado"
++
++#~ msgid "Directory of non-volatile data"
++#~ msgstr "Directorio para dados não-volateis"
++
++#~ msgid "TUN/TAP configuration"
++#~ msgstr "Configuração tun/tap"
++
++#~ msgid "Network/Tun configuration"
++#~ msgstr "Configuração de rede/tun"
++
++#~ msgid "Network down script"
++#~ msgstr "Script de rede/tun em baixo"
++
++#~ msgid ""
++#~ "Script executed after a session has moved from authorized state to "
++#~ "unauthorized"
++#~ msgstr ""
++#~ "Script executado após o estado de uma sessão ser alterado de autorizado "
++#~ "para não-autorizado "
++
++#~ msgid "Network up script"
++#~ msgstr "Script de rede/tun em cima"
++
++#~ msgid "Script executed after the tun network interface has been brought up"
++#~ msgstr "Script executado apos o interface tun de rede ter sido levantado"
++
++#~ msgid "Primary DNS Server"
++#~ msgstr "Servidor primário de DNS"
++
++#~ msgid "Secondary DNS Server"
++#~ msgstr "Servidor secundário de DNS"
++
++#~ msgid "Domain name"
++#~ msgstr "Domínio"
++
++#~ msgid ""
++#~ "Is used to inform the client about the domain name to use for DNS lookups"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "Dynamic IP address pool"
++#~ msgstr "Servidor primário de DNS"
++
++#, fuzzy
++#~ msgid "Specifies a pool of dynamic IP addresses"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o endereço de servidor DNS a usar "
++#~ "para a resolução de nomes"
++
++#, fuzzy
++#~ msgid "IP down script"
++#~ msgstr "Script de rede/tun em baixo"
++
++#, fuzzy
++#~ msgid "Script executed after the tun network interface has been taken down"
++#~ msgstr ""
++#~ "Script executado após o estado de uma sessão ser alterado de autorizado "
++#~ "para não-autorizado "
++
++#, fuzzy
++#~ msgid "IP up script"
++#~ msgstr "Script de rede/tun em cima"
++
++#, fuzzy
++#~ msgid ""
++#~ "Script executed after the TUN/TAP network interface has been brought up"
++#~ msgstr "Script executado apos o interface tun de rede ter sido levantado"
++
++#, fuzzy
++#~ msgid "Uplink subnet"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "Network address of the uplink interface (CIDR notation)"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o endereço de servidor DNS a usar "
++#~ "para a resolução de nomes"
++
++#, fuzzy
++#~ msgid "Static IP address pool"
++#~ msgstr "Script de rede/tun em cima"
++
++#, fuzzy
++#~ msgid "Specifies a pool of static IP addresses"
++#~ msgstr "Script executado apos o interface tun de rede ter sido levantado"
++
++#, fuzzy
++#~ msgid "TUN/TAP device"
++#~ msgstr "Script de rede/tun em baixo"
++
++#, fuzzy
++#~ msgid "The specific device to use for the TUN/TAP interface"
++#~ msgstr ""
++#~ "Script executado após o estado de uma sessão ser alterado de autorizado "
++#~ "para não-autorizado "
++
++#, fuzzy
++#~ msgid "TX queue length"
++#~ msgstr "Domínio"
++
++#, fuzzy
++#~ msgid "The TX queue length to set on the TUN/TAP interface"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "Use TAP device"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "Use the TAP interface instead of TUN"
++#~ msgstr "Script executado apos o interface tun de rede ter sido levantado"
++
++#, fuzzy
++#~ msgid "DHCP configuration"
++#~ msgstr "Configuração tun/tap"
++
++#, fuzzy
++#~ msgid "Set DHCP options for connecting clients"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "DHCP end number"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "DHCP interface"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "Ethernet interface to listen to for the downlink interface"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "Listen MAC address"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "Leasetime"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "Use a DHCP lease of seconds (default 600)"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "Admin user"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "NAS IP"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "NAS MAC"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "Allow WPA guests"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "UAM configuration"
++#~ msgstr "Configuração tun/tap"
++
++#, fuzzy
++#~ msgid "Unified Configuration Method settings"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "List of resources the client can access without first authenticating"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "Allow any DNS server"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "Allow any DNS server for unauthenticated clients"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "Allow any IP address"
++#~ msgstr "Domínio"
++
++#, fuzzy
++#~ msgid ""
++#~ "Allow clients to use any IP settings they wish by spoofing ARP "
++#~ "(experimental)"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "Allowed domains"
++#~ msgstr "Domínio"
++
++#, fuzzy
++#~ msgid ""
++#~ "Defines a list of domain names to automatically add to the walled garden"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "UAM homepage"
++#~ msgstr "Domínio"
++
++#, fuzzy
++#~ msgid "URL of homepage to redirect unauthenticated users to"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "UAM static content port"
++#~ msgstr "Domínio"
++
++#, fuzzy
++#~ msgid "TCP port to bind to for only serving embedded content"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "UAM listening address"
++#~ msgstr "Domínio"
++
++#, fuzzy
++#~ msgid "IP address to listen to for authentication of clients"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "UAM logout IP"
++#~ msgstr "Domínio"
++
++#, fuzzy
++#~ msgid ""
++#~ "Use this IP address to instantly logout a client accessing it (defaults "
++#~ "to 1.1.1.1)"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "UAM listening port"
++#~ msgstr "Domínio"
++
++#, fuzzy
++#~ msgid "TCP port to bind to for authenticating clients (default 3990)"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "UAM secret"
++#~ msgstr "Domínio"
++
++#, fuzzy
++#~ msgid "Shared secret between uamserver and chilli"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "UAM server"
++#~ msgstr "Domínio"
++
++#, fuzzy
++#~ msgid "URL of web server to use for authenticating clients"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "UAM user interface"
++#~ msgstr "Domínio"
++
++#, fuzzy
++#~ msgid ""
++#~ "An init.d style program to handle local content on the uamuiport web "
++#~ "server"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid ""
++#~ "Executable to run as a CGI type program (like haserl) for URLs with "
++#~ "extention .chi"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "Directory where embedded local web content is placed"
++#~ msgstr ""
++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS"
++
++#, fuzzy
++#~ msgid "MAC configuration"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "Configure MAC authentication"
++#~ msgstr "Configuração de rede/tun"
++
++#, fuzzy
++#~ msgid "Try to authenticate all users based on their mac address alone"
++#~ msgstr "Configuração de rede/tun"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/ro/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/ro/coovachilli.po
+new file mode 100644
+index 0000000..8f458bb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/ro/coovachilli.po
+@@ -0,0 +1,27 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-28 19:15+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Configurare reţea"
++
++msgid "RADIUS configuration"
++msgstr "Configurare RADIUS"
++
++msgid "UAM and MAC Authentication"
++msgstr "Autentificare UAM ÅŸi MAC"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/ru/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/ru/coovachilli.po
+new file mode 100644
+index 0000000..379ff7e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/ru/coovachilli.po
+@@ -0,0 +1,560 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: coovachilli\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-08-15 11:29+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñети"
++
++msgid "RADIUS configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ RADIUS"
++
++msgid "UAM and MAC Authentication"
++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ UAM и MAC"
++
++#~ msgid "General configuration"
++#~ msgstr "Общие наÑтройки"
++
++#~ msgid "General CoovaChilli settings"
++#~ msgstr "Общие наÑтройки CoovaChilli"
++
++#~ msgid "Command socket"
++#~ msgstr "Сокет команд"
++
++#~ msgid "UNIX socket used for communication with chilli_query"
++#~ msgstr "UNIX Ñокет Ð´Ð»Ñ ÑвÑзи Ñ chilli_query"
++
++#~ msgid "Config refresh interval"
++#~ msgstr "Интервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸"
++
++#~ msgid ""
++#~ "Re-read configuration file and do DNS lookups every interval seconds. "
++#~ "This has the same effect as sending the HUP signal. If interval is 0 "
++#~ "(zero) this feature is disabled. "
++#~ msgstr ""
++#~ "Считывание файла конфигурации и запуÑк DNS поиÑка раз в указанный "
++#~ "интервал. ДоÑтигаетÑÑ Ñ‚Ð¾Ñ‚ же Ñффект что и при отÑылке HUP Ñигнала. "
++#~ "Значение интервала выражено в Ñекундах. Ð’ Ñлучае ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ "
++#~ "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ð°, Ð´Ð°Ð½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑтановитÑÑ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð¹."
++
++#~ msgid "Pid file"
++#~ msgstr "Pid файл"
++
++#~ msgid "Filename to put the process id"
++#~ msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, который будет Ñодержать идентификатор процеÑÑа (PID)"
++
++#~ msgid "State directory"
++#~ msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ ÑоÑтоÑниÑ"
++
++#~ msgid "TUN/TAP configuration"
++#~ msgstr "TUN/TAP конфигурациÑ"
++
++#~ msgid "Network down script"
++#~ msgstr "Скрипт Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñети"
++
++#~ msgid "Network up script"
++#~ msgstr "Скрипт Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñети"
++
++#~ msgid "Primary DNS Server"
++#~ msgstr "Первичный DNS Ñервер"
++
++#~ msgid "Secondary DNS Server"
++#~ msgstr "Вторичный DNS Ñервер"
++
++#~ msgid "Domain name"
++#~ msgstr "Доменное имÑ"
++
++#~ msgid ""
++#~ "Is used to inform the client about the domain name to use for DNS lookups"
++#~ msgstr "ИÑпользуетÑÑ, чтобы Ñообщить клиенту Ð¸Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° при DNS поиÑках"
++
++#~ msgid "Dynamic IP address pool"
++#~ msgstr "Диапазон динамичеÑких IP адреÑов"
++
++#~ msgid "Specifies a pool of dynamic IP addresses"
++#~ msgstr "ОпределÑет диапазон динамичеÑких IP адреÑов"
++
++#~ msgid "IP down script"
++#~ msgstr "Скрипт ÑброÑа IP-адреÑа"
++
++#~ msgid "IP up script"
++#~ msgstr "Скрипт уÑтановки IP-адреÑа"
++
++#~ msgid ""
++#~ "Script executed after the TUN/TAP network interface has been brought up"
++#~ msgstr "Скрипт, выполнÑемый поÑле Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñетевого интерфейÑа TUN/TAP"
++
++#~ msgid "Uplink subnet"
++#~ msgstr "ПодÑеть uplink'а"
++
++#~ msgid "Network address of the uplink interface (CIDR notation)"
++#~ msgstr "Сетевой Ð°Ð´Ñ€ÐµÑ uplink-интерфейÑа (в нотации CIDR)"
++
++#~ msgid "Static IP address pool"
++#~ msgstr "Диапазон ÑтатичеÑких IP адреÑов"
++
++#~ msgid "Specifies a pool of static IP addresses"
++#~ msgstr "ОпределÑет диапазон ÑтатичеÑких IP адреÑов"
++
++#~ msgid "TUN/TAP device"
++#~ msgstr "TUN/TAP уÑтройÑтво"
++
++#~ msgid "The specific device to use for the TUN/TAP interface"
++#~ msgstr "УÑтройÑтво Ð´Ð»Ñ TUN/TAP интерфейÑа"
++
++#~ msgid "TX queue length"
++#~ msgstr "Длина очереди TX"
++
++#~ msgid "The TX queue length to set on the TUN/TAP interface"
++#~ msgstr "Длина TX очереди TUN/TAP интерфейÑа"
++
++#~ msgid "Use TAP device"
++#~ msgstr "ИÑпользовать уÑтройÑтво TAP"
++
++#~ msgid "Use the TAP interface instead of TUN"
++#~ msgstr "ИÑпользовать Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ TAP вмеÑто TUN"
++
++#~ msgid "DHCP configuration"
++#~ msgstr "ÐаÑтройки DHCP"
++
++#~ msgid "Set DHCP options for connecting clients"
++#~ msgstr "УÑтановите параметры DHCP Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð²"
++
++#~ msgid "DHCP end number"
++#~ msgstr "Конечное значение DHCP"
++
++#~ msgid "DHCP interface"
++#~ msgstr "DHCP интерфейÑ"
++
++#~ msgid "Ethernet interface to listen to for the downlink interface"
++#~ msgstr "Ethernet Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑÐ»ÑƒÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ downlink-интерфеÑа"
++
++#~ msgid "Listen MAC address"
++#~ msgstr "ПроÑлушиваемые MAC адреÑа"
++
++#~ msgid "DHCP start number"
++#~ msgstr "Ðачальное значение DHCP"
++
++#~ msgid "Where to start assigning IP addresses (default 10)"
++#~ msgstr "Ðачать приÑÐ²Ð¾ÐµÐ½Ð¸Ñ IP-адреÑов Ñ (по умолчанию 10)"
++
++#~ msgid "Enable IEEE 802.1x"
++#~ msgstr "Включить IEEE 802.1x"
++
++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests"
++#~ msgstr "Включить IEEE 802.1x аутентификацию и обработку запроÑов EAP"
++
++#~ msgid "Leasetime"
++#~ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð°Ñ€ÐµÐ½Ð´Ñ‹"
++
++#~ msgid "Use a DHCP lease of seconds (default 600)"
++#~ msgstr "ИÑпользовать DHCP аренду заданное Ð²Ñ€ÐµÐ¼Ñ (Ñекунды, 600 по умолчанию)"
++
++#~ msgid "Allow session update through RADIUS"
++#~ msgstr "Разрешить обновление ÑеÑÑии через RADIUS"
++
++#~ msgid ""
++#~ "Allow updating of session parameters with RADIUS attributes sent in "
++#~ "Accounting-Response"
++#~ msgstr ""
++#~ "Разрешить обновление параметров ÑеÑÑии иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ RADIUS атрибуты "
++#~ "поÑланные через Accounting-Response"
++
++#~ msgid "Admin password"
++#~ msgstr "Пароль админиÑтратора"
++
++#~ msgid ""
++#~ "Password to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr ""
++#~ "Пароль админиÑтратора Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ "
++#~ "наÑтроек chilli Ñ Ñозданием \"ÑиÑтемной\" ÑеÑÑии уÑтройÑтва"
++
++#~ msgid "Admin user"
++#~ msgstr "ÐдминиÑтратор"
++
++#~ msgid ""
++#~ "User-name to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr ""
++#~ "Ð˜Ð¼Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратора Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек "
++#~ "chilli Ñ Ñозданием \"ÑиÑтемной\" ÑеÑÑии уÑтройÑтва"
++
++#~ msgid "Do not check disconnection requests"
++#~ msgstr "Ðе проверÑÑ‚ÑŒ запроÑÑ‹ на разъединение"
++
++#~ msgid "Do not check the source IP address of radius disconnect requests"
++#~ msgstr "Ðе проверÑÑ‚ÑŒ IP-Ð°Ð´Ñ€ÐµÑ Ð·Ð°Ð¿Ñ€Ð¾Ñов Ñ€Ð°Ð·ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ radius"
++
++#~ msgid "RADIUS disconnect port"
++#~ msgstr "Порт Ñ€Ð°Ð·ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ RADIUS"
++
++#~ msgid "UDP port to listen to for accepting radius disconnect requests"
++#~ msgstr "UDP порт Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов Ñ€Ð°Ð·ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ RADIUS"
++
++#~ msgid "NAS IP"
++#~ msgstr "IP-Ð°Ð´Ñ€ÐµÑ NAS"
++
++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute"
++#~ msgstr "Значение RADIUS NAS-IP-Address атрибута"
++
++#~ msgid "NAS MAC"
++#~ msgstr "MAC Ð°Ð´Ñ€ÐµÑ NAS"
++
++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute"
++#~ msgstr "Значение MAC адреÑа RADIUS Called-Station-ID атрибута"
++
++#~ msgid "Allow OpenID authentication"
++#~ msgstr "Разрешить OpenID аутентификацию"
++
++#~ msgid ""
++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-"
++#~ "openidauth in RADIUS Access-Requests"
++#~ msgstr ""
++#~ "Разрешает аутентификацию OpenID, поÑÑ‹Ð»Ð°Ñ ChilliSpot-Config=allow-"
++#~ "openidauth в запроÑах доÑтупа RADIUS."
++
++#~ msgid "RADIUS accounting port"
++#~ msgstr "Порт RADIUS Accounting"
++
++#~ msgid ""
++#~ "The UDP port number to use for radius accounting requests (default 1813)"
++#~ msgstr "Порт UDP Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов RADIUS Accounting (1813 по умолчанию)"
++
++#~ msgid "RADIUS authentication port"
++#~ msgstr "Порт аутентификации RADIUS"
++
++#~ msgid ""
++#~ "The UDP port number to use for radius authentication requests (default "
++#~ "1812)"
++#~ msgstr "UDP порт Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов аутентификации radius (1812 по умолчанию)"
++
++#~ msgid "RADIUS listen address"
++#~ msgstr "Слушающий Ð°Ð´Ñ€ÐµÑ RADIUS"
++
++#~ msgid "Local interface IP address to use for the radius interface"
++#~ msgstr "IP Ð°Ð´Ñ€ÐµÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ интерфейÑа Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа radius"
++
++#~ msgid "RADIUS location ID"
++#~ msgstr "Идентификатор раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ RADIUS"
++
++#~ msgid "WISPr Location ID"
++#~ msgstr "Идентификатор раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WISPr"
++
++#~ msgid "RADIUS location name"
++#~ msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ RADIUS"
++
++#~ msgid "WISPr Location Name"
++#~ msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WISPr"
++
++#~ msgid "NAS ID"
++#~ msgstr "Идентификатор NAS"
++
++#~ msgid "Network access server identifier"
++#~ msgstr "Идентификатор Ñервера доÑтупа к Ñети (NAS)"
++
++#~ msgid "Option radiusnasip"
++#~ msgstr "ÐžÐ¿Ñ†Ð¸Ñ radiusnasip"
++
++#~ msgid "NAS port type"
++#~ msgstr "Тип порта NAS"
++
++#~ msgid ""
++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)"
++#~ msgstr "Значение аттрибута NAS-Port-Type. По умолчанию 19 (IEEE-802.11)"
++
++#~ msgid "Send RADIUS VSA"
++#~ msgstr "ОтÑылать RADIUS VSA"
++
++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request"
++#~ msgstr "ОтÑылать ChilliSpot-OriginalURL RADIUS VSA в запроÑах доÑтупа"
++
++#~ msgid "RADIUS secret"
++#~ msgstr "Секрет RADIUS"
++
++#~ msgid "Radius shared secret for both servers"
++#~ msgstr "Общий Ñекрет RADIUS Ð´Ð»Ñ Ð¾Ð±Ð¾Ð¸Ñ… Ñерверов"
++
++#~ msgid "RADIUS server 1"
++#~ msgstr "RADIUS Ñервер 1"
++
++#~ msgid "The IP address of radius server 1"
++#~ msgstr "IP Ð°Ð´Ñ€ÐµÑ RADIUS Ñервера 1"
++
++#~ msgid "RADIUS server 2"
++#~ msgstr "RADIUS Ñервер 2"
++
++#~ msgid "The IP address of radius server 2"
++#~ msgstr "IP Ð°Ð´Ñ€ÐµÑ RADIUS Ñервера 2"
++
++#~ msgid "Swap octets"
++#~ msgstr "ПереÑтавлÑÑ‚ÑŒ октеты"
++
++#~ msgid ""
++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related "
++#~ "to RADIUS attribtues"
++#~ msgstr "МенÑÑ‚ÑŒ меÑтами Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"входной октет\" и \"выходной октет\""
++
++#~ msgid "Allow WPA guests"
++#~ msgstr "Разрешить гоÑтевой WPA вход"
++
++#~ msgid ""
++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-"
++#~ "guests in RADIUS Access-Requests"
++#~ msgstr ""
++#~ "Разрешает гÑтевую WPA аутентификацию, отÑÑ‹Ð»Ð°Ñ ChilliSpot-Config=allow-wpa-"
++#~ "guests в запроÑах доÑтупа RADIUS"
++
++#~ msgid "Proxy client"
++#~ msgstr "Клиент прокÑи"
++
++#~ msgid ""
++#~ "IP address from which radius requests are accepted. If omitted the server "
++#~ "will not accept radius requests"
++#~ msgstr ""
++#~ "IP Ð°Ð´Ñ€ÐµÑ Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ запроÑÑ‹ radius принимаютÑÑ. ЕÑли не указан, то Ñервер "
++#~ "не будет принимать запроÑÑ‹ radius"
++
++#~ msgid "Local interface IP address to use for accepting radius requests"
++#~ msgstr "IP Ð°Ð´Ñ€ÐµÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ интерфейÑа Ð´Ð»Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð° запроÑов radius"
++
++#~ msgid "Proxy port"
++#~ msgstr "Порт прокÑи"
++
++#~ msgid "UDP Port to listen to for accepting radius requests"
++#~ msgstr "Порт UDP Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов RADIUS"
++
++#~ msgid "Proxy secret"
++#~ msgstr "Секрет прокÑи"
++
++#~ msgid "Radius shared secret for clients"
++#~ msgstr "Общий RADIUS Ñекрет Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð²"
++
++#~ msgid "UAM configuration"
++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ UAM"
++
++#~ msgid "Unified Configuration Method settings"
++#~ msgstr "ÐаÑтройки UAM"
++
++#~ msgid "Use Chilli XML"
++#~ msgstr "ИÑпользовать Chilli XML"
++
++#~ msgid "Return the so-called Chilli XML along with WISPr XML"
++#~ msgstr "Возвращать так называемый Chilli XML вмеÑте Ñ WISPr XML"
++
++#~ msgid "Default idle timeout"
++#~ msgstr "Таймаут Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию"
++
++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Таймаут Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию еÑли не уÑтановлен RADIUS'ом (0 по "
++#~ "умолчанию)"
++
++#~ msgid "Default session timeout"
++#~ msgstr "Таймаут ÑеÑÑии (значение по умолчанию)"
++
++#~ msgid ""
++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Таймаут ÑеÑÑии по умолчанию еÑли не уÑтановлено RADIUS'ом (0 по умолчанию)"
++
++#~ msgid "Inspect DNS traffic"
++#~ msgstr "ИнÑпектировать траффик DNS"
++
++#~ msgid ""
++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX "
++#~ "records to prevent dns tunnels (experimental)"
++#~ msgstr ""
++#~ "ПроверÑÑ‚ÑŒ DNS пакеты и отбраÑывать ответы без A, CNAME, SOA, или MX "
++#~ "запиÑей Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ DNS туннелей (ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„-циÑ)."
++
++#~ msgid "Local users file"
++#~ msgstr "Локальный файл пользователей"
++
++#~ msgid ""
++#~ "A colon seperated file containing usernames and passwords of locally "
++#~ "authenticated users"
++#~ msgstr ""
++#~ "Файл, Ñодержащий логины и пароли локально авторизованных пользователей "
++#~ "(запиÑи разделены двоеточием)"
++
++#~ msgid "Location name"
++#~ msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑположениÑ"
++
++#~ msgid "Human readable location name used in JSON interface"
++#~ msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑположениÑ, иÑпользуемой в интерфейÑе JSON"
++
++#~ msgid "Do not redirect to UAM server"
++#~ msgstr "Ðе перенаправлÑÑ‚ÑŒ на Ñервер UAM"
++
++#~ msgid ""
++#~ "Do not return to UAM server on login success, just redirect to original "
++#~ "URL"
++#~ msgstr ""
++#~ "Ðе возвращатьÑÑ Ð½Ð° UAM Ñервер при удачном входе, перенаправить на "
++#~ "иÑходный URL"
++
++#~ msgid "Do not do WISPr"
++#~ msgstr "Ðе выполнÑÑ‚ÑŒ WISPr"
++
++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead"
++#~ msgstr "Ðе выполнÑÑ‚ÑŒ WISPr XML, Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ð»Ð°Ð³Ð°Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ðµ в бÑкенд'е"
++
++#~ msgid "Post auth proxy"
++#~ msgstr "ПрокÑи поÑÑ‚-аутентификации"
++
++#~ msgid ""
++#~ "Used with postauthproxyport to define a post authentication HTTP proxy "
++#~ "server"
++#~ msgstr ""
++#~ "ИÑпользуетÑÑ Ñ Ð¿Ð¾Ñ€Ñ‚Ð¾Ð¼ прокÑи поÑÑ‚-аутентификации Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ HTTP "
++#~ "прокÑи-Ñервера аутентификации"
++
++#~ msgid "Post auth proxy port"
++#~ msgstr "Порт прокÑи поÑÑ‚-аутентификации"
++
++#~ msgid ""
++#~ "Used with postauthproxy to define a post authentication HTTP proxy server"
++#~ msgstr ""
++#~ "ИпользуетÑÑ Ñ Ð¿Ñ€Ð¾ÐºÑи поÑÑ‚-аутентификации Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ HTTP прокÑи-"
++#~ "Ñервера поÑÑ‚-аутентификации"
++
++#~ msgid "Allowed resources"
++#~ msgstr "Разрешенные реÑурÑÑ‹"
++
++#~ msgid "List of resources the client can access without first authenticating"
++#~ msgstr ""
++#~ "СпиÑок реÑурÑов к которым клиент может получить доÑтуп без "
++#~ "предварительной аутентификации"
++
++#~ msgid "Allow any DNS server"
++#~ msgstr "Разрешить любой DNS Ñервер"
++
++#~ msgid "Allow any DNS server for unauthenticated clients"
++#~ msgstr "Разрешить любой DNS Ñервер Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² не прошедших аутентификацию"
++
++#~ msgid "Allow any IP address"
++#~ msgstr "Разрешить любой IP-адреÑ"
++
++#~ msgid ""
++#~ "Allow clients to use any IP settings they wish by spoofing ARP "
++#~ "(experimental)"
++#~ msgstr ""
++#~ "Разрешить клиентам иÑпользовать любые наÑтройки IP за Ñчет \"Ñпуфинга\" "
++#~ "ARP (ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„-циÑ)"
++
++#~ msgid "Allowed domains"
++#~ msgstr "Разрешенные домены"
++
++#~ msgid "UAM homepage"
++#~ msgstr "ДомашнÑÑ Ñтраница UAM"
++
++#~ msgid "URL of homepage to redirect unauthenticated users to"
++#~ msgstr ""
++#~ "URL домашней Ñтраницы Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ не прошедших "
++#~ "аутентификацию"
++
++#~ msgid "UAM static content port"
++#~ msgstr "Порт UAM ÑтатичеÑкого контента"
++
++#~ msgid "UAM listening address"
++#~ msgstr "Слашающий Ð°Ð´Ñ€ÐµÑ UAM"
++
++#~ msgid "IP address to listen to for authentication of clients"
++#~ msgstr "IP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð° аутентификации клиентов"
++
++#~ msgid "UAM logout IP"
++#~ msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð²Ñ‹Ñ…Ð¾Ð´Ð° UAM"
++
++#~ msgid "UAM listening port"
++#~ msgstr "Слушающий порт UAM"
++
++#~ msgid "UAM secret"
++#~ msgstr "Секрет UAM"
++
++#~ msgid "Shared secret between uamserver and chilli"
++#~ msgstr "Общий Ñекрет Ð´Ð»Ñ Ñервера UAM и Chilli"
++
++#~ msgid "UAM server"
++#~ msgstr "Сервер UAM"
++
++#~ msgid "URL of web server to use for authenticating clients"
++#~ msgstr "URL или веб-Ñервер Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ клиентов"
++
++#~ msgid "UAM user interface"
++#~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ UAM"
++
++#~ msgid "Use status file"
++#~ msgstr "ИÑпользовать ÑтатуÑ-файл"
++
++#~ msgid "WISPr login url"
++#~ msgstr "URL входа WISPr"
++
++#~ msgid "Specific URL to be given in WISPr XML LoginURL"
++#~ msgstr "ОÑобый URL в WISPr XML LoginURL"
++
++#~ msgid "CGI program"
++#~ msgstr "Программа GCI"
++
++#~ msgid "Web content directory"
++#~ msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Web-контента"
++
++#~ msgid "Directory where embedded local web content is placed"
++#~ msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ ÐºÑƒÐ´Ð° будет помещен вÑтроенный Web-контент"
++
++#~ msgid "MAC configuration"
++#~ msgstr "ÐаÑтройка MAC"
++
++#~ msgid "Configure MAC authentication"
++#~ msgstr "ÐаÑтройка аутентификации по MAC адреÑу"
++
++#~ msgid "Allowed MAC addresses"
++#~ msgstr "Разрешенные MAC адреÑа"
++
++#~ msgid "List of MAC addresses for which MAC authentication will be performed"
++#~ msgstr "СпиÑок MAC адреÑов Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… будет производитьÑÑ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ"
++
++#~ msgid "Authenticate locally allowed MACs"
++#~ msgstr "Ðутентифицировать локально разрешенные MAC адреÑа"
++
++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS"
++#~ msgstr "Ðутентифицировать разрешенные MAC адреÑа без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ RADIUS"
++
++#~ msgid "Enable MAC authentification"
++#~ msgstr "Разрешить MAC аутентификацию"
++
++#~ msgid "Try to authenticate all users based on their mac address alone"
++#~ msgstr ""
++#~ "Пробовать аутентификацию вÑех пользователей только на оÑнове их MAC "
++#~ "адреÑов"
++
++#~ msgid "Password"
++#~ msgstr "Пароль"
++
++#~ msgid "Password used when performing MAC authentication"
++#~ msgstr "Пароль Ð´Ð»Ñ MAC аутентификации"
++
++#~ msgid "Suffix"
++#~ msgstr "СуффикÑ"
++
++#~ msgid ""
++#~ "Suffix to add to the MAC address in order to form the User-Name, which is "
++#~ "sent to the radius server"
++#~ msgstr ""
++#~ "СуффикÑ, добавлÑемый в MAC адреÑ, Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ пользователÑ, "
++#~ "которое поÑылаетÑÑ radius Ñерверу"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/sk/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/sk/coovachilli.po
+new file mode 100644
+index 0000000..bb5b1b9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/sk/coovachilli.po
+@@ -0,0 +1,21 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "CoovaChilli"
++msgstr ""
++
++msgid "Network Configuration"
++msgstr ""
++
++msgid "RADIUS configuration"
++msgstr ""
++
++msgid "UAM and MAC Authentication"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/sv/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/sv/coovachilli.po
+new file mode 100644
+index 0000000..8695ce5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/sv/coovachilli.po
+@@ -0,0 +1,24 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-04-28 06:16+0200\n"
++"Last-Translator: Umeaboy <kristoffer.grundstrom1983@gmail.com>\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChili"
++
++msgid "Network Configuration"
++msgstr "Nätverkskonfiguration"
++
++msgid "RADIUS configuration"
++msgstr "RADIUS-konfiguration"
++
++msgid "UAM and MAC Authentication"
++msgstr "UAM och MAC-autensiering"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/templates/coovachilli.pot b/feeds/luci/applications/luci-app-coovachilli/po/templates/coovachilli.pot
+new file mode 100644
+index 0000000..c1a2bed
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/templates/coovachilli.pot
+@@ -0,0 +1,14 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "CoovaChilli"
++msgstr ""
++
++msgid "Network Configuration"
++msgstr ""
++
++msgid "RADIUS configuration"
++msgstr ""
++
++msgid "UAM and MAC Authentication"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/tr/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/tr/coovachilli.po
+new file mode 100644
+index 0000000..b70a840
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/tr/coovachilli.po
+@@ -0,0 +1,26 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-10-11 23:09+0200\n"
++"Last-Translator: vincenzo <tayfun_ozturk@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: tr\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: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "Network Yapılandırması"
++
++msgid "RADIUS configuration"
++msgstr "Radius Yapılandırması"
++
++msgid "UAM and MAC Authentication"
++msgstr "UAM ve MAC Kimlik Doğrulaması"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/uk/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/uk/coovachilli.po
+new file mode 100644
+index 0000000..07ffc55
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/uk/coovachilli.po
+@@ -0,0 +1,27 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-12-29 13:00+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ–"
++
++msgid "RADIUS configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ RADIUS"
++
++msgid "UAM and MAC Authentication"
++msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ‡ÐµÑ€ÐµÐ· UAM Ñ– MAC"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/vi/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/vi/coovachilli.po
+new file mode 100644
+index 0000000..66abf0d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/vi/coovachilli.po
+@@ -0,0 +1,607 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:59+0200\n"
++"PO-Revision-Date: 2009-08-16 07:05+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli"
++
++msgid "Network Configuration"
++msgstr ""
++
++msgid "RADIUS configuration"
++msgstr ""
++
++msgid "UAM and MAC Authentication"
++msgstr ""
++
++#~ msgid "General configuration"
++#~ msgstr "Cấu hình tổng quát"
++
++#~ msgid "General CoovaChilli settings"
++#~ msgstr "Các cài đặt CoovaChilli tổng quát"
++
++#~ msgid "Command socket"
++#~ msgstr "Command socket"
++
++#~ msgid "UNIX socket used for communication with chilli_query"
++#~ msgstr "UNIX socket dùng để giao tiếp với chilli_query"
++
++#~ msgid "Config refresh interval"
++#~ msgstr "Config refresh interval"
++
++#~ msgid ""
++#~ "Re-read configuration file and do DNS lookups every interval seconds. "
++#~ "This has the same effect as sending the HUP signal. If interval is 0 "
++#~ "(zero) this feature is disabled. "
++#~ msgstr ""
++#~ "Äá»c lại tập tin cấu hình và tra cưứ DNS má»—i giây. Cái này có ảnh hưởng "
++#~ "giống như đang gửi một tín hiệu HUP. Nếu interval là 0, tính năng này sẽ "
++#~ "bị vô hiệu hóa. <span class=\"translation-space\"> </span> "
++
++#~ msgid "Pid file"
++#~ msgstr "Tập tin Pid"
++
++#~ msgid "Filename to put the process id"
++#~ msgstr "Tên tập tin để đặt làm ID xử lý"
++
++#~ msgid "State directory"
++#~ msgstr "Dạnh bạ vùng"
++
++#~ msgid "Directory of non-volatile data"
++#~ msgstr "Thư mục của những dữ liệu cố định"
++
++#~ msgid "TUN/TAP configuration"
++#~ msgstr "Cấu hình TUN/TAP"
++
++#~ msgid "Network/Tun configuration"
++#~ msgstr "Mạng lưới/ Cấu hình TUN"
++
++#~ msgid "Network down script"
++#~ msgstr "Network down script"
++
++#~ msgid ""
++#~ "Script executed after a session has moved from authorized state to "
++#~ "unauthorized"
++#~ msgstr ""
++#~ "Script đã thá»±c hiện sau khi má»™t section đã di chuyển từ nÆ¡i có thẩm quyá»n "
++#~ "đến nơi không"
++
++#~ msgid "Network up script"
++#~ msgstr "Network up script"
++
++#~ msgid "Script executed after the tun network interface has been brought up"
++#~ msgstr "Script thi hành sau khi giao diện mạng tun được đưa lên"
++
++#~ msgid "Primary DNS Server"
++#~ msgstr "Primary DNS Server"
++
++#~ msgid "Secondary DNS Server"
++#~ msgstr "Secondary DNS Server"
++
++#~ msgid "Domain name"
++#~ msgstr "Tên miá»n"
++
++#~ msgid ""
++#~ "Is used to inform the client about the domain name to use for DNS lookups"
++#~ msgstr ""
++#~ "Äược sá»­ dụng để thông báo cho khách hàng vá» tên miá»n để dùng cho các tra "
++#~ "cứu DNS"
++
++#~ msgid "Dynamic IP address pool"
++#~ msgstr "Dynamic IP address pool"
++
++#~ msgid "Specifies a pool of dynamic IP addresses"
++#~ msgstr "Chỉ định một pool of dynamic IP addresses"
++
++#~ msgid "IP down script"
++#~ msgstr "IP down script"
++
++#~ msgid "Script executed after the tun network interface has been taken down"
++#~ msgstr "Script thực hiện sau khi giao diện mạng tun bị lấy xuống"
++
++#~ msgid "IP up script"
++#~ msgstr "IP up script"
++
++#~ msgid ""
++#~ "Script executed after the TUN/TAP network interface has been brought up"
++#~ msgstr "Script thực hiện sau khi giao diện mạng TUN/TAP đã được đưa lên"
++
++#~ msgid "Uplink subnet"
++#~ msgstr "Uplink subnet"
++
++#~ msgid "Network address of the uplink interface (CIDR notation)"
++#~ msgstr "Äịa chỉ mạng của giao diện uplink (CIDR chú thích)"
++
++#~ msgid "Static IP address pool"
++#~ msgstr "Static IP address pool"
++
++#~ msgid "Specifies a pool of static IP addresses"
++#~ msgstr "Chỉ định một pool of static IP addresses"
++
++#~ msgid "TUN/TAP device"
++#~ msgstr "TUN/TAP device"
++
++#~ msgid "The specific device to use for the TUN/TAP interface"
++#~ msgstr "Thiết bị cụ thể để dùng cho giao diện TUN/TAP"
++
++#~ msgid "TX queue length"
++#~ msgstr "Äá»™ dài của TX queue"
++
++#~ msgid "The TX queue length to set on the TUN/TAP interface"
++#~ msgstr "Äá»™ dài TX queue để đặt trên giao diện TUN/TAP "
++
++#~ msgid "Use TAP device"
++#~ msgstr "Dùng dụng cụ TAP"
++
++#~ msgid "Use the TAP interface instead of TUN"
++#~ msgstr "Dùng giao diện TAP thay cho TUN"
++
++#~ msgid "DHCP configuration"
++#~ msgstr "Cấu hình DHCP"
++
++#~ msgid "Set DHCP options for connecting clients"
++#~ msgstr "Äặt lá»±a chá»n DHCP cho đối tượng kết nối"
++
++#~ msgid "DHCP end number"
++#~ msgstr "Số cuối DHCP"
++
++#~ msgid "Where to stop assigning IP addresses (default 254)"
++#~ msgstr "Chỗ để stop những gán IP (mặc định 254)"
++
++#~ msgid "DHCP interface"
++#~ msgstr "Giao diện DHCP"
++
++#~ msgid "Ethernet interface to listen to for the downlink interface"
++#~ msgstr "Giao diện Ethernet để listen cho những giao diện downlink "
++
++#~ msgid "Listen MAC address"
++#~ msgstr "Nghe địa chỉ MAC"
++
++#~ msgid ""
++#~ "MAC address to listen to. If not specified the MAC address of the "
++#~ "interface will be used"
++#~ msgstr ""
++#~ "Äịa chỉ MAC để nghe. Nếu địa chỉ MAC chỉ định của giao diện sẽ được sá»­ "
++#~ "dụng "
++
++#~ msgid "DHCP start number"
++#~ msgstr "Số DHCP bắt đầu "
++
++#~ msgid "Where to start assigning IP addresses (default 10)"
++#~ msgstr "Chỗ để bắt đầu gán địa chỉ IP (mặc định 10)"
++
++#~ msgid "Enable IEEE 802.1x"
++#~ msgstr "Kích hoạt IEEE 802.1x"
++
++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests"
++#~ msgstr "Kích hoạt quá trình xác thực IEEE 802.1x và lắng nghe yêu cầu EAP"
++
++#~ msgid "Leasetime"
++#~ msgstr "Leasetime"
++
++#~ msgid "Use a DHCP lease of seconds (default 600)"
++#~ msgstr "Dùng một DHCP lease ở giây (600)"
++
++#~ msgid "Allow session update through RADIUS"
++#~ msgstr "Cho phép phiên cập nhật thông qua RADIUS"
++
++#~ msgid ""
++#~ "Allow updating of session parameters with RADIUS attributes sent in "
++#~ "Accounting-Response"
++#~ msgstr ""
++#~ "Cho phép phiên cập nhật tham số phiên với RADIUS được gửi trong "
++#~ "Accounting-Response"
++
++#~ msgid "Admin password"
++#~ msgstr "Mật mã quản trị "
++
++#~ msgid ""
++#~ "Password to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr ""
++#~ "Mật mã dùng để xác thực chế độ quản trị để pick up cấu hình chilli và "
++#~ "thành lập một công cụ &amp;quot;system&amp;quot; session"
++
++#~ msgid "Admin user"
++#~ msgstr "NgÆ°á»i quản trị "
++
++#~ msgid ""
++#~ "User-name to use for Administrative-User authentication in order to pick "
++#~ "up chilli configurations and establish a device \"system\" session"
++#~ msgstr ""
++#~ "User name dùng để xác thực chế độ quản trị để pick up cấu hình chilli và "
++#~ "thành lập một công cụ &amp;quot;system&amp;quot; session"
++
++#~ msgid "Do not check disconnection requests"
++#~ msgstr "Không kiểm tra yêu cầu ngừng kết nối"
++
++#~ msgid "Do not check the source IP address of radius disconnect requests"
++#~ msgstr ""
++#~ "Không tên kiểm tra nguồn địa chỉ IP trong bán kính yêu cầu ngừng kết nối"
++
++#~ msgid "RADIUS disconnect port"
++#~ msgstr "Cửa ngừng kết nối RADIUS"
++
++#~ msgid "UDP port to listen to for accepting radius disconnect requests"
++#~ msgstr "Cửa UDP để nghe khi chấp nhận một yêu cầu ngừng kết nối"
++
++#~ msgid "NAS IP"
++#~ msgstr "NAS IP "
++
++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute"
++#~ msgstr "Giá trị để dùng trong RADIUS NAS-IP-Address attribute"
++
++#~ msgid "NAS MAC"
++#~ msgstr "NAS MAC"
++
++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute"
++#~ msgstr ""
++#~ "Giá trị địa chỉ MAC để dùng trong RADIUS Called-Station-ID attribute"
++
++#~ msgid "Allow OpenID authentication"
++#~ msgstr "Cho phép xác thực OpenID "
++
++#~ msgid ""
++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-"
++#~ "openidauth in RADIUS Access-Requests"
++#~ msgstr ""
++#~ "Cho phép xác thực OpenID bằng cách gửi ChilliSpot-Config=allow-openidauth "
++#~ "in RADIUS Access-Requests"
++
++#~ msgid "RADIUS accounting port"
++#~ msgstr "Cổng RADIUS accounting"
++
++#~ msgid ""
++#~ "The UDP port number to use for radius accounting requests (default 1813)"
++#~ msgstr "Số của cổng UDP dùng cho yêu cầu radius accounting (mặcđịnh 1813)"
++
++#~ msgid "RADIUS authentication port"
++#~ msgstr "Cổng xác thực RADIUS"
++
++#~ msgid ""
++#~ "The UDP port number to use for radius authentication requests (default "
++#~ "1812)"
++#~ msgstr "Số của cổng UDP để yêu cầu xác thực radius (default 1812)"
++
++#~ msgid "Option radiuscalled"
++#~ msgstr "Tùy chá»n radiuscalled"
++
++#~ msgid "RADIUS listen address"
++#~ msgstr "Äịa chỉ nghe RADIUS"
++
++#~ msgid "Local interface IP address to use for the radius interface"
++#~ msgstr "Äịa chỉ IP giao diện địa phÆ°Æ¡ng để dùng cho giao diện radius"
++
++#~ msgid "RADIUS location ID"
++#~ msgstr "RADIUS vị tri ID"
++
++#~ msgid "WISPr Location ID"
++#~ msgstr "WISPr vị trí ID"
++
++#~ msgid "RADIUS location name"
++#~ msgstr "Tên vị trí RADIUS"
++
++#~ msgid "WISPr Location Name"
++#~ msgstr "Tên vị trí WISPr"
++
++#~ msgid "NAS ID"
++#~ msgstr "NAS ID"
++
++#~ msgid "Network access server identifier"
++#~ msgstr "Network truy cập server identifier"
++
++#~ msgid "Option radiusnasip"
++#~ msgstr "Lá»±a chá»n radiusnasip"
++
++#~ msgid "NAS port type"
++#~ msgstr "Loại cổng NAS"
++
++#~ msgid ""
++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)"
++#~ msgstr ""
++#~ "Giá trị của NAS-Port-Type attribute. Mặc định tới 19 (Wireless-"
++#~ "IEEE-802.11)"
++
++#~ msgid "Send RADIUS VSA"
++#~ msgstr "Gá»­i RADIUS VSA"
++
++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request"
++#~ msgstr "Gửi ChilliSpot-OriginalURL RADIUS VSA trong yêu cầu truy cập"
++
++#~ msgid "RADIUS secret"
++#~ msgstr "RADIUS bí mật"
++
++#~ msgid "Radius shared secret for both servers"
++#~ msgstr "Radius chia sẻ bí mật cho cả 2 servers"
++
++#~ msgid "RADIUS server 1"
++#~ msgstr "RADIUS server 1"
++
++#~ msgid "The IP address of radius server 1"
++#~ msgstr "Äịa chỉ IP của radius server 1"
++
++#~ msgid "RADIUS server 2"
++#~ msgstr "RADIUS server 2"
++
++#~ msgid "The IP address of radius server 2"
++#~ msgstr "Äịa chỉ IP của radius server 2"
++
++#~ msgid "Swap octets"
++#~ msgstr "Swap octets"
++
++#~ msgid ""
++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related "
++#~ "to RADIUS attribtues"
++#~ msgstr ""
++#~ "Hoán ý nghĩa của &amp;quot;input octets&amp;quot; và &amp;quot;output "
++#~ "octets&amp;quot; khi nó liên quan tới RADIUS attribtues"
++
++#~ msgid "Allow WPA guests"
++#~ msgstr "Cho phép WPA guests"
++
++#~ msgid ""
++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-"
++#~ "guests in RADIUS Access-Requests"
++#~ msgstr ""
++#~ "Cho phép xác thực WPA Guest bằng cách gửi ChilliSpot-Config=allow-wpa-"
++#~ "guests trong RADIUS yêu cầu truy cập"
++
++#~ msgid "Proxy client"
++#~ msgstr "Proxy client"
++
++#~ msgid ""
++#~ "IP address from which radius requests are accepted. If omitted the server "
++#~ "will not accept radius requests"
++#~ msgstr ""
++#~ "Äịa chỉ IP mà yêu cầu radius được chấp nhận. Nếu bá» qua server sẽ không "
++#~ "chấp nhận yêu cầu radius."
++
++#~ msgid "Proxy listen address"
++#~ msgstr "Proxy listen address"
++
++#~ msgid "Local interface IP address to use for accepting radius requests"
++#~ msgstr "Äịa chỉ giao diện IP địa phÆ°Æ¡ng dùng để chấp nhận yêu cầu radius"
++
++#~ msgid "Proxy port"
++#~ msgstr "Proxy port"
++
++#~ msgid "UDP Port to listen to for accepting radius requests"
++#~ msgstr "Cổng UDP để listen để chấp nhận yêu cầu radius"
++
++#~ msgid "Proxy secret"
++#~ msgstr "Proxy bí mật"
++
++#~ msgid "Radius shared secret for clients"
++#~ msgstr "Radius chia sẻ bí mật cho các client"
++
++#~ msgid "UAM configuration"
++#~ msgstr "Cấu hình UAM"
++
++#~ msgid "Unified Configuration Method settings"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#~ msgid "Use Chilli XML"
++#~ msgstr "Dùng Chilli XML"
++
++#~ msgid "Return the so-called Chilli XML along with WISPr XML"
++#~ msgstr "Trở vá» cái gá»i là Chilli XML cùng vá»›i WISPr XML"
++
++#~ msgid "Default idle timeout"
++#~ msgstr "Mặc định idle timeout"
++
++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr "Mặc định idle timeout trừ khi đặt bởi RADIUS (mặc định tới 0)"
++
++#~ msgid "Default interim interval"
++#~ msgstr "Mặc định interim interval"
++
++#~ msgid ""
++#~ "Default interim-interval for RADIUS accounting unless otherwise set by "
++#~ "RADIUS (defaults to 0)"
++#~ msgstr ""
++#~ "Mặc định interim-interval cho RADIUS accounting trừ khi đặt bởi RADIUS "
++#~ "(defaults tá»›i 0)"
++
++#~ msgid "Default session timeout"
++#~ msgstr "Mặc định session timeout"
++
++#~ msgid ""
++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)"
++#~ msgstr "Mặc định session timeout trừ khi đặt bởi RADIUS (mặc định tới 0)"
++
++#~ msgid "Inspect DNS traffic"
++#~ msgstr "Kiểm tra lưu thông DNS"
++
++#, fuzzy
++#~ msgid "Do not redirect to UAM server"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid ""
++#~ "Do not return to UAM server on login success, just redirect to original "
++#~ "URL"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "Do not do WISPr"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "List of resources the client can access without first authenticating"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "Allow any DNS server"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "Allow any DNS server for unauthenticated clients"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "Allow any IP address"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid ""
++#~ "Allow clients to use any IP settings they wish by spoofing ARP "
++#~ "(experimental)"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "Allowed domains"
++#~ msgstr "Tên miá»n"
++
++#, fuzzy
++#~ msgid ""
++#~ "Defines a list of domain names to automatically add to the walled garden"
++#~ msgstr ""
++#~ "Äược sá»­ dụng để thông báo cho khách hàng vá» tên miá»n để dùng cho các tra "
++#~ "cứu DNS"
++
++#, fuzzy
++#~ msgid "UAM homepage"
++#~ msgstr "Tên miá»n"
++
++#, fuzzy
++#~ msgid "URL of homepage to redirect unauthenticated users to"
++#~ msgstr ""
++#~ "Äược sá»­ dụng để thông báo cho khách hàng vá» tên miá»n để dùng cho các tra "
++#~ "cứu DNS"
++
++#, fuzzy
++#~ msgid "UAM static content port"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "TCP port to bind to for only serving embedded content"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "UAM listening address"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "IP address to listen to for authentication of clients"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "UAM logout IP"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid ""
++#~ "Use this IP address to instantly logout a client accessing it (defaults "
++#~ "to 1.1.1.1)"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "UAM listening port"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "TCP port to bind to for authenticating clients (default 3990)"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "UAM secret"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "Shared secret between uamserver and chilli"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "UAM server"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "URL of web server to use for authenticating clients"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "UAM user interface"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid ""
++#~ "An init.d style program to handle local content on the uamuiport web "
++#~ "server"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "CGI program"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid ""
++#~ "Executable to run as a CGI type program (like haserl) for URLs with "
++#~ "extention .chi"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "Web content directory"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "Directory where embedded local web content is placed"
++#~ msgstr "Thống nhất cấu hình phương pháp cài đặt"
++
++#, fuzzy
++#~ msgid "MAC configuration"
++#~ msgstr "Cấu hình RADIUS"
++
++#, fuzzy
++#~ msgid "Configure MAC authentication"
++#~ msgstr "Cấu hình RADIUS"
++
++#, fuzzy
++#~ msgid "Allowed MAC addresses"
++#~ msgstr "Cấu hình RADIUS"
++
++#, fuzzy
++#~ msgid "List of MAC addresses for which MAC authentication will be performed"
++#~ msgstr "Cấu hình RADIUS"
++
++#, fuzzy
++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS"
++#~ msgstr "Cấu hình RADIUS"
++
++#, fuzzy
++#~ msgid "Enable MAC authentification"
++#~ msgstr "Cấu hình RADIUS"
++
++#, fuzzy
++#~ msgid "Try to authenticate all users based on their mac address alone"
++#~ msgstr "Cấu hình RADIUS"
++
++#, fuzzy
++#~ msgid "Password"
++#~ msgstr "Cấu hình RADIUS"
++
++#, fuzzy
++#~ msgid "Password used when performing MAC authentication"
++#~ msgstr "Cấu hình RADIUS"
++
++#, fuzzy
++#~ msgid "Suffix"
++#~ msgstr "Cấu hình RADIUS"
++
++#, fuzzy
++#~ msgid "coovachilli_macauth_macsuffix_desc"
++#~ msgstr "Cấu hình RADIUS"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/zh-cn/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/zh-cn/coovachilli.po
+new file mode 100644
+index 0000000..7ab0032
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/zh-cn/coovachilli.po
+@@ -0,0 +1,26 @@
++# coovachilli.pot
++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-05 14:32+0200\n"
++"Last-Translator: nKsyn <e.nksyn@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilli 网页认è¯"
++
++msgid "Network Configuration"
++msgstr "网络é…ç½®"
++
++msgid "RADIUS configuration"
++msgstr "RADIUSé…ç½®"
++
++msgid "UAM and MAC Authentication"
++msgstr "UAMå’ŒMAC认è¯"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/po/zh-tw/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/zh-tw/coovachilli.po
+new file mode 100644
+index 0000000..aad8a4d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/po/zh-tw/coovachilli.po
+@@ -0,0 +1,24 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-18 19:49+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "CoovaChilli"
++msgstr "CoovaChilliæœå‹™"
++
++msgid "Network Configuration"
++msgstr "網路設定"
++
++msgid "RADIUS configuration"
++msgstr "RADIUS設定"
++
++msgid "UAM and MAC Authentication"
++msgstr "微軟UAM模組和MACä½æŒ‡é©—è­‰"
+diff --git a/feeds/luci/applications/luci-app-coovachilli/root/etc/config/coovachilli b/feeds/luci/applications/luci-app-coovachilli/root/etc/config/coovachilli
+new file mode 100644
+index 0000000..0b6be2c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-coovachilli/root/etc/config/coovachilli
+@@ -0,0 +1,243 @@
++##############################################################################
++#
++# Sample CoovaChilli configuration file
++#
++##############################################################################
++
++# General settings
++config general
++
++ # Enable this flag to include debug information.
++ option debug 0
++
++ # Re-read configuration file at this interval. Will also cause new domain
++ # name lookups to be performed. Value is given in seconds.
++ option interval 3600
++
++ # File to store information about the process id of the program.
++ # The program must have write access to this file/directory.
++ option pidfile /var/run/chilli.pid
++
++ # Directory to use for nonvolatile storage.
++ # The program must have write access to this directory.
++ # This tag is currently ignored
++ #option statedir ./
++
++
++# TUN parameters
++config tun
++
++ # IP network address of external packet data network
++ # Used to allocate dynamic IP addresses and set up routing.
++ # Normally you do not need to uncomment this tag.
++ option net 192.168.182.0/24
++
++ # Dynamic IP address pool
++ # Used to allocate dynamic IP addresses to clients.
++ # If not set it defaults to the net tag.
++ # Do not uncomment this tag unless you are an experienced user!
++ #option dynip 192.168.182.0/24
++
++ # Static IP address pool
++ # Used to allocate static IP addresses to clients.
++ # Do not uncomment this tag unless you are an experienced user!
++ #option statip 192.168.182.0/24
++
++ # Primary DNS server.
++ # Will be suggested to the client.
++ # If omitted the system default will be used.
++ # Normally you do not need to uncomment this tag.
++ #option dns1 172.16.0.5
++
++ # Secondary DNS server.
++ # Will be suggested to the client.
++ # If omitted the system default will be used.
++ # Normally you do not need to uncomment this tag.
++ #option dns2 172.16.0.6
++
++ # Domain name
++ # Will be suggested to the client.
++ # Normally you do not need to uncomment this tag.
++ option domain key.chillispot.org
++
++ # Script executed after network interface has been brought up.
++ # Executed with the following parameters: <devicename> <ip address> <mask>
++ # Normally you do not need to uncomment this tag.
++ #option ipup /etc/chilli.ipup
++
++ # Script executed after network interface has been taken down.
++ # Executed with the following parameters: <devicename> <ip address> <mask>
++ # Normally you do not need to uncomment this tag.
++ #option ipdown /etc/chilli.ipdown
++
++ # Script executed after a user has been authenticated.
++ # Executed with the following parameters: <devicename> <ip address>
++ # <mask> <user ip address> <user mac address> <filter ID>
++ # Normally you do not need to uncomment this tag.
++ #option conup /etc/chilli.conup
++
++ # Script executed after a user has disconnected.
++ # Executed with the following parameters: <devicename> <ip address>
++ # <mask> <user ip address> <user mac address> <filter ID>
++ # Normally you do not need to uncomment this tag.
++ #option condown /etc/chilli.condown
++
++
++# DHCP Parameters
++config dhcp
++
++ # Ethernet interface to listen to.
++ # This is the network interface which is connected to the access points.
++ # In a typical configuration this tag should be set to eth1.
++ option dhcpif eth1
++
++ # Use specified MAC address.
++ # An address in the range 00:00:5E:00:02:00 - 00:00:5E:FF:FF:FF falls
++ # within the IANA range of addresses and is not allocated for other
++ # purposes.
++ # Normally you do not need to uncomment this tag.
++ #option dhcpmac 00:00:5E:00:02:00
++
++ # Time before DHCP lease expires
++ # Normally you do not need to uncomment this tag.
++ #option lease 600
++
++
++# Radius parameters
++config radius
++
++ # IP address to listen to
++ # Normally you do not need to uncomment this tag.
++ #option radiuslisten 127.0.0.1
++
++ # IP address of radius server 1
++ # For most installations you need to modify this tag.
++ option radiusserver1 rad01.chillispot.org
++
++ # IP address of radius server 2
++ # If you have only one radius server you should set radiusserver2 to the
++ # same value as radiusserver1.
++ # For most installations you need to modify this tag.
++ option radiusserver2 rad02.chillispot.org
++
++ # Radius authentication port
++ # The UDP port number to use for radius authentication requests.
++ # The same port number is used for both radiusserver1 and radiusserver2.
++ # Normally you do not need to uncomment this tag.
++ #option radiusauthport 1812
++
++ # Radius accounting port
++ # The UDP port number to use for radius accounting requests.
++ # The same port number is used for both radiusserver1 and radiusserver2.
++ # Normally you do not need to uncomment this tag.
++ #option radiusacctport 1813
++
++ # Radius shared secret for both servers
++ # For all installations you should modify this tag.
++ #option radiussecret testing123
++
++ # Radius NAS-Identifier
++ # Normally you do not need to uncomment this tag.
++ #option radiusnasid nas01
++
++ # Radius NAS-IP-Address
++ # Normally you do not need to uncomment this tag.
++ #option radiusnasip 127.0.0.1
++
++ # Radius Called-Station-ID
++ # Normally you do not need to uncomment this tag.
++ #option radiuscalled 00133300
++
++ # WISPr Location ID. Should be in the format: isocc=<ISO_Country_Code>,
++ # cc=<E.164_Country_Code>,ac=<E.164_Area_Code>,network=<ssid/ZONE>
++ # Normally you do not need to uncomment this tag.
++ #option radiuslocationid isocc=us,cc=1,ac=408,network=ACMEWISP_NewarkAirport
++
++ # WISPr Location Name. Should be in the format:
++ # <HOTSPOT_OPERATOR_NAME>,<LOCATION>
++ # Normally you do not need to uncomment this tag.
++ #option radiuslocationname ACMEWISP,Gate_14_Terminal_C_of_Newark_Airport
++
++
++# Radius proxy parameters
++config proxy
++
++ # IP address to listen to
++ # Normally you do not need to uncomment this tag.
++ #option proxylisten 10.0.0.1
++
++ # UDP port to listen to.
++ # If not specified a port will be selected by the system
++ # Normally you do not need to uncomment this tag.
++ #option proxyport 1645
++
++ # Client(s) from which we accept radius requests
++ # Normally you do not need to uncomment this tag.
++ #option proxyclient 10.0.0.1/24
++
++ # Radius proxy shared secret for all clients
++ # If not specified defaults to radiussecret
++ # Normally you do not need to uncomment this tag.
++ #option proxysecret testing123
++
++
++# Universal access method (UAM) parameters
++config uam
++
++ # URL of web server handling authentication.
++ option uamserver https://radius.chillispot.org/hotspotlogin
++
++ # URL of welcome homepage.
++ # Unauthenticated users will be redirected to this URL. If not specified
++ # users will be redirected to the uamserver instead.
++ # Normally you do not need to uncomment this tag.
++ #option uamhomepage http://192.168.182.1/welcome.html
++
++ # Shared between chilli and authentication web server
++ #option uamsecret ht2eb8ej6s4et3rg1ulp
++
++ # IP address to listen to for authentication requests
++ # Do not uncomment this tag unless you are an experienced user!
++ #option uamlisten 192.168.182.1
++
++ # TCP port to listen to for authentication requests
++ # Do not uncomment this tag unless you are an experienced user!
++ #option uamport 3990
++
++ # Comma separated list of domain names, IP addresses or network segments
++ # the client can access without first authenticating.
++ # It is possible to specify this tag multiple times.
++ # Normally you do not need to uncomment this tag.
++ #list uamallowed www.chillispot.org
++ #list uamallowed 10.11.12.0/24
++
++ # If this flag is given unauthenticated users are allowed to use
++ # any DNS server.
++ # Normally you do not need to uncomment this tag.
++ #uamanydns
++
++
++# MAC authentication
++config macauth
++
++ # If this flag is given users will be authenticated only on their MAC
++ # address.
++ # Normally you do not need to enable this flag.
++ option macauth 0
++
++ # List of MAC addresses.
++ # The MAC addresses specified in this list will be authenticated only on
++ # their MAC address.
++ # This tag is ignored if the macauth tag is given.
++ # It is possible to specify this tag multiple times.
++ # Normally you do not need to uncomment this tag.
++ #list macallowed 00-0A-5E-AC-BE-51
++ #list macallowed 00-30-1B-3C-32-E9
++
++ # Password to use for MAC authentication.
++ # Normally you do not need to uncomment this tag.
++ #option macpasswd password
++
++ # Suffix to add to MAC address in order to form the username.
++ # Normally you do not need to uncomment this tag.
++ #option macsuffix suffix
+diff --git a/feeds/luci/applications/luci-app-ddns/Makefile b/feeds/luci/applications/luci-app-ddns/Makefile
+new file mode 100644
+index 0000000..0e1e5df
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/Makefile
+@@ -0,0 +1,38 @@
++#
++# Copyright (C) 2008-2015 The LuCI Team <luci@lists.subsignal.org>
++#
++# This is free software, licensed under the Apache License, Version 2.0 .
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-app-ddns
++
++# Version == major.minor.patch
++# increase on new functionality (minor) or patches (patch)
++PKG_VERSION:=2.2.4
++
++# Release == build
++# increase on changes of translation files
++PKG_RELEASE:=1
++
++PKG_LICENSE:=Apache-2.0
++PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
++
++# LuCI specific settings
++LUCI_TITLE:=LuCI Support for Dynamic DNS Client (ddns-scripts)
++LUCI_DEPENDS:=+luci-mod-admin-full +ddns-scripts
++LUCI_PKGARCH:=all
++
++define Package/$(PKG_NAME)/config
++# shown in make menuconfig <Help>
++help
++ $(LUCI_TITLE)
++ .
++ Version: $(PKG_VERSION)-$(PKG_RELEASE)
++ $(PKG_MAINTAINER)
++endef
++
++include $(TOPDIR)/feeds/luci/luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/controller/ddns.lua b/feeds/luci/applications/luci-app-ddns/luasrc/controller/ddns.lua
+new file mode 100644
+index 0000000..4fbd3c3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/controller/ddns.lua
+@@ -0,0 +1,237 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2013 Manuel Munz <freifunk at somakoma dot de>
++-- Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.ddns", package.seeall)
++
++local NX = require "nixio"
++local NXFS = require "nixio.fs"
++local DISP = require "luci.dispatcher"
++local HTTP = require "luci.http"
++local UCI = require "luci.model.uci"
++local SYS = require "luci.sys"
++local DDNS = require "luci.tools.ddns" -- ddns multiused functions
++local UTIL = require "luci.util"
++
++DDNS_MIN = "2.4.2-1" -- minimum version of service required
++
++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 verinst = ddns.ipkg_ver_installed("ddns-scripts")
++ local verok = ddns.ipkg_ver_compare(verinst, ">=", "2.0.0-0")
++ -- do NOT start it not ddns-scripts version 2.x
++ if not verok then
++ return
++ end
++ -- no config create an empty one
++ if not nxfs.access("/etc/config/ddns") then
++ nxfs.writefile("/etc/config/ddns", "")
++ end
++
++ entry( {"admin", "services", "ddns"}, cbi("ddns/overview"), _("Dynamic DNS"), 59)
++ entry( {"admin", "services", "ddns", "detail"}, cbi("ddns/detail"), nil ).leaf = true
++ entry( {"admin", "services", "ddns", "hints"}, cbi("ddns/hints",
++ {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), nil ).leaf = true
++ entry( {"admin", "services", "ddns", "global"}, cbi("ddns/global"), nil ).leaf = true
++ entry( {"admin", "services", "ddns", "logview"}, call("logread") ).leaf = true
++ entry( {"admin", "services", "ddns", "startstop"}, post("startstop") ).leaf = true
++ entry( {"admin", "services", "ddns", "status"}, call("status") ).leaf = true
++end
++
++-- function to read all sections status and return data array
++local function _get_status()
++ local uci = UCI.cursor()
++ local service = SYS.init.enabled("ddns") and 1 or 0
++ local url_start = DISP.build_url("admin", "system", "startup")
++ local data = {} -- Array to transfer data to javascript
++
++ data[#data+1] = {
++ enabled = service, -- service enabled
++ url_up = url_start, -- link to enable DDS (System-Startup)
++ }
++
++ uci:foreach("ddns", "service", function (s)
++
++ -- Get section we are looking at
++ -- and enabled state
++ local section = s[".name"]
++ local enabled = tonumber(s["enabled"]) or 0
++ local datelast = "_empty_" -- formatted date of last update
++ local datenext = "_empty_" -- formatted date of next update
++
++ -- get force seconds
++ local force_seconds = DDNS.calc_seconds(
++ tonumber(s["force_interval"]) or 72 ,
++ s["force_unit"] or "hours" )
++ -- get/validate pid and last update
++ local pid = DDNS.get_pid(section)
++ local uptime = SYS.uptime()
++ local lasttime = DDNS.get_lastupd(section)
++ if lasttime > uptime then -- /var might not be linked to /tmp
++ lasttime = 0 -- and/or not cleared on reboot
++ end
++
++ -- no last update happen
++ if lasttime == 0 then
++ datelast = "_never_"
++
++ -- we read last update
++ else
++ -- calc last update
++ -- sys.epoch - sys uptime + lastupdate(uptime)
++ local epoch = os.time() - uptime + lasttime
++ -- use linux date to convert epoch
++ datelast = DDNS.epoch2date(epoch)
++ -- calc and fill next update
++ datenext = DDNS.epoch2date(epoch + force_seconds)
++ end
++
++ -- process running but update needs to happen
++ -- problems if force_seconds > uptime
++ force_seconds = (force_seconds > uptime) and uptime or force_seconds
++ if pid > 0 and ( lasttime + force_seconds - uptime ) <= 0 then
++ datenext = "_verify_"
++
++ -- run once
++ elseif force_seconds == 0 then
++ datenext = "_runonce_"
++
++ -- no process running and NOT enabled
++ elseif pid == 0 and enabled == 0 then
++ datenext = "_disabled_"
++
++ -- no process running and enabled
++ elseif pid == 0 and enabled ~= 0 then
++ datenext = "_stopped_"
++ end
++
++ -- get/set monitored interface and IP version
++ local iface = s["interface"] or "_nonet_"
++ local use_ipv6 = tonumber(s["use_ipv6"]) or 0
++ if iface ~= "_nonet_" then
++ local ipv = (use_ipv6 == 1) and "IPv6" or "IPv4"
++ iface = ipv .. " / " .. iface
++ end
++
++ -- try to get registered IP
++ local domain = s["domain"] or "_nodomain_"
++ local dnsserver = s["dns_server"] or ""
++ local force_ipversion = tonumber(s["force_ipversion"] or 0)
++ local force_dnstcp = tonumber(s["force_dnstcp"] or 0)
++ local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh]]
++ command = command .. [[ get_registered_ip ]] .. domain .. [[ ]] .. use_ipv6 ..
++ [[ ]] .. force_ipversion .. [[ ]] .. force_dnstcp .. [[ ]] .. dnsserver
++ local reg_ip = SYS.exec(command)
++ if reg_ip == "" then
++ reg_ip = "_nodata_"
++ end
++
++ -- fill transfer array
++ data[#data+1] = {
++ section = section,
++ enabled = enabled,
++ iface = iface,
++ domain = domain,
++ reg_ip = reg_ip,
++ pid = pid,
++ datelast = datelast,
++ datenext = datenext
++ }
++ end)
++
++ uci:unload("ddns")
++ return data
++end
++
++-- called by XHR.get from detail_logview.htm
++function logread(section)
++ -- read application settings
++ local uci = UCI.cursor()
++ local log_dir = uci:get("ddns", "global", "log_dir") or "/var/log/ddns"
++ local lfile = log_dir .. "/" .. section .. ".log"
++ local ldata = NXFS.readfile(lfile)
++
++ if not ldata or #ldata == 0 then
++ ldata="_nodata_"
++ end
++ uci:unload("ddns")
++ HTTP.write(ldata)
++end
++
++-- called by XHR.get from overview_status.htm
++function startstop(section, enabled)
++ local uci = UCI.cursor()
++ local pid = DDNS.get_pid(section)
++ local data = {} -- Array to transfer data to javascript
++
++ -- if process running we want to stop and return
++ if pid > 0 then
++ local tmp = NX.kill(pid, 15) -- terminate
++ NX.nanosleep(2) -- 2 second "show time"
++ -- status changed so return full status
++ data = _get_status()
++ HTTP.prepare_content("application/json")
++ HTTP.write_json(data)
++ return
++ end
++
++ -- read uncommitted changes
++ -- we don't save and commit data from other section or other options
++ -- only enabled will be done
++ local exec = true
++ local changed = uci:changes("ddns")
++ for k_config, v_section in pairs(changed) do
++ -- security check because uci.changes only gets our config
++ if k_config ~= "ddns" then
++ exec = false
++ break
++ end
++ for k_section, v_option in pairs(v_section) do
++ -- check if only section of button was changed
++ if k_section ~= section then
++ exec = false
++ break
++ end
++ for k_option, v_value in pairs(v_option) do
++ -- check if only enabled was changed
++ if k_option ~= "enabled" then
++ exec = false
++ break
++ end
++ end
++ end
++ end
++
++ -- we can not execute because other
++ -- uncommitted changes pending, so exit here
++ if not exec then
++ HTTP.write("_uncommitted_")
++ return
++ end
++
++ -- save enable state
++ uci:set("ddns", section, "enabled", ( (enabled == "true") and "1" or "0") )
++ uci:save("ddns")
++ uci:commit("ddns")
++ uci:unload("ddns")
++
++ -- start dynamic_dns_updater.sh script
++ os.execute ([[/usr/lib/ddns/dynamic_dns_updater.sh %s 0 > /dev/null 2>&1 &]] % section)
++ NX.nanosleep(3) -- 3 seconds "show time"
++
++ -- status changed so return full status
++ data = _get_status()
++ HTTP.prepare_content("application/json")
++ HTTP.write_json(data)
++end
++
++-- called by XHR.poll from overview_status.htm
++function status()
++ local data = _get_status()
++ HTTP.prepare_content("application/json")
++ HTTP.write_json(data)
++end
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua
+new file mode 100644
+index 0000000..e655ce5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua
+@@ -0,0 +1,1239 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2013 Manuel Munz <freifunk at somakoma dot de>
++-- Copyright 2014-2015 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++-- Licensed to the public under the Apache License 2.0.
++
++local NX = require "nixio"
++local NXFS = require "nixio.fs"
++local SYS = require "luci.sys"
++local UTIL = require "luci.util"
++local DISP = require "luci.dispatcher"
++local WADM = require "luci.tools.webadmin"
++local DTYP = require "luci.cbi.datatypes"
++local DDNS = require "luci.tools.ddns" -- ddns multiused functions
++
++-- takeover arguments -- #######################################################
++local section = arg[1]
++
++-- check supported options -- ##################################################
++-- saved to local vars here because doing multiple os calls slow down the system
++local has_ipv6 = DDNS.check_ipv6() -- IPv6 support
++local has_ssl = DDNS.check_ssl() -- HTTPS support
++local has_proxy = DDNS.check_proxy() -- Proxy support
++local has_dnstcp = DDNS.check_bind_host() -- DNS TCP support
++local has_force = has_ssl and has_dnstcp -- Force IP Protocoll
++
++-- html constants -- ###########################################################
++local font_red = "<font color='red'>"
++local font_off = "</font>"
++local bold_on = "<strong>"
++local bold_off = "</strong>"
++
++-- error text constants -- #####################################################
++err_ipv6_plain = translate("IPv6 not supported") .. " - " ..
++ translate("please select 'IPv4' address version")
++err_ipv6_basic = bold_on ..
++ font_red ..
++ translate("IPv6 not supported") ..
++ font_off ..
++ "<br />" .. translate("please select 'IPv4' address version") ..
++ bold_off
++err_ipv6_other = bold_on ..
++ font_red ..
++ translate("IPv6 not supported") ..
++ font_off ..
++ "<br />" .. translate("please select 'IPv4' address version in") .. " " ..
++ [[<a href="]] ..
++ DISP.build_url("admin", "services", "ddns", "detail", section) ..
++ "?tab.dns." .. section .. "=basic" ..
++ [[">]] ..
++ translate("Basic Settings") ..
++ [[</a>]] ..
++ bold_off
++
++function err_tab_basic(self)
++ return translate("Basic Settings") .. " - " .. self.title .. ": "
++end
++function err_tab_adv(self)
++ return translate("Advanced Settings") .. " - " .. self.title .. ": "
++end
++function err_tab_timer(self)
++ return translate("Timer Settings") .. " - " .. self.title .. ": "
++end
++
++-- function to verify settings around ip_source
++-- will use dynamic_dns_lucihelper to check if
++-- local IP can be read
++local function _verify_ip_source()
++ -- section is globally defined here be calling agrument (see above)
++ local _network = "-"
++ local _url = "-"
++ local _interface = "-"
++ local _script = "-"
++ local _proxy = ""
++
++ local _ipv6 = usev6:formvalue(section)
++ local _source = (_ipv6 == "1")
++ and src6:formvalue(section)
++ or src4:formvalue(section)
++ if _source == "network" then
++ _network = (_ipv6 == "1")
++ and ipn6:formvalue(section)
++ or ipn4:formvalue(section)
++ elseif _source == "web" then
++ _url = (_ipv6 == "1")
++ and iurl6:formvalue(section)
++ or iurl4:formvalue(section)
++ -- proxy only needed for checking url
++ _proxy = (pxy) and pxy:formvalue(section) or ""
++ elseif _source == "interface" then
++ _interface = ipi:formvalue(section)
++ elseif _source == "script" then
++ _script = ips:formvalue(section)
++ end
++
++ local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh get_local_ip ]] ..
++ _ipv6 .. [[ ]] .. _source .. [[ ]] .. _network .. [[ ]] ..
++ _url .. [[ ]] .. _interface .. [[ ']] .. _script.. [[' ]] .. _proxy
++ local ret = SYS.call(command)
++
++ if ret == 0 then
++ return true -- valid
++ else
++ return nil -- invalid
++ end
++end
++
++-- cbi-map definition -- #######################################################
++m = Map("ddns")
++
++m.title = [[<a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]] ..
++ translate("Dynamic DNS") .. [[</a>]]
++
++m.description = translate("Dynamic DNS allows that your router can be reached with " ..
++ "a fixed hostname while having a dynamically changing " ..
++ "IP address.")
++
++m.redirect = DISP.build_url("admin", "services", "ddns")
++
++m.on_after_commit = function(self)
++ if self.changed then -- changes ?
++ local pid = DDNS.get_pid(section)
++ if pid > 0 then -- running ?
++ local tmp = NX.kill(pid, 1) -- send SIGHUP
++ end
++ end
++end
++
++-- read application settings -- ################################################
++-- date format; if not set use ISO format
++date_format = m.uci:get(m.config, "global", "date_format") or "%F %R"
++-- log directory
++log_dir = m.uci:get(m.config, "global", "log_dir") or "/var/log/ddns"
++
++-- cbi-section definition -- ###################################################
++ns = m:section( NamedSection, section, "service",
++ translate("Details for") .. ([[: <strong>%s</strong>]] % section),
++ translate("Configure here the details for selected Dynamic DNS service.")
++ .. [[<br /><a href="http://wiki.openwrt.org/doc/uci/ddns#version_1x" target="_blank">]]
++ .. translate("For detailed information about parameter settings look here.")
++ .. [[</a>]] )
++ns.instance = section -- arg [1]
++ns:tab("basic", translate("Basic Settings"), nil )
++ns:tab("advanced", translate("Advanced Settings"), nil )
++ns:tab("timer", translate("Timer Settings"), nil )
++ns:tab("logview", translate("Log File Viewer"), nil )
++
++-- TAB: Basic #####################################################################################
++-- enabled -- #################################################################
++en = ns:taboption("basic", Flag, "enabled",
++ translate("Enabled"),
++ translate("If this service section is disabled it could not be started." .. "<br />" ..
++ "Neither from LuCI interface nor from console") )
++en.orientation = "horizontal"
++function en.parse(self, section)
++ DDNS.flag_parse(self, section)
++end
++
++-- use_ipv6 (NEW) -- ##########################################################
++usev6 = ns:taboption("basic", ListValue, "use_ipv6",
++ translate("IP address version"),
++ translate("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider") )
++usev6.widget = "radio"
++usev6.default = "0"
++usev6:value("0", translate("IPv4-Address") )
++function usev6.cfgvalue(self, section)
++ local value = AbstractValue.cfgvalue(self, section)
++ if has_ipv6 or (value == "1" and not has_ipv6) then
++ self:value("1", translate("IPv6-Address") )
++ end
++ 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 has_ipv6) or value == "0" then
++ return value
++ end
++ return nil, err_tab_basic(self) .. err_ipv6_plain
++end
++function usev6.write(self, section, value)
++ if value == "0" then -- force rmempty
++ return self.map:del(section, self.option)
++ else
++ return self.map:set(section, self.option, value)
++ end
++end
++
++-- IPv4 - service_name -- ######################################################
++svc4 = ns:taboption("basic", ListValue, "ipv4_service_name",
++ translate("DDNS Service provider") .. " [IPv4]" )
++svc4.default = "-"
++svc4:depends("use_ipv6", "0") -- only show on IPv4
++
++local services4 = { }
++local fd4 = io.open("/usr/lib/ddns/services", "r")
++
++if fd4 then
++ local ln
++ repeat
++ ln = fd4:read("*l")
++ local s = ln and ln:match('^%s*"([^"]+)"')
++ if s then services4[#services4+1] = s end
++ until not ln
++ fd4:close()
++end
++
++for _, v in UTIL.vspairs(services4) do svc4:value(v) end
++svc4:value("-", translate("-- custom --") )
++
++function svc4.cfgvalue(self, section)
++ local v = DDNS.read_value(self, section, "service_name")
++ if not v or #v == 0 then
++ return "-"
++ else
++ return v
++ end
++end
++function svc4.validate(self, value)
++ if usev6:formvalue(section) == "0" then -- do only on IPv4
++ return value
++ else
++ return "" -- supress validate error
++ end
++end
++function svc4.write(self, section, value)
++ if usev6:formvalue(section) == "0" then -- do only IPv4 here
++ self.map:del(section, self.option) -- to be shure
++ if value ~= "-" then -- and write "service_name
++ self.map:del(section, "update_url") -- delete update_url
++ return self.map:set(section, "service_name", value)
++ else
++ return self.map:del(section, "service_name")
++ end
++ end
++end
++
++-- IPv6 - service_name -- ######################################################
++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 has_ipv6 then
++ svc6.description = err_ipv6_basic
++end
++
++local services6 = { }
++local fd6 = io.open("/usr/lib/ddns/services_ipv6", "r")
++
++if fd6 then
++ local ln
++ repeat
++ ln = fd6:read("*l")
++ local s = ln and ln:match('^%s*"([^"]+)"')
++ if s then services6[#services6+1] = s end
++ until not ln
++ fd6:close()
++end
++
++for _, v in UTIL.vspairs(services6) do svc6:value(v) end
++svc6:value("-", translate("-- custom --") )
++
++function svc6.cfgvalue(self, section)
++ local v = DDNS.read_value(self, section, "service_name")
++ if not v or #v == 0 then
++ return "-"
++ else
++ return v
++ end
++end
++function svc6.validate(self, value)
++ if usev6:formvalue(section) == "1" then -- do only on IPv6
++ if has_ipv6 then return value end
++ return nil, err_tab_basic(self) .. err_ipv6_plain
++ else
++ return "" -- supress validate error
++ end
++end
++function svc6.write(self, section, value)
++ if usev6:formvalue(section) == "1" then -- do only when IPv6
++ self.map:del(section, self.option) -- delete "ipv6_service_name" helper
++ if value ~= "-" then -- and write "service_name
++ self.map:del(section, "update_url") -- delete update_url
++ return self.map:set(section, "service_name", value)
++ else
++ return self.map:del(section, "service_name")
++ end
++ end
++end
++
++-- IPv4/IPv6 - update_url -- ###################################################
++uurl = ns:taboption("basic", Value, "update_url",
++ translate("Custom update-URL"),
++ translate("Update URL to be used for updating your DDNS Provider." .. "<br />" ..
++ "Follow instructions you will find on their WEB page.") )
++uurl:depends("ipv4_service_name", "-")
++uurl:depends("ipv6_service_name", "-")
++function uurl.validate(self, value)
++ local script = ush:formvalue(section)
++
++ if (usev6:formvalue(section) == "0" and svc4:formvalue(section) ~= "-") or
++ (usev6:formvalue(section) == "1" and svc6:formvalue(section) ~= "-") then
++ return "" -- suppress validate error
++ elseif not value then
++ if not script or not (#script > 0) then
++ return nil, err_tab_basic(self) .. translate("missing / required")
++ else
++ return "" -- suppress validate error / update_script is given
++ end
++ elseif (#script > 0) then
++ return nil, err_tab_basic(self) .. translate("either url or script could be set")
++ end
++
++ local url = DDNS.parse_url(value)
++ if not url.scheme == "http" then
++ return nil, err_tab_basic(self) .. translate("must start with 'http://'")
++ elseif not url.query then
++ return nil, err_tab_basic(self) .. "<QUERY> " .. translate("missing / required")
++ elseif not url.host then
++ return nil, err_tab_basic(self) .. "<HOST> " .. translate("missing / required")
++ elseif SYS.call([[nslookup ]] .. url.host .. [[ >/dev/null 2>&1]]) ~= 0 then
++ return nil, err_tab_basic(self) .. translate("can not resolve host: ") .. url.host
++ end
++
++ return value
++end
++
++-- IPv4/IPv6 - update_script -- ################################################
++ush = ns:taboption("basic", Value, "update_script",
++ translate("Custom update-script"),
++ translate("Custom update script to be used for updating your DDNS Provider.") )
++ush:depends("ipv4_service_name", "-")
++ush:depends("ipv6_service_name", "-")
++function ush.validate(self, value)
++ local url = uurl:formvalue(section)
++
++ if (usev6:formvalue(section) == "0" and svc4:formvalue(section) ~= "-") or
++ (usev6:formvalue(section) == "1" and svc6:formvalue(section) ~= "-") then
++ return "" -- suppress validate error
++ elseif not value then
++ if not url or not (#url > 0) then
++ return nil, err_tab_basic(self) .. translate("missing / required")
++ else
++ return "" -- suppress validate error / update_url is given
++ end
++ elseif (#url > 0) then
++ return nil, err_tab_basic(self) .. translate("either url or script could be set")
++ elseif not NXFS.access(value) then
++ return nil, err_tab_basic(self) .. translate("File not found")
++ end
++ return value
++end
++
++-- IPv4/IPv6 - domain -- #######################################################
++dom = ns:taboption("basic", Value, "domain",
++ translate("Hostname/Domain"),
++ translate("Replaces [DOMAIN] in Update-URL") )
++dom.rmempty = false
++dom.placeholder = "mypersonaldomain.dyndns.org"
++function dom.validate(self, value)
++ if not value
++ or not (#value > 0)
++ or not DTYP.hostname(value) then
++ return nil, err_tab_basic(self) .. translate("invalid - Sample") .. ": 'mypersonaldomain.dyndns.org'"
++ else
++ return value
++ end
++end
++
++-- IPv4/IPv6 - username -- #####################################################
++user = ns:taboption("basic", Value, "username",
++ translate("Username"),
++ translate("Replaces [USERNAME] in Update-URL") )
++user.rmempty = false
++function user.validate(self, value)
++ if not value then
++ return nil, err_tab_basic(self) .. translate("missing / required")
++ end
++ return value
++end
++
++-- IPv4/IPv6 - password -- #####################################################
++pw = ns:taboption("basic", Value, "password",
++ translate("Password"),
++ translate("Replaces [PASSWORD] in Update-URL") )
++pw.rmempty = false
++pw.password = true
++function pw.validate(self, value)
++ if not value then
++ return nil, err_tab_basic(self) .. translate("missing / required")
++ end
++ return value
++end
++
++-- IPv4/IPv6 - use_https (NEW) -- ##############################################
++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"
++ https.rmempty = false -- force validate function
++ function https.cfgvalue(self, section)
++ local value = AbstractValue.cfgvalue(self, section)
++ 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
++ else
++ self.description = translate("Enable secure communication with DDNS provider")
++ end
++ return value
++ end
++ function https.parse(self, section)
++ DDNS.flag_parse(self, section)
++ end
++ function https.validate(self, value)
++ 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)
++ if value == "1" then
++ return self.map:set(section, self.option, value)
++ else
++ self.map:del(section, "cacert")
++ return self.map:del(section, self.option)
++ end
++ end
++end
++
++-- IPv4/IPv6 - cacert (NEW) -- #################################################
++if has_ssl then
++ cert = ns:taboption("basic", Value, "cacert",
++ translate("Path to CA-Certificate"),
++ translate("directory or path/file") .. "<br />" ..
++ translate("or") .. bold_on .. " IGNORE " .. bold_off ..
++ translate("to run HTTPS without verification of server certificates (insecure)") )
++ cert:depends("use_https", "1")
++ cert.rmempty = false -- force validate function
++ cert.default = "/etc/ssl/certs"
++ function cert.validate(self, value)
++ if https:formvalue(section) == "0" then
++ return "" -- supress validate error if NOT https
++ end
++ if value then -- otherwise errors in datatype check
++ if DTYP.directory(value)
++ or DTYP.file(value)
++ or value == "IGNORE" then
++ return value
++ end
++ end
++ return nil, err_tab_basic(self) ..
++ translate("file or directory not found or not 'IGNORE'") .. " !"
++ end
++end
++
++-- TAB: Advanced ##################################################################################
++-- IPv4 - ip_source -- #########################################################
++src4 = ns:taboption("advanced", ListValue, "ipv4_source",
++ translate("IP address source") .. " [IPv4]",
++ translate("Defines the source to read systems IPv4-Address from, that will be send to the DDNS provider") )
++src4:depends("use_ipv6", "0") -- IPv4 selected
++src4.default = "network"
++src4:value("network", translate("Network"))
++src4:value("web", translate("URL"))
++src4:value("interface", translate("Interface"))
++src4:value("script", translate("Script"))
++function src4.cfgvalue(self, section)
++ return DDNS.read_value(self, section, "ip_source")
++end
++function src4.validate(self, value)
++ if usev6:formvalue(section) == "1" then
++ return "" -- ignore on IPv6 selected
++ elseif not _verify_ip_source() then
++ return nil, err_tab_adv(self) ..
++ translate("can not detect local IP. Please select a different Source combination")
++ else
++ return value
++ end
++end
++function src4.write(self, section, value)
++ if usev6:formvalue(section) == "1" then
++ return true -- ignore on IPv6 selected
++ elseif value == "network" then
++ self.map:del(section, "ip_url") -- delete not need parameters
++ self.map:del(section, "ip_interface")
++ self.map:del(section, "ip_script")
++ elseif value == "web" then
++ self.map:del(section, "ip_network") -- delete not need parameters
++ self.map:del(section, "ip_interface")
++ self.map:del(section, "ip_script")
++ elseif value == "interface" then
++ self.map:del(section, "ip_network") -- delete not need parameters
++ self.map:del(section, "ip_url")
++ self.map:del(section, "ip_script")
++ elseif value == "script" then
++ self.map:del(section, "ip_network")
++ self.map:del(section, "ip_url") -- delete not need parameters
++ self.map:del(section, "ip_interface")
++ end
++ self.map:del(section, self.option) -- delete "ipv4_source" helper
++ return self.map:set(section, "ip_source", value) -- and write "ip_source
++end
++
++-- IPv6 - ip_source -- #########################################################
++src6 = ns:taboption("advanced", ListValue, "ipv6_source",
++ translate("IP address source") .. " [IPv6]",
++ translate("Defines the source to read systems IPv6-Address from, that will be send to the DDNS provider") )
++src6:depends("use_ipv6", 1) -- IPv6 selected
++src6.default = "network"
++src6:value("network", translate("Network"))
++src6:value("web", translate("URL"))
++src6:value("interface", translate("Interface"))
++src6:value("script", translate("Script"))
++if not has_ipv6 then
++ src6.description = err_ipv6_other
++end
++function src6.cfgvalue(self, section)
++ return DDNS.read_value(self, section, "ip_source")
++end
++function src6.validate(self, value)
++ if usev6:formvalue(section) == "0" then
++ return "" -- ignore on IPv4 selected
++ 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) ..
++ translate("can not detect local IP. Please select a different Source combination")
++ else
++ return value
++ end
++end
++function src6.write(self, section, value)
++ if usev6:formvalue(section) == "0" then
++ return true -- ignore on IPv4 selected
++ elseif value == "network" then
++ self.map:del(section, "ip_url") -- delete not need parameters
++ self.map:del(section, "ip_interface")
++ self.map:del(section, "ip_script")
++ elseif value == "web" then
++ self.map:del(section, "ip_network") -- delete not need parameters
++ self.map:del(section, "ip_interface")
++ self.map:del(section, "ip_script")
++ elseif value == "interface" then
++ self.map:del(section, "ip_network") -- delete not need parameters
++ self.map:del(section, "ip_url")
++ self.map:del(section, "ip_script")
++ elseif value == "script" then
++ self.map:del(section, "ip_network")
++ self.map:del(section, "ip_url") -- delete not need parameters
++ self.map:del(section, "ip_interface")
++ end
++ self.map:del(section, self.option) -- delete "ipv4_source" helper
++ return self.map:set(section, "ip_source", value) -- and write "ip_source
++end
++
++-- IPv4 - ip_network (default "wan") -- ########################################
++ipn4 = ns:taboption("advanced", ListValue, "ipv4_network",
++ translate("Network") .. " [IPv4]",
++ translate("Defines the network to read systems IPv4-Address from") )
++ipn4:depends("ipv4_source", "network")
++ipn4.default = "wan"
++WADM.cbi_add_networks(ipn4)
++function ipn4.cfgvalue(self, section)
++ return DDNS.read_value(self, section, "ip_network")
++end
++function ipn4.validate(self, value)
++ if usev6:formvalue(section) == "1"
++ or src4:formvalue(section) ~= "network" then
++ -- ignore if IPv6 selected OR
++ -- ignore everything except "network"
++ return ""
++ else
++ return value
++ end
++end
++function ipn4.write(self, section, value)
++ if usev6:formvalue(section) == "1"
++ or src4:formvalue(section) ~= "network" then
++ -- ignore if IPv6 selected OR
++ -- ignore everything except "network"
++ return true
++ else
++ -- set also as "interface" for monitoring events changes/hot-plug
++ self.map:set(section, "interface", value)
++ self.map:del(section, self.option) -- delete "ipv4_network" helper
++ return self.map:set(section, "ip_network", value) -- and write "ip_network"
++ end
++end
++
++-- IPv6 - ip_network (default "wan6") -- #######################################
++ipn6 = ns:taboption("advanced", ListValue, "ipv6_network",
++ translate("Network") .. " [IPv6]" )
++ipn6:depends("ipv6_source", "network")
++ipn6.default = "wan6"
++WADM.cbi_add_networks(ipn6)
++if has_ipv6 then
++ ipn6.description = translate("Defines the network to read systems IPv6-Address from")
++else
++ ipn6.description = err_ipv6_other
++end
++function ipn6.cfgvalue(self, section)
++ return DDNS.read_value(self, section, "ip_network")
++end
++function ipn6.validate(self, value)
++ if usev6:formvalue(section) == "0"
++ or src6:formvalue(section) ~= "network" then
++ -- ignore if IPv4 selected OR
++ -- ignore everything except "network"
++ return ""
++ elseif has_ipv6 then
++ return value
++ else
++ return nil, err_tab_adv(self) .. err_ipv6_plain
++ end
++end
++function ipn6.write(self, section, value)
++ if usev6:formvalue(section) == "0"
++ or src6:formvalue(section) ~= "network" then
++ -- ignore if IPv4 selected OR
++ -- ignore everything except "network"
++ return true
++ else
++ -- set also as "interface" for monitoring events changes/hotplug
++ self.map:set(section, "interface", value)
++ self.map:del(section, self.option) -- delete "ipv6_network" helper
++ return self.map:set(section, "ip_network", value) -- and write "ip_network"
++ end
++end
++
++-- IPv4 - ip_url (default "checkip.dyndns.com") -- #############################
++iurl4 = ns:taboption("advanced", Value, "ipv4_url",
++ translate("URL to detect") .. " [IPv4]",
++ translate("Defines the Web page to read systems IPv4-Address from") )
++iurl4:depends("ipv4_source", "web")
++iurl4.default = "http://checkip.dyndns.com"
++function iurl4.cfgvalue(self, section)
++ return DDNS.read_value(self, section, "ip_url")
++end
++function iurl4.validate(self, value)
++ if usev6:formvalue(section) == "1"
++ or src4:formvalue(section) ~= "web" then
++ -- ignore if IPv6 selected OR
++ -- ignore everything except "web"
++ return ""
++ elseif not value or #value == 0 then
++ return nil, err_tab_adv(self) .. translate("missing / required")
++ end
++
++ local url = DDNS.parse_url(value)
++ if not (url.scheme == "http" or url.scheme == "https") then
++ return nil, err_tab_adv(self) .. translate("must start with 'http://'")
++ elseif not url.host then
++ return nil, err_tab_adv(self) .. "<HOST> " .. translate("missing / required")
++ elseif SYS.call([[nslookup ]] .. url.host .. [[>/dev/null 2>&1]]) ~= 0 then
++ return nil, err_tab_adv(self) .. translate("can not resolve host: ") .. url.host
++ else
++ return value
++ end
++end
++function iurl4.write(self, section, value)
++ if usev6:formvalue(section) == "1"
++ or src4:formvalue(section) ~= "web" then
++ -- ignore if IPv6 selected OR
++ -- ignore everything except "web"
++ return true
++ else
++ self.map:del(section, self.option) -- delete "ipv4_url" helper
++ return self.map:set(section, "ip_url", value) -- and write "ip_url"
++ end
++end
++
++-- IPv6 - ip_url (default "checkipv6.dyndns.com") -- ###########################
++iurl6 = ns:taboption("advanced", Value, "ipv6_url",
++ translate("URL to detect") .. " [IPv6]" )
++iurl6:depends("ipv6_source", "web")
++iurl6.default = "http://checkipv6.dyndns.com"
++if has_ipv6 then
++ iurl6.description = translate("Defines the Web page to read systems IPv6-Address from")
++else
++ iurl6.description = err_ipv6_other
++end
++function iurl6.cfgvalue(self, section)
++ return DDNS.read_value(self, section, "ip_url")
++end
++function iurl6.validate(self, value)
++ if usev6:formvalue(section) == "0"
++ or src6:formvalue(section) ~= "web" then
++ -- ignore if IPv4 selected OR
++ -- ignore everything except "web"
++ return ""
++ 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")
++ end
++
++ local url = DDNS.parse_url(value)
++ if not (url.scheme == "http" or url.scheme == "https") then
++ return nil, err_tab_adv(self) .. translate("must start with 'http://'")
++ elseif not url.host then
++ return nil, err_tab_adv(self) .. "<HOST> " .. translate("missing / required")
++ elseif SYS.call([[nslookup ]] .. url.host .. [[>/dev/null 2>&1]]) ~= 0 then
++ return nil, err_tab_adv(self) .. translate("can not resolve host: ") .. url.host
++ else
++ return value
++ end
++end
++function iurl6.write(self, section, value)
++ if usev6:formvalue(section) == "0"
++ or src6:formvalue(section) ~= "web" then
++ -- ignore if IPv4 selected OR
++ -- ignore everything except "web"
++ return true
++ else
++ self.map:del(section, self.option) -- delete "ipv6_url" helper
++ return self.map:set(section, "ip_url", value) -- and write "ip_url"
++ end
++end
++
++-- IPv4 + IPv6 - ip_interface -- ###############################################
++ipi = ns:taboption("advanced", ListValue, "ip_interface",
++ translate("Interface"),
++ translate("Defines the interface to read systems IP-Address from") )
++ipi:depends("ipv4_source", "interface") -- IPv4
++ipi:depends("ipv6_source", "interface") -- or IPv6
++for _, v in pairs(SYS.net.devices()) do
++ -- show only interface set to a network
++ -- and ignore loopback
++ net = WADM.iface_get_network(v)
++ if net and net ~= "loopback" then
++ ipi:value(v)
++ end
++end
++function ipi.validate(self, value)
++ if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "interface")
++ or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "interface") then
++ return ""
++ else
++ return value
++ end
++end
++function ipi.write(self, section, value)
++ if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "interface")
++ or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "interface") then
++ return true
++ else
++ -- get network from device to
++ -- set also as "interface" for monitoring events changes/hotplug
++ local net = WADM.iface_get_network(value)
++ self.map:set(section, "interface", net)
++ return self.map:set(section, self.option, value)
++ end
++end
++
++-- IPv4 + IPv6 - ip_script (NEW) -- ############################################
++ips = ns:taboption("advanced", Value, "ip_script",
++ translate("Script"),
++ translate("User defined script to read systems IP-Address") )
++ips:depends("ipv4_source", "script") -- IPv4
++ips:depends("ipv6_source", "script") -- or IPv6
++ips.rmempty = false
++ips.placeholder = "/path/to/script.sh"
++function ips.validate(self, value)
++ local split
++ if value then split = UTIL.split(value, " ") end
++
++ if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "script")
++ or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "script") then
++ return ""
++ elseif not value or not (#value > 0) or not NXFS.access(split[1], "x") then
++ return nil, err_tab_adv(self) ..
++ translate("not found or not executable - Sample: '/path/to/script.sh'")
++ else
++ return value
++ end
++end
++function ips.write(self, section, value)
++ if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "script")
++ or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "script") then
++ return true
++ else
++ return self.map:set(section, self.option, value)
++ end
++end
++
++-- IPv4 - interface - default "wan" -- #########################################
++-- event network to monitor changes/hotplug/dynamic_dns_updater.sh
++-- only needs to be set if "ip_source"="web" or "script"
++-- if "ip_source"="network" or "interface" we use their network
++eif4 = ns:taboption("advanced", ListValue, "ipv4_interface",
++ translate("Event Network") .. " [IPv4]",
++ translate("Network on which the ddns-updater scripts will be started") )
++eif4:depends("ipv4_source", "web")
++eif4:depends("ipv4_source", "script")
++eif4.default = "wan"
++WADM.cbi_add_networks(eif4)
++function eif4.cfgvalue(self, section)
++ return DDNS.read_value(self, section, "interface")
++end
++function eif4.validate(self, value)
++ if usev6:formvalue(section) == "1"
++ or src4:formvalue(section) == "network"
++ or src4:formvalue(section) == "interface" then
++ return "" -- ignore IPv6, network, interface
++ else
++ return value
++ end
++end
++function eif4.write(self, section, value)
++ if usev6:formvalue(section) == "1"
++ or src4:formvalue(section) == "network"
++ or src4:formvalue(section) == "interface" then
++ return true -- ignore IPv6, network, interface
++ else
++ self.map:del(section, self.option) -- delete "ipv4_interface" helper
++ return self.map:set(section, "interface", value) -- and write "interface"
++ end
++end
++
++-- IPv6 - interface (NEW) - default "wan6" -- ##################################
++-- event network to monitor changes/hotplug (NEW)
++-- only needs to be set if "ip_source"="web" or "script"
++-- if "ip_source"="network" or "interface" we use their network
++eif6 = ns:taboption("advanced", ListValue, "ipv6_interface",
++ translate("Event Network") .. " [IPv6]" )
++eif6:depends("ipv6_source", "web")
++eif6:depends("ipv6_source", "script")
++eif6.default = "wan6"
++WADM.cbi_add_networks(eif6)
++if not has_ipv6 then
++ eif6.description = err_ipv6_other
++else
++ eif6.description = translate("Network on which the ddns-updater scripts will be started")
++end
++function eif6.cfgvalue(self, section)
++ return DDNS.read_value(self, section, "interface")
++end
++function eif6.validate(self, value)
++ if usev6:formvalue(section) == "0"
++ or src4:formvalue(section) == "network"
++ or src4:formvalue(section) == "interface" then
++ return "" -- ignore IPv4, network, interface
++ elseif not has_ipv6 then
++ return nil, err_tab_adv(self) .. err_ipv6_plain
++ else
++ return value
++ end
++end
++function eif6.write(self, section, value)
++ if usev6:formvalue(section) == "0"
++ or src4:formvalue(section) == "network"
++ or src4:formvalue(section) == "interface" then
++ return true -- ignore IPv4, network, interface
++ else
++ self.map:del(section, self.option) -- delete "ipv6_interface" helper
++ return self.map:set(section, "interface", value) -- and write "interface"
++ end
++end
++
++-- IPv4/IPv6 - bind_network -- #################################################
++if has_ssl or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then
++ bnet = ns:taboption("advanced", ListValue, "bind_network",
++ translate("Bind Network") )
++ bnet:depends("ipv4_source", "web")
++ bnet:depends("ipv6_source", "web")
++ bnet.rmempty = true
++ bnet.default = ""
++ bnet:value("", translate("-- default --"))
++ WADM.cbi_add_networks(bnet)
++ function bnet.cfgvalue(self, section)
++ local value = AbstractValue.cfgvalue(self, section)
++ if not has_ssl 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
++ else
++ self.description = translate("OPTIONAL: Network to use for communication") ..
++ "<br />" .. translate("Casual users should not change this setting")
++ end
++ return value
++ end
++ function bnet.validate(self, value)
++ if (value ~= "" and has_ssl ) or value == "" then return value end
++ return nil, err_tab_adv(self) .. translate("Binding to a specific network not supported") .. " !"
++ end
++end
++
++-- IPv4 + IPv6 - force_ipversion (NEW) -- ######################################
++-- optional to force wget/curl and host to use only selected IP version
++-- command parameter "-4" or "-6"
++if has_force 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 has_force and value ~= "0" then
++ self.description = bold_on .. font_red ..
++ translate("Force IP Version not supported") .. font_off .. "<br />" ..
++ translate("please disable") .. " !" .. bold_off
++ else
++ self.description = translate("OPTIONAL: Force the usage of pure IPv4/IPv6 only communication.")
++ end
++ return value
++ end
++ function fipv.validate(self, value)
++ if (value == "1" and has_force) or value == "0" then return value end
++ return nil, err_tab_adv(self) .. translate("Force IP Version not supported")
++ end
++ function fipv.parse(self, section)
++ DDNS.flag_parse(self, section)
++ end
++ function fipv.write(self, section, value)
++ if value == "1" then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++ end
++end
++
++-- IPv4 + IPv6 - dns_server (NEW) -- ###########################################
++-- optional DNS Server to use resolving my IP if "ip_source"="web"
++dns = ns:taboption("advanced", Value, "dns_server",
++ translate("DNS-Server"),
++ translate("OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'.") .. "<br />" ..
++ translate("Format: IP or FQDN"))
++dns.placeholder = "mydns.lan"
++function dns.validate(self, value)
++ -- if .datatype is set, then it is checked before calling this function
++ if not value then
++ return "" -- ignore on empty
++ elseif not DTYP.host(value) then
++ return nil, err_tab_adv(self) .. translate("use hostname, FQDN, IPv4- or IPv6-Address")
++ else
++ local ipv6 = usev6:formvalue(section)
++ local force = (fipv) and fipv:formvalue(section) or "0"
++ local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh verify_dns ]] ..
++ value .. [[ ]] .. ipv6 .. [[ ]] .. force
++ local ret = SYS.call(command)
++ if ret == 0 then return value -- everything OK
++ elseif ret == 2 then return nil, err_tab_adv(self) .. translate("nslookup can not resolve host")
++ elseif ret == 3 then return nil, err_tab_adv(self) .. translate("nc (netcat) can not connect")
++ elseif ret == 4 then return nil, err_tab_adv(self) .. translate("Forced IP Version don't matched")
++ else return nil, err_tab_adv(self) .. translate("unspecific error")
++ end
++ end
++end
++
++-- IPv4 + IPv6 - force_dnstcp (NEW) -- #########################################
++if has_dnstcp 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 has_dnstcp 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
++ else
++ self.description = translate("OPTIONAL: Force the use of TCP instead of default UDP on DNS requests.")
++ end
++ return value
++ end
++ function tcp.validate(self, value)
++ if (value == "1" and has_dnstcp ) or value == "0" then
++ return value
++ end
++ return nil, err_tab_adv(self) .. translate("DNS requests via TCP not supported")
++ end
++ function tcp.parse(self, section)
++ DDNS.flag_parse(self, section)
++ end
++end
++
++-- IPv4 + IPv6 - proxy (NEW) -- ################################################
++-- optional Proxy to use for http/https requests [user:password@]proxyhost[:port]
++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 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
++ else
++ self.description = translate("OPTIONAL: Proxy-Server for detection and updates.") .. "<br />" ..
++ translate("Format") .. ": " .. bold_on .. "[user:password@]proxyhost:port" .. bold_off .. "<br />" ..
++ translate("IPv6 address must be given in square brackets") .. ": " ..
++ bold_on .. " [2001:db8::1]:8080" .. bold_off
++ end
++ return value
++ end
++ function pxy.validate(self, value)
++ -- if .datatype is set, then it is checked before calling this function
++ if not value then
++ return "" -- ignore on empty
++ elseif has_proxy then
++ local ipv6 = usev6:formvalue(section) or "0"
++ local force = (fipv) and fipv:formvalue(section) or "0"
++ local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh verify_proxy ]] ..
++ value .. [[ ]] .. ipv6 .. [[ ]] .. force
++ local ret = SYS.call(command)
++ if ret == 0 then return value
++ elseif ret == 2 then return nil, err_tab_adv(self) .. translate("nslookup can not resolve host")
++ elseif ret == 3 then return nil, err_tab_adv(self) .. translate("nc (netcat) can not connect")
++ elseif ret == 4 then return nil, err_tab_adv(self) .. translate("Forced IP Version don't matched")
++ elseif ret == 5 then return nil, err_tab_adv(self) .. translate("proxy port missing")
++ else return nil, err_tab_adv(self) .. translate("unspecific error")
++ end
++ else
++ return nil, err_tab_adv(self) .. translate("PROXY-Server not supported")
++ end
++ end
++end
++
++-- use_syslog -- ###############################################################
++slog = ns:taboption("advanced", ListValue, "use_syslog",
++ translate("Log to syslog"),
++ translate("Writes log messages to syslog. Critical Errors will always be written to syslog.") )
++slog.default = "2"
++slog:value("0", translate("No logging"))
++slog:value("1", translate("Info"))
++slog:value("2", translate("Notice"))
++slog:value("3", translate("Warning"))
++slog:value("4", translate("Error"))
++
++-- use_logfile (NEW) -- ########################################################
++logf = ns:taboption("advanced", Flag, "use_logfile",
++ translate("Log to file"),
++ translate("Writes detailed messages to log file. File will be truncated automatically.") .. "<br />" ..
++ translate("File") .. [[: "]] .. log_dir .. [[/]] .. section .. [[.log"]] )
++logf.orientation = "horizontal"
++logf.rmempty = false -- we want to save in /etc/config/ddns file on "0" because
++logf.default = "1" -- if not defined write to log by default
++function logf.parse(self, section)
++ DDNS.flag_parse(self, section)
++end
++
++-- TAB: Timer #####################################################################################
++-- check_interval -- ###########################################################
++ci = ns:taboption("timer", Value, "check_interval",
++ translate("Check Interval") )
++ci.template = "ddns/detail_value"
++ci.default = 10
++ci.rmempty = false -- validate ourselves for translatable error messages
++function ci.validate(self, value)
++ if not DTYP.uinteger(value)
++ or tonumber(value) < 1 then
++ return nil, err_tab_timer(self) .. translate("minimum value 5 minutes == 300 seconds")
++ end
++
++ local secs = DDNS.calc_seconds(value, cu:formvalue(section))
++ if secs >= 300 then
++ return value
++ else
++ return nil, err_tab_timer(self) .. translate("minimum value 5 minutes == 300 seconds")
++ end
++end
++function ci.write(self, section, value)
++ -- simulate rmempty=true remove default
++ local secs = DDNS.calc_seconds(value, cu:formvalue(section))
++ if secs ~= 600 then --default 10 minutes
++ return self.map:set(section, self.option, value)
++ else
++ self.map:del(section, "check_unit")
++ return self.map:del(section, self.option)
++ end
++end
++
++-- check_unit -- ###############################################################
++cu = ns:taboption("timer", ListValue, "check_unit", "not displayed, but needed otherwise error",
++ translate("Interval to check for changed IP" .. "<br />" ..
++ "Values below 5 minutes == 300 seconds are not supported") )
++cu.template = "ddns/detail_lvalue"
++cu.default = "minutes"
++cu.rmempty = false -- want to control write process
++cu:value("seconds", translate("seconds"))
++cu:value("minutes", translate("minutes"))
++cu:value("hours", translate("hours"))
++--cu:value("days", translate("days"))
++function cu.write(self, section, value)
++ -- simulate rmempty=true remove default
++ local secs = DDNS.calc_seconds(ci:formvalue(section), value)
++ if secs ~= 600 then --default 10 minutes
++ return self.map:set(section, self.option, value)
++ else
++ return true
++ end
++end
++
++-- force_interval (modified) -- ################################################
++fi = ns:taboption("timer", Value, "force_interval",
++ translate("Force Interval") )
++fi.template = "ddns/detail_value"
++fi.default = 72 -- see dynamic_dns_updater.sh script
++fi.rmempty = false -- validate ourselves for translatable error messages
++function fi.validate(self, value)
++ if not DTYP.uinteger(value)
++ or tonumber(value) < 0 then
++ return nil, err_tab_timer(self) .. translate("minimum value '0'")
++ end
++
++ local force_s = DDNS.calc_seconds(value, fu:formvalue(section))
++ if force_s == 0 then
++ return value
++ end
++
++ local ci_value = ci:formvalue(section)
++ if not DTYP.uinteger(ci_value) then
++ return "" -- ignore because error in check_interval above
++ end
++
++ local check_s = DDNS.calc_seconds(ci_value, cu:formvalue(section))
++ if force_s >= check_s then
++ return value
++ end
++
++ return nil, err_tab_timer(self) .. translate("must be greater or equal 'Check Interval'")
++end
++function fi.write(self, section, value)
++ -- simulate rmempty=true remove default
++ local secs = DDNS.calc_seconds(value, fu:formvalue(section))
++ if secs ~= 259200 then --default 72 hours == 3 days
++ return self.map:set(section, self.option, value)
++ else
++ self.map:del(section, "force_unit")
++ return self.map:del(section, self.option)
++ end
++end
++
++-- force_unit -- ###############################################################
++fu = ns:taboption("timer", ListValue, "force_unit", "not displayed, but needed otherwise error",
++ translate("Interval to force updates send to DDNS Provider" .. "<br />" ..
++ "Setting this parameter to 0 will force the script to only run once" .. "<br />" ..
++ "Values lower 'Check Interval' except '0' are not supported") )
++fu.template = "ddns/detail_lvalue"
++fu.default = "hours"
++fu.rmempty = false -- want to control write process
++--fu:value("seconds", translate("seconds"))
++fu:value("minutes", translate("minutes"))
++fu:value("hours", translate("hours"))
++fu:value("days", translate("days"))
++function fu.write(self, section, value)
++ -- simulate rmempty=true remove default
++ local secs = DDNS.calc_seconds(fi:formvalue(section), value)
++ if secs ~= 259200 and secs ~= 0 then --default 72 hours == 3 days
++ return self.map:set(section, self.option, value)
++ else
++ return true
++ end
++end
++
++-- retry_count (NEW) -- ########################################################
++rc = ns:taboption("timer", Value, "retry_count")
++rc.title = translate("Error Retry Counter")
++rc.description = translate("On Error the script will stop execution after given number of retrys")
++ .. "<br />"
++ .. translate("The default setting of '0' will retry infinite.")
++rc.default = 0
++rc.rmempty = false -- validate ourselves for translatable error messages
++function rc.validate(self, value)
++ if not DTYP.uinteger(value) then
++ return nil, err_tab_timer(self) .. translate("minimum value '0'")
++ else
++ return value
++ end
++end
++function rc.write(self, section, value)
++ -- simulate rmempty=true remove default
++ if tonumber(value) ~= self.default then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++end
++
++-- retry_interval -- ###########################################################
++ri = ns:taboption("timer", Value, "retry_interval",
++ translate("Error Retry Interval") )
++ri.template = "ddns/detail_value"
++ri.default = 60
++ri.rmempty = false -- validate ourselves for translatable error messages
++function ri.validate(self, value)
++ if not DTYP.uinteger(value)
++ or tonumber(value) < 1 then
++ return nil, err_tab_timer(self) .. translate("minimum value '1'")
++ else
++ return value
++ end
++end
++function ri.write(self, section, value)
++ -- simulate rmempty=true remove default
++ local secs = DDNS.calc_seconds(value, ru:formvalue(section))
++ if secs ~= 60 then --default 60seconds
++ return self.map:set(section, self.option, value)
++ else
++ self.map:del(section, "retry_unit")
++ return self.map:del(section, self.option)
++ end
++end
++
++-- retry_unit -- ###############################################################
++ru = ns:taboption("timer", ListValue, "retry_unit", "not displayed, but needed otherwise error",
++ translate("On Error the script will retry the failed action after given time") )
++ru.template = "ddns/detail_lvalue"
++ru.default = "seconds"
++ru.rmempty = false -- want to control write process
++ru:value("seconds", translate("seconds"))
++ru:value("minutes", translate("minutes"))
++--ru:value("hours", translate("hours"))
++--ru:value("days", translate("days"))
++function ru.write(self, section, value)
++ -- simulate rmempty=true remove default
++ local secs = DDNS.calc_seconds(ri:formvalue(section), value)
++ if secs ~= 60 then --default 60seconds
++ return self.map:set(section, self.option, value)
++ else
++ return true -- will be deleted by retry_interval
++ end
++end
++
++-- TAB: LogView (NEW) #############################################################################
++lv = ns:taboption("logview", DummyValue, "_logview")
++lv.template = "ddns/detail_logview"
++lv.inputtitle = translate("Read / Reread log file")
++lv.rows = 50
++function lv.cfgvalue(self, section)
++ local lfile=log_dir .. "/" .. section .. ".log"
++ if NXFS.access(lfile) then
++ return lfile .. "\n" .. translate("Please press [Read] button")
++ end
++ return lfile .. "\n" .. translate("File not found or empty")
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/global.lua b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/global.lua
+new file mode 100644
+index 0000000..25d09b7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/global.lua
+@@ -0,0 +1,155 @@
++-- Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++-- Licensed to the public under the Apache License 2.0.
++
++local NX = require "nixio"
++local NXFS = require "nixio.fs"
++local DISP = require "luci.dispatcher"
++local SYS = require "luci.sys"
++local DDNS = require "luci.tools.ddns" -- ddns multiused functions
++
++-- cbi-map definition -- #######################################################
++local m = Map("ddns")
++
++m.title = [[<a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]]
++ .. translate("Dynamic DNS") .. [[</a>]]
++
++m.description = translate("Dynamic DNS allows that your router can be reached with " ..
++ "a fixed hostname while having a dynamically changing IP address.")
++
++m.redirect = DISP.build_url("admin", "services", "ddns")
++
++function m.commit_handler(self)
++ if self.changed then -- changes ?
++ os.execute("/etc/init.d/ddns reload &") -- reload configuration
++ end
++end
++
++-- cbi-section definition -- ###################################################
++local ns = m:section( NamedSection, "global", "ddns",
++ translate("Global Settings"),
++ translate("Configure here the details for all Dynamic DNS services including this LuCI application.")
++ .. [[<br /><strong>]]
++ .. translate("It is NOT recommended for casual users to change settings on this page.")
++ .. [[</strong><br />]]
++ .. [[<a href="http://wiki.openwrt.org/doc/uci/ddns#version_2x1" target="_blank">]]
++ .. translate("For detailed information about parameter settings look here.")
++ .. [[</a>]]
++ )
++
++-- section might not exist
++function ns.cfgvalue(self, section)
++ if not self.map:get(section) then
++ self.map:set(section, nil, self.sectiontype)
++ end
++ return self.map:get(section)
++end
++
++-- allow_local_ip -- ##########################################################
++local ali = ns:option(Flag, "allow_local_ip")
++ali.title = translate("Allow non-public IP's")
++ali.description = translate("Non-public and by default blocked IP's") .. ":"
++ .. [[<br /><strong>IPv4: </strong>]]
++ .. "0/8, 10/8, 100.64/10, 127/8, 169.254/16, 172.16/12, 192.168/16"
++ .. [[<br /><strong>IPv6: </strong>]]
++ .. "::/32, f000::/4"
++ali.reempty = true
++ali.default = "0"
++function ali.parse(self, section)
++ DDNS.flag_parse(self, section)
++end
++function ali.validate(self, value)
++ if value == self.default then
++ return "" -- default = empty
++ end
++ return value
++end
++
++-- date_format -- #############################################################
++local df = ns:option(Value, "date_format")
++df.title = translate("Date format")
++df.description = [[<a href="http://www.cplusplus.com/reference/ctime/strftime/" target="_blank">]]
++ .. translate("For supported codes look here")
++ .. [[</a>]]
++df.template = "ddns/global_value"
++df.rmempty = true
++df.default = "%F %R"
++df.date_string = ""
++function df.cfgvalue(self, section)
++ local value = AbstractValue.cfgvalue(self, section) or self.default
++ local epoch = os.time()
++ self.date_string = DDNS.epoch2date(epoch, value)
++ return value
++end
++function df.validate(self, value)
++ if value == self.default then
++ return "" -- default = empty
++ end
++ return value
++end
++
++-- run_dir -- #################################################################
++local rd = ns:option(Value, "run_dir")
++rd.title = translate("Status directory")
++rd.description = translate("Directory contains PID and other status information for each running section")
++rd.rmempty = true
++rd.default = "/var/run/ddns"
++function rd.validate(self, value)
++ if value == self.default then
++ return "" -- default = empty
++ end
++ return value
++end
++
++-- log_dir -- #################################################################
++local ld = ns:option(Value, "log_dir")
++ld.title = translate("Log directory")
++ld.description = translate("Directory contains Log files for each running section")
++ld.rmempty = true
++ld.default = "/var/log/ddns"
++function ld.validate(self, value)
++ if value == self.default then
++ return "" -- default = empty
++ end
++ return value
++end
++
++-- log_lines -- ###############################################################
++local ll = ns:option(Value, "log_lines")
++ll.title = translate("Log length")
++ll.description = translate("Number of last lines stored in log files")
++ll.rmempty = true
++ll.default = "250"
++function ll.validate(self, value)
++ local n = tonumber(value)
++ if not n or math.floor(n) ~= n or n < 1 then
++ return nil, self.title .. ": " .. translate("minimum value '1'")
++ end
++ if value == self.default then
++ return "" -- default = empty
++ end
++ return value
++end
++
++-- use_curl -- ################################################################
++if (SYS.call([[ grep -i "\+ssl" /usr/bin/wget >/dev/null 2>&1 ]]) == 0)
++and NXFS.access("/usr/bin/curl") then
++ local pc = ns:option(Flag, "use_curl")
++ pc.title = translate("Use cURL")
++ pc.description = translate("If both cURL and GNU Wget are installed, Wget is used by default.")
++ .. [[<br />]]
++ .. translate("To use cURL activate this option.")
++ pc.orientation = "horizontal"
++ pc.rmempty = true
++ pc.default = "0"
++ function pc.parse(self, section)
++ DDNS.flag_parse(self, section)
++ end
++ function pc.validate(self, value)
++ if value == self.default then
++ return "" -- default = empty
++ end
++ return value
++ end
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua
+new file mode 100644
+index 0000000..2a65fd0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua
+@@ -0,0 +1,152 @@
++-- Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++-- Licensed to the public under the Apache License 2.0.
++
++local CTRL = require "luci.controller.ddns" -- this application's controller
++local DISP = require "luci.dispatcher"
++local SYS = require "luci.sys"
++local DDNS = require "luci.tools.ddns" -- ddns multiused functions
++
++-- check supported options -- ##################################################
++-- saved to local vars here because doing multiple os calls slow down the system
++has_ssl = DDNS.check_ssl() -- HTTPS support and --bind-network / --interface
++has_proxy = DDNS.check_proxy() -- Proxy support
++has_dnstcp = DDNS.check_bind_host() -- DNS TCP support
++-- correct ddns-scripts version
++need_update = DDNS.ipkg_ver_compare(DDNS.ipkg_ver_installed("ddns-scripts"), "<<", CTRL.DDNS_MIN)
++
++-- html constants
++font_red = [[<font color="red">]]
++font_off = [[</font>]]
++bold_on = [[<strong>]]
++bold_off = [[</strong>]]
++
++-- cbi-map definition -- #######################################################
++m = Map("ddns")
++
++m.title = [[<a href="]] .. DISP.build_url("admin", "services", "ddns") .. [[">]] ..
++ translate("Dynamic DNS") .. [[</a>]]
++
++m.description = translate("Dynamic DNS allows that your router can be reached with " ..
++ "a fixed hostname while having a dynamically changing " ..
++ "IP address.")
++
++m.redirect = DISP.build_url("admin", "services", "ddns")
++
++-- SimpleSection definition -- #################################################
++-- show Hints to optimize installation and script usage
++s = m:section( SimpleSection,
++ translate("Hints"),
++ translate("Below a list of configuration tips for your system to run Dynamic DNS updates without limitations") )
++
++-- ddns_scripts needs to be updated for full functionality
++if need_update then
++ local dv = s:option(DummyValue, "_update_needed")
++ dv.titleref = DISP.build_url("admin", "system", "packages")
++ dv.rawhtml = true
++ dv.title = font_red .. bold_on ..
++ translate("Software update required") .. bold_off .. font_off
++ dv.value = translate("The currently installed 'ddns-scripts' package did not support all available settings.") ..
++ "<br />" ..
++ translate("Please update to the current version!")
++end
++
++-- DDNS Service disabled
++if not SYS.init.enabled("ddns") then
++ local dv = s:option(DummyValue, "_not_enabled")
++ dv.titleref = DISP.build_url("admin", "system", "startup")
++ dv.rawhtml = true
++ dv.title = bold_on ..
++ translate("DDNS Autostart disabled") .. bold_off
++ dv.value = translate("Currently DDNS updates are not started at boot or on interface events." .. "<br />" ..
++ "This is the default if you run DDNS scripts by yourself (i.e. via cron with force_interval set to '0')" )
++end
++
++-- No IPv6 support
++if not DDNS.check_ipv6() then
++ local dv = s:option(DummyValue, "_no_ipv6")
++ dv.titleref = 'http://www.openwrt.org" target="_blank'
++ dv.rawhtml = true
++ dv.title = bold_on ..
++ translate("IPv6 not supported") .. bold_off
++ dv.value = translate("IPv6 is currently not (fully) supported by this system" .. "<br />" ..
++ "Please follow the instructions on OpenWrt's homepage to enable IPv6 support" .. "<br />" ..
++ "or update your system to the latest OpenWrt Release")
++end
++
++-- No HTTPS support
++if not has_ssl then
++ local dv = s:option(DummyValue, "_no_https")
++ dv.titleref = DISP.build_url("admin", "system", "packages")
++ dv.rawhtml = true
++ dv.title = bold_on ..
++ translate("HTTPS not supported") .. bold_off
++ dv.value = translate("Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS protocol.") ..
++ "<br />- " ..
++ translate("You should install GNU Wget with SSL (prefered) or cURL package.") ..
++ "<br />- " ..
++ translate("In some versions cURL/libcurl in OpenWrt is compiled without proxy support.")
++end
++
++-- No bind_network
++if not has_ssl then
++ local dv = s:option(DummyValue, "_no_bind_network")
++ dv.titleref = DISP.build_url("admin", "system", "packages")
++ dv.rawhtml = true
++ dv.title = bold_on ..
++ translate("Binding to a specific network not supported") .. bold_off
++ dv.value = translate("Neither GNU Wget with SSL nor cURL installed to select a network to use for communication.") ..
++ "<br />- " ..
++ translate("You should install GNU Wget with SSL or cURL package.") ..
++ "<br />- " ..
++ translate("GNU Wget will use the IP of given network, cURL will use the physical interface.") ..
++ "<br />- " ..
++ translate("In some versions cURL/libcurl in OpenWrt is compiled without proxy support.")
++end
++
++-- cURL without proxy support
++if has_ssl and not has_proxy then
++ local dv = s:option(DummyValue, "_no_proxy")
++ dv.titleref = DISP.build_url("admin", "system", "packages")
++ dv.rawhtml = true
++ dv.title = bold_on ..
++ translate("cURL without Proxy Support") .. bold_off
++ dv.value = translate("cURL is installed, but libcurl was compiled without proxy support.") ..
++ "<br />- " ..
++ translate("You should install GNU Wget with SSL or replace libcurl.") ..
++ "<br />- " ..
++ translate("In some versions cURL/libcurl in OpenWrt is compiled without proxy support.")
++end
++
++-- "Force IP Version not supported"
++if not (has_ssl and has_dnstcp) then
++ local dv = s:option(DummyValue, "_no_force_ip")
++ dv.titleref = DISP.build_url("admin", "system", "packages")
++ dv.rawhtml = true
++ dv.title = bold_on ..
++ 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 has_ssl then
++ value = value .. "<br />- " ..
++ translate("You should install GNU Wget with SSL (prefered) or cURL package.")
++ end
++ if not has_dnstcp then
++ value = value .. "<br />- " ..
++ translate("You should install BIND host package for DNS requests.")
++ end
++ dv.value = value
++end
++
++-- "DNS requests via TCP not supported"
++if not has_dnstcp then
++ local dv = s:option(DummyValue, "_no_dnstcp")
++ dv.titleref = DISP.build_url("admin", "system", "packages")
++ dv.rawhtml = true
++ dv.title = bold_on ..
++ translate("DNS requests via TCP not supported") .. bold_off
++ dv.value = translate("BusyBox's nslookup does not support to specify to use TCP instead of default UDP when requesting DNS server") ..
++ "<br />- " ..
++ translate("You should install BIND host package for DNS requests.")
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua
+new file mode 100644
+index 0000000..5b5925b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua
+@@ -0,0 +1,256 @@
++-- Copyright 2014 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 CTRL = require "luci.controller.ddns" -- this application's controller
++local DISP = require "luci.dispatcher"
++local HTTP = require "luci.http"
++local SYS = require "luci.sys"
++local DDNS = require "luci.tools.ddns" -- ddns multiused functions
++
++-- show hints ?
++show_hints = not (DDNS.check_ipv6() -- IPv6 support
++ and DDNS.check_ssl() -- HTTPS support
++ and DDNS.check_proxy() -- Proxy support
++ and DDNS.check_bind_host() -- DNS TCP support
++ )
++-- correct ddns-scripts version
++need_update = DDNS.ipkg_ver_compare(DDNS.ipkg_ver_installed("ddns-scripts"), "<<", CTRL.DDNS_MIN)
++
++-- html constants
++font_red = [[<font color="red">]]
++font_off = [[</font>]]
++bold_on = [[<strong>]]
++bold_off = [[</strong>]]
++
++-- cbi-map definition -- #######################################################
++m = Map("ddns")
++
++m.title = [[<a href="javascript:alert(']]
++ .. translate("Version Information")
++ .. [[\n\nluci-app-ddns]]
++ .. [[\n\t]] .. translate("Version") .. [[:\t]] .. DDNS.ipkg_ver_installed("luci-app-ddns")
++ .. [[\n\nddns-scripts ]] .. translate("required") .. [[:]]
++ .. [[\n\t]] .. translate("Version") .. [[:\t]] .. CTRL.DDNS_MIN .. [[ ]] .. translate("or higher")
++ .. [[\n\nddns-scripts ]] .. translate("installed") .. [[:]]
++ .. [[\n\t]] .. translate("Version") .. [[:\t]] .. DDNS.ipkg_ver_installed("ddns-scripts")
++ .. [[\n\n]]
++ .. [[')">]]
++ .. translate("Dynamic DNS") .. [[</a>]]
++
++m.description = translate("Dynamic DNS allows that your router can be reached with " ..
++ "a fixed hostname while having a dynamically changing " ..
++ "IP address.")
++
++m.on_after_commit = function(self)
++ if self.changed then -- changes ?
++ if SYS.init.enabled("ddns") then -- ddns service enabled, restart all
++ os.execute("/etc/init.d/ddns restart")
++ else -- ddns service disabled, send SIGHUP to running
++ os.execute("killall -1 dynamic_dns_updater.sh")
++ end
++ end
++end
++
++-- SimpleSection definiton -- ##################################################
++-- with all the JavaScripts we need for "a good Show"
++a = m:section( SimpleSection )
++a.template = "ddns/overview_status"
++
++-- SimpleSection definition -- #################################################
++-- show Hints to optimize installation and script usage
++-- only show if service not enabled
++-- or no IPv6 support
++-- or not GNU Wget and not cURL (for https support)
++-- or not GNU Wget but cURL without proxy support
++-- or not BIND's host
++-- or ddns-scripts package need update
++if show_hints or need_update or not SYS.init.enabled("ddns") then
++ s = m:section( SimpleSection, translate("Hints") )
++
++ -- ddns_scripts needs to be updated for full functionality
++ if need_update then
++ local dv = s:option(DummyValue, "_update_needed")
++ dv.titleref = DISP.build_url("admin", "system", "packages")
++ dv.rawhtml = true
++ dv.title = font_red .. bold_on ..
++ translate("Software update required") .. bold_off .. font_off
++ dv.value = translate("The currently installed 'ddns-scripts' package did not support all available settings.") ..
++ "<br />" ..
++ translate("Please update to the current version!")
++ end
++
++ -- DDNS Service disabled
++ if not SYS.init.enabled("ddns") then
++ local dv = s:option(DummyValue, "_not_enabled")
++ dv.titleref = DISP.build_url("admin", "system", "startup")
++ dv.rawhtml = true
++ dv.title = bold_on ..
++ translate("DDNS Autostart disabled") .. bold_off
++ dv.value = translate("Currently DDNS updates are not started at boot or on interface events." .. "<br />" ..
++ "You can start/stop each configuration here. It will run until next reboot.")
++ end
++
++ -- Show more hints on a separate page
++ if show_hints then
++ local dv = s:option(DummyValue, "_separate")
++ dv.titleref = DISP.build_url("admin", "services", "ddns", "hints")
++ dv.rawhtml = true
++ dv.title = bold_on ..
++ translate("Show more") .. bold_off
++ dv.value = translate("Follow this link" .. "<br />" ..
++ "You will find more hints to optimize your system to run DDNS scripts with all options")
++ end
++end
++
++-- TableSection definition -- ##################################################
++ts = m:section( TypedSection, "service",
++ translate("Overview"),
++ translate("Below is a list of configured DDNS configurations and their current state.")
++ .. "<br />"
++ .. translate("If you want to send updates for IPv4 and IPv6 you need to define two separate Configurations "
++ .. "i.e. 'myddns_ipv4' and 'myddns_ipv6'")
++ .. "<br />"
++ .. [[<a href="]] .. DISP.build_url("admin", "services", "ddns", "global") .. [[">]]
++ .. translate("To change global settings click here") .. [[</a>]] )
++ts.sectionhead = translate("Configuration")
++ts.template = "cbi/tblsection"
++ts.addremove = true
++ts.extedit = DISP.build_url("admin", "services", "ddns", "detail", "%s")
++function ts.create(self, name)
++ AbstractSection.create(self, name)
++ HTTP.redirect( self.extedit:format(name) )
++end
++
++-- Domain and registered IP -- #################################################
++dom = ts:option(DummyValue, "_domainIP",
++ translate("Hostname/Domain") .. "<br />" .. translate("Registered IP") )
++dom.template = "ddns/overview_doubleline"
++function dom.set_one(self, section)
++ local domain = self.map:get(section, "domain") or ""
++ if domain ~= "" then
++ return domain
++ else
++ return [[<em>]] .. translate("config error") .. [[</em>]]
++ end
++end
++function dom.set_two(self, section)
++ local domain = self.map:get(section, "domain") or ""
++ if domain == "" then return "" end
++ local dnsserver = self.map:get(section, "dnsserver") or ""
++ local use_ipv6 = tonumber(self.map:get(section, "use_ipv6") or 0)
++ local force_ipversion = tonumber(self.map:get(section, "force_ipversion") or 0)
++ local force_dnstcp = tonumber(self.map:get(section, "force_dnstcp") or 0)
++ local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh]]
++ if not NXFS.access(command, "rwx", "rx", "rx") then
++ NXFS.chmod(command, 755)
++ end
++ command = command .. [[ get_registered_ip ]] .. domain .. [[ ]] .. use_ipv6 ..
++ [[ ]] .. force_ipversion .. [[ ]] .. force_dnstcp .. [[ ]] .. dnsserver
++ local ip = SYS.exec(command)
++ if ip == "" then ip = translate("no data") end
++ return ip
++end
++
++-- enabled
++ena = ts:option( Flag, "enabled",
++ translate("Enabled"))
++ena.template = "ddns/overview_enabled"
++ena.rmempty = false
++function ena.parse(self, section)
++ DDNS.flag_parse(self, section)
++end
++
++-- show PID and next update
++upd = ts:option( DummyValue, "_update",
++ translate("Last Update") .. "<br />" .. translate("Next Update"))
++upd.template = "ddns/overview_doubleline"
++function upd.set_one(self, section) -- fill Last Update
++ -- get/validate last update
++ local uptime = SYS.uptime()
++ local lasttime = DDNS.get_lastupd(section)
++ if lasttime > uptime then -- /var might not be linked to /tmp and cleared on reboot
++ lasttime = 0
++ end
++
++ -- no last update happen
++ if lasttime == 0 then
++ return translate("never")
++
++ -- we read last update
++ else
++ -- calc last update
++ -- os.epoch - sys.uptime + lastupdate(uptime)
++ local epoch = os.time() - uptime + lasttime
++ -- use linux date to convert epoch
++ return DDNS.epoch2date(epoch)
++ end
++end
++function upd.set_two(self, section) -- fill Next Update
++ -- get enabled state
++ local enabled = tonumber(self.map:get(section, "enabled") or 0)
++ local datenext = translate("unknown error") -- formatted date of next update
++
++ -- get force seconds
++ local force_interval = tonumber(self.map:get(section, "force_interval") or 72)
++ local force_unit = self.map:get(section, "force_unit") or "hours"
++ local force_seconds = DDNS.calc_seconds(force_interval, force_unit)
++
++ -- get last update and get/validate PID
++ local uptime = SYS.uptime()
++ local lasttime = DDNS.get_lastupd(section)
++ if lasttime > uptime then -- /var might not be linked to /tmp and cleared on reboot
++ lasttime = 0
++ end
++ local pid = DDNS.get_pid(section)
++
++ -- calc next update
++ if lasttime > 0 then
++ local epoch = os.time() - uptime + lasttime + force_seconds
++ -- use linux date to convert epoch
++ datelast = DDNS.epoch2date(epoch)
++ end
++
++ -- process running but update needs to happen
++ if pid > 0 and ( lasttime + force_seconds - uptime ) < 0 then
++ datenext = translate("Verify")
++
++ -- run once
++ elseif force_seconds == 0 then
++ datenext = translate("Run once")
++
++ -- no process running and NOT enabled
++ elseif pid == 0 and enabled == 0 then
++ datenext = translate("Disabled")
++
++ -- no process running and NOT
++ elseif pid == 0 and enabled ~= 0 then
++ datenext = translate("Stopped")
++ end
++
++ return datenext
++end
++
++-- start/stop button
++btn = ts:option( Button, "_startstop",
++ translate("Process ID") .. "<br />" .. translate("Start / Stop") )
++btn.template = "ddns/overview_startstop"
++function btn.cfgvalue(self, section)
++ local pid = DDNS.get_pid(section)
++ if pid > 0 then
++ btn.inputtitle = "PID: " .. pid
++ btn.inputstyle = "reset"
++ btn.disabled = false
++ elseif (self.map:get(section, "enabled") or "0") ~= "0" then
++ btn.inputtitle = translate("Start")
++ btn.inputstyle = "apply"
++ btn.disabled = false
++ else
++ btn.inputtitle = "----------"
++ btn.inputstyle = "button"
++ btn.disabled = true
++ end
++ return true
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/tools/ddns.lua b/feeds/luci/applications/luci-app-ddns/luasrc/tools/ddns.lua
+new file mode 100644
+index 0000000..4466063
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/tools/ddns.lua
+@@ -0,0 +1,303 @@
++-- Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++-- Licensed to the public under the Apache License 2.0.
++
++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"
++
++-- function to calculate seconds from given interval and unit
++function calc_seconds(interval, unit)
++ if not tonumber(interval) then
++ return nil
++ elseif unit == "days" then
++ return (tonumber(interval) * 86400) -- 60 sec * 60 min * 24 h
++ elseif unit == "hours" then
++ return (tonumber(interval) * 3600) -- 60 sec * 60 min
++ elseif unit == "minutes" then
++ return (tonumber(interval) * 60) -- 60 sec
++ elseif unit == "seconds" then
++ return tonumber(interval)
++ else
++ return nil
++ end
++end
++
++-- check if IPv6 supported by OpenWrt
++function check_ipv6()
++ return NXFS.access("/proc/net/ipv6_route")
++ and NXFS.access("/usr/sbin/ip6tables")
++end
++
++-- check if Wget with SSL support or cURL installed
++function check_ssl()
++ if (SYS.call([[ grep -i "\+ssl" /usr/bin/wget >/dev/null 2>&1 ]]) == 0) then
++ return true
++ else
++ return NXFS.access("/usr/bin/curl")
++ end
++end
++
++-- check if Wget with SSL or cURL with proxy support installed
++function check_proxy()
++ -- we prefere GNU Wget for communication
++ if (SYS.call([[ grep -i "\+ssl" /usr/bin/wget >/dev/null 2>&1 ]]) == 0) then
++ return true
++
++ -- if not installed cURL must support proxy
++ elseif NXFS.access("/usr/bin/curl") then
++ return (SYS.call([[ grep -i all_proxy /usr/lib/libcurl.so* >/dev/null 2>&1 ]]) == 0)
++
++ -- only BusyBox Wget is installed
++ else
++ return NXFS.access("/usr/bin/wget")
++ end
++end
++
++-- check if BIND host installed
++function check_bind_host()
++ return NXFS.access("/usr/bin/host")
++end
++
++-- convert epoch date to given format
++function epoch2date(epoch, format)
++ if not format or #format < 2 then
++ local uci = UCI.cursor()
++ format = uci:get("ddns", "global", "date_format") or "%F %R"
++ uci:unload("ddns")
++ end
++ format = format:gsub("%%n", "<br />") -- replace newline
++ format = format:gsub("%%t", " ") -- replace tab
++ return os.date(format, epoch)
++end
++
++-- read lastupdate from [section].update file
++function get_lastupd(section)
++ local uci = UCI.cursor()
++ local run_dir = uci:get("ddns", "global", "run_dir") or "/var/run/ddns"
++ local etime = tonumber(NXFS.readfile("%s/%s.update" % { run_dir, section } ) or 0 )
++ uci:unload("ddns")
++ return etime
++end
++
++-- read PID from run file and verify if still running
++function get_pid(section)
++ local uci = UCI.cursor()
++ local run_dir = uci:get("ddns", "global", "run_dir") or "/var/run/ddns"
++ local pid = tonumber(NXFS.readfile("%s/%s.pid" % { run_dir, section } ) or 0 )
++ if pid > 0 and not NX.kill(pid, 0) then
++ pid = 0
++ end
++ uci:unload("ddns")
++ return pid
++end
++
++-- compare versions using "<=" "<" ">" ">=" "=" "<<" ">>"
++function ipkg_ver_compare(ver1, comp, ver2)
++ if not ver1 or not ver2
++ or not comp or not (#comp > 0) then return nil end
++ -- correct compare string
++ if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~="
++ elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<="
++ elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">="
++ elseif comp == "=" or comp == "==" then comp = "=="
++ elseif comp == "<<" then comp = "<"
++ elseif comp == ">>" then comp = ">"
++ else return nil end
++
++ local av1 = UTIL.split(ver1, "[%.%-]", nil, true)
++ local av2 = UTIL.split(ver2, "[%.%-]", nil, true)
++
++ for i = 1, math.max(table.getn(av1),table.getn(av2)), 1 do
++ local s1 = av1[i] or ""
++ local s2 = av2[i] or ""
++
++ -- first "not equal" found return true
++ if comp == "~=" and (s1 ~= s2) then return true end
++ -- first "lower" found return true
++ if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
++ -- first "greater" found return true
++ if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
++ -- not equal then return false
++ if (s1 ~= s2) then return false end
++ end
++
++ -- all equal and not compare greater or lower then true
++ return not (comp == "<" or comp == ">")
++end
++
++-- read version information for given package if installed
++function ipkg_ver_installed(pkg)
++ local version = nil
++ local control = io.open("/usr/lib/opkg/info/%s.control" % pkg, "r")
++ if control then
++ local ln
++ repeat
++ ln = control:read("*l")
++ if ln and ln:match("^Version: ") then
++ version = ln:gsub("^Version: ", "")
++ break
++ end
++ until not ln
++ control:close()
++ end
++ return version
++end
++
++-- replacement of build-in read of UCI option
++-- modified AbstractValue.cfgvalue(self, section) from cbi.lua
++-- needed to read from other option then current value definition
++function read_value(self, section, option)
++ local value
++ if self.tag_error[section] then
++ value = self:formvalue(section)
++ else
++ value = self.map:get(section, option)
++ end
++
++ if not value then
++ return nil
++ elseif not self.cast or self.cast == type(value) then
++ return value
++ elseif self.cast == "string" then
++ if type(value) == "table" then
++ return value[1]
++ end
++ elseif self.cast == "table" then
++ return { value }
++ end
++end
++
++-- replacement of build-in Flag.parse of cbi.lua
++-- modified to mark section as changed if value changes
++-- current parse did not do this, but it is done AbstaractValue.parse()
++function flag_parse(self, section)
++ local fexists = self.map:formvalue(
++ luci.cbi.FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option)
++
++ if fexists then
++ local fvalue = self:formvalue(section) and self.enabled or self.disabled
++ local cvalue = self:cfgvalue(section)
++ if fvalue ~= self.default or (not self.optional and not self.rmempty) then
++ self:write(section, fvalue)
++ else
++ self:remove(section)
++ end
++ if (fvalue ~= cvalue) then self.section.changed = true end
++ else
++ self:remove(section)
++ self.section.changed = true
++ end
++end
++
++-----------------------------------------------------------------------------
++-- copied from https://svn.nmap.org/nmap/nselib/url.lua
++-- @author Diego Nehab
++-- @author Eddie Bell <ejlbell@gmail.com>
++--[[
++ URI parsing, composition and relative URL resolution
++ LuaSocket toolkit.
++ Author: Diego Nehab
++ RCS ID: $Id: url.lua,v 1.37 2005/11/22 08:33:29 diego Exp $
++ parse_query and build_query added For nmap (Eddie Bell <ejlbell@gmail.com>)
++]]--
++---
++-- Parses a URL and returns a table with all its parts according to RFC 2396.
++--
++-- The following grammar describes the names given to the URL parts.
++-- <code>
++-- <url> ::= <scheme>://<authority>/<path>;<params>?<query>#<fragment>
++-- <authority> ::= <userinfo>@<host>:<port>
++-- <userinfo> ::= <user>[:<password>]
++-- <path> :: = {<segment>/}<segment>
++-- </code>
++--
++-- The leading <code>/</code> in <code>/<path></code> is considered part of
++-- <code><path></code>.
++-- @param url URL of request.
++-- @param default Table with default values for each field.
++-- @return A table with the following fields, where RFC naming conventions have
++-- been preserved:
++-- <code>scheme</code>, <code>authority</code>, <code>userinfo</code>,
++-- <code>user</code>, <code>password</code>, <code>host</code>,
++-- <code>port</code>, <code>path</code>, <code>params</code>,
++-- <code>query</code>, and <code>fragment</code>.
++-----------------------------------------------------------------------------
++function parse_url(url) --, default)
++ -- initialize default parameters
++ local parsed = {}
++-- for i,v in base.pairs(default or parsed) do
++-- parsed[i] = v
++-- end
++
++ -- remove whitespace
++-- url = string.gsub(url, "%s", "")
++ -- get fragment
++ url = string.gsub(url, "#(.*)$",
++ function(f)
++ parsed.fragment = f
++ return ""
++ end)
++ -- get scheme. Lower-case according to RFC 3986 section 3.1.
++ url = string.gsub(url, "^([%w][%w%+%-%.]*)%:",
++ function(s)
++ parsed.scheme = string.lower(s);
++ return ""
++ end)
++ -- get authority
++ url = string.gsub(url, "^//([^/]*)",
++ function(n)
++ parsed.authority = n
++ return ""
++ end)
++ -- get query stringing
++ url = string.gsub(url, "%?(.*)",
++ function(q)
++ parsed.query = q
++ return ""
++ end)
++ -- get params
++ url = string.gsub(url, "%;(.*)",
++ function(p)
++ parsed.params = p
++ return ""
++ end)
++ -- path is whatever was left
++ parsed.path = url
++
++ local authority = parsed.authority
++ if not authority then
++ return parsed
++ end
++ authority = string.gsub(authority,"^([^@]*)@",
++ function(u)
++ parsed.userinfo = u;
++ return ""
++ end)
++ authority = string.gsub(authority, ":([0-9]*)$",
++ function(p)
++ if p ~= "" then
++ parsed.port = p
++ end;
++ return ""
++ end)
++ if authority ~= "" then
++ parsed.host = authority
++ end
++
++ local userinfo = parsed.userinfo
++ if not userinfo then
++ return parsed
++ end
++ userinfo = string.gsub(userinfo, ":([^:]*)$",
++ function(p)
++ parsed.password = p;
++ return ""
++ end)
++ parsed.user = userinfo
++ return parsed
++end
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/admin_status/index/ddns.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/admin_status/index/ddns.htm
+new file mode 100644
+index 0000000..9791065
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/admin_status/index/ddns.htm
+@@ -0,0 +1 @@
++<%+ddns/system_status%>
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_logview.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_logview.htm
+new file mode 100644
+index 0000000..4dcb7bb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_logview.htm
+@@ -0,0 +1,56 @@
++
++<!-- ++ BEGIN ++ Dynamic DNS ++ detail_logview.htm ++ -->
++<script type="text/javascript">//<![CDATA[
++ function onclick_logview(section, bottom) {
++ // get elements
++ var txt = document.getElementById("cbid.ddns." + section + "._logview.txt"); // TextArea
++ if ( !txt ) { return; } // security check
++
++ XHR.get('<%=url('admin/services/ddns/logview')%>/' + section, null,
++ function(x) {
++ if (x.responseText == "_nodata_")
++ txt.value = "<%:File not found or empty%>";
++ else
++ txt.value = x.responseText;
++ if (bottom)
++ txt.scrollTop = txt.scrollHeight;
++ else
++ txt.scrollTop = 0; }
++ );
++ }
++//]]></script>
++
++<%+cbi/valueheader%>
++
++<br />
++
++<%
++-- one button on top, one at the buttom
++%>
++<input class="cbi-button cbi-input-button" style="align: center; width: 100%" type="button" onclick="onclick_logview(this.name, false)"
++<%=
++attr("name", section) .. attr("id", cbid .. ".btn1") .. attr("value", self.inputtitle)
++%> />
++
++<br /><br />
++
++<%
++-- set a readable style taken from openwrt theme for textarea#syslog
++-- in openwrt theme there are problems with a width of 100 so we check for theme and set to lower value
++%>
++<textarea style="width: <%if media == "/luci-static/openwrt.org" then%>98.7%<%else%>100%<%end%> ; min-height: 500px; border: 3px solid #cccccc; padding: 5px; font-family: monospace; resize: none;" wrap="off" readonly="readonly"
++<%=
++attr("name", cbid .. ".txt") .. attr("id", cbid .. ".txt") .. ifattr(self.rows, "rows")
++%> >
++<%-=pcdata(self:cfgvalue(section))-%>
++</textarea>
++<br /><br />
++
++<%
++-- one button on top, one at the buttom
++%>
++<input class="cbi-button cbi-input-button" style="align: center; width: 100%" type="button" onclick="onclick_logview(this.name, true)"
++<%= attr("name", section) .. attr("id", cbid .. ".btn2") .. attr("value", self.inputtitle) %> />
++
++<%+cbi/valuefooter%>
++<!-- ++ END ++ Dynamic DNS ++ detail_logview.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_lvalue.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_lvalue.htm
+new file mode 100644
+index 0000000..0bcfd44
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_lvalue.htm
+@@ -0,0 +1,22 @@
++
++<!-- ++ BEGIN ++ Dynamic DNS ++ detail_lvalue.htm ++ -->
++<!-- no value header to suppress next line -->
++&#160;
++<% if self.widget == "select" then %>
++ <select class="cbi-input-select" onchange="cbi_d_update(this.id)"<%= attr("id", cbid) .. attr("name", cbid) .. ifattr(self.size, "size") %>>
++ <% for i, key in pairs(self.keylist) do -%>
++ <option id="cbi-<%=self.config.."-"..section.."-"..self.option.."-"..key%>"<%= attr("value", key) .. ifattr(tostring(self:cfgvalue(section) or self.default) == key, "selected", "selected") %>><%=striptags(self.vallist[i])%></option>
++ <%- end %>
++ </select>
++<% elseif self.widget == "radio" then
++ local c = 0
++ for i, key in pairs(self.keylist) do
++ c = c + 1
++%>
++ <input class="cbi-input-radio" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)" type="radio"<%= attr("id", cbid..c) .. attr("name", cbid) .. attr("value", key) .. ifattr((self:cfgvalue(section) or self.default) == key, "checked", "checked") %> />
++ <label<%= attr("for", cbid..c) %>><%=self.vallist[i]%></label>
++<% if c == self.size then c = 0 %><% if self.orientation == "horizontal" then %>&#160;<% else %><br /><% end %>
++<% end end %>
++<% end %>
++<%+cbi/valuefooter%>
++<!-- ++ END ++ Dynamic DNS ++ detail_lvalue.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_value.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_value.htm
+new file mode 100644
+index 0000000..cbe76ab
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_value.htm
+@@ -0,0 +1,9 @@
++
++<!-- ++ BEGIN ++ Dynamic DNS ++ detail_value.htm ++ -->
++<%+cbi/valueheader%>
++ <input type="text" class="cbi-input-text" style="width: 10em;" onchange="cbi_d_update(this.id)"<%=
++ attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section) or self.default) ..
++ ifattr(self.size, "size") .. ifattr(self.placeholder, "placeholder")
++ %> />
++<!-- no value footer to suppress next line -->
++<!-- ++ END ++ Dynamic DNS ++ detail_value.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/global_value.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/global_value.htm
+new file mode 100644
+index 0000000..159cb60
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/global_value.htm
+@@ -0,0 +1,34 @@
++
++<!-- ++ BEGIN ++ Dynamic DNS ++ global_value.htm ++ -->
++<%+cbi/valueheader%>
++<script type="text/javascript">//<![CDATA[
++ // event handler on changed date
++ function onkeyup_date(value) {
++ var obj = document.getElementById("cbid.ddns.global.date_format.help");
++ if ( !obj ) { return; } // security check
++
++ if ( value == "" || value.length == 0 ) { value = "%F %R"; }
++ var now = new Date();
++ var txt = now.toLocaleFormat(value);
++ // handle newline(%n) and tab(%t) needs to be converted to HTML
++ txt = txt.replace(new RegExp('\r?\n','g'), '<br />');
++ txt = txt.replace(new RegExp('\t','g'), '&nbsp;&nbsp;&nbsp;&nbsp;');
++ obj.innerHTML = "<%:Current setting%>: <strong>" + txt + "<\/strong>";
++ }
++//]]></script>
++
++<input type="text" class="cbi-input-text" onchange="cbi_d_update(this.id)" onkeyup="onkeyup_date(this.value)"
++ <%=
++ attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section) or self.default) ..
++ ifattr(self.size, "size") .. ifattr(self.placeholder, "placeholder")
++ %>
++/>
++<br />
++<div class="cbi-value-description">
++ <span class="cbi-value-helpicon"><img src="<%=resource%>/cbi/help.gif" alt="<%:help%>" /><%=self.description%></span>
++ <br />
++ <span id="<%=cbid%>.help" class="cbi-value-helpicon"><%:Current setting%>: <strong><%=self.date_string%></strong></span>
++</div> <!-- div class="cbi-value-description" -->
++</div> <!-- div class="cbi-value-field" -->
++</div> <!-- div class="cbi-value cbi-value-last" -->
++<!-- ++ END ++ Dynamic DNS ++ global_value.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_doubleline.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_doubleline.htm
+new file mode 100644
+index 0000000..1d1b4be
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_doubleline.htm
+@@ -0,0 +1,10 @@
++
++<!-- ++ BEGIN ++ Dynamic DNS ++ overview_doubleline.htm ++ -->
++<%+cbi/valueheader%>
++
++<span id="<%=cbid%>.one"><%=self:set_one(section)%></span>
++<br />
++<span id="<%=cbid%>.two"><%=self:set_two(section)%></span>
++
++<%+cbi/valuefooter%>
++<!-- ++ END ++ Dynamic DNS ++ overview_doubleline.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_enabled.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_enabled.htm
+new file mode 100644
+index 0000000..64b3dae
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_enabled.htm
+@@ -0,0 +1,15 @@
++
++<!-- ++ BEGIN ++ Dynamic DNS ++ overview_enabled.htm ++ -->
++<%+cbi/valueheader%>
++
++<input type="hidden" value="1"<%=
++ attr("name", "cbi.cbe." .. self.config .. "." .. section .. "." .. self.option)
++%> />
++ <!-- modified to call own function -->
++<input class="cbi-input-checkbox" onclick="cbi_d_update(this.id)" onchange="onchange_enabled(this.id)" type="checkbox"<%=
++ attr("id", cbid) .. attr("name", cbid) .. attr("value", self.enabled or 1) ..
++ ifattr((self:cfgvalue(section) or self.default) == self.enabled, "checked", "checked")
++%> />
++
++<%+cbi/valuefooter%>
++<!-- ++ END ++ Dynamic DNS ++ overview_enabled.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_startstop.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_startstop.htm
+new file mode 100644
+index 0000000..327028c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_startstop.htm
+@@ -0,0 +1,17 @@
++
++<!-- ++ BEGIN ++ Dynamic DNS ++ overview_startstop.htm ++ -->
++<%+cbi/valueheader%>
++
++<% if self:cfgvalue(section) ~= false then
++-- We need to garantie that function cfgvalue run first to set missing parameters
++%>
++ <!-- style="font-size: 100%;" needed for openwrt theme to fix font size -->
++ <!-- type="button" onclick="..." enable standard onclick functionality -->
++ <input class="cbi-button cbi-input-<%=self.inputstyle or "button" %>" style="font-size: 100%;" type="button" onclick="onclick_startstop(this.id)"
++ <%=
++ attr("name", section) .. attr("id", cbid) .. attr("value", self.inputtitle) .. ifattr(self.disabled, "disabled")
++ %> />
++<% end %>
++
++<%+cbi/valuefooter%>
++<!-- ++ END ++ Dynamic DNS ++ overview_startstop.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_status.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_status.htm
+new file mode 100644
+index 0000000..b6d4ebb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_status.htm
+@@ -0,0 +1,180 @@
++
++<!-- ++ BEGIN ++ Dynamic DNS ++ overview_status.htm ++ -->
++<script type="text/javascript">//<![CDATA[
++
++ // helper to extract section from objects id
++ // cbi.ddns.SECTION._xyz
++ function _id2section(id) {
++ var x = id.split(".");
++ return x[2];
++ }
++
++ // helper to move status data to the relevant
++ // screen objects
++ // called by XHR.poll and onclick_startstop
++ function _data2elements(data) {
++ // Service sections
++ for( i = 1; i < data.length; i++ )
++ {
++ var section = data[i].section // Section to handle
++ var cbx = document.getElementById("cbid.ddns." + section + ".enabled"); // Enabled
++ var btn = document.getElementById("cbid.ddns." + section + "._startstop"); // Start/Stop button
++ var rip = document.getElementById("cbid.ddns." + section + "._domainIP.two"); // Registered IP
++ var lup = document.getElementById("cbid.ddns." + section + "._update.one"); // Last Update
++ var nup = document.getElementById("cbid.ddns." + section + "._update.two"); // Next Update
++ if ( !(cbx && btn && rip && lup && nup) ) { return; } // security check
++
++ // process id
++ if (data[i].pid > 0) {
++ // stop always possible if process running
++ btn.value = "PID: " + data[i].pid;
++ btn.className = "cbi-button cbi-input-reset";
++ } else {
++ // default Start / enabled
++ btn.value = "<%:Start%>";
++ btn.className = "cbi-button cbi-input-apply";
++ }
++ btn.disabled = false; // button enabled
++
++ // last update
++ switch (data[i].datelast) {
++ case "_empty_":
++ lup.innerHTML = '<em><%:Unknown error%></em>' ;
++ break;
++ case "_never_":
++ lup.innerHTML = '<em><%:Never%></em>' ;
++ break;
++ default:
++ lup.innerHTML = data[i].datelast;
++ break;
++ }
++
++ // next update
++ switch (data[i].datenext) {
++ case "_empty_":
++ nup.innerHTML = '<em><%:Unknown error%></em>' ;
++ break;
++ case "_verify_":
++ nup.innerHTML = '<em><%:Verify%></em>';
++ break;
++ case "_runonce_":
++ case "_stopped_":
++ case "_disabled_":
++ if (cbx.checked && data[i].datenext == "_runonce_") {
++ nup.innerHTML = '<em><%:Run once%></em>';
++ } else if (cbx.checked) {
++ nup.innerHTML = '<em><%:Stopped%></em>';
++ } else {
++ nup.innerHTML = '<em><%:Disabled%></em>';
++ btn.value = '----------';
++ btn.className = "cbi-button cbi-input-button"; // no image
++ btn.disabled = true; // disabled
++ }
++ break;
++ default:
++ nup.innerHTML = data[i].datenext;
++ break;
++ }
++
++ // domain
++ // (data[i].domain ignored here
++
++ // registered IP
++ // rip.innerHTML = "Registered IP";
++ if (data[i].domain == "_nodomain_")
++ rip.innerHTML = '';
++ else if (data[i].reg_ip == "_nodata_")
++ rip.innerHTML = '<em><%:No data%></em>';
++ else
++ rip.innerHTML = data[i].reg_ip;
++
++ // monitored interfacce
++ // data[i].iface ignored here
++ }
++ }
++
++ // event handler for enabled checkbox
++ function onchange_enabled(id) {
++ // run original function in cbi.js
++ // whatever is done there
++ cbi_d_update(id);
++
++ var section = _id2section(id);
++ var cbx = document.getElementById("cbid.ddns." + section + ".enabled");
++ var btn = document.getElementById("cbid.ddns." + section + "._startstop");
++ if ( !(cbx && btn) ) { return; } // security check
++
++ var pid_txt = btn.value;
++ var pid_found = ( pid_txt.search("PID") >= 0 ) ? true : false;
++
++ if (pid_found) {
++ // btn.value = "PID: 0000";
++ btn.className = "cbi-button cbi-button-reset";
++ btn.disabled = false;
++ } else if (cbx.checked) {
++ btn.value = "<%:Start%>";
++ btn.className = "cbi-button cbi-button-apply";
++ btn.disabled = false;
++ } else {
++ btn.value = '----------';
++ btn.className = "cbi-button cbi-input-button"; // no image
++ btn.disabled = true; // disabled
++ }
++ }
++
++ // event handler for start/stop button
++ function onclick_startstop(id) {
++ // extract section
++ var section = _id2section(id);
++ // get elements
++ var cbx = document.getElementById("cbid.ddns." + section + ".enabled"); // Enabled
++ var obj = document.getElementById("cbi-ddns-overview-status-legend"); // object defined below to make in-/visible
++ if ( !(obj && cbx) ) { return; } // security check
++
++ // make me visible
++ obj.parentNode.style.display = "block";
++
++ // do start/stop
++ var btnXHR = new XHR();
++ btnXHR.post('<%=url('admin/services/ddns/startstop')%>/' + section + '/' + cbx.checked, { token: '<%=token%>' },
++ function(x, data) {
++ if (x.responseText == "_uncommitted_") {
++ // we need a trick to display Ampersand "&" in stead of "&#38;" or "&amp;"
++ // after translation
++ txt="<%:Please [Save & Apply] your changes first%>";
++ alert( txt.replace(new RegExp("<%:&%>", "g"), "&") );
++ } else {
++ // should have data because status changed
++ // so update screen
++ if (data) { _data2elements(data); }
++ }
++ // make me invisible
++ obj.parentNode.style.display = "none";
++ }
++ );
++ }
++
++ // force to immediate show status on page load (not waiting for XHR.poll)
++ XHR.get('<%=url('admin/services/ddns/status')%>', null,
++ function(x, data) {
++ if (data) { _data2elements(data); }
++ }
++ );
++
++ // define only ONE XHR.poll in a page because if one is running it blocks the other one
++ // optimum is to define on Map or Section Level from here you can reach all elements
++ // we need update every 15 seconds only
++ XHR.poll(15, '<%=url('admin/services/ddns/status')%>', null,
++ function(x, data) {
++ if (data) { _data2elements(data); }
++ }
++ );
++
++//]]></script>
++
++<fieldset class="cbi-section" style="display:none">
++ <legend id="cbi-ddns-overview-status-legend"><%:Applying changes%></legend>
++ <img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
++ <span id="cbi-ddns-overview-status-text"><%:Waiting for changes to be applied...%></span>
++</fieldset>
++<!-- ++ END ++ Dynamic DNS ++ overview_status.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm
+new file mode 100644
+index 0000000..06dca48
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm
+@@ -0,0 +1,144 @@
++
++<!-- ++ BEGIN ++ Dynamic DNS ++ system_status.htm ++ -->
++<script type="text/javascript">//<![CDATA[
++ // helper to move status data to the relevant
++ // screen objects
++ // called by XHR.poll and XHR.get
++ function _data2elements(x, data) {
++ var tbl = document.getElementById('ddns_status_table');
++ // security check
++ if ( !(tbl) ) { return; }
++
++ // clear all rows
++ while (tbl.rows.length > 1)
++ tbl.deleteRow(1);
++
++ // variable for Modulo-Division use to set cbi-rowstyle-? (0 or 1)
++ var i = -1;
++ var j = 1;
++
++ // DDNS Service disabled
++ 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 ;
++ i++ ;
++ }
++
++ 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>' ;
++
++ // pid
++ // data[j].pid ignored here
++
++ // last update
++ // data[j].datelast ignored here
++
++ // next update
++ switch (data[j].datenext) {
++ case "_empty_":
++ tr.insertCell(-1).innerHTML = '<em><%:Unknown error%></em>' ;
++ break;
++ case "_stopped_":
++ tr.insertCell(-1).innerHTML = '<em><%:Stopped%></em>' ;
++ break;
++ case "_disabled_":
++ tr.insertCell(-1).innerHTML = '<em><%:Disabled%></em>' ;
++ break;
++ case "_noupdate_":
++ tr.insertCell(-1).innerHTML = '<em><%:Update error%></em>' ;
++ break;
++ case "_runonce_":
++ tr.insertCell(-1).innerHTML = '<em><%:Run once%></em>' ;
++ break;
++ case "_verify_":
++ tr.insertCell(-1).innerHTML = '<em><%:Verify%></em>';
++ break;
++ default:
++ tr.insertCell(-1).innerHTML = data[j].datenext ;
++ break;
++ }
++
++ // domain
++ if (data[j].domain == "_nodomain_")
++ tr.insertCell(-1).innerHTML = '<em><%:config error%></em>';
++ else
++ tr.insertCell(-1).innerHTML = data[j].domain;
++
++ // registered IP
++ switch (data[j].reg_ip) {
++ case "_nodomain_":
++ tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>';
++ break;
++ case "_nodata_":
++ tr.insertCell(-1).innerHTML = '<em><%:No data%></em>';
++ break;
++ case "_noipv6_":
++ tr.insertCell(-1).innerHTML = '<em><%:IPv6 not supported%></em>';
++ break;
++ default:
++ tr.insertCell(-1).innerHTML = data[j].reg_ip;
++ break;
++ }
++
++ // monitored interface
++ if (data[j].iface == "_nonet_")
++ tr.insertCell(-1).innerHTML = '<em><%:Config error%></em>';
++ else
++ tr.insertCell(-1).innerHTML = data[j].iface;
++ }
++
++ if (tbl.rows.length == 1 || (data[0].enabled == 0 && tbl.rows.length == 2) ) {
++ var br = '<br />';
++ if (tbl.rows.length > 1)
++ 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>' ;
++ }
++ }
++
++ // force to immediate show status (not waiting for XHR.poll)
++ XHR.get('<%=url('admin/services/ddns/status')%>', null,
++ function(x, data) {
++ if (data) { _data2elements(x, data); }
++ }
++ );
++
++ XHR.poll(5, '<%=url('admin/services/ddns/status')%>', null,
++ function(x, data) {
++ if (data) { _data2elements(x, data); }
++ }
++ );
++
++//]]></script>
++
++<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"><%:Hostname/Domain%></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>
++</fieldset>
++<!-- ++ END ++ Dynamic DNS ++ system_status.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-ddns/po/ca/ddns.po b/feeds/luci/applications/luci-app-ddns/po/ca/ddns.po
+new file mode 100644
+index 0000000..c57b689
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/ca/ddns.po
+@@ -0,0 +1,706 @@
++# ddns.pot
++# generated from ./applications/luci-ddns/luasrc/i18n/ddns.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2014-07-03 20:30+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++#, fuzzy
++msgid "Custom update-URL"
++msgstr "URL d'actualització personalitzada"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "DNS dinàmic"
++
++#, fuzzy
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"El DNS dinàmic permet que el teu router sigui localitzable amb un nom de "
++"màquin fix mentre té una adreça IP dinàmica."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfície"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Xarxa"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Contrasenya"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr ""
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Nom d'usuari"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Comprova si s'ha canviat la IP cada"
++
++#, fuzzy
++#~ msgid "Check-time unit"
++#~ msgstr "Unitat de temps de comprovació"
++
++#~ msgid "Enable"
++#~ msgstr "Habilita"
++
++#~ msgid "Force update every"
++#~ msgstr "Força actualització cada"
++
++#, fuzzy
++#~ msgid "Force-time unit"
++#~ msgstr "Unitat de temps de forceig"
++
++#~ msgid "Service"
++#~ msgstr "Servei"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Origen de l'adreça IP"
++
++#~ msgid "custom"
++#~ msgstr "personalitzat"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "h"
++
++#~ msgid "interface"
++#~ msgstr "interfície"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "min"
++
++#~ msgid "network"
++#~ msgstr "xarxa"
++
++#~ msgid "Event interface"
++#~ msgstr "Interfície d'esdeveniment"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/cs/ddns.po b/feeds/luci/applications/luci-app-ddns/po/cs/ddns.po
+new file mode 100644
+index 0000000..e957d58
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/cs/ddns.po
+@@ -0,0 +1,704 @@
++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2014-06-20 23:22+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "Vlastní aktualizaÄní-URL"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "Dynamické DNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"Dynamické DNS umožňuje, aby mohl být váš router dostupný pod pevným "
++"hostname, zatímco se jeho IP adresa dynamicky mění."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Rozhraní"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Síť"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Heslo"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Uživatelské jméno"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Zkontrolovat změnu IP každých"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Check-time jednotka"
++
++#~ msgid "Enable"
++#~ msgstr "Povolit"
++
++#~ msgid "Force update every"
++#~ msgstr "Vynutit aktualizaci každých"
++
++#~ msgid "Force-time unit"
++#~ msgstr "Force-time jednotka"
++
++#~ msgid "Hostname"
++#~ msgstr "Hostname"
++
++#~ msgid "Service"
++#~ msgstr "Služba"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Zdroj IP adresy"
++
++#~ msgid "custom"
++#~ msgstr "vlastní"
++
++# Hours
++# Hodin
++#~ msgid "h"
++#~ msgstr "h"
++
++#~ msgid "interface"
++#~ msgstr "rozhraní"
++
++# Minutes (not minimum)
++# Minut
++#~ msgid "min"
++#~ msgstr "min"
++
++#~ msgid "network"
++#~ msgstr "síť"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/de/ddns.po b/feeds/luci/applications/luci-app-ddns/po/de/ddns.po
+new file mode 100644
+index 0000000..6ffde5d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/de/ddns.po
+@@ -0,0 +1,745 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: luci-app-ddns\n"
++"POT-Creation-Date: 2015-05-08 21:29+0100\n"
++"PO-Revision-Date: 2015-05-08 21:47+0100\n"
++"Last-Translator: Christian Schoenebeck <christian.schoenebeck@gmail.com>\n"
++"Language-Team: \n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Poedit 1.7.5\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++"X-Poedit-Basepath: .\n"
++
++msgid "&"
++msgstr "&"
++
++msgid "-- custom --"
++msgstr "-- benutzerdefiniert --"
++
++msgid "-- default --"
++msgstr "-- Standard --"
++
++msgid "Advanced Settings"
++msgstr "Erweiterte Einstellungen"
++
++msgid "Allow non-public IP's"
++msgstr "Erlaube Nicht-öffentliche IPs"
++
++msgid "Applying changes"
++msgstr "Änderungen anwenden"
++
++msgid "Basic Settings"
++msgstr "Grundlegende Einstellungen"
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++"Liste der Konfigurationshinweise um Dynamische DNS Aktualisierungen ohne "
++"Einschränkungen zu nutzen"
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++"Liste der konfigurierten DDNS Konfigurationen und ihr momentaner Status."
++
++msgid "Bind Network"
++msgstr "Bind-Netzwerk"
++
++msgid "Binding to a specific network not supported"
++msgstr "'Bind' an ein bestimmtes Netzwerk wird nicht unterstützt"
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++"BusyBox's nslookup und Wget unterstützen nicht die IP Version für die "
++"Kommunikation festzulegen."
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++"BusyBox's nslookup unterstützt es nicht das TCP-Protokoll für DNS Anfragen "
++"anstelle des standardmäßigen UDP-Protokolls."
++
++msgid "Casual users should not change this setting"
++msgstr "Standard Benutzer sollten diese Einstellung nicht ändern."
++
++msgid "Check Interval"
++msgstr "Prüfinterval"
++
++msgid "Collecting data..."
++msgstr "Sammle Daten..."
++
++msgid "Config error"
++msgstr "Konfigurationsfehler"
++
++msgid "Configuration"
++msgstr "Einstellungen"
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++"Konfiguriere hier die Details für alle Dynamik DNS Dienste einschließlich "
++"dieser LuCI Anwendung."
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr "Konfiguriere hier die Details für den gewählten Dynamik DNS Dienst."
++
++msgid "Current setting"
++msgstr "Aktuelle Einstellung"
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++"Aktuell werden keine DDNS Aktualisierungen beim Systemstart oder bei "
++"Netzwerkereignissen gestartet.<br />Dieses ist der Standard, wenn Sie die "
++"DDSN Skripte über eigene Routinen (z.B. cron und Erzwungener Aktualisierung "
++"von '0') starten."
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++"Aktuell werden DDNS Aktualisierungen nicht bei Systemstart oder bei "
++"Netzwerkereignissen gestartet.<br />Sie können jede Konfiguration hier "
++"starten und stoppen. Sie wird bis zum nächsten Neustart ausgeführt."
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr "Update-Skript um Aktualisierungen an Ihren DDNS Anbieter zu senden."
++
++msgid "Custom update-URL"
++msgstr "Eigene Update-URL"
++
++msgid "Custom update-script"
++msgstr "Eigenes Update-Skript"
++
++msgid "DDNS Autostart disabled"
++msgstr "DDNS Autostart deaktiviert"
++
++msgid "DDNS Service provider"
++msgstr "DDNS-Dienstanbieter"
++
++msgid "DNS requests via TCP not supported"
++msgstr "DNS Anfragen über TCP nicht unterstützt"
++
++msgid "DNS-Server"
++msgstr "DNS-Server"
++
++msgid "Date format"
++msgstr "Datumsformat "
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++"Definiert die Web-Seite von der die aktuelle IPv4-Adresse des System gelesen "
++"wird."
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++"Definiert die Web-Seite von der die aktuelle IPv6-Adresse des System gelesen "
++"wird."
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++"Definiert die Schnittstelle von der die aktuelle IP-Adresse des System "
++"gelesen wird."
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++"Definiert das Netzwerk von dem die aktuelle IPv4-Adresse des System gelesen "
++"wird."
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++"Definiert das Netzwerk von dem die aktuelle IPv6-Adresse des System gelesen "
++"wird."
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++"Definiert die Quelle von der die aktuelle IPv4-Adresse des Systems gelesen "
++"wird, die an Ihren DDNS Anbieter gesendet wird."
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++"Definiert die Quelle von der die aktuelle IPv6-Adresse des Systems gelesen "
++"wird, die an Ihren DDNS Anbieter gesendet wird."
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++"Legt fest welche IP-Adresse 'IPv4/IPv6' zum DDNS Anbieter gesendet wird"
++
++msgid "Details for"
++msgstr "Details für"
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++"Das Verzeichnis enthält die Protokolldateien aller laufenden Konfigurationen."
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++"Das Verzeichnis enthält die PID und andere Statusinformationen aller "
++"laufenden Konfigurationen."
++
++msgid "Disabled"
++msgstr "Deaktiviert"
++
++msgid "Dynamic DNS"
++msgstr "Dynamisches DNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"Dynamisches DNS erlaubt es, den Router bei dynamischer IP-Adresse über einen "
++"festen DNS-Namen zu erreichen."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr "Aktiviert sichere Kommunikation mit dem DDNS Anbieter"
++
++msgid "Enabled"
++msgstr "Aktiviert"
++
++msgid "Error"
++msgstr "Fehler"
++
++msgid "Error Retry Counter"
++msgstr "Wiederholungszähler bei Fehler"
++
++msgid "Error Retry Interval"
++msgstr "Wiederholungsintervall bei Fehler"
++
++msgid "Event Network"
++msgstr "Ereignis Netzwerk"
++
++msgid "File"
++msgstr "Datei"
++
++msgid "File not found"
++msgstr "Datei nicht gefunden"
++
++msgid "File not found or empty"
++msgstr "Datei nicht gefunden oder leer"
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++"Folgen Sie dem Link<br />Hier finden Sie weitere Hinweise um Ihr System für "
++"die Nutzung aller Optionen der DDNS Skripte zu optimieren."
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++"Detaillierte Informationen zu den Parametereinstellungen finden Sie hier."
++
++msgid "For supported codes look here"
++msgstr "Unterstützte Kodierungen finden Sie hier."
++
++msgid "Force IP Version"
++msgstr "Erzwinge IP-Version"
++
++msgid "Force IP Version not supported"
++msgstr "Erzwinge IP-Version nicht unterstützt"
++
++msgid "Force Interval"
++msgstr "Erzwungene Aktualisierung"
++
++msgid "Force TCP on DNS"
++msgstr "Erzwinge TCP bei DNS-Anfragen"
++
++msgid "Forced IP Version don't matched"
++msgstr "Erzwungene IP Version stimmt nicht überein"
++
++msgid "Format"
++msgstr "Format"
++
++msgid "Format: IP or FQDN"
++msgstr "Format: IP-Adresse oder FQDN"
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++"GNU Wget verwendet die IP des gewählten Netzwerkes; cURL verwendet die "
++"physikalische Schnittstelle."
++
++msgid "Global Settings"
++msgstr "Globale Einstellungen"
++
++msgid "HTTPS not supported"
++msgstr "HTTPS nicht unterstützt"
++
++msgid "Hints"
++msgstr "Hinweise"
++
++msgid "Hostname/Domain"
++msgstr "Rechnername/Domäne"
++
++msgid "IP address source"
++msgstr "IP-Adressquelle"
++
++msgid "IP address version"
++msgstr "IP-Adressversion"
++
++msgid "IPv4-Address"
++msgstr "IPv4-Adresse"
++
++msgid "IPv6 address must be given in square brackets"
++msgstr "Eine IPv6 Adresse muss in eckigen Klammern angegeben werden"
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++"IPv6 wird vom System nicht (voll) unterstützt.<br /> Bitte folgen Sie den "
++"Hinweisen auf der Homepage von OpenWrt um die volle IPv6-Unterstützung zu "
++"aktivieren<br /> oder installieren Sie die aktuellste OpenWrt Version."
++
++msgid "IPv6 not supported"
++msgstr "IPv6 nicht unterstützt"
++
++msgid "IPv6-Address"
++msgstr "IPv6-Adresse"
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr "Wenn cURL und GNU Wget installiert sind, wird Wget verwendet."
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++"Wenn deaktiviert kann die Aktualisierung nicht gestartet werden.<br />Weder "
++"über das LuCI Web Interface noch von der Geräte-Konsole"
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++"Wenn Sie Aktualisierungen für IPv4 und IPv6 senden möchten benötigen Sie "
++"zwei Konfigurationen z.B. 'myddns_ipv4' und 'myddns_ipv6'"
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++"In einigen Versionen von OpenWrt wurde cURL/libcurl ohne Proxy Unterstützung "
++"compiliert."
++
++msgid "Info"
++msgstr "Informationen"
++
++msgid "Interface"
++msgstr "Schnittstelle"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++"Intervall zur Prüfung auf geänderte IP-Adresse<br />Minimum Wert 5 Minuten "
++"== 300 Sekunden"
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++"Intervall mit dem Aktualisierungen erzwungen an den DDNS Anbieter gesendet "
++"werden.<br />Ein Wert von '0' führt das Skript nur einmalig aus. <br />Der "
++"Wert muss größer als das Prüfintervall sein oder '0'."
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++"Es wird nicht empfohlen, dass Standard Benutzer die Einstellungen auf dieser "
++"Seite ändern."
++
++msgid "Last Update"
++msgstr "Letztes Aktualisierung"
++
++msgid "Loading"
++msgstr "Lade"
++
++msgid "Log File Viewer"
++msgstr "Protokolldatei"
++
++msgid "Log directory"
++msgstr "Protokoll-Verzeichnis"
++
++msgid "Log length"
++msgstr "Protokolllänge"
++
++msgid "Log to file"
++msgstr "Protokoll in Datei schreiben"
++
++msgid "Log to syslog"
++msgstr "Systemprotokoll verwenden"
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++"Weder GNU Wget mit SSL noch cURL sind installiert um ein Netzwerk zur "
++"Kommunikation festzulegen."
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++"Weder GNU Wget mit SSL noch cURL sind installiert um Aktualisierungen über "
++"HTTPS Protokoll zu unterstützen."
++
++msgid "Network"
++msgstr "Netzwerk"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr "Netzwerk auf dem Ereignisse die ddns-updater Skripte starten"
++
++msgid "Never"
++msgstr "Nie"
++
++msgid "Next Update"
++msgstr "Nächste Aktualisierung"
++
++msgid "No data"
++msgstr "Keine Daten"
++
++msgid "No logging"
++msgstr "Keine Protokollierung"
++
++msgid "Non-public and by default blocked IP's"
++msgstr "Nicht-öffentliche und standardmäßig blockierte IPs."
++
++msgid "Notice"
++msgstr "Notiz"
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++"Anzahl der letzten Zeilen die in der Protokolldatei gespeichert werden."
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++"OPTIONAL: Erzwingt die Verwendung einer reinen IPv4/IPv6 Kommunikation."
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++"OPTIONAL: Erzwingt die Verwendung von TCP anstelle von UDP bei DNS Anfragen."
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr "OPTIONAL: Netzwerk das zur Kommunikation verwendet werden soll."
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr "OPTIONAL: Proxy-Server für Adresserkennung und Aktualisierungen"
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++"OPTIONAL: Ersetzt den voreingestellten DNS-Server um die 'Registrierte IP' "
++"zu ermitteln."
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++"Bei Fehlern wird das Skript die fehlerhafte Aktion nach der gegebenen Zeit "
++"wiederholen"
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr "Das Skript wird nach der gegebenen Anzahl von Fehlversuchen beendet."
++
++msgid "Overview"
++msgstr "Ãœbersicht"
++
++msgid "PROXY-Server"
++msgstr "Proxy-Server"
++
++msgid "PROXY-Server not supported"
++msgstr "Proxy-Server nicht unterstützt"
++
++msgid "Password"
++msgstr "Passwort"
++
++msgid "Path to CA-Certificate"
++msgstr "Pfad zum CA-Zertifikat"
++
++msgid "Please [Save & Apply] your changes first"
++msgstr "Bitte [Speichern & Anwenden] Sie Änderungen zunächst"
++
++msgid "Please press [Read] button"
++msgstr "Bitte Protokolldatei einlesen"
++
++msgid "Please update to the current version!"
++msgstr "Aktualisieren Sie bitte auf die aktuelle Version!"
++
++msgid "Process ID"
++msgstr "Prozess ID"
++
++msgid "Read / Reread log file"
++msgstr "Protokolldatei (neu) einlesen"
++
++msgid "Registered IP"
++msgstr "Registrierte IP"
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr "Ersetzt [DOMAIN] in der Update-URL"
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr "Ersetzt [PASSWORD] in der Update-URL"
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr "Ersetzt [USERNAME] in der Update-URL"
++
++msgid "Run once"
++msgstr "Einmalig ausführen"
++
++msgid "Script"
++msgstr "Skript"
++
++msgid "Show more"
++msgstr "Zeige mehr"
++
++msgid "Software update required"
++msgstr "Softwareaktualisierung nötig"
++
++msgid "Start"
++msgstr "Start"
++
++msgid "Start / Stop"
++msgstr "Start / Stopp"
++
++msgid "Status directory"
++msgstr "Status-Verzeichnis"
++
++msgid "Stopped"
++msgstr "Angehalten"
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++"Die installierte Software 'ddns-scripts' unterstützt nicht alle verfügbaren "
++"Optionen."
++
++msgid "The default setting of '0' will retry infinite."
++msgstr "Der Standard-Wert von '0' wird es endlosen erneut versuchen."
++
++msgid "There is no service configured."
++msgstr "Kein Dienst konfiguriert"
++
++msgid "Timer Settings"
++msgstr "Zeitgeber Einstellungen"
++
++msgid "To change global settings click here"
++msgstr "Globale Einstellungen können sie hier ändern."
++
++msgid "To use cURL activate this option."
++msgstr "Um cURL zu verwenden aktivieren sie diese Einstellung."
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr "URL zur Adresserkennung für"
++
++msgid "Unknown error"
++msgstr "Unbekannter Fehler"
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++"Update-URL um Aktualisierungen an Ihren DDNS Anbieter zu senden.<br />Folgen "
++"Sie der Anleitung auf der Internet Seite des Anbieters."
++
++msgid "Update error"
++msgstr "Aktualisierungsfehler"
++
++msgid "Use HTTP Secure"
++msgstr "Verwende sicheres HTTP"
++
++msgid "Use cURL"
++msgstr "Verwende cURL"
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++"Definiert das Skript mit dem die aktuelle IP-Adresse des System gelesen "
++"wird."
++
++msgid "Username"
++msgstr "Benutzername"
++
++msgid "Verify"
++msgstr "überprüfen"
++
++msgid "Version"
++msgstr "Version"
++
++msgid "Version Information"
++msgstr "Versionsinformationen"
++
++msgid "Waiting for changes to be applied..."
++msgstr "Änderungen werden angewandt..."
++
++msgid "Warning"
++msgstr "Warnung"
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++"Schreibt detaillierte Meldungen in die Protokolldatei. Die Datei wird "
++"automatisch gekürzt."
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++"Schreibt Meldungen ins Systemprotokoll. Kritische Fehler werden immer in das "
++"Systemprotokoll geschrieben."
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++"Sie sollten das Programmpakete BIND host for DNS Anfragen installieren."
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++"Sie sollten das Programmpaket GNU Wget mit SSL (bevorzugt) oder cURL "
++"installieren."
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr "Sie sollten das Programmpaket GNU Wget mit SSL oder cURL installieren."
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++"Sie sollten das Programmpaket GNU Wget mit SSL installieren oder libcurl "
++"austauschen."
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++"cURL ist installiert, aber libcurl wurde ohne Proxy Unterstützung compiliert"
++
++msgid "cURL without Proxy Support"
++msgstr "cURL ohne Proxy Unterstützung"
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++"kann lokale IP-Adresse nicht ermitteln. Bitte wählen Sie eine andere Quelle."
++
++msgid "can not resolve host:"
++msgstr "Konnte Server nicht finden:"
++
++msgid "config error"
++msgstr "Konfigurationsfehler"
++
++msgid "days"
++msgstr "Tage"
++
++msgid "directory or path/file"
++msgstr "Verzeichnis oder Pfad/zur/Datei"
++
++msgid "either url or script could be set"
++msgstr "Weder Url noch Script ist definiert"
++
++msgid "enable here"
++msgstr "hier aktivieren"
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr "Datei oder Verzeichnis nicht gefunden oder nicht 'IGNORE'"
++
++msgid "help"
++msgstr "Hilfe"
++
++msgid "hours"
++msgstr "Stunden"
++
++msgid "installed"
++msgstr "installiert"
++
++msgid "invalid - Sample"
++msgstr "ungültig - Beispiel"
++
++msgid "minimum value '0'"
++msgstr "Minimum Wert '0'"
++
++msgid "minimum value '1'"
++msgstr "Minimum Wert '1'"
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr "Minimum Wert 5 Minuten == 300 Sekunden"
++
++msgid "minutes"
++msgstr "Minuten"
++
++msgid "missing / required"
++msgstr "fehlt / Pflichteingabe"
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr "muss größer als das Prüfintervall sein"
++
++msgid "must start with 'http://'"
++msgstr "muss mit 'http://' beginnen"
++
++msgid "nc (netcat) can not connect"
++msgstr "nc (netcat) kann keine Verbindung herstellen"
++
++msgid "never"
++msgstr "nie"
++
++msgid "no data"
++msgstr "Keine Daten"
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++"Skript nicht gefunden oder nicht ausführbar. - Beispiel: 'Pfad/zum/Skript.sh'"
++
++msgid "nslookup can not resolve host"
++msgstr "nslookup kann den Namen nicht auflösen"
++
++msgid "or"
++msgstr "oder"
++
++msgid "or higher"
++msgstr "oder höher"
++
++msgid "please disable"
++msgstr "Bitte deaktivieren"
++
++msgid "please remove entry"
++msgstr "Bitte Eintrag entfernen"
++
++msgid "please select 'IPv4' address version"
++msgstr "Bitte 'IPv4' Adressversion auswählen"
++
++msgid "please select 'IPv4' address version in"
++msgstr "Bitte 'IPv4' Adressversion auswählen in den"
++
++msgid "please set to 'default'"
++msgstr "Bitte auf 'Standard' setzen"
++
++msgid "proxy port missing"
++msgstr "Proxy-Port fehlt"
++
++msgid "required"
++msgstr "erforderlich"
++
++msgid "seconds"
++msgstr "Sekunden"
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++"um HTTPS ohne Überprüfung der Server Zertifikate auszuführen (unsicher)"
++
++msgid "unknown error"
++msgstr "Unbekannter Fehler"
++
++msgid "unspecific error"
++msgstr "Unspezifischer Fehler"
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr "verwende Rechnername, FQDN, IPv4- oder IPv6-Adresse"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/el/ddns.po b/feeds/luci/applications/luci-app-ddns/po/el/ddns.po
+new file mode 100644
+index 0000000..821e17e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/el/ddns.po
+@@ -0,0 +1,707 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2012-03-18 17:08+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "ΠÏοσαÏμοσμένο URL-ενημέÏωσης"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "Δυναμικό DNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"Το Δυναμικό DNS επιτÏέπει στον δÏομολογητή σας να είναι Ï€Ïοσβάσιμος μέσω "
++"ενός σταθεÏÎ¿Ï Î¿Î½ÏŒÎ¼Î±Ï„Î¿Ï‚ υπολογιστή παÏόλο που η διεÏθυνση IP του μποÏεί να "
++"αλλάζει δυναμικά."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Διεπαφή"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Δίκτυο"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Κωδικός Ï€Ïόσβασης"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Όνομα χÏήστη"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Έλεγχος για αλλαγή IP κάθε"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Μονάδα χÏόνου ελέγχου"
++
++#~ msgid "Enable"
++#~ msgstr "ΕνεÏγοποίηση"
++
++#~ msgid "Force update every"
++#~ msgstr "Εξαναγκασμός ενημέÏωσης κάθε"
++
++#, fuzzy
++#~ msgid "Force-time unit"
++#~ msgstr "Μονάδα χÏόνου εξαναγκαστικής ενημέÏωσης"
++
++#~ msgid "Hostname"
++#~ msgstr "Όνομα υπολογιστή"
++
++#~ msgid "Service"
++#~ msgstr "ΥπηÏεσία"
++
++#, fuzzy
++#~ msgid "Source of IP address"
++#~ msgstr "Πηγή της διεÏθυνσης IP"
++
++#~ msgid "custom"
++#~ msgstr "Ï€ÏοσαÏμοσμένο"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "ω"
++
++#~ msgid "interface"
++#~ msgstr "διεπαφή"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "λεπτά"
++
++#~ msgid "network"
++#~ msgstr "δίκτυο"
++
++#, fuzzy
++#~ msgid "ddns_service_updateurl"
++#~ msgstr "ΠÏοσαÏμογή URL ενημέÏωσης"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/en/ddns.po b/feeds/luci/applications/luci-app-ddns/po/en/ddns.po
+new file mode 100644
+index 0000000..a6ba0bb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/en/ddns.po
+@@ -0,0 +1,705 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "Custom update-URL"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "Dynamic DNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Network"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Password"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Username"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Check for changed IP every"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Check-time unit"
++
++#~ msgid "Enable"
++#~ msgstr "Enable"
++
++#~ msgid "Force update every"
++#~ msgstr "Force update every"
++
++#~ msgid "Force-time unit"
++#~ msgstr "Force-time unit"
++
++#~ msgid "Hostname"
++#~ msgstr "Hostname"
++
++#~ msgid "Service"
++#~ msgstr "Service"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Source of IP address"
++
++#~ msgid "custom"
++#~ msgstr "custom"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "h"
++
++#~ msgid "interface"
++#~ msgstr "interface"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "min"
++
++#~ msgid "network"
++#~ msgstr "network"
++
++#~ msgid "Event interface"
++#~ msgstr "Event interface"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr "On which interface up should start the ddns script process."
+diff --git a/feeds/luci/applications/luci-app-ddns/po/es/ddns.po b/feeds/luci/applications/luci-app-ddns/po/es/ddns.po
+new file mode 100644
+index 0000000..ebee43d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/es/ddns.po
+@@ -0,0 +1,706 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2012-11-01 23:37+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "URL de actualización personalizada"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "DNS dinámico"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"DNS Dinámico le permite conectar a su router con un nombre concreto aunque "
++"su dirección IP cambie dinámicamente."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfaz"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Red"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Contraseña"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Nombre de usuario"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Verificar cambios de IP cada"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Unidad de tiempo"
++
++#~ msgid "Enable"
++#~ msgstr "Activar"
++
++#~ msgid "Force update every"
++#~ msgstr "Forzar actualización cada"
++
++#~ msgid "Force-time unit"
++#~ msgstr "Unidad de tiempo"
++
++#~ msgid "Hostname"
++#~ msgstr "Nombre de máquina"
++
++#~ msgid "Service"
++#~ msgstr "Servicio"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Dirección IP de origen"
++
++#~ msgid "custom"
++#~ msgstr "personalizado"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "h"
++
++#~ msgid "interface"
++#~ msgstr "interfaz"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "min"
++
++#~ msgid "network"
++#~ msgstr "red"
++
++#~ msgid "Event interface"
++#~ msgstr "Interfaz de eventos"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr "Tras qué interfaz debe arrancar ddns."
+diff --git a/feeds/luci/applications/luci-app-ddns/po/fr/ddns.po b/feeds/luci/applications/luci-app-ddns/po/fr/ddns.po
+new file mode 100644
+index 0000000..84e86a9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/fr/ddns.po
+@@ -0,0 +1,706 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2012-11-06 13:19+0200\n"
++"Last-Translator: hogsim <hogsim@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "URL de mise à jour personnalisée"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "DNS Dynamique"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"Le DNS Dynamique permet au routeur d'être joint avec un nom d'hôte fixe bien "
++"que changeant dynamiquement d'adresse IP."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Réseau"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Mot de passe"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Nom d'utilisateur"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Vérifier si l'adresse IP a changé toutes les"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Unité de temps pour la vérification"
++
++#~ msgid "Enable"
++#~ msgstr "Activer"
++
++#~ msgid "Force update every"
++#~ msgstr "Vérification forcée toutes les"
++
++#~ msgid "Force-time unit"
++#~ msgstr "Unité de temps pour la vérification forcée"
++
++#~ msgid "Hostname"
++#~ msgstr "Nom d'hôte"
++
++#~ msgid "Service"
++#~ msgstr "Service"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Source de l'adresse IP"
++
++#~ msgid "custom"
++#~ msgstr "personnalisé"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "h"
++
++#~ msgid "interface"
++#~ msgstr "interface"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "min"
++
++#~ msgid "network"
++#~ msgstr "réseau"
++
++#~ msgid "Event interface"
++#~ msgstr "Événement sur l'interface"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr "Sur quelle interface devrait démarrer le processus du script ddns."
+diff --git a/feeds/luci/applications/luci-app-ddns/po/he/ddns.po b/feeds/luci/applications/luci-app-ddns/po/he/ddns.po
+new file mode 100644
+index 0000000..45f5a6d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/he/ddns.po
+@@ -0,0 +1,701 @@
++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2012-09-10 04:26+0200\n"
++"Last-Translator: Snoof <sagim9@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++#, fuzzy
++msgid "Custom update-URL"
++msgstr "עדכן URL ב×ופן ידני"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "DNS דינ×מי"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"שירות DDNS מ×פשר גישה לנתב שלך ×¢\"×™ ×©× ×“×•×ž×™×™×Ÿ קבוע, בעוד כתובת ×”- IP שלך "
++"משתנה ב×ופן דינמי."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "ממשק"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "רשת"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "סיסמ×"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "×©× ×ž×©×ª×ž×©"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "בצע בדיקה ל- IP שהתחלף כל"
++
++#~ msgid "Check-time unit"
++#~ msgstr "בדוק-יחידת זמן"
++
++#~ msgid "Enable"
++#~ msgstr "×פשר"
++
++#~ msgid "Force update every"
++#~ msgstr "×לץ עדכון כל"
++
++#, fuzzy
++#~ msgid "Force-time unit"
++#~ msgstr "יחידת זמן של ×ילוץ"
++
++#~ msgid "Service"
++#~ msgstr "שירות"
++
++#~ msgid "Source of IP address"
++#~ msgstr "מקור כתובת IP"
++
++#~ msgid "custom"
++#~ msgstr "מות×× ×ישית"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "ש'"
++
++#~ msgid "interface"
++#~ msgstr "ממשק"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "דק'"
++
++#~ msgid "network"
++#~ msgstr "רשת"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/hu/ddns.po b/feeds/luci/applications/luci-app-ddns/po/hu/ddns.po
+new file mode 100644
+index 0000000..20388d3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/hu/ddns.po
+@@ -0,0 +1,708 @@
++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2013-01-28 13:49+0200\n"
++"Last-Translator: Gábor <vargalex@freemail.hu>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "Egyéni update-URL"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "Dinamikus DNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"A dinamikus DNS lehetővé teszi, hogy a routere elérhető legyen egy fix host "
++"névvel akkor is ha dinamikusan változó IP címmel rendelkezik."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfész"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Hálózat"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Jelszó"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Felhasználónév"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "IP-cím változás ellenőrzése minden"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Időegység"
++
++#~ msgid "Enable"
++#~ msgstr "Engedélyezés"
++
++#~ msgid "Force update every"
++#~ msgstr "Frissítés erőltetése minden"
++
++#~ msgid "Force-time unit"
++#~ msgstr "Időegység"
++
++#~ msgid "Hostname"
++#~ msgstr "Hostnév"
++
++#~ msgid "Service"
++#~ msgstr "Szervíz"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Az IP cím forrása"
++
++#~ msgid "custom"
++#~ msgstr "egyéni"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "óra"
++
++#~ msgid "interface"
++#~ msgstr "interfész"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "perc"
++
++#~ msgid "network"
++#~ msgstr "hálózat"
++
++#~ msgid "Event interface"
++#~ msgstr "Esemény interfész"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr "Melyik interfész indulása váltsa ki a ddns script indítását."
+diff --git a/feeds/luci/applications/luci-app-ddns/po/it/ddns.po b/feeds/luci/applications/luci-app-ddns/po/it/ddns.po
+new file mode 100644
+index 0000000..77ebfb7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/it/ddns.po
+@@ -0,0 +1,706 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2013-02-03 13:53+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "URL di aggiornamento personalizzato"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "DNS Dinamico"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"DNS Dinamico permette al tuo router di essere raggiunto con un indirizzo "
++"statico anche nel caso in cui tu disponga di un indirizzo IP dinamico."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfaccia"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Rete"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Password"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Nome Utente"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Controlla se cambia l'IP ogni"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Check-time unit"
++
++#~ msgid "Enable"
++#~ msgstr "Abilita"
++
++#~ msgid "Force update every"
++#~ msgstr "Forza aggiornamento ogni"
++
++#~ msgid "Force-time unit"
++#~ msgstr "Unità di tempo per l'aggiornamento"
++
++#~ msgid "Hostname"
++#~ msgstr "Nome Host"
++
++#~ msgid "Service"
++#~ msgstr "Servizio"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Origine dell'indirizzo IP"
++
++#~ msgid "custom"
++#~ msgstr "personalizzato"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "o"
++
++#~ msgid "interface"
++#~ msgstr "interfaccia"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "min"
++
++#~ msgid "network"
++#~ msgstr "rete"
++
++#~ msgid "Event interface"
++#~ msgstr "Evento interfaccia"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr "Su quale interfaccia dovrebbe iniziare il processo di script DDNS."
+diff --git a/feeds/luci/applications/luci-app-ddns/po/ja/ddns.po b/feeds/luci/applications/luci-app-ddns/po/ja/ddns.po
+new file mode 100644
+index 0000000..1b608aa
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/ja/ddns.po
+@@ -0,0 +1,708 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2013-10-05 17:19+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "手動アップデート-URL"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "ダイナミックDNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"ダイナミックDNSを使用ã™ã‚‹ã“ã¨ã§ã€IPアドレスãŒå¤‰æ›´ã•ã‚Œã¦ã‚‚固定ã®ãƒ›ã‚¹ãƒˆåを使ã£"
++"ã¦ãƒ«ãƒ¼ã‚¿ãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "インターフェース"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "パスワード"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "ユーザーå"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "IPアドレスãŒå¤‰åŒ–ã—ãŸã‹ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†é–“éš”"
++
++#~ msgid "Check-time unit"
++#~ msgstr "ãƒã‚§ãƒƒã‚¯ã®æ™‚é–“å˜ä½"
++
++#~ msgid "Enable"
++#~ msgstr "有効"
++
++#~ msgid "Force update every"
++#~ msgstr "強制的ã«ã‚¢ãƒƒãƒ—デートを行ã†é–“éš”"
++
++#~ msgid "Force-time unit"
++#~ msgstr "アップデートã®æ™‚é–“å˜ä½"
++
++#~ msgid "Hostname"
++#~ msgstr "ホストå"
++
++#~ msgid "Service"
++#~ msgstr "サービス"
++
++#~ msgid "Source of IP address"
++#~ msgstr "é€ä¿¡å…ƒIPアドレス"
++
++#~ msgid "custom"
++#~ msgstr "手動設定"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "時"
++
++#~ msgid "interface"
++#~ msgstr "インターフェース"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "分"
++
++#~ msgid "network"
++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++#~ msgid "Event interface"
++#~ msgstr "イベントインターフェース"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr ""
++#~ "ã©ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ãŒèµ·å‹•ã—ãŸéš›ã«ddnsスクリプトを開始ã™ã‚‹ã‹è¨­å®šã—ã¦ãã ã•"
++#~ "ã„。"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/ms/ddns.po b/feeds/luci/applications/luci-app-ddns/po/ms/ddns.po
+new file mode 100644
+index 0000000..ea11b9e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/ms/ddns.po
+@@ -0,0 +1,657 @@
++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2010-04-02 13:44+0100\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr ""
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr ""
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr ""
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ddns/po/no/ddns.po b/feeds/luci/applications/luci-app-ddns/po/no/ddns.po
+new file mode 100644
+index 0000000..80374ee
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/no/ddns.po
+@@ -0,0 +1,689 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "Egendefinert oppdaterings-URL"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "Dynamisk DNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"Dynamisk DNS tillater at enheten kan kontaktes ved hjelp av et fast "
++"vertsnavn, uavhengig av om IP adressen endres dynamisk."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Grensesnitt"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Nettverk"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Passord"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Brukernavn"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Undersøk om IP er endret hver"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Tidsenhet"
++
++#~ msgid "Enable"
++#~ msgstr "Aktiver"
++
++#~ msgid "Force update every"
++#~ msgstr "Tving oppdatering hver"
++
++#~ msgid "Force-time unit"
++#~ msgstr "Tidsenhet"
++
++#~ msgid "Hostname"
++#~ msgstr "Vertsnavn"
++
++#~ msgid "Service"
++#~ msgstr "Tjeneste"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Kilden til IP adresse"
++
++#~ msgid "custom"
++#~ msgstr "egendefinert"
++
++#~ msgid "h"
++#~ msgstr "timer"
++
++#~ msgid "interface"
++#~ msgstr "grensesnitt"
++
++#~ msgid "min"
++#~ msgstr "minutter"
++
++#~ msgid "network"
++#~ msgstr "nettverk"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/pl/ddns.po b/feeds/luci/applications/luci-app-ddns/po/pl/ddns.po
+new file mode 100644
+index 0000000..9907b1e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/pl/ddns.po
+@@ -0,0 +1,707 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2013-01-06 13:08+0200\n"
++"Last-Translator: obsy <cezary@eko.one.pl>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "Niestandardowy adres aktualizacyjny"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "Dynamiczny DNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"Dynamiczny DNS umożliwia dostęp do routera z użyciem stałej nazwy hosta, "
++"pomimo posiadania dynamicznie zmieniajÄ…cego siÄ™ adresu IP."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfejs"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Sieć"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Hasło"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Nazwa użytkownika"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Sprawdzaj zmiany adresu IP co"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Jednostka czasu sprawdzania"
++
++#~ msgid "Enable"
++#~ msgstr "WÅ‚Ä…cz"
++
++#~ msgid "Force update every"
++#~ msgstr "Wymuszaj aktualizacjÄ™ co"
++
++#~ msgid "Force-time unit"
++#~ msgstr "Jednostka czasu wymuszania"
++
++#~ msgid "Hostname"
++#~ msgstr "Nazwa hosta"
++
++#~ msgid "Service"
++#~ msgstr "Usługa"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Źródło adresu IP"
++
++#~ msgid "custom"
++#~ msgstr "niestandardowe"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "godz."
++
++#~ msgid "interface"
++#~ msgstr "interfejs"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "min"
++
++#~ msgid "network"
++#~ msgstr "sieć"
++
++#~ msgid "Event interface"
++#~ msgstr "Interfejs"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr "Określa interfejs na którym zostanie uruchomiony skrypt ddns."
+diff --git a/feeds/luci/applications/luci-app-ddns/po/pt-br/ddns.po b/feeds/luci/applications/luci-app-ddns/po/pt-br/ddns.po
+new file mode 100644
+index 0000000..5dd243f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/pt-br/ddns.po
+@@ -0,0 +1,708 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2012-11-03 07:02+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "URL para atualização personalizada"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "DNS Dinâmico"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"O DNS dinâmico permite que o seu roteador possa ser encontrado a partir de "
++"um nome fixo, mesmo usando um Endereço IP dinâmico."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Rede"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Senha"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Usuário"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Verifique por alterações no endereço IP a cada"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Unidade de tempo para verificação"
++
++#~ msgid "Enable"
++#~ msgstr "Habilitar"
++
++#~ msgid "Force update every"
++#~ msgstr "Forçar atualização a cada"
++
++#~ msgid "Force-time unit"
++#~ msgstr "Unidade de tempo para atualização forçada"
++
++#~ msgid "Hostname"
++#~ msgstr "Nome do computador"
++
++#~ msgid "Service"
++#~ msgstr "Serviço"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Origem do Endereço IP"
++
++#~ msgid "custom"
++#~ msgstr "personalizado"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "h"
++
++#~ msgid "interface"
++#~ msgstr "interface"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "min"
++
++#~ msgid "network"
++#~ msgstr "rede"
++
++#~ msgid "Event interface"
++#~ msgstr "Interface de eventos"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr ""
++#~ "Na subida de qual interface que o processo do script ddns deve ser "
++#~ "iniciado"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/pt/ddns.po b/feeds/luci/applications/luci-app-ddns/po/pt/ddns.po
+new file mode 100644
+index 0000000..a788ad2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/pt/ddns.po
+@@ -0,0 +1,711 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2013-05-31 23:52+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++#, fuzzy
++msgid "Custom update-URL"
++msgstr "URL para actualização personalizada"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "DNS Dinâmico"
++
++#, fuzzy
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"O DNS dinâmico permite que o seu router possa ser encontrado a partir de um "
++"hostname fixo, mesmo usando um Endereço IP dinâmico."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Rede"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Password"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Nome de Utilizador"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Intervalo para verificação de alteração do endereço IP"
++
++#, fuzzy
++#~ msgid "Check-time unit"
++#~ msgstr "Unidade de tempo para verificação"
++
++#~ msgid "Enable"
++#~ msgstr "Ativar"
++
++#~ msgid "Force update every"
++#~ msgstr "Forçar actualização a cada"
++
++#, fuzzy
++#~ msgid "Force-time unit"
++#~ msgstr "Unidade de tempo para actualização forçada"
++
++#~ msgid "Hostname"
++#~ msgstr "Nome de Host"
++
++#~ msgid "Service"
++#~ msgstr "Serviço"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Origem do Endereço IP"
++
++#~ msgid "custom"
++#~ msgstr "personalizado"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "h"
++
++#~ msgid "interface"
++#~ msgstr "interface"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "min"
++
++#~ msgid "network"
++#~ msgstr "rede"
++
++#~ msgid "Event interface"
++#~ msgstr "Interface do evento"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr ""
++#~ "Em que interface deve ser iniciado o script para o processo de ddns."
+diff --git a/feeds/luci/applications/luci-app-ddns/po/ro/ddns.po b/feeds/luci/applications/luci-app-ddns/po/ro/ddns.po
+new file mode 100644
+index 0000000..f32c6e9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/ro/ddns.po
+@@ -0,0 +1,709 @@
++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2013-09-25 19:11+0200\n"
++"Last-Translator: Mihai <WyRwSyK@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "Adresa particularizata de actualizare"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "DNS dinamic"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"DNS-ul dinamic permite accesarea routerului printr-un nume dns fix legat de "
++"adresa dinamic IP."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfata"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Retea"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Parola"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Utilizator"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Verifica pentru adresa IP schimbata la fiecare"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Unitatea de verificare timp"
++
++#~ msgid "Enable"
++#~ msgstr "Activeaza"
++
++#~ msgid "Force update every"
++#~ msgstr "Forteaza actualizarea la fiecare"
++
++#~ msgid "Force-time unit"
++#~ msgstr "Unitatea de timp la fortare actualizare"
++
++#~ msgid "Hostname"
++#~ msgstr "Nume host"
++
++#~ msgid "Service"
++#~ msgstr "Serviciu"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Sursa adresei IP"
++
++#~ msgid "custom"
++#~ msgstr "particularizat"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "ore"
++
++#~ msgid "interface"
++#~ msgstr "interfata"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "minut(e)"
++
++#~ msgid "network"
++#~ msgstr "retea"
++
++#~ msgid "Event interface"
++#~ msgstr "Interfata eveniment"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr "Pe care interfata trebuie sa porneasca scriptul ddns"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/ru/ddns.po b/feeds/luci/applications/luci-app-ddns/po/ru/ddns.po
+new file mode 100644
+index 0000000..e76cda6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/ru/ddns.po
+@@ -0,0 +1,709 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: ddns\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2012-11-01 21:54+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "ПользовательÑкий URL обновлениÑ"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "ДинамичеÑкий DNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"ДинамичеÑкий DNS позволÑет вашему маршрутизатору иметь поÑтоÑнное доменное "
++"Ð¸Ð¼Ñ Ð¿Ñ€Ð¸ динамичеÑком IP-адреÑе."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "ИнтерфейÑ"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Сеть"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Пароль"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "ПроверÑÑ‚ÑŒ, изменилÑÑ Ð»Ð¸ IP Ð°Ð´Ñ€ÐµÑ ÐºÐ°Ð¶Ð´Ñ‹Ðµ"
++
++#~ msgid "Check-time unit"
++#~ msgstr "Единица Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸"
++
++#~ msgid "Enable"
++#~ msgstr "Включить"
++
++#~ msgid "Force update every"
++#~ msgstr "Принудительно обновлÑÑ‚ÑŒ каждые"
++
++#~ msgid "Force-time unit"
++#~ msgstr "Единица Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ"
++
++#~ msgid "Hostname"
++#~ msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта"
++
++#~ msgid "Service"
++#~ msgstr "СервиÑ"
++
++#~ msgid "Source of IP address"
++#~ msgstr "ИÑточник IP-адреÑа"
++
++#~ msgid "custom"
++#~ msgstr "пользовательÑкий"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "ч"
++
++#~ msgid "interface"
++#~ msgstr "интерфейÑ"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "мин"
++
++#~ msgid "network"
++#~ msgstr "Ñеть"
++
++#~ msgid "Event interface"
++#~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑобытиÑ"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr ""
++#~ "При включении какого интерфейÑа должен запуÑкатьÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑ Ñкрипта DDNS."
+diff --git a/feeds/luci/applications/luci-app-ddns/po/sk/ddns.po b/feeds/luci/applications/luci-app-ddns/po/sk/ddns.po
+new file mode 100644
+index 0000000..45e6632
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/sk/ddns.po
+@@ -0,0 +1,652 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr ""
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr ""
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr ""
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ddns/po/sv/ddns.po b/feeds/luci/applications/luci-app-ddns/po/sv/ddns.po
+new file mode 100644
+index 0000000..c3b7c56
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/sv/ddns.po
+@@ -0,0 +1,653 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr ""
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr ""
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr ""
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ddns/po/templates/ddns.pot b/feeds/luci/applications/luci-app-ddns/po/templates/ddns.pot
+new file mode 100644
+index 0000000..3538680
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/templates/ddns.pot
+@@ -0,0 +1,645 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr ""
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr ""
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr ""
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ddns/po/tr/ddns.po b/feeds/luci/applications/luci-app-ddns/po/tr/ddns.po
+new file mode 100644
+index 0000000..74be14a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/tr/ddns.po
+@@ -0,0 +1,672 @@
++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2013-11-25 14:27+0200\n"
++"Last-Translator: qbilay <qbilay@mynet.com>\n"
++"Language-Team: none\n"
++"Language: tr\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: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr ""
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr ""
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "Arabirim"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "AÄŸ"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Parola"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr ""
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Kullanıcı adı"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Service"
++#~ msgstr "Servis"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Ip adresi kaynağı"
++
++# "arayüz" olarakta kullanılabilir.
++#~ msgid "interface"
++#~ msgstr "arabirim"
++
++#~ msgid "network"
++#~ msgstr "aÄŸ"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/uk/ddns.po b/feeds/luci/applications/luci-app-ddns/po/uk/ddns.po
+new file mode 100644
+index 0000000..58ded21
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/uk/ddns.po
+@@ -0,0 +1,709 @@
++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2012-12-29 12:47+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "КориÑтувацький URL оновленнÑ"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "Динамічний DNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"Динамічний DNS дозволÑÑ” вашому маршрутизатору бути доÑтупним за фікÑованим "
++"доменним ім'Ñм, маючи динамічну IP-адреÑу."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "ІнтерфейÑ"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "Мережа"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "Пароль"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "ПеревірÑти, чи змінилаÑÑ IP-адреÑа кожні"
++
++#~ msgid "Check-time unit"
++#~ msgstr "ÐžÐ´Ð¸Ð½Ð¸Ñ†Ñ Ñ‡Ð°Ñу перевірки"
++
++#~ msgid "Enable"
++#~ msgstr "Увімкнути"
++
++#~ msgid "Force update every"
++#~ msgstr "ПримуÑово оновлювати кожні"
++
++#~ msgid "Force-time unit"
++#~ msgstr "ÐžÐ´Ð¸Ð½Ð¸Ñ†Ñ Ñ‡Ð°Ñу оновленнÑ"
++
++#~ msgid "Hostname"
++#~ msgstr "Ім'Ñ Ð²ÑƒÐ·Ð»Ð°"
++
++#~ msgid "Service"
++#~ msgstr "СервіÑ"
++
++#~ msgid "Source of IP address"
++#~ msgstr "Джерело IP-адреÑи"
++
++#~ msgid "custom"
++#~ msgstr "кориÑтувацький"
++
++# Hours
++#~ msgid "h"
++#~ msgstr "г"
++
++#~ msgid "interface"
++#~ msgstr "інтерфейÑ"
++
++# Minutes (not minimum)
++#~ msgid "min"
++#~ msgstr "хв"
++
++#~ msgid "network"
++#~ msgstr "мережа"
++
++#~ msgid "Event interface"
++#~ msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð´Ñ–Ñ—"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr "При вмиканні Ñкого інтерфейÑу має запуÑкатиÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñкрипта DDNS."
+diff --git a/feeds/luci/applications/luci-app-ddns/po/vi/ddns.po b/feeds/luci/applications/luci-app-ddns/po/vi/ddns.po
+new file mode 100644
+index 0000000..4b0cc91
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/vi/ddns.po
+@@ -0,0 +1,680 @@
++# ddns.pot
++# generated from ./applications/luci-ddns/luasrc/i18n/ddns.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2009-08-12 18:06+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++#, fuzzy
++msgid "Custom update-URL"
++msgstr "Tùy chỉnh cập nhật - URL"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "Dynamic DNS"
++
++#, fuzzy
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"Dynamic DNS cho phép bộ định tuyến có thể được đạt đến với một hostname cố "
++"định, trong khi có một địa chỉ AP thay đổi năng động."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr ""
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "Kiểm tra mỗi thay đổi IP"
++
++#, fuzzy
++#~ msgid "Check-time unit"
++#~ msgstr "ÄÆ¡n vị kiểm tra thá»i gian"
++
++#~ msgid "Force update every"
++#~ msgstr "Buộc cập nhật mỗi"
++
++#, fuzzy
++#~ msgid "Force-time unit"
++#~ msgstr "Force-Ä‘Æ¡n vị thá»i gian"
++
++#, fuzzy
++#~ msgid "Source of IP address"
++#~ msgstr "Nguồn của địa chỉ IP"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/zh-cn/ddns.po b/feeds/luci/applications/luci-app-ddns/po/zh-cn/ddns.po
+new file mode 100644
+index 0000000..381e668
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/zh-cn/ddns.po
+@@ -0,0 +1,670 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: \n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-02 13:44+0100\n"
++"PO-Revision-Date: 2015-04-23 13:00+0800\n"
++"Last-Translator: Syrone Wong <wong.syrone@gmail.com>\n"
++"Language: zh_CN\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 1.7.5\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr "-- 自定义 --"
++
++msgid "-- default --"
++msgstr "-- 默认 --"
++
++msgid "Advanced Settings"
++msgstr "高级设置"
++
++msgid "Allow non-public IP's"
++msgstr "å…许éžå…¬ç½‘IP"
++
++msgid "Applying changes"
++msgstr "正在应用更改"
++
++msgid "Basic Settings"
++msgstr "基础设置"
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr "以下是一个能够让你的系统ä¸å—é™åˆ¶åœ°è¿›è¡ŒåŠ¨æ€DNS更新的设置贴士."
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr "一下是当å‰å·²ç»é…置好的DDNS设置项列表以åŠå®ƒä»¬çš„当å‰çŠ¶æ€."
++
++msgid "Bind Network"
++msgstr "使用的接å£"
++
++msgid "Binding to a specific network not supported"
++msgstr "ä¸æ”¯æŒç»‘定到一个指定的网络"
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr "与DDNS供应商通讯时BusyBoxçš„nslookupå’ŒWgetä¸æ”¯æŒè®¾ç½®ç‰¹å®šçš„IPå议版本."
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr "BusyBoxçš„nslookupä¸æ”¯æŒä½¿ç”¨TCPå议代替UDPå议请求DNS记录"
++
++msgid "Casual users should not change this setting"
++msgstr "普通用户ä¸åº”该改å˜è¿™ä¸ªè®¾ç½®"
++
++msgid "Check Interval"
++msgstr "检查时间周期"
++
++msgid "Collecting data..."
++msgstr "正在收集数æ®..."
++
++msgid "Config error"
++msgstr "é…置错误"
++
++msgid "Configuration"
++msgstr "设置"
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr "在这里修改动æ€DNSæœåŠ¡çš„详细é…ç½®"
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr "在这里修改选择的DDNSæœåŠ¡çš„详细é…ç½®"
++
++msgid "Current setting"
++msgstr "当å‰è®¾ç½®"
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++"现在,DDNS更新在开机或者接å£åŠ¨ä½œæ—¶ä¸ä¼šè¢«è§¦å‘<br />如果你手工è¿è¡ŒDDNS脚本的è¯"
++"(例如使用cron时把force_interval设置为0),这是默认设置."
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++"现在,DDNS更新在开机或者接å£åŠ¨ä½œæ—¶ä¸ä¼šè¢«è§¦å‘<br />ä½ å¯ä»¥åœ¨è¿™é‡Œå¼€å§‹/åœæ­¢æ¯ä¸€ä¸ª"
++"设置的æ¡ç›®.它在下次é‡å¯ä¹‹å‰ä¸€ç›´æœ‰æ•ˆ."
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr "用æ¥æ›´æ–°åŠ¨æ€DNS的自定义脚本"
++
++msgid "Custom update-URL"
++msgstr "自定义更新URL"
++
++msgid "Custom update-script"
++msgstr "自定义更新脚本"
++
++msgid "DDNS Autostart disabled"
++msgstr "DDNS自动å¯åŠ¨å·²ç¦ç”¨."
++
++msgid "DDNS Service provider"
++msgstr "DDNSæœåŠ¡æ供商"
++
++msgid "DNS requests via TCP not supported"
++msgstr "ä¸æ”¯æŒä½¿ç”¨TCP进行DNS解æž"
++
++msgid "DNS-Server"
++msgstr "DNSæœåŠ¡å™¨"
++
++msgid "Date format"
++msgstr "日期格å¼"
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr "设定用æ¥è¯»å–系统IPv4地å€çš„网页"
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr "设定用æ¥è¯»å–系统IPv6地å€çš„网页"
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr "设定用æ¥è¯»å–系统IP地å€çš„接å£"
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr "设定用æ¥è¯»å–系统IPv4地å€çš„网络"
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr "设定用æ¥è¯»å–系统IPv6地å€çš„网络"
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr "设定IPv4地å€çš„æ¥æº.这将会被å‘é€ç»™DDNSæ供商"
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr "设定IPv6地å€çš„æ¥æº.这将会被å‘é€ç»™DDNSæ供商"
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr "设定哪一个IP地å€(IPv4或IPv6)会被å‘é€ç»™DDNSæ供商"
++
++msgid "Details for"
++msgstr "详情:"
++
++msgid "Directory contains Log files for each running section"
++msgstr "ä¿å­˜æ¯ä¸€ä¸ªè¿è¡Œä¸­çš„设置的è¿è¡Œæ—¥å¿—的目录"
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr "ä¿å­˜æ¯ä¸ªè¿è¡Œä¸­çš„设置的PID以åŠå…¶å®ƒçŠ¶æ€ä¿¡æ¯çš„目录"
++
++msgid "Disabled"
++msgstr "å·²ç¦ç”¨"
++
++msgid "Dynamic DNS"
++msgstr "动æ€DNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr "动æ€DNSå…许为拥有动æ€IP的主机é…置一个固定的å¯è®¿é—®åŸŸå."
++
++msgid "Enable secure communication with DDNS provider"
++msgstr "å¯ç”¨å®‰å…¨è¿žæŽ¥ä¸ŽDDNS供应商è”ç³»"
++
++msgid "Enabled"
++msgstr "å·²å¯ç”¨"
++
++msgid "Error"
++msgstr "错误"
++
++msgid "Error Retry Counter"
++msgstr "错误é‡è¯•è®¡æ•°"
++
++msgid "Error Retry Interval"
++msgstr "错误é‡è¯•é—´éš”"
++
++msgid "Event Network"
++msgstr "事件网络"
++
++msgid "File"
++msgstr "文件"
++
++msgid "File not found"
++msgstr "文件未找到"
++
++msgid "File not found or empty"
++msgstr "文件未找到或为空"
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++"打开这个链接<br />你将会得到更多关于如何通过所有设置项优化你的系统以è¿è¡ŒDDNS"
++"脚本的æ示."
++
++msgid "For detailed information about parameter settings look here."
++msgstr "请看这里获得关于å‚数设置的详细信æ¯"
++
++msgid "For supported codes look here"
++msgstr "查看这里获å–支æŒçš„ç¼–ç "
++
++msgid "Force IP Version"
++msgstr "强制设定IP版本"
++
++msgid "Force IP Version not supported"
++msgstr "ä¸æ”¯æŒå¼ºåˆ¶è®¾å®šIP版本"
++
++msgid "Force Interval"
++msgstr "设定周期"
++
++msgid "Force TCP on DNS"
++msgstr "强制使用TCP进行DNS查询"
++
++msgid "Forced IP Version don't matched"
++msgstr "强制设定的IP版本ä¸åŒ¹é…"
++
++msgid "Format"
++msgstr "æ ¼å¼"
++
++msgid "Format: IP or FQDN"
++msgstr "æ ¼å¼:IP或者FQDN"
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr "GNU Wget将会使用给定的网络的IP地å€,而cURL将会使用物ç†æŽ¥å£"
++
++msgid "Global Settings"
++msgstr "全局设置"
++
++msgid "HTTPS not supported"
++msgstr "ä¸æ”¯æŒHTTPS"
++
++msgid "Hints"
++msgstr "æ示"
++
++msgid "Hostname/Domain"
++msgstr "主机å/域å"
++
++msgid "IP address source"
++msgstr "IP地å€æ¥æº"
++
++msgid "IP address version"
++msgstr "IP地å€ç‰ˆæœ¬"
++
++msgid "IPv4-Address"
++msgstr "IPv4地å€"
++
++msgid "IPv6 address must be given in square brackets"
++msgstr "IPv6地å€å¿…须填写在中括å·(\"[ ]\")内"
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++"当å‰ç³»ç»Ÿæš‚æ—¶ä¸èƒ½(完整地)支æŒIPv6<br />请查看OpenWrt首页的介ç»ä»¥å¯ç”¨IPv6支æŒ"
++"<br />或者更新你的系统到最新OpenWrt版本"
++
++msgid "IPv6 not supported"
++msgstr "IPv6ä¸è¢«æ”¯æŒ"
++
++msgid "IPv6-Address"
++msgstr "IPv6地å€"
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr "如果cURLå’ŒGNU WgetåŒæ—¶è¢«å®‰è£…,那么Wget将会被优先使用."
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++"如果æœåŠ¡é…置被ç¦ç”¨é‚£ä¹ˆå®ƒå°†ä¸èƒ½è¢«å¯åŠ¨.<br />无论是通过LuCI页é¢æˆ–者是通过终端."
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++"如果你需è¦åŒæ—¶æ›´æ–°IPv4å’ŒIPv6地å€,你需è¦å•ç‹¬æ·»åŠ ä¸¤ä¸ªé…置项(例"
++"如'myddns_ipv4'和'myddns_ipv6')"
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr "OpenWrt中,cURL/libcurlçš„æŸäº›ç‰ˆæœ¬ç¼–译时没有å¯ç”¨ä»£ç†æœåŠ¡å™¨æ”¯æŒ"
++
++msgid "Info"
++msgstr "ä¿¡æ¯"
++
++msgid "Interface"
++msgstr "接å£"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr "检查IP是å¦æ”¹å˜çš„时间隔<br />ä¸æ”¯æŒä½ŽäºŽ5分钟(300秒)的数值."
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++"强制å‘æ供商更新DDNS的时间周期<br />把这个å‚数设置为0将会让脚本仅执行一次"
++"<br />ä¸æ”¯æŒä½ŽäºŽ\"检查时间周期\"的数值(除了0)."
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr "强烈ä¸å»ºè®®åˆæ¬¡ä½¿ç”¨çš„用户修改本页设定."
++
++msgid "Last Update"
++msgstr "上次更新"
++
++msgid "Loading"
++msgstr "加载中"
++
++msgid "Log File Viewer"
++msgstr "日志查看器"
++
++msgid "Log directory"
++msgstr "日志目录"
++
++msgid "Log length"
++msgstr "日志长度"
++
++msgid "Log to file"
++msgstr "把日志记录到文件"
++
++msgid "Log to syslog"
++msgstr "把日志记录到系统日志"
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr "包å«SSL支æŒçš„GNU Wget或者cURLå‡æœªè¢«å®‰è£….无法选择一个网络用于通信."
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr "包å«SSL支æŒçš„GNU Wget或者cURLå‡æœªè¢«å®‰è£….无法使用HTTPSæ›´æ–°DDNS"
++
++msgid "Network"
++msgstr "网络"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr "DDNS更新脚本将会被è¿è¡ŒäºŽè¯¥ç½‘络"
++
++msgid "Never"
++msgstr "从ä¸"
++
++msgid "Next Update"
++msgstr "下次更新"
++
++msgid "No data"
++msgstr "æ— æ•°æ®"
++
++msgid "No logging"
++msgstr "无日志"
++
++msgid "Non-public and by default blocked IP's"
++msgstr "éžå…¬ç½‘IP以åŠé»˜è®¤è¢«é”定的IP"
++
++msgid "Notice"
++msgstr "æ示"
++
++msgid "Number of last lines stored in log files"
++msgstr "日志文件中的最åŽå‡ è¡Œ"
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr "å¯é€‰:强制使用仅IPv4/IPv6通信."
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr "å¯é€‰:强制使用TCP而éžUDP请求DNS."
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr "å¯é€‰:用于通信的网络"
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr "å¯é€‰:用于检测以åŠæ›´æ–°çš„代ç†æœåŠ¡å™¨"
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr "å¯é€‰:使用éžé»˜è®¤DNSæœåŠ¡å™¨æ£€æµ‹\"已注册的IP地å€\""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr "当出错时,脚本将会é‡è¯•å¤±è´¥çš„动作的次数"
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr "当出错时,脚本将会é‡è¯•è¯¥æ¬¡æ•°ä¹‹åŽé€€å‡º"
++
++msgid "Overview"
++msgstr "总览"
++
++msgid "PROXY-Server"
++msgstr "代ç†æœåŠ¡å™¨"
++
++msgid "PROXY-Server not supported"
++msgstr "ä¸æ”¯æŒä»£ç†æœåŠ¡å™¨"
++
++msgid "Password"
++msgstr "密ç "
++
++msgid "Path to CA-Certificate"
++msgstr "CAè¯ä¹¦è·¯å¾„"
++
++msgid "Please [Save & Apply] your changes first"
++msgstr "请先ä¿å­˜å¹¶åº”用您的设置"
++
++msgid "Please press [Read] button"
++msgstr "请按下\"读å–\"按钮"
++
++msgid "Please update to the current version!"
++msgstr "请更新到最新版本!"
++
++msgid "Process ID"
++msgstr "处ç†ID"
++
++msgid "Read / Reread log file"
++msgstr "读å–/é‡æ–°è¯»å–日志文件"
++
++msgid "Registered IP"
++msgstr "已注册的IP地å€"
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr "在更新URL中使用[DOMAIN]替æ¢åŸŸå"
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr "在更新URL中使用[PASSWORD]替æ¢å¯†ç "
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr "在更新URL中使用[USERNAME]替æ¢ç”¨æˆ·å"
++
++msgid "Run once"
++msgstr "è¿è¡Œä¸€æ¬¡"
++
++msgid "Script"
++msgstr "脚本"
++
++msgid "Show more"
++msgstr "查看更多"
++
++msgid "Software update required"
++msgstr "需è¦è¿›è¡Œè½¯ä»¶æ›´æ–°"
++
++msgid "Start"
++msgstr "å¯ç”¨"
++
++msgid "Start / Stop"
++msgstr "å¯ç”¨/ç¦ç”¨"
++
++msgid "Status directory"
++msgstr "状æ€ç›®å½•"
++
++msgid "Stopped"
++msgstr "å·²åœæ­¢"
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr "当å‰å·²å®‰è£…çš„'ddns-scripts'软件包暂ä¸æ”¯æŒæ‰€æœ‰å¯ç”¨è®¾ç½®é¡¹"
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr "没有已ç»é…置好的æœåŠ¡é¡¹"
++
++msgid "Timer Settings"
++msgstr "计时器设定"
++
++msgid "To change global settings click here"
++msgstr "点击这里以更改全局设置"
++
++msgid "To use cURL activate this option."
++msgstr "选中这个项以使用cURL"
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr "用于检测的URL"
++
++msgid "Unknown error"
++msgstr "未知错误"
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++"DDNSæ供商用于更新DDNSçš„URL<br />è·Ÿéšæ•™ç¨‹ä½ å°†ä¼šåœ¨å®ƒä»¬çš„网站上æ供这个URL."
++
++msgid "Update error"
++msgstr "更新错误"
++
++msgid "Use HTTP Secure"
++msgstr "使用HTTPS"
++
++msgid "Use cURL"
++msgstr "使用cURL"
++
++msgid "User defined script to read systems IP-Address"
++msgstr "使用设定的脚本æ¥è¯»å–系统IP地å€"
++
++msgid "Username"
++msgstr "用户å"
++
++msgid "Verify"
++msgstr "验è¯"
++
++msgid "Version"
++msgstr "版本"
++
++msgid "Version Information"
++msgstr "版本信æ¯"
++
++msgid "Waiting for changes to be applied..."
++msgstr "正在应用更改..."
++
++msgid "Warning"
++msgstr "等待"
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr "å‘日志中写入详细信æ¯.文件将会被自动å‡å°."
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr "把日志写入系统日志.无论是å¦å¯ç”¨è¿™é¡¹,错误信æ¯æ€»æ˜¯ä¼šè¢«å†™å…¥ç³»ç»Ÿæ—¥å¿—"
++
++msgid "You should install BIND host package for DNS requests."
++msgstr "你需è¦å®‰è£…BIND以请求DNS记录."
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr "你需è¦å®‰è£…包å«SSL支æŒçš„GNU Wget(推è)或是cURL软件包."
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr "你需è¦å®‰è£…包å«SSL支æŒçš„GNU Wget或是cURL软件包."
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr "你需è¦å®‰è£…包å«SSL支æŒçš„GNU Wget或替æ¢libcurl."
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr "cURLå·²ç»å®‰è£…,但是libcurl编译时没有å¯ç”¨ä»£ç†æ”¯æŒ."
++
++msgid "cURL without Proxy Support"
++msgstr "cURLä¸åŒ…å«ä»£ç†æ”¯æŒ"
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr "ä¸èƒ½ç¡®å®šæœ¬åœ°IP.请更æ¢IPæ¥æº."
++
++msgid "can not resolve host:"
++msgstr "ä¸èƒ½è§£æžä¸»æœº:"
++
++msgid "config error"
++msgstr "é…置错误"
++
++msgid "days"
++msgstr "天"
++
++msgid "directory or path/file"
++msgstr "目录或者到文件的路径"
++
++msgid "either url or script could be set"
++msgstr "接å—URL或者脚本"
++
++msgid "enable here"
++msgstr "在这里å¯ç”¨"
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr "文件或目录未找到或未\"被忽视\""
++
++msgid "help"
++msgstr "帮助"
++
++msgid "hours"
++msgstr "å°æ—¶"
++
++msgid "installed"
++msgstr "已安装"
++
++msgid "invalid - Sample"
++msgstr "ä¸åˆæ³• - 示例"
++
++msgid "minimum value '0'"
++msgstr "最å°å€¼0"
++
++msgid "minimum value '1'"
++msgstr "最å°å€¼1"
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr "最å°å€¼ä¸º5分钟(300秒)"
++
++msgid "minutes"
++msgstr "分钟"
++
++msgid "missing / required"
++msgstr "必须填写"
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr "必须大于或等于\"检查时间周期\""
++
++msgid "must start with 'http://'"
++msgstr "必须以'http://'开头"
++
++msgid "nc (netcat) can not connect"
++msgstr "nc(netcat)ä¸å¯è¿žæŽ¥"
++
++msgid "never"
++msgstr "从ä¸"
++
++msgid "no data"
++msgstr "æ— æ•°æ®"
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr "未找到或者ä¸å¯æ‰§è¡Œ - 示例: '/path/to/script.sh'"
++
++msgid "nslookup can not resolve host"
++msgstr "nslookupä¸èƒ½è§£æžä¸»æœº"
++
++msgid "or"
++msgstr "或者"
++
++msgid "or higher"
++msgstr "或者更大"
++
++msgid "please disable"
++msgstr "请ç¦ç”¨"
++
++msgid "please remove entry"
++msgstr "请移除该字段"
++
++msgid "please select 'IPv4' address version"
++msgstr "请设定IPv4地å€"
++
++msgid "please select 'IPv4' address version in"
++msgstr "请设定IPv4地å€äºŽ"
++
++msgid "please set to 'default'"
++msgstr "请设置为\"默认\""
++
++msgid "proxy port missing"
++msgstr "代ç†ç«¯å£æœªå¡«"
++
++msgid "required"
++msgstr "必须填写"
++
++msgid "seconds"
++msgstr "秒"
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr "使用HTTPS但ä¸æ£€æŸ¥æœåŠ¡å™¨è¯ä¹¦(ä¸å®‰å…¨)"
++
++msgid "unknown error"
++msgstr "未知错误"
++
++msgid "unspecific error"
++msgstr "未指定的错误"
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr "使用主机å或IPv4/IPv6地å€"
+diff --git a/feeds/luci/applications/luci-app-ddns/po/zh-tw/ddns.po b/feeds/luci/applications/luci-app-ddns/po/zh-tw/ddns.po
+new file mode 100644
+index 0000000..ec1fe77
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/po/zh-tw/ddns.po
+@@ -0,0 +1,701 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-07 15:53+0200\n"
++"Last-Translator: Ethan <ethan42411@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "&"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- default --"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow non-public IP's"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid ""
++"Below a list of configuration tips for your system to run Dynamic DNS "
++"updates without limitations"
++msgstr ""
++
++msgid ""
++"Below is a list of configured DDNS configurations and their current state."
++msgstr ""
++
++msgid "Bind Network"
++msgstr ""
++
++msgid "Binding to a specific network not supported"
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup and Wget do not support to specify the IP version to use "
++"for communication with DDNS Provider."
++msgstr ""
++
++msgid ""
++"BusyBox's nslookup does not support to specify to use TCP instead of default "
++"UDP when requesting DNS server"
++msgstr ""
++
++msgid "Casual users should not change this setting"
++msgstr ""
++
++msgid "Check Interval"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Config error"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Configure here the details for all Dynamic DNS services including this LuCI "
++"application."
++msgstr ""
++
++msgid "Configure here the details for selected Dynamic DNS service."
++msgstr ""
++
++msgid "Current setting"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">This is the default if you run DDNS scripts by yourself (i.e. via cron with "
++"force_interval set to '0')"
++msgstr ""
++
++msgid ""
++"Currently DDNS updates are not started at boot or on interface events.<br /"
++">You can start/stop each configuration here. It will run until next reboot."
++msgstr ""
++
++msgid "Custom update script to be used for updating your DDNS Provider."
++msgstr ""
++
++msgid "Custom update-URL"
++msgstr "自訂更新的URL"
++
++msgid "Custom update-script"
++msgstr ""
++
++msgid "DDNS Autostart disabled"
++msgstr ""
++
++msgid "DDNS Service provider"
++msgstr ""
++
++msgid "DNS requests via TCP not supported"
++msgstr ""
++
++msgid "DNS-Server"
++msgstr ""
++
++msgid "Date format"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the Web page to read systems IPv6-Address from"
++msgstr ""
++
++msgid "Defines the interface to read systems IP-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv4-Address from"
++msgstr ""
++
++msgid "Defines the network to read systems IPv6-Address from"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv4-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid ""
++"Defines the source to read systems IPv6-Address from, that will be send to "
++"the DDNS provider"
++msgstr ""
++
++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider"
++msgstr ""
++
++msgid "Details for"
++msgstr ""
++
++msgid "Directory contains Log files for each running section"
++msgstr ""
++
++msgid ""
++"Directory contains PID and other status information for each running section"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Dynamic DNS"
++msgstr "å‹•æ…‹DNS"
++
++msgid ""
++"Dynamic DNS allows that your router can be reached with a fixed hostname "
++"while having a dynamically changing IP address."
++msgstr ""
++"å‹•æ…‹DNSå…許為主機é…置一個固定的網域å稱,但該網路å稱å»æ˜¯å°æ‡‰åˆ°å‹•æ…‹çš„IPä½ç½®"
++
++msgid "Enable secure communication with DDNS provider"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Error Retry Counter"
++msgstr ""
++
++msgid "Error Retry Interval"
++msgstr ""
++
++msgid "Event Network"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "File not found"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid ""
++"Follow this link<br />You will find more hints to optimize your system to "
++"run DDNS scripts with all options"
++msgstr ""
++
++msgid "For detailed information about parameter settings look here."
++msgstr ""
++
++msgid "For supported codes look here"
++msgstr ""
++
++msgid "Force IP Version"
++msgstr ""
++
++msgid "Force IP Version not supported"
++msgstr ""
++
++msgid "Force Interval"
++msgstr ""
++
++msgid "Force TCP on DNS"
++msgstr ""
++
++msgid "Forced IP Version don't matched"
++msgstr ""
++
++msgid "Format"
++msgstr ""
++
++msgid "Format: IP or FQDN"
++msgstr ""
++
++msgid ""
++"GNU Wget will use the IP of given network, cURL will use the physical "
++"interface."
++msgstr ""
++
++msgid "Global Settings"
++msgstr ""
++
++msgid "HTTPS not supported"
++msgstr ""
++
++msgid "Hints"
++msgstr ""
++
++msgid "Hostname/Domain"
++msgstr ""
++
++msgid "IP address source"
++msgstr ""
++
++msgid "IP address version"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6 address must be given in square brackets"
++msgstr ""
++
++msgid ""
++"IPv6 is currently not (fully) supported by this system<br />Please follow "
++"the instructions on OpenWrt's homepage to enable IPv6 support<br />or update "
++"your system to the latest OpenWrt Release"
++msgstr ""
++
++msgid "IPv6 not supported"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "If both cURL and GNU Wget are installed, Wget is used by default."
++msgstr ""
++
++msgid ""
++"If this service section is disabled it could not be started.<br />Neither "
++"from LuCI interface nor from console"
++msgstr ""
++
++msgid ""
++"If you want to send updates for IPv4 and IPv6 you need to define two "
++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'"
++msgstr ""
++
++msgid ""
++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support."
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Interface"
++msgstr "ç•Œé¢"
++
++msgid ""
++"Interval to check for changed IP<br />Values below 5 minutes == 300 seconds "
++"are not supported"
++msgstr ""
++
++msgid ""
++"Interval to force updates send to DDNS Provider<br />Setting this parameter "
++"to 0 will force the script to only run once<br />Values lower 'Check "
++"Interval' except '0' are not supported"
++msgstr ""
++
++msgid "It is NOT recommended for casual users to change settings on this page."
++msgstr ""
++
++msgid "Last Update"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log directory"
++msgstr ""
++
++msgid "Log length"
++msgstr ""
++
++msgid "Log to file"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to select a network to use for "
++"communication."
++msgstr ""
++
++msgid ""
++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS "
++"protocol."
++msgstr ""
++
++msgid "Network"
++msgstr "網路"
++
++msgid "Network on which the ddns-updater scripts will be started"
++msgstr ""
++
++msgid "Never"
++msgstr ""
++
++msgid "Next Update"
++msgstr ""
++
++msgid "No data"
++msgstr ""
++
++msgid "No logging"
++msgstr ""
++
++msgid "Non-public and by default blocked IP's"
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Number of last lines stored in log files"
++msgstr ""
++
++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication."
++msgstr ""
++
++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests."
++msgstr ""
++
++msgid "OPTIONAL: Network to use for communication"
++msgstr ""
++
++msgid "OPTIONAL: Proxy-Server for detection and updates."
++msgstr ""
++
++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'."
++msgstr ""
++
++msgid "On Error the script will retry the failed action after given time"
++msgstr ""
++
++msgid "On Error the script will stop execution after given number of retrys"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PROXY-Server"
++msgstr ""
++
++msgid "PROXY-Server not supported"
++msgstr ""
++
++msgid "Password"
++msgstr "密碼"
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Please [Save & Apply] your changes first"
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Process ID"
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Registered IP"
++msgstr ""
++
++msgid "Replaces [DOMAIN] in Update-URL"
++msgstr ""
++
++msgid "Replaces [PASSWORD] in Update-URL"
++msgstr ""
++
++msgid "Replaces [USERNAME] in Update-URL"
++msgstr ""
++
++msgid "Run once"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Show more"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Status directory"
++msgstr ""
++
++msgid "Stopped"
++msgstr ""
++
++msgid ""
++"The currently installed 'ddns-scripts' package did not support all available "
++"settings."
++msgstr ""
++
++msgid "The default setting of '0' will retry infinite."
++msgstr ""
++
++msgid "There is no service configured."
++msgstr ""
++
++msgid "Timer Settings"
++msgstr ""
++
++msgid "To change global settings click here"
++msgstr ""
++
++msgid "To use cURL activate this option."
++msgstr ""
++
++msgid "URL"
++msgstr "URL"
++
++msgid "URL to detect"
++msgstr ""
++
++msgid "Unknown error"
++msgstr ""
++
++msgid ""
++"Update URL to be used for updating your DDNS Provider.<br />Follow "
++"instructions you will find on their WEB page."
++msgstr ""
++
++msgid "Update error"
++msgstr ""
++
++msgid "Use HTTP Secure"
++msgstr ""
++
++msgid "Use cURL"
++msgstr ""
++
++msgid "User defined script to read systems IP-Address"
++msgstr ""
++
++msgid "Username"
++msgstr "使用者å稱"
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Waiting for changes to be applied..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"Writes detailed messages to log file. File will be truncated automatically."
++msgstr ""
++
++msgid ""
++"Writes log messages to syslog. Critical Errors will always be written to "
++"syslog."
++msgstr ""
++
++msgid "You should install BIND host package for DNS requests."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL (prefered) or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or cURL package."
++msgstr ""
++
++msgid "You should install GNU Wget with SSL or replace libcurl."
++msgstr ""
++
++msgid "cURL is installed, but libcurl was compiled without proxy support."
++msgstr ""
++
++msgid "cURL without Proxy Support"
++msgstr ""
++
++msgid "can not detect local IP. Please select a different Source combination"
++msgstr ""
++
++msgid "can not resolve host:"
++msgstr ""
++
++msgid "config error"
++msgstr ""
++
++msgid "days"
++msgstr ""
++
++msgid "directory or path/file"
++msgstr ""
++
++msgid "either url or script could be set"
++msgstr ""
++
++msgid "enable here"
++msgstr ""
++
++msgid "file or directory not found or not 'IGNORE'"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hours"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "invalid - Sample"
++msgstr ""
++
++msgid "minimum value '0'"
++msgstr ""
++
++msgid "minimum value '1'"
++msgstr ""
++
++msgid "minimum value 5 minutes == 300 seconds"
++msgstr ""
++
++msgid "minutes"
++msgstr ""
++
++msgid "missing / required"
++msgstr ""
++
++msgid "must be greater or equal 'Check Interval'"
++msgstr ""
++
++msgid "must start with 'http://'"
++msgstr ""
++
++msgid "nc (netcat) can not connect"
++msgstr ""
++
++msgid "never"
++msgstr ""
++
++msgid "no data"
++msgstr ""
++
++msgid "not found or not executable - Sample: '/path/to/script.sh'"
++msgstr ""
++
++msgid "nslookup can not resolve host"
++msgstr ""
++
++msgid "or"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "please disable"
++msgstr ""
++
++msgid "please remove entry"
++msgstr ""
++
++msgid "please select 'IPv4' address version"
++msgstr ""
++
++msgid "please select 'IPv4' address version in"
++msgstr ""
++
++msgid "please set to 'default'"
++msgstr ""
++
++msgid "proxy port missing"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
++
++msgid "to run HTTPS without verification of server certificates (insecure)"
++msgstr ""
++
++msgid "unknown error"
++msgstr ""
++
++msgid "unspecific error"
++msgstr ""
++
++msgid "use hostname, FQDN, IPv4- or IPv6-Address"
++msgstr ""
++
++#~ msgid "Check for changed IP every"
++#~ msgstr "檢查IP變動的時間間隔"
++
++#~ msgid "Check-time unit"
++#~ msgstr "時間單ä½"
++
++#~ msgid "Enable"
++#~ msgstr "啟用"
++
++#~ msgid "Force update every"
++#~ msgstr "強制更新間隔"
++
++#~ msgid "Force-time unit"
++#~ msgstr "強制更新的時間單ä½"
++
++#~ msgid "Hostname"
++#~ msgstr "主機å稱"
++
++#~ msgid "Service"
++#~ msgstr "æœå‹™æ供者"
++
++#~ msgid "Source of IP address"
++#~ msgstr "IPä½ç½®ä¾†æº"
++
++#~ msgid "custom"
++#~ msgstr "自訂"
++
++#~ msgid "h"
++#~ msgstr "å°æ™‚"
++
++#~ msgid "interface"
++#~ msgstr "ç•Œé¢"
++
++#~ msgid "min"
++#~ msgstr "分é˜"
++
++#~ msgid "network"
++#~ msgstr "網路"
++
++#~ msgid "Event interface"
++#~ msgstr "事件界é¢"
++
++#~ msgid "On which interface up should start the ddns script process."
++#~ msgstr "介é¢æ‡‰è©²å•Ÿç”¨å‹•æ…‹DNS指令程åº"
+diff --git a/feeds/luci/applications/luci-app-ddns/root/etc/uci-defaults/luci-ddns b/feeds/luci/applications/luci-app-ddns/root/etc/uci-defaults/luci-ddns
+new file mode 100755
+index 0000000..9fd875e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ddns/root/etc/uci-defaults/luci-ddns
+@@ -0,0 +1,10 @@
++#!/bin/sh
++
++# no longer needed for "Save and Apply" to restart ddns
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@ddns[-1]
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-diag-core/Makefile b/feeds/luci/applications/luci-app-diag-core/Makefile
+new file mode 100644
+index 0000000..ac9f499
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Diagnostics Tools (Core)
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-diag-core/luasrc/controller/luci_diag.lua b/feeds/luci/applications/luci-app-diag-core/luasrc/controller/luci_diag.lua
+new file mode 100644
+index 0000000..b662d7f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/luasrc/controller/luci_diag.lua
+@@ -0,0 +1,16 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.luci_diag", package.seeall)
++
++function index()
++ local e
++
++ e = entry({"admin", "network", "diag_config"}, template("diag/network_config_index") , _("Configure Diagnostics"), 120)
++ e.index = true
++ e.dependent = true
++
++ e = entry({"mini", "diag"}, template("diag/index"), _("Diagnostics"), 120)
++ e.index = true
++ e.dependent = true
++end
+diff --git a/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/index.htm b/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/index.htm
+new file mode 100644
+index 0000000..c667767
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/index.htm
+@@ -0,0 +1,10 @@
++<%#
++ Copyright 2009 Daniel Dickinson
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content"><%:Diagnostics%></h2>
++<p><%:The entries in the menu allow you to perform diagnostic tests on your system to aid in troubleshooting.%></p>
++<p><%:The diagnostics available under this menu depend on what modules you have installed on your device.%></p>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/network_config_index.htm b/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/network_config_index.htm
+new file mode 100644
+index 0000000..3d01453
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/network_config_index.htm
+@@ -0,0 +1,10 @@
++<%#
++ Copyright 2009 Daniel Dickinson
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content"><%:Diagnostics%></h2>
++<p><%:With this menu you can configure network diagnostics, such as network device scans and ping tests.%></p>
++<p><%:The diagnostics available under this menu depend on what modules you have installed on your device.%></p>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/ca/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/ca/diag_core.po
+new file mode 100644
+index 0000000..ffe0ded
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/ca/diag_core.po
+@@ -0,0 +1,33 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-01 23:52+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "Configuració de diagnòstics"
++
++msgid "Diagnostics"
++msgstr "Diagnòstics"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/cs/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/cs/diag_core.po
+new file mode 100644
+index 0000000..dcfea77
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/cs/diag_core.po
+@@ -0,0 +1,39 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-20 23:19+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "Nastavení diagnostiky"
++
++msgid "Diagnostics"
++msgstr "Diagnostika"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"PoÄet diagnostických testů, které jsou k dispozici v tomto menu je závislý "
++"na modulech nainstalovaných ve vašem zařízení."
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"Položky v menu vám umožní provádět systémové diagnostické testy, které vám "
++"pomohou vyřešit problémy."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"V tomto menu můžete nastavit síťovou diagnostiku, jako je skenování síťových "
++"zařízení a ping testů."
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/de/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/de/diag_core.po
+new file mode 100644
+index 0000000..feda0fc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/de/diag_core.po
+@@ -0,0 +1,42 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-07-02 08:24+0200\n"
++"Last-Translator: dgolle <dgolle@allnet.de>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "Diagnose-Tests konfigurieren"
++
++msgid "Diagnostics"
++msgstr "Diagnose"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"Die verfügbaren Diagnose-Programme in diesem Menü hängen von den auf Ihrem "
++"Gerät installierten Modulen ab."
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"Falls es mit ihrem Gerät Probleme gibt können hier Diagnose-Tests "
++"durchgeführt werden."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"Hier werden die Netzwerk Diagnose Tools konfiguriert (zB. Netzwerkscans und "
++"Pings)."
++
++#~ msgid "l_d_diag"
++#~ msgstr "Diagnose"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/el/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/el/diag_core.po
+new file mode 100644
+index 0000000..8e57c52
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/el/diag_core.po
+@@ -0,0 +1,38 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-18 14:53+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: none\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Configure Diagnostics"
++msgstr "ΡÏθμιση Διαγνωστικών"
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"Η καταχωÏήσεις στο μενοÏ, σας επιτÏέπουν να Ï€Ïοβαίνετε σε διαγνωστικές "
++"δοκιμές στο σÏστημά σας, για την διευκόλυνση αντιμετώπισης Ï€Ïοβλημάτων."
++
++#, fuzzy
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"Με αυτό το μενοÏ, μποÏείτε να παÏαμετÏοποιήσετε διαγνωστικά δικτÏου, όπως "
++"σαÏώσεις συσκευών δικτÏου και δοκιμές ping."
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/en/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/en/diag_core.po
+new file mode 100644
+index 0000000..aa030ef
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/en/diag_core.po
+@@ -0,0 +1,42 @@
++# Diagnostics Core.
++# Copyright (C) 2009 Daniel Dickinson.
++# Daniel Dickinson <crazycshore@gmail.com>, 2009.
++#
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: diag-core 0.1\n"
++"PO-Revision-Date: 2009-07-17 04:54-0400\n"
++"Last-Translator: Daniel Dickinson <crazycshore@gmail.com>\n"
++"Language-Team: en <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Configure Diagnostics"
++msgstr "Configure Diagnostics"
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++
++#~ msgid "l_d_diag"
++#~ msgstr "Diagnostics"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/es/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/es/diag_core.po
+new file mode 100644
+index 0000000..8b9b3b5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/es/diag_core.po
+@@ -0,0 +1,42 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-07-28 23:25+0200\n"
++"Last-Translator: Daniel <danips@gmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "Configurar diagnósticos"
++
++msgid "Diagnostics"
++msgstr "Diagnósticos"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"Los diagnósticos disponibles bajo este menú dependen de qué módulos haya "
++"instalado en su dispositivo."
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"Este menú le permite realizar test de prueba de su sistema para ayudar en la "
++"resolución de problemas."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"En este menú puede configurar diagnósticos de red como el escaneo de equipos "
++"en red o pings."
++
++#~ msgid "l_d_diag"
++#~ msgstr "Diagnośticos"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/fr/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/fr/diag_core.po
+new file mode 100644
+index 0000000..a5b4e6a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/fr/diag_core.po
+@@ -0,0 +1,42 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-11-06 13:21+0200\n"
++"Last-Translator: hogsim <hogsim@gmail.com>\n"
++"Language-Team: none\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "Configuration des diagnostics"
++
++msgid "Diagnostics"
++msgstr "Diagnostiques"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"Les diagnostics disponible ci-dessous dépendent des modules que vous avez "
++"installé sur votre appareil. "
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"Les items de ce menu vous permettent d'accomplir des diagnostics sur votre "
++"système pour vous aider à le dépanner."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"Ce menu vous permet de configurer des diagnostics réseau, comme des "
++"recherches de périphérique réseau et des tests par ping."
++
++#~ msgid "l_d_diag"
++#~ msgstr "l_d_diag"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/he/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/he/diag_core.po
+new file mode 100644
+index 0000000..b4d73e0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/he/diag_core.po
+@@ -0,0 +1,30 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Configure Diagnostics"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/hu/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/hu/diag_core.po
+new file mode 100644
+index 0000000..f9f6e66
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/hu/diag_core.po
+@@ -0,0 +1,42 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-07-05 16:44+0200\n"
++"Last-Translator: Gyula <pro564@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "Diagnosztikai beállítások"
++
++msgid "Diagnostics"
++msgstr "Diagnosztika"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"Az itt található statisztikák attól függően változnak, hogy milyen modulokat "
++"telepítettél az eszközödre."
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"Ennek a menünek az elemei lehetővé teszik hálózati diagnosztikai tesztek "
++"elvégzését a rendszeren a hibaelhárítás megkönnyítésére."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"Ebben a menüben beállíthatók a hálózati diagnosztika elemei, mint például "
++"eszközök keresése és ping teszt."
++
++#~ msgid "l_d_diag"
++#~ msgstr "l_d_diag"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/it/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/it/diag_core.po
+new file mode 100644
+index 0000000..39d4ced
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/it/diag_core.po
+@@ -0,0 +1,42 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-02-03 13:54+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "Configura Diagnostici"
++
++msgid "Diagnostics"
++msgstr "Diagnostiche"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"Le funzioni di diagnostica disponibili in questo menu dipendono dai moduli "
++"che avete installato sul vostro dispositivo."
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"Gli stumenti nel menù possono servirti per diagnosi e test per aiutarti "
++"nello scoprire le problematiche."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"Con questo menu puoi configurare la diagnostica di rete, come la scansione "
++"di un dispositivo di rete o dei ping di test."
++
++#~ msgid "l_d_diag"
++#~ msgstr "l_d_diag"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/ja/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/ja/diag_core.po
+new file mode 100644
+index 0000000..f67657f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/ja/diag_core.po
+@@ -0,0 +1,33 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-18 14:36+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: none\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: Pootle 2.0.4\n"
++
++msgid "Configure Diagnostics"
++msgstr "診断機能設定"
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/ms/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/ms/diag_core.po
+new file mode 100644
+index 0000000..90fefc5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/ms/diag_core.po
+@@ -0,0 +1,29 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Configure Diagnostics"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/no/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/no/diag_core.po
+new file mode 100644
+index 0000000..4955d47
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/no/diag_core.po
+@@ -0,0 +1,35 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Configure Diagnostics"
++msgstr "Konfigurer Diagnostikk"
++
++msgid "Diagnostics"
++msgstr "Diagnostikk"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"Diagnostikken tilgjengelig under denne menyen avhenger av hvilke moduler du "
++"har installert på enheten."
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"Oppføringene i menyen lar deg utføre diagnostiske tester på systemet ditt "
++"til hjelp ved feilsøking."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"Her kan du konfigurere nettverks diagnostikk, som skanning etter nettverks "
++"enheter og ping tester."
++
++#~ msgid "l_d_diag"
++#~ msgstr "Nettverks Diagnostikk"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/pl/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/pl/diag_core.po
+new file mode 100644
+index 0000000..0935fdb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/pl/diag_core.po
+@@ -0,0 +1,43 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-08 13:17+0200\n"
++"Last-Translator: Staszek <fistaszek@tlen.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "Konfiguracja diagnostyki"
++
++msgid "Diagnostics"
++msgstr "Diagnostyka"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"Liczba testów diagnostycznych dostępnych w tym menu jest uzależniona od "
++"modułów zainstalowanych w tym urządzeniu."
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"Wpisy w menu pozwalają na wykonanie testów diagnostycznych systemu pomocnych "
++"w rozwiązywaniu problemów."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"W tym menu można skonfigurować diagnostykę sieci, jak np. skanowanie "
++"urządzeń sieciowych lub testy ping."
++
++#~ msgid "l_d_diag"
++#~ msgstr "l_d_diag"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/pt-br/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/pt-br/diag_core.po
+new file mode 100644
+index 0000000..e27315b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/pt-br/diag_core.po
+@@ -0,0 +1,42 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-08 03:14+0200\n"
++"Last-Translator: luizluca <luizluca@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Configure Diagnostics"
++msgstr "Configura os Diagnósticos"
++
++msgid "Diagnostics"
++msgstr "Diagnósticos"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"Os diagnósticos disponíveis neste menu dependem de quais módulos você tem "
++"instalado no seu dispositivo."
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"As entradas no menu permitem que você realize diagnósticos em seu sistema "
++"para ajudar na resolução de problemas."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"Com este menu, você pode configurar o diagnóstico de rede como varredura de "
++"dispositivos e testes de ping."
++
++#~ msgid "l_d_diag"
++#~ msgstr "l_d_diag"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/pt/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/pt/diag_core.po
+new file mode 100644
+index 0000000..6083f28
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/pt/diag_core.po
+@@ -0,0 +1,39 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-05-30 22:57+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "Configurar Diagnósticos"
++
++msgid "Diagnostics"
++msgstr "Diagnósticos "
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"Os diagnósticos disponíveis neste menu dependem dos módulos que tem "
++"instalados no seu dispositivo. "
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"As entradas neste menu permitem levar a cabo testes de diagnóstico no seu "
++"sistema para o ajudar na resolução de problemas."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"Com este menu pode configurar o diagnóstico de rede, tal como explorar "
++"dispositivos de rede e testes ping."
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/ro/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/ro/diag_core.po
+new file mode 100644
+index 0000000..604841e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/ro/diag_core.po
+@@ -0,0 +1,45 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-09 14:24+0200\n"
++"Last-Translator: lex404 <alex.qwq@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "Configurează diagnozele"
++
++# diagnostic/ diagnostice; suna oricum prea medical. Tehnic se foloseste diagnoza, din cate stiu.
++msgid "Diagnostics"
++msgstr "Diagnoze"
++
++# .
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"Diagnozele disponibile sub acest meniu depind de ce module aveți instalate "
++"pe device-ul dumneavoastră."
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"Intrările din acest meniu permit utilizarea testelor de diagnoză în sistem "
++"pentru a vă ajuta la rezolvarea problemelor."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"Cu acest meniu poți configura diagnoza în rețea, cum ar fi scanarea unor "
++"dispozitive din rețea sau teste ping."
++
++#~ msgid "l_d_diag"
++#~ msgstr "l_d_diag"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/ru/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/ru/diag_core.po
+new file mode 100644
+index 0000000..1abaa8c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/ru/diag_core.po
+@@ -0,0 +1,45 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: diag_core\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2012-08-15 11:44+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Configure Diagnostics"
++msgstr "ÐаÑтройки диагноÑтики"
++
++msgid "Diagnostics"
++msgstr "ДиагноÑтика"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"ДоÑтупные в данном меню виды диагноÑтики завиÑÑÑ‚ от уÑтановленных на вашем "
++"уÑтройÑтве модулей. "
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"ЗапиÑи в меню позволÑÑ‚ÑŒ вам выполнить диагноÑтику ÑиÑтемы, чтобы помочь в "
++"обнаружении проблем."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñто меню, вы можете наÑтроить диагноÑтику Ñети, например, "
++"Ñканирование Ñетевых уÑтройÑтв или ping-теÑÑ‚."
++
++#~ msgid "l_d_diag"
++#~ msgstr "l_d_diag"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/sk/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/sk/diag_core.po
+new file mode 100644
+index 0000000..389516f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/sk/diag_core.po
+@@ -0,0 +1,30 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Configure Diagnostics"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/sv/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/sv/diag_core.po
+new file mode 100644
+index 0000000..dd0a81a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/sv/diag_core.po
+@@ -0,0 +1,31 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Configure Diagnostics"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/templates/diag_core.pot b/feeds/luci/applications/luci-app-diag-core/po/templates/diag_core.pot
+new file mode 100644
+index 0000000..1b34f83
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/templates/diag_core.pot
+@@ -0,0 +1,23 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Configure Diagnostics"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/tr/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/tr/diag_core.po
+new file mode 100644
+index 0000000..d0b6211
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/tr/diag_core.po
+@@ -0,0 +1,30 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Configure Diagnostics"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/uk/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/uk/diag_core.po
+new file mode 100644
+index 0000000..eae9886
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/uk/diag_core.po
+@@ -0,0 +1,40 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-05-26 17:55+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Configure Diagnostics"
++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ñ–Ð°Ð³Ð½Ð¾Ñтики"
++
++msgid "Diagnostics"
++msgstr "ДіагноÑтика"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++"ДоÑтупні в цьому меню види діагноÑтики залежать від того, Ñкі модулі "
++"інÑтальовані на вашому приÑтроі."
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++"Пункти меню дозволÑÑŽÑ‚ÑŒ виконувати діагноÑтичні теÑти на вашій ÑиÑтемі, щоб "
++"допомогти при уÑуненні неполадок."
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
++"ВикориÑтовуючи це меню, ви можете Ñконфігурувати діагноÑтику мережі, "
++"наприклад, ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶ÐµÐ²Ð¸Ñ… приÑтроїв та пінг-теÑти."
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/vi/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/vi/diag_core.po
+new file mode 100644
+index 0000000..d0b6211
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/vi/diag_core.po
+@@ -0,0 +1,30 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Configure Diagnostics"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr ""
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr ""
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/zh-cn/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/zh-cn/diag_core.po
+new file mode 100644
+index 0000000..e857d3d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/zh-cn/diag_core.po
+@@ -0,0 +1,36 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-05 14:39+0200\n"
++"Last-Translator: nKsyn <e.nksyn@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "é…置诊断"
++
++msgid "Diagnostics"
++msgstr "诊断"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr "å¯ç”¨çš„诊断ä¾èµ–于设备上已ç»å®‰è£…的诊断模å—"
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr "下é¢çš„æ¡ç›®å¯ä»¥è¯Šæ–­æµ‹è¯•ç³»ç»Ÿï¼Œä¸ºæŽ’除故障æ供信æ¯"
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr "在这里å¯ä»¥é…置网络诊断,例如:扫æ网络设备,进行ping测试等。"
++
++#~ msgid "l_d_diag"
++#~ msgstr "l_d诊断"
+diff --git a/feeds/luci/applications/luci-app-diag-core/po/zh-tw/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/zh-tw/diag_core.po
+new file mode 100644
+index 0000000..3cb3169
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-core/po/zh-tw/diag_core.po
+@@ -0,0 +1,33 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 12:47+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Configure Diagnostics"
++msgstr "診斷設定"
++
++msgid "Diagnostics"
++msgstr "診斷"
++
++msgid ""
++"The diagnostics available under this menu depend on what modules you have "
++"installed on your device."
++msgstr "這é¸å–®ä¸‹çš„診斷機制å¯é‹ç”¨æ€§, 端看你設備上已安è£çš„模組而定"
++
++msgid ""
++"The entries in the menu allow you to perform diagnostic tests on your system "
++"to aid in troubleshooting."
++msgstr "é¸å–®å…§çš„é …ç›®å…許你在系統內執行診斷測試以便解決疑難雜症"
++
++msgid ""
++"With this menu you can configure network diagnostics, such as network device "
++"scans and ping tests."
++msgstr "採用這é¸é …å¯ä»¥è®“你設定網路診斷, 例如網路設備掃æè·Ÿping的測試."
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/Makefile b/feeds/luci/applications/luci-app-diag-devinfo/Makefile
+new file mode 100644
+index 0000000..0424fff
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Diagnostics Tools (Device Info)
++LUCI_DEPENDS:=+luci-app-diag-core +smap +netdiscover +mac-to-devinfo +httping +smap-to-devinfo +netdiscover-to-devinfo @BROKEN
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/devinfo_common.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/devinfo_common.lua
+new file mode 100644
+index 0000000..93f735c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/devinfo_common.lua
+@@ -0,0 +1,185 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.luci_diag.devinfo_common", package.seeall)
++
++require("luci.i18n")
++require("luci.util")
++require("luci.sys")
++require("luci.cbi")
++require("luci.model.uci")
++
++local translate = luci.i18n.translate
++local DummyValue = luci.cbi.DummyValue
++local SimpleSection = luci.cbi.SimpleSection
++
++function index()
++ return -- no-op
++end
++
++function run_processes(outnets, cmdfunc)
++ i = next(outnets, nil)
++ while (i) do
++ outnets[i]["output"] = luci.sys.exec(cmdfunc(outnets, i))
++ i = next(outnets, i)
++ end
++end
++
++function parse_output(devmap, outnets, haslink, type, mini, debug)
++ local curnet = next(outnets, nil)
++
++ while (curnet) do
++ local output = outnets[curnet]["output"]
++ local subnet = outnets[curnet]["subnet"]
++ local ports = outnets[curnet]["ports"]
++ local interface = outnets[curnet]["interface"]
++ local netdevs = {}
++ devlines = luci.util.split(output)
++ if not devlines then
++ devlines = {}
++ table.insert(devlines, output)
++ end
++
++ local j = nil
++ j = next(devlines, j)
++
++ local found_a_device = false
++
++ while (j) do
++ if devlines[j] and ( devlines[j] ~= "" ) then
++ found_a_device = true
++ local devtable
++ local row = {}
++ devtable = luci.util.split(devlines[j], ' | ')
++ row["ip"] = devtable[1]
++ if (not mini) then
++ row["mac"] = devtable[2]
++ end
++ if ( devtable[4] == 'unknown' ) then
++ row["vendor"] = devtable[3]
++ else
++ row["vendor"] = devtable[4]
++ end
++ row["type"] = devtable[5]
++ if (not mini) then
++ row["model"] = devtable[6]
++ end
++ if (haslink) then
++ row["config_page"] = devtable[7]
++ end
++
++ if (debug) then
++ row["raw"] = devlines[j]
++ end
++ table.insert(netdevs, row)
++ end
++ j = next(devlines, j)
++ end
++ if not found_a_device then
++ local row = {}
++ row["ip"] = curnet
++ if (not mini) then
++ row["mac"] = ""
++ end
++ if (type == "smap") then
++ row["vendor"] = luci.i18n.translate("No SIP devices")
++ else
++ row["vendor"] = luci.i18n.translate("No devices detected")
++ end
++ row["type"] = luci.i18n.translate("check other networks")
++ if (not mini) then
++ row["model"] = ""
++ end
++ if (haslink) then
++ row["config_page"] = ""
++ end
++ if (debug) then
++ row["raw"] = output
++ end
++ table.insert(netdevs, row)
++ end
++ local s
++ if (type == "smap") then
++ if (mini) then
++ s = devmap:section(luci.cbi.Table, netdevs, luci.i18n.translate("SIP devices discovered for") .. " " .. curnet)
++ else
++ local interfacestring = ""
++ if ( interface ~= "" ) then
++ interfacestring = ", " .. interface
++ end
++ s = devmap:section(luci.cbi.Table, netdevs, luci.i18n.translate("SIP devices discovered for") .. " " .. curnet .. " (" .. subnet .. ":" .. ports .. interfacestring .. ")")
++ end
++ s.template = "diag/smapsection"
++ else
++ if (mini) then
++ s = devmap:section(luci.cbi.Table, netdevs, luci.i18n.translate("Devices discovered for") .. " " .. curnet)
++ else
++ local interfacestring = ""
++ if ( interface ~= "" ) then
++ interfacestring = ", " .. interface
++ end
++ s = devmap:section(luci.cbi.Table, netdevs, luci.i18n.translate("Devices discovered for") .. " " .. curnet .. " (" .. subnet .. interfacestring .. ")")
++ end
++ end
++ s:option(DummyValue, "ip", translate("IP Address"))
++ if (not mini) then
++ s:option(DummyValue, "mac", translate("MAC Address"))
++ end
++ s:option(DummyValue, "vendor", translate("Vendor"))
++ s:option(DummyValue, "type", translate("Device Type"))
++ if (not mini) then
++ s:option(DummyValue, "model", translate("Model"))
++ end
++ if (haslink) then
++ s:option(DummyValue, "config_page", translate("Link to Device"))
++ end
++ if (debug) then
++ s:option(DummyValue, "raw", translate("Raw"))
++ end
++ curnet = next(outnets, curnet)
++ end
++end
++
++function get_network_device(interface)
++ local state = luci.model.uci.cursor_state()
++ state:load("network")
++ local dev
++
++ return state:get("network", interface, "ifname")
++end
++
++
++function cbi_add_networks(field)
++ uci.cursor():foreach("network", "interface",
++ function (section)
++ if section[".name"] ~= "loopback" then
++ field:value(section[".name"])
++ end
++ end
++ )
++ field.titleref = luci.dispatcher.build_url("admin", "network", "network")
++end
++
++function config_devinfo_scan(map, scannet)
++ local o
++ o = scannet:option(luci.cbi.Flag, "enable", translate("Enable"))
++ o.optional = false
++ o.rmempty = false
++
++ o = scannet:option(luci.cbi.Value, "interface", translate("Interface"))
++ o.optional = false
++ luci.controller.luci_diag.devinfo_common.cbi_add_networks(o)
++
++ local scansubnet
++ scansubnet = scannet:option(luci.cbi.Value, "subnet", translate("Subnet"))
++ scansubnet.optional = false
++
++ o = scannet:option(luci.cbi.Value, "timeout", translate("Timeout"), translate("Time to wait for responses in seconds (default 10)"))
++ o.optional = true
++
++ o = scannet:option(luci.cbi.Value, "repeat_count", translate("Repeat Count"), translate("Number of times to send requests (default 1)"))
++ o.optional = true
++
++ o = scannet:option(luci.cbi.Value, "sleepreq", translate("Sleep Between Requests"), translate("Milliseconds to sleep between requests (default 100)"))
++ o.optional = true
++end
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/luci_diag_devinfo.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/luci_diag_devinfo.lua
+new file mode 100644
+index 0000000..ebba03f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/luci_diag_devinfo.lua
+@@ -0,0 +1,46 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.luci_diag.luci_diag_devinfo", package.seeall)
++
++function index()
++ local e
++
++ e = entry({"admin", "voice", "diag", "phones"}, arcombine(cbi("luci_diag/smap_devinfo"), cbi("luci_diag/smap_devinfo_config")), _("Phones"), 10)
++ e.leaf = true
++ e.subindex = true
++ e.dependent = true
++
++ e = entry({"admin", "voice", "diag", "phones", "config"}, cbi("luci_diag/smap_devinfo_config"), _("Configure"), 10)
++
++ e = entry({"admin", "status", "smap_devinfo"}, cbi("luci_diag/smap_devinfo"), _("SIP Devices on Network"), 120)
++ e.leaf = true
++ e.dependent = true
++
++ e = entry({"admin", "network", "diag_config", "netdiscover_devinfo_config"}, cbi("luci_diag/netdiscover_devinfo_config"), _("Network Device Scan"), 100)
++ e.leaf = true
++ e.dependent = true
++
++ e = entry({"admin", "network", "diag_config", "smap_devinfo_config"}, cbi("luci_diag/smap_devinfo_config"), _("SIP Device Scan"))
++ e.leaf = true
++ e.dependent = true
++
++ e = entry({"admin", "status", "netdiscover_devinfo"}, cbi("luci_diag/netdiscover_devinfo"), _("Devices on Network"), 90)
++ e.dependent = true
++
++ e = entry({"admin", "network", "mactodevinfo"}, cbi("luci_diag/mactodevinfo"), _("MAC Device Info Overrides"), 190)
++ e.dependent = true
++
++ e = entry({"mini", "diag", "phone_scan"}, cbi("luci_diag/smap_devinfo_mini"), _("Phone Scan"), 100)
++ e.dependent = true
++
++ e = entry({"mini", "voice", "phones", "phone_scan_config"}, cbi("luci_diag/smap_devinfo_config_mini"), _("Config Phone Scan"), 90)
++ e.dependent = true
++
++ e = entry({"mini", "diag", "netdiscover_devinfo"}, cbi("luci_diag/netdiscover_devinfo_mini"), _("Network Device Scan"), 10)
++ e.dependent = true
++
++ e = entry({"mini", "network", "netdiscover_devinfo_config"}, cbi("luci_diag/netdiscover_devinfo_config_mini"), _("Device Scan Config"))
++ e.dependent = true
++
++end
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/netdiscover_common.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/netdiscover_common.lua
+new file mode 100644
+index 0000000..2e879a6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/netdiscover_common.lua
+@@ -0,0 +1,91 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.luci_diag.netdiscover_common", package.seeall)
++
++require("luci.i18n")
++require("luci.util")
++require("luci.sys")
++require("luci.cbi")
++require("luci.model.uci")
++
++local translate = luci.i18n.translate
++local DummyValue = luci.cbi.DummyValue
++local SimpleSection = luci.cbi.SimpleSection
++
++function index()
++ return -- no-op
++end
++
++function get_params()
++
++ local netdiscover_uci = luci.model.uci.cursor()
++ netdiscover_uci:load("luci_devinfo")
++ local nettable = netdiscover_uci:get_all("luci_devinfo")
++
++ local i
++ local subnet
++ local netdout
++
++ local outnets = {}
++
++ i = next(nettable, nil)
++
++ while (i) do
++ if (netdiscover_uci:get("luci_devinfo", i) == "netdiscover_scannet") then
++ local scannet = netdiscover_uci:get_all("luci_devinfo", i)
++ if scannet["subnet"] and (scannet["subnet"] ~= "") and scannet["enable"] and ( scannet["enable"] == "1") then
++ local output = ""
++ local outrow = {}
++ outrow["interface"] = scannet["interface"]
++ outrow["timeout"] = 10
++ local timeout = tonumber(scannet["timeout"])
++ if timeout and ( timeout > 0 ) then
++ outrow["timeout"] = scannet["timeout"]
++ end
++
++ outrow["repeat_count"] = 1
++ local repcount = tonumber(scannet["repeat_count"])
++ if repcount and ( repcount > 0 ) then
++ outrow["repeat_count"] = scannet["repeat_count"]
++ end
++
++ outrow["sleepreq"] = 100
++ local repcount = tonumber(scannet["sleepreq"])
++ if repcount and ( repcount > 0 ) then
++ outrow["sleepreq"] = scannet["sleepreq"]
++ end
++
++ outrow["subnet"] = scannet["subnet"]
++ outrow["output"] = output
++ outnets[i] = outrow
++ end
++ end
++ i = next(nettable, i)
++ end
++ return outnets
++end
++
++function command_function(outnets, i)
++ local interface = luci.controller.luci_diag.devinfo_common.get_network_device(outnets[i]["interface"])
++
++ return "/usr/bin/netdiscover-to-devinfo " .. outnets[i]["subnet"] .. " " .. interface .. " " .. outnets[i]["timeout"] .. " -r " .. outnets[i]["repeat_count"] .. " -s " .. outnets[i]["sleepreq"] .. " </dev/null"
++end
++
++function action_links(netdiscovermap, mini)
++ s = netdiscovermap:section(SimpleSection, "", translate("Actions"))
++ b = s:option(DummyValue, "_config", translate("Configure Scans"))
++ b.value = ""
++ if (mini) then
++ b.titleref = luci.dispatcher.build_url("mini", "network", "netdiscover_devinfo_config")
++ else
++ b.titleref = luci.dispatcher.build_url("admin", "network", "diag_config", "netdiscover_devinfo_config")
++ end
++ b = s:option(DummyValue, "_scans", translate("Repeat Scans (this can take a few minutes)"))
++ b.value = ""
++ if (mini) then
++ b.titleref = luci.dispatcher.build_url("mini", "diag", "netdiscover_devinfo")
++ else
++ b.titleref = luci.dispatcher.build_url("admin", "status", "netdiscover_devinfo")
++ end
++end
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/smap_common.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/smap_common.lua
+new file mode 100644
+index 0000000..82a1e05
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/smap_common.lua
+@@ -0,0 +1,102 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.luci_diag.smap_common", package.seeall)
++
++require("luci.i18n")
++require("luci.util")
++require("luci.sys")
++require("luci.cbi")
++require("luci.model.uci")
++
++local translate = luci.i18n.translate
++local DummyValue = luci.cbi.DummyValue
++local SimpleSection = luci.cbi.SimpleSection
++
++function index()
++ return -- no-op
++end
++
++function get_params()
++
++ local smapnets_uci = luci.model.uci.cursor()
++ smapnets_uci:load("luci_devinfo")
++ local nettable = smapnets_uci:get_all("luci_devinfo")
++
++ local i
++ local subnet
++ local smapout
++
++ local outnets = {}
++
++ i = next(nettable, nil)
++
++ while (i) do
++ if (smapnets_uci:get("luci_devinfo", i) == "smap_scannet") then
++ local scannet = smapnets_uci:get_all("luci_devinfo", i)
++ if scannet["subnet"] and (scannet["subnet"] ~= "") and scannet["enable"] and ( scannet["enable"] == "1") then
++ local output = ""
++ local outrow = {}
++ outrow["subnet"] = scannet["subnet"]
++ ports = "5060"
++ if scannet["ports"] and ( scannet["ports"] ~= "" ) then
++ ports = scannet["ports"]
++ end
++ outrow["timeout"] = 10
++ local timeout = tonumber(scannet["timeout"])
++ if timeout and ( timeout > 0 ) then
++ outrow["timeout"] = scannet["timeout"]
++ end
++
++ outrow["repeat_count"] = 1
++ local repcount = tonumber(scannet["repeat_count"])
++ if repcount and ( repcount > 0 ) then
++ outrow["repeat_count"] = scannet["repeat_count"]
++ end
++
++ outrow["sleepreq"] = 100
++ local repcount = tonumber(scannet["sleepreq"])
++ if repcount and ( repcount > 0 ) then
++ outrow["sleepreq"] = scannet["sleepreq"]
++ end
++
++ if scannet["interface"] and ( scannet["interface"] ~= "" ) then
++ outrow["interface"] = scannet["interface"]
++ else
++ outrow["interface"] = ""
++ end
++
++ outrow["ports"] = ports
++ outrow["output"] = output
++ outnets[i] = outrow
++ end
++ end
++ i = next(nettable, i)
++ end
++ return outnets
++end
++
++function command_function(outnets, i)
++
++ local interface = luci.controller.luci_diag.devinfo_common.get_network_device(outnets[i]["interface"])
++
++ return "/usr/bin/netsmap-to-devinfo -r " .. outnets[i]["subnet"] .. " -t " .. outnets[i]["timeout"] .. " -i " .. interface .. " -x -p " .. outnets[i]["ports"] .. " -c " .. outnets[i]["repeat_count"] .. " -s " .. outnets[i]["sleepreq"] .. " </dev/null"
++end
++
++function action_links(smapmap, mini)
++ s = smapmap:section(SimpleSection, "", translate("Actions"))
++ b = s:option(DummyValue, "_config", translate("Configure Scans"))
++ b.value = ""
++ if (mini) then
++ b.titleref = luci.dispatcher.build_url("mini", "voice", "phones", "phone_scan_config")
++ else
++ b.titleref = luci.dispatcher.build_url("admin", "network", "diag_config", "smap_devinfo_config")
++ end
++ b = s:option(DummyValue, "_scans", translate("Repeat Scans (this can take a few minutes)"))
++ b.value = ""
++ if (mini) then
++ b.titleref = luci.dispatcher.build_url("mini", "diag", "phone_scan")
++ else
++ b.titleref = luci.dispatcher.build_url("admin", "status", "smap_devinfo")
++ end
++end
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/mactodevinfo.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/mactodevinfo.lua
+new file mode 100644
+index 0000000..2ecb359
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/mactodevinfo.lua
+@@ -0,0 +1,25 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("mactodevinfo", luci.i18n.translate("MAC Device Info Overrides"), translate("Override the information returned by the MAC to Device Info Script (mac-to-devinfo) for a specified range of MAC Addresses"))
++
++s = m:section(TypedSection, "mactodevinfo", translate("MAC Device Override"), translate("MAC range and information used to override system and IEEE databases"))
++s.addremove = true
++s.anonymous = true
++
++v = s:option(Value, "name", translate("Name"))
++v.optional = true
++v = s:option(Value, "maclow", translate("Beginning of MAC address range"))
++v.optional = false
++v = s:option(Value, "machigh", translate("End of MAC address range"))
++v.optional = false
++v = s:option(Value, "vendor", translate("Vendor"))
++v.optional = false
++v = s:option(Value, "devtype", translate("Device Type"))
++v.optional = false
++v = s:option(Value, "model", translate("Model"))
++v.optional = false
++v = s:option(Value, "ouiowneroverride", translate("OUI Owner"))
++v.optional = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo.lua
+new file mode 100644
+index 0000000..535c46b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo.lua
+@@ -0,0 +1,33 @@
++--[[
++netdiscover_devinfo - SIP Device Information
++
++(c) 2009 Daniel Dickinson
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++$Id$
++]]--
++
++require("luci.i18n")
++require("luci.util")
++require("luci.sys")
++require("luci.model.uci")
++require("luci.controller.luci_diag.netdiscover_common")
++require("luci.controller.luci_diag.devinfo_common")
++
++local debug = false
++
++m = SimpleForm("luci_devinfo", translate("Network Device Scan"), translate("Scans for devices on specified networks."))
++m.reset = false
++m.submit = false
++
++local outnets = luci.controller.luci_diag.netdiscover_common.get_params()
++luci.controller.luci_diag.devinfo_common.run_processes(outnets, luci.controller.luci_diag.netdiscover_common.command_function)
++luci.controller.luci_diag.devinfo_common.parse_output(m, outnets, false, "netdiscover", false, debug)
++luci.controller.luci_diag.netdiscover_common.action_links(m, false)
++
++return m
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo_config.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo_config.lua
+new file mode 100644
+index 0000000..ea8a64e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo_config.lua
+@@ -0,0 +1,19 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.controller.luci_diag.devinfo_common")
++
++m = Map("luci_devinfo", translate("Network Device Scanning Configuration"), translate("Configure scanning for devices on specified networks. Decreasing \'Timeout\', \'Repeat Count\', and/or \'Sleep Between Requests\' may speed up scans, but also may fail to find some devices."))
++
++s = m:section(SimpleSection, "", translate("Use Configuration"))
++b = s:option(DummyValue, "_scans", translate("Perform Scans (this can take a few minutes)"))
++b.value = ""
++b.titleref = luci.dispatcher.build_url("admin", "status", "netdiscover_devinfo")
++
++scannet = m:section(TypedSection, "netdiscover_scannet", translate("Scanning Configuration"), translate("Networks to scan for devices"))
++scannet.addremove = true
++scannet.anonymous = false
++
++luci.controller.luci_diag.devinfo_common.config_devinfo_scan(m, scannet)
++
++return m
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo_config_mini.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo_config_mini.lua
+new file mode 100644
+index 0000000..6d89bd6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo_config_mini.lua
+@@ -0,0 +1,19 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.controller.luci_diag.devinfo_common")
++
++m = Map("luci_devinfo", translate("Network Device Scanning Configuration"), translate("Configure scanning for devices on specified networks. Decreasing \'Timeout\', \'Repeat Count\', and/or \'Sleep Between Requests\' may speed up scans, but also may fail to find some devices."))
++
++s = m:section(SimpleSection, "", translate("Use Configuration"))
++b = s:option(DummyValue, "_scans", translate("Perform Scans (this can take a few minutes)"))
++b.value = ""
++b.titleref = luci.dispatcher.build_url("mini", "diag", "netdiscover_devinfo")
++
++scannet = m:section(TypedSection, "netdiscover_scannet", translate("Scanning Configuration"), translate("Networks to scan for devices"))
++scannet.addremove = true
++scannet.anonymous = false
++
++luci.controller.luci_diag.devinfo_common.config_devinfo_scan(m, scannet)
++
++return m
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo_mini.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo_mini.lua
+new file mode 100644
+index 0000000..271c114
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/netdiscover_devinfo_mini.lua
+@@ -0,0 +1,33 @@
++--[[
++netdiscover_devinfo - SIP Device Information
++
++(c) 2009 Daniel Dickinson
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++$Id$
++]]--
++
++require("luci.i18n")
++require("luci.util")
++require("luci.sys")
++require("luci.model.uci")
++require("luci.controller.luci_diag.netdiscover_common")
++require("luci.controller.luci_diag.devinfo_common")
++
++local debug = false
++
++m = SimpleForm("luci_devinfo", translate("Network Device Scan"), translate("Scan for devices on specified networks."))
++m.reset = false
++m.submit = false
++
++local outnets = luci.controller.luci_diag.netdiscover_common.get_params()
++luci.controller.luci_diag.devinfo_common.run_processes(outnets, luci.controller.luci_diag.netdiscover_common.command_function)
++luci.controller.luci_diag.devinfo_common.parse_output(m, outnets, false, "netdiscover", true, debug)
++luci.controller.luci_diag.netdiscover_common.action_links(m, true)
++
++return m
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo.lua
+new file mode 100644
+index 0000000..ff808d9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo.lua
+@@ -0,0 +1,33 @@
++--[[
++smap_devinfo - SIP Device Information
++
++(c) 2009 Daniel Dickinson
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++$Id$
++]]--
++
++require("luci.i18n")
++require("luci.util")
++require("luci.sys")
++require("luci.model.uci")
++require("luci.controller.luci_diag.smap_common")
++require("luci.controller.luci_diag.devinfo_common")
++
++local debug = false
++
++m = SimpleForm("luci-smap-to-devinfo", translate("SIP Device Information"), translate("Scan for supported SIP devices on specified networks."))
++m.reset = false
++m.submit = false
++
++local outnets = luci.controller.luci_diag.smap_common.get_params()
++luci.controller.luci_diag.devinfo_common.run_processes(outnets, luci.controller.luci_diag.smap_common.command_function)
++luci.controller.luci_diag.devinfo_common.parse_output(m, outnets, true, "smap", false, debug)
++luci.controller.luci_diag.smap_common.action_links(m, false)
++
++return m
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo_config.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo_config.lua
+new file mode 100644
+index 0000000..aab2406
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo_config.lua
+@@ -0,0 +1,24 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.controller.luci_diag.devinfo_common")
++
++m = Map("luci_devinfo", translate("SIP Device Scanning Configuration"), translate("Configure scanning for supported SIP devices on specified networks. Decreasing \'Timeout\', \'Repeat Count\', and/or \'Sleep Between Requests\' may speed up scans, but also may fail to find some devices."))
++
++s = m:section(SimpleSection, "", translate("Use Configuration"))
++b = s:option(DummyValue, "_scans", translate("Perform Scans (this can take a few minutes)"))
++b.value = ""
++b.titleref = luci.dispatcher.build_url("admin", "status", "smap_devinfo")
++
++scannet = m:section(TypedSection, "smap_scannet", translate("Scanning Configuration"), translate("Networks to scan for supported devices"))
++scannet.addremove = true
++scannet.anonymous = false
++
++local ports
++ports = scannet:option(Value, "ports", translate("Ports"))
++ports.optional = true
++ports.rmempty = true
++
++luci.controller.luci_diag.devinfo_common.config_devinfo_scan(m, scannet)
++
++return m
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo_config_mini.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo_config_mini.lua
+new file mode 100644
+index 0000000..01fc9b5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo_config_mini.lua
+@@ -0,0 +1,25 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.controller.luci_diag.devinfo_common")
++
++m = Map("luci_devinfo", translate("Phone Scanning Configuration"), translate("Configure scanning for supported SIP devices on specified networks. Decreasing \'Timeout\', \'Repeat Count\', and/or \'Sleep Between Requests\' may speed up scans, but also may fail to find some devices."))
++
++s = m:section(SimpleSection, "", translate("Use Configuration"))
++b = s:option(DummyValue, "_scans", translate("Perform Scans (this can take a few minutes)"))
++b.value = ""
++b.titleref = luci.dispatcher.build_url("mini", "diag", "phone_scan")
++
++scannet = m:section(TypedSection, "smap_scannet", translate("Scanning Configuration"), translate("Networks to scan for supported devices"))
++scannet.addremove = true
++scannet.anonymous = false
++
++local ports
++ports = scannet:option(Value, "ports", translate("Ports"))
++ports.optional = true
++ports.rmempty = true
++
++luci.controller.luci_diag.devinfo_common.config_devinfo_scan(m, scannet)
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo_mini.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo_mini.lua
+new file mode 100644
+index 0000000..5b7bb0f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/model/cbi/luci_diag/smap_devinfo_mini.lua
+@@ -0,0 +1,33 @@
++--[[
++smap_devinfo - SIP Device Information
++
++(c) 2009 Daniel Dickinson
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++$Id$
++]]--
++
++require("luci.i18n")
++require("luci.util")
++require("luci.sys")
++require("luci.model.uci")
++require("luci.controller.luci_diag.smap_common")
++require("luci.controller.luci_diag.devinfo_common")
++
++local debug = false
++
++m = SimpleForm("luci-smap-to-devinfo", translate("Phone Information"), translate("Scan for supported SIP devices on specified networks."))
++m.reset = false
++m.submit = false
++
++local outnets = luci.controller.luci_diag.smap_common.get_params()
++luci.controller.luci_diag.devinfo_common.run_processes(outnets, luci.controller.luci_diag.smap_common.command_function)
++luci.controller.luci_diag.devinfo_common.parse_output(m, outnets, true, "smap", true, debug)
++luci.controller.luci_diag.smap_common.action_links(m, true)
++
++return m
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/view/diag/smapsection.htm b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/view/diag/smapsection.htm
+new file mode 100644
+index 0000000..b9ad8a5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/view/diag/smapsection.htm
+@@ -0,0 +1,129 @@
++<%#
++ Copyright 2009 Daniel Dickinson
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%-
++local rowcnt = 1
++function rowstyle()
++ rowcnt = rowcnt + 1
++ return (rowcnt % 2) + 1
++end
++-%>
++
++<!-- smapsection -->
++<fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
++ <% if self.title and #self.title > 0 then -%>
++ <legend><%=self.title%></legend>
++ <%- 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 -%>
++ <%- end -%>
++ <%- for i, k in pairs(self.children) do if not k.optional then -%>
++ <th class="cbi-section-table-cell">
++ <%- 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.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"><%=k.description%></th>
++ <%- end; 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><%=k%></h3></th>
++ <%- end %>
++
++ <%- for k, node in ipairs(self.children) do -%>
++ <%- if not node.optional then -%>
++ <%- nodevalue = node:cfgvalue(section) -%>
++ <%- if nodevalue and ( nodevalue ~= "" ) and string.find(nodevalue, 'http://', 1, plain) then
++ node.href = nodevalue
++ node.template = "diag/smapvalue"
++ end
++ -%>
++ <%- node:render(section, scope or {}) -%>
++ <%- end -%>
++ <%- end -%>
++
++ <%- if self.extedit or self.addremove then -%>
++ <td class="cbi-section-table-cell">
++ <%- if self.extedit then -%>
++ <a href="
++ <%- if type(self.extedit) == "string" then -%>
++ <%=self.extedit:format(section)%>
++ <%- elseif type(self.extedit) == "function" then -%>
++ <%=self:extedit(section)%>
++ <%- end -%>
++ " title="<%:Edit%>"><img style="border: none" src="<%=resource%>/cbi/edit.gif" alt="<%:Edit%>" /></a>
++ <%- end; if self.addremove then %>
++ <input type="image" value="<%:Delete%>" name="cbi.rts.<%=self.config%>.<%=k%>" alt="<%:Delete%>" title="<%:Delete%>" src="<%=resource%>/cbi/remove.gif" />
++ <%- end -%>
++ </td>
++ <%- end -%>
++ </tr>
++ <%- end -%>
++
++ <%- if isempty then -%>
++ <tr class="cbi-section-table-row">
++ <td colspan="<%=count%>"><em><br /><%:This section contains no values yet%></em></td>
++ </tr>
++ <%- 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><%=luci.util.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-smapsection-create">
++ <% if self.anonymous then %>
++ <input class="cbi-button cbi-button-add" type="submit" value="<%:Add%>" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" title="<%:Add%>" />
++ <% else %>
++ <% if self.invalid_cts then -%><div class="cbi-section-error"><% end %>
++ <input type="text" class="cbi-section-create-name" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>" />
++ <input class="cbi-button cbi-button-add" type="submit" value="<%:Add%>" title="<%:Add%>" />
++ <% if self.invalid_cts then -%>
++ <br /><%:Invalid%></div>
++ <%- end %>
++ <% end %>
++ </div>
++ <%- end %>
++ <%- end -%>
++ </div>
++</fieldset>
++<!-- /smapsection -->
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/view/diag/smapvalue.htm b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/view/diag/smapvalue.htm
+new file mode 100644
+index 0000000..278985c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/view/diag/smapvalue.htm
+@@ -0,0 +1,12 @@
++<%#
++ Copyright 2009 Daniel Dickinson
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+cbi/valueheader%>
++<% if self.href then %><a href="<%=self.href%>" target="_blank"><% end -%>
++ <%=luci.util.pcdata(self:cfgvalue(section))%>
++<%- if self.href then %></a><%end%>
++&#160;
++<input type="hidden" id="<%=cbid%>" value="<%=luci.util.pcdata(self:cfgvalue(section))%>" />
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/ca/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/ca/diag_devinfo.po
+new file mode 100644
+index 0000000..9739a4b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/ca/diag_devinfo.po
+@@ -0,0 +1,209 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-02 05:29+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "Accions"
++
++msgid "Add"
++msgstr "Afegeix"
++
++msgid "Beginning of MAC address range"
++msgstr ""
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr "Configura"
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr "Suprimeix"
++
++msgid "Device Scan Config"
++msgstr ""
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr "Devices discovered for"
++
++msgid "Devices on Network"
++msgstr ""
++
++msgid "Edit"
++msgstr "Edita"
++
++msgid "Enable"
++msgstr "Habilita"
++
++msgid "End of MAC address range"
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr "Adreça IP"
++
++msgid "Interface"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Link to Device"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++
++msgid "Model"
++msgstr "Model"
++
++msgid "Name"
++msgstr "Nom"
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr "Cap dispositiu SIP"
++
++msgid "No devices detected"
++msgstr "Cap dispositiu detectat"
++
++msgid "Number of times to send requests (default 1)"
++msgstr ""
++
++msgid "OUI Owner"
++msgstr "Propietari OUI"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr "Informació de telèfon"
++
++msgid "Phone Scan"
++msgstr ""
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr "Telèfons"
++
++msgid "Ports"
++msgstr "Ports"
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr ""
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr ""
++
++msgid "SIP Device Scan"
++msgstr ""
++
++msgid "SIP Device Scanning Configuration"
++msgstr ""
++
++msgid "SIP Devices on Network"
++msgstr ""
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr ""
++
++msgid "Subnet"
++msgstr "Subxarxa"
++
++msgid "This section contains no values yet"
++msgstr "Esta secció encara no conté valors"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr ""
++
++msgid "Timeout"
++msgstr "Temps d'espera"
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr "Venedor"
++
++msgid "check other networks"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/cs/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/cs/diag_devinfo.po
+new file mode 100644
+index 0000000..73fe67e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/cs/diag_devinfo.po
+@@ -0,0 +1,209 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-11 19:32+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "Akce"
++
++msgid "Add"
++msgstr "Přidat"
++
++msgid "Beginning of MAC address range"
++msgstr "ZaÄátek rozsahu MAC adres"
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr "Konfigurace"
++
++msgid "Configure Scans"
++msgstr "Konfigurace skenů"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr "Odstranit"
++
++msgid "Device Scan Config"
++msgstr ""
++
++msgid "Device Type"
++msgstr "Typ zařízení"
++
++msgid "Devices discovered for"
++msgstr "Devices discovered for"
++
++msgid "Devices on Network"
++msgstr "Zařízení na síti"
++
++msgid "Edit"
++msgstr "Upravit"
++
++msgid "Enable"
++msgstr "Povolit"
++
++msgid "End of MAC address range"
++msgstr "Konec rozsahu MAC adres"
++
++msgid "Go to relevant configuration page"
++msgstr "PÅ™ejít na přísluÅ¡nou konfiguraÄní stránku"
++
++msgid "IP Address"
++msgstr "IP adresa"
++
++msgid "Interface"
++msgstr "Rozhraní"
++
++msgid "Invalid"
++msgstr "Neplatný"
++
++msgid "Link to Device"
++msgstr "Odkaz na zařízení"
++
++msgid "MAC Address"
++msgstr "MAC adresa"
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "Jak dlouho spát mezi požadavky (milisekundy, výchozí 100)"
++
++msgid "Model"
++msgstr "Model"
++
++msgid "Name"
++msgstr "Jméno"
++
++msgid "Network Device Scan"
++msgstr "Vyhledání síťových zařízení"
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr "Žádná zařízení SIP"
++
++msgid "No devices detected"
++msgstr "Nebyla detekována žádná zařízení"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "Kolikrát odeslat požadavek (standardně 1)"
++
++msgid "OUI Owner"
++msgstr "Vlastník OUI"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "Provést skenování (může trvat několik minut)"
++
++msgid "Phone Information"
++msgstr "Informace o telefonu"
++
++msgid "Phone Scan"
++msgstr "Vyhledání telefonů"
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr "Telefony"
++
++msgid "Ports"
++msgstr "Porty"
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr "PoÄet opakování"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "Opakování skenování (může trvat několik minut)"
++
++msgid "SIP Device Information"
++msgstr "Informace o zařízení SIP"
++
++msgid "SIP Device Scan"
++msgstr "Skenování SIP zařízení"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "Konfigurace skenování SIP zařízení"
++
++msgid "SIP Devices on Network"
++msgstr "Zařízení SIP na síti"
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr "Hledat zařízení na zadané síti"
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr "Nastavení skenování"
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr "Uspat mezi jednotlivými požadavky"
++
++msgid "Subnet"
++msgstr "Podsíť"
++
++msgid "This section contains no values yet"
++msgstr "Tato sekce zatím neobsahuje žádné hodnoty"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Doba Äekání na odpovÄ›di v sekundách (výchozí 10)"
++
++msgid "Timeout"
++msgstr "Časový limit"
++
++msgid "Use Configuration"
++msgstr "Použít nastavení"
++
++msgid "Vendor"
++msgstr "Prodejce"
++
++msgid "check other networks"
++msgstr "zkontrolovat ostatní sítě"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/de/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/de/diag_devinfo.po
+new file mode 100644
+index 0000000..2401ece
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/de/diag_devinfo.po
+@@ -0,0 +1,221 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-08-10 02:08+0200\n"
++"Last-Translator: Jo-Philipp <jow@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "Aktionen"
++
++msgid "Add"
++msgstr "Hinzufügen"
++
++msgid "Beginning of MAC address range"
++msgstr "Beginn des MAC-Adress-Bereiches"
++
++msgid "Config Phone Scan"
++msgstr "Telefonsuche konfigurieren"
++
++msgid "Configure"
++msgstr "Konfigurieren"
++
++msgid "Configure Scans"
++msgstr "Suche konfigurieren"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++"Konfiguriere Suche für Geräte in gewählten Netzwerken. Das Verringern von "
++"'Zeitüberschreitung', 'Wiederholungszähler' und/oder 'Pause zwischen "
++"Anfragen' kann die Geschwindigkeit der Suche erhöhen, aber auch das Finden "
++"einzelner Geräte verhindern."
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++"Konfiguriere Suche für SIP-Gerätein gewählten Netzwerken. Das Verringern von "
++"'Zeitüberschreitung', 'Wiederholungszähler' und/oder 'Pause zwischen "
++"Anfragen' kann die Geschwindigkeit der Suche erhöhen, aber auch das Finden "
++"einzelner Geräte verhindern."
++
++msgid "Delete"
++msgstr "Löschen"
++
++msgid "Device Scan Config"
++msgstr "Gerätesuche konfigurieren"
++
++msgid "Device Type"
++msgstr "Geräte-Typ"
++
++msgid "Devices discovered for"
++msgstr "Geräte gefunden für"
++
++msgid "Devices on Network"
++msgstr "Geräte im Netzwerk"
++
++msgid "Edit"
++msgstr "Bearbeiten"
++
++msgid "Enable"
++msgstr "Aktivieren"
++
++msgid "End of MAC address range"
++msgstr "Ende des MAC-Adress-Bereiches"
++
++msgid "Go to relevant configuration page"
++msgstr "Gehe zu entsprechender Konfigurations-Seite"
++
++msgid "IP Address"
++msgstr "IP-Adresse"
++
++msgid "Interface"
++msgstr "Schnittstelle"
++
++msgid "Invalid"
++msgstr "Ungültig"
++
++msgid "Link to Device"
++msgstr "Verknüpfung zu Gerät"
++
++msgid "MAC Address"
++msgstr "MAC-Adresse"
++
++msgid "MAC Device Info Overrides"
++msgstr "Benutzerdefinierte MAC-zu-Gerät-Benennungen"
++
++msgid "MAC Device Override"
++msgstr "Benutzerdefinierte MAC-zu-Gerät-Benennung"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++"MAC-Adressbereich und Benennungen um die Informationen der System- und IEEE-"
++"Datenbanken zu überschreiben"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "Wartezeit zwischen den Anfragen in Millisekunden (Standard 100)"
++
++msgid "Model"
++msgstr "Modell"
++
++msgid "Name"
++msgstr "Name"
++
++msgid "Network Device Scan"
++msgstr "Netzwerkgerätesuche"
++
++msgid "Network Device Scanning Configuration"
++msgstr "Konfiguration der Netzwerkgerätesuche"
++
++msgid "Networks to scan for devices"
++msgstr "Zu durchsuchende Netzwerke"
++
++msgid "Networks to scan for supported devices"
++msgstr "Nach unterstützten Geräten zu durchsuchende Netzwerke"
++
++msgid "No SIP devices"
++msgstr "keine SIP-Geräte"
++
++msgid "No devices detected"
++msgstr "keine Geräte gefunden"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "Anzahl der Versuche Anfragen zu senden (Standard 1)"
++
++msgid "OUI Owner"
++msgstr "OUI-Organisation"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++"Überschreibt die Informationen die durch das MAC-zu-Gerätename-Programm (mac-"
++"to-devinfo) für einen bestimmten MAC-Adressbereich zurückgegeben werden"
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "Führe Suche aus (Dies kann einige Minuten dauern)"
++
++msgid "Phone Information"
++msgstr "Informationen zum Telefon"
++
++msgid "Phone Scan"
++msgstr "Telefonsuche"
++
++msgid "Phone Scanning Configuration"
++msgstr "Konfiguration der Telefonsuche"
++
++msgid "Phones"
++msgstr "Telefone"
++
++msgid "Ports"
++msgstr "Ports"
++
++msgid "Raw"
++msgstr "Rohdaten"
++
++msgid "Repeat Count"
++msgstr "Wiederholungsanzahl"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "Wiederhole Suche (Dies kann einige Minuten dauern)"
++
++msgid "SIP Device Information"
++msgstr "SIP-Geräteinformationen"
++
++msgid "SIP Device Scan"
++msgstr "SIP-Gerätesuche"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "Konfiguration der SIP-Gerätesuche"
++
++msgid "SIP Devices on Network"
++msgstr "SIP-Geräte im Netzwerk"
++
++msgid "SIP devices discovered for"
++msgstr "SIP-Geräte entdeckt für"
++
++msgid "Scan for devices on specified networks."
++msgstr "Suche nach Geräten im spezifizierten Netzwerk"
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr "Suche nach SIP-unterstützenden Geräten im spezifizierten Netzwerk"
++
++msgid "Scanning Configuration"
++msgstr "Such-Konfiguration"
++
++msgid "Scans for devices on specified networks."
++msgstr "Scans for devices on specified networks."
++
++msgid "Sleep Between Requests"
++msgstr "Wartezeit zwischen den Versuchen"
++
++msgid "Subnet"
++msgstr "Subnetz"
++
++msgid "This section contains no values yet"
++msgstr "Dieser Abschnitt enthält noch keine Werte"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Antwortwartezeit in Sekunden (Standard: 10)"
++
++msgid "Timeout"
++msgstr "Zeitüberschreitung"
++
++msgid "Use Configuration"
++msgstr "Verwende Konfiguration"
++
++msgid "Vendor"
++msgstr "Hersteller"
++
++msgid "check other networks"
++msgstr "Prüfe andere Netzwerke"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/el/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/el/diag_devinfo.po
+new file mode 100644
+index 0000000..7a247cb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/el/diag_devinfo.po
+@@ -0,0 +1,209 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-19 15:30+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: none\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Actions"
++msgstr ""
++
++msgid "Add"
++msgstr "ΠÏοσθήκη"
++
++msgid "Beginning of MAC address range"
++msgstr "ΑÏχή εÏÏους διευθÏνσεων MAC"
++
++msgid "Config Phone Scan"
++msgstr "ΡÏθμιση ΣάÏωσης Τηλεφώνων"
++
++msgid "Configure"
++msgstr "ΠαÏαμετÏοποίηση"
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr "ΔιαγÏαφή"
++
++msgid "Device Scan Config"
++msgstr "ΡÏθμιση ΣάÏωσης Συσκευών"
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr "Devices discovered for"
++
++msgid "Devices on Network"
++msgstr "Συσκευές στο Δίκτυο"
++
++msgid "Edit"
++msgstr "ΕπεξεÏγασία"
++
++msgid "Enable"
++msgstr "ΕνεÏγοποίηση"
++
++msgid "End of MAC address range"
++msgstr "Τέλος εÏÏους διευθÏνσεων MAC"
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr "ΔιεÏθυνση IP"
++
++msgid "Interface"
++msgstr "Διεπαφή"
++
++msgid "Invalid"
++msgstr "Μη έγκυÏο"
++
++msgid "Link to Device"
++msgstr "ΖεÏξη με Συσκευή"
++
++msgid "MAC Address"
++msgstr "ΔιεÏθυνση MAC"
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Name"
++msgstr "Όνομα"
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr "Δεν υπάÏχουν συσκευές SIP"
++
++msgid "No devices detected"
++msgstr "Δεν ανιχνεÏτηκαν συσκευές"
++
++msgid "Number of times to send requests (default 1)"
++msgstr ""
++
++msgid "OUI Owner"
++msgstr "Ιδιοκτήτης OUI"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr "ΠληÏοφοÏίες Τηλεφώνου"
++
++msgid "Phone Scan"
++msgstr "ΣάÏωση Τηλεφώνων"
++
++msgid "Phone Scanning Configuration"
++msgstr "ΠαÏαμετÏοποίηση ΣάÏωσης Τηλεφώνων"
++
++msgid "Phones"
++msgstr "Τηλέφωνα"
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr "ΑνεπεξέÏγαστα"
++
++msgid "Repeat Count"
++msgstr "Επανάληψη ΜέτÏησης"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr "ΠληÏοφοÏίες Συσκευής SIP"
++
++msgid "SIP Device Scan"
++msgstr "ΣάÏωση για συσκευές SIP"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "ΠαÏαμετÏοποίηση ΣάÏωσης Συσκευών SIP"
++
++msgid "SIP Devices on Network"
++msgstr "Συσκευές SIP στο Δίκτυο"
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr "ΣάÏωση για συσκευές σε καθοÏισμένα δίκτυα."
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr "Scans for devices on specified networks."
++
++msgid "Sleep Between Requests"
++msgstr ""
++
++msgid "Subnet"
++msgstr "Υποδίκτυο"
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr ""
++
++msgid "Timeout"
++msgstr ""
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr "έλεγχος άλλων δικτÏων"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/en/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/en/diag_devinfo.po
+new file mode 100644
+index 0000000..7adbbea
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/en/diag_devinfo.po
+@@ -0,0 +1,213 @@
++# Diagnostics (Device Info).
++# Copyright (C) 2009 Daniel Dickinson
++# Daniel Dickinson <crazycshore@gmail.com>, 2009.
++#
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2009-07-17 04:22-0400\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Actions"
++msgstr ""
++
++msgid "Add"
++msgstr "Add"
++
++msgid "Beginning of MAC address range"
++msgstr "Beginning of MAC address range"
++
++msgid "Config Phone Scan"
++msgstr "Config Phone Scan"
++
++msgid "Configure"
++msgstr "Configure"
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr "Delete"
++
++msgid "Device Scan Config"
++msgstr "Device Scan Config"
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr ""
++
++msgid "Devices on Network"
++msgstr "Devices on Network"
++
++msgid "Edit"
++msgstr "Edit"
++
++msgid "Enable"
++msgstr "Enable"
++
++msgid "End of MAC address range"
++msgstr "End of MAC address range"
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr "IP Address"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Invalid"
++msgstr "Invalid"
++
++msgid "Link to Device"
++msgstr "Link to Device"
++
++msgid "MAC Address"
++msgstr "MAC Address"
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr "MAC Device Override"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr "MAC range and information used to override system and IEEE databases"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "Milliseconds to sleep between requests (default 100)"
++
++msgid "Model"
++msgstr ""
++
++msgid "Name"
++msgstr "Name"
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr "No SIP devices"
++
++msgid "No devices detected"
++msgstr "No devices detected"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "Number of times to send requests (default 1)"
++
++msgid "OUI Owner"
++msgstr "OUI Owner"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr "Phone Information"
++
++msgid "Phone Scan"
++msgstr "Phone Scan"
++
++msgid "Phone Scanning Configuration"
++msgstr "Phone Scanning Configuration"
++
++msgid "Phones"
++msgstr "Phones"
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr "Raw"
++
++msgid "Repeat Count"
++msgstr "Repeat Count"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr "SIP Device Information"
++
++msgid "SIP Device Scan"
++msgstr "SIP Device Scan"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "SIP Device Scanning Configuration"
++
++msgid "SIP Devices on Network"
++msgstr "SIP Devices on Network"
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr "Scan for devices on specified networks."
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr "Scans for devices on specified networks."
++
++msgid "Sleep Between Requests"
++msgstr "Sleep Between Requests"
++
++msgid "Subnet"
++msgstr "Subnet"
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Time to wait for responses in seconds (default 10)"
++
++msgid "Timeout"
++msgstr "Timeout"
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr "check other networks"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/es/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/es/diag_devinfo.po
+new file mode 100644
+index 0000000..0b44ff3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/es/diag_devinfo.po
+@@ -0,0 +1,222 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-08-26 20:14+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "Acciones"
++
++msgid "Add"
++msgstr "Añadir"
++
++msgid "Beginning of MAC address range"
++msgstr "Inicio del rango de direcciones MAC"
++
++msgid "Config Phone Scan"
++msgstr "Configurar escaneo de teléfono"
++
++msgid "Configure"
++msgstr "Configurar"
++
++msgid "Configure Scans"
++msgstr "Explorar configuraciones"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++"Configure la exploración de dispositivos en las redes especificadas. "
++"Reduciendo \"Espera\", \"Repeticiones\" y/o \"Parar entre peticiones\" puede "
++"acelerar las exploración, pero también puede que no encuentre algunos "
++"dispositivos."
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++"Configure la exploración de dispositivos SIP soportados en las redes "
++"especificadas. Reduciendo \"Espera\", \"Repeticiones\" y/o \"Parar entre "
++"peticiones\" puede acelerar la exploración, pero también puede que no "
++"encuentre algunos dispositivos."
++
++msgid "Delete"
++msgstr "Borrar"
++
++msgid "Device Scan Config"
++msgstr "Configuración del escaneo de dispositivos"
++
++msgid "Device Type"
++msgstr "Tipo de dispositivo"
++
++msgid "Devices discovered for"
++msgstr "Dispositivos encontrados para"
++
++msgid "Devices on Network"
++msgstr "Dispositivos en red"
++
++msgid "Edit"
++msgstr "Editar"
++
++msgid "Enable"
++msgstr "Activar"
++
++msgid "End of MAC address range"
++msgstr "Fin del rango de direcciones MAC"
++
++msgid "Go to relevant configuration page"
++msgstr "Ir a la página de configuración pertinente"
++
++msgid "IP Address"
++msgstr "Dirección IP"
++
++msgid "Interface"
++msgstr "Interfaz"
++
++msgid "Invalid"
++msgstr "No válido"
++
++msgid "Link to Device"
++msgstr "Enlazar con dispositivo"
++
++msgid "MAC Address"
++msgstr "Dirección MAC"
++
++msgid "MAC Device Info Overrides"
++msgstr "Ignorar la información del dispositivo MAC"
++
++msgid "MAC Device Override"
++msgstr "Ignorar MAC del dispositivo"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++"Dirección MAC e información usada para ignorar el sistema y bases de datos "
++"IEEE"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "Milisegundos a detenerse entre peticiones (100 por defecto)"
++
++msgid "Model"
++msgstr "Modelo"
++
++msgid "Name"
++msgstr "Nombre"
++
++msgid "Network Device Scan"
++msgstr "Exploración de dispositivos de red"
++
++msgid "Network Device Scanning Configuration"
++msgstr "Configuración de la exploración de dispositivos de red"
++
++msgid "Networks to scan for devices"
++msgstr "Redes en las que escanear dispositivos"
++
++msgid "Networks to scan for supported devices"
++msgstr "Redes en las que escanear dispositivos soportados"
++
++msgid "No SIP devices"
++msgstr "No hay dispositivos SIP"
++
++msgid "No devices detected"
++msgstr "No se detectan dispositivos"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "Número de veces que se enviarán peticiones (1 por defecto)"
++
++msgid "OUI Owner"
++msgstr "Propietario del OUI"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++"Ignorar la información devuelta por el script de información MAC a "
++"dispositivo (mac-to-devinfo) para el rango de direcciones MAC que se "
++"especifica"
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "Realizar exploraciones (puede llevar unos minutos)"
++
++msgid "Phone Information"
++msgstr "Información de teléfono"
++
++msgid "Phone Scan"
++msgstr "Escanear teléfono"
++
++msgid "Phone Scanning Configuration"
++msgstr "Configuración del escaneo telefónico"
++
++msgid "Phones"
++msgstr "Teléfonos"
++
++msgid "Ports"
++msgstr "Puertos"
++
++msgid "Raw"
++msgstr "Sin tratar"
++
++msgid "Repeat Count"
++msgstr "Número de repeticiones"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "Repetir exploraciones (puede llevar unos minutos)"
++
++msgid "SIP Device Information"
++msgstr "Información de dispositivos SIP"
++
++msgid "SIP Device Scan"
++msgstr "Escanear dispositivos SIP"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "Configuración de escaneo de dispositivos SIP"
++
++msgid "SIP Devices on Network"
++msgstr "Dispositivos SIP en red"
++
++msgid "SIP devices discovered for"
++msgstr "Dispositivos SIP para los que descubrir"
++
++msgid "Scan for devices on specified networks."
++msgstr "Buscar dispositivos en las redes especificadas."
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr "Explorar dispositivos SIP soportados en las redes especificadas."
++
++msgid "Scanning Configuration"
++msgstr "Configuración de la exploración"
++
++msgid "Scans for devices on specified networks."
++msgstr "Explora dispositivos en las redes especificadas."
++
++msgid "Sleep Between Requests"
++msgstr "Detenerse entre peticiones"
++
++msgid "Subnet"
++msgstr "Subred"
++
++msgid "This section contains no values yet"
++msgstr "Esta sección aún no tiene valores"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Esperar de respuestas en segundos (10 por defecto)"
++
++msgid "Timeout"
++msgstr "Espera"
++
++msgid "Use Configuration"
++msgstr "Use la configuración"
++
++msgid "Vendor"
++msgstr "Vendedor"
++
++msgid "check other networks"
++msgstr "comprueba otras redes"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/fr/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/fr/diag_devinfo.po
+new file mode 100644
+index 0000000..e3d3809
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/fr/diag_devinfo.po
+@@ -0,0 +1,220 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-01-26 12:49+0200\n"
++"Last-Translator: kyas <rimk_71@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "Actions"
++
++msgid "Add"
++msgstr "Ajouter"
++
++msgid "Beginning of MAC address range"
++msgstr "Début de la plage d'adresses MAC"
++
++msgid "Config Phone Scan"
++msgstr "Configurer la recherche de téléphone"
++
++msgid "Configure"
++msgstr "Configurer"
++
++msgid "Configure Scans"
++msgstr "Configurer la recherche"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++"Configurer la recherche d'appareils sur un réseau spécifié. Réduire le "
++"'Timeout', 'Repeat Count', et/ou 'Sleep Between Requests' peut augmenter la "
++"vitesse des scans, mais peut aussi ne pas trouver certains appareils."
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++"Configurer la recherche d'appareils SIP supporté sur un réseau spécifié. "
++"Réduire le 'Timeout', 'Repeat Count', et/ou 'Sleep Between Requests' peut "
++"augmenter la vitesse des scans, mais peut aussi ne pas trouver certains "
++"appareils."
++
++msgid "Delete"
++msgstr "Supprimer"
++
++msgid "Device Scan Config"
++msgstr "Configuration de la recherche de périphériques"
++
++msgid "Device Type"
++msgstr "Type d'appareil"
++
++msgid "Devices discovered for"
++msgstr "Devices discovered for"
++
++msgid "Devices on Network"
++msgstr "Périphériques sur le réseau"
++
++msgid "Edit"
++msgstr "Éditer"
++
++msgid "Enable"
++msgstr "Activer"
++
++msgid "End of MAC address range"
++msgstr "Fin de la plage d'adresses MAC"
++
++msgid "Go to relevant configuration page"
++msgstr "Aller à la page de configuration appropriée"
++
++msgid "IP Address"
++msgstr "Adresse IP"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Invalid"
++msgstr "Invalide"
++
++msgid "Link to Device"
++msgstr "Lien vers le périphérique"
++
++msgid "MAC Address"
++msgstr "Adresse MAC"
++
++msgid "MAC Device Info Overrides"
++msgstr "Modification info MAC du périphérique"
++
++msgid "MAC Device Override"
++msgstr "Modification de MAC de périphériques"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++"Gamme d'adresses MAC et informations utilisées pour modifier les bases "
++"système et IEEE"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "Durée d'attente en millisecondes entre les requêtes (par défaut 100)"
++
++msgid "Model"
++msgstr "Modèle"
++
++msgid "Name"
++msgstr "Nom"
++
++msgid "Network Device Scan"
++msgstr "Analyse des périphériques réseau"
++
++msgid "Network Device Scanning Configuration"
++msgstr "Configuration de l'analyse des périphériques réseau"
++
++msgid "Networks to scan for devices"
++msgstr "Réseaux à scanner pour les périphériques "
++
++msgid "Networks to scan for supported devices"
++msgstr "Réseaux à scanner pour les périphériques supporté"
++
++msgid "No SIP devices"
++msgstr "Pas de périphérique SIP"
++
++msgid "No devices detected"
++msgstr "Pas de périphérique détecté"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "Nombre de tentatives d'envois des requêtes (1 par défaut)"
++
++msgid "OUI Owner"
++msgstr "OUI du fabricant"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++"Modifie les informations renvoyées par le script d'information « MAC vers "
++"Périphérique » (mac-to-devinfo) pour une gamme donnée d'adresses MAC"
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "Faire un scan ( Cela peut prendre quelques minutes)"
++
++msgid "Phone Information"
++msgstr "Informations concernant le téléphone"
++
++msgid "Phone Scan"
++msgstr "Recherche d'un téléphone"
++
++msgid "Phone Scanning Configuration"
++msgstr "Configuration de la recherche d'un téléphone"
++
++msgid "Phones"
++msgstr "Téléphones"
++
++msgid "Ports"
++msgstr "Ports"
++
++msgid "Raw"
++msgstr "Brut"
++
++msgid "Repeat Count"
++msgstr "Nombre de tentatives"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "Refaire scans (cela peut prendre quelques minutes )"
++
++msgid "SIP Device Information"
++msgstr "Informations concernant le périphérique SIP"
++
++msgid "SIP Device Scan"
++msgstr "Recherche de périphérique SIP"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "Configuration de la recherche de périphériques SIP"
++
++msgid "SIP Devices on Network"
++msgstr "Périphériques SIP sur le réseau"
++
++msgid "SIP devices discovered for"
++msgstr "Périphériques SIP découvert pour"
++
++msgid "Scan for devices on specified networks."
++msgstr "Rechercher des périphériques sur les réseaux spécifiés."
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr "Rechercher des périphériques SIP supportés sur les réseaux spécifiés."
++
++msgid "Scanning Configuration"
++msgstr "Analyse de la configuration"
++
++msgid "Scans for devices on specified networks."
++msgstr "Recherches des périphériques sur les réseaux spécifiés."
++
++msgid "Sleep Between Requests"
++msgstr "Attente entre les requêtes"
++
++msgid "Subnet"
++msgstr "Sous-réseau"
++
++msgid "This section contains no values yet"
++msgstr "Cette partie ne contient pas encore de valeur."
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Durée d'attente des réponses en secondes (par défaut 10)"
++
++msgid "Timeout"
++msgstr "Timeout"
++
++msgid "Use Configuration"
++msgstr "Utiliser la configuration"
++
++msgid "Vendor"
++msgstr "Vendeur"
++
++msgid "check other networks"
++msgstr "Explorer d'autres réseaux"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/he/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/he/diag_devinfo.po
+new file mode 100644
+index 0000000..7161955
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/he/diag_devinfo.po
+@@ -0,0 +1,206 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Actions"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Beginning of MAC address range"
++msgstr ""
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr ""
++
++msgid "Device Scan Config"
++msgstr ""
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr "Devices discovered for"
++
++msgid "Devices on Network"
++msgstr ""
++
++msgid "Edit"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "End of MAC address range"
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Link to Device"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr ""
++
++msgid "No devices detected"
++msgstr ""
++
++msgid "Number of times to send requests (default 1)"
++msgstr ""
++
++msgid "OUI Owner"
++msgstr ""
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr ""
++
++msgid "Phone Scan"
++msgstr ""
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr ""
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr ""
++
++msgid "SIP Device Scan"
++msgstr ""
++
++msgid "SIP Device Scanning Configuration"
++msgstr ""
++
++msgid "SIP Devices on Network"
++msgstr ""
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr ""
++
++msgid "Subnet"
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr ""
++
++msgid "Timeout"
++msgstr ""
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/hu/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/hu/diag_devinfo.po
+new file mode 100644
+index 0000000..5201994
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/hu/diag_devinfo.po
+@@ -0,0 +1,222 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-01-31 10:01+0200\n"
++"Last-Translator: Gabor <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "Műveletek"
++
++msgid "Add"
++msgstr "Hozzáadás"
++
++msgid "Beginning of MAC address range"
++msgstr "MAC cím tartomány kezdete"
++
++msgid "Config Phone Scan"
++msgstr "Telefon keresés beállításai"
++
++msgid "Configure"
++msgstr "Beállítás"
++
++msgid "Configure Scans"
++msgstr "Keresési beállítások"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++"Ãllítsa be az eszközkeresést a megadott hálózatokon. Az 'IdÅ‘limit', "
++"'Ismétlésszám', és/vagy 'Alvás a lekérdezések között' csökkentése "
++"felgyorsíthatja a keresést, de lehet, hogy nem talál meg néhány eszközt."
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++"Ãllítsa be a támogatott SIP eszközök keresését a megadott hálózatokon. Az "
++"'Időlimit', 'Ismétlésszám', és/vagy 'Alvás a lekérdezések között' "
++"csökkentése felgyorsíthatja a keresést, de lehet, hogy nem talál meg néhány "
++"eszközt."
++
++msgid "Delete"
++msgstr "Törlés"
++
++msgid "Device Scan Config"
++msgstr "Eszköz keresés beállításai"
++
++msgid "Device Type"
++msgstr "Eszköztípus"
++
++msgid "Devices discovered for"
++msgstr "Felfedezett eszközök"
++
++msgid "Devices on Network"
++msgstr "Eszközök a hálózatban"
++
++msgid "Edit"
++msgstr "Szerkesztés"
++
++msgid "Enable"
++msgstr "Engedélyezés"
++
++msgid "End of MAC address range"
++msgstr "MAC cím tartomány vége"
++
++msgid "Go to relevant configuration page"
++msgstr "Ugrás a kapcsolódó beállítások oldalára"
++
++msgid "IP Address"
++msgstr "IP cím"
++
++msgid "Interface"
++msgstr "Interfész"
++
++msgid "Invalid"
++msgstr "Érvénytelen"
++
++msgid "Link to Device"
++msgstr "Eszközre mutató hivatkozás"
++
++msgid "MAC Address"
++msgstr "MAC cím"
++
++msgid "MAC Device Info Overrides"
++msgstr "MAC eszköz információ felülbírálások"
++
++msgid "MAC Device Override"
++msgstr "MAC eszköz felülbírálása"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++"A rendszer és IEEE adatbázisok felülbíráláshoz használt MAC cím tartomány és "
++"információ"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++"A kérések küldése közötti szünet időtartama ezredmásodpercben "
++"(alapértelmezés: 100)"
++
++msgid "Model"
++msgstr "Típus"
++
++msgid "Name"
++msgstr "Név"
++
++msgid "Network Device Scan"
++msgstr "Hálózati eszközök keresése"
++
++msgid "Network Device Scanning Configuration"
++msgstr "Hálózati eszközök keresési beállításai"
++
++msgid "Networks to scan for devices"
++msgstr "Eszközök keresése ezekben a hálózatokban"
++
++msgid "Networks to scan for supported devices"
++msgstr "Támogatott eszközök keresése ezekben a hálózatokban"
++
++msgid "No SIP devices"
++msgstr "Nem találhatóak SIP eszközök"
++
++msgid "No devices detected"
++msgstr "Nem található semmilyen eszköz"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "Az elküldött kérések száma (alapértelmezés: 1)"
++
++msgid "OUI Owner"
++msgstr "OUI tulajdonos"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++"A meghatározott tartományba tartozó MAC címeknél felülbírálja a 'MAC to "
++"Device Info' szkript (mac-to-devinfo) által visszadott információt."
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "Keresés (ez eltarthat néhány percig)"
++
++msgid "Phone Information"
++msgstr "Telefon információ"
++
++msgid "Phone Scan"
++msgstr "Telefon keresés"
++
++msgid "Phone Scanning Configuration"
++msgstr "Telefon keresési beállítások"
++
++msgid "Phones"
++msgstr "Telefonok"
++
++msgid "Ports"
++msgstr "Portok"
++
++msgid "Raw"
++msgstr "Nyers"
++
++msgid "Repeat Count"
++msgstr "Ismétlés száma"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "Keresés megismétlése (ez eltarthat néhány percig)"
++
++msgid "SIP Device Information"
++msgstr "SIP eszköz információ"
++
++msgid "SIP Device Scan"
++msgstr "SIP eszközök keresése"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "SIP eszköz keresés beállításai"
++
++msgid "SIP Devices on Network"
++msgstr "SIP eszközök a hálózatban"
++
++msgid "SIP devices discovered for"
++msgstr "Megtalált SIP eszközök ehhez:"
++
++msgid "Scan for devices on specified networks."
++msgstr "Eszközök keresése a megadott hálózatokban."
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr "Támogatott SIP eszközök keresése a megadott hálózatokban."
++
++msgid "Scanning Configuration"
++msgstr "Keresési beállítások"
++
++msgid "Scans for devices on specified networks."
++msgstr "Scans for devices on specified networks."
++
++msgid "Sleep Between Requests"
++msgstr "Kérések közötti szünet"
++
++msgid "Subnet"
++msgstr "Alhálózat"
++
++msgid "This section contains no values yet"
++msgstr "Ez a rész még nem tartlamaz értékeket"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Várakozási idő a válasz beérkezésére (alapértelemezés: 10)"
++
++msgid "Timeout"
++msgstr "Várakozási idő"
++
++msgid "Use Configuration"
++msgstr "Beállítás használata"
++
++msgid "Vendor"
++msgstr "Gyártó"
++
++msgid "check other networks"
++msgstr "egyéb hálózatok ellenőrzése"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/it/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/it/diag_devinfo.po
+new file mode 100644
+index 0000000..767245c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/it/diag_devinfo.po
+@@ -0,0 +1,221 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-02-09 20:40+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "Azioni"
++
++msgid "Add"
++msgstr "Aggiungi"
++
++msgid "Beginning of MAC address range"
++msgstr "Inizio del campo di indirizzi MAC"
++
++msgid "Config Phone Scan"
++msgstr "Configura Scansione Telefono"
++
++msgid "Configure"
++msgstr "Configura"
++
++msgid "Configure Scans"
++msgstr "Configura Scansioni"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++"Configurare la scansione per i dispositivi su reti specifiche. Diminuendo il "
++"'Timeout', 'Numero Ripetizioni' e/o ''Pausa tra le Richieste' è possibile "
++"aumentare la velocità delle scansioni, ma può anche non riuscire a trovare "
++"alcuni dispositivo."
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++"Configurare la scansione dei dispositivi SIP supportati su reti specifiche. "
++"Diminuendo il 'Timeout', 'Numero ripetizioni' e / o ''Pausa tra le "
++"richieste' è possibile aumentare la velocità delle scansioni, ma può anche "
++"non riuscire a trovare alcuni dispositivo."
++
++msgid "Delete"
++msgstr "Elimina"
++
++msgid "Device Scan Config"
++msgstr "Configura Scansione Periferica"
++
++msgid "Device Type"
++msgstr "Tipo di Periferica"
++
++msgid "Devices discovered for"
++msgstr "Devices discovered for"
++
++msgid "Devices on Network"
++msgstr "Periferiche in Rete"
++
++msgid "Edit"
++msgstr "Modifica"
++
++msgid "Enable"
++msgstr "Attiva"
++
++msgid "End of MAC address range"
++msgstr "Fine intervallo dell' indirizzo MAC"
++
++msgid "Go to relevant configuration page"
++msgstr "Vai alla pagina di configurazione rilevanti"
++
++msgid "IP Address"
++msgstr "Indirizzo IP"
++
++msgid "Interface"
++msgstr "Interfaccia"
++
++msgid "Invalid"
++msgstr "Non valido"
++
++msgid "Link to Device"
++msgstr "Collegamento alla Periferica"
++
++msgid "MAC Address"
++msgstr "Indirizzo MAC"
++
++msgid "MAC Device Info Overrides"
++msgstr "Informazioni su Sostituzioni della Periferica MAC"
++
++msgid "MAC Device Override"
++msgstr "Sostituzione del MAC del dispositivo"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++"La gamma e le informazioni MAC utilizzate per eseguire la sostituzione dei "
++"database di sistema e IEEE"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "Millisecondi di attesa tra le richieste (predefinito: 100)"
++
++msgid "Model"
++msgstr "Modello"
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Network Device Scan"
++msgstr "Dispositivo Scansione della Rete"
++
++msgid "Network Device Scanning Configuration"
++msgstr "Configurazione Dispositivo di Scansione della Rete"
++
++msgid "Networks to scan for devices"
++msgstr "Reti da scandire per i dispositivi"
++
++msgid "Networks to scan for supported devices"
++msgstr "Reti da scandire per i dispositivi supportati"
++
++msgid "No SIP devices"
++msgstr "Nessun dispositivo SIP"
++
++msgid "No devices detected"
++msgstr "Nessun dispositivo rilevato"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "Numero di volte delle richieste da inviare (predefinito: 1)"
++
++msgid "OUI Owner"
++msgstr "Proprietario OUI"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++"Ignora le informazioni restituite dal MAC su Script per le Informazioni sul "
++"dispositivo (mac-in-devinfo) per un determinato intervallo di indirizzi MAC"
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "Rilevamento (richiede alcuni minuti)"
++
++msgid "Phone Information"
++msgstr "Informazione Telefono"
++
++msgid "Phone Scan"
++msgstr "Rilevamento Telefono"
++
++msgid "Phone Scanning Configuration"
++msgstr "Configurazione Rilevamento Telefono"
++
++msgid "Phones"
++msgstr "Telefoni"
++
++msgid "Ports"
++msgstr "Porte"
++
++msgid "Raw"
++msgstr "Raw"
++
++msgid "Repeat Count"
++msgstr "Ripetizione Conteggio"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "Ripetizione Rilevamento (richiede alcuni minuti)"
++
++msgid "SIP Device Information"
++msgstr "Informazioni Periferica SIP"
++
++msgid "SIP Device Scan"
++msgstr "Rilevamento Periferica SIP"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "Configurazione Rilevamento Periferica SIP"
++
++msgid "SIP Devices on Network"
++msgstr "Periferiche SIP in Rete"
++
++msgid "SIP devices discovered for"
++msgstr "Periferiche SIP rilevate per"
++
++msgid "Scan for devices on specified networks."
++msgstr "Rilevamento per periferiche su reti specificate."
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr "Rilevamento per periferiche SIP supportate sulle reti specificate."
++
++msgid "Scanning Configuration"
++msgstr "Configurazione Rilevamento"
++
++msgid "Scans for devices on specified networks."
++msgstr "Rilevamento periferiche sulle reti specificate."
++
++msgid "Sleep Between Requests"
++msgstr "Attendi tra le richieste"
++
++msgid "Subnet"
++msgstr "Sottorete"
++
++msgid "This section contains no values yet"
++msgstr "Questa sezione non contiene ancora valori"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Tempo di attesa per le risposte in secondi (predefinito: 10)"
++
++msgid "Timeout"
++msgstr "Timeout"
++
++msgid "Use Configuration"
++msgstr "Usa Configurazione"
++
++msgid "Vendor"
++msgstr "Produttore"
++
++msgid "check other networks"
++msgstr "Controlla altre reti"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/ja/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/ja/diag_devinfo.po
+new file mode 100644
+index 0000000..1ef3dad
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/ja/diag_devinfo.po
+@@ -0,0 +1,209 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-19 07:59+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: none\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: Pootle 2.0.4\n"
++
++msgid "Actions"
++msgstr ""
++
++msgid "Add"
++msgstr "追加"
++
++msgid "Beginning of MAC address range"
++msgstr ""
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr "設定"
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr "削除"
++
++msgid "Device Scan Config"
++msgstr "デãƒã‚¤ã‚¹ã‚¹ã‚­ãƒ£ãƒ³è¨­å®š"
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr ""
++
++msgid "Devices on Network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã®ãƒ‡ãƒã‚¤ã‚¹"
++
++msgid "Edit"
++msgstr "編集"
++
++msgid "Enable"
++msgstr "有効"
++
++msgid "End of MAC address range"
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr "IPアドレス"
++
++msgid "Interface"
++msgstr "インターフェース"
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Link to Device"
++msgstr ""
++
++msgid "MAC Address"
++msgstr "MACアドレス"
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "リクエスト間ã®ã‚¹ãƒªãƒ¼ãƒ—時間 (å˜ä½:ミリ秒, 標準設定:100)"
++
++msgid "Model"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr "SIPデãƒã‚¤ã‚¹ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
++
++msgid "No devices detected"
++msgstr "デãƒã‚¤ã‚¹ã¯æ¤œå‡ºã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "リクエストé€ä¿¡å›žæ•° (標準設定:1)"
++
++msgid "OUI Owner"
++msgstr ""
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr ""
++
++msgid "Phone Scan"
++msgstr ""
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr "電話"
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr "リピート回数"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr "SIPデãƒã‚¤ã‚¹æƒ…å ±"
++
++msgid "SIP Device Scan"
++msgstr "SIPデãƒã‚¤ã‚¹ã®ã‚¹ã‚­ãƒ£ãƒ³"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "SIPデãƒã‚¤ã‚¹ã‚¹ã‚­ãƒ£ãƒ³è¨­å®š"
++
++msgid "SIP Devices on Network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã®SIPデãƒã‚¤ã‚¹"
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr "リクエスト間ã®ã‚¹ãƒªãƒ¼ãƒ—時間"
++
++msgid "Subnet"
++msgstr "サブãƒãƒƒãƒˆ"
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "応答待ã¡æ™‚é–“ (å˜ä½:秒, 標準設定:10)"
++
++msgid "Timeout"
++msgstr "タイムアウト"
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/ms/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/ms/diag_devinfo.po
+new file mode 100644
+index 0000000..27d2b46
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/ms/diag_devinfo.po
+@@ -0,0 +1,205 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Actions"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Beginning of MAC address range"
++msgstr ""
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr ""
++
++msgid "Device Scan Config"
++msgstr ""
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr "Devices discovered for"
++
++msgid "Devices on Network"
++msgstr ""
++
++msgid "Edit"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "End of MAC address range"
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Link to Device"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr ""
++
++msgid "No devices detected"
++msgstr ""
++
++msgid "Number of times to send requests (default 1)"
++msgstr ""
++
++msgid "OUI Owner"
++msgstr ""
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr ""
++
++msgid "Phone Scan"
++msgstr ""
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr ""
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr ""
++
++msgid "SIP Device Scan"
++msgstr ""
++
++msgid "SIP Device Scanning Configuration"
++msgstr ""
++
++msgid "SIP Devices on Network"
++msgstr ""
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr ""
++
++msgid "Subnet"
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr ""
++
++msgid "Timeout"
++msgstr ""
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/no/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/no/diag_devinfo.po
+new file mode 100644
+index 0000000..4ada96b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/no/diag_devinfo.po
+@@ -0,0 +1,213 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Actions"
++msgstr "Handlinger"
++
++msgid "Add"
++msgstr "Legg til"
++
++msgid "Beginning of MAC address range"
++msgstr "Begynnelsen av MAC adresseområde"
++
++msgid "Config Phone Scan"
++msgstr "Konfigurer Telefon Skanning"
++
++msgid "Configure"
++msgstr "Konfigurer"
++
++msgid "Configure Scans"
++msgstr "Konfigurer Skanning"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++"Konfigurer skanning etter enheter på angitte nettverk. Ved å minske verdiene "
++"til 'Tidsavbrudd', 'Gjentagelser' og/eller Tid mellom forespørsler blir "
++"skanningen utført raskere, men det kan også medføre at noen enheter ikke "
++"blir funnet."
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++"Konfigurer skanning etter støttede SIP enheter på angitte nettverk. Ved å "
++"minske verdiene til 'Tidsavbrudd', 'Gjentagelser' og/eller tid mellom "
++"forespørsler blir skanningen utført raskere, men det kan også medføre at "
++"noen enheter ikke blir funnet."
++
++msgid "Delete"
++msgstr "Slett"
++
++msgid "Device Scan Config"
++msgstr "Enhets skann konfigurasjon"
++
++msgid "Device Type"
++msgstr "Enhets type"
++
++msgid "Devices discovered for"
++msgstr "Enheter oppdaget for"
++
++msgid "Devices on Network"
++msgstr "Enheter i Nettverket"
++
++msgid "Edit"
++msgstr "Rediger"
++
++msgid "Enable"
++msgstr "Aktiver"
++
++msgid "End of MAC address range"
++msgstr "Slutten av MAC område"
++
++msgid "Go to relevant configuration page"
++msgstr "GÃ¥ til relevant konfigurasjons side"
++
++msgid "IP Address"
++msgstr "IP Adresse"
++
++msgid "Interface"
++msgstr "Grensesnitt"
++
++msgid "Invalid"
++msgstr "Ugyldig"
++
++msgid "Link to Device"
++msgstr "Link til Enhet"
++
++msgid "MAC Address"
++msgstr "MAC Adresse"
++
++msgid "MAC Device Info Overrides"
++msgstr "MAC Enhets Info Overstyring"
++
++msgid "MAC Device Override"
++msgstr "MAC Enhets Overstyring"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++"MAC område og informasjon brukt til å overstyre system og IEEE databaser"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "Antall millisekunder ventetid mellom forespørsler (standard 100)"
++
++msgid "Model"
++msgstr "Modell"
++
++msgid "Name"
++msgstr "Navn"
++
++msgid "Network Device Scan"
++msgstr "Nettverks Enhets Skanning"
++
++msgid "Network Device Scanning Configuration"
++msgstr "Nettverks Enhets Skanning Konfigurasjon"
++
++msgid "Networks to scan for devices"
++msgstr "Nettverk som blir skannet"
++
++msgid "Networks to scan for supported devices"
++msgstr "Nettverk som blir skannet for støttede enheter"
++
++msgid "No SIP devices"
++msgstr "Ingen SIP enheter"
++
++msgid "No devices detected"
++msgstr "Ingen enheter oppdaget"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "Antall ganger å sende forespørsel (standard 1)"
++
++msgid "OUI Owner"
++msgstr "OUI Eier"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++"Overstyr informasjonen hentet fra MAC til enhets info skriptet (mac-til-"
++"devinfo) for et gitt område med MAC adresser"
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "Utfør Skanning (dette kan ta noen minutter)"
++
++msgid "Phone Information"
++msgstr "Telefon Informasjon"
++
++msgid "Phone Scan"
++msgstr "Telefon skanning"
++
++msgid "Phone Scanning Configuration"
++msgstr "Telefon skanning konfigurasjon"
++
++msgid "Phones"
++msgstr "Telefoner"
++
++msgid "Ports"
++msgstr "Porter"
++
++msgid "Raw"
++msgstr "RÃ¥"
++
++msgid "Repeat Count"
++msgstr "Gjentagelser"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "Gjennta Skanning (dette kan ta noen minutter)"
++
++msgid "SIP Device Information"
++msgstr "SIP Enhets Informasjon"
++
++msgid "SIP Device Scan"
++msgstr "SIP Enhets Skanning"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "SIP Enhets Skann Konfigurasjon"
++
++msgid "SIP Devices on Network"
++msgstr "SIP Enheter i Nettverket"
++
++msgid "SIP devices discovered for"
++msgstr "SIP enheter oppdaget på"
++
++msgid "Scan for devices on specified networks."
++msgstr "Skann etter enheter på spesifiserte nettverk"
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr "Skann etter SIP enheter på spesifiserte nettverk"
++
++msgid "Scanning Configuration"
++msgstr "Skanning Konfigurasjon"
++
++msgid "Scans for devices on specified networks."
++msgstr "Nettverks Skanning Informasjon"
++
++msgid "Sleep Between Requests"
++msgstr "Tid mellom forespørsler"
++
++msgid "Subnet"
++msgstr "Subnett"
++
++msgid "This section contains no values yet"
++msgstr "Denne seksjonen inneholder ennå ingen verdier"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Tid for å vente på svar i sekunder (standard 10)"
++
++msgid "Timeout"
++msgstr "Tidsavbrudd"
++
++msgid "Use Configuration"
++msgstr "Bruk Konfigurasjonen"
++
++msgid "Vendor"
++msgstr "Leverandør"
++
++msgid "check other networks"
++msgstr "skjekk andre nettverk"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/pl/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/pl/diag_devinfo.po
+new file mode 100644
+index 0000000..32ccdce
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/pl/diag_devinfo.po
+@@ -0,0 +1,222 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-10-11 13:44+0200\n"
++"Last-Translator: mesiu84 <kmesek84@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "Akcje"
++
++msgid "Add"
++msgstr "Dodaj"
++
++msgid "Beginning of MAC address range"
++msgstr "Początek zakresu MAC adresów"
++
++msgid "Config Phone Scan"
++msgstr "Konfiguruj skanowanie telefonów"
++
++msgid "Configure"
++msgstr "Konfiguruj"
++
++msgid "Configure Scans"
++msgstr "Konfiguruj skany"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++"Konfiguruj skanowanie dla urządzeń w wybranych sieciach. Zmniejszanie "
++"\"Limitu czasu\", \"Liczby powtórzeń\" i/lub \"Oczekiwania między żądaniami"
++"\" może przyspieszyć skany, ale może też uniemożliwić wykrycie niektórych "
++"urządzeń."
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++"Konfiguruj skanowanie dla wspieranych urządzeń SIP w wybranych sieciach. "
++"Zmniejszanie \"Limitu czasu\", \"Liczby powtórzeń\" i/lub \"Oczekiwania "
++"między żądaniami\" może przyspieszyć skany, ale może też uniemożliwić "
++"wykrycie niektórych urządzeń."
++
++msgid "Delete"
++msgstr "Usuń"
++
++msgid "Device Scan Config"
++msgstr "Konfiguruj skanowanie urządzeń"
++
++msgid "Device Type"
++msgstr "Typ urzÄ…dzenia"
++
++msgid "Devices discovered for"
++msgstr "Devices discovered for"
++
++msgid "Devices on Network"
++msgstr "UrzÄ…dzenia w sieci"
++
++msgid "Edit"
++msgstr "Edytuj"
++
++msgid "Enable"
++msgstr "WÅ‚Ä…cz"
++
++msgid "End of MAC address range"
++msgstr "Koniec zakresu adresów MAC"
++
++msgid "Go to relevant configuration page"
++msgstr "Idź do stosownej strony konfiguracyjnej"
++
++msgid "IP Address"
++msgstr "Adres IP"
++
++msgid "Interface"
++msgstr "Interfejs"
++
++msgid "Invalid"
++msgstr "Nieprawidłowe"
++
++msgid "Link to Device"
++msgstr "Połączenie do urządzenia"
++
++msgid "MAC Address"
++msgstr "Adres MAC"
++
++msgid "MAC Device Info Overrides"
++msgstr "Nadpisywanie informacji o adresie MAC urzÄ…dzenia"
++
++msgid "MAC Device Override"
++msgstr "Pomijanie adresu MAC urzÄ…dzenia"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++"Zakres adresów MAC i informacje użyte do zastąpienia baz danych systemowych "
++"i IEEE"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "Ilośś milisekund pauzy pomiędzy zapytaniami (domyślnie 100)"
++
++msgid "Model"
++msgstr "Model"
++
++msgid "Name"
++msgstr "Nazwa"
++
++msgid "Network Device Scan"
++msgstr "Skan urządzeń w sieci"
++
++msgid "Network Device Scanning Configuration"
++msgstr "Ustawienia skanowania urządzeń w sieci"
++
++msgid "Networks to scan for devices"
++msgstr "Sieci do skanowania w poszukiwaniu urządzeń"
++
++msgid "Networks to scan for supported devices"
++msgstr "Sieci do skanowania w poszukiwaniu wspieranych urządzeń"
++
++msgid "No SIP devices"
++msgstr "Brak urządzeń SIP"
++
++msgid "No devices detected"
++msgstr "Nie wykryto urządzeń"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "Ilość powtórzeń wysłania żądania (domyślnie 1)"
++
++msgid "OUI Owner"
++msgstr "Właściciel OUI"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++"ZastÄ…p informacje zwracanych przez skrypt MAC to Device Info Script (MAC-to-"
++"devinfo) dla określonego zakresu adresów MAC"
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "Wykonaj skany (to może potrwać kilka minut)"
++
++msgid "Phone Information"
++msgstr "Informacje o telefonie"
++
++msgid "Phone Scan"
++msgstr "Skanowanie telefonów"
++
++msgid "Phone Scanning Configuration"
++msgstr "Konfiguracja skanowania telefonu"
++
++msgid "Phones"
++msgstr "Telefony"
++
++msgid "Ports"
++msgstr "Porty"
++
++msgid "Raw"
++msgstr "Surowe"
++
++msgid "Repeat Count"
++msgstr "Ilość powtórzeń"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "Powtórz skany (to może potrwać kilka minut)"
++
++msgid "SIP Device Information"
++msgstr "Informacje o urzÄ…dzeniu SIP"
++
++msgid "SIP Device Scan"
++msgstr "Skanowanie urządzeń SIP"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "Konfiguracja skanowania urządzeń SIP"
++
++msgid "SIP Devices on Network"
++msgstr "UrzÄ…dzenia SIP w sieci"
++
++msgid "SIP devices discovered for"
++msgstr "UrzÄ…dzenia SIP znalezione dla"
++
++msgid "Scan for devices on specified networks."
++msgstr "Skanuj w poszukiwaniu urządzeń w wybranych sieciach."
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr "Skanuj w poszukiwaniu wspieranych urządzeń SIP w wybranych sieciach."
++
++msgid "Scanning Configuration"
++msgstr "Ustawienia skanowania"
++
++msgid "Scans for devices on specified networks."
++msgstr "Scans for devices on specified networks."
++
++msgid "Sleep Between Requests"
++msgstr "Pauza pomiędzy zapytaniami"
++
++msgid "Subnet"
++msgstr "Podsieć"
++
++msgid "This section contains no values yet"
++msgstr "Ta sekcja nie zawiera jeszcze wartości"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Czas oczekiwania na odpowiedź w sekundach (domyślnie 10)"
++
++msgid "Timeout"
++msgstr "Czas oczekiwania"
++
++msgid "Use Configuration"
++msgstr "Użyj konfiguracji"
++
++msgid "Vendor"
++msgstr "Sprzedawca"
++
++msgid "check other networks"
++msgstr "sprawdź inne sieci"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/pt-br/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/pt-br/diag_devinfo.po
+new file mode 100644
+index 0000000..53face0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/pt-br/diag_devinfo.po
+@@ -0,0 +1,220 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-17 23:51+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Actions"
++msgstr "Ações"
++
++msgid "Add"
++msgstr "Adicionar"
++
++msgid "Beginning of MAC address range"
++msgstr "Começo da faixa de endereços MAC"
++
++msgid "Config Phone Scan"
++msgstr "Configurar a Busca por Telefone"
++
++msgid "Configure"
++msgstr "Configurar"
++
++msgid "Configure Scans"
++msgstr "Configurar Scans"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++"Configura busca por dispositivos em redes específicas. Ao se reduzir "
++"'Timeout', 'Repeat Count' e/ou 'Sleep Between Requests' pode-se agilizar "
++"buscas, mas também pode não encontrar alguns dispositivos."
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++"Configura busca por dispositivos com suporte a SIP em redes específicas. Ao "
++"se reduzir 'Timeout', 'Repeat Count' e/ou 'Sleep Between Requests' pode-se "
++"agilizar buscas, mas também pode não encontrar alguns dispositivos."
++
++msgid "Delete"
++msgstr "Apagar"
++
++msgid "Device Scan Config"
++msgstr "Configurar a Busca por Dispositivos"
++
++msgid "Device Type"
++msgstr "Tipo de dispositivo"
++
++msgid "Devices discovered for"
++msgstr "Dispositivos descobertos para"
++
++msgid "Devices on Network"
++msgstr "Dispositivos na Rede"
++
++msgid "Edit"
++msgstr "Editar"
++
++msgid "Enable"
++msgstr "Habilitar"
++
++msgid "End of MAC address range"
++msgstr "Final da faixa de endereços MAC"
++
++msgid "Go to relevant configuration page"
++msgstr "Vá para página de configuração relevante"
++
++msgid "IP Address"
++msgstr "Endereço IP"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Invalid"
++msgstr "Inválido"
++
++# Link like <a> or network link?
++msgid "Link to Device"
++msgstr "Ligar ao Dispositivo"
++
++msgid "MAC Address"
++msgstr "Endereço MAC"
++
++msgid "MAC Device Info Overrides"
++msgstr "Sobrescrição da informação do dispositivo MAC"
++
++msgid "MAC Device Override"
++msgstr "Sobrescreve o Dispositivo MAC"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++"Faixa MAC e informação usada para sobrescrever os bancos de dados do sistema "
++"e IEEE"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "Milissegundos para esperar entre requisições (padrão 100)"
++
++msgid "Model"
++msgstr "Modelo"
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Network Device Scan"
++msgstr "Busca por dispositivo de rede"
++
++msgid "Network Device Scanning Configuration"
++msgstr "Configuração de busca por dispositivo de rede"
++
++msgid "Networks to scan for devices"
++msgstr "Redes a serem pesquisadas por dispositivos"
++
++msgid "Networks to scan for supported devices"
++msgstr "Redes a serem pesquisadas por dispositivos suportados"
++
++msgid "No SIP devices"
++msgstr "Nenhum dispositivo SIP"
++
++msgid "No devices detected"
++msgstr "Nenhum dispositivo detectado"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "Número de vezes para enviar requisições (padrão 1 )"
++
++msgid "OUI Owner"
++msgstr "Dono da OUI"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++"Sobrescrever a informação retornada pelo MAC para o Script de Informação do "
++"Dispositivo (mac-to_devinfo) para uma faixa especificada de Endereços MAC"
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "Realiza buscas (pode levar alguns minutos)"
++
++msgid "Phone Information"
++msgstr "Informação do Telefone"
++
++msgid "Phone Scan"
++msgstr "Busca por Telefone"
++
++msgid "Phone Scanning Configuration"
++msgstr "Configuração da Busca por Telefone"
++
++msgid "Phones"
++msgstr "Telefones"
++
++msgid "Ports"
++msgstr "Portas"
++
++msgid "Raw"
++msgstr "Bruto"
++
++msgid "Repeat Count"
++msgstr "Quantidade de Repetições"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "Buscas Repetidas (pode levar alguns minutos)"
++
++msgid "SIP Device Information"
++msgstr "Informação de Dispositivo SIP"
++
++msgid "SIP Device Scan"
++msgstr "Busca por Dispositivos SIP"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "Configuração da Busca por Dispositivos SIP"
++
++msgid "SIP Devices on Network"
++msgstr "Dispositivos SIP na Rede"
++
++msgid "SIP devices discovered for"
++msgstr "Dispositivos SIP descobertos para"
++
++msgid "Scan for devices on specified networks."
++msgstr "Busca por dispositivos nas redes especificadas."
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr "Busca por dispositivos com suporte a SIP em redes especificadas."
++
++msgid "Scanning Configuration"
++msgstr "Configuração de busca"
++
++msgid "Scans for devices on specified networks."
++msgstr "Busca por dispositivos nas redes especificadas."
++
++msgid "Sleep Between Requests"
++msgstr "Espera Entre Requisições"
++
++msgid "Subnet"
++msgstr "Subrede"
++
++msgid "This section contains no values yet"
++msgstr "Esta seção contém nenhum valor ainda"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Tempo para esperar por respostas em segundos (padrão 10)"
++
++msgid "Timeout"
++msgstr "Estouro de tempo"
++
++msgid "Use Configuration"
++msgstr "Usar configuração"
++
++msgid "Vendor"
++msgstr "Fabricante"
++
++msgid "check other networks"
++msgstr "verifique outras redes"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/pt/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/pt/diag_devinfo.po
+new file mode 100644
+index 0000000..afe4885
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/pt/diag_devinfo.po
+@@ -0,0 +1,209 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-06-03 12:23+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "Acções"
++
++msgid "Add"
++msgstr "Adicionar"
++
++msgid "Beginning of MAC address range"
++msgstr "Inicio da gama de endereços MAC"
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr "Configurar"
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr "Apagar"
++
++msgid "Device Scan Config"
++msgstr ""
++
++msgid "Device Type"
++msgstr "Tipo de Dispositivo"
++
++msgid "Devices discovered for"
++msgstr "Dispositivos descobertos para"
++
++msgid "Devices on Network"
++msgstr "Dispositivos na Rede"
++
++msgid "Edit"
++msgstr "Editar"
++
++msgid "Enable"
++msgstr "Ativar"
++
++msgid "End of MAC address range"
++msgstr "Fim da gama de endereços MAC"
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr "Endereço IP"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Invalid"
++msgstr "Inválido"
++
++msgid "Link to Device"
++msgstr ""
++
++msgid "MAC Address"
++msgstr "Endereço MAC"
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++
++msgid "Model"
++msgstr "Modelo"
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr "Não há dispositivos SIP"
++
++msgid "No devices detected"
++msgstr "Não foram detetados dispositivos"
++
++msgid "Number of times to send requests (default 1)"
++msgstr ""
++
++msgid "OUI Owner"
++msgstr "Dono OUI"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr "Informação do Telefone"
++
++msgid "Phone Scan"
++msgstr ""
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr ""
++
++msgid "Ports"
++msgstr "Portas"
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr "Repetir Contagem"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr ""
++
++msgid "SIP Device Scan"
++msgstr ""
++
++msgid "SIP Device Scanning Configuration"
++msgstr ""
++
++msgid "SIP Devices on Network"
++msgstr ""
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr ""
++
++msgid "Subnet"
++msgstr "Sub-rede"
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr ""
++
++msgid "Timeout"
++msgstr ""
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr "verificar outras redes"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/ro/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/ro/diag_devinfo.po
+new file mode 100644
+index 0000000..eefbd5e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/ro/diag_devinfo.po
+@@ -0,0 +1,210 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-09 14:27+0200\n"
++"Last-Translator: lex404 <alex.qwq@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "Acțiuni"
++
++msgid "Add"
++msgstr "Adauga"
++
++msgid "Beginning of MAC address range"
++msgstr ""
++
++msgid "Config Phone Scan"
++msgstr "Configureaza scanarea telefonului"
++
++msgid "Configure"
++msgstr "Configureaza"
++
++msgid "Configure Scans"
++msgstr "Configurează scanări"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr "Sterge"
++
++msgid "Device Scan Config"
++msgstr "Configureaza scanarea dispozitivului"
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr "Dispozitive descoperite pentru"
++
++msgid "Devices on Network"
++msgstr "Dispozitive in retea"
++
++msgid "Edit"
++msgstr "Editeaza"
++
++msgid "Enable"
++msgstr "Activeaza"
++
++msgid "End of MAC address range"
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr "Adresa IP"
++
++msgid "Interface"
++msgstr "Interfata"
++
++msgid "Invalid"
++msgstr "Invalid"
++
++msgid "Link to Device"
++msgstr "Legatura spre dispozitiv"
++
++msgid "MAC Address"
++msgstr "Adresa MAC"
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "Milisecunde de asteptare intre cereri (100 implicit)"
++
++msgid "Model"
++msgstr ""
++
++msgid "Name"
++msgstr "Nume"
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr "Nici un device SIP"
++
++msgid "No devices detected"
++msgstr "Nici un dispozitiv detectat"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "Numarul de trimiteri cereri (1 implicit)"
++
++msgid "OUI Owner"
++msgstr ""
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr "Informatii despre telefon"
++
++msgid "Phone Scan"
++msgstr "Scanare telefon"
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr "Telefoane"
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr "Numarul de repetitii"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr "Informatii despre dispozitivul SIP"
++
++msgid "SIP Device Scan"
++msgstr "Scanare dispozitiv SIP"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "Configurarea scanarii dispozitivului SIP"
++
++msgid "SIP Devices on Network"
++msgstr "Dispozitive SIP in retea"
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr "Pauza dintre cereri"
++
++msgid "Subnet"
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Timpul de asteptare pentru raspunsuri in secunde (10 implicit)"
++
++msgid "Timeout"
++msgstr ""
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr "verifica alte retele"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/ru/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/ru/diag_devinfo.po
+new file mode 100644
+index 0000000..7531dde
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/ru/diag_devinfo.po
+@@ -0,0 +1,223 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: diag_devinfo\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2014-01-31 21:07+0200\n"
++"Last-Translator: Moon_dark <lenayxa@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Actions"
++msgstr "ДейÑтвиÑ"
++
++msgid "Add"
++msgstr "Добавить"
++
++msgid "Beginning of MAC address range"
++msgstr "Ðачало диапазона MAC-адреÑов"
++
++msgid "Config Phone Scan"
++msgstr "ÐаÑтроить Ñканирование телефонов"
++
++msgid "Configure"
++msgstr "ÐаÑтроить"
++
++msgid "Configure Scans"
++msgstr "ÐаÑтроить Ñканирование"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++"ÐаÑтроить Ñканирование уÑтройÑтв в указанных ÑетÑÑ…. Уменьшение таймаута, "
++"количеÑтва повторов и/или паузы между запроÑами может уÑкорить Ñканирование, "
++"но также вызвать проблемы поиÑка некоторых уÑтройÑтв."
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++"ÐаÑтроить Ñканирование поддерживаемых SIP-уÑтройÑтв в указанных ÑетÑÑ…. "
++"Уменьшение таймаута, количеÑтва повторов и/или паузы между запроÑами может "
++"уÑкорить Ñканирование, но также вызвать проблемы поиÑка некоторых уÑтройÑтв."
++
++msgid "Delete"
++msgstr "Удалить"
++
++msgid "Device Scan Config"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÑтройÑтва"
++
++msgid "Device Type"
++msgstr "Тип уÑтройÑтва"
++
++msgid "Devices discovered for"
++msgstr "УÑтройÑтва, найденные в"
++
++msgid "Devices on Network"
++msgstr "УÑтройÑтва в Ñети"
++
++msgid "Edit"
++msgstr "Редактировать"
++
++msgid "Enable"
++msgstr "Включить"
++
++msgid "End of MAC address range"
++msgstr "Конец диапазона MAC адреÑов"
++
++msgid "Go to relevant configuration page"
++msgstr "Перейти на ÑоответÑтвующую Ñтраницу конфигурации"
++
++msgid "IP Address"
++msgstr "IP-адреÑ"
++
++msgid "Interface"
++msgstr "ИнтерфейÑ"
++
++msgid "Invalid"
++msgstr "Ðеверный"
++
++msgid "Link to Device"
++msgstr "Соединение Ñ ÑƒÑтройÑтвом"
++
++msgid "MAC Address"
++msgstr "MAC-адреÑ"
++
++#, fuzzy
++msgid "MAC Device Info Overrides"
++msgstr "Переопределение информации о MAC-уÑтройÑтве"
++
++msgid "MAC Device Override"
++msgstr "Задать MAC-Ð°Ð´Ñ€ÐµÑ ÑƒÑтройÑтва"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++"Диапазон MAC-адреÑов и Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑиÑтемной базы данных "
++"и базы данных IEEE"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð±ÐµÐ·Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ запроÑами (мÑ, 100 по умолчанию)"
++
++msgid "Model"
++msgstr "Модель"
++
++msgid "Name"
++msgstr "ИмÑ"
++
++msgid "Network Device Scan"
++msgstr "Сканирование Ñетевых уÑтройÑтв"
++
++msgid "Network Device Scanning Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñетевых уÑтройÑтв"
++
++msgid "Networks to scan for devices"
++msgstr "Сети, в которых производить Ñканирование уÑтройÑтв"
++
++msgid "Networks to scan for supported devices"
++msgstr "Сети, в которых производить Ñканирование поддерживаемых уÑтройÑтв"
++
++msgid "No SIP devices"
++msgstr "SIP-уÑтройÑтва отÑутÑтвуют"
++
++msgid "No devices detected"
++msgstr "УÑтройÑтва не обнаружены"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "КоличеÑтво запроÑов (1 по умолчанию)"
++
++msgid "OUI Owner"
++msgstr "Владелец OUI"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++"Переопределить значениÑ, полученные из Ñкрипта \"MAC to Device\" (mac-to-"
++"devinfo), Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ диапазона MAC-адреÑов"
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "ПроизвеÑти Ñканирование (Ñто может занÑÑ‚ÑŒ неÑколько минут)"
++
++msgid "Phone Information"
++msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ телефоне"
++
++msgid "Phone Scan"
++msgstr "Сканировать телефоны"
++
++msgid "Phone Scanning Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐ»ÐµÑ„Ð¾Ð½Ð¾Ð²"
++
++msgid "Phones"
++msgstr "Телефоны"
++
++msgid "Ports"
++msgstr "Порты"
++
++msgid "Raw"
++msgstr "Ðеобработанные (Ñырые) данные"
++
++msgid "Repeat Count"
++msgstr "КоличеÑтво повторов"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "Повторить Ñканирование (Ñто может занÑÑ‚ÑŒ неÑколько минут)"
++
++msgid "SIP Device Information"
++msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ SIP-уÑтройÑтве"
++
++msgid "SIP Device Scan"
++msgstr "Сканировать SIP-уÑтройÑтва"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ SIP-уÑтройÑтв"
++
++msgid "SIP Devices on Network"
++msgstr "SIP-уÑтройÑтва в Ñети"
++
++msgid "SIP devices discovered for"
++msgstr "SIP-уÑтройÑтва, найденные в"
++
++msgid "Scan for devices on specified networks."
++msgstr "Сканировать уÑтройÑтва в заданных ÑетÑÑ…."
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr "Сканировать поддерживаемые SIP-уÑтройÑтва в заданных ÑетÑÑ…."
++
++msgid "Scanning Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑканированиÑ"
++
++msgid "Scans for devices on specified networks."
++msgstr "Сканирует уÑтройÑтва в заданных ÑетÑÑ…."
++
++msgid "Sleep Between Requests"
++msgstr "Пауза между запроÑами"
++
++msgid "Subnet"
++msgstr "ПодÑеть"
++
++msgid "This section contains no values yet"
++msgstr "Эта ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾ÐºÐ° не Ñодержит значений."
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¾Ð² (Ñек, 10 по умолчанию)"
++
++msgid "Timeout"
++msgstr "Таймаут"
++
++msgid "Use Configuration"
++msgstr "ИÑпользовать конфигурацию"
++
++msgid "Vendor"
++msgstr "Производитель"
++
++msgid "check other networks"
++msgstr "проверить другие Ñети"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/sk/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/sk/diag_devinfo.po
+new file mode 100644
+index 0000000..0d62204
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/sk/diag_devinfo.po
+@@ -0,0 +1,206 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Actions"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Beginning of MAC address range"
++msgstr ""
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr ""
++
++msgid "Device Scan Config"
++msgstr ""
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr ""
++
++msgid "Devices on Network"
++msgstr ""
++
++msgid "Edit"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "End of MAC address range"
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Link to Device"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr ""
++
++msgid "No devices detected"
++msgstr ""
++
++msgid "Number of times to send requests (default 1)"
++msgstr ""
++
++msgid "OUI Owner"
++msgstr ""
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr ""
++
++msgid "Phone Scan"
++msgstr ""
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr ""
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr ""
++
++msgid "SIP Device Scan"
++msgstr ""
++
++msgid "SIP Device Scanning Configuration"
++msgstr ""
++
++msgid "SIP Devices on Network"
++msgstr ""
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr ""
++
++msgid "Subnet"
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr ""
++
++msgid "Timeout"
++msgstr ""
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/sv/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/sv/diag_devinfo.po
+new file mode 100644
+index 0000000..cf74fbc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/sv/diag_devinfo.po
+@@ -0,0 +1,207 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Actions"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Beginning of MAC address range"
++msgstr ""
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr ""
++
++msgid "Device Scan Config"
++msgstr ""
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr ""
++
++msgid "Devices on Network"
++msgstr ""
++
++msgid "Edit"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "End of MAC address range"
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Link to Device"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr ""
++
++msgid "No devices detected"
++msgstr ""
++
++msgid "Number of times to send requests (default 1)"
++msgstr ""
++
++msgid "OUI Owner"
++msgstr ""
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr ""
++
++msgid "Phone Scan"
++msgstr ""
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr ""
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr ""
++
++msgid "SIP Device Scan"
++msgstr ""
++
++msgid "SIP Device Scanning Configuration"
++msgstr ""
++
++msgid "SIP Devices on Network"
++msgstr ""
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr ""
++
++msgid "Subnet"
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr ""
++
++msgid "Timeout"
++msgstr ""
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/templates/diag_devinfo.pot b/feeds/luci/applications/luci-app-diag-devinfo/po/templates/diag_devinfo.pot
+new file mode 100644
+index 0000000..350466c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/templates/diag_devinfo.pot
+@@ -0,0 +1,199 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Actions"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Beginning of MAC address range"
++msgstr ""
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr ""
++
++msgid "Device Scan Config"
++msgstr ""
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr ""
++
++msgid "Devices on Network"
++msgstr ""
++
++msgid "Edit"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "End of MAC address range"
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Link to Device"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr ""
++
++msgid "No devices detected"
++msgstr ""
++
++msgid "Number of times to send requests (default 1)"
++msgstr ""
++
++msgid "OUI Owner"
++msgstr ""
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr ""
++
++msgid "Phone Scan"
++msgstr ""
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr ""
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr ""
++
++msgid "SIP Device Scan"
++msgstr ""
++
++msgid "SIP Device Scanning Configuration"
++msgstr ""
++
++msgid "SIP Devices on Network"
++msgstr ""
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr ""
++
++msgid "Subnet"
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr ""
++
++msgid "Timeout"
++msgstr ""
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/tr/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/tr/diag_devinfo.po
+new file mode 100644
+index 0000000..3251675
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/tr/diag_devinfo.po
+@@ -0,0 +1,206 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Actions"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Beginning of MAC address range"
++msgstr ""
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr ""
++
++msgid "Device Scan Config"
++msgstr ""
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr "Devices discovered for"
++
++msgid "Devices on Network"
++msgstr ""
++
++msgid "Edit"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "End of MAC address range"
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Link to Device"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr ""
++
++msgid "No devices detected"
++msgstr ""
++
++msgid "Number of times to send requests (default 1)"
++msgstr ""
++
++msgid "OUI Owner"
++msgstr ""
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr ""
++
++msgid "Phone Scan"
++msgstr ""
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr ""
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr ""
++
++msgid "SIP Device Scan"
++msgstr ""
++
++msgid "SIP Device Scanning Configuration"
++msgstr ""
++
++msgid "SIP Devices on Network"
++msgstr ""
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr ""
++
++msgid "Subnet"
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr ""
++
++msgid "Timeout"
++msgstr ""
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/uk/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/uk/diag_devinfo.po
+new file mode 100644
+index 0000000..03f49eb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/uk/diag_devinfo.po
+@@ -0,0 +1,219 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-13 15:23+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Actions"
++msgstr ""
++
++msgid "Add"
++msgstr "Додати"
++
++msgid "Beginning of MAC address range"
++msgstr ""
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr "КонфігураціÑ"
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr "Вилучити"
++
++msgid "Device Scan Config"
++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ñтрою ÑкануваннÑ"
++
++msgid "Device Type"
++msgstr "Тип приÑтрою"
++
++msgid "Devices discovered for"
++msgstr "ВиÑвленні приÑтрої на"
++
++msgid "Devices on Network"
++msgstr "ПриÑтрої в мережі"
++
++msgid "Edit"
++msgstr "Редагувати"
++
++msgid "Enable"
++msgstr "Ðктивувати"
++
++msgid "End of MAC address range"
++msgstr ""
++
++#, fuzzy
++msgid "Go to relevant configuration page"
++msgstr "Перейти до відповідної Ñторінки конфігурації"
++
++msgid "IP Address"
++msgstr "IP-адреÑа"
++
++msgid "Interface"
++msgstr "ІнтерфейÑ"
++
++msgid "Invalid"
++msgstr "ÐеÑправніÑÑ‚ÑŒ"
++
++msgid "Link to Device"
++msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° приÑтрій"
++
++msgid "MAC Address"
++msgstr "MAC-адреÑа"
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++
++msgid "Model"
++msgstr "Модель"
++
++msgid "Name"
++msgstr "Ðазва"
++
++msgid "Network Device Scan"
++msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶ÐµÐ²Ð¸Ñ… приÑтроїв"
++
++msgid "Network Device Scanning Configuration"
++msgstr "Мережевий ПриÑтрій ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ"
++
++#, fuzzy
++msgid "Networks to scan for devices"
++msgstr "Мережі Ð´Ð»Ñ ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ñтроїв"
++
++#, fuzzy
++msgid "Networks to scan for supported devices"
++msgstr "Мережі Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ підтримуваних приÑтроїв"
++
++msgid "No SIP devices"
++msgstr "Ðемає SIP приÑтроїв"
++
++msgid "No devices detected"
++msgstr ""
++
++msgid "Number of times to send requests (default 1)"
++msgstr ""
++
++msgid "OUI Owner"
++msgstr ""
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr ""
++
++msgid "Phone Scan"
++msgstr ""
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr ""
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr ""
++
++msgid "SIP Device Scan"
++msgstr ""
++
++msgid "SIP Device Scanning Configuration"
++msgstr ""
++
++msgid "SIP Devices on Network"
++msgstr ""
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ"
++
++#, fuzzy
++msgid "Scans for devices on specified networks."
++msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ñтроїв у вказаних мережах."
++
++#, fuzzy
++msgid "Sleep Between Requests"
++msgstr "Сон між запитами"
++
++#, fuzzy
++msgid "Subnet"
++msgstr "Підмережі"
++
++#, fuzzy
++msgid "This section contains no values yet"
++msgstr "Цей розділ ще не міÑтить значень"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ– в Ñекундах (типово 10)"
++
++#, fuzzy
++msgid "Timeout"
++msgstr "Затримка"
++
++#, fuzzy
++msgid "Use Configuration"
++msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ—"
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr "перевірити інші мережі"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/vi/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/vi/diag_devinfo.po
+new file mode 100644
+index 0000000..3251675
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/vi/diag_devinfo.po
+@@ -0,0 +1,206 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Actions"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Beginning of MAC address range"
++msgstr ""
++
++msgid "Config Phone Scan"
++msgstr ""
++
++msgid "Configure"
++msgstr ""
++
++msgid "Configure Scans"
++msgstr ""
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr ""
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++
++msgid "Delete"
++msgstr ""
++
++msgid "Device Scan Config"
++msgstr ""
++
++msgid "Device Type"
++msgstr ""
++
++msgid "Devices discovered for"
++msgstr "Devices discovered for"
++
++msgid "Devices on Network"
++msgstr ""
++
++msgid "Edit"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "End of MAC address range"
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Link to Device"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC Device Info Overrides"
++msgstr ""
++
++msgid "MAC Device Override"
++msgstr ""
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr ""
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Device Scan"
++msgstr ""
++
++msgid "Network Device Scanning Configuration"
++msgstr ""
++
++msgid "Networks to scan for devices"
++msgstr ""
++
++msgid "Networks to scan for supported devices"
++msgstr ""
++
++msgid "No SIP devices"
++msgstr ""
++
++msgid "No devices detected"
++msgstr ""
++
++msgid "Number of times to send requests (default 1)"
++msgstr ""
++
++msgid "OUI Owner"
++msgstr ""
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr ""
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "Phone Information"
++msgstr ""
++
++msgid "Phone Scan"
++msgstr ""
++
++msgid "Phone Scanning Configuration"
++msgstr ""
++
++msgid "Phones"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Raw"
++msgstr ""
++
++msgid "Repeat Count"
++msgstr ""
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr ""
++
++msgid "SIP Device Information"
++msgstr ""
++
++msgid "SIP Device Scan"
++msgstr ""
++
++msgid "SIP Device Scanning Configuration"
++msgstr ""
++
++msgid "SIP Devices on Network"
++msgstr ""
++
++msgid "SIP devices discovered for"
++msgstr ""
++
++msgid "Scan for devices on specified networks."
++msgstr ""
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr ""
++
++msgid "Scanning Configuration"
++msgstr ""
++
++msgid "Scans for devices on specified networks."
++msgstr ""
++
++msgid "Sleep Between Requests"
++msgstr ""
++
++msgid "Subnet"
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr ""
++
++msgid "Timeout"
++msgstr ""
++
++msgid "Use Configuration"
++msgstr ""
++
++msgid "Vendor"
++msgstr ""
++
++msgid "check other networks"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/zh-cn/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/zh-cn/diag_devinfo.po
+new file mode 100644
+index 0000000..fe4d241
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/zh-cn/diag_devinfo.po
+@@ -0,0 +1,210 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-10 05:33+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "动作"
++
++msgid "Add"
++msgstr "添加"
++
++msgid "Beginning of MAC address range"
++msgstr "MAC起始地å€"
++
++msgid "Config Phone Scan"
++msgstr "é…ç½®è¯æœºè¯†åˆ«å‚æ•°"
++
++msgid "Configure"
++msgstr "é…ç½®"
++
++msgid "Configure Scans"
++msgstr "识别å‚æ•°é…ç½®"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr "é…置识别指定网络上设备的过程å‚数。å‡å°'​​超时时长','é‡å¤æ¬¡æ•°',和/或“休眠请求â€å¯åŠ å¿«è¯†åˆ«è¿‡ç¨‹ï¼Œä½†ä¹Ÿå¯èƒ½å› æ­¤å¯¼è‡´è¯†åˆ«ä¸€äº›è®¾å¤‡ä¼šå¤±è´¥ã€‚"
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++"é…置识别指定网络上SIP设备的过程å‚数。é™ä½Ž'​​超时时长','é‡å¤æ¬¡æ•°',和/或“休眠请求â€å¯åŠ å¿«è¯†åˆ«è¿‡ç¨‹ï¼Œä½†ä¹Ÿå¯èƒ½å› æ­¤å¯¼è‡´è¯†åˆ«ä¸€äº›è®¾å¤‡ä¼šå¤±è´¥ã€‚"
++
++msgid "Delete"
++msgstr "删除"
++
++msgid "Device Scan Config"
++msgstr "设备识别å‚æ•°é…ç½®"
++
++msgid "Device Type"
++msgstr "设备类型"
++
++msgid "Devices discovered for"
++msgstr "对å‘现​​的设备"
++
++msgid "Devices on Network"
++msgstr "网络上的设备"
++
++msgid "Edit"
++msgstr "编辑"
++
++msgid "Enable"
++msgstr "å¯ç”¨"
++
++msgid "End of MAC address range"
++msgstr "MAC地å€æ®µç»“æŸ"
++
++msgid "Go to relevant configuration page"
++msgstr "相关é…置页é¢"
++
++msgid "IP Address"
++msgstr "IP地å€"
++
++msgid "Interface"
++msgstr "接å£"
++
++msgid "Invalid"
++msgstr "ä¸åˆæ³•"
++
++msgid "Link to Device"
++msgstr "连接到设备"
++
++msgid "MAC Address"
++msgstr "MAC地å€"
++
++msgid "MAC Device Info Overrides"
++msgstr "覆盖MAC设备信æ¯"
++
++msgid "MAC Device Override"
++msgstr "覆盖MAC设备"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr "MAC范围和使用信æ¯è¦†ç›–系统和IEEEæ•°æ®åº“"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "两次请求间ç¡çœ æ¯«ç§’数(默认为100)"
++
++msgid "Model"
++msgstr "åž‹å·"
++
++msgid "Name"
++msgstr "åå­—"
++
++msgid "Network Device Scan"
++msgstr "识别网络设备"
++
++msgid "Network Device Scanning Configuration"
++msgstr "网络设备识别å‚æ•°"
++
++msgid "Networks to scan for devices"
++msgstr "网络识别设备"
++
++msgid "Networks to scan for supported devices"
++msgstr "网络识别支æŒçš„设备"
++
++msgid "No SIP devices"
++msgstr "无SIP设备"
++
++msgid "No devices detected"
++msgstr "没有识别到设备"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "å‘é€è¯·æ±‚次数(默认为1)"
++
++msgid "OUI Owner"
++msgstr "OUI所有者"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr "返回指定MAC地å€èŒƒå›´å†…覆盖MAC设备信æ¯è„šæœ¬(mac-to-devinfo)çš„ä¿¡æ¯ã€‚"
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "执行识别过程(这å¯èƒ½éœ€è¦å‡ åˆ†é’Ÿï¼‰"
++
++msgid "Phone Information"
++msgstr "è¯æœºä¿¡æ¯"
++
++msgid "Phone Scan"
++msgstr "识别è¯æœº"
++
++msgid "Phone Scanning Configuration"
++msgstr "è¯æœºè¯†åˆ«è¿‡ç¨‹å‚æ•°"
++
++msgid "Phones"
++msgstr "è¯æœº"
++
++msgid "Ports"
++msgstr "端å£"
++
++msgid "Raw"
++msgstr "原始数æ®"
++
++msgid "Repeat Count"
++msgstr "é‡å¤æ¬¡æ•°"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "é‡å¤è¯†åˆ«ï¼ˆè¿™å¯èƒ½éœ€è¦å‡ åˆ†é’Ÿï¼‰"
++
++msgid "SIP Device Information"
++msgstr "SIP设备信æ¯"
++
++msgid "SIP Device Scan"
++msgstr "SIP设备识别"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "SIP设备识别过程å‚æ•°é…ç½®"
++
++msgid "SIP Devices on Network"
++msgstr "在线的SIP设备"
++
++msgid "SIP devices discovered for"
++msgstr "å‘掘SIP设备"
++
++msgid "Scan for devices on specified networks."
++msgstr "在指定网络上识别设备"
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr "在指定网络上识别SIP设备"
++
++msgid "Scanning Configuration"
++msgstr "识别过程é…ç½®"
++
++msgid "Scans for devices on specified networks."
++msgstr "识别指定网络上的设备"
++
++msgid "Sleep Between Requests"
++msgstr "请求间等待间隙"
++
++msgid "Subnet"
++msgstr "å­ç½‘"
++
++msgid "This section contains no values yet"
++msgstr "这部分任然ä¸åŒ…å«çš„值"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "等待å“应秒数(默认10)"
++
++msgid "Timeout"
++msgstr "超时"
++
++msgid "Use Configuration"
++msgstr "使用é…ç½®"
++
++msgid "Vendor"
++msgstr "厂商"
++
++msgid "check other networks"
++msgstr "检查其他网络"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/zh-tw/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/zh-tw/diag_devinfo.po
+new file mode 100644
+index 0000000..fe14f68
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/zh-tw/diag_devinfo.po
+@@ -0,0 +1,210 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 14:54+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Actions"
++msgstr "æ“作"
++
++msgid "Add"
++msgstr "新增"
++
++msgid "Beginning of MAC address range"
++msgstr "MACä½å€èµ·å§‹ç¯„åœ"
++
++msgid "Config Phone Scan"
++msgstr "設定電話掃æ"
++
++msgid "Configure"
++msgstr "設置"
++
++msgid "Configure Scans"
++msgstr "掃æ設置"
++
++msgid ""
++"Configure scanning for devices on specified networks. Decreasing 'Timeout', "
++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also "
++"may fail to find some devices."
++msgstr "é‡å°ç‰¹å®šç¶²è·¯çš„掃æ設定值. 增加\"超時\",\"é‡è¤‡æ•¸é‡,\"並且/或者\"傳到ç¡è‘—者\"å¯ä»¥åŠ é€ŸæŽƒæ, 但也有å¯èƒ½å°‡è¦åŽ»æœå°‹æŸäº›è¨­å‚™æ™‚會失敗."
++
++msgid ""
++"Configure scanning for supported SIP devices on specified networks. "
++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may "
++"speed up scans, but also may fail to find some devices."
++msgstr ""
++"å°æŒ‡å®šçš„網路上已支æ´çš„SIP設備設定掃æ,減少\"超時\",\"é‡è¤‡æ•¸é‡,\"並且/或者\"傳到ç¡è‘—者\"å¯ä»¥åŠ é€Ÿæ, 但也有å¯èƒ½å°‡è¦åŽ»æœå°‹æŸäº›è¨­å‚™æ™‚會失敗."
++
++msgid "Delete"
++msgstr "刪除"
++
++msgid "Device Scan Config"
++msgstr "設備掃æ設定"
++
++msgid "Device Type"
++msgstr "設備型態"
++
++msgid "Devices discovered for"
++msgstr "已發ç¾çš„設備為"
++
++msgid "Devices on Network"
++msgstr "網路中的設備"
++
++msgid "Edit"
++msgstr "編輯"
++
++msgid "Enable"
++msgstr "啟用"
++
++msgid "End of MAC address range"
++msgstr "MACä½å€çš„çµæŸç¯„åœ"
++
++msgid "Go to relevant configuration page"
++msgstr "到相應的設定é é¢"
++
++msgid "IP Address"
++msgstr "IPä½å€"
++
++msgid "Interface"
++msgstr "介é¢"
++
++msgid "Invalid"
++msgstr "無效"
++
++msgid "Link to Device"
++msgstr "連çµåˆ°è¨­å‚™ä¸Š"
++
++msgid "MAC Address"
++msgstr "MACä½å€"
++
++msgid "MAC Device Info Overrides"
++msgstr "MAC設備資訊覆寫"
++
++msgid "MAC Device Override"
++msgstr "MAC設備覆寫"
++
++msgid "MAC range and information used to override system and IEEE databases"
++msgstr "MAC範åœåŠè³‡è¨Šç”¨ä¾†è¦†å¯«ç³»çµ±å’ŒIEEE資料庫"
++
++msgid "Milliseconds to sleep between requests (default 100)"
++msgstr "è¦æ±‚多久(毫)秒後進入ç¡çœ "
++
++msgid "Model"
++msgstr "型號"
++
++msgid "Name"
++msgstr "å稱"
++
++msgid "Network Device Scan"
++msgstr "網路設備掃æ"
++
++msgid "Network Device Scanning Configuration"
++msgstr "網路設備掃æ設定值"
++
++msgid "Networks to scan for devices"
++msgstr "è¦æŽƒæ的網路設備"
++
++msgid "Networks to scan for supported devices"
++msgstr "è¦æŽƒæ的已支æ´ç¶²è·¯è¨­å‚™"
++
++msgid "No SIP devices"
++msgstr "無任何SIP設備"
++
++msgid "No devices detected"
++msgstr "åµæ¸¬ä¸åˆ°è¨­å‚™"
++
++msgid "Number of times to send requests (default 1)"
++msgstr "傳é€è¦æ±‚的次數(é è¨­1)"
++
++msgid "OUI Owner"
++msgstr "OUIæ“有者"
++
++msgid ""
++"Override the information returned by the MAC to Device Info Script (mac-to-"
++"devinfo) for a specified range of MAC Addresses"
++msgstr "é‡å°æŒ‡å®šç¯„åœçš„MACä½å€,由設備資訊腳本回傳的MACä½å€è³‡è¨Šé€²è¡Œè¦†è“‹"
++
++msgid "Perform Scans (this can take a few minutes)"
++msgstr "掃ææ“作(å¯èƒ½æœƒèŠ±è²»æ•¸åˆ†é˜)"
++
++msgid "Phone Information"
++msgstr "電話資訊"
++
++msgid "Phone Scan"
++msgstr "電話掃æ"
++
++msgid "Phone Scanning Configuration"
++msgstr "電話掃æ設定值"
++
++msgid "Phones"
++msgstr "電話"
++
++msgid "Ports"
++msgstr "埠"
++
++msgid "Raw"
++msgstr "原生RAW"
++
++msgid "Repeat Count"
++msgstr "é‡è¤‡æ¬¡æ•¸"
++
++msgid "Repeat Scans (this can take a few minutes)"
++msgstr "é‡è¤‡æŽƒæ(å¯èƒ½èŠ±è²»æ•¸åˆ†é˜)"
++
++msgid "SIP Device Information"
++msgstr "SIP設備資訊"
++
++msgid "SIP Device Scan"
++msgstr "SIP設備掃æ"
++
++msgid "SIP Device Scanning Configuration"
++msgstr "SIP設備掃æ設定值"
++
++msgid "SIP Devices on Network"
++msgstr "網路中的SIP設備"
++
++msgid "SIP devices discovered for"
++msgstr "已發ç¾çš„SIP設備"
++
++msgid "Scan for devices on specified networks."
++msgstr "é‡å°ç‰¹å®šç¶²è·¯æŽƒæ設備"
++
++msgid "Scan for supported SIP devices on specified networks."
++msgstr "é‡å°ç‰¹å®šç¶²è·¯æŽƒæ有支æ´çš„SIP設備"
++
++msgid "Scanning Configuration"
++msgstr "掃æ設定值"
++
++msgid "Scans for devices on specified networks."
++msgstr "é‡å°ç‰¹å®šç¶²è·¯æŽƒæ設備"
++
++msgid "Sleep Between Requests"
++msgstr "請求之間的ç¡çœ "
++
++msgid "Subnet"
++msgstr "å­ç¶²è·¯"
++
++msgid "This section contains no values yet"
++msgstr "這個部分尚無任何數值"
++
++msgid "Time to wait for responses in seconds (default 10)"
++msgstr "秒計等待回應時間(é è¨­10)"
++
++msgid "Timeout"
++msgstr "超時"
++
++msgid "Use Configuration"
++msgstr "使用設定值"
++
++msgid "Vendor"
++msgstr "供應製造商"
++
++msgid "check other networks"
++msgstr "檢查它網"
+diff --git a/feeds/luci/applications/luci-app-diag-devinfo/root/etc/config/luci_devinfo b/feeds/luci/applications/luci-app-diag-devinfo/root/etc/config/luci_devinfo
+new file mode 100644
+index 0000000..1bcdc19
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-diag-devinfo/root/etc/config/luci_devinfo
+@@ -0,0 +1,20 @@
++config 'smap_scannet' 'SIP_LAN'
++ option 'enable' '0'
++ option 'interface' 'lan'
++ option 'subnet' '192.168.99.0/24'
++
++config 'smap_scannet' 'SIP_WAN'
++ option 'enable' '0'
++ option 'interface' 'wan'
++ option 'subnet' '216.218.0.0/16'
++
++config 'netdiscover_scannet' 'SCAN_LAN'
++ option 'enable' '0'
++ option 'interface' 'lan'
++ option 'subnet' '192.168.99.0/24'
++
++config 'netdiscover_scannet' 'SCAN_WAN'
++ option 'enable' '0'
++ option 'interface' 'wan'
++ option 'subnet' '216.218.0.0/16'
++
+diff --git a/feeds/luci/applications/luci-app-dump1090/Makefile b/feeds/luci/applications/luci-app-dump1090/Makefile
+new file mode 100644
+index 0000000..e6abd44
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-dump1090/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for dump1090
++LUCI_DEPENDS:=+dump1090
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-dump1090/luasrc/controller/dump1090.lua b/feeds/luci/applications/luci-app-dump1090/luasrc/controller/dump1090.lua
+new file mode 100644
+index 0000000..bc2b36d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-dump1090/luasrc/controller/dump1090.lua
+@@ -0,0 +1,14 @@
++-- Copyright 2014 Ãlvaro Fernández Rojas <noltari@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.dump1090", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/dump1090") then
++ return
++ end
++
++ local page = entry({"admin", "services", "dump1090"}, cbi("dump1090"), _("dump1090"))
++ page.dependent = true
++
++end
+diff --git a/feeds/luci/applications/luci-app-dump1090/luasrc/model/cbi/dump1090.lua b/feeds/luci/applications/luci-app-dump1090/luasrc/model/cbi/dump1090.lua
+new file mode 100644
+index 0000000..4470a0d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-dump1090/luasrc/model/cbi/dump1090.lua
+@@ -0,0 +1,199 @@
++-- Copyright 2014-2015 Ãlvaro Fernández Rojas <noltari@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("dump1090", "dump1090", translate("dump1090 is a Mode S decoder specifically designed for RTLSDR devices, here you can configure the settings."))
++
++s = m:section(TypedSection, "dump1090", "")
++s.addremove = true
++s.anonymous = false
++
++enable=s:option(Flag, "disabled", translate("Enabled"))
++enable.enabled="0"
++enable.disabled="1"
++enable.default = "1"
++enable.rmempty = false
++
++respawn=s:option(Flag, "respawn", translate("Respawn"))
++respawn.default = false
++
++device_index=s:option(Value, "device_index", translate("RTL device index"))
++device_index.rmempty = true
++device_index.datatype = "uinteger"
++
++gain=s:option(Value, "gain", translate("Gain (-10 for auto-gain)"))
++gain.rmempty = true
++gain.datatype = "integer"
++
++enable_agc=s:option(Flag, "enable_agc", translate("Enable automatic gain control"))
++enable_agc.default = false
++
++freq=s:option(Value, "freq", translate("Frequency"))
++freq.rmempty = true
++freq.datatype = "uinteger"
++
++ifile=s:option(Value, "ifile", translate("Data file"))
++ifile.rmempty = true
++ifile.datatype = "file"
++
++iformat=s:option(ListValue, "iformat", translate("Sample format for data file"))
++iformat:value("", translate("Default"))
++iformat:value("UC8")
++iformat:value("SC16")
++iformat:value("SC16Q11")
++
++throttle=s:option(Flag, "throttle", translate("When reading from a file play back in realtime, not at max speed"))
++throttle.default = false
++
++raw=s:option(Flag, "raw", translate("Show only messages hex values"))
++raw.default = false
++
++net=s:option(Flag, "net", translate("Enable networking"))
++
++modeac=s:option(Flag, "modeac", translate("Enable decoding of SSR Modes 3/A & 3/C"))
++modeac.default = false
++
++net_beast=s:option(Flag, "net_beast", translate("TCP raw output in Beast binary format"))
++net_beast.default = false
++
++net_only=s:option(Flag, "net_only", translate("Enable just networking, no RTL device or file used"))
++net_only.default = false
++
++net_bind_address=s:option(Value, "net_bind_address", translate("IP address to bind to"))
++net_bind_address.rmempty = true
++net_bind_address.datatype = "ipaddr"
++
++net_http_port=s:option(Value, "net_http_port", translate("HTTP server port"))
++net_http_port.rmempty = true
++net_http_port.datatype = "port"
++
++net_ri_port=s:option(Value, "net_ri_port", translate("TCP raw input listen port"))
++net_ri_port.rmempty = true
++net_ri_port.datatype = "port"
++
++net_ro_port=s:option(Value, "net_ro_port", translate("TCP raw output listen port"))
++net_ro_port.rmempty = true
++net_ro_port.datatype = "port"
++
++net_sbs_port=s:option(Value, "net_sbs_port", translate("TCP BaseStation output listen port"))
++net_sbs_port.rmempty = true
++net_sbs_port.datatype = "port"
++
++net_bi_port=s:option(Value, "net_bi_port", translate("TCP Beast input listen port"))
++net_bi_port.rmempty = true
++net_bi_port.datatype = "port"
++
++net_bo_port=s:option(Value, "net_bo_port", translate("TCP Beast output listen port"))
++net_bo_port.rmempty = true
++net_bo_port.datatype = "port"
++
++net_fatsv_port=s:option(Value, "net_fatsv_port", translate("FlightAware TSV output port"))
++net_fatsv_port.rmempty = true
++net_fatsv_port.datatype = "port"
++
++net_ro_size=s:option(Value, "net_ro_size", translate("TCP raw output minimum size"))
++net_ro_size.rmempty = true
++net_ro_size.datatype = "uinteger"
++
++net_ro_interval=s:option(Value, "net_ro_interval", translate("TCP raw output memory flush rate in seconds"))
++net_ro_interval.rmempty = true
++net_ro_interval.datatype = "uinteger"
++
++net_heartbeat=s:option(Value, "net_heartbeat", translate("TCP heartbeat rate in seconds"))
++net_heartbeat.rmempty = true
++net_heartbeat.datatype = "uinteger"
++
++net_buffer=s:option(Value, "net_buffer", translate("TCP buffer size 64Kb * (2^n)"))
++net_buffer.rmempty = true
++net_buffer.datatype = "uinteger"
++
++net_verbatim=s:option(Flag, "net_verbatim", translate("Do not apply CRC corrections to messages we forward"))
++net_verbatim.default = false
++
++forward_mlat=s:option(Flag, "forward_mlat", translate("Allow forwarding of received mlat results to output ports"))
++forward_mlat.default = false
++
++lat=s:option(Value, "lat", translate("Reference/receiver latitude for surface posn"))
++lat.rmempty = true
++lat.datatype = "float"
++
++lon=s:option(Value, "lon", translate("Reference/receiver longitude for surface posn"))
++lon.rmempty = true
++lon.datatype = "float"
++
++max_range=s:option(Value, "max_range", translate("Absolute maximum range for position decoding"))
++max_range.rmempty = true
++max_range.datatype = "uinteger"
++
++fix=s:option(Flag, "fix", translate("Enable single-bits error correction using CRC"))
++fix.default = false
++
++no_fix=s:option(Flag, "no_fix", translate("Disable single-bits error correction using CRC"))
++no_fix.default = false
++
++no_crc_check=s:option(Flag, "no_crc_check", translate("Disable messages with broken CRC"))
++no_crc_check.default = false
++
++phase_enhance=s:option(Flag, "phase_enhance", translate("Enable phase enhancement"))
++phase_enhance.default = false
++
++agressive=s:option(Flag, "agressive", translate("More CPU for more messages"))
++agressive.default = false
++
++mlat=s:option(Flag, "mlat", translate("Display raw messages in Beast ascii mode"))
++mlat.default = false
++
++stats=s:option(Flag, "stats", translate("Print stats at exit"))
++stats.default = false
++
++stats_range=s:option(Flag, "stats_range", translate("Collect/show range histogram"))
++stats_range.default = false
++
++stats_every=s:option(Value, "stats_every", translate("Show and reset stats every seconds"))
++stats_every.rmempty = true
++stats_every.datatype = "uinteger"
++
++onlyaddr=s:option(Flag, "onlyaddr", translate("Show only ICAO addresses"))
++onlyaddr.default = false
++
++metric=s:option(Flag, "metric", translate("Use metric units"))
++metric.default = false
++
++snip=s:option(Value, "snip", translate("Strip IQ file removing samples"))
++snip.rmempty = true
++snip.datatype = "uinteger"
++
++debug_mode=s:option(Value, "debug", translate("Debug mode flags"))
++debug_mode.rmempty = true
++
++ppm=s:option(Value, "ppm", translate("Set receiver error in parts per million"))
++ppm.rmempty = true
++ppm.datatype = "uinteger"
++
++html_dir=s:option(Value, "html_dir", translate("Base directory for the internal HTTP server"))
++html_dir.rmempty = true
++html_dir.datatype = "directory"
++
++write_json=s:option(Value, "write_json", translate("Periodically write json output to a directory"))
++write_json.rmempty = true
++write_json.datatype = "directory"
++
++write_json_every=s:option(Flag, "write_json_every", translate("Write json output every t seconds"))
++write_json_every.rmempty = true
++write_json_every.datatype = "uinteger"
++
++json_location_accuracy=s:option(ListValue, "json_location_accuracy", translate("Accuracy of receiver location in json metadata"))
++json_location_accuracy:value("", translate("Default"))
++json_location_accuracy:value("0", "No location")
++json_location_accuracy:value("1", "Approximate")
++json_location_accuracy:value("2", "Exact")
++
++oversample=s:option(Flag, "oversample", translate("Use the 2.4MHz demodulator"))
++oversample.default = false
++
++dcfilter=s:option(Flag, "dcfilter", translate("Apply a 1Hz DC filter to input data"))
++dcfilter.default = false
++
++measure_noise=s:option(Flag, "measure_noise", translate("Measure noise power"))
++measure_noise.default = false
++
++return m
+diff --git a/feeds/luci/applications/luci-app-dump1090/root/etc/uci-defaults/luci-dump1090 b/feeds/luci/applications/luci-app-dump1090/root/etc/uci-defaults/luci-dump1090
+new file mode 100644
+index 0000000..4475d2f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-dump1090/root/etc/uci-defaults/luci-dump1090
+@@ -0,0 +1,12 @@
++#!/bin/sh
++
++# needed for "Save and Apply" to restart dump1090
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@dump1090[-1]
++ add ucitrack dump1090
++ set ucitrack.@dump1090[-1].init="dump1090"
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-firewall/Makefile b/feeds/luci/applications/luci-app-firewall/Makefile
+new file mode 100644
+index 0000000..21804d7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Firewall and Portforwarding application
++LUCI_DEPENDS:=+firewall
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/controller/firewall.lua b/feeds/luci/applications/luci-app-firewall/luasrc/controller/firewall.lua
+new file mode 100644
+index 0000000..5a6ab0a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/controller/firewall.lua
+@@ -0,0 +1,23 @@
++module("luci.controller.firewall", package.seeall)
++
++function index()
++ entry({"admin", "network", "firewall"},
++ alias("admin", "network", "firewall", "zones"),
++ _("Firewall"), 60)
++
++ entry({"admin", "network", "firewall", "zones"},
++ arcombine(cbi("firewall/zones"), cbi("firewall/zone-details")),
++ _("General Settings"), 10).leaf = true
++
++ entry({"admin", "network", "firewall", "forwards"},
++ arcombine(cbi("firewall/forwards"), cbi("firewall/forward-details")),
++ _("Port Forwards"), 20).leaf = true
++
++ entry({"admin", "network", "firewall", "rules"},
++ arcombine(cbi("firewall/rules"), cbi("firewall/rule-details")),
++ _("Traffic Rules"), 30).leaf = true
++
++ entry({"admin", "network", "firewall", "custom"},
++ cbi("firewall/custom"),
++ _("Custom Rules"), 40).leaf = true
++end
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/custom.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/custom.lua
+new file mode 100644
+index 0000000..968ac36
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/custom.lua
+@@ -0,0 +1,27 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++
++local f = SimpleForm("firewall",
++ translate("Firewall - Custom Rules"),
++ translate("Custom rules allow you to execute arbritary iptables commands \
++ which are not otherwise covered by the firewall framework. \
++ The commands are executed after each firewall restart, right after \
++ the default ruleset has been loaded."))
++
++local o = f:field(Value, "_custom")
++
++o.template = "cbi/tvalue"
++o.rows = 20
++
++function o.cfgvalue(self, section)
++ return fs.readfile("/etc/firewall.user")
++end
++
++function o.write(self, section, value)
++ value = value:gsub("\r\n?", "\n")
++ fs.writefile("/etc/firewall.user", value)
++end
++
++return f
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua
+new file mode 100644
+index 0000000..22f1c77
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua
+@@ -0,0 +1,150 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local sys = require "luci.sys"
++local dsp = require "luci.dispatcher"
++local ft = require "luci.tools.firewall"
++
++local m, s, o
++
++arg[1] = arg[1] or ""
++
++m = Map("firewall",
++ translate("Firewall - Port Forwards"),
++ translate("This page allows you to change advanced properties of the port \
++ forwarding entry. In most cases there is no need to modify \
++ those settings."))
++
++m.redirect = dsp.build_url("admin/network/firewall/forwards")
++
++if m.uci:get("firewall", arg[1]) ~= "redirect" then
++ luci.http.redirect(m.redirect)
++ return
++else
++ local name = m:get(arg[1], "name") or m:get(arg[1], "_name")
++ if not name or #name == 0 then
++ name = translate("(Unnamed Entry)")
++ end
++ m.title = "%s - %s" %{ translate("Firewall - Port Forwards"), name }
++end
++
++s = m:section(NamedSection, arg[1], "redirect", "")
++s.anonymous = true
++s.addremove = false
++
++ft.opt_enabled(s, Button)
++ft.opt_name(s, Value, translate("Name"))
++
++
++o = s:option(Value, "proto", translate("Protocol"))
++o:value("tcp udp", "TCP+UDP")
++o:value("tcp", "TCP")
++o:value("udp", "UDP")
++o:value("icmp", "ICMP")
++
++function o.cfgvalue(...)
++ local v = Value.cfgvalue(...)
++ if not v or v == "tcpudp" then
++ return "tcp udp"
++ end
++ return v
++end
++
++
++o = s:option(Value, "src", translate("Source zone"))
++o.nocreate = true
++o.default = "wan"
++o.template = "cbi/firewall_zonelist"
++
++
++o = s:option(DynamicList, "src_mac",
++ translate("Source MAC address"),
++ translate("Only match incoming traffic from these MACs."))
++o.rmempty = true
++o.datatype = "neg(macaddr)"
++o.placeholder = translate("any")
++
++luci.sys.net.mac_hints(function(mac, name)
++ o:value(mac, "%s (%s)" %{ mac, name })
++end)
++
++
++o = s:option(Value, "src_ip",
++ translate("Source IP address"),
++ translate("Only match incoming traffic from this IP or range."))
++o.rmempty = true
++o.datatype = "neg(ip4addr)"
++o.placeholder = translate("any")
++
++luci.sys.net.ipv4_hints(function(ip, name)
++ o:value(ip, "%s (%s)" %{ ip, name })
++end)
++
++
++o = s:option(Value, "src_port",
++ translate("Source port"),
++ translate("Only match incoming traffic originating from the given source port or port range on the client host"))
++o.rmempty = true
++o.datatype = "neg(portrange)"
++o.placeholder = translate("any")
++
++
++o = s:option(Value, "src_dip",
++ translate("External IP address"),
++ translate("Only match incoming traffic directed at the given IP address."))
++
++luci.sys.net.ipv4_hints(function(ip, name)
++ o:value(ip, "%s (%s)" %{ ip, name })
++end)
++
++
++o.rmempty = true
++o.datatype = "neg(ip4addr)"
++o.placeholder = translate("any")
++
++
++o = s:option(Value, "src_dport", translate("External port"),
++ translate("Match incoming traffic directed at the given " ..
++ "destination port or port range on this host"))
++o.datatype = "neg(portrange)"
++
++
++
++o = s:option(Value, "dest", translate("Internal zone"))
++o.nocreate = true
++o.default = "lan"
++o.template = "cbi/firewall_zonelist"
++
++
++o = s:option(Value, "dest_ip", translate("Internal IP address"),
++ translate("Redirect matched incoming traffic to the specified \
++ internal host"))
++o.datatype = "ip4addr"
++
++luci.sys.net.ipv4_hints(function(ip, name)
++ o:value(ip, "%s (%s)" %{ ip, name })
++end)
++
++
++o = s:option(Value, "dest_port",
++ translate("Internal port"),
++ translate("Redirect matched incoming traffic to the given port on \
++ the internal host"))
++o.placeholder = translate("any")
++o.datatype = "portrange"
++
++
++o = s:option(Flag, "reflection", translate("Enable NAT Loopback"))
++o.rmempty = true
++o.default = o.enabled
++o.cfgvalue = function(...)
++ return Flag.cfgvalue(...) or "1"
++end
++
++
++s:option(Value, "extra",
++ translate("Extra arguments"),
++ translate("Passes additional arguments to iptables. Use with care!"))
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua
+new file mode 100644
+index 0000000..e61ce73
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua
+@@ -0,0 +1,134 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2010-2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ds = require "luci.dispatcher"
++local ft = require "luci.tools.firewall"
++
++m = Map("firewall", translate("Firewall - Port Forwards"),
++ translate("Port forwarding allows remote computers on the Internet to \
++ connect to a specific computer or service within the \
++ private LAN."))
++
++--
++-- Port Forwards
++--
++
++s = m:section(TypedSection, "redirect", translate("Port Forwards"))
++s.template = "cbi/tblsection"
++s.addremove = true
++s.anonymous = true
++s.sortable = true
++s.extedit = ds.build_url("admin/network/firewall/forwards/%s")
++s.template_addremove = "firewall/cbi_addforward"
++
++function s.create(self, section)
++ local n = m:formvalue("_newfwd.name")
++ local p = m:formvalue("_newfwd.proto")
++ local E = m:formvalue("_newfwd.extzone")
++ local e = m:formvalue("_newfwd.extport")
++ local I = m:formvalue("_newfwd.intzone")
++ local a = m:formvalue("_newfwd.intaddr")
++ local i = m:formvalue("_newfwd.intport")
++
++ if p == "other" or (p and a) then
++ created = TypedSection.create(self, section)
++
++ self.map:set(created, "target", "DNAT")
++ self.map:set(created, "src", E or "wan")
++ self.map:set(created, "dest", I or "lan")
++ self.map:set(created, "proto", (p ~= "other") and p or "all")
++ self.map:set(created, "src_dport", e)
++ self.map:set(created, "dest_ip", a)
++ self.map:set(created, "dest_port", i)
++ self.map:set(created, "name", n)
++ end
++
++ if p ~= "other" then
++ created = nil
++ end
++end
++
++function s.parse(self, ...)
++ TypedSection.parse(self, ...)
++ if created then
++ m.uci:save("firewall")
++ luci.http.redirect(ds.build_url(
++ "admin/network/firewall/redirect", created
++ ))
++ end
++end
++
++function s.filter(self, sid)
++ return (self.map:get(sid, "target") ~= "SNAT")
++end
++
++
++ft.opt_name(s, DummyValue, translate("Name"))
++
++
++local function forward_proto_txt(self, s)
++ return "%s-%s" %{
++ translate("IPv4"),
++ ft.fmt_proto(self.map:get(s, "proto"),
++ self.map:get(s, "icmp_type")) or "TCP+UDP"
++ }
++end
++
++local function forward_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 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)
++ else
++ return translatef("From %s in %s", a, z)
++ end
++end
++
++local function forward_via_txt(self, s)
++ local a = ft.fmt_ip(self.map:get(s, "src_dip"), translate("any router IP"))
++ local p = ft.fmt_port(self.map:get(s, "src_dport"))
++
++ if p then
++ return translatef("Via %s at %s", a, p)
++ else
++ return translatef("Via %s", a)
++ end
++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),
++ forward_src_txt(self, s),
++ forward_via_txt(self, s)
++ }
++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"))
++ local p = ft.fmt_port(self.map:get(s, "dest_port")) or
++ ft.fmt_port(self.map:get(s, "src_dport"))
++
++ if p then
++ return translatef("%s, %s in %s", a, p, z)
++ else
++ return translatef("%s in %s", a, z)
++ end
++end
++
++ft.opt_enabled(s, Flag, translate("Enable")).width = "1%"
++
++return m
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua
+new file mode 100644
+index 0000000..0cb30b5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua
+@@ -0,0 +1,319 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2010-2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local sys = require "luci.sys"
++local utl = require "luci.util"
++local dsp = require "luci.dispatcher"
++local nxo = require "nixio"
++
++local ft = require "luci.tools.firewall"
++local nw = require "luci.model.network"
++local m, s, o, k, v
++
++arg[1] = arg[1] or ""
++
++m = Map("firewall",
++ translate("Firewall - Traffic Rules"),
++ translate("This page allows you to change advanced properties of the \
++ traffic rule entry, such as matched source and destination \
++ hosts."))
++
++m.redirect = dsp.build_url("admin/network/firewall/rules")
++
++nw.init(m.uci)
++
++local rule_type = m.uci:get("firewall", arg[1])
++if rule_type == "redirect" and m:get(arg[1], "target") ~= "SNAT" then
++ rule_type = nil
++end
++
++if not rule_type then
++ luci.http.redirect(m.redirect)
++ return
++
++--
++-- SNAT
++--
++elseif rule_type == "redirect" then
++
++ local name = m:get(arg[1], "name") or m:get(arg[1], "_name")
++ if not name or #name == 0 then
++ name = translate("(Unnamed SNAT)")
++ else
++ name = "SNAT %s" % name
++ end
++
++ m.title = "%s - %s" %{ translate("Firewall - Traffic Rules"), name }
++
++ local wan_zone = nil
++
++ m.uci:foreach("firewall", "zone",
++ function(s)
++ local n = s.network or s.name
++ if n then
++ local i
++ for i in utl.imatch(n) do
++ if i == "wan" then
++ wan_zone = s.name
++ return false
++ end
++ end
++ end
++ end)
++
++ s = m:section(NamedSection, arg[1], "redirect", "")
++ s.anonymous = true
++ s.addremove = false
++
++
++ ft.opt_enabled(s, Button)
++ ft.opt_name(s, Value, translate("Name"))
++
++
++ o = s:option(Value, "proto",
++ translate("Protocol"),
++ translate("You may specify multiple by selecting \"-- custom --\" and \
++ then entering protocols separated by space."))
++
++ o:value("all", "All protocols")
++ o:value("tcp udp", "TCP+UDP")
++ o:value("tcp", "TCP")
++ o:value("udp", "UDP")
++ o:value("icmp", "ICMP")
++
++ function o.cfgvalue(...)
++ local v = Value.cfgvalue(...)
++ if not v or v == "tcpudp" then
++ return "tcp udp"
++ end
++ return v
++ end
++
++
++ o = s:option(Value, "src", translate("Source zone"))
++ o.nocreate = true
++ o.default = "wan"
++ o.template = "cbi/firewall_zonelist"
++
++
++ o = s:option(Value, "src_ip", translate("Source IP address"))
++ o.rmempty = true
++ o.datatype = "neg(ipaddr)"
++ o.placeholder = translate("any")
++
++ luci.sys.net.ipv4_hints(function(ip, name)
++ o:value(ip, "%s (%s)" %{ ip, name })
++ end)
++
++
++ o = s:option(Value, "src_port",
++ translate("Source port"),
++ translate("Match incoming traffic originating from the given source \
++ port or port range on the client host."))
++ o.rmempty = true
++ o.datatype = "neg(portrange)"
++ o.placeholder = translate("any")
++
++
++ o = s:option(Value, "dest", translate("Destination zone"))
++ o.nocreate = true
++ o.default = "lan"
++ o.template = "cbi/firewall_zonelist"
++
++
++ o = s:option(Value, "dest_ip", translate("Destination IP address"))
++ o.datatype = "neg(ip4addr)"
++
++ luci.sys.net.ipv4_hints(function(ip, name)
++ o:value(ip, "%s (%s)" %{ ip, name })
++ end)
++
++
++ o = s:option(Value, "dest_port",
++ translate("Destination port"),
++ translate("Match forwarded traffic to the given destination port or \
++ port range."))
++
++ o.rmempty = true
++ o.placeholder = translate("any")
++ o.datatype = "neg(portrange)"
++
++
++ o = s:option(Value, "src_dip",
++ translate("SNAT IP address"),
++ translate("Rewrite matched traffic to the given address."))
++ o.rmempty = false
++ o.datatype = "ip4addr"
++
++ for k, v in ipairs(nw:get_interfaces()) do
++ local a
++ for k, a in ipairs(v:ipaddrs()) do
++ o:value(a:host():string(), '%s (%s)' %{
++ a:host():string(), v:shortname()
++ })
++ end
++ end
++
++
++ o = s:option(Value, "src_dport", translate("SNAT port"),
++ translate("Rewrite matched traffic to the given source port. May be \
++ left empty to only rewrite the IP address."))
++ o.datatype = "portrange"
++ o.rmempty = true
++ o.placeholder = translate('Do not rewrite')
++
++
++ s:option(Value, "extra",
++ translate("Extra arguments"),
++ translate("Passes additional arguments to iptables. Use with care!"))
++
++
++--
++-- Rule
++--
++else
++ local name = m:get(arg[1], "name") or m:get(arg[1], "_name")
++ if not name or #name == 0 then
++ name = translate("(Unnamed Rule)")
++ end
++
++ m.title = "%s - %s" %{ translate("Firewall - Traffic Rules"), name }
++
++
++ s = m:section(NamedSection, arg[1], "rule", "")
++ s.anonymous = true
++ s.addremove = false
++
++ ft.opt_enabled(s, Button)
++ ft.opt_name(s, Value, translate("Name"))
++
++
++ o = s:option(ListValue, "family", translate("Restrict to address family"))
++ o.rmempty = true
++ o:value("", translate("IPv4 and IPv6"))
++ o:value("ipv4", translate("IPv4 only"))
++ o:value("ipv6", translate("IPv6 only"))
++
++
++ o = s:option(Value, "proto", translate("Protocol"))
++ o:value("all", translate("Any"))
++ o:value("tcp udp", "TCP+UDP")
++ o:value("tcp", "TCP")
++ o:value("udp", "UDP")
++ o:value("icmp", "ICMP")
++
++ function o.cfgvalue(...)
++ local v = Value.cfgvalue(...)
++ if not v or v == "tcpudp" then
++ return "tcp udp"
++ end
++ return v
++ end
++
++
++ o = s:option(DynamicList, "icmp_type", translate("Match ICMP type"))
++ o:value("", "any")
++ o:value("echo-reply")
++ o:value("destination-unreachable")
++ o:value("network-unreachable")
++ o:value("host-unreachable")
++ o:value("protocol-unreachable")
++ o:value("port-unreachable")
++ o:value("fragmentation-needed")
++ o:value("source-route-failed")
++ o:value("network-unknown")
++ o:value("host-unknown")
++ o:value("network-prohibited")
++ o:value("host-prohibited")
++ o:value("TOS-network-unreachable")
++ o:value("TOS-host-unreachable")
++ o:value("communication-prohibited")
++ o:value("host-precedence-violation")
++ o:value("precedence-cutoff")
++ o:value("source-quench")
++ o:value("redirect")
++ o:value("network-redirect")
++ o:value("host-redirect")
++ o:value("TOS-network-redirect")
++ o:value("TOS-host-redirect")
++ o:value("echo-request")
++ o:value("router-advertisement")
++ o:value("router-solicitation")
++ o:value("time-exceeded")
++ o:value("ttl-zero-during-transit")
++ o:value("ttl-zero-during-reassembly")
++ o:value("parameter-problem")
++ o:value("ip-header-bad")
++ o:value("required-option-missing")
++ o:value("timestamp-request")
++ o:value("timestamp-reply")
++ o:value("address-mask-request")
++ o:value("address-mask-reply")
++
++
++ o = s:option(Value, "src", translate("Source zone"))
++ o.nocreate = true
++ o.allowany = true
++ o.default = "wan"
++ o.template = "cbi/firewall_zonelist"
++
++
++ o = s:option(Value, "src_mac", translate("Source MAC address"))
++ o.datatype = "list(macaddr)"
++ o.placeholder = translate("any")
++
++ luci.sys.net.mac_hints(function(mac, name)
++ o:value(mac, "%s (%s)" %{ mac, name })
++ end)
++
++
++ o = s:option(Value, "src_ip", translate("Source address"))
++ o.datatype = "neg(ipaddr)"
++ o.placeholder = translate("any")
++
++ luci.sys.net.ipv4_hints(function(ip, name)
++ o:value(ip, "%s (%s)" %{ ip, name })
++ end)
++
++
++ o = s:option(Value, "src_port", translate("Source port"))
++ o.datatype = "list(neg(portrange))"
++ o.placeholder = translate("any")
++
++
++ o = s:option(Value, "dest", translate("Destination zone"))
++ o.nocreate = true
++ o.allowany = true
++ o.allowlocal = true
++ o.template = "cbi/firewall_zonelist"
++
++
++ o = s:option(Value, "dest_ip", translate("Destination address"))
++ o.datatype = "neg(ipaddr)"
++ o.placeholder = translate("any")
++
++ luci.sys.net.ipv4_hints(function(ip, name)
++ o:value(ip, "%s (%s)" %{ ip, name })
++ end)
++
++
++ o = s:option(Value, "dest_port", translate("Destination port"))
++ o.datatype = "list(neg(portrange))"
++ o.placeholder = translate("any")
++
++
++ o = s:option(ListValue, "target", translate("Action"))
++ o.default = "ACCEPT"
++ o:value("DROP", translate("drop"))
++ o:value("ACCEPT", translate("accept"))
++ o:value("REJECT", translate("reject"))
++ o:value("NOTRACK", translate("don't track"))
++
++
++ s:option(Value, "extra",
++ translate("Extra arguments"),
++ translate("Passes additional arguments to iptables. Use with care!"))
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua
+new file mode 100644
+index 0000000..c533491
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua
+@@ -0,0 +1,259 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2010-2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ds = require "luci.dispatcher"
++local ft = require "luci.tools.firewall"
++
++m = Map("firewall",
++ translate("Firewall - Traffic Rules"),
++ translate("Traffic rules define policies for packets traveling between \
++ different zones, for example to reject traffic between certain hosts \
++ or to open WAN ports on the router."))
++
++--
++-- Rules
++--
++
++s = m:section(TypedSection, "rule", translate("Traffic Rules"))
++s.addremove = true
++s.anonymous = true
++s.sortable = true
++s.template = "cbi/tblsection"
++s.extedit = ds.build_url("admin/network/firewall/rules/%s")
++s.defaults.target = "ACCEPT"
++s.template_addremove = "firewall/cbi_addrule"
++
++
++function s.create(self, section)
++ created = TypedSection.create(self, section)
++end
++
++function s.parse(self, ...)
++ TypedSection.parse(self, ...)
++
++ local i_n = m:formvalue("_newopen.name")
++ local i_p = m:formvalue("_newopen.proto")
++ local i_e = m:formvalue("_newopen.extport")
++ local i_x = m:formvalue("_newopen.submit")
++
++ local f_n = m:formvalue("_newfwd.name")
++ local f_s = m:formvalue("_newfwd.src")
++ local f_d = m:formvalue("_newfwd.dest")
++ local f_x = m:formvalue("_newfwd.submit")
++
++ if i_x then
++ created = TypedSection.create(self, section)
++
++ self.map:set(created, "target", "ACCEPT")
++ self.map:set(created, "src", "wan")
++ self.map:set(created, "proto", (i_p ~= "other") and i_p or "all")
++ self.map:set(created, "dest_port", i_e)
++ self.map:set(created, "name", i_n)
++
++ if i_p ~= "other" and i_e and #i_e > 0 then
++ created = nil
++ end
++
++ elseif f_x then
++ created = TypedSection.create(self, section)
++
++ self.map:set(created, "target", "ACCEPT")
++ self.map:set(created, "src", f_s)
++ self.map:set(created, "dest", f_d)
++ self.map:set(created, "name", f_n)
++ end
++
++ if created then
++ m.uci:save("firewall")
++ luci.http.redirect(ds.build_url(
++ "admin/network/firewall/rules", created
++ ))
++ end
++end
++
++ft.opt_name(s, DummyValue, translate("Name"))
++
++local function rule_proto_txt(self, s)
++ local f = self.map:get(s, "family")
++ local p = ft.fmt_proto(self.map:get(s, "proto"),
++ self.map:get(s, "icmp_type")) or translate("traffic")
++
++ if f and f:match("4") then
++ return "%s-%s" %{ translate("IPv4"), p }
++ elseif f and f:match("6") then
++ return "%s-%s" %{ translate("IPv6"), p }
++ else
++ return "%s %s" %{ translate("Any"), p }
++ end
++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 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)
++ else
++ return translatef("From %s in %s", a, z)
++ end
++end
++
++local function rule_dest_txt(self, s)
++ local z = ft.fmt_zone(self.map:get(s, "dest"))
++ local p = ft.fmt_port(self.map:get(s, "dest_port"))
++
++ -- Forward
++ if z then
++ local a = ft.fmt_ip(self.map:get(s, "dest_ip"), translate("any host"))
++ if p then
++ return translatef("To %s, %s in %s", a, p, z)
++ else
++ return translatef("To %s in %s", a, z)
++ end
++
++ -- Input
++ else
++ local a = ft.fmt_ip(self.map:get(s, "dest_ip"),
++ translate("any router IP"))
++
++ if p then
++ return translatef("To %s at %s on <var>this device</var>", a, p)
++ else
++ return translatef("To %s on <var>this device</var>", a)
++ end
++ end
++end
++
++local function snat_dest_txt(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"))
++ local p = ft.fmt_port(self.map:get(s, "dest_port")) or
++ ft.fmt_port(self.map:get(s, "src_dport"))
++
++ if p then
++ return translatef("To %s, %s in %s", a, p, z)
++ else
++ return translatef("To %s in %s", a, z)
++ end
++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),
++ rule_src_txt(self, s),
++ rule_dest_txt(self, s)
++ }
++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 l = ft.fmt_limit(self.map:get(s, "limit"),
++ self.map:get(s, "limit_burst"))
++
++ if l then
++ return translatef("<var>%s</var> and limit to %s", t, l)
++ else
++ return "<var>%s</var>" % t
++ end
++end
++
++ft.opt_enabled(s, Flag, translate("Enable")).width = "1%"
++
++
++--
++-- SNAT
++--
++
++s = m:section(TypedSection, "redirect",
++ translate("Source NAT"),
++ translate("Source NAT is a specific form of masquerading which allows \
++ fine grained control over the source IP used for outgoing traffic, \
++ for example to map multiple WAN addresses to internal subnets."))
++s.template = "cbi/tblsection"
++s.addremove = true
++s.anonymous = true
++s.sortable = true
++s.extedit = ds.build_url("admin/network/firewall/rules/%s")
++s.template_addremove = "firewall/cbi_addsnat"
++
++function s.create(self, section)
++ created = TypedSection.create(self, section)
++end
++
++function s.parse(self, ...)
++ TypedSection.parse(self, ...)
++
++ local n = m:formvalue("_newsnat.name")
++ local s = m:formvalue("_newsnat.src")
++ local d = m:formvalue("_newsnat.dest")
++ local a = m:formvalue("_newsnat.dip")
++ local p = m:formvalue("_newsnat.dport")
++ local x = m:formvalue("_newsnat.submit")
++
++ if x and a and #a > 0 then
++ created = TypedSection.create(self, section)
++
++ self.map:set(created, "target", "SNAT")
++ self.map:set(created, "src", s)
++ self.map:set(created, "dest", d)
++ self.map:set(created, "proto", "all")
++ self.map:set(created, "src_dip", a)
++ self.map:set(created, "src_dport", p)
++ self.map:set(created, "name", n)
++ end
++
++ if created then
++ m.uci:save("firewall")
++ luci.http.redirect(ds.build_url(
++ "admin/network/firewall/rules", created
++ ))
++ end
++end
++
++function s.filter(self, sid)
++ return (self.map:get(sid, "target") == "SNAT")
++end
++
++ft.opt_name(s, DummyValue, translate("Name"))
++
++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),
++ rule_src_txt(self, s),
++ snat_dest_txt(self, s)
++ }
++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"))
++
++ if a and p then
++ return translatef("Rewrite to source %s, %s", a, p)
++ else
++ return translatef("Rewrite to source %s", a or p)
++ end
++end
++
++ft.opt_enabled(s, Flag, translate("Enable")).width = "1%"
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua
+new file mode 100644
+index 0000000..c8b8f22
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua
+@@ -0,0 +1,232 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2010-2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local nw = require "luci.model.network"
++local fw = require "luci.model.firewall"
++local ds = require "luci.dispatcher"
++local ut = require "luci.util"
++
++local m, p, i, v
++local s, name, net, family, msrc, mdest, log, lim
++local s2, out, inp
++
++
++m = Map("firewall", translate("Firewall - Zone Settings"))
++m.redirect = luci.dispatcher.build_url("admin/network/firewall/zones")
++
++fw.init(m.uci)
++nw.init(m.uci)
++
++
++local zone = fw:get_zone(arg[1])
++if not zone then
++ luci.http.redirect(dsp.build_url("admin/network/firewall/zones"))
++ return
++else
++ m.title = "%s - %s" %{
++ translate("Firewall - Zone Settings"),
++ translatef("Zone %q", zone:name() or "?")
++ }
++end
++
++
++s = m:section(NamedSection, zone.sid, "zone",
++ translatef("Zone %q", zone:name()),
++ translatef("This section defines common properties of %q. \
++ The <em>input</em> and <em>output</em> options set the default \
++ policies for traffic entering and leaving this zone while the \
++ <em>forward</em> option describes the policy for forwarded traffic \
++ between different networks within the zone. \
++ <em>Covered networks</em> specifies which available networks are \
++ members of this zone.", zone:name()))
++
++s.anonymous = true
++s.addremove = false
++
++m.on_commit = function(map)
++ local zone = fw:get_zone(arg[1])
++ if zone then
++ s.section = zone.sid
++ s2.section = zone.sid
++ end
++end
++
++
++s:tab("general", translate("General Settings"))
++s:tab("advanced", translate("Advanced Settings"))
++
++
++name = s:taboption("general", Value, "name", translate("Name"))
++name.optional = false
++name.forcewrite = true
++name.datatype = "and(uciname,maxlength(11))"
++
++function name.write(self, section, value)
++ if zone:name() ~= value then
++ fw:rename_zone(zone:name(), value)
++ out.exclude = value
++ inp.exclude = value
++ end
++
++ m.redirect = ds.build_url("admin/network/firewall/zones", value)
++ m.title = "%s - %s" %{
++ translate("Firewall - Zone Settings"),
++ translatef("Zone %q", value or "?")
++ }
++end
++
++p = {
++ s:taboption("general", ListValue, "input", translate("Input")),
++ s:taboption("general", ListValue, "output", translate("Output")),
++ s:taboption("general", ListValue, "forward", translate("Forward"))
++}
++
++for i, v in ipairs(p) do
++ v:value("REJECT", translate("reject"))
++ v:value("DROP", translate("drop"))
++ v:value("ACCEPT", translate("accept"))
++end
++
++s:taboption("general", Flag, "masq", translate("Masquerading"))
++s:taboption("general", Flag, "mtu_fix", translate("MSS clamping"))
++
++net = s:taboption("general", Value, "network", translate("Covered networks"))
++net.template = "cbi/network_netlist"
++net.widget = "checkbox"
++net.cast = "string"
++
++function net.formvalue(self, section)
++ return Value.formvalue(self, section) or "-"
++end
++
++function net.cfgvalue(self, section)
++ return Value.cfgvalue(self, section) or name:cfgvalue(section)
++end
++
++function net.write(self, section, value)
++ zone:clear_networks()
++
++ local n
++ for n in ut.imatch(value) do
++ zone:add_network(n)
++ end
++end
++
++
++family = s:taboption("advanced", ListValue, "family",
++ translate("Restrict to address family"))
++
++family.rmempty = true
++family:value("", translate("IPv4 and IPv6"))
++family:value("ipv4", translate("IPv4 only"))
++family:value("ipv6", translate("IPv6 only"))
++
++msrc = s:taboption("advanced", DynamicList, "masq_src",
++ translate("Restrict Masquerading to given source subnets"))
++
++msrc.optional = true
++msrc.datatype = "list(neg(or(uciname,hostname,ip4addr)))"
++msrc.placeholder = "0.0.0.0/0"
++msrc:depends("family", "")
++msrc:depends("family", "ipv4")
++
++mdest = s:taboption("advanced", DynamicList, "masq_dest",
++ translate("Restrict Masquerading to given destination subnets"))
++
++mdest.optional = true
++mdest.datatype = "list(neg(or(uciname,hostname,ip4addr)))"
++mdest.placeholder = "0.0.0.0/0"
++mdest:depends("family", "")
++mdest:depends("family", "ipv4")
++
++s:taboption("advanced", Flag, "conntrack",
++ translate("Force connection tracking"))
++
++log = s:taboption("advanced", Flag, "log",
++ translate("Enable logging on this zone"))
++
++log.rmempty = true
++log.enabled = "1"
++
++lim = s:taboption("advanced", Value, "log_limit",
++ translate("Limit log messages"))
++
++lim.placeholder = "10/minute"
++lim:depends("log", "1")
++
++
++s2 = m:section(NamedSection, zone.sid, "fwd_out",
++ translate("Inter-Zone Forwarding"),
++ translatef("The options below control the forwarding policies between \
++ this zone (%s) and other zones. <em>Destination zones</em> cover \
++ forwarded traffic <strong>originating from %q</strong>. \
++ <em>Source zones</em> match forwarded traffic from other zones \
++ <strong>targeted at %q</strong>. The forwarding 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.",
++ zone:name(), zone:name(), zone:name()
++
++ ))
++
++out = s2:option(Value, "out",
++ translate("Allow forward to <em>destination zones</em>:"))
++
++out.nocreate = true
++out.widget = "checkbox"
++out.exclude = zone:name()
++out.template = "cbi/firewall_zonelist"
++
++inp = s2:option(Value, "in",
++ translate("Allow forward from <em>source zones</em>:"))
++
++inp.nocreate = true
++inp.widget = "checkbox"
++inp.exclude = zone:name()
++inp.template = "cbi/firewall_zonelist"
++
++function out.cfgvalue(self, section)
++ local v = { }
++ local f
++ for _, f in ipairs(zone:get_forwardings_by("src")) do
++ v[#v+1] = f:dest()
++ end
++ return table.concat(v, " ")
++end
++
++function inp.cfgvalue(self, section)
++ local v = { }
++ local f
++ for _, f in ipairs(zone:get_forwardings_by("dest")) do
++ v[#v+1] = f:src()
++ end
++ return v
++end
++
++function out.formvalue(self, section)
++ return Value.formvalue(self, section) or "-"
++end
++
++function inp.formvalue(self, section)
++ return Value.formvalue(self, section) or "-"
++end
++
++function out.write(self, section, value)
++ zone:del_forwardings_by("src")
++
++ local f
++ for f in ut.imatch(value) do
++ zone:add_forwarding_to(f)
++ end
++end
++
++function inp.write(self, section, value)
++ zone:del_forwardings_by("dest")
++
++ local f
++ for f in ut.imatch(value) do
++ zone:add_forwarding_from(f)
++ end
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua
+new file mode 100644
+index 0000000..60968ce
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua
+@@ -0,0 +1,77 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ds = require "luci.dispatcher"
++local fw = require "luci.model.firewall"
++
++local m, s, o, p, i, v
++
++m = Map("firewall",
++ translate("Firewall - Zone Settings"),
++ translate("The firewall creates zones over your network interfaces to control network traffic flow."))
++
++fw.init(m.uci)
++
++s = m:section(TypedSection, "defaults", translate("General Settings"))
++s.anonymous = true
++s.addremove = false
++
++s:option(Flag, "syn_flood", translate("Enable SYN-flood protection"))
++
++o = s:option(Flag, "drop_invalid", translate("Drop invalid packets"))
++o.default = o.disabled
++
++p = {
++ s:option(ListValue, "input", translate("Input")),
++ s:option(ListValue, "output", translate("Output")),
++ s:option(ListValue, "forward", translate("Forward"))
++}
++
++for i, v in ipairs(p) do
++ v:value("REJECT", translate("reject"))
++ v:value("DROP", translate("drop"))
++ v:value("ACCEPT", translate("accept"))
++end
++
++
++s = m:section(TypedSection, "zone", translate("Zones"))
++s.template = "cbi/tblsection"
++s.anonymous = true
++s.addremove = true
++s.extedit = ds.build_url("admin", "network", "firewall", "zones", "%s")
++
++function s.create(self)
++ local z = fw:new_zone()
++ if z then
++ luci.http.redirect(
++ ds.build_url("admin", "network", "firewall", "zones", z.sid)
++ )
++ end
++end
++
++function s.remove(self, section)
++ return fw:del_zone(section)
++end
++
++o = s:option(DummyValue, "_info", translate("Zone ⇒ Forwardings"))
++o.template = "cbi/firewall_zoneforwards"
++o.cfgvalue = function(self, section)
++ return self.map:get(section, "name")
++end
++
++p = {
++ s:option(ListValue, "input", translate("Input")),
++ s:option(ListValue, "output", translate("Output")),
++ s:option(ListValue, "forward", translate("Forward"))
++}
++
++for i, v in ipairs(p) do
++ v:value("REJECT", translate("reject"))
++ v:value("DROP", translate("drop"))
++ v:value("ACCEPT", translate("accept"))
++end
++
++s:option(Flag, "masq", translate("Masquerading"))
++s:option(Flag, "mtu_fix", translate("MSS clamping"))
++
++return m
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/tools/firewall.lua b/feeds/luci/applications/luci-app-firewall/luasrc/tools/firewall.lua
+new file mode 100644
+index 0000000..6d08fe1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/tools/firewall.lua
+@@ -0,0 +1,279 @@
++-- Copyright 2011-2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.tools.firewall", package.seeall)
++
++local ut = require "luci.util"
++local ip = require "luci.ip"
++local nx = require "nixio"
++
++local translate, translatef = luci.i18n.translate, luci.i18n.translatef
++
++local function tr(...)
++ return tostring(translate(...))
++end
++
++function fmt_neg(x)
++ if type(x) == "string" then
++ local v, neg = x:gsub("^ *! *", "")
++ if neg > 0 then
++ return v, "%s " % tr("not")
++ else
++ return x, ""
++ end
++ end
++ return x, ""
++end
++
++function fmt_mac(x)
++ if x and #x > 0 then
++ local m, n
++ local l = { tr("MAC"), " " }
++ for m in ut.imatch(x) do
++ m, n = fmt_neg(m)
++ l[#l+1] = "<var>%s%s</var>" %{ n, m }
++ l[#l+1] = ", "
++ end
++ if #l > 1 then
++ l[#l] = nil
++ if #l > 3 then
++ l[1] = tr("MACs")
++ end
++ return table.concat(l, "")
++ end
++ end
++end
++
++function fmt_port(x, d)
++ if x and #x > 0 then
++ local p, n
++ local l = { tr("port"), " " }
++ for p in ut.imatch(x) do
++ p, n = fmt_neg(p)
++ local a, b = p:match("(%d+)%D+(%d+)")
++ if a and b then
++ l[1] = tr("ports")
++ l[#l+1] = "<var>%s%d-%d</var>" %{ n, a, b }
++ else
++ l[#l+1] = "<var>%s%d</var>" %{ n, p }
++ end
++ l[#l+1] = ", "
++ end
++ if #l > 1 then
++ l[#l] = nil
++ if #l > 3 then
++ l[1] = tr("ports")
++ end
++ return table.concat(l, "")
++ end
++ end
++ return d and "<var>%s</var>" % d
++end
++
++function fmt_ip(x, d)
++ if x and #x > 0 then
++ local l = { tr("IP"), " " }
++ local v, a, n
++ for v in ut.imatch(x) do
++ v, n = fmt_neg(v)
++ a, m = v:match("(%S+)/(%d+%.%S+)")
++ a = a or v
++ a = a:match(":") and ip.IPv6(a, m) or ip.IPv4(a, m)
++ if a and (a:is6() and a:prefix() < 128 or a:prefix() < 32) then
++ l[1] = tr("IP range")
++ l[#l+1] = "<var title='%s - %s'>%s%s</var>" %{
++ a:minhost():string(),
++ a:maxhost():string(),
++ n, a:string()
++ }
++ else
++ l[#l+1] = "<var>%s%s</var>" %{
++ n,
++ a and a:string() or v
++ }
++ end
++ l[#l+1] = ", "
++ end
++ if #l > 1 then
++ l[#l] = nil
++ if #l > 3 then
++ l[1] = tr("IPs")
++ end
++ return table.concat(l, "")
++ end
++ end
++ return d and "<var>%s</var>" % d
++end
++
++function fmt_zone(x, d)
++ if x == "*" then
++ return "<var>%s</var>" % tr("any zone")
++ elseif x and #x > 0 then
++ return "<var>%s</var>" % x
++ elseif d then
++ return "<var>%s</var>" % d
++ end
++end
++
++function fmt_icmp_type(x)
++ if x and #x > 0 then
++ local t, v, n
++ local l = { tr("type"), " " }
++ for v in ut.imatch(x) do
++ v, n = fmt_neg(v)
++ l[#l+1] = "<var>%s%s</var>" %{ n, v }
++ l[#l+1] = ", "
++ end
++ if #l > 1 then
++ l[#l] = nil
++ if #l > 3 then
++ l[1] = tr("types")
++ end
++ return table.concat(l, "")
++ end
++ end
++end
++
++function fmt_proto(x, icmp_types)
++ if x and #x > 0 then
++ local v, n
++ local l = { }
++ local t = fmt_icmp_type(icmp_types)
++ for v in ut.imatch(x) do
++ v, n = fmt_neg(v)
++ if v == "tcpudp" then
++ l[#l+1] = "TCP"
++ l[#l+1] = ", "
++ l[#l+1] = "UDP"
++ l[#l+1] = ", "
++ elseif v ~= "all" then
++ local p = nx.getproto(v)
++ if p then
++ -- ICMP
++ if (p.proto == 1 or p.proto == 58) and t then
++ l[#l+1] = translatef(
++ "%s%s with %s",
++ n, p.aliases[1] or p.name, t
++ )
++ else
++ l[#l+1] = "%s%s" %{
++ n,
++ p.aliases[1] or p.name
++ }
++ end
++ l[#l+1] = ", "
++ end
++ end
++ end
++ if #l > 0 then
++ l[#l] = nil
++ return table.concat(l, "")
++ end
++ end
++end
++
++function fmt_limit(limit, burst)
++ burst = tonumber(burst)
++ if limit and #limit > 0 then
++ local l, u = limit:match("(%d+)/(%w+)")
++ l = tonumber(l or limit)
++ u = u or "second"
++ if l then
++ if u:match("^s") then
++ u = tr("second")
++ elseif u:match("^m") then
++ u = tr("minute")
++ elseif u:match("^h") then
++ u = tr("hour")
++ elseif u:match("^d") then
++ u = tr("day")
++ end
++ if burst and burst > 0 then
++ return translatef("<var>%d</var> pkts. per <var>%s</var>, \
++ burst <var>%d</var> pkts.", l, u, burst)
++ else
++ return translatef("<var>%d</var> pkts. per <var>%s</var>", l, u)
++ end
++ end
++ end
++end
++
++function fmt_target(x, dest)
++ if dest and #dest > 0 then
++ if x == "ACCEPT" then
++ return tr("Accept forward")
++ elseif x == "REJECT" then
++ return tr("Refuse forward")
++ elseif x == "NOTRACK" then
++ return tr("Do not track forward")
++ else --if x == "DROP" then
++ return tr("Discard forward")
++ end
++ else
++ if x == "ACCEPT" then
++ return tr("Accept input")
++ elseif x == "REJECT" then
++ return tr("Refuse input")
++ elseif x == "NOTRACK" then
++ return tr("Do not track input")
++ else --if x == "DROP" then
++ return tr("Discard input")
++ end
++ end
++end
++
++
++function opt_enabled(s, t, ...)
++ if t == luci.cbi.Button then
++ local o = s:option(t, "__enabled")
++ function o.render(self, section)
++ if self.map:get(section, "enabled") ~= "0" then
++ self.title = tr("Rule is enabled")
++ self.inputtitle = tr("Disable")
++ self.inputstyle = "reset"
++ else
++ self.title = tr("Rule is disabled")
++ self.inputtitle = tr("Enable")
++ self.inputstyle = "apply"
++ end
++ t.render(self, section)
++ end
++ function o.write(self, section, value)
++ if self.map:get(section, "enabled") ~= "0" then
++ self.map:set(section, "enabled", "0")
++ else
++ self.map:del(section, "enabled")
++ end
++ end
++ return o
++ else
++ local o = s:option(t, "enabled", ...)
++ o.default = "1"
++ return o
++ end
++end
++
++function opt_name(s, t, ...)
++ local o = s:option(t, "name", ...)
++
++ function o.cfgvalue(self, section)
++ return self.map:get(section, "name") or
++ self.map:get(section, "_name") or "-"
++ end
++
++ function o.write(self, section, value)
++ if value ~= "-" then
++ self.map:set(section, "name", value)
++ self.map:del(section, "_name")
++ else
++ self:remove(section)
++ end
++ end
++
++ function o.remove(self, section)
++ self.map:del(section, "name")
++ self.map:del(section, "_name")
++ end
++
++ return o
++end
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm
+new file mode 100644
+index 0000000..3c46e22
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm
+@@ -0,0 +1,116 @@
++<%-
++ local fw = require "luci.model.firewall".init()
++ local izl = { }
++ local ezl = { }
++ local _, z
++ for _, z in ipairs(fw:get_zones()) do
++ if z:name() ~= "wan" then
++ izl[#izl+1] = z
++ end
++ if z:name() ~= "lan" then
++ ezl[#ezl+1] = z
++ end
++ 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" />
++ </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" />
++ </td>
++ <td class="cbi-section-table-cell" style="width:110px">
++ <input type="text" class="cbi-input-text" id="_newfwd.intport" name="_newfwd.intport" />
++ </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_validate_field('_newfwd.extport', true, 'portrange');
++ cbi_validate_field('_newfwd.intaddr', true, 'host');
++ cbi_validate_field('_newfwd.intport', true, 'portrange');
++
++ cbi_combobox_init('_newfwd.intaddr', {
++ <% first = true; luci.sys.net.ipv4_hints(function(ip, name) %>
++ <%- if first then first = false else %>,<% end -%>'<%=ip%>': '<%=ip%> (<%=name%>)'
++ <%- end) %> }, '', '<%: -- custom -- %>');
++
++ 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 ],
++ };
++
++ 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;
++ }
++ }
++ });
++
++
++ cbi_validate_field('cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>', true, 'uciname');
++ //]]></script>
++</div>
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm
+new file mode 100644
+index 0000000..463b2e0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm
+@@ -0,0 +1,112 @@
++<%
++ local fw = require "luci.model.firewall".init()
++ local wz = fw:get_zone("wan")
++ local lz = fw:get_zone("lan")
++%>
++
++<div class="cbi-section-create cbi-tblsection-create">
++ <% if wz and lz 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>
++
++ <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() == "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="_newfwd.dest" name="_newfwd.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 left">
++ <input type="submit" class="cbi-button cbi-button-link" name="_newfwd.submit" value="<%:Add and edit...%>" />
++ </td>
++ </tr>
++ </table>
++
++ <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/))
++ {
++ var hint = hints[this.value || 0];
++ if (hint)
++ {
++ p.selectedIndex = hint[1];
++
++ 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>
++ <% else %>
++ <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
++ <% end %>
++</div>
+diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm
+new file mode 100644
+index 0000000..4e1681c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm
+@@ -0,0 +1,66 @@
++<%
++ local fw = require "luci.model.firewall".init()
++ local nw = require "luci.model.network".init()
++ local wz = fw:get_zone("wan")
++ local lz = fw:get_zone("lan")
++%>
++
++<div class="cbi-section-create cbi-tblsection-create">
++ <% if wz and lz 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" />
++ </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%>" />
++ </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>
++
++ <script type="text/javascript">//<![CDATA[
++ cbi_validate_field('_newsnat.dport', true, 'portrange');
++ cbi_validate_field('_newsnat.dip', true, 'ip4addr');
++ cbi_combobox_init('_newsnat.dip', {
++ <% local c, k, v = 0; for k, v in ipairs(nw:get_interfaces()) do -%>
++ <%- local a; for k, a in ipairs(v:ipaddrs()) do c = c + 1 -%>
++ <% if c > 1 then %>,<% end %>'<%=a:host():string()%>': '<%=a:host():string()%> (<%=v:shortname()%>)'
++ <%- end %>
++ <%- end %> }, '<%: -- Please choose -- %>', '<%: -- custom -- %>');
++ //]]></script>
++ <% else %>
++ <input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>" value="<%:Add%>" />
++ <% end %>
++</div>
+diff --git a/feeds/luci/applications/luci-app-firewall/po/ca/firewall.po b/feeds/luci/applications/luci-app-firewall/po/ca/firewall.po
+new file mode 100644
+index 0000000..1843a16
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/ca/firewall.po
+@@ -0,0 +1,603 @@
++# luci-fw.pot
++# generated from ./applications/luci-fw/luasrc/i18n/luci-fw.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2014-06-17 09:40+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr "%s en %s"
++
++msgid "%s%s with %s"
++msgstr "%s%s amb %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s en %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(Entrada sense nom)"
++
++msgid "(Unnamed Rule)"
++msgstr "(Regla sense nom)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(SNAT sense nom)"
++
++msgid "-- Please choose --"
++msgstr "-- Si us plau, trieu --"
++
++msgid "-- custom --"
++msgstr "-- personalitzats --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> paquets al <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> i limita a %s"
++
++msgid "Action"
++msgstr "Acció"
++
++msgid "Add"
++msgstr "Afegeix"
++
++msgid "Add and edit..."
++msgstr "Afegeix i edita..."
++
++msgid "Advanced Settings"
++msgstr "Ajusts avançats"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Permet el reenviament des dels <em>zones d'origen</em>:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Permet el reenviament als <em>zones de destí</em>:"
++
++msgid "Any"
++msgstr "Qualsevol"
++
++msgid "Covered networks"
++msgstr "Xarxes cobertes"
++
++msgid "Custom Rules"
++msgstr "Regles personalitzades"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"Les regles personalitzades us permet executar ordres del iptables arbitraris "
++"que la infraestructura de tallafocs no cobreix d'altra manera. Aquests "
++"ordres s'executen després de cada reinici de tallafocs, just després el "
++"conjunt de regles per defecte s'ha carregat."
++
++msgid "Destination IP address"
++msgstr "Adreça IP de destí"
++
++msgid "Destination address"
++msgstr "Adreça de destí"
++
++msgid "Destination port"
++msgstr "Port de destí"
++
++msgid "Destination zone"
++msgstr "Zona de destí"
++
++msgid "Do not rewrite"
++msgstr "No reescriguis"
++
++msgid "Drop invalid packets"
++msgstr "Descarta els paquets invàlids"
++
++msgid "Enable"
++msgstr "Habilita"
++
++msgid "Enable NAT Loopback"
++msgstr ""
++
++msgid "Enable SYN-flood protection"
++msgstr "Habilita protecció contra la inundació SYN"
++
++msgid "Enable logging on this zone"
++msgstr "Habilita el registre d'aquesta zona"
++
++msgid "External IP address"
++msgstr "Adreça IP extern"
++
++msgid "External port"
++msgstr "Port extern"
++
++msgid "External zone"
++msgstr "Zona extern"
++
++msgid "Extra arguments"
++msgstr "Paràmetres extres"
++
++msgid "Firewall"
++msgstr "Tallafocs"
++
++msgid "Firewall - Custom Rules"
++msgstr "Tallafocs - Regles personalitzades"
++
++msgid "Firewall - Port Forwards"
++msgstr "Tallafocs - Reenviaments de port"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Tallafocs - Regles de tràfic"
++
++msgid "Firewall - Zone Settings"
++msgstr "Tallafocs - Ajusts de zona"
++
++msgid "Force connection tracking"
++msgstr "Força el rastreig de connexió"
++
++msgid "Forward"
++msgstr "Reenvia"
++
++msgid "Forward to"
++msgstr "Reenvia a"
++
++msgid "From %s in %s"
++msgstr "Des de %s en %s"
++
++msgid "From %s in %s with source %s"
++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 "General Settings"
++msgstr "Ajusts generals"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 i IPv6"
++
++msgid "IPv4 only"
++msgstr "Només IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "Només IPv6"
++
++msgid "Input"
++msgstr "Entrada"
++
++msgid "Inter-Zone Forwarding"
++msgstr "Reenviament interzonal"
++
++msgid "Internal IP address"
++msgstr "Adreça IP interna"
++
++msgid "Internal port"
++msgstr "Port intern"
++
++msgid "Internal zone"
++msgstr "Zona interna"
++
++msgid "Limit log messages"
++msgstr "Limita els missatges de registre"
++
++msgid "MSS clamping"
++msgstr "Fixació MSS"
++
++msgid "Masquerading"
++msgstr "Mascarada"
++
++msgid "Match"
++msgstr "Coincideix"
++
++msgid "Match ICMP type"
++msgstr "Coincideix amb el tipus ICMP"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++"Coincideix amb trànsit reenviat al port o rang de ports de destí donat."
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"Coincideix amb trànsit entrant dirigit al port o rang de ports de destí en "
++"aquest host donat"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++"Coincideix amb trànsit entrant originant en el host client des del port o "
++"rang de ports d'origen donat."
++
++msgid "Name"
++msgstr "Nom"
++
++msgid "New SNAT rule"
++msgstr "Nova regla SNAT"
++
++msgid "New forward rule"
++msgstr "Nova regla de reenviament"
++
++msgid "New input rule"
++msgstr "Nova regla d'entrada"
++
++msgid "New port forward"
++msgstr "Nou reenviament de port"
++
++msgid "New source NAT"
++msgstr "Nou origen NAT"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "Només coincideix amb trànsit entrant dirigit a la adreça IP donada."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "Només coincideix amb trànsit entrant des d'aquests MAC."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr "Només coincideix amb trànsit entrant des d'aquest IP o rang."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++"Només coincideix amb trànsit originant en el host client des del port o del "
++"rang de ports d'origen donat"
++
++msgid "Open ports on router"
++msgstr "Obre els ports en el encaminador"
++
++msgid "Other..."
++msgstr "Altre..."
++
++msgid "Output"
++msgstr "Sortida"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr "Passa paràmetres addicionals al iptables. Utilitzeu-ho amb cura!"
++
++msgid "Port Forwards"
++msgstr "Reenviaments de port"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"El reenviament de ports permet que els ordinadors remots en el Internet "
++"connectin a un ordinador o servei específic dins del LAN privat."
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr "Redirigeix trànsit entrant coincidit al port donat en el host intern"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Redirigeix trànsit entrant coincidit al host intern especificat"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "Restringeix la mascarada a les subxarxes de destí donades"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "Restringeix la mascarada a les subxarxes d'origen donades"
++
++msgid "Restrict to address family"
++msgstr "Restringeix a la família d'adreces"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr "Reescriu el trànsit coincidint cap a la adreça donada."
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++"Reescriu el trànsit coincidint cap al port d'origen donat. Pot ser deixat en "
++"blanc per només reescriure l'adreça IP."
++
++msgid "Rewrite to source %s"
++msgstr "Reescriu a l'origen %s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "Reescriu als orígens %s, %s"
++
++msgid "SNAT IP address"
++msgstr "Adreça IP de SNAT"
++
++msgid "SNAT port"
++msgstr "Port SNAT"
++
++msgid "Source IP address"
++msgstr "Adreça IP d'origen"
++
++msgid "Source MAC address"
++msgstr "Adreça MAC d'origen"
++
++msgid "Source NAT"
++msgstr "NAT d'origen"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"El NAT d'origen és un forma específic de mascarada que permet control de gra "
++"fi sobre l'IP d'origen utilitzat pel trànsit sortint, per exemple per "
++"associar múltiples adreces WAN a subxarxes internes."
++
++msgid "Source address"
++msgstr "Adreça d'origen"
++
++msgid "Source port"
++msgstr "Port d'origen"
++
++msgid "Source zone"
++msgstr "Zona d'origen"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"El tallafocs crea zones a les teves interfícies de xarxa per controlar el "
++"flux de tràfic de xarxa."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++"Les opcions a sota controlen les polítiques de reenviament entre aquesta "
++"zona (%s) i altres zones. <em>Zones de destí</em> cobreixen trànsit reenviat "
++"<strong>originant des de %q</strong>. <em>Zones d'origen</em> coincideixen "
++"amb trànsit reenviat des de altres zones <strong>apuntat a %q</strong>. La "
++"regla de reenviament es <em>unidirectional</em>, per exemple un reenviament "
++"de lan a wan <em>no</em> implica permís per reenviar de wan a lan també."
++
++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 ""
++"Aquesta pàgina us permet canviar propietats avançats de l'entrada de "
++"reenviament de port. En la majoria dels casos no hi ha necessitat de "
++"modificar aquests ajusts."
++
++msgid ""
++"This page allows you to change advanced properties of the traffic rule "
++"entry, such as matched source and destination hosts."
++msgstr ""
++"Aquesta pàgina us permet canviar propietats avançats de l'entrada de regla "
++"de trànsit, com als hosts d'origen i de destí coincidits."
++
++#, 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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"Aquesta secció defineix propietats comuns de %q. Les opcions <em>entrada</"
++"em> i <em>sortida</em> estableixen les polítiques per defecte per a trànsit "
++"entrant i sortint aquesta zona mentre l'opció <em>reenvia</em> descriu la "
++"política de trànsit reenviat entre xarxes distintes dins de la zona. "
++"<em>Xarxes cobertes</em> especifica quines xarxes disponibles són membres "
++"d'aquesta zona."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "A %s a %s en <var>aquest dispositiu</var>"
++
++msgid "To %s in %s"
++msgstr "A %s en %s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "A %s en <var>aquest dispositiu</var>"
++
++msgid "To %s, %s in %s"
++msgstr "A %s, %s en %s"
++
++msgid "To source IP"
++msgstr "A l'IP d'origen"
++
++msgid "To source port"
++msgstr "Al port d'origen"
++
++msgid "Traffic Rules"
++msgstr "Regles de trànsit"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"Les regles de trànsit defineixen polítiques per als paquets viatjant entre "
++"zones distintes, per exemple per a rebutjar trànsit entre certs hosts o "
++"obrir ports WAN en el encaminador."
++
++msgid "Via %s"
++msgstr "Via %s"
++
++msgid "Via %s at %s"
++msgstr "Via %s a %s"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"Podeu especificar múltiples per seleccionar \"-- personalitzat --\" i "
++"llavors introduir protocols separats per espai."
++
++msgid "Zone %q"
++msgstr "Zona %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Zona ⇒ Reenviaments"
++
++msgid "Zones"
++msgstr "Zones"
++
++msgid "accept"
++msgstr "accepta"
++
++msgid "any"
++msgstr "qualsevol"
++
++msgid "any host"
++msgstr "qualsevol host"
++
++msgid "any router IP"
++msgstr "qualsevol IP d'encaminador"
++
++msgid "any zone"
++msgstr "qualsevol zona"
++
++msgid "don't track"
++msgstr "no rastregis"
++
++msgid "drop"
++msgstr "descarta"
++
++msgid "reject"
++msgstr "rebutja"
++
++msgid "traffic"
++msgstr "trànsit"
++
++#~ msgid "Destination"
++#~ msgstr "Destí"
++
++#~ msgid "Source"
++#~ msgstr "Origen"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Port intern (opcional)"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "Regles avançades"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Les regles avançades et deixen personalitzar el teu tallafocs per les "
++#~ "teves necessitats. Només s'hi correspondran les connexions noves. Als "
++#~ "paquets que pertanyen una connexió oberta se'ls permet passar el "
++#~ "tallafocs automàticament."
++
++#~ msgid "Port forwarding"
++#~ msgstr "Readreçament de port"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "El readreçament de ports permet proveir serveis de la xarxa interna a una "
++#~ "xarxa externa."
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "Readreçament de tràfic"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "El readreçament de tràfic et permet canviar l'adreça destí dels paquets "
++#~ "reenviats."
++
++#, fuzzy
++#~ msgid "Network"
++#~ msgstr "Xarxes"
++
++#~ msgid "Traffic Control"
++#~ msgstr "Control de tràfic"
++
++#~ msgid "Zone-to-Zone traffic"
++#~ msgstr "Tràfic zona a zona"
++
++#, fuzzy
++#~ msgid ""
++#~ "Here you can specify which network traffic is allowed to flow between "
++#~ "network zones. Only new connections will be matched. Packets belonging "
++#~ "to already open connections are automatically allowed to pass the "
++#~ "firewall. If you experience occasional connection problems try enabling "
++#~ "MSS Clamping otherwise disable it for performance reasons."
++#~ msgstr ""
++#~ "Ací pots especificar quin tràfic de xarxes es permet entre les zones de "
++#~ "xarxa. Només s'hi correspondren les connexions noves. Als paquets que "
++#~ "pertanyen una connexió oberta se'ls permet passar el tallafocs "
++#~ "automàticament. Si experimentes problemes de connexió ocasionals, intenta "
++#~ "activar el Clamping MSS, si no desactiva'l per raons de rendiment."
++
++#~ msgid "Zone"
++#~ msgstr "Zona"
++
++#, fuzzy
++#~ msgid "Destination IP"
++#~ msgstr "Destí"
++
++#, fuzzy
++#~ msgid "IP address"
++#~ msgstr "Adreça IP"
++
++#, fuzzy
++#~ msgid "Source MAC-address"
++#~ msgstr "Adreça MAC d'origen"
++
++#~ msgid "Custom forwarding"
++#~ msgstr "Reenviament personalitzat"
++
++#~ msgid "Input Zone"
++#~ msgstr "Zona d'entrada"
++
++#~ msgid "Output Zone"
++#~ msgstr "Zona de sortida"
++
++#~ msgid "External Zone"
++#~ msgstr "Zona externa"
++
++#~ msgid "Source MAC"
++#~ msgstr "MAC origen"
++
++#~ msgid "Defaults"
++#~ msgstr "Per defecte"
++
++#~ msgid ""
++#~ "These are the default settings that are used if no other rules match."
++#~ msgstr ""
++#~ "Aquesta és la configuració per defecte utilitzada si no hi ha cap altra "
++#~ "regla que es correspongui."
++
++#~ msgid ""
++#~ "Zones part the network interfaces into certain isolated areas to separate "
++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag "
++#~ "enables NAT masquerading for all outgoing traffic on this zone."
++#~ msgstr ""
++#~ "Les zones parteixen les interfícies de xarxa en certes àrees aïllades per "
++#~ "separar el tràfic de xarxa. Una o més xarxes poden pertànyer a una zona. "
++#~ "El flag MASQ activa el NAT masquerading per tot el tràfic sortint "
++#~ "d'aquesta zona."
++
++#~ msgid "MASQ"
++#~ msgstr "MASQ"
++
++#~ msgid "contained networks"
++#~ msgstr "Xarxes contingudes"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/cs/firewall.po b/feeds/luci/applications/luci-app-firewall/po/cs/firewall.po
+new file mode 100644
+index 0000000..beda490
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/cs/firewall.po
+@@ -0,0 +1,579 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-21 11:22+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr "%s v %s"
++
++msgid "%s%s with %s"
++msgstr "%s%s s %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s v %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(Nepojmenovaný vstup)"
++
++msgid "(Unnamed Rule)"
++msgstr "(Nepojmenované pravidlo)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(Nepojmenovaný SNAT)"
++
++msgid "-- Please choose --"
++msgstr "-- Prosím zvolte --"
++
++msgid "-- custom --"
++msgstr "-- vlastní --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> paketů za <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr "<var>%d</var> paketů za <var>%s</var>, burst <var>%d</var> paketů."
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> a omezit na %s"
++
++msgid "Action"
++msgstr "Akce"
++
++msgid "Add"
++msgstr "Přidat"
++
++msgid "Add and edit..."
++msgstr "Přidat a upravit"
++
++msgid "Advanced Settings"
++msgstr "PokroÄilé nastavení"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Povolit přesměrování ze <em>zdrojových oblastí</em>:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Povolit přesměrování do <em>zdrojových oblastí</em>:"
++
++msgid "Any"
++msgstr "Libovolné"
++
++msgid "Covered networks"
++msgstr "Pokryté sítě"
++
++msgid "Custom Rules"
++msgstr "Vlastní pravidla"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"Vlastní pravidla vám umožňují spustit libovolné iptables příkazy, které "
++"nejsou jinak pokryté frameworkem firewallu. Příkazy jsou spuštěny po každém "
++"restartu firewallu, právÄ› po naÄtení výchozí sady pravidel."
++
++msgid "Destination IP address"
++msgstr "Cílová IP adresa"
++
++msgid "Destination address"
++msgstr "Cílová adresa"
++
++msgid "Destination port"
++msgstr "Cílový port"
++
++msgid "Destination zone"
++msgstr "Cílová oblast"
++
++msgid "Do not rewrite"
++msgstr "Nepřepisovat"
++
++msgid "Drop invalid packets"
++msgstr "Zahazovat neplatné pakety"
++
++msgid "Enable"
++msgstr "Povolit"
++
++msgid "Enable NAT Loopback"
++msgstr "Povolit NAT Loopback"
++
++msgid "Enable SYN-flood protection"
++msgstr "Povolit ochranu proti SYN-flood"
++
++msgid "Enable logging on this zone"
++msgstr "Povolit logování v této oblasti"
++
++msgid "External IP address"
++msgstr "Vnější IP adresa"
++
++msgid "External port"
++msgstr "Vnější port"
++
++msgid "External zone"
++msgstr "Vnější zóna"
++
++msgid "Extra arguments"
++msgstr "DodateÄné argumenty"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall - Custom Rules"
++msgstr "Firewall - Vlastní pravidla"
++
++msgid "Firewall - Port Forwards"
++msgstr "Firewall - Přesměrování portů"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Firewall - Pravidla síťového provozu"
++
++msgid "Firewall - Zone Settings"
++msgstr "Firewall - Nastavení zón"
++
++msgid "Force connection tracking"
++msgstr "Vynutit sledování připojení"
++
++msgid "Forward"
++msgstr "Přesměrování"
++
++msgid "Forward to"
++msgstr "Přesměrovat na"
++
++msgid "From %s in %s"
++msgstr "Z %s v %s"
++
++msgid "From %s in %s with source %s"
++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 "General Settings"
++msgstr "Obecné nastavení"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 a IPv6"
++
++msgid "IPv4 only"
++msgstr "pouze IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "pouze IPv6"
++
++msgid "Input"
++msgstr "Vstup"
++
++# nebo mimo zóny?
++msgid "Inter-Zone Forwarding"
++msgstr "Přesměrování mezi zónami"
++
++msgid "Internal IP address"
++msgstr "Vnitřní IP adresa"
++
++msgid "Internal port"
++msgstr "Vnitřní port"
++
++msgid "Internal zone"
++msgstr "Vnitřní zóna"
++
++msgid "Limit log messages"
++msgstr "Omezit logovací zprávy"
++
++msgid "MSS clamping"
++msgstr "MSS clamping"
++
++msgid "Masquerading"
++msgstr "Maškárádování"
++
++msgid "Match"
++msgstr "Shoda"
++
++msgid "Match ICMP type"
++msgstr "Odpovídá ICMP typu"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr "Vybrat provoz, přesměrovaný na zadaný port nebo rozsah portů"
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"Vybrat příchozí provoz, směrovaný na zadaný cílový port nebo rozsah portů "
++"tohoto hostitele"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++"Vybrat příchozí provoz, pocházející ze zadaného portu nebo rozsahu portů "
++"klienta."
++
++msgid "Name"
++msgstr "Název"
++
++msgid "New SNAT rule"
++msgstr "Nové pravidlo SNAT"
++
++msgid "New forward rule"
++msgstr "Nové přesměrovací pravidlo"
++
++msgid "New input rule"
++msgstr "Nové vstupní pravidlo"
++
++msgid "New port forward"
++msgstr "Nové přesměrování portu"
++
++msgid "New source NAT"
++msgstr "Nový zdrojový NAT (SNAT)"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "Vybrat pouze příchozí provoz, směrovaný na danou IP adresu."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "Vybrat pouze příchozí provoz z těchto MAC adres."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr "Vybrat pouze příchozí provoz z této IP nebo rozsahu IP adres."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++"Vybrat pouze příchozí provoz, pocházející ze zadaného portu nebo rozsahu "
++"portů klienta."
++
++msgid "Open ports on router"
++msgstr "Otevřené porty na routeru"
++
++msgid "Other..."
++msgstr "Ostatní ..."
++
++msgid "Output"
++msgstr "Výstup"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr "Předává další argumenty iptables. Používat opatrně!"
++
++msgid "Port Forwards"
++msgstr "Přesměrování portů"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"PÅ™esmÄ›rování portů (port forwarding) umožňuje vzdáleným poÄítaÄům z "
++"Internetu pÅ™ipojení k vybraným poÄítaÄům nebo službám uvnitÅ™ privátní sítÄ› "
++"LAN."
++
++msgid "Protocol"
++msgstr "Protokol"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++"Přesměrovat vybraný příchozí provoz na uvedený port vnitřního hostitele."
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Přesměrovat vybraný příchozí provoz na uvedeného vnitřního hostitele."
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "Omezit maškarádování na uvedené cílové podsítě"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "Omezit maškarádování na uvedené zdrojové podsítě"
++
++msgid "Restrict to address family"
++msgstr "Omezit na rodinu adres"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr "Přepsat shodný provoz na uvedenou adresu."
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++"Přepsat shodný provoz na uvedený zdrojový port. Může zůstat prázdné, pak "
++"bude přepsána pouze IP adresa."
++
++msgid "Rewrite to source %s"
++msgstr "Přepsat na zdrojovou %s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "Přepsat na zdrojovou %s, %s"
++
++msgid "SNAT IP address"
++msgstr "IP adresa SNATu"
++
++msgid "SNAT port"
++msgstr "Port SNATu"
++
++msgid "Source IP address"
++msgstr "Zdrojová IP adresa"
++
++msgid "Source MAC address"
++msgstr "Zdrojová MAC adresa"
++
++msgid "Source NAT"
++msgstr "Zdrojový NAT"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"Zdrojový NAT je specifická forma maškarádování, která umožňuje jemnozrnnou "
++"kontrolu nad zdrojovými IP, použitými pro odchozí provoz. Využívá se "
++"například pro mapování množství WAN adres do vnitřních podsítí."
++
++msgid "Source address"
++msgstr "Zdrojová adresa"
++
++msgid "Source port"
++msgstr "Zdrojový port"
++
++msgid "Source zone"
++msgstr "Zdrojová zóna"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"Firewall vytváří zóny pÅ™es vaÅ¡e síťová rozhraní za úÄelem řízení síťového "
++"provozu."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++"Níže uvedené možnosti řídí přesměrovací politiky mezi touto zónou (%s) a "
++"ostatními zónami. <em>Cílové zóny</em> pokrývají přesměrovávaný provoz, "
++"<strong>pocházející z %q</strong>. <em>Zdrojové zóny</em> porovnávají "
++"přesměrovávaný provoz z ostatních zón, <strong>zaměřený na %q</strong>. "
++"Přesměrovávací pravidlo je <em>jednosměrné</em>, například přesměrování z "
++"lan do wan <em>nepovoluje</em> přesměrování z wan do lan (a naopak)."
++
++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 ""
++"Tato stránka vám umožňuje zmÄ›nit pokroÄilé vlastností pÅ™esmÄ›rování portů. Ve "
++"většině případů není potřeba upravovat tato nastavení."
++
++msgid ""
++"This page allows you to change advanced properties of the traffic rule "
++"entry, such as matched source and destination hosts."
++msgstr ""
++"Tato stránka vám umožňuje zmÄ›nit pokroÄilé vlastnosti pravidla síťového "
++"provozu, například zdrojové a cílové hostitele."
++
++#, 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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"Tato sekce definuje běžné možnosti %q. <em>Vstupní</em> a <em>výstupní</em> "
++"možnosti nastavují výchozí politiky pro provoz, vstupující do této zóny a "
++"vystupující z ní, zatímco <em>přesměrovací</em> možnosti popisují politiku "
++"pro přesměrování provozu mezi rozdílnými sítěmi uvnitř jedné zóny.<em> "
++"Pokryté sítÄ›</em> urÄuje, které z dostupných sítí jsou Äleny této zóny."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "Na %s v %s na <var>tomto zařízení</var>"
++
++msgid "To %s in %s"
++msgstr "Na %s v %s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "Na %s na <var>tomto zařízení</var>"
++
++msgid "To %s, %s in %s"
++msgstr "Na %s, %s v %s"
++
++msgid "To source IP"
++msgstr "Na zdrojovou IP"
++
++msgid "To source port"
++msgstr "Na zdrojový port"
++
++msgid "Traffic Rules"
++msgstr "Pravidla síťového provozu"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"Pravidla síťového provozu definují politiky pro cestování paketů mezi "
++"různými zónami, například pro odmítnutí provozu mezi jistými hostiteli nebo "
++"pro otevření WAN portů na routeru."
++
++msgid "Via %s"
++msgstr "Prostřednictvím %s"
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"Lze urÄit více protokolů. Vyberte \"-- vlastní --\" a vkládejte protokoly "
++"oddělené mezerou."
++
++msgid "Zone %q"
++msgstr "Zóna %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Zóna ⇒ Přesměrování"
++
++msgid "Zones"
++msgstr "Zóny"
++
++msgid "accept"
++msgstr "přijmout"
++
++msgid "any"
++msgstr "libovolný"
++
++msgid "any host"
++msgstr "libovolný hostitel"
++
++msgid "any router IP"
++msgstr "libovolná IP routeru"
++
++msgid "any zone"
++msgstr "libovolná zóna"
++
++msgid "don't track"
++msgstr "nesledovat"
++
++msgid "drop"
++msgstr "zahodit"
++
++msgid "reject"
++msgstr "odmítnout"
++
++msgid "traffic"
++msgstr "provoz"
++
++#~ msgid "Destination"
++#~ msgstr "Cíl"
++
++#~ msgid "Family"
++#~ msgstr "Rodina"
++
++#~ msgid "Forward to %s in %s"
++#~ msgstr "Přesměrovat na %s v %s"
++
++#~ msgid "Forward to %s, %s in %s"
++#~ msgstr "Přesměrovat na %s, %s v %s"
++
++#~ msgid "SNAT"
++#~ msgstr "SNAT"
++
++#~ msgid "Source"
++#~ msgstr "Zdroj"
++
++#~ msgid "To %s"
++#~ msgstr "Na %s"
++
++#~ msgid "To %s at %s"
++#~ msgstr "Na %s v %s"
++
++#~ msgid "Via"
++#~ msgstr "přes"
++
++#~ msgid "Accept forward"
++#~ msgstr "Přijmout přesměrování"
++
++#~ msgid "Accept input"
++#~ msgstr "Přijmout vstup"
++
++#~ msgid "Disable"
++#~ msgstr "Zakázat"
++
++#~ msgid "Discard forward"
++#~ msgstr "Zahodit přesměrování"
++
++#~ msgid "Discard input"
++#~ msgstr "Zahodit vstup"
++
++#~ msgid "Do not track forward"
++#~ msgstr "Nesledovat přesměrování"
++
++#~ msgid "Do not track input"
++#~ msgstr "Nesledovat vstup"
++
++#~ msgid "IP"
++#~ msgstr "IP"
++
++#~ msgid "IP range"
++#~ msgstr "IP rozsah"
++
++#~ msgid "IPs"
++#~ msgstr "IP"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MACs"
++#~ msgstr "MAC"
++
++#~ msgid "Refuse forward"
++#~ msgstr "Odmítnout přesměrování"
++
++#~ msgid "Refuse input"
++#~ msgstr "Odmítnout vstup"
++
++#~ msgid "Rule is disabled"
++#~ msgstr "Pravidlo je zakázané"
++
++#~ msgid "Rule is enabled"
++#~ msgstr "Pravidlo je povolené"
++
++#~ msgid "day"
++#~ msgstr "den"
++
++#~ msgid "hour"
++#~ msgstr "hodina"
++
++#~ msgid "minute"
++#~ msgstr "minuta"
++
++#~ msgid "not"
++#~ msgstr "ne"
++
++#~ msgid "port"
++#~ msgstr "port"
++
++#~ msgid "ports"
++#~ msgstr "porty"
++
++#~ msgid "second"
++#~ msgstr "sekunda"
++
++#~ msgid "type"
++#~ msgstr "typ"
++
++#~ msgid "types"
++#~ msgstr "typy"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/de/firewall.po b/feeds/luci/applications/luci-app-firewall/po/de/firewall.po
+new file mode 100644
+index 0000000..0e5ddcf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/de/firewall.po
+@@ -0,0 +1,748 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2014-03-25 02:04+0200\n"
++"Last-Translator: laryllian <my-lucl@laryllian.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr "%s in %s"
++
++msgid "%s%s with %s"
++msgstr "%s%s mit %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s in %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(Unbenannter Eintrag)"
++
++msgid "(Unnamed Rule)"
++msgstr "(Unbenannte Regel)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(Unbennanter SNAT-Eintrag)"
++
++msgid "-- Please choose --"
++msgstr "-- Bitte wählen --"
++
++msgid "-- custom --"
++msgstr "-- benutzerdefiniert --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> Pkte. pro <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr "<var>%d</var> Pkte. pro <var>%s</var>, Häufung <var>%d</var> Pkte."
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> und limitieren auf %s"
++
++msgid "Action"
++msgstr "Aktion"
++
++msgid "Add"
++msgstr "Hinzufügen"
++
++msgid "Add and edit..."
++msgstr "Hinzufügen und bearbeiten..."
++
++msgid "Advanced Settings"
++msgstr "Erweiterte Einstellungen"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Erlaube Weiterleitung von <em>Quellzone</em>:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Erlaube Weiterleitung zu <em>Zielzone</em>:"
++
++msgid "Any"
++msgstr "beliebig"
++
++msgid "Covered networks"
++msgstr "Abgedeckte Netzwerke"
++
++msgid "Custom Rules"
++msgstr "Benutzerdefinierte Regeln"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"Benutzerdefinierte Regeln ermöglichen das Ausführen belieber iptables-"
++"Befehle welche durch das Firewall-Framework nicht unterstützt werden. Die "
++"Befehle werden mit jedem Firewall-Neustart abgearbeitet, direkt nach dem "
++"Laden der Basisregeln."
++
++msgid "Destination IP address"
++msgstr "Ziel IP-Adresse"
++
++msgid "Destination address"
++msgstr "Zieladresse"
++
++msgid "Destination port"
++msgstr "Zielport"
++
++msgid "Destination zone"
++msgstr "Ziel-Zone"
++
++msgid "Do not rewrite"
++msgstr "Nicht umschreiben"
++
++msgid "Drop invalid packets"
++msgstr "Ungültige Pakete verwerfen"
++
++msgid "Enable"
++msgstr "Aktivieren"
++
++msgid "Enable NAT Loopback"
++msgstr "NAT-Loopback aktivieren"
++
++msgid "Enable SYN-flood protection"
++msgstr "Schutz vor SYN-flood-Attacken"
++
++msgid "Enable logging on this zone"
++msgstr "Protokollierung innerhalb der Zone aktivieren"
++
++msgid "External IP address"
++msgstr "Externe IP-Adresse"
++
++msgid "External port"
++msgstr "Externer Port"
++
++msgid "External zone"
++msgstr "Externe Zone"
++
++msgid "Extra arguments"
++msgstr "Zusätzliche Argumente"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall - Custom Rules"
++msgstr "Firewall - Benutzerdefinierte Regeln"
++
++msgid "Firewall - Port Forwards"
++msgstr "Firewall - Portweiterleitungen"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Firewall - Verkehrsregeln"
++
++msgid "Firewall - Zone Settings"
++msgstr "Firewall - Zoneneinstellungen"
++
++msgid "Force connection tracking"
++msgstr "Connectiontracking erzwingen"
++
++msgid "Forward"
++msgstr "Weitergeleitet"
++
++msgid "Forward to"
++msgstr "Weiterleiten an"
++
++msgid "From %s in %s"
++msgstr "Von %s in %s"
++
++msgid "From %s in %s with source %s"
++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 "General Settings"
++msgstr "Allgemein"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 und IPv6"
++
++msgid "IPv4 only"
++msgstr "nur IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "nur IPv6"
++
++msgid "Input"
++msgstr "Eingang"
++
++msgid "Inter-Zone Forwarding"
++msgstr "Weiterleitungen zwischen Zonen"
++
++msgid "Internal IP address"
++msgstr "Interne IP-Adresse"
++
++msgid "Internal port"
++msgstr "Interner Port"
++
++msgid "Internal zone"
++msgstr "Interne Zone"
++
++msgid "Limit log messages"
++msgstr "Protokollnachrichten limitieren"
++
++msgid "MSS clamping"
++msgstr "MSS Korrektur"
++
++msgid "Masquerading"
++msgstr "NAT aktivieren"
++
++msgid "Match"
++msgstr "Filter"
++
++msgid "Match ICMP type"
++msgstr "Nach ICMP-Typ filtern"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr "Selektiert weitergeleiteten Verkehr nach den angegebenen Ziel-Ports."
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"Eingehende Verbindungen filtern welche an den angegebenen Port oder "
++"Portbereich auf dem lokalen Gerät gerichtet sind"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr "Selektiert eingehenden Verkehr nach den angegebenen Quell-Ports."
++
++msgid "Name"
++msgstr "Name"
++
++msgid "New SNAT rule"
++msgstr "Neue SNAT-Regel"
++
++msgid "New forward rule"
++msgstr "Neuer Weiterleitungsregel"
++
++msgid "New input rule"
++msgstr "Neue Eingangsregel"
++
++msgid "New port forward"
++msgstr "Neue Portweiterleitung"
++
++msgid "New source NAT"
++msgstr "Neues SNAT"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "Selektiere nur Verkehr der an die angegebene IP-Adresse gerichtet ist."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "Selektiere nur Verkehr von den angegebenen MAC-Adressen."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr "Selektiere nur Verkehr vom angebenem Quell-IP-Adressbereich."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr "Selektiere nur Verkehr von den angegebenen Quell-Ports auf dem Client."
++
++msgid "Open ports on router"
++msgstr "Ports auf dem Router öffnen"
++
++msgid "Other..."
++msgstr "Anderes..."
++
++msgid "Output"
++msgstr "Ausgang"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++"Gibt zusätzliche Kommandozeilenargumente an iptables weiter. Mit Vorsicht "
++"benutzen!"
++
++msgid "Port Forwards"
++msgstr "Portweiterleitungen"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"Portweiterleitungen ermöglichen es entfernten Rechnern im Internet auf "
++"bestimmte Computer oder Dienste im lokalen LAN zuzugreifen."
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++"Gefilterte Verbindungen an den angegeben Port auf dem internen Host "
++"weiterleiten"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Gefilterte Verbindungen an den angegeben internen Host weiterleiten"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "NAT auf die angegebenen Ziel-Subnetze beschränken"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "NAT auf die angegebenen Quell-Subnetze beschränken"
++
++msgid "Restrict to address family"
++msgstr "Beschränke auf Adressfamilie"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr "Schreibe selektierten Verkehr auf die angegebene Quell-IP-Adresse um."
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++"Schreibe selektierten Verkehr auf den angegebenen Qull-Port um. Kann leer "
++"gelassen werden um nur die IP-Adresse umzuschreiben."
++
++msgid "Rewrite to source %s"
++msgstr "Schreibe um auf Quell-%s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "Schreibe um auf Quell-%s, %s"
++
++msgid "SNAT IP address"
++msgstr "SNAT-IP-Adresse"
++
++msgid "SNAT port"
++msgstr "SNAT-Port"
++
++msgid "Source IP address"
++msgstr "Quell-IP-Adresse"
++
++msgid "Source MAC address"
++msgstr "Quell-MAC-Adresse"
++
++msgid "Source NAT"
++msgstr "Source NAT"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"Source NAT ist eine spezifische From von NAT, welche volle Kontrolle über "
++"die verwendete Quell-IP-Adresse für ausgehenden Verkehr zulässt, zum "
++"Beispiel um mehrere WAN-IP-Adressen auf interne Subnetze abzubilden."
++
++msgid "Source address"
++msgstr "Quelladresse"
++
++msgid "Source port"
++msgstr "Quellport"
++
++msgid "Source zone"
++msgstr "Quell-Zone"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"Die Firewall erstellt Netzwerkzonen über bestimmte Netzwerkschnittstellen um "
++"den Netzverkehr zu trennen."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++"Die untenstehenen Optionen regeln die Verfahreinsweisen für Verkehr zwischen "
++"dieser Zone (%s) und anderen Zonen. <em>Ziel-Zonen</em> decken "
++"weitergeleiteten Verkehr <strong>von %q</strong> ab. <em>Quell-Zonen</em> "
++"treffen auf weitergeleiteten Verkehr aus anderen Zonen zu, welcher "
++"<strong>an %q gerichtet</strong> ist. Die Weiterleitung gilt nur in eine "
++"Richtung, d.h. eine erlaubte Weiterleitung von LAN nach WAN impliziert "
++"<em>nicht</em> zusätzlich die Erlaubnis, auch von WAN nach LAN "
++"weiterzuleiten."
++
++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 ""
++"Diese Seite bietet Zugriff auf die erweiterten Eigenschaften der "
++"Portweiterleitung. In den meisten Fällen ist es unnötig die Eigenschaften zu "
++"ändern."
++
++msgid ""
++"This page allows you to change advanced properties of the traffic rule "
++"entry, such as matched source and destination hosts."
++msgstr ""
++"Diese Seite bietet Zugriff auf die erweiterten Eigenschaften der "
++"Verkehrsregel, zum Beispiel die Selektion nach Quell- und Zieladressen."
++
++#, 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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"Diese Sektion definiert allgemeine Eigenschaften der %q Zone. Die "
++"<em>Eingang</em> und <em>Ausgang</em> Optionen regeln die Verfahrensweise "
++"für Verkehr der in diese Zone eintritt oder diese verlässt. "
++"<em>Weitergeleitet</em> trifft auf Verkehr zwischen verschiedenen "
++"Schnittstellen innerhalb dieser Zone zu. <em>Abgedeckte Netzwerke</em> "
++"definieren die Zugehörigkeit von Schnittstellen zu dieser Zone."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "Zu %s an %s auf <var>diesem Gerät</var>"
++
++msgid "To %s in %s"
++msgstr "Zu %s in %s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "Zu %s auf <var>diesem Gerät</var>"
++
++msgid "To %s, %s in %s"
++msgstr "Zu %s, %s in %s"
++
++msgid "To source IP"
++msgstr "Zu Quell-IP"
++
++msgid "To source port"
++msgstr "Zu Quell-Port"
++
++msgid "Traffic Rules"
++msgstr "Verkehrsregeln"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"Verkehrsregeln bestimmen den Fluss der Pakete zwischen verschiedenen Zonen, "
++"zum Beispiel um Verkehr zwischen bestimmten Rechnern zu unterbinden oder um "
++"WAN-Ports auf dem Router zu öffnen."
++
++msgid "Via %s"
++msgstr "Ãœber %s"
++
++msgid "Via %s at %s"
++msgstr "Ãœber %s an %s"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"Durch die Auswahl von \"-- benutzerdefiniert --\" könnene mehrere Werte "
++"durch Leerzeichen getrennt angegeben werden."
++
++msgid "Zone %q"
++msgstr "Zone %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Zone ⇒ Weiterleitungen"
++
++msgid "Zones"
++msgstr "Zonen"
++
++# Die richtige Ãœbersetzung von ACCEPT im Firewallkontext ist nicht "Annehmen" sondern "Zulassen". Man kann ja keinen
++# ausgehenden Verkehr annehmen.
++msgid "accept"
++msgstr "zulassen"
++
++msgid "any"
++msgstr "beliebig"
++
++msgid "any host"
++msgstr "beliebiger Rechner"
++
++msgid "any router IP"
++msgstr "beliebige Router-IP"
++
++msgid "any zone"
++msgstr "beliebige Zone"
++
++msgid "don't track"
++msgstr "nicht verfolgen"
++
++msgid "drop"
++msgstr "verwerfen"
++
++msgid "reject"
++msgstr "zurückweisen"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "Ziel"
++
++#~ msgid "Family"
++#~ msgstr "Adressfamilie"
++
++#~ msgid "Forward to %s in %s"
++#~ msgstr "Weiterleiten zu %s in %s"
++
++#~ msgid "Forward to %s, %s in %s"
++#~ msgstr "Weiterleiten zu %s, %s in %s"
++
++#~ msgid "SNAT"
++#~ msgstr "SNAT"
++
++#~ msgid "Source"
++#~ msgstr "Quelle"
++
++#~ msgid "To %s"
++#~ msgstr "Zu %s"
++
++#~ msgid "To %s at %s"
++#~ msgstr "Zu %s an %s"
++
++#~ msgid "Via"
++#~ msgstr "Ãœber"
++
++#~ msgid "Accept forward"
++#~ msgstr "Weiterleitung erlauben"
++
++#~ msgid "Accept input"
++#~ msgstr "Eingang erlauben"
++
++#~ msgid "Disable"
++#~ msgstr "Daktivieren"
++
++#~ msgid "Discard forward"
++#~ msgstr "Weiterleitung verwerfen"
++
++#~ msgid "Discard input"
++#~ msgstr "Eingang verwerfen"
++
++#~ msgid "Do not track forward"
++#~ msgstr "Weiterleitung nicht verfolgen"
++
++#~ msgid "Do not track input"
++#~ msgstr "Eingang nicht verfolgen"
++
++#~ msgid "IP"
++#~ msgstr "IP"
++
++#~ msgid "IP range"
++#~ msgstr "IP-Bereich"
++
++#~ msgid "IPs"
++#~ msgstr "IPs"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MACs"
++#~ msgstr "MACs"
++
++#~ msgid "Refuse forward"
++#~ msgstr "Weiterleitung zurückweisen"
++
++#~ msgid "Refuse input"
++#~ msgstr "Eingang zurückweisen"
++
++#~ msgid "Rule is disabled"
++#~ msgstr "Regel ist deaktiviert"
++
++#~ msgid "Rule is enabled"
++#~ msgstr "Regel ist aktiviert"
++
++#~ msgid "day"
++#~ msgstr "Tag"
++
++#~ msgid "hour"
++#~ msgstr "Stunde"
++
++#~ msgid "minute"
++#~ msgstr "Minute"
++
++#~ msgid "not"
++#~ msgstr "nicht"
++
++#~ msgid "port"
++#~ msgstr "Port"
++
++#~ msgid "ports"
++#~ msgstr "Ports"
++
++#~ msgid "second"
++#~ msgstr "Sekunde"
++
++#~ msgid "type"
++#~ msgstr "Typ"
++
++#~ msgid "types"
++#~ msgstr "Typen"
++
++#~ msgid "(optional)"
++#~ msgstr "(optional)"
++
++#~ msgid "Intended destination address"
++#~ msgstr "Gewünschte Zieladresse"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Interner Port (optional)"
++
++#~ msgid "Accept"
++#~ msgstr "Akzeptiere"
++
++#~ msgid "Discard"
++#~ msgstr "Verwerfe"
++
++#~ msgid "Advanced Options"
++#~ msgstr "Erweiterte Optionen"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "Erweiterte Regeln"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Mit erweiterten Regeln kann die Firewall an die eigenen Bedürfnisse "
++#~ "angepasst werden. Es werden nur neue Verbindungen betrachtet. Pakete, die "
++#~ "zu bereits bestehenden Verbindungen gehören werden automatisch akzeptiert."
++
++#~ msgid "Custom Rules (/etc/firewall.user)"
++#~ msgstr "Benutzerdefinierte Regeln (/etc/firewall.user)"
++
++#~ msgid "Device"
++#~ msgstr "Gerät"
++
++#~ msgid ""
++#~ "For DNAT, match incoming traffic directed at the given destination ip "
++#~ "address. For SNAT rewrite the source address to the given address."
++#~ msgstr ""
++#~ "Für DNAT Regeln wird der Verkehr nach der angegeben Zieladresse "
++#~ "gefiltert. Bei SNAT Regeln ist dieses die Quelladresse für umgeschriebene "
++#~ "Pakete."
++
++#~ msgid ""
++#~ "Match incoming traffic originating from the given source port or port "
++#~ "range on the client host"
++#~ msgstr ""
++#~ "Eingehende Verbindungen filtern welche von dem angegebenen Port oder "
++#~ "Portbereich des Clients ausgehen"
++
++#~ msgid "Overview"
++#~ msgstr "Ãœbersicht"
++
++#~ msgid "Port forwarding"
++#~ msgstr "Portweiterleitung"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "Portweiterleitungen ermöglichen es interne Netzwerkdienste aus einem "
++#~ "externen Netzwerk heraus erreichbar zu machen."
++
++#~ msgid "Redirection type"
++#~ msgstr "Typ der Weiterleitung"
++
++#~ msgid "Redirections"
++#~ msgstr "Weiterleitungen"
++
++#~ msgid "Rules"
++#~ msgstr "Regeln"
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "Umleitungen"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "Umleitungen erlauben es das Ziel von weitergeleiteten Paketen zu "
++#~ "verändern."
++
++#, fuzzy
++#~ msgid "Network"
++#~ msgstr "Netzwerke"
++
++#~ msgid "Traffic Control"
++#~ msgstr "Verkehrskontrolle"
++
++#~ msgid "Zone-to-Zone traffic"
++#~ msgstr "Zone-zu-Zone Verkehr"
++
++#, fuzzy
++#~ msgid ""
++#~ "Here you can specify which network traffic is allowed to flow between "
++#~ "network zones. Only new connections will be matched. Packets belonging "
++#~ "to already open connections are automatically allowed to pass the "
++#~ "firewall. If you experience occasional connection problems try enabling "
++#~ "MSS Clamping otherwise disable it for performance reasons."
++#~ msgstr ""
++#~ "An dieser Stelle kann festgelegt zwischen welchen Zonen Netzverkehr hin "
++#~ "und her fließen kann. Es werden nur neue Verbindungen betrachtet. Pakete, "
++#~ "die zu bereits bestehenden Verbindungen gehören werden automatisch "
++#~ "akzeptiert. Bei gelegentlich auftretenden Verbindungsproblemen kann MSS "
++#~ "Clamping helfen, ansonsten sollte dies aus Performancegründen deaktiviert "
++#~ "bleiben."
++
++#~ msgid "Zone"
++#~ msgstr "Zone"
++
++#, fuzzy
++#~ msgid "Destination IP"
++#~ msgstr "Ziel"
++
++#, fuzzy
++#~ msgid "IP address"
++#~ msgstr "IP-Adresse"
++
++#, fuzzy
++#~ msgid "Source MAC-address"
++#~ msgstr "Quell-MAC-Adresse"
++
++#~ msgid "Custom forwarding"
++#~ msgstr "Erweiterte Weiterleitung"
++
++#~ msgid "Input Zone"
++#~ msgstr "Eingangszone"
++
++#~ msgid "Output Zone"
++#~ msgstr "Ausgangszone"
++
++#~ msgid "External Zone"
++#~ msgstr "Externe Zone"
++
++#~ msgid "Source MAC"
++#~ msgstr "Quell-MAC-Adresse"
++
++#~ msgid "Defaults"
++#~ msgstr "Grundeinstellungen"
++
++#~ msgid ""
++#~ "These are the default settings that are used if no other rules match."
++#~ msgstr ""
++#~ "Grundeinstellungen die verwendet werden, wenn keine andere Regel "
++#~ "angewandt werden kann."
++
++#~ msgid ""
++#~ "Zones part the network interfaces into certain isolated areas to separate "
++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag "
++#~ "enables NAT masquerading for all outgoing traffic on this zone."
++#~ msgstr ""
++#~ "Zonen teilen das Netzwerk in mehrere Bereiche ein um Netzverkehr sicher "
++#~ "zu trennen. Ein oder mehrere Netzwerke gehören zu einer Zone. Das MASQ-"
++#~ "Flag legt fest, dass aller ausgehende Netzverkehr einer Zone NAT-maskiert "
++#~ "wird."
++
++#~ msgid "MASQ"
++#~ msgstr "MASQ"
++
++#~ msgid "contained networks"
++#~ msgstr "verbundene Netzwerke"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/el/firewall.po b/feeds/luci/applications/luci-app-firewall/po/el/firewall.po
+new file mode 100644
+index 0000000..dbd0b9e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/el/firewall.po
+@@ -0,0 +1,638 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2012-03-31 15:40+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr "%s%s με %s"
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr ""
++
++msgid "(Unnamed Rule)"
++msgstr ""
++
++msgid "(Unnamed SNAT)"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr "-- ΠαÏακαλώ επιλέξτε --"
++
++msgid "-- custom --"
++msgstr "-- Ï€ÏοσαÏμοσμένο --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> πκτ. ανά <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr "ΕνέÏγεια"
++
++msgid "Add"
++msgstr "ΠÏοσθήκη"
++
++msgid "Add and edit..."
++msgstr "ΠÏοσθήκη και επεξεÏγασία..."
++
++msgid "Advanced Settings"
++msgstr "Ρυθμίσεις για Ï€ÏοχωÏημένους"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr ""
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr ""
++
++msgid "Any"
++msgstr "Οποιοδήποτε"
++
++msgid "Covered networks"
++msgstr ""
++
++msgid "Custom Rules"
++msgstr "ΠÏοσαÏμοσμένοι Κανόνες"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++
++msgid "Destination IP address"
++msgstr "ΔιεÏθυνση IP Ï€ÏοοÏισμοÏ"
++
++msgid "Destination address"
++msgstr "ΔιεÏθυνση Ï€ÏοοÏισμοÏ"
++
++msgid "Destination port"
++msgstr "ΘÏÏα Ï€ÏοοÏισμοÏ"
++
++#, fuzzy
++msgid "Destination zone"
++msgstr "Ζώνη Ï€ÏοοÏισμοÏ"
++
++msgid "Do not rewrite"
++msgstr ""
++
++msgid "Drop invalid packets"
++msgstr "Αγνόηση μη-έγκυÏων πακετών"
++
++msgid "Enable"
++msgstr "ΕνεÏγοποίηση"
++
++msgid "Enable NAT Loopback"
++msgstr ""
++
++#, fuzzy
++msgid "Enable SYN-flood protection"
++msgstr "ΠÏοστασία SYN-flood"
++
++msgid "Enable logging on this zone"
++msgstr ""
++
++msgid "External IP address"
++msgstr "ΕξωτεÏική διεÏθυνση IP"
++
++msgid "External port"
++msgstr "ΕξωτεÏική θÏÏα"
++
++msgid "External zone"
++msgstr ""
++
++msgid "Extra arguments"
++msgstr "Επιπλέον παÏάμετÏοι"
++
++msgid "Firewall"
++msgstr "Τείχος Ï€Ïοστασίας"
++
++msgid "Firewall - Custom Rules"
++msgstr "Τείχος Ï€Ïοστασίας - ΠÏοσαÏμοσμένοι Κανόνες"
++
++msgid "Firewall - Port Forwards"
++msgstr "Τείχος Ï€Ïοστασίας - ΠÏοώθηση ΘυÏών"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Τείχος Ï€Ïοστασίας - Κανόνες Κίνησεις"
++
++msgid "Firewall - Zone Settings"
++msgstr "Τείχος Ï€Ïοστασίας - Ρυθμίσεις Ζώνης"
++
++msgid "Force connection tracking"
++msgstr "Επιβολή παÏακολοÏθησης σÏνδεσης"
++
++msgid "Forward"
++msgstr "ΠÏοώθηση"
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr "Απο %s στο %s"
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr "Γενικές Ρυθμίσεις"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 και IPv6"
++
++msgid "IPv4 only"
++msgstr "Μόνο IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "Μόνο IPv6"
++
++msgid "Input"
++msgstr "Είσοδος"
++
++msgid "Inter-Zone Forwarding"
++msgstr ""
++
++#, fuzzy
++msgid "Internal IP address"
++msgstr "ΕσωτεÏική διεÏθυνση"
++
++#, fuzzy
++msgid "Internal port"
++msgstr "ΕξωτεÏική θÏÏα"
++
++msgid "Internal zone"
++msgstr "ΕσωτεÏική ζώνη"
++
++msgid "Limit log messages"
++msgstr "ΠεÏιοÏισμός καταγÏαφών συστήματος"
++
++#, fuzzy
++msgid "MSS clamping"
++msgstr "ΠεÏιοÏισμός MSS"
++
++msgid "Masquerading"
++msgstr ""
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr ""
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr "Όνομα"
++
++msgid "New SNAT rule"
++msgstr ""
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr ""
++
++msgid "New port forward"
++msgstr ""
++
++msgid "New source NAT"
++msgstr ""
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr ""
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr ""
++
++msgid "Other..."
++msgstr "Άλλο..."
++
++msgid "Output"
++msgstr "Έξοδος"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr "ΠÏοώθηση ΘυÏών"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++
++msgid "Protocol"
++msgstr "ΠÏωτόκολλο"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr ""
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr ""
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr ""
++
++msgid "SNAT port"
++msgstr ""
++
++#, fuzzy
++msgid "Source IP address"
++msgstr "ΔιεÏθυνση MAC πηγής"
++
++msgid "Source MAC address"
++msgstr ""
++
++msgid "Source NAT"
++msgstr ""
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++#, fuzzy
++msgid "Source address"
++msgstr "ΔιεÏθυνση MAC πηγής"
++
++msgid "Source port"
++msgstr "ΘÏÏα πηγής"
++
++#, fuzzy
++msgid "Source zone"
++msgstr "ΘÏÏα πηγής"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"Το τείχος Ï€Ïοστασίας δημιουÏγεί ζώνες πάνω στις διεπαφές δικτÏου για να "
++"ελέγχει την δικτυακή κίνηση."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr ""
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr ""
++
++msgid "Zone ⇒ Forwardings"
++msgstr ""
++
++msgid "Zones"
++msgstr "Ζώνες"
++
++msgid "accept"
++msgstr "αποδοχή"
++
++msgid "any"
++msgstr ""
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr "αγνόηση"
++
++msgid "reject"
++msgstr "απόÏÏιψη"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "ΠÏοοÏισμός"
++
++#~ msgid "Family"
++#~ msgstr "Οικογένεια"
++
++#~ msgid "Forward to %s in %s"
++#~ msgstr "ΠÏοώθηση του %s στο %s"
++
++#~ msgid "Forward to %s, %s in %s"
++#~ msgstr "ΠÏοώθηση στο %s, %s στο %s"
++
++#~ msgid "SNAT"
++#~ msgstr "SNAT"
++
++#~ msgid "Source"
++#~ msgstr "Πηγή"
++
++#~ msgid "To %s"
++#~ msgstr "ΠÏος %s"
++
++#~ msgid "Accept forward"
++#~ msgstr "Αποδοχή Ï€Ïοώθησης"
++
++#~ msgid "Accept input"
++#~ msgstr "Αποδοχή εισόδου"
++
++#~ msgid "Disable"
++#~ msgstr "ΑπενεÏγοποίηση"
++
++#~ msgid "IP"
++#~ msgstr "IP"
++
++#~ msgid "IP range"
++#~ msgstr "ΕÏÏος IP"
++
++#~ msgid "IPs"
++#~ msgstr "IPs"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MACs"
++#~ msgstr "MACs"
++
++#~ msgid "Refuse forward"
++#~ msgstr "ΆÏνηση Ï€Ïοώθησης"
++
++#~ msgid "Refuse input"
++#~ msgstr "ΆÏνηση εισόδου"
++
++#~ msgid "day"
++#~ msgstr "ημέÏα"
++
++#~ msgid "hour"
++#~ msgstr "ÏŽÏα"
++
++#~ msgid "minute"
++#~ msgstr "λεπτό"
++
++#~ msgid "port"
++#~ msgstr "θÏÏα"
++
++#~ msgid "ports"
++#~ msgstr "θÏÏες"
++
++#~ msgid "second"
++#~ msgstr "δευτεÏόλεπτο"
++
++#~ msgid "type"
++#~ msgstr "Ï„Ïπος"
++
++#~ msgid "types"
++#~ msgstr "Ï„Ïποι"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "ΕσωτεÏική θÏÏα (Ï€ÏοαιÏετικό)"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "ΠÏοχωÏημένοι Κανόνες"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Οι Ï€ÏοχωÏημένοι κανόνες σας επιτÏέπουν να Ï€ÏοσαÏμόσετε το τείχος "
++#~ "Ï€Ïοστασίας στις δικές σας ανάγκες. Οι κανόνες θα εφαÏμόζονται μόνο στις "
++#~ "νέες συνδέσεις. Πακέτα που ανήκουν σε ήδη ανοιχτές συνδέσεις, θα πεÏνάνε "
++#~ "αυτόματα το τείχος Ï€Ïοστασίας."
++
++#~ msgid "Port forwarding"
++#~ msgstr "ΠÏοώθηση θυÏών"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "Η Ï€Ïοώθηση θυÏών επιτÏέπει σε υπηÏεσίες δικτÏου που λειτουÏγοÏν μέσα σε "
++#~ "ένα εσωτεÏικό δίκτυο, να γίνονται διαθέσιμες και σε ένα εξωτεÏικό."
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "ΑνακατεÏθυνση Κίνησης"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "Η ανακατεÏθυνση κίνησης σας επιτÏέπει να αλλάξετε την διεÏθυνση "
++#~ "Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï„Ï‰Î½ Ï€Ïοωθημένων πακέτων."
++
++#, fuzzy
++#~ msgid "Network"
++#~ msgstr "Δίκτυα"
++
++#~ msgid "Traffic Control"
++#~ msgstr "Έλεγχος Κίνησης"
++
++#~ msgid "Zone-to-Zone traffic"
++#~ msgstr "Κίνηση Ζώνης-Ï€Ïος-Ζώνη"
++
++#, fuzzy
++#~ msgid ""
++#~ "Here you can specify which network traffic is allowed to flow between "
++#~ "network zones. Only new connections will be matched. Packets belonging "
++#~ "to already open connections are automatically allowed to pass the "
++#~ "firewall. If you experience occasional connection problems try enabling "
++#~ "MSS Clamping otherwise disable it for performance reasons."
++#~ msgstr ""
++#~ "Εδώ μποÏείτε να οÏίσετε τι δικτυακή κίνηση επιτÏέπεται Î¼ÎµÏ„Î±Î¾Ï Î´Î¹ÎºÏ„Ï…Î±ÎºÏŽÎ½ "
++#~ "ζωνών. Θα εφαÏμόζεται μόνο σε νέες συνδέσεις. Πακέτα που ανήκουν σε ήδη "
++#~ "ανοιχτές συνδέσεις θα πεÏνάνε αυτόματα το τείχος Ï€Ïοστασίας. Αν "
++#~ "αντιμετωπίζεται σποÏαδικά Ï€Ïοβλήματα με τη σÏνδεσή σας, δοκιμάστε να "
++#~ "ενεÏγοποιήσετε τον ΠεÏιοÏισμό MSS, αλλιώς απενεÏγοποιήστε το για "
++#~ "μεγαλÏτεÏη απόδοση."
++
++#~ msgid "Zone"
++#~ msgstr "Ζώνη"
++
++#, fuzzy
++#~ msgid "Destination IP"
++#~ msgstr "ΠÏοοÏισμός"
++
++#, fuzzy
++#~ msgid "IP address"
++#~ msgstr "ΔιεÏθυνση IP"
++
++#, fuzzy
++#~ msgid "Source MAC-address"
++#~ msgstr "ΔιεÏθυνση MAC πηγής"
++
++#~ msgid "Custom forwarding"
++#~ msgstr "ΠÏοσαÏμοσμένη Ï€Ïοώθηση"
++
++#~ msgid "Input Zone"
++#~ msgstr "Ζώνη Εισόδου"
++
++#~ msgid "Output Zone"
++#~ msgstr "Ζώνη Εξόδου"
++
++#~ msgid "External Zone"
++#~ msgstr "ΕξωτεÏική Ζώνη"
++
++#~ msgid "Source MAC"
++#~ msgstr "MAC πηγής"
++
++#~ msgid "Defaults"
++#~ msgstr "ΠÏοκαθοÏισμένα"
++
++#~ msgid ""
++#~ "These are the default settings that are used if no other rules match."
++#~ msgstr ""
++#~ "Αυτές είναι οι Ï€ÏοκαθοÏισμένες Ïυθμίσεις που χÏησιμοποιοÏνται αν δεν "
++#~ "υπάÏχει κάποιος άλλος κανόνας που ταιÏιάζει."
++
++#~ msgid ""
++#~ "Zones part the network interfaces into certain isolated areas to separate "
++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag "
++#~ "enables NAT masquerading for all outgoing traffic on this zone."
++#~ msgstr ""
++#~ "Οι ζώνες χωÏίζουν τις δικτυακές διεπαφές σε απομονωμένες πεÏιοχές ώστε να "
++#~ "διαχωÏίζεται η δικτυακή κίνηση. Σε μία ζώνη μποÏοÏν να ανήκουν ένα ή "
++#~ "πεÏισσότεÏα δίκτυα. Η σημαία MASQ ενεÏγοποιεί NAT masquerading για όλη "
++#~ "την εξεÏχόμενη κίνηση της ζώνης."
++
++#~ msgid "MASQ"
++#~ msgstr "MASQ"
++
++#~ msgid "contained networks"
++#~ msgstr "δίκτυα που πεÏιέχονται"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/en/firewall.po b/feeds/luci/applications/luci-app-firewall/po/en/firewall.po
+new file mode 100644
+index 0000000..2684067
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/en/firewall.po
+@@ -0,0 +1,635 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr ""
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr ""
++
++msgid "(Unnamed Rule)"
++msgstr ""
++
++msgid "(Unnamed SNAT)"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr "Action"
++
++msgid "Add"
++msgstr ""
++
++msgid "Add and edit..."
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr ""
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr ""
++
++msgid "Any"
++msgstr ""
++
++msgid "Covered networks"
++msgstr ""
++
++msgid "Custom Rules"
++msgstr ""
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++
++msgid "Destination IP address"
++msgstr ""
++
++msgid "Destination address"
++msgstr "Destination address"
++
++msgid "Destination port"
++msgstr "Destination port"
++
++msgid "Destination zone"
++msgstr "Destination zone"
++
++msgid "Do not rewrite"
++msgstr ""
++
++msgid "Drop invalid packets"
++msgstr "Drop invalid packets"
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable NAT Loopback"
++msgstr ""
++
++msgid "Enable SYN-flood protection"
++msgstr "Enable SYN-flood protection"
++
++msgid "Enable logging on this zone"
++msgstr ""
++
++msgid "External IP address"
++msgstr ""
++
++msgid "External port"
++msgstr "External port"
++
++msgid "External zone"
++msgstr ""
++
++msgid "Extra arguments"
++msgstr ""
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/zones.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall - Custom Rules"
++msgstr ""
++
++msgid "Firewall - Port Forwards"
++msgstr ""
++
++msgid "Firewall - Traffic Rules"
++msgstr ""
++
++msgid "Firewall - Zone Settings"
++msgstr ""
++
++msgid "Force connection tracking"
++msgstr ""
++
++msgid "Forward"
++msgstr "Forward"
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr ""
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "Input"
++msgstr "Input"
++
++msgid "Inter-Zone Forwarding"
++msgstr ""
++
++msgid "Internal IP address"
++msgstr "Internal IP address"
++
++msgid "Internal port"
++msgstr "Internal port"
++
++msgid "Internal zone"
++msgstr ""
++
++msgid "Limit log messages"
++msgstr ""
++
++msgid "MSS clamping"
++msgstr "MSS clamping"
++
++msgid "Masquerading"
++msgstr "Masquerading"
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr ""
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr "Name"
++
++msgid "New SNAT rule"
++msgstr ""
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr ""
++
++msgid "New port forward"
++msgstr ""
++
++msgid "New source NAT"
++msgstr ""
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr ""
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr ""
++
++msgid "Other..."
++msgstr ""
++
++msgid "Output"
++msgstr "Output"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr ""
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++"Redirect matched incoming traffic to the given port on the internal host"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Redirect matched incoming traffic to the specified internal host"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr ""
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr ""
++
++msgid "SNAT port"
++msgstr ""
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Traffic Redirection"
++# msgstr ""
++#
++# msgid ""
++# "Traffic redirection allows you to change the destination address of "
++# "forwarded packets."
++# msgstr ""
++#
++# msgid "Overview"
++# msgstr ""
++#
++# msgid "Name"
++# msgstr ""
++#
++# msgid "Source zone"
++# msgstr ""
++#
++# msgid "Source MAC-address"
++# msgstr ""
++#
++# msgid "Source port"
++# msgstr ""
++#
++# msgid "Protocol"
++# msgstr ""
++#
++msgid "Source IP address"
++msgstr "Source IP address"
++
++msgid "Source MAC address"
++msgstr ""
++
++msgid "Source NAT"
++msgstr ""
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++msgid "Source address"
++msgstr "Source address"
++
++msgid "Source port"
++msgstr "Source port"
++
++msgid "Source zone"
++msgstr "Source zone"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr ""
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr ""
++
++msgid "Zone ⇒ Forwardings"
++msgstr ""
++
++msgid "Zones"
++msgstr "Zones"
++
++msgid "accept"
++msgstr "accept"
++
++msgid "any"
++msgstr "any"
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr "drop"
++
++msgid "reject"
++msgstr "reject"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "Destination"
++
++#~ msgid "Source"
++#~ msgstr "Source"
++
++#~ msgid "(optional)"
++#~ msgstr "(optional)"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Internal port (optional)"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/trule.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Name"
++# msgstr ""
++#
++# msgid "(optional)"
++# msgstr ""
++#
++# msgid "Protocol"
++# msgstr ""
++#
++# msgid "Source port"
++# msgstr ""
++#
++# msgid "Destination port"
++# msgstr ""
++#
++# msgid "Action"
++# msgstr ""
++#
++# msgid "drop"
++# msgstr ""
++#
++# msgid "accept"
++# msgstr ""
++#
++# msgid "reject"
++# msgstr ""
++#
++#~ msgid "Advanced Rules"
++#~ msgstr "Advanced Rules"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++
++#~ msgid "Device"
++#~ msgstr "Device"
++
++#~ msgid ""
++#~ "Match incoming traffic originating from the given source port or port "
++#~ "range on the client host"
++#~ msgstr ""
++#~ "Match incoming traffic originating from the given source port or port "
++#~ "range on the client host"
++
++#~ msgid "Overview"
++#~ msgstr "Overview"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/miniportfw.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Name"
++# msgstr ""
++#
++# msgid "(optional)"
++# msgstr ""
++#
++# msgid "Protocol"
++# msgstr ""
++#
++# msgid "External port"
++# msgstr ""
++#
++# msgid "Internal IP address"
++# msgstr ""
++#
++#~ msgid "Port forwarding"
++#~ msgstr "Port forwarding"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++
++#~ msgid "Rules"
++#~ msgstr "Rules"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/redirect.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Name"
++# msgstr ""
++#
++# msgid "Protocol"
++# msgstr ""
++#
++#~ msgid "Traffic Redirection"
++#~ msgstr "Traffic Redirection"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++
++#~ msgid "Network"
++#~ msgstr "Network"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/traffic.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Name"
++# msgstr ""
++#
++#~ msgid "Traffic Control"
++#~ msgstr "Traffic Control"
++
++#~ msgid "Zone-to-Zone traffic"
++#~ msgstr "Zone-to-Zone traffic"
++
++#~ msgid ""
++#~ "Here you can specify which network traffic is allowed to flow between "
++#~ "network zones. Only new connections will be matched. Packets belonging "
++#~ "to already open connections are automatically allowed to pass the "
++#~ "firewall. If you experience occasional connection problems try enabling "
++#~ "MSS Clamping otherwise disable it for performance reasons."
++#~ msgstr ""
++#~ "Here you can specify which network traffic is allowed to flow between "
++#~ "network zones. Only new connections will be matched. Packets belonging "
++#~ "to already open connections are automatically allowed to pass the "
++#~ "firewall. If you experience occasional connection problems try enabling "
++#~ "MSS Clamping otherwise disable it for performance reasons."
++
++#~ msgid "Zone"
++#~ msgstr "Zone"
++
++#~ msgid "Destination IP"
++#~ msgstr "Destination IP"
++
++#~ msgid "IP address"
++#~ msgstr "IP address"
++
++#~ msgid "Source MAC-address"
++#~ msgstr "Source MAC-address"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/es/firewall.po b/feeds/luci/applications/luci-app-firewall/po/es/firewall.po
+new file mode 100644
+index 0000000..452809c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/es/firewall.po
+@@ -0,0 +1,698 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2014-06-15 09:00+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr "%s en %s"
++
++msgid "%s%s with %s"
++msgstr "%s%s con %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s en %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(Entrada sin nombre)"
++
++msgid "(Unnamed Rule)"
++msgstr "(Reglas sin nombre)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(SNAT sin nombre)"
++
++msgid "-- Please choose --"
++msgstr "-- Seleccione --"
++
++msgid "-- custom --"
++msgstr "-- propio --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> paquetes por <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++"<var>%d</var> paquetes por <var>%s</var>, máximo <var>%d</var> paquetes."
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> y límite a %s"
++
++msgid "Action"
++msgstr "Acción"
++
++msgid "Add"
++msgstr "Añadir"
++
++msgid "Add and edit..."
++msgstr "Añadir y editar..."
++
++msgid "Advanced Settings"
++msgstr "Configuración avanzada"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Permitir traspaso desde <em>zonas de origen</em>:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Permitir traspaso a <em>zonas de destino</em>:"
++
++msgid "Any"
++msgstr "Cualquiera"
++
++msgid "Covered networks"
++msgstr "Redes cubiertas"
++
++msgid "Custom Rules"
++msgstr "Reglas propias"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"Las reglas propias le permiten ejecutar comandos de iptables que no están "
++"disponibles en el marco del cortafuegos. Los comandos se ejecutarán tras "
++"cualquier rearranque del cortafuegos, justo tras haber cargado el conjunto "
++"de reglas por defecto."
++
++msgid "Destination IP address"
++msgstr "Dirección IP destino"
++
++msgid "Destination address"
++msgstr "Dirección de destino"
++
++msgid "Destination port"
++msgstr "Puerto de destino"
++
++msgid "Destination zone"
++msgstr "Zona de destino"
++
++msgid "Do not rewrite"
++msgstr "No reescribir"
++
++msgid "Drop invalid packets"
++msgstr "Descartar paquetes no válidos"
++
++msgid "Enable"
++msgstr "Activar"
++
++msgid "Enable NAT Loopback"
++msgstr "Activar bucle NAT"
++
++msgid "Enable SYN-flood protection"
++msgstr "Activar protección a inundación-SYN"
++
++msgid "Enable logging on this zone"
++msgstr "Activar registro en esta zona"
++
++msgid "External IP address"
++msgstr "Dirección IP externa"
++
++msgid "External port"
++msgstr "Puerto externo"
++
++msgid "External zone"
++msgstr "Zona externa"
++
++msgid "Extra arguments"
++msgstr "Parámetros extra"
++
++msgid "Firewall"
++msgstr "Cortafuegos"
++
++msgid "Firewall - Custom Rules"
++msgstr "Cortafuegos - Reglas propias"
++
++msgid "Firewall - Port Forwards"
++msgstr "Cortafuegos - traspasos de puerto"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Cortafuegos - Reglas de tráfico"
++
++msgid "Firewall - Zone Settings"
++msgstr "Cortafuegos - Configuración de la zona"
++
++msgid "Force connection tracking"
++msgstr "Forzar seguimiento de conexión"
++
++msgid "Forward"
++msgstr "Traspasar"
++
++msgid "Forward to"
++msgstr "Traspasar a"
++
++msgid "From %s in %s"
++msgstr "Desde %s en %s"
++
++msgid "From %s in %s with source %s"
++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 "General Settings"
++msgstr "Configuración general"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 only"
++msgstr "Sólo IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "Sñolo IPv6"
++
++msgid "Input"
++msgstr "Entrada"
++
++msgid "Inter-Zone Forwarding"
++msgstr "Traspaso entre zonas"
++
++msgid "Internal IP address"
++msgstr "Dirección IP interna"
++
++msgid "Internal port"
++msgstr "Puerto interno"
++
++msgid "Internal zone"
++msgstr "Zona interna"
++
++msgid "Limit log messages"
++msgstr "Limitar registro de mensajes"
++
++msgid "MSS clamping"
++msgstr "Fijado de MSS"
++
++msgid "Masquerading"
++msgstr "Enmascaramiento"
++
++msgid "Match"
++msgstr "Coincidir"
++
++msgid "Match ICMP type"
++msgstr "Coincidir con tipo ICMP"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr "Coincidir con tráfico traspasado al puerto o rango de puertos destino."
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"Coincidir con tráfico de entrada dirigido al puerto o rango de puertos "
++"destino en esta máquina"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++"Coincidir con tráfico de entrada originado desde el puerto o rango de "
++"puertos origen en la máquina cliente."
++
++msgid "Name"
++msgstr "Nombre"
++
++msgid "New SNAT rule"
++msgstr "Nueva regla SNAT"
++
++msgid "New forward rule"
++msgstr "Nueva regla de traspaso"
++
++msgid "New input rule"
++msgstr "Nueva regla de entrada"
++
++msgid "New port forward"
++msgstr "Nuevo traspaso de puerto"
++
++msgid "New source NAT"
++msgstr "Nuevo origen NAT"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "Coincidir sólo con tráfico de entrada a esta dirección IP."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "Coincidir sólo con tráfico de entrada desde estas MACs."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr "Coincidir sólo con tráfico de entrada desde esta IP o rango."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++"Coincidir sólo con tráfico de entrada originado desde el puerto o rango de "
++"puertos origen en la máquina cliente"
++
++msgid "Open ports on router"
++msgstr "Abrir puertos en el router"
++
++msgid "Other..."
++msgstr "Otros..."
++
++msgid "Output"
++msgstr "Salida"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr "Pasa más parámetros a IPTables. ¡Usar con cuidado!"
++
++msgid "Port Forwards"
++msgstr "Traspasos de puerto"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"El traspaso de puertos permite a ordenadores remotos en internet conectar a "
++"un ordenador o servicio específico en la LAN privada."
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++"Redirigir el tráfico de entrada que coincida al puerto en la máquina interna"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Redirigir el tráfico de entrada que coincida a la máquina interna"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "Restringir enmascaramiento a las subredes destino"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "Restringir enmascaramiento a las subredes origen"
++
++msgid "Restrict to address family"
++msgstr "Restringir a la familia de direcciones"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr "Reescribir el tráfico que coincida a estas direcciones."
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++"Reescribir el tráfico que coincida con este puerto origen. Deje en blanco "
++"para reescribir sólo la dirección IP."
++
++msgid "Rewrite to source %s"
++msgstr "Reescribir a origen %s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "Reescribir a origen %s, %s"
++
++msgid "SNAT IP address"
++msgstr "Dirección IP SNAT"
++
++msgid "SNAT port"
++msgstr "Puerto SNAT"
++
++msgid "Source IP address"
++msgstr "Dirección IP origen"
++
++msgid "Source MAC address"
++msgstr "Dirección MAC origen"
++
++msgid "Source NAT"
++msgstr "NAT origen"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"NAT origen es una forma específica de enmascaramiento que permite el control "
++"fino del origen IP que se usa en el tráfico de salida por ejemplo para "
++"dirigir múltiples direcciones WAN a las subredes internas."
++
++msgid "Source address"
++msgstr "Dirección origen"
++
++msgid "Source port"
++msgstr "Puerto origen"
++
++msgid "Source zone"
++msgstr "Zona origen"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"El cortafuegos crea zonas sobre sus interfaces de red para controlar el "
++"flujo del tráfico."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++"Estas opciones controlan las políticas de traspaso entre esta zona (%s) y "
++"otras. <em>Las zonas origen</em> cubren el tráfico traspasado <strong>desde "
++"%q</strong>. <em>Las zonas origen</em> coinciden con el tráfico traspasado "
++"desde otras zonas <strong>dirigido a %q</strong>. La regla de traspaso es "
++"<em>unidireccional</em>, por ejemplo una regla de traspaso desde la LAN a la "
++"WAN <em>no</em> implica permiso para traspasar desde la WAN a la LAN también."
++
++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 ""
++"Propiedades avanzadas de la entrada \"traspaso de puertos\". No suele ser "
++"necesario modificar esta configuración."
++
++msgid ""
++"This page allows you to change advanced properties of the traffic rule "
++"entry, such as matched source and destination hosts."
++msgstr ""
++"Propiedades avanzadas de la entrada \"reglas de tráfico\", como "
++"coincidencias en puertos de origen y destino."
++
++#, 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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"Esta sección define propierdades comunes de %q. Las opciones de <em>entrada</"
++"em> y la <em>salida</em> marcan las políticas por defecto para el tráfico "
++"que entra y deja esta zona mientras que la opción <em>traspaso</em> describe "
++"la política para tráfico traspasado desde diferentes redes en la zona. "
++"<em>Redes cubiertas</em> especifican qué redes disponibles son miembros de "
++"esta zona."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "A %s en %s por <var>este dispositivo</var>"
++
++msgid "To %s in %s"
++msgstr "A %s en %s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "A %s por <var>este dispositivo</var>"
++
++msgid "To %s, %s in %s"
++msgstr "A %s, %s en %s"
++
++msgid "To source IP"
++msgstr "A IP origen"
++
++msgid "To source port"
++msgstr "A puerto origen"
++
++msgid "Traffic Rules"
++msgstr "Reglas de tráfico"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"Las reglas de tráfico definen políticas para tramas que se mueven entre "
++"zonas diferentes, por ejemplo para rechazar tráfico entre ciertas máquinas o "
++"puertos WAN abiertos en el router."
++
++msgid "Via %s"
++msgstr "Vía %s"
++
++msgid "Via %s at %s"
++msgstr "Vía %s a %s"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"Puede poner varios seleccionando \"-- propio --\" e introduciendo los "
++"protocolos separados por espacio."
++
++msgid "Zone %q"
++msgstr "Zona %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Zona ⇒ Traspasos"
++
++msgid "Zones"
++msgstr "Zonas"
++
++msgid "accept"
++msgstr "aceptar"
++
++msgid "any"
++msgstr "cualquiera"
++
++msgid "any host"
++msgstr "cualquier máquina"
++
++msgid "any router IP"
++msgstr "cualquier router IP"
++
++msgid "any zone"
++msgstr "cualquier zona"
++
++msgid "don't track"
++msgstr "no seguir"
++
++msgid "drop"
++msgstr "descartar"
++
++msgid "reject"
++msgstr "rechazar"
++
++msgid "traffic"
++msgstr "tráfico"
++
++#~ msgid "Destination"
++#~ msgstr "Destino"
++
++#~ msgid "Family"
++#~ msgstr "Familia"
++
++#~ msgid "Forward to %s in %s"
++#~ msgstr "Traspasar a %s en %s"
++
++#~ msgid "Forward to %s, %s in %s"
++#~ msgstr "Traspasar a %s, %s en %s"
++
++#~ msgid "SNAT"
++#~ msgstr "SNAT"
++
++#~ msgid "Source"
++#~ msgstr "Origen"
++
++#~ msgid "To %s"
++#~ msgstr "A %s"
++
++#~ msgid "To %s at %s"
++#~ msgstr "A %s en %s"
++
++#~ msgid "Via"
++#~ msgstr "Via"
++
++#~ msgid "Accept forward"
++#~ msgstr "Aceptar traspaso"
++
++#~ msgid "Accept input"
++#~ msgstr "Aceptar entrada"
++
++#~ msgid "Disable"
++#~ msgstr "Desactivar"
++
++#~ msgid "Discard forward"
++#~ msgstr "Descartar traspaso"
++
++#~ msgid "Discard input"
++#~ msgstr "Descartar entrada"
++
++#~ msgid "Do not track forward"
++#~ msgstr "No seguir traspaso"
++
++#~ msgid "Do not track input"
++#~ msgstr "No seguir entrada"
++
++#~ msgid "IP"
++#~ msgstr "IP"
++
++#~ msgid "IP range"
++#~ msgstr "Rango IP"
++
++#~ msgid "IPs"
++#~ msgstr "IPs"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MACs"
++#~ msgstr "MACs"
++
++#~ msgid "Refuse forward"
++#~ msgstr "Rechazar traspaso"
++
++#~ msgid "Refuse input"
++#~ msgstr "Rechazar entrada"
++
++#~ msgid "Rule is disabled"
++#~ msgstr "La regla está desactivada"
++
++#~ msgid "Rule is enabled"
++#~ msgstr "La regla está activada"
++
++#~ msgid "day"
++#~ msgstr "dia"
++
++#~ msgid "hour"
++#~ msgstr "hora"
++
++#~ msgid "minute"
++#~ msgstr "minuto"
++
++#~ msgid "not"
++#~ msgstr "no"
++
++#~ msgid "port"
++#~ msgstr "puerto"
++
++#~ msgid "ports"
++#~ msgstr "puertos"
++
++#~ msgid "second"
++#~ msgstr "segundo"
++
++#~ msgid "type"
++#~ msgstr "tipo"
++
++#~ msgid "types"
++#~ msgstr "tipos"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Puerto interno (opcional)"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "Reglas avanzadas"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Las reglas avanzadas le permite personalizar el corta fuego según sus "
++#~ "necesidades. Sólamente las nuevas conexiones serán afectadas por las "
++#~ "reglas. Los paquetes pertenecientes a conexiones ya abierta, se les "
++#~ "permite el libre paso por el corta fuego."
++
++#~ msgid "Port forwarding"
++#~ msgstr "Reenvío de puerto"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "El reenvío de puerto permite proveer servicios de red en una red interna "
++#~ "a una red externa (por ejemplo Internet)"
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "Redirección de tráfico"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "La redirección de tráfico permite cambiar la dirección de destino de los "
++#~ "paquetes reenviados."
++
++#, fuzzy
++#~ msgid "Network"
++#~ msgstr "Redes"
++
++#~ msgid "Traffic Control"
++#~ msgstr "Control de tráfico"
++
++#~ msgid "Zone-to-Zone traffic"
++#~ msgstr "Tráfico Zona-a-Zona"
++
++#, fuzzy
++#~ msgid ""
++#~ "Here you can specify which network traffic is allowed to flow between "
++#~ "network zones. Only new connections will be matched. Packets belonging "
++#~ "to already open connections are automatically allowed to pass the "
++#~ "firewall. If you experience occasional connection problems try enabling "
++#~ "MSS Clamping otherwise disable it for performance reasons."
++#~ msgstr ""
++#~ "Aquí puede especificar qué tráfico de red is permitido, discho tráfico "
++#~ "fluirá entre las zonas de red definidas. Sólamente las nuevas conexiones "
++#~ "serán aplicadas por las reglas. Los paquetes pertenecientes a conexiones "
++#~ "ya abierta se les permitirá el paso sobre el corta fuego. Si experimenta "
++#~ "ocacionalmente problemas de conexión, intente activar MSS Clamping de "
++#~ "otra forma, deshabilitelo para mejorar considerablemente la performance."
++
++#~ msgid "Zone"
++#~ msgstr "Zona"
++
++#, fuzzy
++#~ msgid "Destination IP"
++#~ msgstr "Destino"
++
++#, fuzzy
++#~ msgid "IP address"
++#~ msgstr "Dirección IP"
++
++#, fuzzy
++#~ msgid "Source MAC-address"
++#~ msgstr "Dirección MAC de origen"
++
++#~ msgid "Custom forwarding"
++#~ msgstr "Renvío personalizado"
++
++#~ msgid "Input Zone"
++#~ msgstr "Zona de entrada"
++
++#~ msgid "Output Zone"
++#~ msgstr "Zona de salida"
++
++#~ msgid "External Zone"
++#~ msgstr "Zona Externa"
++
++#~ msgid "Source MAC"
++#~ msgstr "MAC de Origen"
++
++#~ msgid "Defaults"
++#~ msgstr "De fábrica"
++
++#~ msgid ""
++#~ "These are the default settings that are used if no other rules match."
++#~ msgstr ""
++#~ "Estos son los valores por defecto que son usados si no hay otra regla a "
++#~ "aplicar."
++
++#~ msgid ""
++#~ "Zones part the network interfaces into certain isolated areas to separate "
++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag "
++#~ "enables NAT masquerading for all outgoing traffic on this zone."
++#~ msgstr ""
++#~ "Las zonas dividen las interfaces de red en varias partes aisladas para "
++#~ "separar el tráfico de red. Una o mas redes pueden pertenecer a una zona. "
++#~ "La bandera MASQ activa el enmascaramiento NAT para todo el tráfico "
++#~ "saliente sobre esa zona."
++
++#~ msgid "MASQ"
++#~ msgstr "MASQ"
++
++#~ msgid "contained networks"
++#~ msgstr "redes contenidas"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/fr/firewall.po b/feeds/luci/applications/luci-app-firewall/po/fr/firewall.po
+new file mode 100644
+index 0000000..96f3f51
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/fr/firewall.po
+@@ -0,0 +1,693 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2013-02-26 00:44+0200\n"
++"Last-Translator: val56 <valentin_sonet@hotmail.fr>\n"
++"Language-Team: French\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr ""
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr ""
++
++msgid "(Unnamed Rule)"
++msgstr ""
++
++msgid "(Unnamed SNAT)"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr "-- Choisissez SVP --"
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr "Action"
++
++msgid "Add"
++msgstr ""
++
++msgid "Add and edit..."
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr "Paramètres avancés"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Permettre la transmission des <em>zones source</em> :"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Permettre la transmission vers les <em>zones destination</em> :"
++
++msgid "Any"
++msgstr "N'importe lequel"
++
++msgid "Covered networks"
++msgstr "Réseaux couverts"
++
++msgid "Custom Rules"
++msgstr "Régles spécifiques"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++
++msgid "Destination IP address"
++msgstr "Adresse IP de destination"
++
++msgid "Destination address"
++msgstr "Adresse de destination"
++
++msgid "Destination port"
++msgstr "Port de destination"
++
++msgid "Destination zone"
++msgstr "Zone de destination"
++
++msgid "Do not rewrite"
++msgstr ""
++
++msgid "Drop invalid packets"
++msgstr "Supprimer les paquets invalides"
++
++msgid "Enable"
++msgstr "Activer"
++
++msgid "Enable NAT Loopback"
++msgstr "Activer le NAT sur la boucle-locale"
++
++msgid "Enable SYN-flood protection"
++msgstr "Activer la protection contre le SYN-flood"
++
++msgid "Enable logging on this zone"
++msgstr "Activer les traces (logs) sur cette zone"
++
++msgid "External IP address"
++msgstr "Adresse IP externe"
++
++msgid "External port"
++msgstr "Port externe"
++
++msgid "External zone"
++msgstr "Zone externe"
++
++msgid "Extra arguments"
++msgstr ""
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# applications/luci-fw/luasrc/model/cbi/luci_fw/zones.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++msgid "Firewall"
++msgstr "Pare-feu"
++
++msgid "Firewall - Custom Rules"
++msgstr "Pare-feu -- Règles personnalisées"
++
++msgid "Firewall - Port Forwards"
++msgstr "Pare-feu -- Redirections de ports"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Pare-feu -- Règles de trafic"
++
++msgid "Firewall - Zone Settings"
++msgstr "Pare-feu - Configuration des zones"
++
++msgid "Force connection tracking"
++msgstr "Forcer le suivi des connexions"
++
++msgid "Forward"
++msgstr "Transfert"
++
++msgid "Forward to"
++msgstr "Transférer à"
++
++msgid "From %s in %s"
++msgstr ""
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr "Paramètres généraux"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 et IPv6"
++
++msgid "IPv4 only"
++msgstr "IPv4 seulement"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "IPv6 seulement"
++
++msgid "Input"
++msgstr "Entrée"
++
++msgid "Inter-Zone Forwarding"
++msgstr "Transmission entre zones"
++
++msgid "Internal IP address"
++msgstr "Adresse IP interne"
++
++msgid "Internal port"
++msgstr "Port interne"
++
++msgid "Internal zone"
++msgstr "Zone interne"
++
++msgid "Limit log messages"
++msgstr "Limiter les messages de journalisation"
++
++msgid "MSS clamping"
++msgstr "Contrainte du MSS"
++
++msgid "Masquerading"
++msgstr "Masquage"
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr "Type ICMP correspondant"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"Prendre en compte le trafic dirigé vers le port de destination donné (ou la "
++"gamme de ports) sur cet hôte"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr "Nom"
++
++msgid "New SNAT rule"
++msgstr "Nouvelle règle SNAT"
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr "Nouvelle règle d'entrée"
++
++msgid "New port forward"
++msgstr "Nouvelle redirection de port"
++
++msgid "New source NAT"
++msgstr "Nouvelle source NAT"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "Montrer seulement le trafic entrant provenant de ces adresses MAC."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr "Ports ouverts sur le routeur"
++
++msgid "Other..."
++msgstr "Autre..."
++
++msgid "Output"
++msgstr "Sortie"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr "Redirections de port"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"La redirection de port permet aux ordinateurs distants sur Internet, de se "
++"connecter à un ordinateur ou service spécifié dans le réseau local privé."
++
++msgid "Protocol"
++msgstr "Protocole"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++"Rediriger le trafic entrant correspondant vers le port donné sur l'hôte "
++"interne"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Rediriger le trafic entrant correspondant vers l'hôte interne spécifié"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++"Restreindre la substitution d'adresses (Masquerade) à ces sous-réseaux "
++"destinataires"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++"Restreindre la substitution d'adresses (Masquerade) à ces sous-réseaux "
++"sources"
++
++msgid "Restrict to address family"
++msgstr "Restreindre à cette famille d'adresses"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr "Adresse IP SNAT"
++
++msgid "SNAT port"
++msgstr "Port SNAT"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Traffic Redirection"
++# msgstr ""
++#
++# msgid ""
++# "Traffic redirection allows you to change the destination address of "
++# "forwarded packets."
++# msgstr ""
++#
++# msgid "Overview"
++# msgstr ""
++#
++# msgid "Name"
++# msgstr ""
++#
++# msgid "Source zone"
++# msgstr ""
++#
++# msgid "Source MAC-address"
++# msgstr ""
++#
++# msgid "Source port"
++# msgstr ""
++#
++# msgid "Protocol"
++# msgstr ""
++#
++msgid "Source IP address"
++msgstr "Adresse IP source"
++
++msgid "Source MAC address"
++msgstr "Adresse MAC source"
++
++msgid "Source NAT"
++msgstr "Source NAT"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++msgid "Source address"
++msgstr "Adresse source"
++
++msgid "Source port"
++msgstr "Port source"
++
++msgid "Source zone"
++msgstr "Zone source"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"Le pare-feu crée des zones sur les interfaces réseau pour contrôler le flux "
++"du trafic réseau."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++"Les options ci-dessous contrôlent les politiques de transmission entre cette "
++"zone (%s) et les autres zones. <em>Zones de destination</em> couvre le "
++"trafic transfmis <strong>venant de %q</strong>. <em>Zones source</em> "
++"correspond au trafic transféré d'autres zones <strong> à destination de %q</"
++"strong>. La règle de transmission est <em>unidirectionnelle</em>, la "
++"transmission du LAN au WAN n'implique <em>pas</em> également l'autorisation "
++"de transmission du WAN au 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 ""
++"Cette page vous permet de modifier les propriétés avancées parmi les entrées "
++"de redirection de port. Dans la plupart des cas, cela n'est pas nécessaire "
++"de modifier ces paramètres."
++
++msgid ""
++"This page allows you to change advanced properties of the traffic rule "
++"entry, such as matched source and destination hosts."
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"Cette section définit des propriétés communes de %q. Les options <em>entrée</"
++"em> et <em>sortie</em> définissent les politiques par défaut pour le trafic "
++"entrant et sortant de cette zone, tandis que l'option <em>transmission</em> "
++"décrit la politique pour le trafic transmis entre différents réseaux dans "
++"cette zone. Les <em>réseaux couverts</em> indiquent quels réseaux "
++"disponibles sont membre de cette zone."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr "Règles de trafic"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr "Zone %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Zone ⇒ Transmissions"
++
++msgid "Zones"
++msgstr "Zones"
++
++msgid "accept"
++msgstr "accepter"
++
++#, fuzzy
++msgid "any"
++msgstr "tous"
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr "ignorer"
++
++msgid "reject"
++msgstr "rejeter"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "Destination"
++
++#~ msgid "Family"
++#~ msgstr "Famille"
++
++#~ msgid "Source"
++#~ msgstr "Source"
++
++#~ msgid "Via"
++#~ msgstr "Via"
++
++#~ msgid "(optional)"
++#~ msgstr "(optionnel)"
++
++#~ msgid "Intended destination address"
++#~ msgstr "Adresse de destination voulue"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Port interne (optionnel)"
++
++#~ msgid "Advanced Options"
++#~ msgstr "Options avancées"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# applications/luci-fw/luasrc/model/cbi/luci_fw/trule.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Name"
++# msgstr ""
++#
++# msgid "(optional)"
++# msgstr ""
++#
++# msgid "Protocol"
++# msgstr ""
++#
++# msgid "Source port"
++# msgstr ""
++#
++# msgid "Destination port"
++# msgstr ""
++#
++# msgid "Action"
++# msgstr ""
++#
++# msgid "drop"
++# msgstr ""
++#
++# msgid "accept"
++# msgstr ""
++#
++# msgid "reject"
++# msgstr ""
++#
++#~ msgid "Advanced Rules"
++#~ msgstr "Règles avancées"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Les règles avancées vous laissent personnaliser le pare-feu selon vos "
++#~ "besoins. Seules les nouvelles connexions seront prises en compte. Les "
++#~ "paquets appartenant à des connexions déjà ouvertes sont automatiquement "
++#~ "admis à passer le pare-feu."
++
++#~ msgid "Custom Rules (/etc/firewall.user)"
++#~ msgstr "Règles spécifiques (/etc/firewall.user)"
++
++#~ msgid "Device"
++#~ msgstr "Équipement"
++
++#~ msgid ""
++#~ "For DNAT, match incoming traffic directed at the given destination ip "
++#~ "address. For SNAT rewrite the source address to the given address."
++#~ msgstr ""
++#~ "Pour le DNAT, sélectionne le trafic entrant correspondant à l'adresse IP "
++#~ "destinataire. Pour le SNAT, ré-écrit l'adresse source avec l'adresse "
++#~ "donnée."
++
++#~ msgid ""
++#~ "Match incoming traffic originating from the given source port or port "
++#~ "range on the client host"
++#~ msgstr ""
++#~ "Prendre en compte le trafic entrant provenant du port source donné (ou la "
++#~ "gamme de ports) sur l'hôte client"
++
++#~ msgid "Overview"
++#~ msgstr "Vue d'ensemble"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# applications/luci-fw/luasrc/model/cbi/luci_fw/miniportfw.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Name"
++# msgstr ""
++#
++# msgid "(optional)"
++# msgstr ""
++#
++# msgid "Protocol"
++# msgstr ""
++#
++# msgid "External port"
++# msgstr ""
++#
++# msgid "Internal IP address"
++# msgstr ""
++#
++#~ msgid "Port forwarding"
++#~ msgstr "Redirection de port"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "La redirection de port vous permet d'exposer des services réseaux de "
++#~ "votre réseau local au réseau externe."
++
++#~ msgid "Redirection type"
++#~ msgstr "Type de redirection"
++
++#~ msgid "Redirections"
++#~ msgstr "Redirections"
++
++#~ msgid "Rules"
++#~ msgstr "Règles"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# applications/luci-fw/luasrc/model/cbi/luci_fw/redirect.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Name"
++# msgstr ""
++#
++# msgid "Protocol"
++# msgstr ""
++#
++#~ msgid "Traffic Redirection"
++#~ msgstr "Redirection du trafic"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "La redirection de trafic vous permet de changer l'adresse de destination "
++#~ "des paquets transférés."
++
++#~ msgid "Network"
++#~ msgstr "Réseau"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# applications/luci-fw/luasrc/model/cbi/luci_fw/traffic.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Name"
++# msgstr ""
++#
++#~ msgid "Traffic Control"
++#~ msgstr "Contrôle de trafic"
++
++#~ msgid "Zone-to-Zone traffic"
++#~ msgstr "Trafic zone-à-zone"
++
++#~ msgid ""
++#~ "Here you can specify which network traffic is allowed to flow between "
++#~ "network zones. Only new connections will be matched. Packets belonging "
++#~ "to already open connections are automatically allowed to pass the "
++#~ "firewall. If you experience occasional connection problems try enabling "
++#~ "MSS Clamping otherwise disable it for performance reasons."
++#~ msgstr ""
++#~ "Ici, vous pouvez spécifier quel trafic réseau est autorisé à transiter "
++#~ "entre les zones réseau. Seules les nouvelles connexions seront prises en "
++#~ "compte. Les paquets appartenant à des connexions déjà ouvertes sont "
++#~ "automatiquement admis à passer le pare-feu. Si vous subissez des "
++#~ "problèmes de connexion occasionnels, essayer d'activer le MSS clamping; "
++#~ "sinon laissez-le désactivé pour des raisons de performance."
++
++#~ msgid "Zone"
++#~ msgstr "Zone"
++
++#~ msgid "Destination IP"
++#~ msgstr "IP de destination"
++
++#~ msgid "IP address"
++#~ msgstr "Adresse IP"
++
++#~ msgid "Source MAC-address"
++#~ msgstr "Adresse MAC source"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/he/firewall.po b/feeds/luci/applications/luci-app-firewall/po/he/firewall.po
+new file mode 100644
+index 0000000..aec566a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/he/firewall.po
+@@ -0,0 +1,432 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr ""
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr ""
++
++msgid "(Unnamed Rule)"
++msgstr ""
++
++msgid "(Unnamed SNAT)"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add and edit..."
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr ""
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr ""
++
++msgid "Any"
++msgstr ""
++
++msgid "Covered networks"
++msgstr ""
++
++msgid "Custom Rules"
++msgstr ""
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++
++msgid "Destination IP address"
++msgstr ""
++
++msgid "Destination address"
++msgstr ""
++
++msgid "Destination port"
++msgstr ""
++
++msgid "Destination zone"
++msgstr ""
++
++msgid "Do not rewrite"
++msgstr ""
++
++msgid "Drop invalid packets"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable NAT Loopback"
++msgstr ""
++
++msgid "Enable SYN-flood protection"
++msgstr ""
++
++msgid "Enable logging on this zone"
++msgstr ""
++
++msgid "External IP address"
++msgstr ""
++
++msgid "External port"
++msgstr ""
++
++msgid "External zone"
++msgstr ""
++
++msgid "Extra arguments"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Firewall - Custom Rules"
++msgstr ""
++
++msgid "Firewall - Port Forwards"
++msgstr ""
++
++msgid "Firewall - Traffic Rules"
++msgstr ""
++
++msgid "Firewall - Zone Settings"
++msgstr ""
++
++msgid "Force connection tracking"
++msgstr ""
++
++msgid "Forward"
++msgstr ""
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr ""
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "Input"
++msgstr ""
++
++msgid "Inter-Zone Forwarding"
++msgstr ""
++
++msgid "Internal IP address"
++msgstr ""
++
++msgid "Internal port"
++msgstr ""
++
++msgid "Internal zone"
++msgstr ""
++
++msgid "Limit log messages"
++msgstr ""
++
++msgid "MSS clamping"
++msgstr ""
++
++msgid "Masquerading"
++msgstr ""
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr ""
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "New SNAT rule"
++msgstr ""
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr ""
++
++msgid "New port forward"
++msgstr ""
++
++msgid "New source NAT"
++msgstr ""
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr ""
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr ""
++
++msgid "Other..."
++msgstr ""
++
++msgid "Output"
++msgstr ""
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr ""
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr ""
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr ""
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr ""
++
++msgid "SNAT port"
++msgstr ""
++
++msgid "Source IP address"
++msgstr ""
++
++msgid "Source MAC address"
++msgstr ""
++
++msgid "Source NAT"
++msgstr ""
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid "Source port"
++msgstr ""
++
++msgid "Source zone"
++msgstr ""
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr ""
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr ""
++
++msgid "Zone ⇒ Forwardings"
++msgstr ""
++
++msgid "Zones"
++msgstr ""
++
++msgid "accept"
++msgstr ""
++
++msgid "any"
++msgstr ""
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr ""
++
++msgid "reject"
++msgstr ""
++
++msgid "traffic"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-firewall/po/hu/firewall.po b/feeds/luci/applications/luci-app-firewall/po/hu/firewall.po
+new file mode 100644
+index 0000000..1c0ec5e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/hu/firewall.po
+@@ -0,0 +1,580 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-01-31 16:54+0200\n"
++"Last-Translator: Gabor <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr "%s %s-ban"
++
++msgid "%s%s with %s"
++msgstr "%s%s %s-el"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s %s-ben"
++
++msgid "(Unnamed Entry)"
++msgstr "(Névtelen bejegyzés)"
++
++msgid "(Unnamed Rule)"
++msgstr "(Névtelen szabály)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(Névtelen SNAT)"
++
++msgid "-- Please choose --"
++msgstr "-- Kérem válasszon --"
++
++msgid "-- custom --"
++msgstr "-- egyéni --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> csomag/<var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr "<var>%d</var> csom. <var>%s</var>-enként, burst <var>%d</var> csom."
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> és korlátozás %s-re"
++
++msgid "Action"
++msgstr "Művelet"
++
++msgid "Add"
++msgstr "Hozzáadás"
++
++msgid "Add and edit..."
++msgstr "Hozzáadás és szerkesztés..."
++
++msgid "Advanced Settings"
++msgstr "Haladó beállítások"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Továbbítás engedélyezése ezekből a <em>forrás zónákból</em>:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Továbbítás engedélyezése ezekbe a <em>cél zónákba</em>:"
++
++msgid "Any"
++msgstr "Bármelyik"
++
++msgid "Covered networks"
++msgstr "Lefedett hálózatok"
++
++msgid "Custom Rules"
++msgstr "Egyéni szabályok"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"Az egyedi szabályok lehetővé teszik tetszőleges iptables parancsok "
++"futtatását melyekre a tűzfal keretrendszer egyébként nem biztosít "
++"lehetőséget. A parancsok a tűzfal minden újraindításakor futtatásra "
++"kerülnek, közvetlenül az alapértelmezett szabálykészletek betöltése után."
++
++msgid "Destination IP address"
++msgstr "Cél IP-cím"
++
++msgid "Destination address"
++msgstr "Cél cím"
++
++msgid "Destination port"
++msgstr "Cél port"
++
++msgid "Destination zone"
++msgstr "Cél zóna"
++
++msgid "Do not rewrite"
++msgstr "Ne írja felül"
++
++msgid "Drop invalid packets"
++msgstr "Érvénytelen csomagok eldobása"
++
++msgid "Enable"
++msgstr "Engedélyezés"
++
++msgid "Enable NAT Loopback"
++msgstr "NAT visszacsatolás engedélyezése"
++
++msgid "Enable SYN-flood protection"
++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 "External IP address"
++msgstr "Külső IP cím"
++
++msgid "External port"
++msgstr "Külső port"
++
++msgid "External zone"
++msgstr "Külső zóna"
++
++msgid "Extra arguments"
++msgstr "További argumentumok"
++
++msgid "Firewall"
++msgstr "Tűzfal"
++
++msgid "Firewall - Custom Rules"
++msgstr "Tűzfal - Egyéni szabályok"
++
++msgid "Firewall - Port Forwards"
++msgstr "Tűzfal - Port továbbítások"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Tűzfal - Forgalmi szabályok"
++
++msgid "Firewall - Zone Settings"
++msgstr "Tűzfal - Zóna beállítások"
++
++msgid "Force connection tracking"
++msgstr "Kapcsolat követés kényszerítése"
++
++msgid "Forward"
++msgstr "Továbbítás"
++
++msgid "Forward to"
++msgstr "Továbbítás ennek"
++
++msgid "From %s in %s"
++msgstr "%s felől %s-ben"
++
++msgid "From %s in %s with source %s"
++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 "General Settings"
++msgstr "Ãltalános beállítások"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 és IPv6"
++
++msgid "IPv4 only"
++msgstr "csak IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "csak IPv6"
++
++msgid "Input"
++msgstr "Bemenet"
++
++msgid "Inter-Zone Forwarding"
++msgstr "Zónák-közötti továbbítás"
++
++msgid "Internal IP address"
++msgstr "Belső IP cím"
++
++msgid "Internal port"
++msgstr "Belső port"
++
++msgid "Internal zone"
++msgstr "Belső zóna"
++
++msgid "Limit log messages"
++msgstr "Napló üzenetek korlátozása"
++
++msgid "MSS clamping"
++msgstr "MSS clamping engegélyezése"
++
++msgid "Masquerading"
++msgstr "Ãlcázás"
++
++msgid "Match"
++msgstr "Szűrés"
++
++msgid "Match ICMP type"
++msgstr "Szűrés ICMP típus alapján"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++"Továbbított forgalom szűrése a megadott cél port, vagy port tartomány "
++"szerint."
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"Adott portra vagy port tartományra irányított bejövő forgalom szűrése ezen a "
++"gépen"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++"Az ügyfél gép megadott portjáról, vagy port tartományából indított forgalom "
++"szűrése. "
++
++msgid "Name"
++msgstr "Név"
++
++msgid "New SNAT rule"
++msgstr "Új SNAT szabály"
++
++msgid "New forward rule"
++msgstr "Új továbbítási szabály"
++
++msgid "New input rule"
++msgstr "Új bemeneti szabály"
++
++msgid "New port forward"
++msgstr "Új port továbbítás"
++
++msgid "New source NAT"
++msgstr "Új forrás NAT"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "Csak a megadott IP címre irányított bejövő forgalmat egyeztesse."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "Csak a megadott MAC címekről érkező bejövő forgalmat egyeztesse."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++"Csak a megadott IP címről illetve IP címtartományból érkező bejövő forgalmat "
++"egyeztesse."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++"Csak az ügyfél gép megadott forrás portjáról illetve forrás port "
++"tartományába tartozó portról indított bejövő forgalmat egyeztesse."
++
++msgid "Open ports on router"
++msgstr "Port megnyitása a routeren"
++
++msgid "Other..."
++msgstr "Egyéb..."
++
++msgid "Output"
++msgstr "Kimenet"
++
++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!"
++
++msgid "Port Forwards"
++msgstr "Port továbbítás"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"A port továbbítás lehetővé teszi az interneten lévő távoli számítógépeknek a "
++"privát helyi hálózat bizonyos számítógépéhez vagy szolgáltatásához történő "
++"csatlakozását."
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr "Ãtirányítja az egyezÅ‘ bejövÅ‘ forgalmat a belsÅ‘ gép megadott portjához"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Ãtirányítja az egyezÅ‘ bejövÅ‘ forgalmat a megadott belsÅ‘ géphez"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "Ãlcázás korlátozása a megadott cél alhálózatokra"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "Ãlcázás korlátozása a megadott forrás alhálózatokra"
++
++msgid "Restrict to address family"
++msgstr "Korlátozás cím családra"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr "Az összeíllő forgalom átírása a megadott címre."
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++"Az összeillő forgalom átírása a megadott forrás portra. Amennyibe üresen van "
++"hagyva, csak az IP cím kerül átírásra."
++
++msgid "Rewrite to source %s"
++msgstr "Ãtírás %s forrásra"
++
++msgid "Rewrite to source %s, %s"
++msgstr "Ãtírás %s, %s forrásra"
++
++msgid "SNAT IP address"
++msgstr "SNAT IP cím"
++
++msgid "SNAT port"
++msgstr "SNAT port"
++
++msgid "Source IP address"
++msgstr "Forrás IP cím"
++
++msgid "Source MAC address"
++msgstr "Forrás MAC cím"
++
++msgid "Source NAT"
++msgstr "Forrás NAT"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"A forrás NAT az álcázás olyan speciális formája, mely lehetővé teszi a "
++"kimenő forgalomhoz használt forrás IP címek aprólékos szabályozását, például "
++"több WAN cím hozzárendelését a belső alhálózatokhoz."
++
++msgid "Source address"
++msgstr "Forrás cím"
++
++msgid "Source port"
++msgstr "Forrás port"
++
++msgid "Source zone"
++msgstr "Forrás zóna"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"A tűzfal zónákat határoz meg a hálózati interfészek fölött a hálózati "
++"forgalom áramlásának szabályozására."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++"Az alábbi beállítások vezérlik a továbbítási irányelveket a jelenlegi zóna "
++"(%s) és a többi zóna között. A <em>cél zónák</em> fedik le a továbbított "
++"forgalmat <strong>amelynek forrása %q</strong>. A <em>forrás zónák</em> "
++"szűrik a továbbított forgalmat más zónákból <strong>melynek célja %q</"
++"strong>. A továbbítási szabály <em>egyirányú</em>, tehát pl. egy továbbítás "
++"LAN-ból WAN-ba <em>nem</em> jelenti azt, hogy a továbbítás WAN-ból LAN-ba is "
++"engedélyezett."
++
++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 ""
++"Ez a lap lehetővé teszi a port továbbítási bejegyzések speciális "
++"tulajdonságainak módosítását. A legtöbb esetben ezeknek a beállításoknak a "
++"módosítása nem szükséges."
++
++msgid ""
++"This page allows you to change advanced properties of the traffic rule "
++"entry, such as matched source and destination hosts."
++msgstr ""
++"Ez a lap lehetővé teszi a forgalmi szabály bejegyzés speciális "
++"tulajdonságainak módosítását, mint a forrás- és célgépek megfeleltetése."
++
++#, 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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"Ez a rész a(z) %q általános beállításait határozza meg. A <em>bejövő</em> és "
++"<em>kimenő</em> beállítások határozzák meg a zónába be- és kilépő forgalom "
++"alapértelmezett szabályait, míg a <em>továbbítási</em> beállítás a különböző "
++"hálózatok közötti forgalomtovábbítás szabályát írja le a zónán belül. A "
++"<em>lefedett hálózatok</em> adják meg, hogy mely elérhető hálózatok tagjai "
++"ennek a zónának."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "%s-re %s-nél a <var>eszközön</var>"
++
++msgid "To %s in %s"
++msgstr "%s-re %s-ben"
++
++msgid "To %s on <var>this device</var>"
++msgstr "%s-re a <var>eszközön</var>"
++
++msgid "To %s, %s in %s"
++msgstr "%s-re, %s %s-ben"
++
++msgid "To source IP"
++msgstr "Forrás IP-re"
++
++msgid "To source port"
++msgstr "Forrás portra"
++
++msgid "Traffic Rules"
++msgstr "Forgalmi szabályok"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"A forgalmi szabályok a különböző zónák között utazó csomagokra vonatkozó "
++"házirendet határozzák meg, például bizonyos gépek közötti forgalom "
++"megakadályozához vagy WAN portok megnyitásához a routeren."
++
++msgid "Via %s"
++msgstr "%s-en át"
++
++msgid "Via %s at %s"
++msgstr "%s-en át %s-nél"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"Az \"-- egyéni --\" lehetőség választásával több protokoll megadása "
++"lehetséges egymástól szóközzell elválasztva."
++
++msgid "Zone %q"
++msgstr "Zóna %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Zóna ⇒ Továbbítások"
++
++msgid "Zones"
++msgstr "Zónák"
++
++msgid "accept"
++msgstr "elfogadás"
++
++msgid "any"
++msgstr "bármelyik"
++
++msgid "any host"
++msgstr "bármelyik gép"
++
++msgid "any router IP"
++msgstr "bármelyik router IP"
++
++msgid "any zone"
++msgstr "bármelyik zóna"
++
++msgid "don't track"
++msgstr "ne kövesse"
++
++msgid "drop"
++msgstr "eldobás"
++
++msgid "reject"
++msgstr "visszautasítás"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "Cél"
++
++#~ msgid "Family"
++#~ msgstr "Család"
++
++#~ msgid "Forward to %s in %s"
++#~ msgstr "Továbbítás ide:%s/%s"
++
++#~ msgid "Forward to %s, %s in %s"
++#~ msgstr "Továbbítás ide: %s, %s/%s"
++
++#~ msgid "SNAT"
++#~ msgstr "SNAT"
++
++#~ msgid "Source"
++#~ msgstr "Forrás"
++
++#~ msgid "Via"
++#~ msgstr "Keresztül"
++
++#~ msgid "Accept forward"
++#~ msgstr "Továbbítás engedélyezése"
++
++#~ msgid "Accept input"
++#~ msgstr "Bemenet engedélyezése"
++
++#~ msgid "Disable"
++#~ msgstr "Letiltás"
++
++#~ msgid "Discard forward"
++#~ msgstr "Kimenet eldobása"
++
++#~ msgid "Discard input"
++#~ msgstr "Bemenet eldobása"
++
++#~ msgid "Do not track forward"
++#~ msgstr "Ne kövesse a továbbítást"
++
++#~ msgid "Do not track input"
++#~ msgstr "Ne kövesse a bemenetet"
++
++#~ msgid "IP"
++#~ msgstr "IP"
++
++#~ msgid "IP range"
++#~ msgstr "IP tartomány"
++
++#~ msgid "IPs"
++#~ msgstr "IP-k"
++
++#~ msgid "MAC"
++#~ msgstr "MAC cím"
++
++#~ msgid "MACs"
++#~ msgstr "MAC címek"
++
++#~ msgid "Refuse forward"
++#~ msgstr "Továbbítás megtagadása"
++
++#~ msgid "Refuse input"
++#~ msgstr "Bemenet megtagadása"
++
++#~ msgid "Rule is disabled"
++#~ msgstr "Szabály letiltva"
++
++#~ msgid "Rule is enabled"
++#~ msgstr "Szabály engedélyezve"
++
++#~ msgid "day"
++#~ msgstr "nap"
++
++#~ msgid "hour"
++#~ msgstr "óra"
++
++#~ msgid "minute"
++#~ msgstr "perc"
++
++#~ msgid "not"
++#~ msgstr "nem"
++
++#~ msgid "port"
++#~ msgstr "port"
++
++#~ msgid "ports"
++#~ msgstr "portok"
++
++#~ msgid "second"
++#~ msgstr "másodperc"
++
++#~ msgid "type"
++#~ msgstr "típus"
++
++#~ msgid "types"
++#~ msgstr "típusok"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/it/firewall.po b/feeds/luci/applications/luci-app-firewall/po/it/firewall.po
+new file mode 100644
+index 0000000..2f87efc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/it/firewall.po
+@@ -0,0 +1,502 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2012-04-19 23:05+0200\n"
++"Last-Translator: claudyus <claudyus84@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr "%s%s con %s"
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr ""
++
++msgid "(Unnamed Rule)"
++msgstr ""
++
++msgid "(Unnamed SNAT)"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr " -- Selezionare --"
++
++msgid "-- custom --"
++msgstr " -- personalizzata --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> e limita a %s"
++
++msgid "Action"
++msgstr "Azione"
++
++msgid "Add"
++msgstr "Aggiungi"
++
++msgid "Add and edit..."
++msgstr "Aggiungi e edita..."
++
++msgid "Advanced Settings"
++msgstr "Opzioni Avanzate"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Permetti routing da <em>zone di origini</em>:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Permetti rountin a <em>zone di destinazione</em>:"
++
++msgid "Any"
++msgstr "Qualsiasi"
++
++msgid "Covered networks"
++msgstr ""
++
++msgid "Custom Rules"
++msgstr "Regole Personalizzate"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"Le regole personalizzate ti permettorno di eseguire comandi iptables "
++"arbitrari che non solo altrimenti coperti dall'applicazione firewall. I "
++"comandi sono eseguiti dopo ogni riavvio del firewall, giusto dopo le altre "
++"regole che son state caricate."
++
++msgid "Destination IP address"
++msgstr "Indirizzo IP destinazione"
++
++msgid "Destination address"
++msgstr "Indirizzo di destinazione"
++
++msgid "Destination port"
++msgstr "Porta di destinazione"
++
++msgid "Destination zone"
++msgstr "Zona di destinazione"
++
++msgid "Do not rewrite"
++msgstr ""
++
++msgid "Drop invalid packets"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable NAT Loopback"
++msgstr ""
++
++msgid "Enable SYN-flood protection"
++msgstr ""
++
++msgid "Enable logging on this zone"
++msgstr ""
++
++msgid "External IP address"
++msgstr ""
++
++msgid "External port"
++msgstr "Porta Esterna"
++
++msgid "External zone"
++msgstr ""
++
++msgid "Extra arguments"
++msgstr ""
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall - Custom Rules"
++msgstr ""
++
++msgid "Firewall - Port Forwards"
++msgstr ""
++
++msgid "Firewall - Traffic Rules"
++msgstr ""
++
++msgid "Firewall - Zone Settings"
++msgstr "Firewall - Opzioni delle Zone"
++
++msgid "Force connection tracking"
++msgstr ""
++
++msgid "Forward"
++msgstr ""
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr ""
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr "Opzioni Generali"
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 only"
++msgstr "Solo IPv4"
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr "Solo IPv6"
++
++msgid "Input"
++msgstr ""
++
++msgid "Inter-Zone Forwarding"
++msgstr ""
++
++msgid "Internal IP address"
++msgstr "Indirizzo IP Interno"
++
++msgid "Internal port"
++msgstr "Porta interna"
++
++msgid "Internal zone"
++msgstr ""
++
++msgid "Limit log messages"
++msgstr ""
++
++msgid "MSS clamping"
++msgstr ""
++
++msgid "Masquerading"
++msgstr ""
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr ""
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "New SNAT rule"
++msgstr ""
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr ""
++
++msgid "New port forward"
++msgstr ""
++
++msgid "New source NAT"
++msgstr ""
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr ""
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr ""
++
++msgid "Other..."
++msgstr ""
++
++msgid "Output"
++msgstr ""
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr ""
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++
++msgid "Protocol"
++msgstr "Protocollo"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr ""
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr ""
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr ""
++
++msgid "SNAT port"
++msgstr ""
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# msgid "Traffic Redirection"
++# msgstr ""
++# msgid ""
++# "Traffic redirection allows you to change the destination address of "
++# "forwarded packets."
++# msgstr ""
++# msgid "Overview"
++# msgstr ""
++# msgid "Name"
++# msgstr ""
++# msgid "Source zone"
++# msgstr ""
++# msgid "Source MAC-address"
++# msgstr ""
++# msgid "Source port"
++# msgstr ""
++# msgid "Protocol"
++# msgstr ""
++msgid "Source IP address"
++msgstr "Indirizzo IP di origine"
++
++msgid "Source MAC address"
++msgstr "Indirizzo MAC di origine"
++
++msgid "Source NAT"
++msgstr ""
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++msgid "Source address"
++msgstr "Indirizzo di origine"
++
++msgid "Source port"
++msgstr "Porta di origine"
++
++msgid "Source zone"
++msgstr "Zona di origine"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr ""
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr ""
++
++msgid "Zone ⇒ Forwardings"
++msgstr ""
++
++msgid "Zones"
++msgstr ""
++
++msgid "accept"
++msgstr "accetta"
++
++msgid "any"
++msgstr "qualsiasi"
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr ""
++
++msgid "reject"
++msgstr "rifiuta"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "Destinazione"
++
++#~ msgid "Source"
++#~ msgstr "Origine"
++
++#~ msgid "Accept input"
++#~ msgstr "Accetta INPUT"
++
++#~ msgid "(optional)"
++#~ msgstr "(facoltativo)"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Porta interna (opzionale)"
++
++#~ msgid "Advanced Options"
++#~ msgstr "Opzioni Avanzate"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "Regole Avanzate"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Le regole avanzate consentono di personalizzare il firewall per le tue "
++#~ "necessità. Solo le nuove connessioni saranno combinate. I pacchetti "
++#~ "appartenenti alle connessioni già aperte sono automaticamente autorizzate "
++#~ "ad oltrepassare il firewall."
++
++#~ msgid "Custom Rules (/etc/firewall.user)"
++#~ msgstr "Regole Personalizzate (/etc/firewall.user)"
++
++#~ msgid "Device"
++#~ msgstr "Dispositivo"
++
++#~ msgid "Rules"
++#~ msgstr "Regole"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/ja/firewall.po b/feeds/luci/applications/luci-app-firewall/po/ja/firewall.po
+new file mode 100644
+index 0000000..877a6f0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/ja/firewall.po
+@@ -0,0 +1,687 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2012-11-14 17:32+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr "%s%s ,%s"
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr "(åå‰è¨­å®šã®ç„¡ã„エントリー)"
++
++msgid "(Unnamed Rule)"
++msgstr "(åå‰è¨­å®šã®ç„¡ã„ルール)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(åå‰è¨­å®šã®ç„¡ã„SNAT)"
++
++msgid "-- Please choose --"
++msgstr "-- é¸æŠžã—ã¦ãã ã•ã„ --"
++
++msgid "-- custom --"
++msgstr "-- 手動設定 --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> パケット / <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++"<var>%d</var> パケット / <var>%s</var>, ãƒãƒ¼ã‚¹ãƒˆ <var>%d</var> パケット"
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var>, %s を上é™ã«è¨­å®š"
++
++msgid "Action"
++msgstr "動作"
++
++msgid "Add"
++msgstr "追加"
++
++msgid "Add and edit..."
++msgstr "追加åŠã³ç·¨é›†..."
++
++msgid "Advanced Settings"
++msgstr "詳細設定"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "<em>é€ä¿¡å…ƒã‚¾ãƒ¼ãƒ³</em>ã‹ã‚‰ã®è»¢é€ã‚’許å¯ã™ã‚‹:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "<em>宛先ゾーン</em>ã¸ã®è»¢é€ã‚’許å¯ã™ã‚‹:"
++
++msgid "Any"
++msgstr "å…¨ã¦"
++
++msgid "Covered networks"
++msgstr "対象ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++msgid "Custom Rules"
++msgstr "手動設定ルール"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"手動設定ルールã®è¨­å®šã§ã¯ã€ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«ã®è¨­å®šç”»é¢ã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„"
++"よã†ãªã€ä»»æ„ã®iptablesコマンドを実行ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ã“れらã®ä»»æ„ã®ã‚³ãƒžãƒ³"
++"ドã¯ã€ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«æ©Ÿèƒ½ã®èµ·å‹•ã”ã¨ã«ã€æ¨™æº–ã®ãƒ«ãƒ¼ãƒ«ãŒèª­ã¿è¾¼ã¾ã‚ŒãŸå¾Œã«å®Ÿè¡Œã•"
++"ã‚Œã¾ã™ã€‚"
++
++msgid "Destination IP address"
++msgstr "宛先IPアドレス"
++
++msgid "Destination address"
++msgstr "宛先アドレス"
++
++msgid "Destination port"
++msgstr "宛先ãƒãƒ¼ãƒˆ"
++
++msgid "Destination zone"
++msgstr "宛先ゾーン"
++
++msgid "Do not rewrite"
++msgstr "リライトã—ãªã„"
++
++msgid "Drop invalid packets"
++msgstr "無効ãªãƒ‘ケットをé®æ–­ã™ã‚‹"
++
++msgid "Enable"
++msgstr "有効"
++
++msgid "Enable NAT Loopback"
++msgstr "NATループãƒãƒƒã‚¯ã‚’有効ã«ã™ã‚‹"
++
++msgid "Enable SYN-flood protection"
++msgstr "SYN-Floodプロテクションを有効ã«ã™ã‚‹"
++
++msgid "Enable logging on this zone"
++msgstr "ã“ã®ã‚¾ãƒ¼ãƒ³ã®ãƒ­ã‚°è¨˜éŒ²ã‚’有効ã«ã™ã‚‹"
++
++msgid "External IP address"
++msgstr "外部IPアドレス"
++
++msgid "External port"
++msgstr "外部ãƒãƒ¼ãƒˆ"
++
++msgid "External zone"
++msgstr "外部ゾーン"
++
++msgid "Extra arguments"
++msgstr "追加設定"
++
++msgid "Firewall"
++msgstr "ファイアウォール"
++
++msgid "Firewall - Custom Rules"
++msgstr "ファイアウォール - 手動設定ルール"
++
++msgid "Firewall - Port Forwards"
++msgstr "ファイアウォール - ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¯ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°"
++
++msgid "Firewall - Traffic Rules"
++msgstr "ファイアウォール - トラフィック・ルール"
++
++msgid "Firewall - Zone Settings"
++msgstr "ファイアウォール - ゾーン設定"
++
++msgid "Force connection tracking"
++msgstr "強制的ã«ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³è¿½è·¡ã‚’è¡Œã†"
++
++msgid "Forward"
++msgstr "転é€"
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr "é€ä¿¡å…ƒ %s (%s)"
++
++msgid "From %s in %s with source %s"
++msgstr "é€ä¿¡å…ƒ %s (%s) , é€ä¿¡å…ƒ %s"
++
++msgid "From %s in %s with source %s and %s"
++msgstr "é€ä¿¡å…ƒ %s (%s) , é€ä¿¡å…ƒ %s, é€ä¿¡å…ƒ %s"
++
++msgid "General Settings"
++msgstr "一般設定"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4åŠã³IPv6"
++
++msgid "IPv4 only"
++msgstr "IPv4ã®ã¿"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "IPv6ã®ã¿"
++
++msgid "Input"
++msgstr "å—ä¿¡"
++
++msgid "Inter-Zone Forwarding"
++msgstr "内部ゾーン転é€"
++
++msgid "Internal IP address"
++msgstr "内部IPアドレス"
++
++msgid "Internal port"
++msgstr "内部ãƒãƒ¼ãƒˆ"
++
++msgid "Internal zone"
++msgstr "内部ゾーン"
++
++msgid "Limit log messages"
++msgstr "ログメッセージを制é™"
++
++msgid "MSS clamping"
++msgstr "MSSクランプ"
++
++msgid "Masquerading"
++msgstr "マスカレード"
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr "ICMPタイプã®ä¸€è‡´"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++"設定ã•ã‚ŒãŸå®›å…ˆãƒãƒ¼ãƒˆ(ã¾ãŸã¯ãƒãƒ¼ãƒˆç¯„囲)ã«ä¸€è‡´ã—ãŸè»¢é€ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒå¯¾è±¡ã«ãªã‚Š"
++"ã¾ã™"
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"設定ã•ã‚ŒãŸå®›å…ˆãƒãƒ¼ãƒˆ(ã¾ãŸã¯ãƒãƒ¼ãƒˆç¯„囲)ã«ä¸€è‡´ã—ãŸå—信トラフィックãŒå¯¾è±¡ã«ãªã‚Š"
++"ã¾ã™"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++"設定ã•ã‚ŒãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ›ã‚¹ãƒˆã®é€ä¿¡å…ƒãƒãƒ¼ãƒˆ(ã¾ãŸã¯ãƒãƒ¼ãƒˆç¯„囲)ã‹ã‚‰ã®å—信トラ"
++"フィックã¨ä¸€è‡´ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒå¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚"
++
++msgid "Name"
++msgstr "åå‰"
++
++msgid "New SNAT rule"
++msgstr "SNATルールã®æ–°è¦ä½œæˆ"
++
++msgid "New forward rule"
++msgstr "転é€ãƒ«ãƒ¼ãƒ«ã®æ–°è¦ä½œæˆ"
++
++msgid "New input rule"
++msgstr "å—信ルールã®æ–°è¦ä½œæˆ"
++
++msgid "New port forward"
++msgstr "転é€è¨­å®šã®æ–°è¦ä½œæˆ"
++
++msgid "New source NAT"
++msgstr "SNATルールã®æ–°è¦ä½œæˆ"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "設定ã•ã‚ŒãŸå®›å…ˆIPアドレスã¨ä¸€è‡´ã—ãŸå—信トラフィックãŒå¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚"
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "設定ã•ã‚ŒãŸMACアドレスã¨ä¸€è‡´ã—ãŸå—ä¿¡ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒå¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚"
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++"設定ã•ã‚ŒãŸIPアドレス (ã¾ãŸã¯ç¯„囲) ã¨ä¸€è‡´ã—ãŸå—ä¿¡ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒå¯¾è±¡ã«ãªã‚Š"
++"ã¾ã™ã€‚"
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++"設定ã•ã‚ŒãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ›ã‚¹ãƒˆã®é€ä¿¡å…ƒãƒãƒ¼ãƒˆ(ã¾ãŸã¯ãƒãƒ¼ãƒˆç¯„囲)ã‹ã‚‰ã®å—信トラ"
++"フィックã¨ä¸€è‡´ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®ã¿ã‚’対象ã«ã—ã¾ã™ã€‚"
++
++msgid "Open ports on router"
++msgstr "ãƒãƒ¼ãƒˆã®é–‹æ”¾"
++
++msgid "Other..."
++msgstr "ãã®ä»–ã®ãƒ—ロトコル"
++
++msgid "Output"
++msgstr "é€ä¿¡"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++"iptablesã«ãƒ‘ススルーã™ã‚‹è¿½åŠ ã®å¼•æ•°ã‚’設定ã—ã¦ãã ã•ã„。ãŸã ã—ã€æ³¨æ„ã—ã¦è¨­å®šã—"
++"ã¦ãã ã•ã„!"
++
++msgid "Port Forwards"
++msgstr "ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¯ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¯ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã¯ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆä¸Šã®ãƒªãƒ¢ãƒ¼ãƒˆã‚³ãƒ³ãƒ”ュータã‹ã‚‰ã€ãƒ—ライ"
++"ベートãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã®ã€ç‰¹å®šã®ã‚³ãƒ³ãƒ”ュータやサービスã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’å¯èƒ½ã«ã—"
++"ã¾ã™ã€‚"
++
++msgid "Protocol"
++msgstr "プロトコル"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++"ルールã«ä¸€è‡´ã—ãŸå—信トラフィックをã€å†…部ホストã®è¨­å®šã•ã‚ŒãŸãƒãƒ¼ãƒˆã¸è»¢é€ã—ã¾ã™"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "ルールã«ä¸€è‡´ã—ãŸå—信トラフィックをã€è¨­å®šã•ã‚ŒãŸå†…部ホストã¸è»¢é€ã—ã¾ã™"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "設定ã•ã‚ŒãŸå®›å…ˆã‚µãƒ–ãƒãƒƒãƒˆã¸ã®ãƒžã‚¹ã‚«ãƒ¬ãƒ¼ãƒ‰ã‚’制é™ã™ã‚‹"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "設定ã•ã‚ŒãŸé€ä¿¡å…ƒã‚µãƒ–ãƒãƒƒãƒˆã¸ã®ãƒžã‚¹ã‚«ãƒ¬ãƒ¼ãƒ‰ã‚’制é™ã™ã‚‹"
++
++msgid "Restrict to address family"
++msgstr "アドレスファミリã®åˆ¶é™"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++"ルールã«ä¸€è‡´ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã—ãŸå€¤ã«ãƒªãƒ©ã‚¤ãƒˆã—ã¾ã™ã€‚"
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++"ルールã«ä¸€è‡´ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®é€ä¿¡å…ƒãƒãƒ¼ãƒˆã‚’設定ã—ãŸå€¤ã«ãƒªãƒ©ã‚¤ãƒˆã—ã¾ã™ã€‚空欄"
++"ã«ã—ãŸå ´åˆã€IPアドレスã®ã¿ã‚’書ãç›´ã—ã¾ã™ã€‚"
++
++msgid "Rewrite to source %s"
++msgstr "é€ä¿¡å…ƒ %s ã«ãƒªãƒ©ã‚¤ãƒˆ"
++
++msgid "Rewrite to source %s, %s"
++msgstr "é€ä¿¡å…ƒ %s, %s ã«ãƒªãƒ©ã‚¤ãƒˆ"
++
++msgid "SNAT IP address"
++msgstr "SNAT IPアドレス"
++
++msgid "SNAT port"
++msgstr "SNAT ãƒãƒ¼ãƒˆ"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Traffic Redirection"
++# msgstr ""
++#
++# msgid ""
++# "Traffic redirection allows you to change the destination address of "
++# "forwarded packets."
++# msgstr ""
++#
++# msgid "Overview"
++# msgstr ""
++#
++# msgid "Name"
++# msgstr ""
++#
++# msgid "Source zone"
++# msgstr ""
++#
++# msgid "Source MAC-address"
++# msgstr ""
++#
++# msgid "Source port"
++# msgstr ""
++#
++# msgid "Protocol"
++# msgstr ""
++#
++msgid "Source IP address"
++msgstr "é€ä¿¡å…ƒIPアドレス"
++
++msgid "Source MAC address"
++msgstr "é€ä¿¡å…ƒMACアドレス"
++
++msgid "Source NAT"
++msgstr "é€ä¿¡å…ƒNAT"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"é€ä¿¡å…ƒNAT設定ã¯ã€è¤‡æ•°ã®WANアドレスを内部ã®ã‚µãƒ–ãƒãƒƒãƒˆã«ãƒžãƒƒãƒ”ングã™ã‚‹ã‚ˆã†ãªã€"
++"出力トラフィックã«å¯¾ã™ã‚‹é€ä¿¡å…ƒIPアドレスã®ãã‚ç´°ã‹ã„制御を行ã†ãƒžã‚¹ã‚«ãƒ¬ãƒ¼ãƒ‰ã®"
++"設定フォームã§ã™ã€‚"
++
++msgid "Source address"
++msgstr "é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++msgid "Source port"
++msgstr "é€ä¿¡å…ƒãƒãƒ¼ãƒˆ"
++
++msgid "Source zone"
++msgstr "é€ä¿¡å…ƒã‚¾ãƒ¼ãƒ³"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"ファイアウォール機能ã¯ã€å„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ä¸Šã«ã‚¾ãƒ¼ãƒ³ã‚’作æˆã—ã¦ãƒˆ"
++"ラフィックã®åˆ¶å¾¡ã‚’è¡Œã„ã¾ã™ã€‚"
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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ã¸ã®è»¢é€è¨­å®šã¯ã€wanã‹ã‚‰lanã¸ã®è»¢é€ã‚’<em>許å¯ã—"
++"ã¾ã›ã‚“。</em>"
++
++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 "
++"entry, such as matched source and destination hosts."
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ã€%sã®æ¨™æº–çš„ãªå‹•ä½œã‚’設定ã—ã¾ã™ã€‚<em>å—ä¿¡</em>åŠã³<em>é€ä¿¡</"
++"em>オプションã¯ã€ã“ã®ã‚¾ãƒ¼ãƒ³ã«å¯¾ã—ã¦å…¥å‡ºåŠ›ã™ã‚‹ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã«å¯¾ã™ã‚‹æ¨™æº–ã®ãƒãƒª"
++"シーを設定ã—ã€<em>転é€</em>オプションã¯ã€ã‚¾ãƒ¼ãƒ³é–“ã®è»¢é€ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã«å¯¾ã™ã‚‹æ¨™"
++"準ã®ãƒãƒªã‚·ãƒ¼ã«ãªã‚Šã¾ã™ã€‚<em>対象ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯</em>ã¯ã€ã©ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨­å®šãŒã“"
++"ã®ã‚¾ãƒ¼ãƒ³ã«å±žã™ã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚"
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "宛先 %s, %s (<var>デãƒã‚¤ã‚¹</var>)"
++
++msgid "To %s in %s"
++msgstr "宛先 %s (%s)"
++
++msgid "To %s on <var>this device</var>"
++msgstr "宛先 %s (<var>デãƒã‚¤ã‚¹</var>)"
++
++msgid "To %s, %s in %s"
++msgstr "宛先 %s, %s (%s)"
++
++msgid "To source IP"
++msgstr "変æ›å¾Œé€ä¿¡å…ƒIP"
++
++msgid "To source port"
++msgstr "変æ›å¾Œé€ä¿¡å…ƒãƒãƒ¼ãƒˆ"
++
++msgid "Traffic Rules"
++msgstr "トラフィック・ルール"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"トラフィック・ルールã®è¨­å®šã§ã¯ã€ã‚¾ãƒ¼ãƒ³é–“ã‚’è¡Œãæ¥ã™ã‚‹ãƒ‘ケットã®ãƒãƒªã‚·ãƒ¼ã‚’設定"
++"ã—ã¾ã™ã€‚例ãˆã°ã€ç‰¹å®šã®ãƒ›ã‚¹ãƒˆé–“ã‚„ã€ãƒ«ãƒ¼ã‚¿ãƒ¼ã®WANãƒãƒ¼ãƒˆã¸ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®æ‹’å¦ã‚’"
++"設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"\"-- 手動設定 --\"ã‚’é¸æŠžã—ã€ãƒ—ロトコルをスペースã§åŒºåˆ‡ã£ã¦å…¥åŠ›ã™ã‚‹ã“ã¨ã§è¤‡æ•°"
++"ã®ãƒ—ロトコルを指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
++
++msgid "Zone %q"
++msgstr "ゾーン %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "ゾーン ⇒ 転é€"
++
++msgid "Zones"
++msgstr "ゾーン"
++
++msgid "accept"
++msgstr "許å¯"
++
++msgid "any"
++msgstr "å…¨ã¦"
++
++msgid "any host"
++msgstr "å…¨ã¦ã®ãƒ›ã‚¹ãƒˆ"
++
++msgid "any router IP"
++msgstr "å…¨ã¦ã®ãƒ«ãƒ¼ã‚¿ãƒ¼IP"
++
++msgid "any zone"
++msgstr "å…¨ã¦ã®ã‚¾ãƒ¼ãƒ³"
++
++msgid "don't track"
++msgstr "コãƒã‚¯ã‚·ãƒ§ãƒ³è¿½è·¡ã‚’è¡Œã‚ãªã„"
++
++msgid "drop"
++msgstr "é®æ–­"
++
++msgid "reject"
++msgstr "æ‹’å¦"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "宛先"
++
++#~ msgid "Family"
++#~ msgstr "アドレスファミリ"
++
++#~ msgid "Forward to %s in %s"
++#~ msgstr "転é€å…ˆ %s (%s)"
++
++#~ msgid "Forward to %s, %s in %s"
++#~ msgstr "転é€å…ˆ %s, %s (%s)"
++
++#~ msgid "SNAT"
++#~ msgstr "SNAT"
++
++#~ msgid "Source"
++#~ msgstr "é€ä¿¡å…ƒ"
++
++#~ msgid "To %s"
++#~ msgstr "宛先 %s"
++
++#~ msgid "To %s at %s"
++#~ msgstr "宛先 %s, %s"
++
++#~ msgid "Via"
++#~ msgstr "経由"
++
++#~ msgid "Accept forward"
++#~ msgstr "転é€ã‚’許å¯"
++
++#~ msgid "Accept input"
++#~ msgstr "å—信を許å¯"
++
++#~ msgid "Disable"
++#~ msgstr "無効"
++
++#~ msgid "Discard forward"
++#~ msgstr "転é€ã‚’破棄"
++
++#~ msgid "Discard input"
++#~ msgstr "入力を破棄"
++
++#~ msgid "Do not track forward"
++#~ msgstr "転é€ã®è¿½è·¡ã‚’è¡Œã‚ãªã„"
++
++#~ msgid "Do not track input"
++#~ msgstr "入力ã®è¿½è·¡ã‚’è¡Œã‚ãªã„"
++
++#~ msgid "IP"
++#~ msgstr "IP"
++
++#~ msgid "IP range"
++#~ msgstr "IPレンジ"
++
++#~ msgid "IPs"
++#~ msgstr "IP"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MACs"
++#~ msgstr "MAC"
++
++#~ msgid "Refuse forward"
++#~ msgstr "転é€ã‚’æ‹’å¦"
++
++#~ msgid "Refuse input"
++#~ msgstr "å—ä¿¡ã‚’æ‹’å¦"
++
++#~ msgid "Rule is disabled"
++#~ msgstr "ルール設定ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™"
++
++#~ msgid "Rule is enabled"
++#~ msgstr "ルール設定ã¯æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™"
++
++#~ msgid "day"
++#~ msgstr "æ—¥"
++
++#~ msgid "hour"
++#~ msgstr "時"
++
++#~ msgid "minute"
++#~ msgstr "分"
++
++#~ msgid "not"
++#~ msgstr "not"
++
++#~ msgid "port"
++#~ msgstr "ãƒãƒ¼ãƒˆ"
++
++#~ msgid "ports"
++#~ msgstr "ãƒãƒ¼ãƒˆ"
++
++#~ msgid "second"
++#~ msgstr "秒"
++
++#~ msgid "type"
++#~ msgstr "タイプ"
++
++#~ msgid "types"
++#~ msgstr "タイプ"
++
++#~ msgid "(optional)"
++#~ msgstr "(オプション)"
++
++#~ msgid "Intended destination address"
++#~ msgstr "æ„図ã•ã‚ŒãŸå®›å…ˆã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "内部ãƒãƒ¼ãƒˆï¼ˆã‚ªãƒ—ション)"
++
++#~ msgid "Advanced Options"
++#~ msgstr "詳細ãªã‚ªãƒ—ション"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "詳細ãªãƒ«ãƒ¼ãƒ«"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "詳細ãªãƒ«ãƒ¼ãƒ«è¨­å®šã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—ã€ã™ã§ã«æŽ¥ç¶šãŒè¡Œã‚ã‚Œã¦ã„るパ"
++#~ "ケットã«é–¢ã—ã¦ã¯ã€è‡ªå‹•çš„ã«ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«ã®é€šéŽã‚’許å¯ã•ã‚Œã¾ã™ã€‚"
++
++#~ msgid "Custom Rules (/etc/firewall.user)"
++#~ msgstr "手動設定ルール (/etc/firewall.user)"
++
++#~ msgid "Device"
++#~ msgstr "デãƒã‚¤ã‚¹"
++
++#~ msgid ""
++#~ "For DNAT, match incoming traffic directed at the given destination ip "
++#~ "address. For SNAT rewrite the source address to the given address."
++#~ msgstr ""
++#~ "DNATã®å ´åˆã€è¨­å®šã•ã‚ŒãŸå®›å…ˆã‚¢ãƒ‰ãƒ¬ã‚¹ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã«å¯¾ã—ã¦åˆè‡´ã‚’è¡Œã„ã¾ã™ã€‚"
++#~ "SNATã®å ´åˆã€é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã•ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã§ä¸Šæ›¸ãã—ã¾ã™ã€‚"
++
++#~ msgid "Overview"
++#~ msgstr "概è¦"
++
++#~ msgid "Port forwarding"
++#~ msgstr "ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¯ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¯ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’使用ã™ã‚‹ã“ã¨ã§ã€å†…部ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã‚µãƒ¼ãƒ“スを外部ã«"
++#~ "æä¾›ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
++
++#~ msgid "Redirection type"
++#~ msgstr "転é€ã‚¿ã‚¤ãƒ—"
++
++#~ msgid "Redirections"
++#~ msgstr "転é€"
++
++#~ msgid "Rules"
++#~ msgstr "ルール"
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "トラフィック転é€"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "トラフィック転é€æ©Ÿèƒ½ã‚’用ã„ã‚‹ã“ã¨ã§ã€è»¢é€ã—ãŸãƒ‘ケットã®å®›å…ˆã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’変更ã™"
++#~ "ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/ms/firewall.po b/feeds/luci/applications/luci-app-firewall/po/ms/firewall.po
+new file mode 100644
+index 0000000..ccbec60
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/ms/firewall.po
+@@ -0,0 +1,431 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr ""
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr ""
++
++msgid "(Unnamed Rule)"
++msgstr ""
++
++msgid "(Unnamed SNAT)"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add and edit..."
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr ""
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr ""
++
++msgid "Any"
++msgstr ""
++
++msgid "Covered networks"
++msgstr ""
++
++msgid "Custom Rules"
++msgstr ""
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++
++msgid "Destination IP address"
++msgstr ""
++
++msgid "Destination address"
++msgstr ""
++
++msgid "Destination port"
++msgstr ""
++
++msgid "Destination zone"
++msgstr ""
++
++msgid "Do not rewrite"
++msgstr ""
++
++msgid "Drop invalid packets"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable NAT Loopback"
++msgstr ""
++
++msgid "Enable SYN-flood protection"
++msgstr ""
++
++msgid "Enable logging on this zone"
++msgstr ""
++
++msgid "External IP address"
++msgstr ""
++
++msgid "External port"
++msgstr ""
++
++msgid "External zone"
++msgstr ""
++
++msgid "Extra arguments"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Firewall - Custom Rules"
++msgstr ""
++
++msgid "Firewall - Port Forwards"
++msgstr ""
++
++msgid "Firewall - Traffic Rules"
++msgstr ""
++
++msgid "Firewall - Zone Settings"
++msgstr ""
++
++msgid "Force connection tracking"
++msgstr ""
++
++msgid "Forward"
++msgstr ""
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr ""
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "Input"
++msgstr ""
++
++msgid "Inter-Zone Forwarding"
++msgstr ""
++
++msgid "Internal IP address"
++msgstr ""
++
++msgid "Internal port"
++msgstr ""
++
++msgid "Internal zone"
++msgstr ""
++
++msgid "Limit log messages"
++msgstr ""
++
++msgid "MSS clamping"
++msgstr ""
++
++msgid "Masquerading"
++msgstr ""
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr ""
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "New SNAT rule"
++msgstr ""
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr ""
++
++msgid "New port forward"
++msgstr ""
++
++msgid "New source NAT"
++msgstr ""
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr ""
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr ""
++
++msgid "Other..."
++msgstr ""
++
++msgid "Output"
++msgstr ""
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr ""
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr ""
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr ""
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr ""
++
++msgid "SNAT port"
++msgstr ""
++
++msgid "Source IP address"
++msgstr ""
++
++msgid "Source MAC address"
++msgstr ""
++
++msgid "Source NAT"
++msgstr ""
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid "Source port"
++msgstr ""
++
++msgid "Source zone"
++msgstr ""
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr ""
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr ""
++
++msgid "Zone ⇒ Forwardings"
++msgstr ""
++
++msgid "Zones"
++msgstr ""
++
++msgid "accept"
++msgstr ""
++
++msgid "any"
++msgstr ""
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr ""
++
++msgid "reject"
++msgstr ""
++
++msgid "traffic"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-firewall/po/no/firewall.po b/feeds/luci/applications/luci-app-firewall/po/no/firewall.po
+new file mode 100644
+index 0000000..e49f3ac
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/no/firewall.po
+@@ -0,0 +1,565 @@
++msgid ""
++msgstr ""
++"PO-Revision-Date: 2013-03-25 16:42+0200\n"
++"Last-Translator: protx <lars.hardy@gmail.com>\n"
++"Language: no\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr "%s i %s"
++
++msgid "%s%s with %s"
++msgstr "%s%s med %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s i %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(oppføring uten navn)"
++
++msgid "(Unnamed Rule)"
++msgstr "(regel uten navn)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(SNAT uten navn)"
++
++msgid "-- Please choose --"
++msgstr "-- Vennligst velg --"
++
++msgid "-- custom --"
++msgstr "-- egendefinert --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> pakker per <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr "<var>%d</var> pakker per <var>%s</var>, burst <var>%d</var>pakker."
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> og begrens til %s"
++
++msgid "Action"
++msgstr "Handling"
++
++msgid "Add"
++msgstr "Legg til"
++
++msgid "Add and edit..."
++msgstr "Legg til og redigere..."
++
++msgid "Advanced Settings"
++msgstr "Avanserte Innstillinger"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Tillat videresending fra <em>kilde soner</em>:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Tillat videresending til <em>destinasjon soner</em>:"
++
++msgid "Any"
++msgstr "Enhver"
++
++msgid "Covered networks"
++msgstr "Gjeldene nettverk"
++
++msgid "Custom Rules"
++msgstr "Egendefinerte Regler"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"Egendefinerte regler tillater deg å utføre vilkårlige iptables kommandoer "
++"som ikke dekkes av brannmurens standardoppsett. Kommandoene utføres etter "
++"hver omstart av brannmuren, rett etter at standard regelsett er lastet."
++
++msgid "Destination IP address"
++msgstr "Destinasjon IP adresse"
++
++msgid "Destination address"
++msgstr "Destinasjon adresse"
++
++msgid "Destination port"
++msgstr "Destinasjon port"
++
++msgid "Destination zone"
++msgstr "Destinasjon sone"
++
++msgid "Do not rewrite"
++msgstr "Ikke omskriv"
++
++msgid "Drop invalid packets"
++msgstr "Forkast ugyldige pakker"
++
++msgid "Enable"
++msgstr "Aktiver"
++
++msgid "Enable NAT Loopback"
++msgstr "Aktiver NAT <abbr title=\"Loopback\">Tilbakekobling</abbr>"
++
++msgid "Enable SYN-flood protection"
++msgstr "Aktiver SYN-flood beskyttelse"
++
++msgid "Enable logging on this zone"
++msgstr "Aktiver logging av denne sonen"
++
++msgid "External IP address"
++msgstr "Ekstern IP adressse"
++
++msgid "External port"
++msgstr "Ekstern port"
++
++msgid "External zone"
++msgstr "Ekstern sone"
++
++msgid "Extra arguments"
++msgstr "Ekstra argumenter"
++
++msgid "Firewall"
++msgstr "Brannmur"
++
++msgid "Firewall - Custom Rules"
++msgstr "Brannmur - Egendefinerte Regler"
++
++msgid "Firewall - Port Forwards"
++msgstr "Brannmur - Port Videresending"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Brannmur - Trafikk Regler"
++
++msgid "Firewall - Zone Settings"
++msgstr "Brannmur - Sone Innstillinger"
++
++msgid "Force connection tracking"
++msgstr ""
++"Bruk <abbr title=\\\"connection tracking\\\">forbindelse sporing</abbr>"
++
++msgid "Forward"
++msgstr "Videresend"
++
++msgid "Forward to"
++msgstr "Videresend til"
++
++msgid "From %s in %s"
++msgstr "Fra %s i %s"
++
++msgid "From %s in %s with source %s"
++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 "General Settings"
++msgstr "Generelle Innstillinger"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 og IPv6"
++
++msgid "IPv4 only"
++msgstr "Kun IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "Kun IPv6"
++
++msgid "Input"
++msgstr "Inndata"
++
++msgid "Inter-Zone Forwarding"
++msgstr "Sone til Sone Videresending"
++
++msgid "Internal IP address"
++msgstr "Intern IP adresse"
++
++msgid "Internal port"
++msgstr "Intern port"
++
++msgid "Internal zone"
++msgstr "Intern sone"
++
++msgid "Limit log messages"
++msgstr "Begrens logging"
++
++msgid "MSS clamping"
++msgstr "MSS Kontroll (Clamping)"
++
++msgid "Masquerading"
++msgstr "Masquerading"
++
++msgid "Match"
++msgstr "Match"
++
++msgid "Match ICMP type"
++msgstr "Match ICMP type"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++"Match videresendt trafikk til den oppgitte destinasjonsport eller "
++"portområdet."
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"Match innkommende trafikk rettet mot den oppgitte destinasjonsport eller "
++"portområdet på denne verten"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++"Match innkommende trafikk som kommer fra den oppgitte kildeport eller "
++"portområdet på klienten."
++
++msgid "Name"
++msgstr "Navn"
++
++msgid "New SNAT rule"
++msgstr "Ny SNAT regel"
++
++msgid "New forward rule"
++msgstr "Ny videresending regel"
++
++msgid "New input rule"
++msgstr "Ny inndata regel"
++
++msgid "New port forward"
++msgstr "Ny port videresending"
++
++msgid "New source NAT"
++msgstr "Ny kilde NAT"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "Match kun innkommende trafikk rettet mot den oppgitt IP adresse."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "Match kun innkommende trafikk fra disse MAC adresser."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr "Match kun innkommende trafikk fra denne IP eller IP område."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++"Match kun innkommende trafikk som kommer fra den oppgitte kildeport eller "
++"fra portområdet til klienten"
++
++msgid "Open ports on router"
++msgstr "Åpne porter på ruteren"
++
++msgid "Other..."
++msgstr "Andre..."
++
++msgid "Output"
++msgstr "Utdata"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr "Sender flere argumenter til iptables. Bruk med forsiktighet!"
++
++msgid "Port Forwards"
++msgstr "Port Videresendinger"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"Port videresending tillater at eksterne datamaskiner på Internett kan koble "
++"seg til en bestemt maskin eller tjeneste innenfor det private LAN."
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++"Viderekoble matchet innkommende trafikk til den oppgitte porten på intern "
++"vert"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Viderekoble matchet innkommende trafikk til den angitte interne vert"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "Begrens Masquerading til oppgitt destinasjons subnett"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "Begrens Masqeuerading til oppgitt kilde subnett"
++
++msgid "Restrict to address family"
++msgstr "Begrens til adresse familie"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr "Omskriv matchet trafikk til den oppgitte adressen."
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++"Omskriv matchet trafikk til den oppgitte kildeport. Kan stå tom for kun "
++"omskriving av IP adressen."
++
++msgid "Rewrite to source %s"
++msgstr "Omskriv til kilde %s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "Omskriv til kilde %s, %s"
++
++msgid "SNAT IP address"
++msgstr "SNAT IP adresse"
++
++msgid "SNAT port"
++msgstr "SNAT port"
++
++msgid "Source IP address"
++msgstr "Kilde IP adresse"
++
++msgid "Source MAC address"
++msgstr "Kilde MAC adresse"
++
++msgid "Source NAT"
++msgstr "Kilde NAT"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"Kilde NAT er en spesifikk form for masquerading som tillater finkornet "
++"kontroll over kilde IP adressen som brukes for utgående trafikk, for "
++"eksempel for å mappe flere WAN adresser til interne subnett."
++
++msgid "Source address"
++msgstr "Kilde adresse"
++
++msgid "Source port"
++msgstr "Kilde port"
++
++msgid "Source zone"
++msgstr "Kilde sone"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"Brannmuren skaper soner over nettverkets grensesnitt for å styre "
++"nettverkstrafikken."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++"Med valgene under konfigurerer man videresending mellom denne sone (%s) og "
++"andre soner. <em>Destinasjons soner</em> omhandler videresendt trafikk "
++"<strong>med opprinnelse fra %q</strong>. <em>Kilde soner</em> matcher "
++"videresendt trafikk fra andre soner <strong>rettet mot %q</strong>. Reglene "
++"ved videresending er <em>enveis</em>, d.v.s at videresending fra LAN til WAN "
++"<em>ikke</em> automatisk også tillater videresending fra WAN til 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 ""
++"Denne siden lar deg endre avanserte egenskaper til port videresending "
++"oppføringer. I de fleste tilfeller er det ikke nødvendig å endre disse "
++"innstillingene."
++
++msgid ""
++"This page allows you to change advanced properties of the traffic rule "
++"entry, such as matched source and destination hosts."
++msgstr ""
++"Denne siden lar deg endre de avanserte egenskapene til trafikken regel "
++"oppføringer, som for eksempel matchet kilde og destinasjons vert."
++
++#, 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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"Denne seksjonen definerer de vanligste valg for %q. Med <em>Inndata</em> og "
++"<em>Utdata</em> fastsetter man vanlige regler for trafikk gjennom sonen, "
++"mens <em>videresend</em> valget definerer regler for videresendt trafikk "
++"mellom forskjellige nettverk i sonen. <em>Gjeldene nettverk</em> "
++"spesifiserer hvilken av de tilgjengelige nettverk som er medlem av denne "
++"sone."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "Til %s på %s på <var>denne enheten</var>"
++
++msgid "To %s in %s"
++msgstr "Til %s i %s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "Til %s på <var>denne enheten</var>"
++
++msgid "To %s, %s in %s"
++msgstr "Til %s, %s i %s"
++
++msgid "To source IP"
++msgstr "Til kilde IP"
++
++msgid "To source port"
++msgstr "Til kilde port"
++
++msgid "Traffic Rules"
++msgstr "Trafikk Regler"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"Trafikk regler definerer regler for sending av pakker mellom ulike soner, "
++"for eksempel for å avvise trafikk mellom visse verter eller for å åpne WAN "
++"porter på ruteren."
++
++msgid "Via %s"
++msgstr "Via %s"
++
++msgid "Via %s at %s"
++msgstr "Via %s på %s"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"Du kan spesifisere flere ved å velge \"-- egendefinert --\" og deretter "
++"skrive flere protokoller atskilt med mellomrom."
++
++msgid "Zone %q"
++msgstr "Sone %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Sone = Videresendinger"
++
++msgid "Zones"
++msgstr "Soner"
++
++msgid "accept"
++msgstr "godta"
++
++msgid "any"
++msgstr "enhver"
++
++msgid "any host"
++msgstr "enhver vert"
++
++msgid "any router IP"
++msgstr "enhver ruter IP"
++
++msgid "any zone"
++msgstr "enhver sone"
++
++msgid "don't track"
++msgstr "ikke track"
++
++msgid "drop"
++msgstr "forkast"
++
++msgid "reject"
++msgstr "avslå"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "Destinasjon"
++
++#~ msgid "Family"
++#~ msgstr "Adressefamilie"
++
++#~ msgid "Source"
++#~ msgstr "Kilde"
++
++#~ msgid "Via"
++#~ msgstr "Via"
++
++#~ msgid "(optional)"
++#~ msgstr "(valgfritt)"
++
++#~ msgid "Intended destination address"
++#~ msgstr "Ønsket destinasjon adresse"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Intern port (valgfritt)"
++
++#~ msgid "Advanced Options"
++#~ msgstr "Avanserte Valg"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "Avanserte Regler"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Avanserte regler lar deg tilpasse brannmuren til dine behov. Kun nye "
++#~ "tilkoblinger blir berørt. Pakker som tilhører eksisterende tilkoblinger "
++#~ "slipper derfor igjennom brannmuren."
++
++#~ msgid "Custom Rules (/etc/firewall.user)"
++#~ msgstr "Egendefinerte Regler (/etc/firewall.user)"
++
++#~ msgid "Device"
++#~ msgstr "Enhet"
++
++#~ msgid ""
++#~ "For DNAT, match incoming traffic directed at the given destination ip "
++#~ "address. For SNAT rewrite the source address to the given address."
++#~ msgstr ""
++#~ "DNAT: Matcher innkommende trafikk som er rettet mot destinasjons IP-"
++#~ "adressen du angir her. SNAT: Omskriver kilde IP-adressen slik at den blir "
++#~ "lik den IP-adressen du angir her."
++
++#~ msgid ""
++#~ "Match incoming traffic originating from the given source port or port "
++#~ "range on the client host"
++#~ msgstr "Match innkommende trafikk som kommer fra dette port/portområde"
++
++#~ msgid "Overview"
++#~ msgstr "Oversikt"
++
++#~ msgid "Port forwarding"
++#~ msgstr "Port Videresending"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "<abbr title=\"Port Forwarding\">Port Videresending</abbr> tillater at "
++#~ "tjenester fra det interne nettverket kan tilbys et eksternt nettverk."
++
++#~ msgid "Redirection type"
++#~ msgstr "Omadressering type"
++
++#~ msgid "Redirections"
++#~ msgstr "Omadresseringer"
++
++#~ msgid "Rules"
++#~ msgstr "Regler"
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "Trafikk Omadressering"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "<abbr title=\"Traffic Redirection\">Trafikk Omadressering</abbr> lar deg "
++#~ "endre destinasjons adresse på videresendte pakker."
+diff --git a/feeds/luci/applications/luci-app-firewall/po/pl/firewall.po b/feeds/luci/applications/luci-app-firewall/po/pl/firewall.po
+new file mode 100644
+index 0000000..2ccd25c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/pl/firewall.po
+@@ -0,0 +1,621 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2013-06-22 15:49+0200\n"
++"Last-Translator: obsy <cezary@eko.one.pl>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 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 w %s"
++
++msgid "%s%s with %s"
++msgstr "%s%s z %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s w %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(Nienazwany wpis)"
++
++msgid "(Unnamed Rule)"
++msgstr "(Nienazwana reguła)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(Nienazwany SNAT)"
++
++msgid "-- Please choose --"
++msgstr "-- Proszę wybrać --"
++
++msgid "-- custom --"
++msgstr "-- własne --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> pakiet. na <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++"<var>%d</var> pakiet. na <var>%s</var>, popsutych <var>%d</var> pakiet."
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> i ograniczone do %s"
++
++msgid "Action"
++msgstr "Działanie"
++
++msgid "Add"
++msgstr "Dodaj"
++
++msgid "Add and edit..."
++msgstr "Dodaj i edytuj..."
++
++msgid "Advanced Settings"
++msgstr "Ustawienia zaawansowane"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Zezwól na przekazywanie z <em>source zones</em>:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Zezwól na przekazywanie do <em>destination zones</em>:"
++
++msgid "Any"
++msgstr "Każdy"
++
++msgid "Covered networks"
++msgstr "Objęte sieci"
++
++msgid "Custom Rules"
++msgstr "Własne reguły"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"Własne reguły pozwalają na arbitralne wykonanie poleceń iptables, które nie "
++"są objęte składnią zapory. Polecenia wykonywane są po każdym restarcie "
++"zapory, zaraz po załadowaniu zestawu reguł domyślnych."
++
++msgid "Destination IP address"
++msgstr "Docelowy adres IP"
++
++msgid "Destination address"
++msgstr "Adres docelowy"
++
++msgid "Destination port"
++msgstr "Port docelowy"
++
++msgid "Destination zone"
++msgstr "Strefa docelowa"
++
++msgid "Do not rewrite"
++msgstr "Nie przepisuj"
++
++msgid "Drop invalid packets"
++msgstr "Porzuć wadliwe pakiety"
++
++msgid "Enable"
++msgstr "WÅ‚Ä…cz"
++
++msgid "Enable NAT Loopback"
++msgstr "WÅ‚Ä…cz NAT Loopback"
++
++msgid "Enable SYN-flood protection"
++msgstr "WÅ‚Ä…cz ochronÄ™ przed atakiem SYN-flood"
++
++msgid "Enable logging on this zone"
++msgstr "WÅ‚Ä…cz logowanie na tej strefy"
++
++msgid "External IP address"
++msgstr "Zewnętrzne adresy IP"
++
++msgid "External port"
++msgstr "Port zewnętrzny"
++
++msgid "External zone"
++msgstr "Strefa zewnętrzna"
++
++msgid "Extra arguments"
++msgstr "Dodatkowe argumenty"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/zones.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++msgid "Firewall"
++msgstr "Zapora"
++
++msgid "Firewall - Custom Rules"
++msgstr "Zapora - Reguły własne"
++
++msgid "Firewall - Port Forwards"
++msgstr "Zapora - Przekazywanie portów"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Zapora - Reguły ruchu"
++
++msgid "Firewall - Zone Settings"
++msgstr "Zapora - Ustawienia strefy"
++
++msgid "Force connection tracking"
++msgstr "Wymuś śledzenie połączeń"
++
++msgid "Forward"
++msgstr "Przekazuj"
++
++msgid "Forward to"
++msgstr "Przekazuj do"
++
++msgid "From %s in %s"
++msgstr "Z %s w %s"
++
++msgid "From %s in %s with source %s"
++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 "General Settings"
++msgstr "Ustawienia ogólne"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 i IPv6"
++
++msgid "IPv4 only"
++msgstr "Tylko IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "Tylko IPv6"
++
++msgid "Input"
++msgstr "Ruch przychodzÄ…cy"
++
++msgid "Inter-Zone Forwarding"
++msgstr "Przekazywanie pomiędzy strefami"
++
++msgid "Internal IP address"
++msgstr "Wewnętrzny adres IP"
++
++msgid "Internal port"
++msgstr "Wewnętrzny port"
++
++msgid "Internal zone"
++msgstr "Strefa wewnętrzna"
++
++msgid "Limit log messages"
++msgstr "Ograniczenie logowania"
++
++msgid "MSS clamping"
++msgstr "Dostosuj MSS"
++
++msgid "Masquerading"
++msgstr "Maskarada"
++
++msgid "Match"
++msgstr "Dopasuj"
++
++msgid "Match ICMP type"
++msgstr "Dopasuj typ ICMP"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++"Dopasuj przekazywany ruch do danego docelowego portu lub zakresu portów"
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"Dopasuj ruch przychodzący do danego portu docelowego lub zakresu portów na "
++"tym hoście"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++"Dopasuj przychodzący ruch pochodzący z danego portu źródłowego lub zakresu "
++"portów na hoście klienta."
++
++msgid "Name"
++msgstr "Nazwa"
++
++msgid "New SNAT rule"
++msgstr "Nowa reguła SNAT"
++
++msgid "New forward rule"
++msgstr "Nowa reguła przekazywania (forward)"
++
++msgid "New input rule"
++msgstr "Nowa reguła wejściowa (input)"
++
++msgid "New port forward"
++msgstr "Nowe przekierowanie portu"
++
++msgid "New source NAT"
++msgstr "Nowy NAT źródłowy"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "Dopasuj tylko przychodzÄ…cy ruch skierowany do danego adresu IP."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "Dopasuj tylko ruch z tych adresów MAC."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr "Dopasuj tylko ruch przychodzący z tego adresu IP lub zakresu adresów."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++"Dopasuj tylko ruch przychodzący z podanego portu źródłowego lub zakresu "
++"portów na hoście klienta"
++
++msgid "Open ports on router"
++msgstr "Otwarte porty na routerze"
++
++msgid "Other..."
++msgstr "Inne..."
++
++msgid "Output"
++msgstr "Wyjście (Output)"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++"Przekazuje dodatkowe argumenty do iptables. Zachowaj szczególną ostrożność!"
++
++msgid "Port Forwards"
++msgstr "Przekierowania portów"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"Przekierowanie portów pozwala komputerom z internetu na połączenia z "
++"komputerami z sieci LAN."
++
++msgid "Protocol"
++msgstr "Protokół"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++"Przekieruj ruch przychodzÄ…cy na podany port do wskazanego hosta w sieci "
++"wewnętrznej"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Przekieruj ruch przychodzący do wskazanego hosta w sieci wewnętrznej"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "Ogranicz maskaradÄ™ do wskazanych sieci docelowych"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "Ogranicz maskaradę do wskazanych sieci źródłowych"
++
++# Wstawiłem rodzinę gdyż gdzieś wcześniej było tak opisane ale klasa pasuje mi tu bardziej.
++# Obsy - niestety ale "rodzina". W gui dotyczy to wyboru IPv4/IPv6, więc "rodzina" a nie klasa.
++msgid "Restrict to address family"
++msgstr "Ogranicz do rodziny adresów"
++
++# Dosłownie przetłumaczone, nie bardzo wiem czy chodzi o czynność przepisywania pakietu przez usługę czy to jakieś ogólne sformułowanie...
++msgid "Rewrite matched traffic to the given address."
++msgstr "Przepisz dopasowany ruch do wskazanych adresów."
++
++# Jak wyżej chodzi o przepisanie pakietu przez usługę?
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++"Przepisz dopasowany ruch do danego portu źródłowego. Można zostawić puste "
++"aby przepisać tylko adres IP"
++
++msgid "Rewrite to source %s"
++msgstr "Przepisz do źródła %s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "Przepisz do źródła %s, %s"
++
++msgid "SNAT IP address"
++msgstr "Adres IP SNAT"
++
++msgid "SNAT port"
++msgstr "Port SNAT"
++
++msgid "Source IP address"
++msgstr "Źródłowy adres IP"
++
++msgid "Source MAC address"
++msgstr "Źródłowy adres MAC"
++
++msgid "Source NAT"
++msgstr "NAT źródłowy"
++
++# http://www.digipedia.pl/def/doc/id/677604507/name/SNAT/
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"SNAT używany jest wtedy, gdy zmieniane są adresy pakietów połączenia "
++"wychodzącego, czyli pakiety źródłowe. Wykonywany jest zawsze po routowaniu "
++"(POSTROUTING), a więc w chwili, gdy pakiety są gotowe opuścić host. "
++"IPmasquerading jest formÄ… SNAT."
++
++msgid "Source address"
++msgstr "Adres źródłowy"
++
++msgid "Source port"
++msgstr "Port źródłowy"
++
++msgid "Source zone"
++msgstr "Strefa źródłowa"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"Firewall tworzy strefy z Twoich interfejsów sieciowych, aby kontrolować ruch "
++"sieciowy."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++"Opcje poniżej kontrolują politykę przekazywania pomiędzy tą strefą (%s) a "
++"innymi strefami. <em>Strefy docelowe</em> obejmujÄ… przekazywany ruch "
++"<strong>pochodzący z %q</strong>. <em>Strefy źródłowe</em> match forwarded "
++"traffic from other zones <strong>skierowane do %q</strong>. Reguła "
++"przekazywania jest <em>jednokierunkowa</em>, np. przekazywanie z sieci LAN "
++"do WAN <em>nie</em> implikuje pozwolenia na przekazywanie z sieci WAN do 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 ""
++"Ta strona pozwala zmienić zaawansowane ustawienia przekierowania portów. W "
++"większości przypadków nie ma potrzeby zmieniać tych ustawień."
++
++msgid ""
++"This page allows you to change advanced properties of the traffic rule "
++"entry, such as matched source and destination hosts."
++msgstr ""
++"Ta strona pozwala zmienić zaawansowane ustawienia reguły ruchu sieciowego, "
++"takie jak pasujące źródło i hosty docelowe."
++
++#, 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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"Ta sekcja definiuje ustawienia ogólne %q. Opcje <em>\"wejście\"</em> i <em>"
++"\"wyjście\"</em> określają domyślną politykę dla ruchu przychodzącego i "
++"wychodzÄ…cego w tej strefie, podczas gdy <em>\"przekazywanie\"</em> opisuje "
++"politykę ruchu przekazywanego pomiędzy różnymi sieciami wewnątrz strefy. "
++"<em>Objęte sieci</em> określają dostępne sieci będące członkami tej strefy."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "Do %s w %s na <var>tym urzÄ…dzeniu</var>"
++
++msgid "To %s in %s"
++msgstr "Do %s w %s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "Do %s na <var>tym urzÄ…dzeniu</var>"
++
++msgid "To %s, %s in %s"
++msgstr "Do %s, %s w %s"
++
++msgid "To source IP"
++msgstr "Do źródłowego IP"
++
++msgid "To source port"
++msgstr "Do źródłowego portu"
++
++msgid "Traffic Rules"
++msgstr "Reguły ruchu sieciowego"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"Reguły ruchu sieciowego definiują politykę dla pakietów przechodzących "
++"między strefami, na przykład aby odrzucać ruch między konkretnymi hostami "
++"albo otworzyć porty WAN routera."
++
++msgid "Via %s"
++msgstr "Przez %s"
++
++msgid "Via %s at %s"
++msgstr "Przez %s w %s"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"Możesz określić kilka wybierając \"-- własne --\" i wpisując protokoły "
++"rozdzielone spacjÄ…."
++
++msgid "Zone %q"
++msgstr "Strefa %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Strefa ⇒ Przekazywanie"
++
++msgid "Zones"
++msgstr "Strefy"
++
++msgid "accept"
++msgstr "akceptuj"
++
++msgid "any"
++msgstr "dowolny"
++
++msgid "any host"
++msgstr "dowolny host"
++
++msgid "any router IP"
++msgstr "dowolne IP routera"
++
++msgid "any zone"
++msgstr "dowolna strefa"
++
++msgid "don't track"
++msgstr "nie śledź"
++
++msgid "drop"
++msgstr "porzucaj"
++
++msgid "reject"
++msgstr "odrzucaj"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "Miejsce przeznaczenia"
++
++#~ msgid "Family"
++#~ msgstr "Rodzina"
++
++#~ msgid "Forward to %s in %s"
++#~ msgstr "Przekazuj do %s w %s"
++
++#~ msgid "Forward to %s, %s in %s"
++#~ msgstr "Przekazuj d0 %s, %s w %s"
++
++#~ msgid "SNAT"
++#~ msgstr "SNAT"
++
++#~ msgid "Source"
++#~ msgstr "Źródło"
++
++#~ msgid "To %s"
++#~ msgstr "Do %s"
++
++#~ msgid "Via"
++#~ msgstr "przez"
++
++#~ msgid "Accept forward"
++#~ msgstr "Akceptuj przekazywanie"
++
++#~ msgid "Accept input"
++#~ msgstr "Akceptuj wejście"
++
++#~ msgid "Disable"
++#~ msgstr "Wyłącz"
++
++#~ msgid "Discard forward"
++#~ msgstr "Odrzuć przekazywanie"
++
++#~ msgid "Discard input"
++#~ msgstr "Odrzuć wejście"
++
++#~ msgid "Do not track forward"
++#~ msgstr "Nie śledź przekazywania"
++
++#~ msgid "Do not track input"
++#~ msgstr "Nie śledź wejścia"
++
++#~ msgid "IP"
++#~ msgstr "IP"
++
++#~ msgid "IP range"
++#~ msgstr "Zakres IP"
++
++#~ msgid "IPs"
++#~ msgstr "Numery IP"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MACs"
++#~ msgstr "Adresy MAC"
++
++#~ msgid "Rule is disabled"
++#~ msgstr "Reguła jest wyłączona"
++
++#~ msgid "Rule is enabled"
++#~ msgstr "Reguła jest włączona"
++
++#~ msgid "day"
++#~ msgstr "dzień"
++
++#~ msgid "port"
++#~ msgstr "port"
++
++#~ msgid "ports"
++#~ msgstr "porty"
++
++#~ msgid "(optional)"
++#~ msgstr "(opcjonalne)"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Wewnętrzny port (opcjonalnie)"
++
++#~ msgid "Advanced Options"
++#~ msgstr "Opcje zaawansowane"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/trule.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# msgid "Name"
++# msgstr ""
++# msgid "(optional)"
++# msgstr ""
++# msgid "Protocol"
++# msgstr ""
++# msgid "Source port"
++# msgstr ""
++# msgid "Destination port"
++# msgstr ""
++# msgid "Action"
++# msgstr ""
++# msgid "drop"
++# msgstr ""
++# msgid "accept"
++# msgstr ""
++# msgid "reject"
++# msgstr ""
++#~ msgid "Advanced Rules"
++#~ msgstr "Reguły zaawansowane"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Reguły zaawansowane pozwalają dostosować zaporę do Twoich potrzeb. Tylko "
++#~ "nowe połączenia zostaną nimi objęte. Pakiety należące do połączeń już "
++#~ "otwarte sÄ… automatycznie przepuszczane przez zaporÄ™."
++
++#~ msgid "Custom Rules (/etc/firewall.user)"
++#~ msgstr "Reguły własne (/etc/firewall.user)"
++
++#~ msgid "Device"
++#~ msgstr "UrzÄ…dzenie"
++
++#~ msgid ""
++#~ "For DNAT, match incoming traffic directed at the given destination ip "
++#~ "address. For SNAT rewrite the source address to the given address."
++#~ msgstr ""
++#~ "Dla DNAT, dopasuj ruch przychodzÄ…cy kierowane na podany adres IP. Dla "
++#~ "SNAT zmienić adres źródłowy na podany adres."
+diff --git a/feeds/luci/applications/luci-app-firewall/po/pt-br/firewall.po b/feeds/luci/applications/luci-app-firewall/po/pt-br/firewall.po
+new file mode 100644
+index 0000000..f32f70e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/pt-br/firewall.po
+@@ -0,0 +1,740 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2014-06-21 19:03+0200\n"
++"Last-Translator: Éder <eder.grigorio@openmailbox.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr "%s in %s"
++
++msgid "%s%s with %s"
++msgstr "%s%s com %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s em %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(Entrada Sem Nome)"
++
++msgid "(Unnamed Rule)"
++msgstr "(Regra Sem Nome)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(SNAT Sem Nome)"
++
++msgid "-- Please choose --"
++msgstr "-- Por favor, escolha --"
++
++msgid "-- custom --"
++msgstr "-- personalizado --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> pcts. por <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr "<var>%d</var> pcts. por <var>%s</var>, pico <var>%d</var> pcts."
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> e limite a %s"
++
++msgid "Action"
++msgstr "Ação"
++
++msgid "Add"
++msgstr "Adicionar"
++
++msgid "Add and edit..."
++msgstr "Adicionar e editar..."
++
++msgid "Advanced Settings"
++msgstr "Configurações Avançadas"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Permite o encaminhamento da <em>zona de origem</em>:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Permite o encaminhamento para a <em>zona de destino</em>:"
++
++msgid "Any"
++msgstr "Qualquer"
++
++msgid "Covered networks"
++msgstr "Redes cobertas"
++
++msgid "Custom Rules"
++msgstr "Regras Personalizadas"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"As regras personalizadas permitem executar comandos iptables arbitrários não "
++"cobertos por esta ferramenta. Os comandos serão executados após cada "
++"reinício do firewall, logo após a carga do conjunto de regras padrão."
++
++msgid "Destination IP address"
++msgstr "Endereço IP de destino"
++
++msgid "Destination address"
++msgstr "Endereço de destino"
++
++msgid "Destination port"
++msgstr "Porta de destino"
++
++msgid "Destination zone"
++msgstr "Zona de destino"
++
++msgid "Do not rewrite"
++msgstr "Não sobrescreva"
++
++msgid "Drop invalid packets"
++msgstr "Descartar pacotes inválidos"
++
++msgid "Enable"
++msgstr "Habilitar"
++
++msgid "Enable NAT Loopback"
++msgstr "Habilite o Loopback do NAT"
++
++msgid "Enable SYN-flood protection"
++msgstr "Habilite proteção contra SYN-flood"
++
++msgid "Enable logging on this zone"
++msgstr "Habilite o registro nesta zona"
++
++msgid "External IP address"
++msgstr "Endereço IP externo"
++
++msgid "External port"
++msgstr "Porta Externa"
++
++msgid "External zone"
++msgstr "Zona externa"
++
++msgid "Extra arguments"
++msgstr "Argumentos extras"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall - Custom Rules"
++msgstr "Firewall - Regras personalizadas"
++
++msgid "Firewall - Port Forwards"
++msgstr "Firewall - Encaminhamento de Portas"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Firewall - Regras de Tráfego"
++
++msgid "Firewall - Zone Settings"
++msgstr "Firewall - Configurações de Zona"
++
++msgid "Force connection tracking"
++msgstr "Force o rastreamento da conexão"
++
++msgid "Forward"
++msgstr "Encaminhar"
++
++msgid "Forward to"
++msgstr "Encaminhar para"
++
++msgid "From %s in %s"
++msgstr "Vindo de %s em %s"
++
++msgid "From %s in %s with source %s"
++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 "General Settings"
++msgstr "Configurações Gerais"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 only"
++msgstr "Somente IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "Somente IPv6"
++
++msgid "Input"
++msgstr "Entrada"
++
++msgid "Inter-Zone Forwarding"
++msgstr "Encaminhamento entre Zonas"
++
++msgid "Internal IP address"
++msgstr "Endereço IP interno"
++
++msgid "Internal port"
++msgstr "Porta Interna"
++
++msgid "Internal zone"
++msgstr "Zona interna"
++
++msgid "Limit log messages"
++msgstr "Limita as mensagens de registro"
++
++msgid "MSS clamping"
++msgstr "Ajuste do MSS"
++
++msgid "Masquerading"
++msgstr "Mascaramento"
++
++msgid "Match"
++msgstr "casol"
++
++msgid "Match ICMP type"
++msgstr "Casa com ICMP tipo"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++"Casa o tráfego encaminhado para uma porta ou faixa de portas de destino "
++"específica."
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"Casa o tráfego entrante direcionado para uma porta ou faixa de portas de "
++"destino específica neste computador"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++"Casa o tráfego entrante originado de uma porta ou faixa de portas no "
++"equipamento cliente."
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "New SNAT rule"
++msgstr "Nova regra de SNAT"
++
++msgid "New forward rule"
++msgstr "Nova regra de encaminhamento"
++
++msgid "New input rule"
++msgstr "Nova regra de entrada"
++
++msgid "New port forward"
++msgstr "Novo encaminhamento de porta"
++
++msgid "New source NAT"
++msgstr "Nova origem NAT"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++"Somente case o tráfego entrante direcionado para o endereço IP fornecido."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "Somente case o tráfego entrante destes endereços MAC."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr "Somente case o tráfego entrante desta faixa de endereços IP."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++"Somente case o tráfego entrante vindo da porta de origem fornecida ou "
++"intervalo de portas no equipamento cliente"
++
++msgid "Open ports on router"
++msgstr "Abrir portas no roteador"
++
++msgid "Other..."
++msgstr "Outro..."
++
++msgid "Output"
++msgstr "Saída"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr "Passa argumentos adicionais para o iptables. Use com cuidado!"
++
++msgid "Port Forwards"
++msgstr "Encaminhamentos de Porta"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"O encaminhamento de portas permite que computadores remotos na Internet "
++"conectem a um computador ou serviço específico dentro da rede local privada."
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++"Redireciona tráfego entrante para a porta especificada no computador interno"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Redireciona tráfego entrante para o computador interno especificado"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "Restringe o mascaramento para uma subrede de destino específica"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "Restringe o mascaramento para uma subrede de origem específica"
++
++msgid "Restrict to address family"
++msgstr "Restringe para uma família de endereços"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr "Reescreva o tráfego correspondente para o endereço fornecido."
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++"Reescreva o tráfego correspondente para a porta de origem fornecida. Pode "
++"ficar em branco para somente reescrever o endereço IP."
++
++msgid "Rewrite to source %s"
++msgstr "Reescrever para a origem %s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "Reescrever para a origem %s, %s"
++
++msgid "SNAT IP address"
++msgstr "Endereço IP da SNAT"
++
++msgid "SNAT port"
++msgstr "Porta da SNAT"
++
++msgid "Source IP address"
++msgstr "Endereço IP de origem"
++
++msgid "Source MAC address"
++msgstr "Endereço MAC de origem"
++
++msgid "Source NAT"
++msgstr "NAT origem"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"NAT origem é uma forma específica de mascaramento que permite o controle "
++"fino do endereço IP de origem usado no tráfego sainte. Por exemplo, para "
++"mapear múltiplos endereços WAN para subredes internas."
++
++msgid "Source address"
++msgstr "Endereço de origem"
++
++msgid "Source port"
++msgstr "Porta de origem"
++
++msgid "Source zone"
++msgstr "Zona de origem"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"O firewall cria zonas sobre as interfaces de rede para controlar o fluxo do "
++"tráfego de rede."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++"As opções abaixo controlam as políticas de encaminhamento entre esta zona "
++"(%s) e outras zonas. <em>Zonas de destino</em> incluem tráfego encaminhado "
++"<strong>originado de %q</strong>. <em>Zonas de origem</em> casam com tráfego "
++"encaminhado de outras zonas <strong>apontando para %q</strong>. A regra de "
++"encaminhamento é <em>unidirecional</em>, ex: um encaminhamento da LAN para "
++"WAN <em>não</em> implica na permissão de encaminhar da WAN para 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 ""
++"Esta página permite que você mude propriedades avançadas da entrada do "
++"encaminhamento de porta. Na maioria dos casos, não é necessário modificar "
++"estas configurações."
++
++msgid ""
++"This page allows you to change advanced properties of the traffic rule "
++"entry, such as matched source and destination hosts."
++msgstr ""
++"Esta página permite que você mude propriedades avançadas da entrada da regra "
++"de tráfego, como os equipamentos de origem e destino."
++
++#, 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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"Esta seção define as propriedades comuns de %q. As opções de <em>entrada</"
++"em> e <em>saída</em> definem as políticas padrão para o tráfego entrando e "
++"saindo desta zona, enquanto a opção de <em>encaminhamento</em> descreve a "
++"política para encaminhar o tráfego entre diferentes redes dentro da zona. "
++"<em>Redes Cobertas</em> especificam que redes disponíveis são membros desta "
++"zona."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "Para %s em %s <var>neste dispositivo</var>"
++
++msgid "To %s in %s"
++msgstr "Para %s em %s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "Para %s <var>neste dispositivo</var>"
++
++msgid "To %s, %s in %s"
++msgstr "Para %s, %s em %s"
++
++msgid "To source IP"
++msgstr "Para o endereço IP de origem"
++
++msgid "To source port"
++msgstr "Para a porta de origem"
++
++msgid "Traffic Rules"
++msgstr "Regras de tráfego"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"Regras de tráfego definem políticas para a passagem de pacotes entre as "
++"diferentes zonas. Por exemplo, rejeitar o tráfego entre certos equipamentos "
++"ou abrir portas WAN no roteador."
++
++msgid "Via %s"
++msgstr "Via %s"
++
++msgid "Via %s at %s"
++msgstr "Via %s at %s"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"Você pode especificar múltiplas entradas selecionando \"-- personalizado --"
++"\" e então entrando os protocolos separados por espaço."
++
++msgid "Zone %q"
++msgstr "Zona %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Zona ⇒ Encaminhamentos"
++
++msgid "Zones"
++msgstr "Zonas"
++
++msgid "accept"
++msgstr "aceitar"
++
++msgid "any"
++msgstr "qualquer"
++
++msgid "any host"
++msgstr "qualquer equipamento"
++
++msgid "any router IP"
++msgstr "qualquer endereço IP do roteador"
++
++msgid "any zone"
++msgstr "qualquer zona"
++
++msgid "don't track"
++msgstr "não rastrear"
++
++msgid "drop"
++msgstr "descartar"
++
++msgid "reject"
++msgstr "rejeitar"
++
++# 20140621: edersg: tradução
++msgid "traffic"
++msgstr "Tráfego"
++
++#~ msgid "Destination"
++#~ msgstr "Destino"
++
++#~ msgid "Family"
++#~ msgstr "Família"
++
++#~ msgid "Forward to %s in %s"
++#~ msgstr "Encaminhar para %s em %s"
++
++#~ msgid "Forward to %s, %s in %s"
++#~ msgstr "Encaminhar para %s, %s em %s"
++
++#~ msgid "SNAT"
++#~ msgstr "SNAT"
++
++#~ msgid "Source"
++#~ msgstr "Origem"
++
++#~ msgid "To %s"
++#~ msgstr "Para %s"
++
++#~ msgid "To %s at %s"
++#~ msgstr "Para %s em %s"
++
++#~ msgid "Via"
++#~ msgstr "Via"
++
++#~ msgid "Accept forward"
++#~ msgstr "Aceitar encaminhamento"
++
++#~ msgid "Accept input"
++#~ msgstr "Aceitar entrada"
++
++#~ msgid "Disable"
++#~ msgstr "Desabilitado"
++
++#~ msgid "Discard forward"
++#~ msgstr "Descartar o encaminhamento"
++
++#~ msgid "Discard input"
++#~ msgstr "Descartar a entrada"
++
++#~ msgid "Do not track forward"
++#~ msgstr "Não rastreie o encaminhamento"
++
++#~ msgid "Do not track input"
++#~ msgstr "Não rastreie a entrada"
++
++#~ msgid "IP"
++#~ msgstr "Endereço IP"
++
++#~ msgid "IP range"
++#~ msgstr "Faixa de endereço IP"
++
++#~ msgid "IPs"
++#~ msgstr "Endereços IP"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MACs"
++#~ msgstr "MACs"
++
++#~ msgid "Refuse forward"
++#~ msgstr "Rejeitar encaminhamento"
++
++#~ msgid "Refuse input"
++#~ msgstr "Rejeitar entrada"
++
++#~ msgid "Rule is disabled"
++#~ msgstr "A regra está desabilitada"
++
++#~ msgid "Rule is enabled"
++#~ msgstr "A regra está habilitada"
++
++#~ msgid "day"
++#~ msgstr "dia"
++
++#~ msgid "hour"
++#~ msgstr "hora"
++
++#~ msgid "minute"
++#~ msgstr "minuto"
++
++#~ msgid "not"
++#~ msgstr "não"
++
++#~ msgid "port"
++#~ msgstr "porta"
++
++#~ msgid "ports"
++#~ msgstr "portas"
++
++#~ msgid "second"
++#~ msgstr "segundo"
++
++#~ msgid "type"
++#~ msgstr "tipo"
++
++#~ msgid "types"
++#~ msgstr "tipos"
++
++#~ msgid "(optional)"
++#~ msgstr "(opcional)"
++
++#~ msgid "Intended destination address"
++#~ msgstr "Endereço de destino planejado"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Porta interna (opcional)"
++
++#~ msgid "Advanced Options"
++#~ msgstr "Opções Avançadas"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "Regras Avançadas"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "As regras avançadas permitem a personalização da firewall de acordo com "
++#~ "as necessidades. Apenas as novas conexões serão processadas. Pacotes que "
++#~ "pertençam a conexões já abertas estão automaticamente autorizados a "
++#~ "passar pelo firewall."
++
++#~ msgid "Custom Rules (/etc/firewall.user)"
++#~ msgstr "Regras Personalizadas (/etc/firewall.user)"
++
++#~ msgid "Device"
++#~ msgstr "Dispositivo"
++
++#~ msgid ""
++#~ "For DNAT, match incoming traffic directed at the given destination ip "
++#~ "address. For SNAT rewrite the source address to the given address."
++#~ msgstr ""
++#~ "Para DNAT, casa com tráfego entrante direcionado para um dado endereço IP "
++#~ "de destino. Para SNAT, reescreve o endereço de origem para um dado "
++#~ "endereço."
++
++#~ msgid ""
++#~ "Match incoming traffic originating from the given source port or port "
++#~ "range on the client host"
++#~ msgstr ""
++#~ "Casa o tráfego entrante originado de uma porta ou faixa de portas de "
++#~ "origem específica no computador do cliente"
++
++#~ msgid "Overview"
++#~ msgstr "Visão geral"
++
++#~ msgid "Port forwarding"
++#~ msgstr "Redirecionamento de portas"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "O redirecionamento de portas permite disponibilizar serviços da rede "
++#~ "interna para uma rede externa."
++
++#~ msgid "Redirection type"
++#~ msgstr "Tipo de redirecionamento"
++
++#~ msgid "Redirections"
++#~ msgstr "Redirecionamentos"
++
++#~ msgid "Rules"
++#~ msgstr "Regras"
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "Redirecionamento de Tráfego"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "Redirecionamento do tráfego permite a alteração do endereço de destino "
++#~ "dos pacotes encaminhados."
++
++#, fuzzy
++#~ msgid "Network"
++#~ msgstr "Redes"
++
++#~ msgid "Traffic Control"
++#~ msgstr "Controle de Tráfego"
++
++#~ msgid "Zone-to-Zone traffic"
++#~ msgstr "Tráfego de Zona-para-Zona"
++
++#, fuzzy
++#~ msgid ""
++#~ "Here you can specify which network traffic is allowed to flow between "
++#~ "network zones. Only new connections will be matched. Packets belonging "
++#~ "to already open connections are automatically allowed to pass the "
++#~ "firewall. If you experience occasional connection problems try enabling "
++#~ "MSS Clamping otherwise disable it for performance reasons."
++#~ msgstr ""
++#~ "Aqui você pode especificar qual tráfego de rede será permitido para o "
++#~ "fluxo entre zonas das redes. Somente novas conexões serão processadas. "
++#~ "Pacotes pertencentes à conexões já abertas estão automaticamente "
++#~ "permitidos para passar pelo firewall."
++
++#~ msgid "Zone"
++#~ msgstr "Zona"
++
++#, fuzzy
++#~ msgid "Destination IP"
++#~ msgstr "Destino"
++
++#, fuzzy
++#~ msgid "IP address"
++#~ msgstr "Endereço IP"
++
++#, fuzzy
++#~ msgid "Source MAC-address"
++#~ msgstr "Endereço MAC de origem"
++
++#~ msgid "Custom forwarding"
++#~ msgstr "Redirecionamento personalizado"
++
++#~ msgid "Input Zone"
++#~ msgstr "Zona de Entrada"
++
++#~ msgid "Output Zone"
++#~ msgstr "Zona de Saída"
++
++#~ msgid "External Zone"
++#~ msgstr "Zona Externa"
++
++#~ msgid "Source MAC"
++#~ msgstr "MAC de origem"
++
++#~ msgid "Defaults"
++#~ msgstr "Padrões"
++
++#~ msgid ""
++#~ "These are the default settings that are used if no other rules match."
++#~ msgstr ""
++#~ "Estas são as configurações padrões, que serão usadas se não houver outras "
++#~ "regras."
++
++#~ msgid ""
++#~ "Zones part the network interfaces into certain isolated areas to separate "
++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag "
++#~ "enables NAT masquerading for all outgoing traffic on this zone."
++#~ msgstr ""
++#~ "Zonas são interfaces de redes usadas para separar o tráfego da rede. Uma "
++#~ "ou mais redes podem pertencer a uma zona. A flag-MASQ ativa o "
++#~ "mascaramento NAT para todo o tráfego de saída desta zona."
++
++#~ msgid "MASQ"
++#~ msgstr "MASQ"
++
++#~ msgid "contained networks"
++#~ msgstr "redes contidas"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/pt/firewall.po b/feeds/luci/applications/luci-app-firewall/po/pt/firewall.po
+new file mode 100644
+index 0000000..304e365
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/pt/firewall.po
+@@ -0,0 +1,585 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2013-06-03 13:37+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr "%s em %s"
++
++msgid "%s%s with %s"
++msgstr "%s%s with %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s em %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(Entrada Sem Nome)"
++
++msgid "(Unnamed Rule)"
++msgstr "(Regra Sem Nome)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(SNAT Sem Nome)"
++
++msgid "-- Please choose --"
++msgstr "-- Escolha por favor --"
++
++msgid "-- custom --"
++msgstr "-- personalizado --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> pkts. por <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr "Acção"
++
++msgid "Add"
++msgstr "Adicionar"
++
++msgid "Add and edit..."
++msgstr "Adicionar e editar..."
++
++msgid "Advanced Settings"
++msgstr "Definições Avançadas"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Permitir encaminhamento de <em>zonas de origem</em>"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Permitir encaminhamento para <em>zonas de destino</em>"
++
++msgid "Any"
++msgstr "Qualquer"
++
++msgid "Covered networks"
++msgstr "Redes abrangidas"
++
++msgid "Custom Rules"
++msgstr "Regras Personalizadas"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"As regras personalizadas permitem-lhe executar comandos arbitrários iptables "
++"os quais não são possiveis de aplicar usando a framework da firewall. Os "
++"comandos são executados a seguir ao reinicio da firewall, logo a seguir ao "
++"conjunto de regras predefinidas serem carregadas."
++
++msgid "Destination IP address"
++msgstr "Endereço IP de destino"
++
++msgid "Destination address"
++msgstr "Endereço de destino"
++
++msgid "Destination port"
++msgstr "Porta de destino"
++
++msgid "Destination zone"
++msgstr "Zona de destino"
++
++msgid "Do not rewrite"
++msgstr "Não re-escrever"
++
++msgid "Drop invalid packets"
++msgstr "Cancelar pacotes inválidos"
++
++msgid "Enable"
++msgstr "Ativar"
++
++msgid "Enable NAT Loopback"
++msgstr "Ativar NAT Loopback"
++
++msgid "Enable SYN-flood protection"
++msgstr "Ativar a Proteção SYN-flood"
++
++msgid "Enable logging on this zone"
++msgstr "Ativar registo nesta zona"
++
++msgid "External IP address"
++msgstr "Endereço IP externo"
++
++msgid "External port"
++msgstr "Porta externa"
++
++msgid "External zone"
++msgstr "Zona externa"
++
++msgid "Extra arguments"
++msgstr "Argumentos extra"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall - Custom Rules"
++msgstr "Firewall - Regras Personalizadas"
++
++msgid "Firewall - Port Forwards"
++msgstr "Firewall - Encaminhamento de Portas"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Firewall - Regras de Tráfego"
++
++msgid "Firewall - Zone Settings"
++msgstr "Firewall - Definições de Zona"
++
++msgid "Force connection tracking"
++msgstr "Forçar rasto de ligação"
++
++msgid "Forward"
++msgstr "Encaminhar"
++
++msgid "Forward to"
++msgstr "Encaminhar para"
++
++msgid "From %s in %s"
++msgstr "De %s em %s"
++
++msgid "From %s in %s with source %s"
++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 "General Settings"
++msgstr "Definições Gerais"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 only"
++msgstr "Só IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "Só IPv6"
++
++msgid "Input"
++msgstr "Entrada"
++
++msgid "Inter-Zone Forwarding"
++msgstr "Encaminhamento Inter-Zona"
++
++msgid "Internal IP address"
++msgstr "Endereço IP interno"
++
++msgid "Internal port"
++msgstr "Porta interna"
++
++msgid "Internal zone"
++msgstr "Zona Interna"
++
++msgid "Limit log messages"
++msgstr "Limitar registo de mensagens"
++
++#, fuzzy
++msgid "MSS clamping"
++msgstr "MSS-Correction"
++
++msgid "Masquerading"
++msgstr ""
++
++msgid "Match"
++msgstr "Corresponder"
++
++msgid "Match ICMP type"
++msgstr ""
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++"O tráfego encaminhado corresponde a uma determinada porta de destino ou "
++"intervalo de portas."
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"O tráfego de entrada corresponde a uma dada porta de destino ou intervalo de "
++"portas neste host"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++"O tráfego de entrada corresponde a uma dada porta ou de um intervalo de "
++"portas no host cliente."
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "New SNAT rule"
++msgstr "Nova regra SNAT"
++
++msgid "New forward rule"
++msgstr "Nova regra de encaminhamento"
++
++msgid "New input rule"
++msgstr "Nova regra de entrada"
++
++msgid "New port forward"
++msgstr "Novo encaminhamento de porta"
++
++msgid "New source NAT"
++msgstr "Nova origem de NAT"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "Só se tráfego de entrada corresponder ao endereço IP fornecido."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "Só se o tráfego de entrada corresponder a um destes MACs."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr "Só se o tráfego de entrada corresponder a este IP ou intervalo."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++"Só se o tráfego de entrada corresponder à porta de origem fornecida ou de um "
++"intervalo de portas no host cliente"
++
++msgid "Open ports on router"
++msgstr "Abrir portas no router"
++
++msgid "Other..."
++msgstr "Outro..."
++
++msgid "Output"
++msgstr "Saída"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr "Passa argumentos adicionais para o iptables. Usar com cuidado!"
++
++msgid "Port Forwards"
++msgstr "Encaminhamento de Portas"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"O Encaminhamento de Portas permite que computadores remotos na internet se "
++"liguem a um computador ou serviço especifico na rede privada (LAN)."
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++"Redirecionar a entrada de trafego correspondente à porta fornecida no host "
++"interno"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Redirecionar o tráfego de entrada correspondente para o host interno"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr "Restringir a família de endereços"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr "Re-escrever para a origem %s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "Re-escrever para a origem %s, %s"
++
++msgid "SNAT IP address"
++msgstr "Endereço IP da SNAT"
++
++msgid "SNAT port"
++msgstr "Porta SNAT"
++
++msgid "Source IP address"
++msgstr "Endereço IP de origem"
++
++msgid "Source MAC address"
++msgstr "Endereço MAC de origem"
++
++msgid "Source NAT"
++msgstr "NAT de origem"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"NAT de origem é uma forma especifica de mascarar que permite um controlo "
++"melhorado sobre o IP de origem usado para o tráfego de saída, por exemplo, "
++"para mapear múltiplos endereços para as sub-redes internas."
++
++msgid "Source address"
++msgstr "Endereço de origem"
++
++msgid "Source port"
++msgstr "Porta de origem"
++
++msgid "Source zone"
++msgstr "Zona de origem"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"A firewall cria zonas sobre as interfaces de rede para controlar o fluxo do "
++"tráfego."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++"Esta página permite-lhe alterar as definições avançadas da regra de entrada "
++"de tráfego, tal como correspondências de hosts de origem e destino."
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "Para %s no %s em <var>este dispositivo</var>"
++
++msgid "To %s in %s"
++msgstr "Para %s em %s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "Para %s em <var>este dispositivo</var>"
++
++msgid "To %s, %s in %s"
++msgstr "Para %s, %s em %s"
++
++msgid "To source IP"
++msgstr "Para o IP de origem"
++
++msgid "To source port"
++msgstr "Para a porta de origem"
++
++msgid "Traffic Rules"
++msgstr "Regras de Tráfego"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"As Regras de Tráfego definem políticas para os pacotes que viajam entre "
++"diferentes zonas, por exemplo, para rejeitar trafego entre certos hosts ou "
++"para abrir portas WAN no router."
++
++msgid "Via %s"
++msgstr "Via %s"
++
++msgid "Via %s at %s"
++msgstr "Via %s no %s"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"Pode especificar múltiplos seleccionando \"-- personalizado --\" e depois "
++"introduzir os protocolos separados por espaço."
++
++msgid "Zone %q"
++msgstr "Zona %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Zona ⇒ Encaminhamentos"
++
++msgid "Zones"
++msgstr "Zonas"
++
++msgid "accept"
++msgstr "aceitar"
++
++msgid "any"
++msgstr "qualquer"
++
++msgid "any host"
++msgstr "qualquer host"
++
++msgid "any router IP"
++msgstr "qualquer IP do router"
++
++msgid "any zone"
++msgstr "qualquer zona"
++
++msgid "don't track"
++msgstr "não seguir"
++
++msgid "drop"
++msgstr "drop"
++
++msgid "reject"
++msgstr "rejeitar"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "Destino"
++
++#~ msgid "Source"
++#~ msgstr "Origem"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Porta interna (opcional)"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "Regras Avançadas"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "As regras avançadas permitem a personalização da firewall de acordo com "
++#~ "as necessidades. Apenas as novas ligações serão processadas. Pacotes que "
++#~ "pertençam a ligações já abertas estão automaticamente autorizados a "
++#~ "passar pela firewall."
++
++#~ msgid "Port forwarding"
++#~ msgstr "Redirecionamento de portas"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "O redirecionamento de portas permite disponibilizar serviços na rede "
++#~ "interna para uma rede externa."
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "Redirecionamento de Tráfego"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "Redirecionamento do tráfego permite a alteração do endereço de destino "
++#~ "dos pacotes enviados."
++
++#, fuzzy
++#~ msgid "Network"
++#~ msgstr "Redes"
++
++#~ msgid "Traffic Control"
++#~ msgstr "Controle de Tráfego"
++
++#~ msgid "Zone-to-Zone traffic"
++#~ msgstr "Tráfego de Zona-para-Zona"
++
++#, fuzzy
++#~ msgid ""
++#~ "Here you can specify which network traffic is allowed to flow between "
++#~ "network zones. Only new connections will be matched. Packets belonging "
++#~ "to already open connections are automatically allowed to pass the "
++#~ "firewall. If you experience occasional connection problems try enabling "
++#~ "MSS Clamping otherwise disable it for performance reasons."
++#~ msgstr ""
++#~ "Aqui você pode especificar qual tráfego de rede será permitido para o "
++#~ "fluxo entre zonas das redes. Somente novas conexões serão processadas. "
++#~ "Pacotes pertencentes à conexões já abertas estão automaticamente "
++#~ "permitidos para passar pelo firewall."
++
++#~ msgid "Zone"
++#~ msgstr "Zona"
++
++#, fuzzy
++#~ msgid "Destination IP"
++#~ msgstr "Destino"
++
++#, fuzzy
++#~ msgid "IP address"
++#~ msgstr "Endereço IP"
++
++#, fuzzy
++#~ msgid "Source MAC-address"
++#~ msgstr "Endereço MAC de origem"
++
++#~ msgid "Custom forwarding"
++#~ msgstr "Redirecionamento personalizado"
++
++#~ msgid "Input Zone"
++#~ msgstr "Zona de Entrada"
++
++#~ msgid "Output Zone"
++#~ msgstr "Zona de Saída"
++
++#~ msgid "External Zone"
++#~ msgstr "Zona Externa"
++
++#~ msgid "Source MAC"
++#~ msgstr "MAC de origem"
++
++#~ msgid "Defaults"
++#~ msgstr "Padrões"
++
++#~ msgid ""
++#~ "These are the default settings that are used if no other rules match."
++#~ msgstr ""
++#~ "Estas são as configurações padrões, que serão usadas se não houver outras "
++#~ "regras."
++
++#~ msgid ""
++#~ "Zones part the network interfaces into certain isolated areas to separate "
++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag "
++#~ "enables NAT masquerading for all outgoing traffic on this zone."
++#~ msgstr ""
++#~ "Zonas são interfaces de redes usadas para separar o tráfego da rede. Uma "
++#~ "ou mais redes podem pertencer a uma zona. A flag-MASQ ativa o "
++#~ "mascaramento NAT para todo o tráfego de saída desta zona."
++
++#~ msgid "MASQ"
++#~ msgstr "MASQ"
++
++#~ msgid "contained networks"
++#~ msgstr "redes contidas"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/ro/firewall.po b/feeds/luci/applications/luci-app-firewall/po/ro/firewall.po
+new file mode 100644
+index 0000000..391b949
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/ro/firewall.po
+@@ -0,0 +1,503 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-29 19:33+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr "%s în %s"
++
++msgid "%s%s with %s"
++msgstr "%s%s cu %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s în %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(Intrare fără nume)"
++
++msgid "(Unnamed Rule)"
++msgstr "(Regulă fără nume)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(SNAT fără nume)"
++
++msgid "-- Please choose --"
++msgstr "-- Alege --"
++
++msgid "-- custom --"
++msgstr "-- personalizat --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr "Acţiune"
++
++msgid "Add"
++msgstr "Adaugă"
++
++msgid "Add and edit..."
++msgstr "Adaugă şi editează..."
++
++msgid "Advanced Settings"
++msgstr "Setări avansate"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Permite trecerea din <em>zonele sursa</em>."
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Permite trecerea catre <em>zonele sursa</em>."
++
++msgid "Any"
++msgstr "Oricare"
++
++msgid "Covered networks"
++msgstr "Retele acoperite"
++
++msgid "Custom Rules"
++msgstr "Reguli suplimentare"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++
++msgid "Destination IP address"
++msgstr "Destinaţie adresă IP"
++
++msgid "Destination address"
++msgstr "Destinaţie adresă"
++
++msgid "Destination port"
++msgstr "Portul destinatie"
++
++msgid "Destination zone"
++msgstr "Zona destinatie"
++
++msgid "Do not rewrite"
++msgstr "Nu rescrie"
++
++msgid "Drop invalid packets"
++msgstr "Descarcă pachetele invalide"
++
++msgid "Enable"
++msgstr "Activează"
++
++msgid "Enable NAT Loopback"
++msgstr "Activează loopback NAT"
++
++msgid "Enable SYN-flood protection"
++msgstr "Activează protecţia SYN-flood"
++
++msgid "Enable logging on this zone"
++msgstr "Activeaza log in aceasta zona"
++
++msgid "External IP address"
++msgstr "Adresă IP externă"
++
++msgid "External port"
++msgstr "Port extern"
++
++msgid "External zone"
++msgstr "Zonă externă"
++
++msgid "Extra arguments"
++msgstr ""
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall - Custom Rules"
++msgstr "Firewall - Reguli particularizate"
++
++msgid "Firewall - Port Forwards"
++msgstr ""
++
++msgid "Firewall - Traffic Rules"
++msgstr ""
++
++msgid "Firewall - Zone Settings"
++msgstr "Setari zona la firewall"
++
++msgid "Force connection tracking"
++msgstr "Forteaza urmarirea conexiunilor"
++
++msgid "Forward"
++msgstr "Forward"
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr ""
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr "Setari generale"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 ÅŸi IPv6"
++
++msgid "IPv4 only"
++msgstr "doar IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "doar IPv6"
++
++msgid "Input"
++msgstr "Intrare"
++
++msgid "Inter-Zone Forwarding"
++msgstr "Forwardare intre-zone"
++
++msgid "Internal IP address"
++msgstr "Adresa IP interna"
++
++msgid "Internal port"
++msgstr "Port intern"
++
++msgid "Internal zone"
++msgstr "Zonă internă"
++
++msgid "Limit log messages"
++msgstr "Limitează mesaje în log"
++
++msgid "MSS clamping"
++msgstr "Ajustare MSS"
++
++msgid "Masquerading"
++msgstr "Translatare"
++
++msgid "Match"
++msgstr "Potrivire"
++
++msgid "Match ICMP type"
++msgstr "Potriveste pe tipul de ICMP"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr "Nume"
++
++msgid "New SNAT rule"
++msgstr "Regulă nouă SNAT"
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr ""
++
++msgid "New port forward"
++msgstr ""
++
++msgid "New source NAT"
++msgstr ""
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr ""
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr ""
++
++msgid "Other..."
++msgstr "Altele..."
++
++msgid "Output"
++msgstr "IeÅŸire"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr ""
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr ""
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr ""
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr ""
++
++msgid "SNAT port"
++msgstr ""
++
++msgid "Source IP address"
++msgstr "Sursă adresă IP"
++
++msgid "Source MAC address"
++msgstr "Sursă adresă MAC"
++
++msgid "Source NAT"
++msgstr "Sursă NAT"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++msgid "Source address"
++msgstr "Adresa sursa"
++
++msgid "Source port"
++msgstr "Port sursa"
++
++msgid "Source zone"
++msgstr "Zona sursa"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr ""
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr "Zona %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr ""
++
++msgid "Zones"
++msgstr "Zone"
++
++msgid "accept"
++msgstr "accept"
++
++msgid "any"
++msgstr "oricare"
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr ""
++
++msgid "reject"
++msgstr ""
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "Destinatie"
++
++#~ msgid "Family"
++#~ msgstr "Familia proto"
++
++#~ msgid "Source"
++#~ msgstr "Sursa"
++
++#~ msgid "Via"
++#~ msgstr "Prin"
++
++#~ msgid "(optional)"
++#~ msgstr "(optional)"
++
++#~ msgid "Intended destination address"
++#~ msgstr "Adresa destinatie intentionata"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Port intern (optional)"
++
++#~ msgid "Advanced Options"
++#~ msgstr "Optiuni avansate"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "Reguli avansate"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Regulile avansate iti permit particularizarea firewall-ului dupa nevoi. "
++#~ "Numai conexiunile noi vor fi luate in calcul. Pachetele care apartin unor "
++#~ "conexiuni deja stabilite trec deja prin firewall."
++
++#~ msgid "Custom Rules (/etc/firewall.user)"
++#~ msgstr "Reguli suplimentare (/etc/firewall.user)"
++
++#~ msgid "Device"
++#~ msgstr "Dispozitiv"
++
++#~ msgid ""
++#~ "For DNAT, match incoming traffic directed at the given destination ip "
++#~ "address. For SNAT rewrite the source address to the given address."
++#~ msgstr ""
++#~ "Pentru DNAT, leaga traficul venit redirectat catre destinatia IP. Pentru "
++#~ "SNAT rescrie adresa sursa ca fiind adresa IP."
++
++#~ msgid "Overview"
++#~ msgstr "Sumar"
++
++#~ msgid "Port forwarding"
++#~ msgstr "Forwardare catre port"
++
++#~ msgid "Redirection type"
++#~ msgstr "Tipul de redirectare"
++
++#~ msgid "Redirections"
++#~ msgstr "Redirectari"
++
++#~ msgid "Rules"
++#~ msgstr "Reguli"
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "Redirectarea traficului"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/ru/firewall.po b/feeds/luci/applications/luci-app-firewall/po/ru/firewall.po
+new file mode 100644
+index 0000000..aa5c5a8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/ru/firewall.po
+@@ -0,0 +1,679 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: firewall\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2013-09-05 16:02+0200\n"
++"Last-Translator: datasheet <michael.gritsaenko@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "%s in %s"
++msgstr "%s в %s"
++
++msgid "%s%s with %s"
++msgstr "%s%s Ñ %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s в %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(ЗапиÑÑŒ без имени)"
++
++msgid "(Unnamed Rule)"
++msgstr "(Правило без имени)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(SNAT без имени)"
++
++msgid "-- Please choose --"
++msgstr "-- ПожалуйÑта, выберите --"
++
++msgid "-- custom --"
++msgstr "-- пользовательÑкий --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> пакетов за <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr "<var>%d</var> пакетов за <var>%s</var>, подрÑд <var>%d</var> пакетов"
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> Ñ Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¾Ð¼ в %s"
++
++msgid "Action"
++msgstr "ДейÑтвие"
++
++msgid "Add"
++msgstr "Добавить"
++
++msgid "Add and edit..."
++msgstr "Добавить и редактировать..."
++
++msgid "Advanced Settings"
++msgstr "РаÑширенные наÑтройки"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Разрешить перенаправление из <em>зон-иÑточников</em>:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Разрешить перенаправление в <em>зоны назначениÑ</em>:"
++
++msgid "Any"
++msgstr "Любой"
++
++msgid "Covered networks"
++msgstr "ИÑпользовать Ñети"
++
++msgid "Custom Rules"
++msgstr "ПользовательÑкие правила"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"ПользовательÑкие правила позволÑÑŽÑ‚ выполнÑÑ‚ÑŒ произвольные команды iptables, "
++"которые так или иначе не покрываютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ð¼ фреймворком межÑетевого Ñкрана. "
++"Команды выполнÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ каждом перезапуÑке межÑетевого Ñкрана, Ñразу поÑле "
++"того, как загружен набор правил по умолчанию."
++
++msgid "Destination IP address"
++msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ"
++
++msgid "Destination address"
++msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ"
++
++msgid "Destination port"
++msgstr "Порт назначениÑ"
++
++msgid "Destination zone"
++msgstr "Зона назначениÑ"
++
++msgid "Do not rewrite"
++msgstr "Ðе перезапиÑывать"
++
++msgid "Drop invalid packets"
++msgstr "Ðе пропуÑкать некорректные пакеты"
++
++msgid "Enable"
++msgstr "Включить"
++
++#, fuzzy
++msgid "Enable NAT Loopback"
++msgstr "Включить NAT Loopback"
++
++msgid "Enable SYN-flood protection"
++msgstr "Включить защиту от SYN-flood атак"
++
++msgid "Enable logging on this zone"
++msgstr "Включить журналирование в Ñтой зоне"
++
++msgid "External IP address"
++msgstr "Внешний IP-адреÑ"
++
++msgid "External port"
++msgstr "Внешний порт"
++
++msgid "External zone"
++msgstr "ВнешнÑÑ Ð·Ð¾Ð½Ð°"
++
++msgid "Extra arguments"
++msgstr "Дополнительные аргументы"
++
++msgid "Firewall"
++msgstr "МежÑетевой Ñкран"
++
++msgid "Firewall - Custom Rules"
++msgstr "МежÑетевой Ñкран - ПользовательÑкие правила"
++
++msgid "Firewall - Port Forwards"
++msgstr "МежÑетевой Ñкран - Перенаправление портов"
++
++msgid "Firewall - Traffic Rules"
++msgstr "МежÑетевой Ñкран - Правила Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ°"
++
++msgid "Firewall - Zone Settings"
++msgstr "МежÑетевой Ñкран - ÐаÑтройка зон"
++
++msgid "Force connection tracking"
++msgstr "Включить отÑлеживание Ñоединений"
++
++msgid "Forward"
++msgstr "Перенаправление"
++
++msgid "Forward to"
++msgstr "ПеренаправлÑÑ‚ÑŒ в"
++
++msgid "From %s in %s"
++msgstr "Из %s в %s"
++
++msgid "From %s in %s with source %s"
++msgstr "Из %s в %s Ñ Ð¸Ñточником %s"
++
++msgid "From %s in %s with source %s and %s"
++msgstr "Из %s в %s Ñ Ð¸Ñточниками %s и %s"
++
++msgid "General Settings"
++msgstr "Общие наÑтройки"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 и IPv6"
++
++msgid "IPv4 only"
++msgstr "Только IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "Только IPv6"
++
++msgid "Input"
++msgstr "ВходÑщий"
++
++msgid "Inter-Zone Forwarding"
++msgstr "Перенаправление между зонами"
++
++msgid "Internal IP address"
++msgstr "Внутренний IP-адреÑ"
++
++msgid "Internal port"
++msgstr "Внутренний порт"
++
++msgid "Internal zone"
++msgstr "ВнутреннÑÑ Ð·Ð¾Ð½Ð°"
++
++msgid "Limit log messages"
++msgstr "Ограничить журнал Ñообщений"
++
++msgid "MSS clamping"
++msgstr "Ограничение MSS"
++
++msgid "Masquerading"
++msgstr "МаÑкарадинг"
++
++#, fuzzy
++msgid "Match"
++msgstr "Выбирать"
++
++msgid "Match ICMP type"
++msgstr "СоответÑтвовать ICMP типу"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++"Перенаправить ÑоответÑтвующий трафик на определённый порт или диапазон "
++"портов. "
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"Выбирать входÑщий трафик, направленный на порт или диапазон портов данного "
++"хоÑта"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++"Выбирать входÑщий трафик, иÑходÑщий из порта или диапазона портов "
++"клиентÑкого хоÑта."
++
++msgid "Name"
++msgstr "ИмÑ"
++
++msgid "New SNAT rule"
++msgstr "Ðовое правило SNAT"
++
++msgid "New forward rule"
++msgstr "Ðовое правило перенаправлениÑ"
++
++msgid "New input rule"
++msgstr "Ðовое правило Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщего трафика"
++
++msgid "New port forward"
++msgstr "Ðовое перенаправление порта"
++
++msgid "New source NAT"
++msgstr "Ðовый SNAT"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "Выбирать только входÑщий трафик, направленный на указанный IP-адреÑ."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "Выбирать только входÑщий трафик от Ñтих MAC-адреÑов."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++"Выбирать только входÑщий трафик от Ñтого IP-адреÑа или диапазона адреÑов."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++"Выбирать только входÑщий трафик, иÑходÑщий из указанного порта или диапазона "
++"портов клиентÑкого хоÑта"
++
++msgid "Open ports on router"
++msgstr "Открыть порты на маршрутизаторе"
++
++msgid "Other..."
++msgstr "Другое..."
++
++msgid "Output"
++msgstr "ИÑходÑщий"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++"Передаёт дополнительные аргументы iptables. ИÑпользуйте Ñ Ð¾ÑторожноÑтью!"
++
++msgid "Port Forwards"
++msgstr "ÐŸÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ€Ñ‚Ð¾Ð²"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"Перенаправленные портов позволÑет удалённым компьютерам из Интернета "
++"ÑоединÑÑ‚ÑŒÑÑ Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð¾Ð¼ или Ñлужбой внутри чаÑтной локальной Ñети."
++
++msgid "Protocol"
++msgstr "Протокол"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr "Перенаправить входÑщий трафик на указанный порт хоÑта внутренней Ñети"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "Перенаправить входÑщий трафик на указанный хоÑÑ‚ внутренней Ñети"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "ИÑпользовать маÑкарадинг только Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ñ… подÑетей-получателей"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "ИÑпользовать маÑкарадинг только Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ñ… подÑетей-отправителей"
++
++msgid "Restrict to address family"
++msgstr "ИÑпользовать только ÑемейÑтво протоколов"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr "ПеренаправлÑÑ‚ÑŒ ÑоответÑтвующий трафик к указанному адреÑу."
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++"ПеренаправлÑÑ‚ÑŒ ÑоответÑтвующий трафик к указанному порту иÑточника. Может "
++"быть пуÑтым в Ñлучае, еÑли необходимо перенаправить только IP-адреÑ."
++
++msgid "Rewrite to source %s"
++msgstr "ПеренаправлÑÑ‚ÑŒ к иÑточнику %s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "ПеренаправлÑÑ‚ÑŒ к иÑточнику %s, %s"
++
++msgid "SNAT IP address"
++msgstr "IP-Ð°Ð´Ñ€ÐµÑ SNAT"
++
++msgid "SNAT port"
++msgstr "Порт SNAT"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# msgid "Traffic Redirection"
++# msgstr ""
++# msgid ""
++# "Traffic redirection allows you to change the destination address of "
++# "forwarded packets."
++# msgstr ""
++# msgid "Overview"
++# msgstr ""
++# msgid "Name"
++# msgstr ""
++# msgid "Source zone"
++# msgstr ""
++# msgid "Source MAC-address"
++# msgstr ""
++# msgid "Source port"
++# msgstr ""
++# msgid "Protocol"
++# msgstr ""
++msgid "Source IP address"
++msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ñточника"
++
++msgid "Source MAC address"
++msgstr "MAC-Ð°Ð´Ñ€ÐµÑ Ð¸Ñточника"
++
++msgid "Source NAT"
++msgstr "SNAT"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"SNAT - Ñто оÑÐ¾Ð±Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° маÑкарадинга (masquerading), позволÑÑŽÑ‰Ð°Ñ "
++"оÑущеÑтвлÑÑ‚ÑŒ детальный контроль над IP-адреÑом иÑточника Ð´Ð»Ñ Ð¸ÑходÑщего "
++"трафика, например, перенаправление неÑкольких WAN-адреÑов во внутреннюю "
++"подÑеть."
++
++msgid "Source address"
++msgstr "ÐÐ´Ñ€ÐµÑ Ð¸Ñточника"
++
++msgid "Source port"
++msgstr "Порт иÑточника"
++
++msgid "Source zone"
++msgstr "Зона-иÑточник"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr "МежÑетевой Ñкран Ñоздает зоны в вашей Ñети Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ°."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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."
++
++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 "
++"entry, such as matched source and destination hosts."
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"Ð”Ð°Ð½Ð½Ð°Ñ ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет изменÑÑ‚ÑŒ общие наÑтройки %q. Опции <em>входÑщий</em> "
++"и <em>иÑходÑщий</em> уÑтанавливают политику по умолчанию Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщего и "
++"иÑходÑщего трафика. ÐžÐ¿Ñ†Ð¸Ñ <em>перенаправление</em> позволÑет уÑтановить "
++"политику Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ°, который перенаправлÑетÑÑ Ñ‡ÐµÑ€ÐµÐ· неÑколько Ñетей в зоне. "
++"Пункт <em>иÑпользовать Ñети</em> позволÑет указать, какие Ñети ÑвлÑÑŽÑ‚ÑÑ "
++"чаÑтью данной зоны."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "К %s, порту %s на <var>Ñтом уÑтройÑтве</var>"
++
++msgid "To %s in %s"
++msgstr "К %s в %s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "К %s на <var>Ñтом уÑтройÑтве</var>"
++
++msgid "To %s, %s in %s"
++msgstr "К %s, %s в %s"
++
++msgid "To source IP"
++msgstr "К IP-адреÑу иÑточника"
++
++msgid "To source port"
++msgstr "К порту иÑточника"
++
++msgid "Traffic Rules"
++msgstr "Правила Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ°"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"Правила Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ° определÑÑŽÑ‚ политику Ð¿Ñ€Ð¾Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð°ÐºÐµÑ‚Ð¾Ð² между разными "
++"зонами, например, запрет трафика между некоторыми хоÑтами или открытие WAN-"
++"портов маршрутизатора."
++
++msgid "Via %s"
++msgstr "Через %s"
++
++msgid "Via %s at %s"
++msgstr "Через %s, порт %s"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"Ð’Ñ‹ можете указать неÑколько, выбрав \"-- пользовательÑкий --\" и перечиÑлив "
++"через пробел Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¾Ð²."
++
++msgid "Zone %q"
++msgstr "Зона %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Зона ⇒ ПеренаправлениÑ"
++
++msgid "Zones"
++msgstr "Зоны"
++
++msgid "accept"
++msgstr "принимать"
++
++msgid "any"
++msgstr "любой"
++
++msgid "any host"
++msgstr "любого хоÑта"
++
++msgid "any router IP"
++msgstr "любой IP-Ð°Ð´Ñ€ÐµÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°"
++
++msgid "any zone"
++msgstr "любой зоны"
++
++msgid "don't track"
++msgstr "не отÑлеживать"
++
++msgid "drop"
++msgstr "не обрабатывать"
++
++msgid "reject"
++msgstr "отвергать"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "Ðазначение"
++
++#~ msgid "Family"
++#~ msgstr "СемейÑтво"
++
++#~ msgid "SNAT"
++#~ msgstr "SNAT"
++
++#~ msgid "Source"
++#~ msgstr "ИÑточник"
++
++#~ msgid "To %s"
++#~ msgstr "к %s"
++
++#~ msgid "To %s at %s"
++#~ msgstr "к %s на %s"
++
++#~ msgid "Via"
++#~ msgstr "Через"
++
++#~ msgid "Accept forward"
++#~ msgstr "Принимать перенаправление"
++
++#~ msgid "Accept input"
++#~ msgstr "Принимать входÑщие"
++
++#~ msgid "Disable"
++#~ msgstr "Отключить"
++
++#~ msgid "Discard forward"
++#~ msgstr "Отвергать перенаправление"
++
++#~ msgid "Discard input"
++#~ msgstr "ВыбраÑывать входÑщие пакеты"
++
++#~ msgid "Do not track forward"
++#~ msgstr "Ðе отÑлеживать перенаправление"
++
++#~ msgid "Do not track input"
++#~ msgstr "Ðе отÑлеживать входные пакеты"
++
++#~ msgid "IP"
++#~ msgstr "IP-адреÑ"
++
++#~ msgid "IP range"
++#~ msgstr "Диапазон IP-адреÑов"
++
++#~ msgid "IPs"
++#~ msgstr "IP-адреÑа"
++
++#~ msgid "MAC"
++#~ msgstr "MAC-адреÑ"
++
++#~ msgid "MACs"
++#~ msgstr "MAC-адреÑа"
++
++#~ msgid "Refuse forward"
++#~ msgstr "Отвергать перенаправление"
++
++#~ msgid "Refuse input"
++#~ msgstr "Отвергать входÑщий трафик"
++
++#~ msgid "Rule is disabled"
++#~ msgstr "Правило выключено"
++
++#~ msgid "Rule is enabled"
++#~ msgstr "Правило включено"
++
++#~ msgid "day"
++#~ msgstr "день"
++
++#~ msgid "hour"
++#~ msgstr "чаÑ"
++
++#~ msgid "minute"
++#~ msgstr "мин"
++
++#~ msgid "not"
++#~ msgstr "не"
++
++#~ msgid "port"
++#~ msgstr "порт"
++
++#~ msgid "ports"
++#~ msgstr "порты"
++
++#~ msgid "second"
++#~ msgstr "Ñек"
++
++#~ msgid "type"
++#~ msgstr "тип"
++
++#~ msgid "types"
++#~ msgstr "типы"
++
++#~ msgid "(optional)"
++#~ msgstr "(необÑзательно)"
++
++#~ msgid "Intended destination address"
++#~ msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Внутренний порт (необÑзательно)"
++
++#~ msgid "Advanced Options"
++#~ msgstr "РаÑширенные опции"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "РаÑширенные правила"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "РаÑширенные правила позволÑÑŽÑ‚ наÑтроить Ñетевой Ñкран в ÑоответÑтвии Ñ "
++#~ "вашими потребноÑÑ‚Ñми. Только новые ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ обработаны. Пакеты, "
++#~ "принадлежащие уже ÑущеÑтвующим ÑоединениÑм, будут автоматичеÑки пропущены "
++#~ "через Ñетевой Ñкран."
++
++#~ msgid "Custom Rules (/etc/firewall.user)"
++#~ msgstr "ПользовательÑкие правила (/etc/firewall.user)"
++
++#~ msgid "Device"
++#~ msgstr "УÑтройÑтво"
++
++#~ msgid ""
++#~ "For DNAT, match incoming traffic directed at the given destination ip "
++#~ "address. For SNAT rewrite the source address to the given address."
++#~ msgstr ""
++#~ "Ð”Ð»Ñ DNAT ÑоответÑтвующий трафик перенаправлÑетÑÑ Ð½Ð° введенный Ð°Ð´Ñ€ÐµÑ "
++#~ "назначениÑ. Ð”Ð»Ñ SNAT подменÑетÑÑ Ð°Ð´Ñ€ÐµÑ Ð¸Ñточника на введенный."
++
++#~ msgid ""
++#~ "Match incoming traffic originating from the given source port or port "
++#~ "range on the client host"
++#~ msgstr ""
++#~ "Выбирать иÑходÑщий трафик отправленный Ñ Ð¿Ð¾Ñ€Ñ‚Ð° или диапазона портов "
++#~ "внешнего хоÑта"
++
++#~ msgid "Overview"
++#~ msgstr "Ðазад к обзору"
++
++#~ msgid "Port forwarding"
++#~ msgstr "Перенаправление портов"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "Перенаправление портов позволÑет открыть доÑтуп к внутренним Ñлужбам из "
++#~ "внешней Ñети."
++
++#~ msgid "Redirection type"
++#~ msgstr "Тип перенаправлениÑ"
++
++#~ msgid "Redirections"
++#~ msgstr "ПеренаправлениÑ"
++
++#~ msgid "Rules"
++#~ msgstr "Правила"
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "Перенаправление трафика"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "Перенаправление трафика позволÑет изменить Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ "
++#~ "проходÑщих пакетов."
+diff --git a/feeds/luci/applications/luci-app-firewall/po/sk/firewall.po b/feeds/luci/applications/luci-app-firewall/po/sk/firewall.po
+new file mode 100644
+index 0000000..32cd193
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/sk/firewall.po
+@@ -0,0 +1,432 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr ""
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr ""
++
++msgid "(Unnamed Rule)"
++msgstr ""
++
++msgid "(Unnamed SNAT)"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add and edit..."
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr ""
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr ""
++
++msgid "Any"
++msgstr ""
++
++msgid "Covered networks"
++msgstr ""
++
++msgid "Custom Rules"
++msgstr ""
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++
++msgid "Destination IP address"
++msgstr ""
++
++msgid "Destination address"
++msgstr ""
++
++msgid "Destination port"
++msgstr ""
++
++msgid "Destination zone"
++msgstr ""
++
++msgid "Do not rewrite"
++msgstr ""
++
++msgid "Drop invalid packets"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable NAT Loopback"
++msgstr ""
++
++msgid "Enable SYN-flood protection"
++msgstr ""
++
++msgid "Enable logging on this zone"
++msgstr ""
++
++msgid "External IP address"
++msgstr ""
++
++msgid "External port"
++msgstr ""
++
++msgid "External zone"
++msgstr ""
++
++msgid "Extra arguments"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Firewall - Custom Rules"
++msgstr ""
++
++msgid "Firewall - Port Forwards"
++msgstr ""
++
++msgid "Firewall - Traffic Rules"
++msgstr ""
++
++msgid "Firewall - Zone Settings"
++msgstr ""
++
++msgid "Force connection tracking"
++msgstr ""
++
++msgid "Forward"
++msgstr ""
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr ""
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "Input"
++msgstr ""
++
++msgid "Inter-Zone Forwarding"
++msgstr ""
++
++msgid "Internal IP address"
++msgstr ""
++
++msgid "Internal port"
++msgstr ""
++
++msgid "Internal zone"
++msgstr ""
++
++msgid "Limit log messages"
++msgstr ""
++
++msgid "MSS clamping"
++msgstr ""
++
++msgid "Masquerading"
++msgstr ""
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr ""
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "New SNAT rule"
++msgstr ""
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr ""
++
++msgid "New port forward"
++msgstr ""
++
++msgid "New source NAT"
++msgstr ""
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr ""
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr ""
++
++msgid "Other..."
++msgstr ""
++
++msgid "Output"
++msgstr ""
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr ""
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr ""
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr ""
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr ""
++
++msgid "SNAT port"
++msgstr ""
++
++msgid "Source IP address"
++msgstr ""
++
++msgid "Source MAC address"
++msgstr ""
++
++msgid "Source NAT"
++msgstr ""
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid "Source port"
++msgstr ""
++
++msgid "Source zone"
++msgstr ""
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr ""
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr ""
++
++msgid "Zone ⇒ Forwardings"
++msgstr ""
++
++msgid "Zones"
++msgstr ""
++
++msgid "accept"
++msgstr ""
++
++msgid "any"
++msgstr ""
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr ""
++
++msgid "reject"
++msgstr ""
++
++msgid "traffic"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-firewall/po/sv/firewall.po b/feeds/luci/applications/luci-app-firewall/po/sv/firewall.po
+new file mode 100644
+index 0000000..f3e7fd9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/sv/firewall.po
+@@ -0,0 +1,433 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr ""
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr ""
++
++msgid "(Unnamed Rule)"
++msgstr ""
++
++msgid "(Unnamed SNAT)"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add and edit..."
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr ""
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr ""
++
++msgid "Any"
++msgstr ""
++
++msgid "Covered networks"
++msgstr ""
++
++msgid "Custom Rules"
++msgstr ""
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++
++msgid "Destination IP address"
++msgstr ""
++
++msgid "Destination address"
++msgstr ""
++
++msgid "Destination port"
++msgstr ""
++
++msgid "Destination zone"
++msgstr ""
++
++msgid "Do not rewrite"
++msgstr ""
++
++msgid "Drop invalid packets"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable NAT Loopback"
++msgstr ""
++
++msgid "Enable SYN-flood protection"
++msgstr ""
++
++msgid "Enable logging on this zone"
++msgstr ""
++
++msgid "External IP address"
++msgstr ""
++
++msgid "External port"
++msgstr ""
++
++msgid "External zone"
++msgstr ""
++
++msgid "Extra arguments"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Firewall - Custom Rules"
++msgstr ""
++
++msgid "Firewall - Port Forwards"
++msgstr ""
++
++msgid "Firewall - Traffic Rules"
++msgstr ""
++
++msgid "Firewall - Zone Settings"
++msgstr ""
++
++msgid "Force connection tracking"
++msgstr ""
++
++msgid "Forward"
++msgstr ""
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr ""
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "Input"
++msgstr ""
++
++msgid "Inter-Zone Forwarding"
++msgstr ""
++
++msgid "Internal IP address"
++msgstr ""
++
++msgid "Internal port"
++msgstr ""
++
++msgid "Internal zone"
++msgstr ""
++
++msgid "Limit log messages"
++msgstr ""
++
++msgid "MSS clamping"
++msgstr ""
++
++msgid "Masquerading"
++msgstr ""
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr ""
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "New SNAT rule"
++msgstr ""
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr ""
++
++msgid "New port forward"
++msgstr ""
++
++msgid "New source NAT"
++msgstr ""
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr ""
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr ""
++
++msgid "Other..."
++msgstr ""
++
++msgid "Output"
++msgstr ""
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr ""
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr ""
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr ""
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr ""
++
++msgid "SNAT port"
++msgstr ""
++
++msgid "Source IP address"
++msgstr ""
++
++msgid "Source MAC address"
++msgstr ""
++
++msgid "Source NAT"
++msgstr ""
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid "Source port"
++msgstr ""
++
++msgid "Source zone"
++msgstr ""
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr ""
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr ""
++
++msgid "Zone ⇒ Forwardings"
++msgstr ""
++
++msgid "Zones"
++msgstr ""
++
++msgid "accept"
++msgstr ""
++
++msgid "any"
++msgstr ""
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr ""
++
++msgid "reject"
++msgstr ""
++
++msgid "traffic"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-firewall/po/templates/firewall.pot b/feeds/luci/applications/luci-app-firewall/po/templates/firewall.pot
+new file mode 100644
+index 0000000..402aa69
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/templates/firewall.pot
+@@ -0,0 +1,425 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr ""
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr ""
++
++msgid "(Unnamed Rule)"
++msgstr ""
++
++msgid "(Unnamed SNAT)"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add and edit..."
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr ""
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr ""
++
++msgid "Any"
++msgstr ""
++
++msgid "Covered networks"
++msgstr ""
++
++msgid "Custom Rules"
++msgstr ""
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++
++msgid "Destination IP address"
++msgstr ""
++
++msgid "Destination address"
++msgstr ""
++
++msgid "Destination port"
++msgstr ""
++
++msgid "Destination zone"
++msgstr ""
++
++msgid "Do not rewrite"
++msgstr ""
++
++msgid "Drop invalid packets"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable NAT Loopback"
++msgstr ""
++
++msgid "Enable SYN-flood protection"
++msgstr ""
++
++msgid "Enable logging on this zone"
++msgstr ""
++
++msgid "External IP address"
++msgstr ""
++
++msgid "External port"
++msgstr ""
++
++msgid "External zone"
++msgstr ""
++
++msgid "Extra arguments"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Firewall - Custom Rules"
++msgstr ""
++
++msgid "Firewall - Port Forwards"
++msgstr ""
++
++msgid "Firewall - Traffic Rules"
++msgstr ""
++
++msgid "Firewall - Zone Settings"
++msgstr ""
++
++msgid "Force connection tracking"
++msgstr ""
++
++msgid "Forward"
++msgstr ""
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr ""
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "Input"
++msgstr ""
++
++msgid "Inter-Zone Forwarding"
++msgstr ""
++
++msgid "Internal IP address"
++msgstr ""
++
++msgid "Internal port"
++msgstr ""
++
++msgid "Internal zone"
++msgstr ""
++
++msgid "Limit log messages"
++msgstr ""
++
++msgid "MSS clamping"
++msgstr ""
++
++msgid "Masquerading"
++msgstr ""
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr ""
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "New SNAT rule"
++msgstr ""
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr ""
++
++msgid "New port forward"
++msgstr ""
++
++msgid "New source NAT"
++msgstr ""
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr ""
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr ""
++
++msgid "Other..."
++msgstr ""
++
++msgid "Output"
++msgstr ""
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr ""
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr ""
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr ""
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr ""
++
++msgid "SNAT port"
++msgstr ""
++
++msgid "Source IP address"
++msgstr ""
++
++msgid "Source MAC address"
++msgstr ""
++
++msgid "Source NAT"
++msgstr ""
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid "Source port"
++msgstr ""
++
++msgid "Source zone"
++msgstr ""
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr ""
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr ""
++
++msgid "Zone ⇒ Forwardings"
++msgstr ""
++
++msgid "Zones"
++msgstr ""
++
++msgid "accept"
++msgstr ""
++
++msgid "any"
++msgstr ""
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr ""
++
++msgid "reject"
++msgstr ""
++
++msgid "traffic"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-firewall/po/tr/firewall.po b/feeds/luci/applications/luci-app-firewall/po/tr/firewall.po
+new file mode 100644
+index 0000000..60a2190
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/tr/firewall.po
+@@ -0,0 +1,432 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr ""
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr ""
++
++msgid "(Unnamed Rule)"
++msgstr ""
++
++msgid "(Unnamed SNAT)"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add and edit..."
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr ""
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr ""
++
++msgid "Any"
++msgstr ""
++
++msgid "Covered networks"
++msgstr ""
++
++msgid "Custom Rules"
++msgstr ""
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++
++msgid "Destination IP address"
++msgstr ""
++
++msgid "Destination address"
++msgstr ""
++
++msgid "Destination port"
++msgstr ""
++
++msgid "Destination zone"
++msgstr ""
++
++msgid "Do not rewrite"
++msgstr ""
++
++msgid "Drop invalid packets"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable NAT Loopback"
++msgstr ""
++
++msgid "Enable SYN-flood protection"
++msgstr ""
++
++msgid "Enable logging on this zone"
++msgstr ""
++
++msgid "External IP address"
++msgstr ""
++
++msgid "External port"
++msgstr ""
++
++msgid "External zone"
++msgstr ""
++
++msgid "Extra arguments"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Firewall - Custom Rules"
++msgstr ""
++
++msgid "Firewall - Port Forwards"
++msgstr ""
++
++msgid "Firewall - Traffic Rules"
++msgstr ""
++
++msgid "Firewall - Zone Settings"
++msgstr ""
++
++msgid "Force connection tracking"
++msgstr ""
++
++msgid "Forward"
++msgstr ""
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr ""
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "Input"
++msgstr ""
++
++msgid "Inter-Zone Forwarding"
++msgstr ""
++
++msgid "Internal IP address"
++msgstr ""
++
++msgid "Internal port"
++msgstr ""
++
++msgid "Internal zone"
++msgstr ""
++
++msgid "Limit log messages"
++msgstr ""
++
++msgid "MSS clamping"
++msgstr ""
++
++msgid "Masquerading"
++msgstr ""
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr ""
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "New SNAT rule"
++msgstr ""
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr ""
++
++msgid "New port forward"
++msgstr ""
++
++msgid "New source NAT"
++msgstr ""
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr ""
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr ""
++
++msgid "Other..."
++msgstr ""
++
++msgid "Output"
++msgstr ""
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr ""
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr ""
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr ""
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr ""
++
++msgid "SNAT port"
++msgstr ""
++
++msgid "Source IP address"
++msgstr ""
++
++msgid "Source MAC address"
++msgstr ""
++
++msgid "Source NAT"
++msgstr ""
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid "Source port"
++msgstr ""
++
++msgid "Source zone"
++msgstr ""
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr ""
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr ""
++
++msgid "Zone ⇒ Forwardings"
++msgstr ""
++
++msgid "Zones"
++msgstr ""
++
++msgid "accept"
++msgstr ""
++
++msgid "any"
++msgstr ""
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr ""
++
++msgid "reject"
++msgstr ""
++
++msgid "traffic"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-firewall/po/uk/firewall.po b/feeds/luci/applications/luci-app-firewall/po/uk/firewall.po
+new file mode 100644
+index 0000000..3705306
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/uk/firewall.po
+@@ -0,0 +1,619 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-12-29 12:53+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++
++msgid "%s%s with %s"
++msgstr "%s%s із %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s у %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(Ð—Ð°Ð¿Ð¸Ñ Ð±ÐµÐ· імені)"
++
++msgid "(Unnamed Rule)"
++msgstr "(Правило без імені)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(SNAT без імені)"
++
++msgid "-- Please choose --"
++msgstr "-- Виберіть --"
++
++msgid "-- custom --"
++msgstr "-- додатково --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> пакетів за <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr "<var>%d</var> пакетів за <var>%s</var>, підрÑд <var>%d</var> пакетів"
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> з лімітом %s"
++
++msgid "Action"
++msgstr "ДіÑ"
++
++msgid "Add"
++msgstr "Додати"
++
++msgid "Add and edit..."
++msgstr "Додати та редагувати..."
++
++msgid "Advanced Settings"
++msgstr "Розширені наÑтройки"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "Дозволити ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ <em>зон-джерел</em>:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "Дозволити ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ <em>зон призначеннÑ</em>:"
++
++msgid "Any"
++msgstr "Будь-Ñкий"
++
++msgid "Covered networks"
++msgstr "Покриті мережі"
++
++msgid "Custom Rules"
++msgstr "ÐаÑтроювані правила"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"ÐаÑтроювані правила дозволÑÑŽÑ‚ÑŒ виконувати довільні команди <em>iptables</"
++"em>, Ñкі в іншому випадку не охоплені в межах брандмауера. Команди "
++"виконуютьÑÑ Ð¿Ñ–ÑÐ»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ð°, відразу піÑÐ»Ñ "
++"Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ð³Ð¾ набору правил."
++
++msgid "Destination IP address"
++msgstr "IP-адреÑа призначеннÑ"
++
++msgid "Destination address"
++msgstr "ÐдреÑа призначеннÑ"
++
++msgid "Destination port"
++msgstr "Порт призначеннÑ"
++
++msgid "Destination zone"
++msgstr "Зона призначеннÑ"
++
++msgid "Do not rewrite"
++msgstr "Ðе перезапиÑувати"
++
++msgid "Drop invalid packets"
++msgstr "Відкидати помилкові пакети"
++
++msgid "Enable"
++msgstr "Увімкнути"
++
++msgid "Enable NAT Loopback"
++msgstr "Увімкнути NAT Loopback"
++
++msgid "Enable SYN-flood protection"
++msgstr "Увімкнути захиÑÑ‚ від SYN-flood"
++
++msgid "Enable logging on this zone"
++msgstr "Увімкнути реєÑÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ цій зоні"
++
++msgid "External IP address"
++msgstr "Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ IP-адреÑа"
++
++msgid "External port"
++msgstr "Зовнішній порт"
++
++msgid "External zone"
++msgstr "Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ð·Ð¾Ð½Ð°"
++
++msgid "Extra arguments"
++msgstr "Додаткові аргументи"
++
++msgid "Firewall"
++msgstr "Брандмауер"
++
++msgid "Firewall - Custom Rules"
++msgstr "Брандмауер — ÐаÑтроювані правила"
++
++msgid "Firewall - Port Forwards"
++msgstr "Брандмауер — СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð²"
++
++msgid "Firewall - Traffic Rules"
++msgstr "Брандмауер — Правила трафіка"
++
++msgid "Firewall - Zone Settings"
++msgstr "Брандмауер — Параметри зон"
++
++msgid "Force connection tracking"
++msgstr "Увімкнути відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð·'єднань"
++
++msgid "Forward"
++msgstr "СпрÑмовуваннÑ"
++
++msgid "Forward to"
++msgstr "ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾"
++
++msgid "From %s in %s"
++msgstr "%s у %s"
++
++msgid "From %s in %s with source %s"
++msgstr "%s у %s з вихідним %s"
++
++msgid "From %s in %s with source %s and %s"
++msgstr "%s у %s з вихідним %s та %s"
++
++msgid "General Settings"
++msgstr "Загальні наÑтройки"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 та IPv6"
++
++msgid "IPv4 only"
++msgstr "Лише IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "Лише IPv6"
++
++msgid "Input"
++msgstr "Вхідний"
++
++msgid "Inter-Zone Forwarding"
++msgstr "СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÑ€Ñ–Ð·ÑŒ зони"
++
++msgid "Internal IP address"
++msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ IP-адреÑа"
++
++msgid "Internal port"
++msgstr "Внутрішній порт"
++
++msgid "Internal zone"
++msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð·Ð¾Ð½Ð°"
++
++msgid "Limit log messages"
++msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ журналу"
++
++msgid "MSS clamping"
++msgstr "ЗатиÑÐºÐ°Ð½Ð½Ñ MSS"
++
++msgid "Masquerading"
++msgstr "Підміна"
++
++msgid "Match"
++msgstr "ЗіÑтавлÑти"
++
++msgid "Match ICMP type"
++msgstr "ЗіÑтавлÑти ICMP типу"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++"ЗіÑтавлÑти трафік, що ÑпрÑмовуєтьÑÑ Ð½Ð° заданий порт Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ діапазон "
++"портів."
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++"ЗіÑтавлÑти вхідний трафік, ÑпрÑмований на заданий порт Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ "
++"діапазон портів цього вузла."
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++"ЗіÑтавлÑти вхідний трафік, що виникає на заданому порту джерела або "
++"діапазоні портів вузла клієнта."
++
++msgid "Name"
++msgstr "Ім'Ñ"
++
++msgid "New SNAT rule"
++msgstr "Ðове правило SNAT"
++
++msgid "New forward rule"
++msgstr "Ðове правило ÑпрÑмовуваннÑ"
++
++msgid "New input rule"
++msgstr "Ðове вхідне правило"
++
++msgid "New port forward"
++msgstr "Ðове ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñƒ"
++
++msgid "New source NAT"
++msgstr "Ðовий NAT джерела"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "ЗіÑтавлÑти тільки вхідний трафік, ÑпрÑмований на задану IP-адреÑу."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "ЗіÑтавлÑти тільки вхідний трафік від цих MAC-адреÑ."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr "ЗіÑтавлÑти тільки вхідний трафік від цього IP чи діапазону."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++"ЗіÑтавлÑти тільки вхідний трафік, що виникає на заданому порту джерела або "
++"діапазоні портів вузла клієнта."
++
++msgid "Open ports on router"
++msgstr "Відкрити порти на роутері"
++
++msgid "Other..."
++msgstr "Інше..."
++
++msgid "Output"
++msgstr "Вихідний"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++"Передача додаткових аргументів Ð´Ð»Ñ IPTables. ВикориÑтовуйте з обережніÑÑ‚ÑŽ!"
++
++msgid "Port Forwards"
++msgstr "СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð²"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++"СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð² дозволÑÑ” віддаленим комп'ютерам з Інтернету "
++"підключатиÑÑ Ð´Ð¾ певного комп'ютера або Ñлужби у приватній мережі."
++
++msgid "Protocol"
++msgstr "Протокол"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++"ПереÑпрÑмувати відповідний вхідний трафік на заданий порт внутрішнього вузла"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "ПереÑпрÑмувати відповідний вхідний трафік на заданий внутрішній вузол"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "Обмежити підміну заданими підмережами призначеннÑ"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "Обмежити підміну заданими вихідними підмережами"
++
++msgid "Restrict to address family"
++msgstr "Обмежити ÑімейÑтво протоколів"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr "ПерепиÑувати зіÑтавлений трафік на вказану адреÑу."
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++"ПерепиÑувати зіÑтавлений трафік на вказаний порт джерела. Може залишатиÑÑ "
++"порожнім, щоб перепиÑувати тільки IP-адреÑу."
++
++msgid "Rewrite to source %s"
++msgstr "Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ð½Ð° вихідний %s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ð½Ð° вихідний %s, %s"
++
++msgid "SNAT IP address"
++msgstr "IP-адреÑа SNAT"
++
++msgid "SNAT port"
++msgstr "Порт SNAT"
++
++msgid "Source IP address"
++msgstr "IP-адреÑа джерела"
++
++msgid "Source MAC address"
++msgstr "MAC-адреÑа джерела"
++
++msgid "Source NAT"
++msgstr "NAT джерела"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"NAT джерела Ñ” Ñпецифічною формою маÑкуваннÑ, Ñка дозволÑÑ” мати детальний "
++"контроль над IP джерела, що викориÑтовуютьÑÑ Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ трафіку, "
++"наприклад, Ð´Ð»Ñ Ð·Ñ–ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÑ–Ð»ÑŒÐºÐ¾Ñ… WAN-Ð°Ð´Ñ€ÐµÑ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ð¼ підмережам."
++
++msgid "Source address"
++msgstr "ÐдреÑа джерела"
++
++msgid "Source port"
++msgstr "Порт джерела"
++
++msgid "Source zone"
++msgstr "Зона-джерело"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"Брандмауер Ñтворює зони поверх ваших мережевих інтерфейÑів Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ "
++"потоком мережевого трафіку."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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."
++
++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 "
++"entry, such as matched source and destination hosts."
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"Цей розділ визначає загальні влаÑтивоÑÑ‚Ñ– %q. Параметри <em>вхідний</em> Ñ– "
++"<em>вихідний</em> задають типову політику Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ñ–ÐºÑƒ на вході й виході з "
++"цієї зони, а параметр \"ÑпрÑмовуваннÑ\" опиÑує політику ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ "
++"трафіку між різними мережами в межах зони. Пункт <em>вкриті мережі</em> "
++"визначає, Ñкі доÑтупні мережі Ñ” членами цієї зони."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "%s на %s <var>цього приÑтрою</var>"
++
++msgid "To %s in %s"
++msgstr "%s у %s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "%s на <var>цього приÑтрою</var>"
++
++msgid "To %s, %s in %s"
++msgstr "%s, %s у %s"
++
++msgid "To source IP"
++msgstr "До IP джерела"
++
++msgid "To source port"
++msgstr "До порту джерела"
++
++msgid "Traffic Rules"
++msgstr "Правила трафіка"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"Правила трафіка визначають політику Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑ‚Ñ–Ð², що переÑилаютьÑÑ Ð¼Ñ–Ð¶ "
++"різними зонами, наприклад, відхилÑти трафік між певними вузлами або відкрити "
++"порти WAN на маршрутизаторі."
++
++msgid "Via %s"
++msgstr "Через %s"
++
++msgid "Via %s at %s"
++msgstr "Через %s на %s"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++"Ви можете вказати кілька протоколів, вибравши \"-- додатково --\", а потім "
++"увівши Ñ—Ñ…, розділÑючи пробілами."
++
++msgid "Zone %q"
++msgstr "Зона %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "Зона ⇒ СпрÑмовуваннÑ"
++
++msgid "Zones"
++msgstr "Зони"
++
++msgid "accept"
++msgstr "приймати"
++
++msgid "any"
++msgstr "будь-Ñкий"
++
++msgid "any host"
++msgstr "будь-Ñкий вузол"
++
++msgid "any router IP"
++msgstr "будь-Ñкий IP роутера"
++
++msgid "any zone"
++msgstr "будь-Ñкій зоні"
++
++msgid "don't track"
++msgstr "не відÑтеж."
++
++msgid "drop"
++msgstr "опуÑкати"
++
++msgid "reject"
++msgstr "відкидати"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "ПризначеннÑ"
++
++#~ msgid "Family"
++#~ msgstr "СімейÑтво"
++
++#~ msgid "Forward to %s in %s"
++#~ msgstr "ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ %s у %s"
++
++#~ msgid "Forward to %s, %s in %s"
++#~ msgstr "ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ %s, %s у %s"
++
++#~ msgid "SNAT"
++#~ msgstr "SNAT"
++
++#~ msgid "Source"
++#~ msgstr "Джерело"
++
++#~ msgid "To %s"
++#~ msgstr "%s"
++
++#~ msgid "To %s at %s"
++#~ msgstr "%s через %s"
++
++#~ msgid "Via"
++#~ msgstr "Через"
++
++#~ msgid "Accept forward"
++#~ msgstr "Приймати ÑпрÑмовуваннÑ"
++
++#~ msgid "Accept input"
++#~ msgstr "Приймати вхідні"
++
++#~ msgid "Disable"
++#~ msgstr "Вимкнути"
++
++#~ msgid "Discard forward"
++#~ msgstr "СкаÑувати ÑпрÑмовуваннÑ"
++
++#~ msgid "Discard input"
++#~ msgstr "СкаÑувати введеннÑ"
++
++#~ msgid "Do not track forward"
++#~ msgstr "Ðе відÑтежувати ÑпрÑмовуваннÑ"
++
++#~ msgid "Do not track input"
++#~ msgstr "Ðе відÑтежувати введеннÑ"
++
++#~ msgid "IP"
++#~ msgstr "IP"
++
++#~ msgid "IP range"
++#~ msgstr "діапазон IP"
++
++#~ msgid "IPs"
++#~ msgstr "IP"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MACs"
++#~ msgstr "MAC"
++
++#~ msgid "Refuse forward"
++#~ msgstr "Відкидати ÑпрÑмовуваннÑ"
++
++#~ msgid "Refuse input"
++#~ msgstr "Відкидати вхідні дані"
++
++#~ msgid "Rule is disabled"
++#~ msgstr "Правило вимкнене"
++
++#~ msgid "Rule is enabled"
++#~ msgstr "Правило ввімкнене"
++
++#~ msgid "day"
++#~ msgstr "день"
++
++#~ msgid "hour"
++#~ msgstr "годину"
++
++#~ msgid "minute"
++#~ msgstr "хвилину"
++
++#~ msgid "not"
++#~ msgstr "не"
++
++#~ msgid "port"
++#~ msgstr "порт"
++
++#~ msgid "ports"
++#~ msgstr "порти"
++
++#~ msgid "second"
++#~ msgstr "Ñекунду"
++
++#~ msgid "type"
++#~ msgstr "типом"
++
++#~ msgid "types"
++#~ msgstr "типами"
++
++#~ msgid "(optional)"
++#~ msgstr "(необов'Ñзково)"
++
++#~ msgid "Intended destination address"
++#~ msgstr "ÐдреÑа призначеннÑ"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Внутрішній порт (необов'Ñзково)"
++
++#~ msgid "Advanced Options"
++#~ msgstr "Додаткові параметри"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "Розширені правила"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Розширені правила дозволÑÑŽÑ‚ÑŒ налаштувати брандмауер Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… потреб. "
++#~ "Лише нові з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ´ÑƒÑ‚ÑŒ узгоджені. Пакети, що належать вже відкриті "
++#~ "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ пропуÑкаютьÑÑ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ð¾Ð¼."
++
++#~ msgid "Custom Rules (/etc/firewall.user)"
++#~ msgstr "КориÑтувацькі правила (/etc/firewall.user)"
++
++#~ msgid "Device"
++#~ msgstr "ПриÑтрій"
++
++#~ msgid ""
++#~ "For DNAT, match incoming traffic directed at the given destination ip "
++#~ "address. For SNAT rewrite the source address to the given address."
++#~ msgstr ""
++#~ "Ð”Ð»Ñ DNAT узгоджує вхідний трафік, ÑпрÑмований до відповідної IP адреÑи "
++#~ "призначеннÑ. Ð”Ð»Ñ SNAT замінÑÑ” адреÑу джерела на дану адреÑу"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/vi/firewall.po b/feeds/luci/applications/luci-app-firewall/po/vi/firewall.po
+new file mode 100644
+index 0000000..645aa88
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/vi/firewall.po
+@@ -0,0 +1,565 @@
++# luci-fw.pot
++# generated from ./applications/luci-fw/luasrc/i18n/luci-fw.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2009-08-16 14:02+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "%s in %s"
++msgstr ""
++
++msgid "%s%s with %s"
++msgstr ""
++
++msgid "%s, %s in %s"
++msgstr ""
++
++msgid "(Unnamed Entry)"
++msgstr ""
++
++msgid "(Unnamed Rule)"
++msgstr ""
++
++msgid "(Unnamed SNAT)"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr ""
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr ""
++
++msgid "<var>%s</var> and limit to %s"
++msgstr ""
++
++msgid "Action"
++msgstr "Action"
++
++msgid "Add"
++msgstr ""
++
++msgid "Add and edit..."
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr ""
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr ""
++
++msgid "Any"
++msgstr ""
++
++msgid "Covered networks"
++msgstr ""
++
++msgid "Custom Rules"
++msgstr ""
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++
++msgid "Destination IP address"
++msgstr ""
++
++msgid "Destination address"
++msgstr "Äịa chỉ Ä‘iểm đến"
++
++msgid "Destination port"
++msgstr "Cổng điểm đến"
++
++#, fuzzy
++msgid "Destination zone"
++msgstr "Äiểm đến"
++
++msgid "Do not rewrite"
++msgstr ""
++
++msgid "Drop invalid packets"
++msgstr "BỠqua nhưng gói không hợp lý"
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable NAT Loopback"
++msgstr ""
++
++#, fuzzy
++msgid "Enable SYN-flood protection"
++msgstr "SYN-flood bảo vệ "
++
++msgid "Enable logging on this zone"
++msgstr ""
++
++msgid "External IP address"
++msgstr ""
++
++msgid "External port"
++msgstr "External port"
++
++msgid "External zone"
++msgstr ""
++
++msgid "Extra arguments"
++msgstr ""
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall - Custom Rules"
++msgstr ""
++
++msgid "Firewall - Port Forwards"
++msgstr ""
++
++msgid "Firewall - Traffic Rules"
++msgstr ""
++
++msgid "Firewall - Zone Settings"
++msgstr ""
++
++msgid "Force connection tracking"
++msgstr ""
++
++msgid "Forward"
++msgstr ""
++
++msgid "Forward to"
++msgstr ""
++
++msgid "From %s in %s"
++msgstr ""
++
++msgid "From %s in %s with source %s"
++msgstr ""
++
++msgid "From %s in %s with source %s and %s"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "Input"
++msgstr "Input"
++
++msgid "Inter-Zone Forwarding"
++msgstr ""
++
++#, fuzzy
++msgid "Internal IP address"
++msgstr "Internal address"
++
++#, fuzzy
++msgid "Internal port"
++msgstr "External port"
++
++msgid "Internal zone"
++msgstr ""
++
++msgid "Limit log messages"
++msgstr ""
++
++#, fuzzy
++msgid "MSS clamping"
++msgstr "MSS Clamping"
++
++msgid "Masquerading"
++msgstr ""
++
++msgid "Match"
++msgstr ""
++
++msgid "Match ICMP type"
++msgstr ""
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr ""
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr ""
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "New SNAT rule"
++msgstr ""
++
++msgid "New forward rule"
++msgstr ""
++
++msgid "New input rule"
++msgstr ""
++
++msgid "New port forward"
++msgstr ""
++
++msgid "New source NAT"
++msgstr ""
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr ""
++
++msgid "Only match incoming traffic from these MACs."
++msgstr ""
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr ""
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr ""
++
++msgid "Open ports on router"
++msgstr ""
++
++msgid "Other..."
++msgstr ""
++
++msgid "Output"
++msgstr "Output"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr ""
++
++msgid "Port Forwards"
++msgstr ""
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr ""
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr ""
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr ""
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr ""
++
++msgid "Restrict to address family"
++msgstr ""
++
++msgid "Rewrite matched traffic to the given address."
++msgstr ""
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr ""
++
++msgid "Rewrite to source %s"
++msgstr ""
++
++msgid "Rewrite to source %s, %s"
++msgstr ""
++
++msgid "SNAT IP address"
++msgstr ""
++
++msgid "SNAT port"
++msgstr ""
++
++#, fuzzy
++msgid "Source IP address"
++msgstr "Äỉa chỉ MAC nguồn"
++
++msgid "Source MAC address"
++msgstr ""
++
++msgid "Source NAT"
++msgstr ""
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++
++#, fuzzy
++msgid "Source address"
++msgstr "Äỉa chỉ MAC nguồn"
++
++msgid "Source port"
++msgstr "Cổng nguồn"
++
++#, fuzzy
++msgid "Source zone"
++msgstr "Cổng nguồn"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr ""
++"The firewall tạo zones trên giao diện mạng lÆ°á»›i để Ä‘iá»u triển sá»± dòng lÆ°u "
++"thông của mạng."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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 ""
++
++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 "
++"entry, such as matched source and destination hosts."
++msgstr ""
++
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s in %s"
++msgstr ""
++
++msgid "To %s on <var>this device</var>"
++msgstr ""
++
++msgid "To %s, %s in %s"
++msgstr ""
++
++msgid "To source IP"
++msgstr ""
++
++msgid "To source port"
++msgstr ""
++
++msgid "Traffic Rules"
++msgstr ""
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++
++msgid "Via %s"
++msgstr ""
++
++msgid "Via %s at %s"
++msgstr ""
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr ""
++
++msgid "Zone %q"
++msgstr ""
++
++msgid "Zone ⇒ Forwardings"
++msgstr ""
++
++msgid "Zones"
++msgstr "Zones"
++
++msgid "accept"
++msgstr "chấp nhận"
++
++msgid "any"
++msgstr ""
++
++msgid "any host"
++msgstr ""
++
++msgid "any router IP"
++msgstr ""
++
++msgid "any zone"
++msgstr ""
++
++msgid "don't track"
++msgstr ""
++
++msgid "drop"
++msgstr "drop"
++
++msgid "reject"
++msgstr "Không chấp nhận"
++
++msgid "traffic"
++msgstr ""
++
++#~ msgid "Destination"
++#~ msgstr "Äiểm đến"
++
++#~ msgid "Source"
++#~ msgstr "Nguồn"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "Internal port (tùy chá»n)"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "Luật cấp cao"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "Luật cấp cao để bạn tùy chỉnh firewall mà bạn cần. Chỉ những kết nối mới "
++#~ "sẽ được làm cho phù hợp. Các gói thuộc đã mở các kết nối sẽ tự động cho "
++#~ "phép vượt qua firewall."
++
++#~ msgid "Port forwarding"
++#~ msgstr "Cổng chuyển tiếp"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr ""
++#~ "Cổng chuyển tiếp cho phép cung cấp những dịch vụ mạng trong vùng tới một "
++#~ "ngoại mạng. "
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "Sự chuyển hướng lưu thông"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr ""
++#~ "Sự chuyển hướng lưu thông cho phép bạn thay đổi địa chỉ điểm đến của gói "
++#~ "chuyển tiếp. "
++
++#, fuzzy
++#~ msgid "Network"
++#~ msgstr "Networks"
++
++#~ msgid "Traffic Control"
++#~ msgstr "Äiá»u khiển lÆ°u thông"
++
++#~ msgid "Zone-to-Zone traffic"
++#~ msgstr "Lưu thông Zone- to - Zone"
++
++#, fuzzy
++#~ msgid ""
++#~ "Here you can specify which network traffic is allowed to flow between "
++#~ "network zones. Only new connections will be matched. Packets belonging "
++#~ "to already open connections are automatically allowed to pass the "
++#~ "firewall. If you experience occasional connection problems try enabling "
++#~ "MSS Clamping otherwise disable it for performance reasons."
++#~ msgstr ""
++#~ "Tại đây bạn có thể xác định được mạng lưới giao thông được phép lưu lượng "
++#~ "qua network zone. Chỉ có kết nối mới sẽ là phù hợp. Các gói thuộc kết nối "
++#~ "đã mở được tự động được cho phép để vượt qua firewall. Nếu bạn gặp vấn đỠ"
++#~ "kết nối thử kích hoạt MSS Clamping hoặc vô hiệu hóa nó vì lý do thực thi."
++
++#~ msgid "Zone"
++#~ msgstr "Zone"
++
++#, fuzzy
++#~ msgid "Destination IP"
++#~ msgstr "Äiểm đến"
++
++#, fuzzy
++#~ msgid "IP address"
++#~ msgstr "Äịa chỉ IP"
++
++#, fuzzy
++#~ msgid "Source MAC-address"
++#~ msgstr "Äỉa chỉ MAC nguồn"
++
++#~ msgid "Custom forwarding"
++#~ msgstr "Tùy chỉnh chuyển tiếp"
++
++#~ msgid "Input Zone"
++#~ msgstr "Input Zone"
++
++#~ msgid "Output Zone"
++#~ msgstr "Output Zone"
++
++#~ msgid "External Zone"
++#~ msgstr "External Zone"
++
++#~ msgid "Source MAC"
++#~ msgstr "Nguồn MAC"
++
++#~ msgid "Defaults"
++#~ msgstr "Mặc định"
++
++#~ msgid ""
++#~ "These are the default settings that are used if no other rules match."
++#~ msgstr ""
++#~ "Có những cài đặt mặc định được dùng nếu những cái luật khác không phù hợp"
++
++#~ msgid ""
++#~ "Zones part the network interfaces into certain isolated areas to separate "
++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag "
++#~ "enables NAT masquerading for all outgoing traffic on this zone."
++#~ msgstr ""
++#~ "Phân vùng các phần giao diện mạng vào những khu vực cô lập nhất định để "
++#~ "phân chia mạng lÆ°á»›i lÆ°u thông. Má»™t hoặc nhiá»u mạng lÆ°á»›i có thể thuá»™c vào "
++#~ "một khu. Các MASQ-flag kích hoạt NAT masquerading cho tất cả các lưu "
++#~ "lượng giao thông trên khu vực này."
++
++#~ msgid "MASQ"
++#~ msgstr "MASQ"
++
++#~ msgid "contained networks"
++#~ msgstr "contained networks"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/zh-cn/firewall.po b/feeds/luci/applications/luci-app-firewall/po/zh-cn/firewall.po
+new file mode 100644
+index 0000000..03c1b00
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/zh-cn/firewall.po
+@@ -0,0 +1,589 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-30 17:00+0200\n"
++"PO-Revision-Date: 2014-06-14 18:05+0200\n"
++"Last-Translator: jame-he <755085131@qq.com>\n"
++"Language-Team: QQ Group 75543259 <axishero@foxmail.com>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr "%s ä½äºŽ %s"
++
++msgid "%s%s with %s"
++msgstr "%s%s 和 %s"
++
++msgid "%s, %s in %s"
++msgstr "%s, %s ä½äºŽ %s"
++
++msgid "(Unnamed Entry)"
++msgstr "(未命åæ¡ç›®)"
++
++msgid "(Unnamed Rule)"
++msgstr "(未命å规则)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(未命åSNAT)"
++
++msgid "-- Please choose --"
++msgstr "-- 请选择 --"
++
++msgid "-- custom --"
++msgstr "-- 自定义 --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> 包.æ¯ <var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr "<var>%d</var> 包. æ¯ <var>%s</var>, çªå‘ <var>%d</var> 包."
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> 并且é™åˆ¶åˆ° %s"
++
++msgid "Action"
++msgstr "动作"
++
++msgid "Add"
++msgstr "添加"
++
++msgid "Add and edit..."
++msgstr "添加并编辑..."
++
++msgid "Advanced Settings"
++msgstr "高级设置"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "å…许从<em>æºåŒºåŸŸ</em>转å‘"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "å…许转å‘到<em>目标区域</em>"
++
++msgid "Any"
++msgstr "任何"
++
++msgid "Covered networks"
++msgstr "覆盖网络"
++
++msgid "Custom Rules"
++msgstr "自定义规则"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"自定义规则å…许è¿è¡Œä¸€äº›é˜²ç«å¢™æ²¡æœ‰åŒ…å«çš„功能。这些命令将在æ¯æ¬¡é‡å¯é˜²ç«å¢™æ—¶ï¼Œåœ¨"
++"默认的规则è¿è¡ŒåŽç«‹å³æ‰§è¡Œã€‚"
++
++msgid "Destination IP address"
++msgstr "目标IP地å€"
++
++msgid "Destination address"
++msgstr "目标地å€"
++
++msgid "Destination port"
++msgstr "目标端å£"
++
++msgid "Destination zone"
++msgstr "目标区域"
++
++msgid "Do not rewrite"
++msgstr "ä¸å¡«å†™=(所有端å£ï¼‰"
++
++msgid "Drop invalid packets"
++msgstr "丢弃无效数æ®åŒ…"
++
++msgid "Enable"
++msgstr "å¯ç”¨"
++
++msgid "Enable NAT Loopback"
++msgstr "å¯ç”¨NAT环回"
++
++msgid "Enable SYN-flood protection"
++msgstr "å¯ç”¨SYN-flood防御"
++
++msgid "Enable logging on this zone"
++msgstr "在此区域å…许进入"
++
++msgid "External IP address"
++msgstr "外部IP地å€"
++
++msgid "External port"
++msgstr "外部端å£"
++
++msgid "External zone"
++msgstr "外部区域"
++
++msgid "Extra arguments"
++msgstr "附加å‚æ•°"
++
++msgid "Firewall"
++msgstr "防ç«å¢™"
++
++msgid "Firewall - Custom Rules"
++msgstr "防ç«å¢™ - 自定义规则"
++
++msgid "Firewall - Port Forwards"
++msgstr "防ç«å¢™ - 端å£è½¬å‘"
++
++msgid "Firewall - Traffic Rules"
++msgstr "防ç«å¢™ - 通信规则"
++
++msgid "Firewall - Zone Settings"
++msgstr "防ç«å¢™-区域设置"
++
++msgid "Force connection tracking"
++msgstr "强制连接追踪"
++
++msgid "Forward"
++msgstr "转å‘"
++
++msgid "Forward to"
++msgstr "转å‘到"
++
++msgid "From %s in %s"
++msgstr "æ¥è‡ª %s ä½äºŽ %s"
++
++msgid "From %s in %s with source %s"
++msgstr "æ¥è‡ª %s ä½äºŽ %s å¸¦æº %s"
++
++msgid "From %s in %s with source %s and %s"
++msgstr "æ¥è‡ª %s ä½äºŽ %s å¸¦æº %s 并且 %s"
++
++msgid "General Settings"
++msgstr "基本设置"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 和 IPv6"
++
++msgid "IPv4 only"
++msgstr "ä»…IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "ä»…IPv6"
++
++msgid "Input"
++msgstr "入站数æ®"
++
++msgid "Inter-Zone Forwarding"
++msgstr "端å£è§¦å‘"
++
++msgid "Internal IP address"
++msgstr "内部IP地å€"
++
++msgid "Internal port"
++msgstr "内部端å£"
++
++msgid "Internal zone"
++msgstr "内部区域"
++
++msgid "Limit log messages"
++msgstr "é™åˆ¶æ—¥å¿—ä¿¡æ¯"
++
++msgid "MSS clamping"
++msgstr "MSS钳制"
++
++msgid "Masquerading"
++msgstr "IP动æ€ä¼ªè£…"
++
++msgid "Match"
++msgstr "匹é…规则"
++
++msgid "Match ICMP type"
++msgstr "匹é…ICMP类型"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr "需è¦åŒ¹é…转å‘æµé‡åˆ°çš„目标端å£æˆ–端å£èŒƒå›´"
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr "需è¦åŒ¹é…入站æµé‡åˆ°çš„目标端å£æˆ–端å£èŒƒå›´"
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr "需è¦åŒ¹é…入站æµé‡çš„æºç«¯å£æˆ–端å£èŒƒå›´"
++
++msgid "Name"
++msgstr "åå­—"
++
++msgid "New SNAT rule"
++msgstr "新建SNAT规则"
++
++msgid "New forward rule"
++msgstr "新建转å‘规则"
++
++msgid "New input rule"
++msgstr "新建进入规则"
++
++msgid "New port forward"
++msgstr "新建端å£è½¬å‘"
++
++msgid "New source NAT"
++msgstr "新建Source NAT"
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "需è¦åŒ¹é…入站æµé‡çš„æºIP"
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "需è¦åŒ¹é…入站æµé‡çš„æºMACs(å¯ä»¥ä¸ºå¤šä¸ªï¼‰"
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr "需è¦åŒ¹é…入站æµé‡çš„æºIP或IP范围"
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr "需è¦åŒ¹é…入站æµé‡çš„æºç«¯å£æˆ–端å£èŒƒå›´"
++
++msgid "Open ports on router"
++msgstr "打开路由器端å£"
++
++msgid "Other..."
++msgstr "其它..."
++
++msgid "Output"
++msgstr "出站数æ®"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr "传递到iptablesçš„é¢å¤–å‚数。å°å¿ƒä½¿ç”¨ï¼"
++
++msgid "Port Forwards"
++msgstr "端å£è½¬å‘"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr "端å£è½¬å‘å…许æ¥è‡ªInternet的计算机访问ç§æœ‰å±€åŸŸç½‘内的计算机或æœåŠ¡"
++
++msgid "Protocol"
++msgstr "åè®®"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr "é‡å®šå‘匹é…的入站æµé‡åˆ°å†…部主机的端å£"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "é‡å®šå‘匹é…的入站æµé‡åˆ°çš„内部主机"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "è¦é™åˆ¶IP动æ€ä¼ªè£…的目标å­ç½‘"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "è¦é™åˆ¶IP动æ€ä¼ªè£…çš„æºå­ç½‘"
++
++msgid "Restrict to address family"
++msgstr "é™åˆ¶åœ°å€"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr "将匹é…æµé‡çš„æºåœ°å€æ”¹å†™æˆæŒ‡å®šåœ°å€"
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr "将匹é…æµé‡çš„æºç«¯å£æ”¹å†™æˆæŒ‡å®šç«¯å£ã€‚也å¯ä»¥ç•™ç©ºï¼Œåªæ”¹å†™IP地å€ã€‚"
++
++msgid "Rewrite to source %s"
++msgstr "æºåœ°å€æ”¹å†™æˆ %s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "æºåœ°å€æ”¹å†™æˆ %s, %s"
++
++msgid "SNAT IP address"
++msgstr "SNAT IP地å€"
++
++msgid "SNAT port"
++msgstr "SNAT 端å£"
++
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua #
++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
++#
++# msgid "Traffic Redirection"
++# msgstr ""
++#
++# msgid ""
++# "Traffic redirection allows you to change the destination address of "
++# "forwarded packets."
++# msgstr ""
++#
++# msgid "Overview"
++# msgstr ""
++#
++# msgid "Name"
++# msgstr ""
++#
++# msgid "Source zone"
++# msgstr ""
++#
++# msgid "Source MAC-address"
++# msgstr ""
++#
++# msgid "Source port"
++# msgstr ""
++#
++# msgid "Protocol"
++# msgstr ""
++#
++msgid "Source IP address"
++msgstr "æºIP地å€"
++
++msgid "Source MAC address"
++msgstr "æºMAC地å€"
++
++msgid "Source NAT"
++msgstr "Source NAT"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"Source NAT是一ç§ç‰¹æ®Šå½¢å¼çš„å°åŒ…伪装,它å…许精细的控制传出æµé‡çš„æºIP,例如,将"
++"多个WAN地å€æ˜ å°„到内部å­ç½‘。"
++
++msgid "Source address"
++msgstr "æºåœ°å€"
++
++msgid "Source port"
++msgstr "æºç«¯å£"
++
++msgid "Source zone"
++msgstr "æºåŒºåŸŸ"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr "防ç«å¢™æŠŠç½‘络接å£åˆ†ä¸ºä¸åŒçš„区域进行管ç†"
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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。"
++
++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 "
++"entry, such as matched source and destination hosts."
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"本节定义 %q 的通用属性, <em>入站数æ®</em> å’Œ <em>出站数æ®</em>规则用于设置数"
++"æ®åŒ…“进â€å’Œâ€œå‡ºâ€è·¯ç”±å™¨ï¼ˆæŸä¸ªæŽ¥å£ï¼‰é»˜è®¤çš„转å‘原则,<em>转å‘</em>规则用于特定(一"
++"个或多个)区域的ä¸åŒå­ç½‘之间的数æ®åŒ…转å‘。<em>覆盖网络</em>选择从属于这个区域"
++"的网络。"
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "到 %s at %s ä½äºŽ<var>本设备</var>"
++
++msgid "To %s in %s"
++msgstr "到 %s ä½äºŽ %s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "到 %s ä½äºŽ<var>本设备</var>"
++
++msgid "To %s, %s in %s"
++msgstr "到 %s, %s ä½äºŽ %s"
++
++msgid "To source IP"
++msgstr "到æºIP"
++
++msgid "To source port"
++msgstr "到æºç«¯å£"
++
++msgid "Traffic Rules"
++msgstr "通信规则"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"通信规则定义了ä¸åŒåŒºåŸŸé—´çš„æµé‡ä¼ é€ï¼Œä¾‹å¦‚:拒ç»ä¸€äº›ä¸»æœºä¹‹é—´çš„通信ã€æ‰“开到WANçš„"
++"端å£ã€‚"
++
++msgid "Via %s"
++msgstr "通过 %s"
++
++msgid "Via %s at %s"
++msgstr "通过 %s at %s"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr "你也å¯ä»¥é€‰æ‹©â€œ--自定义--â€æ¥å®šä¹‰å¤šä¸ªå议,在多个å议间需加空格。"
++
++msgid "Zone %q"
++msgstr "区域 %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "区域 ⇒ 转å‘"
++
++msgid "Zones"
++msgstr "区域"
++
++msgid "accept"
++msgstr "接å—"
++
++msgid "any"
++msgstr "所有"
++
++msgid "any host"
++msgstr "所有主机"
++
++msgid "any router IP"
++msgstr "所有路由地å€"
++
++msgid "any zone"
++msgstr "所有区域"
++
++msgid "don't track"
++msgstr "无动作"
++
++msgid "drop"
++msgstr "丢弃"
++
++msgid "reject"
++msgstr "æ‹’ç»"
++
++msgid "traffic"
++msgstr "交通"
++
++#~ msgid "Destination"
++#~ msgstr "目标"
++
++#~ msgid "Family"
++#~ msgstr "地å€é›†åˆ"
++
++#~ msgid "Forward to %s in %s"
++#~ msgstr "转å‘到 %s ä½äºŽ %s"
++
++#~ msgid "Forward to %s, %s in %s"
++#~ msgstr "转å‘到 %s, %s ä½äºŽ %s"
++
++#~ msgid "Source"
++#~ msgstr "æº"
++
++#~ msgid "Via"
++#~ msgstr "通过"
++
++#~ msgid "Disable"
++#~ msgstr "ç¦ç”¨"
++
++#~ msgid "Do not track forward"
++#~ msgstr "ä¸è¦è¿½è¸ªè½¬å‘"
++
++#~ msgid "Do not track input"
++#~ msgstr "ä¸è¦è¿½è¸ªè¿›å…¥"
++
++#~ msgid "IP"
++#~ msgstr "IP"
++
++#~ msgid "IP range"
++#~ msgstr "IP范围"
++
++#~ msgid "(optional)"
++#~ msgstr "(å¯é€‰ï¼‰"
++
++#~ msgid "Intended destination address"
++#~ msgstr "目标地å€"
++
++#~ msgid "Internal port (optional)"
++#~ msgstr "内部端å£ï¼ˆå¯é€‰ï¼‰"
++
++#~ msgid "Advanced Options"
++#~ msgstr "高级选项"
++
++#~ msgid "Advanced Rules"
++#~ msgstr "高级规则"
++
++#~ msgid ""
++#~ "Advanced rules let you customize the firewall to your needs. Only new "
++#~ "connections will be matched. Packets belonging to already open "
++#~ "connections are automatically allowed to pass the firewall."
++#~ msgstr ""
++#~ "高级规则å…许按需定制防ç«å¢™ã€‚此规则åªé™åˆ¶æ–°å»ºç«‹çš„连接,对于已建立链路的数æ®"
++#~ "包会自动å…许通过。"
++
++#~ msgid "Custom Rules (/etc/firewall.user)"
++#~ msgstr "自定义规则(/etc/firewall.user)"
++
++#~ msgid "Device"
++#~ msgstr "设备"
++
++#~ msgid ""
++#~ "For DNAT, match incoming traffic directed at the given destination ip "
++#~ "address. For SNAT rewrite the source address to the given address."
++#~ msgstr ""
++#~ "DNAT:将目标地å€è½¬æ¢ä¸ºæŒ‡å®šçš„IP地å€ï¼›SNAT:将æºåœ°å€è½¬æ¢ä¸ºæŒ‡å®šçš„IP地å€ã€‚"
++
++#~ msgid ""
++#~ "Match incoming traffic originating from the given source port or port "
++#~ "range on the client host"
++#~ msgstr "在客户端上,比较输入通é“与给定的æºç«¯å£æ˜¯å¦ä¸€è‡´ã€‚"
++
++#~ msgid "Overview"
++#~ msgstr "概览"
++
++#~ msgid "Port forwarding"
++#~ msgstr "端å£è½¬å‘"
++
++#~ msgid ""
++#~ "Port forwarding allows to provide network services in the internal "
++#~ "network to an external network."
++#~ msgstr "端å£è½¬å‘-å…许外部网络访问内部网络"
++
++#~ msgid "Redirection type"
++#~ msgstr "é‡å®šå‘类型"
++
++#~ msgid "Redirections"
++#~ msgstr "é‡å®šå‘"
++
++#~ msgid "Rules"
++#~ msgstr "规则"
++
++#~ msgid "Traffic Redirection"
++#~ msgstr "æµé‡é‡å®šå‘"
++
++#~ msgid ""
++#~ "Traffic redirection allows you to change the destination address of "
++#~ "forwarded packets."
++#~ msgstr "æµé‡é‡å®šå‘å…许你修改数æ®åŒ…转å‘地å€"
++
++#~ msgid "Zone"
++#~ msgstr "区"
++
++#~ msgid "MASQ"
++#~ msgstr "MASQ"
+diff --git a/feeds/luci/applications/luci-app-firewall/po/zh-tw/firewall.po b/feeds/luci/applications/luci-app-firewall/po/zh-tw/firewall.po
+new file mode 100644
+index 0000000..2240675
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-firewall/po/zh-tw/firewall.po
+@@ -0,0 +1,449 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-21 12:45+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "%s in %s"
++msgstr "%s 在 %s 之中"
++
++msgid "%s%s with %s"
++msgstr "%s%s åŒ %s"
++
++msgid "%s, %s in %s"
++msgstr " %s, %s 在 %s 之中"
++
++msgid "(Unnamed Entry)"
++msgstr "(未命åçš„é …ç›®)"
++
++msgid "(Unnamed Rule)"
++msgstr "(未命åçš„è¦å‰‡)"
++
++msgid "(Unnamed SNAT)"
++msgstr "(未命å的來æºNAT)"
++
++msgid "-- Please choose --"
++msgstr "-- è«‹é¸æ“‡ --"
++
++msgid "-- custom --"
++msgstr "-- 自訂 --"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>"
++msgstr "<var>%d</var> å°åŒ…數. æ¯<var>%s</var>"
++
++msgid "<var>%d</var> pkts. per <var>%s</var>, burst <var>%d</var> pkts."
++msgstr "<var>%d</var> å°åŒ…數. æ¯<var>%s</var>, çˆ†é‡ <var>%d</var> å°åŒ…數."
++
++msgid "<var>%s</var> and limit to %s"
++msgstr "<var>%s</var> 且é™åˆ¶åˆ° %s"
++
++msgid "Action"
++msgstr "動作"
++
++msgid "Add"
++msgstr "新增"
++
++msgid "Add and edit..."
++msgstr "新增並編輯..."
++
++msgid "Advanced Settings"
++msgstr "進階設定"
++
++msgid "Allow forward from <em>source zones</em>:"
++msgstr "å…許從<em>source zones</em>轉發:"
++
++msgid "Allow forward to <em>destination zones</em>:"
++msgstr "å…許從 <em>destination zones</em>轉發:"
++
++msgid "Any"
++msgstr "ä»»æ„"
++
++msgid "Covered networks"
++msgstr "已覆蓋的網路"
++
++msgid "Custom Rules"
++msgstr "自訂的è¦å‰‡ç¾¤"
++
++msgid ""
++"Custom rules allow you to execute arbritary iptables commands which are not "
++"otherwise covered by the firewall framework. The commands are executed after "
++"each firewall restart, right after the default ruleset has been loaded."
++msgstr ""
++"自定義è¦å‰‡å…許你執行這是ä¸ä»¥å…¶ä»–æ–¹å¼æ¶‰åŠçš„防ç«ç‰†æ¡†æž¶arbritaryçš„iptables命令。"
++"該命令是æ¯å€‹é˜²ç«ç‰†é‡å•Ÿå¾ŒåŸ·è¡Œï¼Œé»˜èªè¦å‰‡é›†å·²ç¶“加載之後。"
++
++msgid "Destination IP address"
++msgstr "目標IPä½å€"
++
++msgid "Destination address"
++msgstr "目標ä½å€"
++
++msgid "Destination port"
++msgstr "目地埠"
++
++msgid "Destination zone"
++msgstr "目標å€"
++
++msgid "Do not rewrite"
++msgstr "ä¸è¦æ”¹å¯«"
++
++msgid "Drop invalid packets"
++msgstr "丟棄ä¸æ­£ç¢ºçš„å°åŒ…群"
++
++msgid "Enable"
++msgstr "啟用"
++
++msgid "Enable NAT Loopback"
++msgstr "啓用NAT回傳"
++
++msgid "Enable SYN-flood protection"
++msgstr "啟用SYN-flood攻擊的ä¿è­·"
++
++msgid "Enable logging on this zone"
++msgstr "啟用日誌記錄這å€"
++
++msgid "External IP address"
++msgstr "外部IPä½å€"
++
++msgid "External port"
++msgstr "外部埠"
++
++msgid "External zone"
++msgstr "外部å€åŸŸ"
++
++msgid "Extra arguments"
++msgstr "é¡å¤–åƒæ•¸"
++
++msgid "Firewall"
++msgstr "防ç«ç‰†"
++
++msgid "Firewall - Custom Rules"
++msgstr "防ç«ç‰†-自訂è¦å‰‡"
++
++msgid "Firewall - Port Forwards"
++msgstr "防ç«ç‰†-埠轉發"
++
++msgid "Firewall - Traffic Rules"
++msgstr "防ç«ç‰†-æµé‡è¦å‰‡"
++
++msgid "Firewall - Zone Settings"
++msgstr "防ç«ç‰†-å€åŸŸè¨­å®š"
++
++msgid "Force connection tracking"
++msgstr "強制連線追蹤"
++
++msgid "Forward"
++msgstr "轉發"
++
++msgid "Forward to"
++msgstr "轉發到"
++
++msgid "From %s in %s"
++msgstr "從%s在%s"
++
++msgid "From %s in %s with source %s"
++msgstr "從%s在%s與來æºï¼…"
++
++msgid "From %s in %s with source %s and %s"
++msgstr "從%s在%s與來æºï¼…s和%s"
++
++msgid "General Settings"
++msgstr "一般設定"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 和 IPv6"
++
++msgid "IPv4 only"
++msgstr "僅有IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 only"
++msgstr "僅有IPv6"
++
++msgid "Input"
++msgstr "輸入"
++
++msgid "Inter-Zone Forwarding"
++msgstr "內部-å€è½‰ç™¼"
++
++msgid "Internal IP address"
++msgstr "內部的IPä½å€"
++
++msgid "Internal port"
++msgstr "內部的埠號"
++
++msgid "Internal zone"
++msgstr "內部å€"
++
++msgid "Limit log messages"
++msgstr "é™åˆ¶æ—¥èªŒè¨Šæ¯æ•¸"
++
++msgid "MSS clamping"
++msgstr "MSS調節"
++
++msgid "Masquerading"
++msgstr "å½è£"
++
++msgid "Match"
++msgstr "匹é…"
++
++msgid "Match ICMP type"
++msgstr "匹é…çš„ICMPåž‹æ…‹"
++
++msgid "Match forwarded traffic to the given destination port or port range."
++msgstr "匹é…已轉發的æµé‡åˆ°çµ¦å®šçš„目標埠或者範åœåŸ "
++
++msgid ""
++"Match incoming traffic directed at the given destination port or port range "
++"on this host"
++msgstr "匹é…輸入的æµé‡åˆ°ä¸»æ©Ÿä¸Šçµ¦å®šçš„目標埠或者範åœåŸ "
++
++msgid ""
++"Match incoming traffic originating from the given source port or port range "
++"on the client host."
++msgstr "從給定的來æºåŸ æˆ–範åœåŸ åœ¨å®¢æˆ¶ç«¯ä¸»æ©Ÿä¸Šçš„匹é…傳入æµé‡å§‹ç™¼ã€‚"
++
++msgid "Name"
++msgstr "å稱"
++
++msgid "New SNAT rule"
++msgstr "新的來æºNATè¦å‰‡"
++
++msgid "New forward rule"
++msgstr "新轉發è¦å‰‡"
++
++msgid "New input rule"
++msgstr "新輸入è¦å‰‡"
++
++msgid "New port forward"
++msgstr "新轉發埠"
++
++msgid "New source NAT"
++msgstr "新來æºåŸ "
++
++msgid "Only match incoming traffic directed at the given IP address."
++msgstr "僅匹é…傳入æµé‡äºˆçµ¦å®šçš„IP地å€."
++
++msgid "Only match incoming traffic from these MACs."
++msgstr "僅匹é…從這些MAC群的傳入æµé‡."
++
++msgid "Only match incoming traffic from this IP or range."
++msgstr "僅匹é…從這個IP或範åœIP給傳入æµé‡."
++
++msgid ""
++"Only match incoming traffic originating from the given source port or port "
++"range on the client host"
++msgstr "僅匹é…從給定的來æºåŸ æˆ–範åœåŸ çš„客戶端主機上給傳入æµé‡."
++
++msgid "Open ports on router"
++msgstr "開啟路由器上的埠號群"
++
++msgid "Other..."
++msgstr "其它..."
++
++msgid "Output"
++msgstr "輸出"
++
++msgid "Passes additional arguments to iptables. Use with care!"
++msgstr "通行é¡å¤–çš„åƒæ•¸åˆ° iptables上. 使用è¦å°å¿ƒ!"
++
++msgid "Port Forwards"
++msgstr "埠轉éž"
++
++msgid ""
++"Port forwarding allows remote computers on the Internet to connect to a "
++"specific computer or service within the private LAN."
++msgstr "埠轉發å…許é ç«¯ç¶²éš›ç¶²è·¯ä¸Šçš„電腦來連接到在ç§äººå€ç¶²å…§æŒ‡å®šçš„電腦或æœå‹™."
++
++msgid "Protocol"
++msgstr "å”定"
++
++msgid ""
++"Redirect matched incoming traffic to the given port on the internal host"
++msgstr "é‡å°Žå‘已匹é…傳入æµé‡åˆ°å…§éƒ¨ä¸»æ©Ÿä¸Šçš„指定埠"
++
++msgid "Redirect matched incoming traffic to the specified internal host"
++msgstr "é‡å°Žå‘已匹é…傳入æµé‡åˆ°å…§éƒ¨ä¸»æ©Ÿä¸Š"
++
++msgid "Restrict Masquerading to given destination subnets"
++msgstr "é™åˆ¶å½è£åˆ°å·²çµ¦äºˆçš„目標å­ç¶²è·¯"
++
++msgid "Restrict Masquerading to given source subnets"
++msgstr "é™åˆ¶å½è£åˆ°å·²çµ¦äºˆçš„來æºå­ç¶²è·¯"
++
++msgid "Restrict to address family"
++msgstr "é™åˆ¶çš„ä½å€ç¾¤"
++
++msgid "Rewrite matched traffic to the given address."
++msgstr "改寫已匹é…çš„æµé‡åˆ°çµ¦å®šçš„ä½å€."
++
++msgid ""
++"Rewrite matched traffic to the given source port. May be left empty to only "
++"rewrite the IP address."
++msgstr "改寫已匹é…çš„æµé‡åˆ°çµ¦å®šçš„來æºåŸ . 或許å¯ä»¥ä¿ç•™ç©ºç™½åˆ°å”¯ä¸€æ”¹å¯«çš„IPä½å€."
++
++msgid "Rewrite to source %s"
++msgstr "æ”¹å¯«åˆ°ä¾†æº %s"
++
++msgid "Rewrite to source %s, %s"
++msgstr "æ”¹å¯«åˆ°ä¾†æº %s, %s"
++
++msgid "SNAT IP address"
++msgstr "來æºNAT IP ä½å€"
++
++msgid "SNAT port"
++msgstr "來æºNAT IP 埠"
++
++msgid "Source IP address"
++msgstr "ä¾†æº IP ä½å€"
++
++msgid "Source MAC address"
++msgstr "ä¾†æº MAC硬體ä½å€"
++
++msgid "Source NAT"
++msgstr "來æºNAT"
++
++msgid ""
++"Source NAT is a specific form of masquerading which allows fine grained "
++"control over the source IP used for outgoing traffic, for example to map "
++"multiple WAN addresses to internal subnets."
++msgstr ""
++"來æºNAT是å½è£çš„一種特殊形å¼,它å…許å°è¼¸å‡ºæµé‡çš„來æºIP進行精細控制, 例如è¦å°æ˜ "
++"到多個WANä½å€åˆ°å…§éƒ¨å­ç¶²è·¯ç¾¤ä¸Š."
++
++msgid "Source address"
++msgstr "來æºä½å€"
++
++msgid "Source port"
++msgstr "來æºåŸ "
++
++msgid "Source zone"
++msgstr "來æºå€"
++
++msgid ""
++"The firewall creates zones over your network interfaces to control network "
++"traffic flow."
++msgstr "防ç«ç‰†å°ä½ çš„網路建立å€åŸŸä»¥ä¾¿æŽ§åˆ¶ç¶²è·¯æµå‘."
++
++msgid ""
++"The options below control the forwarding policies between this zone (%s) and "
++"other zones. <em>Destination zones</em> cover forwarded traffic "
++"<strong>originating from %q</strong>. <em>Source zones</em> match forwarded "
++"traffic from other zones <strong>targeted at %q</strong>. The forwarding "
++"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>."
++
++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 "
++"entry, such as matched source and destination hosts."
++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 "
++"leaving this zone while the <em>forward</em> option describes the policy for "
++"forwarded traffic between different networks within the zone. <em>Covered "
++"networks</em> specifies which available networks are members of this zone."
++msgstr ""
++"本節定義 %q 的通用屬性.在<em>輸入</em>å’Œ<em>輸出</em>é¸é …設置交通進出的默èªç­–"
++"ç•¥,而在<em>轉發</em>çš„é¸é …æ述在這å€åŸŸå…§ä¸åŒç¶²è·¯çš„轉發æµé‡.<em>已覆蓋的網路群"
++"</em>指定特定å€åŸŸæˆå“¡å¯ä»¥æ˜¯è¢«é‹ç”¨çš„網路."
++
++msgid "To %s at %s on <var>this device</var>"
++msgstr "到%s在上的<var>此設備</var>的%s的"
++
++msgid "To %s in %s"
++msgstr "到%s在%s"
++
++msgid "To %s on <var>this device</var>"
++msgstr "到%s上的<var>此設備</var>的"
++
++msgid "To %s, %s in %s"
++msgstr "到%s,%s的%s中"
++
++msgid "To source IP"
++msgstr "來æºIP"
++
++msgid "To source port"
++msgstr "來æºåŸ "
++
++msgid "Traffic Rules"
++msgstr "æµé‡è¦å‰‡"
++
++msgid ""
++"Traffic rules define policies for packets traveling between different zones, "
++"for example to reject traffic between certain hosts or to open WAN ports on "
++"the router."
++msgstr ""
++"æµé‡è¦å‰‡å®šç¾©åœ¨ä¸åŒå€åŸŸä¹‹é–“ç«„è¡Œå°åŒ…çš„ç­–ç•¥,例如è¦æ‹’絕特定主機群的æµé‡æˆ–者è¦æ‰“é–‹"
++"路由器上WAN埠。"
++
++msgid "Via %s"
++msgstr "通éŽï¼…sçš„"
++
++msgid "Via %s at %s"
++msgstr "通éŽï¼…s在%sçš„"
++
++msgid ""
++"You may specify multiple by selecting \"-- custom --\" and then entering "
++"protocols separated by space."
++msgstr "ä½ å¯ä»¥ä»¥é¸æ“‡\"-- 自訂 --\"並且打入由空格分開的å”定來åšå¤šé‡æŒ‡å®š."
++
++msgid "Zone %q"
++msgstr "å€åŸŸ %q"
++
++msgid "Zone ⇒ Forwardings"
++msgstr "å€åŸŸ ⇒ 轉發進行"
++
++msgid "Zones"
++msgstr "領域"
++
++msgid "accept"
++msgstr "接å—"
++
++msgid "any"
++msgstr "ä»»æ„"
++
++msgid "any host"
++msgstr "ä»»æ„埠"
++
++msgid "any router IP"
++msgstr "ä»»æ„路由器IP"
++
++msgid "any zone"
++msgstr "ä»»æ„å€"
++
++msgid "don't track"
++msgstr "ä¸è¦è¿½è¹¤"
++
++msgid "drop"
++msgstr "丟棄"
++
++msgid "reject"
++msgstr "拒絕"
++
++msgid "traffic"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-diagnostics/Makefile b/feeds/luci/applications/luci-app-freifunk-diagnostics/Makefile
+new file mode 100644
+index 0000000..d511684
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-diagnostics/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Tools for network diagnosis like traceroute and ping
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/controller/freifunk/diag.lua b/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/controller/freifunk/diag.lua
+new file mode 100644
+index 0000000..7bb4761
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/controller/freifunk/diag.lua
+@@ -0,0 +1,72 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2013 Manuel Munz <freifunk@somakoma.de>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.freifunk.diag", package.seeall)
++
++function index()
++ local uci = require("luci.model.uci").cursor()
++ local page
++ page = node("freifunk", "status", "diagnostics")
++ page.target = template("freifunk/diagnostics")
++ page.title = _("Diagnostics")
++ page.order = 60
++
++ page = entry({"freifunk", "status", "diag_ping"}, call("diag_ping"), nil)
++ page.leaf = true
++
++ page = entry({"freifunk", "status", "diag_nslookup"}, call("diag_nslookup"), nil)
++ page.leaf = true
++
++ page = entry({"freifunk", "status", "diag_traceroute"}, call("diag_traceroute"), nil)
++ page.leaf = true
++
++ page = entry({"freifunk", "status", "diag_ping6"}, call("diag_ping6"), nil)
++ page.leaf = true
++
++ page = entry({"freifunk", "status", "diag_traceroute6"}, call("diag_traceroute6"), nil)
++ page.leaf = true
++end
++
++function diag_command(cmd, addr)
++ if addr and addr:match("^[a-zA-Z0-9%-%.:_]+$") then
++ luci.http.prepare_content("text/plain")
++
++ local util = io.popen(cmd % addr)
++ if util then
++ while true do
++ local ln = util:read("*l")
++ if not ln then break end
++ luci.http.write(ln)
++ luci.http.write("\n")
++ end
++
++ util:close()
++ end
++
++ return
++ end
++
++ luci.http.status(500, "Bad address")
++end
++
++function diag_ping(addr)
++ diag_command("ping -c 5 -W 1 %q 2>&1", addr)
++end
++
++function diag_traceroute(addr)
++ diag_command("traceroute -q 1 -w 1 -n %q 2>&1", addr)
++end
++
++function diag_nslookup(addr)
++ diag_command("nslookup %q 2>&1", addr)
++end
++
++function diag_ping6(addr)
++ diag_command("ping6 -c 5 %q 2>&1", addr)
++end
++
++function diag_traceroute6(addr)
++ diag_command("traceroute6 -q 1 -w 2 -n %q 2>&1", addr)
++end
+diff --git a/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/view/freifunk/diagnostics.htm b/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/view/freifunk/diagnostics.htm
+new file mode 100644
+index 0000000..fe205d0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/view/freifunk/diagnostics.htm
+@@ -0,0 +1,111 @@
++<%#
++ Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<%
++local fs = require "nixio.fs"
++local has_ping6 = fs.access("/bin/ping6") or fs.access("/usr/bin/ping6")
++local has_traceroute6 = fs.access("/usr/bin/traceroute6")
++%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ var stxhr = new XHR();
++
++ function update_status(field, proto)
++ {
++ var tool = field.name;
++ var addr = field.value;
++ var protocol = proto ? "6" : "";
++
++ var legend = document.getElementById('diag-rc-legend');
++ var output = document.getElementById('diag-rc-output');
++
++ if (legend && output)
++ {
++ output.innerHTML =
++ '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' +
++ '<%:Waiting for command to complete...%>'
++ ;
++
++ legend.parentNode.style.display = 'block';
++ legend.style.display = 'inline';
++
++ stxhr.get('<%=url('freifunk/status')%>/diag_' + tool + protocol + '/' + addr, null,
++ function(x)
++ {
++ if (x.responseText)
++ {
++ legend.style.display = 'none';
++ output.innerHTML = String.format('<pre>%h</pre>', x.responseText);
++ }
++ else
++ {
++ legend.style.display = 'none';
++ output.innerHTML = '<span class="error"><%:Bad address specified!%></span>';
++ }
++ }
++ );
++ }
++ }
++//]]></script>
++
++<form method="post" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
++ <div class="cbi-map">
++ <h2 name="content"><%:Diagnostics%></h2>
++
++ <fieldset class="cbi-section">
++ <legend><%:Network Utilities%></legend>
++
++ <br />
++
++ <div style="width:30%; float:left">
++ <input style="margin: 5px 0" type="text" value="dev.openwrt.org" 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 style="width:33%; float:left">
++ <input style="margin: 5px 0" type="text" value="dev.openwrt.org" 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="openwrt.org" 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>
++
++ <fieldset class="cbi-section" style="display:none">
++ <legend id="diag-rc-legend"><%:Collecting data...%></legend>
++ <span id="diag-rc-output"></span>
++ </fieldset>
++</form>
++
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-freifunk-diagnostics/root/etc/uci-defaults/luci-freifunk-diagnostics b/feeds/luci/applications/luci-app-freifunk-diagnostics/root/etc/uci-defaults/luci-freifunk-diagnostics
+new file mode 100644
+index 0000000..963d8a4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-diagnostics/root/etc/uci-defaults/luci-freifunk-diagnostics
+@@ -0,0 +1,2 @@
++#!/bin/sh
++rm -f /tmp/luci-indexcache
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/Makefile b/feeds/luci/applications/luci-app-freifunk-policyrouting/Makefile
+new file mode 100644
+index 0000000..f60c2ea
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Policy routing for mesh traffic
++LUCI_DEPENDS:=+freifunk-policyrouting
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/controller/freifunk/policy-routing.lua b/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/controller/freifunk/policy-routing.lua
+new file mode 100644
+index 0000000..b550fc8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/controller/freifunk/policy-routing.lua
+@@ -0,0 +1,9 @@
++-- Copyright 2011 Manuel Munz <freifunk at somakoma de>
++-- Licensed to the public under the Apache License 2.0.
++
++module "luci.controller.freifunk.policy-routing"
++
++function index()
++ entry({"admin", "freifunk", "policyrouting"}, cbi("freifunk/policyrouting"),
++ _("Policy Routing"), 60)
++end
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/model/cbi/freifunk/policyrouting.lua b/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/model/cbi/freifunk/policyrouting.lua
+new file mode 100644
+index 0000000..b09c237
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/model/cbi/freifunk/policyrouting.lua
+@@ -0,0 +1,34 @@
++-- Copyright 2011 Manuel Munz <freifunk at somakoma de>
++-- Licensed to the public under the Apache License 2.0.
++
++local uci = require "luci.model.uci".cursor()
++
++m = Map("freifunk-policyrouting", translate("Policy Routing"), translate("These pages can be used to setup policy routing for certain firewall zones. "..
++ "This is useful if you need to use your own internet connection for yourself but you don't want to share it with others (thats why it can also be "..
++ "called 'Ego Mode'). Your own traffic is then sent via your internet connection while traffic originating from the mesh will use another gateway in the mesh. "))
++m:chain("network")
++
++c = m:section(NamedSection, "pr", "settings", "")
++
++local pr = c:option(Flag, "enable", translate("Enable Policy Routing"))
++pr.rmempty = false
++
++local strict = c:option(Flag, "strict", translate("Strict Filtering"), translate("If no default route is received from the mesh network then traffic which belongs to "..
++ "the selected firewall zones is routed via your internet connection as a fallback. If you do not want this and instead block that traffic then you should "..
++ "select this option."))
++strict.rmempty = false
++
++local fallback = c:option(Flag, "fallback", translate("Fallback to mesh"),
++ translate("If your own gateway is not available then fallback to the mesh default gateway."))
++strict.rmempty = false
++
++local zones = c:option(MultiValue, "zones", translate("Firewall zones"), translate("All traffic from interfaces belonging to these zones will be sent via "..
++ "a gateway in the mesh network."))
++uci:foreach("firewall", "zone", function(section)
++ local name = section.name
++ if not (name == "wan") then
++ zones:value(name)
++ end
++end)
++
++return m
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ca/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ca/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..c1d96e0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ca/freifunk-policyrouting.po
+@@ -0,0 +1,62 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2014-06-01 23:52+0200\n"
++"PO-Revision-Date: 2014-07-03 20:37+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++"Tot el trànsit des de interfícies pertinent a aquestes zones s'enviarà via "
++"una passarel·la en la xarxa en malla."
++
++msgid "Enable Policy Routing"
++msgstr "Habilita el encaminament per política"
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr "Zones de tallafocs"
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr "Encaminament per política"
++
++msgid "Strict Filtering"
++msgstr "Filtració estricta"
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
++"Aquestes pàgines es poden utilitzar per configurar encaminament en certes "
++"zones de tallafocs. Això és útil si necessiteu utilitzar la vostra pròpia "
++"connexió a Internet per a vós mateix però no voleu compartir-la amb altres "
++"(és per això que també es diu 'Mode egoista'). El vostre propi trànsit "
++"llavors s'envia via la vostra connexió d'Internet mentre el trànsit "
++"originant en malla utilitzarà altra passarel·la en malla."
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/cs/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/cs/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..4ec9f8d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/cs/freifunk-policyrouting.po
+@@ -0,0 +1,52 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-26 20:27+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr "Povolit politiku směrování"
++
++msgid "Fallback to mesh"
++msgstr "Fallback do mesh"
++
++msgid "Firewall zones"
++msgstr "Zóny firewallu"
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr "Politika směrování"
++
++msgid "Strict Filtering"
++msgstr "Striktní filtrování"
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/de/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/de/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..bb24f61
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/de/freifunk-policyrouting.po
+@@ -0,0 +1,67 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: \n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2012-11-21 20:53+0200\n"
++"Last-Translator: Jo-Philipp <jow@openwrt.org>\n"
++"Language-Team: \n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++"Traffic der aus diesen Zonen kommt wird über ein Internetgateway im Mesh "
++"weitergeleitet."
++
++msgid "Enable Policy Routing"
++msgstr "Policy Routing aktivieren"
++
++msgid "Fallback to mesh"
++msgstr "Auf Mesh zurückfallen"
++
++msgid "Firewall zones"
++msgstr "Firewallzonen"
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++"Falls im Mesh kein anderer Internetgateway verfügbar ist, dann wird Traffic "
++"aus den ausgewählten Zonen als Fallback über die Internetverbindung dieses "
++"Routers geleitet. Wenn das nicht gewünscht ist und dieser Traffic dann "
++"stattdessen geblockt werden soll, dann aktiviere diese Option."
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++"Wenn das eigene lokale Gateway nicht verfügbar ist, dann nutze das aktuelle "
++"Mesh-Default-Gateway."
++
++msgid "Policy Routing"
++msgstr "Policy Routing"
++
++msgid "Strict Filtering"
++msgstr "Strenges Filtern"
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
++"Auf diesen Seiten kann Policy Routing für bestimmte Firewallzonen aktiviert "
++"werden. Dies ist z.B. nützlich, wenn du deinen eigenen Internetverkehr über "
++"deine eigene Internetverbindung routen aber diese nicht mit anderen teilen "
++"willst ('Mein Gateway für mich allein'). Eigener Traffic wird dann über die "
++"eigene Internetverbindung geschickt während Traffic aus den ausgewählten "
++"Firewallzonen über einen anderen Gateway im Mesh geleitet wird."
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/el/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/el/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..3c9a17e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/el/freifunk-policyrouting.po
+@@ -0,0 +1,39 @@
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/en/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/en/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..3c9a17e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/en/freifunk-policyrouting.po
+@@ -0,0 +1,39 @@
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/es/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/es/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..8af3458
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/es/freifunk-policyrouting.po
+@@ -0,0 +1,66 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-08-22 22:34+0200\n"
++"PO-Revision-Date: 2012-10-14 22:49+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++"Todo el tráfico desde interfaces de estas zonas se enviará por una pasarela "
++"de la red mesh."
++
++msgid "Enable Policy Routing"
++msgstr "Activar política de enrutado"
++
++msgid "Fallback to mesh"
++msgstr "Si falla usar mesh"
++
++msgid "Firewall zones"
++msgstr "Zonas del cortafuegos"
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++"Si no se recibe una ruta por defecto de la red mesh el tráfico de las zonas "
++"de cortafuegos seleccionado se enviará por esta conexión de red. Si no desea "
++"esto marque esta opción para bloquearlo."
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++"Si su pasarela no está disponible cambie a la pasarela por defecto de la "
++"mesh."
++
++msgid "Policy Routing"
++msgstr "Política de enrutamiento"
++
++msgid "Strict Filtering"
++msgstr "Filtrado estricto"
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
++"Estas páginas se pueden usar para definir la política de enrutamiento para "
++"ciertas zonas del cortafuegos. Esto es útil si quiere usar su conexión a "
++"internet pero no quiere compartirla con otros (por eso se llama \"Modo "
++"egoísta\"). Su propio tráfico se enviará por su conexión internet mientras "
++"que el tráfico del mes usará otra pasarela en la mesh."
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/fr/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/fr/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..3c9a17e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/fr/freifunk-policyrouting.po
+@@ -0,0 +1,39 @@
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/he/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/he/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..8d83098
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/he/freifunk-policyrouting.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/hu/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/hu/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..8d83098
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/hu/freifunk-policyrouting.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/it/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/it/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..61ac6c0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/it/freifunk-policyrouting.po
+@@ -0,0 +1,69 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-02-09 20:22+0200\n"
++"PO-Revision-Date: 2013-02-09 20:27+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++"Tutto il traffico dalle interfacce appartenenti a tali zone saranno inviate "
++"tramite un gateway nella rete mesh."
++
++msgid "Enable Policy Routing"
++msgstr "Attiva la politica di instradamento"
++
++msgid "Fallback to mesh"
++msgstr "Posizione di sicurezza in mesh"
++
++msgid "Firewall zones"
++msgstr "Zone Firewall"
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++"Se nessun percorso predefinito viene ricevuto dalla rete mesh, il traffico "
++"che fa parte delle zone del firewall selezionato verranno instradate tramite "
++"la connessione a Internet come ripiego. Se non si desidera questo invece "
++"di bloccare il traffico è necessario selezionare questa opzione."
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++"Se il proprio gateway non è disponibile, ripiego per il gateway predefinito "
++"mash."
++
++msgid "Policy Routing"
++msgstr "Politica di Instradamento"
++
++msgid "Strict Filtering"
++msgstr "Livello massimo di filtraggio"
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
++"Queste pagine possono essere utilizzati per impostare la politica di "
++"instradamento per le zone del firewall determinati. Questo è utile se è "
++"necessario utilizzare la vostra connessione internet per de stesso, ma non "
++"si desidera condividere con gli altri (questo è il motivo per cui può anche "
++"essere chiamato 'Modalità Ego'). Il tuo traffico viene poi inviato tramite "
++"la tua connessione a Internet mentre il traffico proveniente dalla rete "
++"utilizzerà un altro gateway in mesh."
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ja/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ja/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..3c9a17e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ja/freifunk-policyrouting.po
+@@ -0,0 +1,39 @@
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ms/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ms/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..3c9a17e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ms/freifunk-policyrouting.po
+@@ -0,0 +1,39 @@
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/no/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/no/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..3c9a17e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/no/freifunk-policyrouting.po
+@@ -0,0 +1,39 @@
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pl/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pl/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..bcb4492
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pl/freifunk-policyrouting.po
+@@ -0,0 +1,69 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-08-24 07:01+0200\n"
++"PO-Revision-Date: 2012-08-24 08:02+0200\n"
++"Last-Translator: goodgod261 <goodgod261@wp.pl>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++"Cały ruch sieciowy z interfejsów należących do tych stref będzie wysyłany "
++"przez bramÄ™ w sieci mesh."
++
++msgid "Enable Policy Routing"
++msgstr "WÅ‚Ä…cz politykÄ™ trasowania (routingu)"
++
++msgid "Fallback to mesh"
++msgstr "Fallback do mesh"
++
++msgid "Firewall zones"
++msgstr "Strefy firewalla"
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++"Jeśli nie otrzymano domyślnej trasy z sieci mesh, ruch sieciowy należący do "
++"wybranej strefy firewalla jest trasowany przez Twoje połączenie z internetem "
++"jako fallback. Jeśli tego nie chcesz i zamiast tego chciałbyś blokować taki "
++"ruch sieciowy, powinieneś zaznaczyć tę opcję."
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++"Jeśli Twoja własna brama nie jest dostępna, wykonaj fallback do domyślnej "
++"bramy sieci mesh."
++
++msgid "Policy Routing"
++msgstr "Polityka trasowania (routingu)"
++
++msgid "Strict Filtering"
++msgstr "Ścisłe filtrowanie"
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
++"Te strony mogą zostać użyte do ustawienia polityki trasowania (routingu) dla "
++"wybranych stref firewalla. Jest to użyteczne jeśli chcesz używać swojego "
++"połączenia z internetem sam i nie chcesz dzielić się nim z innymi (stąd "
++"alternatywna nazwa \"tryb ego\"). Twój własny ruch sieciowy jest wysyłany "
++"przez Twoje połączenie, zaś ruch pochodzący z sieci mesh będzie używać innej "
++"bramy w sieci."
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt-br/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt-br/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..4aac8ca
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt-br/freifunk-policyrouting.po
+@@ -0,0 +1,68 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-10-12 09:13+0200\n"
++"PO-Revision-Date: 2012-09-27 00:40+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++"Todo o tráfego das interfaces pertencentes a estas zonas será enviado "
++"através de um roteador padrão na rede em malha."
++
++msgid "Enable Policy Routing"
++msgstr "Habilitar a Política de Roteamento"
++
++msgid "Fallback to mesh"
++msgstr "Se falhar, usar a malha"
++
++msgid "Firewall zones"
++msgstr "Zonas do firewall"
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++"Se nenhuma rota padrão for recebida da rede em malha, então o tráfego que "
++"pertencer a zona de firewall selecionada através da sua conexão internet "
++"como solução de contorno. Se você não quer isto e, ao contrário, deseja "
++"bloquear este tráfego, então você deve selecionar esta opção."
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++"Se o seu roteador não estiver disponível, usar como alternativa o roteador "
++"padrão da malha."
++
++msgid "Policy Routing"
++msgstr "Política de Roteamento"
++
++msgid "Strict Filtering"
++msgstr "Filtragem Estrita"
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
++"Estas páginas podem ser usadas para configurar a política de roteamento para "
++"certas zonas de firewall. Isto pode ser útil se você precisa usar sua "
++"própria conexão com a internet para si e não quer compartilhá-la com outros "
++"(é por isto que isto pode ser chamado de 'Modo Egocêntrico'). Seu próprio "
++"tráfego é enviado através de sua conexão com a internet enquanto o tráfego "
++"originado da rede em malha irá usar outro roteador na malha."
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..41a6b21
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt/freifunk-policyrouting.po
+@@ -0,0 +1,56 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-05-31 11:53+0200\n"
++"PO-Revision-Date: 2013-05-31 11:54+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++"Todo o trafego das interfaces que pertencem a estas zonas será enviado pela "
++"gateway de rede."
++
++msgid "Enable Policy Routing"
++msgstr "Ativar a Politica de Routing"
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr "Zonas da Firewall"
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr "Política de Routing"
++
++msgid "Strict Filtering"
++msgstr "Filtragem Estrita"
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ro/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ro/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..3386101
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ro/freifunk-policyrouting.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-28 19:28+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr "Zone de firewall"
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ru/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ru/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..a4ba704
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ru/freifunk-policyrouting.po
+@@ -0,0 +1,70 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: freifunk-policyrouting\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-07-25 12:26+0200\n"
++"PO-Revision-Date: 2012-08-15 15:27+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++"ВеÑÑŒ трафик от интерфейÑов, принадлежащих Ñтим зонам, будет поÑлан через "
++"шлюз в ÑчеиÑтой Ñети."
++
++msgid "Enable Policy Routing"
++msgstr "Разрешить политику маршрутизации"
++
++#, fuzzy
++msgid "Fallback to mesh"
++msgstr "Откат к ÑчеиÑтой Ñети"
++
++msgid "Firewall zones"
++msgstr "Зоны межÑетевого Ñкрана"
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++"Трафик, принадлежащий выбранным зонам межÑетевого Ñкрана, маршрутизируетÑÑ "
++"через ваше интернет-Ñоединение, еÑли маршрут по умолчанию не был получен из "
++"ÑчеиÑтой Ñети. ЕÑли Ð²Ð°Ñ Ñто не уÑтраивает, то выберите Ñту опцию и данный "
++"трафик будет заблокирован."
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++"ЕÑли ваш шлюз не доÑтупен, откатитьÑÑ Ðº иÑпользованию шлюза ÑчеиÑтой Ñети по "
++"умолчанию."
++
++msgid "Policy Routing"
++msgstr "Политика маршрутизации"
++
++msgid "Strict Filtering"
++msgstr "Ð¡Ñ‚Ñ€Ð¾Ð³Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ"
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
++"Ðа Ñтих Ñтраницах Ð’Ñ‹ можете наÑтроить политику маршрутизации Ð´Ð»Ñ "
++"определённых зон межÑетевого Ñкрана. Это может быть полезно, еÑли вы хотите "
++"иÑпользовать интернет-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ ÑебÑ. Ваш трафик в Ñтом Ñлучае "
++"будет иÑпользовать только ваше интернет-Ñоединение, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº трафик "
++"ÑчеиÑтой Ñети будет иÑпользовать другой шлюз."
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sk/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sk/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..b1a7810
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sk/freifunk-policyrouting.po
+@@ -0,0 +1,49 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sv/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sv/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..1310afa
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sv/freifunk-policyrouting.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/templates/freifunk-policyrouting.pot b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/templates/freifunk-policyrouting.pot
+new file mode 100644
+index 0000000..b4c35c1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/templates/freifunk-policyrouting.pot
+@@ -0,0 +1,42 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/tr/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/tr/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..af1616f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/tr/freifunk-policyrouting.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \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"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/uk/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/uk/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..e4cc687
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/uk/freifunk-policyrouting.po
+@@ -0,0 +1,72 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-13 16:14+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++
++#, fuzzy
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++"ВеÑÑŒ трафік з інтерфейÑів, прив'Ñзаних до цих зон буде відправлений через "
++"шлюз в комірчаÑÑ‚Ñ– мережі."
++
++#, fuzzy
++msgid "Enable Policy Routing"
++msgstr "Ðктивувати політику маршрутизації"
++
++msgid "Fallback to mesh"
++msgstr ""
++
++#, fuzzy
++msgid "Firewall zones"
++msgstr "Зона фаєрволу"
++
++#, fuzzy
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++"Якщо маршрут типово не буде отриманий з Ñітки мережі, то трафік, Ñкий "
++"належить до вибраної зони фаєрволу прÑмує через ваше інтернет-з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð² "
++"ÑкоÑÑ‚Ñ– запаÑного варіанту. Якщо ви не хочете цього, а заміÑÑ‚ÑŒ цього, що "
++"блокувати трафік, то ви повинні вибрати цю опцію."
++
++#, fuzzy
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++"Якщо ваш шлюз недоÑтупний, то відбуваєтьÑÑ Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð´Ð¾ оÑновного шлюзу "
++"Ñітки."
++
++msgid "Policy Routing"
++msgstr "Політика маршрутизації"
++
++msgid "Strict Filtering"
++msgstr "ЖорÑтка фільтраціÑ"
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
++"Ці Ñторінки можна викориÑтовувати Ð´Ð»Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸ маршрутизації "
++"Ð´Ð»Ñ Ð¿ÐµÐ²Ð½Ð¸Ñ… зон фаєрволу. Це кориÑно, Ñкщо вам потрібно викориÑтовувати Ñвоє "
++"влаÑне інтернет-з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñебе, Ñ– ви не хочете ділитиÑÑ Ð½Ð¸Ð¼ з іншими "
++"людьми (оÑÑŒ чому воно також називатиÑÑ 'Его режим '). Ваш влаÑний трафік "
++"потім відправлений через ваше інтернет-з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð² той Ñ‡Ð°Ñ Ñк трафік, "
++"витікаючий із мережі буде викориÑтовувати інший шлюз у мережі."
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/vi/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/vi/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..3c9a17e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/vi/freifunk-policyrouting.po
+@@ -0,0 +1,39 @@
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-cn/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-cn/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..ff0aabc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-cn/freifunk-policyrouting.po
+@@ -0,0 +1,57 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-10-09 03:50+0200\n"
++"PO-Revision-Date: 2013-10-09 04:04+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr "所有æµé‡å±žäºŽè¿™ä¸ªmesh网络区域的数æ®æµéƒ½å°†é€šè¿‡ç½‘å…³æ¥å‘é€ã€‚"
++
++msgid "Enable Policy Routing"
++msgstr "å¯ç”¨ç­–略路由"
++
++msgid "Fallback to mesh"
++msgstr "meshåŽå¤‡"
++
++msgid "Firewall zones"
++msgstr "防ç«å¢™åŒºåŸŸ"
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++"如果没有缺çœçš„mesh网络路由,则使用属于防ç«å¢™åŒºåŸŸå†…çš„Internet连接作为备用路由。如果你ä¸æƒ³è¦è¿™ä¸ªï¼Œè€Œæ˜¯é˜»æ­¢è¯¥æµé‡ï¼Œé‚£ä¹ˆä½ åº”该选择此选项。"
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr "如果您自己的网关ä¸å¯ç”¨ï¼Œåˆ™é€€å›žåˆ°mesh默认网关。"
++
++msgid "Policy Routing"
++msgstr "策略路由"
++
++msgid "Strict Filtering"
++msgstr "严格过滤"
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
++"这些页é¢ç”¨äºŽæŸäº›é˜²ç«å¢™åŒºåŸŸè®¾ç½®ç­–略路由。这是éžå¸¸æœ‰ç”¨çš„,如果你需è¦è‡ªå·±ä½¿ç”¨è‡ªå·±çš„互è”网连接,但你ä¸æƒ³æŠŠå®ƒåˆ†äº«ç»™å…¶ä»–人(这就是为什么它也被称为“自我模å¼'"
++")。你自己的æµé‡ï¼Œé€šè¿‡ä½ çš„互è”网连接å‘é€ï¼Œè€Œmesh中的数æ®åŒ…将使用mesh中å¦å¤–的网关。"
+diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-tw/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-tw/freifunk-policyrouting.po
+new file mode 100644
+index 0000000..58efa74
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-tw/freifunk-policyrouting.po
+@@ -0,0 +1,48 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid ""
++"All traffic from interfaces belonging to these zones will be sent via a "
++"gateway in the mesh network."
++msgstr ""
++
++msgid "Enable Policy Routing"
++msgstr ""
++
++msgid "Fallback to mesh"
++msgstr ""
++
++msgid "Firewall zones"
++msgstr ""
++
++msgid ""
++"If no default route is received from the mesh network then traffic which "
++"belongs to the selected firewall zones is routed via your internet "
++"connection as a fallback. If you do not want this and instead block that "
++"traffic then you should select this option."
++msgstr ""
++
++msgid ""
++"If your own gateway is not available then fallback to the mesh default "
++"gateway."
++msgstr ""
++
++msgid "Policy Routing"
++msgstr ""
++
++msgid "Strict Filtering"
++msgstr ""
++
++msgid ""
++"These pages can be used to setup policy routing for certain firewall zones. "
++"This is useful if you need to use your own internet connection for yourself "
++"but you don't want to share it with others (thats why it can also be called "
++"'Ego Mode'). Your own traffic is then sent via your internet connection "
++"while traffic originating from the mesh will use another gateway in the mesh."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/Makefile b/feeds/luci/applications/luci-app-freifunk-widgets/Makefile
+new file mode 100644
+index 0000000..d748827
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Widgets for the Freifunk index page
++LUCI_DEPENDS:=+luci-mod-freifunk
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/controller/freifunk/widgets.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/controller/freifunk/widgets.lua
+new file mode 100644
+index 0000000..37104fc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/controller/freifunk/widgets.lua
+@@ -0,0 +1,35 @@
++-- Copyright 2012 Manuel Munz <freifunk at somakoma de>
++-- Licensed to the public under the Apache License 2.0.
++
++local require = require
++module "luci.controller.freifunk.widgets"
++
++
++function index()
++
++ local page = node("admin", "freifunk", "widgets")
++ page.target = cbi("freifunk/widgets/widgets_overview")
++ page.title = _("Widgets")
++ page.i18n = "widgets"
++ page.order = 30
++
++ local page = node("admin", "freifunk", "widgets", "widget")
++ page.target = cbi("freifunk/widgets/widget")
++ page.leaf = true
++
++ local page = node("freifunk", "search_redirect")
++ page.target = call("search_redirect")
++ page.leaf = true
++end
++
++function search_redirect()
++ local dsp = require "luci.dispatcher"
++ local http = require "luci.http"
++ local engine = http.formvalue("engine")
++ local searchterms = http.formvalue("searchterms") or ""
++ if engine then
++ http.redirect(engine .. searchterms)
++ else
++ http.redirect(dsp.build_url())
++ end
++end
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/heightwidth.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/heightwidth.lua
+new file mode 100644
+index 0000000..fc23f4b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/heightwidth.lua
+@@ -0,0 +1,16 @@
++-- Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section = ...
++
++local width = wdg:option(Value, "width", translate("Width"))
++width.rmempty = true
++
++--[[
++local height = wdg:option(Value, "height", translate("Height"))
++height.rmempty = true
++height.optional = true
++]]--
++
++local pr = wdg:option(Value, "paddingright", translate("Padding right"))
++pr.rmempty = true
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/html.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/html.lua
+new file mode 100644
+index 0000000..adeffa9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/html.lua
+@@ -0,0 +1,31 @@
++-- Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section = ...
++local utl = require "luci.util"
++local fs = require "nixio.fs"
++local file = "/usr/share/customtext/" .. arg[1] .. ".html"
++
++local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua")
++if form then
++ setfenv(form, getfenv(1))(m, wdg)
++end
++
++t = wdg:option(TextValue, "_text")
++t.rmempty = true
++t.rows = 20
++
++
++function t.cfgvalue()
++ return fs.readfile(file) or ""
++end
++
++function t.write(self, section, value)
++ return fs.writefile(file, value)
++end
++
++function t.remove(self, section)
++ return fs.unlink(file)
++end
++
++
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/iframe.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/iframe.lua
+new file mode 100644
+index 0000000..68ab06d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/iframe.lua
+@@ -0,0 +1,13 @@
++-- Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section = ...
++local utl = require "luci.util"
++
++local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua")
++if form then
++ setfenv(form, getfenv(1))(m, wdg)
++end
++
++local url = wdg:option(Value, "url", translate("URL"))
++url.default = "http://www.freifunk.net"
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/rssfeed.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/rssfeed.lua
+new file mode 100644
+index 0000000..68fa3be
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/rssfeed.lua
+@@ -0,0 +1,25 @@
++-- Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section = ...
++local utl = require "luci.util"
++
++local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua")
++if form then
++ setfenv(form, getfenv(1))(m, wdg)
++end
++
++local url = wdg:option(Value, "url", translate("URL"))
++url.default = "http://global.freifunk.net/rss/all/rss.xml"
++
++local max = wdg:option(Value, "max", translate("Maximal entries to show"))
++max.rmempty = true
++max.default = "10"
++max.datatype = "integer"
++
++local cache = wdg:option(Value, "cache", translate("Cache Time"), translate("Cache downloaded feed for that many seconds."))
++cache.rmempty = true
++cache.default = "3600"
++cache.datatype = "integer"
++
++
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/search.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/search.lua
+new file mode 100644
+index 0000000..a027489
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/search.lua
+@@ -0,0 +1,15 @@
++-- Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section = ...
++local utl = require "luci.util"
++
++local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua")
++if form then
++ setfenv(form, getfenv(1))(m, wdg)
++end
++
++local engine = wdg:option(DynamicList, "engine", translate("Search Engine"),
++ translate("Use the form Name|URL, where URL must be a full URL to the search engine " ..
++ "including the query GET parameter, e.g. 'Google|http://www.google.de/search?q='")
++ )
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widget.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widget.lua
+new file mode 100644
+index 0000000..7b6cd89
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widget.lua
+@@ -0,0 +1,37 @@
++-- Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local uci = require "luci.model.uci".cursor()
++local dsp = require "luci.dispatcher"
++local utl = require "luci.util"
++local widget = uci:get("freifunk-widgets", arg[1], "template")
++local title = uci:get("freifunk-widgets", arg[1], "title") or ""
++
++m = Map("freifunk-widgets", translate("Widget"))
++m.redirect = luci.dispatcher.build_url("admin/freifunk/widgets")
++
++if not arg[1] or m.uci:get("freifunk-widgets", arg[1]) ~= "widget" then
++ luci.http.redirect(m.redirect)
++ return
++end
++
++wdg = m:section(NamedSection, arg[1], "widget", translate("Widget") .. " " .. title)
++wdg.anonymous = true
++wdg.addremove = false
++
++local en = wdg:option(Flag, "enabled", translate("Enable"))
++en.rmempty = false
++
++local title = wdg:option(Value, "title", translate("Title"))
++title.rmempty = true
++
++local form = loadfile(
++ utl.libpath() .. "/model/cbi/freifunk/widgets/%s.lua" % widget
++)
++
++if form then
++ setfenv(form, getfenv(1))(m, wdg)
++end
++
++return m
++
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widgets_overview.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widgets_overview.lua
+new file mode 100644
+index 0000000..076d8e0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widgets_overview.lua
+@@ -0,0 +1,68 @@
++-- Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local uci = require "luci.model.uci".cursor()
++local fs = require "nixio.fs"
++local utl = require "luci.util"
++m = Map("freifunk-widgets", translate("Widgets"),
++ translate("Configure installed widgets."))
++
++wdg = m:section(TypedSection, "widget", translate("Widgets"))
++wdg.addremove = true
++wdg.extedit = luci.dispatcher.build_url("admin/freifunk/widgets/widget/%s")
++wdg.template = "cbi/tblsection"
++wdg.sortable = true
++
++--[[
++function wdg.create(...)
++ local sid = TypedSection.create(...)
++ luci.http.redirect(wdg.extedit % sid)
++end
++]]--
++
++local en = wdg:option(Flag, "enabled", translate("Enable"))
++en.rmempty = false
++--en.default = "0"
++function en.cfgvalue(self, section)
++ return Flag.cfgvalue(self, section) or "0"
++end
++
++local tmpl = wdg:option(ListValue, "template", translate("Template"))
++local file
++for file in fs.dir("/usr/lib/lua/luci/view/freifunk/widgets/") do
++ if file ~= "." and file ~= ".." then
++ tmpl:value(file)
++ end
++end
++
++local title = wdg:option(Value, "title", translate("Title"))
++title.rmempty = true
++
++local width = wdg:option(Value, "width", translate("Width"))
++width.rmempty = true
++
++local height = wdg:option(Value, "height", translate("Height"))
++height.rmempty = true
++
++local pr = wdg:option(Value, "paddingright", translate("Padding right"))
++pr.rmempty = true
++
++function m.on_commit(self)
++ -- clean custom text files whose config has been deleted
++ local dir = "/usr/share/customtext/"
++ local active = {}
++ uci:foreach("freifunk-widgets", "widget", function(s)
++ if s["template"] == "html" then
++ table.insert(active, s[".name"])
++ end
++ end )
++ local file
++ for file in fs.dir(dir) do
++ local filename = string.gsub(file, ".html", "")
++ if not utl.contains(active, filename) then
++ fs.unlink(dir .. file)
++ end
++ end
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/clear/main.htm b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/clear/main.htm
+new file mode 100644
+index 0000000..df01839
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/clear/main.htm
+@@ -0,0 +1,15 @@
++<%
++--[[
++LuCI - Lua Configuration Interface
++
++Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++]]--
++%>
++<div style="clear:both"></div>
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/html/main.htm b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/html/main.htm
+new file mode 100644
+index 0000000..46e063b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/html/main.htm
+@@ -0,0 +1,42 @@
++<%
++--[[
++LuCI - Lua Configuration Interface
++
++Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++]]--
++
++--local utl = require "luci.util"
++local fs = require "nixio.fs"
++local title = data.title
++local name = data['.name']
++local file = "/usr/share/customtext/" .. name .. ".html"
++local text = fs.readfile(file)
++local width = data.width or "100%"
++local pr = data.paddingright or "0"
++if type(width) == "number" then
++ width = width .. "px"
++end
++
++%>
++
++<div id="<%=name%>" style="width:<%=width%>;float:left">
++ <div style="padding-right: <%=pr%>">
++ <% if title then %>
++ <h2><%=title%></h2>
++ <% end %>
++ <% if text then %>
++ <%=text%>
++ <%else%>
++ <%:Could not load the custom text from%> "<%=file%>!"
++ <%end%>
++
++ <%=data.text%>
++ </div>
++</div>
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/iframe/main.htm b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/iframe/main.htm
+new file mode 100644
+index 0000000..f0d89d7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/iframe/main.htm
+@@ -0,0 +1,45 @@
++<%
++--[[
++LuCI - Lua Configuration Interface
++
++Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++]]--
++
++local url = data['url']
++local name = data['.name']
++local title = data['title'] or "No title set"
++local height = data['height'] or "400px"
++if type(height) == "number" then
++ height = height .. "px"
++end
++local width = data['width'] or "100%"
++if type(width) == "number" then
++ width = width .. "px"
++end
++
++%>
++
++<div id="<%=name%>" style="width:<%=width%>;float:left;">
++<h2><%=title%></h2>
++
++<% if not url then %>
++
++<%:No url set.%>
++
++<% else %>
++<div style="height:<%=height%>;min-height:<%=height%>">
++<object type="text/html" data="<%=url%>" width="100%" height="<%=height%>" name="widget_<%=name%>" id="widget_<%=name%>">
++<param name="src" value="<%=url%>" />
++<%:Sorry, your browser doesn't support the object tag and cannot display this page:%><br />
++<a href="<%=url%>"><%=url%></a>
++</object>
++</div>
++</div>
++<%end%>
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/rssfeed/main.htm b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/rssfeed/main.htm
+new file mode 100644
+index 0000000..ff81ba8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/rssfeed/main.htm
+@@ -0,0 +1,84 @@
++<%
++--[[
++LuCI - Lua Configuration Interface
++
++Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++]]--
++
++local sys = require "luci.sys"
++local utl = require "luci.util"
++local fs = require "nixio.fs"
++local i18n = require "luci.i18n"
++local url = data.url
++local title = data.title or i18n.translate("RSS")
++local max = tonumber(data.max) or 10
++local rss
++local pr = data.paddingright or "0"
++local output = {}
++local width = data.width or "100%"
++if type(width) == "number" then
++ width = width .. "px"
++end
++local name = data['.name']
++local cachetime = tonumber(data.cache) or 3600
++cachefile = "/tmp/" .. name .. ".cache"
++%>
++<div id="<%=name%>" style="width:<%=width%>;float:left">
++ <div style="padding-right: <%=pr%>">
++ <h2><%=title%></h2>
++
++ <% if not url then %>
++ <%:No url found in config%>
++ <% else
++ local mtime = fs.stat(cachefile, "mtime") or 0
++ local now = os.time()
++ expire = mtime + cachetime
++
++ if not fs.access(cachefile) or expire < now then
++ rss = sys.httpget(url)
++ if #rss == 0 then
++ %>
++ <%:Could not get rss data from%> <a href="<%=url%>"><%=url%></a>
++ <%
++ else
++ local count = 0
++ for item in string.gmatch(rss, "<item>(.-)</item>") do
++ if count < max then
++ local title = item:match("<title>(.-)</title>")
++ local link = item:match("<link>(.-)</link>")
++ local desc = item:match("<description>(.-)</description>") or ""
++ if title and link then
++ table.insert(output, { title = utl.pcdata(title), link = utl.pcdata(link) })
++ end
++ count = count + 1
++ end
++ end
++ if count > 0 then
++ local file = io.open(cachefile, "w")
++ file:write(utl.serialize_data(output))
++ file:close()
++ end
++ end
++ else
++ local file = assert(io.open(cachefile))
++ output = utl.restore_data(file:read'*a')
++ end
++ end
++
++ if #output > 0 then
++ %>
++ <ul>
++ <% for k, v in ipairs(output) do %>
++ <li><a href="<%=v.link%>"><%=v.title%></a></li>
++ <% end %>
++ </ul>
++ <%end%>
++ </div>
++</div>
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/search/main.htm b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/search/main.htm
+new file mode 100644
+index 0000000..f2e2fb9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/search/main.htm
+@@ -0,0 +1,54 @@
++<%
++--[[
++LuCI - Lua Configuration Interface
++
++Copyright 2012 Manuel Munz <freifunk at somakoma dot de>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++]]--
++local utl = require "luci.util"
++local title = luci.i18n.translate(data.title or "Search")
++local name = data['.name']
++local width = data.width or "100%"
++
++if type(width) == "number" then
++ width = width .. "px"
++end
++
++local engines = {}
++if type(data.engine) == "table" then
++ engines = data.engine
++else
++ for k, v in ipairs(string.split(data.engine, " ")) do
++ table.insert(engines, v)
++ end
++end
++%>
++
++<div id="<%=name%>" style="width:<%=width%>;float:left">
++ <h2><%=title%></h2>
++ <div id="form_<%=name%>">
++ <form name="searchform" id="search_<%=name%>" action="<%=url('freifunk/search_redirect')%>">
++ <input type="text" name="searchterms" style="margin-bottom:15px; width: 90%"><br />
++ <%
++ local checked = " checked"
++ for k, v in ipairs(engines) do
++ local e = utl.split(v, "|")
++ local name = e[1]
++ local url = e[2]
++ if name and url then
++ %>
++ <input name="engine" type="radio" value="<%=url%>"<%=checked%>> <%=name%><br />
++ <% end
++ checked = ""
++ end
++%>
++ <input type="submit" name="SearchSubmit" value="Search" style="margin-top: 15px">
++ </form>
++ </div>
++</div>
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/root/etc/config/freifunk-widgets b/feeds/luci/applications/luci-app-freifunk-widgets/root/etc/config/freifunk-widgets
+new file mode 100644
+index 0000000..5a9f325
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/root/etc/config/freifunk-widgets
+@@ -0,0 +1,33 @@
++config widget 'example_iframe'
++ option template 'iframe'
++ option url 'http://www.freifunk.net'
++ option title 'Freifunk Homepage'
++ option height '500px'
++ option width '100%'
++ option enabled '0'
++
++config widget 'example_rss'
++ option template 'rssfeed'
++ option url 'http://global.freifunk.net/rss/all/rss.xml'
++ option max '10'
++ option cache '3600'
++ option enabled '0'
++ option title 'Globaler Freifunk RSS Feed'
++
++config widget 'example_search'
++ option template 'search'
++ option enabled '0'
++ option title 'Search'
++ list engine 'Google|http://www.google.de/search?q='
++ list engine 'Freifunk&#160;Wiki|http://wiki.freifunk.net/index.php?search='
++ option width '50%'
++ option paddingright '8%'
++
++config widget 'example_customtext'
++ option template 'html'
++ option width '50%'
++ option enabled '0'
++
++config widget 'example_clear'
++ option enabled '0'
++ option template 'clear'
+diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/root/lib/upgrade/keep.d/freifunk-widgets b/feeds/luci/applications/luci-app-freifunk-widgets/root/lib/upgrade/keep.d/freifunk-widgets
+new file mode 100644
+index 0000000..ce5537a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-freifunk-widgets/root/lib/upgrade/keep.d/freifunk-widgets
+@@ -0,0 +1 @@
++/usr/share/customtext
+diff --git a/feeds/luci/applications/luci-app-fwknopd/Makefile b/feeds/luci/applications/luci-app-fwknopd/Makefile
+new file mode 100644
+index 0000000..3fbd88a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-fwknopd/Makefile
+@@ -0,0 +1,17 @@
++#
++# Copyright (C) 2015 The LuCI Team <luci@lists.subsignal.org>
++#
++# This is free software, licensed under the GNU General Public License v2.
++#
++
++include $(TOPDIR)/rules.mk
++
++LUCI_TITLE:=Fwknopd config - web config for the firewall knock daemon
++LUCI_DEPENDS:=+fwknopd +qrencode
++PKG_VERSION:=1.0
++PKG_RELEASE:=1
++PKG_LICENSE:=GPLv2
++PKG_MAINTAINER:=Jonathan Bennett <JBennett@incomsystems.biz>
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-fwknopd/luasrc/controller/fwknopd.lua b/feeds/luci/applications/luci-app-fwknopd/luasrc/controller/fwknopd.lua
+new file mode 100644
+index 0000000..069a77e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-fwknopd/luasrc/controller/fwknopd.lua
+@@ -0,0 +1,15 @@
++-- Copyright 2015 Jonathan Bennett <jbennett@incomsystems.biz>
++-- Licensed to the public under the GNU General Public License v2.
++
++module("luci.controller.fwknopd", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/fwknopd") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "services", "fwknopd"}, cbi("fwknopd"), _("Firewall Knock Daemon"))
++ page.dependent = true
++end
+diff --git a/feeds/luci/applications/luci-app-fwknopd/luasrc/model/cbi/fwknopd.lua b/feeds/luci/applications/luci-app-fwknopd/luasrc/model/cbi/fwknopd.lua
+new file mode 100644
+index 0000000..096724f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-fwknopd/luasrc/model/cbi/fwknopd.lua
+@@ -0,0 +1,54 @@
++-- Copyright 2015 Jonathan Bennett <jbennett@incomsystems.biz>
++-- Licensed to the public under the GNU General Public License v2.
++
++m = Map("fwknopd", translate("Firewall Knock Operator"))
++
++s = m:section(TypedSection, "global", translate("Enable Uci/Luci control")) -- Set uci control on or off
++s.anonymous=true
++s:option(Flag, "uci_enabled", translate("Enable config overwrite"), translate("When unchecked, the config files in /etc/fwknopd will be used as is, ignoring any settings here."))
++qr = s:option(DummyValue, "note0", "dummy")
++qr.template = "fwknopd-qr"
++qr:depends("uci_enabled", "1")
++
++s = m:section(TypedSection, "access", translate("access.conf stanzas")) -- set the access.conf settings
++s.anonymous=true
++s.addremove=true
++s.dynamic=true
++s:option(Value, "SOURCE", "SOURCE", translate("Use ANY for any source ip"))
++k1 = s:option(Value, "KEY", "KEY", translate("Define the symmetric key used for decrypting an incoming SPA packet that is encrypted by the fwknop client with Rijndael."))
++k1:depends("keytype", translate("Normal Key"))
++k2 = s:option(Value, "KEY_BASE64", "KEY_BASE64", translate("Define the symmetric key used for decrypting an incoming SPA \
++ packet that is encrypted by the fwknop client with Rijndael."))
++k2:depends("keytype", translate("Base 64 key"))
++l1 = s:option(ListValue, "keytype", "Key type")
++l1:value("Normal Key", "Normal Key")
++l1:value("Base 64 key", "Base 64 key")
++k3 = s:option(Value, "HMAC_KEY", "HMAC_KEY", "The hmac key")
++k3:depends("hkeytype", "Normal Key")
++k4 = s:option(Value, "HMAC_KEY_BASE64", "HMAC_KEY_BASE64", translate("The base64 hmac key"))
++k4:depends("hkeytype", "Base 64 key")
++l2 = s:option(ListValue, "hkeytype", "HMAC Key type")
++l2:value("Normal Key", "Normal Key")
++l2:value("Base 64 key", "Base 64 key")
++s:option(Value, "OPEN_PORTS", "OPEN_PORTS", translate("Define a set of ports and protocols (tcp or udp) that will be opened if a valid knock sequence is seen. \
++ If this entry is not set, fwknopd will attempt to honor any proto/port request specified in the SPA data \
++ (unless of it matches any “RESTRICT_PORTS†entries). Multiple entries are comma-separated."))
++s:option(Value, "FW_ACCESS_TIMEOUT", "FW_ACCESS_TIMEOUT", translate("Define the length of time access will be granted by fwknopd through the firewall after a \
++ valid knock sequence from a source IP address. If “FW_ACCESS_TIMEOUT†is not set then the default \
++ timeout of 30 seconds will automatically be set."))
++s:option(Value, "REQUIRE_SOURCE_ADDRESS", "REQUIRE_SOURCE_ADDRESS", translate("Force all SPA packets to contain a real IP address within the encrypted data. \
++ This makes it impossible to use the -s command line argument on the fwknop client command line, so either -R \
++ has to be used to automatically resolve the external address (if the client behind a NAT) or the client must \
++ know the external IP and set it via the -a argument."))
++s:option(DummyValue, "note1", translate("Enter custom access.conf variables below:"))
++
++s = m:section(TypedSection, "config", translate("fwknopd.conf config options"))
++s.anonymous=true
++s.dynamic=true
++s:option(Value, "MAX_SPA_PACKET_AGE", "MAX_SPA_PACKET_AGE", translate("Maximum age in seconds that an SPA packet will be accepted. defaults to 120 seconds"))
++s:option(Value, "PCAP_INTF", "PCAP_INTF", translate("Specify the ethernet interface on which fwknopd will sniff packets."))
++s:option(Value, "ENABLE_IPT_FORWARDING", "ENABLE_IPT_FORWARDING", translate("Allow SPA clients to request access to services through an iptables firewall instead of just to it."))
++s:option(DummyValue, "note2", translate("Enter custom fwknopd.conf variables below:"))
++
++return m
++
+diff --git a/feeds/luci/applications/luci-app-fwknopd/luasrc/view/fwknopd-qr.htm b/feeds/luci/applications/luci-app-fwknopd/luasrc/view/fwknopd-qr.htm
+new file mode 100644
+index 0000000..9e6e818
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-fwknopd/luasrc/view/fwknopd-qr.htm
+@@ -0,0 +1 @@
++<% print(luci.sys.exec("sh /usr/sbin/gen-qr.sh")) %>
+diff --git a/feeds/luci/applications/luci-app-fwknopd/po/en/fwknopd.po b/feeds/luci/applications/luci-app-fwknopd/po/en/fwknopd.po
+new file mode 100644
+index 0000000..d75c99d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-fwknopd/po/en/fwknopd.po
+@@ -0,0 +1,113 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2015-05-12 21:03-0500\n"
++"Last-Translator: Jonathan Bennett <JBennett@incomsystems.biz>\n"
++"Language-Team: English\n"
++"Language: en\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid ""
++"Allow SPA clients to request access to services through an iptables firewall "
++"instead of just to it."
++msgstr ""
++"Allow SPA clients to request access to services through an iptables firewall "
++"instead of just to it."
++
++msgid "Base 64 key"
++msgstr "Base 64 key"
++
++msgid ""
++"Define a set of ports and protocols (tcp or udp) that will be opened if a "
++"valid knock sequence is seen. If this entry is not set, fwknopd will attempt "
++"to honor any proto/port request specified in the SPA data (unless of it "
++"matches any “RESTRICT_PORTS†entries). Multiple entries are comma-separated."
++msgstr ""
++"Define a set of ports and protocols (tcp or udp) that will be opened if a "
++"valid knock sequence is seen. If this entry is not set, fwknopd will attempt "
++"to honor any proto/port request specified in the SPA data (unless of it "
++"matches any “RESTRICT_PORTS†entries). Multiple entries are comma-separated."
++
++msgid ""
++"Define the length of time access will be granted by fwknopd through the "
++"firewall after a valid knock sequence from a source IP address. If "
++"“FW_ACCESS_TIMEOUT†is not set then the default timeout of 30 seconds will "
++"automatically be set."
++msgstr ""
++"Define the length of time access will be granted by fwknopd through the "
++"firewall after a valid knock sequence from a source IP address. If "
++"“FW_ACCESS_TIMEOUT†is not set then the default timeout of 30 seconds will "
++"automatically be set."
++
++msgid ""
++"Define the symmetric key used for decrypting an incoming SPA packet that is "
++"encrypted by the fwknop client with Rijndael."
++msgstr ""
++"Define the symmetric key used for decrypting an incoming SPA packet that is "
++"encrypted by the fwknop client with Rijndael."
++
++msgid "Enable Uci/Luci control"
++msgstr "Enable Uci/Luci control"
++
++msgid "Enable config overwrite"
++msgstr "Enable config overwrite"
++
++msgid "Enter custom access.conf variables below:"
++msgstr "Enter custom access.conf variables below:"
++
++msgid "Enter custom fwknopd.conf variables below:"
++msgstr "Enter custom fwknopd.conf variables below:"
++
++msgid "Firewall Knock Daemon"
++msgstr "Firewall Knock Daemon"
++
++msgid "Firewall Knock Operator"
++msgstr "Firewall Knock Operator"
++
++msgid ""
++"Force all SPA packets to contain a real IP address within the encrypted "
++"data. This makes it impossible to use the -s command line argument on the "
++"fwknop client command line, so either -R has to be used to automatically "
++"resolve the external address (if the client behind a NAT) or the client must "
++"know the external IP and set it via the -a argument."
++msgstr ""
++"Force all SPA packets to contain a real IP address within the encrypted "
++"data. This makes it impossible to use the -s command line argument on the "
++"fwknop client command line, so either -R has to be used to automatically "
++"resolve the external address (if the client behind a NAT) or the client must "
++"know the external IP and set it via the -a argument."
++
++msgid ""
++"Maximum age in seconds that an SPA packet will be accepted. defaults to 120 "
++"seconds"
++msgstr ""
++"Maximum age in seconds that an SPA packet will be accepted. defaults to 120 "
++"seconds"
++
++msgid "Normal Key"
++msgstr "Normal Key"
++
++msgid "Specify the ethernet interface on which fwknopd will sniff packets."
++msgstr "Specify the ethernet interface on which fwknopd will sniff packets."
++
++msgid "The base64 hmac key"
++msgstr "The base64 hmac key"
++
++msgid "Use ANY for any source ip"
++msgstr "Use ANY for any source ip"
++
++msgid ""
++"When unchecked, the config files in /etc/fwknopd will be used as is, "
++"ignoring any settings here."
++msgstr ""
++"When unchecked, the config files in /etc/fwknopd will be used as is, "
++"ignoring any settings here."
++
++msgid "access.conf stanzas"
++msgstr "access.conf stanzas"
++
++msgid "fwknopd.conf config options"
++msgstr "fwknopd.conf config options"
+diff --git a/feeds/luci/applications/luci-app-fwknopd/po/templates/fwknopd.pot b/feeds/luci/applications/luci-app-fwknopd/po/templates/fwknopd.pot
+new file mode 100644
+index 0000000..4fb616f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-fwknopd/po/templates/fwknopd.pot
+@@ -0,0 +1,83 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid ""
++"Allow SPA clients to request access to services through an iptables firewall "
++"instead of just to it."
++msgstr ""
++
++msgid "Base 64 key"
++msgstr ""
++
++msgid ""
++"Define a set of ports and protocols (tcp or udp) that will be opened if a "
++"valid knock sequence is seen. If this entry is not set, fwknopd will attempt "
++"to honor any proto/port request specified in the SPA data (unless of it "
++"matches any “RESTRICT_PORTS†entries). Multiple entries are comma-separated."
++msgstr ""
++
++msgid ""
++"Define the length of time access will be granted by fwknopd through the "
++"firewall after a valid knock sequence from a source IP address. If "
++"“FW_ACCESS_TIMEOUT†is not set then the default timeout of 30 seconds will "
++"automatically be set."
++msgstr ""
++
++msgid ""
++"Define the symmetric key used for decrypting an incoming SPA packet that is "
++"encrypted by the fwknop client with Rijndael."
++msgstr ""
++
++msgid "Enable Uci/Luci control"
++msgstr ""
++
++msgid "Enable config overwrite"
++msgstr ""
++
++msgid "Enter custom access.conf variables below:"
++msgstr ""
++
++msgid "Enter custom fwknopd.conf variables below:"
++msgstr ""
++
++msgid "Firewall Knock Daemon"
++msgstr ""
++
++msgid "Firewall Knock Operator"
++msgstr ""
++
++msgid ""
++"Force all SPA packets to contain a real IP address within the encrypted "
++"data. This makes it impossible to use the -s command line argument on the "
++"fwknop client command line, so either -R has to be used to automatically "
++"resolve the external address (if the client behind a NAT) or the client must "
++"know the external IP and set it via the -a argument."
++msgstr ""
++
++msgid ""
++"Maximum age in seconds that an SPA packet will be accepted. defaults to 120 "
++"seconds"
++msgstr ""
++
++msgid "Normal Key"
++msgstr ""
++
++msgid "Specify the ethernet interface on which fwknopd will sniff packets."
++msgstr ""
++
++msgid "The base64 hmac key"
++msgstr ""
++
++msgid "Use ANY for any source ip"
++msgstr ""
++
++msgid ""
++"When unchecked, the config files in /etc/fwknopd will be used as is, "
++"ignoring any settings here."
++msgstr ""
++
++msgid "access.conf stanzas"
++msgstr ""
++
++msgid "fwknopd.conf config options"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-fwknopd/root/etc/uci-defaults/luci-fwknopd b/feeds/luci/applications/luci-app-fwknopd/root/etc/uci-defaults/luci-fwknopd
+new file mode 100644
+index 0000000..01b85de
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-fwknopd/root/etc/uci-defaults/luci-fwknopd
+@@ -0,0 +1,22 @@
++#!/bin/sh
++#-- Copyright 2015 Jonathan Bennett <jbennett@incomsystems.biz>
++#-- Licensed to the public under the GNU General Public License v2.
++. /lib/functions/network.sh
++
++uci batch <<EOF
++ add ucitrack fwknopd
++ set ucitrack.@fwknopd[-1].init=fwknopd
++ commit ucitrack
++EOF
++
++uci delete fwknopd.@access[0].KEY
++uci delete fwknopd.@access[0].HMAC_KEY
++uci set fwknopd.@access[0].keytype='Base 64 key'
++uci set fwknopd.@access[0].hkeytype='Base 64 key'
++uci set fwknopd.@access[0].KEY_BASE64=`fwknopd --key-gen | awk '/^KEY/ {print $2;}'`
++uci set fwknopd.@access[0].HMAC_KEY_BASE64=`fwknopd --key-gen | awk '/^HMAC/ {print $2;}'`
++uci set fwknopd.@config[0].ENABLE_IPT_FORWARDING='y'
++
++uci commit fwknopd
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-fwknopd/root/usr/sbin/gen-qr.sh b/feeds/luci/applications/luci-app-fwknopd/root/usr/sbin/gen-qr.sh
+new file mode 100644
+index 0000000..97493da
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-fwknopd/root/usr/sbin/gen-qr.sh
+@@ -0,0 +1,22 @@
++#!/bin/sh
++
++key_base64=$(uci get fwknopd.@access[0].KEY_BASE64)
++key=$(uci get fwknopd.@access[0].KEY)
++hmac_key_base64=$(uci get fwknopd.@access[0].HMAC_KEY_BASE64)
++hmac_key=$(uci get fwknopd.@access[0].HMAC_KEY)
++
++if [ $key_base64 != "" ]; then
++qr="KEY_BASE64:$key_base64"
++fi
++if [ $key != "" ]; then
++qr="$qr KEY:$key"
++
++fi
++if [ $hmac_key_base64 != "" ]; then
++qr="$qr HMAC_KEY_BASE64:$hmac_key_base64"
++fi
++if [ $hmac_key != "" ]; then
++qr="$qr HMAC_KEY:$hmac_key"
++fi
++
++qrencode -o - "$qr"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/Makefile b/feeds/luci/applications/luci-app-hd-idle/Makefile
+new file mode 100644
+index 0000000..07d5cad
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Hard Disk Idle Spin-Down module
++LUCI_DEPENDS:=+hd-idle
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-hd-idle/luasrc/controller/hd_idle.lua b/feeds/luci/applications/luci-app-hd-idle/luasrc/controller/hd_idle.lua
+new file mode 100644
+index 0000000..f273a55
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/luasrc/controller/hd_idle.lua
+@@ -0,0 +1,15 @@
++-- Copyright 2008 Yanira <forum-2008@email.de>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.hd_idle", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/hd-idle") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "services", "hd_idle"}, cbi("hd_idle"), _("hd-idle"), 60)
++ page.dependent = true
++end
+diff --git a/feeds/luci/applications/luci-app-hd-idle/luasrc/model/cbi/hd_idle.lua b/feeds/luci/applications/luci-app-hd-idle/luasrc/model/cbi/hd_idle.lua
+new file mode 100644
+index 0000000..70b04af
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/luasrc/model/cbi/hd_idle.lua
+@@ -0,0 +1,29 @@
++-- Copyright 2008 Yanira <forum-2008@email.de>
++-- Licensed to the public under the Apache License 2.0.
++
++require("nixio.fs")
++
++m = Map("hd-idle", "hd-idle",
++ translate("hd-idle is a utility program for spinning-down external " ..
++ "disks after a period of idle time."))
++
++s = m:section(TypedSection, "hd-idle", translate("Settings"))
++s.anonymous = true
++
++s:option(Flag, "enabled", translate("Enable"))
++
++disk = s:option(Value, "disk", translate("Disk"))
++disk.rmempty = true
++for dev in nixio.fs.glob("/dev/[sh]d[a-z]") do
++ disk:value(nixio.fs.basename(dev))
++end
++
++s:option(Value, "idle_time_interval", translate("Idle-time")).default = 10
++s.rmempty = true
++unit = s:option(ListValue, "idle_time_unit", translate("Idle-time unit"))
++unit.default = "minutes"
++unit:value("minutes", translate("min"))
++unit:value("hours", translate("h"))
++unit.rmempty = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/ca/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/ca/hd_idle.po
+new file mode 100644
+index 0000000..29618a8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/ca/hd_idle.po
+@@ -0,0 +1,52 @@
++# hd_idle.pot
++# generated from ./applications/luci-hd_idle/luasrc/i18n/hd_idle.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2014-07-01 05:48+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "Disc"
++
++msgid "Enable"
++msgstr "Habilita"
++
++msgid "Idle-time"
++msgstr "Temps d'inactivitat"
++
++msgid "Idle-time unit"
++msgstr "Unitat de temps d'inactivitat"
++
++msgid "Settings"
++msgstr "Ajusts"
++
++# Hours
++msgid "h"
++msgstr "h"
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle és un programa per ralentitzar els discos externs després d'un "
++"període de temps inactiu."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "min"
++
++#~ msgid "Enable debug"
++#~ msgstr "Habilita la depuració"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/cs/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/cs/hd_idle.po
+new file mode 100644
+index 0000000..e2deb9b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/cs/hd_idle.po
+@@ -0,0 +1,52 @@
++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2014-04-23 22:33+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "Disk"
++
++msgid "Enable"
++msgstr "Povolit"
++
++msgid "Idle-time"
++msgstr "ÄŒas neÄinnosti"
++
++msgid "Idle-time unit"
++msgstr "ÄŒas neÄinnosti - jednotka"
++
++msgid "Settings"
++msgstr "Nastavení"
++
++# Hodin
++msgid "h"
++msgstr "h"
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle je utilita pro vypnutí externích pevných disků po urÄité dobÄ› "
++"neÄinnosti."
++
++# Minut (ne minimum)
++msgid "min"
++msgstr "min"
++
++#~ msgid "Enable debug"
++#~ msgstr "Povolit ladění"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/de/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/de/hd_idle.po
+new file mode 100644
+index 0000000..fa54896
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/de/hd_idle.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2011-06-11 01:55+0200\n"
++"Last-Translator: Jo-Philipp <jow@openwrt.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Disk"
++msgstr "Festplatte"
++
++msgid "Enable"
++msgstr "Aktivieren"
++
++msgid "Idle-time"
++msgstr "Leerlaufzeit"
++
++msgid "Idle-time unit"
++msgstr "Leerlaufzeiteinheit"
++
++msgid "Settings"
++msgstr "Einstellungen"
++
++# Hours
++msgid "h"
++msgstr "Stunden"
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle ist ein Hilfsprogramm um externe Festplatten nach einer festgelegten "
++"Leerlaufzeit herunter zu fahren."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "Minuten"
++
++#~ msgid "Enable debug"
++#~ msgstr "Debug-Ausgaben aktivieren"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/el/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/el/hd_idle.po
+new file mode 100644
+index 0000000..4d7c23d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/el/hd_idle.po
+@@ -0,0 +1,48 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2012-03-18 15:14+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Disk"
++msgstr "Δίσκος"
++
++msgid "Enable"
++msgstr "ΕνεÏγοποίηση"
++
++msgid "Idle-time"
++msgstr ""
++
++msgid "Idle-time unit"
++msgstr ""
++
++msgid "Settings"
++msgstr "Ρυθμίσεις"
++
++# Hours
++msgid "h"
++msgstr "ω"
++
++msgid "hd-idle"
++msgstr ""
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "λεπτά"
++
++#~ msgid "Enable debug"
++#~ msgstr "ΕνεÏγοποίηση αποσφαλμάτωσης"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/en/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/en/hd_idle.po
+new file mode 100644
+index 0000000..7aa4db5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/en/hd_idle.po
+@@ -0,0 +1,48 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Disk"
++msgstr "Disk"
++
++msgid "Enable"
++msgstr "Enable"
++
++msgid "Idle-time"
++msgstr "Idle-time"
++
++msgid "Idle-time unit"
++msgstr "Idle-time unit"
++
++msgid "Settings"
++msgstr "Settings"
++
++# Hours
++msgid "h"
++msgstr "h"
++
++msgid "hd-idle"
++msgstr ""
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "min"
++
++#~ msgid "Enable debug"
++#~ msgstr "Enable debug"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/es/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/es/hd_idle.po
+new file mode 100644
+index 0000000..d2bb017
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/es/hd_idle.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2012-08-22 17:44+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "Disco"
++
++msgid "Enable"
++msgstr "Activar"
++
++msgid "Idle-time"
++msgstr "Tiempo de inactividad"
++
++msgid "Idle-time unit"
++msgstr "Unidad de tiempo"
++
++msgid "Settings"
++msgstr "Configuración"
++
++# Hours
++msgid "h"
++msgstr "h"
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle es un programa que gestiona el reposo de discos externos tras un "
++"tiempo de inactividad."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "minutos"
++
++#~ msgid "Enable debug"
++#~ msgstr "Activar depuración"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/fr/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/fr/hd_idle.po
+new file mode 100644
+index 0000000..00c092d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/fr/hd_idle.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2012-11-06 15:20+0200\n"
++"Last-Translator: hogsim <hogsim@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "Disque"
++
++msgid "Enable"
++msgstr "Activer"
++
++msgid "Idle-time"
++msgstr "Temps d'inactivité"
++
++msgid "Idle-time unit"
++msgstr "Unité de temps"
++
++msgid "Settings"
++msgstr "Réglages"
++
++# Hours
++msgid "h"
++msgstr "h"
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle est un utilitaire pour arrêter la rotation des disques externes "
++"après une période d'inactivité."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "min"
++
++#~ msgid "Enable debug"
++#~ msgstr "Activer le débogage"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/he/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/he/hd_idle.po
+new file mode 100644
+index 0000000..0ffde90
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/he/hd_idle.po
+@@ -0,0 +1,52 @@
++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2011-06-25 11:35+0200\n"
++"Last-Translator: GiladL <gl1000007@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Disk"
++msgstr "כונן"
++
++msgid "Enable"
++msgstr "×פשר"
++
++msgid "Idle-time"
++msgstr "זמן חוסר פעילות"
++
++msgid "Idle-time unit"
++msgstr "יחידת זמן חוסר פעילות"
++
++msgid "Settings"
++msgstr "הגדרות"
++
++# Hours
++msgid "h"
++msgstr "ש'"
++
++msgid "hd-idle"
++msgstr ""
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle ×”×™× ×” תוכנת שירות שמטרתה להקטין ×ת מהירות הסיבוב של ×›×•× × ×™× ×—×™×¦×•× ×™×™× "
++"ל×חר זמן ×ž×¡×•×™× ×©×œ חוסר פעילות."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "דק'"
++
++#~ msgid "Enable debug"
++#~ msgstr "×פשר ניפוי שגי×ות"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/hu/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/hu/hd_idle.po
+new file mode 100644
+index 0000000..543a8fc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/hu/hd_idle.po
+@@ -0,0 +1,52 @@
++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2012-07-10 21:04+0200\n"
++"Last-Translator: Gyula <pro564@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "Lemez"
++
++msgid "Enable"
++msgstr "Engedélyezés"
++
++msgid "Idle-time"
++msgstr "Üresjárati idő"
++
++msgid "Idle-time unit"
++msgstr "Üresjárati idő egysége"
++
++msgid "Settings"
++msgstr "Beállítások"
++
++# Hours
++msgid "h"
++msgstr "óra"
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle egy a külső lemezek adott üresjárati idő után történő leállítására "
++"szolgáló segédprogram."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "perc"
++
++#~ msgid "Enable debug"
++#~ msgstr "Hibakeresés engedélyezése"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/it/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/it/hd_idle.po
+new file mode 100644
+index 0000000..ffd118d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/it/hd_idle.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2013-02-03 13:54+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "Disco"
++
++msgid "Enable"
++msgstr "Abilita"
++
++msgid "Idle-time"
++msgstr "Tempo di inattività"
++
++msgid "Idle-time unit"
++msgstr "Unità di misura del tempo di inattività"
++
++msgid "Settings"
++msgstr "Opzioni"
++
++# Hours
++msgid "h"
++msgstr "ora/e"
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"HD-idle è un programma per mettere in standby i dischi esterni dopo un "
++"periodo di inattività."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "min"
++
++#~ msgid "Enable debug"
++#~ msgstr "Abilita debug"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/ja/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/ja/hd_idle.po
+new file mode 100644
+index 0000000..9e724eb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/ja/hd_idle.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2012-11-14 14:40+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "ディスク"
++
++msgid "Enable"
++msgstr "有効"
++
++msgid "Idle-time"
++msgstr "アイドル時間"
++
++msgid "Idle-time unit"
++msgstr "アイドル時間 (å˜ä½)"
++
++msgid "Settings"
++msgstr "設定"
++
++# Hours
++msgid "h"
++msgstr "時"
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idleã¯ã‚¢ã‚¤ãƒ‰ãƒ«æ™‚ã«å¤–部ディスクをスピンダウンã•ã›ã‚‹ãŸã‚ã®ã€ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ãƒ—"
++"ログラムã§ã™ã€‚"
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "分"
++
++#~ msgid "Enable debug"
++#~ msgstr "デãƒãƒƒã‚°ã‚’有効ã«ã™ã‚‹"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/ms/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/ms/hd_idle.po
+new file mode 100644
+index 0000000..45402b8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/ms/hd_idle.po
+@@ -0,0 +1,44 @@
++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2010-04-14 10:33+0200\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Disk"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Idle-time"
++msgstr ""
++
++msgid "Idle-time unit"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++# Hours
++msgid "h"
++msgstr ""
++
++msgid "hd-idle"
++msgstr ""
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++
++# Minutes (not minimum)
++msgid "min"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/no/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/no/hd_idle.po
+new file mode 100644
+index 0000000..dc0c2f8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/no/hd_idle.po
+@@ -0,0 +1,39 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Disk"
++msgstr "Disk"
++
++msgid "Enable"
++msgstr "Aktiver"
++
++msgid "Idle-time"
++msgstr "Tid inaktiv"
++
++msgid "Idle-time unit"
++msgstr "Tidsenhet"
++
++msgid "Settings"
++msgstr "Innstillinger"
++
++msgid "h"
++msgstr "timer"
++
++msgid "hd-idle"
++msgstr "Hd-Idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle er et verktøy for å spinne ned eksterne disker etter en periode med "
++"inaktivitet."
++
++msgid "min"
++msgstr "minutter"
++
++#~ msgid "Enable debug"
++#~ msgstr "Aktiver feilsøking"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/pl/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/pl/hd_idle.po
+new file mode 100644
+index 0000000..c6522c1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/pl/hd_idle.po
+@@ -0,0 +1,51 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2011-06-03 16:09+0200\n"
++"Last-Translator: Staszek <fistaszek@tlen.pl>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Disk"
++msgstr "Dysk"
++
++msgid "Enable"
++msgstr "WÅ‚Ä…cz"
++
++msgid "Idle-time"
++msgstr "Czas bezczynności"
++
++msgid "Idle-time unit"
++msgstr "Jednostka czasu bezczynności"
++
++msgid "Settings"
++msgstr "Ustawienia"
++
++# Hours
++msgid "h"
++msgstr "godz."
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle jest narzędziem do zwalniania obrotów zewnętrznych dysków po "
++"określonym czasie bezczynności."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "min"
++
++#~ msgid "Enable debug"
++#~ msgstr "WÅ‚Ä…cz tryb debugowania"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/pt-br/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/pt-br/hd_idle.po
+new file mode 100644
+index 0000000..0aaca93
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/pt-br/hd_idle.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2011-10-08 03:12+0200\n"
++"Last-Translator: luizluca <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Disk"
++msgstr "Disco"
++
++msgid "Enable"
++msgstr "Habilitar"
++
++msgid "Idle-time"
++msgstr "Tempo de ociosidade"
++
++msgid "Idle-time unit"
++msgstr "Unidade do tempo da ociosidade"
++
++msgid "Settings"
++msgstr "Configurações"
++
++# Hours
++msgid "h"
++msgstr "horas"
++
++msgid "hd-idle"
++msgstr "Hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"Hd-idle é um programa utilitário para ativar o modo \"economia de energia"
++"\" (spinning-down) de discos externos após um período de ociosidade."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "minutos"
++
++#~ msgid "Enable debug"
++#~ msgstr "Ativar depuração"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/pt/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/pt/hd_idle.po
+new file mode 100644
+index 0000000..16cb085
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/pt/hd_idle.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2013-05-31 15:28+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "Disco"
++
++msgid "Enable"
++msgstr "Ativar"
++
++msgid "Idle-time"
++msgstr "Tempo de ociosidade"
++
++msgid "Idle-time unit"
++msgstr "Unidade de tempo de ociosidade"
++
++msgid "Settings"
++msgstr "Configurações"
++
++# Hours
++msgid "h"
++msgstr "h"
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle é um programa utilitário para activar o modo \"economia de energia"
++"\" (spinning-down) de discos externos após um período de ociosidade."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "min"
++
++#~ msgid "Enable debug"
++#~ msgstr "Ativar debug"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/ro/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/ro/hd_idle.po
+new file mode 100644
+index 0000000..ae6a8b0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/ro/hd_idle.po
+@@ -0,0 +1,53 @@
++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2013-09-25 19:12+0200\n"
++"Last-Translator: Mihai <WyRwSyK@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "Disc"
++
++msgid "Enable"
++msgstr "Activeaza"
++
++msgid "Idle-time"
++msgstr "Timp de inactivitate"
++
++msgid "Idle-time unit"
++msgstr "Unitatea de timp pentru masurarea inactivitatii"
++
++msgid "Settings"
++msgstr "Setari"
++
++# Hours
++msgid "h"
++msgstr "ore"
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle este un utilitar pentru a oprit din rotatie hard disc-urile externe "
++"dupa o anumita perioada de inactivitate."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "minute"
++
++#~ msgid "Enable debug"
++#~ msgstr "Activeaza informatii suplimentare de tip \"debug\""
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/ru/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/ru/hd_idle.po
+new file mode 100644
+index 0000000..45d4a51
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/ru/hd_idle.po
+@@ -0,0 +1,52 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: hd_idle\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2012-08-15 11:24+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Disk"
++msgstr "ДиÑк"
++
++msgid "Enable"
++msgstr "Включить"
++
++msgid "Idle-time"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð±ÐµÐ·Ð´ÐµÐ¹ÑтвиÑ"
++
++msgid "Idle-time unit"
++msgstr "Единицы времени бездейÑтвиÑ"
++
++msgid "Settings"
++msgstr "ÐаÑтройки"
++
++# Hours
++msgid "h"
++msgstr "ч"
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"Утилита hd-idle позволÑет замедлÑÑ‚ÑŒ внешние диÑки поÑле определённого "
++"времени бездейÑтвиÑ."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "мин"
++
++#~ msgid "Enable debug"
++#~ msgstr "Включить отладку"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/sk/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/sk/hd_idle.po
+new file mode 100644
+index 0000000..0ae82d8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/sk/hd_idle.po
+@@ -0,0 +1,38 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Disk"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Idle-time"
++msgstr ""
++
++msgid "Idle-time unit"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "h"
++msgstr ""
++
++msgid "hd-idle"
++msgstr ""
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++
++msgid "min"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/sv/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/sv/hd_idle.po
+new file mode 100644
+index 0000000..1d63095
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/sv/hd_idle.po
+@@ -0,0 +1,39 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Disk"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Idle-time"
++msgstr ""
++
++msgid "Idle-time unit"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "h"
++msgstr ""
++
++msgid "hd-idle"
++msgstr ""
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++
++msgid "min"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/templates/hd_idle.pot b/feeds/luci/applications/luci-app-hd-idle/po/templates/hd_idle.pot
+new file mode 100644
+index 0000000..56079ed
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/templates/hd_idle.pot
+@@ -0,0 +1,31 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Disk"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Idle-time"
++msgstr ""
++
++msgid "Idle-time unit"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "h"
++msgstr ""
++
++msgid "hd-idle"
++msgstr ""
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++
++msgid "min"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/tr/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/tr/hd_idle.po
+new file mode 100644
+index 0000000..f9ace87
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/tr/hd_idle.po
+@@ -0,0 +1,52 @@
++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2012-10-11 23:15+0200\n"
++"Last-Translator: vincenzo <tayfun_ozturk@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: tr\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: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "Disk"
++
++msgid "Enable"
++msgstr "Kullanıma Aç"
++
++msgid "Idle-time"
++msgstr "Bekleme Zamanı"
++
++msgid "Idle-time unit"
++msgstr "bekleme zamanı birimi"
++
++msgid "Settings"
++msgstr "Ayarlar"
++
++# Hours
++msgid "h"
++msgstr "s"
++
++msgid "hd-idle"
++msgstr "Harddisk-Park"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"Harddisk-Park belirli bir zaman sonra diskleri beklemeye alan bir yardımcı "
++"programdır"
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "d"
++
++#~ msgid "Enable debug"
++#~ msgstr "Hata Ayıklama"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/uk/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/uk/hd_idle.po
+new file mode 100644
+index 0000000..129fd7b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/uk/hd_idle.po
+@@ -0,0 +1,52 @@
++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2013-08-13 15:59+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Disk"
++msgstr "ДиÑк"
++
++msgid "Enable"
++msgstr "Ðктивувати"
++
++msgid "Idle-time"
++msgstr "Ð§Ð°Ñ Ð¿Ñ€Ð¾Ñтою"
++
++msgid "Idle-time unit"
++msgstr ""
++
++msgid "Settings"
++msgstr "ÐалаштуваннÑ"
++
++# Hours
++msgid "h"
++msgstr ""
++
++#, fuzzy
++msgid "hd-idle"
++msgstr "HD-проÑтій"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "хв"
++
++#~ msgid "Enable debug"
++#~ msgstr "Ðктивувати налагодженнÑ"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/vi/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/vi/hd_idle.po
+new file mode 100644
+index 0000000..03ee2c1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/vi/hd_idle.po
+@@ -0,0 +1,53 @@
++# hd_idle.pot
++# generated from ./applications/luci-hd_idle/luasrc/i18n/hd_idle.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2009-08-12 17:50+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "Disk"
++msgstr "á»” Ä‘Ä©a"
++
++#, fuzzy
++msgid "Enable"
++msgstr "Kích hoạt debug"
++
++#, fuzzy
++msgid "Idle-time"
++msgstr "Thá»i gian Idle"
++
++#, fuzzy
++msgid "Idle-time unit"
++msgstr "ÄÆ¡n vị thá»i gian Idle"
++
++msgid "Settings"
++msgstr "Sắp đặt"
++
++# Hours
++msgid "h"
++msgstr ""
++
++msgid "hd-idle"
++msgstr "hd-idle"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr ""
++"hd-idle là một chương trình tiện ích để quay các đĩa ngoài sau một khoảng "
++"thá»i gian idle."
++
++# Minutes (not minimum)
++msgid "min"
++msgstr ""
++
++#~ msgid "Enable debug"
++#~ msgstr "Kích hoạt debug"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/zh-cn/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/zh-cn/hd_idle.po
+new file mode 100644
+index 0000000..8bc14dc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/zh-cn/hd_idle.po
+@@ -0,0 +1,48 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 10:33+0200\n"
++"PO-Revision-Date: 2012-09-03 17:57+0200\n"
++"Last-Translator: nKsyn <e.nksyn@gmail.com>\n"
++"Language-Team: QQ Group:75543259 <axishero@foxmail.com>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "硬盘"
++
++msgid "Enable"
++msgstr "å¼€å¯"
++
++msgid "Idle-time"
++msgstr "空闲时间"
++
++msgid "Idle-time unit"
++msgstr "空闲时间å•ä½"
++
++msgid "Settings"
++msgstr "设置"
++
++# Hours
++msgid "h"
++msgstr "å°æ—¶"
++
++msgid "hd-idle"
++msgstr "硬盘休眠"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr "硬盘休眠是一个让硬盘在空闲一段时间åŽä¼‘眠的工具"
++
++# Minutes (not minimum)
++msgid "min"
++msgstr "分钟"
++
++#~ msgid "Enable debug"
++#~ msgstr "å¼€å¯è°ƒè¯•"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/po/zh-tw/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/zh-tw/hd_idle.po
+new file mode 100644
+index 0000000..bd69785
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/po/zh-tw/hd_idle.po
+@@ -0,0 +1,44 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-07 15:47+0200\n"
++"Last-Translator: Ethan <ethan42411@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Disk"
++msgstr "ç£ç¢Ÿ"
++
++msgid "Enable"
++msgstr "啟用"
++
++msgid "Idle-time"
++msgstr "休眠時間"
++
++msgid "Idle-time unit"
++msgstr "休眠時間單ä½"
++
++msgid "Settings"
++msgstr "設定"
++
++msgid "h"
++msgstr "å°æ™‚"
++
++msgid "hd-idle"
++msgstr "硬碟休眠"
++
++msgid ""
++"hd-idle is a utility program for spinning-down external disks after a period "
++"of idle time."
++msgstr "硬碟休眠是控制當硬碟閒置一段時間後進入休眠模å¼çš„工具"
++
++msgid "min"
++msgstr "分é˜"
++
++#~ msgid "Enable debug"
++#~ msgstr "啟用åµéŒ¯æ¨¡å¼"
+diff --git a/feeds/luci/applications/luci-app-hd-idle/root/etc/uci-defaults/luci-hd_idle b/feeds/luci/applications/luci-app-hd-idle/root/etc/uci-defaults/luci-hd_idle
+new file mode 100755
+index 0000000..92f4356
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-hd-idle/root/etc/uci-defaults/luci-hd_idle
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@hd-idle[-1]
++ add ucitrack hd-idle
++ set ucitrack.@hd-idle[-1].init=hd-idle
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-ltqtapi/Makefile b/feeds/luci/applications/luci-app-ltqtapi/Makefile
+new file mode 100644
+index 0000000..bf4a999
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ltqtapi/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for Lantiq Devices
++LUCI_DEPENDS:=@BROKEN
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-ltqtapi/luasrc/controller/ltqtapi.lua b/feeds/luci/applications/luci-app-ltqtapi/luasrc/controller/ltqtapi.lua
+new file mode 100644
+index 0000000..46c7684
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ltqtapi/luasrc/controller/ltqtapi.lua
+@@ -0,0 +1,40 @@
++-- Copyright 2019 John Crispin <blogic@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.ltqtapi", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/telephony") then
++ return
++ end
++
++ page = node("admin", "telephony")
++ page.target = firstchild()
++ page.title = _("VoIP")
++ page.order = 90
++
++ entry({"admin", "telephony", "account"}, cbi("luci_ltqtapi/account") , _("Account"), 10)
++ entry({"admin", "telephony", "contact"}, cbi("luci_ltqtapi/contact") , _("Contacts"), 20)
++
++ entry({"admin", "telephony", "status"}, call("tapi_status")).leaf = true
++end
++
++function tapi_status()
++ local st = { }
++ local state = require "luci.model.uci".cursor_state()
++ state:load("telephony")
++
++ st.status = "Offline";
++ if state:get("telephony", "state", "port1", "0") == "0" then
++ st.line1 = "Idle";
++ else
++ st.line1 = "Calling";
++ end
++ if state:get("telephony", "state", "port2", "0") == "0" then
++ st.line2 = "Idle";
++ else
++ st.line2 = "Calling";
++ end
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(st)
++end
+diff --git a/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/account.lua b/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/account.lua
+new file mode 100644
+index 0000000..907db56
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/account.lua
+@@ -0,0 +1,16 @@
++-- Copyright 2010 John Crispin <blogic@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("telephony", translate("VoIP"))
++m.on_after_commit = function() luci.sys.call("/etc/init.d/telephony restart") end
++
++s = m:section(TypedSection, "account", translate("Account"), translate("Here You can specify the SIP account that you want to use."))
++s.anonymous = true
++s.addremove = true
++
++s:option(Value, "realm", translate("Realm"))
++s:option(Value, "username", translate("Username"))
++s:option(Value, "password", translate("Password"))
++s:option(Flag, "disabled", translate("Disabled"))
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/contact.lua b/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/contact.lua
+new file mode 100644
+index 0000000..b32fede
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/contact.lua
+@@ -0,0 +1,20 @@
++-- Copyright 2010 John Crispin <blogic@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("telephony", translate("VoIP"))
++m.on_after_commit = function() luci.sys.call("/etc/init.d/telephony reload") end
++
++s = m:section(TypedSection, "contact", translate("Contact"), translate("Here You can specify the SIP contacts that you want to use."))
++s.anonymous = true
++s.addremove = true
++s.template = "cbi/tsection"
++
++s:option(Value, "desc", translate("Name"))
++s:option(Value, "code", translate("Shortdial"))
++s:option(Value, "dial", translate("Dial"))
++
++t = s:option(ListValue, "type", translate("Type"))
++t:value("sip", "SIP")
++t:value("realm", "Landline")
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/admin_status/index/telephony.htm b/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/admin_status/index/telephony.htm
+new file mode 100644
+index 0000000..c7a58dd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/admin_status/index/telephony.htm
+@@ -0,0 +1 @@
++<%+telephony_status%>
+diff --git a/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm b/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm
+new file mode 100644
+index 0000000..d861ef9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm
+@@ -0,0 +1,32 @@
++<script type="text/javascript">//<![CDATA[
++XHR.poll(5, '<%=url('admin/telephony/status')%>', null,
++ function(x, st)
++ {
++ 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;
++ }
++ }
++);
++//]]></script>
++
++<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>
++</fieldset>
+diff --git a/feeds/luci/applications/luci-app-meshwizard/Makefile b/feeds/luci/applications/luci-app-meshwizard/Makefile
+new file mode 100644
+index 0000000..fb2610e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Shellscript based wizard to setup mesh networks
++LUCI_DEPENDS:=+meshwizard
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-meshwizard/luasrc/controller/meshwizard.lua b/feeds/luci/applications/luci-app-meshwizard/luasrc/controller/meshwizard.lua
+new file mode 100644
+index 0000000..0ad76b5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/luasrc/controller/meshwizard.lua
+@@ -0,0 +1,9 @@
++-- Copyright 2011 Manuel Munz <freifunk somakoma de>
++-- Licensed to the public under the Apache License 2.0.
++
++module "luci.controller.meshwizard"
++
++function index()
++ entry({"admin", "freifunk", "meshwizard"}, cbi("freifunk/meshwizard"), _("Mesh Wizard"), 40)
++end
++
+diff --git a/feeds/luci/applications/luci-app-meshwizard/luasrc/model/cbi/freifunk/meshwizard.lua b/feeds/luci/applications/luci-app-meshwizard/luasrc/model/cbi/freifunk/meshwizard.lua
+new file mode 100644
+index 0000000..68f7a5a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/luasrc/model/cbi/freifunk/meshwizard.lua
+@@ -0,0 +1,199 @@
++-- wizard rewrite wip
++
++local uci = require "luci.model.uci".cursor()
++local sys = require "luci.sys"
++local util = require "luci.util"
++local ip = require "luci.ip"
++
++local community = "profile_" .. (uci:get("freifunk", "community", "name") or "Freifunk")
++local mesh_network = ip.IPv4(uci:get_first(community, "community", "mesh_network") or "10.0.0.0/8")
++local community_ipv6 = uci:get_first(community, "community", "ipv6") or 0
++local community_ipv6mode = uci:get_first(community, "community", "ipv6_config") or "static"
++local meshkit_ipv6 = uci:get("meshwizard", "ipv6", "enabled") or 0
++local community_vap = uci:get_first(community, "community", "vap") or 0
++
++m = Map("meshwizard", translate("Wizard"), translate("This wizard will assist you in setting up your router for Freifunk " ..
++ "or another similar wireless community network."))
++
++n = m:section(NamedSection, "netconfig", nil, translate("Interfaces"))
++n.anonymous = true
++
++-- common functions
++
++function cbi_configure(device)
++ local configure = n:taboption(device, Flag, device .. "_config", translate("Configure this interface"),
++ translate("Note: this will set up this interface for mesh operation, i.e. add it to zone 'freifunk' and enable olsr."))
++end
++
++function cbi_ip4addr(device)
++ local ip4addr = n:taboption(device, Value, device .. "_ip4addr", translate("Mesh IP address"),
++ translate("This is a unique address in the mesh (e.g. 10.1.1.1) and has to be registered at your local community."))
++ ip4addr:depends(device .. "_config", 1)
++ ip4addr.datatype = "ip4addr"
++ function ip4addr.validate(self, value)
++ local x = ip.IPv4(value)
++ if mesh_network:contains(x) then
++ return value
++ else
++ return nil, translate("The given IP address is not inside the mesh network range ") ..
++ "(" .. mesh_network:string() .. ")."
++ end
++ end
++end
++
++function cbi_ip6addr(device)
++ local ip6addr = n:taboption(device, Value, device .. "_ip6addr", translate("Mesh IPv6 address"),
++ translate("This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and has to be registered at your local community."))
++ ip6addr:depends(device .. "_config", 1)
++ ip6addr.datatype = "ip6addr"
++end
++
++
++function cbi_dhcp(device)
++ local dhcp = n:taboption(device, Flag, device .. "_dhcp", translate("Enable DHCP"),
++ translate("DHCP will automatically assign ip addresses to clients"))
++ dhcp:depends(device .. "_config", 1)
++ dhcp.rmempty = true
++end
++
++function cbi_ra(device)
++ local ra = n:taboption(device, Flag, device .. "_ipv6ra", translate("Enable RA"),
++ translate("Send router advertisements on this device."))
++ ra:depends(device .. "_config", 1)
++ ra.rmempty = true
++end
++
++function cbi_dhcprange(device)
++ local dhcprange = n:taboption(device, Value, device .. "_dhcprange", translate("DHCP IP range"),
++ translate("The IP range from which clients are assigned ip addresses (e.g. 10.1.2.1/28). " ..
++ "If this is a range inside your mesh network range, then it will be announced as HNA. Any other range will use NAT. " ..
++ "If left empty then the defaults from the community profile will be used."))
++ dhcprange:depends(device .. "_dhcp", "1")
++ dhcprange.rmempty = true
++ dhcprange.datatype = "ip4addr"
++end
++-- create tabs and config for wireless
++local nets={}
++uci:foreach("wireless", "wifi-device", function(section)
++ local device = section[".name"]
++ table.insert(nets, device)
++end)
++
++local wired_nets = {}
++uci:foreach("network", "interface", function(section)
++ local device = section[".name"]
++ if not util.contains(nets, device) and device ~= "loopback" and not device:find("wireless") then
++ table.insert(nets, device)
++ table.insert(wired_nets, device)
++ end
++end)
++
++for _, net in util.spairs(nets, function(a,b) return (nets[a] < nets[b]) end) do
++ n:tab(net, net)
++end
++
++-- create cbi config for wireless
++uci:foreach("wireless", "wifi-device", function(section)
++ local device = section[".name"]
++ local hwtype = section.type
++ local syscc = section.country or uci:get(community, "wifi_device", "country") or
++ uci:get("freifunk", "wifi_device", "country")
++
++ cbi_configure(device)
++
++ -- Channel selection
++
++ if hwtype == "atheros" then
++ local cc = util.trim(sys.exec("grep -i '" .. syscc .. "' /lib/wifi/cc_translate.txt |cut -d ' ' -f 2")) or 0
++ sys.exec('"echo " .. cc .. " > /proc/sys/dev/" .. device .. "/countrycode"')
++ elseif hwtype == "mac80211" then
++ sys.exec("iw reg set " .. syscc)
++ elseif hwtype == "broadcom" then
++ sys.exec ("wlc country " .. syscc)
++ end
++
++ local chan = n:taboption(device, ListValue, device .. "_channel", translate("Channel"),
++ translate("Your device and neighbouring nodes have to use the same channel."))
++ chan:depends(device .. "_config", 1)
++ chan:value('default')
++
++ local iwinfo = sys.wifi.getiwinfo(device)
++ if iwinfo and iwinfo.freqlist then
++ for _, f in ipairs(iwinfo.freqlist) do
++ if not f.restricted then
++ chan:value(f.channel)
++ end
++ end
++ end
++ -- IPv4 address
++ cbi_ip4addr(device)
++
++ -- DHCP enable
++ cbi_dhcp(device)
++
++ -- DHCP range
++ cbi_dhcprange(device)
++
++ -- IPv6 addr and RA
++ if community_ipv6 == "1" then
++ if community_ipv6mode == "static" then
++ cbi_ip6addr(device)
++ end
++ cbi_ra(device)
++ end
++
++ -- Enable VAP
++ local supports_vap = 0
++ if sys.call("/usr/bin/meshwizard/helpers/supports_vap.sh " .. device .. " " .. hwtype) == 0 then
++ supports_vap = 1
++ end
++ if supports_vap == 1 then
++ local vap = n:taboption(device, Flag, device .. "_vap", translate("Virtual Access Point (VAP)"),
++ translate("This will setup a new virtual wireless interface in Access Point mode."))
++ vap:depends(device .. "_dhcp", "1")
++ vap.rmempty = true
++ if community_vap == "1" then
++ vap.default = "1"
++ end
++ end
++end)
++
++for _, device in pairs(wired_nets) do
++ cbi_configure(device)
++ cbi_ip4addr(device)
++ cbi_dhcp(device)
++ cbi_dhcprange(device)
++ -- IPv6 addr and RA
++ if community_ipv6 == "1" then
++ if community_ipv6mode == "static" then
++ cbi_ip6addr(device)
++ end
++ cbi_ra(device)
++ end
++end
++
++-- General settings
++g = m:section(TypedSection, "general", translate("General Settings"))
++g.anonymous = true
++
++local cleanup = g:option(Flag, "cleanup", translate("Cleanup config"),
++ translate("If this is selected then config is cleaned before setting new config options."))
++cleanup.default = "1"
++
++local restrict = g:option(Flag, "local_restrict", translate("Protect LAN"),
++ translate("Check this to protect your LAN from other nodes or clients") .. " (" .. translate("recommended") .. ").")
++
++local share = g:option(Flag, "sharenet", translate("Share your internet connection"),
++ translate("Select this to allow others to use your connection to access the internet."))
++ share.rmempty = true
++
++-- IPv6 config
++if community_ipv6 == "1" then
++ v6 = m:section(NamedSection, "ipv6", nil, translate("IPv6 Settings"))
++ local enabled = v6:option(Flag, "enabled", translate("Enabled"),
++ translate("Activate or deactivate IPv6 config globally."))
++ enabled.default = meshkit_ipv6
++ enabled.rmempty = false
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/ca/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/ca/meshwizard.po
+new file mode 100644
+index 0000000..6d7bf93
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/ca/meshwizard.po
+@@ -0,0 +1,144 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2014-06-01 23:43+0200\n"
++"PO-Revision-Date: 2014-07-01 06:11+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr "Activa o desactiva la configuració IPv6 globalment."
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr "Neteja la configuració"
++
++msgid "Configure this interface"
++msgstr "Configura aquesta interfície"
++
++msgid "DHCP IP range"
++msgstr "Rang IP de DHCP"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "DHCP assignarà automàticament adreces IP als clients"
++
++msgid "Enable DHCP"
++msgstr "Habilita DHCP"
++
++msgid "Enable RA"
++msgstr "Habilita RA"
++
++msgid "Enabled"
++msgstr "Habilitat"
++
++msgid "General Settings"
++msgstr "Ajusts generals"
++
++msgid "IPv6 Settings"
++msgstr "Ajusts IPv6"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++"Si això està seleccionat, la configuració es neteja abans d'establir noves "
++"opcions de configuració."
++
++msgid "Interfaces"
++msgstr "Interfícies"
++
++msgid "Mesh IP address"
++msgstr "Adreça IP en malla"
++
++msgid "Mesh IPv6 address"
++msgstr "Adreça IPv6 en malla"
++
++msgid "Mesh Wizard"
++msgstr "Ajudant de malla"
++
++#, fuzzy
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++"Nota: això configurarà aquesta interfície per a operació en malla, és a dir, "
++"la afegirà a la zona 'freifunk' i habilitarà l'OLSR."
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++"Seleccioneu aquesta opció per permetre que altres utilitzin la vostra "
++"connexió per accedir a Internet."
++
++msgid "Send router advertisements on this device."
++msgstr "Envia publicitats d'encaminador en aquest dispositiu."
++
++msgid "Share your internet connection"
++msgstr "Comparteix la vostra connexió a Internet"
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++"El rang IP del qual s'assignen adreces IP als clients (per exemple, "
++"10.1.2.1/28). Si aquest és un rang dins del vostre rang de xarxa en malla, "
++"s'anunciarà com HNA. Qualsevol altre rang utilitzarà NAT. Si deixat en "
++"blanc, els valors per defecte del perfil comunitari s'utilitzaran."
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr "L'adreça IP donada no està dins del rang de la xarxa en malla"
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++"Aquesta és una adreça IPv4 única en notació CIDR (per exemple, "
++"2001:1:2:3::1/64) i ha de ser registrada a la vostra comunitat local."
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++"Aquesta és una adreça única en la malla (per exemple, 10.1.1.1) i ha de ser "
++"registrada a la vostra comunitat local."
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++"Això configurarà una nova interfície sense fil virtual en mode de punt "
++"d'accés."
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++"Aquest ajudant us ajudarà a configurar el vostre encaminador per al Freifunk "
++"o altre xarxa comunitària sense fil similar."
++
++msgid "Virtual Access Point (VAP)"
++msgstr "Punt d'accés virtual (VAP)"
++
++msgid "Wizard"
++msgstr "Ajudant"
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++"El vostre dispositiu i els nodes veïns han d'utilitzar el mateix canal."
++
++msgid "recommended"
++msgstr "recomanat"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/cs/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/cs/meshwizard.po
+new file mode 100644
+index 0000000..b1253d0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/cs/meshwizard.po
+@@ -0,0 +1,122 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-21 14:39+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr "Kanál"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr "Nastavit toto rozhraní"
++
++msgid "DHCP IP range"
++msgstr "DHCP IP rozsah"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr "Povolit DHCP"
++
++msgid "Enable RA"
++msgstr "Povolit RA"
++
++msgid "Enabled"
++msgstr "Povoleno"
++
++msgid "General Settings"
++msgstr "Obecné nastavení"
++
++msgid "IPv6 Settings"
++msgstr "Nastavení IPv6"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Rozhraní"
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr "Průvodce mesh"
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr "Ochrana LAN"
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr "Sdílet vaše internetové připojení"
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr "Virtuální přístupový bod (VAP)"
++
++msgid "Wizard"
++msgstr "Průvodce"
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr "doporuÄeno"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/de/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/de/meshwizard.po
+new file mode 100644
+index 0000000..ef7ba8a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/de/meshwizard.po
+@@ -0,0 +1,145 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-06-26 15:36+0200\n"
++"PO-Revision-Date: 2012-11-21 20:51+0200\n"
++"Last-Translator: Jo-Philipp <jow@openwrt.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr "IPv6 global aktivieren oder deaktivieren"
++
++msgid "Channel"
++msgstr "Kanal"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++"Aktivieren um Zugriff auf das LAN von anderen Knoten oder Clients zu "
++"verhindern"
++
++msgid "Cleanup config"
++msgstr "Konfiguration aufräumen"
++
++msgid "Configure this interface"
++msgstr "Diese Schnittstelle einrichten"
++
++msgid "DHCP IP range"
++msgstr "DHCP-Adressbereich"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "DHCP vergibt automatisch IP-Adressen an Clients"
++
++msgid "Enable DHCP"
++msgstr "DHCP aktivieren"
++
++msgid "Enable RA"
++msgstr "RAs aktivieren"
++
++msgid "Enabled"
++msgstr "Aktiviert"
++
++msgid "General Settings"
++msgstr "Allgemeine Einstellungen"
++
++msgid "IPv6 Settings"
++msgstr "IPv6 Einstellungen"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++"Wenn diese Option aktiviert wird, werden eventuell vorhandene Einstellungen "
++"aufgeräumt bevor neue Optionen gesetzt werden."
++
++msgid "Interfaces"
++msgstr "Schnittstellen"
++
++msgid "Mesh IP address"
++msgstr "Mesh-IP-Adresse"
++
++msgid "Mesh IPv6 address"
++msgstr "Mesh-IPv6-Adresse"
++
++msgid "Mesh Wizard"
++msgstr "Mesh-Assistent"
++
++#, fuzzy
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++"Hinweis: Dies konfiguriert die Schnittstelle für den Mesh-Betrieb, d.h. sie "
++"wird zur Freifunk-Zone hinzugefügt und OLSR eingerichtet."
++
++msgid "Protect LAN"
++msgstr "LAN schützen"
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++"Diese Option aktivieren um anderen den Zugriff auf die lokale "
++"Internetverbindung zu gestatten"
++
++msgid "Send router advertisements on this device."
++msgstr "Router-Advertisements auf dieser Schnittstelle senden"
++
++msgid "Share your internet connection"
++msgstr "Internetverbindung freigeben"
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++"Der Adressbereich, aus welchem den Clients IP-Adressen zugewiesen werden (z."
++"B. 10.1.2.1/28). Liegt dieser Adressbereich außerhalb des Mesh-Bereiches, "
++"dann wird dieser per HNA angekündigt. Leer lassen um den Standardwert aus "
++"dem Community-Profil zu verwenden."
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr "Die angegebene IP-Adresse ist nicht Teil des Mesh-Adressbereiches"
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++"Diese ist eine eindeutige IPv6-Adresse in CIDR-Notation (z.B. "
++"2001:1:2:3::1/64) welche bei der lokalen Community registriert werden muss."
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++"Dies ist die eindeutige IP-Adresse des Mesh-Knotens (z.B. 10.1.1.1). Diese "
++"muss bei der lokalen Community registriert werden."
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++"Dies richtet eine weitere, virtuelle WLAN-Schnittstelle im Access-Point-"
++"Modus ein."
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++"Der Assistent hilft beim Einrichten des Routers für ein Freifunk- oder "
++"ähnliches Wireless-Community-Netzwerk."
++
++msgid "Virtual Access Point (VAP)"
++msgstr "Virtueller Access-Point (VAP)"
++
++msgid "Wizard"
++msgstr "Assistent"
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr "Dieses Gerät und benachbarte Knoten müssen den selben Kanal verwenden."
++
++msgid "recommended"
++msgstr "empfohlen"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/el/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/el/meshwizard.po
+new file mode 100644
+index 0000000..1aeff1e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/el/meshwizard.po
+@@ -0,0 +1,124 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-03-18 15:14+0200\n"
++"PO-Revision-Date: 2012-03-31 15:40+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr "Κανάλι"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr "ΚαθαÏισμός Ïυθμίσεων"
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr "ΕνεÏγοποίηση DHCP"
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr "Γενικές Ρυθμίσεις"
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Διεπαφές"
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/en/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/en/meshwizard.po
+new file mode 100644
+index 0000000..a67c71f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/en/meshwizard.po
+@@ -0,0 +1,109 @@
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr ""
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/es/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/es/meshwizard.po
+new file mode 100644
+index 0000000..9471d42
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/es/meshwizard.po
+@@ -0,0 +1,137 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-08-23 22:25+0200\n"
++"PO-Revision-Date: 2012-11-24 10:22+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr "Activar o desactivar la configuración IPv6 globalmente."
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr "Proteger la LAN de otros nodos y clientes"
++
++msgid "Cleanup config"
++msgstr "Borrar configuración"
++
++msgid "Configure this interface"
++msgstr "Configurar esta interfaz"
++
++msgid "DHCP IP range"
++msgstr "Rango IP de DHCP"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "DHCP asignará direcciones IP automáticamente a los clientes"
++
++msgid "Enable DHCP"
++msgstr "Activar DHCP"
++
++msgid "Enable RA"
++msgstr "Activar RA"
++
++msgid "Enabled"
++msgstr "Activado"
++
++msgid "General Settings"
++msgstr "Configuración general"
++
++msgid "IPv6 Settings"
++msgstr "Configuración IPv6"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr "Borrar la configuración antes de establecer una nueva."
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Mesh IP address"
++msgstr "Dirección IP del mesh"
++
++msgid "Mesh IPv6 address"
++msgstr "Dirección IPv6 del mesh"
++
++msgid "Mesh Wizard"
++msgstr "Asistente del mesh"
++
++#, fuzzy
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++"Nota: esto configurará esta interfaz para uso mesh, es decir: la añadirá a "
++"la zona \"freifunk\" y activará OSLR."
++
++msgid "Protect LAN"
++msgstr "Proteger LAN"
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr "Permitir a otros usar su conexión para acceder a internet."
++
++msgid "Send router advertisements on this device."
++msgstr "Envía publicaciones de routers por este dispositivo."
++
++msgid "Share your internet connection"
++msgstr "Compartir su conexión a internet"
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++"Rango IP desde el que asignar direcciones IP (ej. 10.1.2.1/28). Si el rango "
++"está dentro del de la mesh se declarará como HNA. Cualquier otro rango usará "
++"NAT. Si se deja vación tomará el del perfil de la comunidad."
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr "Este rango IP no está dentro del de la red mesh"
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++"Dirección única IPv6 en notación CIDR (p.e.: 2001:1:2:3::1/64) y que tiene "
++"que estar registrada en su comunidad local."
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++"Esta dirección debe ser única en la mesh (ej. 10.1.1.1) y debe registrarse "
++"en su comunidad local."
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++"Configurar un nuevo interfaz virtual inalámbrico en modo punto de acceso."
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++"Este asistente le ayudará a configurar su ruter para Freifunk o una red "
++"comunitaria similar."
++
++msgid "Virtual Access Point (VAP)"
++msgstr "Punto de acceso virtual (VAP)"
++
++msgid "Wizard"
++msgstr "Asistente"
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr "Su dispositivo y los vecinos deben usar el mismo canal."
++
++msgid "recommended"
++msgstr "recomendado"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/fr/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/fr/meshwizard.po
+new file mode 100644
+index 0000000..c9f7b02
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/fr/meshwizard.po
+@@ -0,0 +1,139 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-11-23 22:20+0200\n"
++"PO-Revision-Date: 2011-11-23 22:20+0200\n"
++"Last-Translator: fredb <fblistes+luci@free.fr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr "Cochez ceci pour protéger votre réseau LAN des autres nœuds ou clients"
++
++msgid "Cleanup config"
++msgstr "Nettoyer la config"
++
++msgid "Configure this interface"
++msgstr "Configurer cette interface"
++
++msgid "DHCP IP range"
++msgstr "Gamme d'adresses IP pour DHCP"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "Le serveur DHCP donnera automatiquement des adresses IP aux clients"
++
++msgid "Enable DHCP"
++msgstr "Activer le serveur DHCP"
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr "Paramètres généraux"
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++"Si vous sélectionnez ceci, la configuration sera nettoyée avant de "
++"positionner de nouvelles options de configuration."
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Mesh IP address"
++msgstr "Adresse IP maillée"
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr "Assistant de Maillage"
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr "Protéger le LAN"
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++"Sélectionnez ceci pour permettre aux autres d'utiliser votre connexion pour "
++"accéder à Internet."
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr "Partager votre connexion Internet"
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++"La gamme d'adresses IP utilisée pour attribuer des adresses IP aux clients "
++"(par ex. 10.1.2.1/28). Si ce lot d'adresses est compris dans le réseau "
++"maillé, il sera annoncé comme HNA, sinon du NAT sera utilisé. Si ce champ "
++"reste vide, les valeurs par défaut du profil de la communauté seront "
++"utilisées."
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr "L'adresse IP donnée n'est pas dans le réseau maillé"
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++"C'est une adresse unique dans le réseau maillé (par ex. 10.1.1.1) et doit "
++"être enregistré dans votre communauté locale."
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++"Cela configurera une nouvelle interface sans-fil virtuelle en mode Point "
++"d'Accès."
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++"Cet assistant vous aidera à configurer votre routeur pour le réseau maillé "
++"Freifunk ou un autre réseau sans-fil communautaire du même genre."
++
++msgid "Virtual Access Point (VAP)"
++msgstr "Point d'accès virtuel (VAP)"
++
++msgid "Wizard"
++msgstr "Assistant"
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr "Votre matériel et les nœuds voisins doivent utiliser le même canal."
++
++msgid "recommended"
++msgstr "recommandé"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/he/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/he/meshwizard.po
+new file mode 100644
+index 0000000..acf5f10
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/he/meshwizard.po
+@@ -0,0 +1,119 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr ""
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/hu/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/hu/meshwizard.po
+new file mode 100644
+index 0000000..22aecce
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/hu/meshwizard.po
+@@ -0,0 +1,122 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-09 12:55+0200\n"
++"Last-Translator: Bgray <bgraygms@gmail.com>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr "Globális IPV6 konfiguráció aktiválása vagy kikapcsolása."
++
++msgid "Channel"
++msgstr "Csatorna"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr "DHCP Engedélyezése"
++
++msgid "Enable RA"
++msgstr "RA Engedélyezése"
++
++msgid "Enabled"
++msgstr "Engedélyezés"
++
++msgid "General Settings"
++msgstr "Ãltalános Beállítások"
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interfészek"
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/it/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/it/meshwizard.po
+new file mode 100644
+index 0000000..b1b9799
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/it/meshwizard.po
+@@ -0,0 +1,143 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-02-06 18:07+0200\n"
++"PO-Revision-Date: 2013-02-09 20:46+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr "Attivare o disattivare la configurazione IPv6 a livello globale."
++
++msgid "Channel"
++msgstr "Canale"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr "Abilita per proteggere la tua LAN da altri nodi o clienti"
++
++msgid "Cleanup config"
++msgstr "Ripulisci config"
++
++msgid "Configure this interface"
++msgstr "Configura questa interfaccia"
++
++msgid "DHCP IP range"
++msgstr "Range DHCP IP"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "DHCP assegnerà indirizzi ip ai client"
++
++msgid "Enable DHCP"
++msgstr "Abilità DHCP"
++
++msgid "Enable RA"
++msgstr "Attiva RA"
++
++msgid "Enabled"
++msgstr "Attivato"
++
++msgid "General Settings"
++msgstr "Impostazioni generali"
++
++msgid "IPv6 Settings"
++msgstr "Impostazioni IPv6"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++"Se questa opzione è selezionata, config viene pulita prima di nuove opzioni "
++"di configurazione."
++
++msgid "Interfaces"
++msgstr "Interfacce"
++
++msgid "Mesh IP address"
++msgstr "Rete indirizzo IP"
++
++msgid "Mesh IPv6 address"
++msgstr "Rete indirizzo IPv6"
++
++msgid "Mesh Wizard"
++msgstr "Configurazione Rete"
++
++#, fuzzy
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++"Nota: questo permette di configurare questa interfaccia per il funzionamento "
++"in rete, vale a dire aggiungere nella zona 'Freifunk' e consentire OLSR."
++
++msgid "Protect LAN"
++msgstr "Proteggi LAN"
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++"Selezionare per permettere ad altri di usare la tua connessione per accedere "
++"a internet."
++
++msgid "Send router advertisements on this device."
++msgstr "Inviare annunci router su questo dispositivo."
++
++msgid "Share your internet connection"
++msgstr "Condividi la tua connessione internet"
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++"Il range IP dal quale i client ricevono gli indirizzi (es. 10.1.2.1/28). Se "
++"questa subnet è all'interno della tua rete mesh, sarà annunciata as HNA. "
++"Ogni altro range userà il NAT. Se lasciato vuoto allora la scelta "
++"predefinita della community sarà usata."
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr "L'IP dato non è all'interno del range degli indirizzi di rete mesh"
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++"Si tratta di un indirizzo IPv6 unico in notazione CIDR (ad esempio "
++"2001:1:2:3::1/64) e deve essere registrato presso la comunità locale."
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++"Questo è un indirizzo univoco nella mesh (es. 10.1.1.1) e deve essere "
++"accordato con la tua community."
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++"Questo confgurerà una nuova interfaccia wireless virtuale in modalità Access "
++"Point."
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++"Questo wizard ti assisterà nel setup del tuo router per l'uso in una rete "
++"wireless comunitaria come Freifunk o Ninux."
++
++msgid "Virtual Access Point (VAP)"
++msgstr "Punto di Accesso Virtuale (VAP)"
++
++msgid "Wizard"
++msgstr "Creazione guidata"
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr "Il tuo device a i nodi confinanti devono sare lo stesso canale."
++
++msgid "recommended"
++msgstr "raccomandato"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/ja/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/ja/meshwizard.po
+new file mode 100644
+index 0000000..a67c71f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/ja/meshwizard.po
+@@ -0,0 +1,109 @@
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr ""
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/ms/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/ms/meshwizard.po
+new file mode 100644
+index 0000000..a67c71f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/ms/meshwizard.po
+@@ -0,0 +1,109 @@
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr ""
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/no/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/no/meshwizard.po
+new file mode 100644
+index 0000000..a67c71f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/no/meshwizard.po
+@@ -0,0 +1,109 @@
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr ""
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/pl/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/pl/meshwizard.po
+new file mode 100644
+index 0000000..79409aa
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/pl/meshwizard.po
+@@ -0,0 +1,147 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-04-19 21:15+0200\n"
++"PO-Revision-Date: 2014-04-23 19:18+0200\n"
++"Last-Translator: goodgod261 <goodgod261@wp.pl>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr "Aktywuj lub dezaktywuj ipv6 konfiguracja globalna"
++
++msgid "Channel"
++msgstr "Kanał"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++"Zaznacz, aby zabezpieczyć sieć lokalną przed innymi węzłami lub klientami "
++"sieci"
++
++msgid "Cleanup config"
++msgstr "Wyczyść konfigurację"
++
++msgid "Configure this interface"
++msgstr "Skonfiguruj ten interfejs"
++
++msgid "DHCP IP range"
++msgstr "Pula adresów DHCP"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "DHCP automatycznie przypisze adresy IP klientom"
++
++msgid "Enable DHCP"
++msgstr "WÅ‚Ä…cz DHCP"
++
++msgid "Enable RA"
++msgstr "WÅ‚Ä…cz RA"
++
++msgid "Enabled"
++msgstr "WÅ‚Ä…czone"
++
++msgid "General Settings"
++msgstr "Ustawienia ogólne"
++
++msgid "IPv6 Settings"
++msgstr "IPv6 Ustawienia"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++"Jeśli ta opcja jest zaznaczona to stara konfiguracja jest usuwana przed "
++"zapisaniem nowych opcji."
++
++msgid "Interfaces"
++msgstr "Interfejsy"
++
++msgid "Mesh IP address"
++msgstr "Adres Mesh IP"
++
++msgid "Mesh IPv6 address"
++msgstr "Adres Mech IPv6"
++
++msgid "Mesh Wizard"
++msgstr "Kreator Mesh"
++
++#, fuzzy
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++"Nota: To sÄ… ustawienia interfejsu mesh operacja i.e Dodawanie Strefy "
++"'Freifunk' oraz włączyć olsr"
++
++msgid "Protect LAN"
++msgstr "Chroń LAN"
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++"Zaznacz tę opcję aby inni użytkownicy mogli używać twojego połączenia do "
++"korzystania z internetu"
++
++msgid "Send router advertisements on this device."
++msgstr "Wyślij Routera Reklamę na urządzenie"
++
++msgid "Share your internet connection"
++msgstr "Współdziel swoje połączenie internetowe"
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++"Zakres adresów IP, z którego klientom są przypisywane adresy IP (np. "
++"10.1.2.1/28). Jeżeli jest to zakres wewnątrz twojej sieci mesh, wówczas "
++"zostanie rozgłoszony jako HNA. Każdy inny zakres będzie używać NAT. Jeżeli "
++"pozostanie pusty, wówczas zostanie użyty domyślny profil społeczności."
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr "Podany adres IP nie należy do zakresu sieci mesh"
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++"To jest unikalny adres IPv6 w notacji <abbr title=\"Classless Inter-Domain "
++"Routing\">CIDR</abbr> (np. 2001:1:2:3:1/64) i musi zostać zarejestrowany w "
++"Twojej lokalnej społeczności"
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++"Jest to unikalny adres w sieci mesh (np. 10.1.1.1) i musi być zarejestrowana "
++"w lokalnej społeczności."
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++"Ta opcja skonfiguruje nowy wirtualny interfejs bezprzewodowy w trybie Access "
++"Point`a"
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++"Ten kreator pomoże skonfigurować router do korzystania z Freifunk lub "
++"podobnej społecznej sieci bezprzewodowej (darmowe WiFi)"
++
++msgid "Virtual Access Point (VAP)"
++msgstr "Access Point Wirtualny (VAP)"
++
++msgid "Wizard"
++msgstr "Kreator"
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr "Twój router i sąsiedzkie węzły sieci używają tego samego kanału."
++
++msgid "recommended"
++msgstr "zalecane"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/pt-br/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/pt-br/meshwizard.po
+new file mode 100644
+index 0000000..a2238e5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/pt-br/meshwizard.po
+@@ -0,0 +1,150 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-10-11 00:23+0200\n"
++"PO-Revision-Date: 2014-03-17 10:01+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr "Habilita e desabilita a configuração IPv6 globalmente."
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++"Marque isto para proteger sua rede local (LAN) de outros nós ou clientes"
++
++msgid "Cleanup config"
++msgstr "Limpar configuração"
++
++msgid "Configure this interface"
++msgstr "Configure esta interface"
++
++msgid "DHCP IP range"
++msgstr "Faixa de IP do DHCP"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "O DHCP irá atribuir automaticamente endereços IP para os clientes"
++
++msgid "Enable DHCP"
++msgstr "Habilitar DHCP"
++
++msgid "Enable RA"
++msgstr ""
++"Habilitar <abbr title=\\\"Router Advertisement, Anúncio de Roteador\\\">RA</"
++"abbr>"
++
++msgid "Enabled"
++msgstr "Habilitado"
++
++msgid "General Settings"
++msgstr "Configurações Gerais"
++
++msgid "IPv6 Settings"
++msgstr "Configurações IPv6"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++"Se selecionado, a configuração é limpa antes de definir as novas opções de "
++"configuração."
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Mesh IP address"
++msgstr "Endereço IP da rede em malha"
++
++msgid "Mesh IPv6 address"
++msgstr "Endereço IPv6 da rede em malha"
++
++msgid "Mesh Wizard"
++msgstr "Assistente de Configuração da Rede em Malha"
++
++#, fuzzy
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++"Nota: Isto irá configurar a interface para operação em malha, p. ex. "
++"adicionar à zona 'freifunk' e ativar o OLSR. "
++
++msgid "Protect LAN"
++msgstr "Proteget Rede Local (LAN)"
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++"Selecione isto para permitir que outros usem sua conexão para acessar a "
++"internet."
++
++msgid "Send router advertisements on this device."
++msgstr ""
++"Envia <abbr title=\\\"Router Advertisement, Anúncio de Roteador\\\">RA</"
++"abbr> a partir deste dispositivo."
++
++msgid "Share your internet connection"
++msgstr "Compartilhar sua conexão com a internet"
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++"Faixa de endereços IP atribuídos aos clientes (ex: 10.1.2.1/28). Se esta "
++"faixa está dentro da faixa da rede em malha, então ela será anunciada no "
++"<abbr title=\"Host and network association, Associação de equipamentos e "
++"redes\">HNA</abbr>. Qualquer outra faixa irá utilizar NAT. Se deixada vazia, "
++"os padrões do perfil da comunidade será usada."
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++"O endereço IP informado não está na faixa de endereços da rede em malha"
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++"Este é um endereço IPv6 único na notação CIDR (ex: 2001:1:2:3::1/64) e deve "
++"ser registrado na sua comunidade local."
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++"Este é um endereço único na rede em malha (ex: 10.1.1.1) e tem que ser "
++"registrado na sua comunidade local."
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++"Isto configurará uma nova interface de rede sem fio virtual em modo de ponto "
++"de acesso."
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++"Este assistente irá ajudá-lo na configuração do seu roteador para Freifunk "
++"ou outra rede comunitária sem fio similar."
++
++msgid "Virtual Access Point (VAP)"
++msgstr "Ponto de Acesso Virtual (VAP)"
++
++msgid "Wizard"
++msgstr "Assistente"
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr "Seu dispositivo e os nós vizinhos devem utilizar o mesmo canal."
++
++msgid "recommended"
++msgstr "recomendado"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/pt/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/pt/meshwizard.po
+new file mode 100644
+index 0000000..4195769
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/pt/meshwizard.po
+@@ -0,0 +1,133 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-06-03 16:20+0200\n"
++"PO-Revision-Date: 2013-06-03 18:01+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr "Ativar ou desativar a configuração IPv6 globalmente."
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr "Marcar isto para proteger a sua LAN de outros nós ou clientes"
++
++msgid "Cleanup config"
++msgstr "Limpar configuração"
++
++msgid "Configure this interface"
++msgstr "Configurar esta interface"
++
++msgid "DHCP IP range"
++msgstr "Intervalo de IPs DHCP"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "O DHCP irá atribuir automaticamente endereços IP aos clientes"
++
++msgid "Enable DHCP"
++msgstr "Ativar DHCP"
++
++msgid "Enable RA"
++msgstr "Ativar RA"
++
++msgid "Enabled"
++msgstr "Ativo"
++
++msgid "General Settings"
++msgstr "Definições Gerais"
++
++msgid "IPv6 Settings"
++msgstr "Definições IPv6"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++"Se isto estiver selecionado a configuração é limpa antes de serem definidas "
++"novas opções na configuração."
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++#, fuzzy
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++"Nota: Isto irá configurar a interface para operação em malha, p. ex. "
++"adicionar à zona 'freifunk' e ativar OLSR."
++
++msgid "Protect LAN"
++msgstr "Proteger LAN"
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++"Ative isto para permitir que outros usem a sua ligação para aceder à "
++"internet."
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++"Irá ser configurado uma nova interface virtual wireless em modo de Ponto de "
++"Acesso."
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr "Ponto de Acesso Virtual (VAP)"
++
++msgid "Wizard"
++msgstr "Assistente"
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr "O seu dispositivo e os nós vizinhos têm de usar o mesmo canal."
++
++msgid "recommended"
++msgstr "recomendado"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/ro/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/ro/meshwizard.po
+new file mode 100644
+index 0000000..9f1c466
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/ro/meshwizard.po
+@@ -0,0 +1,126 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-29 19:55+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++"Bifeaza aici sa-ti protejezi reteaua locala LAN de alte noduri sau clienti"
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr "Configureaza aceasta interfata"
++
++msgid "DHCP IP range"
++msgstr "Plaja de adrese IP DHCP"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "DHCP va aloca automat adrese IP la clienti"
++
++msgid "Enable DHCP"
++msgstr "Activeaza DHCP"
++
++msgid "Enable RA"
++msgstr "Activează RA"
++
++msgid "Enabled"
++msgstr "Activat"
++
++msgid "General Settings"
++msgstr "Setări generale"
++
++msgid "IPv6 Settings"
++msgstr "Setări IPv6"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interfete"
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr "Protejeaza reteaua locala LAN"
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++"Selecteaza aici ca sa permiti si altora sa-ti foloseasca si ei conexiunea ta "
++"de Internet."
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr "Partajeaza cu altii conexiunea ta de Internet"
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr "recomandat"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/ru/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/ru/meshwizard.po
+new file mode 100644
+index 0000000..876ac36
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/ru/meshwizard.po
+@@ -0,0 +1,150 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: meshwizard\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-07-20 09:47+0200\n"
++"PO-Revision-Date: 2013-09-06 09:43+0200\n"
++"Last-Translator: datasheet <michael.gritsaenko@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++#, fuzzy
++msgid "Activate or deactivate IPv6 config globally."
++msgstr "Ðктивировать или деактивировать глобальную конфигурацию IPv6."
++
++msgid "Channel"
++msgstr "Канал"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++"Включите Ñту опцию, чтобы защитить локальную Ñеть от других узлов или "
++"клиентов"
++
++msgid "Cleanup config"
++msgstr "ОчиÑтить конфигурацию"
++
++msgid "Configure this interface"
++msgstr "ÐаÑтроить Ñтот интерфейÑ"
++
++msgid "DHCP IP range"
++msgstr "Диапазон IP-адреÑов DHCP"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "DHCP автоматичеÑки назначит IP-адреÑа клиентам"
++
++msgid "Enable DHCP"
++msgstr "Включить DHCP"
++
++msgid "Enable RA"
++msgstr "Разрешить ICMPv6-ответ \"Router Advertisement\""
++
++msgid "Enabled"
++msgstr "Включен"
++
++msgid "General Settings"
++msgstr "Общие наÑтройки"
++
++msgid "IPv6 Settings"
++msgstr "ÐаÑтройки IPv6"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++"ЕÑли Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°, то ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‡Ð¸Ñ‰Ð°ÐµÑ‚ÑÑ Ð¿ÐµÑ€ÐµÐ´ уÑтановкой новых "
++"наÑтроек."
++
++msgid "Interfaces"
++msgstr "ИнтерфейÑÑ‹"
++
++msgid "Mesh IP address"
++msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ñчейки"
++
++msgid "Mesh IPv6 address"
++msgstr "IPv6-Ð°Ð´Ñ€ÐµÑ Ð² mesh-Ñети"
++
++# предлагаю иÑпользовать именно термин "mesh-Ñеть", Ñ‚.к. руÑÑкий аналог Ñтого понÑÑ‚Ð¸Ñ Ñлишком длинный (Ñеть Ñ ÑчеиÑтой топологиейб ÑчеиÑÑ‚Ð°Ñ Ñеть)
++msgid "Mesh Wizard"
++msgstr "МаÑтер наÑтройки ÑчеиÑтой Ñети"
++
++#, fuzzy
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++"Примечание: Ñта Ð¾Ð¿Ñ†Ð¸Ñ ÑƒÑтановит данный Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð² режим работы Ñ mesh-"
++"ÑетÑми, Ñ‚.е. добавит его в зону ''freifunk' (\"free wireless radio\") и "
++"включит протокол OLSR."
++
++msgid "Protect LAN"
++msgstr "Защита LAN"
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++"Включите Ñту опцию, чтобы позволить другим клиентам иÑпользовать ваше "
++"подключение к интернету."
++
++msgid "Send router advertisements on this device."
++msgstr "ПоÑылать ICMPv6 ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ \"Router Advertisement\" на Ñто уÑтройÑтво"
++
++msgid "Share your internet connection"
++msgstr "Сделать интернет-подключение общедоÑтупным"
++
++# HNA - Home Network Announcement
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++"Диапазон IP-адреÑов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°Ð¼Ð¸ Ñети (например 10.1.2.1/28). "
++"ЕÑли указанный диапазон находитÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ вашей Ñети, тогда он будет объÑвлен "
++"как HNA. Любой другой диапазон будет иÑпользовать NAT. Ð’ Ñлучае пуÑтого "
++"значение будут иÑпользоватьÑÑ Ñтандартные наÑтройки."
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr "Заданный IP-Ð°Ð´Ñ€ÐµÑ Ð½Ðµ находитÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ ÑчеиÑтой Ñети"
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++"Это уникальный Ð°Ð´Ñ€ÐµÑ Ð² ÑчеиÑтой Ñети (например 10.1.1.1), который должен "
++"быть зарегиÑтрирован в вашем меÑтном ÑообщеÑтве."
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++"Будет произведена наÑтройка новой виртуальной беÑпроводной Ñети в режиме "
++"точки доÑтупа."
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++"Данный маÑтер поможет наÑтроить ваш маршрутизатор Ð´Ð»Ñ Ñети Freifunk или "
++"другой подобной беÑпроводной Ñети."
++
++msgid "Virtual Access Point (VAP)"
++msgstr "Ð’Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° доÑтупа (VAP)"
++
++msgid "Wizard"
++msgstr "МаÑтер уÑтановки"
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++"Ваше уÑтройÑтво и ÑоÑедние узлы должны иÑпользовать один и тот же канал."
++
++msgid "recommended"
++msgstr "рекомендуетÑÑ"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/sk/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/sk/meshwizard.po
+new file mode 100644
+index 0000000..c86708a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/sk/meshwizard.po
+@@ -0,0 +1,119 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr ""
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/sv/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/sv/meshwizard.po
+new file mode 100644
+index 0000000..b898024
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/sv/meshwizard.po
+@@ -0,0 +1,120 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr ""
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/templates/meshwizard.pot b/feeds/luci/applications/luci-app-meshwizard/po/templates/meshwizard.pot
+new file mode 100644
+index 0000000..9dfdec5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/templates/meshwizard.pot
+@@ -0,0 +1,112 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr ""
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/tr/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/tr/meshwizard.po
+new file mode 100644
+index 0000000..92cabd4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/tr/meshwizard.po
+@@ -0,0 +1,119 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr ""
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/uk/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/uk/meshwizard.po
+new file mode 100644
+index 0000000..9a317b7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/uk/meshwizard.po
+@@ -0,0 +1,126 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-09-21 15:47+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr "Канал"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr "DHCP IP-діапазон"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "DHCP автоматично призначить IP-адреÑи клієнтам"
++
++msgid "Enable DHCP"
++msgstr "Ðктивувати DHCP"
++
++msgid "Enable RA"
++msgstr "Ðктивувати RA"
++
++msgid "Enabled"
++msgstr "Ðктивувати"
++
++msgid "General Settings"
++msgstr "Загальні налаштуваннÑ"
++
++msgid "IPv6 Settings"
++msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ IPv6"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr "ІнтерфейÑи"
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr "ЗахиÑÑ‚ локальної мережі"
++
++#, fuzzy
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++"Оберіть це, щоб дозволити іншим викориÑтовувати з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð´Ð¾Ñтупу в "
++"Інтернет."
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/vi/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/vi/meshwizard.po
+new file mode 100644
+index 0000000..a67c71f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/vi/meshwizard.po
+@@ -0,0 +1,109 @@
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr ""
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/zh-cn/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/zh-cn/meshwizard.po
+new file mode 100644
+index 0000000..d5d0707
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/zh-cn/meshwizard.po
+@@ -0,0 +1,126 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-09-24 18:01+0200\n"
++"PO-Revision-Date: 2014-03-25 04:25+0200\n"
++"Last-Translator: hewenhao <hewenhao2008@sina.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr "å¯ç”¨æˆ–åœç”¨å…¨çƒIPv6设置"
++
++msgid "Channel"
++msgstr "频é“"
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr "选择此项,隔离其他节点或客户端的攻击æ¥ä¿æŠ¤ä½ çš„局域网"
++
++msgid "Cleanup config"
++msgstr "清空é…ç½®"
++
++msgid "Configure this interface"
++msgstr "é…置当å‰ç•Œé¢"
++
++msgid "DHCP IP range"
++msgstr "DHCP IP 范围"
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr "DHCP将自动给客户端分é…IP地å€"
++
++msgid "Enable DHCP"
++msgstr "å¯åŠ¨DHCP"
++
++msgid "Enable RA"
++msgstr "å¯ç”¨RA"
++
++msgid "Enabled"
++msgstr "å¯ç”¨"
++
++msgid "General Settings"
++msgstr "总体设置"
++
++msgid "IPv6 Settings"
++msgstr "IPv6设置"
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr "如果此项被选中,在设置新选项之å‰ï¼Œé…置将被清空。"
++
++msgid "Interfaces"
++msgstr "ç•Œé¢"
++
++msgid "Mesh IP address"
++msgstr "Mesh IP 地å€"
++
++msgid "Mesh IPv6 address"
++msgstr "Mesh IPv6地å€"
++
++msgid "Mesh Wizard"
++msgstr "Mesh 导引"
++
++#, fuzzy
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr "注æ„:这将为meshæ“作建立一个接å£ï¼Œå¦‚:增加到‘freifunk’区域并使能olsr"
++
++msgid "Protect LAN"
++msgstr "ä¿æŠ¤LANå£"
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr "选择这项æ¥å…许其它程åºç”¨ä½ è¿™ä¸ªè¿žæŽ¥æ¥æŽ¥å…¥å› ç‰¹ç½‘"
++
++#, fuzzy
++msgid "Send router advertisements on this device."
++msgstr "在这个设备上å‘é€è·¯ç”±å¹¿æ’­"
++
++msgid "Share your internet connection"
++msgstr "分享你的Internet连接"
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr "这将会在接入点模å¼è®¾ç½®ä¸€ä¸ªæ–°çš„虚拟无线网络接å£"
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr "虚拟接入点"
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr "推è"
+diff --git a/feeds/luci/applications/luci-app-meshwizard/po/zh-tw/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/zh-tw/meshwizard.po
+new file mode 100644
+index 0000000..a4d29e8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/po/zh-tw/meshwizard.po
+@@ -0,0 +1,118 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Activate or deactivate IPv6 config globally."
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check this to protect your LAN from other nodes or clients"
++msgstr ""
++
++msgid "Cleanup config"
++msgstr ""
++
++msgid "Configure this interface"
++msgstr ""
++
++msgid "DHCP IP range"
++msgstr ""
++
++msgid "DHCP will automatically assign ip addresses to clients"
++msgstr ""
++
++msgid "Enable DHCP"
++msgstr ""
++
++msgid "Enable RA"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid ""
++"If this is selected then config is cleaned before setting new config options."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Mesh IP address"
++msgstr ""
++
++msgid "Mesh IPv6 address"
++msgstr ""
++
++msgid "Mesh Wizard"
++msgstr ""
++
++msgid ""
++"Note: this will set up this interface for mesh operation, i.e. add it to "
++"zone 'freifunk' and enable olsr."
++msgstr ""
++
++msgid "Protect LAN"
++msgstr ""
++
++msgid ""
++"Select this to allow others to use your connection to access the internet."
++msgstr ""
++
++msgid "Send router advertisements on this device."
++msgstr ""
++
++msgid "Share your internet connection"
++msgstr ""
++
++msgid ""
++"The IP range from which clients are assigned ip addresses (e.g. "
++"10.1.2.1/28). If this is a range inside your mesh network range, then it "
++"will be announced as HNA. Any other range will use NAT. If left empty then "
++"the defaults from the community profile will be used."
++msgstr ""
++
++msgid "The given IP address is not inside the mesh network range"
++msgstr ""
++
++msgid ""
++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and "
++"has to be registered at your local community."
++msgstr ""
++
++msgid ""
++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be "
++"registered at your local community."
++msgstr ""
++
++msgid "This will setup a new virtual wireless interface in Access Point mode."
++msgstr ""
++
++msgid ""
++"This wizard will assist you in setting up your router for Freifunk or "
++"another similar wireless community network."
++msgstr ""
++
++msgid "Virtual Access Point (VAP)"
++msgstr ""
++
++msgid "Wizard"
++msgstr ""
++
++msgid "Your device and neighbouring nodes have to use the same channel."
++msgstr ""
++
++msgid "recommended"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-meshwizard/root/etc/uci-defaults/meshwizard b/feeds/luci/applications/luci-app-meshwizard/root/etc/uci-defaults/meshwizard
+new file mode 100644
+index 0000000..6ceb1b7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-meshwizard/root/etc/uci-defaults/meshwizard
+@@ -0,0 +1,8 @@
++#!/bin/sh
++uci batch <<EOF
++set ucitrack.meshwizard="meshwizard"
++set ucitrack.meshwizard.exec="/usr/bin/meshwizard/wizard.sh"
++commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
+diff --git a/feeds/luci/applications/luci-app-minidlna/Makefile b/feeds/luci/applications/luci-app-minidlna/Makefile
+new file mode 100644
+index 0000000..4790aa3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for miniDLNA
++LUCI_DEPENDS:=+minidlna
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-minidlna/luasrc/controller/minidlna.lua b/feeds/luci/applications/luci-app-minidlna/luasrc/controller/minidlna.lua
+new file mode 100644
+index 0000000..9200796
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/luasrc/controller/minidlna.lua
+@@ -0,0 +1,46 @@
++-- Copyright 2012 Gabor Juhos <juhosg@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.minidlna", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/minidlna") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "services", "minidlna"}, cbi("minidlna"), _("miniDLNA"))
++ page.dependent = true
++
++ entry({"admin", "services", "minidlna_status"}, call("minidlna_status"))
++end
++
++function minidlna_status()
++ local sys = require "luci.sys"
++ local uci = require "luci.model.uci".cursor()
++ local port = tonumber(uci:get_first("minidlna", "minidlna", "port"))
++
++ local status = {
++ running = (sys.call("pidof minidlna >/dev/null") == 0),
++ audio = 0,
++ video = 0,
++ image = 0
++ }
++
++ if status.running then
++ local fd = sys.httpget("http://127.0.0.1:%d/" % (port or 8200), true)
++ if fd then
++ local html = fd:read("*a")
++ if html then
++ status.audio = (tonumber(html:match("Audio files</td><td>(%d+)")) or 0)
++ status.video = (tonumber(html:match("Video files</td><td>(%d+)")) or 0)
++ status.image = (tonumber(html:match("Image files</td><td>(%d+)")) or 0)
++ end
++ fd:close()
++ end
++ end
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(status)
++end
+diff --git a/feeds/luci/applications/luci-app-minidlna/luasrc/model/cbi/minidlna.lua b/feeds/luci/applications/luci-app-minidlna/luasrc/model/cbi/minidlna.lua
+new file mode 100644
+index 0000000..99ef68c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/luasrc/model/cbi/minidlna.lua
+@@ -0,0 +1,165 @@
++-- Copyright 2012 Gabor Juhos <juhosg@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local m, s, o
++
++m = Map("minidlna", translate("miniDLNA"),
++ translate("MiniDLNA is server software with the aim of being fully compliant with DLNA/UPnP-AV clients."))
++
++m:section(SimpleSection).template = "minidlna_status"
++
++s = m:section(TypedSection, "minidlna", "miniDLNA Settings")
++s.addremove = false
++s.anonymous = true
++
++s:tab("general", translate("General Settings"))
++s:tab("advanced", translate("Advanced Settings"))
++
++o = s:taboption("general", Flag, "enabled", translate("Enable:"))
++o.rmempty = false
++
++function o.cfgvalue(self, section)
++ return luci.sys.init.enabled("minidlna") and self.enabled or self.disabled
++end
++
++function o.write(self, section, value)
++ if value == "1" then
++ luci.sys.init.enable("minidlna")
++ luci.sys.call("/etc/init.d/minidlna start >/dev/null")
++ else
++ luci.sys.call("/etc/init.d/minidlna stop >/dev/null")
++ luci.sys.init.disable("minidlna")
++ end
++
++ return Flag.write(self, section, value)
++end
++
++o = s:taboption("general", Value, "port", translate("Port:"),
++ translate("Port for HTTP (descriptions, SOAP, media transfer) traffic."))
++o.datatype = "port"
++o.default = 8200
++
++
++o = s:taboption("general", Value, "interface", translate("Interfaces:"),
++ translate("Network interfaces to serve."))
++
++o.template = "cbi/network_ifacelist"
++o.widget = "checkbox"
++o.nocreate = true
++
++function o.cfgvalue(self, section)
++ local rv = { }
++ local val = Value.cfgvalue(self, section)
++ if val then
++ local ifc
++ for ifc in val:gmatch("[^,%s]+") do
++ rv[#rv+1] = ifc
++ end
++ end
++ return rv
++end
++
++function o.write(self, section, value)
++ local rv = { }
++ local ifc
++ for ifc in luci.util.imatch(value) do
++ rv[#rv+1] = ifc
++ end
++ Value.write(self, section, table.concat(rv, ","))
++end
++
++
++o = s:taboption("general", Value, "friendly_name", translate("Friendly name:"),
++ translate("Set this if you want to customize the name that shows up on your clients."))
++o.rmempty = true
++o.placeholder = "OpenWrt DLNA Server"
++
++o = s:taboption("advanced", Value, "db_dir", translate("Database directory:"),
++ translate("Set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache."))
++o.rmempty = true
++o.placeholder = "/var/cache/minidlna"
++
++o = s:taboption("advanced", Value, "log_dir", translate("Log directory:"),
++ translate("Set this if you would like to specify the directory where you want MiniDLNA to store its log file."))
++o.rmempty = true
++o.placeholder = "/var/log"
++
++s:taboption("advanced", Flag, "inotify", translate("Enable inotify:"),
++ translate("Set this to enable inotify monitoring to automatically discover new files."))
++
++s:taboption("advanced", Flag, "enable_tivo", translate("Enable TIVO:"),
++ translate("Set this to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO."))
++o.rmempty = true
++
++o = s:taboption("advanced", Flag, "strict_dlna", translate("Strict to DLNA standard:"),
++ translate("Set this to strictly adhere to DLNA standards. This will allow server-side downscaling of very large JPEG images, which may hurt JPEG serving performance on (at least) Sony DLNA products."))
++o.rmempty = true
++
++o = s:taboption("advanced", Value, "presentation_url", translate("Presentation URL:"))
++o.rmempty = true
++o.placeholder = "http://192.168.1.1/"
++
++o = s:taboption("advanced", Value, "notify_interval", translate("Notify interval:"),
++ translate("Notify interval in seconds."))
++o.datatype = "uinteger"
++o.placeholder = 900
++
++o = s:taboption("advanced", Value, "serial", translate("Announced serial number:"),
++ translate("Serial number the miniDLNA daemon will report to clients in its XML description."))
++o.placeholder = "12345678"
++
++s:taboption("advanced", Value, "model_number", translate("Announced model number:"),
++ translate("Model number the miniDLNA daemon will report to clients in its XML description."))
++o.placholder = "1"
++
++o = s:taboption("advanced", Value, "minissdpsocket", translate("miniSSDP socket:"),
++ translate("Specify the path to the MiniSSDPd socket."))
++o.rmempty = true
++o.placeholder = "/var/run/minissdpd.sock"
++
++o = s:taboption("general", ListValue, "root_container", translate("Root container:"))
++o:value(".", translate("Standard container"))
++o:value("B", translate("Browse directory"))
++o:value("M", translate("Music"))
++o:value("V", translate("Video"))
++o:value("P", translate("Pictures"))
++
++
++s:taboption("general", DynamicList, "media_dir", translate("Media directories:"),
++ translate("Set this to the directory you want scanned. If you want to restrict the directory to a specific content type, you can prepend the type ('A' for audio, 'V' for video, 'P' for images), followed by a comma, to the directory (eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."))
++
++
++o = s:taboption("general", DynamicList, "album_art_names", translate("Album art names:"),
++ translate("This is a list of file names to check for when searching for album art."))
++o.rmempty = true
++o.placeholder = "Cover.jpg"
++
++function o.cfgvalue(self, section)
++ local rv = { }
++
++ local val = Value.cfgvalue(self, section)
++ if type(val) == "table" then
++ val = table.concat(val, "/")
++ elseif not val then
++ val = ""
++ end
++
++ local file
++ for file in val:gmatch("[^/%s]+") do
++ rv[#rv+1] = file
++ end
++
++ return rv
++end
++
++function o.write(self, section, value)
++ local rv = { }
++ local file
++ for file in luci.util.imatch(value) do
++ rv[#rv+1] = file
++ end
++ Value.write(self, section, table.concat(rv, "/"))
++end
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-minidlna/luasrc/view/admin_status/index/minidlna.htm b/feeds/luci/applications/luci-app-minidlna/luasrc/view/admin_status/index/minidlna.htm
+new file mode 100644
+index 0000000..b2feeb2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/luasrc/view/admin_status/index/minidlna.htm
+@@ -0,0 +1 @@
++<%+minidlna_status%>
+diff --git a/feeds/luci/applications/luci-app-minidlna/luasrc/view/minidlna_status.htm b/feeds/luci/applications/luci-app-minidlna/luasrc/view/minidlna_status.htm
+new file mode 100644
+index 0000000..866eded
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/luasrc/view/minidlna_status.htm
+@@ -0,0 +1,29 @@
++<script type="text/javascript">//<![CDATA[
++ XHR.poll(5, '<%=url("admin/services/minidlna_status")%>', null,
++ function(x, st)
++ {
++ var tb = document.getElementById('minidlna_status');
++ if (st && tb)
++ {
++ if (st.running)
++ {
++ tb.innerHTML = String.format(
++ '<%:The miniDLNA service is active, serving %d audio, %d video and %d image files.%>',
++ st.audio, st.video, st.image
++ );
++ }
++ else
++ {
++ tb.innerHTML = '<em><%:The miniDLNA service is not running.%></em>';
++ }
++ }
++ }
++ );
++//]]></script>
++
++<fieldset class="cbi-section">
++ <legend><%:miniDLNA Status%></legend>
++ <p id="minidlna_status">
++ <em><%:Collecting data...%></em>
++ </p>
++</fieldset>
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/ca/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/ca/minidlna.po
+new file mode 100644
+index 0000000..bf16008
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/ca/minidlna.po
+@@ -0,0 +1,167 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-01 05:45+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Ajusts avançats"
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr "Habilita TIVO:"
++
++msgid "Enable inotify:"
++msgstr "Habilita inotify:"
++
++msgid "Enable:"
++msgstr "Habilita:"
++
++msgid "Friendly name:"
++msgstr "Nom amistós:"
++
++msgid "General Settings"
++msgstr "Ajusts generals"
++
++msgid "Interfaces:"
++msgstr "Interfícies"
++
++msgid "Log directory:"
++msgstr "Directori de registre:"
++
++msgid "Media directories:"
++msgstr "Directoris de medis:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr "Música"
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr "Interval de notificació en segons."
++
++msgid "Notify interval:"
++msgstr "Interval de notificació:"
++
++msgid "Pictures"
++msgstr "Imatges"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Port de tràfic HTTP (descripcions, SOAP, transferència de medis)"
++
++msgid "Port:"
++msgstr "Port:"
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "Especifiqueu la ruta a l'endoll de MiniSSDPd."
++
++msgid "Standard container"
++msgstr "Contenidor estàndard"
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr "Vídeo"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "Estat de miniDLNA"
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/cs/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/cs/minidlna.po
+new file mode 100644
+index 0000000..bf5a7f4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/cs/minidlna.po
+@@ -0,0 +1,171 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-08-04 19:18+0200\n"
++"Last-Translator: KubaCZ <kuba.turek@centrum.cz>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "PokroÄilé nastavení"
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr "Procházet adresář"
++
++msgid "Collecting data..."
++msgstr "ShromažÄování dat ..."
++
++msgid "Database directory:"
++msgstr "Adresář databáze:"
++
++msgid "Enable TIVO:"
++msgstr "Povolit TIVO:"
++
++msgid "Enable inotify:"
++msgstr "Povolit inotify:"
++
++msgid "Enable:"
++msgstr "Povolit:"
++
++msgid "Friendly name:"
++msgstr "Popisek:"
++
++msgid "General Settings"
++msgstr "Obecné nastavení"
++
++msgid "Interfaces:"
++msgstr "Rozhraní:"
++
++msgid "Log directory:"
++msgstr "Log adresář:"
++
++msgid "Media directories:"
++msgstr "Media adresáře:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"MiniDLNA je serverový software s cílem být plně kompatibilní s DLNA / UPnP-"
++"AV klienty."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr "Hudba"
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr "NotifikaÄní interval v sekundách."
++
++msgid "Notify interval:"
++msgstr "NotifikaÄní interval:"
++
++msgid "Pictures"
++msgstr "Obrázky"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Port pro HTTP (popisy, SOAP, přenos médií) provoz."
++
++msgid "Port:"
++msgstr "Port:"
++
++msgid "Presentation URL:"
++msgstr "PrezentaÄní URL:"
++
++msgid "Root container:"
++msgstr "Kořenový/root kontejner:"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr "Standardní kontejner"
++
++msgid "Strict to DLNA standard:"
++msgstr "Striktně se držet standardu DLNA:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++"Služba miniDLNA je aktivní, poskytuje %d audio, %d video a %d obrázkových "
++"souborů."
++
++msgid "The miniDLNA service is not running."
++msgstr "Služba miniDLNA není spuštěna."
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr "Video"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "Stav miniDLNA"
++
++msgid "miniSSDP socket:"
++msgstr "miniSSDP socket:"
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/de/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/de/minidlna.po
+new file mode 100644
+index 0000000..22cb0f7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/de/minidlna.po
+@@ -0,0 +1,205 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-09 14:39+0200\n"
++"Last-Translator: Jo-Philipp <jow@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Advanced Settings"
++msgstr "Erweiterte Einstellungen"
++
++msgid "Album art names:"
++msgstr "Dateinamen für Cover-Bilder:"
++
++msgid "Announced model number:"
++msgstr "Angekündigte Modellnummer:"
++
++msgid "Announced serial number:"
++msgstr "Angekündigte Seriennummer:"
++
++msgid "Browse directory"
++msgstr "Browse-Verzeichnis"
++
++msgid "Collecting data..."
++msgstr "Sammle Daten..."
++
++msgid "Database directory:"
++msgstr "Datenbankverzeichnis:"
++
++msgid "Enable TIVO:"
++msgstr "TIVO aktivieren:"
++
++msgid "Enable inotify:"
++msgstr "Inotify aktivieren:"
++
++msgid "Enable:"
++msgstr "Aktivieren:"
++
++msgid "Friendly name:"
++msgstr "Spitzname:"
++
++msgid "General Settings"
++msgstr "Allgemeine Einstellungen"
++
++msgid "Interfaces:"
++msgstr "Schnittstellen:"
++
++msgid "Log directory:"
++msgstr "Protokollverzeichnis:"
++
++msgid "Media directories:"
++msgstr "Medienverzeichnisse:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"MiniDLNA ist eine Serversoftware mit dem Ziel voll kompatibel mit DLNA/UPnP-"
++"AV-Klienten zu sein."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Spezifiziert die Modellnummer welche der miniDLNA-Dienst als Teil seiner XML-"
++"Beschreibung an Clients versendet."
++
++msgid "Music"
++msgstr "Musik"
++
++msgid "Network interfaces to serve."
++msgstr "Zu bedienende Netzwerkschnittstellen."
++
++msgid "Notify interval in seconds."
++msgstr "Ankündigungsinterval in Sekunden."
++
++msgid "Notify interval:"
++msgstr "Ankündigunsintervall"
++
++msgid "Pictures"
++msgstr "Bilder"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Port für HTTP-Verkehr (Beschreibungen, SOAP, Mediendaten)."
++
++msgid "Port:"
++msgstr "Port:"
++
++msgid "Presentation URL:"
++msgstr "Präsentations-URL:"
++
++msgid "Root container:"
++msgstr "Root-Container:"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Spezifiziert die Seriennummer welche der miniDLNA-Dienst als Teil seiner XML-"
++"Beschreibung an Clients versendet."
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr "Diesen Wert setzen um den auf Clients angezeigten Namen zu verändern."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++"Diesen Wert setzen um das Verzeichnis zu bestimmen in dem miniDLNA seine "
++"Datenbank und den Cover-Bild-Speicher ablegt."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++"Diesen Wert setzen um das Verzeichnis zu bestimmen in dem miniDLNA seine "
++"Protokolldateien ablegt."
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++"Diese Option aktivieren um den Inotify-Mechanismus zum Entdecken neuer "
++"Dateien zu benutzen."
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++"Diese Option aktivieren um die Unterstützung von JPEG- und MP3-Streaming zu "
++"HMO-TiVo-Geräten zu aktivieren."
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++"Diese Option setzen um den DLNA-Standard strikt einzuhalten. Damit wird "
++"serverseitiges Herunterskalieren von JPEG-Bildern aktviert was die "
++"Auslieferunsgeschwindigkeit in Verbindung mit Sony DLNA-Produkten negativ "
++"beeinflussen kann."
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++"Spezifiziert die zu durchsuchenden Medienverzeichnisse. Durch Voranstellung "
++"eines Buchstaben gefolgt von einem Komma kann ein Verzeichnis auf einen "
++"bestimmten Typ eingeschränkt werden; 'A' für Audio-, 'V' für Video- und 'P' "
++"für Bild-Verzeichnisse. Es können mehrere Verzeichnisse angegeben werden."
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "Spezifiziert den Pfad zur MiniSSDPd-Socket-Datei."
++
++msgid "Standard container"
++msgstr "Standard-Container"
++
++msgid "Strict to DLNA standard:"
++msgstr "Stikt nach DLNA-Standard:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++"Der miniDLNA-Dienst ist aktiv und publiziert %d Audio-, %d Video- und %d "
++"Bild-Dateien."
++
++msgid "The miniDLNA service is not running."
++msgstr "Der miniDLNA-Dienst ist inaktiv."
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++"Dies ist eine Liste von Dateinamen, die geprüft werden sollen wenn nach "
++"Cover-Bildern gesucht wird."
++
++msgid "Video"
++msgstr "Video"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "miniDLNA-Status"
++
++msgid "miniSSDP socket:"
++msgstr "miniSSDP-Socket:"
++
++#~ msgid "Network interfaces to serve, comma delimited list."
++#~ msgstr ""
++#~ "Lister dee bedienten Netzwerkschnittstellen als Komma-getrennte Liste."
++
++#~ msgid ""
++#~ "This is a list of file names to check for when searching for album art. "
++#~ "Note: names must be delimited with a forward slash '/'"
++#~ msgstr ""
++#~ "Dies ist eine Liste von zu prüfenden Dateinamen wenn nach Album-Covern "
++#~ "gesucht wird. Hinweis: Namen müssen mit einem Schrägstrich ('/') getrennt "
++#~ "werden."
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/el/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/el/minidlna.po
+new file mode 100644
+index 0000000..48c6188
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/el/minidlna.po
+@@ -0,0 +1,164 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr ""
++
++msgid "Enable inotify:"
++msgstr ""
++
++msgid "Enable:"
++msgstr ""
++
++msgid "Friendly name:"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Interfaces:"
++msgstr ""
++
++msgid "Log directory:"
++msgstr ""
++
++msgid "Media directories:"
++msgstr ""
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr ""
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr ""
++
++msgid "Notify interval:"
++msgstr ""
++
++msgid "Pictures"
++msgstr ""
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++
++msgid "Port:"
++msgstr ""
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/en/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/en/minidlna.po
+new file mode 100644
+index 0000000..5934d42
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/en/minidlna.po
+@@ -0,0 +1,195 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Album art names:"
++msgstr "Album art names:"
++
++msgid "Announced model number:"
++msgstr "Announced model number:"
++
++msgid "Announced serial number:"
++msgstr "Announced serial number:"
++
++msgid "Browse directory"
++msgstr "Browse directory"
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr "Database directory:"
++
++msgid "Enable TIVO:"
++msgstr "Enable TIVO:"
++
++msgid "Enable inotify:"
++msgstr "Enable inotify:"
++
++msgid "Enable:"
++msgstr "Enable:"
++
++msgid "Friendly name:"
++msgstr "Friendly name:"
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Interfaces:"
++msgstr "Interfaces:"
++
++msgid "Log directory:"
++msgstr "Log directory:"
++
++msgid "Media directories:"
++msgstr "Media directories:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++
++msgid "Music"
++msgstr "Music"
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr "Notify interval in seconds."
++
++msgid "Notify interval:"
++msgstr "Notify interval:"
++
++msgid "Pictures"
++msgstr "Pictures"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++
++msgid "Port:"
++msgstr "Port:"
++
++msgid "Presentation URL:"
++msgstr "Presentation URL:"
++
++msgid "Root container:"
++msgstr "Root container:"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++"Set this if you want to customize the name that shows up on your clients."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++"Set this to enable inotify monitoring to automatically discover new files."
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "Specify the path to the MiniSSDPd socket."
++
++msgid "Standard container"
++msgstr "Standard container"
++
++msgid "Strict to DLNA standard:"
++msgstr "Strict to DLNA standard:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr "Video"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr "miniSSDP socket:"
++
++#~ msgid "Network interfaces to serve, comma delimited list."
++#~ msgstr "Network interfaces to serve, comma delimited list."
++
++#~ msgid ""
++#~ "This is a list of file names to check for when searching for album art. "
++#~ "Note: names must be delimited with a forward slash '/'"
++#~ msgstr ""
++#~ "This is a list of file names to check for when searching for album art. "
++#~ "Note: names must be delimited with a forward slash '/'"
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/es/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/es/minidlna.po
+new file mode 100644
+index 0000000..5f6b396
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/es/minidlna.po
+@@ -0,0 +1,184 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-09-01 09:07+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Configuración avanzada"
++
++msgid "Album art names:"
++msgstr "Imágenes de álbumes:"
++
++msgid "Announced model number:"
++msgstr "Número de modelo declarado:"
++
++msgid "Announced serial number:"
++msgstr "Número de serie declarado:"
++
++msgid "Browse directory"
++msgstr "Ver directorio"
++
++msgid "Collecting data..."
++msgstr "Recopilando información..."
++
++msgid "Database directory:"
++msgstr "Directorio de la base de datos:"
++
++msgid "Enable TIVO:"
++msgstr "Activar TIVO:"
++
++msgid "Enable inotify:"
++msgstr "Activar inotify:"
++
++msgid "Enable:"
++msgstr "Activar:"
++
++msgid "Friendly name:"
++msgstr "Nombre amigable:"
++
++msgid "General Settings"
++msgstr "Configuración general"
++
++msgid "Interfaces:"
++msgstr "Interfaces:"
++
++msgid "Log directory:"
++msgstr "Directorio de registro:"
++
++msgid "Media directories:"
++msgstr "Directorios de medios:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"MiniDLNA es un servidor que buscar ser compatible con clientes DLNA/UPnP-AV."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Número de modelo que el demonio miniDLNA mostrará a los clientes en su "
++"descripción XML."
++
++msgid "Music"
++msgstr "Música"
++
++msgid "Network interfaces to serve."
++msgstr "Interfaces de red a usar."
++
++msgid "Notify interval in seconds."
++msgstr "Intervalo de notificación en segundos."
++
++msgid "Notify interval:"
++msgstr "Intervalo de notificación:"
++
++msgid "Pictures"
++msgstr "Imágenes"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++"Puerto para tráfico HTTP (descripciones, SOAP y transferencia de medios)."
++
++msgid "Port:"
++msgstr "Puerto:"
++
++msgid "Presentation URL:"
++msgstr "URL de presentación:"
++
++msgid "Root container:"
++msgstr "Raíz de contenidos:"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Número de serie que el demonio miniDLNA informará a los clientes en su "
++"descripción XML."
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr "Personalizar el nombre mostrado a los clientes."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++"Indicar el directorio en el que MiniDLNA guardará su base de datos y la "
++"caché de álbumes."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr "Indicar el directorio donde MiniDLNA guardará su archivo de registro."
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr "Inotify descubrirá automáticamente nuevos archivos."
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr "Envío de archivos .jpg y .mp3 a un TiVo usando HMO."
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++"Seguir estrictamente el estándar DLNA. Esto permite el reescalado desde el "
++"servidor de imágenes JPEG grandes que pueden perjudicar el rendimiento en "
++"(al menos) productos DLNA de Sony."
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++"Directorio a explorar. Si quiere restringir el directorio a un contenido "
++"específico puede añadir el tipo ('A' par audio, 'V' para vídeo o 'P' para "
++"imágenes), seguido por una coma al nombre del directorio (ej. media_dir=A,/"
++"mnt/media/Music). Se puede establecer varios directorios."
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "Camino al socket de MiniSSDPd."
++
++msgid "Standard container"
++msgstr "Contenedor estándar"
++
++msgid "Strict to DLNA standard:"
++msgstr "Ceñirse al estándar DLNA:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++"El servicio miniDLNA está activo, sirviendo %d archivos de audio, %d de "
++"vídeo y %d de imágenes."
++
++msgid "The miniDLNA service is not running."
++msgstr "El servicio miniDLNA no está arrancado."
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr "Lista de nombres a comprobar para buscar imágenes de álbumes."
++
++msgid "Video"
++msgstr "Vídeo"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "Estado de miniDLNA"
++
++msgid "miniSSDP socket:"
++msgstr "Socket de miniSSDP:"
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/fr/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/fr/minidlna.po
+new file mode 100644
+index 0000000..d638b0c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/fr/minidlna.po
+@@ -0,0 +1,164 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr ""
++
++msgid "Enable inotify:"
++msgstr ""
++
++msgid "Enable:"
++msgstr ""
++
++msgid "Friendly name:"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Interfaces:"
++msgstr ""
++
++msgid "Log directory:"
++msgstr ""
++
++msgid "Media directories:"
++msgstr ""
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr ""
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr ""
++
++msgid "Notify interval:"
++msgstr ""
++
++msgid "Pictures"
++msgstr ""
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++
++msgid "Port:"
++msgstr ""
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/he/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/he/minidlna.po
+new file mode 100644
+index 0000000..48c6188
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/he/minidlna.po
+@@ -0,0 +1,164 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr ""
++
++msgid "Enable inotify:"
++msgstr ""
++
++msgid "Enable:"
++msgstr ""
++
++msgid "Friendly name:"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Interfaces:"
++msgstr ""
++
++msgid "Log directory:"
++msgstr ""
++
++msgid "Media directories:"
++msgstr ""
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr ""
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr ""
++
++msgid "Notify interval:"
++msgstr ""
++
++msgid "Pictures"
++msgstr ""
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++
++msgid "Port:"
++msgstr ""
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/hu/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/hu/minidlna.po
+new file mode 100644
+index 0000000..52fbe74
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/hu/minidlna.po
+@@ -0,0 +1,199 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-09 19:18+0200\n"
++"Last-Translator: Gábor <vargalex@freemail.hu>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Advanced Settings"
++msgstr "Haladó beállítások"
++
++msgid "Album art names:"
++msgstr "Borító album nevek:"
++
++msgid "Announced model number:"
++msgstr "Közölt modellszám:"
++
++msgid "Announced serial number:"
++msgstr "Közölt sorozatszám:"
++
++msgid "Browse directory"
++msgstr "Könyvtár tallózása"
++
++msgid "Collecting data..."
++msgstr "Adatok gyűjtése..."
++
++msgid "Database directory:"
++msgstr "Adatbázis könyvtár:"
++
++msgid "Enable TIVO:"
++msgstr "TIVO engedélyezése:"
++
++msgid "Enable inotify:"
++msgstr "Inotify engedélyezése:"
++
++msgid "Enable:"
++msgstr "Engedélyezés:"
++
++msgid "Friendly name:"
++msgstr "Egyéni név:"
++
++msgid "General Settings"
++msgstr "Ãltalános beállítások"
++
++msgid "Interfaces:"
++msgstr "Interfészek:"
++
++msgid "Log directory:"
++msgstr "Napló könyvtár:"
++
++msgid "Media directories:"
++msgstr "Média könyvtárak:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"A MiniDLNA egy szerver alkalmazás, ami teljes mértékben kompatibilis a DLNA/"
++"UPnP-AV képes kliensekkel."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"A miniDLNA által az XML leírásban jelentett modellszám a kliensek számára."
++
++msgid "Music"
++msgstr "Zene"
++
++msgid "Network interfaces to serve."
++msgstr "Kiszolgált hálózati interfészek."
++
++msgid "Notify interval in seconds."
++msgstr "Értesítés intervalluma másodpercben."
++
++msgid "Notify interval:"
++msgstr "Értesítési intervallum:"
++
++msgid "Pictures"
++msgstr "Képek"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "HTTP forgalom (leírások, SOAP, média átvitel) portja."
++
++msgid "Port:"
++msgstr "Port:"
++
++msgid "Presentation URL:"
++msgstr "Szolgáltatott URL:"
++
++msgid "Root container:"
++msgstr "Gyökér konténer:"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"A miniDLNA által az XML leírásban jelentett szériaszám a kliensek számára."
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++"Ãllítsa be, amennyiben a kliensek számára megjelenÅ‘ nevet szeretné testre "
++"szabni."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++"Ãllítsa be, ha meg szeretné adni azt könyvtárat, ahová a a MiniDLNA az "
++"adatbázisát, illetve az album borító gyorsítótárat rögzítse."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++"Ãttítsa be, ha meg szeretné adni azt a könyvtárat, ahová a MiniDLNA a napló "
++"állományait mentse."
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++"Engedélyezze az új fájlok automatikus felfedezéséhez szükséges inotify "
++"monitorozáshoz."
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++"Engedélyezze a .jpg és .mp3 fájlok közvetítéséhez TiVo támogatott HMO-k felé."
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++"Engedélyezze a DLNA követelmények szigorú betartásához. Ez lehetővé teszi a "
++"nagyon nagy JPEG képek szerver oldali leméretezését, amik pl. a Sony DLNA "
++"termékek JPEG kiszolgáló teljesítményére nincsenek kedvező hatással."
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++"Ãllítsa be a vizsgálandó könyvtárra. Ha a könyvtárat egy adott típusú "
++"tartalom szerint szeretné korlátozni, akkor a neve előtt vesszővel "
++"elválasztva megadhatja a típust ('A' az audió, 'V' a videó, 'P' a képek "
++"számára. pl.: media_dir=A,/mnt/media/Music). Több könyvtár is megadható."
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "A MiniSSDPd socket elérési útját határozza meg."
++
++msgid "Standard container"
++msgstr "Szabvány konténer"
++
++msgid "Strict to DLNA standard:"
++msgstr "DLNA követelmények szigorú betartása:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++"A miniDLNA szolgáltatás aktív, %d hang, %d videó, %d kép fájl található. "
++
++msgid "The miniDLNA service is not running."
++msgstr "A miniDLNA szolgáltatás nem aktív."
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr "Fájlnevek listája, amik ellenőrzésre kerülnek albumborító keresésekor."
++
++msgid "Video"
++msgstr "Videó"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "miniDLNA állapot"
++
++msgid "miniSSDP socket:"
++msgstr "miniSSDP socket:"
++
++#~ msgid "Network interfaces to serve, comma delimited list."
++#~ msgstr "Kiszolgált hálózati interfészek vesszővel elválasztott listája."
++
++#~ msgid ""
++#~ "This is a list of file names to check for when searching for album art. "
++#~ "Note: names must be delimited with a forward slash '/'"
++#~ msgstr ""
++#~ "Ez egy lista azokról a fájlnevekről, amelyeket ellenőrizni kell a "
++#~ "lemezborító keresésekor. Megjegyzés: a neveket per jellel ('/') kell "
++#~ "elválasztani egymástól."
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/it/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/it/minidlna.po
+new file mode 100644
+index 0000000..1c0abc6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/it/minidlna.po
+@@ -0,0 +1,194 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-08-05 11:41+0200\n"
++"Last-Translator: morganfw <morganfw@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Opzioni avanzate"
++
++msgid "Album art names:"
++msgstr "Nome Copertina Album:"
++
++msgid "Announced model number:"
++msgstr "Numero modello annunciato:"
++
++msgid "Announced serial number:"
++msgstr "Numero seriale annunciato:"
++
++msgid "Browse directory"
++msgstr "Esplora directory"
++
++msgid "Collecting data..."
++msgstr "Recuperando i dati..."
++
++msgid "Database directory:"
++msgstr "Directory database:"
++
++msgid "Enable TIVO:"
++msgstr "Abilita TIVO:"
++
++msgid "Enable inotify:"
++msgstr "Abilita inotify:"
++
++msgid "Enable:"
++msgstr "Abilita:"
++
++msgid "Friendly name:"
++msgstr "Nome Comune:"
++
++msgid "General Settings"
++msgstr "Impostazioni generali"
++
++msgid "Interfaces:"
++msgstr "Interfacce:"
++
++msgid "Log directory:"
++msgstr "Directory di log:"
++
++msgid "Media directories:"
++msgstr "Cartelle Supporto:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"MiniDLNA è un server il cui intento è di essere completamente compatibile "
++"con i DLNA/UPnP-AV client disponibili."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Numero del modello che il demone miniDLNA riporterà ai client nella sua "
++"descrizione XML."
++
++msgid "Music"
++msgstr "Musica"
++
++msgid "Network interfaces to serve."
++msgstr "Interfaccia di rete usata."
++
++msgid "Notify interval in seconds."
++msgstr "Intervallo di notifica in secondi."
++
++msgid "Notify interval:"
++msgstr "Intervallo di notifica:"
++
++msgid "Pictures"
++msgstr "Immagini"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Porta per traffico (descrizione, SOAP, trasferimento supporto) HTTP:"
++
++msgid "Port:"
++msgstr "Porta:"
++
++msgid "Presentation URL:"
++msgstr "URL di Presentazione:"
++
++msgid "Root container:"
++msgstr "Contenitore Principale:"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Serial number che il server miniDLNA invierà ai client nella descrizione "
++"XML."
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr "Imposta se si desidera personalizzare il nome da mostrare ai client."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++"Impostare questa opzione se si desidera specificare la cartella in cui si "
++"desidera archiviare i database MiniDLNA e le copertine della cache album."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++"Impostare questa opzione se si desidera specificare la cartella in cui si "
++"desidera che MiniDLNA archivi i propri file di registro."
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++"Impostare questa opzione per consentire il monitoraggio inotify per rilevare "
++"automaticamente i nuovi file."
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++"Impostare questo per abilitare il supporto per lo streaming di file .jpg e "
++".mp3 ad un supporto TiVo che supporta HMO."
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++"Impostare questo parametro per far rispettare rigorosamente gli standard "
++"DLNA. Ciò consentirà sul lato server il ridimensionamento delle immagini "
++"JPEG di grandi dimensioni che possono influire negativamente sulle "
++"prestazioni JPEG del servizio su (almeno) i prodotti Sony DLNA."
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++"Impostare la cartella che si desidera sottoporre a scansione. Se si desidera "
++"limitare la directory per un tipo di contenuto specifico, è possibile "
++"anteporre il tipo ('A' per l'audio, 'V' per video, 'P' per le immagini), "
++"seguito da una virgola, nella cartella (es. media_dir = A,/mnt/media/Music). "
++"Cartelle multiple possono essere specificate."
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "Specificare il percorso del socket MiniSSDPd."
++
++msgid "Standard container"
++msgstr "Contenitore Standard"
++
++msgid "Strict to DLNA standard:"
++msgstr "Scrupolosamente DLNA standard:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++"Il servizio miniDLNA è attivo, servo %d audio, %d video, %d file di "
++"immagine."
++
++msgid "The miniDLNA service is not running."
++msgstr "Il servizio miniDLNA non è in esecuzione."
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++"Questo è un elenco di nomi di file per verificare la presenza durante la "
++"ricerca di copertine degli album."
++
++msgid "Video"
++msgstr "Video"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "Stato miniDLNA"
++
++msgid "miniSSDP socket:"
++msgstr "Socket miniSSDP:"
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/ja/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/ja/minidlna.po
+new file mode 100644
+index 0000000..4cfc338
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/ja/minidlna.po
+@@ -0,0 +1,198 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-10 09:10+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: none\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: Pootle 2.0.4\n"
++
++msgid "Advanced Settings"
++msgstr "詳細設定"
++
++msgid "Album art names:"
++msgstr "アルãƒãƒ ã‚¢ãƒ¼ãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ãƒ•ã‚¡ã‚¤ãƒ«å:"
++
++msgid "Announced model number:"
++msgstr "通知ã™ã‚‹ãƒ¢ãƒ‡ãƒ«ç•ªå·:"
++
++msgid "Announced serial number:"
++msgstr "通知ã™ã‚‹ã‚·ãƒªã‚¢ãƒ«ãƒŠãƒ³ãƒãƒ¼:"
++
++msgid "Browse directory"
++msgstr "Browse directory"
++
++msgid "Collecting data..."
++msgstr "データåŽé›†ä¸­ã§ã™..."
++
++msgid "Database directory:"
++msgstr "データベース・ディレクトリ:"
++
++msgid "Enable TIVO:"
++msgstr "TIVO を有効ã«ã™ã‚‹:"
++
++msgid "Enable inotify:"
++msgstr "inotify を有効ã«ã™ã‚‹:"
++
++msgid "Enable:"
++msgstr "サービスを有効ã«ã™ã‚‹:"
++
++msgid "Friendly name:"
++msgstr "Friendlyå:"
++
++msgid "General Settings"
++msgstr "基本設定"
++
++msgid "Interfaces:"
++msgstr "インターフェース:"
++
++msgid "Log directory:"
++msgstr "ログディレクトリ:"
++
++msgid "Media directories:"
++msgstr "メディアディレクトリ:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"MiniDLNAã¯ã€DLNA/UPnP-AVクライアントã®å®Œå…¨äº’æ›ã‚’目的ã¨ã—ãŸã‚µãƒ¼ãƒãƒ¼ãƒ»ã‚½ãƒ•ãƒˆ"
++"ウェアã§ã™ã€‚"
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr "miniDLNAãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«é€šçŸ¥ã™ã‚‹XML中ã®ãƒ¢ãƒ‡ãƒ«ç•ªå·ã‚’設定ã—ã¾ã™ã€‚"
++
++msgid "Music"
++msgstr "ミュージック"
++
++msgid "Network interfaces to serve."
++msgstr "サービスãŒä½¿ç”¨ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’設定ã—ã¾ã™ã€‚"
++
++msgid "Notify interval in seconds."
++msgstr "通知間隔を秒å˜ä½ã§è¨­å®šã—ã¾ã™ã€‚"
++
++msgid "Notify interval:"
++msgstr "通知間隔:"
++
++msgid "Pictures"
++msgstr "ピクãƒãƒ£"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "ステータス表示ã®ãŸã‚ã®HTTPãƒãƒ¼ãƒˆç•ªå·ã‚’設定ã—ã¦ãã ã•ã„。"
++
++msgid "Port:"
++msgstr "ãƒãƒ¼ãƒˆ:"
++
++msgid "Presentation URL:"
++msgstr "プレゼンテーションURL:"
++
++msgid "Root container:"
++msgstr "ルート・コンテナ:"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr "miniDLNAãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«é€šçŸ¥ã™ã‚‹XML中ã®ã‚·ãƒªã‚¢ãƒ«ãƒŠãƒ³ãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚"
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr "クライアント上ã§è¡¨ç¤ºã•ã‚Œã‚‹UPnPノードåを設定ã—ã¦ãã ã•ã„。"
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++"miniDLNAãŒä½¿ç”¨ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŠã‚ˆã³ã‚¢ãƒ«ãƒãƒ ã‚¢ãƒ¼ãƒˆã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ä¿å­˜ã™ã‚‹ãƒ‡ã‚£"
++"レクトリパスを設定ã—ã¦ãã ã•ã„。"
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr "miniDLNAãŒæ›¸ãã ã™ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ‘スを設定ã—ã¦ãã ã•ã„。"
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++"inotifyを使用ã—ãŸæ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ã®è‡ªå‹•æ¤œçŸ¥ã‚’有効ã«ã™ã‚‹å ´åˆã€ã“ã®ã‚ªãƒ—ションを有効"
++"ã«ã—ã¦ãã ã•ã„。"
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++"TiVoサãƒãƒ¼ãƒˆã®ãŸã‚ã®.jpgãŠã‚ˆã³.mp3ファイルã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’è¡Œã†å ´åˆã€ã“ã®ã‚ª"
++"プションを有効ã«ã—ã¦ãã ã•ã„。"
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++"DLNAè¦æ ¼ã‚’厳守ã™ã‚‹å ´åˆã€ã“ã®ã‚ªãƒ—ションを有効ã«ã—ã¦ãã ã•ã„。オプションを有効"
++"ã«ã™ã‚‹ã¨ã€ã‚µãƒ¼ãƒãƒ¼å´ã§ã€å¤§ãã„サイズã®JPEGファイルã®ãƒ€ã‚¦ãƒ³ã‚¹ã‚±ãƒ¼ãƒ«ã‚’è¡Œã„ã¾"
++"ã™ã€‚ã—ã‹ã—ã€ã“ã®æ©Ÿèƒ½ã¯Sonyãªã©ã®DLNA製å“ã«ãŠã„ã¦ã€JPEGサービスã®ãƒ‘フォーマン"
++"スをæãªã†å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++"miniDLNA ãŒã‚¹ã‚­ãƒ£ãƒ³ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’設定ã—ã¾ã™ã€‚ディレクトリを特定ã®ã‚³ãƒ³ãƒ†ãƒ³"
++"ツã«åˆ¶é™ã—ãŸã„å ´åˆã€ã‚¿ã‚¤ãƒ—をパスã®ã¯ã˜ã‚ã«ä»˜ã‘ã€ã‚³ãƒ³ãƒžè¨˜å·ã§åŒºåˆ‡ã‚‹ã“ã¨ã§è¨­å®š"
++"ã§ãã¾ã™ ('A'=オーディオ \"audio\", 'V'=ビデオ \"video\", 'P'=写真 \"images"
++"\", 例: media_dir=A,/mnt/media/Music)。ã¾ãŸã€ã“ã®ã‚ªãƒ—ションã¯è¤‡æ•°ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆ"
++"リを登録å¯èƒ½ã§ã™ã€‚"
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "MiniSSDPd ソケットã®ãƒ‘スを設定ã—ã¦ãã ã•ã„。"
++
++msgid "Standard container"
++msgstr "標準コンテナ"
++
++msgid "Strict to DLNA standard:"
++msgstr "DLNAè¦æ ¼ã®åŽ³å®ˆ:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++"miniDLNA サービスã¯ç¨¼åƒä¸­ã§ã™ã€‚%d 個ã®éŸ³æ¥½ãƒ•ã‚¡ã‚¤ãƒ« , %d 個ã®ãƒ“デオファイル, %"
++"d 個ã®å†™çœŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’èªè­˜ã—ã¦ã„ã¾ã™ã€‚"
++
++msgid "The miniDLNA service is not running."
++msgstr "miniDLNA サービスã¯ç¨¼åƒã—ã¦ã„ã¾ã›ã‚“。"
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr "アルãƒãƒ ã‚¢ãƒ¼ãƒˆæ¤œç´¢æ™‚ã«ãƒã‚§ãƒƒã‚¯ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«åã®ãƒªã‚¹ãƒˆã‚’設定ã—ã¾ã™ã€‚"
++
++msgid "Video"
++msgstr "ビデオ"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "miniDLNA ステータス"
++
++msgid "miniSSDP socket:"
++msgstr "miniSSDP ソケット:"
++
++#~ msgid "Network interfaces to serve, comma delimited list."
++#~ msgstr ""
++#~ "サービスãŒä½¿ç”¨ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’設定ã—ã¾ã™ã€‚ã‚«ãƒ³ãƒžè¨˜å· "
++#~ "\",\" ã§åŒºåˆ‡ã£ã¦ãã ã•ã„。"
++
++#~ msgid ""
++#~ "This is a list of file names to check for when searching for album art. "
++#~ "Note: names must be delimited with a forward slash '/'"
++#~ msgstr ""
++#~ "アルãƒãƒ ã‚¢ãƒ¼ãƒˆæ¤œç´¢æ™‚ã«ãƒã‚§ãƒƒã‚¯ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«åã®ãƒªã‚¹ãƒˆã‚’設定ã—ã¾ã™ã€‚注æ„: "
++#~ "ファイルåã¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥è¨˜å· '/' ã§åŒºåˆ‡ã£ã¦ãã ã•ã„。"
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/ms/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/ms/minidlna.po
+new file mode 100644
+index 0000000..8df98a8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/ms/minidlna.po
+@@ -0,0 +1,163 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr ""
++
++msgid "Enable inotify:"
++msgstr ""
++
++msgid "Enable:"
++msgstr ""
++
++msgid "Friendly name:"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Interfaces:"
++msgstr ""
++
++msgid "Log directory:"
++msgstr ""
++
++msgid "Media directories:"
++msgstr ""
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr ""
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr ""
++
++msgid "Notify interval:"
++msgstr ""
++
++msgid "Pictures"
++msgstr ""
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++
++msgid "Port:"
++msgstr ""
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/no/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/no/minidlna.po
+new file mode 100644
+index 0000000..4b24712
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/no/minidlna.po
+@@ -0,0 +1,189 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-03-25 17:25+0200\n"
++"Last-Translator: protx <lars.hardy@gmail.com>\n"
++"Language-Team: none\n"
++"Language: no\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Avanserte Innstillinger"
++
++msgid "Album art names:"
++msgstr "Albumbilder navn:"
++
++msgid "Announced model number:"
++msgstr "Annonsert modellnummer:"
++
++msgid "Announced serial number:"
++msgstr "Annonsert serienummer:"
++
++msgid "Browse directory"
++msgstr "Bla katalog"
++
++msgid "Collecting data..."
++msgstr "Samler inn data..."
++
++msgid "Database directory:"
++msgstr "Database katalog:"
++
++msgid "Enable TIVO:"
++msgstr "Aktiver TIVO:"
++
++msgid "Enable inotify:"
++msgstr "Aktiver inotify:"
++
++msgid "Enable:"
++msgstr "Aktiver:"
++
++msgid "Friendly name:"
++msgstr "Vennlig navn:"
++
++msgid "General Settings"
++msgstr "Generelle Innstillinger"
++
++msgid "Interfaces:"
++msgstr "Grensesnitt:"
++
++msgid "Log directory:"
++msgstr "Logg katalog:"
++
++msgid "Media directories:"
++msgstr "Media kataloger:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"MiniDLNA er serverprogramvare som sikter på å være fullt kompatibel med DLNA"
++"/UPnP-AV klienter."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Modellnummer som MiniDLNA daemon vil rapportere til klienter. (XML "
++"beskrivelse)"
++
++msgid "Music"
++msgstr "Musikk"
++
++msgid "Network interfaces to serve."
++msgstr "Nettverksgrensesnittene å tjene."
++
++msgid "Notify interval in seconds."
++msgstr "Notify intervall i sekunder."
++
++msgid "Notify interval:"
++msgstr "Notify intervall:"
++
++msgid "Pictures"
++msgstr "Bilder"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Port for HTTP (beskrivelser, SOAP, media overføring) trafikk."
++
++msgid "Port:"
++msgstr "Port:"
++
++msgid "Presentation URL:"
++msgstr "Presentasjon URL:"
++
++msgid "Root container:"
++msgstr "Root katalog:"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Serienummeret miniDLNA daemon vil rapportere til klienter. (XML beskrivelse)"
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr "Her kan en tilpasse navnet som dukker opp på MiniDLNA klientene."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++"Her kan en spesifisere hvilken katalog som MiniDLNA bruker for å lagre sin "
++"database og albumcover cache."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++"Her kan en definere hvilken katalog som MiniDLNA skal bruke til å lagre log "
++"filen i."
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++"Her kan en aktivere inotify som overvåker mediakatalogene og dermed "
++"automatisk oppdage om det kommer nytt innhold."
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++"Her kan en aktivere støtte for strømming av .jpg og .mp3 filer til en TiVo "
++"med HMO støtte."
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++"Her kan en aktivere at en holder seg til DLNA-standarder. Dette vil tillate "
++"server-side nedskalering av svært store JPEG-bilder, noe som kan skade JPEG "
++"serverens ytelse på (minst) Sony DLNA-produkter."
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++"Her kan en velge den katalogen som blir skannet. Om du ønsker å begrense "
++"katalogen til en spesifikk innholdstype kan sette en bokstav foran ('A' for "
++"lyd, 'V' for video, 'P' for bilder), etterfulgt av et komma og katalogen. "
++"(f.eks media_dir=A,/mnt/media/Musikk). Flere kataloger kan brukes."
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "Angi banen til MiniSSDPd socketen."
++
++msgid "Standard container"
++msgstr "Standard container"
++
++msgid "Strict to DLNA standard:"
++msgstr "Streng overholdelse av DLNA-standarden:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++"MiniDLNA tjenesten er aktiv, serverer %d lyd, %d video og %d bildefiler."
++
++msgid "The miniDLNA service is not running."
++msgstr "MiniDLNA tjenesten kjører ikke."
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++"Dette er en liste over filnavn for å se etter når du søker etter albumcover."
++
++msgid "Video"
++msgstr "Video"
++
++msgid "miniDLNA"
++msgstr "MiniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "MiniDLNA Status"
++
++msgid "miniSSDP socket:"
++msgstr "miniSSDP socket:"
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/pl/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/pl/minidlna.po
+new file mode 100644
+index 0000000..b4a8a6f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/pl/minidlna.po
+@@ -0,0 +1,189 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-08-24 07:53+0200\n"
++"Last-Translator: goodgod261 <goodgod261@wp.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Ustawienia zaawansowane"
++
++msgid "Album art names:"
++msgstr "Nazwy okładek albumów:"
++
++msgid "Announced model number:"
++msgstr "Rozgłaszany model:"
++
++msgid "Announced serial number:"
++msgstr "Rozgłaszany numer seryjny:"
++
++msgid "Browse directory"
++msgstr "PrzeglÄ…daj folder"
++
++msgid "Collecting data..."
++msgstr "Zbieranie informacji..."
++
++msgid "Database directory:"
++msgstr "Katalog bazy danych:"
++
++msgid "Enable TIVO:"
++msgstr "WÅ‚Ä…cz TIVO:"
++
++msgid "Enable inotify:"
++msgstr "WÅ‚Ä…cz inotify:"
++
++msgid "Enable:"
++msgstr "WÅ‚Ä…cz:"
++
++msgid "Friendly name:"
++msgstr "Przyjazna nazwa:"
++
++msgid "General Settings"
++msgstr "Ustawienia ogólne"
++
++msgid "Interfaces:"
++msgstr "Interfejsy:"
++
++msgid "Log directory:"
++msgstr "Katalog dzienników (logów):"
++
++msgid "Media directories:"
++msgstr "Katalog mediów:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"MiniDLNA jest oprogramowaniem serwerowym mającym na celu pełną zgodność z "
++"klientami DLNA/UPnP-AV."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr "Model, który demon miniDLNA zgłosi klientom w swoim opisie XML."
++
++msgid "Music"
++msgstr "Muzyka"
++
++msgid "Network interfaces to serve."
++msgstr "Interfejsy sieciowe do obsługiwania."
++
++msgid "Notify interval in seconds."
++msgstr "Interwał powiadamiania w sekundach."
++
++msgid "Notify interval:"
++msgstr "Interwał powiadamiania."
++
++msgid "Pictures"
++msgstr "Obrazy"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Port dla ruchu HTTP (opisy, SOAP, transfer mediów)."
++
++msgid "Port:"
++msgstr "Port:"
++
++msgid "Presentation URL:"
++msgstr "URL prezentacyjny:"
++
++msgid "Root container:"
++msgstr "Kontener główny (root):"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Numer seryjny, który demon miniDLNA zgłosi klientom w swoim opisie XML."
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr "Ustaw to, jeśli chcesz wybrać własną nazwę pokazującą się w klientach."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++"Ustaw to, jeśli chcesz podać folder, w którym miniDLNA powinien przechowywać "
++"bazę danych i cache okładek albumów."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++"Ustaw to, jeśli chcesz podać folder, w którym miniDLNA powinien przechowywać "
++"dzienniki (logi)."
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++"Ustaw to, aby włączyć monitorowanie inotify, by automatycznie wykrywać nowe "
++"pliki."
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++"Ustaw to, aby włączyć wsparcie dla streamingu plików .jpg i .mp3 do TiVo "
++"obsługującego HMO."
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++"Ustaw to, aby ściśle przestrzegać standardów DLNA. Pozwoli to na "
++"zmniejszanie wielkich plików JPEG po stronie serwera, co może obniżyć "
++"wydajność dostarczania plików JPEG (przynajmniej) na urządzeniach DLNA Sony."
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++"Ustaw tu folder, który chcesz skanować. Jeśli chcesz ograniczyć folder do "
++"konkretnego typu zawartości, możesz poprzedzić ścieżkę typem (\"A\" dla "
++"audio, \"V\" dla wideo, \"P\" dla obrazów) i przecinkiem (np media_dir=A,/"
++"mnt/media/Muzyka). Możesz podać kilka folderów."
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "Podaj ścieżkę do gniazda (socketu) miniSSDPd."
++
++msgid "Standard container"
++msgstr "Standardowy kontener"
++
++msgid "Strict to DLNA standard:"
++msgstr "Ściśle trzymaj się standardów DLNA:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++"Usługa miniDLNA jest aktywna, dostarczając %d utworów, %d filmów i %d "
++"obrazów."
++
++msgid "The miniDLNA service is not running."
++msgstr "Usługa miniDLNA nie jest włączona."
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++"To jest lista nazw plików do sprawdzenia podczas wyszukiwania okładki albumu."
++
++msgid "Video"
++msgstr "Wideo"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "Status miniDLNA"
++
++msgid "miniSSDP socket:"
++msgstr "Gniazdo (socket) miniSSDP:"
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/pt-br/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/pt-br/minidlna.po
+new file mode 100644
+index 0000000..3d53abd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/pt-br/minidlna.po
+@@ -0,0 +1,193 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++
++msgid "Advanced Settings"
++msgstr "Configuração Avançada"
++
++msgid "Album art names:"
++msgstr "Nomes do Ãlbum artistico: "
++
++msgid "Announced model number:"
++msgstr "numero de modelo anunciado:"
++
++msgid "Announced serial number:"
++msgstr "Anunciar serial:"
++
++msgid "Browse directory"
++msgstr "Procurar diretório "
++
++msgid "Collecting data..."
++msgstr "Coletando dados..."
++
++msgid "Database directory:"
++msgstr "Banco de dados de diretório:"
++
++msgid "Enable TIVO:"
++msgstr "Ativar TIVO:"
++
++msgid "Enable inotify:"
++msgstr "Ativar inotify:"
++
++msgid "Enable:"
++msgstr "Ativado"
++
++msgid "Friendly name:"
++msgstr "Nome amigável:"
++
++msgid "General Settings"
++msgstr "Configuração Geral"
++
++msgid "Interfaces:"
++msgstr "Interfaces:"
++
++msgid "Log directory:"
++msgstr "Diretório de Log"
++
++msgid "Media directories:"
++msgstr "Diretórios de mídia:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"MiniDLNA é um software de servidor com o objetivo de ser totalmente "
++"compatível com os clientes DLNA / UPnP-AV."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Número do modelo do daemon miniDLNA irá relatar aos clientes em sua "
++"descrição XML."
++
++msgid "Music"
++msgstr "Musica"
++
++msgid "Network interfaces to serve."
++msgstr "As interfaces de rede para servir."
++
++msgid "Notify interval in seconds."
++msgstr "Notificação de intervalo em segundos."
++
++msgid "Notify interval:"
++msgstr "Intervalo de Notificação:"
++
++msgid "Pictures"
++msgstr "Imagems"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Porta para HTTP (descrições, SOAP, transferência de mídia) de tráfego."
++
++msgid "Port:"
++msgstr "Porta:"
++
++msgid "Presentation URL:"
++msgstr "URL para Apresentação:"
++
++msgid "Root container:"
++msgstr "Root container:"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Numero serial do miniDLNA daemon apresentará um relatório a clientes em sua "
++"descrição XML."
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++"Defina esta opção se você quiser personalizar o nome que aparece em seus "
++"clientes."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++"Defina esta opção se você gostaria de especificar o diretório onde você "
++"deseja MiniDLNA para armazenar seu banco de dados e cache de arte do álbum."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++"Defina esta opção se você gostaria de especificar o diretório onde você "
++"deseja MiniDLNA para armazenar seu arquivo de log."
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++"Defina esta opção para permitir o monitoramento inotify para descobrir "
++"automaticamente novos arquivos."
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++"Defina esta opção para habilitar o suporte para streaming. Jpg e. Arquivos "
++"MP3 para um TiVo suporte HMO."
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++"Defina esta opção para aderir estritamente às normas DLNA. Isso permitirá "
++"que do lado do servidor downscaling de imagens muito grandes JPEG, que podem "
++"prejudicar o desempenho servindo em JPEG (pelo menos) os produtos da Sony "
++"DLNA."
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++"Defina esta opção para o diretório que você deseja verificar. Se você quiser "
++"restringir o diretório para um tipo específico de conteúdo, você pode "
++"prefixar o tipo ('A' para áudio, 'V' para o vídeo, 'P' para imagens), "
++"seguido por uma vírgula, para o diretório (por exemplo media_dir = A, / "
++"mnt / media / Música). Vários diretórios podem ser especificados."
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "Especifique o caminho para o soquete MiniSSDPd."
++
++msgid "Standard container"
++msgstr "container padrão"
++
++msgid "Strict to DLNA standard:"
++msgstr "Strict para DLNA padrão:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++"O serviço está ativo miniDLNA, servindo% d áudio, vídeo e arquivos% d% d "
++"imagem."
++
++msgid "The miniDLNA service is not running."
++msgstr "O serviço miniDLNA não está funcionando."
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++"Esta é uma lista de nomes de arquivos para verificar quando procurando arte "
++"do álbum."
++
++msgid "Video"
++msgstr "Video"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "miniDLNA Status"
++
++msgid "miniSSDP socket:"
++msgstr "miniSSDP soquete:"
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/pt/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/pt/minidlna.po
+new file mode 100644
+index 0000000..96132cd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/pt/minidlna.po
+@@ -0,0 +1,171 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-06-03 23:36+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Definições Avançadas"
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr "Número modelo anunciado:"
++
++msgid "Announced serial number:"
++msgstr "Número de série anunciado:"
++
++msgid "Browse directory"
++msgstr "Procurar directório"
++
++msgid "Collecting data..."
++msgstr "A obter dados..."
++
++msgid "Database directory:"
++msgstr "Directório da base de dados:"
++
++msgid "Enable TIVO:"
++msgstr "Ativar TIVO:"
++
++msgid "Enable inotify:"
++msgstr "Ativar inotify:"
++
++msgid "Enable:"
++msgstr "Ativar:"
++
++msgid "Friendly name:"
++msgstr "Nome amigável:"
++
++msgid "General Settings"
++msgstr "Definições Gerais"
++
++msgid "Interfaces:"
++msgstr "Interfaces:"
++
++msgid "Log directory:"
++msgstr "Directório de Log:"
++
++msgid "Media directories:"
++msgstr "Pastas multimédia:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"O MiniDLNA é um software de servidor com o objectivo de ser totalmente "
++"compatível com clientes de DLNA/UPnP-AV."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Número de modelo que o serviço de miniDLNA irá reportar aos clientes na sua "
++"descrição XML."
++
++msgid "Music"
++msgstr "Música"
++
++msgid "Network interfaces to serve."
++msgstr "Interfaces de rede a serem seervidas."
++
++msgid "Notify interval in seconds."
++msgstr "Intervalo de notificação em segundos."
++
++msgid "Notify interval:"
++msgstr "Intervalo de Notificação:"
++
++msgid "Pictures"
++msgstr "Imagens"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Porta para tráfego HTTP (descrições, SOAP, tranferencia de conteudos)."
++
++msgid "Port:"
++msgstr "Porta:"
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/ro/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/ro/minidlna.po
+new file mode 100644
+index 0000000..cba5fe6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/ro/minidlna.po
+@@ -0,0 +1,168 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-09 13:35+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Setări avansate"
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr "Răsfoire director"
++
++msgid "Collecting data..."
++msgstr "Colectare date..."
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr "Activare TIVO:"
++
++msgid "Enable inotify:"
++msgstr "Activare inotify:"
++
++msgid "Enable:"
++msgstr "Activare:"
++
++msgid "Friendly name:"
++msgstr "Nume prieten:"
++
++msgid "General Settings"
++msgstr "Setări generale"
++
++msgid "Interfaces:"
++msgstr "Interfeţe"
++
++msgid "Log directory:"
++msgstr ""
++
++msgid "Media directories:"
++msgstr "Directoare media"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr "Muzică"
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr "Notificare interval în secunde."
++
++msgid "Notify interval:"
++msgstr "Notificare interval:"
++
++msgid "Pictures"
++msgstr "Fotografii"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Port pentru HTTP (descrieri, SOAP, transfer media) trafic."
++
++msgid "Port:"
++msgstr "Port:"
++
++msgid "Presentation URL:"
++msgstr "URL de prezentare:"
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr "Video"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "Stare miniDLNA"
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/ru/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/ru/minidlna.po
+new file mode 100644
+index 0000000..539e8ca
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/ru/minidlna.po
+@@ -0,0 +1,191 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: minidlna\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2013-11-13 18:43+0200\n"
++"Last-Translator: Роман <x.wserfer@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Advanced Settings"
++msgstr "РаÑширенные наÑтройки"
++
++msgid "Album art names:"
++msgstr "Имена обложек альбома:"
++
++msgid "Announced model number:"
++msgstr "Ðомер модели:"
++
++msgid "Announced serial number:"
++msgstr "Серийный номер:"
++
++msgid "Browse directory"
++msgstr "Обзор директории"
++
++msgid "Collecting data..."
++msgstr "Сбор данных..."
++
++msgid "Database directory:"
++msgstr "Папка базы данных:"
++
++msgid "Enable TIVO:"
++msgstr "Включить TIVO:"
++
++msgid "Enable inotify:"
++msgstr "Включить inotify:"
++
++msgid "Enable:"
++msgstr "Включить:"
++
++msgid "Friendly name:"
++msgstr "ПонÑтное имÑ:"
++
++msgid "General Settings"
++msgstr "Общие наÑтройки"
++
++msgid "Interfaces:"
++msgstr "ИнтерфейÑÑ‹:"
++
++msgid "Log directory:"
++msgstr "Папка журнала:"
++
++msgid "Media directories:"
++msgstr "Папки медиа:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++"MiniDLNA - Ñто Ñерверное программное обеÑпечение, имеющее цель обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ "
++"полной ÑовмеÑтимоÑти Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°Ð¼Ð¸ DLNA/UPnP-AV."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Ðомер модели который, miniDLNA будет Ñообщать клиентам в Ñвоём XML-опиÑании."
++
++msgid "Music"
++msgstr "Музыка"
++
++msgid "Network interfaces to serve."
++msgstr "ОбÑлуживаемые Ñетевые интерфейÑÑ‹."
++
++msgid "Notify interval in seconds."
++msgstr "Интервал ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ (Ñекунды)."
++
++msgid "Notify interval:"
++msgstr "Интервал уведомлениÑ:"
++
++msgid "Pictures"
++msgstr "Картинки"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Порт Ð´Ð»Ñ HTTP-трафика (опиÑаниÑ, SOAP, передача мультимедиа)"
++
++msgid "Port:"
++msgstr "Порт:"
++
++msgid "Presentation URL:"
++msgstr "URL предÑтавлениÑ:"
++
++msgid "Root container:"
++msgstr "Корневой контейнер:"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++"Серийный номер, который miniDLNA будет Ñообщать клиентам в Ñвоём XML-"
++"опиÑании."
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr "Изменение имени Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð²."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++"Папка, в которой miniDLNA будет хранить Ñвою базу данных и кÑш обложек "
++"альбомов."
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr "Папка, в которой miniDLNA будет хранить Ñвой файл журнала."
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++"Включение Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ inotify Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ… файлов."
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++"УÑтановите Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ потокового воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² .jpg и ."
++"mp3 Ð´Ð»Ñ TiVo Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ HMO."
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++"УÑтановите Ð´Ð»Ñ Ñтрогого ÑоответÑÑ‚Ð²Ð¸Ñ Ñтандартам DLNA. Это разрешит "
++"уменьшение размера Ñлишком больших JPEG-изображений на Ñтороне Ñервера, что "
++"может повредить производительноÑти (по крайней мере) DLNA-продуктов Sony."
++
++#, fuzzy
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++"Директории, которые необходимо Ñканировать. ЕÑли вы хотите уÑтановить "
++"ограничение на определённый тип Ñодержимого в директории, вы можете напиÑать "
++"тип ('A' Ð´Ð»Ñ Ð°ÑƒÐ´Ð¸Ð¾, 'V' Ð´Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾, 'P' Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹) перед путём к "
++"директории, за которым Ñледует запÑÑ‚Ð°Ñ (напр. media_dir=A,/mnt/media/Music). "
++"Может быть указано неÑколько директорий."
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "Укажите путь к Ñокету MiniSSDPd."
++
++msgid "Standard container"
++msgstr "Стандартный контейнер"
++
++msgid "Strict to DLNA standard:"
++msgstr "Строгий Ñтандарт DLNA:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++"Ð¡ÐµÑ€Ð²Ð¸Ñ miniDLNA запущен, обÑлуживает %d аудио-, %d видео- и %d файлов Ñ "
++"изображениÑми."
++
++msgid "The miniDLNA service is not running."
++msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ miniDLNA не запущен."
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr "Это ÑпиÑок файлов, Ñреди которых необходимо иÑкать обложки альбомов."
++
++msgid "Video"
++msgstr "Видео"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ miniDLNA"
++
++msgid "miniSSDP socket:"
++msgstr "Сокет miniSSDP:"
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/sk/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/sk/minidlna.po
+new file mode 100644
+index 0000000..19c3e53
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/sk/minidlna.po
+@@ -0,0 +1,164 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr ""
++
++msgid "Enable inotify:"
++msgstr ""
++
++msgid "Enable:"
++msgstr ""
++
++msgid "Friendly name:"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Interfaces:"
++msgstr ""
++
++msgid "Log directory:"
++msgstr ""
++
++msgid "Media directories:"
++msgstr ""
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr ""
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr ""
++
++msgid "Notify interval:"
++msgstr ""
++
++msgid "Pictures"
++msgstr ""
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++
++msgid "Port:"
++msgstr ""
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/sv/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/sv/minidlna.po
+new file mode 100644
+index 0000000..51a3f3a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/sv/minidlna.po
+@@ -0,0 +1,165 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr ""
++
++msgid "Enable inotify:"
++msgstr ""
++
++msgid "Enable:"
++msgstr ""
++
++msgid "Friendly name:"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Interfaces:"
++msgstr ""
++
++msgid "Log directory:"
++msgstr ""
++
++msgid "Media directories:"
++msgstr ""
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr ""
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr ""
++
++msgid "Notify interval:"
++msgstr ""
++
++msgid "Pictures"
++msgstr ""
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++
++msgid "Port:"
++msgstr ""
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/templates/minidlna.pot b/feeds/luci/applications/luci-app-minidlna/po/templates/minidlna.pot
+new file mode 100644
+index 0000000..2b35d1e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/templates/minidlna.pot
+@@ -0,0 +1,157 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr ""
++
++msgid "Enable inotify:"
++msgstr ""
++
++msgid "Enable:"
++msgstr ""
++
++msgid "Friendly name:"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Interfaces:"
++msgstr ""
++
++msgid "Log directory:"
++msgstr ""
++
++msgid "Media directories:"
++msgstr ""
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr ""
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr ""
++
++msgid "Notify interval:"
++msgstr ""
++
++msgid "Pictures"
++msgstr ""
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++
++msgid "Port:"
++msgstr ""
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/tr/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/tr/minidlna.po
+new file mode 100644
+index 0000000..070d64c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/tr/minidlna.po
+@@ -0,0 +1,164 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr ""
++
++msgid "Enable inotify:"
++msgstr ""
++
++msgid "Enable:"
++msgstr ""
++
++msgid "Friendly name:"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Interfaces:"
++msgstr ""
++
++msgid "Log directory:"
++msgstr ""
++
++msgid "Media directories:"
++msgstr ""
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr ""
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr ""
++
++msgid "Notify interval:"
++msgstr ""
++
++msgid "Pictures"
++msgstr ""
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++
++msgid "Port:"
++msgstr ""
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/uk/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/uk/minidlna.po
+new file mode 100644
+index 0000000..7df732f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/uk/minidlna.po
+@@ -0,0 +1,165 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr ""
++
++msgid "Enable inotify:"
++msgstr ""
++
++msgid "Enable:"
++msgstr ""
++
++msgid "Friendly name:"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Interfaces:"
++msgstr ""
++
++msgid "Log directory:"
++msgstr ""
++
++msgid "Media directories:"
++msgstr ""
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr ""
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr ""
++
++msgid "Notify interval:"
++msgstr ""
++
++msgid "Pictures"
++msgstr ""
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++
++msgid "Port:"
++msgstr ""
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/vi/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/vi/minidlna.po
+new file mode 100644
+index 0000000..070d64c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/vi/minidlna.po
+@@ -0,0 +1,164 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Album art names:"
++msgstr ""
++
++msgid "Announced model number:"
++msgstr ""
++
++msgid "Announced serial number:"
++msgstr ""
++
++msgid "Browse directory"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Database directory:"
++msgstr ""
++
++msgid "Enable TIVO:"
++msgstr ""
++
++msgid "Enable inotify:"
++msgstr ""
++
++msgid "Enable:"
++msgstr ""
++
++msgid "Friendly name:"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Interfaces:"
++msgstr ""
++
++msgid "Log directory:"
++msgstr ""
++
++msgid "Media directories:"
++msgstr ""
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr ""
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr ""
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr ""
++
++msgid "Notify interval:"
++msgstr ""
++
++msgid "Pictures"
++msgstr ""
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++
++msgid "Port:"
++msgstr ""
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/zh-cn/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/zh-cn/minidlna.po
+new file mode 100644
+index 0000000..9989756
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/zh-cn/minidlna.po
+@@ -0,0 +1,172 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-07 16:21+0200\n"
++"Last-Translator: qiuchengxuan <qiuchengxuan@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "高级设置"
++
++msgid "Album art names:"
++msgstr "专辑å°é¢å称:"
++
++msgid "Announced model number:"
++msgstr "通告型å·ï¼š"
++
++msgid "Announced serial number:"
++msgstr "通告编å·ï¼š"
++
++msgid "Browse directory"
++msgstr "æµè§ˆç›®å½•"
++
++msgid "Collecting data..."
++msgstr "收集数æ®..."
++
++msgid "Database directory:"
++msgstr "æ•°æ®åº“目录:"
++
++msgid "Enable TIVO:"
++msgstr "å¯ç”¨TIVO:"
++
++msgid "Enable inotify:"
++msgstr "å¯ç”¨inotify:"
++
++msgid "Enable:"
++msgstr "å¯ç”¨ï¼š"
++
++msgid "Friendly name:"
++msgstr "å‹å¥½å称:"
++
++msgid "General Settings"
++msgstr "基本设置"
++
++msgid "Interfaces:"
++msgstr "接å£ï¼š"
++
++msgid "Log directory:"
++msgstr "日志目录:"
++
++msgid "Media directories:"
++msgstr "媒体目录:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr "MiniDLNA是目标为完全兼容DLNA / UPnP-AV客户端的æœåŠ¡å™¨è½¯ä»¶ã€‚"
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr "miniDLNA守护程åºå°†åœ¨å…¶XMLæ述中å‘客户端通告型å·ã€‚"
++
++msgid "Music"
++msgstr "音ä¹"
++
++msgid "Network interfaces to serve."
++msgstr "æœåŠ¡çš„网络接å£ã€‚"
++
++msgid "Notify interval in seconds."
++msgstr "通知的时间间隔,以秒为å•ä½ã€‚"
++
++msgid "Notify interval:"
++msgstr "通知的时间间隔:"
++
++msgid "Pictures"
++msgstr "图片"
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++
++msgid "Port:"
++msgstr "端å£ï¼š"
++
++msgid "Presentation URL:"
++msgstr "æœåŠ¡ç½‘å€"
++
++msgid "Root container:"
++msgstr "根目录:"
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr "miniDLNA守护程åºå°†åœ¨å…¶XMLæ述中å‘客户端通告编å·ã€‚"
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr "设置自定义å称。"
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr "设置miniDLNA缓存目录"
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr "设置miniDLNA日志目录"
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr "设定å¯ç”¨inotify监控,自动å‘现新的文件。"
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr "为HMO TiVoå¯ç”¨JPGå’ŒMP3æµåª’体支æŒã€‚"
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++"设定严格éµå®ˆDLNA标准。这将å…许æœåŠ¡å™¨ç«¯é™å°å¤§å°ºå¯¸JPEG图åƒï¼Œåœ¨ï¼ˆè‡³å°‘)索尼DLNA"
++"的产å“è¿™å¯èƒ½ä¼šé™ä½ŽJPEGæœåŠ¡æ€§èƒ½ã€‚"
++
++# 如果写æˆmedia_dir=A,/mnt/media/Music,uci会报错。实际上应该是A,/mnt/media/Music,这样生æˆçš„minidlna.conf刚好是media_dir=A,/mnt/media/Music
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++"设置è¦æ‰«æ的目录。如果你想é™åˆ¶ç‰¹å®šå†…容类型的目录,你å¯ä»¥åœ¨å‰é¢åŠ ä¸Šç±»åž‹ï¼ˆç”¨äºŽéŸ³é¢‘'A','V'视频,'P'图片),其次是用逗å·åˆ†éš”的目录(如A,/mnt"
++"/媒体/音ä¹ï¼‰ã€‚å¯ä»¥æŒ‡å®šå¤šä¸ªç›®å½•ã€‚"
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr "指定MiniSSDPd socket的路径。"
++
++msgid "Standard container"
++msgstr "基本目录"
++
++msgid "Strict to DLNA standard:"
++msgstr "严格的DLNA标准:"
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr "miniDLNAæœåŠ¡å·²å¯ç”¨ï¼Œæä¾› %d 音频, %d 视频 å’Œ %d 图片."
++
++msgid "The miniDLNA service is not running."
++msgstr "miniDLNAæœåŠ¡æœªå¯ç”¨"
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr "这是一个文件å列表,为æœç´¢ä¸“辑å°é¢ã€‚"
++
++msgid "Video"
++msgstr "视频"
++
++msgid "miniDLNA"
++msgstr "miniDLNA"
++
++msgid "miniDLNA Status"
++msgstr "miniDLNA 状æ€"
++
++msgid "miniSSDP socket:"
++msgstr "miniSSDP socket:"
+diff --git a/feeds/luci/applications/luci-app-minidlna/po/zh-tw/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/zh-tw/minidlna.po
+new file mode 100644
+index 0000000..1af3280
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/po/zh-tw/minidlna.po
+@@ -0,0 +1,167 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 13:15+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "進階設定值"
++
++msgid "Album art names:"
++msgstr "專輯å稱"
++
++msgid "Announced model number:"
++msgstr "已宣告型號數é‡"
++
++msgid "Announced serial number:"
++msgstr "已宣告åºè™Ÿæ•¸é‡"
++
++msgid "Browse directory"
++msgstr "ç€è¦½ç›®éŒ„"
++
++msgid "Collecting data..."
++msgstr "收集資料進行中..."
++
++msgid "Database directory:"
++msgstr "資料庫目錄所在:"
++
++msgid "Enable TIVO:"
++msgstr "啟用TIVO代錄"
++
++msgid "Enable inotify:"
++msgstr "啟用檔案事件監控"
++
++msgid "Enable:"
++msgstr "啟用:"
++
++msgid "Friendly name:"
++msgstr "å‹å–„å稱"
++
++msgid "General Settings"
++msgstr "一般設定值"
++
++msgid "Interfaces:"
++msgstr "介é¢"
++
++msgid "Log directory:"
++msgstr "Log紀錄放置å€"
++
++msgid "Media directories:"
++msgstr "媒體目錄å€:"
++
++msgid ""
++"MiniDLNA is server software with the aim of being fully compliant with DLNA/"
++"UPnP-AV clients."
++msgstr "MiniDLNA是一個伺æœå™¨è»Ÿé«”é‡å°èƒ½å®Œå…¨å…¼å®¹DLNA/UPnP-AV用戶端."
++
++msgid ""
++"Model number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid "Music"
++msgstr ""
++
++msgid "Network interfaces to serve."
++msgstr ""
++
++msgid "Notify interval in seconds."
++msgstr ""
++
++msgid "Notify interval:"
++msgstr ""
++
++msgid "Pictures"
++msgstr ""
++
++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic."
++msgstr ""
++
++msgid "Port:"
++msgstr ""
++
++msgid "Presentation URL:"
++msgstr ""
++
++msgid "Root container:"
++msgstr ""
++
++msgid ""
++"Serial number the miniDLNA daemon will report to clients in its XML "
++"description."
++msgstr ""
++
++msgid ""
++"Set this if you want to customize the name that shows up on your clients."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its database and album art cache."
++msgstr ""
++
++msgid ""
++"Set this if you would like to specify the directory where you want MiniDLNA "
++"to store its log file."
++msgstr ""
++
++msgid ""
++"Set this to enable inotify monitoring to automatically discover new files."
++msgstr ""
++
++msgid ""
++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo "
++"supporting HMO."
++msgstr ""
++
++msgid ""
++"Set this to strictly adhere to DLNA standards. This will allow server-side "
++"downscaling of very large JPEG images, which may hurt JPEG serving "
++"performance on (at least) Sony DLNA products."
++msgstr ""
++
++msgid ""
++"Set this to the directory you want scanned. If you want to restrict the "
++"directory to a specific content type, you can prepend the type ('A' for "
++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory "
++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified."
++msgstr ""
++
++msgid "Specify the path to the MiniSSDPd socket."
++msgstr ""
++
++msgid "Standard container"
++msgstr ""
++
++msgid "Strict to DLNA standard:"
++msgstr ""
++
++msgid ""
++"The miniDLNA service is active, serving %d audio, %d video and %d image "
++"files."
++msgstr ""
++
++msgid "The miniDLNA service is not running."
++msgstr ""
++
++msgid "This is a list of file names to check for when searching for album art."
++msgstr ""
++
++msgid "Video"
++msgstr ""
++
++msgid "miniDLNA"
++msgstr ""
++
++msgid "miniDLNA Status"
++msgstr ""
++
++msgid "miniSSDP socket:"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-minidlna/root/etc/uci-defaults/luci-minidlna b/feeds/luci/applications/luci-app-minidlna/root/etc/uci-defaults/luci-minidlna
+new file mode 100755
+index 0000000..df43c1b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-minidlna/root/etc/uci-defaults/luci-minidlna
+@@ -0,0 +1,15 @@
++#!/bin/sh
++
++/etc/init.d/minidlna enabled && {
++ /etc/init.d/minidlna stop
++ /etc/init.d/minidlna disable
++}
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.minidlna
++ set ucitrack.minidlna=minidlna
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/Makefile b/feeds/luci/applications/luci-app-mjpg-streamer/Makefile
+new file mode 100644
+index 0000000..faa024d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mjpg-streamer/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=MJPG-Streamer service configuration module
++LUCI_DEPENDS:=+mjpg-streamer
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/controller/mjpg-streamer.lua b/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/controller/mjpg-streamer.lua
+new file mode 100644
+index 0000000..81fd3b3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/controller/mjpg-streamer.lua
+@@ -0,0 +1,17 @@
++-- Copyright 2014 Roger D <rogerdammit@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.mjpg-streamer", package.seeall)
++
++function index()
++ require("luci.i18n")
++ luci.i18n.loadc("mjpg-streamer")
++ if not nixio.fs.access("/etc/config/mjpg-streamer") then
++ return
++ end
++
++ local page = entry({"admin", "services", "mjpg-streamer"}, cbi("mjpg-streamer"), _("MJPG-streamer"))
++ page.i18n = "mjpg-streamer"
++ page.dependent = true
++
++end
+diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua b/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua
+new file mode 100644
+index 0000000..d89ab27
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua
+@@ -0,0 +1,223 @@
++-- Copyright 2014 Roger D <rogerdammit@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("mjpg-streamer", "MJPG-streamer", translate("mjpg streamer is a streaming application for Linux-UVC compatible webcams"))
++
++--- General settings ---
++
++section_gen = m:section(TypedSection, "mjpg-streamer", translate("General"))
++ section_gen.addremove=false
++ section_gen.anonymous=true
++
++enabled = section_gen:option(Flag, "enabled", translate("Enabled"), translate("Enable MJPG-streamer"))
++
++input = section_gen:option(ListValue, "input", translate("Input plugin"))
++ input:depends("enabled", "1")
++ input:value("uvc", "UVC")
++ ---input:value("file", "File")
++ input.optional = false
++
++output = section_gen:option(ListValue, "output", translate("Output plugin"))
++ output:depends("enabled", "1")
++ output:value("http", "HTTP")
++ output:value("file", "File")
++ output.optional = false
++
++
++--- Plugin settings ---
++
++s = m:section(TypedSection, "mjpg-streamer", translate("Plugin settings"))
++ s.addremove=false
++ s.anonymous=true
++
++ s:tab("output_http", translate("HTTP output"))
++ s:tab("output_file", translate("File output"))
++ s:tab("input_uvc", translate("UVC input"))
++ ---s:tab("input_file", translate("File input"))
++
++
++--- Input UVC settings ---
++
++this_tab = "input_uvc"
++
++device = s:taboption(this_tab, Value, "device", translate("Device"))
++ device.default="/dev/video0"
++ --device.datatype = "device"
++ device:value("/dev/video0", "/dev/video0")
++ device:value("/dev/video1", "/dev/video1")
++ device:value("/dev/video2", "/dev/video2")
++ device.optional = false
++
++resolution = s:taboption(this_tab, Value, "resolution", translate("Resolution"))
++ resolution.default = "640x480"
++ resolution:value("320x240", "320x240")
++ resolution:value("640x480", "640x480")
++ resolution:value("800x600", "800x600")
++ resolution:value("864x480", "864x480")
++ resolution:value("960x544", "960x544")
++ resolution:value("960x720", "960x720")
++ resolution:value("1280x720", "1280x720")
++ resolution:value("1280x960", "1280x960")
++ resolution:value("1920x1080", "1920x1080")
++ resolution.optional = true
++
++fps = s:taboption(this_tab, Value, "fps", translate("Frames per second"))
++ fps.datatype = "and(uinteger, min(1))"
++ fps.placeholder = "5"
++ fps.optional = true
++
++yuv = s:taboption(this_tab, Flag, "yuv", translate("Enable YUYV format"), translate("Automatic disabling of MJPEG mode"))
++
++quality = s:taboption(this_tab, Value, "quality", translate("JPEG compression quality"), translate("Set the quality in percent. This setting activates YUYV format, disables MJPEG"))
++ quality.datatype = "range(0, 100)"
++
++minimum_size = s:taboption(this_tab, Value, "minimum_size", translate("Drop frames smaller then this limit"),translate("Set the minimum size if the webcam produces small-sized garbage frames. May happen under low light conditions"))
++ minimum_size.datatype = "uinteger"
++
++no_dynctrl = s:taboption(this_tab, Flag, "no_dynctrl", translate("Don't initalize dynctrls"), translate("Do not initalize dynctrls of Linux-UVC driver"))
++
++led = s:taboption(this_tab, ListValue, "led", translate("Led control"))
++ led:value("on", translate("On"))
++ led:value("off", translate("Off"))
++ led:value("blink", translate("Blink"))
++ led:value("auto", translate("Auto"))
++ led.optional = true
++
++
++--- Output HTTP settings ---
++
++this_tab = "output_http"
++
++port=s:taboption(this_tab, Value, "port", translate("Port"), translate("TCP port for this HTTP server"))
++ port.datatype = "port"
++ port.placeholder = "8080"
++
++enable_auth = s:taboption(this_tab, Flag, "enable_auth", translate("Authentication required"), translate("Ask for username and password on connect"))
++ enable_auth.default = false
++
++username = s:taboption(this_tab, Value, "username", translate("Username"))
++ username:depends("enable_auth", "1")
++ username.optional = false
++
++password = s:taboption(this_tab, Value, "password", translate("Password"))
++ password:depends("enable_auth", "1")
++ password.password = true
++ password.optional = false
++ password.default = false
++
++www = s:taboption(this_tab, Value, "www", translate("WWW folder"), translate("Folder that contains webpages"))
++ www.datatype = "directory"
++ www.default = "/www/webcam/"
++ www.optional = false
++
++
++--- HTTP preview ---
++
++html = [[
++<style media="screen" type="text/css">
++ .img-preview {
++ display: inline-block;
++ height: auto;
++ width: 640px;
++ padding: 4px;
++ line-height: 1.428571429;
++ background-color: #fff;
++ border: 1px solid #ddd;
++ border-radius: 4px;
++ -webkit-transition: all .2s ease-in-out;
++ transition: all .2s ease-in-out;
++ margin-bottom: 5px;
++ display: none;
++ }
++</style>
++
++<div id="videodiv">
++ <img id="video_preview" class="img-preview" onerror="on_error()" onload="on_load()"/>
++ <p id="stream_status" style="text-align: center; color: orange; font-weight:bold;">Stream unavailable</p>
++</div>
++
++<script type="text/javascript">
++
++function init_stream() {
++ console.log('init_stream');
++ start_stream()
++}
++
++function _start_stream() {
++ console.log('_start_stream');
++
++ port = document.getElementById('cbid.mjpg-streamer.core.port').value
++
++ if (document.getElementById('cbid.mjpg-streamer.core.enable_auth').checked) {
++ user = document.getElementById('cbid.mjpg-streamer.core.username').value
++ pass = document.getElementById('cbid.mjpg-streamer.core.password').value
++ login = user + ":" + pass + "@"
++ } else {
++ login = ""
++ }
++
++ img = document.getElementById('video_preview');
++ img.src = 'http://' + login + location.hostname + ':' + port + '/?action=snapshot';
++}
++
++function start_stream() {
++ console.log('start_stream');
++
++ setTimeout(function() { _start_stream(); }, 500);
++}
++
++function on_error() {
++ console.log('on_error');
++
++ img = document.getElementById('video_preview');
++ img.style.display = 'none';
++
++ stream_stat = document.getElementById('stream_status');
++ stream_stat.style.display = 'block';
++
++ start_stream();
++}
++
++function on_load() {
++ console.log('on_load');
++
++ img = document.getElementById('video_preview');
++ img.style.display = 'block';
++
++ stream_stat = document.getElementById('stream_status');
++ stream_stat.style.display = 'none';
++}
++
++init_stream()
++
++</script>
++]]
++
++preview = s:taboption(this_tab, DummyValue, "_dummy", html)
++ preview:depends("output", "http")
++
++--- Output file settings ---
++
++this_tab = "output_file"
++
++folder=s:taboption(this_tab, Value, "folder", translate("Folder"), translate("Set folder to save pictures"))
++ folder.placeholder="/tmp/images"
++ folder.datatype = "directory"
++
++--mjpeg=s:taboption(this_tab, Value, "mjpeg", translate("Mjpeg output"), translate("Check to save the stream to an mjpeg file"))
++
++delay=s:taboption(this_tab, Value, "delay", translate("Interval between saving pictures"), translate("Set the inteval in millisecond"))
++ delay.placeholder="5000"
++ delay.datatype = "uinteger"
++
++ringbuffer=s:taboption(this_tab, Value, "ringbuffer", translate("Ring buffer size"), translate("Max. number of pictures to hold"))
++ ringbuffer.placeholder="10"
++ ringbuffer.datatype = "uinteger"
++
++exceed=s:taboption(this_tab, Value, "exceed", translate("Exceed"), translate("Allow ringbuffer to exceed limit by this amount"))
++ exceed.datatype = "uinteger"
++
++command=s:taboption(this_tab, Value, "command", translate("Command to run"), translate("Execute command after saving picture. Mjpg-streamer parse the filename as first parameter to your script."))
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/po/templates/mjpg-streamer.pot b/feeds/luci/applications/luci-app-mjpg-streamer/po/templates/mjpg-streamer.pot
+new file mode 100644
+index 0000000..ecb374d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mjpg-streamer/po/templates/mjpg-streamer.pot
+@@ -0,0 +1,153 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Allow ringbuffer to exceed limit by this amount"
++msgstr ""
++
++msgid "Ask for username and password on connect"
++msgstr ""
++
++msgid "Authentication required"
++msgstr ""
++
++msgid "Auto"
++msgstr ""
++
++msgid "Automatic disabling of MJPEG mode"
++msgstr ""
++
++msgid "Blink"
++msgstr ""
++
++msgid "Check to save the stream to an mjpeg file"
++msgstr ""
++
++msgid "Command to run"
++msgstr ""
++
++msgid "Device"
++msgstr ""
++
++msgid "Do not initalize dynctrls of Linux-UVC driver"
++msgstr ""
++
++msgid "Don't initalize dynctrls"
++msgstr ""
++
++msgid "Drop frames smaller then this limit"
++msgstr ""
++
++msgid "Enable MJPG-streamer"
++msgstr ""
++
++msgid "Enable YUYV format"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Exceed"
++msgstr ""
++
++msgid ""
++"Execute command after saving picture. Mjpg-streamer parse the filename as "
++"first parameter to your script."
++msgstr ""
++
++msgid "File input"
++msgstr ""
++
++msgid "File output"
++msgstr ""
++
++msgid "Folder"
++msgstr ""
++
++msgid "Folder that contains webpages"
++msgstr ""
++
++msgid "Frames per second"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "HTTP output"
++msgstr ""
++
++msgid "Input plugin"
++msgstr ""
++
++msgid "Interval between saving pictures"
++msgstr ""
++
++msgid "JPEG compression quality"
++msgstr ""
++
++msgid "Led control"
++msgstr ""
++
++msgid "MJPG-streamer"
++msgstr ""
++
++msgid "Max. number of pictures to hold"
++msgstr ""
++
++msgid "Mjpeg output"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "On"
++msgstr ""
++
++msgid "Output plugin"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Plugin settings"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Resolution"
++msgstr ""
++
++msgid "Ring buffer size"
++msgstr ""
++
++msgid "Set folder to save pictures"
++msgstr ""
++
++msgid "Set the inteval in millisecond"
++msgstr ""
++
++msgid ""
++"Set the minimum size if the webcam produces small-sized garbage frames. May "
++"happen under low light conditions"
++msgstr ""
++
++msgid ""
++"Set the quality in percent. This setting activates YUYV format, disables "
++"MJPEG"
++msgstr ""
++
++msgid "TCP port for this HTTP server"
++msgstr ""
++
++msgid "UVC input"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "WWW folder"
++msgstr ""
++
++msgid ""
++"mjpg streamer is a streaming application for Linux-UVC compatible webcams"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/po/zh-cn/mjpg-streamer.po b/feeds/luci/applications/luci-app-mjpg-streamer/po/zh-cn/mjpg-streamer.po
+new file mode 100644
+index 0000000..8b51f6a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mjpg-streamer/po/zh-cn/mjpg-streamer.po
+@@ -0,0 +1,165 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: luci-app-mjpg-streamer\n"
++"POT-Creation-Date: 2015-06-11 21:11+0100\n"
++"PO-Revision-Date: 2015-06-11 21:11+0100\n"
++"Last-Translator: maz-1 <ohmygod19993 at gmail dotcom>\n"
++"Language-Team: \n"
++"Language: zh-cn\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Poedit 1.5.4\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Allow ringbuffer to exceed limit by this amount"
++msgstr "å…许环形缓冲区最多超过这个数值"
++
++msgid "Ask for username and password on connect"
++msgstr "连接时询问用户å和密ç "
++
++msgid "Authentication required"
++msgstr "需è¦éªŒè¯"
++
++msgid "Auto"
++msgstr "自动"
++
++msgid "Automatic disabling of MJPEG mode"
++msgstr "自动ç¦ç”¨MJPEG模å¼"
++
++msgid "Blink"
++msgstr "é—ªçƒ"
++
++msgid "Check to save the stream to an mjpeg file"
++msgstr "勾选以ä¿å­˜è§†é¢‘æµè‡³ä¸€ä¸ªmjpeg文件"
++
++msgid "Command to run"
++msgstr "è¿è¡Œçš„命令"
++
++msgid "Device"
++msgstr "设备"
++
++msgid "Do not initalize dynctrls of Linux-UVC driver"
++msgstr "ä¸è¦åˆå§‹åŒ–Linux-UVC驱动的dynctrls"
++
++msgid "Don't initalize dynctrls"
++msgstr "ä¸è¦åˆå§‹åŒ–dynctrls"
++
++msgid "Drop frames smaller then this limit"
++msgstr "丢弃å°äºŽè¯¥å°ºå¯¸é™åˆ¶çš„帧"
++
++msgid "Enable MJPG-streamer"
++msgstr "å¯ç”¨MJPG-streamer"
++
++msgid "Enable YUYV format"
++msgstr "å¯ç”¨YUYVæ ¼å¼"
++
++msgid "Enabled"
++msgstr "å¯ç”¨"
++
++msgid "Exceed"
++msgstr "超出"
++
++msgid ""
++"Execute command after saving picture. Mjpg-streamer parse the filename as "
++"first parameter to your script."
++msgstr "ä¿å­˜å›¾ç‰‡åŽæ‰§è¡Œå‘½ä»¤ã€‚文件å将作为第一个å‚数传递给命令。"
++
++msgid "File input"
++msgstr "文件输入"
++
++msgid "File output"
++msgstr "文件输出"
++
++msgid "Folder"
++msgstr "文件夹"
++
++msgid "Folder that contains webpages"
++msgstr "ä¿å­˜ç½‘页的文件夹"
++
++msgid "Frames per second"
++msgstr "帧æ¯ç§’"
++
++msgid "General"
++msgstr "一般设置"
++
++msgid "HTTP output"
++msgstr "HTTP输出"
++
++msgid "Input plugin"
++msgstr "输入æ’件"
++
++msgid "Interval between saving pictures"
++msgstr "图片ä¿å­˜æ—¶é—´é—´éš”"
++
++msgid "JPEG compression quality"
++msgstr "JPEG压缩å“è´¨"
++
++msgid "Led control"
++msgstr "LED控制"
++
++msgid "MJPG-streamer"
++msgstr "MJPG-streamer"
++
++msgid "Max. number of pictures to hold"
++msgstr "ä¿å­˜çš„图片数é‡ä¸Šé™"
++
++msgid "Mjpeg output"
++msgstr "Mjpeg输出"
++
++msgid "Off"
++msgstr "å…³"
++
++msgid "On"
++msgstr "å¼€"
++
++msgid "Output plugin"
++msgstr "输出æ’件"
++
++msgid "Password"
++msgstr "密ç "
++
++msgid "Plugin settings"
++msgstr "æ’件设置"
++
++msgid "Port"
++msgstr "端å£"
++
++msgid "Resolution"
++msgstr "分辨率"
++
++msgid "Ring buffer size"
++msgstr "环形缓冲区大å°"
++
++msgid "Set folder to save pictures"
++msgstr "图片ä¿å­˜ä½ç½®"
++
++msgid "Set the inteval in millisecond"
++msgstr "设置时间间隔(毫秒)"
++
++msgid ""
++"Set the minimum size if the webcam produces small-sized garbage frames. May "
++"happen under low light conditions"
++msgstr "设置无用帧的最å°å°ºå¯¸ã€‚当光照ä¸è¶³æ—¶å¯èƒ½å‡ºçŽ°æ— ç”¨å¸§ã€‚"
++
++msgid ""
++"Set the quality in percent. This setting activates YUYV format, disables "
++"MJPEG"
++msgstr "设置å“质(百分比)。此设置会开å¯YUYVæ ¼å¼è¾“出,关闭MJPEG输出。"
++
++msgid "TCP port for this HTTP server"
++msgstr "HTTPæœåŠ¡ç›‘å¬çš„TCP端å£"
++
++msgid "UVC input"
++msgstr "UVC输入"
++
++msgid "Username"
++msgstr "用户å"
++
++msgid "WWW folder"
++msgstr "WWW文件夹"
++
++msgid ""
++"mjpg streamer is a streaming application for Linux-UVC compatible webcams"
++msgstr "mjpg streamer是一个视频æµç¨‹åºï¼Œç”¨äºŽå…¼å®¹Linux-UVCçš„æ‘„åƒå¤´ã€‚"
+diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/root/etc/uci-defaults/luci-mjpg-streamer b/feeds/luci/applications/luci-app-mjpg-streamer/root/etc/uci-defaults/luci-mjpg-streamer
+new file mode 100755
+index 0000000..6a380cf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mjpg-streamer/root/etc/uci-defaults/luci-mjpg-streamer
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@mjpg-streamer[-1]
++ add ucitrack mjpg-streamer
++ set ucitrack.@mjpg-streamer[-1].init=mjpg-streamer
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/Makefile b/feeds/luci/applications/luci-app-mmc-over-gpio/Makefile
+new file mode 100644
+index 0000000..4e7d695
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=MMC-over-GPIO configuration module
++LUCI_DEPENDS:=+kmod-mmc-over-gpio
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/controller/mmc_over_gpio.lua b/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/controller/mmc_over_gpio.lua
+new file mode 100644
+index 0000000..78ed24f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/controller/mmc_over_gpio.lua
+@@ -0,0 +1,15 @@
++-- Copyright 2008 Yanira <forum-2008@email.de>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.mmc_over_gpio", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/mmc_over_gpio") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "system", "mmc_over_gpio"}, cbi("mmc_over_gpio"), _("MMC/SD driver configuration"), 60)
++ page.dependent = true
++end
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/model/cbi/mmc_over_gpio.lua b/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/model/cbi/mmc_over_gpio.lua
+new file mode 100644
+index 0000000..fd0896c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/model/cbi/mmc_over_gpio.lua
+@@ -0,0 +1,29 @@
++-- Copyright 2008 Yanira <forum-2008@email.de>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("mmc_over_gpio", translate("MMC/SD driver configuration"),
++ translate("MMC/SD driver configuration"))
++
++s = m:section(TypedSection, "mmc_over_gpio", translate("Settings"))
++s.addremove = true
++s.anonymous = true
++
++s:option(Flag, "enabled", translate("Enable"))
++
++s:option(Value, "name", translate("Name"))
++
++pin = s:option(Value, "DI_pin", translate("DI_pin"))
++for i = 0,7 do pin:value(i) end
++
++pin = s:option(Value, "DO_pin", translate("DO_pin"))
++for i = 0,7 do pin:value(i) end
++
++pin = s:option(Value, "CLK_pin", translate("CLK_pin"))
++for i = 0,7 do pin:value(i) end
++
++pin = s:option(Value, "CS_pin", translate("CS_pin"))
++for i = 0,7 do pin:value(i) end
++
++s:option(Value, "mode", translate("Mode"))
++
++return m
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/ca/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ca/mmc_over_gpio.po
+new file mode 100644
+index 0000000..558e10a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ca/mmc_over_gpio.po
+@@ -0,0 +1,43 @@
++# mmc_over_gpio.pot
++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-06-01 23:04+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr ""
++
++msgid "CS_pin"
++msgstr ""
++
++msgid "DI_pin"
++msgstr ""
++
++msgid "DO_pin"
++msgstr ""
++
++msgid "Enable"
++msgstr "Habilita"
++
++msgid "MMC/SD driver configuration"
++msgstr "Configuració de controlador MMC/SD"
++
++msgid "Mode"
++msgstr "Mode"
++
++msgid "Name"
++msgstr "Nom"
++
++msgid "Settings"
++msgstr "Ajusts"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/cs/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/cs/mmc_over_gpio.po
+new file mode 100644
+index 0000000..6a7b7b1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/cs/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++# mmc_over_gpio.pot
++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-15 20:16+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "Pin CLK"
++
++msgid "CS_pin"
++msgstr "Pin CS"
++
++msgid "DI_pin"
++msgstr "Pin DI"
++
++msgid "DO_pin"
++msgstr "Pin DO"
++
++msgid "Enable"
++msgstr "Povolit"
++
++msgid "MMC/SD driver configuration"
++msgstr "Konfigurace ovladaÄe MMC/SD"
++
++msgid "Mode"
++msgstr "Mód"
++
++msgid "Name"
++msgstr "Jméno"
++
++msgid "Settings"
++msgstr "Nastavení"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/de/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/de/mmc_over_gpio.po
+new file mode 100644
+index 0000000..3b21417
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/de/mmc_over_gpio.po
+@@ -0,0 +1,42 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2012-11-28 10:44+0200\n"
++"Last-Translator: dunkelschunkel <dunkelschunkel@googlemail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++# Das wäre der Pin für Clock, also Takt, eventuell kann das auch rein. Halte obige Variante aber für hinreichend
++msgid "CLK_pin"
++msgstr "CLK-Pin"
++
++msgid "CS_pin"
++msgstr "CS-Pin"
++
++msgid "DI_pin"
++msgstr "DI-Pin"
++
++msgid "DO_pin"
++msgstr "DO-Pin"
++
++msgid "Enable"
++msgstr "Aktivieren"
++
++msgid "MMC/SD driver configuration"
++msgstr "MMC/SD Treibereinstellungen"
++
++msgid "Mode"
++msgstr "Modus"
++
++msgid "Name"
++msgstr "Name"
++
++msgid "Settings"
++msgstr "Einstellungen"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/el/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/el/mmc_over_gpio.po
+new file mode 100644
+index 0000000..8aadeff
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/el/mmc_over_gpio.po
+@@ -0,0 +1,39 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-28 02:08+0200\n"
++"PO-Revision-Date: 2010-07-01 20:18+0200\n"
++"Last-Translator: Vasilis Tsiligiannis <b_tsiligiannis@silverton.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "CLK_pin"
++msgstr ""
++
++msgid "CS_pin"
++msgstr ""
++
++msgid "DI_pin"
++msgstr ""
++
++msgid "DO_pin"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "MMC/SD driver configuration"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Settings"
++msgstr "Ρυθμίσεις"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/en/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/en/mmc_over_gpio.po
+new file mode 100644
+index 0000000..bd8f3c8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/en/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-03-21 18:31+0200\n"
++"Last-Translator: Anonymous Pootle User\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: en\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "CLK_pin"
++msgstr ""
++
++msgid "CS_pin"
++msgstr ""
++
++msgid "DI_pin"
++msgstr ""
++
++msgid "DO_pin"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "MMC/SD driver configuration"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Settings"
++msgstr "Settings"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/es/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/es/mmc_over_gpio.po
+new file mode 100644
+index 0000000..ee0b0c6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/es/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-08-19 21:05+0200\n"
++"Last-Translator: josevteg <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "Pin CLK"
++
++msgid "CS_pin"
++msgstr "Pin CS"
++
++msgid "DI_pin"
++msgstr "Pin DI"
++
++msgid "DO_pin"
++msgstr "Pin DO"
++
++msgid "Enable"
++msgstr "Activar"
++
++msgid "MMC/SD driver configuration"
++msgstr "Configuración de controlador MMC/SD"
++
++msgid "Mode"
++msgstr "Modo"
++
++msgid "Name"
++msgstr "Nombre"
++
++msgid "Settings"
++msgstr "Configuración"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/fr/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/fr/mmc_over_gpio.po
+new file mode 100644
+index 0000000..64dc899
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/fr/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-11-06 16:06+0200\n"
++"Last-Translator: hogsim <hogsim@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "CLK_pin"
++
++msgid "CS_pin"
++msgstr "CS_pin"
++
++msgid "DI_pin"
++msgstr "DI_pin"
++
++msgid "DO_pin"
++msgstr "DO_pin"
++
++msgid "Enable"
++msgstr "Activer"
++
++msgid "MMC/SD driver configuration"
++msgstr "Configuration driver MMC/SD"
++
++msgid "Mode"
++msgstr "Mode"
++
++msgid "Name"
++msgstr "Nom"
++
++msgid "Settings"
++msgstr "Configuration"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/he/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/he/mmc_over_gpio.po
+new file mode 100644
+index 0000000..bf506c0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/he/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++# mmc_over_gpio.pot
++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-10 04:34+0200\n"
++"Last-Translator: Snoof <sagim9@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr ""
++
++msgid "CS_pin"
++msgstr ""
++
++msgid "DI_pin"
++msgstr ""
++
++msgid "DO_pin"
++msgstr ""
++
++msgid "Enable"
++msgstr "×פשר"
++
++msgid "MMC/SD driver configuration"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Name"
++msgstr "ש×"
++
++msgid "Settings"
++msgstr "הגדרות"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/hu/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/hu/mmc_over_gpio.po
+new file mode 100644
+index 0000000..758c711
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/hu/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++# mmc_over_gpio.pot
++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-12-30 19:09+0200\n"
++"Last-Translator: romboyco <romboyco@gmail.com>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "CLK_pin"
++
++msgid "CS_pin"
++msgstr "CS_pin"
++
++msgid "DI_pin"
++msgstr "DI_pin"
++
++msgid "DO_pin"
++msgstr "DO_pin"
++
++msgid "Enable"
++msgstr "Bekapcsolás"
++
++msgid "MMC/SD driver configuration"
++msgstr "MMC/SD driver konfiguráció"
++
++msgid "Mode"
++msgstr "Mód"
++
++msgid "Name"
++msgstr "Név"
++
++msgid "Settings"
++msgstr "Beállítások"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/it/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/it/mmc_over_gpio.po
+new file mode 100644
+index 0000000..e0f371a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/it/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-02-03 13:57+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "CLK_pin"
++
++msgid "CS_pin"
++msgstr "CS_pin"
++
++msgid "DI_pin"
++msgstr "DI_pin"
++
++msgid "DO_pin"
++msgstr "DO_pin"
++
++msgid "Enable"
++msgstr "Attiva"
++
++msgid "MMC/SD driver configuration"
++msgstr "Configurazione driver MMC/SD"
++
++msgid "Mode"
++msgstr "Modalità"
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Settings"
++msgstr "Opzioni"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/ja/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ja/mmc_over_gpio.po
+new file mode 100644
+index 0000000..5c0f102
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ja/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-10-05 16:45+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "CLK_pin"
++
++msgid "CS_pin"
++msgstr "CS_pin"
++
++msgid "DI_pin"
++msgstr "DI_pin"
++
++msgid "DO_pin"
++msgstr "DO_pin"
++
++msgid "Enable"
++msgstr "有効"
++
++msgid "MMC/SD driver configuration"
++msgstr "MMC/SD ドライãƒè¨­å®š"
++
++msgid "Mode"
++msgstr "モード"
++
++msgid "Name"
++msgstr "åå‰"
++
++msgid "Settings"
++msgstr "設定"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/ms/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ms/mmc_over_gpio.po
+new file mode 100644
+index 0000000..edbb2ce
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ms/mmc_over_gpio.po
+@@ -0,0 +1,37 @@
++# mmc_over_gpio.pot
++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "CLK_pin"
++msgstr ""
++
++msgid "CS_pin"
++msgstr ""
++
++msgid "DI_pin"
++msgstr ""
++
++msgid "DO_pin"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "MMC/SD driver configuration"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/no/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/no/mmc_over_gpio.po
+new file mode 100644
+index 0000000..ea9a533
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/no/mmc_over_gpio.po
+@@ -0,0 +1,32 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "CLK_pin"
++msgstr "CLK_pin"
++
++msgid "CS_pin"
++msgstr "CS_pin"
++
++msgid "DI_pin"
++msgstr "DI_pin"
++
++msgid "DO_pin"
++msgstr "DO_pin"
++
++msgid "Enable"
++msgstr "Aktiver"
++
++msgid "MMC/SD driver configuration"
++msgstr "MMC/SD Konfigurasjon"
++
++msgid "Mode"
++msgstr "Modus"
++
++msgid "Name"
++msgstr "Navn"
++
++msgid "Settings"
++msgstr "Innstillinger"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/pl/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pl/mmc_over_gpio.po
+new file mode 100644
+index 0000000..ff5b51b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pl/mmc_over_gpio.po
+@@ -0,0 +1,42 @@
++# mmc_over_gpio.pot
++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-08-26 12:23+0200\n"
++"Last-Translator: Staszek <fistaszek@tlen.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "CLK_pin"
++msgstr "Pin CLK"
++
++msgid "CS_pin"
++msgstr "Pin CS"
++
++msgid "DI_pin"
++msgstr "Pin DI"
++
++msgid "DO_pin"
++msgstr "Pin DO"
++
++msgid "Enable"
++msgstr "Uaktywnij"
++
++msgid "MMC/SD driver configuration"
++msgstr "Konfiguracja sterownika MMC/SD"
++
++msgid "Mode"
++msgstr "Tryb"
++
++msgid "Name"
++msgstr "Nazwa"
++
++msgid "Settings"
++msgstr "Ustawienia"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt-br/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt-br/mmc_over_gpio.po
+new file mode 100644
+index 0000000..9fbbf0f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt-br/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-07-05 06:43+0200\n"
++"Last-Translator: rafaelff1 <rafael.f.f1@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "CLK_pin"
++
++msgid "CS_pin"
++msgstr "CS_pin"
++
++msgid "DI_pin"
++msgstr "DI_pin"
++
++msgid "DO_pin"
++msgstr "DO_pin"
++
++msgid "Enable"
++msgstr "Habilitar"
++
++msgid "MMC/SD driver configuration"
++msgstr "Configuração de driver MMC/SD"
++
++msgid "Mode"
++msgstr "Modo"
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Settings"
++msgstr "Configurações"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt/mmc_over_gpio.po
+new file mode 100644
+index 0000000..497c0b0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-05-31 15:28+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "CLK_pin"
++
++msgid "CS_pin"
++msgstr "CS_pin"
++
++msgid "DI_pin"
++msgstr "DI_pin"
++
++msgid "DO_pin"
++msgstr "DO_pin"
++
++msgid "Enable"
++msgstr "Ativar"
++
++msgid "MMC/SD driver configuration"
++msgstr "Configuração do driver MMC/SD"
++
++msgid "Mode"
++msgstr "Modo"
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Settings"
++msgstr "Definições"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/ro/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ro/mmc_over_gpio.po
+new file mode 100644
+index 0000000..e465f0a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ro/mmc_over_gpio.po
+@@ -0,0 +1,42 @@
++# mmc_over_gpio.pot
++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-28 19:22+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "CLK_pin"
++
++msgid "CS_pin"
++msgstr "CS_pin"
++
++msgid "DI_pin"
++msgstr "DI_pin"
++
++msgid "DO_pin"
++msgstr "DO_pin"
++
++msgid "Enable"
++msgstr "Activare"
++
++msgid "MMC/SD driver configuration"
++msgstr "Configurare driver MMC/SD"
++
++msgid "Mode"
++msgstr "Mod"
++
++msgid "Name"
++msgstr "Nume"
++
++msgid "Settings"
++msgstr "Setări"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/ru/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ru/mmc_over_gpio.po
+new file mode 100644
+index 0000000..dcc2e93
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ru/mmc_over_gpio.po
+@@ -0,0 +1,43 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: mmc_over_gpio\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-08-15 11:23+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "CLK_pin"
++msgstr "Вывод CLK"
++
++msgid "CS_pin"
++msgstr "Вывод CS"
++
++msgid "DI_pin"
++msgstr "Вывод DI"
++
++msgid "DO_pin"
++msgstr "Вывод DO"
++
++msgid "Enable"
++msgstr "Включить"
++
++msgid "MMC/SD driver configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° MMC/SD"
++
++msgid "Mode"
++msgstr "Режим"
++
++msgid "Name"
++msgstr "ИмÑ"
++
++msgid "Settings"
++msgstr "ÐаÑтройки"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/sk/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/sk/mmc_over_gpio.po
+new file mode 100644
+index 0000000..587ee42
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/sk/mmc_over_gpio.po
+@@ -0,0 +1,36 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "CLK_pin"
++msgstr ""
++
++msgid "CS_pin"
++msgstr ""
++
++msgid "DI_pin"
++msgstr ""
++
++msgid "DO_pin"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "MMC/SD driver configuration"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/sv/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/sv/mmc_over_gpio.po
+new file mode 100644
+index 0000000..d6e5ace
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/sv/mmc_over_gpio.po
+@@ -0,0 +1,37 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "CLK_pin"
++msgstr ""
++
++msgid "CS_pin"
++msgstr ""
++
++msgid "DI_pin"
++msgstr ""
++
++msgid "DO_pin"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "MMC/SD driver configuration"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/templates/mmc_over_gpio.pot b/feeds/luci/applications/luci-app-mmc-over-gpio/po/templates/mmc_over_gpio.pot
+new file mode 100644
+index 0000000..1cc8de3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/templates/mmc_over_gpio.pot
+@@ -0,0 +1,29 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "CLK_pin"
++msgstr ""
++
++msgid "CS_pin"
++msgstr ""
++
++msgid "DI_pin"
++msgstr ""
++
++msgid "DO_pin"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "MMC/SD driver configuration"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/tr/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/tr/mmc_over_gpio.po
+new file mode 100644
+index 0000000..349b8fc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/tr/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++# mmc_over_gpio.pot
++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-10-11 23:19+0200\n"
++"Last-Translator: vincenzo <tayfun_ozturk@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: tr\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: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "CLK_ayağı"
++
++msgid "CS_pin"
++msgstr "CS_ayağı"
++
++msgid "DI_pin"
++msgstr "DI_ayağı"
++
++msgid "DO_pin"
++msgstr "DO_ayağı"
++
++msgid "Enable"
++msgstr "EtkinleÅŸtir"
++
++msgid "MMC/SD driver configuration"
++msgstr "MMC/SD Sürücü Yapılandırması"
++
++msgid "Mode"
++msgstr "Mod"
++
++msgid "Name"
++msgstr "isim"
++
++msgid "Settings"
++msgstr "Ayarlar"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/uk/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/uk/mmc_over_gpio.po
+new file mode 100644
+index 0000000..e9b37f2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/uk/mmc_over_gpio.po
+@@ -0,0 +1,42 @@
++# mmc_over_gpio.pot
++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-12-29 13:06+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "CLK_pin"
++msgstr "Вивід ВCLK"
++
++msgid "CS_pin"
++msgstr "Вивід CS"
++
++msgid "DI_pin"
++msgstr "Вивід DI"
++
++msgid "DO_pin"
++msgstr "Вивід DO"
++
++msgid "Enable"
++msgstr "Увімкнути"
++
++msgid "MMC/SD driver configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° MMC/SD"
++
++msgid "Mode"
++msgstr "Режим"
++
++msgid "Name"
++msgstr "Ім'Ñ"
++
++msgid "Settings"
++msgstr "ÐаÑтройки"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/vi/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/vi/mmc_over_gpio.po
+new file mode 100644
+index 0000000..febcbc0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/vi/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++# mmc_over_gpio.pot
++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:59+0200\n"
++"PO-Revision-Date: 2009-08-13 03:43+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "CLK_pin"
++msgstr ""
++
++msgid "CS_pin"
++msgstr ""
++
++msgid "DI_pin"
++msgstr ""
++
++msgid "DO_pin"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "MMC/SD driver configuration"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Settings"
++msgstr "Sắp đặt"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-cn/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-cn/mmc_over_gpio.po
+new file mode 100644
+index 0000000..27dcefd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-cn/mmc_over_gpio.po
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2013-10-08 15:25+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "CLK针脚"
++
++msgid "CS_pin"
++msgstr "CS针脚"
++
++msgid "DI_pin"
++msgstr "DI针脚"
++
++msgid "DO_pin"
++msgstr "DO针脚"
++
++msgid "Enable"
++msgstr "å…许"
++
++msgid "MMC/SD driver configuration"
++msgstr "MMC/SD驱动é…ç½®"
++
++msgid "Mode"
++msgstr "模å¼"
++
++msgid "Name"
++msgstr "å称"
++
++msgid "Settings"
++msgstr "设置"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-tw/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-tw/mmc_over_gpio.po
+new file mode 100644
+index 0000000..fe12e66
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-tw/mmc_over_gpio.po
+@@ -0,0 +1,39 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-21 12:48+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "CLK_pin"
++msgstr "CLK_pinè…³"
++
++msgid "CS_pin"
++msgstr "CS_pinè…³"
++
++msgid "DI_pin"
++msgstr "DI_pinè…³"
++
++msgid "DO_pin"
++msgstr "DO_pinè…³"
++
++msgid "Enable"
++msgstr "啟用"
++
++msgid "MMC/SD driver configuration"
++msgstr "MMC/SD記憶å¡é©…動程å¼è¨­å®š"
++
++msgid "Mode"
++msgstr "模å¼"
++
++msgid "Name"
++msgstr "å稱"
++
++msgid "Settings"
++msgstr "設定值"
+diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/root/etc/uci-defaults/luci-mmc-over-gpio b/feeds/luci/applications/luci-app-mmc-over-gpio/root/etc/uci-defaults/luci-mmc-over-gpio
+new file mode 100755
+index 0000000..c6e79e6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/root/etc/uci-defaults/luci-mmc-over-gpio
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@mmc_over_gpio[-1]
++ add ucitrack mmc_over_gpio
++ set ucitrack.@mmc_over_gpio[-1].init=mmc_over_gpio
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-multiwan/Makefile b/feeds/luci/applications/luci-app-multiwan/Makefile
+new file mode 100644
+index 0000000..c5b731a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for the OpenWrt MultiWAN agent (obsoleted by mwan3)
++LUCI_DEPENDS:=+multiwan @BROKEN
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-multiwan/luasrc/controller/multiwan.lua b/feeds/luci/applications/luci-app-multiwan/luasrc/controller/multiwan.lua
+new file mode 100644
+index 0000000..523ac21
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/luasrc/controller/multiwan.lua
+@@ -0,0 +1,60 @@
++module("luci.controller.multiwan", package.seeall)
++
++function index()
++ local fs = require "nixio.fs"
++ if not fs.access("/etc/config/multiwan") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "network", "multiwan"}, cbi("multiwan/multiwan"), _("Multi-WAN"))
++ page.dependent = true
++
++ entry({"admin", "network", "multiwan", "status"}, call("multiwan_status"))
++
++ page = entry({"mini", "network", "multiwan"}, cbi("multiwan/multiwanmini", {autoapply=true}), _("Multi-WAN"))
++ page.dependent = true
++end
++function multiwan_status()
++ local nfs = require "nixio.fs"
++ local cachefile = "/tmp/.mwan/cache"
++
++ local rv = { }
++
++ cachefile = nfs.readfile(cachefile)
++ if cachefile then
++ local ntm = require "luci.model.network".init()
++ _, _, wan_if_map = string.find(cachefile, "wan_if_map=\"([^\"]*)\"")
++ _, _, wan_fail_map = string.find(cachefile, "wan_fail_map=\"([^\"]*)\"")
++ _, _, wan_recovery_map = string.find(cachefile, "wan_recovery_map=\"([^\"]*)\"")
++
++ rv.wans = { }
++ wansid = {}
++
++ for wanname, wanifname in string.gfind(wan_if_map, "([^%[]+)%[([^%]]+)%]") do
++ local wanlink = ntm:get_interface(wanifname)
++ wanlink = wanlink and wanlink:get_network()
++ wanlink = wanlink and wanlink:adminlink() or "#"
++ wansid[wanname] = #rv.wans + 1
++ rv.wans[wansid[wanname]] = { name = wanname, link = wanlink, ifname = wanifname, status = "ok", count = 0 }
++ end
++
++ for wanname, failcount in string.gfind(wan_fail_map, "([^%[]+)%[([^%]]+)%]") do
++ if failcount == "x" then
++ rv.wans[wansid[wanname]].status = "ko"
++ else
++ rv.wans[wansid[wanname]].status = "failing"
++ rv.wans[wansid[wanname]].count = failcount
++ end
++ end
++
++ for wanname, recoverycount in string.gfind(wan_recovery_map, "([^%[]+)%[([^%]]+)%]") do
++ rv.wans[wansid[wanname]].status = "recovering"
++ rv.wans[wansid[wanname]].count = recoverycount
++ end
++ end
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++end
+diff --git a/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwan.lua b/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwan.lua
+new file mode 100644
+index 0000000..586b630
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwan.lua
+@@ -0,0 +1,155 @@
++require("luci.tools.webadmin")
++
++m = Map("multiwan", translate("Multi-WAN"),
++ translate("Multi-WAN allows for the use of multiple uplinks for load balancing and failover."))
++
++s = m:section(NamedSection, "config", "multiwan", "")
++
++e = s:option(Flag, "enabled", translate("Enable"))
++e.rmempty = false
++e.default = e.enabled
++
++function e.write(self, section, value)
++ if value == "0" then
++ os.execute("/etc/init.d/multiwan stop")
++ else
++ os.execute("/etc/init.d/multiwan enable")
++ end
++ Flag.write(self, section, value)
++end
++
++s = m:section(TypedSection, "interface", translate("WAN Interfaces"),
++ translate("Health Monitor detects and corrects network changes and failed connections."))
++s.addremove = true
++
++weight = s:option(ListValue, "weight", translate("Load Balancer Distribution"))
++weight:value("10", "10")
++weight:value("9", "9")
++weight:value("8", "8")
++weight:value("7", "7")
++weight:value("6", "6")
++weight:value("5", "5")
++weight:value("4", "4")
++weight:value("3", "3")
++weight:value("2", "2")
++weight:value("1", "1")
++weight:value("disable", translate("None"))
++weight.default = "10"
++weight.optional = false
++weight.rmempty = false
++
++interval = s:option(ListValue, "health_interval", translate("Health Monitor Interval"))
++interval:value("disable", translate("Disable"))
++interval:value("5", "5 sec.")
++interval:value("10", "10 sec.")
++interval:value("20", "20 sec.")
++interval:value("30", "30 sec.")
++interval:value("60", "60 sec.")
++interval:value("120", "120 sec.")
++interval.default = "10"
++interval.optional = false
++interval.rmempty = false
++
++icmp_hosts = s:option(Value, "icmp_hosts", translate("Health Monitor ICMP Host(s)"))
++icmp_hosts:value("disable", translate("Disable"))
++icmp_hosts:value("dns", "DNS Server(s)")
++icmp_hosts:value("gateway", "WAN Gateway")
++icmp_hosts.default = "dns"
++icmp_hosts.optional = false
++icmp_hosts.rmempty = false
++
++timeout = s:option(ListValue, "timeout", translate("Health Monitor ICMP Timeout"))
++timeout:value("1", "1 sec.")
++timeout:value("2", "2 sec.")
++timeout:value("3", "3 sec.")
++timeout:value("4", "4 sec.")
++timeout:value("5", "5 sec.")
++timeout:value("10", "10 sec.")
++timeout.default = "3"
++timeout.optional = false
++timeout.rmempty = false
++
++fail = s:option(ListValue, "health_fail_retries", translate("Attempts Before WAN Failover"))
++fail:value("1", "1")
++fail:value("3", "3")
++fail:value("5", "5")
++fail:value("10", "10")
++fail:value("15", "15")
++fail:value("20", "20")
++fail.default = "3"
++fail.optional = false
++fail.rmempty = false
++
++recovery = s:option(ListValue, "health_recovery_retries", translate("Attempts Before WAN Recovery"))
++recovery:value("1", "1")
++recovery:value("3", "3")
++recovery:value("5", "5")
++recovery:value("10", "10")
++recovery:value("15", "15")
++recovery:value("20", "20")
++recovery.default = "5"
++recovery.optional = false
++recovery.rmempty = false
++
++failover_to = s:option(ListValue, "failover_to", translate("Failover Traffic Destination"))
++failover_to:value("disable", translate("None"))
++luci.tools.webadmin.cbi_add_networks(failover_to)
++failover_to:value("fastbalancer", translate("Load Balancer(Performance)"))
++failover_to:value("balancer", translate("Load Balancer(Compatibility)"))
++failover_to.default = "balancer"
++failover_to.optional = false
++failover_to.rmempty = false
++
++dns = s:option(Value, "dns", translate("DNS Server(s)"))
++dns:value("auto", translate("Auto"))
++dns.default = "auto"
++dns.optional = false
++dns.rmempty = true
++
++s = m:section(TypedSection, "mwanfw", translate("Multi-WAN Traffic Rules"),
++ translate("Configure rules for directing outbound traffic through specified WAN Uplinks."))
++s.template = "cbi/tblsection"
++s.anonymous = true
++s.addremove = true
++
++src = s:option(Value, "src", translate("Source Address"))
++src.rmempty = true
++src:value("", translate("all"))
++luci.tools.webadmin.cbi_add_knownips(src)
++
++dst = s:option(Value, "dst", translate("Destination Address"))
++dst.rmempty = true
++dst:value("", translate("all"))
++luci.tools.webadmin.cbi_add_knownips(dst)
++
++proto = s:option(Value, "proto", translate("Protocol"))
++proto:value("", translate("all"))
++proto:value("tcp", "TCP")
++proto:value("udp", "UDP")
++proto:value("icmp", "ICMP")
++proto.rmempty = true
++
++ports = s:option(Value, "ports", translate("Ports"))
++ports.rmempty = true
++ports:value("", translate("all", translate("all")))
++
++wanrule = s:option(ListValue, "wanrule", translate("WAN Uplink"))
++luci.tools.webadmin.cbi_add_networks(wanrule)
++wanrule:value("fastbalancer", translate("Load Balancer(Performance)"))
++wanrule:value("balancer", translate("Load Balancer(Compatibility)"))
++wanrule.default = "fastbalancer"
++wanrule.optional = false
++wanrule.rmempty = false
++
++s = m:section(NamedSection, "config", "", "")
++s.addremove = false
++
++default_route = s:option(ListValue, "default_route", translate("Default Route"))
++luci.tools.webadmin.cbi_add_networks(default_route)
++default_route:value("fastbalancer", translate("Load Balancer(Performance)"))
++default_route:value("balancer", translate("Load Balancer(Compatibility)"))
++default_route.default = "balancer"
++default_route.optional = false
++default_route.rmempty = false
++
++return m
+diff --git a/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwanmini.lua b/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwanmini.lua
+new file mode 100644
+index 0000000..d389745
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwanmini.lua
+@@ -0,0 +1,67 @@
++require("luci.tools.webadmin")
++
++m = Map("multiwan", translate("Multi-WAN"),
++ translate("Multi-WAN allows for the use of multiple uplinks for load balancing and failover."))
++
++s = m:section(NamedSection, "config", "multiwan", "")
++
++e = s:option(Flag, "enabled", translate("Enable"))
++e.rmempty = false
++e.default = "1"
++
++function e.write(self, section, value)
++ if value == "0" then
++ os.execute("/etc/init.d/multiwan stop")
++ else
++ os.execute("/etc/init.d/multiwan enable")
++ end
++ Flag.write(self, section, value)
++end
++
++s = m:section(TypedSection, "mwanfw", translate("Multi-WAN Traffic Rules"),
++ translate("Configure rules for directing outbound traffic through specified WAN Uplinks."))
++s.template = "cbi/tblsection"
++s.anonymous = true
++s.addremove = true
++
++src = s:option(Value, "src", translate("Source Address"))
++src.rmempty = true
++src:value("", translate("all"))
++luci.tools.webadmin.cbi_add_knownips(src)
++
++dst = s:option(Value, "dst", translate("Destination Address"))
++dst.rmempty = true
++dst:value("", translate("all"))
++luci.tools.webadmin.cbi_add_knownips(dst)
++
++proto = s:option(Value, "proto", translate("Protocol"))
++proto:value("", translate("all"))
++proto:value("tcp", "TCP")
++proto:value("udp", "UDP")
++proto:value("icmp", "ICMP")
++proto.rmempty = true
++
++ports = s:option(Value, "ports", translate("Ports"))
++ports.rmempty = true
++ports:value("", translate("all", translate("all")))
++
++wanrule = s:option(ListValue, "wanrule", translate("WAN Uplink"))
++luci.tools.webadmin.cbi_add_networks(wanrule)
++wanrule:value("fastbalancer", translate("Load Balancer(Performance)"))
++wanrule:value("balancer", translate("Load Balancer(Compatibility)"))
++wanrule.default = "fastbalancer"
++wanrule.optional = false
++wanrule.rmempty = false
++
++s = m:section(NamedSection, "config", "", "")
++s.addremove = false
++
++default_route = s:option(ListValue, "default_route", translate("Default Route"))
++luci.tools.webadmin.cbi_add_networks(default_route)
++default_route:value("fastbalancer", translate("Load Balancer(Performance)"))
++default_route:value("balancer", translate("Load Balancer(Compatibility)"))
++default_route.default = "balancer"
++default_route.optional = false
++default_route.rmempty = false
++
++return m
+diff --git a/feeds/luci/applications/luci-app-multiwan/luasrc/view/admin_status/index/multiwan.htm b/feeds/luci/applications/luci-app-multiwan/luasrc/view/admin_status/index/multiwan.htm
+new file mode 100644
+index 0000000..79c0453
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/luasrc/view/admin_status/index/multiwan.htm
+@@ -0,0 +1 @@
++<%+multiwan_status%>
+diff --git a/feeds/luci/applications/luci-app-multiwan/luasrc/view/multiwan_status.htm b/feeds/luci/applications/luci-app-multiwan/luasrc/view/multiwan_status.htm
+new file mode 100644
+index 0000000..03bfad1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/luasrc/view/multiwan_status.htm
+@@ -0,0 +1,71 @@
++<script type="text/javascript">//<![CDATA[
++ XHR.poll(5, '<%=url('admin/network/multiwan/status')%>', null,
++ function(x, st)
++ {
++ var tx = document.getElementById('multiwan_status_text');
++ if (tx)
++ {
++ if (st && st.wans)
++ {
++ var temp = '';
++
++ for( var i = 0; i < st.wans.length; i++ )
++ {
++ var stat = '<%:Unknown%>';
++ var cssc = '';
++
++ switch (st.wans[i].status)
++ {
++ case 'ok':
++ stat = '<%:OK%>';
++ cssc = 'wanok';
++ break;
++
++ case 'ko':
++ stat = '<%:KO%>';
++ cssc = 'wanko';
++ break;
++
++ case 'recovering':
++ stat = String.format('<%:Recovering%>(%d)', st.wans[i].count);
++ cssc = 'wanrecov';
++ break;
++
++ case 'failing':
++ stat = String.format('<%:Failing%>(%d)', st.wans[i].count);
++ cssc = 'wanfail';
++ break;
++ }
++
++ temp += String.format(
++ '<span class="%s"><strong>%s (<a href="%q">%s</a>) :</strong> %s</span>',
++ cssc, st.wans[i].name, st.wans[i].link, st.wans[i].ifname, stat
++ );
++ }
++
++ tx.innerHTML = temp;
++ }
++ else
++ {
++ tx.innerHTML = '';
++ }
++ }
++ }
++ );
++//]]></script>
++
++<style type="text/css">
++ .wanok { background-color: rgb(144, 240, 144); }
++ .wanko { background-color: rgb(240, 144, 144); }
++ .wanrecov { background-color: rgb(240, 240, 0); }
++ .wanfail { background-color: rgb(255, 165, 0); }
++ .wanko, .wanok, .wanrecov, .wanfail {
++ padding: 0.4em;
++ margin: 0.4em;
++ }
++</style>
++
++<fieldset class="cbi-section">
++ <legend><%:Multi-WAN Status%></legend>
++ <div id="multiwan_status_text" style="text-align:center;"><em><%:Collecting data...%></em></div>
++</fieldset>
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/ca/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/ca/multiwan.po
+new file mode 100644
+index 0000000..eb81ae8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/ca/multiwan.po
+@@ -0,0 +1,124 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-01 04:22+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "Intents abans de commutació WAN"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "Intents abans de recuperació WAN"
++
++msgid "Auto"
++msgstr "Auto"
++
++msgid "Collecting data..."
++msgstr "Recollint dades..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Configureu les regles per dirigir trànsit sortint a través d'enllaços "
++"ascendents WAN especificats."
++
++msgid "DNS Server(s)"
++msgstr "Servidors DNS"
++
++msgid "Default Route"
++msgstr "Ruta per defecte"
++
++msgid "Destination Address"
++msgstr "Adreça de destí"
++
++msgid "Disable"
++msgstr "Inhabilita"
++
++msgid "Enable"
++msgstr "Habilita"
++
++msgid "Failing"
++msgstr "Fallant"
++
++msgid "Failover Traffic Destination"
++msgstr "Destí de trànsit al commutar"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "Hosts ICMP de monitor de salut"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "Temps d'espera ICMP del monitor de salut"
++
++msgid "Health Monitor Interval"
++msgstr "Interval del monitor de salut"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"El monitor de salut detecta i corregeix canvis de xarxa i connexions "
++"fallades."
++
++msgid "KO"
++msgstr "KO"
++
++msgid "Load Balancer Distribution"
++msgstr "Distribució de l'equilibrador de carrega"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "Equilibrador de carrega (compatibilitat)"
++
++msgid "Load Balancer(Performance)"
++msgstr "Equilibrador de carrega (rendiment)"
++
++msgid "Multi-WAN"
++msgstr "Multi-WAN"
++
++msgid "Multi-WAN Status"
++msgstr "Estat de Multi-WAN"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Regles de trànsit de Multi-WAN"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"El Multi-WAN permet el ús de múltiples enllaços ascendents per a equilibri "
++"de carrega i commutació d'errors."
++
++msgid "None"
++msgstr "Cap"
++
++msgid "OK"
++msgstr "D'acord"
++
++msgid "Ports"
++msgstr "Ports"
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Recovering"
++msgstr "Recuperant"
++
++msgid "Source Address"
++msgstr "Adreça d'origen"
++
++msgid "Unknown"
++msgstr "Desconegut"
++
++msgid "WAN Interfaces"
++msgstr "Interfícies WAN"
++
++msgid "WAN Uplink"
++msgstr "Enllaç ascendent WAN"
++
++msgid "all"
++msgstr "tots"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/cs/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/cs/multiwan.po
+new file mode 100644
+index 0000000..0629827
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/cs/multiwan.po
+@@ -0,0 +1,124 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-11 19:45+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "PoÄet pokusů pÅ™ed spuÅ¡tÄ›ním záložního WAN"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "PoÄet pokusů pÅ™ed obnovou WAN"
++
++msgid "Auto"
++msgstr "Automaticky"
++
++msgid "Collecting data..."
++msgstr "Sbírám data..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Nastavit pravidla pro směrování odchozích paketů přes konkrétní WAN "
++"rozhraní."
++
++msgid "DNS Server(s)"
++msgstr "DNS server(y)"
++
++msgid "Default Route"
++msgstr "Výchozí brána"
++
++msgid "Destination Address"
++msgstr "Cílová adresa"
++
++msgid "Disable"
++msgstr "Vypnout"
++
++msgid "Enable"
++msgstr "Povolit"
++
++msgid "Failing"
++msgstr "Selhání"
++
++msgid "Failover Traffic Destination"
++msgstr "Cíl záložního spojení"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "Monitorování dostupnosti - ICMP host(é)"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "Monitorování dostupnosti - ICMP Äasový limit"
++
++msgid "Health Monitor Interval"
++msgstr "Monitorování dostupnosti - interval"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"Monitorování dostupnosti kontroluje a opravuje změny v síti a selhání "
++"připojení."
++
++msgid "KO"
++msgstr "KO"
++
++msgid "Load Balancer Distribution"
++msgstr "Load Balancer - rozdělení"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "Load Balancer(Kompatibilita)"
++
++msgid "Load Balancer(Performance)"
++msgstr "Load Balancer(Výkon)"
++
++msgid "Multi-WAN"
++msgstr "Multi-WAN"
++
++msgid "Multi-WAN Status"
++msgstr "Stav Multi-WAN"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Multi-WAN pravidla směrování"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"Multi-WAN umožňuje použít několik internetových připojení pro vyvažování "
++"zátěže a zálohy připojení."
++
++msgid "None"
++msgstr "Žádný"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "Porty"
++
++msgid "Protocol"
++msgstr "Protokol"
++
++msgid "Recovering"
++msgstr "Obnovuji"
++
++msgid "Source Address"
++msgstr "Zdrojová adresa"
++
++msgid "Unknown"
++msgstr "Neznámý"
++
++msgid "WAN Interfaces"
++msgstr "WAN rozhraní"
++
++msgid "WAN Uplink"
++msgstr "WAN připojení"
++
++msgid "all"
++msgstr "VÅ¡echny"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/de/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/de/multiwan.po
+new file mode 100644
+index 0000000..2fa789f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/de/multiwan.po
+@@ -0,0 +1,124 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-08-10 02:55+0200\n"
++"Last-Translator: Jo-Philipp <jow@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "Versuche vor Umschalten auf WAN Ersatzverbindung"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "Versuche vor dem Zurückschalten auf normale WAN Verbindung"
++
++msgid "Auto"
++msgstr "automatisch"
++
++msgid "Collecting data..."
++msgstr "Sammle Daten..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Mit diesen Regeln kann ausgehender Verkehr bestimmten WAN-Uplinks zugeordnet "
++"werden."
++
++msgid "DNS Server(s)"
++msgstr "DNS Server"
++
++msgid "Default Route"
++msgstr "Standardroute"
++
++msgid "Destination Address"
++msgstr "Zieladresse"
++
++msgid "Disable"
++msgstr "Deaktivieren"
++
++msgid "Enable"
++msgstr "Aktivieren"
++
++msgid "Failing"
++msgstr "Versagt"
++
++msgid "Failover Traffic Destination"
++msgstr "Failover Traffic Ziel"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "ICMP Host(s) zur Verbindungsüberwachung"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "Timeout für ICMP-Pakete zur Verbindungsüberwachung"
++
++msgid "Health Monitor Interval"
++msgstr "Intervall für Verbindungsüberwachung"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"Die Verbindungsüberwachung erkennt und behebt Netzwerkänderungen und "
++"Verbindungsabbrüche."
++
++msgid "KO"
++msgstr "Getrennt"
++
++msgid "Load Balancer Distribution"
++msgstr "Load Balancer Verteilung"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "Load Balancer (Kompatibilität)"
++
++msgid "Load Balancer(Performance)"
++msgstr "Load Balancer (Performance)"
++
++msgid "Multi-WAN"
++msgstr "Multi-WAN"
++
++msgid "Multi-WAN Status"
++msgstr "Multi-WAN Status"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Multi-WAN Verkehrsregeln"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"Multi-WAN erlaubt es, mehrere ISP-Verbindungen gleichzeitig oder als "
++"Ersatzverbindung beim Ausfall der Hauptverbindung zu verwenden."
++
++msgid "None"
++msgstr "Keine"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "Ports"
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "Recovering"
++msgstr "Neu verbunden"
++
++msgid "Source Address"
++msgstr "Quelladresse"
++
++msgid "Unknown"
++msgstr "Unbekannt"
++
++msgid "WAN Interfaces"
++msgstr "WAN-Schnittstellen"
++
++msgid "WAN Uplink"
++msgstr "WAN Uplink-Verbindung"
++
++msgid "all"
++msgstr "alle"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/el/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/el/multiwan.po
+new file mode 100644
+index 0000000..48d3165
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/el/multiwan.po
+@@ -0,0 +1,118 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-18 15:16+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: none\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr ""
++
++msgid "Default Route"
++msgstr ""
++
++msgid "Destination Address"
++msgstr "ΔιεÏθυνση ΠÏοοÏισμοÏ"
++
++msgid "Disable"
++msgstr "ΑπενεÏγοποίηση"
++
++msgid "Enable"
++msgstr "ΕνεÏγοποίηση"
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr ""
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++
++msgid "Health Monitor Interval"
++msgstr ""
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr ""
++
++msgid "Load Balancer(Compatibility)"
++msgstr ""
++
++msgid "Load Balancer(Performance)"
++msgstr ""
++
++msgid "Multi-WAN"
++msgstr ""
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr ""
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr "ΠÏωτόκολλο"
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "WAN Interfaces"
++msgstr ""
++
++msgid "WAN Uplink"
++msgstr ""
++
++msgid "all"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/en/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/en/multiwan.po
+new file mode 100644
+index 0000000..241e6d0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/en/multiwan.po
+@@ -0,0 +1,114 @@
++# multiwan.po
++# generated from /tmp/i18n/luasrc/i18n/multiwan.en.lua
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "Attempts Before WAN Failover"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "Attempts Before WAN Recovery"
++
++msgid "Auto"
++msgstr "Auto"
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++
++msgid "DNS Server(s)"
++msgstr "DNS Server(s)"
++
++msgid "Default Route"
++msgstr "Default Route"
++
++msgid "Destination Address"
++msgstr "Destination Address"
++
++msgid "Disable"
++msgstr "Disable"
++
++msgid "Enable"
++msgstr "Enable"
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr "Failover Traffic Destination"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "Health Monitor ICMP Host(s)"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "Health Monitor ICMP Timeout"
++
++msgid "Health Monitor Interval"
++msgstr "Health Monitor Interval"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"Health Monitor detects and corrects network changes and failed connections."
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr "Load Balancer Distribution"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "Load Balancer(Compatibility)"
++
++msgid "Load Balancer(Performance)"
++msgstr "Load Balancer(Performance)"
++
++msgid "Multi-WAN"
++msgstr "Multi-WAN"
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Multi-WAN Traffic Rules"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++
++msgid "None"
++msgstr "None"
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr "Ports"
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr "Source Address"
++
++msgid "Unknown"
++msgstr ""
++
++msgid "WAN Interfaces"
++msgstr "WAN Interfaces"
++
++msgid "WAN Uplink"
++msgstr "WAN Uplink"
++
++msgid "all"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/es/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/es/multiwan.po
+new file mode 100644
+index 0000000..4d2447e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/es/multiwan.po
+@@ -0,0 +1,124 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-08-23 23:07+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "Reintentos ante fallo de la WAN"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "Reintentos tras recuperar la WAN"
++
++msgid "Auto"
++msgstr "Auto"
++
++msgid "Collecting data..."
++msgstr "Recuperando datos..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Configure las reglas que redirigen el tráfico saliente a través de los "
++"enlaces WAN salientes especificados."
++
++msgid "DNS Server(s)"
++msgstr "Servidor/es DNS"
++
++msgid "Default Route"
++msgstr "Ruta por defecto"
++
++msgid "Destination Address"
++msgstr "Dirección de destino"
++
++msgid "Disable"
++msgstr "Desactivar"
++
++msgid "Enable"
++msgstr "Activar"
++
++msgid "Failing"
++msgstr "Fallando"
++
++msgid "Failover Traffic Destination"
++msgstr "Destino del tráfico en caso de fallo"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "Monitores de salud ICMP"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "Espera monitor de salud ICMP"
++
++msgid "Health Monitor Interval"
++msgstr "Intervalo del monitor de salud"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"El monitor de salud detecta y corrige cambios en la red y conexiones "
++"fallidas."
++
++msgid "KO"
++msgstr "KO"
++
++msgid "Load Balancer Distribution"
++msgstr "Distribución del balanceador de carga"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "Balanceador de carga (compatibilidad)"
++
++msgid "Load Balancer(Performance)"
++msgstr "Balanceador de carga (rendimiento)"
++
++msgid "Multi-WAN"
++msgstr "Multi-WAN"
++
++msgid "Multi-WAN Status"
++msgstr "Estado de Multi-WAN"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Reglas de tráfico Multi-WAN"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"Multi-WAN permite el use varios enlaces de salida para balancear la carga y "
++"control de fallos."
++
++msgid "None"
++msgstr "Ninguno"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "Puertos"
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid "Recovering"
++msgstr "Recuperación"
++
++msgid "Source Address"
++msgstr "Dirección origen"
++
++msgid "Unknown"
++msgstr "Desconocido"
++
++msgid "WAN Interfaces"
++msgstr "Interfaces WAN"
++
++msgid "WAN Uplink"
++msgstr "Enlace saliente WAN"
++
++msgid "all"
++msgstr "todos"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/fr/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/fr/multiwan.po
+new file mode 100644
+index 0000000..39b1421
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/fr/multiwan.po
+@@ -0,0 +1,125 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-11-06 16:07+0200\n"
++"Last-Translator: hogsim <hogsim@gmail.com>\n"
++"Language-Team: none\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "Essais avant de déclarer un WAN défaillant"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "Essais avant de déclarer qu'un WAN est rétabli"
++
++msgid "Auto"
++msgstr "Auto"
++
++msgid "Collecting data..."
++msgstr "Collection de données..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Configuration de règles pour diriger le trafic sortant à travers des liens "
++"WAN sécifiés."
++
++msgid "DNS Server(s)"
++msgstr "Serveur(s) DNS"
++
++msgid "Default Route"
++msgstr "Route par défaut"
++
++msgid "Destination Address"
++msgstr "Adresse de destination"
++
++msgid "Disable"
++msgstr "Désactiver"
++
++msgid "Enable"
++msgstr "Activer"
++
++msgid "Failing"
++msgstr "Défaillance"
++
++msgid "Failover Traffic Destination"
++msgstr "Destination du trafic en cas de défaillance"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "Hôte(s) à pinguer pour valider le lien"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "Delai max du ping de validation du lien"
++
++msgid "Health Monitor Interval"
++msgstr "Invervalle de validation du lien"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"La validation de liens détecte et corrige les changements du réseau et les "
++"connexions défaillantes."
++
++msgid "KO"
++msgstr "KO"
++
++msgid "Load Balancer Distribution"
++msgstr "Distribution d'équilibrage de charge"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "Équilibrage de charge (compatibilité)"
++
++msgid "Load Balancer(Performance)"
++msgstr "Équilibrage de charge (performance)"
++
++msgid "Multi-WAN"
++msgstr "Multi-WAN"
++
++msgid "Multi-WAN Status"
++msgstr "Statut Multi-WAN"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Règles de trafic avec des liens sortants multiples"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"Multi-WAN permet l'utilisation de liens sortants multiples pour la "
++"l'équilibrage de charge et la répartition sur les autres en cas de "
++"défaillance."
++
++msgid "None"
++msgstr "Aucun"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "Ports"
++
++msgid "Protocol"
++msgstr "Protocole"
++
++msgid "Recovering"
++msgstr "Récupération"
++
++msgid "Source Address"
++msgstr "Adresse source"
++
++msgid "Unknown"
++msgstr "Inconnu"
++
++msgid "WAN Interfaces"
++msgstr "Interfaces WAN"
++
++msgid "WAN Uplink"
++msgstr "Lien remontant WAN"
++
++msgid "all"
++msgstr "tous"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/he/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/he/multiwan.po
+new file mode 100644
+index 0000000..2188822
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/he/multiwan.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr ""
++
++msgid "Default Route"
++msgstr ""
++
++msgid "Destination Address"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr ""
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++
++msgid "Health Monitor Interval"
++msgstr ""
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr ""
++
++msgid "Load Balancer(Compatibility)"
++msgstr ""
++
++msgid "Load Balancer(Performance)"
++msgstr ""
++
++msgid "Multi-WAN"
++msgstr ""
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr ""
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "WAN Interfaces"
++msgstr ""
++
++msgid "WAN Uplink"
++msgstr ""
++
++msgid "all"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/hu/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/hu/multiwan.po
+new file mode 100644
+index 0000000..20ff8d6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/hu/multiwan.po
+@@ -0,0 +1,124 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-12-30 19:12+0200\n"
++"Last-Translator: romboyco <romboyco@gmail.com>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "Próbálkozások WAN átállás előtt"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "Probálkozások WAN helyreállítás előtt"
++
++msgid "Auto"
++msgstr "Automatikus"
++
++msgid "Collecting data..."
++msgstr "Adatok gyűjtése..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Szabályok beállítása a kimenő forgalom megadott WAN kapcsolatra "
++"irányításához."
++
++msgid "DNS Server(s)"
++msgstr "DNS kiszolgáló(k)"
++
++msgid "Default Route"
++msgstr "Alapértelmezett útvonal"
++
++msgid "Destination Address"
++msgstr "Cél cím"
++
++msgid "Disable"
++msgstr "Letiltás"
++
++msgid "Enable"
++msgstr "Engedélyezés"
++
++msgid "Failing"
++msgstr "Csökkenő"
++
++msgid "Failover Traffic Destination"
++msgstr "Failover forgalom cél"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "ICMP gépek kapcsolat monitorozáshoz"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "ICMP csomagok időtúllépése a kapcsolat monitorozásánál"
++
++msgid "Health Monitor Interval"
++msgstr "Kapcsolat monitorozási intervallum"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"A kapcsolat monitorozás megállapítja és korrigálja a hálózati változásokat "
++"és sikertelen kapcsolatokat."
++
++msgid "KO"
++msgstr "KO"
++
++msgid "Load Balancer Distribution"
++msgstr "Load balancer megosztás"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "Terhelés kiegyensúlyozás (kompatibilitás)"
++
++msgid "Load Balancer(Performance)"
++msgstr "Terhelés kiegyensúlyozás (teljesítmény)"
++
++msgid "Multi-WAN"
++msgstr "Többszörös WAN"
++
++msgid "Multi-WAN Status"
++msgstr "Többszörös WAN állapot"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Többszörös WAN forgalmi szabályok"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"A Multi-WAN lehetővé teszi több kapcsolat használatát egyidejűleg, vagy az "
++"elsődleges kapcsolat esetleges hibája esetén."
++
++msgid "None"
++msgstr "Nincs"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "Portok"
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "Recovering"
++msgstr "Helyreállítás"
++
++msgid "Source Address"
++msgstr "Forrás cím"
++
++msgid "Unknown"
++msgstr "Ismeretlen"
++
++msgid "WAN Interfaces"
++msgstr "WAN interfészek"
++
++msgid "WAN Uplink"
++msgstr "WAN kapcsolat"
++
++msgid "all"
++msgstr "összes"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/it/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/it/multiwan.po
+new file mode 100644
+index 0000000..863b351
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/it/multiwan.po
+@@ -0,0 +1,124 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-02-03 14:00+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "Tentativi su WAN prima del Failover"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "Tentativi su WAN prima del Recovery"
++
++msgid "Auto"
++msgstr "Auto"
++
++msgid "Collecting data..."
++msgstr "Raccolta di dati..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Configura le regole per inviare direttamente in uscita il traffico su una "
++"uplink Wan specifico."
++
++msgid "DNS Server(s)"
++msgstr "DNS Server(s)"
++
++msgid "Default Route"
++msgstr "Default Route"
++
++msgid "Destination Address"
++msgstr "Indirizzo di destinazione"
++
++msgid "Disable"
++msgstr "Disable"
++
++msgid "Enable"
++msgstr "Enable"
++
++msgid "Failing"
++msgstr "Fallimento"
++
++msgid "Failover Traffic Destination"
++msgstr "Destinazione del traffico in failover"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "Health Monitor ICMP Host(s)"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "Health Monitor ICMP Timeout"
++
++msgid "Health Monitor Interval"
++msgstr "Health Monitor Interval"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"L'health monitor monitora e identifica i cambiamenti e la manca di "
++"connessioni."
++
++msgid "KO"
++msgstr "KO"
++
++msgid "Load Balancer Distribution"
++msgstr "Bilanciamento del carico"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "Carica Bilanciatore (Compatibilità)"
++
++msgid "Load Balancer(Performance)"
++msgstr "Carica Bilanciatore (Performance)"
++
++msgid "Multi-WAN"
++msgstr "Multi-WAN"
++
++msgid "Multi-WAN Status"
++msgstr "Stato Multi-WAN"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Regole del Traffico Multi-WAN"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"Multi-WAN permette di usare uplink multipi per il bilanciamento del carico e "
++"la ridondanza da failover."
++
++msgid "None"
++msgstr "None"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "Porte"
++
++msgid "Protocol"
++msgstr "Protocollo"
++
++msgid "Recovering"
++msgstr "Recupero"
++
++msgid "Source Address"
++msgstr "Indirizzo sorgente"
++
++msgid "Unknown"
++msgstr "Sconosciuto"
++
++msgid "WAN Interfaces"
++msgstr "Interfaccia WAN"
++
++msgid "WAN Uplink"
++msgstr "Collegamento ascendente WAN"
++
++msgid "all"
++msgstr "all"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/ja/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/ja/multiwan.po
+new file mode 100644
+index 0000000..ab41562
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/ja/multiwan.po
+@@ -0,0 +1,120 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-06 17:17+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: none\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: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr "自動"
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr "DNSサーãƒãƒ¼"
++
++msgid "Default Route"
++msgstr "デフォルトルート"
++
++msgid "Destination Address"
++msgstr "宛先アドレス"
++
++msgid "Disable"
++msgstr "無効"
++
++msgid "Enable"
++msgstr "有効"
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "ヘルスモニタ ICMP宛先"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "ヘルスモニタ ICMP タイムアウト"
++
++msgid "Health Monitor Interval"
++msgstr "ヘルスモニタ更新間隔"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr "ヘルスモニタã¯ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®å¤‰æ›´åŠã³æŽ¥ç¶šå¤±æ•—ã®æ¤œå‡ºã¨èª¿æ•´ã‚’è¡Œã„ã¾ã™ã€‚"
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr "ロードãƒãƒ©ãƒ³ã‚µ ディストリビューション"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "ロードãƒãƒ©ãƒ³ã‚µ (互æ›æ€§)"
++
++msgid "Load Balancer(Performance)"
++msgstr "ロードãƒãƒ©ãƒ³ã‚µ (パフォーマンス)"
++
++msgid "Multi-WAN"
++msgstr "Multi-WAN"
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Multi-WAN トラフィック・ルール"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"Multi-WANを用ã„ã‚‹ã“ã¨ã§ã€è¤‡æ•°ã®ä¸Šã‚Šãƒªãƒ³ã‚¯ã‚’使用ã—ã¦ãƒ­ãƒ¼ãƒ‰ãƒãƒ©ãƒ³ã‚µã¨ãƒ•ã‚§ã‚¤ãƒ«"
++"オーãƒãƒ¼æ©Ÿèƒ½ã‚’使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
++
++msgid "None"
++msgstr "ãªã—"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "ãƒãƒ¼ãƒˆ"
++
++msgid "Protocol"
++msgstr "プロトコル"
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr "é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++msgid "Unknown"
++msgstr "ä¸æ˜Ž"
++
++msgid "WAN Interfaces"
++msgstr "WAN インターフェースリスト"
++
++msgid "WAN Uplink"
++msgstr "WAN アップリンク"
++
++msgid "all"
++msgstr "å…¨ã¦"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/ms/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/ms/multiwan.po
+new file mode 100644
+index 0000000..d175246
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/ms/multiwan.po
+@@ -0,0 +1,114 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr ""
++
++msgid "Default Route"
++msgstr ""
++
++msgid "Destination Address"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr ""
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++
++msgid "Health Monitor Interval"
++msgstr ""
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr ""
++
++msgid "Load Balancer(Compatibility)"
++msgstr ""
++
++msgid "Load Balancer(Performance)"
++msgstr ""
++
++msgid "Multi-WAN"
++msgstr ""
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr ""
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "WAN Interfaces"
++msgstr ""
++
++msgid "WAN Uplink"
++msgstr ""
++
++msgid "all"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/no/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/no/multiwan.po
+new file mode 100644
+index 0000000..a6e8bc4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/no/multiwan.po
+@@ -0,0 +1,117 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "Antall forsøk før WAN feilsikkerhet"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "Antall forsøk før WAN gjenoppretting"
++
++msgid "Auto"
++msgstr "Auto"
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Konfigurer regler for å styre utgående trafikk gjennom spesifiserte WAN "
++"koblinger."
++
++msgid "DNS Server(s)"
++msgstr "DNS Server(e)"
++
++msgid "Default Route"
++msgstr "Standard rute"
++
++msgid "Destination Address"
++msgstr "Destinasjonsadresse"
++
++msgid "Disable"
++msgstr "Deaktiver"
++
++msgid "Enable"
++msgstr "Aktiver"
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr "Feilsikkerhet trafikk destinasjon"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "Health monitor ICMP vert(er)"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "Health monitor ICMP tidsavbrudd"
++
++msgid "Health Monitor Interval"
++msgstr "Health monitor intervall"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"Health monitor oppdager og korrigerer nettverks endringer og mislykkede "
++"tilkoblinger."
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr "Lastbalansering fordeling"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "Lastbalansering (kompatibilitet)"
++
++msgid "Load Balancer(Performance)"
++msgstr "Lastbalansering (ytelse)"
++
++msgid "Multi-WAN"
++msgstr "Multi-WAN"
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Multi-WAN trafikk regler"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"Multi-WAN tillater bruk av flere internett oppkoblinger for lastbalansering "
++"og feilsikkerhet."
++
++msgid "None"
++msgstr "Ingen"
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr "Porter"
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr "Kildeadresse"
++
++msgid "Unknown"
++msgstr ""
++
++msgid "WAN Interfaces"
++msgstr "WAN Grensesnitt"
++
++msgid "WAN Uplink"
++msgstr "WAN Opplinje"
++
++msgid "all"
++msgstr "alle"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/pl/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/pl/multiwan.po
+new file mode 100644
+index 0000000..5904aed
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/pl/multiwan.po
+@@ -0,0 +1,125 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-01 15:25+0200\n"
++"Last-Translator: Staszek <fistaszek@tlen.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "Liczba prób przed procedurą WAN Failover (połączenie awaryjne WAN)"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "Liczba prób przed procedurą WAN Recovery (przywrócenie WAN)"
++
++msgid "Auto"
++msgstr "Automatycznie"
++
++msgid "Collecting data..."
++msgstr "Zbieranie informacji..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Skonfiguruj zasady kierowania ruchu wychodzącego za pośrednictwem "
++"określonych łączy WAN."
++
++msgid "DNS Server(s)"
++msgstr "Serwer(y) DNS"
++
++msgid "Default Route"
++msgstr "Trasa domyślna"
++
++msgid "Destination Address"
++msgstr "Adres docelowy"
++
++msgid "Disable"
++msgstr "Wyłącz"
++
++msgid "Enable"
++msgstr "WÅ‚Ä…cz"
++
++msgid "Failing"
++msgstr "Niepowodzenie"
++
++msgid "Failover Traffic Destination"
++msgstr "Cel ruch dla połączenia awaryjnego"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "Monitorowane hosty przy użyciu protokołu ICMP (ping)"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++"Czas nieosiągalności monitorowanych hostów przy użyciu protokołu ICMP (ping)"
++
++msgid "Health Monitor Interval"
++msgstr "Odstęp pomiędzy próbami monitoringu"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"Monitor stanu wykrywa i koryguje zmiany sieci oraz nieudane połączenia."
++
++msgid "KO"
++msgstr "KO"
++
++msgid "Load Balancer Distribution"
++msgstr "Dystrybucja równoważenia obciążenia"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "Równoważenie obciążenia (Zgodność)"
++
++msgid "Load Balancer(Performance)"
++msgstr "Równoważenie obciążenia (Wydajność)"
++
++msgid "Multi-WAN"
++msgstr "Multi-WAN"
++
++msgid "Multi-WAN Status"
++msgstr "Status Multi-WAN"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Reguły ruchu Multi-WAN"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"Multi-WAN pozwala na używanie kilku łącz w celu równoważenia obciążenia lub "
++"omijania awarii."
++
++msgid "None"
++msgstr "Żaden"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "Porty"
++
++msgid "Protocol"
++msgstr "Protokół"
++
++msgid "Recovering"
++msgstr "Odzyskiwanie"
++
++msgid "Source Address"
++msgstr "Adres źródłowy"
++
++msgid "Unknown"
++msgstr "Nieznany"
++
++msgid "WAN Interfaces"
++msgstr "Interfejsy WAN"
++
++msgid "WAN Uplink"
++msgstr "ÅÄ…cze WAN"
++
++msgid "all"
++msgstr "wszystkie"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/pt-br/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/pt-br/multiwan.po
+new file mode 100644
+index 0000000..ba72b82
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/pt-br/multiwan.po
+@@ -0,0 +1,124 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-11-11 04:01+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "Tentativas Antes da Solução de Contorno da WAN"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "Tentativas Antes da Recuperação da WAN"
++
++msgid "Auto"
++msgstr "Automático"
++
++msgid "Collecting data..."
++msgstr "Coletando dados..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Configurar regras para direcionar a saída de tráfego através de uma conexão "
++"WAN específica."
++
++msgid "DNS Server(s)"
++msgstr "Servidor(es) DNS"
++
++msgid "Default Route"
++msgstr "Rota Padrão"
++
++msgid "Destination Address"
++msgstr "Endereço de Destino"
++
++msgid "Disable"
++msgstr "Desabilitar"
++
++msgid "Enable"
++msgstr "Habilitar"
++
++msgid "Failing"
++msgstr "Falha"
++
++msgid "Failover Traffic Destination"
++msgstr "Destino do Tráfego para a Recuperação"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "Equipamento(s) para Monitoramento da Saúde por ICMP"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "Limite de tempo do Monitoramento da Saúde por ICMP"
++
++msgid "Health Monitor Interval"
++msgstr "Intervalo do Monitoramento da Saúde"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"O Monitoramento da Saúde detecta e corrige as mudanças de rede e falhas nas "
++"conexões."
++
++msgid "KO"
++msgstr "KO"
++
++msgid "Load Balancer Distribution"
++msgstr "Distribuição do Balanceador de Carga"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "Balanceador de Carga(Compatibilidade)"
++
++msgid "Load Balancer(Performance)"
++msgstr "Balanceador de Carga(Desempenho)"
++
++msgid "Multi-WAN"
++msgstr "Multi-WAN"
++
++msgid "Multi-WAN Status"
++msgstr "Status de Multi-WAN"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Regras de Tráfego Multi-WAN"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"O Multi-WAN permite o use de múltiplas conexões ao enlace superior (ex: "
++"internet) para o balanceamento de carga e tolerância a falha."
++
++msgid "None"
++msgstr "Nenhum"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "Portas"
++
++msgid "Protocol"
++msgstr "Procotolo"
++
++msgid "Recovering"
++msgstr "Recuperação"
++
++msgid "Source Address"
++msgstr "Endereço de Origem"
++
++msgid "Unknown"
++msgstr "Desconhecido"
++
++msgid "WAN Interfaces"
++msgstr "Interfaces WAN"
++
++msgid "WAN Uplink"
++msgstr "Conexão WAN"
++
++msgid "all"
++msgstr "todos"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/pt/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/pt/multiwan.po
+new file mode 100644
+index 0000000..95eeba8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/pt/multiwan.po
+@@ -0,0 +1,118 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-09-22 18:29+0200\n"
++"Last-Translator: Low <pedroloureiro1@sapo.pt>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr "Automático"
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr "Servidor(s) DNS"
++
++msgid "Default Route"
++msgstr ""
++
++msgid "Destination Address"
++msgstr "Endereço de Destino"
++
++msgid "Disable"
++msgstr "Desativar"
++
++msgid "Enable"
++msgstr "Activar"
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr ""
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++
++msgid "Health Monitor Interval"
++msgstr ""
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr ""
++
++msgid "Load Balancer(Compatibility)"
++msgstr ""
++
++msgid "Load Balancer(Performance)"
++msgstr ""
++
++msgid "Multi-WAN"
++msgstr ""
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr ""
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++
++msgid "None"
++msgstr "Nenhum"
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr "Portas"
++
++msgid "Protocol"
++msgstr "Procotolo"
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr "Endereço de Origem"
++
++msgid "Unknown"
++msgstr "Desconhecido"
++
++msgid "WAN Interfaces"
++msgstr ""
++
++msgid "WAN Uplink"
++msgstr ""
++
++msgid "all"
++msgstr "todos"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/ro/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/ro/multiwan.po
+new file mode 100644
+index 0000000..cd51944
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/ro/multiwan.po
+@@ -0,0 +1,119 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-09 13:26+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr "Colectare date..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr "Server(e) DNS"
++
++msgid "Default Route"
++msgstr "Ruta default"
++
++msgid "Destination Address"
++msgstr "Adresă destinaţie"
++
++msgid "Disable"
++msgstr "Dezactivează"
++
++msgid "Enable"
++msgstr "Activează"
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr ""
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++
++msgid "Health Monitor Interval"
++msgstr ""
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr ""
++
++msgid "Load Balancer(Compatibility)"
++msgstr ""
++
++msgid "Load Balancer(Performance)"
++msgstr ""
++
++msgid "Multi-WAN"
++msgstr ""
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr ""
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "Porturi"
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Recovering"
++msgstr "Recuperare"
++
++msgid "Source Address"
++msgstr "Adresa sursei"
++
++msgid "Unknown"
++msgstr "Necunoscut"
++
++msgid "WAN Interfaces"
++msgstr "Interfeţe WAN"
++
++msgid "WAN Uplink"
++msgstr ""
++
++msgid "all"
++msgstr "toate"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/ru/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/ru/multiwan.po
+new file mode 100644
+index 0000000..c12d920
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/ru/multiwan.po
+@@ -0,0 +1,127 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: multiwan\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2012-08-15 14:05+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "КоличеÑтво попыток перед обработкой отказа WAN"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "КоличеÑтво попыток перед воÑÑтановлением WAN"
++
++msgid "Auto"
++msgstr "ÐвтоматичеÑки"
++
++msgid "Collecting data..."
++msgstr "Сбор данных..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++"Укажите правила Ð´Ð»Ñ Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ÑходÑщего трафика через заданные воÑходÑщие "
++"каналы WAN."
++
++msgid "DNS Server(s)"
++msgstr "DNS-Ñервер(Ñ‹)"
++
++msgid "Default Route"
++msgstr "Маршрут по умолчанию"
++
++msgid "Destination Address"
++msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ"
++
++msgid "Disable"
++msgstr "Отключить"
++
++msgid "Enable"
++msgstr "Включить"
++
++msgid "Failing"
++msgstr "Отказ"
++
++msgid "Failover Traffic Destination"
++msgstr "Ðазначение трафика при обработке отказа"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "ICMP-хоÑÑ‚(Ñ‹) Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ ÑоÑтоÑниÑ"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "Тайм-аут ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ ÑоÑтоÑÐ½Ð¸Ñ Ð¿Ð¾ ICMP"
++
++msgid "Health Monitor Interval"
++msgstr "Интервал ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ ÑоÑтоÑниÑ"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++"Контроль ÑоÑтоÑÐ½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñет и иÑправлÑет Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñети и неиÑправные "
++"ÑоединениÑ."
++
++msgid "KO"
++msgstr "Ðе работает"
++
++msgid "Load Balancer Distribution"
++msgstr "РаÑпределение баланÑировки нагрузки"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "БаланÑировка нагрузки (ÑовмеÑтимоÑÑ‚ÑŒ)"
++
++msgid "Load Balancer(Performance)"
++msgstr "БаланÑировка нагрузки (производительноÑÑ‚ÑŒ)"
++
++msgid "Multi-WAN"
++msgstr "Мульти-WAN"
++
++msgid "Multi-WAN Status"
++msgstr "СоÑтоÑние мульти-WAN"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "Правила Ð´Ð»Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸-WAN трафика"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++"Мульти-WAN позволÑет иÑпользовать неÑколько портов воÑходÑщего канала Ð´Ð»Ñ "
++"баланÑировки нагрузки и отказоуÑтойчивоÑти."
++
++msgid "None"
++msgstr "Ðи один из"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "Порты"
++
++msgid "Protocol"
++msgstr "Протокол"
++
++msgid "Recovering"
++msgstr "ВоÑÑтановление"
++
++msgid "Source Address"
++msgstr "ÐÐ´Ñ€ÐµÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ"
++
++msgid "Unknown"
++msgstr "ÐеизвеÑтно"
++
++msgid "WAN Interfaces"
++msgstr "WAN-интерфейÑÑ‹"
++
++msgid "WAN Uplink"
++msgstr "ВоÑходÑщий канал WAN"
++
++msgid "all"
++msgstr "вÑе"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/sk/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/sk/multiwan.po
+new file mode 100644
+index 0000000..b113eac
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/sk/multiwan.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr ""
++
++msgid "Default Route"
++msgstr ""
++
++msgid "Destination Address"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr ""
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++
++msgid "Health Monitor Interval"
++msgstr ""
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr ""
++
++msgid "Load Balancer(Compatibility)"
++msgstr ""
++
++msgid "Load Balancer(Performance)"
++msgstr ""
++
++msgid "Multi-WAN"
++msgstr ""
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr ""
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "WAN Interfaces"
++msgstr ""
++
++msgid "WAN Uplink"
++msgstr ""
++
++msgid "all"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/sv/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/sv/multiwan.po
+new file mode 100644
+index 0000000..fae4c58
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/sv/multiwan.po
+@@ -0,0 +1,116 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr ""
++
++msgid "Default Route"
++msgstr ""
++
++msgid "Destination Address"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr ""
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++
++msgid "Health Monitor Interval"
++msgstr ""
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr ""
++
++msgid "Load Balancer(Compatibility)"
++msgstr ""
++
++msgid "Load Balancer(Performance)"
++msgstr ""
++
++msgid "Multi-WAN"
++msgstr ""
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr ""
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "WAN Interfaces"
++msgstr ""
++
++msgid "WAN Uplink"
++msgstr ""
++
++msgid "all"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/templates/multiwan.pot b/feeds/luci/applications/luci-app-multiwan/po/templates/multiwan.pot
+new file mode 100644
+index 0000000..954eed1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/templates/multiwan.pot
+@@ -0,0 +1,108 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr ""
++
++msgid "Default Route"
++msgstr ""
++
++msgid "Destination Address"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr ""
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++
++msgid "Health Monitor Interval"
++msgstr ""
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr ""
++
++msgid "Load Balancer(Compatibility)"
++msgstr ""
++
++msgid "Load Balancer(Performance)"
++msgstr ""
++
++msgid "Multi-WAN"
++msgstr ""
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr ""
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "WAN Interfaces"
++msgstr ""
++
++msgid "WAN Uplink"
++msgstr ""
++
++msgid "all"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/tr/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/tr/multiwan.po
+new file mode 100644
+index 0000000..e9d6ece
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/tr/multiwan.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr ""
++
++msgid "Default Route"
++msgstr ""
++
++msgid "Destination Address"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr ""
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++
++msgid "Health Monitor Interval"
++msgstr ""
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr ""
++
++msgid "Load Balancer(Compatibility)"
++msgstr ""
++
++msgid "Load Balancer(Performance)"
++msgstr ""
++
++msgid "Multi-WAN"
++msgstr ""
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr ""
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "WAN Interfaces"
++msgstr ""
++
++msgid "WAN Uplink"
++msgstr ""
++
++msgid "all"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/uk/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/uk/multiwan.po
+new file mode 100644
+index 0000000..922b402
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/uk/multiwan.po
+@@ -0,0 +1,119 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-09-21 15:52+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr "Ðвтоматично"
++
++msgid "Collecting data..."
++msgstr "Збір даних..."
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr "DNS-Ñервер(и)"
++
++msgid "Default Route"
++msgstr "Типовий маршрут"
++
++msgid "Destination Address"
++msgstr "ÐдреÑа призначеннÑ"
++
++msgid "Disable"
++msgstr "Вимкнути"
++
++msgid "Enable"
++msgstr "Ðктивувати"
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr ""
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++
++msgid "Health Monitor Interval"
++msgstr ""
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr ""
++
++msgid "Load Balancer(Compatibility)"
++msgstr ""
++
++msgid "Load Balancer(Performance)"
++msgstr ""
++
++msgid "Multi-WAN"
++msgstr ""
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr ""
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "WAN Interfaces"
++msgstr ""
++
++msgid "WAN Uplink"
++msgstr ""
++
++msgid "all"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/vi/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/vi/multiwan.po
+new file mode 100644
+index 0000000..e9d6ece
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/vi/multiwan.po
+@@ -0,0 +1,115 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Attempts Before WAN Failover"
++msgstr ""
++
++msgid "Attempts Before WAN Recovery"
++msgstr ""
++
++msgid "Auto"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr ""
++
++msgid "DNS Server(s)"
++msgstr ""
++
++msgid "Default Route"
++msgstr ""
++
++msgid "Destination Address"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Failing"
++msgstr ""
++
++msgid "Failover Traffic Destination"
++msgstr ""
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr ""
++
++msgid "Health Monitor ICMP Timeout"
++msgstr ""
++
++msgid "Health Monitor Interval"
++msgstr ""
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr ""
++
++msgid "KO"
++msgstr ""
++
++msgid "Load Balancer Distribution"
++msgstr ""
++
++msgid "Load Balancer(Compatibility)"
++msgstr ""
++
++msgid "Load Balancer(Performance)"
++msgstr ""
++
++msgid "Multi-WAN"
++msgstr ""
++
++msgid "Multi-WAN Status"
++msgstr ""
++
++msgid "Multi-WAN Traffic Rules"
++msgstr ""
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Recovering"
++msgstr ""
++
++msgid "Source Address"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "WAN Interfaces"
++msgstr ""
++
++msgid "WAN Uplink"
++msgstr ""
++
++msgid "all"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/zh-cn/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/zh-cn/multiwan.po
+new file mode 100644
+index 0000000..dfb4958
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/zh-cn/multiwan.po
+@@ -0,0 +1,118 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-08 16:16+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "WAN故障转移之å‰å°è¯•"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "WANæ•…éšœæ¢å¤ä¹‹å‰å°è¯•"
++
++msgid "Auto"
++msgstr "自动"
++
++msgid "Collecting data..."
++msgstr "正在收集数æ®â€¦"
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr "é…置规则引导出站æµé‡é€šè¿‡æŒ‡å®šçš„WAN上行链路。"
++
++msgid "DNS Server(s)"
++msgstr "DNSæœåŠ¡å™¨"
++
++msgid "Default Route"
++msgstr "缺çœè·¯ç”±"
++
++msgid "Destination Address"
++msgstr "目的地å€"
++
++msgid "Disable"
++msgstr "ç¦ç”¨"
++
++msgid "Enable"
++msgstr "å¯ç”¨"
++
++msgid "Failing"
++msgstr "失败"
++
++msgid "Failover Traffic Destination"
++msgstr "故障转移目的地"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "å¥åº·çŠ¶å†µç›‘测ICMP主机"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "å¥åº·çŠ¶å†µç›‘测ICMP主机超时"
++
++msgid "Health Monitor Interval"
++msgstr "å¥åº·çŠ¶å†µç›‘测间隔"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr "å¥åº·ç›‘视器,检测和修正网络å˜æ›´å’Œå¤±è´¥çš„连接。"
++
++msgid "KO"
++msgstr "好"
++
++msgid "Load Balancer Distribution"
++msgstr "è´Ÿè½½å‡è¡¡åˆ†å¸ƒ"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "负载平衡器(兼容)"
++
++msgid "Load Balancer(Performance)"
++msgstr "负载平衡器(性能)"
++
++msgid "Multi-WAN"
++msgstr "多WAN"
++
++msgid "Multi-WAN Status"
++msgstr "多WAN状æ€"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "多WANæµé‡è§„则"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr "多WANå…许使用多æ¡ä¸Šè¡Œé“¾è·¯çš„è´Ÿè½½å‡è¡¡å’Œæ•…障转移。"
++
++msgid "None"
++msgstr "空"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "端å£"
++
++msgid "Protocol"
++msgstr "åè®®"
++
++msgid "Recovering"
++msgstr "æ¢å¤"
++
++msgid "Source Address"
++msgstr "æºåœ°å€"
++
++msgid "Unknown"
++msgstr "未知"
++
++msgid "WAN Interfaces"
++msgstr "WAN接å£"
++
++msgid "WAN Uplink"
++msgstr "WAN上è”"
++
++msgid "all"
++msgstr "所有"
+diff --git a/feeds/luci/applications/luci-app-multiwan/po/zh-tw/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/zh-tw/multiwan.po
+new file mode 100644
+index 0000000..9bfbb8f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-multiwan/po/zh-tw/multiwan.po
+@@ -0,0 +1,118 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 18:42+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Attempts Before WAN Failover"
++msgstr "寬頻失敗å‰å˜—試"
++
++msgid "Attempts Before WAN Recovery"
++msgstr "寬頻復原å‰å˜—試"
++
++msgid "Auto"
++msgstr "自動"
++
++msgid "Collecting data..."
++msgstr "收集資料中"
++
++msgid ""
++"Configure rules for directing outbound traffic through specified WAN Uplinks."
++msgstr "é€éŽæŒ‡å®šçš„寬頻上傳é‡å°Žè¼¸å‡ºæµé‡çš„è¦å‰‡è¨­å®š"
++
++msgid "DNS Server(s)"
++msgstr "DNS伺æœå™¨"
++
++msgid "Default Route"
++msgstr "é è¨­è·¯ç”±å™¨"
++
++msgid "Destination Address"
++msgstr "目標ä½å€"
++
++msgid "Disable"
++msgstr "關閉"
++
++msgid "Enable"
++msgstr "啟用"
++
++msgid "Failing"
++msgstr "失敗"
++
++msgid "Failover Traffic Destination"
++msgstr "故障備æ´æµé‡ç›®çš„地"
++
++msgid "Health Monitor ICMP Host(s)"
++msgstr "å¥è¨ºICMP的主機群"
++
++msgid "Health Monitor ICMP Timeout"
++msgstr "å¥è¨ºICMP超時"
++
++msgid "Health Monitor Interval"
++msgstr "å¥è¨ºé–“éš”"
++
++msgid ""
++"Health Monitor detects and corrects network changes and failed connections."
++msgstr "å¥è¨ºåµæ¸¬ä¸¦æ ¡æ­£ç¶²è·¯æ”¹è®ŠåŠå¤±æ•—的連線"
++
++msgid "KO"
++msgstr "KO"
++
++msgid "Load Balancer Distribution"
++msgstr "分散å¼è² è¼‰å¹³è¡¡"
++
++msgid "Load Balancer(Compatibility)"
++msgstr "(å–相容性)負載平衡"
++
++msgid "Load Balancer(Performance)"
++msgstr "(å–最大效能)負載平衡"
++
++msgid "Multi-WAN"
++msgstr "多元寬頻"
++
++msgid "Multi-WAN Status"
++msgstr "多元寬頻狀態"
++
++msgid "Multi-WAN Traffic Rules"
++msgstr "多元寬頻æµé‡è¦å‰‡"
++
++msgid ""
++"Multi-WAN allows for the use of multiple uplinks for load balancing and "
++"failover."
++msgstr "å…許多元寬頻使用多é‡ä¸Šå‚³å¹³è¡¡è² è¼‰å’Œå‚™æ´"
++
++msgid "None"
++msgstr "ç„¡"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "Ports"
++msgstr "埠號"
++
++msgid "Protocol"
++msgstr "å”定"
++
++msgid "Recovering"
++msgstr "復原中"
++
++msgid "Source Address"
++msgstr "來æºä½å€"
++
++msgid "Unknown"
++msgstr "未知"
++
++msgid "WAN Interfaces"
++msgstr "寬頻介é¢"
++
++msgid "WAN Uplink"
++msgstr "寬頻上傳"
++
++msgid "all"
++msgstr "全部"
+diff --git a/feeds/luci/applications/luci-app-ntpc/Makefile b/feeds/luci/applications/luci-app-ntpc/Makefile
+new file mode 100644
+index 0000000..b30f967
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=NTP time synchronisation configuration module
++LUCI_DEPENDS:=+ntpclient
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-ntpc/luasrc/controller/ntpc.lua b/feeds/luci/applications/luci-app-ntpc/luasrc/controller/ntpc.lua
+new file mode 100644
+index 0000000..c21d4ea
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/luasrc/controller/ntpc.lua
+@@ -0,0 +1,19 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.ntpc", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/ntpclient") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "system", "ntpc"}, cbi("ntpc/ntpc"), _("Time Synchronisation"), 50)
++ page.dependent = true
++
++ page = entry({"mini", "system", "ntpc"}, cbi("ntpc/ntpcmini", {autoapply=true}), _("Time Synchronisation"), 50)
++ page.dependent = true
++end
+diff --git a/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpc.lua b/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpc.lua
+new file mode 100644
+index 0000000..21ea88e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpc.lua
+@@ -0,0 +1,39 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("ntpclient", translate("Time Synchronisation"), translate("Synchronizes the system time"))
++
++s = m:section(TypedSection, "ntpclient", translate("General"))
++s.anonymous = true
++s.addremove = false
++
++s:option(DummyValue, "_time", translate("Current system time")).value = os.date("%c")
++
++interval = s:option(Value, "interval", translate("Update interval (in seconds)"))
++interval.datatype = "and(uinteger,min(1))"
++interval.rmempty = true
++
++count = s:option(Value, "count", translate("Count of time measurements"), translate("empty = infinite"))
++count.datatype = "and(uinteger,min(1))"
++count.rmempty = true
++
++s2 = m:section(TypedSection, "ntpdrift", translate("Clock Adjustment"))
++s2.anonymous = true
++s2.addremove = false
++
++freq = s2:option(Value, "freq", translate("Offset frequency"))
++freq.datatype = "integer"
++freq.rmempty = true
++
++s3 = m:section(TypedSection, "ntpserver", translate("Time Servers"))
++s3.anonymous = true
++s3.addremove = true
++s3.template = "cbi/tblsection"
++
++s3:option(Value, "hostname", translate("Hostname"))
++port = s3:option(Value, "port", translate("Port"))
++port.datatype = "port"
++port.rmempty = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpcmini.lua b/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpcmini.lua
+new file mode 100644
+index 0000000..82811cf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpcmini.lua
+@@ -0,0 +1,28 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.tools.webadmin")
++m = Map("ntpclient", translate("Time Synchronisation"), translate("Synchronizes the system time"))
++
++s = m:section(TypedSection, "ntpclient", translate("General"))
++s.anonymous = true
++s.addremove = false
++
++s:option(DummyValue, "_time", translate("Current system time")).value = os.date("%c")
++
++interval = s:option(Value, "interval", translate("Update interval (in seconds)"))
++interval.datatype = "and(uinteger,min(1))"
++interval.rmempty = true
++
++s3 = m:section(TypedSection, "ntpserver", translate("Time Server"))
++s3.anonymous = true
++s3.addremove = true
++s3.template = "cbi/tblsection"
++
++s3:option(Value, "hostname", translate("Hostname"))
++port = s3:option(Value, "port", translate("Port"))
++port.datatype = "port"
++port.rmempty = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/ca/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/ca/ntpc.po
+new file mode 100644
+index 0000000..1a0f5fb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/ca/ntpc.po
+@@ -0,0 +1,57 @@
++# ntpc.pot
++# generated from ./applications/luci-ntpc/luasrc/i18n/ntpc.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2014-07-03 20:32+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "Ajustament de rellotge"
++
++#, fuzzy
++msgid "Count of time measurements"
++msgstr "Compte de mesures d'horari"
++
++msgid "Current system time"
++msgstr "Horari del sistema actual"
++
++msgid "General"
++msgstr "General"
++
++msgid "Hostname"
++msgstr "Nom de host"
++
++#, fuzzy
++msgid "Offset frequency"
++msgstr "Compensació de freqüència"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Synchronizes the system time"
++msgstr "Sincronitza l'hora del sistema"
++
++msgid "Time Server"
++msgstr "Servidor d'horari"
++
++msgid "Time Servers"
++msgstr "Servidors d'horari"
++
++msgid "Time Synchronisation"
++msgstr "Sincronització d'horari"
++
++msgid "Update interval (in seconds)"
++msgstr "Interval d'actualització (en segons)"
++
++msgid "empty = infinite"
++msgstr "buit = infinit"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/cs/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/cs/ntpc.po
+new file mode 100644
+index 0000000..8c342de
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/cs/ntpc.po
+@@ -0,0 +1,55 @@
++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2014-04-14 12:47+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "Úprava Äasu"
++
++msgid "Count of time measurements"
++msgstr "PoÄet měření Äasu"
++
++msgid "Current system time"
++msgstr "Aktuální systémový Äas"
++
++msgid "General"
++msgstr "Obecné nastavení"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "Offset frequency"
++msgstr "Offsetová frekvence (chyba měření Äasu)"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Synchronizes the system time"
++msgstr "Synchronizuje systémový Äas s pÅ™esným reálným Äasem pÅ™es síť"
++
++msgid "Time Server"
++msgstr "SynchronizaÄní server"
++
++msgid "Time Servers"
++msgstr "SynchronizaÄní servery"
++
++msgid "Time Synchronisation"
++msgstr "Synchronizace Äasu"
++
++msgid "Update interval (in seconds)"
++msgstr "Interval obnovy synchronizace (v sekundách)"
++
++msgid "empty = infinite"
++msgstr "prázdný = neustálé opakování"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/de/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/de/ntpc.po
+new file mode 100644
+index 0000000..b610935
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/de/ntpc.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2012-07-17 15:07+0200\n"
++"Last-Translator: Martin <roecker@empty-v.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "Zeitgeberjustierung"
++
++msgid "Count of time measurements"
++msgstr "Anzahl der Zeitmessungen"
++
++msgid "Current system time"
++msgstr "Aktuelle Systemzeit"
++
++msgid "General"
++msgstr "Allgemein"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "Offset frequency"
++msgstr "Frequenzabweichung"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Synchronizes the system time"
++msgstr "Synchronisiert die Systemzeit"
++
++msgid "Time Server"
++msgstr "Zeitserver"
++
++msgid "Time Servers"
++msgstr "Zeitserver"
++
++msgid "Time Synchronisation"
++msgstr "Zeitsynchronisation"
++
++msgid "Update interval (in seconds)"
++msgstr "Aktualisierungsintervall (in Sekunden)"
++
++msgid "empty = infinite"
++msgstr "leer = unendlich"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/el/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/el/ntpc.po
+new file mode 100644
+index 0000000..c8f22eb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/el/ntpc.po
+@@ -0,0 +1,56 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2012-03-31 15:40+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Clock Adjustment"
++msgstr "ΡÏθμιση ΡολογιοÏ"
++
++msgid "Count of time measurements"
++msgstr "Πλήθος μετÏήσεων ÏŽÏας"
++
++msgid "Current system time"
++msgstr "ΤÏέχουσα ÏŽÏα συστήματος"
++
++msgid "General"
++msgstr "Γενικά"
++
++msgid "Hostname"
++msgstr "Όνομα συστήματος"
++
++#, fuzzy
++msgid "Offset frequency"
++msgstr "Συχνότητα μετάθεσης"
++
++msgid "Port"
++msgstr "ΘÏÏα"
++
++msgid "Synchronizes the system time"
++msgstr "ΣυγχÏονίζει την ÏŽÏα του συστήματος"
++
++msgid "Time Server"
++msgstr ""
++
++#, fuzzy
++msgid "Time Servers"
++msgstr "ΕξυπηÏετητές ÎÏας"
++
++msgid "Time Synchronisation"
++msgstr "ΣυγχÏονισμός ÎÏας"
++
++#, fuzzy
++msgid "Update interval (in seconds)"
++msgstr "ΠεÏίοδος ενημέÏωσης (σε δευτεÏόλεπτα)"
++
++msgid "empty = infinite"
++msgstr "άδειο = άπειÏος"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/en/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/en/ntpc.po
+new file mode 100644
+index 0000000..803a996
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/en/ntpc.po
+@@ -0,0 +1,51 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Clock Adjustment"
++msgstr "Clock Adjustment"
++
++msgid "Count of time measurements"
++msgstr "Count of time measurements"
++
++msgid "Current system time"
++msgstr "Current system time"
++
++msgid "General"
++msgstr "General"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "Offset frequency"
++msgstr "Offset frequency"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Synchronizes the system time"
++msgstr "Synchronizes the system time"
++
++msgid "Time Server"
++msgstr ""
++
++msgid "Time Servers"
++msgstr "Time Servers"
++
++msgid "Time Synchronisation"
++msgstr "Time Synchronisation"
++
++msgid "Update interval (in seconds)"
++msgstr "Update interval (in seconds)"
++
++msgid "empty = infinite"
++msgstr "empty = infinite"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/es/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/es/ntpc.po
+new file mode 100644
+index 0000000..40edf24
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/es/ntpc.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2012-11-25 11:14+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "Ajuste del Reloj"
++
++msgid "Count of time measurements"
++msgstr "Medida del tiempo"
++
++msgid "Current system time"
++msgstr "Hora actual del sistema"
++
++msgid "General"
++msgstr "General"
++
++msgid "Hostname"
++msgstr "Nombre de la máquina"
++
++msgid "Offset frequency"
++msgstr "Desplazamiento de frecuencia"
++
++msgid "Port"
++msgstr "Puerto"
++
++msgid "Synchronizes the system time"
++msgstr "Sincronizar la hora del sistema"
++
++msgid "Time Server"
++msgstr "Servidor de tiempo"
++
++msgid "Time Servers"
++msgstr "Servidores de hora"
++
++msgid "Time Synchronisation"
++msgstr "Sincronización horaria"
++
++msgid "Update interval (in seconds)"
++msgstr "Intervalo de actualización (en segundos)"
++
++msgid "empty = infinite"
++msgstr "vacío = infinito"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/fr/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/fr/ntpc.po
+new file mode 100644
+index 0000000..d417e15
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/fr/ntpc.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2012-11-06 16:08+0200\n"
++"Last-Translator: hogsim <hogsim@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "Ajustement de l'horloge"
++
++msgid "Count of time measurements"
++msgstr "Nombre de mesures du temps"
++
++msgid "Current system time"
++msgstr "Temps système actuel"
++
++msgid "General"
++msgstr "Général"
++
++msgid "Hostname"
++msgstr "Nom d'hôte"
++
++msgid "Offset frequency"
++msgstr "Décalage en fréquence"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Synchronizes the system time"
++msgstr "Synchronise le temps système"
++
++msgid "Time Server"
++msgstr "Serveur temps "
++
++msgid "Time Servers"
++msgstr "Serveurs de temps"
++
++msgid "Time Synchronisation"
++msgstr "Synchronisation du temps"
++
++msgid "Update interval (in seconds)"
++msgstr "Intervalle de mise à jour (en secondes)"
++
++msgid "empty = infinite"
++msgstr "vide = infini"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/he/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/he/ntpc.po
+new file mode 100644
+index 0000000..9d2bee6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/he/ntpc.po
+@@ -0,0 +1,59 @@
++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2011-06-25 11:40+0200\n"
++"Last-Translator: GiladL <gl1000007@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++# הת×מת שעון?
++#, fuzzy
++msgid "Clock Adjustment"
++msgstr "כיוון שעון"
++
++#, fuzzy
++msgid "Count of time measurements"
++msgstr "ספירת יחידות זמן"
++
++msgid "Current system time"
++msgstr "זמן מערכת נוכחי"
++
++msgid "General"
++msgstr "כללי"
++
++msgid "Hostname"
++msgstr "×©× ×ž×רח"
++
++#, fuzzy
++msgid "Offset frequency"
++msgstr "תדירות סטייה"
++
++msgid "Port"
++msgstr "פורט"
++
++msgid "Synchronizes the system time"
++msgstr "מסנכרן ×ת זמן המערכת"
++
++msgid "Time Server"
++msgstr ""
++
++msgid "Time Servers"
++msgstr "שרתי זמן"
++
++msgid "Time Synchronisation"
++msgstr "סנכרון זמן"
++
++msgid "Update interval (in seconds)"
++msgstr "מרווח בין ×¢×“×›×•× ×™× (בשניות)"
++
++msgid "empty = infinite"
++msgstr "ריק = ×ינסופי"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/hu/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/hu/ntpc.po
+new file mode 100644
+index 0000000..f69046f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/hu/ntpc.po
+@@ -0,0 +1,55 @@
++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2012-07-10 21:05+0200\n"
++"Last-Translator: Gyula <pro564@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "Óra igazítás"
++
++msgid "Count of time measurements"
++msgstr "Időmérések száma"
++
++msgid "Current system time"
++msgstr "Jelenlegi rendszeridő"
++
++msgid "General"
++msgstr "Ãltalános"
++
++msgid "Hostname"
++msgstr "Gépnév"
++
++msgid "Offset frequency"
++msgstr "Frekvencia eltolás"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Synchronizes the system time"
++msgstr "A rendszeridő szinkronizálása"
++
++msgid "Time Server"
++msgstr "Időszerver"
++
++msgid "Time Servers"
++msgstr "Időkiszolgálók"
++
++msgid "Time Synchronisation"
++msgstr "Idő szinkronizálás"
++
++msgid "Update interval (in seconds)"
++msgstr "Frissítési időköz (másodpercben)"
++
++msgid "empty = infinite"
++msgstr "üres = végtelen"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/it/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/it/ntpc.po
+new file mode 100644
+index 0000000..4b027b7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/it/ntpc.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2013-02-03 13:56+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "Impostazione Ora"
++
++msgid "Count of time measurements"
++msgstr "Conteggio delle misure del tempo"
++
++msgid "Current system time"
++msgstr "Ora corrente del sistema"
++
++msgid "General"
++msgstr "Generale"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "Offset frequency"
++msgstr "Offset delle frequenza"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Synchronizes the system time"
++msgstr "Sincronizza l'ora di sistema"
++
++msgid "Time Server"
++msgstr "Server Orologio"
++
++msgid "Time Servers"
++msgstr "Server dell'ora"
++
++msgid "Time Synchronisation"
++msgstr "Sincronizzazione dell'ora"
++
++msgid "Update interval (in seconds)"
++msgstr "Intervallo di aggiornamento (in secondi)"
++
++msgid "empty = infinite"
++msgstr "vuoto = infinito"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/ja/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/ja/ntpc.po
+new file mode 100644
+index 0000000..bb6135c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/ja/ntpc.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2012-11-14 14:41+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "時刻調整"
++
++msgid "Count of time measurements"
++msgstr "時間計測回数"
++
++msgid "Current system time"
++msgstr "ç¾åœ¨æ™‚刻"
++
++msgid "General"
++msgstr "一般設定"
++
++msgid "Hostname"
++msgstr "ホストå"
++
++msgid "Offset frequency"
++msgstr "オフセット周波数"
++
++msgid "Port"
++msgstr "ãƒãƒ¼ãƒˆ"
++
++msgid "Synchronizes the system time"
++msgstr "システムã®æ™‚é–“ã‚’åŒæœŸã—ã¾ã™ã€‚"
++
++msgid "Time Server"
++msgstr "時刻サーãƒãƒ¼"
++
++msgid "Time Servers"
++msgstr "時刻サーãƒãƒ¼"
++
++msgid "Time Synchronisation"
++msgstr "Time Synchronisation"
++
++msgid "Update interval (in seconds)"
++msgstr "アップデート間隔 (秒)"
++
++msgid "empty = infinite"
++msgstr "空ã®å ´åˆã€ç„¡é™å¤§ã«ãªã‚Šã¾ã™"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/ms/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/ms/ntpc.po
+new file mode 100644
+index 0000000..abbfdbe
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/ms/ntpc.po
+@@ -0,0 +1,52 @@
++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2010-04-14 13:24+0200\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Clock Adjustment"
++msgstr ""
++
++msgid "Count of time measurements"
++msgstr ""
++
++msgid "Current system time"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Offset frequency"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Synchronizes the system time"
++msgstr ""
++
++msgid "Time Server"
++msgstr ""
++
++msgid "Time Servers"
++msgstr ""
++
++msgid "Time Synchronisation"
++msgstr ""
++
++msgid "Update interval (in seconds)"
++msgstr ""
++
++msgid "empty = infinite"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/no/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/no/ntpc.po
+new file mode 100644
+index 0000000..7b3fd0b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/no/ntpc.po
+@@ -0,0 +1,44 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Clock Adjustment"
++msgstr "Tidskorrigering"
++
++msgid "Count of time measurements"
++msgstr "Antall tidsmålinger"
++
++msgid "Current system time"
++msgstr "Nåværende system tid"
++
++msgid "General"
++msgstr "Generelt"
++
++msgid "Hostname"
++msgstr "Vertsnavn"
++
++msgid "Offset frequency"
++msgstr "Frekvens forskyvning"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Synchronizes the system time"
++msgstr "Synkroniserer systemets tid"
++
++msgid "Time Server"
++msgstr "Tids Server"
++
++msgid "Time Servers"
++msgstr "Tids Servere"
++
++msgid "Time Synchronisation"
++msgstr "Tidssynkronisering"
++
++msgid "Update interval (in seconds)"
++msgstr "Oppdateringsintervall (i sek)"
++
++msgid "empty = infinite"
++msgstr "tomt = uendelig"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/pl/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/pl/ntpc.po
+new file mode 100644
+index 0000000..c2cb3e8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/pl/ntpc.po
+@@ -0,0 +1,54 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2011-09-18 02:23+0200\n"
++"Last-Translator: Michał <wispwind@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Clock Adjustment"
++msgstr "Regulacja zegara"
++
++msgid "Count of time measurements"
++msgstr "Liczba pomiarów czasu"
++
++msgid "Current system time"
++msgstr "Aktualny czas systemowy"
++
++msgid "General"
++msgstr "Główne"
++
++msgid "Hostname"
++msgstr "Nazwa hosta"
++
++msgid "Offset frequency"
++msgstr "Przesunięcie częstotliwości"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Synchronizes the system time"
++msgstr "Synchronizuje czas systemowy"
++
++msgid "Time Server"
++msgstr "Serwer czasu"
++
++msgid "Time Servers"
++msgstr "Serwery czasu"
++
++msgid "Time Synchronisation"
++msgstr "Synchronizacja czasu"
++
++msgid "Update interval (in seconds)"
++msgstr "Interwał aktualizacji (w sekundach)"
++
++msgid "empty = infinite"
++msgstr "puste = nieskończone"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/pt-br/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/pt-br/ntpc.po
+new file mode 100644
+index 0000000..9e8849a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/pt-br/ntpc.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2011-10-18 22:38+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Clock Adjustment"
++msgstr "Ajuste do Relógio"
++
++msgid "Count of time measurements"
++msgstr "Quantidade de medições do tempo"
++
++msgid "Current system time"
++msgstr "Hora atual do sistema"
++
++msgid "General"
++msgstr "Geral"
++
++msgid "Hostname"
++msgstr "Nome do computador"
++
++msgid "Offset frequency"
++msgstr "Frequência da compensação"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Synchronizes the system time"
++msgstr "Sincroniza a hora do sistema"
++
++msgid "Time Server"
++msgstr "Servidor de Hora."
++
++msgid "Time Servers"
++msgstr "Servidores de Hora"
++
++msgid "Time Synchronisation"
++msgstr "Sincronização de Horário"
++
++msgid "Update interval (in seconds)"
++msgstr "Intervalo de atualização (em segundos)"
++
++msgid "empty = infinite"
++msgstr "vazio = infinito"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/pt/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/pt/ntpc.po
+new file mode 100644
+index 0000000..70e7952
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/pt/ntpc.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2013-05-01 01:16+0200\n"
++"Last-Translator: pedromrgoncalves <pedromrgoncalves@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "Ajuste do Relógio"
++
++msgid "Count of time measurements"
++msgstr "Quantas vezes irá atualizar"
++
++msgid "Current system time"
++msgstr "Hora actual do sistema"
++
++msgid "General"
++msgstr "Geral"
++
++msgid "Hostname"
++msgstr "Nome do Host"
++
++msgid "Offset frequency"
++msgstr "Frequência do Offset"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Synchronizes the system time"
++msgstr "Sincroniza a hora do sistema"
++
++msgid "Time Server"
++msgstr "Servidor de Hora"
++
++msgid "Time Servers"
++msgstr "Servidores de Hora"
++
++msgid "Time Synchronisation"
++msgstr "Sincronização de Horário"
++
++msgid "Update interval (in seconds)"
++msgstr "Intervalo de Actualização (em s)"
++
++msgid "empty = infinite"
++msgstr "vazio = infinito"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/ro/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/ro/ntpc.po
+new file mode 100644
+index 0000000..893419f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/ro/ntpc.po
+@@ -0,0 +1,56 @@
++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2012-12-01 16:08+0200\n"
++"Last-Translator: cgherman <cgherman@mandrivausers.ro>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "Ajustarea ceasului"
++
++msgid "Count of time measurements"
++msgstr "Masuratori de timp"
++
++msgid "Current system time"
++msgstr "Timpul curent de sistem"
++
++msgid "General"
++msgstr "General"
++
++msgid "Hostname"
++msgstr "Numele de host"
++
++msgid "Offset frequency"
++msgstr "Frecventa de offset"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Synchronizes the system time"
++msgstr "Sincronizeaza timpul sistemului"
++
++msgid "Time Server"
++msgstr "Server de timp"
++
++msgid "Time Servers"
++msgstr "Serverele de timp"
++
++msgid "Time Synchronisation"
++msgstr "Sincronizarea de timp"
++
++msgid "Update interval (in seconds)"
++msgstr "Intervalul de actualizare (in secunde)"
++
++msgid "empty = infinite"
++msgstr "gol = infinit"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/ru/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/ru/ntpc.po
+new file mode 100644
+index 0000000..229b610
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/ru/ntpc.po
+@@ -0,0 +1,55 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: ntpc\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2012-08-15 11:41+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Clock Adjustment"
++msgstr "Корректировка чаÑов"
++
++msgid "Count of time measurements"
++msgstr "КоличеÑтво измерений времени"
++
++msgid "Current system time"
++msgstr "Текущее времÑ"
++
++msgid "General"
++msgstr "Общие"
++
++msgid "Hostname"
++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта"
++
++msgid "Offset frequency"
++msgstr "Смещение чаÑтоты"
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Synchronizes the system time"
++msgstr "Синхронизирует ÑиÑтемное времÑ"
++
++msgid "Time Server"
++msgstr "Сервер времени"
++
++msgid "Time Servers"
++msgstr "Серверы времени"
++
++msgid "Time Synchronisation"
++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸"
++
++msgid "Update interval (in seconds)"
++msgstr "Интервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (в Ñекундах)"
++
++msgid "empty = infinite"
++msgstr "пуÑто = беÑконечно"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/sk/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/sk/ntpc.po
+new file mode 100644
+index 0000000..d3f8fb8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/sk/ntpc.po
+@@ -0,0 +1,48 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Clock Adjustment"
++msgstr ""
++
++msgid "Count of time measurements"
++msgstr ""
++
++msgid "Current system time"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Offset frequency"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Synchronizes the system time"
++msgstr ""
++
++msgid "Time Server"
++msgstr ""
++
++msgid "Time Servers"
++msgstr ""
++
++msgid "Time Synchronisation"
++msgstr ""
++
++msgid "Update interval (in seconds)"
++msgstr ""
++
++msgid "empty = infinite"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/sv/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/sv/ntpc.po
+new file mode 100644
+index 0000000..00715e6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/sv/ntpc.po
+@@ -0,0 +1,49 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Clock Adjustment"
++msgstr ""
++
++msgid "Count of time measurements"
++msgstr ""
++
++msgid "Current system time"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Offset frequency"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Synchronizes the system time"
++msgstr ""
++
++msgid "Time Server"
++msgstr ""
++
++msgid "Time Servers"
++msgstr ""
++
++msgid "Time Synchronisation"
++msgstr ""
++
++msgid "Update interval (in seconds)"
++msgstr ""
++
++msgid "empty = infinite"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/templates/ntpc.pot b/feeds/luci/applications/luci-app-ntpc/po/templates/ntpc.pot
+new file mode 100644
+index 0000000..1ed4c40
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/templates/ntpc.pot
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Clock Adjustment"
++msgstr ""
++
++msgid "Count of time measurements"
++msgstr ""
++
++msgid "Current system time"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Offset frequency"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Synchronizes the system time"
++msgstr ""
++
++msgid "Time Server"
++msgstr ""
++
++msgid "Time Servers"
++msgstr ""
++
++msgid "Time Synchronisation"
++msgstr ""
++
++msgid "Update interval (in seconds)"
++msgstr ""
++
++msgid "empty = infinite"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/tr/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/tr/ntpc.po
+new file mode 100644
+index 0000000..657b2e8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/tr/ntpc.po
+@@ -0,0 +1,55 @@
++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2012-10-11 22:20+0200\n"
++"Last-Translator: vincenzo <tayfun_ozturk@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: tr\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: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "Saat Ayarı"
++
++msgid "Count of time measurements"
++msgstr "Zaman Ölçüm Sayacı"
++
++msgid "Current system time"
++msgstr "Mevcut Sistem Saati"
++
++msgid "General"
++msgstr "Genel"
++
++msgid "Hostname"
++msgstr "Sunucu Adı"
++
++msgid "Offset frequency"
++msgstr "Denge Frekansı"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Synchronizes the system time"
++msgstr "Sistem Saati Senkronizasyonu"
++
++msgid "Time Server"
++msgstr "Zaman Sunucusu"
++
++msgid "Time Servers"
++msgstr "Zaman Sunucuları"
++
++msgid "Time Synchronisation"
++msgstr "Saat Senkronizasyonu"
++
++msgid "Update interval (in seconds)"
++msgstr "Güncelleme Aralığı (Saniye)"
++
++msgid "empty = infinite"
++msgstr "BoÅŸ = Sonsuz"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/uk/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/uk/ntpc.po
+new file mode 100644
+index 0000000..451f783
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/uk/ntpc.po
+@@ -0,0 +1,56 @@
++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2012-03-18 20:32+0200\n"
++"Last-Translator: YuriPet <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++
++msgid "Clock Adjustment"
++msgstr "ÐšÐ¾Ñ€Ð¸Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð¾Ð´Ð¸Ð½Ð½Ð¸ÐºÐ°"
++
++msgid "Count of time measurements"
++msgstr "КількіÑÑ‚ÑŒ вимірювань чаÑу"
++
++msgid "Current system time"
++msgstr "Поточний ÑиÑтемний чаÑ"
++
++msgid "General"
++msgstr "Загальне"
++
++msgid "Hostname"
++msgstr "Ðазва (ім'Ñ) вузла"
++
++msgid "Offset frequency"
++msgstr "ЗÑув чаÑтоти"
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Synchronizes the system time"
++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ ÑиÑтемного чаÑу"
++
++msgid "Time Server"
++msgstr "Сервер чаÑу"
++
++msgid "Time Servers"
++msgstr "Сервери чаÑу"
++
++msgid "Time Synchronisation"
++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñу"
++
++msgid "Update interval (in seconds)"
++msgstr "Інтервал Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ (в Ñекундах)"
++
++msgid "empty = infinite"
++msgstr "пуÑто = неÑкінченно"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/vi/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/vi/ntpc.po
+new file mode 100644
+index 0000000..4de0971
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/vi/ntpc.po
+@@ -0,0 +1,57 @@
++# ntpc.pot
++# generated from ./applications/luci-ntpc/luasrc/i18n/ntpc.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2009-08-13 03:46+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "Clock Adjustment"
++msgstr "Äiá»u chỉnh đồng hồ"
++
++#, fuzzy
++msgid "Count of time measurements"
++msgstr "Äếm thá»i gian"
++
++msgid "Current system time"
++msgstr "Thá»i gian hiện tại của hệ thống"
++
++msgid "General"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++#, fuzzy
++msgid "Offset frequency"
++msgstr "tần số offset "
++
++msgid "Port"
++msgstr ""
++
++msgid "Synchronizes the system time"
++msgstr "Äồng bá»™ hóa giá» hệ thống"
++
++msgid "Time Server"
++msgstr ""
++
++#, fuzzy
++msgid "Time Servers"
++msgstr "Giá» server"
++
++msgid "Time Synchronisation"
++msgstr "Thá»i gian đồng bá»™ hóa"
++
++#, fuzzy
++msgid "Update interval (in seconds)"
++msgstr "Cập nhật Interval (giây)"
++
++msgid "empty = infinite"
++msgstr "Rỗng = Vô tận"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/zh-cn/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/zh-cn/ntpc.po
+new file mode 100644
+index 0000000..0821c3f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/zh-cn/ntpc.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCi Chinese Translation\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-14 13:24+0200\n"
++"PO-Revision-Date: 2012-11-15 21:39+0200\n"
++"Last-Translator: Rui <shenrui01@gmail.com>\n"
++"Language-Team: QQ Group 75543259\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "时钟校对"
++
++msgid "Count of time measurements"
++msgstr "å•ä½æ—¶é—´æ•°"
++
++msgid "Current system time"
++msgstr "当å‰ç³»ç»Ÿæ—¶é—´"
++
++msgid "General"
++msgstr "基本设置"
++
++msgid "Hostname"
++msgstr "主机å"
++
++msgid "Offset frequency"
++msgstr "å移é‡"
++
++msgid "Port"
++msgstr "端å£"
++
++msgid "Synchronizes the system time"
++msgstr "åŒæ­¥ç³»ç»Ÿæ—¶é—´"
++
++msgid "Time Server"
++msgstr "时间æœåŠ¡å™¨"
++
++msgid "Time Servers"
++msgstr "时间æœåŠ¡å™¨"
++
++msgid "Time Synchronisation"
++msgstr "时间åŒæ­¥"
++
++msgid "Update interval (in seconds)"
++msgstr "更新间隔(秒)"
++
++msgid "empty = infinite"
++msgstr "空值为无é™é•¿åº¦"
+diff --git a/feeds/luci/applications/luci-app-ntpc/po/zh-tw/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/zh-tw/ntpc.po
+new file mode 100644
+index 0000000..a898671
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ntpc/po/zh-tw/ntpc.po
+@@ -0,0 +1,51 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 18:43+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Clock Adjustment"
++msgstr "校時修正"
++
++msgid "Count of time measurements"
++msgstr "時間計é‡æ¬¡æ•¸"
++
++msgid "Current system time"
++msgstr "ç›®å‰ç³»çµ±æ™‚é–“"
++
++msgid "General"
++msgstr "一般"
++
++msgid "Hostname"
++msgstr "主機å稱"
++
++msgid "Offset frequency"
++msgstr "å移頻é“"
++
++msgid "Port"
++msgstr "埠號"
++
++msgid "Synchronizes the system time"
++msgstr "åŒæ­¥é€™å€‹ç³»çµ±æ™‚é–“"
++
++msgid "Time Server"
++msgstr "校時伺æœå™¨"
++
++msgid "Time Servers"
++msgstr "校時伺æœå™¨"
++
++msgid "Time Synchronisation"
++msgstr "校時åŒæ­¥"
++
++msgid "Update interval (in seconds)"
++msgstr "更新間隔(秒)"
++
++msgid "empty = infinite"
++msgstr "留白=ä¸é™åˆ¶"
+diff --git a/feeds/luci/applications/luci-app-ocserv/Makefile b/feeds/luci/applications/luci-app-ocserv/Makefile
+new file mode 100644
+index 0000000..3fbf4d2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ocserv/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for OpenConnect VPN
++LUCI_DEPENDS:=+ocserv +certtool
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/controller/ocserv.lua b/feeds/luci/applications/luci-app-ocserv/luasrc/controller/ocserv.lua
+new file mode 100644
+index 0000000..79c6ddb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/controller/ocserv.lua
+@@ -0,0 +1,78 @@
++-- Copyright 2014 Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.ocserv", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/ocserv") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "services", "ocserv"}, alias("admin", "services", "ocserv", "main"),
++ _("OpenConnect VPN"))
++ page.dependent = true
++
++ page = entry({"admin", "services", "ocserv", "main"},
++ cbi("ocserv/main"),
++ _("Server Settings"), 200)
++ page.dependent = true
++
++ page = entry({"admin", "services", "ocserv", "users"},
++ cbi("ocserv/users"),
++ _("User Settings"), 300)
++ page.dependent = true
++
++ entry({"admin", "services", "ocserv", "status"},
++ call("ocserv_status")).leaf = true
++
++ entry({"admin", "services", "ocserv", "disconnect"},
++ post("ocserv_disconnect")).leaf = true
++
++end
++
++function ocserv_status()
++ local ipt = io.popen("/usr/bin/occtl show users");
++
++ if ipt then
++
++ local fwd = { }
++ while true do
++
++ local ln = ipt:read("*l")
++ if not ln then break end
++
++ local id, user, group, vpn_ip, ip, device, time, cipher, status =
++ ln:match("^%s*(%d+)%s+([-_%w]+)%s+([%(%)%.%*-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%(%)%:%.-_%w]+)%s+([%:%.-_%w]+).*")
++ if id then
++ fwd[#fwd+1] = {
++ id = id,
++ user = user,
++ group = group,
++ vpn_ip = vpn_ip,
++ ip = ip,
++ device = device,
++ time = time,
++ cipher = cipher,
++ status = status
++ }
++ end
++ end
++ ipt:close()
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(fwd)
++ end
++end
++
++function ocserv_disconnect(num)
++ local idx = tonumber(num)
++
++ if idx and idx > 0 then
++ luci.sys.call("/usr/bin/occtl disconnect id %d" % idx)
++ luci.http.status(200, "OK")
++
++ return
++ end
++ luci.http.status(400, "Bad request")
++end
+diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/main.lua b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/main.lua
+new file mode 100644
+index 0000000..74edaf4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/main.lua
+@@ -0,0 +1,179 @@
++-- Copyright 2014 Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local has_ipv6 = fs.access("/proc/net/ipv6_route")
++
++m = Map("ocserv", translate("OpenConnect VPN"))
++
++s = m:section(TypedSection, "ocserv", "OpenConnect")
++s.anonymous = true
++
++s:tab("general", translate("General Settings"))
++s:tab("ca", translate("CA certificate"))
++s:tab("template", translate("Edit Template"))
++
++local e = s:taboption("general", Flag, "enable", translate("Enable server"))
++e.rmempty = false
++e.default = "1"
++
++local o_sha = s:taboption("general", DummyValue, "sha_hash", translate("Server's certificate SHA1 hash"),
++ translate("That value should be communicated to the client to verify the server's certificate"))
++local o_pki = s:taboption("general", DummyValue, "pkid", translate("Server's Public Key ID"),
++ translate("An alternative value to be communicated to the client to verify the server's certificate; this value only depends on the public key"))
++
++local fd = io.popen("/usr/bin/certtool -i --infile /etc/ocserv/server-cert.pem", "r")
++if fd then local ln
++ local found_sha = false
++ local found_pki = false
++ local complete = 0
++ while complete < 2 do
++ local ln = fd:read("*l")
++ if not ln then
++ break
++ elseif ln:match("SHA%-?1 fingerprint:") then
++ found_sha = true
++ elseif found_sha then
++ local hash = ln:match("([a-f0-9]+)")
++ o_sha.default = hash and hash:upper()
++ complete = complete + 1
++ found_sha = false
++ elseif ln:match("Public Key I[Dd]:") then
++ found_pki = true
++ elseif found_pki then
++ local hash = ln:match("([a-f0-9]+)")
++ o_pki.default = hash and "sha1:" .. hash:upper()
++ complete = complete + 1
++ found_pki = false
++ end
++ end
++ fd:close()
++end
++
++function m.on_commit(map)
++ luci.sys.call("/usr/bin/occtl reload >/dev/null 2>&1")
++end
++
++function e.write(self, section, value)
++ if value == "0" then
++ luci.sys.call("/etc/init.d/ocserv stop >/dev/null 2>&1")
++ luci.sys.call("/etc/init.d/ocserv disable >/dev/null 2>&1")
++ else
++ luci.sys.call("/etc/init.d/ocserv enable >/dev/null 2>&1")
++ luci.sys.call("/etc/init.d/ocserv restart >/dev/null 2>&1")
++ end
++ Flag.write(self, section, value)
++end
++
++local o
++
++o = s:taboption("general", ListValue, "auth", translate("User Authentication"),
++ translate("The authentication method for the users. The simplest is plain with a single username-password pair. Use PAM modules to authenticate using another server (e.g., LDAP, Radius)."))
++o.rmempty = false
++o.default = "plain"
++o:value("plain")
++o:value("PAM")
++
++s:taboption("general", Value, "port", translate("Port"),
++ translate("The same UDP and TCP ports will be used"))
++s:taboption("general", Value, "max_clients", translate("Max clients"))
++s:taboption("general", Value, "max_same", translate("Max same clients"))
++s:taboption("general", Value, "dpd", translate("Dead peer detection time (secs)"))
++
++local pip = s:taboption("general", Flag, "predictable_ips", translate("Predictable IPs"),
++ translate("The assigned IPs will be selected deterministically"))
++pip.default = "1"
++
++local compr = s:taboption("general", Flag, "compression", translate("Enable compression"),
++ translate("Enable compression"))
++compr.default = "1"
++
++local udp = s:taboption("general", Flag, "udp", translate("Enable UDP"),
++ translate("Enable UDP channel support; this must be enabled unless you know what you are doing"))
++udp.default = "1"
++
++local cisco = s:taboption("general", Flag, "cisco_compat", translate("AnyConnect client compatibility"),
++ translate("Enable support for CISCO AnyConnect clients"))
++cisco.default = "1"
++
++
++tmpl = s:taboption("template", Value, "_tmpl",
++ translate("Edit the template that is used for generating the ocserv configuration."))
++
++tmpl.template = "cbi/tvalue"
++tmpl.rows = 20
++
++function tmpl.cfgvalue(self, section)
++ return nixio.fs.readfile("/etc/ocserv/ocserv.conf.template")
++end
++
++function tmpl.write(self, section, value)
++ value = value:gsub("\r\n?", "\n")
++ nixio.fs.writefile("/etc/ocserv/ocserv.conf.template", value)
++end
++
++ca = s:taboption("ca", Value, "_ca",
++ translate("View the CA certificate used by this server. You will need to save it as 'ca.pem' and import it into the clients."))
++
++ca.template = "cbi/tvalue"
++ca.rows = 20
++
++function ca.cfgvalue(self, section)
++ return nixio.fs.readfile("/etc/ocserv/ca.pem")
++end
++
++--[[Networking options]]--
++
++local parp = s:taboption("general", Flag, "proxy_arp", translate("Enable proxy arp"),
++ translate("Provide addresses to clients from a subnet of LAN; if enabled the network below must be a subnet of LAN. Note that the first address of the specified subnet will be reserved by ocserv, so it should not be in use. If you have a network in LAN covering 192.168.1.0/24 use 192.168.1.192/26 to reserve the upper 62 addresses."))
++parp.default = "0"
++
++ipaddr = s:taboption("general", Value, "ipaddr", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Network-Address"),
++ translate("The IPv4 subnet address to provide to clients; this should be some private network different than the LAN addresses unless proxy ARP is enabled. Leave empty to attempt auto-configuration."))
++ipaddr.datatype = "ip4addr"
++ipaddr.default = "192.168.100.1"
++
++nm = s:taboption("general", Value, "netmask", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"),
++ translate("The mask of the subnet above."))
++nm.datatype = "ip4addr"
++nm.default = "255.255.255.0"
++nm:value("255.255.255.0")
++nm:value("255.255.0.0")
++nm:value("255.0.0.0")
++
++if has_ipv6 then
++ ip6addr = s:taboption("general", Value, "ip6addr", translate("VPN <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Network-Address"), translate("<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: address/prefix"),
++ translate("The IPv6 subnet address to provide to clients; leave empty to attempt auto-configuration."))
++ ip6addr.datatype = "ip6addr"
++end
++
++
++--[[DNS]]--
++
++s = m:section(TypedSection, "dns", translate("DNS servers"),
++ translate("The DNS servers to be provided to clients; can be either IPv6 or IPv4. Typically you should include the address of this device"))
++s.anonymous = true
++s.addremove = true
++s.template = "cbi/tblsection"
++
++s:option(Value, "ip", translate("IP Address")).rmempty = true
++s.datatype = "ipaddr"
++
++--[[Routes]]--
++
++s = m:section(TypedSection, "routes", translate("Routing table"),
++ translate("The routing table to be provided to clients; you can mix IPv4 and IPv6 routes, the server will send only the appropriate. Leave empty to set a default route"))
++s.anonymous = true
++s.addremove = true
++s.template = "cbi/tblsection"
++
++s:option(Value, "ip", translate("IP Address")).rmempty = true
++
++o = s:option(Value, "netmask", translate("Netmask (or IPv6-prefix)"))
++o.default = "255.255.255.0"
++o:value("255.255.255.0")
++o:value("255.255.0.0")
++o:value("255.0.0.0")
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/user-config.lua b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/user-config.lua
+new file mode 100644
+index 0000000..c50cb39
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/user-config.lua
+@@ -0,0 +1,139 @@
++-- Copyright 2014 Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local has_ipv6 = fs.access("/proc/net/ipv6_route")
++
++m = Map("ocserv", translate("OpenConnect VPN"))
++
++s = m:section(TypedSection, "ocserv", "OpenConnect")
++s.anonymous = true
++
++s:tab("general", translate("General Settings"))
++s:tab("ca", translate("CA certificate"))
++s:tab("template", translate("Edit Template"))
++
++local e = s:taboption("general", Flag, "enable", translate("Enable server"))
++e.rmempty = false
++e.default = "1"
++
++function m.on_commit(map)
++ luci.sys.call("/usr/bin/occtl reload >/dev/null 2>&1")
++end
++
++function e.write(self, section, value)
++ if value == "0" then
++ luci.sys.call("/etc/init.d/ocserv stop >/dev/null 2>&1")
++ luci.sys.call("/etc/init.d/ocserv disable >/dev/null 2>&1")
++ else
++ luci.sys.call("/etc/init.d/ocserv enable >/dev/null 2>&1")
++ luci.sys.call("/etc/init.d/ocserv restart >/dev/null 2>&1")
++ end
++ Flag.write(self, section, value)
++end
++
++local o
++
++o = s:taboption("general", ListValue, "auth", translate("User Authentication"),
++ translate("The authentication method for the users. The simplest is plain with a single username-password pair. Use PAM modules to authenticate using another server (e.g., LDAP, Radius)."))
++o.rmempty = false
++o.default = "plain"
++o:value("plain")
++o:value("PAM")
++
++o = s:taboption("general", Value, "zone", translate("Firewall Zone"),
++ translate("The firewall zone that the VPN clients will be set to"))
++o.nocreate = true
++o.default = "lan"
++o.template = "cbi/firewall_zonelist"
++
++s:taboption("general", Value, "port", translate("Port"),
++ translate("The same UDP and TCP ports will be used"))
++s:taboption("general", Value, "max_clients", translate("Max clients"))
++s:taboption("general", Value, "max_same", translate("Max same clients"))
++s:taboption("general", Value, "dpd", translate("Dead peer detection time (secs)"))
++
++local pip = s:taboption("general", Flag, "predictable_ips", translate("Predictable IPs"),
++ translate("The assigned IPs will be selected deterministically"))
++pip.default = "1"
++
++local udp = s:taboption("general", Flag, "udp", translate("Enable UDP"),
++ translate("Enable UDP channel support; this must be enabled unless you know what you are doing"))
++udp.default = "1"
++
++local cisco = s:taboption("general", Flag, "cisco_compat", translate("AnyConnect client compatibility"),
++ translate("Enable support for CISCO AnyConnect clients"))
++cisco.default = "1"
++
++ipaddr = s:taboption("general", Value, "ipaddr", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Network-Address"))
++ipaddr.default = "192.168.100.1"
++ipaddr.datatype = "ip4addr"
++
++nm = s:taboption("general", Value, "netmask", translate("VPN <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"))
++nm.default = "255.255.255.0"
++nm.datatype = "ip4addr"
++nm:value("255.255.255.0")
++nm:value("255.255.0.0")
++nm:value("255.0.0.0")
++
++if has_ipv6 then
++ ip6addr = s:taboption("general", Value, "ip6addr", translate("VPN <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Network-Address"), translate("<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: address/prefix"))
++end
++
++
++tmpl = s:taboption("template", Value, "_tmpl",
++ translate("Edit the template that is used for generating the ocserv configuration."))
++
++tmpl.template = "cbi/tvalue"
++tmpl.rows = 20
++
++function tmpl.cfgvalue(self, section)
++ return nixio.fs.readfile("/etc/ocserv/ocserv.conf.template")
++end
++
++function tmpl.write(self, section, value)
++ value = value:gsub("\r\n?", "\n")
++ nixio.fs.writefile("/etc/ocserv/ocserv.conf.template", value)
++end
++
++ca = s:taboption("ca", Value, "_ca",
++ translate("View the CA certificate used by this server. You will need to save it as 'ca.pem' and import it into the clients."))
++
++ca.template = "cbi/tvalue"
++ca.rows = 20
++
++function ca.cfgvalue(self, section)
++ return nixio.fs.readfile("/etc/ocserv/ca.pem")
++end
++
++--[[DNS]]--
++
++s = m:section(TypedSection, "dns", translate("DNS servers"),
++ translate("The DNS servers to be provided to clients; can be either IPv6 or IPv4"))
++s.anonymous = true
++s.addremove = true
++s.template = "cbi/tblsection"
++
++s:option(Value, "ip", translate("IP Address")).rmempty = true
++s.datatype = "ipaddr"
++
++--[[Routes]]--
++
++s = m:section(TypedSection, "routes", translate("Routing table"),
++ translate("The routing table to be provided to clients; you can mix IPv4 and IPv6 routes, the server will send only the appropriate. Leave empty to set a default route"))
++s.anonymous = true
++s.addremove = true
++s.template = "cbi/tblsection"
++
++s:option(Value, "ip", translate("IP Address")).rmempty = true
++s.datatype = "ipaddr"
++
++o = s:option(Value, "netmask", translate("Netmask (or IPv6-prefix)"))
++o.default = "255.255.255.0"
++
++o:value("255.255.255.0")
++o:value("255.255.0.0")
++o:value("255.0.0.0")
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/users.lua b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/users.lua
+new file mode 100644
+index 0000000..0fa997c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/users.lua
+@@ -0,0 +1,75 @@
++-- Copyright 2014 Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++local dsp = require "luci.dispatcher"
++local nixio = require "nixio"
++
++m = Map("ocserv", translate("OpenConnect VPN"))
++
++if m.uci:get("ocserv", "config", "auth") == "plain" then
++
++--[[Users]]--
++
++function m.on_commit(map)
++ luci.sys.call("/etc/init.d/ocserv restart >/dev/null 2>&1")
++end
++
++s = m:section(TypedSection, "ocservusers", translate("Available users"))
++s.anonymous = true
++s.addremove = true
++s.template = "cbi/tblsection"
++
++s:option(Value, "name", translate("Name")).rmempty = true
++s:option(DummyValue, "group", translate("Group")).rmempty = true
++pwd = s:option(Value, "password", translate("Password"))
++pwd.password = false
++
++function pwd.write(self, section, value)
++ local pass
++ if string.match(value, "^\$%d\$.*") then
++ pass = value
++ else
++ local t = tonumber(nixio.getpid()*os.time())
++ local salt = "$1$" .. t .. "$"
++ pass = nixio.crypt(value, salt)
++ end
++ Value.write(self, section, pass)
++end
++
++--[[if plain]]--
++end
++
++local lusers = { }
++local fd = io.popen("/usr/bin/occtl show users", "r")
++if fd then local ln
++ repeat
++ ln = fd:read("*l")
++ if not ln then break end
++
++ local id, user, group, vpn_ip, ip, device, time, cipher, status =
++ ln:match("^%s*(%d+)%s+([-_%w]+)%s+([%(%)%.%*-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%(%)%:%.-_%w]+)%s+([%:%.-_%w]+).*")
++ if id then
++ table.insert(lusers, {id, user, group, vpn_ip, ip, device, time, cipher, status})
++ end
++ until not ln
++ fd:close()
++end
++
++
++--[[Active Users]]--
++
++local s = m:section(Table, lusers, translate("Active users"))
++s.anonymous = true
++s.template = "cbi/tblsection"
++
++s:option(DummyValue, 1, translate("ID"))
++s:option(DummyValue, 2, translate("Username"))
++s:option(DummyValue, 3, translate("Group"))
++s:option(DummyValue, 4, translate("IP"))
++s:option(DummyValue, 5, translate("VPN IP"))
++s:option(DummyValue, 6, translate("Device"))
++s:option(DummyValue, 7, translate("Time"))
++s:option(DummyValue, 8, translate("Cipher"))
++s:option(DummyValue, 9, translate("Status"))
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/view/admin_status/index/ocserv.htm b/feeds/luci/applications/luci-app-ocserv/luasrc/view/admin_status/index/ocserv.htm
+new file mode 100644
+index 0000000..4575806
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/view/admin_status/index/ocserv.htm
+@@ -0,0 +1 @@
++<%+ocserv_status%>
+diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/view/ocserv_status.htm b/feeds/luci/applications/luci-app-ocserv/luasrc/view/ocserv_status.htm
+new file mode 100644
+index 0000000..03a9ed7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/view/ocserv_status.htm
+@@ -0,0 +1,76 @@
++<script type="text/javascript">//<![CDATA[
++
++ function ocserv_disconnect(idx) {
++ (new XHR()).post('<%=url('admin/services/ocserv/disconnect')%>/' + idx, { token: '<%=token%>' },
++ function(x)
++ {
++ var tb = document.getElementById('ocserv_status_table');
++ if (tb && (idx < tb.rows.length))
++ tb.rows[0].parentNode.removeChild(tb.rows[idx]);
++ }
++ );
++ }
++
++ XHR.poll(5, '<%=url('admin/services/ocserv/status')%>', null,
++ function(x, st)
++ {
++ var tb = document.getElementById('ocserv_status_table');
++ if (st && tb)
++ {
++ /* clear all rows */
++ while( tb.rows.length > 1 )
++ tb.deleteRow(1);
++
++ 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
++ );
++ }
++
++ 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>';
++ }
++ }
++ }
++ );
++//]]></script>
++
++<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>
++</fieldset>
+diff --git a/feeds/luci/applications/luci-app-olsr-services/Makefile b/feeds/luci/applications/luci-app-olsr-services/Makefile
+new file mode 100644
+index 0000000..b1daf6d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr-services/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Show services announced with the nameservice plugin
++LUCI_DEPENDS:=+luci-app-olsr +olsrd +olsrd-mod-nameservice
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-olsr-services/luasrc/controller/services.lua b/feeds/luci/applications/luci-app-olsr-services/luasrc/controller/services.lua
+new file mode 100644
+index 0000000..a4636bf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr-services/luasrc/controller/services.lua
+@@ -0,0 +1,16 @@
++module "luci.controller.services"
++
++function index()
++ local uci = require "luci.model.uci".cursor()
++
++ uci:foreach("olsrd", "LoadPlugin", function(s)
++ if s.library == "olsrd_nameservice.so.0.3" then
++ has_serv = true
++ end
++ end)
++
++ if has_serv then
++ entry({"freifunk", "services"}, template("freifunk-services/services"), _("Services"), 60)
++ end
++end
++
+diff --git a/feeds/luci/applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm b/feeds/luci/applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm
+new file mode 100644
+index 0000000..476150d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm
+@@ -0,0 +1,193 @@
++<%#
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++local fs = require "nixio.fs"
++local utl = require "luci.util"
++local last_update
++local i = 1
++local rawdata
++local rawdata6
++local services_file_empty = true
++local has_services = false
++local uci = require "luci.model.uci".cursor()
++local ip = require "luci.ip"
++
++uci:foreach("olsrd", "LoadPlugin", function(s)
++ if s.library == "olsrd_nameservice.so.0.3" then
++ local services_file=s.services_file
++ if services_file and fs.access(services_file) then
++ has_services = true
++ rawdata = fs.readfile(s.services_file)
++ else
++ services_file="/var/run/services_olsr"
++ if fs.access(services_file) then
++ has_services = true
++ rawdata = fs.readfile(services_file)
++ end
++ end
++ services_file=services_file..".ipv6"
++ if services_file and fs.access(services_file) then
++ has_services = true
++ rawdata6 = fs.readfile(services_file)
++ else
++ services_file="/var/run/services_olsr.ipv6"
++ if fs.access(services_file) then
++ has_services = true
++ rawdata6 = fs.readfile(services_file)
++ end
++ end
++ if rawdata and #rawdata ~= 0 then
++ services_file_empty = nil
++ end
++ if rawdata6 and #rawdata6 ~= 0 then
++ services_file_empty = nil
++ end
++ end
++end)
++
++
++if not has_services or services_file_empty then
++%>
++ <%+header%>
++ <br />
++ <%:No services can be shown, because olsrd is not running or the olsrd-nameservice Plugin is not loaded.%>
++ <%+footer%>
++<%
++ return
++end
++
++function fetch_services()
++ local tables = {}
++ if rawdata and #rawdata ~= 0 then
++ tables = utl.split(utl.trim(rawdata), "\n", nil, true)
++ -- remove first 3 lines
++ for i = 1,3 do
++ table.remove(tables,1)
++ end
++ end
++ local tables6 = {}
++ if rawdata6 and #rawdata6 ~= 0 then
++ tables6 = utl.split(utl.trim(rawdata6), "\n", nil, true)
++ -- remove first 3 lines
++ for i = 1,3 do
++ table.remove(tables6,1)
++ end
++ end
++
++ -- store last line in last_update and remove it, then remove another empty line at the end
++ last_update=table.remove(tables)
++ table.remove(tables)
++ last_update=table.remove(tables6)
++ table.remove(tables6)
++ for k, v in ipairs(tables6) do
++ table.insert(tables, v)
++ end
++ return tables
++end
++local services = fetch_services()
++
++if luci.http.formvalue("status") == "1" then
++ local rv = {}
++ for k, line in ipairs(services) do
++ local field = utl.split(line, "[#|]", split, true)
++ local origin_lnk = ip.IPv6(pcdata(field[4]))
++ local origin_link = ""
++ if origin_lnk and origin_lnk:is6() then
++ origin_link = "["..origin_lnk:string().."]"
++ else
++ origin_link = pcdata(field[4])
++ end
++ local url, proto, descr, origin = pcdata(field[1]), pcdata(field[2]), utl.trim(pcdata(field[3])), pcdata(field[4])
++ rv[#rv+1] = {
++ url = url,
++ proto = proto,
++ origin = origin,
++ origin_link = origin_link,
++ descr = descr,
++ }
++ end
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++ return
++end
++
++%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++
++ XHR.poll(10 , '<%=REQUEST_URI%>', { status: 1 },
++ function(x, info)
++ {
++ var tbody = document.getElementById('olsr_services');
++ if (tbody)
++ {
++ var s = '';
++ for (var idx = 0; idx < info.length; idx++)
++ {
++ 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>',
++ service.url, service.descr, service.proto, service.origin_link, service.origin || '?'
++ );
++ }
++ tbody.innerHTML = s;
++ }
++ }
++ );
++//]]></script>
++
++
++
++
++ <h2 name="content"><%:Services%></h2>
++
++ <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">
++ <%
++ for k, line in ipairs(services) do
++ local field = {}
++ -- split line at # and |, 1=url, 2=proto, 3=description, 4=source
++ local field = utl.split(line, "[#|]", split, true)
++ local origin_lnk = ip.IPv6(pcdata(field[4]))
++ local origin_link
++ if origin_lnk and origin_lnk:is6() then
++ origin_link = "["..origin_lnk:string().."]"
++ else
++ origin_link = pcdata(field[4])
++ 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>
++ <% i = ((i % 2) + 1)
++ end %>
++ </tbody>
++ </table>
++ <br />
++ <%=last_update%>
++ </fieldset>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/Makefile b/feeds/luci/applications/luci-app-olsr-viz/Makefile
+new file mode 100644
+index 0000000..e1a1185
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr-viz/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=OLSR Visualisation
++LUCI_DEPENDS:=+luci-app-olsr +olsrd +olsrd-mod-txtinfo
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/olsr-viz.sh b/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/olsr-viz.sh
+new file mode 100755
+index 0000000..e33c632
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/olsr-viz.sh
+@@ -0,0 +1,40 @@
++#!/bin/sh
++echo Content-type: text/html
++echo
++
++cat << EOF
++<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
++var css=document.styleSheets[0];
++if (null!=css.insertRule) {
++css.insertRule(".label {color:black;background-color:white}", css.cssRules.length);
++}
++else {
++css.addRule(".label", "color:black");
++css.addRule(".label", "background-color:white");
++}
++</SCRIPT>
++<SCRIPT SRC="/luci-static/resources/olsr-viz.js" LANGUAGE="JavaScript1.2" TYPE="text/javascript"></SCRIPT>
++<DIV ID="main"
++STYLE="width: 100%; height: 93%; border: 1px solid #ccc; margin-left:auto; margin-right:auto; text-align:center; overflow: scroll">
++<DIV ID="edges" STYLE="width: 1px; height: 1px; position: relative; z-index:2"></DIV>
++<DIV ID="nodes" STYLE="width: 1px; height: 1px; position: relative; z-index:4"></DIV>
++</DIV>
++<DIV STYLE="z-index:99">
++<FORM ACTION="">
++<P><B TITLE="Bestimmt die Vergrößerungsstufe.">Zoom</B>&#160;<A HREF="javascript:set_scale(scale+0.1)">+</A>&#160;<A HREF="javascript:set_scale(scale-0.1)">&ndash;</A>&#160;<INPUT ID="zoom" NAME="zoom" TYPE="text" VALUE="2.0" SIZE="5" ONCHANGE="set_scale()">&#160;
++| &#160;<B TITLE="Beschränkt die Anzeige auf eine maximale Hop-Entfernung.">Metrik</B>&#160;<A HREF="javascript:set_maxmetric(maxmetric+1)">+</A>&#160;<A HREF="javascript:if(0<maxmetric)set_maxmetric(maxmetric-1)">&ndash;</A>&#160;<INPUT ID="maxmetric" NAME="maxmetric" TYPE="text" VALUE="3" SIZE="4" ONCHANGE="set_maxmetric(this.value)">&#160;
++| &#160;<B TITLE="Schaltet die automatischen Layout-Optimierung ein.">Optimierung</B><INPUT ID="auto_declump" NAME="auto_declump" TYPE="checkbox" ONCHANGE="set_autodeclump(this.checked)" CHECKED="CHECKED">&#160;
++| &#160;<B TITLE="Zeige Hostnamen an.">Hostnamen</B><INPUT ID="show_hostnames" NAME="show_hostnames" TYPE="checkbox" ONCHANGE="set_showdesc(this.checked)" CHECKED="CHECKED">&#160;
++| &#160;<A HREF="javascript:viz_save()" TITLE="Speichert die aktuellen Einstellungen in einem Cookie.">Speichern</A>&#160;
++| &#160;<A HREF="javascript:viz_reset()" TITLE="Startet das Viz-Skriptprogramm neu.">Zur&uuml;cksetzen</A></P>
++</FORM></DIV>
++<SPAN ID="debug" STYLE="visibility:hidden;"></SPAN>
++<IFRAME ID="RSIFrame" NAME="RSIFrame" STYLE="border:0px; width:0px; height:0px; visibility:hidden;">
++</IFRAME>
++<SCRIPT LANGUAGE="JavaScript1.2" TYPE="text/javascript">
++
++viz_setup("RSIFrame","main","nodes","edges");
++viz_update();
++
++</SCRIPT>
++EOF
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/vizdata.sh b/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/vizdata.sh
+new file mode 100755
+index 0000000..5a74f2b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/vizdata.sh
+@@ -0,0 +1,48 @@
++#!/bin/sh
++echo Content-type: text/html
++echo
++
++cat<<EOF
++<HTML>
++<HEAD>
++ <TITLE>OLSR-VIZ Data</TITLE>
++ <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type">
++ <META CONTENT="no-cache" HTTP-EQUIV="cache-control">
++</HEAD>
++<BODY>
++
++<script langauge='JavaScript1.2' type='text/javascript'>
++EOF
++
++# sed + txtinfo plugin
++re_ip='[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}'
++re_sep='[[:space:]]\{1,\}'
++re_nosep='[^[:space:]]\{1,\}'
++wget http://127.0.0.1:2006/all -qO - | sed -n "
++/^Table: Links$/,/^$/ {
++s# # - #g
++s#\($re_ip\)$re_sep\($re_ip\)\($re_sep$re_nosep\)\{3\}$re_sep\($re_nosep\)#parent.touch_edge(parent.touch_node('\1').set_metric(1).update(),parent.touch_node('\2').set_metric(1).update(),'\4');#p
++}
++/^Table: Topology$/,/^$/ {
++s#\($re_ip\)$re_sep\($re_ip\)\($re_sep$re_nosep\)\{2\}$re_sep\($re_nosep\)#parent.touch_edge(parent.touch_node('\1').update(),parent.touch_node('\2').update(),'\4');#p
++}
++/^Table: HNA$/,/^$/ {
++s#\($re_ip\)/\([0-9]\{1,\}\)$re_sep\($re_ip\)#parent.touch_hna(parent.touch_node('\3'),'\1','\2');#p
++}
++/^Table: Routes$/,/^$/ {
++s#\($re_ip\)/32$re_sep$re_nosep$re_sep\($re_nosep\).*#parent.touch_node('\1').set_metric('\2').update();#p
++}
++"
++
++hosts=$(uci show olsrd|grep hosts_file|cut -d "=" -f 2)
++if [ -n $hosts ]; then
++sed -n "
++s#\($re_ip\)$re_sep\($re_nosep\)$re_sep.*#parent.touch_node('\1').set_desc('\2');#p
++" < $hosts
++fi
++
++cat<<EOF
++ parent.viz_callback();
++</script>
++</BODY></HTML>
++EOF
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz.js b/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz.js
+new file mode 100644
+index 0000000..49435a4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz.js
+@@ -0,0 +1,818 @@
++/*
++Copyright (c) 2006, Lorenz Schori <lo@znerol.ch>
++All rights reserved (Naja: Ich hab' trotzdem was geaendert. Sven-Ola). (Naja:
++diese Rechte garantiert dir die BSD-Lizenz ja ausdrücklich. Lorenz)
++
++Redistribution and use in source and binary forms, with or without
++modification, are permitted provided that the following conditions are met:
++
++- Redistributions of source code must retain the above copyright notice, this
++ list of conditions and the following disclaimer.
++- Redistributions in binary form must reproduce the above copyright notice,
++ this list of conditions and the following disclaimer in the documentation
++ and/or other materials provided with the distribution.
++- Neither the name of the <ORGANIZATION> nor the names of its contributors may
++ be used to endorse or promote products derived from this software without
++ specific prior written permission.
++
++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
++AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
++FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
++SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
++CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
++OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++
++OLSR-Viz is inspired by Wi-viz: http://wiviz.natetrue.com
++
++Changes:
++2007-10-04: Added hostname display option -- Stefan Katerkamp <stefan@katerkamp.de>.
++2007-10-04: Optimized display by moving presentation css out of js -- lo
++2010-12-11: Changed some paths to make it work with Kamikaze and Luci -- soma
++*/
++
++var cgi_url = "/cgi-bin/vizdata.sh";
++
++var maxmetric = 3;
++var iconvariant = "-mini";
++var nodes = new Array();
++var ncount = 0;
++var newnodes = new Array();
++var edges = new Array();
++var iel = 220; // ideal edge length
++var optsize = 10; // boundingbox around nodes
++
++var vwidth = 0;
++var vheight = 0;
++
++var xoff = 0;
++var yoff = 0;
++var scale = 1.0;
++
++var idle_timeout = 15;
++var erase_timeout = 60;
++var dcl_timeout = 250;
++var dcllow_timeout = 500;
++var auto_declump = true;
++var showdesc = true;
++var auto_save = 1;
++var now_secs = 5;
++
++// dom elements
++var IFrameObj;
++var maindiv;
++var nodediv;
++var edgediv;
++
++/******* CALL TO SERVER ********/
++function callToServer(URL) {
++ var IFrameDoc;
++
++ if (IFrameObj.document) {
++ // For IE5 + opera
++ IFrameDoc = IFrameObj.document;
++ }
++ else if (IFrameObj.contentDocument) {
++ // For NS6
++ IFrameDoc = IFrameObj.contentDocument;
++ }
++ else if (IFrameObj.contentWindow) {
++ // For IE5.5 and IE6
++ IFrameDoc = IFrameObj.contentWindow.document;
++ }
++ else {
++ // opera? hmmmm
++ return true;
++ }
++
++ IFrameDoc.location.replace(URL);
++ return false;
++}
++
++
++/******** EDGE CLASS ********/
++function edge(n1,n2){
++ this.getHTML = function()
++ {
++ var nh = "";
++
++ if(this.n1.metric > maxmetric || this.n2.metric > maxmetric) {
++ return "";
++ }
++
++ x = this.n1.x*scale;
++ y = this.n1.y*scale;
++ dx = this.n2.x*scale - x;
++ dy = this.n2.y*scale - y;
++
++ x += xoff*scale + 75;
++ y += yoff*scale + 15;
++
++ imgtag = "<img src='/luci-static/resources/olsr-viz/dot_"
++ if (this.etx > 0 && this.etx < 2) {
++ imgtag += "good.gif'";
++ }
++ else if(this.etx > 2 && this.etx < 5) {
++ imgtag += "ok.gif'";
++ }
++ else if(this.etx > 5 && this.etx < 10) {
++ imgtag += "weak.gif'";
++ }
++ else {
++ imgtag += "down.gif'";
++ }
++ imgtag += " alt='ETX: " + this.etx + "' title='ETX: " + this.etx + "' ";
++
++ d = Math.sqrt(dx*dx+dy*dy);
++
++ for (j = 0; j < d; j += 15) {
++ nh += imgtag + "style='top:"
++ + parseInt(y+dy * j / d) + "px; left:"
++ + parseInt(x+dx * j / d) + "px; "
++ + "width: 4px; height: 4px; position: absolute; z-index: 2' >";
++ }
++
++ nh += "<div style='top:"
++ + parseInt(y+dy * 0.5 - 5) + "px; left:"
++ + parseInt(x+dx * 0.5 - 24) + "px; "
++ + "position: absolute; z-index: 3; width: 48px; text-align: center;' >"
++ + "<span class='label etx' >" + this.etx + "</span></div>";
++
++ return nh;
++ }
++
++ this.isIdle = function()
++ {
++ return (now_secs - this.lastseen > idle_timeout);
++ }
++
++ this.isDead = function()
++ {
++ return (now_secs - this.lastseen > erase_timeout);
++ }
++
++ this.cleanup = function()
++ {
++ if(this.n1 && this.n1.weight) {
++ this.n1.weight--;
++ }
++ if(this.n2 && this.n2.weight) {
++ this.n2.weight--;
++ }
++ if(this.n1 && this.n2) {
++ delete this.n1.edges[n2.ip];
++ delete this.n2.edges[n1.ip];
++ }
++ }
++
++ this.n1 = n1;
++ this.n2 = n2;
++
++ // setup edges within node objects
++ this.n1.weight++;
++ this.n1.edges[n2.ip] = this;
++ this.n2.weight++;
++ this.n2.edges[n1.ip] = this;
++
++ return this;
++}
++
++function getEdgeKey(ip1,ip2)
++{
++ key = "";
++ if(ip1 > ip2) {
++ key = ip2 + "-" + ip1;
++ }
++ else {
++ key = ip1 + "-" + ip2;
++ }
++ return key;
++}
++
++function touch_edge(n1,n2,etx)
++{
++ var key = getEdgeKey(n1.ip,n2.ip);
++ var e = edges[key];
++ if(!e) {
++ e = new edge(n1,n2);
++ edges[key] = e;
++ }
++ e.etx = etx;
++ e.lastseen = now_secs;
++ return e;
++}
++
++/******** NODE CLASS ********/
++function node(ip) {
++ this.getHTML = function()
++ {
++ var nh;
++
++ if(this.metric > maxmetric) {
++ return "";
++ }
++ var igw = 0;
++ for(h in this.hna) {
++ if(h == "0.0.0.0") {
++ igw = 1;
++ break;
++ }
++ }
++ nh =
++ "<div id='node_" + this.ip + "' onmousedown='dragstart(this)' style="
++ + "'top: " + parseInt((this.y+yoff)*scale) + "px; "
++ + "left: " + parseInt((this.x+xoff)*scale) + "px; "
++ + "width: 150px; height: 1px; z-index: 4; "
++ + "position: absolute; background-color: transparent;' >"
++ + "<div><img src='/luci-static/resources/olsr-viz/node"+(igw ? "-hna" : "")+iconvariant + ".gif'"
++ + " alt='node " + this.ip + "' style='border: none;'><br>"
++ + "<a href='http://" + this.ip + "/'>"
++ + "<span class='label ip'>" + this.ip + "</span></a>"
++ + (showdesc && this.desc != "" ?
++ "<br><span class='label desc'>" + this.desc + "</span>" : "")
++ + "</div></div>";
++ return nh;
++ }
++
++ this.isIdle = function()
++ {
++ return (now_secs - this.lastseen > idle_timeout);
++ }
++
++ this.isDead = function()
++ {
++ return (now_secs - this.lastseen > erase_timeout);
++ }
++
++ this.cleanup = function()
++ {
++ ncount--;
++ }
++
++ this.set_metric = function(metric) {
++ this.metric = metric;
++ return this;
++ }
++
++ this.set_desc = function(desc) {
++ this.desc = desc
++ return this;
++ }
++
++ this.update = function() {
++ this.lastseen = now_secs;
++ return this;
++ }
++
++ this.ip = ip;
++ this.x = 0;
++ this.y = 0;
++ this.dx_last=0;
++ this.dy_last=0;
++ this.placed = false;
++ this.weight = 0;
++ this.edges = new Array();
++ this.hna = new Array();
++ this.pinned = false;
++ this.metric = 999;
++ this.desc = "";
++
++ ncount++;
++ return this;
++}
++
++function touch_node(ip) {
++ n = nodes[ip];
++ if(!n) {
++ n = new node(ip);
++ nodes[ip] = n;
++ // newnodes.push(n);
++ // push and pop not supported in old ie. shit.
++ newnodes[newnodes.length] = n;
++ }
++ return n;
++}
++
++function place_new_nodes() {
++ var nc = 0;
++ for(i = 0;i<newnodes.length;i++){
++ n = newnodes[i];
++ if(n.placed){continue;}
++ if(sp = getCookie("node_"+n.ip)) {
++ xy = sp.split("x");
++ debug_writeln("sp: "+sp+" xy[0]: "+xy[0]+" xy[1]: "+xy[1]);
++ n.x = parseFloat(xy[0]);
++ n.y = parseFloat(xy[1]);
++ }
++ else if(n.weight>1){
++ // see if we find allredy placed nodes
++ ox=0,oy=0;dx=0,dy=0;c=0;
++ for(e in n.edges){
++ if(nodes[e] && nodes[e].placed){
++ if(!ox && !oy) {
++ ox = nodes[e].x;
++ oy = nodes[e].y;
++ }
++ else {
++ dx += nodes[e].x - ox;
++ dy += nodes[e].y - oy;
++ }
++ c++;
++ }
++ }
++ if(c>0) {
++ n.x = ox + dx/c + Math.random()*iel/2-iel/4;
++ n.y = oy + dy/c + Math.random()*iel/2-iel/4;
++ }
++ }
++ else {
++ // beginn somewhere
++ n.x = Math.random()*400;
++ n.y = Math.random()*400;
++ }
++ n.placed = true;
++ nc++;
++ }
++ newnodes.length=0;
++ return nc;
++}
++
++/******** HNA CLASS ********/
++function hna(gw,net,mask) {
++ this.gw = gw;
++ this.net = net;
++ this.mask = mask;
++ return this;
++}
++
++function touch_hna(node,net,mask) {
++ h = node.hna[net];
++ if(!h) {
++ h = new hna(node.ip,net,mask);
++ node.hna[net] = h;
++ }
++
++ h.lastseen = now_secs;
++ return h;
++}
++
++/******** VIZ SETUP AND SETTINGS ********/
++function viz_setup(iframeid,maindivid,nodedivid,edgedivid) {
++ // assign a reference to the
++ // object to our global variable IFrameObj.
++ IFrameObj=document.getElementById(iframeid);
++ if (document.frames) {
++ // this is for IE5 Mac, because it will only
++ // allow access to the document object
++ // of the IFrame if we access it through
++ // the document.frames array
++ IFrameObj = document.frames[iframeid];
++ }
++
++ draginit();
++
++ maindiv=document.getElementById(maindivid);
++ nodediv=document.getElementById(nodedivid);
++ edgediv=document.getElementById(edgedivid);
++
++ // autosave on exit?
++ if((autosave = getCookie("prefs_autosave"))) {
++ auto_save = parseInt(autosave);
++ }
++ viz_autosave(auto_save);
++
++ // maximum metric of surrounding nodes
++ if(mmx = getCookie("prefs_maxmetric")) {
++ set_maxmetric(mmx,true,true);
++ }
++
++ // scale of view
++ if((savescale = getCookie("prefs_scale")) &&
++ (savescale = parseFloat(savescale))) {
++ set_scale(savescale,true);
++ }
++
++ // scroll - FIXME
++ /*
++ if(val = getCookie("prefs_innerview")) {
++ iv = val.split("x");
++ if (iv[0] && (iv[0] = parseInt(iv[0])) &&
++ iv[1] && (iv[2] = parseInt(iv[2])) &&
++ iv[3] && (iv[3] = parseInt(iv[3])) &&
++ iv[4] && (iv[4] = parseInt(iv[4])))
++ {
++ maindiv.scrollLeft = iv[0] + "px";
++ maindiv.scrollHeight = iv[1] + "px";
++ }
++ }
++ */
++}
++
++function viz_save()
++{
++ // let cookie survive a month
++ exp = new Date();
++ exp.setTime(exp.getTime() + 2592000000);
++ // save node positions
++ for(ip in nodes)
++ {
++ if(nodes[ip].metric > maxmetric) {
++ continue;
++ }
++ setCookie("node_"+ip,nodes[ip].x+"x"+nodes[ip].y,exp);
++ }
++
++ // save maxmetric
++ setCookie("prefs_maxmetric",maxmetric,exp);
++
++ // save zooming
++ setCookie("prefs_scale",scale,exp);
++
++ // save scroll - FIXME
++ setCookie("prefs_innerview",
++ parseInt(maindiv.scrollLeft)+"x"+parseInt(maindiv.scrollTop)+"x"+
++ parseInt(vwidth*scale)+"x"+parseInt(vheight*scale),exp);
++}
++
++function viz_autosave(autosave)
++{
++ auto_save = autosave;
++ if(auto_save) {
++ document.body.onunload=viz_save;
++ }
++ else {
++ deleteCookie("prefs_autosave");
++ }
++}
++
++function viz_reset()
++{
++ deleteAllCookies();
++ for(ip in nodes) {
++ delete nodes[ip];
++ }
++ for(e in edges) {
++ delete edges[e];
++ }
++ viz_update();
++}
++
++var updateTimer = 0;
++function viz_update() {
++ if (updateTimer) {
++ clearTimeout(updateTimer);
++ }
++ now_secs = new Date().getTime()/1000;
++ callToServer(cgi_url);
++}
++
++function viz_callback() {
++ if (updateTimer) {
++ clearTimeout(updateTimer);
++ }
++
++ if(place_new_nodes() > 0 && auto_declump) {
++ declump();
++ }
++ refresh();
++ updateTimer = setTimeout('viz_update()', 5000);
++}
++
++var refresh_running = false;
++function refresh() {
++ if(refresh_running) {
++ return;
++ }
++ refresh_running = true;
++
++ var nh = "";
++
++ // refresh nodes
++ nh = "";
++ for (var n in nodes) {
++ if(nodes[n].isDead()) {
++ nodes[n].cleanup();
++ delete nodes[n];
++ }
++ else {
++ nh += nodes[n].getHTML();
++ }
++ }
++ nodediv.innerHTML = nh;
++
++ // refresh edges
++
++ nh = "";
++ for (var e in edges) {
++ if(edges[e].isDead()) {
++ edges[e].cleanup();
++ delete edges[e];
++ }
++ else {
++ nh += edges[e].getHTML();
++ }
++ }
++ edgediv.innerHTML = nh;
++ refresh_running = false;
++}
++
++function set_showdesc(doit)
++{
++ showdesc = doit;
++ if(!noupdate) refresh();
++}
++
++function set_autodeclump(doit)
++{
++ auto_declump = doit;
++ if(doit) {
++ declump();
++ }
++ else {
++ clearTimeout(dclTimer);
++ }
++}
++
++function set_scale(inscale,noupdate)
++{
++ if(!inscale) {
++ inscale = parseFloat(document.getElementById("zoom").value/2);
++ }
++ scale = Math.round(inscale*100)/100;
++ if(!scale || scale<0.1) {
++ scale = 0.1;
++ }
++ document.getElementById("zoom").value = scale*2;
++ if(!noupdate) refresh();
++}
++
++function set_maxmetric(inmetric,noupdate,noconfirm)
++{
++ inmetric = parseInt(inmetric);
++ if(inmetric > 0 || !noconfirm || confirm("warning. setting the maximum metric to zero can lead to expensive calculations if you are connected to a network with many nodes. do you want to proceed?")) {
++ maxmetric = inmetric;
++ }
++ document.getElementById("maxmetric").value = maxmetric;
++ if(!noupdate) refresh();
++}
++
++// k = area / nodes
++function fr(x) {
++ return Math.pow((iel*iel)/x,2);
++}
++
++function fa(x) {
++ return Math.pow((x*x)/iel,2);
++}
++
++var dclTimer = 0;
++var declump_running = false;
++function declump(t) {
++ // clear declump timer
++ if(dclTimer) {
++ clearTimeout(dclTimer);
++ }
++ if(declump_running) {
++ return;
++ }
++ declump_running = true;
++
++ // nodes
++ nc = 0;
++ for (var ip1 in nodes) {
++ nodes[ip1].fr_x=0;
++ nodes[ip1].fr_y=0;
++ nodes[ip1].fa_x=0;
++ nodes[ip1].fa_y=0;
++ nodes[ip1].x_next = nodes[ip1].x;
++ nodes[ip1].y_next = nodes[ip1].y;
++ nodes[ip1].randdisplace = 0;
++ }
++ for (var ip1 in nodes) {
++ if(nodes[ip1].metric > maxmetric || nodes[ip1].pinned) {
++ continue;
++ }
++ for (ip2 in nodes) {
++ if (nodes[ip2].metric > maxmetric || ip1 == ip2) {
++ continue;
++ }
++ dx = (nodes[ip1].x_next - nodes[ip2].x_next);
++ dy = (nodes[ip1].y_next - nodes[ip2].y_next);
++ d = Math.sqrt(dx*dx+dy*dy);
++ d = Math.max(d-optsize,(d+optsize)/optsize);
++
++ nodes[ip1].fr_x += (dx/d) * fr(d);
++ nodes[ip1].fr_y += (dy/d) * fr(d);
++ }
++
++ dx = nodes[ip1].fr_x;
++ dy = nodes[ip1].fr_y;
++ d = Math.sqrt(dx*dx+dy*dy);
++ md = Math.min(d,iel/nodes[ip1].weight);
++ nodes[ip1].x_next += (dx / d) * md;
++ nodes[ip1].y_next += (dy / d) * md;
++ nc++;
++ }
++
++ // edges
++ ec = 0;
++ for (var e in edges) {
++ if (!edges[e].n1 || !edges[e].n2 ||
++ edges[e].n1.metric > maxmetric || edges[e].n2.metric > maxmetric) {
++ continue;
++ }
++ dx = (edges[e].n1.x_next - edges[e].n2.x_next);
++ dy = (edges[e].n1.y_next - edges[e].n2.y_next);
++ d = Math.sqrt(dx*dx+dy*dy);
++// d = Math.max(d-optsize,(d+optsize)/optsize);
++
++ edges[e].n1.fa_x -= (dx/d) * fa(d);
++ edges[e].n1.fa_y -= (dy/d) * fa(d);
++ edges[e].n2.fa_x += (dx/d) * fa(d);
++ edges[e].n2.fa_y += (dy/d) * fa(d);
++ ec++;
++ }
++
++ // displacement
++ xmin=-20;ymin=-20;xmax=20;ymax=20;dsum=0;
++ for (var ip in nodes) {
++ if(nodes[ip].metric > maxmetric || nodes[ip].pinned) {
++ continue;
++ }
++
++ dx = nodes[ip].fa_x;
++ dy = nodes[ip].fa_y;
++ d = Math.sqrt(dx*dx+dy*dy);
++ dx = (dx / d) * Math.min(d,iel/nodes[ip].weight) * 0.75 + nodes[ip].dx_last * 0.25;
++ dy = (dy / d) * Math.min(d,iel/nodes[ip].weight) * 0.75 + nodes[ip].dy_last * 0.25;
++
++ nodes[ip].dx_last = dx;
++ nodes[ip].dy_last = dy;
++ nodes[ip].x_next += dx;
++ nodes[ip].y_next += dy;
++
++ if(!nodes[ip].x_next || !nodes[ip].y_next) {
++ continue;
++ }
++
++ dx = (nodes[ip].x - nodes[ip].x_next);
++ dy = (nodes[ip].y - nodes[ip].y_next);
++ dsum += Math.sqrt(dx*dx+dy*dy);
++
++ nodes[ip].x = nodes[ip].x_next;
++ nodes[ip].y = nodes[ip].y_next;
++
++ xmin = Math.min(xmin,nodes[ip].x);
++ xmax = Math.max(xmax,nodes[ip].x);
++ ymin = Math.min(ymin,nodes[ip].y);
++ ymax = Math.max(ymax,nodes[ip].y);
++ }
++ vwidth=(xmax-xmin);
++ vheight=(ymax-ymin);
++
++ xoff=-xmin;
++ yoff=-ymin;
++ /*
++ document.getElementById('debug').innerHTML = "<br>" +
++ "offset: " + xoff + "x" + yoff + " dsum: " + dsum + "<br>" +
++ "nc: " + nc + " ec: " + ec + "xmax: " + xmax + " xmin: " + xmin + "<br>" +
++ "optsize: " + optsize + "<br>";
++ */
++ refresh();
++ if(auto_declump) {
++ dclTimer = setTimeout("declump()", dsum>ncount ? dcl_timeout : dcllow_timeout );
++ }
++ declump_running = false;
++}
++
++//Das Objekt, das gerade bewegt wird.
++var dragip = null;
++
++// Position, an der das Objekt angeklickt wurde.
++var dragx = 0;
++var dragy = 0;
++
++// Mausposition
++var posx = 0;
++var posy = 0;
++
++function draginit() {
++ // Initialisierung der ãberwachung der Events
++
++ document.onmousemove = drag;
++ document.onmouseup = dragstop;
++}
++
++
++function dragstart(element) {
++ //Wird aufgerufen, wenn ein Objekt bewegt werden soll.
++ dragip = element.id.split("_")[1];
++ dragx = posx - element.offsetLeft;
++ dragy = posy - element.offsetTop;
++
++ n = nodes[dragip];
++ if(n) {
++ n.pinned = true;
++ }
++}
++
++
++function dragstop() {
++ //Wird aufgerufen, wenn ein Objekt nicht mehr bewegt werden soll.
++
++ n = nodes[dragip];
++ if(n) {
++ n.pinned = false;
++ }
++ refresh();
++ dragip=null;
++}
++
++
++function drag(ereignis) {
++ //Wird aufgerufen, wenn die Maus bewegt wird und bewegt bei Bedarf das Objekt.
++
++ posx = document.all ? window.event.clientX : ereignis.pageX;
++ posy = document.all ? window.event.clientY : ereignis.pageY;
++ if(dragip != null) {
++ n = nodes[dragip];
++ if(n) {
++ n.x = (posx - dragx)/scale - xoff;
++ n.y = (posy - dragy)/scale - yoff;
++ }
++ e = document.getElementById('node_'+dragip);
++ e.style.left = parseInt((n.x+xoff)*scale) + "px";
++ e.style.top = parseInt((n.y+yoff)*scale) + "px";
++ }
++}
++
++function debug_writeln(line)
++{
++ document.getElementById('debug').innerHTML = line + "<br>" + document.getElementById('debug').innerHTML;
++}
++
++/**
++ * Sets a Cookie with the given name and value.
++ *
++ * name Name of the cookie
++ * value Value of the cookie
++ * [expires] Expiration date of the cookie (default: end of current session)
++ * [path] Path where the cookie is valid (default: path of calling document)
++ * [domain] Domain where the cookie is valid
++ * (default: domain of calling document)
++ * [secure] Boolean value indicating if the cookie transmission requires a
++ * secure transmission
++ */
++
++function setCookie(name, value, expires, path, domain, secure) {
++ document.cookie= name + "=" + escape(value) +
++ ((expires) ? "; expires=" + expires.toGMTString() : "") +
++ ((path) ? "; path=" + path : "") +
++ ((domain) ? "; domain=" + domain : "") +
++ ((secure) ? "; secure" : "");
++}
++
++/**
++ * Gets the value of the specified cookie.
++ *
++ * name Name of the desired cookie.
++ *
++ * Returns a string containing value of specified cookie,
++ * or null if cookie does not exist.
++ */
++
++function getCookie(name)
++{
++ var results = document.cookie.match ( name + '=(.*?)(;|$)' );
++ if (results) {
++ return unescape(results[1]);
++ }
++ return null;
++}
++
++/**
++ * Deletes the specified cookie.
++ *
++ * name name of the cookie
++ * [path] path of the cookie (must be same as path used to create cookie)
++ * [domain] domain of the cookie (must be same as domain used to create cookie)
++ */
++
++function deleteCookie(name, path, domain) {
++ if (getCookie(name)) {
++ document.cookie = name + "=" +
++ ((path) ? "; path=" + path : "") +
++ ((domain) ? "; domain=" + domain : "") +
++ "; expires=Thu, 01-Jan-70 00:00:01 GMT";
++ }
++}
++
++function deleteAllCookies() {
++ cookies = document.cookie.split("; ");
++ for(i=0;i<cookies.length;i++) {
++ deleteCookie(cookies[i].split("=")[0]);
++ }
++}
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/dot_down.gif b/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/dot_down.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..c4244202f70f8f59006199c341514e575d9ef849
+GIT binary patch
+literal 46
+ycmZ?wbhEHbWMN=oXkcV`^XAR}|Nj+#vM@3*Ff!;c00Bsbfr*tTVfpkx25SH{NDG7j
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/dot_good.gif b/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/dot_good.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..3a2be32b42746136e0852cf4bb7d9eeaa8655d0b
+GIT binary patch
+literal 46
+ycmZ?wbhEHbWMN=oXkcXUJ>d2K|9{1wEQ|~cj0`#qKmd|qU}EJ-SUx?F!5RPus|ptY
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/dot_ok.gif b/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/dot_ok.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..b5dd48da75cacf0eb7282e4efba1e344363093c8
+GIT binary patch
+literal 46
+ycmZ?wbhEHbWMN=oXkcXcdouk0|Nn|VSr{1@7#VaJfB+=Jz{JXvuzY$TgEasl4hr1>
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/dot_weak.gif b/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/dot_weak.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..36542c4d62da92cb85819ad84e7d221b402e44f6
+GIT binary patch
+literal 46
+ycmZ?wbhEHbWMN=oXkcVGbLPzd|Nj+#vM@3*Ff!;c00Bsbfr*tTVfpkx25SH*NDCwY
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/node-hna-mini.gif b/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/node-hna-mini.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..529b3d7e967d9fbbfc7c1f6144fb3d5e321a2e0e
+GIT binary patch
+literal 1192
+zcmV;Z1Xue<Nk%w1VHf}w0Qdg@F)=blLq$SCLlYAd009C1{{H>_{r2|u`uh4mK0x*L
+z^~A))y}i9FGBtR2caf2i!otEeHaPe9_wVoTN=HfGS42riNp(q3hDcSLOi(#FJNWqc
+zz-wjS-`_SiIBIBVH8eKVUSDr-a3v-m${rSWV`$4(MmIM*J25%vI47Q-o>xpy-##*j
+zhKNf`O{1ctmozTw<K$mmUh3=X*4EeV?(WIS$==@HbWcpmJul@$IZH}QR#a9qG&(~=
+zMKv`yt*)-XQ&5FQNQHTP&dJW<I4|HoFXuff)jBNPG%MyeCE6n$o}i%4M>>g)kh4)$
+z*tNUdLqh56>%lKDYBxP?Yi*D)HQhu$U|?Y2b#qQlPkeuXuQe<5@bJ!MWBvX9WMgBf
+zsHpMi>f++!JvBg_SXhWtSA&Cu)Ya8ZOiWKtPwP}x$jHbpFDpkXK};)0^Yin5e}8mL
+zPs=+j=0P)}p`t-TLk0>7NJ&b1dVA?YEo*6MGc`ChH8n#*MA%|h+1S~(wziLskK|@>
+zVo+1XjEaI{apR?-w=FHOWoEx^Y{$sQ`ReS)$H?M8E8pVd=Q%IY(bCm2Dq2@t-ZCX>
+zbbJdA96TQ&dV74DL`1lGenCG%$6smp`1thc>ClCL=tw#A^YleMKUO9z&0J7NMo8%B
+z=pG#<+*4Y6X>4dMF~~0~bTlz+ZEtUIaJyq>(oH|RP)hOe@Z;a%W@cwmP*GJ=Q!z3u
+zGBY$|JVD_!Dfsj9{QUg)^7G~1-*YuX-$+4na&X<<-RW9R-aI<0tE=Yb=F%-C;NakJ
+zW^0Oyi{Ws3?BwPi9v_QaWZ6zeky>WFyt|B2Qr^eNg@}nvPEX}PEtr&==vP-aE;ukQ
+zFlT0HBPuPy!NK|Y`Px7$?aIq*YHRZH^2u&$eSLl7QcvbnPx|@#q%}0^>gwb}GR$RS
+zy*fR%GA}_uLcmK#wym!W3=EnxE?{0^d3kzPR#)gjEq8Wxh=_@Zh=@BnJLX?xH8eF#
+zN=*O%|NsC0A^8LW00930EC2ui02lxk000R80RIUbNO0g78wCmagX1qD!5a%43N)~w
+zfJA}F8eKF1!Q#bGfi4z+VBq4v3Cb?=Du%!$AQcx8;8S37(SwE#H_)13l0gfc2^FXj
+z*E3H^hX(*07+3&-gc`<7nF12WMx>(zCG<&mpaYvQ`96Tz6Ry=3Os?)l^9J<aj2&7^
+z1+Wl6K)+hHcubmC#X&G~Or&`Hhh;!B5E|UMOORlbA3HwqRFjdcM5-b1WLZ3;Edj0{
+z9`v2)5g`JF6@=uNF$C?^x^ao7oqOS;9squP8i>L{CfkJ!PrPJVHfSHJVNseCs>9Dg
+zng%FxWvcKlM7cHC%mIU>D~Y6U$CmtsK@*Q2H6iU*(E+7{SdkP*)UiN<&I&0_K`0&i
+zLZj0o4%R5)h&_53kpma<urkUo7`(v_C$X3i!$AIkbHx;Mz@W+{r;Kn10hYK?hBHtw
+z;>j+9{UgRRh)_`pHv|lDOB*6wL&Pjyq(~4mu#g~)6Wa*#KsUk|fYn94e4>aiZJG2>
+GKma@8=`Yg&
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/node-mini.gif b/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz/node-mini.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..4d8b7c94e08f07fba39e1c9b089cf82e3105be3d
+GIT binary patch
+literal 1194
+zcmV;b1XcS-Nk%w1VHf}w0Qdg@OJlA}OH4I4IYB~2E-^C{6B0v2Mm;}5Gd4H@0RaB~
+z{{8*^`uh6z_V)Gl^}@o!#Kgq-`1tqt_mPp2@9*zQOioKoO*KrARCK%F-{3PdH&t-L
+zFD@!}jJHE%upJ*DMMp|UM@m<Bzt7j{hKGogm7hXqvQcipPHDvb{r+ojZz?ue^7HuL
+z;pP1N{CatMh=++RFhub1@nUz6)YR5eakX%f!1D6)$;rv6r>QeADljlFG&DB8y}dU&
+zJtig}f|jsSW{X{5V~UH6c6WGSbFx5Eh(1-CjGDt{XK2>e*Y57_O;UAZc!ok>qB1v3
+zc89f6bGb)IO=@v`YievkSD8#?xre6APElB3U}0TdVogp^W@cwIH8#AvyQ-_J<mc|?
+z<>gIjwI(!TVR4V$;O9PDr(=M=>g((3>grK$zv%4qUx2-HlFCMAt6hG&RZ&&Q$;oDI
+zcir9HK|w{XvA0xISX5V93=9lTOind5H9tW^y}i9RI6H2O#-pO7d3Jd7^!HzVz>u21
+zS7V2so}OH9j`Z{N*x1>}$H;Di!N<tRZ-~mFo}XrXzGZ!>O>DMRT3(2ViCA^P(b3XU
+zUU7MRe7nWheSm;IPlsfEqV4hbZ-1!h=;+7F)yU1=QDJ;NJxEGPNl<R6t+>{3Z*OmM
+za87K#R&KKk4H;=@YFKl>h@Z+!UXXyH%vx!KH$`xBaBy;Rc6^)4cXf4SVPsKQW8mQ6
+z;^N@q;^HzfG9M>De|md0NP;myXnKE#J4b7+uCC+d>tKAtL_<aA=jTgnvR-twgM)-7
+zIBrf_cZi3Fa)_<K!NE6Ksb_n(`T6-}fVy~&xbgDze2%#5>*`T$zEf?ykB*P(?ejD<
+zIygK%E;&VVl+0aos*R0|M`y2Je7y7X^I&h3$jHf}p`vGNbou)G-rn9QC@5ESyLFPY
+zLPJJtY;Qh6L_$nqQBYEBXKM=y1ypdrcZaP{Pfsf{G`6<4JU~J=HaHp`DRYj$dU|^?
+zGd2JJ|NsC0A^8LW00930EC2ui02lxk000R80RIUbNN`}TI0Xs%6X!1>L39ut3S0m|
+zfkc6~5?x&Iz~aS2_bw`Uu;Ai93PUcs_`<*>qCyuLNOE9u(S(K$BXFT$k`D=-2_4kC
+zVX_Cmk`5c_YA{d%0|`sQbSf4M6Ans92};nDra=aBIbf)&6_1JvOqNX1@&XO$KQsZh
+zfG`k(7@Yv{;Mj>Iq#dAGyc$*W_%BO=4+wnh8F1i$J9YyMh{~hIoSZ4Y>d3H&i~zoV
+z2n1~Fqb*-PDOhY(devkGvkufaeLDB2!W{x#H0%h)<Vg%=hBQfIb;Z>z8;sbX8dQ!4
+z5exRXy$j;V+de<t+W0vmB1#QoR=}BuP(%aIi)Emkc$hRy&>IYDPOMTV=E#L-KpsIN
+zl|o4bT=bxD$~E(BU=09O7y--*y|j|dDC>ArgfIj7GeS6S0Fa3<yXf<SJPD*S#yDhL
+zvPm|95cba+(U<{?Ea@arfDRm#Qi3NfOrs(}U>xHNA>Sl{%>>QNu|QTAv48{=Ww>S1
+IKLG&%I|ZgZL;wH)
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/luasrc/controller/olsr-viz.lua b/feeds/luci/applications/luci-app-olsr-viz/luasrc/controller/olsr-viz.lua
+new file mode 100644
+index 0000000..672486c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr-viz/luasrc/controller/olsr-viz.lua
+@@ -0,0 +1,5 @@
++module "luci.controller.olsr-viz"
++
++function index()
++ entry({"admin", "status", "olsr", "olsr-viz"}, template("olsr-viz/olsr-viz"), _("OLSR-Viz"), 90)
++end
+diff --git a/feeds/luci/applications/luci-app-olsr-viz/luasrc/view/olsr-viz/olsr-viz.htm b/feeds/luci/applications/luci-app-olsr-viz/luasrc/view/olsr-viz/olsr-viz.htm
+new file mode 100644
+index 0000000..47bd884
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr-viz/luasrc/view/olsr-viz/olsr-viz.htm
+@@ -0,0 +1,10 @@
++<%+header%>
++<noscript>
++ <div class="warning">
++ <%:You need to allow javascript in your browser to show this page.%>
++ </div>
++</noscript>
++
++<iframe style="width:100%; height:640px; border:none" scrolling="no" src="/cgi-bin/olsr-viz.sh"></iframe>
++
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-olsr/Makefile b/feeds/luci/applications/luci-app-olsr/Makefile
+new file mode 100644
+index 0000000..93815a5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=OLSR configuration and status module
++LUCI_DEPENDS:=+olsrd +olsrd-mod-jsoninfo +luci-lib-luaneightbl +luci-lib-json
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-nodes.html b/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-nodes.html
+new file mode 120000
+index 0000000..80d235f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-nodes.html
+@@ -0,0 +1 @@
++cgi-bin-status.html
+\ No newline at end of file
+diff --git a/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-status.html b/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-status.html
+new file mode 100644
+index 0000000..0270f4a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-status.html
+@@ -0,0 +1,10 @@
++<?xml version="1.0" encoding="utf-8"?>
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
++<html xmlns="http://www.w3.org/1999/xhtml">
++<head>
++<meta http-equiv="refresh" content="0; URL=/cgi-bin/luci/freifunk/olsr/neighbors" />
++</head>
++<body style="background-color: black">
++<a style="color: white; text-decoration: none" href="/cgi-bin/luci/freifunk/olsr/neighbors">LuCI - Lua Configuration Interface</a>
++</body>
++</html>
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr.lua b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr.lua
+new file mode 100644
+index 0000000..cfadd9b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr.lua
+@@ -0,0 +1,424 @@
++module("luci.controller.olsr", package.seeall)
++
++local neigh_table = nil
++local ifaddr_table = nil
++
++function index()
++ local ipv4,ipv6
++ if nixio.fs.access("/etc/config/olsrd") then
++ ipv4 = 1
++ end
++ if nixio.fs.access("/etc/config/olsrd6") then
++ ipv6 = 1
++ end
++ if not ipv4 and not ipv6 then
++ return
++ end
++
++ require("luci.model.uci")
++ local uci = luci.model.uci.cursor_state()
++
++ uci:foreach("olsrd", "olsrd", function(s)
++ if s.SmartGateway and s.SmartGateway == "yes" then has_smartgw = true end
++ end)
++
++ local page = node("admin", "status", "olsr")
++ page.target = template("status-olsr/overview")
++ page.title = _("OLSR")
++ page.subindex = true
++
++ local page = node("admin", "status", "olsr", "json")
++ page.target = call("action_json")
++ page.title = nil
++ page.leaf = true
++
++ local page = node("admin", "status", "olsr", "neighbors")
++ page.target = call("action_neigh")
++ page.title = _("Neighbours")
++ page.subindex = true
++ page.order = 5
++
++ local page = node("admin", "status", "olsr", "routes")
++ page.target = call("action_routes")
++ page.title = _("Routes")
++ page.order = 10
++
++ local page = node("admin", "status", "olsr", "topology")
++ page.target = call("action_topology")
++ page.title = _("Topology")
++ page.order = 20
++
++ local page = node("admin", "status", "olsr", "hna")
++ page.target = call("action_hna")
++ page.title = _("HNA")
++ page.order = 30
++
++ local page = node("admin", "status", "olsr", "mid")
++ page.target = call("action_mid")
++ page.title = _("MID")
++ page.order = 50
++
++ if has_smartgw then
++ local page = node("admin", "status", "olsr", "smartgw")
++ page.target = call("action_smartgw")
++ page.title = _("SmartGW")
++ page.order = 60
++ end
++
++ local page = node("admin", "status", "olsr", "interfaces")
++ page.target = call("action_interfaces")
++ page.title = _("Interfaces")
++ page.order = 70
++
++ odsp = entry(
++ {"admin", "services", "olsrd", "display"},
++ cbi("olsr/olsrddisplay"), _("Display")
++ )
++
++end
++
++function action_json()
++ local http = require "luci.http"
++ local utl = require "luci.util"
++ local uci = require "luci.model.uci".cursor()
++ local jsonreq4
++ local jsonreq6
++
++ local v4_port = uci:get("olsrd", "olsrd_jsoninfo", "port") or 9090
++ local v6_port = uci:get("olsrd6", "olsrd_jsoninfo", "port") or 9090
++
++ jsonreq4 = utl.exec("(echo /status | nc 127.0.0.1 " .. v4_port .. ") 2>/dev/null" )
++ jsonreq6 = utl.exec("(echo /status | nc ::1 " .. v6_port .. ") 2>/dev/null")
++ http.prepare_content("application/json")
++ if not jsonreq4 or jsonreq4 == "" then
++ jsonreq4 = "{}"
++ end
++ if not jsonreq6 or jsonreq6 == "" then
++ jsonreq6 = "{}"
++ end
++ http.write('{"v4":' .. jsonreq4 .. ', "v6":' .. jsonreq6 .. '}')
++end
++
++
++local function local_mac_lookup(ipaddr)
++ local _, ifa, dev
++
++ ipaddr = tostring(ipaddr)
++
++ if not ifaddr_table then
++ ifaddr_table = nixio.getifaddrs()
++ end
++
++ -- ipaddr -> ifname
++ for _, ifa in ipairs(ifaddr_table) do
++ if ifa.addr == ipaddr then
++ dev = ifa.name
++ break
++ end
++ end
++
++ -- ifname -> macaddr
++ for _, ifa in ipairs(ifaddr_table) do
++ if ifa.name == dev and ifa.family == "packet" then
++ return ifa.addr
++ end
++ end
++end
++
++local function remote_mac_lookup(ipaddr)
++ local _, n
++
++ if not neigh_table then
++ neigh_table = luci.ip.neighbors()
++ end
++
++ for _, n in ipairs(neigh_table) do
++ if n.mac and n.dest and n.dest:equal(ipaddr) then
++ return n.mac
++ end
++ end
++end
++
++function action_neigh(json)
++ local data, has_v4, has_v6, error = fetch_jsoninfo('links')
++
++ if error then
++ return
++ end
++
++ local uci = require "luci.model.uci".cursor_state()
++ local resolve = uci:get("luci_olsr", "general", "resolve")
++ local ntm = require "luci.model.network".init()
++ local devices = ntm:get_wifidevs()
++ local sys = require "luci.sys"
++ local assoclist = {}
++ --local neightbl = require "neightbl"
++ local ntm = require "luci.model.network"
++ local ipc = require "luci.ip"
++ local nxo = require "nixio"
++ local defaultgw
++
++ ipc.routes({ family = 4, type = 1, dest_exact = "0.0.0.0/0" },
++ function(rt) defaultgw = rt.gw end)
++
++ local function compare(a,b)
++ if a.proto == b.proto then
++ return a.linkCost < b.linkCost
++ else
++ return a.proto < b.proto
++ end
++ end
++
++ for _, dev in ipairs(devices) do
++ for _, net in ipairs(dev:get_wifinets()) do
++ assoclist[#assoclist+1] = {}
++ assoclist[#assoclist]['ifname'] = net.iwdata.ifname
++ assoclist[#assoclist]['network'] = net.iwdata.network
++ assoclist[#assoclist]['device'] = net.iwdata.device
++ assoclist[#assoclist]['list'] = net.iwinfo.assoclist
++ end
++ end
++
++ for k, v in ipairs(data) do
++ local snr = 0
++ local signal = 0
++ local noise = 0
++ local mac = ""
++ local ip
++ local neihgt = {}
++
++ if resolve == "1" then
++ hostname = nixio.getnameinfo(v.remoteIP, nil, 100)
++ if hostname then
++ v.hostname = hostname
++ end
++ end
++
++ local interface = ntm:get_status_by_address(v.localIP)
++ local lmac = local_mac_lookup(v.localIP)
++ local rmac = remote_mac_lookup(v.remoteIP)
++
++ for _, val in ipairs(assoclist) do
++ if val.network == interface and val.list then
++ for assocmac, assot in pairs(val.list) do
++ assocmac = string.lower(assocmac or "")
++ if rmac == assocmac then
++ signal = tonumber(assot.signal)
++ noise = tonumber(assot.noise)
++ snr = (noise*-1) - (signal*-1)
++ end
++ end
++ end
++ end
++ if interface then
++ v.interface = interface
++ end
++ v.snr = snr
++ v.signal = signal
++ v.noise = noise
++ if rmac then
++ v.remoteMAC = rmac
++ end
++ if lmac then
++ v.localMAC = lmac
++ end
++
++ if defaultgw == v.remoteIP then
++ v.defaultgw = 1
++ end
++ end
++
++ table.sort(data, compare)
++ luci.template.render("status-olsr/neighbors", {links=data, has_v4=has_v4, has_v6=has_v6})
++end
++
++function action_routes()
++ local data, has_v4, has_v6, error = fetch_jsoninfo('routes')
++ if error then
++ return
++ end
++
++ local uci = require "luci.model.uci".cursor_state()
++ local resolve = uci:get("luci_olsr", "general", "resolve")
++
++ for k, v in ipairs(data) do
++ if resolve == "1" then
++ local hostname = nixio.getnameinfo(v.gateway, nil, 100)
++ if hostname then
++ v.hostname = hostname
++ end
++ end
++ end
++
++ local function compare(a,b)
++ if a.proto == b.proto then
++ return a.rtpMetricCost < b.rtpMetricCost
++ else
++ return a.proto < b.proto
++ end
++ end
++
++ table.sort(data, compare)
++ luci.template.render("status-olsr/routes", {routes=data, has_v4=has_v4, has_v6=has_v6})
++end
++
++function action_topology()
++ local data, has_v4, has_v6, error = fetch_jsoninfo('topology')
++ if error then
++ return
++ end
++
++ local function compare(a,b)
++ if a.proto == b.proto then
++ return a.tcEdgeCost < b.tcEdgeCost
++ else
++ return a.proto < b.proto
++ end
++ end
++
++ table.sort(data, compare)
++ luci.template.render("status-olsr/topology", {routes=data, has_v4=has_v4, has_v6=has_v6})
++end
++
++function action_hna()
++ local data, has_v4, has_v6, error = fetch_jsoninfo('hna')
++ if error then
++ return
++ end
++
++ local uci = require "luci.model.uci".cursor_state()
++ local resolve = uci:get("luci_olsr", "general", "resolve")
++
++ local function compare(a,b)
++ if a.proto == b.proto then
++ return a.genmask < b.genmask
++ else
++ return a.proto < b.proto
++ end
++ end
++
++ for k, v in ipairs(data) do
++ if resolve == "1" then
++ hostname = nixio.getnameinfo(v.gateway, nil, 100)
++ if hostname then
++ v.hostname = hostname
++ end
++ end
++ if v.validityTime then
++ v.validityTime = tonumber(string.format("%.0f", v.validityTime / 1000))
++ end
++ end
++
++ table.sort(data, compare)
++ luci.template.render("status-olsr/hna", {hna=data, has_v4=has_v4, has_v6=has_v6})
++end
++
++function action_mid()
++ local data, has_v4, has_v6, error = fetch_jsoninfo('mid')
++ if error then
++ return
++ end
++
++ local function compare(a,b)
++ if a.proto == b.proto then
++ return a.ipAddress < b.ipAddress
++ else
++ return a.proto < b.proto
++ end
++ end
++
++ table.sort(data, compare)
++ luci.template.render("status-olsr/mid", {mids=data, has_v4=has_v4, has_v6=has_v6})
++end
++
++function action_smartgw()
++ local data, has_v4, has_v6, error = fetch_jsoninfo('gateways')
++ if error then
++ return
++ end
++
++ local function compare(a,b)
++ if a.proto == b.proto then
++ return a.tcPathCost < b.tcPathCost
++ else
++ return a.proto < b.proto
++ end
++ end
++
++ table.sort(data, compare)
++ luci.template.render("status-olsr/smartgw", {gws=data, has_v4=has_v4, has_v6=has_v6})
++end
++
++function action_interfaces()
++ local data, has_v4, has_v6, error = fetch_jsoninfo('interfaces')
++ if error then
++ return
++ end
++
++ local function compare(a,b)
++ return a.proto < b.proto
++ end
++
++ table.sort(data, compare)
++ luci.template.render("status-olsr/interfaces", {iface=data, has_v4=has_v4, has_v6=has_v6})
++end
++
++-- Internal
++function fetch_jsoninfo(otable)
++ local uci = require "luci.model.uci".cursor_state()
++ local utl = require "luci.util"
++ local json = require "luci.json"
++ local IpVersion = uci:get_first("olsrd", "olsrd","IpVersion")
++ local jsonreq4 = ""
++ local jsonreq6 = ""
++ local v4_port = uci:get("olsrd", "olsrd_jsoninfo", "port") or 9090
++ local v6_port = uci:get("olsrd6", "olsrd_jsoninfo", "port") or 9090
++
++ jsonreq4 = utl.exec("(echo /" .. otable .. " | nc 127.0.0.1 " .. v4_port .. ") 2>/dev/null")
++ jsonreq6 = utl.exec("(echo /" .. otable .. " | nc ::1 " .. v6_port .. ") 2>/dev/null")
++ local jsondata4 = {}
++ local jsondata6 = {}
++ local data4 = {}
++ local data6 = {}
++ local has_v4 = False
++ local has_v6 = False
++
++ if jsonreq4 == '' and jsonreq6 == '' then
++ luci.template.render("status-olsr/error_olsr")
++ return nil, 0, 0, true
++ end
++
++ if jsonreq4 ~= "" then
++ has_v4 = 1
++ jsondata4 = json.decode(jsonreq4)
++ if otable == 'status' then
++ data4 = jsondata4 or {}
++ else
++ data4 = jsondata4[otable] or {}
++ end
++
++ for k, v in ipairs(data4) do
++ data4[k]['proto'] = '4'
++ end
++
++ end
++ if jsonreq6 ~= "" then
++ has_v6 = 1
++ jsondata6 = json.decode(jsonreq6)
++ if otable == 'status' then
++ data6 = jsondata6 or {}
++ else
++ data6 = jsondata6[otable] or {}
++ end
++ for k, v in ipairs(data6) do
++ data6[k]['proto'] = '6'
++ end
++ end
++
++ for k, v in ipairs(data6) do
++ table.insert(data4, v)
++ end
++
++ return data4, has_v4, has_v6, false
++end
++
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr4.lua b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr4.lua
+new file mode 100644
+index 0000000..31a3101
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr4.lua
+@@ -0,0 +1,47 @@
++module("luci.controller.olsr4", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/olsrd") then
++ return
++ end
++
++ require("luci.model.uci")
++ local uci = luci.model.uci.cursor_state()
++
++ local ol = entry(
++ {"admin", "services", "olsrd"},
++ cbi("olsr/olsrd"), "OLSR IPv4"
++ )
++ ol.subindex = true
++
++ entry(
++ {"admin", "services", "olsrd", "iface"},
++ cbi("olsr/olsrdiface")
++ ).leaf = true
++
++ entry(
++ {"admin", "services", "olsrd", "hna"},
++ cbi("olsr/olsrdhna"), _("HNA Announcements")
++ )
++
++ oplg = entry(
++ {"admin", "services", "olsrd", "plugins"},
++ cbi("olsr/olsrdplugins"), _("Plugins")
++ )
++
++ oplg.leaf = true
++ oplg.subindex = true
++
++ local uci = require("luci.model.uci").cursor()
++ uci:foreach("olsrd", "LoadPlugin",
++ function (section)
++ local lib = section.library
++ entry(
++ {"admin", "services", "olsrd", "plugins", lib },
++ cbi("olsr/olsrdplugins"),
++ nil --'Plugin "%s"' % lib:gsub("^olsrd_",""):gsub("%.so.+$","")
++ )
++ end
++ )
++end
++
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr6.lua b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr6.lua
+new file mode 100644
+index 0000000..9fbaa04
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr6.lua
+@@ -0,0 +1,47 @@
++module("luci.controller.olsr6", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/olsrd6") then
++ return
++ end
++
++ require("luci.model.uci")
++ local uci = luci.model.uci.cursor_state()
++
++ local ol = entry(
++ {"admin", "services", "olsrd6"},
++ cbi("olsr/olsrd6"), "OLSR IPv6"
++ )
++ ol.subindex = true
++
++ entry(
++ {"admin", "services", "olsrd6", "iface"},
++ cbi("olsr/olsrdiface6")
++ ).leaf = true
++
++ entry(
++ {"admin", "services", "olsrd6", "hna"},
++ cbi("olsr/olsrdhna6"), _("HNA6 Announcements")
++ )
++
++ oplg = entry(
++ {"admin", "services", "olsrd6", "plugins"},
++ cbi("olsr/olsrdplugins6"), _("Plugins")
++ )
++
++ oplg.leaf = true
++ oplg.subindex = true
++
++ local uci = require("luci.model.uci").cursor()
++ uci:foreach("olsrd6", "LoadPlugin",
++ function (section)
++ local lib = section.library
++ entry(
++ {"admin", "services", "olsrd6", "plugins", lib },
++ cbi("olsr/olsrdplugins6"),
++ nil --'Plugin "%s"' % lib:gsub("^olsrd_",""):gsub("%.so.+$","")
++ )
++ end
++ )
++end
++
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd.lua
+new file mode 100644
+index 0000000..a075bcf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd.lua
+@@ -0,0 +1,409 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.tools.webadmin")
++local fs = require "nixio.fs"
++local util = require "luci.util"
++local ip = require "luci.ip"
++
++local has_ipip = fs.glob("/etc/modules.d/[0-9]*-ipip")()
++
++m = Map("olsrd", translate("OLSR Daemon"),
++ translate("The OLSR daemon is an implementation of the Optimized Link State Routing protocol. "..
++ "As such it allows mesh routing for any network equipment. "..
++ "It runs on any wifi card that supports ad-hoc mode and of course on any ethernet device. "..
++ "Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and documentation."))
++
++function m.on_parse()
++ local has_defaults = false
++
++ m.uci:foreach("olsrd", "InterfaceDefaults",
++ function(s)
++ has_defaults = true
++ return false
++ end)
++
++ if not has_defaults then
++ m.uci:section("olsrd", "InterfaceDefaults")
++ end
++end
++
++function write_float(self, section, value)
++ local n = tonumber(value)
++ if n ~= nil then
++ return Value.write(self, section, "%.1f" % n)
++ end
++end
++
++s = m:section(TypedSection, "olsrd", translate("General settings"))
++s.anonymous = true
++
++s:tab("general", translate("General Settings"))
++s:tab("lquality", translate("Link Quality Settings"))
++s:tab("smartgw", translate("SmartGW"), not has_ipip and translate("Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not work, please install it."))
++s:tab("advanced", translate("Advanced Settings"))
++
++ipv = s:taboption("general", ListValue, "IpVersion", translate("Internet protocol"),
++ translate("IP-version to use. If 6and4 is selected then one olsrd instance is started for each protocol."))
++ipv:value("4", "IPv4")
++ipv:value("6and4", "6and4")
++
++
++poll = s:taboption("advanced", Value, "Pollrate", translate("Pollrate"),
++ translate("Polling rate for OLSR sockets in seconds. Default is 0.05."))
++poll.optional = true
++poll.datatype = "ufloat"
++poll.placeholder = "0.05"
++
++nicc = s:taboption("advanced", Value, "NicChgsPollInt", translate("Nic changes poll interval"),
++ translate("Interval to poll network interfaces for configuration changes (in seconds). Default is \"2.5\"."))
++nicc.optional = true
++nicc.datatype = "ufloat"
++nicc.placeholder = "2.5"
++
++tos = s:taboption("advanced", Value, "TosValue", translate("TOS value"),
++ translate("Type of service value for the IP header of control traffic. Default is \"16\"."))
++tos.optional = true
++tos.datatype = "uinteger"
++tos.placeholder = "16"
++
++fib = s:taboption("general", ListValue, "FIBMetric", translate("FIB metric"),
++ translate ("FIBMetric controls the metric value of the host-routes OLSRd sets. "..
++ "\"flat\" means that the metric value is always 2. This is the preferred value "..
++ "because it helps the linux kernel routing to clean up older routes. "..
++ "\"correct\" uses the hopcount as the metric value. "..
++ "\"approx\" use the hopcount as the metric value too, but does only update the hopcount if the nexthop changes too. "..
++ "Default is \"flat\"."))
++fib:value("flat")
++fib:value("correct")
++fib:value("approx")
++
++lql = s:taboption("lquality", ListValue, "LinkQualityLevel", translate("LQ level"),
++ translate("Link quality level switch between hopcount and cost-based (mostly ETX) routing.<br />"..
++ "<b>0</b> = do not use link quality<br />"..
++ "<b>2</b> = use link quality for MPR selection and routing<br />"..
++ "Default is \"2\""))
++lql:value("2")
++lql:value("0")
++
++lqage = s:taboption("lquality", Value, "LinkQualityAging", translate("LQ aging"),
++ translate("Link quality aging factor (only for lq level 2). Tuning parameter for etx_float and etx_fpm, smaller values "..
++ "mean slower changes of ETX value. (allowed values are between 0.01 and 1.0)"))
++lqage.optional = true
++lqage:depends("LinkQualityLevel", "2")
++
++lqa = s:taboption("lquality", ListValue, "LinkQualityAlgorithm", translate("LQ algorithm"),
++ translate("Link quality algorithm (only for lq level 2).<br />"..
++ "<b>etx_float</b>: floating point ETX with exponential aging<br />"..
++ "<b>etx_fpm</b> : same as etx_float, but with integer arithmetic<br />"..
++ "<b>etx_ff</b> : ETX freifunk, an etx variant which use all OLSR traffic (instead of only hellos) for ETX calculation<br />"..
++ "<b>etx_ffeth</b>: incompatible variant of etx_ff that allows ethernet links with ETX 0.1.<br />"..
++ "Defaults to \"etx_ff\""))
++lqa.optional = true
++lqa:value("etx_ff")
++lqa:value("etx_fpm")
++lqa:value("etx_float")
++lqa:value("etx_ffeth")
++lqa:depends("LinkQualityLevel", "2")
++lqa.optional = true
++
++lqfish = s:taboption("lquality", Flag, "LinkQualityFishEye", translate("LQ fisheye"),
++ translate("Fisheye mechanism for TCs (checked means on). Default is \"on\""))
++lqfish.default = "1"
++lqfish.optional = true
++
++hyst = s:taboption("lquality", Flag, "UseHysteresis", translate("Use hysteresis"),
++ translate("Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more robustness to the link sensing "..
++ "but delays neighbor registration. Defaults is \"yes\""))
++hyst.default = "yes"
++hyst.enabled = "yes"
++hyst.disabled = "no"
++hyst:depends("LinkQualityLevel", "0")
++hyst.optional = true
++hyst.rmempty = true
++
++port = s:taboption("general", Value, "OlsrPort", translate("Port"),
++ translate("The port OLSR uses. This should usually stay at the IANA assigned port 698. It can have a value between 1 and 65535."))
++port.optional = true
++port.default = "698"
++port.rmempty = true
++
++mainip = s:taboption("general", Value, "MainIp", translate("Main IP"),
++ translate("Sets the main IP (originator ip) of the router. This IP will NEVER change during the uptime of olsrd. "..
++ "Default is 0.0.0.0, which triggers usage of the IP of the first interface."))
++mainip.optional = true
++mainip.rmempty = true
++mainip.datatype = "ipaddr"
++mainip.placeholder = "0.0.0.0"
++
++sgw = s:taboption("smartgw", Flag, "SmartGateway", translate("Enable"), translate("Enable SmartGateway. If it is disabled, then " ..
++ "all other SmartGateway parameters are ignored. Default is \"no\"."))
++sgw.default="no"
++sgw.enabled="yes"
++sgw.disabled="no"
++sgw.rmempty = true
++
++sgwnat = s:taboption("smartgw", Flag, "SmartGatewayAllowNAT", translate("Allow gateways with NAT"), translate("Allow the selection of an outgoing ipv4 gateway with NAT"))
++sgwnat:depends("SmartGateway", "yes")
++sgwnat.default="yes"
++sgwnat.enabled="yes"
++sgwnat.disabled="no"
++sgwnat.optional = true
++sgwnat.rmempty = true
++
++sgwuplink = s:taboption("smartgw", ListValue, "SmartGatewayUplink", translate("Announce uplink"), translate("Which kind of uplink is exported to the other mesh nodes. " ..
++ "An uplink is detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. Default setting is \"both\"."))
++sgwuplink:value("none")
++sgwuplink:value("ipv4")
++sgwuplink:value("ipv6")
++sgwuplink:value("both")
++sgwuplink:depends("SmartGateway", "yes")
++sgwuplink.default="both"
++sgwuplink.optional = true
++sgwuplink.rmempty = true
++
++sgwulnat = s:taboption("smartgw", Flag, "SmartGatewayUplinkNAT", translate("Uplink uses NAT"), translate("If this Node uses NAT for connections to the internet. " ..
++ "Default is \"yes\"."))
++sgwulnat:depends("SmartGatewayUplink", "ipv4")
++sgwulnat:depends("SmartGatewayUplink", "both")
++sgwulnat.default="yes"
++sgwulnat.enabled="yes"
++sgwulnat.disabled="no"
++sgwnat.optional = true
++sgwnat.rmempty = true
++
++sgwspeed = s:taboption("smartgw", Value, "SmartGatewaySpeed", translate("Speed of the uplink"), translate("Specifies the speed of "..
++ "the uplink in kilobits/s. First parameter is upstream, second parameter is downstream. Default is \"128 1024\"."))
++sgwspeed:depends("SmartGatewayUplink", "ipv4")
++sgwspeed:depends("SmartGatewayUplink", "ipv6")
++sgwspeed:depends("SmartGatewayUplink", "both")
++sgwspeed.optional = true
++sgwspeed.rmempty = true
++
++sgwprefix = s:taboption("smartgw", Value, "SmartGatewayPrefix", translate("IPv6-Prefix of the uplink"), translate("This can be used " ..
++ "to signal the external IPv6 prefix of the uplink to the clients. This might allow a client to change it's local IPv6 address to " ..
++ "use the IPv6 gateway without any kind of address translation. The maximum prefix length is 64 bits. " ..
++ "Default is \"::/0\" (no prefix)."))
++sgwprefix:depends("SmartGatewayUplink", "ipv6")
++sgwprefix:depends("SmartGatewayUplink", "both")
++sgwprefix.optional = true
++sgwprefix.rmempty = true
++
++willingness = s:taboption("advanced", ListValue, "Willingness", translate("Willingness"),
++ translate("The fixed willingness to use. If not set willingness will be calculated dynamically based on battery/power status. Default is \"3\"."))
++for i=0,7 do
++ willingness:value(i)
++end
++willingness.optional = true
++willingness.default = "3"
++
++natthr = s:taboption("advanced", Value, "NatThreshold", translate("NAT threshold"),
++ translate("If the route to the current gateway is to be changed, the ETX value of this gateway is "..
++ "multiplied with this value before it is compared to the new one. "..
++ "The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 if changed.<br />"..
++ "<b>WARNING:</b> This parameter should not be used together with the etx_ffeth metric!<br />"..
++ "Defaults to \"1.0\"."))
++for i=1,0.1,-0.1 do
++ natthr:value(i)
++end
++natthr:depends("LinkQualityAlgorithm", "etx_ff")
++natthr:depends("LinkQualityAlgorithm", "etx_float")
++natthr:depends("LinkQualityAlgorithm", "etx_fpm")
++natthr.default = "1.0"
++natthr.optional = true
++natthr.write = write_float
++
++
++i = m:section(TypedSection, "InterfaceDefaults", translate("Interfaces Defaults"))
++i.anonymous = true
++i.addremove = false
++
++i:tab("general", translate("General Settings"))
++i:tab("addrs", translate("IP Addresses"))
++i:tab("timing", translate("Timing and Validity"))
++
++mode = i:taboption("general", ListValue, "Mode", translate("Mode"),
++ translate("Interface Mode is used to prevent unnecessary packet forwarding on switched ethernet interfaces. "..
++ "valid Modes are \"mesh\" and \"ether\". Default is \"mesh\"."))
++mode:value("mesh")
++mode:value("ether")
++mode.optional = true
++mode.rmempty = true
++
++
++weight = i:taboption("general", Value, "Weight", translate("Weight"),
++ translate("When multiple links exist between hosts the weight of interface is used to determine the link to use. "..
++ "Normally the weight is automatically calculated by olsrd based on the characteristics of the interface, "..
++ "but here you can specify a fixed value. Olsrd will choose links with the lowest value.<br />"..
++ "<b>Note:</b> Interface weight is used only when LinkQualityLevel is set to 0. "..
++ "For any other value of LinkQualityLevel, the interface ETX value is used instead."))
++weight.optional = true
++weight.datatype = "uinteger"
++weight.placeholder = "0"
++
++lqmult = i:taboption("general", DynamicList, "LinkQualityMult", translate("LinkQuality Multiplicator"),
++ translate("Multiply routes with the factor given here. Allowed values are between 0.01 and 1.0. "..
++ "It is only used when LQ-Level is greater than 0. Examples:<br />"..
++ "reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />"..
++ "reduce LQ to all nodes on this interface by 20%: default 0.8"))
++lqmult.optional = true
++lqmult.rmempty = true
++lqmult.cast = "table"
++lqmult.placeholder = "default 1.0"
++
++function lqmult.validate(self, value)
++ for _, v in pairs(value) do
++ if v ~= "" then
++ local val = util.split(v, " ")
++ local host = val[1]
++ local mult = val[2]
++ if not host or not mult then
++ return nil, translate("LQMult requires two values (IP address or 'default' and multiplicator) seperated by space.")
++ end
++ if not (host == "default" or ip.IPv4(host) or ip.IPv6(host)) then
++ return nil, translate("Can only be a valid IPv4 or IPv6 address or 'default'")
++ end
++ if not tonumber(mult) or tonumber(mult) > 1 or tonumber(mult) < 0.01 then
++ return nil, translate("Invalid Value for LQMult-Value. Must be between 0.01 and 1.0.")
++ end
++ if not mult:match("[0-1]%.[0-9]+") then
++ return nil, translate("Invalid Value for LQMult-Value. You must use a decimal number between 0.01 and 1.0 here.")
++ end
++ end
++ end
++ return value
++end
++
++ip4b = i:taboption("addrs", Value, "Ip4Broadcast", translate("IPv4 broadcast"),
++ translate("IPv4 broadcast address for outgoing OLSR packets. One useful example would be 255.255.255.255. "..
++ "Default is \"0.0.0.0\", which triggers the usage of the interface broadcast IP."))
++ip4b.optional = true
++ip4b.datatype = "ip4addr"
++ip4b.placeholder = "0.0.0.0"
++
++ip6m = i:taboption("addrs", Value, "IPv6Multicast", translate("IPv6 multicast"),
++ translate("IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal multicast."))
++ip6m.optional = true
++ip6m.datatype = "ip6addr"
++ip6m.placeholder = "FF02::6D"
++
++ip4s = i:taboption("addrs", Value, "IPv4Src", translate("IPv4 source"),
++ translate("IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which triggers usage of the interface IP."))
++ip4s.optional = true
++ip4s.datatype = "ip4addr"
++ip4s.placeholder = "0.0.0.0"
++
++ip6s = i:taboption("addrs", Value, "IPv6Src", translate("IPv6 source"),
++ translate("IPv6 src prefix. OLSRd will choose one of the interface IPs which matches the prefix of this parameter. "..
++ "Default is \"0::/0\", which triggers the usage of a not-linklocal interface IP."))
++ip6s.optional = true
++ip6s.datatype = "ip6addr"
++ip6s.placeholder = "0::/0"
++
++
++hi = i:taboption("timing", Value, "HelloInterval", translate("Hello interval"))
++hi.optional = true
++hi.datatype = "ufloat"
++hi.placeholder = "5.0"
++hi.write = write_float
++
++hv = i:taboption("timing", Value, "HelloValidityTime", translate("Hello validity time"))
++hv.optional = true
++hv.datatype = "ufloat"
++hv.placeholder = "40.0"
++hv.write = write_float
++
++ti = i:taboption("timing", Value, "TcInterval", translate("TC interval"))
++ti.optional = true
++ti.datatype = "ufloat"
++ti.placeholder = "2.0"
++ti.write = write_float
++
++tv = i:taboption("timing", Value, "TcValidityTime", translate("TC validity time"))
++tv.optional = true
++tv.datatype = "ufloat"
++tv.placeholder = "256.0"
++tv.write = write_float
++
++mi = i:taboption("timing", Value, "MidInterval", translate("MID interval"))
++mi.optional = true
++mi.datatype = "ufloat"
++mi.placeholder = "18.0"
++mi.write = write_float
++
++mv = i:taboption("timing", Value, "MidValidityTime", translate("MID validity time"))
++mv.optional = true
++mv.datatype = "ufloat"
++mv.placeholder = "324.0"
++mv.write = write_float
++
++ai = i:taboption("timing", Value, "HnaInterval", translate("HNA interval"))
++ai.optional = true
++ai.datatype = "ufloat"
++ai.placeholder = "18.0"
++ai.write = write_float
++
++av = i:taboption("timing", Value, "HnaValidityTime", translate("HNA validity time"))
++av.optional = true
++av.datatype = "ufloat"
++av.placeholder = "108.0"
++av.write = write_float
++
++
++ifs = m:section(TypedSection, "Interface", translate("Interfaces"))
++ifs.addremove = true
++ifs.anonymous = true
++ifs.extedit = luci.dispatcher.build_url("admin/services/olsrd/iface/%s")
++ifs.template = "cbi/tblsection"
++
++function ifs.create(...)
++ local sid = TypedSection.create(...)
++ luci.http.redirect(ifs.extedit % sid)
++end
++
++ign = ifs:option(Flag, "ignore", translate("Enable"))
++ign.enabled = "0"
++ign.disabled = "1"
++ign.rmempty = false
++function ign.cfgvalue(self, section)
++ return Flag.cfgvalue(self, section) or "0"
++end
++
++network = ifs:option(DummyValue, "interface", translate("Network"))
++network.template = "cbi/network_netinfo"
++
++mode = ifs:option(DummyValue, "Mode", translate("Mode"))
++function mode.cfgvalue(...)
++ return Value.cfgvalue(...) or m.uci:get_first("olsrd", "InterfaceDefaults", "Mode", "mesh")
++end
++
++hello = ifs:option(DummyValue, "_hello", translate("Hello"))
++function hello.cfgvalue(self, section)
++ local i = tonumber(m.uci:get("olsrd", section, "HelloInterval")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "HelloInterval", 5))
++ local v = tonumber(m.uci:get("olsrd", section, "HelloValidityTime")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "HelloValidityTime", 40))
++ return "%.01fs / %.01fs" %{ i, v }
++end
++
++tc = ifs:option(DummyValue, "_tc", translate("TC"))
++function tc.cfgvalue(self, section)
++ local i = tonumber(m.uci:get("olsrd", section, "TcInterval")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "TcInterval", 2))
++ local v = tonumber(m.uci:get("olsrd", section, "TcValidityTime")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "TcValidityTime", 256))
++ return "%.01fs / %.01fs" %{ i, v }
++end
++
++mid = ifs:option(DummyValue, "_mid", translate("MID"))
++function mid.cfgvalue(self, section)
++ local i = tonumber(m.uci:get("olsrd", section, "MidInterval")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "MidInterval", 18))
++ local v = tonumber(m.uci:get("olsrd", section, "MidValidityTime")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "MidValidityTime", 324))
++ return "%.01fs / %.01fs" %{ i, v }
++end
++
++hna = ifs:option(DummyValue, "_hna", translate("HNA"))
++function hna.cfgvalue(self, section)
++ local i = tonumber(m.uci:get("olsrd", section, "HnaInterval")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "HnaInterval", 18))
++ local v = tonumber(m.uci:get("olsrd", section, "HnaValidityTime")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "HnaValidityTime", 108))
++ return "%.01fs / %.01fs" %{ i, v }
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd6.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd6.lua
+new file mode 100644
+index 0000000..0007e67
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd6.lua
+@@ -0,0 +1,390 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.tools.webadmin")
++local fs = require "nixio.fs"
++local util = require "luci.util"
++local ip = require "luci.ip"
++
++local has_ipip = fs.glob("/etc/modules.d/[0-9]*-ipip")()
++
++m = Map("olsrd6", translate("OLSR Daemon"),
++ translate("The OLSR daemon is an implementation of the Optimized Link State Routing protocol. "..
++ "As such it allows mesh routing for any network equipment. "..
++ "It runs on any wifi card that supports ad-hoc mode and of course on any ethernet device. "..
++ "Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and documentation."))
++
++function m.on_parse()
++ local has_defaults = false
++
++ m.uci:foreach("olsrd6", "InterfaceDefaults",
++ function(s)
++ has_defaults = true
++ return false
++ end)
++
++ if not has_defaults then
++ m.uci:section("olsrd6", "InterfaceDefaults")
++ end
++end
++
++function write_float(self, section, value)
++ local n = tonumber(value)
++ if n ~= nil then
++ return Value.write(self, section, "%.1f" % n)
++ end
++end
++
++s = m:section(TypedSection, "olsrd6", translate("General settings"))
++s.anonymous = true
++
++s:tab("general", translate("General Settings"))
++s:tab("lquality", translate("Link Quality Settings"))
++s:tab("smartgw", translate("SmartGW"), not has_ipip and translate("Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not work, please install it."))
++s:tab("advanced", translate("Advanced Settings"))
++
++poll = s:taboption("advanced", Value, "Pollrate", translate("Pollrate"),
++ translate("Polling rate for OLSR sockets in seconds. Default is 0.05."))
++poll.optional = true
++poll.datatype = "ufloat"
++poll.placeholder = "0.05"
++
++nicc = s:taboption("advanced", Value, "NicChgsPollInt", translate("Nic changes poll interval"),
++ translate("Interval to poll network interfaces for configuration changes (in seconds). Default is \"2.5\"."))
++nicc.optional = true
++nicc.datatype = "ufloat"
++nicc.placeholder = "2.5"
++
++tos = s:taboption("advanced", Value, "TosValue", translate("TOS value"),
++ translate("Type of service value for the IP header of control traffic. Default is \"16\"."))
++tos.optional = true
++tos.datatype = "uinteger"
++tos.placeholder = "16"
++
++fib = s:taboption("general", ListValue, "FIBMetric", translate("FIB metric"),
++ translate ("FIBMetric controls the metric value of the host-routes OLSRd sets. "..
++ "\"flat\" means that the metric value is always 2. This is the preferred value "..
++ "because it helps the linux kernel routing to clean up older routes. "..
++ "\"correct\" uses the hopcount as the metric value. "..
++ "\"approx\" use the hopcount as the metric value too, but does only update the hopcount if the nexthop changes too. "..
++ "Default is \"flat\"."))
++fib:value("flat")
++fib:value("correct")
++fib:value("approx")
++
++lql = s:taboption("lquality", ListValue, "LinkQualityLevel", translate("LQ level"),
++ translate("Link quality level switch between hopcount and cost-based (mostly ETX) routing.<br />"..
++ "<b>0</b> = do not use link quality<br />"..
++ "<b>2</b> = use link quality for MPR selection and routing<br />"..
++ "Default is \"2\""))
++lql:value("2")
++lql:value("0")
++
++lqage = s:taboption("lquality", Value, "LinkQualityAging", translate("LQ aging"),
++ translate("Link quality aging factor (only for lq level 2). Tuning parameter for etx_float and etx_fpm, smaller values "..
++ "mean slower changes of ETX value. (allowed values are between 0.01 and 1.0)"))
++lqage.optional = true
++lqage:depends("LinkQualityLevel", "2")
++
++lqa = s:taboption("lquality", ListValue, "LinkQualityAlgorithm", translate("LQ algorithm"),
++ translate("Link quality algorithm (only for lq level 2).<br />"..
++ "<b>etx_float</b>: floating point ETX with exponential aging<br />"..
++ "<b>etx_fpm</b> : same as etx_float, but with integer arithmetic<br />"..
++ "<b>etx_ff</b> : ETX freifunk, an etx variant which use all OLSR traffic (instead of only hellos) for ETX calculation<br />"..
++ "<b>etx_ffeth</b>: incompatible variant of etx_ff that allows ethernet links with ETX 0.1.<br />"..
++ "Defaults to \"etx_ff\""))
++lqa.optional = true
++lqa:value("etx_ff")
++lqa:value("etx_fpm")
++lqa:value("etx_float")
++lqa:value("etx_ffeth")
++lqa:depends("LinkQualityLevel", "2")
++lqa.optional = true
++
++lqfish = s:taboption("lquality", Flag, "LinkQualityFishEye", translate("LQ fisheye"),
++ translate("Fisheye mechanism for TCs (checked means on). Default is \"on\""))
++lqfish.default = "1"
++lqfish.optional = true
++
++hyst = s:taboption("lquality", Flag, "UseHysteresis", translate("Use hysteresis"),
++ translate("Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more robustness to the link sensing "..
++ "but delays neighbor registration. Defaults is \"yes\""))
++hyst.default = "yes"
++hyst.enabled = "yes"
++hyst.disabled = "no"
++hyst:depends("LinkQualityLevel", "0")
++hyst.optional = true
++hyst.rmempty = true
++
++port = s:taboption("general", Value, "OlsrPort", translate("Port"),
++ translate("The port OLSR uses. This should usually stay at the IANA assigned port 698. It can have a value between 1 and 65535."))
++port.optional = true
++port.default = "698"
++port.rmempty = true
++
++mainip = s:taboption("general", Value, "MainIp", translate("Main IP"),
++ translate("Sets the main IP (originator ip) of the router. This IP will NEVER change during the uptime of olsrd. "..
++ "Default is ::, which triggers usage of the IP of the first interface."))
++mainip.optional = true
++mainip.rmempty = true
++mainip.datatype = "ipaddr"
++mainip.placeholder = "::"
++
++sgw = s:taboption("smartgw", Flag, "SmartGateway", translate("Enable"), translate("Enable SmartGateway. If it is disabled, then " ..
++ "all other SmartGateway parameters are ignored. Default is \"no\"."))
++sgw.default="no"
++sgw.enabled="yes"
++sgw.disabled="no"
++sgw.rmempty = true
++
++sgwnat = s:taboption("smartgw", Flag, "SmartGatewayAllowNAT", translate("Allow gateways with NAT"), translate("Allow the selection of an outgoing ipv4 gateway with NAT"))
++sgwnat:depends("SmartGateway", "yes")
++sgwnat.default="yes"
++sgwnat.enabled="yes"
++sgwnat.disabled="no"
++sgwnat.optional = true
++sgwnat.rmempty = true
++
++sgwuplink = s:taboption("smartgw", ListValue, "SmartGatewayUplink", translate("Announce uplink"), translate("Which kind of uplink is exported to the other mesh nodes. " ..
++ "An uplink is detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default setting is \"both\"."))
++sgwuplink:value("none")
++sgwuplink:value("ipv4")
++sgwuplink:value("ipv6")
++sgwuplink:value("both")
++sgwuplink:depends("SmartGateway", "yes")
++sgwuplink.default="both"
++sgwuplink.optional = true
++sgwuplink.rmempty = true
++
++sgwulnat = s:taboption("smartgw", Flag, "SmartGatewayUplinkNAT", translate("Uplink uses NAT"), translate("If this Node uses NAT for connections to the internet. " ..
++ "Default is \"yes\"."))
++sgwulnat:depends("SmartGatewayUplink", "ipv4")
++sgwulnat:depends("SmartGatewayUplink", "both")
++sgwulnat.default="yes"
++sgwulnat.enabled="yes"
++sgwulnat.disabled="no"
++sgwnat.optional = true
++sgwnat.rmempty = true
++
++sgwspeed = s:taboption("smartgw", Value, "SmartGatewaySpeed", translate("Speed of the uplink"), translate("Specifies the speed of "..
++ "the uplink in kilobits/s. First parameter is upstream, second parameter is downstream. Default is \"128 1024\"."))
++sgwspeed:depends("SmartGatewayUplink", "ipv4")
++sgwspeed:depends("SmartGatewayUplink", "ipv6")
++sgwspeed:depends("SmartGatewayUplink", "both")
++sgwspeed.optional = true
++sgwspeed.rmempty = true
++
++sgwprefix = s:taboption("smartgw", Value, "SmartGatewayPrefix", translate("IPv6-Prefix of the uplink"), translate("This can be used " ..
++ "to signal the external IPv6 prefix of the uplink to the clients. This might allow a client to change it's local IPv6 address to " ..
++ "use the IPv6 gateway without any kind of address translation. The maximum prefix length is 64 bits. " ..
++ "Default is \"::/0\" (no prefix)."))
++sgwprefix:depends("SmartGatewayUplink", "ipv6")
++sgwprefix:depends("SmartGatewayUplink", "both")
++sgwprefix.optional = true
++sgwprefix.rmempty = true
++
++willingness = s:taboption("advanced", ListValue, "Willingness", translate("Willingness"),
++ translate("The fixed willingness to use. If not set willingness will be calculated dynamically based on battery/power status. Default is \"3\"."))
++for i=0,7 do
++ willingness:value(i)
++end
++willingness.optional = true
++willingness.default = "3"
++
++natthr = s:taboption("advanced", Value, "NatThreshold", translate("NAT threshold"),
++ translate("If the route to the current gateway is to be changed, the ETX value of this gateway is "..
++ "multiplied with this value before it is compared to the new one. "..
++ "The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 if changed.<br />"..
++ "<b>WARNING:</b> This parameter should not be used together with the etx_ffeth metric!<br />"..
++ "Defaults to \"1.0\"."))
++for i=1,0.1,-0.1 do
++ natthr:value(i)
++end
++natthr:depends("LinkQualityAlgorithm", "etx_ff")
++natthr:depends("LinkQualityAlgorithm", "etx_float")
++natthr:depends("LinkQualityAlgorithm", "etx_fpm")
++natthr.default = "1.0"
++natthr.optional = true
++natthr.write = write_float
++
++
++i = m:section(TypedSection, "InterfaceDefaults", translate("Interfaces Defaults"))
++i.anonymous = true
++i.addremove = false
++
++i:tab("general", translate("General Settings"))
++i:tab("addrs", translate("IP Addresses"))
++i:tab("timing", translate("Timing and Validity"))
++
++mode = i:taboption("general", ListValue, "Mode", translate("Mode"),
++ translate("Interface Mode is used to prevent unnecessary packet forwarding on switched ethernet interfaces. "..
++ "valid Modes are \"mesh\" and \"ether\". Default is \"mesh\"."))
++mode:value("mesh")
++mode:value("ether")
++mode.optional = true
++mode.rmempty = true
++
++
++weight = i:taboption("general", Value, "Weight", translate("Weight"),
++ translate("When multiple links exist between hosts the weight of interface is used to determine the link to use. "..
++ "Normally the weight is automatically calculated by olsrd based on the characteristics of the interface, "..
++ "but here you can specify a fixed value. Olsrd will choose links with the lowest value.<br />"..
++ "<b>Note:</b> Interface weight is used only when LinkQualityLevel is set to 0. "..
++ "For any other value of LinkQualityLevel, the interface ETX value is used instead."))
++weight.optional = true
++weight.datatype = "uinteger"
++weight.placeholder = "0"
++
++lqmult = i:taboption("general", DynamicList, "LinkQualityMult", translate("LinkQuality Multiplicator"),
++ translate("Multiply routes with the factor given here. Allowed values are between 0.01 and 1.0. "..
++ "It is only used when LQ-Level is greater than 0. Examples:<br />"..
++ "reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />"..
++ "reduce LQ to all nodes on this interface by 20%: default 0.8"))
++lqmult.optional = true
++lqmult.rmempty = true
++lqmult.cast = "table"
++lqmult.placeholder = "default 1.0"
++
++function lqmult.validate(self, value)
++ for _, v in pairs(value) do
++ if v ~= "" then
++ local val = util.split(v, " ")
++ local host = val[1]
++ local mult = val[2]
++ if not host or not mult then
++ return nil, translate("LQMult requires two values (IP address or 'default' and multiplicator) seperated by space.")
++ end
++ if not (host == "default" or ip.IPv6(host)) then
++ return nil, translate("Can only be a valid IPv6 address or 'default'")
++ end
++ if not tonumber(mult) or tonumber(mult) > 1 or tonumber(mult) < 0.01 then
++ return nil, translate("Invalid Value for LQMult-Value. Must be between 0.01 and 1.0.")
++ end
++ if not mult:match("[0-1]%.[0-9]+") then
++ return nil, translate("Invalid Value for LQMult-Value. You must use a decimal number between 0.01 and 1.0 here.")
++ end
++ end
++ end
++ return value
++end
++
++ip6m = i:taboption("addrs", Value, "IPv6Multicast", translate("IPv6 multicast"),
++ translate("IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal multicast."))
++ip6m.optional = true
++ip6m.datatype = "ip6addr"
++ip6m.placeholder = "FF02::6D"
++
++ip6s = i:taboption("addrs", Value, "IPv6Src", translate("IPv6 source"),
++ translate("IPv6 src prefix. OLSRd will choose one of the interface IPs which matches the prefix of this parameter. "..
++ "Default is \"0::/0\", which triggers the usage of a not-linklocal interface IP."))
++ip6s.optional = true
++ip6s.datatype = "ip6addr"
++ip6s.placeholder = "0::/0"
++
++
++hi = i:taboption("timing", Value, "HelloInterval", translate("Hello interval"))
++hi.optional = true
++hi.datatype = "ufloat"
++hi.placeholder = "5.0"
++hi.write = write_float
++
++hv = i:taboption("timing", Value, "HelloValidityTime", translate("Hello validity time"))
++hv.optional = true
++hv.datatype = "ufloat"
++hv.placeholder = "40.0"
++hv.write = write_float
++
++ti = i:taboption("timing", Value, "TcInterval", translate("TC interval"))
++ti.optional = true
++ti.datatype = "ufloat"
++ti.placeholder = "2.0"
++ti.write = write_float
++
++tv = i:taboption("timing", Value, "TcValidityTime", translate("TC validity time"))
++tv.optional = true
++tv.datatype = "ufloat"
++tv.placeholder = "256.0"
++tv.write = write_float
++
++mi = i:taboption("timing", Value, "MidInterval", translate("MID interval"))
++mi.optional = true
++mi.datatype = "ufloat"
++mi.placeholder = "18.0"
++mi.write = write_float
++
++mv = i:taboption("timing", Value, "MidValidityTime", translate("MID validity time"))
++mv.optional = true
++mv.datatype = "ufloat"
++mv.placeholder = "324.0"
++mv.write = write_float
++
++ai = i:taboption("timing", Value, "HnaInterval", translate("HNA interval"))
++ai.optional = true
++ai.datatype = "ufloat"
++ai.placeholder = "18.0"
++ai.write = write_float
++
++av = i:taboption("timing", Value, "HnaValidityTime", translate("HNA validity time"))
++av.optional = true
++av.datatype = "ufloat"
++av.placeholder = "108.0"
++av.write = write_float
++
++
++ifs = m:section(TypedSection, "Interface", translate("Interfaces"))
++ifs.addremove = true
++ifs.anonymous = true
++ifs.extedit = luci.dispatcher.build_url("admin/services/olsrd6/iface/%s")
++ifs.template = "cbi/tblsection"
++
++function ifs.create(...)
++ local sid = TypedSection.create(...)
++ luci.http.redirect(ifs.extedit % sid)
++end
++
++ign = ifs:option(Flag, "ignore", translate("Enable"))
++ign.enabled = "0"
++ign.disabled = "1"
++ign.rmempty = false
++function ign.cfgvalue(self, section)
++ return Flag.cfgvalue(self, section) or "0"
++end
++
++network = ifs:option(DummyValue, "interface", translate("Network"))
++network.template = "cbi/network_netinfo"
++
++mode = ifs:option(DummyValue, "Mode", translate("Mode"))
++function mode.cfgvalue(...)
++ return Value.cfgvalue(...) or m.uci:get_first("olsrd6", "InterfaceDefaults", "Mode", "mesh")
++end
++
++hello = ifs:option(DummyValue, "_hello", translate("Hello"))
++function hello.cfgvalue(self, section)
++ local i = tonumber(m.uci:get("olsrd6", section, "HelloInterval")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "HelloInterval", 5))
++ local v = tonumber(m.uci:get("olsrd6", section, "HelloValidityTime")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "HelloValidityTime", 40))
++ return "%.01fs / %.01fs" %{ i, v }
++end
++
++tc = ifs:option(DummyValue, "_tc", translate("TC"))
++function tc.cfgvalue(self, section)
++ local i = tonumber(m.uci:get("olsrd6", section, "TcInterval")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "TcInterval", 2))
++ local v = tonumber(m.uci:get("olsrd6", section, "TcValidityTime")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "TcValidityTime", 256))
++ return "%.01fs / %.01fs" %{ i, v }
++end
++
++mid = ifs:option(DummyValue, "_mid", translate("MID"))
++function mid.cfgvalue(self, section)
++ local i = tonumber(m.uci:get("olsrd6", section, "MidInterval")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "MidInterval", 18))
++ local v = tonumber(m.uci:get("olsrd6", section, "MidValidityTime")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "MidValidityTime", 324))
++ return "%.01fs / %.01fs" %{ i, v }
++end
++
++hna = ifs:option(DummyValue, "_hna", translate("HNA"))
++function hna.cfgvalue(self, section)
++ local i = tonumber(m.uci:get("olsrd6", section, "HnaInterval")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "HnaInterval", 18))
++ local v = tonumber(m.uci:get("olsrd6", section, "HnaValidityTime")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "HnaValidityTime", 108))
++ return "%.01fs / %.01fs" %{ i, v }
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrddisplay.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrddisplay.lua
+new file mode 100644
+index 0000000..aadb44f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrddisplay.lua
+@@ -0,0 +1,14 @@
++-- Copyright 2011 Manuel Munz <freifunk at somakoma de>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_olsr", translate("OLSR - Display Options"))
++
++s = m:section(TypedSection, "olsr")
++s.anonymous = true
++
++res = s:option(Flag, "resolve", translate("Resolve"),
++ translate("Resolve hostnames on status pages. It is generally safe to allow this, but if you use public IPs and have unstable DNS-Setup then those pages will load really slow. In this case disable it here."))
++res.default = "0"
++res.optional = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna.lua
+new file mode 100644
+index 0000000..e4b093a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna.lua
+@@ -0,0 +1,45 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local uci = require "luci.model.uci".cursor()
++local ipv = uci:get_first("olsrd", "olsrd", "IpVersion", "4")
++
++mh = Map("olsrd", translate("OLSR - HNA-Announcements"), translate("Hosts in a OLSR routed network can announce connecitivity " ..
++ "to external networks using HNA messages."))
++
++if ipv == "6and4" or ipv == "4" then
++ hna4 = mh:section(TypedSection, "Hna4", translate("Hna4"), translate("Both values must use the dotted decimal notation."))
++ hna4.addremove = true
++ hna4.anonymous = true
++ hna4.template = "cbi/tblsection"
++
++ net4 = hna4:option(Value, "netaddr", translate("Network address"))
++ net4.datatype = "ip4addr"
++ net4.placeholder = "10.11.12.13"
++ net4.default = "10.11.12.13"
++ msk4 = hna4:option(Value, "netmask", translate("Netmask"))
++ msk4.datatype = "ip4addr"
++ msk4.placeholder = "255.255.255.255"
++ msk4.default = "255.255.255.255"
++end
++
++if ipv == "6and4" or ipv == "6" then
++ hna6 = mh:section(TypedSection, "Hna6", translate("Hna6"), translate("IPv6 network must be given in full notation, " ..
++ "prefix must be in CIDR notation."))
++ hna6.addremove = true
++ hna6.anonymous = true
++ hna6.template = "cbi/tblsection"
++
++ net6 = hna6:option(Value, "netaddr", translate("Network address"))
++ net6.datatype = "ip6addr"
++ net6.placeholder = "fec0:2200:106:0:0:0:0:0"
++ net6.default = "fec0:2200:106:0:0:0:0:0"
++ msk6 = hna6:option(Value, "prefix", translate("Prefix"))
++ msk6.datatype = "range(0,128)"
++ msk6.placeholder = "128"
++ msk6.default = "128"
++end
++
++return mh
++
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna6.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna6.lua
+new file mode 100644
+index 0000000..682421f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna6.lua
+@@ -0,0 +1,25 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local uci = require "luci.model.uci".cursor()
++
++mh = Map("olsrd6", translate("OLSR - HNA6-Announcements"), translate("Hosts in a OLSR routed network can announce connecitivity " ..
++ "to external networks using HNA6 messages."))
++
++ hna6 = mh:section(TypedSection, "Hna6", translate("Hna6"), translate("IPv6 network must be given in full notation, " ..
++ "prefix must be in CIDR notation."))
++ hna6.addremove = true
++ hna6.anonymous = true
++ hna6.template = "cbi/tblsection"
++
++ net6 = hna6:option(Value, "netaddr", translate("Network address"))
++ net6.datatype = "ip6addr"
++ net6.placeholder = "fec0:2200:106:0:0:0:0:0"
++ net6.default = "fec0:2200:106:0:0:0:0:0"
++ msk6 = hna6:option(Value, "prefix", translate("Prefix"))
++ msk6.datatype = "range(0,128)"
++ msk6.placeholder = "128"
++ msk6.default = "128"
++return mh
++
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface.lua
+new file mode 100644
+index 0000000..d6b7cd1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface.lua
+@@ -0,0 +1,177 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local util = require "luci.util"
++local ip = require "luci.ip"
++
++function write_float(self, section, value)
++ local n = tonumber(value)
++ if n ~= nil then
++ return Value.write(self, section, "%.1f" % n)
++ end
++end
++
++m = Map("olsrd", translate("OLSR Daemon - Interface"),
++ translate("The OLSR daemon is an implementation of the Optimized Link State Routing protocol. "..
++ "As such it allows mesh routing for any network equipment. "..
++ "It runs on any wifi card that supports ad-hoc mode and of course on any ethernet device. "..
++ "Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and documentation."))
++
++m.redirect = luci.dispatcher.build_url("admin/services/olsrd")
++
++if not arg[1] or m.uci:get("olsrd", arg[1]) ~= "Interface" then
++ luci.http.redirect(m.redirect)
++ return
++end
++
++i = m:section(NamedSection, arg[1], "Interface", translate("Interface"))
++i.anonymous = true
++i.addremove = false
++
++i:tab("general", translate("General Settings"))
++i:tab("addrs", translate("IP Addresses"))
++i:tab("timing", translate("Timing and Validity"))
++
++ign = i:taboption("general", Flag, "ignore", translate("Enable"),
++ translate("Enable this interface."))
++ign.enabled = "0"
++ign.disabled = "1"
++ign.rmempty = false
++function ign.cfgvalue(self, section)
++ return Flag.cfgvalue(self, section) or "0"
++end
++
++network = i:taboption("general", Value, "interface", translate("Network"),
++ translate("The interface OLSRd should serve."))
++
++network.template = "cbi/network_netlist"
++network.widget = "radio"
++network.nocreate = true
++
++mode = i:taboption("general", ListValue, "Mode", translate("Mode"),
++ translate("Interface Mode is used to prevent unnecessary packet forwarding on switched ethernet interfaces. "..
++ "valid Modes are \"mesh\" and \"ether\". Default is \"mesh\"."))
++mode:value("mesh")
++mode:value("ether")
++mode.optional = true
++mode.rmempty = true
++
++
++weight = i:taboption("general", Value, "Weight", translate("Weight"),
++ translate("When multiple links exist between hosts the weight of interface is used to determine the link to use. "..
++ "Normally the weight is automatically calculated by olsrd based on the characteristics of the interface, "..
++ "but here you can specify a fixed value. Olsrd will choose links with the lowest value.<br />"..
++ "<b>Note:</b> Interface weight is used only when LinkQualityLevel is set to 0. "..
++ "For any other value of LinkQualityLevel, the interface ETX value is used instead."))
++weight.optional = true
++weight.datatype = "uinteger"
++weight.placeholder = "0"
++
++lqmult = i:taboption("general", DynamicList, "LinkQualityMult", translate("LinkQuality Multiplicator"),
++ translate("Multiply routes with the factor given here. Allowed values are between 0.01 and 1.0. "..
++ "It is only used when LQ-Level is greater than 0. Examples:<br />"..
++ "reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />"..
++ "reduce LQ to all nodes on this interface by 20%: default 0.8"))
++lqmult.optional = true
++lqmult.rmempty = true
++lqmult.cast = "table"
++lqmult.placeholder = "default 1.0"
++
++function lqmult.validate(self, value)
++ for _, v in pairs(value) do
++ if v ~= "" then
++ local val = util.split(v, " ")
++ local host = val[1]
++ local mult = val[2]
++ if not host or not mult then
++ return nil, translate("LQMult requires two values (IP address or 'default' and multiplicator) seperated by space.")
++ end
++ if not (host == "default" or ip.IPv4(host) or ip.IPv6(host)) then
++ return nil, translate("Can only be a valid IPv4 or IPv6 address or 'default'")
++ end
++ if not tonumber(mult) or tonumber(mult) > 1 or tonumber(mult) < 0.01 then
++ return nil, translate("Invalid Value for LQMult-Value. Must be between 0.01 and 1.0.")
++ end
++ if not mult:match("[0-1]%.[0-9]+") then
++ return nil, translate("Invalid Value for LQMult-Value. You must use a decimal number between 0.01 and 1.0 here.")
++ end
++ end
++ end
++ return value
++end
++
++ip4b = i:taboption("addrs", Value, "Ip4Broadcast", translate("IPv4 broadcast"),
++ translate("IPv4 broadcast address for outgoing OLSR packets. One useful example would be 255.255.255.255. "..
++ "Default is \"0.0.0.0\", which triggers the usage of the interface broadcast IP."))
++ip4b.optional = true
++ip4b.datatype = "ip4addr"
++ip4b.placeholder = "0.0.0.0"
++
++ip6m = i:taboption("addrs", Value, "IPv6Multicast", translate("IPv6 multicast"),
++ translate("IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal multicast."))
++ip6m.optional = true
++ip6m.datatype = "ip6addr"
++ip6m.placeholder = "FF02::6D"
++
++ip4s = i:taboption("addrs", Value, "IPv4Src", translate("IPv4 source"),
++ translate("IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which triggers usage of the interface IP."))
++ip4s.optional = true
++ip4s.datatype = "ip4addr"
++ip4s.placeholder = "0.0.0.0"
++
++ip6s = i:taboption("addrs", Value, "IPv6Src", translate("IPv6 source"),
++ translate("IPv6 src prefix. OLSRd will choose one of the interface IPs which matches the prefix of this parameter. "..
++ "Default is \"0::/0\", which triggers the usage of a not-linklocal interface IP."))
++ip6s.optional = true
++ip6s.datatype = "ip6addr"
++ip6s.placeholder = "0::/0"
++
++hi = i:taboption("timing", Value, "HelloInterval", translate("Hello interval"))
++hi.optional = true
++hi.datatype = "ufloat"
++hi.placeholder = "5.0"
++hi.write = write_float
++
++hv = i:taboption("timing", Value, "HelloValidityTime", translate("Hello validity time"))
++hv.optional = true
++hv.datatype = "ufloat"
++hv.placeholder = "40.0"
++hv.write = write_float
++
++ti = i:taboption("timing", Value, "TcInterval", translate("TC interval"))
++ti.optional = true
++ti.datatype = "ufloat"
++ti.placeholder = "2.0"
++ti.write = write_float
++
++tv = i:taboption("timing", Value, "TcValidityTime", translate("TC validity time"))
++tv.optional = true
++tv.datatype = "ufloat"
++tv.placeholder = "256.0"
++tv.write = write_float
++
++mi = i:taboption("timing", Value, "MidInterval", translate("MID interval"))
++mi.optional = true
++mi.datatype = "ufloat"
++mi.placeholder = "18.0"
++mi.write = write_float
++
++mv = i:taboption("timing", Value, "MidValidityTime", translate("MID validity time"))
++mv.optional = true
++mv.datatype = "ufloat"
++mv.placeholder = "324.0"
++mv.write = write_float
++
++ai = i:taboption("timing", Value, "HnaInterval", translate("HNA interval"))
++ai.optional = true
++ai.datatype = "ufloat"
++ai.placeholder = "18.0"
++ai.write = write_float
++
++av = i:taboption("timing", Value, "HnaValidityTime", translate("HNA validity time"))
++av.optional = true
++av.datatype = "ufloat"
++av.placeholder = "108.0"
++av.write = write_float
++
++return m
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface6.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface6.lua
+new file mode 100644
+index 0000000..2f0fa6c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface6.lua
+@@ -0,0 +1,164 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local util = require "luci.util"
++local ip = require "luci.ip"
++
++function write_float(self, section, value)
++ local n = tonumber(value)
++ if n ~= nil then
++ return Value.write(self, section, "%.1f" % n)
++ end
++end
++
++m = Map("olsrd6", translate("OLSR Daemon - Interface"),
++ translate("The OLSR daemon is an implementation of the Optimized Link State Routing protocol. "..
++ "As such it allows mesh routing for any network equipment. "..
++ "It runs on any wifi card that supports ad-hoc mode and of course on any ethernet device. "..
++ "Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and documentation."))
++
++m.redirect = luci.dispatcher.build_url("admin/services/olsrd6")
++
++if not arg[1] or m.uci:get("olsrd6", arg[1]) ~= "Interface" then
++ luci.http.redirect(m.redirect)
++ return
++end
++
++i = m:section(NamedSection, arg[1], "Interface", translate("Interface"))
++i.anonymous = true
++i.addremove = false
++
++i:tab("general", translate("General Settings"))
++i:tab("addrs", translate("IP Addresses"))
++i:tab("timing", translate("Timing and Validity"))
++
++ign = i:taboption("general", Flag, "ignore", translate("Enable"),
++ translate("Enable this interface."))
++ign.enabled = "0"
++ign.disabled = "1"
++ign.rmempty = false
++function ign.cfgvalue(self, section)
++ return Flag.cfgvalue(self, section) or "0"
++end
++
++network = i:taboption("general", Value, "interface", translate("Network"),
++ translate("The interface OLSRd should serve."))
++
++network.template = "cbi/network_netlist"
++network.widget = "radio"
++network.nocreate = true
++
++mode = i:taboption("general", ListValue, "Mode", translate("Mode"),
++ translate("Interface Mode is used to prevent unnecessary packet forwarding on switched ethernet interfaces. "..
++ "valid Modes are \"mesh\" and \"ether\". Default is \"mesh\"."))
++mode:value("mesh")
++mode:value("ether")
++mode.optional = true
++mode.rmempty = true
++
++
++weight = i:taboption("general", Value, "Weight", translate("Weight"),
++ translate("When multiple links exist between hosts the weight of interface is used to determine the link to use. "..
++ "Normally the weight is automatically calculated by olsrd based on the characteristics of the interface, "..
++ "but here you can specify a fixed value. Olsrd will choose links with the lowest value.<br />"..
++ "<b>Note:</b> Interface weight is used only when LinkQualityLevel is set to 0. "..
++ "For any other value of LinkQualityLevel, the interface ETX value is used instead."))
++weight.optional = true
++weight.datatype = "uinteger"
++weight.placeholder = "0"
++
++lqmult = i:taboption("general", DynamicList, "LinkQualityMult", translate("LinkQuality Multiplicator"),
++ translate("Multiply routes with the factor given here. Allowed values are between 0.01 and 1.0. "..
++ "It is only used when LQ-Level is greater than 0. Examples:<br />"..
++ "reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />"..
++ "reduce LQ to all nodes on this interface by 20%: default 0.8"))
++lqmult.optional = true
++lqmult.rmempty = true
++lqmult.cast = "table"
++lqmult.placeholder = "default 1.0"
++
++function lqmult.validate(self, value)
++ for _, v in pairs(value) do
++ if v ~= "" then
++ local val = util.split(v, " ")
++ local host = val[1]
++ local mult = val[2]
++ if not host or not mult then
++ return nil, translate("LQMult requires two values (IP address or 'default' and multiplicator) seperated by space.")
++ end
++ if not (host == "default" or ip.IPv6(host)) then
++ return nil, translate("Can only be a valid IPv6 address or 'default'")
++ end
++ if not tonumber(mult) or tonumber(mult) > 1 or tonumber(mult) < 0.01 then
++ return nil, translate("Invalid Value for LQMult-Value. Must be between 0.01 and 1.0.")
++ end
++ if not mult:match("[0-1]%.[0-9]+") then
++ return nil, translate("Invalid Value for LQMult-Value. You must use a decimal number between 0.01 and 1.0 here.")
++ end
++ end
++ end
++ return value
++end
++
++ip6m = i:taboption("addrs", Value, "IPv6Multicast", translate("IPv6 multicast"),
++ translate("IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal multicast."))
++ip6m.optional = true
++ip6m.datatype = "ip6addr"
++ip6m.placeholder = "FF02::6D"
++
++ip6s = i:taboption("addrs", Value, "IPv6Src", translate("IPv6 source"),
++ translate("IPv6 src prefix. OLSRd will choose one of the interface IPs which matches the prefix of this parameter. "..
++ "Default is \"0::/0\", which triggers the usage of a not-linklocal interface IP."))
++ip6s.optional = true
++ip6s.datatype = "ip6addr"
++ip6s.placeholder = "0::/0"
++
++hi = i:taboption("timing", Value, "HelloInterval", translate("Hello interval"))
++hi.optional = true
++hi.datatype = "ufloat"
++hi.placeholder = "5.0"
++hi.write = write_float
++
++hv = i:taboption("timing", Value, "HelloValidityTime", translate("Hello validity time"))
++hv.optional = true
++hv.datatype = "ufloat"
++hv.placeholder = "40.0"
++hv.write = write_float
++
++ti = i:taboption("timing", Value, "TcInterval", translate("TC interval"))
++ti.optional = true
++ti.datatype = "ufloat"
++ti.placeholder = "2.0"
++ti.write = write_float
++
++tv = i:taboption("timing", Value, "TcValidityTime", translate("TC validity time"))
++tv.optional = true
++tv.datatype = "ufloat"
++tv.placeholder = "256.0"
++tv.write = write_float
++
++mi = i:taboption("timing", Value, "MidInterval", translate("MID interval"))
++mi.optional = true
++mi.datatype = "ufloat"
++mi.placeholder = "18.0"
++mi.write = write_float
++
++mv = i:taboption("timing", Value, "MidValidityTime", translate("MID validity time"))
++mv.optional = true
++mv.datatype = "ufloat"
++mv.placeholder = "324.0"
++mv.write = write_float
++
++ai = i:taboption("timing", Value, "HnaInterval", translate("HNA interval"))
++ai.optional = true
++ai.datatype = "ufloat"
++ai.placeholder = "18.0"
++ai.write = write_float
++
++av = i:taboption("timing", Value, "HnaValidityTime", translate("HNA validity time"))
++av.optional = true
++av.datatype = "ufloat"
++av.placeholder = "108.0"
++av.write = write_float
++
++return m
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins.lua
+new file mode 100644
+index 0000000..43d6a08
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins.lua
+@@ -0,0 +1,259 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ip = require "luci.ip"
++local fs = require "nixio.fs"
++
++if arg[1] then
++ mp = Map("olsrd", translate("OLSR - Plugins"))
++
++ p = mp:section(TypedSection, "LoadPlugin", translate("Plugin configuration"))
++ p:depends("library", arg[1])
++ p.anonymous = true
++
++ ign = p:option(Flag, "ignore", translate("Enable"))
++ ign.enabled = "0"
++ ign.disabled = "1"
++ ign.rmempty = false
++ function ign.cfgvalue(self, section)
++ return Flag.cfgvalue(self, section) or "0"
++ end
++
++ lib = p:option(DummyValue, "library", translate("Library"))
++ lib.default = arg[1]
++
++ local function Range(x,y)
++ local t = {}
++ for i = x, y do t[#t+1] = i end
++ return t
++ end
++
++ local function Cidr2IpMask(val)
++ if val then
++ for i = 1, #val do
++ local cidr = ip.IPv4(val[i]) or ip.IPv6(val[i])
++ if cidr then
++ val[i] = cidr:network():string() .. " " .. cidr:mask():string()
++ end
++ end
++ return val
++ end
++ end
++
++ local function IpMask2Cidr(val)
++ if val then
++ for i = 1, #val do
++ local ip, mask = val[i]:gmatch("([^%s]+)%s+([^%s]+)")()
++ local cidr
++ if ip and mask and ip:match(":") then
++ cidr = ip.IPv6(ip, mask)
++ elseif ip and mask then
++ cidr = ip.IPv4(ip, mask)
++ end
++
++ if cidr then
++ val[i] = cidr:string()
++ end
++ end
++ return val
++ end
++ end
++
++
++ local knownPlParams = {
++ ["olsrd_bmf.so.1.5.3"] = {
++ { Value, "BmfInterface", "bmf0" },
++ { Value, "BmfInterfaceIp", "10.10.10.234/24" },
++ { Flag, "DoLocalBroadcast", "no" },
++ { Flag, "CapturePacketsOnOlsrInterfaces", "yes" },
++ { ListValue, "BmfMechanism", { "UnicastPromiscuous", "Broadcast" } },
++ { Value, "BroadcastRetransmitCount", "2" },
++ { Value, "FanOutLimit", "4" },
++ { DynamicList, "NonOlsrIf", "br-lan" }
++ },
++
++ ["olsrd_dyn_gw.so.0.4"] = {
++ { Value, "Interval", "40" },
++ { DynamicList, "Ping", "141.1.1.1" },
++ { DynamicList, "HNA", "192.168.80.0/24", IpMask2Cidr, Cidr2IpMask }
++ },
++
++ ["olsrd_httpinfo.so.0.1"] = {
++ { Value, "port", "80" },
++ { DynamicList, "Host", "163.24.87.3" },
++ { DynamicList, "Net", "0.0.0.0/0", Cidr2IpMask }
++ },
++
++ ["olsrd_nameservice.so.0.3"] = {
++ { DynamicList, "name", "my-name.mesh" },
++ { DynamicList, "hosts", "1.2.3.4 name-for-other-interface.mesh" },
++ { Value, "suffix", ".olsr" },
++ { Value, "hosts_file", "/path/to/hosts_file" },
++ { Value, "add_hosts", "/path/to/file" },
++ { Value, "dns_server", "141.1.1.1" },
++ { Value, "resolv_file", "/path/to/resolv.conf" },
++ { Value, "interval", "120" },
++ { Value, "timeout", "240" },
++ { Value, "lat", "12.123" },
++ { Value, "lon", "12.123" },
++ { Value, "latlon_file", "/var/run/latlon.js" },
++ { Value, "latlon_infile", "/var/run/gps.txt" },
++ { Value, "sighup_pid_file", "/var/run/dnsmasq.pid" },
++ { Value, "name_change_script", "/usr/local/bin/announce_new_hosts.sh" },
++ { DynamicList, "service", "http://me.olsr:80|tcp|my little homepage" },
++ { Value, "services_file", "/var/run/services_olsr" },
++ { Value, "services_change_script", "/usr/local/bin/announce_new_services.sh" },
++ { DynamicList, "mac", "xx:xx:xx:xx:xx:xx[,0-255]" },
++ { Value, "macs_file", "/path/to/macs_file" },
++ { Value, "macs_change_script", "/path/to/script" }
++ },
++
++ ["olsrd_quagga.so.0.2.2"] = {
++ { StaticList, "redistribute", {
++ "system", "kernel", "connect", "static", "rip", "ripng", "ospf",
++ "ospf6", "isis", "bgp", "hsls"
++ } },
++ { ListValue, "ExportRoutes", { "only", "both" } },
++ { Flag, "LocalPref", "true" },
++ { Value, "Distance", Range(0,255) }
++ },
++
++ ["olsrd_secure.so.0.5"] = {
++ { Value, "Keyfile", "/etc/private-olsr.key" }
++ },
++
++ ["olsrd_txtinfo.so.0.1"] = {
++ { Value, "accept", "127.0.0.1" }
++ },
++
++ ["olsrd_jsoninfo.so.0.0"] = {
++ { Value, "accept", "127.0.0.1" },
++ { Value, "port", "9090" },
++ { Value, "UUIDFile", "/etc/olsrd/olsrd.uuid" },
++
++ },
++
++ ["olsrd_watchdog.so.0.1"] = {
++ { Value, "file", "/var/run/olsrd.watchdog" },
++ { Value, "interval", "30" }
++ },
++
++ ["olsrd_mdns.so.1.0.0"] = {
++ { DynamicList, "NonOlsrIf", "lan" }
++ },
++
++ ["olsrd_p2pd.so.0.1.0"] = {
++ { DynamicList, "NonOlsrIf", "lan" },
++ { Value, "P2pdTtl", "10" }
++ },
++
++ ["olsrd_arprefresh.so.0.1"] = {},
++ ["olsrd_dot_draw.so.0.3"] = {},
++ ["olsrd_dyn_gw_plain.so.0.4"] = {},
++ ["olsrd_pgraph.so.1.1"] = {},
++ ["olsrd_tas.so.0.1"] = {}
++ }
++
++
++ -- build plugin options with dependencies
++ if knownPlParams[arg[1]] then
++ for _, option in ipairs(knownPlParams[arg[1]]) do
++ local otype, name, default, uci2cbi, cbi2uci = unpack(option)
++ local values
++
++ if type(default) == "table" then
++ values = default
++ default = default[1]
++ end
++
++ if otype == Flag then
++ local bool = p:option( Flag, name, name )
++ if default == "yes" or default == "no" then
++ bool.enabled = "yes"
++ bool.disabled = "no"
++ elseif default == "on" or default == "off" then
++ bool.enabled = "on"
++ bool.disabled = "off"
++ elseif default == "1" or default == "0" then
++ bool.enabled = "1"
++ bool.disabled = "0"
++ else
++ bool.enabled = "true"
++ bool.disabled = "false"
++ end
++ bool.optional = true
++ bool.default = default
++ bool:depends({ library = plugin })
++ else
++ local field = p:option( otype, name, name )
++ if values then
++ for _, value in ipairs(values) do
++ field:value( value )
++ end
++ end
++ if type(uci2cbi) == "function" then
++ function field.cfgvalue(self, section)
++ return uci2cbi(otype.cfgvalue(self, section))
++ end
++ end
++ if type(cbi2uci) == "function" then
++ function field.formvalue(self, section)
++ return cbi2uci(otype.formvalue(self, section))
++ end
++ end
++ field.optional = true
++ field.default = default
++ --field:depends({ library = arg[1] })
++ end
++ end
++ end
++
++ return mp
++
++else
++
++ mpi = Map("olsrd", translate("OLSR - Plugins"))
++
++ local plugins = {}
++ mpi.uci:foreach("olsrd", "LoadPlugin",
++ function(section)
++ if section.library and not plugins[section.library] then
++ plugins[section.library] = true
++ end
++ end
++ )
++
++ -- create a loadplugin section for each found plugin
++ for v in fs.dir("/usr/lib") do
++ if v:sub(1, 6) == "olsrd_" then
++ if not plugins[v] then
++ mpi.uci:section(
++ "olsrd", "LoadPlugin", nil,
++ { library = v, ignore = 1 }
++ )
++ end
++ end
++ end
++
++ t = mpi:section( TypedSection, "LoadPlugin", translate("Plugins") )
++ t.anonymous = true
++ t.template = "cbi/tblsection"
++ t.override_scheme = true
++ function t.extedit(self, section)
++ local lib = self.map:get(section, "library") or ""
++ return luci.dispatcher.build_url("admin", "services", "olsrd", "plugins") .. "/" .. lib
++ end
++
++ ign = t:option( Flag, "ignore", translate("Enabled") )
++ ign.enabled = "0"
++ ign.disabled = "1"
++ ign.rmempty = false
++ function ign.cfgvalue(self, section)
++ return Flag.cfgvalue(self, section) or "0"
++ end
++
++ t:option( DummyValue, "library", translate("Library") )
++
++ return mpi
++end
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins6.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins6.lua
+new file mode 100644
+index 0000000..d1c68be
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins6.lua
+@@ -0,0 +1,259 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ip = require "luci.ip"
++local fs = require "nixio.fs"
++
++if arg[1] then
++ mp = Map("olsrd6", translate("OLSR - Plugins"))
++
++ p = mp:section(TypedSection, "LoadPlugin", translate("Plugin configuration"))
++ p:depends("library", arg[1])
++ p.anonymous = true
++
++ ign = p:option(Flag, "ignore", translate("Enable"))
++ ign.enabled = "0"
++ ign.disabled = "1"
++ ign.rmempty = false
++ function ign.cfgvalue(self, section)
++ return Flag.cfgvalue(self, section) or "0"
++ end
++
++ lib = p:option(DummyValue, "library", translate("Library"))
++ lib.default = arg[1]
++
++ local function Range(x,y)
++ local t = {}
++ for i = x, y do t[#t+1] = i end
++ return t
++ end
++
++ local function Cidr2IpMask(val)
++ if val then
++ for i = 1, #val do
++ local cidr = ip.IPv4(val[i]) or ip.IPv6(val[i])
++ if cidr then
++ val[i] = cidr:network():string() .. " " .. cidr:mask():string()
++ end
++ end
++ return val
++ end
++ end
++
++ local function IpMask2Cidr(val)
++ if val then
++ for i = 1, #val do
++ local ip, mask = val[i]:gmatch("([^%s]+)%s+([^%s]+)")()
++ local cidr
++ if ip and mask and ip:match(":") then
++ cidr = ip.IPv6(ip, mask)
++ elseif ip and mask then
++ cidr = ip.IPv4(ip, mask)
++ end
++
++ if cidr then
++ val[i] = cidr:string()
++ end
++ end
++ return val
++ end
++ end
++
++
++ local knownPlParams = {
++ ["olsrd_bmf.so.1.5.3"] = {
++ { Value, "BmfInterface", "bmf0" },
++ { Value, "BmfInterfaceIp", "10.10.10.234/24" },
++ { Flag, "DoLocalBroadcast", "no" },
++ { Flag, "CapturePacketsOnOlsrInterfaces", "yes" },
++ { ListValue, "BmfMechanism", { "UnicastPromiscuous", "Broadcast" } },
++ { Value, "BroadcastRetransmitCount", "2" },
++ { Value, "FanOutLimit", "4" },
++ { DynamicList, "NonOlsrIf", "br-lan" }
++ },
++
++ ["olsrd_dyn_gw.so.0.4"] = {
++ { Value, "Interval", "40" },
++ { DynamicList, "Ping", "141.1.1.1" },
++ { DynamicList, "HNA", "192.168.80.0/24", IpMask2Cidr, Cidr2IpMask }
++ },
++
++ ["olsrd_httpinfo.so.0.1"] = {
++ { Value, "port", "80" },
++ { DynamicList, "Host", "163.24.87.3" },
++ { DynamicList, "Net", "0.0.0.0/0", Cidr2IpMask }
++ },
++
++ ["olsrd_nameservice.so.0.3"] = {
++ { DynamicList, "name", "my-name.mesh" },
++ { DynamicList, "hosts", "1.2.3.4 name-for-other-interface.mesh" },
++ { Value, "suffix", ".olsr" },
++ { Value, "hosts_file", "/path/to/hosts_file" },
++ { Value, "add_hosts", "/path/to/file" },
++ { Value, "dns_server", "141.1.1.1" },
++ { Value, "resolv_file", "/path/to/resolv.conf" },
++ { Value, "interval", "120" },
++ { Value, "timeout", "240" },
++ { Value, "lat", "12.123" },
++ { Value, "lon", "12.123" },
++ { Value, "latlon_file", "/var/run/latlon.js.ipv6" },
++ { Value, "latlon_infile", "/var/run/gps.txt" },
++ { Value, "sighup_pid_file", "/var/run/dnsmasq.pid" },
++ { Value, "name_change_script", "/usr/local/bin/announce_new_hosts.sh" },
++ { DynamicList, "service", "http://me.olsr:80|tcp|my little homepage" },
++ { Value, "services_file", "/var/run/services_olsr" },
++ { Value, "services_change_script", "/usr/local/bin/announce_new_services.sh" },
++ { DynamicList, "mac", "xx:xx:xx:xx:xx:xx[,0-255]" },
++ { Value, "macs_file", "/path/to/macs_file" },
++ { Value, "macs_change_script", "/path/to/script" }
++ },
++
++ ["olsrd_quagga.so.0.2.2"] = {
++ { StaticList, "redistribute", {
++ "system", "kernel", "connect", "static", "rip", "ripng", "ospf",
++ "ospf6", "isis", "bgp", "hsls"
++ } },
++ { ListValue, "ExportRoutes", { "only", "both" } },
++ { Flag, "LocalPref", "true" },
++ { Value, "Distance", Range(0,255) }
++ },
++
++ ["olsrd_secure.so.0.5"] = {
++ { Value, "Keyfile", "/etc/private-olsr.key" }
++ },
++
++ ["olsrd_txtinfo.so.0.1"] = {
++ { Value, "accept", "::1/128" }
++ },
++
++ ["olsrd_jsoninfo.so.0.0"] = {
++ { Value, "accept", "::1/128" },
++ { Value, "port", "9090" },
++ { Value, "UUIDFile", "/etc/olsrd/olsrd.uuid.ipv6" },
++
++ },
++
++ ["olsrd_watchdog.so.0.1"] = {
++ { Value, "file", "/var/run/olsrd.watchdog.ipv6" },
++ { Value, "interval", "30" }
++ },
++
++ ["olsrd_mdns.so.1.0.0"] = {
++ { DynamicList, "NonOlsrIf", "lan" }
++ },
++
++ ["olsrd_p2pd.so.0.1.0"] = {
++ { DynamicList, "NonOlsrIf", "lan" },
++ { Value, "P2pdTtl", "10" }
++ },
++
++ ["olsrd_arprefresh.so.0.1"] = {},
++ ["olsrd_dot_draw.so.0.3"] = {},
++ ["olsrd_dyn_gw_plain.so.0.4"] = {},
++ ["olsrd_pgraph.so.1.1"] = {},
++ ["olsrd_tas.so.0.1"] = {}
++ }
++
++
++ -- build plugin options with dependencies
++ if knownPlParams[arg[1]] then
++ for _, option in ipairs(knownPlParams[arg[1]]) do
++ local otype, name, default, uci2cbi, cbi2uci = unpack(option)
++ local values
++
++ if type(default) == "table" then
++ values = default
++ default = default[1]
++ end
++
++ if otype == Flag then
++ local bool = p:option( Flag, name, name )
++ if default == "yes" or default == "no" then
++ bool.enabled = "yes"
++ bool.disabled = "no"
++ elseif default == "on" or default == "off" then
++ bool.enabled = "on"
++ bool.disabled = "off"
++ elseif default == "1" or default == "0" then
++ bool.enabled = "1"
++ bool.disabled = "0"
++ else
++ bool.enabled = "true"
++ bool.disabled = "false"
++ end
++ bool.optional = true
++ bool.default = default
++ bool:depends({ library = plugin })
++ else
++ local field = p:option( otype, name, name )
++ if values then
++ for _, value in ipairs(values) do
++ field:value( value )
++ end
++ end
++ if type(uci2cbi) == "function" then
++ function field.cfgvalue(self, section)
++ return uci2cbi(otype.cfgvalue(self, section))
++ end
++ end
++ if type(cbi2uci) == "function" then
++ function field.formvalue(self, section)
++ return cbi2uci(otype.formvalue(self, section))
++ end
++ end
++ field.optional = true
++ field.default = default
++ --field:depends({ library = arg[1] })
++ end
++ end
++ end
++
++ return mp
++
++else
++
++ mpi = Map("olsrd6", translate("OLSR - Plugins"))
++
++ local plugins = {}
++ mpi.uci:foreach("olsrd6", "LoadPlugin",
++ function(section)
++ if section.library and not plugins[section.library] then
++ plugins[section.library] = true
++ end
++ end
++ )
++
++ -- create a loadplugin section for each found plugin
++ for v in fs.dir("/usr/lib") do
++ if v:sub(1, 6) == "olsrd_" then
++ if not plugins[v] then
++ mpi.uci:section(
++ "olsrd6", "LoadPlugin", nil,
++ { library = v, ignore = 1 }
++ )
++ end
++ end
++ end
++
++ t = mpi:section( TypedSection, "LoadPlugin", translate("Plugins") )
++ t.anonymous = true
++ t.template = "cbi/tblsection"
++ t.override_scheme = true
++ function t.extedit(self, section)
++ local lib = self.map:get(section, "library") or ""
++ return luci.dispatcher.build_url("admin", "services", "olsrd6", "plugins") .. "/" .. lib
++ end
++
++ ign = t:option( Flag, "ignore", translate("Enabled") )
++ ign.enabled = "0"
++ ign.disabled = "1"
++ ign.rmempty = false
++ function ign.cfgvalue(self, section)
++ return Flag.cfgvalue(self, section) or "0"
++ end
++
++ t:option( DummyValue, "library", translate("Library") )
++
++ return mpi
++end
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/tools/olsr.lua b/feeds/luci/applications/luci-app-olsr/luasrc/tools/olsr.lua
+new file mode 100644
+index 0000000..781b265
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/tools/olsr.lua
+@@ -0,0 +1,33 @@
++-- Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.tools.olsr", package.seeall)
++
++function etx_color(etx)
++ local color = "#bb3333"
++ if etx == 0 then
++ color = "#bb3333"
++ elseif etx < 2 then
++ color = "#00cc00"
++ elseif etx < 4 then
++ color = "#ffcb05"
++ elseif etx < 10 then
++ color = "#ff6600"
++ end
++ return color
++end
++
++function snr_color(snr)
++ local color = "#bb3333"
++ if snr == 0 then
++ color = "#bb3333"
++ elseif snr > 30 then
++ color = "#00cc00"
++ elseif snr > 20 then
++ color = "#ffcb05"
++ elseif snr > 5 then
++ color = "#ff6600"
++ end
++ return color
++end
++
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/common_js.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/common_js.htm
+new file mode 100644
+index 0000000..1ee763e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/common_js.htm
+@@ -0,0 +1,35 @@
++<% if has_v4 and has_v6 then %>
++<script type="text/javascript">//<![CDATA[
++
++function css(selector, property, value) {
++ for (var i=0; i<document.styleSheets.length;i++) {
++ try { document.styleSheets[i].insertRule(selector+ ' {'+property+':'+value+'}', document.styleSheets[i].cssRules.length);
++ } catch(err) {try { document.styleSheets[i].addRule(selector, property+':'+value);} catch(err) {}}//IE
++ }
++}
++
++window.onload = function() {
++ buttons = '<input type="button" name="show-proto-4" id="show-proto-4" class="cbi-button cbi-button-apply" style="margin-right: 5px" value="<%:Hide IPv4%>">'
++ buttons += '<input type="button" name="show-proto-6" id="show-proto-6" class="cbi-button cbi-button-apply" value="<%:Hide IPv6%>">'
++
++ document.getElementById('togglebuttons').innerHTML = buttons;
++
++ var visible = true;
++ document.getElementById('show-proto-4').onclick = function() {
++ visible = !visible;
++ document.getElementById('show-proto-4').value = visible ? '<%:Hide IPv4%>' : '<%:Show IPv4%>';
++ document.getElementById('show-proto-4').className = visible ? 'cbi-button cbi-button-apply' : 'cbi-button cbi-button-reset';
++ css('.proto-4', 'display', visible ? 'table-row' : 'none')
++ };
++
++ var visible6 = true;
++ document.getElementById('show-proto-6').onclick = function() {
++ visible6 = !visible6;
++ document.getElementById('show-proto-6').value = visible6 ? '<%:Hide IPv6%>' : '<%:Show IPv6%>';
++ document.getElementById('show-proto-6').className = visible6 ? 'cbi-button cbi-button-apply' : 'cbi-button cbi-button-reset';
++ css('.proto-6', 'display', visible6 ? 'table-row' : 'none')
++ };
++
++}
++//]]></script>
++<%end %>
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/error_olsr.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/error_olsr.htm
+new file mode 100644
+index 0000000..eb41219
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/error_olsr.htm
+@@ -0,0 +1,11 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content"><%:OLSR Daemon%></h2>
++<p class="error"><%:Unable to connect to the OLSR daemon!%></p>
++<p><%:Make sure that OLSRd is running, the "jsoninfo" plugin is loaded, configured on port 9090 and accepts connections from "127.0.0.1".%></p>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm
+new file mode 100644
+index 0000000..5ea7b74
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm
+@@ -0,0 +1,122 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++local i = 1
++
++if luci.http.formvalue("status") == "1" then
++ local rv = {}
++ for k, hna in ipairs(hna) do
++ rv[#rv+1] = {
++ proto = hna["proto"],
++ destination = hna["destination"],
++ genmask = hna["genmask"],
++ gateway = hna["gateway"],
++ hostname = hna["hostname"],
++ validityTime = hna["validityTime"]
++ }
++ end
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++ return
++end
++%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
++ function(x, info)
++ {
++ var hnadiv = document.getElementById('olsrd_hna');
++ if (hnadiv)
++ {
++ var s = '';
++ for (var idx = 0; idx < info.length; idx++)
++ {
++ var hna = info[idx];
++ var linkgw = ''
++ s += '<tr class="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 {
++ linkgw = '<a href="http://' + hna.gateway + '/cgi-bin-status.html">' + hna.gateway + '</a>'
++ }
++
++ if (hna.validityTime != undefined) {
++ validity = hna.validityTime + 's'
++ } else {
++ validity = '-'
++ }
++
++ if (hna.hostname != undefined) {
++ hostname = ' / <a href="http://' + hna.hostname + '/cgi-bin-status.html">' + hna.hostname + '</a>'
++ } else {
++ hostname = ''
++ }
++
++ 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
++ )
++ s += '</tr>'
++ }
++ hnadiv.innerHTML = s;
++ }
++}
++);
++//]]></script>
++
++<h2 name="content"><%:Active host net announcements%></h2>
++
++<div id="togglebuttons"></div>
++<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>
++
++ </thead>
++ <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">
++ <% if hna[k].proto == '6' then %>
++ <a href="http://[<%=hna[k].gateway%>]/cgi-bin-status.html"><%=hna[k].gateway%></a>
++ <% else %>
++ <a href="http://<%=hna[k].gateway%>/cgi-bin-status.html"><%=hna[k].gateway%></a>
++ <% end %>
++ <% if hna[k].hostname then %>
++ / <a href="http://<%=hna[k].hostname%>/cgi-bin-status.html"><%=hna[k].hostname%></a>
++ <% end %>
++ </td>
++ <% if hna[k].validityTime then
++ validity = hna[k].validityTime .. 's'
++ else
++ validity = '-'
++ end %>
++
++ <td class="cbi-section-table-cell"><%=validity%></td>
++ </tr>
++
++ <% i = ((i % 2) + 1)
++ end %>
++ </tbody>
++ </table>
++</fieldset>
++
++<%+status-olsr/common_js%>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm
+new file mode 100644
+index 0000000..81d0a3d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm
+@@ -0,0 +1,50 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++local i = 1
++%>
++
++<%+header%>
++
++<h2 name="content"><%:Interfaces%></h2>
++
++<div id="togglebuttons"></div>
++
++<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>
++
++ <% 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>
++ <% i = ((i % 2) + 1)
++ end %>
++ </table>
++</fieldset>
++<%+status-olsr/common_js%>
++<%+footer%>
++
++
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/legend.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/legend.htm
+new file mode 100644
+index 0000000..2f59848
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/legend.htm
+@@ -0,0 +1,24 @@
++<h3><%:Legend%>:</h3>
++<ul>
++ <li><strong>LQ: </strong><%:Success rate of packages received from the neighbour%></li>
++ <li><strong>NLQ: </strong><%:Success rate of packages sent to the neighbour%></li>
++ <li><strong>ETX: </strong><%:Expected retransmission count%></li>
++ <li style="list-style: none">
++ <ul>
++ <li><strong><span style="color:#00cc00"><%:Green%></span></strong>:<%:Very good (ETX < 2)%></li>
++ <li><strong><span style="color:#ffcb05"><%:Yellow%></span></strong>:<%:Good (2 < ETX < 4)%></li>
++ <li><strong><span style="color:#ff6600"><%:Orange%></span></strong>:<%:Still usable (4 < ETX < 10)%></li>
++ <li><strong><span style="color:#bb3333"><%:Red%></span></strong>:<%:Bad (ETX > 10)%></li>
++ </ul>
++ </li>
++ <li><strong>SNR: </strong><%:Signal Noise Ratio in dB%></li>
++ <li style="list-style: none">
++ <ul>
++ <li><strong><span style="color:#00cc00"><%:Green%></span></strong>:<%:Very good (SNR > 30)%></li>
++ <li><strong><span style="color:#ffcb05"><%:Yellow%></span></strong>:<%:Good (30 > SNR > 20)%></li>
++ <li><strong><span style="color:#ff6600"><%:Orange%></span></strong>:<%:Still usable (20 > SNR > 5)%></li>
++ <li><strong><span style="color:#bb3333"><%:Red%></span></strong>:<%:Bad (SNR < 5)%></li>
++ </ul>
++ </li>
++</ul>
++
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm
+new file mode 100644
+index 0000000..f658288
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm
+@@ -0,0 +1,50 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++local i = 1
++%>
++
++<%+header%>
++<h2 name="content"><%:Active MID announcements%></h2>
++
++<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>
++
++ <% for k, mid in ipairs(mids) do
++ local aliases = ''
++ for k,v in ipairs(mid.aliases) do
++ if aliases == '' then
++ sep = ''
++ else
++ sep = ', '
++ end
++ aliases = v.ipAddress .. sep .. aliases
++ end
++ local host = mid.ipAddress
++ if mid.proto == '6' then
++ host = '[' .. mid.ipAddress .. ']'
++ 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>
++
++ <% i = ((i % 2) + 1)
++ end %>
++ </table>
++</fieldset>
++<%+status-olsr/common_js%>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm
+new file mode 100644
+index 0000000..31dd7d0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm
+@@ -0,0 +1,174 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++local olsrtools = require "luci.tools.olsr"
++local i = 1
++
++if luci.http.formvalue("status") == "1" then
++ local rv = {}
++ for k, link in ipairs(links) do
++ link.linkCost = tonumber(link.linkCost)/1024 or 0
++ if link.linkCost == 4096 then
++ link.linkCost = 0
++ end
++ local color = olsrtools.etx_color(link.linkCost)
++ local snr_color = olsrtools.snr_color(link.snr)
++ defaultgw_color = ""
++ if link.defaultgw == 1 then
++ defaultgw_color = "#ffff99"
++ end
++
++ rv[#rv+1] = {
++ rip = link.remoteIP,
++ hn = link.hostname,
++ lip = link.localIP,
++ ifn = link.interface,
++ lq = string.format("%.3f", link.linkQuality),
++ nlq = string.format("%.3f",link.neighborLinkQuality),
++ cost = string.format("%.3f", link.linkCost),
++ snr = link.snr,
++ signal = link.signal,
++ noise = link.noise,
++ color = color,
++ snr_color = snr_color,
++ dfgcolor = defaultgw_color,
++ proto = link.proto
++ }
++ end
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++ return
++end
++%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++
++ XHR.poll(10 , '<%=REQUEST_URI%>', { status: 1 },
++ function(x, info)
++ {
++ var nt = document.getElementById('olsr_neigh_table');
++ if (nt)
++ {
++ var s = '';
++ for (var idx = 0; idx < info.length; idx++)
++ {
++ var neigh = info[idx];
++
++ 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>',
++ 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>',
++ 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>',
++ neigh.dfgcolor, neigh.hn, neigh.hn
++ );
++ } else {
++ s += String.format(
++ '<td class="cbi-section-table-titles" style="background-color:%s">?</td>',
++ 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>',
++ 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 || '?'
++ );
++ }
++
++ nt.innerHTML = s;
++ }
++ }
++ );
++//]]></script>
++
++
++<h2 name="content"><%:OLSR connections%></h2>
++
++<div id="togglebuttons"></div>
++
++<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>
++
++ <tbody id="olsr_neigh_table">
++ <% local i = 1
++ for k, link in ipairs(links) do
++ link.linkCost = tonumber(link.linkCost)/1024 or 0
++ if link.linkCost == 4096 then
++ link.linkCost = 0
++ end
++
++ color = olsrtools.etx_color(link.linkCost)
++ snr_color = olsrtools.snr_color(link.snr)
++
++ if link.snr == 0 then
++ link.snr = '?'
++ end
++
++ defaultgw_color = ""
++ if link.defaultgw == 1 then
++ defaultgw_color = "#ffff99"
++ end
++ %>
++
++ <tr class="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>
++ <% 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>
++ <% 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>
++ <%
++ i = ((i % 2) + 1)
++ end %>
++ </tbody>
++ </table>
++<br />
++
++<%+status-olsr/legend%>
++</fieldset>
++<%+status-olsr/common_js%>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm
+new file mode 100644
+index 0000000..61e17b3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm
+@@ -0,0 +1,221 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++
++has_ipv4_conf = luci.model.uci.cursor():get_first("olsrd", "olsrd", "IpVersion")
++has_ipv6_conf = luci.model.uci.cursor():get_first("olsrd6", "olsrd", "IpVersion")
++
++function write_conf(conf, file)
++ local fs = require "nixio.fs"
++ if fs.access(conf) then
++ luci.http.header("Content-Disposition", "attachment; filename="..file)
++ luci.http.prepare_content("text/plain")
++ luci.http.write(fs.readfile(conf))
++ end
++end
++
++conf = luci.http.formvalue()
++
++if conf.openwrt_v4 then
++ write_conf("/etc/config/olsrd", "olsrd")
++ return false
++end
++
++if conf.openwrt_v6 then
++ write_conf("/etc/config/olsrd6", "olsrd6")
++ return false
++end
++
++if conf.conf_v4 then
++ write_conf("/var/etc/olsrd.conf", "olsrd.conf")
++ return false
++end
++
++if conf.conf_v6 then
++ write_conf("/var/etc/olsrd6.conf", "olsrd6.conf")
++ return false
++end
++
++%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++
++XHR.poll(10, '<%=REQUEST_URI%>/json', { },
++ function(x, info)
++ {
++ var e;
++
++ if (! info) {
++ document.getElementById('error').innerHTML = '<%:Could not get any data. Make sure the jsoninfo plugin is installed and allows connections from localhost.%>';
++ return
++ }
++ document.getElementById('error').innerHTML = '';
++
++ if (e = document.getElementById('version'))
++ var version;
++ var date;
++ if (info.v4.config.olsrdVersion != undefined) {
++ version = info.v4.config.olsrdVersion
++ date = info.v4.config.olsrdBuildDate
++ } else if (info.v6.config.olsrdVersion != undefined) {
++ version = info.v6.config.olsrdVersion
++ date = info.v6.config.olsrdBuildDate
++ } else {
++ version = 'unknown'
++ date = 'unknown'
++ }
++ e.innerHTML = version + '<br />' + date;
++
++ if (e = document.getElementById('nr_neigh'))
++ var neigh = 0;
++ if (info.v4.links != undefined) {
++ neigh = neigh + info.v4.links.length
++ }
++ if (info.v6.links != undefined) {
++ neigh = neigh + info.v6.links.length
++ }
++ e.innerHTML = neigh;
++
++
++ if (e = document.getElementById('nr_hna'))
++ var hna = 0;
++ if (info.v4.hna != undefined) {
++ hna = hna + info.v4.hna.length
++ }
++ if (info.v6.hna != undefined) {
++ hna = hna + info.v6.hna.length
++ }
++ e.innerHTML = hna;
++
++
++ if (e = document.getElementById('nr_ifaces'))
++ var nrint = 0
++ if (info.v4.interfaces != undefined) {
++ nrint = nrint + info.v4.interfaces.length
++ }
++ if (info.v6.interfaces != undefined) {
++ nrint = nrint + info.v6.interfaces.length
++ }
++ e.innerHTML = nrint
++
++
++ if (e = document.getElementById('nr_topo'))
++ var topo = 0;
++ var nodes = [];
++
++ Array.prototype.contains = function (element) {
++ for (var i = 0; i < this.length; i++) {
++ if (this[i] == element) {
++ return true;
++ }
++ }
++ return false;
++ }
++
++ if (info.v4.topology != undefined) {
++ topo = topo + info.v4.topology.length;
++ for (var i = 0; i < info.v4.topology.length; i++) {
++ var destip = info.v4.topology[i].destinationIP
++ if (! nodes.contains(destip) ) {
++ nodes.push(destip)
++ }
++ }
++ }
++
++ if (info.v6.topology != undefined) {
++ topo = topo + info.v6.topology.length
++ for (var i = 0; i < info.v6.topology.length; i++) {
++ var destip = info.v6.topology[i].destinationIP
++ if (! nodes.contains(destip) ) {
++ nodes.push(destip)
++ }
++ }
++
++ }
++ e.innerHTML = topo;
++
++ if (e = document.getElementById('nr_nodes'))
++ e.innerHTML = nodes.length;
++
++ if (e = document.getElementById('meshfactor'))
++ var meshfactor = topo / nodes.length
++ e.innerHTML = meshfactor.toFixed(2)
++ }
++ );
++//]]></script>
++
++
++<div id="error" class="error"></div>
++
++<h2 name="content">OLSR <%:Overview%></h2>
++
++<fieldset class="cbi-section">
++ <legend><%:Network%></legend>
++
++ <table width="100%" cellspacing="10">
++ <tr><td width="33%"><%:Interfaces%></td><td>
++ <a href="<%=REQUEST_URI%>/interfaces">
++ <span id="nr_ifaces">-<span>
++ </a>
++ </td></tr>
++ <tr><td width="33%"><%:Neighbors%></td><td>
++ <a href="<%=REQUEST_URI%>/neighbors">
++ <span id="nr_neigh">-</span>
++ </a>
++ </td></tr>
++ <tr><td width="33%"><%:Nodes%></td><td>
++ <a href="<%=REQUEST_URI%>/topology">
++ <span id="nr_nodes">-</span>
++ </a>
++ </td></tr>
++ <tr><td width="33%"><%:HNA%></td><td>
++ <a href="<%=REQUEST_URI%>/hna">
++ <span id="nr_hna">-</span>
++ </a>
++ </td></tr>
++ <tr><td width="33%"><%:Links total%></td><td>
++ <a href="<%=REQUEST_URI%>/topology">
++ <span id="nr_topo">-</span>
++ </a>
++ </td></tr>
++ <tr><td width="33%"><%:Links per node (average)%></td><td>
++ <span id="meshfactor">-</span>
++ </td></tr>
++
++
++ </table>
++</fieldset>
++
++
++<fieldset class="cbi-section">
++ <legend>OLSR <%:Configuration%></legend>
++ <table width="100%" cellspacing="10">
++ <tr><td width="33%"><%:Version%></td><td>
++ <span id="version">-<span>
++ </td></tr>
++ <tr><td width="33%"><%:Download Config%></td><td>
++ <% if has_ipv4_conf then %>
++ <a href="<%=REQUEST_URI%>?openwrt_v4">OpenWrt (IPv4)</a>,
++ <% end %>
++ <% if has_ipv6_conf then %>
++ <a href="<%=REQUEST_URI%>?openwrt_v6">OpenWrt (IPv6)</a>,
++ <% end %>
++ <% if has_ipv4_conf then %>
++ <a href="<%=REQUEST_URI%>?conf_v4">OLSRD (IPv4)</a>,
++ <% end %>
++ <% if has_ipv6_conf then %>
++ <a href="<%=REQUEST_URI%>?conf_v6">OLSRD (IPv6)</a>
++ <% end %>
++ </td></tr>
++ </table>
++</fieldset>
++
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm
+new file mode 100644
+index 0000000..8e46daa
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm
+@@ -0,0 +1,142 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++
++local olsrtools = require "luci.tools.olsr"
++local i = 1
++
++if luci.http.formvalue("status") == "1" then
++ local rv = {}
++ for k, route in ipairs(routes) do
++ local ETX = string.format("%.3f", tonumber(route.rtpMetricCost)/1024 or 0)
++ rv[#rv+1] = {
++ hostname = route.hostname,
++ dest = route.destination,
++ genmask = route.genmask,
++ gw = route.gateway,
++ interface = route.networkInterface,
++ metric = route.metric,
++ etx = ETX,
++ color = olsrtools.etx_color(tonumber(ETX))
++ }
++ end
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++ return
++end
++
++%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++
++XHR.poll(20, '<%=REQUEST_URI%>', { status: 1 },
++ function(x, info)
++ {
++
++ var rt = document.getElementById('olsrd_routes');
++ if (rt)
++ {
++ var s = '';
++ for (var idx = 0; idx < info.length; idx++)
++ {
++ 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">' +
++ '<a href="http://%s/cgi-bin-status.html">%s</a>',
++ route.proto, route.dest, route.genmask, route.gw, route.gw
++ )
++
++ if (route.hostname) {
++ if (hna.proto == '6') {
++ s += String.format(
++ ' / <a href="http://[%s]/cgi-bin-status.html">%s</a>',
++ route.hostname, route.hostname || '?'
++ );
++ } else {
++ s += String.format(
++ ' / <a href="http://%s/cgi-bin-status.html">%s</a>',
++ route.hostname, route.hostname || '?'
++ );
++ }
++
++ }
++ 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>',
++ route.interface, route.metric, route.color, route.etx || '?'
++ );
++ }
++ }
++ rt.innerHTML = s;
++
++ }
++ );
++//]]></script>
++
++
++
++<h2 name="content"><%:Known OLSR routes%></h2>
++
++<div id="togglebuttons"></div>
++
++<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>
++
++ <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">
++ <% if route.proto == '6' then %>
++ <a href="http://[<%=route.gateway%>]/cgi-bin-status.html"><%=route.gateway%></a>
++ <% else %>
++ <a href="http://<%=route.gateway%>/cgi-bin-status.html"><%=route.gateway%></a>
++ <% end %>
++ <% 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>
++ <%
++ i = ((i % 2) + 1)
++ end %>
++ </tbody>
++</table>
++
++<%+status-olsr/legend%>
++</fieldset>
++<%+status-olsr/common_js%>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm
+new file mode 100644
+index 0000000..6aa7a75
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm
+@@ -0,0 +1,152 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++local i = 1
++require("luci.model.uci")
++local uci = luci.model.uci.cursor_state()
++
++uci:foreach("olsrd", "olsrd", function(s)
++ if s.SmartGateway and s.SmartGateway == "yes" then has_smartgw = true end
++end)
++
++
++if luci.http.formvalue("status") == "1" then
++ local rv = {}
++ for k, gw in ipairs(gws) do
++ gw.tcPathCost = tonumber(gw.tcPathCost)/1024 or 0
++ if gw.tcPathCost == 4096 then
++ gw.tcPathCost = 0
++ end
++
++ rv[#rv+1] = {
++ proto = gw.proto,
++ ipAddress = gw.ipAddress,
++ status = gw.ipv4Status or gw.ipv6Status,
++ tcPathCost = string.format("%.3f", gw.tcPathCost),
++ hopCount = gw.hopCount,
++ uplinkSpeed = gw.uplinkSpeed,
++ downlinkSpeed = gw.downlinkSpeed,
++ v4 = gw.ipv4 and luci.i18n.translate('yes') or luci.i18n.translate('no'),
++ v6 = gw.ipv6 and luci.i18n.translate('yes') or luci.i18n.translate('no'),
++ externalPrefix = gw.externalPrefix
++ }
++ end
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++ return
++end
++%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++XHR.poll(10, '<%=REQUEST_URI%>', { status: 1 },
++ function(x, info)
++ {
++ var smartgwdiv = document.getElementById('olsrd_smartgw');
++ if (smartgwdiv)
++ {
++ var s = '';
++ 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 + '">'
++ if (smartgw.proto == '6') {
++ linkgw = '<a href="http://[' + smartgw.ipAddress + ']/cgi-bin-status.html">' + smartgw.ipAddress + '</a>'
++ } else {
++ linkgw = '<a href="http://' + smartgw.ipAddress + '/cgi-bin-status.html">' + smartgw.ipAddress + '</a>'
++ }
++
++ 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>',
++ linkgw, smartgw.status, smartgw.tcPathCost, smartgw.hopCount, smartgw.uplinkSpeed, smartgw.downlinkSpeed, smartgw.v4, smartgw.v6, smartgw.externalPrefix
++ )
++ s += '</tr>'
++ }
++ smartgwdiv.innerHTML = s;
++ }
++}
++);
++//]]></script>
++
++
++<%+header%>
++
++<h2 name="content"><%:SmartGW announcements%></h2>
++
++<div id="togglebuttons"></div>
++
++<% if has_smartgw then %>
++
++ <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">
++ <% for k, gw in ipairs(gws) do
++
++ gw.tcPathCost = tonumber(gw.tcPathCost)/1024 or 0
++ if gw.tcPathCost == 4096 then
++ gw.tcPathCost = 0
++ end
++ %>
++
++ <tr class="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>
++ <% else %>
++ <td class="cbi-section-table-cell"><a href="http://<%=gw.ipAddress%>/cgi-bin-status.html"><%=gw.ipAddress%></a></td>
++ <% 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>
++
++ <% i = ((i % 2) + 1)
++ end %>
++ </tbody>
++ </table>
++ </fieldset>
++
++<% else %>
++
++ <%:SmartGateway is not configured on this system.%>
++
++<% end %>
++
++<%+status-olsr/common_js%>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm
+new file mode 100644
+index 0000000..b3abeae
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm
+@@ -0,0 +1,62 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++local i = 1
++local olsrtools = require "luci.tools.olsr"
++%>
++
++<%+header%>
++<h2 name="content"><%:Active OLSR nodes%></h2>
++
++<div id="togglebuttons"></div>
++
++<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>
++
++ <% for k, route in ipairs(routes) do
++ local cost = string.format("%.3f", tonumber(route.tcEdgeCost/1024) or 0)
++ local color = olsrtools.etx_color(tonumber(cost))
++ local lq = string.format("%.3f", tonumber(route.linkQuality) or 0)
++ local nlq = string.format("%.3f", tonumber(route.neighborLinkQuality) or 0)
++ %>
++
++ <tr class="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>
++
++ <% 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>
++
++ <%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>
++
++ <% i = ((i % 2) + 1)
++ end %>
++ </table>
++<%+status-olsr/legend%>
++</fieldset>
++
++<%+status-olsr/common_js%>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-olsr/po/ca/olsr.po b/feeds/luci/applications/luci-app-olsr/po/ca/olsr.po
+new file mode 100644
+index 0000000..db4bce1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/ca/olsr.po
+@@ -0,0 +1,707 @@
++# olsr.pot
++# generated from ./applications/luci-olsr/luasrc/i18n/olsr.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-06-06 11:22+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr "Anuncis MID actius"
++
++msgid "Active OLSR nodes"
++msgstr "Nodes OLSR actius"
++
++msgid "Active host net announcements"
++msgstr "Anuncis de xarxa de màquines actives"
++
++msgid "Advanced Settings"
++msgstr "Ajusts avançats"
++
++msgid "Allow gateways with NAT"
++msgstr "Permet els passarel·les amb NAT "
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr "Xarxa anunciada"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr "Adreça de difusió"
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr "Configuració"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "Habilita"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr "Habilita aquesta interfície."
++
++msgid "Enabled"
++msgstr "Habilitat"
++
++msgid "Expected retransmission count"
++msgstr "Compte de retransmissió previst"
++
++msgid "FIB metric"
++msgstr "Mètrica FIB"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr "Passarel·la"
++
++msgid "General Settings"
++msgstr "Ajusts generals"
++
++msgid "General settings"
++msgstr "Ajusts generals"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr "HNA"
++
++msgid "HNA Announcements"
++msgstr "Anuncis HNA"
++
++msgid "HNA interval"
++msgstr "Interval HNA"
++
++msgid "HNA validity time"
++msgstr "Temps de validesa HNA"
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "Anuncis HNA"
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr "Interval Hello"
++
++msgid "Hello validity time"
++msgstr "Temps de validesa Hello"
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr "Hna4"
++
++msgid "Hna6"
++msgstr "Hna6"
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr "Adreces IP"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr "Difusió IPv4"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 multicast"
++msgstr "Difusió selectiva IPv6"
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfície"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interfícies"
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr "Protocol d'Internet"
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr "Rutes OLSR conegudes"
++
++msgid "LQ"
++msgstr "LQ"
++
++msgid "LQ aging"
++msgstr "Envelliment LQ"
++
++msgid "LQ algorithm"
++msgstr "Algoritme LQ"
++
++msgid "LQ fisheye"
++msgstr "LQ fisheye"
++
++msgid "LQ level"
++msgstr "Nivell LQ"
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr "Últim salt"
++
++msgid "Legend"
++msgstr "Llegenda"
++
++msgid "Library"
++msgstr "Biblioteca"
++
++msgid "Link Quality Settings"
++msgstr "Ajusts de qualitat d'enllaç"
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr "Multiplicador de qualitat d'enllaç"
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr "IP d'interfície local"
++
++msgid "MID"
++msgstr "MID"
++
++msgid "MID interval"
++msgstr "Interval MID"
++
++msgid "MID validity time"
++msgstr "Temps de validesa MID"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid "Main IP"
++msgstr "IP principal"
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr "Mètric"
++
++msgid "Mode"
++msgstr "Mode"
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr "Llindar NAT"
++
++msgid "NLQ"
++msgstr "NLQ"
++
++msgid "Neighbors"
++msgstr "Veïns"
++
++msgid "Neighbour IP"
++msgstr "IP del veí"
++
++msgid "Neighbours"
++msgstr "Veïns"
++
++msgid "Netmask"
++msgstr "Màscara de xarxa"
++
++msgid "Network"
++msgstr "Xarxa"
++
++msgid "Network address"
++msgstr "Adreça de xarxa"
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "OLSR - Display Options"
++msgstr "OLSR - Opcions de mostra"
++
++msgid "OLSR - HNA-Announcements"
++msgstr "Anuncis OLSR - HNA"
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr "Anuncis OLSR - HNA"
++
++msgid "OLSR - Plugins"
++msgstr "OLSR - Connectors"
++
++msgid "OLSR Daemon"
++msgstr "Dimoni OLSR"
++
++msgid "OLSR Daemon - Interface"
++msgstr "Dimoni OLSR - Interfície"
++
++msgid "OLSR connections"
++msgstr "Connexions OLSR"
++
++msgid "OLSR gateway"
++msgstr "Passarel·la OLSR"
++
++msgid "OLSR node"
++msgstr "Node OLSR"
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr "Visió de conjunt"
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr "Visió de conjunt d'anuncis de xarxa de màquines OLSR actives"
++
++msgid "Overview of currently established OLSR connections"
++msgstr "Visió de conjunt de les connexions OLSR establertes actualment"
++
++msgid "Overview of currently known OLSR nodes"
++msgstr "Visió de conjunt dels nodes OLSR coneguts actualment"
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr "Visió de conjunt de rutes conegudes actualment a altres nodes OLSR"
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr "Visió de conjunt de interfícies on està funcionant OLSR"
++
++msgid "Overview of known multiple interface announcements"
++msgstr "Visió de conjunt d'anuncis d'interfície múltiple coneguts"
++
++msgid "Overview of smart gateways in this network"
++msgstr "Visió de conjunt de les passarel·les intel·ligents en aquesta xarxa"
++
++msgid "Plugin configuration"
++msgstr "Configuració de connector"
++
++msgid "Plugins"
++msgstr "Connectors"
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr "Taxa de sondeig"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Prefix"
++msgstr "Prefix"
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr "Interfícies OSLR secundàries"
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr "SmartGW"
++
++msgid "SmartGW announcements"
++msgstr "Anuncis de SmartGW"
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr "Estat"
++
++msgid "Status"
++msgstr "Estat"
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr "TC"
++
++msgid "TC interval"
++msgstr "Interval TC"
++
++msgid "TC validity time"
++msgstr "Temps de validesa TC"
++
++msgid "TOS value"
++msgstr "Valor TOS"
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr "Sincronització i validitat"
++
++msgid "Topology"
++msgstr "Topologia"
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr "No s'ha pogut connectar al dimoni OLSR"
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr "Utilitza histèresi"
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr "Versió"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr "WLAN"
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr "Pes"
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr "Voluntat"
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid "Device"
++#~ msgstr "Dispositiu"
++
++#~ msgid ""
++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, "
++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"."
++#~ msgstr ""
++#~ "Assegura't que l'OLSRd està corrent, que el connector \"txtinfo\" està "
++#~ "carregat, configurat al port 2006, i que accepta connexions de "
++#~ "\"127.0.0.1\"."
+diff --git a/feeds/luci/applications/luci-app-olsr/po/cs/olsr.po b/feeds/luci/applications/luci-app-olsr/po/cs/olsr.po
+new file mode 100644
+index 0000000..3166907
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/cs/olsr.po
+@@ -0,0 +1,693 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-21 14:56+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr "PokroÄilé nastavení"
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr "Špatné (ETX > 10)"
++
++msgid "Bad (SNR < 5)"
++msgstr "Špatné (SNR < 5)"
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr "Konfigurace"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr "Downlink"
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "Povolit"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr "Povolit toto rozhraní."
++
++msgid "Enabled"
++msgstr "Povoleno"
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr "Gateway"
++
++msgid "General Settings"
++msgstr "Obecné nastavení"
++
++msgid "General settings"
++msgstr "Obecné nastavení"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "Dobré (2 < ETX < 4)"
++
++msgid "Good (30 > SNR > 20)"
++msgstr "Dobré (30 > SNR > 20)"
++
++msgid "Green"
++msgstr "Zelený"
++
++msgid "HNA"
++msgstr "HNA"
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr "HNA interval"
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr "Skrýt IPv4"
++
++msgid "Hide IPv6"
++msgstr "Skrýt IPv6"
++
++msgid "Hna4"
++msgstr "Hna4"
++
++msgid "Hna6"
++msgstr "Hna6"
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr "IP adresy"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr "IPv4 broadcast"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 multicast"
++msgstr "IPv6 multicast"
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr "Rozhraní"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Rozhraní"
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr "Internet protokol"
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr "LQ"
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr "LQ algoritmus"
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr "Poslední skok (hop)"
++
++msgid "Legend"
++msgstr "Legenda"
++
++msgid "Library"
++msgstr "Knihovna"
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr "IP lokálního rozhraní"
++
++msgid "MID"
++msgstr "MID"
++
++msgid "MID interval"
++msgstr "MID interval"
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid "Main IP"
++msgstr "Hlavní IP"
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr "NLQ"
++
++msgid "Neighbors"
++msgstr "Sousedé"
++
++msgid "Neighbour IP"
++msgstr "IP souseda"
++
++msgid "Neighbours"
++msgstr "Sousedé"
++
++msgid "Netmask"
++msgstr "Maska sítě"
++
++msgid "Network"
++msgstr "Síť"
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr "OLSR - pluginy"
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr "Oranžový"
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr "Konfigurace pluginu"
++
++msgid "Plugins"
++msgstr "Pluginy"
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Prefix"
++msgstr "Prefix"
++
++msgid "Red"
++msgstr "Červený"
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr "Zobrazit IPv4"
++
++msgid "Show IPv6"
++msgstr "Zobrazit IPv6"
++
++msgid "Signal Noise Ratio in dB"
++msgstr "Úroveň šumu v dB"
++
++msgid "SmartGW"
++msgstr "SmartGW"
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr "Stále použitelné (4 < ETX < 10)"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr "Stále použitelné (4 < ETX < 10)"
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr "TC"
++
++msgid "TC interval"
++msgstr "TC interval"
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr "TOS hodnota"
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr "Topologie"
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr "Uplink"
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr "Verze"
++
++msgid "Very good (ETX < 2)"
++msgstr "Velmi dobré (ETX < 2)"
++
++msgid "Very good (SNR > 30)"
++msgstr "Velmi dobré (SNR > 30)"
++
++msgid "WLAN"
++msgstr "WLAN"
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr "Váha"
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr "Žlutý"
++
++msgid "no"
++msgstr "ne"
++
++msgid "yes"
++msgstr "ano"
++
++#~ msgid "Device"
++#~ msgstr "Zařízení"
+diff --git a/feeds/luci/applications/luci-app-olsr/po/de/olsr.po b/feeds/luci/applications/luci-app-olsr/po/de/olsr.po
+new file mode 100644
+index 0000000..a23a20d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/de/olsr.po
+@@ -0,0 +1,814 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2012-11-21 20:54+0200\n"
++"Last-Translator: Jo-Philipp <jow@openwrt.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr "Aktive MID-Ankündigungen"
++
++msgid "Active OLSR nodes"
++msgstr "Aktive OLSR-Knoten"
++
++msgid "Active host net announcements"
++msgstr "Aktive HNA-Ankündigungen"
++
++msgid "Advanced Settings"
++msgstr "Erweiterte Einstellungen"
++
++msgid "Allow gateways with NAT"
++msgstr "Gateways mit NAT erlauben"
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr "Auswahl von IPv4-Gateways erlauben, die zum Internet hin NAT verwenden"
++
++msgid "Announce uplink"
++msgstr "Uplink ankündigen"
++
++msgid "Announced network"
++msgstr "Angekündigtes Netzwerk"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++"Beide Werte müssen in der 'dotted decimal' Schreibweise angegeben werden."
++
++msgid "Broadcast address"
++msgstr "Broadcast-Adresse"
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr "Konfiguration"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr "Anzeige"
++
++msgid "Downlink"
++msgstr "Download-Bandbreite"
++
++msgid "Download Config"
++msgstr "Konfiguration herunterladen"
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "Aktivieren"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++"SmartGateway aktivieren. Ist diese Option deaktiviert, dann werden alle "
++"folgenden SmartGateway Einstellungen ignoriert. Der Defaultwert ist \"no\"."
++
++msgid "Enable this interface."
++msgstr "Dieses Interface benutzen."
++
++msgid "Enabled"
++msgstr "Aktiviert"
++
++msgid "Expected retransmission count"
++msgstr "Zu erwartende Sendeversuche pro Paket"
++
++msgid "FIB metric"
++msgstr "FIB-Metrik"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++"FIBMetric bestimmt die Metrik für Hostrouten die olsrd setzt. \"flat\" setzt "
++"die Metrik immer auf 2. Dies ist der bevorzugte Wert, da er dem Kernel dabei "
++"hilft, veraltete Routen zu löschen. \"correct\" verwendet den Hopcount als "
++"Metrik. \"approx\" benutzt ebenfalls den Hopcount als Metrik, updated diese "
++"aber nur, wenn sich auch der Nexthop verändert hat. Der Defaultwert ist "
++"\"flat\"."
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++"Fisheye Mechanismus für TC-Nachrichten (ausgewählt entspricht ein). Der "
++"Defaultwert ist \"ein\""
++
++msgid "Gateway"
++msgstr "Gateway"
++
++msgid "General Settings"
++msgstr "Allgemeine Einstellungen"
++
++msgid "General settings"
++msgstr "Allgemeine Einstellungen"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr "HNA"
++
++msgid "HNA Announcements"
++msgstr "HNA-Ankündigungen"
++
++msgid "HNA interval"
++msgstr "HNA-Intervall"
++
++msgid "HNA validity time"
++msgstr "HNA-Gültigkeit"
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "HNA-Ankündigungen"
++
++msgid "Hello"
++msgstr "Hello"
++
++msgid "Hello interval"
++msgstr "Hello-Intervall"
++
++msgid "Hello validity time"
++msgstr "Hello-Gültigkeit"
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr "Hna4"
++
++msgid "Hna6"
++msgstr "Hna6"
++
++msgid "Hops"
++msgstr "Sprünge"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++"Rechner in einem OLSR-geroutetem Netzwerk können Konnektivität zu externen "
++"Netzwerken mittels HNA-Nachrichten ankündigen."
++
++#, fuzzy
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++"Rechner in einem OLSR-geroutetem Netzwerk können Konnektivität zu externen "
++"Netzwerken mittels HNA-Nachrichten ankündigen."
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++"Verwende Hysterese zur Berechnung von Links (nur verfügbar für Hopcount "
++"Metric). Hysterese erhöht die Stabilität von berechneten Routen, verzögert "
++"aber das Registrieren von Nachbarknoten. Der Defaultwert ist \"eingeschaltet"
++"\"."
++
++msgid "IP Addresses"
++msgstr "IP-Adressen"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++"Die zu verwendende IP-Version. Wird 6and4 gewählt dann wird ein OLSRd-"
++"Prozess für jedes Protokoll gestartet."
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr "IPv4 Broadcast"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++"IPv4 Broadcastadresse für ausgehende OLSR-Pakete. Ein häufig verwendetes "
++"Beispiel ist 255.255.255.255. Der Defaultwert ist \"0.0.0.0\". Dies "
++"verwendet die Broadcastadresse des Interfaces."
++
++msgid "IPv4 source"
++msgstr "IPv4 Quell-IP"
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++"IPv4 Quell-IP für ausgehende OLSR-Nachrichten. Der Defaultwert ist "
++"\"0.0.0.0\", dann wird die IP des Interfaces verwendet."
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 multicast"
++msgstr "IPv6 Multicast"
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++"IPv6 Multicast-Adresse. Der Defaultwert ist \"FF02::6D\", die linklocal "
++"Multicastadresse für MANETs."
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++"IPv6 Netzwerk muss in 'full notation', der Prefix in CIDR Schreibweise "
++"eingegeben werden."
++
++msgid "IPv6 source"
++msgstr "IPv6 Quell-IP"
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++"IPv6 Quell-Prefix. OLSRd wählt eine IP als Quell-IP die innerhalb des "
++"angegebenen Prefix liegt. Der Defaultwert ist \"0::/0\", damit wird eine "
++"IPv6-Adresse des Interfaces verwendet die nicht linklocal ist."
++
++msgid "IPv6-Prefix of the uplink"
++msgstr "IPv6-Präfix des Uplinks"
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++"Wenn sich die Route zum aktuellen Gateway ändert, dann wird sein ETX-Wert "
++"zunächst mit diesem Wert multipliziert bevor er mit dem neuen ETX-Wert "
++"verglichen wird. Damit kann \"flapping\" von Routen reduziert werden. Der "
++"Wert kann zwischen 0.1 und 1.0 liegen, sollte aber nahe bei 1.0 sein.<br /"
++"><b>ACHTUNG:</b> Diese Einstellung darf nicht zusammen mit der etx_ffeth "
++"Metrik verwendet werden!<br />Der Defaultwert ist \"1.0\"."
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++"Benutzt dieser Knoten NAT für die Verbindung zum Internet? Der Defaultwert "
++"ist \"yes\"."
++
++msgid "Interface"
++msgstr "Schnittstelle"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++"Mit dieser Einstellung kann unnötiges Forwarden von Paketen auf geswitchten "
++"Ethernetschnittstellen unterbunden werden. Gültige Werte sind \"mesh\" und "
++"\"ether\". Der Defaultwert ist \"mesh\"."
++
++msgid "Interfaces"
++msgstr "Schnittstellen"
++
++msgid "Interfaces Defaults"
++msgstr "Schnittstellen-Standards"
++
++msgid "Internet protocol"
++msgstr "Internet Protokoll"
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++"Intervall mit dem Netzwerkschnittstellen auf Änderungen in ihrer "
++"Konfiguration überprüft werden (in Sekunden). Der Defaultwert ist \"2.5\"."
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr "Bekannte OLSR-Routen"
++
++msgid "LQ"
++msgstr "LQ"
++
++msgid "LQ aging"
++msgstr "LQ-Alterung"
++
++msgid "LQ algorithm"
++msgstr "LQ-Algorithmus"
++
++msgid "LQ fisheye"
++msgstr "LQ-Fisheye"
++
++msgid "LQ level"
++msgstr "LQ-Level"
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr "letzter Hop"
++
++msgid "Legend"
++msgstr "Legende"
++
++msgid "Library"
++msgstr "Bibliothek"
++
++msgid "Link Quality Settings"
++msgstr "Linkqualitätseinstellungen"
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++"Der Linkqualitäts-Alterungsfaktor kann nur zusammen mit Linkqualitylevel 2 "
++"verwendet werden. Kleinere Werte bedeuten, dass ETX-Werte sich langsamer "
++"verändern. Erlaubte Werte sind 0.01 bis 1.0."
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++"Link Quality Algorithmus (nur für lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX mit exponentieller Alterung<br /><b>etx_fpm</b>: Dasselbe "
++"wie etx_float, Berechnung jedoch mit Ganzzahlen<br /><b>etx_ff</b>: ETX "
++"freifunk, eine ETX Variante die allen OLSR Traffic zur ETX Berechnung nutzt "
++"(und nicht nur Hello-Nachrichten)<br /><b>etx_ffeth</b>: Inkompatible "
++"Variante von etx_ff die Ethernetlinks mit ETX 0.1 erlaubt<br />Der Default "
++"ist \"etx_ff\""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++"Mit dieser Option kann der Linkquality-Algorithmus gewählt werden.<br /"
++"><b>0</b> = Linkquality nicht benutzen<br /><b>2</b> = Linkquality für die "
++"Wahl von MPRs und fürs Routing benutzen.<br />Der Defaultwert ist \"2\"."
++
++msgid "LinkQuality Multiplicator"
++msgstr "LQ-Multiplikator"
++
++msgid "Links per node (average)"
++msgstr "Verbindungen pro Node (Durchschnitt)"
++
++msgid "Links total"
++msgstr "Verbindungen insgesamt"
++
++msgid "Local interface IP"
++msgstr "Lokale Interface-IP"
++
++msgid "MID"
++msgstr "MID"
++
++msgid "MID interval"
++msgstr "MID-Intervall"
++
++msgid "MID validity time"
++msgstr "MID-Gültigkeit"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid "Main IP"
++msgstr "Haupt-IP"
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr "Metrik"
++
++msgid "Mode"
++msgstr "Modus"
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++#, fuzzy
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++"Multipliziere die Linkquality (LQ) für Routen mit dem hier angegebenen "
++"Faktor, der zwischen 0.01 und 1 liegen kann. Beispiele:<br />halbiere die LQ "
++"zu 192.168.0.1: 192.168.0.1 0.5<br />reduziere die LQ für alle Nodes die mit "
++"diesem Interface kommunizieren um 20%: default 0.8"
++
++msgid "NAT threshold"
++msgstr "NAT-Schwellenwert"
++
++msgid "NLQ"
++msgstr "NLQ"
++
++msgid "Neighbors"
++msgstr "Nachbarn"
++
++msgid "Neighbour IP"
++msgstr "Nachbar-IP"
++
++msgid "Neighbours"
++msgstr "Nachbarn"
++
++msgid "Netmask"
++msgstr "Netzmaske"
++
++msgid "Network"
++msgstr "Netzwerk"
++
++msgid "Network address"
++msgstr "Netzwerk-Adresse"
++
++msgid "Nic changes poll interval"
++msgstr "Abfrageintervall für Schnittstellenänderungen"
++
++msgid "Nodes"
++msgstr "Knoten"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "OLSR - Display Options"
++msgstr "OLSR - Anzeigeoptionen"
++
++msgid "OLSR - HNA-Announcements"
++msgstr "OLSR - HNA-Ankündigungen"
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr "OLSR - HNA-Ankündigungen"
++
++msgid "OLSR - Plugins"
++msgstr "OLSR - Plugins"
++
++msgid "OLSR Daemon"
++msgstr "OLSR Daemon"
++
++msgid "OLSR Daemon - Interface"
++msgstr "OLSR Daemon - Schnittstelle"
++
++msgid "OLSR connections"
++msgstr "OLSR-Verbindungen"
++
++msgid "OLSR gateway"
++msgstr "OLSR-Gateway"
++
++msgid "OLSR node"
++msgstr "OLSR-Knoten"
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr "Ãœbersicht"
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr "Übersicht über zur Zeit aktive OLSR-Netzwerk-Ankündigungen"
++
++msgid "Overview of currently established OLSR connections"
++msgstr "Übersicht über aktuell bestehende OLSR-Verbindungen"
++
++msgid "Overview of currently known OLSR nodes"
++msgstr "Übersicht über zur Zeit bekannte andere OLSR-Knoten"
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr "Übersicht über zur Zeit bekannte Routen zu anderen OLSR-Knoten"
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr "Übersicht über Interfaces auf denen OLSRd läuft."
++
++msgid "Overview of known multiple interface announcements"
++msgstr "Übersicht über bekannte Mehrfachschnittstellenmeldungen"
++
++msgid "Overview of smart gateways in this network"
++msgstr "Übersicht über Smart Gateways in diesem Netzwerk."
++
++msgid "Plugin configuration"
++msgstr "Pluginkonfiguration"
++
++msgid "Plugins"
++msgstr "Plugins"
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr "Abfragerate für OLSRd-Sockets in Sekunden. Der Defaultwert ist 0.05."
++
++msgid "Pollrate"
++msgstr "Abfragerate"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Prefix"
++msgstr "Prefix"
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr "DNS auflösen"
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++"Hostnamen auf den Statusseiten auflösen. Dies ist in der Regel kein Problem, "
++"wenn aber öffentliche IPs benutzt werden und das DNS-Setup nicht stabil ist, "
++"dann werden die OLSR-Statusseiten nur sehr langsam laden. In diesem Fall "
++"sollte man diese Option deaktivieren."
++
++msgid "Routes"
++msgstr "Routen"
++
++msgid "Secondary OLSR interfaces"
++msgstr "Sekundäre OLSR Schnittstellen"
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++"Setzt die Haupt-IP (originator ip) für diesen Router. Diese IP wird sich "
++"NIEMALS während der Laufzeit von OLSRD verändern. Der Defaultwert ist "
++"0.0.0.0. Damit wird die IP des ersten Interfaces verwendet."
++
++#, fuzzy
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++"Setzt die Haupt-IP (originator ip) für diesen Router. Diese IP wird sich "
++"NIEMALS während der Laufzeit von OLSRD verändern. Der Defaultwert ist "
++"0.0.0.0. Damit wird die IP des ersten Interfaces verwendet."
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr "Smart Gateway"
++
++msgid "SmartGW announcements"
++msgstr "Smart Gateway Ankündigungen"
++
++msgid "SmartGateway is not configured on this system."
++msgstr "Smart Gateway ist auf diesem System nicht konfiguriert."
++
++msgid "Source address"
++msgstr "Quell-IP"
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++"Hiermit kann man die Geschwindigkeit des Uplinks dieses Knotens ankündigen. "
++"Der erste Wert ist die Upload-, der zweite Wert die Downloadgeschwindigkeit. "
++"Der Defaultwert ist \"128 1024\"."
++
++msgid "Speed of the uplink"
++msgstr "Geschwindigkeit des Uplinks"
++
++msgid "State"
++msgstr "Status"
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr "Erfolgsquote vom Nachbarn empfangener Pakete"
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr "Erfolgsquote zum Nachbarn gesendeter Pakete"
++
++msgid "TC"
++msgstr "TC"
++
++msgid "TC interval"
++msgstr "TC-Intervall"
++
++msgid "TC validity time"
++msgstr "TC-Gültigkeit"
++
++msgid "TOS value"
++msgstr "TOS-Wert"
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++"OLSR ist eine Implementation des Optimized Link State Routing Protokolls und "
++"erlaubt damit Mesh-Routing für jegliche Netzwerkgeräte. Besuche <a "
++"href='http://www.olsr.org'>olsrd.org</a> für Hilfe und Dokumentation."
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++"Hier kann ein Bereitschaftswert angegeben werden. Bleibt dieses Feld leer, "
++"dann wird der Bereitschaftswert automatisch anhand von Akkukapazität und "
++"Stromversorgung berechnet"
++
++msgid "The interface OLSRd should serve."
++msgstr "Interface das OLSRd verwenden soll."
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++"Port, den OLSRd benutzt. Dieser sollte in der Regel auf dem Defaultwert 698 "
++"bleiben, was dem von IANA zugewiesenen Port für OLSRd entspricht."
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++"Hiermit kann der externe IPv6-Präfix an Clients signalisiert werden. Dadurch "
++"können Clients ihre lokale IP-Adresse ändern, um diesen IPv6-Gateway ohne "
++"Übersetzung der IPv6-Adresse zu benutzen. Die maximale erlaubte Länge des "
++"Präfix ist 64 bit. Der Defaultwert ist \"::/0\" (kein Präfix)."
++
++msgid "Timing and Validity"
++msgstr "Taktung und Validität"
++
++msgid "Topology"
++msgstr "Topologie"
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++"TOS-Wert für den IP-Header von OLSR-Nachrichten. Der Defaultwert ist \"16\"."
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr "Es konnte keine Verbindung zum OLSR-Daemon hergestellt werden!"
++
++msgid "Uplink"
++msgstr "Upload-Bandbreite"
++
++msgid "Uplink uses NAT"
++msgstr "Der Uplink benutzt NAT."
++
++msgid "Use hysteresis"
++msgstr "Hysterese aktivieren"
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr "Version"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr "WLAN"
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++"WARNUNG: kmod-ipip ist nicht installiert. Ohne kmod-ipip wird SmartGateway "
++"nicht funktionieren!"
++
++msgid "Weight"
++msgstr "Gewichtung"
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++"Gibt es mehrere Links zwischen einzelnen Nodes dann wird ein Gewichtungswert "
++"verwendet um zu bestimmen, welches Interface bevorzugt wird. Dieses Gewicht "
++"wird in der Regel automatisch berechnet, kann hier jedoch mit einem festen "
++"Wert überschrieben werden. OLSRd wählt den Link mit dem niedrigsten Wert. "
++"<br /><b>Hinweis:</b> Diese Gewichtung ist nur möglich wenn "
++"LinkQualityLevel= 0 ist. Für alle anderen Werte von LinkQualityLevel wird "
++"stattdessen der ETX-Wert verwendet."
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++"Welche Art von Uplink im Mesh angekündigt wird. Ein Uplink wird automatisch "
++"anhand der lokal angekündigten HNA erkannt (0.0.0.0/0, ::ffff:0:0/96 oder "
++"2000::/3). Der Defaultwert ist \"both\" (sowohl IPv4 als auch IPv6 Uplink "
++"ankündigen sofern verfügbar)."
++
++#, fuzzy
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++"Welche Art von Uplink im Mesh angekündigt wird. Ein Uplink wird automatisch "
++"anhand der lokal angekündigten HNA erkannt (0.0.0.0/0, ::ffff:0:0/96 oder "
++"2000::/3). Der Defaultwert ist \"both\" (sowohl IPv4 als auch IPv6 Uplink "
++"ankündigen sofern verfügbar)."
++
++msgid "Willingness"
++msgstr "Bereitschaft"
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid "Device"
++#~ msgstr "Schnittstelle"
++
++#~ msgid ""
++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, "
++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"."
++#~ msgstr ""
++#~ "Stellen Sie sicher das OLSRd läuft und das \"txtinfo\" Plugin auf Port "
++#~ "2006 geladen und \"127.0.0.1\" als Accept-Host gesetzt ist."
+diff --git a/feeds/luci/applications/luci-app-olsr/po/el/olsr.po b/feeds/luci/applications/luci-app-olsr/po/el/olsr.po
+new file mode 100644
+index 0000000..a3cf0d2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/el/olsr.po
+@@ -0,0 +1,695 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-28 02:08+0200\n"
++"PO-Revision-Date: 2012-03-31 15:41+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr "ΕνεÏγοί κόμβοι OLSR"
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr "ΠÏοχωÏημένες Ρυθμίσεις"
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "ΕνεÏγοποίηση"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr "ΕνεÏγοποίηση αυτής της διεπαφής."
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr "ΠÏλη"
++
++msgid "General Settings"
++msgstr "Γενικές Ρυθμίσεις"
++
++msgid "General settings"
++msgstr "Γενικές Ïυθμίσεις"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr "HNA"
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr "ΔιευθÏνσεις IP"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr "Διεπαφή"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Διεπαφές"
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr "Συνδέσεις σÏνολο"
++
++msgid "Local interface IP"
++msgstr "IP τοπικής διεπαφής"
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr "Δίκτυο"
++
++msgid "Network address"
++msgstr "ΔιεÏθυνση δικτÏου"
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr "OLSR Δαίμονας"
++
++msgid "OLSR Daemon - Interface"
++msgstr "OLSR Δαίμονας - Διεπαφή"
++
++msgid "OLSR connections"
++msgstr "OLSR συνδέσεις"
++
++msgid "OLSR gateway"
++msgstr "OLSR Ï€Ïλη"
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr "ΠόÏτα"
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr "ΔιαδÏομές"
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr "SmartGW"
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr "Τοπολογία"
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr "Έκδοση"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid "Device"
++#~ msgstr "Συσκευή"
+diff --git a/feeds/luci/applications/luci-app-olsr/po/en/olsr.po b/feeds/luci/applications/luci-app-olsr/po/en/olsr.po
+new file mode 100644
+index 0000000..131005e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/en/olsr.po
+@@ -0,0 +1,701 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:35+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid "Active MID announcements"
++msgstr "Active MID announcements"
++
++msgid "Active OLSR nodes"
++msgstr "Active OLSR nodes"
++
++msgid "Active host net announcements"
++msgstr "Active host net announcements"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr "Announced network"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr "Expected retransmission count"
++
++msgid "FIB metric"
++msgstr "FIB metric"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr "General settings"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr "HNA interval"
++
++msgid "HNA validity time"
++msgstr "HNA validity time"
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "OLSR - HNA-Announcements"
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr "Hello interval"
++
++msgid "Hello validity time"
++msgstr "Hello validity time"
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "IPv4 broadcast"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr "Internet protocol"
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr "Known OLSR routes"
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr "LQ aging"
++
++msgid "LQ algorithm"
++msgstr "LQ algorithm"
++
++msgid "LQ fisheye"
++msgstr "LQ fisheye"
++
++msgid "LQ level"
++msgstr "LQ level"
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr "Last hop"
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr "Library"
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr "Local interface IP"
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr "MID interval"
++
++msgid "MID validity time"
++msgstr "MID validity time"
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr "Neighbour IP"
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr "Netmask"
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr "OLSR - HNA-Announcements"
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr "OLSR - HNA-Announcements"
++
++msgid "OLSR - Plugins"
++msgstr "OLSR - Plugins"
++
++msgid "OLSR Daemon"
++msgstr "OLSR Daemon"
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr "OLSR connections"
++
++msgid "OLSR gateway"
++msgstr "OLSR gateway"
++
++msgid "OLSR node"
++msgstr "OLSR node"
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr "Overview of currently active OLSR host net announcements"
++
++msgid "Overview of currently established OLSR connections"
++msgstr "Overview of currently established OLSR connections"
++
++msgid "Overview of currently known OLSR nodes"
++msgstr "Overview of currently known OLSR nodes"
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr "Overview of currently known routes to other OLSR nodes"
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr "Overview of known multiple interface announcements"
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr "Plugin configuration"
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr "Pollrate"
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr "Prefix"
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr "Secondary OLSR interfaces"
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr "TC interval"
++
++msgid "TC validity time"
++msgstr "TC validity time"
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr "Unable to connect to the OLSR daemon!"
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr "Use hysteresis"
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr "Willingness"
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid ""
++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, "
++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"."
++#~ msgstr ""
++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, "
++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"."
+diff --git a/feeds/luci/applications/luci-app-olsr/po/es/olsr.po b/feeds/luci/applications/luci-app-olsr/po/es/olsr.po
+new file mode 100644
+index 0000000..0e161bd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/es/olsr.po
+@@ -0,0 +1,830 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2014-06-15 13:17+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr "Declaraciones MID activas"
++
++msgid "Active OLSR nodes"
++msgstr "Nodos OLSR activos"
++
++msgid "Active host net announcements"
++msgstr "Declaraciones activas de máquinas en la red"
++
++msgid "Advanced Settings"
++msgstr "Configuración avanzada"
++
++msgid "Allow gateways with NAT"
++msgstr "Permitir pasarelas con NAT"
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr "Permitir seleccionar una pasarela IPv4 con NAT"
++
++msgid "Announce uplink"
++msgstr "Declarar enlace de subida"
++
++msgid "Announced network"
++msgstr "Red declarada"
++
++msgid "Bad (ETX > 10)"
++msgstr "Mal (ETX > 10)"
++
++msgid "Bad (SNR < 5)"
++msgstr "Mal (SNR < 5)"
++
++msgid "Both values must use the dotted decimal notation."
++msgstr "Ambos valores en notación decimal con punto."
++
++msgid "Broadcast address"
++msgstr "Dirección de propagación"
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr "Sólo puede ser una dirección IPv4 o IPv6 válidas o \"por defecto\""
++
++#, fuzzy
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr "Sólo puede ser una dirección IPv4 o IPv6 válidas o \"por defecto\""
++
++msgid "Configuration"
++msgstr "Configuración"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++"No pude obtener datos. Asegúrese de que el plugin jsoninfo está instalado y "
++"permite conexiones desde localhost."
++
++msgid "Display"
++msgstr "Mostrar"
++
++msgid "Downlink"
++msgstr "Enlace de bajada"
++
++msgid "Download Config"
++msgstr "Configuración de descarga"
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "Activar"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++"Activar SmartGateway. Si se desactiva el resto de parámetros de SmartGateway "
++"se ignoran. \"No\" por defecto."
++
++msgid "Enable this interface."
++msgstr "Activar esta interfaz."
++
++msgid "Enabled"
++msgstr "Activado"
++
++msgid "Expected retransmission count"
++msgstr "Contador de retransmisión esperado"
++
++msgid "FIB metric"
++msgstr "Métrica FIB"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++"FIBMetric controla el valor métrico de los conjuntos OLSRd. \"Plano\" "
++"significa que la métrica es siempre 2. Este es el valor preferido porque "
++"ayuda al enrutador del kernel de linux a limpiar valores antiguos. \"Correct"
++"\" usa como métrica el número de saltos. \"Approx\" usa la cuenta de saltos "
++"también, pero solo la actualiza si cambia el siguiente salto también. Por "
++"defecto \"flat\"."
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr "Mecanismo Fisheye para TCs (marcado = activado). Activado por defecto"
++
++msgid "Gateway"
++msgstr "Pasarela"
++
++msgid "General Settings"
++msgstr "Configuración general"
++
++msgid "General settings"
++msgstr "Configuración general"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "Bien (2 < ETX < 4)"
++
++msgid "Good (30 > SNR > 20)"
++msgstr "Bien (30 > SNR > 20)"
++
++msgid "Green"
++msgstr "Verde"
++
++msgid "HNA"
++msgstr "HNA"
++
++msgid "HNA Announcements"
++msgstr "Declaraciones HNA"
++
++msgid "HNA interval"
++msgstr "Intervalo HNA"
++
++msgid "HNA validity time"
++msgstr "Tiempo de validez de HNA"
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "Declaraciones HNA"
++
++msgid "Hello"
++msgstr "Saludo"
++
++msgid "Hello interval"
++msgstr "Intervalo de saludo"
++
++msgid "Hello validity time"
++msgstr "Tiempo de validez del saludo"
++
++msgid "Hide IPv4"
++msgstr "Ocultar IPv4"
++
++msgid "Hide IPv6"
++msgstr "Ocultar IPv6"
++
++msgid "Hna4"
++msgstr "Hna4"
++
++msgid "Hna6"
++msgstr "Hna6"
++
++msgid "Hops"
++msgstr "Saltos"
++
++msgid "Hostname"
++msgstr "Nombre de máquina"
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++"Las máquinas de una red OLSR pueden declarar conectividad con redes externas "
++"usando mensajes HNA."
++
++#, fuzzy
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++"Las máquinas de una red OLSR pueden declarar conectividad con redes externas "
++"usando mensajes HNA."
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++"Histéresis para la sensibilidad del enlace (sólo para métrica de saltos). La "
++"histéresis da más robustez a la sensibilidad de enlace pero retrasa el "
++"registro de vecinos. \"Sí\" por defecto"
++
++msgid "IP Addresses"
++msgstr "Direcciones IP"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++"Versión IP a usar. Si se selecciona 6and4 se arrancarán una instancia de "
++"oslrd para cada protocolo."
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr "Propagar IPv4"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++"Dirección de propagación IPv4 para paquetes salientes OLSR. Por ejemplo "
++"\"255.255.255.255\". Por defecto es \"0.0.0.0\" que hace que se use la "
++"interfaz de propagación IP."
++
++msgid "IPv4 source"
++msgstr "IPv4 origen"
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++"Dirección origen IPv4 para paquetes OLSR. Por defecto es \"0.0.0.0\" que "
++"hace que se use la interfaz de propagación IP."
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 multicast"
++msgstr "Multidifusión IPv6"
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++"Dirección IPv6 de multidifusión. Por defecto es \"FF02::6D\", la dirección "
++"de multidifusión local en routers MANET."
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++"La red IPv6 debe escribirse en notación completa y el prefijo debe estar en "
++"notación CIDR."
++
++msgid "IPv6 source"
++msgstr "IPv6 origen"
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++"Prefijo origen IPv6. OLSRd elegirá un interfaz IP que encaje con el prefijo "
++"de este parámetro. Por defecto es \"0::/0\" que provoca el uso de un "
++"interfaz IP no local."
++
++msgid "IPv6-Prefix of the uplink"
++msgstr "Prefijo IPv6 para el enlace de subida"
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++"Si la ruta a la pasarela actual cambia su ETX de se multiplica por este "
++"valor antes de compararse con el nuevo. El parámetro debe estar entre 0.1 y "
++"1.0, pero debería aproximarse a 1.0 si se cambia.<br /><b>AVISO:</b> No debe "
++"usarse junto con la métrica etx_ffeth!<br />Por defecto es 1.0."
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr "Este nodo usa NAT para conectar a internet. \"Sí\" por defecto."
++
++msgid "Interface"
++msgstr "Interfaz"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++"El modo de interfaz se usar para evitar traspaso innecesario de paquetes en "
++"interfaces de red conmutados. Los modos válidos son \"mesh\" y \"ether\". "
++"Por defecto es \"mesh\"."
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interfaces Defaults"
++msgstr "Valores por defecto de los interfaces"
++
++msgid "Internet protocol"
++msgstr "Protocolo de Internet"
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++"Intervalo de sondeo de cambios de configuración a interfaces de red (en "
++"segundos). Por defecto es \"2.5\"."
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr "Valor no válido para LQMult-Value. Debe ser entre 0,01 y 1,0."
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++"Valor no válido para LQMult-Value. Debe usar un número decimal entre 0,01 y "
++"1,0."
++
++msgid "Known OLSR routes"
++msgstr "Rutas OLSR conocidas"
++
++msgid "LQ"
++msgstr "LQ"
++
++msgid "LQ aging"
++msgstr "LQ - Envejecimiento"
++
++msgid "LQ algorithm"
++msgstr "LQ - Algoritmo"
++
++msgid "LQ fisheye"
++msgstr "LQ - Ojo de pez"
++
++msgid "LQ level"
++msgstr "LQ - Nivel"
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++"LQMult precisa dos valores (dirección IP o \"por defecto\" y multiplicador) "
++"separados por un espacio."
++
++msgid "Last hop"
++msgstr "Último salto"
++
++msgid "Legend"
++msgstr "Leyenda"
++
++msgid "Library"
++msgstr "Biblioteca"
++
++msgid "Link Quality Settings"
++msgstr "Configuración de calidad de enlace"
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++"Factor de envejecimiento de la calidad del enlace (sólo para CE nivel 2). "
++"Parámetro de ajuste para etx_float y etx_fpm, valores menores implican "
++"cambios más lentos en el valor ETX. (los valores permitidos están entre 0.01 "
++"y 1.0)"
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++"Algoritmo de calidad de enlace (solo para CE nivel 2).<br /><b>etx_float</"
++"b>: ETX en punto flotante con envejecimiento exponencial<br /><b>etx_fpm</"
++"b> : igual que etx_float, pero con aritmética entera<br /><b>etx_ff</b> : "
++"ETX freifunk, variante etx que usar todo el tráfico OLSR (en vez de sólo "
++"\"hellos\") para los cálculos ETX<br /><b>etx_ffeth</b>: variante "
++"incompatible de etx_ff que permite enlaces ethernet con ETX 0.1.<br />Por "
++"defecto \"etx_ff\""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++"Intercambio del nivel de calidad del enlace entre \"cuenta de saltos\" y "
++"enrutado \"basado en coste\" (principalmente ETX).<br /><b>0</b> = no usar "
++"calidad del enlace<br /><b>2</b> = use calidad del enlace para selección de "
++"MPR y enrutado<br />Por defecto es 2"
++
++msgid "LinkQuality Multiplicator"
++msgstr "Multilplicador de calidad de enlace"
++
++msgid "Links per node (average)"
++msgstr "Media de enlaces por nodo"
++
++msgid "Links total"
++msgstr "Enlaces totales"
++
++msgid "Local interface IP"
++msgstr "IP de la interfaz local"
++
++msgid "MID"
++msgstr "MID"
++
++msgid "MID interval"
++msgstr "Intervalo de MID"
++
++msgid "MID validity time"
++msgstr "Tiempo de validez de MID"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid "Main IP"
++msgstr "IP principal"
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++"Asegúrese de que OLSRd funciona y de que el plugin \"jsoninfo\" está "
++"cargado, configurado en el puerto 9090 y que acepta conexiones desde "
++"127.0.0.1."
++
++msgid "Metric"
++msgstr "Métrica"
++
++msgid "Mode"
++msgstr "Modo"
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++"Multiplicar las rutas con el factor dado aquí. Los valores permitidos está "
++"entre 0,01 y 1,0. Se usa sólo cuando el nivel LQ es mayor que 0. Ejemplos:"
++"<br />reducir LQ a 192.168.0.1 por la mitad: 192.168.0.1 0,5<br />reducir LQ "
++"a todos los nodos de esta interfaz el 20%: default 0,8"
++
++#, fuzzy
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++"Multiplicar las rutas con el factor dado aquí. Los valores permitidos está "
++"entre 0,01 y 1,0. Se usa sólo cuando el nivel LQ es mayor que 0. Ejemplos:"
++"<br />reducir LQ a 192.168.0.1 por la mitad: 192.168.0.1 0,5<br />reducir LQ "
++"a todos los nodos de esta interfaz el 20%: default 0,8"
++
++msgid "NAT threshold"
++msgstr "Umbral NAT"
++
++msgid "NLQ"
++msgstr "NLQ"
++
++msgid "Neighbors"
++msgstr "Vecinos"
++
++msgid "Neighbour IP"
++msgstr "IP vecina"
++
++msgid "Neighbours"
++msgstr "Vecinos"
++
++msgid "Netmask"
++msgstr "Máscara de red"
++
++msgid "Network"
++msgstr "Red"
++
++msgid "Network address"
++msgstr "Dirección de red"
++
++msgid "Nic changes poll interval"
++msgstr "Intervalo de muestreo de cambios de nic"
++
++msgid "Nodes"
++msgstr "Nodos"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "OLSR - Display Options"
++msgstr "OLSR - Mostrar opciones"
++
++msgid "OLSR - HNA-Announcements"
++msgstr "OLSR - Declaraciones HNA"
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr "OLSR - Declaraciones HNA"
++
++msgid "OLSR - Plugins"
++msgstr "OLSR - Plugins"
++
++msgid "OLSR Daemon"
++msgstr "Demonio OLSR"
++
++msgid "OLSR Daemon - Interface"
++msgstr "Demonio OLSR - Interfaz"
++
++msgid "OLSR connections"
++msgstr "Conexiones OLSR"
++
++msgid "OLSR gateway"
++msgstr "Puerta de enlace OLSR"
++
++msgid "OLSR node"
++msgstr "Nodo OLSR"
++
++msgid "Orange"
++msgstr "Naranja"
++
++msgid "Overview"
++msgstr "Resumen"
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr "Resumen de declaraciones OLSR de máquinas activas"
++
++msgid "Overview of currently established OLSR connections"
++msgstr "Resumen de conexiones de OLSR vivas"
++
++msgid "Overview of currently known OLSR nodes"
++msgstr "Nodos conocidos OLSR"
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr "Rutas conocidas a otros nodos OLSR"
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr "Resumen de interfaces con OLSR en ejecución"
++
++msgid "Overview of known multiple interface announcements"
++msgstr "Declaraciones de múltiples interfaces conocidas"
++
++msgid "Overview of smart gateways in this network"
++msgstr "Pasarelas inteligentes en esta red"
++
++msgid "Plugin configuration"
++msgstr "Configuración del plugin"
++
++msgid "Plugins"
++msgstr "Plugins"
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr "Ratio de muestreo de paquetes OLSR en segundos. Por defecto es 0.05."
++
++msgid "Pollrate"
++msgstr "Tasa de muestreo"
++
++msgid "Port"
++msgstr "Puerto"
++
++msgid "Prefix"
++msgstr "Prefijo"
++
++msgid "Red"
++msgstr "Rojo"
++
++msgid "Resolve"
++msgstr "Calcular"
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++"Calcula los nombres de máquina en las páginas de estado. Suele ser seguro, "
++"pero las páginas se cargarán lentamente si usa IPs públicas y tiene una "
++"configuración inestable de DNS."
++
++msgid "Routes"
++msgstr "Rutas"
++
++msgid "Secondary OLSR interfaces"
++msgstr "Interfaces OLSR secundarias"
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++"Configura la dirección IP principal (IP originadora) del router. NUNCA debe "
++"cambiar mientras OLSRd esté activa. Por defecto es \"0.0.0.0\" que provoca "
++"el uso de la IP del primer interfaz."
++
++#, fuzzy
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++"Configura la dirección IP principal (IP originadora) del router. NUNCA debe "
++"cambiar mientras OLSRd esté activa. Por defecto es \"0.0.0.0\" que provoca "
++"el uso de la IP del primer interfaz."
++
++msgid "Show IPv4"
++msgstr "Mostrar IPv4"
++
++msgid "Show IPv6"
++msgstr "Mostrar IPv6"
++
++msgid "Signal Noise Ratio in dB"
++msgstr "Ratio señal / ruido en dB"
++
++msgid "SmartGW"
++msgstr "SmartGW"
++
++msgid "SmartGW announcements"
++msgstr "Declaraciones SmartGW"
++
++msgid "SmartGateway is not configured on this system."
++msgstr "SmartGateway no está configurado."
++
++msgid "Source address"
++msgstr "Dirección origen"
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++"Especifica la velocidad del enlace en kilobits/s. El primer parámetro es la "
++"subida y el segundo la bajada. Por defecto es \"128 1024\"."
++
++msgid "Speed of the uplink"
++msgstr "Velocidad de subida"
++
++msgid "State"
++msgstr "Estado"
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr "Aún usable (20 > SNR > 5)"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr "Aún usable (4 < ETX < 10)"
++
++msgid "Success rate of packages received from the neighbour"
++msgstr "Ratio de éxito de paquetes recibidos de la vecindad"
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr "Ratio de éxito de paquetes enviados a la vecindad"
++
++msgid "TC"
++msgstr "TC"
++
++msgid "TC interval"
++msgstr "Intervalo TC"
++
++msgid "TC validity time"
++msgstr "Validez de TC"
++
++msgid "TOS value"
++msgstr "TOS"
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++"El demonio OLSR es una implementación del protocolo Optimized Link State "
++"Routing. Permite enrutado mesh para cualquier equipo en red. Funciona sobre "
++"cualquier tarjeta wi.fi que soporte el modo ad-hoc y cualquier dispositivo "
++"ethernet. Puede visitar <a href='http://www.olsr.org'>olsrd.org</a> para "
++"ayuda y documentación."
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++"Willingness fija a usar. Si no se establece se calculará dinámicamente "
++"basándose en el estado de la batería y la corriente. Por defecto es 3."
++
++msgid "The interface OLSRd should serve."
++msgstr "Interfaz a usar por OLSRD."
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++"Puerto a usar por OLSR. Debería ser 698 tal y como asigna IANA. Puede tener "
++"un valor entre 1 y 65535."
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++"Prefijo IPv6 a mostrar a clientes del enlace. Puede hacer que un cliente "
++"cambio su dirección IPv6 para usar la pasarela sin ningún tipo de traducción "
++"de dirección. La longitud máxima del prefijo es 64 bits. Por defecto es "
++"\"::/0\" (sin prefijo)."
++
++msgid "Timing and Validity"
++msgstr "Tiempo y validez"
++
++msgid "Topology"
++msgstr "Topología"
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++"Tipo de servicio para la cabecera de control de tráfico de IP. Por defecto "
++"es 16."
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr "¡No puedo conectar con el demonio OLSR!"
++
++msgid "Uplink"
++msgstr "Enlace saliente"
++
++msgid "Uplink uses NAT"
++msgstr "El enlace saliente usa NAT"
++
++msgid "Use hysteresis"
++msgstr "Usar histéresis"
++
++msgid "Validity Time"
++msgstr "Tiempo de validez"
++
++msgid "Version"
++msgstr "Versión"
++
++msgid "Very good (ETX < 2)"
++msgstr "Muy bien (ETX < 2)"
++
++msgid "Very good (SNR > 30)"
++msgstr "Muy bien (SNR > 30)"
++
++msgid "WLAN"
++msgstr "WLAN"
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++"Aviso: kmod-ipip no está instalado. Sin kmod-ipip SmartGateway no funcionará."
++
++msgid "Weight"
++msgstr "Peso"
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++"Cuando hayan múltiples enlaces entre máquinas el peso del interfaz se usar "
++"para determinar qué enlace usar. Normalmente se calcula automáticamente "
++"basándose en las características de la interfaz, pero puede indicar un valor "
++"fijo. OLSRd elegirá enlaces con el valor menor.<br /><b>Nota:</b> El peso "
++"del interfaz se usao sólo cuando LinkQualityLevel está en 0. Para otros "
++"valores se usará el valor del interfaz EXT."
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++"Tipo de enlace exportado a otros nodos del mesh. Un enlace se detecta "
++"buscando una HNA local de 0.0.0.0/0, ::ffff:0:0/96 o 2000::/3. Por defecto "
++"\"both\"."
++
++#, fuzzy
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++"Tipo de enlace exportado a otros nodos del mesh. Un enlace se detecta "
++"buscando una HNA local de 0.0.0.0/0, ::ffff:0:0/96 o 2000::/3. Por defecto "
++"\"both\"."
++
++msgid "Willingness"
++msgstr "Willingness"
++
++msgid "Yellow"
++msgstr "Amarillo"
++
++msgid "no"
++msgstr "no"
++
++msgid "yes"
++msgstr "sí"
++
++#~ msgid "Device"
++#~ msgstr "Dispositivo"
++
++#~ msgid ""
++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, "
++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"."
++#~ msgstr ""
++#~ "Asegúrese de que OLSRd se está ejecutando, que el plugin \"txtinfo\" esté "
++#~ "cargado, configurado en el puerto 2006 y que acepta conexiones desde "
++#~ "127.0.0.1."
++
++#~ msgid ""
++#~ "Multiply routes with the factor given here. Allowed values are between "
++#~ "0.01 and 1. It is only used when LQ-Level is greater than 0. Examples:"
++#~ "<br />reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to "
++#~ "all nodes on this interface by 20%: default 0.8"
++#~ msgstr ""
++#~ "Multiplicar rutas por este factor. Valores entre 0,01 y 1. Sólo se usa si "
++#~ "el nivel de CA es mayor que 0. Ejemplos:<br />reducir CE a la mitad a "
++#~ "192.168.0.1: \"192.168.0.1 0.5\"<br />reducir CE a todos los nodos en "
++#~ "esta interfaz el 20%: \"default 0.8\""
+diff --git a/feeds/luci/applications/luci-app-olsr/po/fr/olsr.po b/feeds/luci/applications/luci-app-olsr/po/fr/olsr.po
+new file mode 100644
+index 0000000..e93a6bd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/fr/olsr.po
+@@ -0,0 +1,692 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-01-15 05:35+0200\n"
++"Last-Translator: desillu <ledesillusionniste@hotmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr "IPv6 multidiffusion"
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-olsr/po/he/olsr.po b/feeds/luci/applications/luci-app-olsr/po/he/olsr.po
+new file mode 100644
+index 0000000..38aa43b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/he/olsr.po
+@@ -0,0 +1,687 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-olsr/po/hu/olsr.po b/feeds/luci/applications/luci-app-olsr/po/hu/olsr.po
+new file mode 100644
+index 0000000..38aa43b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/hu/olsr.po
+@@ -0,0 +1,687 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-olsr/po/it/olsr.po b/feeds/luci/applications/luci-app-olsr/po/it/olsr.po
+new file mode 100644
+index 0000000..a88d297
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/it/olsr.po
+@@ -0,0 +1,733 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-02-10 15:13+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr "Annunci MID attivi"
++
++msgid "Active OLSR nodes"
++msgstr "Nodi OLSR attivi"
++
++msgid "Active host net announcements"
++msgstr "Annunci rete host attiva"
++
++msgid "Advanced Settings"
++msgstr "Opzioni avanzate"
++
++msgid "Allow gateways with NAT"
++msgstr "Permetti gateway con NAT"
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr "Permetti l'uso di gateway in uscita con NAT"
++
++msgid "Announce uplink"
++msgstr "Annuncia uplink"
++
++msgid "Announced network"
++msgstr "Rete da annnunciare"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr "Entrambi i valori devono essere nella notazione decimale puntata"
++
++msgid "Broadcast address"
++msgstr "Indirizzo di broadcast"
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr "Configurazione"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr "Display"
++
++msgid "Downlink"
++msgstr "Downlink"
++
++msgid "Download Config"
++msgstr "Configurazione Download"
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "Attiva"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++"Abitita SmartGateway. Se è disattivata, tutti gli altri parametri "
++"SmartGateway verrano ignorati. Predefinito è \"no\"."
++
++msgid "Enable this interface."
++msgstr "Attiva questa interfaccia."
++
++msgid "Enabled"
++msgstr "Attivato"
++
++msgid "Expected retransmission count"
++msgstr "Expected retransmission count"
++
++msgid "FIB metric"
++msgstr "Metrica FIB"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr "Gateway"
++
++msgid "General Settings"
++msgstr "Impostazioni Generali"
++
++msgid "General settings"
++msgstr "Impostazioni Generali"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr "HNA"
++
++msgid "HNA Announcements"
++msgstr "Annuncio di HNA"
++
++msgid "HNA interval"
++msgstr "Intervallo HNA"
++
++msgid "HNA validity time"
++msgstr "Durata di validità HNA"
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "Annuncio di HNA"
++
++msgid "Hello"
++msgstr "Ciao"
++
++msgid "Hello interval"
++msgstr "Intervallo Saluto"
++
++msgid "Hello validity time"
++msgstr "Durata validità Saluto"
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr "Hna4"
++
++msgid "Hna6"
++msgstr "Hna6"
++
++msgid "Hops"
++msgstr "Hops"
++
++msgid "Hostname"
++msgstr "Nome Host"
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++"Isteresi del link (solo per la metrica hopocount). L'isteresi aggiunge "
++"robustezza alla sensibilità del link ma rallenta la registrazione dei "
++"vicini. Default è \"si\""
++
++msgid "IP Addresses"
++msgstr "Indirizzi IP"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++"Versione IP da usare. Se entrambe sono selezionate una istanza di olsrd è "
++"avviata per ogni versione."
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++"Indirizzo di broadcast per i pacchetti OLSR. Per esempio potresti avere "
++"255.255.255.255. Default is 0.0.0.0, il che abilita l'uso dell'ip di "
++"broadcast di default."
++
++msgid "IPv4 source"
++msgstr "IPv4 source"
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++"IPv4 source per i pacchetti uscenti da OLSR. Predefinito \"0.0.0.0\", il che "
++"abilita l'uso dell'IP dell'interfaccia di uscita."
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 multicast"
++msgstr "IPv6 multicast"
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++"IPv6 network deve essere specificata in full notation, il prefisso deve "
++"essere in CIDR notation."
++
++msgid "IPv6 source"
++msgstr "IPv6 source"
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++"IPv6 src prefix. OLSRd sceglierà uno degli IP dell'interfaccia che matchano "
++"questo parametro. Predefinito è \"0::/0\", il che abilita l'uso di un IP non-"
++"linklocal."
++
++msgid "IPv6-Prefix of the uplink"
++msgstr "IPv6-Prefix dell' uplink"
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++"Se la rotta del gateway attuale viene modificata, il valore di ETX del "
++"gateway è moltiplicata per questo valore prima che sia comparato con nuovo "
++"valore.Il parametro può essere compreso tra 0.1 e 1.0, ma si consiglia un "
++"valore vicino a 1.0. <br /><b>ATTENZIONE:</b> Questo valore non deve essere "
++"utilizzato insieme con la metrica etx_ffeth!<br />Defaults a \"1.0\"."
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++"Se questo nodo usa un NAT per connettersi a Internet. Predefinito è \"si\"."
++
++msgid "Interface"
++msgstr "Interfaccia"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr "Annuncio di HNA"
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr "Impossibile connetersi al demone OLSR!"
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr "L'uplink usa il NAT"
++
++msgid "Use hysteresis"
++msgstr "Usa l'isteresi"
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr "Versione"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr "WLAN"
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr "Peso"
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++"Quando link multipli esisto tra gli hosts il peso dell'interfaccia viene "
++"usato. Normalmente il peso è automaticamente calcolato dal demone olsrd in "
++"base alle caratteristiche del link, ma qui puoi specificare un valore di "
++"contrappeso. OLSRd sceglierà il link con il più basso valore.<br><b>Nota:</"
++"b>Il peso dell'interfaccia è uso quando LinkQualityLevel è 0. Per ogni altro "
++"valore di LinkQualityLevel, il valore di ETX è usato."
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++"Quale tipo di uplink è mostrato agli altri nodi. Un uplink è individuato "
++"cercando un HNA del tipo 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++
++#, fuzzy
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++"Quale tipo di uplink è mostrato agli altri nodi. Un uplink è individuato "
++"cercando un HNA del tipo 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid "Device"
++#~ msgstr "Periferica"
+diff --git a/feeds/luci/applications/luci-app-olsr/po/ja/olsr.po b/feeds/luci/applications/luci-app-olsr/po/ja/olsr.po
+new file mode 100644
+index 0000000..b3f0109
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/ja/olsr.po
+@@ -0,0 +1,800 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-11-14 14:40+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr "アクティブãªMID(Multi Interface Declaration) 通知"
++
++msgid "Active OLSR nodes"
++msgstr "アクティブãªOLSRノード"
++
++msgid "Active host net announcements"
++msgstr "アクティブãªãƒ›ã‚¹ãƒˆãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯é€šçŸ¥"
++
++msgid "Advanced Settings"
++msgstr "詳細設定"
++
++msgid "Allow gateways with NAT"
++msgstr "NATを使用ã™ã‚‹ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã‚’é¸æŠžå¯èƒ½ã«ã™ã‚‹"
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr "NATを介ã—ã¦ãƒ‘ケットをé€ä¿¡ã™ã‚‹IPv4 ゲートウェイをé¸æŠžå¯èƒ½ã«ã—ã¾ã™"
++
++msgid "Announce uplink"
++msgstr "通知ã™ã‚‹ã‚¢ãƒƒãƒ—リンク"
++
++msgid "Announced network"
++msgstr "通知ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr "ã©ã¡ã‚‰ã®å€¤ã‚‚ドット付ãå進数ã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„。"
++
++msgid "Broadcast address"
++msgstr "ブロードキャストアドレス"
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr "設定"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr "ディスプレイ"
++
++msgid "Downlink"
++msgstr "ダウンリンク"
++
++msgid "Download Config"
++msgstr "設定ダウンロード"
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "有効"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++"スマートゲートウェイを有効ã«ã—ã¾ã™ã€‚無効ã®å ´åˆã€ãã®ä»–å…¨ã¦ã®ã‚¹ãƒžãƒ¼ãƒˆã‚²ãƒ¼ãƒˆ"
++"ウェイã®è¨­å®šå€¤ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚標準設定ã¯\"無効\"ã§ã™ã€‚"
++
++msgid "Enable this interface."
++msgstr "ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’有効ã«ã—ã¾ã™ã€‚"
++
++msgid "Enabled"
++msgstr "有効"
++
++msgid "Expected retransmission count"
++msgstr "å†é€æ•°ã®æœŸå¾…値"
++
++msgid "FIB metric"
++msgstr "FIB メトリック"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++"FIB メトリックã¯ã€OLSRdãŒè¨­å®šã™ã‚‹ãƒ›ã‚¹ãƒˆçµŒè·¯ã®ãƒ¡ãƒˆãƒªãƒƒã‚¯å€¤ã‚’コントロールã—ã¾"
++"ã™ã€‚\"flat\"ã‚’é¸æŠžã—ãŸå ´åˆã€ãƒ¡ãƒˆãƒªãƒƒã‚¯å€¤ã¯å¸¸ã«\"2\"ã¨ãªã‚Šã¾ã™ã€‚ã“ã®è¨­å®šã¯ã€"
++"Linuxカーãƒãƒ«ãŒå¤ã„経路を消去ã™ã‚‹ã®ã«æœ‰åŠ¹ãªãŸã‚ã€å¥½ã¾ã—ã„設定ã§ã™ã€‚\"correct"
++"\"ã¯ãƒ›ãƒƒãƒ—数をメトリック値ã¨ã—ã¦ä½¿ç”¨ã—ã¾ã™ã€‚\"approx\"ã‚‚åŒæ§˜ã«ãƒ›ãƒƒãƒ—数をメト"
++"リック値ã¨ã—ã¦ä½¿ç”¨ã—ã¾ã™ãŒã€æ¬¡ãƒ›ãƒƒãƒ—ãŒå¤‰æ›´ã—ãŸå ´åˆã®ã¿æ›´æ–°ã‚’è¡Œã„ã¾ã™ã€‚標準設"
++"定ã¯\"flat\"ã§ã™ã€‚"
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr "TCsã®fisheyeメカニズムを使用ã—ã¾ã™ã€‚標準設定ã¯\"有効\"ã§ã™ã€‚"
++
++msgid "Gateway"
++msgstr "ゲートウェイ"
++
++msgid "General Settings"
++msgstr "一般設定"
++
++msgid "General settings"
++msgstr "一般設定"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr "HNA"
++
++msgid "HNA Announcements"
++msgstr "HNA 通知"
++
++msgid "HNA interval"
++msgstr "HNA é€ä¿¡é–“éš”"
++
++msgid "HNA validity time"
++msgstr "HNA 有効時間"
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "HNA 通知"
++
++msgid "Hello"
++msgstr "Hello"
++
++msgid "Hello interval"
++msgstr "Hello é€ä¿¡é–“éš”"
++
++msgid "Hello validity time"
++msgstr "Hello 有効時間"
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr "Hna4"
++
++msgid "Hna6"
++msgstr "Hna6"
++
++msgid "Hops"
++msgstr "ホップ"
++
++msgid "Hostname"
++msgstr "ホストå"
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++"リンク検出ã«å¯¾ã™ã‚‹ãƒ’ステリシスを設定ã—ã¾ã™ (ホップ数メトリックã®å ´åˆã®ã¿æœ‰"
++"効)。ヒステリシスã¯ãƒªãƒ³ã‚¯æ¤œå‡ºã«å¯¾ã™ã‚‹ãƒ­ãƒã‚¹ãƒˆæ€§ã‚’å‘上ã•ã›ã¾ã™ãŒã€éš£æŽ¥ãƒŽãƒ¼ãƒ‰ã®"
++"登録ãŒé…ããªã‚Šã¾ã™ã€‚標準設定ã¯\"有効\"ã§ã™ã€‚"
++
++msgid "IP Addresses"
++msgstr "IPアドレス"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++"使用ã™ã‚‹IPプロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’指定ã—ã¾ã™ã€‚6and4ãŒé¸æŠžã•ã‚ŒãŸå ´åˆã€å„プロトコ"
++"ルã«å¯¾ã—ã¦1ã¤ã¥ã¤OLSRdインスタンスãŒèµ·å‹•ã—ã¾ã™ã€‚"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr "IPv4 ブロードキャスト"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++"é€ä¿¡ã™ã‚‹OLSRパケットã®IPv4ブロードキャストアドレスã§ã™ã€‚便利ãªä¸€ä¾‹ã¨ã—ã¦ã€"
++"255.255.255.255ãŒæŒ™ã’られã¾ã™ã€‚標準設定ã¯\"0.0.0.0\"ã§ã‚ã‚Šã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹"
++"ã®ãƒ–ロードキャストIPを使用ã—ã¾ã™ã€‚"
++
++msgid "IPv4 source"
++msgstr "IPv4 é€ä¿¡å…ƒ"
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++"é€ä¿¡ã™ã‚‹OLSRパケットã®IPv4é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™ã€‚標準設定ã¯\"0.0.0.0\"ã§ã‚ã‚Šã€ã‚¤"
++"ンターフェースã®IPを使用ã—ã¾ã™ã€‚"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 multicast"
++msgstr "IPv6 マルãƒã‚­ãƒ£ã‚¹ãƒˆ"
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++"IPv6 マルãƒã‚­ãƒ£ã‚¹ãƒˆã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã—ã¾ã™ã€‚標準ã¯MANETルーターãŒä½¿ç”¨ã™ã‚‹ãƒªãƒ³ã‚¯"
++"ローカル・マルãƒã‚­ãƒ£ã‚¹ãƒˆã§ã‚ã‚‹\"FF02::6D\"ã§ã™ã€‚"
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++"IPv6 ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯çœç•¥ã›ãšã«å…¥åŠ›ã—ã¦ãã ã•ã„。プレフィクスã¯CIDRå½¢å¼"
++"ã§å…¥åŠ›ã—ã¦ãã ã•ã„。"
++
++msgid "IPv6 source"
++msgstr "IPv6 é€ä¿¡å…ƒ"
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++"IPv6é€ä¿¡å…ƒãƒ—レフィクスを設定ã—ã¾ã™ã€‚OLSRdã¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®ä¸­ã‹ã‚‰ã€ã“ã®ãƒ—レ"
++"フィクス値ã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ã‚’é¸æŠžã—ã¾ã™ã€‚標準設定ã¯\"0::/0\"ã§ã‚ã‚Šã€ãƒªãƒ³ã‚¯ãƒ­ãƒ¼ã‚«"
++"ルIPã§ãªã„インターフェースIPを使用ã—ã¾ã™ã€‚"
++
++msgid "IPv6-Prefix of the uplink"
++msgstr "アップリンクIPv6 プレフィクス"
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++"ç¾åœ¨ã®ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã¸ã®çµŒè·¯ãŒå¤‰ã‚ã‚‹å ´åˆã€ã“ã®ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã®ETX値ã¯æ–°ã—ã„値ã¨æ¯”"
++"較ã•ã‚Œã‚‹å‰ã«ã€ã“ã®ãƒ‘ラメータã®å€¤ã¨ä¹—ç®—ã•ã‚Œã¾ã™ã€‚パラメータã¯0.1ã‹ã‚‰1.0ã®é–“ã§"
++"設定å¯èƒ½ã§ã™ã€‚ãŸã ã—ã€å¤‰æ›´ã™ã‚‹å ´åˆã€1.0ã«è¿‘ã„値を設定ã™ã‚‹äº‹ã‚’ãŠè–¦ã‚ã—ã¾ã™ã€‚"
++"<br /><b>警告:</b>ã“ã®ãƒ‘ラメータã¯etx_ffeth メトリックã¨åŒæ™‚ã«ä½¿ç”¨ã—ãªã„ã§ã"
++"ã ã•ã„!<br />標準設定ã¯\"1.0\"ã§ã™ã€‚"
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++"ã“ã®ãƒŽãƒ¼ãƒ‰ãŒNATを使用ã—ã¦ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹å ´åˆã€æœ‰åŠ¹ã«ã—ã¦ãã ã•ã„。標"
++"準設定ã¯\"有効\"ã§ã™ã€‚"
++
++msgid "Interface"
++msgstr "インターフェース"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++"インターフェースモードã¯ã€ã‚¹ã‚¤ãƒƒãƒä¸Šã®ã‚¤ãƒ¼ã‚µãƒãƒƒãƒˆã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«ä¸å¿…è¦ãª"
++"パケットã®é€ä¿¡ã‚’抑制ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã—ã¾ã™ã€‚有効ãªãƒ¢ãƒ¼ãƒ‰ã¯\"mesh\"åŠã³\"ether"
++"\"ã§ã™ã€‚標準設定ã¯\"mesh\"ã§ã™ã€‚"
++
++msgid "Interfaces"
++msgstr "インターフェース"
++
++msgid "Interfaces Defaults"
++msgstr "インターフェース デフォルト設定"
++
++msgid "Internet protocol"
++msgstr "インターãƒãƒƒãƒˆãƒ—ロトコル"
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++"ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®è¨­å®šãŒå¤‰æ›´ã•ã‚ŒãŸã‹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ãƒãƒ¼ãƒªãƒ³ã‚°é–“"
++"隔を秒å˜ä½ã§è¨­å®šã—ã¾ã™ã€‚標準設定ã¯\"2.5\"ã§ã™ã€‚"
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr "OLSR ルーティング"
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr "LQ エイジング"
++
++msgid "LQ algorithm"
++msgstr "LQ アルゴリズム"
++
++msgid "LQ fisheye"
++msgstr "LQ fisheye"
++
++msgid "LQ level"
++msgstr "LQ レベル"
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr "最終ホップ"
++
++msgid "Legend"
++msgstr "凡例"
++
++msgid "Library"
++msgstr "ライブラリ"
++
++msgid "Link Quality Settings"
++msgstr "リンクå“質 (LQ) 設定"
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++"リンクå“質 (LQ) ã®ã‚¨ã‚¤ã‚¸ãƒ³ã‚°è¦ç´ ã®è¨­å®šã‚’è¡Œã„ã¾ã™ (LQ レベルãŒ2ã®å ´åˆã®ã¿æœ‰"
++"効)。etx_floatåŠã³etx_fpmã®å€¤ã®èª¿æ•´ã‚’è¡Œã„ã¾ã™ã€‚値ãŒå°ã•ããªã‚‹ã¨ã€ETX値ã®å¤‰åŒ–"
++"ãŒé…ããªã‚Šã¾ã™ã€‚設定å¯èƒ½ãªå€¤ã¯0.01-1.0ã§ã™ã€‚"
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++"リンクå“質 (LQ) アルゴリズムを設定ã—ã¾ã™ (LQ レベルãŒ2ã®å ´åˆã®ã¿æœ‰åŠ¹)。<br /"
++"><b>etx_float</b>: 浮動å°æ•°ç‚¹æ¼”算+指数関数エイジング<br /><b>etx_fpm</b> : "
++"etx_floatã¨åŒæ§˜ã€ãŸã ã—整数値演算を行ã„ã¾ã™<br /><b>etx_ff</b> : ETX "
++"freifunk, ETXã®å¤‰å½¢ç‰ˆã§ã‚ã‚Šã€ETX算出ã®ãŸã‚ã«Helloパケットã ã‘ã§ãªãå…¨ã¦ã®OLSR"
++"トラフィックを使用ã—ã¾ã™<br /><b>etx_ffeth</b>: etx_ffã¨äº’æ›æ€§ã®ãªã„変形版ã§"
++"ã™ã€‚イーサãƒãƒƒãƒˆã®ãƒªãƒ³ã‚¯ã«ETX 0.1を設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™<br />標準設定ã¯"
++"\"etx_ff\"ã§ã™ã€‚"
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++"リンクå“質(LQ) レベルã®è¨­å®šã§ã¯ã€ãƒ›ãƒƒãƒ—数ベースã¾ãŸã¯ã‚³ã‚¹ãƒˆãƒ™ãƒ¼ã‚¹(ETX) ã®ã©ã¡"
++"らã‹ã«ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°æ–¹æ³•ã‚’切り替ãˆã¾ã™ã€‚<br /><b>0</b> = リンクå“質を加味ã—ãªã„"
++"<br /><b>2</b> = MPR集åˆåŠã³ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã«ãƒªãƒ³ã‚¯å“質を加味ã™ã‚‹<br />標準設定"
++"ã¯\"2\"ã§ã™ã€‚"
++
++msgid "LinkQuality Multiplicator"
++msgstr "リンクå“質 (LQ) マルãƒãƒ—リケーター"
++
++msgid "Links per node (average)"
++msgstr "ノードã‚ãŸã‚Šã®ãƒªãƒ³ã‚¯æ•° (å¹³å‡)"
++
++msgid "Links total"
++msgstr "リンク数ã®åˆè¨ˆ"
++
++msgid "Local interface IP"
++msgstr "ローカルインターフェース IP"
++
++msgid "MID"
++msgstr "MID"
++
++msgid "MID interval"
++msgstr "MID é€ä¿¡é–“éš”"
++
++msgid "MID validity time"
++msgstr "MID 有効時間"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid "Main IP"
++msgstr "メインIP"
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr "メトリック"
++
++msgid "Mode"
++msgstr "モード"
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++#, fuzzy
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++"経路ã®LQã¨è¨­å®šå€¤ã®ä¹—ç®—ã‚’è¡Œã„ã¾ã™ã€‚設定å¯èƒ½ãªå€¤ã¯0.01-1ã§ã™ã€‚ã“ã®è¨­å®šã¯LQ レベ"
++"ルãŒ0以上ã®å ´åˆã®ã¿è¨­å®šå¯èƒ½ã§ã™ã€‚<br />例:192.168.0.1ã¸ã®LQã‚’åŠåˆ†ã«ã™ã‚‹å ´åˆ: "
++"192.168.0.1 0.5<br />ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‹ã‚‰å…¨ã¦ã®ãƒŽãƒ¼ãƒ‰ã¸å¯¾ã—ã¦20%減らã™å ´"
++"åˆ: default 0.8"
++
++msgid "NAT threshold"
++msgstr "NAT ã—ãã„値"
++
++msgid "NLQ"
++msgstr "NLQ"
++
++msgid "Neighbors"
++msgstr "隣接ノード"
++
++msgid "Neighbour IP"
++msgstr "隣接ノード IP"
++
++msgid "Neighbours"
++msgstr "隣接ノード"
++
++msgid "Netmask"
++msgstr "ãƒãƒƒãƒˆãƒžã‚¹ã‚¯"
++
++msgid "Network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++msgid "Network address"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++msgid "Nic changes poll interval"
++msgstr "NIC変更ãƒãƒ¼ãƒªãƒ³ã‚°é–“éš”"
++
++msgid "Nodes"
++msgstr "ノード"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "OLSR - Display Options"
++msgstr "OLSR - 表示オプション"
++
++msgid "OLSR - HNA-Announcements"
++msgstr "OLSR - HNA (Host and Network Association) 通知"
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr "OLSR - HNA (Host and Network Association) 通知"
++
++msgid "OLSR - Plugins"
++msgstr "OLSR - プラグイン"
++
++msgid "OLSR Daemon"
++msgstr "OLSR デーモン"
++
++msgid "OLSR Daemon - Interface"
++msgstr "OLSR デーモン - インターフェース"
++
++msgid "OLSR connections"
++msgstr "OLSR コãƒã‚¯ã‚·ãƒ§ãƒ³"
++
++msgid "OLSR gateway"
++msgstr "OLSR ゲートウェイ"
++
++msgid "OLSR node"
++msgstr "OLSR ノード"
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr "概è¦"
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr "ç¾åœ¨ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªOLSR HNA 一覧"
++
++msgid "Overview of currently established OLSR connections"
++msgstr "ç¾åœ¨ç¢ºç«‹æ¸ˆã®OLSR接続一覧"
++
++msgid "Overview of currently known OLSR nodes"
++msgstr "ç¾åœ¨æ—¢çŸ¥ã®OLSRノードã®ä¸€è¦§"
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr "ç¾åœ¨ã®ãã®ä»–ã®OLSRノードã¸ã®çµŒè·¯ä¸€è¦§"
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr "OLSR稼åƒä¸­ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ä¸€è¦§"
++
++msgid "Overview of known multiple interface announcements"
++msgstr "通知ã•ã‚Œã¦ã„るマルãƒãƒ»ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®ä¸€è¦§"
++
++msgid "Overview of smart gateways in this network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ã‚¹ãƒžãƒ¼ãƒˆãƒ»ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ä¸€è¦§"
++
++msgid "Plugin configuration"
++msgstr "プラグイン設定"
++
++msgid "Plugins"
++msgstr "プラグイン"
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr "OLSRソケットã®ãƒãƒ¼ãƒªãƒ³ã‚°é–“隔を秒å˜ä½ã§è¨­å®šã—ã¾ã™ã€‚標準ã¯0.05ã§ã™ã€‚"
++
++msgid "Pollrate"
++msgstr "ãƒãƒ¼ãƒªãƒ³ã‚°é–“éš”"
++
++msgid "Port"
++msgstr "ãƒãƒ¼ãƒˆ"
++
++msgid "Prefix"
++msgstr "プレフィックス"
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr "åå‰è§£æ±º"
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++"ステータス・ページã§ãƒ›ã‚¹ãƒˆåã®åå‰è§£æ±ºã‚’è¡Œã„ã¾ã™ã€‚一般的ã«ã¯æœ¬æ©Ÿèƒ½ã‚’使用ã—ã¦"
++"ã‚‚å•é¡ŒãŒèµ·ã“ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ã‚‚ã—ã‚ãªãŸãŒãƒ‘ブリックIPã‚„ä¸å®‰å®šãªDNS設定を"
++"使用ã—ã¦ã„ã‚‹å ´åˆã€ãƒšãƒ¼ã‚¸ã®èª­ã¿è¾¼ã¿é€Ÿåº¦ãŒæ¥µç«¯ã«é…ããªã‚Šã¾ã™ã€‚ãã®å ´åˆã¯ã“ã®æ©Ÿ"
++"能を無効ã«ã—ã¦ãã ã•ã„。"
++
++msgid "Routes"
++msgstr "経路"
++
++msgid "Secondary OLSR interfaces"
++msgstr "セカンダリOLSR インターフェース"
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++"ルーターã®ãƒ¡ã‚¤ãƒ³IP (発信元IP)を設定ã—ã¦ãã ã•ã„。ã“ã®IPã¯ã€OLSRdã®ç¨¼åƒä¸­ã¯æ±º"
++"ã—ã¦å¤‰æ›´ã—ã¾ã›ã‚“。標準設定ã¯0.0.0.0ã§ã‚ã‚Šã€ãƒ—ライマリ・インターフェースã®IPã‚’"
++"自動的ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
++
++#, fuzzy
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++"ルーターã®ãƒ¡ã‚¤ãƒ³IP (発信元IP)を設定ã—ã¦ãã ã•ã„。ã“ã®IPã¯ã€OLSRdã®ç¨¼åƒä¸­ã¯æ±º"
++"ã—ã¦å¤‰æ›´ã—ã¾ã›ã‚“。標準設定ã¯0.0.0.0ã§ã‚ã‚Šã€ãƒ—ライマリ・インターフェースã®IPã‚’"
++"自動的ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr "SmartGW"
++
++msgid "SmartGW announcements"
++msgstr "SmartGW 通知"
++
++msgid "SmartGateway is not configured on this system."
++msgstr "スマート・ゲートウェイ(SmartGW)ã¯è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
++
++msgid "Source address"
++msgstr "é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++"アップリンク速度をキロビット/秒ã§è¨­å®šã—ã¦ãã ã•ã„。1ã¤ç›®ã®ãƒ‘ラメータã¯ä¸Šã‚Šã€2"
++"ã¤ç›®ã®ãƒ‘ラメータã¯ä¸‹ã‚Šã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ã§ã™ã€‚標準ã¯\"128 1024\"ã§ã™ã€‚"
++
++msgid "Speed of the uplink"
++msgstr "アップリンク速度"
++
++msgid "State"
++msgstr "状態"
++
++msgid "Status"
++msgstr "ステータス"
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr "隣接ノードã‹ã‚‰å—ä¿¡ã—ãŸãƒ‘ケットã®å—ä¿¡æˆåŠŸçŽ‡"
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr "隣接ノードã¸é€ä¿¡ã—ãŸãƒ‘ケットã®é€ä¿¡æˆåŠŸçŽ‡"
++
++msgid "TC"
++msgstr "TC"
++
++msgid "TC interval"
++msgstr "TC é€ä¿¡é–“éš”"
++
++msgid "TC validity time"
++msgstr "TC 有効時間"
++
++msgid "TOS value"
++msgstr "TOS値"
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++"OLSRデーモンã¯ã€Optimized Link State Routingプロコトルを実装ã—ãŸã‚µãƒ¼ãƒ“スã§"
++"ã™ã€‚OLSRã¯ã©ã®ã‚ˆã†ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç’°å¢ƒã§ã‚‚メッシュルーティングを実ç¾ã—ã¾ã™ã€‚"
++"OLSRã¯ã‚¢ãƒ‰ãƒ›ãƒƒã‚¯ãƒ»ãƒ¢ãƒ¼ãƒ‰ã‚’サãƒãƒ¼ãƒˆã—ãŸå…¨ã¦ã®ç„¡ç·šLANカードをサãƒãƒ¼ãƒˆã—ã€ã‚‚ã¡ã‚"
++"ã‚“å…¨ã¦ã®ã‚¤ãƒ¼ã‚µãƒãƒƒãƒˆãƒ‡ãƒã‚¤ã‚¹ã§ã‚‚使用å¯èƒ½ã§ã™ã€‚<a href='http://www.olsr."
++"org'>olsrd.org</a>ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€ãƒ˜ãƒ«ãƒ—åŠã³ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++"willingnessを固定ã™ã‚‹å ´åˆã«ä½¿ç”¨ã—ã¾ã™ã€‚willingnessãŒè¨­å®šã•ã‚Œã¦ã„ãªã„å ´åˆã€"
++"ãƒãƒƒãƒ†ãƒªã‚„é›»æºã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã«ã‚ˆã£ã¦å‹•çš„ã«è¨ˆç®—ã•ã‚Œã¾ã™ã€‚標準ã¯\"3\"ã§ã™ã€‚"
++
++msgid "The interface OLSRd should serve."
++msgstr "OLSRdãŒä½¿ç”¨ã™ã‚‹ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ã™ã€‚"
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++"OLSRãŒä½¿ç”¨ã™ã‚‹ãƒãƒ¼ãƒˆç•ªå·ã§ã™ã€‚通常ã€ã“ã®ãƒãƒ¼ãƒˆç•ªå·ã¯IANAãŒã‚¢ã‚µã‚¤ãƒ³ã—ãŸ698番ã§"
++"ã‚ã‚‹ã¹ãã§ã™ã€‚1-65535ã®é–“ã§è¨­å®šå¯èƒ½ã§ã™ã€‚"
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr "é€ä¿¡é–“éš”åŠã³æœ‰åŠ¹æ™‚é–“"
++
++msgid "Topology"
++msgstr "トãƒãƒ­ã‚¸ãƒ¼"
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++"OLSRコントロールパケットã«ãŠã‘ã‚‹ã€IPヘッダã®TOS (Type Of Service) 値を設定ã—"
++"ã¾ã™ã€‚標準設定ã¯\"16\"ã§ã™ã€‚"
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr "OLSRデーモンã«æŽ¥ç¶šã§ãã¾ã›ã‚“ï¼"
++
++msgid "Uplink"
++msgstr "アップリンク"
++
++msgid "Uplink uses NAT"
++msgstr "NATを使用ã—ã¦ä¸Šä½ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã™ã‚‹"
++
++msgid "Use hysteresis"
++msgstr "ヒステリシスを使用ã™ã‚‹"
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr "WLAN"
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++"警告: kmod-ipipãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“。スマートゲートウェイã¯kmod-ipip"
++"ãªã—ã§ã¯å‹•ä½œã—ã¾ã›ã‚“。ã¾ãšåˆã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’è¡Œãªã£ã¦ãã ã•ã„。"
++
++msgid "Weight"
++msgstr "Weight"
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++"ホスト間ã«ãŠã„ã¦è¤‡æ•°ã®çµŒè·¯ãŒå­˜åœ¨ã™ã‚‹å ´åˆã«ã€ã©ã¡ã‚‰ã®ãƒªãƒ³ã‚¯ã‚’使用ã™ã‚‹ã‹ã®æ±ºå®š"
++"ã‚’è¡Œã†ãŸã‚ã«ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®é‡ã¿ä»˜ã‘ã‚’è¡Œã„ã¾ã™ã€‚通常ã€weightã¯ã‚¤ãƒ³ã‚¿ãƒ¼"
++"フェースã®ç‰¹æ€§ã‚’基ã«ã€OLSRdãŒè‡ªå‹•çš„ã«è¨ˆç®—ã‚’è¡Œã„ã¾ã™ãŒã€å›ºå®šå€¤ã‚’設定ã™ã‚‹ã“ã¨ã‚‚"
++"å¯èƒ½ã§ã™ã€‚OLSRdã¯æœ€ã‚‚低ã„値ã®ãƒªãƒ³ã‚¯ã‚’é¸æŠžã—ã¾ã™ã€‚<br /><b>注æ„:</b>インター"
++"フェースã®é‡ã¿ä»˜ã‘ã¯ã€LQ レベルãŒ0ã®å ´åˆã®ã¿ã€è¨­å®šå¯èƒ½ã§ã™ã€‚LQ レベルãŒ0以外"
++"ã®å€¤ã®å ´åˆã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ ETX値ãŒä»£ã‚ã‚Šã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++"ã©ã®ã‚¢ãƒƒãƒ—リンクを他ã®ãƒ¡ãƒƒã‚·ãƒ¥ãƒŽãƒ¼ãƒ‰ã¸é€šçŸ¥ã™ã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚アップリンクã¯"
++"ローカルã®HNAã§ã‚ã‚‹0.0.0.0/0ã€::ffff:0:0/96ã€2000::/3を探索ã™ã‚‹ã“ã¨ã§æ¤œå‡ºã—ã¾"
++"ã™ã€‚標準設定ã¯ã€\"both\"ã§ã™ã€‚"
++
++#, fuzzy
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++"ã©ã®ã‚¢ãƒƒãƒ—リンクを他ã®ãƒ¡ãƒƒã‚·ãƒ¥ãƒŽãƒ¼ãƒ‰ã¸é€šçŸ¥ã™ã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚アップリンクã¯"
++"ローカルã®HNAã§ã‚ã‚‹0.0.0.0/0ã€::ffff:0:0/96ã€2000::/3を探索ã™ã‚‹ã“ã¨ã§æ¤œå‡ºã—ã¾"
++"ã™ã€‚標準設定ã¯ã€\"both\"ã§ã™ã€‚"
++
++msgid "Willingness"
++msgstr "Willingness"
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid "Device"
++#~ msgstr "デãƒã‚¤ã‚¹"
++
++#~ msgid ""
++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, "
++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"."
++#~ msgstr ""
++#~ "OLSRdãŒç¨¼åƒä¸­ã§ã‚ã‚‹ã“ã¨ã€\"txinfo\"プラグインãŒãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã€ãƒãƒ¼"
++#~ "ト2006番ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹ã“ã¨ã€\"127.0.0.1\"ã‹ã‚‰ã®æŽ¥ç¶šãŒè¨±å¯ã•ã‚Œã¦ã„ã‚‹ã“ã¨"
++#~ "を確èªã—ã¦ãã ã•ã„。"
+diff --git a/feeds/luci/applications/luci-app-olsr/po/ms/olsr.po b/feeds/luci/applications/luci-app-olsr/po/ms/olsr.po
+new file mode 100644
+index 0000000..c0edce1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/ms/olsr.po
+@@ -0,0 +1,686 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-olsr/po/no/olsr.po b/feeds/luci/applications/luci-app-olsr/po/no/olsr.po
+new file mode 100644
+index 0000000..38aa43b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/no/olsr.po
+@@ -0,0 +1,687 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-olsr/po/pl/olsr.po b/feeds/luci/applications/luci-app-olsr/po/pl/olsr.po
+new file mode 100644
+index 0000000..64a99f6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/pl/olsr.po
+@@ -0,0 +1,749 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-05 03:22+0200\n"
++"Last-Translator: piosl <sleczek.piotr@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr "Aktywne ogłoszenia MID"
++
++msgid "Active OLSR nodes"
++msgstr "Aktywne węzły OLSR"
++
++msgid "Active host net announcements"
++msgstr "Aktywne ogłoszenia hostnet"
++
++msgid "Advanced Settings"
++msgstr "Ustawienia zaawansowane"
++
++msgid "Allow gateways with NAT"
++msgstr "Zezwól na bramy z NAT"
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr "Zezwól na wybieranie wychodzącej bramy IPv4 przez NAT"
++
++msgid "Announce uplink"
++msgstr "Ogłaszaj uplink"
++
++msgid "Announced network"
++msgstr "Ogłaszana sieć"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++"Obie wartości muszą używać zapisu dziesiętnego z kropką przed częścią "
++"dziesiętną."
++
++msgid "Broadcast address"
++msgstr "Adres rozgłoszeniowy (broadcast)"
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr "Konfiguracja"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr "Wyświetl"
++
++msgid "Downlink"
++msgstr "Downlink"
++
++msgid "Download Config"
++msgstr "Ustawienia pobierania"
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "WÅ‚Ä…cz"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++"Włącz SmartGateway. Jeśli wyłączone, wszystkie inne parametry SmartGateway "
++"są ignorowane. Domyślnie jest wyłączone."
++
++msgid "Enable this interface."
++msgstr "WÅ‚Ä…cz ten interfejs."
++
++msgid "Enabled"
++msgstr "WÅ‚Ä…czone"
++
++msgid "Expected retransmission count"
++msgstr "Oczekiwana wartość retransmisji"
++
++msgid "FIB metric"
++msgstr "Metryka FIB"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++# skorzystałem z niemieckiego tłumaczenia
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++"Mechanizm Fisheye dla TCs (zaznaczone oznacza \"włączone\"). Domyślnie jest "
++"\"włączone\""
++
++msgid "Gateway"
++msgstr "Brama"
++
++msgid "General Settings"
++msgstr "Ustawienia ogólne"
++
++msgid "General settings"
++msgstr "Ustawienia ogólne"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr "HNA"
++
++msgid "HNA Announcements"
++msgstr "Ogłoszenia HNA"
++
++msgid "HNA interval"
++msgstr "Interwał HNA"
++
++msgid "HNA validity time"
++msgstr "Czas poprawności HNA"
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "Ogłoszenia HNA"
++
++msgid "Hello"
++msgstr "Hello"
++
++msgid "Hello interval"
++msgstr "Interwał Hello"
++
++msgid "Hello validity time"
++msgstr "Czas poprawności Hello"
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr "Hna4"
++
++msgid "Hna6"
++msgstr "Hna6"
++
++msgid "Hops"
++msgstr "Skoki (hops)"
++
++msgid "Hostname"
++msgstr "Nazwa hosta"
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++"Hosty w sieci OLSR mogą ogłaszać połączenia z zewnętrznymi sieciami poprzez "
++"wiadomości HNA."
++
++#, fuzzy
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++"Hosty w sieci OLSR mogą ogłaszać połączenia z zewnętrznymi sieciami poprzez "
++"wiadomości HNA."
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr "Adresy IP"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++"Wersja protokołu IP. Jeśli jest wybrana 6and4 wtedy instancja olsrd jest "
++"uruchomiona dla każdego protokołu."
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr "Rozgłaszanie IPv4"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++"Adres rozgłoszeniowy (broadcast) IPv4 dla wychodzących pakietów OLSR. "
++"Przydatnym przykładem byłoby 255.255.255.255. Domyślna wartość to "
++"\"0.0.0.0\" - jest wtedy używany adres rozgłoszeniowy interfejsu."
++
++msgid "IPv4 source"
++msgstr "Źródło IPv4"
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++"Adres źródłowy IPv4 dla wychodzących pakietów. Domyślna wartość to "
++"\"0.0.0.0\" - jest wtedy używany adres IP interfejsu."
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 multicast"
++msgstr "Multicast IPv6"
++
++# Nie mam pojęcia, jak to lepiej przetłumaczyć, ale w moich tłumaczeniach kieruję się zasadą "release early, release often".
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++"Adres multicast IPv6. Domyślna wartość to \"FF02::6D\", multicast lokalnego "
++"routera."
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++"Sieć IPv6 musi być podana w pełnej notacji, prefiks musi być w notacji CIDR."
++
++msgid "IPv6 source"
++msgstr "Źródło IPv6"
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++"Prefiks źródła IPv6. OLSRd wybierze jeden z adresów IP interfejsów, który "
++"będzie pasował do tego prefiksu. Domyślna wartość to \"0::/0\" - jest wtedy "
++"używany adres IP interfejsu."
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr "Czy węzeł korzysta z NAT do połączenia z Internetem. Domyślnie \"Tak\""
++
++msgid "Interface"
++msgstr "Interfejs"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++"Tryb interfejsu jest używany, aby zapobiec niepotrzebnemu przekazywaniu "
++"pakietów. Prawidłowe tryby to \"mesh\" i \"ether\". Domyślna wartość to "
++"\"mesh\"."
++
++msgid "Interfaces"
++msgstr "Interfejsy"
++
++# by Google :D po części
++msgid "Interfaces Defaults"
++msgstr "Standardy interfejsów"
++
++msgid "Internet protocol"
++msgstr "Protokół internetowy"
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr "Znane ścieżki OLSR"
++
++msgid "LQ"
++msgstr "LQ"
++
++msgid "LQ aging"
++msgstr "Starzenie siÄ™ LQ"
++
++msgid "LQ algorithm"
++msgstr "Algorytm LQ"
++
++msgid "LQ fisheye"
++msgstr "LQ-Fisheye"
++
++msgid "LQ level"
++msgstr "Poziom LQ"
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr "Ostatni skok (hop)"
++
++msgid "Legend"
++msgstr "Legenda"
++
++msgid "Library"
++msgstr "Biblioteka"
++
++#, fuzzy
++msgid "Link Quality Settings"
++msgstr "Ustawienia jakości linków"
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr "Mnożnik LinkQuality"
++
++msgid "Links per node (average)"
++msgstr "Linków na węzeł (średnio)"
++
++msgid "Links total"
++msgstr "Linków w sumie"
++
++msgid "Local interface IP"
++msgstr "IP lokalnego interfejsu"
++
++msgid "MID"
++msgstr "MID"
++
++msgid "MID interval"
++msgstr "Interwał MID"
++
++msgid "MID validity time"
++msgstr "Czas poprawności MID"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid "Main IP"
++msgstr "Główny IP"
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++#, fuzzy
++msgid "Metric"
++msgstr "Miara"
++
++msgid "Mode"
++msgstr "Tryb"
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr "Próg NAT"
++
++msgid "NLQ"
++msgstr "NLQ"
++
++msgid "Neighbors"
++msgstr "SÄ…siedzi"
++
++msgid "Neighbour IP"
++msgstr "IP sąsiadów"
++
++msgid "Neighbours"
++msgstr "SÄ…siedzi"
++
++msgid "Netmask"
++msgstr "Maska sieciowa"
++
++msgid "Network"
++msgstr "Sieć"
++
++msgid "Network address"
++msgstr "Adres sieci"
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr "Węzły"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr "OLSR - ogłoszenia HNA"
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr "OLSR - ogłoszenia HNA"
++
++msgid "OLSR - Plugins"
++msgstr "OLSR - pluginy"
++
++msgid "OLSR Daemon"
++msgstr "Demon OLSR"
++
++msgid "OLSR Daemon - Interface"
++msgstr "Demon OLSR - interfejs"
++
++msgid "OLSR connections"
++msgstr "Połączenia OLSR"
++
++msgid "OLSR gateway"
++msgstr "Brama OLSR"
++
++msgid "OLSR node"
++msgstr "Węzeł OLSR"
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr "PrzeglÄ…d"
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr "Przegląd aktywnych ogłoszeń hostnet OLSR"
++
++msgid "Overview of currently established OLSR connections"
++msgstr "Przegląd nawiązanych połączeń OLSR"
++
++msgid "Overview of currently known OLSR nodes"
++msgstr "Przegląd znanych węzłów OLSR"
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr "Przegląd znanych tras do innych węzłów OLSR"
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr "Przegląd interfejsów z włączonym OLSR"
++
++msgid "Overview of known multiple interface announcements"
++msgstr "Przegląd znanych wielointerfejsowych ogłoszeń"
++
++msgid "Overview of smart gateways in this network"
++msgstr "PrzeglÄ…d bram SmartGateway w tej sieci"
++
++msgid "Plugin configuration"
++msgstr "Ustawienia pluginu"
++
++msgid "Plugins"
++msgstr "Pluginy"
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Prefix"
++msgstr "Prefiks"
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr "Rozwiąż"
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr "Trasy (routes)"
++
++msgid "Secondary OLSR interfaces"
++msgstr "Zapasowy interfejs OLSR"
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr "SmartGW"
++
++msgid "SmartGW announcements"
++msgstr "Ogłoszenia SmartGW"
++
++msgid "SmartGateway is not configured on this system."
++msgstr "SmartGateway jest nieskonfigurowane."
++
++msgid "Source address"
++msgstr "Adres źródłowy"
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr "Stan"
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++#, fuzzy
++msgid "Success rate of packages received from the neighbour"
++msgstr "Wartość poprawnie otrzymanych od sąsiada pakietów"
++
++#, fuzzy
++msgid "Success rate of packages sent to the neighbour"
++msgstr "Wartość poprawnie wysłanych pakietów do sąsiada"
++
++msgid "TC"
++msgstr "TC"
++
++msgid "TC interval"
++msgstr "Interwał TC"
++
++msgid "TC validity time"
++msgstr "Czas poprawności TC"
++
++msgid "TOS value"
++msgstr "Wartość TOS"
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr "Interfejs, który powinien oferować OLSRd."
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++"Port używany przez OLSR. Zwykle powinien pozostać na przydzielonym przez "
++"IANA porcie 698. Może mieć wartość pomiędzy 1 a 65535."
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr "Topologia"
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr "Połączenie z demonem OLSR nieudane!"
++
++msgid "Uplink"
++msgstr "Uplink"
++
++msgid "Uplink uses NAT"
++msgstr "Uplink używa NAT"
++
++msgid "Use hysteresis"
++msgstr "Używaj histerezy"
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr "Wersja"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr "WLAN"
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++"Uwaga: kmod-ipip nie jest zainstalowany. Bez kmod-ipip bramy SmartGateway "
++"nie będą działać. Proszę go zainstalować."
++
++msgid "Weight"
++msgstr "Waga"
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++"Kiedy istnieje wiele połączeń między hostami, waga interfejsów określa, "
++"którego z nich użyć. Zwykle jest liczona automatycznie przez olsrd opartym "
++"na charakterystyce interfejsu, ale tu możesz podać stałą wartość. Olsrd "
++"wybierze połączenie z najniższą wartością.<br /><b>Uwaga:</b> Waga "
++"interfejsu jest używana tylko kiedy LinkQualityLevel jest ustawione na 0. "
++"Dla dowolnej innej wartości LinkQualityLevel, zamiast tego jest używana "
++"wartość ETX."
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr "Gotowość"
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid "Device"
++#~ msgstr "UrzÄ…dzenie"
++
++#~ msgid ""
++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, "
++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"."
++#~ msgstr ""
++#~ "Upewnij się że OLSRd jest uruchomione, \"txtinfo\" plugin jest "
++#~ "załadowany, skonfigurowany na porcie 2006 i akceptuje połączenia z "
++#~ "127.0.0.1 (localhost)"
+diff --git a/feeds/luci/applications/luci-app-olsr/po/pt-br/olsr.po b/feeds/luci/applications/luci-app-olsr/po/pt-br/olsr.po
+new file mode 100644
+index 0000000..1461c1d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/pt-br/olsr.po
+@@ -0,0 +1,906 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2014-06-21 19:36+0200\n"
++"Last-Translator: Éder <eder.grigorio@openmailbox.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr ""
++"Anúncios <abbr title=\"Multiple interface declaration,Declaração de "
++"interface múltipla\">MID</abbr> ativos"
++
++msgid "Active OLSR nodes"
++msgstr "Nós OLSR ativos"
++
++msgid "Active host net announcements"
++msgstr "Anúncios ativos de equipamentos"
++
++msgid "Advanced Settings"
++msgstr "Configurações Avançadas"
++
++msgid "Allow gateways with NAT"
++msgstr "Permitir rotadores com NAT"
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr "Permitir a seleção de rotador de saída IPv4 com NAT"
++
++msgid "Announce uplink"
++msgstr "Anunciar enlace superior (uplink)"
++
++msgid "Announced network"
++msgstr "Rede anunciada"
++
++# 20140621: edersg: tradução
++msgid "Bad (ETX > 10)"
++msgstr "Ruim (ETX > 10)"
++
++# 20140621: edersg: tradução
++msgid "Bad (SNR < 5)"
++msgstr "Ruim (SNR < 5)"
++
++msgid "Both values must use the dotted decimal notation."
++msgstr "Ambos os valores devem usar a notação decimal com pontos."
++
++msgid "Broadcast address"
++msgstr "Endereço de broadcast"
++
++# 20140621: edersg: tradução
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++"Somente pode ser um endereço IPv4 ou IPv6 válidos ou um endereço 'padrão'"
++
++# 20140621: edersg: tradução
++#, fuzzy
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++"Somente pode ser um endereço IPv4 ou IPv6 válidos ou um endereço 'padrão'"
++
++msgid "Configuration"
++msgstr "Configuração"
++
++# 20140621: edersg: tradução
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++"Não foi possível obter nenhuma informação. Certifique-se que a extensão "
++"jsoninfo está instalada e permite conexões a partir da sua máquina local "
++"(localhost)."
++
++msgid "Display"
++msgstr "Visão"
++
++msgid "Downlink"
++msgstr "Enlace inferior (downlink)"
++
++# I didn't find in GUI this one
++msgid "Download Config"
++msgstr "Configuração do Recebimento de Dados "
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "Habilitar"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++"Habilita o SmartGateway. Se isto está desabilitado, então todos os demais "
++"parâmetros do SmartGateway são ignorados. Padrão é \"não\"."
++
++msgid "Enable this interface."
++msgstr "Habilita esta interface."
++
++msgid "Enabled"
++msgstr "Habilitado"
++
++msgid "Expected retransmission count"
++msgstr "Contagem esperada de retransmissões"
++
++msgid "FIB metric"
++msgstr "Métrica FIB"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++"A métrica FIB controla o valor da métrica dos conjuntos de equipamentos-"
++"roteadores. \"flat\" significa que o valor da métrica é sempre 2. Este é o "
++"valor preferido porque ele ajuda o roteamento do kernel do Linux limpar as "
++"rotas antigas. \"correct\" usa a contagem de saltos como valor da métrica. "
++"\"approx\" também usa a contagem de saltos como métrica, mas somente "
++"atualiza a contagem de saltos se o próximo salto também mudar. O padrão é "
++"\"flat\"."
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++"Mecanismo Fisheye para <abbr title=\"Topology Control, Controle de Topologia"
++"\">TC</abbr>s (marcado significa ligado). O padrão é \"ligado\""
++
++msgid "Gateway"
++msgstr "Roteador"
++
++msgid "General Settings"
++msgstr "Configurações Gerais"
++
++msgid "General settings"
++msgstr "Configurações gerais"
++
++# 20140621: edersg: tradução
++msgid "Good (2 < ETX < 4)"
++msgstr "Bom (2 < ETX < 4)"
++
++# 20140621: edersg: tradução
++msgid "Good (30 > SNR > 20)"
++msgstr "Bom (30 > SNR > 20)"
++
++# 20140621: edersg: tradução
++msgid "Green"
++msgstr "Verde"
++
++msgid "HNA"
++msgstr ""
++"<abbr title=\"Host and network association, Associação de equipamentos e "
++"redes\">HNA</abbr>"
++
++msgid "HNA Announcements"
++msgstr ""
++"Anúncios do <abbr title=\"Host and network association, Associação de "
++"equipamentos e redes\">HNA</abbr>"
++
++msgid "HNA interval"
++msgstr ""
++"Intervalo entre <abbr title=\"Host and network association, Associação de "
++"equipamentos e redes\">HNA</abbr>"
++
++msgid "HNA validity time"
++msgstr ""
++"Validade do <abbr title=\"Host and network association, Associação de "
++"equipamentos e redes\">HNA</abbr>"
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr ""
++"Anúncios do <abbr title=\"Host and network association, Associação de "
++"equipamentos e redes\">HNA</abbr>"
++
++msgid "Hello"
++msgstr "Saudação (Hello)"
++
++msgid "Hello interval"
++msgstr "Intervalo entre Saudações (Hello)"
++
++msgid "Hello validity time"
++msgstr "Validade da Saudação (Hello)"
++
++# 20140621: edersg: tradução
++msgid "Hide IPv4"
++msgstr "Ocultar IPv4"
++
++# 20140621: edersg: tradução
++msgid "Hide IPv6"
++msgstr "Ocultar IPv6"
++
++msgid "Hna4"
++msgstr "Hna4"
++
++msgid "Hna6"
++msgstr "Hna6"
++
++msgid "Hops"
++msgstr "Saltos"
++
++msgid "Hostname"
++msgstr "Nome do equipamento"
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++"Equipamentos em uma rede roteada por OLSR podem anunciar conectividade para "
++"redes externas usando mensagens HNA."
++
++#, fuzzy
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++"Equipamentos em uma rede roteada por OLSR podem anunciar conectividade para "
++"redes externas usando mensagens HNA."
++
++# Hysteresis é Histerese que significa "retardo"
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++"Retardo para a sensibilidade do enlace (somente para a métrica de contagem "
++"de saltos), Retardo incrementa a robustez da sensibilidade do enlace mas "
++"atrasa o registro dos vizinhos. O padrão é \"sim\""
++
++msgid "IP Addresses"
++msgstr "Endereços IP"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++"Versão do IP para usar. Se 6and4 for selecionado, então uma instância é "
++"disparada para cada protocolo."
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr "Endereço IPv4 de Broadcast"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++"Endereço IPv5 de broadcast para a saída de pacotes OLSR. Um exemplo útil "
++"seria 255.255.255.255. O padrão é \"0.0.0.0\", que indica o uso do endereço "
++"IP de broadcast da interface."
++
++msgid "IPv4 source"
++msgstr "Origem IPv4"
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++"Endereço IPv4 de origem para a saída de pacotes OLSR. Um exemplo útil seria "
++"255.255.255.255. O padrão é \"0.0.0.0\", que indica o uso do endereço IP da "
++"interface."
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 multicast"
++msgstr "Multicast IPv6"
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++"Endereço de multicast IPv6. O padrão é \"FF02::6D\", o multicast do enlace "
++"local do roteador MANET."
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++"A rede IPv6 deve ser informada em notação completa. O prefixo deve ser em "
++"notação CIDR."
++
++msgid "IPv6 source"
++msgstr "Origem IPv6"
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++"Prefixo de origem IPv6. O OLSRd escolherá um dos IPs da interface que casam "
++"com o prefixo do parâmetro. O padrão é \"0::/0\", que faz com que seja usado "
++"um endereço IP não local da interface."
++
++msgid "IPv6-Prefix of the uplink"
++msgstr "Prefixo IPv6 do enlace superior (uplink)"
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++"Se a rota para o roteador está para ser alterada, o valor ETX deste roteador "
++"é multiplicado com o este valor antes que ele seja comparado com o novo "
++"valor. O parâmetro pode ser um valor entre 0.1 e 1.0, mas deve ser próximo a "
++"1.0 se alterado..<br /><b>CUIDADO:</b> Este parâmetro não deve ser usado em "
++"conjunto com a métrica etx_ffeth!<br />O padrão é \"1.0\"."
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr "Se este Nó usa NAT para conexões com a internet. Padrão é \"sim\"."
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++"Modo da Interface é usado para evitar o encaminhamento desnecessário de "
++"pacotes na interface ethernet em ponte. Os modos válidos são \"mesh\" e "
++"\"ether\". O padrão é \"mesh\"."
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interfaces Defaults"
++msgstr "Padrões da Interface"
++
++msgid "Internet protocol"
++msgstr "Protocolo internet"
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++"Intervalo para consultar as interfaces de rede por mudanças nas "
++"configurações (em segundos). O padrão é \"2.5\"."
++
++# 20140621: edersg: tradução
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr "Valor inválido para LQMult-Value. Deve estar entre 0.01 e 1.0."
++
++# 20140621: edersg: tradução
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++"Valor inválido para LQMult-Value. Você deve utilizar aqui um número decimal "
++"entre 0.01 e 1.0."
++
++msgid "Known OLSR routes"
++msgstr "Rotas OLSR conhecidas"
++
++msgid "LQ"
++msgstr "<abbr title=\"Link Quality, Qualidade do Enlace\">LQ</abbr>"
++
++msgid "LQ aging"
++msgstr ""
++"Envelhecimento do <abbr title=\"Link Quality, Qualidade do Enlace\">LQ</abbr>"
++
++msgid "LQ algorithm"
++msgstr "Algoritmo <abbr title=\"Link Quality, Qualidade do Enlace\">LQ</abbr>"
++
++msgid "LQ fisheye"
++msgstr "Fisheye <abbr title=\"Link Quality, Qualidade do Enlace\">LQ</abbr>"
++
++msgid "LQ level"
++msgstr "Nível <abbr title=\"Link Quality, Qualidade do Enlace\">LQ</abbr>"
++
++# 20140621: edersg: tradução
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++"LQMult exige dois valores (endereço IP ou 'padrão' e multiplicador) "
++"separados por espaços."
++
++msgid "Last hop"
++msgstr "Último salto"
++
++msgid "Legend"
++msgstr "Legenda"
++
++msgid "Library"
++msgstr "Biblioteca"
++
++msgid "Link Quality Settings"
++msgstr "Configurações da Qualidade do Enlace"
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++"O fator de envelhecimento da qualidade do enlace (somente para <abbr title="
++"\"Link Quality, Qualidade do Enlace\">LQ</abbr> nível 2). Parâmtro de ajuste "
++"para etx_float e etx_fpm, Valores menores significam mudanças mais lentas do "
++"valor ETX. (permitido valores entre 0.01 e 1.0)"
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++"Algoritmo de qualidade do enlace (somente para <abbr title=\"Link Quality, "
++"Qualidade do Enlace\">LQ</abbr> nível 2). <br /><b>etx_float</b>: ETX ponto "
++"flutuante com o envelhecimento exponencial<br /><b>etx_fpm</b> : o mesmo que "
++"etx_float, mas com aritmética inteira<br /><b>etx_ff</b> : ETX freifunk, uma "
++"variante do etx que usa todo tráfego OLSE (ao invés de somente as saudações) "
++"para o cálculo do ETX<br /><b>etx_ffeth</b>: variação incompatível do etx_ff "
++"que permite enlaces ethernet com ETX 0.1.<br />O padrão é \"etx_ff\""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++"O nível de qualidade do enlace escolhe entre o roteamento por contagem de "
++"saltos e o roteamento baseado em custos (na sua maioria, ETX). <br /><b>0</"
++"b> = não use a qualidade do enlace<br /><b>2</b> = use a qualidade do enlace "
++"para a seleção do MPR e roteamento<br />O padrão é \"2\""
++
++msgid "LinkQuality Multiplicator"
++msgstr "Multiplicador da Qualidade do Enlace"
++
++msgid "Links per node (average)"
++msgstr "Enlaces por nó (média)"
++
++msgid "Links total"
++msgstr "Total de enlaces"
++
++msgid "Local interface IP"
++msgstr "Endereço IP da interface local"
++
++msgid "MID"
++msgstr ""
++"<abbr title=\"Multiple interface declaration,Declaração de interface múltipla"
++"\">MID</abbr>"
++
++msgid "MID interval"
++msgstr ""
++"Intervalo do <abbr title=\"Multiple interface declaration,Declaração de "
++"interface múltipla\">MID</abbr>"
++
++msgid "MID validity time"
++msgstr ""
++"Validade do <abbr title=\"Multiple interface declaration,Declaração de "
++"interface múltipla\">MID</abbr>"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid "Main IP"
++msgstr "IP Principal"
++
++# 20140621: edersg: tradução
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++"Certifique-se de que a extensão \"jsoninfo\" esteja carregada e o serviço "
++"OLSRd esteja rodando e configurado na porta 9090 aceitando conexões a partir "
++"de \"127.0.0.1\"."
++
++msgid "Metric"
++msgstr "Métrica"
++
++msgid "Mode"
++msgstr "Modo"
++
++# 20140621: edersg: tradução
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++"Múltiplas rotas com o fator configurado aqui. Os valores permitidos estão "
++"entre 0.01 e 1.0. Ele somente é utilizado quando o nível-LQ é maior que 0. "
++"Exemplos: <br />reduzir LQ para 192.168.0.1 pela metade: 192.168.0.1 0.5<br /"
++"> reduzir LQ para todos os nós nesta interface em 20%: padrão 0.8"
++
++# 20140621: edersg: tradução
++#, fuzzy
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++"Múltiplas rotas com o fator configurado aqui. Os valores permitidos estão "
++"entre 0.01 e 1.0. Ele somente é utilizado quando o nível-LQ é maior que 0. "
++"Exemplos: <br />reduzir LQ para 192.168.0.1 pela metade: 192.168.0.1 0.5<br /"
++"> reduzir LQ para todos os nós nesta interface em 20%: padrão 0.8"
++
++msgid "NAT threshold"
++msgstr "Limiar do NAT"
++
++msgid "NLQ"
++msgstr ""
++"<abbr title=\"Neighbor Link Quality, Qualidade do Enlace do Vizinho\">NLQ</"
++"abbr>"
++
++msgid "Neighbors"
++msgstr "Vizinhos"
++
++msgid "Neighbour IP"
++msgstr "Endereço IP do Vizinho"
++
++msgid "Neighbours"
++msgstr "Vizinhos"
++
++msgid "Netmask"
++msgstr "Máscara de rede"
++
++msgid "Network"
++msgstr "Rede"
++
++msgid "Network address"
++msgstr "Endereço de rede"
++
++msgid "Nic changes poll interval"
++msgstr "Intervalo de consulta de mudanças na placa de rede"
++
++msgid "Nodes"
++msgstr "Nós"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "OLSR - Display Options"
++msgstr "OLSR - Opções de Visão"
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++"OLSR - Anúncios <abbr title=\"Host and network association, Associação de "
++"equipamentos e redes\">HNA</abbr>"
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++"OLSR - Anúncios <abbr title=\"Host and network association, Associação de "
++"equipamentos e redes\">HNA</abbr>"
++
++msgid "OLSR - Plugins"
++msgstr "OLSR - Plugins"
++
++msgid "OLSR Daemon"
++msgstr "Servidor OLSR"
++
++msgid "OLSR Daemon - Interface"
++msgstr "Servidor OLSR - Interface"
++
++msgid "OLSR connections"
++msgstr "Conexões do OLSR"
++
++msgid "OLSR gateway"
++msgstr "Roteador OLSR"
++
++msgid "OLSR node"
++msgstr "Nó OLSR"
++
++# 20140621: edersg: tradução
++msgid "Orange"
++msgstr "Laranja"
++
++msgid "Overview"
++msgstr "Visão Geral"
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr "Visão geral os anúncios de rede de equipamentos OLSR atualmente ativos"
++
++msgid "Overview of currently established OLSR connections"
++msgstr "Visão geral das conexões OLSR atualmente estabelecidas"
++
++msgid "Overview of currently known OLSR nodes"
++msgstr "Visão geral dos nós OLSR conhecidos atualmente"
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr "Visão geral das rotas conhecidas atualmente para outros nós OLSR"
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr "Visão geral das interfaces onde o OLSR está rodando"
++
++msgid "Overview of known multiple interface announcements"
++msgstr "Visão geral de anúncios de nós com múltiplas interfaces conhecidas"
++
++msgid "Overview of smart gateways in this network"
++msgstr "Visão geral dos SmartGateways na rede"
++
++msgid "Plugin configuration"
++msgstr "Configuração do Plugin"
++
++msgid "Plugins"
++msgstr "Plugins"
++
++# Que socket?
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr "Taxa de consulta por conexões OLSR, em segundos. Padrão é 0.05."
++
++msgid "Pollrate"
++msgstr "Taxa de consulta"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Prefix"
++msgstr "Prefixo"
++
++# 20140621: edersg: tradução
++msgid "Red"
++msgstr "Vermelho"
++
++msgid "Resolve"
++msgstr "Resolver"
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++"Resolve os nomes dos equipamentos na página de estado. É geralmente seguro "
++"permitir isto, mas se você usa IPs públicos e tem uma configuração DNS "
++"instável, então estas páginas podem carregar de forma extremamente lenta. "
++"Neste caso, desabilite isto aqui."
++
++msgid "Routes"
++msgstr "Rotas"
++
++msgid "Secondary OLSR interfaces"
++msgstr "Interfaces OLSR secundárias"
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++"Define o IP principal (ip originador) do seu roteador. Este IP nunca muda "
++"durante o funcionamento do olsrd. O padrão é 0.0.0.0, que faz com que o "
++"endereço da primeira interface seja usado."
++
++#, fuzzy
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++"Define o IP principal (ip originador) do seu roteador. Este IP nunca muda "
++"durante o funcionamento do olsrd. O padrão é 0.0.0.0, que faz com que o "
++"endereço da primeira interface seja usado."
++
++# 20140621: edersg: tradução
++msgid "Show IPv4"
++msgstr "Exibir IPv4"
++
++# 20140621: edersg: tradução
++msgid "Show IPv6"
++msgstr "Exibir IPv6"
++
++# 20140621: edersg: tradução
++msgid "Signal Noise Ratio in dB"
++msgstr "Relação do ruído do sinal em dB"
++
++msgid "SmartGW"
++msgstr "SmartGW"
++
++msgid "SmartGW announcements"
++msgstr "Anúncios do SmartGW"
++
++msgid "SmartGateway is not configured on this system."
++msgstr "SmartGateway não está configurado no seu sistema."
++
++msgid "Source address"
++msgstr "Endereço de origem"
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++"Especifica a velocidade do enlace superior (uplink) em kilobits/s. O "
++"primeiro parâmetro é a taxa de envio (upstream) e o segundo parâmetro é a "
++"taxa de recebimento (downstream). O padrão é \"128 1024\"."
++
++msgid "Speed of the uplink"
++msgstr "Velocidade do enlace superior"
++
++msgid "State"
++msgstr "Estado"
++
++msgid "Status"
++msgstr "Estado"
++
++# 20140621: edersg: tradução
++msgid "Still usable (20 > SNR > 5)"
++msgstr "Ainda utilizável (20 > SNR > 5)"
++
++# 20140621: edersg: tradução
++msgid "Still usable (4 < ETX < 10)"
++msgstr "Ainda utilizável (4 > ETX > 10)"
++
++msgid "Success rate of packages received from the neighbour"
++msgstr "Taxa de sucesso de pacotes recebidos de vizinhos"
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr "Taxa de sucesso de pacotes enviados a vizinhos"
++
++msgid "TC"
++msgstr "<abbr title=\"Topology Control, Controle de Topologia\">TC</abbr>"
++
++msgid "TC interval"
++msgstr ""
++"Intervalo do <abbr title=\"Topology Control, Controle de Topologia\">TC</"
++"abbr>"
++
++msgid "TC validity time"
++msgstr ""
++"Validade do <abbr title=\"Topology Control, Controle de Topologia\">TC</abbr>"
++
++msgid "TOS value"
++msgstr "Valor do TOS"
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++"O servidor OLSR é uma implementação do protoloco de Roteamento de Estado de "
++"Enlace Otimizado. Como tal, ele permite o roteamento em malha para qualquer "
++"equipamento de rede. Ele roda sobre qualquer placa de rede sem fio que "
++"suporte o modo ad-hoc e, é claro, em qualquer dispositivo ethernet. Visite "
++"<a href='http://www.olsr.org'>olsrd.org</a> para ajuda e documentação."
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++"A disponibilidade fixa para ser usada. Se a disponibilidade não for "
++"definida, ela será dinamicamente calculada baseada no estado da energia/"
++"bateria, O padrão é \"3\"."
++
++msgid "The interface OLSRd should serve."
++msgstr "A interface onde o OLSRd deve servir."
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++"A porta que o OLSR usa. Isto geralmente deve ficar na porta 698, designada "
++"pela IANA. Pode ter qualquer valor entre 1 e 65535."
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++"Isto pode ser usado para sinalizar o prefixo IPv6 externo do enlace superior "
++"(uplink) para os clientes. Isto pode permitir que um cliente mude o endereço "
++"IPv6 local para usar o roteador IPv6 sem qualquer tradução de endereços. O "
++"tamanho máximo do prefixo é 64 bits. O padrão é \"::/0\" (nenhum prefixo)."
++
++msgid "Timing and Validity"
++msgstr "Temporização e Validade"
++
++msgid "Topology"
++msgstr "Topologia"
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++"Valor do tipo de serviço para o cabeçalho IP para controle de tráfego. O "
++"padrao é \"16\"."
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr "Não foi possível conectar ao servidor OLSR!"
++
++msgid "Uplink"
++msgstr "Enlace superior (uplink)"
++
++msgid "Uplink uses NAT"
++msgstr "Enlace superior (uplink) usa NAT"
++
++msgid "Use hysteresis"
++msgstr "Usar retardo"
++
++# 20140621: edersg: tradução
++msgid "Validity Time"
++msgstr "Tempo de validade"
++
++msgid "Version"
++msgstr "Versão"
++
++# 20140621: edersg: tradução
++msgid "Very good (ETX < 2)"
++msgstr "Muito bom (ETX < 2)"
++
++# 20140621: edersg: tradução
++msgid "Very good (SNR > 30)"
++msgstr "Muito bom (SNR > 30)"
++
++msgid "WLAN"
++msgstr "Rede sem fio (WLAN)"
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++"Atenção: o kmod-ipip não está instalado. Sem o kmod-ipip, o SmartGateway não "
++"irá funcionar. Por favor, instale-o."
++
++msgid "Weight"
++msgstr "Peso"
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++"Quando múltiplos enlaces existirem entre dois equipamentos, o peso da "
++"interface é usado para determinar o enlace usado. Normalmente, o peso é "
++"automaticamente calculado pelo olsrd baseado nas características da "
++"interface, mas aqui você pode especificar um valor fixo. Olsrd escolherá "
++"enlaces com o valor mais baixo.<br /><b>Nota:</b> O peso da interface é "
++"usado somente quando o nível de qualidade do enlace está definido como 0. "
++"Para qualquer outro valor do nível de qualidade do enlace, o valor ETX da "
++"interface é usado."
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++"Que tipo de enlace superior (uplink) é exportado para outros nós da rede em "
++"malha. Um enlace superior é detectado buscando por uma <abbr title=\"Host "
++"and network association, Associação de equipamentos e redes\">HNA</abbr> "
++"local de 0.0.0.0/0, ::ffff:0:0/96 ou 2000::/3. O padrão é \"ambos\"."
++
++#, fuzzy
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++"Que tipo de enlace superior (uplink) é exportado para outros nós da rede em "
++"malha. Um enlace superior é detectado buscando por uma <abbr title=\"Host "
++"and network association, Associação de equipamentos e redes\">HNA</abbr> "
++"local de 0.0.0.0/0, ::ffff:0:0/96 ou 2000::/3. O padrão é \"ambos\"."
++
++msgid "Willingness"
++msgstr "Disponibilidade"
++
++msgid "Yellow"
++msgstr "Amarelo"
++
++msgid "no"
++msgstr "Não"
++
++msgid "yes"
++msgstr "Sim"
++
++#~ msgid "Device"
++#~ msgstr "Dispositivo"
++
++#~ msgid ""
++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, "
++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"."
++#~ msgstr ""
++#~ "Certifique-se que o processo OLSRd está em execução, que o plugin "
++#~ "\"txtinfo\" está carregado e configurado para a porta 2006 e que aceita "
++#~ "conexões a partir de \"127.0.0.1\"."
++
++#~ msgid ""
++#~ "Multiply routes with the factor given here. Allowed values are between "
++#~ "0.01 and 1. It is only used when LQ-Level is greater than 0. Examples:"
++#~ "<br />reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to "
++#~ "all nodes on this interface by 20%: default 0.8"
++#~ msgstr ""
++#~ "Multiplica rotas com o fator informado. Os valores válidos são entre 0.01 "
++#~ "e 1. Somente é usado quando o nível <abbr title=\"Link Quality, Qualidade "
++#~ "do Enlace\">LQ</abbr> é maior que 0. Exemplos:<br />reduzir o <abbr title="
++#~ "\"Link Quality, Qualidade do Enlace\">LQ</abbr> para 192.168.0.1 pela "
++#~ "metade: 192.168.0.1 0.5<br />reduzir o <abbr title=\"Link Quality, "
++#~ "Qualidade do Enlace\">LQ</abbr> de todos os nós desta interface para 20%: "
++#~ "Padrão 0.8"
+diff --git a/feeds/luci/applications/luci-app-olsr/po/pt/olsr.po b/feeds/luci/applications/luci-app-olsr/po/pt/olsr.po
+new file mode 100644
+index 0000000..4e04248
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/pt/olsr.po
+@@ -0,0 +1,715 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-06-03 16:17+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr "Anuncios MID ativos"
++
++msgid "Active OLSR nodes"
++msgstr "Nós OLSR ativos"
++
++#, fuzzy
++msgid "Active host net announcements"
++msgstr "Anuncios activos de hosts"
++
++msgid "Advanced Settings"
++msgstr "Definições Avançadas"
++
++msgid "Allow gateways with NAT"
++msgstr "Permitir gateways com NAT"
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr "Permitir a selecção de uma gateway IPv4 para saída com NAT"
++
++msgid "Announce uplink"
++msgstr "Anunciar uplink"
++
++msgid "Announced network"
++msgstr "Rede anunciada"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr "Os valores tem de usar a dotação decimal."
++
++msgid "Broadcast address"
++msgstr "Endereço de broadcast"
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr "Configuração"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr "Mostrar"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr "Descarregar Configuração"
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "Ativar"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++"Ativar SmartGateway. Se estiver desativado, então todos os outros parâmetros "
++"SmartGateway são ignorados. Por defeito é \"não\""
++
++msgid "Enable this interface."
++msgstr "Ativar esta interface."
++
++msgid "Enabled"
++msgstr "Ativado"
++
++msgid "Expected retransmission count"
++msgstr "Contagem de retransmissões esperada"
++
++msgid "FIB metric"
++msgstr "métrica FIB"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr "Definições gerais"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr "Intervalo entre HNA"
++
++msgid "HNA validity time"
++msgstr "Validade de HNA"
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "OLSR - Anuncios HNA4"
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr "Intervalo entre Hello"
++
++msgid "Hello validity time"
++msgstr "Validade de Hello"
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr "Endereços IP"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr "Endereço IPv4 de Broadcast"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 multicast"
++msgstr "Multicast IPv6"
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++"A rede IPv6 deve ser fornecido em dotação completa, o prefixo deve estar na "
++"notação CIDR."
++
++msgid "IPv6 source"
++msgstr "Origem IPv6"
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++"O Modo de Interface é usado para para prevenir encaminhamentos "
++"desnecessários de pacotes em interfaces switched ethernet. Os Modos válidos "
++"são \"mesh\" e \"ether\". Por defeito é \"mesh\"."
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interfaces Defaults"
++msgstr "Predefinições das Interfaces"
++
++msgid "Internet protocol"
++msgstr "Protocolo de Internet"
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr "Rotas OLSR conhecidas"
++
++msgid "LQ"
++msgstr "LQ"
++
++msgid "LQ aging"
++msgstr "Envelhecimento LQ"
++
++msgid "LQ algorithm"
++msgstr "Algoritmo LQ"
++
++#, fuzzy
++msgid "LQ fisheye"
++msgstr "LQ Fisheye"
++
++msgid "LQ level"
++msgstr "Nível LQ"
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr "Ultimo salto"
++
++msgid "Legend"
++msgstr "Legenda"
++
++msgid "Library"
++msgstr "Biblioteca"
++
++msgid "Link Quality Settings"
++msgstr "Definições de Qualidade do Link"
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr "Endereço IP do interface local"
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr "Intervalo de MID"
++
++msgid "MID validity time"
++msgstr "Validade de MID"
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr "IP Principal"
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr "Métrica"
++
++msgid "Mode"
++msgstr "Modo"
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr "Vizinhos"
++
++msgid "Neighbour IP"
++msgstr "Endereço IP do Vizinho"
++
++msgid "Neighbours"
++msgstr "Vizinhos"
++
++msgid "Netmask"
++msgstr "Máscara de rede"
++
++msgid "Network"
++msgstr "Rede"
++
++msgid "Network address"
++msgstr "Endereço de rede"
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr "Nós"
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr "OLSR - Anuncios HNA4"
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr "OLSR - Anuncios HNA4"
++
++msgid "OLSR - Plugins"
++msgstr "OLSR - Plugins"
++
++msgid "OLSR Daemon"
++msgstr "Servidor OLSR"
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr "OLSR - Ligações"
++
++msgid "OLSR gateway"
++msgstr "Gateway OLSR"
++
++msgid "OLSR node"
++msgstr "Nó OLSR"
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++#, fuzzy
++msgid "Overview of currently active OLSR host net announcements"
++msgstr "Resumo de anuncios activos de hosts"
++
++msgid "Overview of currently established OLSR connections"
++msgstr "Resumo das ligações OLSR actualmente estabelecidas"
++
++msgid "Overview of currently known OLSR nodes"
++msgstr "Resumo dos nós OLSR conhecidos"
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr "Resumo das rotas conhecidas para outros nós OLSR"
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr "Resumo de anuncios de nós com multiplos interfaces activos"
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr "Configuração de Plugin"
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr "Pollrate"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Prefix"
++msgstr "Prefixo"
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr "Rotas"
++
++msgid "Secondary OLSR interfaces"
++msgstr "Interfaces OLSR secundários"
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr "Endereço de origem"
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr "Velocidade do uplink"
++
++msgid "State"
++msgstr "Estado"
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr "Intervalo de TC"
++
++msgid "TC validity time"
++msgstr "Validade de TC"
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr "Topologia"
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr "Não foi possivel ligar ao servidor OLSR!"
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr "O uplink usa NAT"
++
++msgid "Use hysteresis"
++msgstr "Usar histerese"
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr "Versão"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr "WLAN"
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr "Disponibilidade"
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid "Device"
++#~ msgstr "Dispositivo"
++
++#~ msgid ""
++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, "
++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"."
++#~ msgstr ""
++#~ "Certifique-se que o processo olsrd está em execução, que o plugin "
++#~ "\"txtinfo\" está carregado e configurado para a porta 2006 e que aceita "
++#~ "ligações a partir de \"127.0.0.1\"."
+diff --git a/feeds/luci/applications/luci-app-olsr/po/ro/olsr.po b/feeds/luci/applications/luci-app-olsr/po/ro/olsr.po
+new file mode 100644
+index 0000000..257fab3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/ro/olsr.po
+@@ -0,0 +1,691 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-28 19:40+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr "Setări avansate"
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr "Configuraţie"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr "Activare"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr "Activează această interfaţă"
++
++msgid "Enabled"
++msgstr "Activat"
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr "Setări generale"
++
++msgid "General settings"
++msgstr "Setări generale"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr "Verde"
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr "Ascunde IPv4"
++
++msgid "Hide IPv6"
++msgstr "Ascunde IPv6"
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Nume domeniu"
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr "Adrese IP"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfaţă"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interfeţe"
++
++msgid "Interfaces Defaults"
++msgstr "Interfeţe implicite"
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr "Algoritm LQ"
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr "Nivel LQ"
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr "Legendă"
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr "Vecini"
++
++msgid "Neighbour IP"
++msgstr "IP vecin"
++
++msgid "Neighbours"
++msgstr "Vecini"
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr "Pluginuri"
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr "Arată IPv4"
++
++msgid "Show IPv6"
++msgstr "Arată IPv6"
++
++msgid "Signal Noise Ratio in dB"
++msgstr "Raport zgomot semnal în dB"
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr "Stare"
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr "Versiune"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr "Greutate"
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr "Galben"
++
++msgid "no"
++msgstr "nu"
++
++msgid "yes"
++msgstr "da"
+diff --git a/feeds/luci/applications/luci-app-olsr/po/ru/olsr.po b/feeds/luci/applications/luci-app-olsr/po/ru/olsr.po
+new file mode 100644
+index 0000000..51267e0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/ru/olsr.po
+@@ -0,0 +1,812 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: olsr\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-09-06 09:58+0200\n"
++"Last-Translator: datasheet <michael.gritsaenko@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Active MID announcements"
++msgstr "Ðктивные объÑÐ²Ð»ÐµÐ½Ð¸Ñ MID"
++
++msgid "Active OLSR nodes"
++msgstr "Ðктивные OLSR-узлы"
++
++msgid "Active host net announcements"
++msgstr "Ðктивные объÑÐ²Ð»ÐµÐ½Ð¸Ñ Ñ…Ð¾ÑÑ‚-Ñети (HNA)"
++
++msgid "Advanced Settings"
++msgstr "РаÑширенные наÑтройки"
++
++msgid "Allow gateways with NAT"
++msgstr "Разрешить шлюзы Ñ NAT"
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr "Разрешить выбор иÑходÑщего IPv4-шлюза Ñ NAT"
++
++msgid "Announce uplink"
++msgstr "ОбъÑвлÑÑ‚ÑŒ воÑходÑщий канал"
++
++msgid "Announced network"
++msgstr "ОбъÑÐ²Ð»ÐµÐ½Ð½Ð°Ñ Ñеть"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++"Оба Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ быть в деÑÑтичном предÑтавлении Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ "
++"точками."
++
++msgid "Broadcast address"
++msgstr "Широковещательный адреÑ"
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr "КонфигурациÑ"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr "Показать"
++
++msgid "Downlink"
++msgstr "ÐиÑходÑщий канал"
++
++msgid "Download Config"
++msgstr "Загрузить конфигурацию"
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "Включить"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++"Включить SmartGateway. ЕÑли выключено, вÑе оÑтальные параметры SmartGateway "
++"игнорируютÑÑ. По умолчанию \"нет\"."
++
++msgid "Enable this interface."
++msgstr "ИÑпользовать Ñтот интерфейÑ."
++
++msgid "Enabled"
++msgstr "Включено"
++
++msgid "Expected retransmission count"
++msgstr "Ожидаемое количеÑтво повторных передач"
++
++msgid "FIB metric"
++msgstr "Метрика FIB"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++"Метрика FIB управлÑет значением метрики хоÑÑ‚-маршрутов, которые "
++"уÑтанавливает OLSRd. При \"flat\" значение метрики вÑегда равно 2. Это "
++"предпочтительное значение, помогающее Ñдру Linux очищать уÑтаревшие "
++"маршруты. При \"correct\" иÑпользуетÑÑ Ñчётчик прыжков в качеÑтве Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ "
++"метрики. \"approx\" также иÑпозьзует Ñчётчик прыжков, но его обновление "
++"проиÑходит только при изменении Ñледующего прыжка. По умолчанию иÑпользуетÑÑ "
++"\"flat\"."
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr "Механизм рыбьего глаза Ð´Ð»Ñ TC. По умолчанию \"включено\""
++
++msgid "Gateway"
++msgstr "Шлюз"
++
++msgid "General Settings"
++msgstr "Общие наÑтройки"
++
++msgid "General settings"
++msgstr "Общие наÑтройки"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr "HNA"
++
++msgid "HNA Announcements"
++msgstr "ОбъÑÐ²Ð»ÐµÐ½Ð¸Ñ HNA"
++
++msgid "HNA interval"
++msgstr "HNA интервал"
++
++msgid "HNA validity time"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ HNA"
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "ОбъÑÐ²Ð»ÐµÐ½Ð¸Ñ HNA"
++
++msgid "Hello"
++msgstr "ПриветÑтвенное Ñообщение"
++
++msgid "Hello interval"
++msgstr "Интервал приветÑтвенных Ñообщений"
++
++msgid "Hello validity time"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÑ‚Ñтвенного ÑообщениÑ"
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr "Hna4"
++
++msgid "Hna6"
++msgstr "Hna6"
++
++msgid "Hops"
++msgstr "Прыжки"
++
++msgid "Hostname"
++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта"
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++"ХоÑÑ‚Ñ‹ в маршрутизируемой Ñети OLSR могут извещать о подключении к внешним "
++"ÑетÑм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñообщений HNA."
++
++#, fuzzy
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++"ХоÑÑ‚Ñ‹ в маршрутизируемой Ñети OLSR могут извещать о подключении к внешним "
++"ÑетÑм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñообщений HNA."
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++"ГиÑÑ‚ÐµÑ€ÐµÐ·Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð° (только Ð´Ð»Ñ Ð¼ÐµÑ‚Ñ€Ð¸ÐºÐ¸ кол-ва прыжков). "
++"ГиÑÑ‚ÐµÑ€ÐµÐ·Ð¸Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°ÐµÑ‚ надёжноÑÑ‚ÑŒ канала, но вноÑит задержку в региÑтрацию "
++"ÑоÑедних уÑтройÑтв. По умолчанию \"да\""
++
++msgid "IP Addresses"
++msgstr "IP-адреÑа"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++"ВерÑÐ¸Ñ IP, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользована. ЕÑли выбрано 6and4, olsrd будет "
++"запущен Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ верÑии."
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr "Широковещательный IPv4"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++"Широковещательный IPv4-Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¸ÑходÑщих OLSR-пакетов, например, "
++"255.255.255.255. ÐÐ´Ñ€ÐµÑ Ð¿Ð¾ умолчанию \"0.0.0.0\" ведёт к иÑпользованию "
++"широковещательного IP-адреÑа интерфейÑа."
++
++msgid "IPv4 source"
++msgstr "IPv4-иÑточник"
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++"IPv4-Ð°Ð´Ñ€ÐµÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¸ÑходÑщих OLSR-пакетов. ÐÐ´Ñ€ÐµÑ Ð¿Ð¾ умолчанию "
++"\"0.0.0.0\" включает иÑпользование IP-адреÑа интерфейÑа."
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 multicast"
++msgstr "Групповой IPv6"
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr "Групповой IPv6-адреÑ. По умолчанию \"FF02::6D\"."
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++"IPv6-Ñеть должна быть указана в полной нотации, Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть в "
++"нотации CIDR."
++
++msgid "IPv6 source"
++msgstr "IPv6-иÑточник"
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++"ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð¸Ñточника IPv6. OLSRd выберет один из IP-адреÑов интерфейÑа, "
++"ÑоответÑтвующий данному префикÑу. По умолчанию \"0::/0\" включает "
++"иÑпользование нелокального IP-адреÑа интерфейÑа."
++
++msgid "IPv6-Prefix of the uplink"
++msgstr "IPv6-Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð²Ð¾ÑходÑщего канала"
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++"ЕÑли маршрут к текущему шлюзу должен быть изменён, значение ETX данного "
++"шлюза умножаетÑÑ Ð½Ð° указанное чиÑло перед Ñравнением Ñ Ð½Ð¾Ð²Ñ‹Ð¼ значением. "
++"Значение данного параметра может быть в пределах от 0.1 до 1.0, но при "
++"изменении должно быть ближе к 1.0.<br /><b>Ð’ÐИМÐÐИЕ:</b>Ðе иÑпользуйте "
++"данный параметр вмеÑте Ñ Ð¼ÐµÑ‚Ñ€Ð¸ÐºÐ¾Ð¹ etx_ffeth!<br />По умолчанию \"1.0\"."
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++"ИÑпользует ли данный узел NAT Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº интернету. По умолчанию \"да"
++"\"."
++
++msgid "Interface"
++msgstr "ИнтерфейÑ"
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++"Режим интерфейÑа иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð½ÐµÐ½ÑƒÐ¶Ð½Ñ‹Ñ… перенаправлений на "
++"коммутируемых Ethernet-интерфейÑах. Возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð°: \"mesh\" и "
++"\"ether\". По умолчанию \"mesh\"."
++
++msgid "Interfaces"
++msgstr "ИнтерфейÑÑ‹"
++
++msgid "Interfaces Defaults"
++msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñов"
++
++msgid "Internet protocol"
++msgstr "Интернет-протокол"
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++"Интервал опроÑа Ñетвых интерфейÑов на наличие изменений в конфигурации "
++"(Ñек.). По умолчанию, \"2.5\"."
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr "ИзвеÑтные OLSR-маршруты"
++
++msgid "LQ"
++msgstr "LQ"
++
++msgid "LQ aging"
++msgstr "Старение LQ"
++
++msgid "LQ algorithm"
++msgstr "Ðлгоритм LQ"
++
++#, fuzzy
++msgid "LQ fisheye"
++msgstr "Рыбий глаз LQ"
++
++msgid "LQ level"
++msgstr "Уровень LQ"
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr "ПоÑледний прыжок"
++
++msgid "Legend"
++msgstr "Легенда"
++
++msgid "Library"
++msgstr "Библиотека"
++
++msgid "Link Quality Settings"
++msgstr "ÐаÑтройки качеÑтва ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (LQ)"
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++"КоÑффициент ÑÑ‚Ð°Ñ€ÐµÐ½Ð¸Ñ LQ (только Ð´Ð»Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ LQ, равного 2). Параметр "
++"подÑтройки Ð´Ð»Ñ etx_float и etx_fpm. Чем меньше значение, тем меньше "
++"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ETX. Диапазон допуÑтимых значений от 0.01 до 1.0."
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++"Ðлгоритм LQ (только Ð´Ð»Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ LQ, равного 2).<br /><b>etx_float</b>: ETX Ñ "
++"плавающей точкой и ÑкÑпоненциальным Ñтарением<br /><b>etx_fpm</b> : тоже что "
++"и etx_float, но Ñ Ñ†ÐµÐ»Ð¾Ñ‡Ð¸Ñленной арифметикой<br /><b>etx_ff</b> : ETX "
++"freifunk, иÑпользует веÑÑŒ трафик OLSR Ð´Ð»Ñ Ñ€Ð°Ñчета ETX<br /><b>etx_ffeth</b>: "
++"неÑовмеÑтимый вариант etx_ff, разрешающий Ethernet-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ETX 0.1.<br /"
++">По умолчанию \"etx_ff\""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++"Переключатель ÑƒÑ€Ð¾Ð²Ð½Ñ LQ между маршрутизацией по кол-во прыжков и ETX.<br /"
++"><b>0</b> = не иÑпользовать LQ<br /><b>2</b> = иÑпользовать LQ Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° "
++"MPR и маршрутизации<br />По умолчанию \"2\""
++
++msgid "LinkQuality Multiplicator"
++msgstr "Множитель LQ"
++
++msgid "Links per node (average)"
++msgstr "Кол-во Ñоединений на узел (Ñреднее)"
++
++msgid "Links total"
++msgstr "Общее кол-во Ñоединений"
++
++msgid "Local interface IP"
++msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ интерфейÑа"
++
++msgid "MID"
++msgstr "MID"
++
++msgid "MID interval"
++msgstr "Интервал MID"
++
++msgid "MID validity time"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ MID"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid "Main IP"
++msgstr "ОÑновной IP-адреÑ"
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr "Метрика"
++
++msgid "Mode"
++msgstr "Режим"
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++#, fuzzy
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++"Умножить маршруты на указанный коÑффициент в пределах от 0.01 до 1. Данный "
++"коÑффициент иÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в Ñлучае, еÑли LQ уровень > 0. Примеры:<br /"
++">уменьшить LQ Ð´Ð»Ñ 192.168.0.1 на половину: 192.168.0.1 0.5<br />уменьшить LQ "
++"Ð´Ð»Ñ Ð²Ñех узлов на данном интерфейÑе на 20%: default 0.8"
++
++msgid "NAT threshold"
++msgstr "Порог NAT"
++
++msgid "NLQ"
++msgstr "NLQ"
++
++msgid "Neighbors"
++msgstr "СоÑедние узлы"
++
++msgid "Neighbour IP"
++msgstr "СоÑедние IP-адреÑа"
++
++msgid "Neighbours"
++msgstr "СоÑедние узлы"
++
++msgid "Netmask"
++msgstr "МаÑка Ñети"
++
++msgid "Network"
++msgstr "Сеть"
++
++msgid "Network address"
++msgstr "Сетевой адреÑ"
++
++msgid "Nic changes poll interval"
++msgstr "Интервал опроÑа изменений NIC"
++
++msgid "Nodes"
++msgstr "Узлы"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "OLSR - Display Options"
++msgstr "OLSR - ÐаÑтройки отображениÑ"
++
++msgid "OLSR - HNA-Announcements"
++msgstr "OLSR - HNA-объÑвлениÑ"
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr "OLSR - HNA-объÑвлениÑ"
++
++msgid "OLSR - Plugins"
++msgstr "OLSR - Модули"
++
++msgid "OLSR Daemon"
++msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ OLSR"
++
++msgid "OLSR Daemon - Interface"
++msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ OLSR - ИнтерфейÑ"
++
++msgid "OLSR connections"
++msgstr "OLSR-ÑоединениÑ"
++
++msgid "OLSR gateway"
++msgstr "OLSR-шлюз"
++
++msgid "OLSR node"
++msgstr "OLSR-узел"
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr "Обзор"
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr "Обзор текущих активных OLSR-объÑвлений HNA"
++
++msgid "Overview of currently established OLSR connections"
++msgstr "Обзор уÑтановленных OLSR-Ñоединений"
++
++msgid "Overview of currently known OLSR nodes"
++msgstr "Обзор текущих извеÑтных OLSR-узлов"
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr "Обзор извеÑтных маршрутов к OLSR-узлам"
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr "Обзор интерфейÑов Ñ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð½Ñ‹Ð¼ OLSR"
++
++msgid "Overview of known multiple interface announcements"
++msgstr "Обзор извеÑтных мульти-интерфейÑных извещений"
++
++# Может таки "умные" шлюзы? Или вообще SmartGW...
++#, fuzzy
++msgid "Overview of smart gateways in this network"
++msgstr "Обзор Ñмарт-шлюзов в Ñети"
++
++msgid "Plugin configuration"
++msgstr "ÐаÑтройки модулей"
++
++msgid "Plugins"
++msgstr "Модули"
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr "ПериодичноÑÑ‚ÑŒ опроÑа OLSR-Ñокетов в Ñекундах. 0.05 по умолчанию."
++
++msgid "Pollrate"
++msgstr "ЧаÑтота опроÑа"
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Prefix"
++msgstr "ПрефикÑ"
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr "Разрешать имена"
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++"Разрешать имена хоÑтов на Ñтраницах ÑоÑтоÑниÑ. Ðе иÑпользуйте данную "
++"функцию, еÑли у Ð²Ð°Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ñ‹Ð¹ IP-Ð°Ð´Ñ€ÐµÑ Ð¸ неÑтабильный DNS. Ð’ противном "
++"Ñлучае загрузка Ñтраниц ÑоÑтоÑÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ проиÑходить очень медленно."
++
++msgid "Routes"
++msgstr "Маршруты"
++
++msgid "Secondary OLSR interfaces"
++msgstr "Вторичные OLSR-интерфейÑÑ‹"
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++"УÑтанавливает оÑновной IP-Ð°Ð´Ñ€ÐµÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°. Данный Ð°Ð´Ñ€ÐµÑ ÐИКОГДРне "
++"будет изменÑÑ‚ÑŒÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ olsrd. По умолчанию 0.0.0.0 (иÑпользуетÑÑ "
++"IP-Ð°Ð´Ñ€ÐµÑ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ Ñетевого интерфейÑа)."
++
++#, fuzzy
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++"УÑтанавливает оÑновной IP-Ð°Ð´Ñ€ÐµÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°. Данный Ð°Ð´Ñ€ÐµÑ ÐИКОГДРне "
++"будет изменÑÑ‚ÑŒÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ olsrd. По умолчанию 0.0.0.0 (иÑпользуетÑÑ "
++"IP-Ð°Ð´Ñ€ÐµÑ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ Ñетевого интерфейÑа)."
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr "SmartGW"
++
++msgid "SmartGW announcements"
++msgstr "ОбъÑÐ²Ð»ÐµÐ½Ð¸Ñ SmartGW"
++
++msgid "SmartGateway is not configured on this system."
++msgstr "SmartGW не Ñконфигурирован на Ñтой ÑиÑтеме."
++
++msgid "Source address"
++msgstr "ÐÐ´Ñ€ÐµÑ Ð¸Ñточника"
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++"УÑтанавливает ÑкороÑÑ‚ÑŒ воÑходÑщего канала (кбит/Ñ). Первый параметр "
++"указывает на прÑмое, а второй на обратное направление. По умолчанию \"128 "
++"1024\"."
++
++msgid "Speed of the uplink"
++msgstr "СкороÑÑ‚ÑŒ воÑходÑщего канала"
++
++msgid "State"
++msgstr "СоÑтоÑние"
++
++msgid "Status"
++msgstr "СтатуÑ"
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr "ДоÑÑ‚Ð¸Ð³Ð½ÑƒÑ‚Ð°Ñ ÑкороÑÑ‚ÑŒ приема поÑылок от ÑоÑедних узлов"
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr "ДоÑÑ‚Ð¸Ð³Ð½ÑƒÑ‚Ð°Ñ ÑкороÑÑ‚ÑŒ передачи поÑылок к ÑоÑедним узлам"
++
++msgid "TC"
++msgstr "TC"
++
++msgid "TC interval"
++msgstr "Интервал TC"
++
++msgid "TC validity time"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ TC"
++
++msgid "TOS value"
++msgstr "Значение ToS"
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++"Ð¡ÐµÑ€Ð²Ð¸Ñ OLSRd реализует поддержку протокола OLSR (Optimized Link State "
++"Routing) и тем Ñамым обеÑпечивает ÑчеиÑтую маршрутизацию Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ Ñетевого "
++"оборудованиÑ. OLSRd может работать на любом Wi-Fi-адаптере или уÑтройÑтве "
++"Ethernet Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ режима ad-hoc. Более подробную информацию можно найти "
++"на <a href='http://www.olsr.org'>olsr.org</a>."
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++"ФикÑированное значение готовноÑти. ЕÑли не задано, то будет раÑÑчитыватьÑÑ "
++"динамичеÑки на оÑнове ÑоÑтоÑÐ½Ð¸Ñ Ð±Ð°Ñ‚Ð°Ñ€ÐµÐ¸/питаниÑ. По умолчанию \"3\"."
++
++msgid "The interface OLSRd should serve."
++msgstr "ИнтерфейÑ, обÑлуживаемый OLSRd."
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++"Порт, иÑпользуемый Ð´Ð»Ñ OLSR. РекомендуетÑÑ Ð¸Ñпользовать приÑвоенный IANA "
++"порт 698. ДопуÑтимо любое значение в диапазоне от 1 до 65535."
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++"Может быть иÑпользовано Ð´Ð»Ñ Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² об IPv6-префикÑе воÑходÑщего "
++"канала. Это может позволить клиентам изменÑÑ‚ÑŒ Ñвой локальный IPv6-Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ "
++"иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ IPv6-шлюза без какой-либо транÑлÑции адреÑов. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ "
++"длина префикÑа - 64 бита. По умолчанию \"::/0\" (без префикÑа)."
++
++msgid "Timing and Validity"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¸ Ñроки дейÑтвиÑ"
++
++msgid "Topology"
++msgstr "ТопологиÑ"
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++"Значение Ð¿Ð¾Ð»Ñ ToS IP -аголовка управлÑющего трафика. По умолчанию \"16\"."
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº ÑервиÑу OLSR!"
++
++msgid "Uplink"
++msgstr "ВоÑходÑщий канал"
++
++msgid "Uplink uses NAT"
++msgstr "ВоÑходÑщий канал иÑпользует NAT"
++
++msgid "Use hysteresis"
++msgstr "ИÑпользовать гиÑтерезиÑ"
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr "ВерÑиÑ"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr "WLAN"
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++"Внимание: kmod-ipip не уÑтановлен. Без kmod-ipip SmartGateway не будет "
++"работать, пожалуйÑта, уÑтановите Ñтот пакет."
++
++msgid "Weight"
++msgstr "ВеÑ"
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++"При иÑпользовании неÑкольких Ñоединений между хоÑтами, Ð²ÐµÑ Ñлужит Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° "
++"иÑпользуемого интерфейÑа. Обычно, Ð²ÐµÑ Ñ€Ð°ÑÑчитываетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки olsrd на "
++"оÑнове характериÑтик интерфейÑа, но данное поле позволÑет уÑтановить Ð²ÐµÑ "
++"вручную. Olsrd выберет ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð½Ð°Ð¸Ð¼ÐµÐ½ÑŒÑˆÐ¸Ð¼ значением веÑа.<br /"
++"><b>Замечание: Ð²ÐµÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа иÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в Ñлучае уÑтановки Ð¿Ð¾Ð»Ñ "
++"\"Уровень LQ\" в 0. Ð”Ð»Ñ Ð»ÑŽÐ±Ñ‹Ñ… других значений Ð¿Ð¾Ð»Ñ \"Уровень LQ\", "
++"иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð¿Ð¾Ð»Ñ ETX."
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++"Какой вид воÑходÑщего канала ÑкпортируетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ узлам ÑчеиÑтой Ñети. "
++"Определение воÑходÑщего канала проиÑходит при наличии в локальном HNA "
++"0.0.0.0/0, ::ffff:0:0/96 или 2000::/3. Значение по умолчанию: \"оба\"."
++
++#, fuzzy
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++"Какой вид воÑходÑщего канала ÑкпортируетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ узлам ÑчеиÑтой Ñети. "
++"Определение воÑходÑщего канала проиÑходит при наличии в локальном HNA "
++"0.0.0.0/0, ::ffff:0:0/96 или 2000::/3. Значение по умолчанию: \"оба\"."
++
++msgid "Willingness"
++msgstr "ГотовноÑÑ‚ÑŒ"
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid "Device"
++#~ msgstr "УÑтройÑтво"
++
++#~ msgid ""
++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, "
++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"."
++#~ msgstr ""
++#~ "УдоÑтоверьтеÑÑŒ, что OLSRd работает, модуль \"txtinfo\" загружен, наÑтроен "
++#~ "на порт 2006 и принимает ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ \"127.0.0.1\"."
+diff --git a/feeds/luci/applications/luci-app-olsr/po/sk/olsr.po b/feeds/luci/applications/luci-app-olsr/po/sk/olsr.po
+new file mode 100644
+index 0000000..fdd37e3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/sk/olsr.po
+@@ -0,0 +1,687 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-olsr/po/sv/olsr.po b/feeds/luci/applications/luci-app-olsr/po/sv/olsr.po
+new file mode 100644
+index 0000000..9af47a4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/sv/olsr.po
+@@ -0,0 +1,688 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-olsr/po/templates/olsr.pot b/feeds/luci/applications/luci-app-olsr/po/templates/olsr.pot
+new file mode 100644
+index 0000000..6bd63c2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/templates/olsr.pot
+@@ -0,0 +1,680 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-olsr/po/tr/olsr.po b/feeds/luci/applications/luci-app-olsr/po/tr/olsr.po
+new file mode 100644
+index 0000000..1864189
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/tr/olsr.po
+@@ -0,0 +1,687 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-olsr/po/uk/olsr.po b/feeds/luci/applications/luci-app-olsr/po/uk/olsr.po
+new file mode 100644
+index 0000000..d35fe31
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/uk/olsr.po
+@@ -0,0 +1,688 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr ""
++
++msgid "FIB metric"
++msgstr ""
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++msgid "HNA6 Announcements"
++msgstr ""
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-olsr/po/vi/olsr.po b/feeds/luci/applications/luci-app-olsr/po/vi/olsr.po
+new file mode 100644
+index 0000000..698e528
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/vi/olsr.po
+@@ -0,0 +1,703 @@
++# olsr.pot
++# generated from ./applications/luci-olsr/luasrc/i18n/olsr.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:58+0200\n"
++"PO-Revision-Date: 2009-08-16 12:39+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "Active MID announcements"
++msgstr "Thông báo của các MID đang hoạt động"
++
++msgid "Active OLSR nodes"
++msgstr "Những OLSR nodes đang hoạt động"
++
++msgid "Active host net announcements"
++msgstr "Thông báo của mạng host đang hoạt động"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow gateways with NAT"
++msgstr ""
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr ""
++
++msgid "Announce uplink"
++msgstr ""
++
++msgid "Announced network"
++msgstr "Mạng lưới thông báo"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr ""
++
++msgid "Broadcast address"
++msgstr ""
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Download Config"
++msgstr ""
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++
++msgid "Enable this interface."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Expected retransmission count"
++msgstr "Expected retransmission count"
++
++msgid "FIB metric"
++msgstr "FIB metric"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General settings"
++msgstr "Cài đặt tổng quát"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr "Khoảng HNA"
++
++msgid "HNA validity time"
++msgstr "Thá»i gian hợp lệ hóa HNA "
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "OLSR - HNA - Thông báo"
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr "Vùng xin chào"
++
++msgid "Hello validity time"
++msgstr "Thá»i gian hợp lệ hóa lá»i chào"
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "IPv4 broadcast"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr "Internet protocol"
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr "Tuyến OLRS đã biết"
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr "LQ aging"
++
++msgid "LQ algorithm"
++msgstr "LQ algorithm"
++
++msgid "LQ fisheye"
++msgstr "LQ fisheye"
++
++msgid "LQ level"
++msgstr "LQ level"
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr "Hop cuối "
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr "Thư viện "
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr "Giao diện địa phương IP"
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr "Khoảng MID"
++
++msgid "MID validity time"
++msgstr "Thá»i gian hợp lệ hóa MID"
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr "Lận cận IP"
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr "Netmask"
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr "OLSR - HNA - Thông báo"
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr "OLSR - HNA - Thông báo"
++
++msgid "OLSR - Plugins"
++msgstr "OLSR - Plugins"
++
++msgid "OLSR Daemon"
++msgstr "OLSR Daemon"
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr "Kết nối OLSR"
++
++msgid "OLSR gateway"
++msgstr "Cổng OLSR"
++
++msgid "OLSR node"
++msgstr "OLSR node"
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr "Tổng quát vỠcác thông báo của mạng host đang hoạt động"
++
++msgid "Overview of currently established OLSR connections"
++msgstr "Tổng quát vỠkết nối OLSR hiện tại "
++
++msgid "Overview of currently known OLSR nodes"
++msgstr "Tổng quát của các OLSR nodes đã biết hiện tại"
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr "Tổng quát của các tuyến đã biết hiện tại tới những OLSR nodes khác"
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr "Tổng quát vá» thông báo của nhiá»u giao diện đã biết"
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr "Cấu hình Plugin"
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr "Pollrate"
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr "Tiá»n tố"
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr "Giao diện OLSR thứ nhì"
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr "Khoảng TC"
++
++msgid "TC validity time"
++msgstr "Thá»i gian hợp lệ hóa TC"
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr "Không thể kết nối với OLSR daemon!"
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr "Dùng hysteresis"
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr "Sẵn sàng"
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid ""
++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, "
++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"."
++#~ msgstr ""
++#~ "Bảo đảm là OLSRd đang vận hành, the &amp;quot;txtinfo&amp;quot; plugin "
++#~ "được tải, định cấu hình trên cổng 2006 và chấp nhận kết nối từ &amp;"
++#~ "quot;127.0.0.1&amp;quot;."
+diff --git a/feeds/luci/applications/luci-app-olsr/po/zh-cn/olsr.po b/feeds/luci/applications/luci-app-olsr/po/zh-cn/olsr.po
+new file mode 100644
+index 0000000..37264f5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/zh-cn/olsr.po
+@@ -0,0 +1,696 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-10 20:26+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr ""
++
++msgid "Active OLSR nodes"
++msgstr ""
++
++msgid "Active host net announcements"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr "高级设置"
++
++msgid "Allow gateways with NAT"
++msgstr "å…许网关使用NAT"
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr "å…许选定的IPv4通过网关NAT"
++
++msgid "Announce uplink"
++msgstr "广告上行"
++
++msgid "Announced network"
++msgstr "广告网络"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr "两个值必须使用点分å进制表示法。"
++
++msgid "Broadcast address"
++msgstr "广播地å€"
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr "é…ç½®"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr "显示"
++
++msgid "Downlink"
++msgstr "断线"
++
++msgid "Download Config"
++msgstr "下载é…ç½®"
++
++msgid "ETX"
++msgstr "ETX"
++
++msgid "Enable"
++msgstr "å…许"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++"å¯ç”¨SmartGateway。如果ç¦ç”¨ï¼Œåˆ™SmartGateway其他所有å‚数将忽略。缺çœå€¼ï¼šâ€œç¦ç”¨â€"
++
++msgid "Enable this interface."
++msgstr "å¯ç”¨è¿™ä¸ªç«¯å£"
++
++msgid "Enabled"
++msgstr "å¯ç”¨"
++
++msgid "Expected retransmission count"
++msgstr "预期é‡å‘æ•°"
++
++msgid "FIB metric"
++msgstr "FIB度é‡"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr "网关"
++
++msgid "General Settings"
++msgstr "通用设置"
++
++msgid "General settings"
++msgstr "通用设置"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr "HNA"
++
++msgid "HNA Announcements"
++msgstr "HNA公告"
++
++msgid "HNA interval"
++msgstr "HNAé—´éš™"
++
++msgid "HNA validity time"
++msgstr "HNA有效时长"
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "HNA公告"
++
++msgid "Hello"
++msgstr "Hello"
++
++msgid "Hello interval"
++msgstr "Helloé—´éš™"
++
++msgid "Hello validity time"
++msgstr "Hello有效时长"
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr "Hna4"
++
++msgid "Hna6"
++msgstr "Hna6"
++
++msgid "Hops"
++msgstr "è·³"
++
++msgid "Hostname"
++msgstr "主机å"
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr "IP地å€"
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 broadcast"
++msgstr "IPv4广播地å€"
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++#, fuzzy
++msgid "OLSR - HNA6-Announcements"
++msgstr "HNA公告"
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid "Device"
++#~ msgstr "设备"
+diff --git a/feeds/luci/applications/luci-app-olsr/po/zh-tw/olsr.po b/feeds/luci/applications/luci-app-olsr/po/zh-tw/olsr.po
+new file mode 100644
+index 0000000..797874d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/po/zh-tw/olsr.po
+@@ -0,0 +1,700 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-15 07:15+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Active MID announcements"
++msgstr "啟用Mesh網狀網路ID公告"
++
++msgid "Active OLSR nodes"
++msgstr "啟用OLSR路由å”議節點"
++
++msgid "Active host net announcements"
++msgstr "啟用主機網路公告"
++
++msgid "Advanced Settings"
++msgstr "進階設定"
++
++msgid "Allow gateways with NAT"
++msgstr "å…許帶NATçš„åŒé“器"
++
++msgid "Allow the selection of an outgoing ipv4 gateway with NAT"
++msgstr "å…許帶NATçš„åŒé“器é¸æ“‡è¼¸å‡ºipv4å°åŒ…"
++
++msgid "Announce uplink"
++msgstr "公告上傳"
++
++msgid "Announced network"
++msgstr "公告網路"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Bad (SNR < 5)"
++msgstr ""
++
++msgid "Both values must use the dotted decimal notation."
++msgstr "這兩個值都必須採用點分å進ä½åˆ¶æ ¼å¼"
++
++msgid "Broadcast address"
++msgstr "廣播ä½å€"
++
++msgid "Can only be a valid IPv4 or IPv6 address or 'default'"
++msgstr ""
++
++msgid "Can only be a valid IPv6 address or 'default'"
++msgstr ""
++
++msgid "Configuration"
++msgstr "設定"
++
++msgid ""
++"Could not get any data. Make sure the jsoninfo plugin is installed and "
++"allows connections from localhost."
++msgstr ""
++
++msgid "Display"
++msgstr "顯示"
++
++msgid "Downlink"
++msgstr "下行"
++
++msgid "Download Config"
++msgstr "下載設置"
++
++msgid "ETX"
++msgstr ""
++
++msgid "Enable"
++msgstr "啟用"
++
++msgid ""
++"Enable SmartGateway. If it is disabled, then all other SmartGateway "
++"parameters are ignored. Default is \"no\"."
++msgstr ""
++"啟用機動å¼åŒé“器. å‡å¦‚它失效, 其它所有機動å¼åŒé“器åƒæ•¸å°‡è¢«å¿½è¦–. é è¨­å€¼æ˜¯\"no"
++"\""
++
++msgid "Enable this interface."
++msgstr "啟用這個介é¢"
++
++msgid "Enabled"
++msgstr "啟用"
++
++msgid "Expected retransmission count"
++msgstr "é è¨ˆé‡å‚³æ¬¡æ•¸"
++
++msgid "FIB metric"
++msgstr "FIB指標"
++
++msgid ""
++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" "
++"means that the metric value is always 2. This is the preferred value because "
++"it helps the linux kernel routing to clean up older routes. \"correct\" uses "
++"the hopcount as the metric value. \"approx\" use the hopcount as the metric "
++"value too, but does only update the hopcount if the nexthop changes too. "
++"Default is \"flat\"."
++msgstr ""
++"FIBMetric控制OLSR主機路由的公用路由計é‡è¨­å®š. \"flat\" 代表是公用計é‡æ•¸æ°¸é æ˜¯"
++"2. 這是較å—歡迎的數值, 因為它會å”助linux核心路由清除舊的路由表. \"correct\"使"
++"用跳èºæ•¸ç•¶ä½œå…¬ç”¨è·¯ç”±è¨ˆé‡. \"approx\"也使用跳èºæ•¸ç•¶ä½œå…¬ç”¨è·¯ç”±è¨ˆé‡, 但åªä½œç”¨åœ¨"
++"è·³èºæ•¸ä¹Ÿæ›´æ–°æ™‚. é è¨­å€¼æ˜¯\"flat\"."
++
++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\""
++msgstr ""
++
++msgid "Gateway"
++msgstr "åŒé“器"
++
++msgid "General Settings"
++msgstr "一般設定"
++
++msgid "General settings"
++msgstr "一般設定"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Good (30 > SNR > 20)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "HNA"
++msgstr ""
++
++msgid "HNA Announcements"
++msgstr ""
++
++msgid "HNA interval"
++msgstr ""
++
++msgid "HNA validity time"
++msgstr ""
++
++#, fuzzy
++msgid "HNA6 Announcements"
++msgstr "啟用Mesh網狀網路ID公告"
++
++msgid "Hello"
++msgstr ""
++
++msgid "Hello interval"
++msgstr ""
++
++msgid "Hello validity time"
++msgstr ""
++
++msgid "Hide IPv4"
++msgstr ""
++
++msgid "Hide IPv6"
++msgstr ""
++
++msgid "Hna4"
++msgstr ""
++
++msgid "Hna6"
++msgstr ""
++
++msgid "Hops"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA messages."
++msgstr ""
++
++msgid ""
++"Hosts in a OLSR routed network can announce connecitivity to external "
++"networks using HNA6 messages."
++msgstr ""
++
++msgid ""
++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more "
++"robustness to the link sensing but delays neighbor registration. Defaults is "
++"\"yes\""
++msgstr ""
++
++msgid "IP Addresses"
++msgstr ""
++
++msgid ""
++"IP-version to use. If 6and4 is selected then one olsrd instance is started "
++"for each protocol."
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid ""
++"IPv4 broadcast address for outgoing OLSR packets. One useful example would "
++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the "
++"interface broadcast IP."
++msgstr ""
++
++msgid "IPv4 source"
++msgstr ""
++
++msgid ""
++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which "
++"triggers usage of the interface IP."
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 multicast"
++msgstr ""
++
++msgid ""
++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal "
++"multicast."
++msgstr ""
++
++msgid ""
++"IPv6 network must be given in full notation, prefix must be in CIDR notation."
++msgstr ""
++
++msgid "IPv6 source"
++msgstr ""
++
++msgid ""
++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches "
++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage "
++"of a not-linklocal interface IP."
++msgstr ""
++
++msgid "IPv6-Prefix of the uplink"
++msgstr ""
++
++msgid ""
++"If the route to the current gateway is to be changed, the ETX value of this "
++"gateway is multiplied with this value before it is compared to the new one. "
++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 "
++"if changed.<br /><b>WARNING:</b> This parameter should not be used together "
++"with the etx_ffeth metric!<br />Defaults to \"1.0\"."
++msgstr ""
++
++msgid ""
++"If this Node uses NAT for connections to the internet. Default is \"yes\"."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Interface Mode is used to prevent unnecessary packet forwarding on switched "
++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is "
++"\"mesh\"."
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces Defaults"
++msgstr ""
++
++msgid "Internet protocol"
++msgstr ""
++
++msgid ""
++"Interval to poll network interfaces for configuration changes (in seconds). "
++"Default is \"2.5\"."
++msgstr ""
++
++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0."
++msgstr ""
++
++msgid ""
++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 "
++"and 1.0 here."
++msgstr ""
++
++msgid "Known OLSR routes"
++msgstr ""
++
++msgid "LQ"
++msgstr ""
++
++msgid "LQ aging"
++msgstr ""
++
++msgid "LQ algorithm"
++msgstr ""
++
++msgid "LQ fisheye"
++msgstr ""
++
++msgid "LQ level"
++msgstr ""
++
++msgid ""
++"LQMult requires two values (IP address or 'default' and multiplicator) "
++"seperated by space."
++msgstr ""
++
++msgid "Last hop"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Library"
++msgstr ""
++
++msgid "Link Quality Settings"
++msgstr ""
++
++msgid ""
++"Link quality aging factor (only for lq level 2). Tuning parameter for "
++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. "
++"(allowed values are between 0.01 and 1.0)"
++msgstr ""
++
++msgid ""
++"Link quality algorithm (only for lq level 2).<br /><b>etx_float</b>: "
++"floating point ETX with exponential aging<br /><b>etx_fpm</b> : same as "
++"etx_float, but with integer arithmetic<br /><b>etx_ff</b> : ETX freifunk, an "
++"etx variant which use all OLSR traffic (instead of only hellos) for ETX "
++"calculation<br /><b>etx_ffeth</b>: incompatible variant of etx_ff that "
++"allows ethernet links with ETX 0.1.<br />Defaults to \"etx_ff\""
++msgstr ""
++
++msgid ""
++"Link quality level switch between hopcount and cost-based (mostly ETX) "
++"routing.<br /><b>0</b> = do not use link quality<br /><b>2</b> = use link "
++"quality for MPR selection and routing<br />Default is \"2\""
++msgstr ""
++
++msgid "LinkQuality Multiplicator"
++msgstr ""
++
++msgid "Links per node (average)"
++msgstr ""
++
++msgid "Links total"
++msgstr ""
++
++msgid "Local interface IP"
++msgstr ""
++
++msgid "MID"
++msgstr ""
++
++msgid "MID interval"
++msgstr ""
++
++msgid "MID validity time"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid "Main IP"
++msgstr ""
++
++msgid ""
++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, "
++"configured on port 9090 and accepts connections from \"127.0.0.1\"."
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5<br />reduce LQ to all "
++"nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid ""
++"Multiply routes with the factor given here. Allowed values are between 0.01 "
++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:<br /"
++">reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5<br />reduce "
++"LQ to all nodes on this interface by 20%: default 0.8"
++msgstr ""
++
++msgid "NAT threshold"
++msgstr ""
++
++msgid "NLQ"
++msgstr ""
++
++msgid "Neighbors"
++msgstr ""
++
++msgid "Neighbour IP"
++msgstr ""
++
++msgid "Neighbours"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network address"
++msgstr ""
++
++msgid "Nic changes poll interval"
++msgstr ""
++
++msgid "Nodes"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "OLSR - Display Options"
++msgstr ""
++
++msgid "OLSR - HNA-Announcements"
++msgstr ""
++
++msgid "OLSR - HNA6-Announcements"
++msgstr ""
++
++msgid "OLSR - Plugins"
++msgstr ""
++
++msgid "OLSR Daemon"
++msgstr ""
++
++msgid "OLSR Daemon - Interface"
++msgstr ""
++
++msgid "OLSR connections"
++msgstr ""
++
++msgid "OLSR gateway"
++msgstr ""
++
++msgid "OLSR node"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Overview of currently active OLSR host net announcements"
++msgstr ""
++
++msgid "Overview of currently established OLSR connections"
++msgstr ""
++
++msgid "Overview of currently known OLSR nodes"
++msgstr ""
++
++msgid "Overview of currently known routes to other OLSR nodes"
++msgstr ""
++
++msgid "Overview of interfaces where OLSR is running"
++msgstr ""
++
++msgid "Overview of known multiple interface announcements"
++msgstr ""
++
++msgid "Overview of smart gateways in this network"
++msgstr ""
++
++msgid "Plugin configuration"
++msgstr ""
++
++msgid "Plugins"
++msgstr ""
++
++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05."
++msgstr ""
++
++msgid "Pollrate"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "Resolve"
++msgstr ""
++
++msgid ""
++"Resolve hostnames on status pages. It is generally safe to allow this, but "
++"if you use public IPs and have unstable DNS-Setup then those pages will load "
++"really slow. In this case disable it here."
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Secondary OLSR interfaces"
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the "
++"IP of the first interface."
++msgstr ""
++
++msgid ""
++"Sets the main IP (originator ip) of the router. This IP will NEVER change "
++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of "
++"the first interface."
++msgstr ""
++
++msgid "Show IPv4"
++msgstr ""
++
++msgid "Show IPv6"
++msgstr ""
++
++msgid "Signal Noise Ratio in dB"
++msgstr ""
++
++msgid "SmartGW"
++msgstr ""
++
++msgid "SmartGW announcements"
++msgstr ""
++
++msgid "SmartGateway is not configured on this system."
++msgstr ""
++
++msgid "Source address"
++msgstr ""
++
++msgid ""
++"Specifies the speed of the uplink in kilobits/s. First parameter is "
++"upstream, second parameter is downstream. Default is \"128 1024\"."
++msgstr ""
++
++msgid "Speed of the uplink"
++msgstr ""
++
++msgid "State"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (20 > SNR > 5)"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "Success rate of packages received from the neighbour"
++msgstr ""
++
++msgid "Success rate of packages sent to the neighbour"
++msgstr ""
++
++msgid "TC"
++msgstr ""
++
++msgid "TC interval"
++msgstr ""
++
++msgid "TC validity time"
++msgstr ""
++
++msgid "TOS value"
++msgstr ""
++
++msgid ""
++"The OLSR daemon is an implementation of the Optimized Link State Routing "
++"protocol. As such it allows mesh routing for any network equipment. It runs "
++"on any wifi card that supports ad-hoc mode and of course on any ethernet "
++"device. Visit <a href='http://www.olsr.org'>olsrd.org</a> for help and "
++"documentation."
++msgstr ""
++
++msgid ""
++"The fixed willingness to use. If not set willingness will be calculated "
++"dynamically based on battery/power status. Default is \"3\"."
++msgstr ""
++
++msgid "The interface OLSRd should serve."
++msgstr ""
++
++msgid ""
++"The port OLSR uses. This should usually stay at the IANA assigned port 698. "
++"It can have a value between 1 and 65535."
++msgstr ""
++
++msgid ""
++"This can be used to signal the external IPv6 prefix of the uplink to the "
++"clients. This might allow a client to change it's local IPv6 address to use "
++"the IPv6 gateway without any kind of address translation. The maximum prefix "
++"length is 64 bits. Default is \"::/0\" (no prefix)."
++msgstr ""
++
++msgid "Timing and Validity"
++msgstr ""
++
++msgid "Topology"
++msgstr ""
++
++msgid ""
++"Type of service value for the IP header of control traffic. Default is "
++"\"16\"."
++msgstr ""
++
++msgid "Unable to connect to the OLSR daemon!"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Uplink uses NAT"
++msgstr ""
++
++msgid "Use hysteresis"
++msgstr ""
++
++msgid "Validity Time"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid "Very good (SNR > 30)"
++msgstr ""
++
++msgid "WLAN"
++msgstr ""
++
++msgid ""
++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not "
++"work, please install it."
++msgstr ""
++
++msgid "Weight"
++msgstr ""
++
++msgid ""
++"When multiple links exist between hosts the weight of interface is used to "
++"determine the link to use. Normally the weight is automatically calculated "
++"by olsrd based on the characteristics of the interface, but here you can "
++"specify a fixed value. Olsrd will choose links with the lowest value.<br /"
++"><b>Note:</b> Interface weight is used only when LinkQualityLevel is set to "
++"0. For any other value of LinkQualityLevel, the interface ETX value is used "
++"instead."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. "
++"Default setting is \"both\"."
++msgstr ""
++
++msgid ""
++"Which kind of uplink is exported to the other mesh nodes. An uplink is "
++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default "
++"setting is \"both\"."
++msgstr ""
++
++msgid "Willingness"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++#~ msgid "Device"
++#~ msgstr "設備"
+diff --git a/feeds/luci/applications/luci-app-olsr/root/etc/config/luci_olsr b/feeds/luci/applications/luci-app-olsr/root/etc/config/luci_olsr
+new file mode 100644
+index 0000000..2dd4ffa
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/root/etc/config/luci_olsr
+@@ -0,0 +1,2 @@
++config 'olsr' 'general'
++ option 'resolve' '1'
+diff --git a/feeds/luci/applications/luci-app-olsr/root/etc/uci-defaults/luci-olsr b/feeds/luci/applications/luci-app-olsr/root/etc/uci-defaults/luci-olsr
+new file mode 100755
+index 0000000..63c01e4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-olsr/root/etc/uci-defaults/luci-olsr
+@@ -0,0 +1,14 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@olsrd[-1]
++ add ucitrack olsrd
++ set ucitrack.@olsrd[-1].init=olsrd
++ delete ucitrack.@olsrd6[-1]
++ add ucitrack olsrd6
++ set ucitrack.@olsrd6[-1].init=olsrd6
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-openvpn/Makefile b/feeds/luci/applications/luci-app-openvpn/Makefile
+new file mode 100644
+index 0000000..a8070fd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for OpenVPN
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/controller/openvpn.lua b/feeds/luci/applications/luci-app-openvpn/luasrc/controller/openvpn.lua
+new file mode 100644
+index 0000000..2e48a46
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/controller/openvpn.lua
+@@ -0,0 +1,11 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.openvpn", package.seeall)
++
++function index()
++ entry( {"admin", "services", "openvpn"}, cbi("openvpn"), _("OpenVPN") )
++ entry( {"admin", "services", "openvpn", "basic"}, cbi("openvpn-basic"), nil ).leaf = true
++ entry( {"admin", "services", "openvpn", "advanced"}, cbi("openvpn-advanced"), nil ).leaf = true
++end
+diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua
+new file mode 100644
+index 0000000..fa15300
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua
+@@ -0,0 +1,262 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.ip")
++require("luci.model.uci")
++
++
++local knownParams = {
++ --
++ -- Widget Name Default(s) Description Option(s)
++ --
++
++ { "Service", {
++ -- initialisation and daemon options
++ { ListValue, "verb", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }, translate("Set output verbosity") },
++ { Flag, "mlock", 0, translate("Disable Paging") },
++ { Flag, "disable_occ", 0, translate("Disable options consistency check") },
++ -- { Value, "user", "root", translate("Set UID to user") },
++ -- { Value, "group", "root", translate("Set GID to group") },
++ { Value, "cd", "/etc/openvpn", translate("Change to directory before initialization") },
++ { Value, "chroot", "/var/run", translate("Chroot to directory after initialization") },
++ -- { Value, "daemon", "Instance-Name", translate("Daemonize after initialization") },
++ -- { Value, "syslog", "Instance-Name", translate("Output to syslog and do not daemonize") },
++ { Flag, "passtos", 0, translate("TOS passthrough (applies to IPv4 only)") },
++ -- { Value, "inetd", "nowait Instance-Name", translate("Run as an inetd or xinetd server") },
++ { Value, "log", "/var/log/openvpn.log", translate("Write log to file") },
++ { Value, "log_append", "/var/log/openvpn.log", translate("Append log to file") },
++ { Flag, "suppress_timestamps", 0, translate("Don't log timestamps") },
++ -- { Value, "writepid", "/var/run/openvpn.pid", translate("Write process ID to file") },
++ { Value, "nice", 0, translate("Change process priority") },
++ { Flag, "fast_io", 0, translate("Optimize TUN/TAP/UDP writes") },
++ { Value, "echo", "some params echoed to log", translate("Echo parameters to log") },
++ { ListValue, "remap_usr1", { "SIGHUP", "SIGTERM" }, translate("Remap SIGUSR1 signals") },
++ { Value, "status", "/var/run/openvpn.status 5", translate("Write status to file every n seconds") },
++ { Value, "status_version", { 1, 2 }, translate("Status file format version") }, -- status
++ { Value, "mute", 5, translate("Limit repeated log messages") },
++
++ { Value, "up", "/usr/bin/ovpn-up", translate("Shell cmd to execute after tun device open") },
++ { Value, "up_delay", 5, translate("Delay tun/tap open and up script execution") },
++ { Value, "down", "/usr/bin/ovpn-down", translate("Shell cmd to run after tun device close") },
++ { Flag, "down_pre", 0, translate("Call down cmd/script before TUN/TAP close") },
++ { Flag, "up_restart", 0, translate("Run up/down scripts for all restarts") },
++ { Value, "route_up", "/usr/bin/ovpn-routeup", translate("Execute shell cmd after routes are added") },
++ { Value, "ipchange", "/usr/bin/ovpn-ipchange", translate("Execute shell command on remote ip change"), { mode="p2p" } },
++ { DynamicList, "setenv", { "VAR1 value1", "VAR2 value2" }, translate("Pass environment variables to script") },
++ { Value, "tls_verify", "/usr/bin/ovpn-tlsverify", translate("Shell command to verify X509 name") },
++ { Value, "client_connect", "/usr/bin/ovpn-clientconnect", translate("Run script cmd on client connection") },
++ { Flag, "client_disconnect", 0, translate("Run script cmd on client disconnection") },
++ { Value, "learn_address", "/usr/bin/ovpn-learnaddress", translate("Executed in server mode whenever an IPv4 address/route or MAC address is added to OpenVPN's internal routing table") },
++ { Value, "auth_user_pass_verify", "/usr/bin/ovpn-userpass via-env", translate("Executed in server mode on new client connections, when the client is still untrusted") },
++ { ListValue, "script_security", { 0, 1, 2, 3 }, translate("Policy level over usage of external programs and scripts") },
++ } },
++
++ { "Networking", {
++ -- socket config
++ { ListValue, "mode", { "p2p", "server" }, translate("Major mode") },
++ { Value, "local", "0.0.0.0", translate("Local host name or ip address") },
++ { Value, "port", 1194, translate("TCP/UDP port # for both local and remote") },
++ { Value, "lport", 1194, translate("TCP/UDP port # for local (default=1194)") },
++ { Value, "rport", 1194, translate("TCP/UDP port # for remote (default=1194)") },
++ { Flag, "float", 0, translate("Allow remote to change its IP or port") },
++ { Flag, "nobind", 0, translate("Do not bind to local address and port") },
++
++ { Value, "dev", "tun0", translate("tun/tap device") },
++ { ListValue, "dev_type", { "tun", "tap" }, translate("Type of used device") },
++ { Value, "dev_node", "/dev/net/tun", translate("Use tun/tap device node") },
++ { Flag, "tun_ipv6", 0, translate("Make tun device IPv6 capable") },
++
++ { Value, "ifconfig", "10.200.200.3 10.200.200.1", translate("Set tun/tap adapter parameters") },
++ { Flag, "ifconfig_noexec", 0, translate("Don't actually execute ifconfig") },
++ { Flag, "ifconfig_nowarn", 0, translate("Don't warn on ifconfig inconsistencies") },
++
++ { DynamicList, "route", "10.123.0.0 255.255.0.0", translate("Add route after establishing connection") },
++ { Value, "route_gateway", "10.234.1.1", translate("Specify a default gateway for routes") },
++ { Value, "route_delay", 0, translate("Delay n seconds after connection") },
++ { Flag, "route_noexec", 0, translate("Don't add routes automatically") },
++
++ { ListValue, "mtu_disc", { "yes", "maybe", "no" }, translate("Enable Path MTU discovery") },
++ { Flag, "mtu_test", 0, translate("Empirically measure MTU") },
++ { ListValue, "comp_lzo", { "yes", "no", "adaptive" }, translate("Use fast LZO compression") },
++ { Flag, "comp_noadapt", 0, translate("Don't use adaptive lzo compression"), { comp_lzo=1 } },
++ { Value, "link_mtu", 1500, translate("Set TCP/UDP MTU") },
++ { Value, "tun_mtu", 1500, translate("Set tun/tap device MTU") },
++ { Value, "tun_mtu_extra", 1500, translate("Set tun/tap device overhead") },
++ { Value, "fragment", 1500, translate("Enable internal datagram fragmentation"), { proto="udp" } },
++ { Value, "mssfix", 1500, translate("Set upper bound on TCP MSS"), { proto="udp" } },
++ { Value, "sndbuf", 65536, translate("Set the TCP/UDP send buffer size") },
++ { Value, "rcvbuf", 65536, translate("Set the TCP/UDP receive buffer size") },
++ { Value, "txqueuelen", 100, translate("Set tun/tap TX queue length") },
++ { Value, "shaper", 10240, translate("Shaping for peer bandwidth") },
++
++ { Value, "inactive", 240, translate("tun/tap inactivity timeout") },
++ { Value, "keepalive", "10 60", translate("Helper directive to simplify the expression of --ping and --ping-restart in server mode configurations") },
++ { Value, "ping", 30, translate("Ping remote every n seconds over TCP/UDP port") },
++ { Value, "ping_exit", 120, translate("Remote ping timeout") },
++ { Value, "ping_restart", 60, translate("Restart after remote ping timeout") },
++ { Flag, "ping_timer_rem", 0, translate("Only process ping timeouts if routes exist") },
++
++ { Flag, "persist_tun", 0, translate("Keep tun/tap device open on restart") },
++ { Flag, "persist_key", 0, translate("Don't re-read key on restart") },
++ { Flag, "persist_local_ip", 0, translate("Keep local IP address on restart") },
++ { Flag, "persist_remote_ip", 0, translate("Keep remote IP address on restart") },
++
++ -- management channel
++ { Value, "management", "127.0.0.1 31194 /etc/openvpn/mngmt-pwds", translate("Enable management interface on <em>IP</em> <em>port</em>") },
++ { Flag, "management_query_passwords", 0, translate("Query management channel for private key") }, -- management
++ { Flag, "management_hold", 0, translate("Start OpenVPN in a hibernating state") }, -- management
++ { Value, "management_log_cache", 100, translate("Number of lines for log file history") }, -- management
++ { ListValue, "topology", { "net30", "p2p", "subnet" }, translate("'net30', 'p2p', or 'subnet'"), {dev_type="tun" } },
++ } },
++
++ { "VPN", {
++ { Value, "server", "10.200.200.0 255.255.255.0", translate("Configure server mode"), { server_mode="1" } },
++ { Value, "server_bridge", "10.200.200.1 255.255.255.0 10.200.200.200 10.200.200.250", translate("Configure server bridge"), { server_mode="1" } },
++ { DynamicList, "push", { "redirect-gateway", "comp-lzo" }, translate("Push options to peer"), { server_mode="1" } },
++ { Flag, "push_reset", 0, translate("Don't inherit global push options"), { server_mode="1" } },
++ { Flag, "disable", 0, translate("Client is disabled"), { server_mode="1" } },
++ { Value, "ifconfig_pool", "10.200.200.100 10.200.200.150 255.255.255.0", translate("Set aside a pool of subnets"), { server_mode="1" } },
++ { Value, "ifconfig_pool_persist", "/etc/openvpn/ipp.txt 600", translate("Persist/unpersist ifconfig-pool"), { server_mode="1" } },
++-- { Flag, "ifconfig_pool_linear", 0, translate("Use individual addresses rather than /30 subnets"), { server_mode="1" } }, -- deprecated and replaced by --topology p2p
++ { Value, "ifconfig_push", "10.200.200.1 255.255.255.255", translate("Push an ifconfig option to remote"), { server_mode="1" } },
++ { Value, "iroute", "10.200.200.0 255.255.255.0", translate("Route subnet to client"), { server_mode="1" } },
++ { Flag, "client_to_client", 0, translate("Allow client-to-client traffic"), { server_mode="1" } },
++ { Flag, "duplicate_cn", 0, translate("Allow multiple clients with same certificate"), { server_mode="1" } },
++ { Value, "client_config_dir", "/etc/openvpn/ccd", translate("Directory for custom client config files"), { server_mode="1" } },
++ { Flag, "ccd_exclusive", 0, translate("Refuse connection if no custom client config"), { server_mode="1" } },
++ { Value, "tmp_dir", "/var/run/openvpn", translate("Temporary directory for client-connect return file"), { server_mode="1" } },
++ { Value, "hash_size", "256 256", translate("Set size of real and virtual address hash tables"), { server_mode="1" } },
++ { Value, "bcast_buffers", 256, translate("Number of allocated broadcast buffers"), { server_mode="1" } },
++ { Value, "tcp_queue_limit", 64, translate("Maximum number of queued TCP output packets"), { server_mode="1" } },
++ { Value, "max_clients", 10, translate("Allowed maximum of connected clients"), { server_mode="1" } },
++ { Value, "max_routes_per_client", 256, translate("Allowed maximum of internal"), { server_mode="1" } },
++ { Value, "connect_freq", "3 10", translate("Allowed maximum of new connections"), { server_mode="1" } },
++ { Flag, "client_cert_not_required", 0, translate("Don't require client certificate"), { server_mode="1" } },
++ { Flag, "username_as_common_name", 0, translate("Use username as common name"), { server_mode="1" } },
++ { Flag, "client", 0, translate("Configure client mode"), { server_mode="0" }, { server_mode="" } },
++ { Flag, "pull", 0, translate("Accept options pushed from server"), { client="1" } },
++ { Value, "auth_user_pass", "/etc/openvpn/userpass.txt", translate("Authenticate using username/password"), { client="1" } },
++ { ListValue, "auth_retry", { "none", "nointeract", "interact" }, translate("Handling of authentication failures"), { client="1" } },
++ { Value, "explicit_exit_notify", 1, translate("Send notification to peer on disconnect"), { client="1" } },
++ { DynamicList, "remote", "1.2.3.4", translate("Remote host name or ip address"), { client="1" } },
++ { Flag, "remote_random", 1, translate("Randomly choose remote server"), { client="1" } },
++ { ListValue, "proto", { "udp", "tcp-client", "tcp-server" }, translate("Use protocol"), { client="1" } },
++ { Value, "connect_retry", 5, translate("Connection retry interval"), { proto="tcp-client" }, { client="1" } },
++ { Value, "http_proxy", "192.168.1.100 8080", translate("Connect to remote host through an HTTP proxy"), { client="1" } },
++ { Flag, "http_proxy_retry", 0, translate("Retry indefinitely on HTTP proxy errors"), { client="1" } },
++ { Value, "http_proxy_timeout", 5, translate("Proxy timeout in seconds"), { client="1" } },
++ { DynamicList, "http_proxy_option", { "VERSION 1.0", "AGENT OpenVPN/2.0.9" }, translate("Set extended HTTP proxy options"), { client="1" } },
++ { Value, "socks_proxy", "192.168.1.200 1080", translate("Connect through Socks5 proxy"), { client="1" } },
++ { Value, "socks_proxy_retry", 5, translate("Retry indefinitely on Socks proxy errors"), { client="1" } }, -- client && socks_proxy
++ { Value, "resolv_retry", "infinite", translate("If hostname resolve fails, retry"), { client="1" } },
++ { ListValue, "redirect_gateway", { "", "local", "def1", "local def1" }, translate("Automatically redirect default route"), { client="1" } },
++ } },
++
++ { "Cryptography", {
++ { Value, "secret", "/etc/openvpn/secret.key 1", translate("Enable Static Key encryption mode (non-TLS)") },
++ { Value, "auth", "SHA1", translate("HMAC authentication for packets") }, -- parse
++ { Value, "cipher", "BF-CBC", translate("Encryption cipher for packets") }, -- parse
++ { Value, "keysize", 1024, translate("Size of cipher key") }, -- parse
++ { Value, "engine", "dynamic", translate("Enable OpenSSL hardware crypto engines") }, -- parse
++ { Flag, "no_replay", 0, translate("Disable replay protection") },
++ { Value, "replay_window", "64 15", translate("Replay protection sliding window size") },
++ { Flag, "mute_replay_warnings", 0, translate("Silence the output of replay warnings") },
++ { Value, "replay_persist", "/var/run/openvpn-replay-state", translate("Persist replay-protection state") },
++ { Flag, "no_iv", 0, translate("Disable cipher initialisation vector") },
++ { Flag, "tls_server", 0, translate("Enable TLS and assume server role"), { tls_client="" }, { tls_client="0" } },
++ { Flag, "tls_client", 0, translate("Enable TLS and assume client role"), { tls_server="" }, { tls_server="0" } },
++ { FileUpload, "ca", "/etc/easy-rsa/keys/ca.crt", translate("Certificate authority") },
++ { FileUpload, "dh", "/etc/easy-rsa/keys/dh1024.pem", translate("Diffie Hellman parameters") },
++ { FileUpload, "cert", "/etc/easy-rsa/keys/some-client.crt", translate("Local certificate") },
++ { FileUpload, "key", "/etc/easy-rsa/keys/some-client.key", translate("Local private key") },
++ { FileUpload, "pkcs12", "/etc/easy-rsa/keys/some-client.pk12", translate("PKCS#12 file containing keys") },
++ { ListValue, "key_method", { 1, 2 }, translate("Enable TLS and assume client role") },
++ { Value, "tls_cipher", "DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:RC4-SHA:RC4-MD5:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC4-MD5",
++ translate("TLS cipher") },
++ { Value, "tls_timeout", 2, translate("Retransmit timeout on TLS control channel") },
++ { Value, "reneg_bytes", 1024, translate("Renegotiate data chan. key after bytes") },
++ { Value, "reneg_pkts", 100, translate("Renegotiate data chan. key after packets") },
++ { Value, "reneg_sec", 3600, translate("Renegotiate data chan. key after seconds") },
++ { Value, "hand_window", 60, translate("Timeframe for key exchange") },
++ { Value, "tran_window", 3600, translate("Key transition window") },
++ { Flag, "single_session", 0, translate("Allow only one session") },
++ { Flag, "tls_exit", 0, translate("Exit on TLS negotiation failure") },
++ { Value, "tls_auth", "/etc/openvpn/tlsauth.key 1", translate("Additional authentication over TLS") },
++ --{ Value, "askpass", "[file]", translate("Get PEM password from controlling tty before we daemonize") },
++ { Flag, "auth_nocache", 0, translate("Don't cache --askpass or --auth-user-pass passwords") },
++ { Value, "tls_remote", "remote_x509_name", translate("Only accept connections from given X509 name") },
++ { ListValue, "ns_cert_type", { "client", "server" }, translate("Require explicit designation on certificate") },
++ { ListValue, "remote_cert_tls", { "client", "server" }, translate("Require explicit key usage on certificate") },
++ { Value, "crl_verify", "/etc/easy-rsa/keys/crl.pem", translate("Check peer certificate against a CRL") },
++ } }
++}
++
++
++local cts = { }
++local params = { }
++
++local m = Map("openvpn")
++local p = m:section( SimpleSection )
++
++p.template = "openvpn/pageswitch"
++p.mode = "advanced"
++p.instance = arg[1]
++p.category = arg[2] or "Service"
++
++for _, c in ipairs(knownParams) do
++ cts[#cts+1] = c[1]
++ if c[1] == p.category then params = c[2] end
++end
++
++p.categories = cts
++
++
++local s = m:section(
++ NamedSection, arg[1], "openvpn",
++ translate("%s" % arg[2])
++)
++
++s.title = translate("%s" % arg[2])
++s.addremove = false
++s.anonymous = true
++
++
++for _, option in ipairs(params) do
++ local o = s:option(
++ option[1], option[2],
++ option[2], option[4]
++ )
++
++ if option[1] == DummyValue then
++ o.value = option[3]
++ else
++ if option[1] == DynamicList then
++ o.cast = nil
++ function o.cfgvalue(...)
++ local val = AbstractValue.cfgvalue(...)
++ return ( val and type(val) ~= "table" ) and { val } or val
++ end
++ end
++
++ o.optional = true
++
++ if type(option[3]) == "table" then
++ if o.optional then o:value("", "-- remove --") end
++ for _, v in ipairs(option[3]) do
++ v = tostring(v)
++ o:value(v)
++ end
++ o.default = tostring(option[3][1])
++ else
++ o.default = tostring(option[3])
++ end
++ end
++
++ for i=5,#option do
++ if type(option[i]) == "table" then
++ o:depends(option[i])
++ end
++ end
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua
+new file mode 100644
+index 0000000..561b0dd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua
+@@ -0,0 +1,91 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.ip")
++require("luci.model.uci")
++
++
++local basicParams = {
++ --
++ -- Widget, Name, Default(s), Description
++ --
++
++ { ListValue, "verb", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }, translate("Set output verbosity") },
++ { Value, "nice",0, translate("Change process priority") },
++ { Value,"port",1194, translate("TCP/UDP port # for both local and remote") },
++ { ListValue,"dev_type",{ "tun", "tap" }, translate("Type of used device") },
++ { Flag,"tun_ipv6",0, translate("Make tun device IPv6 capable") },
++
++ { Value,"ifconfig","10.200.200.3 10.200.200.1", translate("Set tun/tap adapter parameters") },
++ { Value,"server","10.200.200.0 255.255.255.0", translate("Configure server mode") },
++ { Value,"server_bridge","192.168.1.1 255.255.255.0 192.168.1.128 192.168.1.254", translate("Configure server bridge") },
++ { Flag,"nobind",0, translate("Do not bind to local address and port") },
++
++ { ListValue,"comp_lzo",{"yes","no","adaptive"}, translate("Use fast LZO compression") },
++ { Value,"keepalive","10 60", translate("Helper directive to simplify the expression of --ping and --ping-restart in server mode configurations") },
++
++ { ListValue,"proto",{ "udp", "tcp" }, translate("Use protocol") },
++
++ { Flag,"client",0, translate("Configure client mode") },
++ { Flag,"client_to_client",0, translate("Allow client-to-client traffic") },
++ { DynamicList,"remote","vpnserver.example.org", translate("Remote host name or ip address") },
++
++ { FileUpload,"secret","/etc/openvpn/secret.key 1", translate("Enable Static Key encryption mode (non-TLS)") },
++ { FileUpload,"pkcs12","/etc/easy-rsa/keys/some-client.pk12", translate("PKCS#12 file containing keys") },
++ { FileUpload,"ca","/etc/easy-rsa/keys/ca.crt", translate("Certificate authority") },
++ { FileUpload,"dh","/etc/easy-rsa/keys/dh1024.pem", translate("Diffie Hellman parameters") },
++ { FileUpload,"cert","/etc/easy-rsa/keys/some-client.crt", translate("Local certificate") },
++ { FileUpload,"key","/etc/easy-rsa/keys/some-client.key", translate("Local private key") },
++}
++
++
++local m = Map("openvpn")
++local p = m:section( SimpleSection )
++
++p.template = "openvpn/pageswitch"
++p.mode = "basic"
++p.instance = arg[1]
++
++
++local s = m:section( NamedSection, arg[1], "openvpn" )
++
++for _, option in ipairs(basicParams) do
++ local o = s:option(
++ option[1], option[2],
++ option[2], option[4]
++ )
++
++ o.optional = true
++
++ if option[1] == DummyValue then
++ o.value = option[3]
++ else
++ if option[1] == DynamicList then
++ o.cast = nil
++ function o.cfgvalue(...)
++ local val = AbstractValue.cfgvalue(...)
++ return ( val and type(val) ~= "table" ) and { val } or val
++ end
++ end
++
++ if type(option[3]) == "table" then
++ if o.optional then o:value("", "-- remove --") end
++ for _, v in ipairs(option[3]) do
++ v = tostring(v)
++ o:value(v)
++ end
++ o.default = tostring(option[3][1])
++ else
++ o.default = tostring(option[3])
++ end
++ end
++
++ for i=5,#option do
++ if type(option[i]) == "table" then
++ o:depends(option[i])
++ end
++ end
++end
++
++return m
++
+diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua
+new file mode 100644
+index 0000000..8b2ce5a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua
+@@ -0,0 +1,119 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local sys = require "luci.sys"
++local uci = require "luci.model.uci".cursor()
++local testfullps = luci.sys.exec("ps --help 2>&1 | grep BusyBox") --check which ps do we have
++local psstring = (string.len(testfullps)>0) and "ps w" or "ps axfw" --set command we use to get pid
++
++local m = Map("openvpn", translate("OpenVPN"))
++local s = m:section( TypedSection, "openvpn", translate("OpenVPN instances"), translate("Below is a list of configured OpenVPN instances and their current state") )
++s.template = "cbi/tblsection"
++s.template_addremove = "openvpn/cbi-select-input-add"
++s.addremove = true
++s.add_select_options = { }
++s.extedit = luci.dispatcher.build_url(
++ "admin", "services", "openvpn", "basic", "%s"
++)
++
++uci:load("openvpn_recipes")
++uci:foreach( "openvpn_recipes", "openvpn_recipe",
++ function(section)
++ s.add_select_options[section['.name']] =
++ section['_description'] or section['.name']
++ end
++)
++
++function s.parse(self, section)
++ local recipe = luci.http.formvalue(
++ luci.cbi.CREATE_PREFIX .. self.config .. "." ..
++ self.sectiontype .. ".select"
++ )
++
++ if recipe and not s.add_select_options[recipe] then
++ self.invalid_cts = true
++ else
++ TypedSection.parse( self, section )
++ end
++end
++
++function s.create(self, name)
++ local recipe = luci.http.formvalue(
++ luci.cbi.CREATE_PREFIX .. self.config .. "." ..
++ self.sectiontype .. ".select"
++ )
++ name = luci.http.formvalue(
++ luci.cbi.CREATE_PREFIX .. self.config .. "." ..
++ self.sectiontype .. ".text"
++ )
++ if string.len(name)>3 and not name:match("[^a-zA-Z0-9_]") then
++ uci:section(
++ "openvpn", "openvpn", name,
++ uci:get_all( "openvpn_recipes", recipe )
++ )
++
++ uci:delete("openvpn", name, "_role")
++ uci:delete("openvpn", name, "_description")
++ uci:save("openvpn")
++
++ luci.http.redirect( self.extedit:format(name) )
++ else
++ self.invalid_cts = true
++ end
++end
++
++
++s:option( Flag, "enabled", translate("Enabled") )
++
++local active = s:option( DummyValue, "_active", translate("Started") )
++function active.cfgvalue(self, section)
++ local pid = sys.exec("%s | grep %s | grep openvpn | grep -v grep | awk '{print $1}'" % { psstring,section} )
++ if pid and #pid > 0 and tonumber(pid) ~= nil then
++ return (sys.process.signal(pid, 0))
++ and translatef("yes (%i)", pid)
++ or translate("no")
++ end
++ return translate("no")
++end
++
++local updown = s:option( Button, "_updown", translate("Start/Stop") )
++updown._state = false
++updown.redirect = luci.dispatcher.build_url(
++ "admin", "services", "openvpn"
++)
++function updown.cbid(self, section)
++ local pid = sys.exec("%s | grep %s | grep openvpn | grep -v grep | awk '{print $1}'" % { psstring,section} )
++ self._state = pid and #pid > 0 and sys.process.signal(pid, 0)
++ self.option = self._state and "stop" or "start"
++ return AbstractValue.cbid(self, section)
++end
++function updown.cfgvalue(self, section)
++ self.title = self._state and "stop" or "start"
++ self.inputstyle = self._state and "reset" or "reload"
++end
++function updown.write(self, section, value)
++ if self.option == "stop" then
++ local pid = sys.exec("%s | grep %s | grep openvpn | grep -v grep | awk '{print $1}'" % { psstring,section} )
++ sys.process.signal(pid,15)
++ else
++ luci.sys.call("/etc/init.d/openvpn start %s" % section)
++ end
++ luci.http.redirect( self.redirect )
++end
++
++
++local port = s:option( DummyValue, "port", translate("Port") )
++function port.cfgvalue(self, section)
++ local val = AbstractValue.cfgvalue(self, section)
++ return val or "1194"
++end
++
++local proto = s:option( DummyValue, "proto", translate("Protocol") )
++function proto.cfgvalue(self, section)
++ local val = AbstractValue.cfgvalue(self, section)
++ return val or "udp"
++end
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm b/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm
+new file mode 100644
+index 0000000..0166de7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm
+@@ -0,0 +1,11 @@
++<div class="cbi-section-create">
++ <% if self.invalid_cts then -%><div class="cbi-section-error"><% end %>
++ <input type="text" class="cbi-section-create-name" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.text" />
++ <select class="cbi-section-create-name" name="cbi.cts.<%=self.config%>.<%=self.sectiontype%>.select">
++ <%- for k, v in luci.util.kspairs(self.add_select_options) do %>
++ <option value="<%=k%>"><%=luci.util.pcdata(v)%></option>
++ <% end -%>
++ </select>
++ <input class="cbi-button cbi-button-add" type="submit" value="<%:Add%>" title="<%:Add%>" />
++ <% if self.invalid_cts then %><br /><%:Invalid%></div><% end %>
++</div>
+diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm b/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm
+new file mode 100644
+index 0000000..f22cb68
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm
+@@ -0,0 +1,30 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<fieldset class="cbi-section">
++ <legend>
++ <a href="<%=url('admin/services/openvpn')%>"><%:Overview%></a> &raquo;
++ <%=luci.i18n.translatef("Instance \"%s\"", self.instance)%>
++ </legend>
++
++ <% if self.mode == "basic" then %>
++ <a href="<%=url('admin/services/openvpn/advanced', self.instance, "Service")%>"><%:Switch to advanced configuration »%></a>
++ <% else %>
++ <a href="<%=url('admin/services/openvpn/basic', self.instance)%>"><%:« Switch to basic configuration%></a>
++ <hr style="margin:0.5em 0" />
++ <%:Configuration category%>:
++ <% for i, c in ipairs(self.categories) do %>
++ <% if c == self.category then %>
++ <strong><%=translate(c)%></strong>
++ <% else %>
++ <a href="<%=luci.dispatcher.build_url(
++ "admin", "services", "openvpn", "advanced", self.instance, c
++ )%>"><%=translate(c)%></a>
++ <% end %>
++ <% if next(self.categories, i) then %>|<% end %>
++ <% end %>
++ <% end %>
++</fieldset>
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/ca/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/ca/openvpn.po
+new file mode 100644
+index 0000000..67de6b2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/ca/openvpn.po
+@@ -0,0 +1,546 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-08-07 20:41+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p', o 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr "Accepta opcions rebudes del servidor"
++
++msgid "Add"
++msgstr "Afegeix"
++
++msgid "Add route after establishing connection"
++msgstr "Afegeix ruta després d'establir connexió"
++
++msgid "Additional authentication over TLS"
++msgstr "Autenticació addicional sobre TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Permet tràfic client a client"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Permet múltiples clients amb el mateix certificat"
++
++msgid "Allow only one session"
++msgstr "Permet només una sessió"
++
++msgid "Allow remote to change its IP or port"
++msgstr "Permet al remot canviar la seva IP o port"
++
++msgid "Allowed maximum of connected clients"
++msgstr "Màxim de clients connectats pemès"
++
++msgid "Allowed maximum of internal"
++msgstr "Màxim permès d'interns"
++
++msgid "Allowed maximum of new connections"
++msgstr "Màxim de noves connexions permesès"
++
++msgid "Append log to file"
++msgstr "Afegeix el registre al fitxer"
++
++msgid "Authenticate using username/password"
++msgstr "Autentica utilitzant nom d'usuari/contrasenya"
++
++msgid "Automatically redirect default route"
++msgstr "Readreça automàticament la ruta per defecte"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++"A sota hi ha una llista d'instàncies OpenVPN configurades i el seu estat "
++"actual"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++"Crida l'script/comanda de desactivació abans de tancar el dispositiu TUN/TAP"
++
++msgid "Certificate authority"
++msgstr "Autoritat de certificat"
++
++msgid "Change process priority"
++msgstr "Canvia la prioritat del procés"
++
++msgid "Change to directory before initialization"
++msgstr "Canvia el directori abans de la inicialització"
++
++msgid "Check peer certificate against a CRL"
++msgstr "Comprova el certificat de peer contra un CRL"
++
++msgid "Chroot to directory after initialization"
++msgstr "Chroot al directori després de la inicialització"
++
++msgid "Client is disabled"
++msgstr "El client està inhabilitat"
++
++msgid "Configuration category"
++msgstr "Categoria de configuració"
++
++msgid "Configure client mode"
++msgstr "Configura el mode client"
++
++msgid "Configure server bridge"
++msgstr "Configura el pont de servidor"
++
++msgid "Configure server mode"
++msgstr "Configura el mode servidor"
++
++msgid "Connect through Socks5 proxy"
++msgstr "Connecta't a través un proxy Socks5"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr "Connecta al host remot a través d'un intermediari HTTP"
++
++msgid "Connection retry interval"
++msgstr "Interval de reintent de connexió"
++
++msgid "Daemonize after initialization"
++msgstr "Dimonitza després d'inicialitzar"
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr "Retarda l'obertura tun/tap i l'execució d'script d'activació"
++
++msgid "Diffie Hellman parameters"
++msgstr "Paràmetres Diffie-Hellman"
++
++msgid "Directory for custom client config files"
++msgstr "Directori per fitxers de configuració de client personalitzats"
++
++msgid "Disable Paging"
++msgstr "Desactiva Paging"
++
++msgid "Disable cipher initialisation vector"
++msgstr "Desactiva xifratge de vector d'inicialització"
++
++msgid "Disable options consistency check"
++msgstr "Desactiva la comprovació de consistència d'opcions"
++
++msgid "Disable replay protection"
++msgstr "Desactiva la protecció de reproducció"
++
++msgid "Do not bind to local address and port"
++msgstr "No vinculis a adreça i port locals"
++
++msgid "Don't actually execute ifconfig"
++msgstr "No executis ifconfig"
++
++msgid "Don't add routes automatically"
++msgstr "No afegeixis rutes automàticament"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr "No desis a la memòria cau contrasenyes --askpass o --auth-user-pass"
++
++msgid "Don't inherit global push options"
++msgstr "No heretis les opcions globals enviades pel servidor"
++
++msgid "Don't log timestamps"
++msgstr "No registris les marques horàries"
++
++msgid "Don't re-read key on restart"
++msgstr "No rellegeixis la clau al reiniciar"
++
++msgid "Don't require client certificate"
++msgstr "No requereixis el certificat de client"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "No utilitzis compressió adaptativa LZO"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr "No alertis d'inconsistències ifconfig"
++
++msgid "Echo parameters to log"
++msgstr "Escriu els paràmetres al registre"
++
++msgid "Empirically measure MTU"
++msgstr "Mesura empíricament l'MTU"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "Habilita els motors criptogràfics de maquinari del OpenSSL"
++
++msgid "Enable Path MTU discovery"
++msgstr "Habilita el descobriment de ruta MTU"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr "Activa el mode d'encriptació de Clau Estàtica (no-TLS)"
++
++msgid "Enable TLS and assume client role"
++msgstr "Activa el TLS i assumeix el rol de client"
++
++msgid "Enable TLS and assume server role"
++msgstr "Activa el TLS i assumeix el rol de servidor"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Activa la fragmentació de datagrames interna"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr "Activa la interfície de gestió a <em>IP</em> <em>port</em>"
++
++msgid "Enabled"
++msgstr "Activat"
++
++msgid "Encryption cipher for packets"
++msgstr "Xifra d'encriptació per paquets"
++
++msgid "Execute shell cmd after routes are added"
++msgstr "Executa comanda després d'afegir les rutes"
++
++msgid "Execute shell command on remote ip change"
++msgstr "Executa una ordre de consola quan hi hagi un canvi d'IP remot"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr "Surt en fallar la negociació TLS"
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr "Aconsegueix contrasenya PEM de controlar tty abans de dimonitzar"
++
++msgid "HMAC authentication for packets"
++msgstr "Autenticació HMAC per paquets"
++
++msgid "Handling of authentication failures"
++msgstr "Gestió de fallades d'autenticació"
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr "Si la resolució del nom de màquina falla, reintenta-ho"
++
++msgid "Instance \"%s\""
++msgstr "Instància \"%s\""
++
++msgid "Invalid"
++msgstr "Invàlid"
++
++msgid "Keep local IP address on restart"
++msgstr "Mantingues l'adreça IP local al reiniciar"
++
++msgid "Keep remote IP address on restart"
++msgstr "Mantingues l'adreça IP remota al reiniciar"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "Mantingues el dispositiu tun/tap obert al reiniciar"
++
++msgid "Key transition window"
++msgstr "Finestra de transició de clau"
++
++msgid "Limit repeated log messages"
++msgstr "Limita els missatges de registre repetits"
++
++msgid "Local certificate"
++msgstr "Certificat local"
++
++msgid "Local host name or ip address"
++msgstr "Nom de màquina local o adreça IP"
++
++msgid "Local private key"
++msgstr "Clau privada local"
++
++msgid "Major mode"
++msgstr "Mode major"
++
++msgid "Make tun device IPv6 capable"
++msgstr "Fes que el dispositiu tun sigui apte per IPv6"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "Número màxim de paquets TCP encuats a la sortida"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "Número de memòries intermèdies de difusió assignades"
++
++msgid "Number of lines for log file history"
++msgstr "Número de línies per historial de fitxer de registre"
++
++msgid "Only accept connections from given X509 name"
++msgstr "Accepta connexions només d'un cert nom X509"
++
++msgid "Only process ping timeouts if routes exist"
++msgstr "Processa l'excés de temps d'espera de pings remots si la ruta existeix"
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "Instàncies OpenVPN"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "Optimitza les escriptures TUN/TAP/UDP"
++
++msgid "Output to syslog and do not daemonize"
++msgstr "Sortida al syslog i no dimonitzis"
++
++msgid "Overview"
++msgstr "Visió de conjunt"
++
++msgid "PKCS#12 file containing keys"
++msgstr "Fitxer PKCS#12 contenidor de claus"
++
++msgid "Pass environment variables to script"
++msgstr "Passa les variables d'ambient a l'script"
++
++msgid "Persist replay-protection state"
++msgstr "Persisteix l'estat de protecció de reproducció"
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr "Persisteix/deixa de persistir ifconfig-pool"
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr "Ping remot cada n segons sobre port TCP/UDP"
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Proxy timeout in seconds"
++msgstr "Temps d'espera màxim de proxy en segons"
++
++msgid "Push an ifconfig option to remote"
++msgstr "Envia una opció ifconfig al remot"
++
++msgid "Push options to peer"
++msgstr "Envia opcions al peer"
++
++msgid "Query management channel for private key"
++msgstr "Consulta el canal de gestió per una clau privada"
++
++msgid "Randomly choose remote server"
++msgstr "Tria aleatòriament el servidor remot"
++
++msgid "Refuse connection if no custom client config"
++msgstr "Refusa la connexió si no hi ha configuració de client personalitzada"
++
++msgid "Remap SIGUSR1 signals"
++msgstr "Remapeja senyals SIGUSR1"
++
++msgid "Remote host name or ip address"
++msgstr "Nom de màquina remot o adreça IP"
++
++msgid "Remote ping timeout"
++msgstr "Temps d'espera màxim de ping remot"
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr "Renegocia clau de canal de dades després de bytes"
++
++msgid "Renegotiate data chan. key after packets"
++msgstr "Renegocia clau de canal de dades després de paquets"
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr "Renegocia clau de canal de dades després de segons"
++
++msgid "Replay protection sliding window size"
++msgstr "Mida de la finestra lliscant de protecció de reproducció"
++
++msgid "Require explicit designation on certificate"
++msgstr "Requereix una designació explícita al certificat"
++
++msgid "Require explicit key usage on certificate"
++msgstr "Requereix ús de clau explícit al certificat"
++
++msgid "Restart after remote ping timeout"
++msgstr "Reinicia després d'excedir el temps d'espera de ping remot"
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr "Temps d'espera de retransmissió en canal de control TLS"
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "Reintenta indefinidament en errors de proxy HTTP"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr "Reintenta indefinidament en errors de proxy Socks"
++
++msgid "Route subnet to client"
++msgstr "Enruta subxarxa al client"
++
++msgid "Run as an inetd or xinetd server"
++msgstr "Executa com un servidor inetd o xinetd"
++
++msgid "Run script cmd on client connection"
++msgstr "Executa l'script en connectar-se el client"
++
++msgid "Run script cmd on client disconnection"
++msgstr "Executa l'script en desconnectar-te el client"
++
++msgid "Run up/down scripts for all restarts"
++msgstr "Executa els scripts d'activació/desactivació per tots els reinicis."
++
++msgid "Send notification to peer on disconnect"
++msgstr "Envia notificació al peer en desconnectar-se"
++
++msgid "Set GID to group"
++msgstr "Estableix el GID al grup"
++
++msgid "Set TCP/UDP MTU"
++msgstr "Estableix la MTU de TCP/UDP"
++
++msgid "Set UID to user"
++msgstr "Estableix l'UID per l'usuari"
++
++msgid "Set aside a pool of subnets"
++msgstr "Deixa de banda un conjunt de subxarxes"
++
++msgid "Set extended HTTP proxy options"
++msgstr "Estableix les opcions de proxy HTTP exteses"
++
++msgid "Set output verbosity"
++msgstr "Estableix el detall de sortida"
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++"Estableix la mida de les taules de dispersió d'adreces reals i virtuals"
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "Estableix la mida de memòria intermèdia de recepció TCP/UDP"
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr "Estableix la mida de memòria intermèdia d'enviament TCP/UDP"
++
++msgid "Set tun/tap TX queue length"
++msgstr "Estableix la mida de cua TX de tun/tap"
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr "Estableix la MTU del dispositiu tun/tap"
++
++msgid "Set tun/tap device overhead"
++msgstr "Estableix la càrrega (overhead) del dispositiu tun/tap"
++
++msgid "Set upper bound on TCP MSS"
++msgstr "Estableix el límit superior al TCP MSS"
++
++msgid "Shaping for peer bandwidth"
++msgstr "Configuració d'ample de banda d'un peer"
++
++msgid "Shell cmd to execute after tun device open"
++msgstr "Ordre a executar després que s'obri un dispositiu tun"
++
++msgid "Shell cmd to run after tun device close"
++msgstr "Ordre a executar després que es tanqui un dispositiu tun"
++
++msgid "Shell command to verify X509 name"
++msgstr "Ordre de comanda per verificar el nom X509"
++
++msgid "Silence the output of replay warnings"
++msgstr "Silencia la sortida d'alertes de reproducció"
++
++msgid "Size of cipher key"
++msgstr "Mida de la clau de xifratge"
++
++msgid "Specify a default gateway for routes"
++msgstr "Especifica una passarel·la per defecte per rutes"
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr "Inicia l'OpenVPN en un estat d'hivernació"
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr "Iniciat"
++
++msgid "Status file format version"
++msgstr "Versió de format de fitxer d'estat"
++
++msgid "Switch to advanced configuration »"
++msgstr "Canvia a configuració avançada"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "Port TCP/UDP tan per local com per remot"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "Port TCP/UDP per local (defecte=1194)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "Port TCP/UDP per remot (defecte=1194)"
++
++msgid "TLS cipher"
++msgstr "Xifrador TLS"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr "Pas TOS (aplica només a IPv4)"
++
++msgid "Temporary directory for client-connect return file"
++msgstr "Directori temporal pel fitxer de retorn per la connexió de client"
++
++msgid "Timeframe for key exchange"
++msgstr "Calendari per intercanvi de claus"
++
++msgid "Type of used device"
++msgstr "Tipus de dispositiu utilitzat"
++
++msgid "Use fast LZO compression"
++msgstr "Utilitza compressió ràpida LZO"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "Utilitza adreces individuals en comptes de subxarxes /30"
++
++msgid "Use protocol"
++msgstr "Utilitza protocol"
++
++msgid "Use tun/tap device node"
++msgstr "Utilitza un node de dispositiu tun/tap"
++
++msgid "Use username as common name"
++msgstr "Utilitza el nom d'usuari com a nom comú"
++
++msgid "Write log to file"
++msgstr "Escriu registre al fitxer"
++
++msgid "Write process ID to file"
++msgstr "Escriu l'ID del procés al fitxer"
++
++msgid "Write status to file every n seconds"
++msgstr "Escriu l'estat al fitxer cada n segons"
++
++msgid "no"
++msgstr "no"
++
++msgid "tun/tap device"
++msgstr "dispositiu tun/tap"
++
++msgid "tun/tap inactivity timeout"
++msgstr "temps d'espera màxim d'inactivitat tun/tap"
++
++msgid "yes (%i)"
++msgstr "sí (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "Canvia a configuració bàsica"
++
++#~ msgid "Cryptography"
++#~ msgstr "Criptografia"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/cs/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/cs/openvpn.po
+new file mode 100644
+index 0000000..c5ed42d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/cs/openvpn.po
+@@ -0,0 +1,546 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-12 19:47+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p', nebo 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr "Přijmout nastavení, přijatá ze serveru"
++
++msgid "Add"
++msgstr "Přidat"
++
++msgid "Add route after establishing connection"
++msgstr "Přidat trasu po navázání spojení"
++
++msgid "Additional authentication over TLS"
++msgstr "DodateÄné ověření pÅ™es TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Povolit provoz typu klient-klient"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Povolit více klientů se stejným certifikátem"
++
++msgid "Allow only one session"
++msgstr "Povolit pouze jedno sezení"
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr "Maximální povolené množství připojených klientů"
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr "Maximální povolené množství nových připojení"
++
++msgid "Append log to file"
++msgstr "Připojit log do souboru"
++
++msgid "Authenticate using username/password"
++msgstr "Ověřit prostřednictvím uživatelského jména / hesla"
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr "CertifikaÄní autorita"
++
++msgid "Change process priority"
++msgstr "Změnit prioritu procesu"
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr "Klient je zakázáný"
++
++msgid "Configuration category"
++msgstr "Konfigurace kategorie"
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr "Parametry Diffie Hellman"
++
++msgid "Directory for custom client config files"
++msgstr "Adresář s uživatelskými konfiguraÄními soubory"
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "Povolit hardwarovou akceleraci OpenSSL"
++
++msgid "Enable Path MTU discovery"
++msgstr "Povolit Path MTU discovery (PMTUD)"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr "Povolit TLS a převzít roli klienta"
++
++msgid "Enable TLS and assume server role"
++msgstr "Povolit TLS a převzít roli serveru"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Povolit interní fragmentaci datagramů"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr "Povoleno"
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr "Instance \"%s\""
++
++msgid "Invalid"
++msgstr "Neplatné"
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr "Lokální certifikát"
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr "Lokální soukromý klíÄ"
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "OpenVPN instance"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr "Přehled"
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol"
++msgstr "Protokol"
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr "Spustit skript cmd pro připojení klienta"
++
++msgid "Run script cmd on client disconnection"
++msgstr "Spustit skript cmd pro odpojení klienta"
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr "Velikost Å¡ifrovacího klíÄe"
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr "Start/Stop"
++
++msgid "Started"
++msgstr "Spuštěno"
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr "PÅ™epnout na pokroÄilou konfiguraci »"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr "TLS Å¡ifra"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr "ne"
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr "ano (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "« Přepnout na základní konfiguraci"
++
++#~ msgid "Cryptography"
++#~ msgstr "Šifrování"
++
++#~ msgid "Service"
++#~ msgstr "Služba"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/de/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/de/openvpn.po
+new file mode 100644
+index 0000000..e6cfdae
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/de/openvpn.po
+@@ -0,0 +1,560 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2013-01-28 22:15+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "Topologietyp"
++
++msgid "Accept options pushed from server"
++msgstr "Vom Server übertragene Optionen lokal akzeptieren"
++
++msgid "Add"
++msgstr "Hinzufügen"
++
++msgid "Add route after establishing connection"
++msgstr "Netzwerkrouten nach Verbindungsaufbau einrichten"
++
++msgid "Additional authentication over TLS"
++msgstr "Erweiterte Authentifikation über TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Netzwerkverkehr zwischen Teilnehmern zulassen"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Mehrere Teilnehmer mit selbem Zertifikat erlauben"
++
++msgid "Allow only one session"
++msgstr "Nur eine einzige Verbindung zulassen"
++
++msgid "Allow remote to change its IP or port"
++msgstr "Address- und Port-Änderungen der Gegenstelle zulassen"
++
++msgid "Allowed maximum of connected clients"
++msgstr "Betriebsmodus"
++
++msgid "Allowed maximum of internal"
++msgstr "Maximal erlaubte Anzahl an Netzwerkrouten pro Teilnehmer"
++
++msgid "Allowed maximum of new connections"
++msgstr "Wiederholrate für Verbindungversuche"
++
++msgid "Append log to file"
++msgstr "An Protokolldatei anfügen"
++
++msgid "Authenticate using username/password"
++msgstr "Authentifikation mittels Benutzername und Passwort"
++
++msgid "Automatically redirect default route"
++msgstr "Automatisch die Standard-Route umleiten"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr "Liste der konfigurierten OpenVPN Instanzen und ihr momentaner Status"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++"Shell-Kommando <em>vor</em> Deaktivierung der TUN/TAP Schnittstelle ausführen"
++
++msgid "Certificate authority"
++msgstr "Zertifikat der Zertifizierungsstelle"
++
++msgid "Change process priority"
++msgstr "Prozess-Priorität anpassen"
++
++msgid "Change to directory before initialization"
++msgstr "<em>Vor</em> der Initialisierung in Verzeichnis wechseln"
++
++msgid "Check peer certificate against a CRL"
++msgstr "Teilnehmerzertifikat mit Sperrliste abgleichen"
++
++msgid "Chroot to directory after initialization"
++msgstr "<em>Nach</em> der Initialisierung in Verzeichnis wechseln"
++
++msgid "Client is disabled"
++msgstr "Teilnehmer-Konto deaktivieren"
++
++msgid "Configuration category"
++msgstr "Kategorie"
++
++msgid "Configure client mode"
++msgstr "Clientmodus"
++
++msgid "Configure server bridge"
++msgstr "Server-zu-Server Netzwerkbrücke"
++
++msgid "Configure server mode"
++msgstr "Server-Modus"
++
++msgid "Connect through Socks5 proxy"
++msgstr "Verbindung über einen Socks 5 - Proxy"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr "Verbindung zum entfernten Rechner über HTTP-Proxy aufbauen"
++
++msgid "Connection retry interval"
++msgstr "Wiederholrate für Verbindungversuche"
++
++msgid "Daemonize after initialization"
++msgstr "Nach der Initialisierung als Hintergrundprozess ausführen"
++
++msgid "Delay n seconds after connection"
++msgstr "Nach dem Verbindungsaufbau um n Sekunden verzögern"
++
++msgid "Delay tun/tap open and up script execution"
++msgstr "Shell-Kommando nach Schnittstelleneinrichtung verzögern"
++
++msgid "Diffie Hellman parameters"
++msgstr "Diffie-Hellman-Parameter"
++
++msgid "Directory for custom client config files"
++msgstr "Verzeichnis für eigene Konfigurationsdateien"
++
++msgid "Disable Paging"
++msgstr "Benutzten Arbeitsspeicher sperren"
++
++msgid "Disable cipher initialisation vector"
++msgstr "Initialisierungsvektor für Verschlüsselung deaktivieren"
++
++msgid "Disable options consistency check"
++msgstr "Konsistenzprüfungen für Optionen durchführen"
++
++msgid "Disable replay protection"
++msgstr "\"Replay\"-Schutz deaktivieren"
++
++msgid "Do not bind to local address and port"
++msgstr "An keine spezielle Adresse binden"
++
++msgid "Don't actually execute ifconfig"
++msgstr "Schnittstellenkonfiguration nicht durchführen"
++
++msgid "Don't add routes automatically"
++msgstr "Netzwerkrouten nicht automatisch einrichten"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr "Authentifikationsdaten nicht zwischenspeichern"
++
++msgid "Don't inherit global push options"
++msgstr "Nur teilnehmerspezifische Optionen übertragen"
++
++msgid "Don't log timestamps"
++msgstr "Keine Zeitangaben protokollieren"
++
++msgid "Don't re-read key on restart"
++msgstr "Schlüssel bei Neustarts beibehalten"
++
++msgid "Don't require client certificate"
++msgstr "Verbindung ohne Teilnehmerzertifikat erlauben"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "Adaptive LZO-Kompression deaktivieren"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr "Keine Warnung bei inkonsistenter Schnittstellenkonfiguration"
++
++msgid "Echo parameters to log"
++msgstr "Parameter in Protokolldatei speichern"
++
++msgid "Empirically measure MTU"
++msgstr "MTU regelmäßig testen"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "OpenSSL-Unterstützung für Kryptographie-Hardware benutzen"
++
++msgid "Enable Path MTU discovery"
++msgstr "MTU-Erkennung aktivieren"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr "Verschlüsselung mittels statischer Schlüssel (kein TLS)"
++
++msgid "Enable TLS and assume client role"
++msgstr "TLS im Client-Betriebsmodus aktivieren"
++
++msgid "Enable TLS and assume server role"
++msgstr "TLS im Server-Betriebsmodus aktivieren"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Datenpakete bei Bedarf fragmentieren"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr "Administratorschnittstelle aktivieren"
++
++msgid "Enabled"
++msgstr "Einschalten"
++
++msgid "Encryption cipher for packets"
++msgstr "Verschlüsselungsalgorithmus für Pakete"
++
++msgid "Execute shell cmd after routes are added"
++msgstr "Shell-Befehl nach Routen-Einrichtung ausführen"
++
++msgid "Execute shell command on remote ip change"
++msgstr "Programm bei Adressänderung der Gegenstelle aufrufen"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++"Wird bei neuen Client-Verbindungen im Servermodus ausgeführt, wenn dem "
++"Clienten noch nicht vertraut wird"
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++"Wird im Servermodus ausgeführt, wann immer eine IPv4-Adresse/Route oder MAC-"
++"Adresse zur internen Routingtabelle von OpenVPN hinzugefügt wird"
++
++msgid "Exit on TLS negotiation failure"
++msgstr "Terminieren nach fehlgeschlagenem Schlüsselaustausch"
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr "PEM-Passwort von Konsole abfragen"
++
++msgid "HMAC authentication for packets"
++msgstr "HMAC-Authentifizierung für Pakete"
++
++msgid "Handling of authentication failures"
++msgstr "Behandlung von Authentifikationsfehlern"
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++"Helfer-Direktive, um den Ausdruck von --ping und --ping-restart in "
++"Servermodus-Konfigurationen zu vereinfachen"
++
++msgid "If hostname resolve fails, retry"
++msgstr "Neuer Verbindungsversuch wenn Namensauflösung fehlschlägt"
++
++msgid "Instance \"%s\""
++msgstr "Instanz \"%s\""
++
++msgid "Invalid"
++msgstr "Ungültig"
++
++msgid "Keep local IP address on restart"
++msgstr "Lokale IP-Adresse bei Neustarts beibehalten"
++
++msgid "Keep remote IP address on restart"
++msgstr "IP-Adresse der Gegenstelle bei Neustarts beibehalten"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "TUN/TAP Schnittelle bei Neustarts offen halten"
++
++msgid "Key transition window"
++msgstr "Maximaler Zeitraum für Schlüsselwechsel"
++
++msgid "Limit repeated log messages"
++msgstr "Wiederholende Protokollmeldungen unterdrücken"
++
++msgid "Local certificate"
++msgstr "Lokales Zertifikat"
++
++msgid "Local host name or ip address"
++msgstr "Lokaler Rechnername oder IP Adresse"
++
++msgid "Local private key"
++msgstr "Lokaler privater Schlüssel"
++
++msgid "Major mode"
++msgstr "Betriebsmodus"
++
++msgid "Make tun device IPv6 capable"
++msgstr "IPv6 auf TUN Schnittstellen aktivieren"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "Maximale Anzahl an TCP-Paketen in der Warteschlange"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "Anzahl der benutzten Broadcast-Puffer"
++
++msgid "Number of lines for log file history"
++msgstr "Anzahl der Zeilen im Protokoll-Zwischenspeicher"
++
++msgid "Only accept connections from given X509 name"
++msgstr "Nur Verbindungen vom angegebenem X.509 Name zulassen"
++
++msgid "Only process ping timeouts if routes exist"
++msgstr "Ping-Timeouts nur bei vorhandenen Routen auslösen"
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "OpenVPN Instanzen"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "TUN-, TAP- und UDP-Schreibvorgänge optimieren"
++
++msgid "Output to syslog and do not daemonize"
++msgstr "Ausgaben ins Systemprotokoll umleiten und im Vordergrund ausführen"
++
++msgid "Overview"
++msgstr "Ãœbersicht"
++
++msgid "PKCS#12 file containing keys"
++msgstr "PKCS#12 Schlüsselarchiv"
++
++msgid "Pass environment variables to script"
++msgstr "Umgebungsvariablen für Shell-Befehle"
++
++msgid "Persist replay-protection state"
++msgstr "Persistenter Status für \"Replay\"-Schutz"
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr "Persistenten IP-Adressbereich nutzen"
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr "Ping-Intervall für Gegenstellen"
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr "Policy-Ebene über Nutzung von externen Programmen und Skripten"
++
++msgid "Port"
++msgstr "Netzwerkport"
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "Proxy timeout in seconds"
++msgstr "Maximaler Timeout für Proxy-Verbindungen"
++
++msgid "Push an ifconfig option to remote"
++msgstr "IP-Adresskonfiguration an Teilnehmer übertragen"
++
++msgid "Push options to peer"
++msgstr "Optionen an Teilnehmer übertragen"
++
++msgid "Query management channel for private key"
++msgstr "Privaten Schlüssel über Management-Kanal abfragen"
++
++msgid "Randomly choose remote server"
++msgstr "Entfernten Server zufällig wählen"
++
++msgid "Refuse connection if no custom client config"
++msgstr "Teilnehmer-Verbindung verweigern wenn Teilnehmer-Konfiguration fehlt"
++
++msgid "Remap SIGUSR1 signals"
++msgstr "\"USR1\" Systemsignal umleiten"
++
++msgid "Remote host name or ip address"
++msgstr "Entfernter Rechnername oder IP-Adresse"
++
++msgid "Remote ping timeout"
++msgstr "Ping-Timeout für Gegenstellen"
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr "Schlüssel nach maximale Verkehrsmenge neu aushandeln"
++
++msgid "Renegotiate data chan. key after packets"
++msgstr "Schlüssel nach maximaler Anzahl von Paketen neu aushandeln"
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr "Schlüssel nach maximaler Verbindungsdauer neu aushandeln"
++
++msgid "Replay protection sliding window size"
++msgstr "Fenstergröße für \"Replay\"-Schutz"
++
++msgid "Require explicit designation on certificate"
++msgstr "Verwendungszweck von Zertifikaten überprüfen"
++
++msgid "Require explicit key usage on certificate"
++msgstr "Zertifikat explizit auf einfachen Verwendungszweck prüfen"
++
++msgid "Restart after remote ping timeout"
++msgstr "Neu Starten nach Ping-Timeout an Gegenstellen"
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr "TLS Timeout"
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "Neue Verbindung bei Proxy-Fehlern aufbauen"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr "Neue Verbindung bei Proxy-Fehlern aufbauen"
++
++msgid "Route subnet to client"
++msgstr "Subnetz an Teilnehmer routen"
++
++msgid "Run as an inetd or xinetd server"
++msgstr "Als <em>inetd</em> oder <em>xinetd</em> Server laufen"
++
++msgid "Run script cmd on client connection"
++msgstr "Shell-Kommando bei neuer Teilnehmer-Verbindung ausführen"
++
++msgid "Run script cmd on client disconnection"
++msgstr "Shell-Kommando beim Trennen von Teilnehmer-Verbindungen ausführen"
++
++msgid "Run up/down scripts for all restarts"
++msgstr "Shell-Kommandos bei jedem Neustart ausführen"
++
++msgid "Send notification to peer on disconnect"
++msgstr "Teilnehmer über Verbindungstrennung informieren"
++
++msgid "Set GID to group"
++msgstr "Dienst mit Benutzergruppe laufen lassen"
++
++msgid "Set TCP/UDP MTU"
++msgstr "MTU für TCP/UDP Protokoll festlegen"
++
++msgid "Set UID to user"
++msgstr "Dienst als Benutzer laufen lassen"
++
++msgid "Set aside a pool of subnets"
++msgstr "IP-Adressbereich für zu vergebende Subnetze"
++
++msgid "Set extended HTTP proxy options"
++msgstr "Erweiterte HTTP-Proxy Einstellungen vornehmen"
++
++msgid "Set output verbosity"
++msgstr "Detailstufe für Protokolle"
++
++msgid "Set size of real and virtual address hash tables"
++msgstr "Größe für interne Adresstabellen"
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "Größe des TCP/UDP Empfangs-Puffers"
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr "Größe des TCP/UDP Sende-Puffers"
++
++msgid "Set tun/tap TX queue length"
++msgstr "Größe der Sende-Warteschlange"
++
++msgid "Set tun/tap adapter parameters"
++msgstr "Tun/Tap parameter einstellen"
++
++msgid "Set tun/tap device MTU"
++msgstr "MTU für TUN/TAP Schnittstelle festlegen"
++
++msgid "Set tun/tap device overhead"
++msgstr "Overhead für TUN/TAP Schnittstelle festlegen"
++
++msgid "Set upper bound on TCP MSS"
++msgstr "Maximale TCP-MSS erzwingen"
++
++msgid "Shaping for peer bandwidth"
++msgstr "Verbindungsrate von Gegenstellen limitieren"
++
++msgid "Shell cmd to execute after tun device open"
++msgstr "Shell-Kommando nach Einrichtung von TUN/TAP Schnittstelle ausführen"
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++"Shell-Kommando <em>nach</em> Deaktivierung der TUN/TAP Schnittstelle "
++"ausführen"
++
++msgid "Shell command to verify X509 name"
++msgstr "Shell-Kommando zum Überprüfen das X.509 Namens"
++
++msgid "Silence the output of replay warnings"
++msgstr "\"Replay\"-Warnungen unterdrücken"
++
++msgid "Size of cipher key"
++msgstr "Größe des Schlüssels"
++
++msgid "Specify a default gateway for routes"
++msgstr "Standard-Gateway für Netzwerkrouten"
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr "OpenVPN im Schlafmodus starten"
++
++msgid "Start/Stop"
++msgstr "Start/Stopp"
++
++msgid "Started"
++msgstr "Gestartet"
++
++msgid "Status file format version"
++msgstr "Format für Status-Datei"
++
++msgid "Switch to advanced configuration »"
++msgstr "Erweiterte Einstellungen"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "Benutzter TCP oder UDP Port"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "Lokaler TCP oder UDP Port"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "TCP oder UDP Port der Gegenstelle"
++
++msgid "TLS cipher"
++msgstr "TLS Verschlüsselungsalgorithmus"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr "\"TOS\" Durchleitung (nur für IPv4)"
++
++msgid "Temporary directory for client-connect return file"
++msgstr "Temporäres Verzeichnis für Teilnehmer-Verbindungen"
++
++msgid "Timeframe for key exchange"
++msgstr "Maximaler Zeitraum für Schlüsselaustausch"
++
++msgid "Type of used device"
++msgstr "Schnittstellentyp"
++
++msgid "Use fast LZO compression"
++msgstr "Schnelle LZO-Kompression benutzen"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "Einzeladressen statt /30 Subnetze vergeben"
++
++msgid "Use protocol"
++msgstr "Netzwerkprotokoll"
++
++msgid "Use tun/tap device node"
++msgstr "TUN/TAP Gerätedatei"
++
++msgid "Use username as common name"
++msgstr "Benutzernamen als Common-Name benutzen"
++
++msgid "Write log to file"
++msgstr "In Protokolldatei schreiben"
++
++msgid "Write process ID to file"
++msgstr "Prozess-Nummer in Datei schreiben"
++
++msgid "Write status to file every n seconds"
++msgstr "Status-Datei schreiben"
++
++msgid "no"
++msgstr "Nicht gestartet"
++
++msgid "tun/tap device"
++msgstr "TUN/TAP Schnittstelle"
++
++msgid "tun/tap inactivity timeout"
++msgstr "Inaktivitäts-Timeout für TUN/TAP Schnittstellen"
++
++msgid "yes (%i)"
++msgstr "Gestartet (%s)"
++
++msgid "« Switch to basic configuration"
++msgstr "« Zur vereinfachten Konfiguration wechseln"
++
++#~ msgid "Cryptography"
++#~ msgstr "Kryptographie"
++
++#~ msgid "Networking"
++#~ msgstr "Netzwerk"
++
++#~ msgid "Service"
++#~ msgstr "Dienst"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/el/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/el/openvpn.po
+new file mode 100644
+index 0000000..c5368d7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/el/openvpn.po
+@@ -0,0 +1,557 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-28 02:08+0200\n"
++"PO-Revision-Date: 2012-03-18 15:23+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr "ΠÏοσθήκη"
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr ""
++
++msgid "Allow multiple clients with same certificate"
++msgstr ""
++
++msgid "Allow only one session"
++msgstr ""
++
++msgid "Allow remote to change its IP or port"
++msgstr "ΕπιτÏέπουμε στον απομακÏυσμένο να αλλάξει την IP ή τη θÏÏα"
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++"ΠαÏακάτω είναι μία λίστα των Ïυθμισμένων πεÏιστατικών OpenVPN και της "
++"Ï„Ïέχουσας κατάστασής τους"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr "ΣÏνδεση μέσω διαμεσολαβητή Socks5"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr "Διάστημα επαναπÏοσπάθειας σÏνδεσης"
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr "Μη συνδέσεις σε τοπική διεÏθυνση και θÏÏα"
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr ""
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr "ΕνεÏγοποιημένο"
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr "Εκτέλεση της εντολής κελÏφους στην αλλαγή IP του απομακÏυσμένου"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++"Αν αποτÏχει η μετατÏοπή του ονόματος του μηχανήματος σε IP, ξαναπÏοσπάθησε"
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr "Όνομα Ï„Î¿Ï€Î¹ÎºÎ¿Ï Î¼Î·Ï‡Î±Î½Î®Î¼Î±Ï„Î¿Ï‚ ή διεÏθυνση IP"
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "ΔιεÏγασίες OpenVPN"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr "ΘÏÏα"
++
++msgid "Protocol"
++msgstr "ΠÏωτόκολλο"
++
++msgid "Proxy timeout in seconds"
++msgstr "Τέλος χÏόνου μεσολαβητή σε δευτεÏόλεπτα"
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr "Τυχαία επιλογή απομακÏυσμένου διακομιστή"
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr "Όνομα απομακÏυσμένου μηχανήματος ή διεÏθυνση IP"
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "ΕπαναπÏοσπάθεια για πάντα αν υπάÏχουν λάθη HTTP στο μεσολαβητή"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr "ΕπαναπÏοσπάθεια για πάντα σε πεÏίπτωση λαθών στο διαμεσολαβητή Socks5"
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr "ΟÏισμός εκτεταμένων Ïυθμίσεων διαμεσολαβητή HTTP"
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr "Εκκίνηση/ΤεÏματισμός"
++
++msgid "Started"
++msgstr "Ξεκίνησε"
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr "Μετάβαση στις Ï€ÏοχωÏημένες Ïυθμίσεις »"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "TCP/UDP νοÏμεÏο θÏÏας για το τοπικό και το απομακÏυσμένο"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "TCP/UDP αÏιθμός θÏÏας για το τοπικό (εξ'οÏισμοÏ=1194)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "TCP/UDP αÏιθμός θÏÏας για τον απομακÏυσμένο (εξ'οÏισμοÏ=1194)"
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr "Είδος χÏησιμοποιοÏμενης συσκευής"
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr "όχι"
++
++msgid "tun/tap device"
++msgstr "Συσκευή tun/tap"
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr "ναι (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "« Μετάβαση στις βασικές επιλογές"
++
++#~ msgid "Cryptography"
++#~ msgstr "ΚÏυπτογÏαφία"
++
++#~ msgid "Service"
++#~ msgstr "ΥπηÏεσία"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
++
++#~ msgid "openvpn_%s"
++#~ msgstr "openvpn_%s"
++
++#~ msgid "openvpn_%s_desc"
++#~ msgstr "openvpn_%s_desc"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/en/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/en/openvpn.po
+new file mode 100644
+index 0000000..e8d8961
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/en/openvpn.po
+@@ -0,0 +1,540 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:35+0200\n"
++"PO-Revision-Date: 2012-04-03 08:45+0200\n"
++"Last-Translator: juhosg <juhosg@openwrt.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: en\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p', or 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr "Accept options pushed from server"
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr "Add route after establishing connection"
++
++msgid "Additional authentication over TLS"
++msgstr "Additional authentication over TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Allow client-to-client traffic"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Allow multiple clients with same certificate"
++
++msgid "Allow only one session"
++msgstr "Allow only one session"
++
++msgid "Allow remote to change its IP or port"
++msgstr "Allow remote to change its IP or port"
++
++msgid "Allowed maximum of connected clients"
++msgstr "Allowed maximum of connected clients"
++
++msgid "Allowed maximum of internal"
++msgstr "Allowed maximum of internal"
++
++msgid "Allowed maximum of new connections"
++msgstr "Allowed maximum of new connections"
++
++msgid "Append log to file"
++msgstr "Append log to file"
++
++msgid "Authenticate using username/password"
++msgstr "Authenticate using username/password"
++
++msgid "Automatically redirect default route"
++msgstr "Automatically redirect default route"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++"Below is a list of configured OpenVPN instances and their current state"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr "Call down cmd/script before TUN/TAP close"
++
++msgid "Certificate authority"
++msgstr "Certificate authority"
++
++msgid "Change process priority"
++msgstr "Change process priority"
++
++msgid "Change to directory before initialization"
++msgstr "Change to directory before initialization"
++
++msgid "Check peer certificate against a CRL"
++msgstr "Check peer certificate against a CRL"
++
++msgid "Chroot to directory after initialization"
++msgstr "Chroot to directory after initialization"
++
++msgid "Client is disabled"
++msgstr "Client is disabled"
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr "Configure client mode"
++
++msgid "Configure server bridge"
++msgstr "Configure server bridge"
++
++msgid "Configure server mode"
++msgstr "Configure server mode"
++
++msgid "Connect through Socks5 proxy"
++msgstr "Connect through Socks5 proxy"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr "Connection retry interval"
++
++msgid "Daemonize after initialization"
++msgstr "Daemonize after initialization"
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr "Delay tun/tap open and up script execution"
++
++msgid "Diffie Hellman parameters"
++msgstr "Diffie Hellman parameters"
++
++msgid "Directory for custom client config files"
++msgstr "Directory for custom client config files"
++
++msgid "Disable Paging"
++msgstr "Disable Paging"
++
++msgid "Disable cipher initialisation vector"
++msgstr "Disable cipher initialisation vector"
++
++msgid "Disable options consistency check"
++msgstr "Disable options consistency check"
++
++msgid "Disable replay protection"
++msgstr "Disable replay protection"
++
++msgid "Do not bind to local address and port"
++msgstr "Do not bind to local address and port"
++
++msgid "Don't actually execute ifconfig"
++msgstr "Don't actually execute ifconfig"
++
++msgid "Don't add routes automatically"
++msgstr "Don't add routes automatically"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr "Don't cache --askpass or --auth-user-pass passwords"
++
++msgid "Don't inherit global push options"
++msgstr "Don't inherit global push options"
++
++msgid "Don't log timestamps"
++msgstr "Don't log timestamps"
++
++msgid "Don't re-read key on restart"
++msgstr "Don't re-read key on restart"
++
++msgid "Don't require client certificate"
++msgstr "Don't require client certificate"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "Don't use adaptive lzo compression"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr "Don't warn on ifconfig inconsistencies"
++
++msgid "Echo parameters to log"
++msgstr "Echo parameters to log"
++
++msgid "Empirically measure MTU"
++msgstr "Empirically measure MTU"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "Enable OpenSSL hardware crypto engines"
++
++msgid "Enable Path MTU discovery"
++msgstr "Enable Path MTU discovery"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr "Enable Static Key encryption mode (non-TLS)"
++
++msgid "Enable TLS and assume client role"
++msgstr "Enable TLS and assume client role"
++
++msgid "Enable TLS and assume server role"
++msgstr "Enable TLS and assume server role"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Enable internal datagram fragmentation"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr "Enable management interface on <em>IP</em> <em>port</em>"
++
++msgid "Enabled"
++msgstr "Enabled"
++
++msgid "Encryption cipher for packets"
++msgstr "Encryption cipher for packets"
++
++msgid "Execute shell cmd after routes are added"
++msgstr "Execute shell cmd after routes are added"
++
++msgid "Execute shell command on remote ip change"
++msgstr "Execute shell command on remote ip change"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr "Exit on TLS negotiation failure"
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr "Get PEM password from controlling tty before we daemonize"
++
++msgid "HMAC authentication for packets"
++msgstr "HMAC authentication for packets"
++
++msgid "Handling of authentication failures"
++msgstr "Handling of authentication failures"
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr "If hostname resolve fails, retry"
++
++msgid "Instance \"%s\""
++msgstr "Instance \"%s\""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr "Keep local IP address on restart"
++
++msgid "Keep remote IP address on restart"
++msgstr "Keep remote IP address on restart"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "Keep tun/tap device open on restart"
++
++msgid "Key transition window"
++msgstr "Key transition window"
++
++msgid "Limit repeated log messages"
++msgstr "Limit repeated log messages"
++
++msgid "Local certificate"
++msgstr "Local certificate"
++
++msgid "Local host name or ip address"
++msgstr "Local host name or ip address"
++
++msgid "Local private key"
++msgstr "Local private key"
++
++msgid "Major mode"
++msgstr "Major mode"
++
++msgid "Make tun device IPv6 capable"
++msgstr "Make tun device IPv6 capable"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "Maximum number of queued TCP output packets"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "Number of allocated broadcast buffers"
++
++msgid "Number of lines for log file history"
++msgstr "Number of lines for log file history"
++
++msgid "Only accept connections from given X509 name"
++msgstr "Only accept connections from given X509 name"
++
++msgid "Only process ping timeouts if routes exist"
++msgstr "Only process ping timeouts if routes exist"
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "OpenVPN instances"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "Optimize TUN/TAP/UDP writes"
++
++msgid "Output to syslog and do not daemonize"
++msgstr "Output to syslog and do not daemonize"
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr "PKCS#12 file containing keys"
++
++msgid "Pass environment variables to script"
++msgstr "Pass environment variables to script"
++
++msgid "Persist replay-protection state"
++msgstr "Persist replay-protection state"
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr "Persist/unpersist ifconfig-pool"
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr "Ping remote every n seconds over TCP/UDP port"
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Proxy timeout in seconds"
++msgstr "Proxy timeout in seconds"
++
++msgid "Push an ifconfig option to remote"
++msgstr "Push an ifconfig option to remote"
++
++msgid "Push options to peer"
++msgstr "Push options to peer"
++
++msgid "Query management channel for private key"
++msgstr "Query management channel for private key"
++
++msgid "Randomly choose remote server"
++msgstr "Randomly choose remote server"
++
++msgid "Refuse connection if no custom client config"
++msgstr "Refuse connection if no custom client config"
++
++msgid "Remap SIGUSR1 signals"
++msgstr "Remap SIGUSR1 signals"
++
++msgid "Remote host name or ip address"
++msgstr "Remote host name or ip address"
++
++msgid "Remote ping timeout"
++msgstr "Remote ping timeout"
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr "Renegotiate data chan. key after bytes"
++
++msgid "Renegotiate data chan. key after packets"
++msgstr "Renegotiate data chan. key after packets"
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr "Renegotiate data chan. key after seconds"
++
++msgid "Replay protection sliding window size"
++msgstr "Replay protection sliding window size"
++
++msgid "Require explicit designation on certificate"
++msgstr "Require explicit designation on certificate"
++
++msgid "Require explicit key usage on certificate"
++msgstr "Require explicit key usage on certificate"
++
++msgid "Restart after remote ping timeout"
++msgstr "Restart after remote ping timeout"
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr "Retransmit timeout on TLS control channel"
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "Retry indefinitely on HTTP proxy errors"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr "Retry indefinitely on Socks proxy errors"
++
++msgid "Route subnet to client"
++msgstr "Route subnet to client"
++
++msgid "Run as an inetd or xinetd server"
++msgstr "Run as an inetd or xinetd server"
++
++msgid "Run script cmd on client connection"
++msgstr "Run script cmd on client connection"
++
++msgid "Run script cmd on client disconnection"
++msgstr "Run script cmd on client disconnection"
++
++msgid "Run up/down scripts for all restarts"
++msgstr "Run up/down scripts for all restarts"
++
++msgid "Send notification to peer on disconnect"
++msgstr "Send notification to peer on disconnect"
++
++msgid "Set GID to group"
++msgstr "Set GID to group"
++
++msgid "Set TCP/UDP MTU"
++msgstr "Set TCP/UDP MTU"
++
++msgid "Set UID to user"
++msgstr "Set UID to user"
++
++msgid "Set aside a pool of subnets"
++msgstr "Set aside a pool of subnets"
++
++msgid "Set extended HTTP proxy options"
++msgstr "Set extended HTTP proxy options"
++
++msgid "Set output verbosity"
++msgstr "Set output verbosity"
++
++msgid "Set size of real and virtual address hash tables"
++msgstr "Set size of real and virtual address hash tables"
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "Set the TCP/UDP receive buffer size"
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr "Set the TCP/UDP send buffer size"
++
++msgid "Set tun/tap TX queue length"
++msgstr "Set tun/tap TX queue length"
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr "Set tun/tap device MTU"
++
++msgid "Set tun/tap device overhead"
++msgstr "Set tun/tap device overhead"
++
++msgid "Set upper bound on TCP MSS"
++msgstr "Set upper bound on TCP MSS"
++
++msgid "Shaping for peer bandwidth"
++msgstr "Shaping for peer bandwidth"
++
++msgid "Shell cmd to execute after tun device open"
++msgstr "Shell cmd to execute after tun device open"
++
++msgid "Shell cmd to run after tun device close"
++msgstr "Shell cmd to run after tun device close"
++
++msgid "Shell command to verify X509 name"
++msgstr "Shell command to verify X509 name"
++
++msgid "Silence the output of replay warnings"
++msgstr "Silence the output of replay warnings"
++
++msgid "Size of cipher key"
++msgstr "Size of cipher key"
++
++msgid "Specify a default gateway for routes"
++msgstr "Specify a default gateway for routes"
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr "Start OpenVPN in a hibernating state"
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr "Started"
++
++msgid "Status file format version"
++msgstr "Status file format version"
++
++msgid "Switch to advanced configuration »"
++msgstr "Switch to advanced configuration »"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "TCP/UDP port # for both local and remote"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "TCP/UDP port # for local (default=1194)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "TCP/UDP port # for remote (default=1194)"
++
++msgid "TLS cipher"
++msgstr "TLS cipher"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr "TOS passthrough (applies to IPv4 only)"
++
++msgid "Temporary directory for client-connect return file"
++msgstr "Temporary directory for client-connect return file"
++
++msgid "Timeframe for key exchange"
++msgstr "Timeframe for key exchange"
++
++msgid "Type of used device"
++msgstr "Type of used device"
++
++msgid "Use fast LZO compression"
++msgstr "Use fast LZO compression"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "Use individual addresses rather than /30 subnets"
++
++msgid "Use protocol"
++msgstr "Use protocol"
++
++msgid "Use tun/tap device node"
++msgstr "Use tun/tap device node"
++
++msgid "Use username as common name"
++msgstr "Use username as common name"
++
++msgid "Write log to file"
++msgstr "Write log to file"
++
++msgid "Write process ID to file"
++msgstr "Write process ID to file"
++
++msgid "Write status to file every n seconds"
++msgstr "Write status to file every n seconds"
++
++msgid "no"
++msgstr "no"
++
++msgid "tun/tap device"
++msgstr "tun/tap device"
++
++msgid "tun/tap inactivity timeout"
++msgstr "tun/tap inactivity timeout"
++
++msgid "yes (%i)"
++msgstr "yes (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "« Switch to basic configuration"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/es/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/es/openvpn.po
+new file mode 100644
+index 0000000..7c9a2d4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/es/openvpn.po
+@@ -0,0 +1,559 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2013-09-01 09:09+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p', o 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr "Aceptar opciones envidadas desde el servidor"
++
++msgid "Add"
++msgstr "Añadir"
++
++msgid "Add route after establishing connection"
++msgstr "Añadir la ruta tras establecer la conexión"
++
++msgid "Additional authentication over TLS"
++msgstr "Autentificación adicional con TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Permitir el tráfico cliente-a-cliente"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Permitir múltiples clientes con el mismo certificado"
++
++msgid "Allow only one session"
++msgstr "Permitir sólo una sesión"
++
++msgid "Allow remote to change its IP or port"
++msgstr "Permitir al conectado cambiar su IP o puerto"
++
++msgid "Allowed maximum of connected clients"
++msgstr "Máximo de clientes conectados"
++
++msgid "Allowed maximum of internal"
++msgstr "Máximo de internos"
++
++msgid "Allowed maximum of new connections"
++msgstr "Máximo de nuevas conexiones"
++
++msgid "Append log to file"
++msgstr "Unir registro al archivo"
++
++msgid "Authenticate using username/password"
++msgstr "Autentificar con nombre usuario y contraseña"
++
++msgid "Automatically redirect default route"
++msgstr "Redirigir automáticamente la ruta por defecto"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr "Instancias OpenVPN configuradas y estado actual"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr "Comando/script a llamar al cerrar el dispositivo TUn/TAP"
++
++msgid "Certificate authority"
++msgstr "Autoridad certificativa"
++
++msgid "Change process priority"
++msgstr "Cambiar la prioridad del proceso"
++
++msgid "Change to directory before initialization"
++msgstr "Cambiar a este directorio antes de inicializar"
++
++msgid "Check peer certificate against a CRL"
++msgstr "Comprobar certificados contra un CRL"
++
++msgid "Chroot to directory after initialization"
++msgstr "Restringir a este directorio tras inicializar"
++
++msgid "Client is disabled"
++msgstr "Cliente desactivado"
++
++msgid "Configuration category"
++msgstr "Categoría de configuración"
++
++msgid "Configure client mode"
++msgstr "Configurar el modo cliente"
++
++msgid "Configure server bridge"
++msgstr "Configurar el puente servidor"
++
++msgid "Configure server mode"
++msgstr "Configurar el modo servidor"
++
++msgid "Connect through Socks5 proxy"
++msgstr "Conectar por un proxy Socks5"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr "Conectar a la máquina remota usando un proxy HTTP"
++
++msgid "Connection retry interval"
++msgstr "Intervalo de reconexión"
++
++msgid "Daemonize after initialization"
++msgstr "Demonizar tras inicialización"
++
++msgid "Delay n seconds after connection"
++msgstr "Espera tras conexión (segundos)"
++
++msgid "Delay tun/tap open and up script execution"
++msgstr "Espera para la apertura TUN/TAP y ejecución del script de arranque"
++
++msgid "Diffie Hellman parameters"
++msgstr "Parámetros Diffie-Hellman"
++
++msgid "Directory for custom client config files"
++msgstr "Directorio de configuraciones personalizadas"
++
++msgid "Disable Paging"
++msgstr "Desactivar paginación"
++
++msgid "Disable cipher initialisation vector"
++msgstr "Desactivar vector de inicialización de cifrado"
++
++msgid "Disable options consistency check"
++msgstr "Desactivar comprobación de consistencia de opciones"
++
++msgid "Disable replay protection"
++msgstr "Desactivar la protección contra reproducción"
++
++msgid "Do not bind to local address and port"
++msgstr "No asociar a un puerto y dirección locales"
++
++msgid "Don't actually execute ifconfig"
++msgstr "No ejecutar ifconfig"
++
++msgid "Don't add routes automatically"
++msgstr "No añadir rutas automáticamente"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr "No guardar las contraseñas --askpass o --auth-user-pass"
++
++msgid "Don't inherit global push options"
++msgstr "No heredar opciones push globales"
++
++msgid "Don't log timestamps"
++msgstr "No guardar en registro horas"
++
++msgid "Don't re-read key on restart"
++msgstr "No releer la clave al rearrancar"
++
++msgid "Don't require client certificate"
++msgstr "No es necesario certificado cliente"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "No usar compresión adaptativa LZO"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr "No avisar de inconsistencias en ifconfig"
++
++msgid "Echo parameters to log"
++msgstr "Guardar parámetros en el registro"
++
++msgid "Empirically measure MTU"
++msgstr "Medir MTU empíricamente"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "Motor criptográfico por hardware OpenSSL"
++
++msgid "Enable Path MTU discovery"
++msgstr "Detección de MTU"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr "Modo de encriptado de clave estática (no-TLS)"
++
++msgid "Enable TLS and assume client role"
++msgstr "Activar TLS y asumir el papel de cliente"
++
++msgid "Enable TLS and assume server role"
++msgstr "Activar TLS y asumir el papel de servidor"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Fragmentación de datagramas interna"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr "Interfaz de gestión en <em>IP</em> <em>puerto</em>"
++
++msgid "Enabled"
++msgstr "Activado"
++
++msgid "Encryption cipher for packets"
++msgstr "Cifra de encriptación de paquetes"
++
++msgid "Execute shell cmd after routes are added"
++msgstr "Comandos a ejecutar tras añadir rutas"
++
++msgid "Execute shell command on remote ip change"
++msgstr "Comando a ejecutar si se cambia la IP remota"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++"Ejecutado en modo servidor en nuevas conexiones de clientes, cuando no se "
++"confía aún en el cliente"
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++"Ejecutado en modo servidor cuando una ruta, dirección IPv4 o dirección MAC "
++"se añade a la tabla de rutas interna de OpenVPN"
++
++msgid "Exit on TLS negotiation failure"
++msgstr "Salir si falla la negociación"
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr "Obtener la clave PEM del tty de control antes de demonizar"
++
++msgid "HMAC authentication for packets"
++msgstr "Autentificación HMAC de paquetes"
++
++msgid "Handling of authentication failures"
++msgstr "Gestión de fallos de autentificación"
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++"Directriz para simplificar la expresión de --ping y --ping-restart en "
++"configuraciones en modo servido"
++
++msgid "If hostname resolve fails, retry"
++msgstr "Reintentar si falla la resolución de nombre de máquina"
++
++msgid "Instance \"%s\""
++msgstr "Instancia \"%s\""
++
++msgid "Invalid"
++msgstr "No válido"
++
++msgid "Keep local IP address on restart"
++msgstr "Mantener la dirección IP local al rearrancar"
++
++msgid "Keep remote IP address on restart"
++msgstr "Mantener la dirección IP remota al rearrancar"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "Mantener el dispositivo TUN/TAP abierto al rearrancar"
++
++msgid "Key transition window"
++msgstr "Ventana de transición de clave"
++
++msgid "Limit repeated log messages"
++msgstr "Limitar mensajes repetidos al registro"
++
++msgid "Local certificate"
++msgstr "Certificado local"
++
++msgid "Local host name or ip address"
++msgstr "Nombre de máquina local o dirección IP"
++
++msgid "Local private key"
++msgstr "Clave privada local"
++
++msgid "Major mode"
++msgstr "Modo principal"
++
++msgid "Make tun device IPv6 capable"
++msgstr "Habilitar IPv6 en dispositivo TUN"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "Paquetes máximos en la cola de salida TCP"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "Número de buffers de propagación"
++
++msgid "Number of lines for log file history"
++msgstr "Líneas en el archivo de registro histórico"
++
++msgid "Only accept connections from given X509 name"
++msgstr "Aceptar solo conexiones desde este nombre X509"
++
++msgid "Only process ping timeouts if routes exist"
++msgstr "Procesa solo las esperas a ping si existe la ruta"
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "Instancias OpenVPN"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "Optimizar escrituras TUN/TAP/UDP"
++
++msgid "Output to syslog and do not daemonize"
++msgstr "Escribir en SysLog y no demonizar"
++
++msgid "Overview"
++msgstr "Resumen"
++
++msgid "PKCS#12 file containing keys"
++msgstr "Archivo PKCS#12 de claves"
++
++msgid "Pass environment variables to script"
++msgstr "Pasar variables de entorno al script"
++
++msgid "Persist replay-protection state"
++msgstr "Estado continuo de protección antireproducción"
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr "Mantener/no mantener el listado de interfaces"
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr "Ping al remoto cada n segundos sobre un puerto TCP/UDP"
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr "Política sobre el uso de programas externos y scripts"
++
++msgid "Port"
++msgstr "Puerto"
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid "Proxy timeout in seconds"
++msgstr "Espera del proxy en segundos"
++
++msgid "Push an ifconfig option to remote"
++msgstr "Enviar un opción de ifconfig al puesto remoto"
++
++msgid "Push options to peer"
++msgstr "Enviar opciones al otro"
++
++msgid "Query management channel for private key"
++msgstr "Consulta el canal de gestión por la clave privada"
++
++msgid "Randomly choose remote server"
++msgstr "Elegir aleatoriamente un servidor remoto"
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++"Rechazar conexión si no tiene una configuración de cliente personalizada"
++
++msgid "Remap SIGUSR1 signals"
++msgstr "Redirigir señales SIGUSR1"
++
++msgid "Remote host name or ip address"
++msgstr "Nombre de máquina remota o dirección IP"
++
++msgid "Remote ping timeout"
++msgstr "Espera a ping remoto"
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr "Bytes tras los que renegociar la clave del canal del datos"
++
++msgid "Renegotiate data chan. key after packets"
++msgstr "Paquetes tras los que renegociar la clave del canal del datos"
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr "Segundos tras los que renegociar la clave del canal del datos"
++
++msgid "Replay protection sliding window size"
++msgstr "Tamaño de la ventana deslizante de la protección de reproducción"
++
++msgid "Require explicit designation on certificate"
++msgstr "Designación explícita de certificado"
++
++msgid "Require explicit key usage on certificate"
++msgstr "Clave de uso explícita de certificado"
++
++msgid "Restart after remote ping timeout"
++msgstr "Rearrancar tras espera del ping remoto"
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr "Espera de retransmisión en el canal de control TLS"
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "Reintentar indefinidamente en errores del proxy HTTP"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr "Reintentar indefinidamente en errores del proxy Socks"
++
++msgid "Route subnet to client"
++msgstr "Enrutar subred a cliente"
++
++msgid "Run as an inetd or xinetd server"
++msgstr "Ejecutar como servidor inetd o xinetd"
++
++msgid "Run script cmd on client connection"
++msgstr "Script a ejecutar tras una conexión de cliente"
++
++msgid "Run script cmd on client disconnection"
++msgstr "Script a ejecutar tras una desconexión de cliente"
++
++msgid "Run up/down scripts for all restarts"
++msgstr "Ejecutar scripts de activación/desactivación en todos los rearranques"
++
++msgid "Send notification to peer on disconnect"
++msgstr "Enviar notificación al otro en caso de desconexión"
++
++msgid "Set GID to group"
++msgstr "GID del grupo"
++
++msgid "Set TCP/UDP MTU"
++msgstr "MTU TCP/UDP"
++
++msgid "Set UID to user"
++msgstr "UID del usuario"
++
++msgid "Set aside a pool of subnets"
++msgstr "Reservar un bloque de subredes"
++
++msgid "Set extended HTTP proxy options"
++msgstr "Opciones HTTP extendidas del proxy"
++
++msgid "Set output verbosity"
++msgstr "Nivel de detalle de mensajes"
++
++msgid "Set size of real and virtual address hash tables"
++msgstr "Tamaño de las tablas real y virtual de hashes"
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "Tamaño del búfer de recepción TCP/UDP"
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr "Tamaño del búfer de envío TCP/UDP"
++
++msgid "Set tun/tap TX queue length"
++msgstr "Longitud de la cola de transmisión TUN/TAP"
++
++msgid "Set tun/tap adapter parameters"
++msgstr "Parámetros del adaptador TUN/TAP"
++
++msgid "Set tun/tap device MTU"
++msgstr "MTU del dispositivo TUN/TAP"
++
++msgid "Set tun/tap device overhead"
++msgstr "Sobrecarga del dispositivo TUN/TAP"
++
++msgid "Set upper bound on TCP MSS"
++msgstr "Límite superior de MSS de TCP"
++
++msgid "Shaping for peer bandwidth"
++msgstr "Adaptar ancho de banda de clientes"
++
++msgid "Shell cmd to execute after tun device open"
++msgstr "Comando shell a ejecutar tras abrir el dispositivo TUN"
++
++msgid "Shell cmd to run after tun device close"
++msgstr "Comando shell a ejecutar tras cerrar el dispositivo TUN"
++
++msgid "Shell command to verify X509 name"
++msgstr "Comando shell a ejecutar para verificar un nombre X509"
++
++msgid "Silence the output of replay warnings"
++msgstr "No mostrar avisos de reproducción"
++
++msgid "Size of cipher key"
++msgstr "Tamaño de la clave de cifrado"
++
++msgid "Specify a default gateway for routes"
++msgstr "Gateway por defecto"
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr "Arrancar OpenVPN en estado hibernado"
++
++msgid "Start/Stop"
++msgstr "Arrancar/Parar"
++
++msgid "Started"
++msgstr "Arrancado"
++
++msgid "Status file format version"
++msgstr "Versión del formato del fichero de estado"
++
++msgid "Switch to advanced configuration »"
++msgstr "Cambiar a configuración avanzada »"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "Número de puerto TCP/UDP para local y remoto"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "Número de puerto TCP/UDP para local (default=1194)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "Número de puerto TCP/UDP para remoto (default=1194)"
++
++msgid "TLS cipher"
++msgstr "Cifra TLS"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr "Paso a través TOS (sólo para IPv4)"
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++"Directorio temporal para el fichero de retorno de la conexión del cliente"
++
++msgid "Timeframe for key exchange"
++msgstr "Tiempo de intercambio de clave"
++
++msgid "Type of used device"
++msgstr "Tipo de dispositivo usado"
++
++msgid "Use fast LZO compression"
++msgstr "Compresión rápida LZO"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "Direcciones individuales en vez de subredes /30"
++
++msgid "Use protocol"
++msgstr "Protocolo"
++
++msgid "Use tun/tap device node"
++msgstr "Nodo de dispositivo TUN/TAP"
++
++msgid "Use username as common name"
++msgstr "Nombre de usuario como nombre común"
++
++msgid "Write log to file"
++msgstr "Escribir registro a fichero"
++
++msgid "Write process ID to file"
++msgstr "Escribir ID del proceso a fichero"
++
++msgid "Write status to file every n seconds"
++msgstr "Segundos tras los que escribir el fichero de estado"
++
++msgid "no"
++msgstr "no"
++
++msgid "tun/tap device"
++msgstr "dispositivo TUN/TAP"
++
++msgid "tun/tap inactivity timeout"
++msgstr "Espera de inactividad tun/tap"
++
++msgid "yes (%i)"
++msgstr "sí (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "« Cambiar a configuración básica"
++
++#~ msgid "Cryptography"
++#~ msgstr "Criptografía"
++
++#~ msgid "Networking"
++#~ msgstr "Red"
++
++#~ msgid "Service"
++#~ msgstr "Servicio"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/fr/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/fr/openvpn.po
+new file mode 100644
+index 0000000..cbfd1f5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/fr/openvpn.po
+@@ -0,0 +1,580 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2014-01-26 12:53+0200\n"
++"Last-Translator: kyas <rimk_71@hotmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p' ou 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr "Accepter les options envoyées par le serveur"
++
++msgid "Add"
++msgstr "Ajouter"
++
++msgid "Add route after establishing connection"
++msgstr "Ajouter un routage après l'établissement de la connexion"
++
++msgid "Additional authentication over TLS"
++msgstr "Authentification supplémentaire par dessus TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Autoriser le trafic entre clients"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Permettre à plusieurs clients d'utiliser le même certificat"
++
++msgid "Allow only one session"
++msgstr "Autoriser seulement une session"
++
++msgid "Allow remote to change its IP or port"
++msgstr "Autoriser l'hôte distant à changer d'adresse IP ou de port"
++
++msgid "Allowed maximum of connected clients"
++msgstr "Maximum autorisé de clients connectés"
++
++msgid "Allowed maximum of internal"
++msgstr "Admis au maximum interne"
++
++msgid "Allowed maximum of new connections"
++msgstr "Maximum autorisé de nouvelles connexions"
++
++msgid "Append log to file"
++msgstr "Ajouter les journaux en fin de ce fichier"
++
++msgid "Authenticate using username/password"
++msgstr "S'authentifier par identifiant/mot-de-passe"
++
++msgid "Automatically redirect default route"
++msgstr "Rediriger automatiquement la route par défaut"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++"Voici ci-dessous la liste d'instances OpenVPN configurées et leur état "
++"courant"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++"Appelle une commande/script d'arrêt avant que le périphérique TUN/TAP soit "
++"fermé"
++
++msgid "Certificate authority"
++msgstr "Autorité des certificats"
++
++msgid "Change process priority"
++msgstr "Modifier la priorité du processus"
++
++msgid "Change to directory before initialization"
++msgstr "Aller dans ce répertorie avant l'initialisation"
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++"Confronter le certificat du distant à une liste des certificats révoqués "
++"(CRL)"
++
++msgid "Chroot to directory after initialization"
++msgstr "Faire un « chroot » dans ce répertoire après initialisation"
++
++msgid "Client is disabled"
++msgstr "Client désactivé"
++
++msgid "Configuration category"
++msgstr "Catégorie de configuration"
++
++msgid "Configure client mode"
++msgstr "Configurer le mode client"
++
++msgid "Configure server bridge"
++msgstr "Configurer le mode pont"
++
++msgid "Configure server mode"
++msgstr "Configurer le mode serveur"
++
++msgid "Connect through Socks5 proxy"
++msgstr "Se connecter via un proxy Socks5"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr "Se connecter à un hôte distant via un mandataire HTTP"
++
++msgid "Connection retry interval"
++msgstr "Intervalle entre 2 tentatives de connexion"
++
++msgid "Daemonize after initialization"
++msgstr "Transformer en démon après l'initialisation"
++
++msgid "Delay n seconds after connection"
++msgstr "Attends n secondes après la connexion"
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++"Attends avant l'ouverture de tun/tap et l'exécution de scripts de mise en "
++"marche"
++
++msgid "Diffie Hellman parameters"
++msgstr "Paramètres Diffie Hellman"
++
++msgid "Directory for custom client config files"
++msgstr "Répertoire contenant vos fichiers de config client spécifiques"
++
++msgid "Disable Paging"
++msgstr "Désactiver la pagination"
++
++msgid "Disable cipher initialisation vector"
++msgstr "Désactivé le vecteur d'initialisation cipher"
++
++msgid "Disable options consistency check"
++msgstr "Désactiver la vérification de la cohérence des options"
++
++msgid "Disable replay protection"
++msgstr "Désactiver la protection anti-rejeu"
++
++msgid "Do not bind to local address and port"
++msgstr "Ne pas attacher à l'adresse et au port local"
++
++msgid "Don't actually execute ifconfig"
++msgstr "Ne pas exécuter réellement ifconfig"
++
++msgid "Don't add routes automatically"
++msgstr "Ne pas ajouter de routes automatiquement"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++"Ne pas copier en cache les mots de passe des options --askpass ou --auth-"
++"user-pass"
++
++msgid "Don't inherit global push options"
++msgstr "Ne pas hériter des options d'envoi globales"
++
++msgid "Don't log timestamps"
++msgstr "Ne pas journaliser les horodatages"
++
++msgid "Don't re-read key on restart"
++msgstr "Ne pas relire la clef au redémarrage"
++
++msgid "Don't require client certificate"
++msgstr "Ne pas exiger un certificat client"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "Ne pas utiliser la compression adaptative LZO"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr "Ne pas alerter en cas d'incohérence d'ifconfig"
++
++msgid "Echo parameters to log"
++msgstr "Écrire les paramètres dans le journal"
++
++msgid "Empirically measure MTU"
++msgstr "Mesurer le MTU empiriquement"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "Activer les systèmes de cryptages OpenSSL matériels"
++
++msgid "Enable Path MTU discovery"
++msgstr "Activer la découverte du MTU du chemin"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr "Activer le mode de cryptage à clef statique (non TLS)"
++
++msgid "Enable TLS and assume client role"
++msgstr "Activer le TLS et prendre le rôle du client"
++
++msgid "Enable TLS and assume server role"
++msgstr "Activer le TLS et prendre le rôle du serveur"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Autoriser la fragmentation des datagrammes en interne"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr "Activer l'interface de gestion sur <em>IP</em> <em>port</em>"
++
++msgid "Enabled"
++msgstr "Activé"
++
++msgid "Encryption cipher for packets"
++msgstr "Méthode de chiffrement des paquets"
++
++msgid "Execute shell cmd after routes are added"
++msgstr "Exécuter une commande shell après l'ajout des routes"
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++"Exécuter une commande Shell suite à un changement d'IP de l'hôte distant"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++"Lancé en mode serveur pour les nouvelles connexions client, quand le client "
++"n'est pas encore reconnu"
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++"Lancé en mode serveur à chaque fois qu'une adresse/route IPv4 ou une adresse "
++"MAC est ajoutée à la table de routage interne d'OpenVPN"
++
++msgid "Exit on TLS negotiation failure"
++msgstr "Arrêter suite à l'échec de la négociation TLS"
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++"Obtenir le mot de passe du certificat depuis le terminal avant de passer en "
++"mode démon"
++
++msgid "HMAC authentication for packets"
++msgstr "Authentification HMAC des paquets"
++
++msgid "Handling of authentication failures"
++msgstr "Gestion des erreurs d'authentification"
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++"Aide pour simplifier l'expression des --ping et --ping-restart dans les "
++"configurations en mode serveur"
++
++msgid "If hostname resolve fails, retry"
++msgstr "Si la résolution du nom de l'hôte échoue, ré-essayer"
++
++msgid "Instance \"%s\""
++msgstr "Instance \"%s\""
++
++msgid "Invalid"
++msgstr "Invalide"
++
++msgid "Keep local IP address on restart"
++msgstr "Conserver l'adresse IP locale lors du redémarrage"
++
++msgid "Keep remote IP address on restart"
++msgstr "Conserver l'adresse IP distante lors du redémarrage"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "Conserver le périphérique tun/tap ouvert au redémarrage"
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr "Limiter les messages répétés dans les journaux"
++
++msgid "Local certificate"
++msgstr "Certificat local"
++
++msgid "Local host name or ip address"
++msgstr "Nom ou adresse IP de l'hôte local"
++
++msgid "Local private key"
++msgstr "Clef privée locale"
++
++msgid "Major mode"
++msgstr "Mode principal"
++
++msgid "Make tun device IPv6 capable"
++msgstr "Rendre le périphérique tun compatible IPv6"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "Nombre maximum de paquets TCP en attente d'émission"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "Nombre de tampons de diffusion alloués"
++
++msgid "Number of lines for log file history"
++msgstr "Nombre de lignes de l'historique du fichier-journal"
++
++msgid "Only accept connections from given X509 name"
++msgstr "Accepte seulement des connexions du nom X509 donné"
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++"Traiter l'expiration des délais des pings seulement si les routes existent"
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "Instances OpenVPN"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "Optimiser les écritures TUN/TAP/UDP"
++
++msgid "Output to syslog and do not daemonize"
++msgstr "Envoyer à syslog et ne pas transformer en démon"
++
++msgid "Overview"
++msgstr "Vue d'ensemble"
++
++msgid "PKCS#12 file containing keys"
++msgstr "Fichier au format PKCS#12 contenant les clefs"
++
++msgid "Pass environment variables to script"
++msgstr "Transmettre les variables d'environnement au script"
++
++msgid "Persist replay-protection state"
++msgstr "Reconduire l'état de protection anti-rejeu"
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr "Reconduire ou non le lot d'ifconfig"
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++"Envoyer un ping à l'hôte distant toutes les n secondes sur le port TCP/UDP"
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr "Règle de sécurité appliqué à l'usage de programmes et scripts externes"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol"
++msgstr "Protocole"
++
++msgid "Proxy timeout in seconds"
++msgstr "Délai d'attente du mandataire, en secondes"
++
++msgid "Push an ifconfig option to remote"
++msgstr "Envoyer une option ifconfig au distant"
++
++msgid "Push options to peer"
++msgstr "Envoyer les options au client"
++
++msgid "Query management channel for private key"
++msgstr "Canal de requête de gestion pour clef privée"
++
++msgid "Randomly choose remote server"
++msgstr "Choisir au hasard un serveur distant"
++
++msgid "Refuse connection if no custom client config"
++msgstr "Refuser la connexion en l'absence de config client spécifique"
++
++msgid "Remap SIGUSR1 signals"
++msgstr "Rediriger les signaux SIGUSR1"
++
++msgid "Remote host name or ip address"
++msgstr "Nom ou adresse IP de l'hôte distant"
++
++msgid "Remote ping timeout"
++msgstr "Délai de ping du distant"
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr "Renégocier la clé du canal de données après tant d'octets"
++
++msgid "Renegotiate data chan. key after packets"
++msgstr "Renégocier la clé du canal de données après tant de paquets"
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++"Renégocier la clé du canal de données après tant de temps (en secondes)"
++
++msgid "Replay protection sliding window size"
++msgstr "Taille de la fenêtre glissante pour la protection anti-rejeu"
++
++msgid "Require explicit designation on certificate"
++msgstr "Exiger l'appellation explicite sur le certificat"
++
++msgid "Require explicit key usage on certificate"
++msgstr "Exiger l'utilisation explicite de la clé sur le certificat"
++
++msgid "Restart after remote ping timeout"
++msgstr "Redémarrer aprés le dépassement du délai de ping du distant"
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr "Renvoyer l'expiration du délai sur le canal de contrôle TLS"
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "Ré-essayer indéfiniment suite à des erreurs du proxy HTTP"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr "Ré-essayer indéfiniment suite à des erreurs du proxy Socks"
++
++msgid "Route subnet to client"
++msgstr "Router le sous-réseau vers le client"
++
++msgid "Run as an inetd or xinetd server"
++msgstr "Exécuter en tant que serveur inetd ou xinetd"
++
++msgid "Run script cmd on client connection"
++msgstr "Exécuter une commande de script lors de la connexion d'un client"
++
++msgid "Run script cmd on client disconnection"
++msgstr "Exécuter une commande de script lors de la déconnexion d'un client"
++
++msgid "Run up/down scripts for all restarts"
++msgstr "Exécuter les scripts up/down à tous les redémarrages"
++
++msgid "Send notification to peer on disconnect"
++msgstr "Envoyer une notification au distant à la déconnexion"
++
++msgid "Set GID to group"
++msgstr "Utiliser le GID de ce groupe"
++
++msgid "Set TCP/UDP MTU"
++msgstr "Définir le MTU TCP/UDP"
++
++msgid "Set UID to user"
++msgstr "Utiliser l'UID de cet utilisateur"
++
++msgid "Set aside a pool of subnets"
++msgstr "Mettre de coté un lot de sous-réseaux"
++
++msgid "Set extended HTTP proxy options"
++msgstr "Définir les options de mandataire HTTP étendu"
++
++msgid "Set output verbosity"
++msgstr "Définir la verbosité des écrits"
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++"Définir la taille des tables de haché des adresses réelles et virtuelles"
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "Définir la taille de la pile de réception TCP/UDP"
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr "Définir la taille de la pile d'envoi TCP/UDP"
++
++msgid "Set tun/tap TX queue length"
++msgstr "Définir la taille de la pile TX tun/tap"
++
++msgid "Set tun/tap adapter parameters"
++msgstr "Définir les paramètres de l'adaptateur tun/tap"
++
++msgid "Set tun/tap device MTU"
++msgstr "Définir le MTU du périphérique tun/tap"
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr "Définir la borne supérieure du MSS TCP"
++
++msgid "Shaping for peer bandwidth"
++msgstr "Gère la bande-passante du distant"
++
++msgid "Shell cmd to execute after tun device open"
++msgstr "Commande Shell à exécuter après l'ouverture du périphérique tun"
++
++msgid "Shell cmd to run after tun device close"
++msgstr "Commande Shell à exécuter après la fermeture du périphérique tun"
++
++msgid "Shell command to verify X509 name"
++msgstr "Commande shell de vérification du nom X509"
++
++msgid "Silence the output of replay warnings"
++msgstr "Supprime les messages d'alertes anti-rejeu"
++
++msgid "Size of cipher key"
++msgstr "Taille de la clé de cryptage"
++
++msgid "Specify a default gateway for routes"
++msgstr "Définir la passerelle par défaut des routes"
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr "Démarrer OpenVPN dans un état d'hibernation"
++
++msgid "Start/Stop"
++msgstr "Démarrer/Arrêter"
++
++msgid "Started"
++msgstr "Démarré"
++
++msgid "Status file format version"
++msgstr "Version du format du fichier de status"
++
++msgid "Switch to advanced configuration »"
++msgstr "Afficher les paramètres de configuration avancés"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "Numéro de port TCP/UDP valable pour l'hôte local et l'hôte distant"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "Numéro de port TCP/UDP pour l'hôte local (par défaut 1194)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "Numéro de port TCP/UDP pour l'hôte distant (par défaut 1194)"
++
++msgid "TLS cipher"
++msgstr "Méthode de chiffrement TLS"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr "Répertoire pour le fichier temporaire lié à la connexion d'un client"
++
++msgid "Timeframe for key exchange"
++msgstr "Période d'un échange de clés"
++
++msgid "Type of used device"
++msgstr "Type de périphérique utilisé"
++
++msgid "Use fast LZO compression"
++msgstr "Utiliser la compression LZO rapide"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "Utiliser des adresses individuelles plutôt que des sous-réseaux en /30"
++
++msgid "Use protocol"
++msgstr "Utiliser le protocole"
++
++msgid "Use tun/tap device node"
++msgstr "Utiliser le périphérique tun/tap"
++
++msgid "Use username as common name"
++msgstr "Utiliser le nom d'utilisateur comme nom « commun » (du certificat)"
++
++msgid "Write log to file"
++msgstr "Écrire le journal dans le fichier"
++
++msgid "Write process ID to file"
++msgstr "Écrire le numéro de processus dans le fichier"
++
++msgid "Write status to file every n seconds"
++msgstr "Écrire le status dans le fichier chaque n secondes"
++
++msgid "no"
++msgstr "non"
++
++msgid "tun/tap device"
++msgstr "Périphérique tun/tap"
++
++msgid "tun/tap inactivity timeout"
++msgstr "Délai d'inactivité tun/tap"
++
++msgid "yes (%i)"
++msgstr "oui (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "Afficher les paramètres de configuration standards"
++
++#~ msgid "Cryptography"
++#~ msgstr "Cryptage"
++
++#~ msgid "Networking"
++#~ msgstr "Réseau"
++
++#~ msgid "Service"
++#~ msgstr "Service"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
++
++#~ msgid "openvpn_%s"
++#~ msgstr "openvpn_%s"
++
++#~ msgid "openvpn_%s_desc"
++#~ msgstr "openvpn_%s_desc"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/he/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/he/openvpn.po
+new file mode 100644
+index 0000000..55953b9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/he/openvpn.po
+@@ -0,0 +1,535 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr ""
++
++msgid "Allow multiple clients with same certificate"
++msgstr ""
++
++msgid "Allow only one session"
++msgstr ""
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr ""
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN instances"
++msgstr ""
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr ""
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr ""
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr ""
++
++msgid "« Switch to basic configuration"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/hu/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/hu/openvpn.po
+new file mode 100644
+index 0000000..3e93918
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/hu/openvpn.po
+@@ -0,0 +1,557 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-01-31 12:06+0200\n"
++"Last-Translator: Gabor <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p' vagy 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr "A kiszolgáló által küldött opciók elfogadás"
++
++msgid "Add"
++msgstr "Hozzáadás"
++
++msgid "Add route after establishing connection"
++msgstr "Útvonal hozzáadása a kapcsolat létrejötte után"
++
++msgid "Additional authentication over TLS"
++msgstr "További hitelesítés TLS-en keresztül"
++
++msgid "Allow client-to-client traffic"
++msgstr "Ügyfél-ügyfél közötti kapcsolat engedélyezése"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Több ügyfél engedélyezése ugyanazzal a tanúsítvánnyal"
++
++msgid "Allow only one session"
++msgstr "Csak egy munkafolyamat engedélyezése"
++
++msgid "Allow remote to change its IP or port"
++msgstr "A távoli gép IP címének vagy portjának megváltozatásának engedélyezése"
++
++msgid "Allowed maximum of connected clients"
++msgstr "A csatlakozott ügyfelek maximális megengedett száma"
++
++msgid "Allowed maximum of internal"
++msgstr "Belső kapcsolatok maximális száma"
++
++msgid "Allowed maximum of new connections"
++msgstr "Az új kapcsolatok maximálisan megengedett száma"
++
++msgid "Append log to file"
++msgstr "Napló hozzáfűzése fájlhoz"
++
++msgid "Authenticate using username/password"
++msgstr "Azonosítás felhasználónév és jelszó használatával"
++
++msgid "Automatically redirect default route"
++msgstr "Az alapértelmezett útvonal automatikus átirányítása"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++"Az alábbi listában találhatóak a beállított OpenVPN példányok és azok "
++"aktuális állapota"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr "A TUN/TAP interfész lezárása előtt futtatandó shell script."
++
++msgid "Certificate authority"
++msgstr "Hitelesítésszolgáltató"
++
++msgid "Change process priority"
++msgstr "Folyamat prioritásának módosítása"
++
++msgid "Change to directory before initialization"
++msgstr "Váltás a könyvtárra inicializáslás előtt"
++
++msgid "Check peer certificate against a CRL"
++msgstr "Kliens tanúsítvány összevetése a tiltólistával."
++
++msgid "Chroot to directory after initialization"
++msgstr "Gyökérkönyvtár váltás inicializáció után"
++
++msgid "Client is disabled"
++msgstr "Ügyfél letiltva"
++
++msgid "Configuration category"
++msgstr "Beállítások / Visszavonás"
++
++msgid "Configure client mode"
++msgstr "Ügyfél mód beállítása"
++
++msgid "Configure server bridge"
++msgstr "Kiszolgáló híd beállítása"
++
++msgid "Configure server mode"
++msgstr "Kiszolgáló mód beállítása"
++
++msgid "Connect through Socks5 proxy"
++msgstr "Kapcsolódás Sock5 proxy-n keresztül"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr "Kapcsolódás a távoli géphez HTTP proxyn keresztül"
++
++msgid "Connection retry interval"
++msgstr "Kapcsolódás újrapróbálkozási időköz"
++
++msgid "Daemonize after initialization"
++msgstr "Váltás démon módba inicializálás után"
++
++msgid "Delay n seconds after connection"
++msgstr "Kapcsolat felépítés után 'n' másodperc késleltetés"
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr "Diffie Hellman paraméterek"
++
++msgid "Directory for custom client config files"
++msgstr "Egyéni ügyfél konfigurációs fájlok könyvtára "
++
++msgid "Disable Paging"
++msgstr "Lapozás letiltása"
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr "Újrajátszás védelem letiltása"
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr "Ne adjon hozzá útvonalakat automatikusan "
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr "Időbélyegeket ne naplózza"
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr "Ne használjon adaptív LZO tömörítést"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr "A paramétereket írja a naplóba"
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "OpenSSL hardveres titkosítás engedélyezése"
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr "Engedélyezve"
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr "Érvénytelen"
++
++msgid "Keep local IP address on restart"
++msgstr "Helyi IP cím megtartása újraindításkor"
++
++msgid "Keep remote IP address on restart"
++msgstr "Távoli IP cím megtartása újraindításkor"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "tun/tap eszközök nyitva tartása újraindításkor"
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr "Helyi tanúsítvány"
++
++msgid "Local host name or ip address"
++msgstr "Helyi gép név vagy IP cím"
++
++msgid "Local private key"
++msgstr "Helyi privát kulcs"
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "A sorbaállított kimenő TCP csomagok maximális száma"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "Lefoglalt broadcast pufferek száma"
++
++msgid "Number of lines for log file history"
++msgstr "Naplófájl történet sorainak száma"
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "OpenVPN példányok"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr "Ãttekintés"
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "Proxy timeout in seconds"
++msgstr "Proxy várakozási idő (másodperc)"
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr "Kapcsolat megtagadás ha nincs egyéni ügyfél konfiguráció"
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr "Távoli gép név vagy IP cím"
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr "Indítás/Leállítás"
++
++msgid "Started"
++msgstr "Elindítva"
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr "Váltás haladó beállításokra »"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr "TLS titkosító"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr "A használt eszköz típusa"
++
++msgid "Use fast LZO compression"
++msgstr "Gyors LZO tömörítés használata"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "Egyedi címek használata /30 alhálózat helyett"
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr "Napló írása fájlba"
++
++msgid "Write process ID to file"
++msgstr "Folyamat azonosító (PID) fájlba írása"
++
++msgid "Write status to file every n seconds"
++msgstr "Ãllapot fájlba írása 'n' másodpercenként"
++
++msgid "no"
++msgstr "nem"
++
++msgid "tun/tap device"
++msgstr "tun/tap/ eszköz"
++
++msgid "tun/tap inactivity timeout"
++msgstr "tun/tap tétlenségi idő"
++
++msgid "yes (%i)"
++msgstr "igen (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "« Váltás alap beállításokra"
++
++#~ msgid "Cryptography"
++#~ msgstr "Titkosítás"
++
++#~ msgid "Networking"
++#~ msgstr "Hálózatkezelés"
++
++#~ msgid "Service"
++#~ msgstr "Szolgáltatás"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
++
++#~ msgid "openvpn_%s"
++#~ msgstr "openvpn_%s"
++
++#~ msgid "openvpn_%s_desc"
++#~ msgstr "openvpn_%s_desc"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/it/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/it/openvpn.po
+new file mode 100644
+index 0000000..0304437
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/it/openvpn.po
+@@ -0,0 +1,541 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-04-20 10:36+0200\n"
++"Last-Translator: claudyus <claudyus84@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr "Accetta opzioni inviate dal server"
++
++msgid "Add"
++msgstr "Aggiungi"
++
++msgid "Add route after establishing connection"
++msgstr "Aggiungi rotte dopo aver stabilito la connessione"
++
++msgid "Additional authentication over TLS"
++msgstr "Autenticazione addizionale over TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Permetti traffico client-client"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Permetti più client con lo stesso certificato"
++
++msgid "Allow only one session"
++msgstr "Permetti solo una sessione"
++
++msgid "Allow remote to change its IP or port"
++msgstr "Permetti ai remote di cambiare il proprio IP o porta"
++
++msgid "Allowed maximum of connected clients"
++msgstr "Numero massimo di clienti connessi"
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr "Numero massimo di nuove connessioni ammesse"
++
++msgid "Append log to file"
++msgstr "Appendi il log al file"
++
++msgid "Authenticate using username/password"
++msgstr "Autenticazione usando username/passoword"
++
++msgid "Automatically redirect default route"
++msgstr "Modifica automaticamente la default route"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++"Sotto c'è una lista di istanze di OpenVPN configurate e il loro stato "
++"corrente"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr "Cambia priorità del processo"
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr "Connetti attraverso un proxy Socks5"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr "Connetti attraverso un proxy HTTP"
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr "Non effettuare il bind sull'indirizzo/porta locale"
++
++msgid "Don't actually execute ifconfig"
++msgstr "Non eseguire realmente ifconfig"
++
++msgid "Don't add routes automatically"
++msgstr "Non aggiungere rotte automaticamente"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr "Non loggare il timestamps"
++
++msgid "Don't re-read key on restart"
++msgstr "Non rileggere le chiavi al riavvio"
++
++msgid "Don't require client certificate"
++msgstr "Non richiedere certificati dei client"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "Non usare compressione lzo adattiva"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr "Misura empericamente l'MTU"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "Abilita il supporto criptografico hardware per OpenSSL"
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Abilita frammentazione interna dei datagram"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr "Abilitato"
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr "Esegui un comando shell dopo che le rotte sono aggiunte"
++
++msgid "Execute shell command on remote ip change"
++msgstr "Esegui un comando shell al cambio di ip remoto"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr "Istanza \"%s\""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr "Mantieni l'IP local al riavvio"
++
++msgid "Keep remote IP address on restart"
++msgstr "Mantieni l'IP remoto al riavvio"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "Mantienti il device tun/tap aperto al riavvio"
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr "Limita le ripetizioni di messaggi nel log"
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr "Chiave privata local"
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr "Rendi il device tun ipv6 ready"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "OpenVPN istanze"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "Ottimizza le scritture su TUN/TAP/UDP"
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr "Anteprima"
++
++msgid "PKCS#12 file containing keys"
++msgstr "PKCS#12 file containing keys"
++
++msgid "Pass environment variables to script"
++msgstr "Passa le variabili d'ambiente allo script"
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Protocol"
++msgstr "Protocollo"
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr "Avviato"
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr "Passa alla configurazione avanzata »"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr "no"
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr "si (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "« Passa alla configurazione base"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/ja/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/ja/openvpn.po
+new file mode 100644
+index 0000000..dc558a8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/ja/openvpn.po
+@@ -0,0 +1,551 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-04-09 08:12+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.4\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p', ã¾ãŸã¯ 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr "追加"
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr "クライアント間通信を許å¯ã™ã‚‹"
++
++msgid "Allow multiple clients with same certificate"
++msgstr ""
++
++msgid "Allow only one session"
++msgstr "1ã¤ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ã¿ã‚’許å¯ã™ã‚‹"
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr "ç¾åœ¨è¨­å®šæ¸ˆã®OpenVPNã®è¨­å®šã¨ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’表示ã—ã¦ã„ã¾ã™ã€‚"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr "設定カテゴリ"
++
++msgid "Configure client mode"
++msgstr "クライアントモードã«è¨­å®š"
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr "サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ã«è¨­å®š"
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr "å†æŽ¥ç¶šé–“éš”"
++
++msgid "Daemonize after initialization"
++msgstr "åˆæœŸåŒ–後ã«ãƒ‡ãƒ¼ãƒ¢ãƒ³åŒ–ã™ã‚‹"
++
++msgid "Delay n seconds after connection"
++msgstr "セッション接続後ã€n秒ディレイã™ã‚‹"
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr "Diffie Hellman パラメータ"
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr "ページングを無効ã«ã™ã‚‹"
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr "時刻をログã«æ›¸ãè¾¼ã¾ãªã„"
++
++msgid "Don't re-read key on restart"
++msgstr "å†èµ·å‹•æ™‚ã«ã‚­ãƒ¼ã®å†èª­ã¿è¾¼ã¿ã‚’è¡Œã‚ãªã„"
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "OpenSSLæš—å·åŒ–ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚µãƒãƒ¼ãƒˆã‚’有効ã«ã™ã‚‹"
++
++msgid "Enable Path MTU discovery"
++msgstr "Path MTU discovery を有効ã«ã™ã‚‹"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr "有効"
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr "設定 \"%s\""
++
++msgid "Invalid"
++msgstr "無効"
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr "tun デãƒã‚¤ã‚¹ã§IPv6機能を有効ã«ã™ã‚‹"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "OpenVPN 設定"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr "概è¦"
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr "ãƒãƒ¼ãƒˆ"
++
++msgid "Protocol"
++msgstr "プロトコル"
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr "TCP/UDP ã®MTUを設定"
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr "ログ出力レベルã®è¨­å®š"
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "TCP/UDP ã®å—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚º"
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr "TCP/UDP ã®é€ä¿¡ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚º"
++
++msgid "Set tun/tap TX queue length"
++msgstr "tun/tap デãƒã‚¤ã‚¹ã®é€ä¿¡ã‚­ãƒ¥ãƒ¼ã‚µã‚¤ã‚º"
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr "tun/tap デãƒã‚¤ã‚¹ã®MTU設定"
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr "開始 / åœæ­¢"
++
++msgid "Started"
++msgstr "実行中"
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr "詳細設定ã¸ç§»å‹• »"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "TCP/UDP ãƒãƒ¼ãƒˆ (ローカル・リモート共用)"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "TCP/UDP ãƒãƒ¼ãƒˆ (ローカル, 標準設定=1194)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "TCP/UDP ãƒãƒ¼ãƒˆ (リモート, 標準設定=1194)"
++
++msgid "TLS cipher"
++msgstr "TLS æš—å·åŒ–æ–¹å¼"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr "高速LZO圧縮機能を使用ã™ã‚‹"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr "使用ã™ã‚‹ãƒ—ロトコル"
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr "ã„ã„ãˆ"
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr "ã¯ã„ (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "« 基本設定ã¸ç§»å‹•"
++
++#~ msgid "Cryptography"
++#~ msgstr "æš—å·è¨­å®š"
++
++#~ msgid "Networking"
++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++#~ msgid "Service"
++#~ msgstr "サービス"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/ms/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/ms/openvpn.po
+new file mode 100644
+index 0000000..0ed8909
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/ms/openvpn.po
+@@ -0,0 +1,534 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr ""
++
++msgid "Allow multiple clients with same certificate"
++msgstr ""
++
++msgid "Allow only one session"
++msgstr ""
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr ""
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN instances"
++msgstr ""
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr ""
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr ""
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr ""
++
++msgid "« Switch to basic configuration"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/no/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/no/openvpn.po
+new file mode 100644
+index 0000000..55953b9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/no/openvpn.po
+@@ -0,0 +1,535 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr ""
++
++msgid "Allow multiple clients with same certificate"
++msgstr ""
++
++msgid "Allow only one session"
++msgstr ""
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr ""
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN instances"
++msgstr ""
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr ""
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr ""
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr ""
++
++msgid "« Switch to basic configuration"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/pl/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/pl/openvpn.po
+new file mode 100644
+index 0000000..7fa9fe2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/pl/openvpn.po
+@@ -0,0 +1,566 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-05 03:41+0200\n"
++"Last-Translator: piosl <sleczek.piotr@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 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"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p', lub 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr "Zaakceptuj opcje narzucone przez serwer"
++
++msgid "Add"
++msgstr "Dodaj"
++
++msgid "Add route after establishing connection"
++msgstr "Dodaj trasę po nawiązaniu połączenia"
++
++msgid "Additional authentication over TLS"
++msgstr "Dodatkowe uwierzytelnianie poprzez TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Zezwól na łączność klient-klient"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Zezwól na łączenie wielu klientów z tym samym certyfikatem."
++
++msgid "Allow only one session"
++msgstr "Zezwól tylko na jedną sesję"
++
++msgid "Allow remote to change its IP or port"
++msgstr "Zezwól na zmianę IP lub portu odległemu hostowi."
++
++msgid "Allowed maximum of connected clients"
++msgstr "Maksymalna dozwolona liczba klientów"
++
++msgid "Allowed maximum of internal"
++msgstr "Maksymalna dozwolona liczba wewnętrznych"
++
++msgid "Allowed maximum of new connections"
++msgstr "Maksymalna dozwolona liczba nowych połączeń"
++
++msgid "Append log to file"
++msgstr "Dopisz log do pliku"
++
++msgid "Authenticate using username/password"
++msgstr "Autoryzacja z użyciem loginu oraz hasła"
++
++msgid "Automatically redirect default route"
++msgstr "Automatycznie przekieruj domyślną trasę"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++"Ponieżej znajduje się lista skonfigurowanych procesów OpenVPN wraz z ich "
++"aktualnymi stanami."
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr "Zatrzymaj skrypt przed wyłączeniem interfejsu TUN/TAP"
++
++msgid "Certificate authority"
++msgstr "UrzÄ…d certyfikacji"
++
++msgid "Change process priority"
++msgstr "Zmień priorytet procesu"
++
++msgid "Change to directory before initialization"
++msgstr "Przejdź do katalogu przed inicjalizacją"
++
++msgid "Check peer certificate against a CRL"
++msgstr "Sprawdź certyfikat peera na obecność w CRL"
++
++msgid "Chroot to directory after initialization"
++msgstr "Zmień root (chroot) na katalog po inicjalizacji"
++
++msgid "Client is disabled"
++msgstr "Klient jest wyłączony"
++
++msgid "Configuration category"
++msgstr "Kategoria konfiguracji"
++
++msgid "Configure client mode"
++msgstr "Konfiguruj tryb klienta"
++
++msgid "Configure server bridge"
++msgstr "Konfiguruj serwer w trybie mostu"
++
++msgid "Configure server mode"
++msgstr "Konfiguruj serwer"
++
++msgid "Connect through Socks5 proxy"
++msgstr "Połącz poprzez SOCKS5 proxy"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr "Połącz ze zdalnym hostem poprzez HTTP proxy"
++
++msgid "Connection retry interval"
++msgstr "Interwał powtarzania połączeń"
++
++msgid "Daemonize after initialization"
++msgstr "Przejdź w tryb demona po inicjalizacji"
++
++msgid "Delay n seconds after connection"
++msgstr "Opóźnienie n sekund po nawiązaniu połączenia"
++
++msgid "Delay tun/tap open and up script execution"
++msgstr "Opóźnienie otwarcia interfejsu tun/tap i wykonania skryptu"
++
++msgid "Diffie Hellman parameters"
++msgstr "Parametry Diffie Hellman"
++
++msgid "Directory for custom client config files"
++msgstr "Katalog na pliki konfiguracyjne"
++
++msgid "Disable Paging"
++msgstr "Wyłącz stronicowanie"
++
++msgid "Disable cipher initialisation vector"
++msgstr "Wyłącz wektor inicjalizacji szyfru"
++
++msgid "Disable options consistency check"
++msgstr "Wyłącz sprawdzanie poprawności ustawień"
++
++msgid "Disable replay protection"
++msgstr "Wyłącz ochronę odpowiedzi"
++
++msgid "Do not bind to local address and port"
++msgstr "Nie zwiÄ…zuj z lokalnym adresem i portem"
++
++msgid "Don't actually execute ifconfig"
++msgstr "Nie uruchamiaj obecnie ifconfig"
++
++msgid "Don't add routes automatically"
++msgstr "Nie dodawaj tras (routes) automatycznie"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr "Nie cacheuj haseł --askpass lub --auth-user-pass"
++
++msgid "Don't inherit global push options"
++msgstr "Nie dziedzicz globalnej opcji push"
++
++msgid "Don't log timestamps"
++msgstr "Nie zapisuj czasu w logu"
++
++msgid "Don't re-read key on restart"
++msgstr "Nie wczytuj ponownie klucza podczas restartu"
++
++msgid "Don't require client certificate"
++msgstr "Nie wymagaj certyfikatu od klienta"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "Nie używaj adaptatywnej kompresji lzo"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr "Nie ostrzegaj przed niespójnością w ifconfig"
++
++msgid "Echo parameters to log"
++msgstr "Zapisuj parametry w logu"
++
++msgid "Empirically measure MTU"
++msgstr "Mierz MTU empirycznie"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "Włącz sprzętowe przyspieszenie OpenSSL"
++
++msgid "Enable Path MTU discovery"
++msgstr "WÅ‚Ä…cz wykrywanie \"Path MTU\""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr "WÅ‚Ä…cz tryb szyfrowania statycznym kluczem (non-TLS)"
++
++msgid "Enable TLS and assume client role"
++msgstr "WÅ‚Ä…cz TLS i przyjmij rolÄ™ klienta"
++
++msgid "Enable TLS and assume server role"
++msgstr "WÅ‚Ä…cz TLS i przyjmij rolÄ™ serwera"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Włącz wewnętrzną fragmentację datagramu"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr "WÅ‚Ä…cz interfejs zarzÄ…dzalny na <em>IP</em> <em>port</em>"
++
++msgid "Enabled"
++msgstr "WÅ‚Ä…czone"
++
++msgid "Encryption cipher for packets"
++msgstr "Szyfrowanie dla pakietów"
++
++msgid "Execute shell cmd after routes are added"
++msgstr "Wykonaj komendę powłoki po dodaniu tras"
++
++msgid "Execute shell command on remote ip change"
++msgstr "Wykonaj komendę powłoki po zmianie zdalnego IP"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++"Wykonane w trybie serwera na nowych połączeniach klienta, gdy klient jest "
++"nadal niezaufany"
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++"Wykonane w trybie serwera, gdy adres IPv4, trasa lub adres MAC sÄ… dodane do "
++"wewnętrznej tablicy routingu w OpenVPN"
++
++msgid "Exit on TLS negotiation failure"
++msgstr "Wyjdź przy niepowodzeniu negocjacji TLS"
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr "Uzyskaj hasło PEM z kontroli tty przed demonizacją"
++
++msgid "HMAC authentication for packets"
++msgstr "Autoryzacja HMAC dla pakietów"
++
++msgid "Handling of authentication failures"
++msgstr "Postępowanie z błędami uwierzytelniania"
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++"Dyrektywa Helper w celu uproszczenia wyrażenie --ping i --ping-restart w "
++"konfiguracjach w trybie serwera"
++
++msgid "If hostname resolve fails, retry"
++msgstr "Jeżeli ustanowienie nazwy hosta nie powiedzie się, spróbuj ponownie"
++
++msgid "Instance \"%s\""
++msgstr "Instancja \"%s\""
++
++msgid "Invalid"
++msgstr "Nieprawidłowe"
++
++msgid "Keep local IP address on restart"
++msgstr "Zachowaj lokalny adres IP przy restarcie"
++
++msgid "Keep remote IP address on restart"
++msgstr "Zachowaj zdalny adres IP przy restarcie"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "Utrzymaj urzÄ…dzenie tun/tap po restarcie jako otwarte"
++
++msgid "Key transition window"
++msgstr "Okno zmiany klucza"
++
++msgid "Limit repeated log messages"
++msgstr "Limit powtarzających się wiadomości w logu"
++
++msgid "Local certificate"
++msgstr "Certyfikat lokalny"
++
++msgid "Local host name or ip address"
++msgstr "Lokalna nazwa hosta lub adres IP"
++
++msgid "Local private key"
++msgstr "Lokalny klucz prywatny"
++
++msgid "Major mode"
++msgstr "Tryb główny"
++
++msgid "Make tun device IPv6 capable"
++msgstr "UrzÄ…dzenie tun zgodne z IPv6"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "Maksymalna liczba wychodzących pakietów TCP w kolejce"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "Liczba przydzielonych buforów nadawczych"
++
++msgid "Number of lines for log file history"
++msgstr "Liczba linii w pliku dziennika historii"
++
++msgid "Only accept connections from given X509 name"
++msgstr "Akceptuj tylko połączenia z podanej nazwy X509"
++
++msgid "Only process ping timeouts if routes exist"
++msgstr "Wykonaj procedurę \"ping timeout\" tylko jeżeli trasy istnieją"
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "Instancje OpenVPN"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "Optymalizuj wpisy TUN/TAP/UDP"
++
++msgid "Output to syslog and do not daemonize"
++msgstr "Wysyłaj do syslog'a i nie demonizuj"
++
++msgid "Overview"
++msgstr "PrzeglÄ…d"
++
++msgid "PKCS#12 file containing keys"
++msgstr "Plik PKCS#12 zawierajÄ…cy klucze"
++
++msgid "Pass environment variables to script"
++msgstr "Przekaż zmienne środowiskowe do skryptu"
++
++msgid "Persist replay-protection state"
++msgstr "Utrzymaj status ochrony odpowiedzi"
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr "Utrzymuj/Nie utrzymuj ifconfig-pool"
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr "Pinguj zdalnego co n sekund przez port TCP/UDP"
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++"Poziom zasad odnoszących się do używania zewnętrznych programów i skryptów"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Protocol"
++msgstr "Protokół"
++
++msgid "Proxy timeout in seconds"
++msgstr "Czas bezczynności proxy w sekundach"
++
++msgid "Push an ifconfig option to remote"
++msgstr "Wyślij opcje ifconfig do zdalnego"
++
++msgid "Push options to peer"
++msgstr "Wyślij opcje do peera"
++
++msgid "Query management channel for private key"
++msgstr "Kanał zarządzania zapytaniami dla klucza prywatnego"
++
++msgid "Randomly choose remote server"
++msgstr "Losowo wybierz serwer zdalny"
++
++msgid "Refuse connection if no custom client config"
++msgstr "Odmów połączenie gdy nie standardowy klient konfiguracja"
++
++msgid "Remap SIGUSR1 signals"
++msgstr "Przemapuj SIGUSR1"
++
++msgid "Remote host name or ip address"
++msgstr "Nazwa lub IP zdalnego hosta"
++
++msgid "Remote ping timeout"
++msgstr "Zdalny ping upłynął czas"
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr "Renegocjacja danych charakteru klucza po bajtach"
++
++msgid "Renegotiate data chan. key after packets"
++msgstr "Renegocjacja danych charakteru klucza po pakietach"
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr "Renegocjacja danych charakteru klucza po sekundach"
++
++msgid "Replay protection sliding window size"
++msgstr "Powtórzenie osłony okna rozmiaru"
++
++msgid "Require explicit designation on certificate"
++msgstr "Potrzebna Podpis na Certyfikacie"
++
++msgid "Require explicit key usage on certificate"
++msgstr "Potrzebna klucza używanego w certyfikacie"
++
++msgid "Restart after remote ping timeout"
++msgstr "restart po zdalnym ping upływie czasu"
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr "Retransmisja po upływie czasu TLS na kanale kontrolnym"
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "Ponownie spróbować na Http proxy Błędzie"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr "Trasa podsieci do klienta"
++
++msgid "Run as an inetd or xinetd server"
++msgstr "Uruchom jako serwer inetd lub xinetd"
++
++msgid "Run script cmd on client connection"
++msgstr "Uruchom skrypt cmd po połączeniu klienta"
++
++msgid "Run script cmd on client disconnection"
++msgstr "Uruchom skrypt cmd po rozłączeniu klienta"
++
++msgid "Run up/down scripts for all restarts"
++msgstr "Uruchom skrypty up/down dla wszystkich restartów"
++
++#, fuzzy
++msgid "Send notification to peer on disconnect"
++msgstr "Wyślij zgłoszenie o rozłączeniu do peer"
++
++msgid "Set GID to group"
++msgstr "Ustaw GID dla grupy"
++
++msgid "Set TCP/UDP MTU"
++msgstr "Ustaw TCP/UDP MTU"
++
++msgid "Set UID to user"
++msgstr "Ustaw UID dla użytkownika"
++
++#, fuzzy
++msgid "Set aside a pool of subnets"
++msgstr "Odłożyć na bok pulę podsieci"
++
++msgid "Set extended HTTP proxy options"
++msgstr "Ustaw rozszerzone opcje proxy HTTP"
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr "Ustaw rozmiar rzeczywistych i wirtualnych adresów tablicy hash"
++
++#, fuzzy
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "Ustaw rozmiar buforu wysyłania TCP/UDP"
++
++#, fuzzy
++msgid "Set the TCP/UDP send buffer size"
++msgstr "Ustaw rozmiar buforu wysyłania TCP/UDP"
++
++#, fuzzy
++msgid "Set tun/tap TX queue length"
++msgstr "Ustaw długość kolejki tun / tap TX "
++
++msgid "Set tun/tap adapter parameters"
++msgstr "Ustaw parametr adaptera tun/tap"
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr "Ustaw górną granicę TCP MSS"
++
++msgid "Shaping for peer bandwidth"
++msgstr "Formowanie wzajemnego pasma"
++
++#, fuzzy
++msgid "Shell cmd to execute after tun device open"
++msgstr "cmd Shell po uruchomieniu urzadzenie tun"
++
++#, fuzzy
++msgid "Shell cmd to run after tun device close"
++msgstr "cmd Shell po wyłączeniu urzadzenie tun"
++
++msgid "Shell command to verify X509 name"
++msgstr "polecenie Shell aby sprawdzić nazwę X509"
++
++msgid "Silence the output of replay warnings"
++msgstr "Wycisz powtórne pojawianie się ostrzeżeń"
++
++msgid "Size of cipher key"
++msgstr "Rozmiar klucza szyfrowania"
++
++msgid "Specify a default gateway for routes"
++msgstr "Określ domyślną bramę dla tras"
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr "Uruchom OpenVPN w stanie hibernacji"
++
++msgid "Start/Stop"
++msgstr "Start/Stop"
++
++msgid "Started"
++msgstr "Uruchomiono"
++
++msgid "Status file format version"
++msgstr "Wersja formatu pliku statusu"
++
++msgid "Switch to advanced configuration »"
++msgstr "Konfiguracja zaawansowana »"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "Numer portu TCP/UDP zarówno dla lokalnego jak i zdalnego"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "Numer portu TCP/UDP dla lokalnego (domyślnie=1194)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "Numer portu TCP/UDP dla zdalnego (domyślnie=1194)"
++
++msgid "TLS cipher"
++msgstr "Kodowanie TLS"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr "Przepuszczanie TOS (dotyczy tylko IPv4)"
++
++msgid "Temporary directory for client-connect return file"
++msgstr "Katalog tymczasowy dla pliku zwrotnego połączenia klienta"
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr "Typ użytego urządzenia"
++
++msgid "Use fast LZO compression"
++msgstr "Użyj szybkiej kompresji LZO"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "Użyj indywidualnego adresu zamiast podsieci /30"
++
++msgid "Use protocol"
++msgstr "Użyj protokołu"
++
++msgid "Use tun/tap device node"
++msgstr "Użyj węzła urządzenia tun/tap"
++
++msgid "Use username as common name"
++msgstr "Użyj nazwy użytkownika jako nazwy wspólnej"
++
++msgid "Write log to file"
++msgstr "Zapisz log do pliku"
++
++msgid "Write process ID to file"
++msgstr "Zapisz numer ID procesu do pliku"
++
++msgid "Write status to file every n seconds"
++msgstr "Zapisz status do pliku co n sekund"
++
++msgid "no"
++msgstr "nie"
++
++msgid "tun/tap device"
++msgstr "urzÄ…dzenie tun/tap"
++
++msgid "tun/tap inactivity timeout"
++msgstr "czas bezczynności tun/tap"
++
++msgid "yes (%i)"
++msgstr "tak (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "« Konfiguracja podstawowa"
++
++#~ msgid "Cryptography"
++#~ msgstr "Kryptografia"
++
++#~ msgid "Networking"
++#~ msgstr "Ustawienia sieciowe"
++
++#~ msgid "Service"
++#~ msgstr "Serwis"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/pt-br/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/pt-br/openvpn.po
+new file mode 100644
+index 0000000..27aef00
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/pt-br/openvpn.po
+@@ -0,0 +1,566 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2014-03-29 23:19+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p', ou 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr "Aceitar opções enviadas pelo servidor"
++
++msgid "Add"
++msgstr "Adicionar"
++
++msgid "Add route after establishing connection"
++msgstr "Adicionar rota após estabelecimento da conexão"
++
++msgid "Additional authentication over TLS"
++msgstr "Autenticação adicional por TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Permitir tráfego entre os clientes"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Permitir múltiplos clientes com o mesmo certificado"
++
++msgid "Allow only one session"
++msgstr "Permitir apenas uma sessão"
++
++msgid "Allow remote to change its IP or port"
++msgstr "Permitir a um equipamento remoto altere o seu IP ou porta"
++
++msgid "Allowed maximum of connected clients"
++msgstr "Máximo permitido de clientes conectados"
++
++msgid "Allowed maximum of internal"
++msgstr "Máximo permitido internamente para rotas de clientes"
++
++msgid "Allowed maximum of new connections"
++msgstr "Máximo permitido de novas conexões"
++
++msgid "Append log to file"
++msgstr "Acrescentar registos ao arquivo"
++
++msgid "Authenticate using username/password"
++msgstr "Autenticar com usuário/senha"
++
++msgid "Automatically redirect default route"
++msgstr "Redirecionar automaticamente a rota padrão"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++"Abaixo está uma lista de todas as instâncias OpenVPN configuradas e o seu "
++"estado atual"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr "Executar o comando/script antes do tun/tap fechar"
++
++msgid "Certificate authority"
++msgstr "Autoridade certificadora"
++
++msgid "Change process priority"
++msgstr "Alterar prioridade do processo"
++
++msgid "Change to directory before initialization"
++msgstr "Mudar para o diretório antes da iniciação"
++
++msgid "Check peer certificate against a CRL"
++msgstr "Verificar certificado do parceiro conta uma CRL"
++
++msgid "Chroot to directory after initialization"
++msgstr "Chroot para o diretório após a iniciação"
++
++msgid "Client is disabled"
++msgstr "Cliente desativado"
++
++msgid "Configuration category"
++msgstr "Categoria da configuração"
++
++msgid "Configure client mode"
++msgstr "Configurar modo cliente"
++
++msgid "Configure server bridge"
++msgstr "Configurar ponte de servidor"
++
++msgid "Configure server mode"
++msgstr "Configurar modo de servidor"
++
++msgid "Connect through Socks5 proxy"
++msgstr "Conectar através de um proxy Socks5"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr "Conectar a equipamento remoto através de um proxy HTTP"
++
++msgid "Connection retry interval"
++msgstr "Intervalo de reestabelecimento de conexão"
++
++msgid "Daemonize after initialization"
++msgstr "Entre em segundo plano após a iniciação"
++
++msgid "Delay n seconds after connection"
++msgstr "Atrase n segundos depois da conexão"
++
++msgid "Delay tun/tap open and up script execution"
++msgstr "Retardar o script de abertura e ativação do tun/tap"
++
++msgid "Diffie Hellman parameters"
++msgstr "Parâmetros Diffie-Hellman"
++
++msgid "Directory for custom client config files"
++msgstr "Diretório para configurações personalizadas dos clientes"
++
++msgid "Disable Paging"
++msgstr "Desativar paginação"
++
++msgid "Disable cipher initialisation vector"
++msgstr "Desativar o vetor de iniciação da cifra"
++
++msgid "Disable options consistency check"
++msgstr "Desativar opções de verificação de consistência"
++
++msgid "Disable replay protection"
++msgstr "Desativar proteção contra replay"
++
++msgid "Do not bind to local address and port"
++msgstr "Não ativar no endereço e porta locais"
++
++msgid "Don't actually execute ifconfig"
++msgstr "Não executar ifconfig de verdade"
++
++msgid "Don't add routes automatically"
++msgstr "Não adicionar rotas automaticamente"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr "Não colocar em cache as senhas do --askpass ou --auth-user-pass "
++
++msgid "Don't inherit global push options"
++msgstr "Não herdar as opções globais de envio (push)"
++
++msgid "Don't log timestamps"
++msgstr "Não registar a data/hora"
++
++msgid "Don't re-read key on restart"
++msgstr "Não reler a chave entre os reinícios"
++
++msgid "Don't require client certificate"
++msgstr "Não solicitar certificado ao cliente"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "Não usar compressão LZO adaptiva"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr "Não avisar quando existirem inconsistências no ifconfig"
++
++msgid "Echo parameters to log"
++msgstr "Escrever parâmetros no registo"
++
++msgid "Empirically measure MTU"
++msgstr "Medir empíricamente o MTU"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "Ativar motor OpenSSL por hardware"
++
++msgid "Enable Path MTU discovery"
++msgstr "Ativar a descoberta do MTU do caminho"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr "Ativar modo de encriptação por chave estática (não-TLS)"
++
++msgid "Enable TLS and assume client role"
++msgstr "Ativar TLS e assumir papel de cliente"
++
++msgid "Enable TLS and assume server role"
++msgstr "Ativar TLS e assumir papel de servidor"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Ativar a fragmentação interna de datagramas"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr "Ativar o interface de gestão em <em>IP</em> <em>porta</em>"
++
++msgid "Enabled"
++msgstr "Ativado"
++
++msgid "Encryption cipher for packets"
++msgstr "Cifra de encriptação para pacotes"
++
++msgid "Execute shell cmd after routes are added"
++msgstr "Executar o comando shell após as rotas serem adicionadas"
++
++msgid "Execute shell command on remote ip change"
++msgstr "Executar o comando shell quando existir alteração do IP remoto"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++"Executado em modo servidor na nova conexão de cliente, enquanto o cliente "
++"ainda não é confiável"
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++"Executado em modo servidor quando um endereço/rota IPv4 é adicionao na "
++"tabela de roteamento interna do OpenVPN"
++
++msgid "Exit on TLS negotiation failure"
++msgstr "Fechar quando existir falha na negociacao TLS"
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr "Obter password PEM do terminal de controlo antes de passar a daemon"
++
++msgid "HMAC authentication for packets"
++msgstr "Autenticação HMAC para pacotes"
++
++msgid "Handling of authentication failures"
++msgstr "Gestão de falhas de autenticação"
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++"Diretiva de ajuda para simplificar a expressão --ping e --ping-restart nas "
++"configurações de modo servidor"
++
++msgid "If hostname resolve fails, retry"
++msgstr "Se a resolução de nomes falhar, tentar novamente"
++
++msgid "Instance \"%s\""
++msgstr "Instância \"%s\""
++
++msgid "Invalid"
++msgstr "Inválido"
++
++msgid "Keep local IP address on restart"
++msgstr "Manter o endereço IP local entre os reinícios"
++
++msgid "Keep remote IP address on restart"
++msgstr "Manter o endereço IP remoto entre os reinícios"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "Manter o dispositivo tun/tap aberto entre os reinícios"
++
++msgid "Key transition window"
++msgstr "Janela para transição de chaves"
++
++msgid "Limit repeated log messages"
++msgstr "Limitar entradas repetidas no registo"
++
++msgid "Local certificate"
++msgstr "Certificado local"
++
++msgid "Local host name or ip address"
++msgstr "Nome do equipamento ou endereço IP local"
++
++msgid "Local private key"
++msgstr "Chave privada local"
++
++msgid "Major mode"
++msgstr "Modo principal"
++
++msgid "Make tun device IPv6 capable"
++msgstr "Tornar o dispositivo tun capaz de IPv6"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "Número máximo de pacotes TCP na fila de saída"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "Número de buffers de broadcast alocados"
++
++msgid "Number of lines for log file history"
++msgstr "Número de linhas para o histórico do registo"
++
++msgid "Only accept connections from given X509 name"
++msgstr "Aceitar conexões apenas de um dado nome X509"
++
++msgid "Only process ping timeouts if routes exist"
++msgstr "Só processe os estouros de tempo de pings se as rotas existirem"
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "Instâncias OpenVPN"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "Otimizar as escritas TUN/TAP/UDP"
++
++msgid "Output to syslog and do not daemonize"
++msgstr "Enviar para o syslog os registos e não vá para segundo plano"
++
++msgid "Overview"
++msgstr "Visão Geral"
++
++msgid "PKCS#12 file containing keys"
++msgstr "Arquivo PKCS#12 com as chaves"
++
++msgid "Pass environment variables to script"
++msgstr "Passar variáveis de ambiente ao script"
++
++msgid "Persist replay-protection state"
++msgstr "Manter persistência da proteção replay"
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr "Manter ou não o conjunto de subredes"
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr "Pingar o remoto a cada n segundos sobre a porta TCP/UDP"
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr "Nível da política sobre o uso de programas e scripts externos"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid "Proxy timeout in seconds"
++msgstr "Tempo limite do proxy em segundos"
++
++msgid "Push an ifconfig option to remote"
++msgstr "Enviar uma opção ifconfig ao remoto"
++
++msgid "Push options to peer"
++msgstr "Enviar opções ao remoto"
++
++msgid "Query management channel for private key"
++msgstr "Solicitar chave privada ao canal de gestão"
++
++msgid "Randomly choose remote server"
++msgstr "Escolher o server remoto aleatoriamente"
++
++msgid "Refuse connection if no custom client config"
++msgstr "Recusar conexões de clientes que não tenham configuração personalizada"
++
++msgid "Remap SIGUSR1 signals"
++msgstr "Remapear os sinais SIGUSR1"
++
++msgid "Remote host name or ip address"
++msgstr "Nome do equipamento ou endereço IP remoto"
++
++msgid "Remote ping timeout"
++msgstr "Tempo limite do ping remoto"
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr "Renegociar chave do canal de dados após n bytes"
++
++msgid "Renegotiate data chan. key after packets"
++msgstr "Renegociar chave do canal de dados após n pacotes"
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr "Renegociar chave do canal de dados após n segundos"
++
++msgid "Replay protection sliding window size"
++msgstr "Tamanho da janela de proteção conta replay"
++
++msgid "Require explicit designation on certificate"
++msgstr "Requerer designação específica no certificado"
++
++msgid "Require explicit key usage on certificate"
++msgstr "Requerer que o uso da chave seja explicitado no certificado"
++
++msgid "Restart after remote ping timeout"
++msgstr "Reiniciar após estouro do tempo do ping remoto"
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr "Estouro de tempo de retransmissão no canal de controle TLS"
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "Tentar infinitamente a conexão quando existirem erros de proxy Socks"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr "Tentar infinitamente a conexão quando existirem erros de proxy Socks"
++
++msgid "Route subnet to client"
++msgstr "Encaminhar rota da subrede para o cliente"
++
++msgid "Run as an inetd or xinetd server"
++msgstr "Executar através do inetd ou xinetd"
++
++msgid "Run script cmd on client connection"
++msgstr "Executar script quando o cliente conectar"
++
++msgid "Run script cmd on client disconnection"
++msgstr "Executar script quando o cliente desconectar"
++
++msgid "Run up/down scripts for all restarts"
++msgstr "Executar scripts de subida/descida para todos os reinícios"
++
++msgid "Send notification to peer on disconnect"
++msgstr "Notificar parceiro remoto ao desconectar"
++
++msgid "Set GID to group"
++msgstr "Usar o GID do grupo"
++
++msgid "Set TCP/UDP MTU"
++msgstr "Definir o MTU TCP/UDP"
++
++msgid "Set UID to user"
++msgstr "Usar o UID do usuário"
++
++msgid "Set aside a pool of subnets"
++msgstr "Reservar um conjunto de subredes"
++
++msgid "Set extended HTTP proxy options"
++msgstr "Definir opções extendidas para o proxy HTTP"
++
++msgid "Set output verbosity"
++msgstr "Definir detalhamento do registo"
++
++msgid "Set size of real and virtual address hash tables"
++msgstr "Definir tamanho das tabelas hash de endereços reais e virtuais"
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "Definir o tamanho do buffer de recepção TCP/UDP"
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr "Definir o tamanho do buffer de envio TCP/UDP"
++
++msgid "Set tun/tap TX queue length"
++msgstr "Definir o tamanho da fila de transmissão tun/tap"
++
++msgid "Set tun/tap adapter parameters"
++msgstr "Definir parâmetros do adaptador TUN/TAP"
++
++msgid "Set tun/tap device MTU"
++msgstr "Definir o MTU do dispositivo tun/tap"
++
++msgid "Set tun/tap device overhead"
++msgstr "Definir o overhead do dispositivo tun/tap"
++
++msgid "Set upper bound on TCP MSS"
++msgstr "Definir teto do MSS TCP"
++
++msgid "Shaping for peer bandwidth"
++msgstr "Restringir a largura de banda ao parceiro"
++
++msgid "Shell cmd to execute after tun device open"
++msgstr "Comando shell para executar após abertura do dispositivo tun"
++
++msgid "Shell cmd to run after tun device close"
++msgstr "Comando shell para executar após o fechamento do dispositivo tun"
++
++msgid "Shell command to verify X509 name"
++msgstr "Comando shell para verificar o nome do X509"
++
++msgid "Silence the output of replay warnings"
++msgstr "Silenciar a saída dos avisos de replay"
++
++msgid "Size of cipher key"
++msgstr "Tamanho da chave de cifragem"
++
++msgid "Specify a default gateway for routes"
++msgstr "Especificar uma roteador padrão para as rotas"
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr "Iniciar o OpenVPN em estado de hibernação"
++
++msgid "Start/Stop"
++msgstr "Iniciar/Parar"
++
++msgid "Started"
++msgstr "Iniciado"
++
++msgid "Status file format version"
++msgstr "Versão de formato do arquivo de estado"
++
++msgid "Switch to advanced configuration »"
++msgstr "Mudar para configuração avançada »"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "Porta TCP/UDP tanto para local e remoto"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "Porta TCP/UDP para local (padrão=1194)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "Porta TCP/UDP para remoto (padrão=1194)"
++
++msgid "TLS cipher"
++msgstr "Cifra TLS"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr "Encaminhe TOS (aplicável apenas a IPv4)"
++
++msgid "Temporary directory for client-connect return file"
++msgstr "Diretório temporário para arquivo de retorno de conexão-cliente"
++
++msgid "Timeframe for key exchange"
++msgstr "Janela temporal para troca de chaves"
++
++msgid "Type of used device"
++msgstr "Tipo de dispositivo utilizado"
++
++msgid "Use fast LZO compression"
++msgstr "Usar compressão LZO rápida"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "Usar endereços individuais em vez de subredes /30"
++
++msgid "Use protocol"
++msgstr "Usar protocolo"
++
++msgid "Use tun/tap device node"
++msgstr "Utilizar dispositivo tun/tap"
++
++msgid "Use username as common name"
++msgstr "Usar o nome do usuário como 'common name' (CN)"
++
++msgid "Write log to file"
++msgstr "Escrever registo no arquivo"
++
++msgid "Write process ID to file"
++msgstr "Escrever PID no arquivo"
++
++msgid "Write status to file every n seconds"
++msgstr "Escrever estado para arquivo a cada n segundos"
++
++msgid "no"
++msgstr "não"
++
++msgid "tun/tap device"
++msgstr "Dispositivo tun/tap"
++
++msgid "tun/tap inactivity timeout"
++msgstr "Tempo limite de inatividade tun/tap"
++
++msgid "yes (%i)"
++msgstr "sim (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "« Mudar para configuração básica"
++
++#~ msgid "Cryptography"
++#~ msgstr "Criptografia"
++
++# Which context?
++#~ msgid "Networking"
++#~ msgstr "Rede"
++
++#~ msgid "Service"
++#~ msgstr "Serviço"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
++
++#~ msgid "openvpn_%s"
++#~ msgstr "openvpn_%s"
++
++#~ msgid "openvpn_%s_desc"
++#~ msgstr "openvpn_%s_desc"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/pt/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/pt/openvpn.po
+new file mode 100644
+index 0000000..76d2091
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/pt/openvpn.po
+@@ -0,0 +1,559 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-06-03 13:43+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p', ou 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr "Aceitar opções enviadas pelo servidor"
++
++msgid "Add"
++msgstr "Adicionar"
++
++msgid "Add route after establishing connection"
++msgstr "Adicionar rota após estabelecimento da ligação"
++
++msgid "Additional authentication over TLS"
++msgstr "Autenticação adicional por TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Permitir tráfego cliente-a-cliente"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Permitir multiplos clientes com o mesmo certificado"
++
++msgid "Allow only one session"
++msgstr "Permitir apenas uma sessão"
++
++msgid "Allow remote to change its IP or port"
++msgstr "Permitir a um host remoto que altere o seu IP ou porta"
++
++msgid "Allowed maximum of connected clients"
++msgstr "Máximo permitido de clientes ligados"
++
++msgid "Allowed maximum of internal"
++msgstr "Máximo permitido internamente para rotas de clientes"
++
++msgid "Allowed maximum of new connections"
++msgstr "Maximo permitido de novas ligações"
++
++msgid "Append log to file"
++msgstr "Acrescentar registos ao ficheiro"
++
++msgid "Authenticate using username/password"
++msgstr "Autenticar com username/password"
++
++msgid "Automatically redirect default route"
++msgstr "Redireccionar automaticamente a rota pre-definida"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++"Abaixo está uma lista de todas as instâncias OpenVPN configuradas e o seu "
++"estado actual"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr "Executar o comando/script antes do fecho tun/tap"
++
++msgid "Certificate authority"
++msgstr "Autoridade certificadora"
++
++msgid "Change process priority"
++msgstr "Alterar prioridade do processo"
++
++msgid "Change to directory before initialization"
++msgstr "Mudar para o directório antes da inicialização"
++
++msgid "Check peer certificate against a CRL"
++msgstr "Verificar certificado do remoto conta uma CRL"
++
++msgid "Chroot to directory after initialization"
++msgstr "Chroot para o directorio apos a inicialização"
++
++msgid "Client is disabled"
++msgstr "Cliente desativado"
++
++msgid "Configuration category"
++msgstr "Categoria da configuração"
++
++msgid "Configure client mode"
++msgstr "Configurar modo cliente"
++
++msgid "Configure server bridge"
++msgstr "Configurar bridge de servidor"
++
++msgid "Configure server mode"
++msgstr "Configurar modo de servidor"
++
++msgid "Connect through Socks5 proxy"
++msgstr "Ligar através de um proxy Socks5"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr "Ligar ao host remoto através de um proxy HTTP"
++
++msgid "Connection retry interval"
++msgstr "Intervalo de reestabelecimento de ligação"
++
++msgid "Daemonize after initialization"
++msgstr "Passar a daemon após a inicialização"
++
++msgid "Delay n seconds after connection"
++msgstr "Aguardar n segundos após a ligação"
++
++msgid "Delay tun/tap open and up script execution"
++msgstr "Retardar o script de abertura/ativação tun/tap"
++
++msgid "Diffie Hellman parameters"
++msgstr "Parametros Diffie-Hellman"
++
++msgid "Directory for custom client config files"
++msgstr "Directório para configurações personalizadas dos clientes"
++
++msgid "Disable Paging"
++msgstr "Desativar Paging"
++
++msgid "Disable cipher initialisation vector"
++msgstr "Desativar o vector de inicialização da cifra"
++
++msgid "Disable options consistency check"
++msgstr "Desativar opções de verificação de consistência"
++
++msgid "Disable replay protection"
++msgstr "Desativar protecção contra replay"
++
++msgid "Do not bind to local address and port"
++msgstr "Não vincular o endereço e porta locais"
++
++msgid "Don't actually execute ifconfig"
++msgstr "Não executar ifconfig"
++
++msgid "Don't add routes automatically"
++msgstr "Não adicionar rotas automaticamente"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr "Não colocar em cache as passwords --askpass ou --auth-user-pass "
++
++msgid "Don't inherit global push options"
++msgstr "Não herdar as opções globais de envio (push)"
++
++msgid "Don't log timestamps"
++msgstr "Não registar timestamps"
++
++msgid "Don't re-read key on restart"
++msgstr "Não reler a chave entre reinicios"
++
++msgid "Don't require client certificate"
++msgstr "Não solicitar certificado ao cliente"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "Não usar compressão LZO adaptiva"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr "Não avisar quando existirem inconsistencias no ifconfig"
++
++msgid "Echo parameters to log"
++msgstr "Escrever parametros no registo"
++
++msgid "Empirically measure MTU"
++msgstr "Medição empírica de MTU"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "Ativar motor OpenSSL por hardware"
++
++msgid "Enable Path MTU discovery"
++msgstr "Ativar a descoberta do MTU do caminho"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr "Ativar modo de encriptação por chave estática (não-TLS)"
++
++msgid "Enable TLS and assume client role"
++msgstr "Activar TLS e assumir papel de cliente"
++
++msgid "Enable TLS and assume server role"
++msgstr "Activar TLS e assumir papel de servidor"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Activar a fragmentação interna de datagramas"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr "Activar o interface de gestão em <em>IP</em> <em>porta</em>"
++
++msgid "Enabled"
++msgstr "Activado"
++
++msgid "Encryption cipher for packets"
++msgstr "Cifra de encriptação para pacotes"
++
++msgid "Execute shell cmd after routes are added"
++msgstr "Executar o comando shell após as rotas serem adicionadas"
++
++msgid "Execute shell command on remote ip change"
++msgstr "Executar o comando shell quando existir alteração do IP remoto"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++"Executado em modo de servidor em novas ligações de cliente, quando o cliente "
++"ainda não é de confiável"
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++"Executado em modo de servidor quando um endereço IPv4/rota ou endereço MAC é "
++"adicionado à tabela interna de roteamento do OpernVPN."
++
++msgid "Exit on TLS negotiation failure"
++msgstr "Fechar quando existir falha na negociação TLS"
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr "Obter password PEM do terminal de controlo antes de passar a daemon"
++
++msgid "HMAC authentication for packets"
++msgstr "Autenticação HMAC para pacotes"
++
++msgid "Handling of authentication failures"
++msgstr "Gestão de falhas de autenticação"
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++"Directiva auxiliar para simplificar a expressão de --ping e --ping-restart "
++"nas configurações do modo servidor"
++
++msgid "If hostname resolve fails, retry"
++msgstr "Se a resolução de nomes falhar, tentar novamente"
++
++msgid "Instance \"%s\""
++msgstr "Instância \"%s\""
++
++msgid "Invalid"
++msgstr "Inválido"
++
++msgid "Keep local IP address on restart"
++msgstr "Manter o endereço IP local entre reinicios"
++
++msgid "Keep remote IP address on restart"
++msgstr "Manter o endereço IP remoto entre reinicios"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "Manter o dispositivo tun/tap aberto entre reinicios"
++
++msgid "Key transition window"
++msgstr "Janela para transição de chaves"
++
++msgid "Limit repeated log messages"
++msgstr "Limitar repetição de entradas no registo"
++
++msgid "Local certificate"
++msgstr "Certificado local"
++
++msgid "Local host name or ip address"
++msgstr "Hostname ou endereço IP local"
++
++msgid "Local private key"
++msgstr "Chave privada local"
++
++msgid "Major mode"
++msgstr "Modo principal"
++
++msgid "Make tun device IPv6 capable"
++msgstr "Tornar o dispositivo tun capaz de IPv6"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "Maximo de pacotes TCP na queue de output"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "Numero de buffers de broadcast alocados"
++
++msgid "Number of lines for log file history"
++msgstr "Numero de linhas para o historico do registo"
++
++msgid "Only accept connections from given X509 name"
++msgstr "Aceitar ligações apenas de um dado nome X509"
++
++msgid "Only process ping timeouts if routes exist"
++msgstr "Só processar timeouts de pings se existirem rotas"
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "Instâncias OpenVPN"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "Optimizar as escritas TUN/TAP/UDP"
++
++msgid "Output to syslog and do not daemonize"
++msgstr "Registos para o syslog e não passar a daemon"
++
++msgid "Overview"
++msgstr "Visão Geral"
++
++msgid "PKCS#12 file containing keys"
++msgstr "Ficheiro PKCS#12 com chaves"
++
++msgid "Pass environment variables to script"
++msgstr "Passar variaveis de ambiente ao script"
++
++msgid "Persist replay-protection state"
++msgstr "Manter persistência da protecção replay"
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr "Manter ou não o conjunto de subredes"
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr "Pingar o remoto a cada n segundos sobre a porta TCP/UDP"
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr "Nível da política sobre o uso de programas externos e scripts"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid "Proxy timeout in seconds"
++msgstr "Timeout do proxy em segundos"
++
++msgid "Push an ifconfig option to remote"
++msgstr "Enviar uma opção ifconfig ao remoto"
++
++msgid "Push options to peer"
++msgstr "Enviar opções ao remoto"
++
++msgid "Query management channel for private key"
++msgstr "Solicitar chave privada ao canal de gestão"
++
++msgid "Randomly choose remote server"
++msgstr "Escolher o server remoto aleatoriamente"
++
++msgid "Refuse connection if no custom client config"
++msgstr "Recusar ligações de clientes que não tenham configurações "
++
++msgid "Remap SIGUSR1 signals"
++msgstr "Mapear os sinais SIGUSR1"
++
++msgid "Remote host name or ip address"
++msgstr "Hostname endereço IP remoto"
++
++msgid "Remote ping timeout"
++msgstr "Timeout do ping remoto"
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr "Renegociar chave do canal de dados após n bytes "
++
++msgid "Renegotiate data chan. key after packets"
++msgstr "Renegociar chave do canal de dados após n pacotes"
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr "Renegociar chave do canal de dados após n segundos"
++
++msgid "Replay protection sliding window size"
++msgstr "Tamanho da janela de protecção conta replay"
++
++msgid "Require explicit designation on certificate"
++msgstr "Requerer designação específica no certificado"
++
++msgid "Require explicit key usage on certificate"
++msgstr "Requerer utilização explicita de utilização de chave no certificado"
++
++msgid "Restart after remote ping timeout"
++msgstr "Reiniciar após timeout do ping remoto"
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr "Timeout de retransmissão no canal de controlo TLS"
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "Tentar infinitamente sempre que existam erros de proxy HTTP"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr "Tentar continuamente a ligação quando existirem erros de proxy Socks"
++
++msgid "Route subnet to client"
++msgstr "Encaminhar rota da subrede para o cliente"
++
++msgid "Run as an inetd or xinetd server"
++msgstr "Executar via inetd ou xinetd"
++
++msgid "Run script cmd on client connection"
++msgstr "Executar script quando o cliente ligar"
++
++msgid "Run script cmd on client disconnection"
++msgstr "Executar script quando o cliente desligar"
++
++msgid "Run up/down scripts for all restarts"
++msgstr "Executar scripts de abertura/activação para todos os reinicios"
++
++msgid "Send notification to peer on disconnect"
++msgstr "Notificar remoto ao desligar"
++
++msgid "Set GID to group"
++msgstr "Assumir GID para o grupo"
++
++msgid "Set TCP/UDP MTU"
++msgstr "Definir o MTU TCP/UDP"
++
++msgid "Set UID to user"
++msgstr "Assumir UID para o utilizador"
++
++msgid "Set aside a pool of subnets"
++msgstr "Reservar um conjunto de subredes"
++
++msgid "Set extended HTTP proxy options"
++msgstr "Definir opções extra para o proxy HTTP"
++
++msgid "Set output verbosity"
++msgstr "Definir verbosidade do registo"
++
++msgid "Set size of real and virtual address hash tables"
++msgstr "Definir tamanho das tabelas hash de endereços reais e virtuais"
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "Definir o buffer de recepção TCP/UDP"
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr "Definir o buffer de envio TCP/UDP"
++
++msgid "Set tun/tap TX queue length"
++msgstr "Definir o tamanho da queue de transmissão tun/tap"
++
++msgid "Set tun/tap adapter parameters"
++msgstr "Definir os parâmetros do adaptador tun/tap"
++
++msgid "Set tun/tap device MTU"
++msgstr "Definir o MTU do dispositivo tun/tap"
++
++msgid "Set tun/tap device overhead"
++msgstr "Definir o overhead do dispositivo tun/tap"
++
++msgid "Set upper bound on TCP MSS"
++msgstr "Definir tecto do MSS TCP"
++
++msgid "Shaping for peer bandwidth"
++msgstr "Restringir a largura de banda ao remoto"
++
++msgid "Shell cmd to execute after tun device open"
++msgstr "Comando shell a executar após abertura do dispositivo tun"
++
++msgid "Shell cmd to run after tun device close"
++msgstr "Comando shell a executar após fecho do dispositivo tun"
++
++msgid "Shell command to verify X509 name"
++msgstr "Comando shell para verificar o nome X509"
++
++msgid "Silence the output of replay warnings"
++msgstr "Silenciar o output dos avisos de replay"
++
++msgid "Size of cipher key"
++msgstr "Tamanho da chave de cifra"
++
++msgid "Specify a default gateway for routes"
++msgstr "Especificar uma gateway para as rotas"
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr "Iniciar o OpenVPN em estado de hibernação"
++
++msgid "Start/Stop"
++msgstr "Iniciar/Parar"
++
++msgid "Started"
++msgstr "Iniciado"
++
++msgid "Status file format version"
++msgstr "Versão de formato do ficheiro de estado"
++
++msgid "Switch to advanced configuration »"
++msgstr "Mudar para configuração avançada"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "Porta TCP/UDP para local e remoto"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "Porta TCP/UDP para local (predefinição=1194)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "Porta TCP/UDP para remoto (predefinição=1194)"
++
++msgid "TLS cipher"
++msgstr "Cifra TLS"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr "Passthrough TOS (aplicavel apenas a IPv4)"
++
++msgid "Temporary directory for client-connect return file"
++msgstr "Directório temporário para ficheiro de retorno de ligação-cliente"
++
++msgid "Timeframe for key exchange"
++msgstr "Janela temporal para troca de chaves"
++
++msgid "Type of used device"
++msgstr "Tipo de dispositivo utilizado"
++
++msgid "Use fast LZO compression"
++msgstr "Usar compressão LZO rápida"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "Usar endereços individuais em vez de subredes /30"
++
++msgid "Use protocol"
++msgstr "Usar protocolo"
++
++msgid "Use tun/tap device node"
++msgstr "Utilizar dispositivo tun/tap"
++
++msgid "Use username as common name"
++msgstr "Usar o username como nome comum"
++
++msgid "Write log to file"
++msgstr "Escrever registo para o ficheiro"
++
++msgid "Write process ID to file"
++msgstr "Escrever PID no ficheiro"
++
++msgid "Write status to file every n seconds"
++msgstr "Escrever estado para ficheiro a cada n segundos"
++
++msgid "no"
++msgstr "não"
++
++msgid "tun/tap device"
++msgstr "Dispositivo tun/tap"
++
++msgid "tun/tap inactivity timeout"
++msgstr "Timeout de inactividade tun/tap"
++
++msgid "yes (%i)"
++msgstr "sim (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "Mudar para configuração básica"
++
++#~ msgid "Cryptography"
++#~ msgstr "Criptografia"
++
++#~ msgid "Networking"
++#~ msgstr "Rede"
++
++#~ msgid "Service"
++#~ msgstr "Serviço"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/ro/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/ro/openvpn.po
+new file mode 100644
+index 0000000..1ca6782
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/ro/openvpn.po
+@@ -0,0 +1,536 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2;\n"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr ""
++
++msgid "Allow multiple clients with same certificate"
++msgstr ""
++
++msgid "Allow only one session"
++msgstr ""
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr ""
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN instances"
++msgstr ""
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr ""
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr ""
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr ""
++
++msgid "« Switch to basic configuration"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/ru/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/ru/openvpn.po
+new file mode 100644
+index 0000000..8a4635a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/ru/openvpn.po
+@@ -0,0 +1,575 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: openvpn\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-09-06 10:01+0200\n"
++"Last-Translator: datasheet <michael.gritsaenko@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p' или 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr "Принимать опции, отправленные Ñ Ñервера"
++
++msgid "Add"
++msgstr "Добавить"
++
++msgid "Add route after establishing connection"
++msgstr "Добавить маршрут поÑле уÑтановки ÑоединениÑ"
++
++msgid "Additional authentication over TLS"
++msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Разрешить общение клиентов друг Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Разрешить неÑколько клиентов Ñ Ð¾Ð´Ð½Ð¸Ð¼ Ñертификатом"
++
++msgid "Allow only one session"
++msgstr "Разрешить только одну ÑеÑÑию"
++
++msgid "Allow remote to change its IP or port"
++msgstr "Позволить удалённому хоÑту изменÑÑ‚ÑŒ IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ порт"
++
++msgid "Allowed maximum of connected clients"
++msgstr "Разрешённое макÑимальное количеÑтво подключенных клиентов"
++
++msgid "Allowed maximum of internal"
++msgstr "Разрешённое макÑимальное количеÑтво внутренних"
++
++msgid "Allowed maximum of new connections"
++msgstr "Разрешённое макÑимальное количеÑтво новых Ñоединений"
++
++msgid "Append log to file"
++msgstr "ДопиÑать журнал в файл"
++
++msgid "Authenticate using username/password"
++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð¸Ñпользованием имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ паролÑ"
++
++msgid "Automatically redirect default route"
++msgstr "ÐвтоматичеÑки перенаправлÑÑ‚ÑŒ маршруты по умолчанию"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr "СпиÑок наÑтроенных процеÑÑов OpenVPN и их текущее ÑоÑтоÑние"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr "Команда/Ñкрипт, запуÑкаем(аÑ/ый) перед закрытием TUN/TAP"
++
++msgid "Certificate authority"
++msgstr "Центр Ñертификации"
++
++msgid "Change process priority"
++msgstr "Изменить приоритет процеÑÑа"
++
++msgid "Change to directory before initialization"
++msgstr "Перейти в указанную директорию перед инициализацией"
++
++msgid "Check peer certificate against a CRL"
++msgstr "Проверить Ñертификат пира в CRL"
++
++msgid "Chroot to directory after initialization"
++msgstr "Выполнить chroot на указанную директорию поÑле инициализации"
++
++msgid "Client is disabled"
++msgstr "Клиент выключен"
++
++msgid "Configuration category"
++msgstr "ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸"
++
++msgid "Configure client mode"
++msgstr "ÐаÑтроить режим клиента"
++
++msgid "Configure server bridge"
++msgstr "ÐаÑтроить моÑÑ‚"
++
++msgid "Configure server mode"
++msgstr "ÐаÑтроить режим Ñервера"
++
++msgid "Connect through Socks5 proxy"
++msgstr "СоединÑÑ‚ÑŒÑÑ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Socks5-прокÑи"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr "ПодключитьÑÑ Ðº удалённому хоÑту через HTTP-прокÑи"
++
++msgid "Connection retry interval"
++msgstr "Интервал между попытками подключениÑ"
++
++msgid "Daemonize after initialization"
++msgstr "Перейти в режим демона поÑле инициализации"
++
++msgid "Delay n seconds after connection"
++msgstr "Задержка n Ñекунд поÑле подключениÑ"
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++"ИÑпользовать задержку перед открытием уÑтройÑтва tun и выполнением Ñкрипта"
++
++msgid "Diffie Hellman parameters"
++msgstr "Параметры алгоритма DH"
++
++msgid "Directory for custom client config files"
++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких файлов конфигурации клиентов"
++
++msgid "Disable Paging"
++msgstr "Выключить пейджинг"
++
++msgid "Disable cipher initialisation vector"
++msgstr "Выключить вектор инициализации шифра"
++
++msgid "Disable options consistency check"
++msgstr "Выключить проверку целоÑтноÑти опций"
++
++msgid "Disable replay protection"
++msgstr "Отключить проверку повторов"
++
++msgid "Do not bind to local address and port"
++msgstr "Ðе выполнÑÑ‚ÑŒ привÑзку к локальному адреÑу и порту"
++
++msgid "Don't actually execute ifconfig"
++msgstr "Ðе выполнÑÑ‚ÑŒ ifconfig"
++
++msgid "Don't add routes automatically"
++msgstr "Ðе добавлÑÑ‚ÑŒ маршруты автоматичеÑки"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr "Ðе кешировать пароли --askpass или --auth-user-pass"
++
++#, fuzzy
++msgid "Don't inherit global push options"
++msgstr "Ðе наÑледовать глобальные параметры push"
++
++msgid "Don't log timestamps"
++msgstr "Ðе запиÑывать отметки времени в журнал"
++
++msgid "Don't re-read key on restart"
++msgstr "Ðе Ñчитывать заново ключ при перезапуÑке"
++
++msgid "Don't require client certificate"
++msgstr "Ðе требовать Ñертификат у клиента"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "Ðе иÑпользовать адаптивное Ñжатие LZO"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr "Ðе извещать об ошибках ifconfig"
++
++msgid "Echo parameters to log"
++msgstr "Выводить параметры в журнал"
++
++msgid "Empirically measure MTU"
++msgstr "ЭмпиричеÑки измерÑÑ‚ÑŒ MTU"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "Включить поддержку аппаратного ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ OpenSSL"
++
++msgid "Enable Path MTU discovery"
++msgstr "Включить обнаружение пути MTU (PMTUD)"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr "Включить шифрование Ñ Ð¿Ð¾ÑтоÑнным ключом (не TLS)"
++
++msgid "Enable TLS and assume client role"
++msgstr "Включить TLS в режиме клиента"
++
++msgid "Enable TLS and assume server role"
++msgstr "Включить TLS в режиме Ñервера"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Включить внутреннюю фрагментацию дейтаграмм"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr "Включить Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° <em>IP</em> <em>порту</em>"
++
++msgid "Enabled"
++msgstr "Включено"
++
++msgid "Encryption cipher for packets"
++msgstr "Шифрование Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑ‚Ð¾Ð²"
++
++msgid "Execute shell cmd after routes are added"
++msgstr "Выполнить shell-команду поÑле Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¾Ð²"
++
++msgid "Execute shell command on remote ip change"
++msgstr "Выполнить shell-команду при изменении IP-адреÑа удалённого хоÑта"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++"ВыполнÑетÑÑ Ð² режиме Ñервера при поÑвлении новых клиентÑких Ñоединений, еÑли "
++"к клиенту ещё нет довериÑ"
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++"ВыполнÑетÑÑ Ð² режиме Ñервера, когда адреÑ/маршрут IPv4 или MAC-Ð°Ð´Ñ€ÐµÑ "
++"добавлен в таблицу маршрутизации OpenVPN"
++
++msgid "Exit on TLS negotiation failure"
++msgstr "Выйти при ошибке ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ TLS"
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr "Получить пароль PEM от управлÑющей конÑоли перед уходом в фон"
++
++msgid "HMAC authentication for packets"
++msgstr "HMAC-Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑ‚Ð¾Ð²"
++
++msgid "Handling of authentication failures"
++msgstr "Обработка ошибок аутентификации"
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++"Ð’ÑÐ¿Ð¾Ð¼Ð¾Ð³Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð° Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ --ping и --ping-restart в "
++"конфигурациÑÑ… Ñерверного режима"
++
++msgid "If hostname resolve fails, retry"
++msgstr "ПытатьÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ подключитьÑÑ Ð¿Ñ€Ð¸ ошибке Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ хоÑта"
++
++msgid "Instance \"%s\""
++msgstr "ПроцеÑÑ \"%s\""
++
++msgid "Invalid"
++msgstr "Ðеверный"
++
++msgid "Keep local IP address on restart"
++msgstr "Ðе изменÑÑ‚ÑŒ локальный IP-Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¸ перезапуÑке"
++
++msgid "Keep remote IP address on restart"
++msgstr "Ðе изменÑÑ‚ÑŒ удалённый IP-Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¸ перезапуÑке"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "Ðе закрывать уÑтройÑтво tun/tap при перезапуÑке"
++
++# Может "Окно перехода ключей", надо Ñмотреть контекÑÑ‚
++#, fuzzy
++msgid "Key transition window"
++msgstr "Окно передачи ключей"
++
++msgid "Limit repeated log messages"
++msgstr "Ограничить повторÑющиеÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð°"
++
++msgid "Local certificate"
++msgstr "Локальный Ñертификат"
++
++msgid "Local host name or ip address"
++msgstr "Ð˜Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ хоÑта или IP-адреÑ"
++
++msgid "Local private key"
++msgstr "Локальный Ñекретный ключ"
++
++msgid "Major mode"
++msgstr "ОÑновной режим"
++
++msgid "Make tun device IPv6 capable"
++msgstr "Включить поддержку IPv6 Ð´Ð»Ñ ÑƒÑтройÑтва tun"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "МакÑимальное количеÑтво иÑходÑщих TCP-пакетов в очереди"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "КоличеÑтво выделенных широковещательных буферов"
++
++msgid "Number of lines for log file history"
++msgstr "КоличеÑтво Ñтрок в файле журнала"
++
++msgid "Only accept connections from given X509 name"
++msgstr "Принимать ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ от данного имени X509"
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++"Обрабатывать таймаут ping-запроÑов только в Ñлучае, когда ÑущеÑтвует "
++"необходимый маршрут"
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "ПроцеÑÑÑ‹ OpenVPN"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "Оптимизировать запиÑÑŒ TUN/TAP/UDP"
++
++msgid "Output to syslog and do not daemonize"
++msgstr "Выводить ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² ÑиÑтемный журнал и не переходить в фоновый режим"
++
++msgid "Overview"
++msgstr "Обзор"
++
++msgid "PKCS#12 file containing keys"
++msgstr "Файл Ñ ÐºÐ»ÑŽÑ‡Ð°Ð¼Ð¸ PKCS#12"
++
++msgid "Pass environment variables to script"
++msgstr "Передавать переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñкрипту"
++
++msgid "Persist replay-protection state"
++msgstr "СохранÑÑ‚ÑŒ ÑоÑтоÑние защищённого ответа"
++
++#, fuzzy
++msgid "Persist/unpersist ifconfig-pool"
++msgstr "СохранÑÑ‚ÑŒ/не ÑохранÑÑ‚ÑŒ пул ifconfig"
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr "ВыполнÑÑ‚ÑŒ ping каждые n Ñекунд, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð¾Ñ€Ñ‚ TCP/UDP"
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr "Уровень безопаÑноÑти Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… программ и Ñкриптов"
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Protocol"
++msgstr "Протокол"
++
++msgid "Proxy timeout in seconds"
++msgstr "Таймаут прокÑи (Ñек.)"
++
++msgid "Push an ifconfig option to remote"
++msgstr "Передавать опцию ifconfig удалённой Ñтороне"
++
++msgid "Push options to peer"
++msgstr "Передавать опции пиру"
++
++msgid "Query management channel for private key"
++msgstr "ЗапроÑить канал ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¾Ð³Ð¾ ключа"
++
++msgid "Randomly choose remote server"
++msgstr "Случайно выбирать удалённый Ñервер"
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++"Разорвать Ñоединение, еÑли пользовательÑÐºÐ°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° отÑутÑтвует"
++
++msgid "Remap SIGUSR1 signals"
++msgstr "Обрабатывать Ñигнал SIGUSR1"
++
++msgid "Remote host name or ip address"
++msgstr "Ð˜Ð¼Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ хоÑта или IP-адреÑ"
++
++msgid "Remote ping timeout"
++msgstr "Таймаут удалённых ping-запроÑов"
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr "ПереÑоглаÑовать ключ канала данных поÑле кол-ва байт"
++
++msgid "Renegotiate data chan. key after packets"
++msgstr "ПереÑоглаÑовать ключ канала данных поÑле кол-ва пакетов"
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr "ПереÑоглаÑовать ключ канала данных поÑле кол-ва Ñекунд"
++
++#, fuzzy
++msgid "Replay protection sliding window size"
++msgstr "Размер ÑкользÑщего окна защиты от повторов"
++
++msgid "Require explicit designation on certificate"
++msgstr "Требовать Ñвного ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð² Ñертификате"
++
++msgid "Require explicit key usage on certificate"
++msgstr "Требовать Ñвного иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° в Ñертификате"
++
++msgid "Restart after remote ping timeout"
++msgstr "Ðачать заново поÑле таймаута ping-запроÑа"
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr "Таймаут повторной отправки канала ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ TLS"
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "ПоÑтоÑнно пытатьÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ подключитьÑÑ Ð¿Ñ€Ð¸ ошибке HTTP-прокÑи"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr "ПоÑтоÑнно пытатьÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ подключитьÑÑ Ð¿Ñ€Ð¸ ошибке Socks-прокÑи"
++
++msgid "Route subnet to client"
++msgstr "Перенаправить подÑеть клиенту"
++
++msgid "Run as an inetd or xinetd server"
++msgstr "ЗапуÑтить как inetd- или xinetd-Ñервер"
++
++msgid "Run script cmd on client connection"
++msgstr "Выполнить Ñкрипт при подключении клиента"
++
++msgid "Run script cmd on client disconnection"
++msgstr "Выполнить Ñкрипт при отключении клиента"
++
++msgid "Run up/down scripts for all restarts"
++msgstr "ЗапуÑкать up/down Ñкрипты Ð´Ð»Ñ Ð²Ñех перезапуÑков"
++
++msgid "Send notification to peer on disconnect"
++msgstr "ПоÑлать уведомление пиру при разъединении"
++
++msgid "Set GID to group"
++msgstr "УÑтановить GID группе"
++
++msgid "Set TCP/UDP MTU"
++msgstr "УÑтановить TCP/UDP MTU"
++
++msgid "Set UID to user"
++msgstr "УÑтановить UID пользователю"
++
++#, fuzzy
++msgid "Set aside a pool of subnets"
++msgstr "УÑтановить пул подÑетей"
++
++msgid "Set extended HTTP proxy options"
++msgstr "УÑтановить раÑширенные наÑтройки HTTP-прокÑи"
++
++msgid "Set output verbosity"
++msgstr "УÑтановить уровень вывода"
++
++msgid "Set size of real and virtual address hash tables"
++msgstr "УÑтановить размер реальной и виртуальной хеш-таблиц"
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "УÑтановить размер буфера приёма TCP/UDP"
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr "УÑтановить размер буфера передачи TCP/UDP"
++
++msgid "Set tun/tap TX queue length"
++msgstr "УÑтановить размер очереди передачи tun/tap"
++
++msgid "Set tun/tap adapter parameters"
++msgstr "УÑтановить параметры адаптера tun/tap"
++
++msgid "Set tun/tap device MTU"
++msgstr "УÑтановить MTU Ð´Ð»Ñ tun/tap уÑтройÑтва"
++
++msgid "Set tun/tap device overhead"
++msgstr "УÑтановить накладные раÑходы tun/tap уÑтройÑтва"
++
++msgid "Set upper bound on TCP MSS"
++msgstr "УÑтановить верхнюю границу Ð´Ð»Ñ TCP MSS"
++
++msgid "Shaping for peer bandwidth"
++msgstr "Шейпинг пропуÑкной ÑпоÑобноÑти пира"
++
++msgid "Shell cmd to execute after tun device open"
++msgstr "Выполнить shell-команду поÑле Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ ÑƒÑтройÑтва tun"
++
++msgid "Shell cmd to run after tun device close"
++msgstr "Выполнить shell-команду поÑле Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ ÑƒÑтройÑтва tun"
++
++msgid "Shell command to verify X509 name"
++msgstr "Shell-команда Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ имени X509"
++
++msgid "Silence the output of replay warnings"
++msgstr "Заглушить вывод предупреждений повторов"
++
++msgid "Size of cipher key"
++msgstr "Размер ключа шифрованиÑ"
++
++msgid "Specify a default gateway for routes"
++msgstr "УÑтановить шлюз по умолчанию Ð´Ð»Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¾Ð²"
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr "ЗапуÑтить OpenVPN в ÑпÑщем режиме"
++
++msgid "Start/Stop"
++msgstr "Старт/Стоп"
++
++msgid "Started"
++msgstr "Запущено"
++
++msgid "Status file format version"
++msgstr "ВерÑÐ¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° ÑтатуÑного файла"
++
++msgid "Switch to advanced configuration »"
++msgstr "Перейти к раÑширенным наÑтройкам »"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "Ðомер локального и удалённого TCP/UDP порта"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "Ðомер локального TCP/UDP порта (1194 по умолчанию)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "Ðомер удалённого TCP/UDP порта (1194 по умолчанию)"
++
++msgid "TLS cipher"
++msgstr "Шифр TLS"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr "ПропуÑк ToS (только Ð´Ð»Ñ IPv4)"
++
++msgid "Temporary directory for client-connect return file"
++msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° возрата Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°"
++
++msgid "Timeframe for key exchange"
++msgstr "Временное окно Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° ключами"
++
++msgid "Type of used device"
++msgstr "Тип иÑпользуемого уÑтройÑтва"
++
++msgid "Use fast LZO compression"
++msgstr "ИÑпользовать быÑтрое Ñжатие LZO"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "ИÑпользовать адреÑа вмеÑто подÑетей /30"
++
++msgid "Use protocol"
++msgstr "ИÑпользовать протокол"
++
++msgid "Use tun/tap device node"
++msgstr "ИÑпользовать файл уÑтройÑтва tun/tap"
++
++msgid "Use username as common name"
++msgstr "ИÑпользовать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ðº общее имÑ"
++
++msgid "Write log to file"
++msgstr "ЗапиÑать журнал в файл"
++
++msgid "Write process ID to file"
++msgstr "ЗапиÑать ID процеÑÑа в файл"
++
++msgid "Write status to file every n seconds"
++msgstr "ЗапиÑывать ÑÑ‚Ð°Ñ‚ÑƒÑ Ð² файл каждые n Ñекунд"
++
++msgid "no"
++msgstr "нет"
++
++msgid "tun/tap device"
++msgstr "уÑтройÑтво tun/tap"
++
++msgid "tun/tap inactivity timeout"
++msgstr "таймаут проÑÑ‚Ð¾Ñ tun/tap"
++
++msgid "yes (%i)"
++msgstr "да (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "« Перейти к оÑновным наÑтройкам"
++
++#~ msgid "Cryptography"
++#~ msgstr "КриптографиÑ"
++
++#~ msgid "Networking"
++#~ msgstr "Сеть"
++
++#~ msgid "Service"
++#~ msgstr "Служба"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
++
++#~ msgid "openvpn_%s"
++#~ msgstr "openvpn_%s"
++
++#~ msgid "openvpn_%s_desc"
++#~ msgstr "openvpn_%s_опиÑание"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/sk/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/sk/openvpn.po
+new file mode 100644
+index 0000000..7c885a8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/sk/openvpn.po
+@@ -0,0 +1,534 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr ""
++
++msgid "Allow multiple clients with same certificate"
++msgstr ""
++
++msgid "Allow only one session"
++msgstr ""
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr ""
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN instances"
++msgstr ""
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr ""
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr ""
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr ""
++
++msgid "« Switch to basic configuration"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/sv/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/sv/openvpn.po
+new file mode 100644
+index 0000000..c4e30ac
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/sv/openvpn.po
+@@ -0,0 +1,535 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr ""
++
++msgid "Allow multiple clients with same certificate"
++msgstr ""
++
++msgid "Allow only one session"
++msgstr ""
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr ""
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN instances"
++msgstr ""
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr ""
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr ""
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr ""
++
++msgid "« Switch to basic configuration"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/templates/openvpn.pot b/feeds/luci/applications/luci-app-openvpn/po/templates/openvpn.pot
+new file mode 100644
+index 0000000..8fa13d1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/templates/openvpn.pot
+@@ -0,0 +1,527 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr ""
++
++msgid "Allow multiple clients with same certificate"
++msgstr ""
++
++msgid "Allow only one session"
++msgstr ""
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr ""
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN instances"
++msgstr ""
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr ""
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr ""
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr ""
++
++msgid "« Switch to basic configuration"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/tr/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/tr/openvpn.po
+new file mode 100644
+index 0000000..dcb0ec4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/tr/openvpn.po
+@@ -0,0 +1,534 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr ""
++
++msgid "Allow multiple clients with same certificate"
++msgstr ""
++
++msgid "Allow only one session"
++msgstr ""
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr ""
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN instances"
++msgstr ""
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr ""
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr ""
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr ""
++
++msgid "« Switch to basic configuration"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/uk/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/uk/openvpn.po
+new file mode 100644
+index 0000000..e603237
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/uk/openvpn.po
+@@ -0,0 +1,538 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-11-30 09:14+0200\n"
++"Last-Translator: Pavel <pavel.gumenyuk@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr "Дозволити обмін трафіком між клієнтами"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Дозволити декілька клієнтів з однаковим Ñертифікатом"
++
++msgid "Allow only one session"
++msgstr "Дозволити лише одну ÑеÑÑ–ÑŽ"
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr ""
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN instances"
++msgstr ""
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr ""
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr ""
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr ""
++
++msgid "« Switch to basic configuration"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/vi/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/vi/openvpn.po
+new file mode 100644
+index 0000000..2c19e69
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/vi/openvpn.po
+@@ -0,0 +1,540 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:58+0200\n"
++"PO-Revision-Date: 2009-08-16 12:27+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p', or 'subnet'"
++
++msgid "Accept options pushed from server"
++msgstr "Chấp nhận tùy chá»n được đảy từ server"
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr "Thêm tuyến sau khi kết nối thành lập"
++
++msgid "Additional authentication over TLS"
++msgstr "Xác thực bổ xung trên TLS"
++
++msgid "Allow client-to-client traffic"
++msgstr "Cho phép lưu thông đối tượng - đến - đối tượng"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "Cho phép nhiá»u đối tượng vá»›i cùng má»™t chứng chỉ"
++
++msgid "Allow only one session"
++msgstr "Chỉ cho phép một session"
++
++msgid "Allow remote to change its IP or port"
++msgstr "Cho phép đối tượng ngoài vùng thay đổi IP hoặc cổng"
++
++msgid "Allowed maximum of connected clients"
++msgstr "Cho phép tối đa đối tượng kết nối mới là"
++
++msgid "Allowed maximum of internal"
++msgstr "Internal tối đa được cho phép"
++
++msgid "Allowed maximum of new connections"
++msgstr "Cho phép tối đa kết nối mới là"
++
++msgid "Append log to file"
++msgstr "Nối thêm log lên tập tin"
++
++msgid "Authenticate using username/password"
++msgstr "Xác thực username/password đang sử dụng"
++
++msgid "Automatically redirect default route"
++msgstr "Tự động chuyển hướng tuyến mặc định"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++"Dưới đây là một list của OpenVPN instances đã được cấu hình và tình trạng "
++"hiện tại"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr "Call down cmd/script trước khi TUN/TAP đóng"
++
++msgid "Certificate authority"
++msgstr "Giấy chứng nhận ủy quyá»n"
++
++msgid "Change process priority"
++msgstr "Thay đổi quy trình ưu tiên"
++
++msgid "Change to directory before initialization"
++msgstr "Chuyển qua thư mục trước khi khởi tạo"
++
++msgid "Check peer certificate against a CRL"
++msgstr "Kiểm tra chứng chỉ đối tác với một CRL"
++
++msgid "Chroot to directory after initialization"
++msgstr "Chroot vào thư mục sau khi khởi tạo"
++
++msgid "Client is disabled"
++msgstr "Äối tượng bị vô hiệu hóa"
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr "Äịnh cấu hình chế Ä‘á»™ đối tượng "
++
++msgid "Configure server bridge"
++msgstr "Äịnh cấu hình cầu nối server"
++
++msgid "Configure server mode"
++msgstr "Äịnh cấu hình chế Ä‘á»™ server"
++
++msgid "Connect through Socks5 proxy"
++msgstr "Kết nối qua Socks5 proxy"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr "Khoảng thử kết nối"
++
++msgid "Daemonize after initialization"
++msgstr "Daemonize sau khi khởi tạo"
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr "Trì hoãn tun/tap mở và up script execution"
++
++msgid "Diffie Hellman parameters"
++msgstr "Tham số Diffie Hellman "
++
++msgid "Directory for custom client config files"
++msgstr "Dạnh mục cho các tập tin config đối tương tùy chỉnh"
++
++msgid "Disable Paging"
++msgstr "Vô hiệu hóa Paging"
++
++msgid "Disable cipher initialisation vector"
++msgstr "Vô hiệu hóa cipher initialisation vector"
++
++msgid "Disable options consistency check"
++msgstr "Vô hiệu hóa tùy chá»n kiểm tra nhất quán"
++
++msgid "Disable replay protection"
++msgstr "Vô hiệu hóa replay protection"
++
++msgid "Do not bind to local address and port"
++msgstr "Äừng đóng kết địa chỉ địa phÆ°Æ¡ng và cổng"
++
++msgid "Don't actually execute ifconfig"
++msgstr "Äừng thá»±c sá»± thá»±c hiện ifconfig"
++
++msgid "Don't add routes automatically"
++msgstr "Äừng tá»± Ä‘á»™ng thêm vào Ä‘Æ°á»ng dẫn"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr "Don't cache --askpass or --auth-user-pass passwords"
++
++msgid "Don't inherit global push options"
++msgstr "Äừng thừa hưởng tùy chá»n đẩy toàn cầu"
++
++msgid "Don't log timestamps"
++msgstr "Äừng log timestamps"
++
++msgid "Don't re-read key on restart"
++msgstr "Äừng Ä‘á»c lại key ở chế Ä‘á»™ khởi Ä‘á»™ng "
++
++msgid "Don't require client certificate"
++msgstr "Äừng yêu câu chứng chỉ đối tượng"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "Äừng dùng bá»™ nén lzo thích ứng"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr "Äừng cảnh báo vá» sá»± không nhất quán của ifconfig"
++
++msgid "Echo parameters to log"
++msgstr "Báo tham số lên log"
++
++msgid "Empirically measure MTU"
++msgstr "Äo MTU"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "Kích hoạt OpenSSL hardware crypto engines"
++
++msgid "Enable Path MTU discovery"
++msgstr "Kích hoạt khám phá Ä‘Æ°á»ng dẫn MTU"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr "Kích hoạt chế độ mã hóa khóa tĩnh (non-TLS)"
++
++msgid "Enable TLS and assume client role"
++msgstr "Kích hoạt TLS và giả định vải trò của client"
++
++msgid "Enable TLS and assume server role"
++msgstr "Kích hoạt TLS và giả định vải trò của server"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "Kích hoạt internal datagram fragmentation"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr "Kích hoạt giao diện Ä‘iá»u hành trên <em>IP</em> <em>cổng</em>"
++
++msgid "Enabled"
++msgstr "Kích hoạt "
++
++msgid "Encryption cipher for packets"
++msgstr "Encryption cipher cho các gói"
++
++msgid "Execute shell cmd after routes are added"
++msgstr "Thực hiện shell cmd sau khi tuyến đã thêm vào"
++
++msgid "Execute shell command on remote ip change"
++msgstr "Thực hiện lệnh shell trên ip thay đổi từ xa"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr "Exit trên TLS khi thương lượng thất bại"
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr "Lấy mật mã PEM từ Ä‘iá»u khiển tty trÆ°á»›c khi chúng ta daemonize"
++
++msgid "HMAC authentication for packets"
++msgstr "Sự xác thực HMAC cho gói"
++
++msgid "Handling of authentication failures"
++msgstr "Xử lý những sai soát khi xác thực "
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr "Nếu hostname resolve thất bại, thử lại"
++
++msgid "Instance \"%s\""
++msgstr "Instance \"%s\""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr "Giữ địa chỉ IP ở chế độ khởi động"
++
++msgid "Keep remote IP address on restart"
++msgstr "Giữ remote địa chỉ IP ở chế độ khởi động"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "Giữ công cụ tun/tap mở khi khởi động lại "
++
++msgid "Key transition window"
++msgstr "Key transition window"
++
++msgid "Limit repeated log messages"
++msgstr "Giới hạn lập log tin nhắn"
++
++msgid "Local certificate"
++msgstr "Chứng chỉ địa phương"
++
++msgid "Local host name or ip address"
++msgstr "Tên host địa phương và địa chỉ IP"
++
++msgid "Local private key"
++msgstr "Phím bảo mật địa phương"
++
++msgid "Major mode"
++msgstr "Chế độ chính"
++
++msgid "Make tun device IPv6 capable"
++msgstr "Làm cho tun công cụ IPv6 có khả năng"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "Số lượng tối đa của queued TCP output packets"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "Số lượng phân bổ phát sóng buffers"
++
++msgid "Number of lines for log file history"
++msgstr "Số dòng cho tập tin log history"
++
++msgid "Only accept connections from given X509 name"
++msgstr "Chỉ chấp nhận kết nối từ những tên X509 cho sẵn"
++
++msgid "Only process ping timeouts if routes exist"
++msgstr "Chỉ xử lý ping timouts nếu tuyến tồn tại"
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "OpenVPN instances"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "Tối ưu hóa TUN/TAP/UDP writes"
++
++msgid "Output to syslog and do not daemonize"
++msgstr "Output tới syslog và đừng daemonize"
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr "PKCS # 12 tập tin có chứa key"
++
++msgid "Pass environment variables to script"
++msgstr "Bá» qua yếu tố môi trÆ°á»ng tá»›i script"
++
++msgid "Persist replay-protection state"
++msgstr "Tiếp tục tình trạng replay-protection"
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr "Persist/unpersist ifconfig-pool"
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr "Ping remote mỗi n giây trên cổng TCP/UDP"
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr "Cổng"
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Proxy timeout in seconds"
++msgstr "Proxy timeout in seconds"
++
++msgid "Push an ifconfig option to remote"
++msgstr "Äảy má»™t tùy chá»n ifconfig tá»›i remote"
++
++msgid "Push options to peer"
++msgstr "Äẩy lá»±a chá»n cho đối tác"
++
++msgid "Query management channel for private key"
++msgstr "Tra vấn kênh Ä‘iá»u hành cho phím bảo mật "
++
++msgid "Randomly choose remote server"
++msgstr "Ngẫu nhiên chá»n server ngoài vùng"
++
++msgid "Refuse connection if no custom client config"
++msgstr "Từ chối kết nối nêu không có config đối tượng tùy chỉnh"
++
++msgid "Remap SIGUSR1 signals"
++msgstr "Remap tín hiệu SIGUSR1"
++
++msgid "Remote host name or ip address"
++msgstr "Tên host ngoài vùng và địa chỉ IP"
++
++msgid "Remote ping timeout"
++msgstr "PING timeout từ xa"
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr "Thương lượng lại data chan. key sau bytes"
++
++msgid "Renegotiate data chan. key after packets"
++msgstr "Thương lượng lại data chan. key sau packets"
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr "Thương lượng lại data chan. key sau seconds"
++
++msgid "Replay protection sliding window size"
++msgstr "Replay chế độ bảo vệ kích thước window trượt"
++
++msgid "Require explicit designation on certificate"
++msgstr "Yêu cầu rõ ràng vỠgiấy chứng nhận "
++
++msgid "Require explicit key usage on certificate"
++msgstr "Yêu cầu key dùng rõ rãng trên chứng nhận"
++
++msgid "Restart after remote ping timeout"
++msgstr "Khởi động lại sau khi remote ping timeout"
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr "Retransmit timeout trên kênh kiểm soát TLS"
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "Thử lại trên HTTP proxy lỗi"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr "Thử lại trên Socks proxy lỗi"
++
++msgid "Route subnet to client"
++msgstr "Tuyến subnet tới khách hàng"
++
++msgid "Run as an inetd or xinetd server"
++msgstr "Chạy như inetd hoặc xinetd server"
++
++msgid "Run script cmd on client connection"
++msgstr "Chạy script cmd trên đối tượng kết nối"
++
++msgid "Run script cmd on client disconnection"
++msgstr "Chạy script cmd trên đối tượng không kết nối"
++
++msgid "Run up/down scripts for all restarts"
++msgstr "Chạy up/down scripts cho tất cả khởi động"
++
++msgid "Send notification to peer on disconnect"
++msgstr "Gửi thông báo cho bạn bè vỠngắt kết nối"
++
++msgid "Set GID to group"
++msgstr "Cài đặt GID tới nhóm"
++
++msgid "Set TCP/UDP MTU"
++msgstr "Cài đặt TCP/UDP MTU"
++
++msgid "Set UID to user"
++msgstr "Cài đặt UID tá»›i ngÆ°á»i dùng"
++
++msgid "Set aside a pool of subnets"
++msgstr "Äể sang má»™t bên má»™t pool của subnets"
++
++msgid "Set extended HTTP proxy options"
++msgstr "Thiết lập các tùy chá»n mở rá»™ng HTTP proxy"
++
++msgid "Set output verbosity"
++msgstr "Äặt output verbosity"
++
++msgid "Set size of real and virtual address hash tables"
++msgstr "Äặt dung lượng của bảng address hash thá»±c và ảo"
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "Äặt TCP/UDP nhận dung lượng buffer"
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr "Äặt TCP/UDP gá»­i dung lượng buffer"
++
++msgid "Set tun/tap TX queue length"
++msgstr "Äặt tun/tap Ä‘á»™ dài queue"
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr "Äặt công cụ tun/tap MTU"
++
++msgid "Set tun/tap device overhead"
++msgstr "Äặt thiết bị tun/tap overhead"
++
++msgid "Set upper bound on TCP MSS"
++msgstr "Äặt upper bound trên TCP MSS"
++
++msgid "Shaping for peer bandwidth"
++msgstr "Shaping cho peer bandwidth"
++
++msgid "Shell cmd to execute after tun device open"
++msgstr "Shell cmd để thực thi sau khi thiết bị tun mở"
++
++msgid "Shell cmd to run after tun device close"
++msgstr "Shell cmd để chạy sau khi thiết bị tun đóng"
++
++msgid "Shell command to verify X509 name"
++msgstr "Shell command để hợp thức hóa tên X509 "
++
++msgid "Silence the output of replay warnings"
++msgstr "Silence the output của các cảnh báo reply"
++
++msgid "Size of cipher key"
++msgstr "Dung lượng của cipher key"
++
++msgid "Specify a default gateway for routes"
++msgstr "Chỉ định một cổng mặc định cho tuyến"
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr "Bắt đầu OpenVPN trong một hibernating state"
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr "Bắt đầu"
++
++msgid "Status file format version"
++msgstr "Tình trạng tập tin phiên bản format"
++
++msgid "Switch to advanced configuration »"
++msgstr "Chuyển sang cấu hình cấp cao"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "Cổng TCP/UDP # cho cả địa phương và ngoài vùng"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "Cổng TCP/UDP # cho địa phương (default=1194)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "Cổng TCP/UDP # cho ngoài vùng (default=1194)"
++
++msgid "TLS cipher"
++msgstr "TLS cipher"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr "TOS passthrough (chỉ áp dụng cho IPv4)"
++
++msgid "Temporary directory for client-connect return file"
++msgstr "Danh mục tạm thá»i cho tập tin client-connect return"
++
++msgid "Timeframe for key exchange"
++msgstr "Timeframe cho trao đổi key"
++
++msgid "Type of used device"
++msgstr "Loại công cụ sử dụng"
++
++msgid "Use fast LZO compression"
++msgstr "Dùng LZO nén nhanh"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "Nên dùng địa chỉ cá nhân hơn là /30 subnets"
++
++msgid "Use protocol"
++msgstr "Dùng protocol"
++
++msgid "Use tun/tap device node"
++msgstr "Dùng chế độ công cụ tun/tap"
++
++msgid "Use username as common name"
++msgstr "Dùng tên đăng nhập nhÆ° tên thông thÆ°á»ng"
++
++msgid "Write log to file"
++msgstr "Viết log lên tập tin"
++
++msgid "Write process ID to file"
++msgstr "Viết xử lý ID lên tập tin"
++
++msgid "Write status to file every n seconds"
++msgstr "Viết tình trạng tới tập tin mỗi n giây"
++
++msgid "no"
++msgstr "không"
++
++msgid "tun/tap device"
++msgstr "Công cụ tun/tap"
++
++msgid "tun/tap inactivity timeout"
++msgstr "tun/tap timeout không có hành động"
++
++msgid "yes (%i)"
++msgstr "Có (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "Chuyển sang cấu hình căn bản"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/zh-cn/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/zh-cn/openvpn.po
+new file mode 100644
+index 0000000..1c210dc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/zh-cn/openvpn.po
+@@ -0,0 +1,552 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:35+0200\n"
++"PO-Revision-Date: 2013-10-10 06:09+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: QQ Group 75543259 <axishero@foxmail.com>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "%s"
++msgstr "%s"
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr "'net30', 'p2p', 或 'å­ç½‘'"
++
++msgid "Accept options pushed from server"
++msgstr "接å—从æœåŠ¡å™¨å‘é€è¿‡æ¥çš„选项"
++
++msgid "Add"
++msgstr "添加"
++
++msgid "Add route after establishing connection"
++msgstr "建立连接åŽæ·»åŠ è·¯ç”±"
++
++msgid "Additional authentication over TLS"
++msgstr "TLS以外的验è¯"
++
++msgid "Allow client-to-client traffic"
++msgstr "å…许客户端到客户端的通信"
++
++msgid "Allow multiple clients with same certificate"
++msgstr "å…许多用户共用åŒä¸€è¯ä¹¦"
++
++msgid "Allow only one session"
++msgstr "åªå…许一个会è¯"
++
++msgid "Allow remote to change its IP or port"
++msgstr "å…许远程修改ip和端å£"
++
++msgid "Allowed maximum of connected clients"
++msgstr "å…许最大已连接客户端数"
++
++msgid "Allowed maximum of internal"
++msgstr "å…许最大内部连接"
++
++msgid "Allowed maximum of new connections"
++msgstr "å…许最大新建连接数"
++
++msgid "Append log to file"
++msgstr "添加日志至文件"
++
++msgid "Authenticate using username/password"
++msgstr "以用户å/密ç çš„æ–¹å¼è¿›è¡ŒéªŒè¯"
++
++msgid "Automatically redirect default route"
++msgstr "自动é‡å®šå‘至默认路由"
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr "Openvpnå·²é…置实例åŠå…¶å½“å‰çŠ¶æ€åˆ—表"
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr "TUN/TAP关闭å‰å…³é—­å‘½ä»¤è¡ŒåŠè„šæœ¬"
++
++msgid "Certificate authority"
++msgstr "认è¯æŽˆæƒ"
++
++msgid "Change process priority"
++msgstr "改å˜è¿›ç¨‹ä¼˜å…ˆçº§"
++
++msgid "Change to directory before initialization"
++msgstr "åˆå§‹åŒ–å‰æ”¹å˜æ ¹ç›®å½•"
++
++msgid "Check peer certificate against a CRL"
++msgstr "验è¯å®¢æˆ·ç«¯è¯ä¹¦ä»¥ç¡®ä¿å…¶æ˜¯å¦è¿‡æœŸ"
++
++msgid "Chroot to directory after initialization"
++msgstr "åˆå§‹åŒ–åŽæ”¹å˜æ ¹ç›®å½•"
++
++msgid "Client is disabled"
++msgstr "客户端已被ç¦æ­¢"
++
++msgid "Configuration category"
++msgstr "é…置分类"
++
++msgid "Configure client mode"
++msgstr "é…置客户端模å¼"
++
++msgid "Configure server bridge"
++msgstr "é…ç½®æœåŠ¡å™¨æ¡¥æŽ¥"
++
++msgid "Configure server mode"
++msgstr "é…ç½®æœåŠ¡å™¨æ¨¡å¼"
++
++msgid "Connect through Socks5 proxy"
++msgstr "通过Sock5代ç†è¿žæŽ¥"
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr "通过HTTP代ç†è¿žæŽ¥åˆ°è¿œç¨‹ä¸»æœº"
++
++msgid "Connection retry interval"
++msgstr "连接é‡è¯•æ—¶é—´é—´éš”"
++
++msgid "Daemonize after initialization"
++msgstr "åˆå§‹åŒ–åŽè¿›å…¥åŽå°è¿è¡Œ"
++
++msgid "Delay n seconds after connection"
++msgstr "连接åŽå»¶è¿Ÿæ—¶é—´(秒)"
++
++msgid "Delay tun/tap open and up script execution"
++msgstr "延迟tun/tap的打开并加速脚本执行"
++
++msgid "Diffie Hellman parameters"
++msgstr "Diffie–Hellman/DHå¯†é’¥äº¤æ¢ å‚æ•°"
++
++msgid "Directory for custom client config files"
++msgstr "自定义客户端é…置文件的目录"
++
++msgid "Disable Paging"
++msgstr "ç¦æ­¢åˆ†é¡µ"
++
++msgid "Disable cipher initialisation vector"
++msgstr "关闭加密的åˆå§‹åŒ–å‘é‡"
++
++msgid "Disable options consistency check"
++msgstr "ç¦æ­¢é€‰é¡¹ä¸€è‡´æ€§æ£€æŸ¥"
++
++msgid "Disable replay protection"
++msgstr "关闭é‡æ’­ä¿æŠ¤"
++
++msgid "Do not bind to local address and port"
++msgstr "ä¸ç»‘定本地地å€å’Œç«¯å£"
++
++msgid "Don't actually execute ifconfig"
++msgstr "ä¸å®žé™…执行ifconfig命令"
++
++msgid "Don't add routes automatically"
++msgstr "ä¸è‡ªåŠ¨æ·»åŠ è·¯ç”±"
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr "ä¸ç¼“å­˜--askpass 或--auth-user-pass passwords"
++
++msgid "Don't inherit global push options"
++msgstr "ä¸ç»§æ‰¿å…¨å±€ä¸»åŠ¨å‘é€é€‰é¡¹"
++
++msgid "Don't log timestamps"
++msgstr "ä¸è®°å½•æ—¶é—´æˆ³"
++
++msgid "Don't re-read key on restart"
++msgstr "æœåŠ¡é‡å¯æ—¶ä¸é‡è¯»å¯†é’¥å€¼"
++
++msgid "Don't require client certificate"
++msgstr "ä¸éœ€è¦å®¢æˆ·çš„è¯ä¹¦"
++
++msgid "Don't use adaptive lzo compression"
++msgstr "ä¸ç”¨è‡ªé€‚应的lzo压缩"
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr "ifconfigä¸ä¸€è‡´æ—¶ä¸è­¦å‘Š"
++
++msgid "Echo parameters to log"
++msgstr "把å‚数写入日志"
++
++msgid "Empirically measure MTU"
++msgstr "以历å²å€¼ä¼°ç®—MTU值"
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr "打开OpenSSL硬件加密引擎"
++
++msgid "Enable Path MTU discovery"
++msgstr "å¯ç”¨è·¯å¾„MTUå‘现"
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr "å…许é™æ€å¯†é’¥åŠ å¯†æ¨¡å¼"
++
++msgid "Enable TLS and assume client role"
++msgstr "å…许TLS并伪装为客户端"
++
++msgid "Enable TLS and assume server role"
++msgstr "å…许TLS并伪装为æœåŠ¡å™¨"
++
++msgid "Enable internal datagram fragmentation"
++msgstr "å…许内部数æ®æŠ¥åˆ†ç‰‡"
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr "在<em>IP</em> <em>port</em>上å¯ç”¨å¯ç®¡ç†æŽ¥å£"
++
++msgid "Enabled"
++msgstr "å¯ç”¨"
++
++msgid "Encryption cipher for packets"
++msgstr "加密数æ®åŒ…"
++
++msgid "Execute shell cmd after routes are added"
++msgstr "添加路由åŽæ‰§è¡Œshell命令"
++
++msgid "Execute shell command on remote ip change"
++msgstr "当远程ip改å˜æ—¶æ‰§è¡Œshell命令"
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr "在æœåŠ¡å™¨æ¨¡å¼ä¸‹æ‰§è¡Œæ–°çš„客户端连接,当客户端ä»ç„¶æ˜¯ä¸å¯ä¿¡"
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++"æœåŠ¡å™¨æ¨¡å¼ä¸‹ï¼Œå°†æ¯ä¸ªIPv4地å€/路由或MAC地å€æ·»åŠ åˆ°OpenVPN的内部路由表中。"
++
++msgid "Exit on TLS negotiation failure"
++msgstr "TLS验è¯å¤±è´¥åŽé€€å‡º"
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr "åŽå°è¿è¡Œå‰ä»ŽæŽ§åˆ¶çš„tty中获å–PEM密ç "
++
++msgid "HMAC authentication for packets"
++msgstr "利用HMACæ°´å°ç®—法校验数æ®åŒ…"
++
++msgid "Handling of authentication failures"
++msgstr "处ç†éªŒè¯å¤±è´¥"
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr "在æœåŠ¡é…置模å¼ä¸‹Helper简明的执行--pingå’Œ--ping-restart"
++
++msgid "If hostname resolve fails, retry"
++msgstr "如果主机å解æžé”™è¯¯ï¼Œé‡è¯•"
++
++msgid "Instance \"%s\""
++msgstr "实例 \"%s\""
++
++msgid "Invalid"
++msgstr "无效"
++
++msgid "Keep local IP address on restart"
++msgstr "æœåŠ¡é‡å¯æ—¶ä¿æŒæœ¬åœ°IP地å€"
++
++msgid "Keep remote IP address on restart"
++msgstr "æœåŠ¡é‡å¯æ—¶ä¿æŒè¿œç¨‹IP地å€"
++
++msgid "Keep tun/tap device open on restart"
++msgstr "æœåŠ¡é‡å¯æ—¶è‡ªåŠ¨æ‰“å¼€ tun/tap 设备"
++
++msgid "Key transition window"
++msgstr "密钥传输滑动窗å£"
++
++msgid "Limit repeated log messages"
++msgstr "é™åˆ¶é‡å¤æ€§çš„日志消æ¯"
++
++msgid "Local certificate"
++msgstr "本地è¯ä¹¦"
++
++msgid "Local host name or ip address"
++msgstr "本地主机å或ip地å€"
++
++msgid "Local private key"
++msgstr "本地ç§äººå¯†é’¥"
++
++msgid "Major mode"
++msgstr "主è¦æ¨¡å¼"
++
++msgid "Make tun device IPv6 capable"
++msgstr "使 tun 设备兼容IPv6"
++
++msgid "Maximum number of queued TCP output packets"
++msgstr "TCP队列中输出包的最大数é‡"
++
++msgid "Number of allocated broadcast buffers"
++msgstr "已分é…的广播缓冲区数é‡"
++
++msgid "Number of lines for log file history"
++msgstr "历å²æ—¥å¿—文件的行数"
++
++msgid "Only accept connections from given X509 name"
++msgstr "åªæŽ¥æ”¶å·²ç»™å®šçš„X509å称的连接"
++
++msgid "Only process ping timeouts if routes exist"
++msgstr "当且仅当路由存在时处ç†ping超时"
++
++msgid "OpenVPN"
++msgstr "OpenVPN"
++
++msgid "OpenVPN instances"
++msgstr "OpenVPN 实例"
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr "优化 TUN/TAP/UDP 写入"
++
++msgid "Output to syslog and do not daemonize"
++msgstr "显å¼è¾“出到syslog"
++
++msgid "Overview"
++msgstr "概览"
++
++msgid "PKCS#12 file containing keys"
++msgstr "PKCS#12文件包å«çš„密钥"
++
++msgid "Pass environment variables to script"
++msgstr "传递环境å˜é‡è‡³è„šæœ¬"
++
++msgid "Persist replay-protection state"
++msgstr "ä¿å­˜é‡æ’­ä¿æŠ¤çš„状æ€"
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr "æŒä¹…/éžæŒä¹…ifconfigæ± "
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr "æ¯n秒ping一次远程 TCP/UDP 端å£"
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr "外部程åºå’Œè„šæœ¬è¶…出了策略å…许的使用范围"
++
++msgid "Port"
++msgstr "端å£"
++
++msgid "Protocol"
++msgstr "åè®®"
++
++msgid "Proxy timeout in seconds"
++msgstr "代ç†è¶…时,å•ä½ç§’"
++
++msgid "Push an ifconfig option to remote"
++msgstr "主动å‘远程å‘é€ifconfig选项"
++
++msgid "Push options to peer"
++msgstr "主动å‘端点å‘é€é€‰é¡¹"
++
++msgid "Query management channel for private key"
++msgstr "为ç§äººå¯†é’¥æŸ¥è¯¢ç®¡ç†é€šé“"
++
++msgid "Randomly choose remote server"
++msgstr "éšæœºé€‰æ‹©è¿œç¨‹æœåŠ¡å™¨"
++
++msgid "Refuse connection if no custom client config"
++msgstr "拒接没有自定义客户端é…置的连接"
++
++msgid "Remap SIGUSR1 signals"
++msgstr "é‡æ˜ å°„SIGUSR1ä¿¡å·"
++
++msgid "Remote host name or ip address"
++msgstr "远程主机å或ip地å€"
++
++msgid "Remote ping timeout"
++msgstr "远程ping超时"
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr "传输若干字节åŽé‡æ–°éªŒè¯æ•°æ®é€šé“密钥"
++
++msgid "Renegotiate data chan. key after packets"
++msgstr "传输若干数æ®åŒ…åŽé‡æ–°éªŒè¯æ•°æ®é€šé“密钥"
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr "传输若干秒åŽé‡æ–°éªŒè¯æ•°æ®é€šé“密钥"
++
++msgid "Replay protection sliding window size"
++msgstr "é‡æ’­ä¿æŠ¤çš„滑动窗å£å¤§å°"
++
++msgid "Require explicit designation on certificate"
++msgstr "è¯ä¹¦éœ€è¦æ˜¾å¼æŒ‡å®š"
++
++msgid "Require explicit key usage on certificate"
++msgstr "è¯ä¹¦éœ€è¦æ˜Žç¡®çš„密钥"
++
++msgid "Restart after remote ping timeout"
++msgstr "远程ping超时åŽé‡å¯"
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr "TLS控制通é“超时åŽé‡æ–°å‘é€"
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr "æ— é™é‡è¯•ç›´è‡³ä»£ç†æ­£ç¡®"
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr "æ— é™é‡è¯•ç›´è‡³Socks代ç†æ­£ç¡®"
++
++msgid "Route subnet to client"
++msgstr "路由å­ç½‘至客户端"
++
++msgid "Run as an inetd or xinetd server"
++msgstr "以inetd或xinetdæœåŠ¡å™¨çš„æ–¹å¼è¿è¡Œ"
++
++msgid "Run script cmd on client connection"
++msgstr "当客户端连接时在命令行下å…许脚本"
++
++msgid "Run script cmd on client disconnection"
++msgstr "当客户端断开时在命令行下å…许脚本"
++
++msgid "Run up/down scripts for all restarts"
++msgstr "æ¯æ¬¡é‡å¯éƒ½æ‰§è¡Œå¯åŠ¨/关闭脚本"
++
++msgid "Send notification to peer on disconnect"
++msgstr "断开连接时å‘客户端å‘é€é€šçŸ¥"
++
++msgid "Set GID to group"
++msgstr "为群组设置GID值"
++
++msgid "Set TCP/UDP MTU"
++msgstr "设置TCP/UDP的MTU值"
++
++msgid "Set UID to user"
++msgstr "为用户设置UID值"
++
++msgid "Set aside a pool of subnets"
++msgstr "设置为拒ç»å­ç½‘线程池模å¼"
++
++msgid "Set extended HTTP proxy options"
++msgstr "设置HTTP扩展代ç†é€‰é¡¹"
++
++msgid "Set output verbosity"
++msgstr "设置输出冗余级别"
++
++msgid "Set size of real and virtual address hash tables"
++msgstr "设置实际和虚拟地å€çš„哈希表大å°"
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr "设置TCP/UDP接收缓冲区大å°"
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr "设置TCP/UDPå‘é€ç¼“冲区大å°"
++
++msgid "Set tun/tap TX queue length"
++msgstr "设置tun/tapå‘é€é˜Ÿåˆ—长度"
++
++msgid "Set tun/tap adapter parameters"
++msgstr "设置tun/ tap适é…器å‚æ•°"
++
++msgid "Set tun/tap device MTU"
++msgstr "设置tun/tap设备的MTU值"
++
++msgid "Set tun/tap device overhead"
++msgstr "设置tun/tap设备的开销"
++
++msgid "Set upper bound on TCP MSS"
++msgstr "设置TCP MSS的上é™"
++
++msgid "Shaping for peer bandwidth"
++msgstr "改å˜ç»“点带宽"
++
++msgid "Shell cmd to execute after tun device open"
++msgstr "tun设备打开åŽè¿è¡Œshell命令行"
++
++msgid "Shell cmd to run after tun device close"
++msgstr "tun设备关闭åŽè¿è¡Œshell命令行e"
++
++msgid "Shell command to verify X509 name"
++msgstr "è¿è¡Œshell命令以验è¯X509å称"
++
++msgid "Silence the output of replay warnings"
++msgstr "以é™éŸ³çš„æ–¹å¼å‘出é‡æ’­è­¦å‘Š"
++
++msgid "Size of cipher key"
++msgstr "密钥大å°"
++
++msgid "Specify a default gateway for routes"
++msgstr "指定路由默认网关"
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr "以休眠的状æ€æ‰“å¼€OpenVPN"
++
++msgid "Start/Stop"
++msgstr "å¯åŠ¨/åœæ­¢"
++
++msgid "Started"
++msgstr "å·²è¿è¡Œçš„"
++
++msgid "Status file format version"
++msgstr "显å¼æ–‡ä»¶æ ¼å¼ç‰ˆæœ¬çš„状æ€"
++
++msgid "Switch to advanced configuration »"
++msgstr "高级é…ç½® »"
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr "TCP/UDP ç«¯å£ # åŒæ—¶é’ˆå¯¹æœ¬åœ°å’Œè¿œç¨‹"
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr "TCP/UDP ç«¯å£ # 本地 (默认 1194)"
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr "TCP/UDP ç«¯å£ # 远程 (默认 1194)"
++
++msgid "TLS cipher"
++msgstr "TLS加密"
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr "TOS ç©¿é€ (ä»…é™IPv4)"
++
++msgid "Temporary directory for client-connect return file"
++msgstr "客户端连接返回文件的临时目录"
++
++msgid "Timeframe for key exchange"
++msgstr "密钥交æ¢æ—¶é—´è¡¨"
++
++msgid "Type of used device"
++msgstr "使用设备类型"
++
++msgid "Use fast LZO compression"
++msgstr "使用快速LZO压缩"
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr "利用个人地å€ä»£æ›¿/30 å­ç½‘"
++
++msgid "Use protocol"
++msgstr "采用åè®®"
++
++msgid "Use tun/tap device node"
++msgstr "使用 tun/tap 设备节点"
++
++msgid "Use username as common name"
++msgstr "把用户å作为通用å称"
++
++msgid "Write log to file"
++msgstr "ä¿å­˜æ—¥å¿—至文件"
++
++msgid "Write process ID to file"
++msgstr "记录进程ID至文件"
++
++msgid "Write status to file every n seconds"
++msgstr "æ¯n秒åŽå†™çŠ¶æ€å€¼è‡³æ–‡ä»¶"
++
++msgid "no"
++msgstr "å¦"
++
++msgid "tun/tap device"
++msgstr "tun/tap 设备"
++
++msgid "tun/tap inactivity timeout"
++msgstr "tun/tap 休眠超时"
++
++msgid "yes (%i)"
++msgstr "是 (%i)"
++
++msgid "« Switch to basic configuration"
++msgstr "« 基本é…ç½®"
++
++#~ msgid "Cryptography"
++#~ msgstr "加密"
++
++#~ msgid "Networking"
++#~ msgstr "网络"
++
++#~ msgid "Service"
++#~ msgstr "æœåŠ¡"
++
++#~ msgid "VPN"
++#~ msgstr "VPN"
+diff --git a/feeds/luci/applications/luci-app-openvpn/po/zh-tw/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/zh-tw/openvpn.po
+new file mode 100644
+index 0000000..d010f4b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/po/zh-tw/openvpn.po
+@@ -0,0 +1,533 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "%s"
++msgstr ""
++
++msgid "'net30', 'p2p', or 'subnet'"
++msgstr ""
++
++msgid "Accept options pushed from server"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add route after establishing connection"
++msgstr ""
++
++msgid "Additional authentication over TLS"
++msgstr ""
++
++msgid "Allow client-to-client traffic"
++msgstr ""
++
++msgid "Allow multiple clients with same certificate"
++msgstr ""
++
++msgid "Allow only one session"
++msgstr ""
++
++msgid "Allow remote to change its IP or port"
++msgstr ""
++
++msgid "Allowed maximum of connected clients"
++msgstr ""
++
++msgid "Allowed maximum of internal"
++msgstr ""
++
++msgid "Allowed maximum of new connections"
++msgstr ""
++
++msgid "Append log to file"
++msgstr ""
++
++msgid "Authenticate using username/password"
++msgstr ""
++
++msgid "Automatically redirect default route"
++msgstr ""
++
++msgid "Below is a list of configured OpenVPN instances and their current state"
++msgstr ""
++
++msgid "Call down cmd/script before TUN/TAP close"
++msgstr ""
++
++msgid "Certificate authority"
++msgstr ""
++
++msgid "Change process priority"
++msgstr ""
++
++msgid "Change to directory before initialization"
++msgstr ""
++
++msgid "Check peer certificate against a CRL"
++msgstr ""
++
++msgid "Chroot to directory after initialization"
++msgstr ""
++
++msgid "Client is disabled"
++msgstr ""
++
++msgid "Configuration category"
++msgstr ""
++
++msgid "Configure client mode"
++msgstr ""
++
++msgid "Configure server bridge"
++msgstr ""
++
++msgid "Configure server mode"
++msgstr ""
++
++msgid "Connect through Socks5 proxy"
++msgstr ""
++
++msgid "Connect to remote host through an HTTP proxy"
++msgstr ""
++
++msgid "Connection retry interval"
++msgstr ""
++
++msgid "Daemonize after initialization"
++msgstr ""
++
++msgid "Delay n seconds after connection"
++msgstr ""
++
++msgid "Delay tun/tap open and up script execution"
++msgstr ""
++
++msgid "Diffie Hellman parameters"
++msgstr ""
++
++msgid "Directory for custom client config files"
++msgstr ""
++
++msgid "Disable Paging"
++msgstr ""
++
++msgid "Disable cipher initialisation vector"
++msgstr ""
++
++msgid "Disable options consistency check"
++msgstr ""
++
++msgid "Disable replay protection"
++msgstr ""
++
++msgid "Do not bind to local address and port"
++msgstr ""
++
++msgid "Don't actually execute ifconfig"
++msgstr ""
++
++msgid "Don't add routes automatically"
++msgstr ""
++
++msgid "Don't cache --askpass or --auth-user-pass passwords"
++msgstr ""
++
++msgid "Don't inherit global push options"
++msgstr ""
++
++msgid "Don't log timestamps"
++msgstr ""
++
++msgid "Don't re-read key on restart"
++msgstr ""
++
++msgid "Don't require client certificate"
++msgstr ""
++
++msgid "Don't use adaptive lzo compression"
++msgstr ""
++
++msgid "Don't warn on ifconfig inconsistencies"
++msgstr ""
++
++msgid "Echo parameters to log"
++msgstr ""
++
++msgid "Empirically measure MTU"
++msgstr ""
++
++msgid "Enable OpenSSL hardware crypto engines"
++msgstr ""
++
++msgid "Enable Path MTU discovery"
++msgstr ""
++
++msgid "Enable Static Key encryption mode (non-TLS)"
++msgstr ""
++
++msgid "Enable TLS and assume client role"
++msgstr ""
++
++msgid "Enable TLS and assume server role"
++msgstr ""
++
++msgid "Enable internal datagram fragmentation"
++msgstr ""
++
++msgid "Enable management interface on <em>IP</em> <em>port</em>"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption cipher for packets"
++msgstr ""
++
++msgid "Execute shell cmd after routes are added"
++msgstr ""
++
++msgid "Execute shell command on remote ip change"
++msgstr ""
++
++msgid ""
++"Executed in server mode on new client connections, when the client is still "
++"untrusted"
++msgstr ""
++
++msgid ""
++"Executed in server mode whenever an IPv4 address/route or MAC address is "
++"added to OpenVPN's internal routing table"
++msgstr ""
++
++msgid "Exit on TLS negotiation failure"
++msgstr ""
++
++msgid "Get PEM password from controlling tty before we daemonize"
++msgstr ""
++
++msgid "HMAC authentication for packets"
++msgstr ""
++
++msgid "Handling of authentication failures"
++msgstr ""
++
++msgid ""
++"Helper directive to simplify the expression of --ping and --ping-restart in "
++"server mode configurations"
++msgstr ""
++
++msgid "If hostname resolve fails, retry"
++msgstr ""
++
++msgid "Instance \"%s\""
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Keep local IP address on restart"
++msgstr ""
++
++msgid "Keep remote IP address on restart"
++msgstr ""
++
++msgid "Keep tun/tap device open on restart"
++msgstr ""
++
++msgid "Key transition window"
++msgstr ""
++
++msgid "Limit repeated log messages"
++msgstr ""
++
++msgid "Local certificate"
++msgstr ""
++
++msgid "Local host name or ip address"
++msgstr ""
++
++msgid "Local private key"
++msgstr ""
++
++msgid "Major mode"
++msgstr ""
++
++msgid "Make tun device IPv6 capable"
++msgstr ""
++
++msgid "Maximum number of queued TCP output packets"
++msgstr ""
++
++msgid "Number of allocated broadcast buffers"
++msgstr ""
++
++msgid "Number of lines for log file history"
++msgstr ""
++
++msgid "Only accept connections from given X509 name"
++msgstr ""
++
++msgid "Only process ping timeouts if routes exist"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN instances"
++msgstr ""
++
++msgid "Optimize TUN/TAP/UDP writes"
++msgstr ""
++
++msgid "Output to syslog and do not daemonize"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "PKCS#12 file containing keys"
++msgstr ""
++
++msgid "Pass environment variables to script"
++msgstr ""
++
++msgid "Persist replay-protection state"
++msgstr ""
++
++msgid "Persist/unpersist ifconfig-pool"
++msgstr ""
++
++msgid "Ping remote every n seconds over TCP/UDP port"
++msgstr ""
++
++msgid "Policy level over usage of external programs and scripts"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Proxy timeout in seconds"
++msgstr ""
++
++msgid "Push an ifconfig option to remote"
++msgstr ""
++
++msgid "Push options to peer"
++msgstr ""
++
++msgid "Query management channel for private key"
++msgstr ""
++
++msgid "Randomly choose remote server"
++msgstr ""
++
++msgid "Refuse connection if no custom client config"
++msgstr ""
++
++msgid "Remap SIGUSR1 signals"
++msgstr ""
++
++msgid "Remote host name or ip address"
++msgstr ""
++
++msgid "Remote ping timeout"
++msgstr ""
++
++msgid "Renegotiate data chan. key after bytes"
++msgstr ""
++
++msgid "Renegotiate data chan. key after packets"
++msgstr ""
++
++msgid "Renegotiate data chan. key after seconds"
++msgstr ""
++
++msgid "Replay protection sliding window size"
++msgstr ""
++
++msgid "Require explicit designation on certificate"
++msgstr ""
++
++msgid "Require explicit key usage on certificate"
++msgstr ""
++
++msgid "Restart after remote ping timeout"
++msgstr ""
++
++msgid "Retransmit timeout on TLS control channel"
++msgstr ""
++
++msgid "Retry indefinitely on HTTP proxy errors"
++msgstr ""
++
++msgid "Retry indefinitely on Socks proxy errors"
++msgstr ""
++
++msgid "Route subnet to client"
++msgstr ""
++
++msgid "Run as an inetd or xinetd server"
++msgstr ""
++
++msgid "Run script cmd on client connection"
++msgstr ""
++
++msgid "Run script cmd on client disconnection"
++msgstr ""
++
++msgid "Run up/down scripts for all restarts"
++msgstr ""
++
++msgid "Send notification to peer on disconnect"
++msgstr ""
++
++msgid "Set GID to group"
++msgstr ""
++
++msgid "Set TCP/UDP MTU"
++msgstr ""
++
++msgid "Set UID to user"
++msgstr ""
++
++msgid "Set aside a pool of subnets"
++msgstr ""
++
++msgid "Set extended HTTP proxy options"
++msgstr ""
++
++msgid "Set output verbosity"
++msgstr ""
++
++msgid "Set size of real and virtual address hash tables"
++msgstr ""
++
++msgid "Set the TCP/UDP receive buffer size"
++msgstr ""
++
++msgid "Set the TCP/UDP send buffer size"
++msgstr ""
++
++msgid "Set tun/tap TX queue length"
++msgstr ""
++
++msgid "Set tun/tap adapter parameters"
++msgstr ""
++
++msgid "Set tun/tap device MTU"
++msgstr ""
++
++msgid "Set tun/tap device overhead"
++msgstr ""
++
++msgid "Set upper bound on TCP MSS"
++msgstr ""
++
++msgid "Shaping for peer bandwidth"
++msgstr ""
++
++msgid "Shell cmd to execute after tun device open"
++msgstr ""
++
++msgid "Shell cmd to run after tun device close"
++msgstr ""
++
++msgid "Shell command to verify X509 name"
++msgstr ""
++
++msgid "Silence the output of replay warnings"
++msgstr ""
++
++msgid "Size of cipher key"
++msgstr ""
++
++msgid "Specify a default gateway for routes"
++msgstr ""
++
++msgid "Start OpenVPN in a hibernating state"
++msgstr ""
++
++msgid "Start/Stop"
++msgstr ""
++
++msgid "Started"
++msgstr ""
++
++msgid "Status file format version"
++msgstr ""
++
++msgid "Switch to advanced configuration »"
++msgstr ""
++
++msgid "TCP/UDP port # for both local and remote"
++msgstr ""
++
++msgid "TCP/UDP port # for local (default=1194)"
++msgstr ""
++
++msgid "TCP/UDP port # for remote (default=1194)"
++msgstr ""
++
++msgid "TLS cipher"
++msgstr ""
++
++msgid "TOS passthrough (applies to IPv4 only)"
++msgstr ""
++
++msgid "Temporary directory for client-connect return file"
++msgstr ""
++
++msgid "Timeframe for key exchange"
++msgstr ""
++
++msgid "Type of used device"
++msgstr ""
++
++msgid "Use fast LZO compression"
++msgstr ""
++
++msgid "Use individual addresses rather than /30 subnets"
++msgstr ""
++
++msgid "Use protocol"
++msgstr ""
++
++msgid "Use tun/tap device node"
++msgstr ""
++
++msgid "Use username as common name"
++msgstr ""
++
++msgid "Write log to file"
++msgstr ""
++
++msgid "Write process ID to file"
++msgstr ""
++
++msgid "Write status to file every n seconds"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "tun/tap device"
++msgstr ""
++
++msgid "tun/tap inactivity timeout"
++msgstr ""
++
++msgid "yes (%i)"
++msgstr ""
++
++msgid "« Switch to basic configuration"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-openvpn/root/etc/config/openvpn_recipes b/feeds/luci/applications/luci-app-openvpn/root/etc/config/openvpn_recipes
+new file mode 100644
+index 0000000..1b394df
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-openvpn/root/etc/config/openvpn_recipes
+@@ -0,0 +1,102 @@
++#
++# Routed point-to-point server
++#
++config openvpn_recipe server_tun_ptp
++ option _description "Simple server configuration for a routed point-to-point VPN"
++ option _role "server"
++ option dev "tun"
++ option ifconfig "10.0.0.1 10.0.0.2"
++ option secret "shared-secret.key"
++ option keepalive "10 60"
++ option comp_lzo "yes"
++ option verb "3"
++ option mssfix "1420"
++
++#
++# Routed point-to-point client
++#
++config openvpn_recipe client_tun_ptp
++ option _description "Simple client configuration for a routed point-to-point VPN"
++ option _role "client"
++ option dev "tun"
++ list remote "vpnserver.example.org"
++ option ifconfig "10.0.0.2 10.0.0.1"
++ option secret "shared-secret.key"
++ option nobind "1"
++ option comp_lzo "yes"
++ option verb "3"
++
++#
++# Routed multi-client server
++#
++config openvpn_recipe server_tun
++ option _description "Server configuration for a routed multi-client VPN"
++ option _role "server"
++ option dev "tun"
++ option server "10.0.100.0 255.255.255.0"
++ option ca "ca.crt"
++ option cert "server.crt"
++ option key "server.key"
++ option dh "dh1024.pem"
++ option keepalive "10 60"
++ option comp_lzo "yes"
++ option verb "3"
++ option mssfix "1420"
++
++#
++# Routed client
++#
++config openvpn_recipe client_tun
++ option _description "Client configuration for a routed multi-client VPN"
++ option _role "client"
++ option client "1"
++ option dev "tun"
++ list remote "vpnserver.example.org"
++ option pkcs12 "my_client.p12"
++ option remote_cert_tls "server"
++ option comp_lzo "yes"
++ option nobind "1"
++ option persist_key "1"
++ option persist_tun "1"
++ option verb "3"
++ option reneg_sec "0"
++ option float "1"
++
++#
++# Multi-client ethernet bridge server
++#
++config openvpn_recipe server_tap_bridge
++ option _description "Server configuration for an ethernet bridge VPN"
++ option _role "server"
++ option dev "tap"
++ option server_bridge "192.168.1.1 255.255.255.0 192.168.1.128 192.168.1.254"
++ option ca "ca.crt"
++ option cert "server.crt"
++ option key "server.key"
++ option dh "dh1024.pem"
++ option keepalive "10 60"
++ option comp_lzo "yes"
++ option verb "3"
++ option mssfix "1420"
++
++#
++# Ethernet bridge client
++#
++config openvpn_recipe client_tap_bridge
++ option _description "Client configuration for an ethernet bridge VPN"
++ option _role "client"
++ option client "1"
++ option dev "tap"
++ list remote "vpnserver.example.org"
++ option ca "ca.crt"
++ option cert "my_client.crt"
++ option key "my_client.key"
++ option dh "dh1024.pem"
++ option remote_cert_tls "server"
++ option comp_lzo "yes"
++ option nobind "1"
++ option persist_key "1"
++ option verb "3"
++ option reneg_sec "0"
++ option float "1"
++
+diff --git a/feeds/luci/applications/luci-app-p2pblock/Makefile b/feeds/luci/applications/luci-app-p2pblock/Makefile
+new file mode 100644
+index 0000000..4dbeb5e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for the Freifunk P2P-Block addon
++LUCI_DEPENDS:=+luci-app-firewall +freifunk-p2pblock
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-p2pblock/luasrc/controller/ff_p2pblock.lua b/feeds/luci/applications/luci-app-p2pblock/luasrc/controller/ff_p2pblock.lua
+new file mode 100644
+index 0000000..eaedda2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/luasrc/controller/ff_p2pblock.lua
+@@ -0,0 +1,9 @@
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.ff_p2pblock", package.seeall)
++
++function index()
++ entry({"admin", "network", "firewall", "p2pblock"}, cbi("luci_fw/p2pblock"),
++ _("P2P-Block"), 40)
++end
+diff --git a/feeds/luci/applications/luci-app-p2pblock/luasrc/model/cbi/luci_fw/p2pblock.lua b/feeds/luci/applications/luci-app-p2pblock/luasrc/model/cbi/luci_fw/p2pblock.lua
+new file mode 100644
+index 0000000..1f21429
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/luasrc/model/cbi/luci_fw/p2pblock.lua
+@@ -0,0 +1,66 @@
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local sys = require "luci.sys"
++
++m = Map("freifunk_p2pblock", translate("P2P-Block"),
++ translate("P2P-Block is a greylisting mechanism to block various peer-to-peer protocols for non-whitelisted clients."))
++
++s = m:section(NamedSection, "p2pblock", "settings", "Settings")
++s.anonymous = true
++s.addremove = false
++
++en = s:option(Flag, "_enabled", translate("Enable P2P-Block"))
++en.rmempty = false
++
++function en.cfgvalue()
++ return ( sys.init.enabled("freifunk-p2pblock") and "1" or "0" )
++end
++
++function en.write(self, section, val)
++ if val == "1" then
++ sys.init.enable("freifunk-p2pblock")
++ else
++ sys.init.disable("freifunk-p2pblock")
++ end
++end
++
++s:option(Value, "portrange", translate("Portrange"))
++
++s:option(Value, "blocktime", translate("Block Time"),
++ translate("seconds"))
++
++s:option(DynamicList, "whitelist", translate("Whitelisted IPs"))
++
++l7 = s:option(MultiValue, "layer7", translate("Layer7-Protocols"))
++l7.widget = "checkbox"
++l7:value("aim", "AIM Chat")
++l7:value("bittorrent", "Bittorrent")
++l7:value("edonkey", "eDonkey, eMule, Kademlia")
++l7:value("fasttrack", "Fasttrack Protocol")
++l7:value("ftp", "File Transfer Protocol")
++l7:value("gnutella", "Gnutella")
++l7:value("http", "Hypertext Transfer Protocol")
++l7:value("ident", "Ident Protocol")
++l7:value("irc", "Internet Relay Chat")
++l7:value("jabber", "Jabber/XMPP")
++l7:value("msnmessenger", "MSN Messenger")
++l7:value("ntp", "Network Time Protocol")
++l7:value("pop3", "POP3 Protocol")
++l7:value("smtp", "SMTP Protocol")
++l7:value("ssl", "SSL Protocol")
++l7:value("vnc", "VNC Protocol")
++
++ipp2p = s:option(MultiValue, "ipp2p", translate("IP-P2P"))
++ipp2p.widget = "checkbox"
++ipp2p:value("edk", "eDonkey, eMule, Kademlia")
++ipp2p:value("kazaa", "KaZaA, FastTrack")
++ipp2p:value("gnu", "Gnutella")
++ipp2p:value("dc", "Direct Connect")
++ipp2p:value("bit", "BitTorrent, extended BT")
++ipp2p:value("apple", "AppleJuice")
++ipp2p:value("winmx", "WinMX")
++ipp2p:value("soul", "SoulSeek")
++ipp2p:value("ares", "AresLite")
++
++return m
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/ca/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/ca/p2pblock.po
+new file mode 100644
+index 0000000..fe99a77
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/ca/p2pblock.po
+@@ -0,0 +1,46 @@
++# default.pot
++# generated from ./i18n/english/luasrc/i18n/default.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2011-02-14 17:43+0100\n"
++"Last-Translator: Manuel Munz <freifunk@somakoma.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "Block Time"
++msgstr "Temps de bloqueig"
++
++msgid "Enable P2P-Block"
++msgstr "Habilita el Blocat P2P"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Protocols de capa 7"
++
++msgid "P2P-Block"
++msgstr "Blocat P2P"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"El Blocat P2P és un mecanisme de llista grisa per blocar diversos protocols "
++"peer-tp-peer per clients que no estiguin a la llista blanca."
++
++msgid "Portrange"
++msgstr "Rang de ports"
++
++msgid "Whitelisted IPs"
++msgstr "IPs a la llista blanca"
++
++msgid "seconds"
++msgstr "segons"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/cs/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/cs/p2pblock.po
+new file mode 100644
+index 0000000..02eafef
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/cs/p2pblock.po
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-08-04 22:44+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Block Time"
++msgstr "Doba blokování"
++
++msgid "Enable P2P-Block"
++msgstr "Povolit P2P-Block"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Layer7-Protokoly"
++
++msgid "P2P-Block"
++msgstr "P2P-Block"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++
++msgid "Portrange"
++msgstr "Rozsah portů"
++
++msgid "Whitelisted IPs"
++msgstr "Povolené IP adresy"
++
++msgid "seconds"
++msgstr "sekundy"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/de/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/de/p2pblock.po
+new file mode 100644
+index 0000000..e3613d6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/de/p2pblock.po
+@@ -0,0 +1,44 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2011-02-14 17:44+0100\n"
++"Last-Translator: Manuel Munz <freifunk@somakoma.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid "Block Time"
++msgstr "Sperr-Zeitraum"
++
++msgid "Enable P2P-Block"
++msgstr "P2P-Sperr-Mechanismus aktivieren"
++
++msgid "IP-P2P"
++msgstr "IPP2P"
++
++msgid "Layer7-Protocols"
++msgstr "Layer7-Protokolle"
++
++msgid "P2P-Block"
++msgstr "P2P-Sperre"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"P2P-Block ist ein Mechanismus zum vorrübergehendem Sperren von Peer-to-Peer "
++"Protokollen für nicht auf der Whitelist stehende Clients. "
++
++msgid "Portrange"
++msgstr "Ãœberwachter Port-Bereich"
++
++msgid "Whitelisted IPs"
++msgstr "Freigeschaltete IP-Adressen"
++
++msgid "seconds"
++msgstr "Angabe in Sekunden"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/el/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/el/p2pblock.po
+new file mode 100644
+index 0000000..9db357a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/el/p2pblock.po
+@@ -0,0 +1,43 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-03-18 15:23+0200\n"
++"PO-Revision-Date: 2012-03-18 15:23+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Block Time"
++msgstr ""
++
++msgid "Enable P2P-Block"
++msgstr ""
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr ""
++
++msgid "P2P-Block"
++msgstr ""
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++
++msgid "Portrange"
++msgstr ""
++
++msgid "Whitelisted IPs"
++msgstr ""
++
++msgid "seconds"
++msgstr "δευτεÏόλεπτα"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/en/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/en/p2pblock.po
+new file mode 100644
+index 0000000..00cccc8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/en/p2pblock.po
+@@ -0,0 +1,28 @@
++msgid "Block Time"
++msgstr ""
++
++msgid "Enable P2P-Block"
++msgstr ""
++
++msgid "IP-P2P"
++msgstr ""
++
++msgid "Layer7-Protocols"
++msgstr ""
++
++msgid "P2P-Block"
++msgstr ""
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++
++msgid "Portrange"
++msgstr ""
++
++msgid "Whitelisted IPs"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/es/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/es/p2pblock.po
+new file mode 100644
+index 0000000..1edc533
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/es/p2pblock.po
+@@ -0,0 +1,45 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-08-19 16:56+0200\n"
++"PO-Revision-Date: 2012-08-19 16:56+0200\n"
++"Last-Translator: josevteg <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Block Time"
++msgstr "Tiempo de bloqueo"
++
++msgid "Enable P2P-Block"
++msgstr "Activar bloqueo P2P"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Protocolo Layer7"
++
++msgid "P2P-Block"
++msgstr "Bloqueo de P2P"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"El bloqueo de P2P es un mecanismo de lista gris para bloquear varios "
++"protocolos punto a punto a clientes que no están en lista blanca."
++
++msgid "Portrange"
++msgstr "Rango de puertos"
++
++msgid "Whitelisted IPs"
++msgstr "IPs en la lista blanca"
++
++msgid "seconds"
++msgstr "segundos"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/fr/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/fr/p2pblock.po
+new file mode 100644
+index 0000000..524d3d0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/fr/p2pblock.po
+@@ -0,0 +1,45 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-06-13 21:39+0200\n"
++"PO-Revision-Date: 2012-01-15 07:06+0200\n"
++"Last-Translator: desillu <ledesillusionniste@hotmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Block Time"
++msgstr "Temps de blocage"
++
++msgid "Enable P2P-Block"
++msgstr "Activer le blocage P2P"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Protocoles de couche 7"
++
++msgid "P2P-Block"
++msgstr "Blocage P2P"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"Le blocage P2P est un mécanisme de liste grise pour bloquer divers "
++"protocoles de pair-à-pair de clients non autorisés."
++
++msgid "Portrange"
++msgstr "Gamme de ports"
++
++msgid "Whitelisted IPs"
++msgstr "Adresses IP autorisées"
++
++msgid "seconds"
++msgstr "secondes"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/he/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/he/p2pblock.po
+new file mode 100644
+index 0000000..5b2679b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/he/p2pblock.po
+@@ -0,0 +1,43 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-10 03:39+0200\n"
++"Last-Translator: Snoof <sagim9@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Block Time"
++msgstr "זמן חסימה"
++
++msgid "Enable P2P-Block"
++msgstr "×פשר חסימת P2P"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "פרוטוקולי Layer7"
++
++msgid "P2P-Block"
++msgstr "חסימת P2P"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"חסימת P2P הינו מנגנון ליצירת 'רשימה ×פורה', במטרה ×œ×—×¡×•× ×¡×•×’×™× ×©×•× ×™× ×©×œ "
++"פרוטוקולי P2P עבור לקוחות ש××™× × ×‘'רשימה הלבנה'."
++
++msgid "Portrange"
++msgstr "טווח פורטי×"
++
++msgid "Whitelisted IPs"
++msgstr "כתובות IP ברשימה הלבנה"
++
++msgid "seconds"
++msgstr "שניות"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/hu/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/hu/p2pblock.po
+new file mode 100644
+index 0000000..4f1dffa
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/hu/p2pblock.po
+@@ -0,0 +1,43 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-01 19:16+0200\n"
++"Last-Translator: juhosg <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Block Time"
++msgstr "Blokkolási idő"
++
++msgid "Enable P2P-Block"
++msgstr "P2P-Block engedélyezése"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Layer7 protokollok"
++
++msgid "P2P-Block"
++msgstr "P2P-Block"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"A P2P-Block különféle peer-to-peer protokollok blokkolására szolgáló "
++"mechanizmus, a fehérlistában nem szereplő ügyfelek részére."
++
++msgid "Portrange"
++msgstr "Port tartomány"
++
++msgid "Whitelisted IPs"
++msgstr "Fehérlistás IP címek"
++
++msgid "seconds"
++msgstr "másodperc"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/it/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/it/p2pblock.po
+new file mode 100644
+index 0000000..3be5010
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/it/p2pblock.po
+@@ -0,0 +1,45 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-04-20 10:18+0200\n"
++"PO-Revision-Date: 2012-04-20 10:21+0200\n"
++"Last-Translator: claudyus <claudyus84@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Block Time"
++msgstr "Periodo di censura"
++
++msgid "Enable P2P-Block"
++msgstr "Abilita la censura del P2P"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Protocolli di Layer7"
++
++msgid "P2P-Block"
++msgstr "Censura P2P"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"La censura, block, del P2P è un meccanismo per bloccare diversi protocolli "
++"peer-to-peer da parte di clienti non apparteneti alla whitelist."
++
++msgid "Portrange"
++msgstr "Range delle porte"
++
++msgid "Whitelisted IPs"
++msgstr "IP in whitelist"
++
++msgid "seconds"
++msgstr "secondi"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/ja/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/ja/p2pblock.po
+new file mode 100644
+index 0000000..00cccc8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/ja/p2pblock.po
+@@ -0,0 +1,28 @@
++msgid "Block Time"
++msgstr ""
++
++msgid "Enable P2P-Block"
++msgstr ""
++
++msgid "IP-P2P"
++msgstr ""
++
++msgid "Layer7-Protocols"
++msgstr ""
++
++msgid "P2P-Block"
++msgstr ""
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++
++msgid "Portrange"
++msgstr ""
++
++msgid "Whitelisted IPs"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/ms/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/ms/p2pblock.po
+new file mode 100644
+index 0000000..00cccc8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/ms/p2pblock.po
+@@ -0,0 +1,28 @@
++msgid "Block Time"
++msgstr ""
++
++msgid "Enable P2P-Block"
++msgstr ""
++
++msgid "IP-P2P"
++msgstr ""
++
++msgid "Layer7-Protocols"
++msgstr ""
++
++msgid "P2P-Block"
++msgstr ""
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++
++msgid "Portrange"
++msgstr ""
++
++msgid "Whitelisted IPs"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/no/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/no/p2pblock.po
+new file mode 100644
+index 0000000..af9c25e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/no/p2pblock.po
+@@ -0,0 +1,36 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Block Time"
++msgstr "Blokkerings tid"
++
++msgid "Enable P2P-Block"
++msgstr "Aktiver P2P-Blokkering"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Lag7-Protokoller"
++
++msgid "P2P-Block"
++msgstr "P2P-Blokkering"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"P2P-blokkering er en mekanisme for å blokkere ulike peer-to-peer protokoller "
++"for klienter som ikke er hvitelistede."
++
++msgid "Portrange"
++msgstr "Portområde"
++
++msgid "Whitelisted IPs"
++msgstr "Hvitelistede IP'er"
++
++msgid "seconds"
++msgstr "sekunder"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/pl/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/pl/p2pblock.po
+new file mode 100644
+index 0000000..9222a08
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/pl/p2pblock.po
+@@ -0,0 +1,46 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-03-29 10:53+0200\n"
++"PO-Revision-Date: 2012-03-29 10:55+0200\n"
++"Last-Translator: Anonymous Pootle User\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Block Time"
++msgstr "Czas blokowania"
++
++msgid "Enable P2P-Block"
++msgstr "WÅ‚Ä…cz P2P-Block"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Protokoły Layer7"
++
++msgid "P2P-Block"
++msgstr "P2P-Block"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"P2P-Block jest mechanizmem który blokuje rozmaite protokoły peer-to-peer dla "
++"klientów spoza dozwolonej listy."
++
++msgid "Portrange"
++msgstr "Zakres portów"
++
++msgid "Whitelisted IPs"
++msgstr "Dozwolone adresy IP"
++
++msgid "seconds"
++msgstr "sekund"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/pt-br/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/pt-br/p2pblock.po
+new file mode 100644
+index 0000000..de36381
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/pt-br/p2pblock.po
+@@ -0,0 +1,30 @@
++msgid "Block Time"
++msgstr "Tempo de bloqueio"
++
++msgid "Enable P2P-Block"
++msgstr "Habilite o bloqueio P2P"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Protocolos da camada de aplicação"
++
++msgid "P2P-Block"
++msgstr "P2P-Block"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"P2P-Block é um mecanismo de lista cinza para bloquear vários protocolos "
++"peer-to-peer para clientes fora da lista branca."
++
++msgid "Portrange"
++msgstr "Faixa de porta"
++
++msgid "Whitelisted IPs"
++msgstr "IPs na lista branca"
++
++msgid "seconds"
++msgstr "segundos"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/pt/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/pt/p2pblock.po
+new file mode 100644
+index 0000000..365f9f2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/pt/p2pblock.po
+@@ -0,0 +1,45 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-05-01 01:17+0200\n"
++"PO-Revision-Date: 2013-05-01 01:30+0200\n"
++"Last-Translator: pedromrgoncalves <pedromrgoncalves@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Block Time"
++msgstr "Tempo a bloquear"
++
++msgid "Enable P2P-Block"
++msgstr "Activar Bloqueio P2P"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Portocolos Layer7"
++
++msgid "P2P-Block"
++msgstr "Bloqueio P2P"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"Bloqueio P2P é um mecanismo lista verde para bloquear vários protocolos "
++"peer-to-peer para clientes que não se encontram na lista branca"
++
++msgid "Portrange"
++msgstr "Intervalo de Portas"
++
++msgid "Whitelisted IPs"
++msgstr "IPs na lista branca"
++
++msgid "seconds"
++msgstr "segundos"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/ro/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/ro/p2pblock.po
+new file mode 100644
+index 0000000..2f7d74e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/ro/p2pblock.po
+@@ -0,0 +1,44 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-07 17:09+0200\n"
++"Last-Translator: Daniel <daniel.petre@pitesti.rcs-rds.ro>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Block Time"
++msgstr "Durata de blocare"
++
++msgid "Enable P2P-Block"
++msgstr "Activeaza blocarea P2P"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Protocoale Layer7"
++
++msgid "P2P-Block"
++msgstr "Blocare P2P"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"Blocarea P2P este un mecanism de blocare a diferitelor protocoale pentru "
++"clienti necunoscuti."
++
++msgid "Portrange"
++msgstr "Gama de porturi"
++
++msgid "Whitelisted IPs"
++msgstr "Adrese IP de incredere"
++
++msgid "seconds"
++msgstr "secunde"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/ru/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/ru/p2pblock.po
+new file mode 100644
+index 0000000..f6a2740
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/ru/p2pblock.po
+@@ -0,0 +1,48 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: p2pblock\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-06-01 12:02+0200\n"
++"PO-Revision-Date: 2013-11-13 18:46+0200\n"
++"Last-Translator: Роман <x.wserfer@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Block Time"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸"
++
++msgid "Enable P2P-Block"
++msgstr "Включить блокировку P2P"
++
++#, fuzzy
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Протоколы 7-го уровнÑ"
++
++msgid "P2P-Block"
++msgstr "Блокировка P2P"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"Блокировка P2P позволÑет запретить P2P-протоколы Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² вне белого "
++"ÑпиÑка."
++
++msgid "Portrange"
++msgstr "Диапазон портов"
++
++msgid "Whitelisted IPs"
++msgstr "Белый ÑпиÑок IP"
++
++msgid "seconds"
++msgstr "Ñекунды"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/sk/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/sk/p2pblock.po
+new file mode 100644
+index 0000000..1881b3c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/sk/p2pblock.po
+@@ -0,0 +1,38 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Block Time"
++msgstr ""
++
++msgid "Enable P2P-Block"
++msgstr ""
++
++msgid "IP-P2P"
++msgstr ""
++
++msgid "Layer7-Protocols"
++msgstr ""
++
++msgid "P2P-Block"
++msgstr ""
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++
++msgid "Portrange"
++msgstr ""
++
++msgid "Whitelisted IPs"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/sv/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/sv/p2pblock.po
+new file mode 100644
+index 0000000..de6e66a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/sv/p2pblock.po
+@@ -0,0 +1,39 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Block Time"
++msgstr ""
++
++msgid "Enable P2P-Block"
++msgstr ""
++
++msgid "IP-P2P"
++msgstr ""
++
++msgid "Layer7-Protocols"
++msgstr ""
++
++msgid "P2P-Block"
++msgstr ""
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++
++msgid "Portrange"
++msgstr ""
++
++msgid "Whitelisted IPs"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/templates/p2pblock.pot b/feeds/luci/applications/luci-app-p2pblock/po/templates/p2pblock.pot
+new file mode 100644
+index 0000000..6fa5da1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/templates/p2pblock.pot
+@@ -0,0 +1,31 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Block Time"
++msgstr ""
++
++msgid "Enable P2P-Block"
++msgstr ""
++
++msgid "IP-P2P"
++msgstr ""
++
++msgid "Layer7-Protocols"
++msgstr ""
++
++msgid "P2P-Block"
++msgstr ""
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++
++msgid "Portrange"
++msgstr ""
++
++msgid "Whitelisted IPs"
++msgstr ""
++
++msgid "seconds"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/tr/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/tr/p2pblock.po
+new file mode 100644
+index 0000000..7c670d8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/tr/p2pblock.po
+@@ -0,0 +1,43 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-10-11 22:45+0200\n"
++"Last-Translator: vincenzo <tayfun_ozturk@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: tr\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: Pootle 2.0.6\n"
++
++msgid "Block Time"
++msgstr "Engel Zamanı"
++
++msgid "Enable P2P-Block"
++msgstr "P2P-Bloğu'nu Aç"
++
++msgid "IP-P2P"
++msgstr "iP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Layer7 - Protokolleri"
++
++msgid "P2P-Block"
++msgstr "P2P-BloÄŸu"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"P2P-Bloğu bir engel (greylist) mekanizmasıdır. izin verilenler listesinde "
++"(Beyaz Liste) olmayan istemciler için p2p protokolünü engeller."
++
++msgid "Portrange"
++msgstr "Portrange"
++
++msgid "Whitelisted IPs"
++msgstr "Beyaz Liste iPleri"
++
++msgid "seconds"
++msgstr "saniye"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/uk/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/uk/p2pblock.po
+new file mode 100644
+index 0000000..3e7dff9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/uk/p2pblock.po
+@@ -0,0 +1,45 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-13 16:04+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Block Time"
++msgstr "Загальний чаÑ"
++
++msgid "Enable P2P-Block"
++msgstr "Ðктивувати Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ P2P"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Протокол Layer7"
++
++msgid "P2P-Block"
++msgstr "P2P блоковано"
++
++#, fuzzy
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"P2P-Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÑвлÑÑ” Ñобою механізм Ñірих ÑпиÑків Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ñ–Ð·Ð½Ð¸Ñ… "
++"рівний-однотипних протоколів Ð´Ð»Ñ ÐЕ-білого ÑпиÑку клієнтів."
++
++msgid "Portrange"
++msgstr "Діапазон портів"
++
++msgid "Whitelisted IPs"
++msgstr "Білий ÑпиÑок IP-адреÑ"
++
++msgid "seconds"
++msgstr "Ñекунд"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/vi/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/vi/p2pblock.po
+new file mode 100644
+index 0000000..4bad090
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/vi/p2pblock.po
+@@ -0,0 +1,42 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: \n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: \n"
++"Last-Translator: Manuel Munz <freifunk@somakoma.de>\n"
++"Language-Team: \n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Block Time"
++msgstr "Thá»Âi gian Block"
++
++msgid "Enable P2P-Block"
++msgstr "Kích hoạt P2P-Block"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "Layer7-protocols"
++
++msgid "P2P-Block"
++msgstr "P2P-Block"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr ""
++"P2P-Block là một cơ chế greylisting để chặn các peer-to-peer "
++"protocols cho khách hàng không nằm trên whitelisted."
++
++msgid "Portrange"
++msgstr "Portrange"
++
++msgid "Whitelisted IPs"
++msgstr "Whitelisted IPs"
++
++msgid "seconds"
++msgstr "giây"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/zh-cn/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/zh-cn/p2pblock.po
+new file mode 100644
+index 0000000..66725be
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/zh-cn/p2pblock.po
+@@ -0,0 +1,43 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-06-17 19:11+0200\n"
++"PO-Revision-Date: 2013-10-08 15:22+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Block Time"
++msgstr "å°é”时间"
++
++msgid "Enable P2P-Block"
++msgstr "å¯åŠ¨P2På°é”"
++
++msgid "IP-P2P"
++msgstr "IP-P2P"
++
++msgid "Layer7-Protocols"
++msgstr "第7层åè®®"
++
++msgid "P2P-Block"
++msgstr "P2På°é”"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr "P2På°é”使用ç°åå•æœºåˆ¶ï¼Œä»¥é˜»æ­¢éžç™½åå•å®¢æˆ·çš„å„ç§P2På议。"
++
++msgid "Portrange"
++msgstr "端å£èŒƒå›´"
++
++msgid "Whitelisted IPs"
++msgstr "白åå•IP地å€"
++
++msgid "seconds"
++msgstr "秒"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/po/zh-tw/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/zh-tw/p2pblock.po
+new file mode 100644
+index 0000000..f542f77
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/po/zh-tw/p2pblock.po
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 11:09+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Block Time"
++msgstr "阻斷時間"
++
++msgid "Enable P2P-Block"
++msgstr "啓用P2Pç¦æ–·"
++
++msgid "IP-P2P"
++msgstr "IP點å°é»žå”定"
++
++msgid "Layer7-Protocols"
++msgstr "第七層å”定"
++
++msgid "P2P-Block"
++msgstr "P2Pç¦æ–·"
++
++msgid ""
++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols "
++"for non-whitelisted clients."
++msgstr "P2P-Block是一個ç°å單機制, é‡å°ä¸åœ¨ç™½å單清單裡é¢çš„用戶, 阻斷å„種類的P2P點å°é»žå”定."
++
++msgid "Portrange"
++msgstr "範åœåŸ "
++
++msgid "Whitelisted IPs"
++msgstr "白å單列表IP"
++
++msgid "seconds"
++msgstr "秒數"
+diff --git a/feeds/luci/applications/luci-app-p2pblock/root/etc/uci-defaults/luci-p2pblock b/feeds/luci/applications/luci-app-p2pblock/root/etc/uci-defaults/luci-p2pblock
+new file mode 100755
+index 0000000..030ebbe
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p2pblock/root/etc/uci-defaults/luci-p2pblock
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete citrack.@freifunk_p2pblock[-1]
++ add ucitrack freifunk_p2pblock
++ set ucitrack.@freifunk_p2pblock[-1].init=freifunk-p2pblock
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-p910nd/Makefile b/feeds/luci/applications/luci-app-p910nd/Makefile
+new file mode 100644
+index 0000000..adb35bd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=p910nd - Printer server module
++LUCI_DEPENDS:=+p910nd
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-p910nd/luasrc/controller/p910nd.lua b/feeds/luci/applications/luci-app-p910nd/luasrc/controller/p910nd.lua
+new file mode 100644
+index 0000000..df47e9f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/luasrc/controller/p910nd.lua
+@@ -0,0 +1,15 @@
++-- Copyright 2008 Yanira <forum-2008@email.de>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.p910nd", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/p910nd") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "services", "p910nd"}, cbi("p910nd"), _("p910nd - Printer server"), 60)
++ page.dependent = true
++end
+diff --git a/feeds/luci/applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua b/feeds/luci/applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua
+new file mode 100644
+index 0000000..0990138
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua
+@@ -0,0 +1,49 @@
++-- Copyright 2008 Yanira <forum-2008@email.de>
++-- Copyright 2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local uci = luci.model.uci.cursor_state()
++local net = require "luci.model.network"
++local m, s, p, b
++
++m = Map("p910nd", translate("p910nd - Printer server"),
++ translatef("First you have to install the packages to get support for USB (kmod-usb-printer) or parallel port (kmod-lp)."))
++
++net = net.init(m.uci)
++
++s = m:section(TypedSection, "p910nd", translate("Settings"))
++s.addremove = true
++s.anonymous = true
++
++s:option(Flag, "enabled", translate("enable"))
++
++s:option(Value, "device", translate("Device")).rmempty = true
++
++b = s:option(Value, "bind", translate("Interface"), translate("Specifies the interface to listen on."))
++b.template = "cbi/network_netlist"
++b.nocreate = true
++b.unspecified = true
++
++function b.cfgvalue(...)
++ local v = Value.cfgvalue(...)
++ if v then
++ return (net:get_status_by_address(v))
++ end
++end
++
++function b.write(self, section, value)
++ local n = net:get_network(value)
++ if n and n:ipaddr() then
++ Value.write(self, section, n:ipaddr())
++ end
++end
++
++p = s:option(ListValue, "port", translate("Port"), translate("TCP listener port."))
++p.rmempty = true
++for i=0,9 do
++ p:value(i, 9100+i)
++end
++
++s:option(Flag, "bidirectional", translate("Bidirectional mode"))
++
++return m
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/ca/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/ca/p910nd.po
+new file mode 100644
+index 0000000..6862df4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/ca/p910nd.po
+@@ -0,0 +1,55 @@
++# p910nd.pot
++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-07-01 03:56+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "Mode bidireccional"
++
++msgid "Device"
++msgstr "Dispositiu"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Primer heu d'instal·lar els paquets de suport USB (kmod-usb-printer) o de "
++"port paral·lel (kmod-lp)."
++
++msgid "Interface"
++msgstr "Interfície"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Settings"
++msgstr "Ajusts"
++
++msgid "Specifies the interface to listen on."
++msgstr "Especifica la interfície en que escoltar."
++
++msgid "TCP listener port."
++msgstr "Port d'escolta TCP."
++
++msgid "enable"
++msgstr "habilita"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - Servidor d'impressió"
++
++#~ msgid "port_help"
++#~ msgstr ""
++#~ "El p910nd escolta al port 910+N. Per exemple, 9100 per la primera "
++#~ "impressora (la 0)."
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/cs/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/cs/p910nd.po
+new file mode 100644
+index 0000000..e4f1c71
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/cs/p910nd.po
+@@ -0,0 +1,49 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-20 23:28+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "Obousměrný režim"
++
++msgid "Device"
++msgstr "Zařízení"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Nejprve je nutno nainstalovat balíÄky pÅ™inášející podporu USB (kmod-usb-"
++"printer) Äi paralelního portu (kmod-lp)."
++
++msgid "Interface"
++msgstr "Rozhraní"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Settings"
++msgstr "Nastavení"
++
++msgid "Specifies the interface to listen on."
++msgstr "Specifikuje rozhraní pro naslouchání."
++
++msgid "TCP listener port."
++msgstr "Naslouchající TCP port"
++
++msgid "enable"
++msgstr "Povolit"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - tiskový server"
++
++#~ msgid "port_help"
++#~ msgstr "Nápověda pro výběr portu"
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/de/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/de/p910nd.po
+new file mode 100644
+index 0000000..d72e858
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/de/p910nd.po
+@@ -0,0 +1,51 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2012-09-12 14:00+0200\n"
++"Last-Translator: Jo-Philipp <jow@openwrt.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "Bidirektionaler Modus"
++
++msgid "Device"
++msgstr "Gerät"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Bevor p910nd verwendet werden kann muessen Pakete fuer USB (kmod-usb-"
++"printer) und Parallelport (kmod-lp) Support installiert werden."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Settings"
++msgstr "Einstellungen"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "TCP Port"
++
++msgid "enable"
++msgstr "aktivieren"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - Printserver"
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr "p910nd hoert auf Port 910+N. Z.B. 9100 fuer ersten Drucker"
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/el/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/el/p910nd.po
+new file mode 100644
+index 0000000..13b97c0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/el/p910nd.po
+@@ -0,0 +1,55 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-28 02:08+0200\n"
++"PO-Revision-Date: 2012-03-18 15:25+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Bidirectional mode"
++msgstr "ΑμφίδÏομη μέθοδος"
++
++msgid "Device"
++msgstr "Συσκευή"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"ΠÏώτα Ï€Ïέπει να εγκατασταθοÏν τα πακέτα για να υπάÏξει υποστήÏιξη για USB "
++"(kmod-usb-printer) ή παÏάλληλη θÏÏα (kmod-lp)."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr "ΘÏÏα"
++
++msgid "Settings"
++msgstr "Ρυθμίσεις"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "ΘÏÏα ακÏόασης TCP"
++
++msgid "enable"
++msgstr "ενεÏγοποίηση"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - ΕξυπηÏετητής εκτυπώσεων"
++
++#~ msgid "port_help"
++#~ msgstr "port_help"
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr ""
++#~ "p910nd ανταποκÏίνεται στην πόÏτα 910+N. Ï€.χ. 9100 για τον Ï€Ïώτο εκτυπωτή"
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/en/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/en/p910nd.po
+new file mode 100644
+index 0000000..766673a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/en/p910nd.po
+@@ -0,0 +1,51 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:35+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid "Bidirectional mode"
++msgstr "Bidirectional mode"
++
++msgid "Device"
++msgstr ""
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr ""
++
++msgid "enable"
++msgstr ""
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - Printer server"
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr "p910nd listens on port 910+N. E.g. 9100 for the first printer."
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/es/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/es/p910nd.po
+new file mode 100644
+index 0000000..f558c99
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/es/p910nd.po
+@@ -0,0 +1,51 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2014-06-15 09:10+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "Modo bidireccional"
++
++msgid "Device"
++msgstr "Dispositivo"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Debe instalar primero el soporte para puertos USB (kmod-usb-printer) o "
++"paralelo (kmod-lp)."
++
++msgid "Interface"
++msgstr "Interfaz"
++
++msgid "Port"
++msgstr "Puerto"
++
++msgid "Settings"
++msgstr "Configuración"
++
++msgid "Specifies the interface to listen on."
++msgstr "Especifica el interfaz en el que se escucha."
++
++msgid "TCP listener port."
++msgstr "Puerto de escucha TCP."
++
++msgid "enable"
++msgstr "activar"
++
++msgid "p910nd - Printer server"
++msgstr "Servidor de Impresión - p910nd"
++
++#~ msgid "port_help"
++#~ msgstr "puerto_ayuda"
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/fr/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/fr/p910nd.po
+new file mode 100644
+index 0000000..5621e10
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/fr/p910nd.po
+@@ -0,0 +1,56 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-01-15 07:08+0200\n"
++"Last-Translator: desillu <ledesillusionniste@hotmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Bidirectional mode"
++msgstr "Mode bi-directionnel"
++
++msgid "Device"
++msgstr "Périphérique"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Vous devez d'abord installer les paquets pour gérer des imprimantes USB "
++"(kmod-usb-printer) ou sur port parallèle (kmod-lp)."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Settings"
++msgstr "Paramètres"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "Port d'écoute TCP."
++
++msgid "enable"
++msgstr "activer"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - Serveur d'impression"
++
++#~ msgid "port_help"
++#~ msgstr "aide_port"
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr ""
++#~ "p910nd écoute sur le port 910+N, par exemple 9100 pour la première "
++#~ "imprimante."
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/he/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/he/p910nd.po
+new file mode 100644
+index 0000000..3accdca
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/he/p910nd.po
+@@ -0,0 +1,53 @@
++# p910nd.pot
++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-10 03:43+0200\n"
++"Last-Translator: Snoof <sagim9@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "מצב דו-כיווני."
++
++msgid "Device"
++msgstr "התקן"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"ר×שית עליך להתקין ×ת החבילות כדי לקבל תמיכה ב- USB (kmod-usb-printer) ×ו "
++"בחיבור מקבילי (kmod-lp)."
++
++msgid "Interface"
++msgstr ""
++
++# "יצי××”" ×ו "יצי×ת התקן" ?
++#, fuzzy
++msgid "Port"
++msgstr "יצי×ת התקן"
++
++msgid "Settings"
++msgstr "הגדרות"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "יצי×ת ×”××–× ×” ל- TCP"
++
++msgid "enable"
++msgstr "ל×פשר"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - שרת מדפסות"
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr "p910nd מ×זין לפורט 910+N (למשל 9100) עבור המדפסת הר×שונה."
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/hu/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/hu/p910nd.po
+new file mode 100644
+index 0000000..7179871
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/hu/p910nd.po
+@@ -0,0 +1,49 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-28 16:41+0200\n"
++"Last-Translator: Gábor <vargalex@freemail.hu>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Bidirectional mode"
++msgstr "Kétirányú mód"
++
++msgid "Device"
++msgstr "Eszköz"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"A p910nd használata előtt szükséges az USB (kmod-usb-printer), vagy "
++"párhuzamos (kmod-lp) portokat támogató csomagok telepítése."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Settings"
++msgstr "Beállítások"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "TCP port"
++
++msgid "enable"
++msgstr "Engedélyezés"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - Nyomtató szerver"
++
++#~ msgid "port_help"
++#~ msgstr "port_súgó"
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/it/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/it/p910nd.po
+new file mode 100644
+index 0000000..47bf687
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/it/p910nd.po
+@@ -0,0 +1,55 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2014-08-05 11:23+0200\n"
++"Last-Translator: morganfw <morganfw@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "Modalità bidirezionale"
++
++msgid "Device"
++msgstr "Dispositivo"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Devi prima aver installato i pacchetti per avere il supporto dell'USB (kmod-"
++"usb-printer) o della porta parallela (kmod-lp)."
++
++msgid "Interface"
++msgstr "Interfaccia"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Settings"
++msgstr "Impostazioni"
++
++msgid "Specifies the interface to listen on."
++msgstr "Specifica l'interfaccia per l'ascolto."
++
++msgid "TCP listener port."
++msgstr "Porta d'ascolto TCP."
++
++msgid "enable"
++msgstr "Attiva"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - Server di stampa"
++
++#~ msgid "port_help"
++#~ msgstr "Porta d'aiuto"
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr ""
++#~ "p910nd è in ascolto sulla porta 910+N. Ad es. 9100 per la prima stampante."
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/ja/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/ja/p910nd.po
+new file mode 100644
+index 0000000..42335ce
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/ja/p910nd.po
+@@ -0,0 +1,51 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2011-11-04 18:11+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.4\n"
++
++msgid "Bidirectional mode"
++msgstr "åŒæ–¹å‘モード"
++
++msgid "Device"
++msgstr "デãƒã‚¤ã‚¹"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"ã¾ãšåˆã‚ã«ã€USB(kmod-usb-printer)ã¾ãŸã¯ã€ãƒ‘ラレルãƒãƒ¼ãƒˆ(kmod-lp)をサãƒãƒ¼ãƒˆã™"
++"ã‚‹ãŸã‚ã®ãƒ‘ッケージをインストールã—ã¦ãã ã•ã„。"
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr "ãƒãƒ¼ãƒˆç•ªå·"
++
++msgid "Settings"
++msgstr "設定"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "TCP接続待ã¡ãƒãƒ¼ãƒˆ"
++
++msgid "enable"
++msgstr "有効"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - プリンタサーãƒãƒ¼"
++
++#~ msgid "port_help"
++#~ msgstr "port_help"
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/ms/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/ms/p910nd.po
+new file mode 100644
+index 0000000..254fc66
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/ms/p910nd.po
+@@ -0,0 +1,43 @@
++# p910nd.pot
++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Bidirectional mode"
++msgstr ""
++
++msgid "Device"
++msgstr ""
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr ""
++
++msgid "enable"
++msgstr ""
++
++msgid "p910nd - Printer server"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/no/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/no/p910nd.po
+new file mode 100644
+index 0000000..3bf49c5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/no/p910nd.po
+@@ -0,0 +1,47 @@
++msgid ""
++msgstr ""
++"PO-Revision-Date: 2013-03-21 23:05+0200\n"
++"Last-Translator: protx <lars.hardy@gmail.com>\n"
++"Language: no\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "Toveis modus (bidirectional)"
++
++msgid "Device"
++msgstr "Enhet"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Du må først installere pakkene som gir støtte for USB (kmod-usb-printer) "
++"eller parallellport (kmod-lp) skriver."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Settings"
++msgstr "Innstillinger"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "TCP lytte port."
++
++msgid "enable"
++msgstr "Aktiver"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - Skriverserver"
++
++#~ msgid "port_help"
++#~ msgstr ""
++#~ "p910nd lytter på port 910+N. (N=0 blir port 9100 for første skriver)"
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/pl/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/pl/p910nd.po
+new file mode 100644
+index 0000000..c5f611a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/pl/p910nd.po
+@@ -0,0 +1,56 @@
++# p910nd.pot
++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-02 19:31+0200\n"
++"Last-Translator: obsy <cezary@eko.one.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "Tryb dwukierunkowy"
++
++msgid "Device"
++msgstr "UrzÄ…dzenie"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Po pierwsze, musisz zainstalować pakiety obsługujące interfejs USB (kmod-"
++"usb-printer) lub LPT (kmod-lp)."
++
++msgid "Interface"
++msgstr "Interfejs"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Settings"
++msgstr "Ustawienia"
++
++msgid "Specifies the interface to listen on."
++msgstr "Określa interfejs do nasłuchu."
++
++msgid "TCP listener port."
++msgstr "Port nasłuchu TCP"
++
++msgid "enable"
++msgstr "WÅ‚Ä…czony"
++
++# W sambie usługa też się nazywa "network shares", więc nie ma specjalnie potrzeby używania nazwy własnej demona "p910nd".
++msgid "p910nd - Printer server"
++msgstr "Serwer wydruku"
++
++#~ msgid "port_help"
++#~ msgstr "port_help"
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr "p910nd nasłuchuje na porcie 910X, np. 9100 dla pierwszej drukarki."
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/pt-br/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/pt-br/p910nd.po
+new file mode 100644
+index 0000000..de7c429
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/pt-br/p910nd.po
+@@ -0,0 +1,57 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2014-06-21 19:02+0200\n"
++"Last-Translator: Éder <eder.grigorio@openmailbox.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "Modo bidirecional"
++
++msgid "Device"
++msgstr "Dispositivo"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Primeiro você deve instalar os pacotes para obter suporte USB (kmod-usb-"
++"printer) ou porta paralela (kmod-lp)."
++
++# 20140621: edersg: tradução
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Settings"
++msgstr "Configurações"
++
++# 20140621: edersg: tradução
++msgid "Specifies the interface to listen on."
++msgstr "Especifica a interface para escuta."
++
++msgid "TCP listener port."
++msgstr "Porta TCP de escuta."
++
++msgid "enable"
++msgstr "habilitado"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - Servidor de impressão"
++
++#~ msgid "port_help"
++#~ msgstr ""
++#~ "p910nd escuta na porta 910x. Por exemplo, 9100 para a primeira impressora."
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr "p910nd escuta na porta 910+N. Ex. 9100 para a primeira impressora."
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/pt/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/pt/p910nd.po
+new file mode 100644
+index 0000000..734967e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/pt/p910nd.po
+@@ -0,0 +1,51 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-05-01 00:41+0200\n"
++"Last-Translator: pedromrgoncalves <pedromrgoncalves@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "Modo bidirecional"
++
++msgid "Device"
++msgstr "Dispositivo"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Primeiro você deve instalar os pacotes para obter suporte USB (kmod-usb-"
++"printer) ou porta paralela (kmod-lp)."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Settings"
++msgstr "Definições"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "Porta TCP ouvinte"
++
++msgid "enable"
++msgstr "activar"
++
++msgid "p910nd - Printer server"
++msgstr "P910nd - Servidor de impressão"
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr "p910nd escuta na porta 910+N. Ex. 9100 para a primeira impressora."
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/ro/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/ro/p910nd.po
+new file mode 100644
+index 0000000..7cad5c0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/ro/p910nd.po
+@@ -0,0 +1,47 @@
++# p910nd.pot
++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-29 20:02+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr ""
++
++msgid "Device"
++msgstr "Dispozitiv"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfaţă"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Settings"
++msgstr "Setări"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr ""
++
++msgid "enable"
++msgstr "activează"
++
++msgid "p910nd - Printer server"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/ru/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/ru/p910nd.po
+new file mode 100644
+index 0000000..923b22e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/ru/p910nd.po
+@@ -0,0 +1,57 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: p910nd\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-08-15 11:42+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Bidirectional mode"
++msgstr "Двунаправленный режим"
++
++msgid "Device"
++msgstr "УÑтройÑтво"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Ð”Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° вам необходимо уÑтановить пакеты Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ USB (kmod-usb-"
++"printer) или параллельного порта (kmod-lp)."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Settings"
++msgstr "ÐаÑтройки"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "ПроÑлушиваемый TCP-порт."
++
++msgid "enable"
++msgstr "включить"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - Ñервер печати"
++
++#~ msgid "port_help"
++#~ msgstr "Помощь по портам"
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr ""
++#~ "p910nd проÑлушивает порт 910+N. То еÑÑ‚ÑŒ 9100 - номер первого принтера."
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/sk/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/sk/p910nd.po
+new file mode 100644
+index 0000000..5282dd7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/sk/p910nd.po
+@@ -0,0 +1,41 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Bidirectional mode"
++msgstr ""
++
++msgid "Device"
++msgstr ""
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr ""
++
++msgid "enable"
++msgstr ""
++
++msgid "p910nd - Printer server"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/sv/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/sv/p910nd.po
+new file mode 100644
+index 0000000..98febee
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/sv/p910nd.po
+@@ -0,0 +1,42 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Bidirectional mode"
++msgstr ""
++
++msgid "Device"
++msgstr ""
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr ""
++
++msgid "enable"
++msgstr ""
++
++msgid "p910nd - Printer server"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/templates/p910nd.pot b/feeds/luci/applications/luci-app-p910nd/po/templates/p910nd.pot
+new file mode 100644
+index 0000000..3674fdb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/templates/p910nd.pot
+@@ -0,0 +1,34 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Bidirectional mode"
++msgstr ""
++
++msgid "Device"
++msgstr ""
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr ""
++
++msgid "enable"
++msgstr ""
++
++msgid "p910nd - Printer server"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/tr/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/tr/p910nd.po
+new file mode 100644
+index 0000000..ed69a01
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/tr/p910nd.po
+@@ -0,0 +1,46 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-10-11 23:24+0200\n"
++"Last-Translator: vincenzo <tayfun_ozturk@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: tr\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: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "Çift Yönlü Mod"
++
++msgid "Device"
++msgstr "Aygıt"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"USB (kmod-usb-yazıcı) veya paralel port (kmod-lp) kullanabilmek için destek "
++"paketi yüklemeniz gerekebilir."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Settings"
++msgstr "Ayarlar"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "Dinlemedeki TCP portları"
++
++msgid "enable"
++msgstr "EtkinleÅŸtir"
++
++msgid "p910nd - Printer server"
++msgstr "P910nd_Yazıcı Sunucusu"
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/uk/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/uk/p910nd.po
+new file mode 100644
+index 0000000..237054d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/uk/p910nd.po
+@@ -0,0 +1,47 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-05-26 18:35+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Bidirectional mode"
++msgstr "Двонаправлений режим"
++
++msgid "Device"
++msgstr "ПриÑтрій"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Спочатку вам Ñлід інÑталювати пакети Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ USB (kmod-usb-printer) "
++"або паралельного порту (kmod-lp)."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Settings"
++msgstr "Параметри"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "Порт TCP, що проÑлуховуєтьÑÑ"
++
++msgid "enable"
++msgstr "Увімкнути"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - Ñервер друку"
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/vi/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/vi/p910nd.po
+new file mode 100644
+index 0000000..10035b8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/vi/p910nd.po
+@@ -0,0 +1,52 @@
++# p910nd.pot
++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:58+0200\n"
++"PO-Revision-Date: 2009-08-13 04:03+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "Bidirectional mode"
++msgstr "Chế Ä‘á»™ 2 chiá»u"
++
++msgid "Device"
++msgstr ""
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"Trước tiên, bạn cần phải cài đặt các gói để hỗ trợ cho cổng USB (kmod-usb-"
++"in), hoặc cổng song song (kmod-lp)."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr ""
++
++msgid "enable"
++msgstr ""
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - Máy in chủ"
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr "p910nd tiếp thu ở cổng 910+N. E.g. 9100 cho máy in đầu tiên."
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/zh-cn/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/zh-cn/p910nd.po
+new file mode 100644
+index 0000000..c14e2e7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/zh-cn/p910nd.po
+@@ -0,0 +1,49 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:35+0200\n"
++"PO-Revision-Date: 2014-06-22 14:36+0200\n"
++"Last-Translator: phantasm131 <phantasm131@gmail.com>\n"
++"Language-Team: QQ Group 75543259 <axishero@foxmail.com>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "åŒå‘模å¼"
++
++msgid "Device"
++msgstr "设备"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr "必须安装支æŒUSB打å°æœºçš„驱动(kmod-usb-printer)或者并å£é©±åŠ¨(kmod-lp)"
++
++msgid "Interface"
++msgstr "接å£"
++
++msgid "Port"
++msgstr "端å£"
++
++msgid "Settings"
++msgstr "设置"
++
++msgid "Specifies the interface to listen on."
++msgstr "指定监å¬ç«¯å£"
++
++msgid "TCP listener port."
++msgstr "TCP监å¬ç«¯å£"
++
++msgid "enable"
++msgstr "å¯ç”¨"
++
++msgid "p910nd - Printer server"
++msgstr "打å°æœåŠ¡å™¨"
++
++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer."
++#~ msgstr "p910nd 的监å¬ç«¯å£æ˜¯910+N,举例:9100用于监å¬ç¬¬ä¸€å°æ‰“å°æœº"
+diff --git a/feeds/luci/applications/luci-app-p910nd/po/zh-tw/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/zh-tw/p910nd.po
+new file mode 100644
+index 0000000..7d6c080
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/po/zh-tw/p910nd.po
+@@ -0,0 +1,45 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-18 20:03+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Bidirectional mode"
++msgstr "é›™å‘模å¼"
++
++msgid "Device"
++msgstr "設備"
++
++msgid ""
++"First you have to install the packages to get support for USB (kmod-usb-"
++"printer) or parallel port (kmod-lp)."
++msgstr ""
++"首先你必須安è£è»Ÿé«”包以便ç²å¾—USB (kmod-usb-printer)或串列埠(kmod-lp)的支æ´."
++
++msgid "Interface"
++msgstr ""
++
++msgid "Port"
++msgstr "埠"
++
++msgid "Settings"
++msgstr "設定值"
++
++msgid "Specifies the interface to listen on."
++msgstr ""
++
++msgid "TCP listener port."
++msgstr "è†è½TCP埠"
++
++msgid "enable"
++msgstr "啟用"
++
++msgid "p910nd - Printer server"
++msgstr "p910nd - å°è¡¨æ©Ÿä¼ºæœå™¨"
+diff --git a/feeds/luci/applications/luci-app-p910nd/root/etc/uci-defaults/luci-p910nd b/feeds/luci/applications/luci-app-p910nd/root/etc/uci-defaults/luci-p910nd
+new file mode 100755
+index 0000000..80f6d62
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-p910nd/root/etc/uci-defaults/luci-p910nd
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@p910nd[-1]
++ add ucitrack p910nd
++ set ucitrack.@p910nd[-1].init=p910nd
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/COPYING b/feeds/luci/applications/luci-app-pbx-voicemail/COPYING
+new file mode 100644
+index 0000000..94a9ed0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/COPYING
+@@ -0,0 +1,674 @@
++ GNU GENERAL PUBLIC LICENSE
++ Version 3, 29 June 2007
++
++ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
++ Everyone is permitted to copy and distribute verbatim copies
++ of this license document, but changing it is not allowed.
++
++ Preamble
++
++ The GNU General Public License is a free, copyleft license for
++software and other kinds of works.
++
++ The licenses for most software and other practical works are designed
++to take away your freedom to share and change the works. By contrast,
++the GNU General Public License is intended to guarantee your freedom to
++share and change all versions of a program--to make sure it remains free
++software for all its users. We, the Free Software Foundation, use the
++GNU General Public License for most of our software; it applies also to
++any other work released this way by its authors. You can apply it to
++your programs, too.
++
++ When we speak of free software, we are referring to freedom, not
++price. Our General Public Licenses are designed to make sure that you
++have the freedom to distribute copies of free software (and charge for
++them if you wish), that you receive source code or can get it if you
++want it, that you can change the software or use pieces of it in new
++free programs, and that you know you can do these things.
++
++ To protect your rights, we need to prevent others from denying you
++these rights or asking you to surrender the rights. Therefore, you have
++certain responsibilities if you distribute copies of the software, or if
++you modify it: responsibilities to respect the freedom of others.
++
++ For example, if you distribute copies of such a program, whether
++gratis or for a fee, you must pass on to the recipients the same
++freedoms that you received. You must make sure that they, too, receive
++or can get the source code. And you must show them these terms so they
++know their rights.
++
++ Developers that use the GNU GPL protect your rights with two steps:
++(1) assert copyright on the software, and (2) offer you this License
++giving you legal permission to copy, distribute and/or modify it.
++
++ For the developers' and authors' protection, the GPL clearly explains
++that there is no warranty for this free software. For both users' and
++authors' sake, the GPL requires that modified versions be marked as
++changed, so that their problems will not be attributed erroneously to
++authors of previous versions.
++
++ Some devices are designed to deny users access to install or run
++modified versions of the software inside them, although the manufacturer
++can do so. This is fundamentally incompatible with the aim of
++protecting users' freedom to change the software. The systematic
++pattern of such abuse occurs in the area of products for individuals to
++use, which is precisely where it is most unacceptable. Therefore, we
++have designed this version of the GPL to prohibit the practice for those
++products. If such problems arise substantially in other domains, we
++stand ready to extend this provision to those domains in future versions
++of the GPL, as needed to protect the freedom of users.
++
++ Finally, every program is threatened constantly by software patents.
++States should not allow patents to restrict development and use of
++software on general-purpose computers, but in those that do, we wish to
++avoid the special danger that patents applied to a free program could
++make it effectively proprietary. To prevent this, the GPL assures that
++patents cannot be used to render the program non-free.
++
++ The precise terms and conditions for copying, distribution and
++modification follow.
++
++ TERMS AND CONDITIONS
++
++ 0. Definitions.
++
++ "This License" refers to version 3 of the GNU General Public License.
++
++ "Copyright" also means copyright-like laws that apply to other kinds of
++works, such as semiconductor masks.
++
++ "The Program" refers to any copyrightable work licensed under this
++License. Each licensee is addressed as "you". "Licensees" and
++"recipients" may be individuals or organizations.
++
++ To "modify" a work means to copy from or adapt all or part of the work
++in a fashion requiring copyright permission, other than the making of an
++exact copy. The resulting work is called a "modified version" of the
++earlier work or a work "based on" the earlier work.
++
++ A "covered work" means either the unmodified Program or a work based
++on the Program.
++
++ To "propagate" a work means to do anything with it that, without
++permission, would make you directly or secondarily liable for
++infringement under applicable copyright law, except executing it on a
++computer or modifying a private copy. Propagation includes copying,
++distribution (with or without modification), making available to the
++public, and in some countries other activities as well.
++
++ To "convey" a work means any kind of propagation that enables other
++parties to make or receive copies. Mere interaction with a user through
++a computer network, with no transfer of a copy, is not conveying.
++
++ An interactive user interface displays "Appropriate Legal Notices"
++to the extent that it includes a convenient and prominently visible
++feature that (1) displays an appropriate copyright notice, and (2)
++tells the user that there is no warranty for the work (except to the
++extent that warranties are provided), that licensees may convey the
++work under this License, and how to view a copy of this License. If
++the interface presents a list of user commands or options, such as a
++menu, a prominent item in the list meets this criterion.
++
++ 1. Source Code.
++
++ The "source code" for a work means the preferred form of the work
++for making modifications to it. "Object code" means any non-source
++form of a work.
++
++ A "Standard Interface" means an interface that either is an official
++standard defined by a recognized standards body, or, in the case of
++interfaces specified for a particular programming language, one that
++is widely used among developers working in that language.
++
++ The "System Libraries" of an executable work include anything, other
++than the work as a whole, that (a) is included in the normal form of
++packaging a Major Component, but which is not part of that Major
++Component, and (b) serves only to enable use of the work with that
++Major Component, or to implement a Standard Interface for which an
++implementation is available to the public in source code form. A
++"Major Component", in this context, means a major essential component
++(kernel, window system, and so on) of the specific operating system
++(if any) on which the executable work runs, or a compiler used to
++produce the work, or an object code interpreter used to run it.
++
++ The "Corresponding Source" for a work in object code form means all
++the source code needed to generate, install, and (for an executable
++work) run the object code and to modify the work, including scripts to
++control those activities. However, it does not include the work's
++System Libraries, or general-purpose tools or generally available free
++programs which are used unmodified in performing those activities but
++which are not part of the work. For example, Corresponding Source
++includes interface definition files associated with source files for
++the work, and the source code for shared libraries and dynamically
++linked subprograms that the work is specifically designed to require,
++such as by intimate data communication or control flow between those
++subprograms and other parts of the work.
++
++ The Corresponding Source need not include anything that users
++can regenerate automatically from other parts of the Corresponding
++Source.
++
++ The Corresponding Source for a work in source code form is that
++same work.
++
++ 2. Basic Permissions.
++
++ All rights granted under this License are granted for the term of
++copyright on the Program, and are irrevocable provided the stated
++conditions are met. This License explicitly affirms your unlimited
++permission to run the unmodified Program. The output from running a
++covered work is covered by this License only if the output, given its
++content, constitutes a covered work. This License acknowledges your
++rights of fair use or other equivalent, as provided by copyright law.
++
++ You may make, run and propagate covered works that you do not
++convey, without conditions so long as your license otherwise remains
++in force. You may convey covered works to others for the sole purpose
++of having them make modifications exclusively for you, or provide you
++with facilities for running those works, provided that you comply with
++the terms of this License in conveying all material for which you do
++not control copyright. Those thus making or running the covered works
++for you must do so exclusively on your behalf, under your direction
++and control, on terms that prohibit them from making any copies of
++your copyrighted material outside their relationship with you.
++
++ Conveying under any other circumstances is permitted solely under
++the conditions stated below. Sublicensing is not allowed; section 10
++makes it unnecessary.
++
++ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
++
++ No covered work shall be deemed part of an effective technological
++measure under any applicable law fulfilling obligations under article
++11 of the WIPO copyright treaty adopted on 20 December 1996, or
++similar laws prohibiting or restricting circumvention of such
++measures.
++
++ When you convey a covered work, you waive any legal power to forbid
++circumvention of technological measures to the extent such circumvention
++is effected by exercising rights under this License with respect to
++the covered work, and you disclaim any intention to limit operation or
++modification of the work as a means of enforcing, against the work's
++users, your or third parties' legal rights to forbid circumvention of
++technological measures.
++
++ 4. Conveying Verbatim Copies.
++
++ You may convey verbatim copies of the Program's source code as you
++receive it, in any medium, provided that you conspicuously and
++appropriately publish on each copy an appropriate copyright notice;
++keep intact all notices stating that this License and any
++non-permissive terms added in accord with section 7 apply to the code;
++keep intact all notices of the absence of any warranty; and give all
++recipients a copy of this License along with the Program.
++
++ You may charge any price or no price for each copy that you convey,
++and you may offer support or warranty protection for a fee.
++
++ 5. Conveying Modified Source Versions.
++
++ You may convey a work based on the Program, or the modifications to
++produce it from the Program, in the form of source code under the
++terms of section 4, provided that you also meet all of these conditions:
++
++ a) The work must carry prominent notices stating that you modified
++ it, and giving a relevant date.
++
++ b) The work must carry prominent notices stating that it is
++ released under this License and any conditions added under section
++ 7. This requirement modifies the requirement in section 4 to
++ "keep intact all notices".
++
++ c) You must license the entire work, as a whole, under this
++ License to anyone who comes into possession of a copy. This
++ License will therefore apply, along with any applicable section 7
++ additional terms, to the whole of the work, and all its parts,
++ regardless of how they are packaged. This License gives no
++ permission to license the work in any other way, but it does not
++ invalidate such permission if you have separately received it.
++
++ d) If the work has interactive user interfaces, each must display
++ Appropriate Legal Notices; however, if the Program has interactive
++ interfaces that do not display Appropriate Legal Notices, your
++ work need not make them do so.
++
++ A compilation of a covered work with other separate and independent
++works, which are not by their nature extensions of the covered work,
++and which are not combined with it such as to form a larger program,
++in or on a volume of a storage or distribution medium, is called an
++"aggregate" if the compilation and its resulting copyright are not
++used to limit the access or legal rights of the compilation's users
++beyond what the individual works permit. Inclusion of a covered work
++in an aggregate does not cause this License to apply to the other
++parts of the aggregate.
++
++ 6. Conveying Non-Source Forms.
++
++ You may convey a covered work in object code form under the terms
++of sections 4 and 5, provided that you also convey the
++machine-readable Corresponding Source under the terms of this License,
++in one of these ways:
++
++ a) Convey the object code in, or embodied in, a physical product
++ (including a physical distribution medium), accompanied by the
++ Corresponding Source fixed on a durable physical medium
++ customarily used for software interchange.
++
++ b) Convey the object code in, or embodied in, a physical product
++ (including a physical distribution medium), accompanied by a
++ written offer, valid for at least three years and valid for as
++ long as you offer spare parts or customer support for that product
++ model, to give anyone who possesses the object code either (1) a
++ copy of the Corresponding Source for all the software in the
++ product that is covered by this License, on a durable physical
++ medium customarily used for software interchange, for a price no
++ more than your reasonable cost of physically performing this
++ conveying of source, or (2) access to copy the
++ Corresponding Source from a network server at no charge.
++
++ c) Convey individual copies of the object code with a copy of the
++ written offer to provide the Corresponding Source. This
++ alternative is allowed only occasionally and noncommercially, and
++ only if you received the object code with such an offer, in accord
++ with subsection 6b.
++
++ d) Convey the object code by offering access from a designated
++ place (gratis or for a charge), and offer equivalent access to the
++ Corresponding Source in the same way through the same place at no
++ further charge. You need not require recipients to copy the
++ Corresponding Source along with the object code. If the place to
++ copy the object code is a network server, the Corresponding Source
++ may be on a different server (operated by you or a third party)
++ that supports equivalent copying facilities, provided you maintain
++ clear directions next to the object code saying where to find the
++ Corresponding Source. Regardless of what server hosts the
++ Corresponding Source, you remain obligated to ensure that it is
++ available for as long as needed to satisfy these requirements.
++
++ e) Convey the object code using peer-to-peer transmission, provided
++ you inform other peers where the object code and Corresponding
++ Source of the work are being offered to the general public at no
++ charge under subsection 6d.
++
++ A separable portion of the object code, whose source code is excluded
++from the Corresponding Source as a System Library, need not be
++included in conveying the object code work.
++
++ A "User Product" is either (1) a "consumer product", which means any
++tangible personal property which is normally used for personal, family,
++or household purposes, or (2) anything designed or sold for incorporation
++into a dwelling. In determining whether a product is a consumer product,
++doubtful cases shall be resolved in favor of coverage. For a particular
++product received by a particular user, "normally used" refers to a
++typical or common use of that class of product, regardless of the status
++of the particular user or of the way in which the particular user
++actually uses, or expects or is expected to use, the product. A product
++is a consumer product regardless of whether the product has substantial
++commercial, industrial or non-consumer uses, unless such uses represent
++the only significant mode of use of the product.
++
++ "Installation Information" for a User Product means any methods,
++procedures, authorization keys, or other information required to install
++and execute modified versions of a covered work in that User Product from
++a modified version of its Corresponding Source. The information must
++suffice to ensure that the continued functioning of the modified object
++code is in no case prevented or interfered with solely because
++modification has been made.
++
++ If you convey an object code work under this section in, or with, or
++specifically for use in, a User Product, and the conveying occurs as
++part of a transaction in which the right of possession and use of the
++User Product is transferred to the recipient in perpetuity or for a
++fixed term (regardless of how the transaction is characterized), the
++Corresponding Source conveyed under this section must be accompanied
++by the Installation Information. But this requirement does not apply
++if neither you nor any third party retains the ability to install
++modified object code on the User Product (for example, the work has
++been installed in ROM).
++
++ The requirement to provide Installation Information does not include a
++requirement to continue to provide support service, warranty, or updates
++for a work that has been modified or installed by the recipient, or for
++the User Product in which it has been modified or installed. Access to a
++network may be denied when the modification itself materially and
++adversely affects the operation of the network or violates the rules and
++protocols for communication across the network.
++
++ Corresponding Source conveyed, and Installation Information provided,
++in accord with this section must be in a format that is publicly
++documented (and with an implementation available to the public in
++source code form), and must require no special password or key for
++unpacking, reading or copying.
++
++ 7. Additional Terms.
++
++ "Additional permissions" are terms that supplement the terms of this
++License by making exceptions from one or more of its conditions.
++Additional permissions that are applicable to the entire Program shall
++be treated as though they were included in this License, to the extent
++that they are valid under applicable law. If additional permissions
++apply only to part of the Program, that part may be used separately
++under those permissions, but the entire Program remains governed by
++this License without regard to the additional permissions.
++
++ When you convey a copy of a covered work, you may at your option
++remove any additional permissions from that copy, or from any part of
++it. (Additional permissions may be written to require their own
++removal in certain cases when you modify the work.) You may place
++additional permissions on material, added by you to a covered work,
++for which you have or can give appropriate copyright permission.
++
++ Notwithstanding any other provision of this License, for material you
++add to a covered work, you may (if authorized by the copyright holders of
++that material) supplement the terms of this License with terms:
++
++ a) Disclaiming warranty or limiting liability differently from the
++ terms of sections 15 and 16 of this License; or
++
++ b) Requiring preservation of specified reasonable legal notices or
++ author attributions in that material or in the Appropriate Legal
++ Notices displayed by works containing it; or
++
++ c) Prohibiting misrepresentation of the origin of that material, or
++ requiring that modified versions of such material be marked in
++ reasonable ways as different from the original version; or
++
++ d) Limiting the use for publicity purposes of names of licensors or
++ authors of the material; or
++
++ e) Declining to grant rights under trademark law for use of some
++ trade names, trademarks, or service marks; or
++
++ f) Requiring indemnification of licensors and authors of that
++ material by anyone who conveys the material (or modified versions of
++ it) with contractual assumptions of liability to the recipient, for
++ any liability that these contractual assumptions directly impose on
++ those licensors and authors.
++
++ All other non-permissive additional terms are considered "further
++restrictions" within the meaning of section 10. If the Program as you
++received it, or any part of it, contains a notice stating that it is
++governed by this License along with a term that is a further
++restriction, you may remove that term. If a license document contains
++a further restriction but permits relicensing or conveying under this
++License, you may add to a covered work material governed by the terms
++of that license document, provided that the further restriction does
++not survive such relicensing or conveying.
++
++ If you add terms to a covered work in accord with this section, you
++must place, in the relevant source files, a statement of the
++additional terms that apply to those files, or a notice indicating
++where to find the applicable terms.
++
++ Additional terms, permissive or non-permissive, may be stated in the
++form of a separately written license, or stated as exceptions;
++the above requirements apply either way.
++
++ 8. Termination.
++
++ You may not propagate or modify a covered work except as expressly
++provided under this License. Any attempt otherwise to propagate or
++modify it is void, and will automatically terminate your rights under
++this License (including any patent licenses granted under the third
++paragraph of section 11).
++
++ However, if you cease all violation of this License, then your
++license from a particular copyright holder is reinstated (a)
++provisionally, unless and until the copyright holder explicitly and
++finally terminates your license, and (b) permanently, if the copyright
++holder fails to notify you of the violation by some reasonable means
++prior to 60 days after the cessation.
++
++ Moreover, your license from a particular copyright holder is
++reinstated permanently if the copyright holder notifies you of the
++violation by some reasonable means, this is the first time you have
++received notice of violation of this License (for any work) from that
++copyright holder, and you cure the violation prior to 30 days after
++your receipt of the notice.
++
++ Termination of your rights under this section does not terminate the
++licenses of parties who have received copies or rights from you under
++this License. If your rights have been terminated and not permanently
++reinstated, you do not qualify to receive new licenses for the same
++material under section 10.
++
++ 9. Acceptance Not Required for Having Copies.
++
++ You are not required to accept this License in order to receive or
++run a copy of the Program. Ancillary propagation of a covered work
++occurring solely as a consequence of using peer-to-peer transmission
++to receive a copy likewise does not require acceptance. However,
++nothing other than this License grants you permission to propagate or
++modify any covered work. These actions infringe copyright if you do
++not accept this License. Therefore, by modifying or propagating a
++covered work, you indicate your acceptance of this License to do so.
++
++ 10. Automatic Licensing of Downstream Recipients.
++
++ Each time you convey a covered work, the recipient automatically
++receives a license from the original licensors, to run, modify and
++propagate that work, subject to this License. You are not responsible
++for enforcing compliance by third parties with this License.
++
++ An "entity transaction" is a transaction transferring control of an
++organization, or substantially all assets of one, or subdividing an
++organization, or merging organizations. If propagation of a covered
++work results from an entity transaction, each party to that
++transaction who receives a copy of the work also receives whatever
++licenses to the work the party's predecessor in interest had or could
++give under the previous paragraph, plus a right to possession of the
++Corresponding Source of the work from the predecessor in interest, if
++the predecessor has it or can get it with reasonable efforts.
++
++ You may not impose any further restrictions on the exercise of the
++rights granted or affirmed under this License. For example, you may
++not impose a license fee, royalty, or other charge for exercise of
++rights granted under this License, and you may not initiate litigation
++(including a cross-claim or counterclaim in a lawsuit) alleging that
++any patent claim is infringed by making, using, selling, offering for
++sale, or importing the Program or any portion of it.
++
++ 11. Patents.
++
++ A "contributor" is a copyright holder who authorizes use under this
++License of the Program or a work on which the Program is based. The
++work thus licensed is called the contributor's "contributor version".
++
++ A contributor's "essential patent claims" are all patent claims
++owned or controlled by the contributor, whether already acquired or
++hereafter acquired, that would be infringed by some manner, permitted
++by this License, of making, using, or selling its contributor version,
++but do not include claims that would be infringed only as a
++consequence of further modification of the contributor version. For
++purposes of this definition, "control" includes the right to grant
++patent sublicenses in a manner consistent with the requirements of
++this License.
++
++ Each contributor grants you a non-exclusive, worldwide, royalty-free
++patent license under the contributor's essential patent claims, to
++make, use, sell, offer for sale, import and otherwise run, modify and
++propagate the contents of its contributor version.
++
++ In the following three paragraphs, a "patent license" is any express
++agreement or commitment, however denominated, not to enforce a patent
++(such as an express permission to practice a patent or covenant not to
++sue for patent infringement). To "grant" such a patent license to a
++party means to make such an agreement or commitment not to enforce a
++patent against the party.
++
++ If you convey a covered work, knowingly relying on a patent license,
++and the Corresponding Source of the work is not available for anyone
++to copy, free of charge and under the terms of this License, through a
++publicly available network server or other readily accessible means,
++then you must either (1) cause the Corresponding Source to be so
++available, or (2) arrange to deprive yourself of the benefit of the
++patent license for this particular work, or (3) arrange, in a manner
++consistent with the requirements of this License, to extend the patent
++license to downstream recipients. "Knowingly relying" means you have
++actual knowledge that, but for the patent license, your conveying the
++covered work in a country, or your recipient's use of the covered work
++in a country, would infringe one or more identifiable patents in that
++country that you have reason to believe are valid.
++
++ If, pursuant to or in connection with a single transaction or
++arrangement, you convey, or propagate by procuring conveyance of, a
++covered work, and grant a patent license to some of the parties
++receiving the covered work authorizing them to use, propagate, modify
++or convey a specific copy of the covered work, then the patent license
++you grant is automatically extended to all recipients of the covered
++work and works based on it.
++
++ A patent license is "discriminatory" if it does not include within
++the scope of its coverage, prohibits the exercise of, or is
++conditioned on the non-exercise of one or more of the rights that are
++specifically granted under this License. You may not convey a covered
++work if you are a party to an arrangement with a third party that is
++in the business of distributing software, under which you make payment
++to the third party based on the extent of your activity of conveying
++the work, and under which the third party grants, to any of the
++parties who would receive the covered work from you, a discriminatory
++patent license (a) in connection with copies of the covered work
++conveyed by you (or copies made from those copies), or (b) primarily
++for and in connection with specific products or compilations that
++contain the covered work, unless you entered into that arrangement,
++or that patent license was granted, prior to 28 March 2007.
++
++ Nothing in this License shall be construed as excluding or limiting
++any implied license or other defenses to infringement that may
++otherwise be available to you under applicable patent law.
++
++ 12. No Surrender of Others' Freedom.
++
++ If conditions are imposed on you (whether by court order, agreement or
++otherwise) that contradict the conditions of this License, they do not
++excuse you from the conditions of this License. If you cannot convey a
++covered work so as to satisfy simultaneously your obligations under this
++License and any other pertinent obligations, then as a consequence you may
++not convey it at all. For example, if you agree to terms that obligate you
++to collect a royalty for further conveying from those to whom you convey
++the Program, the only way you could satisfy both those terms and this
++License would be to refrain entirely from conveying the Program.
++
++ 13. Use with the GNU Affero General Public License.
++
++ Notwithstanding any other provision of this License, you have
++permission to link or combine any covered work with a work licensed
++under version 3 of the GNU Affero General Public License into a single
++combined work, and to convey the resulting work. The terms of this
++License will continue to apply to the part which is the covered work,
++but the special requirements of the GNU Affero General Public License,
++section 13, concerning interaction through a network will apply to the
++combination as such.
++
++ 14. Revised Versions of this License.
++
++ The Free Software Foundation may publish revised and/or new versions of
++the GNU General Public License from time to time. Such new versions will
++be similar in spirit to the present version, but may differ in detail to
++address new problems or concerns.
++
++ Each version is given a distinguishing version number. If the
++Program specifies that a certain numbered version of the GNU General
++Public License "or any later version" applies to it, you have the
++option of following the terms and conditions either of that numbered
++version or of any later version published by the Free Software
++Foundation. If the Program does not specify a version number of the
++GNU General Public License, you may choose any version ever published
++by the Free Software Foundation.
++
++ If the Program specifies that a proxy can decide which future
++versions of the GNU General Public License can be used, that proxy's
++public statement of acceptance of a version permanently authorizes you
++to choose that version for the Program.
++
++ Later license versions may give you additional or different
++permissions. However, no additional obligations are imposed on any
++author or copyright holder as a result of your choosing to follow a
++later version.
++
++ 15. Disclaimer of Warranty.
++
++ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
++APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
++HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
++OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
++THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
++IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
++ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
++
++ 16. Limitation of Liability.
++
++ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
++THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
++GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
++USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
++DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
++PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
++EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
++SUCH DAMAGES.
++
++ 17. Interpretation of Sections 15 and 16.
++
++ If the disclaimer of warranty and limitation of liability provided
++above cannot be given local legal effect according to their terms,
++reviewing courts shall apply local law that most closely approximates
++an absolute waiver of all civil liability in connection with the
++Program, unless a warranty or assumption of liability accompanies a
++copy of the Program in return for a fee.
++
++ END OF TERMS AND CONDITIONS
++
++ How to Apply These Terms to Your New Programs
++
++ If you develop a new program, and you want it to be of the greatest
++possible use to the public, the best way to achieve this is to make it
++free software which everyone can redistribute and change under these terms.
++
++ To do so, attach the following notices to the program. It is safest
++to attach them to the start of each source file to most effectively
++state the exclusion of warranty; and each file should have at least
++the "copyright" line and a pointer to where the full notice is found.
++
++ <one line to give the program's name and a brief idea of what it does.>
++ Copyright (C) <year> <name of author>
++
++ This program is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++Also add information on how to contact you by electronic and paper mail.
++
++ If the program does terminal interaction, make it output a short
++notice like this when it starts in an interactive mode:
++
++ <program> Copyright (C) <year> <name of author>
++ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
++ This is free software, and you are welcome to redistribute it
++ under certain conditions; type `show c' for details.
++
++The hypothetical commands `show w' and `show c' should show the appropriate
++parts of the General Public License. Of course, your program's commands
++might be different; for a GUI interface, you would use an "about box".
++
++ You should also get your employer (if you work as a programmer) or school,
++if any, to sign a "copyright disclaimer" for the program, if necessary.
++For more information on this, and how to apply and follow the GNU GPL, see
++<http://www.gnu.org/licenses/>.
++
++ The GNU General Public License does not permit incorporating your program
++into proprietary programs. If your program is a subroutine library, you
++may consider it more useful to permit linking proprietary applications with
++the library. If this is what you want to do, use the GNU Lesser General
++Public License instead of this License. But first, please read
++<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/Makefile b/feeds/luci/applications/luci-app-pbx-voicemail/Makefile
+new file mode 100644
+index 0000000..d31d429
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI PBX Administration Voicemail Support
++LUCI_DEPENDS:=+luci-app-pbx +asterisk18 +msmtp +coreutils-base64
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/controller/pbx-voicemail.lua b/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/controller/pbx-voicemail.lua
+new file mode 100644
+index 0000000..6f3dfac
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/controller/pbx-voicemail.lua
+@@ -0,0 +1,24 @@
++--[[
++ Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
++
++ This file is part of luci-pbx-voicemail.
++
++ luci-pbx-voicemail is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ luci-pbx-voicemail is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with luci-pbx-voicemail. If not, see <http://www.gnu.org/licenses/>.
++]]--
++
++module("luci.controller.pbx-voicemail", package.seeall)
++
++function index()
++ entry({"admin", "services", "pbx", "pbx-voicemail"}, cbi("pbx-voicemail"), "Voicemail", 5)
++end
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/model/cbi/pbx-voicemail.lua b/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/model/cbi/pbx-voicemail.lua
+new file mode 100644
+index 0000000..9ff2ed9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/model/cbi/pbx-voicemail.lua
+@@ -0,0 +1,153 @@
++--[[
++ Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
++
++ This file is part of luci-pbx-voicemail.
++
++ luci-pbx-voicemail is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ luci-pbx-voicemail is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with luci-pbx-voicemail. If not, see <http://www.gnu.org/licenses/>.
++]]--
++
++if nixio.fs.access("/etc/init.d/asterisk") then
++ server = "asterisk"
++elseif nixio.fs.access("/etc/init.d/freeswitch") then
++ server = "freeswitch"
++else
++ server = ""
++end
++
++modulename = "pbx-voicemail"
++vmlogfile = "/tmp/last_sent_voicemail.log"
++
++m = Map (modulename, translate("Voicemail Setup"),
++ translate("Here you can configure a global voicemail for this PBX. Since this system is \
++ intended to run on embedded systems like routers, there is no local storage of voicemail - \
++ it must be sent out by email. Therefore you need to configure an outgoing mail (SMTP) server \
++ (for example your ISP's, Google's, or Yahoo's SMTP server), and provide a list of \
++ addresses that receive recorded voicemail."))
++
++-- Recreate the config, and restart services after changes are commited to the configuration.
++function m.on_after_commit(self)
++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
++ luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null")
++end
++
++
++----------------------------------------------------------------------------------------------------
++s = m:section(NamedSection, "global_voicemail", "voicemail", translate("Global Voicemail Setup"),
++ translate("When you enable voicemail, you will have the opportunity to specify \
++ email addresses that receive recorded voicemail. You must also set up an SMTP server below."))
++s.anonymous = true
++
++enable = s:option(ListValue, "enabled", translate("Enable Voicemail"))
++enable:value("yes", translate("Yes"))
++enable:value("no", translate("No"))
++enable.default = "no"
++
++emails = s:option(DynamicList, "global_email_addresses",
++ translate("Email Addresses that Receive Voicemail"))
++emails:depends("enabled", "yes")
++
++savepath = s:option(Value, "global_save_path", translate("Local Storage Directory"),
++ translate("You can also retain copies of voicemail messages on the device running \
++ your PBX. The path specified here will be created if it doesn't exist. \
++ Beware of limited space on embedded devices like routers, and enable this \
++ option only if you know what you are doing."))
++savepath.optional = true
++
++if nixio.fs.access("/etc/pbx-voicemail/recordings/greeting.gsm") then
++ m1 = s:option(DummyValue, "_m1")
++ m1:depends("enabled", "yes")
++ m1.default = "NOTE: Found a voicemail greeting. To check or change your voicemail greeting, dial *789 \
++ and the system will play back your current greeting. After that, a long beep will sound and \
++ you can press * in order to record a new message. Hang up to avoid recording a message. \
++ If you press *, a second long beep will sound, and you can record a new greeting. \
++ Hang up or press # to stop recording. When # is pressed the system will play back the \
++ new greeting."
++else
++ m1 = s:option(DummyValue, "_m1")
++ m1:depends("enabled", "yes")
++ m1.default = "WARNING: Could not find voicemail greeting. Callers will hear only a beep before \
++ recording starts. To record a greeting, dial *789, and press * after the long beep. \
++ If you press *, a second long beep will sound, and you can record a new greeting. \
++ Hang up or press # to stop recording. When # is pressed the system will play back the \
++ new greeting."
++end
++
++
++----------------------------------------------------------------------------------------------------
++s = m:section(NamedSection, "voicemail_smtp", "voicemail", translate("Outgoing mail (SMTP) Server"),
++ translate("In order for this PBX to send emails containing voicemail recordings, you need to \
++ set up an SMTP server here. Your ISP usually provides an SMTP server for that purpose. \
++ You can also set up a third party SMTP server such as the one provided by Google or Yahoo."))
++s.anonymous = true
++
++serv = s:option(Value, "smtp_server", translate("SMTP Server Hostname or IP Address"))
++serv.datatype = "host"
++
++port = s:option(Value, "smtp_port", translate("SMTP Port Number"))
++port.datatype = "port"
++port.default = "25"
++
++tls = s:option(ListValue, "smtp_tls", translate("Secure Connection Using TLS"))
++tls:value("on", translate("Yes"))
++tls:value("off", translate("No"))
++tls.default = "on"
++
++auth = s:option(ListValue, "smtp_auth", translate("SMTP Server Authentication"))
++auth:value("on", translate("Yes"))
++auth:value("off", translate("No"))
++auth.default = "off"
++
++user = s:option(Value, "smtp_user", translate("SMTP User Name"))
++user:depends("smtp_auth", "on")
++
++pwd = s:option(Value, "smtp_password", translate("SMTP Password"),
++ translate("Your real SMTP password is not shown for your protection. It will be changed \
++ only when you change the value in this box."))
++pwd.password = true
++pwd:depends("smtp_auth", "on")
++
++-- We skip reading off the saved value and return nothing.
++function pwd.cfgvalue(self, section)
++ return "Password Not Displayed"
++end
++
++-- We check the entered value against the saved one, and only write if the entered value is
++-- something other than the empty string, and it differes from the saved value.
++function pwd.write(self, section, value)
++ local orig_pwd = m:get(section, self.option)
++ if value == "Password Not Displayed" then value = "" end
++ if value and #value > 0 and orig_pwd ~= value then
++ Value.write(self, section, value)
++ end
++end
++
++----------------------------------------------------------------------------------------------------
++s = m:section(NamedSection, "voicemail_log", "voicemail", translate("Last Sent Voicemail Log"))
++s.anonymous = true
++
++s:option (DummyValue, "vmlog")
++
++sts = s:option(DummyValue, "_sts")
++sts.template = "cbi/tvalue"
++sts.rows = 5
++
++function sts.cfgvalue(self, section)
++ log = nixio.fs.readfile(vmlogfile)
++ if log == nil or log == "" then
++ log = "No errors or messages reported."
++ end
++ return log
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/ca/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/ca/pbx-voicemail.po
+new file mode 100644
+index 0000000..c0119f7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/ca/pbx-voicemail.po
+@@ -0,0 +1,100 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-01 05:47+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr "Adreces de correu electrònic que reben correu de veu"
++
++msgid "Enable Voicemail"
++msgstr "Habilita el correu de veu"
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr "Registre del últim correu de veu enviat"
++
++msgid "Local Storage Directory"
++msgstr "Directori d'emmagatzematge local"
++
++msgid "No"
++msgstr "No"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr "Servidor de correu sortint (SMTP)"
++
++msgid "SMTP Password"
++msgstr "Contrasenya SMTP"
++
++msgid "SMTP Port Number"
++msgstr "Nombre de port SMTP"
++
++msgid "SMTP Server Authentication"
++msgstr "Autenticació del servidor SMTP"
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr "Adreça IP o nom de host del servidor SMTP"
++
++msgid "SMTP User Name"
++msgstr "Nom d'usuari SMTP"
++
++msgid "Secure Connection Using TLS"
++msgstr "Assegura la connexió mitjançant TLS"
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++"Quan habiliteu el correu de veu, tindreu l'oportunitat d'especificar adreces "
++"de correu electrònic que reben correu de veu gravat. Heu d'establir també "
++"un servidor SMTP a baix."
++
++msgid "Yes"
++msgstr "Sí"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++"Podeu també retenir còpies de missatges de veu en el dispositiu executant el "
++"vostre PBX. La ruta especificat aquí es crearà si no existeix. Teniu compte "
++"d'espai limitat en dispositius incrustats com els encaminadors, i habiliteu "
++"aquesta opció només si coneixeu ho que feu."
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
++"La vostra contrasenya SMTP no es mostra per a la vostra protecció. Es "
++"canviarà només quan canvieu el valor en aquesta caixa."
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/cs/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/cs/pbx-voicemail.po
+new file mode 100644
+index 0000000..6d94b35
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/cs/pbx-voicemail.po
+@@ -0,0 +1,91 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-05 19:16+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr "Povolit Voicemail"
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr "Ne"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr "SMTP heslo"
++
++msgid "SMTP Port Number"
++msgstr "SMTP Äíslo portu"
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr "SMTP uživatelské jméno"
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr "Voicemail nastavení"
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr "Ano"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/de/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/de/pbx-voicemail.po
+new file mode 100644
+index 0000000..224b5a9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/de/pbx-voicemail.po
+@@ -0,0 +1,141 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-28 22:30+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr "E-Mail Adressen die Sprachnachrichten empfangen"
++
++msgid "Enable Voicemail"
++msgstr "Anrufbeantworter aktivieren"
++
++msgid "Global Voicemail Setup"
++msgstr "Allgemeine Einstellungen für Voicemail"
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++"Es kann ein systemweiter Anrufbeantworter für diese Telefonanlage (<abbr "
++"title=\"Private Branch eXchange\">PBX</abbr>) konfiguriert werden. Da dieses "
++"System für den Einsatz auf embedded Systemen wie Routern optimiert wurde, "
++"gibt es keine Möglichkeit die Sprachnachrichten lokal zu speichern. Sie "
++"müssen per E-Mail versendet werden. Daher muss ein ausgehender Mail-Server "
++"(<abbr title=\"Simple Mail Transfer Protocol\">SMTP</abbr>) konfiguriert "
++"werden. Hier kann zum Beispiel der SMTP-Server des Providers, aber auch ein "
++"Freemailer wie GMail eingetragen werden. Zusätzlich muss noch eine Liste von "
++"Adressen angegeben werden, an die aufgezeichnete Sprachnachrichten geschickt "
++"werden."
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++"Damit diese Telefonanlage (<abbr title=\"Private Branch eXchange\">PBX</abbr>) "
++"E-Mails mit Sprachaufnahmen senden kann, muss an dieser Stelle ein SMTP-"
++"Server eingetragen werden. Ihr Internet-Dienstanbieter (<abbr "
++"title=\"Internet Service Provider\">ISP</abbr>) stellt normalerweise einen "
++"SMTP-Server für diesen Zweck zur Verfügung. Sie können auch einen SMTP-"
++"Server eines Drittanbieters, wie z.B. Google oder Yahoo, hier einstellen."
++
++msgid "Last Sent Voicemail Log"
++msgstr "Log der zuletzt gesendeten Voicemails"
++
++msgid "Local Storage Directory"
++msgstr "Lokales Speicherverzeichnis"
++
++msgid "No"
++msgstr "Nein"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr "Server für ausgehende Mails (SMTP)"
++
++msgid "SMTP Password"
++msgstr "SMTP-Passwort"
++
++msgid "SMTP Port Number"
++msgstr "SMTP-Portnummer"
++
++msgid "SMTP Server Authentication"
++msgstr "SMTP-Server-Anmeldung"
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr "SMTP-Servername oder IP-Adresse"
++
++msgid "SMTP User Name"
++msgstr "SMTP-Benutzername"
++
++msgid "Secure Connection Using TLS"
++msgstr "Sichere Verbindung über TLS"
++
++msgid "Voicemail Setup"
++msgstr "Voicemail-Einstellungen"
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++"Wenn Sie Voicemail aktivieren, können Sie E-Mail-Adressen angeben, die "
++"aufgenommene Voicemails erhalten sollen. Sie müssen ebenfalls einen SMTP-"
++"Server unten angeben."
++
++msgid "Yes"
++msgstr "Ja"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++"Sie können auch Kopien Ihrer Voicemail-Nachrichten auf dem Gerät speichern. "
++"Der hier angegebene Pfad wird erstellt, falls er nicht existiert. Beachten "
++"Sie, dass Geräte wie Router nur begrenzten Speicherplatz haben, und "
++"aktivieren Sie diese Option nur, wenn Sie wissen, was Sie tun."
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
++"Ihr SMTP-Passwort wird zu Ihrem Schutz nicht angezeigt. Es wird nur "
++"geändert, wenn Sie dein Eintrag in diesem Kästchen verändern."
++
++#~ msgid "Directory to save voicemail into"
++#~ msgstr "Verzeichnis für eingehende Sprachnachrichten"
++
++#~ msgid "Enabled"
++#~ msgstr "Aktiviert"
++
++#~ msgid ""
++#~ "Here you can configure a global voicemail for this PBX. Since this system "
++#~ "is intended to run on embedded systems like routers, there is no local "
++#~ "storage of voicemail - it must be sent out by email. Therefore you need "
++#~ "to configure an outgoing mail (SMTP) server (for example the SMTP server "
++#~ "your ISP provides, or GMail), and provide a list of addresses the "
++#~ "voicemail will be sent to."
++#~ msgstr ""
++#~ "Es kann ein systemweiter Anrufbeantworter für diese Telefonanlage (<abbr "
++#~ "title=\"Private Branch eXchange\">PBX</abbr>) konfiguriert werden. Da "
++#~ "dieses System für den Einsatz auf embedded Systemen wie Routern optimiert "
++#~ "wurde, gibt es keine Möglichkeit die Sprachnachrichten lokal zu "
++#~ "speichern. Sie müssen per E-Mail versendet werden. Daher muss ein "
++#~ "ausgehender Mail-Server (<abbr title=\"Simple Mail Transfer Protocol"
++#~ "\">SMTP</abbr>) konfiguriert werden. Hier kann zum Beispiel der SMTP-"
++#~ "Server des Providers, aber auch ein Freemailer wie GMail verwendet "
++#~ "werden. Zusätzlich muss noch eine Liste von Adressen angegeben werden, zu "
++#~ "denen die Sprachnachrichten geschickt werden."
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/el/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/el/pbx-voicemail.po
+new file mode 100644
+index 0000000..fc0a2e3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/el/pbx-voicemail.po
+@@ -0,0 +1,94 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-18 15:26+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: none\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr "Όχι"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
++
++#~ msgid "Enabled"
++#~ msgstr "ΕνεÏγοποιημένο"
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/en/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/en/pbx-voicemail.po
+new file mode 100644
+index 0000000..79c8848
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/en/pbx-voicemail.po
+@@ -0,0 +1,169 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr "Email Addresses that Receive Voicemail"
++
++msgid "Enable Voicemail"
++msgstr "Enable Voicemail"
++
++msgid "Global Voicemail Setup"
++msgstr "Global Voicemail Setup"
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++
++msgid "Last Sent Voicemail Log"
++msgstr "Last Sent Voicemail Log"
++
++msgid "Local Storage Directory"
++msgstr "Local Storage Directory"
++
++msgid "No"
++msgstr "No"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr "Outgoing mail (SMTP) Server"
++
++msgid "SMTP Password"
++msgstr "SMTP Password"
++
++msgid "SMTP Port Number"
++msgstr "SMTP Port Number"
++
++msgid "SMTP Server Authentication"
++msgstr "SMTP Server Authentication"
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr "SMTP Server Hostname or IP Address"
++
++msgid "SMTP User Name"
++msgstr "SMTP User Name"
++
++msgid "Secure Connection Using TLS"
++msgstr "Secure Connection Using TLS"
++
++msgid "Voicemail Setup"
++msgstr "Voicemail Setup"
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++
++msgid "Yes"
++msgstr "Yes"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++
++#~ msgid "Directory to save voicemail into"
++#~ msgstr "Directory to save voicemail into"
++
++#~ msgid "Email addresses to forward to"
++#~ msgstr "Email addresses to forward to"
++
++#~ msgid "Enabled"
++#~ msgstr "Enabled"
++
++#~ msgid ""
++#~ "Here you can configure a global voicemail for this PBX. Since this system "
++#~ "is intended to run on embedded systems like routers, there is no local "
++#~ "storage of voicemail - it must be sent out by email. Therefore you need "
++#~ "to configure an outgoing mail (SMTP) server (for example the SMTP server "
++#~ "your ISP provides, or GMail), and provide a list of addresses the "
++#~ "voicemail will be sent to."
++#~ msgstr ""
++#~ "Here you can configure a global voicemail for this PBX. Since this system "
++#~ "is intended to run on embedded systems like routers, there is no local "
++#~ "storage of voicemail - it must be sent out by email. Therefore you need "
++#~ "to configure an outgoing mail (SMTP) server (for example the SMTP server "
++#~ "your ISP provides, or GMail), and provide a list of addresses the "
++#~ "voicemail will be sent to."
++
++#~ msgid ""
++#~ "In order for this PBX to send emails containing voicemail recordings, you "
++#~ "need to set up an SMTP server here. Your ISP usually provides an SMTP "
++#~ "server for that purpose. You can also set up a GMail, Yahoo, or other 3rd "
++#~ "party SMTP server."
++#~ msgstr ""
++#~ "In order for this PBX to send emails containing voicemail recordings, you "
++#~ "need to set up an SMTP server here. Your ISP usually provides an SMTP "
++#~ "server for that purpose. You can also set up a GMail, Yahoo, or other 3rd "
++#~ "party SMTP server."
++
++#~ msgid "SMTP port number"
++#~ msgstr "SMTP port number"
++
++#~ msgid "SMTP server authentication"
++#~ msgstr "SMTP server authentication"
++
++#~ msgid "SMTP server hostname or IP"
++#~ msgstr "SMTP server hostname or IP"
++
++#~ msgid "SMTP user name"
++#~ msgstr "SMTP user name"
++
++#~ msgid "Timeout before sending callers to voicemail"
++#~ msgstr "Timeout before sending callers to voicemail"
++
++#~ msgid "Use TLS (secure connection)"
++#~ msgstr "Use TLS (secure connection)"
++
++#~ msgid ""
++#~ "When you enable voicemail, you will have the opportunity to specify email "
++#~ "addresses which receive the message. You must also set up an SMTP server "
++#~ "below."
++#~ msgstr ""
++#~ "When you enable voicemail, you will have the opportunity to specify email "
++#~ "addresses which receive the message. You must also set up an SMTP server "
++#~ "below."
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/es/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/es/pbx-voicemail.po
+new file mode 100644
+index 0000000..384e169
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/es/pbx-voicemail.po
+@@ -0,0 +1,106 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-08-23 22:44+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr "Dirección de correo electrónica que recibe Voicemail"
++
++msgid "Enable Voicemail"
++msgstr "Activar Voicemail"
++
++msgid "Global Voicemail Setup"
++msgstr "Configuración global de Voicemail"
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++"Configure un correo de voz global para esta PBX. Como el sistema está "
++"diseñado para sistemas integrados como routers, no tiene un almacenamiento "
++"local y debe enviarse por correo. Por este motivo debe configurar un "
++"servidor SMTP de correo saliente (como ISP, Google o el correo de Yahoo) y "
++"establecer una lista de direcciones que recibirán el correo de voz grabado."
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++"Para usar esta PBX para enviar correos con grabaciones de correos de voz "
++"tiene que configurar un servidor SMTP. Su ISP es posible que tenga uno. "
++"También puede usar otros como los de Google o Yahoo."
++
++msgid "Last Sent Voicemail Log"
++msgstr "Último registro de Voicemail enviado"
++
++msgid "Local Storage Directory"
++msgstr "Directorio local de almacenamiento"
++
++msgid "No"
++msgstr "No"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr "Servidor de correo SMTP saliente"
++
++msgid "SMTP Password"
++msgstr "Contraseña SMTP"
++
++msgid "SMTP Port Number"
++msgstr "Número de puerto SMTP"
++
++msgid "SMTP Server Authentication"
++msgstr "Autentificación de servidor SMTP"
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr "Nombre del servidor SMTP o dirección IP"
++
++msgid "SMTP User Name"
++msgstr "Nombre de usuario SMTP"
++
++msgid "Secure Connection Using TLS"
++msgstr "Asegurar la conexión con TLS"
++
++msgid "Voicemail Setup"
++msgstr "Configuración de Voicemail"
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++"Cuando active Voicemail tendrá que especificar direcciones de correo que "
++"recibirán los correos grabados así como un servidor SMTP."
++
++msgid "Yes"
++msgstr "Sí"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++"También puede guardar copias de los mensajes de Voicemail en el dispositivo. "
++"El camino se creará si no existe. Tenga cuidado de no sobrepasar el espacio "
++"disponible en dispositivos pequeños como routers."
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
++"Su contraseña SMTP real no se muestra. Se cambiará solo cuando cambie el "
++"valor en esta caja."
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/fr/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/fr/pbx-voicemail.po
+new file mode 100644
+index 0000000..0ccaa50
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/fr/pbx-voicemail.po
+@@ -0,0 +1,88 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/he/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/he/pbx-voicemail.po
+new file mode 100644
+index 0000000..be25f0b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/he/pbx-voicemail.po
+@@ -0,0 +1,88 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/hu/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/hu/pbx-voicemail.po
+new file mode 100644
+index 0000000..be25f0b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/hu/pbx-voicemail.po
+@@ -0,0 +1,88 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/it/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/it/pbx-voicemail.po
+new file mode 100644
+index 0000000..fe8c4bf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/it/pbx-voicemail.po
+@@ -0,0 +1,110 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-02-09 21:15+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr "Indirizzi e-mail che ricevono Voicemail"
++
++msgid "Enable Voicemail"
++msgstr "Attiva Voicemail"
++
++msgid "Global Voicemail Setup"
++msgstr "Attiva Voicemail"
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++"Qui è possibile configurare un messaggio vocale globale per questo PBX. "
++"Poiché questo sistema è destinato a girare su sistemi embedded come router, "
++"non vi è alcuna memorizzazione locale di segreteria - deve essere inviato "
++"via e-mail. Pertanto, è necessario configurare un server di posta in uscita "
++"(SMTP) (ad esempio del vostro ISP, di Google, Server Yahoo SMTP), e di "
++"fornire un elenco di indirizzi che ricevono posta vocale registrato."
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++"Affinché questo PBX possa inviare messaggi di posta elettronica contenenti "
++"le registrazioni vocali, è necessario impostare un server SMTP qui. Il tuo "
++"ISP in genere fornisce un server SMTP per tale scopo. È inoltre possibile "
++"impostare un terzo SMTP come quello fornito da Google o Yahoo."
++
++msgid "Last Sent Voicemail Log"
++msgstr "Ultimo file di registro Voicemail inviato"
++
++msgid "Local Storage Directory"
++msgstr "Cartella di memorizzazione Locale"
++
++msgid "No"
++msgstr "No"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr "Server posta in uscita (SMTP)"
++
++msgid "SMTP Password"
++msgstr "Password SMTP"
++
++msgid "SMTP Port Number"
++msgstr "Numero Porta SMTP"
++
++msgid "SMTP Server Authentication"
++msgstr "Autenticazione Server SMTP"
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr "Nome Host Server SMTP o Indirizzo IP"
++
++msgid "SMTP User Name"
++msgstr "Nome Utente SMTP"
++
++msgid "Secure Connection Using TLS"
++msgstr "Connessione Sicura utilizzando TLS"
++
++msgid "Voicemail Setup"
++msgstr "Impostazione Voicemail"
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++"Quando si attiva la segreteria telefonica, si avrà la possibilità di "
++"specificare gli indirizzi e-mail che ricevono i messaggi vocali registrati. "
++"È inoltre necessario impostare un server SMTP di seguito."
++
++msgid "Yes"
++msgstr "Sì"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++"È inoltre possibile conservare copie dei messaggi vocali sul dispositivo che "
++"esegue il PBX. Il percorso specificato in questo campo viene creato se non "
++"esiste. Attenzione lo spazio è limitato sui dispositivi embedded come "
++"router, e abilitare questa opzione solo se si sa cosa si sta facendo."
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
++"La tua password SMTP reale non viene visualizzata per la vostra protezione. "
++"Verrà modificato solo quando si modifica il valore in questa casella."
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/ja/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/ja/pbx-voicemail.po
+new file mode 100644
+index 0000000..19e26bf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/ja/pbx-voicemail.po
+@@ -0,0 +1,88 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/ms/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/ms/pbx-voicemail.po
+new file mode 100644
+index 0000000..bf633a6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/ms/pbx-voicemail.po
+@@ -0,0 +1,87 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/no/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/no/pbx-voicemail.po
+new file mode 100644
+index 0000000..be25f0b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/no/pbx-voicemail.po
+@@ -0,0 +1,88 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/pl/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/pl/pbx-voicemail.po
+new file mode 100644
+index 0000000..3f07fe4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/pl/pbx-voicemail.po
+@@ -0,0 +1,111 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-05 02:29+0200\n"
++"Last-Translator: piosl <sleczek.piotr@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr "Adres e-mail do odbierania poczty głosowej"
++
++msgid "Enable Voicemail"
++msgstr "Włącz pocztę głosową"
++
++msgid "Global Voicemail Setup"
++msgstr "Ustawienia globalnej poczty głosowej"
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++"Tutaj można skonfigurować globalną pocztę głosową dla PBX. Ponieważ system "
++"ten jest przeznaczony do pracy w systemach wbudowanych, takich jak routery, "
++"nie ma możliwości lokalnego przechowywania poczty głosowej - wiadomości "
++"muszą być wysłane e-mailem. Z tego powodu należy skonfigurować serwer poczty "
++"wychodzącej (SMTP) i podać listę adresów, które będą otrzymywać nagrania z "
++"poczty głosowej"
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++"W celu wysyłało e-maili zawierających nagrania poczty głosowej przez PBX, "
++"należy skonfigurować serwer SMTP. Twój dostawca usług internetowych "
++"zazwyczaj dostarcza serwer SMTP. Można również skonfigurować serwer SMTP "
++"firm trzecich, takich jak Google lub Yahoo."
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr "Lokalny katalog przechowywania"
++
++msgid "No"
++msgstr "Nie"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr "Serwer poczty wychodzÄ…cej (SMTP)"
++
++msgid "SMTP Password"
++msgstr "Hasło SMTP"
++
++msgid "SMTP Port Number"
++msgstr "Numer portu SMTP"
++
++msgid "SMTP Server Authentication"
++msgstr "Uwierzytelnianie serwera SMTP"
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr "Nazwa hosta serwera SMTP lub adres IP"
++
++msgid "SMTP User Name"
++msgstr "Nazwa użytkownika SMTP"
++
++msgid "Secure Connection Using TLS"
++msgstr "Bezpieczne połączenie za pomocą protokołu TLS"
++
++msgid "Voicemail Setup"
++msgstr "Ustawienia Poczty głosowej"
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++"Po włączeniu poczty głosowej, będziesz miał szansę na podanie adresów "
++"e-mail, które będą otrzymywać nagrane wiadomości głosowe. Musisz również "
++"skonfigurować serwer SMTP."
++
++msgid "Yes"
++msgstr "Tak"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++"Możesz też zachować kopie nagrań poczty głosowej na urządzeniu, na którym "
++"działa PBX. Ścieżka określona tutaj zostanie utworzona, jeśli nie istnieje. "
++"Pamiętaj o ograniczonym miejscu na urządzeniach takich jak routery i włącz "
++"tę opcję tylko jeśli wiesz co robisz."
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
++"Twoje prawdziwe hasło SMTP nie jest pokazane dla Twojej ochrony. Zostanie "
++"zmienione tylko jeśli zmienisz wartość w tym polu."
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/pt-br/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/pt-br/pbx-voicemail.po
+new file mode 100644
+index 0000000..2e3a51e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/pt-br/pbx-voicemail.po
+@@ -0,0 +1,175 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-16 02:32+0200\n"
++"Last-Translator: Julio Cezar <jsilvestree@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr "Endereços de correio eletrônicos que Recebem Correio de Voz"
++
++msgid "Enable Voicemail"
++msgstr "Habilitar o Correio de Voz"
++
++msgid "Global Voicemail Setup"
++msgstr "Configuração Global do Correio de Voz"
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++"Aqui você pode configurar um correio de voz global para este PBX. Uma vez "
++"que este sistema é previsto para ser executado em ambientes embarcados como "
++"roteadores, não existe armazenamento local do correio de voz - ele deve ser "
++"enviado por correio eletrônico. Desta maneira, você deve configurar um "
++"servidor (SMTP) de correio eletrônico (por exemplo, o servidor SMTP do seu "
++"provedor de Internet, do Google ou do Yahool), e fornecer uma lista dos "
++"endereços para os quais o correio de voz será enviado."
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++"Para este PBX enviar mensagens eletrônicas contendo as gravações do correio "
++"de voz, você precisa definir aqui um servidor SMTP. Seu provedor de Internet "
++"geralmente fornece um servidor SMTP para este propósito. Você também pode "
++"usar um servidor de terceiros como os fornecidos pelo GMail ou Yahoo."
++
++msgid "Last Sent Voicemail Log"
++msgstr "Registro do Último Correio de Voz Enviado"
++
++msgid "Local Storage Directory"
++msgstr "Diretório de Armazenamento Local"
++
++msgid "No"
++msgstr "Não"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr "Servidor de correio eletrônico (SMTP) para envio"
++
++msgid "SMTP Password"
++msgstr "Senha do SMTP"
++
++msgid "SMTP Port Number"
++msgstr "Porta do SMTP"
++
++msgid "SMTP Server Authentication"
++msgstr "Autenticação do Servidor SMTP"
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr "Nome do Equipamento ou Endereço IP do Servidor SMTP"
++
++msgid "SMTP User Name"
++msgstr "Nome do Usuário do SMTP"
++
++msgid "Secure Connection Using TLS"
++msgstr "Proteja a Conexão Usando TLS"
++
++msgid "Voicemail Setup"
++msgstr "Configuração do Correio de Voz"
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++"Quando você habilita o correio de voz, você terá a oportunidade de "
++"especificar endereços de correio eletrônio que recebem o correio de voz "
++"gravado. Você precisa também configurar um servidor SMTP abaixo."
++
++msgid "Yes"
++msgstr "Sim"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++"Você pode também manter cópias das mensagens de correio de voz no "
++"dispositivo executando o seu PBX. O caminho especificado aqui será criado se "
++"ele não existe. Cuidado com espaço limitado em dispositivos embarcados, como "
++"roteadores, e habilite esta opção apenas se você sabe o que você está "
++"fazendo."
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
++"Sua senha real do SMTP não é mostrada para a sua proteção. Ela será alterada "
++"apenas quando você modificar o valor neste campo."
++
++#~ msgid "Directory to save voicemail into"
++#~ msgstr "Diretório para salvar o correio de voz"
++
++#~ msgid "Email addresses to forward to"
++#~ msgstr "Endereços de correio eletrônicos para encaminhar"
++
++#~ msgid "Enabled"
++#~ msgstr "Habilitado"
++
++#~ msgid ""
++#~ "Here you can configure a global voicemail for this PBX. Since this system "
++#~ "is intended to run on embedded systems like routers, there is no local "
++#~ "storage of voicemail - it must be sent out by email. Therefore you need "
++#~ "to configure an outgoing mail (SMTP) server (for example the SMTP server "
++#~ "your ISP provides, or GMail), and provide a list of addresses the "
++#~ "voicemail will be sent to."
++#~ msgstr ""
++#~ "Aqui você pode configurar um correio de voz global para este PBX. Uma vez "
++#~ "que este sistema é previsto para ser executado em ambientes embarcados "
++#~ "como roteadores, não existe armazenamento local do correio de voz - ele "
++#~ "deve ser enviado por correio eletrônico. Desta maneira, você deve "
++#~ "configurar um servidor (SMTP) de correio eletrônico (por exemplo, o "
++#~ "servidor SMTP do seu provedor de Internet, ou o do GMail), e fornecer uma "
++#~ "lista dos endereços para os quais o correio de voz será enviado."
++
++#~ msgid ""
++#~ "In order for this PBX to send emails containing voicemail recordings, you "
++#~ "need to set up an SMTP server here. Your ISP usually provides an SMTP "
++#~ "server for that purpose. You can also set up a GMail, Yahoo, or other 3rd "
++#~ "party SMTP server."
++#~ msgstr ""
++#~ "Para este PBX enviar mensagens eletrônicas contendo as gravações do "
++#~ "correio de voz, você precisa definir aqui um servidor SMTP. Seu provedor "
++#~ "de Internet geralmente fornece um servidor SMTP para este propósito. Você "
++#~ "também pode usar o servidor SMTP do GMail, Yahoo, ou outro de terceiros."
++
++#~ msgid "SMTP port number"
++#~ msgstr "Número da porta do SMTP"
++
++#~ msgid "SMTP server authentication"
++#~ msgstr "Autenticação do servidor SMTP"
++
++#~ msgid "SMTP server hostname or IP"
++#~ msgstr "Nome do equipamento ou endereço IP do servidor SMTP"
++
++#~ msgid "SMTP user name"
++#~ msgstr "Nome do usuário do SMTP"
++
++#~ msgid "Timeout before sending callers to voicemail"
++#~ msgstr "Tempo de espera antes de enviar chamadas para correio de voz"
++
++#~ msgid "Use TLS (secure connection)"
++#~ msgstr "Usar TLS (conexão segura)"
++
++#~ msgid ""
++#~ "When you enable voicemail, you will have the opportunity to specify email "
++#~ "addresses which receive the message. You must also set up an SMTP server "
++#~ "below."
++#~ msgstr ""
++#~ "Quando você habilita o correio de voz, você terá a oportunidade de "
++#~ "especificar endereços de correio eletrônio que recebem a mensagem. Você "
++#~ "também deve configurar um servidor SMTP abaixo."
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/pt/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/pt/pbx-voicemail.po
+new file mode 100644
+index 0000000..f5cfd89
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/pt/pbx-voicemail.po
+@@ -0,0 +1,91 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-06-03 18:28+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr "Ativar Voicemail"
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr "Não"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr "Servidor de Envio de mail (SMTP)"
++
++msgid "SMTP Password"
++msgstr "Password SMTP"
++
++msgid "SMTP Port Number"
++msgstr "Porta SMTP"
++
++msgid "SMTP Server Authentication"
++msgstr "Servidor de Autenticação SMTP"
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr "Nome ou Endereço IP do Servidor SMTP"
++
++msgid "SMTP User Name"
++msgstr "Utilizador SMTP"
++
++msgid "Secure Connection Using TLS"
++msgstr "Ligação Segura usando TLS"
++
++msgid "Voicemail Setup"
++msgstr "Configuração do Voicemail"
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr "Sim"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/ro/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/ro/pbx-voicemail.po
+new file mode 100644
+index 0000000..42b66f6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/ro/pbx-voicemail.po
+@@ -0,0 +1,89 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2;\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/ru/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/ru/pbx-voicemail.po
+new file mode 100644
+index 0000000..ae49c6d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/ru/pbx-voicemail.po
+@@ -0,0 +1,174 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: pbx-voicemail\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2012-08-15 17:42+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr "ÐÐ´Ñ€ÐµÑ Ñл. почты Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñовой почты"
++
++msgid "Enable Voicemail"
++msgstr "Включить голоÑовую почту"
++
++msgid "Global Voicemail Setup"
++msgstr "Глобальные наÑтройки голоÑовой почты"
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++"ЗдеÑÑŒ Ð’Ñ‹ можете наÑтроить голоÑовую почту ÐТС. Так как Ð´Ð°Ð½Ð½Ð°Ñ ÑиÑтема "
++"ÑвлÑетÑÑ Ð²Ñтраиваемой и предназначена Ð´Ð»Ñ Ñ‚Ð°ÐºÐ¸Ñ… уÑтройÑтв как, например, "
++"маршрутизаторы, локальное хранилище голоÑовой почты отÑутÑтвует. ГолоÑÐ¾Ð²Ð°Ñ "
++"почта переÑылаетÑÑ Ñ‡ÐµÑ€ÐµÐ· Ñлектронную почту. Следовательно, вам нужно указать "
++"Ñервер иÑходÑщей почты (SMTP) и перечиÑлить адреÑа, на которые будет "
++"переÑылатьÑÑ Ð³Ð¾Ð»Ð¾ÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°."
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++"Чтобы отÑылать Ñлектронную почту Ñ Ð·Ð°Ð¿Ð¸ÑÑми голоÑовой почты, вам необходимо "
++"указать SMTP-Ñервер. Ð’Ñ‹ можете иÑпользовать SMTP-Ñервер вашего интернет-"
++"провайдера или любой другой, например, SMTP-Ñервер Google или Yahoo."
++
++msgid "Last Sent Voicemail Log"
++msgstr "ЗапиÑÑŒ журнала поÑледнего отправленного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñовой почты"
++
++msgid "Local Storage Directory"
++msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ"
++
++msgid "No"
++msgstr "Ðет"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr "Сервер иÑходÑщей почты (SMTP)"
++
++msgid "SMTP Password"
++msgstr "Пароль SMTP"
++
++msgid "SMTP Port Number"
++msgstr "Ðомер порта SMTP"
++
++msgid "SMTP Server Authentication"
++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SMTP-Ñервера"
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr "Ð˜Ð¼Ñ SMTP-Ñервера или IP-адреÑ"
++
++msgid "SMTP User Name"
++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ SMTP"
++
++msgid "Secure Connection Using TLS"
++msgstr "Защищенное Ñоединение Ñ Ð¸Ñпользованием TLS"
++
++msgid "Voicemail Setup"
++msgstr "ÐаÑтройка голоÑовой почты"
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++"При включении голоÑовой почты, у Ð²Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ возможноÑÑ‚ÑŒ указать адреÑа "
++"Ñлектронной почты, на которые будут отправлÑÑ‚ÑŒÑÑ Ð·Ð°Ð¿Ð¸Ñи голоÑовой почты. Ð’Ñ‹ "
++"также должны указать SMTP-Ñервер ниже."
++
++msgid "Yes"
++msgstr "Да"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++"Ð’Ñ‹ также можете ÑохранÑÑ‚ÑŒ копии Ñообщений голоÑовой почты локально на "
++"уÑтройÑтве Ñ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð½Ð¾Ð¹ ÐТС. Указанный здеÑÑŒ путь будет Ñоздан в Ñлучае его "
++"отÑутÑтвиÑ. Учитывайте, что проÑтранÑтво Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñообщений голоÑовой "
++"почты может быть ограничено вашим уÑтройÑтвом."
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
++"Ваш наÑтоÑщий пароль SMTP здеÑÑŒ не показан. Он будет изменён только тогда, "
++"когда вы измените значение в Ñтом поле."
++
++#~ msgid "Directory to save voicemail into"
++#~ msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñовой почты"
++
++#~ msgid "Email addresses to forward to"
++#~ msgstr "ÐÐ´Ñ€ÐµÑ Ñл. почты Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ"
++
++#~ msgid "Enabled"
++#~ msgstr "Включено"
++
++#~ msgid ""
++#~ "Here you can configure a global voicemail for this PBX. Since this system "
++#~ "is intended to run on embedded systems like routers, there is no local "
++#~ "storage of voicemail - it must be sent out by email. Therefore you need "
++#~ "to configure an outgoing mail (SMTP) server (for example the SMTP server "
++#~ "your ISP provides, or GMail), and provide a list of addresses the "
++#~ "voicemail will be sent to."
++#~ msgstr ""
++#~ "ЗдеÑÑŒ Ð’Ñ‹ можете наÑтроить голоÑовую почту ÐТС. Так как Ð´Ð°Ð½Ð½Ð°Ñ ÑиÑтема "
++#~ "ÑвлÑетÑÑ Ð²Ñтраиваемой и предназначена Ð´Ð»Ñ Ñ‚Ð°ÐºÐ¸Ñ… уÑтройÑтв как, например, "
++#~ "маршрутизаторы, локальное хранилище голоÑовой почты отÑутÑтвует. "
++#~ "ГолоÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° переÑылаетÑÑ Ñ‡ÐµÑ€ÐµÐ· Ñлектронную почту. Следовательно, Вам "
++#~ "нужно указать Ñервер (SMTP) иÑходÑщей почты и перечиÑлить адреÑа на "
++#~ "которые будет переÑылатьÑÑ Ð³Ð¾Ð»Ð¾ÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°."
++
++#~ msgid ""
++#~ "In order for this PBX to send emails containing voicemail recordings, you "
++#~ "need to set up an SMTP server here. Your ISP usually provides an SMTP "
++#~ "server for that purpose. You can also set up a GMail, Yahoo, or other 3rd "
++#~ "party SMTP server."
++#~ msgstr ""
++#~ "Чтобы отÑылать Ñлектронную почту Ñ Ð·Ð°Ð¿Ð¸ÑÑми голоÑовой почты, Вам "
++#~ "необходимо указать SMTP Ñервер. Ð’Ñ‹ можете иÑпользовать SMTP Ñервер вашего "
++#~ "интернет провайдера или любой другой, например, SMTP Ñервер GMail или "
++#~ "Yahoo."
++
++#~ msgid "SMTP port number"
++#~ msgstr "Ðомер порта SMTP"
++
++#~ msgid "SMTP server authentication"
++#~ msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SMTP Ñервера"
++
++#~ msgid "SMTP server hostname or IP"
++#~ msgstr "Ð˜Ð¼Ñ SMTP Ñервера или IP адреÑ"
++
++#~ msgid "SMTP user name"
++#~ msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ SMTP"
++
++#~ msgid "Timeout before sending callers to voicemail"
++#~ msgstr "Таймаут перед перенаправлением звонÑщих на голоÑовую почту"
++
++#~ msgid "Use TLS (secure connection)"
++#~ msgstr "ИÑпользовать TLS (защищенное Ñоединение)"
++
++#~ msgid ""
++#~ "When you enable voicemail, you will have the opportunity to specify email "
++#~ "addresses which receive the message. You must also set up an SMTP server "
++#~ "below."
++#~ msgstr ""
++#~ "При включении голоÑовой почты, у Ð’Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ возможноÑÑ‚ÑŒ указать адреÑа "
++#~ "Ñлектронной почты на которые будут отправлÑÑ‚ÑŒÑÑ Ð·Ð°Ð¿Ð¸Ñи голоÑовой почты. "
++#~ "Ð’Ñ‹ также должны указать SMTP Ñервер ниже."
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/sk/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/sk/pbx-voicemail.po
+new file mode 100644
+index 0000000..c3a5c5f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/sk/pbx-voicemail.po
+@@ -0,0 +1,88 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/sv/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/sv/pbx-voicemail.po
+new file mode 100644
+index 0000000..ea62b39
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/sv/pbx-voicemail.po
+@@ -0,0 +1,89 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/templates/pbx-voicemail.pot b/feeds/luci/applications/luci-app-pbx-voicemail/po/templates/pbx-voicemail.pot
+new file mode 100644
+index 0000000..35cdca3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/templates/pbx-voicemail.pot
+@@ -0,0 +1,81 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/tr/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/tr/pbx-voicemail.po
+new file mode 100644
+index 0000000..19e26bf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/tr/pbx-voicemail.po
+@@ -0,0 +1,88 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/uk/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/uk/pbx-voicemail.po
+new file mode 100644
+index 0000000..5654183
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/uk/pbx-voicemail.po
+@@ -0,0 +1,89 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/vi/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/vi/pbx-voicemail.po
+new file mode 100644
+index 0000000..19e26bf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/vi/pbx-voicemail.po
+@@ -0,0 +1,88 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr ""
++
++msgid "Enable Voicemail"
++msgstr ""
++
++msgid "Global Voicemail Setup"
++msgstr ""
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++
++msgid "Last Sent Voicemail Log"
++msgstr ""
++
++msgid "Local Storage Directory"
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr ""
++
++msgid "SMTP Password"
++msgstr ""
++
++msgid "SMTP Port Number"
++msgstr ""
++
++msgid "SMTP Server Authentication"
++msgstr ""
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr ""
++
++msgid "SMTP User Name"
++msgstr ""
++
++msgid "Secure Connection Using TLS"
++msgstr ""
++
++msgid "Voicemail Setup"
++msgstr ""
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-cn/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-cn/pbx-voicemail.po
+new file mode 100644
+index 0000000..0be8258
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-cn/pbx-voicemail.po
+@@ -0,0 +1,97 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-08 18:42+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr "接收语音邮箱的电å­é‚®ç®±åœ°å€"
++
++msgid "Enable Voicemail"
++msgstr "å¯ç”¨è¯­éŸ³é‚®ç®±"
++
++msgid "Global Voicemail Setup"
++msgstr "全局语音邮箱设置"
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++"在这里,你å¯ä»¥ä¸ºPBXé…置一个全çƒæ€§çš„语音邮件。由于这个系统è¿è¡Œåœ¨åµŒå…¥å¼ç³»ç»Ÿä¸­ï¼Œå¦‚路由器,没有本地存储语音邮件 - 它必须通过电å­é‚®ä»¶å‘é€å‡ºåŽ»ã€‚因此,你"
++"需è¦é…置一个外å‘邮件(SMTP)æœåŠ¡å™¨ï¼ˆä¾‹å¦‚您的ISP,谷歌或雅虎的SMTPæœåŠ¡å™¨ï¼‰ï¼Œå¹¶æ供接收记录语音信箱的地å€çš„列表。"
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++"为了这个PBXå‘é€åŒ…å«è¯­éŸ³ä¿¡ç®±å½•éŸ³çš„电å­é‚®ä»¶ï¼Œä½ éœ€è¦åœ¨è¿™é‡Œè®¾ç½®ä¸€ä¸ªSMTPæœåŠ¡å™¨ã€‚您的ISP通常会æ供一个SMTPæœåŠ¡å™¨ã€‚您也å¯ä»¥è®¾ç«‹ä¸€ä¸ªç¬¬ä¸‰æ–¹çš„SMT"
++"PæœåŠ¡å™¨ï¼Œåƒè°·æ­Œæˆ–雅虎。"
++
++msgid "Last Sent Voicemail Log"
++msgstr "最åŽå‘é€çš„语音信箱日志"
++
++msgid "Local Storage Directory"
++msgstr "本地存储目录"
++
++msgid "No"
++msgstr "ä¸"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr "电å­é‚®ä»¶å‘é€æœåŠ¡å™¨ï¼ˆSMTP)"
++
++msgid "SMTP Password"
++msgstr "SMTP登录密ç "
++
++msgid "SMTP Port Number"
++msgstr "SMTP端å£"
++
++msgid "SMTP Server Authentication"
++msgstr "SMTPæœåŠ¡å™¨è®¤è¯"
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr "SMTPæœåŠ¡å™¨ä¸»æœºå或IP地å€"
++
++msgid "SMTP User Name"
++msgstr "SMTP用户å"
++
++msgid "Secure Connection Using TLS"
++msgstr "使用TLS安全连接"
++
++msgid "Voicemail Setup"
++msgstr "语音邮箱设置"
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr "当你å¯ç”¨äº†è¯­éŸ³ä¿¡ç®±ï¼Œä½ å°†è¦æŒ‡å®šæŽ¥æ”¶è®°å½•è¯­éŸ³ä¿¡ç®±çš„电å­é‚®ä»¶åœ°å€ã€‚您还必须设置下é¢çš„SMTPæœåŠ¡å™¨"
++
++msgid "Yes"
++msgstr "是"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++"您也å¯ä»¥ä¿ç•™æ‚¨çš„PBX语音信箱留言的副本在你è¿è¡Œçš„设备上。此处指定的路径当ä¸å­˜åœ¨æ—¶ï¼Œå°†è¢«åˆ›å»ºã€‚谨防嵌入å¼è®¾å¤‡ä¸Šæœ‰é™çš„å­˜å–空间,如路由器,所以此选项åªæœ‰ä½ "
++"当知é“处ç†æ—¶æ‰å¯ä½¿ç”¨ã€‚"
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr "为了ä¿æŠ¤æ‚¨çœŸæ­£çš„SMTP密ç ä¸æ˜¾ç¤ºã€‚该选项需è¦æ›´æ”¹ã€‚"
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-tw/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-tw/pbx-voicemail.po
+new file mode 100644
+index 0000000..14de629
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-tw/pbx-voicemail.po
+@@ -0,0 +1,98 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 18:41+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Email Addresses that Receive Voicemail"
++msgstr "接收語音郵件的信箱ä½å€"
++
++msgid "Enable Voicemail"
++msgstr "啟用語音郵件功能"
++
++msgid "Global Voicemail Setup"
++msgstr "語音郵件通用設定"
++
++msgid ""
++"Here you can configure a global voicemail for this PBX. Since this system is "
++"intended to run on embedded systems like routers, there is no local storage "
++"of voicemail - it must be sent out by email. Therefore you need to configure "
++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's "
++"SMTP server), and provide a list of addresses that receive recorded "
++"voicemail."
++msgstr ""
++"在這裡å¯ä»¥å¹«PBX總機設定通用語音郵件. 因為這個系統想è¦åƒè·¯ç”±å™¨ä¸€èˆ¬è·‘在嵌入å¼ç³»çµ±, 這裡並無本地語言郵件的儲存空間 - 它必須由郵件來傳é€. "
++"因此你需è¦è¨­å®šä¸€å€‹(SMTP)外寄郵件伺æœå™¨(例如你的ISP, Google, 或者Yahoo外寄郵件伺æœå™¨), "
++"並且æ供一個ä½å€æ¸…å–®å¯ä»¥æŽ¥æ”¶éŒ„音檔的語音郵件."
++
++msgid ""
++"In order for this PBX to send emails containing voicemail recordings, you "
++"need to set up an SMTP server here. Your ISP usually provides an SMTP server "
++"for that purpose. You can also set up a third party SMTP server such as the "
++"one provided by Google or Yahoo."
++msgstr ""
++"為了幫PBX總機傳é€é™„帶語音郵件錄音檔, 你必須設定一個(SMTP)外寄郵件伺æœå™¨.通常你的ISP會æ供一個SMTP外寄郵件伺æœå™¨è®“客戶寄信,.你也å¯ä»¥"
++"設定第三方SMTP外寄郵件伺æœå™¨é¡žä¼¼Google或Yahooæ供的也行."
++
++msgid "Last Sent Voicemail Log"
++msgstr "上一次傳é€èªžéŸ³éƒµä»¶çš„記錄"
++
++msgid "Local Storage Directory"
++msgstr "本地端儲存目錄"
++
++msgid "No"
++msgstr "No"
++
++msgid "Outgoing mail (SMTP) Server"
++msgstr "外寄郵件(SMTP)伺æœå™¨"
++
++msgid "SMTP Password"
++msgstr "外寄郵件(SMTP)伺æœå™¨å‚³é€å¯†ç¢¼"
++
++msgid "SMTP Port Number"
++msgstr "外寄郵件(SMTP)伺æœå™¨æœå‹™åŸ è™Ÿ"
++
++msgid "SMTP Server Authentication"
++msgstr "外寄郵件(SMTP)伺æœå™¨é©—è­‰"
++
++msgid "SMTP Server Hostname or IP Address"
++msgstr "外寄郵件(SMTP)伺æœå™¨ä¸»æ©Ÿå稱或者IPä½å€"
++
++msgid "SMTP User Name"
++msgstr "外寄郵件(SMTP)伺æœå™¨ç™»å…¥ä½¿ç”¨è€…å稱"
++
++msgid "Secure Connection Using TLS"
++msgstr "採用TLS加密å”議安全連線"
++
++msgid "Voicemail Setup"
++msgstr "設定語音郵件"
++
++msgid ""
++"When you enable voicemail, you will have the opportunity to specify email "
++"addresses that receive recorded voicemail. You must also set up an SMTP "
++"server below."
++msgstr "當你啟用語音郵件功能, 擬將有機會指定特定å¯æŽ¥æ”¶éŒ„音檔的語音郵件的郵件ä½å€. 你也必須在下é¢è¨­å®šå¤–寄郵件(SMTP)伺æœå™¨."
++
++msgid "Yes"
++msgstr "Yes"
++
++msgid ""
++"You can also retain copies of voicemail messages on the device running your "
++"PBX. The path specified here will be created if it doesn't exist. Beware of "
++"limited space on embedded devices like routers, and enable this option only "
++"if you know what you are doing."
++msgstr ""
++"你也å¯ä»¥ä¿ç•™èªžéŸ³éƒµä»¶è¨Šæ¯çš„複本在PBX總機的設備上. 這裡所指定的路徑如果它ä¸å­˜åœ¨æ™‚將會被建立. 為é é˜²åƒè·¯ç”±å™¨çš„嵌入å¼è¨­å‚™æœ‰é™çš„空間é™åˆ¶, "
++"如果你確定這個用途請啟用這個é¸é …."
++
++msgid ""
++"Your real SMTP password is not shown for your protection. It will be changed "
++"only when you change the value in this box."
++msgstr "為了ä¿è­·ä½ çš„SMTP密碼將ä¸æœƒé¡¯ç¤º. åªæœ‰ç•¶ä½ æ”¹è®Šç›’å­ä¸­çš„值時它將會被變更"
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/config/pbx-voicemail b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/config/pbx-voicemail
+new file mode 100644
+index 0000000..94e3e96
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/config/pbx-voicemail
+@@ -0,0 +1,6 @@
++config 'voicemail' 'global_voicemail'
++
++config 'voicemail' 'voicemail_smtp'
++
++config 'voicemail' 'voicemail_log'
++
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-move-greeting b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-move-greeting
+new file mode 100755
+index 0000000..21fe694
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-move-greeting
+@@ -0,0 +1,6 @@
++#!/bin/sh
++
++if [ -f "/tmp/voicemail/greeting.gsm" ]
++then
++ mv /tmp/voicemail/greeting.gsm /etc/pbx-voicemail/recordings/
++fi
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-auth.TEMPLATE b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-auth.TEMPLATE
+new file mode 100644
+index 0000000..6b2026c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-auth.TEMPLATE
+@@ -0,0 +1,2 @@
++user |USER|
++password |PASSWORD|
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-default.TEMPLATE b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-default.TEMPLATE
+new file mode 100644
+index 0000000..a001c64
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-default.TEMPLATE
+@@ -0,0 +1,2 @@
++account default : defaultacct
++
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account.TEMPLATE b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account.TEMPLATE
+new file mode 100644
+index 0000000..fd1f479
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account.TEMPLATE
+@@ -0,0 +1,5 @@
++account defaultacct
++host |HOST|
++port |PORT|
++from voicemail@pbx
++
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-defaults.TEMPLATE b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-defaults.TEMPLATE
+new file mode 100644
+index 0000000..a4456b8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-defaults.TEMPLATE
+@@ -0,0 +1,5 @@
++defaults
++auth |AUTH|
++tls_certcheck off
++tls |TLS|
++
+diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-send-voicemail b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-send-voicemail
+new file mode 100755
+index 0000000..ba639d0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-send-voicemail
+@@ -0,0 +1,114 @@
++#!/bin/sh
++#
++# Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
++#
++# This file is part of luci-pbx-voicemail.
++#
++# luci-pbx-voicemail is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 3 of the License, or
++# (at your option) any later version.
++#
++# luci-pbx-voicemail is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with luci-pbx-voicemail. If not, see <http://www.gnu.org/licenses/>.
++#
++#
++# Thanks to http://www.zedwood.com for providing an excellent example of how to
++# properly assemble an email message with a base64 encoded attachment.
++#
++
++LOGFILE=/tmp/voicemail/last_sent_voicemail.log
++
++# Redirect standard error and standard output to a log file.
++rm -f "$LOGFILE"
++exec 1>"$LOGFILE"
++exec 2>&1
++
++# Appends its second argument to a file named in the first argument.
++append_to_file ()
++{
++ echo "$2">>$1;
++}
++
++# Grab the attachment name, which should be sent as the first argument, and
++# exit with a warning if there is no voicemail to send.
++ATTACHMENT="$1"
++[ ! -f "$ATTACHMENT" ] && echo "WARNING: Found no voicemail recording to send." && exit
++
++# Grab the callerID which should have been sent as an argument.
++CALLERID="$2"
++[ -z "$CALLERID" ] && CALLERID="An unknown caller"
++
++# Determine addresses we would like to send the voicemail to and exit if none are found.
++TO="`uci -q get pbx-voicemail.global_voicemail.global_email_addresses | tr ' ' ','`"
++[ -z "$TO" ] && echo "WARNING: Found no addresses to send voicemail to." && exit
++
++# See whether we should retain a copy of the voicemail.
++SAVEPATH="`uci -q get pbx-voicemail.global_voicemail.global_save_path`"
++
++DATE="`date +%Y-%m-%d`"
++TIME="`date +%H:%M:%S`"
++FROM="voicemail@pbx"
++REPLY="do-not-reply@pbx"
++SUBJECT="Voicemail from $CALLERID, $DATE, $TIME"
++MSGBODY="$CALLERID has left voicemail for you on $DATE at $TIME."
++MIMETYPE="audio/wav"
++TMP1="/tmp/voicemail/tmpemail1.$$";
++TMP2="/tmp/voicemail/tmpemail2.$$";
++BOUNDARY="`date +%s | md5sum | awk '{print $1}'`"
++FILENAME="voicemail-$DATE-$TIME.WAV"
++
++# Clean up just in case.
++rm -f $TMP1 $TMP2
++
++append_to_file $TMP1 "From: $FROM"
++append_to_file $TMP1 "To: $TO"
++append_to_file $TMP1 "Reply-To: $REPLY"
++append_to_file $TMP1 "Subject: $SUBJECT"
++append_to_file $TMP1 "Content-Type: multipart/mixed; boundary=\""$BOUNDARY"\""
++append_to_file $TMP1 ""
++append_to_file $TMP1 "This is a MIME formatted message. If you see this text it means that your"
++append_to_file $TMP1 "email software does not support MIME formatted messages."
++append_to_file $TMP1 ""
++append_to_file $TMP1 "--$BOUNDARY"
++append_to_file $TMP1 "Content-Type: text/plain; charset=ISO-8859-1; format=flowed"
++append_to_file $TMP1 "Content-Transfer-Encoding: 7bit"
++append_to_file $TMP1 "Content-Disposition: inline"
++append_to_file $TMP1 ""
++append_to_file $TMP1 "$MSGBODY"
++append_to_file $TMP1 ""
++append_to_file $TMP1 ""
++append_to_file $TMP1 "--$BOUNDARY"
++append_to_file $TMP1 "Content-Type: $MIMETYPE; name=\"$FILENAME\""
++append_to_file $TMP1 "Content-Transfer-Encoding: base64"
++append_to_file $TMP1 "Content-Disposition: attachment; filename=\"$FILENAME\";"
++append_to_file $TMP1 ""
++
++append_to_file $TMP2 ""
++append_to_file $TMP2 ""
++append_to_file $TMP2 "--$BOUNDARY--"
++append_to_file $TMP2 ""
++append_to_file $TMP2 ""
++
++# Cat everything together and pass to msmtprc to send out.
++( cat $TMP1
++ cat "$ATTACHMENT" | base64
++ cat $TMP2 ) | msmtp -t -C /etc/pbx-msmtprc
++
++# Clean up email temp files.
++rm -f $TMP1 $TMP2
++
++# Either delete or move the attachment based on the SAVEPATH variable.
++if [ -z "$SAVEPATH" ]
++then
++ rm -f "$ATTACHMENT"
++else
++ mkdir -p "$SAVEPATH"
++ mv --backup=t "$ATTACHMENT" "$SAVEPATH/$FILENAME"
++fi
++
+diff --git a/feeds/luci/applications/luci-app-pbx/COPYING b/feeds/luci/applications/luci-app-pbx/COPYING
+new file mode 100644
+index 0000000..94a9ed0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/COPYING
+@@ -0,0 +1,674 @@
++ GNU GENERAL PUBLIC LICENSE
++ Version 3, 29 June 2007
++
++ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
++ Everyone is permitted to copy and distribute verbatim copies
++ of this license document, but changing it is not allowed.
++
++ Preamble
++
++ The GNU General Public License is a free, copyleft license for
++software and other kinds of works.
++
++ The licenses for most software and other practical works are designed
++to take away your freedom to share and change the works. By contrast,
++the GNU General Public License is intended to guarantee your freedom to
++share and change all versions of a program--to make sure it remains free
++software for all its users. We, the Free Software Foundation, use the
++GNU General Public License for most of our software; it applies also to
++any other work released this way by its authors. You can apply it to
++your programs, too.
++
++ When we speak of free software, we are referring to freedom, not
++price. Our General Public Licenses are designed to make sure that you
++have the freedom to distribute copies of free software (and charge for
++them if you wish), that you receive source code or can get it if you
++want it, that you can change the software or use pieces of it in new
++free programs, and that you know you can do these things.
++
++ To protect your rights, we need to prevent others from denying you
++these rights or asking you to surrender the rights. Therefore, you have
++certain responsibilities if you distribute copies of the software, or if
++you modify it: responsibilities to respect the freedom of others.
++
++ For example, if you distribute copies of such a program, whether
++gratis or for a fee, you must pass on to the recipients the same
++freedoms that you received. You must make sure that they, too, receive
++or can get the source code. And you must show them these terms so they
++know their rights.
++
++ Developers that use the GNU GPL protect your rights with two steps:
++(1) assert copyright on the software, and (2) offer you this License
++giving you legal permission to copy, distribute and/or modify it.
++
++ For the developers' and authors' protection, the GPL clearly explains
++that there is no warranty for this free software. For both users' and
++authors' sake, the GPL requires that modified versions be marked as
++changed, so that their problems will not be attributed erroneously to
++authors of previous versions.
++
++ Some devices are designed to deny users access to install or run
++modified versions of the software inside them, although the manufacturer
++can do so. This is fundamentally incompatible with the aim of
++protecting users' freedom to change the software. The systematic
++pattern of such abuse occurs in the area of products for individuals to
++use, which is precisely where it is most unacceptable. Therefore, we
++have designed this version of the GPL to prohibit the practice for those
++products. If such problems arise substantially in other domains, we
++stand ready to extend this provision to those domains in future versions
++of the GPL, as needed to protect the freedom of users.
++
++ Finally, every program is threatened constantly by software patents.
++States should not allow patents to restrict development and use of
++software on general-purpose computers, but in those that do, we wish to
++avoid the special danger that patents applied to a free program could
++make it effectively proprietary. To prevent this, the GPL assures that
++patents cannot be used to render the program non-free.
++
++ The precise terms and conditions for copying, distribution and
++modification follow.
++
++ TERMS AND CONDITIONS
++
++ 0. Definitions.
++
++ "This License" refers to version 3 of the GNU General Public License.
++
++ "Copyright" also means copyright-like laws that apply to other kinds of
++works, such as semiconductor masks.
++
++ "The Program" refers to any copyrightable work licensed under this
++License. Each licensee is addressed as "you". "Licensees" and
++"recipients" may be individuals or organizations.
++
++ To "modify" a work means to copy from or adapt all or part of the work
++in a fashion requiring copyright permission, other than the making of an
++exact copy. The resulting work is called a "modified version" of the
++earlier work or a work "based on" the earlier work.
++
++ A "covered work" means either the unmodified Program or a work based
++on the Program.
++
++ To "propagate" a work means to do anything with it that, without
++permission, would make you directly or secondarily liable for
++infringement under applicable copyright law, except executing it on a
++computer or modifying a private copy. Propagation includes copying,
++distribution (with or without modification), making available to the
++public, and in some countries other activities as well.
++
++ To "convey" a work means any kind of propagation that enables other
++parties to make or receive copies. Mere interaction with a user through
++a computer network, with no transfer of a copy, is not conveying.
++
++ An interactive user interface displays "Appropriate Legal Notices"
++to the extent that it includes a convenient and prominently visible
++feature that (1) displays an appropriate copyright notice, and (2)
++tells the user that there is no warranty for the work (except to the
++extent that warranties are provided), that licensees may convey the
++work under this License, and how to view a copy of this License. If
++the interface presents a list of user commands or options, such as a
++menu, a prominent item in the list meets this criterion.
++
++ 1. Source Code.
++
++ The "source code" for a work means the preferred form of the work
++for making modifications to it. "Object code" means any non-source
++form of a work.
++
++ A "Standard Interface" means an interface that either is an official
++standard defined by a recognized standards body, or, in the case of
++interfaces specified for a particular programming language, one that
++is widely used among developers working in that language.
++
++ The "System Libraries" of an executable work include anything, other
++than the work as a whole, that (a) is included in the normal form of
++packaging a Major Component, but which is not part of that Major
++Component, and (b) serves only to enable use of the work with that
++Major Component, or to implement a Standard Interface for which an
++implementation is available to the public in source code form. A
++"Major Component", in this context, means a major essential component
++(kernel, window system, and so on) of the specific operating system
++(if any) on which the executable work runs, or a compiler used to
++produce the work, or an object code interpreter used to run it.
++
++ The "Corresponding Source" for a work in object code form means all
++the source code needed to generate, install, and (for an executable
++work) run the object code and to modify the work, including scripts to
++control those activities. However, it does not include the work's
++System Libraries, or general-purpose tools or generally available free
++programs which are used unmodified in performing those activities but
++which are not part of the work. For example, Corresponding Source
++includes interface definition files associated with source files for
++the work, and the source code for shared libraries and dynamically
++linked subprograms that the work is specifically designed to require,
++such as by intimate data communication or control flow between those
++subprograms and other parts of the work.
++
++ The Corresponding Source need not include anything that users
++can regenerate automatically from other parts of the Corresponding
++Source.
++
++ The Corresponding Source for a work in source code form is that
++same work.
++
++ 2. Basic Permissions.
++
++ All rights granted under this License are granted for the term of
++copyright on the Program, and are irrevocable provided the stated
++conditions are met. This License explicitly affirms your unlimited
++permission to run the unmodified Program. The output from running a
++covered work is covered by this License only if the output, given its
++content, constitutes a covered work. This License acknowledges your
++rights of fair use or other equivalent, as provided by copyright law.
++
++ You may make, run and propagate covered works that you do not
++convey, without conditions so long as your license otherwise remains
++in force. You may convey covered works to others for the sole purpose
++of having them make modifications exclusively for you, or provide you
++with facilities for running those works, provided that you comply with
++the terms of this License in conveying all material for which you do
++not control copyright. Those thus making or running the covered works
++for you must do so exclusively on your behalf, under your direction
++and control, on terms that prohibit them from making any copies of
++your copyrighted material outside their relationship with you.
++
++ Conveying under any other circumstances is permitted solely under
++the conditions stated below. Sublicensing is not allowed; section 10
++makes it unnecessary.
++
++ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
++
++ No covered work shall be deemed part of an effective technological
++measure under any applicable law fulfilling obligations under article
++11 of the WIPO copyright treaty adopted on 20 December 1996, or
++similar laws prohibiting or restricting circumvention of such
++measures.
++
++ When you convey a covered work, you waive any legal power to forbid
++circumvention of technological measures to the extent such circumvention
++is effected by exercising rights under this License with respect to
++the covered work, and you disclaim any intention to limit operation or
++modification of the work as a means of enforcing, against the work's
++users, your or third parties' legal rights to forbid circumvention of
++technological measures.
++
++ 4. Conveying Verbatim Copies.
++
++ You may convey verbatim copies of the Program's source code as you
++receive it, in any medium, provided that you conspicuously and
++appropriately publish on each copy an appropriate copyright notice;
++keep intact all notices stating that this License and any
++non-permissive terms added in accord with section 7 apply to the code;
++keep intact all notices of the absence of any warranty; and give all
++recipients a copy of this License along with the Program.
++
++ You may charge any price or no price for each copy that you convey,
++and you may offer support or warranty protection for a fee.
++
++ 5. Conveying Modified Source Versions.
++
++ You may convey a work based on the Program, or the modifications to
++produce it from the Program, in the form of source code under the
++terms of section 4, provided that you also meet all of these conditions:
++
++ a) The work must carry prominent notices stating that you modified
++ it, and giving a relevant date.
++
++ b) The work must carry prominent notices stating that it is
++ released under this License and any conditions added under section
++ 7. This requirement modifies the requirement in section 4 to
++ "keep intact all notices".
++
++ c) You must license the entire work, as a whole, under this
++ License to anyone who comes into possession of a copy. This
++ License will therefore apply, along with any applicable section 7
++ additional terms, to the whole of the work, and all its parts,
++ regardless of how they are packaged. This License gives no
++ permission to license the work in any other way, but it does not
++ invalidate such permission if you have separately received it.
++
++ d) If the work has interactive user interfaces, each must display
++ Appropriate Legal Notices; however, if the Program has interactive
++ interfaces that do not display Appropriate Legal Notices, your
++ work need not make them do so.
++
++ A compilation of a covered work with other separate and independent
++works, which are not by their nature extensions of the covered work,
++and which are not combined with it such as to form a larger program,
++in or on a volume of a storage or distribution medium, is called an
++"aggregate" if the compilation and its resulting copyright are not
++used to limit the access or legal rights of the compilation's users
++beyond what the individual works permit. Inclusion of a covered work
++in an aggregate does not cause this License to apply to the other
++parts of the aggregate.
++
++ 6. Conveying Non-Source Forms.
++
++ You may convey a covered work in object code form under the terms
++of sections 4 and 5, provided that you also convey the
++machine-readable Corresponding Source under the terms of this License,
++in one of these ways:
++
++ a) Convey the object code in, or embodied in, a physical product
++ (including a physical distribution medium), accompanied by the
++ Corresponding Source fixed on a durable physical medium
++ customarily used for software interchange.
++
++ b) Convey the object code in, or embodied in, a physical product
++ (including a physical distribution medium), accompanied by a
++ written offer, valid for at least three years and valid for as
++ long as you offer spare parts or customer support for that product
++ model, to give anyone who possesses the object code either (1) a
++ copy of the Corresponding Source for all the software in the
++ product that is covered by this License, on a durable physical
++ medium customarily used for software interchange, for a price no
++ more than your reasonable cost of physically performing this
++ conveying of source, or (2) access to copy the
++ Corresponding Source from a network server at no charge.
++
++ c) Convey individual copies of the object code with a copy of the
++ written offer to provide the Corresponding Source. This
++ alternative is allowed only occasionally and noncommercially, and
++ only if you received the object code with such an offer, in accord
++ with subsection 6b.
++
++ d) Convey the object code by offering access from a designated
++ place (gratis or for a charge), and offer equivalent access to the
++ Corresponding Source in the same way through the same place at no
++ further charge. You need not require recipients to copy the
++ Corresponding Source along with the object code. If the place to
++ copy the object code is a network server, the Corresponding Source
++ may be on a different server (operated by you or a third party)
++ that supports equivalent copying facilities, provided you maintain
++ clear directions next to the object code saying where to find the
++ Corresponding Source. Regardless of what server hosts the
++ Corresponding Source, you remain obligated to ensure that it is
++ available for as long as needed to satisfy these requirements.
++
++ e) Convey the object code using peer-to-peer transmission, provided
++ you inform other peers where the object code and Corresponding
++ Source of the work are being offered to the general public at no
++ charge under subsection 6d.
++
++ A separable portion of the object code, whose source code is excluded
++from the Corresponding Source as a System Library, need not be
++included in conveying the object code work.
++
++ A "User Product" is either (1) a "consumer product", which means any
++tangible personal property which is normally used for personal, family,
++or household purposes, or (2) anything designed or sold for incorporation
++into a dwelling. In determining whether a product is a consumer product,
++doubtful cases shall be resolved in favor of coverage. For a particular
++product received by a particular user, "normally used" refers to a
++typical or common use of that class of product, regardless of the status
++of the particular user or of the way in which the particular user
++actually uses, or expects or is expected to use, the product. A product
++is a consumer product regardless of whether the product has substantial
++commercial, industrial or non-consumer uses, unless such uses represent
++the only significant mode of use of the product.
++
++ "Installation Information" for a User Product means any methods,
++procedures, authorization keys, or other information required to install
++and execute modified versions of a covered work in that User Product from
++a modified version of its Corresponding Source. The information must
++suffice to ensure that the continued functioning of the modified object
++code is in no case prevented or interfered with solely because
++modification has been made.
++
++ If you convey an object code work under this section in, or with, or
++specifically for use in, a User Product, and the conveying occurs as
++part of a transaction in which the right of possession and use of the
++User Product is transferred to the recipient in perpetuity or for a
++fixed term (regardless of how the transaction is characterized), the
++Corresponding Source conveyed under this section must be accompanied
++by the Installation Information. But this requirement does not apply
++if neither you nor any third party retains the ability to install
++modified object code on the User Product (for example, the work has
++been installed in ROM).
++
++ The requirement to provide Installation Information does not include a
++requirement to continue to provide support service, warranty, or updates
++for a work that has been modified or installed by the recipient, or for
++the User Product in which it has been modified or installed. Access to a
++network may be denied when the modification itself materially and
++adversely affects the operation of the network or violates the rules and
++protocols for communication across the network.
++
++ Corresponding Source conveyed, and Installation Information provided,
++in accord with this section must be in a format that is publicly
++documented (and with an implementation available to the public in
++source code form), and must require no special password or key for
++unpacking, reading or copying.
++
++ 7. Additional Terms.
++
++ "Additional permissions" are terms that supplement the terms of this
++License by making exceptions from one or more of its conditions.
++Additional permissions that are applicable to the entire Program shall
++be treated as though they were included in this License, to the extent
++that they are valid under applicable law. If additional permissions
++apply only to part of the Program, that part may be used separately
++under those permissions, but the entire Program remains governed by
++this License without regard to the additional permissions.
++
++ When you convey a copy of a covered work, you may at your option
++remove any additional permissions from that copy, or from any part of
++it. (Additional permissions may be written to require their own
++removal in certain cases when you modify the work.) You may place
++additional permissions on material, added by you to a covered work,
++for which you have or can give appropriate copyright permission.
++
++ Notwithstanding any other provision of this License, for material you
++add to a covered work, you may (if authorized by the copyright holders of
++that material) supplement the terms of this License with terms:
++
++ a) Disclaiming warranty or limiting liability differently from the
++ terms of sections 15 and 16 of this License; or
++
++ b) Requiring preservation of specified reasonable legal notices or
++ author attributions in that material or in the Appropriate Legal
++ Notices displayed by works containing it; or
++
++ c) Prohibiting misrepresentation of the origin of that material, or
++ requiring that modified versions of such material be marked in
++ reasonable ways as different from the original version; or
++
++ d) Limiting the use for publicity purposes of names of licensors or
++ authors of the material; or
++
++ e) Declining to grant rights under trademark law for use of some
++ trade names, trademarks, or service marks; or
++
++ f) Requiring indemnification of licensors and authors of that
++ material by anyone who conveys the material (or modified versions of
++ it) with contractual assumptions of liability to the recipient, for
++ any liability that these contractual assumptions directly impose on
++ those licensors and authors.
++
++ All other non-permissive additional terms are considered "further
++restrictions" within the meaning of section 10. If the Program as you
++received it, or any part of it, contains a notice stating that it is
++governed by this License along with a term that is a further
++restriction, you may remove that term. If a license document contains
++a further restriction but permits relicensing or conveying under this
++License, you may add to a covered work material governed by the terms
++of that license document, provided that the further restriction does
++not survive such relicensing or conveying.
++
++ If you add terms to a covered work in accord with this section, you
++must place, in the relevant source files, a statement of the
++additional terms that apply to those files, or a notice indicating
++where to find the applicable terms.
++
++ Additional terms, permissive or non-permissive, may be stated in the
++form of a separately written license, or stated as exceptions;
++the above requirements apply either way.
++
++ 8. Termination.
++
++ You may not propagate or modify a covered work except as expressly
++provided under this License. Any attempt otherwise to propagate or
++modify it is void, and will automatically terminate your rights under
++this License (including any patent licenses granted under the third
++paragraph of section 11).
++
++ However, if you cease all violation of this License, then your
++license from a particular copyright holder is reinstated (a)
++provisionally, unless and until the copyright holder explicitly and
++finally terminates your license, and (b) permanently, if the copyright
++holder fails to notify you of the violation by some reasonable means
++prior to 60 days after the cessation.
++
++ Moreover, your license from a particular copyright holder is
++reinstated permanently if the copyright holder notifies you of the
++violation by some reasonable means, this is the first time you have
++received notice of violation of this License (for any work) from that
++copyright holder, and you cure the violation prior to 30 days after
++your receipt of the notice.
++
++ Termination of your rights under this section does not terminate the
++licenses of parties who have received copies or rights from you under
++this License. If your rights have been terminated and not permanently
++reinstated, you do not qualify to receive new licenses for the same
++material under section 10.
++
++ 9. Acceptance Not Required for Having Copies.
++
++ You are not required to accept this License in order to receive or
++run a copy of the Program. Ancillary propagation of a covered work
++occurring solely as a consequence of using peer-to-peer transmission
++to receive a copy likewise does not require acceptance. However,
++nothing other than this License grants you permission to propagate or
++modify any covered work. These actions infringe copyright if you do
++not accept this License. Therefore, by modifying or propagating a
++covered work, you indicate your acceptance of this License to do so.
++
++ 10. Automatic Licensing of Downstream Recipients.
++
++ Each time you convey a covered work, the recipient automatically
++receives a license from the original licensors, to run, modify and
++propagate that work, subject to this License. You are not responsible
++for enforcing compliance by third parties with this License.
++
++ An "entity transaction" is a transaction transferring control of an
++organization, or substantially all assets of one, or subdividing an
++organization, or merging organizations. If propagation of a covered
++work results from an entity transaction, each party to that
++transaction who receives a copy of the work also receives whatever
++licenses to the work the party's predecessor in interest had or could
++give under the previous paragraph, plus a right to possession of the
++Corresponding Source of the work from the predecessor in interest, if
++the predecessor has it or can get it with reasonable efforts.
++
++ You may not impose any further restrictions on the exercise of the
++rights granted or affirmed under this License. For example, you may
++not impose a license fee, royalty, or other charge for exercise of
++rights granted under this License, and you may not initiate litigation
++(including a cross-claim or counterclaim in a lawsuit) alleging that
++any patent claim is infringed by making, using, selling, offering for
++sale, or importing the Program or any portion of it.
++
++ 11. Patents.
++
++ A "contributor" is a copyright holder who authorizes use under this
++License of the Program or a work on which the Program is based. The
++work thus licensed is called the contributor's "contributor version".
++
++ A contributor's "essential patent claims" are all patent claims
++owned or controlled by the contributor, whether already acquired or
++hereafter acquired, that would be infringed by some manner, permitted
++by this License, of making, using, or selling its contributor version,
++but do not include claims that would be infringed only as a
++consequence of further modification of the contributor version. For
++purposes of this definition, "control" includes the right to grant
++patent sublicenses in a manner consistent with the requirements of
++this License.
++
++ Each contributor grants you a non-exclusive, worldwide, royalty-free
++patent license under the contributor's essential patent claims, to
++make, use, sell, offer for sale, import and otherwise run, modify and
++propagate the contents of its contributor version.
++
++ In the following three paragraphs, a "patent license" is any express
++agreement or commitment, however denominated, not to enforce a patent
++(such as an express permission to practice a patent or covenant not to
++sue for patent infringement). To "grant" such a patent license to a
++party means to make such an agreement or commitment not to enforce a
++patent against the party.
++
++ If you convey a covered work, knowingly relying on a patent license,
++and the Corresponding Source of the work is not available for anyone
++to copy, free of charge and under the terms of this License, through a
++publicly available network server or other readily accessible means,
++then you must either (1) cause the Corresponding Source to be so
++available, or (2) arrange to deprive yourself of the benefit of the
++patent license for this particular work, or (3) arrange, in a manner
++consistent with the requirements of this License, to extend the patent
++license to downstream recipients. "Knowingly relying" means you have
++actual knowledge that, but for the patent license, your conveying the
++covered work in a country, or your recipient's use of the covered work
++in a country, would infringe one or more identifiable patents in that
++country that you have reason to believe are valid.
++
++ If, pursuant to or in connection with a single transaction or
++arrangement, you convey, or propagate by procuring conveyance of, a
++covered work, and grant a patent license to some of the parties
++receiving the covered work authorizing them to use, propagate, modify
++or convey a specific copy of the covered work, then the patent license
++you grant is automatically extended to all recipients of the covered
++work and works based on it.
++
++ A patent license is "discriminatory" if it does not include within
++the scope of its coverage, prohibits the exercise of, or is
++conditioned on the non-exercise of one or more of the rights that are
++specifically granted under this License. You may not convey a covered
++work if you are a party to an arrangement with a third party that is
++in the business of distributing software, under which you make payment
++to the third party based on the extent of your activity of conveying
++the work, and under which the third party grants, to any of the
++parties who would receive the covered work from you, a discriminatory
++patent license (a) in connection with copies of the covered work
++conveyed by you (or copies made from those copies), or (b) primarily
++for and in connection with specific products or compilations that
++contain the covered work, unless you entered into that arrangement,
++or that patent license was granted, prior to 28 March 2007.
++
++ Nothing in this License shall be construed as excluding or limiting
++any implied license or other defenses to infringement that may
++otherwise be available to you under applicable patent law.
++
++ 12. No Surrender of Others' Freedom.
++
++ If conditions are imposed on you (whether by court order, agreement or
++otherwise) that contradict the conditions of this License, they do not
++excuse you from the conditions of this License. If you cannot convey a
++covered work so as to satisfy simultaneously your obligations under this
++License and any other pertinent obligations, then as a consequence you may
++not convey it at all. For example, if you agree to terms that obligate you
++to collect a royalty for further conveying from those to whom you convey
++the Program, the only way you could satisfy both those terms and this
++License would be to refrain entirely from conveying the Program.
++
++ 13. Use with the GNU Affero General Public License.
++
++ Notwithstanding any other provision of this License, you have
++permission to link or combine any covered work with a work licensed
++under version 3 of the GNU Affero General Public License into a single
++combined work, and to convey the resulting work. The terms of this
++License will continue to apply to the part which is the covered work,
++but the special requirements of the GNU Affero General Public License,
++section 13, concerning interaction through a network will apply to the
++combination as such.
++
++ 14. Revised Versions of this License.
++
++ The Free Software Foundation may publish revised and/or new versions of
++the GNU General Public License from time to time. Such new versions will
++be similar in spirit to the present version, but may differ in detail to
++address new problems or concerns.
++
++ Each version is given a distinguishing version number. If the
++Program specifies that a certain numbered version of the GNU General
++Public License "or any later version" applies to it, you have the
++option of following the terms and conditions either of that numbered
++version or of any later version published by the Free Software
++Foundation. If the Program does not specify a version number of the
++GNU General Public License, you may choose any version ever published
++by the Free Software Foundation.
++
++ If the Program specifies that a proxy can decide which future
++versions of the GNU General Public License can be used, that proxy's
++public statement of acceptance of a version permanently authorizes you
++to choose that version for the Program.
++
++ Later license versions may give you additional or different
++permissions. However, no additional obligations are imposed on any
++author or copyright holder as a result of your choosing to follow a
++later version.
++
++ 15. Disclaimer of Warranty.
++
++ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
++APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
++HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
++OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
++THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
++IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
++ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
++
++ 16. Limitation of Liability.
++
++ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
++THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
++GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
++USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
++DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
++PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
++EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
++SUCH DAMAGES.
++
++ 17. Interpretation of Sections 15 and 16.
++
++ If the disclaimer of warranty and limitation of liability provided
++above cannot be given local legal effect according to their terms,
++reviewing courts shall apply local law that most closely approximates
++an absolute waiver of all civil liability in connection with the
++Program, unless a warranty or assumption of liability accompanies a
++copy of the Program in return for a fee.
++
++ END OF TERMS AND CONDITIONS
++
++ How to Apply These Terms to Your New Programs
++
++ If you develop a new program, and you want it to be of the greatest
++possible use to the public, the best way to achieve this is to make it
++free software which everyone can redistribute and change under these terms.
++
++ To do so, attach the following notices to the program. It is safest
++to attach them to the start of each source file to most effectively
++state the exclusion of warranty; and each file should have at least
++the "copyright" line and a pointer to where the full notice is found.
++
++ <one line to give the program's name and a brief idea of what it does.>
++ Copyright (C) <year> <name of author>
++
++ This program is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++Also add information on how to contact you by electronic and paper mail.
++
++ If the program does terminal interaction, make it output a short
++notice like this when it starts in an interactive mode:
++
++ <program> Copyright (C) <year> <name of author>
++ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
++ This is free software, and you are welcome to redistribute it
++ under certain conditions; type `show c' for details.
++
++The hypothetical commands `show w' and `show c' should show the appropriate
++parts of the General Public License. Of course, your program's commands
++might be different; for a GUI interface, you would use an "about box".
++
++ You should also get your employer (if you work as a programmer) or school,
++if any, to sign a "copyright disclaimer" for the program, if necessary.
++For more information on this, and how to apply and follow the GNU GPL, see
++<http://www.gnu.org/licenses/>.
++
++ The GNU General Public License does not permit incorporating your program
++into proprietary programs. If your program is a subroutine library, you
++may consider it more useful to permit linking proprietary applications with
++the library. If this is what you want to do, use the GNU Lesser General
++Public License instead of this License. But first, please read
++<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+diff --git a/feeds/luci/applications/luci-app-pbx/CREDITS-SOUNDS b/feeds/luci/applications/luci-app-pbx/CREDITS-SOUNDS
+new file mode 100644
+index 0000000..1fa64bc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/CREDITS-SOUNDS
+@@ -0,0 +1,7 @@
++This file pertains to the sounds files included in root/etc/pbx-asterisk/sounds
++
++Recorded by:
++Allison Smith (http://www.theivrvoice.com)
++
++Financial Contributions by:
++Digium, Inc. (http://www.digium.com)
+diff --git a/feeds/luci/applications/luci-app-pbx/LICENSE-SOUNDS b/feeds/luci/applications/luci-app-pbx/LICENSE-SOUNDS
+new file mode 100644
+index 0000000..fe9c822
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/LICENSE-SOUNDS
+@@ -0,0 +1,312 @@
++This file pertains to the sounds files included in root/etc/pbx-asterisk/sounds
++
++LICENSE FOR VOICE PROMPT FILES
++------------------------------
++
++The voice prompt files distributed herewith are Copyright (C) 2003-2008
++Allison Smith, and provided under terms of the following License. For
++more information, or to purchase custom voice prompt files, please
++visit:
++
++http://www.digium.com/ivr or http://www.theasteriskvoice.com
++
++LICENSE
++-------
++
++THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS
++CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS
++PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE
++WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS
++PROHIBITED.
++
++BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND
++AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS
++LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU
++THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH
++TERMS AND CONDITIONS.
++
++1. Definitions.
++
++a. "Collective Work" means a work, such as a periodical issue,
++anthology or encyclopedia, in which the Work in its entirety in
++unmodified form, along with one or more other contributions,
++constituting separate and independent works in themselves, are
++assembled into a collective whole. A work that constitutes a
++Collective Work will not be considered a Derivative Work (as defined
++below) for the purposes of this License.
++
++b. "Creative Commons Compatible License" means a license that is
++listed at http://creativecommons.org/compatiblelicenses that has been
++approved by Creative Commons as being essentially equivalent to this
++License, including, at a minimum, because that license: (i) contains
++terms that have the same purpose, meaning and effect as the License
++Elements of this License; and, (ii) explicitly permits the relicensing
++of derivatives of works made available under that license under this
++License or either a Creative Commons unported license or a Creative
++Commons jurisdiction license with the same License Elements as this
++License.
++
++c. "Derivative Work" means a work based upon the Work or upon the Work
++and other pre-existing works, such as a translation, musical
++arrangement, dramatization, fictionalization, motion picture version,
++sound recording, art reproduction, abridgment, condensation, or any
++other form in which the Work may be recast, transformed, or adapted,
++except that a work that constitutes a Collective Work will not be
++considered a Derivative Work for the purpose of this License. For the
++avoidance of doubt, where the Work is a musical composition or sound
++recording, the synchronization of the Work in timed-relation with a
++moving image ("synching") will be considered a Derivative Work for the
++purpose of this License.
++
++d. "License Elements" means the following high-level license
++attributes as selected by Licensor and indicated in the title of this
++License: Attribution, ShareAlike.
++
++e. "Licensor" means the individual, individuals, entity or entities
++that offers the Work under the terms of this License.
++
++f. "Original Author" means the individual, individuals, entity or
++entities who created the Work.
++
++g. "Work" means the copyrighted voice prompt files recorded by Allison
++Smith for Asterisk and distributed with this License.
++
++h. "You" means an individual or entity exercising rights under this
++License who has not previously violated the terms of this License with
++respect to the Work, or who has received express permission from the
++Licensor to exercise rights under this License despite a previous
++violation.
++
++2. Fair Use Rights.
++
++Nothing in this license is intended to reduce, limit, or restrict any
++rights arising from fair use, first sale or other limitations on the
++exclusive rights of the copyright owner under copyright law or other
++applicable laws.
++
++3. License Grant.
++
++Subject to the terms and conditions of this License, Licensor hereby
++grants You a worldwide, royalty-free, non-exclusive, perpetual (for
++the duration of the applicable copyright) license to exercise the
++rights in the Work as stated below:
++
++a. to reproduce the Work, to incorporate the Work into one or more
++Collective Works, and to reproduce the Work as incorporated in the
++Collective Works;
++
++b. to create and reproduce Derivative Works provided that any such
++Derivative Work, including any translation in any medium, takes
++reasonable steps to clearly label, demarcate or otherwise identify
++that changes were made to the original Work. For example, a
++translation could be marked "The original work was translated from
++English to Spanish," or a modification could indicate "The original
++work has been modified.";
++
++c. to distribute copies or phonorecords of, display publicly, perform
++publicly, and perform publicly by means of a digital audio
++transmission the Work including as incorporated in Collective Works;
++
++d. to distribute copies or phonorecords of, display publicly, perform
++publicly, and perform publicly by means of a digital audio
++transmission Derivative Works.
++
++e. For the avoidance of doubt, where the Work is a musical
++composition:
++
++ i. Performance Royalties Under Blanket Licenses. Licensor waives the
++ exclusive right to collect, whether individually or, in the event
++ that Licensor is a member of a performance rights society
++ (e.g. ASCAP, BMI, SESAC), via that society, royalties for the public
++ performance or public digital performance e.g. webcast) of the Work.
++
++ ii.Mechanical Rights and Statutory Royalties. Licensor waives the
++ exclusive right to collect, whether individually or via a music
++ rights agency or designated agent (e.g. Harry Fox Agency), royalties
++ for any phonorecord You create from the Work ("cover version") and
++ distribute, subject to the compulsory license created by 17 USC
++ Section 115 of the US Copyright Act (or the equivalent in other
++ jurisdictions).
++
++f. Webcasting Rights and Statutory Royalties. For the avoidance of
++doubt, where the Work is a sound recording, Licensor waives the
++exclusive right to collect, whether individually or via a
++performance-rights society (e.g. SoundExchange), royalties for the
++public digital performance (e.g. webcast) of the Work, subject to the
++compulsory license created by 17 USC Section 114 of the US Copyright
++Act (or the equivalent in other jurisdictions).
++
++The above rights may be exercised in all media and formats whether now
++known or hereafter devised. The above rights include the right to make
++such modifications as are technically necessary to exercise the rights
++in other media and formats. All rights not expressly granted by
++Licensor are hereby reserved.
++
++4. Restrictions.
++
++The license granted in Section 3 above is expressly made subject to
++and limited by the following restrictions:
++
++a. You may distribute, publicly display, publicly perform, or publicly
++digitally perform the Work only under the terms of this License, and
++You must include a copy of, or the Uniform Resource Identifier for,
++this License with every copy or phonorecord of the Work You
++distribute, publicly display, publicly perform, or publicly digitally
++perform. You may not offer or impose any terms on the Work that
++restrict the terms of this License or the ability of a recipient of
++the Work to exercise of the rights granted to that recipient under the
++terms of the License. You may not sublicense the Work. You must keep
++intact all notices that refer to this License and to the disclaimer of
++warranties. When You distribute, publicly display, publicly perform,
++or publicly digitally perform the Work, You may not impose any
++technological measures on the Work that restrict the ability of a
++recipient of the Work from You to exercise of the rights granted to
++that recipient under the terms of the License. This Section 4(a)
++applies to the Work as incorporated in a Collective Work, but this
++does not require the Collective Work apart from the Work itself to be
++made subject to the terms of this License. If You create a Collective
++Work, upon notice from any Licensor You must, to the extent
++practicable, remove from the Collective Work any credit as required by
++Section 4(c), as requested. If You create a Derivative Work, upon
++notice from any Licensor You must, to the extent practicable, remove
++from the Derivative Work any credit as required by Section 4(c), as
++requested.
++
++b. You may distribute, publicly display, publicly perform, or publicly
++digitally perform a Derivative Work only under: (i) the terms of this
++License; (ii) a later version of this License with the same License
++Elements as this License; (iii) either the Creative Commons (Unported)
++license or a Creative Commons jurisdiction license (either this or a
++later license version) that contains the same License Elements as this
++License (e.g. Attribution-ShareAlike 3.0 (Unported)); (iv) a Creative
++Commons Compatible License. If you license the Derivative Work under
++one of the licenses mentioned in (iv), you must comply with the terms
++of that license. If you license the Derivative Work under the terms of
++any of the licenses mentioned in (i), (ii) or (iii) (the "Applicable
++License"), you must comply with the terms of the Applicable License
++generally and with the following provisions: (I) You must include a
++copy of, or the Uniform Resource Identifier for, the Applicable
++License with every copy or phonorecord of each Derivative Work You
++distribute, publicly display, publicly perform, or publicly digitally
++perform; (II) You may not offer or impose any terms on the Derivative
++Works that restrict the terms of the Applicable License or the ability
++of a recipient of the Work to exercise the rights granted to that
++recipient under the terms of the Applicable License; (III) You must
++keep intact all notices that refer to the Applicable License and to
++the disclaimer of warranties; and, (IV) when You distribute, publicly
++display, publicly perform, or publicly digitally perform the Work, You
++may not impose any technological measures on the Derivative Work that
++restrict the ability of a recipient of the Derivative Work from You to
++exercise the rights granted to that recipient under the terms of the
++Applicable License. This Section 4(b) applies to the Derivative Work
++as incorporated in a Collective Work, but this does not require the
++Collective Work apart from the Derivative Work itself to be made
++subject to the terms of the Applicable License.
++
++c. If You distribute, publicly display, publicly perform, or publicly
++digitally perform the Work (as defined in Section 1 above) or any
++Derivative Works (as defined in Section 1 above) or Collective Works
++(as defined in Section 1 above), You must, unless a request has been
++made pursuant to Section 4(a), keep intact all copyright notices for
++the Work and provide, reasonable to the medium or means You are
++utilizing: (i) the name of the Original Author (or pseudonym, if
++applicable) if supplied, and/or (ii) if the Original Author and/or
++Licensor designate another party or parties (e.g. a sponsor institute,
++publishing entity, journal) for attribution ("Attribution Parties") in
++Licensor's copyright notice, terms of service or by other reasonable
++means, the name of such party or parties; the title of the Work if
++supplied; to the extent reasonably practicable, the Uniform Resource
++Identifier, if any, that Licensor specifies to be associated with the
++Work, unless such URI does not refer to the copyright notice or
++licensing information for the Work; and, consistent with Section 3(b)
++in the case of a Derivative Work, a credit identifying the use of the
++Work in the Derivative Work (e.g., "French translation of the Work by
++Original Author," or "Screenplay based on original Work by Original
++Author"). The credit required by this Section 4(c) may be implemented
++in any reasonable manner; provided, however, that in the case of a
++Derivative Work or Collective Work, at a minimum such credit will
++appear, if a credit for all contributing authors of the Derivative
++Work or Collective Work appears, then as part of these credits and in
++a manner at least as prominent as the credits for the other
++contributing authors. For the avoidance of doubt, You may only use the
++credit required by this Section for the purpose of attribution in the
++manner set out above and, by exercising Your rights under this
++License, You may not implicitly or explicitly assert or imply any
++connection with, sponsorship or endorsement by the Original Author,
++Licensor and/or Attribution Parties, as appropriate, of You or Your
++use of the Work, without the separate, express prior written
++permission of the Original Author, Licensor and/or Attribution
++Parties.
++
++5. Representations, Warranties and Disclaimer.
++
++UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING,
++LICENSOR OFFERS THE WORK AS-IS AND ONLY TO THE EXTENT OF ANY RIGHTS
++HELD IN THE LICENSED WORK BY THE LICENSOR. THE LICENSOR MAKES NO
++REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK,
++EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT
++LIMITATION, WARRANTIES OF TITLE, MARKETABILITY, MERCHANTIBILITY,
++FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
++LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF
++ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW
++THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY
++TO YOU.
++
++6. Limitation on Liability.
++
++EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL
++LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL,
++INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT
++OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN
++ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
++
++7. Termination.
++
++a. This License and the rights granted hereunder will terminate
++automatically upon any breach by You of the terms of this
++License. Individuals or entities who have received Derivative Works or
++Collective Works from You under this License, however, will not have
++their licenses terminated provided such individuals or entities remain
++in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8
++will survive any termination of this License.
++
++b. Subject to the above terms and conditions, the license granted here
++is perpetual (for the duration of the applicable copyright in the
++Work). Notwithstanding the above, Licensor reserves the right to
++release the Work under different license terms or to stop distributing
++the Work at any time; provided, however that any such election will
++not serve to withdraw this License (or any other license that has
++been, or is required to be, granted under the terms of this License),
++and this License will continue in full force and effect unless
++terminated as stated above.
++
++8. Miscellaneous.
++
++a. Each time You distribute or publicly digitally perform the Work (as
++defined in Section 1 above) or a Collective Work (as defined in
++Section 1 above), the Licensor offers to the recipient a license to
++the Work on the same terms and conditions as the license granted to
++You under this License.
++
++b. Each time You distribute or publicly digitally perform a Derivative
++Work, Licensor offers to the recipient a license to the original Work
++on the same terms and conditions as the license granted to You under
++this License.
++
++c. If any provision of this License is invalid or unenforceable under
++applicable law, it shall not affect the validity or enforceability of
++the remainder of the terms of this License, and without further action
++by the parties to this agreement, such provision shall be reformed to
++the minimum extent necessary to make such provision valid and
++enforceable.
++
++d. No term or provision of this License shall be deemed waived and no
++breach consented to unless such waiver or consent shall be in writing
++and signed by the party to be charged with such waiver or consent.
++
++e. This License constitutes the entire agreement between the parties
++with respect to the Work licensed here. There are no understandings,
++agreements or representations with respect to the Work not specified
++here. Licensor shall not be bound by any additional provisions that
++may appear in any communication from You. This License may not be
++modified without the mutual written agreement of the Licensor and You.
+diff --git a/feeds/luci/applications/luci-app-pbx/Makefile b/feeds/luci/applications/luci-app-pbx/Makefile
+new file mode 100644
+index 0000000..1379dcf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/Makefile
+@@ -0,0 +1,19 @@
++#
++# 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_TITLE:=LuCI PBX Administration
++LUCI_DEPENDS:= \
++ +asterisk18 +asterisk18-app-authenticate +asterisk18-app-disa \
++ +asterisk18-app-setcallerid +asterisk18-app-system +asterisk18-chan-gtalk \
++ +asterisk18-codec-a-mu +asterisk18-codec-alaw +asterisk18-func-cut \
++ +asterisk18-res-clioriginate +asterisk18-func-channel +asterisk18-chan-local \
++ +asterisk18-app-record +asterisk18-app-senddtmf +asterisk18-res-crypto
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/controller/pbx.lua b/feeds/luci/applications/luci-app-pbx/luasrc/controller/pbx.lua
+new file mode 100644
+index 0000000..b77814b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/luasrc/controller/pbx.lua
+@@ -0,0 +1,29 @@
++--[[
++ Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
++
++ This file is part of luci-pbx.
++
++ luci-pbx is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ luci-pbx is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with luci-pbx. If not, see <http://www.gnu.org/licenses/>.
++]]--
++
++module("luci.controller.pbx", package.seeall)
++
++function index()
++ entry({"admin", "services", "pbx"}, cbi("pbx"), "PBX", 80)
++ entry({"admin", "services", "pbx", "pbx-google"}, cbi("pbx-google"), "Google Accounts", 1)
++ entry({"admin", "services", "pbx", "pbx-voip"}, cbi("pbx-voip"), "SIP Accounts", 2)
++ entry({"admin", "services", "pbx", "pbx-users"}, cbi("pbx-users"), "User Accounts", 3)
++ entry({"admin", "services", "pbx", "pbx-calls"}, cbi("pbx-calls"), "Call Routing", 4)
++ entry({"admin", "services", "pbx", "pbx-advanced"}, cbi("pbx-advanced"), "Advanced Settings", 6)
++end
+diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-advanced.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-advanced.lua
+new file mode 100644
+index 0000000..5d4f135
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-advanced.lua
+@@ -0,0 +1,293 @@
++--[[
++ Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
++
++ This file is part of luci-pbx.
++
++ luci-pbx is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ luci-pbx is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with luci-pbx. If not, see <http://www.gnu.org/licenses/>.
++]]--
++
++if nixio.fs.access("/etc/init.d/asterisk") then
++ server = "asterisk"
++elseif nixio.fs.access("/etc/init.d/freeswitch") then
++ server = "freeswitch"
++else
++ server = ""
++end
++
++appname = "PBX"
++modulename = "pbx-advanced"
++defaultbindport = 5060
++defaultrtpstart = 19850
++defaultrtpend = 19900
++
++-- Returns all the network related settings, including a constructed RTP range
++function get_network_info()
++ externhost = m.uci:get(modulename, "advanced", "externhost")
++ ipaddr = m.uci:get("network", "lan", "ipaddr")
++ bindport = m.uci:get(modulename, "advanced", "bindport")
++ rtpstart = m.uci:get(modulename, "advanced", "rtpstart")
++ rtpend = m.uci:get(modulename, "advanced", "rtpend")
++
++ if bindport == nil then bindport = defaultbindport end
++ if rtpstart == nil then rtpstart = defaultrtpstart end
++ if rtpend == nil then rtpend = defaultrtpend end
++
++ if rtpstart == nil or rtpend == nil then
++ rtprange = nil
++ else
++ rtprange = rtpstart .. "-" .. rtpend
++ end
++
++ return bindport, rtprange, ipaddr, externhost
++end
++
++-- If not present, insert empty rules in the given config & section named PBX-SIP and PBX-RTP
++function insert_empty_sip_rtp_rules(config, section)
++
++ -- Add rules named PBX-SIP and PBX-RTP if not existing
++ found_sip_rule = false
++ found_rtp_rule = false
++ m.uci:foreach(config, section,
++ function(s1)
++ if s1._name == 'PBX-SIP' then
++ found_sip_rule = true
++ elseif s1._name == 'PBX-RTP' then
++ found_rtp_rule = true
++ end
++ end)
++
++ if found_sip_rule ~= true then
++ newrule=m.uci:add(config, section)
++ m.uci:set(config, newrule, '_name', 'PBX-SIP')
++ end
++ if found_rtp_rule ~= true then
++ newrule=m.uci:add(config, section)
++ m.uci:set(config, newrule, '_name', 'PBX-RTP')
++ end
++end
++
++-- Delete rules in the given config & section named PBX-SIP and PBX-RTP
++function delete_sip_rtp_rules(config, section)
++
++ -- Remove rules named PBX-SIP and PBX-RTP
++ commit = false
++ m.uci:foreach(config, section,
++ function(s1)
++ if s1._name == 'PBX-SIP' or s1._name == 'PBX-RTP' then
++ m.uci:delete(config, s1['.name'])
++ commit = true
++ end
++ end)
++
++ -- If something changed, then we commit the config.
++ if commit == true then m.uci:commit(config) end
++end
++
++-- Deletes QoS rules associated with this PBX.
++function delete_qos_rules()
++ delete_sip_rtp_rules ("qos", "classify")
++end
++
++
++function insert_qos_rules()
++ -- Insert empty PBX-SIP and PBX-RTP rules if not present.
++ insert_empty_sip_rtp_rules ("qos", "classify")
++
++ -- Get the network information
++ bindport, rtprange, ipaddr, externhost = get_network_info()
++
++ -- Iterate through the QoS rules, and if there is no other rule with the same port
++ -- range at the priority service level, insert this rule.
++ commit = false
++ m.uci:foreach("qos", "classify",
++ function(s1)
++ if s1._name == 'PBX-SIP' then
++ if s1.ports ~= bindport or s1.target ~= "Priority" or s1.proto ~= "udp" then
++ m.uci:set("qos", s1['.name'], "ports", bindport)
++ m.uci:set("qos", s1['.name'], "proto", "udp")
++ m.uci:set("qos", s1['.name'], "target", "Priority")
++ commit = true
++ end
++ elseif s1._name == 'PBX-RTP' then
++ if s1.ports ~= rtprange or s1.target ~= "Priority" or s1.proto ~= "udp" then
++ m.uci:set("qos", s1['.name'], "ports", rtprange)
++ m.uci:set("qos", s1['.name'], "proto", "udp")
++ m.uci:set("qos", s1['.name'], "target", "Priority")
++ commit = true
++ end
++ end
++ end)
++
++ -- If something changed, then we commit the qos config.
++ if commit == true then m.uci:commit("qos") end
++end
++
++-- This function is a (so far) unsuccessful attempt to manipulate the firewall rules from here
++-- Need to do more testing and eventually move to this mode.
++function maintain_firewall_rules()
++ -- Get the network information
++ bindport, rtprange, ipaddr, externhost = get_network_info()
++
++ commit = false
++ -- Only if externhost is set, do we control firewall rules.
++ if externhost ~= nil and bindport ~= nil and rtprange ~= nil then
++ -- Insert empty PBX-SIP and PBX-RTP rules if not present.
++ insert_empty_sip_rtp_rules ("firewall", "rule")
++
++ -- Iterate through the firewall rules, and if the dest_port and dest_ip setting of the\
++ -- SIP and RTP rule do not match what we want configured, set all the entries in the rule\
++ -- appropriately.
++ m.uci:foreach("firewall", "rule",
++ function(s1)
++ if s1._name == 'PBX-SIP' then
++ if s1.dest_port ~= bindport then
++ m.uci:set("firewall", s1['.name'], "dest_port", bindport)
++ m.uci:set("firewall", s1['.name'], "src", "wan")
++ m.uci:set("firewall", s1['.name'], "proto", "udp")
++ m.uci:set("firewall", s1['.name'], "target", "ACCEPT")
++ commit = true
++ end
++ elseif s1._name == 'PBX-RTP' then
++ if s1.dest_port ~= rtprange then
++ m.uci:set("firewall", s1['.name'], "dest_port", rtprange)
++ m.uci:set("firewall", s1['.name'], "src", "wan")
++ m.uci:set("firewall", s1['.name'], "proto", "udp")
++ m.uci:set("firewall", s1['.name'], "target", "ACCEPT")
++ commit = true
++ end
++ end
++ end)
++ else
++ -- We delete the firewall rules if one or more of the necessary parameters are not set.
++ sip_rule_name=nil
++ rtp_rule_name=nil
++
++ -- First discover the configuration names of the rules.
++ m.uci:foreach("firewall", "rule",
++ function(s1)
++ if s1._name == 'PBX-SIP' then
++ sip_rule_name = s1['.name']
++ elseif s1._name == 'PBX-RTP' then
++ rtp_rule_name = s1['.name']
++ end
++ end)
++
++ -- Then, using the names, actually delete the rules.
++ if sip_rule_name ~= nil then
++ m.uci:delete("firewall", sip_rule_name)
++ commit = true
++ end
++ if rtp_rule_name ~= nil then
++ m.uci:delete("firewall", rtp_rule_name)
++ commit = true
++ end
++ end
++
++ -- If something changed, then we commit the firewall config.
++ if commit == true then m.uci:commit("firewall") end
++end
++
++m = Map (modulename, translate("Advanced Settings"),
++ translate("This section contains settings that do not need to be changed under \
++ normal circumstances. In addition, here you can configure your system \
++ for use with remote SIP devices, and resolve call quality issues by enabling \
++ the insertion of QoS rules."))
++
++-- Recreate the voip server config, and restart necessary services after changes are commited
++-- to the advanced configuration. The firewall must restart because of "Remote Usage".
++function m.on_after_commit(self)
++
++ -- Make sure firewall rules are in place
++ maintain_firewall_rules()
++
++ -- If insertion of QoS rules is enabled
++ if m.uci:get(modulename, "advanced", "qos_enabled") == "yes" then
++ insert_qos_rules()
++ else
++ delete_qos_rules()
++ end
++
++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
++ luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null")
++ luci.sys.call("/etc/init.d/firewall restart 1\>/dev/null 2\>/dev/null")
++end
++
++-----------------------------------------------------------------------------
++s = m:section(NamedSection, "advanced", "settings", translate("Advanced Settings"))
++s.anonymous = true
++
++s:tab("general", translate("General Settings"))
++s:tab("remote_usage", translate("Remote Usage"),
++ translatef("You can use your SIP devices/softphones with this system from a remote location \
++ as well, as long as your Internet Service Provider gives you a public IP. \
++ You will be able to call other local users for free (e.g. other Analog Telephone Adapters (ATAs)) \
++ and use your VoIP providers to make calls as if you were local to the PBX. \
++ After configuring this tab, go back to where users are configured and see the new \
++ Server and Port setting you need to configure the remote SIP devices with. Please note that if this \
++ PBX is not running on your router/gateway, you will need to configure port forwarding (NAT) on your \
++ router/gateway. Please forward the ports below (SIP port and RTP range) to the IP address of the \
++ device running this PBX."))
++
++s:tab("qos", translate("QoS Settings"),
++ translate("If you experience jittery or high latency audio during heavy downloads, you may want \
++ to enable QoS. QoS prioritizes traffic to and from your network for specified ports and IP \
++ addresses, resulting in better latency and throughput for sound in our case. If enabled below, \
++ a QoS rule for this service will be configured by the PBX automatically, but you must visit the \
++ QoS configuration page (Network->QoS) to configure other critical QoS settings like Download \
++ and Upload speed."))
++
++ringtime = s:taboption("general", Value, "ringtime", translate("Number of Seconds to Ring"),
++ translate("Set the number of seconds to ring users upon incoming calls before hanging up \
++ or going to voicemail, if the voicemail is installed and enabled."))
++ringtime.datatype = "port"
++ringtime.default = 30
++
++ua = s:taboption("general", Value, "useragent", translate("User Agent String"),
++ translate("This is the name that the VoIP server will use to identify itself when \
++ registering to VoIP (SIP) providers. Some providers require this to a specific \
++ string matching a hardware SIP device."))
++ua.default = appname
++
++h = s:taboption("remote_usage", Value, "externhost", translate("Domain/IP Address/Dynamic Domain"),
++ translate("You can enter your domain name, external IP address, or dynamic domain name here. \
++ The best thing to input is a static IP address. If your IP address is dynamic and it changes, \
++ your configuration will become invalid. Hence, it's recommended to set up Dynamic DNS in this case. \
++ and enter your Dynamic DNS hostname here. You can configure Dynamic DNS with the luci-app-ddns package."))
++h.datatype = "host"
++
++p = s:taboption("remote_usage", Value, "bindport", translate("External SIP Port"),
++ translate("Pick a random port number between 6500 and 9500 for the service to listen on. \
++ Do not pick the standard 5060, because it is often subject to brute-force attacks. \
++ When finished, (1) click \"Save and Apply\", and (2) look in the \
++ \"SIP Device/Softphone Accounts\" section for updated Server and Port settings \
++ for your SIP Devices/Softphones."))
++p.datatype = "port"
++
++p = s:taboption("remote_usage", Value, "rtpstart", translate("RTP Port Range Start"),
++ translate("RTP traffic carries actual voice packets. This is the start of the port range \
++ that will be used for setting up RTP communication. It's usually OK to leave this \
++ at the default value."))
++p.datatype = "port"
++p.default = defaultrtpstart
++
++p = s:taboption("remote_usage", Value, "rtpend", translate("RTP Port Range End"))
++p.datatype = "port"
++p.default = defaultrtpend
++
++p = s:taboption("qos", ListValue, "qos_enabled", translate("Insert QoS Rules"))
++p:value("yes", translate("Yes"))
++p:value("no", translate("No"))
++p.default = "yes"
++
++return m
+diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-calls.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-calls.lua
+new file mode 100644
+index 0000000..ca373d6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-calls.lua
+@@ -0,0 +1,424 @@
++--[[
++ Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
++
++ This file is part of luci-pbx.
++
++ luci-pbx is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ luci-pbx is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with luci-pbx. If not, see <http://www.gnu.org/licenses/>.
++]]--
++
++if nixio.fs.access("/etc/init.d/asterisk") then
++ server = "asterisk"
++elseif nixio.fs.access("/etc/init.d/freeswitch") then
++ server = "freeswitch"
++else
++ server = ""
++end
++
++modulename = "pbx-calls"
++voipmodulename = "pbx-voip"
++googlemodulename = "pbx-google"
++usersmodulename = "pbx-users"
++allvalidaccounts = {}
++nallvalidaccounts = 0
++validoutaccounts = {}
++nvalidoutaccounts = 0
++validinaccounts = {}
++nvalidinaccounts = 0
++allvalidusers = {}
++nallvalidusers = 0
++validoutusers = {}
++nvalidoutusers = 0
++
++
++-- Checks whether the entered extension is valid syntactically.
++function is_valid_extension(exten)
++ return (exten:match("[#*+0-9NXZ]+$") ~= nil)
++end
++
++
++m = Map (modulename, translate("Call Routing"),
++ translate("This is where you indicate which Google/SIP accounts are used to call what \
++ country/area codes, which users can use what SIP/Google accounts, how incoming \
++ calls are routed, what numbers can get into this PBX with a password, and what \
++ numbers are blacklisted."))
++
++-- Recreate the config, and restart services after changes are commited to the configuration.
++function m.on_after_commit(self)
++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
++ luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null")
++end
++
++-- Add Google accounts to all valid accounts, and accounts valid for incoming and outgoing calls.
++m.uci:foreach(googlemodulename, "gtalk_jabber",
++ function(s1)
++ -- Add this provider to list of valid accounts.
++ if s1.username ~= nil and s1.name ~= nil then
++ allvalidaccounts[s1.name] = s1.username
++ nallvalidaccounts = nallvalidaccounts + 1
++
++ if s1.make_outgoing_calls == "yes" then
++ -- Add provider to the associative array of valid outgoing accounts.
++ validoutaccounts[s1.name] = s1.username
++ nvalidoutaccounts = nvalidoutaccounts + 1
++ end
++
++ if s1.register == "yes" then
++ -- Add provider to the associative array of valid outgoing accounts.
++ validinaccounts[s1.name] = s1.username
++ nvalidinaccounts = nvalidinaccounts + 1
++ end
++ end
++ end)
++
++-- Add SIP accounts to all valid accounts, and accounts valid for incoming and outgoing calls.
++m.uci:foreach(voipmodulename, "voip_provider",
++ function(s1)
++ -- Add this provider to list of valid accounts.
++ if s1.defaultuser ~= nil and s1.host ~= nil and s1.name ~= nil then
++ allvalidaccounts[s1.name] = s1.defaultuser .. "@" .. s1.host
++ nallvalidaccounts = nallvalidaccounts + 1
++
++ if s1.make_outgoing_calls == "yes" then
++ -- Add provider to the associative array of valid outgoing accounts.
++ validoutaccounts[s1.name] = s1.defaultuser .. "@" .. s1.host
++ nvalidoutaccounts = nvalidoutaccounts + 1
++ end
++
++ if s1.register == "yes" then
++ -- Add provider to the associative array of valid outgoing accounts.
++ validinaccounts[s1.name] = s1.defaultuser .. "@" .. s1.host
++ nvalidinaccounts = nvalidinaccounts + 1
++ end
++ end
++ end)
++
++-- Add Local User accounts to all valid users, and users allowed to make outgoing calls.
++m.uci:foreach(usersmodulename, "local_user",
++ function(s1)
++ -- Add user to list of all valid users.
++ if s1.defaultuser ~= nil then
++ allvalidusers[s1.defaultuser] = true
++ nallvalidusers = nallvalidusers + 1
++
++ if s1.can_call == "yes" then
++ validoutusers[s1.defaultuser] = true
++ nvalidoutusers = nvalidoutusers + 1
++ end
++ end
++ end)
++
++
++----------------------------------------------------------------------------------------------------
++-- If there are no accounts configured, or no accounts enabled for outgoing calls, display a warning.
++-- Otherwise, display the usual help text within the section.
++if nallvalidaccounts == 0 then
++ text = translate("NOTE: There are no Google or SIP provider accounts configured.")
++elseif nvalidoutaccounts == 0 then
++ text = translate("NOTE: There are no Google or SIP provider accounts enabled for outgoing calls.")
++else
++ text = translate("If you have more than one account that can make outgoing calls, you \
++ should enter a list of phone numbers and/or prefixes in the following fields for each \
++ provider listed. Invalid prefixes are removed silently, and only 0-9, X, Z, N, #, *, \
++ and + are valid characters. The letter X matches 0-9, Z matches 1-9, and N matches 2-9. \
++ For example to make calls to Germany through a provider, you can enter 49. To make calls \
++ to North America, you can enter 1NXXNXXXXXX. If one of your providers can make \"local\" \
++ calls to an area code like New York's 646, you can enter 646NXXXXXX for that \
++ provider. You should leave one account with an empty list to make calls with \
++ it by default, if no other provider's prefixes match. The system will automatically \
++ replace an empty list with a message that the provider dials all numbers not matched by another \
++ provider's prefixes. Be as specific as possible (i.e. 1NXXNXXXXXX is better than 1). Please note \
++ all international dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a \
++ space-separated list, and/or one per line by hitting enter after every one.")
++end
++
++
++s = m:section(NamedSection, "outgoing_calls", "call_routing", translate("Outgoing Calls"), text)
++s.anonymous = true
++
++for k,v in pairs(validoutaccounts) do
++ patterns = s:option(DynamicList, k, v)
++
++ -- If the saved field is empty, we return a string
++ -- telling the user that this provider would dial any exten.
++ function patterns.cfgvalue(self, section)
++ value = self.map:get(section, self.option)
++
++ if value == nil then
++ return {translate("Dials numbers unmatched elsewhere")}
++ else
++ return value
++ end
++ end
++
++ -- Write only valid extensions into the config file.
++ function patterns.write(self, section, value)
++ newvalue = {}
++ nindex = 1
++ for index, field in ipairs(value) do
++ val = luci.util.trim(value[index])
++ if is_valid_extension(val) == true then
++ newvalue[nindex] = val
++ nindex = nindex + 1
++ end
++ end
++ DynamicList.write(self, section, newvalue)
++ end
++end
++
++----------------------------------------------------------------------------------------------------
++-- If there are no accounts configured, or no accounts enabled for incoming calls, display a warning.
++-- Otherwise, display the usual help text within the section.
++if nallvalidaccounts == 0 then
++ text = translate("NOTE: There are no Google or SIP provider accounts configured.")
++elseif nvalidinaccounts == 0 then
++ text = translate("NOTE: There are no Google or SIP provider accounts enabled for incoming calls.")
++else
++ text = translate("For each provider enabled for incoming calls, here you can restrict which users to\
++ ring on incoming calls. If the list is empty, the system will indicate that all users \
++ enabled for incoming calls will ring. Invalid usernames will be rejected \
++ silently. Also, entering a username here overrides the user's setting to not receive \
++ incoming calls. This way, you can make certain users ring only for specific providers. \
++ Entries can be made in a space-separated list, and/or one per line by hitting enter after \
++ every one.")
++end
++
++
++s = m:section(NamedSection, "incoming_calls", "call_routing", translate("Incoming Calls"), text)
++s.anonymous = true
++
++for k,v in pairs(validinaccounts) do
++ users = s:option(DynamicList, k, v)
++
++ -- If the saved field is empty, we return a string telling the user that
++ -- this provider would ring all users configured for incoming calls.
++ function users.cfgvalue(self, section)
++ value = self.map:get(section, self.option)
++
++ if value == nil then
++ return {translate("Rings users enabled for incoming calls")}
++ else
++ return value
++ end
++ end
++
++ -- Write only valid user names.
++ function users.write(self, section, value)
++ newvalue = {}
++ nindex = 1
++ for index, field in ipairs(value) do
++ trimuser = luci.util.trim(value[index])
++ if allvalidusers[trimuser] == true then
++ newvalue[nindex] = trimuser
++ nindex = nindex + 1
++ end
++ end
++ DynamicList.write(self, section, newvalue)
++ end
++end
++
++
++----------------------------------------------------------------------------------------------------
++-- If there are no user accounts configured, no user accounts enabled for outgoing calls,
++-- display a warning. Otherwise, display the usual help text within the section.
++if nallvalidusers == 0 then
++ text = translate("NOTE: There are no local user accounts configured.")
++elseif nvalidoutusers == 0 then
++ text = translate("NOTE: There are no local user accounts enabled for outgoing calls.")
++else
++ text = translate("For each user enabled for outgoing calls you can restrict what providers the user \
++ can use for outgoing calls. By default all users can use all providers. To show up in the list \
++ below the user should be allowed to make outgoing calls in the \"User Accounts\" page. Enter VoIP \
++ providers in the format username@some.host.name, as listed in \"Outgoing Calls\" above. It's \
++ easiest to copy and paste the providers from above. Invalid entries, including providers not \
++ enabled for outgoing calls, will be rejected silently. Entries can be made in a space-separated \
++ list, and/or one per line by hitting enter after every one.")
++end
++
++
++s = m:section(NamedSection, "providers_user_can_use", "call_routing",
++ translate("Providers Used for Outgoing Calls"), text)
++s.anonymous = true
++
++for k,v in pairs(validoutusers) do
++ providers = s:option(DynamicList, k, k)
++
++ -- If the saved field is empty, we return a string telling the user
++ -- that this user uses all providers enavled for outgoing calls.
++ function providers.cfgvalue(self, section)
++ value = self.map:get(section, self.option)
++
++ if value == nil then
++ return {translate("Uses providers enabled for outgoing calls")}
++ else
++ newvalue = {}
++ -- Convert internal names to user@host values.
++ for i,v in ipairs(value) do
++ newvalue[i] = validoutaccounts[v]
++ end
++ return newvalue
++ end
++ end
++
++ -- Cook the new values prior to entering them into the config file.
++ -- Also, enter them only if they are valid.
++ function providers.write(self, section, value)
++ cookedvalue = {}
++ cindex = 1
++ for index, field in ipairs(value) do
++ cooked = string.gsub(luci.util.trim(value[index]), "%W", "_")
++ if validoutaccounts[cooked] ~= nil then
++ cookedvalue[cindex] = cooked
++ cindex = cindex + 1
++ end
++ end
++ DynamicList.write(self, section, cookedvalue)
++ end
++end
++
++----------------------------------------------------------------------------------------------------
++s = m:section(TypedSection, "callthrough_numbers", translate("Call-through Numbers"),
++ translate("Designate numbers that are allowed to call through this system and which user's \
++ privileges they will have."))
++s.anonymous = true
++s.addremove = true
++
++num = s:option(DynamicList, "callthrough_number_list", translate("Call-through Numbers"),
++ translate("Specify numbers individually here. Press enter to add more numbers. \
++ You will have to experiment with what country and area codes you need to add \
++ to the number."))
++num.datatype = "uinteger"
++
++p = s:option(ListValue, "enabled", translate("Enabled"))
++p:value("yes", translate("Yes"))
++p:value("no", translate("No"))
++p.default = "yes"
++
++user = s:option(Value, "defaultuser", translate("User Name"),
++ translate("The number(s) specified above will be able to dial out with this user's providers. \
++ Invalid usernames, including users not enabled for outgoing calls, are dropped silently. \
++ Please verify that the entry was accepted."))
++function user.write(self, section, value)
++ trimuser = luci.util.trim(value)
++ if allvalidusers[trimuser] == true then
++ Value.write(self, section, trimuser)
++ end
++end
++
++pwd = s:option(Value, "pin", translate("PIN"),
++ translate("Your PIN disappears when saved for your protection. It will be changed \
++ only when you enter a value different from the saved one. Leaving the PIN \
++ empty is possible, but please beware of the security implications."))
++pwd.password = true
++pwd.rmempty = false
++
++-- We skip reading off the saved value and return nothing.
++function pwd.cfgvalue(self, section)
++ return ""
++end
++
++-- We check the entered value against the saved one, and only write if the entered value is
++-- something other than the empty string, and it differes from the saved value.
++function pwd.write(self, section, value)
++ local orig_pwd = m:get(section, self.option)
++ if value and #value > 0 and orig_pwd ~= value then
++ Value.write(self, section, value)
++ end
++end
++
++----------------------------------------------------------------------------------------------------
++s = m:section(TypedSection, "callback_numbers", translate("Call-back Numbers"),
++ translate("Designate numbers to whom the system will hang up and call back, which provider will \
++ be used to call them, and which user's privileges will be granted to them."))
++s.anonymous = true
++s.addremove = true
++
++num = s:option(DynamicList, "callback_number_list", translate("Call-back Numbers"),
++ translate("Specify numbers individually here. Press enter to add more numbers. \
++ You will have to experiment with what country and area codes you need to add \
++ to the number."))
++num.datatype = "uinteger"
++
++p = s:option(ListValue, "enabled", translate("Enabled"))
++p:value("yes", translate("Yes"))
++p:value("no", translate("No"))
++p.default = "yes"
++
++delay = s:option(Value, "callback_hangup_delay", translate("Hang-up Delay"),
++ translate("How long to wait before hanging up. If the provider you use to dial automatically forwards \
++ to voicemail, you can set this value to a delay that will allow you to hang up before your call gets \
++ forwarded and you get billed for it."))
++delay.datatype = "uinteger"
++delay.default = 0
++
++user = s:option(Value, "defaultuser", translate("User Name"),
++ translate("The number(s) specified above will be able to dial out with this user's providers. \
++ Invalid usernames, including users not enabled for outgoing calls, are dropped silently. \
++ Please verify that the entry was accepted."))
++function user.write(self, section, value)
++ trimuser = luci.util.trim(value)
++ if allvalidusers[trimuser] == true then
++ Value.write(self, section, trimuser)
++ end
++end
++
++pwd = s:option(Value, "pin", translate("PIN"),
++ translate("Your PIN disappears when saved for your protection. It will be changed \
++ only when you enter a value different from the saved one. Leaving the PIN \
++ empty is possible, but please beware of the security implications."))
++pwd.password = true
++pwd.rmempty = false
++
++-- We skip reading off the saved value and return nothing.
++function pwd.cfgvalue(self, section)
++ return ""
++end
++
++-- We check the entered value against the saved one, and only write if the entered value is
++-- something other than the empty string, and it differes from the saved value.
++function pwd.write(self, section, value)
++ local orig_pwd = m:get(section, self.option)
++ if value and #value > 0 and orig_pwd ~= value then
++ Value.write(self, section, value)
++ end
++end
++
++provider = s:option(Value, "callback_provider", translate("Call-back Provider"),
++ translate("Enter a VoIP provider to use for call-back in the format username@some.host.name, as listed in \
++ \"Outgoing Calls\" above. It's easiest to copy and paste the providers from above. Invalid entries, including \
++ providers not enabled for outgoing calls, will be rejected silently."))
++function provider.write(self, section, value)
++ cooked = string.gsub(luci.util.trim(value), "%W", "_")
++ if validoutaccounts[cooked] ~= nil then
++ Value.write(self, section, value)
++ end
++end
++
++----------------------------------------------------------------------------------------------------
++s = m:section(NamedSection, "blacklisting", "call_routing", translate("Blacklisted Numbers"),
++ translate("Enter phone numbers that you want to decline calls from automatically. \
++ You should probably omit the country code and any leading zeroes, but please \
++ experiment to make sure you are blocking numbers from your desired area successfully."))
++s.anonymous = true
++
++b = s:option(DynamicList, "blacklist1", translate("Dynamic List of Blacklisted Numbers"),
++ translate("Specify numbers individually here. Press enter to add more numbers."))
++b.cast = "string"
++b.datatype = "uinteger"
++
++b = s:option(Value, "blacklist2", translate("Space-Separated List of Blacklisted Numbers"),
++ translate("Copy-paste large lists of numbers here."))
++b.template = "cbi/tvalue"
++b.rows = 3
++
++return m
+diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-google.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-google.lua
+new file mode 100644
+index 0000000..3c36a16
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-google.lua
+@@ -0,0 +1,122 @@
++--[[
++ Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
++
++ This file is part of luci-pbx.
++
++ luci-pbx is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ luci-pbx is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with luci-pbx. If not, see <http://www.gnu.org/licenses/>.
++]]--
++
++if nixio.fs.access("/etc/init.d/asterisk") then
++ server = "asterisk"
++elseif nixio.fs.access("/etc/init.d/freeswitch") then
++ server = "freeswitch"
++else
++ server = ""
++end
++
++modulename = "pbx-google"
++googlemodulename = "pbx-google"
++defaultstatus = "dnd"
++defaultstatusmessage = "PBX online, may lose messages"
++
++m = Map (modulename, translate("Google Accounts"),
++ translate("This is where you set up your Google (Talk and Voice) Accounts, in order to start \
++ using them for dialing and receiving calls (voice chat and real phone calls). Please \
++ make at least one voice call using the Google Talk plugin installable through the \
++ GMail interface, and then log out from your account everywhere. Click \"Add\" \
++ to add as many accounts as you wish."))
++
++-- Recreate the config, and restart services after changes are commited to the configuration.
++function m.on_after_commit(self)
++ -- Create a field "name" for each account that identifies the account in the backend.
++ commit = false
++ m.uci:foreach(modulename, "gtalk_jabber",
++ function(s1)
++ if s1.username ~= nil then
++ name=string.gsub(s1.username, "%W", "_")
++ if s1.name ~= name then
++ m.uci:set(modulename, s1['.name'], "name", name)
++ commit = true
++ end
++ end
++ end)
++ if commit == true then m.uci:commit(modulename) end
++
++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
++ luci.sys.call("/etc/init.d/asterisk restart 1\>/dev/null 2\>/dev/null")
++end
++
++-----------------------------------------------------------------------------
++s = m:section(TypedSection, "gtalk_jabber", translate("Google Voice/Talk Accounts"))
++s.anonymous = true
++s.addremove = true
++
++s:option(Value, "username", translate("Email"))
++
++pwd = s:option(Value, "secret", translate("Password"),
++ translate("When your password is saved, it disappears from this field and is not displayed \
++ for your protection. The previously saved password will be changed only when you \
++ enter a value different from the saved one."))
++pwd.password = true
++pwd.rmempty = false
++
++-- We skip reading off the saved value and return nothing.
++function pwd.cfgvalue(self, section)
++ return ""
++end
++
++-- We check the entered value against the saved one, and only write if the entered value is
++-- something other than the empty string, and it differes from the saved value.
++function pwd.write(self, section, value)
++ local orig_pwd = m:get(section, self.option)
++ if value and #value > 0 and orig_pwd ~= value then
++ Value.write(self, section, value)
++ end
++end
++
++
++p = s:option(ListValue, "register",
++ translate("Enable Incoming Calls (set Status below)"),
++ translate("When somebody starts voice chat with your GTalk account or calls the GVoice, \
++ number (if you have Google Voice), the call will be forwarded to any users \
++ that are online (registered using a SIP device or softphone) and permitted to \
++ receive the call. If you have Google Voice, you must go to your GVoice settings and \
++ forward calls to Google chat in order to actually receive calls made to your \
++ GVoice number. If you have trouble receiving calls from GVoice, experiment \
++ with the Call Screening option in your GVoice Settings. Finally, make sure no other \
++ client is online with this account (browser in gmail, mobile/desktop Google Talk \
++ App) as it may interfere."))
++p:value("yes", translate("Yes"))
++p:value("no", translate("No"))
++p.default = "yes"
++
++p = s:option(ListValue, "make_outgoing_calls", translate("Enable Outgoing Calls"),
++ translate("Use this account to make outgoing calls as configured in the \"Call Routing\" section."))
++p:value("yes", translate("Yes"))
++p:value("no", translate("No"))
++p.default = "yes"
++
++st = s:option(ListValue, "status", translate("Google Talk Status"))
++st:depends("register", "yes")
++st:value("dnd", translate("Do Not Disturb"))
++st:value("away", translate("Away"))
++st:value("available", translate("Available"))
++st.default = defaultstatus
++
++stm = s:option(Value, "statusmessage", translate("Google Talk Status Message"),
++ translate("Avoid using anything but alpha-numeric characters, space, comma, and period."))
++stm:depends("register", "yes")
++stm.default = defaultstatusmessage
++
++return m
+diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-users.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-users.lua
+new file mode 100644
+index 0000000..c7c8b4d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-users.lua
+@@ -0,0 +1,133 @@
++--[[
++ Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
++
++ This file is part of luci-pbx.
++
++ luci-pbx is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ luci-pbx is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with luci-pbx. If not, see <http://www.gnu.org/licenses/>.
++]]--
++
++if nixio.fs.access("/etc/init.d/asterisk") then
++ server = "asterisk"
++elseif nixio.fs.access("/etc/init.d/freeswitch") then
++ server = "freeswitch"
++else
++ server = ""
++end
++
++modulename = "pbx-users"
++modulenamecalls = "pbx-calls"
++modulenameadvanced = "pbx-advanced"
++
++
++m = Map (modulename, translate("User Accounts"),
++ translate("Here you must configure at least one SIP account, that you \
++ will use to register with this service. Use this account either in an Analog Telephony \
++ Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid on your \
++ smartphone, or Ekiga, Linphone, or X-Lite on your computer. By default, all SIP accounts \
++ will ring simultaneously if a call is made to one of your VoIP provider accounts or GV \
++ numbers."))
++
++-- Recreate the config, and restart services after changes are commited to the configuration.
++function m.on_after_commit(self)
++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
++ luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null")
++end
++
++externhost = m.uci:get(modulenameadvanced, "advanced", "externhost")
++bindport = m.uci:get(modulenameadvanced, "advanced", "bindport")
++ipaddr = m.uci:get("network", "lan", "ipaddr")
++
++-----------------------------------------------------------------------------
++s = m:section(NamedSection, "server", "user", translate("Server Setting"))
++s.anonymous = true
++
++if ipaddr == nil or ipaddr == "" then
++ ipaddr = "(IP address not static)"
++end
++
++if bindport ~= nil then
++ just_ipaddr = ipaddr
++ ipaddr = ipaddr .. ":" .. bindport
++end
++
++s:option(DummyValue, "ipaddr", translate("Server Setting for Local SIP Devices"),
++ translate("Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices you will \
++ use ONLY locally and never from a remote location.")).default = ipaddr
++
++if externhost ~= nil then
++ if bindport ~= nil then
++ just_externhost = externhost
++ externhost = externhost .. ":" .. bindport
++ end
++ s:option(DummyValue, "externhost", translate("Server Setting for Remote SIP Devices"),
++ translate("Enter this hostname (or hostname:port) in the Server/Registrar setting of SIP \
++ devices you will use from a remote location (they will work locally too).")
++ ).default = externhost
++end
++
++if bindport ~= nil then
++ s:option(DummyValue, "bindport", translate("Port Setting for SIP Devices"),
++ translatef("If setting Server/Registrar to %s or %s does not work for you, try setting \
++ it to %s or %s and entering this port number in a separate field that specifies the \
++ Server/Registrar port number. Beware that some devices have a confusing \
++ setting that sets the port where SIP requests originate from on the SIP \
++ device itself (the bind port). The port specified on this page is NOT this bind port \
++ but the port this service listens on.",
++ ipaddr, externhost, just_ipaddr, just_externhost)).default = bindport
++end
++
++-----------------------------------------------------------------------------
++s = m:section(TypedSection, "local_user", translate("SIP Device/Softphone Accounts"))
++s.anonymous = true
++s.addremove = true
++
++s:option(Value, "fullname", translate("Full Name"),
++ translate("You can specify a real name to show up in the Caller ID here."))
++
++du = s:option(Value, "defaultuser", translate("User Name"),
++ translate("Use (four to five digit) numeric user name if you are connecting normal telephones \
++ with ATAs to this system (so they can dial user names)."))
++du.datatype = "uciname"
++
++pwd = s:option(Value, "secret", translate("Password"),
++ translate("Your password disappears when saved for your protection. It will be changed \
++ only when you enter a value different from the saved one."))
++pwd.password = true
++pwd.rmempty = false
++
++-- We skip reading off the saved value and return nothing.
++function pwd.cfgvalue(self, section)
++ return ""
++end
++
++-- We check the entered value against the saved one, and only write if the entered value is
++-- something other than the empty string, and it differes from the saved value.
++function pwd.write(self, section, value)
++ local orig_pwd = m:get(section, self.option)
++ if value and #value > 0 and orig_pwd ~= value then
++ Value.write(self, section, value)
++ end
++end
++
++p = s:option(ListValue, "ring", translate("Receives Incoming Calls"))
++p:value("yes", translate("Yes"))
++p:value("no", translate("No"))
++p.default = "yes"
++
++p = s:option(ListValue, "can_call", translate("Makes Outgoing Calls"))
++p:value("yes", translate("Yes"))
++p:value("no", translate("No"))
++p.default = "yes"
++
++return m
+diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-voip.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-voip.lua
+new file mode 100644
+index 0000000..ed1ed1e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-voip.lua
+@@ -0,0 +1,116 @@
++--[[
++ Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
++
++ This file is part of luci-pbx.
++
++ luci-pbx is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ luci-pbx is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with luci-pbx. If not, see <http://www.gnu.org/licenses/>.
++]]--
++
++if nixio.fs.access("/etc/init.d/asterisk") then
++ server = "asterisk"
++elseif nixio.fs.access("/etc/init.d/freeswitch") then
++ server = "freeswitch"
++else
++ server = ""
++end
++
++modulename = "pbx-voip"
++
++m = Map (modulename, translate("SIP Accounts"),
++ translate("This is where you set up your SIP (VoIP) accounts ts like Sipgate, SipSorcery, \
++ the popular Betamax providers, and any other providers with SIP settings in order to start \
++ using them for dialing and receiving calls (SIP uri and real phone calls). Click \"Add\" to \
++ add as many accounts as you wish."))
++
++-- Recreate the config, and restart services after changes are commited to the configuration.
++function m.on_after_commit(self)
++ commit = false
++ -- Create a field "name" for each account that identifies the account in the backend.
++ m.uci:foreach(modulename, "voip_provider",
++ function(s1)
++ if s1.defaultuser ~= nil and s1.host ~= nil then
++ name=string.gsub(s1.defaultuser.."_"..s1.host, "%W", "_")
++ if s1.name ~= name then
++ m.uci:set(modulename, s1['.name'], "name", name)
++ commit = true
++ end
++ end
++ end)
++ if commit == true then m.uci:commit(modulename) end
++
++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null")
++ luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null")
++end
++
++-----------------------------------------------------------------------------
++s = m:section(TypedSection, "voip_provider", translate("SIP Provider Accounts"))
++s.anonymous = true
++s.addremove = true
++
++s:option(Value, "defaultuser", translate("User Name"))
++pwd = s:option(Value, "secret", translate("Password"),
++ translate("When your password is saved, it disappears from this field and is not displayed \
++ for your protection. The previously saved password will be changed only when you \
++ enter a value different from the saved one."))
++
++
++
++pwd.password = true
++pwd.rmempty = false
++
++-- We skip reading off the saved value and return nothing.
++function pwd.cfgvalue(self, section)
++ return ""
++end
++
++-- We check the entered value against the saved one, and only write if the entered value is
++-- something other than the empty string, and it differes from the saved value.
++function pwd.write(self, section, value)
++ local orig_pwd = m:get(section, self.option)
++ if value and #value > 0 and orig_pwd ~= value then
++ Value.write(self, section, value)
++ end
++end
++
++h = s:option(Value, "host", translate("SIP Server/Registrar"))
++h.datatype = "host"
++
++p = s:option(ListValue, "register", translate("Enable Incoming Calls (Register via SIP)"),
++ translate("This option should be set to \"Yes\" if you have a DID \(real telephone number\) \
++ associated with this SIP account or want to receive SIP uri calls through this \
++ provider."))
++p:value("yes", translate("Yes"))
++p:value("no", translate("No"))
++p.default = "yes"
++
++p = s:option(ListValue, "make_outgoing_calls", translate("Enable Outgoing Calls"),
++ translate("Use this account to make outgoing calls."))
++p:value("yes", translate("Yes"))
++p:value("no", translate("No"))
++p.default = "yes"
++
++from = s:option(Value, "fromdomain",
++ translate("SIP Realm (needed by some providers)"))
++from.optional = true
++from.datatype = "host"
++
++port = s:option(Value, "port", translate("SIP Server/Registrar Port"))
++port.optional = true
++port.datatype = "port"
++
++op = s:option(Value, "outboundproxy", translate("Outbound Proxy"))
++op.optional = true
++op.datatype = "host"
++
++return m
+diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx.lua
+new file mode 100644
+index 0000000..4c5fcbd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx.lua
+@@ -0,0 +1,115 @@
++--[[
++ Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
++
++ This file is part of luci-pbx.
++
++ luci-pbx is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ luci-pbx is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with luci-pbx. If not, see <http://www.gnu.org/licenses/>.
++]]--
++
++modulename = "pbx"
++
++
++if nixio.fs.access("/etc/init.d/asterisk") then
++ server = "asterisk"
++elseif nixio.fs.access("/etc/init.d/freeswitch") then
++ server = "freeswitch"
++else
++ server = ""
++end
++
++
++-- Returns formatted output of string containing only the words at the indices
++-- specified in the table "indices".
++function format_indices(string, indices)
++ if indices == nil then
++ return "Error: No indices to format specified.\n"
++ end
++
++ -- Split input into separate lines.
++ lines = luci.util.split(luci.util.trim(string), "\n")
++
++ -- Split lines into separate words.
++ splitlines = {}
++ for lpos,line in ipairs(lines) do
++ splitlines[lpos] = luci.util.split(luci.util.trim(line), "%s+", nil, true)
++ end
++
++ -- For each split line, if the word at all indices specified
++ -- to be formatted are not null, add the formatted line to the
++ -- gathered output.
++ output = ""
++ for lpos,splitline in ipairs(splitlines) do
++ loutput = ""
++ for ipos,index in ipairs(indices) do
++ if splitline[index] ~= nil then
++ loutput = loutput .. string.format("%-40s", splitline[index])
++ else
++ loutput = nil
++ break
++ end
++ end
++
++ if loutput ~= nil then
++ output = output .. loutput .. "\n"
++ end
++ end
++ return output
++end
++
++
++m = Map (modulename, translate("PBX Main Page"),
++ translate("This configuration page allows you to configure a phone system (PBX) service which \
++ permits making phone calls through multiple Google and SIP (like Sipgate, \
++ SipSorcery, and Betamax) accounts and sharing them among many SIP devices. \
++ Note that Google accounts, SIP accounts, and local user accounts are configured in the \
++ \"Google Accounts\", \"SIP Accounts\", and \"User Accounts\" sub-sections. \
++ You must add at least one User Account to this PBX, and then configure a SIP device or \
++ softphone to use the account, in order to make and receive calls with your Google/SIP \
++ accounts. Configuring multiple users will allow you to make free calls between all users, \
++ and share the configured Google and SIP accounts. If you have more than one Google and SIP \
++ accounts set up, you should probably configure how calls to and from them are routed in \
++ the \"Call Routing\" page. If you're interested in using your own PBX from anywhere in the \
++ world, then visit the \"Remote Usage\" section in the \"Advanced Settings\" page."))
++
++-----------------------------------------------------------------------------------------
++s = m:section(NamedSection, "connection_status", "main",
++ translate("PBX Service Status"))
++s.anonymous = true
++
++s:option (DummyValue, "status", translate("Service Status"))
++
++sts = s:option(DummyValue, "_sts")
++sts.template = "cbi/tvalue"
++sts.rows = 20
++
++function sts.cfgvalue(self, section)
++
++ if server == "asterisk" then
++ regs = luci.sys.exec("asterisk -rx 'sip show registry' | sed 's/peer-//'")
++ jabs = luci.sys.exec("asterisk -rx 'jabber show connections' | grep onnected")
++ usrs = luci.sys.exec("asterisk -rx 'sip show users'")
++ chan = luci.sys.exec("asterisk -rx 'core show channels'")
++
++ return format_indices(regs, {1, 5}) ..
++ format_indices(jabs, {2, 4}) .. "\n" ..
++ format_indices(usrs, {1} ) .. "\n" .. chan
++
++ elseif server == "freeswitch" then
++ return "Freeswitch is not supported yet.\n"
++ else
++ return "Neither Asterisk nor FreeSwitch discovered, please install Asterisk, as Freeswitch is not supported yet.\n"
++ end
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-pbx/po/ca/pbx.po b/feeds/luci/applications/luci-app-pbx/po/ca/pbx.po
+new file mode 100644
+index 0000000..c8a0a99
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/ca/pbx.po
+@@ -0,0 +1,509 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-01 05:14+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Ajusts avançats"
++
++msgid "Available"
++msgstr "Disponible"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++"Eviteu utilitzar res excepte caràcters alfanumèrics, espai, coma, i punt."
++
++msgid "Away"
++msgstr "Fora"
++
++msgid "Blacklisted Numbers"
++msgstr "Nombres prohibits"
++
++msgid "Call Routing"
++msgstr "Encaminament de trucades"
++
++msgid "Call-back Numbers"
++msgstr "Nombres de trucada de tornada"
++
++msgid "Call-back Provider"
++msgstr "Proveïdor de trucada de tornada"
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr "Copieu i enganxeu llistes grans de nombres aquí."
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++"Designeu els nombres que es permeten trucar a través d'aquest sistema i els "
++"privilegis de qual usuari tindran."
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++"Designeu els nombres als quals el sistema penjarà i trucarà de tornada, qual "
++"proveïdor s'emprarà per a trucar-los, i els privilegis de qual usuari se "
++"lis concedirà."
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr "Truca els nombres que no coincideixen d'altra manera"
++
++msgid "Do Not Disturb"
++msgstr "No molestis"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "Habilita trucades entrants (registreu via SIP)"
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr "Habilita trucades entrants (establiu l'Estat a baix)"
++
++msgid "Enable Outgoing Calls"
++msgstr "Habilita trucades sortints"
++
++msgid "Enabled"
++msgstr "Habilitat"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr "Port SIP extern"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr "Nom complet"
++
++msgid "General Settings"
++msgstr "Ajusts generals"
++
++msgid "Google Accounts"
++msgstr "Comptes de Google"
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr "Retard de penja"
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++"Quant temps per a esperar abans de penjar. Si el proveïdor que empreu per a "
++"trucar automàticament redirigeix al correu de veu, podeu estableix aquest "
++"valor a un retard que us permet penjar abans que la teva trucada es "
++"redirigeixi i s'us cobri per ella."
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr "Trucades entrants"
++
++msgid "Insert QoS Rules"
++msgstr "Insereix regles QoS"
++
++msgid "Makes Outgoing Calls"
++msgstr "Fa trucades sortints"
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr "NOTA: No hi ha cap compte configurat ni del Google ni de proveïdor SIP."
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++"NOTA: No hi ha cap compte habilitat ni del Google ni de proveïdor SIP per "
++"als trucades entrants."
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++"NOTA: No hi ha cap compte habilitat ni del Google ni de proveïdor SIP per "
++"als trucades sortints."
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr "NOTA: No hi ha cap compte d'usuari local configurat."
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++"NOTA: No hi ha cap compte d'usuari local habilitat per als trucades "
++"sortints."
++
++msgid "No"
++msgstr "No"
++
++msgid "Number of Seconds to Ring"
++msgstr "Nombre de segons a sonar"
++
++msgid "Outbound Proxy"
++msgstr "Servidor intermediari de sortida"
++
++msgid "Outgoing Calls"
++msgstr "Trucades sortints"
++
++msgid "PBX Main Page"
++msgstr "Pàgina principal PBX"
++
++msgid "PBX Service Status"
++msgstr "Estat del servei PBX"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "Password"
++msgstr "Contrasenya"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr "Ajust de port per als dispositius SIP"
++
++msgid "Providers Used for Outgoing Calls"
++msgstr "Proveïdors utilitzats per als trucades sortints"
++
++msgid "QoS Settings"
++msgstr "Ajusts QoS"
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr "Rep trucades entrants"
++
++msgid "Remote Usage"
++msgstr "Ús remot"
++
++msgid "Rings users enabled for incoming calls"
++msgstr "Truca als usuaris habilitats per a rebre trucades"
++
++msgid "SIP Accounts"
++msgstr "Comptes SIP"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr "Comptes de proveïdor SIP"
++
++msgid "SIP Realm (needed by some providers)"
++msgstr "Regne SIP (necessitat per alguns proveïdors)"
++
++msgid "SIP Server/Registrar"
++msgstr "Servidor/Registrador SIP"
++
++msgid "SIP Server/Registrar Port"
++msgstr "Port del Servidor/Registrador SIP"
++
++msgid "Server Setting"
++msgstr "Ajust de servidor"
++
++msgid "Server Setting for Local SIP Devices"
++msgstr "Ajust de servidor pels dispositius SIP locals"
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr "Ajust de servidor pels dispositius SIP remots"
++
++msgid "Service Status"
++msgstr "Estat de servei"
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++"Estableix el nombre de segons per a sonar als usuaris abans de penjar o anar "
++"al correu de veu, si el correu de veu està instal·lat i habilitat."
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr "Llista de nombres prohibits separats per espai"
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++"Especifiqueu els nombres individualment aquí. Premeu Enter per afegir més "
++"nombres."
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++"Utilitza aquest compte per fer trucades sortints com configurat en la secció "
++"\"Encaminament de trucades\"."
++
++msgid "Use this account to make outgoing calls."
++msgstr "Utilitza aquest compte per fer trucades sortints."
++
++msgid "User Accounts"
++msgstr "Comptes d'usuari"
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr "Nom d'usuari"
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr "Sí"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/cs/pbx.po b/feeds/luci/applications/luci-app-pbx/po/cs/pbx.po
+new file mode 100644
+index 0000000..8b69ef1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/cs/pbx.po
+@@ -0,0 +1,487 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-12 20:19+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "PokroÄilé nastavení"
++
++msgid "Available"
++msgstr "Dostupné"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr "PryÄ"
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr "Nevyrušovat"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr "Email"
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "Povolit příchozí hovory (Registrace přes SIP)"
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr "Povolit odchozí hovory"
++
++msgid "Enabled"
++msgstr "Povoleno"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr "Externí SIP port"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr "Celé jméno (jméno a příjmení)"
++
++msgid "General Settings"
++msgstr "Obecné nastavení"
++
++msgid "Google Accounts"
++msgstr "Google úÄty"
++
++msgid "Google Talk Status"
++msgstr "Stav Google Talk"
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr "Google Voice/Talk úÄty"
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr "Příchozí volání"
++
++msgid "Insert QoS Rules"
++msgstr "Vložte QoS pravidla"
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr "Ne"
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr "Odchozí volání"
++
++msgid "PBX Main Page"
++msgstr "Hlavní stránka PBX"
++
++msgid "PBX Service Status"
++msgstr "Stav PBX služby"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "Password"
++msgstr "Heslo"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr "Nastavení QoS"
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr "SIP úÄty"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr "Stav služby"
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr "Uživatelské úÄty"
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr "Uživatelské jméno"
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr "Ano"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/de/pbx.po b/feeds/luci/applications/luci-app-pbx/po/de/pbx.po
+new file mode 100644
+index 0000000..3bc4bd4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/de/pbx.po
+@@ -0,0 +1,699 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-30 18:17+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Erweiterte Einstellungen"
++
++msgid "Available"
++msgstr "Verfügbar"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr "Nur alphanumerische Zeichen, Komma, Punkt und Leerzeichen verwenden"
++
++msgid "Away"
++msgstr "Abwesend"
++
++msgid "Blacklisted Numbers"
++msgstr "Nicht erlaubte Nummern (Blacklist)"
++
++msgid "Call Routing"
++msgstr "Anrufweiterleitung"
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr "Durchwahl Nummern"
++
++msgid "Copy-paste large lists of numbers here."
++msgstr "Hier können per Copy & Paste größere Nummernlisten eingefügt werden."
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr "Wählt Nummern an, für die es keine andere Übereinstimmung gibt"
++
++msgid "Do Not Disturb"
++msgstr "Beschäftigt"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr "Domäne/IP-Adresse/Dynamische Domäne"
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr "Dynamische Liste nicht erlaubter Nummern (Dynamische Blacklist)"
++
++msgid "Email"
++msgstr "E-Mail"
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "Eingehende Anrufe akzeptieren (registrieren via SIP)"
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr "Eingehende Anrufe akzeptieren (Status unten einstellen)"
++
++msgid "Enable Outgoing Calls"
++msgstr "Ausgehende Anrufe aktivieren"
++
++msgid "Enabled"
++msgstr "Aktiv"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++"Geben Sie Telefonnummern ein, von denen Anrufe automatisch zurückgewiesen "
++"werden sollen. Sie sollten die Ländervorwahl und alle führenden Nullen "
++"weglassen, aber experimentieren Sie ruhig, damit Sie auch wirklich alle "
++"Nummern blockieren, die blockiert werden sollen."
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++"Geben SIe diese IP (oder IP:Port) in der Server-/Registrar-Einstellung der "
++"SIP-Geräte an, die Sie NUR local und niemals von einem entfernten Ort "
++"einsetzen werden."
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++"Geben SIe diese IP (oder IP:Port) in der Server-/Registrar-Einstellung der "
++"SIP-Geräte an, die Sie von einem entfernten Ort einsetzen werden (sie "
++"funktionieren auch lokal)."
++
++msgid "External SIP Port"
++msgstr "Externer SIP Port"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++"Hier können Sie für jeden Dienstanbieter, der für eingehende Anrufe "
++"eingerichtet ist, festlegen, welche Nutzer ein Klingelzeichen bei "
++"eingehenden Anrufen erhalten. Ist die Liste leer, klingelt es bei allen "
++"Nutzern, die eingehende Anrufe empfangen dürfen. Ungültige Benutzernamen "
++"werden ohne Fehlermeldung zurückgewiesen. Außerdem überschreibt der Eintrag "
++"eines Benutzernamens an dieser Stelle die evtl. vorhandene Einstellung für "
++"diesen Benutzer, keine eingehenden Anrufe zu erhalten. Auf diese Weise kann "
++"eingestellt werden, dass die Nutzer nur bei bestimmten Dienstanbietern ein "
++"Klingelzeichen erhalten. Einträge in dieser Liste können entweder durch "
++"Leerzeichen getrennt oder als ein Eintrag pro Zeile (Eingabetaste nach jedem "
++"Eintrag) eingegeben werden."
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++"Hier können Sie für jeden Benutzer, der für abgehende Anrufe eingerichtet "
++"ist, festlegen, welche Dienstanbieter verwendet werden dürfen. In der "
++"Voreinstellung dürfen alle Benutzer auch alle Dienstanbieter verwenden. Um "
++"in der Liste unten aufzutauchen, sollte dem Benutzer auf der Seite "
++"\"Benutzerkonten\" erlaubt werden, abgehende Anrufe machen zu dürfen. Geben "
++"Sie VoIP-Dienstanbieter im Format Benutzername@Servername an, wie bereits "
++"oben unter \"Abgehende Anrufe\". Am einfachsten kopieren Sie die "
++"Dienstanbieter von dort und fügen sie hier wieder ein. Ungültige Einträge, "
++"einschließlich nicht für abgehende Anrufe zugelassene Dienstanbieter, werden "
++"ohne Fehlermeldung zurückgewiesen. Einträge in dieser Liste können entweder "
++"durch Leerzeichen getrennt und/oder als ein Eintrag pro Zeile (Eingabetaste "
++"nach jedem Eintrag) eingegeben werden."
++
++msgid "Full Name"
++msgstr "Vollständiger Name"
++
++msgid "General Settings"
++msgstr "Allgemeine Einstellungen"
++
++msgid "Google Accounts"
++msgstr "Google-Konten"
++
++msgid "Google Talk Status"
++msgstr "Status für Google Talk"
++
++msgid "Google Talk Status Message"
++msgstr "Statusbenachrichtigung für Google Talk"
++
++msgid "Google Voice/Talk Accounts"
++msgstr "Google Voice/Talk-Konten"
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++"Hier müssen Sie wenigstens ein SIP-Konto angeben, welches Sie zur Anmeldung "
++"an diesen Dienst nutzen. Verwenden Sie dieses Konto entweder in einem "
++"Adapter für analoges Telefonieren (ATA) oder einer SIP-Software wie "
++"CSipSimple, Linphone, oder Sipdroid auf Ihrem Smartphone, oder Ekiga, "
++"Linphone, oder X-Lite auf Ihrem Computer. In der Voreinstellung klingeln "
++"alle SIP-Konten gleichzeitig, wenn ein Anruf auf eines Ihrer VoIP-Konten "
++"oder Ihre GV-Nummern gemacht wird."
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++"Wenn EInstellen des Servers/Registrars auf %s oder %s bei Ihnen nicht "
++"funktioniert, versuchen Sie die Einstellung %s oder %s und geben Sie die "
++"Portnummer in ein separates Feld für Server/Registrat-Portnummer ein. "
++"Achtung: Einige Geräte haben eine verwirrende Einstellung, die den Port "
++"setzt, von dem die SIP-Anfragen auf dem Gerät selbst herkommen (der Bindungs-"
++"Port). Der Port auf dieser Seite meint NICHT diesen Bindungs-Port, sondern "
++"den Port, an dem der Dienst lauscht."
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++"Wenn Sie stotternden oder stark verzögerten Ton während großer Downloads "
++"haben, sollten Sie QoS einschalten. QoS priorisiert Verkehr von und zu Ihrem "
++"Netzwerk für bestimmte Ports und IP-Adressen mit dem Ergebnis einer besseren "
++"Tonübertragung in unserem Fall. Wenn unten eingeschaltet, wird eine QoS-"
++"Regel automatisch vom PBX eingerichtet, aber Sie müssen die QoS-"
++"Konfigurationsseite (Netzwerk->QoS) aufrufen, um andere kritische QoS-"
++"Einstellungen wie Upload-und Download-Geschwindigkeit vorzunehmen."
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++"Wenn Sie mehr als ein Konto für abgehende Anrufe haben, sollten Sie eine "
++"Liste von Telefonnummern/Vorwahlen in den folgenden Feldern für jeden "
++"aufgeführten Dienstanbieter eintragen. Ungültige Vorwahlen werden ohne "
++"Fehlermeldung entfernt, nur 0-9, X, Z, N, #, *, und + sind gültige Zeichen. "
++"Der Buchstabe X entspricht 0-9, Z entrpricht 1-9, N entspricht 2-9. Zum "
++"Beispiel können Sie 49 eingeben, um Anrufe nach Deutschland über einen "
++"Dienstanbieter zu tätigen. Für Anrufe nach Nordamerika geben Sie 1NXXNXXXXXX "
++"an. Unterstützt ein Dienstanbieter Ortsgespräche, wie im Gebiet 646 von New "
++"York, geben Sie 646NXXXXXX für diesen Anbieter ein. Ein Konto sollte eine "
++"leere Liste behalten, damit Sie darüber standardmäßig Anrufe tätigen können, "
++"wenn keine der Vorwahlen für die anderen Anbieter übereinstimmt. Das System "
++"ersetzt eine leere Liste automatisch mit dem Eintrag, dass dieser Anbieter "
++"alle Vorwahlen unterstützt, die von den anderen Anbietern nicht unterstützt "
++"werden. Seien Sie so spezifisch wie möglich (1NXXNXXXXXX ist besser als 1). "
++"Bitte beachten Sie, dass alle internationalen Vorwahl-Codes (wie 00, 011, "
++"010, 0011) verworfen werden. Einträge können durch Leezeichen getrennt und/"
++"oder einzeln pro Zeile (Abschließen mit Eingabe-Taste) eingegeben werden."
++
++msgid "Incoming Calls"
++msgstr "Eingehende Anrufe"
++
++msgid "Insert QoS Rules"
++msgstr "QoS-Regeln einfügen"
++
++msgid "Makes Outgoing Calls"
++msgstr "Macht ausgehende Anrufe"
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++"ACHTUNG: Es sind keine Konten für Google oder einen SIP-Dienstanbieter "
++"eingerichtet."
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++"ACHTUNG: Es sind keine Konten für Google oder einen SIP-Dienstanbieter für "
++"eingehende Anrufe eingerichtet."
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++"ACHTUNG: Es sind keine Konten für Google oder einen SIP-Dienstanbieter für "
++"abgehende Anrufe eingerichtet."
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr "ACHTUNG: Es sind keine lokalen Benutzerkonten eingerichtet."
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++"ACHTUNG: Es sind keine lokalen Benutzerkonten für abgehende Anrufe "
++"eingerichtet."
++
++msgid "No"
++msgstr "Nein"
++
++msgid "Number of Seconds to Ring"
++msgstr "Dauer des Klingelns in Sekunden"
++
++msgid "Outbound Proxy"
++msgstr "Proxy für ausgehende Verbindungen"
++
++msgid "Outgoing Calls"
++msgstr "Abgehende Anrufe"
++
++msgid "PBX Main Page"
++msgstr "PBX-Hauptseite"
++
++msgid "PBX Service Status"
++msgstr "PBX-Dienststatus"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "Password"
++msgstr "Passwort"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr "Port-Einstellung für SIP-Geräte"
++
++msgid "Providers Used for Outgoing Calls"
++msgstr "Provider für abgehende Anrufe"
++
++msgid "QoS Settings"
++msgstr "QoS Einstellungen"
++
++msgid "RTP Port Range End"
++msgstr "Ende des RTP-Port-Bereichs"
++
++msgid "RTP Port Range Start"
++msgstr "Anfang des RTP-Port-Bereichs"
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++"RTP-Verkehr überträgt die aktuellen Sprachpakete. Dies ist der Anfang des "
++"Port-Bereichs, der für die Einrichtung der RTP-Verbindung verwendet wird. "
++"Normalerweise kann hier die Voreinstellung belassen werden."
++
++msgid "Receives Incoming Calls"
++msgstr "Empfängt eingehende Anrufe"
++
++msgid "Remote Usage"
++msgstr "Benutzung aus der Ferne"
++
++msgid "Rings users enabled for incoming calls"
++msgstr "Für eingehende Anrufe freigeschaltete Nutzer erhalten Klingelzeichen"
++
++msgid "SIP Accounts"
++msgstr "SIP-Konten"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr "SIP-Geräte-/Softphone-Konten"
++
++msgid "SIP Provider Accounts"
++msgstr "SIP-Dienstanbieter-Konten"
++
++msgid "SIP Realm (needed by some providers)"
++msgstr "SIP-Bereich (von manchen Dienstanbietern benötigt)"
++
++msgid "SIP Server/Registrar"
++msgstr "SIP-Server/Registrar"
++
++msgid "SIP Server/Registrar Port"
++msgstr "SIP-Server/Registrar Port"
++
++msgid "Server Setting"
++msgstr "Servereinstellung"
++
++msgid "Server Setting for Local SIP Devices"
++msgstr "Servereinstellung für lokale SIP-Geräte"
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr "Servereinstellung für entfernte SIP-Geräte"
++
++msgid "Service Status"
++msgstr "Dienst-Status"
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++"Stellen Sie ein (in Sekunden), wie lange es bei den Benutzern klingeln soll, "
++"bevor aufgelegt oder zur Voicemail (falls installiert und aktiv) "
++"übergegangen wird. "
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr "Mit Leerzeichen unterteilte Liste gesperrter Nummern"
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++"Geben Sie die Nummern hier einzeln an. Drücken Sie Eingabe, um weitere "
++"Nummern hinzuzufügen."
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++"Die oben angegebene(n) Nummer(n) können für ausgehende Anrufe mit den "
++"Dienstanbietern dieses Nutzers verwendet werden. Ungültige Benutzernamen, "
++"einschließlich Nutzer, die nicht für ausgehende Anrufe freigeschaltet sind, "
++"werden ohne Fehlermeldung verworfen. Bitte überprüfen Sie deshalb, ob der "
++"Eintrag akzeptiert wurde."
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++"Diese Konfigurationsseite erlaubt Ihnen die Einrichtung eines "
++"Telefonsystemdienstes (PBX), der Anrufe über mehrere Google- und SIP-Konten "
++"(wie Sipgate, SipSorcery und Betamax) erlaubt. Sie können diese Konten für "
++"viele SIP-Geräte verwenden. Beachten Sie, dass Google-, SIP- und lokale "
++"Benutzer-Konten in den Abschnitten \"Google-Konten\", \"SIP-Konten\" und "
++"\"Benutzerkonten\" eingerichtet werden. Sie müssen mindestens ein "
++"Benutzerkonto für diesen PBX vorsehen und dann ein SIP-Gerät oder Softphone "
++"für die Benutzung dieses Kontos einrichten, damit Sie Anrufe mit Ihren "
++"Google-/SIP-Konten tätigen oder empfangen können. Wenn Sie mehr als ein "
++"Google- / SIP-Konto eingerichtet haben, sollten Sie auf der Seite "
++"\"Anrufweiterleitung\" einrichten, wie diese Anrufe behandelt werden. Wenn "
++"Sie Ihr PBX von irgendwo auf der Welt nutzen wollen, schauen Sie auf den "
++"Abschnitt \"Benutzung aus der Ferne\" auf der Seite \"Erweiterte "
++"Einstellungen\". "
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++"Dies ist der Name, den der VoIP-Server verwenden wird, um sich selbst bei "
++"der Registrierung beim VoIP-Dienstanbieter zu identifizieren. Einige "
++"Anbieter verlangen, dass dies ein spezieller Begriff ist, der einem Hardware-"
++"SIP-Gerät entspricht."
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++"Hier geben Sie an, welche Google-/SIP-Konten für welche Ländervorwahlen "
++"benutzt werden sollen, welche Nutzer welche Konten verwenden dürfen, wie "
++"Anrufe weitergeleitet werden, welche Nummern mit Password in diesen PBX "
++"kommen, und welche Nummern ausgeschlossen werden."
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++"Hier stellen Sie Ihre Google (Talk und Voice) Konten ein, um sie für "
++"abgehende und ankommende Anrufe nutzen zu können (Voice Chat und Telefon-"
++"Anrufe). Bitte tätigen Sie wenigstens einen Sprach-Anruf mit dem Google-Talk-"
++"Plugin, das über das GMail-Interface zu installieren ist, und melden Sie "
++"sich dann überall aus Ihrem Konto ab. Klicken Sie auf \"Hinzufügen\" um so "
++"viele Konten hinzuzufügen, wie Sie wollen."
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++"Hier stellen Sie Ihre SIP (VoIP) Konten, wie Sipgate, SipSorcery, die "
++"populären Betamax-Anbieter, und alle anderen Anbieter mit SIP-Einstellungen "
++"ein, um sie für abgehende und ankommende Anrufe nutzen zu können (SIP uri "
++"und Telefon-Anrufe). Klicken Sie auf \"Hinzufügen\" um so viele Konten "
++"hinzuzufügen, wie Sie wollen."
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++"Diese Option sollte auf \"Ja\" gesetzt werden, wenn Sie eine DID (reale "
++"Telefonnummer) haben, die mit diesem SIP-Konto verknüpft ist, oder wenn Sie "
++"SIP-Anrufe über diesen Anbieter empfangen wollen."
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++"Dieser Abschnitt enthält Einstellungen, die unter normalen Umständen nicht "
++"geändert werden müssen. Zusätzlich konnen Sie hier Ihr System für die "
++"Verwendung mit entfernten SIP-Geräten einrichten und Probleme bei der "
++"Tonqualität beheben, indem Sie die Festlegung von QoS-Regeln aktivieren."
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++"Verwenden Sie eine vier- bis fünfstellige Nummer als Benutzernamen, wenn Sie "
++"normale Telefone mit ATA an dieses System anschließen (damit diese Namen "
++"über deren Zifferntastatur eingegeben werden können)."
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++"Dieses Konto für abgehende Anrufe verwenden, wie im Abschnitt "
++"\"Anrufweiterleitung\" eingestellt."
++
++msgid "Use this account to make outgoing calls."
++msgstr "Dieses Konto für abgehende Anrufe verwenden."
++
++msgid "User Accounts"
++msgstr "Benutzerkonten"
++
++msgid "User Agent String"
++msgstr "Benutzeridentifikation (User Agent)"
++
++msgid "User Name"
++msgstr "Benutzername"
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr "Verwendet für abgehende Anrufe eingerichtete Dienstanbieter"
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++"Wenn jemand einen Voice-Chat mit Ihrem GTalk-Konto oder die GVoice-Nummer "
++"(falls Sie Google Voice haben) anruft, wird der Anruf an jeden Benutzer "
++"weiter geleitet, der Online ist (mit SIP-Gerät oder Softphone) und den Anruf "
++"empfangen darf. Wenn Sie Google Voice haben, müssen Sie in Ihre GVoice-"
++"Einstellungen gehen und Anrufe zu Google Chat weiter leiten, damit Sie "
++"Anrufe auf Ihre GVoice-Nummer empfangen können. Bei Problemen mit dem "
++"Empfang von Anrufen über GVoice, experimentieren Sie mit der Option "
++"\"Anrufprüfung\" in den GVoice-Einstellungen. Stellen Sie schließlich "
++"sicher, dass kein anderer Client mit diesem Konto Online ist (z.B. Browser "
++"in GMail, Google Talk App mobil oder auf PC), denn das könnte Einfluss haben."
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++"Wenn Ihr Passwort gespeichert wird, verschwindet es aus diesem Feld und wird "
++"zu Ihrem Schutz nicht angezeigt. Ein vorher gespeichertes Passwort wird nur "
++"geändert, wenn Sie ein geändertes Passwort eingeben."
++
++msgid "Yes"
++msgstr "Ja"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++"Sie können hier einen Klarnamen angeben, der als Name des Anrufers erscheint."
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++"Sie können Ihre SIP-Geräte/Softphones mit diesem System auch von einem "
++"entfernten Ort aus benutzen, so lange Ihnen Ihr Internet-Dienstanbieter eine "
++"öffentliche IP-Adresse zuweist. Sie können andere lokale Benutzer kostenlos "
++"anrufen (z.B. andere Analog-Telefon-Adapter (ATA)) und Ihre VoIP-Anbieter "
++"für Anrufe verwenden, als ob Sie am lokalen PBX angeschlossen wären. Nach "
++"der Einrichtung dieses Tabs gehen Sie zu den Benutzereinstellungen zurück "
++"und schauen Sie nach den neuen Einstellungen für Server und Port, die Sie an "
++"den entfernten SIP-Geräten vornehmen müssen. Bitte beachten Sie, dass Sie "
++"NAT/Portweiterleitung auf dem Router/Gateway einrichten müssen, falls dieser "
++"PBX nicht auf Ihrem Router/Gateway läuft. Bitte leiten Sie die unten "
++"angegebenen Ports (SIP-Port und RTP-Bereich) auf die IP-Adresse dieses PBX "
++"weiter."
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++"Ihre PIN verschwindet beim Speichern aus diesem Feld und wird zu Ihrem "
++"Schutz nicht angezeigt. Eine vorher gespeicherte PIN wird nur geändert, wenn "
++"Sie eine geänderte PIN eingeben. Sie können die PIN leer lassen, aber denken "
++"Sie an die Konsequenzen für die Sicherheit."
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++"Ihr Passwort verschwindet beim Speichern und wird zu Ihrem Schutz nicht "
++"angezeigt. Es wird nur geändert, wenn Sie ein anderes Passwort eingeben."
++
++#~ msgid ""
++#~ "Designate numbers that are allowed to call through this system and which "
++#~ "user's privileges it will have."
++#~ msgstr ""
++#~ "Nummern auswählen, die durch dieses System anrufen können, und deren "
++#~ "Benutzerrechte einstellen"
++
++#~ msgid ""
++#~ "Pick a random port number between 6500 and 9500 for the service to listen "
++#~ "on. Do not pick the standard 5060, because it is often subject to brute-"
++#~ "force attacks. When finished, (1) click \"Save and Apply\", and (2) click "
++#~ "the \"Restart VoIP Service\" button above. Finally, (3) look in the \"SIP "
++#~ "Device/Softphone Accounts\" section for updated Server and Port settings "
++#~ "for your SIP Devices/Softphones."
++#~ msgstr ""
++#~ "Wählen Sie eine zufällige Portnummer zwischen 6500 und 9000 für den Dienst "
++#~ "aus. Nehmen Sie nicht die standardmäßige 5060, weil sie oft attackiert wird. "
++#~ "Wenn fertig (1) klicken Sie auf \"Speichern und Anwenden\" und (2) auf \"VoIP-"
++#~ "Dienst neu starten\" oben. Schließlich (3) sehen Sie im Abschnitt \"SIP-Geräte"
++#~ "/Softphone-Konten\" nach aktualisierten Einstellungen für Ihre SIP-"
++#~ "Geräte/Softphones."
++
++#~ msgid ""
++#~ "You can enter your domain name, external IP address, or dynamic domain "
++#~ "name here Please keep in mind that if your IP address is dynamic and it "
++#~ "changes your configuration will become invalid. Hence, it's recommended "
++#~ "to set up Dynamic DNS in this case."
++#~ msgstr ""
++#~ "Sie können Ihren Domänennamen, externe IP-Adresse, oder dynamischen "
++#~ "Domänennamen hier angeben.Bitte beachten Sie, dass Ihre Konfiguration "
++#~ "ungältig wird, wenn Sie eine dynamische IP-Adresse besitzen und sich diese "
++#~ "ändert. Für diesen Fall wird deshalb die Einrichtung von dnamischem DNS "
++#~ "empfohlen."
++
++#~ msgid "Account Status"
++#~ msgstr "Konto-Status"
++
++#~ msgid "Account Status Message"
++#~ msgstr "Konto-Status Meldung"
++
++#~ msgid "Domain Name/Dynamic Domain Name"
++#~ msgstr "DNS Name (auch dynamisch möglich)"
+diff --git a/feeds/luci/applications/luci-app-pbx/po/el/pbx.po b/feeds/luci/applications/luci-app-pbx/po/el/pbx.po
+new file mode 100644
+index 0000000..717e256
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/el/pbx.po
+@@ -0,0 +1,493 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-31 15:41+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: none\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr "Μην Ενοχλείτε"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr "ΕνεÏγοποιημένο"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr "ΠλήÏες Όνομα"
++
++msgid "General Settings"
++msgstr "Γενικές Ρυθμίσεις"
++
++msgid "Google Accounts"
++msgstr "ΛογαÏιασμοί Google"
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr "ΛογαÏιασμοί Google Voice/Talk"
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr "ΕισεÏχόμενες Κλήσεις"
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr "Όχι"
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr "ΕξεÏχόμενες Κλήσεις"
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "Password"
++msgstr "Κωδικός Ï€Ïόσβασης"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr "ΛογαÏιασμοί SIP"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++#~ msgid "Account Status"
++#~ msgstr "Κατάσταση ΛογαÏιασμοÏ"
++
++#~ msgid "Account Status Message"
++#~ msgstr "Μήνυμα Κατάστασης ΛογαÏιασμοÏ"
+diff --git a/feeds/luci/applications/luci-app-pbx/po/en/pbx.po b/feeds/luci/applications/luci-app-pbx/po/en/pbx.po
+new file mode 100644
+index 0000000..8b995e1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/en/pbx.po
+@@ -0,0 +1,502 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr "Advanced Settings"
++
++msgid "Available"
++msgstr "Available"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++
++msgid "Away"
++msgstr "Away"
++
++msgid "Blacklisted Numbers"
++msgstr "Blacklisted Numbers"
++
++msgid "Call Routing"
++msgstr "Call Routing"
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr "Call-through Numbers"
++
++msgid "Copy-paste large lists of numbers here."
++msgstr "Copy-paste large lists of numbers here."
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr "Do Not Disturb"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr "Dynamic List of Blacklisted Numbers"
++
++msgid "Email"
++msgstr "Email"
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "Enable Incoming Calls (Register via SIP)"
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr "Enable Outgoing Calls"
++
++msgid "Enabled"
++msgstr "Enabled"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr "External SIP Port"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr "Full Name"
++
++msgid "General Settings"
++msgstr "General Settings"
++
++msgid "Google Accounts"
++msgstr "Google Accounts"
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr "Google Voice/Talk Accounts"
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr "Incoming Calls"
++
++msgid "Insert QoS Rules"
++msgstr "Insert QoS Rules"
++
++msgid "Makes Outgoing Calls"
++msgstr "Makes Outgoing Calls"
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr "No"
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr "Outbound Proxy"
++
++msgid "Outgoing Calls"
++msgstr "Outgoing Calls"
++
++msgid "PBX Main Page"
++msgstr "PBX Main Page"
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "Password"
++msgstr "Password"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr "Port Setting for SIP Devices"
++
++msgid "Providers Used for Outgoing Calls"
++msgstr "Providers Used for Outgoing Calls"
++
++msgid "QoS Settings"
++msgstr "QoS Settings"
++
++msgid "RTP Port Range End"
++msgstr "RTP Port Range End"
++
++msgid "RTP Port Range Start"
++msgstr "RTP Port Range Start"
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr "Receives Incoming Calls"
++
++msgid "Remote Usage"
++msgstr "Remote Usage"
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr "SIP Accounts"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr "SIP Device/Softphone Accounts"
++
++msgid "SIP Provider Accounts"
++msgstr "SIP Provider Accounts"
++
++msgid "SIP Realm (needed by some providers)"
++msgstr "SIP Realm (needed by some providers)"
++
++msgid "SIP Server/Registrar"
++msgstr "SIP Server/Registrar"
++
++msgid "SIP Server/Registrar Port"
++msgstr "SIP Server/Registrar Port"
++
++msgid "Server Setting"
++msgstr "Server Setting"
++
++msgid "Server Setting for Local SIP Devices"
++msgstr "Server Setting for Local SIP Devices"
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr "Server Setting for Remote SIP Devices"
++
++msgid "Service Status"
++msgstr "Service Status"
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr "Space-Separated List of Blacklisted Numbers"
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr "Specify numbers individually here. Press enter to add more numbers."
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++
++msgid "Use this account to make outgoing calls."
++msgstr "Use this account to make outgoing calls."
++
++msgid "User Accounts"
++msgstr "User Accounts"
++
++msgid "User Agent String"
++msgstr "User Agent String"
++
++msgid "User Name"
++msgstr "User Name"
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr "Yes"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr "You can specify a real name to show up in the Caller ID here."
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++#~ msgid "Account Status"
++#~ msgstr "Account Status"
++
++#~ msgid "Account Status Message"
++#~ msgstr "Account Status Message"
++
++#~ msgid "Domain Name/Dynamic Domain Name"
++#~ msgstr "Domain Name/Dynamic Domain Name"
++
++#~ msgid "Enable Incoming Calls (See Status, Message below)"
++#~ msgstr "Enable Incoming Calls (See Status, Message below)"
++
++#~ msgid "Service Control and Connection Status"
++#~ msgstr "Service Control and Connection Status"
+diff --git a/feeds/luci/applications/luci-app-pbx/po/es/pbx.po b/feeds/luci/applications/luci-app-pbx/po/es/pbx.po
+new file mode 100644
+index 0000000..8071b61
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/es/pbx.po
+@@ -0,0 +1,677 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-15 13:15+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Configuración avanzada"
++
++msgid "Available"
++msgstr "Disponible"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr "Usar sólo caracteres alfanuméricos, espacio, coma y punto."
++
++msgid "Away"
++msgstr "No disponible"
++
++msgid "Blacklisted Numbers"
++msgstr "Lista negra"
++
++msgid "Call Routing"
++msgstr "Enrutado de llamadas"
++
++msgid "Call-back Numbers"
++msgstr "Números de call-back"
++
++msgid "Call-back Provider"
++msgstr "Proveedor de call-back"
++
++msgid "Call-through Numbers"
++msgstr "Números call-through"
++
++msgid "Copy-paste large lists of numbers here."
++msgstr "Pegue aquí grandes listas de números."
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++"Listar los números a los que se permitirá llamar desde este sistema y qué "
++"privilegios de usuario tendrán."
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++"Listar los números a los que el sistema colgará y volverá a llamar, qué "
++"proveedor se usará para llamarles y qué privilegios de usuario se les dará."
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr "Marca el resto de números en cualquier lugar"
++
++msgid "Do Not Disturb"
++msgstr "No molestar"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr "Dominio/Dirección IP/Dominio dinámico"
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr "Lista dinámica de números en lista negra"
++
++msgid "Email"
++msgstr "e-mail"
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "Permitir llamadas entrantes (registrar vía SIP)"
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr "Permitir llamadas entrantes (ver estado abajo)"
++
++msgid "Enable Outgoing Calls"
++msgstr "Permitir llamadas salientes"
++
++msgid "Enabled"
++msgstr "Activado"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++"Proveedor VoIP para callbacks en formato nombredeusuario@algun.nombre.host, "
++"tal y como se detalla arriba en \"Llamadas salientes\". Puede copiar y pegar "
++"los proveedores desde ahí. Las entradas no válidas, incluyendo a proveedores "
++"no habilitados para llamadas saliente, serán rechazadas sin mostrar aviso."
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++"Números de teléfono de los que se reclina la llamada automáticamente. Es "
++"posible que tenga que omitir el código de país y ceros precedentes, pero "
++"experimente para asegurarse que bloquea los números correctamente."
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++"Ponga esta IP (o IP:puerto) en el parámetro Servidor/Registrador de los "
++"dispositivos SIP que usará SOLO localmente y nunca desde una posición remota."
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++"Ponga este nombre de máquina en el parámetro Servidor/Registrador de los "
++"dispositivos SIP que usará desde posiciones remotas (también vale "
++"localmente)."
++
++msgid "External SIP Port"
++msgstr "Puerto externo SIP"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++"Para cada proveedor al que se habilita a hacer llamadas entrantes puede "
++"restringir a qué usuarios llamar. Si se deja vacío el sistema indicará que "
++"llamará a todos los usuarios que puedan recibir llamadas entrantes. Los "
++"nombres de usuario no válidos se rechazarán sin aviso. Estos nombres de "
++"usuario hacen ignorar la configuración de usuario de no recibir llamadas. De "
++"esta manera puede hacer que a ciertos usuarios sólo les llamen ciertos "
++"proveedores. Puede separar los nombres con espacios o poniéndolos en líneas "
++"diferentes."
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++"Para cada usuario habilitado a hacer llamadas salientes puede restringir qué "
++"proveedores usar. Por defecto todos los usuarios pueden usar a todos los "
++"proveedores. Para mostrarse en la lista el usuario debe poder hacer llamadas "
++"salientes (ver página \"Cuentas de usuario\"). Ponga los proveedores en "
++"formato username@some.host.name igual que se listan en \"Llamadas salientes"
++"\" arriba. Los nombres no válidos se rechazarán sin aviso.Puede separar los "
++"nombres con espacios o poniéndolos en líneas diferentes."
++
++msgid "Full Name"
++msgstr "Nombre completo"
++
++msgid "General Settings"
++msgstr "Configuración general"
++
++msgid "Google Accounts"
++msgstr "Cuentas en google"
++
++msgid "Google Talk Status"
++msgstr "Estado de Google Talk"
++
++msgid "Google Talk Status Message"
++msgstr "Mensaje de estado de Google Talk"
++
++msgid "Google Voice/Talk Accounts"
++msgstr "Cuentas Google Voice/Talk"
++
++msgid "Hang-up Delay"
++msgstr "Retraso para descolgar"
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++"Configure una cuenta SIP que usará para conectar con este servicio. Úsela "
++"tanpo en un adaptador de telefonía analógico (ATA) o en un programa SIP como "
++"CSipSimple, Linphone, o Sipdroid para smartphones, o Ekiga, Linphone, o X-"
++"Lite para ordenadores. Por defecto, todas las cuentas SIP sonarán a la vez "
++"si se hace una llamada desde una de las cuentas de su proveedor de VoIP o "
++"números GV."
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++"Cuánto esperar antes de descolgar. Si el proveedor que usas para marcar "
++"automáticamente desvía a un correo de voz puedes ajustar este valor con un "
++"retraso que permitirá descolgar antes de que se desvíe la llamada y se "
++"facture."
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++"Si la configuración Servidor/Registrador en %s o %s no le funciona, prueba a "
++"poner %s o %s e introduzca este número de puerto en un campo separado que "
++"especifique el número de puerto del Servidor/Registrador. Algunos "
++"dispositivos tienen una configuración extraña que muestra este puerto desde "
++"el que el SIP origina peticiones en el mismo dispositivo SIP (el puerto "
++"asociado). El puerto que está configurando aquí NO es este puerto asociado "
++"sino el puerto en el que el servicio escucha."
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++"Si nota saltos o retrasos en el audio mientras realiza descargas puede "
++"querer activar QoS. QoS prioriza el tráfico a y desde su red para ciertos "
++"puertos y direcciones IP mejorando la latencia y el rendimiento del sonido "
++"en dicho caso. Al activarlo el PBX creará una regla QoS para este servicio, "
++"pero deberá rellenar en la página de configuración de QoS (Red/QoS) otros "
++"parámetros necesarios como la velocidad de subida y la de bajada."
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++"Si tiene más de una cuenta para hacer llamadas salientes, debe introducir "
++"una lista de números de teléfono y/o prefijos para cada proveedor. Los "
++"prefijos no válidos se rechazarán sin aviso y solo son caracteres válidos "
++"0-9, X, Z, N, #, *, y +. La letra X equivale a 0-9, Z a 1-9 y N a 2-9. Por "
++"ejemplo para hacer llamadas a Alemania con su proveedor debe introducir 49. "
++"Para hacer llamadas a Estados Unidos 1NXXNXXXXXX. Si uno de sus proveedores "
++"puede hacer llamadas locales a un código de área como el 646 de Nueva York "
++"debe introducir 646NXXXXXX para ese proveedor. Debería dehar una cuenta con "
++"una lista vacía para que haga las llamadas por defecto en caso de que ningún "
++"prefijo encaje. El sistema reemplazará automáticamente la lista vacía con el "
++"mensaje de que el proveedor marca todos los números que no estén en los "
++"prefijos de otros proveedores. Sea todo lo específico que pueda (ej. "
++"1NXXNXXXXXX es mejor que 1). Todos los códigos internaciones de marcado se "
++"descartan (ej. 00, 011, 010, 0011). Las entradas pueden ser una lista "
++"separada por espacios y/o cambios de línea."
++
++msgid "Incoming Calls"
++msgstr "Llamadas entrantes"
++
++msgid "Insert QoS Rules"
++msgstr "Reglas QoS"
++
++msgid "Makes Outgoing Calls"
++msgstr "Realizar llamadas salientes"
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr "NOTA: Sin cuentas configuradas de Google o porveedor SIP."
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++"NOTA: Sin cuentas configuradas de Google o porveedor SIP para llamadas "
++"entrantes."
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++"NOTA: Sin cuentas configuradas de Google o porveedor SIP para llamadas "
++"salientes."
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr "NOTA: Sin cuentas locales configuradas."
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr "NOTA: Sin cuentas locales habilitadas para llamadas saientes."
++
++msgid "No"
++msgstr "No"
++
++msgid "Number of Seconds to Ring"
++msgstr "Número de segundos a sonar"
++
++msgid "Outbound Proxy"
++msgstr "Proxy saliente"
++
++msgid "Outgoing Calls"
++msgstr "Llamadas salientes"
++
++msgid "PBX Main Page"
++msgstr "Página principal de PBX"
++
++msgid "PBX Service Status"
++msgstr "Estado del servicio PBX"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "Password"
++msgstr "Contraseña"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++"Escoge un número de puerto aleatorio entre 6500 y 9500 para el servicio. No "
++"elijas el estándar 5060 ya que es objeto, a menudo, de ataques por fuerza "
++"bruta. Cuando hayas terminado pulsa en \"Salvar y aplicar\" y busca en la "
++"sección \"Cuentas SIP del dispositivo/softphone\" el puerto actual para tus "
++"dispositivos/softphones SIP."
++
++msgid "Port Setting for SIP Devices"
++msgstr "Configuración de puerto para dispositivos SIP"
++
++msgid "Providers Used for Outgoing Calls"
++msgstr "Proveedores usados para llamadas salientess"
++
++msgid "QoS Settings"
++msgstr "Configuración de QoS"
++
++msgid "RTP Port Range End"
++msgstr "Fin del rango de puertos RTP"
++
++msgid "RTP Port Range Start"
++msgstr "Inicio del rango de puertos RTP"
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++"El tráfico RTP es el que lleva los paquetes de voz. Este es el inicio del "
++"rango de puertos que se usará para comunicaciones RTP. Suele ser correcto "
++"dejar el valor por defecto."
++
++msgid "Receives Incoming Calls"
++msgstr "Recibe llamadas entrantes"
++
++msgid "Remote Usage"
++msgstr "Uso remoto"
++
++msgid "Rings users enabled for incoming calls"
++msgstr "Llama a usuarios habilitados a recibir llamadas"
++
++msgid "SIP Accounts"
++msgstr "Cuentas SIP"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr "Dispositivo SIP/Cuentas Softphone"
++
++msgid "SIP Provider Accounts"
++msgstr "Cuentas del proveedor SIP"
++
++msgid "SIP Realm (needed by some providers)"
++msgstr "Ãmbito SIP (necesario para algunos proveedores)"
++
++msgid "SIP Server/Registrar"
++msgstr "Servidor/Registrador del SIP"
++
++msgid "SIP Server/Registrar Port"
++msgstr "Puerto del Servidor/Registrador del SIP"
++
++msgid "Server Setting"
++msgstr "Configuración del servidor"
++
++msgid "Server Setting for Local SIP Devices"
++msgstr "Dispositivos SIP locales"
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr "Dispositivos SIP remotos"
++
++msgid "Service Status"
++msgstr "Estado del servicio"
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++"Segundos que se llamará a los usuarios antes de colgar o pasar a correo voz "
++"(si el correo voz está instalado y habilitado)."
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr "Lista negra (separar números con espacios)"
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr "Números individuales. Pulse enter para añadir más."
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++"Especifica números individualmente. Pulsa enter para añadir más. Tendrás que "
++"experimentar con qué códigos de país y área necesitas añadir al número."
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++"Estos números podrán llamar con los proveedores de este usuario. Los nombres "
++"de usuario no válidos se descartan sin aviso. Por favor, verifique que los "
++"números se aceptan."
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++"Aquí puede configurar un servicio de sistema telefónico (PBX) que le "
++"permitirá hacer llamadas por múltiples cuentas Google y SIP (como Sipgate, "
++"SipSorcery, and Betamax) y compartirlas entre muchos dispositivos SIP. Tenga "
++"en cuenta que las cuentas Google, SIP y locales deben configurarse en "
++"subsecciones diferentes. Debe añadir al menos una cuenta de usuarioa este "
++"PBX y configurar un dispositivo SIP o softphone para usarla para recibir las "
++"llamadas de sus cuentas Google/SIP. Configurar múltiples usuarios le "
++"permitirá hacer llamadas gratuitas entre los usuarios y compartir las "
++"cuentas Google/SIP configuradas. Si tiene más de una cuenta Google/SIP "
++"configurada tendrá que configurar cómo se enrutan en la página \"Enrutado de "
++"llamadas\". Si está interesado en usar su PBX desde cualquier sitio del "
++"mundo puede visitar la sección \"Uso remoto\" en la página \"Configuración "
++"avanzada\"."
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++"Nombre del servidor VoIP que usará para identificarse cuando se registre en "
++"proveedores de VoIP (SIP). Algunos requieres que sea una cadena específica a "
++"una dispositivo hardware."
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++"Indique las cuentas Google/SIP que usará para llamar a qué códigos de país/"
++"zona, qué usuarios pueden usuarios pueden usar qué cuentas SIP/Google y cómo "
++"se enrutan las llamadas entrantes, qué números pueden entrar en esta PBX con "
++"una contraseña y qué números están en lista negra."
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++"Configure sus cuentas Google (Talk y Voz) para empezar a usarlas para hacer "
++"y recibir llamadas (chat de voz y teléfono real). Haga al menos una llamada "
++"de voz con el plugin de Google Talk (instalable desde GMail) y desconéctese "
++"de la cuenta en cualquier otro sitio."
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++"Configure sus cuentas SIP (VoIP) como Sipgate, SipSorcery, los popular "
++"proveedores Betamax y cualquier otro proveedor para empezar a usarlos para "
++"hacer y recibir llamadas (uri SIP y teléfono real)."
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++"Debería ser \"Sí\" si tiene un DID (teléfono real) asociado a esta cuenta "
++"SIP o quiere recibir llamads uri SIP de este proveedor."
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++"Algunos de estos parámetros no suele ser necesario cambiarlos. Además puede "
++"configurar su sistema para usar con dispositivos SIP remotos y resolver "
++"problemas de calidad de llamada habilitando algunas reglas QoS."
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++"Use nombre de usuario númericos (cuatro o cinco dígitos) si conecta a "
++"teléfonos normales con ATAs a este sistema (para que puedan marcar números "
++"de usuario)."
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++"Cuenta para llamadas salientes como se configura en la sección \"Enrutado de "
++"llamadas\"."
++
++msgid "Use this account to make outgoing calls."
++msgstr "Cuenta para llamadas salientes."
++
++msgid "User Accounts"
++msgstr "Cuentas de usuario"
++
++msgid "User Agent String"
++msgstr "Cadena \"User Agent\""
++
++msgid "User Name"
++msgstr "Nombre de usuario"
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr "Usar proveedores habilitados para llamadas salientes"
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++"Cuando alguien inicia un chat de voz con su cuenta de GTalk o llame al "
++"número de GVoice (si tiene Google Voice) la llamada se transferirá a "
++"cualquier usuario que esté conectado (registrado usando un dispositivo SIP o "
++"softphone) y se le permitirá recibir la llamada. Si tiene Google Voice debe "
++"ir a la configuración de GVoice y traspasar las llamadas a Google chat para "
++"recibir las hechas a si número de GVoice. Si tiene problemas recibiendo "
++"llamadas de GVoice pruebe con la opción \"Call Screening\" en la "
++"configuración de GVoice. Asegúrese de que ningún otro cliente esté conectado "
++"con esta cuenta (navegador en gmail, o una aplicación para móvil o "
++"escritorio) ya que podría interferir."
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++"Cuando se salve su contraseña desaparece de este campo y no se muestra para "
++"su seguridad. La contraseña sólo se podrá cambiar si introduce un valor "
++"diferente al salvado."
++
++msgid "Yes"
++msgstr "Sí"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++"Puedes introducir el nombre de dominio, dirección IP external o nombre "
++"dinámino aquí. Lo mejor es introducir una dirección IP estática. Si la "
++"dirección es dinámica la configuración sería inválida cuando cambiase. En "
++"estos casos es recomendable configurar Dynamic DNS e introducir tu nombre de "
++"host Dynamic DNS. Puedes instalar y configurar Dynamic DNS con el paquete "
++"luci-app-ddns."
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr "Nombre real a mostrar en el \"Caller ID\"."
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++"Puede usar sus dispositivos SIP/softphones con este sistema desde una "
++"ubicación remota mientras su proveedor de internet le dé una dirección IP "
++"pública. Podrá llamar a usuarios locales gratis (ej. otros adaptadores de "
++"teléfonos analógicos) y podrá usar sus proveedores de VoIP para hacer "
++"llamadas como si estuviese en su PBX local. Tras configurar esta pestaña "
++"vuelva a la configuración de usuarios y veo el nuevo servidor y puerto que "
++"debe configurar en sus dispositivos SIP remotos. Tenga en cuenta que si este "
++"PBX no funciona en su router/pasarela, tendrá que configurar el traspaso de "
++"puertos (NAT) en su router/pasarela. Traspase los puertos indicados (Puerto "
++"SIP y rango RTP) hacia la dirección IP del dispositivo en que corre esta PBX."
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++"Su PIN desaparecerá cuando se salve para su protección. Se cambiará solo "
++"cuando introduzca un valor diferente al salvado. No se puede dejar el PIN "
++"vacío."
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++"Su contraseña desaparecerá cuando se salve para su protección. Sólo se puede "
++"cambiar si entra un valor diferente al salvado."
++
++#~ msgid ""
++#~ "Designate numbers that are allowed to call through this system and which "
++#~ "user's privileges it will have."
++#~ msgstr ""
++#~ "Números a los que se permite llamar por este sistema y privilegios de "
++#~ "usuario."
++
++#~ msgid ""
++#~ "Pick a random port number between 6500 and 9500 for the service to listen "
++#~ "on. Do not pick the standard 5060, because it is often subject to brute-"
++#~ "force attacks. When finished, (1) click \"Save and Apply\", and (2) click "
++#~ "the \"Restart VoIP Service\" button above. Finally, (3) look in the \"SIP "
++#~ "Device/Softphone Accounts\" section for updated Server and Port settings "
++#~ "for your SIP Devices/Softphones."
++#~ msgstr ""
++#~ "Puerto aleatorio entre 6500 y 9500 en el que escuche el servicio. No elija "
++#~ "el estándar 5060 porque es susceptible de ataques por fuerza bruta. Cuando "
++#~ "termine (1) pulsa \"Salvar y aplicar\" y (2) pulse \"Rearrancar servicio VoIP\". "
++#~ "Finalmente (3) busque en la sección \"Dispositivo SIP/Cuentas softphone\" la "
++#~ "configuración del puerto."
++
++#~ msgid ""
++#~ "You can enter your domain name, external IP address, or dynamic domain "
++#~ "name here Please keep in mind that if your IP address is dynamic and it "
++#~ "changes your configuration will become invalid. Hence, it's recommended "
++#~ "to set up Dynamic DNS in this case."
++#~ msgstr ""
++#~ "Nombre de dominio, dirección IP externa o nombre de dominio dinámico. Si su "
++#~ "dirección IP es dinámica y cambia su configuración podría resultar no "
++#~ "válida. Se recomienda el uso de DNS dinámico en estos casos."
+diff --git a/feeds/luci/applications/luci-app-pbx/po/fr/pbx.po b/feeds/luci/applications/luci-app-pbx/po/fr/pbx.po
+new file mode 100644
+index 0000000..971a696
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/fr/pbx.po
+@@ -0,0 +1,484 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Google Accounts"
++msgstr ""
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/he/pbx.po b/feeds/luci/applications/luci-app-pbx/po/he/pbx.po
+new file mode 100644
+index 0000000..2a45821
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/he/pbx.po
+@@ -0,0 +1,484 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Google Accounts"
++msgstr ""
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/hu/pbx.po b/feeds/luci/applications/luci-app-pbx/po/hu/pbx.po
+new file mode 100644
+index 0000000..2a45821
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/hu/pbx.po
+@@ -0,0 +1,484 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Google Accounts"
++msgstr ""
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/it/pbx.po b/feeds/luci/applications/luci-app-pbx/po/it/pbx.po
+new file mode 100644
+index 0000000..6da8e45
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/it/pbx.po
+@@ -0,0 +1,487 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-12-15 19:31+0200\n"
++"Last-Translator: claudyus <claudyus84@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Opzioni avanzate"
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Google Accounts"
++msgstr ""
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/ja/pbx.po b/feeds/luci/applications/luci-app-pbx/po/ja/pbx.po
+new file mode 100644
+index 0000000..76199f4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/ja/pbx.po
+@@ -0,0 +1,493 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-21 07:57+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: none\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: Pootle 2.0.4\n"
++
++msgid "Advanced Settings"
++msgstr "詳細設定"
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr "Eメール"
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr "外部SIPãƒãƒ¼ãƒˆ"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr ""
++
++msgid "General Settings"
++msgstr "基本設定"
++
++msgid "Google Accounts"
++msgstr "Google アカウント"
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr "Google Voice/Talk アカウント"
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr "QoS ルール設定を有効ã«ã™ã‚‹"
++
++msgid "Makes Outgoing Calls"
++msgstr "発信を許å¯ã™ã‚‹"
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr "ã„ã„ãˆ"
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr "PBX メインページ"
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "Password"
++msgstr "パスワード"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr "QoS 設定"
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr "å—信を許å¯ã™ã‚‹"
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr "SIP アカウント"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr "SIP デãƒã‚¤ã‚¹/ソフトフォン アカウント"
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr "サーãƒãƒ¼è¨­å®š"
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr "ユーザーエージェントå"
++
++msgid "User Name"
++msgstr "ユーザーå"
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr "ã¯ã„"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++#~ msgid "Account Status"
++#~ msgstr "アカウントã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹"
++
++#~ msgid "Account Status Message"
++#~ msgstr "アカウントステータス・メッセージ"
+diff --git a/feeds/luci/applications/luci-app-pbx/po/ms/pbx.po b/feeds/luci/applications/luci-app-pbx/po/ms/pbx.po
+new file mode 100644
+index 0000000..23403f2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/ms/pbx.po
+@@ -0,0 +1,483 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Google Accounts"
++msgstr ""
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/no/pbx.po b/feeds/luci/applications/luci-app-pbx/po/no/pbx.po
+new file mode 100644
+index 0000000..2a45821
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/no/pbx.po
+@@ -0,0 +1,484 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Google Accounts"
++msgstr ""
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/pl/pbx.po b/feeds/luci/applications/luci-app-pbx/po/pl/pbx.po
+new file mode 100644
+index 0000000..4e80a45
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/pl/pbx.po
+@@ -0,0 +1,508 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-05 04:37+0200\n"
++"Last-Translator: piosl <sleczek.piotr@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Ustawienia zaawansowane"
++
++msgid "Available"
++msgstr "Dostępny"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr "Unikaj znaków innych niż alfanumeryczne, spacja, przecinek i kropka."
++
++msgid "Away"
++msgstr "Oddalony"
++
++msgid "Blacklisted Numbers"
++msgstr "Numery na czarnej liście"
++
++msgid "Call Routing"
++msgstr "Przekierowanie połączeń"
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++# Chodzi tu o numery, przez które dzwoni się, aby obniżyć koszta połączeń zagranicznych. Jeśli ktoś ma pomysł na lepsze tłumaczenie, proszę zmienić. W sieci nie znalazłem.
++msgid "Call-through Numbers"
++msgstr "Numery pośredniczące"
++
++msgid "Copy-paste large lists of numbers here."
++msgstr "Wklej tu wielkie listy numerów."
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr "Nie przeszkadzać"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr "Domena/adres IP/dynamiczna domena"
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr "Dynamiczna czarna lista numerów"
++
++msgid "Email"
++msgstr "E-mail"
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "Włącz połączenia przychodzące (rejestruj przez SIP)"
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr "Włącz połączenia przychodzące (zobacz status poniżej)"
++
++msgid "Enable Outgoing Calls"
++msgstr "Włącz połączenia wychodzące"
++
++msgid "Enabled"
++msgstr "WÅ‚Ä…czone"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++"Podaj numery telefonów, które powinny być automatycznie odrzucane. "
++"Prawdopodobnie powinieneś pominąć numer kierunkowy kraju i zera z przodu, "
++"ale samemu to przetestuj, aby upewnić się, że blokowanie działa prawidłowo "
++"dla Twojego położenia."
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++"Podaj to IP (lub parę IP:port) w ustawieniach serwera/rejestratora urządzeń "
++"SIP których bÄ™dziesz używać WYÅÄ„CZNIE lokalnie i nigdy z zewnÄ…trz."
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++"Podaj tÄ™ nazwÄ™ hosta (lub parÄ™ nazwa hosta:port) w ustawieniach serwera/"
++"rejestratora urządzeń SIP których będziesz używać z zewnątrz (będą też "
++"działać lokalnie)."
++
++msgid "External SIP Port"
++msgstr "Zewnętrzny port SIP"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++"Dla każdego użytkownika z prawem wykonywania połączeń wychodzących możesz "
++"ograniczyć których operatorów mogą używać do tych połączeń. Domyślnie każdy "
++"użytkownik może używać dowolnego operatora. Użytkownik musi mieć prawo "
++"wykonywania połączeń wychodzących ustawione na stronie \"Konta użytkowników"
++"\", aby pojawić się na poniższej liście. Podaj operatorów VoIP w formacie "
++"nazwa.użytkownika@jakaś.nazwa.hosta, tak jak są wypisani w \"Połączeniach "
++"wychodzÄ…cych\" powyżej. Åatwiej jest skopiować powyższych operatorów. "
++"Nieprawidłowe wpisy, włącznie z operatorami bez prawa do połączeń "
++"wychodzących, będą odrzucani bez komunikatów. Wpisy mogą być rozdzielone "
++"spacjami albo podane po jednym w wierszu."
++
++msgid "Full Name"
++msgstr "Pełne imię i nazwisko"
++
++msgid "General Settings"
++msgstr "Ustawienia ogólne"
++
++msgid "Google Accounts"
++msgstr "Konta Google"
++
++msgid "Google Talk Status"
++msgstr "Status Google Talk"
++
++msgid "Google Talk Status Message"
++msgstr "Opis Google Talk"
++
++msgid "Google Voice/Talk Accounts"
++msgstr "Konta Google Voice/Talk"
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr "Połączenia przychodzące"
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/pt-br/pbx.po b/feeds/luci/applications/luci-app-pbx/po/pt-br/pbx.po
+new file mode 100644
+index 0000000..fd93e4f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/pt-br/pbx.po
+@@ -0,0 +1,744 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-08-04 09:00+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Configurações Avançadas"
++
++msgid "Available"
++msgstr "Disponível"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++"Evite usar qualquer carácter que não seja um alfanumérico, espaço, vírgula "
++"ou ponto."
++
++msgid "Away"
++msgstr "Ausente"
++
++msgid "Blacklisted Numbers"
++msgstr "Números na Lista Negra"
++
++msgid "Call Routing"
++msgstr "Roteamento de Chamada"
++
++# 20140630: edersg: tradução
++msgid "Call-back Numbers"
++msgstr "Voltar a discar os números"
++
++# 20140630: edersg: tradução
++msgid "Call-back Provider"
++msgstr "Voltar a chamar o provedor"
++
++msgid "Call-through Numbers"
++msgstr "Números de Ligação Direta"
++
++msgid "Copy-paste large lists of numbers here."
++msgstr "Copie e cole aqui listas de números extensas."
++
++# 20140630: edersg: tradução
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++"Designar os números que estão autorizados a chamar por este sistema e quais "
++"privilégios do usuário eles terão."
++
++# 20140630: edersg: tradução
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++"Designar números para os quais o sistema irá desligar e ligar de volta, qual "
++"provedor será utilizado para chamá-los, e quais privilégios do usuário "
++"serão concedidos a eles."
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr "Disca números que não casam em qualquer lugar."
++
++msgid "Do Not Disturb"
++msgstr "Não Perturbe"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr "Domínio/Endereço IP/Domínio Dinâmico"
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr "Lista Dinâmica dos Números da Lista Negra"
++
++msgid "Email"
++msgstr "Email"
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "Habilitar Chamadas Recebidas (Registrar pelo SIP)"
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr "Habilitar Chamadas Recebidas (defina o Estado abaixo)"
++
++msgid "Enable Outgoing Calls"
++msgstr "Habilitar Chamadas para Fora"
++
++msgid "Enabled"
++msgstr "Habilitado"
++
++# 20140630: edersg: tradução
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++"Digite um provedor VoIP para utilizar para voltar a chamada no formato "
++"username@some.host.name conforme listado acima em \"Chamadas Originadas\". É "
++"mais fácil copiar e colar os provedores. As entradas inválidas, incluindo "
++"provedores não habilitados para chamadas de saída, serão rejeitados em "
++"silêncio."
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++"Entre com os números de telefone que você deseja rejeitar automaticamente. "
++"Você pode omitir o código do país e qualquer zeros no início, mas, por "
++"favor, teste para ter certeza que você está bloqueando da área desejada com "
++"sucesso."
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++"Entre este endereço IP (ou IP:porta) na configuração de servidor/registrador "
++"dos seus dispositivos SIP que você irá usar SOMENTE localmente e nunca de um "
++"local remoto."
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++"Entre com o nome do equipamento (ou equipamento:porta) na configuração de "
++"servidor/Registrar do seus dispositivos SIP que você irá usar de um local "
++"remoto (eles também funcionarão localmente)."
++
++msgid "External SIP Port"
++msgstr "Porta SIP Externa"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++"Para cada provedor habilitado para receber chamadas, aqui você pode "
++"restringir quais usuários tocarão quando receber chamadas. Se a lista "
++"estiver vazia, o sistema indicará que todos os usuários com recepção de "
++"chamadas habilitada tocarão. Nome de usuários inválidos serão rejeitados "
++"silenciosamente. Além disto, entrar com um nome de usuário aqui sobrescreve "
++"a configuração do usuário para não receber chamadas. Desta forma, você pode "
++"fazer com que alguns usuários toquem somente para alguns provedores "
++"específicos. As entradas podem ser inseridas usando uma lista separada por "
++"espaço ou um por nova linha."
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++"Para cada usuário habilitado para realizar chamadas externas, você pode "
++"restringir quais provedores o usuário poderá usar. Por padrão, todos os "
++"usuários podem usar todos os provedores. Para aparecer na lista abaixo, o "
++"usuário deve estar habilitado para realizar chamadas externas na página de "
++"\"Contas de Usuários\". Entre com os provedores de VoIP no formato "
++"usuário@algum.nome.de.equipamento, como listado em \"Chamadas Efetuadas\" "
++"abaixo. É mais fácil copiar e colar os provedores da lista abaixo. Entradas "
++"inválidas, includindo provedores não habilitados para chamadas externas, "
++"serão rejeitadas silenciosamente. As entradas podem ser inseridas usando uma "
++"lista separada por espaço ou um por nova linha."
++
++msgid "Full Name"
++msgstr "Nome Completo"
++
++msgid "General Settings"
++msgstr "Configurações Gerais"
++
++msgid "Google Accounts"
++msgstr "Contas do Google"
++
++msgid "Google Talk Status"
++msgstr "Estado do Google Talk"
++
++msgid "Google Talk Status Message"
++msgstr "Mensagem de Estado do Google Talk"
++
++msgid "Google Voice/Talk Accounts"
++msgstr "Contas do Google Voice/Talk"
++
++# 20140630: edersg: tradução
++msgid "Hang-up Delay"
++msgstr "Atraso de hang-up"
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++"Aqui você deve configurar pelo menos uma conta SIP, que você irá usar para "
++"se cadastrar neste serviço. Use essa conta, seja em um adaptador de "
++"telefonia analógica (ATA), ou em um softphone SIP como Linphone, CSipSimple, "
++"ou Sipdroid em seu smartphone, ou o Ekiga, Linphone, ou X-Lite no seu "
++"computador. Por padrão, ao receber uma chamada em uma das suas contas nos "
++"provedores VoIP ou em números GV, todas as contas SIP tocarão "
++"simultaneamente."
++
++# 20140630: edersg: tradução
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++"Quanto tempo esperar antes de desligar. Se o provedor que você utiliza para "
++"discar automaticamente encaminha para a caixa postal de voz, você pode "
++"definir este valor para um atraso que irá permitir que você desligue sua "
++"chamada antes de ser encaminhada e cobrado financeiramente por isso."
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++"Se definir o servidor/registrador como %s ou %s não funcionar para você, "
++"tente defini-lo como %s ou %s e entre com este número de porta em um campo "
++"separado que especifica o número da porta do servidor/registrador. Fique "
++"ciente que alguns dispositivos têm uma configuração confusa que define a "
++"porta de origem das solicitações SIP no dispositivo SIP em si (a porta local "
++"no dispositivo). A porta especificada nesta página não é essa porta de "
++"ligação, mas a porta na qual o serviço escutará serviço."
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++"Se você sentir falhas ou alta latência enquanto baixa conteúdos pesados​​, "
++"você pode querer habilitar o <abbr title=\"Quality of Service, Qualidade de "
++"serviço\">QoS</abbr>. O <abbr title=\"Quality of Service, Qualidade de "
++"serviço\">QoS</abbr> prioriza o tráfego de e para a sua rede para endereços "
++"IP e portas específicas, resultando em melhor latência e redimento de som. "
++"Se ativado, será configurada automaticamente pelo PABX uma regra de <abbr "
++"title=\"Quality of Service, Qualidade de serviço\">QoS</abbr> para este "
++"serviço, mas você deve visitar a página de configuração de <abbr title="
++"\"Quality of Service, Qualidade de serviço\">QoS</abbr> (Rede -> QoS) para "
++"configurar outras configurações críticas de QoS como as velocidades da sua "
++"conexão."
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++"Se você tiver mais de uma conta que pode fazer chamadas externas, você deve "
++"informar uma lista de números de telefone e/ou prefixos nos seguintes campos "
++"para cada provedor listados. Prefixos inválidos são removidos "
++"silênciosamente, e some os caracteres 0-9, X, Z, N, # *,, e + são válidos. A "
++"letra X corresponde a 0-9, Z corresponde a 1-9, e N corresponde a 2-9. Por "
++"exemplo, para fazer chamadas para a Alemanha através de um provedor, você "
++"pode digitar 49. Para fazer chamadas para a América do Norte, você pode "
++"entrar 1NXXNXXXXXX. Se um de seus provedores pode fazer chamadas locais para "
++"um código de área como Nova York (646), você pode entrar com 646NXXXXXX para "
++"esse provedor. Você deve deixar uma conta com uma lista vazia para fazer "
++"chamadas com ele por padrão para o caso do prefixo não casar com nenhum "
++"outro fornecedor. O sistema irá substituir automaticamente uma lista vazia "
++"com uma mensagem que os este provedor será utilizado caso nenhuma das regras "
++"dos demais provedores casem. Seja tão específico quanto possível (isto é "
++"1NXXNXXXXXX é melhor do que 1). Por favor, note que todos os códigos de "
++"discagem internacionais são descartados (por exemplo 00, 011, 010, 0011). As "
++"entradas podem ser feitas em uma lista separada por espaços ou por nova "
++"linha."
++
++msgid "Incoming Calls"
++msgstr "Chamadas Recebidas"
++
++msgid "Insert QoS Rules"
++msgstr "Inserir Regras QoS"
++
++msgid "Makes Outgoing Calls"
++msgstr "Realiza Chamadas para Fora"
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr "NOTA: Não existe uma conta Google ou provedor SIP configurado."
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++"NOTA: Não existe uma conta Google ou provedor SIP habilitado para receber "
++"chamadas."
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++"NOTA: Não existe uma conta Google ou provedor SIP habilitado para efetuar "
++"chamadas externas."
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr "NOTA: Não existe uma conta local configurada."
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++"NOTA: Não existe uma conta local configurada para efetuar chamadas externas."
++
++msgid "No"
++msgstr "Não"
++
++msgid "Number of Seconds to Ring"
++msgstr "Número de Segundos para Tocar"
++
++msgid "Outbound Proxy"
++msgstr "Proxy Externo"
++
++msgid "Outgoing Calls"
++msgstr "Chamadas Efetuadas"
++
++msgid "PBX Main Page"
++msgstr "Página Principal do PBX"
++
++msgid "PBX Service Status"
++msgstr "Estado do Serviço PBX"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "Password"
++msgstr "Senha"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++"Escolha uma porta aleatória entre 6500 e 9500 onde o serviço irá escutar. "
++"Não escolha a porta padrão 5060 pois ela é frequentemente alvo de ataques de "
++"força bruta. Quanto terminar, (1) clique em \"Salvar e Aplicar\", e (2) olhe "
++"na seção \"Dispositivo SIP/Contas do Softphone\" para as configurações "
++"atualizadas do servidor e porta para o seu Dispositivo SIP/Softphone."
++
++msgid "Port Setting for SIP Devices"
++msgstr "Configuração da Porta para Dispositivos SIP"
++
++msgid "Providers Used for Outgoing Calls"
++msgstr "Provedores Usados para as Chamadas para Fora"
++
++msgid "QoS Settings"
++msgstr "Configurações de QoS"
++
++msgid "RTP Port Range End"
++msgstr "Final da Faixa de Portas RTP"
++
++msgid "RTP Port Range Start"
++msgstr "Inicio da Faixa de Portas RTP"
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++"O tráfego RTP transporta de fato os pacotes de voz. Este é o início do "
++"intervalo de portas que será usado para a estabelecer uma comunicação RTP. "
++"Geralmente não é um problema deixar esta configuração com o valor padrão."
++
++msgid "Receives Incoming Calls"
++msgstr "Recebe Chamadas para Dentro"
++
++msgid "Remote Usage"
++msgstr "Uso Remoto"
++
++msgid "Rings users enabled for incoming calls"
++msgstr "Toca usuários habilitados para receber chamadas"
++
++msgid "SIP Accounts"
++msgstr "Contas SIP"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr "Contas de Dispositivos SIP/Telefones em Software"
++
++msgid "SIP Provider Accounts"
++msgstr "Contas dos Provedores SIP"
++
++msgid "SIP Realm (needed by some providers)"
++msgstr "Domínio SIP (necessário para alguns provedores)"
++
++msgid "SIP Server/Registrar"
++msgstr "Servidor SIP/Registrador"
++
++msgid "SIP Server/Registrar Port"
++msgstr "Porta do Servidor SIP/Registrador"
++
++msgid "Server Setting"
++msgstr "Configuração do Servidor"
++
++msgid "Server Setting for Local SIP Devices"
++msgstr "Configuração do Servidor para Dispositivos SIP Locais"
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr "Configuração do Servidor para Dispositivos SIP Remotos"
++
++msgid "Service Status"
++msgstr "Estado do Serviço"
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++"Define o número de segundos para tocar o telefone ao receber chamadas antes "
++"de desligar ou ir para a caixa postal, se o correio de voz estiver instalado "
++"e habilitado."
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr "Números na Lista Negra separados por Espaço"
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++"Especifique os números individualmente aqui. Pressione o Enter para "
++"adicionar mais números."
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++"Especifique aqui os números individualmente. Pressione o \"Enter\" para "
++"adicionar mais números. Você terá que experimentar com qual código de país "
++"ou de área você precisa adicionar aos números."
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++"O número(s) acima especificados serão capazes de discar com os provedores "
++"deste usuário. Nomes inválidos, incluindo usuários não habilitados para "
++"chamadas externas, serão descartados silenciosamente. Por favor, verifique "
++"se a entrada foi aceita."
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++"Esta página de configuração permite configurar um sistema de serviço de "
++"telefone (PABX), que permite fazer chamadas telefônicas através do Google "
++"múltipla e SIP (como Sipgate, SipSorcery e Betamax) contas e compartilhá-los "
++"entre diversos dispositivos SIP. Note-se que as contas do Google, contas "
++"SIP, e contas de usuários locais são configurados em \"Contas do Google\", "
++"\"Contas SIP\" e \"Contas de Usuário\" sub-seções. Você deve adicionar pelo "
++"menos uma conta de usuário para este PABX e configurar um dispositivo SIP ou "
++"softphone para usar a conta, a fim de fazer e receber chamadas com o "
++"Google / SIP contas. Configurando vários usuários permitem que você faça "
++"chamadas gratuitas entre todos os usuários, e partilhar o Google configurado "
++"e contas SIP. Se você tem mais de um Google e contas SIP configurado, você "
++"provavelmente deve configurar como as chamadas de e para eles são "
++"encaminhados para a \"Call Routing\" página. Se você está interessado em "
++"usar o seu próprio PABX de qualquer lugar do mundo, então, visitar o "
++"\"Remote Uso\" na seção \"Advanced Settings\" página."
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++"Este é o nome que o servidor VoIP será usado para identificar-se quando se "
++"registrar para VoIP (SIP) fornecedores. Alguns provedores exigem isso para "
++"uma seqüência específica de correspondência de um dispositivo de hardware "
++"SIP."
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++"Este é o local onde você indica quais contas Google/SIP serão usadas para "
++"chamar quais códigos de área/país, que usuários poderão usar quais contas "
++"Google/SIP, como as chamadas recebidas serão roteadas, que números podem ser "
++"recebidos por este PBX com uma senha e qual números estão banidos."
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++"Este é o local onde você configura suas contas Google (Talk e Voice) para "
++"poder usá-las para realizar ou receber chamadas (conversa por voz e chamadas "
++"para telefones reais). Por favor, realize ao menos uma chamada de voz usando "
++"o plugin do Google Talk, instalável na interface do GMail. Após esta "
++"chamada, saia da sua conta em todos os serviços. Clique em \"Adicionar\" "
++"para adicionar quantas contas você desejar."
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++"Este é o local onde você configura suas contas SIP (VoIP) como Sipgate, "
++"SipSorcery, os populares provedores Betamax, e qualquer outro provedor com "
++"suporte a SIP para permitir o uso destas contas para efetuar e receber "
++"chamadas (URI de SIP e chamads para números reais). Clique em \"Adicionar\" "
++"para adicionar quantas contas você desejar."
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++"Esta opção deve estar definida como \"Sim\" se você tem um DDR (Discagem "
++"Direta a Ramal) associado com esta conta SIP or quer receber chamadas URI de "
++"SIP através deste provedor."
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++"Esta seção contém configurações que não precisam ser modificadas em "
++"condições normais. Aqui você pode configurar seu sistema para usar com "
++"dispositivos SIP remotos e resolver problemas com a qualidade das chamadas "
++"através da inserção de regras de <abbr title=\"Quality of Service, Qualidade "
++"de serviço\">QoS</abbr>."
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++"Use o nome de usuário numérico (4 a 5 dígitos) se você estiver conectando "
++"telefones normais com ATAs para este sistema (para que eles possam discar os "
++"nomes de seus usuários)."
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++"Use esta conta para realizar chamadas externas como configurado na seção de "
++"\"Roteamento de Chamada\"."
++
++msgid "Use this account to make outgoing calls."
++msgstr "Use esta conta para realizar chamadas externas."
++
++msgid "User Accounts"
++msgstr "Contas de Usuários"
++
++msgid "User Agent String"
++msgstr "Texto para o Agente do Usuário"
++
++msgid "User Name"
++msgstr "Nome do Usuário"
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr "Usa provedores habilitados para chamadas externas"
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++"Quando alguém iniciar uma conversa por voz com sua conta do GTalk ou chamar "
++"seu número GVoice (se você tiver uma conta Google Voice), a chamada será "
++"encaminhada para qualquer usuários que estão conectados (registados "
++"utilizando um dispositivo SIP ou softphone) e autorizados a receber a "
++"chamada. Se você tiver uma conta Google Voice, você deve ir para as "
++"configurações da sua conta GVoice e encaminhar as chamadas para o Google "
++"Chat, a fim de realmente receber chamadas feitas para o seu número GVoice. "
++"Se você tiver problemas para receber chamadas oriundas do GVoice, "
++"experimente a opção \"Call Screening/Monitoramento de Chamadas\" na "
++"configurações da sua conta GVoice. Finalmente, certifique-se de nenhum outro "
++"cliente está online com essa conta (navegador contado no GMail, aplicativo "
++"Google Talk no Desktop ou Celular), pois isto pode interferir."
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++"Quando a sua senha for salva, ela desaparece deste campo e não será exibida "
++"para sua proteção. A senha será alterada somente quando você informar uma "
++"nova senha diferente da que foi salva anteriormente."
++
++msgid "Yes"
++msgstr "Sim"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++"Você pode informar aqui o nome do domínio, endereço IP externo, ou um nome "
++"de domínio dinâmico. O melhor é informar um endereço IP estático. Se o seu "
++"endereço IP é dinâmico e ele muda, sua configuração se tornará inválida. "
++"Desta forma, é recomendado configurar um serviço de domínios dinâmicos e "
++"utilizar este nome aqui. Você pode configurar o serviço de domínios "
++"dinâmicos com o pacote luci-app-ddns."
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++"Você pode especificar um nome real para aparecer no identificador de "
++"chamadas."
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++"Você pode usar seus dispositivos SIP/softphones com este sistema a partir de "
++"um local remoto, desde que o seu provedor de Internet lhe forneça um "
++"endereço IP público. Você poderá ligar para outros usuários locais sem custo "
++"(por exemplo, outros adaptadores de telefone analógico (ATAs)) e usar seus "
++"provedores de VoIP para fazer chamadas como se fossem originadas do local do "
++"seu PBX. Depois de configurar esta aba, volte para onde os usuários são "
++"configurados e veja as novas configurações de servidor e porta com as quais "
++"você precisa configurar os seus dispositivos SIP remotos. Por favor, note "
++"que se este PABX não está rodando no seu roteador, você terá que configurar "
++"o redirecionamento de portas (NAT) no seu roteador. Por favor, encaminhe as "
++"portas abaixo (porta SIP e intervalo de porta RTP) para o endereço IP do "
++"dispositivo que executa este PBX."
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++"Seu PIN desaparece deste campo quando for salvo e não será exibido para sua "
++"proteção. Ele será alterada somente quando você informar um PIN diferente do "
++"que foi salvo anteriormente. É possível deixá-lo em branco mas fique atento "
++"quanto as implicações na segurança."
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++"Sua senha desaparece deste campo quando for salva e não será exibida para "
++"sua proteção. A senha será alterada somente quando você informar uma nova "
++"senha diferente da que foi salva anteriormente."
++
++#~ msgid ""
++#~ "Designate numbers that are allowed to call through this system and which "
++#~ "user's privileges it will have."
++#~ msgstr ""
++#~ "Números definidos que poderão realizar chamadas através deste sistema e "
++#~ "quais privilégios o usuário terá."
++
++#~ msgid ""
++#~ "Pick a random port number between 6500 and 9500 for the service to listen "
++#~ "on. Do not pick the standard 5060, because it is often subject to brute-"
++#~ "force attacks. When finished, (1) click \"Save and Apply\", and (2) click "
++#~ "the \"Restart VoIP Service\" button above. Finally, (3) look in the \"SIP "
++#~ "Device/Softphone Accounts\" section for updated Server and Port settings "
++#~ "for your SIP Devices/Softphones."
++#~ msgstr ""
++#~ "Escolha um número de porta aleatória entre 6500 e 9500 para o serviço "
++#~ "escutar. Não escolher o padrão 5060, porque é frequentemente alvo de ataques "
++#~ "de força bruta. Quando terminar, (1) clique em \"Salvar e Aplicar\", e (2) "
++#~ "clique no \"Reiniciar o serviço VoIP\" acima. Finalmente, (3) olhe na seção "
++#~ "\"Contas de Dispositivos SIP/Telefones em Software\" para atualizar o endereço "
++#~ "e porta do servidor para seu Dispositivos SIP/Telefones em Software."
++
++#~ msgid ""
++#~ "You can enter your domain name, external IP address, or dynamic domain "
++#~ "name here Please keep in mind that if your IP address is dynamic and it "
++#~ "changes your configuration will become invalid. Hence, it's recommended "
++#~ "to set up Dynamic DNS in this case."
++#~ msgstr ""
++#~ "Você pode digitar aqui o seu nome de domínio, endereço IP externo, ou nome "
++#~ "de domínio dinâmico. Tenha em mente que se o seu endereço IP é dinâmico e "
++#~ "ele mudar, a sua configuração se tornará inválida. Por isso, é recomendado "
++#~ "configurar um DNS dinâmico neste caso."
++
++#~ msgid "Account Status"
++#~ msgstr "Estado da Conta"
++
++#~ msgid "Account Status Message"
++#~ msgstr "Mensagem do Estado da Conta"
++
++#~ msgid "Domain Name/Dynamic Domain Name"
++#~ msgstr "Nome do Domínio/Nome do Domínio Dinâmico"
++
++#~ msgid "Enable Incoming Calls (See Status, Message below)"
++#~ msgstr "Habilitar Chamadas Recebidas (Veja o Estado, Mensagem abaixo)"
++
++#~ msgid "Service Control and Connection Status"
++#~ msgstr "Controle do Serviço e Estado da Conexão"
+diff --git a/feeds/luci/applications/luci-app-pbx/po/pt/pbx.po b/feeds/luci/applications/luci-app-pbx/po/pt/pbx.po
+new file mode 100644
+index 0000000..75b6c8c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/pt/pbx.po
+@@ -0,0 +1,487 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-09-22 19:17+0200\n"
++"Last-Translator: Low <pedroloureiro1@sapo.pt>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Available"
++msgstr "Disponível"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr "Ativado"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr "Nome Completo"
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Google Accounts"
++msgstr ""
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr "Não"
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr "Sim"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/ro/pbx.po b/feeds/luci/applications/luci-app-pbx/po/ro/pbx.po
+new file mode 100644
+index 0000000..49e8dac
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/ro/pbx.po
+@@ -0,0 +1,488 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-28 18:50+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Setări avansate"
++
++msgid "Available"
++msgstr "Disponibil"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr "Nu deranjaţi"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr "Domeniu/Adresă IP/Domeniu dinamic"
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr "Activat"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr "Nume complet"
++
++msgid "General Settings"
++msgstr "Setări generale"
++
++msgid "Google Accounts"
++msgstr "Conturi Google"
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr "Parolă"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr "Setări QoS"
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/ru/pbx.po b/feeds/luci/applications/luci-app-pbx/po/ru/pbx.po
+new file mode 100644
+index 0000000..e85c947
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/ru/pbx.po
+@@ -0,0 +1,525 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-09-06 10:28+0200\n"
++"Last-Translator: datasheet <michael.gritsaenko@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Advanced Settings"
++msgstr "РаÑширенные уÑтановки"
++
++msgid "Available"
++msgstr "ДоÑтупен"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++"СтарайтеÑÑŒ не иÑпользовать ничего, кроме алфавитно-цифровых Ñимволов, "
++"пробелов, запÑÑ‚Ñ‹Ñ… и точек."
++
++msgid "Away"
++msgstr "Отошел"
++
++msgid "Blacklisted Numbers"
++msgstr "Ðомера в \"черном\" ÑпиÑке"
++
++msgid "Call Routing"
++msgstr "ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð¾Ð²"
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr "Ðомера Ñквозных вызовов"
++
++msgid "Copy-paste large lists of numbers here."
++msgstr "Ð’Ñтавьте большие ÑпиÑки номеров здеÑÑŒ"
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr "Ðе беÑпокоить"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr "ДинамичеÑкий ÑпиÑок запрещенных номеров"
++
++msgid "Email"
++msgstr "Эл. почта"
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "Разрешить входÑщие вызовы (региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· SIP)"
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr "Разрешить входÑщие звонки (Ñм. ниже СтатуÑ)"
++
++msgid "Enable Outgoing Calls"
++msgstr "Разрешить иÑходÑщие вызовы"
++
++msgid "Enabled"
++msgstr "Включено"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++"Введите телефонные номера, звонки Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… вы хотите автоматичеÑки "
++"отклонÑÑ‚ÑŒ. Ð’Ñ‹, вероÑтно, не должны вводить код Ñтраны и ведущие нули, но, "
++"чтобы удоÑтоверитьÑÑ Ð² Ñтом, пожалуйÑта проверьте, что звонки из "
++"нежелательной зоны уÑпешно блокируютÑÑ."
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++"Введите Ñтот IP (или IP порт) в уÑтановках Сервера/РегиÑтратора SIP "
++"уÑтройÑтв, который вы будете иÑпользовать ТОЛЬКО локально и никогда удаленно."
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++"Введите Ñто имÑ_хоÑта (или имÑ_хоÑта:порт) в уÑтановках Сервера/РегиÑтратора "
++"тех SIP-уÑтройÑтв, которые вы будете иÑпользовать удаленно (локально они "
++"также будут работать)."
++
++msgid "External SIP Port"
++msgstr "Внешний порт SIP"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr "Полное имÑ"
++
++msgid "General Settings"
++msgstr "Общие уÑтановки"
++
++msgid "Google Accounts"
++msgstr "Учетные запиÑи Google"
++
++msgid "Google Talk Status"
++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Google Talk"
++
++msgid "Google Talk Status Message"
++msgstr "Сообщение ÑтатуÑа Google Talk"
++
++msgid "Google Voice/Talk Accounts"
++msgstr "Учетные запиÑи Google Voice/Talk"
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr "ВходÑщие вызовы"
++
++msgid "Insert QoS Rules"
++msgstr "Ð’Ñтавить правила QoS"
++
++msgid "Makes Outgoing Calls"
++msgstr "Совершает иÑходÑщие вызовы"
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr "Ðет"
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr "Outbound прокÑи Ñервер"
++
++msgid "Outgoing Calls"
++msgstr "ИÑходÑщие вызовы"
++
++msgid "PBX Main Page"
++msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница ÐТС"
++
++#, fuzzy
++msgid "PBX Service Status"
++msgstr "СоÑтоÑние Ñлужбы ÐТС"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "Password"
++msgstr "Пароль"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr "ÐаÑтройки порта уÑтройÑтв SIP"
++
++msgid "Providers Used for Outgoing Calls"
++msgstr "Провайдеры иÑходÑщих вызовов"
++
++msgid "QoS Settings"
++msgstr "УÑтановки QoS"
++
++msgid "RTP Port Range End"
++msgstr "Конец диапазона портов RTP"
++
++msgid "RTP Port Range Start"
++msgstr "Ðачало диапазоно портов RTP"
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr "Принимает входÑщие вызовы"
++
++msgid "Remote Usage"
++msgstr "Удаленное иÑпользование"
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr "Учетные запиÑи SIP"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr "Учетные запиÑи SIP уÑтройÑтва/программного телефона"
++
++msgid "SIP Provider Accounts"
++msgstr "Учетные запиÑи SIP провайдера"
++
++msgid "SIP Realm (needed by some providers)"
++msgstr "SIP Realm (нужен Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… провайдеров)"
++
++msgid "SIP Server/Registrar"
++msgstr "SIP Сервер/РегиÑтратор"
++
++msgid "SIP Server/Registrar Port"
++msgstr "Порт SIP Сервера/РегиÑтратора"
++
++msgid "Server Setting"
++msgstr "ÐаÑтройки Ñервера"
++
++msgid "Server Setting for Local SIP Devices"
++msgstr "УÑтановки Ñервера Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… SIP уÑтройÑтв"
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr "ÐаÑтройки Ñервера Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ñ‹Ñ… SIP уÑтройÑтв"
++
++msgid "Service Status"
++msgstr "СоÑтоÑние ÑервиÑа"
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr "Черный ÑпиÑок номеров (пробел между номерами Ð´Ð»Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ)"
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++"Укажите отдельные номера. Ðажмите enter, чтобы добавить больше номеров."
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++"ИÑпользовать Ñту учетную запиÑÑŒ Ð´Ð»Ñ Ð¸ÑходÑщих вызовов в ÑоответÑтии Ñ "
++"наcтройками Ñекции \"ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð¾Ð²\"."
++
++msgid "Use this account to make outgoing calls."
++msgstr "ИÑпользовать Ñту учетную запиÑÑŒ Ð´Ð»Ñ Ð¸ÑходÑщих вызовов"
++
++msgid "User Accounts"
++msgstr "Учетные запиÑи пользователÑ"
++
++msgid "User Agent String"
++msgstr "Строка агента пользователÑ"
++
++msgid "User Name"
++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr "Да"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr "ЗдеÑÑŒ Ð’Ñ‹ можете указать Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¼ÐµÑто ID звонÑщего."
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++#~ msgid ""
++#~ "Designate numbers that are allowed to call through this system and which "
++#~ "user's privileges it will have."
++#~ msgstr ""
++#~ "Указать телефонные номера, которым разрешено оÑущеÑтвлÑÑ‚ÑŒ звонки через Ñту "
++#~ "ÑиÑтему, а также какими они будут обладать пользовательÑкими привилегиÑми."
++
++#~ msgid "Account Status"
++#~ msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи"
++
++#~ msgid "Account Status Message"
++#~ msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñообщение учетной запиÑи"
++
++#~ msgid "Domain Name/Dynamic Domain Name"
++#~ msgstr "Ð˜Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°/ДинамичеÑкое Ð¸Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°"
++
++#~ msgid "Enable Incoming Calls (See Status, Message below)"
++#~ msgstr "Разрешить входÑщие вызовы (Ñм. ÑтатуÑ, Ñообщение ниже)"
++
++#~ msgid "Service Control and Connection Status"
++#~ msgstr "Управление ÑервиÑом и ÑÑ‚Ð°Ñ‚ÑƒÑ ÑоединениÑ"
+diff --git a/feeds/luci/applications/luci-app-pbx/po/sk/pbx.po b/feeds/luci/applications/luci-app-pbx/po/sk/pbx.po
+new file mode 100644
+index 0000000..7b6d4a5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/sk/pbx.po
+@@ -0,0 +1,484 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Google Accounts"
++msgstr ""
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/sv/pbx.po b/feeds/luci/applications/luci-app-pbx/po/sv/pbx.po
+new file mode 100644
+index 0000000..400289b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/sv/pbx.po
+@@ -0,0 +1,506 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-04-28 06:11+0200\n"
++"Last-Translator: Umeaboy <kristoffer.grundstrom1983@gmail.com>\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Avancerade inställningar"
++
++msgid "Available"
++msgstr "Tillgänglig"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++"Undvik att använda allt förutom alfa-numeriska karaktärer, mellanslag, komma-"
++"tecken och punkt."
++
++msgid "Away"
++msgstr "Borta"
++
++msgid "Blacklisted Numbers"
++msgstr "Svartlistade nummer"
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr "Kopiera och klistra in ett stort antal nummer här."
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr "Ringer upp nummer som inte passar någon annanstans"
++
++msgid "Do Not Disturb"
++msgstr "Stör ej"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr "Domän/IP-adress/Dynamisk domän"
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr "Dynamisk lista över svartlistade nummer"
++
++msgid "Email"
++msgstr "E-post"
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "Aktivera inkommande samtal (Registrera via SIP)"
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr "Aktivera inkommande samtal (se status nedanför)"
++
++msgid "Enable Outgoing Calls"
++msgstr "Aktivera utgående samtal"
++
++msgid "Enabled"
++msgstr "Aktiverat"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++"Ange telefonnummer som du vill neka samtal från automatiskt. Du borde "
++"förmodligen utesluta landskoden och eventuella inledande nollor, men "
++"experimentera gärna för att vara säker på att du lyckas blockera nummer från "
++"ditt önskade område."
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++"Ange den här IP:n (eller IP:port) i Server/Registrar-inställningarna för SIP-"
++"enheter som du endast kommer att använda LOKALT och aldrig från en "
++"fjärrstyrd anslutning."
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++"Ange det här värdnamnet (eller värdnamn:port) under Server/Registrar "
++"inställningen för SIP-enheten som du kommer att använda från en fjärrstyrd "
++"plats (de kommer att fungera lokalt också)."
++
++msgid "External SIP Port"
++msgstr "Extern SIP-port"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr "Fullständigt namn"
++
++msgid "General Settings"
++msgstr "Allmänna inställningar"
++
++msgid "Google Accounts"
++msgstr "Google-konton"
++
++msgid "Google Talk Status"
++msgstr "Status för Google Talk"
++
++msgid "Google Talk Status Message"
++msgstr "Statusmeddelande för Google Talk"
++
++msgid "Google Voice/Talk Accounts"
++msgstr "Google Voice/Talk-konton"
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr "Inkommande samtal"
++
++msgid "Insert QoS Rules"
++msgstr "För in QoS-regler"
++
++msgid "Makes Outgoing Calls"
++msgstr "Gör utgående samtal"
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr "NOTERA: Det finns inga lokala användarkonton konfigurerade."
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++"NOTERA: Det finns inga lokala användar-konton aktiverade för utgående samtal."
++
++msgid "No"
++msgstr "Nej"
++
++msgid "Number of Seconds to Ring"
++msgstr "Antal sekunder att ringa"
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr "Utgående samtal"
++
++msgid "PBX Main Page"
++msgstr "Huvudsida för PBX"
++
++msgid "PBX Service Status"
++msgstr "Status för PBX-tjänsten"
++
++msgid "PIN"
++msgstr "PIN-kod"
++
++msgid "Password"
++msgstr "Lösenord"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr "Port-inställning för SIP-enheter"
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr "QoS-inställningar"
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr "Tar emot inkommande samtal"
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr "Ringer användare som är aktiverade för inkommande samtal"
++
++msgid "SIP Accounts"
++msgstr "SIP-konton"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr "SIP-enhet/Softphone-konton"
++
++msgid "SIP Provider Accounts"
++msgstr "SIP-operatörskonton"
++
++msgid "SIP Realm (needed by some providers)"
++msgstr "SIP-sfär (behövs av vissa operatörer)"
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr "Server-inställning"
++
++msgid "Server Setting for Local SIP Devices"
++msgstr "Server-inställning för lokala SIP-enheter"
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr "Server-inställning för fjärrstyrda SIP-enheter"
++
++msgid "Service Status"
++msgstr "Status för tjänst"
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++"Specificera nummer individuellt här. Tryck på enter-knappen för att lägga "
++"till fler nummer."
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++"Det här valet borde vara inställt på \"Ja\" om du har ett DID (riktigt "
++"telefonnummer) associerat med det här SIP-kontot eller om du vill ta emot "
++"SIP uri-samtal via den här operatören."
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr "Använd det här kontot för att göra utgående samtal."
++
++msgid "User Accounts"
++msgstr "Användar-konton"
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr "Användarnamn"
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr "Använder operatörer för utgående samtal"
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr "Ja"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++"Du kan specifiera ett riktigt namn som visas i samband med nummret här."
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/templates/pbx.pot b/feeds/luci/applications/luci-app-pbx/po/templates/pbx.pot
+new file mode 100644
+index 0000000..86dd2eb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/templates/pbx.pot
+@@ -0,0 +1,477 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Google Accounts"
++msgstr ""
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/tr/pbx.po b/feeds/luci/applications/luci-app-pbx/po/tr/pbx.po
+new file mode 100644
+index 0000000..59af3e8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/tr/pbx.po
+@@ -0,0 +1,484 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Google Accounts"
++msgstr ""
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/uk/pbx.po b/feeds/luci/applications/luci-app-pbx/po/uk/pbx.po
+new file mode 100644
+index 0000000..d65a784
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/uk/pbx.po
+@@ -0,0 +1,501 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-13 15:47+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Advanced Settings"
++msgstr "Розширені налаштуваннÑ"
++
++msgid "Available"
++msgstr "ДоÑтупний"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++"ÐамагайтеÑÑ Ð½Ðµ викориÑтовувати нічого, крім алфавітно-цифрових Ñимволів, "
++"пропуÑків, ком Ñ– крапок."
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr "ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð’Ð¸ÐºÐ»Ð¸ÐºÑ–Ð²"
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr "Виклик через номери"
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++#, fuzzy
++msgid "Do Not Disturb"
++msgstr "Ðе турбувати"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++#, fuzzy
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr "Динамічний ÑпиÑок небажаних дзвінків"
++
++msgid "Email"
++msgstr "Електронна Ñкринька"
++
++#, fuzzy
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "Ðктивувати вхідні дзвінки (зареєÑтруватиÑÑ Ñ‡ÐµÑ€ÐµÐ· SIP)"
++
++#, fuzzy
++msgid "Enable Incoming Calls (set Status below)"
++msgstr "Ðктивувати вхідні дзвінки (Ð’Ñтановити низький ÑтатуÑ)"
++
++msgid "Enable Outgoing Calls"
++msgstr "Ðктивувати вихідні виклики"
++
++msgid "Enabled"
++msgstr "Ðктивувати"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++#, fuzzy
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++"Введіть цей IP (або IP:порт) Сервера/РеєÑтратор Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ SIP приÑтрою ви "
++"будете викориÑтовувати тільки локально й ніколи з віддаленого міÑцÑ."
++
++#, fuzzy
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++"Введіть це хоÑÑ‚ ім'Ñ (або ім'Ñ Ñ…Ð¾Ñта:порт) Ñервер/РеєÑтратор Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ "
++"SIP приÑтрою ви будете викориÑтовувати з віддаленого міÑÑ†Ñ Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ "
++"(воно також буде працювати локально)."
++
++msgid "External SIP Port"
++msgstr "Зовнішній порт SIP"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr "Повне Ім'Ñ"
++
++msgid "General Settings"
++msgstr "Загальні ÐалаштуваннÑ"
++
++msgid "Google Accounts"
++msgstr "Облікові запиÑи Google"
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr "ÐÑ–"
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr "Облікові запиÑи кориÑтувачів"
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr "Так"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/vi/pbx.po b/feeds/luci/applications/luci-app-pbx/po/vi/pbx.po
+new file mode 100644
+index 0000000..59af3e8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/vi/pbx.po
+@@ -0,0 +1,484 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr ""
++
++msgid "Away"
++msgstr ""
++
++msgid "Blacklisted Numbers"
++msgstr ""
++
++msgid "Call Routing"
++msgstr ""
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr ""
++
++msgid "Copy-paste large lists of numbers here."
++msgstr ""
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr ""
++
++msgid "Do Not Disturb"
++msgstr ""
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr ""
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr ""
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr ""
++
++msgid "Enable Outgoing Calls"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr ""
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Google Accounts"
++msgstr ""
++
++msgid "Google Talk Status"
++msgstr ""
++
++msgid "Google Talk Status Message"
++msgstr ""
++
++msgid "Google Voice/Talk Accounts"
++msgstr ""
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr ""
++
++msgid "Insert QoS Rules"
++msgstr ""
++
++msgid "Makes Outgoing Calls"
++msgstr ""
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr ""
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr ""
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr ""
++
++msgid "No"
++msgstr ""
++
++msgid "Number of Seconds to Ring"
++msgstr ""
++
++msgid "Outbound Proxy"
++msgstr ""
++
++msgid "Outgoing Calls"
++msgstr ""
++
++msgid "PBX Main Page"
++msgstr ""
++
++msgid "PBX Service Status"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr ""
++
++msgid "Providers Used for Outgoing Calls"
++msgstr ""
++
++msgid "QoS Settings"
++msgstr ""
++
++msgid "RTP Port Range End"
++msgstr ""
++
++msgid "RTP Port Range Start"
++msgstr ""
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr ""
++
++msgid "Remote Usage"
++msgstr ""
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr ""
++
++msgid "SIP Device/Softphone Accounts"
++msgstr ""
++
++msgid "SIP Provider Accounts"
++msgstr ""
++
++msgid "SIP Realm (needed by some providers)"
++msgstr ""
++
++msgid "SIP Server/Registrar"
++msgstr ""
++
++msgid "SIP Server/Registrar Port"
++msgstr ""
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-pbx/po/zh-cn/pbx.po b/feeds/luci/applications/luci-app-pbx/po/zh-cn/pbx.po
+new file mode 100644
+index 0000000..8ac03e1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/zh-cn/pbx.po
+@@ -0,0 +1,495 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-15 16:11+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "高级设置"
++
++msgid "Available"
++msgstr "å¯ç”¨"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr "é¿å…使用除字æ¯ï¼Œæ•°å­—,空格,逗å·å’Œå¥å·å¤–的其他字符。"
++
++msgid "Away"
++msgstr "外"
++
++msgid "Blacklisted Numbers"
++msgstr "黑åå•"
++
++msgid "Call Routing"
++msgstr "呼å«è·¯ç”±"
++
++msgid "Call-back Numbers"
++msgstr "回调数"
++
++msgid "Call-back Provider"
++msgstr "回呼æ供者"
++
++msgid "Call-through Numbers"
++msgstr "通过数字呼å«"
++
++msgid "Copy-paste large lists of numbers here."
++msgstr "å¤åˆ¶ç²˜è´´æ•°å­—大åå•ã€‚"
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr "其他地方无法匹é…拨å·å·ç "
++
++msgid "Do Not Disturb"
++msgstr "请勿打扰"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr "域å/ IP地å€/动æ€åŸŸå"
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr "动æ€é»‘åå•å·ç åˆ—表"
++
++msgid "Email"
++msgstr "电å­é‚®ä»¶"
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "å…许电è¯å‘¼å…¥ï¼ˆSIP注册者)"
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr "å…许电è¯å‘¼å…¥ï¼ˆä¸‹é¢è®¾ç½®çŠ¶æ€ï¼‰"
++
++msgid "Enable Outgoing Calls"
++msgstr "å…许电è¯å¤–呼"
++
++msgid "Enabled"
++msgstr "å…许"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++"输入你想自动å±è”½çš„电è¯å·ç ã€‚你应该忽略国家代ç å’Œä»»ä½•å‰å¯¼é›¶,但请测试æ¥ç¡®ä¿ä½ æˆ"
++"功å±è”½äº†æƒ³è¦å±è”½çš„å·ç ã€‚"
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++"在SIP设备注册æœåŠ¡å™¨ä¸­è¾“å…¥IP(或IP:端å£),仅在本地使用,ä¸å¯ä»¥åœ¨è¿œç¨‹ä½¿ç”¨ã€‚"
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++
++msgid "External SIP Port"
++msgstr "外部SIP端å£"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr "å…¨å"
++
++msgid "General Settings"
++msgstr "通用设置"
++
++msgid "Google Accounts"
++msgstr "googleè´¦å·"
++
++msgid "Google Talk Status"
++msgstr "google Talk状æ€"
++
++msgid "Google Talk Status Message"
++msgstr "google Talk状æ€æ¶ˆæ¯"
++
++msgid "Google Voice/Talk Accounts"
++msgstr "Google Voice/Talkè´¦å·"
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr "呼入电è¯"
++
++msgid "Insert QoS Rules"
++msgstr "æ’å…¥QoS规则"
++
++msgid "Makes Outgoing Calls"
++msgstr "安排外呼列表"
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr "注æ„:没有google或SIPæ供者账户é…置。"
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr "注æ„:没有google或SIPæ供者账户å…许呼入电è¯ã€‚"
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr "注æ„:没有google或SIPæ供者账户å…许外呼电è¯ã€‚"
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr "注æ„:没有本地用户设置。"
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr "注æ„:没有本地用户å…许外呼电è¯ã€‚"
++
++msgid "No"
++msgstr "ä¸"
++
++msgid "Number of Seconds to Ring"
++msgstr "多少秒振铃"
++
++msgid "Outbound Proxy"
++msgstr "外呼代ç†"
++
++msgid "Outgoing Calls"
++msgstr "外呼电è¯"
++
++msgid "PBX Main Page"
++msgstr "PBX主页"
++
++msgid "PBX Service Status"
++msgstr "PBXæœåŠ¡çŠ¶æ€"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "Password"
++msgstr "密ç "
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr "SIP设备端å£è®¾ç½®"
++
++msgid "Providers Used for Outgoing Calls"
++msgstr "用于外呼电è¯çš„æ供者"
++
++msgid "QoS Settings"
++msgstr "QoS设置"
++
++msgid "RTP Port Range End"
++msgstr "RTP结æŸç«¯å£"
++
++msgid "RTP Port Range Start"
++msgstr "RTP起始端å£"
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr "收到呼入电è¯"
++
++msgid "Remote Usage"
++msgstr "远程使用"
++
++msgid "Rings users enabled for incoming calls"
++msgstr ""
++
++msgid "SIP Accounts"
++msgstr "SIPè´¦å·"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr "SIP 设备/软电è¯è´¦å·"
++
++msgid "SIP Provider Accounts"
++msgstr "SIPæ供者账户"
++
++msgid "SIP Realm (needed by some providers)"
++msgstr "SIP Realm(一些供应商需è¦ï¼‰"
++
++msgid "SIP Server/Registrar"
++msgstr "SIP注册æœåŠ¡å™¨"
++
++msgid "SIP Server/Registrar Port"
++msgstr "SIP注册æœåŠ¡å™¨ç«¯å£"
++
++msgid "Server Setting"
++msgstr ""
++
++msgid "Server Setting for Local SIP Devices"
++msgstr ""
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr ""
++
++msgid "Service Status"
++msgstr ""
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr ""
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr ""
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr ""
++
++msgid "User Accounts"
++msgstr ""
++
++msgid "User Agent String"
++msgstr ""
++
++msgid "User Name"
++msgstr ""
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr ""
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr ""
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr ""
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++#~ msgid ""
++#~ "Designate numbers that are allowed to call through this system and which "
++#~ "user's privileges it will have."
++#~ msgstr "设定å·ç ä½œä¸ºç”¨æˆ·æ‹¥æœ‰ä½¿ç”¨äº¤æ¢æœºå‘¼å«çš„æƒé™ã€‚"
+diff --git a/feeds/luci/applications/luci-app-pbx/po/zh-tw/pbx.po b/feeds/luci/applications/luci-app-pbx/po/zh-tw/pbx.po
+new file mode 100644
+index 0000000..aa05be7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/po/zh-tw/pbx.po
+@@ -0,0 +1,507 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-16 13:59+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "進階設定"
++
++msgid "Available"
++msgstr "å¯é‹ç”¨"
++
++msgid ""
++"Avoid using anything but alpha-numeric characters, space, comma, and period."
++msgstr "除了字æ¯æ•¸å­—字符,空格,逗號和å¥è™Ÿå…¶å®ƒä¸€æ¦‚ä¸ç”¨."
++
++msgid "Away"
++msgstr "離線"
++
++msgid "Blacklisted Numbers"
++msgstr "列入黑å單號碼"
++
++msgid "Call Routing"
++msgstr "路由呼å«"
++
++msgid "Call-back Numbers"
++msgstr ""
++
++msgid "Call-back Provider"
++msgstr ""
++
++msgid "Call-through Numbers"
++msgstr "通話接通號碼"
++
++msgid "Copy-paste large lists of numbers here."
++msgstr "號碼大型清單複製貼上此地"
++
++msgid ""
++"Designate numbers that are allowed to call through this system and which "
++"user's privileges they will have."
++msgstr ""
++
++msgid ""
++"Designate numbers to whom the system will hang up and call back, which "
++"provider will be used to call them, and which user's privileges will be "
++"granted to them."
++msgstr ""
++
++msgid "Dials numbers unmatched elsewhere"
++msgstr "撥號它處號碼ä¸ç¬¦"
++
++msgid "Do Not Disturb"
++msgstr "勿擾中"
++
++msgid "Domain/IP Address/Dynamic Domain"
++msgstr "網域/IPä½å€/動態網域"
++
++msgid "Dynamic List of Blacklisted Numbers"
++msgstr "黑å單動態列表"
++
++msgid "Email"
++msgstr "郵件信箱"
++
++msgid "Enable Incoming Calls (Register via SIP)"
++msgstr "啟用來話呼å«(é€éŽSIP註冊)"
++
++msgid "Enable Incoming Calls (set Status below)"
++msgstr "啟用來話呼å«(在下é¢è¨­å®šç‹€æ…‹)"
++
++msgid "Enable Outgoing Calls"
++msgstr "啟用外撥"
++
++msgid "Enabled"
++msgstr "已啟用"
++
++msgid ""
++"Enter a VoIP provider to use for call-back in the format username@some.host."
++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste "
++"the providers from above. Invalid entries, including providers not enabled "
++"for outgoing calls, will be rejected silently."
++msgstr ""
++
++msgid ""
++"Enter phone numbers that you want to decline calls from automatically. You "
++"should probably omit the country code and any leading zeroes, but please "
++"experiment to make sure you are blocking numbers from your desired area "
++"successfully."
++msgstr ""
++"打入你å…許自動通話的號碼. 你或許å¯ä»¥å¿½ç•¥åœ‹ç¢¼å’Œ0å­—é–‹é ­, 但僅供實驗以確ä¿æœŸæœ›å€"
++"的號碼被阻斷æˆåŠŸ."
++
++msgid ""
++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices "
++"you will use ONLY locally and never from a remote location."
++msgstr ""
++"è¦è¨­å®šSIP設備在Server/Registrar內打入IP(或IP:埠號)你僅能本地端使用絕ä¸è¦æ‰“å…¥"
++"é ç«¯ä½ç½®"
++
++msgid ""
++"Enter this hostname (or hostname:port) in the Server/Registrar setting of "
++"SIP devices you will use from a remote location (they will work locally too)."
++msgstr ""
++"è¦è¨­å®šSIP設備從é ç«¯ä½¿ç”¨(在本地端也一樣能執行),在Server/Registrar內打入主機å"
++"稱(或主機å稱:埠號)"
++
++msgid "External SIP Port"
++msgstr "外部SIP埠號"
++
++msgid ""
++"For each provider enabled for incoming calls, here you can restrict which "
++"users to ring on incoming calls. If the list is empty, the system will "
++"indicate that all users enabled for incoming calls will ring. Invalid "
++"usernames will be rejected silently. Also, entering a username here "
++"overrides the user's setting to not receive incoming calls. This way, you "
++"can make certain users ring only for specific providers. Entries can be made "
++"in a space-separated list, and/or one per line by hitting enter after every "
++"one."
++msgstr ""
++
++msgid ""
++"For each user enabled for outgoing calls you can restrict what providers the "
++"user can use for outgoing calls. By default all users can use all providers. "
++"To show up in the list below the user should be allowed to make outgoing "
++"calls in the \"User Accounts\" page. Enter VoIP providers in the format "
++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest "
++"to copy and paste the providers from above. Invalid entries, including "
++"providers not enabled for outgoing calls, will be rejected silently. Entries "
++"can be made in a space-separated list, and/or one per line by hitting enter "
++"after every one."
++msgstr ""
++
++msgid "Full Name"
++msgstr "å…¨å"
++
++msgid "General Settings"
++msgstr "一般設定"
++
++msgid "Google Accounts"
++msgstr "Google帳戶"
++
++msgid "Google Talk Status"
++msgstr "Google Talk狀態"
++
++msgid "Google Talk Status Message"
++msgstr "Google Talk訊æ¯ç‹€æ…‹"
++
++msgid "Google Voice/Talk Accounts"
++msgstr "Google 語音/簡訊帳戶"
++
++msgid "Hang-up Delay"
++msgstr ""
++
++msgid ""
++"Here you must configure at least one SIP account, that you will use to "
++"register with this service. Use this account either in an Analog Telephony "
++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid "
++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By "
++"default, all SIP accounts will ring simultaneously if a call is made to one "
++"of your VoIP provider accounts or GV numbers."
++msgstr ""
++
++msgid ""
++"How long to wait before hanging up. If the provider you use to dial "
++"automatically forwards to voicemail, you can set this value to a delay that "
++"will allow you to hang up before your call gets forwarded and you get billed "
++"for it."
++msgstr ""
++
++msgid ""
++"If setting Server/Registrar to %s or %s does not work for you, try setting "
++"it to %s or %s and entering this port number in a separate field that "
++"specifies the Server/Registrar port number. Beware that some devices have a "
++"confusing setting that sets the port where SIP requests originate from on "
++"the SIP device itself (the bind port). The port specified on this page is "
++"NOT this bind port but the port this service listens on."
++msgstr ""
++
++msgid ""
++"If you experience jittery or high latency audio during heavy downloads, you "
++"may want to enable QoS. QoS prioritizes traffic to and from your network for "
++"specified ports and IP addresses, resulting in better latency and throughput "
++"for sound in our case. If enabled below, a QoS rule for this service will be "
++"configured by the PBX automatically, but you must visit the QoS "
++"configuration page (Network->QoS) to configure other critical QoS settings "
++"like Download and Upload speed."
++msgstr ""
++
++msgid ""
++"If you have more than one account that can make outgoing calls, you should "
++"enter a list of phone numbers and/or prefixes in the following fields for "
++"each provider listed. Invalid prefixes are removed silently, and only 0-9, "
++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z "
++"matches 1-9, and N matches 2-9. For example to make calls to Germany through "
++"a provider, you can enter 49. To make calls to North America, you can enter "
++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area "
++"code like New York's 646, you can enter 646NXXXXXX for that provider. You "
++"should leave one account with an empty list to make calls with it by "
++"default, if no other provider's prefixes match. The system will "
++"automatically replace an empty list with a message that the provider dials "
++"all numbers not matched by another provider's prefixes. Be as specific as "
++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international "
++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a "
++"space-separated list, and/or one per line by hitting enter after every one."
++msgstr ""
++
++msgid "Incoming Calls"
++msgstr "來電呼å«"
++
++msgid "Insert QoS Rules"
++msgstr "æ’å…¥QoSè¦å‰‡"
++
++msgid "Makes Outgoing Calls"
++msgstr "開啟外撥"
++
++msgid "NOTE: There are no Google or SIP provider accounts configured."
++msgstr "注æ„:尚缺Google或者SIPæ供者帳戶被設置"
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for incoming "
++"calls."
++msgstr "注æ„:尚缺Google或者SIP供應商帳戶被啟用æ‰èƒ½æŽ¥æ”¶ä¾†é›»å‘¼å«"
++
++msgid ""
++"NOTE: There are no Google or SIP provider accounts enabled for outgoing "
++"calls."
++msgstr "注æ„:尚缺Google或者SIP供應商帳戶被啟用æ‰èƒ½å¤–æ’¥."
++
++msgid "NOTE: There are no local user accounts configured."
++msgstr "注æ„:尚未設置本地端帳戶"
++
++msgid "NOTE: There are no local user accounts enabled for outgoing calls."
++msgstr "注æ„:啟用本地端帳戶æ‰èƒ½å¤–æ’¥"
++
++msgid "No"
++msgstr "ä¸"
++
++msgid "Number of Seconds to Ring"
++msgstr "響鈴秒數"
++
++msgid "Outbound Proxy"
++msgstr "外連代ç†"
++
++msgid "Outgoing Calls"
++msgstr "去電外撥"
++
++msgid "PBX Main Page"
++msgstr "PBX總機主é "
++
++msgid "PBX Service Status"
++msgstr "PBXæœå‹™ç‹€æ…‹"
++
++msgid "PIN"
++msgstr "PIN碼"
++
++msgid "Password"
++msgstr "密碼"
++
++msgid ""
++"Pick a random port number between 6500 and 9500 for the service to listen "
++"on. Do not pick the standard 5060, because it is often subject to brute-"
++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in "
++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port "
++"settings for your SIP Devices/Softphones."
++msgstr ""
++
++msgid "Port Setting for SIP Devices"
++msgstr "SIP設備的埠號設置"
++
++msgid "Providers Used for Outgoing Calls"
++msgstr "已採用的外撥供應商"
++
++msgid "QoS Settings"
++msgstr "QoS語音å“質設置"
++
++msgid "RTP Port Range End"
++msgstr "RTPå”定埠域çµæŸ"
++
++msgid "RTP Port Range Start"
++msgstr "RTPå”定埠域啟始"
++
++msgid ""
++"RTP traffic carries actual voice packets. This is the start of the port "
++"range that will be used for setting up RTP communication. It's usually OK to "
++"leave this at the default value."
++msgstr ""
++
++msgid "Receives Incoming Calls"
++msgstr "接å—來電呼å«"
++
++msgid "Remote Usage"
++msgstr "é ç«¯å•Ÿç”¨"
++
++msgid "Rings users enabled for incoming calls"
++msgstr "來電呼å«æ™‚震鈴通知使用者"
++
++msgid "SIP Accounts"
++msgstr "SIP帳戶"
++
++msgid "SIP Device/Softphone Accounts"
++msgstr "SIP設備/軟體å¼æ‰‹æ©Ÿå¸³æˆ¶"
++
++msgid "SIP Provider Accounts"
++msgstr "SIP供應商帳戶"
++
++msgid "SIP Realm (needed by some providers)"
++msgstr "SIP領域(æŸäº›ä¾›æ‡‰å•†éœ€ç”¨åˆ°)"
++
++msgid "SIP Server/Registrar"
++msgstr "SIP伺æœå™¨/登記處"
++
++msgid "SIP Server/Registrar Port"
++msgstr "SIP伺æœå™¨/登記埠"
++
++msgid "Server Setting"
++msgstr "伺æœå™¨è¨­ç½®"
++
++msgid "Server Setting for Local SIP Devices"
++msgstr "本地SIP設備的伺æœå™¨è¨­ç½®"
++
++msgid "Server Setting for Remote SIP Devices"
++msgstr "é ç«¯SIP設備的伺æœå™¨è¨­ç½®"
++
++msgid "Service Status"
++msgstr "æœå‹™ç‹€æ…‹"
++
++msgid ""
++"Set the number of seconds to ring users upon incoming calls before hanging "
++"up or going to voicemail, if the voicemail is installed and enabled."
++msgstr ""
++
++msgid "Space-Separated List of Blacklisted Numbers"
++msgstr "以空格分隔的黑å單號碼列表"
++
++msgid "Specify numbers individually here. Press enter to add more numbers."
++msgstr "在此指定ç¨ç«‹è™Ÿç¢¼. 按enter å¯æ–°å¢žæ›´å¤šè™Ÿç¢¼"
++
++msgid ""
++"Specify numbers individually here. Press enter to add more numbers. You will "
++"have to experiment with what country and area codes you need to add to the "
++"number."
++msgstr ""
++
++msgid ""
++"The number(s) specified above will be able to dial out with this user's "
++"providers. Invalid usernames, including users not enabled for outgoing "
++"calls, are dropped silently. Please verify that the entry was accepted."
++msgstr ""
++
++msgid ""
++"This configuration page allows you to configure a phone system (PBX) service "
++"which permits making phone calls through multiple Google and SIP (like "
++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP "
++"devices. Note that Google accounts, SIP accounts, and local user accounts "
++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User "
++"Accounts\" sub-sections. You must add at least one User Account to this PBX, "
++"and then configure a SIP device or softphone to use the account, in order to "
++"make and receive calls with your Google/SIP accounts. Configuring multiple "
++"users will allow you to make free calls between all users, and share the "
++"configured Google and SIP accounts. If you have more than one Google and SIP "
++"accounts set up, you should probably configure how calls to and from them "
++"are routed in the \"Call Routing\" page. If you're interested in using your "
++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section "
++"in the \"Advanced Settings\" page."
++msgstr ""
++
++msgid ""
++"This is the name that the VoIP server will use to identify itself when "
++"registering to VoIP (SIP) providers. Some providers require this to a "
++"specific string matching a hardware SIP device."
++msgstr ""
++
++msgid ""
++"This is where you indicate which Google/SIP accounts are used to call what "
++"country/area codes, which users can use what SIP/Google accounts, how "
++"incoming calls are routed, what numbers can get into this PBX with a "
++"password, and what numbers are blacklisted."
++msgstr ""
++
++msgid ""
++"This is where you set up your Google (Talk and Voice) Accounts, in order to "
++"start using them for dialing and receiving calls (voice chat and real phone "
++"calls). Please make at least one voice call using the Google Talk plugin "
++"installable through the GMail interface, and then log out from your account "
++"everywhere. Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, "
++"SipSorcery, the popular Betamax providers, and any other providers with SIP "
++"settings in order to start using them for dialing and receiving calls (SIP "
++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish."
++msgstr ""
++
++msgid ""
++"This option should be set to \"Yes\" if you have a DID (real telephone "
++"number) associated with this SIP account or want to receive SIP uri calls "
++"through this provider."
++msgstr ""
++
++msgid ""
++"This section contains settings that do not need to be changed under normal "
++"circumstances. In addition, here you can configure your system for use with "
++"remote SIP devices, and resolve call quality issues by enabling the "
++"insertion of QoS rules."
++msgstr ""
++
++msgid ""
++"Use (four to five digit) numeric user name if you are connecting normal "
++"telephones with ATAs to this system (so they can dial user names)."
++msgstr ""
++
++msgid ""
++"Use this account to make outgoing calls as configured in the \"Call Routing"
++"\" section."
++msgstr ""
++
++msgid "Use this account to make outgoing calls."
++msgstr "使用這個帳號外撥."
++
++msgid "User Accounts"
++msgstr "使用者帳號"
++
++msgid "User Agent String"
++msgstr "用戶代ç†å­—串"
++
++msgid "User Name"
++msgstr "用戶å稱"
++
++msgid "Uses providers enabled for outgoing calls"
++msgstr "採用供應商啟用以便外撥"
++
++msgid ""
++"When somebody starts voice chat with your GTalk account or calls the GVoice, "
++"number (if you have Google Voice), the call will be forwarded to any users "
++"that are online (registered using a SIP device or softphone) and permitted "
++"to receive the call. If you have Google Voice, you must go to your GVoice "
++"settings and forward calls to Google chat in order to actually receive calls "
++"made to your GVoice number. If you have trouble receiving calls from GVoice, "
++"experiment with the Call Screening option in your GVoice Settings. Finally, "
++"make sure no other client is online with this account (browser in gmail, "
++"mobile/desktop Google Talk App) as it may interfere."
++msgstr ""
++
++msgid ""
++"When your password is saved, it disappears from this field and is not "
++"displayed for your protection. The previously saved password will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++
++msgid "Yes"
++msgstr "是"
++
++msgid ""
++"You can enter your domain name, external IP address, or dynamic domain name "
++"here. The best thing to input is a static IP address. If your IP address is "
++"dynamic and it changes, your configuration will become invalid. Hence, it's "
++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS "
++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package."
++msgstr ""
++
++msgid "You can specify a real name to show up in the Caller ID here."
++msgstr "ä½ å¯ä»¥åœ¨æ­¤æŒ‡å®šä¸€å€‹çœŸå¯¦å稱以便顯示在來電ID"
++
++msgid ""
++"You can use your SIP devices/softphones with this system from a remote "
++"location as well, as long as your Internet Service Provider gives you a "
++"public IP. You will be able to call other local users for free (e.g. other "
++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls "
++"as if you were local to the PBX. After configuring this tab, go back to "
++"where users are configured and see the new Server and Port setting you need "
++"to configure the remote SIP devices with. Please note that if this PBX is "
++"not running on your router/gateway, you will need to configure port "
++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP "
++"port and RTP range) to the IP address of the device running this PBX."
++msgstr ""
++"ä¸ç®¡å¤šé ,åªè¦èƒ½å–å¾—ISPæ供的公眾åˆæ³•IP,ä¾ç„¶å¯ä»¥ä½¿ç”¨é€™å€‹ç³»çµ±çš„SIP設備/PC電話表"
++"ç¾ä¸€æ¨£çš„好.你將能夠å…費呼å«å…¶ä»–本地端用戶(e.g 其它類比電話機(ATAs)和使用你的"
++"VoIP供應商講電話就åƒä½ åœ¨ä½¿ç”¨æœ¬åœ°çš„PBX總機電話一樣.在設定這個標籤後, 需回到用"
++"戶設定並且查看新的伺æœå™¨å’ŒåŸ è¨­å®šä»¥ä¾¿èƒ½è¨­å®šé ç«¯SIP設備.請注æ„å‡å¦‚PBX總機若ä¸åœ¨"
++"你的路由器/GW上執行,你將必須在你的路由器/GW上設定埠轉發(NAT).在PBX主機上請轉"
++"發下列(SIP埠+RTP所採用的範åœåŸ )埠號å€å®šåˆ°è·‘PBXæœå‹™è¨­å‚™ä¸Šçš„IPä½å€."
++
++msgid ""
++"Your PIN disappears when saved for your protection. It will be changed only "
++"when you enter a value different from the saved one. Leaving the PIN empty "
++"is possible, but please beware of the security implications."
++msgstr ""
++"當存檔時為ä¿è­·èµ·è¦‹ä½ çš„PIN碼將ä¸æœƒé¡¯ç¤º. 除éžä½ æ‰“å…¥ä¸åŒæ–¼åŽŸå§‹å­˜æª”的值它æ‰æœƒè®Š"
++"æ›´. 也å¯ä»¥æŠŠPIN碼ä¿ç•™ç©ºç™½, 但è¦æ防會有安全的隱憂."
++
++msgid ""
++"Your password disappears when saved for your protection. It will be changed "
++"only when you enter a value different from the saved one."
++msgstr ""
++"當存檔時為ä¿è­·èµ·è¦‹ä½ çš„密碼將ä¸æœƒé¡¯ç¤º. 除éžä½ æ‰“å…¥ä¸åŒæ–¼åŽŸå§‹å­˜æª”的值它æ‰æœƒè®Šæ›´."
++
++#~ msgid ""
++#~ "Designate numbers that are allowed to call through this system and which "
++#~ "user's privileges it will have."
++#~ msgstr "ä¾æ“šç³»çµ±å’Œæˆ¶ç”¨çš„權é™å…許通話的指定號碼"
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx
+new file mode 100644
+index 0000000..ca7c166
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx
+@@ -0,0 +1 @@
++config 'main' 'connection_status'
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-advanced b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-advanced
+new file mode 100644
+index 0000000..39da6f8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-advanced
+@@ -0,0 +1,5 @@
++config 'settings' 'advanced'
++ option 'useragent' 'PBX'
++ option 'ringtime' '30'
++ option 'rtpstart' '19850'
++ option 'rtpend' '19900'
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-calls b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-calls
+new file mode 100644
+index 0000000..822bd4a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-calls
+@@ -0,0 +1,7 @@
++config 'call_routing' 'outgoing_calls'
++
++config 'call_routing' 'incoming_calls'
++
++config 'call_routing' 'providers_user_can_use'
++
++config 'call_routing' 'blacklisting'
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-google b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-google
+new file mode 100644
+index 0000000..e69de29
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-users b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-users
+new file mode 100644
+index 0000000..a4277b1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-users
+@@ -0,0 +1 @@
++config 'user' 'server'
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-voip b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-voip
+new file mode 100644
+index 0000000..e69de29
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/init.d/pbx-asterisk b/feeds/luci/applications/luci-app-pbx/root/etc/init.d/pbx-asterisk
+new file mode 100755
+index 0000000..e05ae11
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/init.d/pbx-asterisk
+@@ -0,0 +1,837 @@
++#!/bin/sh /etc/rc.common
++#
++# Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
++#
++# This file is part of luci-pbx.
++#
++# luci-pbx is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 3 of the License, or
++# (at your option) any later version.
++#
++# luci-pbx is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with luci-pbx. If not, see <http://www.gnu.org/licenses/>.
++
++. /lib/functions.sh
++
++START=60
++
++# Some global variables
++MODULENAME=pbx
++USERAGENT="PBX"
++HANGUPCNTXT=hangup-call-context
++GTALKUNVL=unavailable
++
++ASTUSER=nobody
++ASTGROUP=nogroup
++ASTDIRSRECURSIVE="/var/run/asterisk /var/log/asterisk /var/spool/asterisk"
++ASTDIRS="/usr/lib/asterisk"
++ASTSOUNDSDIR="/usr/lib/asterisk/sounds"
++
++TEMPLATEDIR=/etc/${MODULENAME}-asterisk
++PBXSOUNDSDIR=$TEMPLATEDIR/sounds
++VMTEMPLATEDIR=/etc/${MODULENAME}-voicemail
++VMSOUNDSDIR=$VMTEMPLATEDIR/sounds
++ASTERISKDIR=/etc/asterisk
++WORKDIR=/tmp/$MODULENAME.$$
++MD5SUMSFILE=/tmp/$MODULENAME-sums.$$
++
++TMPL_ASTERISK=$TEMPLATEDIR/asterisk.conf.TEMPLATE
++TMPL_GTALK=$TEMPLATEDIR/gtalk.conf.TEMPLATE
++TMPL_INDICATIONS=$TEMPLATEDIR/indications.conf.TEMPLATE
++TMPL_LOGGER=$TEMPLATEDIR/logger.conf.TEMPLATE
++TMPL_MANAGER=$TEMPLATEDIR/manager.conf.TEMPLATE
++TMPL_MODULES=$TEMPLATEDIR/modules.conf.TEMPLATE
++TMPL_RTP=$TEMPLATEDIR/rtp.conf.TEMPLATE
++
++TMPL_EXTCTHRUCHECKHDR=$TEMPLATEDIR/extensions_disa-check_header.conf.TEMPLATE
++TMPL_EXTCTHRUCHECK=$TEMPLATEDIR/extensions_disa-check.conf.TEMPLATE
++TMPL_EXTCTHRUCHECKFTR=$TEMPLATEDIR/extensions_disa-check_footer.conf.TEMPLATE
++TMPL_EXTCTHRUHDR=$TEMPLATEDIR/extensions_disa_header.conf.TEMPLATE
++TMPL_EXTCTHRU=$TEMPLATEDIR/extensions_disa.conf.TEMPLATE
++TMPL_EXTCTHRUNOPIN=$TEMPLATEDIR/extensions_disa-nopin.conf.TEMPLATE
++
++TMPL_EXTCBACKCHECKHDR=$TEMPLATEDIR/extensions_callback-check_header.conf.TEMPLATE
++TMPL_EXTCBACKCHECK=$TEMPLATEDIR/extensions_callback-check.conf.TEMPLATE
++TMPL_EXTCBACKCHECKFTR=$TEMPLATEDIR/extensions_callback-check_footer.conf.TEMPLATE
++TMPL_EXTCBACKHDR=$TEMPLATEDIR/extensions_callback_header.conf.TEMPLATE
++TMPL_EXTCBACKSIP=$TEMPLATEDIR/extensions_callback_sip.conf.TEMPLATE
++TMPL_EXTCBACKGTALK=$TEMPLATEDIR/extensions_callback_gtalk.conf.TEMPLATE
++
++TMPL_EXTENSIONS=$TEMPLATEDIR/extensions.conf.TEMPLATE
++
++TMPL_EXTVMDISABLED=$TEMPLATEDIR/extensions_voicemail_disabled.conf.TEMPLATE
++TMPL_EXTVMENABLED=$TEMPLATEDIR/extensions_voicemail_enabled.conf.TEMPLATE
++
++TMPL_EXTBLKLIST=$TEMPLATEDIR/extensions_blacklist.conf.TEMPLATE
++TMPL_EXTBLKLISTFTR=$TEMPLATEDIR/extensions_blacklist_footer.conf.TEMPLATE
++TMPL_EXTBLKLISTHDR=$TEMPLATEDIR/extensions_blacklist_header.conf.TEMPLATE
++
++TMPL_EXTDEFAULT=$TEMPLATEDIR/extensions_default.conf.TEMPLATE
++TMPL_EXTDEFAULTUSER=$TEMPLATEDIR/extensions_default_user.conf.TEMPLATE
++
++TMPL_EXTINCNTXTSIP=$TEMPLATEDIR/extensions_incoming_context_sip.conf.TEMPLATE
++TMPL_EXTINCNTXTGTALKHDR=$TEMPLATEDIR/extensions_incoming_context_gtalk_header.conf.TEMPLATE
++TMPL_EXTINCNTXTGTALK=$TEMPLATEDIR/extensions_incoming_context_gtalk.conf.TEMPLATE
++
++TMPL_EXTUSERCNTXT=$TEMPLATEDIR/extensions_user_context.conf.TEMPLATE
++TMPL_EXTUSERCNTXTFTR=$TEMPLATEDIR/extensions_user_context_footer.conf.TEMPLATE
++TMPL_EXTUSERCNTXTHDR=$TEMPLATEDIR/extensions_user_context_header.conf.TEMPLATE
++
++TMPL_EXTOUTHDR=$TEMPLATEDIR/extensions_default_outgoing_header.conf.TEMPLATE
++TMPL_EXTOUTGTALK=$TEMPLATEDIR/extensions_outgoing_gtalk.conf.TEMPLATE
++TMPL_EXTOUTLOCAL=$TEMPLATEDIR/extensions_outgoing_dial_local_user.conf.TEMPLATE
++TMPL_EXTOUTSIP=$TEMPLATEDIR/extensions_outgoing_sip.conf.TEMPLATE
++
++TMPL_JABBER=$TEMPLATEDIR/jabber.conf.TEMPLATE
++TMPL_JABBERUSER=$TEMPLATEDIR/jabber_users.conf.TEMPLATE
++TMPL_SIP=$TEMPLATEDIR/sip.conf.TEMPLATE
++TMPL_SIPPEER=$TEMPLATEDIR/sip_peer.TEMPLATE
++TMPL_SIPREG=$TEMPLATEDIR/sip_registration.TEMPLATE
++TMPL_SIPUSR=$TEMPLATEDIR/sip_user.TEMPLATE
++
++TMPL_MSMTPDEFAULT=$VMTEMPLATEDIR/pbx-msmtprc-defaults.TEMPLATE
++TMPL_MSMTPACCOUNT=$VMTEMPLATEDIR/pbx-msmtprc-account.TEMPLATE
++TMPL_MSMTPAUTH=$VMTEMPLATEDIR/pbx-msmtprc-account-auth.TEMPLATE
++TMPL_MSMTPACCTDFLT=$VMTEMPLATEDIR/pbx-msmtprc-account-default.TEMPLATE
++
++
++INCLUDED_FILES="$WORKDIR/extensions_blacklist.conf $WORKDIR/extensions_callthrough.conf\
++ $WORKDIR/extensions_incoming.conf $WORKDIR/extensions_incoming_gtalk.conf\
++ $WORKDIR/extensions_user.conf $WORKDIR/jabber_users.conf\
++ $WORKDIR/sip_peers.conf $WORKDIR/sip_registrations.conf\
++ $WORKDIR/sip_users.conf $WORKDIR/extensions_voicemail.conf\
++ $WORKDIR/extensions_default.conf"
++
++
++# In this string, we concatenate all local users enabled to receive calls
++# readily formatted for the Dial command.
++localusers_to_ring=""
++
++# In this string, we keep a list of all users that are enabled for outgoing
++# calls. It is used at the end to create the user contexts.
++localusers_can_dial=""
++
++# In this string, we put together a space-separated list of provider names
++# (alphanumeric, with all non-alpha characters replaced with underscores),
++# which will be used to dial out by default (whose outgoing contexts will
++# be included in users' contexts by default.
++outbound_providers=""
++sip_outbound_providers=""
++gtalk_outbound_providers=""
++
++# Function which escapes non-alpha-numeric characters in a string
++escape_non_alpha() {
++ echo $@ | sed 's/\([^a-zA-Z0-9]\)/\\\1/g'
++}
++
++# Function which replaces non-alpha-numeric characters with an underscore
++sub_underscore_for_non_alpha() {
++ echo $@ | sed 's/[^a-zA-Z0-9]/_/g'
++}
++
++# Copies the template files which we don't edit.
++copy_unedited_templates_over()
++{
++ cp $TMPL_ASTERISK $WORKDIR/asterisk.conf
++ cp $TMPL_GTALK $WORKDIR/gtalk.conf
++ cp $TMPL_INDICATIONS $WORKDIR/indications.conf
++ cp $TMPL_LOGGER $WORKDIR/logger.conf
++ cp $TMPL_MANAGER $WORKDIR/manager.conf
++ cp $TMPL_MODULES $WORKDIR/modules.conf
++ # If this file isn't present at this stage, voicemail is disabled.
++ [ ! -f $WORKDIR/extensions_voicemail.conf ] && \
++ cp $TMPL_EXTVMDISABLED $WORKDIR/extensions_voicemail.conf
++}
++
++# Touches all the included files, to prevent asterisk from refusing to
++# start if a config item is missing and an included config file isn't created.
++create_included_files()
++{
++ touch $INCLUDED_FILES
++}
++
++# Puts together all the extensions.conf related configuration.
++pbx_create_extensions_config()
++{
++ local ringtime
++ config_get ringtime advanced ringtime
++
++ sed "s/|RINGTIME|/$ringtime/" $TMPL_EXTENSIONS > $WORKDIR/extensions.conf
++ mv $WORKDIR/inext.TMP $WORKDIR/extensions_incoming.conf
++ cp $TMPL_EXTINCNTXTGTALKHDR $WORKDIR/extensions_incoming_gtalk.conf
++ cat $WORKDIR/outextgtalk.TMP >> $WORKDIR/extensions_incoming_gtalk.conf 2>/dev/null
++ rm -f $WORKDIR/outextgtalk.TMP
++ mv $WORKDIR/blacklist.TMP $WORKDIR/extensions_blacklist.conf
++ mv $WORKDIR/userext.TMP $WORKDIR/extensions_user.conf
++
++ cp $TMPL_EXTCTHRUHDR $WORKDIR/extensions_callthrough.conf
++ cat $WORKDIR/callthrough.TMP >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
++ rm -f $WORKDIR/callthrough.TMP
++ cat $TMPL_EXTCTHRUCHECKHDR >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
++ cat $WORKDIR/callthroughcheck.TMP >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
++ rm -f $WORKDIR/callthroughcheck.TMP
++ cat $TMPL_EXTCTHRUCHECKFTR >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
++
++ cp $TMPL_EXTCBACKHDR $WORKDIR/extensions_callback.conf
++ cat $WORKDIR/callback.TMP >> $WORKDIR/extensions_callback.conf 2>/dev/null
++ rm -f $WORKDIR/callback.TMP
++ cat $TMPL_EXTCBACKCHECKHDR >> $WORKDIR/extensions_callback.conf 2>/dev/null
++ cat $WORKDIR/callbackcheck.TMP >> $WORKDIR/extensions_callback.conf 2>/dev/null
++ rm -f $WORKDIR/callbackcheck.TMP
++ cat $TMPL_EXTCBACKCHECKFTR >> $WORKDIR/extensions_callback.conf 2>/dev/null
++
++ rm -f $WORKDIR/outext-*.TMP
++ rm -f $WORKDIR/localext.TMP
++ sed "s/|LOCALUSERS|/$localusers_to_ring/g" $TMPL_EXTDEFAULT \
++ > $WORKDIR/extensions_default.conf
++ cat $WORKDIR/inextuser.TMP >> $WORKDIR/extensions_default.conf
++ rm -f $WORKDIR/inextuser.TMP
++}
++
++# Puts together all the sip.conf related configuration.
++pbx_create_sip_config()
++{
++ mv $WORKDIR/sip_regs.TMP $WORKDIR/sip_registrations.conf
++ mv $WORKDIR/sip_peers.TMP $WORKDIR/sip_peers.conf
++ mv $WORKDIR/sip_users.TMP $WORKDIR/sip_users.conf
++}
++
++# Creates the jabber.conf related config
++pbx_create_jabber_config()
++{
++ cp $TMPL_JABBER $WORKDIR/jabber.conf
++ mv $WORKDIR/jabber.TMP $WORKDIR/jabber_users.conf
++}
++
++# Gets rid of any config files from $ASTERISKDIR not found in $WORKDIR.
++clean_up_asterisk_config_dir()
++{
++ for f in $ASTERISKDIR/* ; do
++ basef="`basename $f`"
++ if [ ! -e "$WORKDIR/$basef" ] ; then
++ rm -rf "$f"
++ fi
++ done
++}
++
++# Compares md5sums of the config files in $WORKDIR to those
++# in $ASTERISKDIR, and copies only changed files over to reduce
++# wear on flash in embedded devices.
++compare_configs_and_copy_changed()
++{
++ # First, compute md5sums of the config files in $WORKDIR.
++ cd $WORKDIR/
++ md5sum * > $MD5SUMSFILE
++
++ # Now, check the files in $ASTERISKDIR against the md5sums.
++ cd $ASTERISKDIR/
++ changed_files="`md5sum -c $MD5SUMSFILE 2>/dev/null | fgrep ": FAILED" | awk -F: '{print $1}'`"
++
++ rm -f $MD5SUMSFILE
++
++ [ -z "$changed_files" ] && return
++
++ # Now copy over the changed files.
++ for f in $changed_files ; do
++ cp "$WORKDIR/$f" "$ASTERISKDIR/$f"
++ done
++}
++
++# Calls the functions that create the final config files
++# Calls the function which compares which files have changed
++# Puts the final touches on $ASTERISKDIR
++# Gets rid of $WORKDIR
++pbx_assemble_and_copy_config()
++{
++ mkdir -p $ASTERISKDIR
++
++ copy_unedited_templates_over
++ create_included_files
++ pbx_create_extensions_config
++ pbx_create_sip_config
++ pbx_create_jabber_config
++
++ touch $WORKDIR/features.conf
++
++ # At this point, $WORKDIR should contain a complete, working config.
++ clean_up_asterisk_config_dir
++
++ compare_configs_and_copy_changed
++
++ [ ! -d $ASTERISKDIR/manager.d ] && mkdir -p $ASTERISKDIR/manager.d/
++
++ # Get rid of the working directory
++ rm -rf $WORKDIR/
++}
++
++# Creates configuration for a user and adds it to the temporary file that holds
++# all users configured so far.
++pbx_add_user()
++{
++ local fullname
++ local defaultuser
++ local rawdefaultuser
++ local secret
++ local ring
++ local can_call
++
++ config_get fullname $1 fullname
++ fullname=`escape_non_alpha $fullname`
++ config_get rawdefaultuser $1 defaultuser
++ defaultuser=`escape_non_alpha $rawdefaultuser`
++ config_get secret $1 secret
++ secret=`escape_non_alpha $secret`
++ config_get ring $1 ring
++ config_get can_call $1 can_call
++
++ [ -z "$defaultuser" -o -z "$secret" ] && return
++ [ -z "$fullname" ] && fullname="$defaultuser"
++
++ sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPUSR > $WORKDIR/sip_user.tmp
++
++ if [ "$can_call" = "yes" ] ; then
++ # Add user to list of all users that are allowed to make calls.
++ localusers_can_dial="$localusers_can_dial $rawdefaultuser"
++ sed -i "s/|CONTEXTNAME|/$defaultuser/g" $WORKDIR/sip_user.tmp
++ else
++ sed -i "s/|CONTEXTNAME|/$HANGUPCNTXT/g" $WORKDIR/sip_user.tmp
++ fi
++
++ # Add this user's configuration to the temp file containing all user configs.
++ sed "s/|FULLNAME|/$fullname/" $WORKDIR/sip_user.tmp |\
++ sed "s/|SECRET|/$secret/g" >> $WORKDIR/sip_users.TMP
++
++ if [ "$ring" = "yes" ] ; then
++ if [ -z "$localusers_to_ring" ] ; then
++ localusers_to_ring="SIP\/$defaultuser"
++ else
++ localusers_to_ring="$localusers_to_ring\&SIP\/$defaultuser"
++ fi
++ fi
++
++ # Add configuration which allows local users to call each other.
++ sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_EXTOUTLOCAL >> $WORKDIR/localext.TMP
++
++ # Add configuration which puts calls to users through the default
++ # context, so that blacklists and voicemail take effect for this user.
++ sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_EXTDEFAULTUSER >> $WORKDIR/inextuser.TMP
++
++ rm -f $WORKDIR/sip_user.tmp
++}
++
++# Creates configuration for a Google account, and adds it to the temporary file that holds
++# all accounts configured so far.
++# Also creates the outgoing extensions which are used in users' outgoing contexts.
++pbx_add_jabber()
++{
++ local username
++ local secret
++ local numprefix
++ local register
++ local make_outgoing_calls
++ local name
++ local users_to_ring
++ local status
++ local statusmessage
++
++ config_get username $1 username
++ username=`escape_non_alpha $username`
++ config_get secret $1 secret
++ secret=`escape_non_alpha $secret`
++ #TODO: Is this really necessary here? Numprefix is retrieved below.
++ config_get numprefix $1 numprefix
++ config_get register $1 register
++ config_get make_outgoing_calls $1 make_outgoing_calls
++ config_get name $1 name
++ config_get status $1 status
++ status=`escape_non_alpha $status`
++ config_get statusmessage $1 statusmessage
++ statusmessage=`escape_non_alpha $statusmessage`
++
++ [ -z "$username" -o -z "$secret" ] && return
++
++ # Construct a jabber entry for this provider.
++ sed "s/|USERNAME|/$username/g" $TMPL_JABBERUSER |\
++ sed "s/|NAME|/$name/g" > $WORKDIR/jabber.tmp
++
++ if [ "$register" = yes ] ; then
++ # If this provider is enabled for incoming calls, we need to set the
++ # status of the user to something other than unavailable in order to receive calls.
++ sed -i "s/|STATUS|/$status/g" $WORKDIR/jabber.tmp
++ sed -i "s/|STATUSMESSAGE|/\"$statusmessage\"/g" $WORKDIR/jabber.tmp
++
++ users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`"
++ # If no users have been specified to ring, we ring all users enabled for incoming calls.
++ if [ -z "$users_to_ring" ] ; then
++ users_to_ring=$localusers_to_ring
++ else
++ # Else, we cook up a string formatted for the Dial command
++ # with the specified users (SIP/user1&SIP/user2&...). We do it
++ # with set, shift and a loop in order to be more tolerant of ugly whitespace
++ # messes entered by users.
++ set $users_to_ring
++ users_to_ring="SIP\/$1" && shift
++ for u in $@ ; do u=`escape_non_alpha $u` ; users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done
++ fi
++
++ # Now, we add this account to the gtalk incoming context.
++ sed "s/|USERNAME|/$username/g" $TMPL_EXTINCNTXTGTALK |\
++ sed "s/|LOCALUSERS|/$users_to_ring/g" >> $WORKDIR/outextgtalk.TMP
++ else
++ sed -i "s/|STATUS|/$GTALKUNVL/g" $WORKDIR/jabber.tmp
++ sed -i "s/|STATUSMESSAGE|/\"\"/g" $WORKDIR/jabber.tmp
++ fi
++
++ # Add this account's configuration to the temp file containing all account configs.
++ sed "s/|SECRET|/$secret/g" $WORKDIR/jabber.tmp >> $WORKDIR/jabber.TMP
++
++ # If this provider is enabled for outgoing calls.
++ if [ "$make_outgoing_calls" = "yes" ] ; then
++
++ numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`"
++
++ # If no prefixes are specified, then we use "X" which matches any prefix.
++ [ -z "$numprefix" ] && numprefix="X"
++
++ for p in $numprefix ; do
++ p=`escape_non_alpha $p`
++ sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTGTALK |\
++ sed "s/|NAME|/$name/g" >> $WORKDIR/outext-$name.TMP
++ done
++
++ # Add this provider to the list of enabled outbound providers.
++ if [ -z "$outbound_providers" ] ; then
++ outbound_providers="$name"
++ else
++ outbound_providers="$outbound_providers $name"
++ fi
++
++ # Add this provider to the list of enabled gtalk outbound providers.
++ if [ -z "$gtalk_outbound_providers" ] ; then
++ gtalk_outbound_providers="$name"
++ else
++ gtalk_outbound_providers="$gtalk_outbound_providers $name"
++ fi
++ fi
++
++ rm -f $WORKDIR/jabber.tmp
++}
++
++# Creates configuration for a SIP provider account, and adds it to the temporary file that holds
++# all accounts configured so far.
++# Also creates the outgoing extensions which are used in users' outgoing contexts.
++pbx_add_peer()
++{
++ local defaultuser
++ local secret
++ local host
++ local fromdomain
++ local register
++ local numprefix
++ local make_outgoing_calls
++ local name
++ local users_to_ring
++ local port
++ local outboundproxy
++
++ config_get defaultuser $1 defaultuser
++ defaultuser=`escape_non_alpha $defaultuser`
++ config_get secret $1 secret
++ secret=`escape_non_alpha $secret`
++ config_get host $1 host
++ host=`escape_non_alpha $host`
++ config_get port $1 port
++ config_get outbountproxy $1 outboundproxy
++ outbountproxy=`escape_non_alpha $outbountproxy`
++ config_get fromdomain $1 fromdomain
++ fromdomain=`escape_non_alpha $fromdomain`
++ config_get register $1 register
++ config_get numprefix $1 numprefix
++ config_get make_outgoing_calls $1 make_outgoing_calls
++ config_get name $1 name
++
++ [ -z "$defaultuser" -o -z "$secret" -o -z "$host" ] && return
++ [ -z "$fromdomain" ] && fromdomain=$host
++ [ -n "$port" ] && port="port=$port"
++ [ -n "$outboundproxy" ] && outboundproxy="outboundproxy=$outboundproxy"
++
++ # Construct a sip peer entry for this provider.
++ sed "s/|DEFAULTUSER|/$defaultuser/" $TMPL_SIPPEER > $WORKDIR/sip_peer.tmp
++ sed -i "s/|NAME|/$name/" $WORKDIR/sip_peer.tmp
++ sed -i "s/|FROMUSER|/$defaultuser/" $WORKDIR/sip_peer.tmp
++ sed -i "s/|SECRET|/$secret/" $WORKDIR/sip_peer.tmp
++ sed -i "s/|HOST|/$host/" $WORKDIR/sip_peer.tmp
++ sed -i "s/|PORT|/$port/" $WORKDIR/sip_peer.tmp
++ sed -i "s/|OUTBOUNDPROXY|/$outboundproxy/" $WORKDIR/sip_peer.tmp
++ # Add this account's configuration to the temp file containing all account configs.
++ sed "s/|FROMDOMAIN|/$host/" $WORKDIR/sip_peer.tmp >> $WORKDIR/sip_peers.TMP
++
++ # If this provider is enabled for incoming calls.
++ if [ "$register" = "yes" ] ; then
++ # Then we create a registration string for this provider.
++ sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPREG > $WORKDIR/sip_reg.tmp
++ sed -i "s/|SECRET|/$secret/g" $WORKDIR/sip_reg.tmp
++ sed "s/|NAME|/$name/g" $WORKDIR/sip_reg.tmp >> $WORKDIR/sip_regs.TMP
++
++ users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`"
++ # If no users have been specified to ring, we ring all users enabled for incoming calls.
++ if [ -z "$users_to_ring" ] ; then
++ users_to_ring=$localusers_to_ring
++ else
++ # Else, we cook up a string formatted for the Dial command
++ # with the specified users (SIP/user1&SIP/user2&...). We do it
++ # with set, shift and a loop in order to be more tolerant of ugly whitespace
++ # messes entered by users.
++ set $users_to_ring
++ users_to_ring="SIP\/$1" && shift
++ for u in $@ ; do users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done
++ fi
++
++ # And we create an incoming calls context for this provider.
++ sed "s/|NAME|/$name/g" $TMPL_EXTINCNTXTSIP |\
++ sed "s/|LOCALUSERS|/$users_to_ring/g" >> $WORKDIR/inext.TMP
++ fi
++
++ # If this provider is enabled for outgoing calls.
++ if [ "$make_outgoing_calls" = "yes" ] ; then
++
++ numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`"
++ # If no prefixes are specified, then we use "X" which matches any prefix.
++ [ -z "$numprefix" ] && numprefix="X"
++ for p in $numprefix ; do
++ p=`escape_non_alpha $p`
++ sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTSIP |\
++ sed "s/|NAME|/$name/g" >> $WORKDIR/outext-$name.TMP
++ done
++
++ # Add this provider to the list of enabled outbound providers.
++ if [ -z "$outbound_providers" ] ; then
++ outbound_providers="$name"
++ else
++ outbound_providers="$outbound_providers $name"
++ fi
++
++ # Add this provider to the list of enabled sip outbound providers.
++ if [ -z "$sip_outbound_providers" ] ; then
++ sip_outbound_providers="$name"
++ else
++ sip_outbound_providers="$sip_outbound_providers $name"
++ fi
++ fi
++
++ rm -f $WORKDIR/sip_peer.tmp
++ rm -f $WORKDIR/sip_reg.tmp
++}
++
++# For all local users enabled for outbound calls, creates a context
++# containing the extensions for Google and SIP accounts this user is
++# allowed to use.
++pbx_create_user_contexts()
++{
++ local providers
++
++ for u in $localusers_can_dial ; do
++ u=`escape_non_alpha $u`
++ sed "s/|DEFAULTUSER|/$u/g" $TMPL_EXTUSERCNTXTHDR >> $WORKDIR/userext.TMP
++ cat $WORKDIR/localext.TMP >> $WORKDIR/userext.TMP
++ providers="`uci -q get ${MODULENAME}-calls.providers_user_can_use.$u`"
++ [ -z "$providers" ] && providers="$outbound_providers"
++
++ # For each provider, cat the contents of outext-$name.TMP into the user's outgoing calls extension
++ for p in $providers ; do
++ [ -f $WORKDIR/outext-$p.TMP ] && cat $WORKDIR/outext-$p.TMP >> $WORKDIR/userext.TMP
++ done
++ cat $TMPL_EXTUSERCNTXTFTR >> $WORKDIR/userext.TMP
++ done
++}
++
++# Creates the blacklist context which hangs up on blacklisted numbers.
++pbx_add_blacklist()
++{
++ local blacklist1
++ local blacklist2
++
++ config_get blacklist1 blacklisting blacklist1
++ config_get blacklist2 blacklisting blacklist2
++
++ # We create the blacklist context no matter whether the blacklist
++ # actually contains entries or not, since the PBX will send calls
++ # to the context for a check against the list anyway.
++ cp $TMPL_EXTBLKLISTHDR $WORKDIR/blacklist.TMP
++ for n in $blacklist1 $blacklist2 ; do
++ n=`escape_non_alpha $n`
++ sed "s/|BLACKLISTITEM|/$n/g" $TMPL_EXTBLKLIST >> $WORKDIR/blacklist.TMP
++ done
++ cat $TMPL_EXTBLKLISTFTR >> $WORKDIR/blacklist.TMP
++}
++
++# Creates the callthrough context which allows specified numbers to get
++# into the PBX and dial out as the configured user.
++pbx_add_callthrough()
++{
++ local callthrough_number_list
++ local defaultuser
++ local pin
++ local enabled
++ local F
++
++ config_get callthrough_number_list $1 callthrough_number_list
++ config_get defaultuser $1 defaultuser
++ defaultuser=`escape_non_alpha $defaultuser`
++ config_get pin $1 pin
++ pin=`escape_non_alpha $pin`
++ config_get enabled $1 enabled
++
++ [ "$enabled" = "no" ] && return
++ [ "$defaultuser" = "" ] && return
++
++ for callthrough_number in $callthrough_number_list ; do
++ sed "s/|NUMBER|/$callthrough_number/g" $TMPL_EXTCTHRUCHECK >> $WORKDIR/callthroughcheck.TMP
++
++ if [ -n "$pin" ] ; then F=$TMPL_EXTCTHRU ; else F=$TMPL_EXTCTHRUNOPIN ; fi
++ sed "s/|NUMBER|/$callthrough_number/g" $F |\
++ sed "s/|DEFAULTUSER|/$defaultuser/" |\
++ sed "s/|PIN|/$pin/" >> $WORKDIR/callthrough.TMP
++ done
++}
++
++
++# Creates the callback context which allows specified numbers to get
++# a callback into the PBX and dial out as the configured user.
++pbx_add_callback()
++{
++ local callback_number_list
++ local defaultuser
++ local pin
++ local enabled
++ local callback_provider
++ local callback_hangup_delay
++ local FB
++ local FT
++
++ config_get callback_number_list $1 callback_number_list
++ config_get defaultuser $1 defaultuser
++ defaultuser=`escape_non_alpha $defaultuser`
++ config_get pin $1 pin
++ pin=`escape_non_alpha $pin`
++ config_get enabled $1 enabled
++ config_get callback_provider $1 callback_provider
++ callback_provider=`sub_underscore_for_non_alpha $callback_provider`
++ config_get callback_hangup_delay $1 callback_hangup_delay
++
++ [ "$enabled" = "no" ] && return
++ [ "$defaultuser" = "" ] && return
++
++ # If the provider is a SIP provider, set the file to use to $TMPL_EXTCBACKSIP
++ # otherwise, set it to $TMPL_EXTCBACKGTALK
++ if echo $sip_outbound_providers | grep -q $callback_provider 2>/dev/null
++ then
++ FB=$TMPL_EXTCBACKSIP
++ else
++ FB=$TMPL_EXTCBACKGTALK
++ fi
++
++ for callback_number in $callback_number_list ; do
++ sed "s/|NUMBER|/$callback_number/g" $TMPL_EXTCBACKCHECK >> $WORKDIR/callbackcheck.TMP
++
++ sed "s/|NUMBER|/$callback_number/g" $FB |\
++ sed "s/|CALLBACKPROVIDER|/$callback_provider/" |\
++ sed "s/|CALLBACKHUPDELAY|/$callback_hangup_delay/" >> $WORKDIR/callback.TMP
++
++ # Perhaps a bit confusingly, we create "callthrough" configuration for callback
++ # numbers, because we use the same DISA construct as for callthrough.
++ if [ -n "$pin" ] ; then FT=$TMPL_EXTCTHRU ; else FT=$TMPL_EXTCTHRUNOPIN ; fi
++ sed "s/|NUMBER|/$callback_number/g" $FT |\
++ sed "s/|DEFAULTUSER|/$defaultuser/" |\
++ sed "s/|PIN|/$pin/" >> $WORKDIR/callthrough.TMP
++ done
++}
++
++
++# Creates sip.conf from its template.
++pbx_cook_sip_template()
++{
++ local useragent
++ local externhost
++ local bindport
++
++ config_get useragent advanced useragent
++ useragent=`escape_non_alpha $useragent`
++ config_get externhost advanced externhost
++ config_get bindport advanced bindport
++
++ [ -z "$useragent" ] && useragent="$USERAGENT"
++
++ sed "s/|USERAGENT|/$useragent/g" $TMPL_SIP > $WORKDIR/sip.conf
++
++ if [ -z "$externhost" ] ; then
++ sed -i "s/externhost=|EXTERNHOST|//g" $WORKDIR/sip.conf
++ else
++ sed -i "s/|EXTERNHOST|/$externhost/g" $WORKDIR/sip.conf
++ fi
++
++ if [ -z "$bindport" ] ; then
++ sed -i "s/bindport=|BINDPORT|//g" $WORKDIR/sip.conf
++ else
++ sed -i "s/|BINDPORT|/$bindport/g" $WORKDIR/sip.conf
++ fi
++
++
++}
++
++# Creates rtp.conf from its template.
++pbx_cook_rtp_template()
++{
++ local rtpstart
++ local rtpend
++
++ config_get rtpstart advanced rtpstart
++ config_get rtpend advanced rtpend
++
++ sed "s/|RTPSTART|/$rtpstart/" $TMPL_RTP |\
++ sed "s/|RTPEND|/$rtpend/" > $WORKDIR/rtp.conf
++}
++
++# Links any sound files found in $PBXSOUNDSDIR and $VMSOUNDSDIR
++# into $ASTSOUNDSDIR for use by Asterisk. Does not overwrite files.
++pbx_link_sounds()
++{
++ mkdir -p $ASTSOUNDSDIR
++
++ for dir in $PBXSOUNDSDIR $VMSOUNDSDIR ; do
++ if [ -d $dir ] ; then
++ for f in $dir/* ; do
++ ln -s $f $ASTSOUNDSDIR 2>/dev/null
++ done
++ fi
++ done
++}
++
++
++# Makes sure the ownership of specified directories is proper.
++pbx_fix_ownership()
++{
++ chown $ASTUSER:$ASTGROUP $ASTDIRS
++ chown $ASTUSER:$ASTGROUP -R $ASTDIRSRECURSIVE
++}
++
++
++# Creates voicemail config if installed and enabled.
++pbx_configure_voicemail()
++{
++ local enabled
++ local global_timeout
++ local global_email_addresses
++
++ local smtp_tls
++ local smtp_server
++ local smtp_port
++ local smtp_auth
++ local smtp_user
++ local smtp_password
++
++ config_get enabled global_voicemail enabled
++
++ # First check if voicemail is enabled.
++ [ "$enabled" != "yes" ] && return
++
++ config_get global_timeout global_voicemail global_timeout
++ #config_get global_email_addresses global_voicemail global_email_addresses
++ config_get smtp_auth voicemail_smtp smtp_auth
++ config_get smtp_tls voicemail_smtp smtp_tls
++ config_get smtp_server voicemail_smtp smtp_server
++ config_get smtp_port voicemail_smtp smtp_port
++ config_get smtp_user voicemail_smtp smtp_user
++ smtp_user=`escape_non_alpha $smtp_user`
++ config_get smtp_password voicemail_smtp smtp_password
++ smtp_password=`escape_non_alpha $smtp_password`
++
++ sed "s/|AUTH|/$smtp_auth/" $TMPL_MSMTPDEFAULT |\
++ sed "s/|TLS|/$smtp_tls/" > $WORKDIR/pbx-msmtprc
++
++ sed "s/|HOST|/$smtp_server/" $TMPL_MSMTPACCOUNT |\
++ sed "s/|PORT|/$smtp_port/" >> $WORKDIR/pbx-msmtprc
++
++ if [ "$smtp_auth" = "on" ] ; then
++ sed "s/|USER|/$smtp_user/" $TMPL_MSMTPAUTH |\
++ sed "s/|PASSWORD|/$smtp_password/" >> $WORKDIR/pbx-msmtprc
++ fi
++
++ cat $TMPL_MSMTPACCTDFLT >> $WORKDIR/pbx-msmtprc
++
++ [ ! -f /etc/pbx-msmtprc ] && cp $WORKDIR/pbx-msmtprc /etc/pbx-msmtprc
++ cmp -s $WORKDIR/pbx-msmtprc /etc/pbx-msmtprc 1>/dev/null \
++ || mv $WORKDIR/pbx-msmtprc /etc/pbx-msmtprc
++ chmod 600 /etc/pbx-msmtprc
++ chown nobody /etc/pbx-msmtprc
++
++ # Copy over the extensions file which has voicemail enabled.
++ cp $TMPL_EXTVMENABLED $WORKDIR/extensions_voicemail.conf
++
++ # Create the voicemail directory in /tmp
++ mkdir -p /tmp/voicemail
++ chown nobody /tmp/voicemail
++
++ # Create the recordings directory
++ mkdir -p /etc/pbx-voicemail/recordings
++ chown nobody /etc/pbx-voicemail/recordings
++
++ # Working around a bug in OpenWRT 12.09-rc1
++ # TODO: REMOVE AS SOON AS POSSIBLE
++ chmod ugo+w /tmp
++}
++
++
++start() {
++ mkdir -p $WORKDIR
++
++ # Create the users.
++ config_load ${MODULENAME}-users
++ config_foreach pbx_add_user local_user
++
++ # Create configuration for each google account.
++ config_unset
++ config_load ${MODULENAME}-google
++ config_foreach pbx_add_jabber gtalk_jabber
++
++ # Create configuration for each voip provider.
++ config_unset
++ config_load ${MODULENAME}-voip
++ config_foreach pbx_add_peer voip_provider
++
++ # Create the user contexts, callthroug/back, and phone blacklist.
++ config_unset
++ config_load ${MODULENAME}-calls
++ pbx_create_user_contexts
++ pbx_add_blacklist
++ config_foreach pbx_add_callthrough callthrough_numbers
++ config_foreach pbx_add_callback callback_numbers
++
++ # Prepare sip.conf using settings from the "advanced" section.
++ config_unset
++ config_load ${MODULENAME}-advanced
++ pbx_cook_sip_template
++ pbx_cook_rtp_template
++
++ # Prepare voicemail config.
++ config_unset
++ config_load ${MODULENAME}-voicemail
++ pbx_configure_voicemail
++
++ # Assemble the configuration, and copy changed files over.
++ config_unset
++ config_load ${MODULENAME}-advanced
++ pbx_assemble_and_copy_config
++
++ # Link sound files
++ pbx_link_sounds
++
++ # Enforce ownership of specified files and directories.
++ pbx_fix_ownership
++}
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/asterisk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/asterisk.conf.TEMPLATE
+new file mode 100644
+index 0000000..ac54396
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/asterisk.conf.TEMPLATE
+@@ -0,0 +1,17 @@
++[directories]
++astetcdir => /etc/asterisk
++astmoddir => /usr/lib/asterisk/modules
++astvarlibdir => /usr/lib/asterisk
++astdbdir => /usr/lib/asterisk
++astkeydir => /usr/lib/asterisk
++astdatadir => /usr/lib/asterisk
++astagidir => /usr/lib/asterisk/agi-bin
++astspooldir => /var/spool/asterisk
++astrundir => /var/run/asterisk
++astlogdir => /var/log/asterisk
++
++[options]
++languageprefix = yes
++dumpcore = no
++runuser = nobody
++rungroup = nogroup
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/delayedcallback b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/delayedcallback
+new file mode 100755
+index 0000000..903efe9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/delayedcallback
+@@ -0,0 +1,18 @@
++#!/bin/sh
++
++# Check if there are more than one instance of this command
++# with the same command line running at the same time for some
++# reason, then quit. We are checking for the same
++# commandline in order to permit two different callback
++# attempts simultaneously.
++
++if ! grep -q "$@" /dev/shm/delayedcallback.[0-9]* 2>/dev/null
++then
++ echo "$@" > /dev/shm/delayedcallback.$$
++ sleep 25
++ asterisk -r -x "$1 $2 \"$3\" $4 $5 $6"
++ rm /dev/shm/delayedcallback.$$
++# echo "`date` $@": >> /dev/shm/delayedcallback.log
++#else
++# echo "`date` ERROR: There appears to be a callback attempt in progress to: $@" >> /dev/shm/delayedcallback.err
++fi
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions.conf.TEMPLATE
+new file mode 100644
+index 0000000..c8966ed
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions.conf.TEMPLATE
+@@ -0,0 +1,25 @@
++[general]
++static = yes
++writeprotect = yes
++clearglobalvars = no
++
++[globals]
++RINGTIME => |RINGTIME|
++
++[default]
++
++[context-user-hangup-call-context]
++exten => s,1,Hangup()
++exten => _X.,1,Hangup()
++
++[context-catch-all]
++exten => _[!-~].,1,Dial(SIP/${EXTEN},60,r)
++
++#include extensions_default.conf
++#include extensions_voicemail.conf
++#include extensions_incoming.conf
++#include extensions_incoming_gtalk.conf
++#include extensions_blacklist.conf
++#include extensions_callthrough.conf
++#include extensions_callback.conf
++#include extensions_user.conf
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist.conf.TEMPLATE
+new file mode 100644
+index 0000000..54ee989
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist.conf.TEMPLATE
+@@ -0,0 +1 @@
++exten => s,n,Gotoif($[ "${CALLERID(NUM)}" = "|BLACKLISTITEM|" ]?context-user-hangup,s,1)
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_footer.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_footer.conf.TEMPLATE
+new file mode 100644
+index 0000000..da964f2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_footer.conf.TEMPLATE
+@@ -0,0 +1,2 @@
++exten => s,n,Goto(${SOURCECONTEXT},${SOURCEEXTEN},doneblacklist)
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_header.conf.TEMPLATE
+new file mode 100644
+index 0000000..de0e984
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_header.conf.TEMPLATE
+@@ -0,0 +1,3 @@
++
++[blacklist-call-context]
++exten => s,1,Noop()
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check.conf.TEMPLATE
+new file mode 100644
+index 0000000..06b1a4b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check.conf.TEMPLATE
+@@ -0,0 +1 @@
++exten => s,n,Gotoif($[ "${CALLERID(NUM)}" =~ ".*|NUMBER|" ]?context-user-callback,|NUMBER|,1)
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_footer.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_footer.conf.TEMPLATE
+new file mode 100644
+index 0000000..282fe9e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_footer.conf.TEMPLATE
+@@ -0,0 +1,2 @@
++exten => s,n,Goto(${SOURCECONTEXT},${SOURCEEXTEN},donecallback)
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_header.conf.TEMPLATE
+new file mode 100644
+index 0000000..be289c4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_header.conf.TEMPLATE
+@@ -0,0 +1,3 @@
++
++[callback-check-call-context]
++exten => s,1,Noop()
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_gtalk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_gtalk.conf.TEMPLATE
+new file mode 100644
+index 0000000..43eec78
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_gtalk.conf.TEMPLATE
+@@ -0,0 +1,4 @@
++exten => |NUMBER|,1,System(/etc/pbx-asterisk/delayedcallback "channel originate Gtalk/gtalk-|CALLBACKPROVIDER|/|NUMBER|@voice.google.com extension |NUMBER|@disa-call-context" &)
++exten => |NUMBER|,n,Wait(|CALLBACKHUPDELAY|)
++exten => |NUMBER|,n,Hangup()
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_header.conf.TEMPLATE
+new file mode 100644
+index 0000000..0b8fb4c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_header.conf.TEMPLATE
+@@ -0,0 +1 @@
++[context-user-callback]
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_sip.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_sip.conf.TEMPLATE
+new file mode 100644
+index 0000000..300e9fa
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_sip.conf.TEMPLATE
+@@ -0,0 +1,4 @@
++exten => |NUMBER|,1,System(/etc/pbx-asterisk/delayedcallback "channel originate SIP/|NUMBER|@peer-|CALLBACKPROVIDER| extension |NUMBER|@disa-call-context" &)
++exten => |NUMBER|,n,Wait(|CALLBACKHUPDELAY|)
++exten => |NUMBER|,n,Hangup()
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default.conf.TEMPLATE
+new file mode 100644
+index 0000000..35836e2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default.conf.TEMPLATE
+@@ -0,0 +1,11 @@
++[default-incoming-call-context]
++exten => s,1,NoOp(${CALLERID})
++exten => s,n,Set(SOURCECONTEXT=default-incoming-call-context)
++exten => s,n,Set(SOURCEEXTEN=s)
++exten => s,n,Goto(blacklist-call-context,s,1)
++exten => s,n(doneblacklist),NoOp()
++exten => s,n,Goto(callback-check-call-context,s,1)
++exten => s,n(donecallback),NoOp()
++exten => s,n,Goto(disa-check-call-context,s,1)
++exten => s,n(donedisacheck),Dial(|LOCALUSERS|,${RINGTIME},r)
++exten => s,n,Goto(context-voicemail,s,1)
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default_user.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default_user.conf.TEMPLATE
+new file mode 100644
+index 0000000..1910ff4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default_user.conf.TEMPLATE
+@@ -0,0 +1 @@
++exten => |DEFAULTUSER|,1,Goto(default-incoming-call-context,s,1)
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check.conf.TEMPLATE
+new file mode 100644
+index 0000000..ba2379b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check.conf.TEMPLATE
+@@ -0,0 +1 @@
++exten => s,n,Gotoif($[ "${CALLERID(NUM)}" =~ ".*|NUMBER|" ]?disa-call-context,|NUMBER|,1)
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_footer.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_footer.conf.TEMPLATE
+new file mode 100644
+index 0000000..74056fa
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_footer.conf.TEMPLATE
+@@ -0,0 +1 @@
++exten => s,n,Goto(${SOURCECONTEXT},${SOURCEEXTEN},donedisacheck)
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_header.conf.TEMPLATE
+new file mode 100644
+index 0000000..e0d67b8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_header.conf.TEMPLATE
+@@ -0,0 +1,2 @@
++[disa-check-call-context]
++exten => s,1,Noop()
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-nopin.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-nopin.conf.TEMPLATE
+new file mode 100644
+index 0000000..74e48de
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-nopin.conf.TEMPLATE
+@@ -0,0 +1,5 @@
++exten => |NUMBER|,1,Noop()
++exten => |NUMBER|,n,Set(TIMEOUT(digit)=15)
++exten => |NUMBER|,n,Set(TIMEOUT(response)=40)
++exten => |NUMBER|,n,DISA(no-password,context-user-|DEFAULTUSER|)
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa.conf.TEMPLATE
+new file mode 100644
+index 0000000..3dd8fa3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa.conf.TEMPLATE
+@@ -0,0 +1,6 @@
++exten => |NUMBER|,1,Noop()
++exten => |NUMBER|,n,Set(TIMEOUT(digit)=7)
++exten => |NUMBER|,n,Set(TIMEOUT(response)=21)
++exten => |NUMBER|,n,Authenticate(|PIN|)
++exten => |NUMBER|,n,DISA(no-password,context-user-|DEFAULTUSER|)
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa_header.conf.TEMPLATE
+new file mode 100644
+index 0000000..a742271
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa_header.conf.TEMPLATE
+@@ -0,0 +1 @@
++[disa-call-context]
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk.conf.TEMPLATE
+new file mode 100644
+index 0000000..3f9cf4c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk.conf.TEMPLATE
+@@ -0,0 +1,15 @@
++exten => |USERNAME|,1,NoOp(${CALLERID})
++same => n,Set(CALLERID(name)=${CUT(CALLERID(name),@,1)})
++same => n,GotoIf($["${CALLERID(name):0:2}" != "+1"]?notrim)
++same => n,Set(CALLERID(name)=${CALLERID(name):2})
++same => n(notrim),Set(CALLERID(number)=${CALLERID(name)})
++same => n,Set(SOURCECONTEXT=context-incoming-gtalk)
++same => n,Set(SOURCEEXTEN=|USERNAME|)
++same => n,Goto(blacklist-call-context,s,1)
++same => n(doneblacklist),NoOp()
++same => n,Goto(callback-check-call-context,s,1)
++same => n(donecallback),NoOp()
++same => n,Goto(disa-check-call-context,s,1)
++same => n(donedisacheck),Dial(|LOCALUSERS|,${RINGTIME},D(:w11111111))
++same => n,Goto(context-voicemail,s,1)
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk_header.conf.TEMPLATE
+new file mode 100644
+index 0000000..f6e44a5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk_header.conf.TEMPLATE
+@@ -0,0 +1 @@
++[context-incoming-gtalk]
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_sip.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_sip.conf.TEMPLATE
+new file mode 100644
+index 0000000..b2c3716
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_sip.conf.TEMPLATE
+@@ -0,0 +1,12 @@
++
++[context-incoming-|NAME|]
++exten => s,1,NoOp(${CALLERID})
++exten => s,n,Set(SOURCECONTEXT=context-incoming-|NAME|)
++exten => s,n,Set(SOURCEEXTEN=s)
++exten => s,n,Goto(blacklist-call-context,s,1)
++exten => s,n(doneblacklist),NoOp()
++exten => s,n,Goto(callback-check-call-context,s,1)
++exten => s,n(donecallback),NoOp()
++exten => s,n,Goto(disa-check-call-context,s,1)
++exten => s,n(donedisacheck),Dial(|LOCALUSERS|,${RINGTIME},r)
++exten => s,n,Goto(context-voicemail,s,1)
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_dial_local_user.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_dial_local_user.conf.TEMPLATE
+new file mode 100644
+index 0000000..45e8758
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_dial_local_user.conf.TEMPLATE
+@@ -0,0 +1 @@
++exten => |DEFAULTUSER|,1,Dial(SIP/|DEFAULTUSER|,${RINGTIME},r)
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_gtalk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_gtalk.conf.TEMPLATE
+new file mode 100644
+index 0000000..259c2ce
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_gtalk.conf.TEMPLATE
+@@ -0,0 +1,9 @@
++exten => _|NUMPREFIX|,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN}@voice.google.com,60)
++exten => _+|NUMPREFIX|,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:1}@voice.google.com,60)
++exten => _|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN}@voice.google.com,60)
++exten => _+|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:1}@voice.google.com,60)
++exten => _00|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:2}@voice.google.com,60)
++exten => _011|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:3}@voice.google.com,60)
++exten => _010|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:3}@voice.google.com,60)
++exten => _0011|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:4}@voice.google.com,60)
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_gtalk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_gtalk.conf.TEMPLATE
+new file mode 100644
+index 0000000..1fa7713
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_gtalk.conf.TEMPLATE
+@@ -0,0 +1,2 @@
++exten => |PATTERN|,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN|SYMBOLSTOREMOVE|}@voice.google.com,60)
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_sip.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_sip.conf.TEMPLATE
+new file mode 100644
+index 0000000..178b6de
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_sip.conf.TEMPLATE
+@@ -0,0 +1 @@
++exten => |PATTERN|,1,Dial(SIP/${EXTEN|SYMBOLSTOREMOVE|}@peer-|NAME|,60,r)
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_sip.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_sip.conf.TEMPLATE
+new file mode 100644
+index 0000000..9b1d9ad
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_sip.conf.TEMPLATE
+@@ -0,0 +1,8 @@
++exten => _|NUMPREFIX|,1,Dial(SIP/${EXTEN}@peer-|NAME|,60,r)
++exten => _+|NUMPREFIX|,1,Dial(SIP/${EXTEN}@peer-|NAME|,60,r)
++exten => _|NUMPREFIX|.,1,Dial(SIP/${EXTEN}@peer-|NAME|,60,r)
++exten => _+|NUMPREFIX|.,1,Dial(SIP/${EXTEN:1}@peer-|NAME|,60,r)
++exten => _00|NUMPREFIX|.,1,Dial(SIP/${EXTEN:2}@peer-|NAME|,60,r)
++exten => _011|NUMPREFIX|.,1,Dial(SIP/${EXTEN:3}@peer-|NAME|,60,r)
++exten => _010|NUMPREFIX|.,1,Dial(SIP/${EXTEN:3}@peer-|NAME|,60,r)
++exten => _0011|NUMPREFIX|.,1,Dial(SIP/${EXTEN:4}@peer-|NAME|,60,r)
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_footer.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_footer.conf.TEMPLATE
+new file mode 100644
+index 0000000..a2ba28c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_footer.conf.TEMPLATE
+@@ -0,0 +1,2 @@
++include => context-voicemail-record-greeting
++include => context-catch-all
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_header.conf.TEMPLATE
+new file mode 100644
+index 0000000..5931eaf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_header.conf.TEMPLATE
+@@ -0,0 +1,3 @@
++
++[context-user-|DEFAULTUSER|]
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_disabled.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_disabled.conf.TEMPLATE
+new file mode 100644
+index 0000000..be23c29
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_disabled.conf.TEMPLATE
+@@ -0,0 +1,4 @@
++[context-voicemail-record-greeting]
++
++[context-voicemail]
++exten => s,1,Hangup()
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_enabled.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_enabled.conf.TEMPLATE
+new file mode 100644
+index 0000000..4edd9cb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_enabled.conf.TEMPLATE
+@@ -0,0 +1,27 @@
++[context-voicemail-record-greeting]
++exten => *789,1,Wait(1)
++exten => *789,n,Playback(/etc/pbx-voicemail/recordings/greeting)
++exten => *789,n,Wait(1)
++exten => *789,n,Playback(beep)
++exten => *789,n,Playback(beep)
++exten => *789,n,WaitExten(30)
++
++exten => t,1,Playback(vm-goodbye)
++exten => t,n,Wait(2)
++exten => t,n,Hangup()
++
++exten => *,1,Playback(beep)
++exten => *,n,Playback(beep)
++exten => *,n,Record(/tmp/voicemail/greeting:gsm,20,120,k)
++exten => *,n,Wait(1)
++exten => *,n,Playback(/tmp/voicemail/greeting)
++
++exten => h,1,System(/etc/pbx-voicemail/pbx-move-greeting &)
++
++[context-voicemail]
++exten => s,1,Wait(2)
++exten => s,2,Playback(/etc/pbx-voicemail/recordings/greeting)
++exten => s,3,Wait(2)
++exten => s,n,Record(/tmp/voicemail/voicemail%d:WAV,20,180,k)
++
++exten => h,1,System(/etc/pbx-voicemail/pbx-send-voicemail '${RECORDED_FILE}.WAV' '${CALLERID(all)}' &)
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/gtalk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/gtalk.conf.TEMPLATE
+new file mode 100644
+index 0000000..4f07a71
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/gtalk.conf.TEMPLATE
+@@ -0,0 +1,10 @@
++[general]
++context=context-incoming-gtalk
++allowguest=yes
++allowguests=yes
++bindaddr=0.0.0.0
++
++[guest]
++disallow=all
++allow=ulaw
++context=context-incoming-gtalk
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/indications.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/indications.conf.TEMPLATE
+new file mode 100644
+index 0000000..d7088db
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/indications.conf.TEMPLATE
+@@ -0,0 +1,733 @@
++; indications.conf
++; Configuration file for location specific tone indications
++; used by the pbx_indications module.
++;
++; NOTE:
++; When adding countries to this file, please keep them in alphabetical
++; order according to the 2-character country codes!
++;
++; The [general] category is for certain global variables.
++; All other categories are interpreted as location specific indications
++;
++;
++[general]
++country=us ; default location
++
++
++; [example]
++; description = string
++; The full name of your country, in English.
++; alias = iso[,iso]*
++; List of other countries 2-letter iso codes, which have the same
++; tone indications.
++; ringcadence = num[,num]*
++; List of durations the physical bell rings.
++; dial = tonelist
++; Set of tones to be played when one picks up the hook.
++; busy = tonelist
++; Set of tones played when the receiving end is busy.
++; congestion = tonelist
++; Set of tones played when there is some congestion (on the network?)
++; callwaiting = tonelist
++; Set of tones played when there is a call waiting in the background.
++; dialrecall = tonelist
++; Not well defined; many phone systems play a recall dial tone after hook
++; flash.
++; record = tonelist
++; Set of tones played when call recording is in progress.
++; info = tonelist
++; Set of tones played with special information messages (e.g., "number is
++; out of service")
++; 'name' = tonelist
++; Every other variable will be available as a shortcut for the "PlayList" command
++; but will not be used automatically by Asterisk.
++;
++;
++; The tonelist itself is defined by a comma-separated sequence of elements.
++; Each element consist of a frequency (f) with an optional duration (in ms)
++; attached to it (f/duration). The frequency component may be a mixture of two
++; frequencies (f1+f2) or a frequency modulated by another frequency (f1*f2).
++; The implicit modulation depth is fixed at 90%, though.
++; If the list element starts with a !, that element is NOT repeated,
++; therefore, only if all elements start with !, the tonelist is time-limited,
++; all others will repeat indefinitely.
++;
++; concisely:
++; element = [!]freq[+|*freq2][/duration]
++; tonelist = element[,element]*
++;
++; Please note that SPACES ARE NOT ALLOWED in tone lists!
++;
++
++[at]
++description = Austria
++ringcadence = 1000,5000
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++dial = 420
++busy = 420/400,0/400
++ring = 420/1000,0/5000
++congestion = 420/200,0/200
++callwaiting = 420/40,0/1960
++dialrecall = 420
++; RECORDTONE - not specified
++record = 1400/80,0/14920
++info = 950/330,1450/330,1850/330,0/1000
++stutter = 380+420
++
++[au]
++description = Australia
++; Reference http://www.acif.org.au/__data/page/3303/S002_2001.pdf
++; Normal Ring
++ringcadence = 400,200,400,2000
++; Distinctive Ring 1 - Forwarded Calls
++; 400,400,200,200,400,1400
++; Distinctive Ring 2 - Selective Ring 2 + Operator + Recall
++; 400,400,200,2000
++; Distinctive Ring 3 - Multiple Subscriber Number 1
++; 200,200,400,2200
++; Distinctive Ring 4 - Selective Ring 1 + Centrex
++; 400,2600
++; Distinctive Ring 5 - Selective Ring 3
++; 400,400,200,400,200,1400
++; Distinctive Ring 6 - Multiple Subscriber Number 2
++; 200,400,200,200,400,1600
++; Distinctive Ring 7 - Multiple Subscriber Number 3 + Data Privacy
++; 200,400,200,400,200,1600
++; Tones
++dial = 413+438
++busy = 425/375,0/375
++ring = 413+438/400,0/200,413+438/400,0/2000
++; XXX Congestion: Should reduce by 10 db every other cadence XXX
++congestion = 425/375,0/375,420/375,0/375
++callwaiting = 425/200,0/200,425/200,0/4400
++dialrecall = 413+438
++; Record tone used for Call Intrusion/Recording or Conference
++record = !425/1000,!0/15000,425/360,0/15000
++info = 425/2500,0/500
++; Other Australian Tones
++; The STD "pips" indicate the call is not an untimed local call
++std = !525/100,!0/100,!525/100,!0/100,!525/100,!0/100,!525/100,!0/100,!525/100
++; Facility confirmation tone (eg. Call Forward Activated)
++facility = 425
++; Message Waiting "stutter" dialtone
++stutter = 413+438/100,0/40
++; Ringtone for calls to Telstra mobiles
++ringmobile = 400+450/400,0/200,400+450/400,0/2000
++
++[bg]
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++description = Bulgaria
++ringcadence = 1000,4000
++;
++dial = 425
++busy = 425/500,0/500
++ring = 425/1000,0/4000
++congestion = 425/250,0/250
++callwaiting = 425/150,0/150,425/150,0/4000
++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425
++record = 1400/425,0/15000
++info = 950/330,1400/330,1800/330,0/1000
++stutter = 425/1500,0/100
++
++[br]
++description = Brazil
++ringcadence = 1000,4000
++dial = 425
++busy = 425/250,0/250
++ring = 425/1000,0/4000
++congestion = 425/250,0/250,425/750,0/250
++callwaiting = 425/50,0/1000
++; Dialrecall not used in Brazil standard (using UK standard)
++dialrecall = 350+440
++; Record tone is not used in Brazil, use busy tone
++record = 425/250,0/250
++; Info not used in Brazil standard (using UK standard)
++info = 950/330,1400/330,1800/330
++stutter = 350+440
++
++[be]
++description = Belgium
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++ringcadence = 1000,3000
++dial = 425
++busy = 425/500,0/500
++ring = 425/1000,0/3000
++congestion = 425/167,0/167
++callwaiting = 1400/175,0/175,1400/175,0/3500
++; DIALRECALL - not specified
++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440"
++; RECORDTONE - not specified
++record = 1400/500,0/15000
++info = 900/330,1400/330,1800/330,0/1000
++stutter = 425/1000,0/250
++
++[ch]
++description = Switzerland
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++ringcadence = 1000,4000
++dial = 425
++busy = 425/500,0/500
++ring = 425/1000,0/4000
++congestion = 425/200,0/200
++callwaiting = 425/200,0/200,425/200,0/4000
++; DIALRECALL - not specified
++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425
++; RECORDTONE - not specified
++record = 1400/80,0/15000
++info = 950/330,1400/330,1800/330,0/1000
++stutter = 425+340/1100,0/1100
++
++[cl]
++description = Chile
++; According to specs from Telefonica CTC Chile
++ringcadence = 1000,3000
++dial = 400
++busy = 400/500,0/500
++ring = 400/1000,0/3000
++congestion = 400/200,0/200
++callwaiting = 400/250,0/8750
++dialrecall = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400
++record = 1400/500,0/15000
++info = 950/333,1400/333,1800/333,0/1000
++stutter = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400
++
++[cn]
++description = China
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++ringcadence = 1000,4000
++dial = 450
++busy = 450/350,0/350
++ring = 450/1000,0/4000
++congestion = 450/700,0/700
++callwaiting = 450/400,0/4000
++dialrecall = 450
++record = 950/400,0/10000
++info = 450/100,0/100,450/100,0/100,450/100,0/100,450/400,0/400
++; STUTTER - not specified
++stutter = 450+425
++
++[cz]
++description = Czech Republic
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++ringcadence = 1000,4000
++dial = 425/330,0/330,425/660,0/660
++busy = 425/330,0/330
++ring = 425/1000,0/4000
++congestion = 425/165,0/165
++callwaiting = 425/330,0/9000
++; DIALRECALL - not specified
++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425/330,0/330,425/660,0/660
++; RECORDTONE - not specified
++record = 1400/500,0/14000
++info = 950/330,0/30,1400/330,0/30,1800/330,0/1000
++; STUTTER - not specified
++stutter = 425/450,0/50
++
++[de]
++description = Germany
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++ringcadence = 1000,4000
++dial = 425
++busy = 425/480,0/480
++ring = 425/1000,0/4000
++congestion = 425/240,0/240
++callwaiting = !425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,0
++; DIALRECALL - not specified
++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425
++; RECORDTONE - not specified
++record = 1400/80,0/15000
++info = 950/330,1400/330,1800/330,0/1000
++stutter = 425+400
++
++[dk]
++description = Denmark
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++ringcadence = 1000,4000
++dial = 425
++busy = 425/500,0/500
++ring = 425/1000,0/4000
++congestion = 425/200,0/200
++callwaiting = !425/200,!0/600,!425/200,!0/3000,!425/200,!0/200,!425/200,0
++; DIALRECALL - not specified
++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425
++; RECORDTONE - not specified
++record = 1400/80,0/15000
++info = 950/330,1400/330,1800/330,0/1000
++; STUTTER - not specified
++stutter = 425/450,0/50
++
++[ee]
++description = Estonia
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++ringcadence = 1000,4000
++dial = 425
++busy = 425/300,0/300
++ring = 425/1000,0/4000
++congestion = 425/200,0/200
++; CALLWAIT not in accordance to ITU
++callwaiting = 950/650,0/325,950/325,0/30,1400/1300,0/2600
++; DIALRECALL - not specified
++dialrecall = 425/650,0/25
++; RECORDTONE - not specified
++record = 1400/500,0/15000
++; INFO not in accordance to ITU
++info = 950/650,0/325,950/325,0/30,1400/1300,0/2600
++; STUTTER not specified
++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425
++
++[es]
++description = Spain
++ringcadence = 1500,3000
++dial = 425
++busy = 425/200,0/200
++ring = 425/1500,0/3000
++congestion = 425/200,0/200,425/200,0/200,425/200,0/600
++callwaiting = 425/175,0/175,425/175,0/3500
++dialrecall = !425/200,!0/200,!425/200,!0/200,!425/200,!0/200,425
++record = 1400/500,0/15000
++info = 950/330,0/1000
++dialout = 500
++
++
++[fi]
++description = Finland
++ringcadence = 1000,4000
++dial = 425
++busy = 425/300,0/300
++ring = 425/1000,0/4000
++congestion = 425/200,0/200
++callwaiting = 425/150,0/150,425/150,0/8000
++dialrecall = 425/650,0/25
++record = 1400/500,0/15000
++info = 950/650,0/325,950/325,0/30,1400/1300,0/2600
++stutter = 425/650,0/25
++
++[fr]
++description = France
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++ringcadence = 1500,3500
++; Dialtone can also be 440+330
++dial = 440
++busy = 440/500,0/500
++ring = 440/1500,0/3500
++; CONGESTION - not specified
++congestion = 440/250,0/250
++callwait = 440/300,0/10000
++; DIALRECALL - not specified
++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
++; RECORDTONE - not specified
++record = 1400/500,0/15000
++info = !950/330,!1400/330,!1800/330
++stutter = !440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,440
++
++[gr]
++description = Greece
++ringcadence = 1000,4000
++dial = 425/200,0/300,425/700,0/800
++busy = 425/300,0/300
++ring = 425/1000,0/4000
++congestion = 425/200,0/200
++callwaiting = 425/150,0/150,425/150,0/8000
++dialrecall = 425/650,0/25
++record = 1400/400,0/15000
++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0
++stutter = 425/650,0/25
++
++[hu]
++description = Hungary
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++ringcadence = 1250,3750
++dial = 425
++busy = 425/300,0/300
++ring = 425/1250,0/3750
++congestion = 425/300,0/300
++callwaiting = 425/40,0/1960
++dialrecall = 425+450
++; RECORDTONE - not specified
++record = 1400/400,0/15000
++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0
++stutter = 350+375+400
++
++[il]
++description = Israel
++ringcadence = 1000,3000
++dial = 414
++busy = 414/500,0/500
++ring = 414/1000,0/3000
++congestion = 414/250,0/250
++callwaiting = 414/100,0/100,414/100,0/100,414/600,0/3000
++dialrecall = !414/100,!0/100,!414/100,!0/100,!414/100,!0/100,414
++record = 1400/500,0/15000
++info = 1000/330,1400/330,1800/330,0/1000
++stutter = !414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,414
++
++
++[in]
++description = India
++ringcadence = 400,200,400,2000
++dial = 400*25
++busy = 400/750,0/750
++ring = 400*25/400,0/200,400*25/400,0/2000
++congestion = 400/250,0/250
++callwaiting = 400/200,0/100,400/200,0/7500
++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
++record = 1400/500,0/15000
++info = !950/330,!1400/330,!1800/330,0/1000
++stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
++
++[it]
++description = Italy
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++ringcadence = 1000,4000
++dial = 425/200,0/200,425/600,0/1000
++busy = 425/500,0/500
++ring = 425/1000,0/4000
++congestion = 425/200,0/200
++callwaiting = 425/400,0/100,425/250,0/100,425/150,0/14000
++dialrecall = 470/400,425/400
++record = 1400/400,0/15000
++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0
++stutter = 470/400,425/400
++
++[lt]
++description = Lithuania
++ringcadence = 1000,4000
++dial = 425
++busy = 425/350,0/350
++ring = 425/1000,0/4000
++congestion = 425/200,0/200
++callwaiting = 425/150,0/150,425/150,0/4000
++; DIALRECALL - not specified
++dialrecall = 425/500,0/50
++; RECORDTONE - not specified
++record = 1400/500,0/15000
++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0
++; STUTTER - not specified
++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425
++
++[jp]
++description = Japan
++ringcadence = 1000,2000
++dial = 400
++busy = 400/500,0/500
++ring = 400+15/1000,0/2000
++congestion = 400/500,0/500
++callwaiting = 400+16/500,0/8000
++dialrecall = !400/200,!0/200,!400/200,!0/200,!400/200,!0/200,400
++record = 1400/500,0/15000
++info = !950/330,!1400/330,!1800/330,0
++stutter = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400
++
++[mx]
++description = Mexico
++ringcadence = 2000,4000
++dial = 425
++busy = 425/250,0/250
++ring = 425/1000,0/4000
++congestion = 425/250,0/250
++callwaiting = 425/200,0/600,425/200,0/10000
++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
++record = 1400/500,0/15000
++info = 950/330,0/30,1400/330,0/30,1800/330,0/1000
++stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
++
++[my]
++description = Malaysia
++ringcadence = 2000,4000
++dial = 425
++busy = 425/500,0/500
++ring = 425/400,0/200
++congestion = 425/500,0/500
++
++[nl]
++description = Netherlands
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++ringcadence = 1000,4000
++; Most of these 425's can also be 450's
++dial = 425
++busy = 425/500,0/500
++ring = 425/1000,0/4000
++congestion = 425/250,0/250
++callwaiting = 425/500,0/9500
++; DIALRECALL - not specified
++dialrecall = 425/500,0/50
++; RECORDTONE - not specified
++record = 1400/500,0/15000
++info = 950/330,1400/330,1800/330,0/1000
++stutter = 425/500,0/50
++
++[no]
++description = Norway
++ringcadence = 1000,4000
++dial = 425
++busy = 425/500,0/500
++ring = 425/1000,0/4000
++congestion = 425/200,0/200
++callwaiting = 425/200,0/600,425/200,0/10000
++dialrecall = 470/400,425/400
++record = 1400/400,0/15000
++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0
++stutter = 470/400,425/400
++
++[nz]
++description = New Zealand
++;NOTE - the ITU has different tonesets for NZ, but according to some residents there,
++; this is, indeed, the correct way to do it.
++ringcadence = 400,200,400,2000
++dial = 400
++busy = 400/250,0/250
++ring = 400+450/400,0/200,400+450/400,0/2000
++congestion = 400/375,0/375
++callwaiting = !400/200,!0/3000,!400/200,!0/3000,!400/200,!0/3000,!400/200
++dialrecall = !400/100!0/100,!400/100,!0/100,!400/100,!0/100,400
++record = 1400/425,0/15000
++info = 400/750,0/100,400/750,0/100,400/750,0/100,400/750,0/400
++stutter = !400/100!0/100,!400/100,!0/100,!400/100,!0/100,!400/100!0/100,!400/100,!0/100,!400/100,!0/100,400
++unobtainable = 400/75,0/100,400/75,0/100,400/75,0/100,400/75,0/400
++
++[ph]
++
++; reference http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++
++description = Philippines
++ringcadence = 1000,4000
++dial = 425
++busy = 480+620/500,0/500
++ring = 425+480/1000,0/4000
++congestion = 480+620/250,0/250
++callwaiting = 440/300,0/10000
++; DIALRECALL - not specified
++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
++; RECORDTONE - not specified
++record = 1400/500,0/15000
++; INFO - not specified
++info = !950/330,!1400/330,!1800/330,0
++; STUTTER - not specified
++stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
++
++
++[pl]
++description = Poland
++ringcadence = 1000,4000
++dial = 425
++busy = 425/500,0/500
++ring = 425/1000,0/4000
++congestion = 425/500,0/500
++callwaiting = 425/150,0/150,425/150,0/4000
++; DIALRECALL - not specified
++dialrecall = 425/500,0/50
++; RECORDTONE - not specified
++record = 1400/500,0/15000
++; 950/1400/1800 3x0.33 on 1.0 off repeated 3 times
++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000
++; STUTTER - not specified
++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425
++
++[pt]
++description = Portugal
++ringcadence = 1000,5000
++dial = 425
++busy = 425/500,0/500
++ring = 425/1000,0/5000
++congestion = 425/200,0/200
++callwaiting = 440/300,0/10000
++dialrecall = 425/1000,0/200
++record = 1400/500,0/15000
++info = 950/330,1400/330,1800/330,0/1000
++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425
++
++[ru]
++; References:
++; http://www.minsvyaz.ru/site.shtml?id=1806
++; http://www.aboutphone.info/lib/gost/45-223-2001.html
++description = Russian Federation / ex Soviet Union
++ringcadence = 1000,4000
++dial = 425
++busy = 425/350,0/350
++ring = 425/1000,0/4000
++congestion = 425/175,0/175
++callwaiting = 425/200,0/5000
++record = 1400/400,0/15000
++info = 950/330,1400/330,1800/330,0/1000
++dialrecall = 425/400,0/40
++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425
++
++[se]
++description = Sweden
++ringcadence = 1000,5000
++dial = 425
++busy = 425/250,0/250
++ring = 425/1000,0/5000
++congestion = 425/250,0/750
++callwaiting = 425/200,0/500,425/200,0/9100
++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425
++record = 1400/500,0/15000
++info = !950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,0
++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425
++; stutter = 425/320,0/20 ; Real swedish standard, not used for now
++
++[sg]
++description = Singapore
++; Singapore
++; Reference: http://www.ida.gov.sg/idaweb/doc/download/I397/ida_ts_pstn1_i4r2.pdf
++; Frequency specs are: 425 Hz +/- 20Hz; 24 Hz +/- 2Hz; modulation depth 100%; SIT +/- 50Hz
++ringcadence = 400,200,400,2000
++dial = 425
++ring = 425*24/400,0/200,425*24/400,0/2000 ; modulation should be 100%, not 90%
++busy = 425/750,0/750
++congestion = 425/250,0/250
++callwaiting = 425*24/300,0/200,425*24/300,0/3200
++stutter = !425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,425
++info = 950/330,1400/330,1800/330,0/1000 ; not currently in use acc. to reference
++dialrecall = 425*24/500,0/500,425/500,0/2500 ; unspecified in IDA reference, use repeating Holding Tone A,B
++record = 1400/500,0/15000 ; unspecified in IDA reference, use 0.5s tone every 15s
++; additionally defined in reference
++nutone = 425/2500,0/500
++intrusion = 425/250,0/2000
++warning = 425/624,0/4376 ; end of period tone, warning
++acceptance = 425/125,0/125
++holdinga = !425*24/500,!0/500 ; followed by holdingb
++holdingb = !425/500,!0/2500
++
++[th]
++description = Thailand
++ringcadence = 1000,4000
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++dial = 400*50
++busy = 400/500,0/500
++ring = 420/1000,0/5000
++congestion = 400/300,0/300
++callwaiting = 1000/400,10000/400,1000/400
++; DIALRECALL - not specified - use special dial tone instead.
++dialrecall = 400*50/400,0/100,400*50/400,0/100
++; RECORDTONE - not specified
++record = 1400/500,0/15000
++; INFO - specified as an announcement - use special information tones instead
++info = 950/330,1400/330,1800/330
++; STUTTER - not specified
++stutter = !400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,400
++
++[uk]
++description = United Kingdom
++ringcadence = 400,200,400,2000
++; These are the official tones taken from BT SIN350. The actual tones
++; used by BT include some volume differences so sound slightly different
++; from Asterisk-generated ones.
++dial = 350+440
++; Special dial is the intermittent dial tone heard when, for example,
++; you have a divert active on the line
++specialdial = 350+440/750,440/750
++; Busy is also called "Engaged"
++busy = 400/375,0/375
++; "Congestion" is the Beep-bip engaged tone
++congestion = 400/400,0/350,400/225,0/525
++; "Special Congestion" is not used by BT very often if at all
++specialcongestion = 400/200,1004/300
++unobtainable = 400
++ring = 400+450/400,0/200,400+450/400,0/2000
++callwaiting = 400/100,0/4000
++; BT seem to use "Special Call Waiting" rather than just "Call Waiting" tones
++specialcallwaiting = 400/250,0/250,400/250,0/250,400/250,0/5000
++; "Pips" used by BT on payphones. (Sounds wrong, but this is what BT claim it
++; is and I've not used a payphone for years)
++creditexpired = 400/125,0/125
++; These two are used to confirm/reject service requests on exchanges that
++; don't do voice announcements.
++confirm = 1400
++switching = 400/200,0/400,400/2000,0/400
++; This is the three rising tones Doo-dah-dee "Special Information Tone",
++; usually followed by the BT woman saying an appropriate message.
++info = 950/330,0/15,1400/330,0/15,1800/330,0/1000
++; Not listed in SIN350
++record = 1400/500,0/60000
++stutter = 350+440/750,440/750
++
++[us]
++description = United States / North America
++ringcadence = 2000,4000
++dial = 350+440
++busy = 480+620/500,0/500
++ring = 440+480/2000,0/4000
++congestion = 480+620/250,0/250
++callwaiting = 440/300,0/10000
++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
++record = 1400/500,0/15000
++info = !950/330,!1400/330,!1800/330,0
++stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
++
++[us-old]
++description = United States Circa 1950/ North America
++ringcadence = 2000,4000
++dial = 600*120
++busy = 500*100/500,0/500
++ring = 420*40/2000,0/4000
++congestion = 500*100/250,0/250
++callwaiting = 440/300,0/10000
++dialrecall = !600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,600*120
++record = 1400/500,0/15000
++info = !950/330,!1400/330,!1800/330,0
++stutter = !600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,600*120
++
++[tw]
++description = Taiwan
++; http://nemesis.lonestar.org/reference/telecom/signaling/dialtone.html
++; http://nemesis.lonestar.org/reference/telecom/signaling/busy.html
++; http://www.iproducts.com.tw/ee/kylink/06ky-1000a.htm
++; http://www.pbx-manufacturer.com/ky120dx.htm
++; http://www.nettwerked.net/tones.txt
++; http://www.cisco.com/univercd/cc/td/doc/product/tel_pswt/vco_prod/taiw_sup/taiw2.htm
++;
++; busy tone 480+620Hz 0.5 sec. on ,0.5 sec. off
++; reorder tone 480+620Hz 0.25 sec. on,0.25 sec. off
++; ringing tone 440+480Hz 1 sec. on ,2 sec. off
++;
++ringcadence = 1000,4000
++dial = 350+440
++busy = 480+620/500,0/500
++ring = 440+480/1000,0/2000
++congestion = 480+620/250,0/250
++callwaiting = 350+440/250,0/250,350+440/250,0/3250
++dialrecall = 300/1500,0/500
++record = 1400/500,0/15000
++info = !950/330,!1400/330,!1800/330,0
++stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
++
++[ve]
++; Tone definition source for ve found on
++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf
++description = Venezuela / South America
++ringcadence = 1000,4000
++dial = 425
++busy = 425/500,0/500
++ring = 425/1000,0/4000
++congestion = 425/250,0/250
++callwaiting = 400+450/300,0/6000
++dialrecall = 425
++record = 1400/500,0/15000
++info = !950/330,!1440/330,!1800/330,0/1000
++
++
++[za]
++description = South Africa
++; http://www.cisco.com/univercd/cc/td/doc/product/tel_pswt/vco_prod/safr_sup/saf02.htm
++; (definitions for other countries can also be found there)
++; Note, though, that South Africa uses two switch types in their network --
++; Alcatel switches -- mainly in the Western Cape, and Siemens elsewhere.
++; The former use 383+417 in dial, ringback etc. The latter use 400*33
++; I've provided both, uncomment the ones you prefer
++ringcadence = 400,200,400,2000
++; dial/ring/callwaiting for the Siemens switches:
++dial = 400*33
++ring = 400*33/400,0/200,400*33/400,0/2000
++callwaiting = 400*33/250,0/250,400*33/250,0/250,400*33/250,0/250,400*33/250,0/250
++; dial/ring/callwaiting for the Alcatel switches:
++; dial = 383+417
++; ring = 383+417/400,0/200,383+417/400,0/2000
++; callwaiting = 383+417/250,0/250,383+417/250,0/250,383+417/250,0/250,383+417/250,0/250
++congestion = 400/250,0/250
++busy = 400/500,0/500
++dialrecall = 350+440
++; XXX Not sure about the RECORDTONE
++record = 1400/500,0/10000
++info = 950/330,1400/330,1800/330,0/330
++stutter = !400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,400*33
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber.conf.TEMPLATE
+new file mode 100644
+index 0000000..cf71e1f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber.conf.TEMPLATE
+@@ -0,0 +1,4 @@
++[general]
++autoregister=yes
++
++#include jabber_users.conf
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber_users.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber_users.conf.TEMPLATE
+new file mode 100644
+index 0000000..3ee2463
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber_users.conf.TEMPLATE
+@@ -0,0 +1,8 @@
++[gtalk-|NAME|]
++type=client
++serverhost=talk.google.com
++username=|USERNAME|/Talk
++secret=|SECRET|
++timeout=150
++status=|STATUS|
++statusmessage=|STATUSMESSAGE|
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/logger.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/logger.conf.TEMPLATE
+new file mode 100644
+index 0000000..e573250
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/logger.conf.TEMPLATE
+@@ -0,0 +1,7 @@
++[general]
++queue_log = no
++event_log = no
++
++[logfiles]
++console => notice,warning,error
++messages => error
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/manager.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/manager.conf.TEMPLATE
+new file mode 100644
+index 0000000..2ac2f00
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/manager.conf.TEMPLATE
+@@ -0,0 +1,7 @@
++[general]
++enabled = no
++
++port = 5038
++bindaddr = 0.0.0.0
++
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/modules.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/modules.conf.TEMPLATE
+new file mode 100644
+index 0000000..93c7433
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/modules.conf.TEMPLATE
+@@ -0,0 +1,34 @@
++[modules]
++autoload=no
++load => res_jabber.so ; Used for Gtalk
++load => res_clioriginate.so ; originate calls from commandline
++load => res_rtp_asterisk.so ; rtp "engine" is now a loadable module in asterisk 1.8
++load => pbx_config.so ; Text Extension Configuration Requires N/A
++load => func_callerid.so ; Gets or sets Caller*ID data on the channel. - Requires ?
++load => func_channel.so
++load => func_logic.so ; Logic functions (if, etc.)
++load => func_strings.so ; string manipulation functions
++load => cdr_manager.so ; Asterisk Call Manager CDR Backend - Requires N/A
++load => chan_local.so ; Show status of local channels- Requires N/A
++load => chan_gtalk.so ; Use gtalk
++load => chan_sip.so ; Session Initiation Protocol (SIP) - Requires res_features.so
++load => codec_alaw.so ; A-law Coder/Decoder - Requires N/A
++load => codec_a_mu.so ; A-law and Mulaw direct Coder/Decoder - Requires N/A
++load => codec_gsm.so ; GSM/PCM16 (signed linear) Codec Translat - Requires N/A
++load => codec_ulaw.so ; Mu-law Coder/Decoder - Requires N/A
++load => format_gsm.so ; Raw GSM data - Requires N/A
++load => format_pcm.so ; Raw uLaw 8khz Audio support (PCM) - Requires N/A
++load => format_wav_gsm.so
++load => app_dial.so ; Dialing Application - Requires res_features.so, res_musiconhold.so
++load => app_parkandannounce.so ; Call Parking and Announce Application - Requires res_features.so
++load => app_playback.so ; Sound File Playback Application - Requires N/A
++load => app_record.so ; Sound File Record Application - Requires N/A
++load => app_system.so ; Execute a system command - Requires N/A
++load => app_disa.so ; Direct Inward System Access
++load => app_authenticate.so ; Authenticate via pin
++load => app_senddtmf.so ; Ability to send DTMF tones on the line.
++load => func_cut.so ; To manipulate strings
++load => func_timeout.so ; Used for DISA timeouts
++
++[global]
++chan_modem.so=no
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/rtp.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/rtp.conf.TEMPLATE
+new file mode 100644
+index 0000000..10d577d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/rtp.conf.TEMPLATE
+@@ -0,0 +1,6 @@
++[general]
++rtpstart=|RTPSTART|
++rtpend=|RTPEND|
++rtpchecksums=no
++dtmftimeout=3000
++rtcpinterval = 2000
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip.conf.TEMPLATE
+new file mode 100644
+index 0000000..8f3b112
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip.conf.TEMPLATE
+@@ -0,0 +1,39 @@
++[general]
++transport=udp
++context=default-incoming-call-context
++allowoverlap=yes
++allowtransfer=yes
++realm=asterisk
++bindaddr=0.0.0.0
++srvlookup=yes
++maxexpiry=600
++minexpiry=60
++defaultexpiry=300
++qualifyfreq=55
++disallow=all
++allow=ulaw
++allow=alaw
++dtmfmode = inband
++alwaysauthreject = yes
++t1min=100
++timert1=500
++timerb=16000
++rtptimeout=600
++rtpkeepalive=30
++useragent=|USERAGENT|
++localnet=192.168.0.0/16
++localnet=10.0.0.0/8
++localnet=172.16.0.0/12
++nat=yes
++directmedia=no
++sipdebug=no
++bindport=|BINDPORT|
++externhost=|EXTERNHOST|
++externrefresh=60
++
++#include sip_registrations.conf
++
++[authentication]
++
++#include sip_peers.conf
++#include sip_users.conf
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_peer.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_peer.TEMPLATE
+new file mode 100644
+index 0000000..30abaad
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_peer.TEMPLATE
+@@ -0,0 +1,13 @@
++
++[peer-|NAME|]
++type = peer
++defaultuser = |DEFAULTUSER|
++fromuser = |FROMUSER|
++secret = |SECRET|
++host = |HOST|
++fromdomain = |FROMDOMAIN|
++context = context-incoming-|NAME|
++insecure = port,invite
++qualify = 2000
++|PORT|
++|OUTBOUNDPROXY|
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_registration.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_registration.TEMPLATE
+new file mode 100644
+index 0000000..e139d43
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_registration.TEMPLATE
+@@ -0,0 +1,2 @@
++register => |DEFAULTUSER|:|SECRET|@peer-|NAME|
++
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_user.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_user.TEMPLATE
+new file mode 100644
+index 0000000..61a8b0b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_user.TEMPLATE
+@@ -0,0 +1,11 @@
++
++[|DEFAULTUSER|]
++fullname = |FULLNAME|
++defaultuser = |DEFAULTUSER|
++secret = |SECRET|
++hassip = yes
++hasvoicemail = no
++host = dynamic
++type = friend
++context = context-user-|CONTEXTNAME|
++qualify = no
+\ No newline at end of file
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/agent-alreadyon.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/agent-alreadyon.gsm
+new file mode 100644
+index 0000000000000000000000000000000000000000..83fe27ecfa4dd332504f40dcbd43ddbb812d3d38
+GIT binary patch
+literal 8943
+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
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/agent-incorrect.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/agent-incorrect.gsm
+new file mode 100644
+index 0000000000000000000000000000000000000000..27d934beb0b082969f9a55e9b4d6cb55cc4cfebb
+GIT binary patch
+literal 8085
+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
+F`G39VSLpx%
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/agent-pass.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/agent-pass.gsm
+new file mode 100644
+index 0000000000000000000000000000000000000000..f95637bb320c384d29c74ee2b66e789778329cdc
+GIT binary patch
+literal 4752
+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
+ONHJ3Nf1n`$&wl`yp0Q&9
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/auth-incorrect.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/auth-incorrect.gsm
+new file mode 100644
+index 0000000000000000000000000000000000000000..12fec25d56cf39e92b04ae899eed85d34d994931
+GIT binary patch
+literal 7458
+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
+TQ11;$C>059_}}38f7$;B(8DRC
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/auth-thankyou.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/auth-thankyou.gsm
+new file mode 100644
+index 0000000000000000000000000000000000000000..93f936d1a0c49ac8c8b6d4d0efa285d1e276b978
+GIT binary patch
+literal 1353
+zcmV-P1-AOwUy)%VP(U`@ayHy{068RXHsg>0M%!)2Bjf-!+m1He*XM-ZYPtY79Fex%
+z*q}KhZMO@8pywk|$s=+ANZU?FB-kl@>V?K2O4O1j-0(n3+iA%i$LvWHog*e>iDH=6
+z)TGnst{uyjk~H^`1FcX^ko=AnY_cr2OzpTN-b}XOkGT-krk-I{UF^Q(ZL1t#3t-oF
+z#GhYj+8~z97+;6-ba5`6)TfozR*$A*IaO68zi8H!&0G~>q!}GBKVtDnr81EuywxRj
+z-G;-aVmq=jd}F3u8d=Ebl}D(4O~fz9C^q66=JC}beda^Q3#luuCcDWgC>?!NTbYI~
+zQcCFV%Lh>8>rm6xV0I<T%_lnQN%w2bDWv6+G?$wv$x%nv>zjq7I#))A)ZU&Y!_P$B
+zLLRx2&t{I^rNd^?Bl3+hT9cn+_4!PzD%DtSW=o$U3XWA((rZJuCCXJ&)`NasQBPIe
+z<vP1<CFRm8#AWN;<z~Qk{Ml;a3e&Pd-K4{|<UTVb+QhZnZZ@>iE4*prZz8zkN4n#0
+zLn8E%)K90u+l4H?;&DOLPqH}((e1pcn{z_;<BhJQt0A==PsWwx#4)ptSciC{$y%sB
+z=FzL9W!##hr$Bzn%zopY9f`QlxMM}yQaKcO;n!8745`^<L<!v6Mp<EGCcjX~_DU`5
+zZBodh<C!~G)r^gmiZ-p-r<7iUen+Z>dC3%_XQ^Z<PCD=fX_y7wZJwmYQE~Sj+2?%T
+z9Kxj5SZ(a{-l9)MZv0!0<Ff9WHQ(1tMwD|$)7olVSyNJoha{HP!>Fc9F3Pa8;>D`n
+zZZ1-g$1d`cG=$o$dzsXR$9^MKmsW7-8l}yNZIFeS>e2{*;;1^DhFfpd*&VjzlS?)U
+zll>85C^wPvv?PQmDI(A);>_o+BNEmj*d7eF(~qh8qHZ?rkBa#cDc5Y*>N69O_acwv
+z-=hQTNY~vZw^EVjrmA<`X_Lql^LJT-l_(b<)+URWNXEU4#N^jpE<4Maq^cW-@noCm
+zNeg}`-Rr7XigT$OQAo+%RT!PtoIW?qQ%Kj;aVXoPCD^@jg(6de%!OwL{8fZXu3^Kh
+z)!sd~)KvsaTIn{Wt0b9W&`7VV<O2{L?JZeFP-<7pDb<}tGt65D+QY6++Or5ZVQyIa
+zUFG4ck3^rK#zNHC64TY3Oy|>IrOaH4MFzbGG`Eg5V!cQx<en!JzbD8hGf3OiUUX;B
+zza*I`9UCgX##AMZM08<g_L5RUs$oOld2mY|(;$pv;K4+=?0rh>!$bt+xJ=w+#=8=Y
+z%ztGggkx1G>(ZmW7uaOwKU8K$>dJ)26TP&R%_5o1jeAqZqcLMVS54Att7GBOLeWcf
+z$s=mSHus4)8`y-X<WT(#Zz3$B>Q<i8EyEk4e#G`mk|kT*;-<dJ7g}*4QQnDLvgE;~
+zC?i;;(ldIily>83J5n~(=%LEoS$Ux7!7|}js}|^?FKHz<mD4VHS}pA%*ABI7Q14<p
+zT9pkRdqYgI4mzZLBSd?hM+ws{nVDmDqE>pCsVDHGNg4^cCFUZdE!IrXcVV+4<o6fS
+z@PU>Th=SKBWw#}CfuQZN%uRP8w%fe5jOxKx(p@I0)3909+IqraU6VTEV1XpBG7)ol
+z!AU4pH0*rgNZOC6>eTUb5!&X!rh?IEVv69oba~i~oPZ#%kH)FspuFA1*rU~HgN@o=
+zU`p$7#-`YyNo#I`#p*!I95XoEQlK`Qb<I=O<a3$Y<lrS_vL>a(z$;yjMvRsKTO5)p
+LC77TlosKBmtj@qs
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/beep.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/beep.gsm
+new file mode 100644
+index 0000000000000000000000000000000000000000..d38eda9cc55c8de7b488dbd7993b545210be692f
+GIT binary patch
+literal 726
+zcmXBQdrT4m9Ki9;=GJEGkIcDg8i$&pvgQl{tu}nSmMJ3w0!ssDs5t@IbhULhHDcN5
+zAwJ5ubC)8avqCuaAJmDVfr)ciq@DswJ{rxow*JYT|9|%VJzR88U2k!MjojJF7fj^r
+zC*|(+K#{DK$*YbmNqm)y<YMelkp+Af+T|^8!G9~>aTTLTMBqUpUjfZIBp&Snpdh}o
+zWA65`Fc=V4*|~QFxITN>pjNRsdx<kf0yqIwFPJ<hXSua1|AGwXv*(AhoS>IFJpG;+
+zAwTjW<D_+60T;Y!6{BXbeWQ`)x(QZ3n{uZR1vSXPOs}LEOT5#T)3^yx@cK?f1zHS7
+zWjs-^;K|nDnJ5Lkv<mrAKdcSNl1tQO?0;#T0ipntRGEB?rv`Yj!^OY+&{1YO1=m^q
+zHTjBe0*F`!L^IG21K&`6L7xb;Y>1fAy+FFqxVGzJ9-N7RTDT!9SPyuf!izpRII`7X
+zzAJ+6(=OQ~T?{V;k-=KAvQ^WAOE0F{(!6lE>~-u1VN=EpbjC*jjHQ*l?9LTJ)pOH%
+zwFg|PiS7`Aw|!4|RAL7?Xjv4YvobhvqS;N|1p2B3VS;&lag?2XfdCk&LO54=LhJtC
+zJ#HEdd`?LZEB9J?^h)oa!vYXu!crM>(s)9kT&ruMlN)I|2VAkz@_Us4x(P~05bKfy
+z_6W_=7ae4hUPenCuqUR4dkB14Ot7B$T>zyV4=79DhU9EBzorWDiSc~S&%*+em?ScU
+zJ8-e$nz#|Mj_E$x)XuUz#Uo3Q0FNP4bquO=f?GBEsUaa0n#m2V!$4*Ab#^TQ%-|_x
+zgl2cLBxj{lsF`ew)0jzeuyPx97ZI;^vM}B<g?tMbY#uE5p@8Ggb34{`cu`kiPT<=8
+iXcUw}ChEiG=W8T-lm?6LCo$t>OP=B*g{RvJ<NpKQfpTF0
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/vm-goodbye.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/vm-goodbye.gsm
+new file mode 100644
+index 0000000000000000000000000000000000000000..735b281c8eff6e531d617b97b628b8f2a01779d0
+GIT binary patch
+literal 1683
+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
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/applications/luci-app-polipo/Makefile b/feeds/luci/applications/luci-app-polipo/Makefile
+new file mode 100644
+index 0000000..1fbafe7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for the Polipo Proxy
++LUCI_DEPENDS:=+polipo
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-polipo/luasrc/controller/polipo.lua b/feeds/luci/applications/luci-app-polipo/luasrc/controller/polipo.lua
+new file mode 100644
+index 0000000..b3ae389
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/luasrc/controller/polipo.lua
+@@ -0,0 +1,15 @@
++-- Copyright 2008 Aleksandar Krsteski <alekrsteski@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.polipo", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/polipo") then
++ return
++ end
++
++ entry({"admin", "services", "polipo"}, alias("admin", "services", "polipo", "config"), _("Polipo"))
++ entry({"admin", "services", "polipo", "status"}, template("polipo_status"), _("Status"))
++ entry({"admin", "services", "polipo", "config"}, cbi("polipo"), _("Configuration"))
++end
++
+diff --git a/feeds/luci/applications/luci-app-polipo/luasrc/model/cbi/polipo.lua b/feeds/luci/applications/luci-app-polipo/luasrc/model/cbi/polipo.lua
+new file mode 100644
+index 0000000..967a47a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/luasrc/model/cbi/polipo.lua
+@@ -0,0 +1,177 @@
++-- Copyright 2008 Aleksandar Krsteski <alekrsteski@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("polipo", translate("Polipo"),
++ translate("Polipo is a small and fast caching web proxy."))
++
++-- General section
++s = m:section(NamedSection, "general", "polipo", translate("Proxy"))
++
++s:tab("general", translate("General Settings"))
++s:tab("dns", translate("DNS and Query Settings"))
++s:tab("proxy", translate("Parent Proxy"))
++s:tab("logging", translate("Logging and RAM"))
++
++-- General settings
++s:taboption("general", Flag, "enabled", translate("enable"))
++
++o = s:taboption("general", Value, "proxyAddress", translate("Listen address"),
++ translate("The interface on which Polipo will listen. To listen on all " ..
++ "interfaces use 0.0.0.0 or :: (IPv6)."))
++
++o.placeholder = "0.0.0.0"
++o.datatype = "ipaddr"
++
++
++o = s:taboption("general", Value, "proxyPort", translate("Listen port"),
++ translate("Port on which Polipo will listen"))
++
++o.optional = true
++o.placeholder = "8123"
++o.datatype = "port"
++
++
++o = s:taboption("general", DynamicList, "allowedClients",
++ translate("Allowed clients"),
++ translate("When listen address is set to 0.0.0.0 or :: (IPv6), you must " ..
++ "list clients that are allowed to connect. The format is IP address " ..
++ "or network address (192.168.1.123, 192.168.1.0/24, " ..
++ "2001:660:116::/48 (IPv6))"))
++
++o.datatype = "ipaddr"
++o.placeholder = "0.0.0.0/0"
++
++
++-- DNS settings
++dns = s:taboption("dns", Value, "dnsNameServer", translate("DNS server address"),
++ translate("Set the DNS server address to use, if you want Polipo to use " ..
++ "different DNS server than the host system."))
++
++dns.optional = true
++dns.datatype = "ipaddr"
++
++l = s:taboption("dns", ListValue, "dnsQueryIPv6",
++ translate("Query DNS for IPv6"))
++
++l.default = "happily"
++l:value("true", translate("Query only IPv6"))
++l:value("happily", translate("Query IPv4 and IPv6, prefer IPv6"))
++l:value("reluctantly", translate("Query IPv4 and IPv6, prefer IPv4"))
++l:value("false", translate("Do not query IPv6"))
++
++
++l = s:taboption("dns", ListValue, "dnsUseGethostbyname",
++ translate("Query DNS by hostname"))
++
++l.default = "reluctantly"
++l:value("true", translate("Always use system DNS resolver"))
++l:value("happily",
++ translate("Query DNS directly, for unknown hosts fall back " ..
++ "to system resolver"))
++l:value("reluctantly",
++ translate("Query DNS directly, fallback to system resolver"))
++l:value("false", translate("Never use system DNS resolver"))
++
++
++-- Proxy settings
++o = s:taboption("proxy", Value, "parentProxy",
++ translate("Parent proxy address"),
++ translate("Parent proxy address (in host:port format), to which Polipo " ..
++ "will forward the requests."))
++
++o.optional = true
++o.datatype = "ipaddr"
++
++
++o = s:taboption("proxy", Value, "parentAuthCredentials",
++ translate("Parent proxy authentication"),
++ translate("Basic HTTP authentication supported. Provide username and " ..
++ "password in username:password format."))
++
++o.optional = true
++o.placeholder = "username:password"
++
++
++-- Logging
++s:taboption("logging", Flag, "logSyslog", translate("Log to syslog"))
++
++s:taboption("logging", Value, "logFacility",
++ translate("Syslog facility")):depends("logSyslog", "1")
++
++
++v = s:taboption("logging", Value, "logFile",
++ translate("Log file location"),
++ translate("Use of external storage device is recommended, because the " ..
++ "log file is written frequently and can grow considerably."))
++
++v:depends("logSyslog", "")
++v.rmempty = true
++
++
++o = s:taboption("logging", Value, "chunkHighMark",
++ translate("In RAM cache size (in bytes)"),
++ translate("How much RAM should Polipo use for its cache."))
++
++o.datatype = "uinteger"
++
++
++-- Disk cache section
++s = m:section(NamedSection, "cache", "polipo", translate("On-Disk Cache"))
++s:tab("general", translate("General Settings"))
++s:tab("advanced", translate("Advanced Settings"))
++
++
++-- Disk cache settings
++s:taboption("general", Value, "diskCacheRoot", translate("Disk cache location"),
++ translate("Location where polipo will cache files permanently. Use of " ..
++ "external storage devices is recommended, because the cache can " ..
++ "grow considerably. Leave it empty to disable on-disk " ..
++ "cache.")).rmempty = true
++
++
++s:taboption("general", Flag, "cacheIsShared", translate("Shared cache"),
++ translate("Enable if cache (proxy) is shared by multiple users."))
++
++
++o = s:taboption("advanced", Value, "diskCacheTruncateSize",
++ translate("Truncate cache files size (in bytes)"),
++ translate("Size to which cached files should be truncated"))
++
++o.optional = true
++o.placeholder = "1048576"
++o.datatype = "uinteger"
++
++
++o = s:taboption("advanced", Value, "diskCacheTruncateTime",
++ translate("Truncate cache files time"),
++ translate("Time after which cached files will be truncated"))
++
++o.optional = true
++o.placeholder = "4d12h"
++
++
++o = s:taboption("advanced", Value, "diskCacheUnlinkTime",
++ translate("Delete cache files time"),
++ translate("Time after which cached files will be deleted"))
++
++o.optional = true
++o.placeholder = "32d"
++
++
++-- Poor man's multiplexing section
++s = m:section(NamedSection, "pmm", "polipo",
++ translate("Poor Man's Multiplexing"),
++ translate("Poor Man's Multiplexing (PMM) is a technique that simulates " ..
++ "multiplexing by requesting an instance in multiple segments. It " ..
++ "tries to lower the latency caused by the weakness of HTTP " ..
++ "protocol. NOTE: some sites may not work with PMM enabled."))
++
++s:option(Value, "pmmSize", translate("PMM segments size (in bytes)"),
++ translate("To enable PMM, PMM segment size must be set to some " ..
++ "positive value.")).rmempty = true
++
++s:option(Value, "pmmFirstSize", translate("First PMM segment size (in bytes)"),
++ translate("Size of the first PMM segment. If not defined, it defaults " ..
++ "to twice the PMM segment size.")).rmempty = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-polipo/luasrc/view/polipo_status.htm b/feeds/luci/applications/luci-app-polipo/luasrc/view/polipo_status.htm
+new file mode 100644
+index 0000000..007d2d5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/luasrc/view/polipo_status.htm
+@@ -0,0 +1,18 @@
++<%
++
++local uci = require "luci.model.uci".cursor()
++local addr = "127.0.0.1"
++local port = uci:get("polipo", "general", "proxyPort") or "8123"
++
++-%>
++
++<%+header%>
++
++<div class="cbi-map">
++ <h2 name="content"><%:Polipo Status%></h2>
++ <div class="cbi-section">
++ <iframe id="sf" src="http://<%=luci.http.getenv('SERVER_NAME')%>:<%=port%>/polipo/" style="width:100%; height:350px; border:none"></iframe>
++ </div>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-polipo/po/ca/polipo.po b/feeds/luci/applications/luci-app-polipo/po/ca/polipo.po
+new file mode 100644
+index 0000000..76a7093
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/ca/polipo.po
+@@ -0,0 +1,299 @@
++# polipo.pot
++# generated from ./applications/luci-polipo/luasrc/i18n/polipo.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-06-02 05:16+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Ajusts avançats"
++
++msgid "Allowed clients"
++msgstr "Clients permesos"
++
++msgid "Always use system DNS resolver"
++msgstr "Sempre utilitza el resolutor DNS del sistema"
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++"Se suporta autenticació HTTP bàsica. Entra el nom d'usuari i contrasenya en "
++"format usuari:contrasenya."
++
++msgid "Configuration"
++msgstr "Configuració"
++
++msgid "DNS and Query Settings"
++msgstr "Ajusts de DNS i petició"
++
++msgid "DNS server address"
++msgstr "Adreça de servidor DNS"
++
++msgid "Delete cache files time"
++msgstr "Hora d'esborrat de fitxers de memòria cau"
++
++msgid "Disk cache location"
++msgstr "Localització de la memòria cau del disc"
++
++msgid "Do not query IPv6"
++msgstr "No consultis IPv6"
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "Activa si la memòria cau (proxy) és compartida per múltiples usuaris."
++
++msgid "First PMM segment size (in bytes)"
++msgstr "Mida de segment del primer PMM (en bytes)"
++
++msgid "General Settings"
++msgstr "Ajusts generals"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "Quanta RAM hauria de fer servir Polipo per la seva memòria cau"
++
++msgid "In RAM cache size (in bytes)"
++msgstr "Mida de memòria cau a la RAM (en bytes)"
++
++msgid "Listen address"
++msgstr "Adreça que rep connexions"
++
++msgid "Listen port"
++msgstr "Port que rep connexions"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++"Localització on polipo desarà els fitxers de memòria cau permanentment. Es "
++"recomana l'ús de dispositius d'emmagatzematge extern, perquè la memòria cau "
++"pot créixer considerablement. Deixa-ho buit per desactivar la memòria cau en "
++"disc."
++
++msgid "Log file location"
++msgstr "Localització de fitxer registre"
++
++msgid "Log to syslog"
++msgstr "Registra al syslog"
++
++msgid "Logging and RAM"
++msgstr "Registre i RAM"
++
++msgid "Never use system DNS resolver"
++msgstr "Mai utilitzis el resolutor DNS del sistema"
++
++msgid "On-Disk Cache"
++msgstr "Memòria cau en disc"
++
++msgid "PMM segments size (in bytes)"
++msgstr "Mida de segments MMS (en bytes)"
++
++msgid "Parent Proxy"
++msgstr "Proxy pare"
++
++msgid "Parent proxy address"
++msgstr "Adreça de proxy pare"
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++"Adreça de proxy pare (en format host:port), al que Polipo readreçarà les "
++"sol·licituds."
++
++msgid "Parent proxy authentication"
++msgstr "Autenticació de proxy pare"
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr "Estat del Polipo"
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "Polipo és un proxy caché web petit i ràpid."
++
++msgid "Poor Man's Multiplexing"
++msgstr "Multiplexació Poor Man's"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++"Multiplexació Poor Man's (PMM) és una tècnica que multiplexa sol·licitant "
++"una instància en segments múltiples. Intenta reduir la latència causada per "
++"la feblesa del protocol HTTP. NOTA: algunes pàgines poden no funcionar amb "
++"la PMM activada."
++
++msgid "Port on which Polipo will listen"
++msgstr "Port en que el Polipo escolta"
++
++msgid "Proxy"
++msgstr "Proxy"
++
++msgid "Query DNS by hostname"
++msgstr "Consulta DNS per nom de màquina"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr "Consulta DNS per IPv6"
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr "Consulta IPv4 i IPv6, prefereix IPv4"
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr "Consulta IPv4 i IPv6, prefereix IPv6"
++
++msgid "Query only IPv6"
++msgstr "Consulta només IPv6"
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++"Estableix l'adreça de servidor DNS a utilitzar, si vols que Polipo faci "
++"servir un servidor DNS diferent al del sistema."
++
++msgid "Shared cache"
++msgstr "Memòria cau compartida"
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++"Mida del primer segment PMM. Si no es defineix, per defecte és el doble de "
++"la mida de segment MMS."
++
++msgid "Size to which cached files should be truncated"
++msgstr "Mida a que els fitxers en memòria cau es deuen truncar"
++
++msgid "Status"
++msgstr "Estat"
++
++msgid "Syslog facility"
++msgstr "Instal·lació syslog"
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++"La interfície a la que Polipo rebrà les connexions. Per rebre-les a a totes "
++"les interfícies, utilitza 0.0.0.0 o :: (IPv6)."
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr "Mida de truncatge de fitxer de memòria cau (en bytes)"
++
++msgid "Truncate cache files time"
++msgstr "Hora de truncatge de fitxers de memòria cau"
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++"Es recomana l'ǘs de dispositius d'emmagatzematge externs, ja que el fitxer "
++"de registre és escrit freqüentment i pot créixer considerablement."
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr "habilita"
++
++#~ msgid ""
++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should "
++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/"
++#~ "polipo_purge script. For example to perform disk cache cleanup every day "
++#~ "at 6:00 in the morning you should add the following line in Scheduled "
++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)."
++#~ msgstr ""
++#~ "Per activar la neteja memòria cau en disc de polipo (altament recomenat), "
++#~ "hauries d'afegir una tasca de cron al servei de Tasques Programades que "
++#~ "executaran l'script /usr/sbin/polipo_purge. Per exemple, per executar la "
++#~ "neteja de memòria cau del disc cada dia a les 6:00 del matí, hauries "
++#~ "d'afegir la següent línia a les Tasques Programades: \"0 6 * * * /usr/"
++#~ "sbin/polipo_purge\" (sense cometes)."
++
++#~ msgid ""
++#~ "Size to which cached files should be truncated. (default value: 1048576)"
++#~ msgstr ""
++#~ "Mida a la qual els fitxers de memòria cau s'haurien de truncar (valor per "
++#~ "defecte: 1048576)"
++
++#~ msgid ""
++#~ "Time after which cached files will be truncated. (default value: 4d12h)"
++#~ msgstr ""
++#~ "Hora després de la qual els fitxers de memòria cau es truncaran (valor "
++#~ "per defecte: 4d12h)."
++
++#~ msgid "Time after which cached files will be deleted. (default value: 32d)"
++#~ msgstr ""
++#~ "Hora després de la qual els fitxers de memòria s'esborraran (valor per "
++#~ "defecte: 32d)."
++
++#~ msgid "General"
++#~ msgstr "General"
++
++#~ msgid ""
++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++#~ "that are allowed to connect. The format is IP address or network address "
++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))."
++#~ msgstr ""
++#~ "Quan l'adreça d'escolta s'estableix a 0.0.0.0 o :: (IPv6), has de llistar "
++#~ "els clients que es permeten per connectar. El format és adreça IP o "
++#~ "adreça de xarxa (192.168.1.123, 192.168.1.0/24, 2001:660:116::/47 (IPv6))."
++
++#~ msgid ""
++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily "
++#~ "= Query both, prefer IPv6; true = Query only IPv6"
++#~ msgstr ""
++#~ "fals = No consultis IPv6; a contracor = Consulta els dos, prefereix IPv4; "
++#~ "feliçment = Consulta els dos, prefereix IPv6; cert = Consulta només IPv6"
++
++#~ msgid ""
++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, "
++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query "
++#~ "DNS directly, if host could not be found fallback to system DNS resolver; "
++#~ "true = Always use system DNS resolver"
++#~ msgstr ""
++#~ "fals = mai utilitzis resoledor DNS; a contracor = Consulta DNS "
++#~ "directament, si el servidor DNS està indisponible no utilitzis el sistema "
++#~ "resoledor de DNS; feliçment = Consulta DNS directament, si la màquina no "
++#~ "es pot trobar, vés al sistema resoledor de DNS; cert = Utilitza sistema "
++#~ "resoledor DNS sempre"
++
++#~ msgid "Port on which Polipo will listen. (default value: 8123)"
++#~ msgstr "Port al que Polipo rebrà les connexions (valor per defecte: 8123)."
++
++#~ msgid "polipo_pmm_pmmsize_desc"
++#~ msgstr ""
++#~ "Per habilitar el PMM, la mida dels segments PMM s'ha d'establir a algun "
++#~ "valor positiu."
+diff --git a/feeds/luci/applications/luci-app-polipo/po/cs/polipo.po b/feeds/luci/applications/luci-app-polipo/po/cs/polipo.po
+new file mode 100644
+index 0000000..9fa249d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/cs/polipo.po
+@@ -0,0 +1,205 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-11 19:47+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "PokroÄilé nastavení"
++
++msgid "Allowed clients"
++msgstr "Povolení klienti"
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr "Konfigurace"
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr "Velikost prvního PMM segmentu (v bajtech)"
++
++msgid "General Settings"
++msgstr "Obecné nastavení"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr "Velikost PMM segmentů (v bajtech)"
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr "Stav Polipo"
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr "Proxy"
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr "Stav"
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr "povolit"
+diff --git a/feeds/luci/applications/luci-app-polipo/po/de/polipo.po b/feeds/luci/applications/luci-app-polipo/po/de/polipo.po
+new file mode 100644
+index 0000000..50f7819
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/de/polipo.po
+@@ -0,0 +1,272 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2013-01-29 20:21+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Erweiterte Einstellungen"
++
++msgid "Allowed clients"
++msgstr "Zugelassene Clients"
++
++msgid "Always use system DNS resolver"
++msgstr "Immer DNS-Auflösung des Systems benutzen"
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++"HTTP-Basis-Anmeldung wird unterstützt. Geben Sie Benutzernamen und Passwort "
++"im Format benutzername:passwort an."
++
++msgid "Configuration"
++msgstr "Konfiguration"
++
++msgid "DNS and Query Settings"
++msgstr "Einstellungen für DNS und Abfragen"
++
++msgid "DNS server address"
++msgstr "Adresse des DNS-Servers"
++
++msgid "Delete cache files time"
++msgstr "Zeit zur Lösching der Cache-Dateien"
++
++msgid "Disk cache location"
++msgstr "Cache-Verzeichnis"
++
++msgid "Do not query IPv6"
++msgstr "IPv6 nicht abfragen"
++
++# Klingt komisch
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "Aktivieren, falls Cache (Proxy) von mehreren Benutzern verwendet wird."
++
++msgid "First PMM segment size (in bytes)"
++msgstr "Größe des ersten PMM - Segment in bytes"
++
++msgid "General Settings"
++msgstr "Allgemeine Einstellungen"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "Wie viel Arbeitsspeicher soll Polipo für den Cache verwenden."
++
++msgid "In RAM cache size (in bytes)"
++msgstr "Größe des Caches im Arbeitsspeicher (Bytes)"
++
++msgid "Listen address"
++msgstr "Aktive Adresse"
++
++msgid "Listen port"
++msgstr "Aktiver Port"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++"Speicherort für permanent gespeicherte Dateien. Es wird die Benutzung von "
++"externen Datenträgern empfohlen, da der Cache sehr groß werden kann. Lassen "
++"Sie diese Option leer um den Cache zu deaktivieren."
++
++msgid "Log file location"
++msgstr "Ort der Log-Datei"
++
++msgid "Log to syslog"
++msgstr "Ereignisse im Systemprotokoll (syslog) speichern"
++
++msgid "Logging and RAM"
++msgstr "Protokollierung und Speicher"
++
++msgid "Never use system DNS resolver"
++msgstr "DNS-Auflösung des Systems niemals verwenden"
++
++msgid "On-Disk Cache"
++msgstr "Festplatten-Cache"
++
++msgid "PMM segments size (in bytes)"
++msgstr "Größe des normalen PMM - Segment in bytes"
++
++msgid "Parent Proxy"
++msgstr "Ãœbergeordneter Proxy"
++
++msgid "Parent proxy address"
++msgstr "Adresse des übergeordneten Proxy-Servers"
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++"Adresse des Ãœbergeordneten Proxyservers (im Format host:port), an den Polipo "
++"die Anfragen weiterleiten soll."
++
++msgid "Parent proxy authentication"
++msgstr "Authentifizierung für übergeordneten Proxyserver"
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr "Polipo-Status"
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "Polipo ist ein kleiner und schneller Webproxy."
++
++msgid "Poor Man's Multiplexing"
++msgstr "<abbr title=\"Poor Mans Multiplexing\">PMM</abbr>"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++"Poor Man's Multiplexing (PMM) ist eine Technik, welche Multiplexing "
++"simuliert, indem eine Instanz in mehreren Teilen angefordert wird. Damit "
++"wird versucht, die durch Schwächen im HTTP-Protokoll verursachten Latenzen "
++"auszugleichen. ACHTUNG: Einige Webseiten könnten bei aktivem PMM nicht "
++"funktionieren."
++
++msgid "Port on which Polipo will listen"
++msgstr "Port, an dem Polipo lauscht"
++
++msgid "Proxy"
++msgstr "Proxy"
++
++msgid "Query DNS by hostname"
++msgstr "DNS-Abfrage über Hostname"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr "direkte DNS-Abfrage, Rückgriff auf System-Auflösung"
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++"direkte DNS-Abfrage, Rückgriff auf System-Auflösung für unbekannte Hosts"
++
++msgid "Query DNS for IPv6"
++msgstr "DNS-Abfrage für IPv6"
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr "DNS-Abfrage für IPv4 und IPv6, bevorzuge IPv4"
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr "DNS-Abfrage für IPv4 und IPv6, bevorzuge IPv6"
++
++msgid "Query only IPv6"
++msgstr "Nur IPv6 abfragen"
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++"Geben Sie einen DNS-Server an, wenn Polipo diesen Server statt des "
++"systemeigenen DNS-Servers verwenden soll."
++
++# Verteilt? Gemeinsam?
++msgid "Shared cache"
++msgstr "Gemeinsamer Cache"
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++"Größe des ersten Segments. Wenn diese Option leer ist, wird hierfür die "
++"Doppelte Größe des PMM-Segments angenommen"
++
++msgid "Size to which cached files should be truncated"
++msgstr "Größe, auf die zwischengespeicherte Dateien beschnitten werden sollen"
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Syslog facility"
++msgstr "System-Protokollierungsfunktion"
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++"Aktive Schnittstelle für Polipo. Um Polipo auf allen Schnittstellen zu "
++"aktivieren, bitte 0.0.0.0 bzw. :: (IPv6) angeben."
++
++msgid "Time after which cached files will be deleted"
++msgstr "Zeit, nach der zwischengespeicherte Dateien gelöscht werden"
++
++msgid "Time after which cached files will be truncated"
++msgstr "Zeit, nach der zwischengespeicherte Dateien beschnitten werden"
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr "Um PMM zu aktivieren muss hier ein Wert eingetragen werden"
++
++msgid "Truncate cache files size (in bytes)"
++msgstr "Zwischengespeicherte Dateien auf (Bytes) beschneiden"
++
++msgid "Truncate cache files time"
++msgstr "Zwischengespeicherte Dateien nach (Zeit) beschneiden"
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++"Es sollte ein externes Speichermedium verwendet werden, da häufig in die "
++"Protokolldatei geschrieben wird; sie kann dadurch sehr groß werden."
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++"Ist die aktive Adresse auf 0.0.0.0 oder or :: (IPv6) gesetzt, müssen "
++"Clients, die sich verbinden dürfen, angegeben werden. Das Format ist "
++"entweder IP- oder Netzwerk-Adresse (192.168.1.123, 192.168.1.0/24, "
++"2001:660:116::/48 (IPv6))"
++
++msgid "enable"
++msgstr "aktivieren"
++
++#, fuzzy
++#~ msgid "Time after which cached files will be deleted. (default value: 32d)"
++#~ msgstr ""
++#~ "Speicherort für permanent gespeicherte Dateien. Es wird die Benutzung von "
++#~ "externen Datenträgern empfohlen, da der Cache sehr groß werden kann. "
++#~ "Lassen Sie diese Option leer um den Cache zu deaktivieren."
++
++#~ msgid "General"
++#~ msgstr "Allgemein"
++
++#, fuzzy
++#~ msgid ""
++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++#~ "that are allowed to connect. The format is IP address or network address "
++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))."
++#~ msgstr ""
++#~ "Wenn der Server auf alle Anfragen (0.0.0.0 bzw. ::) hört, dann müssen die "
++#~ "zugelassenen Gegenpunkte, die berechtig sind eine Verbindung aufzubauen, "
++#~ "hier eingetragen werden. Als Format hier bitte die IP-Adresse oder "
++#~ "Nerzwerkmaske auswählen (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 "
++#~ "(IPv6))"
++
++#, fuzzy
++#~ msgid ""
++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily "
++#~ "= Query both, prefer IPv6; true = Query only IPv6"
++#~ msgstr ""
++#~ "false = Beachtet IPv6 nicht, nur IPv4 möglich; reluctantly = Beachtet "
++#~ "sowohl IPv4 als auch IPv6, IPv4 wird bevorzugt; happily = Beachtet sowohl "
++#~ "IPv4 als auch IPv6, IPv6 wird bevorzugt; true = Beachtet IPv4 nicht, nur "
++#~ "IPv6 möglich"
++
++#, fuzzy
++#~ msgid "Port on which Polipo will listen. (default value: 8123)"
++#~ msgstr ""
++#~ "Beschreibt, welcher Port von Polipo genutzt werden soll. "
++#~ "Grundeinstellung: Port 8123"
+diff --git a/feeds/luci/applications/luci-app-polipo/po/el/polipo.po b/feeds/luci/applications/luci-app-polipo/po/el/polipo.po
+new file mode 100644
+index 0000000..e7a62dd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/el/polipo.po
+@@ -0,0 +1,207 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-28 02:08+0200\n"
++"PO-Revision-Date: 2012-03-18 15:29+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr "Γενικές Ρυθμίσεις"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/en/polipo.po b/feeds/luci/applications/luci-app-polipo/po/en/polipo.po
+new file mode 100644
+index 0000000..1bdb0c1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/en/polipo.po
+@@ -0,0 +1,284 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:35+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr "Allowed clients"
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr "DNS server address"
++
++msgid "Delete cache files time"
++msgstr "Delete cache files time"
++
++msgid "Disk cache location"
++msgstr "Disk cache location"
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "Enable if cache (proxy) is shared by multiple users."
++
++msgid "First PMM segment size (in bytes)"
++msgstr "First PMM segment size (in bytes)"
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "How much RAM should Polipo use for its cache."
++
++msgid "In RAM cache size (in bytes)"
++msgstr "In RAM cache size (in bytes)"
++
++msgid "Listen address"
++msgstr "Listen address"
++
++msgid "Listen port"
++msgstr "Listen port"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++
++msgid "Log file location"
++msgstr "Log file location"
++
++msgid "Log to syslog"
++msgstr "Log to syslog"
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr "On-Disk Cache"
++
++msgid "PMM segments size (in bytes)"
++msgstr "PMM segments size (in bytes)"
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr "Parent proxy address"
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++
++msgid "Parent proxy authentication"
++msgstr "Parent proxy authentication"
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "Polipo is a small and fast caching web proxy."
++
++msgid "Poor Man's Multiplexing"
++msgstr "Poor Man&#39;s Multiplexing"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++"Poor Man&#39;s Multiplexing (PMM) is a technique that simulates multiplexing "
++"by requesting an instance in multiple segments. It tries to lower the "
++"latency caused by the weakness of HTTP protocol. NOTE: some sites may not "
++"work with PMM enabled."
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr "Query DNS by hostname"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr "Query DNS for IPv6"
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++
++msgid "Shared cache"
++msgstr "Shared cache"
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr "Syslog facility"
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr "To enable PMM, PMM segment size must be set to some positive value."
++
++msgid "Truncate cache files size (in bytes)"
++msgstr "Truncate cache files size (in bytes)"
++
++msgid "Truncate cache files time"
++msgstr "Truncate cache files time"
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
++
++#~ msgid ""
++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should "
++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/"
++#~ "polipo_purge script. For example to perform disk cache cleanup every day "
++#~ "at 6:00 in the morning you should add the following line in Scheduled "
++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)."
++#~ msgstr ""
++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should "
++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/"
++#~ "polipo_purge script. For example to perform disk cache cleanup every day "
++#~ "at 6:00 in the morning you should add the following line in Scheduled "
++#~ "Tasks \"0 6 * * *\t/usr/sbin/polipo_purge\" (without quotes)."
++
++#~ msgid ""
++#~ "Size to which cached files should be truncated. (default value: 1048576)"
++#~ msgstr ""
++#~ "Size to which cached files should be truncated. (default value: 1048576)"
++
++#~ msgid ""
++#~ "Time after which cached files will be truncated. (default value: 4d12h)"
++#~ msgstr ""
++#~ "Time after which cached files will be truncated. (default value: 4d12h)"
++
++#~ msgid "Time after which cached files will be deleted. (default value: 32d)"
++#~ msgstr "Time after which cached files will be deleted. (default value: 32d)"
++
++#~ msgid "General"
++#~ msgstr "General"
++
++#~ msgid ""
++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++#~ "that are allowed to connect. The format is IP address or network address "
++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))."
++#~ msgstr ""
++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++#~ "that are allowed to connect. The format is IP address or network address "
++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))."
++
++#~ msgid ""
++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily "
++#~ "= Query both, prefer IPv6; true = Query only IPv6"
++#~ msgstr ""
++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily "
++#~ "= Query both, prefer IPv6; true = Query only IPv6"
++
++#~ msgid ""
++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, "
++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query "
++#~ "DNS directly, if host could not be found fallback to system DNS resolver; "
++#~ "true = Always use system DNS resolver"
++#~ msgstr ""
++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, "
++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query "
++#~ "DNS directly, if host could not be found fallback to system DNS resolver; "
++#~ "true = Always use system DNS resolver"
++
++#~ msgid "Port on which Polipo will listen. (default value: 8123)"
++#~ msgstr "Port on which Polipo will listen. (default value: 8123)"
+diff --git a/feeds/luci/applications/luci-app-polipo/po/es/polipo.po b/feeds/luci/applications/luci-app-polipo/po/es/polipo.po
+new file mode 100644
+index 0000000..84ba24e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/es/polipo.po
+@@ -0,0 +1,307 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-09-02 08:33+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Configuración Avanzada"
++
++msgid "Allowed clients"
++msgstr "Clientes permitos"
++
++msgid "Always use system DNS resolver"
++msgstr "Usar siempre el DNS del sistema"
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++"Autenticación soportada: Basic HTTP. Provee del nombre de usuario y "
++"contraseña in el formato username:password."
++
++msgid "Configuration"
++msgstr "Configuración"
++
++msgid "DNS and Query Settings"
++msgstr "Configuración de DNS y consultas"
++
++msgid "DNS server address"
++msgstr "Dirección del servidor DNS"
++
++msgid "Delete cache files time"
++msgstr "Tiempo para eliminar archivos de cache"
++
++msgid "Disk cache location"
++msgstr "Ubicación de la caché de disco"
++
++msgid "Do not query IPv6"
++msgstr "No consultar IPv6"
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "Activar si la cache (proxy) es compartida por múltiples usuarios."
++
++msgid "First PMM segment size (in bytes)"
++msgstr "Tamaño del primer segmento PMM (en bytes)"
++
++msgid "General Settings"
++msgstr "Configuración general"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "Cuánta RAM debe usar Polipo como caché."
++
++msgid "In RAM cache size (in bytes)"
++msgstr "Tamaño (en bytes) de la cache en RAM"
++
++msgid "Listen address"
++msgstr "Dirección de escucha"
++
++msgid "Listen port"
++msgstr "Puerto de escucha"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++"Ubicación en la que Polipo creará archivos permanentemente. Se recomienda el "
++"uso de dispositivos de almacenamiento externo, ya que la caché puede "
++"aumentar considerablemente. Deje en blanco para desactivar la caché en disco."
++
++msgid "Log file location"
++msgstr "Ubicación del archivo de registro"
++
++msgid "Log to syslog"
++msgstr "Registrar en syslog"
++
++msgid "Logging and RAM"
++msgstr "Registro y RAM"
++
++msgid "Never use system DNS resolver"
++msgstr "Nunca usar el DNS del sistema"
++
++msgid "On-Disk Cache"
++msgstr "Cache en disco"
++
++msgid "PMM segments size (in bytes)"
++msgstr "Tamaño de segmentos PMM (en bytes)"
++
++msgid "Parent Proxy"
++msgstr "Proxy padre"
++
++msgid "Parent proxy address"
++msgstr "Dirección del proxy padre"
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++"Dirección del proxy padre (en formato máquina:puerto), al cual Polipo "
++"traspasará las peticiones."
++
++msgid "Parent proxy authentication"
++msgstr "Autentificación con el proxy padre"
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr "Estado de Polipo"
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "Polipo es un servidor proxy web pequeño y rápido."
++
++msgid "Poor Man's Multiplexing"
++msgstr "Multiplexación Poor Man's"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++"La Multiplexación Poor Man's (PMM) simula multiplexación solicitando una "
++"instancia en múltiples segmentos. Intenta reducir la latencia provocada por "
++"la debilidad del protocolo HTTP. NOTA: algunos sitios pueden no funcionar "
++"con PMM habilitado."
++
++msgid "Port on which Polipo will listen"
++msgstr "Puerto de escucha de Polipo"
++
++msgid "Proxy"
++msgstr "Proxy"
++
++msgid "Query DNS by hostname"
++msgstr "Consultar DNS por nombre de máquina"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr "Consultar DNS directamente y si falla probar con el del sistema"
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++"Consultar DNS directamente y para máquinas desconocidas probar con el del "
++"sistema"
++
++msgid "Query DNS for IPv6"
++msgstr "Consulta DNS para IPv6"
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr "Consultar IPv4 e IPv6, pero mejor IPv4"
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr "Consultar IPv4 e IPv6, pero mejor IPv6"
++
++msgid "Query only IPv6"
++msgstr "Consultar solo IPv6"
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++"Indique la dirección del servidor DNS a utilizar, si prefiere que Polipo "
++"utilice una dirección para el servidor DNS distinta al utilizado en el "
++"sistema."
++
++msgid "Shared cache"
++msgstr "Cache compartida"
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++"Tamaño del primer segmento PMM. Si no se encuentra definido, su valor por "
++"defecto es el doble del tamaño del segmento PMM."
++
++msgid "Size to which cached files should be truncated"
++msgstr "Tamaño máximo de los ficheros caché"
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Syslog facility"
++msgstr "Utilidad Syslog"
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++"Interfaz de escucha de Polipo. Para hacerlo en todas utilice 0.0.0.0 o :: "
++"(IPv6)."
++
++msgid "Time after which cached files will be deleted"
++msgstr "Tiempo tras el que se borrarán los ficheros en caché"
++
++msgid "Time after which cached files will be truncated"
++msgstr "Tiempo tras el que se truncarán los ficheros en caché"
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++"Para activar PMM, el tamaño de segmento PMM debe tener un valor positivo."
++
++msgid "Truncate cache files size (in bytes)"
++msgstr "Truncar el tamaño del archivo de la cache (en bytes)"
++
++msgid "Truncate cache files time"
++msgstr "Truncar tiempos en el archivo de cache"
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++"El uso de un dispositivo externo de almacenamiento es recomendado, debido a "
++"que el archivo log es escrito con mucha frecuencia y el mismo puede "
++"incrementar su tamaño de forma considerable."
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++"Si la dirección de escucha es 0.0.0.0 o :: (IPv6), debe listar a los "
++"clientes a los que se permitirá conectar. El formato es dirección IP o "
++"dirección de red (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++
++msgid "enable"
++msgstr "activar"
++
++#~ msgid ""
++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should "
++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/"
++#~ "polipo_purge script. For example to perform disk cache cleanup every day "
++#~ "at 6:00 in the morning you should add the following line in Scheduled "
++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)."
++#~ msgstr ""
++#~ "Para activar la limpieza de la cache en disco polipo (recomendada), se "
++#~ "recomienda agregar un trabajo al cron in los Servicios de Tareas "
++#~ "Programadas el cual ejecutará el script /usr/sbin/polipo_purge. Por "
++#~ "ejemplo para ejecutar una limpieza de la cache de disco todos los días a "
++#~ "las 6:00 a.m. deberá agregar la siguiente línea en el Servicio de Tareas "
++#~ "Programadas.-&amp;quot;0 6 * * * /usr/sbin/polipo_purge&amp;quot; (sin "
++#~ "las comillas)."
++
++#~ msgid ""
++#~ "Size to which cached files should be truncated. (default value: 1048576)"
++#~ msgstr ""
++#~ "Tamaño del archivo sobre el cual la cache deberá ser truncada. (valor por "
++#~ "defecto: 1048576)"
++
++#~ msgid ""
++#~ "Time after which cached files will be truncated. (default value: 4d12h)"
++#~ msgstr ""
++#~ "Tiempo transcurrido necesario antes de truncar los archivos cacheado. "
++#~ "(valor por defecto: 4d12h)"
++
++#~ msgid "Time after which cached files will be deleted. (default value: 32d)"
++#~ msgstr ""
++#~ "Tiempo transcurrido necesario antes de eliminar los archivos en la cache. "
++#~ "(valor por defecto: 32d)"
++
++#~ msgid "General"
++#~ msgstr "General"
++
++#~ msgid ""
++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++#~ "that are allowed to connect. The format is IP address or network address "
++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))."
++#~ msgstr ""
++#~ "Cuando la dirección a escuchar es establecida en 0.0.0.0 or :: (en caso "
++#~ "de utilizar IPv6), deberá listar los clientes que se encuentran permitos "
++#~ "a conectarse. El formato a utilizar deberá indicarse con la dirección IP "
++#~ "o bien la dirección de Red.Por ejemplo: (192.168.1.123, 192.168.1.0/24, "
++#~ "2001:660:116::/48 (IPv6))."
++
++#~ msgid ""
++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily "
++#~ "= Query both, prefer IPv6; true = Query only IPv6"
++#~ msgstr ""
++#~ "false = No consulta IPv6, reluctantly = Consulta ambos, preferencia IPv4; "
++#~ "happily = Consulta ambos, preferencia IPv6; true = Consulta sólamente IPv6"
++
++#~ msgid ""
++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, "
++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query "
++#~ "DNS directly, if host could not be found fallback to system DNS resolver; "
++#~ "true = Always use system DNS resolver"
++#~ msgstr ""
++#~ "false = Nunca use el sistema de resolución de DNS, reluctantly = "
++#~ "Consultar DNS directamente, si el servidor DNS no está disponible al "
++#~ "utilizar el sistema de resolución de DNS, hapilly = Consultar DNS "
++#~ "directamente, si el host no se pudo encontrar volver al sistema de "
++#~ "resolución de DNS; true = Siempre use el sistema de resolución de DNS"
++
++#~ msgid "Port on which Polipo will listen. (default value: 8123)"
++#~ msgstr "Puerto de escucha que Polipo utilizará. (valor por defecto: 8123)"
++
++#~ msgid "polipo_pmm_pmmsize_desc"
++#~ msgstr ""
++#~ "Para activar PMM, el tamaño del segmento PMM debe ser establecido a un "
++#~ "valor mayor a 0 (valor positivo)."
+diff --git a/feeds/luci/applications/luci-app-polipo/po/fr/polipo.po b/feeds/luci/applications/luci-app-polipo/po/fr/polipo.po
+new file mode 100644
+index 0000000..f4e49ae
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/fr/polipo.po
+@@ -0,0 +1,206 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/he/polipo.po b/feeds/luci/applications/luci-app-polipo/po/he/polipo.po
+new file mode 100644
+index 0000000..931228e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/he/polipo.po
+@@ -0,0 +1,202 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/hu/polipo.po b/feeds/luci/applications/luci-app-polipo/po/hu/polipo.po
+new file mode 100644
+index 0000000..931228e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/hu/polipo.po
+@@ -0,0 +1,202 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/it/polipo.po b/feeds/luci/applications/luci-app-polipo/po/it/polipo.po
+new file mode 100644
+index 0000000..6bc0669
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/it/polipo.po
+@@ -0,0 +1,219 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-02-09 19:56+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Impostazioni avanzate"
++
++msgid "Allowed clients"
++msgstr "Clients permessi"
++
++# che è sto DNS RESOLVER?
++msgid "Always use system DNS resolver"
++msgstr "Usa sempre DNS resolver"
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++"Autenticazione base HTTP supportata. Fornire username e password in formato "
++"username:password."
++
++msgid "Configuration"
++msgstr "Configurazione"
++
++msgid "DNS and Query Settings"
++msgstr "Settaggi DNS e Query"
++
++msgid "DNS server address"
++msgstr "Indirizzo del server DNS"
++
++msgid "Delete cache files time"
++msgstr "Svuota la cache file dopo"
++
++msgid "Disk cache location"
++msgstr "Percorso della cache del disco"
++
++msgid "Do not query IPv6"
++msgstr "Non ignorare query IPv6"
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "Abilita se la cache (del proxy) e' condivisa tra gli utenti."
++
++msgid "First PMM segment size (in bytes)"
++msgstr "Dimensione del primo segmento PMM (in bytes)"
++
++msgid "General Settings"
++msgstr "Impostazioni genarali"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "Quanta RAM dovrebbe Polipo usa come sua cache."
++
++msgid "In RAM cache size (in bytes)"
++msgstr "In RAM cache size (in bytes)"
++
++msgid "Listen address"
++msgstr "Indirizzi ip da \"ascoltare\""
++
++msgid "Listen port"
++msgstr "Porta"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++"Percorso dove polipo memorizzerà i files di cache permanentemente. L'uso di "
++"un dispositivo di memorizzazione esterno è raccomandato. Lasciare vuoto per "
++"disabilitare la cache sul disco."
++
++msgid "Log file location"
++msgstr "Percorso del file di log"
++
++msgid "Log to syslog"
++msgstr "Pubblica il log nel syslog"
++
++msgid "Logging and RAM"
++msgstr "Registra in RAM"
++
++msgid "Never use system DNS resolver"
++msgstr "Non usare mai DNS RESOLVER"
++
++msgid "On-Disk Cache"
++msgstr "On-Disk Cache"
++
++msgid "PMM segments size (in bytes)"
++msgstr "DImensione segmenti PMM (in bytes)"
++
++msgid "Parent Proxy"
++msgstr "Parent Proxy"
++
++msgid "Parent proxy address"
++msgstr "Indirizzo parent proxy"
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++"Indirizzi del parent proxy (nel formato ip:porta), al quale Polipo dovrà "
++"inoltrare le richieste."
++
++msgid "Parent proxy authentication"
++msgstr "Autentificazione Parent proxy"
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr "Stato Polipo"
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "Polipo è un piccolo e veloce webcache proxy."
++
++msgid "Poor Man's Multiplexing"
++msgstr "Poor Man's Multiplexing"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++"Poor Man's Multiplexing (PMM) è una tecnica che simula il multiplexing "
++"richiedendo una nuova istanza del segmento. Questo server per abbassare la "
++"latenza causata dalla debolezza del protocollo HTTP. NOTA: alcuni siti "
++"potrebbero non funzionare con PMM abilitato."
++
++msgid "Port on which Polipo will listen"
++msgstr "Porta sulla quale Polipo deve rimanere in ascolto"
++
++msgid "Proxy"
++msgstr "Proxy"
++
++msgid "Query DNS by hostname"
++msgstr "Richiesta DNS da parte dell'host"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr "Abilita"
+diff --git a/feeds/luci/applications/luci-app-polipo/po/ja/polipo.po b/feeds/luci/applications/luci-app-polipo/po/ja/polipo.po
+new file mode 100644
+index 0000000..81ce9a7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/ja/polipo.po
+@@ -0,0 +1,229 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-10-06 17:01+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "詳細設定"
++
++msgid "Allowed clients"
++msgstr "アクセスを許å¯ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆ"
++
++msgid "Always use system DNS resolver"
++msgstr "常ã«ã‚·ã‚¹ãƒ†ãƒ ã®DNSåå‰è§£æ±ºã‚’使用ã™ã‚‹"
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++"Basicèªè¨¼ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚\"ユーザーå:パスワード\"ã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã "
++"ã•ã„。"
++
++msgid "Configuration"
++msgstr "設定"
++
++msgid "DNS and Query Settings"
++msgstr "DNSãŠã‚ˆã³ã‚¯ã‚¨ãƒªè¨­å®š"
++
++msgid "DNS server address"
++msgstr "DNSサーãƒãƒ¼ã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++msgid "Delete cache files time"
++msgstr "キャッシュファイルをä¿æŒã™ã‚‹æ™‚é–“"
++
++msgid "Disk cache location"
++msgstr "ディスクキャッシュã®ä¿å­˜å ´æ‰€"
++
++msgid "Do not query IPv6"
++msgstr "IPv6ã®å•ã„åˆã‚ã›ã‚’è¡Œã‚ãªã„"
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "複数ユーザーã§ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’共有ã™ã‚‹å ´åˆã€æœ‰åŠ¹ã«ã—ã¦ãã ã•ã„。"
++
++msgid "First PMM segment size (in bytes)"
++msgstr "ファーストPMM セグメントサイズ (å˜ä½:ãƒã‚¤ãƒˆ)"
++
++msgid "General Settings"
++msgstr "基本設定"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "PolipoãŒRAM上ã§ä½¿ç”¨ã™ã‚‹ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚µã‚¤ã‚ºã‚’設定ã—ã¦ãã ã•ã„。"
++
++msgid "In RAM cache size (in bytes)"
++msgstr "RAM キャッシュサイズ (å˜ä½:ãƒã‚¤ãƒˆ)"
++
++msgid "Listen address"
++msgstr "å¾…ã¡å—ã‘アドレス"
++
++msgid "Listen port"
++msgstr "å¾…ã¡å—ã‘ãƒãƒ¼ãƒˆ"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++"PolipoãŒä½¿ç”¨ã™ã‚‹ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å­˜å ´æ‰€ã‚’設定ã—ã¾ã™ã€‚キャッシュã¯é »ç¹ã«"
++"æ›´æ–°ã•ã‚Œã‚‹ãŸã‚ã€å¤–部デãƒã‚¤ã‚¹ã«ä¿å­˜ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚空欄ã«è¨­å®šã—ãŸå ´åˆã€"
++"ディスクキャッシュã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™ã€‚"
++
++msgid "Log file location"
++msgstr "ログファイルã®ä¿å­˜å ´æ‰€"
++
++msgid "Log to syslog"
++msgstr "syslogã«ãƒ­ã‚°ã‚’記録ã™ã‚‹"
++
++msgid "Logging and RAM"
++msgstr "ログã¨RAM設定"
++
++msgid "Never use system DNS resolver"
++msgstr "システムã®DNSåå‰è§£æ±ºã‚’使用ã—ãªã„"
++
++msgid "On-Disk Cache"
++msgstr "ディスクキャッシュ"
++
++msgid "PMM segments size (in bytes)"
++msgstr "PMM セグメントサイズ (å˜ä½:ãƒã‚¤ãƒˆ)"
++
++msgid "Parent Proxy"
++msgstr "親プロキシ"
++
++msgid "Parent proxy address"
++msgstr "親プロキシ・アドレス"
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++"PolipoãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’転é€ã™ã‚‹ã€è¦ªãƒ—ロキシサーãƒãƒ¼ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’\"ホスト:ãƒãƒ¼ãƒˆç•ª"
++"å·\"ã®å½¢å¼ã§è¨­å®šã—ã¦ãã ã•ã„。"
++
++msgid "Parent proxy authentication"
++msgstr "親プロキシã®èªè¨¼"
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr "Polipo ステータス"
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "Polipoã¯ã€è»½é‡ã§é«˜é€ŸãªWEBプロキシキャッシュサーãƒãƒ¼ã§ã™ã€‚"
++
++msgid "Poor Man's Multiplexing"
++msgstr "Poor Man's Multiplexing"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++"Poor Man's Multiplexing (PMM) ã¯ã€è¤‡æ•°ã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã«æ¸¡ã£ã¦ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’リク"
++"エストã™ã‚‹ã“ã¨ã§ã€å¤šé‡åŒ–をシュミレートã™ã‚‹æŠ€è¡“ã§ã‚ã‚Šã€HTTPプロトコルã®å¼±ç‚¹ã«"
++"よるレイテンシを低減ã™ã‚‹è©¦ã¿ã‚’è¡Œã„ã¾ã™ã€‚注æ„:PMMを有効ã«ã—ã¦ã„ã‚‹ã¨ã€ã„ãã¤ã‹"
++"ã®ã‚µã‚¤ãƒˆã§ã¯ã¤ãªãŒã‚‰ãªããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
++
++msgid "Port on which Polipo will listen"
++msgstr "PolipoãŒå¾…ã¡å—ã‘ã‚’è¡Œã†ãƒãƒ¼ãƒˆç•ªå·ã§ã™ã€‚"
++
++msgid "Proxy"
++msgstr "プロキシ"
++
++msgid "Query DNS by hostname"
++msgstr "ホストåã®DNSå•ã„åˆã‚ã›"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr "IPv6 DNSå•ã„åˆã‚ã›"
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr "IPv4ã¨IPv6ã®å•ã„åˆã‚ã›ã‚’行ㆠ(IPv4を優先)"
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr "IPv4ã¨IPv6ã®å•ã„åˆã‚ã›ã‚’行ㆠ(IPv6を優先)"
++
++msgid "Query only IPv6"
++msgstr "IPv6ã®ã¿å•ã„åˆã‚ã›ã‚’è¡Œã†"
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++"PolipoãŒã‚·ã‚¹ãƒ†ãƒ ã¨ã¯åˆ¥ã®DNSサーãƒãƒ¼ã‚’使用ã™ã‚‹å ´åˆã€DNSサーãƒãƒ¼ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設"
++"定ã—ã¦ãã ã•ã„。"
++
++msgid "Shared cache"
++msgstr "共有キャッシュ"
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++"最åˆã®PMM セグメントã®ã‚µã‚¤ã‚ºã‚’設定ã—ã¾ã™ã€‚設定ã•ã‚Œãªã‹ã£ãŸå ´åˆã€PMM セグメン"
++"トサイズã®å€ã®ã‚µã‚¤ã‚ºã‚’デフォルト値ã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚"
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr "ステータス"
++
++msgid "Syslog facility"
++msgstr "Syslog ファシリティ"
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++"PolipoãŒå¾…ã¡å—ã‘ã‚’è¡Œã†ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ã™ã€‚0.0.0.0 ã¾ãŸã¯ :: (IPv6) を設定ã—"
++"ãŸå ´åˆã€å…¨ã¦ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§å¾…ã¡å—ã‘ã‚’è¡Œã„ã¾ã™ã€‚"
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr "PMM を有効ã«ã™ã‚‹å ´åˆã€PMM セグメントサイズã«ã¯æ­£ã®å€¤ã‚’設定ã—ã¦ãã ã•ã„。"
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++"ログファイルã¯é »ç¹ã«æ›´æ–°ã•ã‚Œã‚‹ãŸã‚ã€å¤–部デãƒã‚¤ã‚¹ã«ä¿å­˜ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚"
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++"å¾…ã¡å—ã‘アドレスを0.0.0.0 ã¾ãŸã¯ :: (IPv6) ã«è¨­å®šã—ãŸå ´åˆã€ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹"
++"クライアントアドレスを設定ã—ã¦ãã ã•ã„。設定フォーマットã¯IPアドレスã‹ãƒãƒƒãƒˆ"
++"ワークアドレスã§ã™ã€‚(例:192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 "
++"(IPv6))"
++
++msgid "enable"
++msgstr "サービスを有効ã«ã™ã‚‹"
+diff --git a/feeds/luci/applications/luci-app-polipo/po/ms/polipo.po b/feeds/luci/applications/luci-app-polipo/po/ms/polipo.po
+new file mode 100644
+index 0000000..7517dcc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/ms/polipo.po
+@@ -0,0 +1,201 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/no/polipo.po b/feeds/luci/applications/luci-app-polipo/po/no/polipo.po
+new file mode 100644
+index 0000000..931228e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/no/polipo.po
+@@ -0,0 +1,202 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/pl/polipo.po b/feeds/luci/applications/luci-app-polipo/po/pl/polipo.po
+new file mode 100644
+index 0000000..698edc9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/pl/polipo.po
+@@ -0,0 +1,231 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-06 22:57+0200\n"
++"Last-Translator: obsy <cezary@eko.one.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Ustawienia zaawansowane"
++
++msgid "Allowed clients"
++msgstr "Dozwolone klienty"
++
++msgid "Always use system DNS resolver"
++msgstr "Zawsze używaj systemowej obsługi DNS"
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++"Obsługiwana podstawowa autoryzacja HTTP. Podaj nazwę użytkownika i hasło w "
++"formie username:hasło."
++
++msgid "Configuration"
++msgstr "Konfiguracja"
++
++msgid "DNS and Query Settings"
++msgstr "Ustawienia DNS i zapytań"
++
++msgid "DNS server address"
++msgstr "Adres serwera DNS"
++
++msgid "Delete cache files time"
++msgstr "Czas usuwania plików cache"
++
++msgid "Disk cache location"
++msgstr "Położenie cache na dysku"
++
++msgid "Do not query IPv6"
++msgstr "Nie wykonuj zapytań IPv6"
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "Włącz, aby cache (proxy) był współdzielony przez wielu użytkowników."
++
++msgid "First PMM segment size (in bytes)"
++msgstr "Rozmiar pierwszego segmentu PMM (w bajtach)"
++
++msgid "General Settings"
++msgstr "Ustawienia ogólne"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "Ile pamięci RAM powinien używać Polipo jako cache."
++
++msgid "In RAM cache size (in bytes)"
++msgstr "Rozmiar cache w RAM (w bajtach)"
++
++msgid "Listen address"
++msgstr "Nasłuchuj adres"
++
++msgid "Listen port"
++msgstr "Nasłuchuj port"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++"Miejsce, w którym Polipo będzie przechowywać pliki cache na stałe. Użycie "
++"zewnętrznego magazynu jest zalecane. Cache może się poważnie zwiększyć. "
++"Pozostaw puste, aby wyłączyć cache na dysku."
++
++msgid "Log file location"
++msgstr "Katalog logów"
++
++msgid "Log to syslog"
++msgstr "Loguj do logu systemowego (syslog)"
++
++msgid "Logging and RAM"
++msgstr "Dziennik i RAM"
++
++msgid "Never use system DNS resolver"
++msgstr "Nigdy nie używaj systemowej obsługi DNS"
++
++msgid "On-Disk Cache"
++msgstr "Cache na dysku"
++
++msgid "PMM segments size (in bytes)"
++msgstr "Rozmiar segmentu PMM (w bajtach)"
++
++msgid "Parent Proxy"
++msgstr "Nadrzędne proxy"
++
++msgid "Parent proxy address"
++msgstr "Adres nadrzędnego proxy"
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++"Adres nadrzędnego proxy (podany jako host:port), do którego Polipo będzie "
++"przekierowywać żądania."
++
++msgid "Parent proxy authentication"
++msgstr "Autoryzacja nadrzędnego proxy"
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr "Status Polipo"
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "Polipo jest małym i szybkim web proxy z obsługą cache."
++
++# "Multipleksowanie Biedaka" brzmi fajniej, ale nie chcę mieć usuniętego konta.
++msgid "Poor Man's Multiplexing"
++msgstr "Poor Man's Multiplexing"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++"Poor Man's Multiplexing (PMM) to technika symulujÄ…ca multipleksowanie "
++"poprzez żądanie instancji w wielu segmentach. Próbuje obniżyć opóźnienia "
++"spowodowane wadami protokołu HTTP. UWAGA: niektóre strony mogą nie działać "
++"przy włączonym PMM!"
++
++msgid "Port on which Polipo will listen"
++msgstr "Port, na którym Polipo będzie nasłuchiwać."
++
++msgid "Proxy"
++msgstr "Proxy"
++
++msgid "Query DNS by hostname"
++msgstr "Zapytanie DNS po nazwie hosta"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr "Odpytuj DNS bezpośrednio, powracając do resolvera systemu"
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++"Odpytuj DNS bezpośrednio, dla nieznanych hostów powróć do resolvera systemu"
++
++msgid "Query DNS for IPv6"
++msgstr "Zapytanie DNS dla IPv6"
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr "Zapytanie DNS dla IPv4 i IPv6, preferowane IPv4"
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr "Zapytanie DNS dla IPv4 i IPv6, preferowane IPv6"
++
++msgid "Query only IPv6"
++msgstr "Zapytanie tylko IPv6"
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++"Ustaw adres serwera DNS do użycia, jeśli chcesz aby Polipo używał innego "
++"DNS`a niż system hosta."
++
++msgid "Shared cache"
++msgstr "Cache udostępniany"
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++"Rozmiar PIERWSZEGO segmentu PMM. Jeśli nie zdefiniowano, jego domyślny "
++"rozmiar to dwu-krotność rozmiaru segmentu PMM."
++
++msgid "Size to which cached files should be truncated"
++msgstr "Rozmiar do którego pliki cache`owane mają być przycięte"
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Syslog facility"
++msgstr "Funkcja (facility) loga systemowego"
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++"Interfejs na którym słucha proxy Polipo. Aby słuchać na wszystkich "
++"interfejsach użyj 0.0.0.0 lub :: dla IPv6"
++
++msgid "Time after which cached files will be deleted"
++msgstr "Czas po którym pliki cache będą skasowane"
++
++msgid "Time after which cached files will be truncated"
++msgstr "Czas po którym pliki cache będą przycięte"
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++"Aby włączyć PMM, rozmiar segmentu PMM musi mieć ustawioną wartość dodatnią."
++
++msgid "Truncate cache files size (in bytes)"
++msgstr "Rozmiar przycinanych plików w cache(w bajtach)"
++
++msgid "Truncate cache files time"
++msgstr "Czas przycinanych plików w cache"
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++"Użycie zewnętrznego nośnika danych wysoce zalecane, plik loga jest "
++"zapisywany okresowo i może urosnąć znacząco."
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++"Jeśli adres nasłuchu ustawiony jest na 0.0.0.0 lub ::(IPv6), musisz "
++"wyszczególnić klientów mających pozwolenie na połączenie. Format to adres IP "
++"lub adres sieci (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++
++msgid "enable"
++msgstr "włączone"
+diff --git a/feeds/luci/applications/luci-app-polipo/po/pt-br/polipo.po b/feeds/luci/applications/luci-app-polipo/po/pt-br/polipo.po
+new file mode 100644
+index 0000000..881d5c0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/pt-br/polipo.po
+@@ -0,0 +1,306 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-09-16 02:36+0200\n"
++"Last-Translator: Julio Cezar <jsilvestree@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Opções Avançadas"
++
++msgid "Allowed clients"
++msgstr "Clientes permitidos"
++
++msgid "Always use system DNS resolver"
++msgstr "Sempre use o resolvedor de DNS do sistema"
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++"A autenticação básica HTTP é suportada. Indique o usuário e senha no formato "
++"usuário:senha."
++
++msgid "Configuration"
++msgstr "Configuração"
++
++msgid "DNS and Query Settings"
++msgstr "Configurações de DNS e Consulta"
++
++msgid "DNS server address"
++msgstr "Endereço do servidor DNS"
++
++msgid "Delete cache files time"
++msgstr "Tempo para remoção dos arquivos de cache"
++
++msgid "Disk cache location"
++msgstr "Localização da cache em disco"
++
++msgid "Do not query IPv6"
++msgstr "Não consulte IPv6"
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "Ativar se a cache (proxy) for compartilhada por múltiplos usuários."
++
++msgid "First PMM segment size (in bytes)"
++msgstr "Tamanho do primeiro segmento PMM (em bytes)"
++
++msgid "General Settings"
++msgstr "Configurações Gerais"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "Quanta memória RAM deverá ser usada pelo Polipo para a sua cache."
++
++msgid "In RAM cache size (in bytes)"
++msgstr "Tamanho da cache na RAM (bytes)"
++
++msgid "Listen address"
++msgstr "Endereço de escuta"
++
++msgid "Listen port"
++msgstr "Porta de escuta"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++"Local onde o polipo guardará permanentemente os arquivos de cache. É "
++"recomendada a utilização de dispositivos de armazenamento externo uma vez "
++"que o cache pode crescer consideravelmente. Deixe em branco para desativar a "
++"cache em disco."
++
++msgid "Log file location"
++msgstr "Localização do arquivo de registo"
++
++msgid "Log to syslog"
++msgstr "Registar para o syslog"
++
++msgid "Logging and RAM"
++msgstr "Registro e RAM"
++
++msgid "Never use system DNS resolver"
++msgstr "Nunca use o resolvedor de DNS do sistema"
++
++msgid "On-Disk Cache"
++msgstr "Cache em Disco"
++
++msgid "PMM segments size (in bytes)"
++msgstr "Tamanho do segmento PMM (em bytes)"
++
++msgid "Parent Proxy"
++msgstr "Porxy Superior"
++
++msgid "Parent proxy address"
++msgstr "Endereço do proxy superior"
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++"Endereço do proxy superior (no formato host:porta), ao qual o Polipo irá "
++"encaminhar os seus pedidos."
++
++msgid "Parent proxy authentication"
++msgstr "Autenticação no proxy superior"
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr "Estado do Polipo"
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "O polipo é um proxy web pequeno e rápido."
++
++msgid "Poor Man's Multiplexing"
++msgstr "Multiplexagem simples"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++"A multiplexagem simples (PMM) consiste na simulação de multiplexagem através "
++"da requisição de um pedido em múltiplos segmentos. O método tenta baixar a "
++"latência causada pela fraqueza do protocolo HTTP. Nota: alguns sites web não "
++"funcionam com a ativação de PMM."
++
++msgid "Port on which Polipo will listen"
++msgstr "Porta na qual o Polipo irá escutar"
++
++msgid "Proxy"
++msgstr "Proxy"
++
++msgid "Query DNS by hostname"
++msgstr "Consultar DNS pelo nome do equipamento"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++"Consulte o DNS diretamente. Alternativamente, use o resolvedor do sistema"
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++"Consulte o DNS diretamente. Para nomes desconhecidos, use o resolvedor do "
++"sistema"
++
++msgid "Query DNS for IPv6"
++msgstr "Consultar DNS para IPv6"
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr "Consulta IPv4 e IPv6, prefere IPv4"
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr "Consulta IPv4 e IPv6, prefere IPv6"
++
++msgid "Query only IPv6"
++msgstr "Consulta somente IPv6"
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++"Define o endereço do servidor de DNS, caso pretenda que o polipo utilize um "
++"servidor DNS diferente do utilizado pelo sistema."
++
++msgid "Shared cache"
++msgstr "Cache compartilhada"
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++"Tamanho do primeiro segmento PMM. Se não estiver definido, reverte para o "
++"dobro do tamanho do segmento PMM."
++
++msgid "Size to which cached files should be truncated"
++msgstr "Tamanho que os arquivos de cache serão truncados"
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Syslog facility"
++msgstr "Categoria dos eventos Polipo no registo do sistema (syslog)"
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++"A interface na qual o Polipo será ativado. Para ativar em todas as "
++"interfaces, use 0.0.0.0 ou :: (IPv6)."
++
++msgid "Time after which cached files will be deleted"
++msgstr "Tempo máximo antes que um arquivo de cache seja apagado"
++
++msgid "Time after which cached files will be truncated"
++msgstr "Tempo máximo antes que um arquivo de cache seja truncado"
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++"Para habilitar o PMM, o tamanho do segmento PMM deve ser definido para algum "
++"valor positivo."
++
++msgid "Truncate cache files size (in bytes)"
++msgstr "Tamanho de truncagem dos arquivos de cache (em bytes)"
++
++msgid "Truncate cache files time"
++msgstr "Tempo de truncagem dos arquivos de cache"
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++"É recomendado o uso de armazenamento de externos pois o arquivo de registro "
++"é escrito frequentemente e pode crescer consideravelmente."
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++"Quando o endereço de escuta for definido como 0.0.0.0 ou :: (IPv6), é "
++"necessário listar quais clientes são permitidos. O formato é o endereço IP "
++"ou o endereço derede (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 "
++"(IPv6))"
++
++msgid "enable"
++msgstr "habilitado"
++
++#~ msgid ""
++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should "
++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/"
++#~ "polipo_purge script. For example to perform disk cache cleanup every day "
++#~ "at 6:00 in the morning you should add the following line in Scheduled "
++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)."
++#~ msgstr ""
++#~ "Para activar a limpeza de cache em disco (altamente recomendado), deve "
++#~ "acrescentar uma tarefa cron (\"Serviços\") que execute o script /usr/sbin/"
++#~ "polipo_purge. Como exemplo, para executar uma limpeza da cache "
++#~ "diariamente pelas 06H00 deve acrescentar a seguinte linha: \"0 6 * * * /"
++#~ "usr/sbin/polipo_purge\" (sem as aspas)."
++
++#~ msgid ""
++#~ "Size to which cached files should be truncated. (default value: 1048576)"
++#~ msgstr ""
++#~ "Tamanho com o qual devem ser trancados os ficheiros da cache. (valor pre-"
++#~ "definido: 1048576)"
++
++#~ msgid ""
++#~ "Time after which cached files will be truncated. (default value: 4d12h)"
++#~ msgstr ""
++#~ "Tempo após o qual os ficheiros de cache serão trancados. (valor pre-"
++#~ "definido: 4d12h)"
++
++#~ msgid "Time after which cached files will be deleted. (default value: 32d)"
++#~ msgstr ""
++#~ "Tempo apos o qual os ficheiros de cache serão removidos. (valor pré-"
++#~ "definido: 32d)"
++
++#~ msgid "General"
++#~ msgstr "Geral"
++
++#~ msgid ""
++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++#~ "that are allowed to connect. The format is IP address or network address "
++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))."
++#~ msgstr ""
++#~ "Quando o endereço de listen fôr 0.0.0.0 (IPv4) ou :: (IPv6), deve listar "
++#~ "os clientes que tiverem permissão para ligação. O formato é endereço de "
++#~ "host ou endereço de rede (192.168.1.123, 192.168.1.0/24, "
++#~ "2001:660:116::/48 (IPv6))."
++
++#~ msgid ""
++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily "
++#~ "= Query both, prefer IPv6; true = Query only IPv6"
++#~ msgstr ""
++#~ "false = Não pedir IPv6; reluctantly=Pedir ambos e preferir IPv4; "
++#~ "happily=Pedir ambos, preferir IPv6; true=Pedir apenas IPv6"
++
++#~ msgid ""
++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, "
++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query "
++#~ "DNS directly, if host could not be found fallback to system DNS resolver; "
++#~ "true = Always use system DNS resolver"
++#~ msgstr ""
++#~ "false=nunca usar o resolver do sistema; reluctantly=pedir DNS "
++#~ "directamente, se o servidor DNS estiver indisponivel recorrer do resolver "
++#~ "DNS do sistema; happily=pedir DNS directamente, se o host nao for "
++#~ "encontrado, recorrer ao resolver DNS do sistema; true=Usar sempre o "
++#~ "resolver DNS do sistema"
++
++#~ msgid "Port on which Polipo will listen. (default value: 8123)"
++#~ msgstr "Porta local na qual o polipo será activado. (pre-definido: 8123)"
++
++#~ msgid "polipo_pmm_pmmsize_desc"
++#~ msgstr ""
++#~ "Para activar PMM, o tamanho do segmento PMM deve ser definido para um "
++#~ "qualquer valor positivo."
+diff --git a/feeds/luci/applications/luci-app-polipo/po/pt/polipo.po b/feeds/luci/applications/luci-app-polipo/po/pt/polipo.po
+new file mode 100644
+index 0000000..cdce586
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/pt/polipo.po
+@@ -0,0 +1,305 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-06-02 19:10+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Definições avançadas"
++
++msgid "Allowed clients"
++msgstr "Clientes permitidos"
++
++msgid "Always use system DNS resolver"
++msgstr "Usar sempre o resolvedor DNS de Sistema"
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++"É suportada a autenticação basica HTTP. Indique username e password no "
++"formato username:password."
++
++msgid "Configuration"
++msgstr "Configuração"
++
++msgid "DNS and Query Settings"
++msgstr "Definições de DNS e de Consulta"
++
++msgid "DNS server address"
++msgstr "Endereço do servidor DNS"
++
++msgid "Delete cache files time"
++msgstr "Tempo para remoção dos ficheiros de cache"
++
++msgid "Disk cache location"
++msgstr "Localização da cache em disco"
++
++msgid "Do not query IPv6"
++msgstr "Não consulta o IPv6"
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "Activar se a cache (proxy) for partilhada por multiplos utilizadores."
++
++msgid "First PMM segment size (in bytes)"
++msgstr "Tamanho do primeiro segmento PMM (em bytes)"
++
++msgid "General Settings"
++msgstr "Definições Gerais"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "Quanta memória RAM deverá ser usada pelo polipo para cache."
++
++msgid "In RAM cache size (in bytes)"
++msgstr "Tamanho da cache em RAM (bytes)"
++
++msgid "Listen address"
++msgstr "Endereço de escuta"
++
++msgid "Listen port"
++msgstr "Porta de escuta"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++"Local onde o polipo guardará permanentemente os ficheiros de cache. É "
++"recomendada a utilização de dispositivos de armazenamento remoto devido ao "
++"grande crescimento da cache. Deixe em branco para desactivar a cache em "
++"disco."
++
++msgid "Log file location"
++msgstr "Localização do ficheiro de registo"
++
++msgid "Log to syslog"
++msgstr "Registar para o syslog"
++
++msgid "Logging and RAM"
++msgstr "RAM e Logging"
++
++msgid "Never use system DNS resolver"
++msgstr "Nunca usar o DNS de sistema"
++
++msgid "On-Disk Cache"
++msgstr "Cache em disco"
++
++msgid "PMM segments size (in bytes)"
++msgstr "Tamanho do segmento PMM (em bytes)"
++
++msgid "Parent Proxy"
++msgstr "Proxy Superior"
++
++msgid "Parent proxy address"
++msgstr "Endereço do proxy de hierarquia superior."
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++"Endereço do proxy de hierarquia superior (no formato host:porta), ao qual o "
++"polipo irá encaminhar os seus pedidos."
++
++msgid "Parent proxy authentication"
++msgstr "Autenticação em cache de hierarquia superior"
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr "Estado do Polipo"
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "O polipo é um proxy web ligeiro e rápido."
++
++msgid "Poor Man's Multiplexing"
++msgstr "Multiplexagem simples"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++"A multiplexagem simples (PMM) consiste na simulação de multiplexagem através "
++"da requesição de um pedido em multiplos segmentos. O método tenta baixar a "
++"latencia causada pela debilidade do protocolo HTTP. Nota: alguns sites web "
++"não funcionam com a activação de PMM."
++
++msgid "Port on which Polipo will listen"
++msgstr "Porta na qual o Polipo irá escutar"
++
++msgid "Proxy"
++msgstr "Proxy"
++
++msgid "Query DNS by hostname"
++msgstr "Pedidos ao DNS através de hostname"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr "Consultar o DNS diretamente, voltar à resolução de nomes do sistema"
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++"Consultar o DNS diretamente, para hosts desconhecidos voltar à resolução de "
++"nomes de sistema"
++
++msgid "Query DNS for IPv6"
++msgstr "Consultar DNS para o IPv6"
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr "Consultar IPv4 e IPv6, preferência por IPv4"
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr "Consultar IPv4 e IPv6, preferência por IPv6"
++
++msgid "Query only IPv6"
++msgstr "Consultar apenas IPv6"
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++"Define o endereço do servidor de DNS a usar, caso pretenda que o polipo "
++"utilize um servidor alternativo ao do sistema."
++
++msgid "Shared cache"
++msgstr "Cache partilhada"
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++"Tamanho do primeiro segmento PMM. Se não estiver definido, reverte para o "
++"dobro do tamanho do segmento PMM."
++
++msgid "Size to which cached files should be truncated"
++msgstr "Tamanho a partir do qual os ficheiro em cache devem ser truncados"
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Syslog facility"
++msgstr "Categoria dos eventos polipo no registo do sistema"
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++"O interface no qual o polipo será activado. Para activar em todos os "
++"endereços, use 0.0.0.0 ou :: (IPv6)."
++
++msgid "Time after which cached files will be deleted"
++msgstr "Tempo após o qual os ficheiro em cache devem ser eliminados"
++
++msgid "Time after which cached files will be truncated"
++msgstr "Tempo após o qual os ficheiro em cache devem ser truncados"
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++"Para ativar PMM, o tamanho do segmento PMM tem de ser definido para um valor "
++"positivo."
++
++msgid "Truncate cache files size (in bytes)"
++msgstr "Tamanho de trancagem dos ficheiros de cache (bytes)"
++
++msgid "Truncate cache files time"
++msgstr "Tempo de trancagem dos ficheiros de cache"
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++"É recomendado o recurso a sistemas de armazenamento de ficheiros externos, "
++"devido ao rápido crescimento do ficheiro de registo."
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++"Quando o endereço de escuta está definido como 0.0.0.0 ou :: (IPv6), tem de "
++"listar os clientes que estão autorizados a ligar. O formato do endereço IP "
++"ou o endereço de rede (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 "
++"(IPv6))"
++
++msgid "enable"
++msgstr "ativar"
++
++#~ msgid ""
++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should "
++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/"
++#~ "polipo_purge script. For example to perform disk cache cleanup every day "
++#~ "at 6:00 in the morning you should add the following line in Scheduled "
++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)."
++#~ msgstr ""
++#~ "Para activar a limpeza de cache em disco (altamente recomendado), deve "
++#~ "acrescentar uma tarefa cron (\"Serviços\") que execute o script /usr/sbin/"
++#~ "polipo_purge. Como exemplo, para executar uma limpeza da cache "
++#~ "diariamente pelas 06H00 deve acrescentar a seguinte linha: \"0 6 * * * /"
++#~ "usr/sbin/polipo_purge\" (sem as aspas)."
++
++#~ msgid ""
++#~ "Size to which cached files should be truncated. (default value: 1048576)"
++#~ msgstr ""
++#~ "Tamanho com o qual devem ser trancados os ficheiros da cache. (valor pre-"
++#~ "definido: 1048576)"
++
++#~ msgid ""
++#~ "Time after which cached files will be truncated. (default value: 4d12h)"
++#~ msgstr ""
++#~ "Tempo após o qual os ficheiros de cache serão trancados. (valor pre-"
++#~ "definido: 4d12h)"
++
++#~ msgid "Time after which cached files will be deleted. (default value: 32d)"
++#~ msgstr ""
++#~ "Tempo apos o qual os ficheiros de cache serão removidos. (valor pré-"
++#~ "definido: 32d)"
++
++#~ msgid "General"
++#~ msgstr "Geral"
++
++#~ msgid ""
++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++#~ "that are allowed to connect. The format is IP address or network address "
++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))."
++#~ msgstr ""
++#~ "Quando o endereço de listen fôr 0.0.0.0 (IPv4) ou :: (IPv6), deve listar "
++#~ "os clientes que tiverem permissão para ligação. O formato é endereço de "
++#~ "host ou endereço de rede (192.168.1.123, 192.168.1.0/24, "
++#~ "2001:660:116::/48 (IPv6))."
++
++#~ msgid ""
++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily "
++#~ "= Query both, prefer IPv6; true = Query only IPv6"
++#~ msgstr ""
++#~ "false = Não pedir IPv6; reluctantly=Pedir ambos e preferir IPv4; "
++#~ "happily=Pedir ambos, preferir IPv6; true=Pedir apenas IPv6"
++
++#~ msgid ""
++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, "
++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query "
++#~ "DNS directly, if host could not be found fallback to system DNS resolver; "
++#~ "true = Always use system DNS resolver"
++#~ msgstr ""
++#~ "false=nunca usar o resolver do sistema; reluctantly=pedir DNS "
++#~ "directamente, se o servidor DNS estiver indisponivel recorrer do resolver "
++#~ "DNS do sistema; happily=pedir DNS directamente, se o host nao for "
++#~ "encontrado, recorrer ao resolver DNS do sistema; true=Usar sempre o "
++#~ "resolver DNS do sistema"
++
++#~ msgid "Port on which Polipo will listen. (default value: 8123)"
++#~ msgstr "Porta local na qual o polipo será activado. (pre-definido: 8123)"
++
++#~ msgid "polipo_pmm_pmmsize_desc"
++#~ msgstr ""
++#~ "Para activar PMM, o tamanho do segmento PMM deve ser definido para um "
++#~ "qualquer valor positivo."
+diff --git a/feeds/luci/applications/luci-app-polipo/po/ro/polipo.po b/feeds/luci/applications/luci-app-polipo/po/ro/polipo.po
+new file mode 100644
+index 0000000..2c2710a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/ro/polipo.po
+@@ -0,0 +1,206 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-28 18:42+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "Setări avansate"
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/ru/polipo.po b/feeds/luci/applications/luci-app-polipo/po/ru/polipo.po
+new file mode 100644
+index 0000000..f1d4968
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/ru/polipo.po
+@@ -0,0 +1,237 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: polipo\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-08-15 17:51+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Advanced Settings"
++msgstr "РаÑширенные наÑтройки"
++
++msgid "Allowed clients"
++msgstr "Разрешённые клиенты"
++
++msgid "Always use system DNS resolver"
++msgstr "Ð’Ñегда иÑпользовать ÑиÑтемный DNS-клиент"
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++"ПоддерживаетÑÑ Ð±Ð°Ð·Ð¾Ð²Ð°Ñ HTTP-аутентификациÑ. Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ "
++"пароль в формате имÑ:пароль."
++
++msgid "Configuration"
++msgstr "КонфигурациÑ"
++
++msgid "DNS and Query Settings"
++msgstr "ÐаÑтройки DNS"
++
++msgid "DNS server address"
++msgstr "ÐÐ´Ñ€ÐµÑ DNS-Ñервера"
++
++msgid "Delete cache files time"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÑш-файлов"
++
++msgid "Disk cache location"
++msgstr "МеÑтоположение кÑша"
++
++msgid "Do not query IPv6"
++msgstr "Ðе запрашивать IPv6"
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++"Включите, еÑли вы хотите, чтобы кÑш (прокÑи) был общим Ð´Ð»Ñ Ð½ÐµÑкольких "
++"пользователей."
++
++msgid "First PMM segment size (in bytes)"
++msgstr "Размер первого PMM-Ñегмента (в байтах)"
++
++msgid "General Settings"
++msgstr "Общие наÑтройки"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "КоличеÑтво RAM, отведенное Ð´Ð»Ñ ÐºÐµÑˆÐ°."
++
++msgid "In RAM cache size (in bytes)"
++msgstr "Размер кÑша в RAM (в байтах)"
++
++msgid "Listen address"
++msgstr "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñоединений"
++
++msgid "Listen port"
++msgstr "Порт Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñоединений"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++"ДиректориÑ, где Polipo хранит кÑш-файлы. РекомендуетÑÑ Ð¸Ñпользовать внешнее "
++"хранилище, так как размер кÑша может увеличиватьÑÑ. ОÑтавьте пуÑтым, чтобы "
++"отключить хранение кÑша на диÑке."
++
++msgid "Log file location"
++msgstr "МеÑтоположение файла журнала"
++
++msgid "Log to syslog"
++msgstr "ЗапиÑывать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² ÑиÑтемный журнал"
++
++msgid "Logging and RAM"
++msgstr "Журналирование и RAM"
++
++msgid "Never use system DNS resolver"
++msgstr "Ðе иÑпользовать ÑиÑтемный DNS-клиент"
++
++msgid "On-Disk Cache"
++msgstr "КÑширование на диÑке"
++
++msgid "PMM segments size (in bytes)"
++msgstr "Размер PMM-Ñегментов (в байтах)"
++
++msgid "Parent Proxy"
++msgstr "РодительÑкий прокÑи"
++
++msgid "Parent proxy address"
++msgstr "ÐÐ´Ñ€ÐµÑ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого прокÑи"
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++"ÐÐ´Ñ€ÐµÑ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого прокÑи (в формате хоÑÑ‚:порт), на который Polipo будет "
++"перенаправлÑÑ‚ÑŒ запроÑÑ‹."
++
++msgid "Parent proxy authentication"
++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого прокÑи"
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr "СоÑтоÑние Polipo"
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "Polipo - небольшой веб-прокÑи, иÑпользующий кÑширование."
++
++msgid "Poor Man's Multiplexing"
++msgstr "Poor Man's Multiplexing"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++"Poor Man's Multiplexing (PMM) - Ñто техника, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет запрашивать "
++"данные из неÑкольких иÑточников. Таким образом, Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ° по HTTP-"
++"протоколу ÑокращаетÑÑ. ПРИМЕЧÐÐИЕ: некоторые Ñайты могут не работать Ñ "
++"включенным PMM."
++
++msgid "Port on which Polipo will listen"
++msgstr "Порт, на котором Polipo будет ожидать входÑщие ÑоединениÑ"
++
++msgid "Proxy"
++msgstr "ПрокÑи"
++
++msgid "Query DNS by hostname"
++msgstr "Запрашивать DNS, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¸Ð¼Ñ Ñ…Ð¾Ñта"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++"Запрашивать DNS напрÑмую, иÑпользовать ÑиÑтемный клиент в Ñлучае ошибки"
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++"Запрашивать DNS напрÑмую, иÑпользовать ÑиÑтемный клиент Ð´Ð»Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтных "
++"хоÑтов"
++
++msgid "Query DNS for IPv6"
++msgstr "Запрашивать DNS Ð´Ð»Ñ IPv6"
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr "Запрашивать IPv4 и IPv6, предпочитать IPv4"
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr "Запрашивать IPv4 и IPv6, предпочитать IPv6"
++
++msgid "Query only IPv6"
++msgstr "Запрашивать только IPv6"
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++"УÑтановите Ð°Ð´Ñ€ÐµÑ DNS-Ñервера Ð´Ð»Ñ Polipo в Ñлучае, еÑли он отличаетÑÑ Ð¾Ñ‚ "
++"ÑиÑтемного."
++
++msgid "Shared cache"
++msgstr "Общий кÑш"
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++"Размер первого PMM Ñегмента. ЕÑли не указано, то размер первого Ñегмента "
++"будет равен двум обычным."
++
++msgid "Size to which cached files should be truncated"
++msgstr "Размер, до которого будут Ñокращены файлы кÑша"
++
++msgid "Status"
++msgstr "СоÑтоÑние"
++
++msgid "Syslog facility"
++msgstr "СиÑтемный журнал"
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++"ИнтерфейÑ, на котором Polipo будет ожидать входÑщие ÑоединениÑ. Чтобы "
++"ожидать на вÑех интерфейÑах, иÑпользуйте 0.0.0.0 или :: (IPv6)."
++
++msgid "Time after which cached files will be deleted"
++msgstr "Интервал, поÑле которого файлы кÑша будут удалены"
++
++msgid "Time after which cached files will be truncated"
++msgstr "Интервал, поÑле которого файлы кÑша будут Ñокращены"
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr "Чтобы включить PMM, размер PMM Ñегмента должен быть уÑтановлен."
++
++msgid "Truncate cache files size (in bytes)"
++msgstr "Сократить размер файлов кÑша (в байтах)"
++
++msgid "Truncate cache files time"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑÐ¾ÐºÑ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² кÑша"
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++"РекомендуетÑÑ Ð¸Ñпользовать внешнее хранилище, так как журнал чаÑто "
++"обновлÑетÑÑ Ð¸ может значительно увеличиватьÑÑ Ð² размере."
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++"ЕÑли Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñоединений уÑтановлен в 0.0.0.0 или :: (IPv6), вам "
++"необходимо перечиÑлить клиентов, которым разрешено подключатьÑÑ. Ð’ таком "
++"Ñлучае формат - Ñто IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð´Ñети (192.168.1.123, "
++"192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++
++msgid "enable"
++msgstr "включить"
+diff --git a/feeds/luci/applications/luci-app-polipo/po/sk/polipo.po b/feeds/luci/applications/luci-app-polipo/po/sk/polipo.po
+new file mode 100644
+index 0000000..e003c17
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/sk/polipo.po
+@@ -0,0 +1,202 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/sv/polipo.po b/feeds/luci/applications/luci-app-polipo/po/sv/polipo.po
+new file mode 100644
+index 0000000..7b64c7a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/sv/polipo.po
+@@ -0,0 +1,203 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/templates/polipo.pot b/feeds/luci/applications/luci-app-polipo/po/templates/polipo.pot
+new file mode 100644
+index 0000000..beb0bdb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/templates/polipo.pot
+@@ -0,0 +1,195 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/tr/polipo.po b/feeds/luci/applications/luci-app-polipo/po/tr/polipo.po
+new file mode 100644
+index 0000000..25982ec
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/tr/polipo.po
+@@ -0,0 +1,202 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/uk/polipo.po b/feeds/luci/applications/luci-app-polipo/po/uk/polipo.po
+new file mode 100644
+index 0000000..9b1b637
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/uk/polipo.po
+@@ -0,0 +1,206 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-09-21 15:36+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Advanced Settings"
++msgstr "Додаткові налаштуваннÑ"
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++
++msgid "Configuration"
++msgstr "КонфігураціÑ"
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr ""
++
++msgid "Delete cache files time"
++msgstr ""
++
++msgid "Disk cache location"
++msgstr ""
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr ""
++
++msgid "First PMM segment size (in bytes)"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++
++msgid "Log file location"
++msgstr ""
++
++msgid "Log to syslog"
++msgstr ""
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr ""
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/vi/polipo.po b/feeds/luci/applications/luci-app-polipo/po/vi/polipo.po
+new file mode 100644
+index 0000000..0765db3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/vi/polipo.po
+@@ -0,0 +1,290 @@
++# polipo.pot
++# generated from ./applications/luci-polipo/luasrc/i18n/polipo.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:58+0200\n"
++"PO-Revision-Date: 2009-08-13 07:49+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr "Äối tượng cho phép"
++
++msgid "Always use system DNS resolver"
++msgstr ""
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr ""
++"Sá»± chứng thá»±c HTTP CÆ¡ bản được há»— trợ. Cung cấp tên ngÆ°á»i dùng và mật khẩu "
++"trong tên ngÆ°á»i dùng: mật khẩu định dạng"
++
++msgid "Configuration"
++msgstr ""
++
++msgid "DNS and Query Settings"
++msgstr ""
++
++msgid "DNS server address"
++msgstr "Äịa chỉ tên miá»n máy chủ"
++
++msgid "Delete cache files time"
++msgstr "Xóa tập tin cạc khi"
++
++msgid "Disk cache location"
++msgstr "Vị trí cạc đĩa"
++
++msgid "Do not query IPv6"
++msgstr ""
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "Kích hoạt nếu cạc được chia rẻ bởi nhiá»u ngÆ°á»i dùng."
++
++msgid "First PMM segment size (in bytes)"
++msgstr "Dung lượng phân đoạn PMM đầu tiên (in bytes)"
++
++msgid "General Settings"
++msgstr ""
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "Bao nhiêu RAM Polipo nên dùng cho cạc."
++
++msgid "In RAM cache size (in bytes)"
++msgstr "Trong RAM dung lượng cạc (tính theo bytes)"
++
++msgid "Listen address"
++msgstr "Äịa chỉ nge"
++
++msgid "Listen port"
++msgstr "Cổng nghe"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr ""
++"Vị trị mà polipo sẽ định các tập tin thÆ°á»ng xuyên. Sá»­ dụng thiết bị nhá»› "
++"ngoài được khuyến khích, bởi vì cạc có thể lá»›n lên đáng kể. Äể lại nó trống "
++"để vô hiệu hóa Trên cạc trên đĩa."
++
++msgid "Log file location"
++msgstr "Vị trí tập tin sổ ghi"
++
++msgid "Log to syslog"
++msgstr "Log to syslog"
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr ""
++
++msgid "On-Disk Cache"
++msgstr "Cạc trên ổ đĩa"
++
++msgid "PMM segments size (in bytes)"
++msgstr "Dung lượng phân đoạn PMM (in bytes)"
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr "Äịa chỉ parent proxy "
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++"Äịa chỉ parent proxy (in host:port format), cái mà Polipo sẽ chuyển yêu cầu "
++"tá»›i."
++
++msgid "Parent proxy authentication"
++msgstr "Xác thực parent proxy "
++
++msgid "Polipo"
++msgstr "Polipo"
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "Polipo là một web proxy nhỠvà nhanh caching."
++
++msgid "Poor Man's Multiplexing"
++msgstr "Poor Man&amp;#39;s Multiplexing"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++"Poor Man&amp;#39;s Multiplexing (PMM) là một kỹ thuật kích thích "
++"multiplexing bằng cách yêu cầu trÆ°á»ng hợp trong nhiá»u phân Ä‘oạn. Nó cố gắng "
++"hạ thấp sự trễ nãi do các điểm yếu HTTP protocol gây ra. Chú ý: một số trang "
++"web có thể không hoạt động với PMM bật."
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr "Tra vấn DNS bằng hostname"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr "Tra vấn DNS cho IPv6"
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++"Cài đặt địa chỉ tên miá»n máy chủ để sá»­ dụng, nếu bạn muốn Polipo dùng tên "
++"miá»n khác vá»›i hệ thông chính. "
++
++msgid "Shared cache"
++msgstr "Cạc trên ổ đĩa"
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++"Dung lượng của phân đoạn PMM đầu tiên. Nếu không định nghĩa sẽ mặc định dung "
++"lượng của phân đoạn PMM gấp 2 lần"
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr "Syslog facility"
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++"Giao diện mà Polipo sẽ nghe. Äể nghe trên tất cả các giao diện dùng 0.0.0.0 "
++"hoặc :: (IPv6)"
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr "BỠbớt những tập tin cạc với dung lượng (bytes)"
++
++msgid "Truncate cache files time"
++msgstr "Cắt bỠtập tin cạc khi"
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++"Nên dùng bá»™ nhá»› ngoài bởi vì tập tin sổ ghi được viết rất nhiá»u lần và có "
++"thể phát tán rất mạnh. "
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
++
++#~ msgid ""
++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should "
++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/"
++#~ "polipo_purge script. For example to perform disk cache cleanup every day "
++#~ "at 6:00 in the morning you should add the following line in Scheduled "
++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)."
++#~ msgstr ""
++#~ "Äể kích hoạt tính năng làm sạch trên cạc Ä‘Ä©a polipo (rất khuyến khích), "
++#~ "bạn nên thêm vào một công việc cron trong những công tác đã schedule, nó "
++#~ "sẽ thực hiện / usr / sbin / polipo_purge script. Ví dụ: để thực hiện các "
++#~ "đĩa bộ nhớ cache mỗi ngày vào lúc 6:00 sáng, bạn nên thêm dòng sau trong "
++#~ "Scheduled công việc &amp;quot;0 6 * * * /usr/sbin/polipo_purge&amp;quot; "
++#~ "(không có dấu ngoặc kép)."
++
++#~ msgid ""
++#~ "Size to which cached files should be truncated. (default value: 1048576)"
++#~ msgstr "Dung lượng mà những tập tin cạc bị cắt bá». (Giá trị: 1048576)"
++
++#~ msgid ""
++#~ "Time after which cached files will be truncated. (default value: 4d12h)"
++#~ msgstr "Thá»i gian khi tập tin cạc sẽ bị cắt bá» (Giá trị: 4d12h)"
++
++#~ msgid "Time after which cached files will be deleted. (default value: 32d)"
++#~ msgstr "Thá»i gian khi tập tin cạc sẽ bị xóa. (Giá trị: 32d)"
++
++#~ msgid "General"
++#~ msgstr "Tổng quát"
++
++#~ msgid ""
++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++#~ "that are allowed to connect. The format is IP address or network address "
++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))."
++#~ msgstr ""
++#~ "Khi nghe địa chỉ được đặt ở 0.0.0.0 hoặc :: (IPv6), bạn phải liệt kê "
++#~ "những đối tượng được phép kết nối. Äịnh dạng là địa chỉ IP hoặc địa chỉ "
++#~ "mạng (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))."
++
++#~ msgid ""
++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily "
++#~ "= Query both, prefer IPv6; true = Query only IPv6"
++#~ msgstr ""
++#~ "False = Äừng truy vấn IPv6; reluctantly = Truy vấn cả hai, IPv4 được "
++#~ "chuộng hơn; happily = truy vấn cả hai, IPv6 chuộng hơn; true = chỉ truy "
++#~ "vấn IPv6"
++
++#~ msgid ""
++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, "
++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query "
++#~ "DNS directly, if host could not be found fallback to system DNS resolver; "
++#~ "true = Always use system DNS resolver"
++#~ msgstr ""
++#~ "false = Äừng bao giá» dùng bá»™ phân tích hệ thống DNS; reluctantly = Truy "
++#~ "vấn DNS trực tiếp, nếu DNS server không có sẵn trong bộ phân tích hệ "
++#~ "thống DNS; happily = truy vấn DNS trực tiếp, nếu host bị đẩy lùi so với "
++#~ "bộ phân tích hệ thống DNS; true = Luân luân dùng bộ phân tích hệ thống DNS"
++
++#~ msgid "Port on which Polipo will listen. (default value: 8123)"
++#~ msgstr "Cổng mà Polipo sẽ nghe. (giá trị: 8123)"
++
++#~ msgid "polipo_pmm_pmmsize_desc"
++#~ msgstr ""
++#~ "Äể kích hoạt PMM, dung lượng phân Ä‘oạn PMM phải được đặt những giá trị "
++#~ "dÆ°Æ¡ng."
+diff --git a/feeds/luci/applications/luci-app-polipo/po/zh-cn/polipo.po b/feeds/luci/applications/luci-app-polipo/po/zh-cn/polipo.po
+new file mode 100644
+index 0000000..7dcbe23
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/zh-cn/polipo.po
+@@ -0,0 +1,205 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-09 03:47+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "高级设置"
++
++msgid "Allowed clients"
++msgstr "å…许的客户端"
++
++msgid "Always use system DNS resolver"
++msgstr "始终使用系统DNS解æž"
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr "支æŒHTTP基本身份验è¯ã€‚æ供用户å和密ç æ ¼å¼ä¸ºï¼šç”¨æˆ·å:密ç ã€‚"
++
++msgid "Configuration"
++msgstr "é…ç½®"
++
++msgid "DNS and Query Settings"
++msgstr "DNS查询设置"
++
++msgid "DNS server address"
++msgstr "DNS地å€"
++
++msgid "Delete cache files time"
++msgstr "清除缓存文件周期"
++
++msgid "Disk cache location"
++msgstr "ç£ç›˜ç¼“å­˜ä½ç½®"
++
++msgid "Do not query IPv6"
++msgstr "ä¸èƒ½æŸ¥è¯¢IPv6"
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "å…许多用户共享缓存(代ç†ï¼‰ã€‚"
++
++msgid "First PMM segment size (in bytes)"
++msgstr "第一的PMM段的大å°ï¼ˆå­—节为å•ä½ï¼‰"
++
++msgid "General Settings"
++msgstr "通用设置"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr ""
++
++msgid "In RAM cache size (in bytes)"
++msgstr ""
++
++msgid "Listen address"
++msgstr "监å¬åœ°å€"
++
++msgid "Listen port"
++msgstr "监å¬ç«¯å£"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr "polipo将永久缓存文件。建议使用外部存储设备,因为缓存会一直增长。留空表示ç¦ç”¨ç£ç›˜ç¼“存。"
++
++msgid "Log file location"
++msgstr "日志存放ä½ç½®"
++
++msgid "Log to syslog"
++msgstr "å日志到syslog"
++
++msgid "Logging and RAM"
++msgstr ""
++
++msgid "Never use system DNS resolver"
++msgstr "从ä¸ä½¿ç”¨ç³»ç»ŸDNS解æž"
++
++msgid "On-Disk Cache"
++msgstr "ç£ç›˜ç¼“å­˜"
++
++msgid "PMM segments size (in bytes)"
++msgstr ""
++
++msgid "Parent Proxy"
++msgstr ""
++
++msgid "Parent proxy address"
++msgstr ""
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr ""
++
++msgid "Parent proxy authentication"
++msgstr ""
++
++msgid "Polipo"
++msgstr ""
++
++msgid "Polipo Status"
++msgstr ""
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr ""
++
++msgid "Poor Man's Multiplexing"
++msgstr ""
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr ""
++
++msgid "Proxy"
++msgstr ""
++
++msgid "Query DNS by hostname"
++msgstr ""
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr ""
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr ""
++
++msgid "Query DNS for IPv6"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr ""
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr ""
++
++msgid "Query only IPv6"
++msgstr ""
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr ""
++
++msgid "Shared cache"
++msgstr ""
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr ""
++
++msgid "Size to which cached files should be truncated"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Syslog facility"
++msgstr ""
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr ""
++
++msgid "Time after which cached files will be deleted"
++msgstr ""
++
++msgid "Time after which cached files will be truncated"
++msgstr ""
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr ""
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/po/zh-tw/polipo.po b/feeds/luci/applications/luci-app-polipo/po/zh-tw/polipo.po
+new file mode 100644
+index 0000000..5058897
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/po/zh-tw/polipo.po
+@@ -0,0 +1,205 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-21 13:13+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Advanced Settings"
++msgstr "進階設定"
++
++msgid "Allowed clients"
++msgstr "å…許的客戶端"
++
++msgid "Always use system DNS resolver"
++msgstr "總是採用系統使用的DNS解æž"
++
++msgid ""
++"Basic HTTP authentication supported. Provide username and password in "
++"username:password format."
++msgstr "基本的HTTP驗證支æ´. æ供使用者å稱和密碼以username:passwordæ ¼å¼"
++
++msgid "Configuration"
++msgstr "設定"
++
++msgid "DNS and Query Settings"
++msgstr "DNSåŠæŸ¥è©¢è¨­å®šå€¼"
++
++msgid "DNS server address"
++msgstr "DNS伺æœå™¨ä½å€"
++
++msgid "Delete cache files time"
++msgstr "刪除快å–檔的時間"
++
++msgid "Disk cache location"
++msgstr "ç£ç¢Ÿå¿«å–放置的ä½ç½®"
++
++msgid "Do not query IPv6"
++msgstr "ä¸ä½¿ç”¨IPv6查詢"
++
++msgid "Enable if cache (proxy) is shared by multiple users."
++msgstr "å‡è‹¥å¿«å–(Proxy)被多個使用者分享使用就啓用"
++
++msgid "First PMM segment size (in bytes)"
++msgstr "第一個PMM段的大å°(以bytesæ–¹å¼è¡¨ç¤º)"
++
++msgid "General Settings"
++msgstr "基本設定"
++
++msgid "How much RAM should Polipo use for its cache."
++msgstr "Polipo拿來當快å–的記憶體é‡æ˜¯å¤šå¤§?"
++
++msgid "In RAM cache size (in bytes)"
++msgstr "記憶體快å–大å°(以bytesæ–¹å¼è¡¨ç¤º)"
++
++msgid "Listen address"
++msgstr "è†è½ä½å€"
++
++msgid "Listen port"
++msgstr "è†è½åŸ è™Ÿ"
++
++msgid ""
++"Location where polipo will cache files permanently. Use of external storage "
++"devices is recommended, because the cache can grow considerably. Leave it "
++"empty to disable on-disk cache."
++msgstr "Polipoä½ç½®å°‡æ°¸ä¹…å¿«å–文件。建議使用外部的存儲設備,因為快å–會顯著增長。ä¿ç•™ç©ºç™½ä»¥ä¾¿é—œé–‰ç£ç¢Ÿå¿«å–."
++
++msgid "Log file location"
++msgstr "紀錄檔ä½ç½®"
++
++msgid "Log to syslog"
++msgstr "記錄到系統記錄syslog中"
++
++msgid "Logging and RAM"
++msgstr "記錄和記憶體"
++
++msgid "Never use system DNS resolver"
++msgstr "從ä¸ä½¿ç”¨ç³»çµ±DNS解æž"
++
++msgid "On-Disk Cache"
++msgstr "ç£ç¢Ÿä¸Šçš„å¿«å–"
++
++msgid "PMM segments size (in bytes)"
++msgstr "PMM段大å°(以bytes表示)"
++
++msgid "Parent Proxy"
++msgstr "上層Proxy"
++
++msgid "Parent proxy address"
++msgstr "上層Proxyä½å€"
++
++msgid ""
++"Parent proxy address (in host:port format), to which Polipo will forward the "
++"requests."
++msgstr "Polipo應該é‡å°Žé€™å€‹è¦æ±‚所到的上層Proxy(以 主機:埠號 æ ¼å¼è¡¨ç¤º)."
++
++msgid "Parent proxy authentication"
++msgstr "上層Proxyä½å€é©—è­‰"
++
++msgid "Polipo"
++msgstr "Polipo本地代ç†ä¼ºæœå™¨"
++
++msgid "Polipo Status"
++msgstr "Polipoç‹€æ³"
++
++msgid "Polipo is a small and fast caching web proxy."
++msgstr "Polipo是一個å°åž‹ä¸”快速的快å–網é ä»£ç†"
++
++msgid "Poor Man's Multiplexing"
++msgstr "窮人的多工器Poor Man's Multiplexing"
++
++msgid ""
++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by "
++"requesting an instance in multiple segments. It tries to lower the latency "
++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with "
++"PMM enabled."
++msgstr ""
++
++msgid "Port on which Polipo will listen"
++msgstr " Polipoè†è½çš„埠號"
++
++msgid "Proxy"
++msgstr "代ç†ä¼ºæœå™¨"
++
++msgid "Query DNS by hostname"
++msgstr "以主機å稱查詢DNS"
++
++msgid "Query DNS directly, fallback to system resolver"
++msgstr "直接查詢DNS, 回傳給系統解æž"
++
++msgid "Query DNS directly, for unknown hosts fall back to system resolver"
++msgstr "直接查詢DNS, å°èŽ«å的主機回傳給系統解æž"
++
++msgid "Query DNS for IPv6"
++msgstr "幫IPv6查詢DNS"
++
++msgid "Query IPv4 and IPv6, prefer IPv4"
++msgstr "查詢IPv4和IPv6,IPv4優先"
++
++msgid "Query IPv4 and IPv6, prefer IPv6"
++msgstr "查詢IPv4和IPv6 ,IPv6優先"
++
++msgid "Query only IPv6"
++msgstr "åªæŸ¥è©¢IPv6"
++
++msgid ""
++"Set the DNS server address to use, if you want Polipo to use different DNS "
++"server than the host system."
++msgstr "設定DNS伺æœå™¨ä½å€ä»¥ä¾¿ä½¿ç”¨, å‡å¦‚ä½ è¦Polipo代ç†äººä½¿ç”¨ä¸åŒçš„DNS伺æœå™¨è€Œéžä¸»æ©Ÿç³»çµ±."
++
++msgid "Shared cache"
++msgstr "分享的快å–"
++
++msgid ""
++"Size of the first PMM segment. If not defined, it defaults to twice the PMM "
++"segment size."
++msgstr "第一個PMMå€æ®µçš„大å°, å‡è‹¥æ²’定義 ,é è¨­å…©æ¬¡PMMå€æ®µçš„大å°."
++
++msgid "Size to which cached files should be truncated"
++msgstr "å¿«å–檔被截斷的大å°"
++
++msgid "Status"
++msgstr "狀態"
++
++msgid "Syslog facility"
++msgstr "日誌設施"
++
++msgid ""
++"The interface on which Polipo will listen. To listen on all interfaces use "
++"0.0.0.0 or :: (IPv6)."
++msgstr "Polipo將會è†è½çš„介é¢. è¦è†è½æ‰€æœ‰ä»‹é¢ä½¿ç”¨0.0.0.0 或 :: (IPv6)."
++
++msgid "Time after which cached files will be deleted"
++msgstr "å¿«å–將會被刪除的留存時間"
++
++msgid "Time after which cached files will be truncated"
++msgstr "å¿«å–將會被斷頭的留存時間"
++
++msgid "To enable PMM, PMM segment size must be set to some positive value."
++msgstr "è¦å•Ÿç”¨PMM, PMMå€æ®µå¤§å°å¿…須設定些ç©æ¥µçš„數值."
++
++msgid "Truncate cache files size (in bytes)"
++msgstr ""
++
++msgid "Truncate cache files time"
++msgstr ""
++
++msgid ""
++"Use of external storage device is recommended, because the log file is "
++"written frequently and can grow considerably."
++msgstr ""
++
++msgid ""
++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients "
++"that are allowed to connect. The format is IP address or network address "
++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))"
++msgstr ""
++
++msgid "enable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-polipo/root/etc/uci-defaults/luci-polipo b/feeds/luci/applications/luci-app-polipo/root/etc/uci-defaults/luci-polipo
+new file mode 100755
+index 0000000..0c57063
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/root/etc/uci-defaults/luci-polipo
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@polipo[-1]
++ add ucitrack polipo
++ set ucitrack.@polipo[-1].init=polipo
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-polipo/root/usr/sbin/polipo_purge b/feeds/luci/applications/luci-app-polipo/root/usr/sbin/polipo_purge
+new file mode 100755
+index 0000000..23ba571
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-polipo/root/usr/sbin/polipo_purge
+@@ -0,0 +1,18 @@
++#!/bin/sh
++
++DAEMON=/usr/sbin/polipo
++PIDFILE=`uci get polipo.daemon.pidFile`
++CFGFILE=/var/etc/polipo.conf
++
++[ -e "$PIDFILE" ] && {
++ PID=`cat $PIDFILE`
++
++ # send Polipo USR1 signal to write its in-memory cache to disk
++ kill -USR1 $PID
++ sleep 2
++ # start polipo with -x flag to purge the on-disk cache
++ polipo -c $CFGFILE -x
++ # send Polipo USR2 signal to discard its in-memory cache
++ kill -USR2 $PID
++}
++
+diff --git a/feeds/luci/applications/luci-app-privoxy/Makefile b/feeds/luci/applications/luci-app-privoxy/Makefile
+new file mode 100644
+index 0000000..e16eb41
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-privoxy/Makefile
+@@ -0,0 +1,38 @@
++#
++# Copyright (C) 2008-2015 The LuCI Team <luci@lists.subsignal.org>
++#
++# This is free software, licensed under the Apache License, Version 2.0 .
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-app-privoxy
++
++# Version == major.minor.patch
++# increase "minor" on new functionality and "patch" on patches/optimization
++PKG_VERSION:=1.0.4
++
++# Release == build
++# increase on changes of translation files
++PKG_RELEASE:=2
++
++PKG_LICENSE:=Apache-2.0
++PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
++
++# LuCI specific settings
++LUCI_TITLE:=LuCI Support for Privoxy WEB proxy
++LUCI_DEPENDS:=+luci-mod-admin-full +privoxy
++LUCI_PKGARCH:=all
++
++define Package/$(PKG_NAME)/config
++# shown in make menuconfig <Help>
++help
++ $(LUCI_TITLE)
++ .
++ Version: $(PKG_VERSION)-$(PKG_RELEASE)
++ $(PKG_MAINTAINER)
++endef
++
++include $(TOPDIR)/feeds/luci/luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-privoxy/luasrc/controller/privoxy.lua b/feeds/luci/applications/luci-app-privoxy/luasrc/controller/privoxy.lua
+new file mode 100644
+index 0000000..0cedab4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-privoxy/luasrc/controller/privoxy.lua
+@@ -0,0 +1,145 @@
++-- Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++-- Licensed under the Apache License, Version 2.0
++
++module("luci.controller.privoxy", package.seeall)
++
++local NX = require "nixio"
++local NXFS = require "nixio.fs"
++local HTTP = require "luci.http"
++local UCI = require "luci.model.uci"
++local UTIL = require "luci.util"
++local SYS = require "luci.sys"
++
++PRIVOXY_MIN = "3.0.22-0" -- minimum version of service required
++
++function index()
++ entry( {"admin", "services", "privoxy"}, cbi("privoxy"), _("Privoxy WEB proxy"), 59)
++ entry( {"admin", "services", "privoxy", "logview"}, call("logread") ).leaf = true
++ entry( {"admin", "services", "privoxy", "startstop"}, post("startstop") ).leaf = true
++ entry( {"admin", "services", "privoxy", "status"}, call("get_pid") ).leaf = true
++end
++
++-- called by XHR.get from detail_logview.htm
++function logread()
++ -- read application settings
++ local uci = UCI.cursor()
++ local logdir = uci:get("privoxy", "privoxy", "logdir") or "/var/log"
++ local logfile = uci:get("privoxy", "privoxy", "logfile") or "privoxy.log"
++ uci:unload("privoxy")
++
++ local lfile=logdir .. "/" .. logfile
++ local ldata=NXFS.readfile(lfile)
++ if not ldata or #ldata == 0 then
++ ldata="_nodata_"
++ end
++ HTTP.write(ldata)
++end
++
++-- called by XHR.get from detail_startstop.htm
++function startstop()
++ local pid = get_pid(true)
++ if pid > 0 then
++ SYS.call("/etc/init.d/privoxy stop")
++ NX.nanosleep(1) -- sleep a second
++ if NX.kill(pid, 0) then -- still running
++ NX.kill(pid, 9) -- send SIGKILL
++ end
++ pid = 0
++ else
++ SYS.call("/etc/init.d/privoxy start")
++ NX.nanosleep(1) -- sleep a second
++ pid = tonumber(NXFS.readfile("/var/run/privoxy.pid") or 0 )
++ if pid > 0 and not NX.kill(pid, 0) then
++ pid = 0 -- process did not start
++ end
++ end
++ HTTP.write(tostring(pid)) -- HTTP needs string not number
++end
++
++-- called by XHR.poll from detail_startstop.htm
++-- and from lua (with parameter "true")
++function get_pid(from_lua)
++ local pid = tonumber(NXFS.readfile("/var/run/privoxy.pid") or 0 )
++ if pid > 0 and not NX.kill(pid, 0) then
++ pid = 0
++ end
++ if from_lua then
++ return pid
++ else
++ HTTP.write(tostring(pid)) -- HTTP needs string not number
++ end
++end
++
++-- compare versions using "<=" "<" ">" ">=" "=" "<<" ">>"
++function ipkg_ver_compare(ver1, comp, ver2)
++ if not ver1 or not ver2
++ or not comp or not (#comp > 0) then return nil end
++ -- correct compare string
++ if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~="
++ elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<="
++ elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">="
++ elseif comp == "=" or comp == "==" then comp = "=="
++ elseif comp == "<<" then comp = "<"
++ elseif comp == ">>" then comp = ">"
++ else return nil end
++
++ local av1 = UTIL.split(ver1, "[%.%-]", nil, true)
++ local av2 = UTIL.split(ver2, "[%.%-]", nil, true)
++
++ for i = 1, math.max(table.getn(av1),table.getn(av2)), 1 do
++ local s1 = av1[i] or ""
++ local s2 = av2[i] or ""
++
++ -- first "not equal" found return true
++ if comp == "~=" and (s1 ~= s2) then return true end
++ -- first "lower" found return true
++ if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
++ -- first "greater" found return true
++ if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
++ -- not equal then return false
++ if (s1 ~= s2) then return false end
++ end
++
++ -- all equal and not compare greater or lower then true
++ return not (comp == "<" or comp == ">")
++end
++
++-- read version information for given package if installed
++function ipkg_ver_installed(pkg)
++ local version = nil
++ local control = io.open("/usr/lib/opkg/info/%s.control" % pkg, "r")
++ if control then
++ local ln
++ repeat
++ ln = control:read("*l")
++ if ln and ln:match("^Version: ") then
++ version = ln:gsub("^Version: ", "")
++ break
++ end
++ until not ln
++ control:close()
++ end
++ return version
++end
++
++-- replacement of build-in Flag.parse of cbi.lua
++-- modified to mark section as changed if value changes
++-- current parse did not do this, but it is done AbstaractValue.parse()
++function flag_parse(self, section)
++ local fexists = self.map:formvalue(
++ luci.cbi.FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option)
++
++ if fexists then
++ local fvalue = self:formvalue(section) and self.enabled or self.disabled
++ local cvalue = self:cfgvalue(section)
++ if fvalue ~= self.default or (not self.optional and not self.rmempty) then
++ self:write(section, fvalue)
++ else
++ self:remove(section)
++ end
++ if (fvalue ~= cvalue) then self.section.changed = true end
++ else
++ self:remove(section)
++ self.section.changed = true
++ end
++end
+diff --git a/feeds/luci/applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua b/feeds/luci/applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua
+new file mode 100644
+index 0000000..c415f8e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua
+@@ -0,0 +1,978 @@
++-- Copyright 2014-2015 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++-- Licensed under the Apache License, Version 2.0
++
++local NXFS = require "nixio.fs"
++local SYS = require "luci.sys"
++local UTIL = require "luci.util"
++local DISP = require "luci.dispatcher"
++local DTYP = require "luci.cbi.datatypes"
++local CTRL = require "luci.controller.privoxy" -- this application's controller
++
++-- Bootstrap theme needs 2 or 3 additional linefeeds for tab description for better optic
++local HELP = [[<a href="http://www.privoxy.org/user-manual/config.html#%s" target="_blank">%s</a>]]
++
++local VERINST = CTRL.ipkg_ver_installed("privoxy")
++local VEROK = CTRL.ipkg_ver_compare(VERINST,">=",CTRL.PRIVOXY_MIN)
++
++local TITLE = [[</a><a href="javascript:alert(']]
++ .. translate("Version Information")
++ .. [[\n\nluci-app-privoxy]]
++ .. [[\n\t]] .. translate("Version") .. [[:\t]]
++ .. CTRL.ipkg_ver_installed("luci-app-privoxy")
++ .. [[\n\nprivoxy ]] .. translate("required") .. [[:]]
++ .. [[\n\t]] .. translate("Version") .. [[:\t]] .. CTRL.PRIVOXY_MIN .. [[ ]] .. translate("or higher")
++ .. [[\n\nprivoxy ]] .. translate("installed") .. [[:]]
++ .. [[\n\t]] .. translate("Version") .. [[:\t]] .. VERINST
++ .. [[\n\n]]
++ .. [[')">]]
++ .. translate("Privoxy WEB proxy")
++
++local DESC = translate("Privoxy is a non-caching web proxy with advanced filtering "
++ .. "capabilities for enhancing privacy, modifying web page data and HTTP headers, "
++ .. "controlling access, and removing ads and other obnoxious Internet junk.")
++ .. [[<br /><strong>]]
++ .. translate("For help use link at the relevant option")
++ .. [[</strong>]]
++
++-- Error handling if wrong privoxy version installed -- ########################
++if not nixio.fs.access("/etc/config/privoxy") or not VEROK then
++ local f = SimpleForm("_no_config")
++ f.title = TITLE
++ f.description = DESC
++ f.embedded = true
++ f.submit = false
++ f.reset = false
++
++ local s = f:section(SimpleSection)
++ s.title = [[<font color="red">]] .. [[<strong>]]
++ .. translate("Software update required")
++ .. [[</strong>]] .. [[</font>]]
++
++ local v = s:option(DummyValue, "_update_needed")
++ v.titleref = DISP.build_url("admin", "system", "packages")
++ v.rawhtml = true
++ v.value = [[<h3><strong><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;]]
++ .. translate("The currently installed 'privoxy' package is not supported by LuCI application.")
++ .. [[<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;]]
++ .. translate("required") .. ": " .. CTRL.PRIVOXY_MIN .. " *** ".. translate("installed") .. ": " .. VERINST
++ .. [[<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;]]
++ .. translate("Please update to the current version!")
++ .. [[<br /><br /></strong></h3>]]
++ return f
++end
++
++-- cbi-map -- ##################################################################
++local m = Map("privoxy")
++m.title = TITLE
++m.description = DESC
++function m.commit_handler(self)
++ if self.changed then -- changes ?
++ os.execute("/etc/init.d/privoxy reload &") -- reload configuration
++ end
++end
++
++-- cbi-section -- ##############################################################
++local ns = m:section( NamedSection, "privoxy", "privoxy")
++
++ns:tab("local",
++ translate("Local Set-up"),
++ translate("If you intend to operate Privoxy for more users than just yourself, "
++ .. "it might be a good idea to let them know how to reach you, what you block "
++ .. "and why you do that, your policies, etc.") )
++local function err_tab_local(title, msg)
++ return string.format(translate("Local Set-up") .. " - %s: %s", title, msg )
++end
++
++ns:tab("filter",
++ translate("Files and Directories"),
++ translate("Privoxy can (and normally does) use a number of other files "
++ .. "for additional configuration, help and logging. This section of "
++ .. "the configuration file tells Privoxy where to find those other files.") )
++local function err_tab_filter(title, msg)
++ return string.format(translate("Files and Directories") .. " - %s: %s", title, msg )
++end
++
++ns:tab("access",
++ translate("Access Control"),
++ translate("This tab controls the security-relevant aspects of Privoxy's configuration.") )
++local function err_tab_access(title, msg)
++ return string.format(translate("Access Control") .. " - %s: %s", title, msg )
++end
++
++ns:tab("forward",
++ translate("Forwarding"),
++ translate("Configure here the routing of HTTP requests through a chain of multiple proxies. "
++ .. "Note that parent proxies can severely decrease your privacy level. "
++ .. "Also specified here are SOCKS proxies.") )
++
++ns:tab("misc",
++ translate("Miscellaneous"),
++ nil)
++local function err_tab_misc(self, msg)
++ return string.format(translate("Miscellaneous") .. " - %s: %s", self.title_base, msg )
++end
++
++ns:tab("debug",
++ translate("Logging"),
++ nil )
++
++ns:tab("logview",
++ translate("Log File Viewer"),
++ nil )
++
++-- tab: local -- ###############################################################
++
++-- start/stop button -----------------------------------------------------------
++local btn = ns:taboption("local", Button, "_startstop")
++btn.title = translate("Start / Stop")
++btn.description = translate("Start/Stop Privoxy WEB Proxy")
++btn.template = "privoxy/detail_startstop"
++function btn.cfgvalue(self, section)
++ local pid = CTRL.get_pid(true)
++ if pid > 0 then
++ btn.inputtitle = "PID: " .. pid
++ btn.inputstyle = "reset"
++ btn.disabled = false
++ else
++ btn.inputtitle = translate("Start")
++ btn.inputstyle = "apply"
++ btn.disabled = false
++ end
++ return true
++end
++
++-- enabled ---------------------------------------------------------------------
++local ena = ns:taboption("local", Flag, "_enabled")
++ena.title = translate("Enabled")
++ena.description = translate("Enable/Disable autostart of Privoxy on system startup and interface events")
++ena.orientation = "horizontal" -- put description under the checkbox
++ena.rmempty = false
++function ena.cfgvalue(self, section)
++ return (SYS.init.enabled("privoxy")) and "1" or "0"
++end
++function ena.validate(self, value)
++ error("Validate " .. value)
++end
++function ena.write(self, section, value)
++ --error("Write " .. value)
++ if value == "1" then
++ return SYS.init.enable("privoxy")
++ else
++ return SYS.init.disable("privoxy")
++ end
++end
++
++-- hostname --------------------------------------------------------------------
++local hn = ns:taboption("local", Value, "hostname")
++hn.title = string.format(HELP, "HOSTNAME", "Hostname" )
++hn.description = translate("The hostname shown on the CGI pages.")
++hn.placeholder = SYS.hostname()
++hn.optional = true
++hn.rmempty = true
++
++-- user-manual -----------------------------------------------------------------
++local um = ns:taboption("local", Value, "user_manual")
++um.title = string.format(HELP, "USER-MANUAL", "User Manual" )
++um.description = translate("Location of the Privoxy User Manual.")
++um.placeholder = "http://www.privoxy.org/user-manual/"
++um.optional = true
++um.rmempty = true
++
++-- admin-address ---------------------------------------------------------------
++local aa = ns:taboption("local", Value, "admin_address")
++aa.title_base = "Admin Email"
++aa.title = string.format(HELP, "ADMIN-ADDRESS", aa.title_base )
++aa.description = translate("An email address to reach the Privoxy administrator.")
++aa.placeholder = "privoxy.admin@example.com"
++aa.optional = true
++aa.rmempty = true
++function aa.validate(self, value)
++ if not value or #value == 0 then
++ return ""
++ end
++ if not (value:match("[A-Za-z0-9%.%%%+%-]+@[A-Za-z0-9%.%%%+%-]+%.%w%w%w?%w?")) then
++ return nil, err_tab_local(self.title_base, translate("Invalid email address") )
++ end
++ return value
++end
++
++-- proxy-info-url --------------------------------------------------------------
++local piu = ns:taboption("local", Value, "proxy_info_url")
++piu.title = string.format(HELP, "PROXY-INFO-URL", "Proxy Info URL" )
++piu.description = translate("A URL to documentation about the local Privoxy setup, configuration or policies.")
++piu.optional = true
++piu.rmempty = true
++
++-- trust-info-url --------------------------------------------------------------
++local tiu = ns:taboption("local", Value, "trust_info_url")
++tiu.title = string.format(HELP, "TRUST-INFO-URL", "Trust Info URLs" )
++tiu.description = translate("A URL to be displayed in the error page that users will see if access to an untrusted page is denied.")
++ .. [[<br /><strong>]]
++ .. translate("The value of this option only matters if the experimental trust mechanism has been activated.")
++ .. [[</strong>]]
++tiu.optional = true
++tiu.rmepty = true
++
++-- tab: filter -- ##############################################################
++
++-- logdir ----------------------------------------------------------------------
++local ld = ns:taboption("filter", Value, "logdir")
++ld.title_base = "Log Directory"
++ld.title = string.format(HELP, "LOGDIR", ld.title_base )
++ld.description = translate("The directory where all logging takes place (i.e. where the logfile is located).")
++ .. [[<br />]]
++ .. translate("No trailing '/', please.")
++ld.default = "/var/log"
++ld.rmempty = false
++function ld.validate(self, value)
++ if not value or #value == 0 then
++ return nil, err_tab_filter(self.title_base, translate("Mandatory Input: No Directory given!") )
++ elseif not NXFS.access(value) then
++ return nil, err_tab_filter(self.title_base, translate("Directory does not exist!") )
++ else
++ return value
++ end
++end
++
++-- logfile ---------------------------------------------------------------------
++local lf = ns:taboption("filter", Value, "logfile")
++lf.title_base = "Log File"
++lf.title = string.format(HELP, "LOGFILE", lf.title_base )
++lf.description = translate("The log file to use. File name, relative to log directory.")
++lf.default = "privoxy.log"
++lf.rmempty = false
++function lf.validate(self, value)
++ if not value or #value == 0 then
++ return nil, err_tab_filter(self.title_base, translate("Mandatory Input: No File given!") )
++ else
++ return value
++ end
++end
++
++-- confdir ---------------------------------------------------------------------
++local cd = ns:taboption("filter", Value, "confdir")
++cd.title_base = "Configuration Directory"
++cd.title = string.format(HELP, "CONFDIR", cd.title_base )
++cd.description = translate("The directory where the other configuration files are located.")
++ .. [[<br />]]
++ .. translate("No trailing '/', please.")
++cd.default = "/etc/privoxy"
++cd.rmempty = false
++function cd.validate(self, value)
++ if not value or #value == 0 then
++ return nil, err_tab_filter(self.title_base, translate("Mandatory Input: No Directory given!") )
++ elseif not NXFS.access(value) then
++ return nil, err_tab_filter(self.title_base, translate("Directory does not exist!") )
++ else
++ return value
++ end
++end
++
++-- templdir --------------------------------------------------------------------
++local tld = ns:taboption("filter", Value, "templdir")
++tld.title_base = "Template Directory"
++tld.title = string.format(HELP, "TEMPLDIR", tld.title_base )
++tld.description = translate("An alternative directory where the templates are loaded from.")
++ .. [[<br />]]
++ .. translate("No trailing '/', please.")
++tld.placeholder = "/etc/privoxy/templates"
++tld.rmempty = true
++function tld.validate(self, value)
++ if not NXFS.access(value) then
++ return nil, err_tab_filter(self.title_base, translate("Directory does not exist!") )
++ else
++ return value
++ end
++end
++
++-- temporary-directory ---------------------------------------------------------
++local td = ns:taboption("filter", Value, "temporary_directory")
++td.title_base = "Temporary Directory"
++td.title = string.format(HELP, "TEMPORARY-DIRECTORY", td.title_base )
++td.description = translate("A directory where Privoxy can create temporary files.")
++ .. [[<br /><strong>]]
++ .. translate("Only when using 'external filters', Privoxy has to create temporary files.")
++ .. [[</strong>]]
++td.rmempty = true
++
++-- actionsfile -----------------------------------------------------------------
++local af = ns:taboption("filter", DynamicList, "actionsfile")
++af.title_base = "Action Files"
++af.title = string.format(HELP, "ACTIONSFILE", af.title_base)
++af.description = translate("The actions file(s) to use. Multiple actionsfile lines are permitted, and are in fact recommended!")
++ .. [[<br /><strong>match-all.action := </strong>]]
++ .. translate("Actions that are applied to all sites and maybe overruled later on.")
++ .. [[<br /><strong>default.action := </strong>]]
++ .. translate("Main actions file")
++ .. [[<br /><strong>user.action := </strong>]]
++ .. translate("User customizations")
++af.rmempty = false
++function af.validate(self, value)
++ if not value or #value == 0 then
++ return nil, err_tab_access(self.title_base, translate("Mandatory Input: No files given!") )
++ end
++ local confdir = cd:formvalue(ns.section)
++ local err = false
++ local file = ""
++ if type(value) == "table" then
++ local x
++ for _, x in ipairs(value) do
++ if x and #x > 0 then
++ if not NXFS.access(confdir .."/".. x) then
++ err = true
++ file = x
++ break -- break/leave for on error
++ end
++ end
++ end
++ else
++ if not NXFS.access(confdir .."/".. value) then
++ err = true
++ file = value
++ end
++ end
++ if err then
++ return nil, string.format(err_tab_filter(self.title_base, translate("File '%s' not found inside Configuration Directory") ), file)
++ end
++ return value
++end
++
++-- filterfile ------------------------------------------------------------------
++local ff = ns:taboption("filter", DynamicList, "filterfile")
++ff.title_base = "Filter files"
++ff.title = string.format(HELP, "FILTERFILE", ff.title_base )
++ff.description = translate("The filter files contain content modification rules that use regular expressions.")
++ff.rmempty = false
++function ff.validate(self, value)
++ if not value or #value == 0 then
++ return nil, err_tab_access(self.title_base, translate("Mandatory Input: No files given!") )
++ end
++ local confdir = cd:formvalue(ns.section)
++ local err = false
++ local file = ""
++ if type(value) == "table" then
++ local x
++ for _, x in ipairs(value) do
++ if x and #x > 0 then
++ if not NXFS.access(confdir .."/".. x) then
++ err = true
++ file = x
++ break -- break/leave for on error
++ end
++ end
++ end
++ else
++ if not NXFS.access(confdir .."/".. value) then
++ err = true
++ file = value
++ end
++ end
++ if err then
++ return nil, string.format(err_tab_filter(self.title_base, translate("File '%s' not found inside Configuration Directory") ), file )
++ end
++ return value
++end
++
++-- trustfile -------------------------------------------------------------------
++local tf = ns:taboption("filter", Value, "trustfile")
++tf.title_base = "Trust file"
++tf.title = string.format(HELP, "TRUSTFILE", tf.title_base )
++tf.description = translate("The trust mechanism is an experimental feature for building white-lists "
++ .."and should be used with care.")
++ .. [[<br /><strong>]]
++ .. translate("It is NOT recommended for the casual user.")
++ .. [[</strong>]]
++tf.placeholder = "user.trust"
++tf.rmempty = true
++function tf.validate(self, value)
++ local confdir = cd:formvalue(ns.section)
++ local err = false
++ local file = ""
++ if type(value) == "table" then
++ local x
++ for _, x in ipairs(value) do
++ if x and #x > 0 then
++ if not NCFS.access(confdir .."/".. x) then
++ err = true
++ file = x
++ break -- break/leave for on error
++ end
++ end
++ end
++ else
++ if not NXFS.access(confdir .."/".. value) then
++ err = true
++ file = value
++ end
++ end
++ if err then
++ return nil, string.format(err_tab_filter(self.title_base, translate("File '%s' not found inside Configuration Directory") ), file )
++ end
++ return value
++end
++
++-- tab: access -- ##############################################################
++
++-- listen-address --------------------------------------------------------------
++local la = ns:taboption("access", DynamicList, "listen_address")
++la.title_base = "Listen addresses"
++la.title = string.format(HELP, "LISTEN-ADDRESS", la.title_base )
++la.description = translate("The address and TCP port on which Privoxy will listen for client requests.")
++ .. [[<br />]]
++ .. translate("Syntax: ")
++ .. "IPv4:Port / [IPv6]:Port / Host:Port"
++la.default = "127.0.0.1:8118"
++la.rmempty = false
++function la.validate(self, value)
++ if not value or #value == 0 then
++ return nil, err_tab_access(self.title_base, translate("Mandatory Input: No Data given!") )
++ end
++
++ local function check_value(v)
++ local _ret = UTIL.split(v, "]:")
++ local _ip
++ if _ret[2] then -- ip6 with port
++ _ip = string.gsub(_ret[1], "%[", "") -- remove "[" at beginning
++ if not DTYP.ip6addr(_ip) then
++ return translate("Mandatory Input: No valid IPv6 address given!")
++ elseif not DTYP.port(_ret[2]) then
++ return translate("Mandatory Input: No valid Port given!")
++ else
++ return nil
++ end
++ end
++ _ret = UTIL.split(v, ":")
++ if not _ret[2] then
++ return translate("Mandatory Input: No Port given!")
++ end
++ if #_ret[1] > 0 and not DTYP.host(_ret[1]) then -- :8118 is valid address
++ return translate("Mandatory Input: No valid IPv4 address or host given!")
++ elseif not DTYP.port(_ret[2]) then
++ return translate("Mandatory Input: No valid Port given!")
++ else
++ return nil
++ end
++ end
++
++ local err = ""
++ local entry = ""
++ if type(value) == "table" then
++ local x
++ for _, x in ipairs(value) do
++ if x and #x > 0 then
++ err = check_value(x)
++ if err then
++ entry = x
++ break
++ end
++ end
++ end
++ else
++ err = check_value(value)
++ entry = value
++ end
++ if err then
++ return nil, string.format(err_tab_access(self.title_base, err .. " - %s"), entry )
++ end
++ return value
++end
++
++-- permit-access ---------------------------------------------------------------
++local pa = ns:taboption("access", DynamicList, "permit_access")
++pa.title = string.format(HELP, "ACLS", "Permit access" )
++pa.description = translate("Who can access what.")
++ .. [[<br /><strong>]]
++ .. translate("Please read Privoxy manual for details!")
++ .. [[</strong>]]
++pa.rmempty = true
++
++-- deny-access -----------------------------------------------------------------
++local da = ns:taboption("access", DynamicList, "deny_access")
++da.title = string.format(HELP, "ACLS", "Deny Access" )
++da.description = translate("Who can access what.")
++ .. [[<br /><strong>]]
++ .. translate("Please read Privoxy manual for details!")
++ .. [[</strong>]]
++da.rmempty = true
++
++-- buffer-limit ----------------------------------------------------------------
++local bl = ns:taboption("access", Value, "buffer_limit")
++bl.title_base = "Buffer Limit"
++bl.title = string.format(HELP, "BUFFER-LIMIT", bl.title_base )
++bl.description = translate("Maximum size (in KB) of the buffer for content filtering.")
++ .. [[<br />]]
++ .. translate("Value range 1 to 4096, no entry defaults to 4096")
++bl.default = 4096
++bl.rmempty = true
++function bl.validate(self, value)
++ local v = tonumber(value)
++ if not v then
++ return nil, err_tab_access(self.title_base, translate("Value is not a number") )
++ elseif v < 1 or v > 4096 then
++ return nil, err_tab_access(self.title_base, translate("Value not between 1 and 4096") )
++ elseif v == self.default then
++ return "" -- dont need to save default
++ end
++ return value
++end
++
++-- toggle ----------------------------------------------------------------------
++local tgl = ns:taboption("access", Flag, "toggle")
++tgl.title = string.format(HELP, "TOGGLE", "Toggle Status" )
++tgl.description = translate("Enable/Disable filtering when Privoxy starts.")
++ .. [[<br />]]
++ .. translate("Disabled == Transparent Proxy Mode")
++tgl.orientation = "horizontal"
++tgl.default = "1"
++tgl.rmempty = false
++function tgl.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- enable-remote-toggle --------------------------------------------------------
++local ert = ns:taboption("access", Flag, "enable_remote_toggle")
++ert.title = string.format(HELP, "ENABLE-REMOTE-TOGGLE", "Enable remote toggle" )
++ert.description = translate("Whether or not the web-based toggle feature may be used.")
++ert.orientation = "horizontal"
++ert.rmempty = true
++function ert.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- enable-remote-http-toggle ---------------------------------------------------
++local eht = ns:taboption("access", Flag, "enable_remote_http_toggle")
++eht.title = string.format(HELP, "ENABLE-REMOTE-HTTP-TOGGLE", "Enable remote toggle via HTTP" )
++eht.description = translate("Whether or not Privoxy recognizes special HTTP headers to change toggle state.")
++ .. [[<br /><strong>]]
++ .. translate("This option will be removed in future releases as it has been obsoleted by the more general header taggers.")
++ .. [[</strong>]]
++eht.orientation = "horizontal"
++eht.rmempty = true
++function eht.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- enable-edit-actions ---------------------------------------------------------
++local eea = ns:taboption("access", Flag, "enable_edit_actions")
++eea.title = string.format(HELP, "ENABLE-EDIT-ACTIONS", "Enable action file editor" )
++eea.description = translate("Whether or not the web-based actions file editor may be used.")
++eea.orientation = "horizontal"
++eea.rmempty = true
++function eea.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- enforce-blocks --------------------------------------------------------------
++local eb = ns:taboption("access", Flag, "enforce_blocks")
++eb.title = string.format(HELP, "ENFORCE-BLOCKS", "Enforce page blocking" )
++eb.description = translate("If enabled, Privoxy hides the 'go there anyway' link. "
++ .. "The user obviously should not be able to bypass any blocks.")
++eb.orientation = "horizontal"
++eb.rmempty = true
++function eb.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- tab: forward -- #############################################################
++
++-- enable-proxy-authentication-forwarding --------------------------------------
++local paf = ns:taboption("forward", Flag, "enable_proxy_authentication_forwarding")
++paf.title = string.format(HELP, "ENABLE-PROXY-AUTHENTICATION-FORWARDING",
++ translate("Enable proxy authentication forwarding") )
++paf.description = translate("Whether or not proxy authentication through Privoxy should work.")
++ .. [[<br /><strong>]]
++ .. translate("Enabling this option is NOT recommended if there is no parent proxy that requires authentication!")
++ .. [[</strong>]]
++--paf.orientation = "horizontal"
++paf.rmempty = true
++function paf.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- forward ---------------------------------------------------------------------
++local fwd = ns:taboption("forward", DynamicList, "forward")
++fwd.title = string.format(HELP, "FORWARD", "Forward HTTP" )
++fwd.description = translate("To which parent HTTP proxy specific requests should be routed.")
++ .. [[<br />]]
++ .. translate("Syntax: target_pattern http_parent[:port]")
++fwd.rmempty = true
++
++-- forward-socks4 --------------------------------------------------------------
++local fs4 = ns:taboption("forward", DynamicList, "forward_socks4")
++fs4.title = string.format(HELP, "SOCKS", "Forward SOCKS 4" )
++fs4.description = translate("Through which SOCKS proxy (and optionally to which parent HTTP proxy) specific requests should be routed.")
++ .. [[<br />]]
++ .. translate("Syntax: target_pattern socks_proxy[:port] http_parent[:port]")
++fs4.rmempty = true
++
++-- forward-socks4a -------------------------------------------------------------
++local f4a = ns:taboption("forward", DynamicList, "forward_socks4a")
++f4a.title = string.format(HELP, "SOCKS", "Forward SOCKS 4A" )
++f4a.description = fs4.description
++f4a.rmempty = true
++
++-- forward-socks5 --------------------------------------------------------------
++local fs5 = ns:taboption("forward", DynamicList, "forward_socks5")
++fs5.title = string.format(HELP, "SOCKS", "Forward SOCKS 5" )
++fs5.description = fs4.description
++fs5.rmempty = true
++
++-- forward-socks5t -------------------------------------------------------------
++local f5t = ns:taboption("forward", DynamicList, "forward_socks5t")
++f5t.title = string.format(HELP, "SOCKS", "Forward SOCKS 5t" )
++f5t.description = fs4.description
++f5t.rmempty = true
++
++-- tab: misc -- ################################################################
++
++-- accept-intercepted-requests -------------------------------------------------
++local air = ns:taboption("misc", Flag, "accept_intercepted_requests")
++air.title = string.format(HELP, "ACCEPT-INTERCEPTED-REQUESTS", "Accept intercepted requests" )
++air.description = translate("Whether intercepted requests should be treated as valid.")
++air.orientation = "horizontal"
++air.rmempty = true
++function air.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- allow-cgi-request-crunching -------------------------------------------------
++local crc = ns:taboption("misc", Flag, "allow_cgi_request_crunching")
++crc.title = string.format(HELP, "ALLOW-CGI-REQUEST-CRUNCHING", "Allow CGI request crunching" )
++crc.description = translate("Whether requests to Privoxy's CGI pages can be blocked or redirected.")
++crc.orientation = "horizontal"
++crc.rmempty = true
++function crc.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- split-large-forms -----------------------------------------------------------
++local slf = ns:taboption("misc", Flag, "split_large_forms")
++slf.title = string.format(HELP, "SPLIT-LARGE-FORMS", "Split large forms" )
++slf.description = translate("Whether the CGI interface should stay compatible with broken HTTP clients.")
++slf.orientation = "horizontal"
++slf.rmempty = true
++function slf.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- keep-alive-timeout ----------------------------------------------------------
++local kat = ns:taboption("misc", Value, "keep_alive_timeout")
++kat.title_base = "Keep-alive timeout"
++kat.title = string.format(HELP, "KEEP-ALIVE-TIMEOUT", kat.title_base)
++kat.description = translate("Number of seconds after which an open connection will no longer be reused.")
++kat.rmempty = true
++function kat.validate(self, value)
++ local v = tonumber(value)
++ if not v then
++ return nil, err_tab_misc(self.title_base, translate("Value is not a number") )
++ elseif v < 1 then
++ return nil, err_tab_misc(self.title_base, translate("Value not greater 0 or empty") )
++ end
++ return value
++end
++
++-- tolerate-pipelining ---------------------------------------------------------
++local tp = ns:taboption("misc", Flag, "tolerate_pipelining")
++tp.title = string.format(HELP, "TOLERATE-PIPELINING", "Tolerate pipelining" )
++tp.description = translate("Whether or not pipelined requests should be served.")
++tp.orientation = "horizontal"
++tp.rmempty = true
++function tp.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- default-server-timeout ------------------------------------------------------
++local dst = ns:taboption("misc", Value, "default_server_timeout")
++dst.title_base = "Default server timeout"
++dst.title = string.format(HELP, "DEFAULT-SERVER-TIMEOUT", dst.title_base)
++dst.description = translate("Assumed server-side keep-alive timeout (in seconds) if not specified by the server.")
++dst.rmempty = true
++function dst.validate(self, value)
++ local v = tonumber(value)
++ if not v then
++ return nil, err_tab_misc(self.title_base, translate("Value is not a number") )
++ elseif v < 1 then
++ return nil, err_tab_misc(self.title_base, translate("Value not greater 0 or empty") )
++ end
++ return value
++end
++
++-- connection-sharing ----------------------------------------------------------
++local cs = ns:taboption("misc", Flag, "connection_sharing")
++cs.title = string.format(HELP, "CONNECTION-SHARING", "Connection sharing" )
++cs.description = translate("Whether or not outgoing connections that have been kept alive should be shared between different incoming connections.")
++cs.orientation = "horizontal"
++cs.rmempty = true
++function cs.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- socket-timeout --------------------------------------------------------------
++local st = ns:taboption("misc", Value, "socket_timeout")
++st.title_base = "Socket timeout"
++st.title = string.format(HELP, "SOCKET-TIMEOUT", st.title_base )
++st.description = translate("Number of seconds after which a socket times out if no data is received.")
++st.default = 300
++st.rmempty = true
++function st.validate(self, value)
++ local v = tonumber(value)
++ if not v then
++ return nil, err_tab_misc(self.title_base, translate("Value is not a number") )
++ elseif v < 1 then
++ return nil, err_tab_misc(self.title_base, translate("Value not greater 0 or empty") )
++ elseif v == self.default then
++ return "" -- dont need to save default
++ end
++ return value
++end
++
++-- max-client-connections ------------------------------------------------------
++local mcc = ns:taboption("misc", Value, "max_client_connections")
++mcc.title_base = "Max. client connections"
++mcc.title = string.format(HELP, "MAX-CLIENT-CONNECTIONS", mcc.title_base )
++mcc.description = translate("Maximum number of client connections that will be served.")
++mcc.default = 128
++mcc.rmempty = true
++function mcc.validate(self, value)
++ local v = tonumber(value)
++ if not v then
++ return nil, err_tab_misc(self.title_base, translate("Value is not a number") )
++ elseif v < 1 then
++ return nil, err_tab_misc(self.title_base, translate("Value not greater 0 or empty") )
++ elseif v == self.default then
++ return "" -- dont need to save default
++ end
++ return value
++end
++
++-- handle-as-empty-doc-returns-ok ----------------------------------------------
++local her = ns:taboption("misc", Flag, "handle_as_empty_doc_returns_ok")
++her.title = string.format(HELP, "HANDLE-AS-EMPTY-DOC-RETURNS-OK", "Handle as empty doc returns ok" )
++her.description = translate("The status code Privoxy returns for pages blocked with +handle-as-empty-document.")
++her.orientation = "horizontal"
++her.rmempty = true
++function her.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- enable-compression ----------------------------------------------------------
++local ec = ns:taboption("misc", Flag, "enable_compression")
++ec.title = string.format(HELP, "ENABLE-COMPRESSION", "Enable compression" )
++ec.description = translate("Whether or not buffered content is compressed before delivery.")
++ec.orientation = "horizontal"
++ec.rmempty = true
++function ec.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- compression-level -----------------------------------------------------------
++local cl = ns:taboption("misc", Value, "compression_level")
++cl.title_base = "Compression level"
++cl.title = string.format(HELP, "COMPRESSION-LEVEL", cl.title_base )
++cl.description = translate("The compression level that is passed to the zlib library when compressing buffered content.")
++cl.default = 1
++cl.rmempty = true
++function cl.validate(self, value)
++ local v = tonumber(value)
++ if not v then
++ return nil, err_tab_misc(self.title_base, translate("Value is not a number") )
++ elseif v < 0 or v > 9 then
++ return nil, err_tab_misc(self.title_base, translate("Value not between 0 and 9") )
++ elseif v == self.default then
++ return "" -- don't need to save default
++ end
++ return value
++end
++
++-- client-header-order ---------------------------------------------------------
++local cho = ns:taboption("misc", Value, "client_header_order")
++cho.title = string.format(HELP, "CLIENT-HEADER-ORDER", "Client header order" )
++cho.description = translate("The order in which client headers are sorted before forwarding them.")
++ .. [[<br />]]
++ .. translate("Syntax: Client header names delimited by spaces.")
++cho.rmempty = true
++
++-- "debug"-tab definition -- ###################################################
++
++-- single-threaded -------------------------------------------------------------
++local st = ns:taboption("debug", Flag, "single_threaded")
++st.title = string.format(HELP, "SINGLE-THREADED", "Single Threaded" )
++st.description = translate("Whether to run only one server thread.")
++ .. [[<br /><strong>]]
++ .. translate("This option is only there for debugging purposes. It will drastically reduce performance.")
++ .. [[</strong>]]
++st.rmempty = true
++function st.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 1 ---------------------------------------------------------------------
++local d0 = ns:taboption("debug", Flag, "debug_1")
++d0.title = string.format(HELP, "DEBUG", "Debug 1" )
++d0.description = translate("Log the destination for each request Privoxy let through. See also 'Debug 1024'.")
++d0.rmempty = true
++function d0.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 2 ---------------------------------------------------------------------
++local d1 = ns:taboption("debug", Flag, "debug_2")
++d1.title = string.format(HELP, "DEBUG", "Debug 2" )
++d1.description = translate("Show each connection status")
++d1.rmempty = true
++function d1.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 4 ---------------------------------------------------------------------
++local d2 = ns:taboption("debug", Flag, "debug_4")
++d2.title = string.format(HELP, "DEBUG", "Debug 4" )
++d2.description = translate("Show I/O status")
++d2.rmempty = true
++function d2.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 8 ---------------------------------------------------------------------
++local d3 = ns:taboption("debug", Flag, "debug_8")
++d3.title = string.format(HELP, "DEBUG", "Debug 8" )
++d3.description = translate("Show header parsing")
++d3.rmempty = true
++function d3.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 16 --------------------------------------------------------------------
++local d4 = ns:taboption("debug", Flag, "debug_16")
++d4.title = string.format(HELP, "DEBUG", "Debug 16" )
++d4.description = translate("Log all data written to the network")
++d4.rmempty = true
++function d4.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 32 --------------------------------------------------------------------
++local d5 = ns:taboption("debug", Flag, "debug_32")
++d5.title = string.format(HELP, "DEBUG", "Debug 32" )
++d5.description = translate("Debug force feature")
++d5.rmempty = true
++function d5.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 64 --------------------------------------------------------------------
++local d6 = ns:taboption("debug", Flag, "debug_64")
++d6.title = string.format(HELP, "DEBUG", "Debug 64" )
++d6.description = translate("Debug regular expression filters")
++d6.rmempty = true
++function d6.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 128 -------------------------------------------------------------------
++local d7 = ns:taboption("debug", Flag, "debug_128")
++d7.title = string.format(HELP, "DEBUG", "Debug 128" )
++d7.description = translate("Debug redirects")
++d7.rmempty = true
++function d7.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 256 -------------------------------------------------------------------
++local d8 = ns:taboption("debug", Flag, "debug_256")
++d8.title = string.format(HELP, "DEBUG", "Debug 256" )
++d8.description = translate("Debug GIF de-animation")
++d8.rmempty = true
++function d8.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 512 -------------------------------------------------------------------
++local d9 = ns:taboption("debug", Flag, "debug_512")
++d9.title = string.format(HELP, "DEBUG", "Debug 512" )
++d9.description = translate("Common Log Format")
++d9.rmempty = true
++function d9.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 1024 ------------------------------------------------------------------
++local d10 = ns:taboption("debug", Flag, "debug_1024")
++d10.title = string.format(HELP, "DEBUG", "Debug 1024" )
++d10.description = translate("Log the destination for requests Privoxy didn't let through, and the reason why.")
++d10.rmempty = true
++function d10.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 2048 ------------------------------------------------------------------
++local d11 = ns:taboption("debug", Flag, "debug_2048")
++d11.title = string.format(HELP, "DEBUG", "Debug 2048" )
++d11.description = translate("CGI user interface")
++d11.rmempty = true
++function d11.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 4096 ------------------------------------------------------------------
++local d12 = ns:taboption("debug", Flag, "debug_4096")
++d12.title = string.format(HELP, "DEBUG", "Debug 4096" )
++d12.description = translate("Startup banner and warnings.")
++d12.rmempty = true
++function d12.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 8192 ------------------------------------------------------------------
++local d13 = ns:taboption("debug", Flag, "debug_8192")
++d13.title = string.format(HELP, "DEBUG", "Debug 8192" )
++d13.description = translate("Non-fatal errors - *we highly recommended enabling this*")
++d13.rmempty = true
++function d13.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 16384 -----------------------------------------------------------------
++--[[ TODO ???
++local d14 = ns:taboption("debug", Flag, "debug_16384")
++d14.title = string.format(HELP, "DEBUG", "Debug 16384" )
++d14.description = translate("")
++d14.rmempty = true
++function d14.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++]]--
++
++-- debug 32768 -----------------------------------------------------------------
++local d15 = ns:taboption("debug", Flag, "debug_32768")
++d15.title = string.format(HELP, "DEBUG", "Debug 32768" )
++d15.description = translate("Log all data read from the network")
++d15.rmempty = true
++function d15.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- debug 65536 -----------------------------------------------------------------
++local d16 = ns:taboption("debug", Flag, "debug_65536")
++d16.title = string.format(HELP, "DEBUG", "Debug 65536" )
++d16.description = translate("Log the applying actions")
++d16.rmempty = true
++function d16.parse(self, section)
++ CTRL.flag_parse(self, section)
++end
++
++-- tab: logview -- #############################################################
++
++local lv = ns:taboption("logview", DummyValue, "_logview")
++lv.template = "privoxy/detail_logview"
++lv.inputtitle = translate("Read / Reread log file")
++lv.rows = 50
++function lv.cfgvalue(self, section)
++ local lfile=self.map:get(ns.section, "logdir") .. "/" .. self.map:get(ns.section, "logfile")
++ if NXFS.access(lfile) then
++ return lfile .. "\n" .. translate("Please press [Read] button")
++ end
++ return lfile .. "\n" .. translate("File not found or empty")
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_logview.htm b/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_logview.htm
+new file mode 100644
+index 0000000..ab0019b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_logview.htm
+@@ -0,0 +1,56 @@
++
++<!-- ++ BEGIN ++ Privoxy ++ detail_logview.htm ++ -->
++<script type="text/javascript">//<![CDATA[
++ function onclick_logview(section, bottom) {
++ // get elements
++ var txt = document.getElementById("cbid.privoxy.privoxy._logview.txt"); // TextArea
++ if ( !txt ) { return; } // security check
++ var lvXHR = new XHR();
++ lvXHR.get('<%=url('admin/services/privoxy/logview')%>', null,
++ function(x) {
++ if (x.responseText == "_nodata_")
++ txt.value = "<%:File not found or empty%>";
++ else
++ txt.value = x.responseText;
++ if (bottom)
++ txt.scrollTop = txt.scrollHeight;
++ else
++ txt.scrollTop = 0; }
++ );
++ }
++//]]></script>
++
++<%+cbi/valueheader%>
++
++<br />
++
++<%
++-- one button on top, one at the buttom
++%>
++<input class="cbi-button cbi-input-button" style="align: center; width: 100%" type="button" onclick="onclick_logview(this.name, false)"
++<%=
++attr("name", section) .. attr("id", cbid .. ".btn1") .. attr("value", self.inputtitle)
++%> />
++
++<br /><br />
++
++<%
++-- set a readable style taken from openwrt theme for textarea#syslog
++-- in openwrt theme there are problems with a width of 100 so we check for theme and set to lower value
++%>
++<textarea style="width: <%if media == "/luci-static/openwrt.org" then%>98.7%<%else%>100%<%end%> ; min-height: 500px; border: 3px solid #cccccc; padding: 5px; font-family: monospace; resize: none;" wrap="off" readonly="readonly"
++<%=
++attr("name", cbid .. ".txt") .. attr("id", cbid .. ".txt") .. ifattr(self.rows, "rows")
++%> >
++<%-=pcdata(self:cfgvalue(section))-%>
++</textarea>
++<br /><br />
++
++<%
++-- one button on top, one at the buttom
++%>
++<input class="cbi-button cbi-input-button" style="align: center; width: 100%" type="button" onclick="onclick_logview(this.name, true)"
++<%= attr("name", section) .. attr("id", cbid .. ".btn2") .. attr("value", self.inputtitle) %> />
++
++<%+cbi/valuefooter%>
++<!-- ++ END ++ Privoxy ++ detail_logview.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_startstop.htm b/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_startstop.htm
+new file mode 100644
+index 0000000..85975ac
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_startstop.htm
+@@ -0,0 +1,49 @@
++
++<!-- ++ BEGIN ++ Privoxy ++ detail_startstop.htm ++ -->
++<script type="text/javascript">//<![CDATA[
++
++ // show XHR.poll/XHR.get response on button
++ function _data2elements(x) {
++ var btn = document.getElementById("cbid.privoxy.privoxy._startstop");
++ if ( ! btn ) { return; } // security check
++ if (x.responseText == "0") {
++ btn.value = "<%:Start%>";
++ btn.className = "cbi-button cbi-button-apply";
++ btn.disabled = false;
++ } else {
++ btn.value = "PID: " + x.responseText;
++ btn.className = "cbi-button cbi-button-reset";
++ btn.disabled = false;
++ }
++ }
++
++ // event handler for start/stop button
++ function onclick_startstop(id) {
++ // do start/stop
++ var btnXHR = new XHR();
++ btnXHR.post('<%=url('admin/services/privoxy/startstop')%>', { token: '<%=token%>' },
++ function(x) { _data2elements(x); }
++ );
++ }
++
++ XHR.poll(5, '<%=url('admin/services/privoxy/status')%>', null,
++ function(x, data) { _data2elements(x); }
++ );
++
++//]]></script>
++
++<%+cbi/valueheader%>
++
++<% if self:cfgvalue(section) ~= false then
++-- We need to garantie that function cfgvalue run first to set missing parameters
++%>
++ <!-- style="font-size: 100%;" needed for openwrt theme to fix font size -->
++ <!-- type="button" onclick="..." enable standard onclick functionalty -->
++ <input class="cbi-button cbi-input-<%=self.inputstyle or "button" %>" style="font-size: 100%;" type="button" onclick="onclick_startstop(this.id)"
++ <%=
++ attr("name", section) .. attr("id", cbid) .. attr("value", self.inputtitle) .. ifattr(self.disabled, "disabled")
++ %> />
++<% end %>
++
++<%+cbi/valuefooter%>
++<!-- ++ END ++ Privoxy ++ detail_startstop.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-privoxy/po/de/privoxy.po b/feeds/luci/applications/luci-app-privoxy/po/de/privoxy.po
+new file mode 100644
+index 0000000..b01f99e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-privoxy/po/de/privoxy.po
+@@ -0,0 +1,503 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: luci-app-privoxy\n"
++"POT-Creation-Date: 2015-01-18 21:48+0100\n"
++"PO-Revision-Date: 2015-01-18 21:51+0100\n"
++"Last-Translator: Christian Schoenebeck <christian.schoenebeck@gmail.com>\n"
++"Language-Team: \n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Poedit 1.5.4\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid ""
++"A URL to be displayed in the error page that users will see if access to an "
++"untrusted page is denied."
++msgstr ""
++"Ein Link auf der Fehlerseite, der Benutzern angezeigt wird, wenn der Zugang "
++"zu einer nicht vertrauenswürdigen Seite verweigert wird."
++
++msgid ""
++"A URL to documentation about the local Privoxy setup, configuration or "
++"policies."
++msgstr ""
++"Ein Link zur Dokumentation über die lokale Privoxy Konfiguration und die "
++"Sicherheitseinstellungen."
++
++msgid "A directory where Privoxy can create temporary files."
++msgstr ""
++
++msgid "Access Control"
++msgstr "Zugriffskontrolle"
++
++msgid "Actions that are applied to all sites and maybe overruled later on."
++msgstr ""
++"Aktionen, die für alle Websites angewendet werden, und vielleicht später "
++"überschrieben werden."
++
++msgid "An alternative directory where the templates are loaded from."
++msgstr "Eine alternatives Verzeichnis, aus dem die Vorlagen geladen werden."
++
++msgid "An email address to reach the Privoxy administrator."
++msgstr "Eine E-Mail-Adresse, um die Privoxy-Administrator zu erreichen."
++
++msgid ""
++"Assumed server-side keep-alive timeout (in seconds) if not specified by the "
++"server."
++msgstr ""
++"Angenommenes serverseitiges Keep-Alive-Timeout (in Sekunden), falls nicht "
++"vom Server festgelegt."
++
++msgid "CGI user interface"
++msgstr "Protokolliert die CGI Benutzer Schnittstelle"
++
++msgid "Common Log Format"
++msgstr "Gemeinsames Protokollformat"
++
++msgid ""
++"Configure here the routing of HTTP requests through a chain of multiple "
++"proxies. Note that parent proxies can severely decrease your privacy level. "
++"Also specified here are SOCKS proxies."
++msgstr ""
++"Konfigurieren Sie hier das Weiterleiten von HTTP-Anforderungen durch eine "
++"Kette von mehreren Proxies. Beachten Sie, dass übergeordnete Proxies Ihre "
++"Privatsphäre stark verringern können. Auch hier angegeben werden SOCKS-"
++"Proxies."
++
++msgid "Debug GIF de-animation"
++msgstr "Protokolliert die GIF de-animation"
++
++msgid "Debug force feature"
++msgstr "Protokolliert die 'Force' Eigenschaft"
++
++msgid "Debug redirects"
++msgstr "Protokolliert Weiterleitungen"
++
++msgid "Debug regular expression filters"
++msgstr "Protokolliert Filter für reguläre Ausdrücke"
++
++msgid "Directory does not exist!"
++msgstr "Verzeichnis existiert nicht!"
++
++msgid "Disabled == Transparent Proxy Mode"
++msgstr "Deaktiviert == Transparent Proxy Betrieb"
++
++msgid "Enable proxy authentication forwarding"
++msgstr "Aktivieren die Weiterleitung von Proxy-Authentifizierungen"
++
++msgid ""
++"Enable/Disable autostart of Privoxy on system startup and interface events"
++msgstr ""
++"Aktivieren / Deaktivieren des Autostart von Privoxy beim Systemstart und "
++"Schnittstellenereignissen."
++
++msgid "Enable/Disable filtering when Privoxy starts."
++msgstr "Aktivieren / Deaktivieren der Filterung, wenn Privoxy startet."
++
++msgid "Enabled"
++msgstr "Aktiviert"
++
++msgid ""
++"Enabling this option is NOT recommended if there is no parent proxy that "
++"requires authentication!"
++msgstr ""
++"Die Aktivierung dieser Option wird NICHT empfohlen, wenn es keinen "
++"übergeordneten Proxy gibt, der eine Authentifizierung erfordert!"
++
++msgid "File '%s' not found inside Configuration Directory"
++msgstr "Datei '%s' nicht im Konfigurationsverzeichnis gefunden!"
++
++msgid "File not found or empty"
++msgstr "Datei nicht gefunden oder leer"
++
++msgid "Files and Directories"
++msgstr "Dateien und Verzeichnisse"
++
++msgid "For help use link at the relevant option"
++msgstr ""
++"Für Hilfe zur Verwendung, benutzen Sie die Verknüpfung der betreffenden "
++"Option."
++
++msgid "Forwarding"
++msgstr "Weiterleitung"
++
++msgid ""
++"If enabled, Privoxy hides the 'go there anyway' link. The user obviously "
++"should not be able to bypass any blocks."
++msgstr ""
++"Wenn aktiviert, verbirgt Privoxy den Link 'go there anyway'. Normalerweise "
++"sollten Benutzer nicht in der Lage sein, Blockierungen zu umgehen."
++
++msgid ""
++"If you intend to operate Privoxy for more users than just yourself, it might "
++"be a good idea to let them know how to reach you, what you block and why you "
++"do that, your policies, etc."
++msgstr ""
++"Wenn Sie beabsichtigen, Privoxy für mehr Nutzer als nur sich selbst zu "
++"betreiben, ist es eine gute Idee, sie wissen zu lassen, wie sie Sie "
++"erreichen können, was Sie blockieren und warum Sie das tun, etc."
++
++msgid "Invalid email address"
++msgstr "Ungültige Email Adresse"
++
++msgid "It is NOT recommended for the casual user."
++msgstr "Es wird NICHT für den gelegentlichen Anwender empfohlen."
++
++msgid "Local Set-up"
++msgstr "Lokale Einstellungen"
++
++msgid "Location of the Privoxy User Manual."
++msgstr "Ort des Privoxy Benutzer Handbuches"
++
++msgid "Log File Viewer"
++msgstr "Protokolldatei"
++
++msgid "Log all data read from the network"
++msgstr "Protokolliert alle Daten, die vom Netzwerk gelesen werden."
++
++msgid "Log all data written to the network"
++msgstr "Protokolliert alle Daten, die auf das Netzwerk geschrieben werden."
++
++msgid "Log the applying actions"
++msgstr "Protokiolliert angewendete Aktionen"
++
++msgid ""
++"Log the destination for each request Privoxy let through. See also 'Debug "
++"1024'."
++msgstr ""
++"Protokolliert das Ziel für jede Anforderung die Privoxy durchlässt. Siehe "
++"auch 'Debug 1024'."
++
++msgid ""
++"Log the destination for requests Privoxy didn't let through, and the reason "
++"why."
++msgstr ""
++"Protokolliert das Ziel für Anfragen die Privoxy nicht durchgelassen hat, und "
++"den Grund dafür."
++
++msgid "Logging"
++msgstr "Protokollierung"
++
++msgid "Main actions file"
++msgstr "Wichtige Aktionen-Datei"
++
++msgid "Mandatory Input: No Data given!"
++msgstr "Pflichtfeld: Keine Daten angegeben!"
++
++msgid "Mandatory Input: No Directory given!"
++msgstr "Pflichtfeld: Kein Verzeichnis angegeben!"
++
++msgid "Mandatory Input: No File given!"
++msgstr "Pflichtfeld: Keine Datei angegeben!"
++
++msgid "Mandatory Input: No Port given!"
++msgstr "Pflichtfeld: Kein Port angegeben!"
++
++msgid "Mandatory Input: No files given!"
++msgstr "Pflichtfeld: Keine Dateien angegeben!"
++
++msgid "Mandatory Input: No valid IPv4 address or host given!"
++msgstr ""
++"Pflichtfeld: Keine gültige IPv4 Adresse oder gültiger Hostname angegeben!"
++
++msgid "Mandatory Input: No valid IPv6 address given!"
++msgstr "Pflichtfeld: Keine gültige IPv6 Adresse angegeben!"
++
++msgid "Mandatory Input: No valid Port given!"
++msgstr "Pflichtfeld: Keine gültige Port Nummer angegeben!"
++
++msgid "Maximum number of client connections that will be served."
++msgstr "Maximale Anzahl von Client-Verbindungen."
++
++msgid "Maximum size (in KB) of the buffer for content filtering."
++msgstr "Maximale Größe (in KB) des Puffers für die Inhaltsfilterung."
++
++msgid "Miscellaneous"
++msgstr "Verschiedenes"
++
++msgid "No trailing '/', please."
++msgstr "Bitte kein '/' am Ende."
++
++msgid "Non-fatal errors - *we highly recommended enabling this*"
++msgstr ""
++"Protokolliert nicht schwerwiegende Fehler - * Es wird dringend empfohlen, "
++"dieses zu aktivieren *"
++
++msgid ""
++"Number of seconds after which a socket times out if no data is received."
++msgstr ""
++"Anzahl der Sekunden, nach der eine Socket Timeout erfolgt, wenn keine Daten "
++"empfangen werden."
++
++msgid ""
++"Number of seconds after which an open connection will no longer be reused."
++msgstr ""
++"Anzahl von Sekunden, nach der eine offene Verbindung nicht mehr "
++"wiederverwendet wird."
++
++msgid ""
++"Only when using 'external filters', Privoxy has to create temporary files."
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr "Bitte Protokolldatei einlesen"
++
++msgid "Please read Privoxy manual for details!"
++msgstr "Bitte lesen Sie das Privoxy Handbuch für Details!"
++
++msgid "Please update to the current version!"
++msgstr "Aktualisieren Sie bitte auf die aktuelle Version!"
++
++msgid "Privoxy WEB proxy"
++msgstr "Privoxy WEB proxy"
++
++msgid ""
++"Privoxy can (and normally does) use a number of other files for additional "
++"configuration, help and logging. This section of the configuration file "
++"tells Privoxy where to find those other files."
++msgstr ""
++"Privoxy verwendet (was in der Regel der Fall ist), eine Reihe von anderen "
++"Dateien für eine zusätzliche Konfiguration, Hilfe und Protokollierung. "
++"Dieser Abschnitt der Konfigurationsdatei definiert, wo diese Dateien zu "
++"finden sind."
++
++msgid ""
++"Privoxy is a non-caching web proxy with advanced filtering capabilities for "
++"enhancing privacy, modifying web page data and HTTP headers, controlling "
++"access, and removing ads and other obnoxious Internet junk."
++msgstr ""
++"Privoxy ist ein non-caching Web-Proxy mit erweiterten Filterfunktion zur "
++"Verbesserung der Privatsphäre. Er modifiziert Webseitendaten und HTTP-"
++"Header, kontrolliert den Zugang und das Entfernen von Anzeigen und anderem "
++"abscheulichen Internet Schrott."
++
++msgid "Read / Reread log file"
++msgstr "Protokolldatei (neu) lesen"
++
++msgid "Show I/O status"
++msgstr "Protokolliert den I/O Status"
++
++msgid "Show each connection status"
++msgstr "Protokolliert jeden Verbindungsstatus"
++
++msgid "Show header parsing"
++msgstr "Protokolliert das 'Header parsing'"
++
++msgid "Software update required"
++msgstr "Softwareaktualisierung nötig"
++
++msgid "Start"
++msgstr "Start"
++
++msgid "Start / Stop"
++msgstr "Start / Stopp"
++
++msgid "Start/Stop Privoxy WEB Proxy"
++msgstr "Start/Stopp Privoxy WEB Proxy"
++
++msgid "Startup banner and warnings."
++msgstr "Protokolliert Start-Meldungen und Warnungen"
++
++msgid "Syntax:"
++msgstr "Syntax:"
++
++msgid "Syntax: Client header names delimited by spaces."
++msgstr "Syntax: Client header Namen getrennt durch Leerzeichen."
++
++msgid "Syntax: target_pattern http_parent[:port]"
++msgstr "Syntax: target_pattern http_parent[:port]"
++
++msgid "Syntax: target_pattern socks_proxy[:port] http_parent[:port]"
++msgstr "Syntax: target_pattern socks_proxy[:port] http_parent[:port]"
++
++msgid ""
++"The actions file(s) to use. Multiple actionsfile lines are permitted, and "
++"are in fact recommended!"
++msgstr ""
++"Die zu verwendenden Aktion-Datei(en). Mehrere Dateien sind gestattet und "
++"empfohlen!"
++
++msgid ""
++"The address and TCP port on which Privoxy will listen for client requests."
++msgstr ""
++"Die Adresse und das TCP-Port, auf dem Privoxy auf Client-Anforderungen "
++"wartet."
++
++msgid ""
++"The compression level that is passed to the zlib library when compressing "
++"buffered content."
++msgstr ""
++"Die Komprimierungsstufe (0-9), die der zlib-Bibliothek beim Komprimieren "
++"gepufferten Inhaltes übergeben wird."
++
++msgid ""
++"The currently installed 'privoxy' package is not supported by LuCI "
++"application."
++msgstr ""
++"Das aktuell installierte 'privoxy' Paket wird von dieser LuCI Anwendung "
++"NICHT unterstützt."
++
++msgid ""
++"The directory where all logging takes place (i.e. where the logfile is "
++"located)."
++msgstr "Das Verzeichnis in dem die Protokolldatei gespeichert wird."
++
++msgid "The directory where the other configuration files are located."
++msgstr "Das Verzeichnis in dem weitere Konfigurationsdateien gespeichert sind."
++
++msgid ""
++"The filter files contain content modification rules that use regular "
++"expressions."
++msgstr ""
++"Die Filterdateien enthalten Änderung des Inhalts, die reguläre Ausdrücke "
++"als Regeln verwenden."
++
++msgid "The hostname shown on the CGI pages."
++msgstr "Der Hostname der auf CGI-Seiten angezeigt wird."
++
++msgid "The log file to use. File name, relative to log directory."
++msgstr ""
++"Zu verwendende Protokolldatei. Dateiname relativ zum Protokoll-Verzeichnis."
++
++msgid "The order in which client headers are sorted before forwarding them."
++msgstr ""
++"Die Reihenfolge, in der Client-Header sortiert werden, bevor sie "
++"weitergeleitet werden."
++
++msgid ""
++"The status code Privoxy returns for pages blocked with +handle-as-empty-"
++"document."
++msgstr ""
++"Ob Statuscode 200(OK) oder 403(forbidden) für Seiten gemeldet wird, die "
++"durch den Filter 'handle-as-empty-document' blockiert werden."
++
++msgid ""
++"The trust mechanism is an experimental feature for building white-lists and "
++"should be used with care."
++msgstr ""
++"Der Trust-Mechanismus ist eine experimentelle Funktion für den Aufbau von "
++"White-Listen und sollte mit Vorsicht verwendet werden."
++
++msgid ""
++"The value of this option only matters if the experimental trust mechanism "
++"has been activated."
++msgstr ""
++"Der Wert dieser Option ist nur wirksam, wenn der experimentelle Trust-"
++"Mechanismus aktiviert wurde."
++
++msgid ""
++"This option is only there for debugging purposes. It will drastically reduce "
++"performance."
++msgstr ""
++"Diese Option ist ausschließlich zur Fehlersuche. Es wird drastisch die "
++"Leistung beeinträchtigt."
++
++msgid ""
++"This option will be removed in future releases as it has been obsoleted by "
++"the more general header taggers."
++msgstr "Diese Option wird in zukünftigen Versionen entfernt werden."
++
++msgid ""
++"This tab controls the security-relevant aspects of Privoxy's configuration."
++msgstr ""
++"Diese Registerkarte steuert die sicherheitsrelevanten Aspekte der Privoxy "
++"Konfiguration."
++
++msgid ""
++"Through which SOCKS proxy (and optionally to which parent HTTP proxy) "
++"specific requests should be routed."
++msgstr ""
++"An welchen SOCKS-Proxy (und gegebenenfalls an welchen übergeordneten HTTP-"
++"Proxy) spezifischen Anforderungen weitergeleitet werden."
++
++msgid "To which parent HTTP proxy specific requests should be routed."
++msgstr ""
++"An welchen übergeordneten HTTP-Proxy spezifischen Anforderungen "
++"weitergeleitet werden."
++
++msgid "User customizations"
++msgstr "Benutzerdefinierte Anpassungen"
++
++msgid "Value is not a number"
++msgstr "Eingabe ist keine Zahl"
++
++msgid "Value not between 0 and 9"
++msgstr "Wert nicht zwischen 0 und 9"
++
++msgid "Value not between 1 and 4096"
++msgstr "Wert nicht zwischen 1 und 4096"
++
++msgid "Value not greater 0 or empty"
++msgstr "Wert nicht größer 0 oder leer"
++
++msgid "Value range 1 to 4096, no entry defaults to 4096"
++msgstr "Wertebereich: 1 bis 4096; Keine Angabe setzt 4096."
++
++msgid "Version"
++msgstr "Version"
++
++msgid "Version Information"
++msgstr "Versionsinformation"
++
++msgid "Whether intercepted requests should be treated as valid."
++msgstr "Ob abgefangen Anfragen als gültig behandelt werden."
++
++msgid ""
++"Whether or not Privoxy recognizes special HTTP headers to change toggle "
++"state."
++msgstr ""
++"Ob Privoxy erkannte spezielle HTTP-Header zur Änderung des Toggle-Status "
++"verwendet.."
++
++msgid "Whether or not buffered content is compressed before delivery."
++msgstr ""
++"Ob gepufferte Inhalte vor der Weiterleitung komprimiert werden oder nicht."
++
++msgid ""
++"Whether or not outgoing connections that have been kept alive should be "
++"shared between different incoming connections."
++msgstr ""
++"Ob ausgehende Verbindungen, die am Leben gehalten werden, für verschiedenen "
++"eingehenden Verbindungen gemeinsam genutzt werden oder nicht."
++
++msgid "Whether or not pipelined requests should be served."
++msgstr "Ob Pipeline-Anfragen bedient werden oder nicht."
++
++msgid "Whether or not proxy authentication through Privoxy should work."
++msgstr ""
++"Ob Proxy-Authentifizierungen durch Privoxy weitergeleitet werden oder nicht."
++
++msgid "Whether or not the web-based actions file editor may be used."
++msgstr "De-/Aktiviert den webbasierte Action-Datei Editor."
++
++msgid "Whether or not the web-based toggle feature may be used."
++msgstr "De-Aktiviert die webbasierte Umschaltfunktion."
++
++msgid "Whether requests to Privoxy's CGI pages can be blocked or redirected."
++msgstr ""
++"Ob Anfragen an Privoxy CGI-Seiten gesperrt oder umgeleitet werden können "
++"oder nicht."
++
++msgid ""
++"Whether the CGI interface should stay compatible with broken HTTP clients."
++msgstr ""
++"Ob die CGI-Schnittstelle mit broken HTTP-Clients kompatibel bleibt oder "
++"nicht."
++
++msgid "Whether to run only one server thread."
++msgstr "Ob nur ein Server-Thread ausgeführt wird."
++
++msgid "Who can access what."
++msgstr "Wer kann auf Was zugreifen."
++
++msgid "installed"
++msgstr "installiert"
++
++msgid "or higher"
++msgstr "oder höher"
++
++msgid "required"
++msgstr "benötigt"
+diff --git a/feeds/luci/applications/luci-app-privoxy/po/templates/privoxy.pot b/feeds/luci/applications/luci-app-privoxy/po/templates/privoxy.pot
+new file mode 100644
+index 0000000..150ee31
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-privoxy/po/templates/privoxy.pot
+@@ -0,0 +1,412 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid ""
++"A URL to be displayed in the error page that users will see if access to an "
++"untrusted page is denied."
++msgstr ""
++
++msgid ""
++"A URL to documentation about the local Privoxy setup, configuration or "
++"policies."
++msgstr ""
++
++msgid "A directory where Privoxy can create temporary files."
++msgstr ""
++
++msgid "Access Control"
++msgstr ""
++
++msgid "Actions that are applied to all sites and maybe overruled later on."
++msgstr ""
++
++msgid "An alternative directory where the templates are loaded from."
++msgstr ""
++
++msgid "An email address to reach the Privoxy administrator."
++msgstr ""
++
++msgid ""
++"Assumed server-side keep-alive timeout (in seconds) if not specified by the "
++"server."
++msgstr ""
++
++msgid "CGI user interface"
++msgstr ""
++
++msgid "Common Log Format"
++msgstr ""
++
++msgid ""
++"Configure here the routing of HTTP requests through a chain of multiple "
++"proxies. Note that parent proxies can severely decrease your privacy level. "
++"Also specified here are SOCKS proxies."
++msgstr ""
++
++msgid "Debug GIF de-animation"
++msgstr ""
++
++msgid "Debug force feature"
++msgstr ""
++
++msgid "Debug redirects"
++msgstr ""
++
++msgid "Debug regular expression filters"
++msgstr ""
++
++msgid "Directory does not exist!"
++msgstr ""
++
++msgid "Disabled == Transparent Proxy Mode"
++msgstr ""
++
++msgid "Enable proxy authentication forwarding"
++msgstr ""
++
++msgid ""
++"Enable/Disable autostart of Privoxy on system startup and interface events"
++msgstr ""
++
++msgid "Enable/Disable filtering when Privoxy starts."
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid ""
++"Enabling this option is NOT recommended if there is no parent proxy that "
++"requires authentication!"
++msgstr ""
++
++msgid "File '%s' not found inside Configuration Directory"
++msgstr ""
++
++msgid "File not found or empty"
++msgstr ""
++
++msgid "Files and Directories"
++msgstr ""
++
++msgid "For help use link at the relevant option"
++msgstr ""
++
++msgid "Forwarding"
++msgstr ""
++
++msgid ""
++"If enabled, Privoxy hides the 'go there anyway' link. The user obviously "
++"should not be able to bypass any blocks."
++msgstr ""
++
++msgid ""
++"If you intend to operate Privoxy for more users than just yourself, it might "
++"be a good idea to let them know how to reach you, what you block and why you "
++"do that, your policies, etc."
++msgstr ""
++
++msgid "Invalid email address"
++msgstr ""
++
++msgid "It is NOT recommended for the casual user."
++msgstr ""
++
++msgid "Local Set-up"
++msgstr ""
++
++msgid "Location of the Privoxy User Manual."
++msgstr ""
++
++msgid "Log File Viewer"
++msgstr ""
++
++msgid "Log all data read from the network"
++msgstr ""
++
++msgid "Log all data written to the network"
++msgstr ""
++
++msgid "Log the applying actions"
++msgstr ""
++
++msgid ""
++"Log the destination for each request Privoxy let through. See also 'Debug "
++"1024'."
++msgstr ""
++
++msgid ""
++"Log the destination for requests Privoxy didn't let through, and the reason "
++"why."
++msgstr ""
++
++msgid "Logging"
++msgstr ""
++
++msgid "Main actions file"
++msgstr ""
++
++msgid "Mandatory Input: No Data given!"
++msgstr ""
++
++msgid "Mandatory Input: No Directory given!"
++msgstr ""
++
++msgid "Mandatory Input: No File given!"
++msgstr ""
++
++msgid "Mandatory Input: No Port given!"
++msgstr ""
++
++msgid "Mandatory Input: No files given!"
++msgstr ""
++
++msgid "Mandatory Input: No valid IPv4 address or host given!"
++msgstr ""
++
++msgid "Mandatory Input: No valid IPv6 address given!"
++msgstr ""
++
++msgid "Mandatory Input: No valid Port given!"
++msgstr ""
++
++msgid "Maximum number of client connections that will be served."
++msgstr ""
++
++msgid "Maximum size (in KB) of the buffer for content filtering."
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "No trailing '/', please."
++msgstr ""
++
++msgid "Non-fatal errors - *we highly recommended enabling this*"
++msgstr ""
++
++msgid ""
++"Number of seconds after which a socket times out if no data is received."
++msgstr ""
++
++msgid ""
++"Number of seconds after which an open connection will no longer be reused."
++msgstr ""
++
++msgid ""
++"Only when using 'external filters', Privoxy has to create temporary files."
++msgstr ""
++
++msgid "Please press [Read] button"
++msgstr ""
++
++msgid "Please read Privoxy manual for details!"
++msgstr ""
++
++msgid "Please update to the current version!"
++msgstr ""
++
++msgid "Privoxy WEB proxy"
++msgstr ""
++
++msgid ""
++"Privoxy can (and normally does) use a number of other files for additional "
++"configuration, help and logging. This section of the configuration file "
++"tells Privoxy where to find those other files."
++msgstr ""
++
++msgid ""
++"Privoxy is a non-caching web proxy with advanced filtering capabilities for "
++"enhancing privacy, modifying web page data and HTTP headers, controlling "
++"access, and removing ads and other obnoxious Internet junk."
++msgstr ""
++
++msgid "Read / Reread log file"
++msgstr ""
++
++msgid "Show I/O status"
++msgstr ""
++
++msgid "Show each connection status"
++msgstr ""
++
++msgid "Show header parsing"
++msgstr ""
++
++msgid "Software update required"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Start/Stop Privoxy WEB Proxy"
++msgstr ""
++
++msgid "Startup banner and warnings."
++msgstr ""
++
++msgid "Syntax:"
++msgstr ""
++
++msgid "Syntax: Client header names delimited by spaces."
++msgstr ""
++
++msgid "Syntax: target_pattern http_parent[:port]"
++msgstr ""
++
++msgid "Syntax: target_pattern socks_proxy[:port] http_parent[:port]"
++msgstr ""
++
++msgid ""
++"The actions file(s) to use. Multiple actionsfile lines are permitted, and "
++"are in fact recommended!"
++msgstr ""
++
++msgid ""
++"The address and TCP port on which Privoxy will listen for client requests."
++msgstr ""
++
++msgid ""
++"The compression level that is passed to the zlib library when compressing "
++"buffered content."
++msgstr ""
++
++msgid ""
++"The currently installed 'privoxy' package is not supported by LuCI "
++"application."
++msgstr ""
++
++msgid ""
++"The directory where all logging takes place (i.e. where the logfile is "
++"located)."
++msgstr ""
++
++msgid "The directory where the other configuration files are located."
++msgstr ""
++
++msgid ""
++"The filter files contain content modification rules that use regular "
++"expressions."
++msgstr ""
++
++msgid "The hostname shown on the CGI pages."
++msgstr ""
++
++msgid "The log file to use. File name, relative to log directory."
++msgstr ""
++
++msgid "The order in which client headers are sorted before forwarding them."
++msgstr ""
++
++msgid ""
++"The status code Privoxy returns for pages blocked with +handle-as-empty-"
++"document."
++msgstr ""
++
++msgid ""
++"The trust mechanism is an experimental feature for building white-lists and "
++"should be used with care."
++msgstr ""
++
++msgid ""
++"The value of this option only matters if the experimental trust mechanism "
++"has been activated."
++msgstr ""
++
++msgid ""
++"This option is only there for debugging purposes. It will drastically reduce "
++"performance."
++msgstr ""
++
++msgid ""
++"This option will be removed in future releases as it has been obsoleted by "
++"the more general header taggers."
++msgstr ""
++
++msgid ""
++"This tab controls the security-relevant aspects of Privoxy's configuration."
++msgstr ""
++
++msgid ""
++"Through which SOCKS proxy (and optionally to which parent HTTP proxy) "
++"specific requests should be routed."
++msgstr ""
++
++msgid "To which parent HTTP proxy specific requests should be routed."
++msgstr ""
++
++msgid "User customizations"
++msgstr ""
++
++msgid "Value is not a number"
++msgstr ""
++
++msgid "Value not between 0 and 9"
++msgstr ""
++
++msgid "Value not between 1 and 4096"
++msgstr ""
++
++msgid "Value not greater 0 or empty"
++msgstr ""
++
++msgid "Value range 1 to 4096, no entry defaults to 4096"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid "Whether intercepted requests should be treated as valid."
++msgstr ""
++
++msgid ""
++"Whether or not Privoxy recognizes special HTTP headers to change toggle "
++"state."
++msgstr ""
++
++msgid "Whether or not buffered content is compressed before delivery."
++msgstr ""
++
++msgid ""
++"Whether or not outgoing connections that have been kept alive should be "
++"shared between different incoming connections."
++msgstr ""
++
++msgid "Whether or not pipelined requests should be served."
++msgstr ""
++
++msgid "Whether or not proxy authentication through Privoxy should work."
++msgstr ""
++
++msgid "Whether or not the web-based actions file editor may be used."
++msgstr ""
++
++msgid "Whether or not the web-based toggle feature may be used."
++msgstr ""
++
++msgid "Whether requests to Privoxy's CGI pages can be blocked or redirected."
++msgstr ""
++
++msgid ""
++"Whether the CGI interface should stay compatible with broken HTTP clients."
++msgstr ""
++
++msgid "Whether to run only one server thread."
++msgstr ""
++
++msgid "Who can access what."
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "required"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-privoxy/po/zh-cn/privoxy.po b/feeds/luci/applications/luci-app-privoxy/po/zh-cn/privoxy.po
+new file mode 100644
+index 0000000..f69a8f9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-privoxy/po/zh-cn/privoxy.po
+@@ -0,0 +1,468 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: luci-app-privoxy\n"
++"POT-Creation-Date: 2015-06-10 20:16+0100\n"
++"PO-Revision-Date: 2015-06-10 20:16+0100\n"
++"Last-Translator: maz-1 <ohmygod19993 at gmail dotcom>\n"
++"Language-Team: \n"
++"Language: zh-cn\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Poedit 1.5.4\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid ""
++"A URL to be displayed in the error page that users will see if access to an "
++"untrusted page is denied."
++msgstr ""
++"当用户试图访问ä¸å—信任的页é¢æ—¶ï¼Œé”™è¯¯é¡µé¢æ‰€æ˜¾ç¤ºçš„URL。"
++
++
++msgid ""
++"A URL to documentation about the local Privoxy setup, configuration or "
++"policies."
++msgstr ""
++"指å‘Privoxy安装ã€è®¾ç½®å’Œè§„则说明文档的URL"
++
++
++msgid "A directory where Privoxy can create temporary files."
++msgstr "Privoxy存放临时文件的目录。"
++
++msgid "Access Control"
++msgstr "访问控制"
++
++msgid "Actions that are applied to all sites and maybe overruled later on."
++msgstr ""
++"作用在所有站点上的规则,å¯èƒ½è¢«åŽé¢çš„规则覆盖。"
++
++
++msgid "An alternative directory where the templates are loaded from."
++msgstr "å¯é€‰çš„目录,放在里é¢çš„模æ¿ä¼šè¢«åŠ è½½ã€‚"
++
++msgid "An email address to reach the Privoxy administrator."
++msgstr "用于è”ç³»privoxy管ç†å‘˜çš„邮箱地å€ã€‚"
++
++msgid ""
++"Assumed server-side keep-alive timeout (in seconds) if not specified by the "
++"server."
++msgstr ""
++"当æœåŠ¡ç«¯æ²¡æœ‰æŒ‡å®šè¶…时时间时å‡å®šçš„超时时间(å•ä½ç§’)。"
++
++msgid "CGI user interface"
++msgstr "CGI用户界é¢"
++
++msgid "Common Log Format"
++msgstr "通用日志格å¼"
++
++msgid ""
++"Configure here the routing of HTTP requests through a chain of multiple "
++"proxies. Note that parent proxies can severely decrease your privacy level. "
++"Also specified here are SOCKS proxies."
++msgstr ""
++"在这里设置http请求所ç»è¿‡çš„多é‡ä»£ç†é“¾ã€‚"
++"注æ„父级代ç†å¯èƒ½ä¸¥é‡é™ä½Žä½ çš„éšç§å®‰å…¨åº¦ã€‚"
++"在这里还å¯ä»¥è®¾ç½®SOCKS代ç†ã€‚"
++
++msgid "Debug GIF de-animation"
++msgstr "GIF动画日志"
++
++msgid "Debug force feature"
++msgstr "force feature日志"
++
++msgid "Debug redirects"
++msgstr "é‡å®šå‘日志"
++
++msgid "Debug regular expression filters"
++msgstr "正则表达å¼æ—¥å¿—"
++
++msgid "Directory does not exist!"
++msgstr "目录ä¸å­˜åœ¨ï¼"
++
++msgid "Disabled == Transparent Proxy Mode"
++msgstr "ç¦ç”¨ == é€æ˜Žä»£ç†æ¨¡å¼"
++
++msgid "Enable proxy authentication forwarding"
++msgstr "å…许转å‘代ç†è®¤è¯"
++
++msgid ""
++"Enable/Disable autostart of Privoxy on system startup and interface events"
++msgstr ""
++"å¼€å¯/关闭Privoxy在系统å¯åŠ¨æˆ–者设置界é¢æ›´æ”¹æ—¶è‡ªåŠ¨å¯åŠ¨ã€‚"
++
++msgid "Enable/Disable filtering when Privoxy starts."
++msgstr "Privoxyå¯åŠ¨æ—¶å¼€å¯/关闭过滤。"
++
++msgid "Enabled"
++msgstr "已开å¯"
++
++msgid ""
++"Enabling this option is NOT recommended if there is no parent proxy that "
++"requires authentication!"
++msgstr ""
++"父级代ç†ä¸éœ€è¦è®¤è¯æ—¶ä¸æŽ¨èå¼€å¯è¿™ä¸ªé€‰é¡¹ï¼"
++
++msgid "File '%s' not found inside Configuration Directory"
++msgstr "文件 '%s' 没有在设置目录中找到ï¼"
++
++msgid "File not found or empty"
++msgstr "文件ä¸å­˜åœ¨æˆ–为空"
++
++msgid "Files and Directories"
++msgstr "文件和目录"
++
++msgid "For help use link at the relevant option"
++msgstr ""
++"在相应选项下的连接å¯èŽ·å–帮助。"
++
++msgid "Forwarding"
++msgstr "转å‘"
++
++msgid ""
++"If enabled, Privoxy hides the 'go there anyway' link. The user obviously "
++"should not be able to bypass any blocks."
++msgstr ""
++"如果å¯ç”¨ï¼ŒPrivoxy会éšè—'go there anyway'链接。用户显然ä¸åº”能绕过å±è”½ã€‚"
++
++msgid ""
++"If you intend to operate Privoxy for more users than just yourself, it might "
++"be a good idea to let them know how to reach you, what you block and why you "
++"do that, your policies, etc."
++msgstr ""
++"如果除了你还有其他用户通过privoxy连接,让他们知é“如何è”系你ã€ä»€ä¹ˆå†…容被å±è”½äº†ã€"
++"你为什么è¦è¿™ä¹ˆåšã€ä½ æ‰€åˆ¶å®šçš„规范等等是一个好主æ„。"
++
++msgid "Invalid email address"
++msgstr "邮箱地å€æ— æ•ˆ"
++
++msgid "It is NOT recommended for the casual user."
++msgstr "ä¸æŽ¨è新手使用。"
++
++msgid "Local Set-up"
++msgstr "本地设置"
++
++msgid "Location of the Privoxy User Manual."
++msgstr "Privoxy用户手册ä½ç½®"
++
++msgid "Log File Viewer"
++msgstr "日志查看器"
++
++msgid "Log all data read from the network"
++msgstr "记录所有从网络接收的数æ®"
++
++msgid "Log all data written to the network"
++msgstr "记录所有å‘é€ç»™ç½‘络的数æ®"
++
++msgid "Log the applying actions"
++msgstr "记录被应用的规则"
++
++msgid ""
++"Log the destination for each request Privoxy let through. See also 'Debug "
++"1024'."
++msgstr ""
++"记录Privoxy所å…许的所有请求。å¦è¯·å‚考'Debug 1024'。"
++
++msgid ""
++"Log the destination for requests Privoxy didn't let through, and the reason "
++"why."
++msgstr ""
++"记录被Privoxyæ‹’ç»çš„请求目标以åŠæ‹’ç»åŽŸå› ã€‚"
++
++msgid "Logging"
++msgstr "日志"
++
++msgid "Main actions file"
++msgstr "主è¦è§„则文件"
++
++msgid "Mandatory Input: No Data given!"
++msgstr "必需选项: 没有设置数æ®ï¼"
++
++msgid "Mandatory Input: No Directory given!"
++msgstr "必需选项: 没有设置目录ï¼"
++
++msgid "Mandatory Input: No File given!"
++msgstr "必需选项: 没有设置文件ï¼"
++
++msgid "Mandatory Input: No Port given!"
++msgstr "必需选项: 没有设置端å£ï¼"
++
++msgid "Mandatory Input: No files given!"
++msgstr "必需选项: 没有设置文件ï¼"
++
++msgid "Mandatory Input: No valid IPv4 address or host given!"
++msgstr ""
++"必需选项: 没有设置有效的IPV4地å€æˆ–者主机ï¼"
++
++msgid "Mandatory Input: No valid IPv6 address given!"
++msgstr "必需选项: 没有设置有效的IPV6地å€ï¼"
++
++msgid "Mandatory Input: No valid Port given!"
++msgstr "必需选项: 没有设置有效的端å£ï¼"
++
++msgid "Maximum number of client connections that will be served."
++msgstr "客户端数é‡ä¸Šé™ã€‚"
++
++msgid "Maximum size (in KB) of the buffer for content filtering."
++msgstr "内容过滤的最大缓冲(å•ä½KB)。"
++
++msgid "Miscellaneous"
++msgstr "æ‚项"
++
++msgid "No trailing '/', please."
++msgstr "路径结尾ä¸è¦åŠ '/' ."
++
++msgid "Non-fatal errors - *we highly recommended enabling this*"
++msgstr ""
++"éžè‡´å‘½æ€§é”™è¯¯ - * å»ºè®®å¼€å¯ *"
++
++msgid ""
++"Number of seconds after which a socket times out if no data is received."
++msgstr ""
++"socket连接未收到数æ®çš„超时时间。"
++
++msgid ""
++"Number of seconds after which an open connection will no longer be reused."
++msgstr ""
++"一个开放的连接ä¸å†é‡å¤ä½¿ç”¨çš„超时时间。"
++
++msgid ""
++"Only when using 'external filters', Privoxy has to create temporary files."
++msgstr ""
++"åªæœ‰ä½¿ç”¨å¤–置规则时,privoxyæ‰éœ€è¦åˆ›å»ºä¸´æ—¶æ–‡ä»¶ã€‚"
++
++msgid "Please press [Read] button"
++msgstr "请点击[读å–]按钮"
++
++msgid "Please read Privoxy manual for details!"
++msgstr "请阅读Privoxy手册以了解详情ï¼"
++
++msgid "Please update to the current version!"
++msgstr "请å‡çº§åˆ°å½“å‰ç‰ˆæœ¬ï¼"
++
++msgid "Privoxy WEB proxy"
++msgstr "Privoxy 网络代ç†"
++
++msgid ""
++"Privoxy can (and normally does) use a number of other files for additional "
++"configuration, help and logging. This section of the configuration file "
++"tells Privoxy where to find those other files."
++msgstr ""
++"Privoxyå¯ä»¥ä½¿ç”¨å…¶ä»–一些文件用于附加设置,帮助和日志。这个区域用æ¥å‘Šè¯‰Privoxy从哪里找到这些文件。"
++
++msgid ""
++"Privoxy is a non-caching web proxy with advanced filtering capabilities for "
++"enhancing privacy, modifying web page data and HTTP headers, controlling "
++"access, and removing ads and other obnoxious Internet junk."
++msgstr ""
++"Privoxy是一个无缓存的网络代ç†ï¼Œå…·æœ‰é«˜çº§è¿‡æ»¤åŠŸèƒ½ï¼Œèƒ½å¤Ÿä¿®æ”¹ç½‘页数æ®å’ŒHTTP头,控制访问,移除广告等。"
++
++msgid "Read / Reread log file"
++msgstr "读å–/刷新日志文件"
++
++msgid "Show I/O status"
++msgstr "显示 I/O 状æ€"
++
++msgid "Show each connection status"
++msgstr "显示æ¯ä¸ªè¿žæŽ¥çš„状æ€"
++
++msgid "Show header parsing"
++msgstr "Show header parsing"
++
++msgid "Software update required"
++msgstr "需è¦å‡çº§è½¯ä»¶"
++
++msgid "Start"
++msgstr "å¯åŠ¨"
++
++msgid "Start / Stop"
++msgstr "å¯åŠ¨ / åœæ­¢"
++
++msgid "Start/Stop Privoxy WEB Proxy"
++msgstr "å¯åŠ¨/åœæ­¢ Privoxy 网络代ç†"
++
++msgid "Startup banner and warnings."
++msgstr "å¯åŠ¨æ ‡è¯­å’Œè­¦å‘Šã€‚"
++
++msgid "Syntax:"
++msgstr "æ ¼å¼:"
++
++msgid "Syntax: Client header names delimited by spaces."
++msgstr "æ ¼å¼: Client header names delimited by spaces."
++
++msgid "Syntax: target_pattern http_parent[:port]"
++msgstr "æ ¼å¼: target_pattern http_parent[:port]"
++
++msgid "Syntax: target_pattern socks_proxy[:port] http_parent[:port]"
++msgstr "æ ¼å¼: target_pattern socks_proxy[:port] http_parent[:port]"
++
++msgid ""
++"The actions file(s) to use. Multiple actionsfile lines are permitted, and "
++"are in fact recommended!"
++msgstr ""
++"所使用的规则文件。å…许并且推è使用多个规则文件。"
++
++msgid ""
++"The address and TCP port on which Privoxy will listen for client requests."
++msgstr ""
++"Privoxy接收客户端请求时监å¬çš„地å€å’ŒTCP端å£ã€‚"
++
++msgid ""
++"The compression level that is passed to the zlib library when compressing "
++"buffered content."
++msgstr ""
++"使用zlib压缩缓冲内容时的压缩级别。"
++
++msgid ""
++"The currently installed 'privoxy' package is not supported by LuCI "
++"application."
++msgstr ""
++"ç›®å‰å®‰è£…çš„privoxy版本ä¸è¢«luci支æŒã€‚"
++
++msgid ""
++"The directory where all logging takes place (i.e. where the logfile is "
++"located)."
++msgstr "所有日志所在的目录。"
++
++msgid "The directory where the other configuration files are located."
++msgstr "其他设置文件所在的目录。"
++
++msgid ""
++"The filter files contain content modification rules that use regular "
++"expressions."
++msgstr ""
++"过滤文件包å«äº†ä½¿ç”¨æ­£åˆ™è¡¨è¾¾å¼ç¼–写的内容修改规则"
++
++msgid "The hostname shown on the CGI pages."
++msgstr "CGI页é¢æ˜¾ç¤ºçš„主机å。"
++
++msgid "The log file to use. File name, relative to log directory."
++msgstr ""
++"日志文件å称,与日志路径相对。"
++
++msgid "The order in which client headers are sorted before forwarding them."
++msgstr ""
++"转å‘æ•°æ®å‰ï¼Œclient headers的排åºã€‚"
++
++msgid ""
++"The status code Privoxy returns for pages blocked with +handle-as-empty-"
++"document."
++msgstr ""
++"当页é¢å› ä¸ºhandle-as-empty-document规则被阻止时返回的状æ€ç ï¼ˆé€‰ä¸Šä¸º200 OK,ä¸é€‰ä¸Šä¸º403 Forbidden)"
++
++msgid ""
++"The trust mechanism is an experimental feature for building white-lists and "
++"should be used with care."
++msgstr ""
++"信任机制是一个实验性的白åå•ç‰¹æ€§ï¼Œä½¿ç”¨æ—¶åº”å°å¿ƒã€‚"
++
++msgid ""
++"The value of this option only matters if the experimental trust mechanism "
++"has been activated."
++msgstr ""
++"åªæœ‰å¼€å¯äº†ä¿¡ä»»æœºåˆ¶æ—¶è¿™ä¸ªé€‰é¡¹çš„值æ‰æœ‰æ•ˆ"
++
++msgid ""
++"This option is only there for debugging purposes. It will drastically reduce "
++"performance."
++msgstr ""
++"这个选项仅用于调试,开å¯åŽä¼šæžå¤§åœ°é™ä½Žæ€§èƒ½ã€‚"
++
++msgid ""
++"This option will be removed in future releases as it has been obsoleted by "
++"the more general header taggers."
++msgstr "这个选项在以åŽçš„版本中将被移除,因为它被header taggers所å–代了。"
++
++msgid ""
++"This tab controls the security-relevant aspects of Privoxy's configuration."
++msgstr ""
++"这个标签用于设置与安全相关的Privoxy选项。"
++
++msgid ""
++"Through which SOCKS proxy (and optionally to which parent HTTP proxy) "
++"specific requests should be routed."
++msgstr ""
++"指定的请求应该通过哪一个SOCKS代ç†ï¼ˆå¹¶ä¸”通过哪一个HTTP父代ç†ï¼Œå¯é€‰ï¼‰"
++
++msgid "To which parent HTTP proxy specific requests should be routed."
++msgstr ""
++"请求应转å‘至哪一个父级HTTP代ç†ã€‚"
++
++msgid "User customizations"
++msgstr "用户自定义"
++
++msgid "Value is not a number"
++msgstr "输入值ä¸æ˜¯æ•°å­—"
++
++msgid "Value not between 0 and 9"
++msgstr "输入值ä¸åœ¨0å’Œ9之间。"
++
++msgid "Value not between 1 and 4096"
++msgstr "输入值ä¸åœ¨1å’Œ4096之间"
++
++msgid "Value not greater 0 or empty"
++msgstr "输入值为空或者ä¸æ˜¯å¤§äºŽé›¶ã€‚"
++
++msgid "Value range 1 to 4096, no entry defaults to 4096"
++msgstr "输入值为1到4096,默认为4096"
++
++msgid "Version"
++msgstr "版本"
++
++msgid "Version Information"
++msgstr "版本信æ¯"
++
++msgid "Whether intercepted requests should be treated as valid."
++msgstr "被拦截的请求是å¦åº”被当作有效的。"
++
++msgid ""
++"Whether or not Privoxy recognizes special HTTP headers to change toggle "
++"state."
++msgstr ""
++"Privoxy是å¦è¯†åˆ«ç‰¹æ®Šçš„HTTP头以切æ¢çŠ¶æ€ã€‚"
++
++msgid "Whether or not buffered content is compressed before delivery."
++msgstr ""
++"缓冲内容在传递之å‰æ˜¯å¦åŽ‹ç¼©ã€‚"
++
++msgid ""
++"Whether or not outgoing connections that have been kept alive should be "
++"shared between different incoming connections."
++msgstr ""
++"æŒä¹…出站连接是å¦åº”在ä¸åŒçš„入站连接之间共享。"
++
++msgid "Whether or not pipelined requests should be served."
++msgstr "是å¦å¤„ç†ç®¡é“化的请求。"
++
++msgid "Whether or not proxy authentication through Privoxy should work."
++msgstr "是å¦å¯ä»¥é€šè¿‡Privoxy进行代ç†éªŒè¯ã€‚"
++
++msgid "Whether or not the web-based actions file editor may be used."
++msgstr "是å¦ä½¿ç”¨åŸºäºŽç½‘页的规则编辑器。"
++
++msgid "Whether or not the web-based toggle feature may be used."
++msgstr "是å¦å¯ç”¨åŸºäºŽç½‘页的切æ¢åŠŸèƒ½ã€‚"
++
++msgid "Whether requests to Privoxy's CGI pages can be blocked or redirected."
++msgstr "访问Privoxy CGI页é¢çš„请求是å¦å¯ä»¥è¢«æ‹¦æˆªæˆ–é‡å®šå‘。"
++
++
++msgid ""
++"Whether the CGI interface should stay compatible with broken HTTP clients."
++msgstr ""
++"CGIç•Œé¢æ˜¯å¦åº”兼容过时的HTTP客户端。"
++
++msgid "Whether to run only one server thread."
++msgstr "是å¦åªè¿è¡Œä¸€ä¸ªæœåŠ¡çº¿ç¨‹ã€‚"
++
++msgid "Who can access what."
++msgstr "è°å¯ä»¥è®¿é—®ä»€ä¹ˆã€‚"
++
++msgid "installed"
++msgstr "已安装"
++
++msgid "or higher"
++msgstr "或更高"
++
++msgid "required"
++msgstr "需è¦"
+diff --git a/feeds/luci/applications/luci-app-privoxy/root/etc/uci-defaults/luci-privoxy b/feeds/luci/applications/luci-app-privoxy/root/etc/uci-defaults/luci-privoxy
+new file mode 100755
+index 0000000..3405479
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-privoxy/root/etc/uci-defaults/luci-privoxy
+@@ -0,0 +1,12 @@
++#!/bin/sh
++
++# no longer needed for "Save and Apply" to restart privoxy
++# luci-app-privoxy calls /etc/init.d/privoxy reload
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@privoxy[-1]
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++
++exit 0
+diff --git a/feeds/luci/applications/luci-app-qos/Makefile b/feeds/luci/applications/luci-app-qos/Makefile
+new file mode 100644
+index 0000000..dd322a3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Quality of Service configuration module
++LUCI_DEPENDS:=+qos-scripts
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-qos/luasrc/controller/qos.lua b/feeds/luci/applications/luci-app-qos/luasrc/controller/qos.lua
+new file mode 100644
+index 0000000..250a039
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/luasrc/controller/qos.lua
+@@ -0,0 +1,15 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.qos", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/qos") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "network", "qos"}, cbi("qos/qos"), _("QoS"))
++ page.dependent = true
++end
+diff --git a/feeds/luci/applications/luci-app-qos/luasrc/model/cbi/qos/qos.lua b/feeds/luci/applications/luci-app-qos/luasrc/model/cbi/qos/qos.lua
+new file mode 100644
+index 0000000..a8ea57e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/luasrc/model/cbi/qos/qos.lua
+@@ -0,0 +1,71 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local wa = require "luci.tools.webadmin"
++local fs = require "nixio.fs"
++
++m = Map("qos", translate("Quality of Service"),
++ translate("With <abbr title=\"Quality of Service\">QoS</abbr> you " ..
++ "can prioritize network traffic selected by addresses, " ..
++ "ports or services."))
++
++s = m:section(TypedSection, "interface", translate("Interfaces"))
++s.addremove = true
++s.anonymous = false
++
++e = s:option(Flag, "enabled", translate("Enable"))
++e.rmempty = false
++
++c = s:option(ListValue, "classgroup", translate("Classification group"))
++c:value("Default", translate("default"))
++c.default = "Default"
++
++s:option(Flag, "overhead", translate("Calculate overhead"))
++
++s:option(Flag, "halfduplex", translate("Half-duplex"))
++
++dl = s:option(Value, "download", translate("Download speed (kbit/s)"))
++dl.datatype = "and(uinteger,min(1))"
++
++ul = s:option(Value, "upload", translate("Upload speed (kbit/s)"))
++ul.datatype = "and(uinteger,min(1))"
++
++s = m:section(TypedSection, "classify", translate("Classification Rules"))
++s.template = "cbi/tblsection"
++s.anonymous = true
++s.addremove = true
++s.sortable = true
++
++t = s:option(ListValue, "target", translate("Target"))
++t:value("Priority", translate("priority"))
++t:value("Express", translate("express"))
++t:value("Normal", translate("normal"))
++t:value("Bulk", translate("low"))
++t.default = "Normal"
++
++srch = s:option(Value, "srchost", translate("Source host"))
++srch.rmempty = true
++srch:value("", translate("all"))
++wa.cbi_add_knownips(srch)
++
++dsth = s:option(Value, "dsthost", translate("Destination host"))
++dsth.rmempty = true
++dsth:value("", translate("all"))
++wa.cbi_add_knownips(dsth)
++
++p = s:option(Value, "proto", translate("Protocol"))
++p:value("", translate("all"))
++p:value("tcp", "TCP")
++p:value("udp", "UDP")
++p:value("icmp", "ICMP")
++p.rmempty = true
++
++ports = s:option(Value, "ports", translate("Ports"))
++ports.rmempty = true
++ports:value("", translate("all"))
++
++bytes = s:option(Value, "connbytes", translate("Number of bytes"))
++
++comment = s:option(Value, "comment", translate("Comment"))
++
++return m
+diff --git a/feeds/luci/applications/luci-app-qos/po/ca/qos.po b/feeds/luci/applications/luci-app-qos/po/ca/qos.po
+new file mode 100644
+index 0000000..e1430f1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/ca/qos.po
+@@ -0,0 +1,122 @@
++# qos.pot
++# generated from ./applications/luci-qos/luasrc/i18n/qos.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2014-07-17 23:39+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++#, fuzzy
++msgid "Calculate overhead"
++msgstr "Calcula càrrega (overhead)"
++
++msgid "Classification Rules"
++msgstr "Regles de classificació"
++
++msgid "Classification group"
++msgstr "Grup de classificació"
++
++msgid "Comment"
++msgstr "Comentari"
++
++msgid "Destination host"
++msgstr "Host de destí"
++
++msgid "Download speed (kbit/s)"
++msgstr "Velocitat de baixada (kbit/s)"
++
++msgid "Enable"
++msgstr "Habilita"
++
++#, fuzzy
++msgid "Half-duplex"
++msgstr "Half-duplex"
++
++msgid "Interfaces"
++msgstr "Interfícies"
++
++msgid "Number of bytes"
++msgstr "Nombre de bytes"
++
++msgid "Ports"
++msgstr "Ports"
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "Qualitat de Servei"
++
++msgid "Source host"
++msgstr "Host d'origen"
++
++msgid "Target"
++msgstr "Host de destí"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Velocitat de pujada (kbit/s)"
++
++#, fuzzy
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Amb QoS pots prioritzar el tràfic de xarxa seleccionat per adreces, ports o "
++"serveis."
++
++msgid "all"
++msgstr "tots"
++
++msgid "default"
++msgstr "per defecte"
++
++msgid "express"
++msgstr "exprés"
++
++msgid "low"
++msgstr "baix"
++
++msgid "normal"
++msgstr "normal"
++
++msgid "priority"
++msgstr "prioritat"
++
++#~ msgid "Service"
++#~ msgstr "Servei"
++
++#~ msgid "Downlink"
++#~ msgstr "Enllaç de baixada"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Connexió a Internet"
++
++#~ msgid "Uplink"
++#~ msgstr "Enllaç de pujada"
++
++#~ msgid "Prioritization"
++#~ msgstr "Priorització"
++
++#~ msgid "source network / source host"
++#~ msgstr "xarxa d'origen / màquina d'origen"
++
++#~ msgid "target network / target host"
++#~ msgstr "xarxa de destí / màquina de destí"
++
++#~ msgid "portrange"
++#~ msgstr "rang de ports"
++
++#~ msgid "Bytes sent"
++#~ msgstr "Bytes enviats"
+diff --git a/feeds/luci/applications/luci-app-qos/po/cs/qos.po b/feeds/luci/applications/luci-app-qos/po/cs/qos.po
+new file mode 100644
+index 0000000..884310f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/cs/qos.po
+@@ -0,0 +1,114 @@
++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2014-06-20 23:36+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr ""
++"Snažit se zabránit zahlcení linky snížením jejího maximálního povoleného "
++"zatížení síťovým provozem"
++
++msgid "Classification Rules"
++msgstr "KlasifikaÄní pravidla"
++
++msgid "Classification group"
++msgstr "KlasifikaÄní skupina"
++
++msgid "Comment"
++msgstr "Komentář"
++
++msgid "Destination host"
++msgstr "Cílová adresa"
++
++msgid "Download speed (kbit/s)"
++msgstr "Rychlost stahování dat (kbit/s)"
++
++msgid "Enable"
++msgstr "Povolit"
++
++msgid "Half-duplex"
++msgstr "PoloviÄní duplex"
++
++msgid "Interfaces"
++msgstr "Síťová rozhraní"
++
++msgid "Number of bytes"
++msgstr "PoÄet bajtů"
++
++msgid "Ports"
++msgstr "Porty"
++
++msgid "Protocol"
++msgstr "Protokol"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "Quality of Service"
++
++msgid "Source host"
++msgstr "Zdrojová adresa"
++
++msgid "Target"
++msgstr "Cílová třída priority"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Rychlost odesílání dat (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Pomocí služby \"<abbr title=\"Quality of Service\">QoS</abbr>\" můžete "
++"nastavit prioritu síťového provozu na základÄ› specifikace adres, portů Äi "
++"služeb."
++
++msgid "all"
++msgstr "vše"
++
++msgid "default"
++msgstr "výchozí"
++
++msgid "express"
++msgstr "nejvyšší priorita (velké rámce)"
++
++msgid "low"
++msgstr "nízká priorita"
++
++msgid "normal"
++msgstr "normální priorita"
++
++msgid "priority"
++msgstr "nejvyšší priorita (malé rámce)"
++
++#~ msgid "Service"
++#~ msgstr "Služba"
++
++#~ msgid "Downlink"
++#~ msgstr "Stahování"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Připojení k internetu"
++
++#~ msgid "Uplink"
++#~ msgstr "Odesílání"
++
++#, fuzzy
++#~ msgid "allf"
++#~ msgstr "allf"
++
++#~ msgid "qos_connbytes"
++#~ msgstr "qos_connbytes"
+diff --git a/feeds/luci/applications/luci-app-qos/po/de/qos.po b/feeds/luci/applications/luci-app-qos/po/de/qos.po
+new file mode 100644
+index 0000000..46060de
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/de/qos.po
+@@ -0,0 +1,122 @@
++# qos.po
++# generated from ./applications/luci-qos/luasrc/i18n/qos.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2013-01-28 22:18+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr "Overheadberechnung"
++
++msgid "Classification Rules"
++msgstr "Klassifizierungsregeln"
++
++msgid "Classification group"
++msgstr "Klassifizierungsgruppe"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr "Zieladresse"
++
++msgid "Download speed (kbit/s)"
++msgstr "Downloadgeschwindigkeit (kbit/s)"
++
++msgid "Enable"
++msgstr "Aktivieren"
++
++msgid "Half-duplex"
++msgstr "Halb-Duplex"
++
++msgid "Interfaces"
++msgstr "Schnittstellen"
++
++msgid "Number of bytes"
++msgstr "Byteanzahl"
++
++msgid "Ports"
++msgstr "Ports"
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "Quality of Service"
++
++msgid "Source host"
++msgstr "Quelladresse"
++
++msgid "Target"
++msgstr "Zieladresse"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Uploadgeschwindigkeit (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Mit Hilfe von <abbr title=\"Quality of Service\">QoS</abbr> kann "
++"Netzwerkverkehr anhand von Adressen, Ports oder Diensten priorisiert werden."
++
++msgid "all"
++msgstr "alle"
++
++msgid "default"
++msgstr "Standardeinstellung"
++
++msgid "express"
++msgstr "express"
++
++msgid "low"
++msgstr "niedrig"
++
++msgid "normal"
++msgstr "normal"
++
++msgid "priority"
++msgstr "Priorität"
++
++#~ msgid "Service"
++#~ msgstr "Dienst"
++
++#~ msgid "Downlink"
++#~ msgstr "Downlink"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Internetverbindung"
++
++#~ msgid "Uplink"
++#~ msgstr "Uplink"
++
++#~ msgid "allf"
++#~ msgstr "alle f"
++
++#~ msgid "qos_connbytes"
++#~ msgstr "Bytes gesendet"
++
++#~ msgid "Prioritization"
++#~ msgstr "Priorisierung"
++
++#~ msgid "source network / source host"
++#~ msgstr "Quellnetz / Quellhost"
++
++#~ msgid "target network / target host"
++#~ msgstr "Zielnetz / Zielhost"
++
++#~ msgid "portrange"
++#~ msgstr "Portbereich"
+diff --git a/feeds/luci/applications/luci-app-qos/po/el/qos.po b/feeds/luci/applications/luci-app-qos/po/el/qos.po
+new file mode 100644
+index 0000000..9c8a985
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/el/qos.po
+@@ -0,0 +1,124 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2012-03-18 15:29+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#, fuzzy
++msgid "Calculate overhead"
++msgstr "Υπολογισμός Overhead"
++
++#, fuzzy
++msgid "Classification Rules"
++msgstr "ΚατηγοÏιοποίηση"
++
++#, fuzzy
++msgid "Classification group"
++msgstr "ΚατηγοÏιοποίηση"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr ""
++
++msgid "Download speed (kbit/s)"
++msgstr ""
++
++msgid "Enable"
++msgstr "ΕνεÏγοποίηση"
++
++#, fuzzy
++msgid "Half-duplex"
++msgstr "Μη-ταυτόχÏονη αμφίδÏομη επικοινωνία"
++
++msgid "Interfaces"
++msgstr "Διεπαφές"
++
++msgid "Number of bytes"
++msgstr ""
++
++#, fuzzy
++msgid "Ports"
++msgstr "ΠÏοτεÏαιότητα"
++
++msgid "Protocol"
++msgstr "ΠÏωτόκολλο"
++
++msgid "QoS"
++msgstr ""
++
++msgid "Quality of Service"
++msgstr "Ποιότητα ΥπηÏεσίας"
++
++#, fuzzy
++msgid "Source host"
++msgstr "ΔιεÏθυνση πηγής"
++
++#, fuzzy
++msgid "Target"
++msgstr "ΔιεÏθυνση στόχου"
++
++msgid "Upload speed (kbit/s)"
++msgstr ""
++
++#, fuzzy
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Με το QoS μποÏείτε να οÏίσετε Ï€ÏοτεÏαιότητες στην κίνηση του δικτÏου με βάση "
++"διευθÏνσεις, θÏÏες ή υπηÏεσίες."
++
++msgid "all"
++msgstr ""
++
++msgid "default"
++msgstr "Ï€Ïοεπιλογή"
++
++msgid "express"
++msgstr "εξπÏές"
++
++msgid "low"
++msgstr "χαμηλή"
++
++msgid "normal"
++msgstr "κανονική"
++
++msgid "priority"
++msgstr "Ï€ÏοτεÏαιότητα"
++
++#~ msgid "Service"
++#~ msgstr "ΥπηÏεσία"
++
++#, fuzzy
++#~ msgid "Downlink"
++#~ msgstr "ΤαχÏτητα κατεβάσματος"
++
++#, fuzzy
++#~ msgid "Uplink"
++#~ msgstr "ΤαχÏτητα ανεβάσματος"
++
++#~ msgid "Prioritization"
++#~ msgstr "ΠÏοτεÏαιότητες"
++
++#~ msgid "source network / source host"
++#~ msgstr "πηγαίο δίκτυο / πηγαίος υπολογιστής"
++
++#~ msgid "target network / target host"
++#~ msgstr "δίκτυο στόχος / υπολογιστής στόχος"
++
++#~ msgid "portrange"
++#~ msgstr "εÏÏος θυÏών"
++
++#~ msgid "Bytes sent"
++#~ msgstr "Απεσταλμένα byte"
+diff --git a/feeds/luci/applications/luci-app-qos/po/en/qos.po b/feeds/luci/applications/luci-app-qos/po/en/qos.po
+new file mode 100644
+index 0000000..b20180f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/en/qos.po
+@@ -0,0 +1,91 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2010-03-25 22:10+0100\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Calculate overhead"
++msgstr "Calculate overhead"
++
++msgid "Classification Rules"
++msgstr "Classification Rules"
++
++msgid "Classification group"
++msgstr "Classification group"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr "Destination host"
++
++msgid "Download speed (kbit/s)"
++msgstr "Download speed (kbit/s)"
++
++msgid "Enable"
++msgstr "Enable"
++
++msgid "Half-duplex"
++msgstr "Half-duplex"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Number of bytes"
++msgstr "Number of bytes"
++
++msgid "Ports"
++msgstr "Ports"
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "QoS"
++msgstr ""
++
++msgid "Quality of Service"
++msgstr "Quality of Service"
++
++msgid "Source host"
++msgstr "Source host"
++
++msgid "Target"
++msgstr "Target"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Upload speed (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++
++msgid "all"
++msgstr "all"
++
++msgid "default"
++msgstr "default"
++
++msgid "express"
++msgstr "express"
++
++msgid "low"
++msgstr "low"
++
++msgid "normal"
++msgstr "normal"
++
++msgid "priority"
++msgstr "priority"
++
++#~ msgid "Service"
++#~ msgstr "Service"
+diff --git a/feeds/luci/applications/luci-app-qos/po/es/qos.po b/feeds/luci/applications/luci-app-qos/po/es/qos.po
+new file mode 100644
+index 0000000..83ace8d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/es/qos.po
+@@ -0,0 +1,123 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2014-06-15 09:13+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr "Calcular sobrecarga"
++
++msgid "Classification Rules"
++msgstr "Reglas de clasificación"
++
++msgid "Classification group"
++msgstr "Grupo de clasificación"
++
++msgid "Comment"
++msgstr "Comentario"
++
++msgid "Destination host"
++msgstr "Máquina de destino"
++
++msgid "Download speed (kbit/s)"
++msgstr "Velocidad de descarga (Kbit/s)"
++
++msgid "Enable"
++msgstr "Activar"
++
++msgid "Half-duplex"
++msgstr "Semi dúplex"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Number of bytes"
++msgstr "Número de bytes"
++
++msgid "Ports"
++msgstr "Puertos"
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "Calidad de Servicio"
++
++msgid "Source host"
++msgstr "Máquina origen"
++
++msgid "Target"
++msgstr "Objetivo"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Velocidad de subida (Kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Con QoS puede priorizar el tráfico de la red seleccionando por direcciones, "
++"puertos o servicios."
++
++msgid "all"
++msgstr "todos"
++
++msgid "default"
++msgstr "por defecto"
++
++msgid "express"
++msgstr "exprés"
++
++msgid "low"
++msgstr "bajo"
++
++msgid "normal"
++msgstr "normal"
++
++msgid "priority"
++msgstr "prioritario"
++
++#~ msgid "Service"
++#~ msgstr "Servicio"
++
++#~ msgid "Downlink"
++#~ msgstr "Enlace de bajada"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Conexión a Internet"
++
++#~ msgid "Uplink"
++#~ msgstr "Enlace de subida"
++
++#~ msgid "allf"
++#~ msgstr "-- ¿allf? --"
++
++#~ msgid "qos_connbytes"
++#~ msgstr "-- ¿qos_connbytes? --"
++
++#~ msgid "Prioritization"
++#~ msgstr "Priorización"
++
++#~ msgid "source network / source host"
++#~ msgstr "red de origen / host de origen"
++
++#~ msgid "target network / target host"
++#~ msgstr "red de destino / host de destino"
++
++#~ msgid "portrange"
++#~ msgstr "rango de puerto"
++
++#~ msgid "Bytes sent"
++#~ msgstr "Bytes enviados"
+diff --git a/feeds/luci/applications/luci-app-qos/po/fr/qos.po b/feeds/luci/applications/luci-app-qos/po/fr/qos.po
+new file mode 100644
+index 0000000..38e9ce8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/fr/qos.po
+@@ -0,0 +1,97 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2012-11-06 16:08+0200\n"
++"Last-Translator: hogsim <hogsim@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr "Calculer la surcharge"
++
++msgid "Classification Rules"
++msgstr "Règles de classification"
++
++msgid "Classification group"
++msgstr "Groupe de classification"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr "Hôte destinataire"
++
++msgid "Download speed (kbit/s)"
++msgstr "Vitesse de téléchargement (kbit/s)"
++
++msgid "Enable"
++msgstr "Activer"
++
++msgid "Half-duplex"
++msgstr "Demi-duplex"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Number of bytes"
++msgstr "Nombre d'octets"
++
++msgid "Ports"
++msgstr "Ports"
++
++msgid "Protocol"
++msgstr "Protocole"
++
++msgid "QoS"
++msgstr ""
++
++msgid "Quality of Service"
++msgstr "Qualité de service"
++
++msgid "Source host"
++msgstr "Hôte source"
++
++msgid "Target"
++msgstr "Cible"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Vitesse de téléversement (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Avec la <abbr title=\"Quality of Service\">QoS</abbr>, vous pouvez donner "
++"des priorités au trafic réseau en fonction des adresses, des ports ou des "
++"services concernés."
++
++msgid "all"
++msgstr "tous"
++
++msgid "default"
++msgstr "par défaut"
++
++msgid "express"
++msgstr "express"
++
++msgid "low"
++msgstr "lent"
++
++msgid "normal"
++msgstr "normal"
++
++msgid "priority"
++msgstr "prioritaire"
++
++#~ msgid "Service"
++#~ msgstr "Service"
++
++#~ msgid "qos_connbytes"
++#~ msgstr "qos_connbytes"
+diff --git a/feeds/luci/applications/luci-app-qos/po/he/qos.po b/feeds/luci/applications/luci-app-qos/po/he/qos.po
+new file mode 100644
+index 0000000..e2d42ef
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/he/qos.po
+@@ -0,0 +1,88 @@
++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2010-03-25 22:10+0100\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Calculate overhead"
++msgstr ""
++
++msgid "Classification Rules"
++msgstr ""
++
++msgid "Classification group"
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr ""
++
++msgid "Download speed (kbit/s)"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Half-duplex"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Number of bytes"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "QoS"
++msgstr ""
++
++msgid "Quality of Service"
++msgstr ""
++
++msgid "Source host"
++msgstr ""
++
++msgid "Target"
++msgstr ""
++
++msgid "Upload speed (kbit/s)"
++msgstr ""
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++
++msgid "all"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "express"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "normal"
++msgstr ""
++
++msgid "priority"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-qos/po/hu/qos.po b/feeds/luci/applications/luci-app-qos/po/hu/qos.po
+new file mode 100644
+index 0000000..c77ac3c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/hu/qos.po
+@@ -0,0 +1,111 @@
++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2012-12-30 19:18+0200\n"
++"Last-Translator: romboyco <romboyco@gmail.com>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr "Többletforgalom számítása"
++
++msgid "Classification Rules"
++msgstr "Besorolási szabályok"
++
++msgid "Classification group"
++msgstr "Besorolási csoport"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr "Cél gép"
++
++msgid "Download speed (kbit/s)"
++msgstr "Letöltési sebesség (kbit/s)"
++
++msgid "Enable"
++msgstr "Engedélyezés"
++
++msgid "Half-duplex"
++msgstr "Fél-duplex"
++
++msgid "Interfaces"
++msgstr "Interfészek"
++
++msgid "Number of bytes"
++msgstr "Bájtok száma"
++
++msgid "Ports"
++msgstr "Portok"
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "Quality of Service"
++
++msgid "Source host"
++msgstr "Forrás gép"
++
++msgid "Target"
++msgstr "Cél"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Feltöltési sebesség (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"A <abbr title=\"Quality of Service\">QoS</abbr> segítségével beállítható "
++"cím, portok vagy szolgáltatások alapján kiválasztott hálózati forgalom "
++"prioritása."
++
++msgid "all"
++msgstr "összes"
++
++msgid "default"
++msgstr "alapértelmezett"
++
++msgid "express"
++msgstr "sürgős"
++
++msgid "low"
++msgstr "alacsony"
++
++msgid "normal"
++msgstr "normál"
++
++msgid "priority"
++msgstr "prioritás"
++
++#~ msgid "Service"
++#~ msgstr "Szolgáltatás"
++
++#~ msgid "Downlink"
++#~ msgstr "Downlink"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Internet kapcsolat"
++
++#~ msgid "Uplink"
++#~ msgstr "Uplink"
++
++#~ msgid "allf"
++#~ msgstr "allf"
++
++#~ msgid "qos_connbytes"
++#~ msgstr "qos_connbytes"
+diff --git a/feeds/luci/applications/luci-app-qos/po/it/qos.po b/feeds/luci/applications/luci-app-qos/po/it/qos.po
+new file mode 100644
+index 0000000..686c745
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/it/qos.po
+@@ -0,0 +1,108 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2014-07-19 16:26+0200\n"
++"Last-Translator: clagir <cgirlanda@girtech.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr "Calcola l'overhead"
++
++msgid "Classification Rules"
++msgstr "Regole di classificazione"
++
++msgid "Classification group"
++msgstr "Gruppo di Priorità"
++
++msgid "Comment"
++msgstr "Commento"
++
++msgid "Destination host"
++msgstr "Host di destinazione"
++
++msgid "Download speed (kbit/s)"
++msgstr "Velocità di download (kbit/s)"
++
++msgid "Enable"
++msgstr "Abilita"
++
++msgid "Half-duplex"
++msgstr "Half-duplex"
++
++msgid "Interfaces"
++msgstr "Interfacce"
++
++msgid "Number of bytes"
++msgstr "Numeri di bytes"
++
++msgid "Ports"
++msgstr "Porte"
++
++msgid "Protocol"
++msgstr "Protocollo"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "Qualità del Servizio"
++
++msgid "Source host"
++msgstr "Host sorgente"
++
++msgid "Target"
++msgstr "Target"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Velocità di upload (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Con <abbr title=\"Qualità del Servizio\">QoS</abbr> puoi dare priorità al "
++"traffico di rete in base ad un ip, una porta o dei servizi."
++
++msgid "all"
++msgstr "tutti"
++
++msgid "default"
++msgstr "default"
++
++msgid "express"
++msgstr "express"
++
++msgid "low"
++msgstr "basso"
++
++msgid "normal"
++msgstr "normale"
++
++msgid "priority"
++msgstr "priorità"
++
++#~ msgid "Service"
++#~ msgstr "Servizi"
++
++#~ msgid "Downlink"
++#~ msgstr "Collegamento discendente"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Connessione Internet"
++
++#~ msgid "Uplink"
++#~ msgstr "Collegamento ascendente"
++
++#~ msgid "allf"
++#~ msgstr "allf"
++
++#~ msgid "qos_connbytes"
++#~ msgstr "qos_connbytes"
+diff --git a/feeds/luci/applications/luci-app-qos/po/ja/qos.po b/feeds/luci/applications/luci-app-qos/po/ja/qos.po
+new file mode 100644
+index 0000000..deeb23f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/ja/qos.po
+@@ -0,0 +1,93 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2011-10-28 11:02+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.4\n"
++
++msgid "Calculate overhead"
++msgstr "オーãƒãƒ¼ãƒ˜ãƒƒãƒ‰ã‚’考慮ã™ã‚‹"
++
++msgid "Classification Rules"
++msgstr "区分ルール"
++
++msgid "Classification group"
++msgstr "区分グループ"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr "宛先ホスト"
++
++msgid "Download speed (kbit/s)"
++msgstr "ダウンロード速度 (kbit/s)"
++
++msgid "Enable"
++msgstr "有効"
++
++msgid "Half-duplex"
++msgstr "åŠäºŒé‡"
++
++msgid "Interfaces"
++msgstr "インターフェース"
++
++msgid "Number of bytes"
++msgstr "ãƒã‚¤ãƒˆæ•°"
++
++msgid "Ports"
++msgstr "ãƒãƒ¼ãƒˆ"
++
++msgid "Protocol"
++msgstr "プロトコル"
++
++msgid "QoS"
++msgstr ""
++
++msgid "Quality of Service"
++msgstr "Quality of Service"
++
++msgid "Source host"
++msgstr "é€ä¿¡å…ƒãƒ›ã‚¹ãƒˆ"
++
++msgid "Target"
++msgstr "対象"
++
++msgid "Upload speed (kbit/s)"
++msgstr "アップロード速度 (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"<abbr title=\"Quality of Service\">QoS</abbr>ã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã€ãƒãƒ¼ãƒˆã€ã‚µãƒ¼ãƒ“スã§åŒº"
++"別ã—ã¦ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã«å„ªå…ˆåº¦ã‚’付与ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚"
++
++msgid "all"
++msgstr "å…¨ã¦"
++
++msgid "default"
++msgstr "標準"
++
++msgid "express"
++msgstr "高速"
++
++msgid "low"
++msgstr "低速"
++
++msgid "normal"
++msgstr "標準"
++
++msgid "priority"
++msgstr "最優先"
++
++#~ msgid "Service"
++#~ msgstr "サービス"
+diff --git a/feeds/luci/applications/luci-app-qos/po/ms/qos.po b/feeds/luci/applications/luci-app-qos/po/ms/qos.po
+new file mode 100644
+index 0000000..f8d4ab3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/ms/qos.po
+@@ -0,0 +1,87 @@
++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2010-03-25 22:10+0100\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Calculate overhead"
++msgstr ""
++
++msgid "Classification Rules"
++msgstr ""
++
++msgid "Classification group"
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr ""
++
++msgid "Download speed (kbit/s)"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Half-duplex"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Number of bytes"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "QoS"
++msgstr ""
++
++msgid "Quality of Service"
++msgstr ""
++
++msgid "Source host"
++msgstr ""
++
++msgid "Target"
++msgstr ""
++
++msgid "Upload speed (kbit/s)"
++msgstr ""
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++
++msgid "all"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "express"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "normal"
++msgstr ""
++
++msgid "priority"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-qos/po/no/qos.po b/feeds/luci/applications/luci-app-qos/po/no/qos.po
+new file mode 100644
+index 0000000..6b390a1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/no/qos.po
+@@ -0,0 +1,106 @@
++msgid ""
++msgstr ""
++"PO-Revision-Date: 2013-03-21 23:04+0200\n"
++"Last-Translator: protx <lars.hardy@gmail.com>\n"
++"Language: no\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr "Beregn overhead"
++
++msgid "Classification Rules"
++msgstr "Klassifisering Regler"
++
++msgid "Classification group"
++msgstr "Klassifisering gruppe"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr "Destinasjon vert"
++
++msgid "Download speed (kbit/s)"
++msgstr "Nedlasting hastighet (kbit/s)"
++
++msgid "Enable"
++msgstr "Aktiver"
++
++msgid "Half-duplex"
++msgstr "Halv dupleks"
++
++msgid "Interfaces"
++msgstr "Grensesnitt"
++
++msgid "Number of bytes"
++msgstr "Antall bytes"
++
++msgid "Ports"
++msgstr "Porter"
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "Quality of Service"
++
++msgid "Source host"
++msgstr "Kilde vert"
++
++msgid "Target"
++msgstr "MÃ¥l"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Opplasting hastighet (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Med <abbr title=\"Quality of Service\">QoS</abbr> kan du prioritere "
++"nettverkstrafikk valgt av adresser, porter eller tjenester."
++
++msgid "all"
++msgstr "alle"
++
++msgid "default"
++msgstr "standard"
++
++msgid "express"
++msgstr "ekspress"
++
++msgid "low"
++msgstr "lav"
++
++msgid "normal"
++msgstr "normal"
++
++msgid "priority"
++msgstr "prioritet"
++
++#~ msgid "Service"
++#~ msgstr "Service"
++
++#~ msgid "Downlink"
++#~ msgstr "Nedlinje"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Internett Tilkobling"
++
++#~ msgid "Uplink"
++#~ msgstr "Opplinje"
++
++#~ msgid "allf"
++#~ msgstr "alle"
++
++#~ msgid "qos_connbytes"
++#~ msgstr "Bytes sendt"
++
++#~ msgid "Half-Duplex"
++#~ msgstr "Halvdupleks"
+diff --git a/feeds/luci/applications/luci-app-qos/po/pl/qos.po b/feeds/luci/applications/luci-app-qos/po/pl/qos.po
+new file mode 100644
+index 0000000..3c6a28c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/pl/qos.po
+@@ -0,0 +1,111 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2012-08-31 18:14+0200\n"
++"Last-Translator: obsy <cezary@eko.one.pl>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr "Oblicz narzut"
++
++msgid "Classification Rules"
++msgstr "Reguły klasyfikacji"
++
++msgid "Classification group"
++msgstr "Grupa klasyfikacji"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr "Host docelowy"
++
++msgid "Download speed (kbit/s)"
++msgstr "Prędkość pobierania (kbit/s)"
++
++msgid "Enable"
++msgstr "WÅ‚Ä…cz"
++
++msgid "Half-duplex"
++msgstr "Półdupleks"
++
++msgid "Interfaces"
++msgstr "Interfejsy"
++
++msgid "Number of bytes"
++msgstr "Ilość bajtów"
++
++msgid "Ports"
++msgstr "Porty"
++
++msgid "Protocol"
++msgstr "Protokół"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "Jakość usługi (ang. Quality of Service)"
++
++msgid "Source host"
++msgstr "Host źródłowy"
++
++msgid "Target"
++msgstr "Cel"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Prędkość wysyłania (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Z <abbr title=\"Quality of Service\">QoS</abbr> można ustalać priorytet "
++"ruchu sieciowego na podstawie adresów, portów lub usług."
++
++msgid "all"
++msgstr "wszystko"
++
++msgid "default"
++msgstr "domyślna"
++
++msgid "express"
++msgstr "ekspresowy"
++
++msgid "low"
++msgstr "niski"
++
++msgid "normal"
++msgstr "normalny"
++
++msgid "priority"
++msgstr "priorytetowy"
++
++#~ msgid "Service"
++#~ msgstr "Usługa"
++
++#~ msgid "Downlink"
++#~ msgstr "Ruch przychodzÄ…cy"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Połączenie Internetowe"
++
++#~ msgid "Uplink"
++#~ msgstr "Ruch wychodzÄ…cy"
++
++# Jeśli w ogóle jest to gdzieś używane, to i w angielskiej wersji jest błąd. W takiej sytuacji należy udawać idiotę.
++#~ msgid "allf"
++#~ msgstr "allf"
++
++# Patrz - allf.
++#~ msgid "qos_connbytes"
++#~ msgstr "qos_connbytes"
+diff --git a/feeds/luci/applications/luci-app-qos/po/pt-br/qos.po b/feeds/luci/applications/luci-app-qos/po/pt-br/qos.po
+new file mode 100644
+index 0000000..43cd6e2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/pt-br/qos.po
+@@ -0,0 +1,127 @@
++# qos.po
++# generated from ./applications/luci-qos/luasrc/i18n/qos.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2014-06-21 19:00+0200\n"
++"Last-Translator: Éder <eder.grigorio@openmailbox.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr "Calcular overhead"
++
++msgid "Classification Rules"
++msgstr "Classificação"
++
++msgid "Classification group"
++msgstr "Classificação"
++
++# 20140621: edersg: tradução
++msgid "Comment"
++msgstr "Comentário"
++
++msgid "Destination host"
++msgstr "Endereço de destino"
++
++msgid "Download speed (kbit/s)"
++msgstr "Velocidade de recebimento (kbit/s)"
++
++msgid "Enable"
++msgstr "Habilitado"
++
++msgid "Half-duplex"
++msgstr "Half-duplex"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Number of bytes"
++msgstr "Número de bytes"
++
++msgid "Ports"
++msgstr "Portas"
++
++msgid "Protocol"
++msgstr "Prococolo"
++
++msgid "QoS"
++msgstr "<abbr title=\"Quality of Service, Qualidade de serviço\">QoS</abbr>"
++
++msgid "Quality of Service"
++msgstr "Qualidade de Serviço"
++
++msgid "Source host"
++msgstr "Endereço de origem"
++
++msgid "Target"
++msgstr "Alvo"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Velocidade de envio (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Com <abbr title=\"Quality of Service, Qualidade de serviço\">QoS</abbr>, "
++"você pode priorizar o tráfego da rede selecionada por endereços, portas ou "
++"serviços."
++
++msgid "all"
++msgstr "todos"
++
++msgid "default"
++msgstr "padrão"
++
++msgid "express"
++msgstr "expressa"
++
++msgid "low"
++msgstr "baixa"
++
++msgid "normal"
++msgstr "normal"
++
++msgid "priority"
++msgstr "prioritário"
++
++#~ msgid "Service"
++#~ msgstr "Serviço"
++
++#~ msgid "Downlink"
++#~ msgstr "Link para download"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Conexão com a Internet"
++
++#~ msgid "Uplink"
++#~ msgstr "Link para upload"
++
++#~ msgid "allf"
++#~ msgstr "allf"
++
++#~ msgid "qos_connbytes"
++#~ msgstr "qos_connbytes"
++
++#~ msgid "Prioritization"
++#~ msgstr "Priorização"
++
++#~ msgid "source network / source host"
++#~ msgstr "rede de origem / host de origem"
++
++#~ msgid "target network / target host"
++#~ msgstr "rede de destino / host de destino"
++
++#~ msgid "portrange"
++#~ msgstr "faixa de portas"
++
++#~ msgid "Bytes sent"
++#~ msgstr "Bytes enviados"
+diff --git a/feeds/luci/applications/luci-app-qos/po/pt/qos.po b/feeds/luci/applications/luci-app-qos/po/pt/qos.po
+new file mode 100644
+index 0000000..449ddce
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/pt/qos.po
+@@ -0,0 +1,122 @@
++# qos.po
++# generated from ./applications/luci-qos/luasrc/i18n/qos.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2013-05-31 23:49+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr "Calcular Overhead"
++
++msgid "Classification Rules"
++msgstr "Regras de Classificação"
++
++msgid "Classification group"
++msgstr "Grupo de Classificação"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr "Host de destino"
++
++msgid "Download speed (kbit/s)"
++msgstr "Velocidade de Download (kbit/s)"
++
++msgid "Enable"
++msgstr "Ativar"
++
++msgid "Half-duplex"
++msgstr "Half-duplex"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Number of bytes"
++msgstr "Número de bytes"
++
++msgid "Ports"
++msgstr "Portas"
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "Qualidade de Serviço"
++
++msgid "Source host"
++msgstr "Host de origem"
++
++msgid "Target"
++msgstr "Host de destino"
++
++msgid "Upload speed (kbit/s)"
++msgstr "Velocidade de Upload (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Com o <abbr title=\"Qualidade de Serviço\">QoS</abbr> pode dar prioridade ao "
++"tráfego na rede por endereço, portas ou serviço."
++
++msgid "all"
++msgstr "todos"
++
++msgid "default"
++msgstr "Por defeito"
++
++msgid "express"
++msgstr "expressa"
++
++msgid "low"
++msgstr "baixa"
++
++msgid "normal"
++msgstr "normal"
++
++msgid "priority"
++msgstr "prioridade"
++
++#~ msgid "Service"
++#~ msgstr "Serviço"
++
++#~ msgid "Downlink"
++#~ msgstr "Link para download"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Ligação à Internet"
++
++#~ msgid "Uplink"
++#~ msgstr "Link para upload"
++
++#~ msgid "qos_connbytes"
++#~ msgstr "qos_connbytes"
++
++#~ msgid "Prioritization"
++#~ msgstr "Priorização"
++
++#~ msgid "source network / source host"
++#~ msgstr "rede de origem / host de origem"
++
++#~ msgid "target network / target host"
++#~ msgstr "rede de destino / host de destino"
++
++#~ msgid "portrange"
++#~ msgstr "faixa de portas"
++
++#~ msgid "Bytes sent"
++#~ msgstr "Bytes enviados"
+diff --git a/feeds/luci/applications/luci-app-qos/po/ro/qos.po b/feeds/luci/applications/luci-app-qos/po/ro/qos.po
+new file mode 100644
+index 0000000..9c88f7c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/ro/qos.po
+@@ -0,0 +1,97 @@
++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2013-09-25 19:25+0200\n"
++"Last-Translator: Mihai <WyRwSyK@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr ""
++
++msgid "Classification Rules"
++msgstr ""
++
++msgid "Classification group"
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr ""
++
++msgid "Download speed (kbit/s)"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Half-duplex"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interfete"
++
++msgid "Number of bytes"
++msgstr "Numarul de bytes"
++
++msgid "Ports"
++msgstr "Porturi"
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "Quality of Service"
++
++msgid "Source host"
++msgstr ""
++
++msgid "Target"
++msgstr ""
++
++msgid "Upload speed (kbit/s)"
++msgstr ""
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++
++msgid "all"
++msgstr "toate"
++
++msgid "default"
++msgstr ""
++
++msgid "express"
++msgstr "expres"
++
++msgid "low"
++msgstr "scazuta"
++
++msgid "normal"
++msgstr "normala"
++
++msgid "priority"
++msgstr "ridicata"
++
++#~ msgid "Service"
++#~ msgstr "Serviciu"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Conexiune internet"
+diff --git a/feeds/luci/applications/luci-app-qos/po/ru/qos.po b/feeds/luci/applications/luci-app-qos/po/ru/qos.po
+new file mode 100644
+index 0000000..811cbf1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/ru/qos.po
+@@ -0,0 +1,104 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: qos\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2012-08-15 12:02+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Calculate overhead"
++msgstr "ПодÑчитывать накладные раÑходы"
++
++msgid "Classification Rules"
++msgstr "Правила клаÑÑификации"
++
++msgid "Classification group"
++msgstr "КлаÑÑификациÑ"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr "ХоÑÑ‚ назначениÑ"
++
++msgid "Download speed (kbit/s)"
++msgstr "СкороÑÑ‚ÑŒ загрузки (кбит/Ñ)"
++
++msgid "Enable"
++msgstr "Включить"
++
++msgid "Half-duplex"
++msgstr "ПолудуплекÑ"
++
++msgid "Interfaces"
++msgstr "ИнтерфейÑÑ‹"
++
++msgid "Number of bytes"
++msgstr "КоличеÑтво байт"
++
++msgid "Ports"
++msgstr "Порты"
++
++msgid "Protocol"
++msgstr "Протокол"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "КачеÑтво обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ (QoS)"
++
++msgid "Source host"
++msgstr "ХоÑÑ‚ иÑточника"
++
++msgid "Target"
++msgstr "Цель"
++
++msgid "Upload speed (kbit/s)"
++msgstr "СкороÑÑ‚ÑŒ отдачи (кбит/Ñ)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ <abbr title=\"Quality of Service\">QoS</abbr>, вы можете "
++"приоритезаровать Ñетевой трафик по адреÑам, портам и ÑервиÑам."
++
++msgid "all"
++msgstr "вÑе"
++
++msgid "default"
++msgstr "по умолчанию"
++
++msgid "express"
++msgstr "ÑкÑпреÑÑ"
++
++msgid "low"
++msgstr "низкий"
++
++msgid "normal"
++msgstr "обычный"
++
++msgid "priority"
++msgstr "приоритетный"
++
++#~ msgid "Service"
++#~ msgstr "Служба"
++
++#~ msgid "Downlink"
++#~ msgstr "ÐиÑходÑщий канал"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Интернет-Ñоединение"
++
++#~ msgid "Uplink"
++#~ msgstr "ВоÑходÑщий канал"
+diff --git a/feeds/luci/applications/luci-app-qos/po/sk/qos.po b/feeds/luci/applications/luci-app-qos/po/sk/qos.po
+new file mode 100644
+index 0000000..b4d10ab
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/sk/qos.po
+@@ -0,0 +1,83 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Calculate overhead"
++msgstr ""
++
++msgid "Classification Rules"
++msgstr ""
++
++msgid "Classification group"
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr ""
++
++msgid "Download speed (kbit/s)"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Half-duplex"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Number of bytes"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "QoS"
++msgstr ""
++
++msgid "Quality of Service"
++msgstr ""
++
++msgid "Source host"
++msgstr ""
++
++msgid "Target"
++msgstr ""
++
++msgid "Upload speed (kbit/s)"
++msgstr ""
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++
++msgid "all"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "express"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "normal"
++msgstr ""
++
++msgid "priority"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-qos/po/sv/qos.po b/feeds/luci/applications/luci-app-qos/po/sv/qos.po
+new file mode 100644
+index 0000000..1ba407e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/sv/qos.po
+@@ -0,0 +1,84 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Calculate overhead"
++msgstr ""
++
++msgid "Classification Rules"
++msgstr ""
++
++msgid "Classification group"
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr ""
++
++msgid "Download speed (kbit/s)"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Half-duplex"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Number of bytes"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "QoS"
++msgstr ""
++
++msgid "Quality of Service"
++msgstr ""
++
++msgid "Source host"
++msgstr ""
++
++msgid "Target"
++msgstr ""
++
++msgid "Upload speed (kbit/s)"
++msgstr ""
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++
++msgid "all"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "express"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "normal"
++msgstr ""
++
++msgid "priority"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-qos/po/templates/qos.pot b/feeds/luci/applications/luci-app-qos/po/templates/qos.pot
+new file mode 100644
+index 0000000..48333e4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/templates/qos.pot
+@@ -0,0 +1,76 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Calculate overhead"
++msgstr ""
++
++msgid "Classification Rules"
++msgstr ""
++
++msgid "Classification group"
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr ""
++
++msgid "Download speed (kbit/s)"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Half-duplex"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Number of bytes"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "QoS"
++msgstr ""
++
++msgid "Quality of Service"
++msgstr ""
++
++msgid "Source host"
++msgstr ""
++
++msgid "Target"
++msgstr ""
++
++msgid "Upload speed (kbit/s)"
++msgstr ""
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++
++msgid "all"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "express"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "normal"
++msgstr ""
++
++msgid "priority"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-qos/po/tr/qos.po b/feeds/luci/applications/luci-app-qos/po/tr/qos.po
+new file mode 100644
+index 0000000..d2f3611
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/tr/qos.po
+@@ -0,0 +1,88 @@
++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2010-03-25 22:10+0100\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Calculate overhead"
++msgstr ""
++
++msgid "Classification Rules"
++msgstr ""
++
++msgid "Classification group"
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr ""
++
++msgid "Download speed (kbit/s)"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Half-duplex"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Number of bytes"
++msgstr ""
++
++msgid "Ports"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "QoS"
++msgstr ""
++
++msgid "Quality of Service"
++msgstr ""
++
++msgid "Source host"
++msgstr ""
++
++msgid "Target"
++msgstr ""
++
++msgid "Upload speed (kbit/s)"
++msgstr ""
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++
++msgid "all"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "express"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "normal"
++msgstr ""
++
++msgid "priority"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-qos/po/uk/qos.po b/feeds/luci/applications/luci-app-qos/po/uk/qos.po
+new file mode 100644
+index 0000000..5ec9f37
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/uk/qos.po
+@@ -0,0 +1,110 @@
++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2013-08-13 15:27+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Calculate overhead"
++msgstr "Розраховувати додаткові витрати"
++
++msgid "Classification Rules"
++msgstr "Правила клаÑифікації"
++
++msgid "Classification group"
++msgstr "КлаÑифікаційна група"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr "Вузол призначеннÑ"
++
++msgid "Download speed (kbit/s)"
++msgstr "ШвидкіÑÑ‚ÑŒ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (Кбіт/Ñ)"
++
++msgid "Enable"
++msgstr "Увімкнути"
++
++msgid "Half-duplex"
++msgstr "ÐапівдуплекÑ"
++
++msgid "Interfaces"
++msgstr "ІнтерфейÑи"
++
++msgid "Number of bytes"
++msgstr "КількіÑÑ‚ÑŒ байт"
++
++msgid "Ports"
++msgstr "Порти"
++
++msgid "Protocol"
++msgstr "Протокол"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "ЯкіÑÑ‚ÑŒ обÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ (QoS)"
++
++msgid "Source host"
++msgstr "Вихідний вузол"
++
++msgid "Target"
++msgstr "Мета"
++
++msgid "Upload speed (kbit/s)"
++msgstr "ШвидкіÑÑ‚ÑŒ Ð²Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (Кбіт/Ñ)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"ВикориÑтовуючи фунцію <abbr title=\"Quality of Service — ЯкіÑÑ‚ÑŒ "
++"обÑлуговуваннÑ)\">QoS</abbr> можна визначити пріоритети мережевого трафіку "
++"Ð´Ð»Ñ Ð¿ÐµÐ²Ð½Ð¸Ñ… адреÑ, портів або ÑервіÑів."
++
++msgid "all"
++msgstr "уÑÑ–"
++
++msgid "default"
++msgstr "типова"
++
++msgid "express"
++msgstr "екÑпреÑ"
++
++msgid "low"
++msgstr "низький"
++
++msgid "normal"
++msgstr "звичайний"
++
++msgid "priority"
++msgstr "пріоритетний"
++
++#~ msgid "Service"
++#~ msgstr "СервіÑ"
++
++#~ msgid "Downlink"
++#~ msgstr "Ðизхідний канал"
++
++#~ msgid "Internet Connection"
++#~ msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· інтернетом"
++
++#~ msgid "Uplink"
++#~ msgstr "ВиÑхідний канал"
++
++#, fuzzy
++#~ msgid "allf"
++#~ msgstr "додаткова функціÑ"
+diff --git a/feeds/luci/applications/luci-app-qos/po/vi/qos.po b/feeds/luci/applications/luci-app-qos/po/vi/qos.po
+new file mode 100644
+index 0000000..32e7ed1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/vi/qos.po
+@@ -0,0 +1,119 @@
++# qos.pot
++# generated from ./applications/luci-qos/luasrc/i18n/qos.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2009-08-13 03:56+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++#, fuzzy
++msgid "Calculate overhead"
++msgstr "Tính toán tổng quát"
++
++#, fuzzy
++msgid "Classification Rules"
++msgstr "Phân loại"
++
++#, fuzzy
++msgid "Classification group"
++msgstr "Phân loại"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr ""
++
++msgid "Download speed (kbit/s)"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++#, fuzzy
++msgid "Half-duplex"
++msgstr "Half-Duplex"
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Number of bytes"
++msgstr ""
++
++#, fuzzy
++msgid "Ports"
++msgstr "Ưu tiên"
++
++msgid "Protocol"
++msgstr ""
++
++msgid "QoS"
++msgstr ""
++
++msgid "Quality of Service"
++msgstr "Chất lượng dịch vụ "
++
++#, fuzzy
++msgid "Source host"
++msgstr "Äịa chỉ nguồn"
++
++#, fuzzy
++msgid "Target"
++msgstr "Äịa chỉ mục tiêu"
++
++msgid "Upload speed (kbit/s)"
++msgstr ""
++
++#, fuzzy
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"Vá»›i QoS, bạn có thể Æ°u tiên cho mạng lÆ°á»›i giao thông được chá»n bởi địa chỉ, "
++"cổng hay dịch vụ."
++
++msgid "all"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "express"
++msgstr "cấp tốc"
++
++msgid "low"
++msgstr "thấp"
++
++msgid "normal"
++msgstr "bình thÆ°á»ng"
++
++msgid "priority"
++msgstr "ưu tiên"
++
++#~ msgid "Downlink"
++#~ msgstr "Downlink"
++
++#~ msgid "Uplink"
++#~ msgstr "Uplink"
++
++#~ msgid "Prioritization"
++#~ msgstr "Quá trình ưu tiên"
++
++#~ msgid "source network / source host"
++#~ msgstr "nguồn mạng/ nguồn host"
++
++#~ msgid "target network / target host"
++#~ msgstr "Mục tiêu mạng/ mục tiêu host"
++
++#~ msgid "portrange"
++#~ msgstr "portrange"
++
++#~ msgid "Bytes sent"
++#~ msgstr "Bytes đã gửi"
+diff --git a/feeds/luci/applications/luci-app-qos/po/zh-cn/qos.po b/feeds/luci/applications/luci-app-qos/po/zh-cn/qos.po
+new file mode 100644
+index 0000000..0a5cd62
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/zh-cn/qos.po
+@@ -0,0 +1,106 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCi Chinese Translation\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-25 22:10+0100\n"
++"PO-Revision-Date: 2014-06-22 14:33+0200\n"
++"Last-Translator: phantasm131 <phantasm131@gmail.com>\n"
++"Language-Team: QQ Group 75543259\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr "计算开销"
++
++msgid "Classification Rules"
++msgstr "分类规则"
++
++msgid "Classification group"
++msgstr "分类组"
++
++msgid "Comment"
++msgstr "注解"
++
++msgid "Destination host"
++msgstr "目的主机"
++
++msgid "Download speed (kbit/s)"
++msgstr "下载速度 (kbit/s)"
++
++msgid "Enable"
++msgstr "å¼€å¯"
++
++msgid "Half-duplex"
++msgstr "åŠåŒå·¥"
++
++msgid "Interfaces"
++msgstr "接å£"
++
++msgid "Number of bytes"
++msgstr "字节数"
++
++msgid "Ports"
++msgstr "端å£"
++
++msgid "Protocol"
++msgstr "åè®®"
++
++msgid "QoS"
++msgstr "QoS"
++
++msgid "Quality of Service"
++msgstr "QOSæœåŠ¡"
++
++msgid "Source host"
++msgstr "æºä¸»æœº"
++
++msgid "Target"
++msgstr "目标"
++
++msgid "Upload speed (kbit/s)"
++msgstr "上传速度 (kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr "æ ¹æ®ç½‘络地å€ã€ç«¯å£æˆ–æœåŠ¡ï¼Œç»™æµé‡æ•°æ®åŒ…排åºã€‚"
++
++msgid "all"
++msgstr "全部"
++
++msgid "default"
++msgstr "默认"
++
++msgid "express"
++msgstr "高"
++
++msgid "low"
++msgstr "低"
++
++msgid "normal"
++msgstr "普通"
++
++msgid "priority"
++msgstr "最高"
++
++#~ msgid "Service"
++#~ msgstr "æœåŠ¡"
++
++#~ msgid "Downlink"
++#~ msgstr "下行"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Internet连接"
++
++#~ msgid "Uplink"
++#~ msgstr "上行"
++
++#~ msgid "allf"
++#~ msgstr "全部"
++
++#~ msgid "qos_connbytes"
++#~ msgstr "Qos连接字节数"
+diff --git a/feeds/luci/applications/luci-app-qos/po/zh-tw/qos.po b/feeds/luci/applications/luci-app-qos/po/zh-tw/qos.po
+new file mode 100644
+index 0000000..a011e9c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-qos/po/zh-tw/qos.po
+@@ -0,0 +1,106 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-21 10:36+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Calculate overhead"
++msgstr "æµé‡è¨ˆç®—"
++
++msgid "Classification Rules"
++msgstr "分類è¦å‰‡"
++
++msgid "Classification group"
++msgstr "分組"
++
++msgid "Comment"
++msgstr ""
++
++msgid "Destination host"
++msgstr "目的主機"
++
++msgid "Download speed (kbit/s)"
++msgstr "下載速度(kbit/s)"
++
++msgid "Enable"
++msgstr "啓用"
++
++msgid "Half-duplex"
++msgstr "åŠé›™å·¥"
++
++msgid "Interfaces"
++msgstr "ç•Œé¢"
++
++msgid "Number of bytes"
++msgstr "ä½å…ƒæ•¸"
++
++msgid "Ports"
++msgstr "埠號"
++
++msgid "Protocol"
++msgstr "å”定"
++
++msgid "QoS"
++msgstr "先進先出頻寬管ç†"
++
++msgid "Quality of Service"
++msgstr "連線å“質æœå‹™"
++
++msgid "Source host"
++msgstr "來æºä¸»æ©Ÿ"
++
++msgid "Target"
++msgstr "目的地"
++
++msgid "Upload speed (kbit/s)"
++msgstr "上傳速度(kbit/s)"
++
++msgid ""
++"With <abbr title=\"Quality of Service\">QoS</abbr> you can prioritize "
++"network traffic selected by addresses, ports or services."
++msgstr ""
++"有了 <abbr title=\"Quality of Service\">QoS</abbr> ä½ å¯ä»¥ç”¨ä½å€ã€åŸ è™Ÿæˆ–者æœå‹™"
++"來排優先權."
++
++msgid "all"
++msgstr "通用優先權"
++
++msgid "default"
++msgstr "é è¨­å€¼"
++
++msgid "express"
++msgstr "高優先權"
++
++msgid "low"
++msgstr "低優先權"
++
++msgid "normal"
++msgstr "一般優先權"
++
++msgid "priority"
++msgstr "優先權"
++
++#~ msgid "Service"
++#~ msgstr "æœå‹™"
++
++#~ msgid "Downlink"
++#~ msgstr "下載"
++
++#~ msgid "Internet Connection"
++#~ msgstr "網際網路連線"
++
++#~ msgid "Uplink"
++#~ msgstr "上傳"
++
++#~ msgid "allf"
++#~ msgstr "ç¨ä¸€ç„¡äºŒ"
++
++#~ msgid "qos_connbytes"
++#~ msgstr "QoS連線ä½å…ƒæ•¸"
+diff --git a/feeds/luci/applications/luci-app-radicale/Makefile b/feeds/luci/applications/luci-app-radicale/Makefile
+new file mode 100644
+index 0000000..960618d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radicale/Makefile
+@@ -0,0 +1,41 @@
++#
++# Copyright (C) 2008-2015 The LuCI Team <luci@lists.subsignal.org>
++#
++# This is free software, licensed under the Apache License, Version 2.0 .
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-app-radicale
++
++# Version == major.minor.patch
++# increase "minor" on new functionality and "patch" on patches/optimization
++PKG_VERSION:=1.0.1
++
++# Release == build
++# increase on changes of translation files
++PKG_RELEASE:=1
++
++PKG_LICENSE:=Apache-2.0
++PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
++
++# LuCI specific settings
++LUCI_TITLE:=LuCI Support for Radicale CardDAV/CalDAV
++LUCI_DEPENDS:=+luci-mod-admin-full
++LUCI_PKGARCH:=all
++
++define Package/$(PKG_NAME)/config
++# shown in make menuconfig <Help>
++help
++ $(LUCI_TITLE)
++ .
++ !!! Package "radicale-py2" or "radicale-py3" needs to be !!!
++ !!! installed sepearatly. There is no buildin dependency set !!!
++ .
++ Version: $(PKG_VERSION)-$(PKG_RELEASE)
++ $(PKG_MAINTAINER)
++endef
++
++include $(TOPDIR)/feeds/luci/luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-radicale/luasrc/controller/radicale.lua b/feeds/luci/applications/luci-app-radicale/luasrc/controller/radicale.lua
+new file mode 100644
+index 0000000..35f5a83
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radicale/luasrc/controller/radicale.lua
+@@ -0,0 +1,195 @@
++-- Copyright 2014 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++-- Licensed under the Apache License, Version 2.0
++
++module("luci.controller.radicale", package.seeall)
++
++local NX = require("nixio")
++local NXFS = require("nixio.fs")
++local DISP = require "luci.dispatcher"
++local HTTP = require("luci.http")
++local I18N = require("luci.i18n") -- not globally avalible here
++local UTIL = require("luci.util")
++local SYS = require("luci.sys")
++
++function index()
++ entry( {"admin", "services", "radicale"}, alias("admin", "services", "radicale", "edit"), _("CalDAV/CardDAV"), 58)
++ entry( {"admin", "services", "radicale", "edit"}, cbi("radicale") ).leaf = true
++ entry( {"admin", "services", "radicale", "logview"}, call("_logread") ).leaf = true
++ entry( {"admin", "services", "radicale", "startstop"}, post("_startstop") ).leaf = true
++ entry( {"admin", "services", "radicale", "status"}, call("_status") ).leaf = true
++end
++
++-- called by XHR.get from detail_logview.htm
++function _logread()
++ -- read application settings
++ local uci = UCI.cursor()
++ local logfile = uci:get("radicale", "radicale", "logfile") or "/var/log/radicale"
++ uci:unload("radicale")
++
++ local ldata=NXFS.readfile(logfile)
++ if not ldata or #ldata == 0 then
++ ldata="_nodata_"
++ end
++ HTTP.write(ldata)
++end
++
++-- called by XHR.get from detail_startstop.htm
++function _startstop()
++ local pid = get_pid()
++ if pid > 0 then
++ SYS.call("/etc/init.d/radicale stop")
++ NX.nanosleep(1) -- sleep a second
++ if NX.kill(pid, 0) then -- still running
++ NX.kill(pid, 9) -- send SIGKILL
++ end
++ pid = 0
++ else
++ SYS.call("/etc/init.d/radicale start")
++ NX.nanosleep(1) -- sleep a second
++ pid = get_pid()
++ if pid > 0 and not NX.kill(pid, 0) then
++ pid = 0 -- process did not start
++ end
++ end
++ HTTP.write(tostring(pid)) -- HTTP needs string not number
++end
++
++-- called by XHR.poll from detail_startstop.htm
++function _status()
++ local pid = get_pid()
++ HTTP.write(tostring(pid)) -- HTTP needs string not number
++end
++
++-- Application / Service specific information functions ########################
++function luci_app_name()
++ return "luci-app-radicale"
++end
++
++function service_name()
++ return "radicale"
++end
++function service_required()
++ return "0.10-1"
++end
++function service_installed()
++ local v = ipkg_ver_installed("radicale-py2")
++ if not v or #v == 0 then v = ipkg_ver_installed("radicale-py3") end
++ if not v or #v == 0 then v = "0" end
++ return v
++end
++function service_ok()
++ return ipkg_ver_compare(service_installed(),">=",service_required())
++end
++
++function app_title_main()
++ return [[</a><a href="javascript:alert(']]
++ .. I18N.translate("Version Information")
++ .. [[\n\n]] .. luci_app_name()
++ .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
++ .. (ipkg_ver_installed(luci_app_name()) == ""
++ and I18N.translate("NOT installed")
++ or ipkg_ver_installed(luci_app_name()) )
++ .. [[\n\n]] .. service_name() .. [[ ]] .. I18N.translate("required") .. [[:]]
++ .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
++ .. service_required() .. [[ ]] .. I18N.translate("or higher")
++ .. [[\n\n]] .. service_name() .. [[ ]] .. I18N.translate("installed") .. [[:]]
++ .. [[\n\t]] .. I18N.translate("Version") .. [[:\t]]
++ .. (service_installed() == "0"
++ and I18N.translate("NOT installed")
++ or service_installed())
++ .. [[\n\n]]
++ .. [[')">]]
++ .. I18N.translate("Radicale CalDAV/CardDAV Server")
++end
++function app_title_back()
++ return [[</a><a href="]]
++ .. DISP.build_url("admin", "services", "radicale")
++ .. [[">]]
++ .. I18N.translate("Radicale CalDAV/CardDAV Server")
++end
++function app_description()
++ return I18N.translate("The Radicale Project is a complete CalDAV (calendar) and CardDAV (contact) server solution.") .. [[<br />]]
++ .. I18N.translate("Calendars and address books are available for both local and remote access, possibly limited through authentication policies.") .. [[<br />]]
++ .. I18N.translate("They can be viewed and edited by calendar and contact clients on mobile phones or computers.")
++end
++
++-- other multiused functions ###################################################
++
++--return pid of running process
++function get_pid()
++ return tonumber(SYS.exec([[ps | grep "[p]ython.*[r]adicale" 2>/dev/null | awk '{print $1}']])) or 0
++end
++
++-- compare versions using "<=" "<" ">" ">=" "=" "<<" ">>"
++function ipkg_ver_compare(ver1, comp, ver2)
++ if not ver1 or not ver2
++ or not comp or not (#comp > 0) then return nil end
++ -- correct compare string
++ if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~="
++ elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<="
++ elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">="
++ elseif comp == "=" or comp == "==" then comp = "=="
++ elseif comp == "<<" then comp = "<"
++ elseif comp == ">>" then comp = ">"
++ else return nil end
++
++ local av1 = UTIL.split(ver1, "[%.%-]", nil, true)
++ local av2 = UTIL.split(ver2, "[%.%-]", nil, true)
++
++ for i = 1, math.max(table.getn(av1),table.getn(av2)), 1 do
++ local s1 = av1[i] or ""
++ local s2 = av2[i] or ""
++
++ -- first "not equal" found return true
++ if comp == "~=" and (s1 ~= s2) then return true end
++ -- first "lower" found return true
++ if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
++ -- first "greater" found return true
++ if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
++ -- not equal then return false
++ if (s1 ~= s2) then return false end
++ end
++
++ -- all equal and not compare greater or lower then true
++ return not (comp == "<" or comp == ">")
++end
++
++-- read version information for given package if installed
++function ipkg_ver_installed(pkg)
++ local version = ""
++ local control = io.open("/usr/lib/opkg/info/%s.control" % pkg, "r")
++ if control then
++ local ln
++ repeat
++ ln = control:read("*l")
++ if ln and ln:match("^Version: ") then
++ version = ln:gsub("^Version: ", "")
++ break
++ end
++ until not ln
++ control:close()
++ end
++ return version
++end
++
++-- replacement of build-in Flag.parse of cbi.lua
++-- modified to mark section as changed if value changes
++-- current parse did not do this, but it is done AbstaractValue.parse()
++function flag_parse(self, section)
++ local fexists = self.map:formvalue(
++ luci.cbi.FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option)
++
++ if fexists then
++ local fvalue = self:formvalue(section) and self.enabled or self.disabled
++ local cvalue = self:cfgvalue(section)
++ if fvalue ~= self.default or (not self.optional and not self.rmempty) then
++ self:write(section, fvalue)
++ else
++ self:remove(section)
++ end
++ if (fvalue ~= cvalue) then self.section.changed = true end
++ else
++ self:remove(section)
++ self.section.changed = true
++ end
++end
+diff --git a/feeds/luci/applications/luci-app-radicale/luasrc/model/cbi/radicale.lua b/feeds/luci/applications/luci-app-radicale/luasrc/model/cbi/radicale.lua
+new file mode 100644
+index 0000000..8abb688
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radicale/luasrc/model/cbi/radicale.lua
+@@ -0,0 +1,748 @@
++-- Copyright 2015 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++-- Licensed under the Apache License, Version 2.0
++
++local NXFS = require("nixio.fs")
++local DISP = require("luci.dispatcher")
++local DTYP = require("luci.cbi.datatypes")
++local HTTP = require("luci.http")
++local UTIL = require("luci.util")
++local UCI = require("luci.model.uci")
++local SYS = require("luci.sys")
++local TOOLS = require("luci.controller.radicale") -- this application's controller and multiused functions
++
++-- #################################################################################################
++-- takeover arguments if any -- ################################################
++-- then show/edit selected file
++if arg[1] then
++ local argument = arg[1]
++ local filename = ""
++
++ -- SimpleForm ------------------------------------------------
++ local ft = SimpleForm("_text")
++ ft.title = TOOLS.app_title_back()
++ ft.description = TOOLS.app_description()
++ ft.redirect = DISP.build_url("admin", "services", "radicale") .. "#cbi-radicale-" .. argument
++ if argument == "logger" then
++ ft.reset = false
++ ft.submit = translate("Reload")
++ local uci = UCI.cursor()
++ filename = uci:get("radicale", "logger", "file_path") or "/var/log/radicale"
++ uci:unload("radicale")
++ filename = filename .. "/radicale"
++ elseif argument == "auth" then
++ ft.submit = translate("Save")
++ filename = "/etc/radicale/users"
++ elseif argument == "rights" then
++ ft.submit = translate("Save")
++ filename = "/etc/radicale/rights"
++ else
++ error("Invalid argument given as section")
++ end
++ if argument ~= "logger" and not NXFS.access(filename) then
++ NXFS.writefile(filename, "")
++ end
++
++ -- SimpleSection ---------------------------------------------
++ local fs = ft:section(SimpleSection)
++ if argument == "logger" then
++ fs.title = translate("Log-file Viewer")
++ fs.description = translate("Please press [Reload] button below to reread the file.")
++ elseif argument == "auth" then
++ fs.title = translate("Authentication")
++ fs.description = translate("Place here the 'user:password' pairs for your users which should have access to Radicale.")
++ .. [[<br /><strong>]]
++ .. translate("Keep in mind to use the correct hashing algorithm !")
++ .. [[</strong>]]
++ else -- rights
++ fs.title = translate("Rights")
++ fs.description = translate("Authentication login is matched against the 'user' key, "
++ .. "and collection's path is matched against the 'collection' key.") .. " "
++ .. translate("You can use Python's ConfigParser interpolation values %(login)s and %(path)s.") .. " "
++ .. translate("You can also get groups from the user regex in the collection with {0}, {1}, etc.")
++ .. [[<br />]]
++ .. translate("For example, for the 'user' key, '.+' means 'authenticated user'" .. " "
++ .. "and '.*' means 'anybody' (including anonymous users).")
++ .. [[<br />]]
++ .. translate("Section names are only used for naming the rule.")
++ .. [[<br />]]
++ .. translate("Leading or ending slashes are trimmed from collection's path.")
++ end
++
++ -- TextValue -------------------------------------------------
++ local tt = fs:option(TextValue, "_textvalue")
++ tt.rmempty = true
++ if argument == "logger" then
++ tt.readonly = true
++ tt.rows = 30
++ function tt.write()
++ HTTP.redirect(DISP.build_url("admin", "services", "radicale", "edit", argument))
++ end
++ else
++ tt.rows = 15
++ function tt.write(self, section, value)
++ if not value then value = "" end
++ NXFS.writefile(filename, value:gsub("\r\n", "\n"))
++ return true --HTTP.redirect(DISP.build_url("admin", "services", "radicale", "edit") .. "#cbi-radicale-" .. argument)
++ end
++ end
++
++ function tt.cfgvalue()
++ return NXFS.readfile(filename) or
++ string.format(translate("File '%s' not found !"), filename)
++ end
++
++ return ft
++
++end
++
++-- #################################################################################################
++-- Error handling if not installed or wrong version -- #########################
++if not TOOLS.service_ok() then
++ local f = SimpleForm("_no_config")
++ f.title = TOOLS.app_title_main()
++ f.description = TOOLS.app_description()
++ f.submit = false
++ f.reset = false
++
++ local s = f:section(SimpleSection)
++
++ local v = s:option(DummyValue, "_update_needed")
++ v.rawhtml = true
++ if TOOLS.service_installed() == "0" then
++ v.value = [[<h3><strong><br /><font color="red">&nbsp;&nbsp;&nbsp;&nbsp;]]
++ .. translate("Software package '" .. TOOLS.service_name() .. "' is not installed.")
++ .. [[</font><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]]
++ .. translate("required") .. [[: ]] .. TOOLS.service_name() .. [[ ]] .. TOOLS.service_required()
++ .. [[<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;]]
++ .. [[<a href="]] .. DISP.build_url("admin", "system", "packages") ..[[">]]
++ .. translate("Please install current version !")
++ .. [[</a><br />&nbsp;</strong></h3>]]
++ else
++ v.value = [[<h3><strong><br /><font color="red">&nbsp;&nbsp;&nbsp;&nbsp;]]
++ .. translate("Software package '" .. TOOLS.service_name() .. "' is outdated.")
++ .. [[</font><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]]
++ .. translate("installed") .. [[: ]] .. TOOLS.service_name() .. [[ ]] .. TOOLS.service_installed()
++ .. [[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]]
++ .. translate("required") .. [[: ]] .. TOOLS.service_name() .. [[ ]] .. TOOLS.service_required()
++ .. [[<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;]]
++ .. [[<a href="]] .. DISP.build_url("admin", "system", "packages") ..[[">]]
++ .. translate("Please update to current version !")
++ .. [[</a><br />&nbsp;</strong></h3>]]
++ end
++
++ return f
++end
++
++-- #################################################################################################
++-- Error handling if no config, create an empty one -- #########################
++if not NXFS.access("/etc/config/radicale") then
++ NXFS.writefile("/etc/config/radicale", "")
++end
++
++-- cbi-map -- ##################################################################
++local m = Map("radicale")
++m.title = TOOLS.app_title_main()
++m.description = TOOLS.app_description()
++function m.commit_handler(self)
++ if self.changed then -- changes ?
++ os.execute("/etc/init.d/radicale reload &") -- reload configuration
++ end
++end
++
++-- cbi-section "System" -- #####################################################
++local sys = m:section( NamedSection, "_system" )
++sys.title = translate("System")
++sys.description = nil
++function sys.cfgvalue(self, section)
++ return "_dummysection"
++end
++
++-- start/stop button -----------------------------------------------------------
++local btn = sys:option(DummyValue, "_startstop")
++btn.template = "radicale/btn_startstop"
++btn.inputstyle = nil
++btn.rmempty = true
++btn.title = translate("Start / Stop")
++btn.description = translate("Start/Stop Radicale server")
++function btn.cfgvalue(self, section)
++ local pid = TOOLS.get_pid(true)
++ if pid > 0 then
++ btn.inputtitle = "PID: " .. pid
++ btn.inputstyle = "reset"
++ btn.disabled = false
++ else
++ btn.inputtitle = translate("Start")
++ btn.inputstyle = "apply"
++ btn.disabled = false
++ end
++ return true
++end
++
++-- enabled ---------------------------------------------------------------------
++local ena = sys:option(Flag, "_enabled")
++ena.title = translate("Auto-start")
++ena.description = translate("Enable/Disable auto-start of Radicale on system start-up and interface events")
++ena.orientation = "horizontal" -- put description under the checkbox
++ena.rmempty = false -- we need write
++function ena.cfgvalue(self, section)
++ return (SYS.init.enabled("radicale")) and "1" or "0"
++end
++function ena.write(self, section, value)
++ if value == "1" then
++ return SYS.init.enable("radicale")
++ else
++ return SYS.init.disable("radicale")
++ end
++end
++
++-- cbi-section "Server" -- #####################################################
++local srv = m:section( NamedSection, "server", "setting" )
++srv.title = translate("Server")
++srv.description = nil
++function srv.cfgvalue(self, section)
++ if not self.map:get(section) then -- section might not exist
++ self.map:set(section, nil, self.sectiontype)
++ end
++ return self.map:get(section)
++end
++
++-- hosts -----------------------------------------------------------------------
++local sh = srv:option( DynamicList, "hosts" )
++sh.title = translate("Address:Port")
++sh.description = translate("'Hostname:Port' or 'IPv4:Port' or '[IPv6]:Port' Radicale should listen on")
++ .. [[<br /><strong>]]
++ .. translate("Port numbers below 1024 (Privileged ports) are not supported")
++ .. [[</strong>]]
++sh.placeholder = "0.0.0.0:5232"
++sh.rmempty = true
++
++-- realm -----------------------------------------------------------------------
++local alm = srv:option( Value, "realm" )
++alm.title = translate("Logon message")
++alm.description = translate("Message displayed in the client when a password is needed.")
++alm.default = "Radicale - Password Required"
++alm.rmempty = false
++function alm.parse(self, section)
++ AbstractValue.parse(self, section, "true") -- otherwise unspecific validate error
++end
++function alm.validate(self, value)
++ if value then
++ return value
++ else
++ return self.default
++ end
++end
++function alm.write(self, section, value)
++ if value ~= self.default then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++end
++
++-- ssl -------------------------------------------------------------------------
++local ssl = srv:option( Flag, "ssl" )
++ssl.title = translate("Enable HTTPS")
++ssl.description = nil
++ssl.rmempty = false
++function ssl.parse(self, section)
++ TOOLS.flag_parse(self, section)
++end
++function ssl.write(self, section, value)
++ if value == "0" then -- delete all if not https enabled
++ self.map:del(section, "protocol") -- protocol
++ self.map:del(section, "certificate") -- certificate
++ self.map:del(section, "key") -- private key
++ self.map:del(section, "ciphers") -- ciphers
++ return self.map:del(section, self.option)
++ else
++ return self.map:set(section, self.option, value)
++ end
++end
++
++-- protocol --------------------------------------------------------------------
++local prt = srv:option( ListValue, "protocol" )
++prt.title = translate("SSL Protocol")
++prt.description = translate("'AUTO' selects the highest protocol version that client and server support.")
++prt.widget = "select"
++prt.default = "PROTOCOL_SSLv23"
++prt:depends ("ssl", "1")
++prt:value ("PROTOCOL_SSLv23", translate("AUTO"))
++prt:value ("PROTOCOL_SSLv2", "SSL v2")
++prt:value ("PROTOCOL_SSLv3", "SSL v3")
++prt:value ("PROTOCOL_TLSv1", "TLS v1")
++prt:value ("PROTOCOL_TLSv1_1", "TLS v1.1")
++prt:value ("PROTOCOL_TLSv1_2", "TLS v1.2")
++
++-- certificate -----------------------------------------------------------------
++local crt = srv:option( Value, "certificate" )
++crt.title = translate("Certificate file")
++crt.description = translate("Full path and file name of certificate")
++crt.placeholder = "/etc/radicale/ssl/server.crt"
++crt.rmempty = false -- force validate/write
++crt:depends ("ssl", "1")
++function crt.parse(self, section)
++ local _ssl = ssl:formvalue(section) or "0"
++ local novld = (_ssl == "0")
++ AbstractValue.parse(self, section, novld) -- otherwise unspecific validate error
++end
++function crt.validate(self, value)
++ local _ssl = ssl:formvalue(srv.section) or "0"
++ if _ssl == "0" then
++ return "" -- ignore if not https enabled
++ end
++ if value then -- otherwise errors in datatype check
++ if DTYP.file(value) then
++ return value
++ else
++ return nil, self.title .. " - " .. translate("File not found !")
++ end
++ else
++ return nil, self.title .. " - " .. translate("Path/File required !")
++ end
++end
++function crt.write(self, section, value)
++ if not value or #value == 0 then
++ return self.map:del(section, self.option)
++ else
++ return self.map:set(section, self.option, value)
++ end
++end
++
++-- key -------------------------------------------------------------------------
++local key = srv:option( Value, "key" )
++key.title = translate("Private key file")
++key.description = translate("Full path and file name of private key")
++key.placeholder = "/etc/radicale/ssl/server.key"
++key.rmempty = false -- force validate/write
++key:depends ("ssl", "1")
++function key.parse(self, section)
++ local _ssl = ssl:formvalue(section) or "0"
++ local novld = (_ssl == "0")
++ AbstractValue.parse(self, section, novld) -- otherwise unspecific validate error
++end
++function key.validate(self, value)
++ local _ssl = ssl:formvalue(srv.section) or "0"
++ if _ssl == "0" then
++ return "" -- ignore if not https enabled
++ end
++ if value then -- otherwise errors in datatype check
++ if DTYP.file(value) then
++ return value
++ else
++ return nil, self.title .. " - " .. translate("File not found !")
++ end
++ else
++ return nil, self.title .. " - " .. translate("Path/File required !")
++ end
++end
++function key.write(self, section, value)
++ if not value or #value == 0 then
++ return self.map:del(section, self.option)
++ else
++ return self.map:set(section, self.option, value)
++ end
++end
++
++-- ciphers ---------------------------------------------------------------------
++--local cip = srv:option( Value, "ciphers" )
++--cip.title = translate("Ciphers")
++--cip.description = translate("OPTIONAL: See python's ssl module for available ciphers")
++--cip.rmempty = true
++--cip:depends ("ssl", "1")
++
++-- cbi-section "Authentication" -- #############################################
++local aut = m:section( NamedSection, "auth", "setting" )
++aut.title = translate("Authentication")
++aut.description = translate("Authentication method to allow access to Radicale server.")
++function aut.cfgvalue(self, section)
++ if not self.map:get(section) then -- section might not exist
++ self.map:set(section, nil, self.sectiontype)
++ end
++ return self.map:get(section)
++end
++
++-- type -----------------------------------------------------------------------
++local aty = aut:option( ListValue, "type" )
++aty.title = translate("Authentication method")
++aty.description = nil
++aty.widget = "select"
++aty.default = "None"
++aty:value ("None", translate("None"))
++aty:value ("htpasswd", translate("htpasswd file"))
++--aty:value ("IMAP", "IMAP") -- The IMAP authentication module relies on the imaplib module.
++--aty:value ("LDAP", "LDAP") -- The LDAP authentication module relies on the python-ldap module.
++--aty:value ("PAM", "PAM") -- The PAM authentication module relies on the python-pam module.
++--aty:value ("courier", "courier")
++--aty:value ("HTTP", "HTTP") -- The HTTP authentication module relies on the requests module
++--aty:value ("remote_user", "remote_user")
++--aty:value ("custom", translate("custom"))
++function aty.write(self, section, value)
++ if value ~= "htpasswd" then
++ self.map:del(section, "htpasswd_encryption")
++ elseif value ~= "IMAP" then
++ self.map:del(section, "imap_hostname")
++ self.map:del(section, "imap_port")
++ self.map:del(section, "imap_ssl")
++ end
++ if value ~= self.default then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++end
++
++-- htpasswd_encryption ---------------------------------------------------------
++local hte = aut:option( ListValue, "htpasswd_encryption" )
++hte.title = translate("Encryption method")
++hte.description = nil
++hte.widget = "select"
++hte.default = "crypt"
++hte:depends ("type", "htpasswd")
++hte:value ("crypt", translate("crypt"))
++hte:value ("plain", translate("plain"))
++hte:value ("sha1", translate("SHA-1"))
++hte:value ("ssha", translate("salted SHA-1"))
++
++-- htpasswd_file (dummy) -------------------------------------------------------
++local htf = aut:option( DummyValue, "_htf" )
++htf.title = translate("htpasswd file")
++htf.description = [[<strong>]]
++ .. translate("Read only!")
++ .. [[</strong> ]]
++ .. translate("Radicale uses '/etc/radicale/users' as htpasswd file.")
++ .. [[<br /><a href="]]
++ .. DISP.build_url("admin", "services", "radicale", "edit") .. [[/auth]]
++ .. [[">]]
++ .. translate("To edit the file follow this link!")
++ .. [[</a>]]
++htf.keylist = {} -- required by template
++htf.vallist = {} -- required by template
++htf.template = "radicale/ro_value"
++htf.readonly = true
++htf:depends ("type", "htpasswd")
++function htf.cfgvalue()
++ return "/etc/radicale/users"
++end
++
++-- cbi-section "Rights" -- #####################################################
++local rig = m:section( NamedSection, "rights", "setting" )
++rig.title = translate("Rights")
++rig.description = translate("Control the access to data collections.")
++function rig.cfgvalue(self, section)
++ if not self.map:get(section) then -- section might not exist
++ self.map:set(section, nil, self.sectiontype)
++ end
++ return self.map:get(section)
++end
++
++-- type -----------------------------------------------------------------------
++local rty = rig:option( ListValue, "type" )
++rty.title = translate("Rights backend")
++rty.description = nil
++rty.widget = "select"
++rty.default = "None"
++rty:value ("None", translate("Full access for everybody (including anonymous)"))
++rty:value ("authenticated", translate("Full access for authenticated Users") )
++rty:value ("owner_only", translate("Full access for Owner only") )
++rty:value ("owner_write", translate("Owner allow write, authenticated users allow read") )
++rty:value ("from_file", translate("Rights are based on a regexp-based file") )
++--rty:value ("custom", "Custom handler")
++function rty.write(self, section, value)
++ if value ~= "custom" then
++ self.map:del(section, "custom_handler")
++ end
++ if value ~= self.default then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++end
++
++-- from_file (dummy) -----------------------------------------------------------
++local rtf = rig:option( DummyValue, "_rtf" )
++rtf.title = translate("RegExp file")
++rtf.description = [[<strong>]]
++ .. translate("Read only!")
++ .. [[</strong> ]]
++ .. translate("Radicale uses '/etc/radicale/rights' as regexp-based file.")
++ .. [[<br /><a href="]]
++ .. DISP.build_url("admin", "services", "radicale", "edit") .. [[/rights]]
++ .. [[">]]
++ .. translate("To edit the file follow this link!")
++ .. [[</a>]]
++rtf.keylist = {} -- required by template
++rtf.vallist = {} -- required by template
++rtf.template = "radicale/ro_value"
++rtf.readonly = true
++rtf:depends ("type", "from_file")
++function rtf.cfgvalue()
++ return "/etc/radicale/rights"
++end
++
++-- cbi-section "Storage" -- ####################################################
++local sto = m:section( NamedSection, "storage", "setting" )
++sto.title = translate("Storage")
++sto.description = nil
++function sto.cfgvalue(self, section)
++ if not self.map:get(section) then -- section might not exist
++ self.map:set(section, nil, self.sectiontype)
++ end
++ return self.map:get(section)
++end
++
++-- type -----------------------------------------------------------------------
++local sty = sto:option( ListValue, "type" )
++sty.title = translate("Storage backend")
++sty.description = translate("WARNING: Only 'File-system' is documented and tested by Radicale development")
++sty.widget = "select"
++sty.default = "filesystem"
++sty:value ("filesystem", translate("File-system"))
++--sty:value ("multifilesystem", translate("") )
++--sty:value ("database", translate("Database") )
++--sty:value ("custom", translate("Custom") )
++function sty.write(self, section, value)
++ if value ~= "filesystem" then
++ self.map:del(section, "filesystem_folder")
++ end
++ if value ~= self.default then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++end
++
++--filesystem_folder ------------------------------------------------------------
++local sfi = sto:option( Value, "filesystem_folder" )
++sfi.title = translate("Directory")
++sfi.description = nil
++sfi.default = "/srv/radicale"
++sfi.rmempty = false -- force validate/write
++sfi:depends ("type", "filesystem")
++function sfi.parse(self, section)
++ local _typ = sty:formvalue(sto.section) or ""
++ local novld = (_typ ~= "filesystem")
++ AbstractValue.parse(self, section, novld) -- otherwise unspecific validate error
++end
++function sfi.validate(self, value)
++ local _typ = sty:formvalue(sto.section) or ""
++ if _typ ~= "filesystem" then
++ return "" -- ignore if not htpasswd
++ end
++ if value then -- otherwise errors in datatype check
++ if DTYP.directory(value) then
++ return value
++ else
++ return nil, self.title .. " - " .. translate("Directory not exists/found !")
++ end
++ else
++ return nil, self.title .. " - " .. translate("Directory required !")
++ end
++end
++
++-- cbi-section "Logging" -- ####################################################
++local log = m:section( NamedSection, "logger", "logging" )
++log.title = translate("Logging")
++log.description = nil
++function log.cfgvalue(self, section)
++ if not self.map:get(section) then -- section might not exist
++ self.map:set(section, nil, self.sectiontype)
++ end
++ return self.map:get(section)
++end
++
++-- console_level ---------------------------------------------------------------
++local lco = log:option( ListValue, "console_level" )
++lco.title = translate("Console Log level")
++lco.description = nil
++lco.widget = "select"
++lco.default = "ERROR"
++lco:value ("DEBUG", translate("Debug"))
++lco:value ("INFO", translate("Info") )
++lco:value ("WARNING", translate("Warning") )
++lco:value ("ERROR", translate("Error") )
++lco:value ("CRITICAL", translate("Critical") )
++function lco.write(self, section, value)
++ if value ~= self.default then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++end
++
++-- syslog_level ----------------------------------------------------------------
++local lsl = log:option( ListValue, "syslog_level" )
++lsl.title = translate("Syslog Log level")
++lsl.description = nil
++lsl.widget = "select"
++lsl.default = "WARNING"
++lsl:value ("DEBUG", translate("Debug"))
++lsl:value ("INFO", translate("Info") )
++lsl:value ("WARNING", translate("Warning") )
++lsl:value ("ERROR", translate("Error") )
++lsl:value ("CRITICAL", translate("Critical") )
++function lsl.write(self, section, value)
++ if value ~= self.default then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++end
++
++-- file_level ------------------------------------------------------------------
++local lfi = log:option( ListValue, "file_level" )
++lfi.title = translate("File Log level")
++lfi.description = nil
++lfi.widget = "select"
++lfi.default = "INFO"
++lfi:value ("DEBUG", translate("Debug"))
++lfi:value ("INFO", translate("Info") )
++lfi:value ("WARNING", translate("Warning") )
++lfi:value ("ERROR", translate("Error") )
++lfi:value ("CRITICAL", translate("Critical") )
++function lfi.write(self, section, value)
++ if value ~= self.default then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++end
++
++-- file_path -------------------------------------------------------------------
++local lfp = log:option( Value, "file_path" )
++lfp.title = translate("Log-file directory")
++lfp.description = translate("Directory where the rotating log-files are stored")
++ .. [[<br /><a href="]]
++ .. DISP.build_url("admin", "services", "radicale", "edit") .. [[/logger]]
++ .. [[">]]
++ .. translate("To view latest log file follow this link!")
++ .. [[</a>]]
++lfp.default = "/var/log/radicale"
++function lfp.write(self, section, value)
++ if value ~= self.default then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++end
++
++-- file_maxbytes ---------------------------------------------------------------
++local lmb = log:option( Value, "file_maxbytes" )
++lmb.title = translate("Log-file size")
++lmb.description = translate("Maximum size of each rotation log-file.")
++ .. [[<br /><strong>]]
++ .. translate("Setting this parameter to '0' will disable rotation of log-file.")
++ .. [[</strong>]]
++lmb.default = "8196"
++lmb.rmempty = false
++function lmb.validate(self, value)
++ if value then -- otherwise errors in datatype check
++ if DTYP.uinteger(value) then
++ return value
++ else
++ return nil, self.title .. " - " .. translate("Value is not an Integer >= 0 !")
++ end
++ else
++ return nil, self.title .. " - " .. translate("Value required ! Integer >= 0 !")
++ end
++end
++function lmb.write(self, section, value)
++ if value ~= self.default then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++end
++
++-- file_backupcount ------------------------------------------------------------
++local lbc = log:option( Value, "file_backupcount" )
++lbc.title = translate("Log-backup Count")
++lbc.description = translate("Number of backup files of log to create.")
++ .. [[<br /><strong>]]
++ .. translate("Setting this parameter to '0' will disable rotation of log-file.")
++ .. [[</strong>]]
++lbc.default = "1"
++lbc.rmempty = false
++function lbc.validate(self, value)
++ if value then -- otherwise errors in datatype check
++ if DTYP.uinteger(value) then
++ return value
++ else
++ return nil, self.title .. " - " .. translate("Value is not an Integer >= 0 !")
++ end
++ else
++ return nil, self.title .. " - " .. translate("Value required ! Integer >= 0 !")
++ end
++end
++function lbc.write(self, section, value)
++ if value ~= self.default then
++ return self.map:set(section, self.option, value)
++ else
++ return self.map:del(section, self.option)
++ end
++end
++
++-- cbi-section "Encoding" -- ###################################################
++local enc = m:section( NamedSection, "encoding", "setting" )
++enc.title = translate("Encoding")
++enc.description = translate("Change here the encoding Radicale will use instead of 'UTF-8' "
++ .. "for responses to the client and/or to store data inside collections.")
++function enc.cfgvalue(self, section)
++ if not self.map:get(section) then -- section might not exist
++ self.map:set(section, nil, self.sectiontype)
++ end
++ return self.map:get(section)
++end
++
++-- request ---------------------------------------------------------------------
++local enr = enc:option( Value, "request" )
++enr.title = translate("Response Encoding")
++enr.description = translate("Encoding for responding requests.")
++enr.default = "utf-8"
++enr.optional = true
++
++-- stock -----------------------------------------------------------------------
++local ens = enc:option( Value, "stock" )
++ens.title = translate("Storage Encoding")
++ens.description = translate("Encoding for storing local collections.")
++ens.default = "utf-8"
++ens.optional = true
++
++-- cbi-section "Headers" -- ####################################################
++local hea = m:section( NamedSection, "headers", "setting" )
++hea.title = translate("Additional HTTP headers")
++hea.description = translate("Cross-origin resource sharing (CORS) is a mechanism that allows restricted resources (e.g. fonts, JavaScript, etc.) "
++ .. "on a web page to be requested from another domain outside the domain from which the resource originated.")
++function hea.cfgvalue(self, section)
++ if not self.map:get(section) then -- section might not exist
++ self.map:set(section, nil, self.sectiontype)
++ end
++ return self.map:get(section)
++end
++
++-- Access_Control_Allow_Origin -------------------------------------------------
++local heo = hea:option( DynamicList, "Access_Control_Allow_Origin" )
++heo.title = translate("Access-Control-Allow-Origin")
++heo.description = nil
++heo.default = "*"
++heo.optional = true
++
++-- Access_Control_Allow_Methods ------------------------------------------------
++local hem = hea:option( DynamicList, "Access_Control_Allow_Methods" )
++hem.title = translate("Access-Control-Allow-Methods")
++hem.description = nil
++hem.optional = true
++
++-- Access_Control_Allow_Headers ------------------------------------------------
++local heh = hea:option( DynamicList, "Access_Control_Allow_Headers" )
++heh.title = translate("Access-Control-Allow-Headers")
++heh.description = nil
++heh.optional = true
++
++-- Access_Control_Expose_Headers -----------------------------------------------
++local hee = hea:option( DynamicList, "Access_Control_Expose_Headers" )
++hee.title = translate("Access-Control-Expose-Headers")
++hee.description = nil
++hee.optional = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/btn_startstop.htm b/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/btn_startstop.htm
+new file mode 100644
+index 0000000..dbf4ddd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/btn_startstop.htm
+@@ -0,0 +1,49 @@
++
++<!-- ++ BEGIN ++ Radicale ++ btn_startstop.htm ++ -->
++<script type="text/javascript">//<![CDATA[
++
++ // show XHR.poll/XHR.get response on button
++ function _data2elements(x) {
++ var btn = document.getElementById("cbid.radicale._system._startstop");
++ if ( ! btn ) { return; } // security check
++ if (x.responseText == "0") {
++ btn.value = "<%:Start%>";
++ btn.className = "cbi-button cbi-button-apply";
++ btn.disabled = false;
++ } else {
++ btn.value = "PID: " + x.responseText;
++ btn.className = "cbi-button cbi-button-reset";
++ btn.disabled = false;
++ }
++ }
++
++ // event handler for start/stop button
++ function onclick_startstop(id) {
++ // do start/stop
++ var btnXHR = new XHR();
++ btnXHR.post('<%=url('admin/services/radicale/startstop')%>', { token: '<%=token%>' },
++ function(x) { _data2elements(x); }
++ );
++ }
++
++ XHR.poll(5, '<%=url('admin/services/radicale/status')%>', null,
++ function(x, data) { _data2elements(x); }
++ );
++
++//]]></script>
++
++<%+cbi/valueheader%>
++
++<% if self:cfgvalue(section) ~= false then
++-- We need to garantie that function cfgvalue run first to set missing parameters
++%>
++ <!-- style="font-size: 100%;" needed for openwrt theme to fix font size -->
++ <!-- type="button" onclick="..." enable standard onclick functionalty -->
++ <input class="cbi-button cbi-input-<%=self.inputstyle or "button" %>" style="font-size: 100%;" type="button" onclick="onclick_startstop(this.id)"
++ <%=
++ attr("name", section) .. attr("id", cbid) .. attr("value", self.inputtitle) .. ifattr(self.disabled, "disabled")
++ %> />
++<% end %>
++
++<%+cbi/valuefooter%>
++<!-- ++ END ++ Radicale ++ btn_startstop.htm ++ -->
+diff --git a/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/ro_value.htm b/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/ro_value.htm
+new file mode 100644
+index 0000000..6e05206
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/ro_value.htm
+@@ -0,0 +1,35 @@
++<%+cbi/valueheader%>
++ <input type="<%=self.password and 'password" class="cbi-input-password' or 'text" class="cbi-input-text' %>" onchange="cbi_d_update(this.id)"<%=
++ attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section) or self.default) ..
++ ifattr(self.size, "size") .. ifattr(self.placeholder, "placeholder") .. ifattr(self.readonly, "readonly")
++ %> />
++ <% if self.password then %><img src="<%=resource%>/cbi/reload.gif" style="vertical-align:middle" title="<%:Reveal/hide password%>" onclick="var e = document.getElementById('<%=cbid%>'); e.type = (e.type=='password') ? 'text' : 'password';" /><% end %>
++ <% if #self.keylist > 0 or self.datatype then -%>
++ <script type="text/javascript">//<![CDATA[
++ <% if #self.keylist > 0 then -%>
++ cbi_combobox_init('<%=cbid%>', {
++ <%-
++ for i, k in ipairs(self.keylist) do
++ -%>
++ <%-=string.format("%q", k) .. ":" .. string.format("%q", self.vallist[i])-%>
++ <%-if i<#self.keylist then-%>,<%-end-%>
++ <%-
++ end
++ -%>
++ }, '<%- if not self.rmempty and not self.optional then -%>
++ <%-: -- Please choose -- -%>
++ <%- elseif self.placeholder then -%>
++ <%-= pcdata(self.placeholder) -%>
++ <%- end -%>', '
++ <%- if self.combobox_manual then -%>
++ <%-=self.combobox_manual-%>
++ <%- else -%>
++ <%-: -- custom -- -%>
++ <%- end -%>');
++ <%- end %>
++ <% if self.datatype then -%>
++ cbi_validate_field('<%=cbid%>', <%=tostring((self.optional or self.rmempty) == true)%>, '<%=self.datatype:gsub("'", "\\'")%>');
++ <%- end %>
++ //]]></script>
++ <% end -%>
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/applications/luci-app-radicale/po/de/radicale.po b/feeds/luci/applications/luci-app-radicale/po/de/radicale.po
+new file mode 100644
+index 0000000..57850dc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radicale/po/de/radicale.po
+@@ -0,0 +1,435 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: luci-app-radicale\n"
++"POT-Creation-Date: 2015-05-02 19:32+0100\n"
++"PO-Revision-Date: 2015-05-02 22:43+0100\n"
++"Last-Translator: Christian Schoenebeck <christian.schoenebeck@gmail.com>\n"
++"Language-Team: \n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Poedit 1.7.5\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid ""
++"'AUTO' selects the highest protocol version that client and server support."
++msgstr ""
++"'AUTO' wählt die höchste Protokollversion, die Client und Server "
++"unterstützen."
++
++msgid ""
++"'Hostname:Port' or 'IPv4:Port' or '[IPv6]:Port' Radicale should listen on"
++msgstr ""
++"'Hostname:Port' oder 'IPv4:Port' oder '[IPv6]:Port' die Radicale überwachen "
++"soll."
++
++msgid "-- Please choose --"
++msgstr "-- Bitte auswählen --"
++
++msgid "-- custom --"
++msgstr "-- benutzerdefiniert --"
++
++msgid "AUTO"
++msgstr "AUTO"
++
++msgid "Access-Control-Allow-Headers"
++msgstr "Access-Control-Allow-Headers"
++
++msgid "Access-Control-Allow-Methods"
++msgstr "Access-Control-Allow-Methods"
++
++msgid "Access-Control-Allow-Origin"
++msgstr "Access-Control-Allow-Origin"
++
++msgid "Access-Control-Expose-Headers"
++msgstr "Access-Control-Expose-Headers"
++
++msgid "Additional HTTP headers"
++msgstr "Zusätzliche HTTP headers"
++
++msgid "Address:Port"
++msgstr "Adresse:Port"
++
++msgid "Authentication"
++msgstr "Authentifizierung"
++
++msgid ""
++"Authentication login is matched against the 'user' key, and collection's "
++"path is matched against the 'collection' key."
++msgstr ""
++"Der Login wird gegen die 'user' Schlüssel und die Pfadsammlung gegen die "
++"'collection' Schlüssel abgestimmt."
++
++msgid "Authentication method"
++msgstr "Authentifizierungsmethode"
++
++msgid "Authentication method to allow access to Radicale server."
++msgstr ""
++"Authentifizierungsmethode um den Zugang zum Radicale Server zu kontrollieren."
++
++msgid "Auto-start"
++msgstr "Autostart"
++
++msgid "CalDAV/CardDAV"
++msgstr "CalDAV/CardDAV"
++
++msgid ""
++"Calendars and address books are available for both local and remote access, "
++"possibly limited through authentication policies."
++msgstr ""
++"Auf Kalender und Adressbücher kann sowohl Lokal als auch Remote zugegriffen "
++"werden, soweit nicht durch Authentifizierungsrichtlinien begrenzt."
++
++msgid "Certificate file"
++msgstr "Zertifikat Datei"
++
++msgid ""
++"Change here the encoding Radicale will use instead of 'UTF-8' for responses "
++"to the client and/or to store data inside collections."
++msgstr ""
++"Ändern Sie hier die Zeichenkodierung die Radicale anstelle von \"UTF-8\" für "
++"Antworten an den Client und/oder zum Speichern von Daten in einer Sammlung "
++"verwendet."
++
++msgid "Ciphers"
++msgstr "Chiffren"
++
++msgid "Console Log level"
++msgstr "Konsole Protokoll Level"
++
++msgid "Control the access to data collections."
++msgstr "Kontrolliert den Zugriff auf die Daten Sammlungen."
++
++msgid "Critical"
++msgstr "Kritisch"
++
++msgid ""
++"Cross-origin resource sharing (CORS) is a mechanism that allows restricted "
++"resources (e.g. fonts, JavaScript, etc.) on a web page to be requested from "
++"another domain outside the domain from which the resource originated."
++msgstr ""
++"Cross-Origin Resource Sharing (CORS) ist ein Mechanismus, um Webbrowsern "
++"oder auch anderen Webclients Cross-Origin-Requests zu ermöglichen."
++
++msgid "Custom"
++msgstr "Benutzerdefiniert"
++
++msgid "Database"
++msgstr "Datenbank"
++
++msgid "Debug"
++msgstr "Debug"
++
++msgid "Directory"
++msgstr "Verzeichnis"
++
++msgid "Directory not exists/found !"
++msgstr "Verzeichnis nicht gefunden / existiert nicht !"
++
++msgid "Directory required !"
++msgstr "Verzeichnis benötigt !"
++
++msgid "Directory where the rotating log-files are stored"
++msgstr ""
++"Verzeichnis in dem die rollierenden Protokolldateien gespeichert werden"
++
++msgid "Enable HTTPS"
++msgstr "Verwende HTTPS"
++
++msgid ""
++"Enable/Disable auto-start of Radicale on system start-up and interface events"
++msgstr ""
++"Aktiviert/Deaktiviert den Autostart von Radicale beim Systemstart und bei "
++"Schnittstellenereignissen."
++
++msgid "Encoding"
++msgstr "Zeichenkodierung"
++
++msgid "Encoding for responding requests."
++msgstr "Zeichenkodierung für die Beantwortung von Anfragen."
++
++msgid "Encoding for storing local collections."
++msgstr "Zeichenkodierung für die Speicherung von lokalen Sammlungen."
++
++msgid "Encryption method"
++msgstr "Verschlüsselungsmethode"
++
++msgid "Error"
++msgstr "Fehler"
++
++msgid "File '%s' not found !"
++msgstr "Datei '%s' wurde nicht gefunden!"
++
++msgid "File Log level"
++msgstr "Datei Protokoll Level"
++
++msgid "File not found !"
++msgstr "Datei nicht gefunden !"
++
++msgid "File-system"
++msgstr "Dateisystem"
++
++msgid ""
++"For example, for the 'user' key, '.+' means 'authenticated user' and '.*' "
++"means 'anybody' (including anonymous users)."
++msgstr ""
++"Beispiel für den 'user' Schlüssel: '. +' bedeutet 'authentifizierten "
++"Benutzer' und '. *' bedeutet 'jeder' (einschließlich anonyme Benutzer)."
++
++msgid "Full access for Owner only"
++msgstr "Voller Zugriff nur für den Besitzer"
++
++msgid "Full access for authenticated Users"
++msgstr "Voller Zugriff für authentifizierte Benutzer"
++
++msgid "Full access for everybody (including anonymous)"
++msgstr "Vollzugriff für jedermann (auch anonyme)"
++
++msgid "Full path and file name of certificate"
++msgstr "Vollständiger Pfad und Dateiname der Zertifikat Datei"
++
++msgid "Full path and file name of private key"
++msgstr "Vollständiger Pfad und Dateiname der Privaten Schlüsseldatei"
++
++msgid "Info"
++msgstr "Informationen"
++
++msgid "Keep in mind to use the correct hashing algorithm !"
++msgstr "Denken Sie daran, den korrekten Hash-Algorithmus zu verwenden!"
++
++msgid "Leading or ending slashes are trimmed from collection's path."
++msgstr ""
++"Schrägstriche ('/') am Anfang und Ende der Pfadangabe der Sammlung werden "
++"von der Pfadangabe abgeschnitten."
++
++msgid "Log-backup Count"
++msgstr "Protokoll Backup Zähler"
++
++msgid "Log-file Viewer"
++msgstr "Protokolldatei Betrachter"
++
++msgid "Log-file directory"
++msgstr "Protokoll-Datei Verzeichnis"
++
++msgid "Log-file size"
++msgstr "Protokoll Dateigröße"
++
++msgid "Logging"
++msgstr "Protokollierung"
++
++msgid "Logon message"
++msgstr "Anmelde-Hinweis"
++
++msgid "Maximum size of each rotation log-file."
++msgstr "Maximale Größe jeder rollierenden Protokoll-Datei."
++
++msgid "Message displayed in the client when a password is needed."
++msgstr "Meldung im Client, wenn ein Kennwort erforderlich ist."
++
++msgid "NOT installed"
++msgstr "nicht installiert"
++
++msgid "None"
++msgstr "Keine"
++
++msgid "Number of backup files of log to create."
++msgstr "Anzahl der Protokoll Backup Dateien, die angelegt werden."
++
++msgid "OPTIONAL: See python's ssl module for available ciphers"
++msgstr "OPTIONAL: Siehe Python SSL-Modul Dokumentation"
++
++msgid "Owner allow write, authenticated users allow read"
++msgstr ""
++"Besitzer haben Schreibrechte, Authentifizierten Benutzer dürfen nur lesen."
++
++msgid "Path/File required !"
++msgstr "Pfad/Datei erforderlich!"
++
++msgid ""
++"Place here the 'user:password' pairs for your users which should have access "
++"to Radicale."
++msgstr ""
++"Speichern Sie hier die 'user: password' Paare für die Benutzer, die Zugriff "
++"auf Radicale haben sollte."
++
++msgid "Please install current version !"
++msgstr "Installieren Sie bitte die aktuelle Version!"
++
++msgid "Please press [Reload] button below to reread the file."
++msgstr ""
++"Bitte drücken Sie die [Neu laden]-Schaltfläche unten, um die Datei neu "
++"einzulesen."
++
++msgid "Please update to current version !"
++msgstr "Aktualisieren Sie bitte auf die aktuelle Version!"
++
++msgid "Port numbers below 1024 (Privileged ports) are not supported"
++msgstr "Port Nummern unter 1024 (Privileged Ports) werden nicht unterstützt."
++
++msgid "Private key file"
++msgstr "Private Schlüssel Datei"
++
++msgid "Radicale CalDAV/CardDAV Server"
++msgstr "Radicale CalDAV/CardDAV Dienst"
++
++msgid "Radicale uses '/etc/radicale/rights' as regexp-based file."
++msgstr "Radicale verwendet '/etc/radicale/rights' als RegExp-basierte Datei."
++
++msgid "Radicale uses '/etc/radicale/users' as htpasswd file."
++msgstr "Radicale verwendet 'etc/radicale/users' als htpasswd Datei."
++
++msgid "Read only!"
++msgstr "Nur lesbar!"
++
++msgid "RegExp file"
++msgstr "RegExp Datei"
++
++msgid "Reload"
++msgstr "Neu laden"
++
++msgid "Response Encoding"
++msgstr "Antwort Zeichenkodierung"
++
++msgid "Reveal/hide password"
++msgstr "Passwort zeigen/verstecken"
++
++msgid "Rights"
++msgstr "Zugriffsrechte"
++
++msgid "Rights are based on a regexp-based file"
++msgstr "Zugriff basiert auf RegExp-basierter Datei."
++
++msgid "Rights backend"
++msgstr "Zugagsverwaltung"
++
++msgid "SHA-1"
++msgstr "SHA-1"
++
++msgid "SSL Protocol"
++msgstr "SSL Protokol"
++
++msgid "Save"
++msgstr "Speichern"
++
++msgid "Section names are only used for naming the rule."
++msgstr "Abschnittsnamen werden nur für die Benennung der Regel verwendet."
++
++msgid "Server"
++msgstr "Server"
++
++msgid "Setting this parameter to '0' will disable rotation of log-file."
++msgstr ""
++"Wenn dieser Parameter auf '0' gesetzt wird, wird die Protokolldatei nicht "
++"mehr rolliert!"
++
++msgid "Software package '"
++msgstr "Software Packet '"
++
++msgid "Start"
++msgstr "Start"
++
++msgid "Start / Stop"
++msgstr "Start / Stopp"
++
++msgid "Start/Stop Radicale server"
++msgstr "Start / Stopp Radicale Dienst"
++
++msgid "Storage"
++msgstr "Datenspeicher"
++
++msgid "Storage Encoding"
++msgstr "Datenspeicher Kodierung"
++
++msgid "Storage backend"
++msgstr "Datenspeicher Verwaltung"
++
++msgid "Syslog Log level"
++msgstr "Systemlog Level"
++
++msgid "System"
++msgstr "System"
++
++msgid ""
++"The Radicale Project is a complete CalDAV (calendar) and CardDAV (contact) "
++"server solution."
++msgstr ""
++"Das Raidcale Projekt bietet eine vollständige CalDAV (Kalender) und CardDAV "
++"(Adressbuch) Server Lösung."
++
++msgid ""
++"They can be viewed and edited by calendar and contact clients on mobile "
++"phones or computers."
++msgstr ""
++"Diese können von Kalender- und Adressbuch-Anwendungen auf mobilen Endgeräten "
++"und Computern angezeigt und bearbeitet werden."
++
++msgid "To edit the file follow this link!"
++msgstr "Um die Datei zu bearbeiten, folgend Sie dieser Verknüpfung!"
++
++msgid "To view latest log file follow this link!"
++msgstr ""
++"Zur Anzeige der letzten Protokolldatei, folgen Sie dieser Verknüpfung !"
++
++msgid "Value is not an Integer >= 0 !"
++msgstr "Eingabe ist keine Ganzzahl >= 0 !"
++
++msgid "Value required ! Integer >= 0 !"
++msgstr "Eingabe erforderlich ! Ganzzahl >= 0 !"
++
++msgid "Version"
++msgstr "Version"
++
++msgid "Version Information"
++msgstr "Versionsinformationen"
++
++msgid ""
++"WARNING: Only 'File-system' is documented and tested by Radicale development"
++msgstr ""
++"WARNUNG: Nur 'File-system' ist vom Radicale Entwicklerteam derzeit "
++"dokumentiert und getestet."
++
++msgid "Warning"
++msgstr "Warnung"
++
++msgid ""
++"You can also get groups from the user regex in the collection with {0}, {1}, "
++"etc."
++msgstr ""
++
++msgid ""
++"You can use Python's ConfigParser interpolation values %(login)s and "
++"%(path)s."
++msgstr ""
++"Sie können Python ConfigParser Werte '%(login)s' und '%(path)s' verwenden."
++
++msgid "crypt"
++msgstr "crypt"
++
++msgid "custom"
++msgstr "benutzerdefiniert"
++
++msgid "htpasswd file"
++msgstr "htpasswd Datei"
++
++msgid "installed"
++msgstr "installiert"
++
++msgid "or higher"
++msgstr "oder höher"
++
++msgid "plain"
++msgstr "unverschlüsselt"
++
++msgid "required"
++msgstr "erforderlich"
++
++msgid "salted SHA-1"
++msgstr "Salted SHA-1"
++
++#~ msgid "File"
++#~ msgstr "Datei"
++
++#~ msgid "not found !"
++#~ msgstr "nicht gefunden !"
+diff --git a/feeds/luci/applications/luci-app-radicale/po/templates/radicale.pot b/feeds/luci/applications/luci-app-radicale/po/templates/radicale.pot
+new file mode 100644
+index 0000000..c5e0797
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radicale/po/templates/radicale.pot
+@@ -0,0 +1,381 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid ""
++"'AUTO' selects the highest protocol version that client and server support."
++msgstr ""
++
++msgid ""
++"'Hostname:Port' or 'IPv4:Port' or '[IPv6]:Port' Radicale should listen on"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "AUTO"
++msgstr ""
++
++msgid "Access-Control-Allow-Headers"
++msgstr ""
++
++msgid "Access-Control-Allow-Methods"
++msgstr ""
++
++msgid "Access-Control-Allow-Origin"
++msgstr ""
++
++msgid "Access-Control-Expose-Headers"
++msgstr ""
++
++msgid "Additional HTTP headers"
++msgstr ""
++
++msgid "Address:Port"
++msgstr ""
++
++msgid "Authentication"
++msgstr ""
++
++msgid ""
++"Authentication login is matched against the 'user' key, and collection's "
++"path is matched against the 'collection' key."
++msgstr ""
++
++msgid "Authentication method"
++msgstr ""
++
++msgid "Authentication method to allow access to Radicale server."
++msgstr ""
++
++msgid "Auto-start"
++msgstr ""
++
++msgid "CalDAV/CardDAV"
++msgstr ""
++
++msgid ""
++"Calendars and address books are available for both local and remote access, "
++"possibly limited through authentication policies."
++msgstr ""
++
++msgid "Certificate file"
++msgstr ""
++
++msgid ""
++"Change here the encoding Radicale will use instead of 'UTF-8' for responses "
++"to the client and/or to store data inside collections."
++msgstr ""
++
++msgid "Ciphers"
++msgstr ""
++
++msgid "Console Log level"
++msgstr ""
++
++msgid "Control the access to data collections."
++msgstr ""
++
++msgid "Critical"
++msgstr ""
++
++msgid ""
++"Cross-origin resource sharing (CORS) is a mechanism that allows restricted "
++"resources (e.g. fonts, JavaScript, etc.) on a web page to be requested from "
++"another domain outside the domain from which the resource originated."
++msgstr ""
++
++msgid "Custom"
++msgstr ""
++
++msgid "Database"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Directory"
++msgstr ""
++
++msgid "Directory not exists/found !"
++msgstr ""
++
++msgid "Directory required !"
++msgstr ""
++
++msgid "Directory where the rotating log-files are stored"
++msgstr ""
++
++msgid "Enable HTTPS"
++msgstr ""
++
++msgid ""
++"Enable/Disable auto-start of Radicale on system start-up and interface events"
++msgstr ""
++
++msgid "Encoding"
++msgstr ""
++
++msgid "Encoding for responding requests."
++msgstr ""
++
++msgid "Encoding for storing local collections."
++msgstr ""
++
++msgid "Encryption method"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "File '%s' not found !"
++msgstr ""
++
++msgid "File Log level"
++msgstr ""
++
++msgid "File not found !"
++msgstr ""
++
++msgid "File-system"
++msgstr ""
++
++msgid ""
++"For example, for the 'user' key, '.+' means 'authenticated user' and '.*' "
++"means 'anybody' (including anonymous users)."
++msgstr ""
++
++msgid "Full access for Owner only"
++msgstr ""
++
++msgid "Full access for authenticated Users"
++msgstr ""
++
++msgid "Full access for everybody (including anonymous)"
++msgstr ""
++
++msgid "Full path and file name of certificate"
++msgstr ""
++
++msgid "Full path and file name of private key"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Keep in mind to use the correct hashing algorithm !"
++msgstr ""
++
++msgid "Leading or ending slashes are trimmed from collection's path."
++msgstr ""
++
++msgid "Log-backup Count"
++msgstr ""
++
++msgid "Log-file Viewer"
++msgstr ""
++
++msgid "Log-file directory"
++msgstr ""
++
++msgid "Log-file size"
++msgstr ""
++
++msgid "Logging"
++msgstr ""
++
++msgid "Logon message"
++msgstr ""
++
++msgid "Maximum size of each rotation log-file."
++msgstr ""
++
++msgid "Message displayed in the client when a password is needed."
++msgstr ""
++
++msgid "NOT installed"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "Number of backup files of log to create."
++msgstr ""
++
++msgid "OPTIONAL: See python's ssl module for available ciphers"
++msgstr ""
++
++msgid "Owner allow write, authenticated users allow read"
++msgstr ""
++
++msgid "Path/File required !"
++msgstr ""
++
++msgid ""
++"Place here the 'user:password' pairs for your users which should have access "
++"to Radicale."
++msgstr ""
++
++msgid "Please install current version !"
++msgstr ""
++
++msgid "Please press [Reload] button below to reread the file."
++msgstr ""
++
++msgid "Please update to current version !"
++msgstr ""
++
++msgid "Port numbers below 1024 (Privileged ports) are not supported"
++msgstr ""
++
++msgid "Private key file"
++msgstr ""
++
++msgid "Radicale CalDAV/CardDAV Server"
++msgstr ""
++
++msgid "Radicale uses '/etc/radicale/rights' as regexp-based file."
++msgstr ""
++
++msgid "Radicale uses '/etc/radicale/users' as htpasswd file."
++msgstr ""
++
++msgid "Read only!"
++msgstr ""
++
++msgid "RegExp file"
++msgstr ""
++
++msgid "Reload"
++msgstr ""
++
++msgid "Response Encoding"
++msgstr ""
++
++msgid "Reveal/hide password"
++msgstr ""
++
++msgid "Rights"
++msgstr ""
++
++msgid "Rights are based on a regexp-based file"
++msgstr ""
++
++msgid "Rights backend"
++msgstr ""
++
++msgid "SHA-1"
++msgstr ""
++
++msgid "SSL Protocol"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Section names are only used for naming the rule."
++msgstr ""
++
++msgid "Server"
++msgstr ""
++
++msgid "Setting this parameter to '0' will disable rotation of log-file."
++msgstr ""
++
++msgid "Software package '"
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start / Stop"
++msgstr ""
++
++msgid "Start/Stop Radicale server"
++msgstr ""
++
++msgid "Storage"
++msgstr ""
++
++msgid "Storage Encoding"
++msgstr ""
++
++msgid "Storage backend"
++msgstr ""
++
++msgid "Syslog Log level"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid ""
++"The Radicale Project is a complete CalDAV (calendar) and CardDAV (contact) "
++"server solution."
++msgstr ""
++
++msgid ""
++"They can be viewed and edited by calendar and contact clients on mobile "
++"phones or computers."
++msgstr ""
++
++msgid "To edit the file follow this link!"
++msgstr ""
++
++msgid "To view latest log file follow this link!"
++msgstr ""
++
++msgid "Value is not an Integer >= 0 !"
++msgstr ""
++
++msgid "Value required ! Integer >= 0 !"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "Version Information"
++msgstr ""
++
++msgid ""
++"WARNING: Only 'File-system' is documented and tested by Radicale development"
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid ""
++"You can also get groups from the user regex in the collection with {0}, {1}, "
++"etc."
++msgstr ""
++
++msgid ""
++"You can use Python's ConfigParser interpolation values %(login)s and "
++"%(path)s."
++msgstr ""
++
++msgid "crypt"
++msgstr ""
++
++msgid "custom"
++msgstr ""
++
++msgid "htpasswd file"
++msgstr ""
++
++msgid "installed"
++msgstr ""
++
++msgid "or higher"
++msgstr ""
++
++msgid "plain"
++msgstr ""
++
++msgid "required"
++msgstr ""
++
++msgid "salted SHA-1"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radicale/root/etc/uci-defaults/luci-radicale b/feeds/luci/applications/luci-app-radicale/root/etc/uci-defaults/luci-radicale
+new file mode 100755
+index 0000000..333ca65
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radicale/root/etc/uci-defaults/luci-radicale
+@@ -0,0 +1,12 @@
++#!/bin/sh
++
++# no longer needed for "Save and Apply" to restart radicale
++# luci-app-radicale calls /etc/init.d/radicale reload
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@radicale[-1]
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++
++exit 0
+diff --git a/feeds/luci/applications/luci-app-radvd/Makefile b/feeds/luci/applications/luci-app-radvd/Makefile
+new file mode 100644
+index 0000000..9b353ed
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for Radvd
++LUCI_DEPENDS:=+radvd
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/controller/radvd.lua b/feeds/luci/applications/luci-app-radvd/luasrc/controller/radvd.lua
+new file mode 100644
+index 0000000..9c08f4c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/luasrc/controller/radvd.lua
+@@ -0,0 +1,17 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.radvd", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/radvd") then
++ return
++ end
++
++ entry({"admin", "network", "radvd"}, cbi("radvd"), _("Radvd"), 61)
++ entry({"admin", "network", "radvd", "interface"}, cbi("radvd/interface"), nil).leaf = true
++ entry({"admin", "network", "radvd", "prefix"}, cbi("radvd/prefix"), nil).leaf = true
++ entry({"admin", "network", "radvd", "route"}, cbi("radvd/route"), nil).leaf = true
++ entry({"admin", "network", "radvd", "rdnss"}, cbi("radvd/rdnss"), nil).leaf = true
++ entry({"admin", "network", "radvd", "dnssl"}, cbi("radvd/dnssl"), nil).leaf = true
++end
+diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd.lua
+new file mode 100644
+index 0000000..755dcb4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd.lua
+@@ -0,0 +1,324 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("radvd", translate("Radvd"),
++ translate("Radvd is a router advertisement daemon for IPv6. " ..
++ "It listens to router solicitations and sends router advertisements " ..
++ "as described in RFC 4861."))
++
++local nm = require "luci.model.network".init(m.uci)
++local ut = require "luci.util"
++
++
++--
++-- Interfaces
++--
++
++s = m:section(TypedSection, "interface", translate("Interfaces"))
++s.template = "cbi/tblsection"
++s.extedit = luci.dispatcher.build_url("admin/network/radvd/interface/%s")
++s.anonymous = true
++s.addremove = true
++
++function s.create(...)
++ local id = TypedSection.create(...)
++ luci.http.redirect(s.extedit % id)
++end
++
++function s.remove(self, section)
++ if m.uci:get("radvd", section) == "interface" then
++ local iface = m.uci:get("radvd", section, "interface")
++ if iface then
++ m.uci:delete_all("radvd", "prefix",
++ function(s) return s.interface == iface end)
++
++ m.uci:delete_all("radvd", "route",
++ function(s) return s.interface == iface end)
++
++ m.uci:delete_all("radvd", "rdnss",
++ function(s) return s.interface == iface end)
++ end
++ end
++
++ return TypedSection.remove(self, section)
++end
++
++o = s:option(Flag, "ignore", translate("Enable"))
++o.rmempty = false
++o.width = "30px"
++function o.cfgvalue(...)
++ local v = Flag.cfgvalue(...)
++ return v == "1" and "0" or "1"
++end
++function o.write(self, section, value)
++ Flag.write(self, section, value == "1" and "0" or "1")
++end
++
++o = s:option(DummyValue, "interface", translate("Interface"))
++o.template = "cbi/network_netinfo"
++o.width = "10%"
++
++o = s:option(DummyValue, "UnicastOnly", translate("Multicast"))
++function o.cfgvalue(self, section)
++ local v = Value.cfgvalue(self, section)
++ local v2 = m.uci:get("radvd", section, "client")
++ return (v == "1" or (v2 and #v2 > 0)) and translate("no") or translate("yes")
++end
++
++o = s:option(DummyValue, "AdvSendAdvert", translate("Advertising"))
++function o.cfgvalue(...)
++ local v = Value.cfgvalue(...)
++ return v == "1" and translate("yes") or translate("no")
++end
++
++o = s:option(DummyValue, "MaxRtrAdvInterval", translate("Max. interval"))
++function o.cfgvalue(...)
++ local v = Value.cfgvalue(...) or "600"
++ return v .. "s"
++end
++
++o = s:option(DummyValue, "AdvHomeAgentFlag", translate("Mobile IPv6"))
++function o.cfgvalue(...)
++ local v = Value.cfgvalue(...)
++ return v == "1" and translate("yes") or translate("no")
++end
++
++o = s:option(DummyValue, "AdvDefaultPreference", translate("Preference"))
++function o.cfgvalue(...)
++ local v = Value.cfgvalue(...) or "medium"
++ return translate(v)
++end
++
++
++--
++-- Prefixes
++--
++
++s2 = m:section(TypedSection, "prefix", translate("Prefixes"))
++s2.template = "cbi/tblsection"
++s2.extedit = luci.dispatcher.build_url("admin/network/radvd/prefix/%s")
++s2.addremove = true
++s2.anonymous = true
++
++function s2.create(...)
++ local id = TypedSection.create(...)
++ luci.http.redirect(s2.extedit % id)
++end
++
++
++o = s2:option(Flag, "ignore", translate("Enable"))
++o.rmempty = false
++o.width = "30px"
++function o.cfgvalue(...)
++ local v = Flag.cfgvalue(...)
++ return v == "1" and "0" or "1"
++end
++function o.write(self, section, value)
++ Flag.write(self, section, value == "1" and "0" or "1")
++end
++
++o = s2:option(DummyValue, "interface", translate("Interface"))
++o.template = "cbi/network_netinfo"
++o.width = "10%"
++
++pfx = s2:option(DummyValue, "prefix", translate("Prefix"))
++pfx.width = "60%"
++function pfx.cfgvalue(self, section)
++ local v = m.uci:get_list("radvd", section, self.option)
++ local l = { }
++
++ if not v or #v == 0 or (#v == 1 and #v[1] == 0) then
++ local net = nm:get_network(m.uci:get("radvd", section, "interface"))
++ if net then
++ local ifc = nm:get_interface(net:ifname())
++ if ifc then
++ local adr
++ for _, adr in ipairs(ifc:ip6addrs()) do
++ if not adr:is6linklocal() then
++ v = adr:string()
++ break
++ end
++ end
++ end
++ end
++ end
++
++ for v in ut.imatch(v) do
++ v = luci.ip.IPv6(v)
++ if v then
++ l[#l+1] = v:string()
++ end
++ end
++
++ if #l == 0 then
++ l[1] = "?"
++ end
++
++ return table.concat(l, ", ")
++end
++
++o = s2:option(DummyValue, "AdvAutonomous", translate("Autonomous"))
++function o.cfgvalue(...)
++ local v = Value.cfgvalue(...)
++ return v == "1" and translate("yes") or translate("no")
++end
++
++o = s2:option(DummyValue, "AdvOnLink", translate("On-link"))
++function o.cfgvalue(...)
++ local v = Value.cfgvalue(...)
++ return v == "1" and translate("yes") or translate("no")
++end
++
++o = s2:option(DummyValue, "AdvValidLifetime", translate("Validity time"))
++function o.cfgvalue(...)
++ local v = Value.cfgvalue(...) or "86400"
++ return translate(v)
++end
++
++
++--
++-- Routes
++--
++
++s3 = m:section(TypedSection, "route", translate("Routes"))
++s3.template = "cbi/tblsection"
++s3.extedit = luci.dispatcher.build_url("admin/network/radvd/route/%s")
++s3.addremove = true
++s3.anonymous = true
++
++function s3.create(...)
++ local id = TypedSection.create(...)
++ luci.http.redirect(s3.extedit % id)
++end
++
++
++o = s3:option(Flag, "ignore", translate("Enable"))
++o.rmempty = false
++o.width = "30px"
++function o.cfgvalue(...)
++ local v = Flag.cfgvalue(...)
++ return v == "1" and "0" or "1"
++end
++function o.write(self, section, value)
++ Flag.write(self, section, value == "1" and "0" or "1")
++end
++
++o = s3:option(DummyValue, "interface", translate("Interface"))
++o.template = "cbi/network_netinfo"
++o.width = "10%"
++
++o = s3:option(DummyValue, "prefix", translate("Prefix"))
++o.width = "60%"
++o.cfgvalue = pfx.cfgvalue
++
++o = s3:option(DummyValue, "AdvRouteLifetime", translate("Lifetime"))
++function o.cfgvalue(self, section)
++ local v = Value.cfgvalue(self, section) or "1800"
++ return translate(v)
++end
++
++o = s3:option(DummyValue, "AdvRoutePreference", translate("Preference"))
++function o.cfgvalue(self, section)
++ local v = Value.cfgvalue(self, section) or "medium"
++ return translate(v)
++end
++
++
++--
++-- RDNSS
++--
++
++s4 = m:section(TypedSection, "rdnss", translate("RDNSS"))
++s4.template = "cbi/tblsection"
++s4.extedit = luci.dispatcher.build_url("admin/network/radvd/rdnss/%s")
++s4.addremove = true
++s4.anonymous = true
++
++function s4.create(...)
++ local id = TypedSection.create(...)
++ luci.http.redirect(s4.extedit % id)
++end
++
++
++o = s4:option(Flag, "ignore", translate("Enable"))
++o.rmempty = false
++o.width = "30px"
++function o.cfgvalue(...)
++ local v = Flag.cfgvalue(...)
++ return v == "1" and "0" or "1"
++end
++function o.write(self, section, value)
++ Flag.write(self, section, value == "1" and "0" or "1")
++end
++
++o = s4:option(DummyValue, "interface", translate("Interface"))
++o.template = "cbi/network_netinfo"
++o.width = "10%"
++
++o = s4:option(DummyValue, "addr", translate("Address"))
++o.width = "60%"
++o.cfgvalue = pfx.cfgvalue
++
++o = s4:option(DummyValue, "AdvRDNSSLifetime", translate("Lifetime"))
++function o.cfgvalue(self, section)
++ local v = Value.cfgvalue(self, section) or "1200"
++ return translate(v)
++end
++
++
++--
++-- DNSSL
++--
++
++s5 = m:section(TypedSection, "dnssl", translate("DNSSL"))
++s5.template = "cbi/tblsection"
++s5.extedit = luci.dispatcher.build_url("admin/network/radvd/dnssl/%s")
++s5.addremove = true
++s5.anonymous = true
++
++function s5.create(...)
++ local id = TypedSection.create(...)
++ luci.http.redirect(s5.extedit % id)
++end
++
++
++o = s5:option(Flag, "ignore", translate("Enable"))
++o.rmempty = false
++o.width = "30px"
++function o.cfgvalue(...)
++ local v = Flag.cfgvalue(...)
++ return v == "1" and "0" or "1"
++end
++function o.write(self, section, value)
++ Flag.write(self, section, value == "1" and "0" or "1")
++end
++
++o = s5:option(DummyValue, "interface", translate("Interface"))
++o.template = "cbi/network_netinfo"
++o.width = "10%"
++
++o = s5:option(DummyValue, "suffix", translate("Suffix"))
++o.width = "60%"
++function o.cfgvalue(self, section)
++ local v = m.uci:get_list("radvd", section, "suffix")
++ local l = { }
++
++ for v in ut.imatch(v) do
++ l[#l+1] = v
++ end
++
++ if #l == 0 then
++ l[1] = "?"
++ end
++
++ return table.concat(l, ", ")
++end
++
++o = s5:option(DummyValue, "AdvDNSSLLifetime", translate("Lifetime"))
++function o.cfgvalue(self, section)
++ local v = Value.cfgvalue(self, section) or "1200"
++ return translate(v)
++end
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/dnssl.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/dnssl.lua
+new file mode 100644
+index 0000000..d331c25
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/dnssl.lua
+@@ -0,0 +1,88 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local sid = arg[1]
++local utl = require "luci.util"
++
++m = Map("radvd", translatef("Radvd - DNSSL"),
++ translate("Radvd is a router advertisement daemon for IPv6. " ..
++ "It listens to router solicitations and sends router advertisements " ..
++ "as described in RFC 4861."))
++
++m.redirect = luci.dispatcher.build_url("admin/network/radvd")
++
++if m.uci:get("radvd", sid) ~= "dnssl" then
++ luci.http.redirect(m.redirect)
++ return
++end
++
++
++s = m:section(NamedSection, sid, "interface", translate("DNSSL Configuration"))
++s.addremove = false
++
++
++--
++-- General
++--
++
++o = s:option(Flag, "ignore", translate("Enable"))
++o.rmempty = false
++
++function o.cfgvalue(...)
++ local v = Flag.cfgvalue(...)
++ return v == "1" and "0" or "1"
++end
++
++function o.write(self, section, value)
++ Flag.write(self, section, value == "1" and "0" or "1")
++end
++
++
++o = s:option(Value, "interface", translate("Interface"),
++ translate("Specifies the logical interface name this section belongs to"))
++
++o.template = "cbi/network_netlist"
++o.nocreate = true
++o.optional = false
++
++function o.formvalue(...)
++ return Value.formvalue(...) or "-"
++end
++
++function o.validate(self, value)
++ if value == "-" then
++ return nil, translate("Interface required")
++ end
++ return value
++end
++
++function o.write(self, section, value)
++ m.uci:set("radvd", section, "ignore", 0)
++ m.uci:set("radvd", section, "interface", value)
++end
++
++
++o = s:option(DynamicList, "suffix", translate("Suffix"),
++ translate("Advertised Domain Suffixes"))
++
++o.optional = false
++o.rmempty = false
++o.datatype = "hostname"
++function o.cfgvalue(self, section)
++ local l = { }
++ local v = m.uci:get_list("radvd", section, "suffix")
++ for v in utl.imatch(v) do
++ l[#l+1] = v
++ end
++ return l
++end
++
++
++o = s:option(Value, "AdvDNSSLLifetime", translate("Lifetime"),
++ translate("Specifies the maximum duration how long the DNSSL entries are used for name resolution."))
++
++o.datatype = 'or(uinteger,"infinity")'
++o.placeholder = 1200
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/interface.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/interface.lua
+new file mode 100644
+index 0000000..e5d0322
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/interface.lua
+@@ -0,0 +1,265 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local sid = arg[1]
++local utl = require "luci.util"
++
++m = Map("radvd", translatef("Radvd - Interface %q", "?"),
++ translate("Radvd is a router advertisement daemon for IPv6. " ..
++ "It listens to router solicitations and sends router advertisements " ..
++ "as described in RFC 4861."))
++
++m.redirect = luci.dispatcher.build_url("admin/network/radvd")
++
++if m.uci:get("radvd", sid) ~= "interface" then
++ luci.http.redirect(m.redirect)
++ return
++end
++
++m.uci:foreach("radvd", "interface",
++ function(s)
++ if s['.name'] == sid and s.interface then
++ m.title = translatef("Radvd - Interface %q", s.interface)
++ return false
++ end
++ end)
++
++
++s = m:section(NamedSection, sid, "interface", translate("Interface Configuration"))
++s.addremove = false
++
++s:tab("general", translate("General"))
++s:tab("timing", translate("Timing"))
++s:tab("mobile", translate("Mobile IPv6"))
++
++
++--
++-- General
++--
++
++o = s:taboption("general", Flag, "ignore", translate("Enable"))
++o.rmempty = false
++
++function o.cfgvalue(...)
++ local v = Flag.cfgvalue(...)
++ return v == "1" and "0" or "1"
++end
++
++function o.write(self, section, value)
++ Flag.write(self, section, value == "1" and "0" or "1")
++end
++
++
++o = s:taboption("general", Value, "interface", translate("Interface"),
++ translate("Specifies the logical interface name this section belongs to"))
++
++o.template = "cbi/network_netlist"
++o.nocreate = true
++o.optional = false
++
++function o.formvalue(...)
++ return Value.formvalue(...) or "-"
++end
++
++function o.validate(self, value)
++ if value == "-" then
++ return nil, translate("Interface required")
++ end
++ return value
++end
++
++function o.write(self, section, value)
++ m.uci:set("radvd", section, "ignore", 0)
++ m.uci:set("radvd", section, "interface", value)
++end
++
++
++o = s:taboption("general", DynamicList, "client", translate("Clients"),
++ translate("Restrict communication to specified clients, leave empty to use multicast"))
++
++o.rmempty = true
++o.datatype = "ip6addr"
++o.placeholder = "any"
++function o.cfgvalue(...)
++ local v = Value.cfgvalue(...)
++ local l = { }
++ for v in utl.imatch(v) do
++ l[#l+1] = v
++ end
++ return l
++end
++
++
++o = s:taboption("general", Flag, "AdvSendAdvert", translate("Enable advertisements"),
++ translate("Enables router advertisements and solicitations"))
++
++o.rmempty = false
++function o.write(self, section, value)
++ if value == "1" then
++ m.uci:set("radvd", section, "ignore", 0)
++ m.uci:set("radvd", section, "IgnoreIfMissing", 1)
++ end
++
++ m.uci:set("radvd", section, "AdvSendAdvert", value)
++end
++
++
++o = s:taboption("general", Flag, "UnicastOnly", translate("Unicast only"),
++ translate("Indicates that the underlying link is not broadcast capable, prevents unsolicited advertisements from being sent"))
++
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("general", Flag, "AdvManagedFlag", translate("Managed flag"),
++ translate("Enables the additional stateful administered autoconfiguration protocol (RFC2462)"))
++
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("general", Flag, "AdvOtherConfigFlag", translate("Configuration flag"),
++ translate("Enables the autoconfiguration of additional, non address information (RFC2462)"))
++
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("general", Flag, "AdvSourceLLAddress", translate("Source link-layer address"),
++ translate("Includes the link-layer address of the outgoing interface in the RA"))
++
++o.rmempty = false
++o.default = "1"
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("general", Value, "AdvLinkMTU", translate("Link MTU"),
++ translate("Advertises the given link MTU in the RA if specified. 0 disables MTU advertisements"))
++
++o.datatype = "uinteger"
++o.placeholder = 0
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("general", Value, "AdvCurHopLimit", translate("Current hop limit"),
++ translate("Advertises the default Hop Count value for outgoing unicast packets in the RA. 0 disables hopcount advertisements"))
++
++o.datatype = "uinteger"
++o.optional = false
++o.placeholder = 64
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("general", ListValue, "AdvDefaultPreference", translate("Default preference"),
++ translate("Advertises the default router preference"))
++
++o.optional = false
++o.default = "medium"
++o:value("low", translate("low"))
++o:value("medium", translate("medium"))
++o:value("high", translate("high"))
++o:depends("AdvSendAdvert", "1")
++
++
++--
++-- Timing
++--
++
++o = s:taboption("timing", Value, "MinRtrAdvInterval", translate("Minimum advertisement interval"),
++ translate("The minimum time allowed between sending unsolicited multicast router advertisements from the interface, in seconds"))
++
++o.datatype = "uinteger"
++o.optional = false
++o.placeholder = 198
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("timing", Value, "MaxRtrAdvInterval", translate("Maximum advertisement interval"),
++ translate("The maximum time allowed between sending unsolicited multicast router advertisements from the interface, in seconds"))
++
++o.datatype = "uinteger"
++o.optional = false
++o.placeholder = 600
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("timing", Value, "MinDelayBetweenRAs", translate("Minimum advertisement delay"),
++ translate("The minimum time allowed between sending multicast router advertisements from the interface, in seconds"))
++
++o.datatype = "uinteger"
++o.optional = false
++o.placeholder = 3
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("timing", Value, "AdvReachableTime", translate("Reachable time"),
++ translate("Advertises assumed reachability time in milliseconds of neighbours in the RA if specified. 0 disables reachability advertisements"))
++
++o.datatype = "uinteger"
++o.optional = false
++o.placeholder = 0
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("timing", Value, "AdvRetransTimer", translate("Retransmit timer"),
++ translate("Advertises wait time in milliseconds between Neighbor Solicitation messages in the RA if specified. 0 disables retransmit advertisements"))
++
++o.datatype = "uinteger"
++o.optional = false
++o.placeholder = 0
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("timing", Value, "AdvDefaultLifetime", translate("Default lifetime"),
++ translate("Advertises the lifetime of the default router in seconds. 0 indicates that the node is no default router"))
++
++o.datatype = "uinteger"
++o.optional = false
++o.placeholder = 1800
++o:depends("AdvSendAdvert", "1")
++
++
++--
++-- Mobile
++--
++
++o = s:taboption("mobile", Flag, "AdvHomeAgentFlag", translate("Advertise Home Agent flag"),
++ translate("Advertises Mobile IPv6 Home Agent capability (RFC3775)"))
++
++o:depends("AdvSendAdvert", "1")
++
++
++o = s:taboption("mobile", Flag, "AdvIntervalOpt", translate("Mobile IPv6 interval option"),
++ translate("Include Mobile IPv6 Advertisement Interval option to RA"))
++
++o:depends({AdvHomeAgentFlag = "1", AdvSendAdvert = "1"})
++
++
++o = s:taboption("mobile", Flag, "AdvHomeAgentInfo", translate("Home Agent information"),
++ translate("Include Home Agent Information in the RA"))
++
++o:depends({AdvHomeAgentFlag = "1", AdvSendAdvert = "1"})
++
++
++o = s:taboption("mobile", Flag, "AdvMobRtrSupportFlag", translate("Mobile IPv6 router registration"),
++ translate("Advertises Mobile Router registration capability (NEMO Basic)"))
++
++o:depends({AdvHomeAgentInfo = "1", AdvSendAdvert = "1"})
++
++
++o = s:taboption("mobile", Value, "HomeAgentLifetime", translate("Home Agent lifetime"),
++ translate("Advertises the time in seconds the router is offering Mobile IPv6 Home Agent services"))
++
++o.datatype = "uinteger"
++o.optional = false
++o.placeholder = 1800
++o:depends({AdvHomeAgentInfo = "1", AdvSendAdvert = "1"})
++
++
++o = s:taboption("mobile", Value, "HomeAgentPreference", translate("Home Agent preference"),
++ translate("The preference for the Home Agent sending this RA"))
++
++o.datatype = "uinteger"
++o.optional = false
++o.placeholder = 0
++o:depends({AdvHomeAgentInfo = "1", AdvSendAdvert = "1"})
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/prefix.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/prefix.lua
+new file mode 100644
+index 0000000..a2b4285
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/prefix.lua
+@@ -0,0 +1,128 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local sid = arg[1]
++local utl = require "luci.util"
++
++m = Map("radvd", translatef("Radvd - Prefix"),
++ translate("Radvd is a router advertisement daemon for IPv6. " ..
++ "It listens to router solicitations and sends router advertisements " ..
++ "as described in RFC 4861."))
++
++m.redirect = luci.dispatcher.build_url("admin/network/radvd")
++
++if m.uci:get("radvd", sid) ~= "prefix" then
++ luci.http.redirect(m.redirect)
++ return
++end
++
++
++s = m:section(NamedSection, sid, "interface", translate("Prefix Configuration"))
++s.addremove = false
++
++s:tab("general", translate("General"))
++s:tab("advanced", translate("Advanced"))
++
++
++--
++-- General
++--
++
++o = s:taboption("general", Flag, "ignore", translate("Enable"))
++o.rmempty = false
++
++function o.cfgvalue(...)
++ local v = Flag.cfgvalue(...)
++ return v == "1" and "0" or "1"
++end
++
++function o.write(self, section, value)
++ Flag.write(self, section, value == "1" and "0" or "1")
++end
++
++
++o = s:taboption("general", Value, "interface", translate("Interface"),
++ translate("Specifies the logical interface name this section belongs to"))
++
++o.template = "cbi/network_netlist"
++o.nocreate = true
++o.optional = false
++
++function o.formvalue(...)
++ return Value.formvalue(...) or "-"
++end
++
++function o.validate(self, value)
++ if value == "-" then
++ return nil, translate("Interface required")
++ end
++ return value
++end
++
++function o.write(self, section, value)
++ m.uci:set("radvd", section, "ignore", 0)
++ m.uci:set("radvd", section, "interface", value)
++end
++
++
++o = s:taboption("general", DynamicList, "prefix", translate("Prefixes"),
++ translate("Advertised IPv6 prefixes. If empty, the current interface prefix is used"))
++
++o.optional = true
++o.datatype = "ip6addr"
++o.placeholder = translate("default")
++function o.cfgvalue(self, section)
++ local l = { }
++ local v = m.uci:get_list("radvd", section, "prefix")
++ for v in utl.imatch(v) do
++ l[#l+1] = v
++ end
++ return l
++end
++
++
++o = s:taboption("general", Flag, "AdvOnLink", translate("On-link determination"),
++ translate("Indicates that this prefix can be used for on-link determination (RFC4861)"))
++
++o.rmempty = false
++o.default = "1"
++
++
++o = s:taboption("general", Flag, "AdvAutonomous", translate("Autonomous"),
++ translate("Indicates that this prefix can be used for autonomous address configuration (RFC4862)"))
++
++o.rmempty = false
++o.default = "1"
++
++
++--
++-- Advanced
++--
++
++o = s:taboption("advanced", Flag, "AdvRouterAddr", translate("Advertise router address"),
++ translate("Indicates that the address of interface is sent instead of network prefix, as is required by Mobile IPv6"))
++
++
++o = s:taboption("advanced", Value, "AdvValidLifetime", translate("Valid lifetime"),
++ translate("Advertises the length of time in seconds that the prefix is valid for the purpose of on-link determination."))
++
++o.datatype = 'or(uinteger,"infinity")'
++o.placeholder = 86400
++
++
++o = s:taboption("advanced", Value, "AdvPreferredLifetime", translate("Preferred lifetime"),
++ translate("Advertises the length of time in seconds that addresses generated from the prefix via stateless address autoconfiguration remain preferred."))
++
++o.datatype = 'or(uinteger,"infinity")'
++o.placeholder = 14400
++
++
++o = s:taboption("advanced", Value, "Base6to4Interface", translate("6to4 interface"),
++ translate("Specifies a logical interface name to derive a 6to4 prefix from. The interfaces public IPv4 address is combined with 2002::/3 and the value of the prefix option"))
++
++o.template = "cbi/network_netlist"
++o.nocreate = true
++o.unspecified = true
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/rdnss.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/rdnss.lua
+new file mode 100644
+index 0000000..d6588ac
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/rdnss.lua
+@@ -0,0 +1,89 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local sid = arg[1]
++local utl = require "luci.util"
++
++m = Map("radvd", translatef("Radvd - RDNSS"),
++ translate("Radvd is a router advertisement daemon for IPv6. " ..
++ "It listens to router solicitations and sends router advertisements " ..
++ "as described in RFC 4861."))
++
++m.redirect = luci.dispatcher.build_url("admin/network/radvd")
++
++if m.uci:get("radvd", sid) ~= "rdnss" then
++ luci.http.redirect(m.redirect)
++ return
++end
++
++
++s = m:section(NamedSection, sid, "interface", translate("RDNSS Configuration"))
++s.addremove = false
++
++
++--
++-- General
++--
++
++o = s:option(Flag, "ignore", translate("Enable"))
++o.rmempty = false
++
++function o.cfgvalue(...)
++ local v = Flag.cfgvalue(...)
++ return v == "1" and "0" or "1"
++end
++
++function o.write(self, section, value)
++ Flag.write(self, section, value == "1" and "0" or "1")
++end
++
++
++o = s:option(Value, "interface", translate("Interface"),
++ translate("Specifies the logical interface name this section belongs to"))
++
++o.template = "cbi/network_netlist"
++o.nocreate = true
++o.optional = false
++
++function o.formvalue(...)
++ return Value.formvalue(...) or "-"
++end
++
++function o.validate(self, value)
++ if value == "-" then
++ return nil, translate("Interface required")
++ end
++ return value
++end
++
++function o.write(self, section, value)
++ m.uci:set("radvd", section, "ignore", 0)
++ m.uci:set("radvd", section, "interface", value)
++end
++
++
++o = s:option(DynamicList, "addr", translate("Addresses"),
++ translate("Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface is used"))
++
++o.optional = false
++o.rmempty = true
++o.datatype = "ip6addr"
++o.placeholder = translate("default")
++function o.cfgvalue(self, section)
++ local l = { }
++ local v = m.uci:get_list("radvd", section, "addr")
++ for v in utl.imatch(v) do
++ l[#l+1] = v
++ end
++ return l
++end
++
++
++o = s:option(Value, "AdvRDNSSLifetime", translate("Lifetime"),
++ translate("Specifies the maximum duration how long the RDNSS entries are used for name resolution."))
++
++o.datatype = 'or(uinteger,"infinity")'
++o.placeholder = 1200
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/route.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/route.lua
+new file mode 100644
+index 0000000..1aac27a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/route.lua
+@@ -0,0 +1,97 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local sid = arg[1]
++local utl = require "luci.util"
++
++m = Map("radvd", translatef("Radvd - Route"),
++ translate("Radvd is a router advertisement daemon for IPv6. " ..
++ "It listens to router solicitations and sends router advertisements " ..
++ "as described in RFC 4861."))
++
++m.redirect = luci.dispatcher.build_url("admin/network/radvd")
++
++if m.uci:get("radvd", sid) ~= "route" then
++ luci.http.redirect(m.redirect)
++ return
++end
++
++
++s = m:section(NamedSection, sid, "interface", translate("Route Configuration"))
++s.addremove = false
++
++
++--
++-- General
++--
++
++o = s:option(Flag, "ignore", translate("Enable"))
++o.rmempty = false
++
++function o.cfgvalue(...)
++ local v = Flag.cfgvalue(...)
++ return v == "1" and "0" or "1"
++end
++
++function o.write(self, section, value)
++ Flag.write(self, section, value == "1" and "0" or "1")
++end
++
++
++o = s:option(Value, "interface", translate("Interface"),
++ translate("Specifies the logical interface name this section belongs to"))
++
++o.template = "cbi/network_netlist"
++o.nocreate = true
++o.optional = false
++
++function o.formvalue(...)
++ return Value.formvalue(...) or "-"
++end
++
++function o.validate(self, value)
++ if value == "-" then
++ return nil, translate("Interface required")
++ end
++ return value
++end
++
++function o.write(self, section, value)
++ m.uci:set("radvd", section, "ignore", 0)
++ m.uci:set("radvd", section, "interface", value)
++end
++
++
++o = s:option(DynamicList, "prefix", translate("Prefixes"),
++ translate("Advertised IPv6 prefixes"))
++
++o.rmempty = false
++o.datatype = "ip6addr"
++o.placeholder = translate("default")
++function o.cfgvalue(self, section)
++ local l = { }
++ local v = m.uci:get_list("radvd", section, "prefix")
++ for v in utl.imatch(v) do
++ l[#l+1] = v
++ end
++ return l
++end
++
++
++o = s:option(Value, "AdvRouteLifetime", translate("Lifetime"),
++ translate("Specifies the lifetime associated with the route in seconds."))
++
++o.datatype = 'or(uinteger,"infinity")'
++o.placeholder = 1800
++
++
++o = s:option(ListValue, "AdvRoutePreference", translate("Preference"),
++ translate("Specifies the preference associated with the default router"))
++
++o.default = "medium"
++o:value("low", translate("low"))
++o:value("medium", translate("medium"))
++o:value("high", translate("high"))
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-radvd/po/ca/radvd.po b/feeds/luci/applications/luci-app-radvd/po/ca/radvd.po
+new file mode 100644
+index 0000000..a9a317d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/ca/radvd.po
+@@ -0,0 +1,382 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-02 21:41+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: German\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "6to4 interface"
++msgstr "Interfície 6to4"
++
++msgid "Address"
++msgstr "Adreça"
++
++msgid "Addresses"
++msgstr "Adreces"
++
++msgid "Advanced"
++msgstr "Avançat"
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr "Sufixos de domini publicats"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Prefixos IPv6 publicats"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr "Publicació"
++
++msgid "Autonomous"
++msgstr "Autònom"
++
++msgid "Clients"
++msgstr "Clients"
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "Configuració DNSSL"
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr "Preferència per defecte"
++
++msgid "Enable"
++msgstr "Habilita"
++
++msgid "Enable advertisements"
++msgstr "Habilita la publicitat"
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr "General"
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++"Indica que la enllaç subjacent no és capaç de la difusió, prevén que les "
++"publicitats no sol·licitats es enviïn"
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfície"
++
++msgid "Interface Configuration"
++msgstr "Configuració d'interfície"
++
++msgid "Interface required"
++msgstr "Interfície requerida"
++
++msgid "Interfaces"
++msgstr "Interfícies"
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr "IPv6 mòbil"
++
++msgid "Mobile IPv6 interval option"
++msgstr "Opció d'interval d'IPv6 mòbil"
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr "Difusió selectiva"
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr "Prefix"
++
++msgid "Prefix Configuration"
++msgstr "Configuració de prefix"
++
++msgid "Prefixes"
++msgstr "Prefixos"
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr "Configuració RDNSS"
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - Interfície %q"
++
++msgid "Radvd - Prefix"
++msgstr "Radvd - Prefix"
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr "Radvd - Ruta"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++"El Radvd és un dimoni de publicitat d'encaminador per IPv6. Escolta per "
++"sol·licituds i envia publicitats d'encaminador com descrit en RFC 4861."
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++"Restringeix la comunicació a clients especificats, deixeu en blanc per "
++"utilitzar la difusió selectiva"
++
++msgid "Retransmit timer"
++msgstr "Temporitzador de retransmissió"
++
++msgid "Route Configuration"
++msgstr "Configuració de ruta"
++
++msgid "Routes"
++msgstr "Rutes"
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr "Sufix"
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"El temps màxim permès entre enviar publicitats d'encaminador de difusió "
++"selectiva no sol·licitats des de la interfície, en segons"
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++"El temps mínim permès entre enviar publicitats d'encaminador de difusió "
++"selectiva des de la interfície, en segons"
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"El temps mínim permès entre enviar publicitats d'encaminador de difusió "
++"selectiva no sol·licitats des de la interfície, en segons"
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr "Sincronització"
++
++msgid "Unicast only"
++msgstr "Només unidifusió"
++
++msgid "Valid lifetime"
++msgstr "Durada de vida vàlida"
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr "per defecte"
++
++msgid "high"
++msgstr "alt"
++
++msgid "low"
++msgstr "baix"
++
++msgid "medium"
++msgstr "mitjà"
++
++msgid "no"
++msgstr "no"
++
++msgid "yes"
++msgstr "sí"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/cs/radvd.po b/feeds/luci/applications/luci-app-radvd/po/cs/radvd.po
+new file mode 100644
+index 0000000..ab4e4af
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/cs/radvd.po
+@@ -0,0 +1,389 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-08-04 19:04+0200\n"
++"Last-Translator: KubaCZ <kuba.turek@centrum.cz>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "6to4 interface"
++msgstr "6to4 rozhraní"
++
++msgid "Address"
++msgstr "Adresa"
++
++msgid "Addresses"
++msgstr "Adresy"
++
++msgid "Advanced"
++msgstr "PokroÄilé"
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr "Oznamovat adresu routeru"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Oznamované doménové přípony"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"Oznamované IPv6 RDNSS. Pokud prázdné, bude použita stávající IPv6 adresa "
++"rozhraní."
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Oznamované IPv6 prefixy"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Oznamované IPv6 prefixy. Pokud prázdné, bude použit stávající prefix na "
++"rozhraní."
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++"Oznamovaná doba za kterou by sousední stroje měly být dosažitelné. 0 znamená "
++"neoznamovat."
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++"Oznamovaný výchozí poÄet hopů pro odchozí unicast pakety. 0 vypne oznamování "
++"poÄtu hopů."
++
++msgid "Advertises the default router preference"
++msgstr "Oznamovaný preferovaný router."
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr "Oznamovat MTU linky. 0 vypne oznamování MTU."
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++"Oznamovaný poÄet sekund po kterých adresa generovaná z prefixu bezestavové "
++"konfigurace zůstává preferovaná."
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++"Oznamovaný poÄet sekund po kterou je prefix validní pro potÅ™eby zjiÅ¡tÄ›ní "
++"stavu on-link/off-link."
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++"Oznamovaný poÄet sekund k vyprÅ¡ení platnosti preference routeru. 0 zanÄí že "
++"není žádný router preferován."
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++"Oznamovaný poÄet sekund k vyprÅ¡ení nabízení služeb Mobile IPv6 Home Agenta"
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++"Oznamovaný poÄet milisekund mezi Neighbor Solicitation zprávamy. 0 vypne "
++"oznamování."
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr "Autonomní"
++
++msgid "Clients"
++msgstr "Klienti"
++
++msgid "Configuration flag"
++msgstr "KonfiguraÄní volba"
++
++msgid "Current hop limit"
++msgstr "Aktuální limit poÄtu hopů"
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "Konfigurace DNSSL"
++
++msgid "Default lifetime"
++msgstr "Výchozí Äasový limit"
++
++msgid "Default preference"
++msgstr "Výchozí preference"
++
++msgid "Enable"
++msgstr "Povolit"
++
++msgid "Enable advertisements"
++msgstr "Povolit oznamování"
++
++msgid "Enables router advertisements and solicitations"
++msgstr "Povolí oznamování routeru a hledání sousedů"
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++"Povolí přídavný stavový administrovaný autokonfiguraÄní protokol (RFC2462)"
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr "Povolí autokonfiguraci přídavného, neadresních informací (RFC2462)"
++
++msgid "General"
++msgstr "Obecné"
++
++msgid "Home Agent information"
++msgstr "Informace Home Agenta"
++
++msgid "Home Agent lifetime"
++msgstr "Časový limit Home Agenta"
++
++msgid "Home Agent preference"
++msgstr "Preferovaný Home Agent"
++
++msgid "Include Home Agent Information in the RA"
++msgstr "Zahrnout informace o Home Agentovi v oznámeních"
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr "Rozhraní"
++
++msgid "Interface Configuration"
++msgstr "Konfigurace rozhraní"
++
++msgid "Interface required"
++msgstr "Rozhraní vyžadováno"
++
++msgid "Interfaces"
++msgstr "Rozhraní"
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr "Max. interval"
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr "Multicast"
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr "Prefix"
++
++msgid "Prefix Configuration"
++msgstr "Nastavení prefixu"
++
++msgid "Prefixes"
++msgstr "Prefixy"
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr "Konfigurace RDNSS"
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - rozhraní %q"
++
++msgid "Radvd - Prefix"
++msgstr "Radvd - Prefix"
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr "Radvd - Route"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr "Dostupný Äas"
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr "Trasy"
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr "Suffix"
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr "NaÄasování"
++
++msgid "Unicast only"
++msgstr "Pouze unicast"
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr "Doba platnosti"
++
++msgid "default"
++msgstr "výchozí"
++
++msgid "high"
++msgstr "vysoká"
++
++msgid "low"
++msgstr "nízká"
++
++msgid "medium"
++msgstr "střední"
++
++msgid "no"
++msgstr "ne"
++
++# ano
++msgid "yes"
++msgstr "ano"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/de/radvd.po b/feeds/luci/applications/luci-app-radvd/po/de/radvd.po
+new file mode 100644
+index 0000000..a294619
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/de/radvd.po
+@@ -0,0 +1,483 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-15 16:46+0200\n"
++"Last-Translator: Jo-Philipp <jow@openwrt.org>\n"
++"Language-Team: German\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "6to4 interface"
++msgstr "6to4-Schnittstelle"
++
++msgid "Address"
++msgstr "Adresse"
++
++msgid "Addresses"
++msgstr "Adressen"
++
++msgid "Advanced"
++msgstr "Erweitert"
++
++msgid "Advertise Home Agent flag"
++msgstr "Home-Agent Funktionalität ankündigen"
++
++msgid "Advertise router address"
++msgstr "Router-Adresse ankündigen"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Angekündigte Domain-Suffixes"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"Angekündigte rekursive IPv6 DNS Server. Wenn leer wird die aktuelle IPv6-"
++"Adresse der Schnittstelle verwendet"
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Angekündigte IPv6-Prefixe"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Angekündigte IPv6-Subnetze in CIDR-Notation. Wenn leer wird das aktuelle "
++"IPv6-Prefix der Schnittstelle verwendet"
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr "Kündigt \"Mobile IPv6 Home Agent\"-Fähigkeit an (RFC3775)"
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr "Kündigt \"Mobile Router Registration\"-Fähigkeit an (NEMO Basic)"
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++"Kündigt die angenommene Erreichbarkeit von Nachbarn als Zeitspanne in "
++"Millisekunden an, sofern gegeben. Der Wert \"0\" deaktiviert "
++"Erreichbarkeitsankündigungen"
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++"Kündigt den Standard Hop-Count-Wert für ausgehende Unicast-Pakete an. Der "
++"Wert \"0\" deaktiviert Hop-Count-Ankündigungen"
++
++msgid "Advertises the default router preference"
++msgstr "Kündigt das Vorhandensein des Default-Routers an"
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++"Kündigt die gegebene Verbindungs-MTU an wenn gegeben. Der Wert \"0\" "
++"deaktiviert MTU-Ankündigungen"
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++"Kündigt den Zeitraum an, in dem die vom angekündigtem Prefix generierte "
++"Adresse bevorzugt bleibt, als Zeitspanne in Sekunden."
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++"Kündigt den Zeitraum in Sekunden an, in dem der Prefix für On-Link-"
++"Ermittlung gültig ist."
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++"Kündigt die Gültigskeitsdauer des Defaultrouters in Sekunden an. Der Wert \"0"
++"\" impliziert dass dieser Knoten kein Default-Router ist"
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++"Kündigt die Zeitspanne in Sekunden an, in der der Router \"Mobile IPv6 Home "
++"Agent\"-Dienste anbietet"
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++"Kündigt die vorgegebene Wartezeit zwischen wiederholt versendeten Neighbor-"
++"Solicitation-Nachrichten als Zeitspanne in Millisekunden an, wenn gegeben. "
++"Der Wert \"0\" deaktiviert die Ankündigung der Wartezeit"
++
++msgid "Advertising"
++msgstr "Ankündigend"
++
++msgid "Autonomous"
++msgstr "Autonom"
++
++msgid "Clients"
++msgstr "Clienten"
++
++msgid "Configuration flag"
++msgstr "Konfigurations-Bit"
++
++msgid "Current hop limit"
++msgstr "Aktuelles Hop-Limit"
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "DNSSL-Konfiguration"
++
++msgid "Default lifetime"
++msgstr "Standard-Gültigkeitszeitraum"
++
++msgid "Default preference"
++msgstr "Standard-Priorität"
++
++msgid "Enable"
++msgstr "Aktivieren"
++
++msgid "Enable advertisements"
++msgstr "Ankündigungen aktivieren"
++
++msgid "Enables router advertisements and solicitations"
++msgstr "Aktiviert Router-Ankündigungen und Solicitations"
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++"Aktiviert das zusätzliche \"Stateful Administered Autoconfiguration Protocol"
++"\" (RFC2462)"
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++"Aktiviert die Auto-Konfiguration von zusätzlichen, Nicht-Adress-"
++"Eigenschaften (RFC2462)"
++
++msgid "General"
++msgstr "Allgemein"
++
++msgid "Home Agent information"
++msgstr "Home-Agent-Information"
++
++msgid "Home Agent lifetime"
++msgstr "Home-Agent-Gültigkeitsdauer"
++
++msgid "Home Agent preference"
++msgstr "Home-Agent-Priorität"
++
++msgid "Include Home Agent Information in the RA"
++msgstr "Home-Agent-Informationen in die RA-Nachricht einfügen"
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr "Mobile-IPv6-Ankündigungsintervall in die RA-Nachricht einfügen"
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++"Link-Layer-Adresse der ausgehenden Schnittstelle in die RA-Nachricht einfügen"
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++"Zeigt an, dass die Adresse der Schnittstelle statt einem Netzwerk-Prefix "
++"gesendet wird - benötigt für Mobile IPv6"
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++"Zeigt an, dass die zugrundeliegende Verbindung keinen Broadcast-Verkehr "
++"beherrscht, verhindert das Senden unaufgeforderter Ankündigungsnachrichten"
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++"Zeigt an, dass das angekündigte Prefix für autonome Adress-Konfiguration "
++"genutzt werden kann (RFC4862)"
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++"Zeigt an, dass das Prefix für On-Link-Ermittlungen genutzt werden kann "
++"(RFC4861)"
++
++msgid "Interface"
++msgstr "Schnittstelle"
++
++msgid "Interface Configuration"
++msgstr "Schnittstellenkonfiguration"
++
++msgid "Interface required"
++msgstr "Schnittstelle benötigt"
++
++msgid "Interfaces"
++msgstr "Schnittstellen"
++
++msgid "Lifetime"
++msgstr "Gültigkeitsdauer"
++
++msgid "Link MTU"
++msgstr "Verbindungs-MTU"
++
++msgid "Managed flag"
++msgstr "Managed-Bit"
++
++msgid "Max. interval"
++msgstr "Max. Intervall"
++
++msgid "Maximum advertisement interval"
++msgstr "Maximales Ankündigungsintervall"
++
++msgid "Minimum advertisement delay"
++msgstr "Minimale Ankündigungsverzögerung"
++
++msgid "Minimum advertisement interval"
++msgstr "Minimales Ankündigungsintervall"
++
++msgid "Mobile IPv6"
++msgstr "Mobile IPv6"
++
++msgid "Mobile IPv6 interval option"
++msgstr "Mobile-IPv6-Intervall-Option"
++
++msgid "Mobile IPv6 router registration"
++msgstr "Mobile-IPv6-Router-Registrierung"
++
++msgid "Multicast"
++msgstr "Multicast"
++
++msgid "On-link"
++msgstr "On-Link"
++
++msgid "On-link determination"
++msgstr "On-Link-Ermittlung"
++
++msgid "Preference"
++msgstr "Priorität"
++
++msgid "Preferred lifetime"
++msgstr "Bevorzugte Gültigkeitsdauer"
++
++msgid "Prefix"
++msgstr "Prefix"
++
++msgid "Prefix Configuration"
++msgstr "Prefix-Konfiguration"
++
++msgid "Prefixes"
++msgstr "Prefixes"
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr "RDNSS-Konfiguration"
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - Schnittstelle %q"
++
++msgid "Radvd - Prefix"
++msgstr "Radvd - Prefix"
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr "Radvd - Route"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++"Radvd ist ein Router-Advertisement-Dienst für IPv6. Er hört auf Router-"
++"Solicitations und sendet Ankündigungen wie in RFC 4861 spezifiziert."
++
++msgid "Reachable time"
++msgstr "Erreichbarkeitsdauer"
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++"Kommunikation auf angegebene Clients beschränken, leer lassen um Multicast "
++"zu nutzen"
++
++msgid "Retransmit timer"
++msgstr "Taktung von Neu-Ãœbertragungen"
++
++msgid "Route Configuration"
++msgstr "Routen-Konfiguration"
++
++msgid "Routes"
++msgstr "Routen"
++
++msgid "Source link-layer address"
++msgstr "Quell-Link-Layer-Adresse"
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++"Spezifiziert eine Schnittstelle, von welcher das 6to4-Prefix abgeleitet "
++"wird. Die öffentliche IPv4-Adresse der Schnittstelle wird dazu mit dem "
++"Subnetz 2002::/3 und dem Wert der Prefix-Option kombiniert"
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr "Bestimmt die Gültigkeitsdauer dieser Route."
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr "Bestimmt die Schnittstelle, zu welcher diese Sektion gehört"
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++"Bestimmt die maximale Dauer, für welche die DNSSL-Einträge gültig zur "
++"Namensauflösung sind."
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++"Bestimmt die maximale Dauer, für welche die RDNSS-Einträge gültig zur "
++"Namensauflösung sind."
++
++msgid "Specifies the preference associated with the default router"
++msgstr "Bestimmt die mit diesem Router assoziierte Priorität"
++
++msgid "Suffix"
++msgstr "Suffix"
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"Die maximal erlaubte Wartezeit zwischen dem Versand aufeinanderfolgender, "
++"unaufgeforderter Mutlicast-Router-Ankündigungen auf dieser Schnittstelle als "
++"Zeitspanne in Sekunden"
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++"Die minimal erlaubte Wartezeit zwischen dem Versand aufeinanderfolgender "
++"Router-Ankündigungen auf dieser Schnittstelle als Zeitspanne in Sekunden"
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"Die minimal erlaubte Wartezeit zwischen dem Versand aufeinanderfolgender, "
++"unaufgeforderter Mutlicast-Router-Ankündigungen auf dieser Schnittstelle als "
++"Zeitspanne in Sekunden"
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr "Die Priorität des ankündigendem \"IPv6 Home Agent\""
++
++msgid "Timing"
++msgstr "Taktung"
++
++msgid "Unicast only"
++msgstr "Nur Unicast"
++
++msgid "Valid lifetime"
++msgstr "Gültigkeitsdauer"
++
++msgid "Validity time"
++msgstr "Gültigkeitsdauer"
++
++msgid "default"
++msgstr "Standard"
++
++msgid "high"
++msgstr "hoch"
++
++msgid "low"
++msgstr "niedrig"
++
++msgid "medium"
++msgstr "mittel"
++
++msgid "no"
++msgstr "nein"
++
++msgid "yes"
++msgstr "ja"
++
++#~ msgid "Advertised IPv6 prefix"
++#~ msgstr "Angekündigtes IPv6-Prefix"
++
++#~ msgid ""
++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used"
++#~ msgstr ""
++#~ "Angekündigtes IPv6-Subnetz in CIDR-Notation. Wenn leer wird das aktuelle "
++#~ "IPv6-Prefix der Schnittstelle verwendet"
++
++#~ msgid ""
++#~ "Advertises the length of time in seconds that addresses generated from "
++#~ "the prefix via stateless address autoconfiguration remain preferred. Use "
++#~ "0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Kündigt den Zeitraum an, in dem die vom angekündigtem Prefix generierte "
++#~ "Adresse bevorzugt bleibt, als Zeitspanne in Sekunden. Der Wert \"0\" "
++#~ "spezifiziert eine unbegrenzte Gültigkeitsspanne"
++
++#~ msgid ""
++#~ "Advertises the length of time in seconds that the prefix is valid for the "
++#~ "purpose of on-link determination. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Kündigt den Zeitraum in Sekunden an, in dem der Prefix für On-Link-"
++#~ "Ermittlung gültig ist. Der Wert \"0\" spezifiziert eine unbegrenzte "
++#~ "Gültigkeitsspanne"
++
++#~ msgid ""
++#~ "Indicates whether that RDNSS continues to be available to hosts even if "
++#~ "they moved to a different subnet"
++#~ msgstr ""
++#~ "Zeigt an, ob dieser rekursive DNS Server von anderen Subnetzen aus "
++#~ "verfügbar bleibt"
++
++#~ msgid "Open"
++#~ msgstr "Offen"
++
++#~ msgid ""
++#~ "Specifies the lifetime associated with the route in seconds. Use 0 to "
++#~ "specify an infinite lifetime"
++#~ msgstr ""
++#~ "Bestimmt die Gültigkeitsdauer dieser Route. Der Wert \"0\" spezifiziert "
++#~ "einen unbegrenzten Zeitraum"
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the DNSSL entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Bestimmt die maximale Dauer, für welche die DNSSL-Einträge gültig zur "
++#~ "Namensauflösung sind. Der Wert \"0\" spezifiziert einen unbegrenzten "
++#~ "Zeitraum"
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the RDNSS entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Bestimmt die maximale Dauer, für welche die RDNSS-Einträge gültig zur "
++#~ "Namensauflösung sind. Der Wert \"0\" spezifiziert einen unbegrenzten "
++#~ "Zeitraum"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/el/radvd.po b/feeds/luci/applications/luci-app-radvd/po/el/radvd.po
+new file mode 100644
+index 0000000..00763c9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/el/radvd.po
+@@ -0,0 +1,370 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-18 15:31+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: German\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "6to4 interface"
++msgstr "Διεπαφή 6to4"
++
++msgid "Address"
++msgstr "ΔιεÏθυνση"
++
++msgid "Addresses"
++msgstr "ΔιευθÏνσεις"
++
++msgid "Advanced"
++msgstr ""
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr "Πελάτες"
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr "ΕνεÏγοποίηση"
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr "Διεπαφή"
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Διεπαφές"
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - Διεπαφή %q"
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr "Radvd - ΔιαδÏομή"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr "ΔιαδÏομές"
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr "όχι"
++
++msgid "yes"
++msgstr "ναι"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/en/radvd.po b/feeds/luci/applications/luci-app-radvd/po/en/radvd.po
+new file mode 100644
+index 0000000..63f8fa0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/en/radvd.po
+@@ -0,0 +1,368 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2010-11-21 04:06+0100\n"
++"Last-Translator: <jow@openwrt.org>\n"
++"Language-Team: German\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "6to4 interface"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Addresses"
++msgstr ""
++
++msgid "Advanced"
++msgstr ""
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/po/es/radvd.po b/feeds/luci/applications/luci-app-radvd/po/es/radvd.po
+new file mode 100644
+index 0000000..8656192
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/es/radvd.po
+@@ -0,0 +1,412 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-08-26 17:12+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: German\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "6to4 interface"
++msgstr "Interfaz 6a4"
++
++msgid "Address"
++msgstr "Dirección"
++
++msgid "Addresses"
++msgstr "Direcciones"
++
++msgid "Advanced"
++msgstr "Avanzado"
++
++msgid "Advertise Home Agent flag"
++msgstr "Publicar marca de agente personal"
++
++msgid "Advertise router address"
++msgstr "Publicar dirección del router"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Publicar sufijos de dominio"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"RDNSS IPv6 publicado. Dejar en blanco para usar la dirección IPv6 de la "
++"interfaz"
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Prefijo IPv6 publicado"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Prefijos IPv6 publicados. Dejar en blanco para usar el propio del interfaz"
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr "Publica aptitudes móviles IPv6 del Home Agent (RFC3775)"
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr "Publica las aptitudes de registro del router móvil"
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++"Publica el alcance asumido en milisegundos de los vecinos en la RA si se "
++"especifica. 0 para desactivar"
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++"Publica la cuenta de saltos para paquetes salientes en el RA. Desactivar con "
++"0"
++
++msgid "Advertises the default router preference"
++msgstr "Publica la preferencia de router por defecto"
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr "Publica el MTU del enlace en la RA si se especifica. Desactivar con 0"
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++"Publica el tiempo de vida en segundos que se prefieren las direcciones "
++"generadas desde el prefijo vía una dirección de autoconfiguración sin estado."
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++"Publica el tiempo en segundos que el prefijo es válido para determinar que "
++"el enlace está activo."
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++"Publica tiempo de vida del router por defecto en segundos. 0 si el router no "
++"lo es"
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++"Publica tiempo en segundos que router ofrece servicios de Home Agent para "
++"IPv6 móvil"
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++"Publicar el tiempo de espera en milisegundos entre mensajes de solicitud de "
++"vecinos en la RA. Desactivar con 0"
++
++msgid "Advertising"
++msgstr "Publicación"
++
++msgid "Autonomous"
++msgstr "Autónomo"
++
++msgid "Clients"
++msgstr "Clientes"
++
++msgid "Configuration flag"
++msgstr "Marca de configuración"
++
++msgid "Current hop limit"
++msgstr "Límite de saltos actual"
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "Configuración DNSSL"
++
++msgid "Default lifetime"
++msgstr "Vida por defecto"
++
++msgid "Default preference"
++msgstr "Preferencia por defecto"
++
++msgid "Enable"
++msgstr "Activar"
++
++msgid "Enable advertisements"
++msgstr "Activar publicaciones"
++
++msgid "Enables router advertisements and solicitations"
++msgstr "Activar publicaciones y solicitudes de router"
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr "Activa el protocolo adicional de autoconfiguración de estado (RFC2462)"
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++"Activa la configuración de información adicional que no sea de dirección "
++"(RFC2462)"
++
++msgid "General"
++msgstr "General"
++
++msgid "Home Agent information"
++msgstr "Información del \"Home Agent\""
++
++msgid "Home Agent lifetime"
++msgstr "Vida del \"Home Agent\""
++
++msgid "Home Agent preference"
++msgstr "Preferencia del \"Home Agent\""
++
++msgid "Include Home Agent Information in the RA"
++msgstr "Incluir información del \"Home Agent\" en el RA"
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr "Incluir la opción de publicación móvil IPv6 a RA"
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++"Incluye la dirección de capa de enlace para el interfaz saliente en la RA"
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++"Se enviará la dirección del interfaz en vez del prefijo de red tal y como se "
++"requiere par IPv6 móvil"
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++"El enlace inferior no puede hacer redifusión, no se pueden enviar "
++"publicaciones no solicitadas"
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++"Este prefijo se puede usar como una dirección autónoma de configuración "
++"(RFC4862)"
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++"Este prefijo se puede usar para determinación de enlace activado (RFC4861)"
++
++msgid "Interface"
++msgstr "Interfaz"
++
++msgid "Interface Configuration"
++msgstr "Configuración de la interfaz"
++
++msgid "Interface required"
++msgstr "Se necesita una interfaz"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Lifetime"
++msgstr "Vida"
++
++msgid "Link MTU"
++msgstr "MTU del enlace"
++
++msgid "Managed flag"
++msgstr "Marca de gestionado"
++
++msgid "Max. interval"
++msgstr "Intervalo máximo"
++
++msgid "Maximum advertisement interval"
++msgstr "Intervalo máximo de publicación"
++
++msgid "Minimum advertisement delay"
++msgstr "Retraso mínimo de publicación"
++
++msgid "Minimum advertisement interval"
++msgstr "Intervalo mínimo de publicación"
++
++msgid "Mobile IPv6"
++msgstr "IPv6 móvil"
++
++msgid "Mobile IPv6 interval option"
++msgstr "Opción de intervalo móvil IPv6"
++
++msgid "Mobile IPv6 router registration"
++msgstr "Registro de router móvil IPv6"
++
++msgid "Multicast"
++msgstr "Multidifusión"
++
++msgid "On-link"
++msgstr "Enlace activado (On-link)"
++
++msgid "On-link determination"
++msgstr "Determinar enlace activado"
++
++msgid "Preference"
++msgstr "Preferencia"
++
++msgid "Preferred lifetime"
++msgstr "Duración de vida preferida"
++
++msgid "Prefix"
++msgstr "Prefijo"
++
++msgid "Prefix Configuration"
++msgstr "Configuración del prefijo"
++
++msgid "Prefixes"
++msgstr "Prefijos"
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr "Configuración RDNSS"
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - Interfaz %q"
++
++msgid "Radvd - Prefix"
++msgstr "Radvd - Prefijo"
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr "Radvd - Ruta"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++"Radvd es un demonio de publicación de enrutado de para IPv6. Atiende "
++"solicitudes de ruta y envía anuncios de ruta como se describe en RFC4861."
++
++msgid "Reachable time"
++msgstr "Tiempo alcanzable"
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++"Restringir comunicaciones a estos clientes, dejar en blanco para "
++"multidifusión"
++
++msgid "Retransmit timer"
++msgstr "Retraso de retransmisión"
++
++msgid "Route Configuration"
++msgstr "Configuración de rutas"
++
++msgid "Routes"
++msgstr "Rutas"
++
++msgid "Source link-layer address"
++msgstr "Dirección origen de enlace de red"
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++"Nombre lógicos del interfaz del que derivar un prefijo 6to4. La dirección "
++"IPv4 pública del interfaz se combina con 2002::/3 y el valor de la opción "
++"\"prefijo\""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr "Tiempo de vida asociado a la ruta en segundos."
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr "Nombre del interfaz lógico al que pertenece esta sección"
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++"Máximo tiempo que las entradas DNSSL se usan para resolución de nombres."
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++"Máximo tiempo que las entradas RDNSS se usan para resolución de nombres."
++
++msgid "Specifies the preference associated with the default router"
++msgstr "Preferencia asociada con el router por defecto"
++
++msgid "Suffix"
++msgstr "Sufijo"
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"Máximo tiempo en segundos entre envíos de publicaciones multidifusión desde "
++"el interfaz"
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++"Mínimo tiempo en segundos entre envíos de publicaciones multidifusión desde "
++"el interfaz"
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"Mínimo tiempo en segundos entre envíos de publicaciones multidifusión no "
++"solicitadas desde el interfaz"
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr "Preferencia que el Home Agent enviará a esta RA"
++
++msgid "Timing"
++msgstr "Temporización"
++
++msgid "Unicast only"
++msgstr "Solo unidifusión"
++
++msgid "Valid lifetime"
++msgstr "Tiempo de vida válido"
++
++msgid "Validity time"
++msgstr "Tiempo de validez"
++
++msgid "default"
++msgstr "por defecto"
++
++msgid "high"
++msgstr "alto"
++
++msgid "low"
++msgstr "bajo"
++
++msgid "medium"
++msgstr "medio"
++
++msgid "no"
++msgstr "no"
++
++msgid "yes"
++msgstr "sí"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/fr/radvd.po b/feeds/luci/applications/luci-app-radvd/po/fr/radvd.po
+new file mode 100644
+index 0000000..b26e6e0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/fr/radvd.po
+@@ -0,0 +1,472 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-11-23 22:32+0200\n"
++"Last-Translator: fredb <fblistes+luci@free.fr>\n"
++"Language-Team: German\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "6to4 interface"
++msgstr "Interface 6to4"
++
++msgid "Address"
++msgstr "Adresse"
++
++msgid "Addresses"
++msgstr "Adresses"
++
++msgid "Advanced"
++msgstr "Avancé"
++
++msgid "Advertise Home Agent flag"
++msgstr "Drapeau de publication de l'agent Personnel (Home Agent)"
++
++msgid "Advertise router address"
++msgstr "Publier l'adresse du routeur"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Suffixes de domaines publiés"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"IPv6 RDNSS publié. S'il est vide, l'adresse IPv6 courante de l'interface est "
++"utilisée"
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Préfixes IPv6 publiés"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Préfixes IPv6 publiés. Si c'est vide, le préfixe actuel de l'interface est "
++"utilisé"
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr "Publie la capacité Home Agent d'IPv6 Mobile (RFC 3775)"
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr "Publie la capacité d'enregistrement d'un Routeur Mobile (NEMO basique)"
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++"Publie le temps d'accès présumé en milli-secondes des voisins dans le RA "
++"s'il est spécifié. 0 désactive les publications d'accessibilité"
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++"Publie le nombre de sauts par défaut pour les paquets unicast sortants dans "
++"le RA. 0 désactive les publications de nombre de sauts"
++
++msgid "Advertises the default router preference"
++msgstr "Publie la préférence du routeur par défaut"
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++"Publie la valeur donnée de MTU dans les messages RA. 0 désactive la "
++"publication du MTU"
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++"Publie la durée du routeur par défaut, en secondes. 0 indique que le nœud "
++"n'est pas un routeur par défaut"
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++"Publie la durée en secondes pendant laquelle le routeur offre les services "
++"IPv6 Mobile d'agent personnel (Home Agent)"
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++"Publie le temps d'attente en millisecondes entre deux messages de "
++"sollicitation de voisinage dans le RA. 0 indique de ne pas retransmettre les "
++"publications"
++
++msgid "Advertising"
++msgstr "Publication"
++
++msgid "Autonomous"
++msgstr "Autonome"
++
++msgid "Clients"
++msgstr "Clients"
++
++msgid "Configuration flag"
++msgstr "Drapeau de configuration"
++
++msgid "Current hop limit"
++msgstr "Limite de sauts actuelle"
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "Configuration DNSSL"
++
++msgid "Default lifetime"
++msgstr "Durée de vie par défaut"
++
++msgid "Default preference"
++msgstr "Préférence par défaut"
++
++msgid "Enable"
++msgstr "Activer"
++
++msgid "Enable advertisements"
++msgstr "Activer les publications"
++
++msgid "Enables router advertisements and solicitations"
++msgstr "Activer les publications et sollicitations du routeur"
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++"Active le protocole d'auto-configuration administrée à états supplémentaire "
++"(RFC 2462)"
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++"Active l'auto-configuration d'informations autres que l'adresse "
++"supplémentaires (RFC 2462)"
++
++msgid "General"
++msgstr "Général"
++
++msgid "Home Agent information"
++msgstr "Informations de l'agent personnel (Home Agent)"
++
++msgid "Home Agent lifetime"
++msgstr "Durée de vie de l'agent personnel (Home Agent)"
++
++msgid "Home Agent preference"
++msgstr "Préférence de l'agent personnel (Home Agent)"
++
++msgid "Include Home Agent Information in the RA"
++msgstr "Inclure les informations de l'agent personnel (Home Agent) dans le RA"
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++"Inclure l'option de l'intervalle de publication de Mobile IPv6 dans le RA"
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr "Inclure l'adresse de niveau lien de l'interface sortante dans le RA"
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++"Indique que l'adresse de l'interface est envoyée à la place du préfixe "
++"réseau, comme demandé par la norme IPv6 Mobile"
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++"Indique que le lien sous-jacent ne peut faire de publication « broadcast », "
++"pour éviter l'envoi de publications non sollicitées"
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++"Indique que ce préfixe peut être utilisé pour la configuration autonome des "
++"adresses (RFC 4862)"
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++"Indique que ce préfixe peut être utilisé pour la détermination des adresses "
++"liées-au-support (On-Link, RFC 4861)"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Interface Configuration"
++msgstr "Configuration de l'interface"
++
++msgid "Interface required"
++msgstr "Interface nécessaire"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Lifetime"
++msgstr "Durée de vie"
++
++msgid "Link MTU"
++msgstr "MTU du lien"
++
++msgid "Managed flag"
++msgstr "Indicateur de gestion"
++
++msgid "Max. interval"
++msgstr "Intervalle Max"
++
++msgid "Maximum advertisement interval"
++msgstr "Intervalle maximum de publication"
++
++msgid "Minimum advertisement delay"
++msgstr "Délai de publication minimum"
++
++msgid "Minimum advertisement interval"
++msgstr "Intervalle minimum de publication"
++
++msgid "Mobile IPv6"
++msgstr "IPv6 Mobile"
++
++msgid "Mobile IPv6 interval option"
++msgstr "Option d'intervalle pour l'IPv6 Mobile"
++
++msgid "Mobile IPv6 router registration"
++msgstr "Enregistrement du routeur pour IPv6 Mobile"
++
++msgid "Multicast"
++msgstr "Multicast"
++
++msgid "On-link"
++msgstr "lié-au-support (On-link)"
++
++msgid "On-link determination"
++msgstr "Détermination de la liaison-au-support (On-link)"
++
++msgid "Preference"
++msgstr "Préférence"
++
++msgid "Preferred lifetime"
++msgstr "Durée de vie préférée"
++
++msgid "Prefix"
++msgstr "Préfixe"
++
++msgid "Prefix Configuration"
++msgstr "Configuration du préfixe"
++
++msgid "Prefixes"
++msgstr "Préfixes"
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr "Configuration RDNSS"
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - Interface %q"
++
++msgid "Radvd - Prefix"
++msgstr "Radvd - Préfixe"
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr "Radvd - Routage"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++"Radvd est un démon de publication de routage pour IPv6. Il écoute des "
++"sollicitations de routage (Router Sollicitation) et envoie des publications "
++"de routage (Router Advertisement) comme décrit dans la RFC 4861."
++
++msgid "Reachable time"
++msgstr "temps d'accès"
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++"Restreint la communication aux clients spécifiés, laissez vide pour utiliser "
++"le multicast"
++
++msgid "Retransmit timer"
++msgstr "Délai de retransmission"
++
++msgid "Route Configuration"
++msgstr "Configuration du routage"
++
++msgid "Routes"
++msgstr "Routes"
++
++msgid "Source link-layer address"
++msgstr "Adresse-source de niveau lien"
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++"Décrit le nom d'une interface logique de laquelle le préfixe 6to4 sera "
++"déduit. Les adresses IPv4 des interfaces publiques sont combinées avec "
++"2002::/3 et la valeur de l'option de préfixe"
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++"Indique le nom de l'interface logique auquelle cette section est rattachée"
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr "Indique la préférence associée au routeur par défaut"
++
++msgid "Suffix"
++msgstr "Suffixe"
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"Temps maximum autorisé entre deux émissions de publications multicast non "
++"sollicitées du routeur depuis cette interface, en secondes"
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++"Temps minimum autorisé entre deux émissions de publications multicast du "
++"routeur depuis cette interface, en secondes"
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"Temps minimum autorisé entre deux émissions de publications multicast non "
++"sollicitées du routeur depuis cette interface, en secondes"
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr "Préférence pour l'agent personnel (Home Agent) envoyant ce RA"
++
++msgid "Timing"
++msgstr "Délai"
++
++msgid "Unicast only"
++msgstr "Unicast seulement"
++
++msgid "Valid lifetime"
++msgstr "Durée de la validité"
++
++msgid "Validity time"
++msgstr "Durée de validité"
++
++msgid "default"
++msgstr "Défaut"
++
++msgid "high"
++msgstr "haut"
++
++msgid "low"
++msgstr "bas"
++
++msgid "medium"
++msgstr "moyen"
++
++msgid "no"
++msgstr "non"
++
++msgid "yes"
++msgstr "oui"
++
++#~ msgid "Advertised IPv6 prefix"
++#~ msgstr "Préfixe IPv6 publié"
++
++#~ msgid ""
++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used"
++#~ msgstr ""
++#~ "Préfixe IPv6 publié. S'il est vide, le préfixe actuel de l'interface est "
++#~ "utilisé"
++
++#~ msgid ""
++#~ "Advertises the length of time in seconds that addresses generated from "
++#~ "the prefix via stateless address autoconfiguration remain preferred. Use "
++#~ "0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Publie la durée en secondes pendant laquelle les adresses générées depuis "
++#~ "le préfixe via l'auto-configuration sans état restent préférées. 0 "
++#~ "indique une durée infinie"
++
++#~ msgid ""
++#~ "Advertises the length of time in seconds that the prefix is valid for the "
++#~ "purpose of on-link determination. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Publie la durée en secondes pendant laquelle le préfixe est valable pour "
++#~ "le choix des adresses liées-au-support (on-link). 0 indique une durée "
++#~ "infinie"
++
++#~ msgid ""
++#~ "Indicates whether that RDNSS continues to be available to hosts even if "
++#~ "they moved to a different subnet"
++#~ msgstr ""
++#~ "Indique si le RDNSS contine d'être disponible aux hôtes même s'ils ont "
++#~ "migré sur un sous-réseau différent"
++
++#~ msgid "Open"
++#~ msgstr "Ouvert"
++
++#~ msgid ""
++#~ "Specifies the lifetime associated with the route in seconds. Use 0 to "
++#~ "specify an infinite lifetime"
++#~ msgstr ""
++#~ "Précise la durée de vie d'une route, en secondes. Utiliser 0 pour une "
++#~ "durée de vie infinie"
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the DNSSL entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Indique la durée maximum d'utilisation des entrées DNSSL pour la "
++#~ "résolution de nom. Utiliser 0 pour une durée infinie"
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the RDNSS entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Indique la durée maximum d'utilisation des entrées RDNSS pour la "
++#~ "résolution de nom. Utiliser 0 pour une durée infinie"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/he/radvd.po b/feeds/luci/applications/luci-app-radvd/po/he/radvd.po
+new file mode 100644
+index 0000000..63ec168
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/he/radvd.po
+@@ -0,0 +1,367 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "6to4 interface"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Addresses"
++msgstr ""
++
++msgid "Advanced"
++msgstr ""
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/po/hu/radvd.po b/feeds/luci/applications/luci-app-radvd/po/hu/radvd.po
+new file mode 100644
+index 0000000..90aa4ba
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/hu/radvd.po
+@@ -0,0 +1,372 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-01-31 12:14+0200\n"
++"Last-Translator: Gabor <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "6to4 interface"
++msgstr "6to4 interfész"
++
++msgid "Address"
++msgstr "Cím"
++
++msgid "Addresses"
++msgstr "Címek"
++
++msgid "Advanced"
++msgstr "Fejlett"
++
++msgid "Advertise Home Agent flag"
++msgstr "Otthoni Ügynök jelző közzététele"
++
++msgid "Advertise router address"
++msgstr "Útválasztó cím közzététele"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Közzétett domain utótagok"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Közzétett IPv6 előtagok"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Közzétett IPv6 előtagok. Ha üres, a jelenlegi interfész előtag lesz "
++"használva."
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "DNSSL konfiguráció"
++
++msgid "Default lifetime"
++msgstr "Alapértelemezett élettartam"
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interfészek"
++
++msgid "Lifetime"
++msgstr "Élettartam"
++
++msgid "Link MTU"
++msgstr "Kapcsolat MTU"
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr "RDNSS beállítások"
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - %q interfész"
++
++msgid "Radvd - Prefix"
++msgstr "Radvd - Előtag"
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr "Radvd - Útvonal"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr "Útvonal beállítás"
++
++msgid "Routes"
++msgstr "Útvonalak"
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr "Időzítés"
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr "alípértelmezett"
++
++msgid "high"
++msgstr "magas"
++
++msgid "low"
++msgstr "alacsony"
++
++msgid "medium"
++msgstr "közepes"
++
++msgid "no"
++msgstr "nem"
++
++msgid "yes"
++msgstr "igen"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/it/radvd.po b/feeds/luci/applications/luci-app-radvd/po/it/radvd.po
+new file mode 100644
+index 0000000..cda09b7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/it/radvd.po
+@@ -0,0 +1,374 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-02-10 19:21+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: German\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "6to4 interface"
++msgstr "Interfaccia 6to4"
++
++msgid "Address"
++msgstr "Indirizzo"
++
++msgid "Addresses"
++msgstr "Indirizzi"
++
++msgid "Advanced"
++msgstr "Avanzato"
++
++msgid "Advertise Home Agent flag"
++msgstr "Advertise Home Agent flag"
++
++msgid "Advertise router address"
++msgstr "Annuncia indirizzo router"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Annuncia Suffissi Dominio"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"Annuncia RDNSS IPv6. Se vuoto, l'indirizzo IPv6 attuale dell'interfaccia "
++"verrà usato"
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Prefissi IPv6 Annunciati"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Prefissi IPv6 Annunciati. Se vuoto, il prefisso dell'interfaccia attuale "
++"verrà usato"
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr "Annuncia la capacità dell'Agente Home IPv6 Mobile (RFC3775)"
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr "Abilita"
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/po/ja/radvd.po b/feeds/luci/applications/luci-app-radvd/po/ja/radvd.po
+new file mode 100644
+index 0000000..35cde34
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/ja/radvd.po
+@@ -0,0 +1,378 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-16 09:35+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: German\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: Pootle 2.0.4\n"
++
++msgid "6to4 interface"
++msgstr "6to4 インターフェース"
++
++msgid "Address"
++msgstr "アドレス"
++
++msgid "Addresses"
++msgstr "アドレス"
++
++msgid "Advanced"
++msgstr "詳細設定"
++
++msgid "Advertise Home Agent flag"
++msgstr "ホームエージェントフラグã®åºƒå‘Š"
++
++msgid "Advertise router address"
++msgstr "ルーターアドレスã®åºƒå‘Š"
++
++msgid "Advertised Domain Suffixes"
++msgstr "広告ã™ã‚‹ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚µãƒ•ã‚£ãƒƒã‚¯ã‚¹ã‚’設定ã—ã¾ã™ã€‚"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"広告ã™ã‚‹IPv6 RDNSSを設定ã—ã¾ã™ã€‚未設定ã®å ´åˆã€ç¾åœ¨ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®IPv6 ã‚¢"
++"ドレスã«è¨­å®šã—ã¾ã™ã€‚"
++
++msgid "Advertised IPv6 prefixes"
++msgstr "広告ã™ã‚‹IPv6 プレフィクスを設定ã—ã¾ã™"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"広告ã™ã‚‹IPv6 プレフィクスを設定ã—ã¾ã™ã€‚未設定ã®å ´åˆã€ç¾åœ¨ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®"
++"プレフィクスã«è¨­å®šã—ã¾ã™ã€‚"
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr "モãƒã‚¤ãƒ«IPv6 ホームエージェント機能ã®åºƒå‘Šã‚’è¡Œã„ã¾ã™ã€‚ (RFC3775)"
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr "広告"
++
++msgid "Autonomous"
++msgstr "Autonomous"
++
++msgid "Clients"
++msgstr "クライアント"
++
++msgid "Configuration flag"
++msgstr "Configuration フラグ"
++
++msgid "Current hop limit"
++msgstr "ç¾åœ¨ã®ãƒ›ãƒƒãƒ—数制é™"
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "DNSSL 設定"
++
++msgid "Default lifetime"
++msgstr "標準有効時間"
++
++msgid "Default preference"
++msgstr "標準優先度設定"
++
++msgid "Enable"
++msgstr "有効"
++
++msgid "Enable advertisements"
++msgstr "広告を有効ã«ã™ã‚‹"
++
++msgid "Enables router advertisements and solicitations"
++msgstr "ルータ広告ãŠã‚ˆã³è¦è«‹ã‚’有効ã«ã™ã‚‹"
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr "基本設定"
++
++msgid "Home Agent information"
++msgstr "ホームエージェント 情報"
++
++msgid "Home Agent lifetime"
++msgstr "ホームエージェント 有効時間"
++
++msgid "Home Agent preference"
++msgstr "ホームエージェント 優先度"
++
++msgid "Include Home Agent Information in the RA"
++msgstr "ルータ広告 (RA) ã«ãƒ›ãƒ¼ãƒ ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆæƒ…報をå«ã‚ã‚‹"
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr "インターフェース"
++
++msgid "Interface Configuration"
++msgstr "インターフェース設定"
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "インターフェース"
++
++msgid "Lifetime"
++msgstr "有効時間"
++
++msgid "Link MTU"
++msgstr "リンクMTU"
++
++msgid "Managed flag"
++msgstr "Managed フラグ"
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr "ルータè¦è«‹æœ€å¤§é€ä¿¡é–“éš”"
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr "ルータè¦è«‹æœ€ä½Žé€ä¿¡é–“éš”"
++
++msgid "Mobile IPv6"
++msgstr "モãƒã‚¤ãƒ« IPv6"
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr "モãƒã‚¤ãƒ« IPv6 ルータ登録"
++
++msgid "Multicast"
++msgstr "マルãƒã‚­ãƒ£ã‚¹ãƒˆ"
++
++msgid "On-link"
++msgstr "On-link"
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr "優先度"
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr "プレフィクス"
++
++msgid "Prefix Configuration"
++msgstr "プレフィクス設定"
++
++msgid "Prefixes"
++msgstr "プレフィクス"
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr "RDNSS 設定"
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - インターフェース %q"
++
++msgid "Radvd - Prefix"
++msgstr "Radvd - プレフィクス"
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr "Radvd - 経路"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++"Radvdã¯ã€IPv6用ã®ãƒ«ãƒ¼ã‚¿åºƒå‘Šãƒ‡ãƒ¼ãƒ¢ãƒ³ã§ã™ã€‚Radvdã¯RFC 4861ã«è¦å®šã•ã‚Œã¦ã„ã‚‹ã€"
++"ルータè¦è«‹ã®å—ä¿¡ã¨ã€ãƒ«ãƒ¼ã‚¿åºƒå‘Šã®é€ä¿¡ã‚’è¡Œã„ã¾ã™ã€‚"
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++"設定ã•ã‚ŒãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«å¯¾ã—ã¦ã®ã¿é€šä¿¡ã‚’è¡Œã„ã¾ã™ã€‚設定ã—ãªã„å ´åˆã€ãƒžãƒ«ãƒã‚­ãƒ£"
++"ストを行ã„ã¾ã™ã€‚"
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr "経路設定"
++
++msgid "Routes"
++msgstr "経路"
++
++msgid "Source link-layer address"
++msgstr "é€ä¿¡å…ƒãƒªãƒ³ã‚¯å±¤ã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr "ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ä½¿ç”¨ã™ã‚‹è«–ç†ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹åを設定ã—ã¦ãã ã•ã„。"
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr "サフィックス"
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr "タイミング設定"
++
++msgid "Unicast only"
++msgstr "ユニキャストã®ã¿"
++
++msgid "Valid lifetime"
++msgstr "有効時間ã®è¨­å®š"
++
++msgid "Validity time"
++msgstr "有効時間"
++
++msgid "default"
++msgstr "default"
++
++msgid "high"
++msgstr "高"
++
++msgid "low"
++msgstr "低"
++
++msgid "medium"
++msgstr "中"
++
++msgid "no"
++msgstr "ã„ã„ãˆ"
++
++msgid "yes"
++msgstr "ã¯ã„"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/ms/radvd.po b/feeds/luci/applications/luci-app-radvd/po/ms/radvd.po
+new file mode 100644
+index 0000000..63f8fa0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/ms/radvd.po
+@@ -0,0 +1,368 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2010-11-21 04:06+0100\n"
++"Last-Translator: <jow@openwrt.org>\n"
++"Language-Team: German\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "6to4 interface"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Addresses"
++msgstr ""
++
++msgid "Advanced"
++msgstr ""
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/po/no/radvd.po b/feeds/luci/applications/luci-app-radvd/po/no/radvd.po
+new file mode 100644
+index 0000000..1c43442
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/no/radvd.po
+@@ -0,0 +1,435 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "6to4 interface"
++msgstr "6til4 grensesnitt"
++
++msgid "Address"
++msgstr "Adresse"
++
++msgid "Addresses"
++msgstr "Adresser"
++
++msgid "Advanced"
++msgstr "Avansert"
++
++msgid "Advertise Home Agent flag"
++msgstr "Annonser Home Agent flagg"
++
++msgid "Advertise router address"
++msgstr "Annonser ruteradressen"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Annonserte Domenesuffikser"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"Annonsert IPv6 RDNSS. Hvis tom, brukes den gjeldende IPv6-adressen til "
++"grensesnittet"
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Annonserte IPv6 prefikser"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Annonserte IPv6 prefikser. Hvis tom, brukes gjeldende grensesnitt prefiks"
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr "Annonserer Mobile IPv6 Home Agent muligheter (RFC3775)"
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr "Annonserer Mobile Router registration muligheter (NEMO Basic)"
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++"Annonserer antatt tilgjengelighet i millisekunder for naboer i RA. 0 "
++"deaktiverer annonsenering av tilgjengelighet"
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++"Annonserer standard Hop Count verdien for utgående unicast pakker i RA. 0 "
++"deaktierer annonsering av hopcount"
++
++msgid "Advertises the default router preference"
++msgstr "Annonserer standard ruter preferanse"
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr "Annonserer angitt link MTU i RA. 0 deaktiverer annonsereing av MTU"
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++"Annonserer levetiden for standard ruter i sekunder. 0 indikerer at noden "
++"ikke er standard ruter"
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++"Annonserer tiden i sekunder der ruteren tilbyr Mobile IPv6 Home Agent "
++"tjenester"
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++"Annonserer ventetiden i millisekunder mellom Neighbor Solicitation meldinger "
++"i RA. 0 deaktiverer omsendte annonseringer"
++
++msgid "Advertising"
++msgstr "Annonsering"
++
++msgid "Autonomous"
++msgstr "Selvstendig"
++
++msgid "Clients"
++msgstr "Klienter"
++
++msgid "Configuration flag"
++msgstr "Konfigurasjon flagg"
++
++msgid "Current hop limit"
++msgstr "Nåværende hop grense"
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "DNSSL Konfigurasjon"
++
++msgid "Default lifetime"
++msgstr "Standard levetid"
++
++msgid "Default preference"
++msgstr "Standard prepreferanse"
++
++msgid "Enable"
++msgstr "Aktiver"
++
++msgid "Enable advertisements"
++msgstr "Aktiver annonsering"
++
++msgid "Enables router advertisements and solicitations"
++msgstr "Aktiverer ruter annonsering og anmodning"
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++"Aktiverer den ekstra 'stateful' administrerte autokonfigurasjon protokoll "
++"(RFC2462)"
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++"Aktiverer autokonfigurasjon for annen ikke adresse informasjon (RFC2462)"
++
++msgid "General"
++msgstr "Generell"
++
++msgid "Home Agent information"
++msgstr "Home Agen informasjon"
++
++msgid "Home Agent lifetime"
++msgstr "Home Agent levetid"
++
++msgid "Home Agent preference"
++msgstr "Home Agent preferanse"
++
++msgid "Include Home Agent Information in the RA"
++msgstr "Inkluder Home Agent informasjon i RA"
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr "Inkluder Mobile IPv6 annonserings intervall alternativer til RA"
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr "Inkluder utgående grensesnitts link-layer adresse til RA"
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++"Indikerer at grensesnittets adresse er sendt istedet for nettverks "
++"prefikset, noe som er nødvendig for Mobile IPv6"
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++"Indikerer at underliggende link ikke er broadcast kapabel, dette forhindrer "
++"spontane annonsering"
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++"Indikerer at dette prefikset kan bli brukt for autonom adresse konfigurasjon "
++"(RFC4862)"
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++"Indikerer at dette prefikset kan bli brukt for on-link bestemmelse (RFC4861)"
++
++msgid "Interface"
++msgstr "Grensesnitt"
++
++msgid "Interface Configuration"
++msgstr "Grensesnitt Konfigurasjon"
++
++msgid "Interface required"
++msgstr "Grenesnitt er nødvendig"
++
++msgid "Interfaces"
++msgstr "Grensesnitt"
++
++msgid "Lifetime"
++msgstr "Levetid"
++
++msgid "Link MTU"
++msgstr "Link MTU"
++
++msgid "Managed flag"
++msgstr "Managed flagg"
++
++msgid "Max. interval"
++msgstr "Maks. intervall"
++
++msgid "Maximum advertisement interval"
++msgstr "Maksimum annonsering intervall"
++
++msgid "Minimum advertisement delay"
++msgstr "Minimum annonsering forsinkelse"
++
++msgid "Minimum advertisement interval"
++msgstr "Minimum annonsering intervall"
++
++msgid "Mobile IPv6"
++msgstr "Mobile IPv6"
++
++msgid "Mobile IPv6 interval option"
++msgstr "Mobile IPv6 intervall alternativer"
++
++msgid "Mobile IPv6 router registration"
++msgstr "Mobile IPv6 ruter registrering"
++
++msgid "Multicast"
++msgstr "Multicast"
++
++msgid "On-link"
++msgstr "On-link"
++
++msgid "On-link determination"
++msgstr "On-link bestemmelse"
++
++msgid "Preference"
++msgstr "Preferanse"
++
++msgid "Preferred lifetime"
++msgstr "Foretrukket levetid"
++
++msgid "Prefix"
++msgstr "Prefiks"
++
++msgid "Prefix Configuration"
++msgstr "Prefiks Konfigurasjon"
++
++msgid "Prefixes"
++msgstr "Prefikser"
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr "RDNSS Konfigurasjon"
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - Grensesnitt %q"
++
++msgid "Radvd - Prefix"
++msgstr "Radvd - Prefiks"
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr "Radvd - Rute"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++"Radvd er en ruter annonserings tjeneste for IPv6. Den lytter etter ruter "
++"anmodninger og sender ruter annonsering som beskrevet i RFC 4861"
++
++msgid "Reachable time"
++msgstr "Tilgjengelighet tid"
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++"Begrens kommunikasjonen til klienter spesifisert her, la stå tomt for å "
++"bruke multicast"
++
++msgid "Retransmit timer"
++msgstr "Omsendelse tidsmåler"
++
++msgid "Route Configuration"
++msgstr "Rute Konfigurasjon"
++
++msgid "Routes"
++msgstr "Ruter"
++
++msgid "Source link-layer address"
++msgstr "Kilde link-lag adresse"
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++"Angir et logisk grensenittsnavn å hente 6til4 prefiks fra. Grensesnittets "
++"offentlige IPv4 adresse er kombinert med 2002::/3 og verdien av prefiks "
++"alternativet"
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr "Angir det logiske grensesnittsnavnet som denne seksjonen tilhører"
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr "Angir preferanse knyttet til standard ruteren"
++
++msgid "Suffix"
++msgstr "Suffiks"
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"Maksimal tillatt tid mellom sending av spontane multicast annonseringer fra "
++"grensesnittet, i sekunder"
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++"Minimum tillatt tid mellom sending av multicast annonseringer fra "
++"grensesnittet, i sekunder"
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"Minimum tillatt tid mellom sending av spontane multicast annonseringer fra "
++"grensesnittet, i sekunder"
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr "Referansen til Home Agenten som sender denne RA"
++
++msgid "Timing"
++msgstr "Timing"
++
++msgid "Unicast only"
++msgstr "Kun Unikast"
++
++msgid "Valid lifetime"
++msgstr "Gyldig levetid"
++
++msgid "Validity time"
++msgstr "Gyldighetsperiode"
++
++msgid "default"
++msgstr "standard"
++
++msgid "high"
++msgstr "høy"
++
++msgid "low"
++msgstr "lav"
++
++msgid "medium"
++msgstr "medium"
++
++msgid "no"
++msgstr "nei"
++
++msgid "yes"
++msgstr "ja"
++
++#~ msgid ""
++#~ "Advertises the length of time in seconds that addresses generated from "
++#~ "the prefix via stateless address autoconfiguration remain preferred. Use "
++#~ "0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Annonserer tiden i sekunder hvor adresser generert ut fra prefikset via "
++#~ "tilstandsløs autokonfigurasjon er foretrukket. Bruk 0 for ubegrenset "
++#~ "levetid"
++
++#~ msgid ""
++#~ "Advertises the length of time in seconds that the prefix is valid for the "
++#~ "purpose of on-link determination. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Annonserer tiden i sekunder hvor prefikset er gyldig, hvor formålet er on-"
++#~ "link fastsettelse. Bruk 0 for ubegrenset levetid."
++
++#~ msgid ""
++#~ "Specifies the lifetime associated with the route in seconds. Use 0 to "
++#~ "specify an infinite lifetime"
++#~ msgstr ""
++#~ "Angir levetiden tilknyttet ruten i sekunder. Bruk 0 for ubegrenset levetid"
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the DNSSL entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Angir den maksimale varighet av DNSSL navne oppslag. Bruk 0 for "
++#~ "ubegrenset levetid"
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the RDNSS entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Angir den maksimale varighet av RDNSS navne oppslag. Bruk 0 for "
++#~ "ubegrenset levetid"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/pl/radvd.po b/feeds/luci/applications/luci-app-radvd/po/pl/radvd.po
+new file mode 100644
+index 0000000..a080c97
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/pl/radvd.po
+@@ -0,0 +1,377 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-05 04:35+0200\n"
++"Last-Translator: piosl <sleczek.piotr@gmail.com>\n"
++"Language-Team: German\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++# Na polskiej Wikipedii jest artykuł "6to4", więc chyba ok.
++msgid "6to4 interface"
++msgstr "Interfejs 6to4"
++
++msgid "Address"
++msgstr "Adres"
++
++msgid "Addresses"
++msgstr "Adresy"
++
++msgid "Advanced"
++msgstr "Zaawansowane"
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr "Rozgłaszaj adres routera"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Rozgłaszana Domena Rozszerzenia"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"Rozgłaszane IPv6 RDNSS. Jeżeli jest puste, używany jest aktualny adres IPv6 "
++"interfejsu"
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Rozgłaszany prefixy IPv6 "
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Rozgłaszany prefixy IPv6. Jeżeli jest puste, używany jest aktualny prefix "
++"interfejsu"
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr "Rozgłaszanie"
++
++msgid "Autonomous"
++msgstr "Autonomiczny"
++
++msgid "Clients"
++msgstr "Klienci"
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "Konfiguracja DNSSL"
++
++msgid "Default lifetime"
++msgstr "Domyślna żywotność"
++
++msgid "Default preference"
++msgstr "preferencje domyślne"
++
++msgid "Enable"
++msgstr "umożliwiać"
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr "Ogólny"
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfejs"
++
++msgid "Interface Configuration"
++msgstr "Konfiguracja interfejsu"
++
++msgid "Interface required"
++msgstr "wymagany interfejs"
++
++msgid "Interfaces"
++msgstr "Interfejs"
++
++msgid "Lifetime"
++msgstr "Dożywotni"
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr "Max. Przedział"
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr "preferencje"
++
++msgid "Preferred lifetime"
++msgstr "preferowana żywotność"
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr "Konfiguracja RDNSS"
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - interfejs %q"
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++#, fuzzy
++msgid "Timing"
++msgstr "Timing"
++
++msgid "Unicast only"
++msgstr "Tylko unicast"
++
++msgid "Valid lifetime"
++msgstr "ważne dożywotnio"
++
++msgid "Validity time"
++msgstr "czas ważności"
++
++msgid "default"
++msgstr "domyślne"
++
++msgid "high"
++msgstr "wysoki"
++
++msgid "low"
++msgstr "niski"
++
++msgid "medium"
++msgstr "średni"
++
++msgid "no"
++msgstr "nie"
++
++msgid "yes"
++msgstr "tak"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/pt-br/radvd.po b/feeds/luci/applications/luci-app-radvd/po/pt-br/radvd.po
+new file mode 100644
+index 0000000..62c63bb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/pt-br/radvd.po
+@@ -0,0 +1,469 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-17 23:13+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: German\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "6to4 interface"
++msgstr "Interface 6to4"
++
++msgid "Address"
++msgstr "Endereço"
++
++msgid "Addresses"
++msgstr "Endereços"
++
++msgid "Advanced"
++msgstr "Avançado"
++
++msgid "Advertise Home Agent flag"
++msgstr "Anuncie a opção de Agente Local"
++
++msgid "Advertise router address"
++msgstr "Anuncie o endereço do roteador"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Anuncie o Sufixo do Domínio"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"Anuncia IPv6 RDNSS. Se vazio, o endereço IPv6 atual da interface será usado"
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Anuncie os prefixos IPv6"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Anuncie os prefixos IPv6. Se vazio, o prefixo da interface atual será usado"
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr "Anuncia a capacidade de Agente Local para IPv6 Móvel (RFC3775)"
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr "Anuncia a capacidade de registro de Roteador Móvel (NEMO Básico)"
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++"Se especificado, anuncia no RA o tempo assumido de alcance dos vizinhos, em "
++"milissegundos. Especifique 0 para desabilita este anuncio"
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++"Anuncia no RA o valor padrão para a contagem de saltos nos pacotes unicast "
++"saindo da rede. Especifique 0 para desabilita este anuncio"
++
++msgid "Advertises the default router preference"
++msgstr "Anuncia a preferência do roteador padrão"
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++"Anuncia no RA o MTU da conexão. Especifique 0 para desabilita este anuncio"
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++"Divulga a duração do tempo em segundos que endereços gerados a partir do "
++"prefixo através apátridas endereço autoconfiguração permanecem preferido."
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++"Divulga a duração do tempo em segundos que o prefixo é válido para o "
++"propósito de sobre-link determinado."
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++"Anuncia o período de tempo, em segundos, da validade do roteador padrão. "
++"Especifique 0 para período infinito"
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++"Anuncia o período de tempo, em segundos, que o roteador está oferecendo o "
++"serviço de Agente Local para IPv6 Móvel"
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++"Anuncia o tempo de espera, em milissegundos, entre mensagens de Solicitação "
++"de Vizinhos no RA. Especifique 0 para desabilitar a retransmissão do anúncio"
++
++msgid "Advertising"
++msgstr "Anúncio"
++
++msgid "Autonomous"
++msgstr "Autônomo"
++
++msgid "Clients"
++msgstr "Clientes"
++
++msgid "Configuration flag"
++msgstr "Marcação de configuração"
++
++msgid "Current hop limit"
++msgstr "Limite de saltos atual"
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "Configuração DNSSL"
++
++msgid "Default lifetime"
++msgstr "Validade padrão"
++
++msgid "Default preference"
++msgstr "Preferências padrão"
++
++msgid "Enable"
++msgstr "Habilita"
++
++msgid "Enable advertisements"
++msgstr "Habilita anúncios"
++
++msgid "Enables router advertisements and solicitations"
++msgstr "Habilita as solicitações e os anúncios do roteador"
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++"Habilita o protoloco de autoconfiguração administrada com estado (RFC2462)"
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++"Habilita a autoconfiguração de informação adicional, não endereço (RFC2462)"
++
++msgid "General"
++msgstr "Geral"
++
++msgid "Home Agent information"
++msgstr "Informação do Agente Local"
++
++msgid "Home Agent lifetime"
++msgstr "Validade do Agente Local"
++
++msgid "Home Agent preference"
++msgstr "Preferências do Agente Local"
++
++msgid "Include Home Agent Information in the RA"
++msgstr "Inclui Informação do Agente Local no RA"
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr "Inclui a opção de Intervalo de Anúncio de IPv6 Móvel no RA"
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr "Inclui o endereço da camada de rede da interface de saída no RA"
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++"Indica que o endereço da interface é enviado ao invés do prefixo de rede, "
++"como é necessário para IPv6 Móvel"
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++"Indica que a conexão abaixo não é capaz de utilizar broadcast. Isto inibe o "
++"envio de anúncios não solicitados"
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++"Indica que este prefixo pode ser usado para configuração autônoma de "
++"endereços (RFC4862)"
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++"Indica que este prefixo pode ser usado para a determinação da presença no "
++"enlace local (RFC4861)"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Interface Configuration"
++msgstr "Configuração da Interface"
++
++msgid "Interface required"
++msgstr "Requer uma interface"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Lifetime"
++msgstr "Validade"
++
++msgid "Link MTU"
++msgstr "MTU da conexão"
++
++msgid "Managed flag"
++msgstr "Marcação de gerenciado"
++
++msgid "Max. interval"
++msgstr "Intervalo Máximo"
++
++msgid "Maximum advertisement interval"
++msgstr "Intervalo máximo de anúncio"
++
++msgid "Minimum advertisement delay"
++msgstr "Atraso mínimo de anúncio"
++
++msgid "Minimum advertisement interval"
++msgstr "Intervalo mínimo de anúncio"
++
++msgid "Mobile IPv6"
++msgstr "IPv6 Móvel"
++
++msgid "Mobile IPv6 interval option"
++msgstr "Opçao de intervalo de IPv6 móvel"
++
++msgid "Mobile IPv6 router registration"
++msgstr "Registro de roteador IPv6 móvel"
++
++msgid "Multicast"
++msgstr "Multicast"
++
++msgid "On-link"
++msgstr "Presença no enlace local"
++
++msgid "On-link determination"
++msgstr "Determinação da presença no enlace local"
++
++msgid "Preference"
++msgstr "Preferência"
++
++msgid "Preferred lifetime"
++msgstr "Validade preferida"
++
++msgid "Prefix"
++msgstr "Prefixo"
++
++msgid "Prefix Configuration"
++msgstr "Configuração do Prefixo"
++
++msgid "Prefixes"
++msgstr "Prefixos"
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr "Configuração do RDNSS"
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - Interface %q"
++
++msgid "Radvd - Prefix"
++msgstr "advd - Prefixo"
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr "Radvd - Rota"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++"Radvd é um programa de anúncio de rotas para IPv6. Ele escuta por "
++"solicitações de rota e envia anúncios de roteador (RA) como descrito em RFC "
++"4861."
++
++msgid "Reachable time"
++msgstr "Tempo de alcance"
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++"Restringe a comnuicação para clientes específicos. Deixe vazio para usar "
++"multicast"
++
++msgid "Retransmit timer"
++msgstr "Cronômetro de retransmissão"
++
++msgid "Route Configuration"
++msgstr "Configuração da Rota"
++
++msgid "Routes"
++msgstr "Rotas"
++
++msgid "Source link-layer address"
++msgstr "Endereço de origem da camada de enlace"
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++"Especifica o nome da interface lógica da qual será derivada o prefixo 6to4. "
++"O endereço IPv4 público da interface é combinado com 2002::/3 e o valor da "
++"opção de prefixo"
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr "Especifica o tempo de vida associado com o trajecto em segundos."
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr "Especifica o nome da interface lógica que esta seção pertence"
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++"Especifica a duração máxima de quanto tempo as entradas DNSSL são usados ​​"
++"para resolução de nomes."
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++"Especifica a duração máxima de quanto tempo as entradas RDNSS são usados ​​"
++"para resolução de nomes."
++
++msgid "Specifies the preference associated with the default router"
++msgstr "Especifica as preferências associadas com o roteador padrão"
++
++msgid "Suffix"
++msgstr "Sufixo"
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"O tempo máximo, em segundos, permitido entre o envio de RAs não solicitados "
++"a partir desta interface"
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++"O tempo mínimo, em segundos, permitido entre o envio de RAs a partir desta "
++"interface"
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"O tempo mínimo, em segundos, permitido entre o envio de RAs não solicitados "
++"a partir desta interface"
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr "As preferencias para o Agente Local enviando este RA"
++
++msgid "Timing"
++msgstr "Cronometragem"
++
++msgid "Unicast only"
++msgstr "Somente Unicast"
++
++msgid "Valid lifetime"
++msgstr "Duração da validade"
++
++msgid "Validity time"
++msgstr "Tempo de validade"
++
++msgid "default"
++msgstr "padrão"
++
++msgid "high"
++msgstr "alto"
++
++msgid "low"
++msgstr "baixo"
++
++msgid "medium"
++msgstr "médio"
++
++msgid "no"
++msgstr "não"
++
++msgid "yes"
++msgstr "sim"
++
++#~ msgid "Advertised IPv6 prefix"
++#~ msgstr "Anuncie o prefixo IPv6"
++
++#~ msgid ""
++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used"
++#~ msgstr ""
++#~ "Anuncie o prefixo IPv6. Se vazio, o prefixo da interface atual será usado"
++
++#~ msgid ""
++#~ "Advertises the length of time in seconds that addresses generated from "
++#~ "the prefix via stateless address autoconfiguration remain preferred. Use "
++#~ "0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Anuncia o período de tempo, em segundos, que endereços gerados a partir "
++#~ "do prefixo através da autoconfiguração de endereço sem estado terão "
++#~ "preferência. Especifique 0 para período infinito"
++
++#~ msgid ""
++#~ "Advertises the length of time in seconds that the prefix is valid for the "
++#~ "purpose of on-link determination. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Anuncia o período de tempo, em segundos, que o prefixo é valido para o "
++#~ "propósito de determinação da presença no enlace local. Especifique 0 para "
++#~ "período infinito"
++
++#~ msgid ""
++#~ "Indicates whether that RDNSS continues to be available to hosts even if "
++#~ "they moved to a different subnet"
++#~ msgstr ""
++#~ "Indica se o RDNSS continuará a estar disponível mesmo se o cliente for "
++#~ "movido para uma subrede diferente"
++
++#~ msgid "Open"
++#~ msgstr "Abrir"
++
++#~ msgid ""
++#~ "Specifies the lifetime associated with the route in seconds. Use 0 to "
++#~ "specify an infinite lifetime"
++#~ msgstr "Especifica a validade da rota em segundos. Utilize 0 para infinita"
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the DNSSL entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Especifica a validade da entrada DNSSL para a resolução de nomes. Utilize "
++#~ "0 para duração infinita"
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the RDNSS entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Especifica a validade da entrada RDNS para a resolução de nomes. Utilize "
++#~ "0 para duração infinita"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/pt/radvd.po b/feeds/luci/applications/luci-app-radvd/po/pt/radvd.po
+new file mode 100644
+index 0000000..63f8fa0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/pt/radvd.po
+@@ -0,0 +1,368 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2010-11-21 04:06+0100\n"
++"Last-Translator: <jow@openwrt.org>\n"
++"Language-Team: German\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "6to4 interface"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Addresses"
++msgstr ""
++
++msgid "Advanced"
++msgstr ""
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/po/ro/radvd.po b/feeds/luci/applications/luci-app-radvd/po/ro/radvd.po
+new file mode 100644
+index 0000000..77e3d9e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/ro/radvd.po
+@@ -0,0 +1,384 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-07 16:12+0200\n"
++"Last-Translator: Daniel <daniel.petre@pitesti.rcs-rds.ro>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "6to4 interface"
++msgstr "Interfata 6la4"
++
++msgid "Address"
++msgstr "Adresa"
++
++msgid "Addresses"
++msgstr "Adrese"
++
++msgid "Advanced"
++msgstr "Avansat"
++
++msgid "Advertise Home Agent flag"
++msgstr "Anunta semaforul \"Home Agent\""
++
++msgid "Advertise router address"
++msgstr "Anunta adresa routerului"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Sufixe anuntate de domeniu"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"Server RDNSS IPv6 anuntat. Daca e lasat gol, atunci adresa IPv6 a interfetei "
++"este folosita"
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Prefixe IPv6 anuntate"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Prefixe IPv6 anuntate. Daca e neconfigurat atunci prefixul de pe interfata "
++"curenta este folosit"
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr "Anunta capabilitatea de \"Home Agent\" IPv6 mobil (RFC3775)"
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr "Anunta capacitatea de inregistrare \"Mobile Router\""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr "Anunta preferinta routerului implicit"
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr "Anunta"
++
++msgid "Autonomous"
++msgstr "Autonom"
++
++msgid "Clients"
++msgstr "Clienti"
++
++msgid "Configuration flag"
++msgstr "Semafor de configurare"
++
++msgid "Current hop limit"
++msgstr "Limita hop-ului curent"
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "Configurarea DNSSL"
++
++msgid "Default lifetime"
++msgstr "Durata implicita"
++
++msgid "Default preference"
++msgstr "Preferinta implicita"
++
++msgid "Enable"
++msgstr "Activeaza"
++
++msgid "Enable advertisements"
++msgstr "Activeaza anunturile"
++
++msgid "Enables router advertisements and solicitations"
++msgstr "Activeaza anunturile si solicitarile routerului"
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr "Informatia despre \"Home Agent\""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr "Preferinta \"Home Agent\""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfata"
++
++msgid "Interface Configuration"
++msgstr "Configurarea interfetei"
++
++msgid "Interface required"
++msgstr "Interfata necesara"
++
++msgid "Interfaces"
++msgstr "Interfete"
++
++msgid "Lifetime"
++msgstr "Durata de viata"
++
++msgid "Link MTU"
++msgstr "MTU pe legatura"
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr "Interval maxim"
++
++msgid "Maximum advertisement interval"
++msgstr "Intervalul maxim de anuntare"
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr "IPv6 mobil"
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr "Multicast"
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr "Preferinta"
++
++msgid "Preferred lifetime"
++msgstr "Durata de viata preferata"
++
++msgid "Prefix"
++msgstr "Prefix"
++
++msgid "Prefix Configuration"
++msgstr "Configurarea prefixului"
++
++msgid "Prefixes"
++msgstr "Prefixe"
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr "Configurarea rutelor"
++
++msgid "Routes"
++msgstr "Rute"
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr "Sufix"
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr "Doar unicast"
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr "nu"
++
++msgid "yes"
++msgstr "da"
++
++#~ msgid "Advertised IPv6 prefix"
++#~ msgstr "Prefixul IPv6 anuntat"
++
++#~ msgid ""
++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used"
++#~ msgstr ""
++#~ "Prefixul IPv6 anuntat. Daca e lasat gol atunci prefixul de pe interfata "
++#~ "curenta este folosit"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/ru/radvd.po b/feeds/luci/applications/luci-app-radvd/po/ru/radvd.po
+new file mode 100644
+index 0000000..37cc942
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/ru/radvd.po
+@@ -0,0 +1,473 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: radvd\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2012-08-16 11:37+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "6to4 interface"
++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ 6to4"
++
++msgid "Address"
++msgstr "ÐдреÑ"
++
++msgid "Addresses"
++msgstr "ÐдреÑа"
++
++msgid "Advanced"
++msgstr "РаÑширенные"
++
++msgid "Advertise Home Agent flag"
++msgstr "Извещать индикатор домашнего агента"
++
++msgid "Advertise router address"
++msgstr "Извещать Ð°Ð´Ñ€ÐµÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Извещаемые ÑуффикÑÑ‹ домена"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"Извещаемый IPv6 RDNSS. ЕÑли значение не задано, то будет иÑпользован текущий "
++"IPv6-Ð°Ð´Ñ€ÐµÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа."
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Извещаемые IPv6-префикÑÑ‹"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Извещаемые IPv6-префикÑÑ‹. ЕÑли значение не задано, то будет иÑпользован "
++"текущий Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа."
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr "Извещает возможноÑти домашнего агента мобильного IPv6 (RFC3775)"
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++"Извещает возможноÑти региÑтрации мобильного маршрутизатора (NEMO Basic)"
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++"Извещает предполагаемое Ð²Ñ€ÐµÐ¼Ñ Ð´Ð¾Ñтупа к ÑоÑедним узлам (мÑ). При значении 0 "
++"извещение не проиÑходит."
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++"Извещает значение чиÑла переходов по умолчанию Ð´Ð»Ñ Ð¸ÑходÑщих одноадреÑных "
++"пакетов. При значении 0 извещение не проиÑходит."
++
++msgid "Advertises the default router preference"
++msgstr "Извещает параметры Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° по умолчанию"
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++"Извещает указанный макÑимальный размер пакета (MTU) в Ñообщении RA. 0 "
++"выключает данную функцию"
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++"Извещает период (Ñек.), в течение которого адреÑа, Ñозданные из префикÑа Ñ "
++"помощью SLAAC, оÑтаютÑÑ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸."
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++"Извещает период (Ñек.), в течение которого Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÑвлÑетÑÑ Ð´ÐµÐ¹Ñтвительным "
++"Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑоединениÑ."
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++"Извещает период дейÑÑ‚Ð²Ð¸Ñ (Ñек.) маршрутизатора по умолчанию. 0 указывает на "
++"то, что узел не ÑвлÑетÑÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ по умолчанию."
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++"Извещает период (Ñек.) предоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñлужб домашнего агента мобильного IPv6"
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++"Извещает Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (мÑ) между ÑообщениÑми Neighbor Solicitation, еÑли "
++"RA включен. 0 отключает передачу извещений"
++
++msgid "Advertising"
++msgstr "Извещение"
++
++msgid "Autonomous"
++msgstr "Ðвтономный"
++
++msgid "Clients"
++msgstr "Клиенты"
++
++msgid "Configuration flag"
++msgstr "Конфигурационный флаг"
++
++msgid "Current hop limit"
++msgstr "Текущее ограничение кол-ва прыжков"
++
++msgid "DNSSL"
++msgstr "DNSSL"
++
++msgid "DNSSL Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ DNSSL"
++
++msgid "Default lifetime"
++msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾ умолчанию"
++
++msgid "Default preference"
++msgstr "Приоритет по умолчанию"
++
++msgid "Enable"
++msgstr "Включить"
++
++msgid "Enable advertisements"
++msgstr "Включить извещениÑ"
++
++msgid "Enables router advertisements and solicitations"
++msgstr "Включает Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸ запроÑÑ‹ маршрутизатора"
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr "Включает дополнительный протокол автоконфигурации (RFC2462)"
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr "Включает автоконфигурацию дополнительной информации (RFC2462)"
++
++msgid "General"
++msgstr "Общие"
++
++msgid "Home Agent information"
++msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ домашнем агенте"
++
++msgid "Home Agent lifetime"
++msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÐµÐ³Ð¾ агента"
++
++msgid "Home Agent preference"
++msgstr "Приоритет домашнего агента"
++
++msgid "Include Home Agent Information in the RA"
++msgstr "Включить информацию о домашнем агенте в ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ RA"
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr "Включить интервал Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ð¾Ð³Ð¾ IPv6 в ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ RA"
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr "Включает Ð°Ð´Ñ€ÐµÑ ÐºÐ°Ð½Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¸ÑходÑщего интерфейÑа в ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ RA"
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++"Указывает, что Ð°Ð´Ñ€ÐµÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа отправлÑетÑÑ Ð²Ð¼ÐµÑто префикÑа Ñети, как Ñто "
++"требуетÑÑ Ð² мобильном IPv6"
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++"Указывает, что Ñоединение не ÑвлÑетÑÑ ÑˆÐ¸Ñ€Ð¾ÐºÐ¾Ð²ÐµÑ‰Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼, и блокирует отÑылку "
++"незапрошенных извещений"
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++"Указывае, что данный Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¼Ð¾Ð¶ÐµÑ‚ быть иÑпользован Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð½Ð¾Ð¼Ð½Ð¾Ð¹ наÑтройки "
++"адреÑа (RFC4862)"
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++"Указывает, что данный Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¼Ð¾Ð¶ÐµÑ‚ быть иÑпользован Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ "
++"Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (RFC4861)"
++
++msgid "Interface"
++msgstr "ИнтерфейÑ"
++
++msgid "Interface Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа"
++
++msgid "Interface required"
++msgstr "ТребуетÑÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ"
++
++msgid "Interfaces"
++msgstr "ИнтерфейÑÑ‹"
++
++msgid "Lifetime"
++msgstr "Срок дейÑтвиÑ"
++
++msgid "Link MTU"
++msgstr "МакÑимальный размер пакета (MTU)"
++
++msgid "Managed flag"
++msgstr "УправлÑемый флаг"
++
++msgid "Max. interval"
++msgstr "МакÑ. интервал"
++
++msgid "Maximum advertisement interval"
++msgstr "МакÑимальный интервал извещениÑ"
++
++msgid "Minimum advertisement delay"
++msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ° извещениÑ"
++
++msgid "Minimum advertisement interval"
++msgstr "Минимальный интервал извещениÑ"
++
++msgid "Mobile IPv6"
++msgstr "Мобильный IPv6"
++
++msgid "Mobile IPv6 interval option"
++msgstr "Параметры интервала мобильного IPv6"
++
++msgid "Mobile IPv6 router registration"
++msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ð¾Ð³Ð¾ IPv6 маршрутизатора"
++
++msgid "Multicast"
++msgstr "Ð“Ñ€ÑƒÐ¿Ð¿Ð¾Ð²Ð°Ñ Ñ€Ð°ÑÑылка"
++
++#, fuzzy
++msgid "On-link"
++msgstr "Соединение"
++
++msgid "On-link determination"
++msgstr "Определение Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑоединениÑ"
++
++msgid "Preference"
++msgstr "Приоритет"
++
++msgid "Preferred lifetime"
++msgstr "Предпочитаемый Ñрок дейÑтвиÑ"
++
++msgid "Prefix"
++msgstr "ПрефикÑ"
++
++msgid "Prefix Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑа"
++
++msgid "Prefixes"
++msgstr "ПрефикÑÑ‹"
++
++msgid "RDNSS"
++msgstr "RDNSS"
++
++msgid "RDNSS Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ RDNSS"
++
++msgid "Radvd"
++msgstr "Radvd"
++
++msgid "Radvd - DNSSL"
++msgstr "Radvd - DNSSL"
++
++msgid "Radvd - Interface %q"
++msgstr "Radvd - Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ %q"
++
++msgid "Radvd - Prefix"
++msgstr "Radvd - ПрефикÑ"
++
++msgid "Radvd - RDNSS"
++msgstr "Radvd - RDNSS"
++
++msgid "Radvd - Route"
++msgstr "Radvd - Маршрут"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++"Radvd - Ñто Ñлужба извещений маршрутизатора Ð´Ð»Ñ IPv6. Она Ñлушает запроÑÑ‹ "
++"(Router Solicitations) и отÑылает Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ (Router Advertisements), как "
++"опиÑано в RFC 4861."
++
++msgid "Reachable time"
++msgstr "Период доÑтупноÑти"
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++"СвÑзыватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼Ð¸ клиентами. ОÑтавьте пуÑтым, чтобы "
++"иÑпользовать групповую раÑÑылку"
++
++msgid "Retransmit timer"
++msgstr "Таймер ретранÑлÑции"
++
++msgid "Route Configuration"
++msgstr "ÐаÑтройка маршрута"
++
++msgid "Routes"
++msgstr "Маршруты"
++
++msgid "Source link-layer address"
++msgstr "ÐÐ´Ñ€ÐµÑ Ð¸Ñточника (канальный уровень)"
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++"УÑтанавливает Ð¸Ð¼Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого интерфейÑа Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑа 6to4. "
++"Публичный IPv4-Ð°Ð´Ñ€ÐµÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа комбинитуетÑÑ Ñ 2002::/3 и значением префикÑа"
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr "Указывает период жизни, ÑвÑзанный Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¾Ð¼ (Ñек.)"
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++"УÑтанавливает Ð¸Ð¼Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого интерфейÑа, которому принадлежит Ð´Ð°Ð½Ð½Ð°Ñ ÑекциÑ"
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++"Указывает макÑимальную длительноÑÑ‚ÑŒ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей DNSSL Ð´Ð»Ñ "
++"Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¸Ð¼Ñ‘Ð½."
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++"Указывает макÑимальную длительноÑÑ‚ÑŒ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей RDNSS Ð´Ð»Ñ "
++"Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¸Ð¼Ñ‘Ð½."
++
++msgid "Specifies the preference associated with the default router"
++msgstr "Указывает приоритет, ÑвÑзанный Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ по умолчанию"
++
++msgid "Suffix"
++msgstr "СуффикÑ"
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"МакÑимальный интервал времени между отÑылкой групповых незапрашиваемых "
++"извещений маршрутизатора (Ñек.)"
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++"Минимальный интервал времени между отÑылкой групповых извещений "
++"маршрутизатора Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа (Ñек.)"
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++"Минимальный интервал времени между отÑылкой групповых незапрашиваемых "
++"извещений маршрутизатора (Ñек.)"
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr "Предпочтение домашнего агента, отÑылающего данное извещение RA"
++
++msgid "Timing"
++msgstr "Интервалы"
++
++msgid "Unicast only"
++msgstr "Только одноадреÑÐ½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°"
++
++msgid "Valid lifetime"
++msgstr "Срок дейÑтвиÑ"
++
++msgid "Validity time"
++msgstr "Период дейÑтвиÑ"
++
++msgid "default"
++msgstr "по умолчанию"
++
++msgid "high"
++msgstr "выÑокий"
++
++msgid "low"
++msgstr "низкий"
++
++msgid "medium"
++msgstr "Ñредний"
++
++msgid "no"
++msgstr "нет"
++
++msgid "yes"
++msgstr "да"
++
++#~ msgid "Advertised IPv6 prefix"
++#~ msgstr "Извещаемый IPv6 префикÑ"
++
++#~ msgid ""
++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used"
++#~ msgstr ""
++#~ "Извещаемый IPv6 префикÑ. ЕÑли значение не задано, то будет иÑпользован "
++#~ "текущий Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа."
++
++#~ msgid ""
++#~ "Advertises the length of time in seconds that addresses generated from "
++#~ "the prefix via stateless address autoconfiguration remain preferred. Use "
++#~ "0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Извещает Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах, в течение которого адреÑа Ñгенерированные "
++#~ "автоматичеÑки из префикÑа оÑтаютÑÑ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸. 0 уÑтанавливает "
++#~ "неограниченное времÑ."
++
++#~ msgid ""
++#~ "Advertises the length of time in seconds that the prefix is valid for the "
++#~ "purpose of on-link determination. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "Извещает Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах, в течение которого иÑпользуетÑÑ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð´Ð»Ñ "
++#~ "Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑоединениÑ. 0 уÑтанавливает неограниченное времÑ."
++
++#~ msgid ""
++#~ "Indicates whether that RDNSS continues to be available to hosts even if "
++#~ "they moved to a different subnet"
++#~ msgstr ""
++#~ "Указывает оÑтаетÑÑ Ð»Ð¸ RDNSS доÑтупным Ð´Ð»Ñ Ñ…Ð¾Ñтов даже в Ñлучае их "
++#~ "Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð² другую подÑеть"
++
++#~ msgid ""
++#~ "Specifies the lifetime associated with the route in seconds. Use 0 to "
++#~ "specify an infinite lifetime"
++#~ msgstr ""
++#~ "УÑтанавливает Ñрок дейÑтвиÑ, ÑвÑзанный Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¾Ð¼ (Ñекунды). ИÑпользуйте "
++#~ "0 Ð´Ð»Ñ ÑƒÑтановки беÑконечного Ñрока дейÑтвиÑ."
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the DNSSL entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "УÑтанавливает макÑимальный Ñрок дейÑÑ‚Ð²Ð¸Ñ DNSSL Ñлементов Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ "
++#~ "имен.ИÑпользуйте 0 Ð´Ð»Ñ ÑƒÑтановки беÑконечного Ñрока дейÑтвиÑ"
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the RDNSS entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr ""
++#~ "УÑтанавливает макÑимальный Ñрок дейÑÑ‚Ð²Ð¸Ñ DNSSL Ñлементов Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ "
++#~ "имен.ИÑпользуйте 0 Ð´Ð»Ñ ÑƒÑтановки беÑконечного Ñрока дейÑтвиÑ"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/sk/radvd.po b/feeds/luci/applications/luci-app-radvd/po/sk/radvd.po
+new file mode 100644
+index 0000000..9bd26fa
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/sk/radvd.po
+@@ -0,0 +1,367 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "6to4 interface"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Addresses"
++msgstr ""
++
++msgid "Advanced"
++msgstr ""
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/po/sv/radvd.po b/feeds/luci/applications/luci-app-radvd/po/sv/radvd.po
+new file mode 100644
+index 0000000..46a3bf9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/sv/radvd.po
+@@ -0,0 +1,368 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "6to4 interface"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Addresses"
++msgstr ""
++
++msgid "Advanced"
++msgstr ""
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/po/templates/radvd.pot b/feeds/luci/applications/luci-app-radvd/po/templates/radvd.pot
+new file mode 100644
+index 0000000..ff9eb54
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/templates/radvd.pot
+@@ -0,0 +1,360 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "6to4 interface"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Addresses"
++msgstr ""
++
++msgid "Advanced"
++msgstr ""
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/po/tr/radvd.po b/feeds/luci/applications/luci-app-radvd/po/tr/radvd.po
+new file mode 100644
+index 0000000..8b8ed8f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/tr/radvd.po
+@@ -0,0 +1,367 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "6to4 interface"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Addresses"
++msgstr ""
++
++msgid "Advanced"
++msgstr ""
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/po/uk/radvd.po b/feeds/luci/applications/luci-app-radvd/po/uk/radvd.po
+new file mode 100644
+index 0000000..648035d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/uk/radvd.po
+@@ -0,0 +1,381 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-05-26 19:17+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "6to4 interface"
++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ 6to4"
++
++msgid "Address"
++msgstr "ÐдреÑа"
++
++msgid "Addresses"
++msgstr "ÐдреÑи"
++
++msgid "Advanced"
++msgstr "Додатково"
++
++msgid "Advertise Home Agent flag"
++msgstr "Оголошувати позначку Home Agent"
++
++msgid "Advertise router address"
++msgstr "Оголошувати адреÑу роутера"
++
++msgid "Advertised Domain Suffixes"
++msgstr "Оголошувані ÑуфікÑи домену"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++"Оголошуваний IPv6 RDNSS. Якщо не задано, викориÑтовуєтьÑÑ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð° "
++"IPv6-адреÑа інтерфейÑу."
++
++msgid "Advertised IPv6 prefixes"
++msgstr "Оголошувані IPv6-префікÑи"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++"Оголошувані IPv6-префікÑи. Якщо не задано, викориÑтовуєтьÑÑ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¸Ð¹ Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ "
++"інтерфейÑу"
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr "Оголошує можливоÑÑ‚Ñ– Home Agent мобільного IPv6 (RFC3775)"
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr "Оголошує можливоÑÑ‚Ñ– реєÑтрації мобільного маршрутизатора (NEMO Basic)"
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++"Оголошує передбачуваний Ñ‡Ð°Ñ Ð´Ð¾ÑÑжноÑÑ‚Ñ– (у міліÑекундах) ÑуÑідніх вузлів. "
++"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0 відключає оголошеннÑ."
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++"Оголошує типове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð»Ñ–Ñ‡Ð¸Ð»ÑŒÐ½Ð¸ÐºÐ° HOP-ів Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… unicast-пакетів. "
++"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0 відключає оголошеннÑ."
++
++msgid "Advertises the default router preference"
++msgstr "Оголошує типові наÑтройки маршрутизатора"
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++"Оголошує певний макÑимальний розмір пакета (Ñкщо він вказаний). Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0 "
++"відключає оголошеннÑ."
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr "ОголошеннÑ"
++
++msgid "Autonomous"
++msgstr "Ðвтономний"
++
++msgid "Clients"
++msgstr "Клієнти"
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/po/vi/radvd.po b/feeds/luci/applications/luci-app-radvd/po/vi/radvd.po
+new file mode 100644
+index 0000000..63f8fa0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/vi/radvd.po
+@@ -0,0 +1,368 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2010-11-21 04:06+0100\n"
++"Last-Translator: <jow@openwrt.org>\n"
++"Language-Team: German\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "6to4 interface"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Addresses"
++msgstr ""
++
++msgid "Advanced"
++msgstr ""
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/po/zh-cn/radvd.po b/feeds/luci/applications/luci-app-radvd/po/zh-cn/radvd.po
+new file mode 100644
+index 0000000..f3dae7f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/zh-cn/radvd.po
+@@ -0,0 +1,391 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2014-07-13 16:23+0200\n"
++"Last-Translator: qiuchengxuan <qiuchengxuan@gmail.com>\n"
++"Language-Team: QQ Group 75543259 <axishero@foxmail.com>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "6to4 interface"
++msgstr "IPv6到IPv4的接å£"
++
++msgid "Address"
++msgstr "地å€"
++
++msgid "Addresses"
++msgstr "地å€"
++
++msgid "Advanced"
++msgstr "进阶选项"
++
++msgid "Advertise Home Agent flag"
++msgstr "广播本地中继标识"
++
++msgid "Advertise router address"
++msgstr "广播路由地å€"
++
++msgid "Advertised Domain Suffixes"
++msgstr "区域广播åŽç¼€"
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr "IPv6 Recursive DNSæœåŠ¡å™¨(RDNSS)地å€ã€‚若为空,则为当å‰IPv6地å€"
++
++msgid "Advertised IPv6 prefixes"
++msgstr "IPV6广播å‰ç¼€ç¾¤"
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr "IPv6广播å‰ç¼€ç¾¤ã€‚如果为空,将使用当å‰æŽ¥å£çš„å‰ç¼€"
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr "广播移动IPv6本地代ç†åŠŸèƒ½ï¼ˆRFC3775"
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr "广播移动路由器注册功能(NEMO基本)"
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr "路由器公告报文中宣告估算的邻居å¯è¾¾æ—¶é—´ï¼ˆæ¯«ç§’)。0代表ç¦ç”¨å¯è¾¾æ€§å®£å‘Šã€‚"
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr "路由器公告报文中广播外å‘å•æ’­æ•°æ®åŒ…的缺çœè·³æ•°å€¼ã€‚ 0ç¦ç”¨å¹¿æ’­è·³æ•°"
++
++msgid "Advertises the default router preference"
++msgstr "å‘布缺çœè·¯ç”±è®¾ç½®"
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr "路由器公告报文中宣告链路MTU。0代表ç¦ç”¨MTU宣告"
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr "声明默认路由器的生存时间(å•ä½ä¸ºç§’)。0代表结点没有默认路由"
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr "自治的"
++
++msgid "Clients"
++msgstr "客户端"
++
++msgid "Configuration flag"
++msgstr "设置标识"
++
++msgid "Current hop limit"
++msgstr "当å‰è·³æ•°é™åˆ¶"
++
++msgid "DNSSL"
++msgstr "DNSæœç´¢åˆ—表"
++
++msgid "DNSSL Configuration"
++msgstr "DNSæœç´¢åˆ—表设置"
++
++msgid "Default lifetime"
++msgstr "默认生存时é™"
++
++msgid "Default preference"
++msgstr "默认优先级"
++
++msgid "Enable"
++msgstr "å¯ç”¨"
++
++msgid "Enable advertisements"
++msgstr "å¯ç”¨å¹¿æ’­"
++
++msgid "Enables router advertisements and solicitations"
++msgstr "激活路由广播和请求"
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr "使能附加的基于状æ€ç®¡ç†çš„自动é…ç½®å议(RFC2462)"
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr "å¯ç”¨è‡ªåŠ¨é…置,ä¸åŒ…括地å€ä¿¡æ¯(RFC2462)"
++
++msgid "General"
++msgstr "概况"
++
++msgid "Home Agent information"
++msgstr "本地中继信æ¯"
++
++msgid "Home Agent lifetime"
++msgstr "本地中继有效期"
++
++msgid "Home Agent preference"
++msgstr "本地中继优先æƒ"
++
++msgid "Include Home Agent Information in the RA"
++msgstr "路由器公告报文中包å«æœ¬åœ°ä¸­ç»§ä¿¡æ¯"
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr "路由器公告报文中包å«ç§»åŠ¨IPV6广播间隔设置"
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr "路由器公告报文中包å«å‡ºæŽ¥å£çš„链路层地å€"
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr "表明使用接å£çš„地å€å‘é€è€Œéžç½‘络å‰ç¼€ï¼Œç§»åŠ¨IPv6需è¦"
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr "表明潜在的链路并ä¸å…·æœ‰å¹¿æ’­èƒ½åŠ›ï¼Œé¿å…主动触å‘的宣告报文å‘出"
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr "表明此å‰ç¼€èƒ½å¤Ÿç”¨äºŽåŒ¿å地å€é…置(RFC4862)"
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr "表明此å‰ç¼€èƒ½å¤Ÿç”¨äºŽon-link决定(RFC481)"
++
++msgid "Interface"
++msgstr "接å£"
++
++msgid "Interface Configuration"
++msgstr "接å£è®¾ç½®"
++
++msgid "Interface required"
++msgstr "接å£å¿…è¦é¡¹"
++
++msgid "Interfaces"
++msgstr "接å£"
++
++msgid "Lifetime"
++msgstr "有效期"
++
++msgid "Link MTU"
++msgstr "连接MTU"
++
++msgid "Managed flag"
++msgstr "M标识"
++
++msgid "Max. interval"
++msgstr "最大间隔"
++
++msgid "Maximum advertisement interval"
++msgstr "最大广播间隔"
++
++msgid "Minimum advertisement delay"
++msgstr "最å°å¹¿æ’­å»¶æ—¶"
++
++msgid "Minimum advertisement interval"
++msgstr "最å°å¹¿æ’­é—´éš”"
++
++msgid "Mobile IPv6"
++msgstr "移动IPV6"
++
++msgid "Mobile IPv6 interval option"
++msgstr "移动IPV6间隔选项"
++
++msgid "Mobile IPv6 router registration"
++msgstr "移动IPV6路由注册"
++
++msgid "Multicast"
++msgstr "组播传输"
++
++msgid "On-link"
++msgstr "已连接的"
++
++msgid "On-link determination"
++msgstr "已连接的目标"
++
++msgid "Preference"
++msgstr "优先æƒ"
++
++msgid "Preferred lifetime"
++msgstr "期望的生存时间"
++
++msgid "Prefix"
++msgstr "å‰ç¼€"
++
++msgid "Prefix Configuration"
++msgstr "å‰ç¼€è®¾ç½®"
++
++msgid "Prefixes"
++msgstr "å‰ç¼€ç¾¤"
++
++msgid "RDNSS"
++msgstr "邻居å‘现æœåŠ¡å™¨"
++
++msgid "RDNSS Configuration"
++msgstr "邻居å‘现æœåŠ¡å™¨è®¾ç½®"
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr "RADVDï¼DNSæœç´¢åˆ—表"
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr "RADVDï¼å‰ç¼€"
++
++msgid "Radvd - RDNSS"
++msgstr "RADVDï¼é‚»å±…å‘现æœåŠ¡å™¨"
++
++msgid "Radvd - Route"
++msgstr "RADVDï¼è·¯ç”±"
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr "RADVD是一个IPV6路由公告软件,按照RFC4861监å¬è·¯ç”±è¯·æ±‚å’Œå‘é€è·¯ç”±å…¬å‘Šã€‚"
++
++msgid "Reachable time"
++msgstr "å¯è¾¾å»¶æ—¶"
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr "é™åˆ¶ç‰¹å®šä¼šè¯ï¼Œç•™ç©ºåˆ™ä½¿ç”¨ç»„æ’­"
++
++msgid "Retransmit timer"
++msgstr "中继转å‘计时器"
++
++msgid "Route Configuration"
++msgstr "路由设置"
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr "æºé“¾è·¯å±‚地å€"
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr "设定路由关è”的生存时间,å•ä½ä¸ºç§’"
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr "说明这个物ç†æŽ¥å£è¿žæŽ¥åˆ°å“ªä¸ªç½‘络"
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr "设定DNSSL表项å称解æžçš„最长时间间隔"
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr "设定RDNSS表项å称解æžçš„最长时间间隔"
++
++msgid "Specifies the preference associated with the default router"
++msgstr "设定关è”的默认路由的é…ç½®"
++
++msgid "Suffix"
++msgstr "åŽç¼€"
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr "å…许接å£å‘é€ç»„播路由宣告报文的最大时间间隔,å•ä½ä¸ºç§’"
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr "å…许接å£å‘é€ç»„播路由宣告报文的最å°æ—¶é—´é—´éš”,å•ä½ä¸ºç§’"
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr "å…许接å£å‘é€ä¸»åŠ¨è§¦å‘组播路由宣告报文的最å°æ—¶é—´é—´éš”,å•ä½ä¸ºç§’"
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr "å•æ’­"
++
++msgid "Valid lifetime"
++msgstr "有效的生存时间"
++
++msgid "Validity time"
++msgstr "有效期"
++
++msgid "default"
++msgstr "默认"
++
++msgid "high"
++msgstr "高"
++
++msgid "low"
++msgstr "低"
++
++msgid "medium"
++msgstr "中等"
++
++msgid "no"
++msgstr "å¦"
++
++msgid "yes"
++msgstr "是"
++
++#~ msgid "Advertised IPv6 prefix"
++#~ msgstr "IPV6广播å‰ç¼€"
++
++#~ msgid ""
++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used"
++#~ msgstr "IPV6广播å‰ç¼€ã€‚若为空,则当å‰æŽ¥å£å‰ç¼€å·²è¢«ä½¿ç”¨ã€‚"
++
++#~ msgid "Open"
++#~ msgstr "打开"
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the DNSSL entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr "指定DNSSL解æžåŸŸå的最长时间,0则为无é™é•¿"
++
++#~ msgid ""
++#~ "Specifies the maximum duration how long the RDNSS entries are used for "
++#~ "name resolution. Use 0 to specify an infinite lifetime"
++#~ msgstr "指定RDNSS解æžåŸŸå的最长时间,0则为无é™é•¿"
+diff --git a/feeds/luci/applications/luci-app-radvd/po/zh-tw/radvd.po b/feeds/luci/applications/luci-app-radvd/po/zh-tw/radvd.po
+new file mode 100644
+index 0000000..aed76c5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/po/zh-tw/radvd.po
+@@ -0,0 +1,366 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "6to4 interface"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Addresses"
++msgstr ""
++
++msgid "Advanced"
++msgstr ""
++
++msgid "Advertise Home Agent flag"
++msgstr ""
++
++msgid "Advertise router address"
++msgstr ""
++
++msgid "Advertised Domain Suffixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface "
++"is used"
++msgstr ""
++
++msgid "Advertised IPv6 prefixes"
++msgstr ""
++
++msgid ""
++"Advertised IPv6 prefixes. If empty, the current interface prefix is used"
++msgstr ""
++
++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)"
++msgstr ""
++
++msgid "Advertises Mobile Router registration capability (NEMO Basic)"
++msgstr ""
++
++msgid ""
++"Advertises assumed reachability time in milliseconds of neighbours in the RA "
++"if specified. 0 disables reachability advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the default Hop Count value for outgoing unicast packets in the "
++"RA. 0 disables hopcount advertisements"
++msgstr ""
++
++msgid "Advertises the default router preference"
++msgstr ""
++
++msgid ""
++"Advertises the given link MTU in the RA if specified. 0 disables MTU "
++"advertisements"
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that addresses generated from the "
++"prefix via stateless address autoconfiguration remain preferred."
++msgstr ""
++
++msgid ""
++"Advertises the length of time in seconds that the prefix is valid for the "
++"purpose of on-link determination."
++msgstr ""
++
++msgid ""
++"Advertises the lifetime of the default router in seconds. 0 indicates that "
++"the node is no default router"
++msgstr ""
++
++msgid ""
++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent "
++"services"
++msgstr ""
++
++msgid ""
++"Advertises wait time in milliseconds between Neighbor Solicitation messages "
++"in the RA if specified. 0 disables retransmit advertisements"
++msgstr ""
++
++msgid "Advertising"
++msgstr ""
++
++msgid "Autonomous"
++msgstr ""
++
++msgid "Clients"
++msgstr ""
++
++msgid "Configuration flag"
++msgstr ""
++
++msgid "Current hop limit"
++msgstr ""
++
++msgid "DNSSL"
++msgstr ""
++
++msgid "DNSSL Configuration"
++msgstr ""
++
++msgid "Default lifetime"
++msgstr ""
++
++msgid "Default preference"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable advertisements"
++msgstr ""
++
++msgid "Enables router advertisements and solicitations"
++msgstr ""
++
++msgid ""
++"Enables the additional stateful administered autoconfiguration protocol "
++"(RFC2462)"
++msgstr ""
++
++msgid ""
++"Enables the autoconfiguration of additional, non address information "
++"(RFC2462)"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Home Agent information"
++msgstr ""
++
++msgid "Home Agent lifetime"
++msgstr ""
++
++msgid "Home Agent preference"
++msgstr ""
++
++msgid "Include Home Agent Information in the RA"
++msgstr ""
++
++msgid "Include Mobile IPv6 Advertisement Interval option to RA"
++msgstr ""
++
++msgid "Includes the link-layer address of the outgoing interface in the RA"
++msgstr ""
++
++msgid ""
++"Indicates that the address of interface is sent instead of network prefix, "
++"as is required by Mobile IPv6"
++msgstr ""
++
++msgid ""
++"Indicates that the underlying link is not broadcast capable, prevents "
++"unsolicited advertisements from being sent"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for autonomous address configuration "
++"(RFC4862)"
++msgstr ""
++
++msgid ""
++"Indicates that this prefix can be used for on-link determination (RFC4861)"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface required"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Lifetime"
++msgstr ""
++
++msgid "Link MTU"
++msgstr ""
++
++msgid "Managed flag"
++msgstr ""
++
++msgid "Max. interval"
++msgstr ""
++
++msgid "Maximum advertisement interval"
++msgstr ""
++
++msgid "Minimum advertisement delay"
++msgstr ""
++
++msgid "Minimum advertisement interval"
++msgstr ""
++
++msgid "Mobile IPv6"
++msgstr ""
++
++msgid "Mobile IPv6 interval option"
++msgstr ""
++
++msgid "Mobile IPv6 router registration"
++msgstr ""
++
++msgid "Multicast"
++msgstr ""
++
++msgid "On-link"
++msgstr ""
++
++msgid "On-link determination"
++msgstr ""
++
++msgid "Preference"
++msgstr ""
++
++msgid "Preferred lifetime"
++msgstr ""
++
++msgid "Prefix"
++msgstr ""
++
++msgid "Prefix Configuration"
++msgstr ""
++
++msgid "Prefixes"
++msgstr ""
++
++msgid "RDNSS"
++msgstr ""
++
++msgid "RDNSS Configuration"
++msgstr ""
++
++msgid "Radvd"
++msgstr ""
++
++msgid "Radvd - DNSSL"
++msgstr ""
++
++msgid "Radvd - Interface %q"
++msgstr ""
++
++msgid "Radvd - Prefix"
++msgstr ""
++
++msgid "Radvd - RDNSS"
++msgstr ""
++
++msgid "Radvd - Route"
++msgstr ""
++
++msgid ""
++"Radvd is a router advertisement daemon for IPv6. It listens to router "
++"solicitations and sends router advertisements as described in RFC 4861."
++msgstr ""
++
++msgid "Reachable time"
++msgstr ""
++
++msgid ""
++"Restrict communication to specified clients, leave empty to use multicast"
++msgstr ""
++
++msgid "Retransmit timer"
++msgstr ""
++
++msgid "Route Configuration"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid "Source link-layer address"
++msgstr ""
++
++msgid ""
++"Specifies a logical interface name to derive a 6to4 prefix from. The "
++"interfaces public IPv4 address is combined with 2002::/3 and the value of "
++"the prefix option"
++msgstr ""
++
++msgid "Specifies the lifetime associated with the route in seconds."
++msgstr ""
++
++msgid "Specifies the logical interface name this section belongs to"
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the DNSSL entries are used for name "
++"resolution."
++msgstr ""
++
++msgid ""
++"Specifies the maximum duration how long the RDNSS entries are used for name "
++"resolution."
++msgstr ""
++
++msgid "Specifies the preference associated with the default router"
++msgstr ""
++
++msgid "Suffix"
++msgstr ""
++
++msgid ""
++"The maximum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending multicast router advertisements "
++"from the interface, in seconds"
++msgstr ""
++
++msgid ""
++"The minimum time allowed between sending unsolicited multicast router "
++"advertisements from the interface, in seconds"
++msgstr ""
++
++msgid "The preference for the Home Agent sending this RA"
++msgstr ""
++
++msgid "Timing"
++msgstr ""
++
++msgid "Unicast only"
++msgstr ""
++
++msgid "Valid lifetime"
++msgstr ""
++
++msgid "Validity time"
++msgstr ""
++
++msgid "default"
++msgstr ""
++
++msgid "high"
++msgstr ""
++
++msgid "low"
++msgstr ""
++
++msgid "medium"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "yes"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-radvd/root/etc/uci-defaults/luci-radvd b/feeds/luci/applications/luci-app-radvd/root/etc/uci-defaults/luci-radvd
+new file mode 100755
+index 0000000..c1f3b75
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-radvd/root/etc/uci-defaults/luci-radvd
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@radvd[-1]
++ add ucitrack radvd
++ set ucitrack.@radvd[-1].init=radvd
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-samba/Makefile b/feeds/luci/applications/luci-app-samba/Makefile
+new file mode 100644
+index 0000000..ba599b3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Network Shares - Samba SMB/CIFS module
++LUCI_DEPENDS:=+samba36-server
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-samba/luasrc/controller/samba.lua b/feeds/luci/applications/luci-app-samba/luasrc/controller/samba.lua
+new file mode 100644
+index 0000000..397af6a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/luasrc/controller/samba.lua
+@@ -0,0 +1,16 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.samba", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/samba") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "services", "samba"}, cbi("samba"), _("Network Shares"))
++ page.dependent = true
++end
+diff --git a/feeds/luci/applications/luci-app-samba/luasrc/model/cbi/samba.lua b/feeds/luci/applications/luci-app-samba/luasrc/model/cbi/samba.lua
+new file mode 100644
+index 0000000..721191a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/luasrc/model/cbi/samba.lua
+@@ -0,0 +1,72 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("samba", translate("Network Shares"))
++
++s = m:section(TypedSection, "samba", "Samba")
++s.anonymous = true
++
++s:tab("general", translate("General Settings"))
++s:tab("template", translate("Edit Template"))
++
++s:taboption("general", Value, "name", translate("Hostname"))
++s:taboption("general", Value, "description", translate("Description"))
++s:taboption("general", Value, "workgroup", translate("Workgroup"))
++s:taboption("general", Value, "homes", translate("Share home-directories"),
++ translate("Allow system users to reach their home directories via " ..
++ "network shares"))
++
++tmpl = s:taboption("template", Value, "_tmpl",
++ translate("Edit the template that is used for generating the samba configuration."),
++ translate("This is the content of the file '/etc/samba/smb.conf.template' from which your samba configuration will be generated. " ..
++ "Values enclosed by pipe symbols ('|') should not be changed. They get their values from the 'General Settings' tab."))
++
++tmpl.template = "cbi/tvalue"
++tmpl.rows = 20
++
++function tmpl.cfgvalue(self, section)
++ return nixio.fs.readfile("/etc/samba/smb.conf.template")
++end
++
++function tmpl.write(self, section, value)
++ value = value:gsub("\r\n?", "\n")
++ nixio.fs.writefile("//etc/samba/smb.conf.template", value)
++end
++
++
++s = m:section(TypedSection, "sambashare", translate("Shared Directories"))
++s.anonymous = true
++s.addremove = true
++s.template = "cbi/tblsection"
++
++s:option(Value, "name", translate("Name"))
++pth = s:option(Value, "path", translate("Path"))
++if nixio.fs.access("/etc/config/fstab") then
++ pth.titleref = luci.dispatcher.build_url("admin", "system", "fstab")
++end
++
++s:option(Value, "users", translate("Allowed users")).rmempty = true
++
++ro = s:option(Flag, "read_only", translate("Read-only"))
++ro.rmempty = false
++ro.enabled = "yes"
++ro.disabled = "no"
++
++go = s:option(Flag, "guest_ok", translate("Allow guests"))
++go.rmempty = false
++go.enabled = "yes"
++go.disabled = "no"
++
++cm = s:option(Value, "create_mask", translate("Create mask"),
++ translate("Mask for new files"))
++cm.rmempty = true
++cm.size = 4
++
++dm = s:option(Value, "dir_mask", translate("Directory mask"),
++ translate("Mask for new directories"))
++dm.rmempty = true
++dm.size = 4
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-samba/po/ca/samba.po b/feeds/luci/applications/luci-app-samba/po/ca/samba.po
+new file mode 100644
+index 0000000..0668b1b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/ca/samba.po
+@@ -0,0 +1,95 @@
++# samba.pot
++# generated from ./applications/luci-samba/luasrc/i18n/samba.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-07-01 05:47+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Allow guests"
++msgstr "Permet convidats"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Permet que els usuaris del sistema pugin arribar als seus directoris d'inici "
++"via comparticions de xarxa"
++
++msgid "Allowed users"
++msgstr "Usuaris permesos"
++
++msgid "Create mask"
++msgstr "Crea màscara"
++
++msgid "Description"
++msgstr "Descripció"
++
++msgid "Directory mask"
++msgstr "Màscara de directori"
++
++msgid "Edit Template"
++msgstr "Edita plantilla"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "Edita la plantilla que s'usa per generar la configuració de samba."
++
++msgid "General Settings"
++msgstr "Ajusts generals"
++
++msgid "Hostname"
++msgstr "Nom de màquina"
++
++msgid "Mask for new directories"
++msgstr "Màscara per directoris nous"
++
++msgid "Mask for new files"
++msgstr "Màscara per fitxers nous"
++
++msgid "Name"
++msgstr "Nom"
++
++msgid "Network Shares"
++msgstr "Comparticions de xarxa"
++
++msgid "Path"
++msgstr "Ruta"
++
++msgid "Read-only"
++msgstr "Només lectura"
++
++msgid "Share home-directories"
++msgstr "Comparteix directoris d'inici"
++
++msgid "Shared Directories"
++msgstr "Directoris compartits"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Això és el contingut del fitxer '/etc/samba/smb.conf.template' del qual la "
++"vostra configuració de samba es generarà. Valors encerclats per símbols de "
++"barra ('|') no es deuen canviar. Reben els seus valors de la pestanya "
++"'Ajusts generals'."
++
++msgid "Workgroup"
++msgstr "Grup de treball"
++
++#~ msgid "Shared Directory"
++#~ msgstr "Directori compartit"
++
++#~ msgid "Physical Path"
++#~ msgstr "Ruta física"
++
++#~ msgid "optional"
++#~ msgstr "opcional"
+diff --git a/feeds/luci/applications/luci-app-samba/po/cs/samba.po b/feeds/luci/applications/luci-app-samba/po/cs/samba.po
+new file mode 100644
+index 0000000..fefb7ff
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/cs/samba.po
+@@ -0,0 +1,83 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-31 13:56+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Allow guests"
++msgstr "Povolení hosté"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Povoluje systémovým uživatelům přístup do jejich domácích adresářů skrze "
++"sdílení přes síť."
++
++msgid "Allowed users"
++msgstr "Povolení uživatelé"
++
++msgid "Create mask"
++msgstr "Vytvořit masku"
++
++msgid "Description"
++msgstr "Popis"
++
++msgid "Directory mask"
++msgstr "Maska adresáře"
++
++msgid "Edit Template"
++msgstr "Editovat Å¡ablonu"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++"Editovat Å¡ablonu, která je použita pro generování konfiguraÄního souboru pro "
++"sambu."
++
++msgid "General Settings"
++msgstr "Obecné nastavení"
++
++msgid "Hostname"
++msgstr "Název poÄítaÄe."
++
++msgid "Mask for new directories"
++msgstr "Maska pro nové adresáře"
++
++msgid "Mask for new files"
++msgstr "Maska pro nové soubory"
++
++msgid "Name"
++msgstr "Jméno"
++
++msgid "Network Shares"
++msgstr "Síťová sdílení"
++
++msgid "Path"
++msgstr "Cesta"
++
++msgid "Read-only"
++msgstr "Pouze pro Ätení"
++
++msgid "Share home-directories"
++msgstr "Sdílet domácí adresáře"
++
++msgid "Shared Directories"
++msgstr "Sdílené adresáře"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Toto je obsah souboru \"/etc/samba/smb.conf.template\", ze kterého je "
++"konfigurace samby generována. Hodnoty uzavřené rourou (\"|\"), by se neměly "
++"měnit. Tyto hodnoty jsou brány ze záložky \"Obecná nastavení\"."
++
++msgid "Workgroup"
++msgstr "Skupina"
+diff --git a/feeds/luci/applications/luci-app-samba/po/de/samba.po b/feeds/luci/applications/luci-app-samba/po/de/samba.po
+new file mode 100644
+index 0000000..a5ceb05
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/de/samba.po
+@@ -0,0 +1,87 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2011-10-18 13:13+0200\n"
++"Last-Translator: Manuel <freifunk@somakoma.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Allow guests"
++msgstr "Gastzugang"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Systembenutzer dürfen ihre Heimatverzeichnis über Netzwerkfreigaben "
++"erreichen."
++
++msgid "Allowed users"
++msgstr "Legitimierte Benutzer"
++
++msgid "Create mask"
++msgstr "Berechtigungsmaske für neue Dateien"
++
++msgid "Description"
++msgstr "Beschreibung"
++
++msgid "Directory mask"
++msgstr "Verzeichnismaske"
++
++msgid "Edit Template"
++msgstr "Template bearbeiten"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++"Hier kann das Template bearbeitet werden, das zur Erstellung der Samba-"
++"Konfigurationsdateien verwendet wird."
++
++msgid "General Settings"
++msgstr "Allgemeine Einstellungen"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "Mask for new directories"
++msgstr "Maske für neue Verzeichnisse"
++
++msgid "Mask for new files"
++msgstr "Maske für neue Dateien"
++
++msgid "Name"
++msgstr "Name"
++
++msgid "Network Shares"
++msgstr "Netzwerkfreigaben"
++
++msgid "Path"
++msgstr "Pfad"
++
++msgid "Read-only"
++msgstr "Nur Lesen"
++
++msgid "Share home-directories"
++msgstr "Heimatverzeichnisse freigeben"
++
++msgid "Shared Directories"
++msgstr "Freigegebene Verzeichnisse"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Dieses Fenster zeigt den Inhalt der Datei '/etc/samba/smb.conf.template', "
++"die als Template zum Erstellen der Samba-Konfiguration verwendet wird. Werte "
++"die von Pipe Symbolen (|) eingeschlossen sind sollten nicht verändert "
++"werden, da diese beim Erstellen der Konfiguration mit den Werten aus dem Tab "
++"'Allgemeine Einstellungen' ersetzt werden."
++
++msgid "Workgroup"
++msgstr "Arbeitsgruppe"
+diff --git a/feeds/luci/applications/luci-app-samba/po/el/samba.po b/feeds/luci/applications/luci-app-samba/po/el/samba.po
+new file mode 100644
+index 0000000..7cc722d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/el/samba.po
+@@ -0,0 +1,78 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-28 02:08+0200\n"
++"PO-Revision-Date: 2012-03-18 15:31+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Allow guests"
++msgstr ""
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++
++msgid "Allowed users"
++msgstr ""
++
++msgid "Create mask"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Directory mask"
++msgstr ""
++
++msgid "Edit Template"
++msgstr ""
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Mask for new directories"
++msgstr ""
++
++msgid "Mask for new files"
++msgstr ""
++
++msgid "Name"
++msgstr "Όνομα"
++
++msgid "Network Shares"
++msgstr ""
++
++msgid "Path"
++msgstr ""
++
++msgid "Read-only"
++msgstr ""
++
++msgid "Share home-directories"
++msgstr ""
++
++msgid "Shared Directories"
++msgstr ""
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++
++msgid "Workgroup"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-samba/po/en/samba.po b/feeds/luci/applications/luci-app-samba/po/en/samba.po
+new file mode 100644
+index 0000000..f524c14
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/en/samba.po
+@@ -0,0 +1,82 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-03-22 15:23+0100\n"
++"PO-Revision-Date: 2011-10-25 21:26+0200\n"
++"Last-Translator: awm1 <awm1klimes8vladimir@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: en\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Allow guests"
++msgstr "Allow guests"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr "Allow system users to reach their home directories via network shares"
++
++msgid "Allowed users"
++msgstr "Allowed users"
++
++msgid "Create mask"
++msgstr "Create mask"
++
++msgid "Description"
++msgstr "Description"
++
++msgid "Directory mask"
++msgstr "Directory mask"
++
++msgid "Edit Template"
++msgstr "Edit template"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "Edit the template that is used for generating the Samba configuration."
++
++msgid "General Settings"
++msgstr "General settings"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "Mask for new directories"
++msgstr "Mask for new directories"
++
++msgid "Mask for new files"
++msgstr "Mask for new files"
++
++msgid "Name"
++msgstr "Name"
++
++msgid "Network Shares"
++msgstr "Network Shares"
++
++msgid "Path"
++msgstr "Path"
++
++msgid "Read-only"
++msgstr "Read-only"
++
++msgid "Share home-directories"
++msgstr "Share home-directories"
++
++msgid "Shared Directories"
++msgstr "Shared Directories"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your Samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"settings' tab."
++
++msgid "Workgroup"
++msgstr "Workgroup"
+diff --git a/feeds/luci/applications/luci-app-samba/po/es/samba.po b/feeds/luci/applications/luci-app-samba/po/es/samba.po
+new file mode 100644
+index 0000000..950a817
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/es/samba.po
+@@ -0,0 +1,92 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-08-22 17:45+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Allow guests"
++msgstr "Permitir invitados"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Permitir a los usuarios acceder a sus directorios de inicio vía "
++"comparticiones de red"
++
++msgid "Allowed users"
++msgstr "Usuarios permitidos"
++
++msgid "Create mask"
++msgstr "Crear máscara"
++
++msgid "Description"
++msgstr "Descripción"
++
++msgid "Directory mask"
++msgstr "Máscara de directorio"
++
++msgid "Edit Template"
++msgstr "Editar plantilla"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "Editar la plantilla usada para generar la configuración de samba."
++
++msgid "General Settings"
++msgstr "Configuración general"
++
++msgid "Hostname"
++msgstr "Nombre de máquina"
++
++msgid "Mask for new directories"
++msgstr "Máscara para directorios nuevos"
++
++msgid "Mask for new files"
++msgstr "Máscara para archivos nuevos"
++
++msgid "Name"
++msgstr "Nombre"
++
++msgid "Network Shares"
++msgstr "Comparticiones de red"
++
++msgid "Path"
++msgstr "Dirección"
++
++msgid "Read-only"
++msgstr "Solo lectura"
++
++msgid "Share home-directories"
++msgstr "Compartir directorios personales"
++
++msgid "Shared Directories"
++msgstr "Directorios compartidos"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Contenido del fichero '/etc/samba/smb.conf.template' desde el que se "
++"generará la configuración de samba. Los valores entre tuberías ('|') no "
++"deben cambiarse. Su valor se toma desde la pestaña 'Configuración General'."
++
++msgid "Workgroup"
++msgstr "Grupo de trabajo"
++
++#~ msgid "Shared Directory"
++#~ msgstr "Directorio compatido"
++
++#~ msgid "Physical Path"
++#~ msgstr "Ruta Física"
++
++#~ msgid "optional"
++#~ msgstr "opcional"
+diff --git a/feeds/luci/applications/luci-app-samba/po/fr/samba.po b/feeds/luci/applications/luci-app-samba/po/fr/samba.po
+new file mode 100644
+index 0000000..8877900
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/fr/samba.po
+@@ -0,0 +1,84 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2011-11-23 22:36+0200\n"
++"Last-Translator: fredb <fblistes+luci@free.fr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Allow guests"
++msgstr "Invités autorisés"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Autoriser les utilisateurs système à atteindre leurs dossiers personnels via "
++"les partages réseau"
++
++msgid "Allowed users"
++msgstr "Utilisateurs autorisés"
++
++msgid "Create mask"
++msgstr "Maque de création"
++
++msgid "Description"
++msgstr "Description"
++
++msgid "Directory mask"
++msgstr "Masque des dossiers"
++
++msgid "Edit Template"
++msgstr "Éditer le modèle"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "Éditer le modèle utilisé pour générer la configuration Samba."
++
++msgid "General Settings"
++msgstr "Paramètres généraux"
++
++msgid "Hostname"
++msgstr "Nom d'hôte"
++
++msgid "Mask for new directories"
++msgstr "Masque pour les nouveaux dossiers"
++
++msgid "Mask for new files"
++msgstr "Masque pour les nouveaux fichiers"
++
++msgid "Name"
++msgstr "Nom"
++
++msgid "Network Shares"
++msgstr "Partages réseau"
++
++msgid "Path"
++msgstr "Chemin"
++
++msgid "Read-only"
++msgstr "Lecture seule"
++
++msgid "Share home-directories"
++msgstr "Partager les dossiers personnels"
++
++msgid "Shared Directories"
++msgstr "Dossiers partagés"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Voici le contenu du fichier '/etc/samba/smb.conf.template' d'où sera généré "
++"votre configuration Samba. Les valeurs entre les symboles barre-verticale "
++" (« | ») ne doivent pas être modifiées, elles proviennent de l'onglet "
++"« Paramètres généraux »."
++
++msgid "Workgroup"
++msgstr "Groupe de travail"
+diff --git a/feeds/luci/applications/luci-app-samba/po/he/samba.po b/feeds/luci/applications/luci-app-samba/po/he/samba.po
+new file mode 100644
+index 0000000..dd21a4a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/he/samba.po
+@@ -0,0 +1,73 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Allow guests"
++msgstr ""
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++
++msgid "Allowed users"
++msgstr ""
++
++msgid "Create mask"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Directory mask"
++msgstr ""
++
++msgid "Edit Template"
++msgstr ""
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Mask for new directories"
++msgstr ""
++
++msgid "Mask for new files"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Shares"
++msgstr ""
++
++msgid "Path"
++msgstr ""
++
++msgid "Read-only"
++msgstr ""
++
++msgid "Share home-directories"
++msgstr ""
++
++msgid "Shared Directories"
++msgstr ""
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++
++msgid "Workgroup"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-samba/po/hu/samba.po b/feeds/luci/applications/luci-app-samba/po/hu/samba.po
+new file mode 100644
+index 0000000..64d1e22
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/hu/samba.po
+@@ -0,0 +1,84 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-06 10:56+0200\n"
++"Last-Translator: juhosg <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Allow guests"
++msgstr "Vendég hozzáférés"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"A rendszerfelhasználók hálózati megosztáson keresztül hozzáférhetnek a home "
++"könyvtárukhoz."
++
++msgid "Allowed users"
++msgstr "Engedélyezett felhasználók"
++
++msgid "Create mask"
++msgstr "Létrehozási maszk"
++
++msgid "Description"
++msgstr "Leírás"
++
++msgid "Directory mask"
++msgstr "Könyvtár maszk"
++
++msgid "Edit Template"
++msgstr "Sablon szerkesztése"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++"Itt szerkesztheti a sablont, ami a végleges samba konfiguráció "
++"elkészítéséhez kerül felhasználásra."
++
++msgid "General Settings"
++msgstr "Ãltalános beállítások"
++
++msgid "Hostname"
++msgstr "Gépnév"
++
++msgid "Mask for new directories"
++msgstr "Új könyvtárak maszkja"
++
++msgid "Mask for new files"
++msgstr "Új fájlok maszkja"
++
++msgid "Name"
++msgstr "Név"
++
++msgid "Network Shares"
++msgstr "Hálózati megosztások"
++
++msgid "Path"
++msgstr "Elérési út"
++
++msgid "Read-only"
++msgstr "Csak olvasható"
++
++msgid "Share home-directories"
++msgstr "Home könyvtárak megosztása"
++
++msgid "Shared Directories"
++msgstr "Megosztott könyvtárak"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Itt látható a /etc/samba/smb.conf.template file tartalma, ami a samba "
++"konfiguráció előállításához kerül felhasználásra. A pipe szimbólumok ('|') "
++"közé zárt értékek módosítása nem szükséges, az értéküket az általános "
++"beállítások fülről kapják."
++
++msgid "Workgroup"
++msgstr "Munkacsoport"
+diff --git a/feeds/luci/applications/luci-app-samba/po/it/samba.po b/feeds/luci/applications/luci-app-samba/po/it/samba.po
+new file mode 100644
+index 0000000..4645782
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/it/samba.po
+@@ -0,0 +1,85 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-04-19 22:28+0200\n"
++"Last-Translator: claudyus <claudyus84@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Allow guests"
++msgstr "Permetti ospiti"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Autorizza gli utenti del sistema a raggiungere la loro cartella home "
++"attraverso le condivisioni di rete"
++
++msgid "Allowed users"
++msgstr "Utenti ammessi"
++
++msgid "Create mask"
++msgstr "Mask di creazione dei file"
++
++msgid "Description"
++msgstr "Descrizione"
++
++msgid "Directory mask"
++msgstr "Maschera della cartella"
++
++msgid "Edit Template"
++msgstr "Modifica Template"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++"Modifica il template utilizzato per generare la configurazione di samba."
++
++msgid "General Settings"
++msgstr "Opzioni Generali"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "Mask for new directories"
++msgstr "Maschera per le nuove cartelle"
++
++msgid "Mask for new files"
++msgstr "Maschera per i nuovi files"
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Network Shares"
++msgstr "Condivisioni di rete"
++
++msgid "Path"
++msgstr "Percorso"
++
++msgid "Read-only"
++msgstr "Solo lettura"
++
++msgid "Share home-directories"
++msgstr "Condividi cartelle home"
++
++msgid "Shared Directories"
++msgstr "Cartelle Condivise"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Questo è il contenuto del file '/etc/samba/smb.conf.template' dal quale sarà "
++"generata la tua configurazione di samba. I valori racchiusi tra il simbolo "
++"('|') non dovrebbero essere toccati. Essi vengono generati dalla schermata "
++"'Opzioni Generali'."
++
++msgid "Workgroup"
++msgstr "Gruppo di lavoro"
+diff --git a/feeds/luci/applications/luci-app-samba/po/ja/samba.po b/feeds/luci/applications/luci-app-samba/po/ja/samba.po
+new file mode 100644
+index 0000000..c527507
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/ja/samba.po
+@@ -0,0 +1,81 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2011-11-03 18:09+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.4\n"
++
++msgid "Allow guests"
++msgstr "ゲストアクセスを許å¯"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr "sambaを介ã—ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™"
++
++msgid "Allowed users"
++msgstr "許å¯ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼"
++
++msgid "Create mask"
++msgstr "マスクã®ä½œæˆ"
++
++msgid "Description"
++msgstr "説明"
++
++msgid "Directory mask"
++msgstr "ディレクトリã®ãƒžã‚¹ã‚¯"
++
++msgid "Edit Template"
++msgstr "テンプレートã®ç·¨é›†"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "samba設定を生æˆã™ã‚‹ãƒ†ãƒ³ãƒ—レートを編集ã—ã¾ã™ã€‚"
++
++msgid "General Settings"
++msgstr "一般設定"
++
++msgid "Hostname"
++msgstr "ホストå"
++
++msgid "Mask for new directories"
++msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒžã‚¹ã‚¯"
++
++msgid "Mask for new files"
++msgstr "æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒžã‚¹ã‚¯"
++
++msgid "Name"
++msgstr "åå‰"
++
++msgid "Network Shares"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å…±æœ‰"
++
++msgid "Path"
++msgstr "パス"
++
++msgid "Read-only"
++msgstr "読ã¿è¾¼ã¿ã®ã¿"
++
++msgid "Share home-directories"
++msgstr "ホームディレクトリã®å…±æœ‰"
++
++msgid "Shared Directories"
++msgstr "共有ディレクトリ"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"ã“ã‚Œã¯ã€samba設定を生æˆã™ã‚‹ãŸã‚ã®'/etc/samba/smb.conf.template' ファイルã®å†…"
++"容ã§ã™ã€‚パイプ('|')ã§é–‰ã˜ã‚‰ã‚ŒãŸå€¤ã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„。ã“れらã®å€¤ã¯'一般設"
++"定'タブ内ã®å€¤ã«ã‚ˆã£ã¦ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚"
++
++msgid "Workgroup"
++msgstr "ワークグループ"
+diff --git a/feeds/luci/applications/luci-app-samba/po/ms/samba.po b/feeds/luci/applications/luci-app-samba/po/ms/samba.po
+new file mode 100644
+index 0000000..e29133e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/ms/samba.po
+@@ -0,0 +1,72 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Allow guests"
++msgstr ""
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++
++msgid "Allowed users"
++msgstr ""
++
++msgid "Create mask"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Directory mask"
++msgstr ""
++
++msgid "Edit Template"
++msgstr ""
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Mask for new directories"
++msgstr ""
++
++msgid "Mask for new files"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Shares"
++msgstr ""
++
++msgid "Path"
++msgstr ""
++
++msgid "Read-only"
++msgstr ""
++
++msgid "Share home-directories"
++msgstr ""
++
++msgid "Shared Directories"
++msgstr ""
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++
++msgid "Workgroup"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-samba/po/no/samba.po b/feeds/luci/applications/luci-app-samba/po/no/samba.po
+new file mode 100644
+index 0000000..1c5c807
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/no/samba.po
+@@ -0,0 +1,72 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Allow guests"
++msgstr "Tillat gjester"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr "Tillat systembrukere å nå sine hjemmekataloger via nettverks mapper."
++
++msgid "Allowed users"
++msgstr "Tillatte brukere"
++
++msgid "Create mask"
++msgstr "Opprett Maske"
++
++msgid "Description"
++msgstr "Beskrivelse"
++
++msgid "Directory mask"
++msgstr "Katalog maske"
++
++msgid "Edit Template"
++msgstr "Rediger Mal"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "Rediger malen som brukes til å generere samba konfigurasjonen."
++
++msgid "General Settings"
++msgstr "Generelle Innstillinger"
++
++msgid "Hostname"
++msgstr "Vertsnavn"
++
++msgid "Mask for new directories"
++msgstr "Maske for nye kataloger"
++
++msgid "Mask for new files"
++msgstr "Maske for nye filer"
++
++msgid "Name"
++msgstr "Navn"
++
++msgid "Network Shares"
++msgstr "Nettverks Mapper"
++
++msgid "Path"
++msgstr "Fysisk bane"
++
++msgid "Read-only"
++msgstr "Skrivebeskyttet"
++
++msgid "Share home-directories"
++msgstr "Del Hjemmekataloger"
++
++msgid "Shared Directories"
++msgstr "Delte Kataloger"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Dette er innholdet av filen '/etc/samba/smb.conf.template' som din samba "
++"konfigurasjon vil bli generert fra. Verdier omsluttet av ('|') bør ikke "
++"endres. De får sine verdier fra 'Generelle Innstillinger' fanen."
++
++msgid "Workgroup"
++msgstr "Arbeidsgruppe"
+diff --git a/feeds/luci/applications/luci-app-samba/po/pl/samba.po b/feeds/luci/applications/luci-app-samba/po/pl/samba.po
+new file mode 100644
+index 0000000..7482622
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/pl/samba.po
+@@ -0,0 +1,83 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-08-26 09:51+0200\n"
++"Last-Translator: Staszek <fistaszek@tlen.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Allow guests"
++msgstr "Zezwalaj Gościom"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Użytkownicy systemu mogą dostać się do swoich katalogów domowych za "
++"pośrednictwem udziałów sieciowych."
++
++msgid "Allowed users"
++msgstr "Użytkownicy z prawem dostępu"
++
++msgid "Create mask"
++msgstr "Utwórz maskę"
++
++msgid "Description"
++msgstr "Opis"
++
++msgid "Directory mask"
++msgstr "Maska katalogu"
++
++msgid "Edit Template"
++msgstr "Edytuj szablon"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "Edytuj szablon, który jest używany do generowania konfiguracji samby."
++
++msgid "General Settings"
++msgstr "Ustawienia ogólne"
++
++msgid "Hostname"
++msgstr "Nazwa hosta"
++
++msgid "Mask for new directories"
++msgstr "Maska dla nowych katalogów"
++
++msgid "Mask for new files"
++msgstr "Maska dla nowych plików"
++
++msgid "Name"
++msgstr "Nazwa"
++
++msgid "Network Shares"
++msgstr "Udziały sieciowe"
++
++msgid "Path"
++msgstr "Ścieżka"
++
++msgid "Read-only"
++msgstr "Tylko do odczytu"
++
++msgid "Share home-directories"
++msgstr "Udostępniaj katalogi domowe"
++
++msgid "Shared Directories"
++msgstr "Udostępniane katalogi"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"To jest zawartość pliku '/etc/samba/smb.conf.template\", na podstawie "
++"którego zostanie wygenerowana konfiguracja samby. Wartości otoczone symbolem "
++"kreski pionowej ('|') nie powinny być zmieniane. Wartości ich zostaną "
++"pobrane z zakładki \"Ustawienia ogólne\"."
++
++msgid "Workgroup"
++msgstr "Grupa robocza"
+diff --git a/feeds/luci/applications/luci-app-samba/po/pt-br/samba.po b/feeds/luci/applications/luci-app-samba/po/pt-br/samba.po
+new file mode 100644
+index 0000000..a753152
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/pt-br/samba.po
+@@ -0,0 +1,93 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2013-04-06 22:54+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Allow guests"
++msgstr "Permitir convidados"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Usuários do sistema poderão acessar seu diretório home através dos "
++"compartilhamentos de rede"
++
++msgid "Allowed users"
++msgstr "Usuários permitidos"
++
++msgid "Create mask"
++msgstr "Máscara de criação"
++
++msgid "Description"
++msgstr "Descrição"
++
++msgid "Directory mask"
++msgstr "Máscara do diretório"
++
++msgid "Edit Template"
++msgstr "Editar modelo"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "Edita o modelo que é usado para gerar a configuração do samba."
++
++msgid "General Settings"
++msgstr "Configurações Gerais"
++
++msgid "Hostname"
++msgstr "Nome do equipamento"
++
++msgid "Mask for new directories"
++msgstr "Máscara para novos diretórios"
++
++msgid "Mask for new files"
++msgstr "Máscara para novos arquivos"
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Network Shares"
++msgstr "Compartilhamentos de Rede"
++
++msgid "Path"
++msgstr "Caminho"
++
++msgid "Read-only"
++msgstr "Somente leitura"
++
++msgid "Share home-directories"
++msgstr "Compartilhar diretórios home"
++
++msgid "Shared Directories"
++msgstr "Diretórios Compartilhados"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Este é o conteúdo do arquivo '/etc/samba/smb.conf.template' a partir do qual "
++"sua configuração do samba será gerada. Valores entre simbolos de pipe ('|') "
++"não devem ser alterados. Estes valores serão obtidos a partir da aba "
++"'Configurações Gerais'."
++
++msgid "Workgroup"
++msgstr "Grupo de trabalho"
++
++#~ msgid "Shared Directory"
++#~ msgstr "Diretório Compartilhado"
++
++#~ msgid "Physical Path"
++#~ msgstr "Caminho Físico"
++
++#~ msgid "optional"
++#~ msgstr "opcional"
+diff --git a/feeds/luci/applications/luci-app-samba/po/pt/samba.po b/feeds/luci/applications/luci-app-samba/po/pt/samba.po
+new file mode 100644
+index 0000000..4c5a2cd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/pt/samba.po
+@@ -0,0 +1,93 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-05-01 01:13+0200\n"
++"Last-Translator: pedromrgoncalves <pedromrgoncalves@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Allow guests"
++msgstr "Permitir Convidados"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Utilizadores do sistema poderão aceder ao seu directório home através das "
++"partilhas de rede."
++
++msgid "Allowed users"
++msgstr "Utilizadores Permitidos"
++
++msgid "Create mask"
++msgstr "Criar Máscara"
++
++msgid "Description"
++msgstr "Descrição"
++
++msgid "Directory mask"
++msgstr "Máscara do Directório"
++
++msgid "Edit Template"
++msgstr "Editar Template"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "Editar a template que é utilizada para gerar a configuração samba"
++
++msgid "General Settings"
++msgstr "Definições Gerais"
++
++msgid "Hostname"
++msgstr "Nome do host"
++
++msgid "Mask for new directories"
++msgstr "Máscara para novos directórios"
++
++msgid "Mask for new files"
++msgstr "Máscara para novos ficheiros"
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Network Shares"
++msgstr "Partilhas da Rede"
++
++msgid "Path"
++msgstr "Caminho"
++
++msgid "Read-only"
++msgstr "Apenas Leitura"
++
++msgid "Share home-directories"
++msgstr "Partilha de directórios home"
++
++msgid "Shared Directories"
++msgstr "Directórios Partilhados"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Isto é o conteúdo do ficheiro 'etc/samba/smb.conf.template' a partir do qual "
++"será gerado o ficheiro de configuração do samba. Os valores entre o símbolo "
++"| não devem ser alterados. Eles recebem os valores do separador 'Definições "
++"Gerais'."
++
++msgid "Workgroup"
++msgstr "Grupo de trabalho"
++
++#~ msgid "Shared Directory"
++#~ msgstr "Diretório Compartilhado"
++
++#~ msgid "Physical Path"
++#~ msgstr "Caminho Físico"
++
++#~ msgid "optional"
++#~ msgstr "opcional"
+diff --git a/feeds/luci/applications/luci-app-samba/po/ro/samba.po b/feeds/luci/applications/luci-app-samba/po/ro/samba.po
+new file mode 100644
+index 0000000..4bc3415
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/ro/samba.po
+@@ -0,0 +1,82 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-07 17:16+0200\n"
++"Last-Translator: Daniel <daniel.petre@pitesti.rcs-rds.ro>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Allow guests"
++msgstr "Permite oaspeti"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Permite utilizatorii de sistem sa acceseze directoarele lor peste "
++"partajarile de retea"
++
++msgid "Allowed users"
++msgstr "Utilizatori acceptati"
++
++msgid "Create mask"
++msgstr "Creaza masca"
++
++msgid "Description"
++msgstr "Descriere"
++
++msgid "Directory mask"
++msgstr "Masca director"
++
++msgid "Edit Template"
++msgstr "Editeaza sablon"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "Editeaza sablonul care e folosit pentru generarea configuratiei samba."
++
++msgid "General Settings"
++msgstr "Setari generale"
++
++msgid "Hostname"
++msgstr "Numele de host"
++
++msgid "Mask for new directories"
++msgstr "Masca pentru directoarele noi"
++
++msgid "Mask for new files"
++msgstr "Masca pentru fisierele noi"
++
++msgid "Name"
++msgstr "Nume"
++
++msgid "Network Shares"
++msgstr "Partajari pe retea"
++
++msgid "Path"
++msgstr "Cale"
++
++msgid "Read-only"
++msgstr "Doar citire"
++
++msgid "Share home-directories"
++msgstr "Partajeaza directoarele proprii"
++
++msgid "Shared Directories"
++msgstr "Directoare partajate"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Acesta este continutul fisierului '/etc/samba/smb.conf.template' din care se "
++"genereaza configuratia samba. Valorile dintre liniuta verticala ('|') n-ar "
++"trebui schimbate, ele iau valorile direct din tab-ul de \"Setari generale\"."
++
++msgid "Workgroup"
++msgstr "Workgroup"
+diff --git a/feeds/luci/applications/luci-app-samba/po/ru/samba.po b/feeds/luci/applications/luci-app-samba/po/ru/samba.po
+new file mode 100644
+index 0000000..82906e3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/ru/samba.po
+@@ -0,0 +1,85 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: samba\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-08-15 13:48+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Allow guests"
++msgstr "Разрешить гоÑтевой вход"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Разрешить пользователÑм получать доÑтуп к их домашним директориÑм через Ñеть"
++
++msgid "Allowed users"
++msgstr "Разрешённые пользователи"
++
++msgid "Create mask"
++msgstr "Создать маÑку"
++
++msgid "Description"
++msgstr "ОпиÑание"
++
++msgid "Directory mask"
++msgstr "МаÑка директории"
++
++msgid "Edit Template"
++msgstr "Редактировать шаблон"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "Редактировать шаблон, иÑпользуемый Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ конфигурации samba."
++
++msgid "General Settings"
++msgstr "Общие наÑтройки"
++
++msgid "Hostname"
++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта"
++
++msgid "Mask for new directories"
++msgstr "МаÑка Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… директорий"
++
++msgid "Mask for new files"
++msgstr "МаÑка Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… файлов"
++
++msgid "Name"
++msgstr "ИмÑ"
++
++msgid "Network Shares"
++msgstr "Сетевые реÑурÑÑ‹"
++
++msgid "Path"
++msgstr "Путь"
++
++msgid "Read-only"
++msgstr "Только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ"
++
++msgid "Share home-directories"
++msgstr "СовмеÑтно иÑпользовать домашние директории"
++
++msgid "Shared Directories"
++msgstr "СовмеÑтно иÑпользуемые директории"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Это Ñодержимое файла '/etc/samba/smb.conf.template', из которого "
++"генерируетÑÑ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ samba. ЗначениÑ, заключённые в Ñимволы \"|\", не "
++"должны быть изменены. Они будут автоматичеÑки заменены на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· "
++"вкладки 'Общие наÑтройки'."
++
++msgid "Workgroup"
++msgstr "Ð Ð°Ð±Ð¾Ñ‡Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°"
+diff --git a/feeds/luci/applications/luci-app-samba/po/sk/samba.po b/feeds/luci/applications/luci-app-samba/po/sk/samba.po
+new file mode 100644
+index 0000000..66ec9e0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/sk/samba.po
+@@ -0,0 +1,73 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Allow guests"
++msgstr ""
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++
++msgid "Allowed users"
++msgstr ""
++
++msgid "Create mask"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Directory mask"
++msgstr ""
++
++msgid "Edit Template"
++msgstr ""
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Mask for new directories"
++msgstr ""
++
++msgid "Mask for new files"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Shares"
++msgstr ""
++
++msgid "Path"
++msgstr ""
++
++msgid "Read-only"
++msgstr ""
++
++msgid "Share home-directories"
++msgstr ""
++
++msgid "Shared Directories"
++msgstr ""
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++
++msgid "Workgroup"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-samba/po/sv/samba.po b/feeds/luci/applications/luci-app-samba/po/sv/samba.po
+new file mode 100644
+index 0000000..b19b6e3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/sv/samba.po
+@@ -0,0 +1,74 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Allow guests"
++msgstr ""
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++
++msgid "Allowed users"
++msgstr ""
++
++msgid "Create mask"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Directory mask"
++msgstr ""
++
++msgid "Edit Template"
++msgstr ""
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Mask for new directories"
++msgstr ""
++
++msgid "Mask for new files"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Shares"
++msgstr ""
++
++msgid "Path"
++msgstr ""
++
++msgid "Read-only"
++msgstr ""
++
++msgid "Share home-directories"
++msgstr ""
++
++msgid "Shared Directories"
++msgstr ""
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++
++msgid "Workgroup"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-samba/po/templates/samba.pot b/feeds/luci/applications/luci-app-samba/po/templates/samba.pot
+new file mode 100644
+index 0000000..d91400b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/templates/samba.pot
+@@ -0,0 +1,66 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Allow guests"
++msgstr ""
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++
++msgid "Allowed users"
++msgstr ""
++
++msgid "Create mask"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Directory mask"
++msgstr ""
++
++msgid "Edit Template"
++msgstr ""
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Mask for new directories"
++msgstr ""
++
++msgid "Mask for new files"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Shares"
++msgstr ""
++
++msgid "Path"
++msgstr ""
++
++msgid "Read-only"
++msgstr ""
++
++msgid "Share home-directories"
++msgstr ""
++
++msgid "Shared Directories"
++msgstr ""
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++
++msgid "Workgroup"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-samba/po/tr/samba.po b/feeds/luci/applications/luci-app-samba/po/tr/samba.po
+new file mode 100644
+index 0000000..fda2f6e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/tr/samba.po
+@@ -0,0 +1,73 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Allow guests"
++msgstr ""
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++
++msgid "Allowed users"
++msgstr ""
++
++msgid "Create mask"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Directory mask"
++msgstr ""
++
++msgid "Edit Template"
++msgstr ""
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Mask for new directories"
++msgstr ""
++
++msgid "Mask for new files"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Shares"
++msgstr ""
++
++msgid "Path"
++msgstr ""
++
++msgid "Read-only"
++msgstr ""
++
++msgid "Share home-directories"
++msgstr ""
++
++msgid "Shared Directories"
++msgstr ""
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++
++msgid "Workgroup"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-samba/po/uk/samba.po b/feeds/luci/applications/luci-app-samba/po/uk/samba.po
+new file mode 100644
+index 0000000..6f2a920
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/uk/samba.po
+@@ -0,0 +1,84 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-18 20:35+0200\n"
++"Last-Translator: YuriPet <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++
++msgid "Allow guests"
++msgstr "Дозволити гоÑтьовий вхід"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Дозволити кориÑтувачам ÑиÑтеми доÑÑгати Ñвоїх домашніх каталогів через "
++"загальні мережеві реÑурÑи"
++
++msgid "Allowed users"
++msgstr "Дозволені кориÑтувачі"
++
++msgid "Create mask"
++msgstr "Створити маÑку"
++
++msgid "Description"
++msgstr "ОпиÑ"
++
++msgid "Directory mask"
++msgstr "МаÑка каталогу"
++
++msgid "Edit Template"
++msgstr "Редагувати шаблон"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++"Редагувати шаблон, Ñкий викориÑтовуєтьÑÑ Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— samba."
++
++msgid "General Settings"
++msgstr "Загальні наÑтройки"
++
++msgid "Hostname"
++msgstr "Ðазва (ім'Ñ) вузла"
++
++msgid "Mask for new directories"
++msgstr "МаÑка Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… каталогів"
++
++msgid "Mask for new files"
++msgstr "МаÑка Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… файлів"
++
++msgid "Name"
++msgstr "Ім'Ñ"
++
++msgid "Network Shares"
++msgstr "Загальні мережеві реÑурÑи"
++
++msgid "Path"
++msgstr "ШлÑÑ…"
++
++msgid "Read-only"
++msgstr "Тільки читаннÑ"
++
++msgid "Share home-directories"
++msgstr "Спільно викориÑтовувати домашні каталоги"
++
++msgid "Shared Directories"
++msgstr "Загальні каталоги"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"Це вміÑÑ‚ файлу '/etc/samba/smb.conf.template', з Ñкого буде генеруватиÑÑ "
++"ваша ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ samba. ЗначеннÑ, укладені в Ñимволи \"вертикальна риÑка"
++"\" (\"|\") не повинні змінюватиÑÑ. Вони отримують Ñвої Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· вкладки "
++"\"Загальні налаштуваннÑ\"."
++
++msgid "Workgroup"
++msgstr "Робоча група"
+diff --git a/feeds/luci/applications/luci-app-samba/po/vi/samba.po b/feeds/luci/applications/luci-app-samba/po/vi/samba.po
+new file mode 100644
+index 0000000..4e5638d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/vi/samba.po
+@@ -0,0 +1,96 @@
++# samba.pot
++# generated from ./applications/luci-samba/luasrc/i18n/samba.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:59+0200\n"
++"PO-Revision-Date: 2009-08-13 03:54+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++#, fuzzy
++msgid "Allow guests"
++msgstr "Cho phép khách"
++
++#, fuzzy
++msgid "Allow system users to reach their home directories via network shares"
++msgstr ""
++"Những ngÆ°á»i sá»­ dụng hệ thống có thể tiếp cận những thÆ° mục tại nhà thông qua "
++"mạng lưới chia sẻ trực tuyến."
++
++#, fuzzy
++msgid "Allowed users"
++msgstr "NgÆ°á»i sá»­ dụng được cho phép"
++
++#, fuzzy
++msgid "Create mask"
++msgstr "Tạo Mask"
++
++msgid "Description"
++msgstr "Mô tả"
++
++#, fuzzy
++msgid "Directory mask"
++msgstr "Thư mục Mask"
++
++msgid "Edit Template"
++msgstr ""
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Hostname"
++msgstr "tên máy chủ"
++
++msgid "Mask for new directories"
++msgstr "Mask cho thư mục mới"
++
++msgid "Mask for new files"
++msgstr "Mask cho tập tin mới"
++
++msgid "Name"
++msgstr ""
++
++msgid "Network Shares"
++msgstr "Mạng chia sẻ"
++
++msgid "Path"
++msgstr ""
++
++#, fuzzy
++msgid "Read-only"
++msgstr "Chỉ Ä‘á»c "
++
++msgid "Share home-directories"
++msgstr "Chia sẻ danh bạ chính"
++
++msgid "Shared Directories"
++msgstr "Thư mục chia sẻ"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++
++msgid "Workgroup"
++msgstr "Nhóm làm việc "
++
++#~ msgid "Shared Directory"
++#~ msgstr "Äã chia sẻ thÆ° mục"
++
++#~ msgid "Physical Path"
++#~ msgstr "ÄÆ°á»ng dẫn vật lý"
++
++#~ msgid "optional"
++#~ msgstr "Tùy thích"
+diff --git a/feeds/luci/applications/luci-app-samba/po/zh-cn/samba.po b/feeds/luci/applications/luci-app-samba/po/zh-cn/samba.po
+new file mode 100644
+index 0000000..4ff671b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/zh-cn/samba.po
+@@ -0,0 +1,83 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2012-06-21 18:31+0200\n"
++"Last-Translator: phantasm131 <phantasm131@gmail.com>\n"
++"Language-Team: QQ Group 75543259 <axishero@foxmail.com>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Allow guests"
++msgstr "å…许匿å用户"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr "å…许系统用户通过网络共享访问他们的主目录"
++
++msgid "Allowed users"
++msgstr "å…许用户"
++
++msgid "Create mask"
++msgstr "创建æƒé™"
++
++msgid "Description"
++msgstr "æè¿°"
++
++msgid "Directory mask"
++msgstr "目录æƒé™"
++
++msgid "Edit Template"
++msgstr "编辑模æ¿"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "编辑用æ¥ç”Ÿæˆsamba设置的模æ¿"
++
++msgid "General Settings"
++msgstr "基本设置"
++
++msgid "Hostname"
++msgstr "主机å"
++
++msgid "Mask for new directories"
++msgstr "新目录æƒé™"
++
++msgid "Mask for new files"
++msgstr "新文件æƒé™"
++
++msgid "Name"
++msgstr "共享å"
++
++msgid "Network Shares"
++msgstr "网络共享"
++
++msgid "Path"
++msgstr "目录"
++
++msgid "Read-only"
++msgstr "åªè¯»"
++
++msgid "Share home-directories"
++msgstr "共享主目录"
++
++msgid "Shared Directories"
++msgstr "共享目录"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr ""
++"创建samba设置的 \"/etc/samba/smb.conf.template\" 文件的内容。被通é“符|包围的"
++"值å¯åœ¨åŸºæœ¬è®¾ç½®ä¸­è¿›è¡Œé…ç½®"
++
++msgid "Workgroup"
++msgstr "工作组"
++
++#~ msgid "Physical Path"
++#~ msgstr "物ç†è·¯å¾„"
+diff --git a/feeds/luci/applications/luci-app-samba/po/zh-tw/samba.po b/feeds/luci/applications/luci-app-samba/po/zh-tw/samba.po
+new file mode 100644
+index 0000000..6ec99ee
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-samba/po/zh-tw/samba.po
+@@ -0,0 +1,76 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-07 15:43+0200\n"
++"Last-Translator: Ethan <ethan42411@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Allow guests"
++msgstr "å…許匿å使用者"
++
++msgid "Allow system users to reach their home directories via network shares"
++msgstr "å…許系統使用者é€éŽç¶²è·¯åˆ†äº«å®¶ç›®éŒ„"
++
++msgid "Allowed users"
++msgstr "å…許使用者"
++
++msgid "Create mask"
++msgstr "建立權é™"
++
++msgid "Description"
++msgstr "æè¿°"
++
++msgid "Directory mask"
++msgstr "目錄權é™"
++
++msgid "Edit Template"
++msgstr "編輯樣版"
++
++msgid "Edit the template that is used for generating the samba configuration."
++msgstr "編輯用來產生Samba設定的樣æ¿"
++
++msgid "General Settings"
++msgstr "基本設定"
++
++msgid "Hostname"
++msgstr "主機å稱"
++
++msgid "Mask for new directories"
++msgstr "新目錄權é™"
++
++msgid "Mask for new files"
++msgstr "新檔案權é™"
++
++msgid "Name"
++msgstr "共用å稱"
++
++msgid "Network Shares"
++msgstr "網路分享"
++
++msgid "Path"
++msgstr "路徑"
++
++msgid "Read-only"
++msgstr "唯讀"
++
++msgid "Share home-directories"
++msgstr "分享家目錄"
++
++msgid "Shared Directories"
++msgstr "分享目錄"
++
++msgid ""
++"This is the content of the file '/etc/samba/smb.conf.template' from which "
++"your samba configuration will be generated. Values enclosed by pipe symbols "
++"('|') should not be changed. They get their values from the 'General "
++"Settings' tab."
++msgstr "建立Samba設定的 \"/etc/samba/smb.conf.template\" 檔案內容。被('|')包åœçš„值å¯ä»¥åœ¨åŸºæœ¬è¨­å®šä¸­é€²è¡Œè¨­å®š"
++
++msgid "Workgroup"
++msgstr "工作群組"
+diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/Makefile b/feeds/luci/applications/luci-app-shadowsocks-libev/Makefile
+new file mode 100644
+index 0000000..848a5c8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for Shadowsocks-libev
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua b/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua
+new file mode 100644
+index 0000000..ae96816
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua
+@@ -0,0 +1,12 @@
++-- Copyright 2015 Jian Chang <aa65535@live.com>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.shadowsocks-libev", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/shadowsocks-libev") then
++ return
++ end
++
++ entry({"admin", "services", "shadowsocks-libev"}, cbi("shadowsocks-libev"), _("ShadowSocks-libev"), 74).dependent = true
++end
+diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev.lua b/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev.lua
+new file mode 100644
+index 0000000..76435e2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev.lua
+@@ -0,0 +1,156 @@
++-- Copyright 2015 Jian Chang <aa65535@live.com>
++-- Licensed to the public under the Apache License 2.0.
++
++local m, s, o, e, a
++
++if luci.sys.call("pidof ss-redir >/dev/null") == 0 then
++ m = Map("shadowsocks-libev", translate("ShadowSocks-libev"), translate("ShadowSocks-libev is running"))
++else
++ m = Map("shadowsocks-libev", translate("ShadowSocks-libev"), translate("ShadowSocks-libev is not running"))
++end
++
++e = {
++ "table",
++ "rc4",
++ "rc4-md5",
++ "aes-128-cfb",
++ "aes-192-cfb",
++ "aes-256-cfb",
++ "bf-cfb",
++ "camellia-128-cfb",
++ "camellia-192-cfb",
++ "camellia-256-cfb",
++ "cast5-cfb",
++ "des-cfb",
++ "idea-cfb",
++ "rc2-cfb",
++ "seed-cfb",
++ "salsa20",
++ "chacha20",
++}
++
++-- Global Setting
++s = m:section(TypedSection, "shadowsocks-libev", translate("Global Setting"))
++s.anonymous = true
++
++o = s:option(Flag, "enable", translate("Enable"))
++o.default = 1
++o.rmempty = false
++
++o = s:option(Value, "server", translate("Server Address"))
++o.datatype = "ipaddr"
++o.rmempty = false
++
++o = s:option(Value, "server_port", translate("Server Port"))
++o.datatype = "port"
++o.rmempty = false
++
++o = s:option(Value, "local_port", translate("Local Port"))
++o.datatype = "port"
++o.default = 1080
++o.rmempty = false
++
++o = s:option(Value, "timeout", translate("Connection Timeout"))
++o.datatype = "uinteger"
++o.default = 60
++o.rmempty = false
++
++o = s:option(Value, "password", translate("Password"))
++o.password = true
++o.rmempty = false
++
++o = s:option(ListValue, "encrypt_method", translate("Encrypt Method"))
++for i,v in ipairs(e) do
++ o:value(v)
++end
++o.rmempty = false
++
++o = s:option(Value, "ignore_list", translate("Ignore List"))
++o:value("/dev/null", translate("Disabled"))
++o.default = "/dev/null"
++o.rmempty = false
++
++-- UDP Relay
++s = m:section(TypedSection, "shadowsocks-libev", translate("UDP Relay"))
++s.anonymous = true
++
++o = s:option(ListValue, "udp_mode", translate("Relay Mode"))
++o:value("0", translate("Disabled"))
++o:value("1", translate("Enabled"))
++o:value("2", translate("Custom"))
++o.default = 0
++o.rmempty = false
++
++o = s:option(Value, "udp_server", translate("Server Address"))
++o.datatype = "ipaddr"
++o:depends("udp_mode", 2)
++
++o = s:option(Value, "udp_server_port", translate("Server Port"))
++o.datatype = "port"
++o:depends("udp_mode", 2)
++
++o = s:option(Value, "udp_local_port", translate("Local Port"))
++o.datatype = "port"
++o.default = 1081
++o:depends("udp_mode", 2)
++
++o = s:option(Value, "udp_timeout", translate("Connection Timeout"))
++o.datatype = "uinteger"
++o.default = 60
++o:depends("udp_mode", 2)
++
++o = s:option(Value, "udp_password", translate("Password"))
++o.password = true
++o:depends("udp_mode", 2)
++
++o = s:option(ListValue, "udp_encrypt_method", translate("Encrypt Method"))
++for i,v in ipairs(e) do
++ o:value(v)
++end
++o:depends("udp_mode", 2)
++
++-- UDP Forward
++s = m:section(TypedSection, "shadowsocks-libev", translate("UDP Forward"))
++s.anonymous = true
++
++o = s:option(Flag, "tunnel_enable", translate("Enable"))
++o.default = 1
++o.rmempty = false
++
++o = s:option(Value, "tunnel_port", translate("UDP Local Port"))
++o.datatype = "port"
++o.default = 5300
++
++o = s:option(Value, "tunnel_forward", translate("Forwarding Tunnel"))
++o.default = "8.8.4.4:53"
++
++-- Access Control
++s = m:section(TypedSection, "shadowsocks-libev", translate("Access Control"))
++s.anonymous = true
++
++s:tab("lan_ac", translate("LAN"))
++
++o = s:taboption("lan_ac", ListValue, "lan_ac_mode", translate("Access Control"))
++o:value("0", translate("Disabled"))
++o:value("1", translate("Allow listed only"))
++o:value("2", translate("Allow all except listed"))
++o.default = 0
++o.rmempty = false
++
++a = luci.sys.net.arptable() or {}
++
++o = s:taboption("lan_ac", DynamicList, "lan_ac_ip", translate("LAN IP List"))
++o.datatype = "ipaddr"
++for i,v in ipairs(a) do
++ o:value(v["IP address"])
++end
++
++s:tab("wan_ac", translate("WAN"))
++
++o = s:taboption("wan_ac", DynamicList, "wan_bp_ip", translate("Bypassed IP"))
++o.datatype = "ip4addr"
++
++o = s:taboption("wan_ac", DynamicList, "wan_fw_ip", translate("Forwarded IP"))
++o.datatype = "ip4addr"
++
++return m
+diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot b/feeds/luci/applications/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot
+new file mode 100644
+index 0000000..81bbcb7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot
+@@ -0,0 +1,86 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Access Control"
++msgstr ""
++
++msgid "Allow all except listed"
++msgstr ""
++
++msgid "Allow listed only"
++msgstr ""
++
++msgid "Bypassed IP"
++msgstr ""
++
++msgid "Connection Timeout"
++msgstr ""
++
++msgid "Custom"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encrypt Method"
++msgstr ""
++
++msgid "Forwarded IP"
++msgstr ""
++
++msgid "Forwarding Tunnel"
++msgstr ""
++
++msgid "Global Setting"
++msgstr ""
++
++msgid "Ignore List"
++msgstr ""
++
++msgid "LAN"
++msgstr ""
++
++msgid "LAN IP List"
++msgstr ""
++
++msgid "Local Port"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Relay Mode"
++msgstr ""
++
++msgid "Server Address"
++msgstr ""
++
++msgid "Server Port"
++msgstr ""
++
++msgid "ShadowSocks-libev"
++msgstr ""
++
++msgid "ShadowSocks-libev is not running"
++msgstr ""
++
++msgid "ShadowSocks-libev is running"
++msgstr ""
++
++msgid "UDP Forward"
++msgstr ""
++
++msgid "UDP Local Port"
++msgstr ""
++
++msgid "UDP Relay"
++msgstr ""
++
++msgid "WAN"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po b/feeds/luci/applications/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po
+new file mode 100644
+index 0000000..f86eee7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po
+@@ -0,0 +1,97 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2014-11-12 14:12+0800\n"
++"PO-Revision-Date: 2015-07-02 14:26+0800\n"
++"Last-Translator: Jian Chang <aa65535@live.com>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Access Control"
++msgstr "访问控制"
++
++msgid "Allow all except listed"
++msgstr "ä»…å…许列表外"
++
++msgid "Allow listed only"
++msgstr "ä»…å…许列表内"
++
++msgid "Bypassed IP"
++msgstr "被忽略的IP"
++
++msgid "Connection Timeout"
++msgstr "连接超时"
++
++msgid "Custom"
++msgstr "自定义"
++
++msgid "Disabled"
++msgstr "å·²ç¦ç”¨"
++
++msgid "Enable"
++msgstr "å¯ç”¨"
++
++msgid "Enabled"
++msgstr "å·²å¯ç”¨"
++
++msgid "Encrypt Method"
++msgstr "加密方å¼"
++
++msgid "Forwarded IP"
++msgstr "走代ç†çš„IP"
++
++msgid "Forwarding Tunnel"
++msgstr "UDP转å‘地å€"
++
++msgid "Global Setting"
++msgstr "全局设置"
++
++msgid "Ignore List"
++msgstr "忽略列表"
++
++msgid "LAN"
++msgstr ""
++
++msgid "LAN IP List"
++msgstr "内网IP列表"
++
++msgid "Local Port"
++msgstr "本地端å£"
++
++msgid "Password"
++msgstr "密ç "
++
++msgid "Relay Mode"
++msgstr "中继模å¼"
++
++msgid "Server Address"
++msgstr "æœåŠ¡å™¨åœ°å€"
++
++msgid "Server Port"
++msgstr "æœåŠ¡å™¨ç«¯å£"
++
++msgid "ShadowSocks-libev"
++msgstr "ShadowSocks-libev"
++
++msgid "ShadowSocks-libev is not running"
++msgstr "ShadowSocks-libev 未è¿è¡Œ"
++
++msgid "ShadowSocks-libev is running"
++msgstr "ShadowSocks-libev è¿è¡Œä¸­"
++
++msgid "UDP Forward"
++msgstr "UDP转å‘"
++
++msgid "UDP Local Port"
++msgstr "UDP本地端å£"
++
++msgid "UDP Relay"
++msgstr "UDP中继"
++
++msgid "WAN"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/root/etc/uci-defaults/luci-shadowsocks-libev b/feeds/luci/applications/luci-app-shadowsocks-libev/root/etc/uci-defaults/luci-shadowsocks-libev
+new file mode 100644
+index 0000000..6f30fa7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/root/etc/uci-defaults/luci-shadowsocks-libev
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@shadowsocks-libev[-1]
++ add ucitrack shadowsocks-libev
++ set ucitrack.@shadowsocks-libev[-1].init=shadowsocks-libev
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-shairplay/Makefile b/feeds/luci/applications/luci-app-shairplay/Makefile
+new file mode 100644
+index 0000000..dcc0611
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shairplay/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for Shairplay
++LUCI_DEPENDS:=+shairplay
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-shairplay/luasrc/controller/shairplay.lua b/feeds/luci/applications/luci-app-shairplay/luasrc/controller/shairplay.lua
+new file mode 100644
+index 0000000..d322301
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shairplay/luasrc/controller/shairplay.lua
+@@ -0,0 +1,14 @@
++-- Copyright 2014 Ãlvaro Fernández Rojas <noltari@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.shairplay", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/shairplay") then
++ return
++ end
++
++ local page = entry({"admin", "services", "shairplay"}, cbi("shairplay"), _("Shairplay"))
++ page.dependent = true
++
++end
+diff --git a/feeds/luci/applications/luci-app-shairplay/luasrc/model/cbi/shairplay.lua b/feeds/luci/applications/luci-app-shairplay/luasrc/model/cbi/shairplay.lua
+new file mode 100644
+index 0000000..4e078d7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shairplay/luasrc/model/cbi/shairplay.lua
+@@ -0,0 +1,65 @@
++-- Copyright 2014 Ãlvaro Fernández Rojas <noltari@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("shairplay", "Shairplay", translate("Shairplay is a simple AirPlay server implementation, here you can configure the settings."))
++
++s = m:section(TypedSection, "shairplay", "")
++s.addremove = true
++s.anonymous = false
++
++enable=s:option(Flag, "disabled", translate("Enabled"))
++enable.enabled="0"
++enable.disabled="1"
++enable.default = "1"
++enable.rmempty = false
++respawn=s:option(Flag, "respawn", translate("Respawn"))
++respawn.default = false
++
++apname = s:option(Value, "apname", translate("Airport Name"))
++apname.rmempty = true
++
++port=s:option(Value, "port", translate("Port"))
++port.rmempty = true
++port.datatype = "port"
++
++pw = s:option(Value, "password", translate("Password"))
++pw.rmempty = true
++pw.password = true
++
++hwaddr=s:option(Value, "hwaddr", translate("HW Address"))
++hwaddr.rmempty = true
++hwaddr.datatype = "macaddr"
++
++ao_driver=s:option(ListValue, "ao_driver", translate("AO Driver"))
++ao_driver:value("", translate("Default"))
++ao_driver:value("alsa")
++--ao_driver:value("alsa05")
++--ao_driver:value("arts")
++--ao_driver:value("esd")
++--ao_driver:value("irix")
++--ao_driver:value("nas")
++ao_driver:value("oss")
++--ao_driver:value("sun")
++
++ao_devicename=s:option(Value, "ao_devicename", translate("AO Device Name"))
++ao_devicename.rmempty = true
++
++ao_deviceid = s:option(ListValue, "ao_deviceid", translate("AO Device ID"))
++ao_deviceid.rmempty = true
++ao_deviceid:value("", translate("Default"))
++local pats = io.popen("find /proc/asound/ -type d -name 'card*' | sort")
++if pats then
++ local l
++ while true do
++ l = pats:read("*l")
++ if not l then break end
++
++ l = string.gsub(l, "/proc/asound/card", "")
++ if l then
++ ao_deviceid:value(l)
++ end
++ end
++ pats:close()
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-shairplay/root/etc/uci-defaults/luci-shairplay b/feeds/luci/applications/luci-app-shairplay/root/etc/uci-defaults/luci-shairplay
+new file mode 100644
+index 0000000..efc8a89
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shairplay/root/etc/uci-defaults/luci-shairplay
+@@ -0,0 +1,12 @@
++#!/bin/sh
++
++# needed for "Save and Apply" to restart shairplay
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@shairplay[-1]
++ add ucitrack shairplay
++ set ucitrack.@shairplay[-1].init="shairplay"
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-shairport/Makefile b/feeds/luci/applications/luci-app-shairport/Makefile
+new file mode 100644
+index 0000000..f174ef4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shairport/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for Shairport
++LUCI_DEPENDS:=+shairport
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-shairport/luasrc/controller/shairport.lua b/feeds/luci/applications/luci-app-shairport/luasrc/controller/shairport.lua
+new file mode 100644
+index 0000000..b31b64e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shairport/luasrc/controller/shairport.lua
+@@ -0,0 +1,14 @@
++-- Copyright 2014 Ãlvaro Fernández Rojas <noltari@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.shairport", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/shairport") then
++ return
++ end
++
++ local page = entry({"admin", "services", "shairport"}, cbi("shairport"), _("Shairport"))
++ page.dependent = true
++
++end
+diff --git a/feeds/luci/applications/luci-app-shairport/luasrc/model/cbi/shairport.lua b/feeds/luci/applications/luci-app-shairport/luasrc/model/cbi/shairport.lua
+new file mode 100644
+index 0000000..d3c2a25
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shairport/luasrc/model/cbi/shairport.lua
+@@ -0,0 +1,161 @@
++-- Copyright 2014 Ãlvaro Fernández Rojas <noltari@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("shairport", "Shairport", translate("Shairport is a simple AirPlay server implementation, here you can configure the settings."))
++
++s = m:section(TypedSection, "shairport", "")
++s.addremove = true
++s.anonymous = false
++
++enable=s:option(Flag, "disabled", translate("Enabled"))
++enable.enabled="0"
++enable.disabled="1"
++enable.default = "1"
++enable.rmempty = false
++respawn=s:option(Flag, "respawn", translate("Respawn"))
++respawn.default = false
++
++bname = s:option(Value, "bname", translate("Airport Name"))
++bname.rmempty = true
++
++pw = s:option(Value, "password", translate("Password"))
++pw.rmempty = true
++pw.password = true
++
++port=s:option(Value, "port", translate("Port"))
++port.rmempty = true
++port.datatype = "port"
++
++buffer=s:option(Value, "buffer", translate("Buffer fill"))
++buffer.rmempty = true
++buffer.datatype = "uinteger"
++
++log_file=s:option(Value, "log_file", translate("Log file"))
++log_file.rmempty = true
++--log_file.datatype = "file"
++
++err_file=s:option(Value, "err_file", translate("Error file"))
++err_file.rmempty = true
++--err_file.datatype = "file"
++
++meta_dir=s:option(Value, "meta_dir", translate("Metadata directory"))
++meta_dir.rmempty = true
++meta_dir.datatype = "directory"
++
++cmd_start=s:option(Value, "cmd_start", translate("Command when playback begins"))
++cmd_start.rmempty = true
++
++cmd_stop=s:option(Value, "cmd_stop", translate("Command when playback ends"))
++cmd_stop.rmempty = true
++
++cmd_wait=s:option(Flag, "cmd_wait", translate("Block while the commands run"))
++cmd_wait.default = false
++
++mdns=s:option(ListValue, "mdns", translate("mDNS"))
++mdns.rmempty = true
++mdns:value("", translate("Default"))
++mdns:value("avahi")
++mdns:value("dns_sd")
++mdns:value("external_avahi")
++mdns:value("external_dns_sd")
++mdns:value("tinysvcmdns")
++
++audio_output=s:option(ListValue, "audio_output", translate("Audio output"))
++audio_output.rmempty = true
++audio_output:value("", translate("Default"))
++audio_output:value("alsa")
++audio_output:value("ao")
++audio_output:value("dummy")
++audio_output:value("pulse")
++audio_output:value("pipe")
++
++-- alsa output --
++output_dev=s:option(Value, "output_dev", translate("Output device"))
++output_dev.rmempty = true
++output_dev:depends("audio_output", "alsa")
++
++mixer_dev=s:option(Value, "mixer_dev", translate("Mixer device"))
++mixer_dev.rmempty = true
++mixer_dev:depends("audio_output", "alsa")
++
++mixer_type=s:option(ListValue, "mixer_type", translate("Mixer type"))
++mixer_type.rmempty = true
++mixer_type:value("", translate("Default"))
++mixer_type:value("software")
++mixer_type:value("hardware")
++mixer_type:depends("audio_output", "alsa")
++
++mixer_control=s:option(Value, "mixer_control", translate("Mixer control"))
++mixer_control.rmempty = true
++mixer_control:depends("audio_output", "alsa")
++
++mixer_index = s:option(ListValue, "mixer_index", translate("Mixer index"))
++mixer_index.rmempty = true
++mixer_index:depends("audio_output", "alsa")
++mixer_index:value("", translate("Default"))
++local pats = io.popen("find /proc/asound/ -type d -name 'card*' | sort")
++if pats then
++ local l
++ while true do
++ l = pats:read("*l")
++ if not l then break end
++
++ l = string.gsub(l, "/proc/asound/card", "")
++ if l then
++ mixer_index:value(l)
++ end
++ end
++ pats:close()
++end
++
++-- ao output --
++ao_driver=s:option(Value, "ao_driver", translate("AO driver"))
++ao_driver.rmempty = true
++ao_driver:depends("audio_output", "ao")
++
++ao_name=s:option(Value, "ao_name", translate("AO name"))
++ao_name.rmempty = true
++ao_name:depends("audio_output", "ao")
++
++ao_id = s:option(ListValue, "ao_id", translate("AO id"))
++ao_id.rmempty = true
++ao_id:depends("audio_output", "ao")
++ao_id:value("", translate("Default"))
++local pats = io.popen("find /proc/asound/ -type d -name 'card*' | sort")
++if pats then
++ local l
++ while true do
++ l = pats:read("*l")
++ if not l then break end
++
++ l = string.gsub(l, "/proc/asound/card", "")
++ if l then
++ ao_id:value(l)
++ end
++ end
++ pats:close()
++end
++
++ao_options=s:option(Value, "ao_options", translate("AO options"))
++ao_options.rmempty = true
++ao_options:depends("audio_output", "ao")
++
++-- pipe output --
++output_fifo=s:option(Value, "output_fifo", translate("Output FIFO"))
++output_fifo.rmempty = true
++output_fifo:depends("audio_output", "pipe")
++
++-- pulse output --
++pulse_server=s:option(Value, "pulse_server", translate("Pulse server"))
++pulse_server.rmempty = true
++pulse_server:depends("audio_output", "pulse")
++
++pulse_sink=s:option(Value, "pulse_sink", translate("Pulse sink"))
++pulse_sink.rmempty = true
++pulse_sink:depends("audio_output", "pulse")
++
++pulse_appname=s:option(Value, "pulse_appname", translate("Pulse application name"))
++pulse_appname.rmempty = true
++pulse_appname:depends("audio_output", "pulse")
++
++return m
+diff --git a/feeds/luci/applications/luci-app-shairport/root/etc/uci-defaults/luci-shairport b/feeds/luci/applications/luci-app-shairport/root/etc/uci-defaults/luci-shairport
+new file mode 100644
+index 0000000..be9412b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-shairport/root/etc/uci-defaults/luci-shairport
+@@ -0,0 +1,12 @@
++#!/bin/sh
++
++# needed for "Save and Apply" to restart shairport
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@shairport[-1]
++ add ucitrack shairport
++ set ucitrack.@shairport[-1].init="shairport"
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-siitwizard/Makefile b/feeds/luci/applications/luci-app-siitwizard/Makefile
+new file mode 100644
+index 0000000..e8a8e55
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-siitwizard/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=SIIT IPv4-over-IPv6 configuration wizard
++LUCI_DEPENDS:=+kmod-siit
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-siitwizard/luasrc/controller/siitwizard.lua b/feeds/luci/applications/luci-app-siitwizard/luasrc/controller/siitwizard.lua
+new file mode 100644
+index 0000000..4d1c140
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-siitwizard/luasrc/controller/siitwizard.lua
+@@ -0,0 +1,9 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module "luci.controller.siitwizard"
++
++function index()
++ entry({"admin", "network", "siitwizard"}, form("siitwizard"), "SIIT 4over6 assistent", 99)
++end
+diff --git a/feeds/luci/applications/luci-app-siitwizard/luasrc/model/cbi/siitwizard.lua b/feeds/luci/applications/luci-app-siitwizard/luasrc/model/cbi/siitwizard.lua
+new file mode 100644
+index 0000000..0d73832
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-siitwizard/luasrc/model/cbi/siitwizard.lua
+@@ -0,0 +1,373 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local uci = require "luci.model.uci".cursor()
++local bit = require "nixio".bit
++local ip = require "luci.ip"
++
++-------------------- Init --------------------
++
++--
++-- Find link-local address
++--
++function find_ll()
++ local _, r
++ for _, r in ipairs(ip.routes({ family = 6, dest = "fe80::/64" })) do
++ if r.dest:higher("fe80:0:0:0:ff:fe00:0:0") then
++ return (r.dest - "fe80::")
++ end
++ end
++ return ip.IPv6("::")
++end
++
++--
++-- Determine defaults
++--
++local ula_prefix = uci:get("siit", "ipv6", "ula_prefix") or "fd00::"
++local ula_global = uci:get("siit", "ipv6", "ula_global") or "00ca:ffee:babe::" -- = Freifunk
++local ula_subnet = uci:get("siit", "ipv6", "ula_subnet") or "0000:0000:0000:4223::" -- = Berlin
++local siit_prefix = uci:get("siit", "ipv6", "siit_prefix") or "::ffff:0000:0000"
++local ipv4_pool = uci:get("siit", "ipv4", "pool") or "172.16.0.0/12"
++local ipv4_netsz = uci:get("siit", "ipv4", "netsize") or "24"
++
++--
++-- Find IPv4 allocation pool
++--
++local gv4_net = ip.IPv4(ipv4_pool)
++
++--
++-- Generate ULA
++--
++local ula = ip.IPv6("::/64")
++
++for _, prefix in ipairs({ ula_prefix, ula_global, ula_subnet }) do
++ ula = ula:add(ip.IPv6(prefix))
++end
++
++ula = ula:add(find_ll())
++
++
++-------------------- View --------------------
++f = SimpleForm("siitwizward", "SIIT-Wizzard",
++ "This wizzard helps to setup SIIT (IPv4-over-IPv6) translation according to RFC2765.")
++
++f:field(DummyValue, "info_ula", "Mesh ULA address").value = ula:string()
++
++f:field(DummyValue, "ipv4_pool", "IPv4 allocation pool").value =
++ "%s (%i hosts)" %{ gv4_net:string(), 2 ^ ( 32 - gv4_net:prefix() ) - 2 }
++
++f:field(DummyValue, "ipv4_size", "IPv4 LAN network prefix").value =
++ "%i bit (%i hosts)" %{ ipv4_netsz, 2 ^ ( 32 - ipv4_netsz ) - 2 }
++
++mode = f:field(ListValue, "mode", "Operation mode")
++mode:value("client", "Client")
++mode:value("gateway", "Gateway")
++
++dev = f:field(ListValue, "device", "Wireless device")
++uci:foreach("wireless", "wifi-device",
++ function(section)
++ dev:value(section[".name"])
++ end)
++
++lanip = f:field(Value, "ipaddr", "LAN IPv4 subnet")
++function lanip.formvalue(self, section)
++ local val = self.map:formvalue(self:cbid(section))
++ local net = ip.IPv4("%s/%i" %{ val, ipv4_netsz })
++
++ if net then
++ if gv4_net:contains(net) then
++ if not net:minhost():equal(net:host()) then
++ self.error = { [section] = true }
++ f.errmessage = "IPv4 address is not the first host of " ..
++ "subnet, expected " .. net:minhost():string()
++ end
++ else
++ self.error = { [section] = true }
++ f.errmessage = "IPv4 address is not within the allocation pool"
++ end
++ else
++ self.error = { [section] = true }
++ f.errmessage = "Invalid IPv4 address given"
++ end
++
++ return val
++end
++
++dns = f:field(Value, "dns", "DNS server for LAN clients")
++dns.value = "141.1.1.1"
++
++-------------------- Control --------------------
++function f.handle(self, state, data)
++ if state == FORM_VALID then
++ luci.http.redirect(luci.dispatcher.build_url("admin", "uci", "changes"))
++ return false
++ end
++ return true
++end
++
++function mode.write(self, section, value)
++
++ --
++ -- Find LAN IPv4 range
++ --
++ local lan_net = ip.IPv4(
++ ( lanip:formvalue(section) or "172.16.0.1" ) .. "/" .. ipv4_netsz
++ )
++
++ if not lan_net then return end
++
++ --
++ -- Find wifi interface, dns server and hostname
++ --
++ local device = dev:formvalue(section)
++ local dns_server = dns:formvalue(section) or "141.1.1.1"
++ local hostname = "siit-" .. lan_net:host():string():gsub("%.","-")
++
++ --
++ -- Configure wifi device
++ --
++ local wifi_device = dev:formvalue(section)
++ local wifi_essid = uci:get("siit", "wifi", "essid") or "6mesh.freifunk.net"
++ local wifi_bssid = uci:get("siit", "wifi", "bssid") or "02:ca:ff:ee:ba:be"
++ local wifi_channel = uci:get("siit", "wifi", "channel") or "1"
++
++ -- nuke old device definition
++ uci:delete_all("wireless", "wifi-iface",
++ function(s) return s.device == wifi_device end )
++
++ uci:delete_all("network", "interface",
++ function(s) return s['.name'] == wifi_device end )
++
++ -- create wifi device definition
++ uci:tset("wireless", wifi_device, {
++ disabled = 0,
++ channel = wifi_channel,
++-- txantenna = 1,
++-- rxantenna = 1,
++-- diversity = 0
++ })
++
++ uci:section("wireless", "wifi-iface", nil, {
++ encryption = "none",
++ mode = "adhoc",
++ txpower = 10,
++ sw_merge = 1,
++ network = wifi_device,
++ device = wifi_device,
++ ssid = wifi_essid,
++ bssid = wifi_bssid,
++ })
++
++ --
++ -- Gateway mode
++ --
++ -- * wan port is dhcp, lan port is 172.23.1.1/24
++ -- * siit0 gets a dummy address: 169.254.42.42
++ -- * wl0 gets an ipv6 address, in this case the fdca:ffee:babe::1:1/64
++ -- * we do a ::ffff:ffff:0/96 route into siit0, so everything from 6mesh goes into translation.
++ -- * an HNA6 of ::ffff:ffff:0:0/96 announces the mapped 0.0.0.0/0 ipv4 space.
++ -- * MTU on WAN, LAN down to 1400, ipv6 headers are slighly larger.
++
++ if value == "gateway" then
++
++ -- wan mtu
++ uci:set("network", "wan", "mtu", 1240)
++
++ -- lan settings
++ uci:tset("network", "lan", {
++ mtu = 1240,
++ ipaddr = lan_net:host():string(),
++ netmask = lan_net:mask():string(),
++ proto = "static"
++ })
++
++ -- use full siit subnet
++ siit_route = ip.IPv6(siit_prefix .. "/96")
++
++ -- v4 <-> siit route
++ uci:delete_all("network", "route",
++ function(s) return s.interface == "siit0" end)
++
++ uci:section("network", "route", nil, {
++ interface = "siit0",
++ target = gv4_net:network():string(),
++ netmask = gv4_net:mask():string()
++ })
++
++ --
++ -- Client mode
++ --
++ -- * 172.23.2.1/24 on its lan, fdca:ffee:babe::1:2 on wl0 and the usual dummy address on siit0.
++ -- * we do a ::ffff:ffff:172.13.2.0/120 to siit0, because in this case, only traffic directed to clients needs to go into translation.
++ -- * same route as HNA6 announcement to catch the traffic out of the mesh.
++ -- * Also, MTU on LAN reduced to 1400.
++
++ else
++
++ -- lan settings
++ uci:tset("network", "lan", {
++ mtu = 1240,
++ ipaddr = lan_net:host():string(),
++ netmask = lan_net:mask():string()
++ })
++
++ -- derive siit subnet from lan config
++ siit_route = ip.IPv6(
++ siit_prefix .. "/" .. (96 + lan_net:prefix())
++ ):add(lan_net[2])
++
++ -- ipv4 <-> siit route
++ uci:delete_all("network", "route",
++ function(s) return s.interface == "siit0" end)
++
++ -- XXX: kind of a catch all, gv4_net would be better
++ -- but does not cover non-local v4 space
++ uci:section("network", "route", nil, {
++ interface = "siit0",
++ target = "0.0.0.0",
++ netmask = "0.0.0.0"
++ })
++ end
++
++ -- setup the firewall
++ uci:delete_all("firewall", "zone",
++ function(s) return (
++ s['.name'] == "siit0" or s.name == "siit0" or
++ s.network == "siit0" or s['.name'] == wifi_device or
++ s.name == wifi_device or s.network == wifi_device
++ ) end)
++
++ uci:delete_all("firewall", "forwarding",
++ function(s) return (
++ s.src == wifi_device and s.dest == "siit0" or
++ s.dest == wifi_device and s.src == "siit0" or
++ s.src == "lan" and s.dest == "siit0" or
++ s.dest == "lan" and s.src == "siit0"
++ ) end)
++
++ uci:section("firewall", "zone", "siit0", {
++ name = "siit0",
++ network = "siit0",
++ input = "ACCEPT",
++ output = "ACCEPT",
++ forward = "ACCEPT"
++ })
++
++ uci:section("firewall", "zone", wifi_device, {
++ name = wifi_device,
++ network = wifi_device,
++ input = "ACCEPT",
++ output = "ACCEPT",
++ forward = "ACCEPT"
++ })
++
++ uci:section("firewall", "forwarding", nil, {
++ src = wifi_device,
++ dest = "siit0"
++ })
++
++ uci:section("firewall", "forwarding", nil, {
++ src = "siit0",
++ dest = wifi_device
++ })
++
++ uci:section("firewall", "forwarding", nil, {
++ src = "lan",
++ dest = "siit0"
++ })
++
++ uci:section("firewall", "forwarding", nil, {
++ src = "siit0",
++ dest = "lan"
++ })
++
++ -- firewall include
++ uci:delete_all("firewall", "include",
++ function(s) return s.path == "/etc/firewall.user" end)
++
++ uci:section("firewall", "include", nil, {
++ path = "/etc/firewall.user"
++ })
++
++
++ -- siit0 interface
++ uci:delete_all("network", "interface",
++ function(s) return ( s.ifname == "siit0" ) end)
++
++ uci:section("network", "interface", "siit0", {
++ ifname = "siit0",
++ proto = "none"
++ })
++
++ -- siit0 route
++ uci:delete_all("network", "route6",
++ function(s) return siit_route:contains(ip.IPv6(s.target)) end)
++
++ uci:section("network", "route6", nil, {
++ interface = "siit0",
++ target = siit_route:string()
++ })
++
++ -- create wifi network interface
++ uci:section("network", "interface", wifi_device, {
++ proto = "static",
++ mtu = 1400,
++ ip6addr = ula:string()
++ })
++
++ -- nuke old olsrd interfaces
++ uci:delete_all("olsrd", "Interface",
++ function(s) return s.interface == wifi_device end)
++
++ -- configure olsrd interface
++ uci:foreach("olsrd", "olsrd",
++ function(s) uci:set("olsrd", s['.name'], "IpVersion", 6) end)
++
++ uci:section("olsrd", "Interface", nil, {
++ ignore = 0,
++ interface = wifi_device,
++ Ip6AddrType = "unique-local"
++ })
++
++ -- hna6
++ uci:delete_all("olsrd", "Hna6",
++ function(s) return true end)
++
++ uci:section("olsrd", "Hna6", nil, {
++ netaddr = siit_route:host():string(),
++ prefix = siit_route:prefix()
++ })
++
++ -- txtinfo v6 & olsrd nameservice
++ uci:foreach("olsrd", "LoadPlugin",
++ function(s)
++ if s.library == "olsrd_txtinfo.so.0.1" then
++ uci:set("olsrd", s['.name'], "accept", "::1")
++ elseif s.library == "olsrd_nameservice.so.0.3" then
++ uci:set("olsrd", s['.name'], "name", hostname)
++ end
++ end)
++
++ -- lan dns
++ uci:tset("dhcp", "lan", {
++ dhcp_option = "6," .. dns_server,
++ start = bit.band(lan_net:minhost():add(1)[2][2], 0xFF),
++ limit = ( 2 ^ ( 32 - lan_net:prefix() ) ) - 3
++ })
++
++ -- hostname
++ uci:foreach("system", "system",
++ function(s)
++ uci:set("system", s['.name'], "hostname", hostname)
++ end)
++
++ uci:save("wireless")
++ uci:save("firewall")
++ uci:save("network")
++ uci:save("system")
++ uci:save("olsrd")
++ uci:save("dhcp")
++end
++
++return f
+diff --git a/feeds/luci/applications/luci-app-siitwizard/root/etc/config/siit b/feeds/luci/applications/luci-app-siitwizard/root/etc/config/siit
+new file mode 100644
+index 0000000..c594547
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-siitwizard/root/etc/config/siit
+@@ -0,0 +1,14 @@
++config siit ipv4
++ option pool "77.87.52.0/22"
++ option netsize "29"
++
++config siit ipv6
++ option ula_prefix "fd00::"
++ option ula_global "00ca:ffee:babe::"
++ option ula_subnet "0000:0000:0000:dada::"
++ option siit_prefix "::ffff:0000:0000"
++
++config siit wifi
++ option essid "6mesh.freifunk.net"
++ option bssid "02:25:c3:ca:ff:ee"
++ option channel "1"
+diff --git a/feeds/luci/applications/luci-app-splash/Makefile b/feeds/luci/applications/luci-app-splash/Makefile
+new file mode 100644
+index 0000000..345f891
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Freifunk DHCP-Splash application
++LUCI_DEPENDS:=+luci-lib-nixio +tc +kmod-sched +iptables-mod-nat-extra +iptables-mod-ipopt
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-splash/README b/feeds/luci/applications/luci-app-splash/README
+new file mode 100644
+index 0000000..5a7af14
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/README
+@@ -0,0 +1,5 @@
++
++* IPv6 support is only partial:
++ - will only work when used together with IPv4 (Dual stack)
++ - No bandwidth limiting
++
+diff --git a/feeds/luci/applications/luci-app-splash/htdocs/cgi-bin/splash/splash.sh b/feeds/luci/applications/luci-app-splash/htdocs/cgi-bin/splash/splash.sh
+new file mode 100755
+index 0000000..da8370d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/htdocs/cgi-bin/splash/splash.sh
+@@ -0,0 +1,33 @@
++#!/bin/sh
++
++$(uci -q get luci_splash.general.redirect_url) || {
++ touch /var/state/luci_splash_locations
++ touch /etc/config/luci_splash_locations
++ MAC=$(grep "$REMOTE_HOST" /proc/net/arp | awk '{print $4}')
++ uci -P /var/state set luci_splash_locations.${MAC//:/}=redirect
++ uci -P /var/state set luci_splash_locations.${MAC//:/}.location="http://${HTTP_HOST}${REQUEST_URI}"
++}
++
++echo -en "Cache-Control: no-cache, max-age=0, no-store, must-revalidate\r\n"
++echo -en "Pragma: no-cache\r\n"
++echo -en "Expires: -1\r\n"
++echo -en "Status: 307 Temporary Redirect\r\n"
++echo -en "Location: http://$SERVER_ADDR/cgi-bin/luci/splash\r\n"
++echo -en "\r\n"
++
++cat <<EOT
++<?xml version="1.0" encoding="UTF-8"?>
++<WISPAccessGatewayParam xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.wballiance.net/wispr_2_0.xsd">
++ <Redirect>
++ <MessageType>100</MessageType>
++ <ResponseCode>0</ResponseCode>
++ <AccessProcedure>1.0</AccessProcedure>
++ <AccessLocation>12</AccessLocation>
++ <LocationName>$SERVER_ADDR</LocationName>
++ <LoginURL>http://$SERVER_ADDR/cgi-bin/luci/splash?wispr=1</LoginURL>
++ <AbortLoginURL>http://$SERVER_ADDR/</AbortLoginURL>
++ </Redirect>
++</WISPAccessGatewayParam>
++EOT
++
++
+diff --git a/feeds/luci/applications/luci-app-splash/htdocs/luci/splash/index.html b/feeds/luci/applications/luci-app-splash/htdocs/luci/splash/index.html
+new file mode 100644
+index 0000000..486409a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/htdocs/luci/splash/index.html
+@@ -0,0 +1,10 @@
++<?xml version="1.0" encoding="utf-8"?>
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
++<html xmlns="http://www.w3.org/1999/xhtml">
++<head>
++<meta http-equiv="refresh" content="0; URL=/cgi-bin/luci/splash" />
++</head>
++<body style="background-color: black">
++<a style="color: white; text-decoration: none" href="/cgi-bin/luci/splash">LuCI - Lua Configuration Interface</a>
++</body>
++</html>
+diff --git a/feeds/luci/applications/luci-app-splash/luasrc/controller/splash/splash.lua b/feeds/luci/applications/luci-app-splash/luasrc/controller/splash/splash.lua
+new file mode 100644
+index 0000000..13b8edc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/luasrc/controller/splash/splash.lua
+@@ -0,0 +1,163 @@
++module("luci.controller.splash.splash", package.seeall)
++
++local uci = luci.model.uci.cursor()
++local util = require "luci.util"
++
++function index()
++ entry({"admin", "services", "splash"}, cbi("splash/splash"), _("Client-Splash"), 90)
++ entry({"admin", "services", "splash", "splashtext" }, form("splash/splashtext"), _("Splashtext"), 10)
++
++ local e
++
++ e = node("splash")
++ e.target = call("action_dispatch")
++
++ node("splash", "activate").target = call("action_activate")
++ node("splash", "splash").target = template("splash_splash/splash")
++ node("splash", "blocked").target = template("splash/blocked")
++
++ entry({"admin", "status", "splash"}, post("action_status_admin"), _("Client-Splash"))
++
++ local page = node("splash", "publicstatus")
++ page.target = call("action_status_public")
++ page.leaf = true
++end
++
++function ip_to_mac(ip)
++ local ipc = require "luci.ip"
++ local i, n
++
++ for i, n in ipairs(ipc.neighbors()) do
++ if n.mac and n.dest and n.dest:equal(ip) then
++ return n.mac
++ end
++ end
++end
++
++function action_dispatch()
++ local uci = luci.model.uci.cursor_state()
++ local mac = ip_to_mac(luci.http.getenv("REMOTE_ADDR")) or ""
++ local access = false
++
++ uci:foreach("luci_splash", "lease", function(s)
++ if s.mac and s.mac:lower() == mac then access = true end
++ end)
++
++ uci:foreach("luci_splash", "whitelist", function(s)
++ if s.mac and s.mac:lower() == mac then access = true end
++ end)
++
++ if #mac > 0 and access then
++ luci.http.redirect(luci.dispatcher.build_url())
++ else
++ luci.http.redirect(luci.dispatcher.build_url("splash", "splash"))
++ end
++end
++
++function blacklist()
++ leased_macs = { }
++ uci:foreach("luci_splash", "blacklist",
++ function(s) leased_macs[s.mac:lower()] = true
++ end)
++ return leased_macs
++end
++
++function action_activate()
++ local ipc = require "luci.ip"
++ local mac = ip_to_mac(luci.http.getenv("REMOTE_ADDR") or "127.0.0.1") or ""
++ local uci_state = require "luci.model.uci".cursor_state()
++ local blacklisted = false
++ if mac and luci.http.formvalue("accept") then
++ uci:foreach("luci_splash", "blacklist",
++ function(s) if s.mac and s.mac:lower() == mac then blacklisted = true end
++ end)
++ if blacklisted then
++ luci.http.redirect(luci.dispatcher.build_url("splash" ,"blocked"))
++ else
++ local redirect_url = uci:get("luci_splash", "general", "redirect_url")
++ if not redirect_url then
++ redirect_url = uci_state:get("luci_splash_locations", mac:gsub(':', ''):lower(), "location")
++ end
++ if not redirect_url then
++ redirect_url = luci.model.uci.cursor():get("freifunk", "community", "homepage") or 'http://www.freifunk.net'
++ end
++ remove_redirect(mac:gsub(':', ''):lower())
++ os.execute("luci-splash lease "..mac.." >/dev/null 2>&1")
++ luci.http.redirect(redirect_url)
++ end
++ else
++ luci.http.redirect(luci.dispatcher.build_url())
++ end
++end
++
++function action_status_admin()
++ local uci = luci.model.uci.cursor_state()
++ local macs = luci.http.formvaluetable("save")
++
++ local changes = {
++ whitelist = { },
++ blacklist = { },
++ lease = { },
++ remove = { }
++ }
++
++ for key, _ in pairs(macs) do
++ local policy = luci.http.formvalue("policy.%s" % key)
++ local mac = luci.http.protocol.urldecode(key)
++
++ if policy == "whitelist" or policy == "blacklist" then
++ changes[policy][#changes[policy]+1] = mac
++ elseif policy == "normal" then
++ changes["lease"][#changes["lease"]+1] = mac
++ elseif policy == "kicked" then
++ changes["remove"][#changes["remove"]+1] = mac
++ end
++ end
++
++ if #changes.whitelist > 0 then
++ os.execute("luci-splash whitelist %s >/dev/null"
++ % table.concat(changes.whitelist))
++ end
++
++ if #changes.blacklist > 0 then
++ os.execute("luci-splash blacklist %s >/dev/null"
++ % table.concat(changes.blacklist))
++ end
++
++ if #changes.lease > 0 then
++ os.execute("luci-splash lease %s >/dev/null"
++ % table.concat(changes.lease))
++ end
++
++ if #changes.remove > 0 then
++ os.execute("luci-splash remove %s >/dev/null"
++ % table.concat(changes.remove))
++ end
++
++ luci.template.render("admin_status/splash", { is_admin = true })
++end
++
++function action_status_public()
++ luci.template.render("admin_status/splash", { is_admin = false })
++end
++
++function remove_redirect(mac)
++ local mac = mac:lower()
++ mac = mac:gsub(":", "")
++ local uci = require "luci.model.uci".cursor_state()
++ local redirects = uci:get_all("luci_splash_locations")
++ --uci:load("luci_splash_locations")
++ uci:revert("luci_splash_locations")
++ -- For all redirects
++ for k, v in pairs(redirects) do
++ if v[".type"] == "redirect" then
++ if v[".name"] ~= mac then
++ -- Rewrite state
++ uci:section("luci_splash_locations", "redirect", v[".name"], {
++ location = v.location
++ })
++ end
++ end
++ end
++ uci:save("luci_splash_redirects")
++end
+diff --git a/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splash.lua b/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splash.lua
+new file mode 100644
+index 0000000..c09d2e0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splash.lua
+@@ -0,0 +1,79 @@
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.model.uci")
++
++m = Map("luci_splash", translate("Client-Splash"), translate("Client-Splash is a hotspot authentification system for wireless mesh networks."))
++
++s = m:section(NamedSection, "general", "core", translate("General"))
++s.addremove = false
++
++s:option(Value, "leasetime", translate("Clearance time"), translate("Clients that have accepted the splash are allowed to use the network for that many hours."))
++local redir = s:option(Value, "redirect_url", translate("Redirect target"), translate("Clients are redirected to this page after they have accepted the splash. If this is left empty they are redirected to the page they had requested."))
++redir.rmempty = true
++
++s:option(Value, "limit_up", translate("Upload limit"), translate("Clients upload speed is limited to this value (kbyte/s)"))
++s:option(Value, "limit_down", translate("Download limit"), translate("Clients download speed is limited to this value (kbyte/s)"))
++
++s:option(DummyValue, "_tmp", "",
++ translate("Bandwidth limit for clients is only activated when both up- and download limit are set. " ..
++ "Use a value of 0 here to completely disable this limitation. Whitelisted clients are not limited."))
++
++s = m:section(TypedSection, "iface", translate("Interfaces"), translate("Interfaces that are used for Splash."))
++
++s.template = "cbi/tblsection"
++s.addremove = true
++s.anonymous = true
++
++local uci = luci.model.uci.cursor()
++
++zone = s:option(ListValue, "zone", translate("Firewall zone"),
++ translate("Splash rules are integrated in this firewall zone"))
++
++uci:foreach("firewall", "zone",
++ function (section)
++ zone:value(section.name)
++ end)
++
++iface = s:option(ListValue, "network", translate("Network"),
++ translate("Intercept client traffic on this Interface"))
++
++uci:foreach("network", "interface",
++ function (section)
++ if section[".name"] ~= "loopback" then
++ iface:value(section[".name"])
++ end
++ end)
++
++uci:foreach("network", "alias",
++ function (section)
++ iface:value(section[".name"])
++ end)
++
++
++s = m:section(TypedSection, "whitelist", translate("Whitelist"),
++ translate("MAC addresses of whitelisted clients. These do not need to accept the splash and are not bandwidth limited."))
++
++s.template = "cbi/tblsection"
++s.addremove = true
++s.anonymous = true
++s:option(Value, "mac", translate ("MAC Address"))
++
++
++s = m:section(TypedSection, "blacklist", translate("Blacklist"),
++ translate("MAC addresses in this list are blocked."))
++
++s.template = "cbi/tblsection"
++s.addremove = true
++s.anonymous = true
++s:option(Value, "mac", translate ("MAC Address"))
++
++s = m:section(TypedSection, "subnet", translate("Allowed hosts/subnets"),
++ translate("Destination hosts and networks that are excluded from splashing, i.e. they are always allowed."))
++
++s.template = "cbi/tblsection"
++s.addremove = true
++s.anonymous = true
++s:option(Value, "ipaddr", translate("IP Address"))
++s:option(Value, "netmask", translate("Netmask"), translate("optional when using host addresses")).rmempty = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splashtext.lua b/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splashtext.lua
+new file mode 100644
+index 0000000..8ceffc8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splashtext.lua
+@@ -0,0 +1,57 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2010 Manuel Munz <freifunk@somakoma.de>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++
++local splashtextfile = "/usr/lib/luci-splash/splashtext.html"
++local splashtextinclude = "/usr/lib/luci-splash/splashtextinclude.html"
++
++
++f = SimpleForm("splashtext", translate("Edit the complete splash text"),
++ translate("You can enter your own text that is displayed to clients here.<br />" ..
++ "It is possible to use the following markers: " ..
++ "###COMMUNITY###, ###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."))
++
++t = f:field(TextValue, "text")
++t.rmempty = true
++t.rows = 30
++function t.cfgvalue()
++ return fs.readfile(splashtextfile) or ""
++end
++
++function f.handle(self, state, data)
++ if state == FORM_VALID then
++ if data.text then
++ fs.writefile(splashtextfile, data.text:gsub("\r\n", "\n"))
++ else
++ fs.unlink(splashtextfile)
++ end
++ end
++ return true
++end
++
++g = SimpleForm("splashtextinclude", translate("Include your own text in the default splash"),
++ translate("As an alternative to editing the complete splash text you can also just include some custom text in the default splash page by entering it here."))
++
++t = g:field(TextValue, "text")
++t.rmempty = true
++t.rows = 30
++function t.cfgvalue()
++ return fs.readfile(splashtextinclude) or ""
++end
++
++function g.handle(self, state, data)
++ if state == FORM_VALID then
++ if data.text then
++ fs.writefile(splashtextinclude, data.text:gsub("\r\n", "\n"))
++ else
++ fs.unlink(splashtextinclude)
++ end
++ end
++ return true
++end
++
++
++return f, g
+diff --git a/feeds/luci/applications/luci-app-splash/luasrc/view/admin_status/splash.htm b/feeds/luci/applications/luci-app-splash/luasrc/view/admin_status/splash.htm
+new file mode 100644
+index 0000000..3415c20
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/luasrc/view/admin_status/splash.htm
+@@ -0,0 +1,288 @@
++<%#
++ Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%-
++
++local utl = require "luci.util"
++local ipt = require "luci.sys.iptparser".IptParser()
++local uci = require "luci.model.uci".cursor_state()
++local wat = require "luci.tools.webadmin"
++local ipc = require "luci.ip"
++local fs = require "nixio.fs"
++
++local clients = { }
++local leasetime = tonumber(uci:get("luci_splash", "general", "leasetime") or 1) * 60 * 60
++local leasefile = "/tmp/dhcp.leases"
++
++uci:foreach("dhcp", "dnsmasq",
++ function(s)
++ if s.leasefile then leasefile = s.leasefile end
++ end)
++
++
++uci:foreach("luci_splash_leases", "lease",
++ function(s)
++ if s.start and s.mac then
++ clients[s.mac:lower()] = {
++ start = tonumber(s.start),
++ limit = ( tonumber(s.start) + leasetime ),
++ mac = s.mac:upper(),
++ ipaddr = s.ipaddr,
++ policy = "normal",
++ packets = 0,
++ bytes = 0,
++ }
++ end
++ end)
++
++for _, r in ipairs(ipt:find({table="nat", chain="luci_splash_leases"})) do
++ if r.options and #r.options >= 2 and r.options[1] == "MAC" then
++ if not clients[r.options[2]:lower()] then
++ clients[r.options[2]:lower()] = {
++ start = 0,
++ limit = 0,
++ mac = r.options[2]:upper(),
++ policy = ( r.target == "RETURN" ) and "whitelist" or "blacklist",
++ packets = 0,
++ bytes = 0
++ }
++ end
++ end
++end
++
++for mac, client in pairs(clients) do
++ client.bytes_in = 0
++ client.bytes_out = 0
++ client.packets_in = 0
++ client.packets_out = 0
++
++ if client.ipaddr then
++ local rin = ipt:find({table="mangle", chain="luci_splash_mark_in", destination=client.ipaddr})
++ local rout = ipt:find({table="mangle", chain="luci_splash_mark_out", options={"MAC", client.mac:upper()}})
++
++ if rin and #rin > 0 then
++ client.bytes_in = rin[1].bytes
++ client.packets_in = rin[1].packets
++ end
++
++ if rout and #rout > 0 then
++ client.bytes_out = rout[1].bytes
++ client.packets_out = rout[1].packets
++ end
++ end
++end
++
++uci:foreach("luci_splash", "whitelist",
++ function(s)
++ if s.mac and clients[s.mac:lower()] then
++ clients[s.mac:lower()].policy="whitelist"
++ end
++ end)
++
++uci:foreach("luci_splash", "blacklist",
++ function(s)
++ if s.mac and clients[s.mac:lower()] then
++ clients[s.mac:lower()].policy=(s.kicked and "kicked" or "blacklist")
++ end
++ end)
++
++if fs.access(leasefile) then
++ for l in io.lines(leasefile) do
++ local time, mac, ip, name = l:match("^(%d+) (%S+) (%S+) (%S+)")
++ if time and mac and ip then
++ local c = clients[mac:lower()]
++ if c then
++ c.ip = ip
++ c.hostname = ( name ~= "*" ) and name or nil
++ end
++ end
++ end
++end
++
++for i, n in ipairs(ipc.neighbors({ family = 4 })) do
++ if n.mac and n.dest then
++ local c = clients[n.mac]
++ if c and not c.ip then
++ c.ip = n.dest:string()
++ end
++ end
++end
++
++local function showmac(mac)
++ if not is_admin then
++ mac = mac:gsub("(%S%S:%S%S):%S%S:%S%S:(%S%S:%S%S)", "%1:XX:XX:%2")
++ end
++ return mac
++end
++
++if luci.http.formvalue("status") == "1" then
++ local rv = {}
++ for _, c in utl.spairs(clients,
++ function(a,b) if clients[a].policy == clients[b].policy then
++ return (clients[a].start > clients[b].start)
++ else
++ return (clients[a].policy > clients[b].policy)
++ end
++ end)
++ do
++ if c.ip then
++ rv[#rv+1] = {
++ hostname = c.hostname or "?",
++ ip = c.ip or "?",
++ mac = showmac(c.mac) or "?",
++ timeleft = (c.limit >= os.time()) and wat.date_format(c.limit-os.time()) or (c.policy ~= "normal") and "-" or "expired",
++ trafficin = wat.byte_format(c.bytes_in) or "?",
++ trafficout = wat.byte_format(c.bytes_out) or "?",
++ policy = c.policy or "?"
++ }
++ end
++ end
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++ return
++end
++-%>
++
++
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++
++ XHR.poll(10 , '<%=REQUEST_URI%>', { status: 1 },
++ function(x, info)
++ {
++ var tbody = document.getElementById('splash_table');
++ if (tbody)
++ {
++ 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>'
++ };
++ 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">',
++ splash.hostname, splash.ip, splash.mac, splash.timeleft, splash.trafficin, splash.trafficout);
++
++ <% if is_admin then %>
++ s += String.format('<select name="policy.%s" style="width:200px">', splash.mac.toLowerCase());
++ if (splash.policy == 'whitelist') {
++ s += '<option value="whitelist" selected="selected"><%:whitelisted%></option>'
++ } else {
++ s += '<option value="whitelist"><%:whitelisted%></option>'
++ };
++ if (splash.policy == 'normal') {
++ s += '<option value="normal" selected="selected"><%:splashed%></option>';
++ s += '<option value="kicked"><%:temporarily blocked%></option>'
++ } else {
++ s += '<option value="normal"><%:splashed%></option>'
++ };
++ if (splash.policy == 'blacklist') {
++ s+= '<option value="blacklist" selected="selected"><%:blacklisted%></option>'
++ } else {
++ s += '<option value="blacklist"><%:blacklisted%></option>'
++ };
++ s += String.format(
++ '</select>' +
++ '<input type="submit" class="cbi-button cbi-button-save" name="save.%s" value="<%:Save%>" />',
++ splash.mac.toLowerCase());
++ <% else %>
++ s += String.format('%s', splash.policy);
++ <% end %>
++ s += '</td></tr>'
++ }
++ tbody.innerHTML = s;
++ }
++ }
++ );
++//]]></script>
++
++
++<div id="cbi-splash-leases" class="cbi-map">
++ <h2 name="content"><%:Client-Splash%></h2>
++ <fieldset id="cbi-table-table" class="cbi-section">
++ <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">
++
++ <%-
++ local count = 0
++ for _, c in utl.spairs(clients,
++ function(a,b)
++ if clients[a].policy == clients[b].policy then
++ return (clients[a].start > clients[b].start)
++ else
++ return (clients[a].policy > clients[b].policy)
++ end
++ end)
++ do
++ 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"><%=
++ (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">
++ <% if is_admin then %>
++ <select name="policy.<%=c.mac:lower()%>" style="width:200px">
++ <option value="whitelist"<%=c.policy=="whitelist" and ' selected="selected"'%>><%:whitelisted%></option>
++ <option value="normal"<%=c.policy=="normal" and not c.kicked and ' selected="selected"'%>><%:splashed%></option>
++ <option value="blacklist"<%=c.policy=="blacklist" and ' selected="selected"'%>><%:blacklisted%></option>
++ <% if c.policy == "normal" then -%>
++ <option value="kicked"><%:temporarily blocked%></option>
++ <%- end %>
++ </select>
++ <input type="submit" class="cbi-button cbi-button-save" name="save.<%=c.mac:lower()%>" value="<%:Save%>" />
++ <% else %>
++ <%=c.policy%>
++ <% end %>
++ </td>
++ </tr>
++ <%-
++ end
++ end
++ if count == 0 then
++ -%>
++ <tr class="cbi-section-table-row">
++ <td colspan="7" class="cbi-section-table-cell">
++ <br /><em><%:No clients connected%></em><br />
++ </td>
++ </tr>
++ <%- end -%>
++ </tbody>
++ </table>
++ <% if is_admin then %></form><% end %>
++ </div>
++ </fieldset>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-splash/luasrc/view/splash/blocked.htm b/feeds/luci/applications/luci-app-splash/luasrc/view/splash/blocked.htm
+new file mode 100644
+index 0000000..c27e2fa
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/luasrc/view/splash/blocked.htm
+@@ -0,0 +1,20 @@
++<%#
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++local contacturl = luci.dispatcher.build_url("freifunk", "contact")
++%>
++
++<%+header%>
++
++<h2 name="content"><%:Blocked%></h2>
++
++<p><%:Your access to this network has been blocked, most likely because you did something that our rules explicitly forbid.%></p>
++<p><%:To ask for the reason why you have been blocked or ask for access again you can try to contact the owner of this access point:%> <a href="<%=contacturl%>"><%:Contact%></a></p>
++
++<%+footer%>
++
++
++
+diff --git a/feeds/luci/applications/luci-app-splash/luasrc/view/splash/splash.htm b/feeds/luci/applications/luci-app-splash/luasrc/view/splash/splash.htm
+new file mode 100644
+index 0000000..8d84463
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/luasrc/view/splash/splash.htm
+@@ -0,0 +1,134 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++local fs = require "nixio.fs"
++local has_custom_splash = fs.access("/usr/lib/luci-splash/splashtext.html")
++local has_custom_splashinclude = fs.access("/usr/lib/luci-splash/splashtextinclude.html")
++
++function expand (e, R)
++ return (string.gsub(e, "###([A-Z_]+)###", R))
++end
++
++local community, homepage, leasetime, limit_up, limit_down
++
++local contacturl = luci.dispatcher.build_url("freifunk", "contact")
++
++local c = luci.model.uci.cursor():get_all("freifunk", "community")
++if c and c.name then
++ name = luci.model.uci.cursor():get('profile_' .. c.name, 'profile', 'name')
++ if name then
++ community = name
++ else
++ community = c.name
++ end
++else
++ community = "Freifunk"
++end
++
++if c and c.homepage then
++ homepage = c.homepage
++else
++ homepage = "http://freifunk.net"
++end
++
++local s = luci.model.uci.cursor():get_all("luci_splash", "general")
++if s then
++ leasetime = s.leasetime or ""
++ limit_up = s.limit_up or nil
++ limit_down = s.limit_down or nil
++end
++
++local limit_text = ""
++if limit_up and limit_down then
++ limit_text = "<p>" .. translate("Your bandwidth is limited to") .. " " .. limit_down .. "/" .. limit_up ..
++ " " .. translate("KB/s (Download/Upload). You may be able to remove this limit by actively contributing " ..
++ "to this project.") .. "</p>"
++end
++
++local contact = translate('Get in %s with the operator of this access point.')
++contact = contact % ('<a href="' .. contacturl .. '">' .. translatef('Contact') .. '</a>')
++
++local accepttext = translate('By accepting these rules you can use this network for %s hour(s). After this time you need to accept these rules again.')
++accepttext = accepttext % leasetime
++
++
++if has_custom_splash then
++ local R = {
++ COMMUNITY = community,
++ COMMUNITY_URL = homepage,
++ LEASETIME = leasetime,
++ ACCEPT = tostring(translate("Accept")),
++ LIMIT = limit_text,
++ CONTACTURL = contacturl
++ }
++ local splashtext = expand(fs.readfile("/usr/lib/luci-splash/splashtext.html"), R)
++ %>
++ <%=splashtext%>
++
++<% else %>
++
++ <h2 name="content"><%:Welcome%></h2>
++
++ <p><%:You are now connected to the free wireless mesh network%> <a href="<%=homepage%>"><%=community%></a>.
++ <%:Please note that we are not an internet service provider but an experimental community network.%></p>
++ <p><%:Access to the internet might be possible nevertheless, because some activists of this project share their
++ private internet connections. These few connections are shared between all users. That means available bandwidth
++ is limited and because of this we ask you not to do any of the following:%></p>
++ <ul>
++ <li><%:use filesharing applications on this network%></li>
++ <li><%:waste bandwidth with unneccesary downloads or streams%></li>
++ <li><%:perform any kind of illegal activities%></li>
++ </ul>
++ <br />
++
++ <% if limit_up and limit_down then %>
++ <%=limit_text%>
++ <% end %>
++
++ <p><%:If you use this network on a regular basis we ask for your support:%></p>
++ <ul>
++ <li><a href="<%=homepage%>"><%:Become an active member of this community and help by operating your own node%></a></li>
++ <li><%=contact%></li>
++ <li><%:Donate some money to help us keep this project alive.%></li>
++ <li><%:If you operate your own wifi equipment use channels different from ours.%></li>
++ </ul>
++
++ <%
++ if has_custom_splashinclude then
++ local splashtextinclude = fs.readfile("/usr/lib/luci-splash/splashtextinclude.html")
++ %>
++ <%=splashtextinclude%>
++ <% end %>
++
++ <h2><%:Usage Agreement%></h2>
++ <p>
++ <%:The open and free wireless network of volunteers ("Operators") provides the necessary equipment and Internet connections ("Infrastructure") at their own expense.%>
++ <%:These Terms of Use govern the use of the network by its participants' computer, PDA, or similar device ("Devices") within the network.%>
++ <%:Access to the network is not guaranteed. It can be interrupted at any time without notice for any reason, for certain devices, and/or may be blocked for certain users.%>
++ </p>
++
++ <h3><%:Legally Prohibited Activities%></h3>
++ <p><%:The participant agrees to not perform any action and refrain from acts which may violate the law or infringe upon the rights of third parties.%></p>
++
++ <h3><%:Legally Prohibited content%></h3>
++ <p><%:The participant agrees to not transfer content over the network which violates the law.%></p>
++
++ <h3><%:Fair Use Policy%></h3>
++ <p><%:The participant agrees to not use the network in any way which will harm the infrastructure, the network itself, its operators or other participants.%></p>
++
++ <h3><%:Safety%></h3>
++ <p><%:The network, like the Internet, is unencrypted and open. Each participant is responsible for the safety of their own connections and devices.%></p>
++
++ <h3>Disclaimer</h3>
++ <p><%:The operator claims no liability for loss of data, unauthorized access/damage to devices, or financial losses that participants may suffer from the use of the network.%></p>
++
++ <br /><p><b><%=accepttext%></b></p>
++<% end %>
++
++
++
+diff --git a/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/index.htm b/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/index.htm
+new file mode 100644
+index 0000000..cbf37d5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/index.htm
+@@ -0,0 +1,8 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<%+footer%>
+\ No newline at end of file
+diff --git a/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/splash.htm b/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/splash.htm
+new file mode 100644
+index 0000000..c63ad0f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/splash.htm
+@@ -0,0 +1,17 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<%+splash/splash%>
++
++<form method="get" action="<%=controller%>/splash/activate">
++ <p>
++ <input type="submit" value="<%:Decline%>" />
++ <input type="submit" name="accept" value="<%:Accept%>" />
++ </p>
++</form>
++
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-splash/po/ca/splash.po b/feeds/luci/applications/luci-app-splash/po/ca/splash.po
+new file mode 100644
+index 0000000..3afef1a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/ca/splash.po
+@@ -0,0 +1,330 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2014-06-01 23:10+0200\n"
++"PO-Revision-Date: 2014-07-02 21:20+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Accept"
++msgstr "Accepta"
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++"Accés a la xarxa no està garantit. Pot ser interromput en qualsevol moment "
++"sense notificació per qualsevol motiu, en certs dispositius, i pot ser "
++"bloquejat a certs usuaris."
++
++msgid "Active Clients"
++msgstr "Clients actius"
++
++msgid "Allowed hosts/subnets"
++msgstr "Hosts/subxarxes permets"
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr "Llista negra"
++
++msgid "Blocked"
++msgstr "Bloquejat"
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr "Declina"
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr "Dona una mica de diners per a ajudar-nos a mantenir aquest project viu."
++
++msgid "Download limit"
++msgstr "Límit de baixada"
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr "Política d'ús just"
++
++msgid "Firewall zone"
++msgstr "Zona de tallafocs"
++
++msgid "General"
++msgstr "General"
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr "Nom de host"
++
++msgid "IP Address"
++msgstr "Adreça IP"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++"Si opereu el vostre propi equip WiFi, utilitzeu canals distints dels "
++"nostres."
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr "Si utilitzeu aquesta xarxa regularment, us demanem el vostre suport:"
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr "Intercepta trànsit de clients en aquesta interfície"
++
++msgid "Interfaces"
++msgstr "Interfícies"
++
++msgid "Interfaces that are used for Splash."
++msgstr "interfícies que s'utilitzen pel Splash."
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr "Activitats legalment prohibits"
++
++msgid "Legally Prohibited content"
++msgstr "Contingut legalment prohibit"
++
++msgid "MAC Address"
++msgstr "Adreça MAC"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "Les adreces MAC en aquesta llista estan bloquejades."
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr "Màscara de xarxa"
++
++msgid "Network"
++msgstr "Xarxa"
++
++msgid "No clients connected"
++msgstr "Cap client connectat"
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++"Si us plau, noteu que no som proveïdor de servei de Internet sinó una xarxa "
++"comunitària experimental."
++
++msgid "Policy"
++msgstr "Política"
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr "Seguretat"
++
++msgid "Save"
++msgstr "Desa"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++"La xarxa, com a la Internet, no és xifrada i és oberta. Cada partícip és "
++"responsable de la seguretat dels seus propis connexions i dispositius."
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++"El partícip consent a no transferir contingut sobre la xarxa que violi la "
++"llei."
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++"El partícip consent a no utilitzar la xarxa de qualsevol manera que danyi la "
++"infraestructura, la xarxa en si, els seus operadors o altres partícips."
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++"Aquestes condicions d'ús governen l'ús de la xarxa pels ordinadors, "
++"organitzadors personals o dispositius similars (\"Dispositius\") dels seus "
++"partícips dins de la xarxa."
++
++msgid "Time remaining"
++msgstr "Temps restant"
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++"Per demanar el motiu perquè s'us ha bloquejat o per demanar l'accés de nou, "
++"podeu intentar contactar al propietari d'aquest punt d'accés:"
++
++msgid "Traffic in/out"
++msgstr "Trànsit entrant/sortint"
++
++msgid "Upload limit"
++msgstr "Límit de pujada"
++
++msgid "Usage Agreement"
++msgstr "Acord d'ús"
++
++msgid "Welcome"
++msgstr "Benvingut"
++
++msgid "Whitelist"
++msgstr "Llista blanca"
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr "Ja esteu connectat a la xarxa en malla sense fil gratis"
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++"Podeu introduir aquí el vostre propi text que es mostra als clients.<br />Es "
++"pot utilitzar els següents marcadors: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME### ###LIMIT### i ###ACCEPT###."
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++"S'us ha bloquejat el accés a aquesta xarxa, probablement perquè heu fet "
++"alguna cosa que les nostres regles explícitament prohibeixen."
++
++msgid "Your bandwidth is limited to"
++msgstr "La vostra amplada de banda està limitat a"
++
++msgid "blacklisted"
++msgstr "prohibit"
++
++msgid "expired"
++msgstr "caducat"
++
++msgid "optional when using host addresses"
++msgstr "opcional quan s'utilitza adreces de host"
++
++msgid "perform any kind of illegal activities"
++msgstr "realitza qualsevol tipus d'activitat il·legal"
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr "bloquejat temporalment"
++
++msgid "unknown"
++msgstr "desconegut"
++
++msgid "use filesharing applications on this network"
++msgstr "utilitza aplicacions de compartició de fitxers en aquesta xarxa"
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr "malgasta l'amplada de banda amb baixades o corrents innecessaris"
++
++msgid "whitelisted"
++msgstr "en llista blanca"
+diff --git a/feeds/luci/applications/luci-app-splash/po/cs/splash.po b/feeds/luci/applications/luci-app-splash/po/cs/splash.po
+new file mode 100644
+index 0000000..671afd7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/cs/splash.po
+@@ -0,0 +1,340 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-08-04 19:05+0200\n"
++"Last-Translator: KubaCZ <kuba.turek@centrum.cz>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Accept"
++msgstr "Přijmout"
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++"Přístup k Internetu může být možný, nicméně pouze proto, že někteří "
++"aktivisté tohoto projektu sdílí jejich soukromé Internetové připojení. "
++"Těchto několik spojení je sdíleno mezi všemi uživateli. Z toho plyne, že "
++"dostupná šířka pásma je omezená a z tohoto důvodu vás žádáme, abyste "
++"nedělali žádné z následujících věcí:"
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr "Aktivní klienti"
++
++msgid "Allowed hosts/subnets"
++msgstr "Povolení hostitelé/podsítě"
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++"Kromě možnosti vytvořit celý vlastní text místo textu výše také můžete jen "
++"jako doplněk připojit svůj text jeho napsáním sem."
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++"Limit šířky pásma pro klienty je aktivován pouze v případě, že oba limity "
++"(upload a download) jsou nastaveny. Hodnotou 0 úplně vypnete toto omezení. "
++"Klienti na whitelistu nejsou omezeni."
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++"Staňte se aktivním Älenem této komunity a pÅ™ispÄ›jte provozováním vlastního "
++"uzlu"
++
++msgid "Blacklist"
++msgstr "Blacklist"
++
++msgid "Blocked"
++msgstr "Zablokovaný"
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++#, fuzzy
++msgid "Client-Splash"
++msgstr "Client-Splash"
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr "Rychlost stahování je pro klienty omezena na tuto hodnotu (kbyte/s)"
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr "Rychlost nahrávání je pro klienty omezena na tuto hodnotu (kbyte/s)"
++
++msgid "Contact"
++msgstr "Kontakt"
++
++msgid "Decline"
++msgstr "Odmítnout"
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr "Darováním peněz nám pomůžete udržet tento projekt naživu"
++
++msgid "Download limit"
++msgstr "Limit stahování"
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr "Fair Use Policy"
++
++msgid "Firewall zone"
++msgstr "Zóna firewallu"
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "IP Address"
++msgstr "IP adresa"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Rozhraní"
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++"KB/s (Stahování/Nahrávání). Aktivním přispíváním tomuto projektu můžete moci "
++"odebrat tento limit."
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr "MAC adresa"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "MAC adresy v tomto seznamu jsou blokovány"
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++"Mac adresy klientů na whitelistu. Tito nemusí přijímat splash a nejsou "
++"omezeni šířkou pásma."
++
++msgid "Netmask"
++msgstr "Síťová maska"
++
++msgid "Network"
++msgstr "Síť"
++
++msgid "No clients connected"
++msgstr "Žádní klienti nejsou připojeni"
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++"Vezměte prosím na vědomí, že nejsme žádní ISP, ale experimentální komunitní "
++"síť."
++
++msgid "Policy"
++msgstr "Politika"
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr "BezpeÄnost"
++
++msgid "Save"
++msgstr "Uložit"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr "Zbývající Äas"
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++"Pokud se chcete zeptat, proÄ jste byli zablokováni nebo jak získat zpÄ›t "
++"přístup, můžete se pokusit kontaktovat vlastníka tohoto přístupového bodu:"
++
++msgid "Traffic in/out"
++msgstr "Provoz dovnitÅ™/ven"
++
++msgid "Upload limit"
++msgstr "Limit nahrávání"
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr "Vítejte"
++
++msgid "Whitelist"
++msgstr "Whitelist"
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++"Sem můžete vložit text, který se zobrazí klientům.<br />Můžete použít tyto "
++"znaÄky: ###COMMUNITY###, ###COMMUNITY_URL###, ###CONTACTURL###, "
++"###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++"Váš přístup do této sítě byl zablokován, nejspíše jste udělal něco, co naše "
++"pravidla výslovně zakazují."
++
++msgid "Your bandwidth is limited to"
++msgstr "Vaše šířka pásma je omezena na"
++
++msgid "blacklisted"
++msgstr "na Äerné listinÄ›"
++
++msgid "expired"
++msgstr "prošlý"
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr "provádÄ›t nÄ›jaký z druhů nelegálních Äinností"
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr "doÄasnÄ› zablokován"
++
++msgid "unknown"
++msgstr "neznámý"
++
++msgid "use filesharing applications on this network"
++msgstr "používat aplikace na sdílení souborů v této síti"
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr "plýtvat šířkou pásma nepotřebným stahováním nebo streamy"
++
++msgid "whitelisted"
++msgstr "na bílé listině"
++
++#~ msgid "By accepting these rules you can use this network for"
++#~ msgstr "PÅ™ijmutím tÄ›chto pravidel můžete zaÄít používat tuto síť pro"
++
++#~ msgid "hour(s). After this time you need to accept these rules again."
++#~ msgstr "hodin. Po uplynutí této doby musíte přijmout pravidla znovu."
++
++#~ msgid "the owner of this access point."
++#~ msgstr "vlastník tohoto přístupového bodu."
+diff --git a/feeds/luci/applications/luci-app-splash/po/de/splash.po b/feeds/luci/applications/luci-app-splash/po/de/splash.po
+new file mode 100644
+index 0000000..8b1cd9a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/de/splash.po
+@@ -0,0 +1,383 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: \n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2013-08-19 13:53+0200\n"
++"Last-Translator: Manuel <freifunk@somakoma.de>\n"
++"Language-Team: \n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Accept"
++msgstr "Akzeptieren"
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++"Zugang zum Internet ist unter Umständen dennoch möglich, da einige "
++"Teilnehmer dieses Netzes ihren eigenen Internetzugang teilen. Da alle Nutzer "
++"sich diese wenigen Zugänge teilen müssen bitten wir darum, folgende "
++"Aktivitäten zu unterlassen:"
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++"Der Zugang zum Netzwerk wird nicht garantiert. Er kann jederzeit und ohne "
++"Angabe von Gründen unterbrochen oder für bestimmte Endgeräte und Teilnehmer "
++"gesperrt werden."
++
++msgid "Active Clients"
++msgstr "verbundene Clients"
++
++msgid "Allowed hosts/subnets"
++msgstr "Erlaubte Rechner/Netzwerke"
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++"Als Alternative zum Bearbeiten des kompletten Splash-Textes (oben) kann auch "
++"nur eigener Text in die Default-Splashseite eingebunden werden. Dazu im "
++"folgenden Feld den eigenen Text eingeben."
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++"Die Bandbreitenlimitierung für Clients wird nur aktiviert, wenn sowohl für "
++"Up- als auch für Download Limits eingegeben wurden. Ein Wert von 0 "
++"deaktiviert die Bandbreitenbeschränkung komplett. Rechner/Netze aus der "
++"Whitelist werden nicht limitiert."
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++"Werde ein aktives Mitglied unserer Community und hilf, indem du selber einen "
++"Access Point betreibst."
++
++msgid "Blacklist"
++msgstr "Blacklist "
++
++msgid "Blocked"
++msgstr "Gesperrt"
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++"Durch das Akzeptieren dieser Regeln kannst du unser Netzwerk für %s Stunde"
++"(n) benutzen. Danach wirst du aufgefordert diese Bedingungen erneut zu "
++"akzeptieren."
++
++msgid "Clearance time"
++msgstr "Freigabezeit"
++
++msgid "Client-Splash"
++msgstr "Client-Splash"
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++"Client-Splash ist ein Hotspot-Authentifizierungssystem für Freifunk und "
++"andere Meshnetzwerke."
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++"Wird hier eine URL angegeben dann werden Clients zu dieser Seite "
++"weitergeleitet nachdem sie die Nutzungsbedingungen akzeptiert haben. Wird "
++"keine URL angegeben dann werden Clients zu der ursprünglich angeforderten "
++"Seite weitergeleitet."
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++"Downloadgeschwindigkeit von Clients auf diesen Wert limitieren (kbyte/s) "
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++"Clients die den Splash akzeptiert haben dürfen das Netzwerk für so viele "
++"Stunden benutzen."
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++"Uploadgeschwindigkeit von Clients auf diesen Wert limitieren (kbyte/s) "
++
++msgid "Contact"
++msgstr "Kontakt"
++
++msgid "Decline"
++msgstr "Ablehnen"
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++"Ziel-Rechner und Ziel-Netzwerke die hier aufgeführt sind werden vom "
++"Splashvorgang ausgenommen, d.h. sie können von Clients immer und ohne "
++"Authentifizierung erreicht werden."
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++"Hilf durch eine Spende dieses Projekt aufrechzuerhalten oder weiter "
++"auszubauen."
++
++msgid "Download limit"
++msgstr "Downloadbegrenzung"
++
++msgid "Edit the complete splash text"
++msgstr "Bearbeiten des kompletten Splash-Textes."
++
++msgid "Fair Use Policy"
++msgstr "Fair Use Policy"
++
++msgid "Firewall zone"
++msgstr "Firewallzone"
++
++msgid "General"
++msgstr "Allgemein"
++
++msgid "Get in %s with the operator of this access point."
++msgstr "Nimm %s mit dem Betreiber dieses Access Points auf."
++
++msgid "Hostname"
++msgstr "Rechnername"
++
++msgid "IP Address"
++msgstr "IP-Adresse"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr "Betreibe deine eigenen WLAN-Geräte auf anderen Kanälen als wir."
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr "Wenn du unser Netzwerk regelmässig benutzt dann hilf uns bitte, z.B.:"
++
++msgid "Include your own text in the default splash"
++msgstr "Einbinden von eigenem Text in die Default-Splashseite"
++
++msgid "Intercept client traffic on this Interface"
++msgstr "Clientverkehr auf dieser Schnittstelle abfangen"
++
++msgid "Interfaces"
++msgstr "Schnittstellen"
++
++msgid "Interfaces that are used for Splash."
++msgstr "Schnittstellen die für Splash benutzt werden."
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++"KB/s (Download/Upload). Durch die aktive Teilnahme an unserem Netzwerks "
++"kannst du dieses Bandbreitenlimit deaktivieren."
++
++msgid "Legally Prohibited Activities"
++msgstr "Verbotene Handlungen"
++
++msgid "Legally Prohibited content"
++msgstr "Verbotene Inhalte"
++
++msgid "MAC Address"
++msgstr "MAC-Adresse"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "MAC-Adressen in dieser Liste werden geblockt."
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++"MAC-Adressen von Clients in der Whitelist. Diese müssen den Splash nicht "
++"akzeptieren und unterliegen keinen Bandbreitenbegrenzungen."
++
++msgid "Netmask"
++msgstr "Netzmaske"
++
++msgid "Network"
++msgstr "Netzwerk"
++
++msgid "No clients connected"
++msgstr "Keine Clients verbunden."
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++"Bitte sei dir darüber bewusst, dass wir kein Internetanbieter sondern ein "
++"experimentelles Gemeinschaftsnetzwerk sind."
++
++msgid "Policy"
++msgstr "Richtlinie"
++
++msgid "Redirect target"
++msgstr "Ziel für Weiterleitung"
++
++msgid "Safety"
++msgstr "Sicherheit"
++
++msgid "Save"
++msgstr "Speichern"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr "Splashregeln werden in diese Firewallzone eingegliedert"
++
++msgid "Splashtext"
++msgstr "Splash-Text"
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++"Das Netzwerk ist, wie das Internet auch, unverschlüsselt und offen. Jeder "
++"Teilnehmer ist selbst für die Sicherheit seiner Verbindungen und seiner "
++"Endgeräte verantwortlich."
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++"Das offene und freie drahtlose Netzwerk wird von Freiwilligen betrieben "
++"(\"Betreiber\"), die die nötigen Geräte und Internet-Anschlüsse "
++"(\"Infrastruktur\") auf eigene Kosten zur Verfügung stellen."
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++"Die Betreiber lehnen jede Haftung für Datenverlust, unbefugten Zugriff auf "
++"Endgeräte, Schäden an Endgeräten oder finanzielle Verluste, die ein "
++"Teilnehmer durch die Nutzung des Netzwerks erleidet ab."
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++"Der Teilnehmer verpflichtet sich, keine Handlungen vorzunehmen bzw. "
++"Handlungen zu unterlassen, welche gesetzliche Bestimmungen oder die Rechte "
++"Dritter verletzen."
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++"Der Teilnehmer verpflichtet sich, keine Inhalte über das Netzwerk zu "
++"übertragen, welche gegen geltendes Recht verstoßen."
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++"Der Teilnehmer verpflichtet sich, das Netzwerk nicht in einer Weise zu "
++"beanspruchen, welche die Infrastruktur, das Netzwerk selbst, dessen "
++"Betreiber oder andere Teilnehmer beeinträchtigt."
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++"Diese Nutzungsbestimmungen regeln die Inanspruchnahme des Netzwerks durch "
++"die Teilnehmer, welche sich mittels Computer, Handheld o.ä (\"Endgerät\") "
++"mit dem Netzwerk verbinden."
++
++msgid "Time remaining"
++msgstr "Verbleibende Zeit"
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++"Um nach dem Grund der Sperrung zu fragen oder um deren Aufhebung zu bitten "
++"wende dich an den Administrator dieses Access Points:"
++
++msgid "Traffic in/out"
++msgstr "Ein-/Ausgehender Verkehr"
++
++msgid "Upload limit"
++msgstr "Upload-Begrenzung"
++
++msgid "Usage Agreement"
++msgstr "Nutzungsbestimmungen"
++
++msgid "Welcome"
++msgstr "Willkommen"
++
++msgid "Whitelist"
++msgstr "Whitelist"
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr "Du bist jetzt verbunden mit dem freien Funknetzwerk"
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++"Hier kann ein eigener Text eingegeben werden, der Clients angezeigt wird."
++"<br />Folgende Marker können dabei verwendet werden: ###COMMUNITY###, "
++"###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### und "
++"###ACCEPT###."
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++"Der Zugang zu diesem Netzwerk wurde vom Administrator blockiert. Das kann "
++"verschiedene Gründe haben, sehr wahrscheinlich hast du jedoch die Regeln "
++"dieses Netzwerks nicht beachtet und dadurch Probleme verursacht."
++
++msgid "Your bandwidth is limited to"
++msgstr "Deine Bandbreite ist limitiert auf"
++
++msgid "blacklisted"
++msgstr "gesperrt"
++
++msgid "expired"
++msgstr "abgelaufen"
++
++msgid "optional when using host addresses"
++msgstr "Die Angabe ist optional wenn nur einzelne Rechner/IPs verwendet werden"
++
++msgid "perform any kind of illegal activities"
++msgstr "Illegale Aktivitäten"
++
++msgid "splashed"
++msgstr "gesplasht"
++
++msgid "temporarily blocked"
++msgstr "Vorübergehend geblockt"
++
++msgid "unknown"
++msgstr "Unbekannt"
++
++msgid "use filesharing applications on this network"
++msgstr "Filesharing betreiben"
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr "Bandbreite durch unnötige Downloads oder Streams zu verschwenden."
++
++msgid "whitelisted"
++msgstr "erlaubt"
++
++#~ msgid ""
++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. "
++#~ "they are always allowed."
++#~ msgstr ""
++#~ "Rechner und Netzwerke die hier aufgeführt sind werden vom Splashvorgang "
++#~ "ausgenommen, d.h. sie dürfen das Netzwerk immer und ohne Authentifizierung "
++#~ "benutzen."
+diff --git a/feeds/luci/applications/luci-app-splash/po/el/splash.po b/feeds/luci/applications/luci-app-splash/po/el/splash.po
+new file mode 100644
+index 0000000..df90478
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/el/splash.po
+@@ -0,0 +1,307 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-03-18 15:31+0200\n"
++"PO-Revision-Date: 2012-03-18 15:31+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr "ΔιεÏθυνση IP"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Διεπαφές"
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr "ΔιεÏθυνση MAC"
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr "Δίκτυο"
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr "Αποθήκευση"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/en/splash.po b/feeds/luci/applications/luci-app-splash/po/en/splash.po
+new file mode 100644
+index 0000000..615be16
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/en/splash.po
+@@ -0,0 +1,292 @@
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/es/splash.po b/feeds/luci/applications/luci-app-splash/po/es/splash.po
+new file mode 100644
+index 0000000..836352e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/es/splash.po
+@@ -0,0 +1,376 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-08-24 18:30+0200\n"
++"PO-Revision-Date: 2014-06-15 13:17+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Accept"
++msgstr "Aceptar"
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++"El acceso a internet puede ser posible, sin embargo, porque otros miembros "
++"del proyecto comparten sus conexiones a internet privadas y estas pocas "
++"conexiones se comparten entre todos los usuarios. Por este motivo el ancho "
++"de banda está limitado y le pedimos que no haga:"
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++"No se puede garantizar el acceso a la red. Podría interrumpirse en cualquier "
++"momento, sin aviso y por cualquier motivo, para ciertos dispositivos y/o es "
++"posible bloquearlo para ciertos usuarios."
++
++msgid "Active Clients"
++msgstr "Clientes activos"
++
++msgid "Allowed hosts/subnets"
++msgstr "Máquinas y subredes permitidas"
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++"En vez de editar el splash entero puede introducir aquí un texto que se "
++"mostrará en el splash por defecto."
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++"La limitación de ancho de banda sólo se activa cuando se establecen tanto el "
++"límite de subida como el de bajada. Ponga 0 para desactivarla. A los "
++"clientes en lista blanca no se les limita."
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++"Conviértase en un miembro activo de esta comunidad y ayude gestionando su "
++"propio nodo"
++
++msgid "Blacklist"
++msgstr "Lista negra"
++
++msgid "Blocked"
++msgstr "Bloqueado"
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++"Aceptar estas reglas le permite usar esta red durante %s hora(s). Tras este "
++"tiempo tendrá que aceptarlas de nuevo."
++
++msgid "Clearance time"
++msgstr "Tiempo de autorización"
++
++msgid "Client-Splash"
++msgstr "Cliente-Splash"
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr "Cliente-Splash es un sistema de autentificación para redes mesh."
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++"Se redirigirá a los clientes a esta página tras haber aceptado el splash. Si "
++"se deja vacío se les redirigirá a la página que habían pedido."
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr "La velocidad de descarga de los clientes está limitada a (Kbytes/s)"
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++"Horas a las que se permitirá usar la red a los clientes que acepten la "
++"presentación."
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr "La velocidad de subida de los clientes está limitada a (Kbytes/s)"
++
++msgid "Contact"
++msgstr "Contacto"
++
++msgid "Decline"
++msgstr "Rechazar"
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++"Redes y hosts destino excluidos de splash, es decir, que siempre son "
++"admitidos."
++
++msgid "Donate some money to help us keep this project alive."
++msgstr "Haga una aportación para ayudarnos a mantener este proyecto vivo."
++
++msgid "Download limit"
++msgstr "Límite de descarga"
++
++msgid "Edit the complete splash text"
++msgstr "Editar el texto completo del splash"
++
++msgid "Fair Use Policy"
++msgstr "Política de uso adecuado"
++
++msgid "Firewall zone"
++msgstr "Zona del cortafuegos"
++
++msgid "General"
++msgstr "General"
++
++msgid "Get in %s with the operator of this access point."
++msgstr "Conecte %s con el operador de este punto de acceso."
++
++msgid "Hostname"
++msgstr "Nombre de máquina"
++
++msgid "IP Address"
++msgstr "Dirección IP"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr "Si maneja su propio wi-fi use canales diferentes de los nuestros."
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr "Si es usuario habitual de esta red le pedimos apoyo:"
++
++msgid "Include your own text in the default splash"
++msgstr "Incluir su propio texto en el splash por defecto"
++
++msgid "Intercept client traffic on this Interface"
++msgstr "Interceptar el tráfico cliente en esta interfaz"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interfaces that are used for Splash."
++msgstr "Interfaces usados para Splash."
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++"KB/s (Descarga/Subida). Puede evitar este límite contribuyendo activamente a "
++"este proyecto."
++
++msgid "Legally Prohibited Activities"
++msgstr "Actividades prohibidas por ley"
++
++msgid "Legally Prohibited content"
++msgstr "Contenido prohibido por ley"
++
++msgid "MAC Address"
++msgstr "Dirección MAC"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "Direcciones MAC bloqueadas."
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++"Direcciones MAC de clientes en lista blanca. Estos no tendrán que aceptar la "
++"presentación ni tendrán limitado el ancho de banda."
++
++msgid "Netmask"
++msgstr "Máscara de red"
++
++msgid "Network"
++msgstr "Red"
++
++msgid "No clients connected"
++msgstr "Sin clientes conectados"
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++"Tenga presente que no somos un proveedor de acceso a internet sino una red "
++"comunitaria experimental."
++
++msgid "Policy"
++msgstr "Politica"
++
++msgid "Redirect target"
++msgstr "Redirige objetivo"
++
++msgid "Safety"
++msgstr "Seguridad"
++
++msgid "Save"
++msgstr "Guardar"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr "Zona del cortafuegos en la que está integradas las reglas del Splash"
++
++msgid "Splashtext"
++msgstr "Mensaje de presentación"
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++"La red, como internet, no está encriptada y es abierta. Cada participante es "
++"responsable de la seguridad de sus propias conexiones y dispositivos."
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++"La red abierta y libre de voluntarios (\"operadores\") proporciona el equipo "
++"necesario y conexiones a internet (\"infraestructura\") de su propio "
++"bolsillo."
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++"El operador no será responsable por la pérdida de datos, acceso/daño no "
++"autorizado a dispositivos o pérdidas financieras que los participantes "
++"pudiesen incurrir por el uso de la red."
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++"El participante acepta no llevar a cabo ninguna acción y evitará acciones "
++"que pudiese violar las leyes o infringir los derechos de terceros."
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++"El participante acepta no transferir contenido que viole la ley por la red."
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++"El participante acepta no usar la red de ninguna manera que dañe la "
++"infraestructura, la propia red, sus operadores u otros participantes."
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++"Estos términos cubren el uso de la red por los ordenadores de sus "
++"participantes, PDAs o dispositivos similares."
++
++msgid "Time remaining"
++msgstr "Tiempo restante"
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++"Para preguntar porqué se le ha bloqueado o pedir acceso de nuevo intente "
++"contactar con el propietario de este punto de acceso:"
++
++msgid "Traffic in/out"
++msgstr "Tráfico entrante/saliente"
++
++msgid "Upload limit"
++msgstr "Límite de subida"
++
++msgid "Usage Agreement"
++msgstr "Acuerdo de uso"
++
++msgid "Welcome"
++msgstr "Bienvenido"
++
++msgid "Whitelist"
++msgstr "Lista blanca"
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr "Se ha conectado a la red libre mesh inalámbrica"
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++"Introduzca aquí el texto que se mostrará a los clientes.<br />Es posible "
++"usar las siguientes etiquetas: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### y ###ACCEPT###."
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++"Se le ha bloqueado el acceso a esta red, probablemente porque hizo algo "
++"prohibido explícitamente en sus reglas."
++
++msgid "Your bandwidth is limited to"
++msgstr "Su ancho de banda está limitado a"
++
++msgid "blacklisted"
++msgstr "en lista negra"
++
++msgid "expired"
++msgstr "caducado"
++
++msgid "optional when using host addresses"
++msgstr "opcional si usa direcciones de máquina"
++
++msgid "perform any kind of illegal activities"
++msgstr "llevar a cabo cualquier tipo de actividades ilegales"
++
++msgid "splashed"
++msgstr "Recibido"
++
++msgid "temporarily blocked"
++msgstr "bloqueado temporalmente"
++
++msgid "unknown"
++msgstr "desconocido"
++
++msgid "use filesharing applications on this network"
++msgstr "usar aplicaciones de compartición de ficheros en esta red"
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr "malgastar ancho de banda con descargas innecesarias o multimedia"
++
++msgid "whitelisted"
++msgstr "en lista blanca"
++
++#~ msgid ""
++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. "
++#~ "they are always allowed."
++#~ msgstr ""
++#~ "A estas máquinas y redes no se les mostrará la presentación y siempre serán "
++#~ "bienvenidas."
++
++#~ msgid "By accepting these rules you can use this network for"
++#~ msgstr "Si acepta estas reglas pordrá usar esta red para"
++
++#~ msgid "Edit Splash text"
++#~ msgstr "Editar la página de bienvenida"
++
++#~ msgid "hour(s). After this time you need to accept these rules again."
++#~ msgstr "hora/horas. Tras este tiempo deberá aceptar las reglas de nuevo."
++
++#~ msgid "the owner of this access point."
++#~ msgstr "el propietario de este punto de acceso."
+diff --git a/feeds/luci/applications/luci-app-splash/po/fr/splash.po b/feeds/luci/applications/luci-app-splash/po/fr/splash.po
+new file mode 100644
+index 0000000..e525ab3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/fr/splash.po
+@@ -0,0 +1,337 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: \n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: \n"
++"Last-Translator: Manuel Munz <freifunk@somakoma.de>\n"
++"Language-Team: \n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Accept"
++msgstr "Accepter"
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr "Clients actifs"
++
++msgid "Allowed hosts/subnets"
++msgstr "Hôtes/sous-réseaux autorisés"
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++"La limitation de bande-passante des clients est activée seulement quand les "
++"limites montante et descendante sont données. Utilisez ici une valeur de 0 "
++"pour complètement désactiver cette limitation. Les clients autorisés (liste-"
++"blanche) ne sont pas limités."
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr "interdire (liste-noire)"
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr "Durée d'autorisation"
++
++msgid "Client-Splash"
++msgstr "Client-Splash"
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++"Client-Splash est un système d'authentification de HotSpot pour des réseaux "
++"sans-fil maillés."
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++"La vitesse de téléchargement des clients est limitée à cette valeur (en ko/s)"
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++"Les clients qui auront passé la page d'accueil seront autorisés à utiliser "
++"le réseau pendant ce nombre d'heures donné."
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr "La vitesse montante des clients sera limitée à cette valeur (en ko/s)"
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr "Refuser"
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr "Limite en télé-chargement"
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr "Zone du pare-feu"
++
++msgid "General"
++msgstr "Général"
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr "Hôte"
++
++msgid "IP Address"
++msgstr "Adresse IP"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr "Intercepter le trafic-client sur cette interface"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interfaces that are used for Splash."
++msgstr "Interfaces utilisés pour l'accueil."
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr "Adresse MAC"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "Les adresses MAC de cette liste sont bloquées."
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++"Adresses MAC des clients autorisés d'office. Ils n'ont pas à accepter la "
++"page d'accueil et ne sont pas limités en bande-passante."
++
++msgid "Netmask"
++msgstr "Masque"
++
++msgid "Network"
++msgstr "Réseau"
++
++msgid "No clients connected"
++msgstr "Aucun client connecté"
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr "Politique"
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr "Sauvegarder"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr "Les règles du HotSpot sont intégrés dans cette zone du pare-feu"
++
++msgid "Splashtext"
++msgstr "Texte de la page d'accueil"
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr "Temps restant"
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr "Trafic entrant/sortant"
++
++msgid "Upload limit"
++msgstr "Limite du trafic montant"
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr "Liste-blanche"
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr "interdit (par liste-noire)"
++
++msgid "expired"
++msgstr "terminé"
++
++msgid "optional when using host addresses"
++msgstr "optionnel quand on utilise des adresses d'hôtes"
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr "À l'accueil"
++
++msgid "temporarily blocked"
++msgstr "bloqué(s) temporairement"
++
++msgid "unknown"
++msgstr "inconnu"
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr "autorisés par liste blanche"
++
++#~ msgid ""
++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. "
++#~ "they are always allowed."
++#~ msgstr ""
++#~ "Les hôtes et réseaux listés ici sont exclus de l'accueil du HotSpot, ils ne "
++#~ "seront jamais autorisés."
++
++#~ msgid "Edit Splash text"
++#~ msgstr "Modifier le texte de la page d'accueil"
++
++#~ msgid ""
++#~ "You can change the text that is displayed to clients here.<br /> It is "
++#~ "possible to use the following markers: ###COMMUNITY###, "
++#~ "###COMMUNITY_URL###, ###LEASETIME### and ###ACCEPT###.<br />Click here to "
++#~ "<a href='/luci/splash/'>test the splash page</a> after you saved it."
++#~ msgstr ""
++#~ "Vous pouvez changer ici le texte qui sera présenté aux clients.<br /> Il "
++#~ "est possible d'y inclure les marqueurs suivants : ###COMMUNITY###, "
++#~ "###COMMUNITY_URL###, ###LEASETIME### et ###ACCEPT###.<br />Cliquez ici <a "
++#~ "href=\\'/luci/splash/\\'>tester la page d'accueil</a> une fois celle-ci "
++#~ "sauvegardée."
+diff --git a/feeds/luci/applications/luci-app-splash/po/he/splash.po b/feeds/luci/applications/luci-app-splash/po/he/splash.po
+new file mode 100644
+index 0000000..bf7e2f0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/he/splash.po
+@@ -0,0 +1,325 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-09-10 04:38+0200\n"
++"PO-Revision-Date: 2012-09-10 04:58+0200\n"
++"Last-Translator: Snoof <sagim9@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++"החיבור ל×ינטרנט יכול להת×פשר בגלל שכמה ×¤×¢×™×œ×™× ×©×œ הפרוייקט ×ž×©×ª×¤×™× ×ת חיבור "
++"×”×ינטרנט ×”×ישי שלה×. ××•×ª× ×—×™×‘×•×¨×™× ×ž×¢×˜×™× ×ž×©×•×ª×¤×™× ×‘×™×Ÿ כל המשתמשי×. משמע רוחב "
++"הפס הזמין מוגבל ולכן ×נו ×ž×‘×§×©×™× ×ž×›× ×œ× ×œ×¢×©×•×ª ×ת ×”×“×‘×¨×™× ×”×‘××™×:"
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr "הפוך לחבר פעיל של הקהילה ועזור ע\"י תפעול נקודה של עצמך"
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr "חסומי×"
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr "דחה"
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr "×ª×¨×•× ×›×¡×£ על מנת שנוכל לשמור על הפרוייקט ×”×–×” ×—×™."
++
++msgid "Download limit"
++msgstr "הגבלת הורדה"
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr "כללי"
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr "כתובת IP"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr "×× ×”× ×š מפעיל מכשירי wifi של עצמך השתמש ×‘×¢×¨×•×¦×™× ×©×•× ×™× ×ž×©×œ× ×•."
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr "×× ×”× ×š משתמש ברשת זו על בסיס קבוע ×נו ×ž×‘×§×©×™× ×ת תמיכתך:"
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "ממשקי×"
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++"KB/s (הורדה/העל××”). הנך יכול להוריד מגבלה זו ×¢\"×™ תרומה פעילה לפרוייקט ×–×”."
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr "כתובת MAC"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "כתובות MAC ברשימה זו ×”×™× × ×—×¡×•×ž×™×."
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr "רשת"
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr "×©×™× ×œ×‘ ש×נו ×œ× ×¡×¤×§ ×ינטרנט ××œ× ×¨×©×ª חברתית נסיונית."
++
++msgid "Policy"
++msgstr "מדיניות"
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr "שמור"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr "זמן שנותר"
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++"על מנת לש×ול לסיבה שבגגלה נחסמת ×ו לבקש גישה מחדש הנך יכול לנסות ליצור קשר "
++"×¢× ×”×‘×¢×œ×™× ×©×œ נקודת גישה זו:"
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr "הגבלת העל××”"
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr "×‘×¨×•×›×™× ×”×‘××™×"
++
++msgid "Whitelist"
++msgstr ""
++
++#, fuzzy
++msgid "You are now connected to the free wireless mesh network"
++msgstr "הנך מחובר כעת לרשת ×”×לחוטית החינמית"
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++"הגישה שלך לרשת זו נחסמה, ככל הנר××” בגלל שעשית משהו ×©×”×—×•×§×™× ×©×œ× ×• ××•×¡×¨×™× "
++"במפורש."
++
++msgid "Your bandwidth is limited to"
++msgstr "רוחב הפס שלך מוגבל ל"
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr "פג תוקף"
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr "בצע פעילות בלתי חוקית מכל סוג שהו×"
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr "×—×¡×•× ×–×ž× ×™×ª"
++
++msgid "unknown"
++msgstr "×œ× ×™×“×•×¢"
++
++msgid "use filesharing applications on this network"
++msgstr "השתמש בתוכנות לשיתוף ×§×‘×¦×™× ×‘×¨×©×ª זו."
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr "לבזבז רוחב פס ×¢× ×”×•×¨×“×•×ª ×ו ×©×™×“×•×¨×™× ×ž×™×•×ª×¨×™×"
++
++msgid "whitelisted"
++msgstr ""
++
++#~ msgid "By accepting these rules you can use this network for"
++#~ msgstr "×¢\"×™ הסכמתך ×œ×—×•×§×™× ×”×לו הנך יכול להשתמש ברשת זו בשביל"
++
++#~ msgid "hour(s). After this time you need to accept these rules again."
++#~ msgstr "שעה(ות). ל×חר זמן ×–×” תצטרך לקבל ×ת ×”×—×•×§×™× ×”×לו שוב."
++
++#~ msgid "the owner of this access point."
++#~ msgstr "×”×‘×¢×œ×™× ×©×œ נקודת גישה זו."
+diff --git a/feeds/luci/applications/luci-app-splash/po/hu/splash.po b/feeds/luci/applications/luci-app-splash/po/hu/splash.po
+new file mode 100644
+index 0000000..f2c7da1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/hu/splash.po
+@@ -0,0 +1,303 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/it/splash.po b/feeds/luci/applications/luci-app-splash/po/it/splash.po
+new file mode 100644
+index 0000000..8964b6c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/it/splash.po
+@@ -0,0 +1,361 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-02-10 18:43+0200\n"
++"PO-Revision-Date: 2013-02-10 19:08+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Accept"
++msgstr "Accetta"
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++"L'accesso a Internet potrebbe essere possibile, perché alcuni attivisti di "
++"questo progetto condividono le loro connessioni internet private​​. Queste "
++"poche connessioni sono condivise tra tutti gli utenti. Ciò significa che la "
++"larghezza di banda a disposizione è limitato e per questo vi chiediamo di "
++"non fare una delle seguenti operazioni:"
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr "Attiva Clienti"
++
++msgid "Allowed hosts/subnets"
++msgstr "Hosts/Sottoreti Consentite"
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++"Il limite della larghezza di banda per i clienti viene attivato solo quando "
++"entrambi i limiti di upload e download sono impostati. Utilizzare un valore "
++"pari a 0 qui per disattivare completamente questa limitazione. I client "
++"inseriti nell'elenco dei consentiti non sono limitati."
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++"Diventare un membro attivo di questa comunità e aiutaci nell'utilizzo del "
++"proprio nodo"
++
++msgid "Blacklist"
++msgstr "Lista Nera"
++
++msgid "Blocked"
++msgstr "Bloccato"
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr "Spazio tempo"
++
++msgid "Client-Splash"
++msgstr "Client-Splash"
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++"Client-Splash è un sistema di autenticazione hotspot per le reti mesh "
++"wireless."
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr "La velocità di download dei clienti è limitata a tale valore (kbyte/s)"
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++"I clienti che hanno accettato lo splash sono autorizzati ad utilizzare la "
++"rete anche per molte ore."
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr "La velocità di upload dei clienti è limitata a questo valore (kbyte/s)"
++
++msgid "Contact"
++msgstr "Contatto"
++
++msgid "Decline"
++msgstr "Rifiuta"
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++"Effettua una donazione per aiutare a mantenere in attività questo progetto."
++
++msgid "Download limit"
++msgstr "Limite di download"
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr "Zona Firewall"
++
++msgid "General"
++msgstr "Generale"
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr "Nome Host"
++
++msgid "IP Address"
++msgstr "Indirizzo IP"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++"Se si utilizza una propria apparecchiatura wifi utilizzare canali differenti "
++"dalle nostre."
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++"Se si utilizza questa rete su base regolare vi chiediamo il vostro sostegno:"
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr "Intercettare il traffico cliente su questa interfaccia"
++
++msgid "Interfaces"
++msgstr "Interfacce"
++
++msgid "Interfaces that are used for Splash."
++msgstr "Interfacce usate per lo Splash."
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++"KB/s (Download/Upload). Si può essere in grado di rimuovere questo limite, "
++"contribuendo attivamente a questo progetto."
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr "Indirizzo MAC"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "gli indirizzi MAC in questo elenco sono bloccati."
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++"Gli indirizzi MAC dei clienti dell'elenco consentito. Questi non hanno "
++"bisogno di accettare lo splash e non hanno la larghezza di banda limitata."
++
++msgid "Netmask"
++msgstr "Maschera Rete"
++
++msgid "Network"
++msgstr "Rete"
++
++msgid "No clients connected"
++msgstr "Nessun cliente connesso"
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++"Si prega di notare che non siamo un provider di servizi internet, ma una "
++"rete di comunità sperimentale."
++
++msgid "Policy"
++msgstr "Politica"
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr "Salva"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr "Le regole Splash sono integrate in questa zona firewall"
++
++msgid "Splashtext"
++msgstr "Splashtext"
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr "Tempo restante"
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++"Per richiedere il motivo per cui sono state bloccate o chiedere l'accesso di "
++"nuovo si può provare a contattare il proprietario di questo punto di accesso:"
++
++msgid "Traffic in/out"
++msgstr "Traffico ingresso/uscita"
++
++msgid "Upload limit"
++msgstr "Limite di upload"
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr "Benvenuti"
++
++msgid "Whitelist"
++msgstr "Elenco Consentiti"
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr "Ora si è connessi alla rete mesh wireless gratuita"
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++"È possibile inserire il proprio testo che viene visualizzato ai clienti qui "
++"<br/> È possibile utilizzare i seguenti marcatori.: ###COMMUNITY###, "
++"###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### and "
++"###ACCEPT###."
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++"L'accesso a questa rete è stata bloccata, molto probabilmente perché hai "
++"fatto qualcosa che le nostre regole vietano espressamente."
++
++msgid "Your bandwidth is limited to"
++msgstr "La tua larghezza di banda è limitata a"
++
++msgid "blacklisted"
++msgstr "Lista Nera"
++
++msgid "expired"
++msgstr "scaduto"
++
++msgid "optional when using host addresses"
++msgstr "opzionale quando si utilizza indirizzi host"
++
++msgid "perform any kind of illegal activities"
++msgstr "eseguire qualsiasi tipo di attività illegali"
++
++msgid "splashed"
++msgstr "splashed"
++
++msgid "temporarily blocked"
++msgstr "temporaneamente bloccato"
++
++msgid "unknown"
++msgstr "sconosciuto"
++
++msgid "use filesharing applications on this network"
++msgstr "utilizzare le applicazioni di filesharing su questa rete"
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr "sprecate banda con download o flussi inutili"
++
++msgid "whitelisted"
++msgstr "Elenco contensiti"
++
++#~ msgid ""
++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. "
++#~ "they are always allowed."
++#~ msgstr ""
++#~ "Le reti e gli host che sono elencate qui sono esclusi dallo splashing, cio* "
++#~ "sono sempre ammessi."
++
++#~ msgid "By accepting these rules you can use this network for"
++#~ msgstr "Accettando queste regole è possibile utilizzare questa rete per"
++
++#~ msgid "Edit Splash text"
++#~ msgstr "Modifica il testo Splash"
++
++#~ msgid "hour(s). After this time you need to accept these rules again."
++#~ msgstr ""
++#~ "ora(e). Trascorso questo tempo è necessario accettare queste regole di "
++#~ "nuovo."
++
++#~ msgid "the owner of this access point."
++#~ msgstr "il proprietario di questo punto di accesso."
+diff --git a/feeds/luci/applications/luci-app-splash/po/ja/splash.po b/feeds/luci/applications/luci-app-splash/po/ja/splash.po
+new file mode 100644
+index 0000000..615be16
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/ja/splash.po
+@@ -0,0 +1,292 @@
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/ms/splash.po b/feeds/luci/applications/luci-app-splash/po/ms/splash.po
+new file mode 100644
+index 0000000..615be16
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/ms/splash.po
+@@ -0,0 +1,292 @@
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/no/splash.po b/feeds/luci/applications/luci-app-splash/po/no/splash.po
+new file mode 100644
+index 0000000..615be16
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/no/splash.po
+@@ -0,0 +1,292 @@
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/pl/splash.po b/feeds/luci/applications/luci-app-splash/po/pl/splash.po
+new file mode 100644
+index 0000000..6856884
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/pl/splash.po
+@@ -0,0 +1,385 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-08-24 06:17+0200\n"
++"PO-Revision-Date: 2014-05-05 04:17+0200\n"
++"Last-Translator: piosl <sleczek.piotr@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Accept"
++msgstr "Akceptuj"
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++"Dostęp do internetu może być mimo wszystko możliwy, ponieważ niektórzy "
++"aktywiści tego projektu dzielą się swoimi prywatnymi łączami. Te kilka łącz "
++"jest rozdzielanych między wszystkich użytkowników. Oznacza to, że transfer "
++"jest ograniczony. Z tego powodu prosimy, abyÅ› nie:"
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++"Dostęp do sieci nie jest gwarantowany. Może być przerwany w każdej chwili i "
++"bez podawania jakiegokolwiek powodu, dla niektórych urządzeń i/lub "
++"niektórych użytkowników."
++
++msgid "Active Clients"
++msgstr "Aktywni klienci"
++
++msgid "Allowed hosts/subnets"
++msgstr "Dozwolone hosty/podsieci"
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++"Jako alternatywę do edycji pełnego tekstu powitalnego możesz po prostu "
++"zawrzeć własny tekst wpisując go tutaj."
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++"Limit transferu dla klientów jest aktywny tylko jeśli aktywne są oba limity "
++"- pobierania i wysyłania. Ustaw 0, aby całkowicie wyłączyć to ograniczenie. "
++"Nie dotyczy ono klientów z białej listy."
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++"Zostań aktywnym członkiem tej społeczności i pomóż, zakładając własny węzeł"
++
++msgid "Blacklist"
++msgstr "Czarna lista"
++
++msgid "Blocked"
++msgstr "Zablokowane"
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++"Akceptując te zasady można korzystać z tej sieci na %s godzin(y). Po tym "
++"czasie należy zaakceptować te zasady ponownie."
++
++# z niemieckiego tłumaczenia
++#, fuzzy
++msgid "Clearance time"
++msgstr "Czas wyzwalacza"
++
++msgid "Client-Splash"
++msgstr "Splash kliencki"
++
++# nie ma słowa "autentykacja" - to brzydka kalka z angielskiego.
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++"Klient Splash - sposób uwierzytelniania użytkowników dla sieci WiFi oparty o "
++"wyświetlanie komunikatów."
++
++#, fuzzy
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++"Klienci sÄ… przekierowywani do tej strony po tym, jak zaakceptujÄ… powitanie. "
++"Jeśli to miejsce jest puste zostaną przekierowani do strony którą wybrali."
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr "Prędkość pobierania dla klienta jest ograniczona do wartości (kb/s)"
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr "Klienci, którzy zaakceptowali okienko mogą korzystać z sieci przez."
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr "Prędkość pobierania dla klienta jest ograniczona do wartości (kb/s)"
++
++msgid "Contact"
++msgstr "Kontakt"
++
++msgid "Decline"
++msgstr "Odrzuć"
++
++#, fuzzy
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++"Hosty przeznaczenia i sieci, które są wykluczone z powitania, tzn. są zawsze "
++"dozwolone."
++
++msgid "Donate some money to help us keep this project alive."
++msgstr "Możesz zasposorować ten projekt aby utrzymać go przy życiu"
++
++msgid "Download limit"
++msgstr "Limit ściągania"
++
++msgid "Edit the complete splash text"
++msgstr "Edit the complete splash text"
++
++msgid "Fair Use Policy"
++msgstr "Zasady dozwolonego użytku"
++
++msgid "Firewall zone"
++msgstr "Strefa firewall"
++
++msgid "General"
++msgstr "Ogólne"
++
++msgid "Get in %s with the operator of this access point."
++msgstr "Uzyskaj %s z operatorem tego punktu dostępu."
++
++msgid "Hostname"
++msgstr "Nazwa hosta"
++
++msgid "IP Address"
++msgstr "Adres IP"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++"Jeśli używasz własnych urządzeń WiFi korzystaj z innych kanałów niż nasze."
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr "Jeśli korzystasz z tej sieci regularnie prosimy cię o wsparcie."
++
++msgid "Include your own text in the default splash"
++msgstr "Zamieść własny tekst w miejscu domyślnego powitania"
++
++msgid "Intercept client traffic on this Interface"
++msgstr "Przechwytuj ruchu klienta w tym interfejsie"
++
++msgid "Interfaces"
++msgstr "Interfejs"
++
++msgid "Interfaces that are used for Splash."
++msgstr "Interfejsy wykorzystywane przez komunikat (Splash)"
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++"KB/s (Download/Upload). Będziesz w stanie usunąć ten limit jeśli aktywnie "
++"przyłączysz się do tego projektu."
++
++msgid "Legally Prohibited Activities"
++msgstr "Działania zabronione prawnie"
++
++msgid "Legally Prohibited content"
++msgstr "Treści zabronione prawnie"
++
++msgid "MAC Address"
++msgstr "Adres MAC"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "Adresy MAC z tej listy sÄ… zablokowane."
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++"Biała lista adresów MAC, wszyscy z tej listy nie muszą akceptować komunikatu "
++"(Splash) i nie mają ograniczanego połączenia"
++
++msgid "Netmask"
++msgstr "Maska sieci"
++
++msgid "Network"
++msgstr "Sieć"
++
++msgid "No clients connected"
++msgstr "Nie ma podłączonych klientów"
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++"Zwróć uwagę na to że nie jesteśmy providerem internetowym ale "
++"eksperymentalnÄ… sieciÄ…"
++
++msgid "Policy"
++msgstr "Zasady"
++
++msgid "Redirect target"
++msgstr "przekierować cel"
++
++msgid "Safety"
++msgstr "Bezpieczeństwo"
++
++msgid "Save"
++msgstr "Zachowaj"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++"Reguły komunikatu (Splash) są integrowane z ustawieniami firewalla tej strefy"
++
++msgid "Splashtext"
++msgstr "Tekst komunikatu (Splash)"
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++"Sieci, takie jak Internet, są otwarte i nieszyfrowane. Każdy uczestnik jest "
++"odpowiedzialny za bezpieczeństwo swoich połączeń i urządzeń."
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++"Właściciel sieci nie ponosi odpowiedzialności za utratę danych, "
++"nieautoryzowanego dostępu / uszkodzenia urządzeń lub strat finansowych, "
++"które uczestnicy mogą ponieść podczas korzystania z sieci."
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++"Uczestnik zobowiązuje się nie wykonywać żadnych działań, i powstrzymać się "
++"od działań, które naruszają prawo lub naruszające prawa osób trzecich."
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++"Uczestnik zobowiązuje się do nie przesyłania w sieci treści, które naruszają "
++"prawo."
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++"Uczestnik zobowiązuje się nie korzystać z sieci w sposób, który zagraża "
++"infrastrukturze, samej sieci, jej podmiotom lub innym uczestnikom."
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++"Niniejszy Regulamin reguluje wykorzystanie komputera w sieci przez swoich "
++"uczestników, PDA, lub podobnego urządzenia (\"Urządzeń\") w ramach sieci."
++
++msgid "Time remaining"
++msgstr "Pozostały czas"
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++"Aby poznać z jakiego powodu zostałeś zablokowany lub prosić o ponowne "
++"odblokowanie możesz spróbować skontaktować się z właścicielem tego Access "
++"Point'a:"
++
++msgid "Traffic in/out"
++msgstr "Ruch do/od"
++
++msgid "Upload limit"
++msgstr "Limit wysyłania"
++
++msgid "Usage Agreement"
++msgstr "Umowa użytkowania"
++
++msgid "Welcome"
++msgstr "Witamy"
++
++msgid "Whitelist"
++msgstr "Biała lista"
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr "Jesteś teraz podłączony do darmowej sieci"
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++"Możesz umieścić tutaj własny tekst wyświetlany dla klientów.<br /> "
++"Dopuszczalne jest używanie następujących znaków: ###COMMUNITY###, "
++"###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### and "
++"###ACCEPT###."
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++"Twój dostęp do sieci został zablokowany, najprawdopodobniej dlatego że "
++"wykonałeś jedną z akcji zabronionych przez nasze reguły."
++
++msgid "Your bandwidth is limited to"
++msgstr "Twój transfer jest ograniczony do"
++
++msgid "blacklisted"
++msgstr "czarna lista"
++
++msgid "expired"
++msgstr "wygasło"
++
++msgid "optional when using host addresses"
++msgstr "opcjonalne w przypadku używania adresów hostów"
++
++msgid "perform any kind of illegal activities"
++msgstr "wykonywał którąkolwiek z zakazanych akcji"
++
++msgid "splashed"
++msgstr "Powitanie"
++
++msgid "temporarily blocked"
++msgstr "tymczasowo zablokowane"
++
++msgid "unknown"
++msgstr "nieznane"
++
++# Zgaduję, że to jest wyświetlane tuż po komunikacie nr 2, więc tak powinno pasować.
++msgid "use filesharing applications on this network"
++msgstr "używał programów do dzielenia się plikami w tej sieci"
++
++# j.w.
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr "marnował transfer na niepotrzebne pobieranie plików i strumieni"
++
++msgid "whitelisted"
++msgstr "biała lista"
++
++#~ msgid ""
++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. "
++#~ "they are always allowed."
++#~ msgstr ""
++#~ "Hosty i sieci wylistowane tutaj są wyłączone z konieczności klikania "
++#~ "komunikatu, zawsze mogą połączyć się do sieci."
++
++#~ msgid "By accepting these rules you can use this network for"
++#~ msgstr "Akceptując te reguły możesz używać sieci do:"
++
++#~ msgid "Edit Splash text"
++#~ msgstr "Edytuj tekst Komunikatu (Splash)"
++
++#~ msgid "hour(s). After this time you need to accept these rules again."
++#~ msgstr "Czas po jakim musisz zaakceptować te reguły (w godzinach)"
++
++#~ msgid "the owner of this access point."
++#~ msgstr "Właściciel tego Access Point'a"
+diff --git a/feeds/luci/applications/luci-app-splash/po/pt-br/splash.po b/feeds/luci/applications/luci-app-splash/po/pt-br/splash.po
+new file mode 100644
+index 0000000..cbdc801
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/pt-br/splash.po
+@@ -0,0 +1,402 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-11-02 05:36+0200\n"
++"PO-Revision-Date: 2014-06-21 19:10+0200\n"
++"Last-Translator: Éder <eder.grigorio@openmailbox.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Accept"
++msgstr "Aceitar"
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++"O acesso à internet, no entanto, pode ser possível porque alguns ativistas "
++"deste projeto compartilham duas conexões privadas com a internet. Estas "
++"poucas conexões são compartilhadas entre todos os usuários. Isto significa "
++"que a banda disponível é limitada e, por este motivo, pedimos que você não "
++"faça qualquer uma destas coisas:"
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++"O acesso à rede não é garantido. Ele pode ser interrompido a qualquer "
++"momento sem aviso e por qualquer motivo, para alguns equipamentos e/ou pode "
++"bloquear alguns usuários."
++
++msgid "Active Clients"
++msgstr "Clientes Ativos"
++
++msgid "Allowed hosts/subnets"
++msgstr "Subredes/equipamentos permitidos"
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++"Como uma alternativa a edição completa do texto do termo de uso, você pode "
++"também entrar aqui algum texto personalizado para incluir na página padrão."
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++"O limite da taxa de transferência somente é ativado quando ambos os limites, "
++"para subir e baixar, estão definidos. Use o valor 0 para desabilitar "
++"completamente esta limitação. Clientes na lista branca não são limitados."
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++"Torne-se um membro ativo desta comunidade e ajude operando seu próprio nó."
++
++msgid "Blacklist"
++msgstr "Lista negra"
++
++msgid "Blocked"
++msgstr "Bloqueado"
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++"Aceitando estas regras, você pode usar esta rede por %s hora(s). Depois "
++"deste prazo, você terá que aceitar estas regras novamente."
++
++msgid "Clearance time"
++msgstr "Tempo de eliminação"
++
++msgid "Client-Splash"
++msgstr "Client-Splash"
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++"Client-Splash é um sistema de autenticação de ponto de acesso para redes sem "
++"fio em malha."
++
++# 20140621: edersg: tradução
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++"Os clientes são redirecionados para esta página depois de terem aceitado a "
++"*splash* Se esta for deixada em branco, eles são redirecionados para a "
++"página que haviam solicitado."
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++"A velocidade para baixar dos clientes é limitada por este valor (kbytes/s)"
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++"Os clientes que aceitarem o termo de uso estarão autorizados a usar a rede "
++"por esta quantidade de horas."
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++"A velocidade para subir dos clientes é limitada por este valor (kbytes/s)"
++
++msgid "Contact"
++msgstr "Contato"
++
++msgid "Decline"
++msgstr "Rejeitar"
++
++# 20140621: edersg: tradução
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++"As redes e as máquinas de destino que são excluídas a partir da *splashing*, "
++" são sempre permitidas."
++
++msgid "Donate some money to help us keep this project alive."
++msgstr "Doar algum dinheiro para ajudar a manter este projeto vivo."
++
++msgid "Download limit"
++msgstr "Limite para baixar"
++
++msgid "Edit the complete splash text"
++msgstr "Edite todo o termo de uso"
++
++msgid "Fair Use Policy"
++msgstr "Política de uso adequado"
++
++msgid "Firewall zone"
++msgstr "Zona do Firewall"
++
++msgid "General"
++msgstr "Geral"
++
++# Very strange text... Used at http://luci.subsignal.org/trac/browser/luci/trunk/applications/luci-splash/luasrc/view/splash/splash.htm:58
++msgid "Get in %s with the operator of this access point."
++msgstr "Entre em %s com o operador deste ponto de acesso."
++
++msgid "Hostname"
++msgstr "Nome do Equipamento"
++
++msgid "IP Address"
++msgstr "Endereço IP"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++"Se você opera seu próprio equipamento WiFi, use canais diferentes dos nossos."
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr "Se você usa esta rede regularmente, nós pedimos a sua ajuda:"
++
++msgid "Include your own text in the default splash"
++msgstr "Inclua seu próprio texto no termo de uso padrão"
++
++msgid "Intercept client traffic on this Interface"
++msgstr "Interceptar o tráfego do cliente nesta interface"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interfaces that are used for Splash."
++msgstr "Interfaces usadas pelo Splash."
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++"KB/s (Baixando/Subindo). Você pode remover esta limitação contribuindo "
++"ativamente para este projeto."
++
++msgid "Legally Prohibited Activities"
++msgstr "Atividades Proibidas por Lei"
++
++msgid "Legally Prohibited content"
++msgstr "Conteúdo Proibido por Lei"
++
++msgid "MAC Address"
++msgstr "Endereço MAC"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "Os endereços MAC nesta lista serão bloqueados."
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++"Endereços MAC dos clientes na lista branca. Estes não precisam aceitar o "
++"termo de uso e não possuem limitação na sua taxa de transferência."
++
++msgid "Netmask"
++msgstr "Máscara de Rede"
++
++msgid "Network"
++msgstr "Rede"
++
++msgid "No clients connected"
++msgstr "Nenhum cliente conectado"
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++"Observe que nós não somos um provedor de internet mas uma rede comunitária "
++"experimental."
++
++msgid "Policy"
++msgstr "Política"
++
++# 20140621: edersg: tradução
++msgid "Redirect target"
++msgstr "Redirecionar alvo"
++
++msgid "Safety"
++msgstr "Segurança"
++
++msgid "Save"
++msgstr "Salvar"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr "As regras do Slapsh estão integradas a esta zona do firewall"
++
++msgid "Splashtext"
++msgstr "Texto do termo de uso"
++
++# 20140621: edersg: tradução
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++"Uma rede como a Internet não é criptografada e aberta. Cada usuário é "
++"responsável pela segurança de suas próprias conexões e dispositivos."
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++"A rede sem fio aberta e livre dos voluntários (\"Operadores\") provê o "
++"equipamento necessário e conexão com a Internet (\"Infraestrutura\") do seu "
++"próprio bolso."
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++"O operador não se responsabiliza por perda de dados, acesso não autorizado "
++"ou dano aos dispositivos, ou perdas financeiras que os participantes possam "
++"sofrer pelo o uso da rede."
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++"O participante concorda que não realizará nenhuma atividade e se absterá de "
++"atos que possam violar a lei ou infringir os direitos de terceiros."
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++"O participante concorda em não transferir conteúdo pela rede que viole a lei."
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++"O participante concorda em não usar a rede de qualquer maneira que possa "
++"prejudicar a infraestrutura, a própria rede, seus operadores ou outros "
++"participantes."
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++"Estes \"Termos de Uso\" regem o uso da rede por equipamentos dos "
++"participantes em uso desta rede."
++
++msgid "Time remaining"
++msgstr "Tempo restante"
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++"Para perguntar por qual razão você foi bloqueado ou para solicitar novamente "
++"seu acesso, você pode tentar contatar o dono deste ponto de acesso:"
++
++msgid "Traffic in/out"
++msgstr "Tráfego de entrada/saída"
++
++msgid "Upload limit"
++msgstr "Limite de subida"
++
++msgid "Usage Agreement"
++msgstr "Acordo de Uso"
++
++msgid "Welcome"
++msgstr "Bem-vindo"
++
++msgid "Whitelist"
++msgstr "Lista branca"
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr "Você está agora conectado à rede livre em malha sem fio"
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++"Vocẽ pode entrar aqui com seu próprio texto que será mostrado para os "
++"clientes.<br />É possível usar os seguintes marcadores: ###COMMUNITY###, "
++"###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### and "
++"###ACCEPT###."
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++"Seu acesso para esta rede foi bloqueado, provavelmente porque você fez algo "
++"que as regras explicitamente proibiam."
++
++msgid "Your bandwidth is limited to"
++msgstr "Sua banda está limitada à"
++
++msgid "blacklisted"
++msgstr "na lista negra"
++
++msgid "expired"
++msgstr "expirado"
++
++msgid "optional when using host addresses"
++msgstr "opcional quando é usado o endereço do equipamento"
++
++msgid "perform any kind of illegal activities"
++msgstr "realizar qualquer tipo de atividades ilegais"
++
++msgid "splashed"
++msgstr "termo mostrado"
++
++msgid "temporarily blocked"
++msgstr "bloqueado temporariamente"
++
++msgid "unknown"
++msgstr "desconhecido"
++
++msgid "use filesharing applications on this network"
++msgstr "usar aplicativos de compartilhamento de arquivos nesta rede"
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr "usar banda com fluxos ou arquivos baixados não necessários"
++
++msgid "whitelisted"
++msgstr "na lista branca"
++
++#~ msgid ""
++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. "
++#~ "they are always allowed."
++#~ msgstr ""
++#~ "Equipamentos ou Redes listadas aqui estarão excluídas do termo de uso. Eles "
++#~ "estarão sempre autorizados."
++
++#~ msgid "By accepting these rules you can use this network for"
++#~ msgstr "Aceitando estas regras, você pode usar esta rede para"
++
++#~ msgid "Edit Splash text"
++#~ msgstr "Editar texto do termo de uso"
++
++#~ msgid "hour(s). After this time you need to accept these rules again."
++#~ msgstr ""
++#~ "horas(s). Depois deste tempo, você terá que aceitar as regras novamente."
++
++#~ msgid "the owner of this access point."
++#~ msgstr "o dono deste ponto de acesso."
++
++#~ msgid ""
++#~ "You can change the text that is displayed to clients here.<br /> It is "
++#~ "possible to use the following markers: ###COMMUNITY###, "
++#~ "###COMMUNITY_URL###, ###LEASETIME### and ###ACCEPT###.<br />Click here to "
++#~ "<a href='/luci/splash/'>test the splash page</a> after you saved it."
++#~ msgstr ""
++#~ "Aqui você pode mudar o texto do termo de uso que é mostrado aos clientes."
++#~ "<br /> É possível usar as seguintes marcações: ###COMMUNITY###, "
++#~ "###COMMUNITY_URL###, ###LEASETIME### e ###ACCEPT###.<br />Clique aqui "
++#~ "para <a href='/luci/splash/'>testar a página de termo de uso</a> depois "
++#~ "que você salvá-la."
+diff --git a/feeds/luci/applications/luci-app-splash/po/pt/splash.po b/feeds/luci/applications/luci-app-splash/po/pt/splash.po
+new file mode 100644
+index 0000000..05bee4f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/pt/splash.po
+@@ -0,0 +1,309 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-05-31 22:29+0200\n"
++"PO-Revision-Date: 2013-06-03 12:17+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Accept"
++msgstr "Aceitar"
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr "Clientes Activos"
++
++msgid "Allowed hosts/subnets"
++msgstr "Hosts/Subnets permitidos"
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr "Bloqueado"
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr "Aceitando estas regras só pode usar esta regra para"
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr "A velocidade de upload está limitado a (kbyte/s)"
++
++msgid "Contact"
++msgstr "Contacto"
++
++msgid "Decline"
++msgstr "Declinar"
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr "Doe algum dinheiro para nos ajudar a manter este projeto vivo."
++
++msgid "Download limit"
++msgstr "Limite de Download"
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr "Zona de Firewall"
++
++msgid "General"
++msgstr "Geral"
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr "Nome de Host"
++
++msgid "IP Address"
++msgstr "Endereço IP"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++"Se tem o seu próprio equipamento de rede wireless, use canais diferentes dos "
++"nossos."
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr "Endereço MAC"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "Endereços MAC nesta lista estão bloqueados."
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr "Mascara de Rede"
++
++msgid "Network"
++msgstr "Rede"
++
++msgid "No clients connected"
++msgstr "Não há clientes ligados"
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr "Gravar"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr "Limite de Upload"
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr "Bem-vindo"
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr "A largura de banda está limitada a"
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr "desconhecido"
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/ro/splash.po b/feeds/luci/applications/luci-app-splash/po/ro/splash.po
+new file mode 100644
+index 0000000..615be16
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/ro/splash.po
+@@ -0,0 +1,292 @@
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/ru/splash.po b/feeds/luci/applications/luci-app-splash/po/ru/splash.po
+new file mode 100644
+index 0000000..3f470db
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/ru/splash.po
+@@ -0,0 +1,362 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: splash\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-01-26 15:10+0200\n"
++"PO-Revision-Date: 2013-11-13 18:52+0200\n"
++"Last-Translator: Роман <x.wserfer@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Accept"
++msgstr "ПринÑÑ‚ÑŒ"
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++"ДоÑтуп к интернету возможен Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ активиÑтам данного проекта, "
++"которые делают общедоÑтупным Ñвоё личное подключение к интернету. Эти "
++"немногие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÑÑŽÑ‚ÑÑ Ñреди вÑех пользователей. Это означает, что "
++"доÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑÐºÐ½Ð°Ñ ÑпоÑобноÑÑ‚ÑŒ ограничена и поÑтому мы проÑим Ð²Ð°Ñ Ð½Ðµ "
++"делать Ñледующего:"
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr "Ðктивные клиенты"
++
++msgid "Allowed hosts/subnets"
++msgstr "Разрешённые хоÑÑ‚Ñ‹/подÑети"
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++"Ограничение полоÑÑ‹ Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² активируетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при указанных лимитах "
++"ниÑходÑщего и воÑходÑщего каналов. Значение 0 полноÑтью отключает "
++"ограничение. Клиенты из \"белого\" ÑпиÑка не имеют ограничений."
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++"Станьте активным учаÑтником данного ÑообщеÑтва и окажите ÑодейÑтвие, "
++"запуÑтив Ñвой узел Ñети"
++
++msgid "Blacklist"
++msgstr "Чёрный ÑпиÑок"
++
++msgid "Blocked"
++msgstr "Заблокирован"
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr "Разрешённое времÑ"
++
++msgid "Client-Splash"
++msgstr "Client-Splash"
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++"Client-Splash - Ñто ÑиÑтема аутентификации точек доÑтупа Ð´Ð»Ñ Ð±ÐµÑпроводных "
++"ÑчеиÑÑ‚Ñ‹Ñ… Ñетей."
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++"СкороÑÑ‚ÑŒ ниÑходÑщего канала Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² ограничена Ñтим значением (КБ/c)"
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++"Клиенты, принÑвшие приглашение splash-Ñкрана, могут иÑпользовать Ñеть данное "
++"количеÑтво чаÑов."
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++"СкороÑÑ‚ÑŒ воÑходÑщего канала Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² ограничена Ñтим значением (КБ/c)"
++
++msgid "Contact"
++msgstr "СвÑзатьÑÑ"
++
++msgid "Decline"
++msgstr "Отклонить"
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr "Пожертвовать деньги на поддержку Ñтого проекта."
++
++msgid "Download limit"
++msgstr "Лимит загрузки"
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr "Политика добровольного иÑпользованиÑ"
++
++msgid "Firewall zone"
++msgstr "Зона межÑетевого Ñкрана"
++
++msgid "General"
++msgstr "Общие"
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта"
++
++msgid "IP Address"
++msgstr "IP-адреÑ"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++"ЕÑли вы иÑпользуете ÑобÑтвенное оборудование Wi-Fi, иÑпользуйте каналы, "
++"отличающиеÑÑ Ð¾Ñ‚ наших."
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr "ЕÑли вы иÑпользуете Ñту Ñеть регулÑрно, мы проÑим вашей поддержки:"
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr "Перехватывать клиентÑкий трафик на Ñтом интерфейÑе"
++
++msgid "Interfaces"
++msgstr "ИнтерфейÑÑ‹"
++
++msgid "Interfaces that are used for Splash."
++msgstr "ИнтерфейÑÑ‹, иÑпользуемые Ð´Ð»Ñ Splash."
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++"КБ/Ñ (загрузка/отдача). Данное ограничение может быть ÑнÑто при активном "
++"учаÑтии в Ñтом проекте."
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr "ЮридичеÑки запрещенный контент"
++
++msgid "MAC Address"
++msgstr "MAC-адреÑ"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "MAC-адреÑа из Ñтого ÑпиÑка заблокированы."
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++"MAC-адреÑа клиентов из \"белого\" ÑпиÑка. Данные клиенты не имеют "
++"ограничений пропуÑкной ÑпоÑобноÑти."
++
++msgid "Netmask"
++msgstr "МаÑка Ñети"
++
++msgid "Network"
++msgstr "Сеть"
++
++msgid "No clients connected"
++msgstr "Клиенты не подключены"
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++"ПожалуйÑта, обратите внимание, что мы не интернет-провайдер, а "
++"ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñеть ÑообщеÑтва."
++
++msgid "Policy"
++msgstr "Политика"
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr "БезопаÑный"
++
++msgid "Save"
++msgstr "Сохранить"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr "Правила Splash интегрированы в зону Ñтого межÑетевого Ñкрана"
++
++msgid "Splashtext"
++msgstr "ТекÑÑ‚ splash-Ñкрана"
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr "ОÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ"
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++"Чтобы узнать причину, по которой Ð²Ð°Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð»Ð¸, или Ñнова получить "
++"доÑтуп, ÑвÑжитеÑÑŒ Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ данной точки доÑтупа:"
++
++msgid "Traffic in/out"
++msgstr "Трафик вх/иÑÑ…"
++
++msgid "Upload limit"
++msgstr "Лимит отдачи"
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr "Добро пожаловать"
++
++msgid "Whitelist"
++msgstr "\"Белый\" ÑпиÑок"
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr "Теперь вы подключены к беÑплатной беÑпроводной ÑчеиÑтой Ñети"
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++"ЗдеÑÑŒ вы можете указать Ñвой текÑÑ‚, который будет отображатьÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°Ð¼.<br /"
++">Возможно иÑпользовать Ñледующие маркеры: ###COMMUNITY###, "
++"###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### and "
++"###ACCEPT###."
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++"ДоÑтуп к Ñтой Ñети был заблокирован, Ñкорее вÑего, потому, что вы Ñделали "
++"что-то, что наши правила Ñвно запрещают."
++
++msgid "Your bandwidth is limited to"
++msgstr "Ваша полоÑа пропуÑÐºÐ°Ð½Ð¸Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð° значением"
++
++msgid "blacklisted"
++msgstr "в \"чёрном\" ÑпиÑке"
++
++msgid "expired"
++msgstr "иÑтёк"
++
++msgid "optional when using host addresses"
++msgstr "опционально при иÑпользовании хоÑÑ‚-адреÑов"
++
++msgid "perform any kind of illegal activities"
++msgstr "выполнÑÑ‚ÑŒ любые незаконные дейÑтвиÑ"
++
++msgid "splashed"
++msgstr "уже в splash"
++
++msgid "temporarily blocked"
++msgstr "временно заблокирован"
++
++msgid "unknown"
++msgstr "неизвеÑтный"
++
++msgid "use filesharing applications on this network"
++msgstr "иÑпользование файлообменных приложений в Ñтой Ñети"
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr "тратить пропуÑкную ÑпоÑобноÑÑ‚ÑŒ на ненужные загрузки или потоки"
++
++msgid "whitelisted"
++msgstr "в \"белом\" ÑпиÑке"
++
++#~ msgid ""
++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. "
++#~ "they are always allowed."
++#~ msgstr ""
++#~ "ПеречиÑленные хоÑÑ‚Ñ‹ и Ñети не получают Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ splash-Ñкрана, Ñ‚.е. они "
++#~ "вÑегда разрешены."
++
++#~ msgid "By accepting these rules you can use this network for"
++#~ msgstr "ÐŸÑ€Ð¸Ð½Ð¸Ð¼Ð°Ñ Ñти правила, вы можете иÑпользовать данную Ñеть длÑ"
++
++#~ msgid "Edit Splash text"
++#~ msgstr "Редактировать текÑÑ‚ splash-Ñкрана"
++
++#~ msgid "hour(s). After this time you need to accept these rules again."
++#~ msgstr ""
++#~ "чаÑ(Ñ‹). ПоÑле указанного времени Ð’Ñ‹ должны вновь принÑÑ‚ÑŒ Ñти правила."
++
++# ЗдеÑÑŒ навернÑка нужно Ñклонить в другом падеже, надо Ñмотреть по контекÑту
++#~ msgid "the owner of this access point."
++#~ msgstr "Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ Ñтой точки доÑтупа."
+diff --git a/feeds/luci/applications/luci-app-splash/po/sk/splash.po b/feeds/luci/applications/luci-app-splash/po/sk/splash.po
+new file mode 100644
+index 0000000..e9dd448
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/sk/splash.po
+@@ -0,0 +1,303 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/sv/splash.po b/feeds/luci/applications/luci-app-splash/po/sv/splash.po
+new file mode 100644
+index 0000000..cd573b2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/sv/splash.po
+@@ -0,0 +1,303 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/templates/splash.pot b/feeds/luci/applications/luci-app-splash/po/templates/splash.pot
+new file mode 100644
+index 0000000..f29b736
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/templates/splash.pot
+@@ -0,0 +1,295 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/tr/splash.po b/feeds/luci/applications/luci-app-splash/po/tr/splash.po
+new file mode 100644
+index 0000000..03fa7b3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/tr/splash.po
+@@ -0,0 +1,303 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \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"
++
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/uk/splash.po b/feeds/luci/applications/luci-app-splash/po/uk/splash.po
+new file mode 100644
+index 0000000..2364c63
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/uk/splash.po
+@@ -0,0 +1,304 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/vi/splash.po b/feeds/luci/applications/luci-app-splash/po/vi/splash.po
+new file mode 100644
+index 0000000..615be16
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/vi/splash.po
+@@ -0,0 +1,292 @@
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/po/zh-cn/splash.po b/feeds/luci/applications/luci-app-splash/po/zh-cn/splash.po
+new file mode 100644
+index 0000000..439b774
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/zh-cn/splash.po
+@@ -0,0 +1,321 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-06-28 08:58+0200\n"
++"PO-Revision-Date: 2014-07-23 02:07+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Accept"
++msgstr "接收"
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr "活动的客户端"
++
++msgid "Allowed hosts/subnets"
++msgstr "å…许的 主机/掩ç "
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++"åªæœ‰å½“ 上传和下载的é™åˆ¶éƒ½è®¾ç½®çš„时候对客户端的带宽é™åˆ¶æ‰ä¼šç”Ÿæ•ˆã€‚在这里使用0 å¯"
++"以完全ç¦ç”¨æ­¤é™åˆ¶ã€‚白åå•å®¢æˆ·ç«¯ä¸å—é™åˆ¶ã€‚"
++
++# Something wwrong?
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr "æˆä¸ºè¿™ä¸ªç¤¾åŒºçš„一个活跃æˆå‘˜å¹¶ä¸”è¿è¥ä½ è‡ªå·±çš„节点以帮助别人。"
++
++msgid "Blacklist"
++msgstr "黑åå•"
++
++msgid "Blocked"
++msgstr "é”定"
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr "清ç†æ—¶é—´"
++
++msgid "Client-Splash"
++msgstr "客户端弹窗"
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr "Client-Splash是无线MESH网络的一个热点认è¯ç³»ç»Ÿ"
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr "客户端下载速度é™åˆ¶ä¸ºæ­¤å€¼(kbyte/s)"
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr "已接å—Splash的客户端å…许使用这个网络Nå°æ—¶"
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr "客户端上传速度é™åˆ¶ä¸ºæ­¤å€¼(kbyte/s)"
++
++msgid "Contact"
++msgstr "è”ç³»"
++
++msgid "Decline"
++msgstr "下é™"
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr "æ助我们一些钱以帮助我们维护这个项目。"
++
++msgid "Download limit"
++msgstr "下载é™åˆ¶"
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr "防ç«å¢™åŒºåŸŸ"
++
++msgid "General"
++msgstr "概述"
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr "主机å"
++
++msgid "IP Address"
++msgstr "IP地å€"
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr "如果你æ“作你自有的wifi设备,使用与我们ä¸åŒçš„频é“"
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr "如果你ç»å¸¸ä½¿ç”¨è¿™ä¸ªç½‘络,我们需è¦ä½ çš„支æŒ"
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr "在这个接å£ä¸Šæ‹¦æˆªå®¢æˆ·ç«¯é€šä¿¡æµé‡"
++
++msgid "Interfaces"
++msgstr "接å£"
++
++msgid "Interfaces that are used for Splash."
++msgstr "Splash使用的接å£"
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr "法律ç¦æ­¢è¡Œä¸º"
++
++msgid "Legally Prohibited content"
++msgstr "法律ç¦æ­¢å†…容"
++
++msgid "MAC Address"
++msgstr "MAC地å€"
++
++msgid "MAC addresses in this list are blocked."
++msgstr "在本列表中的MAC地å€å°†è¢«é˜»æŒ¡"
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr "白åå•ä¸­çš„MAC地å€ï¼Œå¯ä¸ç”¨æŽ¥å—splash,åŒæ—¶æ²¡æœ‰å¸¦å®½é™åˆ¶ã€‚"
++
++msgid "Netmask"
++msgstr "网络掩ç "
++
++msgid "Network"
++msgstr "网络"
++
++msgid "No clients connected"
++msgstr "无客户端连接"
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr "我们ä¸æ˜¯ISP(互è”网è¿è¡Œå•†ï¼‰ï¼Œä»…ä»…åªæ˜¯ä¸€ä¸ªå®žéªŒæ€§çš„社区网络。"
++
++msgid "Policy"
++msgstr "ç­–ç•¥"
++
++msgid "Redirect target"
++msgstr "é‡å®šå‘目标"
++
++msgid "Safety"
++msgstr "安全"
++
++msgid "Save"
++msgstr "ä¿å­˜"
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr "æµé‡ å…¥/出"
++
++msgid "Upload limit"
++msgstr "上传é™åˆ¶"
++
++msgid "Usage Agreement"
++msgstr "使用åè®®"
++
++msgid "Welcome"
++msgstr "欢迎"
++
++msgid "Whitelist"
++msgstr "白åå•"
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr "你的带宽é™åˆ¶ä¸º"
++
++msgid "blacklisted"
++msgstr "黑åå•"
++
++msgid "expired"
++msgstr "过期"
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
++
++#~ msgid ""
++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. "
++#~ "they are always allowed."
++#~ msgstr "列在这里的主机和网络都排除在Splashing之外,例如:一直被å…许访问。"
++
++#~ msgid "By accepting these rules you can use this network for"
++#~ msgstr "接å—这些æ¡æ¬¾ä»¥ä¾¿ä½¿ç”¨è¿™ä¸ªç½‘络"
++
++#~ msgid "Edit Splash text"
++#~ msgstr "编辑Splash文本"
+diff --git a/feeds/luci/applications/luci-app-splash/po/zh-tw/splash.po b/feeds/luci/applications/luci-app-splash/po/zh-tw/splash.po
+new file mode 100644
+index 0000000..1125abf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/po/zh-tw/splash.po
+@@ -0,0 +1,302 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Accept"
++msgstr ""
++
++msgid ""
++"Access to the internet might be possible nevertheless, because some "
++"activists of this project share their private internet connections. These "
++"few connections are shared between all users. That means available bandwidth "
++"is limited and because of this we ask you not to do any of the following:"
++msgstr ""
++
++msgid ""
++"Access to the network is not guaranteed. It can be interrupted at any time "
++"without notice for any reason, for certain devices, and/or may be blocked "
++"for certain users."
++msgstr ""
++
++msgid "Active Clients"
++msgstr ""
++
++msgid "Allowed hosts/subnets"
++msgstr ""
++
++msgid ""
++"As an alternative to editing the complete splash text you can also just "
++"include some custom text in the default splash page by entering it here."
++msgstr ""
++
++msgid ""
++"Bandwidth limit for clients is only activated when both up- and download "
++"limit are set. Use a value of 0 here to completely disable this limitation. "
++"Whitelisted clients are not limited."
++msgstr ""
++
++msgid ""
++"Become an active member of this community and help by operating your own node"
++msgstr ""
++
++msgid "Blacklist"
++msgstr ""
++
++msgid "Blocked"
++msgstr ""
++
++msgid ""
++"By accepting these rules you can use this network for %s hour(s). After this "
++"time you need to accept these rules again."
++msgstr ""
++
++msgid "Clearance time"
++msgstr ""
++
++msgid "Client-Splash"
++msgstr ""
++
++msgid ""
++"Client-Splash is a hotspot authentification system for wireless mesh "
++"networks."
++msgstr ""
++
++msgid ""
++"Clients are redirected to this page after they have accepted the splash. If "
++"this is left empty they are redirected to the page they had requested."
++msgstr ""
++
++msgid "Clients download speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid ""
++"Clients that have accepted the splash are allowed to use the network for "
++"that many hours."
++msgstr ""
++
++msgid "Clients upload speed is limited to this value (kbyte/s)"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Decline"
++msgstr ""
++
++msgid ""
++"Destination hosts and networks that are excluded from splashing, i.e. they "
++"are always allowed."
++msgstr ""
++
++msgid "Donate some money to help us keep this project alive."
++msgstr ""
++
++msgid "Download limit"
++msgstr ""
++
++msgid "Edit the complete splash text"
++msgstr ""
++
++msgid "Fair Use Policy"
++msgstr ""
++
++msgid "Firewall zone"
++msgstr ""
++
++msgid "General"
++msgstr ""
++
++msgid "Get in %s with the operator of this access point."
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP Address"
++msgstr ""
++
++msgid ""
++"If you operate your own wifi equipment use channels different from ours."
++msgstr ""
++
++msgid "If you use this network on a regular basis we ask for your support:"
++msgstr ""
++
++msgid "Include your own text in the default splash"
++msgstr ""
++
++msgid "Intercept client traffic on this Interface"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interfaces that are used for Splash."
++msgstr ""
++
++msgid ""
++"KB/s (Download/Upload). You may be able to remove this limit by actively "
++"contributing to this project."
++msgstr ""
++
++msgid "Legally Prohibited Activities"
++msgstr ""
++
++msgid "Legally Prohibited content"
++msgstr ""
++
++msgid "MAC Address"
++msgstr ""
++
++msgid "MAC addresses in this list are blocked."
++msgstr ""
++
++msgid ""
++"MAC addresses of whitelisted clients. These do not need to accept the splash "
++"and are not bandwidth limited."
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "No clients connected"
++msgstr ""
++
++msgid ""
++"Please note that we are not an internet service provider but an experimental "
++"community network."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Redirect target"
++msgstr ""
++
++msgid "Safety"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Splash rules are integrated in this firewall zone"
++msgstr ""
++
++msgid "Splashtext"
++msgstr ""
++
++msgid ""
++"The network, like the Internet, is unencrypted and open. Each participant is "
++"responsible for the safety of their own connections and devices."
++msgstr ""
++
++msgid ""
++"The open and free wireless network of volunteers (\"Operators\") provides "
++"the necessary equipment and Internet connections (\"Infrastructure\") at "
++"their own expense."
++msgstr ""
++
++msgid ""
++"The operator claims no liability for loss of data, unauthorized access/"
++"damage to devices, or financial losses that participants may suffer from the "
++"use of the network."
++msgstr ""
++
++msgid ""
++"The participant agrees to not perform any action and refrain from acts which "
++"may violate the law or infringe upon the rights of third parties."
++msgstr ""
++
++msgid ""
++"The participant agrees to not transfer content over the network which "
++"violates the law."
++msgstr ""
++
++msgid ""
++"The participant agrees to not use the network in any way which will harm the "
++"infrastructure, the network itself, its operators or other participants."
++msgstr ""
++
++msgid ""
++"These Terms of Use govern the use of the network by its participants' "
++"computer, PDA, or similar device (\"Devices\") within the network."
++msgstr ""
++
++msgid "Time remaining"
++msgstr ""
++
++msgid ""
++"To ask for the reason why you have been blocked or ask for access again you "
++"can try to contact the owner of this access point:"
++msgstr ""
++
++msgid "Traffic in/out"
++msgstr ""
++
++msgid "Upload limit"
++msgstr ""
++
++msgid "Usage Agreement"
++msgstr ""
++
++msgid "Welcome"
++msgstr ""
++
++msgid "Whitelist"
++msgstr ""
++
++msgid "You are now connected to the free wireless mesh network"
++msgstr ""
++
++msgid ""
++"You can enter your own text that is displayed to clients here.<br />It is "
++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, "
++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###."
++msgstr ""
++
++msgid ""
++"Your access to this network has been blocked, most likely because you did "
++"something that our rules explicitly forbid."
++msgstr ""
++
++msgid "Your bandwidth is limited to"
++msgstr ""
++
++msgid "blacklisted"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid "optional when using host addresses"
++msgstr ""
++
++msgid "perform any kind of illegal activities"
++msgstr ""
++
++msgid "splashed"
++msgstr ""
++
++msgid "temporarily blocked"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "use filesharing applications on this network"
++msgstr ""
++
++msgid "waste bandwidth with unneccesary downloads or streams"
++msgstr ""
++
++msgid "whitelisted"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash b/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash
+new file mode 100644
+index 0000000..c4cfef5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash
+@@ -0,0 +1,2 @@
++config core general
++ option leasetime 1
+\ No newline at end of file
+diff --git a/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash_leases b/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash_leases
+new file mode 100644
+index 0000000..6afdd90
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash_leases
+@@ -0,0 +1 @@
++# This file should always stay empty and is just needed to be able to use this config in /var/state!
+diff --git a/feeds/luci/applications/luci-app-splash/root/etc/hotplug.d/iface/25-splash b/feeds/luci/applications/luci-app-splash/root/etc/hotplug.d/iface/25-splash
+new file mode 100644
+index 0000000..045e908
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/root/etc/hotplug.d/iface/25-splash
+@@ -0,0 +1,17 @@
++#!/bin/sh
++
++[ "$ACTION" = ifup ] || exit 0
++
++/etc/init.d/firewall enabled || exit 0
++
++if [ -x /etc/init.d/luci_splash ]; then
++ restart_splash() {
++ local net="$1"
++ if [ "$INTERFACE" = "$net" ]; then
++ logger -t splash "Reloading splash firewall rules due to ifup of $INTERFACE ($DEVICE)"
++ /etc/init.d/luci_splash restart
++ fi
++ }
++ config_load luci_splash
++ config_foreach restart_splash iface
++fi
+diff --git a/feeds/luci/applications/luci-app-splash/root/etc/init.d/luci_splash b/feeds/luci/applications/luci-app-splash/root/etc/init.d/luci_splash
+new file mode 100755
+index 0000000..feefabd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/root/etc/init.d/luci_splash
+@@ -0,0 +1,362 @@
++#!/bin/sh /etc/rc.common
++
++START=70
++EXTRA_COMMANDS=clear_leases
++LIMIT_DOWN=0
++LIMIT_DOWN_BURST=0
++LIMIT_UP=0
++TC=/usr/sbin/tc
++IPT=/usr/sbin/iptables
++IPT6=/usr/sbin/ip6tables
++
++IPT_REPLAY=/var/run/luci_splash.iptlog
++LOCK=/var/run/luci_splash.lock
++[ -x $IPT6 ] && [ -f /proc/net/ipv6_route ] && HAS_IPV6=1
++
++silent() {
++ "$@" 2>/dev/null
++}
++
++ipt_log() {
++ $IPT -I "$@"
++ echo $IPT -D "$@" >> $IPT_REPLAY
++}
++
++ipt6_log() {
++ [ "$HAS_IPV6" = 1 ] || return
++ $IPT6 -I "$@"
++ echo $IPT6 -D "$@" >> $IPT_REPLAY
++}
++
++
++iface_add() {
++ local cfg="$1"
++
++ config_get zone "$cfg" zone
++ [ -n "$zone" ] || return 0
++
++ config_get net "$cfg" network
++ [ -n "$net" ] || return 0
++
++ config_get ifname "$net" ifname
++ [ -n "$ifname" ] || return 0
++
++ config_get ipaddr "$net" ipaddr
++ [ -n "$ipaddr" ] || return 0
++
++ config_get netmask "$net" netmask
++ [ -n "$netmask" ] || return 0
++
++ config_get ip6addr "$net" ip6addr
++
++ config_get type "$net" type
++
++ parentiface="$(uci -q get network.${net}.ifname)"
++
++ [ -n "$parentiface" ] && [ ! "$type" = "bridge" ] && {
++ parentiface=${parentiface#@}
++ config_get parentproto "$parentiface" proto
++ config_get parentipaddr "$parentiface" ipaddr
++ config_get parentnetmask "$parentiface" netmask
++ }
++
++ eval "$(ipcalc.sh $ipaddr $netmask)"
++
++ logger -s -p info -t splash "Add $NETWORK/$PREFIX ($ifname) to splashed networks."
++
++ ### Add interface specific chain entry rules
++ ipt_log "prerouting_${zone}_rule" -i "${ifname%:*}" -s "$NETWORK/$PREFIX" -j luci_splash_prerouting -t nat
++ ipt_log "forwarding_${zone}_rule" -i "${ifname%:*}" -s "$NETWORK/$PREFIX" -j luci_splash_forwarding -t filter
++
++ if [ "$HAS_IPV6" = 1 ] && [ -n "$ip6addr" ]; then
++ ipt6_log "forwarding_${zone}_rule" -i "${ifname%:*}" -s "$ip6addr" -j luci_splash_forwarding -t filter
++ fi
++
++ ### Allow traffic to the same subnet
++ $IPT -t nat -I luci_splash_prerouting -d "$ipaddr/${netmask:-32}" -j RETURN
++ $IPT -t filter -I luci_splash_forwarding -d "$ipaddr/${netmask:-32}" -j RETURN
++
++ ### Allow traffic to the mesh subnet
++ [ "$parentproto" = "static" -a -n "$parentipaddr" ] && {
++ $IPT -t nat -I luci_splash_prerouting -d "$parentipaddr/${parentnetmask:-32}" -j RETURN
++ $IPT -t filter -I luci_splash_forwarding -d "$parentipaddr/${parentnetmask:-32}" -j RETURN
++ }
++
++ qos_iface_add "$ifname" "$NETWORK" "$PREFIX"
++}
++
++iface_del() {
++ config_get zone "$1" zone
++ [ -n "$zone" ] || return 0
++
++ config_get net "$1" network
++ [ -n "$net" ] || return 0
++
++ config_get ifname "$net" ifname
++ [ -n "$ifname" ] || return 0
++
++ # Clear interface specific rules
++ [ -s $IPT_REPLAY ] && {
++ logger -s -p info -t splash "Remove $ifname from splashed networks."
++ grep -- "-i ${ifname%:*}" $IPT_REPLAY | while read ln; do silent $ln; done
++ sed -ie "/-i ${ifname%:*}/d" $IPT_REPLAY
++ }
++
++ qos_iface_del "$ifname"
++}
++
++mac_add() {
++ config_get mac "$1" mac
++ append MACS "$mac"
++}
++
++whitelist_add() {
++ config_get mac "$1" mac
++ iface=$2
++ $TC filter add dev "$iface" parent ffff: protocol ip prio 1 u32 match ether src $mac police pass
++ $TC filter add dev "$iface" parent 1:0 protocol ip prio 1 u32 match ether dst $mac classid 1:1
++}
++
++
++subnet_add() {
++ local cfg="$1"
++
++ config_get ipaddr "$cfg" ipaddr
++ config_get netmask "$cfg" netmask
++
++ [ -n "$ipaddr" ] && {
++ $IPT -t nat -I luci_splash_prerouting -d "$ipaddr/${netmask:-32}" -j RETURN
++ $IPT -t filter -I luci_splash_forwarding -d "$ipaddr/${netmask:-32}" -j RETURN
++ }
++}
++
++qos_iface_add() {
++ local iface="$1"
++ local network="$2"
++ local prefix="$3"
++
++ # 77 -> download root qdisc
++ # ffff -> upload root qdisc
++
++ silent $TC qdisc del dev "$iface" root handle 1:
++ silent $TC class del dev "$iface" parent 1: classid 1:ffff
++ silent $TC class del dev "$iface" parent 1: classid 1:1
++ silent $TC filter del dev "$iface" parent ffff: protocol ip prio 1 u32
++ silent $TC filter del dev "$iface" parent ffff: protocol ip prio 2 u32
++ silent $TC filter del dev "$iface" parent ffff: protocol ip prio 3 u32
++
++ if [ "$LIMIT_UP" -gt 0 -a "$LIMIT_DOWN" -gt 0 ]; then
++ # Setup qdiscs
++ $TC qdisc add dev "$iface" root handle 1: htb default 1
++ silent $TC qdisc add dev "$iface" ingress
++
++ # Default class - all clients which are not otherwise handled are put in that class
++ # and share that bandwidth.
++ $TC class add dev "$iface" parent 1: classid 1:ffff htb rate ${LIMIT_DOWN}kbit
++
++ # default class and class for whitelisted clients = unlimited
++ $TC class add dev "$iface" parent 1: classid 1:1 htb rate 100mbit
++
++ # All traffic to the dhcp subnet is put into the limited class
++ $TC filter add dev "$iface" parent 1:0 protocol ip prio 3 u32 match ip dst $network/$prefix classid 1:ffff
++ $TC qdisc add dev "$iface" parent 1:ffff sfq perturb 10
++ $TC filter add dev "$iface" parent ffff: protocol ip prio 3 u32 match ip src $network/$prefix police rate ${LIMIT_UP}kbit mtu 6k burst 6k drop
++
++ # classify packets by their iptables MARK set in luci_splash_mark_in (mangle table)
++ # every client gets his own class and so his own bandwidth limit
++ $TC filter add dev "$iface" parent 1:0 protocol ip prio 2 fw
++
++ config_foreach whitelist_add whitelist $iface
++ fi
++}
++
++qos_iface_del() {
++ local iface="$1"
++ silent $TC qdisc del dev "$iface" root handle 77:
++}
++
++boot() {
++ ### Setup splash-relay
++ uci get uhttpd.splash 2>/dev/null || {
++uci batch <<EOF
++ set uhttpd.splash=uhttpd
++ set uhttpd.splash.home="/www/cgi-bin/splash/"
++ set uhttpd.splash.interpreter=".sh=/bin/ash"
++ set uhttpd.splash.listen_http="8082"
++ set uhttpd.splash.index_page="splash.sh"
++ set uhttpd.splash.error_page="/splash.sh"
++ set uhttpd.splash.http_keepalive='0'
++ commit uhttpd
++EOF
++ }
++
++ ### We are started by the firewall include
++ exit 0
++}
++
++start() {
++ lock $LOCK
++ logger -s -p info -t splash "Starting luci-splash"
++ include /lib/network
++ . /lib/functions/network.sh
++ scan_interfaces
++ config_load luci_splash
++
++ ### Find QoS limits
++ config_get LIMIT_UP general limit_up
++ config_get LIMIT_DOWN general limit_down
++ config_get LIMIT_DOWN_BURST general limit_down_burst
++
++ LIMIT_UP="$((8*${LIMIT_UP:-0}))"
++ LIMIT_DOWN="$((8*${LIMIT_DOWN:-0}))"
++ LIMIT_DOWN_BURST="${LIMIT_DOWN_BURST:+$((8*$LIMIT_DOWN_BURST))}"
++ LIMIT_DOWN_BURST="${LIMIT_DOWN_BURST:-$(($LIMIT_DOWN / 5 * 6))}"
++
++ ### Load required modules
++ [ "$LIMIT_UP" -gt 0 -a "$LIMIT_DOWN" -gt 0 ] && {
++ silent insmod act_police
++ silent insmod cls_fw
++ silent insmod cls_u32
++ silent insmod sch_htb
++ silent insmod sch_sfq
++ silent insmod sch_ingress
++ }
++
++ ### Create subchains
++ $IPT -t nat -N luci_splash_prerouting
++ $IPT -t nat -N luci_splash_leases
++ $IPT -t filter -N luci_splash_forwarding
++ $IPT -t filter -N luci_splash_filter
++
++ if [ "$HAS_IPV6" = 1 ]; then
++ $IPT6 -t filter -N luci_splash_forwarding
++ $IPT6 -t filter -N luci_splash_filter
++ fi
++
++ ### Clear iptables replay log
++ [ -s $IPT_REPLAY ] && . $IPT_REPLAY
++ echo -n > $IPT_REPLAY
++
++ ### Add interface independant prerouting rules
++ $IPT -t nat -A luci_splash_prerouting -j luci_splash_leases
++ $IPT -t nat -A luci_splash_leases -p udp --dport 53 -j REDIRECT --to-ports 53
++ $IPT -t nat -A luci_splash_leases -p tcp --dport 80 -j REDIRECT --to-ports 8082
++
++ ### Add interface independant forwarding rules
++ $IPT -t filter -A luci_splash_forwarding -j luci_splash_filter
++ $IPT -t filter -A luci_splash_filter -p tcp -j REJECT --reject-with tcp-reset
++ $IPT -t filter -A luci_splash_filter -j REJECT --reject-with icmp-net-prohibited
++
++ if [ "$HAS_IPV6" = 1 ]; then
++ $IPT6 -t filter -A luci_splash_forwarding -j luci_splash_filter
++ $IPT6 -t filter -A luci_splash_filter -p tcp -j REJECT --reject-with tcp-reset
++ $IPT6 -t filter -A luci_splash_filter -j REJECT --reject-with adm-prohibited
++ fi
++
++ ### Add QoS chain
++ $IPT -t mangle -N luci_splash_mark_out
++ $IPT -t mangle -N luci_splash_mark_in
++ $IPT -t mangle -I PREROUTING -j luci_splash_mark_out
++ $IPT -t mangle -I POSTROUTING -j luci_splash_mark_in
++
++ if [ "$HAS_IPV6" = 1 ]; then
++ $IPT6 -t mangle -N luci_splash_mark_out
++ $IPT6 -t mangle -N luci_splash_mark_in
++ $IPT6 -t mangle -I PREROUTING -j luci_splash_mark_out
++ $IPT6 -t mangle -I POSTROUTING -j luci_splash_mark_in
++ fi
++
++ ### Build the main and portal rule
++ config_foreach iface_add iface
++ config_foreach subnet_add subnet
++
++ ### Add the community homepage to the list of allowed destination subnets
++ hp=$(uci -q get freifunk.community.homepage) && {
++ chp=${hp#http*://}
++ chp=${chp%%/*}
++ $IPT -t nat -I luci_splash_prerouting -d "${chp}/32" -j RETURN
++ $IPT -t filter -I luci_splash_forwarding -d "${chp}/32" -j RETURN
++ }
++
++ ### Find active mac addresses
++ MACS=""
++
++
++ config_foreach mac_add blacklist
++ config_foreach mac_add whitelist
++
++ config_load luci_splash_leases
++ config_foreach mac_add lease
++
++ ### Add crontab entry
++ test -f /etc/crontabs/root || touch /etc/crontabs/root
++ grep -q luci-splash /etc/crontabs/root || {
++ echo '*/5 * * * * /usr/sbin/luci-splash sync' >> /etc/crontabs/root
++ }
++
++ lock -u $LOCK
++
++ ### Populate iptables
++ [ -n "$MACS" ] && luci-splash add-rules $MACS
++}
++
++stop() {
++ lock $LOCK
++
++ include /lib/network
++ scan_interfaces
++ config_load luci_splash
++
++ ### Clear interface rules
++ config_foreach iface_del iface
++
++ silent $IPT -t mangle -D PREROUTING -j luci_splash_mark_out
++ silent $IPT -t mangle -D POSTROUTING -j luci_splash_mark_in
++
++ if [ "$HAS_IPV6" = 1 ]; then
++ silent $IPT6 -t mangle -D PREROUTING -j luci_splash_mark_out
++ silent $IPT6 -t mangle -D POSTROUTING -j luci_splash_mark_in
++ fi
++
++ ### Clear subchains
++ silent $IPT -t nat -F luci_splash_prerouting
++ silent $IPT -t nat -F luci_splash_leases
++ silent $IPT -t filter -F luci_splash_forwarding
++ silent $IPT -t filter -F luci_splash_filter
++ silent $IPT -t mangle -F luci_splash_mark_out
++ silent $IPT -t mangle -F luci_splash_mark_in
++
++ if [ "$HAS_IPV6" = 1 ]; then
++ $IPT6 -t filter -F luci_splash_forwarding
++ $IPT6 -t filter -F luci_splash_filter
++ $IPT6 -t mangle -F luci_splash_mark_out
++ $IPT6 -t mangle -F luci_splash_mark_in
++ fi
++
++ ### Delete subchains
++ silent $IPT -t nat -X luci_splash_prerouting
++ silent $IPT -t nat -X luci_splash_leases
++ silent $IPT -t filter -X luci_splash_forwarding
++ silent $IPT -t filter -X luci_splash_filter
++ silent $IPT -t mangle -X luci_splash_mark_out
++ silent $IPT -t mangle -X luci_splash_mark_in
++ if [ "$HAS_IPV6" = 1 ]; then
++ $IPT6 -t filter -X luci_splash_forwarding
++ $IPT6 -t filter -X luci_splash_filter
++ $IPT6 -t mangle -X luci_splash_mark_out
++ $IPT6 -t mangle -X luci_splash_mark_in
++ fi
++ sed -ie '/\/usr\/sbin\/luci-splash sync/d' /var/spool/cron/crontabs/root
++
++ lock -u $LOCK
++}
++
++clear_leases() {
++ ### Find active mac addresses
++ MACS=""
++ config_foreach mac_add lease
++
++ ### Clear leases
++ [ -n "$MACS" ] && luci-splash remove $MACS
++}
++
+diff --git a/feeds/luci/applications/luci-app-splash/root/usr/sbin/luci-splash b/feeds/luci/applications/luci-app-splash/root/usr/sbin/luci-splash
+new file mode 100755
+index 0000000..2870dbe
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-splash/root/usr/sbin/luci-splash
+@@ -0,0 +1,753 @@
++#!/usr/bin/lua
++
++utl = require "luci.util"
++sys = require "luci.sys"
++ipc = require "luci.ip"
++
++
++-- Init state session
++local uci = require "luci.model.uci".cursor_state()
++local ipt = require "luci.sys.iptparser".IptParser()
++local fs = require "nixio.fs"
++local ip = require "luci.ip"
++
++local debug = false
++
++local has_ipv6 = fs.access("/proc/net/ipv6_route") and fs.access("/usr/sbin/ip6tables")
++
++function exec(cmd)
++ -- executes a cmd and gets its output
++ if debug then
++ local ret = sys.exec(cmd)
++ print('+ ' .. cmd)
++ if ret and ret ~= "" then
++ print(ret)
++ end
++ else
++ local ret = sys.exec(cmd .. " &> /dev/null")
++ end
++end
++
++function call(cmd)
++ -- just calls a command
++ if debug then
++ print('+ ' .. cmd)
++ end
++ os.execute(cmd)
++end
++
++
++function lock()
++ call("lock /var/run/luci_splash.lock")
++end
++
++function unlock()
++ call("lock -u /var/run/luci_splash.lock")
++end
++
++function get_id(ip)
++ local o3, o4 = ip:match("[0-9]+%.[0-9]+%.([0-9]+)%.([0-9]+)")
++ if o3 and 04 then
++ return string.format("%02X%s", tonumber(o3), "") .. string.format("%02X%s", tonumber(o4), "")
++ else
++ return false
++ end
++end
++
++function update_stats(leased, whitelisted, whitelisttotal, blacklisted, blacklisttotal)
++ local leases = uci:get_all("luci_splash_leases", "stats")
++ uci:delete("luci_splash_leases", "stats")
++ uci:section("luci_splash_leases", "stats", "stats", {
++ leases = leased or (leases and leases.leases) or 0,
++ whitelisttotal = whitelisttotal or (leased and leases.whitelisttotal) or 0,
++ whitelistonline = whitelisted or (leases and leases.whitelistonline) or 0,
++ blacklisttotal = blacklisttotal or (leases and leases.blacklisttotal) or 0,
++ blacklistonline = blacklisted or (leases and leases.blacklistonline) or 0,
++ })
++ uci:save("luci_splash_leases")
++end
++
++
++function get_device_for_ip(ipaddr)
++ local dev
++ uci:foreach("network", "interface", function(s)
++ if s.ipaddr and s.netmask then
++ local network = ip.IPv4(s.ipaddr, s.netmask)
++ if network:contains(ip.IPv4(ipaddr)) then
++ -- this should be rewritten to luci functions if possible
++ dev = utl.trim(sys.exec(". /lib/functions/network.sh; network_get_device IFNAME '" .. s['.name'] .. "'; echo $IFNAME"))
++ end
++ end
++ end)
++ return dev
++end
++
++function get_physdev(interface)
++ local dev
++ dev = utl.trim(sys.exec(". /lib/functions/network.sh; network_get_device IFNAME '" .. interface .. "'; echo $IFNAME"))
++ return dev
++end
++
++
++
++function get_filter_handle(parent, direction, device, mac)
++ local input = utl.split(sys.exec('/usr/sbin/tc filter show dev ' .. device .. ' parent ' .. parent) or {})
++ local tbl = {}
++ local handle
++ for k, v in pairs(input) do
++ handle = v:match('filter protocol ip pref %d+ u32 fh (%d*:%d*:%d*) order') or v:match('filter protocol all pref %d+ u32 fh (%d*:%d*:%d*) order')
++ if handle then
++ local mac, mac1, mac2, mac3, mac4, mac5, mac6
++ if direction == 'src' then
++ mac1, mac2, mac3, mac4 = input[k+1]:match('match ([%a%d][%a%d])([%a%d][%a%d])([%a%d][%a%d])([%a%d][%a%d])/ffffffff')
++ mac5, mac6 = input[k+2]:match('match ([%a%d][%a%d])([%a%d][%a%d])0000/ffff0000')
++ else
++ mac1, mac2 = input[k+1]:match('match 0000([%a%d][%a%d])([%a%d][%a%d])/0000ffff')
++ mac3, mac4, mac5, mac6 = input[k+2]:match('match ([%a%d][%a%d])([%a%d][%a%d])([%a%d][%a%d])([%a%d][%a%d])/ffffffff')
++ end
++ if mac1 and mac2 and mac3 and mac4 and mac5 and mac6 then
++ mac = "%s:%s:%s:%s:%s:%s" % { mac1, mac2, mac3, mac4, mac5, mac6 }
++ tbl[mac] = handle
++ end
++ end
++ end
++ if tbl[mac] then
++ handle = tbl[mac]
++ end
++ return handle
++end
++
++function macvalid(mac)
++ if mac and mac:match(
++ "^[a-fA-F0-9][a-fA-F0-9]:[a-fA-F0-9][a-fA-F0-9]:" ..
++ "[a-fA-F0-9][a-fA-F0-9]:[a-fA-F0-9][a-fA-F0-9]:" ..
++ "[a-fA-F0-9][a-fA-F0-9]:[a-fA-F0-9][a-fA-F0-9]$"
++ ) then
++ return true
++ end
++
++ return false
++end
++
++function ipvalid(ipaddr)
++ if ipaddr then
++ return ip.IPv4(ipaddr) and true or false
++ end
++
++ return false
++end
++
++function mac_to_ip(mac)
++ local ipaddr = nil
++ ipc.neighbors({ family = 4 }, function(n)
++ if n.mac == mac and n.dest then
++ ipaddr = n.dest:string()
++ end
++ end)
++ return ipaddr
++end
++
++function mac_to_dev(mac)
++ local dev = nil
++ ipc.neighbors({ family = 4 }, function(n)
++ if n.mac == mac and n.dev then
++ dev = n.dev
++ end
++ end)
++ return dev
++end
++
++function ip_to_mac(ip)
++ local mac = nil
++ ipc.neighbors({ family = 4 }, function(n)
++ if n.mac and n.dest and n.dest:equal(ip) then
++ mac = n.mac
++ end
++ end)
++ return mac
++end
++
++function main(argv)
++ local cmd = table.remove(argv, 1)
++ local arg = argv[1]
++
++ limit_up = (tonumber(uci:get("luci_splash", "general", "limit_up")) or 0) * 8
++ limit_down = (tonumber(uci:get("luci_splash", "general", "limit_down")) or 0) * 8
++
++ if ( cmd == "lease" or cmd == "add-rules" or cmd == "remove" or
++ cmd == "whitelist" or cmd == "blacklist" or cmd == "status" ) and #argv > 0
++ then
++ if not (macvalid(arg) or ipvalid(arg)) then
++ print("Invalid argument. The second argument must " ..
++ "be a valid IPv4 or Mac Address.")
++ os.exit(1)
++ end
++
++ lock()
++
++ local leased_macs = get_known_macs("lease")
++ local blacklist_macs = get_known_macs("blacklist")
++ local whitelist_macs = get_known_macs("whitelist")
++
++ for i, adr in ipairs(argv) do
++ local mac = nil
++ if adr:find(":") then
++ mac = adr:lower()
++ else
++ mac = ip_to_mac(adr)
++ end
++
++ if mac and cmd == "add-rules" then
++ if leased_macs[mac] then
++ add_lease(mac, true)
++ elseif blacklist_macs[mac] then
++ add_blacklist_rule(mac)
++ elseif whitelist_macs[mac] then
++ add_whitelist_rule(mac)
++ end
++ elseif mac and cmd == "status" then
++ print(leased_macs[mac] and "lease"
++ or whitelist_macs[mac] and "whitelist"
++ or blacklist_macs[mac] and "blacklist"
++ or "new")
++ elseif mac and ( cmd == "whitelist" or cmd == "blacklist" or cmd == "lease" ) then
++ if cmd ~= "lease" and leased_macs[mac] then
++ print("Removing %s from leases" % mac)
++ remove_lease(mac)
++ leased_macs[mac] = nil
++ end
++
++ if cmd ~= "whitelist" and whitelist_macs[mac] then
++ if cmd == "lease" then
++ print('%s is whitelisted. Remove it before you can lease it.' % mac)
++ else
++ print("Removing %s from whitelist" % mac)
++ remove_whitelist(mac)
++ whitelist_macs[mac] = nil
++ end
++ end
++
++ if cmd == "whitelist" and leased_macs[mac] then
++ print("Removing %s from leases" % mac)
++ remove_lease(mac)
++ leased_macs[mac] = nil
++ end
++
++ if cmd ~= "blacklist" and blacklist_macs[mac] then
++ print("Removing %s from blacklist" % mac)
++ remove_blacklist(mac)
++ blacklist_macs[mac] = nil
++ end
++
++ if cmd == "lease" and not leased_macs[mac] then
++ if not whitelist_macs[mac] then
++ print("Adding %s to leases" % mac)
++ add_lease(mac)
++ leased_macs[mac] = true
++ end
++ elseif cmd == "whitelist" and not whitelist_macs[mac] then
++ print("Adding %s to whitelist" % mac)
++ add_whitelist(mac)
++ whitelist_macs[mac] = true
++ elseif cmd == "blacklist" and not blacklist_macs[mac] then
++ print("Adding %s to blacklist" % mac)
++ add_blacklist(mac)
++ blacklist_macs[mac] = true
++ else
++ print("The mac %s is already %sed" %{ mac, cmd })
++ end
++ elseif mac and cmd == "remove" then
++ if leased_macs[mac] then
++ print("Removing %s from leases" % mac)
++ remove_lease(mac)
++ leased_macs[mac] = nil
++ elseif whitelist_macs[mac] then
++ print("Removing %s from whitelist" % mac)
++ remove_whitelist(mac)
++ whitelist_macs[mac] = nil
++ elseif blacklist_macs[mac] then
++ print("Removing %s from blacklist" % mac)
++ remove_blacklist(mac)
++ blacklist_macs[mac] = nil
++ else
++ print("The mac %s is not known" % mac)
++ end
++
++ else
++ print("Can not find mac for ip %s" % argv[i])
++ end
++ end
++ unlock()
++ os.exit(0)
++ elseif cmd == "sync" then
++ sync()
++ os.exit(0)
++ elseif cmd == "list" then
++ list()
++ os.exit(0)
++ else
++ print("Usage:")
++ print("\n luci-splash list\n List connected, black- and whitelisted clients")
++ print("\n luci-splash sync\n Synchronize firewall rules and clear expired leases")
++ print("\n luci-splash lease <MAC-or-IP>\n Create a lease for the given address")
++ print("\n luci-splash blacklist <MAC-or-IP>\n Add given address to blacklist")
++ print("\n luci-splash whitelist <MAC-or-IP>\n Add given address to whitelist")
++ print("\n luci-splash remove <MAC-or-IP>\n Remove given address from the lease-, black- or whitelist")
++ print("")
++
++ os.exit(1)
++ end
++end
++
++-- Get a list of known mac addresses
++function get_known_macs(list)
++ local leased_macs = { }
++
++ if not list or list == "lease" then
++ uci:foreach("luci_splash_leases", "lease", function(s)
++ if s.mac then
++ leased_macs[s.mac:lower()] = true
++ end
++ end)
++ end
++
++ if not list or list == "whitelist" then
++ uci:foreach("luci_splash", "whitelist", function(s)
++ if s.mac then
++ leased_macs[s.mac:lower()] = true
++ end
++ end)
++ end
++
++ if not list or list == "blacklist" then
++ uci:foreach("luci_splash", "blacklist", function(s)
++ if s.mac then
++ leased_macs[s.mac:lower()] = true
++ end
++ end)
++ end
++ return leased_macs
++end
++
++
++-- Helper to delete iptables rules
++function ipt_delete_all(args, comp, off)
++ off = off or { }
++ for i, r in ipairs(ipt:find(args)) do
++ if comp == nil or comp(r) then
++ off[r.table] = off[r.table] or { }
++ off[r.table][r.chain] = off[r.table][r.chain] or 0
++
++ exec("iptables -t %q -D %q %d 2>/dev/null"
++ %{ r.table, r.chain, r.index - off[r.table][r.chain] })
++
++ off[r.table][r.chain] = off[r.table][r.chain] + 1
++ end
++ end
++end
++
++function ipt6_delete_all(args, comp, off)
++ off = off or { }
++ for i, r in ipairs(ipt:find(args)) do
++ if comp == nil or comp(r) then
++ off[r.table] = off[r.table] or { }
++ off[r.table][r.chain] = off[r.table][r.chain] or 0
++
++ exec("ip6tables -t %q -D %q %d 2>/dev/null"
++ %{ r.table, r.chain, r.index - off[r.table][r.chain] })
++
++ off[r.table][r.chain] = off[r.table][r.chain] + 1
++ end
++ end
++end
++
++
++-- Convert mac to uci-compatible section name
++function convert_mac_to_secname(mac)
++ return string.gsub(mac, ":", "")
++end
++
++-- Add a lease to state and invoke add_rule
++function add_lease(mac, no_uci)
++ mac = mac:lower()
++
++ -- Get current ip address
++ local ipaddr = mac_to_ip(mac)
++
++ -- Add lease if there is an ip addr
++ if ipaddr then
++ local device = get_device_for_ip(ipaddr)
++ if not no_uci then
++ local leased = uci:get("luci_splash_leases", "stats", "leases")
++ if type(tonumber(leased)) == "number" then
++ update_stats(leased + 1, nil, nil, nil, nil)
++ end
++
++ uci:section("luci_splash_leases", "lease", convert_mac_to_secname(mac), {
++ mac = mac,
++ ipaddr = ipaddr,
++ device = device,
++ limit_up = limit_up,
++ limit_down = limit_down,
++ start = os.time()
++ })
++ uci:save("luci_splash_leases")
++ end
++ add_lease_rule(mac, ipaddr, device)
++ else
++ print("Found no active IP for %s, lease not added" % mac)
++ end
++end
++
++
++-- Remove a lease from state and invoke remove_rule
++function remove_lease(mac)
++ mac = mac:lower()
++
++ uci:delete_all("luci_splash_leases", "lease",
++ function(s)
++ if s.mac:lower() == mac then
++
++ local leased = uci:get("luci_splash_leases", "stats", "leases")
++ if type(tonumber(leased)) == "number" and tonumber(leased) > 0 then
++ update_stats(leased - 1, nil, nil, nil, nil)
++ end
++ remove_lease_rule(mac, s.ipaddr, s.device, tonumber(s.limit_up), tonumber(s.limit_down))
++ return true
++ end
++ return false
++ end)
++
++ uci:save("luci_splash_leases")
++end
++
++
++-- Add a whitelist entry
++function add_whitelist(mac)
++ uci:section("luci_splash", "whitelist", convert_mac_to_secname(mac), { mac = mac })
++ uci:save("luci_splash")
++ uci:commit("luci_splash")
++ add_whitelist_rule(mac)
++end
++
++
++-- Add a blacklist entry
++function add_blacklist(mac)
++ uci:section("luci_splash", "blacklist", convert_mac_to_secname(mac), { mac = mac })
++ uci:save("luci_splash")
++ uci:commit("luci_splash")
++ add_blacklist_rule(mac)
++end
++
++
++-- Remove a whitelist entry
++function remove_whitelist(mac)
++ mac = mac:lower()
++ uci:delete_all("luci_splash", "whitelist",
++ function(s) return not s.mac or s.mac:lower() == mac end)
++ uci:save("luci_splash")
++ uci:commit("luci_splash")
++ remove_lease_rule(mac)
++ remove_whitelist_tc(mac)
++end
++
++function remove_whitelist_tc(mac)
++ uci:foreach("luci_splash", "iface", function(s)
++ local device = get_physdev(s['.name'])
++ if device and device ~= "" then
++ if debug then
++ print("Removing whitelist filters for %s interface %s." % {mac, device})
++ end
++ local handle = get_filter_handle('ffff:', 'src', device, mac)
++ if handle then
++ exec('tc filter del dev "%s" parent ffff: protocol ip prio 1 handle %s u32' % { device, handle })
++ else
++ print('Warning! Could not get a handle for %s parent :ffff on interface %s' % { mac, device })
++ end
++ local handle = get_filter_handle('1:', 'dest', device, mac)
++ if handle then
++ exec('tc filter del dev "%s" parent 1:0 protocol ip prio 1 handle %s u32' % { device, handle })
++ else
++ print('Warning! Could not get a handle for %s parent 1:0 on interface %s' % { mac, device })
++ end
++ end
++ end)
++end
++
++-- Remove a blacklist entry
++function remove_blacklist(mac)
++ mac = mac:lower()
++ uci:delete_all("luci_splash", "blacklist",
++ function(s) return not s.mac or s.mac:lower() == mac end)
++ uci:save("luci_splash")
++ uci:commit("luci_splash")
++ remove_lease_rule(mac)
++end
++
++
++-- Add an iptables rule
++function add_lease_rule(mac, ipaddr, device)
++ local id
++ if ipaddr then
++ id = get_id(ipaddr)
++ end
++
++ exec("iptables -t mangle -I luci_splash_mark_out -m mac --mac-source %q -j RETURN" % mac)
++
++ -- Mark incoming packets to a splashed host
++ -- for ipv4 - by iptables and destination
++ if id and device then
++ exec("iptables -t mangle -I luci_splash_mark_in -d %q -j MARK --set-mark 0x1%s -m comment --comment %s" % {ipaddr, id, mac:upper()})
++ end
++
++ --for ipv6: need to use the mac here
++
++ if has_ipv6 then
++ exec("ip6tables -t mangle -I luci_splash_mark_out -m mac --mac-source %q -j MARK --set-mark 79" % mac)
++ if id and device and tonumber(limit_down) then
++ exec("tc filter add dev %s parent 1:0 protocol ipv6 prio 1 u32 match ether dst %s classid 1:%s" % {device, mac:lower(), id})
++ end
++ end
++
++
++ if device and tonumber(limit_up) > 0 then
++ exec('tc filter add dev "%s" parent ffff: protocol all prio 2 u32 match ether src %s police rate %skbit mtu 6k burst 6k drop' % {device, mac, limit_up})
++ end
++
++ if id and device and tonumber(limit_down) > 0 then
++ exec("tc class add dev %s parent 1: classid 1:0x%s htb rate %skbit" % { device, id, limit_down })
++ exec("tc qdisc add dev %s parent 1:%s sfq perturb 10" % { device, id })
++ end
++
++ exec("iptables -t filter -I luci_splash_filter -m mac --mac-source %q -j RETURN" % mac)
++ exec("iptables -t nat -I luci_splash_leases -m mac --mac-source %q -j RETURN" % mac)
++ if has_ipv6 then
++ exec("ip6tables -t filter -I luci_splash_filter -m mac --mac-source %q -j RETURN" % mac)
++ end
++end
++
++
++-- Remove lease, black- or whitelist rules
++function remove_lease_rule(mac, ipaddr, device, limit_up, limit_down)
++
++ local id
++ if ipaddr then
++ id = get_id(ipaddr)
++ end
++
++ ipt:resync()
++ ipt_delete_all({table="mangle", chain="luci_splash_mark_in", options={"/*", mac:upper()}})
++ ipt_delete_all({table="mangle", chain="luci_splash_mark_out", options={"MAC", mac:upper()}})
++ ipt_delete_all({table="filter", chain="luci_splash_filter", options={"MAC", mac:upper()}})
++ ipt_delete_all({table="nat", chain="luci_splash_leases", options={"MAC", mac:upper()}})
++ if has_ipv6 then
++ ipt6_delete_all({table="mangle", chain="luci_splash_mark_out", options={"MAC", mac:upper()}})
++ ipt6_delete_all({table="filter", chain="luci_splash_filter", options={"MAC", mac:upper()}})
++ end
++
++ if device and tonumber(limit_up) > 0 then
++ local handle = get_filter_handle('ffff:', 'src', device, mac)
++ if handle then
++ exec('tc filter del dev "%s" parent ffff: protocol all prio 2 handle %s u32 police rate %skbit mtu 6k burst 6k drop' % {device, handle, limit_up})
++ else
++ print('Warning! Could not get a handle for %s parent :ffff on interface %s' % { mac, device })
++ end
++ end
++ -- remove clients class
++ if device and id then
++ exec('tc class del dev "%s" classid 1:%s' % {device, id})
++ exec('tc filter del dev "%s" parent 1:0 prio 1' % device) -- ipv6 rule
++ --exec('tc qdisc del dev "%s" parent 1:%s sfq perturb 10' % { device, id })
++ end
++end
++
++
++-- Add whitelist rules
++function add_whitelist_rule(mac)
++ exec("iptables -t filter -I luci_splash_filter -m mac --mac-source %q -j RETURN" % mac)
++ exec("iptables -t nat -I luci_splash_leases -m mac --mac-source %q -j RETURN" % mac)
++ if has_ipv6 then
++ exec("ip6tables -t filter -I luci_splash_filter -m mac --mac-source %q -j RETURN" % mac)
++ end
++ uci:foreach("luci_splash", "iface", function(s)
++ local device = get_physdev(s['.name'])
++ if device and device ~= "" then
++ exec('tc filter add dev "%s" parent ffff: protocol ip prio 1 u32 match ether src %s police pass' % { device, mac })
++ exec('tc filter add dev "%s" parent 1:0 protocol ip prio 1 u32 match ether dst %s classid 1:1' % { device, mac })
++ end
++ end)
++end
++
++
++-- Add blacklist rules
++function add_blacklist_rule(mac)
++ exec("iptables -t filter -I luci_splash_filter -m mac --mac-source %q -j DROP" % mac)
++ if has_ipv6 then
++ exec("ip6tables -t filter -I luci_splash_filter -m mac --mac-source %q -j DROP" % mac)
++ end
++end
++
++
++-- Synchronise leases, remove abandoned rules
++function sync()
++ lock()
++
++ local time = os.time()
++
++ -- Current leases in state files
++ local leases = uci:get_all("luci_splash_leases")
++
++ -- Convert leasetime to seconds
++ local leasetime = tonumber(uci:get("luci_splash", "general", "leasetime")) * 3600
++
++ -- Clean state file
++ uci:load("luci_splash_leases")
++ uci:revert("luci_splash_leases")
++
++
++ local blackwhitelist = uci:get_all("luci_splash")
++ local whitelist_total = 0
++ local whitelist_online = 0
++ local blacklist_total = 0
++ local blacklist_online = 0
++ local leasecount = 0
++ local leases_online = 0
++
++ -- For all leases
++ for k, v in pairs(leases) do
++ if v[".type"] == "lease" then
++ if os.difftime(time, tonumber(v.start)) > leasetime then
++ -- Remove expired
++ remove_lease_rule(v.mac, v.ipaddr, v.device, tonumber(v.limit_up), tonumber(v.limit_down))
++ else
++ leasecount = leasecount + 1
++
++ -- only count leases_online for connected clients
++ if mac_to_ip(v.mac) then
++ leases_online = leases_online + 1
++ end
++
++ -- Rewrite state
++ uci:section("luci_splash_leases", "lease", convert_mac_to_secname(v.mac), {
++ mac = v.mac,
++ ipaddr = v.ipaddr,
++ device = v.device,
++ limit_up = limit_up,
++ limit_down = limit_down,
++ start = v.start
++ })
++ end
++ end
++ end
++
++ -- Whitelist, Blacklist
++ for _, s in utl.spairs(blackwhitelist,
++ function(a,b) return blackwhitelist[a][".type"] > blackwhitelist[b][".type"] end
++ ) do
++ if (s[".type"] == "whitelist") then
++ whitelist_total = whitelist_total + 1
++ if s.mac then
++ local mac = s.mac:lower()
++ if mac_to_ip(mac) then
++ whitelist_online = whitelist_online + 1
++ end
++ end
++ end
++ if (s[".type"] == "blacklist") then
++ blacklist_total = blacklist_total + 1
++ if s.mac then
++ local mac = s.mac:lower()
++ if mac_to_ip(mac) then
++ blacklist_online = blacklist_online + 1
++ end
++ end
++ end
++ end
++
++ -- ToDo:
++ -- include a new field "leases_online" in stats to differ between active clients and leases:
++ -- update_stats(leasecount, leases_online, whitelist_online, whitelist_total, blacklist_online, blacklist_total) later:
++ update_stats(leases_online, whitelist_online, whitelist_total, blacklist_online, blacklist_total)
++
++ uci:save("luci_splash_leases")
++
++ -- Get the mac addresses of current leases
++ local macs = get_known_macs()
++
++ ipt:resync()
++
++ ipt_delete_all({table="filter", chain="luci_splash_filter", options={"MAC"}},
++ function(r) return not macs[r.options[2]:lower()] end)
++ ipt_delete_all({table="nat", chain="luci_splash_leases", options={"MAC"}},
++ function(r) return not macs[r.options[2]:lower()] end)
++ ipt_delete_all({table="mangle", chain="luci_splash_mark_out", options={"MAC", "MARK", "set"}},
++ function(r) return not macs[r.options[2]:lower()] end)
++ ipt_delete_all({table="mangle", chain="luci_splash_mark_in", options={"/*", "MARK", "set"}},
++ function(r) return not macs[r.options[2]:lower()] end)
++
++
++ if has_ipv6 then
++ ipt6_delete_all({table="filter", chain="luci_splash_filter", options={"MAC"}},
++ function(r) return not macs[r.options[2]:lower()] end)
++ ipt6_delete_all({table="mangle", chain="luci_splash_mark_out", options={"MAC", "MARK", "set"}},
++ function(r) return not macs[r.options[2]:lower()] end)
++ end
++
++ unlock()
++end
++
++-- Show client info
++function list()
++ -- Find traffic usage
++ local function traffic(lease)
++ local traffic_in = 0
++ local traffic_out = 0
++
++ local rin = ipt:find({table="mangle", chain="luci_splash_mark_in", destination=lease.ipaddr})
++ local rout = ipt:find({table="mangle", chain="luci_splash_mark_out", options={"MAC", lease.mac:upper()}})
++
++ if rin and #rin > 0 then traffic_in = math.floor( rin[1].bytes / 1024) end
++ if rout and #rout > 0 then traffic_out = math.floor(rout[1].bytes / 1024) end
++
++ return traffic_in, traffic_out
++ end
++
++ -- Print listings
++ local leases = uci:get_all("luci_splash_leases")
++ local blackwhitelist = uci:get_all("luci_splash")
++
++ print(string.format(
++ "%-17s %-15s %-9s %-4s %-7s %20s",
++ "MAC", "IP", "State", "Dur.", "Intf.", "Traffic down/up"
++ ))
++
++ -- Leases
++ for _, s in pairs(leases) do
++ if s[".type"] == "lease" and s.mac then
++ local ti, to = traffic(s)
++ local mac = s.mac:lower()
++ print(string.format(
++ "%-17s %-15s %-9s %3dm %-7s %7dKB %7dKB",
++ mac, s.ipaddr, "leased",
++ math.floor(( os.time() - tonumber(s.start) ) / 60),
++ mac_to_dev(mac) or "?", ti, to
++ ))
++ end
++ end
++
++ -- Whitelist, Blacklist
++ for _, s in utl.spairs(blackwhitelist,
++ function(a,b) return blackwhitelist[a][".type"] > blackwhitelist[b][".type"] end
++ ) do
++ if (s[".type"] == "whitelist" or s[".type"] == "blacklist") and s.mac then
++ local mac = s.mac:lower()
++ print(string.format(
++ "%-17s %-15s %-9s %4s %-7s %9s %9s",
++ mac, mac_to_ip(mac) or "?", s[".type"],
++ "- ", mac_to_dev(mac) or "?", "-", "-"
++ ))
++ end
++ end
++end
++
++main(arg)
+diff --git a/feeds/luci/applications/luci-app-statistics/Makefile b/feeds/luci/applications/luci-app-statistics/Makefile
+new file mode 100644
+index 0000000..af07cfb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/Makefile
+@@ -0,0 +1,16 @@
++#
++# 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_TITLE:=LuCI Statistics Application
++LUCI_DEPENDS:= \
++ +collectd +rrdtool1 +collectd-mod-rrdtool +collectd-mod-iwinfo \
++ +collectd-mod-interface +collectd-mod-load +collectd-mod-network
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua b/feeds/luci/applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua
+new file mode 100644
+index 0000000..3f26aee
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua
+@@ -0,0 +1,201 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.luci_statistics.luci_statistics", package.seeall)
++
++function index()
++
++ require("nixio.fs")
++ require("luci.util")
++ require("luci.statistics.datatree")
++
++ -- override entry(): check for existance <plugin>.so where <plugin> is derived from the called path
++ function _entry( path, ... )
++ local file = path[5] or path[4]
++ if nixio.fs.access( "/usr/lib/collectd/" .. file .. ".so" ) then
++ entry( path, ... )
++ end
++ end
++
++ local labels = {
++ s_output = _("Output plugins"),
++ s_general = _("General plugins"),
++ s_network = _("Network plugins"),
++
++ conntrack = _("Conntrack"),
++ cpu = _("Processor"),
++ csv = _("CSV Output"),
++ df = _("Disk Space Usage"),
++ disk = _("Disk Usage"),
++ dns = _("DNS"),
++ email = _("Email"),
++ entropy = _("Entropy"),
++ exec = _("Exec"),
++ interface = _("Interfaces"),
++ iptables = _("Firewall"),
++ irq = _("Interrupts"),
++ iwinfo = _("Wireless"),
++ load = _("System Load"),
++ memory = _("Memory"),
++ netlink = _("Netlink"),
++ network = _("Network"),
++ nut = _("UPS"),
++ olsrd = _("OLSRd"),
++ openvpn = _("OpenVPN"),
++ ping = _("Ping"),
++ processes = _("Processes"),
++ rrdtool = _("RRDTool"),
++ sensors = _("Sensors"),
++ splash_leases = _("Splash Leases"),
++ tcpconns = _("TCP Connections"),
++ unixsock = _("UnixSock"),
++ uptime = _("Uptime")
++ }
++
++ -- our collectd menu
++ local collectd_menu = {
++ output = { "csv", "network", "rrdtool", "unixsock" },
++ general = { "cpu", "df", "disk", "email", "entropy", "exec", "irq", "load", "memory", "nut", "processes", "sensors", "uptime" },
++ network = { "conntrack", "dns", "interface", "iptables", "netlink", "olsrd", "openvpn", "ping", "splash_leases", "tcpconns", "iwinfo" }
++ }
++
++ -- create toplevel menu nodes
++ local st = entry({"admin", "statistics"}, template("admin_statistics/index"), _("Statistics"), 80)
++ st.index = true
++
++ entry({"admin", "statistics", "collectd"}, cbi("luci_statistics/collectd"), _("Setup"), 20).subindex = true
++
++
++ -- populate collectd plugin menu
++ local index = 1
++ for section, plugins in luci.util.kspairs( collectd_menu ) do
++ local e = entry(
++ { "admin", "statistics", "collectd", section },
++ firstchild(), labels["s_"..section], index * 10
++ )
++
++ e.index = true
++
++ for j, plugin in luci.util.vspairs( plugins ) do
++ _entry(
++ { "admin", "statistics", "collectd", section, plugin },
++ cbi("luci_statistics/" .. plugin ),
++ labels[plugin], j * 10
++ )
++ end
++
++ index = index + 1
++ end
++
++ -- output views
++ local page = entry( { "admin", "statistics", "graph" }, template("admin_statistics/index"), _("Graphs"), 10)
++ page.setuser = "nobody"
++ page.setgroup = "nogroup"
++
++ local vars = luci.http.formvalue(nil, true)
++ local span = vars.timespan or nil
++ local host = vars.host or nil
++
++ -- get rrd data tree
++ local tree = luci.statistics.datatree.Instance(host)
++
++ local _, plugin, idx
++ for _, plugin, idx in luci.util.vspairs( tree:plugins() ) do
++
++ -- get plugin instances
++ local instances = tree:plugin_instances( plugin )
++
++ -- plugin menu entry
++ entry(
++ { "admin", "statistics", "graph", plugin },
++ call("statistics_render"), labels[plugin], idx
++ ).query = { timespan = span , host = host }
++
++ -- if more then one instance is found then generate submenu
++ if #instances > 1 then
++ local _, inst, idx2
++ for _, inst, idx2 in luci.util.vspairs(instances) do
++ -- instance menu entry
++ entry(
++ { "admin", "statistics", "graph", plugin, inst },
++ call("statistics_render"), inst, idx2
++ ).query = { timespan = span , host = host }
++ end
++ end
++ end
++end
++
++function statistics_render()
++
++ require("luci.statistics.rrdtool")
++ require("luci.template")
++ require("luci.model.uci")
++
++ local vars = luci.http.formvalue()
++ local req = luci.dispatcher.context.request
++ local path = luci.dispatcher.context.path
++ local uci = luci.model.uci.cursor()
++ local spans = luci.util.split( uci:get( "luci_statistics", "collectd_rrdtool", "RRATimespans" ), "%s+", nil, true )
++ local span = vars.timespan or uci:get( "luci_statistics", "rrdtool", "default_timespan" ) or spans[1]
++ local host = vars.host or uci:get( "luci_statistics", "collectd", "Hostname" ) or luci.sys.hostname()
++ local opts = { host = vars.host }
++ local graph = luci.statistics.rrdtool.Graph( luci.util.parse_units( span ), opts )
++ local hosts = graph.tree:host_instances()
++
++ local is_index = false
++ local i, p, inst, idx
++
++ -- deliver image
++ if vars.img then
++ local l12 = require "luci.ltn12"
++ local png = io.open(graph.opts.imgpath .. "/" .. vars.img:gsub("%.+", "."), "r")
++ if png then
++ luci.http.prepare_content("image/png")
++ l12.pump.all(l12.source.file(png), luci.http.write)
++ end
++ return
++ end
++
++ local plugin, instances
++ local images = { }
++
++ -- find requested plugin and instance
++ for i, p in ipairs( luci.dispatcher.context.path ) do
++ if luci.dispatcher.context.path[i] == "graph" then
++ plugin = luci.dispatcher.context.path[i+1]
++ instances = { luci.dispatcher.context.path[i+2] }
++ end
++ end
++
++ -- no instance requested, find all instances
++ if #instances == 0 then
++ --instances = { graph.tree:plugin_instances( plugin )[1] }
++ instances = graph.tree:plugin_instances( plugin )
++ is_index = (#instances > 1)
++
++ -- index instance requested
++ elseif instances[1] == "-" then
++ instances[1] = ""
++ is_index = true
++ end
++
++
++ -- render graphs
++ for i, inst in luci.util.vspairs( instances ) do
++ for i, img in luci.util.vspairs( graph:render( plugin, inst, is_index ) ) do
++ table.insert( images, graph:strippngpath( img ) )
++ images[images[#images]] = inst
++ end
++ end
++
++ luci.template.render( "public_statistics/graph", {
++ images = images,
++ plugin = plugin,
++ timespans = spans,
++ current_timespan = span,
++ hosts = hosts,
++ current_host = host,
++ is_index = is_index
++ } )
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/collectd.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/collectd.lua
+new file mode 100644
+index 0000000..663a3f1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/collectd.lua
+@@ -0,0 +1,62 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.sys")
++
++
++m = Map("luci_statistics",
++ translate("Collectd Settings"),
++ translate(
++ "Collectd is a small daemon for collecting data from " ..
++ "various sources through different plugins. On this page " ..
++ "you can change general settings for the collectd daemon."
++ ))
++
++-- general config section
++s = m:section( NamedSection, "collectd", "luci_statistics" )
++
++-- general.hostname (Hostname)
++hostname = s:option( Value, "Hostname", translate("Hostname") )
++hostname.default = luci.sys.hostname()
++hostname.optional = true
++
++-- general.basedir (BaseDir)
++basedir = s:option( Value, "BaseDir", translate("Base Directory") )
++basedir.default = "/var/run/collectd"
++
++-- general.include (Include)
++include = s:option( Value, "Include", translate("Directory for sub-configurations") )
++include.default = "/etc/collectd/conf.d/*.conf"
++
++-- general.plugindir (PluginDir)
++plugindir = s:option( Value, "PluginDir", translate("Directory for collectd plugins") )
++plugindir.default = "/usr/lib/collectd/"
++
++-- general.pidfile (PIDFile)
++pidfile = s:option( Value, "PIDFile", translate("Used PID file") )
++pidfile.default = "/var/run/collectd.pid"
++
++-- general.typesdb (TypesDB)
++typesdb = s:option( Value, "TypesDB", translate("Datasets definition file") )
++typesdb.default = "/etc/collectd/types.db"
++
++-- general.interval (Interval)
++interval = s:option( Value, "Interval", translate("Data collection interval"), translate("Seconds") )
++interval.default = 60
++interval.isnumber = true
++
++-- general.readthreads (ReadThreads)
++readthreads = s:option( Value, "ReadThreads", translate("Number of threads for data collection") )
++readthreads.default = 5
++readthreads.isnumber = true
++
++-- general.fqdnlookup (FQDNLookup)
++fqdnlookup = s:option( Flag, "FQDNLookup", translate("Try to lookup fully qualified hostname") )
++fqdnlookup.enabled = "true"
++fqdnlookup.disabled = "false"
++fqdnlookup.default = "false"
++fqdnlookup.optional = true
++fqdnlookup:depends( "Hostname", "" )
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/conntrack.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/conntrack.lua
+new file mode 100644
+index 0000000..f89cdb1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/conntrack.lua
+@@ -0,0 +1,21 @@
++--[[
++
++Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++]]--
++
++m = Map("luci_statistics",
++ translate("Conntrack Plugin Configuration"),
++ translate("The conntrack plugin collects statistics about the number of tracked connections."))
++
++s = m:section( NamedSection, "collectd_conntrack", "luci_statistics" )
++
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/cpu.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/cpu.lua
+new file mode 100644
+index 0000000..ee3fd25
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/cpu.lua
+@@ -0,0 +1,15 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("CPU Plugin Configuration"),
++ translate("The cpu plugin collects basic statistics about the processor usage."))
++
++-- collectd_cpu config section
++s = m:section( NamedSection, "collectd_cpu", "luci_statistics" )
++
++-- collectd_cpu.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/csv.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/csv.lua
+new file mode 100644
+index 0000000..ec45a67
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/csv.lua
+@@ -0,0 +1,29 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("CSV Plugin Configuration"),
++ translate(
++ "The csv plugin stores collected data in csv file format " ..
++ "for further processing by external programs."
++ ))
++
++-- collectd_csv config section
++s = m:section( NamedSection, "collectd_csv", "luci_statistics" )
++
++-- collectd_csv.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_csv.datadir (DataDir)
++datadir = s:option( Value, "DataDir", translate("Storage directory for the csv files") )
++datadir.default = "127.0.0.1"
++datadir:depends( "enable", 1 )
++
++-- collectd_csv.storerates (StoreRates)
++storerates = s:option( Flag, "StoreRates", translate("Store data values as rates instead of absolute values") )
++storerates.default = 0
++storerates:depends( "enable", 1 )
++
++return m
++
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/df.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/df.lua
+new file mode 100644
+index 0000000..c6031fd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/df.lua
+@@ -0,0 +1,41 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("DF Plugin Configuration"),
++ translate(
++ "The df plugin collects statistics about the disk space " ..
++ "usage on different devices, mount points or filesystem types."
++ ))
++
++-- collectd_df config section
++s = m:section( NamedSection, "collectd_df", "luci_statistics" )
++
++-- collectd_df.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_df.devices (Device)
++devices = s:option( Value, "Devices", translate("Monitor devices") )
++devices.default = "/dev/mtdblock/4"
++devices.optional = true
++devices:depends( "enable", 1 )
++
++-- collectd_df.mountpoints (MountPoint)
++mountpoints = s:option( Value, "MountPoints", translate("Monitor mount points") )
++mountpoints.default = "/overlay"
++mountpoints.optional = true
++mountpoints:depends( "enable", 1 )
++
++-- collectd_df.fstypes (FSType)
++fstypes = s:option( Value, "FSTypes", translate("Monitor filesystem types") )
++fstypes.default = "tmpfs"
++fstypes.optional = true
++fstypes:depends( "enable", 1 )
++
++-- collectd_df.ignoreselected (IgnoreSelected)
++ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
++ignoreselected.default = 0
++ignoreselected:depends( "enable", 1 )
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/disk.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/disk.lua
+new file mode 100644
+index 0000000..dc3d3fb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/disk.lua
+@@ -0,0 +1,29 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("Disk Plugin Configuration"),
++ translate(
++ "The disk plugin collects detailled usage statistics " ..
++ "for selected partitions or whole disks."
++ ))
++
++-- collectd_disk config section
++s = m:section( NamedSection, "collectd_disk", "luci_statistics" )
++
++-- collectd_disk.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_disk.disks (Disk)
++devices = s:option( Value, "Disks", translate("Monitor disks and partitions") )
++devices.default = "hda1 hdb"
++devices.rmempty = true
++devices:depends( "enable", 1 )
++
++-- collectd_disk.ignoreselected (IgnoreSelected)
++ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
++ignoreselected.default = 0
++ignoreselected:depends( "enable", 1 )
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/dns.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/dns.lua
+new file mode 100644
+index 0000000..29b998b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/dns.lua
+@@ -0,0 +1,36 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.sys")
++
++
++m = Map("luci_statistics",
++ translate("DNS Plugin Configuration"),
++ translate(
++ "The dns plugin collects detailled statistics about dns " ..
++ "related traffic on selected interfaces."
++ ))
++
++-- collectd_dns config section
++s = m:section( NamedSection, "collectd_dns", "luci_statistics" )
++
++-- collectd_dns.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_dns.interfaces (Interface)
++interfaces = s:option( MultiValue, "Interfaces", translate("Monitor interfaces") )
++interfaces.widget = "select"
++interfaces.size = 5
++interfaces:depends( "enable", 1 )
++interfaces:value("any")
++for k, v in pairs(luci.sys.net.devices()) do
++ interfaces:value(v)
++end
++
++-- collectd_dns.ignoresources (IgnoreSource)
++ignoresources = s:option( Value, "IgnoreSources", translate("Ignore source addresses") )
++ignoresources.default = "127.0.0.1"
++ignoresources:depends( "enable", 1 )
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/email.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/email.lua
+new file mode 100644
+index 0000000..e6ed439
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/email.lua
+@@ -0,0 +1,48 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("E-Mail Plugin Configuration"),
++ translate(
++ "The email plugin creates a unix socket which can be used " ..
++ "to transmit email-statistics to a running collectd daemon. " ..
++ "This plugin is primarily intended to be used in conjunction " ..
++ "with Mail::SpamAssasin::Plugin::Collectd but can be used in " ..
++ "other ways as well."
++ ))
++
++-- collectd_email config section
++s = m:section( NamedSection, "collectd_email", "luci_statistics" )
++
++-- collectd_email.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_email.socketfile (SocketFile)
++socketfile = s:option( Value, "SocketFile", translate("Socket file") )
++socketfile.default = "/var/run/collect-email.sock"
++socketfile:depends( "enable", 1 )
++
++-- collectd_email.socketgroup (SocketGroup)
++socketgroup = s:option( Value, "SocketGroup", translate("Socket group") )
++socketgroup.default = "nobody"
++socketgroup.rmempty = true
++socketgroup.optional = true
++socketgroup:depends( "enable", 1 )
++
++-- collectd_email.socketperms (SocketPerms)
++socketperms = s:option( Value, "SocketPerms", translate("Socket permissions") )
++socketperms.default = "0770"
++socketperms.rmempty = true
++socketperms.optional = true
++socketperms:depends( "enable", 1 )
++
++-- collectd_email.maxconns (MaxConns)
++maxconns = s:option( Value, "MaxConns", translate("Maximum allowed connections") )
++maxconns.default = 5
++maxconns.isinteger = true
++maxconns.rmempty = true
++maxconns.optional = true
++maxconns:depends( "enable", 1 )
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/entropy.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/entropy.lua
+new file mode 100644
+index 0000000..d18bf91
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/entropy.lua
+@@ -0,0 +1,14 @@
++-- Copyright 2015 Hannu Nyman <hannu.nyman@iki.fi>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("Entropy Plugin Configuration"),
++ translate("The entropy plugin collects statistics about the available entropy."))
++
++s = m:section( NamedSection, "collectd_entropy", "luci_statistics" )
++
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++return m
++
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/exec.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/exec.lua
+new file mode 100644
+index 0000000..48e0ec2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/exec.lua
+@@ -0,0 +1,77 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("Exec Plugin Configuration"),
++ translate(
++ "The exec plugin starts external commands to read values " ..
++ "from or to notify external processes when certain threshold " ..
++ "values have been reached."
++ ))
++
++-- collectd_exec config section
++s = m:section( NamedSection, "collectd_exec", "luci_statistics" )
++
++-- collectd_exec.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++
++-- collectd_exec_input config section (Exec directives)
++exec = m:section( TypedSection, "collectd_exec_input",
++ translate("Add command for reading values"),
++ translate(
++ "Here you can define external commands which will be " ..
++ "started by collectd in order to read certain values. " ..
++ "The values will be read from stdout."
++ ))
++exec.addremove = true
++exec.anonymous = true
++
++-- collectd_exec_input.cmdline
++exec_cmdline = exec:option( Value, "cmdline", translate("Script") )
++exec_cmdline.default = "/usr/bin/stat-dhcpusers"
++
++-- collectd_exec_input.cmdline
++exec_cmduser = exec:option( Value, "cmduser", translate("User") )
++exec_cmduser.default = "nobody"
++exec_cmduser.rmempty = true
++exec_cmduser.optional = true
++
++-- collectd_exec_input.cmdline
++exec_cmdgroup = exec:option( Value, "cmdgroup", translate("Group") )
++exec_cmdgroup.default = "nogroup"
++exec_cmdgroup.rmempty = true
++exec_cmdgroup.optional = true
++
++
++-- collectd_exec_notify config section (NotifyExec directives)
++notify = m:section( TypedSection, "collectd_exec_notify",
++ translate("Add notification command"),
++ translate(
++ "Here you can define external commands which will be " ..
++ "started by collectd when certain threshold values have " ..
++ "been reached. The values leading to invokation will be " ..
++ "feeded to the the called programs stdin."
++ ))
++notify.addremove = true
++notify.anonymous = true
++
++-- collectd_notify_input.cmdline
++notify_cmdline = notify:option( Value, "cmdline", translate("Script") )
++notify_cmdline.default = "/usr/bin/stat-dhcpusers"
++
++-- collectd_notify_input.cmdline
++notify_cmduser = notify:option( Value, "cmduser", translate("User") )
++notify_cmduser.default = "nobody"
++notify_cmduser.rmempty = true
++notify_cmduser.optional = true
++
++-- collectd_notify_input.cmdline
++notify_cmdgroup = notify:option( Value, "cmdgroup", translate("Group") )
++notify_cmdgroup.default = "nogroup"
++notify_cmdgroup.rmempty = true
++notify_cmdgroup.optional = true
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/interface.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/interface.lua
+new file mode 100644
+index 0000000..752212f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/interface.lua
+@@ -0,0 +1,35 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.sys")
++
++
++m = Map("luci_statistics",
++ translate("Interface Plugin Configuration"),
++ translate(
++ "The interface plugin collects traffic statistics on " ..
++ "selected interfaces."
++ ))
++
++-- collectd_interface config section
++s = m:section( NamedSection, "collectd_interface", "luci_statistics" )
++
++-- collectd_interface.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_interface.interfaces (Interface)
++interfaces = s:option( MultiValue, "Interfaces", translate("Monitor interfaces") )
++interfaces.widget = "select"
++interfaces.size = 5
++interfaces:depends( "enable", 1 )
++for k, v in pairs(luci.sys.net.devices()) do
++ interfaces:value(v)
++end
++
++-- collectd_interface.ignoreselected (IgnoreSelected)
++ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
++ignoreselected.default = 0
++ignoreselected:depends( "enable", 1 )
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iptables.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iptables.lua
+new file mode 100644
+index 0000000..aa46984
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iptables.lua
+@@ -0,0 +1,120 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.sys.iptparser")
++
++ip = luci.sys.iptparser.IptParser()
++chains = { }
++targets = { }
++
++for i, rule in ipairs( ip:find() ) do
++ if rule.chain and rule.target then
++ chains[rule.chain] = true
++ targets[rule.target] = true
++ end
++end
++
++
++m = Map("luci_statistics",
++ translate("Iptables Plugin Configuration"),
++ translate(
++ "The iptables plugin will monitor selected firewall rules and " ..
++ "collect informations about processed bytes and packets per rule."
++ ))
++
++-- collectd_iptables config section
++s = m:section( NamedSection, "collectd_iptables", "luci_statistics" )
++
++-- collectd_iptables.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++
++-- collectd_iptables_match config section (Chain directives)
++rule = m:section( TypedSection, "collectd_iptables_match",
++ translate("Add matching rule"),
++ translate(
++ "Here you can define various criteria by which the monitored " ..
++ "iptables rules are selected."
++ ))
++rule.addremove = true
++rule.anonymous = true
++
++
++-- collectd_iptables_match.name
++rule_table = rule:option( Value, "name",
++ translate("Name of the rule"), translate("max. 16 chars") )
++
++-- collectd_iptables_match.table
++rule_table = rule:option( ListValue, "table", translate("Table") )
++rule_table.default = "filter"
++rule_table.rmempty = true
++rule_table.optional = true
++rule_table:value("")
++rule_table:value("filter")
++rule_table:value("nat")
++rule_table:value("mangle")
++
++
++-- collectd_iptables_match.chain
++rule_chain = rule:option( ListValue, "chain", translate("Chain") )
++rule_chain.rmempty = true
++rule_chain.optional = true
++rule_chain:value("")
++
++for chain, void in pairs( chains ) do
++ rule_chain:value( chain )
++end
++
++
++-- collectd_iptables_match.target
++rule_target = rule:option( ListValue, "target", translate("Action (target)") )
++rule_target.rmempty = true
++rule_target.optional = true
++rule_target:value("")
++
++for target, void in pairs( targets ) do
++ rule_target:value( target )
++end
++
++
++-- collectd_iptables_match.protocol
++rule_protocol = rule:option( ListValue, "protocol", translate("Network protocol") )
++rule_protocol.rmempty = true
++rule_protocol.optional = true
++rule_protocol:value("")
++rule_protocol:value("tcp")
++rule_protocol:value("udp")
++rule_protocol:value("icmp")
++
++-- collectd_iptables_match.source
++rule_source = rule:option( Value, "source", translate("Source ip range") )
++rule_source.default = "0.0.0.0/0"
++rule_source.rmempty = true
++rule_source.optional = true
++
++-- collectd_iptables_match.destination
++rule_destination = rule:option( Value, "destination", translate("Destination ip range") )
++rule_destination.default = "0.0.0.0/0"
++rule_destination.rmempty = true
++rule_destination.optional = true
++
++-- collectd_iptables_match.inputif
++rule_inputif = rule:option( Value, "inputif",
++ translate("Incoming interface"), translate("e.g. br-lan") )
++rule_inputif.rmempty = true
++rule_inputif.optional = true
++
++-- collectd_iptables_match.outputif
++rule_outputif = rule:option( Value, "outputif",
++ translate("Outgoing interface"), translate("e.g. br-ff") )
++rule_outputif.rmempty = true
++rule_outputif.optional = true
++
++-- collectd_iptables_match.options
++rule_options = rule:option( Value, "options",
++ translate("Options"), translate("e.g. reject-with tcp-reset") )
++rule_options.rmempty = true
++rule_options.optional = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/irq.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/irq.lua
+new file mode 100644
+index 0000000..6a8c227
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/irq.lua
+@@ -0,0 +1,30 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("IRQ Plugin Configuration"),
++ translate(
++ "The irq plugin will monitor the rate of issues per second for " ..
++ "each selected interrupt. If no interrupt is selected then all " ..
++ "interrupts are monitored."
++ ))
++
++-- collectd_irq config section
++s = m:section( NamedSection, "collectd_irq", "luci_statistics" )
++
++-- collectd_irq.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_irq.irqs (Irq)
++irqs = s:option( Value, "Irqs", translate("Monitor interrupts") )
++irqs.optional = true
++irqs:depends( "enable", 1 )
++
++-- collectd_irq.ignoreselected (IgnoreSelected)
++ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
++ignoreselected.default = 0
++ignoreselected.optional = "true"
++ignoreselected:depends( "enable", 1 )
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iwinfo.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iwinfo.lua
+new file mode 100644
+index 0000000..20d9509
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iwinfo.lua
+@@ -0,0 +1,26 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local m, s, o
++
++m = Map("luci_statistics",
++ translate("Wireless iwinfo Plugin Configuration"),
++ translate("The iwinfo plugin collects statistics about wireless signal strength, noise and quality."))
++
++s = m:section(NamedSection, "collectd_iwinfo", "luci_statistics")
++
++o = s:option(Flag, "enable", translate("Enable this plugin"))
++o.default = 0
++
++o = s:option(Value, "Interfaces", translate("Monitor interfaces"),
++ translate("Leave unselected to automatically determine interfaces to monitor."))
++o.template = "cbi/network_ifacelist"
++o.widget = "checkbox"
++o.nocreate = true
++o:depends("enable", 1)
++
++o = s:option(Flag, "IgnoreSelected", translate("Monitor all except specified"))
++o.default = 0
++o:depends("enable", 1)
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/load.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/load.lua
+new file mode 100644
+index 0000000..6578291
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/load.lua
+@@ -0,0 +1,17 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("Load Plugin Configuration"),
++ translate(
++ "The load plugin collects statistics about the general system load."
++ ))
++
++-- collectd_wireless config section
++s = m:section( NamedSection, "collectd_load", "luci_statistics" )
++
++-- collectd_wireless.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/memory.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/memory.lua
+new file mode 100644
+index 0000000..5510a5a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/memory.lua
+@@ -0,0 +1,21 @@
++--[[
++
++Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++]]--
++
++m = Map("luci_statistics",
++ translate("Memory Plugin Configuration"),
++ translate("The memory plugin collects statistics about the memory usage."))
++
++s = m:section( NamedSection, "collectd_memory", "luci_statistics" )
++
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/netlink.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/netlink.lua
+new file mode 100644
+index 0000000..917abd0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/netlink.lua
+@@ -0,0 +1,83 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.sys")
++
++local devices = luci.sys.net.devices()
++
++
++m = Map("luci_statistics",
++ translate("Netlink Plugin Configuration"),
++ translate(
++ "The netlink plugin collects extended informations like " ..
++ "qdisc-, class- and filter-statistics for selected interfaces."
++ ))
++
++-- collectd_netlink config section
++s = m:section( NamedSection, "collectd_netlink", "luci_statistics" )
++
++-- collectd_netlink.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_netlink.interfaces (Interface)
++interfaces = s:option( MultiValue, "Interfaces", translate("Basic monitoring") )
++interfaces.widget = "select"
++interfaces.optional = true
++interfaces.size = #devices + 1
++interfaces:depends( "enable", 1 )
++interfaces:value("")
++for i, v in ipairs(devices) do
++ interfaces:value(v)
++end
++
++-- collectd_netlink.verboseinterfaces (VerboseInterface)
++verboseinterfaces = s:option( MultiValue, "VerboseInterfaces", translate("Verbose monitoring") )
++verboseinterfaces.widget = "select"
++verboseinterfaces.optional = true
++verboseinterfaces.size = #devices + 1
++verboseinterfaces:depends( "enable", 1 )
++verboseinterfaces:value("")
++for i, v in ipairs(devices) do
++ verboseinterfaces:value(v)
++end
++
++-- collectd_netlink.qdiscs (QDisc)
++qdiscs = s:option( MultiValue, "QDiscs", translate("Qdisc monitoring") )
++qdiscs.widget = "select"
++qdiscs.optional = true
++qdiscs.size = #devices + 1
++qdiscs:depends( "enable", 1 )
++qdiscs:value("")
++for i, v in ipairs(devices) do
++ qdiscs:value(v)
++end
++
++-- collectd_netlink.classes (Class)
++classes = s:option( MultiValue, "Classes", translate("Shaping class monitoring") )
++classes.widget = "select"
++classes.optional = true
++classes.size = #devices + 1
++classes:depends( "enable", 1 )
++classes:value("")
++for i, v in ipairs(devices) do
++ classes:value(v)
++end
++
++-- collectd_netlink.filters (Filter)
++filters = s:option( MultiValue, "Filters", translate("Filter class monitoring") )
++filters.widget = "select"
++filters.optional = true
++filters.size = #devices + 1
++filters:depends( "enable", 1 )
++filters:value("")
++for i, v in ipairs(devices) do
++ filters:value(v)
++end
++
++-- collectd_netlink.ignoreselected (IgnoreSelected)
++ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
++ignoreselected.default = 0
++ignoreselected:depends( "enable", 1 )
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/network.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/network.lua
+new file mode 100644
+index 0000000..547badf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/network.lua
+@@ -0,0 +1,85 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("Network Plugin Configuration"),
++ translate(
++ "The network plugin provides network based communication between " ..
++ "different collectd instances. Collectd can operate both in client " ..
++ "and server mode. In client mode locally collected data is " ..
++ "transferred to a collectd server instance, in server mode the " ..
++ "local instance receives data from other hosts."
++ ))
++
++-- collectd_network config section
++s = m:section( NamedSection, "collectd_network", "luci_statistics" )
++
++-- collectd_network.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++
++-- collectd_network_listen config section (Listen)
++listen = m:section( TypedSection, "collectd_network_listen",
++ translate("Listener interfaces"),
++ translate(
++ "This section defines on which interfaces collectd will wait " ..
++ "for incoming connections."
++ ))
++listen.addremove = true
++listen.anonymous = true
++
++-- collectd_network_listen.host
++listen_host = listen:option( Value, "host", translate("Listen host") )
++listen_host.default = "0.0.0.0"
++
++-- collectd_network_listen.port
++listen_port = listen:option( Value, "port", translate("Listen port") )
++listen_port.default = 25826
++listen_port.isinteger = true
++listen_port.optional = true
++
++
++-- collectd_network_server config section (Server)
++server = m:section( TypedSection, "collectd_network_server",
++ translate("server interfaces"),
++ translate(
++ "This section defines to which servers the locally collected " ..
++ "data is sent to."
++ ))
++server.addremove = true
++server.anonymous = true
++
++-- collectd_network_server.host
++server_host = server:option( Value, "host", translate("Server host") )
++server_host.default = "0.0.0.0"
++
++-- collectd_network_server.port
++server_port = server:option( Value, "port", translate("Server port") )
++server_port.default = 25826
++server_port.isinteger = true
++server_port.optional = true
++
++-- collectd_network.timetolive (TimeToLive)
++ttl = s:option( Value, "TimeToLive", translate("TTL for network packets") )
++ttl.default = 128
++ttl.isinteger = true
++ttl.optional = true
++ttl:depends( "enable", 1 )
++
++-- collectd_network.forward (Forward)
++forward = s:option( Flag, "Forward", translate("Forwarding between listen and server addresses") )
++forward.default = 0
++forward.optional = true
++forward:depends( "enable", 1 )
++
++-- collectd_network.cacheflush (CacheFlush)
++cacheflush = s:option( Value, "CacheFlush",
++ translate("Cache flush interval"), translate("Seconds") )
++cacheflush.default = 86400
++cacheflush.isinteger = true
++cacheflush.optional = true
++cacheflush:depends( "enable", 1 )
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/nut.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/nut.lua
+new file mode 100644
+index 0000000..03ec29e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/nut.lua
+@@ -0,0 +1,17 @@
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("UPS Plugin Configuration"),
++ translate("The NUT plugin reads information about Uninterruptible Power Supplies."))
++
++s = m:section(NamedSection, "collectd_nut", "luci_statistics" )
++
++enable = s:option(Flag, "enable", translate("Enable this plugin"))
++enable.default = 0
++
++host = s:option(Value, "UPS", translate("UPS"), translate("UPS name in NUT ups@host format"))
++host.placeholder = "myupsname"
++host.datatype = "string"
++host.rmempty = true
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/olsrd.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/olsrd.lua
+new file mode 100644
+index 0000000..59266e5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/olsrd.lua
+@@ -0,0 +1,45 @@
++-- Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("OLSRd Plugin Configuration"),
++ translate("The OLSRd plugin reads information about meshed networks from the txtinfo plugin of OLSRd."))
++
++s = m:section(NamedSection, "collectd_olsrd", "luci_statistics" )
++
++enable = s:option(Flag, "enable", translate("Enable this plugin"))
++enable.default = 0
++
++host = s:option(Value, "Host", translate("Host"), translate("IP or hostname where to get the txtinfo output from"))
++host.placeholder = "127.0.0.1"
++host.datatype = "host"
++host.rmempty = true
++
++port = s:option(Value, "Port", translate("Port"))
++port.placeholder = "2006"
++port.datatype = "range(0,65535)"
++port.rmempty = true
++port.cast = "string"
++
++cl = s:option(ListValue, "CollectLinks", translate("CollectLinks"),
++ translate("Specifies what information to collect about links."))
++cl:value("No")
++cl:value("Summary")
++cl:value("Detail")
++cl.default = "Detail"
++
++cr = s:option(ListValue, "CollectRoutes", translate("CollectRoutes"),
++ translate("Specifies what information to collect about routes."))
++cr:value("No")
++cr:value("Summary")
++cr:value("Detail")
++cr.default = "Summary"
++
++ct = s:option(ListValue, "CollectTopology", translate("CollectTopology"),
++ translate("Specifies what information to collect about the global topology."))
++ct:value("No")
++ct:value("Summary")
++ct:value("Detail")
++ct.default = "Summary"
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/openvpn.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/openvpn.lua
+new file mode 100644
+index 0000000..193f044
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/openvpn.lua
+@@ -0,0 +1,56 @@
++-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require "luci.sys"
++
++local m, s, o
++
++
++m = Map("luci_statistics",
++ translate("OpenVPN Plugin Configuration"),
++ translate("The OpenVPN plugin gathers information about the current vpn connection status."))
++
++s = m:section( NamedSection, "collectd_openvpn", "luci_statistics" )
++
++
++o = s:option( Flag, "enable", translate("Enable this plugin") )
++o.default = "0"
++
++
++o = s:option(Flag, "CollectIndividualUsers", translate("Generate a separate graph for each logged user"))
++o.default = "0"
++o.rmempty = true
++o:depends("enable", 1)
++
++
++o = s:option(Flag, "CollectUserCount", translate("Aggregate number of connected users"))
++o.default = "0"
++o.rmempty = true
++o:depends("enable", 1)
++
++
++o = s:option(Flag, "CollectCompression", translate("Gather compression statistics"))
++o.default = "0"
++o.rmempty = true
++o:depends("enable", 1)
++
++
++o = s:option(Flag, "ImprovedNamingSchema", translate("Use improved naming schema"))
++o.default = "0"
++o.rmempty = true
++o:depends("enable", 1)
++
++
++o = s:option(DynamicList, "StatusFile", translate("OpenVPN status files"))
++o.rmempty = true
++o:depends("enable", 1)
++
++local status_files = nixio.fs.glob("/var/run/openvpn.*.status")
++if status_files then
++ local status_file
++ for status_file in status_files do
++ o:value(status_file)
++ end
++end
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/ping.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/ping.lua
+new file mode 100644
+index 0000000..3179da6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/ping.lua
+@@ -0,0 +1,35 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("Ping Plugin Configuration"),
++ translate(
++ "The ping plugin will send icmp echo replies to selected " ..
++ "hosts and measure the roundtrip time for each host."
++ ))
++
++-- collectd_ping config section
++s = m:section( NamedSection, "collectd_ping", "luci_statistics" )
++
++-- collectd_ping.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_ping.hosts (Host)
++hosts = s:option( Value, "Hosts", translate("Monitor hosts"), translate ("Add multiple hosts separated by space."))
++hosts.default = "127.0.0.1"
++hosts:depends( "enable", 1 )
++
++-- collectd_ping.ttl (TTL)
++ttl = s:option( Value, "TTL", translate("TTL for ping packets") )
++ttl.isinteger = true
++ttl.default = 128
++ttl:depends( "enable", 1 )
++
++-- collectd_ping.interval (Interval)
++interval = s:option( Value, "Interval", translate("Interval for pings"), translate ("Seconds") )
++interval.isinteger = true
++interval.default = 30
++interval:depends( "enable", 1 )
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/processes.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/processes.lua
+new file mode 100644
+index 0000000..4171a88
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/processes.lua
+@@ -0,0 +1,24 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("Processes Plugin Configuration"),
++ translate(
++ "The processes plugin collects informations like cpu time, " ..
++ "page faults and memory usage of selected processes."
++ ))
++
++-- collectd_processes config section
++s = m:section( NamedSection, "collectd_processes", "luci_statistics" )
++
++-- collectd_processes.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_processes.processes (Process)
++processes = s:option( Value, "Processes", translate("Monitor processes"),
++ translate("Processes to monitor separated by space") )
++processes:depends( "enable", 1 )
++processes.default = "uhttpd dropbear dnsmasq"
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua
+new file mode 100644
+index 0000000..b3bdf87
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua
+@@ -0,0 +1,96 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("RRDTool Plugin Configuration"),
++ translate(
++ "The rrdtool plugin stores the collected data in rrd database " ..
++ "files, the foundation of the diagrams.<br /><br />" ..
++ "<strong>Warning: Setting the wrong values will result in a very " ..
++ "high memory consumption in the temporary directory. " ..
++ "This can render the device unusable!</strong>"
++ ))
++
++-- collectd_rrdtool config section
++s = m:section( NamedSection, "collectd_rrdtool", "luci_statistics" )
++
++-- collectd_rrdtool.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 1
++
++-- collectd_rrdtool.datadir (DataDir)
++datadir = s:option( Value, "DataDir", translate("Storage directory") )
++datadir.default = "/tmp"
++datadir.rmempty = true
++datadir.optional = true
++datadir:depends( "enable", 1 )
++
++-- collectd_rrdtool.stepsize (StepSize)
++stepsize = s:option( Value, "StepSize",
++ translate("RRD step interval"), translate("Seconds") )
++stepsize.default = 30
++stepsize.isinteger = true
++stepsize.rmempty = true
++stepsize.optional = true
++stepsize:depends( "enable", 1 )
++
++-- collectd_rrdtool.heartbeat (HeartBeat)
++heartbeat = s:option( Value, "HeartBeat",
++ translate("RRD heart beat interval"), translate("Seconds") )
++heartbeat.default = 60
++heartbeat.isinteger = true
++heartbeat.rmempty = true
++heartbeat.optional = true
++heartbeat:depends( "enable", 1 )
++
++-- collectd_rrdtool.rrasingle (RRASingle)
++rrasingle = s:option( Flag, "RRASingle",
++ translate("Only create average RRAs"), translate("reduces rrd size") )
++rrasingle.default = true
++rrasingle.rmempty = true
++rrasingle.optional = true
++rrasingle:depends( "enable", 1 )
++
++-- collectd_rrdtool.rratimespans (RRATimespan)
++rratimespans = s:option( Value, "RRATimespans",
++ translate("Stored timespans"), translate("seconds; multiple separated by space") )
++rratimespans.default = "600 86400 604800 2678400 31622400"
++rratimespans.rmempty = true
++rratimespans.optional = true
++rratimespans:depends( "enable", 1 )
++
++-- collectd_rrdtool.rrarows (RRARows)
++rrarows = s:option( Value, "RRARows", translate("Rows per RRA") )
++rrarows.isinteger = true
++rrarows.default = 100
++rrarows.rmempty = true
++rrarows.optional = true
++rrarows:depends( "enable", 1 )
++
++-- collectd_rrdtool.xff (XFF)
++xff = s:option( Value, "XFF", translate("RRD XFiles Factor") )
++xff.default = 0.1
++xff.isnumber = true
++xff.rmempty = true
++xff.optional = true
++xff:depends( "enable", 1 )
++
++-- collectd_rrdtool.cachetimeout (CacheTimeout)
++cachetimeout = s:option( Value, "CacheTimeout",
++ translate("Cache collected data for"), translate("Seconds") )
++cachetimeout.isinteger = true
++cachetimeout.default = 100
++cachetimeout.rmempty = true
++cachetimeout.optional = true
++cachetimeout:depends( "enable", 1 )
++
++-- collectd_rrdtool.cacheflush (CacheFlush)
++cacheflush = s:option( Value, "CacheFlush",
++ translate("Flush cache after"), translate("Seconds") )
++cacheflush.isinteger = true
++cacheflush.default = 100
++cacheflush.rmempty = true
++cacheflush.optional = true
++cacheflush:depends( "enable", 1 )
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/sensors.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/sensors.lua
+new file mode 100644
+index 0000000..77e36bf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/sensors.lua
+@@ -0,0 +1,125 @@
++-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require "luci.sys"
++
++local m, s, o
++local sensor_types = {
++ ["12v"] = "voltage",
++ ["2.0v"] = "voltage",
++ ["2.5v"] = "voltage",
++ ["3.3v"] = "voltage",
++ ["5.0v"] = "voltage",
++ ["5v"] = "voltage",
++ ["ain1"] = "voltage",
++ ["ain2"] = "voltage",
++ ["cpu_temp"] = "temperature",
++ ["fan1"] = "fanspeed",
++ ["fan2"] = "fanspeed",
++ ["fan3"] = "fanspeed",
++ ["fan4"] = "fanspeed",
++ ["fan5"] = "fanspeed",
++ ["fan6"] = "fanspeed",
++ ["fan7"] = "fanspeed",
++ ["in0"] = "voltage",
++ ["in10"] = "voltage",
++ ["in2"] = "voltage",
++ ["in3"] = "voltage",
++ ["in4"] = "voltage",
++ ["in5"] = "voltage",
++ ["in6"] = "voltage",
++ ["in7"] = "voltage",
++ ["in8"] = "voltage",
++ ["in9"] = "voltage",
++ ["power1"] = "power",
++ ["remote_temp"] = "temperature",
++ ["temp1"] = "temperature",
++ ["temp2"] = "temperature",
++ ["temp3"] = "temperature",
++ ["temp4"] = "temperature",
++ ["temp5"] = "temperature",
++ ["temp6"] = "temperature",
++ ["temp7"] = "temperature",
++ ["temp"] = "temperature",
++ ["vccp1"] = "voltage",
++ ["vccp2"] = "voltage",
++ ["vdd"] = "voltage",
++ ["vid1"] = "voltage",
++ ["vid2"] = "voltage",
++ ["vid3"] = "voltage",
++ ["vid4"] = "voltage",
++ ["vid5"] = "voltage",
++ ["vid"] = "voltage",
++ ["vin1"] = "voltage",
++ ["vin2"] = "voltage",
++ ["vin3"] = "voltage",
++ ["vin4"] = "voltage",
++ ["volt12"] = "voltage",
++ ["volt5"] = "voltage",
++ ["voltbatt"] = "voltage",
++ ["vrm"] = "voltage"
++
++}
++
++
++m = Map("luci_statistics",
++ translate("Sensors Plugin Configuration"),
++ translate("The sensors plugin uses the Linux Sensors framework to gather environmental statistics."))
++
++s = m:section( NamedSection, "collectd_sensors", "luci_statistics" )
++
++
++o = s:option( Flag, "enable", translate("Enable this plugin") )
++o.default = 0
++
++
++o = s:option(Flag, "__all", translate("Monitor all sensors"))
++o:depends("enable", 1)
++o.default = 1
++o.write = function() end
++o.cfgvalue = function(self, sid)
++ local v = self.map:get(sid, "Sensor")
++ if v == nil or (type(v) == "table" and #v == 0) or (type(v) == "string" and #v == 0) then
++ return "1"
++ end
++end
++
++
++o = s:option(MultiValue, "Sensor", translate("Sensor list"), translate("Hold Ctrl to select multiple items or to deselect entries."))
++o:depends({enable = 1, __all = "" })
++o.widget = "select"
++o.rmempty = true
++o.size = 0
++
++local sensorcli = io.popen("/usr/sbin/sensors -u -A")
++if sensorcli then
++ local bus, sensor
++
++ while true do
++ local ln = sensorcli:read("*ln")
++ if not ln then
++ break
++ elseif ln:match("^[%w-]+$") then
++ bus = ln
++ elseif ln:match("^[%w-]+:$") then
++ sensor = ln:sub(0, -2):lower()
++ if bus and sensor_types[sensor] then
++ o:value("%s/%s-%s" %{ bus, sensor_types[sensor], sensor })
++ o.size = o.size + 1
++ end
++ elseif ln == "" then
++ bus = nil
++ sensor = nil
++ end
++ end
++
++ sensorcli:close()
++end
++
++
++o = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") )
++o.default = 0
++o.rmempty = true
++o:depends({ enable = 1, __all = "" })
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/splash_leases.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/splash_leases.lua
+new file mode 100644
+index 0000000..4ddfacc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/splash_leases.lua
+@@ -0,0 +1,14 @@
++-- Copyright 2013 Freifunk Augsburg / Michael Wendland <michael@michiwend.com>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("Splash Leases Plugin Configuration"),
++ translate("The splash leases plugin uses libuci to collect statistics about splash leases."))
++
++s = m:section( NamedSection, "collectd_splash_leases", "luci_statistics" )
++
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 1
++
++return m
++
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/tcpconns.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/tcpconns.lua
+new file mode 100644
+index 0000000..3c65018
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/tcpconns.lua
+@@ -0,0 +1,33 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("TCPConns Plugin Configuration"),
++ translate(
++ "The tcpconns plugin collects informations about open tcp " ..
++ "connections on selected ports."
++ ))
++
++-- collectd_tcpconns config section
++s = m:section( NamedSection, "collectd_tcpconns", "luci_statistics" )
++
++-- collectd_tcpconns.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_tcpconns.listeningports (ListeningPorts)
++listeningports = s:option( Flag, "ListeningPorts", translate("Monitor all local listen ports") )
++listeningports.default = 1
++listeningports:depends( "enable", 1 )
++
++-- collectd_tcpconns.localports (LocalPort)
++localports = s:option( Value, "LocalPorts", translate("Monitor local ports") )
++localports.optional = true
++localports:depends( "enable", 1 )
++
++-- collectd_tcpconns.remoteports (RemotePort)
++remoteports = s:option( Value, "RemotePorts", translate("Monitor remote ports") )
++remoteports.optional = true
++remoteports:depends( "enable", 1 )
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/unixsock.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/unixsock.lua
+new file mode 100644
+index 0000000..be79543
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/unixsock.lua
+@@ -0,0 +1,37 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("luci_statistics",
++ translate("Unixsock Plugin Configuration"),
++ translate(
++ "The unixsock plugin creates a unix socket which can be used " ..
++ "to read collected data from a running collectd instance."
++ ))
++
++-- collectd_unixsock config section
++s = m:section( NamedSection, "collectd_unixsock", "luci_statistics" )
++
++-- collectd_unixsock.enable
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++-- collectd_unixsock.socketfile (SocketFile)
++socketfile = s:option( Value, "SocketFile" )
++socketfile.default = "/var/run/collect-query.socket"
++socketfile:depends( "enable", 1 )
++
++-- collectd_unixsock.socketgroup (SocketGroup)
++socketgroup = s:option( Value, "SocketGroup" )
++socketgroup.default = "nobody"
++socketgroup.rmempty = true
++socketgroup.optional = true
++socketgroup:depends( "enable", 1 )
++
++-- collectd_unixsock.socketperms (SocketPerms)
++socketperms = s:option( Value, "SocketPerms" )
++socketperms.default = "0770"
++socketperms.rmempty = true
++socketperms.optional = true
++socketperms:depends( "enable", 1 )
++
++return m
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/uptime.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/uptime.lua
+new file mode 100644
+index 0000000..3a6c464
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/uptime.lua
+@@ -0,0 +1,22 @@
++--[[
++
++Copyright 2013 Thomas Endt <tmo26@gmx.de>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++]]--
++
++m = Map("luci_statistics",
++ translate("Uptime Plugin Configuration"),
++ translate("The uptime plugin collects statistics about the uptime of the system."))
++
++s = m:section( NamedSection, "collectd_uptime", "luci_statistics" )
++
++enable = s:option( Flag, "enable", translate("Enable this plugin") )
++enable.default = 0
++
++return m
++
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/datatree.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/datatree.lua
+new file mode 100644
+index 0000000..806b054
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/datatree.lua
+@@ -0,0 +1,197 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.datatree", package.seeall)
++
++local util = require("luci.util")
++local sys = require("luci.sys")
++local fs = require("nixio.fs")
++local uci = require("luci.model.uci").cursor()
++local sections = uci:get_all("luci_statistics")
++
++
++Instance = util.class()
++
++function Instance.__init__( self, host )
++ self._host = host or sections.collectd.Hostname or sys.hostname()
++ self._libdir = sections.collectd.PluginDir or "/usr/lib/collectd"
++ self._rrddir = sections.collectd_rrdtool.DataDir or "/tmp/rrd"
++
++ self._libdir = self._libdir:gsub("/$","")
++ self._rrddir = self._rrddir:gsub("/$","")
++ self._plugins = { }
++
++ self:_scan()
++end
++
++function Instance._mkpath( self, plugin, pinstance )
++ local dir = self._rrddir .. "/" .. self._host
++
++ if type(plugin) == "string" and plugin:len() > 0 then
++ dir = dir .. "/" .. plugin
++
++ if type(pinstance) == "string" and pinstance:len() > 0 then
++ dir = dir .. "-" .. pinstance
++ end
++ end
++
++ return dir
++end
++
++function Instance._ls( self, ... )
++ local ditr = fs.dir(self:_mkpath(...))
++ if ditr then
++ local dirs = { }
++ while true do
++ local d = ditr()
++ if not d then break end
++ dirs[#dirs+1] = d
++ end
++ return dirs
++ end
++end
++
++function Instance._notzero( self, table )
++ for k in pairs(table) do
++ return true
++ end
++
++ return false
++end
++
++function Instance._scan( self )
++ local dirs = self:_ls()
++ if not dirs then
++ return
++ end
++
++-- for i, plugin in ipairs( dirs ) do
++-- if plugin:match("%w+.so") then
++-- self._plugins[ plugin:gsub("%.so$", "") ] = { }
++-- end
++-- end
++
++ for _, dir in ipairs(dirs) do
++ if dir ~= "." and dir ~= ".." and
++ fs.stat(self:_mkpath(dir)).type == "dir"
++ then
++ local plugin = dir:gsub("%-.+$", "")
++ if not self._plugins[plugin] then
++ self._plugins[plugin] = { }
++ end
++ end
++ end
++
++ for plugin, instances in pairs( self._plugins ) do
++
++ local dirs = self:_ls()
++
++ if type(dirs) == "table" then
++ for i, dir in ipairs(dirs) do
++ if dir:find( plugin .. "%-" ) or dir == plugin then
++ local instance = ""
++
++ if dir ~= plugin then
++ instance = dir:gsub( plugin .. "%-", "", 1 )
++ end
++
++ instances[instance] = { }
++ end
++ end
++ end
++
++ for instance, data_instances in pairs( instances ) do
++
++ dirs = self:_ls(plugin, instance)
++
++ if type(dirs) == "table" then
++ for i, file in ipairs(dirs) do
++ if file:find("%.rrd") then
++ file = file:gsub("%.rrd","")
++
++ local data_type
++ local data_instance
++
++ if file:find("%-") then
++ data_type = file:gsub( "%-.+","" )
++ data_instance = file:gsub( "[^%-]-%-", "", 1 )
++ else
++ data_type = file
++ data_instance = ""
++ end
++
++ if not data_instances[data_type] then
++ data_instances[data_type] = { data_instance }
++ else
++ table.insert( data_instances[data_type], data_instance )
++ end
++ end
++ end
++ end
++ end
++ end
++end
++
++
++function Instance.plugins( self )
++ local rv = { }
++
++ for plugin, val in pairs( self._plugins ) do
++ if self:_notzero( val ) then
++ table.insert( rv, plugin )
++ end
++ end
++
++ return rv
++end
++
++function Instance.plugin_instances( self, plugin )
++ local rv = { }
++
++ for instance, val in pairs( self._plugins[plugin] ) do
++ table.insert( rv, instance )
++ end
++
++ return rv
++end
++
++function Instance.data_types( self, plugin, instance )
++ local rv = { }
++ local p = self._plugins[plugin]
++
++ if type(p) == "table" and type(p[instance]) == "table" then
++ for type, val in pairs(p[instance]) do
++ table.insert( rv, type )
++ end
++ end
++
++ return rv
++end
++
++function Instance.data_instances( self, plugin, instance, dtype )
++ local rv = { }
++ local p = self._plugins[plugin]
++
++ if type(p) == "table" and type(p[instance]) == "table" and type(p[instance][dtype]) == "table" then
++ for i, instance in ipairs(p[instance][dtype]) do
++ table.insert( rv, instance )
++ end
++ end
++
++ return rv
++end
++
++function Instance.host_instances( self )
++ local hosts_path = fs.glob(self._rrddir..'/*')
++ local hosts = { }
++
++ if hosts_path then
++ local path
++ for path in hosts_path do
++ hosts[#hosts+1] = fs.basename(path)
++ end
++ end
++
++ return hosts
++end
++
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/i18n.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/i18n.lua
+new file mode 100644
+index 0000000..7877e61
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/i18n.lua
+@@ -0,0 +1,80 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.i18n", package.seeall)
++
++require("luci.util")
++require("luci.i18n")
++
++
++Instance = luci.util.class()
++
++
++function Instance.__init__( self, graph )
++ self.i18n = luci.i18n
++ self.graph = graph
++end
++
++function Instance._subst( self, str, val )
++ str = str:gsub( "%%H", self.graph.opts.host or "" )
++ str = str:gsub( "%%pn", val.plugin or "" )
++ str = str:gsub( "%%pi", val.pinst or "" )
++ str = str:gsub( "%%dt", val.dtype or "" )
++ str = str:gsub( "%%di", val.dinst or "" )
++ str = str:gsub( "%%ds", val.dsrc or "" )
++
++ return str
++end
++
++function Instance.title( self, plugin, pinst, dtype, dinst, user_title )
++
++ local title = user_title or
++ "p=%s/pi=%s/dt=%s/di=%s" % {
++ plugin,
++ (pinst and #pinst > 0) and pinst or "(nil)",
++ (dtype and #dtype > 0) and dtype or "(nil)",
++ (dinst and #dinst > 0) and dinst or "(nil)"
++ }
++
++ return self:_subst( title, {
++ plugin = plugin,
++ pinst = pinst,
++ dtype = dtype,
++ dinst = dinst
++ } )
++
++end
++
++function Instance.label( self, plugin, pinst, dtype, dinst, user_label )
++
++ local label = user_label or
++ "dt=%s/di=%s" % {
++ (dtype and #dtype > 0) and dtype or "(nil)",
++ (dinst and #dinst > 0) and dinst or "(nil)"
++ }
++
++ return self:_subst( label, {
++ plugin = plugin,
++ pinst = pinst,
++ dtype = dtype,
++ dinst = dinst
++ } )
++
++end
++
++function Instance.ds( self, source )
++
++ local label = source.title or
++ "dt=%s/di=%s/ds=%s" % {
++ (source.type and #source.type > 0) and source.type or "(nil)",
++ (source.instance and #source.instance > 0) and source.instance or "(nil)",
++ (source.ds and #source.ds > 0) and source.ds or "(nil)"
++ }
++
++ return self:_subst( label, {
++ dtype = source.type,
++ dinst = source.instance,
++ dsrc = source.ds
++ } ):gsub(":", "\\:")
++
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua
+new file mode 100644
+index 0000000..5d4ad98
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua
+@@ -0,0 +1,562 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool", package.seeall)
++
++require("luci.statistics.datatree")
++require("luci.statistics.rrdtool.colors")
++require("luci.statistics.i18n")
++require("luci.model.uci")
++require("luci.util")
++require("luci.sys")
++
++local fs = require "nixio.fs"
++
++
++Graph = luci.util.class()
++
++function Graph.__init__( self, timespan, opts )
++
++ opts = opts or { }
++
++ local uci = luci.model.uci.cursor()
++ local sections = uci:get_all( "luci_statistics" )
++
++ -- options
++ opts.timespan = timespan or sections.rrdtool.default_timespan or 900
++ opts.rrasingle = opts.rrasingle or ( sections.collectd_rrdtool.RRASingle == "1" )
++ opts.host = opts.host or sections.collectd.Hostname or luci.sys.hostname()
++ opts.width = opts.width or sections.rrdtool.image_width or 400
++ opts.rrdpath = opts.rrdpath or sections.collectd_rrdtool.DataDir or "/tmp/rrd"
++ opts.imgpath = opts.imgpath or sections.rrdtool.image_path or "/tmp/rrdimg"
++ opts.rrdpath = opts.rrdpath:gsub("/$","")
++ opts.imgpath = opts.imgpath:gsub("/$","")
++
++ -- helper classes
++ self.colors = luci.statistics.rrdtool.colors.Instance()
++ self.tree = luci.statistics.datatree.Instance(opts.host)
++ self.i18n = luci.statistics.i18n.Instance( self )
++
++ -- rrdtool default args
++ self.args = {
++ "-a", "PNG",
++ "-s", "NOW-" .. opts.timespan,
++ "-w", opts.width
++ }
++
++ -- store options
++ self.opts = opts
++end
++
++function Graph._mkpath( self, plugin, plugin_instance, dtype, dtype_instance )
++ local t = self.opts.host .. "/" .. plugin
++ if type(plugin_instance) == "string" and plugin_instance:len() > 0 then
++ t = t .. "-" .. plugin_instance
++ end
++ t = t .. "/" .. dtype
++ if type(dtype_instance) == "string" and dtype_instance:len() > 0 then
++ t = t .. "-" .. dtype_instance
++ end
++ return t
++end
++
++function Graph.mkrrdpath( self, ... )
++ return string.format( "%s/%s.rrd", self.opts.rrdpath, self:_mkpath( ... ) )
++end
++
++function Graph.mkpngpath( self, ... )
++ return string.format( "%s/%s.%i.png", self.opts.imgpath, self:_mkpath( ... ), self.opts.timespan )
++end
++
++function Graph.strippngpath( self, path )
++ return path:sub( self.opts.imgpath:len() + 2 )
++end
++
++function Graph._forcelol( self, list )
++ if type(list[1]) ~= "table" then
++ return( { list } )
++ end
++ return( list )
++end
++
++function Graph._rrdtool( self, def, rrd )
++
++ -- prepare directory
++ local dir = def[1]:gsub("/[^/]+$","")
++ fs.mkdirr( dir )
++
++ -- construct commandline
++ local cmdline = "rrdtool graph"
++
++ -- copy default arguments to def stack
++ for i, opt in ipairs(self.args) do
++ table.insert( def, 1 + i, opt )
++ end
++
++ -- construct commandline from def stack
++ for i, opt in ipairs(def) do
++ opt = opt .. "" -- force string
++
++ if rrd then
++ opt = opt:gsub( "{file}", rrd )
++ end
++
++ if opt:match("[^%w]") then
++ cmdline = cmdline .. " '" .. opt .. "'"
++ else
++ cmdline = cmdline .. " " .. opt
++ end
++ end
++
++ -- execute rrdtool
++ local rrdtool = io.popen( cmdline )
++ rrdtool:close()
++end
++
++function Graph._generic( self, opts, plugin, plugin_instance, dtype, index )
++
++ -- generated graph defs
++ local defs = { }
++
++ -- internal state variables
++ local _args = { }
++ local _sources = { }
++ local _stack_neg = { }
++ local _stack_pos = { }
++ local _longest_name = 0
++ local _has_totals = false
++
++ -- some convenient aliases
++ local _ti = table.insert
++ local _sf = string.format
++
++ -- local helper: append a string.format() formatted string to given table
++ function _tif( list, fmt, ... )
++ table.insert( list, string.format( fmt, ... ) )
++ end
++
++ -- local helper: create definitions for min, max, avg and create *_nnl (not null) variable from avg
++ function __def(source)
++
++ local inst = source.sname
++ local rrd = source.rrd
++ local ds = source.ds
++
++ if not ds or ds:len() == 0 then ds = "value" end
++
++ _tif( _args, "DEF:%s_avg_raw=%s:%s:AVERAGE", inst, rrd, ds )
++ _tif( _args, "CDEF:%s_avg=%s_avg_raw,%s", inst, inst, source.transform_rpn )
++
++ if not self.opts.rrasingle then
++ _tif( _args, "DEF:%s_min_raw=%s:%s:MIN", inst, rrd, ds )
++ _tif( _args, "CDEF:%s_min=%s_min_raw,%s", inst, inst, source.transform_rpn )
++ _tif( _args, "DEF:%s_max_raw=%s:%s:MAX", inst, rrd, ds )
++ _tif( _args, "CDEF:%s_max=%s_max_raw,%s", inst, inst, source.transform_rpn )
++ end
++
++ _tif( _args, "CDEF:%s_nnl=%s_avg,UN,0,%s_avg,IF", inst, inst, inst )
++ end
++
++ -- local helper: create cdefs depending on source options like flip and overlay
++ function __cdef(source)
++
++ local prev
++
++ -- find previous source, choose stack depending on flip state
++ if source.flip then
++ prev = _stack_neg[#_stack_neg]
++ else
++ prev = _stack_pos[#_stack_pos]
++ end
++
++ -- is first source in stack or overlay source: source_stk = source_nnl
++ if not prev or source.overlay then
++ -- create cdef statement for cumulative stack (no NaNs) and also
++ -- for display (preserving NaN where no points should be displayed)
++ _tif( _args, "CDEF:%s_stk=%s_nnl", source.sname, source.sname )
++ _tif( _args, "CDEF:%s_plot=%s_avg", source.sname, source.sname )
++
++ -- is subsequent source without overlay: source_stk = source_nnl + previous_stk
++ else
++ -- create cdef statement
++ _tif( _args, "CDEF:%s_stk=%s_nnl,%s_stk,+", source.sname, source.sname, prev )
++ _tif( _args, "CDEF:%s_plot=%s_avg,%s_stk,+", source.sname, source.sname, prev )
++ end
++
++ -- create multiply by minus one cdef if flip is enabled
++ if source.flip then
++
++ -- create cdef statement: source_stk = source_stk * -1
++ _tif( _args, "CDEF:%s_neg=%s_plot,-1,*", source.sname, source.sname )
++
++ -- push to negative stack if overlay is disabled
++ if not source.overlay then
++ _ti( _stack_neg, source.sname )
++ end
++
++ -- no flipping, push to positive stack if overlay is disabled
++ elseif not source.overlay then
++
++ -- push to positive stack
++ _ti( _stack_pos, source.sname )
++ end
++
++ -- calculate total amount of data if requested
++ if source.total then
++ _tif( _args,
++ "CDEF:%s_avg_sample=%s_avg,UN,0,%s_avg,IF,sample_len,*",
++ source.sname, source.sname, source.sname
++ )
++
++ _tif( _args,
++ "CDEF:%s_avg_sum=PREV,UN,0,PREV,IF,%s_avg_sample,+",
++ source.sname, source.sname, source.sname
++ )
++ end
++ end
++
++ -- local helper: create cdefs required for calculating total values
++ function __cdef_totals()
++ if _has_totals then
++ _tif( _args, "CDEF:mytime=%s_avg,TIME,TIME,IF", _sources[1].sname )
++ _ti( _args, "CDEF:sample_len_raw=mytime,PREV(mytime),-" )
++ _ti( _args, "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF" )
++ end
++ end
++
++ -- local helper: create line and area statements
++ function __line(source)
++
++ local line_color
++ local area_color
++ local legend
++ local var
++
++ -- find colors: try source, then opts.colors; fall back to random color
++ if type(source.color) == "string" then
++ line_color = source.color
++ area_color = self.colors:from_string( line_color )
++ elseif type(opts.colors[source.name:gsub("[^%w]","_")]) == "string" then
++ line_color = opts.colors[source.name:gsub("[^%w]","_")]
++ area_color = self.colors:from_string( line_color )
++ else
++ area_color = self.colors:random()
++ line_color = self.colors:to_string( area_color )
++ end
++
++ -- derive area background color from line color
++ area_color = self.colors:to_string( self.colors:faded( area_color ) )
++
++ -- choose source_plot or source_neg variable depending on flip state
++ if source.flip then
++ var = "neg"
++ else
++ var = "plot"
++ end
++
++ -- create legend
++ legend = _sf( "%-" .. _longest_name .. "s", source.title )
++
++ -- create area if not disabled
++ if not source.noarea then
++ _tif( _args, "AREA:%s_%s#%s", source.sname, var, area_color )
++ end
++
++ -- create line1 statement
++ _tif( _args, "LINE%d:%s_%s#%s:%s",
++ source.noarea and 2 or 1,
++ source.sname, var, line_color, legend )
++ end
++
++ -- local helper: create gprint statements
++ function __gprint(source)
++
++ local numfmt = opts.number_format or "%6.1lf"
++ local totfmt = opts.totals_format or "%5.1lf%s"
++
++ -- don't include MIN if rrasingle is enabled
++ if not self.opts.rrasingle then
++ _tif( _args, "GPRINT:%s_min:MIN:\tMin\\: %s", source.sname, numfmt )
++ end
++
++ -- always include AVERAGE
++ _tif( _args, "GPRINT:%s_avg:AVERAGE:\tAvg\\: %s", source.sname, numfmt )
++
++ -- don't include MAX if rrasingle is enabled
++ if not self.opts.rrasingle then
++ _tif( _args, "GPRINT:%s_max:MAX:\tMax\\: %s", source.sname, numfmt )
++ end
++
++ -- include total count if requested else include LAST
++ if source.total then
++ _tif( _args, "GPRINT:%s_avg_sum:LAST:(ca. %s Total)\\l", source.sname, totfmt )
++ else
++ _tif( _args, "GPRINT:%s_avg:LAST:\tLast\\: %s\\l", source.sname, numfmt )
++ end
++ end
++
++
++ --
++ -- find all data sources
++ --
++
++ -- find data types
++ local data_types
++
++ if dtype then
++ data_types = { dtype }
++ else
++ data_types = opts.data.types or { }
++ end
++
++ if not ( dtype or opts.data.types ) then
++ if opts.data.instances then
++ for k, v in pairs(opts.data.instances) do
++ _ti( data_types, k )
++ end
++ elseif opts.data.sources then
++ for k, v in pairs(opts.data.sources) do
++ _ti( data_types, k )
++ end
++ end
++ end
++
++
++ -- iterate over data types
++ for i, dtype in ipairs(data_types) do
++
++ -- find instances
++
++ local data_instances
++
++ if not opts.per_instance then
++ if type(opts.data.instances) == "table" and type(opts.data.instances[dtype]) == "table" then
++ data_instances = opts.data.instances[dtype]
++ else
++ data_instances = self.tree:data_instances( plugin, plugin_instance, dtype )
++ end
++ end
++
++ if type(data_instances) ~= "table" or #data_instances == 0 then data_instances = { "" } end
++
++
++ -- iterate over data instances
++ for i, dinst in ipairs(data_instances) do
++
++ -- construct combined data type / instance name
++ local dname = dtype
++
++ if dinst:len() > 0 then
++ dname = dname .. "_" .. dinst
++ end
++
++
++ -- find sources
++ local data_sources = { "value" }
++
++ if type(opts.data.sources) == "table" then
++ if type(opts.data.sources[dname]) == "table" then
++ data_sources = opts.data.sources[dname]
++ elseif type(opts.data.sources[dtype]) == "table" then
++ data_sources = opts.data.sources[dtype]
++ end
++ end
++
++
++ -- iterate over data sources
++ for i, dsource in ipairs(data_sources) do
++
++ local dsname = dtype .. "_" .. dinst:gsub("[^%w]","_") .. "_" .. dsource
++ local altname = dtype .. "__" .. dsource
++
++ --assert(dtype ~= "ping", dsname .. " or " .. altname)
++
++ -- find datasource options
++ local dopts = { }
++
++ if type(opts.data.options) == "table" then
++ if type(opts.data.options[dsname]) == "table" then
++ dopts = opts.data.options[dsname]
++ elseif type(opts.data.options[altname]) == "table" then
++ dopts = opts.data.options[altname]
++ elseif type(opts.data.options[dname]) == "table" then
++ dopts = opts.data.options[dname]
++ elseif type(opts.data.options[dtype]) == "table" then
++ dopts = opts.data.options[dtype]
++ end
++ end
++
++
++ -- store values
++ _ti( _sources, {
++ rrd = dopts.rrd or self:mkrrdpath( plugin, plugin_instance, dtype, dinst ),
++ color = dopts.color or self.colors:to_string( self.colors:random() ),
++ flip = dopts.flip or false,
++ total = dopts.total or false,
++ overlay = dopts.overlay or false,
++ transform_rpn = dopts.transform_rpn or "0,+",
++ noarea = dopts.noarea or false,
++ title = dopts.title or nil,
++ weight = dopts.weight or nil,
++ ds = dsource,
++ type = dtype,
++ instance = dinst,
++ index = #_sources + 1,
++ sname = ( #_sources + 1 ) .. dtype
++ } )
++
++
++ -- generate datasource title
++ _sources[#_sources].title = self.i18n:ds( _sources[#_sources] )
++
++
++ -- find longest name ...
++ if _sources[#_sources].title:len() > _longest_name then
++ _longest_name = _sources[#_sources].title:len()
++ end
++
++
++ -- has totals?
++ if _sources[#_sources].total then
++ _has_totals = true
++ end
++ end
++ end
++ end
++
++
++ --
++ -- construct diagrams
++ --
++
++ -- if per_instance is enabled then find all instances from the first datasource in diagram
++ -- if per_instance is disabled then use an empty pseudo instance and use model provided values
++ local instances = { "" }
++
++ if opts.per_instance then
++ instances = self.tree:data_instances( plugin, plugin_instance, _sources[1].type )
++ end
++
++
++ -- iterate over instances
++ for i, instance in ipairs(instances) do
++
++ -- store title and vlabel
++ _ti( _args, "-t" )
++ _ti( _args, self.i18n:title( plugin, plugin_instance, _sources[1].type, instance, opts.title ) )
++ _ti( _args, "-v" )
++ _ti( _args, self.i18n:label( plugin, plugin_instance, _sources[1].type, instance, opts.vlabel ) )
++ if opts.y_max then
++ _ti ( _args, "-u" )
++ _ti ( _args, opts.y_max )
++ end
++ if opts.y_min then
++ _ti ( _args, "-l" )
++ _ti ( _args, opts.y_min )
++ end
++ if opts.units_exponent then
++ _ti ( _args, "-X" )
++ _ti ( _args, opts.units_exponent )
++ end
++ if opts.alt_autoscale then
++ _ti ( _args, "-A" )
++ end
++ if opts.alt_autoscale_max then
++ _ti ( _args, "-M" )
++ end
++
++ -- store additional rrd options
++ if opts.rrdopts then
++ for i, o in ipairs(opts.rrdopts) do _ti( _args, o ) end
++ end
++
++ -- sort sources
++ table.sort(_sources, function(a, b)
++ local x = a.weight or a.index or 0
++ local y = b.weight or b.index or 0
++ return x < y
++ end)
++
++ -- create DEF statements for each instance
++ for i, source in ipairs(_sources) do
++ -- fixup properties for per instance mode...
++ if opts.per_instance then
++ source.instance = instance
++ source.rrd = self:mkrrdpath( plugin, plugin_instance, source.type, instance )
++ end
++
++ __def( source )
++ end
++
++ -- create CDEF required for calculating totals
++ __cdef_totals()
++
++ -- create CDEF statements for each instance in reversed order
++ for i, source in ipairs(_sources) do
++ __cdef( _sources[1 + #_sources - i] )
++ end
++
++ -- create LINE1, AREA and GPRINT statements for each instance
++ for i, source in ipairs(_sources) do
++ __line( source )
++ __gprint( source )
++ end
++
++ -- prepend image path to arg stack
++ _ti( _args, 1, self:mkpngpath( plugin, plugin_instance, index .. instance ) )
++
++ -- push arg stack to definition list
++ _ti( defs, _args )
++
++ -- reset stacks
++ _args = { }
++ _stack_pos = { }
++ _stack_neg = { }
++ end
++
++ return defs
++end
++
++function Graph.render( self, plugin, plugin_instance, is_index )
++
++ dtype_instances = dtype_instances or { "" }
++ local pngs = { }
++
++ -- check for a whole graph handler
++ local plugin_def = "luci.statistics.rrdtool.definitions." .. plugin
++ local stat, def = pcall( require, plugin_def )
++
++ if stat and def and type(def.rrdargs) == "function" then
++
++ -- temporary image matrix
++ local _images = { }
++
++ -- get diagram definitions
++ for i, opts in ipairs( self:_forcelol( def.rrdargs( self, plugin, plugin_instance, nil, is_index ) ) ) do
++ if not is_index or not opts.detail then
++ _images[i] = { }
++
++ -- get diagram definition instances
++ local diagrams = self:_generic( opts, plugin, plugin_instance, nil, i )
++
++ -- render all diagrams
++ for j, def in ipairs( diagrams ) do
++ -- remember image
++ _images[i][j] = def[1]
++
++ -- exec
++ self:_rrdtool( def )
++ end
++ end
++ end
++
++ -- remember images - XXX: fixme (will cause probs with asymmetric data)
++ for y = 1, #_images[1] do
++ for x = 1, #_images do
++ table.insert( pngs, _images[x][y] )
++ end
++ end
++ end
++
++ return pngs
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/colors.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/colors.lua
+new file mode 100644
+index 0000000..5b35dff
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/colors.lua
+@@ -0,0 +1,61 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.colors", package.seeall)
++
++require("luci.util")
++
++
++Instance = luci.util.class()
++
++function Instance.from_string( self, s )
++ return {
++ tonumber(s:sub(1,2), 16),
++ tonumber(s:sub(3,4), 16),
++ tonumber(s:sub(5,6), 16)
++ }
++end
++
++function Instance.to_string( self, c )
++ return string.format(
++ "%02x%02x%02x",
++ math.floor(c[1]),
++ math.floor(c[2]),
++ math.floor(c[3])
++ )
++end
++
++function Instance.random( self )
++ local r = math.random(255)
++ local g = math.random(255)
++ local min = 0
++ local max = 255
++
++ if ( r + g ) < 255 then
++ min = 255 - r - g
++ else
++ max = 511 - r - g
++ end
++
++ local b = min + math.floor( math.random() * ( max - min ) )
++
++ return { r, g, b }
++end
++
++function Instance.faded( self, fg, opts )
++ opts = opts or {}
++ opts.background = opts.background or { 255, 255, 255 }
++ opts.alpha = opts.alpha or 0.25
++
++ if type(opts.background) == "string" then
++ opts.background = _string_to_color(opts.background)
++ end
++
++ local bg = opts.background
++
++ return {
++ ( opts.alpha * fg[1] ) + ( ( 1.0 - opts.alpha ) * bg[1] ),
++ ( opts.alpha * fg[2] ) + ( ( 1.0 - opts.alpha ) * bg[2] ),
++ ( opts.alpha * fg[3] ) + ( ( 1.0 - opts.alpha ) * bg[3] )
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/conntrack.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/conntrack.lua
+new file mode 100644
+index 0000000..fbc4773
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/conntrack.lua
+@@ -0,0 +1,27 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.conntrack",package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++ return {
++ title = "%H: Conntrack entries",
++ vlabel = "Count",
++ number_format = "%5.0lf",
++ data = {
++ -- collectd 5.5+: specify "" to exclude "max" instance
++ instances = {
++ conntrack = { "" }
++ },
++ sources = {
++ conntrack = { "value" }
++ },
++ options = {
++ conntrack = {
++ color = "0000ff",
++ title = "Tracked connections"
++ }
++ }
++ }
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/cpu.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/cpu.lua
+new file mode 100644
+index 0000000..ae0c0ce
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/cpu.lua
+@@ -0,0 +1,31 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.cpu",package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++
++ return {
++ title = "%H: Processor usage on core #%pi",
++ y_min = "0",
++ alt_autoscale_max = true,
++ vlabel = "Percent",
++ number_format = "%5.1lf%%",
++ data = {
++ instances = {
++ cpu = { "user", "nice", "system", "softirq", "interrupt" }
++ },
++
++ options = {
++ cpu_idle = { color = "ffffff", title = "Idle" },
++ cpu_nice = { color = "00e000", title = "Nice" },
++ cpu_user = { color = "0000ff", title = "User" },
++ cpu_wait = { color = "ffb000", title = "Wait" },
++ cpu_system = { color = "ff0000", title = "System" },
++ cpu_softirq = { color = "ff00ff", title = "Softirq" },
++ cpu_interrupt = { color = "a000a0", title = "Interrupt" },
++ cpu_steal = { color = "000000", title = "Steal" }
++ }
++ }
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/df.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/df.lua
+new file mode 100644
+index 0000000..78c9ef5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/df.lua
+@@ -0,0 +1,34 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.df", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++
++ return {
++ title = "%H: Disk space usage on %di",
++ vlabel = "Bytes",
++ per_instance = true,
++ number_format = "%5.1lf%sB",
++
++ data = {
++ sources = {
++ df = { "free", "used" }
++ },
++
++ options = {
++ df__free = {
++ color = "00ff00",
++ overlay = false,
++ title = "free"
++ },
++
++ df__used = {
++ color = "ff0000",
++ overlay = false,
++ title = "used"
++ }
++ }
++ }
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/disk.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/disk.lua
+new file mode 100644
+index 0000000..8aabb7f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/disk.lua
+@@ -0,0 +1,62 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.disk", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++ return {
++ {
++ title = "%H: Disk I/O operations on %pi",
++ vlabel = "Operations/s",
++ number_format = "%5.1lf%sOp/s",
++
++ data = {
++ types = { "disk_ops" },
++ sources = {
++ disk_ops = { "read", "write" },
++ },
++
++ options = {
++ disk_ops__read = {
++ title = "Reads",
++ color = "00ff00",
++ flip = false
++ },
++
++ disk_ops__write = {
++ title = "Writes",
++ color = "ff0000",
++ flip = true
++ }
++ }
++ }
++ },
++
++ {
++ title = "%H: Disk I/O bandwidth on %pi",
++ vlabel = "Bytes/s",
++ number_format = "%5.1lf%sB/s",
++
++ detail = true,
++
++ data = {
++ types = { "disk_octets" },
++ sources = {
++ disk_octets = { "read", "write" }
++ },
++ options = {
++ disk_octets__read = {
++ title = "Read",
++ color = "00ff00",
++ flip = false
++ },
++ disk_octets__write = {
++ title = "Write",
++ color = "ff0000",
++ flip = true
++ }
++ }
++ }
++ }
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/dns.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/dns.lua
+new file mode 100644
+index 0000000..cf96d8f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/dns.lua
+@@ -0,0 +1,71 @@
++-- Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.dns", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance )
++
++ local traffic = {
++ title = "%H: DNS traffic", vlabel = "Bit/s",
++
++ data = {
++ sources = {
++ dns_octets = { "queries", "responses" }
++ },
++
++ options = {
++ dns_octets__responses = {
++ total = true,
++ color = "00ff00",
++ title = "Responses"
++ },
++
++ dns_octets__queries = {
++ total = true,
++ color = "0000ff",
++ title = "Queries"
++ }
++ }
++ }
++ }
++
++ local opcode_query = {
++ title = "%H: DNS Opcode Query", vlabel = "Queries/s",
++ data = {
++ instances = { dns_opcode = { "Query" } },
++ options = {
++ dns_opcode_Query_value = {
++ total = true,
++ color = "0000ff",
++ title = "Queries/s"
++ },
++ }
++ }
++ }
++
++ local qtype = {
++ title = "%H: DNS QType", vlabel = "Queries/s",
++ data = {
++ sources = { dns_qtype = { "" } },
++ options = {
++ dns_qtype_AAAA_ = { title = "AAAA", noarea = true, total = true },
++ dns_qtype_A_ = { title = "A", noarea = true, total = true },
++ dns_qtype_A6_ = { title = "A6", noarea = true, total = true },
++ dns_qtype_TXT_ = { title = "TXT", noarea = true, total = true },
++ dns_qtype_MX_ = { title = "MX", noarea = true, total = true },
++ dns_qtype_NS_ = { title = "NS", noarea = true, total = true },
++ dns_qtype_ANY_ = { title = "ANY", noarea = true, total = true },
++ dns_qtype_CNAME_= { title = "CNAME", noarea = true, total = true },
++ dns_qtype_SOA_ = { title = "SOA", noarea = true, total = true },
++ dns_qtype_SRV_ = { title = "SRV", noarea = true, total = true },
++ dns_qtype_PTR_ = { title = "PTR", noarea = true, total = true },
++ dns_qtype_RP_ = { title = "RP", noarea = true, total = true },
++ dns_qtype_MAILB_= { title = "MAILB", noarea = true, total = true },
++ dns_qtype_IXFR_ = { title = "IXFR", noarea = true, total = true },
++ dns_qtype_HINFO_= { title = "HINFO", noarea = true, total = true },
++ },
++ }
++ }
++
++ return { traffic, opcode_query, qtype }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/entropy.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/entropy.lua
+new file mode 100644
+index 0000000..3d30a70
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/entropy.lua
+@@ -0,0 +1,19 @@
++-- Copyright 2015 Hannu Nyman <hannu.nyman@iki.fi>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.entropy", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++
++ return {
++ title = "%H: Available entropy",
++ vlabel = "bits",
++ number_format = "%4.0lf",
++ data = {
++ types = { "entropy" },
++ options = { entropy = { title = "Entropy %di" } }
++ }
++ }
++
++end
++
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/interface.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/interface.lua
+new file mode 100644
+index 0000000..6f687d2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/interface.lua
+@@ -0,0 +1,109 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.interface", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance )
++
++ --
++ -- traffic diagram
++ --
++ local traffic = {
++
++ -- draw this diagram for each plugin instance
++ per_instance = true,
++ title = "%H: Transfer on %pi",
++ vlabel = "Bytes/s",
++
++ -- diagram data description
++ data = {
++ -- defined sources for data types, if ommitted assume a single DS named "value" (optional)
++ sources = {
++ if_octets = { "tx", "rx" }
++ },
++
++ -- special options for single data lines
++ options = {
++ if_octets__tx = {
++ total = true, -- report total amount of bytes
++ color = "00ff00", -- tx is green
++ title = "Bytes (TX)"
++ },
++
++ if_octets__rx = {
++ flip = true, -- flip rx line
++ total = true, -- report total amount of bytes
++ color = "0000ff", -- rx is blue
++ title = "Bytes (RX)"
++ }
++ }
++ }
++ }
++
++
++ --
++ -- packet diagram
++ --
++ local packets = {
++
++ -- draw this diagram for each plugin instance
++ per_instance = true,
++ title = "%H: Packets on %pi",
++ vlabel = "Packets/s",
++
++ -- diagram data description
++ data = {
++ -- data type order
++ types = { "if_packets", "if_errors" },
++
++ -- defined sources for data types
++ sources = {
++ if_packets = { "tx", "rx" },
++ if_errors = { "tx", "rx" }
++ },
++
++ -- special options for single data lines
++ options = {
++ -- processed packets (tx DS)
++ if_packets__tx = {
++ weight = 1,
++ overlay = true, -- don't summarize
++ total = true, -- report total amount of bytes
++ color = "00ff00", -- processed tx is green
++ title = "Processed (TX)"
++ },
++
++ -- processed packets (rx DS)
++ if_packets__rx = {
++ weight = 2,
++ overlay = true, -- don't summarize
++ flip = true, -- flip rx line
++ total = true, -- report total amount of bytes
++ color = "0000ff", -- processed rx is blue
++ title = "Processed (RX)"
++ },
++
++ -- packet errors (tx DS)
++ if_errors__tx = {
++ weight = 0,
++ overlay = true, -- don't summarize
++ total = true, -- report total amount of packets
++ color = "ff5500", -- tx errors are orange
++ title = "Errors (TX)"
++ },
++
++ -- packet errors (rx DS)
++ if_errors__rx = {
++ weight = 3,
++ overlay = true, -- don't summarize
++ flip = true, -- flip rx line
++ total = true, -- report total amount of packets
++ color = "ff0000", -- rx errors are red
++ title = "Errors (RX)"
++ }
++ }
++ }
++ }
++
++ return { traffic, packets }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iptables.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iptables.lua
+new file mode 100644
+index 0000000..9790e0e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iptables.lua
+@@ -0,0 +1,41 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.iptables", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++
++ return {
++ {
++ title = "%H: Firewall: Processed bytes in %pi",
++ vlabel = "Bytes/s",
++ number_format = "%5.0lf%sB/s",
++ totals_format = "%5.0lf%sB",
++ data = {
++ types = { "ipt_bytes" },
++ options = {
++ ipt_bytes = {
++ total = true,
++ title = "%di"
++ }
++ }
++ }
++ },
++
++ {
++ title = "%H: Firewall: Processed packets in %pi",
++ vlabel = "Packets/s",
++ number_format = "%5.1lf P/s",
++ totals_format = "%5.0lf%s",
++ data = {
++ types = { "ipt_packets" },
++ options = {
++ ipt_packets = {
++ total = true,
++ title = "%di"
++ }
++ }
++ }
++ }
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/irq.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/irq.lua
+new file mode 100644
+index 0000000..f61d0da
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/irq.lua
+@@ -0,0 +1,18 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.irq", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++
++ return {
++ title = "%H: Interrupts", vlabel = "Issues/s",
++ number_format = "%5.0lf", data = {
++ types = { "irq" },
++ options = {
++ irq = { title = "IRQ %di", noarea = true }
++ }
++ }
++ }
++
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iwinfo.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iwinfo.lua
+new file mode 100644
+index 0000000..194afd6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iwinfo.lua
+@@ -0,0 +1,92 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.iwinfo", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance )
++
++ --
++ -- signal/noise diagram
++ --
++ local snr = {
++ title = "%H: Signal and noise on %pi",
++ vlabel = "dBm",
++ number_format = "%5.1lf dBm",
++ data = {
++ types = { "signal_noise", "signal_power" },
++ options = {
++ signal_power = {
++ title = "Signal",
++ overlay = true,
++ color = "0000ff"
++ },
++ signal_noise = {
++ title = "Noise",
++ overlay = true,
++ color = "ff0000"
++ }
++ }
++ }
++ }
++
++
++ --
++ -- signal quality diagram
++ --
++ local quality = {
++ title = "%H: Signal quality on %pi",
++ vlabel = "Quality",
++ number_format = "%3.0lf",
++ data = {
++ types = { "signal_quality" },
++ options = {
++ signal_quality = {
++ title = "Quality",
++ noarea = true,
++ color = "0000ff"
++ }
++ }
++ }
++ }
++
++
++ --
++ -- phy rate diagram
++ --
++ local bitrate = {
++ title = "%H: Average phy rate on %pi",
++ vlabel = "MBit/s",
++ number_format = "%5.1lf%sBit/s",
++ data = {
++ types = { "bitrate" },
++ options = {
++ bitrate = {
++ title = "Rate",
++ color = "00ff00"
++ }
++ }
++ }
++ }
++
++ --
++ -- associated stations
++ --
++ local stations = {
++ title = "%H: Associated stations on %pi",
++ vlabel = "Stations",
++ y_min = "0",
++ alt_autoscale_max = true,
++ number_format = "%3.0lf",
++ data = {
++ types = { "stations" },
++ options = {
++ stations = {
++ title = "Stations",
++ color = "0000ff"
++ }
++ }
++ }
++ }
++
++ return { snr, quality, bitrate, stations }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/load.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/load.lua
+new file mode 100644
+index 0000000..ce762da
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/load.lua
+@@ -0,0 +1,24 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.load", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++
++ return {
++ title = "%H: Load", vlabel = "Load",
++ y_min = "0",
++ units_exponent = "0",
++ number_format = "%5.2lf", data = {
++ sources = {
++ load = { "shortterm", "midterm", "longterm" }
++ },
++
++ options = {
++ load__shortterm = { color = "ff0000", title = "1 minute", noarea = true },
++ load__midterm = { color = "ff6600", title = "5 minutes", noarea = true },
++ load__longterm = { color = "ffaa00", title = "15 minutes", noarea = true }
++ }
++ }
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/memory.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/memory.lua
+new file mode 100644
+index 0000000..53d559c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/memory.lua
+@@ -0,0 +1,35 @@
++--[[
++
++(c) 2011 Manuel Munz <freifunk at somakoma dot de>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++]]--
++
++module("luci.statistics.rrdtool.definitions.memory",package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++
++ return {
++ title = "%H: Memory usage",
++ vlabel = "MB",
++ number_format = "%5.1lf%s",
++ y_min = "0",
++ alt_autoscale_max = true,
++ data = {
++ instances = {
++ memory = { "free", "buffered", "cached", "used" }
++ },
++
++ options = {
++ memory_buffered = { color = "0000ff", title = "Buffered" },
++ memory_cached = { color = "ff00ff", title = "Cached" },
++ memory_used = { color = "ff0000", title = "Used" },
++ memory_free = { color = "00ff00", title = "Free" }
++ }
++ }
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/netlink.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/netlink.lua
+new file mode 100644
+index 0000000..7b6acf3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/netlink.lua
+@@ -0,0 +1,211 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.netlink", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance )
++
++ --
++ -- traffic diagram
++ --
++ local traffic = {
++ title = "%H: Netlink - Transfer on %pi",
++ vlabel = "Bytes/s",
++
++ -- diagram data description
++ data = {
++ -- defined sources for data types, if ommitted assume a single DS named "value" (optional)
++ sources = {
++ if_octets = { "tx", "rx" }
++ },
++
++ -- special options for single data lines
++ options = {
++ if_octets__tx = {
++ title = "Bytes (TX)",
++ total = true, -- report total amount of bytes
++ color = "00ff00" -- tx is green
++ },
++
++ if_octets__rx = {
++ title = "Bytes (RX)",
++ flip = true, -- flip rx line
++ total = true, -- report total amount of bytes
++ color = "0000ff" -- rx is blue
++ }
++ }
++ }
++ }
++
++
++ --
++ -- packet diagram
++ --
++ local packets = {
++ title = "%H: Netlink - Packets on %pi",
++ vlabel = "Packets/s", detail = true,
++
++ -- diagram data description
++ data = {
++ -- data type order
++ types = { "if_packets", "if_dropped", "if_errors" },
++
++ -- defined sources for data types
++ sources = {
++ if_packets = { "tx", "rx" },
++ if_dropped = { "tx", "rx" },
++ if_errors = { "tx", "rx" }
++ },
++
++ -- special options for single data lines
++ options = {
++ -- processed packets (tx DS)
++ if_packets__tx = {
++ weight = 2,
++ title = "Total (TX)",
++ overlay = true, -- don't summarize
++ total = true, -- report total amount of bytes
++ color = "00ff00" -- processed tx is green
++ },
++
++ -- processed packets (rx DS)
++ if_packets__rx = {
++ weight = 3,
++ title = "Total (RX)",
++ overlay = true, -- don't summarize
++ flip = true, -- flip rx line
++ total = true, -- report total amount of bytes
++ color = "0000ff" -- processed rx is blue
++ },
++
++ -- dropped packets (tx DS)
++ if_dropped__tx = {
++ weight = 1,
++ title = "Dropped (TX)",
++ overlay = true, -- don't summarize
++ total = true, -- report total amount of bytes
++ color = "660055" -- dropped tx is ... dunno ;)
++ },
++
++ -- dropped packets (rx DS)
++ if_dropped__rx = {
++ weight = 4,
++ title = "Dropped (RX)",
++ overlay = true, -- don't summarize
++ flip = true, -- flip rx line
++ total = true, -- report total amount of bytes
++ color = "ff00ff" -- dropped rx is violett
++ },
++
++ -- packet errors (tx DS)
++ if_errors__tx = {
++ weight = 0,
++ title = "Errors (TX)",
++ overlay = true, -- don't summarize
++ total = true, -- report total amount of packets
++ color = "ff5500" -- tx errors are orange
++ },
++
++ -- packet errors (rx DS)
++ if_errors__rx = {
++ weight = 5,
++ title = "Errors (RX)",
++ overlay = true, -- don't summarize
++ flip = true, -- flip rx line
++ total = true, -- report total amount of packets
++ color = "ff0000" -- rx errors are red
++ }
++ }
++ }
++ }
++
++
++ --
++ -- multicast diagram
++ --
++ local multicast = {
++ title = "%H: Netlink - Multicast on %pi",
++ vlabel = "Packets/s", detail = true,
++
++ -- diagram data description
++ data = {
++ -- data type order
++ types = { "if_multicast" },
++
++ -- special options for single data lines
++ options = {
++ -- multicast packets
++ if_multicast = {
++ title = "Packets",
++ total = true, -- report total amount of packets
++ color = "0000ff" -- multicast is blue
++ }
++ }
++ }
++ }
++
++
++ --
++ -- collision diagram
++ --
++ local collisions = {
++ title = "%H: Netlink - Collisions on %pi",
++ vlabel = "Collisions/s", detail = true,
++
++ -- diagram data description
++ data = {
++ -- data type order
++ types = { "if_collisions" },
++
++ -- special options for single data lines
++ options = {
++ -- collision rate
++ if_collisions = {
++ title = "Collisions",
++ total = true, -- report total amount of packets
++ color = "ff0000" -- collsions are red
++ }
++ }
++ }
++ }
++
++
++ --
++ -- error diagram
++ --
++ local errors = {
++ title = "%H: Netlink - Errors on %pi",
++ vlabel = "Errors/s", detail = true,
++
++ -- diagram data description
++ data = {
++ -- data type order
++ types = { "if_tx_errors", "if_rx_errors" },
++
++ -- data type instances
++ instances = {
++ if_tx_errors = { "aborted", "carrier", "fifo", "heartbeat", "window" },
++ if_rx_errors = { "length", "missed", "over", "crc", "fifo", "frame" }
++ },
++
++ -- special options for single data lines
++ options = {
++ if_tx_errors_aborted_value = { total = true, color = "ffff00", title = "Aborted (TX)" },
++ if_tx_errors_carrier_value = { total = true, color = "ffcc00", title = "Carrier (TX)" },
++ if_tx_errors_fifo_value = { total = true, color = "ff9900", title = "Fifo (TX)" },
++ if_tx_errors_heartbeat_value = { total = true, color = "ff6600", title = "Heartbeat (TX)" },
++ if_tx_errors_window_value = { total = true, color = "ff3300", title = "Window (TX)" },
++
++ if_rx_errors_length_value = { flip = true, total = true, color = "ff0000", title = "Length (RX)" },
++ if_rx_errors_missed_value = { flip = true, total = true, color = "ff0033", title = "Missed (RX)" },
++ if_rx_errors_over_value = { flip = true, total = true, color = "ff0066", title = "Over (RX)" },
++ if_rx_errors_crc_value = { flip = true, total = true, color = "ff0099", title = "CRC (RX)" },
++ if_rx_errors_fifo_value = { flip = true, total = true, color = "ff00cc", title = "Fifo (RX)" },
++ if_rx_errors_frame_value = { flip = true, total = true, color = "ff00ff", title = "Frame (RX)" }
++ }
++ }
++ }
++
++
++ return { traffic, packets, multicast, collisions, errors }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/nut.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/nut.lua
+new file mode 100644
+index 0000000..8b04ab8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/nut.lua
+@@ -0,0 +1,87 @@
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.nut",package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++
++ local voltages = {
++ title = "%H: Voltages on UPS \"%pi\"",
++ vlabel = "V",
++ number_format = "%5.1lfV",
++ data = {
++ instances = {
++ voltage = { "battery", "input", "output" }
++ },
++
++ options = {
++ voltage_output = { color = "00e000", title = "Output voltage", noarea=true, overlay=true },
++ voltage_battery = { color = "0000ff", title = "Battery voltage", noarea=true, overlay=true },
++ voltage_input = { color = "ffb000", title = "Input voltage", noarea=true, overlay=true }
++ }
++ }
++ }
++
++ local currents = {
++ title = "%H: Current on UPS \"%pi\"",
++ vlabel = "A",
++ number_format = "%5.3lfA",
++ data = {
++ instances = {
++ current = { "battery", "output" }
++ },
++
++ options = {
++ current_output = { color = "00e000", title = "Output current", noarea=true, overlay=true },
++ current_battery = { color = "0000ff", title = "Battery current", noarea=true, overlay=true },
++ }
++ }
++ }
++
++ local percentage = {
++ title = "%H: Battery charge on UPS \"%pi\"",
++ vlabel = "Percent",
++ y_min = "0",
++ y_max = "100",
++ number_format = "%5.1lf%%",
++ data = {
++ instances = {
++ percent = "charge"
++ },
++ options = {
++ percent_charge = { color = "00ff00", title = "Charge level" }
++ }
++ }
++ }
++
++ -- Note: This is in ISO8859-1 for rrdtool. Welcome to the 20th century.
++ local temperature = {
++ title = "%H: Battery temperature on UPS \"%pi\"",
++ vlabel = "\176C",
++ number_format = "%5.1lf\176C",
++ data = {
++ instances = {
++ temperature = "battery"
++ },
++
++ options = {
++ temperature_battery = { color = "ffb000", title = "Battery temperature" }
++ }
++ }
++ }
++
++ local timeleft = {
++ title = "%H: Time left on UPS \"%pi\"",
++ vlabel = "Minutes",
++ number_format = "%.1lfm",
++ data = {
++ instances = {
++ timeleft = { "battery" }
++ },
++ options = {
++ timeleft_battery = { color = "0000ff", title = "Time left", transform_rpn = "60,/" }
++ }
++ }
++ }
++
++ return { voltages, currents, percentage, temperature, timeleft }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/olsrd.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/olsrd.lua
+new file mode 100644
+index 0000000..a694695
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/olsrd.lua
+@@ -0,0 +1,136 @@
++-- Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.olsrd", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++ local g = { }
++
++ if plugin_instance == "routes" then
++
++ g[#g+1] = {
++ -- diagram data description
++ title = "%H: Total amount of OLSR routes", vlabel = "n",
++ number_format = "%5.0lf", data = {
++ types = { "routes" },
++ options = {
++ routes = {
++ color = "ff0000",
++ title = "Total number of routes"
++ }
++ }
++ }
++ }
++
++ g[#g+1] = {
++ title = "%H: Average route ETX", vlabel = "ETX", detail = true,
++ number_format = "%5.1lf",data = {
++ instances = { "average" }, -- falls es irgendwann mal welche pro ip gibt, wie bei links, dann werden die hier excludiert
++ types = { "route_etx" },
++ options = {
++ route_etx = {
++ title = "Average route ETX"
++ }
++ }
++ }
++ }
++
++ g[#g+1] = {
++ title = "%H: Average route metric", vlabel = "metric", detail = true,
++ number_format = "%5.1lf", data = {
++ instances = { "average" }, -- falls es irgendwann mal welche pro ip gibt, wie bei links, dann werden die hier excludiert
++ types = { "route_metric" },
++ options = {
++ route_metric = {
++ title = "Average route metric"
++ }
++ }
++ }
++ }
++
++ elseif plugin_instance == "links" then
++
++ g[#g+1] = {
++ -- diagram data description
++ title = "%H: Total amount of OLSR neighbours", vlabel = "n",
++ number_format = "%5.0lf", data = {
++ instances = { "" },
++ types = { "links" },
++ options = {
++ links = {
++ color = "00ff00",
++ title = "Number of neighbours"
++ }
++ }
++ }
++ }
++
++ local instances = graph.tree:data_instances(plugin, plugin_instance, "signal_quality")
++ table.sort(instances)
++
++ -- define one diagram per host, containing the rx and lq values
++ local i
++ for i = 1, #instances, 2 do
++ local dsn1 = "signal_quality_%s_value" % instances[i]:gsub("[^%w]+", "_")
++ local dsn2 = "signal_quality_%s_value" % instances[i+1]:gsub("[^%w]+", "_")
++ local host = instances[i]:match("^[^%-]+%-([^%-]+)%-.+")
++
++ g[#g+1] = {
++ title = "%H: Signal Quality" .. " (" .. (host or "avg") ..")", vlabel = "ETX",
++ number_format = "%5.2lf", detail = true,
++ data = {
++ types = { "signal_quality" },
++
++ instances = {
++ signal_quality = { instances[i], instances[i+1] },
++ },
++
++ options = {
++ [dsn1] = {
++ color = "00ff00",
++ title = "LQ (%s)" % (host or "avg"),
++ },
++ [dsn2] = {
++ color = "0000ff",
++ title = "NLQ (%s)" % (host or "avg"),
++ flip = true
++ }
++ }
++ }
++ }
++ end
++
++ elseif plugin_instance == "topology" then
++
++ g[#g+1] = {
++ title= "%H: Total amount of OLSR links", vlabel = "n",
++ number_format = "%5.0lf", data = {
++ instances = { "" },
++ types = { "links" },
++ options = {
++ links = {
++ color = "0000ff",
++ title = "Total number of links"
++ }
++ }
++ }
++ }
++
++ g[#g+1] = {
++ title= "%H: Average signal quality", vlabel = "n",
++ number_format = "%5.2lf", detail = true,
++ data = {
++ instances = { "average" }, -- exclude possible per-ip stuff
++ types = { "signal_quality" },
++ options = {
++ signal_quality = {
++ color = "0000ff",
++ title = "Average signal quality"
++ }
++ }
++ }
++ }
++ end
++
++ return g
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/openvpn.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/openvpn.lua
+new file mode 100644
+index 0000000..876e871
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/openvpn.lua
+@@ -0,0 +1,48 @@
++-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.openvpn", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance )
++ local inst = plugin_instance:gsub("^openvpn%.(.+)%.status$", "%1")
++
++ return {
++ {
++ title = "%%H: OpenVPN \"%s\" - Traffic" % inst,
++ vlabel = "Bytes/s",
++ data = {
++ instances = {
++ if_octets = { "traffic", "overhead" }
++ },
++ sources = {
++ if_octets = { "tx", "rx" }
++ },
++ options = {
++ if_octets_traffic_tx = { weight = 0, title = "Bytes (TX)", total = true, color = "00ff00" },
++ if_octets_overhead_tx = { weight = 1, title = "Overhead (TX)", total = true, color = "ff9900" },
++ if_octets_overhead_rx = { weight = 2, title = "Overhead (RX)", total = true, flip = true, color = "ff00ff" },
++ if_octets_traffic_rx = { weight = 3, title = "Bytes (RX)", total = true, flip = true, color = "0000ff" }
++ }
++ }
++ },
++
++ {
++ title = "%%H: OpenVPN \"%s\" - Compression" % inst,
++ vlabel = "Bytes/s",
++ data = {
++ instances = {
++ compression = { "data_out", "data_in" }
++ },
++ sources = {
++ compression = { "uncompressed", "compressed" }
++ },
++ options = {
++ compression_data_out_uncompressed = { weight = 0, title = "Uncompressed (TX)", total = true, color = "00ff00" },
++ compression_data_out_compressed = { weight = 1, title = "Compressed (TX)", total = true, color = "008800" },
++ compression_data_in_compressed = { weight = 2, title = "Compressed (RX)", total = true, flip = true, color = "000088" },
++ compression_data_in_uncompressed = { weight = 3, title = "Uncompressed (RX)", total = true, flip = true, color = "0000ff" }
++ }
++ }
++ }
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/ping.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/ping.lua
+new file mode 100644
+index 0000000..f0a5948
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/ping.lua
+@@ -0,0 +1,38 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.ping", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++ return {
++ -- Ping roundtrip time
++ { title = "%H: ICMP Round Trip Time",
++ vlabel = "ms",
++ number_format = "%5.1lf ms",
++ data = {
++ sources = { ping = { "value" } },
++ options = { ping__value = {
++ noarea = true, overlay = true, title = "%di" } }
++ } },
++
++ -- Ping droprate
++ { title = "%H: ICMP Drop Rate",
++ vlabel = "%",
++ number_format = "%5.2lf %%",
++ data = {
++ types = { "ping_droprate" },
++ options = { ping_droprate = {
++ noarea = true, overlay = true, title = "%di" } }
++ } },
++
++ -- Ping standard deviation
++ { title = "%H: ICMP Standard Deviation",
++ vlabel = "ms",
++ number_format = "%5.2lf ms",
++ data = {
++ types = { "ping_stddev" },
++ options = { ping_stddev = {
++ noarea = true, overlay = true, title = "%di" } }
++ } },
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua
+new file mode 100644
+index 0000000..d48441a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua
+@@ -0,0 +1,98 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.processes", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++
++ return {
++ {
++ title = "%H: Processes",
++ vlabel = "Processes/s",
++ data = {
++ instances = {
++ ps_state = {
++ "sleeping", "running", "paging", "blocked", "stopped", "zombies"
++ }
++ },
++
++ options = {
++ ps_state_sleeping = { color = "0000ff" },
++ ps_state_running = { color = "008000" },
++ ps_state_paging = { color = "ffff00" },
++ ps_state_blocked = { color = "ff5000" },
++ ps_state_stopped = { color = "555555" },
++ ps_state_zombies = { color = "ff0000" }
++ }
++ }
++ },
++
++ {
++ title = "%H: CPU time used by %pi",
++ vlabel = "Jiffies",
++ data = {
++ sources = {
++ ps_cputime = { "syst", "user" }
++ },
++
++ options = {
++ ps_cputime__user = {
++ color = "0000ff",
++ overlay = true
++ },
++
++ ps_cputime__syst = {
++ color = "ff0000",
++ overlay = true
++ }
++ }
++ }
++ },
++
++ {
++ title = "%H: Threads and processes belonging to %pi",
++ vlabel = "Count",
++ detail = true,
++ data = {
++ sources = {
++ ps_count = { "threads", "processes" }
++ },
++
++ options = {
++ ps_count__threads = { color = "00ff00" },
++ ps_count__processes = { color = "0000bb" }
++ }
++ }
++ },
++
++ {
++ title = "%H: Page faults in %pi",
++ vlabel = "Pagefaults",
++ detail = true,
++ data = {
++ sources = {
++ ps_pagefaults = { "minflt", "majflt" }
++ },
++
++ options = {
++ ps_pagefaults__minflt = { color = "ff0000" },
++ ps_pagefaults__majflt = { color = "ff5500" }
++ }
++ }
++ },
++
++ {
++ title = "%H: Virtual memory size of %pi",
++ vlabel = "Bytes",
++ detail = true,
++ number_format = "%5.1lf%sB",
++ data = {
++ types = { "ps_rss" },
++
++ options = {
++ ps_rss = { color = "0000ff" }
++ }
++ }
++ }
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/sensors.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/sensors.lua
+new file mode 100644
+index 0000000..f8bddb9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/sensors.lua
+@@ -0,0 +1,24 @@
++-- Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.sensors", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance )
++ return {
++ {
++ per_instance = true,
++ title = "%H: %pi - %di",
++ vlabel = "\176C",
++ number_format = "%4.1lf\176C",
++ data = {
++ types = { "temperature" },
++ options = {
++ temperature__value = {
++ color = "ff0000",
++ title = "Temperature"
++ }
++ }
++ }
++ }
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/splash_leases.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/splash_leases.lua
+new file mode 100644
+index 0000000..65fba52
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/splash_leases.lua
+@@ -0,0 +1,27 @@
++-- Copyright 2013 Freifunk Augsburg / Michael Wendland <michael@michiwend.com>
++-- Licensed to the public under the Apache License 2.0.
++
++
++module("luci.statistics.rrdtool.definitions.splash_leases", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++
++ return {
++ title = "%H: Splash Leases",
++ vlabel = "Active Clients",
++ y_min = "0",
++ number_format = "%5.1lf",
++ data = {
++ sources = {
++ splash_leases = { "leased", "whitelisted", "blacklisted" }
++ },
++
++ options = {
++ splash_leases__leased = { color = "00CC00", title = "Leased", overlay = false },
++ splash_leases__whitelisted = { color = "0000FF", title = "Whitelisted", overlay = false },
++ splash_leases__blacklisted = { color = "FF0000", title = "Blacklisted", overlay = false }
++ }
++ }
++ }
++
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/tcpconns.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/tcpconns.lua
+new file mode 100644
+index 0000000..50a9470
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/tcpconns.lua
+@@ -0,0 +1,25 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.statistics.rrdtool.definitions.tcpconns", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++ return {
++ title = "%H: TCP connections to port %pi",
++ vlabel = "Connections/s",
++ number_format = "%5.0lf",
++ data = {
++ types = { "tcp_connections" },
++ instances = {
++ tcp_connections = {
++ "SYN_SENT", "SYN_RECV", "LISTEN", "ESTABLISHED",
++ "LAST_ACK", "TIME_WAIT", "CLOSING", "CLOSE_WAIT",
++ "CLOSED", "FIN_WAIT1", "FIN_WAIT2"
++ },
++ options = {
++ load__ESTABLISHED = { title = "%di", noarea = true }
++ }
++ }
++ }
++ }
++end
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/uptime.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/uptime.lua
+new file mode 100644
+index 0000000..077ec57
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/uptime.lua
+@@ -0,0 +1,27 @@
++--[[
++
++Copyright 2013 Thomas Endt <tmo26@gmx.de>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++]]--
++
++module("luci.statistics.rrdtool.definitions.uptime", package.seeall)
++
++function rrdargs( graph, plugin, plugin_instance, dtype )
++
++ return {
++ title = "%H: Uptime", vlabel = "seconds",
++ number_format = "%5.0lf%s", data = {
++ types = { "uptime" },
++ options = {
++ uptime = { title = "Uptime %di", noarea = true }
++ }
++ }
++ }
++
++end
++
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/view/admin_statistics/index.htm b/feeds/luci/applications/luci-app-statistics/luasrc/view/admin_statistics/index.htm
+new file mode 100644
+index 0000000..3827199
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/view/admin_statistics/index.htm
+@@ -0,0 +1,17 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Statistics%></h2>
++
++<p><%_The statistics package uses <a href="https://collectd.org/">Collectd</a>
++to gather data and <a href="http://oss.oetiker.ch/rrdtool/">RRDtool</a> to
++render diagram images.%></p>
++
++<p><%_You can install additional collectd-mod-* plugins to enable more statistics.%></p>
++
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/view/public_statistics/graph.htm b/feeds/luci/applications/luci-app-statistics/luasrc/view/public_statistics/graph.htm
+new file mode 100644
+index 0000000..ebc78ba
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/luasrc/view/public_statistics/graph.htm
+@@ -0,0 +1,40 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Statistics%></h2>
++
++<form action="" method="get">
++ <select name="host">
++ <% for i, host in ipairs(hosts) do %>
++ <option<% if host == current_host then %> selected="selected"<% end %>><%=pcdata(host)%></option>
++ <% end %>
++ </select>
++ <input class="cbi-button cbi-button-apply" type="submit" name="submit" value="<%:Display Host »%>" />
++ <select name="timespan">
++ <% for i, span in ipairs(timespans) do %>
++ <option<% if span == current_timespan then %> selected="selected"<% end %>><%=span%></option>
++ <% end %>
++ </select>
++ <input class="cbi-button cbi-button-apply" type="submit" name="submit" value="<%:Display timespan »%>" />
++</form>
++
++<br />
++<hr />
++<br />
++
++<div style="text-align: center">
++ <% for i, img in ipairs(images) do %>
++ <% if is_index then %><a href="<%=pcdata(images[img])%>"><% end %>
++ <img src="<%=REQUEST_URI%>?img=<%=img%>&#38;host=<%=current_host%>" />
++ <% if is_index then %></a><% end %>
++ <br />
++ <% end %>
++</div>
++
++<%+footer%>
++
+diff --git a/feeds/luci/applications/luci-app-statistics/po/ca/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/ca/rrdtool.po
+new file mode 100644
+index 0000000..7c03aad
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/ca/rrdtool.po
+@@ -0,0 +1,359 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 16:39+0200\n"
++"PO-Revision-Date: 2009-05-27 01:49+0200\n"
++"Last-Translator: Eduard Duran <iopahopa@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "%H: Wireless - Relació Senyal Soroll"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "dBm"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Nivell de soroll"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "Potència de senyal"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: Wireless - Qualitat de senyal"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "n"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "Qualitat de senyal"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "%H: Temps ICMP d'anada i tornada"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "ms"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "%di"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "%H: Tallafocs - Paquets processats"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "Paquets/s"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "Cadena \"%di\""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "%H: Enllaç de xarxa - Transferència en %pi"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "Bytes/s"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "Bytes (%ds)"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "%H: Enllaç de xarxa - Paquets en %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "Paquets/s"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "Processats (%ds)"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "Descartats (%ds)"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "Errors (%ds)"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "%H: Enllaç de xarxa - Multicast en %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "Paquets/s"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "Paquets"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "%H: Enllaç de xarxa - Col·lisions en %pi"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "Col·lisions/s"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "Col·lisions"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "%H: Enllaç de xarxa - Errors on %pi"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "Errors/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "%di"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "%di"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "%H: Processos"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "Processos/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "%di"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "%H: Procés %pi - temps de cpu usat"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "Jiffies"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "sistema"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "usuari"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "%H: Procés %pi - threads i processos"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "Compte"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "%ds"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "%H: Procés %pi - errors de pàgina"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "Errors de pàgina"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "errors de pàgina"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "%H: Procés %pi - mida de memòria virtual"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "Bytes"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "memòria virtual"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "%H: Ús al Processador #%pi"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "%"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "%di"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "%H: Transferència a %di"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "Bytes/s"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "%H: Paquets a %di"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "Paquets/s"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "%H: Connexions TCP a Port %pi"
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "Connexions/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "%di"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "%H: Ús de l'espai de disc a %di"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "Bytes"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "%ds"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "%ds"
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "%H: Interrupcions"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "Temes/s"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "IRQ %di"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "%H: Càrrega de Sistema"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "Càrrega"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "1 min"
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "5 min"
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "15 min"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/ca/statistics.po b/feeds/luci/applications/luci-app-statistics/po/ca/statistics.po
+new file mode 100644
+index 0000000..5ccaa4a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/ca/statistics.po
+@@ -0,0 +1,766 @@
++# statistics.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-08-07 20:11+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Action (target)"
++msgstr "Acció (objectiu)"
++
++msgid "Add command for reading values"
++msgstr "Afegeix ordre per llegir valors"
++
++msgid "Add matching rule"
++msgstr "Afegeix regla coincident"
++
++msgid "Add multiple hosts separated by space."
++msgstr "Afegeix múltiples hosts separats per espai."
++
++msgid "Add notification command"
++msgstr "Afegeix ordre de notificació"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Directori base"
++
++msgid "Basic monitoring"
++msgstr "Monitoreig bàsic"
++
++msgid "CPU Plugin Configuration"
++msgstr "Configuració del connector de CPU"
++
++msgid "CSV Output"
++msgstr "Sortida CSV"
++
++msgid "CSV Plugin Configuration"
++msgstr "Configuració del connector CSV"
++
++msgid "Cache collected data for"
++msgstr "Emmagatzema en memòria cau les dades recollides de"
++
++msgid "Cache flush interval"
++msgstr "Interval de neteja de memòria cau"
++
++msgid "Chain"
++msgstr "Cadena"
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr "Configuració Collectd"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd és un petit dimoni per recollir dades de diverses fonts a través "
++"dels connectors. En aquesta pàgina podeu canviar la configuració general del "
++"dimoni Collectd."
++
++msgid "Conntrack"
++msgstr "Conntrack"
++
++msgid "Conntrack Plugin Configuration"
++msgstr "Configuració del connector Conntrack"
++
++msgid "DF Plugin Configuration"
++msgstr "Configuració del connector DF"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "Configuració del connector DNS"
++
++msgid "Data collection interval"
++msgstr "Interval de recol·lecció de dades"
++
++msgid "Datasets definition file"
++msgstr "Fitxer de definició de dades"
++
++msgid "Destination ip range"
++msgstr "Rang d'IP destí"
++
++msgid "Directory for collectd plugins"
++msgstr "Directori pels connectors connectd"
++
++msgid "Directory for sub-configurations"
++msgstr "Directori per sub-configuracions"
++
++msgid "Disk Plugin Configuration"
++msgstr "Configuració del connector de disc"
++
++msgid "Disk Space Usage"
++msgstr "Ús d'espai en disc"
++
++msgid "Disk Usage"
++msgstr "Ús de disc"
++
++msgid "Display Host »"
++msgstr "Mostra el host »"
++
++msgid "Display timespan »"
++msgstr "Mostra l'hora"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "Configuració del connector d'adreça electrònica"
++
++msgid "Email"
++msgstr "Adreça electrònica"
++
++msgid "Enable this plugin"
++msgstr "Activa aquest connector"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Configuració del connector exec"
++
++msgid "Filter class monitoring"
++msgstr "Monitoreig de classe filter"
++
++msgid "Firewall"
++msgstr "Tallafocs"
++
++msgid "Flush cache after"
++msgstr "Neteja la memòria cau després de"
++
++msgid "Forwarding between listen and server addresses"
++msgstr "Readreçant entre adreces que reben connexions i adreces de servidors"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Gràfics"
++
++msgid "Group"
++msgstr "Grup"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Ací pots definir ordres externes que s'iniciaran pel collectd per llegir "
++"certs valors. Els valors es llegiran des del stdout"
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Ací pots definir ordres externes que s'iniciaran pel collectd quan s'aribi a "
++"uns certs valors llindars. Els valors que condueixin a la invocació, "
++"alimentaran als programes stdin"
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"Ací pots definir diversos criteris pels que es seleccionaran les regles "
++"iptables monitoritzades ."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr "Host"
++
++msgid "Hostname"
++msgstr "Nom de host"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr "Configuració de connector IRQ"
++
++msgid "Ignore source addresses"
++msgstr "Ignora adreces origen"
++
++msgid "Incoming interface"
++msgstr "Interfície entrant"
++
++msgid "Interface Plugin Configuration"
++msgstr "Configuració de connector d'interfície"
++
++msgid "Interfaces"
++msgstr "Interfícies"
++
++msgid "Interrupts"
++msgstr "Interrupcions"
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr "Configuració del connector iptables"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr "Màquina que rep connexions"
++
++msgid "Listen port"
++msgstr "Port que rep connexions"
++
++msgid "Listener interfaces"
++msgstr "Interfícies que reben connexions"
++
++msgid "Load Plugin Configuration"
++msgstr "Configuració de connector de càrrega"
++
++msgid "Maximum allowed connections"
++msgstr "Connexions màximes permeses"
++
++msgid "Memory"
++msgstr "Memòria"
++
++msgid "Memory Plugin Configuration"
++msgstr "Configuració del connector de memòria"
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr "Monitoritza tots els ports locals que reben connexions"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Monitoritza dispositius"
++
++msgid "Monitor disks and partitions"
++msgstr "Monitoritza els discs i les particions"
++
++msgid "Monitor filesystem types"
++msgstr "Monitoritza els tipus de sistema de fitxers"
++
++msgid "Monitor hosts"
++msgstr "Monitoritza màquines"
++
++msgid "Monitor interfaces"
++msgstr "Monitoritza hosts"
++
++msgid "Monitor interrupts"
++msgstr "Monitoritza interrupcions"
++
++msgid "Monitor local ports"
++msgstr "Monitoritza els ports locals"
++
++msgid "Monitor mount points"
++msgstr "Monitoritza punts de muntatge"
++
++msgid "Monitor processes"
++msgstr "Monitoritza processos"
++
++msgid "Monitor remote ports"
++msgstr "Monitoritza els ports remots"
++
++msgid "Name of the rule"
++msgstr "Nom de la regla"
++
++msgid "Netlink"
++msgstr "Enllaç de xarxa"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Configuració del connector d'enllaç de xarxa"
++
++msgid "Network"
++msgstr "Xarxa"
++
++msgid "Network Plugin Configuration"
++msgstr "Configuració del connector de xarxa"
++
++msgid "Network plugins"
++msgstr "Connectors de xarxa"
++
++msgid "Network protocol"
++msgstr "Protocol de xarxa"
++
++msgid "Number of threads for data collection"
++msgstr "Número de fils de recol·lecció de dades"
++
++msgid "OLSRd"
++msgstr "OLSRd"
++
++msgid "OLSRd Plugin Configuration"
++msgstr "Configuració del connector OLSRd"
++
++msgid "Only create average RRAs"
++msgstr "Crea només RRAs mitjans"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Opcions"
++
++msgid "Outgoing interface"
++msgstr "Interfície sortint"
++
++msgid "Output plugins"
++msgstr "Connectors de sortida"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Configuració del connector ping"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Processes"
++msgstr "Processos"
++
++msgid "Processes Plugin Configuration"
++msgstr "Configuració del connector de processos"
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr "Processador"
++
++msgid "Qdisc monitoring"
++msgstr "Monitoreig Qdisc"
++
++msgid "RRD XFiles Factor"
++msgstr "Factor RRD XFiles"
++
++msgid "RRD heart beat interval"
++msgstr "Interval de batec de cor RRD"
++
++msgid "RRD step interval"
++msgstr "Interval de pas RRD"
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "Configuració del connector RRDTool"
++
++msgid "Rows per RRA"
++msgstr "Files per RRA"
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr "Segons"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "Màquina servidor"
++
++msgid "Server port"
++msgstr "Port del servidor"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "Monitoreig de classe shaping"
++
++msgid "Socket file"
++msgstr "Fitxer d'endoll"
++
++msgid "Socket group"
++msgstr "Grup d'endoll"
++
++msgid "Socket permissions"
++msgstr "Permisos d'endoll"
++
++msgid "Source ip range"
++msgstr "Rang d'IP origen"
++
++msgid "Specifies what information to collect about links."
++msgstr "Especifica què informació es recull sobre enllaços."
++
++msgid "Specifies what information to collect about routes."
++msgstr "Especifica què informació es recull sobre rutes."
++
++msgid "Specifies what information to collect about the global topology."
++msgstr "Especifica què informació es recull sobre la topologia global."
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr "Estadístiques"
++
++msgid "Storage directory"
++msgstr "Directori d'emmagatzematge"
++
++msgid "Storage directory for the csv files"
++msgstr "Directori d'emmagatzematge dels fitxers CSV"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++"Emmagatzema els valors de dades com a relacions en comptes de com a valors "
++"absoluts"
++
++msgid "Stored timespans"
++msgstr "Marques de temps emmagatzemades"
++
++msgid "System Load"
++msgstr "Càrrega de sistema"
++
++msgid "TCP Connections"
++msgstr "Connexions TCP"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "Configuració de connector TCPConns"
++
++msgid "TTL for network packets"
++msgstr "TTL pels paquets de xarxa"
++
++msgid "TTL for ping packets"
++msgstr "TTL per paquets ping"
++
++msgid "Table"
++msgstr "Taula"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++"El connector de cpu recull estadístiques bàsiques sobre l'ús del processador."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"El connector CSV desa les dades recollides en format CSV per ser processades "
++"posteriorment per programes externs."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"El connector DF recull dades sobre l'ús d'espai en disc de diferents "
++"dispositius, punts de muntatge i tipus de sistema de fitxers."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"El connector de disc recull estadístiques d'ús detallades per les particions "
++"seleccionades o per tot el disc."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"El connector DNS recull estadístiques detallades sobre el tràfic DNS a les "
++"interfícies seleccionades."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"El connector d'adreça electrònica crea un socket unix que es pot utilitzar "
++"per transmetre estadístiques d'email a un dimoni collectd. Aquest connector "
++"es fa servir en conjunció amb Mail::SpamAssassin::Plugin. Plugin::Collectd "
++"també es pot utilitzar d'altres maneres."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"El connector exec inicia ordres externes per llegir valors des de o a "
++"processos externs quan s'arriba a certs valors de llindar."
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++"El connector d'interfície recull estadístiques de tràfic a les interfícies "
++"seleccionades."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"El connector iptables monitoritzarà les regles de tallafocs seleccionades i "
++"recollirà informacions sobre els bytes i paquests processats per regla."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"El connector IRQ monitoritzarà la taxa de qüestions per segon per cada "
++"interrupció seleccionada. Si no se selecciona cap interrupció, es "
++"monitoritzen totes les interrupcions."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++"El connector iwinfo recull estadístiques sobre la força de senyal, soroll i "
++"qualitat sense fil."
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++"El connector de càrrega recull estadístiques sobre la càrrega de sistema "
++"general."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr "El connector de memòria recull estadístiques sobre l'ús de memòria."
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"El connector d'enllaç de xarxa recull informació extensa com estadístiques "
++"de qdisc-, class- i filter- per les interfícies seleccionades."
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"El connector de xarxa proporciona comunicacions basades en xarxa entre "
++"diferents instàncies de collectd. El collectd pot operar tan en mode "
++"servidor com client. En el client mode les dades recollides localment es "
++"transferiran a la instància del servidor de collectd, en el mode servidor la "
++"instància rep dades de les altres màquines."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"El connector de ping enviarà ICMP Echo Replies a les màquines seleccionades "
++"i mesurarà el temps d'anada i tornada en cada màquina."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"El connector de processor recollirà informacions com el temps de cpu, errors "
++"de pàgina i ús de memòria dels processos seleccionats."
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"El connector RRDTool desa les dades recollides als fitxers de base de dades "
++"RRD, la base dels diagrames.<br /><br /><strong>Alerta: Establir els valors "
++"incorrectes comportarà un consum molt alt de memòria al directori temporal. "
++"Això pot inutilitzar el dispositiu!</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"El connector TCPConns recull informació sobre les connexions TCP obertes en "
++"els ports seleccionats."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"El connector unixsock crea un socket Unix que es pot fer servir per llegir "
++"dades recollides d'una instància collectd."
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"Aquesta secció defineix en quines interfícies el collectd rebrà connexions "
++"entrants."
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++"Aquesta secció defineix a quins servidors s'enviaran les dades recollides "
++"localment."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "Intenta resoldre el nom de màquina (fqdn)"
++
++msgid "UPS"
++msgstr "UPS"
++
++msgid "UPS Plugin Configuration"
++msgstr "Configuració del connector UPS"
++
++msgid "UPS name in NUT ups@host format"
++msgstr "Nom UPS en format NUT ups@host"
++
++msgid "UnixSock"
++msgstr "Sock Unix"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Configuració de connector Unixsock"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Fitxer PID usat"
++
++msgid "User"
++msgstr "Usuari"
++
++msgid "Verbose monitoring"
++msgstr "Monitoreig detallat"
++
++msgid "Wireless"
++msgstr "Wireless"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "p.e. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "p.e. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "p.e. reject-with tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "màx. 16 caràcters"
++
++msgid "reduces rrd size"
++msgstr "redueix mida RRD"
++
++msgid "seconds; multiple separated by space"
++msgstr "segons; múltiples separats per espais"
++
++msgid "server interfaces"
++msgstr "interfícies de servidor"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "Connectors de sistema"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "El paquet d'estadísitiques està basat en <a href=\"http://collectd.org/"
++#~ "index.shtml\">Collectd</a> i utilitza l'eina <a href=\"http://oss.oetiker."
++#~ "ch/rrdtool/\">RRD</a> per renderitzar imatges de diagrama de les dades "
++#~ "recoliildes."
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "El connector Wireless recull estadístiques sobre la potència del senyal "
++#~ "sense fils, el soroll i la qualitat."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "Configuració del connector Wireless"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/cs/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/cs/rrdtool.po
+new file mode 100644
+index 0000000..e6149ec
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/cs/rrdtool.po
+@@ -0,0 +1,359 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-12 20:35+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "Bezdrátová síť - Úroveň šumu"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "dBm"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Úroveň šumu"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "Síla signálu"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: Wireless - kvalita signálu"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "n"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "Kvalita signálu"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "%H: ICMP Äasy odezvy"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "ms"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "%di"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "%H: Firewall - zpracované pakety"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "Pakety/s"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "Řetěz \\\"%di\\\""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "%H: Netlink - přenos na %pi"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "Bajty/s"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "Bajty (%ds)"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "%H: Netlink - pakety na %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "Pakety/s"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "Zpracováno (%ds)"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "Zahozeno (%ds)"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "Chyby (%ds)"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "%H: Netlink - multicast na %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "Pakety/s"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "Pakety"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "%H: Netlink - kolize na %pi"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "Kolize/s"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "Kolize"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "%H: Netlink - chyby na %pi"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "Chyby/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "%di"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "%di"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "%H: Procesy"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "Procesy/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "%di"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "%H: Proces %pi - Äas využití CPU"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "Jiffies"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "systém"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "uživatel"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "%H: Proces %pi - vlákna a procesy"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "PoÄet"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "%ds"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "%H: Process %pi - chyby stránkování"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "Chyby stránkování"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "chyby stránkování"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "%H: Proces %pi - velikost virtuální paměti"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "Bajty"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "virtuální paměť"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "%H: Vytížení procesoru #%pi"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "%"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "%di"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "%H: Přenos na %di"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "Bajty/s"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "%H: Pakety na %di"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "Pakety/s"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "%H: TCP-spojení na portu %pi"
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "Spojení/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "%di"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "%H: Využití diskového prostoru na %di"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "Bajty"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "%ds"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "%ds"
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "%H: Přerušení"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "Problémy/s"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "IRQ %di"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "%H Zatížení systému"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "Zatížení"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "1 min"
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "5 min"
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "15 min"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/cs/statistics.po b/feeds/luci/applications/luci-app-statistics/po/cs/statistics.po
+new file mode 100644
+index 0000000..bfa1b89
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/cs/statistics.po
+@@ -0,0 +1,780 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-21 17:44+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Action (target)"
++msgstr "Akce (cíl)"
++
++msgid "Add command for reading values"
++msgstr "PÅ™idat příkaz pro Ätení hodnot"
++
++msgid "Add matching rule"
++msgstr "Přidat pravidlo pro výběr"
++
++msgid "Add multiple hosts separated by space."
++msgstr "Přidat více hostů, oddělených mezerou"
++
++msgid "Add notification command"
++msgstr "Přidat příkaz pro upozornění"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Základní adresář"
++
++msgid "Basic monitoring"
++msgstr "Základní sledování"
++
++msgid "CPU Plugin Configuration"
++msgstr "Nastavení CPU pluginu"
++
++msgid "CSV Output"
++msgstr "CSV výstup"
++
++msgid "CSV Plugin Configuration"
++msgstr "Nastavení CSV pluginu"
++
++msgid "Cache collected data for"
++msgstr "Mezipamět pro ukládání dat"
++
++msgid "Cache flush interval"
++msgstr "Interval vyprazdňování mezipaměti"
++
++msgid "Chain"
++msgstr "Řetěz"
++
++msgid "CollectLinks"
++msgstr "CollectLinks"
++
++msgid "CollectRoutes"
++msgstr "CollectRoutes"
++
++msgid "CollectTopology"
++msgstr "CollectTopology"
++
++msgid "Collectd Settings"
++msgstr "Nastavení Collectd"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd je malý daemon pro shromažÄování dat z nejrůznÄ›jších zdrojů zkrz "
++"rozdílné pluginy. Na této stránce můžete změnit obecná nastavení daemonu "
++"collectd."
++
++msgid "Conntrack"
++msgstr "Conntrack"
++
++msgid "Conntrack Plugin Configuration"
++msgstr "Nastavení pluginu Conntrack"
++
++msgid "DF Plugin Configuration"
++msgstr "Nastavení pluginu DF"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "Nastavení DNS pluginu"
++
++msgid "Data collection interval"
++msgstr "Interval sběru dat"
++
++msgid "Datasets definition file"
++msgstr ""
++
++msgid "Destination ip range"
++msgstr "Rozsah cílových IP adres"
++
++msgid "Directory for collectd plugins"
++msgstr "Adresář s pluginy pro collectd"
++
++msgid "Directory for sub-configurations"
++msgstr "Adresář pro pod-nastavení"
++
++msgid "Disk Plugin Configuration"
++msgstr "Nastavení Disk pluginu"
++
++msgid "Disk Space Usage"
++msgstr "Využití místa na disku"
++
++msgid "Disk Usage"
++msgstr "Využití disku"
++
++msgid "Display Host »"
++msgstr "Zobrazit hostitele »"
++
++msgid "Display timespan »"
++msgstr "Zobrazit Äasové rozpÄ›tí »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "Nastavení E-Mail pluginu"
++
++msgid "Email"
++msgstr "Email"
++
++msgid "Enable this plugin"
++msgstr "Povolit tento plugin"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Nastavení pluginu Exec"
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Flush cache after"
++msgstr "Vyprázdnit cache po"
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Grafy"
++
++msgid "Group"
++msgstr "Skupina"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Zde můžete nastavit externí příkazy, které budou spuštěny v tomto pořadí "
++"daemonem collectd. Ze standardního výstupu příkazů vezme collectd potřebné "
++"hodnoty."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"Zde můžete definovat různá kritéria, podle kterých budou vybrána sledovaná "
++"pravidla iptables."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr "Hostitel"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr "IP nebo hostname, odkud získat txtinfo výstup"
++
++msgid "IRQ Plugin Configuration"
++msgstr "Nastavení IRQ pluginu"
++
++msgid "Ignore source addresses"
++msgstr "Ignorovat zdrojové adresy"
++
++msgid "Incoming interface"
++msgstr "Příchozí rozhraní"
++
++msgid "Interface Plugin Configuration"
++msgstr "Nastavení Interface pluginu"
++
++msgid "Interfaces"
++msgstr "Rozhraní"
++
++msgid "Interrupts"
++msgstr "Přerušení"
++
++msgid "Interval for pings"
++msgstr "Interval pro ping"
++
++msgid "Iptables Plugin Configuration"
++msgstr "Nastavení Iptables pluginu"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++"Pokud nic nevyberete, rozhraní pro monitoring budou urÄena automaticky."
++
++msgid "Listen host"
++msgstr "Naslouchající hostitel"
++
++msgid "Listen port"
++msgstr "Naslouchající port"
++
++msgid "Listener interfaces"
++msgstr "Rozhraní naslouchajícího"
++
++msgid "Load Plugin Configuration"
++msgstr "NaÄíst nastavení pluginů"
++
++msgid "Maximum allowed connections"
++msgstr "Maximální množství povolených spojení"
++
++msgid "Memory"
++msgstr "Paměť"
++
++msgid "Memory Plugin Configuration"
++msgstr "Nastavení pluginu Memory (Paměť)"
++
++msgid "Monitor all except specified"
++msgstr "Sledovat vše kromě vybraných"
++
++msgid "Monitor all local listen ports"
++msgstr "Monitorovat všechny naslouchající porty"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Sledovat zařízení"
++
++msgid "Monitor disks and partitions"
++msgstr "Sledovat disky a oddíly"
++
++msgid "Monitor filesystem types"
++msgstr "Sledovat typy souborových systémů"
++
++msgid "Monitor hosts"
++msgstr "Sledovat hostitele"
++
++msgid "Monitor interfaces"
++msgstr "Sledovat rozhraní"
++
++msgid "Monitor interrupts"
++msgstr "Sledovat přerušení"
++
++msgid "Monitor local ports"
++msgstr "Sledovat místní porty"
++
++msgid "Monitor mount points"
++msgstr "Sledovat přípojné body"
++
++msgid "Monitor processes"
++msgstr "Sledovat procesy"
++
++msgid "Monitor remote ports"
++msgstr "Sledovat vzdálené porty"
++
++msgid "Name of the rule"
++msgstr "Název pravidla"
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Nastavení pluginu Netlink"
++
++msgid "Network"
++msgstr "Síť"
++
++msgid "Network Plugin Configuration"
++msgstr "Nastavení pluginu Síť"
++
++msgid "Network plugins"
++msgstr "Síťové pluginy"
++
++msgid "Network protocol"
++msgstr "Síťový protokol"
++
++msgid "Number of threads for data collection"
++msgstr "PoÄet vláken pro sbÄ›r dat"
++
++msgid "OLSRd"
++msgstr "OLSRd"
++
++msgid "OLSRd Plugin Configuration"
++msgstr "Nastavení pluginu OLSRd"
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Možnosti"
++
++msgid "Outgoing interface"
++msgstr "Odchozí rozhraní"
++
++msgid "Output plugins"
++msgstr "Výstupní pluginy"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Nastavení pluginu Ping"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Processes"
++msgstr "Procesy"
++
++msgid "Processes Plugin Configuration"
++msgstr "Nastavení pluginu Procesy"
++
++msgid "Processes to monitor separated by space"
++msgstr "Sledované procesy (oddělte mezerou)"
++
++msgid "Processor"
++msgstr "Procesor"
++
++msgid "Qdisc monitoring"
++msgstr "Sledování Qdisc"
++
++#, fuzzy
++msgid "RRD XFiles Factor"
++msgstr "RRD XFiles Factor"
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "Nastavení pluginu RRDTool"
++
++msgid "Rows per RRA"
++msgstr "Řádky na jeden RRA"
++
++msgid "Script"
++msgstr "Skript"
++
++msgid "Seconds"
++msgstr "Sekundy"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "Hostitel serveru"
++
++msgid "Server port"
++msgstr "Port serveru"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr "Soubor socketu"
++
++msgid "Socket group"
++msgstr "Skupina socketů"
++
++msgid "Socket permissions"
++msgstr "Oprávnění socketu"
++
++msgid "Source ip range"
++msgstr "Rozsah zdrojových IP"
++
++msgid "Specifies what information to collect about links."
++msgstr "UrÄuje, jaké informace sbírat o odkazech."
++
++msgid "Specifies what information to collect about routes."
++msgstr "UrÄuje, jaké informace sbírat o cestách"
++
++msgid "Specifies what information to collect about the global topology."
++msgstr "UrÄuje, jaké informace sbírat o globální topologii"
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr "Statistiky"
++
++msgid "Storage directory"
++msgstr "Úložný adresář"
++
++msgid "Storage directory for the csv files"
++msgstr "Úložný adresář pro soubory CSV"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "Ukládat data jako poměrné hodnoty místo absolutních"
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr "Zatížení systému"
++
++msgid "TCP Connections"
++msgstr "TCP spojení"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "Nastavení pluginu TCPConns"
++
++msgid "TTL for network packets"
++msgstr "TTL pro síťové pakety"
++
++msgid "TTL for ping packets"
++msgstr "TTL pro pakety pingu"
++
++msgid "Table"
++msgstr ""
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr "Plugin Conntrack shromažÄuje statistiky o poÄtu sledovaných spojení."
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr "Plugin CPU shromažÄuje základní statistiky o vytížení procesoru."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"Plugin CSV ukládá shromážděná data ve formátu CSV. Data mohou být později "
++"zpracována externími programy."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"Plugin DF shromažÄuje statistiky o využití diskového prostoru na různých "
++"zařízeních, přípojných bodech nebo typech souborových systémů."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"Plugin Disk shromažÄuje podrobné statistiky o využívání vybraného oddílu "
++"nebo celého disku."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"Plugin DNS shromažÄuje podrobné statistky o provozu, vztahující se k DNS, na "
++"vybraných rozhraních."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"Plugin Email vytváří unixový socket, které může být využit pro odeslání "
++"statistik o emailu běžícímu daemonu collectd. Plugin je primárnÄ› urÄen pro "
++"použití ve spojení s Mail::SpamAssasin::Plugin::Collectd, ale stejně dobře "
++"může být využit jinak."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++"Plugin Interface shromažÄuje statistiky o provozu na vybraných rozhraních."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"Plugin Iptables monitoruje vybraná pravidla firewallu a shromažÄuje "
++"informace o zpracovaných bajtech a paketech pro každé pravidlo."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"Plugin IRQ monitoruje množství požadavků na přerušení pro každé vybrané "
++"přerušení. Pokud není vybráno žádné přerušení, jsou monitorována všechna."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++"Plugin Iwinfo shromažÄuje statistiky o síle, Å¡umu a kvalitÄ› bezdrátového "
++"signálu."
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr "Plugin Load shromažÄuje statistiky o obecné zátěži systému."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr "Plugin Memory shromažÄuje statistiky o využití pamÄ›ti."
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"Plugin Netlink shromažÄuje rozšířené informace jako statistiky qdisk, class "
++"a filtru pro vybraná rozhraní."
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"Plugin Network poskytuje síťovou komunikaci mezi různými instancemi daemonu "
++"collectd. Collectd může pracovat v režimu klienta i serveru. V režimu "
++"klienta jsou lokálnÄ› shromažÄovaná data odeslána instanci serveru, jako "
++"server naopak collectd přijímá data z ostatních hostitelů."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"Plugin Ping bude odesílat ICMP echo odpovědi vybraným hostům a měřit "
++"zpáteÄní Äas pro každého hosta."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"Plugin Processes shromažÄuje informace o procesorovém Äasu, výpadcích "
++"stránky a využití paměti vybranými programy."
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"Plugin Rrdtool ukládá shromažÄená data v souborech databáze RRD.<br /><br /"
++"><strong>Varování: Nastavení špatných hodnot bude mít za následek velkou "
++"spotÅ™ebu pamÄ›ti v doÄasném adresáří. Zařízení ze tak může stát nepoužitelným!"
++"</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"Plugin Tcpconns shromažÄuje informace o otevÅ™ených TCP spojeních na "
++"vybraných portech."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"Plugin Unixsock vytváří unixový socket, které může být využit pro Ätení dat "
++"z běžící instance collectd."
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"Tato sekce urÄuje, na kterých rozhraních bude collectd Äekat na příchozí "
++"spojení."
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr "Tato sekce urÄuje, na které servery budou odeslána shromáždÄ›ná data."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr "UPS"
++
++msgid "UPS Plugin Configuration"
++msgstr "Konfigurace pluginu UPS"
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Konfigurace pluginu Unixsock"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Použitý soubor PID (identifikátoru procesu)"
++
++msgid "User"
++msgstr "Uživatel"
++
++msgid "Verbose monitoring"
++msgstr "Podrobný monitoring"
++
++msgid "Wireless"
++msgstr "Wireless"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr "Nastavení pluginu Wireless Iwinfo"
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "napÅ™. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "napÅ™. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "napÅ™. reject-with tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "max. 16 znaků"
++
++msgid "reduces rrd size"
++msgstr "redukovaná velikost rrd"
++
++msgid "seconds; multiple separated by space"
++msgstr "sekundy, více hodnot oddělených mezerou"
++
++msgid "server interfaces"
++msgstr "rozhraní serveru"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "Systémové pluginy"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "BalíÄek Statistiky je založen na <a href=\"http://collectd.org/index.shtml"
++#~ "\">Collectd</a> a využívá <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
++#~ "Tool</a> pro kreslení diagramů z collectd."
++
++#~ msgid "Installed network plugins:"
++#~ msgstr "Instalované síťové pluginy:"
++
++#~ msgid "Installed output plugins:"
++#~ msgstr "Instalované výstupní pluginy:"
++
++#~ msgid ""
++#~ "Network plugins are used to collect information about open tcp "
++#~ "connections, interface traffic, iptables rules etc."
++#~ msgstr ""
++#~ "Síťové pluginy jsou používány pro shromažÄování informací o otevÅ™ených "
++#~ "tcp spojeních, provozu na rozhraní, pravidel iptables atd."
++
++#~ msgid ""
++#~ "Output plugins provide different possibilities to store collected data. "
++#~ "It is possible to enable multiple plugin at one, for example to store "
++#~ "collected data in rrd databases and to transmit the data over the network "
++#~ "to other collectd instances."
++#~ msgstr ""
++#~ "Výstupní pluginy poskytují různé možnosti ukládání sesbíraných dat. "
++#~ "Plugin je možné v jeden okamžik povolit vícekrát , například pro ukládání "
++#~ "dat do rrd databází a předávání dat po síti jiným instancím daemonu "
++#~ "collectd."
++
++#~ msgid ""
++#~ "System plugins collecting values about system state and ressource usage "
++#~ "on the device.:"
++#~ msgstr ""
++#~ "Systémové pluginy, shromažÄující hodnoty o systémovém stavu a zdrojích, "
++#~ "používaných zařízením:"
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "Plugin Wireless shromažÄuje statistiky o síle, Å¡umu a kvalitÄ› "
++#~ "bezdrátového signálu."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "Nastavení pluginu Wireless"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/de/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/de/rrdtool.po
+new file mode 100644
+index 0000000..390fd2e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/de/rrdtool.po
+@@ -0,0 +1,357 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2009-05-19 00:33+0200\n"
++"Last-Translator: Stefan Keks <i18n@freifunk-bno.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "%H: Drahtlos - Signal-Noise-Verhältnis"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "dBm"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Noise-Level"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "Signalstärke"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: Drahtlos - Signalqualität"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "n"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "Signalqualität"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "%H: ICMP Antwortzeiten"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "ms"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "%di"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "%H: Firewall - Verarbeitete Pakete"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "Pakete/s"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "Kette \"%di\""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "%H: Netlink - Transfer auf %pi"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "Bytes/s"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "Bytes (%ds)"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "%H: Netlink - Pakete auf %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "Pakete/s"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "Verarbeitet (%ds)"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "Verworfen (%ds)"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "Fehler (%ds)"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "%H: Netlink - Multicast auf %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "Pakete/s"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "Pakete"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "%H: Netlink - Kollisionen auf %pi"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "Kollisionen/s"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "Kollisionen"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "%H: Netlink - Fehler auf %pi"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "Fehler/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "%di"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "%di"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "%H: Prozesse"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "Prozesse/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "%di"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "%H: Prozess %pi - Verbrauchte CPU Zeit"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "Jiffies"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "System"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "User"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "%H: Prozess %pi - Threads und Prozesse"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "Anzahl"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "%ds"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "%H: Prozess %pi - Speicherzugriffsfehler"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "Zugriffsfehler"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "Zugriffsfehler"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "%H: Process %pi - Virtueller Speicher"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "Bytes"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "virtueller Speicher"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "%H: Auslastung auf Prozessor #%pi"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "%"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "%di"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "%H: Transfer auf %di"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "Bytes/s"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "%H: Pakete auf %di"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "Pakete/s"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "%H: TCP-Verbindungen auf Port %pi"
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "Verbindungen/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "%di"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "%H: Speicherverbrauch auf %di"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "Bytes"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "verfügbar"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "belegt "
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "%H: Interrupts"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "Aufrufe/s"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "IRQ %di"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "%H: Systemlast"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "Last"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "1 Minute"
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "5 Minuten"
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "15 Minuten"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/de/statistics.po b/feeds/luci/applications/luci-app-statistics/po/de/statistics.po
+new file mode 100644
+index 0000000..91baf0e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/de/statistics.po
+@@ -0,0 +1,802 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2013-01-28 22:20+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Action (target)"
++msgstr "Aktion (Ziel)"
++
++msgid "Add command for reading values"
++msgstr "Kommando zum Werte einlesen hinzufügen"
++
++msgid "Add matching rule"
++msgstr "Auswahlregel hinzufügen"
++
++msgid "Add multiple hosts separated by space."
++msgstr "Mehrere Hosts durch Leerzeichen getrennt hinzufuegen"
++
++msgid "Add notification command"
++msgstr "Benachrichtigungskommando hinzufügen"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Basisverzeichnis"
++
++msgid "Basic monitoring"
++msgstr "Schnittstellen einfach überwachen"
++
++msgid "CPU Plugin Configuration"
++msgstr "CPU Plugin Konfiguration"
++
++msgid "CSV Output"
++msgstr "CSV Ausgabe"
++
++msgid "CSV Plugin Configuration"
++msgstr "CSV Plugin Konfiguration"
++
++msgid "Cache collected data for"
++msgstr "Zwischenspeicherzeit für gesammelte Daten"
++
++msgid "Cache flush interval"
++msgstr "Cache-Leerungsintervall"
++
++msgid "Chain"
++msgstr "Kette (Chain)"
++
++msgid "CollectLinks"
++msgstr "Informationen über Links sammeln (CollectdLinks)"
++
++msgid "CollectRoutes"
++msgstr "Informationen über Routen sammeln (CollectRoutes)"
++
++msgid "CollectTopology"
++msgstr "Informationen über die Netzwerktopologie sammeln (CollectTopology)"
++
++msgid "Collectd Settings"
++msgstr "Collectd Einstellungen"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd ist ein schlankes Dienstprogramm zum Sammeln von Systemdaten aus "
++"verschiedenen Quellen mittels diverser Plugins. Auf dieser Seite können "
++"generelle Einstellungen für den Collectd-Daemon vorgenommen werden."
++
++msgid "Conntrack"
++msgstr "Conntrack"
++
++msgid "Conntrack Plugin Configuration"
++msgstr "Conntrack Plugin Einstellungen"
++
++msgid "DF Plugin Configuration"
++msgstr "DF Plugin Konfiguration"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "DNS Plugin Konfiguration"
++
++msgid "Data collection interval"
++msgstr "Daten-Sammelintervall"
++
++msgid "Datasets definition file"
++msgstr "Dataset-Definitionen"
++
++msgid "Destination ip range"
++msgstr "Ziel-IP-Bereich"
++
++msgid "Directory for collectd plugins"
++msgstr "Verzeichnis für Collectd-Plugins"
++
++msgid "Directory for sub-configurations"
++msgstr "Verzeichnis für Unterkonfigurationen"
++
++msgid "Disk Plugin Configuration"
++msgstr "Disk Plugin Konfiguration"
++
++msgid "Disk Space Usage"
++msgstr "Plattenspeicher"
++
++msgid "Disk Usage"
++msgstr "Plattenauslastung"
++
++msgid "Display Host »"
++msgstr "Anzeigeserver"
++
++msgid "Display timespan »"
++msgstr "Zeitspanne zeigen »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "E-Mail Plugin Konfiguration"
++
++msgid "Email"
++msgstr "Email"
++
++msgid "Enable this plugin"
++msgstr "Plugin aktivieren"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Exec Plugin Konfiguration"
++
++msgid "Filter class monitoring"
++msgstr "Filterklassen überwachen"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Flush cache after"
++msgstr "Leerungsintervall für Zwischenspeicher"
++
++msgid "Forwarding between listen and server addresses"
++msgstr "Weiterleitung zwischen Listen- und Server-Adressen"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Diagramme"
++
++msgid "Group"
++msgstr "Gruppe"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Hier können externe Kommandos definiert werden, welche durch Collectd "
++"gestartet werden um Statistik-Werte einzulesen. Die Werte werden dabei vom "
++"STDOUT des aufgerufenen Programmes gelesen."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Hier können externe Kommandos definiert werden, welche durch Collectd "
++"gestartet werden sobald konfigurierte Grenzwerte erreicht werden. Die Werte "
++"welche die Benachrichtigung ausgelöst haben werden dabei an den STDIN des "
++"aufgerufenen Programmes übergeben."
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"Hier werden die Kriterien festgelegt nach welchen die zu überwachenden "
++"Firewall-Regeln ausgewählt werden."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr "Host"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr "IP-Adresse oder Hostname zum Abfragen der Txtinfo-Ausagabe"
++
++msgid "IRQ Plugin Configuration"
++msgstr "IRQ Plugin Konfiguration"
++
++msgid "Ignore source addresses"
++msgstr "Quelladressen ignorieren"
++
++msgid "Incoming interface"
++msgstr "eingehende Schnittstelle"
++
++msgid "Interface Plugin Configuration"
++msgstr "Interface Plugin Konfiguration"
++
++msgid "Interfaces"
++msgstr "Schnittstellen"
++
++msgid "Interrupts"
++msgstr "Interrupts"
++
++msgid "Interval for pings"
++msgstr "Intervall zwischen den Pings"
++
++msgid "Iptables Plugin Configuration"
++msgstr "Iptables Plugin Konfiguration"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++"Nichts auswählen um die zu überwachende Schnittstelle automatisch zu "
++"bestimmen"
++
++msgid "Listen host"
++msgstr "Listen-Host"
++
++msgid "Listen port"
++msgstr "Listen-Port"
++
++msgid "Listener interfaces"
++msgstr "Listen-Schnittstelle"
++
++msgid "Load Plugin Configuration"
++msgstr "Load Plugin Konfiguration"
++
++msgid "Maximum allowed connections"
++msgstr "Maximale Anzahl erlaubter Verbindungen"
++
++msgid "Memory"
++msgstr "Memory"
++
++msgid "Memory Plugin Configuration"
++msgstr "Memory-Plugin-Konfiguration"
++
++msgid "Monitor all except specified"
++msgstr "Alle bis auf Angegebene überwachen"
++
++msgid "Monitor all local listen ports"
++msgstr "Alle durch lokale Dienste genutzten Ports überwachen"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Geräte überwachen"
++
++msgid "Monitor disks and partitions"
++msgstr "Geräte und Partitionen überwachen"
++
++msgid "Monitor filesystem types"
++msgstr "Datesystemtypen überwachen"
++
++msgid "Monitor hosts"
++msgstr "Hosts überwachen"
++
++msgid "Monitor interfaces"
++msgstr "Schnittstellen überwachen"
++
++msgid "Monitor interrupts"
++msgstr "Interrups überwachen"
++
++msgid "Monitor local ports"
++msgstr "lokale Ports überwachen"
++
++msgid "Monitor mount points"
++msgstr "Mount-Punkte überwachen"
++
++msgid "Monitor processes"
++msgstr "Ãœberwachte Prozesse"
++
++msgid "Monitor remote ports"
++msgstr "entfernte Ports überwachen"
++
++msgid "Name of the rule"
++msgstr "Name der Regel"
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Netlink Plugin Konfiguration"
++
++msgid "Network"
++msgstr "Netzwerk"
++
++msgid "Network Plugin Configuration"
++msgstr "Network Plugin Konfiguration"
++
++msgid "Network plugins"
++msgstr "Netzwerkplugins"
++
++msgid "Network protocol"
++msgstr "Netzwerkprotokoll"
++
++msgid "Number of threads for data collection"
++msgstr "Anzahl paralleler Sammelprozesse"
++
++msgid "OLSRd"
++msgstr "OLSRd"
++
++msgid "OLSRd Plugin Configuration"
++msgstr "OLSRd-Plugin-Konfiguration"
++
++msgid "Only create average RRAs"
++msgstr "Nur &#39;average&#39; RRAs erzeugen"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Optionen"
++
++msgid "Outgoing interface"
++msgstr "ausgehende Schnittstelle"
++
++msgid "Output plugins"
++msgstr "Ausgabeplugins"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Ping Plugin Konfiguration"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Processes"
++msgstr "Prozesse"
++
++msgid "Processes Plugin Configuration"
++msgstr "Prozess Plugin Konfiguration"
++
++msgid "Processes to monitor separated by space"
++msgstr "Zu überwachende Prozesse (getrennt durch Leerzeichen)"
++
++msgid "Processor"
++msgstr "Prozessor"
++
++msgid "Qdisc monitoring"
++msgstr "Queue Discipline überwachen"
++
++msgid "RRD XFiles Factor"
++msgstr "RRD XFiles Faktor"
++
++msgid "RRD heart beat interval"
++msgstr "RRD Heartbeatintervall"
++
++msgid "RRD step interval"
++msgstr "RRD Schrittintervall"
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "RRDTool Plugin Konfiguration"
++
++msgid "Rows per RRA"
++msgstr "Spalten pro RRA"
++
++msgid "Script"
++msgstr "Skript"
++
++msgid "Seconds"
++msgstr "Sekunden"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "Server-Host"
++
++msgid "Server port"
++msgstr "Server-Port"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "Shapingklassen überwachen"
++
++msgid "Socket file"
++msgstr "Socket-Datei"
++
++msgid "Socket group"
++msgstr "Socket-Nutzergruppe"
++
++msgid "Socket permissions"
++msgstr "Socket-Berechtigungen"
++
++msgid "Source ip range"
++msgstr "Quell-IP-Bereich"
++
++msgid "Specifies what information to collect about links."
++msgstr "Bestimmt die zu sammelnden Per-Link-Informationen."
++
++msgid "Specifies what information to collect about routes."
++msgstr "Bestimmt die zu sammelnden Per-Route-Informationen."
++
++msgid "Specifies what information to collect about the global topology."
++msgstr "Bestimmt die zu sammelnden Informationen der globalen Topologie."
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr "Statistiken"
++
++msgid "Storage directory"
++msgstr "Speicherverzeichnis"
++
++msgid "Storage directory for the csv files"
++msgstr "Speicherverzeichnis für die CSV-Dateien"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "Werte nicht absolut sondern als Raten speichern"
++
++msgid "Stored timespans"
++msgstr "gespeicherte Zeitspannen"
++
++msgid "System Load"
++msgstr "Systemlast"
++
++msgid "TCP Connections"
++msgstr "TCP-Verbindungen"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "TCPConns Plugin Konfiguration"
++
++msgid "TTL for network packets"
++msgstr "TTL für Netzwerkpakete"
++
++msgid "TTL for ping packets"
++msgstr "TTL für Ping Pakete"
++
++msgid "Table"
++msgstr "Tabelle"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++"Das NUT-Plugin liest Informationen über Unterbrechungsfreie Stromversorgungen"
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++"Das OLSRd-Plugin liest Informationen über Meshnetzwerke aus der OLSR-Txtinfo-"
++"Erweiterung."
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++"Das Conntrack-Plugin sammelt Daten über die Anzahl der verfolgten "
++"Verbindungen."
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++"Das CPU-Plugin sammelt grundlegende Statistiken über die Prozessorauslastung."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"Das CSV-Plugin speichert die gesammelten Daten im CSV-Format, geeignet für "
++"die Weiterverarbeitung durch externe Programme."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"Das DF-Plugin sammelt Statistiken über den Speicherverbrauch auf "
++"verschiedenen Geräten, Mount-Punkten oder Dateisystemtypen."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"Das Disk-Plugin sammelt detaillierte Statistiken über die Auslastung auf "
++"ausgewählten Festplatten und Partitionen."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"Das DNS-Plugin sammelt detaillierte Statistiken über DNS-bezogenen Verkehr "
++"auf ausgewählten Schnittstellen."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"Das E-Mail Plugin erstellt einen Unix-Socket welcher benutzt werden kann um "
++"E-Mail-Statistiken an den laufenden Collectd-Daemon zu übermitteln. Dieses "
++"Plugin ist primär für die Verwendung zusammen mit Mail::SpamAssasin::Plugin::"
++"Collectd gedacht, kann aber auch anderweitig verwendet werden."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"Das Exec-Plugin startet externe Kommandos um Werte einzulesen oder um "
++"Benachrichtigungen auszulösen falls bestimmte Grenzwerte erreicht werden."
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++"Das Interface-Plugin sammelt allgemeine Verkehrsstatistiken auf ausgewählten "
++"Schnittstellen."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"Das Iptables-Plugin überwacht ausgewählte Firewall-Regeln und sammelt Werte "
++"über die Anzahl der verarbeiteten Pakete und Bytes."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"Das IRQ-Plugin überwacht die Anzahl der Aufrufe pro Sekunde für jeden "
++"ausgewählten Interrupt. Wird kein Interrupt ausgewählt überwacht das Plugin "
++"alle im System vorhandenen Interrupts."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++"Das iwinfo-Plugin sammelt Statistiken über die WLAN-Signalstärke, den "
++"Rauschpegel und die Signalqualität."
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr "Das Load-Plugin sammelt Informationen über die allgemeine Systemlast."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++"Das memory-Plugin sammelt Statistiken über die RAM-Auslastung des Systems."
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"Das Netlink-Plugin sammelt erweiterte QoS-Informationen wie QDisc-, Class- "
++"und Filter-Statistiken auf ausgewählten Schnittstellen."
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"Das Network-Plugin ermöglicht die netzwerkgestützte Kommunikation zwischen "
++"verschiedenen Collectd-Instanzen. Collectd kann gleichzeitig im Server- und "
++"Client-Modus betrieben werden. Im Client-Modus werden lokal gesammelte Daten "
++"an einen Collectd-Server übermittelt, im Server-Modus empfängt die lokale "
++"Instanz Daten von anderen Installationen."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"Das Ping-Plugin sendet ICMP-Echo-Requests an ausgewählte Hosts und misst die "
++"Antwortzeiten für jede Adresse."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"Das Prozess-Plugin sammelt Statistiken über Prozess-Zeit, Speicher-Fehler "
++"und Speicher-Verbrauch ausgewählter Prozesse"
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"Das RRDTool-Plugin speichert die gesammelten Daten in sogenannten RRD-"
++"Datenbanken, der Grundlage für die Diagramm-Bilder.<br /><br /"
++"><strong>Warnung: Falsche Werte resultieren in einem sehr hohen "
++"Speicherverbrauch im temporären Verzeichnis. Das kann das Gerät unbrauchbar "
++"machen, da Systemspeicher für den regulären Betrieb fehlt!</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"Das TCPConns-Plugin sammelt Informationen über offene TCP-Verbindungen auf "
++"ausgewählten Ports."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"Das Unixsock-Plugin erstellt einen Unix-Socket über welchen gesammelte Werte "
++"aus der laufenden Collectd-Instanz ausgelesen werden können."
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"Diese Sektion legt fest auf welchen Schnittstellen Collectd auf eingehende "
++"Verbindungen wartet."
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++"Diese Sektion legt fest zu welchen Collectd-Servern die lokal gesammelten "
++"Daten gesendet werden."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "automatisch vollen Hostnamen herausfinden"
++
++msgid "UPS"
++msgstr "USV"
++
++msgid "UPS Plugin Configuration"
++msgstr "Einstellungen des USV-Plugins"
++
++msgid "UPS name in NUT ups@host format"
++msgstr "Name der USV in NUT im Format usv@host "
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Unixsock Plugin Konfiguration"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Pfad zu PID-Datei"
++
++msgid "User"
++msgstr "Nutzer"
++
++msgid "Verbose monitoring"
++msgstr "Schnittstellen detailliert überwachen"
++
++msgid "Wireless"
++msgstr "Drahtlos"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr "Wireless-iwinfo Plugin Konfiguration"
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "z.B. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "z.B. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "z.B. reject-with tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "max. 16 Buchstaben"
++
++msgid "reduces rrd size"
++msgstr "reduziert die RRD Größe"
++
++msgid "seconds; multiple separated by space"
++msgstr "mehrere mit Leerzeichen trennen"
++
++msgid "server interfaces"
++msgstr "Server-Schnittstellen"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "Systemplugins"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "Das Statistik-Paket basiert auf <a href=\"http://collectd.org/index.shtml"
++#~ "\">Collectd</a> und nutzt <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
++#~ "Tool</a> um die gesammelten Daten in Diagramme zu rendern."
++
++#~ msgid "Installed network plugins:"
++#~ msgstr "Installierte Netzwerk-Plugins:"
++
++#~ msgid "Installed output plugins:"
++#~ msgstr "Installierte Ausgabe-Plugins:"
++
++#~ msgid ""
++#~ "Network plugins are used to collect information about open tcp "
++#~ "connections, interface traffic, iptables rules etc."
++#~ msgstr ""
++#~ "Netzwerkplugins werden benutzt um Informationen über offene TCP-"
++#~ "Verbindungen, Datenverkehr/Volumen, Iptables/Firewall Regeln etc. zu "
++#~ "sammeln"
++
++#~ msgid ""
++#~ "Output plugins provide different possibilities to store collected data. "
++#~ "It is possible to enable multiple plugin at one, for example to store "
++#~ "collected data in rrd databases and to transmit the data over the network "
++#~ "to other collectd instances."
++#~ msgstr ""
++#~ "Ausgabeplugins ermöglichen es gesammelte Daten zu speichern. Mehrere "
++#~ "Plugins können gleichzeitig aktiviert werden, z.B. um Daten in RRD-"
++#~ "Datenbanken zu speichern und gleichzeitig über das Netzwerk an andere "
++#~ "Collectd-Instanzen zu versenden."
++
++#~ msgid ""
++#~ "System plugins collecting values about system state and ressource usage "
++#~ "on the device.:"
++#~ msgstr ""
++#~ "Systemplugins sammeln Daten zum Systemzustand und den Ressoursenbedarf "
++#~ "des Gerätes"
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "Das Wireless-Plugin sammelt Statistiken über die drahtlose Signalstärke, "
++#~ "den Störpegel und die Signalqualität."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "Wireless Plugin Konfiguration"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/el/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/el/rrdtool.po
+new file mode 100644
+index 0000000..1d81166
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/el/rrdtool.po
+@@ -0,0 +1,358 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-28 02:08+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/el/statistics.po b/feeds/luci/applications/luci-app-statistics/po/el/statistics.po
+new file mode 100644
+index 0000000..746284f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/el/statistics.po
+@@ -0,0 +1,698 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2012-03-18 15:32+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Action (target)"
++msgstr ""
++
++msgid "Add command for reading values"
++msgstr ""
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++#, fuzzy
++msgid "Base Directory"
++msgstr "Κατάλογος βάσης"
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr ""
++
++msgid "CSV Output"
++msgstr "Έξοδος CSV"
++
++msgid "CSV Plugin Configuration"
++msgstr ""
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr "Ρυθμίσεις Collectd"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Το Collectd είναι ένας μικÏός δαίμονας για τη συλλογή δεδομένων από διάφοÏες "
++"πηγές μέσω διάφοÏων Ï€Ïοσθέτων. Σε αυτή τη σελίδα μποÏείτε να αλλάξετε τις "
++"γενικές Ïυθμίσεις του δαίμονα collectd."
++
++msgid "Conntrack"
++msgstr "Conntrack"
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr "ΠεÏίοδος συλλογής δεδομένων"
++
++msgid "Datasets definition file"
++msgstr "ΑÏχείο οÏÎ¹ÏƒÎ¼Î¿Ï ÏƒÏ…Î½ÏŒÎ»Ï‰Î½ δεδομένων"
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr "Κατάλογος για Ï€Ïόσθετα collectd"
++
++#, fuzzy
++msgid "Directory for sub-configurations"
++msgstr "Κατάλογος υπο-Ïυθμίσεων"
++
++msgid "Disk Plugin Configuration"
++msgstr ""
++
++msgid "Disk Space Usage"
++msgstr "ΧÏήση ΧώÏου στον δίσκο"
++
++msgid "Disk Usage"
++msgstr "ΧÏήση Δίσκου"
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr "Εμφάνιση χÏÎ¿Î½Î¹ÎºÎ¿Ï ÎµÏÏους »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr ""
++
++msgid "Email"
++msgstr "Ηλ. ΤαχυδÏομείο"
++
++msgid "Enable this plugin"
++msgstr ""
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr "Τείχος Ï€Ïοστασίας"
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "ΓÏαφήματα"
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Όνομα υπολογιστή"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr ""
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Διεπαφές"
++
++msgid "Interrupts"
++msgstr "Διακοπές"
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr "Μνήμη"
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr "Όνομα κανόνα"
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr ""
++
++msgid "Network"
++msgstr "Δίκτυο"
++
++msgid "Network Plugin Configuration"
++msgstr ""
++
++msgid "Network plugins"
++msgstr "ΠÏόσθετα δικτÏου"
++
++msgid "Network protocol"
++msgstr ""
++
++msgid "Number of threads for data collection"
++msgstr "ΑÏιθμός νημάτων για τη συλλογή δεδομένων"
++
++msgid "OLSRd"
++msgstr "OLSRd"
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr "ΠÏόσθετα εξόδου"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr "ΔιεÏγασίες"
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr "ΕπεξεÏγαστής"
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr ""
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr "ΔευτεÏόλεπτα"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr "Στατιστικά"
++
++msgid "Storage directory"
++msgstr ""
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr "ΦόÏτος Συστήματος"
++
++msgid "TCP Connections"
++msgstr "Συνδέσεις TCP"
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr "Πίνακας"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "ΑÏχείο PID σε χÏήση"
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr "ΑσÏÏματο"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "π.χ. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "π.χ. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr ""
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "ΠÏόσθετα συστήματος"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "Το πακέτο στατιστικών βασίζεται στο <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> και χÏησιμοποιεί το <a href=\"http://oss.oetiker.ch/"
++#~ "rrdtool/\">RRD Tool</a> για να σχεδιάσει διαγÏάμματα από τα συλλεγόμενα "
++#~ "δεδομένα."
+diff --git a/feeds/luci/applications/luci-app-statistics/po/en/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/en/rrdtool.po
+new file mode 100644
+index 0000000..d780144
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/en/rrdtool.po
+@@ -0,0 +1,358 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "%H: Wireless - Signal Noise Ratio"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "dBm"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Noise Level"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "Signal Strength"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: Wireless - Signal Quality"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "n"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "Signal Quality"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "%H: ICMP Roundtrip Times"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "ms"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "%di"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "%H: Firewall - Processed Packets"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "Packets/s"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "Chain \"%di\""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "%H: Netlink - Transfer on %pi"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "Bytes/s"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "Bytes (%ds)"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "%H: Netlink - Packets on %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "Packets/s"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "Processed (%ds)"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "Dropped (%ds)"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "Errors (%ds)"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "%H: Netlink - Multicast on %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "Packets/s"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "Packets"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "%H: Netlink - Collisions on %pi"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "Collisions/s"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "Collisions"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "%H: Netlink - Errors on %pi"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "Errors/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "%di"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "%di"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "%H: Processes"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "Processes/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "%di"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "%H: Process %pi - used cpu time"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "Jiffies"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "system"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "user"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "%H: Process %pi - threads and processes"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "Count"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "%ds"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "%H: Process %pi - page faults"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "Pagefaults"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "page faults"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "%H: Process %pi - virtual memory size"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "Bytes"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "virtual memory"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "%H: Usage on Processor #%pi"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "%"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "%di"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "%H: Transfer on %di"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "Bytes/s"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "%H: Packets on %di"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "Packets/s"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "%H: TCP-Connections to Port %pi"
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "Connections/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "%di"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "%H: Disk Space Usage on %di"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "Bytes"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "%ds"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "%ds"
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "%H: Interrupts"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "Issues/s"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "IRQ %di"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "%H: System Load"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "Load"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "1 min"
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "5 min"
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "15 min"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/en/statistics.po b/feeds/luci/applications/luci-app-statistics/po/en/statistics.po
+new file mode 100644
+index 0000000..79f710c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/en/statistics.po
+@@ -0,0 +1,752 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:35+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid "Action (target)"
++msgstr "Action (target)"
++
++msgid "Add command for reading values"
++msgstr "Add command for reading values"
++
++msgid "Add matching rule"
++msgstr "Add matching rule"
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr "Add notification command"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Base Directory"
++
++msgid "Basic monitoring"
++msgstr "Basic monitoring"
++
++msgid "CPU Plugin Configuration"
++msgstr "CPU Plugin Configuration"
++
++msgid "CSV Output"
++msgstr "CSV Output"
++
++msgid "CSV Plugin Configuration"
++msgstr "CSV Plugin Configuration"
++
++msgid "Cache collected data for"
++msgstr "Cache collected data for"
++
++msgid "Cache flush interval"
++msgstr "Cache flush interval"
++
++msgid "Chain"
++msgstr "Chain"
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr "Collectd Settings"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr "DF Plugin Configuration"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "DNS Plugin Configuration"
++
++msgid "Data collection interval"
++msgstr "Data collection interval"
++
++msgid "Datasets definition file"
++msgstr "Datasets definition file"
++
++msgid "Destination ip range"
++msgstr "Destination ip range"
++
++msgid "Directory for collectd plugins"
++msgstr "Directory for collectd plugins"
++
++msgid "Directory for sub-configurations"
++msgstr "Directory for sub-configurations"
++
++msgid "Disk Plugin Configuration"
++msgstr "Disk Plugin Configuration"
++
++msgid "Disk Space Usage"
++msgstr "Disk Space Usage"
++
++msgid "Disk Usage"
++msgstr "Disk Usage"
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr "Display timespan »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "E-Mail Plugin Configuration"
++
++msgid "Email"
++msgstr "Email"
++
++msgid "Enable this plugin"
++msgstr "Enable this plugin"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Exec Plugin Configuration"
++
++msgid "Filter class monitoring"
++msgstr "Filter class monitoring"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Flush cache after"
++msgstr "Flush cache after"
++
++msgid "Forwarding between listen and server addresses"
++msgstr "Forwarding between listen and server addresses"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Graphs"
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr "IRQ Plugin Configuration"
++
++msgid "Ignore source addresses"
++msgstr "Ignore source addresses"
++
++msgid "Incoming interface"
++msgstr "Incoming interface"
++
++msgid "Interface Plugin Configuration"
++msgstr "Interface Plugin Configuration"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interrupts"
++msgstr "Interrupts"
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr "Iptables Plugin Configuration"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr "Listen host"
++
++msgid "Listen port"
++msgstr "Listen port"
++
++msgid "Listener interfaces"
++msgstr "Listener interfaces"
++
++msgid "Load Plugin Configuration"
++msgstr "Load Plugin Configuration"
++
++msgid "Maximum allowed connections"
++msgstr "Maximum allowed connections"
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr "Monitor all local listen ports"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Monitor devices"
++
++msgid "Monitor disks and partitions"
++msgstr "Monitor disks and partitions"
++
++msgid "Monitor filesystem types"
++msgstr "Monitor filesystem types"
++
++msgid "Monitor hosts"
++msgstr "Monitor hosts"
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr "Monitor interrupts"
++
++msgid "Monitor local ports"
++msgstr "Monitor local ports"
++
++msgid "Monitor mount points"
++msgstr "Monitor mount points"
++
++msgid "Monitor processes"
++msgstr "Monitor processes"
++
++msgid "Monitor remote ports"
++msgstr "Monitor remote ports"
++
++msgid "Name of the rule"
++msgstr "Name of the rule"
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Netlink Plugin Configuration"
++
++msgid "Network"
++msgstr "Network"
++
++msgid "Network Plugin Configuration"
++msgstr "Network Plugin Configuration"
++
++msgid "Network plugins"
++msgstr "Network plugins"
++
++msgid "Network protocol"
++msgstr "Network protocol"
++
++msgid "Number of threads for data collection"
++msgstr "Number of threads for data collection"
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr "Only create average RRAs"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Options"
++
++msgid "Outgoing interface"
++msgstr "Outgoing interface"
++
++msgid "Output plugins"
++msgstr "Output plugins"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Ping Plugin Configuration"
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr "Processes"
++
++msgid "Processes Plugin Configuration"
++msgstr "Processes Plugin Configuration"
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr "Processor"
++
++msgid "Qdisc monitoring"
++msgstr "Qdisc monitoring"
++
++msgid "RRD XFiles Factor"
++msgstr "RRD XFiles Factor"
++
++msgid "RRD heart beat interval"
++msgstr "RRD heart beat interval"
++
++msgid "RRD step interval"
++msgstr "RRD step interval"
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "RRDTool Plugin Configuration"
++
++msgid "Rows per RRA"
++msgstr "Rows per RRA"
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr "Seconds"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "Server host"
++
++msgid "Server port"
++msgstr "Server port"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "Shaping class monitoring"
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr "Source ip range"
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr "Storage directory"
++
++msgid "Storage directory for the csv files"
++msgstr "Storage directory for the csv files"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "Store data values as rates instead of absolute values"
++
++msgid "Stored timespans"
++msgstr "Stored timespans"
++
++msgid "System Load"
++msgstr "System Load"
++
++msgid "TCP Connections"
++msgstr "TCP Connections"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "TCPConns Plugin Configuration"
++
++msgid "TTL for network packets"
++msgstr "TTL for network packets"
++
++msgid "TTL for ping packets"
++msgstr "TTL for ping packets"
++
++msgid "Table"
++msgstr "Table"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr "The cpu plugin collects basic statistics about the processor usage."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++"The interface plugin collects traffic statistics on selected interfaces."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr "The load plugin collects statistics about the general system load."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++"This section defines to which servers the locally collected data is sent to."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "Try to lookup fully qualified hostname"
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Unixsock Plugin Configuration"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Used PID file"
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr "Verbose monitoring"
++
++msgid "Wireless"
++msgstr "Wireless"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "e.g. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "e.g. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "e.g. reject-with tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "max. 16 chars"
++
++msgid "reduces rrd size"
++msgstr "reduces rrd size"
++
++msgid "seconds; multiple separated by space"
++msgstr "seconds; multiple separated by space"
++
++msgid "server interfaces"
++msgstr "server interfaces"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "System plugins"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "Wireless Plugin Configuration"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/es/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/es/rrdtool.po
+new file mode 100644
+index 0000000..3cf27a2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/es/rrdtool.po
+@@ -0,0 +1,360 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-04-16 01:53+0200\n"
++"Last-Translator: Jose <jarre2_es_jose@hotmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "%H: Wireless - Relación señal/ruido"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "dBm"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Nivel de Ruido"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "Fuerza de la señal"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: Wireless - Calidad de la señal"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "n"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "Calidad de señal"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "%H: Tiempo de respuesta ICMP"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "ms"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "%di"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "%H: Firewall - Paquetes Procesados"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "Paquetes/s"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "Cadena \\\"%di\\\""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "%H: Netlink - Traslado en %pi"
++
++# Bytes/s
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "Bytes/s"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "Bytes (%ds)"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "%H: Netlink - Paquetes en %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "Paquetes/s"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "Procesado (%ds)"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "Descartados (%ds)"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "Errores (%ds)"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "%H: Netlink - Multicast en %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "Paquetes/s"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "Paquetes"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "%H: Netlink - Colisiones en %pi"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "Colisiones/s"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "Colisiones"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "%H: Netlink - Errores en %pi"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "Errores/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "%di"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "%di"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "%H: Procesos"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "Procesos/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "%di"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "%H: Proceso %pi -tiempo de cpu utilizado"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "Jiffies"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "sistema"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "usuario"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "%H: Procesos %pi - Hilos y procesos"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "contar"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "%ds"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "%H: Procesos %pi - página de errores"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "Pagina de errores"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "Página de errores"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "%H: Proceso %pi - tamaño de la memoria virtual"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "Bytes"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "Memoria Virtual"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "%H: Uso en el procesador #%pi"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "%"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "%di"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "%H: Transferencia en %di"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "Bytes/s"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "%H: Paquetes en %di"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "Paquetes/s"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "%H: Conexiones TCP en el Puerto %pi"
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "Conexiones/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "%di"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "%H: Uso de espacio de disco en %di"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "Bytes"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "%ds"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "%ds"
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "%H: Interrupciones"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "cuestiones/s"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "IRQ %di"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "%H: Carga de sistema"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "Carga"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "1 minuto"
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "5 minutos"
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "15 minutos"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/es/statistics.po b/feeds/luci/applications/luci-app-statistics/po/es/statistics.po
+new file mode 100644
+index 0000000..7067710
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/es/statistics.po
+@@ -0,0 +1,812 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-12-12 20:19+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Action (target)"
++msgstr "Acción (objetivo)"
++
++msgid "Add command for reading values"
++msgstr "Añadir comando para leer valores"
++
++msgid "Add matching rule"
++msgstr "Añadir regla"
++
++msgid "Add multiple hosts separated by space."
++msgstr "Añadir múltiples máquinas separadas por espacio."
++
++msgid "Add notification command"
++msgstr "Añadir comando de notificación"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Directorio Base"
++
++msgid "Basic monitoring"
++msgstr "Monitorización básica"
++
++msgid "CPU Plugin Configuration"
++msgstr "Configuración del plugin de CPU"
++
++msgid "CSV Output"
++msgstr "Salida CSV"
++
++msgid "CSV Plugin Configuration"
++msgstr "Configuración del plugin de CSV"
++
++msgid "Cache collected data for"
++msgstr "Almacenar datos recogidos para"
++
++msgid "Cache flush interval"
++msgstr "Intervalo de limpieza del caché"
++
++msgid "Chain"
++msgstr "Cadena"
++
++msgid "CollectLinks"
++msgstr "Enlaces"
++
++msgid "CollectRoutes"
++msgstr "Rutas"
++
++msgid "CollectTopology"
++msgstr "Topología"
++
++msgid "Collectd Settings"
++msgstr "Configuración de Collectd"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd is un demonio para la recolección de datos desde varias fuentes a "
++"través de la utilización de diferentes plugins. Aquí puede cambiar la "
++"configuración general del demonio que maneja collectd."
++
++msgid "Conntrack"
++msgstr "Seguimiento"
++
++msgid "Conntrack Plugin Configuration"
++msgstr "Configuración del seguimiento"
++
++msgid "DF Plugin Configuration"
++msgstr "Configuración del plugin DF"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "Configuración del plugin DNS"
++
++msgid "Data collection interval"
++msgstr "Intervalo de recolección de datos"
++
++msgid "Datasets definition file"
++msgstr "Archivo de definición de conjunto de datos"
++
++msgid "Destination ip range"
++msgstr "Rango IP de destino"
++
++msgid "Directory for collectd plugins"
++msgstr "Directorio para los plugins de collectd"
++
++msgid "Directory for sub-configurations"
++msgstr "Directorio para las sub-configuraciones"
++
++msgid "Disk Plugin Configuration"
++msgstr "Configuración del plugin Disco"
++
++msgid "Disk Space Usage"
++msgstr "Espacio en disco ocupado"
++
++msgid "Disk Usage"
++msgstr "Disco ocupado"
++
++msgid "Display Host »"
++msgstr "Mostrar máquina »"
++
++msgid "Display timespan »"
++msgstr "Mostrar lapso de tiempo »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "Configuración del plugin email"
++
++msgid "Email"
++msgstr "Correo electrónico"
++
++msgid "Enable this plugin"
++msgstr "Activar este plugin"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Configuración del plugin Exec"
++
++msgid "Filter class monitoring"
++msgstr "Monitorización del filtro de clases"
++
++msgid "Firewall"
++msgstr "Cortafuegos"
++
++msgid "Flush cache after"
++msgstr "Vaciar caché tras"
++
++msgid "Forwarding between listen and server addresses"
++msgstr "Retransmitir entre las direcciones de escucha y servidor"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Gráficas"
++
++msgid "Group"
++msgstr "Grupo"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Aquí puede definir los comandos externos que iniciará collectd para leer "
++"ciertos valores. Los valores se leen desde la salida estándar (stdout)."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Aquí puede definir los comandos externos que iniciará collectd cuando se "
++"alcancen ciertos valores umbral."
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"Aquí puede definir varios criterios de selección de reglas de iptables "
++"monitorizadas."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr "Máquina"
++
++msgid "Hostname"
++msgstr "Nombre de máquina"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr "IP o nombre de máquina desde la que obtener la salida de txtinfo"
++
++msgid "IRQ Plugin Configuration"
++msgstr "Configuración del plugin IRQ"
++
++msgid "Ignore source addresses"
++msgstr "Ignorar direcciones de origen"
++
++msgid "Incoming interface"
++msgstr "Interfaz de entrada"
++
++msgid "Interface Plugin Configuration"
++msgstr "Configuración del interfaz de plugins"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interrupts"
++msgstr "Interrupciones"
++
++msgid "Interval for pings"
++msgstr "Intervalo entre pings"
++
++msgid "Iptables Plugin Configuration"
++msgstr "Configuración del plugin Iptables"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr "No marcar para determinar automáticamente que interfaces monitorizar."
++
++msgid "Listen host"
++msgstr "Máquina de escucha"
++
++msgid "Listen port"
++msgstr "Puerto de escucha"
++
++msgid "Listener interfaces"
++msgstr "Interfaces para escuchar"
++
++msgid "Load Plugin Configuration"
++msgstr "Configuración del plugin de carga"
++
++msgid "Maximum allowed connections"
++msgstr "Máximo número de conexiones"
++
++msgid "Memory"
++msgstr "Memoria"
++
++msgid "Memory Plugin Configuration"
++msgstr "Configuración del plugin Memoria"
++
++msgid "Monitor all except specified"
++msgstr "Monitorizar todos menos los especificados"
++
++msgid "Monitor all local listen ports"
++msgstr "Monitorizar todos los puertos de escucha locales"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Dispositivos a monitonizar"
++
++msgid "Monitor disks and partitions"
++msgstr "Monitorizar discos y particiones"
++
++msgid "Monitor filesystem types"
++msgstr "Monitorizar tipos de sistema de archivos"
++
++msgid "Monitor hosts"
++msgstr "Monitorizar máquinas"
++
++msgid "Monitor interfaces"
++msgstr "Monitorizar interfaces"
++
++msgid "Monitor interrupts"
++msgstr "Monitorizar interrupciones"
++
++msgid "Monitor local ports"
++msgstr "Monitorizar puertos locales"
++
++msgid "Monitor mount points"
++msgstr "Monitorizar puntos de montaje"
++
++msgid "Monitor processes"
++msgstr "Monitorizar procesos"
++
++msgid "Monitor remote ports"
++msgstr "Monitorizar puertos remotos"
++
++msgid "Name of the rule"
++msgstr "Nombre de la regla"
++
++msgid "Netlink"
++msgstr "Enlace de red"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Configuración del plugin \"enlace de red\""
++
++msgid "Network"
++msgstr "Red"
++
++msgid "Network Plugin Configuration"
++msgstr "Configuración del plugin \"Red\""
++
++msgid "Network plugins"
++msgstr "Plugins de red"
++
++msgid "Network protocol"
++msgstr "Protocolo de red"
++
++msgid "Number of threads for data collection"
++msgstr "Número de hilos para recolección de datos"
++
++msgid "OLSRd"
++msgstr "OLSRd"
++
++msgid "OLSRd Plugin Configuration"
++msgstr "Configuración del plugin \"OLSRd\""
++
++msgid "Only create average RRAs"
++msgstr "Crear sólo RRAs medias"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Opciones"
++
++msgid "Outgoing interface"
++msgstr "Interfaz de salida"
++
++msgid "Output plugins"
++msgstr "Plugins de salida"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Configuración del plugin \"Ping\""
++
++msgid "Port"
++msgstr "Puerto"
++
++msgid "Processes"
++msgstr "Procesos"
++
++msgid "Processes Plugin Configuration"
++msgstr "Configuración del plugin \"Procesos\""
++
++msgid "Processes to monitor separated by space"
++msgstr "Procesos a monitorizar (separados por espacios)"
++
++msgid "Processor"
++msgstr "Procesador"
++
++msgid "Qdisc monitoring"
++msgstr "Monitorización Qdisc"
++
++msgid "RRD XFiles Factor"
++msgstr "Factor XFiles RRD"
++
++msgid "RRD heart beat interval"
++msgstr "Intervalo de pulso RRD"
++
++msgid "RRD step interval"
++msgstr "Intervalo de paso RRD"
++
++msgid "RRDTool"
++msgstr "Herramienta RRD"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "Configuración del plugin \"Herramienta RRD\""
++
++msgid "Rows per RRA"
++msgstr "Filas por RRA"
++
++msgid "Script"
++msgstr "Guión"
++
++msgid "Seconds"
++msgstr "Segundos"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "Máquina servidor"
++
++msgid "Server port"
++msgstr "Puerto servidor"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "Monitorización de la clase shaping"
++
++msgid "Socket file"
++msgstr "Fichero de sockets"
++
++msgid "Socket group"
++msgstr "Grupo socket"
++
++msgid "Socket permissions"
++msgstr "Permisos para socket"
++
++msgid "Source ip range"
++msgstr "Rango de direcciones IP origen"
++
++msgid "Specifies what information to collect about links."
++msgstr "Especifica qué información recolectar sobre enlaces."
++
++msgid "Specifies what information to collect about routes."
++msgstr "Especifica qué información recolectar sobre rutas."
++
++msgid "Specifies what information to collect about the global topology."
++msgstr "Especifica qué información recolectar sobre la topología global."
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr "Estadísticas"
++
++msgid "Storage directory"
++msgstr "Directorio de guardado"
++
++msgid "Storage directory for the csv files"
++msgstr "Directorio para guardar archivos csv"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "Guardar datos como ratios en vez de valores absolutos"
++
++msgid "Stored timespans"
++msgstr "Intervalos almacenados"
++
++msgid "System Load"
++msgstr "Carga del sistema"
++
++msgid "TCP Connections"
++msgstr "Conexiones TCP"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "Configuración del plugin \"Conexiones TCP\""
++
++msgid "TTL for network packets"
++msgstr "TTL para paquetes de red"
++
++msgid "TTL for ping packets"
++msgstr "TTL para paquetes de ping"
++
++msgid "Table"
++msgstr "Tabla"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++"El plugin NUT obtiene información sobre Sistemas de Alimentación "
++"Ininterrumpida."
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++"El plugin OLSRd lee información sobre redes distribuidas desde el plugin "
++"txtinfo de OLSRd."
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++"El plugin \"Seguimiento\" recoge estadísticas sobre el número de conexiones "
++"analizadas."
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++"El plugin \"CPU\" recolecta estadísticas básicas acerca del uso del "
++"procesador."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"El plugin \"CSV\" almacena los datos recolectados en un archivo con formato "
++"csv para su procesado posterior con programas de terceros."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"El plugin \"DF\" recolecta estadísticas acerca del uso del espacio en disco "
++"en diferentes dispositivos, puntos de montaje y tipos de sistema de archivos."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"El plugin \"Disco\" recolecta estadísticas detallada acerca de su "
++"utilización para las particiones seleccionadas o bien el disco completo."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"El plugin \"DNS\" recolecta estadísticas detalladas acerca del trafico DNS "
++"en las interfaces seleccionadas."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"El plugin \"eMail\" crea un socket de unix (unix-socket) que puede "
++"utilizarse para transmitir estadísticas de email a un demonio collectd en "
++"ejecución. Este plugin fue desarrollado, en primer instancia, para ser "
++"utilizado en conjunto con Mail::SpamAssasin::Plugin::Collectd pero puede "
++"utilizarse de diferentes formas."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"El plugin \"Exec\" inicia comandos externos para leer valores o notificar a "
++"procesos externos cuando determinados valores se alcanzan."
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++"El plugin \"Interface\" recoge estadísticas de tráfico en las interfaces "
++"seleccionadas."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"El plugin \"Iptables\" monitoriza las reglas seleccionadas del cortafuegos y "
++"recoge información de bytes y paquetes procesados por cada regla."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"El plugin IRQ monitorizará las activaciones por segundo de cada interrupción "
++"elegida. Si no se selecciona ninguna se monitorizarán todas."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++"El plugin \"iwinfo\" recolecta estadísticas sobre la potencia de la señal "
++"inalámbrica, ruido y calidad."
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++"El plugin \"carga\" recoge estadísticas sobre la carga general del sistema."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr "El plugin \"memoria\" recoge estadísticas sobre el uso de memoria."
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"El plugin \"netlink\" recoge informaciones extendidas como estadísticas "
++"qdisc-, clase- y filtro- para las interfaces seleccionadas."
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"El plugin \"red\" proporciona comunicación entre diferentes instancias de "
++"collectd. Collectd puede operar tanto en modo cliente como en modo servidor. "
++"En modo cliente la información recogida se envía a una instancia que se "
++"encuentre en modo servidor. En modo servidor la instancia recibe datos de "
++"otras máquinas."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"El plugin \"ping\" enviará ecos ICMP a las máquinas elegifas para medir el "
++"tiempo de viaje para cada host."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"El plugin \"procesos\" recoge información como tiempo de CPU, fallos de "
++"página y uso de memoria de los procesos elegidos."
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"El plugin \"rrdtool\" almacena datos en ficheros de bb.dd. RRD que son la "
++"base para los diagramas.<br /><br /><strong>¡Ojo: Configurar valores "
++"incorrectos puede hacer que se use mucho espacio en el directorio temporal y "
++"puede hacer que el dispositivo funcione mal!</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"El plugin \"tcpconns\" recoge información de conexiones TCP abiertas en los "
++"puertos seleccionados."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"El plugin \"unixsock\" crea un socket UNIX que se puede usar para leer los "
++"datos recogidos por una instancia collectd."
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"Esta sección define sobre qué interfaces collectd esperará conexiones "
++"entrantes."
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++"Esta sección define a qué servidores se envían los datos recolectados "
++"localmente."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "Intenta resolver el nombre de máquina cualificado"
++
++msgid "UPS"
++msgstr "SAI"
++
++msgid "UPS Plugin Configuration"
++msgstr "Configuración del plugin SAI"
++
++msgid "UPS name in NUT ups@host format"
++msgstr "Nombre del SAI en el formato de NUT sai@máquina"
++
++msgid "UnixSock"
++msgstr "Socket UNIX"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Configuración del plugin \"UnixSock\""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Archivo PID utilizado"
++
++msgid "User"
++msgstr "Usuario"
++
++msgid "Verbose monitoring"
++msgstr "Monitorización detallada"
++
++msgid "Wireless"
++msgstr "Red inalámbrica"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr "Configuración plugin \"Wireless iwinfo\""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "p.e. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "p.e. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "p.e. reject-with tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "16 caracteres máximo"
++
++msgid "reduces rrd size"
++msgstr "reduce el tamaño RRD"
++
++msgid "seconds; multiple separated by space"
++msgstr "segundos (varios separados por espacio)"
++
++msgid "server interfaces"
++msgstr "interfaces servidores"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "Plugins del sistema"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "El paquete \"estadísticas\" está basado en <a href=\"http://collectd.org/"
++#~ "index.shtml\">Collectd</a> y utiliza <a href=\"http://oss.oetiker.ch/"
++#~ "rrdtool/\">RRD Tool</a> para dibujar gráficos con los datos recogidos."
++
++#~ msgid "Installed network plugins:"
++#~ msgstr "Plugins de red instalados:"
++
++#~ msgid "Installed output plugins:"
++#~ msgstr "Plugins de salida instalados:"
++
++#~ msgid ""
++#~ "Network plugins are used to collect information about open tcp "
++#~ "connections, interface traffic, iptables rules etc."
++#~ msgstr ""
++#~ "Los plugins de red se usan para recolectar información sobre conexiones "
++#~ "TCP, tráfico en los interfaces, reglas de iptables, etc."
++
++#~ msgid ""
++#~ "Output plugins provide different possibilities to store collected data. "
++#~ "It is possible to enable multiple plugin at one, for example to store "
++#~ "collected data in rrd databases and to transmit the data over the network "
++#~ "to other collectd instances."
++#~ msgstr ""
++#~ "Los plugins de salida ofrecen varias posibilidades para almacenar los "
++#~ "datos. Es posible activar varios plugins a la vez, por ejemplo para "
++#~ "almacenar datos recolectados en bases de datos RRD y para transmitir los "
++#~ "datos sobre la red a otras instancias de collectd."
++
++#~ msgid ""
++#~ "System plugins collecting values about system state and ressource usage "
++#~ "on the device.:"
++#~ msgstr ""
++#~ "Los plugins del sistema recolectan valores sobre el estado y el uso de "
++#~ "recursos del dispositivo.:"
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "El plugin \"inalámbrico\" recoge estadísticas sobre fuerza de la señal, "
++#~ "ruido y calidad."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "Configuración del plugin \"Wireless\""
++
++#~ msgid "Filepath of the unix socket"
++#~ msgstr "Ruta de archivo para el socket de unix"
++
++#~ msgid "Group ownership of the unix socket"
++#~ msgstr "Grupo (dueño) del socket de unix "
++
++#~ msgid "group name"
++#~ msgstr "nombre del grupo"
++
++#~ msgid "File permissions of the unix socket"
++#~ msgstr "Permisos de archivos del socket de unix"
++
++#~ msgid "octal"
++#~ msgstr "octal"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/fr/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/fr/rrdtool.po
+new file mode 100644
+index 0000000..95545db
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/fr/rrdtool.po
+@@ -0,0 +1,358 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/fr/statistics.po b/feeds/luci/applications/luci-app-statistics/po/fr/statistics.po
+new file mode 100644
+index 0000000..194a220
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/fr/statistics.po
+@@ -0,0 +1,760 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2011-11-23 22:32+0200\n"
++"Last-Translator: fredb <fblistes+luci@free.fr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Action (target)"
++msgstr "Action (cible)"
++
++msgid "Add command for reading values"
++msgstr "Ajoute une commande pour lire des valeurs"
++
++msgid "Add matching rule"
++msgstr "Ajouter une règle à surveiller"
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr "Ajoute une commande de notification"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Répertoire de base"
++
++msgid "Basic monitoring"
++msgstr "Surveillance de base"
++
++msgid "CPU Plugin Configuration"
++msgstr "Configuration du greffon sur le CPU"
++
++msgid "CSV Output"
++msgstr "Sortie au format CSV"
++
++msgid "CSV Plugin Configuration"
++msgstr "Configuration du greffon CSV"
++
++msgid "Cache collected data for"
++msgstr "Mettre en cache les données collectées pendant"
++
++msgid "Cache flush interval"
++msgstr "Intervalle de vidange du cache"
++
++msgid "Chain"
++msgstr "Chaîne"
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr "Paramètres Collectd"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd est un petit démon collectant des données de sources variées à "
++"travers différents greffons. Sur ce page, vous pouvez modifier les "
++"paramètres généraux de ce démon collectd."
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr "Configuration du greffon DF"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "Configuration du greffon DNS"
++
++msgid "Data collection interval"
++msgstr "Période de récupération des données"
++
++msgid "Datasets definition file"
++msgstr "Fichier de définition des lots de données"
++
++msgid "Destination ip range"
++msgstr "plage réseau de destination"
++
++msgid "Directory for collectd plugins"
++msgstr "Répertoire pour les greffons Collectd"
++
++msgid "Directory for sub-configurations"
++msgstr "Répertoire pour les sous-configurations"
++
++msgid "Disk Plugin Configuration"
++msgstr "Configuration du greffon Disque"
++
++msgid "Disk Space Usage"
++msgstr "Utilisation de l'espace-disque"
++
++msgid "Disk Usage"
++msgstr "Espace-disque"
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr "Période affichée »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "Configuration du greffon des courriels"
++
++msgid "Email"
++msgstr "Courriel"
++
++msgid "Enable this plugin"
++msgstr "Activer ce greffon"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Configuration du greffon Exec"
++
++msgid "Filter class monitoring"
++msgstr "Surveillance des filtres"
++
++msgid "Firewall"
++msgstr "Pare-feu"
++
++msgid "Flush cache after"
++msgstr "Vidanger le cache après"
++
++msgid "Forwarding between listen and server addresses"
++msgstr "Transfert entre les adresses en écoute et du serveur"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Graphiques"
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Vous pouvez définir ici des commandes externes qui seront démarrées par "
++"collectd pour lire certaines valeurs. Ces valeurs seront lisibles depuis "
++"stdout."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Vous pouvez définir ici des commandes externes qui seront démarrées par "
++"collectd quand certaines valeurs-seuil seront atteintes. Les valeurs "
++"induisant ces démarrages seront fournies aux commandes externes via stdin."
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"Vous pouvez définir ici les critères variés pour sélectionner les règles "
++"iptables à surveiller."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Nom de l'hôte"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr "Configuration du greffon IRQ"
++
++msgid "Ignore source addresses"
++msgstr "Ignorer les adresses-source"
++
++msgid "Incoming interface"
++msgstr "Interface entrante"
++
++msgid "Interface Plugin Configuration"
++msgstr "Configuration du greffon des Interfaces"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interrupts"
++msgstr "Interruptions"
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr "Configuration du greffon IPtables"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr "Hôte en écoute"
++
++msgid "Listen port"
++msgstr "Port en écoute"
++
++msgid "Listener interfaces"
++msgstr "Interfaces en écoute"
++
++msgid "Load Plugin Configuration"
++msgstr "Configuration du greffon de charge-système"
++
++msgid "Maximum allowed connections"
++msgstr "Nb de Connexions autorisées au maximum"
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr "Surveiller tous les ports en écoute locaux"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Périphériques à surveiller"
++
++msgid "Monitor disks and partitions"
++msgstr "Disques et partitions à surveiller"
++
++msgid "Monitor filesystem types"
++msgstr "types de systèmes de fichier à surveiller"
++
++msgid "Monitor hosts"
++msgstr "Hôtes à surveiller"
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr "Surveiller les interruptions"
++
++msgid "Monitor local ports"
++msgstr "Surveiller les ports locaux"
++
++msgid "Monitor mount points"
++msgstr "Points de montage à surveiller"
++
++msgid "Monitor processes"
++msgstr "Processus à surveiller"
++
++msgid "Monitor remote ports"
++msgstr "Surveiller les ports destinataires"
++
++msgid "Name of the rule"
++msgstr "Nom de la règle"
++
++msgid "Netlink"
++msgstr ""
++
++msgid "Netlink Plugin Configuration"
++msgstr "Configuration du greffon du lien-réseau"
++
++msgid "Network"
++msgstr "Réseau"
++
++msgid "Network Plugin Configuration"
++msgstr "Configuration du greffon réseau"
++
++msgid "Network plugins"
++msgstr "Greffons liés au réseau"
++
++msgid "Network protocol"
++msgstr "Protocole réseau"
++
++msgid "Number of threads for data collection"
++msgstr "Nombre de fils pour la récupération des données"
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr "Créer seulement des RRAs moyens"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Options"
++
++msgid "Outgoing interface"
++msgstr "Interface sortante"
++
++msgid "Output plugins"
++msgstr "Greffons liés aux résultats"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Configuration du greffon Ping"
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr "Processus"
++
++msgid "Processes Plugin Configuration"
++msgstr "Configuration du greffon des processus"
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr "Processeur"
++
++msgid "Qdisc monitoring"
++msgstr "Surveillance Qdisc"
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr "Intervalle de la pulsation RRD"
++
++msgid "RRD step interval"
++msgstr "Intervalle d'avancement RRD"
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "Configuration du greffon RRDTool"
++
++msgid "Rows per RRA"
++msgstr "Lignes par RRA"
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr "Secondes"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "Hôte du serveur"
++
++msgid "Server port"
++msgstr "Port du serveur"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "Surveillance liées à la priorité"
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr "plage réseau source"
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr "Répertoire de stockage"
++
++msgid "Storage directory for the csv files"
++msgstr "Répertoire de stockage pour les fichiers CSV"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "Stocke les données sous forme de taux plutôt que de valeurs absolues"
++
++msgid "Stored timespans"
++msgstr "Durée de la période enregistrée"
++
++msgid "System Load"
++msgstr "Charge-système"
++
++msgid "TCP Connections"
++msgstr "Connexions TCP"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "Configuration du plugin des connexions TCP"
++
++msgid "TTL for network packets"
++msgstr "TTL des paquets-réseau"
++
++msgid "TTL for ping packets"
++msgstr "TTL des paquets ping"
++
++msgid "Table"
++msgstr "Table"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr "Le greffon sur le CPU récupère des données sur l'usage du processeur."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"Le greffon CSV stocke les données collectées dans des fichiers au format CSV "
++"pour être traités ultérieurement par des programmes externes."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"Le plugin DF récupère des données sur l'utilisation de l'espace-disque sur "
++"différents périphériques, points de montage ou types de systèmes de fichiers."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"Le greffon Disque récupère des informations détaillées sur des disques ou "
++"partitions sélectionnées."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"Le greffon DNS récupère des données détaillées à propos du trafic lié au DNS "
++"sur des interfaces sélectionnées."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"Le greffon des courriels crée une socket UNIX qui peut être utilisée pour "
++"transmettre des données sur les courriels à un démon collectd en fonction. "
++"Ce greffon est d'abord destiné à être utilisé avec Mail::SpamAssasin::"
++"Plugin::Collectd mais peut être utilisé d'autres manières également."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"Le greffon Exec lance des commandes externes pour lire des valeurs ou "
++"notifie des processus externes quand certains seuils ont été atteints."
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++"Ce greffon des interfaces collecte des statistiques de trafic sur les "
++"interfaces sélectionnées."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"Le greffon IPtables surveillera des règles de pare-feu sélectionnées et "
++"collectera des informations sur les octets et paquets IP traités par chaque "
++"règle."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"Le greffon IRG surveillera le taux d'apparitions par seconde de chaque "
++"interruption sélectionnée. Si aucune interruption n'est sélectionnée, toutes "
++"sont surveillées."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++"Le greffon de charge-système collecte des données sur la charge générale du "
++"système."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"Le greffon de lien-réseau récupère sur les interfaces sélectionnées des "
++"informations avancées liées à la QOS, aux classes et au filtrage."
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"Le greffon réseau fournit des communications-réseau entre différentes "
++"instances collectd : ce programme peut fonctionner à la fois comme client et "
++"serveur. En mode client, les données collectées localement sont transférées "
++"à un serveur, en mode serveur, l'instance collectd locale reçoit des "
++"informations d'autres hôtes."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"Le greffon ping envoie des paquets ICMP « echo reply » aux hôtes définis et "
++"mesure le temps d'aller-retour avec chacun."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"Le greffon des processus récupère des informations comme le temps CPU, les "
++"défauts de page et l'utilisation mémoire des processus définis."
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"Le greffon RRDTool stocke les informations récupérées dans des fichiers de "
++"base de données RRD, sur lesquels s'appuient la génération de graphes.<br /"
++"><br /><strong>Attention : Un mauvais paramètrage peut entraîner une très "
++"grande consommation mémoire dans le répertoire temporaire, qui peut rendre "
++"le matériel inutilisable !</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"Le greffon des connexions TCP récupère des informations sur les ouvertures "
++"de connexions TCP sur les ports spécifiés."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"Cette section définit sur quelles interfaces collectd écoutera des "
++"connexions entrantes."
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++"Cette section définit à quels serveurs sont envoyées les données collectées "
++"localement."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "Tente de récupérer des noms d'hôtes complètement qualifiés"
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr "Socket Unix"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Configuration du greffon de socket Unix"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Fichier PID utilisé"
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr "Surveillance verbeuse"
++
++msgid "Wireless"
++msgstr "Sans-fil"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "p.ex. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "p.ex. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "p.ex. reject-with tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "Max. 16 caractères"
++
++msgid "reduces rrd size"
++msgstr "Diminuer la taille RRD"
++
++msgid "seconds; multiple separated by space"
++msgstr "En secondes ; séparer différentes valeurs par des espaces"
++
++msgid "server interfaces"
++msgstr "Interfaces du serveur"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "Greffons liés au système"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "Ce paquet d'outils statistiques s'appuie sur le logiciel <a href=\"http://"
++#~ "collectd.org/index.shtml\">Collectd</a> et utilise <a href=\"http://oss."
++#~ "oetiker.ch/rrdtool/\">RRD Tool</a> pour calculer les graphes issus des "
++#~ "données collectées."
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "Le greffon sans-fil récupère des informations sur la puissance du signal "
++#~ "wifi, sa qualité et sur le bruit."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "Configuration du greffon sans-fil"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/he/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/he/rrdtool.po
+new file mode 100644
+index 0000000..32b74f7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/he/rrdtool.po
+@@ -0,0 +1,356 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/he/statistics.po b/feeds/luci/applications/luci-app-statistics/po/he/statistics.po
+new file mode 100644
+index 0000000..10e8a12
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/he/statistics.po
+@@ -0,0 +1,677 @@
++# statistics.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-10 04:59+0200\n"
++"Last-Translator: Snoof <sagim9@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Action (target)"
++msgstr ""
++
++msgid "Add command for reading values"
++msgstr "הוסף פקודה לקרי×ת נתוני×"
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr ""
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr ""
++
++msgid "CSV Output"
++msgstr ""
++
++msgid "CSV Plugin Configuration"
++msgstr ""
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr ""
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr ""
++
++msgid "Datasets definition file"
++msgstr ""
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr ""
++
++msgid "Directory for sub-configurations"
++msgstr ""
++
++msgid "Disk Plugin Configuration"
++msgstr ""
++
++msgid "Disk Space Usage"
++msgstr ""
++
++msgid "Disk Usage"
++msgstr ""
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr ""
++
++msgid "E-Mail Plugin Configuration"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable this plugin"
++msgstr ""
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr ""
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr ""
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interrupts"
++msgstr ""
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr ""
++
++msgid "Netlink"
++msgstr ""
++
++msgid "Netlink Plugin Configuration"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Plugin Configuration"
++msgstr ""
++
++msgid "Network plugins"
++msgstr ""
++
++msgid "Network protocol"
++msgstr ""
++
++msgid "Number of threads for data collection"
++msgstr ""
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Ping Plugin Configuration"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr ""
++
++msgid "RRDTool Plugin Configuration"
++msgstr ""
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr ""
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr ""
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr ""
++
++msgid "TCP Connections"
++msgstr ""
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr ""
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr ""
++
++msgid "e.g. br-lan"
++msgstr ""
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr ""
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/hu/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/hu/rrdtool.po
+new file mode 100644
+index 0000000..582c939
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/hu/rrdtool.po
+@@ -0,0 +1,359 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-01 10:38+0200\n"
++"Last-Translator: juhosg <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "%H: Vezetéknélküli - Jel-zaj arány"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "dBm"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Zajszint"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "Jelerősség"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: Vezetéknélküli - Jel minőség"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "n"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "Jelminőség"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "%H: ICMP oda-vissza idő"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "ms"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "%di"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "%H: Tűzfal - feldolgozott csomagok"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "csomag/másodperc"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "Lánc \\\"%di\\\""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "%H: Netlink - %pi forgalma"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "bájt/másodperc"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "bájtok (%ds)"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "%H: Netlink - %pi csomagjai"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "csomag/másodperc"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "feldolgozva (%ds)"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "eldobva (%ds)"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "hibák (%ds)"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "%H: Netlink - multicast %pi-n"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "csomag/másodperc"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "csomagok"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "%H: Netlink - ütközések %pi-n"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "ütközés/másodperc"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "Ütközések"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "%H: Netlink - hibák %pi-n"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "hiba/másodperc"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "%di"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "%di"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "%H: Folyamatok"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "folyamat/másodperc"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "%di"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "%H: Folyamat %pi - processzor idő"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "jiffie-k"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "rendszer"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "felhasználó"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "%H: Folyamat %pi - szálak és folyamatok"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "darab"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "%ds"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "%H: Folyamat %pi - laphibák"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "Laphibák"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "laphibák"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "%H: Folymat %pi - virtuális memória mérete"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "Bájtok"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "virtuális memória"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "%H: %pi processzor kihasználtsága"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "%"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "%di"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "%H: %di forgalma"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "bájt/másodperc"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "%H: %di csomagjai"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "csomag/másodperc"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "%H: TCP kapcsolatok a %pi portra"
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "kapcsolat/másodperc"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "%di"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "%H: lemezterület felhasználás %di-n"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "bájt"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "%ds"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "%ds"
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "%H: megszakítások"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "darab/másodperc"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "IRQ %di"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "%H: Rendszer terhelés"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "Terhelés"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "1 perc"
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "5 perc"
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "15 perc"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/hu/statistics.po b/feeds/luci/applications/luci-app-statistics/po/hu/statistics.po
+new file mode 100644
+index 0000000..5d38414
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/hu/statistics.po
+@@ -0,0 +1,784 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-01-31 18:58+0200\n"
++"Last-Translator: Sixtus <gelencser12@freemail.hu>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Action (target)"
++msgstr "Tevékenység (cél)"
++
++msgid "Add command for reading values"
++msgstr "Érték olvasására szolgáló parancs hozzáadása"
++
++msgid "Add matching rule"
++msgstr "Szabály hozzáadása"
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr "Értesítési parancs hozzáadása"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Alapkönyvtár"
++
++msgid "Basic monitoring"
++msgstr "Ãltalános figyelés"
++
++msgid "CPU Plugin Configuration"
++msgstr "CPU bővítmény beállítása"
++
++msgid "CSV Output"
++msgstr "CSV kimenet"
++
++msgid "CSV Plugin Configuration"
++msgstr "CSV bővítmény konfigurálása"
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr "Gyorsítótár ürítési időköz"
++
++msgid "Chain"
++msgstr "Lánc"
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr "Collectd beállítások"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"A collectd változatos forrásokból különféle bővítményeken keresztül történő "
++"adatgyűjtésre szolgáló kisméretű démon. Ezen az oldalon módosíthatja a "
++"collectd démon általános beállításait."
++
++msgid "Conntrack"
++msgstr "Conntrack"
++
++msgid "Conntrack Plugin Configuration"
++msgstr "Conntrack bővítmény beállítása"
++
++msgid "DF Plugin Configuration"
++msgstr "DF bővítmény beállítása"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "DNS bővítmény beállítása"
++
++msgid "Data collection interval"
++msgstr "Adatgyűjtési időszak"
++
++msgid "Datasets definition file"
++msgstr "Adatkészlet leíró fálj"
++
++msgid "Destination ip range"
++msgstr "Cél IP tartomány"
++
++msgid "Directory for collectd plugins"
++msgstr "Öszegyűjtött plug-in-ek könyvtára"
++
++msgid "Directory for sub-configurations"
++msgstr "Al-beállítások könyvtára"
++
++msgid "Disk Plugin Configuration"
++msgstr "Lemez bővítmény beállítása"
++
++msgid "Disk Space Usage"
++msgstr "Felhasznált lemezterület"
++
++msgid "Disk Usage"
++msgstr "Lemezhasználat"
++
++msgid "Display Host »"
++msgstr "Host mutatása »"
++
++msgid "Display timespan »"
++msgstr "Időszak megjelenítése »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "E-Mail bővítmény beállítása"
++
++msgid "Email"
++msgstr "E-mail"
++
++msgid "Enable this plugin"
++msgstr "Bővítmény engedélyezése"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Exec bővítmény beállítása"
++
++msgid "Filter class monitoring"
++msgstr "Szűrő osztály figyelése"
++
++msgid "Firewall"
++msgstr "Tűzfal"
++
++msgid "Flush cache after"
++msgstr "Gyorsítótár ürítése ezután:"
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Grafikonok"
++
++msgid "Group"
++msgstr "Csoport"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Itt megadhatók külső parancsok amelyek a collectd által lesznek futtatva "
++"bizonyos értékeke beolvasására. Az értékek a szabványos kimenetről lesznek "
++"beolvasva."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Itt megadhatók külső parancsok amelyek a collectd által lesznek futtatva "
++"amikor bizonyos küszbértékek elérésre kerülnek. A hívást kiváltó értékek a "
++"meghívott programok szabványos bemenetére lesznek küldve."
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"Itt addhatók meg különböző feltételek, amelyek alapján a megfigyelt iptables "
++"szabályok kiválasztásra kerülnek."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr "Gép"
++
++msgid "Hostname"
++msgstr "Gépnév"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++"Annak a gépnek a neve vagy IP címe ahonnan a txtinfo kimenete származik"
++
++msgid "IRQ Plugin Configuration"
++msgstr "IRQ bővítmény beállítása"
++
++msgid "Ignore source addresses"
++msgstr "Forrás címek figyelmen kívül hagyása"
++
++msgid "Incoming interface"
++msgstr "Bejövő interfész"
++
++msgid "Interface Plugin Configuration"
++msgstr "Interfész bővítmény beállítása"
++
++msgid "Interfaces"
++msgstr "Interfészek"
++
++msgid "Interrupts"
++msgstr "Megszakítások"
++
++msgid "Interval for pings"
++msgstr "Ping-ek közötti idő"
++
++msgid "Iptables Plugin Configuration"
++msgstr "Iptables bővítmény beállítása"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++"Bejelölés nélkül a figyelendő iterfészek automatikusan kerülnek "
++"kiválasztásra."
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr "Terhelés bővítmény beállítása"
++
++msgid "Maximum allowed connections"
++msgstr "Megengedett kapcsolatok maximális száma"
++
++msgid "Memory"
++msgstr "Memória"
++
++msgid "Memory Plugin Configuration"
++msgstr "Memória bővítmény beállítása"
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Eszközök figyelése"
++
++msgid "Monitor disks and partitions"
++msgstr "Lemezek és partíciók figyelése"
++
++msgid "Monitor filesystem types"
++msgstr "Fájlrendszer típusok figyelése"
++
++msgid "Monitor hosts"
++msgstr "Gépek figyelése"
++
++msgid "Monitor interfaces"
++msgstr "Interfészek figyelése"
++
++msgid "Monitor interrupts"
++msgstr "Megszakítások figyelése"
++
++msgid "Monitor local ports"
++msgstr "Helyi portok figyelése"
++
++msgid "Monitor mount points"
++msgstr "Csatolási pontok figyelése"
++
++msgid "Monitor processes"
++msgstr "Folyamatok figyelése"
++
++msgid "Monitor remote ports"
++msgstr "Távoli portok figyelése"
++
++msgid "Name of the rule"
++msgstr "A szabály neve"
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Netlink bővítmény beállítása"
++
++msgid "Network"
++msgstr "Hálózat"
++
++msgid "Network Plugin Configuration"
++msgstr "Hálózat bővítmény beállítása"
++
++msgid "Network plugins"
++msgstr "Hálózati bővítmények"
++
++msgid "Network protocol"
++msgstr "Hálózati protokoll"
++
++msgid "Number of threads for data collection"
++msgstr "Az adatgyűjtő szálak száma"
++
++msgid "OLSRd"
++msgstr "OLSRd"
++
++msgid "OLSRd Plugin Configuration"
++msgstr "OLSRd bővítmény beállítása"
++
++msgid "Only create average RRAs"
++msgstr "Csak átlag RRA-k létrehozása"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Lehetőségek"
++
++msgid "Outgoing interface"
++msgstr "Kimenő interfész"
++
++msgid "Output plugins"
++msgstr "Kimeneti bővítmények"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Ping bővítmény beállítása"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Processes"
++msgstr "Folyamatok"
++
++msgid "Processes Plugin Configuration"
++msgstr "Folyamatok bővítmény beállítása"
++
++msgid "Processes to monitor separated by space"
++msgstr "Figyelendő folyamatok szóközzel elválasztva"
++
++msgid "Processor"
++msgstr "Processzor"
++
++msgid "Qdisc monitoring"
++msgstr "Qdisc figyelés"
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "RRDTool bővítmény beállítása"
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr "Parancsfájl"
++
++msgid "Seconds"
++msgstr "másodperc"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "Kiszolgáló gép"
++
++msgid "Server port"
++msgstr "Kiszolgáló port"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr "Socket fájlok"
++
++msgid "Socket group"
++msgstr "Socket csoport"
++
++msgid "Socket permissions"
++msgstr "Socket jogosultságok"
++
++msgid "Source ip range"
++msgstr "Forrás IP tartomány"
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++"Azt határozza meg, hogy az kapcsolatokról milyen információkat kell gyűjteni."
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++"Azt határozza meg, hogy az útvonalakról milyen információkat kell gyűjteni."
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++"Azt határozza meg, hogy a globális topológiáról milyen információkat kell "
++"gyűjteni."
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr "Statisztikák"
++
++msgid "Storage directory"
++msgstr "Tárolási könyvtár"
++
++msgid "Storage directory for the csv files"
++msgstr "A csv fájlok tárolási könyvtára"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "Az adatok arányként történő tárolása abszolút értékek helyett"
++
++msgid "Stored timespans"
++msgstr "Tárolt időszakok"
++
++msgid "System Load"
++msgstr "Rendszerterhelés"
++
++msgid "TCP Connections"
++msgstr "TCP kapcsolatok"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "TCPConns bővítény beállítása"
++
++msgid "TTL for network packets"
++msgstr "TTL a hálózati csomagokhoz"
++
++msgid "TTL for ping packets"
++msgstr "TTL a ping csomagokhoz"
++
++msgid "Table"
++msgstr "Táblázat"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr "A NUT bővítmény a szünetmentes tápokról ad információkat."
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++"Az OLSRd bővítmény a összekapcsolt hálózatokról olvas információkat az OLSRd "
++"txttinfo bővítményén keresztül."
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++"A conntrack bővítmény a nyomon követett kapcsolatok számáról gyűjt "
++"statisztikákat."
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++"A processzor bővítmény a processzorhasználatról gyűjt alapvető "
++"statisztikákat."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"A csv bővítmény segítségével az összegyűjtött adatok csv formátumú fájlba "
++"menthetők külső programmal történő további feldolgozás céljára."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"A df bővítmény a lemezterület használatáról gyűjt statisztikákat különböző "
++"eszközökön, csatolási pontokon vagy fájlrendszereken."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"A lemez bővítmény részletes használati statisztikákat készít a kiválasztott "
++"paticiókhoz vagy teljes lemezekhez."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"A DNS bővítmény részletes adatokat gyűjt a kiválasztott interfészek DNS-hez "
++"tartozó forgalmáról."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"Az email bővítmény egy unix socket-et hoz létre amely lehetővé teszi email-"
++"statisztikáknak a továbbítását egy futó collect démonhoz. A bővítmény "
++"elsősorban a Mail::SpamAssasin::Plugin::Collectd bővítménnyel együtt történő "
++"használatra szolgál, de egyéb módokon is használható."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"Az exec bővítmény külső parancsokat indít értékek olvasására vagy külső "
++"folyamatok értesítésére bizonyos küszöbértékek elérése esetén."
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++"Az interface bővítmény forgalmi statisztikákat gyűjt a kiválasztott "
++"interfészekről."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"Az iptables bővítmény kiválasztott tűzfal szabályok alapján információt "
++"gyűjt a szabályonként feldolgozott bájtokról és csomagokról."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++"A load bővítmény az általános rendszzer terhelésről gyűjt statisztikákat."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr "A memória bővítmény a memórahasználatról gyűjt információkat."
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"A ping bővítmény ICMP echo kéréseket küld a kiválasztott gépekre és méri az "
++"oda-vissza eltelt időt minden gép esetében."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"A tcpconns bővítmény a kiválasztott portokon lévő TCP kapcsolatokról gyűjt "
++"információkat."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"A unixsock bővítmény létrehoz egy unix socket-et melyen keresztül "
++"kiolvashatók az összegyűjtött adatok egy futó collectd-ből. "
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++"Ez a szakasz határozza meg, hogy a helyileg összegyűjtött adatokat melyik "
++"kiszolgálókra kell továbbítani."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "UnixSock bővítmény beállítása"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Használt PID fájl"
++
++msgid "User"
++msgstr "Felhasználó"
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr "Vezeték nélküli"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr "iwinfo vezeték nélküli bővítmény beállítása"
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "pl. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "pl. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "pl. reject-with tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "max. 16 karakter"
++
++msgid "reduces rrd size"
++msgstr "csökkenti az rrd adatbázis méretét"
++
++msgid "seconds; multiple separated by space"
++msgstr "másodpercek; több szóközzel elválasztott érték is megadható"
++
++msgid "server interfaces"
++msgstr "kiszolgáló interfész"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "Rendszer bővítmények"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "A statisztikai csomag a <a href=\"http://collectd.org/index.shtml"
++#~ "\">collectd</a> segédprogramon alapul és az <a href=\"http://oss.oetiker."
++#~ "ch/rrdtool/\">RRD Tool</a> segédprogramot használja a grafikonok "
++#~ "elkészítésére az összegyűjtött adatokból."
++
++#~ msgid "Installed network plugins:"
++#~ msgstr "Telepített hálózati bővítmények:"
++
++#~ msgid "Installed output plugins:"
++#~ msgstr "Telepített kimeneti bővítmények:"
++
++#~ msgid ""
++#~ "Network plugins are used to collect information about open tcp "
++#~ "connections, interface traffic, iptables rules etc."
++#~ msgstr ""
++#~ "A hálózati bővítmények nyitott TCP kapcsolatok, interfész forgalom, "
++#~ "iptables szabályok és ehhez hasonló információk gyűjtésére használhatók."
++
++#~ msgid ""
++#~ "Output plugins provide different possibilities to store collected data. "
++#~ "It is possible to enable multiple plugin at one, for example to store "
++#~ "collected data in rrd databases and to transmit the data over the network "
++#~ "to other collectd instances."
++#~ msgstr ""
++#~ "A kimeneti bővítmények különféle lehetőségeket biztosítanak az "
++#~ "összegyűjtött adatok tárolásához. Lehetőség van többféle bővítmény "
++#~ "egyidejű engedélyezésére, például az összegyűjtött adatok RRD "
++#~ "adatbázisban történő tárolására és egyidejűleg hálózaton keresztül másik "
++#~ "collectd példányhoz való továbbítására."
++
++#~ msgid ""
++#~ "System plugins collecting values about system state and ressource usage "
++#~ "on the device.:"
++#~ msgstr ""
++#~ "A rendszer bővítmények a rendszer állapotáról és az erőforrások "
++#~ "használatáról gyűjtenek adatokat az eszközön."
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "A vezetéknélküli bővítmény vezetéknélküli jelerősségről, zajról és "
++#~ "minőségről gyűjt információkat."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "Vezetéknélküli bővítmény beállítása"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/it/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/it/rrdtool.po
+new file mode 100644
+index 0000000..8ae4472
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/it/rrdtool.po
+@@ -0,0 +1,359 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-02-03 14:50+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "stat_dg_title_wireless__signal_noise"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "stat_dg_label_wireless__signal_noise"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "stat_ds_signal_noise"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "stat_ds_signal_power"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "stat_dg_title_wireless__signal_quality"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "stat_dg_label_wireless__signal_quality"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "stat_ds_signal_quality"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "stat_dg_title_ping"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "stat_dg_label_ping"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "stat_ds_ping"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "stat_dg_title_iptables__ipt_packets"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "stat_dg_label_iptables__ipt_packets"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "stat_ds_ipt_packets"
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "stat_dg_title_netlink__if_octets"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "stat_dg_label_netlink__if_octets"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "stat_ds_if_octets"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "stat_dg_title_netlink__if_packets"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "stat_dg_label_netlink__if_packets"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "stat_ds_if_packets"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "stat_ds_if_dropped"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "stat_ds_if_errors"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "stat_dg_title_netlink__if_multicast"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "stat_dg_label_netlink__if_multicast"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "stat_ds_if_multicast"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "stat_dg_title_netlink__if_collisions"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "stat_dg_label_netlink__if_collisions"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "stat_ds_if_collisions"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "stat_dg_title_netlink__if_tx_errors"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "stat_dg_label_netlink__if_tx_errors"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "stat_ds_if_tx_errors"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "stat_ds_if_rx_errors"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "stat_dg_title_processes"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "stat_dg_label_processes"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "stat_ds_ps_state"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "stat_dg_title_processes__ps_cputime"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "stat_dg_label_processes__ps_cputime"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "stat_ds_ps_cputime__syst"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "stat_ds_ps_cputime__user"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "stat_dg_title_processes__ps_count"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "stat_dg_label_processes__ps_count"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "stat_ds_ps_count"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "stat_dg_title_processes__ps_pagefaults"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "stat_dg_label_processes__ps_pagefaults"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "stat_ds_ps_pagefaults"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "stat_dg_title_processes__ps_rss"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "stat_dg_label_processes__ps_rss"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "stat_ds_ps_rss"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "stat_dg_title_cpu"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "stat_dg_label_cpu"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "stat_ds_cpu"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "stat_dg_title_interface__if_octets"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "stat_dg_label_interface__if_octets"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "stat_dg_title_interface__if_packets"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "stat_dg_label_interface__if_packets"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "stat_dg_title_tcpconns"
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "stat_dg_label_tcpconns"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "stat_ds_tcp_connections"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "stat_dg_title_df"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "stat_dg_label_df"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "stat_ds_df__free"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "stat_ds_df__used"
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "stat_dg_title_irq"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "stat_dg_label_irq"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "stat_ds_irq"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "stat_dg_title_load"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "stat_dg_label_load"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "stat_ds_load__shortterm"
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "stat_ds_load__midterm"
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "stat_ds_load__longterm"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/it/statistics.po b/feeds/luci/applications/luci-app-statistics/po/it/statistics.po
+new file mode 100644
+index 0000000..ab5a783
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/it/statistics.po
+@@ -0,0 +1,687 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2014-08-05 11:41+0200\n"
++"Last-Translator: morganfw <morganfw@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Action (target)"
++msgstr "Azione (destinazione)"
++
++msgid "Add command for reading values"
++msgstr ""
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr ""
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr ""
++
++msgid "CSV Output"
++msgstr ""
++
++msgid "CSV Plugin Configuration"
++msgstr ""
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr ""
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd è un piccolo demone usato per raccogliere dati da varie fonti "
++"grazie a diversi plugin. Su questa pagina puoi cambiare le opzioni generali "
++"del demone collectd."
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr ""
++
++msgid "Datasets definition file"
++msgstr ""
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr ""
++
++msgid "Directory for sub-configurations"
++msgstr ""
++
++msgid "Disk Plugin Configuration"
++msgstr ""
++
++msgid "Disk Space Usage"
++msgstr ""
++
++msgid "Disk Usage"
++msgstr ""
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr ""
++
++msgid "E-Mail Plugin Configuration"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable this plugin"
++msgstr "Abilita questo plugin"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr ""
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Group"
++msgstr "Gruppo"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Qui puoi definire un comando che sarà avviato da collectd per leggere dei "
++"valori. Il valore sarà letto dallo stdout."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Qui puoi definire un comando che sarà avviato da collectd quando un certo "
++"valore soglia sia raggiunto. Il valore in questione sarà passato al comando "
++"incovato come stdin."
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr ""
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interfacce"
++
++msgid "Interrupts"
++msgstr ""
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++"Lasciare deselezionato per determinare automaticamente l'interfaccia da "
++"monitorare."
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr ""
++
++msgid "Netlink"
++msgstr ""
++
++msgid "Netlink Plugin Configuration"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Plugin Configuration"
++msgstr ""
++
++msgid "Network plugins"
++msgstr ""
++
++msgid "Network protocol"
++msgstr ""
++
++msgid "Number of threads for data collection"
++msgstr ""
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Ping Plugin Configuration"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr ""
++
++msgid "RRDTool Plugin Configuration"
++msgstr ""
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr ""
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr ""
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr ""
++
++msgid "TCP Connections"
++msgstr ""
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr "Tabella"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr ""
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr ""
++
++msgid "e.g. br-lan"
++msgstr ""
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr ""
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/ja/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/ja/rrdtool.po
+new file mode 100644
+index 0000000..95545db
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/ja/rrdtool.po
+@@ -0,0 +1,358 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/ja/statistics.po b/feeds/luci/applications/luci-app-statistics/po/ja/statistics.po
+new file mode 100644
+index 0000000..7ee9ae0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/ja/statistics.po
+@@ -0,0 +1,686 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-04-20 08:55+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.4\n"
++
++msgid "Action (target)"
++msgstr ""
++
++msgid "Add command for reading values"
++msgstr ""
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "ベース・ディレクトリ"
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr ""
++
++msgid "CSV Output"
++msgstr ""
++
++msgid "CSV Plugin Configuration"
++msgstr "CSV プラグイン設定"
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr "Collectd 設定"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr "DF プラグイン設定"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr "データã®åŽé›†é–“éš”"
++
++msgid "Datasets definition file"
++msgstr "データベース定義ファイル"
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr "collectd プラグインディレクトリ"
++
++msgid "Directory for sub-configurations"
++msgstr "サブ設定ディレクトリ"
++
++msgid "Disk Plugin Configuration"
++msgstr "ディスクプラグイン設定"
++
++msgid "Disk Space Usage"
++msgstr ""
++
++msgid "Disk Usage"
++msgstr ""
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr "時間帯表示 »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "E-メールプラグイン設定"
++
++msgid "Email"
++msgstr "Eメール"
++
++msgid "Enable this plugin"
++msgstr "プラグイン設定を有効ã«ã™ã‚‹"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr ""
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr "ファイアウォール"
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "グラフ"
++
++msgid "Group"
++msgstr "グループ"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr "ホストå"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr "IRQ プラグイン設定"
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interrupts"
++msgstr ""
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr "設定値以外ã®å…¨ã¦ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’モニターã™ã‚‹"
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr "モニターã™ã‚‹ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®è¨­å®š"
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr ""
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Netlink プラグイン設定"
++
++msgid "Network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++msgid "Network Plugin Configuration"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—ラグイン設定"
++
++msgid "Network plugins"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—ラグイン"
++
++msgid "Network protocol"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—ロトコル"
++
++msgid "Number of threads for data collection"
++msgstr "データåŽé›†ç”¨ã‚¹ãƒ¬ãƒƒãƒ‰æ•°"
++
++msgid "OLSRd"
++msgstr "OLSRd"
++
++msgid "OLSRd Plugin Configuration"
++msgstr "OLSRd プラグイン設定"
++
++msgid "Only create average RRAs"
++msgstr "å¹³å‡å€¤ã®RRAsã®ã¿ä½œæˆã™ã‚‹"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "オプション"
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr "出力プラグイン"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Ping プラグイン設定"
++
++msgid "Port"
++msgstr "ãƒãƒ¼ãƒˆ"
++
++msgid "Processes"
++msgstr ""
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "RRDTool プラグイン設定"
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr "スクリプト"
++
++msgid "Seconds"
++msgstr "秒"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr "ä¿å­˜å…ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr ""
++
++msgid "TCP Connections"
++msgstr ""
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++"インターフェースプラグインã¯ã€é¸æŠžã—ãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®çµ±è¨ˆæƒ…"
++"報をåŽé›†ã—ã¾ã™ã€‚"
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++"iwinfo プラグインã¯ã€ç„¡ç·šä¿¡å·å¼·åº¦ã€ãƒŽã‚¤ã‚ºã€ã‚¯ã‚ªãƒªãƒ†ã‚£æƒ…報をåŽé›†ã—ã¾ã™ã€‚"
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr "è² è·ãƒ—ラグインã¯ã€ã‚·ã‚¹ãƒ†ãƒ è² è·ã®çµ±è¨ˆæƒ…報をåŽé›†ã—ã¾ã™ã€‚"
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr ""
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "使用ã™ã‚‹PIDファイルã®ä¿å­˜å ´æ‰€"
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr "無線LAN iwinfo プラグイン設定"
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr ""
++
++msgid "e.g. br-lan"
++msgstr ""
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr "rrdファイルã®ã‚µã‚¤ã‚ºã‚’å°ã•ãã—ã¾ã™ã€‚"
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "システムプラグイン"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/ms/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/ms/rrdtool.po
+new file mode 100644
+index 0000000..1f81fc6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/ms/rrdtool.po
+@@ -0,0 +1,355 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/ms/statistics.po b/feeds/luci/applications/luci-app-statistics/po/ms/statistics.po
+new file mode 100644
+index 0000000..02dfae9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/ms/statistics.po
+@@ -0,0 +1,674 @@
++# statistics.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Action (target)"
++msgstr ""
++
++msgid "Add command for reading values"
++msgstr ""
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr ""
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr ""
++
++msgid "CSV Output"
++msgstr ""
++
++msgid "CSV Plugin Configuration"
++msgstr ""
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr ""
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr ""
++
++msgid "Datasets definition file"
++msgstr ""
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr ""
++
++msgid "Directory for sub-configurations"
++msgstr ""
++
++msgid "Disk Plugin Configuration"
++msgstr ""
++
++msgid "Disk Space Usage"
++msgstr ""
++
++msgid "Disk Usage"
++msgstr ""
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr ""
++
++msgid "E-Mail Plugin Configuration"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable this plugin"
++msgstr ""
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr ""
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr ""
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interrupts"
++msgstr ""
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr ""
++
++msgid "Netlink"
++msgstr ""
++
++msgid "Netlink Plugin Configuration"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Plugin Configuration"
++msgstr ""
++
++msgid "Network plugins"
++msgstr ""
++
++msgid "Network protocol"
++msgstr ""
++
++msgid "Number of threads for data collection"
++msgstr ""
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Ping Plugin Configuration"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr ""
++
++msgid "RRDTool Plugin Configuration"
++msgstr ""
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr ""
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr ""
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr ""
++
++msgid "TCP Connections"
++msgstr ""
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr ""
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr ""
++
++msgid "e.g. br-lan"
++msgstr ""
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr ""
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/no/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/no/rrdtool.po
+new file mode 100644
+index 0000000..d336ec3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/no/rrdtool.po
+@@ -0,0 +1,354 @@
++msgid ""
++msgstr ""
++"PO-Revision-Date: 2013-03-25 14:24+0200\n"
++"Last-Translator: protx <lars.hardy@gmail.com>\n"
++"Language: no\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "%H: Trådløs - Signal Støy Forhold"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "dBm"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Støy Nivå"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "Signal Styrke"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: Trådløs - Signal Kvalitet"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "n"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "Signal Kvalitet"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "%H: ICMP Rundtur Antall"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "ms"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "%di"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "%H: Brannmur - Pakker Behandlet"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "Pakker/Sek"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "Lenke \\\"%di\\\""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "%H: Netlink - Overført på %pi"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "Bytes/Sek"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "Bytes (%ds)"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "%H: Netlink - Pakker på %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "Pakker/Sek"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "Behandlet (%ds)"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "Droppet (%ds)"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "Feil (%ds)"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "%H: Netlink - Multicast på %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "Pakker/Sek"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "Pakker"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "%H: Netlink - Kollisjoner på %pi"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "Kollisjoner/Sek"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "Kollisjoner"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "%H: Netlink - Feil på %pi"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "Feil/Sek"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "%di"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "%di"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "%H: Prosesser"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "Prosesser/Sek"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "%di"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "%H: Prosesser %pi - brukt cpu tid"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "Jiffier"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "system"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "bruker"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "%H: Prosess %pi - tråder og prosesser"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "Telle"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "%ds"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "%H: Prosess %pi - sidefeil"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "Sidefeil"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "side feil"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "%H: Prosess %pi - virtuelt minne størrelse"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "Bytes"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "virtuelt minne"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "%H: Bruk av prosessor #%pi"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "%"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "%di"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "%H: Overført på %di"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "Bytes/Sek"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "%H: Pakker på %di"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "Pakker/Sek"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "%H: TCP-tilkoblinger på port %pi"
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "Tilkoblinger/Sek"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "%di"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "%H: Disk forbruk på %di"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "Bytes"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "%ds"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "%ds"
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "%H: Avbrudd"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "Problemer/Sek"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "IRQ %di"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "%H: System Belastning"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "Belastning"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "1 min"
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "5 min"
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "15 min"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/no/statistics.po b/feeds/luci/applications/luci-app-statistics/po/no/statistics.po
+new file mode 100644
+index 0000000..c4300bc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/no/statistics.po
+@@ -0,0 +1,771 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Action (target)"
++msgstr "Handling (mål)"
++
++msgid "Add command for reading values"
++msgstr "Legg til kommando for lesing av verdier"
++
++msgid "Add matching rule"
++msgstr "Legg til matchende regel"
++
++msgid "Add multiple hosts separated by space."
++msgstr "Legg til flere verter adskilt med mellomrom."
++
++msgid "Add notification command"
++msgstr "Legg til varsling kommando"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Hoved Katalog"
++
++msgid "Basic monitoring"
++msgstr "Enkel overvåking"
++
++msgid "CPU Plugin Configuration"
++msgstr "CPU plugin konfigurasjon"
++
++msgid "CSV Output"
++msgstr "CSV Utdata"
++
++msgid "CSV Plugin Configuration"
++msgstr "CSV plugin konfigurasjon"
++
++msgid "Cache collected data for"
++msgstr "Hurtigbufre innsamlede data for"
++
++msgid "Cache flush interval"
++msgstr "Intervall for tømming av hurtigbuffer"
++
++msgid "Chain"
++msgstr "Lenke"
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr "Collectd Innstillinger"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd er en liten daemon for innsamling av data fra ulike kilder gjennom "
++"ulike plugins. PÃ¥ denne siden kan du endre generelle innstillinger for "
++"collectd daemon."
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr "DF plugin konfigurasjon"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "DNS plugin konfigurasjon"
++
++msgid "Data collection interval"
++msgstr "Datainnsamling intervall"
++
++msgid "Datasets definition file"
++msgstr "Datasett definisjonsfil"
++
++msgid "Destination ip range"
++msgstr "Destinasjon ip område"
++
++msgid "Directory for collectd plugins"
++msgstr "Katalog for collectd plugins"
++
++msgid "Directory for sub-configurations"
++msgstr "Katalog for sub-konfigurasjoner"
++
++msgid "Disk Plugin Configuration"
++msgstr "Disk plugin konfigurasjon"
++
++msgid "Disk Space Usage"
++msgstr "Disk Forbruk"
++
++msgid "Disk Usage"
++msgstr "Disk Anvendelse"
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr "Vis tidsperiode »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "E-Post plugin konfigurasjon"
++
++msgid "Email"
++msgstr "Epost"
++
++msgid "Enable this plugin"
++msgstr "Aktiver denne plugin"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Program"
++
++msgid "Exec Plugin Configuration"
++msgstr "Program plugin konfigurasjon"
++
++msgid "Filter class monitoring"
++msgstr "Filter class overvåking"
++
++msgid "Firewall"
++msgstr "Brannmur"
++
++msgid "Flush cache after"
++msgstr "Tømme hurtigbufferen etter"
++
++msgid "Forwarding between listen and server addresses"
++msgstr "Videresending mellom lyttende og server adresser"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Grafer"
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Her kan du definere eksterne kommandoer som blir startet av collectd for å "
++"lese enkelte verdier. Verdiene skal leses fra stdout."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Her kan du definere eksterne kommandoer som blir startet av collectd når "
++"visse grenseverdier er blitt nådd. Verdiene som fører til aktivering vil bli "
++"overført til det påkallede programs stdin."
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr "Her kan du definere kriterier for reglene som overvåker iptables."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Vertsnavn"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr "IRQ plugin konfigurasjon"
++
++msgid "Ignore source addresses"
++msgstr "Ignorer kilde adresser"
++
++msgid "Incoming interface"
++msgstr "Innkommende grensesnitt"
++
++msgid "Interface Plugin Configuration"
++msgstr "Grensesnitt plugin konfigurasjon"
++
++msgid "Interfaces"
++msgstr "Grensesnitt"
++
++msgid "Interrupts"
++msgstr "Avbrudd"
++
++msgid "Interval for pings"
++msgstr "Intervall ping"
++
++msgid "Iptables Plugin Configuration"
++msgstr "Iptable plugin konfigurasjon"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr "Lyttende vert"
++
++msgid "Listen port"
++msgstr "Lyttende port"
++
++msgid "Listener interfaces"
++msgstr "Lyttende grensesnitt"
++
++msgid "Load Plugin Configuration"
++msgstr "Belastning plugin konfigurasjon"
++
++msgid "Maximum allowed connections"
++msgstr "Maksimum tillatte tilkoblinger"
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr "Overvåk alle lokale lyttende porter"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Overvåk enheter"
++
++msgid "Monitor disks and partitions"
++msgstr "Overvåk disker og partisjoner"
++
++msgid "Monitor filesystem types"
++msgstr "Overvåk filsystem typer"
++
++msgid "Monitor hosts"
++msgstr "Overvåk verter"
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr "Overvåk avbrudd"
++
++msgid "Monitor local ports"
++msgstr "Overvåk lokale porter"
++
++msgid "Monitor mount points"
++msgstr "Overvåk monterings punkter"
++
++msgid "Monitor processes"
++msgstr "Overvåk prosesser"
++
++msgid "Monitor remote ports"
++msgstr "Overvåk eksterne porter"
++
++msgid "Name of the rule"
++msgstr "Navnet på regelen"
++
++msgid "Netlink"
++msgstr "Nettlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Netlink plugin konfigurasjon"
++
++msgid "Network"
++msgstr "Nettverk"
++
++msgid "Network Plugin Configuration"
++msgstr "Nettverks plugin konfigurasjon"
++
++msgid "Network plugins"
++msgstr "Nettverks plugin"
++
++msgid "Network protocol"
++msgstr "Nettverks protokoll"
++
++msgid "Number of threads for data collection"
++msgstr "Antall tråder for datainnsamling"
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr "Lag kun gjennomsnittlige RRAs"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Alternativer"
++
++msgid "Outgoing interface"
++msgstr "Utgående grensesnitt"
++
++msgid "Output plugins"
++msgstr "Utdata Plugin"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Ping plugin konfigurasjon"
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr "Prosesser"
++
++msgid "Processes Plugin Configuration"
++msgstr "Prosess plugin konfigurasjon"
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr "Prosessor"
++
++msgid "Qdisc monitoring"
++msgstr "Qdisc overvåking"
++
++msgid "RRD XFiles Factor"
++msgstr "RRD XFiles Faktor"
++
++msgid "RRD heart beat interval"
++msgstr "RRD \"heartbeat\" intervall"
++
++msgid "RRD step interval"
++msgstr "RRD steg intervall"
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "RRDTool plugin konfigursjon"
++
++msgid "Rows per RRA"
++msgstr "Rader per RRA"
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr "Sekunder"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "Server vert"
++
++msgid "Server port"
++msgstr "Server port"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "Shaping class overvåking"
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr "Kilde ip område"
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr "Statistikk"
++
++msgid "Storage directory"
++msgstr "Lagrings katalog"
++
++msgid "Storage directory for the csv files"
++msgstr "Katalog for lagring av CSV filer"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "Lagre dataverdier som rater i stedet for absolutte verdier"
++
++msgid "Stored timespans"
++msgstr "Lagrede tidsperioder"
++
++msgid "System Load"
++msgstr "System Belastning"
++
++msgid "TCP Connections"
++msgstr "TCP Forbindelser"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "TCPConns plugin konfigurasjon"
++
++msgid "TTL for network packets"
++msgstr "TTL for nettverkspakker"
++
++msgid "TTL for ping packets"
++msgstr "TTL for ping pakker"
++
++msgid "Table"
++msgstr "Tabell"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr "CPU plugin samler grunnleggende statistikk om prosessor bruk."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"CSV plugin lagrer de innsamlede dataene i CSV format for videre bearbeiding "
++"av eksterne programmer."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"DF plugin samler statistikk om disker på forskjellige enheter, monterings "
++"punkter eller filsystem typer."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"Disk plugin samler detaljert brukerstatistikk for utvalgte partisjoner og "
++"hele disker."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"DNS pluging samler detaljert statistikk om DNS relatert trafikk på utvalgte "
++"grensesnitt."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"E-Post plugin skaper en unix socket som kan brukes til å sende e-post "
++"statistikk til en kjørende collectd daemon. Denne plugin er primært ment å "
++"bli brukt i forbindelse med Mail::SpamAssasin::Plugin::Collectd men kan også "
++"brukes på andre måter."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"Program plugin starter eksterne kommandoer for å lese verdier fra de, eller "
++"for å varsle eksterne prosesser når visse grenseverdier er blitt nådd."
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr "Grensesnitt plugin samler trafikk statistikk på utvalgte grensesnitt."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"Iptables plugin vil overvåke utvalgte brannmurregler og samle informasjon om "
++"bearbeidet data per regel."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"IRQ plugin vil overvåke hastigheten på forespørsler per sekund for hver "
++"valgte avbrudd. Hvis ingen avbrudd er valgt vil alle avbrudd bli overvåket."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr "Belastning plugin samler statistikk systemets belastning."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"Netlink plugin samler utvidet informasjon som qdisc-, klasse- og filter-"
++"statistikk for utvalgte grensesnitt."
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"Nettverk plugin gir nettverk basert kommunikasjon mellom ulike collectd "
++"forekomster. Collectd kan operere i både klient og server modus. I "
++"klientmodus blir lokalt innsamlede data overført til en collectd server. I "
++"server modus mottar enheten data fra andre klienter."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"Ping plugin sender icmp echo svar til utvalgte verter og måle tiden en "
++"rundtur tar for hver vert."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"Prosess plugin samler informasjon som f.eks. CPU tid, sidefeil og minnebruk "
++"for utvalgte prosesser."
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"RRDTool plugin lagrer innsamlede data i rrd databasefiler som er grunnlaget "
++"for diagrammene.<br /><br /><strong>Advarsel: Innsetting av feile verdier "
++"vil kunne resultere i et svært høyt minneforbruk i den midlertidige "
++"katalogen (temp). Dette kan gjøre enheten ubrukelig!</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"Tcpconns plugin samler informasjon om åpne TCP tilkoblinger på utvalgte "
++"porter."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"Unixsock plugin skaper en unix socket som kan brukes til å lese innsamlet "
++"data fra collectd prosess."
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"Denne seksjonen definerer hvilke grensesnitt collectd vil lytte på for "
++"innkommende tilkoblinger."
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++"Denne seksjonen definerer hvilke servere de lokalt innsamlede data blir "
++"sendt til."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "Prøv å søk etter fullstendig vertsnavn"
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Unixsock plugin konfigurasjon"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Brukt PID fil"
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr "Detaljert overvåking"
++
++msgid "Wireless"
++msgstr "Trådløs"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "f.eks. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "f.eks. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "f.eks. forkast med tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "maks. 16 tegn"
++
++msgid "reduces rrd size"
++msgstr "reduserer RRD størrelse"
++
++msgid "seconds; multiple separated by space"
++msgstr "sekunder; flere adskilt med mellomrom"
++
++msgid "server interfaces"
++msgstr "Server grensesnitt"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "System plugins"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "Statistikk pakken er basert på <a href=\"http://collectd.org/index.shtml"
++#~ "\">Collectd</a> og bruker <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
++#~ "Tool</a> for å tegne diagram bilder fra innsamlede data."
++
++#~ msgid "Installed network plugins:"
++#~ msgstr "Installerte nettverks plugin:"
++
++#~ msgid "Installed output plugins:"
++#~ msgstr "Installerte utdata plugin:"
++
++#~ msgid ""
++#~ "Network plugins are used to collect information about open tcp "
++#~ "connections, interface traffic, iptables rules etc."
++#~ msgstr ""
++#~ "Nettverks plugin er brukt til å samle inn informasjon om åpne tcp "
++#~ "koblinger, trafikk over grensesnitt, iptables regler osv."
++
++#~ msgid ""
++#~ "Output plugins provide different possibilities to store collected data. "
++#~ "It is possible to enable multiple plugin at one, for example to store "
++#~ "collected data in rrd databases and to transmit the data over the network "
++#~ "to other collectd instances."
++#~ msgstr ""
++#~ "Utdata plugins gir ulike muligheter til å lagre innsamlede data. Det er "
++#~ "mulig å aktivere flere pluginer på en, for eksempel for å lagre "
++#~ "innsamlede data i RRD databaser og å overføre data over nettverket til "
++#~ "andre collectd forekomster."
++
++#~ msgid ""
++#~ "System plugins collecting values about system state and ressource usage "
++#~ "on the device.:"
++#~ msgstr ""
++#~ "System plugins samler verdier om systemets tilstand og ressurs-bruk.:"
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "Trådløs plugin samler statistikk om trådløs signalstyrke, støy og "
++#~ "kvalitet."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "Trådløs plugin konfigurasjon"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/pl/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/pl/rrdtool.po
+new file mode 100644
+index 0000000..bf451ec
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/pl/rrdtool.po
+@@ -0,0 +1,360 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-08-31 11:06+0200\n"
++"Last-Translator: Staszek <fistaszek@tlen.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "%H: Sieć bezprzewodowa - Poziom Szumów"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "dBm"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Poziom szumów"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "Moc sygnału"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: Sieć bezprzewodowa - Jakość sygnału"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "n"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "Jakość sygnału"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "%H: ICMP - Czasy odpowiedzi"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "ms"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "%di"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "%H: Firewall - Przetworzone pakiety"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "Pakiety/s"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "ÅaÅ„cuch \"%di\""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "%H: Netlink - Transfer przez %pi"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "Bajty/s"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "Bajtów (%ds)"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "%H: Netlink - Pakiety na %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "Pakiety/s"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "Przetworzone (%ds)"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "Odrzucone (%ds)"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "Błędy (%ds)"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "%H: Netlink - Multicasty na %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "Pakiety/s"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "Pakiety"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "%H: Netlink - Kolizje na %pi"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "Kolizje/s"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "Kolizje"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "%H: Netlink - Błędy na %pi"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "Błędy/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "%di"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "%di"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "%H: Procesy"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "Procesy/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "%di"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "%H: Proces %pi - użyty czas Procesora"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "Jiffies"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "system"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "użytkownik"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "%H: Proces %pi - wÄ…tki i procesy"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "Liczba"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "%ds"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "%H: Proces %pi - błędy stronnicowania"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "Błędy stronnicowania"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "błędy stronnicowania"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "%H: Proces %pi - rozmiar pamięci wirtualnej"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "Bajtów"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "pamięć wirtualna"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "%H: Użycie Procesora #%pi"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "%"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "%di"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "%H: Transfer na %di"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "Bajtów/s"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "%H: Pakietów na %di"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "Pakietów/s"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "%H: TCP-połączeń na port %pi"
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "Połączeń/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "%di"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "%H: Użycie przestrzeni dyskowej na %di"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "Bajtów"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "%ds"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "%ds"
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "%H: Przerwania"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "Problem(y)"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "IRQ %di"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "%H: Obciążenie Systemu"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "Obciążenie"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "1 min"
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "5 min"
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "15 min"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/pl/statistics.po b/feeds/luci/applications/luci-app-statistics/po/pl/statistics.po
+new file mode 100644
+index 0000000..d352bed
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/pl/statistics.po
+@@ -0,0 +1,790 @@
++# statistics.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-02 19:52+0200\n"
++"Last-Translator: obsy <cezary@eko.one.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Action (target)"
++msgstr "Akcja (cel)"
++
++msgid "Add command for reading values"
++msgstr "Dodaj polecenie do odczytywania wartości"
++
++msgid "Add matching rule"
++msgstr "Dodaj pasującą regułę"
++
++msgid "Add multiple hosts separated by space."
++msgstr "Dodaj wiele hostów rozdzielonych spacjami."
++
++msgid "Add notification command"
++msgstr "Dodaj komendÄ™ powiadamiajÄ…cÄ…"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Główny katalog"
++
++msgid "Basic monitoring"
++msgstr "Podstawowy monitoring"
++
++msgid "CPU Plugin Configuration"
++msgstr "Konfiguracja CPU"
++
++msgid "CSV Output"
++msgstr "Wyjście CSV"
++
++msgid "CSV Plugin Configuration"
++msgstr "Konfiguracja CSV"
++
++msgid "Cache collected data for"
++msgstr "Ciasteczka zbierane dla"
++
++msgid "Cache flush interval"
++msgstr "Odstępy czyszczenia cache"
++
++msgid "Chain"
++msgstr "ÅaÅ„cuch"
++
++msgid "CollectLinks"
++msgstr "CollectLinks"
++
++msgid "CollectRoutes"
++msgstr "CollectRoutes"
++
++msgid "CollectTopology"
++msgstr "CollectTopology"
++
++msgid "Collectd Settings"
++msgstr "Ustawienia Collectd"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd to mały deomon do zbieranie danych z różnych źródeł za pomocą "
++"różnych wtyczek. Na tej stronie można zmienić ogólne ustawienia demona "
++"collectd."
++
++msgid "Conntrack"
++msgstr "Conntrack"
++
++msgid "Conntrack Plugin Configuration"
++msgstr "Konfiguracja wtyczki Conntrack"
++
++msgid "DF Plugin Configuration"
++msgstr "Konfiguracja wtyczki DF"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "Konfiguracja wtyczki DNS"
++
++msgid "Data collection interval"
++msgstr "Odstępy zbierania danych"
++
++msgid "Datasets definition file"
++msgstr "Zdefiniowany plik ustawień"
++
++msgid "Destination ip range"
++msgstr "Zakres docelowych adresów IP"
++
++msgid "Directory for collectd plugins"
++msgstr "Katalog wtyczek collectd"
++
++msgid "Directory for sub-configurations"
++msgstr "Katalog podkonfiguracji"
++
++msgid "Disk Plugin Configuration"
++msgstr "Konfiguracja wtyczki dysk"
++
++msgid "Disk Space Usage"
++msgstr "Zużycie przestrzeni dyskowej"
++
++msgid "Disk Usage"
++msgstr "Użycie dysku"
++
++msgid "Display Host »"
++msgstr "Wyświetl Host >"
++
++msgid "Display timespan »"
++msgstr "Przedział czasu wyświetlania »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "Konfiguracja wtyczki E-mail"
++
++msgid "Email"
++msgstr "E-mail"
++
++msgid "Enable this plugin"
++msgstr "WÅ‚Ä…cz tÄ™ wtyczkÄ™"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Konfiguracja wtyczki Exec"
++
++msgid "Filter class monitoring"
++msgstr "Monitorowanie filtra klas"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Flush cache after"
++msgstr "Opróżnić cache po"
++
++msgid "Forwarding between listen and server addresses"
++msgstr "Przekazać przez słuchacza na adres serwera"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Wykresy"
++
++msgid "Group"
++msgstr "Grupa"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Tutaj można zdefiniować zewnętrzne komendy, które będą włączane przez "
++"collectd, by odczytać konkretne wartości. Będą one odczytywane z stdout."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Tutaj można zdefiniować zewnętrzne komendy, które będą włączane przez "
++"collectd, kiedy zostaną osiągnięte konkretne wartości progowe. Wartości "
++"powodujące włączenie będą wysyłane do programów przez stdin."
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"Tutaj można zdefiniować różne kryteria według których wybierane są "
++"monitorowane reguły iptables."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr "Host"
++
++msgid "Hostname"
++msgstr "Nazwa hosta"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr "Numer IP lub nazwa hosta jako wyjście txtinfo"
++
++msgid "IRQ Plugin Configuration"
++msgstr "Konfiguracja wtyczki IRQ"
++
++msgid "Ignore source addresses"
++msgstr "Ignoruj adresy źródłowe"
++
++msgid "Incoming interface"
++msgstr "Interfejs przychodzÄ…cy"
++
++msgid "Interface Plugin Configuration"
++msgstr "Konfiguracja wtyczki Interfejs"
++
++msgid "Interfaces"
++msgstr "Interfejsy"
++
++msgid "Interrupts"
++msgstr "Przerwania"
++
++msgid "Interval for pings"
++msgstr "Odstępy dla pingów"
++
++msgid "Iptables Plugin Configuration"
++msgstr "Konfiguracja wtyczki iptables"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++"Pozostaw niezaznaczone do automatycznego określenia interfejsu do "
++"monitorowania."
++
++msgid "Listen host"
++msgstr "Nasłuchuj host"
++
++msgid "Listen port"
++msgstr "Nasłuchuj port"
++
++msgid "Listener interfaces"
++msgstr "Interfejsy nasłuchującego"
++
++msgid "Load Plugin Configuration"
++msgstr "Konfiguracja wtyczki Obciążenie"
++
++msgid "Maximum allowed connections"
++msgstr "Maksymalna ilość połączeń"
++
++msgid "Memory"
++msgstr "Pamięć"
++
++msgid "Memory Plugin Configuration"
++msgstr "Konfiguracja wtyczki Pamięć"
++
++msgid "Monitor all except specified"
++msgstr "Monitoruj wszystko oprócz podanych"
++
++msgid "Monitor all local listen ports"
++msgstr "Monitoruj wszystkie lokalne otwarte porty"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Monitoruj urzÄ…dzenia"
++
++msgid "Monitor disks and partitions"
++msgstr "Monitoruj dyski i partycje"
++
++msgid "Monitor filesystem types"
++msgstr "Monitoruj system plików"
++
++msgid "Monitor hosts"
++msgstr "Monitoruj hosty"
++
++msgid "Monitor interfaces"
++msgstr "Monitoruj interfejsy"
++
++msgid "Monitor interrupts"
++msgstr "Monitoruj przerwania"
++
++msgid "Monitor local ports"
++msgstr "Monitoruj porty lokalne"
++
++msgid "Monitor mount points"
++msgstr "Monitoruj punkty zamontowania"
++
++msgid "Monitor processes"
++msgstr "Monitoruj procesy"
++
++msgid "Monitor remote ports"
++msgstr "Monitoruj porty zdalne"
++
++msgid "Name of the rule"
++msgstr "Nazwa tej reguły"
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Konfiguracja wtyczki Netlink"
++
++msgid "Network"
++msgstr "Sieć"
++
++msgid "Network Plugin Configuration"
++msgstr "Konfiguracja wtyczki Sieć"
++
++msgid "Network plugins"
++msgstr "Wtyczki sieciowe"
++
++msgid "Network protocol"
++msgstr "Protokoły sieciowe"
++
++msgid "Number of threads for data collection"
++msgstr "Liczba wątków do zbierania danych"
++
++msgid "OLSRd"
++msgstr "OLSRd"
++
++msgid "OLSRd Plugin Configuration"
++msgstr "Konfiguracja wtyczki OLSRd"
++
++msgid "Only create average RRAs"
++msgstr "Twórz tylko średnie archiwa RRA"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Opcje"
++
++msgid "Outgoing interface"
++msgstr "Interfejs wychodzÄ…cy"
++
++msgid "Output plugins"
++msgstr "Pluginy wyjścia"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Konfiguracja wtyczki Ping"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Processes"
++msgstr "Procesy"
++
++msgid "Processes Plugin Configuration"
++msgstr "Konfiguracja wtyczki Procesy"
++
++msgid "Processes to monitor separated by space"
++msgstr "Monitorowane procesy oddzielone spacjÄ…"
++
++msgid "Processor"
++msgstr "Procesor"
++
++msgid "Qdisc monitoring"
++msgstr "Monitorowanie Qdisc"
++
++msgid "RRD XFiles Factor"
++msgstr "RRD XFiles Factor"
++
++msgid "RRD heart beat interval"
++msgstr "RRD heart beat interval"
++
++msgid "RRD step interval"
++msgstr "RRD Krok interval"
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "Konfiguracja wtyczki RRDTool"
++
++msgid "Rows per RRA"
++msgstr "Wierszy w archiwum RRA"
++
++msgid "Script"
++msgstr "Skrypt"
++
++msgid "Seconds"
++msgstr "Sekundy"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "Host serwer"
++
++msgid "Server port"
++msgstr "Port serwera"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "Shaping Klasa Monitoring"
++
++msgid "Socket file"
++msgstr "Plik Gniazdo"
++
++msgid "Socket group"
++msgstr "Gniazdo Grupy"
++
++msgid "Socket permissions"
++msgstr "Uprawnienia Gniazda"
++
++msgid "Source ip range"
++msgstr "Zakres źródłowych adresów ip"
++
++msgid "Specifies what information to collect about links."
++msgstr "Określa jakie informacje zbierać o linkach."
++
++msgid "Specifies what information to collect about routes."
++msgstr "Określa jakie informacje zbierać o trasach."
++
++msgid "Specifies what information to collect about the global topology."
++msgstr "Określa jakie informacje zbierać o globalnej topologii."
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr "Statystyki"
++
++msgid "Storage directory"
++msgstr "Katalog przechowywania"
++
++msgid "Storage directory for the csv files"
++msgstr "Katalog przechowywania plików csv"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++"Przechowuj wartości danych jako wskaźniki zamiast wartości bezwzględnych"
++
++msgid "Stored timespans"
++msgstr "Przechowywane okresy czasu"
++
++msgid "System Load"
++msgstr "Obciążenie systemu"
++
++msgid "TCP Connections"
++msgstr "Połączenia TCP"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "Konfiguracja wtyczki Połączenia TCP"
++
++msgid "TTL for network packets"
++msgstr "TTL dla pakietów sieciowych"
++
++msgid "TTL for ping packets"
++msgstr "TTL dla pakietów ping"
++
++msgid "Table"
++msgstr "Tabela"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr "Wtyczka Nut Informuje o Nie przerywalnym Zasilaniu"
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++"Wtyczka OLSRd odczytuje informacje o sieciach mesh z wtyczki txtinfo dla "
++"OLSRd."
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr "Wtyczka Conntrack zbiera statystyki o liczbie śledzonych połączeń."
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr "Wtyczka CPU zbiera podstawowe statystyki o użyciu procesora"
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"Wtyczka CSV gromadzi zebrane dane w formacie plików csv do dalszej obróbki "
++"przez zewnętrzne programy."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"Wtyczka \"df\" zbiera statystyki dotyczące wykorzystania miejsca na różnych "
++"urządzenia, dyskach i systemach plików."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"Wtyczka \"disk\" zbiera szczegółowe informacje z poszczególnych partycji lub "
++"całych dysków."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"Wtyczka \"dns\" zbiera statystyki odnośnie ruchu DNS dla wybranych "
++"interfejsów."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"Wtyczka Email Tworzy gniazdo w unix do transmisji statystyki-poczty do "
++"demona collectd. This plugin is primarily intended to be used in conjunction "
++"with Mail::SpamAssasin::Plugin::Collectd but can be used in other ways as "
++"well."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"Wtyczka Exec startuje zewnętzną komendę do czytnika values z lub do procesu "
++"zewnętrznego powiadomienia gdy wartość została zmieniona"
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr "Wtyczka \"interface\" zbiera statystyki z wybranych interfejsów."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"Wtyczka \"iptables\" monitoruje wybrane reguły firewalla i zbiera statystyki "
++"o procesach, bajtach i pakietach przypadających na daną regułę."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"Wtyczka \"irq\" monitoruje liczbę przerwań na sekundę dla każdego wybranego "
++"przerwania. Jeśli nie wybrano żadnego przerwania, monitoruje wszystkie."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++"Wtyczka \"iwinfo\" zbiera statystyki o sygnale, zakłóceniach i jakości sieci "
++"WiFi."
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr "Wtyczka \"load\" zbiera statystyki o ogólnych obciążeniu systemu."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr "Wtyczka \"memory\" zbiera statystyki dotyczące wykorzystania pamięci."
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"Wtyczki netlink zbiera rozszerzone informacje statystyk z qdisc-, klasa- i "
++"filter- dla wybranych interfejsów."
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"Wtyczka zapewnia podstawową komunikacje między różnymi instancjami collectd. "
++"Collectd może pracować zarówno w trybie klienta i serwera. W trybie klienta "
++"lokalnie zebrane dane przenosi siÄ™ do instancji serwera collectd, w trybie "
++"serwera lokalnego instancja odbiera dane z innych komputerów."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"Wtyczka \"ping\" wysyła komunikaty icmp i nasłuchuje odpowiedzi z wybranych "
++"hostów oraz mierzy czasy odpowiedzi zwrotnych dla każdego z nich."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"Wtyczki processes zbiera informacje o czasie procesora, błędach strony i "
++"pamięci wybranych procesów."
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"Wtyczki rrdtool przechowuje zebrane dane w plikach RRD, które są "
++"wykorzystywane do tworzenia diagramów. <br /> <br /> <strong> Ostrzeżenie:. "
++"Ustawianie błędnej wartości może spowodować bardzo wysokie zużycie pamięci w "
++"katalogu tymczasowym. Może to sprawić, że urządzenie nie będzie nadawało się "
++"do użytku! </strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"Wtyczka \"tcpconns\" zbiera informacje o otwartych połączeniach tcp dla "
++"wybranych portów."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"Wtyczka unixsock tworzy socket unix, który może być używany do odczytu "
++"danych zebranych z bieżącej instancji collectd."
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"Sekcja ta definiuje interfejsy na którym collectd będzie czekać na "
++"połączenia przychodzące."
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr "Ta sekcja określa do jakich serwerów zebrane dane zostaną wysłane."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "Spróbuj znaleźć pełną nazwę hosta"
++
++msgid "UPS"
++msgstr "UPS"
++
++msgid "UPS Plugin Configuration"
++msgstr "Plugin Konfiguracji UPS"
++
++msgid "UPS name in NUT ups@host format"
++msgstr "Format nazwa UPS w NUT ups@host"
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Konfiguracja wtyczki UnixSock"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Używany plik PID"
++
++msgid "User"
++msgstr "Użytkownik"
++
++msgid "Verbose monitoring"
++msgstr "Pełny monitoring"
++
++msgid "Wireless"
++msgstr "WiFi"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr "Konfiguracja bezprzewodowego pluginu iwinfo"
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "np. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "np. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "np. reject-with tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "max. 16 znaków"
++
++msgid "reduces rrd size"
++msgstr "zmniejsza rozmiar RRD"
++
++msgid "seconds; multiple separated by space"
++msgstr "sekundy; wielokrotnie oddzielone spacjÄ…"
++
++msgid "server interfaces"
++msgstr "interfejsy serwera"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "Wtyczki systemowe"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "Statystyki bazuja na <a href=\"http://collectd.org/index.shtml"
++#~ "\">Collectd</a> oraz wykorzystujÄ… <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> do generowania diagramów i wykresów z zebranych danych."
++
++#~ msgid "Installed network plugins:"
++#~ msgstr "Zainstalowane wtyczki sieciowe:"
++
++#~ msgid "Installed output plugins:"
++#~ msgstr "Zainstalowane wtyczki wyjścia:"
++
++#~ msgid ""
++#~ "Network plugins are used to collect information about open tcp "
++#~ "connections, interface traffic, iptables rules etc."
++#~ msgstr ""
++#~ "Wtyczki sieciowe służą do zbierania informacji o otwartych połączeniach "
++#~ "TCP, ruchu sieciowym na danym interfejsie, regułach iptables itp."
++
++#~ msgid ""
++#~ "Output plugins provide different possibilities to store collected data. "
++#~ "It is possible to enable multiple plugin at one, for example to store "
++#~ "collected data in rrd databases and to transmit the data over the network "
++#~ "to other collectd instances."
++#~ msgstr ""
++#~ "Pluginy wyjścia dostarczają różnych możliwości przechowywania "
++#~ "zgromadzonych danych. Można włączyć wiele pluginów naraz, na przykład "
++#~ "przechowywać dane w bazach danych RRD i wysyłać je do innych instancji "
++#~ "collectd w sieci."
++
++#~ msgid ""
++#~ "System plugins collecting values about system state and ressource usage "
++#~ "on the device.:"
++#~ msgstr ""
++#~ "Wtyczki systemowe zbierają wartości o stanie systemu i użyciu zasobów "
++#~ "urzÄ…dzenia.:"
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "Wtyczka \"wireless\" zbiera dane o sile sygnału, zakłóceniach i jakości "
++#~ "WiFi."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "konfiguracja wtyczki WiFi"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/pt-br/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/pt-br/rrdtool.po
+new file mode 100644
+index 0000000..510b4a8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/pt-br/rrdtool.po
+@@ -0,0 +1,359 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2011-10-11 21:17+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "%H: Wireless - Relação Sinal/Ruido"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "dBm"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Nivel de Ruído"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "Força do Sinal"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: Wireless - Qualidade do Sinal"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "n"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "Qualidade do Sinal"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "%H: Tempo de resposta ICMP"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "ms"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "%di"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "%H: Firewall - Pacotes Processados"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "Pacote/s"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "Cadeia \"%di\""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "%H: Netlink - Transferência na %pi"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "Bytes/s"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "Bytes (%ds)"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "%H: Netlink - Pacotes na %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "Packets/s"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "Processado (%ds)"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "Descartados (%ds)"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "Erros (%ds)"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "%H: Netlink - Multicast na %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "Pacote/s"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "Pacotes"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "%H: Netlink - Colisões na %pi"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "Colisão(es)"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "Colisões"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "%H: Netlink - Erros na %pi"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "Erro/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "%di"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "%di"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "%H: Processos"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "Processo/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "%di"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "%H: Processo %pi - tempo usado da cpu"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "Jiffies"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "sistema"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "usuário"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "%H: Processo %pi - threads e processos"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "Contagem"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "%ds"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "%H: Processo %pi - pagina de erros"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "Pagina de erros"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "pagina de erros"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "%H: Processo %pi - tamanho da memória virtual"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "Bytes"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "memória virtual"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "%H: Usado no Processado #%pi"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "%"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "%di"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "%H: Transferência na %di"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "Bytes/s"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "%H: Pacotes na %di"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "Pacote/s"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "%H: Ligações TCP na Porta %pi"
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "Ligação(ões)"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "%di"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "%H: Utilização de Espaço em Disco em %di"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "Bytes"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "%ds"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "%ds"
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "%H: Interrupções"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "Erro/s"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "IRQ %di"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "%H: Carga do Sistema"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "Carga"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "1 min"
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "5 min"
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "15 min"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/pt-br/statistics.po b/feeds/luci/applications/luci-app-statistics/po/pt-br/statistics.po
+new file mode 100644
+index 0000000..9abba49
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/pt-br/statistics.po
+@@ -0,0 +1,798 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2014-03-15 22:12+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Action (target)"
++msgstr "Ação (destino)"
++
++msgid "Add command for reading values"
++msgstr "Adicionar comando para leitura de valores"
++
++msgid "Add matching rule"
++msgstr "Adicionar regra"
++
++msgid "Add multiple hosts separated by space."
++msgstr "Adicione múltiplos equipamentos separados por espaço."
++
++msgid "Add notification command"
++msgstr "Adicionar o comando de notificação"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Diretório Base"
++
++msgid "Basic monitoring"
++msgstr "Monitoramento básico"
++
++msgid "CPU Plugin Configuration"
++msgstr "Configuração do plugin CPU"
++
++msgid "CSV Output"
++msgstr "Saida CSV"
++
++msgid "CSV Plugin Configuration"
++msgstr "Configuração do plugin CSV"
++
++msgid "Cache collected data for"
++msgstr "Cache dos dados coletados"
++
++msgid "Cache flush interval"
++msgstr "Intervalo de limpeza do cache"
++
++msgid "Chain"
++msgstr "Cadeia"
++
++msgid "CollectLinks"
++msgstr "Coleção de Links"
++
++msgid "CollectRoutes"
++msgstr "Coleção de Rotas"
++
++msgid "CollectTopology"
++msgstr "Coleção de Topologias"
++
++msgid "Collectd Settings"
++msgstr "Configurações do Coletadas"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd é um pequeno daemon que coleta dados de várias fontes através de "
++"diferentes plugins. Nesta página você pode alterar as configurações gerais "
++"do daemon collectd."
++
++msgid "Conntrack"
++msgstr "Conntrack"
++
++msgid "Conntrack Plugin Configuration"
++msgstr "Configuração do Plugin do Conntrack"
++
++msgid "DF Plugin Configuration"
++msgstr "Configuração do plugin DF"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "Configuração do plugin DNS"
++
++msgid "Data collection interval"
++msgstr "Intervalo da coleta de dados"
++
++msgid "Datasets definition file"
++msgstr "Arquivo com a definição de dados"
++
++msgid "Destination ip range"
++msgstr "Faixa IP de destino"
++
++msgid "Directory for collectd plugins"
++msgstr "Diretório para os plugins do collectd"
++
++msgid "Directory for sub-configurations"
++msgstr "Diretório para sub-configurações"
++
++msgid "Disk Plugin Configuration"
++msgstr "Configuração do plugin Disco"
++
++msgid "Disk Space Usage"
++msgstr "Utilização de espaço em disco"
++
++msgid "Disk Usage"
++msgstr "Utilização do Disco"
++
++msgid "Display Host »"
++msgstr "Mostrar Host"
++
++msgid "Display timespan »"
++msgstr "Mostrar intervalo »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "Configuração do plugin E-Mail"
++
++msgid "Email"
++msgstr "Email"
++
++msgid "Enable this plugin"
++msgstr "Habilitar este plugin"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Configuração do plugin Exec"
++
++msgid "Filter class monitoring"
++msgstr "Monitoramento das Classes de Filtros"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Flush cache after"
++msgstr "Limpar cache após"
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++"Encaminhamento entre o endereço de escuta e os endereços dos servidores"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Gráficos"
++
++msgid "Group"
++msgstr "Grupo"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Aqui você pode definir comandos externos que serão iniciados pelo collectd a "
++"fim de ler determinados valores. Os valores serão lidos a partir do stdout."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Aqui você pode definir os comandos externos que serão iniciados pelo "
++"collectd quando determinados valores limite forem atingidos. Os valores "
++"passados ao comando serão enviados para o stdin."
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"Aqui você pode definir diversos critérios para as regras iptables "
++"selecionadas serem monitoradas."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr "Equipamento"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr "Endereço IP ou nome do equipamento de onde obter a saída do txtinfo"
++
++msgid "IRQ Plugin Configuration"
++msgstr "Configuração do plugin IRQ"
++
++msgid "Ignore source addresses"
++msgstr "Ignorar endereços de origem"
++
++msgid "Incoming interface"
++msgstr "Interface de entrada"
++
++msgid "Interface Plugin Configuration"
++msgstr "Configuração do plugin Interface"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interrupts"
++msgstr "Interrupções"
++
++msgid "Interval for pings"
++msgstr "Intervalo para pings"
++
++msgid "Iptables Plugin Configuration"
++msgstr "Configuração do plugin Iptables"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++"Deixe não selecionado para determinar automaticamente a interface a ser "
++"monitorada"
++
++msgid "Listen host"
++msgstr "Endereço de escuta do Host"
++
++msgid "Listen port"
++msgstr "Porta de escuta"
++
++msgid "Listener interfaces"
++msgstr "Escutar na(s) interface(s)"
++
++msgid "Load Plugin Configuration"
++msgstr "Configuração do plugin carga"
++
++msgid "Maximum allowed connections"
++msgstr "Máximo de conexões permitidas"
++
++msgid "Memory"
++msgstr "Memória"
++
++msgid "Memory Plugin Configuration"
++msgstr "Configuração do Plugin da Memória"
++
++msgid "Monitor all except specified"
++msgstr "Monitore tudo exceto se especificado"
++
++msgid "Monitor all local listen ports"
++msgstr "Monitorar todas as portas locais"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Monitorar dispositivos"
++
++msgid "Monitor disks and partitions"
++msgstr "Monitoras discos e partições"
++
++msgid "Monitor filesystem types"
++msgstr "Monitorar tipos de sistemas de arquivos"
++
++msgid "Monitor hosts"
++msgstr "Monitorar os equipamentos"
++
++msgid "Monitor interfaces"
++msgstr "Monitorar interfaces"
++
++msgid "Monitor interrupts"
++msgstr "Monitorar interrupções"
++
++msgid "Monitor local ports"
++msgstr "Monitorar as portas locais"
++
++msgid "Monitor mount points"
++msgstr "Monitorar pontos de montagem"
++
++msgid "Monitor processes"
++msgstr "Monitorar processos"
++
++msgid "Monitor remote ports"
++msgstr "Monitorar portas remotas"
++
++msgid "Name of the rule"
++msgstr "Nome da regra"
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Configuração do plugin Netlink"
++
++msgid "Network"
++msgstr "Rede"
++
++msgid "Network Plugin Configuration"
++msgstr "Configuração do plugin Rede"
++
++msgid "Network plugins"
++msgstr "Plugins de rede"
++
++msgid "Network protocol"
++msgstr "Protocolo de rede"
++
++msgid "Number of threads for data collection"
++msgstr "Número de threads para o coletor de dados"
++
++msgid "OLSRd"
++msgstr "OLSRd"
++
++msgid "OLSRd Plugin Configuration"
++msgstr "Configuração do Plugin OLSRd"
++
++msgid "Only create average RRAs"
++msgstr "Somente criar RRAs de média"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Opções"
++
++msgid "Outgoing interface"
++msgstr "Interface de saída"
++
++msgid "Output plugins"
++msgstr "Plugins de saída"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Configuração do plugin Ping"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Processes"
++msgstr "Processos"
++
++msgid "Processes Plugin Configuration"
++msgstr "Configuração do plugin Processos"
++
++msgid "Processes to monitor separated by space"
++msgstr "Processos para monitorar, separado por espaços"
++
++msgid "Processor"
++msgstr "Processador"
++
++msgid "Qdisc monitoring"
++msgstr "Monitoramento do Qdisc"
++
++msgid "RRD XFiles Factor"
++msgstr "Fator RRD XFiles"
++
++msgid "RRD heart beat interval"
++msgstr "Intervalo entre duas atualizações"
++
++msgid "RRD step interval"
++msgstr "Intervalo de atualização"
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "Configuração do plugin RRDTool"
++
++msgid "Rows per RRA"
++msgstr "Linhas por RRA"
++
++msgid "Script"
++msgstr "Script"
++
++msgid "Seconds"
++msgstr "Segundos"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "Endereço do servidor"
++
++msgid "Server port"
++msgstr "Porta do servidor"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "Monitoramento das Classes de Shaping"
++
++msgid "Socket file"
++msgstr "Arquivo do socket"
++
++msgid "Socket group"
++msgstr "Grupo do socket"
++
++msgid "Socket permissions"
++msgstr "Permissões do socket"
++
++msgid "Source ip range"
++msgstr "Faixa de IP de origem"
++
++msgid "Specifies what information to collect about links."
++msgstr "Especifica quais informações serão coletadas sobre os enlaces."
++
++msgid "Specifies what information to collect about routes."
++msgstr "Especifica quais informações serão coletadas sobre as rotas."
++
++msgid "Specifies what information to collect about the global topology."
++msgstr "Especifica quais informações serão coletadas sobre a topologia global."
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr "Estatística"
++
++msgid "Storage directory"
++msgstr "Diretório de armazenamento"
++
++msgid "Storage directory for the csv files"
++msgstr "Diretório para armazenamento dos arquivos csv"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "Armazenar os valores dos dados como taxas em vez de valores absolutos"
++
++msgid "Stored timespans"
++msgstr "Intervalos armazenados"
++
++msgid "System Load"
++msgstr "Carga do Sistema"
++
++msgid "TCP Connections"
++msgstr "Conexões TCP"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "Configuração do plugin TCPConns"
++
++msgid "TTL for network packets"
++msgstr "TTL para os pacotes de rede"
++
++msgid "TTL for ping packets"
++msgstr "TTL para os pacotes do ping"
++
++msgid "Table"
++msgstr "Tabela"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr "O plugin NUT lê informações sobre Fontes de alimentação ininterruptas."
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++"O plugin OLSRd lê informações sobre redes em malha (mesh) a partir do plugin "
++"txtinfo do OLSRd."
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++"O plugin do conntrack coleta estatísticas sobre o número de conexões "
++"rastreadas."
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++"O plugin cpu coleta as estatísticas básicas sobre o uso do processador."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"O plugin csv armazena os dados coletados em um arquivo no formato csv para "
++"um futuro processamento por outros programas."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"O plugin df coleta estatísticas sobre a utilização de espaço em disco em "
++"diferentes dispositivos, pontos de montagem ou tipos de sistemas de arquivos."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"O plugin disco coleta estatísticas de uso detalhadas das partições "
++"selecionadas ou discos inteiros."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"O plugin dns coleta estatísticas detalhadas sobre o tráfego do dns nas "
++"interfaces selecionadas."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"O plugin de email cria um socket unix que pode ser usado para transmitir "
++"estatísticas de email para o collectd. Este plugin é essencialmente "
++"destinado a ser utilizado em conjunto com o plugin Mail::SpamAssasin::"
++"Plugin::Collectd mas pode ser utilizado de outras maneiras também."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"O plugin exec inicia comandos externos para leitura de valores ou notificar "
++"processos externos quando um determinado valor limite for atingido."
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++"O plugin interface plugin coleta estatísticas sobre o tráfego das interfaces "
++"selecionadas."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"O plugin iptables irá monitorar as regras de firewall selecionadas e coletar "
++"informações sobre pacotes e bytes processados pela regra."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"O plugin irq irá monitorar a taxa de ocorrências por segundo de cada "
++"interrupção selecionada. Se nenhuma interrupção for selecionada então todas "
++"as interrupções serão monitoradas."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++"O plugin iwinfo coleta estatísticas sobre a força, ruído e qualidade do "
++"sinal da rede sem fio."
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr "O plugin de carga coleta estatísticas gerais sobre a carga do sistema."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr "O plugin de memória coleta estatísticas sobre o uso da memória."
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"O plugin Netlink coleta informações detalhadas como qdisc-, classe- e "
++"estatísticas de filtro das interfaces selecionadas."
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"O plugin rede fornece informações de rede baseadas na comunicação entre as "
++"diferentes instâncias do collectd. O Collectd pode operar tanto no modo "
++"cliente quanto no modo servidor. No modo cliente os dados coletados "
++"localmente são transferidos para um servidor collectd. No modo de servidor, "
++"o servidor local recebe os dados de outros servidores."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"O plugin ping irá enviar pacotes ICMP to tipo echo aos equipamentos "
++"selecionados e medir o tempo de resposta para cada equipamento."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"O plugin de processos coleta informações como o tempo da cpu, falha de "
++"página e uso de memória dos processos selecionados."
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"O plugin rrdtool armazena os dados coletados no arquivo de banco de dados "
++"rrd.<br /><br /><strong>Aviso: A má configuração desses valores, resultará "
++"em um valor muito elevado no consumo de memória no diretório temporário. "
++"Isso pode tornar o equipamento inutilizável!</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"O plugin tcpconns coleta informações sobre as conexões TCP abertas das "
++"portas selecionadas."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"O plugin unixsock cria um socket unix, que pode ser usado para ler os dados "
++"coletados a partir de uma collectd em execução."
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"Esta seção define em quais interfaces o collectd irá aguardar para receber "
++"conexões."
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++"Esta seção define para qual servidor os dados coletados localmente serão "
++"enviados."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "Tentar encontrar o nome completo do equipamento (FQDN)"
++
++msgid "UPS"
++msgstr "UPS (no-breaks)"
++
++msgid "UPS Plugin Configuration"
++msgstr "Plugin de configuração UPS"
++
++msgid "UPS name in NUT ups@host format"
++msgstr "Nome do UPS no NUT em formato ups@equipamento"
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Configuração do plugin Unixsock"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Arquivo PID usado"
++
++msgid "User"
++msgstr "usuário"
++
++msgid "Verbose monitoring"
++msgstr "Monitoramento no modo detalhado"
++
++msgid "Wireless"
++msgstr "Rede Sem Fio (Wireless)"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr "Configuração do Plugin iwinfo da Rede Sem Fio (Wireless)"
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "ex: br-ff"
++
++msgid "e.g. br-lan"
++msgstr "ex: br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "ex: rejeitar-com tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "máx. 16 caracteres"
++
++msgid "reduces rrd size"
++msgstr "reduzir o tamanho do rrd"
++
++msgid "seconds; multiple separated by space"
++msgstr "segundos; vários valores, separar com espaço"
++
++msgid "server interfaces"
++msgstr "interfaces do servidor"
++
++#~ msgid "Collectd"
++#~ msgstr "Coletar"
++
++#~ msgid "System plugins"
++#~ msgstr "Plugins de sistema"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "As estatísticas são baseadas no <a href=\"http://collectd.org/index.shtml"
++#~ "\">Collectd</a> e é utilizado o <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> para renderização das imagens a partir dos dados "
++#~ "coletados."
++
++#~ msgid "Installed network plugins:"
++#~ msgstr "Plugins de rede instalados:"
++
++#~ msgid "Installed output plugins:"
++#~ msgstr "Plugins de saída instalados:"
++
++#~ msgid ""
++#~ "Network plugins are used to collect information about open tcp "
++#~ "connections, interface traffic, iptables rules etc."
++#~ msgstr ""
++#~ "Os plugins de rede são utilizados para coletar informações sobre conexões "
++#~ "tcp abertas, tráfego da interface, regras do iptables, etc."
++
++#~ msgid ""
++#~ "Output plugins provide different possibilities to store collected data. "
++#~ "It is possible to enable multiple plugin at one, for example to store "
++#~ "collected data in rrd databases and to transmit the data over the network "
++#~ "to other collectd instances."
++#~ msgstr ""
++#~ "Os plugins de saída proveem diferentes possibilidades para armazenar os "
++#~ "dados coletados. É possível habilitar diversos plugin para, por exemplo, "
++#~ "coletar dados em bancos de dados rrd e transmitir os dados através da "
++#~ "rede para outro serviço collectd."
++
++#~ msgid ""
++#~ "System plugins collecting values about system state and ressource usage "
++#~ "on the device.:"
++#~ msgstr ""
++#~ "Plugins do sistema coletando valores sobre o estado do sistema e uso dos "
++#~ "recursos neste dispositivo.:"
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "O plugin wireless coleta estatísticas sobre o nível de sinal wireless, o "
++#~ "ruído e qualidade."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "Configuração do Plugin da Rede Sem Fio (Wireless)"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/pt/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/pt/rrdtool.po
+new file mode 100644
+index 0000000..6abbaf7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/pt/rrdtool.po
+@@ -0,0 +1,359 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-06-02 21:10+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "%H: Wireless - Relação Sinal/Ruido"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "dBm"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Nivel de Ruido"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "Forca do Sinal"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: Wireless - Qualidade do Sinal"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "n"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "Qualidade do Sinal"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "%H: Tempo de resposta ICMP"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "ms"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "%di"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "%H: Firewall - Pacotes Processados"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "Pacote/s"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "Cadeia \"%di\""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "%H: Netlink - Transferencia na %pi"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "Bytes/s"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "Bytes (%ds)"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "%H: Netlink - Pacotes na %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "Packets/s"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "Processado (%ds)"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "Dropado (%ds)"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "Erros (%ds)"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "%H: Netlink - Multicast na %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "Pacote/s"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "Pacotes"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "%H: Netlink - Colisoes na %pi"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "Colisao(es)"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "Colisoes"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "%H: Netlink - Erros na %pi"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "Erro/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "%di"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "%di"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "%H: Processos"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "Processo/s"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "%di"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "%H: Processo %pi - tempo usado da cpu"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "Jiffies"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "sistema"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "utilizador"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "%H: Processo %pi - threads e processos"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "Contagem"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "%ds"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "%H: Prcesso %pi - pagina de erros"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "Pagina de erros"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "pagina de erros"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "%H: Processo %pi - tamanho da memoria virtual"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "Bytes"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "memoria virtual"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "%H: Usado no Processado #%pi"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "%"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "%di"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "%H: Transferencia na %di"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "Bytes/s"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "%H: Pacotes na %di"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "Pacote/s"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "%H: Ligações TCP na Porta %pi"
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "Ligação(ões)"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "%di"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "%H: Utilizacao de Espaco em Disco em %di"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "Bytes"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "%ds"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "%ds"
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "%H: Interrupcoes"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "Erro/s"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "IRQ %di"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "%H: Carga do Sistema"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "Carga"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "1 min"
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "5 min"
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "15 min"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/pt/statistics.po b/feeds/luci/applications/luci-app-statistics/po/pt/statistics.po
+new file mode 100644
+index 0000000..34b435c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/pt/statistics.po
+@@ -0,0 +1,760 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-06-01 00:10+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Action (target)"
++msgstr "Ação (destino)"
++
++msgid "Add command for reading values"
++msgstr "Adicionar comando para leitura de valores"
++
++msgid "Add matching rule"
++msgstr "Adicionar regra"
++
++msgid "Add multiple hosts separated by space."
++msgstr "Adicionar hosts múltiplos separados por espaço."
++
++msgid "Add notification command"
++msgstr "Adicionar o comando de notificação"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Diretório Base"
++
++msgid "Basic monitoring"
++msgstr "Monitoramento básico"
++
++msgid "CPU Plugin Configuration"
++msgstr "Configuração do plugin CPU"
++
++msgid "CSV Output"
++msgstr "Formato CSV"
++
++msgid "CSV Plugin Configuration"
++msgstr "Configuração do plugin CSV"
++
++msgid "Cache collected data for"
++msgstr "Cache dos dados coletados"
++
++msgid "Cache flush interval"
++msgstr "Intervalo de limpeza do cache"
++
++msgid "Chain"
++msgstr "Cadeia"
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr "Configurações do Collectd"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd é um pequeno daemon que coleta dados de várias fontes através de "
++"diferentes plugins. Nesta página você pode alterar as configurações gerais "
++"do daemon collectd."
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr "Configuração do plugin DF"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "Configuração do plugin DNS"
++
++msgid "Data collection interval"
++msgstr "Intervalo da coleta de dados"
++
++msgid "Datasets definition file"
++msgstr "Arquivo com a definição de dados"
++
++msgid "Destination ip range"
++msgstr "IP de destino"
++
++msgid "Directory for collectd plugins"
++msgstr "Diretório para os plugins do collectd"
++
++msgid "Directory for sub-configurations"
++msgstr "Diretório para sub-configurações"
++
++msgid "Disk Plugin Configuration"
++msgstr "Configuração do plugin Disco"
++
++msgid "Disk Space Usage"
++msgstr "Utilização de espaço em disco"
++
++msgid "Disk Usage"
++msgstr "Utilização do Disco"
++
++msgid "Display Host »"
++msgstr "Mostrar Host »"
++
++msgid "Display timespan »"
++msgstr "Mostrar intervalo »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "Configuração do plugin E-Mail"
++
++msgid "Email"
++msgstr "Email"
++
++msgid "Enable this plugin"
++msgstr "Habilitar este plugin"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Configuração do plugin Exec"
++
++msgid "Filter class monitoring"
++msgstr "Monitoramento das Classes de Filtros"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Flush cache after"
++msgstr "Limpar cache após"
++
++msgid "Forwarding between listen and server addresses"
++msgstr "Transmissão entre o endereço de escuta e dos servidores"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Gráficos"
++
++msgid "Group"
++msgstr "grupo"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Aqui pode definir comandos externos que serão iniciados pelo collectd a fim "
++"de ler determinados valores. Os valores serão lidos a partir do stdout."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Aqui pode definir os comandos externos que serão iniciados pelo collectd "
++"quando determinados valores limite forem atingidos. Os valores passados ao "
++"comando serão enviados para o stdin."
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"Aqui você pode definir diversos critérios para as regras iptables "
++"selecionadas serem monitoradas."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr "Configuração do plugin IRQ"
++
++msgid "Ignore source addresses"
++msgstr "Ignorar endereços de origem"
++
++msgid "Incoming interface"
++msgstr "Interface de entrada"
++
++msgid "Interface Plugin Configuration"
++msgstr "Configuração do plugin Interface"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interrupts"
++msgstr "Interrupções"
++
++msgid "Interval for pings"
++msgstr "Intervalo dos pings"
++
++msgid "Iptables Plugin Configuration"
++msgstr "Configuração do plugin Iptables"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++"Deixar desmarcada para determinar automaticamente as interfaces a "
++"monitorizar."
++
++msgid "Listen host"
++msgstr "Endereço de escuta do Host"
++
++msgid "Listen port"
++msgstr "Porta de escuta"
++
++msgid "Listener interfaces"
++msgstr "Escutar na(s) interface(s)"
++
++msgid "Load Plugin Configuration"
++msgstr "Configuração do plugin carga"
++
++msgid "Maximum allowed connections"
++msgstr "Máximo de conexões permitidas"
++
++msgid "Memory"
++msgstr "Memória"
++
++msgid "Memory Plugin Configuration"
++msgstr "Configuração do Plugin de Memória"
++
++msgid "Monitor all except specified"
++msgstr "Monitorizar tudo excepto os especificados"
++
++msgid "Monitor all local listen ports"
++msgstr "Monitorar todas as portas locais"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Monitorar dispositivos"
++
++msgid "Monitor disks and partitions"
++msgstr "Monitoras discos e partições"
++
++msgid "Monitor filesystem types"
++msgstr "Monitorar tipos de sistemas de arquivos"
++
++msgid "Monitor hosts"
++msgstr "Monitorar os hosts"
++
++msgid "Monitor interfaces"
++msgstr "Monitorizar interfaces"
++
++msgid "Monitor interrupts"
++msgstr "Monitorar interrupções"
++
++msgid "Monitor local ports"
++msgstr "Monitorar as portas locais"
++
++msgid "Monitor mount points"
++msgstr "Monitorar pontos de montagem"
++
++msgid "Monitor processes"
++msgstr "Monitorar processos"
++
++msgid "Monitor remote ports"
++msgstr "Monitorar portas remotas"
++
++msgid "Name of the rule"
++msgstr "Nome da regra"
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Configuração do plugin Netlink"
++
++msgid "Network"
++msgstr "Rede"
++
++msgid "Network Plugin Configuration"
++msgstr "Configuração do plugin Rede"
++
++msgid "Network plugins"
++msgstr "Plugins de rede"
++
++msgid "Network protocol"
++msgstr "Protocolo de rede"
++
++msgid "Number of threads for data collection"
++msgstr "Número de threads para o coletor de dados"
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr "Somente criar RRAs de média"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Opções"
++
++msgid "Outgoing interface"
++msgstr "Interface de saída"
++
++msgid "Output plugins"
++msgstr "Plugins de saída"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Configuração do plugin Ping"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Processes"
++msgstr "Processos"
++
++msgid "Processes Plugin Configuration"
++msgstr "Configuração do plugin Processos"
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr "Processador"
++
++msgid "Qdisc monitoring"
++msgstr "Monitoramento do Qdisc"
++
++msgid "RRD XFiles Factor"
++msgstr "Arquivos RRD XFiles Factor"
++
++msgid "RRD heart beat interval"
++msgstr "Intervalo entre duas atualizações"
++
++msgid "RRD step interval"
++msgstr "Intervalo de atualização"
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "Configuração do plugin RRDTool"
++
++msgid "Rows per RRA"
++msgstr "Linhas por RRA"
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr "Segundos"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "IP/Hostname do servidor"
++
++msgid "Server port"
++msgstr "Porta do servidor"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "Monitoramento das Classes de Shaping"
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr "IP de origem"
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr "Diretório de armazenamento"
++
++msgid "Storage directory for the csv files"
++msgstr "Diretório para armazenamento dos arquivos csv"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "Armazenar os valores dos dados como taxas em vez de valores absolutos"
++
++msgid "Stored timespans"
++msgstr "Intervalos armazenados"
++
++msgid "System Load"
++msgstr "Carga do Sistema"
++
++msgid "TCP Connections"
++msgstr "Conexões TCP"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "Configuração do plugin TCPConns"
++
++msgid "TTL for network packets"
++msgstr "TTL para os pacotes de rede"
++
++msgid "TTL for ping packets"
++msgstr "TTL para os pacotes do ping"
++
++msgid "Table"
++msgstr "Tabela"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++"O plugin cpu coleta as estatísticas básicas sobre o uso do processador."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"O plugin csv armazena os dados coletados em um arquivo no formato csv para "
++"um futuro processamento por outros programas."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"O plugin df coleta estatísticas sobre a utilização de espaço em disco em "
++"diferentes dispositivos, pontos de montagem ou tipos de sistemas de arquivos."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"O plugin disco coleta estatísticas de uso detalhadas das partições "
++"selecionadas ou discos inteiros."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"O plugin dns coleta estatísticas detalhadas sobre o tráfego do dns nas "
++"interfaces selecionadas."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"O plugin de email cria um socket unix que pode ser usado para transmitir "
++"estatísticas de email o daemon collectd. Este plugin é essencialmente "
++"destinado a ser utilizado em conjunto com o plugin Mail::SpamAssasin::"
++"Plugin::Collectd mas pode ser utilizado de outras maneiras também."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"O plugin exec inicia comandos externos para leitura de valores ou notificar "
++"processos externos quando um determinado valor limite for atingido."
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++"O plugin interface plugin coleta estatísticas sobre o tráfego das interfaces "
++"selecionadas."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"O plugin iptables irá monitorar as regras de firewall selecionadas e coletar "
++"informações sobre pacotes e bytes processados pela regra."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"O plugin irq irá monitorar a taxa de erros por segundo de cada interrupção "
++"selecionada. Se nenhuma interrupção for selecionada então todas as "
++"interrupções serão monitoradas."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr "O plugin carga coleta estatísticas gerais sobre a carga do sistema."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"O plugin Netlink coleta informações detalhadas como qdisc-, classe- e filtro "
++"de estatísticas das interfaces selecionadas."
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"O plugin rede fornece informações de rede baseadas na comunicação entre as "
++"diferentes instâncias do collectd. O Collectd pode operar tanto no modo "
++"cliente quanto no modo servidor. No modo cliente os dados coletados "
++"localmente são transferidos para um servidor collectd, no modo de servidor a "
++"instância local recebe dados de outros hosts."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"O plugin ping irá enviar pacotes ICMP to tipo echo aos hosts selecionados e "
++"medir o tempo de resposta para cada host."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"O plugin processo coleta informações como o tempo da cpu, página falhas e "
++"uso de memória dos processos selecionados."
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"O plugin rrdtool armazena os dados coletados no arquivo de banco de dados "
++"rrd.<br /><br /><strong>Aviso: A má configuração desses valores, resultará "
++"em um valor muito elevado no consumo de memória no diretório temporário. "
++"Isso pode tornar o equipamento inutilizável!</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"O plugin tcpconns coleta informações sobre as conexões TCP abertas das "
++"portas selecionadas."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"O plugin unixsock cria um socket unix, que pode ser usado para ler os dados "
++"coletados a partir de uma instância do collectd."
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"Esta seção define em quais interfaces o collectd irá aguardar para receber "
++"conexões."
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++"Esta seção define para qual servidor os dados coletados localmente serão "
++"enviados."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "Tentar encontrar o nome do host completo (FQDN)"
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Configuração do plugin Unixsock"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Arquivo PID usado"
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr "Monitoramento no modo verbose"
++
++msgid "Wireless"
++msgstr "Wireless"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "ex. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "ex. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "ex. rejeitar-com tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "max. 16 caract."
++
++msgid "reduces rrd size"
++msgstr "reduzir o tamanho do rrd"
++
++msgid "seconds; multiple separated by space"
++msgstr "segundos; vários valores, separar com espaço"
++
++msgid "server interfaces"
++msgstr "Interfaces do servidor"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "Plugis de Sistema"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "As estatísticas são baseadas no <a href=\"http://collectd.org/index.shtml"
++#~ "\">Collectd</a> e é utilizado o <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> para renderização das imagens à partir dos dados "
++#~ "coletados."
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "O plugin wireless coleta estatísticas sobre o nível de sinal wireless, o "
++#~ "ruído e qualidade."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "Configuração do plugin Wireless"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/ro/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/ro/rrdtool.po
+new file mode 100644
+index 0000000..9878759
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/ro/rrdtool.po
+@@ -0,0 +1,360 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-29 17:25+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Nivel zgomot"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: Wireless - Calitate semnal"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "Calitate semnal"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/ro/statistics.po b/feeds/luci/applications/luci-app-statistics/po/ro/statistics.po
+new file mode 100644
+index 0000000..7990970
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/ro/statistics.po
+@@ -0,0 +1,689 @@
++# statistics.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-07 17:27+0200\n"
++"Last-Translator: Daniel <daniel.petre@pitesti.rcs-rds.ro>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Action (target)"
++msgstr ""
++
++msgid "Add command for reading values"
++msgstr ""
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Directorul de baza"
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr "Configurarea pluginului CPU"
++
++msgid "CSV Output"
++msgstr "Afisarea CSV"
++
++msgid "CSV Plugin Configuration"
++msgstr "Configurarea pluginului CVS"
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr "Setarile Collectd"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd e un serviciu mic pentru colectarea de date din diferite surse prin "
++"diferite pluginuri. In aceasta pagina poti schimba setarile generale pentru "
++"Collectd."
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr "Intervalul de colectare date"
++
++msgid "Datasets definition file"
++msgstr "Fisierul de definitii dataseturi"
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr "Directorul pentru pluginurile collectd"
++
++msgid "Directory for sub-configurations"
++msgstr "Directorul pentru sub-configuratii"
++
++msgid "Disk Plugin Configuration"
++msgstr ""
++
++msgid "Disk Space Usage"
++msgstr "Utilizarea spatiului pe disc"
++
++msgid "Disk Usage"
++msgstr "Utilizarea discului"
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr ""
++
++msgid "E-Mail Plugin Configuration"
++msgstr ""
++
++msgid "Email"
++msgstr "Email"
++
++msgid "Enable this plugin"
++msgstr ""
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Grafice"
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Numele de host"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr ""
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interfete"
++
++msgid "Interrupts"
++msgstr "Intreruperi"
++
++msgid "Interval for pings"
++msgstr "Interval pentru ping"
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr ""
++
++msgid "Netlink"
++msgstr "Legatura de retea"
++
++msgid "Netlink Plugin Configuration"
++msgstr ""
++
++msgid "Network"
++msgstr "Retea"
++
++msgid "Network Plugin Configuration"
++msgstr ""
++
++msgid "Network plugins"
++msgstr "Pluginuri de retea"
++
++msgid "Network protocol"
++msgstr ""
++
++msgid "Number of threads for data collection"
++msgstr "Numarul de threaduri pentru colectarea datelor"
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr "Pluginuri de iesire"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr "Procese"
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr "Procesor"
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr ""
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr "Secunde"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr ""
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr "Incarcarea de sistem"
++
++msgid "TCP Connections"
++msgstr "Conexiuni TCP"
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++"Pluginul pentru CPU colecteaza statistici de baza despre utilizarea "
++"procesorului."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "Incearca sa rezolvi numele de domeniu complet"
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Fisierul pentru PID folosit"
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr "Wireless"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr ""
++
++msgid "e.g. br-lan"
++msgstr ""
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr ""
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "Pluginuri de sistem"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/ru/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/ru/rrdtool.po
+new file mode 100644
+index 0000000..a63a850
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/ru/rrdtool.po
+@@ -0,0 +1,360 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-03-26 15:36+0200\n"
++"Last-Translator: Anonymous Pootle User\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "%H: БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ ÑвÑзь - отношение Ñигнал/шум"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "дБм"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "Уровень шума"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "МощноÑÑ‚ÑŒ Ñигнала"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "%H: БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ ÑвÑзь - качеÑтво Ñигнала"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "n"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "КачеÑтво Ñигнала"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "%H: Сквозное Ð²Ñ€ÐµÐ¼Ñ ICMP"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "мÑ"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "%di"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "%H: МежÑетевой Ñкран - обработанные пакеты"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr "пакет/c"
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr "\"%di\""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr "%H: Netlink - передача на %pi"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr "байт/c"
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr "Байт (%ds)"
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr "%H: Netlink - пакеты на %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr "пакет/c"
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr "Обработано (%ds)"
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr "ИÑключено (%ds)"
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr "Ошибок (%ds)"
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr "%H: Netlink - групповые пакеты на %pi"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr "пакет/Ñ"
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr "Пакеты"
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr "%H: Netlink - коллизии на %pi"
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr "коллиз/Ñек"
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr "Коллизии"
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr "%H: Netlink - Ошибки на %pi"
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr "ошибок/c"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr "%di"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr "%di"
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr "%H: ПроцеÑÑÑ‹"
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr "ПроцеÑÑов/Ñ"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr "%di"
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr "%H: ПроцеÑÑ %pi - Ð²Ñ€ÐµÐ¼Ñ Ð¦ÐŸ"
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr "Jiffies"
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr "ÑиÑтема"
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr "пользователь"
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr "%H: ПроцеÑÑ %pi - потоков и процеÑÑов"
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr "КоличеÑтво"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr "%ds"
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr "%H: ПроцеÑÑ %pi - ошибки Ñтраниц"
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr "Ошибки Ñтраниц"
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr "ошибки Ñтраниц"
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr "%H: ПроцеÑÑ %pi - размер виртуальной памÑти"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr "Байт"
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr "Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð°Ð¼ÑÑ‚ÑŒ"
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr "%H: ИÑпользование ЦП #%pi"
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr "%"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr "%di"
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr "%H: Передача на %di"
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr "байт/c"
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr "%H: Пакетов на %di"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr "пакетов/c"
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr "%H: TCP Ñоединений на порт %pi "
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr "Ñоединений/Ñ"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr "%di"
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr "%H: ИÑпользование диÑкового проÑтранÑтва на %di"
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr "Байт"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr "%ds"
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr "%ds"
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr "%H: прерываниÑ"
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr "запроÑов/Ñ"
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr "IRQ %di"
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr "%H: Загрузка ÑиÑтемы"
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr "Загрузка"
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr "1 мин."
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr "5 мин."
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr "15 мин."
+diff --git a/feeds/luci/applications/luci-app-statistics/po/ru/statistics.po b/feeds/luci/applications/luci-app-statistics/po/ru/statistics.po
+new file mode 100644
+index 0000000..d41248f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/ru/statistics.po
+@@ -0,0 +1,789 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: statistics\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-12-05 17:11+0200\n"
++"Last-Translator: Dmitri <4glitch@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Action (target)"
++msgstr "ДейÑтвие (цель)"
++
++msgid "Add command for reading values"
++msgstr "Добавить команду Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹"
++
++msgid "Add matching rule"
++msgstr "Добавить правило выборки"
++
++msgid "Add multiple hosts separated by space."
++msgstr "Добавить неÑколько хоÑтов, разделённых пробелом"
++
++msgid "Add notification command"
++msgstr "Добавить команду уведомлениÑ"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ"
++
++msgid "Basic monitoring"
++msgstr "Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ ÑтатиÑтика"
++
++msgid "CPU Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ CPU"
++
++msgid "CSV Output"
++msgstr "Вывод в CSV"
++
++msgid "CSV Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ CSV"
++
++msgid "Cache collected data for"
++msgstr "КÑшировать Ñобранную ÑтатиÑтику в течение"
++
++msgid "Cache flush interval"
++msgstr "Интервал ÑброÑа кÑша"
++
++msgid "Chain"
++msgstr "Цепочка"
++
++msgid "CollectLinks"
++msgstr "Сбор информации о ÑоединениÑÑ… (CollectLinks)"
++
++msgid "CollectRoutes"
++msgstr "Сбор информации о маршрутах (CollectRoutes)"
++
++msgid "CollectTopology"
++msgstr "Сбор информации о топологии (CollectTopology)"
++
++msgid "Collectd Settings"
++msgstr "ÐаÑтройки Collectd"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd - Ñто ÑÐµÑ€Ð²Ð¸Ñ Ð´Ð»Ñ Ñбора данных Ñ Ñ€Ð°Ð·Ð½Ñ‹Ñ… модулей. Ðа Ñтой Ñтранице вы "
++"можете изменить наÑтройки Сollectd."
++
++msgid "Conntrack"
++msgstr "ОтÑлеживание Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ (Conntrack)"
++
++msgid "Conntrack Plugin Configuration"
++msgstr "ÐаÑтройка плагина Conntrack"
++
++msgid "DF Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ DF"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ DNS"
++
++msgid "Data collection interval"
++msgstr "Интервал Ñбора данных"
++
++msgid "Datasets definition file"
++msgstr "Файл Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ набора данных"
++
++msgid "Destination ip range"
++msgstr "Диапазон IP-адреÑов назначениÑ"
++
++msgid "Directory for collectd plugins"
++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñми collectd"
++
++msgid "Directory for sub-configurations"
++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¹"
++
++msgid "Disk Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Disk"
++
++msgid "Disk Space Usage"
++msgstr "ИÑпользование диÑка"
++
++msgid "Disk Usage"
++msgstr "ИÑпользование диÑка"
++
++msgid "Display Host »"
++msgstr "Показать узел »"
++
++msgid "Display timespan »"
++msgstr "Показать за промежуток »"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ E-Mail"
++
++msgid "Email"
++msgstr "E-mail"
++
++msgid "Enable this plugin"
++msgstr "Включить Ñтот модуль"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Exec"
++
++#, fuzzy
++msgid "Filter class monitoring"
++msgstr "Мониторинг клаÑÑов фильтров"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Flush cache after"
++msgstr "СброÑить кÑш поÑле"
++
++msgid "Forwarding between listen and server addresses"
++msgstr "Перенаправление между локальным адреÑом и адреÑом Ñервера"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Графики"
++
++msgid "Group"
++msgstr "Группа"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"ЗдеÑÑŒ вы можете определить внешние команды, которые будут выполнены Ð´Ð»Ñ "
++"Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ñ… значений. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ Ñчитаны Ñо Ñтандартного вывода."
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"ЗдеÑÑŒ вы можете определить внешние команды, которые будут выполнены, когда "
++"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтигнут определённого порога. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ переданы на "
++"Ñтандартный ввод вызванным программам."
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"ЗдеÑÑŒ вы можете указать различные критерии, по которым будут выбраны правила "
++"Ð´Ð»Ñ Ñбора ÑтатиÑтики."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr "ХоÑÑ‚"
++
++msgid "Hostname"
++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ð¸Ð¼Ñ Ñ…Ð¾Ñта, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… получать текÑтовый вывод"
++
++msgid "IRQ Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ IRQ"
++
++msgid "Ignore source addresses"
++msgstr "Игнорировать адреÑа-иÑточники"
++
++msgid "Incoming interface"
++msgstr "ВходÑщий интерфейÑ"
++
++msgid "Interface Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Interface"
++
++msgid "Interfaces"
++msgstr "ИнтерфейÑÑ‹"
++
++msgid "Interrupts"
++msgstr "ПрерываниÑ"
++
++msgid "Interval for pings"
++msgstr "Интервал Ð´Ð»Ñ ping-запроÑов"
++
++msgid "Iptables Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Iptables"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++"ОÑтавьте невыбранным Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñов Ð´Ð»Ñ "
++"мониторинга."
++
++msgid "Listen host"
++msgstr "ХоÑÑ‚"
++
++msgid "Listen port"
++msgstr "Порт"
++
++msgid "Listener interfaces"
++msgstr "ИÑпользовать интерфейÑÑ‹"
++
++msgid "Load Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Load"
++
++msgid "Maximum allowed connections"
++msgstr "МакÑимальное чиÑло Ñоединений"
++
++msgid "Memory"
++msgstr "ПамÑÑ‚ÑŒ"
++
++msgid "Memory Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Memory"
++
++msgid "Monitor all except specified"
++msgstr "Собирать ÑтатиÑтику Ñо вÑех, кроме указанных"
++
++msgid "Monitor all local listen ports"
++msgstr "Собирать ÑтатиÑтику Ñо вÑех портов, ожидающих ÑоединениÑ"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Собирать ÑтатиÑтику Ñ ÑƒÑтройÑтв"
++
++msgid "Monitor disks and partitions"
++msgstr "Собирать ÑтатиÑтику Ñ Ð´Ð¸Ñков и разделов"
++
++msgid "Monitor filesystem types"
++msgstr "Собирать ÑтатиÑтику Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ñ‹Ñ… ÑиÑтем"
++
++msgid "Monitor hosts"
++msgstr "Собирать ÑтатиÑтику Ñ Ñ…Ð¾Ñтов"
++
++msgid "Monitor interfaces"
++msgstr "Собирать ÑтатиÑтику Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñов"
++
++msgid "Monitor interrupts"
++msgstr "Собирать ÑтатиÑтику по прерываниÑм"
++
++msgid "Monitor local ports"
++msgstr "Собирать ÑтатиÑтику Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… портов"
++
++msgid "Monitor mount points"
++msgstr "Собирать ÑтатиÑтику Ñ Ñ‚Ð¾Ñ‡ÐµÐº монтированиÑ"
++
++msgid "Monitor processes"
++msgstr "Собирать ÑтатиÑтику Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑов"
++
++msgid "Monitor remote ports"
++msgstr "Собирать ÑтатиÑтику Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ñ‹Ñ… портов"
++
++msgid "Name of the rule"
++msgstr "Ðазвание правила"
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Netlink"
++
++msgid "Network"
++msgstr "Network"
++
++msgid "Network Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Network"
++
++msgid "Network plugins"
++msgstr "Сетевые модули"
++
++msgid "Network protocol"
++msgstr "Сетевой протокол"
++
++msgid "Number of threads for data collection"
++msgstr "КоличеÑтво потоков Ñбора данных"
++
++msgid "OLSRd"
++msgstr "OLSRd"
++
++msgid "OLSRd Plugin Configuration"
++msgstr "ÐаÑтройка плагина OLSRd"
++
++msgid "Only create average RRAs"
++msgstr "Создавать только Ñредние RRA"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Опции"
++
++msgid "Outgoing interface"
++msgstr "ИÑходÑщий интерфейÑ"
++
++msgid "Output plugins"
++msgstr "Модули вывода"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ping"
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Processes"
++msgstr "ПроцеÑÑÑ‹"
++
++msgid "Processes Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Processes"
++
++msgid "Processes to monitor separated by space"
++msgstr "ПроцеÑÑÑ‹ Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð° (разделённые пробелом)"
++
++msgid "Processor"
++msgstr "Processor"
++
++msgid "Qdisc monitoring"
++msgstr "Мониторинг Qdisc"
++
++#, fuzzy
++msgid "RRD XFiles Factor"
++msgstr "Фактор XFiles RRD"
++
++#, fuzzy
++msgid "RRD heart beat interval"
++msgstr "Интервал heartbeat RRD"
++
++msgid "RRD step interval"
++msgstr "Интервал шага RRD"
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ RRDTool"
++
++msgid "Rows per RRA"
++msgstr "КоличеÑтво Ñтрок в RRA"
++
++msgid "Script"
++msgstr "Скрипт"
++
++msgid "Seconds"
++msgstr "Секунды"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "ХоÑÑ‚ Ñервера"
++
++msgid "Server port"
++msgstr "Порт Ñервера"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "Мониторинг клаÑÑов шейпинга"
++
++msgid "Socket file"
++msgstr "Файл Ñокета"
++
++msgid "Socket group"
++msgstr "Группа Ñокета"
++
++msgid "Socket permissions"
++msgstr "Права доÑтупа Ñокета"
++
++msgid "Source ip range"
++msgstr "Диапазон IP-адреÑов иÑточника"
++
++msgid "Specifies what information to collect about links."
++msgstr "Указывает, какую информацию Ñобирать о ÑоединениÑÑ…."
++
++msgid "Specifies what information to collect about routes."
++msgstr "Указывает, какую информацию Ñобирать о маршрутах."
++
++msgid "Specifies what information to collect about the global topology."
++msgstr "Указывает, какую информацию Ñобирать о глобальной топологии."
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr "СтатиÑтика"
++
++msgid "Storage directory"
++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸"
++
++msgid "Storage directory for the csv files"
++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ CSV-файлов"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "Хранить данные в виде коÑффициентов вмеÑто абÑолютных значений"
++
++msgid "Stored timespans"
++msgstr "Сохранённые промежутки времени"
++
++msgid "System Load"
++msgstr "Загрузка ÑиÑтемы"
++
++msgid "TCP Connections"
++msgstr "TCPConns"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ TCPConns"
++
++msgid "TTL for network packets"
++msgstr "TTL Ð´Ð»Ñ Ñетевых пакетов"
++
++msgid "TTL for ping packets"
++msgstr "TTL Ð´Ð»Ñ ping-пакетов"
++
++msgid "Table"
++msgstr "Таблица"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++"Модуль OLSRd Ñчитывает информацию о узловых ÑетÑÑ… Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ txtinfo OLSRd."
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++"Модуль Conntrack Ñобирает ÑтатиÑтику о количеÑтве отÑлеживаемых Ñоединений."
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr "Модуль CPU Ñобирает ÑтатиÑтику по иÑпользованию процеÑÑора."
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"Модуль CSV позволÑет Ñохранить ÑтатиÑтику в формате CSV Ð´Ð»Ñ Ð¿Ð¾Ñледующей "
++"обработки."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"Модуль DF Ñобирает ÑтатиÑтику о доÑтупном проÑтранÑтве на различных "
++"уÑтройÑтвах, точках Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ файловых ÑиÑтемах."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"Модуль Disk Ñобирает подробную ÑтатиÑтику Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… разделов или диÑков."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++"Модуль DNS Ñобирает подробную ÑтатиÑтику о DNS-трафике на выбранных "
++"интерфейÑах."
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"Модуль E-mail Ñоздает Unix-Ñокет, который может быть иÑпользован Ð´Ð»Ñ "
++"передачи ÑтатиÑтики Ñл. почты работающему ÑервиÑу collectd. Ð’ оÑновном, Ñтот "
++"модуль предназначен Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¼ÐµÑте Ñ Mail::SpamAssasin::Plugin::"
++"Collectd."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"Модуль Exec выполнÑет внешнюю команду в Ñлучае, когда определённые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ "
++"доÑтигают заданного порога."
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr "Модуль Interface Ñобирает ÑтатиÑтику на выбранных Ñетевых интерфейÑах."
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"Модуль Iptables Ñобирает ÑтатиÑтику Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ñ… правил межÑетевого Ñкрана."
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"Модуль IRQ Ñобирает ÑтатиÑтику по выбранным прерываниÑм. ЕÑли ни одно "
++"прерывание не выбрано, Ñбор ÑтатиÑтики будет проводитьÑÑ Ð¿Ð¾ вÑем прерываниÑм."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++"Модуль Iwinfo Ñобирает ÑтатиÑтику о беÑпроводном Ñигнале, шуме и качеÑтве."
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr "Модуль Load Ñобирает ÑтатиÑтику о загрузке ÑиÑтемы."
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr "Модуль Memory Ñобирает ÑтатиÑтику об иÑпользовании памÑти."
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"Модуль Netlink Ñобирает раÑширенную ÑтатиÑтику Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… интерфейÑов."
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"Модуль Network предоÑтавлÑет возможноÑÑ‚ÑŒ Ñетевого обмена данными между "
++"разными ÑервиÑами collectd. Collectd может работать в режиме Ñервера или "
++"клиента. Ð’ режиме клиента, Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑтатиÑтика передаетÑÑ collectd-Ñерверу, "
++"в режиме Ñервера collectd Ñобирает ÑтатиÑтику Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ñ‹Ñ… хоÑтов."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"Модуль Ping поÑылает ICMP-запроÑÑ‹ выбранным хоÑтам и измерÑет Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ°."
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"Модуль Processes Ñобирает ÑтатиÑтику Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… процеÑÑов об "
++"иÑпользовании ЦП, ошибках Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº Ñтраницам памÑти, иÑпользовании памÑти."
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"Модуль Rrdtool ÑохранÑет ÑтатиÑтику в формате rrd Ð´Ð»Ñ Ð¿Ð¾Ñледующего "
++"поÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð³Ñ€Ð°Ð¼Ð¼.<br /><br /><strong>Внимание: уÑтановка неверных "
++"параметров может привезти к выÑокому потреблению памÑти во временной "
++"директории. Это, в Ñвою очередь, может привеÑти к отказу уÑтройÑтва!</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"Модуль TCPConns Ñобирает информацию об открытых TCP-ÑоединениÑÑ… на выбранных "
++"портах."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"Модуль UnixSock Ñоздает Unix-Ñокет, который может быть иÑпользован Ð´Ð»Ñ "
++"Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑтатиÑтики от работающего ÑервиÑа collectd."
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"Эта ÑÐµÐºÑ†Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñет интерфейÑÑ‹, на которых collectd будет обрабатывать "
++"входÑщие ÑоединениÑ."
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++"Эта ÑÐµÐºÑ†Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñет Ñерверы, на которые будет передаватьÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ "
++"ÑтатиÑтика."
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "ПытатьÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÑÑ‚ÑŒ Ð¸Ð¼Ñ Ñ…Ð¾Ñта"
++
++msgid "UPS"
++msgstr "ИБП"
++
++msgid "UPS Plugin Configuration"
++msgstr "ÐаÑтройка плагина ИБП"
++
++#, fuzzy
++msgid "UPS name in NUT ups@host format"
++msgstr "Ð˜Ð¼Ñ Ð˜Ð‘ÐŸ в ups@host NUT-формате"
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ UnixSock"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "ИÑпользуемый PID-файл"
++
++msgid "User"
++msgstr "Пользователь"
++
++msgid "Verbose monitoring"
++msgstr "РаÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ ÑтатиÑтика"
++
++msgid "Wireless"
++msgstr "Wireless"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Iwinfo"
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "напр. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "напр. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "напр. reject-with tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "не более 16 Ñимволов"
++
++msgid "reduces rrd size"
++msgstr "уменьшает размер rrd"
++
++#, fuzzy
++msgid "seconds; multiple separated by space"
++msgstr "Ñекунды; разделÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼"
++
++msgid "server interfaces"
++msgstr "интерфейÑÑ‹ Ñервера"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "СиÑтемные модули"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "Ð”Ð°Ð½Ð½Ð°Ñ ÑтатиÑтика оÑнована на программе <a href=\"http://collectd.org/"
++#~ "index.shtml\">Collectd</a> и иÑпользует <a href=\"http://oss.oetiker.ch/"
++#~ "rrdtool/\">RRD Tool</a> Ð´Ð»Ñ Ð¿Ð¾ÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð³Ñ€Ð°Ð¼Ð¼."
++
++#~ msgid "Installed network plugins:"
++#~ msgstr "УÑтановленные Ñетевые модули:"
++
++#~ msgid "Installed output plugins:"
++#~ msgstr "УÑтановленные модули вывода:"
++
++#~ msgid ""
++#~ "Network plugins are used to collect information about open tcp "
++#~ "connections, interface traffic, iptables rules etc."
++#~ msgstr ""
++#~ "Сетевые модули иÑпользуютÑÑ Ð´Ð»Ñ Ñбора информации об открытых TCP-"
++#~ "ÑоединениÑÑ…, трафике, правилах iptables и Ñ‚.п."
++
++#~ msgid ""
++#~ "Output plugins provide different possibilities to store collected data. "
++#~ "It is possible to enable multiple plugin at one, for example to store "
++#~ "collected data in rrd databases and to transmit the data over the network "
++#~ "to other collectd instances."
++#~ msgstr ""
++#~ "Модули вывода обеÑпечивают различные варианты ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñобранных "
++#~ "данных. Можно включить неÑколько модулей, например, чтобы Ñохранить "
++#~ "Ñобранные данные в базе данных RRD и передать их по Ñети другим "
++#~ "инÑтанциÑм collectd."
++
++#~ msgid ""
++#~ "System plugins collecting values about system state and ressource usage "
++#~ "on the device.:"
++#~ msgstr ""
++#~ "СиÑтемные модули, Ñобирающие данные о ÑоÑтоÑнии ÑиÑтемы и иÑпользовании "
++#~ "реÑурÑов уÑтройÑтва:"
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "Модуль Wireless Ñобирает ÑтатиÑтику о Ñиле, шуме и качеÑтве Ñигнала."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Wireless"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/sk/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/sk/rrdtool.po
+new file mode 100644
+index 0000000..fd3781f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/sk/rrdtool.po
+@@ -0,0 +1,356 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=ASCII\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/sk/statistics.po b/feeds/luci/applications/luci-app-statistics/po/sk/statistics.po
+new file mode 100644
+index 0000000..e0400c2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/sk/statistics.po
+@@ -0,0 +1,672 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Action (target)"
++msgstr ""
++
++msgid "Add command for reading values"
++msgstr ""
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr ""
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr ""
++
++msgid "CSV Output"
++msgstr ""
++
++msgid "CSV Plugin Configuration"
++msgstr ""
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr ""
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr ""
++
++msgid "Datasets definition file"
++msgstr ""
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr ""
++
++msgid "Directory for sub-configurations"
++msgstr ""
++
++msgid "Disk Plugin Configuration"
++msgstr ""
++
++msgid "Disk Space Usage"
++msgstr ""
++
++msgid "Disk Usage"
++msgstr ""
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr ""
++
++msgid "E-Mail Plugin Configuration"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable this plugin"
++msgstr ""
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr ""
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr ""
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interrupts"
++msgstr ""
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr ""
++
++msgid "Netlink"
++msgstr ""
++
++msgid "Netlink Plugin Configuration"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Plugin Configuration"
++msgstr ""
++
++msgid "Network plugins"
++msgstr ""
++
++msgid "Network protocol"
++msgstr ""
++
++msgid "Number of threads for data collection"
++msgstr ""
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Ping Plugin Configuration"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr ""
++
++msgid "RRDTool Plugin Configuration"
++msgstr ""
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr ""
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr ""
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr ""
++
++msgid "TCP Connections"
++msgstr ""
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr ""
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr ""
++
++msgid "e.g. br-lan"
++msgstr ""
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr ""
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/sv/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/sv/rrdtool.po
+new file mode 100644
+index 0000000..580c9f3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/sv/rrdtool.po
+@@ -0,0 +1,357 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=ASCII\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/sv/statistics.po b/feeds/luci/applications/luci-app-statistics/po/sv/statistics.po
+new file mode 100644
+index 0000000..9c7b217
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/sv/statistics.po
+@@ -0,0 +1,673 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Action (target)"
++msgstr ""
++
++msgid "Add command for reading values"
++msgstr ""
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr ""
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr ""
++
++msgid "CSV Output"
++msgstr ""
++
++msgid "CSV Plugin Configuration"
++msgstr ""
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr ""
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr ""
++
++msgid "Datasets definition file"
++msgstr ""
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr ""
++
++msgid "Directory for sub-configurations"
++msgstr ""
++
++msgid "Disk Plugin Configuration"
++msgstr ""
++
++msgid "Disk Space Usage"
++msgstr ""
++
++msgid "Disk Usage"
++msgstr ""
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr ""
++
++msgid "E-Mail Plugin Configuration"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable this plugin"
++msgstr ""
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr ""
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr ""
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interrupts"
++msgstr ""
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr ""
++
++msgid "Netlink"
++msgstr ""
++
++msgid "Netlink Plugin Configuration"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Plugin Configuration"
++msgstr ""
++
++msgid "Network plugins"
++msgstr ""
++
++msgid "Network protocol"
++msgstr ""
++
++msgid "Number of threads for data collection"
++msgstr ""
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Ping Plugin Configuration"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr ""
++
++msgid "RRDTool Plugin Configuration"
++msgstr ""
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr ""
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr ""
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr ""
++
++msgid "TCP Connections"
++msgstr ""
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr ""
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr ""
++
++msgid "e.g. br-lan"
++msgstr ""
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr ""
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/templates/rrdtool.pot b/feeds/luci/applications/luci-app-statistics/po/templates/rrdtool.pot
+new file mode 100644
+index 0000000..0a105ec
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/templates/rrdtool.pot
+@@ -0,0 +1,349 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr "Content-Type: text/plain; charset=ISO-8859-1"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/templates/statistics.pot b/feeds/luci/applications/luci-app-statistics/po/templates/statistics.pot
+new file mode 100644
+index 0000000..2b4ba7f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/templates/statistics.pot
+@@ -0,0 +1,665 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Action (target)"
++msgstr ""
++
++msgid "Add command for reading values"
++msgstr ""
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr ""
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr ""
++
++msgid "CSV Output"
++msgstr ""
++
++msgid "CSV Plugin Configuration"
++msgstr ""
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr ""
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr ""
++
++msgid "Datasets definition file"
++msgstr ""
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr ""
++
++msgid "Directory for sub-configurations"
++msgstr ""
++
++msgid "Disk Plugin Configuration"
++msgstr ""
++
++msgid "Disk Space Usage"
++msgstr ""
++
++msgid "Disk Usage"
++msgstr ""
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr ""
++
++msgid "E-Mail Plugin Configuration"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable this plugin"
++msgstr ""
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr ""
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr ""
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interrupts"
++msgstr ""
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr ""
++
++msgid "Netlink"
++msgstr ""
++
++msgid "Netlink Plugin Configuration"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Plugin Configuration"
++msgstr ""
++
++msgid "Network plugins"
++msgstr ""
++
++msgid "Network protocol"
++msgstr ""
++
++msgid "Number of threads for data collection"
++msgstr ""
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Ping Plugin Configuration"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr ""
++
++msgid "RRDTool Plugin Configuration"
++msgstr ""
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr ""
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr ""
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr ""
++
++msgid "TCP Connections"
++msgstr ""
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr ""
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr ""
++
++msgid "e.g. br-lan"
++msgstr ""
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr ""
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/tr/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/tr/rrdtool.po
+new file mode 100644
+index 0000000..cb2187b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/tr/rrdtool.po
+@@ -0,0 +1,356 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=ASCII\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=1; plural=0;\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/tr/statistics.po b/feeds/luci/applications/luci-app-statistics/po/tr/statistics.po
+new file mode 100644
+index 0000000..505b5a1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/tr/statistics.po
+@@ -0,0 +1,673 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \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"
++
++msgid "Action (target)"
++msgstr ""
++
++msgid "Add command for reading values"
++msgstr ""
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr ""
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr ""
++
++msgid "CSV Output"
++msgstr ""
++
++msgid "CSV Plugin Configuration"
++msgstr ""
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr ""
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr ""
++
++msgid "Datasets definition file"
++msgstr ""
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr ""
++
++msgid "Directory for sub-configurations"
++msgstr ""
++
++msgid "Disk Plugin Configuration"
++msgstr ""
++
++msgid "Disk Space Usage"
++msgstr ""
++
++msgid "Disk Usage"
++msgstr ""
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr ""
++
++msgid "E-Mail Plugin Configuration"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable this plugin"
++msgstr ""
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr ""
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr ""
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interrupts"
++msgstr ""
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr ""
++
++msgid "Netlink"
++msgstr ""
++
++msgid "Netlink Plugin Configuration"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Plugin Configuration"
++msgstr ""
++
++msgid "Network plugins"
++msgstr ""
++
++msgid "Network protocol"
++msgstr ""
++
++msgid "Number of threads for data collection"
++msgstr ""
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Ping Plugin Configuration"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr ""
++
++msgid "RRDTool Plugin Configuration"
++msgstr ""
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr ""
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr ""
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr ""
++
++msgid "TCP Connections"
++msgstr ""
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr ""
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr ""
++
++msgid "e.g. br-lan"
++msgstr ""
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr ""
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/uk/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/uk/rrdtool.po
+new file mode 100644
+index 0000000..5a535f1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/uk/rrdtool.po
+@@ -0,0 +1,357 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/uk/statistics.po b/feeds/luci/applications/luci-app-statistics/po/uk/statistics.po
+new file mode 100644
+index 0000000..ee5ea8f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/uk/statistics.po
+@@ -0,0 +1,678 @@
++# statistics.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-03-12 23:50+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Action (target)"
++msgstr ""
++
++msgid "Add command for reading values"
++msgstr ""
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr ""
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr ""
++
++msgid "CSV Output"
++msgstr ""
++
++msgid "CSV Plugin Configuration"
++msgstr ""
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr ""
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr ""
++
++msgid "Datasets definition file"
++msgstr ""
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr ""
++
++msgid "Directory for sub-configurations"
++msgstr ""
++
++msgid "Disk Plugin Configuration"
++msgstr ""
++
++msgid "Disk Space Usage"
++msgstr ""
++
++msgid "Disk Usage"
++msgstr ""
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr ""
++
++msgid "E-Mail Plugin Configuration"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable this plugin"
++msgstr ""
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr ""
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr ""
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "ІнтерфейÑи"
++
++msgid "Interrupts"
++msgstr ""
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr ""
++
++msgid "Netlink"
++msgstr ""
++
++msgid "Netlink Plugin Configuration"
++msgstr ""
++
++msgid "Network"
++msgstr "Мережа"
++
++msgid "Network Plugin Configuration"
++msgstr ""
++
++msgid "Network plugins"
++msgstr ""
++
++msgid "Network protocol"
++msgstr "Мережевий протокол"
++
++msgid "Number of threads for data collection"
++msgstr ""
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Ping Plugin Configuration"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr ""
++
++msgid "RRDTool Plugin Configuration"
++msgstr ""
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr ""
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr ""
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr ""
++
++msgid "TCP Connections"
++msgstr ""
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr ""
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr ""
++
++msgid "User"
++msgstr "КориÑтувач"
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr ""
++
++msgid "e.g. br-lan"
++msgstr ""
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr ""
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/vi/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/vi/rrdtool.po
+new file mode 100644
+index 0000000..ca94cf8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/vi/rrdtool.po
+@@ -0,0 +1,524 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:59+0200\n"
++"PO-Revision-Date: 2009-08-13 14:45+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
++
++#~ msgid "%H: Wireless - Signal Noise Ratio"
++#~ msgstr "%H: Wireless - Signal Noise Ratio"
++
++#~ msgid "dBm"
++#~ msgstr "dBm"
++
++#~ msgid "Noise Level"
++#~ msgstr "Noise Level"
++
++#~ msgid "Signal Strength"
++#~ msgstr "Äá»™ mạnh của tín hiệu"
++
++#~ msgid "%H: Wireless - Signal Quality"
++#~ msgstr "%H: Wireless -Chất lượng tín hiệu"
++
++#~ msgid "n"
++#~ msgstr "n"
++
++#~ msgid "Signal Quality"
++#~ msgstr "Chất lượng tín hiệu "
++
++#~ msgid "%H: ICMP Roundtrip Times"
++#~ msgstr "%H: ICMP thá»i gian Ä‘i má»™t vòng"
++
++#~ msgid "ms"
++#~ msgstr "ms"
++
++#~ msgid "%H: Firewall - Processed Packets"
++#~ msgstr "%H: Firewall - Gói đã xử lý"
++
++#~ msgid "Chain \"%di\""
++#~ msgstr "Chuá»—i \"%di\""
++
++#~ msgid "%H: Netlink - Transfer on %pi"
++#~ msgstr "%H: Netlink - chuyển vỠ%pi"
++
++#~ msgid "Bytes (%ds)"
++#~ msgstr "Bytes (%ds)"
++
++#~ msgid "%H: Netlink - Packets on %pi"
++#~ msgstr "%H: Netlink - Äóng gói trên %pi"
++
++#~ msgid "Processed (%ds)"
++#~ msgstr "Äã xá»­ lý (%ds)"
++
++#~ msgid "Dropped (%ds)"
++#~ msgstr ""
++#~ "Dropped<span class=\"translation-space\"> </span>\n"
++#~ "<span class=\"translation-space\"> </span>\n"
++#~ "<span class=\"translation-space\"> </span>\n"
++#~ "(%ds)"
++
++#~ msgid "Errors (%ds)"
++#~ msgstr ""
++#~ "Lá»—i<span class=\"translation-space\"> </span>\n"
++#~ "<span class=\"translation-space\"> </span>\n"
++#~ "<span class=\"translation-space\"> </span>\n"
++#~ "<span class=\"translation-space\"> </span>\n"
++#~ "(%ds)"
++
++#~ msgid "%H: Netlink - Multicast on %pi"
++#~ msgstr "%H: Netlink - Multicast on %pi"
++
++#~ msgid "Packets"
++#~ msgstr "Gói"
++
++#~ msgid "%H: Netlink - Collisions on %pi"
++#~ msgstr "%H: Netlink - Collisions on %pi"
++
++#~ msgid "Collisions/s"
++#~ msgstr "Collisions/s"
++
++#~ msgid "Collisions"
++#~ msgstr "Collisions"
++
++#~ msgid "%H: Netlink - Errors on %pi"
++#~ msgstr "%H: Netlink - lỗi trên %pi"
++
++#~ msgid "Errors/s"
++#~ msgstr "Lá»—i"
++
++#~ msgid "%H: Processes"
++#~ msgstr "%H: Quá trình"
++
++#~ msgid "Processes/s"
++#~ msgstr "Quy trình"
++
++#~ msgid "%H: Process %pi - used cpu time"
++#~ msgstr "%H: Quá trình %pi - thá»i gian cpu đã sá»­ dụng"
++
++#~ msgid "Jiffies"
++#~ msgstr "Jiffies"
++
++#~ msgid "System"
++#~ msgstr "Hệ thống"
++
++#~ msgid "user"
++#~ msgstr "NgÆ°á»i dùng"
++
++#~ msgid "%H: Process %pi - threads and processes"
++#~ msgstr "%H: quá trình %pi - các luồng và quá trình"
++
++#~ msgid "Count"
++#~ msgstr "Äếm"
++
++#~ msgid "%H: Process %pi - page faults"
++#~ msgstr "%H: quá trình %pi - lỗi trang"
++
++#~ msgid "Pagefaults"
++#~ msgstr "Pagefaults"
++
++#~ msgid "page faults"
++#~ msgstr "page faults"
++
++#~ msgid "%H: Process %pi - virtual memory size"
++#~ msgstr "%H: quá trình %pi - dung lượng bộ nhớ ảo "
++
++#~ msgid "virtual memory"
++#~ msgstr "Bộ nhớ ảo"
++
++#~ msgid "%H: Usage on Processor #%pi"
++#~ msgstr "%H: sử dụng trên bộ xử lý #%pi"
++
++#~ msgid "%"
++#~ msgstr "%"
++
++#~ msgid "%H: Transfer on %di"
++#~ msgstr "%H: Chuyển tải trên %di"
++
++#~ msgid "%H: Packets on %di"
++#~ msgstr "%H: Gói trên %di"
++
++#~ msgid "%H: TCP-Connections to Port %pi"
++#~ msgstr "%H: TCP-kết nối tới cổng %pi"
++
++#~ msgid "Connections/s"
++#~ msgstr "Kết nối"
++
++#~ msgid "%H: Disk Space Usage on %di"
++#~ msgstr "%H: sử dụng không gian trên đĩa ở %di"
++
++#~ msgid "%H: Interrupts"
++#~ msgstr "%H: Cắt ngang"
++
++#~ msgid "Issues/s"
++#~ msgstr "Vấn Ä‘á»"
++
++#~ msgid "IRQ %di"
++#~ msgstr "IRQ %di"
++
++#~ msgid "%H: System Load"
++#~ msgstr "%H: Tải hệ thống"
++
++#~ msgid "Load"
++#~ msgstr "Tải"
++
++#~ msgid "1 min"
++#~ msgstr "1 phút"
++
++#~ msgid "5 min"
++#~ msgstr "5 phút"
++
++#~ msgid "15 min"
++#~ msgstr "15 phút"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/vi/statistics.po b/feeds/luci/applications/luci-app-statistics/po/vi/statistics.po
+new file mode 100644
+index 0000000..28bc8b4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/vi/statistics.po
+@@ -0,0 +1,756 @@
++# statistics.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:58+0200\n"
++"PO-Revision-Date: 2009-08-16 05:50+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "Action (target)"
++msgstr "Action (target)"
++
++msgid "Add command for reading values"
++msgstr "Thêm lệnh cho giá trị Ä‘ang Ä‘á»c"
++
++msgid "Add matching rule"
++msgstr "Thêm matching rule"
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr "Thêm lệnh thông báo"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "Thư mục Cơ sở"
++
++msgid "Basic monitoring"
++msgstr "Monitoring căn bản"
++
++msgid "CPU Plugin Configuration"
++msgstr "Cấu hình Plugin CPU"
++
++msgid "CSV Output"
++msgstr "CSV Output"
++
++msgid "CSV Plugin Configuration"
++msgstr "Cấu hình CSV plugin"
++
++msgid "Cache collected data for"
++msgstr "Cache collected data cho"
++
++msgid "Cache flush interval"
++msgstr "Cache flush interval"
++
++msgid "Chain"
++msgstr "Chain"
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr "Những cài đặt collectd"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd là má»™t daemon nhỠđể thu thập dữ liệu từ nhiá»u nguồn thông qua các "
++"plugins khác nhau. Trên trang này, bạn có thể thay đổi cài đặt tổng quát cho "
++"cai collectd daemon. "
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr "Cấu hình DF plugin"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "Cấu hình DNS plugin"
++
++msgid "Data collection interval"
++msgstr "Khoảng thu thập dữ liệu"
++
++msgid "Datasets definition file"
++msgstr "Tập tin định nghĩa cơ sở dữ liệu"
++
++msgid "Destination ip range"
++msgstr "Äiểm đến ip range"
++
++msgid "Directory for collectd plugins"
++msgstr "Danh mục cho collectd plugins"
++
++msgid "Directory for sub-configurations"
++msgstr "Danh mục cho sub-configurations"
++
++msgid "Disk Plugin Configuration"
++msgstr "Cấu hình disk plugin"
++
++msgid "Disk Space Usage"
++msgstr "Khoảng trống trên đĩa"
++
++msgid "Disk Usage"
++msgstr "Disk Usage"
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr "Display timespan"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "Cấu hình e-mail plugin"
++
++msgid "Email"
++msgstr "Email"
++
++msgid "Enable this plugin"
++msgstr "Kích hoạt plugin này"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Cấu hình Exec Plugin"
++
++msgid "Filter class monitoring"
++msgstr "Filter class monitoring"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Flush cache after"
++msgstr "Flush cache sau khi"
++
++msgid "Forwarding between listen and server addresses"
++msgstr "chuyển tiếp giữa listen và địa chỉ server"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "Graphs"
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"Ở đây bạn có thể định nghĩa các lệnh bên ngoài mà sẽ khởi động bằng collectd "
++"để Ä‘á»c những giá trị nhất định. Những giá trị sẽ được Ä‘á»c từ stdout"
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"Ở đây bạn có thể định nghĩa các lệnh bên ngoài cái mà bắt đầu bằng collectd "
++"khi những giá trị threshold nhất định được tiếp cận. Những giá trị dẫn tới "
++"invokation sẽ được feed tá»›i má»™t chÆ°Æ¡ng trình gá»i là stdin"
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++"Ở đây bạn có thể định nghĩa những tiêu chuẩn khác nhau để monitor iptables "
++"rules được chá»n."
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Tên host"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr "Cấu hình IRQ Plugin "
++
++msgid "Ignore source addresses"
++msgstr "LỠđi những địa chỉ nguồn"
++
++msgid "Incoming interface"
++msgstr "Giao diện đang tới"
++
++msgid "Interface Plugin Configuration"
++msgstr "Cấu hình giao diện plugin"
++
++msgid "Interfaces"
++msgstr "Giao diện"
++
++msgid "Interrupts"
++msgstr "Cắt ngang"
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr "cấu hình Iptables Plugin "
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr "Listen host"
++
++msgid "Listen port"
++msgstr "Listen port"
++
++msgid "Listener interfaces"
++msgstr "Giao diện listener"
++
++msgid "Load Plugin Configuration"
++msgstr "Tải cấu hình plugin"
++
++msgid "Maximum allowed connections"
++msgstr "Tối đã kết nối cho phép"
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr "Monitor tất cả local listen port"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "Monitor devices"
++
++msgid "Monitor disks and partitions"
++msgstr "Kiểm soát đĩa và phân vùng"
++
++msgid "Monitor filesystem types"
++msgstr "Kiểm soát loại filesystem"
++
++msgid "Monitor hosts"
++msgstr "Monitor hosts"
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr "Monitor interrupts"
++
++msgid "Monitor local ports"
++msgstr "Monitor cổng địa phương"
++
++msgid "Monitor mount points"
++msgstr "Monitor mount points"
++
++msgid "Monitor processes"
++msgstr "Monitor processes"
++
++msgid "Monitor remote ports"
++msgstr "Monitor remote ports"
++
++msgid "Name of the rule"
++msgstr "Tên của rule"
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Cấu hình Netlink Plugin "
++
++msgid "Network"
++msgstr "Network"
++
++msgid "Network Plugin Configuration"
++msgstr "Cấu hình network plugin"
++
++msgid "Network plugins"
++msgstr "Network plugins"
++
++msgid "Network protocol"
++msgstr "Network protocol"
++
++msgid "Number of threads for data collection"
++msgstr "Số lượng các chủ đỠđể thu thập dữ liệu"
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr "Chỉ tạo trung bình RRAs"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "Tùy chá»n"
++
++msgid "Outgoing interface"
++msgstr "Giao diện ra ngoài"
++
++msgid "Output plugins"
++msgstr "Output plugins"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Cấu hình Ping plugin"
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr "Quá trình xử lý"
++
++msgid "Processes Plugin Configuration"
++msgstr "Cấu hình processes plugin"
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr "Bộ xử lý"
++
++msgid "Qdisc monitoring"
++msgstr "Qdisc monitoring"
++
++msgid "RRD XFiles Factor"
++msgstr "Yếu tố RRD XFiles"
++
++msgid "RRD heart beat interval"
++msgstr "RRD heart beat interval"
++
++msgid "RRD step interval"
++msgstr "RRD step interval"
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "Cấu hình RRDTool Plugin "
++
++msgid "Rows per RRA"
++msgstr "Rows per RRA"
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr "Giây"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "Server host"
++
++msgid "Server port"
++msgstr "Server port"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "Shaping class monitoring"
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr "Nguồn ip range"
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr "Thư mục lưu trữ"
++
++msgid "Storage directory for the csv files"
++msgstr "Thư mục lưu trữ cho nhưng tập tin csv"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "Những giá trị dữ liệu lưu trữ như một tỉ lệ thay vì giá trị tuyệt đối"
++
++msgid "Stored timespans"
++msgstr "LÆ°u timspans"
++
++msgid "System Load"
++msgstr "System Load"
++
++msgid "TCP Connections"
++msgstr "Kết nối TCP"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "Cấu hình TCPConns Plugin "
++
++msgid "TTL for network packets"
++msgstr "TTL cho gói mạng"
++
++msgid "TTL for ping packets"
++msgstr "TTl cho gói ping"
++
++msgid "Table"
++msgstr "Table"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr "CPU plugin thu thập số liệu thống kê cơ bản vỠsử dụng bộ việc xử lý"
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++"CSV plugin stores thu thập dữ liệu trong tập tin định dạng csv để tiến hành "
++"xử lý bằng các chương trình bên ngoài."
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++"df plugin thu thập số liệu thông kế vỠkhoảng trống trên đĩa trên những "
++"thiết bị khác, mount points hoặc những loại filesystem."
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++"Disk plugin thu thập số liệu thống kê chi tiết vỠcách sử dụng cho những "
++"phân vùng lá»±a chá»n hoặc toàn bá»™ Ä‘Ä©a."
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++" dns plugin thu thập những thông kê chi tiết vỠdns liên quan đến lưu thông "
++"trên những giao diện được chá»n. "
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"Email plugin tạo ra má»™t unix socket mà có thể dùng để truyá»n thông kê e-mail "
++"tới một collectd daemon đang chạy. Cái plugin này chủ yếu được dùng với "
++"Mail::SpamAssasin::Plugin::Collectd nhưng cũng có thể dùng trong những cách "
++"khác."
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"Exec plugin bắt đầu những lệnh bên ngoài để Ä‘á»c những giá trị từ hoặc tá»›i "
++"những quá trình xử lý thông báo bên ngoài khi giá trị của một threshold nhất "
++"định được tiếp cận "
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++"Giao diện plugin thu thập những thống kê lưu thông trên những giao diện được "
++"chá»n"
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++"iptables plugin sẽ monitor những cái firewall rules được chá»n và thu thập "
++"thông tin vỠbytes xử lý và gói trên rule. "
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"irq plugin sẽ monitor tỉ lệ vấn Ä‘á» trên giây cho những interrupt được chá»n. "
++"Nếu không có interrupt được chá»n thi tất cả các interrupt sẽ được monitor. "
++"for each selected interrupt. If no interrupt is selected then all interrupts "
++"are monitored."
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr "Plugin tải thu thập thông kê vỠtổng quát system load"
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++"Netlink plugin thu thập những thông tin mở rộng như qdisc-, class- and "
++"filter-statistics cho những giao diện được chá»n"
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"Network plugin cung cấp network dựa trên giao tiếp giữa những collectd "
++"instances khác nhau. Collectd có thể vận hành trên cả 2 chế độ client và "
++"server. Trong kiểu chế độ client tập hợp ngày tháng địa phương được chuyển "
++"tới một collectd server instance, trong chế độ server, instance địa phương "
++"nhận dữ liệu từ những host khác."
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++"ping plugin sẽ gá»­i icmp echo trả lá»i tá»›i những host được chá»n và Ä‘o thá»i "
++"gian vận hành qua lại cho từng host"
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++"Processes plugin thu thập thông tin như cpu time, page faults và memory "
++"usage của từng processes được chá»n. "
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"The rrdtool plugin lưu những dữ liệu thu thập trong rrd database files, cơ "
++"sở của biểu đồ.<br /><br /><strong> Cảnh báo: Äặt sai giá trị sẽ tiêu hao bá»™ "
++"nhá»› rất nhiá»u trong má»™t thÆ° mục tạm thá»i. Äiá»u này có thể làm thiết bị không "
++"sử dụng được</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++"Tcpconns plugin thu thập thông tin vỠopen tcp kết nối trên những cổng được "
++"chá»n."
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++"Unixsock plugin tạo má»™t unix socket mà có thể dùng để Ä‘á»c dữ liệu thu thập "
++"từ một collectd instance đang vận hành. "
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++"Section này định nghĩa trên giao diện collectd sẽ đợi những kết nối đang tới"
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr "Section này định nghĩa servers thu thập dữ liệu địa phương để gửi đi"
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "Thá»­ tra cứu những tên host đủ Ä‘iá»u kiện"
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Cấu hình Unixsock Plugin "
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "Tập tin PID đã sử dụng"
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr "Verbose monitoring"
++
++msgid "Wireless"
++msgstr "Mạng không dây"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "e.g. br-ff"
++
++msgid "e.g. br-lan"
++msgstr "e.g. br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "e.g. reject-with tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "max. 16 chars"
++
++msgid "reduces rrd size"
++msgstr "Giảm rrd size"
++
++msgid "seconds; multiple separated by space"
++msgstr "giây; nhiá»u phân tách bởi khoảng trống"
++
++msgid "server interfaces"
++msgstr "giao diện server"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "System plugins"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "Gói thống kê dựa trên <a href=\"http://collectd.org/index.shtml"
++#~ "\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/\">RRD "
++#~ "Tool</a> vẽ lại sơ đồ hình ảnh từ dữ liệu thu thập ."
++
++#~ msgid ""
++#~ "The wireless plugin collects statistics about wireless signal strength, "
++#~ "noise and quality."
++#~ msgstr ""
++#~ "Cấu hình wireless plugin thu thập thống kê vỠđộ mạnh của tín hiệu "
++#~ "wireless, noise và chất lượng."
++
++#~ msgid "Wireless Plugin Configuration"
++#~ msgstr "Cấu hình Wireless Plugin "
+diff --git a/feeds/luci/applications/luci-app-statistics/po/zh-cn/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/zh-cn/rrdtool.po
+new file mode 100644
+index 0000000..4e6ee4b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/zh-cn/rrdtool.po
+@@ -0,0 +1,359 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-23 02:08+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr "无线信å·å™ªéŸ³"
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr "信噪比"
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr "ä¿¡å·å™ªéŸ³"
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr "ä¿¡å·å¼ºåº¦"
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr "无线信å·è´¨é‡"
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr "无线信å·è´¨é‡"
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr "ä¿¡å·è´¨é‡"
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr "ping"
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr "å“应"
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr "ping"
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr "iptables包"
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/zh-cn/statistics.po b/feeds/luci/applications/luci-app-statistics/po/zh-cn/statistics.po
+new file mode 100644
+index 0000000..4714ab5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/zh-cn/statistics.po
+@@ -0,0 +1,713 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-06-13 15:04+0200\n"
++"Last-Translator: phantasm131 <phantasm131@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Action (target)"
++msgstr "动作(目标)"
++
++msgid "Add command for reading values"
++msgstr "添加命令读å–æ•°æ®"
++
++msgid "Add matching rule"
++msgstr "新增匹é…规则"
++
++msgid "Add multiple hosts separated by space."
++msgstr "使用空格分隔多个主机"
++
++msgid "Add notification command"
++msgstr "新增通知命令"
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr "基本目录"
++
++msgid "Basic monitoring"
++msgstr "基本监控"
++
++msgid "CPU Plugin Configuration"
++msgstr "CPUæ’件é…ç½®"
++
++msgid "CSV Output"
++msgstr "CSV输出"
++
++msgid "CSV Plugin Configuration"
++msgstr "CSVæ’件é…ç½®"
++
++msgid "Cache collected data for"
++msgstr "收集缓存数æ®"
++
++msgid "Cache flush interval"
++msgstr "缓存清空间隙"
++
++msgid "Chain"
++msgstr "链"
++
++msgid "CollectLinks"
++msgstr "收集链接"
++
++msgid "CollectRoutes"
++msgstr "收集路由"
++
++msgid "CollectTopology"
++msgstr "收集拓扑"
++
++msgid "Collectd Settings"
++msgstr "Collectd设置"
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++"Collectd是一个通过ä¸åŒæ’件用于收集å„ç§æºæ•°æ®çš„å°åž‹å®ˆæŠ¤ç¨‹åºã€‚在此页é¢ä¸­ï¼Œæ‚¨å¯"
++"以更改Collectd守护进程常规设置。"
++
++msgid "Conntrack"
++msgstr "Conntrack"
++
++msgid "Conntrack Plugin Configuration"
++msgstr "Conntrackæ’件设置"
++
++msgid "DF Plugin Configuration"
++msgstr "DFæ’件设置"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS Plugin Configuration"
++msgstr "DNSæ’件设置"
++
++msgid "Data collection interval"
++msgstr "æ•°æ®æ”¶é›†é—´éš™"
++
++msgid "Datasets definition file"
++msgstr "æ•°æ®é›†å®šä¹‰æ–‡ä»¶"
++
++msgid "Destination ip range"
++msgstr "目标IP区间"
++
++msgid "Directory for collectd plugins"
++msgstr "Collectdæ’件目录"
++
++msgid "Directory for sub-configurations"
++msgstr "å­é…置目录"
++
++msgid "Disk Plugin Configuration"
++msgstr "Diskæ’件é…ç½®"
++
++msgid "Disk Space Usage"
++msgstr "ç£ç›˜ç©ºé—´ä½¿ç”¨æƒ…况"
++
++msgid "Disk Usage"
++msgstr "ç£ç›˜ä½¿ç”¨æƒ…况"
++
++msgid "Display Host »"
++msgstr "显示主机"
++
++msgid "Display timespan »"
++msgstr "显示时间段"
++
++msgid "E-Mail Plugin Configuration"
++msgstr "E-Mailæ’件é…ç½®"
++
++msgid "Email"
++msgstr "电å­é‚®ä»¶"
++
++msgid "Enable this plugin"
++msgstr "å¯ç”¨è¯¥æ’件"
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr "Exec"
++
++msgid "Exec Plugin Configuration"
++msgstr "Execæ’件é…ç½®"
++
++msgid "Filter class monitoring"
++msgstr "Filter类监测"
++
++msgid "Firewall"
++msgstr "防ç«å¢™"
++
++msgid "Flush cache after"
++msgstr "清空缓存åŽ"
++
++msgid "Forwarding between listen and server addresses"
++msgstr "转å‘监å¬æœåŠ¡å™¨å’Œåº”用æœåŠ¡å™¨ä¹‹é—´æ•°æ®"
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr "图表"
++
++msgid "Group"
++msgstr "组"
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++"在这里,你å¯ä»¥å®šä¹‰å¤–部命令,Collectdå°†å¯åŠ¨å‘½ä»¤æ¥èŽ·å–æŸäº›å€¼ï¼Œå°†èŽ·å–的值从标准"
++"输出端å£è¾“出。"
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++"在这里,你å¯ä»¥å®šä¹‰å¤–部命令,当Collectd达到一定阈值时,将å¯åŠ¨å‘½ä»¤ã€‚阀值将会作"
++"为命令的标准输入。"
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr "在这里,你å¯ä»¥å®šä¹‰å„ç§ç›‘控iptables规则临界值。"
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr "主机"
++
++msgid "Hostname"
++msgstr "主机å"
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr "获å–txtinfo输出的IP地å€æˆ–主机å"
++
++msgid "IRQ Plugin Configuration"
++msgstr "IRQæ’件é…ç½®"
++
++msgid "Ignore source addresses"
++msgstr "忽略æºåœ°å€"
++
++msgid "Incoming interface"
++msgstr "入接å£"
++
++msgid "Interface Plugin Configuration"
++msgstr "Interfaceæ’件é…ç½®"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Interrupts"
++msgstr "中断"
++
++msgid "Interval for pings"
++msgstr "pingé—´éš™"
++
++msgid "Iptables Plugin Configuration"
++msgstr "Iptablesæ’件é…ç½®"
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr "自动ä¿ç•™å¯¹æœªé€‰ä¸­æŽ¥å£çš„监控。"
++
++msgid "Listen host"
++msgstr "监å¬ä¸»æœº"
++
++msgid "Listen port"
++msgstr "监å¬ç«¯å£"
++
++msgid "Listener interfaces"
++msgstr "监å¬æŽ¥å£"
++
++msgid "Load Plugin Configuration"
++msgstr "Loadæ’件é…ç½®"
++
++msgid "Maximum allowed connections"
++msgstr "最大å…许连接数"
++
++msgid "Memory"
++msgstr "内存"
++
++msgid "Memory Plugin Configuration"
++msgstr "内存æ’件é…ç½®"
++
++msgid "Monitor all except specified"
++msgstr "监测所有(除特别注明外)"
++
++msgid "Monitor all local listen ports"
++msgstr "监测所有本地监å¬ç«¯å£"
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr "监测设备"
++
++msgid "Monitor disks and partitions"
++msgstr "监测ç£ç›˜å’Œåˆ†åŒº"
++
++msgid "Monitor filesystem types"
++msgstr "监测文件系统类型"
++
++msgid "Monitor hosts"
++msgstr "监测主机"
++
++msgid "Monitor interfaces"
++msgstr "监测接å£"
++
++msgid "Monitor interrupts"
++msgstr "监测中断"
++
++msgid "Monitor local ports"
++msgstr "监测本地端å£"
++
++msgid "Monitor mount points"
++msgstr "监测挂载点"
++
++msgid "Monitor processes"
++msgstr "监测进程"
++
++msgid "Monitor remote ports"
++msgstr "监测远程端å£"
++
++msgid "Name of the rule"
++msgstr "规则å"
++
++msgid "Netlink"
++msgstr "Netlink"
++
++msgid "Netlink Plugin Configuration"
++msgstr "Netlinkæ’件é…ç½®"
++
++msgid "Network"
++msgstr "Network"
++
++msgid "Network Plugin Configuration"
++msgstr "Networkæ’件é…ç½®"
++
++msgid "Network plugins"
++msgstr "Networkæ’件"
++
++msgid "Network protocol"
++msgstr "Networkåè®®"
++
++msgid "Number of threads for data collection"
++msgstr "收集程åºä½¿ç”¨çº¿ç¨‹æ•°"
++
++msgid "OLSRd"
++msgstr "OLSRd"
++
++msgid "OLSRd Plugin Configuration"
++msgstr "OLSRdæ’件é…ç½®"
++
++msgid "Only create average RRAs"
++msgstr "仅创建平å‡RRAs"
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr "选项"
++
++msgid "Outgoing interface"
++msgstr "出接å£"
++
++msgid "Output plugins"
++msgstr "Outputæ’件"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Ping Plugin Configuration"
++msgstr "Pingæ’件é…ç½®"
++
++msgid "Port"
++msgstr "端å£"
++
++msgid "Processes"
++msgstr "进程"
++
++msgid "Processes Plugin Configuration"
++msgstr "进程æ’件é…ç½®"
++
++msgid "Processes to monitor separated by space"
++msgstr "过程监控,用空格隔开"
++
++msgid "Processor"
++msgstr "处ç†å™¨"
++
++msgid "Qdisc monitoring"
++msgstr "Qdisc监测"
++
++msgid "RRD XFiles Factor"
++msgstr "RRD XFileså› å­"
++
++msgid "RRD heart beat interval"
++msgstr "RRD心跳间隙"
++
++msgid "RRD step interval"
++msgstr "RRD区间间隙"
++
++msgid "RRDTool"
++msgstr "RRDTool"
++
++msgid "RRDTool Plugin Configuration"
++msgstr "RRDToolæ’件é…ç½®"
++
++msgid "Rows per RRA"
++msgstr "行/RRA"
++
++msgid "Script"
++msgstr "脚本"
++
++msgid "Seconds"
++msgstr "秒"
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr "æœåŠ¡å™¨ä¸»æœº"
++
++msgid "Server port"
++msgstr "æœåŠ¡å™¨ç«¯å£"
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr "整形类监控"
++
++msgid "Socket file"
++msgstr "套接字文件"
++
++msgid "Socket group"
++msgstr "套接字组"
++
++msgid "Socket permissions"
++msgstr "套接字æƒé™"
++
++msgid "Source ip range"
++msgstr "æºIP区间"
++
++msgid "Specifies what information to collect about links."
++msgstr "收集指定链接相关信æ¯ã€‚"
++
++msgid "Specifies what information to collect about routes."
++msgstr "收集指定路由相关信æ¯ã€‚"
++
++msgid "Specifies what information to collect about the global topology."
++msgstr "收集指定拓扑相关信æ¯ã€‚"
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr "统计"
++
++msgid "Storage directory"
++msgstr "存储目录"
++
++msgid "Storage directory for the csv files"
++msgstr "csv存储目录"
++
++msgid "Store data values as rates instead of absolute values"
++msgstr "存储数æ®å€¼å˜åŒ–é‡è€Œä¸æ˜¯ç»å¯¹å€¼"
++
++msgid "Stored timespans"
++msgstr "存储时间跨度"
++
++msgid "System Load"
++msgstr "系统加载"
++
++msgid "TCP Connections"
++msgstr "TCP连接数"
++
++msgid "TCPConns Plugin Configuration"
++msgstr "TCPConnsæ’件é…ç½®"
++
++msgid "TTL for network packets"
++msgstr "网络包TTL"
++
++msgid "TTL for ping packets"
++msgstr "ping包TTL"
++
++msgid "Table"
++msgstr "表"
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr "NUTæ’件读å–UPSä¿¡æ¯ã€‚"
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr "OLSRdæ’件通过txtinfo获å–meshed网络信æ¯ã€‚"
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr "conntrackæ’件获å–连接数信æ¯ã€‚"
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr "cpuæ’件获å–处ç†å™¨ç›¸å…³ä¿¡æ¯ã€‚"
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr "csvæ’件用于存储数æ®ï¼Œä»¥æ–¹ä¾¿å…¶ä»–程åºå¤„ç†æ•°æ®ã€‚"
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr "dfæ’件收集ç£ç›˜ç©ºé—´ä½¿ç”¨æƒ…况,挂载点åŠæ–‡ä»¶ç³»ç»Ÿç›¸å…³ä¿¡æ¯ã€‚"
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr "diskæ’件收集ç£ç›˜åˆ†åŒºä½¿ç”¨æƒ…况åŠç›¸å…³ä¿¡æ¯ã€‚"
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr "dnsæ’件收集dnsæ•°æ®æµç›¸å…³ä¿¡æ¯ã€‚"
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++"邮件æ’件创建一个unix套接字用于为Collectd守护进程å‘é€ç»Ÿè®¡ä¿¡æ¯åˆ°ç”µå­é‚®ä»¶ç³»ç»Ÿã€‚"
++"这个æ’件主è¦ç›®çš„是结åˆä½¿ç”¨Mail::SpamAssasin::Pulgin::Collectd,但å¯ä»¥ç”¨åœ¨å…¶ä»–"
++"æ–¹é¢ã€‚"
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++"execæ’件,用于当æŸäº›ç›‘控值已到达阈值时,å¯åŠ¨å¤–部命令读值或通知外部程åºã€‚"
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr "Interfaceæ’件,用于收集选定接å£çš„æ•°æ®åŒ…的统计信æ¯ã€‚"
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr "iptablesæ’件,将监测选定防ç«å¢™è§„则和收集关于æ¯ä¸ªè§„则处ç†çš„æ•°æ®åŒ…ä¿¡æ¯ã€‚"
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++"irqæ’件,用于监控选定中断的æ¯ç§’钟产生的中断数。如果没有中断被选中,则表示对所"
++"有中断进行监测。"
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr "iwinfoæ’件,收集无线信å·å¼ºåº¦ã€å™ªå£°å’Œè´¨é‡çš„统计信æ¯ã€‚"
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr "loadæ’件,收集常规系统加载统计信æ¯ã€‚"
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr "memoryæ’件,收集关于内存使用情况的统计信æ¯ã€‚"
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr "netlinkæ’件,收集为选定接å£qdisc-ã€class-å’Œfilter- 的扩展数æ®ã€‚"
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++"networkæ’件,æ供了基于网络的ä¸åŒCollectd实例。Collectdå¯ä»¥å·¥ä½œåœ¨å®¢æˆ·ç«¯å’ŒæœåŠ¡"
++"器两个模å¼ã€‚在客户端模å¼ä¸‹æ”¶é›†æœ¬åœ°ä¿¡æ¯ï¼Œç„¶åŽè½¬ç§»åˆ°ä¸€ä¸ªCollectdæœåŠ¡å™¨å®žä¾‹ä¸­,在"
++"æœåŠ¡å™¨æ¨¡å¼å°†ä»Žå…¶ä»–主机收集信æ¯ã€‚"
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr "pingæ’件,将å‘é€icmp echo replies到选定主机æ¥æµ‹é‡æ¯å°ä¸»æœºçš„å“应时间。"
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr "processesæ’件,收集选定进程的cpu时间ã€é¡µé¢é”™è¯¯å’Œå†…存使用信æ¯ã€‚"
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++"rrdtoolæ’件,将收集数æ®ä»¥å›¾è¡¨çš„å½¢å¼å‚¨å­˜åœ¨RRDæ•°æ®åº“文件中。<br /><br /"
++"><strong>警告:错误的å‚数设置,将导致éžå¸¸é«˜çš„临时内存消耗。这å¯èƒ½ä¼šä½¿è®¾å¤‡æ— æ³•"
++"使用ï¼</strong>"
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr "tcpconnsæ’件,收集选定端å£TCP连接信æ¯ã€‚"
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr "unixsockæ’件,创建一个unix套接字å¯ç”¨äºŽè¯»å–Collectd实例的收集信æ¯ã€‚"
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr "定义Collectd将监å¬å“ªä¸ªæŽ¥å£æ¥ä¼ å…¥è¿žæŽ¥æ”¶é›†æ•°æ®ã€‚"
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr "定义本地收集数æ®è¢«å‘é€åˆ°å“ªå°CollectedæœåŠ¡å™¨ã€‚"
++
++msgid "Try to lookup fully qualified hostname"
++msgstr "å°è¯•è§£æžä¸»æœºå…¨åŸŸå"
++
++msgid "UPS"
++msgstr "UPS"
++
++msgid "UPS Plugin Configuration"
++msgstr "UPSæ’件é…ç½®"
++
++msgid "UPS name in NUT ups@host format"
++msgstr "UPSå使用NUT(Network UPS Tools)格å¼ï¼šups@host"
++
++msgid "UnixSock"
++msgstr "UnixSock"
++
++msgid "Unixsock Plugin Configuration"
++msgstr "Unixsockæ’件é…ç½®"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr "正在使用的PID文件"
++
++msgid "User"
++msgstr "用户"
++
++msgid "Verbose monitoring"
++msgstr "详细监测"
++
++msgid "Wireless"
++msgstr "无线"
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr "无线iwinfoæ’件é…ç½®"
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr "例如:br-ff"
++
++msgid "e.g. br-lan"
++msgstr "例如:br-lan"
++
++msgid "e.g. reject-with tcp-reset"
++msgstr "例如:eject-with tcp-reset"
++
++msgid "max. 16 chars"
++msgstr "最长16个字符"
++
++msgid "reduces rrd size"
++msgstr "å‡å°‘rrd大å°"
++
++msgid "seconds; multiple separated by space"
++msgstr "秒数;多个使用空格分隔"
++
++msgid "server interfaces"
++msgstr "æœåŠ¡å™¨æŽ¥å£"
++
++#~ msgid "Collectd"
++#~ msgstr "Collectd"
++
++#~ msgid "System plugins"
++#~ msgstr "系统æ’件"
++
++#~ msgid ""
++#~ "The statistics package is based on <a href=\"http://collectd.org/index."
++#~ "shtml\">Collectd</a> and uses <a href=\"http://oss.oetiker.ch/rrdtool/"
++#~ "\">RRD Tool</a> to render diagram images from collected data."
++#~ msgstr ""
++#~ "统计软件包是基于<a href=\"http://collectd.org/index.shtml\">Collectd</a>,"
++#~ "并使用<a href=\"http://oss.oetiker.ch/rrdtool/\">RRD工具</a>æ¥æ¸²æŸ“图表,用"
++#~ "于收集数æ®ã€‚"
++
++#~ msgid "group name"
++#~ msgstr "群å称"
+diff --git a/feeds/luci/applications/luci-app-statistics/po/zh-tw/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/zh-tw/rrdtool.po
+new file mode 100644
+index 0000000..9245260
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/zh-tw/rrdtool.po
+@@ -0,0 +1,355 @@
++# rrdtool.pot
++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=ASCII\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++#. %H: Wireless - Signal Noise Ratio
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1
++msgid "stat_dg_title_wireless__signal_noise"
++msgstr ""
++
++#. dBm
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2
++msgid "stat_dg_label_wireless__signal_noise"
++msgstr ""
++
++#. Noise Level
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3
++msgid "stat_ds_signal_noise"
++msgstr ""
++
++#. Signal Strength
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4
++msgid "stat_ds_signal_power"
++msgstr ""
++
++#. %H: Wireless - Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5
++msgid "stat_dg_title_wireless__signal_quality"
++msgstr ""
++
++#. n
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6
++msgid "stat_dg_label_wireless__signal_quality"
++msgstr ""
++
++#. Signal Quality
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7
++msgid "stat_ds_signal_quality"
++msgstr ""
++
++#. %H: ICMP Roundtrip Times
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8
++msgid "stat_dg_title_ping"
++msgstr ""
++
++#. ms
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9
++msgid "stat_dg_label_ping"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10
++msgid "stat_ds_ping"
++msgstr ""
++
++#. %H: Firewall - Processed Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11
++msgid "stat_dg_title_iptables__ipt_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12
++msgid "stat_dg_label_iptables__ipt_packets"
++msgstr ""
++
++#. Chain \"%di\"
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13
++msgid "stat_ds_ipt_packets"
++msgstr ""
++
++#. %H: Netlink - Transfer on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14
++msgid "stat_dg_title_netlink__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15
++msgid "stat_dg_label_netlink__if_octets"
++msgstr ""
++
++#. Bytes (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16
++msgid "stat_ds_if_octets"
++msgstr ""
++
++#. %H: Netlink - Packets on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17
++msgid "stat_dg_title_netlink__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18
++msgid "stat_dg_label_netlink__if_packets"
++msgstr ""
++
++#. Processed (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19
++msgid "stat_ds_if_packets"
++msgstr ""
++
++#. Dropped (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20
++msgid "stat_ds_if_dropped"
++msgstr ""
++
++#. Errors (%ds)
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21
++msgid "stat_ds_if_errors"
++msgstr ""
++
++#. %H: Netlink - Multicast on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22
++msgid "stat_dg_title_netlink__if_multicast"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23
++msgid "stat_dg_label_netlink__if_multicast"
++msgstr ""
++
++#. Packets
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24
++msgid "stat_ds_if_multicast"
++msgstr ""
++
++#. %H: Netlink - Collisions on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25
++msgid "stat_dg_title_netlink__if_collisions"
++msgstr ""
++
++#. Collisions/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26
++msgid "stat_dg_label_netlink__if_collisions"
++msgstr ""
++
++#. Collisions
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27
++msgid "stat_ds_if_collisions"
++msgstr ""
++
++#. %H: Netlink - Errors on %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28
++msgid "stat_dg_title_netlink__if_tx_errors"
++msgstr ""
++
++#. Errors/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29
++msgid "stat_dg_label_netlink__if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30
++msgid "stat_ds_if_tx_errors"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31
++msgid "stat_ds_if_rx_errors"
++msgstr ""
++
++#. %H: Processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32
++msgid "stat_dg_title_processes"
++msgstr ""
++
++#. Processes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33
++msgid "stat_dg_label_processes"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34
++msgid "stat_ds_ps_state"
++msgstr ""
++
++#. %H: Process %pi - used cpu time
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35
++msgid "stat_dg_title_processes__ps_cputime"
++msgstr ""
++
++#. Jiffies
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36
++msgid "stat_dg_label_processes__ps_cputime"
++msgstr ""
++
++#. system
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37
++msgid "stat_ds_ps_cputime__syst"
++msgstr ""
++
++#. user
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38
++msgid "stat_ds_ps_cputime__user"
++msgstr ""
++
++#. %H: Process %pi - threads and processes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39
++msgid "stat_dg_title_processes__ps_count"
++msgstr ""
++
++#. Count
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40
++msgid "stat_dg_label_processes__ps_count"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41
++msgid "stat_ds_ps_count"
++msgstr ""
++
++#. %H: Process %pi - page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42
++msgid "stat_dg_title_processes__ps_pagefaults"
++msgstr ""
++
++#. Pagefaults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43
++msgid "stat_dg_label_processes__ps_pagefaults"
++msgstr ""
++
++#. page faults
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44
++msgid "stat_ds_ps_pagefaults"
++msgstr ""
++
++#. %H: Process %pi - virtual memory size
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45
++msgid "stat_dg_title_processes__ps_rss"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46
++msgid "stat_dg_label_processes__ps_rss"
++msgstr ""
++
++#. virtual memory
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47
++msgid "stat_ds_ps_rss"
++msgstr ""
++
++#. %H: Usage on Processor #%pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48
++msgid "stat_dg_title_cpu"
++msgstr ""
++
++#. %
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49
++msgid "stat_dg_label_cpu"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50
++msgid "stat_ds_cpu"
++msgstr ""
++
++#. %H: Transfer on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51
++msgid "stat_dg_title_interface__if_octets"
++msgstr ""
++
++#. Bytes/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52
++msgid "stat_dg_label_interface__if_octets"
++msgstr ""
++
++#. %H: Packets on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53
++msgid "stat_dg_title_interface__if_packets"
++msgstr ""
++
++#. Packets/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54
++msgid "stat_dg_label_interface__if_packets"
++msgstr ""
++
++#. %H: TCP-Connections to Port %pi
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55
++msgid "stat_dg_title_tcpconns"
++msgstr ""
++
++#. Connections/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56
++msgid "stat_dg_label_tcpconns"
++msgstr ""
++
++#. %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57
++msgid "stat_ds_tcp_connections"
++msgstr ""
++
++#. %H: Disk Space Usage on %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58
++msgid "stat_dg_title_df"
++msgstr ""
++
++#. Bytes
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59
++msgid "stat_dg_label_df"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60
++msgid "stat_ds_df__free"
++msgstr ""
++
++#. %ds
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61
++msgid "stat_ds_df__used"
++msgstr ""
++
++#. %H: Interrupts
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62
++msgid "stat_dg_title_irq"
++msgstr ""
++
++#. Issues/s
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63
++msgid "stat_dg_label_irq"
++msgstr ""
++
++#. IRQ %di
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64
++msgid "stat_ds_irq"
++msgstr ""
++
++#. %H: System Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65
++msgid "stat_dg_title_load"
++msgstr ""
++
++#. Load
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66
++msgid "stat_dg_label_load"
++msgstr ""
++
++#. 1 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67
++msgid "stat_ds_load__shortterm"
++msgstr ""
++
++#. 5 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68
++msgid "stat_ds_load__midterm"
++msgstr ""
++
++#. 15 min
++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69
++msgid "stat_ds_load__longterm"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/po/zh-tw/statistics.po b/feeds/luci/applications/luci-app-statistics/po/zh-tw/statistics.po
+new file mode 100644
+index 0000000..367f567
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/po/zh-tw/statistics.po
+@@ -0,0 +1,671 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Action (target)"
++msgstr ""
++
++msgid "Add command for reading values"
++msgstr ""
++
++msgid "Add matching rule"
++msgstr ""
++
++msgid "Add multiple hosts separated by space."
++msgstr ""
++
++msgid "Add notification command"
++msgstr ""
++
++msgid "Aggregate number of connected users"
++msgstr ""
++
++msgid "Base Directory"
++msgstr ""
++
++msgid "Basic monitoring"
++msgstr ""
++
++msgid "CPU Plugin Configuration"
++msgstr ""
++
++msgid "CSV Output"
++msgstr ""
++
++msgid "CSV Plugin Configuration"
++msgstr ""
++
++msgid "Cache collected data for"
++msgstr ""
++
++msgid "Cache flush interval"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "CollectLinks"
++msgstr ""
++
++msgid "CollectRoutes"
++msgstr ""
++
++msgid "CollectTopology"
++msgstr ""
++
++msgid "Collectd Settings"
++msgstr ""
++
++msgid ""
++"Collectd is a small daemon for collecting data from various sources through "
++"different plugins. On this page you can change general settings for the "
++"collectd daemon."
++msgstr ""
++
++msgid "Conntrack"
++msgstr ""
++
++msgid "Conntrack Plugin Configuration"
++msgstr ""
++
++msgid "DF Plugin Configuration"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS Plugin Configuration"
++msgstr ""
++
++msgid "Data collection interval"
++msgstr ""
++
++msgid "Datasets definition file"
++msgstr ""
++
++msgid "Destination ip range"
++msgstr ""
++
++msgid "Directory for collectd plugins"
++msgstr ""
++
++msgid "Directory for sub-configurations"
++msgstr ""
++
++msgid "Disk Plugin Configuration"
++msgstr ""
++
++msgid "Disk Space Usage"
++msgstr ""
++
++msgid "Disk Usage"
++msgstr ""
++
++msgid "Display Host »"
++msgstr ""
++
++msgid "Display timespan »"
++msgstr ""
++
++msgid "E-Mail Plugin Configuration"
++msgstr ""
++
++msgid "Email"
++msgstr ""
++
++msgid "Enable this plugin"
++msgstr ""
++
++msgid "Entropy"
++msgstr ""
++
++msgid "Entropy Plugin Configuration"
++msgstr ""
++
++msgid "Exec"
++msgstr ""
++
++msgid "Exec Plugin Configuration"
++msgstr ""
++
++msgid "Filter class monitoring"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Flush cache after"
++msgstr ""
++
++msgid "Forwarding between listen and server addresses"
++msgstr ""
++
++msgid "Gather compression statistics"
++msgstr ""
++
++msgid "General plugins"
++msgstr ""
++
++msgid "Generate a separate graph for each logged user"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd in "
++"order to read certain values. The values will be read from stdout."
++msgstr ""
++
++msgid ""
++"Here you can define external commands which will be started by collectd when "
++"certain threshold values have been reached. The values leading to invokation "
++"will be feeded to the the called programs stdin."
++msgstr ""
++
++msgid ""
++"Here you can define various criteria by which the monitored iptables rules "
++"are selected."
++msgstr ""
++
++msgid "Hold Ctrl to select multiple items or to deselect entries."
++msgstr ""
++
++msgid "Host"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IP or hostname where to get the txtinfo output from"
++msgstr ""
++
++msgid "IRQ Plugin Configuration"
++msgstr ""
++
++msgid "Ignore source addresses"
++msgstr ""
++
++msgid "Incoming interface"
++msgstr ""
++
++msgid "Interface Plugin Configuration"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Interrupts"
++msgstr ""
++
++msgid "Interval for pings"
++msgstr ""
++
++msgid "Iptables Plugin Configuration"
++msgstr ""
++
++msgid "Leave unselected to automatically determine interfaces to monitor."
++msgstr ""
++
++msgid "Listen host"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Listener interfaces"
++msgstr ""
++
++msgid "Load Plugin Configuration"
++msgstr ""
++
++msgid "Maximum allowed connections"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory Plugin Configuration"
++msgstr ""
++
++msgid "Monitor all except specified"
++msgstr ""
++
++msgid "Monitor all local listen ports"
++msgstr ""
++
++msgid "Monitor all sensors"
++msgstr ""
++
++msgid "Monitor devices"
++msgstr ""
++
++msgid "Monitor disks and partitions"
++msgstr ""
++
++msgid "Monitor filesystem types"
++msgstr ""
++
++msgid "Monitor hosts"
++msgstr ""
++
++msgid "Monitor interfaces"
++msgstr ""
++
++msgid "Monitor interrupts"
++msgstr ""
++
++msgid "Monitor local ports"
++msgstr ""
++
++msgid "Monitor mount points"
++msgstr ""
++
++msgid "Monitor processes"
++msgstr ""
++
++msgid "Monitor remote ports"
++msgstr ""
++
++msgid "Name of the rule"
++msgstr ""
++
++msgid "Netlink"
++msgstr ""
++
++msgid "Netlink Plugin Configuration"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Plugin Configuration"
++msgstr ""
++
++msgid "Network plugins"
++msgstr ""
++
++msgid "Network protocol"
++msgstr ""
++
++msgid "Number of threads for data collection"
++msgstr ""
++
++msgid "OLSRd"
++msgstr ""
++
++msgid "OLSRd Plugin Configuration"
++msgstr ""
++
++msgid "Only create average RRAs"
++msgstr ""
++
++msgid "OpenVPN"
++msgstr ""
++
++msgid "OpenVPN Plugin Configuration"
++msgstr ""
++
++msgid "OpenVPN status files"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Outgoing interface"
++msgstr ""
++
++msgid "Output plugins"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Ping Plugin Configuration"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Processes Plugin Configuration"
++msgstr ""
++
++msgid "Processes to monitor separated by space"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Qdisc monitoring"
++msgstr ""
++
++msgid "RRD XFiles Factor"
++msgstr ""
++
++msgid "RRD heart beat interval"
++msgstr ""
++
++msgid "RRD step interval"
++msgstr ""
++
++msgid "RRDTool"
++msgstr ""
++
++msgid "RRDTool Plugin Configuration"
++msgstr ""
++
++msgid "Rows per RRA"
++msgstr ""
++
++msgid "Script"
++msgstr ""
++
++msgid "Seconds"
++msgstr ""
++
++msgid "Sensor list"
++msgstr ""
++
++msgid "Sensors"
++msgstr ""
++
++msgid "Sensors Plugin Configuration"
++msgstr ""
++
++msgid "Server host"
++msgstr ""
++
++msgid "Server port"
++msgstr ""
++
++msgid "Setup"
++msgstr ""
++
++msgid "Shaping class monitoring"
++msgstr ""
++
++msgid "Socket file"
++msgstr ""
++
++msgid "Socket group"
++msgstr ""
++
++msgid "Socket permissions"
++msgstr ""
++
++msgid "Source ip range"
++msgstr ""
++
++msgid "Specifies what information to collect about links."
++msgstr ""
++
++msgid "Specifies what information to collect about routes."
++msgstr ""
++
++msgid "Specifies what information to collect about the global topology."
++msgstr ""
++
++msgid "Splash Leases"
++msgstr ""
++
++msgid "Splash Leases Plugin Configuration"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Storage directory"
++msgstr ""
++
++msgid "Storage directory for the csv files"
++msgstr ""
++
++msgid "Store data values as rates instead of absolute values"
++msgstr ""
++
++msgid "Stored timespans"
++msgstr ""
++
++msgid "System Load"
++msgstr ""
++
++msgid "TCP Connections"
++msgstr ""
++
++msgid "TCPConns Plugin Configuration"
++msgstr ""
++
++msgid "TTL for network packets"
++msgstr ""
++
++msgid "TTL for ping packets"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "The NUT plugin reads information about Uninterruptible Power Supplies."
++msgstr ""
++
++msgid ""
++"The OLSRd plugin reads information about meshed networks from the txtinfo "
++"plugin of OLSRd."
++msgstr ""
++
++msgid ""
++"The OpenVPN plugin gathers information about the current vpn connection "
++"status."
++msgstr ""
++
++msgid ""
++"The conntrack plugin collects statistics about the number of tracked "
++"connections."
++msgstr ""
++
++msgid "The cpu plugin collects basic statistics about the processor usage."
++msgstr ""
++
++msgid ""
++"The csv plugin stores collected data in csv file format for further "
++"processing by external programs."
++msgstr ""
++
++msgid ""
++"The df plugin collects statistics about the disk space usage on different "
++"devices, mount points or filesystem types."
++msgstr ""
++
++msgid ""
++"The disk plugin collects detailled usage statistics for selected partitions "
++"or whole disks."
++msgstr ""
++
++msgid ""
++"The dns plugin collects detailled statistics about dns related traffic on "
++"selected interfaces."
++msgstr ""
++
++msgid ""
++"The email plugin creates a unix socket which can be used to transmit email-"
++"statistics to a running collectd daemon. This plugin is primarily intended "
++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can "
++"be used in other ways as well."
++msgstr ""
++
++msgid "The entropy plugin collects statistics about the available entropy."
++msgstr ""
++
++msgid ""
++"The exec plugin starts external commands to read values from or to notify "
++"external processes when certain threshold values have been reached."
++msgstr ""
++
++msgid ""
++"The interface plugin collects traffic statistics on selected interfaces."
++msgstr ""
++
++msgid ""
++"The iptables plugin will monitor selected firewall rules and collect "
++"informations about processed bytes and packets per rule."
++msgstr ""
++
++msgid ""
++"The irq plugin will monitor the rate of issues per second for each selected "
++"interrupt. If no interrupt is selected then all interrupts are monitored."
++msgstr ""
++
++msgid ""
++"The iwinfo plugin collects statistics about wireless signal strength, noise "
++"and quality."
++msgstr ""
++
++msgid "The load plugin collects statistics about the general system load."
++msgstr ""
++
++msgid "The memory plugin collects statistics about the memory usage."
++msgstr ""
++
++msgid ""
++"The netlink plugin collects extended informations like qdisc-, class- and "
++"filter-statistics for selected interfaces."
++msgstr ""
++
++msgid ""
++"The network plugin provides network based communication between different "
++"collectd instances. Collectd can operate both in client and server mode. In "
++"client mode locally collected data is transferred to a collectd server "
++"instance, in server mode the local instance receives data from other hosts."
++msgstr ""
++
++msgid ""
++"The ping plugin will send icmp echo replies to selected hosts and measure "
++"the roundtrip time for each host."
++msgstr ""
++
++msgid ""
++"The processes plugin collects informations like cpu time, page faults and "
++"memory usage of selected processes."
++msgstr ""
++
++msgid ""
++"The rrdtool plugin stores the collected data in rrd database files, the "
++"foundation of the diagrams.<br /><br /><strong>Warning: Setting the wrong "
++"values will result in a very high memory consumption in the temporary "
++"directory. This can render the device unusable!</strong>"
++msgstr ""
++
++msgid ""
++"The sensors plugin uses the Linux Sensors framework to gather environmental "
++"statistics."
++msgstr ""
++
++msgid ""
++"The splash leases plugin uses libuci to collect statistics about splash "
++"leases."
++msgstr ""
++
++msgid ""
++"The statistics package uses <a href=\"https://collectd.org/\">Collectd</a> "
++"to gather data and <a href=\"http://oss.oetiker.ch/rrdtool/\">RRDtool</a> to "
++"render diagram images."
++msgstr ""
++
++msgid ""
++"The tcpconns plugin collects informations about open tcp connections on "
++"selected ports."
++msgstr ""
++
++msgid ""
++"The unixsock plugin creates a unix socket which can be used to read "
++"collected data from a running collectd instance."
++msgstr ""
++
++msgid "The uptime plugin collects statistics about the uptime of the system."
++msgstr ""
++
++msgid ""
++"This section defines on which interfaces collectd will wait for incoming "
++"connections."
++msgstr ""
++
++msgid ""
++"This section defines to which servers the locally collected data is sent to."
++msgstr ""
++
++msgid "Try to lookup fully qualified hostname"
++msgstr ""
++
++msgid "UPS"
++msgstr ""
++
++msgid "UPS Plugin Configuration"
++msgstr ""
++
++msgid "UPS name in NUT ups@host format"
++msgstr ""
++
++msgid "UnixSock"
++msgstr ""
++
++msgid "Unixsock Plugin Configuration"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Uptime Plugin Configuration"
++msgstr ""
++
++msgid "Use improved naming schema"
++msgstr ""
++
++msgid "Used PID file"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Verbose monitoring"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless iwinfo Plugin Configuration"
++msgstr ""
++
++msgid ""
++"You can install additional collectd-mod-* plugins to enable more statistics."
++msgstr ""
++
++msgid "e.g. br-ff"
++msgstr ""
++
++msgid "e.g. br-lan"
++msgstr ""
++
++msgid "e.g. reject-with tcp-reset"
++msgstr ""
++
++msgid "max. 16 chars"
++msgstr ""
++
++msgid "reduces rrd size"
++msgstr ""
++
++msgid "seconds; multiple separated by space"
++msgstr ""
++
++msgid "server interfaces"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-statistics/root/etc/config/luci_statistics b/feeds/luci/applications/luci-app-statistics/root/etc/config/luci_statistics
+new file mode 100644
+index 0000000..de16f29
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/root/etc/config/luci_statistics
+@@ -0,0 +1,156 @@
++# general settings
++
++config statistics 'collectd'
++ option BaseDir '/var/run/collectd'
++ option Include '/etc/collectd/conf.d'
++ option PIDFile '/var/run/collectd.pid'
++ option PluginDir '/usr/lib/collectd'
++ option TypesDB '/usr/share/collectd/types.db'
++ option Interval '30'
++ option ReadThreads '2'
++
++config statistics 'rrdtool'
++ option default_timespan '1hour'
++ option image_width '600'
++ option image_path '/tmp/rrdimg'
++
++# output plugins
++
++config statistics 'collectd_rrdtool'
++ option enable '1'
++ option DataDir '/tmp/rrd'
++ option RRARows '100'
++ option RRASingle '1'
++ option RRATimespans '1hour 1day 1week 1month 1year'
++
++config statistics 'collectd_csv'
++ option enable '0'
++ option StoreRates '0'
++ option DataDir '/tmp'
++
++config statistics 'collectd_email'
++ option enable '0'
++ option SocketFile '/var/run/collectd/email.sock'
++ option SocketGroup 'nogroup'
++
++config statistics 'collectd_logfile'
++ option enable '0'
++ option LogLevel 'notice'
++ option File '/var/log/collectd.log'
++ option Timestamp '1'
++
++config statistics 'collectd_network'
++ option enable '0'
++
++config statistics 'collectd_unixsock'
++ option enable '0'
++ option SocketFile '/var/run/collectd/query.sock'
++ option SocketGroup 'nogroup'
++
++# input plugins
++
++config statistics 'collectd_conntrack'
++ option enable '0'
++
++config statistics 'collectd_cpu'
++ option enable '0'
++
++config statistics 'collectd_df'
++ option enable '0'
++ option Devices '/dev/mtdblock/4'
++ option MountPoints '/jffs'
++ option FSTypes 'tmpfs'
++ option IgnoreSelected '0'
++
++config statistics 'collectd_disk'
++ option enable '0'
++ option Disks 'hda1 hdb'
++ option IgnoreSelected '0'
++
++config statistics 'collectd_dns'
++ option enable '0'
++ option Interfaces 'br-lan'
++ option IgnoreSources '127.0.0.1'
++
++config statistics 'collectd_entropy'
++ option enable '0'
++
++config statistics 'collectd_exec'
++ option enable '0'
++
++config statistics 'collectd_interface'
++ option enable '1'
++ option Interfaces 'br-lan'
++ option IgnoreSelected '0'
++
++config statistics 'collectd_iptables'
++ option enable '0'
++
++config collectd_iptables_match
++ option table 'nat'
++ option chain 'luci_fw_postrouting'
++ option target 'MASQUERADE'
++ option source '192.168.1.0/24'
++ option outputif 'br-ff'
++ option name 'LAN-Clients traffic'
++
++config collectd_iptables_match
++ option chain 'luci_fw_postrouting'
++ option table 'nat'
++ option target 'MASQUERADE'
++ option source '10.61.230.0/24'
++ option outputif 'br-ff'
++ option name 'WLAN-Clients traffic'
++
++config statistics 'collectd_irq'
++ option enable '0'
++ option Irqs '2 3 4 7'
++
++config statistics 'collectd_iwinfo'
++ option enable '1'
++
++config statistics 'collectd_load'
++ option enable '1'
++
++config statistics 'collectd_memory'
++ option enable '0'
++
++config statistics 'collectd_netlink'
++ option enable '0'
++ option IgnoreSelected '0'
++ option VerboseInterfaces 'br-lan'
++ option QDiscs 'br-lan'
++
++config statistics 'collectd_nut'
++ option enable '0'
++ option UPS 'myupsname'
++
++config statistics 'collectd_olsrd'
++ option enable '0'
++ option Port '2006'
++ option Host '127.0.0.1'
++
++config statistics 'collectd_ping'
++ option enable '0'
++ option TTL '127'
++ option Interval '30'
++ option Hosts '127.0.0.1'
++
++config statistics 'collectd_processes'
++ option enable '0'
++ option Processes 'uhttpd dnsmasq dropbear'
++
++config statistics 'collectd_sensors'
++ option enable '0'
++
++config statistics 'collectd_splash_leases'
++ option enable '0'
++
++config statistics 'collectd_tcpconns'
++ option enable '0'
++ option ListeningPorts '0'
++ option LocalPorts '22 80'
++
++config statistics 'collectd_uptime'
++ option enable '0'
++
+diff --git a/feeds/luci/applications/luci-app-statistics/root/etc/init.d/luci_statistics b/feeds/luci/applications/luci-app-statistics/root/etc/init.d/luci_statistics
+new file mode 100755
+index 0000000..ab75b69
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/root/etc/init.d/luci_statistics
+@@ -0,0 +1,25 @@
++#!/bin/sh /etc/rc.common
++START=79
++
++start() {
++ ### replace shipped config with symlink
++ mkdir -p /var/etc
++ if [ ! -L /etc/collectd.conf ]; then
++ test -f /etc/collectd.conf && mv /etc/collectd.conf /etc/collectd.conf.bak
++ ln -s /var/etc/collectd.conf /etc/collectd.conf
++ fi
++
++ ### create config
++ /usr/bin/stat-genconfig > /var/etc/collectd.conf
++
++ ### workaround broken permissions on /tmp
++ chmod 1777 /tmp
++}
++
++restart() {
++ ### regenerate config / prepare environment
++ start
++
++ ### restart collectd
++ /etc/init.d/collectd restart
++}
+diff --git a/feeds/luci/applications/luci-app-statistics/root/etc/uci-defaults/luci-statistics b/feeds/luci/applications/luci-app-statistics/root/etc/uci-defaults/luci-statistics
+new file mode 100755
+index 0000000..28e3529
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/root/etc/uci-defaults/luci-statistics
+@@ -0,0 +1,16 @@
++#!/bin/sh
++
++# register commit handler
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@luci_statistics[-1]
++ add ucitrack luci_statistics
++ set ucitrack.@luci_statistics[-1].init=luci_statistics
++ commit ucitrack
++EOF
++
++# symlink for busybox httpd
++[ -x /usr/sbin/httpd ] && [ ! -h /www/rrdimg ] && \
++ ln -s /tmp/rrdimg /www/rrdimg
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-statistics/root/usr/bin/stat-genconfig b/feeds/luci/applications/luci-app-statistics/root/usr/bin/stat-genconfig
+new file mode 100755
+index 0000000..49d8a09
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-statistics/root/usr/bin/stat-genconfig
+@@ -0,0 +1,456 @@
++#!/usr/bin/lua
++
++--[[
++
++Luci statistics - collectd configuration generator
++(c) 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++$Id$
++
++]]--
++
++
++require("luci.model.uci")
++require("luci.sys.iptparser")
++require("luci.util")
++
++local ipt = luci.sys.iptparser.IptParser()
++local uci = luci.model.uci.cursor()
++local sections = uci:get_all( "luci_statistics" )
++
++
++function print(...)
++ nixio.stdout:write(...)
++ nixio.stdout:write("\n")
++end
++
++function section( plugin )
++
++ local config = sections[ "collectd_" .. plugin ] or sections["collectd"]
++
++ if type(config) == "table" and ( plugin == "collectd" or config.enable == "1" ) then
++
++ local params = ""
++
++ if type( plugins[plugin] ) == "function" then
++ params = plugins[plugin]( config )
++ else
++ params = config_generic( config, plugins[plugin][1], plugins[plugin][2], plugins[plugin][3], plugin == "collectd" )
++ end
++
++
++ if plugin ~= "collectd" then
++ print( "LoadPlugin " .. plugin )
++
++ if params:len() > 0 then
++ print( "<Plugin " .. plugin .. ">\n" .. params .. "</Plugin>\n" )
++ else
++ print( "" )
++ end
++ else
++ print( params .. "\n" )
++ end
++ end
++end
++
++function config_generic( c, singles, bools, lists, nopad )
++ local str = ""
++
++ if type(c) == "table" then
++
++ if type(singles) == "table" then
++ for i, key in ipairs( singles ) do
++ if preprocess[key] then
++ c[key] = preprocess[key](c[key])
++ end
++
++ str = str .. _string( c[key], key, nopad )
++ end
++ end
++
++ if type(bools) == "table" then
++ for i, key in ipairs( bools ) do
++ if preprocess[key] then
++ c[key] = preprocess[key](c[key])
++ end
++
++ str = str .. _bool( c[key], key, nopad )
++ end
++ end
++
++ if type(lists) == "table" then
++ str = str .. _list_expand( c, lists, nopad )
++ end
++ end
++
++ return str
++end
++
++function config_exec( c )
++ local str = ""
++
++ for s in pairs(sections) do
++ for key, type in pairs({ Exec="collectd_exec_input", NotificationExec="collectd_exec_notify" }) do
++ if sections[s][".type"] == type then
++
++ cmd = sections[s].cmdline
++
++ if cmd then
++ cmd = cmd:gsub("^%s+", ""):gsub("%s+$", "")
++ user = sections[s].cmduser or "nobody"
++ group = sections[s].cmdgroup
++
++ str = str .. "\t" .. key .. ' "' ..
++ user .. ( group and ":" .. group or "" ) .. '" "' ..
++ cmd:gsub('%s+', '" "') .. '"\n'
++ end
++ end
++ end
++ end
++
++ return str
++end
++
++function config_iptables( c )
++ local str = ""
++
++ for s in pairs(sections) do
++ if sections[s][".type"] == "collectd_iptables_match" then
++
++ search = { }
++
++ for i, k in ipairs( {
++ "table", "chain", "target", "protocol", "source", "destination",
++ "inputif", "outputif", "options"
++ } ) do
++ v = sections[s][k]
++
++ if type(v) == "string" then
++ if k == "options" then v = luci.util.split( v, "%s+", nil, true ) end
++ search[k] = v
++ end
++ end
++
++ for i, rule in ipairs( ipt:find( search ) ) do
++
++ name = sections[s].name:gsub( "%s+", "_" )
++ if i > 1 then name = name .. "_(" .. i .. ")" end
++
++ str = str .. "\tChain " .. rule.table .. " " .. rule.chain .. " " .. rule.index .. ' "' .. name .. "\"\n"
++ end
++ end
++ end
++
++ return str
++end
++
++function config_network( c )
++ local str = ""
++
++ for s in pairs(sections) do
++ for key, type in pairs({ Listen="collectd_network_listen", Server="collectd_network_server" }) do
++ if sections[s][".type"] == type then
++
++ host = sections[s].host
++ port = sections[s].port
++
++ if host then
++ if port then
++ str = str .. "\t" .. key .. " \"" .. host .. "\" \"" .. port .. "\"\n"
++ else
++ str = str .. "\t" .. key .. " \"" .. host .. "\"\n"
++ end
++ end
++ end
++ end
++ end
++
++ return str .. _string( c["TimeToLive"], "TimeToLive" )
++ .. _string( c["CacheFlush"], "CacheFlush" )
++ .. _bool( c["Forward"], "Forward" )
++end
++
++
++function _list_expand( c, l, nopad )
++ local str = ""
++
++ for i, n in ipairs(l) do
++ if c[n] then
++ if preprocess[n] then
++ c[n] = preprocess[n](c[n])
++ end
++
++ if n:find("(%w+)ses") then
++ k = n:gsub("(%w+)ses$", "%1s")
++ else
++ k = n:gsub("(%w+)s$", "%1")
++ end
++
++ str = str .. _expand( c[n], k, nopad )
++ end
++ end
++
++ return str
++end
++
++function _expand( s, n, nopad )
++ local str = ""
++
++ if type(s) == "string" then
++ for i, v in ipairs( luci.util.split( s, "%s+", nil, true ) ) do
++ str = str .. _string( v, n, nopad )
++ end
++ elseif type(s) == "table" then
++ for i, v in ipairs(s) do
++ str = str .. _string( v, n, nopad )
++ end
++ end
++
++ return str
++end
++
++function _bool( s, n, nopad )
++
++ local str = ""
++ local pad = ""
++ if not nopad then pad = "\t" end
++
++ if s and s == "1" then
++ str = pad .. n .. " true"
++ else
++ str = pad .. n .. " false"
++ end
++
++ return str .. "\n"
++end
++
++function _string( s, n, nopad )
++
++ local str = ""
++ local pad = ""
++ if not nopad then pad = "\t" end
++
++ if s then
++ if s:find("[^%d]") or n == "Port" then
++ if not s:find("[^%w]") and n ~= "Port" then
++ str = pad .. n .. " " .. luci.util.trim(s)
++ else
++ str = pad .. n .. ' "' .. luci.util.trim(s) .. '"'
++ end
++ else
++ str = pad .. n .. " " .. luci.util.trim(s)
++ end
++
++ str = str .. "\n"
++ end
++
++ return str
++end
++
++
++plugins = {
++ collectd = {
++ { "BaseDir", "Include", "PIDFile", "PluginDir", "TypesDB", "Interval", "ReadThreads", "Hostname" },
++ { },
++ { }
++ },
++
++ conntrack = {
++ { },
++ { },
++ { }
++ },
++
++ cpu = {
++ { },
++ { },
++ { }
++ },
++
++ csv = {
++ { "DataDir" },
++ { "StoreRates" },
++ { }
++ },
++
++ df = {
++ { },
++ { "IgnoreSelected" },
++ { "Devices", "MountPoints", "FSTypes" }
++ },
++
++ disk = {
++ { },
++ { "IgnoreSelected" },
++ { "Disks" }
++ },
++
++ dns = {
++ { },
++ { },
++ { "Interfaces", "IgnoreSources" }
++ },
++
++ email = {
++ { "SocketFile", "SocketGroup", "SocketPerms", "MaxConns" },
++ { },
++ { }
++ },
++
++ entropy = {
++ { },
++ { },
++ { }
++ },
++
++ exec = config_exec,
++
++ interface = {
++ { },
++ { "IgnoreSelected" },
++ { "Interfaces" }
++ },
++
++ iptables = config_iptables,
++
++ irq = {
++ { },
++ { "IgnoreSelected" },
++ { "Irqs" }
++ },
++
++ iwinfo = {
++ { },
++ { "IgnoreSelected" },
++ { "Interfaces" }
++ },
++
++ load = {
++ { },
++ { },
++ { }
++ },
++
++ logfile = {
++ { "LogLevel", "File" },
++ { "Timestamp" },
++ { }
++ },
++
++ madwifi = {
++ { "WatchSet" },
++ { },
++ { "Interfaces", "WatchAdds" }
++ },
++
++ memory = {
++ { },
++ { },
++ { }
++ },
++
++ netlink = {
++ { },
++ { "IgnoreSelected" },
++ { "Interfaces", "VerboseInterfaces", "QDiscs", "Classes", "Filters" }
++ },
++
++ network = config_network,
++
++ nut = {
++ { "UPS" },
++ { },
++ { }
++ },
++
++ olsrd = {
++ { "Host", "Port", "CollectLinks","CollectRoutes","CollectTopology"},
++ { },
++ { }
++ },
++
++ openvpn = {
++ { },
++ { "CollectIndividualUsers", "CollectUserCount", "CollectCompression", "ImprovedNamingSchema" },
++ { "StatusFile" }
++ },
++
++ ping = {
++ { "TTL", "Interval" },
++ { },
++ { "Hosts" }
++ },
++
++ processes = {
++ { },
++ { },
++ { "Processes" }
++ },
++
++ rrdtool = {
++ { "DataDir", "StepSize", "HeartBeat", "RRARows", "XFF", "CacheFlush", "CacheTimeout" },
++ { "RRASingle" },
++ { "RRATimespans" }
++ },
++
++ sensors = {
++ { },
++ { "IgnoreSelected" },
++ { "Sensor" }
++ },
++
++ splash_leases = {
++ { },
++ { },
++ { }
++ },
++
++ tcpconns = {
++ { },
++ { "ListeningPorts" },
++ { "LocalPorts", "RemotePorts" }
++ },
++
++ unixsock = {
++ { "SocketFile", "SocketGroup", "SocketPerms" },
++ { },
++ { }
++ },
++
++ uptime = {
++ { },
++ { },
++ { }
++ },
++
++ wireless = {
++ { },
++ { },
++ { }
++ },
++}
++
++preprocess = {
++ RRATimespans = function(val)
++ local rv = { }
++ for time in val:gmatch("[^%s]+") do
++ table.insert( rv, luci.util.parse_units(time) )
++ end
++ return table.concat(rv, " ")
++ end
++}
++
++
++section("collectd")
++
++for plugin in pairs(plugins) do
++ if plugin ~= "collectd" then
++ section( plugin )
++ end
++end
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/Makefile b/feeds/luci/applications/luci-app-tinyproxy/Makefile
+new file mode 100644
+index 0000000..02751b8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Tinyproxy - HTTP(S)-Proxy configuration
++LUCI_DEPENDS:=+tinyproxy
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/luasrc/controller/tinyproxy.lua b/feeds/luci/applications/luci-app-tinyproxy/luasrc/controller/tinyproxy.lua
+new file mode 100644
+index 0000000..cf7e974
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/luasrc/controller/tinyproxy.lua
+@@ -0,0 +1,15 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.tinyproxy", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/tinyproxy") then
++ return
++ end
++
++ entry({"admin", "services", "tinyproxy"}, alias("admin", "services", "tinyproxy", "config"), _("Tinyproxy"))
++ entry({"admin", "services", "tinyproxy", "status"}, template("tinyproxy_status"), _("Status"))
++ entry({"admin", "services", "tinyproxy", "config"}, cbi("tinyproxy"), _("Configuration"))
++end
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua b/feeds/luci/applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua
+new file mode 100644
+index 0000000..19bdd9a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua
+@@ -0,0 +1,239 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008-2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("tinyproxy", translate("Tinyproxy"),
++ translate("Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"))
++
++s = m:section(TypedSection, "tinyproxy", translate("Server Settings"))
++s.anonymous = true
++
++s:tab("general", translate("General settings"))
++s:tab("privacy", translate("Privacy settings"))
++s:tab("filter", translate("Filtering and ACLs"))
++s:tab("limits", translate("Server limits"))
++
++
++o = s:taboption("general", Flag, "enabled", translate("Enable Tinyproxy server"))
++o.rmempty = false
++
++function o.write(self, section, value)
++ if value == "1" then
++ luci.sys.init.enable("tinyproxy")
++ else
++ luci.sys.init.disable("tinyproxy")
++ end
++
++ return Flag.write(self, section, value)
++end
++
++
++o = s:taboption("general", Value, "Port", translate("Listen port"),
++ translate("Specifies the HTTP port Tinyproxy is listening on for requests"))
++
++o.optional = true
++o.datatype = "port"
++o.placeholder = 8888
++
++
++o = s:taboption("general", Value, "Listen", translate("Listen address"),
++ translate("Specifies the addresses Tinyproxy is listening on for requests"))
++
++o.optional = true
++o.datatype = "ipaddr"
++o.placeholder = "0.0.0.0"
++
++
++o = s:taboption("general", Value, "Bind", translate("Bind address"),
++ translate("Specifies the address Tinyproxy binds to for outbound forwarded requests"))
++
++o.optional = true
++o.datatype = "ipaddr"
++o.placeholder = "0.0.0.0"
++
++
++o = s:taboption("general", Value, "DefaultErrorFile", translate("Error page"),
++ translate("HTML template file to serve when HTTP errors occur"))
++
++o.optional = true
++o.default = "/usr/share/tinyproxy/default.html"
++
++
++o = s:taboption("general", Value, "StatFile", translate("Statistics page"),
++ translate("HTML template file to serve for stat host requests"))
++
++o.optional = true
++o.default = "/usr/share/tinyproxy/stats.html"
++
++
++o = s:taboption("general", Flag, "Syslog", translate("Use syslog"),
++ translate("Writes log messages to syslog instead of a log file"))
++
++
++o = s:taboption("general", Value, "LogFile", translate("Log file"),
++ translate("Log file to use for dumping messages"))
++
++o.default = "/var/log/tinyproxy.log"
++o:depends("Syslog", "")
++
++
++o = s:taboption("general", ListValue, "LogLevel", translate("Log level"),
++ translate("Logging verbosity of the Tinyproxy process"))
++
++o:value("Critical")
++o:value("Error")
++o:value("Warning")
++o:value("Notice")
++o:value("Connect")
++o:value("Info")
++
++
++o = s:taboption("general", Value, "User", translate("User"),
++ translate("Specifies the user name the Tinyproxy process is running as"))
++
++o.default = "nobody"
++
++
++o = s:taboption("general", Value, "Group", translate("Group"),
++ translate("Specifies the group name the Tinyproxy process is running as"))
++
++o.default = "nogroup"
++
++
++--
++-- Privacy
++--
++
++o = s:taboption("privacy", Flag, "XTinyproxy", translate("X-Tinyproxy header"),
++ translate("Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded requests"))
++
++
++o = s:taboption("privacy", Value, "ViaProxyName", translate("Via hostname"),
++ translate("Specifies the Tinyproxy hostname to use in the Via HTTP header"))
++
++o.placeholder = "tinyproxy"
++o.datatype = "hostname"
++
++
++s:taboption("privacy", DynamicList, "Anonymous", translate("Header whitelist"),
++ translate("Specifies HTTP header names which are allowed to pass-through, all others are discarded. Leave empty to disable header filtering"))
++
++
++--
++-- Filter
++--
++
++o = s:taboption("filter", DynamicList, "Allow", translate("Allowed clients"),
++ translate("List of IP addresses or ranges which are allowed to use the proxy server"))
++
++o.placeholder = "0.0.0.0"
++o.datatype = "ipaddr"
++
++
++o = s:taboption("filter", DynamicList, "ConnectPort", translate("Allowed connect ports"),
++ translate("List of allowed ports for the CONNECT method. A single value \"0\" allows all ports"))
++
++o.placeholder = 0
++o.datatype = "port"
++
++
++s:taboption("filter", FileUpload, "Filter", translate("Filter file"),
++ translate("Plaintext file with URLs or domains to filter. One entry per line"))
++
++
++s:taboption("filter", Flag, "FilterURLs", translate("Filter by URLs"),
++ translate("By default, filtering is done based on domain names. Enable this to match against URLs instead"))
++
++
++s:taboption("filter", Flag, "FilterExtended", translate("Filter by RegExp"),
++ translate("By default, basic POSIX expressions are used for filtering. Enable this to activate extended regular expressions"))
++
++
++ s:taboption("filter", Flag, "FilterCaseSensitive", translate("Filter case-sensitive"),
++ translate("By default, filter strings are treated as case-insensitive. Enable this to make the matching case-sensitive"))
++
++
++s:taboption("filter", Flag, "FilterDefaultDeny", translate("Default deny"),
++ translate("By default, the filter rules act as blacklist. Enable this option to only allow matched URLs or domain names"))
++
++
++--
++-- Limits
++--
++
++o = s:taboption("limits", Value, "Timeout", translate("Connection timeout"),
++ translate("Maximum number of seconds an inactive connection is held open"))
++
++o.optional = true
++o.datatype = "uinteger"
++o.default = 600
++
++
++o = s:taboption("limits", Value, "MaxClients", translate("Max. clients"),
++ translate("Maximum allowed number of concurrently connected clients"))
++
++o.datatype = "uinteger"
++o.default = 10
++
++
++o = s:taboption("limits", Value, "MinSpareServers", translate("Min. spare servers"),
++ translate("Minimum number of prepared idle processes"))
++
++o.datatype = "uinteger"
++o.default = 5
++
++
++o = s:taboption("limits", Value, "MaxSpareServers", translate("Max. spare servers"),
++ translate("Maximum number of prepared idle processes"))
++
++o.datatype = "uinteger"
++o.default = 10
++
++
++o = s:taboption("limits", Value, "StartServers", translate("Start spare servers"),
++ translate("Number of idle processes to start when launching Tinyproxy"))
++
++o.datatype = "uinteger"
++o.default = 5
++
++
++o = s:taboption("limits", Value, "MaxRequestsPerChild", translate("Max. requests per server"),
++ translate("Maximum allowed number of requests per process. If it is exeeded, the process is restarted. Zero means unlimited."))
++
++o.datatype = "uinteger"
++o.default = 0
++
++
++--
++-- Upstream
++--
++
++s = m:section(TypedSection, "upstream", translate("Upstream Proxies"),
++ translate("Upstream proxy rules define proxy servers to use when accessing certain IP addresses or domains."))
++
++s.anonymous = true
++s.addremove = true
++
++
++t = s:option(ListValue, "type", translate("Policy"),
++ translate("<em>Via proxy</em> routes requests to the given target via the specifed upstream proxy, <em>Reject access</em> disables any upstream proxy for the target"))
++
++t:value("proxy", translate("Via proxy"))
++t:value("reject", translate("Reject access"))
++
++
++ta = s:option(Value, "target", translate("Target host"),
++ translate("Can be either an IP address or range, a domain name or \".\" for any host without domain"))
++
++ta.rmempty = true
++ta.placeholder = "0.0.0.0/0"
++ta.datatype = "host"
++
++
++v = s:option(Value, "via", translate("Via proxy"),
++ translate("Specifies the upstream proxy to use for accessing the target host. Format is <code>address:port</code>"))
++
++v:depends({type="proxy"})
++v.placeholder = "10.0.0.1:8080"
++
++return m
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/luasrc/view/tinyproxy_status.htm b/feeds/luci/applications/luci-app-tinyproxy/luasrc/view/tinyproxy_status.htm
+new file mode 100644
+index 0000000..d43a887
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/luasrc/view/tinyproxy_status.htm
+@@ -0,0 +1,50 @@
++<%
++
++if luci.http.formvalue("frame") == "1" then
++ local uci = require "luci.model.uci".cursor()
++ local addr = "127.0.0.1"
++ local port = "8888"
++
++ uci:foreach("tinyproxy", "tinyproxy",
++ function(s)
++ addr = s.StatHost or addr
++ port = s.Port or port
++ return false
++ end)
++
++ local data = false
++ local wget = io.popen("wget -qO- http://%s:%s" % { addr, port })
++ if wget then
++ while true do
++ local l = wget:read("*l")
++ if not l then
++ break
++ end
++
++ luci.http.write(l)
++ data = true
++ end
++
++ wget:close()
++ end
++
++ if not data then
++ luci.http.write(translate("Failed to retrieve statistics from url:"))
++ luci.http.write(" http://%s:%s" % { addr, port })
++ end
++
++ return
++end
++
++-%>
++
++<%+header%>
++
++<div class="cbi-map">
++ <h2 name="content"><%:Tinyproxy Status%></h2>
++ <div class="cbi-section">
++ <iframe src="<%=REQUESTURL%>?frame=1" style="width:100%; height:350px; border:none"></iframe>
++ </div>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/ca/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/ca/tinyproxy.po
+new file mode 100644
+index 0000000..69cd99e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/ca/tinyproxy.po
+@@ -0,0 +1,339 @@
++# tinyproxy.pot
++# generated from ./applications/luci-tinyproxy/luasrc/i18n/tinyproxy.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-07-18 00:04+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr "Clients permesos"
++
++msgid "Allowed connect ports"
++msgstr "Ports de connexió permesos"
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr "Configuració"
++
++msgid "Connection timeout"
++msgstr "Temps d'espera de connexió"
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr "Habilita el servidor Tinyproxy"
++
++msgid "Error page"
++msgstr "Pàgina d'error"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr "Filtra per expressió regular"
++
++msgid "Filter by URLs"
++msgstr "Filtra per adreça"
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr "Fitxer de filtració"
++
++msgid "Filtering and ACLs"
++msgstr "Filtració i ACLs"
++
++msgid "General settings"
++msgstr "Ajusts generals"
++
++msgid "Group"
++msgstr "Grup"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr "Llista blanca de capçaleres"
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++"Llista d'adreces IP o rangs dels quals es permeten utilitzar el servidor "
++"intermediari"
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++"Llista de ports permesos per al mètode CONNECT. El valor solter \"0\" permet "
++"tots els ports"
++
++msgid "Listen address"
++msgstr "Adreça d'escolta"
++
++msgid "Listen port"
++msgstr "Port d'escolta"
++
++msgid "Log file"
++msgstr "Fitxer de registre"
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr "Nivell de registre"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr "Màx servidors spare"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr "Mín servidors spare"
++
++msgid "Minimum number of prepared idle processes"
++msgstr "Nombre mínim de processos ociosos preparats"
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr "Nombre de processos ociosos que iniciar al iniciar el Tinyproxy"
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr "Política"
++
++msgid "Privacy settings"
++msgstr "Ajusts de privacitat"
++
++msgid "Reject access"
++msgstr "Rebutja accés"
++
++msgid "Server Settings"
++msgstr "Ajusts de servidor"
++
++msgid "Server limits"
++msgstr "Límits de servidor"
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr "Pàgina d'estadístiques"
++
++msgid "Status"
++msgstr "Estat"
++
++msgid "Target host"
++msgstr "Màquina destí"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr "Estat de Tinyproxy"
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr "Tinyproxy és un proxy HTTP no caché petit i ràpid"
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr "Utilitza el syslog"
++
++msgid "User"
++msgstr "Usuari"
++
++msgid "Via hostname"
++msgstr "Via nom de host"
++
++msgid "Via proxy"
++msgstr "Via proxy"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++"Escriu els missatges de registre al syslog en lloc d'un fitxer de registre"
++
++msgid "X-Tinyproxy header"
++msgstr "Capçalera X-Tinyproxy"
++
++#~ msgid "Allow access from"
++#~ msgstr "Permet l'accés des de"
++
++#~ msgid "Allowed headers for anonymous proxy"
++#~ msgstr "Capçaleres permeses pel proxy anònim"
++
++#~ msgid "Bind outgoing traffic to address"
++#~ msgstr "Vincula el tràfic sortint a l'adreça"
++
++#~ msgid "Ports allowed for CONNECT method"
++#~ msgstr "Ports permesos pel mètode CONNECT"
++
++#~ msgid "0 = disabled, empty = all"
++#~ msgstr "0 = desactivats, buit = tots"
++
++#~ msgid "Error document"
++#~ msgstr "Document d'error"
++
++#~ msgid "Filter list"
++#~ msgstr "Llista de filtre"
++
++#~ msgid "Case sensitive filters"
++#~ msgstr "Filtres distingint majúscules i minúscules"
++
++#~ msgid "Filter list is a whitelist"
++#~ msgstr "La llista de filtre és una llista blanca"
++
++#~ msgid "Extended regular expression filters"
++#~ msgstr "Filtres d'expressions regulars exteses"
++
++#~ msgid "Filter URLs instead of domains"
++#~ msgstr "Filtra URLs en comptes de dominis"
++
++#~ msgid "Listen on address"
++#~ msgstr "Escolta a l'adreça"
++
++#~ msgid "Logfile"
++#~ msgstr "Fitxer de registre"
++
++#~ msgid "Maximum number of clients"
++#~ msgstr "Màxim número de clients"
++
++#~ msgid "Maximum requests per thread"
++#~ msgstr "Màximes peticions per fil"
++
++#~ msgid "Spare servers to start with"
++#~ msgstr "Servidors spare amb els que començar"
++
++#~ msgid "Statistic document"
++#~ msgstr "Document estadístic"
++
++#~ msgid "Write to syslog"
++#~ msgstr "Escriu al syslog"
++
++#~ msgid "Connection Timeout"
++#~ msgstr "Temps d'espera excedit"
++
++#~ msgid "Value of Via-Header"
++#~ msgstr "Valor de Via-Header"
++
++#~ msgid "Include client IP"
++#~ msgstr "Inclou client IP"
++
++#~ msgid "Upstream Control"
++#~ msgstr "Control de pujada"
++
++#~ msgid "Type"
++#~ msgstr "Tipus"
++
++#~ msgid "Upstream Proxy"
++#~ msgstr "Proxy de pujada"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/cs/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/cs/tinyproxy.po
+new file mode 100644
+index 0000000..2a2cbdc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/cs/tinyproxy.po
+@@ -0,0 +1,258 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-12 20:14+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr "Konfigurace"
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr "Povolit server Tinyproxy"
++
++msgid "Error page"
++msgstr "Chybová stránka"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr "Filtrovat podle RegExp"
++
++msgid "Filter by URLs"
++msgstr "Filtrovat podle URL adres"
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr "Obecné nastavení"
++
++msgid "Group"
++msgstr "Skupina"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr "Max. klientů"
++
++msgid "Max. requests per server"
++msgstr "Max. žádostí na server"
++
++msgid "Max. spare servers"
++msgstr "Max. záložních serverů"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr "Min. záložních serverů"
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr "Politika"
++
++msgid "Privacy settings"
++msgstr "Nastavení soukromí"
++
++msgid "Reject access"
++msgstr "Odepřít přístup"
++
++msgid "Server Settings"
++msgstr "Nastavení serveru"
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr "Stránka statistik"
++
++msgid "Status"
++msgstr "Stav"
++
++msgid "Target host"
++msgstr "Cílový hostitel"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr "Stav Tinyproxy"
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr "Tinyproxy je malý a rychlý necachující HTTP(S)-Proxy server"
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr "Použít syslog"
++
++msgid "User"
++msgstr "Uživatel"
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr "X-Tinyproxy hlaviÄka"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/de/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/de/tinyproxy.po
+new file mode 100644
+index 0000000..d444872
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/de/tinyproxy.po
+@@ -0,0 +1,373 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2012-11-28 10:52+0200\n"
++"Last-Translator: dunkelschunkel <dunkelschunkel@googlemail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++"<em>Via Proxy</em> leitet Anfragen an das gegebene Ziel über den angegebenen "
++"Upstream-Proxy, <em>Zugriff verweigern</em> deaktiviert jegliche Proxies für "
++"das Ziel"
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++"Fügt eine \"X-Tinyproxy\" HTTP-Headerzeile mit der Client Adresse in "
++"weitergeleitete Anfragen ein"
++
++msgid "Allowed clients"
++msgstr "Erlaubte Clients"
++
++msgid "Allowed connect ports"
++msgstr "Erlaubte Verbindungsports"
++
++msgid "Bind address"
++msgstr "Serveradresse"
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++"Standardmäßig werden einfache POSIX Ausdrücke für die Filterung genutzt, "
++"diese Option aktiviert erweiterte reguläre Ausdrücke"
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++"Standardmäßig spielt die Groß- und Kleinschreibung bei der Filterung keine "
++"Rolle, diese Option aktiviert die Unterscheidung von Groß- und "
++"Kleinschreibung"
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++"Standardmäßig basiert die Filterung auf Domainnamen, diese Option aktiviert "
++"das Filtern gegen die volle URL"
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++"Standardmäßig fungieren die Filterregeln als Blacklist, diese Option kehrt "
++"diese in eine Whitelist um und lässt nur treffende URLs oder Domains zu"
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++"Kann entweder eine IP-Adresse, ein Domain-Name oder \".\" für jegliche Hosts "
++"sein"
++
++msgid "Configuration"
++msgstr "Konfiguration"
++
++msgid "Connection timeout"
++msgstr "Verbindungstimeout"
++
++msgid "Default deny"
++msgstr "Standardmäßig verbieten"
++
++msgid "Enable Tinyproxy server"
++msgstr "Tinyproxy Server aktivieren"
++
++msgid "Error page"
++msgstr "Fehlerseite"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr "Empfangen der Statiken von URL fehlgeschlagen"
++
++msgid "Filter by RegExp"
++msgstr "Filtern nach RegExp"
++
++msgid "Filter by URLs"
++msgstr "Filtern nach URLs"
++
++msgid "Filter case-sensitive"
++msgstr "Filtern nach Groß-/Kleinschreibung"
++
++msgid "Filter file"
++msgstr "Filterdatei"
++
++msgid "Filtering and ACLs"
++msgstr "Filterung und Zugriffsregeln"
++
++msgid "General settings"
++msgstr "Allgemeine Einstellungen"
++
++msgid "Group"
++msgstr "Gruppe"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr "HTML-Vorlage für Statistikseiten"
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr "HTML-Vorlage für Fehlerseiten"
++
++msgid "Header whitelist"
++msgstr "Headerzeilen-Whitelist"
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++"Liste von IP-Adressen oder Netzbereichen welche diesen Server nutzen dürfen"
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++"Liste erlaubter Ports für \"CONNECT\" Anfragen. Ein einzelner Wert \"0\" "
++"erlaubt alle Ports"
++
++msgid "Listen address"
++msgstr "Serveradresse"
++
++msgid "Listen port"
++msgstr "Serverport"
++
++msgid "Log file"
++msgstr "Protokolldatei"
++
++msgid "Log file to use for dumping messages"
++msgstr "Gibt die Datei an, in welche Protokollausgaben geschrieben werden"
++
++msgid "Log level"
++msgstr "Protokolllevel"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr "Umfang der Tinyproxy Protokollmeldungen"
++
++msgid "Max. clients"
++msgstr "Max. Clients"
++
++msgid "Max. requests per server"
++msgstr "Max. Anfragen pro Server"
++
++msgid "Max. spare servers"
++msgstr "Max. Prozesszahl"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr "Maximal erlaubte Anzahl gleichzeitig verbundener Clients"
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++"Maximal erlaubte Anzahl an Anfragen pro Prozess. Wenn diese erreicht wird, "
++"startet der Prozess neu. Null bedeutet unlimitiert."
++
++msgid "Maximum number of prepared idle processes"
++msgstr "Maximale Anzahl an vorgehaltenen Leerlaufprozessen"
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++"Maximale Anzahl an Sekunden, die eine etablierte, inaktive Verbindung offen "
++"gehalten wird"
++
++msgid "Min. spare servers"
++msgstr "Min. Prozesszahl"
++
++msgid "Minimum number of prepared idle processes"
++msgstr "Minimale Anzahl an vorgehaltenen Leerlaufprozessen"
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr "Anzahl zu erzeugender Leerlaufprozesse beim Start von Tinyproxy"
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++"Klartextdatei mit zu filternden URLs oder Domains. Ein Eintrag pro Zeile."
++
++msgid "Policy"
++msgstr "Verfahrensweise"
++
++msgid "Privacy settings"
++msgstr "Privatsphäre"
++
++msgid "Reject access"
++msgstr "Verbiete Zugriff"
++
++msgid "Server Settings"
++msgstr "Servereinstellungen"
++
++msgid "Server limits"
++msgstr "Serverlimits"
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++"Spezifiziert Headerzeilen welche durch den Proxyserver durchgereicht werden "
++"dürfen, alle anderen werden entfernt. Leer lassen um den Filter zu "
++"deaktivieren"
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr "Konfiguriert den Port an welchem Tinyproxy auf Anfragen wartet"
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++"Konfiguriert den Hostname, welchen Tinyproxy in die \"Via\" Headerzeile "
++"schreibt"
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++"Konfiguriert die lokale IP-Adresse welche Tinyproxy für ausgehende, "
++"weitergeleitete Anfragen benutzt"
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++"Konfiguriert die IP-Adressen auf welchen Tinyproxy Anfragen entgegen nimmt"
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++"Spezifiziert den UNIX-Gruppennamen mit welchem der Tinyproxy Prozess läuft"
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++"Spezifiziert den Upstream-Proxy über welchen auf den Zielhost zugegriffen "
++"wird. Das Format ist <code>IP-Adresse:Port</code>"
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++"Spezifiziert den UNIX-Nutzernamen mit welchem der Tinyproxy Prozess läuft"
++
++msgid "Start spare servers"
++msgstr "Starte Leerlaufserver"
++
++msgid "Statistics page"
++msgstr "Statistikseite"
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Target host"
++msgstr "Zielhost"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr "Status Tinyproxy"
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++"Tinyproxy ist ein schlanker HTTP(S)-Proxy ohne eigenen Zwischenspeicher"
++
++msgid "Upstream Proxies"
++msgstr "Upstream-Proxies"
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++"Upstream-Proxy-Regeln definieren Proxy-Server welche immer dann genutzt "
++"werden wenn bestimmte IP-Adressen oder Domains angefragt werden."
++
++msgid "Use syslog"
++msgstr "Nutze den Systemprotokolldienst"
++
++msgid "User"
++msgstr "Benutzername"
++
++msgid "Via hostname"
++msgstr "\"Via\" Hostname"
++
++msgid "Via proxy"
++msgstr "Zwischenproxy"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++"Schreibt Protokolleinträge an den Protokolldienst statt in eine separate "
++"Protokolldatei."
++
++msgid "X-Tinyproxy header"
++msgstr "X-Tinyproxy Headerzeile"
++
++#~ msgid "Allow access from"
++#~ msgstr "Proxyzugang erlauben von"
++
++#~ msgid "Allowed headers for anonymous proxy"
++#~ msgstr "Erlaube Header für anonymen Proxy"
++
++#~ msgid "Bind outgoing traffic to address"
++#~ msgstr "Ausgehendenden Verkehr an Adresse binden"
++
++#~ msgid "Ports allowed for CONNECT method"
++#~ msgstr "Ports für CONNECT-Methode"
++
++#~ msgid "0 = disabled, empty = all"
++#~ msgstr "0 = deaktiviert, leer = alle"
++
++#~ msgid "Error document"
++#~ msgstr "Fehlerseite"
++
++#~ msgid "Filter list"
++#~ msgstr "Filterliste"
++
++#~ msgid "Case sensitive filters"
++#~ msgstr "Filter unterscheiden Groß-/Kleinschreibung"
++
++#~ msgid "Filter list is a whitelist"
++#~ msgstr "Filterliste ist eine Whitelist"
++
++#~ msgid "Extended regular expression filters"
++#~ msgstr "Erweiterte reguläre Ausdrücke für Filter"
++
++#~ msgid "Filter URLs instead of domains"
++#~ msgstr "Filtere URLs statt Domains"
++
++#~ msgid "Listen on address"
++#~ msgstr "An Adresse binden"
++
++#~ msgid "Logfile"
++#~ msgstr "Protokolldatei"
++
++#~ msgid "Maximum number of clients"
++#~ msgstr "Maximale Anzahl an Clients"
++
++#~ msgid "Maximum requests per thread"
++#~ msgstr "Maximale Anfragen pro Prozess"
++
++#~ msgid "Spare servers to start with"
++#~ msgstr "Anfängliche Prozesszahl"
++
++#~ msgid "Statistic document"
++#~ msgstr "Statistikseite"
++
++#~ msgid "Write to syslog"
++#~ msgstr "In Systemprotokoll schreiben"
++
++#~ msgid "Connection Timeout"
++#~ msgstr "Verbindungstimeout"
++
++#~ msgid "Value of Via-Header"
++#~ msgstr "Wert des Via-Headers"
++
++#~ msgid "Include client IP"
++#~ msgstr "Client-IP übertragen"
++
++#~ msgid "Upstream Control"
++#~ msgstr "Zugangskontrolle"
++
++#~ msgid "Type"
++#~ msgstr "Methode"
++
++#~ msgid "Upstream Proxy"
++#~ msgstr "Zugangsproxy"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/el/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/el/tinyproxy.po
+new file mode 100644
+index 0000000..718424e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/el/tinyproxy.po
+@@ -0,0 +1,283 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-28 02:08+0200\n"
++"PO-Revision-Date: 2012-03-18 16:25+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++"Το <em>μέσω proxy</em> δÏομολογεί αιτήσεις Ï€Ïος τον συγκεκÏιμένο Ï€ÏοοÏισμό "
++"μέσω του καθοÏιζόμενου διαμεσολαβητή ανωτέÏου επιπέδου, Το <em>απόÏÏιψη "
++"Ï€Ïόσβασης</em> απενεÏγοποιεί τη χÏήση διαμεσολαβητή ανωτέÏου επιπέδου για το "
++"συγκεκÏιμένο Ï€ÏοοÏισμό"
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++"ΠÏοσθέτει μια κεφαλίδα HTTP \"X-Tinyproxy\" με τη διεÏθυνση IP του πελάτη "
++"στις Ï€ÏοωθοÏμενες αιτήσεις"
++
++msgid "Allowed clients"
++msgstr "ΕπιτÏεπόμενοι πελάτες"
++
++msgid "Allowed connect ports"
++msgstr "ΕπιτÏεπόμενες θÏÏες σÏνδεσης"
++
++#, fuzzy
++msgid "Bind address"
++msgstr "ΔιεÏθυνση στην οποία ακοÏει η υπηÏεσία"
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++"ΠÏοεπιλεγμένα, χÏησιμοποιοÏνται απλές κανονικές εκφÏάσεις POSIX για το "
++"φιλτÏάÏισμα. ΕνεÏγοποιήστε αυτή την επιλογή για να χÏησιμοποιοÏνται "
++"εκτεταμένες κανονικές εκφÏάσεις"
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++"ΠÏοεπιλεγμένα, το φιλτÏάÏισμα με συμβολοσειÏές γίνεται χωÏίς διάκÏιση πεζών "
++"κεφαλαίων. ΕνεÏγοποιήστε αυτή την επιλογή για να γίνεται διάκÏιση πεζών "
++"κεφαλαίων"
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++"ΠÏοεπιλεγμένα, το φιλτÏάÏισμα γίνεται βάσει του ονόματος τομέα. "
++"ΕνεÏγοποιήστε αυτή την επιλογή για να γίνεται βάσει URL"
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++"ΠÏοεπιλεγμένα, οι κανόνες φιλτÏαÏίσματος λειτουÏγοÏν ως μαÏÏη λίστα. "
++"ΕνεÏγοποιήστε αυτή την επιλογή ώστε να επιτÏέπονται μόνο τα ονόματα τομέα ή "
++"URLs που ταιÏιάζουν"
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++"ΜποÏεί να είναι μια IP διεÏθυνση ή εÏÏος, ένα όνομα τομέα ή \".\" για "
++"οποιοδήποτε σÏστημα χωÏίς όνομα τομέα"
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr "ΧÏονικό ÏŒÏιο σÏνδεσης"
++
++msgid "Default deny"
++msgstr "ΆÏνηση Ï€Ïοεπιλεγμένα"
++
++msgid "Enable Tinyproxy server"
++msgstr "ΕνεÏγοποίηση διαμεσολαβητή Tinyproxy"
++
++msgid "Error page"
++msgstr "Σελίδα σφάλματος"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr "ΦιλτÏάÏισμα με Κανονικές ΕκφÏάσεις"
++
++msgid "Filter by URLs"
++msgstr "ΦιλτÏάÏισμα με URL"
++
++msgid "Filter case-sensitive"
++msgstr "ΦιλτÏάÏισμα με διάκÏιση πεζών/κεφαλαίων"
++
++msgid "Filter file"
++msgstr "ΑÏχείο φίλτÏων"
++
++msgid "Filtering and ACLs"
++msgstr "ΦιλτÏάÏισμα και λίστες ελέγχου Ï€Ïόσβασης"
++
++msgid "General settings"
++msgstr "Γενικές Ïυθμίσεις"
++
++msgid "Group"
++msgstr "Ομάδα"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++"ΑÏχείο Ï€ÏοτÏπου HTML που στέλνεται σε αιτήσεις για στατιστικά του συστήματος"
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr "ΑÏχείο Ï€ÏοτÏπου HTML που στέλνεται όταν Ï€ÏοκÏπτουν σφάλματα HTML"
++
++msgid "Header whitelist"
++msgstr "Λευκή λίστα κεφαλίδων"
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++"Λίστα διευθÏνσεων IP ή εÏÏη αυτών στις οποίες επιτÏέπεται η χÏήση του "
++"διαμεσολαβητή"
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/en/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/en/tinyproxy.po
+new file mode 100644
+index 0000000..4650f3e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/en/tinyproxy.po
+@@ -0,0 +1,331 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:35+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr "Log level"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr "Max. spare servers"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr "Min. spare servers"
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr "Reject access"
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr "Target host"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr "Via proxy"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
++
++#~ msgid "Allow access from"
++#~ msgstr "Allow access from"
++
++#~ msgid "Allowed headers for anonymous proxy"
++#~ msgstr "Allowed headers for anonymous proxy"
++
++#~ msgid "Bind outgoing traffic to address"
++#~ msgstr "Bind outgoing traffic to address"
++
++#~ msgid "Ports allowed for CONNECT method"
++#~ msgstr "Ports allowed for CONNECT method"
++
++#~ msgid "0 = disabled, empty = all"
++#~ msgstr "0 = disabled, empty = all"
++
++#~ msgid "Error document"
++#~ msgstr "Error document"
++
++#~ msgid "Filter list"
++#~ msgstr "Filter list"
++
++#~ msgid "Case sensitive filters"
++#~ msgstr "Case sensitive filters"
++
++#~ msgid "Filter list is a whitelist"
++#~ msgstr "Filter list is a whitelist"
++
++#~ msgid "Extended regular expression filters"
++#~ msgstr "Extended regular expression filters"
++
++#~ msgid "Filter URLs instead of domains"
++#~ msgstr "Filter URLs instead of domains"
++
++#~ msgid "Listen on address"
++#~ msgstr "Listen on address"
++
++#~ msgid "Logfile"
++#~ msgstr "Logfile"
++
++#~ msgid "Maximum number of clients"
++#~ msgstr "Maximum number of clients"
++
++#~ msgid "Maximum requests per thread"
++#~ msgstr "Maximum requests per thread"
++
++#~ msgid "Spare servers to start with"
++#~ msgstr "Spare servers to start with"
++
++#~ msgid "Statistic document"
++#~ msgstr "Statistic document"
++
++#~ msgid "Write to syslog"
++#~ msgstr "Write to syslog"
++
++#~ msgid "Connection Timeout"
++#~ msgstr "Connection Timeout"
++
++#~ msgid "Value of Via-Header"
++#~ msgstr "Value of Via-Header"
++
++#~ msgid "Include client IP"
++#~ msgstr "Include client IP"
++
++#~ msgid "Upstream Control"
++#~ msgstr "Upstream Control"
++
++#~ msgid "Type"
++#~ msgstr "Type"
++
++#~ msgid "Upstream Proxy"
++#~ msgstr "Upstream Proxy"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/es/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/es/tinyproxy.po
+new file mode 100644
+index 0000000..c9faff1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/es/tinyproxy.po
+@@ -0,0 +1,354 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-10-07 15:08+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++"<em>Vía proxy</em> enruta las peticiones al destino vía el proxy superior "
++"especificado, <em>Rechazar acceso</em> desactiva cualquier proxy superior al "
++"destino"
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++"Añade una cabecera HTTP con \"X-Tinyproxy\" con la dirección IP del cliente "
++"a las peticiones retransmitidas"
++
++msgid "Allowed clients"
++msgstr "Clientes permitidos"
++
++msgid "Allowed connect ports"
++msgstr "Puertos permitidos"
++
++msgid "Bind address"
++msgstr "Dirección de asociación"
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++"Expresiones regulares extendidas. Por defecto se filtra con expresiones "
++"regulares POSIX básicas"
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr "Distinguir mayúsculas y minúsculas"
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr "Comparar con URLs. Por defecto el filtro se basa en nombres de dominio"
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++"Tratar el fichero de filtro como una lista de máquinas a permitir. Por "
++"defecto actúa como una lista negra"
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++"Puede ser un rango de IPs, un nombre de dominio o \".\" para cualquier "
++"máquina sin dominio"
++
++msgid "Configuration"
++msgstr "Configuración"
++
++msgid "Connection timeout"
++msgstr "Espera de conexión"
++
++msgid "Default deny"
++msgstr "Denegar por defecto"
++
++msgid "Enable Tinyproxy server"
++msgstr "Activar el servidor Tinyproxy"
++
++msgid "Error page"
++msgstr "Página de error"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr "No se han podido obtener estadísticas de:"
++
++msgid "Filter by RegExp"
++msgstr "Filtrar por RegExp"
++
++msgid "Filter by URLs"
++msgstr "Filtrar por URLs"
++
++msgid "Filter case-sensitive"
++msgstr "Distinguir entre mayúsculas y minúsculas"
++
++msgid "Filter file"
++msgstr "Fichero de filtro"
++
++msgid "Filtering and ACLs"
++msgstr "Filtrado y ACLs"
++
++msgid "General settings"
++msgstr "Configuración general"
++
++msgid "Group"
++msgstr "Grupo"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++"FIchero con la plantilla HTML a usar para las peticiones de estadísticas"
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr "Fichero con la plantilla HTTP a usar cuando ocurra algún error"
++
++msgid "Header whitelist"
++msgstr "Cabeceras autorizadas"
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr "Direcciones IP o rangos a los que se permite usar el servidor proxy"
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++"Lista de puertos permitidos al método CONNECT. Use 0 para todos los puertos"
++
++msgid "Listen address"
++msgstr "Dirección de escucha"
++
++msgid "Listen port"
++msgstr "Puerto de escucha"
++
++msgid "Log file"
++msgstr "Registro"
++
++msgid "Log file to use for dumping messages"
++msgstr "Fichero de volcado de mensajes"
++
++msgid "Log level"
++msgstr "Nivel de registro"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr "Nivel de registro del proceso Tinyproxy"
++
++msgid "Max. clients"
++msgstr "Clientes máximos"
++
++msgid "Max. requests per server"
++msgstr "Peticiones máximas por servidor"
++
++msgid "Max. spare servers"
++msgstr "Procesos servidores máximos"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr "Máximo de clientes conectados simultáneamente"
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++"Peticiones máximas por proceso. Si se supera el proceso es arrancado de "
++"nuevo. Para ilimitados indique 0."
++
++msgid "Maximum number of prepared idle processes"
++msgstr "Máximo de procesos inactivos"
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr "Segundos máximos que se tiene una conexión inactiva abierta"
++
++msgid "Min. spare servers"
++msgstr "Procesos servidores mínimos"
++
++msgid "Minimum number of prepared idle processes"
++msgstr "Mínimo de procesos inactivos"
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr "Procesos inactivos a arrancar cuando se lanza Tinyproxy"
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr "Fichero plano con URLs o dominios a filtrar. Uno por línea"
++
++msgid "Policy"
++msgstr "Política"
++
++msgid "Privacy settings"
++msgstr "Configuración de privacidad"
++
++msgid "Reject access"
++msgstr "Rechazar acceso"
++
++msgid "Server Settings"
++msgstr "Configuración del servidor"
++
++msgid "Server limits"
++msgstr "Límites del servidor"
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++"Nombres de cabeceras HTTP que se dejan pasar. el resto se descartan. Deje en "
++"blanco para desactivar el filtrado de cabeceras"
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr "Puerto de escucha de peticiones"
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr "Nombre de máquina a usar en la cabecera HTTP \"Via\""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++"Dirección a la que se asocia Tinyproxy para peticiones de traspaso salientes"
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr "Direcciones de escucha de peticiones"
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr "Nombre de grupo en el que se ejecuta el proceso Tinyproxy"
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++"Proxy superior a usar para llegar a la máquina destino. El formato es "
++"<code>dirección_puerto</code>"
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr "Nombre de usuario con en el que se ejecuta el proceso Tinyproxy"
++
++msgid "Start spare servers"
++msgstr "Arrancar servidores libres"
++
++msgid "Statistics page"
++msgstr "Estadísticas"
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Target host"
++msgstr "Máquina destino"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr "Estado de Tinyproxy"
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr "Tinyproxy es un proxy sin cache HTTP/HTTPS pequeño y rápido"
++
++msgid "Upstream Proxies"
++msgstr "Proxies superiores"
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++"Las reglas de proxy superior definen qué servidores usar cuando se accede a "
++"ciertas direcciones IP o dominios."
++
++msgid "Use syslog"
++msgstr "Usar SysLog"
++
++msgid "User"
++msgstr "Usuario"
++
++msgid "Via hostname"
++msgstr "Nombre de máquina en \"Via\""
++
++msgid "Via proxy"
++msgstr "Via proxy"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr "Escribe los mensajes de registro en SysLog en vez de en un fichero"
++
++msgid "X-Tinyproxy header"
++msgstr "Cabecera X-Tinyproxy"
++
++#~ msgid "Allow access from"
++#~ msgstr "Permitir acceso desde"
++
++#~ msgid "Allowed headers for anonymous proxy"
++#~ msgstr "Encabezados permitidos de proxies anónimos"
++
++#~ msgid "Bind outgoing traffic to address"
++#~ msgstr "Ligar tráfico de salida a la dirección"
++
++#~ msgid "Ports allowed for CONNECT method"
++#~ msgstr "Puertos permitidos para el método CONNECT"
++
++#~ msgid "0 = disabled, empty = all"
++#~ msgstr "0 = Deshabilitado, vacío = todos"
++
++#~ msgid "Error document"
++#~ msgstr "Error en documento"
++
++#~ msgid "Filter list"
++#~ msgstr "Lista de filtros"
++
++#~ msgid "Case sensitive filters"
++#~ msgstr "Filtros de mayúsculas y minúsculas "
++
++#~ msgid "Filter list is a whitelist"
++#~ msgstr "La Lista de Filtros es una lista blanca"
++
++#~ msgid "Extended regular expression filters"
++#~ msgstr "Filtros extendido para expresiones regulares"
++
++#~ msgid "Filter URLs instead of domains"
++#~ msgstr "Filtrar URLs en vez de dominios"
++
++#~ msgid "Listen on address"
++#~ msgstr "Escuchar en dirección"
++
++#~ msgid "Logfile"
++#~ msgstr "Logfile"
++
++#~ msgid "Maximum number of clients"
++#~ msgstr "Número máximo de clientes"
++
++#~ msgid "Maximum requests per thread"
++#~ msgstr "Máximas peticiones por hilo"
++
++#~ msgid "Spare servers to start with"
++#~ msgstr "Spare servers to start with"
++
++#~ msgid "Statistic document"
++#~ msgstr "Documento de estadística"
++
++#~ msgid "Write to syslog"
++#~ msgstr "Escribir al syslog"
++
++#~ msgid "Connection Timeout"
++#~ msgstr "Tiempo agotado para la conexión"
++
++#~ msgid "Value of Via-Header"
++#~ msgstr "Valor para Via-Header"
++
++#~ msgid "Include client IP"
++#~ msgstr "Incluir IP del cliente"
++
++#~ msgid "Upstream Control"
++#~ msgstr "Control de subida (upstream)"
++
++#~ msgid "Type"
++#~ msgstr "Tipo"
++
++#~ msgid "Upstream Proxy"
++#~ msgstr "Proxy de subida (upstream)"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/fr/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/fr/tinyproxy.po
+new file mode 100644
+index 0000000..d359442
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/fr/tinyproxy.po
+@@ -0,0 +1,372 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-01-26 12:52+0200\n"
++"Last-Translator: kyas <rimk_71@hotmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++"<em>Via proxy</em> route les requêtes vers la cible donnée via le mandataire "
++"amont donné, <em>Reject access</em> interdit tout mandataire amont comme "
++"cible"
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++"Ajoute un en-tête HTTP \"X-Tinyproxy\" avec l'adresse IP du client aux "
++"requêtes retransmises"
++
++msgid "Allowed clients"
++msgstr "Clients autorisés"
++
++msgid "Allowed connect ports"
++msgstr "Ports de connexion autorisés"
++
++msgid "Bind address"
++msgstr "Adresse en écoute"
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++"Par défaut, le filtrage utilise des expressions POSIX basiques. Activez-ceci "
++"pour permettre l'utilisation d'expressions régulières étendues"
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++"Par défaut, les chaînes de caractères des filtres sont utilisées sans faire "
++"attention à leurs casses. Activez-ceci pour les rendre sensible à la casse "
++"des caractères"
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++"Par défaut, le filtrage s'effectue sur les noms de domaines. Activez-ceci "
++"pour l'appliquer plutôt aux URLs"
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++"Par défaut, les règles de filtrages décrivent ce qui doit être interdit. "
++"Activez cette option pour n'autoriser que les noms de domaines ou URLs qui "
++"correspondent aux règles"
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++"Ce peut être soit une adresse ou une gamme d'adresses IP, un nom de domaine, "
++"ou \".\" pour n'importe quel nom d'hôte sans domaine"
++
++msgid "Configuration"
++msgstr "Configuration"
++
++msgid "Connection timeout"
++msgstr "Délai de connexion"
++
++msgid "Default deny"
++msgstr "Interdit par défaut"
++
++msgid "Enable Tinyproxy server"
++msgstr "Activer le serveur Tinyproxy"
++
++msgid "Error page"
++msgstr "Page d'erreur"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr "Impossible de récupérer les statistiques de l'URL:"
++
++msgid "Filter by RegExp"
++msgstr "Filtrage par RegExp"
++
++msgid "Filter by URLs"
++msgstr "Filtrage par URLs"
++
++msgid "Filter case-sensitive"
++msgstr "Filtrage sensible à la casse"
++
++msgid "Filter file"
++msgstr "Fichier des filtres"
++
++msgid "Filtering and ACLs"
++msgstr "Filtrage et ACLs"
++
++msgid "General settings"
++msgstr "Paramètres généraux"
++
++msgid "Group"
++msgstr "Groupe"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++"Modèle de fichier HTML à utiliser pour les requêtes de statistiques des hôtes"
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr "Modèle de fichier HTML à utiliser quand une erreur HTTP survient"
++
++msgid "Header whitelist"
++msgstr "Liste des en-têtes autorisés"
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++"Liste des adresses IP ou gammes d'adresses IP autorisées à utiliser le "
++"serveur mandataire"
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++"Liste des ports autorisés pour la méthode CONNECT. Une valeur \"0\" unique "
++"autorises tous les ports"
++
++msgid "Listen address"
++msgstr "Adresse en écoute"
++
++msgid "Listen port"
++msgstr "Port en écoute"
++
++msgid "Log file"
++msgstr "Fichier journal"
++
++msgid "Log file to use for dumping messages"
++msgstr "Fichier-journal utilisé pour y copier les messages"
++
++msgid "Log level"
++msgstr "Niveau de log"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr "Verbosité du journal du processus Tinyproxy"
++
++msgid "Max. clients"
++msgstr "Nombre max. de clients"
++
++msgid "Max. requests per server"
++msgstr "Nombre max. de requêtes par serveur"
++
++msgid "Max. spare servers"
++msgstr "Nombre Maximum de processus serveur"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr "Nombre max autorisé de clients connectés en même temps"
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++"Nombre maximum autorisé de requêtes par processus. S'il est dépassé, le "
++"processus est relancé. Un zéro désactive cette limite."
++
++msgid "Maximum number of prepared idle processes"
++msgstr "Nombre maximum de processus lancés, prêts à traiter des requêtes"
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++"Une connexion inactive est maintenue ouverte pendant cette durée maximum (en "
++"secondes)"
++
++msgid "Min. spare servers"
++msgstr "Nombre Minimum de processus serveur"
++
++msgid "Minimum number of prepared idle processes"
++msgstr "Nombre minimum de processus lancés, prêts à traiter des requêtes"
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++"Nombre de processus lancés en sus, prêts à traiter des requêtes, au "
++"démarrage de Tinyproxy"
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++"Fichier-texte contenant les URLs ou noms de domaines à filtrer, un par ligne"
++
++msgid "Policy"
++msgstr "Action"
++
++msgid "Privacy settings"
++msgstr "Paramètres de confidentialité"
++
++msgid "Reject access"
++msgstr "Refuser l'accès"
++
++msgid "Server Settings"
++msgstr "Paramètres du serveur"
++
++msgid "Server limits"
++msgstr "Limites du serveur"
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++"Indique les noms des entêtes HTTP qui sont autorisées à transiter, tous les "
++"autres seront retirés. Laisser vide pour désactiver le filtrage des entêtes"
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr "Indique le port HTTP où Tinyproxy est en écoute de requêtes"
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++"Indique le nom d'hôte que Tinyproxy utilisera dans l'entête HTTP « Via »"
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++"Décrit l'adresse que Tinyproxy utilisera pour les requêtes retransmises à "
++"l'extérieur"
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr "Indique les adresses où Tinyproxy est en écoute de requêtes"
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++"Indique le nom de groupe sous lequel les processus Tinyproxy fonctionnent"
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++"Indique un mandataire amont à utiliser pour atteindre l'hôte cible. Le "
++"format est <code>adresse:port</code>"
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++"Indique le nom d'utilisateur sous lequel les processus Tinyproxy fonctionnent"
++
++msgid "Start spare servers"
++msgstr "Serveurs en surplus au démarrage"
++
++msgid "Statistics page"
++msgstr "Page de statistiques"
++
++msgid "Status"
++msgstr "Statut"
++
++msgid "Target host"
++msgstr "Hôte de destination"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr "Statut Tinyproxy"
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++
++msgid "Upstream Proxies"
++msgstr "Mandataires amont"
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++"Les règles de mandataires amont définissent les serveurs mandataire à "
++"utiliser pour l'accès à certaines adresses IP ou domaines."
++
++msgid "Use syslog"
++msgstr "Utiliser syslog"
++
++msgid "User"
++msgstr "Utilisateur"
++
++msgid "Via hostname"
++msgstr "nom d'hôte « Via »"
++
++msgid "Via proxy"
++msgstr "Via proxy"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr "Envoyer les messages à syslog plutôt que dans un fichier-journal"
++
++msgid "X-Tinyproxy header"
++msgstr "Entête X-Tinyproxy"
++
++#~ msgid "Allow access from"
++#~ msgstr "Allow access from"
++
++#~ msgid "Allowed headers for anonymous proxy"
++#~ msgstr "Allowed headers for anonymous proxy"
++
++#~ msgid "Bind outgoing traffic to address"
++#~ msgstr "Lier le trafic sortant à l'adresse ip"
++
++#~ msgid "Ports allowed for CONNECT method"
++#~ msgstr "Ports allowed for CONNECT method"
++
++#~ msgid "0 = disabled, empty = all"
++#~ msgstr "0 = disabled, empty = all"
++
++#~ msgid "Error document"
++#~ msgstr "Fichier d'erreur"
++
++#~ msgid "Filter list"
++#~ msgstr "Liste de filtres"
++
++#~ msgid "Case sensitive filters"
++#~ msgstr "Case sensitive filters"
++
++#~ msgid "Filter list is a whitelist"
++#~ msgstr "Filter list is a whitelist"
++
++#~ msgid "Extended regular expression filters"
++#~ msgstr "Extended regular expression filters"
++
++#~ msgid "Filter URLs instead of domains"
++#~ msgstr "Filter URLs instead of domains"
++
++#~ msgid "Listen on address"
++#~ msgstr "Listen on address"
++
++#~ msgid "Logfile"
++#~ msgstr "Chemin du fichier de log"
++
++#~ msgid "Maximum number of clients"
++#~ msgstr "Nombre maximum de clients"
++
++#~ msgid "Maximum requests per thread"
++#~ msgstr "Maximum de connexion par processus"
++
++#~ msgid "Spare servers to start with"
++#~ msgstr "Nombre de processus serveur lancés au demarrage"
++
++#~ msgid "Statistic document"
++#~ msgstr "Fichier de statistiques"
++
++#~ msgid "Write to syslog"
++#~ msgstr "Écrire dans le journal système (Syslog)"
++
++#~ msgid "Connection Timeout"
++#~ msgstr "Délai de connexion"
++
++#~ msgid "Value of Via-Header"
++#~ msgstr "Valeur de l'entête \"VIA\" utilisée comme nom d'hôte"
++
++#~ msgid "Include client IP"
++#~ msgstr "Inclure l'ip du client"
++
++#~ msgid "Upstream Control"
++#~ msgstr "Upstream Control"
++
++#~ msgid "Type"
++#~ msgstr "Type"
++
++#~ msgid "Upstream Proxy"
++#~ msgstr "Proxy"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/he/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/he/tinyproxy.po
+new file mode 100644
+index 0000000..5c4dddd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/he/tinyproxy.po
+@@ -0,0 +1,255 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/hu/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/hu/tinyproxy.po
+new file mode 100644
+index 0000000..5c4dddd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/hu/tinyproxy.po
+@@ -0,0 +1,255 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/it/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/it/tinyproxy.po
+new file mode 100644
+index 0000000..34528c1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/it/tinyproxy.po
+@@ -0,0 +1,265 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-12-15 19:29+0200\n"
++"Last-Translator: claudyus <claudyus84@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++"Aggiungi una intestazione http \"X-Tinyproxy\" contenente l'IP del client a "
++"cui forwardare la richiesta"
++
++msgid "Allowed clients"
++msgstr "Client permessi"
++
++msgid "Allowed connect ports"
++msgstr "Porte di connessione permesse"
++
++msgid "Bind address"
++msgstr "Bind Address"
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++"Di default, il filto è basato sul nome di dominio. Abilita questa opzione "
++"per effettuare il match con URL"
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr "Configurazione"
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr "Abilita il server Tinyproxy"
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr "Impossibile recuperare le statistiche dall'url:"
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++"Lista di indirizzi IP o range di indirizzi a cui è permesso l'uso del proxy"
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr "Numero massimo di client simultanei permessi"
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/ja/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/ja/tinyproxy.po
+new file mode 100644
+index 0000000..03ea890
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/ja/tinyproxy.po
+@@ -0,0 +1,280 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2011-10-05 17:53+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.4\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++"転é€ã™ã‚‹ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®HTTPヘッダã«\"X-Tinyproxy\"åŠã³ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆIPアドレスを追"
++"加ã—ã¾ã™ã€‚"
++
++msgid "Allowed clients"
++msgstr "接続を許å¯ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆ"
++
++msgid "Allowed connect ports"
++msgstr "接続を許å¯ã™ã‚‹ãƒãƒ¼ãƒˆç•ªå·"
++
++msgid "Bind address"
++msgstr "ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹IPアドレス"
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++"標準ã§ã¯ã€åŸºæœ¬çš„ãªPOSIXæ­£è¦è¡¨ç¾ãŒãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã«ä½¿ç”¨ã•ã‚Œã¾ã™ãŒã€ã“ã®ã‚ªãƒ—ショ"
++"ンãŒæœ‰åŠ¹ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€æ‹¡å¼µç‰ˆã®POSIXæ­£è¦è¡¨ç¾ãŒç”¨ã„られã¾ã™ã€‚"
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++"標準ã§ã¯ã€ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã®æ–‡å­—列ã¯å¤§æ–‡å­—å°æ–‡å­—を区別ã—ã¾ã›ã‚“ãŒã€ã“ã®ã‚ªãƒ—ションãŒ"
++"有効ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€åŒºåˆ¥ã—ã¦ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã‚’è¡Œã„ã¾ã™ã€‚"
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++"標準ã§ã¯ã€ãƒ‰ãƒ¡ã‚¤ãƒ³åを使用ã—ã¦ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã‚’è¡Œã„ã¾ã™ãŒã€ã“ã®ã‚ªãƒ—ションãŒæœ‰"
++"効ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ä»£ã‚ã‚Šã«URLã«å¯¾ã—ã¦ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã‚’è¡Œã„ã¾ã™ã€‚"
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++"標準ã§ã¯ã€ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ãƒ»ãƒ«ãƒ¼ãƒ«ã¯ãƒ–ラックリストã¨ã—ã¦å‹•ä½œã—ã¾ã™ãŒã€ã“ã®ã‚ªãƒ—"
++"ションãŒæœ‰åŠ¹ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€URLã¾ãŸã¯ãƒ‰ãƒ¡ã‚¤ãƒ³åãŒä¸€è‡´ã—ãŸå ´åˆã®ã¿ã€æŽ¥ç¶š"
++"ãŒè¨±å¯ã•ã‚Œã¾ã™ã€‚"
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr "接続タイムアウト"
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr "Tinyproxy サーãƒãƒ¼ã‚’有効ã«ã™ã‚‹"
++
++msgid "Error page"
++msgstr "エラーページ"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr "æ­£è¦è¡¨ç¾ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°"
++
++msgid "Filter by URLs"
++msgstr "URL フィルタリング"
++
++msgid "Filter case-sensitive"
++msgstr "大文字å°æ–‡å­—を区別ã—ã¦ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°"
++
++msgid "Filter file"
++msgstr "フィルタファイル"
++
++msgid "Filtering and ACLs"
++msgstr "フィルタリングã¨ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡"
++
++msgid "General settings"
++msgstr "基本設定"
++
++msgid "Group"
++msgstr "グループ"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr "リクエスト数を表示ã™ã‚‹HTMLテンプレートファイル"
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr "HTTPエラー時ã«è¡¨ç¤ºã™ã‚‹HTMLテンプレートファイル"
++
++msgid "Header whitelist"
++msgstr "ヘッダー・ホワイトリスト"
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr "プロキシサーãƒãƒ¼ã®ä½¿ç”¨ã‚’許å¯ã™ã‚‹IPアドレスリストã§ã™ã€‚"
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++"プロキシサーãƒãƒ¼ã‹ã‚‰æŽ¥ç¶šå¯èƒ½ãªãƒãƒ¼ãƒˆãƒªã‚¹ãƒˆã§ã™ã€‚\"0\"を設定ã—ãŸå ´åˆã€ã™ã¹ã¦ã®"
++"ãƒãƒ¼ãƒˆã‚’許å¯ã—ã¾ã™ã€‚"
++
++msgid "Listen address"
++msgstr "å¾…å—アドレス"
++
++msgid "Listen port"
++msgstr "å¾…å—ãƒãƒ¼ãƒˆ"
++
++msgid "Log file"
++msgstr "ログファイル"
++
++msgid "Log file to use for dumping messages"
++msgstr "メッセージを書ã込むログファイルを指定ã—ã¾ã™ã€‚"
++
++msgid "Log level"
++msgstr "ログレベル"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr "Tinyproxyプロセスã®ãƒ­ã‚°ã®è©³ç´°åº¦ã‚’設定"
++
++msgid "Max. clients"
++msgstr "最大クライアント数"
++
++msgid "Max. requests per server"
++msgstr "サーãƒãƒ¼æ¯Žã®æœ€å¤§ãƒªã‚¯ã‚¨ã‚¹ãƒˆæ•°"
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++"プロセス毎ã®è¨±å¯ã•ã‚Œã‚‹æœ€å¤§ãƒªã‚¯ã‚¨ã‚¹ãƒˆæ•°ã‚’設定ã—ã¾ã™ã€‚設定値を超ãˆãŸå ´åˆã€ãƒ—ロ"
++"セスをå†èµ·å‹•ã—ã¾ã™ã€‚0を入力ã™ã‚‹ã¨ã€ç„¡åˆ¶é™ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
++
++msgid "Maximum number of prepared idle processes"
++msgstr "アイドル状態ã§æº–å‚™ã™ã‚‹ãƒ—ロセスã®æœ€å¤§æ•°"
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr "アイドル状態ã§æº–å‚™ã™ã‚‹ãƒ—ロセスã®æœ€å°æ•°"
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr "ãƒãƒªã‚·ãƒ¼"
++
++msgid "Privacy settings"
++msgstr "プライãƒã‚·ãƒ¼è¨­å®š"
++
++msgid "Reject access"
++msgstr "アクセス拒å¦"
++
++msgid "Server Settings"
++msgstr "サーãƒãƒ¼è¨­å®š"
++
++msgid "Server limits"
++msgstr "サーãƒãƒ¼åˆ¶é™è¨­å®š"
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr "リクエストã«å¯¾ã—ã¦ã€TinyproxyãŒå¾…ã¡å—ã‘ã‚‹HTTPãƒãƒ¼ãƒˆã‚’設定ã—ã¾ã™"
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr "リクエストã«å¯¾ã—ã¦ã€TinyproxyãŒå¾…ã¡å—ã‘るアドレスを設定ã—ã¾ã™ã€‚"
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr "Tinyproxyを実行ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—を設定ã—ã¾ã™"
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++"特定ã®ãƒ›ã‚¹ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã«ä½¿ç”¨ã™ã‚‹ã€ä¸Šä½ã®ãƒ—ロキシサーãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚"
++"書å¼ã¯ <code>アドレス:ãƒãƒ¼ãƒˆ</code> ã§ã™ã€‚"
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr "Tinyproxyを実行ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’設定ã—ã¾ã™"
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr "宛先ホスト"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++"Tinyproxyã¯ã€è»½é‡ã§é«˜é€Ÿãªã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’è¡Œã‚ãªã„HTTP(S)-プロキシサーãƒãƒ¼ã§ã™ã€‚"
++
++msgid "Upstream Proxies"
++msgstr "上ä½ã®ãƒ—ロキシサーãƒãƒ¼"
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++"特定ã®IPアドレスやドメインã«æŽ¥ç¶šã™ã‚‹å ´åˆã«ã€ä¸Šä½ã®ãƒ—ロキシサーãƒãƒ¼ã‚’使用ã™ã‚‹"
++"よã†ã«è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
++
++msgid "Use syslog"
++msgstr "Syslogを使用ã™ã‚‹"
++
++msgid "User"
++msgstr "ユーザー"
++
++msgid "Via hostname"
++msgstr "経由ã™ã‚‹ãƒ›ã‚¹ãƒˆå"
++
++msgid "Via proxy"
++msgstr "経由ã™ã‚‹ãƒ—ロキシ"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr "ログファイルã®ä»£ã‚ã‚Šã«syslogã¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’記録ã—ã¾ã™"
++
++msgid "X-Tinyproxy header"
++msgstr "X-Tinyproxy ヘッダー"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/ms/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/ms/tinyproxy.po
+new file mode 100644
+index 0000000..08ed7dc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/ms/tinyproxy.po
+@@ -0,0 +1,254 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/no/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/no/tinyproxy.po
+new file mode 100644
+index 0000000..5c4dddd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/no/tinyproxy.po
+@@ -0,0 +1,255 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/pl/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/pl/tinyproxy.po
+new file mode 100644
+index 0000000..8e3bfc7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/pl/tinyproxy.po
+@@ -0,0 +1,292 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-04 11:50+0200\n"
++"Last-Translator: Staszek <fistaszek@tlen.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++"<em>Przez proxy</em> kieruje żądania do danego celu przez określone "
++"\"upstream proxy\", <em>Odrzuć dostęp</em> wyłącza jakiekolwiek \"upstream "
++"proxy\" dla danego celu."
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++"Dodaje nagłówek http \"X-Tinyproxy\" z adresem IP klienta do przekazywanych "
++"żądań"
++
++msgid "Allowed clients"
++msgstr "Akceptowane klienty"
++
++msgid "Allowed connect ports"
++msgstr "Akceptowane porty połączenia"
++
++msgid "Bind address"
++msgstr "zwiąż adres"
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++"Domyślnie do filtrowania używane są podstawowe wyrażenia POSIX. Włącz tę "
++"opcję, aby aktywować rozszerzone wyrażenia regularne."
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++"Domyślnie ciągi filtrowania traktowane są jako wrażliwe na wielkość liter. "
++"Włącz tę opcję, aby dopasowania były wrażliwe na wielkości liter."
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++"Domyślnie filtrowanie jest wykonywane w oparciu o nazwy domen. Włącz tę "
++"opcję, aby zamiast tego używać URL-i."
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++"Domyślnie, reguły filtra działają jako czarna lista. Zaznacz tę opcję, aby "
++"zezwalać wyłącznie na pasujące URL-e lub nazwy domen."
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++"Może być adresem lub zakresem adresów IP, nazwą domeny lub \".\" dla "
++"dowolnego hosta bez domeny."
++
++msgid "Configuration"
++msgstr "Konfiguracja"
++
++msgid "Connection timeout"
++msgstr "Limit czasu połączenia"
++
++msgid "Default deny"
++msgstr "Domyślnie blokuj"
++
++msgid "Enable Tinyproxy server"
++msgstr "WÅ‚Ä…cz serwer Tinyproxy"
++
++msgid "Error page"
++msgstr "Strona błędu"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr "Nieudane pobieranie statystyk z URL-a:"
++
++msgid "Filter by RegExp"
++msgstr "Filtruj z użyciem rozszerzonych wyrażeń regularnych"
++
++msgid "Filter by URLs"
++msgstr "Filtruj po adresach URL"
++
++msgid "Filter case-sensitive"
++msgstr "Filtr wrażliwy na wielkość liter"
++
++msgid "Filter file"
++msgstr "Plik z filtrami"
++
++msgid "Filtering and ACLs"
++msgstr "Filtrowanie i Listy kontroli dostępu"
++
++msgid "General settings"
++msgstr "Ustawienia ogólne"
++
++msgid "Group"
++msgstr "Grupa"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr "Plik szablonu HTML używany do prezentacji statystyk"
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr "Plik szablonu HTML używany do prezentacji komunikatów błędu"
++
++# Zgaduję, że to ma coś wspólnego z nagłówkami zapytań - stąd takie tłumaczenie.
++msgid "Header whitelist"
++msgstr "Biała lista nagłówków"
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++"Lista adresów IP lub zakresów, które są dopuszczone do korzystania z serwera "
++"proxy"
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++"Lista dozwolonych portów dla metody CONNECT. Pojedyncza wartość \"0\" "
++"pozwala użyć wszystkich portów"
++
++msgid "Listen address"
++msgstr "Nasłuchiwany adres"
++
++msgid "Listen port"
++msgstr "Nasłuchiwany port"
++
++msgid "Log file"
++msgstr "Plik logowania"
++
++msgid "Log file to use for dumping messages"
++msgstr "Plik logowania zrzucanych wiadomości"
++
++msgid "Log level"
++msgstr "Poziom logowania"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr "Szczegółowość logowania procesów Tinyproxy"
++
++msgid "Max. clients"
++msgstr "Maks. klientów"
++
++msgid "Max. requests per server"
++msgstr "Maks. żądań na serwer"
++
++msgid "Max. spare servers"
++msgstr "Maks. uruchomionych serwerów"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr "Maksymalna dopuszczalna liczba jednocześnie podłączonych klientów"
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++"Maksymalna dopuszczalna liczba żądań na proces. Jeśli zostanie przekroczona, "
++"proces zostanie ponownie uruchomiony. Zero oznacza bez limitu."
++
++msgid "Maximum number of prepared idle processes"
++msgstr "Maksymalna liczba przygotowanych bezczynnych procesów"
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++"Maksymalna liczba sekund dla podtrzymywania otwartego nieaktywnego połączenie"
++
++msgid "Min. spare servers"
++msgstr "Min. liczba zapasowych serwerów"
++
++msgid "Minimum number of prepared idle processes"
++msgstr "Minimalna liczba przygotowanych bezczynnych procesów"
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++"Liczba bezczynnych procesów do włączenia podczas uruchamiania Tinyproxy"
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++"Plik tekstowy z URL-ami lub domenami do filtowania. Jeden wpis na liniÄ™."
++
++msgid "Policy"
++msgstr "Polityka"
++
++msgid "Privacy settings"
++msgstr "Ustawienia prywatności"
++
++msgid "Reject access"
++msgstr "Odmów dostępu"
++
++msgid "Server Settings"
++msgstr "Ustawienia serwera"
++
++msgid "Server limits"
++msgstr "Limity serwera"
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++"Określa nazwy nagłówków HTTP, które mogą zostać przesłane dalej. Pozostałe "
++"będą odrzucone. Pozostaw puste, aby wyłączyć filtrowanie nagłówków."
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr "Określa port, na którym Tinyproxy będzie oczekiwać żądań HTTP."
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr "Określa nazwę hosta używaną przez Tinyproxy w nagłówku HTTP \"Via\"."
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++"Określ adres, z którym zostanie powiązane Tinyproxy dla wychodzących "
++"przekazywanych żądań"
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr "Określa adresy, z których Tinyproxy oczekuje żądań."
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr "Określ nazwę grupy, pod jaką będzie pracował proces Tinyproxy"
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++"Określ serwer proxy typu upstream, który ma zostać użyty w przypadku dostępu "
++"do hosta docelowego. Format to <code>adres:port</code>"
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr "Określ nazwę użytkownika, pod jaką będzie pracował proces Tinyproxy"
++
++msgid "Start spare servers"
++msgstr "Uruchamiane serwery zapasowe"
++
++msgid "Statistics page"
++msgstr "Strona statystyk"
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Target host"
++msgstr "Host docelowy"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr "Status serwera Tinyproxy"
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr "Tinyproxy to mały i szybki niecacheujący serwer proxy HTTP(S)"
++
++msgid "Upstream Proxies"
++msgstr "Serwery proxy typu upstream"
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++"Reguły serwerów proxy typu upstream definiują serwery proxy, które mają "
++"zostać użyte w przypadku dostępu do określonych adresów IP lub domen."
++
++msgid "Use syslog"
++msgstr "Użyj sysloga"
++
++msgid "User"
++msgstr "Użytkownik"
++
++msgid "Via hostname"
++msgstr "Nazwa hosta via"
++
++msgid "Via proxy"
++msgstr "Proxy via"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr "Zapisuje komunikaty do sysloga zamiast pliku dziennika"
++
++msgid "X-Tinyproxy header"
++msgstr "Nagłówek X-Tinyproxy"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/pt-br/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/pt-br/tinyproxy.po
+new file mode 100644
+index 0000000..ef7ffda
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/pt-br/tinyproxy.po
+@@ -0,0 +1,367 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-09-16 02:38+0200\n"
++"Last-Translator: Julio Cezar <jsilvestree@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++"<em>Via proxy</em> encaminha as requisições para um dado destino através do "
++"proxy superior especificado, <em>Rejeitar acesso</em> desabilita qualquer "
++"proxy superior para o alvo"
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++"Adiciona no cabeçalho do HTTP o campo \"X-Tinyproxy\" com o endereço IP do "
++"cliente para encaminhar a requisição"
++
++msgid "Allowed clients"
++msgstr "Clientes permitidos"
++
++msgid "Allowed connect ports"
++msgstr "Portas de conexão permitidas"
++
++msgid "Bind address"
++msgstr "Endereço de saída"
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++"Por padrão, os filtros usam expressões POSIX básicas. Habilite esta opção "
++"para usar expressões regulares extendidas"
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++"Por padrão, as regras são tratadas como insensíveis a caixa. Habilite esta "
++"opção para diferenciar maiúsculas e minúsculas"
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++"Por padrão, a filtragem é feita baseada nos domínios. Habilite esta opção "
++"para, ao invés disto, casar com URLs"
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++"Por padrão, as regras de filtragem atuam como uma lista negra. Habilite esta "
++"opção para somente permitir URLs ou domínios que casem"
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++"Pode ser tanto um como uma faixa de endereços IP, um nome de dompínio ou \"."
++"\" para qualquer computador sem domínio"
++
++msgid "Configuration"
++msgstr "Configuração"
++
++msgid "Connection timeout"
++msgstr "Tempo limite de conexão"
++
++msgid "Default deny"
++msgstr "Nege por padrão"
++
++msgid "Enable Tinyproxy server"
++msgstr "Habilitar o servidor Tinyproxy"
++
++msgid "Error page"
++msgstr "Página de erro"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr "Falhou ao tentar obter estatísticas da URL:"
++
++msgid "Filter by RegExp"
++msgstr "Filtrar por Expressão Regular"
++
++msgid "Filter by URLs"
++msgstr "Filtrar por URLs"
++
++msgid "Filter case-sensitive"
++msgstr "Diferenciar maiúsculo/minúsculo no filtro"
++
++msgid "Filter file"
++msgstr "Arquivo de filtro"
++
++msgid "Filtering and ACLs"
++msgstr "Filtragem e ACLs"
++
++msgid "General settings"
++msgstr "Configurações gerais"
++
++msgid "Group"
++msgstr "Grupo"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++"Modelo de arquivo HTML para servir para requisições de estado do computador"
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr "Modelo de arquivo HTML para servir quando ocorrer error HTTP"
++
++msgid "Header whitelist"
++msgstr "Lista branca do cabeçalho"
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++"Lista ou faixa de endereços IP a quem é permitido o uso do servidor proxy"
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++"List as portas que podem utilizar o método CONNECT. Um valor \"0\" único "
++"permitirá todas as portas"
++
++msgid "Listen address"
++msgstr "Endereço de escuta"
++
++msgid "Listen port"
++msgstr "Porta de escuta"
++
++msgid "Log file"
++msgstr "Arquivo de registro"
++
++msgid "Log file to use for dumping messages"
++msgstr "Arquivo de registro usado para despejar as mensagens"
++
++msgid "Log level"
++msgstr "Nível do registro"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr "Detalhamento dos registors do Tinyproxy"
++
++msgid "Max. clients"
++msgstr "Número máximo de clientes"
++
++msgid "Max. requests per server"
++msgstr "Numero máximo de requisições por servidor"
++
++msgid "Max. spare servers"
++msgstr "Max. servidores sobressalentes"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr "Numero máximo permitido de cliente conectados concorrentemente"
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++"Numero máximo de requisições permitidas por processo. Se este limite é "
++"excedido, o processo é redisparado. Zero significa ilimitado."
++
++msgid "Maximum number of prepared idle processes"
++msgstr "Número máximo de processos em espera preparados"
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr "Número máximo de segundos que uma conexão inativa é mantida aberta"
++
++msgid "Min. spare servers"
++msgstr "Número mínimo de servidores sobressalentes"
++
++msgid "Minimum number of prepared idle processes"
++msgstr "Número mínimo de processos em espera preparados"
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr "Número de processos em espera iniciado quando o Tinyproxy é disparado"
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++"Arquivo de texto simples com as URLs ou os domínios para filtrar. Uma "
++"entrada por linha"
++
++msgid "Policy"
++msgstr "Política"
++
++msgid "Privacy settings"
++msgstr "Configurações de privacidade"
++
++msgid "Reject access"
++msgstr "Rejeitar acesso"
++
++msgid "Server Settings"
++msgstr "Configurações do Servidor"
++
++msgid "Server limits"
++msgstr "Limites do servidor"
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++"Especifica os nomes dos cabeçalhos HTTP que serão permitidos. Todos os "
++"demais serão descartados. Deixe em branco para desabilitar a filtragem de "
++"cabeçalho"
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr "Especifica a porta na qual o Tinyproxy escutará pelas requisições"
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++"Especifica o nome do computador que o Tinyproxy usará no cabeçalho HTTP"
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++"Especifica o endereço que o Tinyproxy utilizará para encaminhar as "
++"requisições"
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr "Especifica o endereço no qual o Tinyproxy escutará pelas requisições"
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr "Especifica o nome do grupo com o qual o processo do Tinyproxy rodará"
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++"Especifica o proxy superior para usar quando acessar o alvo. Formato é "
++"<code>address:port</code>"
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr "Especifica o nome do usuário com o qual o processo do Tinyproxy rodará"
++
++msgid "Start spare servers"
++msgstr "Dispare servidores de espera"
++
++msgid "Statistics page"
++msgstr "Página de estatística"
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Target host"
++msgstr "Host de destino"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr "Estado do Tinyproxy"
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr "Tinyproxy é um pequeno e rápido Proxy-HTTP(S) sem suporte a cache"
++
++msgid "Upstream Proxies"
++msgstr "Proxies superiores"
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++"As regras do proxy superior define os servidores de proxy para uso quando "
++"certos endereços IP ou domínios forem acessados."
++
++msgid "Use syslog"
++msgstr "Use o syslog"
++
++msgid "User"
++msgstr "Usuário"
++
++msgid "Via hostname"
++msgstr "Via nome do computador"
++
++msgid "Via proxy"
++msgstr "Via proxy"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++"Escreve as mensagens de registros para o syslog ao invéz do arquivo de "
++"registro"
++
++msgid "X-Tinyproxy header"
++msgstr "Cabeçalho do X-Tinyproxy"
++
++#~ msgid "Allow access from"
++#~ msgstr "Permitir acesso de"
++
++#~ msgid "Allowed headers for anonymous proxy"
++#~ msgstr "Cabeçalhos permitidos para proxy anônimo"
++
++#~ msgid "Bind outgoing traffic to address"
++#~ msgstr "Associar o tráfego de saída ao endereço"
++
++#~ msgid "Ports allowed for CONNECT method"
++#~ msgstr "Portas permitidas para o método CONNECT "
++
++#~ msgid "0 = disabled, empty = all"
++#~ msgstr "0 = desativado, vazio = todas"
++
++#~ msgid "Error document"
++#~ msgstr "Documento de erro"
++
++#~ msgid "Filter list"
++#~ msgstr "Lista de filtros"
++
++#~ msgid "Case sensitive filters"
++#~ msgstr "Filtros \"case sensitive\""
++
++#~ msgid "Filter list is a whitelist"
++#~ msgstr "A lista de filtros é uma lista branca"
++
++#~ msgid "Extended regular expression filters"
++#~ msgstr "Filtros com suporte à expressões regulares"
++
++#~ msgid "Filter URLs instead of domains"
++#~ msgstr "Filtrar URLs em vez de domínios"
++
++#~ msgid "Listen on address"
++#~ msgstr "Escutar no endereço"
++
++#~ msgid "Logfile"
++#~ msgstr "Arquivo de log"
++
++#~ msgid "Maximum number of clients"
++#~ msgstr "Número máximo de clientes"
++
++#~ msgid "Maximum requests per thread"
++#~ msgstr "Máximo de solicitações por thread"
++
++#~ msgid "Spare servers to start with"
++#~ msgstr "Servidores sobressalentes iniciar com"
++
++#~ msgid "Statistic document"
++#~ msgstr "Documento de estatísticas"
++
++#~ msgid "Write to syslog"
++#~ msgstr "Escrever para syslog"
++
++#~ msgid "Connection Timeout"
++#~ msgstr "Timeout de conexão"
++
++#~ msgid "Value of Via-Header"
++#~ msgstr "Valor do cabeçalho \"Via-Header\""
++
++#~ msgid "Include client IP"
++#~ msgstr "Incluir o IP do cliente"
++
++#~ msgid "Upstream Control"
++#~ msgstr "Controle de Upstream"
++
++#~ msgid "Type"
++#~ msgstr "Tipo"
++
++#~ msgid "Upstream Proxy"
++#~ msgstr "Proxy para Upstream"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/pt/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/pt/tinyproxy.po
+new file mode 100644
+index 0000000..833a7fa
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/pt/tinyproxy.po
+@@ -0,0 +1,334 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-05-31 23:38+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr "Clientes permitidos"
++
++msgid "Allowed connect ports"
++msgstr "Portas onde é permitido ligar"
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr "Configuração"
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr "Ativar servidor Tinyproxy"
++
++msgid "Error page"
++msgstr "Página de erro"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr "Definições globais"
++
++msgid "Group"
++msgstr "Grupo"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr "Endereço de escuta"
++
++msgid "Listen port"
++msgstr "Porta de escuta"
++
++msgid "Log file"
++msgstr "Ficheiro de log"
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr "Nível do log"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr "Max. servidores sobressalentes"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr "Min. servidores sobressalentes"
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr "Política"
++
++msgid "Privacy settings"
++msgstr "Definições de Privacidade"
++
++msgid "Reject access"
++msgstr "Rejeitar o acesso"
++
++msgid "Server Settings"
++msgstr "Definições do Servidor"
++
++msgid "Server limits"
++msgstr "Limites do servidor"
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++"Especifica o nome do grupo que através do qual o processo do Tinyproxy é "
++"executado"
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr "Iniciar servidores suplentes"
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Target host"
++msgstr "Host de destino"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr "Estado do Tinyproxy"
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr "Tinyproxy é um pequeno e rápido Proxy-HTTP(S) sem suporte à cache"
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr "Usar o syslog"
++
++msgid "User"
++msgstr "Utilizador"
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr "Via proxy"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr "Escreve as mensagens para o syslog ao invés do ficheiro de log"
++
++msgid "X-Tinyproxy header"
++msgstr ""
++
++#~ msgid "Allow access from"
++#~ msgstr "Permitir acesso de"
++
++#~ msgid "Allowed headers for anonymous proxy"
++#~ msgstr "Cabeçalhos permitidos para proxy anônimo"
++
++#~ msgid "Bind outgoing traffic to address"
++#~ msgstr "Associar o tráfego de saída ao endereço"
++
++#~ msgid "Ports allowed for CONNECT method"
++#~ msgstr "Portas permitidas para o método CONNECT "
++
++#~ msgid "0 = disabled, empty = all"
++#~ msgstr "0 = desativado, vazio = todas"
++
++#~ msgid "Error document"
++#~ msgstr "Documento de erro"
++
++#~ msgid "Filter list"
++#~ msgstr "Lista de filtros"
++
++#~ msgid "Case sensitive filters"
++#~ msgstr "Filtros \"case sensitive\""
++
++#~ msgid "Filter list is a whitelist"
++#~ msgstr "A lista de filtros é uma lista branca"
++
++#~ msgid "Extended regular expression filters"
++#~ msgstr "Filtros com suporte à expressões regulares"
++
++#~ msgid "Filter URLs instead of domains"
++#~ msgstr "Filtrar URLs em vez de domínios"
++
++#~ msgid "Listen on address"
++#~ msgstr "Escutar no endereço"
++
++#~ msgid "Logfile"
++#~ msgstr "Arquivo de log"
++
++#~ msgid "Maximum number of clients"
++#~ msgstr "Número máximo de clientes"
++
++#~ msgid "Maximum requests per thread"
++#~ msgstr "Máximo de solicitações por thread"
++
++#~ msgid "Spare servers to start with"
++#~ msgstr "Servidores sobressalentes iniciar com"
++
++#~ msgid "Statistic document"
++#~ msgstr "Documento de estatísticas"
++
++#~ msgid "Write to syslog"
++#~ msgstr "Escrever para syslog"
++
++#~ msgid "Connection Timeout"
++#~ msgstr "Timeout de conexão"
++
++#~ msgid "Value of Via-Header"
++#~ msgstr "Valor do cabeçalho \"Via-Header\""
++
++#~ msgid "Include client IP"
++#~ msgstr "Incluir o IP do cliente"
++
++#~ msgid "Upstream Control"
++#~ msgstr "Controle de Upstream"
++
++#~ msgid "Type"
++#~ msgstr "Tipo"
++
++#~ msgid "Upstream Proxy"
++#~ msgstr "Proxy para Upstream"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/ro/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/ro/tinyproxy.po
+new file mode 100644
+index 0000000..799fecb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/ro/tinyproxy.po
+@@ -0,0 +1,256 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2;\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/ru/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/ru/tinyproxy.po
+new file mode 100644
+index 0000000..f9a3c23
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/ru/tinyproxy.po
+@@ -0,0 +1,294 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: tinyproxy\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-08-15 20:24+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++"<em>Через прокÑи</em> перенаправлÑет запроÑÑ‹ на заданные узлы через "
++"указанный прокÑи, <em>ОтклонÑÑ‚ÑŒ доÑтуп</em> отключает иÑпользование прокÑи "
++"Ð´Ð»Ñ Ð²Ñех узлов"
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++"ДобавлÑет HTTP-заголовок \"X-Tinyproxy\" Ñ IP-адреÑом клиента ко вÑем "
++"перенаправленным запроÑам"
++
++msgid "Allowed clients"
++msgstr "Разрешённые клиенты"
++
++msgid "Allowed connect ports"
++msgstr "Разрешённые порты подключениÑ"
++
++msgid "Bind address"
++msgstr "ÐÐ´Ñ€ÐµÑ Ð¿Ñ€Ð¸Ð²Ñзки"
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++"Разрешить иÑпользование раÑширенных регулÑрных выражений Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ð¸. По "
++"умолчанию, иÑпользуютÑÑ Ð±Ð°Ð·Ð¾Ð²Ñ‹Ðµ POSIX-выражениÑ"
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++"По умолчанию, Ñтроки фильтрации региÑтро-незавиÑимы. Включите Ñту опцию, "
++"чтобы Ñделать Ñравнение региÑтро-завиÑимым"
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++"По умолчанию, Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÑетÑÑ Ð½Ð° оÑнове имени домена. Включите Ñту "
++"опцию, чтобы фильтровать при помощи URL"
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++"По умолчанию, Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÐµÑ‚ в режиме чёрного ÑпиÑка. Включите Ñту "
++"опцию, чтобы разрешить только опредёленные URL или доменные имена"
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++"Может быть IP-адреÑом, диапазоном, именем домена или \".\" Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ хоÑта "
++"без домена"
++
++msgid "Configuration"
++msgstr "КонфигурациÑ"
++
++msgid "Connection timeout"
++msgstr "Таймаут ÑоединениÑ"
++
++msgid "Default deny"
++msgstr "Запретить по умолчанию"
++
++msgid "Enable Tinyproxy server"
++msgstr "Включить Ñервер Tinyproxy"
++
++msgid "Error page"
++msgstr "Страница ошибки"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr "Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑтатиÑтики по URL:"
++
++msgid "Filter by RegExp"
++msgstr "Фильтровать при помощи регулÑрных выражений"
++
++msgid "Filter by URLs"
++msgstr "Фильтровать по URL"
++
++msgid "Filter case-sensitive"
++msgstr "Фильтровать Ñ ÑƒÑ‡Ñ‘Ñ‚Ð¾Ð¼ региÑтра"
++
++msgid "Filter file"
++msgstr "Файл фильтрации"
++
++msgid "Filtering and ACLs"
++msgstr "Ð¤Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¸ ACL"
++
++msgid "General settings"
++msgstr "Общие наÑтройки"
++
++msgid "Group"
++msgstr "Группа"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr "HTML-шаблон Ð´Ð»Ñ ÑтатиÑтики хоÑтов"
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr "HTML-шаблон Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° ошибок HTTP"
++
++msgid "Header whitelist"
++msgstr "Белый ÑпиÑок заголовков"
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++"СпиÑок или диапазон IP-адреÑов, которым разрешено иÑпользовать прокÑи-Ñервер"
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++"СпиÑок разрешённых портов Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° CONNECT. Значение \"0\" разрешает вÑе "
++"порты"
++
++msgid "Listen address"
++msgstr "ÐдреÑ"
++
++msgid "Listen port"
++msgstr "Порт"
++
++msgid "Log file"
++msgstr "Файл журналированиÑ"
++
++msgid "Log file to use for dumping messages"
++msgstr "Файл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи Ñообщений"
++
++msgid "Log level"
++msgstr "Уровень журналированиÑ"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr "Уровень подробноÑти Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа Tinyproxy"
++
++msgid "Max. clients"
++msgstr "МакÑ. кол-во клиентов"
++
++msgid "Max. requests per server"
++msgstr "МакÑ. кол-во запроÑов на Ñервер"
++
++msgid "Max. spare servers"
++msgstr "МакÑ. кол-во Ñерверов ожиданиÑ"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr "МакÑимально допуÑтимое количеÑтво одновременно подключенных клиентов"
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++"МакÑимально допуÑтимое количеÑтво запроÑов на процеÑÑ. ЕÑли превышено, "
++"процеÑÑ Ð±ÑƒÐ´ÐµÑ‚ перезапущен. Ðоль отключает данное ограничение."
++
++msgid "Maximum number of prepared idle processes"
++msgstr "МакÑимальное количеÑтво готовых к обработке процеÑÑов"
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++"МакÑимальное количеÑтво Ñекунд, в течение которых неактивное Ñоединение "
++"оÑтаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼"
++
++msgid "Min. spare servers"
++msgstr "Мин. кол-во Ñерверов ожиданиÑ"
++
++msgid "Minimum number of prepared idle processes"
++msgstr "Минимальное количеÑтво готовых к обработке процеÑÑов"
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr "КоличеÑтво готовых к обработке процеÑÑов при Ñтарте Tinyproxy"
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr "Файл Ñ URL или доменами Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ð¸. Одна запиÑÑŒ на Ñтроку"
++
++msgid "Policy"
++msgstr "Политика"
++
++msgid "Privacy settings"
++msgstr "ÐаÑтройки конфиденциальноÑти"
++
++msgid "Reject access"
++msgstr "ОтклонÑÑ‚ÑŒ доÑтуп"
++
++msgid "Server Settings"
++msgstr "ÐаÑтройки Ñервера"
++
++msgid "Server limits"
++msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñервера"
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++"ОпределÑет HTTP-заголовки, которым разрешено проходить через прокÑи. "
++"ОÑтавьте пуÑтым, чтобы не фильтровать заголовки"
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr "ОпределÑет порт HTTP, на котором Tinyproxy ожидает запроÑÑ‹"
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++"ОпределÑет Ð¸Ð¼Ñ Ñ…Ð¾Ñта Tinyproxy, которое будет иÑпользовано в HTTP-заголовке "
++"Via"
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++"ОпределÑет адреÑ, к которому привÑзываетÑÑ Tinyproxy Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ иÑходÑщих "
++"запроÑов"
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr "ОпределÑет адреÑ, на котором Tinyproxy ожидает запроÑÑ‹"
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr "ОпределÑет Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹, в которой работает Tinyproxy"
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++"ОпределÑет прокÑи воÑходÑщего канала Ð´Ð»Ñ Ð´Ð¾Ñтупа к хоÑту в формате "
++"<code>адреÑ:порт</code>"
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr "ОпределÑет пользователÑ, от имени которого работает Tinyproxy"
++
++msgid "Start spare servers"
++msgstr "ЗапуÑтить указанное количеÑтво готовых к обработке процеÑÑов"
++
++msgid "Statistics page"
++msgstr "Страница ÑтатиÑтики"
++
++msgid "Status"
++msgstr "СоÑтоÑние"
++
++msgid "Target host"
++msgstr "ХоÑÑ‚ назначениÑ"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr "СоÑтоÑние Tinyproxy"
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr "Tinyproxy - быÑтрый HTTP(S)-прокÑи, не иÑпользующий кÑш"
++
++msgid "Upstream Proxies"
++msgstr "ПрокÑи Ð´Ð»Ñ Ð¸ÑходÑщего трафика"
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++"ПрокÑи Ð´Ð»Ñ Ð¸ÑходÑщего трафика при обращении к определённым IP-адреÑам или "
++"доменам."
++
++msgid "Use syslog"
++msgstr "ИÑпользовать ÑиÑтемный журнал"
++
++msgid "User"
++msgstr "Пользователь"
++
++msgid "Via hostname"
++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта Via"
++
++msgid "Via proxy"
++msgstr "Через прокÑи"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr "ЗапиÑывать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° в ÑиÑтемный журнал вмеÑто файла"
++
++msgid "X-Tinyproxy header"
++msgstr "Заголовок X-Tinyproxy"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/sk/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/sk/tinyproxy.po
+new file mode 100644
+index 0000000..128c71d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/sk/tinyproxy.po
+@@ -0,0 +1,255 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/sv/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/sv/tinyproxy.po
+new file mode 100644
+index 0000000..f706056
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/sv/tinyproxy.po
+@@ -0,0 +1,256 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/templates/tinyproxy.pot b/feeds/luci/applications/luci-app-tinyproxy/po/templates/tinyproxy.pot
+new file mode 100644
+index 0000000..712fad9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/templates/tinyproxy.pot
+@@ -0,0 +1,248 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/tr/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/tr/tinyproxy.po
+new file mode 100644
+index 0000000..a7af49d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/tr/tinyproxy.po
+@@ -0,0 +1,255 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/uk/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/uk/tinyproxy.po
+new file mode 100644
+index 0000000..2e268ba
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/uk/tinyproxy.po
+@@ -0,0 +1,256 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/vi/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/vi/tinyproxy.po
+new file mode 100644
+index 0000000..6c825f5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/vi/tinyproxy.po
+@@ -0,0 +1,332 @@
++# tinyproxy.pot
++# generated from ./applications/luci-tinyproxy/luasrc/i18n/tinyproxy.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:58+0200\n"
++"PO-Revision-Date: 2009-08-13 03:36+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr "Log level"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr "Tối đa spare servers"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr "Tối thiểu spare servers"
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr "Từ chối truy cập "
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr "Host mục tiêu"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr "Tinyproxy là một proxy nhỠvà nhanh không-cạc HTTP(S)"
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr "Via proxy"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
++
++#~ msgid "Allow access from"
++#~ msgstr "Cho phép truy cập từ"
++
++#~ msgid "Allowed headers for anonymous proxy"
++#~ msgstr "Cho phép headers cho anonymous proxy"
++
++#~ msgid "Bind outgoing traffic to address"
++#~ msgstr "Blind lưu lượng truy cập ngoài vào địa chỉ"
++
++#~ msgid "Ports allowed for CONNECT method"
++#~ msgstr "Cổng cho phép phương pháp CONNECT"
++
++#~ msgid "0 = disabled, empty = all"
++#~ msgstr "0=vô hiệu hóa, rỗng = tất cả"
++
++#~ msgid "Error document"
++#~ msgstr "Tài liệu lỗi"
++
++#~ msgid "Filter list"
++#~ msgstr "Lá»c list"
++
++#~ msgid "Case sensitive filters"
++#~ msgstr "Lá»c phím nhạy cảm"
++
++#~ msgid "Filter list is a whitelist"
++#~ msgstr "Lá»c list là má»™t whitelist"
++
++#~ msgid "Extended regular expression filters"
++#~ msgstr "Mở rá»™ng các bá»™ lá»c thÆ°á»ng xuyên biểu"
++
++#~ msgid "Filter URLs instead of domains"
++#~ msgstr "Lá»c URLs thay domain"
++
++#~ msgid "Listen on address"
++#~ msgstr "Nghe trên địa chỉ"
++
++#~ msgid "Logfile"
++#~ msgstr "Logfile"
++
++#~ msgid "Maximum number of clients"
++#~ msgstr "Tối đa số lượng khách hàng"
++
++#~ msgid "Maximum requests per thread"
++#~ msgstr "Tối đa yêu cầu trên thread"
++
++#~ msgid "Spare servers to start with"
++#~ msgstr "Spare servers bắt đầu với"
++
++#~ msgid "Statistic document"
++#~ msgstr "Tài liệu thống kê"
++
++#~ msgid "Write to syslog"
++#~ msgstr "viết tới syslog"
++
++#~ msgid "Connection Timeout"
++#~ msgstr "Kết nối hết hiệu lực"
++
++#~ msgid "Value of Via-Header"
++#~ msgstr "Giá trị của Via-Header"
++
++#~ msgid "Include client IP"
++#~ msgstr "Bao gồm IP của khách hàng"
++
++#~ msgid "Upstream Control"
++#~ msgstr "Äiá»u khiển Upstream "
++
++#~ msgid "Type"
++#~ msgstr "Loại "
++
++#~ msgid "Upstream Proxy"
++#~ msgstr "Upstream Proxy"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/zh-cn/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/zh-cn/tinyproxy.po
+new file mode 100644
+index 0000000..828e952
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/zh-cn/tinyproxy.po
+@@ -0,0 +1,262 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-10 19:43+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++"<em>通过代ç†</em>å…许给定的对象ç»è¿‡æŒ‡å®šçš„上行代ç†çš„路由请求。<em>æ‹’ç»ä»£ç†</"
++"em> ç¦ç”¨å¯¹è±¡çš„任何上行代ç†ã€‚"
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr "转å‘请求时增加了一个客户机IP地å€å’Œâ€œX-Tinyproxy“HTTP头"
++
++msgid "Allowed clients"
++msgstr "授æƒå®¢æˆ·ç«¯"
++
++msgid "Allowed connect ports"
++msgstr "å…许的连接端å£"
++
++msgid "Bind address"
++msgstr "绑定地å€"
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++"默认情况下,使用基本的POSIX表达å¼ä½œä¸ºæ»¤è§„则。å¯ç”¨è¿™ä¸ªä»¥ä½¿ç”¨æ­£è§„表达å¼ä»£æ›¿ä¹‹ã€‚"
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr "默认情况下,过滤规则是ä¸åŒºåˆ†å¤§å°å†™çš„。å¯ç”¨å®ƒåˆ™è½¬ä¸ºåŒºåˆ†å¤§å°å†™ã€‚"
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr "默认情况下,过滤器åªåŒ¹é…域å。å¯ç”¨å®ƒä»¥åŒ¹é…URL。"
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++"默认情况下,过滤规则将以黑åå•å½¢å¼åŒ¹é…。å¯ç”¨å®ƒå°†ä»…å…许过滤规则里的URL或域å。"
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr "å¯ä»¥æ˜¯IP地å€æˆ–者范围,也å¯ä»¥æ˜¯åŸŸå或者以\".\"代表任æ„主机"
++
++msgid "Configuration"
++msgstr "é…ç½®"
++
++msgid "Connection timeout"
++msgstr "连接超时时间"
++
++msgid "Default deny"
++msgstr "默认拒ç»"
++
++msgid "Enable Tinyproxy server"
++msgstr "å¯ç”¨Tinyproxy"
++
++msgid "Error page"
++msgstr "错误页é¢"
++
++msgid "Failed to retrieve statistics from url:"
++msgstr "从url未能检索统计信æ¯"
++
++msgid "Filter by RegExp"
++msgstr "正则表达å¼è¿‡æ»¤å™¨"
++
++msgid "Filter by URLs"
++msgstr "基于URL的过滤器"
++
++msgid "Filter case-sensitive"
++msgstr "过滤器大å°å†™æ•æ„Ÿ"
++
++msgid "Filter file"
++msgstr "过滤器文件"
++
++msgid "Filtering and ACLs"
++msgstr "过滤规则和访问控制列表"
++
++msgid "General settings"
++msgstr "基本设置"
++
++msgid "Group"
++msgstr "è¿è¡Œç»„"
++
++msgid "HTML template file to serve for stat host requests"
++msgstr "为统计主机HTML模æ¿æ–‡ä»¶"
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr "HTTP出错页é¢HTML模æ¿"
++
++msgid "Header whitelist"
++msgstr "头白åå•"
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr "å…许访问代ç†æœåŠ¡å™¨çš„IP或IP段列表"
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr "å…许CONNECT方法连接的端å£åˆ—表,0代表所有端å£ã€‚"
++
++msgid "Listen address"
++msgstr "æœåŠ¡åœ°å€"
++
++msgid "Listen port"
++msgstr "æœåŠ¡ç«¯å£"
++
++msgid "Log file"
++msgstr "日志文件"
++
++msgid "Log file to use for dumping messages"
++msgstr "用于消æ¯è½¬å‚¨çš„日志文件"
++
++msgid "Log level"
++msgstr "记录等级"
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr "冗长的Tinyproxy过程日志"
++
++msgid "Max. clients"
++msgstr "最大客户端数"
++
++msgid "Max. requests per server"
++msgstr "å•è¿›ç¨‹æœ€å¤§è¯·æ±‚æ•°"
++
++msgid "Max. spare servers"
++msgstr "最多备用æœåŠ¡å™¨"
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr "å…许åŒæ—¶è¿žæŽ¥çš„最大客户端数é‡"
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr "å•ä¸ªè¿›ç¨‹å…许的最多请求数,超过这个值,进程将é‡å¯ã€‚0表示ä¸é™åˆ¶ã€‚"
++
++msgid "Maximum number of prepared idle processes"
++msgstr "备用进程数的最大值"
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr "活动连接ä¿æŒæ‰“开的最长秒数"
++
++msgid "Min. spare servers"
++msgstr "最少备用æœåŠ¡å™¨"
++
++msgid "Minimum number of prepared idle processes"
++msgstr "备用进程数的最å°å€¼"
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr "å¯åŠ¨Tinyproxy时开å¯çš„进程数"
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr "用于过滤器的文本,包å«URL或者域å,æ¯è¡Œä¸€æ¡ã€‚"
++
++msgid "Policy"
++msgstr "ç­–ç•¥"
++
++msgid "Privacy settings"
++msgstr "策略设置"
++
++msgid "Reject access"
++msgstr "æ‹’ç»è®¿é—®"
++
++msgid "Server Settings"
++msgstr "æœåŠ¡å™¨è®¾ç½®"
++
++msgid "Server limits"
++msgstr "æœåŠ¡å™¨é™åˆ¶"
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr "指定HTTP报头å称å¯ç›´é€šçš„,其它将被丢弃。ä¿ç•™ç©ºï¼Œç¦ç”¨å¤´è¿‡æ»¤"
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr "Tinyproxy正在侦å¬è¯·æ±‚的指定HTTP端å£"
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr "通过HTTP头使用指定Tinyproxy主机å"
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr "指定æœåŠ¡å™¨å‘外转å‘请求时所使用的地å€"
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr "指定æœåŠ¡å™¨æŽ¥æ”¶ä»£ç†è¯·æ±‚所使用的地å€"
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr "指定Tinyproxy进程所属组"
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr "指定上级代ç†. æ ¼å¼ <code>IP地å€:端å£</code>"
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr "指定Tinyproxy进程所属用户"
++
++msgid "Start spare servers"
++msgstr "å¯åŠ¨å¤‡ç”¨æœåŠ¡å™¨"
++
++msgid "Statistics page"
++msgstr "统计页é¢"
++
++msgid "Status"
++msgstr "状æ€"
++
++msgid "Target host"
++msgstr "目标主机"
++
++msgid "Tinyproxy"
++msgstr "Tinyproxy"
++
++msgid "Tinyproxy Status"
++msgstr "Tinyproxy状æ€"
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr "Tinyproxy是一个轻é‡çº§æ— ç¼“存机制的高速HTTP(S)代ç†æœåŠ¡å™¨"
++
++msgid "Upstream Proxies"
++msgstr "上级代ç†"
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr "当访问特定IP地å€æˆ–域å时,使用外出代ç†è§„则定义的代ç†æœåŠ¡å™¨ã€‚"
++
++msgid "Use syslog"
++msgstr "使用系统日志æœåŠ¡"
++
++msgid "User"
++msgstr "è¿è¡Œç”¨æˆ·"
++
++msgid "Via hostname"
++msgstr "通过主机å"
++
++msgid "Via proxy"
++msgstr "通过代ç†"
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr "将日志写入系统日志以代替指定的日志文件"
++
++msgid "X-Tinyproxy header"
++msgstr "X-Tinyproxy头"
+diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/zh-tw/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/zh-tw/tinyproxy.po
+new file mode 100644
+index 0000000..849fcde
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-tinyproxy/po/zh-tw/tinyproxy.po
+@@ -0,0 +1,254 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid ""
++"<em>Via proxy</em> routes requests to the given target via the specifed "
++"upstream proxy, <em>Reject access</em> disables any upstream proxy for the "
++"target"
++msgstr ""
++
++msgid ""
++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded "
++"requests"
++msgstr ""
++
++msgid "Allowed clients"
++msgstr ""
++
++msgid "Allowed connect ports"
++msgstr ""
++
++msgid "Bind address"
++msgstr ""
++
++msgid ""
++"By default, basic POSIX expressions are used for filtering. Enable this to "
++"activate extended regular expressions"
++msgstr ""
++
++msgid ""
++"By default, filter strings are treated as case-insensitive. Enable this to "
++"make the matching case-sensitive"
++msgstr ""
++
++msgid ""
++"By default, filtering is done based on domain names. Enable this to match "
++"against URLs instead"
++msgstr ""
++
++msgid ""
++"By default, the filter rules act as blacklist. Enable this option to only "
++"allow matched URLs or domain names"
++msgstr ""
++
++msgid ""
++"Can be either an IP address or range, a domain name or \".\" for any host "
++"without domain"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Connection timeout"
++msgstr ""
++
++msgid "Default deny"
++msgstr ""
++
++msgid "Enable Tinyproxy server"
++msgstr ""
++
++msgid "Error page"
++msgstr ""
++
++msgid "Failed to retrieve statistics from url:"
++msgstr ""
++
++msgid "Filter by RegExp"
++msgstr ""
++
++msgid "Filter by URLs"
++msgstr ""
++
++msgid "Filter case-sensitive"
++msgstr ""
++
++msgid "Filter file"
++msgstr ""
++
++msgid "Filtering and ACLs"
++msgstr ""
++
++msgid "General settings"
++msgstr ""
++
++msgid "Group"
++msgstr ""
++
++msgid "HTML template file to serve for stat host requests"
++msgstr ""
++
++msgid "HTML template file to serve when HTTP errors occur"
++msgstr ""
++
++msgid "Header whitelist"
++msgstr ""
++
++msgid ""
++"List of IP addresses or ranges which are allowed to use the proxy server"
++msgstr ""
++
++msgid ""
++"List of allowed ports for the CONNECT method. A single value \"0\" allows "
++"all ports"
++msgstr ""
++
++msgid "Listen address"
++msgstr ""
++
++msgid "Listen port"
++msgstr ""
++
++msgid "Log file"
++msgstr ""
++
++msgid "Log file to use for dumping messages"
++msgstr ""
++
++msgid "Log level"
++msgstr ""
++
++msgid "Logging verbosity of the Tinyproxy process"
++msgstr ""
++
++msgid "Max. clients"
++msgstr ""
++
++msgid "Max. requests per server"
++msgstr ""
++
++msgid "Max. spare servers"
++msgstr ""
++
++msgid "Maximum allowed number of concurrently connected clients"
++msgstr ""
++
++msgid ""
++"Maximum allowed number of requests per process. If it is exeeded, the "
++"process is restarted. Zero means unlimited."
++msgstr ""
++
++msgid "Maximum number of prepared idle processes"
++msgstr ""
++
++msgid "Maximum number of seconds an inactive connection is held open"
++msgstr ""
++
++msgid "Min. spare servers"
++msgstr ""
++
++msgid "Minimum number of prepared idle processes"
++msgstr ""
++
++msgid "Number of idle processes to start when launching Tinyproxy"
++msgstr ""
++
++msgid "Plaintext file with URLs or domains to filter. One entry per line"
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Privacy settings"
++msgstr ""
++
++msgid "Reject access"
++msgstr ""
++
++msgid "Server Settings"
++msgstr ""
++
++msgid "Server limits"
++msgstr ""
++
++msgid ""
++"Specifies HTTP header names which are allowed to pass-through, all others "
++"are discarded. Leave empty to disable header filtering"
++msgstr ""
++
++msgid "Specifies the HTTP port Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header"
++msgstr ""
++
++msgid ""
++"Specifies the address Tinyproxy binds to for outbound forwarded requests"
++msgstr ""
++
++msgid "Specifies the addresses Tinyproxy is listening on for requests"
++msgstr ""
++
++msgid "Specifies the group name the Tinyproxy process is running as"
++msgstr ""
++
++msgid ""
++"Specifies the upstream proxy to use for accessing the target host. Format is "
++"<code>address:port</code>"
++msgstr ""
++
++msgid "Specifies the user name the Tinyproxy process is running as"
++msgstr ""
++
++msgid "Start spare servers"
++msgstr ""
++
++msgid "Statistics page"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Target host"
++msgstr ""
++
++msgid "Tinyproxy"
++msgstr ""
++
++msgid "Tinyproxy Status"
++msgstr ""
++
++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy"
++msgstr ""
++
++msgid "Upstream Proxies"
++msgstr ""
++
++msgid ""
++"Upstream proxy rules define proxy servers to use when accessing certain IP "
++"addresses or domains."
++msgstr ""
++
++msgid "Use syslog"
++msgstr ""
++
++msgid "User"
++msgstr ""
++
++msgid "Via hostname"
++msgstr ""
++
++msgid "Via proxy"
++msgstr ""
++
++msgid "Writes log messages to syslog instead of a log file"
++msgstr ""
++
++msgid "X-Tinyproxy header"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/Makefile b/feeds/luci/applications/luci-app-transmission/Makefile
+new file mode 100644
+index 0000000..45175b7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for Transmission
++LUCI_DEPENDS:=+transmission-daemon
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-transmission/luasrc/controller/transmission.lua b/feeds/luci/applications/luci-app-transmission/luasrc/controller/transmission.lua
+new file mode 100644
+index 0000000..b54b92b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/luasrc/controller/transmission.lua
+@@ -0,0 +1,14 @@
++-- Copyright 2012 Gabor Varga <vargagab@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.transmission", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/transmission") then
++ return
++ end
++
++ local page = entry({"admin", "services", "transmission"}, cbi("transmission"), _("Transmission"))
++ page.dependent = true
++
++end
+diff --git a/feeds/luci/applications/luci-app-transmission/luasrc/model/cbi/transmission.lua b/feeds/luci/applications/luci-app-transmission/luasrc/model/cbi/transmission.lua
+new file mode 100644
+index 0000000..ec19f47
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/luasrc/model/cbi/transmission.lua
+@@ -0,0 +1,220 @@
++-- Copyright 2012 Gabor Varga <vargagab@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.sys")
++require("luci.util")
++require("luci.model.ipkg")
++
++local uci = require "luci.model.uci".cursor()
++local trport = uci:get_first("transmission", "transmission", "rpc_port") or 9091
++local running = (luci.sys.call("pidof transmission-daemon > /dev/null") == 0)
++local webinstalled = luci.model.ipkg.installed("transmission-web")
++local button = ""
++if running and webinstalled then
++ button = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type=\"button\" value=\" " .. translate("Open Web Interface") .. " \" onclick=\"window.open('http://'+window.location.hostname+':" .. trport .. "')\"/>"
++end
++
++m = Map("transmission", "Transmission", translate("Transmission daemon is a simple bittorrent client, here you can configure the settings.") .. button)
++
++s=m:section(TypedSection, "transmission", translate("Global settings"))
++s.addremove=false
++s.anonymous=true
++
++enable=s:option(Flag, "enabled", translate("Enabled"))
++enable.rmempty=false
++config_dir=s:option(Value, "config_dir", translate("Config file directory"))
++user=s:option(ListValue, "user", translate("Run daemon as user"))
++local p_user
++for _, p_user in luci.util.vspairs(luci.util.split(luci.sys.exec("cat /etc/passwd | cut -f 1 -d :"))) do
++ user:value(p_user)
++end
++cache_size_mb=s:option(Value, "cache_size_mb", translate("Cache size in MB"))
++
++bandwidth=m:section(TypedSection, "transmission", translate("Bandwidth settings"))
++bandwidth.anonymous=true
++alt_speed_enabled=bandwidth:option(Flag, "alt_speed_enabled", translate("Alternative speed enabled"))
++alt_speed_enabled.enabled="true"
++alt_speed_enabled.disabled="false"
++alt_speed_down=bandwidth:option(Value, "alt_speed_down", translate("Alternative download speed"), "KB/s")
++alt_speed_down:depends("alt_speed_enabled", "true")
++alt_speed_up=bandwidth:option(Value, "alt_speed_up", translate("Alternative upload speed"), "KB/s")
++alt_speed_up:depends("alt_speed_enabled", "true")
++speed_limit_down_enabled=bandwidth:option(Flag, "speed_limit_down_enabled", translate("Speed limit down enabled"))
++speed_limit_down_enabled.enabled="true"
++speed_limit_down_enabled.disabled="false"
++speed_limit_down=bandwidth:option(Value, "speed_limit_down", translate("Speed limit down"), "KB/s")
++speed_limit_down:depends("speed_limit_down_enabled", "true")
++speed_limit_up_enabled=bandwidth:option(Flag, "speed_limit_up_enabled", translate("Speed limit up enabled"))
++speed_limit_up_enabled.enabled="true"
++speed_limit_up_enabled.disabled="false"
++speed_limit_up=bandwidth:option(Value, "speed_limit_up", translate("Speed limit up"), "KB/s")
++speed_limit_up:depends("speed_limit_up_enabled", "true")
++upload_slots_per_torrent=bandwidth:option(Value, "upload_slots_per_torrent", translate("Upload slots per torrent"))
++
++blocklists=m:section(TypedSection, "transmission", translate("Blocklists"))
++blocklists.anonymous=true
++blocklist_enabled=blocklists:option(Flag, "blocklist_enabled", translate("Block list enabled"))
++blocklist_enabled.enabled="true"
++blocklist_enabled.disabled="false"
++blocklist_url=blocklists:option(Value, "blocklist_url", translate("Blocklist URL"))
++blocklist_url:depends("blocklist_enabled", "true")
++
++fileslocations=m:section(TypedSection, "transmission", translate("Files and Locations"))
++fileslocations.anonymous=true
++download_dir=fileslocations:option(Value, "download_dir", translate("Download directory"))
++incomplete_dir_enabled=fileslocations:option(Flag, "incomplete_dir_enabled", translate("Incomplete directory enabled"))
++incomplete_dir_enabled.enabled="true"
++incomplete_dir_enabled.disabled="false"
++incomplete_dir=fileslocations:option(Value, "incomplete_dir", translate("Incomplete directory"))
++incomplete_dir:depends("incomplete_dir_enabled", "true")
++preallocation=fileslocations:option(ListValue, "preallocation", translate("preallocation"))
++preallocation:value("0", translate("Off"))
++preallocation:value("1", translate("Fast"))
++preallocation:value("2", translate("Full"))
++prefetch_enabled=fileslocations:option(Flag, "prefetch_enabled", translate("Prefetch enabled"))
++rename_partial_files=fileslocations:option(Flag, "rename_partial_files", translate("Rename partial files"))
++rename_partial_files.enableid="true"
++rename_partial_files.disabled="false"
++start_added_torrents=fileslocations:option(Flag, "start_added_torrents", translate("Automatically start added torrents"))
++start_added_torrents.enabled="true"
++start_added_torrents.disabled="false"
++trash_original_torrent_files=fileslocations:option(Flag, "trash_original_torrent_files", translate("Trash original torrent files"))
++trash_original_torrent_files.enabled="true"
++trash_original_torrent_files.disabled="false"
++umask=fileslocations:option(Value, "umask", "umask")
++watch_dir_enabled=fileslocations:option(Flag, "watch_dir_enabled", translate("Enable watch directory"))
++watch_dir_enabled.enabled="true"
++watch_dir_enabled.disabled="false"
++watch_dir=fileslocations:option(Value, "watch_dir", translate("Watch directory"))
++watch_dir:depends("watch_dir_enabled", "true")
++
++misc=m:section(TypedSection, "transmission", translate("Miscellaneous"))
++misc.anonymous=true
++dht_enabled=misc:option(Flag, "dht_enabled", translate("DHT enabled"))
++dht_enabled.enabled="true"
++dht_enabled.disabled="false"
++encryption=misc:option(ListValue, "encryption", translate("Encryption"))
++encryption:value("0", translate("Off"))
++encryption:value("1", translate("Preferred"))
++encryption:value("2", translate("Forced"))
++lazy_bitfield_enabled=misc:option(Flag, "lazy_bitfield_enabled", translate("Lazy bitfield enabled"))
++lazy_bitfield_enabled.enabled="true"
++lazy_bitfield_enabled.disabled="false"
++lpd_enabled=misc:option(Flag, "lpd_enabled", translate("LPD enabled"))
++lpd_enabled.enabled="true"
++lpd_enabled.disabled="false"
++message_level=misc:option(ListValue, "message_level", translate("Message level"))
++message_level:value("0", translate("None"))
++message_level:value("1", translate("Error"))
++message_level:value("2", translate("Info"))
++message_level:value("3", translate("Debug"))
++pex_enabled=misc:option(Flag, "pex_enabled", translate("PEX enabled"))
++pex_enabled.enabled="true"
++pex_enabled.disabled="false"
++script_torrent_done_enabled=misc:option(Flag, "script_torrent_done_enabled", translate("Script torrent done enabled"))
++script_torrent_done_enabled.enabled="true"
++script_torrent_done_enabled.disabled="false"
++script_torrent_done_filename=misc:option(Value, "script_torrent_done_filename", translate("Script torrent done filename"))
++script_torrent_done_filename:depends("script_torrent_done_enabled", "true")
++idle_seeding_limit_enabled=misc:option(Flag, "idle_seeding_limit_enabled", translate("Idle seeding limit enabled"))
++idle_seeding_limit_enabled.enabled="true"
++idle_seeding_limit_enabled.disabled="false"
++idle_seeding_limit=misc:option(Value, "idle_seeding_limit", translate("Idle seeding limit"))
++idle_seeding_limit:depends("idle_seeding_limit_enabled", "true")
++utp_enabled=misc:option(Flag, "utp_enabled", translate("uTP enabled"))
++utp_enabled.enabled="true"
++utp_enabled.disabled="false"
++
++peers=m:section(TypedSection, "transmission", translate("Peer settings"))
++peers.anonymous=true
++bind_address_ipv4=peers:option(Value, "bind_address_ipv4", translate("Binding address IPv4"))
++bind_address_ipv4.default="0.0.0.0"
++bind_address_ipv6=peers:option(Value, "bind_address_ipv6", translate("Binding address IPv6"))
++bind_address_ipv6.default="::"
++peer_congestion_algorithm=peers:option(Value, "peer_congestion_algorithm", translate("Peer congestion algorithm"))
++peer_limit_global=peers:option(Value, "peer_limit_global", translate("Global peer limit"))
++peer_limit_per_torrent=peers:option(Value, "peer_limit_per_torrent", translate("Peer limit per torrent"))
++peer_socket_tos=peers:option(Value, "peer_socket_tos", translate("Peer socket tos"))
++
++peerport=m:section(TypedSection, "transmission", translate("Peer Port settings"))
++peerport.anonymous=true
++peer_port=peerport:option(Value, "peer_port", translate("Peer port"))
++peer_port_random_on_start=peerport:option(Flag, "peer_port_random_on_start", translate("Peer port random on start"))
++peer_port_random_on_start.enabled="true"
++peer_port_random_on_start.disabled="false"
++peer_port_random_high=peerport:option(Value, "peer_port_random_high", translate("Peer port random high"))
++peer_port_random_high:depends("peer_port_random_on_start", "true")
++peer_port_random_low=peerport:option(Value, "peer_port_random_low", translate("Peer port random low"))
++peer_port_random_low:depends("peer_port_random_on_start", "true")
++port_forwarding_enabled=peerport:option(Flag, "port_forwarding_enabled", translate("Port forwarding enabled"))
++port_forwarding_enabled.enabled="true"
++port_forwarding_enabled.disabled="false"
++
++rpc=m:section(TypedSection, "transmission", translate("RPC settings"))
++rpc.anonymous=true
++rpc_enabled=rpc:option(Flag, "rpc_enabled", translate("RPC enabled"))
++rpc_enabled.enabled="true"
++rpc_enabled.disabled="false"
++rpc_port=rpc:option(Value, "rpc_port", translate("RPC port"))
++rpc_port:depends("rpc_enabled", "true")
++rpc_bind_address=rpc:option(Value, "rpc_bind_address", translate("RPC bind address"))
++rpc_bind_address:depends("rpc_enabled", "true")
++rpc_url=rpc:option(Value, "rpc_url", translate("RPC URL"))
++rpc_url:depends("rpc_enabled", "true")
++rpc_whitelist_enabled=rpc:option(Flag, "rpc_whitelist_enabled", translate("RPC whitelist enabled"))
++rpc_whitelist_enabled.enabled="true"
++rpc_whitelist_enabled.disabled="false"
++rpc_whitelist_enabled:depends("rpc_enabled", "true")
++rpc_whitelist=rpc:option(Value, "rpc_whitelist", translate("RPC whitelist"))
++rpc_whitelist:depends("rpc_whitelist_enabled", "true")
++rpc_authentication_required=rpc:option(Flag, "rpc_authentication_required", translate("RPC authentication required"))
++rpc_authentication_required.enabled="true"
++rpc_authentication_required.disabled="false"
++rpc_authentication_required:depends("rpc_enabled", "true")
++rpc_username=rpc:option(Value, "rpc_username", translate("RPC username"))
++rpc_username:depends("rpc_authentication_required", "true")
++rpc_password=rpc:option(Value, "rpc_password", translate("RPC password"))
++rpc_password:depends("rpc_authentication_required", "true")
++rpc_password.password = true
++
++scheduling=m:section(TypedSection, "transmission", translate("Scheduling"))
++scheduling.anonymous=true
++alt_speed_time_enabled=scheduling:option(Flag, "alt_speed_time_enabled", translate("Alternative speed timing enabled"))
++alt_speed_time_enabled.enabled="true"
++alt_speed_time_enabled.disabled="false"
++alt_speed_time_enabled.default="false"
++alt_speed_time_enabled:depends("alt_speed_enabled", "true")
++alt_speed_time_day=scheduling:option(Value, "alt_speed_time_day", translate("Alternative speed time day"), translate("Number/bitfield. Start with 0, then for each day you want the scheduler enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - 8, Thursday - 16, Friday - 32, Saturday - 64"))
++alt_speed_time_day:depends("alt_speed_time_enabled", "true")
++alt_speed_time_begin=scheduling:option(Value, "alt_speed_time_begin", translate("Alternative speed time begin"), translate("in minutes from midnight"))
++alt_speed_time_begin:depends("alt_speed_time_enabled", "true")
++alt_speed_time_end=scheduling:option(Value, "alt_speed_time_end", translate("Alternative speed time end"), translate("in minutes from midnight"))
++alt_speed_time_end:depends("alt_speed_time_enabled", "true")
++ratio_limit_enabled=scheduling:option(Flag, "ratio_limit_enabled", translate("Ratio limit enabled"))
++ratio_limit_enabled.enabled="true"
++ratio_limit_enabled.disabled="false"
++ratio_limit=scheduling:option(Value, "ratio_limit", translate("Ratio limit"))
++ratio_limit:depends("ratio_limit_enabled", "true")
++
++queueing=m:section(TypedSection, "transmission", translate("Queueing"))
++queueing.anonymous=true
++download_queue_enabled=queueing:option(Flag, "download_queue_enabled", translate("Download queue enabled"))
++download_queue_enabled.enabled="true"
++download_queue_enabled.disabled="false"
++download_queue_size=queueing:option(Value, "download_queue_size", translate("Download queue size"))
++download_queue_size:depends("download_queue_enabled", "true")
++queue_stalled_enabled=queueing:option(Flag, "queue_stalled_enabled", translate("Queue stalled enabled"))
++queue_stalled_enabled.enabled="true"
++queue_stalled_enabled.disabled="false"
++queue_stalled_minutes=queueing:option(Value, "queue_stalled_minutes", translate("Queue stalled minutes"))
++queue_stalled_minutes:depends("queue_stalled_enabled", "true")
++seed_queue_enabled=queueing:option(Flag, "seed_queue_enabled", translate("Seed queue enabled"))
++seed_queue_enabled.enabled="true"
++seed_queue_enabled.disabled="false"
++seed_queue_size=queueing:option(Value, "seed_queue_size", translate("Seed queue size"))
++seed_queue_size:depends("seed_queue_enabled", "true")
++scrape_paused_torrents_enabled=queueing:option(Flag, "scrape_paused_torrents_enabled", translate("Scrape paused torrents enabled"))
++scrape_paused_torrents_enabled.enabled="true"
++scrape_paused_torrents_enabled.disabled="false"
++
++return m
+diff --git a/feeds/luci/applications/luci-app-transmission/po/ca/transmission.po b/feeds/luci/applications/luci-app-transmission/po/ca/transmission.po
+new file mode 100644
+index 0000000..2498393
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/ca/transmission.po
+@@ -0,0 +1,297 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2014-06-01 23:27+0200\n"
++"PO-Revision-Date: 2014-07-17 23:50+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "Velocitat de baixada alternativa"
++
++msgid "Alternative speed enabled"
++msgstr "Velocitat alternativa habilitada"
++
++msgid "Alternative speed time begin"
++msgstr "Hora inicial de velocitat alternativa"
++
++msgid "Alternative speed time day"
++msgstr "Dia de velocitat alternativa"
++
++msgid "Alternative speed time end"
++msgstr "Hora final de velocitat alternativa"
++
++msgid "Alternative speed timing enabled"
++msgstr "Temporització de velocitat alternativa habilitada"
++
++msgid "Alternative upload speed"
++msgstr "Velocitat de pujada alternativa"
++
++msgid "Automatically start added torrents"
++msgstr "Comença automàticament els torrents afegits"
++
++msgid "Bandwidth settings"
++msgstr "Ajusts d'amplada de banda"
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr "Llista de bloqueig habilitada"
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr "Llistes de bloqueig"
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr "Directori de fitxer de configuració"
++
++msgid "DHT enabled"
++msgstr "DHT habilitat"
++
++msgid "Debug"
++msgstr "Depuració"
++
++msgid "Download directory"
++msgstr "Directori de baixada"
++
++msgid "Download queue enabled"
++msgstr "Cua de baixada habilitada"
++
++msgid "Download queue size"
++msgstr "Mida de cua de baixada"
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr "Habilitat"
++
++msgid "Encryption"
++msgstr "Xifració"
++
++msgid "Error"
++msgstr "Error"
++
++msgid "Fast"
++msgstr "Ràpid"
++
++msgid "Files and Locations"
++msgstr "Fitxers i ubicacions"
++
++msgid "Forced"
++msgstr "Forçat"
++
++msgid "Full"
++msgstr "Ple"
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr "Ajusts globals"
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr "Directori incomplet"
++
++msgid "Incomplete directory enabled"
++msgstr "Directori incomplet habilitat"
++
++msgid "Info"
++msgstr "Informació"
++
++msgid "LPD enabled"
++msgstr "LPD habilitat"
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr "Miscel·lani"
++
++msgid "None"
++msgstr "Cap"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr "Desactivat"
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr "PEX habilitat"
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr "Preferit"
++
++msgid "Prefetch enabled"
++msgstr "Precarrega habilitada"
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr "Autenticació RPC requerida"
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr "RPC habilitat"
++
++msgid "RPC password"
++msgstr "Contrasenya RPC"
++
++msgid "RPC port"
++msgstr "Port RPC"
++
++msgid "RPC settings"
++msgstr "Ajusts RPC"
++
++msgid "RPC username"
++msgstr "Nom d'usuari RPC"
++
++msgid "RPC whitelist"
++msgstr "Llista blanca RPC"
++
++msgid "RPC whitelist enabled"
++msgstr "Llista blanca RPC habilitada"
++
++msgid "Ratio limit"
++msgstr "Límit de ràtio"
++
++msgid "Ratio limit enabled"
++msgstr "Límit de ràtio habilitat"
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr "Executa el dimoni com l'usuari"
++
++msgid "Scheduling"
++msgstr "Programació"
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr "Transmission"
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++"El dimoni Transmission és un client de bittorrent senzill, aquí podeu "
++"configurar els ajusts."
++
++msgid "Trash original torrent files"
++msgstr "Suprimeix els fitxers de torrent originals"
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr "Directori que vigilar"
++
++msgid "in minutes from midnight"
++msgstr "en minuts des de la mitjanit"
++
++msgid "preallocation"
++msgstr "preassignació"
++
++msgid "uTP enabled"
++msgstr "uTP habilitat"
+diff --git a/feeds/luci/applications/luci-app-transmission/po/cs/transmission.po b/feeds/luci/applications/luci-app-transmission/po/cs/transmission.po
+new file mode 100644
+index 0000000..b6166ec
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/cs/transmission.po
+@@ -0,0 +1,295 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-06 17:54+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "Alternativní rychlost download"
++
++msgid "Alternative speed enabled"
++msgstr "Povolit alternativní rychlost"
++
++msgid "Alternative speed time begin"
++msgstr "ZaÄátek doby alternativní rychlosti"
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr "Konec doby alternativní rychlosti"
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr "Alternativní rychlost uploadu"
++
++msgid "Automatically start added torrents"
++msgstr "Automaticky zaÄít stahovat nové torrenty"
++
++msgid "Bandwidth settings"
++msgstr "Nastavení přenosové rychlosti"
++
++msgid "Binding address IPv4"
++msgstr "Svázání s IPv4 adresou"
++
++msgid "Binding address IPv6"
++msgstr "Svázání s IPv6 adresou"
++
++msgid "Block list enabled"
++msgstr "Povolit Äernou listinu"
++
++msgid "Blocklist URL"
++msgstr "URL Äerné listiny"
++
++msgid "Blocklists"
++msgstr "Černé listiny"
++
++msgid "Cache size in MB"
++msgstr "Velikost mezipaměti v MB"
++
++msgid "Config file directory"
++msgstr "Složka pro uložení konfiguraÄního souboru"
++
++msgid "DHT enabled"
++msgstr "Povolit DHT"
++
++msgid "Debug"
++msgstr "Debug"
++
++msgid "Download directory"
++msgstr "Adresář pro stahované"
++
++msgid "Download queue enabled"
++msgstr "Povolit stahovací frontu"
++
++msgid "Download queue size"
++msgstr "Velikost stahovací fronty"
++
++msgid "Enable watch directory"
++msgstr "Povolit sledování složky"
++
++msgid "Enabled"
++msgstr "Povolit"
++
++msgid "Encryption"
++msgstr "Šifrování"
++
++msgid "Error"
++msgstr "Chyba"
++
++msgid "Fast"
++msgstr "Rychlá"
++
++msgid "Files and Locations"
++msgstr "Soubory a umístění"
++
++msgid "Forced"
++msgstr "Vynucené"
++
++msgid "Full"
++msgstr "Plná"
++
++msgid "Global peer limit"
++msgstr "Globální peer limit"
++
++msgid "Global settings"
++msgstr "Globální nastavení"
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr "Složka pro nedokonÄená stahování"
++
++msgid "Incomplete directory enabled"
++msgstr "Povolit složku pro nedokonÄená stahování"
++
++msgid "Info"
++msgstr "Info"
++
++msgid "LPD enabled"
++msgstr "Povolit LPD"
++
++msgid "Lazy bitfield enabled"
++msgstr "Povolit lazy bitfield"
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr "Ostatní"
++
++msgid "None"
++msgstr "Žádný"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr "Vypnuta"
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr "Povolit PEX"
++
++msgid "Peer Port settings"
++msgstr "Nastavení peer portu"
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr "Peer limit na torrent"
++
++msgid "Peer port"
++msgstr "Peer port"
++
++msgid "Peer port random high"
++msgstr "Peer port náhodný nejvyšší"
++
++msgid "Peer port random low"
++msgstr "Peer port náhodný nejnižší"
++
++msgid "Peer port random on start"
++msgstr "Náhodný peer port při startu"
++
++msgid "Peer settings"
++msgstr "Nastavení peer"
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr "Povolit port forwarding"
++
++msgid "Preferred"
++msgstr "Preferované"
++
++msgid "Prefetch enabled"
++msgstr "Povolit pÅ™ednaÄítání"
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr "RPC URL"
++
++msgid "RPC authentication required"
++msgstr "RPC ověřování vyžadováno"
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr "Povolit RPC"
++
++msgid "RPC password"
++msgstr "RPC heslo"
++
++msgid "RPC port"
++msgstr "RPC port"
++
++msgid "RPC settings"
++msgstr "Nastavení RPC"
++
++msgid "RPC username"
++msgstr "Uživatelské jméno RPC"
++
++msgid "RPC whitelist"
++msgstr "RPC whitelist"
++
++msgid "RPC whitelist enabled"
++msgstr "Povolit RPC whitelist"
++
++msgid "Ratio limit"
++msgstr "Ratio limit"
++
++msgid "Ratio limit enabled"
++msgstr "Povolit ratio limit"
++
++msgid "Rename partial files"
++msgstr "PÅ™ejmenovat dílÄí soubory"
++
++msgid "Run daemon as user"
++msgstr "Spustit daemona jako uživatel"
++
++msgid "Scheduling"
++msgstr "Plánování"
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr "Povolit seed frontu"
++
++msgid "Seed queue size"
++msgstr "Velikost seed fronty"
++
++msgid "Speed limit down"
++msgstr "Rychlostní limit downloadu"
++
++msgid "Speed limit down enabled"
++msgstr "Povolit rychlostní limit downloadu"
++
++msgid "Speed limit up"
++msgstr "Rychlostní limit uploadu"
++
++msgid "Speed limit up enabled"
++msgstr "Povolit rychlostní limit uploadu"
++
++msgid "Transmission"
++msgstr "Transmission"
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++"Transmission daemon je jednoduchý BitTorrent klient, zde můžete provést jeho "
++"nastavení."
++
++msgid "Trash original torrent files"
++msgstr "Odstranit původní torrent soubory"
++
++msgid "Upload slots per torrent"
++msgstr "Upload sloty na torrent"
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr "v minutách od půlnoci"
++
++msgid "preallocation"
++msgstr "prealokace"
++
++msgid "uTP enabled"
++msgstr "Povolit uTP"
+diff --git a/feeds/luci/applications/luci-app-transmission/po/de/transmission.po b/feeds/luci/applications/luci-app-transmission/po/de/transmission.po
+new file mode 100644
+index 0000000..4b665ff
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/de/transmission.po
+@@ -0,0 +1,300 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-07-17 15:08+0200\n"
++"PO-Revision-Date: 2013-01-28 23:03+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "Alternative Download-Geschwindigkeit"
++
++msgid "Alternative speed enabled"
++msgstr "Alternative Geschwindigkeit aktivieren"
++
++msgid "Alternative speed time begin"
++msgstr "Zeit für Beginn der alternativen Geschwindigkeit"
++
++msgid "Alternative speed time day"
++msgstr "Tag für alternative Geschwindigkeit"
++
++msgid "Alternative speed time end"
++msgstr "Zeit für Ende der alternativen Geschwindigkeit"
++
++msgid "Alternative speed timing enabled"
++msgstr "Zeiteinstellung für alternative Geschwindigkeit eingeschaltet"
++
++msgid "Alternative upload speed"
++msgstr "Alternative Upload-Geschwindigkeit"
++
++msgid "Automatically start added torrents"
++msgstr "Hinzugefügte Torrents automatisch starten"
++
++msgid "Bandwidth settings"
++msgstr "Bandbreiten-Einstellungen"
++
++msgid "Binding address IPv4"
++msgstr "IPv4-Adressbindung"
++
++msgid "Binding address IPv6"
++msgstr "IPv6-Adressbindung"
++
++msgid "Block list enabled"
++msgstr "Blockier-Liste eingeschaltet"
++
++msgid "Blocklist URL"
++msgstr "URL für Blockier-Liste"
++
++msgid "Blocklists"
++msgstr "Blockier-Listen"
++
++msgid "Cache size in MB"
++msgstr "Cache-Größe in MB"
++
++msgid "Config file directory"
++msgstr "Verzeichnis für Konfigurationsdatei"
++
++msgid "DHT enabled"
++msgstr "DHT eingeschaltet"
++
++msgid "Debug"
++msgstr "Debug"
++
++msgid "Download directory"
++msgstr "Verzeichnis für Downloads"
++
++msgid "Download queue enabled"
++msgstr "Download-Warteschlange eingeschaltet"
++
++msgid "Download queue size"
++msgstr "Größe der Download-Warteschlange"
++
++msgid "Enable watch directory"
++msgstr "Verzeichnisüberprüfung eingeschaltet"
++
++msgid "Enabled"
++msgstr "Eingeschaltet"
++
++msgid "Encryption"
++msgstr "Verschlüsselung"
++
++msgid "Error"
++msgstr "Fehler"
++
++msgid "Fast"
++msgstr "Schnell"
++
++msgid "Files and Locations"
++msgstr "Dateien und Orte"
++
++msgid "Forced"
++msgstr "Erzwungen"
++
++msgid "Full"
++msgstr "Voll"
++
++msgid "Global peer limit"
++msgstr "Allgemeines Peer-Limit"
++
++msgid "Global settings"
++msgstr "Allgemeine Einstellungen"
++
++msgid "Idle seeding limit"
++msgstr "Begrenzung für Seeding im Idle-Zustand"
++
++msgid "Idle seeding limit enabled"
++msgstr "Begrenzung für Seeding im Idle-Zustand eingeschaltet"
++
++msgid "Incomplete directory"
++msgstr "unvollständiges Verzeichnis"
++
++msgid "Incomplete directory enabled"
++msgstr "unvollständiges Verzeichnis eingeschaltet"
++
++msgid "Info"
++msgstr "Info"
++
++msgid "LPD enabled"
++msgstr "LPD eingeschaltet"
++
++msgid "Lazy bitfield enabled"
++msgstr "Lazy-Bitfield eingeschaltet"
++
++msgid "Message level"
++msgstr "Nachrichten-Ebene"
++
++msgid "Miscellaneous"
++msgstr "Verschiedenes"
++
++msgid "None"
++msgstr "Keines"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++"Zahl/Bitfeld. Starte mit 0, für jeden Tag, an dem die Zeitplanung aktiv sein "
++"soll, füge einen Wert hinzu. Sonntag - 1, Montag - 2, Dienstag - 4, "
++"Mittwoch - 8, Donnerstag - 16, Freitag - 32, Samstag - 64"
++
++msgid "Off"
++msgstr "Aus"
++
++msgid "Open Web Interface"
++msgstr "Offenes Web-Interface"
++
++msgid "PEX enabled"
++msgstr "PEX aktiv"
++
++msgid "Peer Port settings"
++msgstr "Einstellungen für Peer-Port"
++
++msgid "Peer congestion algorithm"
++msgstr "Algorithmus für Peer-Überlastungen"
++
++msgid "Peer limit per torrent"
++msgstr "Peer-Begrenzung pro Torrent"
++
++msgid "Peer port"
++msgstr "Peer-Port"
++
++msgid "Peer port random high"
++msgstr "Peer-Port: hohe Zufallszahl"
++
++msgid "Peer port random low"
++msgstr "Peer-Port: niedrige Zufallszahl"
++
++msgid "Peer port random on start"
++msgstr "Zufälliger Peer-Port beim Start"
++
++msgid "Peer settings"
++msgstr "Peer-Einstellungen"
++
++msgid "Peer socket tos"
++msgstr "Peer-Socket-TOS"
++
++msgid "Port forwarding enabled"
++msgstr "Port-Weiterleitung aktiv"
++
++msgid "Preferred"
++msgstr "Bevorzugt"
++
++msgid "Prefetch enabled"
++msgstr "Prefetch aktiv"
++
++msgid "Queue stalled enabled"
++msgstr "Warteschlangen-Halt aktiv"
++
++msgid "Queue stalled minutes"
++msgstr "Warteschlangen-Halt in Minuten"
++
++msgid "Queueing"
++msgstr "in Warteschlange stellen"
++
++msgid "RPC URL"
++msgstr "RPC-URL"
++
++msgid "RPC authentication required"
++msgstr "RPC-Anmeldung erforderlich"
++
++msgid "RPC bind address"
++msgstr "RPC-Adressbindung"
++
++msgid "RPC enabled"
++msgstr "RPC eingeschaltet"
++
++msgid "RPC password"
++msgstr "RPC-Passwort"
++
++msgid "RPC port"
++msgstr "RPC-Port"
++
++msgid "RPC settings"
++msgstr "RPC-Einstellungen"
++
++msgid "RPC username"
++msgstr "RPC-Benutzername"
++
++msgid "RPC whitelist"
++msgstr "RPC-Einschlussliste"
++
++msgid "RPC whitelist enabled"
++msgstr "RPC-Einschlussliste aktiv"
++
++msgid "Ratio limit"
++msgstr "Ratio-Begrenzung"
++
++msgid "Ratio limit enabled"
++msgstr "Ratio-Begrenzung aktiv"
++
++msgid "Rename partial files"
++msgstr "Teildateien umbenennen"
++
++msgid "Run daemon as user"
++msgstr "Den Daemon als Benutzer starten"
++
++msgid "Scheduling"
++msgstr "Zeitplanung"
++
++msgid "Scrape paused torrents enabled"
++msgstr "Pausierte Torrents beschneiden"
++
++msgid "Script torrent done enabled"
++msgstr "Skript nach Abschluss eines Torrents aktiv"
++
++msgid "Script torrent done filename"
++msgstr "Skript nach Abschluss eines Torrents: Dateiname"
++
++msgid "Seed queue enabled"
++msgstr "Seed-Warteschlange aktiv"
++
++msgid "Seed queue size"
++msgstr "Größe der Seed-Warteschlange"
++
++msgid "Speed limit down"
++msgstr "Geschwindigkeitsbegrenzung Down"
++
++msgid "Speed limit down enabled"
++msgstr "Geschwindigkeitsbegrenzung Down aktiv"
++
++msgid "Speed limit up"
++msgstr "Geschwindigkeitsbegrenzung Up"
++
++msgid "Speed limit up enabled"
++msgstr "Geschwindigkeitsbegrenzung Up aktiv"
++
++msgid "Transmission"
++msgstr "Ãœbertragung"
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++"Der Transmission-Daemon ist ein einfacher Bittorent-Client. Hier können Sie "
++"ihn einstellen."
++
++msgid "Trash original torrent files"
++msgstr "Originale Torrent-Dateien verwerfen"
++
++msgid "Upload slots per torrent"
++msgstr "Upload-Plätze pro Torrent"
++
++msgid "Watch directory"
++msgstr "Ãœberwachtes Verzeichnis"
++
++msgid "in minutes from midnight"
++msgstr "in Minuten ab Mitternacht"
++
++msgid "preallocation"
++msgstr "Vorbelegung"
++
++msgid "uTP enabled"
++msgstr "uTP eingeschaltet"
+diff --git a/feeds/luci/applications/luci-app-transmission/po/el/transmission.po b/feeds/luci/applications/luci-app-transmission/po/el/transmission.po
+new file mode 100644
+index 0000000..3125fc2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/el/transmission.po
+@@ -0,0 +1,280 @@
++msgid "Alternative download speed"
++msgstr ""
++
++msgid "Alternative speed enabled"
++msgstr ""
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr ""
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/en/transmission.po b/feeds/luci/applications/luci-app-transmission/po/en/transmission.po
+new file mode 100644
+index 0000000..3125fc2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/en/transmission.po
+@@ -0,0 +1,280 @@
++msgid "Alternative download speed"
++msgstr ""
++
++msgid "Alternative speed enabled"
++msgstr ""
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr ""
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/es/transmission.po b/feeds/luci/applications/luci-app-transmission/po/es/transmission.po
+new file mode 100644
+index 0000000..9eeb2fb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/es/transmission.po
+@@ -0,0 +1,299 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-08-21 22:06+0200\n"
++"PO-Revision-Date: 2012-08-26 10:47+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "Velocidad de descarga alternativa"
++
++msgid "Alternative speed enabled"
++msgstr "Velocidad alternativa activada"
++
++msgid "Alternative speed time begin"
++msgstr "Hora de inicio de la velocidad alternativa"
++
++msgid "Alternative speed time day"
++msgstr "Día de la velocidad alternativa"
++
++msgid "Alternative speed time end"
++msgstr "Hora de fin de la velocidad alternativa"
++
++msgid "Alternative speed timing enabled"
++msgstr "Temporización alternativa de la velocidad activada"
++
++msgid "Alternative upload speed"
++msgstr "Velocidad de subida alternativa"
++
++msgid "Automatically start added torrents"
++msgstr "Arrancar automáticamente los torrents al añadirlos"
++
++msgid "Bandwidth settings"
++msgstr "Configuración del ancho de banda"
++
++msgid "Binding address IPv4"
++msgstr "Dirección IPv4 a asociar"
++
++msgid "Binding address IPv6"
++msgstr "Dirección IPv6 a asociar"
++
++msgid "Block list enabled"
++msgstr "Lista de bloques activada"
++
++msgid "Blocklist URL"
++msgstr "URL de la lista de bloques"
++
++msgid "Blocklists"
++msgstr "Listas de bloques"
++
++msgid "Cache size in MB"
++msgstr "Tamaño de la caché en MB"
++
++msgid "Config file directory"
++msgstr "Directorio del fichero de configuración"
++
++msgid "DHT enabled"
++msgstr "DHT activado"
++
++msgid "Debug"
++msgstr "Depurar"
++
++msgid "Download directory"
++msgstr "Directorio de descargas"
++
++msgid "Download queue enabled"
++msgstr "Cola de descargas activada"
++
++msgid "Download queue size"
++msgstr "Tamaño de la cola de descargas"
++
++msgid "Enable watch directory"
++msgstr "Activar directorio a observar"
++
++msgid "Enabled"
++msgstr "Activado"
++
++msgid "Encryption"
++msgstr "Encriptado"
++
++msgid "Error"
++msgstr "Error"
++
++msgid "Fast"
++msgstr "Rápido"
++
++msgid "Files and Locations"
++msgstr "Ficheros y posiciones"
++
++msgid "Forced"
++msgstr "Forzado"
++
++msgid "Full"
++msgstr "Lleno"
++
++msgid "Global peer limit"
++msgstr "Límite global de máquinas"
++
++msgid "Global settings"
++msgstr "Configuración global"
++
++msgid "Idle seeding limit"
++msgstr "Límite de sembrado en vacío"
++
++msgid "Idle seeding limit enabled"
++msgstr "Límite de sembrado en vacío activado"
++
++msgid "Incomplete directory"
++msgstr "Directorio incompleto"
++
++msgid "Incomplete directory enabled"
++msgstr "Directorio incompleto activado"
++
++msgid "Info"
++msgstr "Información"
++
++msgid "LPD enabled"
++msgstr "LPD activado"
++
++msgid "Lazy bitfield enabled"
++msgstr "Lazy bitfield activado"
++
++msgid "Message level"
++msgstr "Nivel de mensajes"
++
++msgid "Miscellaneous"
++msgstr "Varios"
++
++msgid "None"
++msgstr "Ninguno"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++"Número/en bits. Empiece con 0 y por cada día que quiera que se active el "
++"programados sume: Para domingo - 1, lunes - 2, martes - 4, miércoles - 8, "
++"jueves - 16, viernes - 32, sábado - 64"
++
++msgid "Off"
++msgstr "Apagado"
++
++msgid "Open Web Interface"
++msgstr "Interfaz de red abierta"
++
++msgid "PEX enabled"
++msgstr "PEX activado"
++
++msgid "Peer Port settings"
++msgstr "Configuración de puertos"
++
++msgid "Peer congestion algorithm"
++msgstr "Algoritmo de congestión"
++
++msgid "Peer limit per torrent"
++msgstr "Límite por torrent"
++
++msgid "Peer port"
++msgstr "Puerto"
++
++msgid "Peer port random high"
++msgstr "Puerto más alto"
++
++msgid "Peer port random low"
++msgstr "Puerto más bajo"
++
++msgid "Peer port random on start"
++msgstr "Puerto aleatorio al arrancar"
++
++msgid "Peer settings"
++msgstr "Configuración de peer"
++
++msgid "Peer socket tos"
++msgstr "Peer socket tos"
++
++msgid "Port forwarding enabled"
++msgstr "Traspaso de puertos activado"
++
++msgid "Preferred"
++msgstr "Preferente"
++
++msgid "Prefetch enabled"
++msgstr "Activar prefetch"
++
++msgid "Queue stalled enabled"
++msgstr "Activar bloqueo de cola"
++
++msgid "Queue stalled minutes"
++msgstr "Minutos de bloqueo de cola"
++
++msgid "Queueing"
++msgstr "Colas"
++
++msgid "RPC URL"
++msgstr "URL RPC"
++
++msgid "RPC authentication required"
++msgstr "Autentificación RPC obligatoria"
++
++msgid "RPC bind address"
++msgstr "Dirección de asociación RPC"
++
++msgid "RPC enabled"
++msgstr "RPC activado"
++
++msgid "RPC password"
++msgstr "Contraseña RPC"
++
++msgid "RPC port"
++msgstr "Puerto RPC"
++
++msgid "RPC settings"
++msgstr "Configuración RPC"
++
++msgid "RPC username"
++msgstr "Nombre de usuario RPC"
++
++msgid "RPC whitelist"
++msgstr "Lista blanca RPC"
++
++msgid "RPC whitelist enabled"
++msgstr "Activar listas blancas RPC"
++
++msgid "Ratio limit"
++msgstr "Límite de ratio"
++
++msgid "Ratio limit enabled"
++msgstr "Límite de ratio activado"
++
++msgid "Rename partial files"
++msgstr "Renombrar ficheros parciales"
++
++msgid "Run daemon as user"
++msgstr "Ejecutar demonio como usuario"
++
++msgid "Scheduling"
++msgstr "Programación"
++
++msgid "Scrape paused torrents enabled"
++msgstr "Activar scrape de torrents en pausa"
++
++msgid "Script torrent done enabled"
++msgstr "Activar script de fin de torrent"
++
++msgid "Script torrent done filename"
++msgstr "Nombre de fichero del script"
++
++msgid "Seed queue enabled"
++msgstr "Cola de seed activada"
++
++msgid "Seed queue size"
++msgstr "Tamaño máximo de la cola de seed"
++
++msgid "Speed limit down"
++msgstr "Velocidad mínima"
++
++msgid "Speed limit down enabled"
++msgstr "Velocidad mínima activada"
++
++msgid "Speed limit up"
++msgstr "Velocidad máxima"
++
++msgid "Speed limit up enabled"
++msgstr "Velocidad máxima activada"
++
++msgid "Transmission"
++msgstr "Transmission"
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++"Configuración. El demonio Transmission es un cliente de bittorrent simple."
++
++msgid "Trash original torrent files"
++msgstr "Eliminar los ficheros torrent originales"
++
++msgid "Upload slots per torrent"
++msgstr "Ranuras de subida por torrent"
++
++msgid "Watch directory"
++msgstr "Directorio a vigilar"
++
++msgid "in minutes from midnight"
++msgstr "en minutos para la media noche"
++
++msgid "preallocation"
++msgstr "precolocación"
++
++msgid "uTP enabled"
++msgstr "uTP activado"
+diff --git a/feeds/luci/applications/luci-app-transmission/po/fr/transmission.po b/feeds/luci/applications/luci-app-transmission/po/fr/transmission.po
+new file mode 100644
+index 0000000..3125fc2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/fr/transmission.po
+@@ -0,0 +1,280 @@
++msgid "Alternative download speed"
++msgstr ""
++
++msgid "Alternative speed enabled"
++msgstr ""
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr ""
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/he/transmission.po b/feeds/luci/applications/luci-app-transmission/po/he/transmission.po
+new file mode 100644
+index 0000000..3125fc2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/he/transmission.po
+@@ -0,0 +1,280 @@
++msgid "Alternative download speed"
++msgstr ""
++
++msgid "Alternative speed enabled"
++msgstr ""
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr ""
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/hu/transmission.po b/feeds/luci/applications/luci-app-transmission/po/hu/transmission.po
+new file mode 100644
+index 0000000..040f838
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/hu/transmission.po
+@@ -0,0 +1,300 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-04-17 20:30+0200\n"
++"PO-Revision-Date: 2012-04-26 14:30+0200\n"
++"Last-Translator: Gyula <pro564@hotmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Alternative download speed"
++msgstr "Alternatív letöltési sebesség"
++
++msgid "Alternative speed enabled"
++msgstr "Alternatív sebesség engedélyezve"
++
++msgid "Alternative speed time begin"
++msgstr "Alternatív sebesség kezdő időpont"
++
++msgid "Alternative speed time day"
++msgstr "Alternatív sebesség napok"
++
++msgid "Alternative speed time end"
++msgstr "Alternatív sebesség záró időpont"
++
++msgid "Alternative speed timing enabled"
++msgstr "Alternatív sebesség időzítés engedélyezve"
++
++msgid "Alternative upload speed"
++msgstr "Alternatív feltöltési sebesség"
++
++msgid "Automatically start added torrents"
++msgstr "Hozzáadott torrentek automatikus indítása"
++
++msgid "Bandwidth settings"
++msgstr "Sávszélesség beállítások"
++
++msgid "Binding address IPv4"
++msgstr "Rögzített IPv4 cím"
++
++msgid "Binding address IPv6"
++msgstr "Rögzített IPv6 cím"
++
++msgid "Block list enabled"
++msgstr "Tiltólista engedélyezés"
++
++msgid "Blocklist URL"
++msgstr "Tiltólista URL"
++
++msgid "Blocklists"
++msgstr "Tiltólista"
++
++msgid "Cache size in MB"
++msgstr "Puffer méret (MB)"
++
++msgid "Config file directory"
++msgstr "Beállítási fájl könyvtára"
++
++msgid "DHT enabled"
++msgstr "DHT engedélyezve"
++
++msgid "Debug"
++msgstr "Nyomkövetés"
++
++msgid "Download directory"
++msgstr "Letöltési könyvtár"
++
++msgid "Download queue enabled"
++msgstr "Letöltési sor engedélyezve"
++
++msgid "Download queue size"
++msgstr "Letöltési sor mérete"
++
++msgid "Enable watch directory"
++msgstr "Figyelt könyvtár(aut. indítás)"
++
++msgid "Enabled"
++msgstr "Engedélyezve"
++
++msgid "Encryption"
++msgstr "Titkosítás"
++
++msgid "Error"
++msgstr "Hiba"
++
++msgid "Fast"
++msgstr "Gyors"
++
++msgid "Files and Locations"
++msgstr "Fájlok és helyek"
++
++msgid "Forced"
++msgstr "Erőltetve"
++
++msgid "Full"
++msgstr "Teljes"
++
++msgid "Global peer limit"
++msgstr "Globális partnerkorlát"
++
++msgid "Global settings"
++msgstr "Globális beálllítások"
++
++msgid "Idle seeding limit"
++msgstr "Üresjárati seedkorlát"
++
++msgid "Idle seeding limit enabled"
++msgstr "Üresjárati seedkorlát engedélyezése"
++
++msgid "Incomplete directory"
++msgstr "Befejezetlen fájlok mappája"
++
++msgid "Incomplete directory enabled"
++msgstr "Befejezetlen fájlok mappájának engedélyezése"
++
++msgid "Info"
++msgstr "Infó"
++
++msgid "LPD enabled"
++msgstr "LPD engedélyezése"
++
++msgid "Lazy bitfield enabled"
++msgstr "Lazy bitfield engedélyezése"
++
++msgid "Message level"
++msgstr "Naplózási szint"
++
++msgid "Miscellaneous"
++msgstr "Egyéb"
++
++msgid "None"
++msgstr "Nincs"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++"Szám/bitmező. Kezdj 0-val, és minden napnál, amikor az ütemezőt be akarod "
++"kapcsolni, adj hozzá egy értéket. Vasárnap - 1, Hétfő - 2, Kedd - 4, Szerda "
++"- 8, Csütörtök - 16, Péntek - 32, Szombat - 64"
++
++msgid "Off"
++msgstr "Ki"
++
++msgid "Open Web Interface"
++msgstr "Webes felület megnyitása"
++
++msgid "PEX enabled"
++msgstr "PEX engedélyezése"
++
++msgid "Peer Port settings"
++msgstr "Partner port beállítások"
++
++msgid "Peer congestion algorithm"
++msgstr "Partner torlódási algoritmus"
++
++msgid "Peer limit per torrent"
++msgstr "Torrentenkénti partnerkorlát"
++
++msgid "Peer port"
++msgstr "Partner port"
++
++msgid "Peer port random high"
++msgstr "Véletlenszerű magas partner port"
++
++msgid "Peer port random low"
++msgstr "Véletlenszerű alacsony partner port"
++
++msgid "Peer port random on start"
++msgstr "Véletlenszerű partner port induláskor"
++
++msgid "Peer settings"
++msgstr "Partner beállítások"
++
++msgid "Peer socket tos"
++msgstr "Partner szolgáltatás típus"
++
++msgid "Port forwarding enabled"
++msgstr "Portátirányítás engedélyezése"
++
++msgid "Preferred"
++msgstr "Előnyben részesített"
++
++msgid "Prefetch enabled"
++msgstr "Előtöltés engedélyezése"
++
++msgid "Queue stalled enabled"
++msgstr "Elakadt sor engedélyezése"
++
++msgid "Queue stalled minutes"
++msgstr "Elakadás időtartama"
++
++msgid "Queueing"
++msgstr "Sorbaállítás"
++
++msgid "RPC URL"
++msgstr "RPC URL"
++
++msgid "RPC authentication required"
++msgstr "RPC azonosítás megkövetelése"
++
++msgid "RPC bind address"
++msgstr "RPC cím rögzítése"
++
++msgid "RPC enabled"
++msgstr "RPC engedélyezése"
++
++msgid "RPC password"
++msgstr "RPC jelszó"
++
++msgid "RPC port"
++msgstr "RPC port"
++
++msgid "RPC settings"
++msgstr "RPC beállítások"
++
++msgid "RPC username"
++msgstr "RPC felhasználónév"
++
++msgid "RPC whitelist"
++msgstr "RPC fehérlista"
++
++msgid "RPC whitelist enabled"
++msgstr "RPC fehérlista engedélyezése"
++
++msgid "Ratio limit"
++msgstr "Aránykorlát"
++
++msgid "Ratio limit enabled"
++msgstr "Aránykorlát engedélyezése"
++
++msgid "Rename partial files"
++msgstr "Félkész fájlok átnevezése"
++
++msgid "Run daemon as user"
++msgstr "Daemon indítása, mint"
++
++msgid "Scheduling"
++msgstr "Ütemezés"
++
++msgid "Scrape paused torrents enabled"
++msgstr "Ãlló torrentek adatainak lekérdezése"
++
++msgid "Script torrent done enabled"
++msgstr "Letöltés utáni script engedélyezése"
++
++msgid "Script torrent done filename"
++msgstr "Letöltés utáni script fájlneve"
++
++msgid "Seed queue enabled"
++msgstr "Feltöltési sor engedélyezése"
++
++msgid "Seed queue size"
++msgstr "Feltöltési sor mérete"
++
++msgid "Speed limit down"
++msgstr "Letöltési korlát"
++
++msgid "Speed limit down enabled"
++msgstr "Letöltési korlát engedélyezése"
++
++msgid "Speed limit up"
++msgstr "Feltöltési korlát"
++
++msgid "Speed limit up enabled"
++msgstr "Feltöltési korlát engedélyezése"
++
++msgid "Transmission"
++msgstr "Transmission"
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++"A Transmission daemon egy egyszerű bittorrent kliens, itt módosíthatod a "
++"beállításait."
++
++msgid "Trash original torrent files"
++msgstr "Eredeti torrent fájlok eldobása"
++
++msgid "Upload slots per torrent"
++msgstr "Feltöltési szálak torrentenként"
++
++msgid "Watch directory"
++msgstr "Figyelt könyvtár"
++
++msgid "in minutes from midnight"
++msgstr "percek száma éjféltől"
++
++msgid "preallocation"
++msgstr "előre lefoglalás"
++
++msgid "uTP enabled"
++msgstr "uTP engedélyezése"
+diff --git a/feeds/luci/applications/luci-app-transmission/po/it/transmission.po b/feeds/luci/applications/luci-app-transmission/po/it/transmission.po
+new file mode 100644
+index 0000000..1008fad
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/it/transmission.po
+@@ -0,0 +1,295 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-02-09 21:28+0200\n"
++"PO-Revision-Date: 2013-02-09 21:30+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "Velocità di download alternativo"
++
++msgid "Alternative speed enabled"
++msgstr "Velocità alternativa attivata"
++
++msgid "Alternative speed time begin"
++msgstr "Tempo di velocità alternativa inizio"
++
++msgid "Alternative speed time day"
++msgstr "Tempo di velocità alternativa giorno"
++
++msgid "Alternative speed time end"
++msgstr "Tempo di velocità alternativa fine"
++
++msgid "Alternative speed timing enabled"
++msgstr "Periodo di velocità alternativa attiva"
++
++msgid "Alternative upload speed"
++msgstr "Velocità alternativa di upload"
++
++msgid "Automatically start added torrents"
++msgstr "Avvia automaticamente i torrent aggiunti"
++
++msgid "Bandwidth settings"
++msgstr "Impostazioni larghezza della banda"
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/ja/transmission.po b/feeds/luci/applications/luci-app-transmission/po/ja/transmission.po
+new file mode 100644
+index 0000000..dded650
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/ja/transmission.po
+@@ -0,0 +1,295 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-04-18 11:15+0200\n"
++"PO-Revision-Date: 2013-10-05 17:17+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "一時的ãªä¸‹ã‚Šé€Ÿåº¦åˆ¶é™"
++
++msgid "Alternative speed enabled"
++msgstr "一時的ãªé€Ÿåº¦åˆ¶é™æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹"
++
++msgid "Alternative speed time begin"
++msgstr "一時的ãªé€Ÿåº¦åˆ¶é™ 開始時間"
++
++msgid "Alternative speed time day"
++msgstr "一時的ãªé€Ÿåº¦åˆ¶é™ 制é™æ—¥"
++
++msgid "Alternative speed time end"
++msgstr "一時的ãªé€Ÿåº¦åˆ¶é™ 終了時間"
++
++msgid "Alternative speed timing enabled"
++msgstr "一時的ãªé€Ÿåº¦åˆ¶é™ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒªãƒ³ã‚°æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹"
++
++msgid "Alternative upload speed"
++msgstr "一時的ãªä¸Šã‚Šé€Ÿåº¦åˆ¶é™"
++
++msgid "Automatically start added torrents"
++msgstr "追加ã•ã‚ŒãŸtorrent ã¯è‡ªå‹•çš„ã«é–‹å§‹ã™ã‚‹"
++
++msgid "Bandwidth settings"
++msgstr "帯域設定"
++
++msgid "Binding address IPv4"
++msgstr "ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹IPv4 アドレス"
++
++msgid "Binding address IPv6"
++msgstr "ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹IPv6 アドレス"
++
++msgid "Block list enabled"
++msgstr "ブロックリストを有効ã«ã™ã‚‹"
++
++msgid "Blocklist URL"
++msgstr "ブロックリスト URL"
++
++msgid "Blocklists"
++msgstr "ブロックリスト"
++
++msgid "Cache size in MB"
++msgstr "キャッシュサイズ (MB)"
++
++msgid "Config file directory"
++msgstr "コンフィグファイル・ディレクトリ"
++
++msgid "DHT enabled"
++msgstr "DHTを有効ã«ã™ã‚‹"
++
++msgid "Debug"
++msgstr "デãƒãƒƒã‚°æƒ…å ±"
++
++msgid "Download directory"
++msgstr "ダウンロード先ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
++
++msgid "Download queue enabled"
++msgstr "ダウンロード・キュー機能を有効ã«ã™ã‚‹"
++
++msgid "Download queue size"
++msgstr "ダウンロード・キューã®ã‚µã‚¤ã‚º"
++
++msgid "Enable watch directory"
++msgstr "ディレクトリ監視機能を有効ã«ã™ã‚‹"
++
++msgid "Enabled"
++msgstr "サービスを有効ã«ã™ã‚‹"
++
++msgid "Encryption"
++msgstr "æš—å·åŒ–"
++
++msgid "Error"
++msgstr "エラー情報"
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr "ファイルãŠã‚ˆã³ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³è¨­å®š"
++
++msgid "Forced"
++msgstr "強制ã™ã‚‹"
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr "全体ã®æœ€å¤§ãƒ”ア数"
++
++msgid "Global settings"
++msgstr "グローãƒãƒ«è¨­å®š"
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr "情報"
++
++msgid "LPD enabled"
++msgstr "LPD を有効ã«ã™ã‚‹"
++
++msgid "Lazy bitfield enabled"
++msgstr "Lazy bitfield を有効ã«ã™ã‚‹"
++
++msgid "Message level"
++msgstr "メッセージレベル"
++
++msgid "Miscellaneous"
++msgstr "詳細設定"
++
++msgid "None"
++msgstr "ãªã—"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr "使用ã—ãªã„"
++
++msgid "Open Web Interface"
++msgstr "WEBブラウザã§é–‹ã"
++
++msgid "PEX enabled"
++msgstr "PEX を有効ã«ã™ã‚‹"
++
++msgid "Peer Port settings"
++msgstr "ピアãƒãƒ¼ãƒˆè¨­å®š"
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr "torrent 毎ã®æœ€å¤§ãƒ”ア数"
++
++msgid "Peer port"
++msgstr "ピアãƒãƒ¼ãƒˆ"
++
++msgid "Peer port random high"
++msgstr "ãƒãƒ¼ãƒˆã‚’ランダムã«é¸æŠžã™ã‚‹éš›ã®ä¸Šé™å€¤"
++
++msgid "Peer port random low"
++msgstr "ãƒãƒ¼ãƒˆã‚’ランダムã«é¸æŠžã™ã‚‹éš›ã®ä¸‹é™å€¤"
++
++msgid "Peer port random on start"
++msgstr "サービススタート時ã«ãƒãƒ¼ãƒˆã‚’ランダムã«é¸æŠžã™ã‚‹"
++
++msgid "Peer settings"
++msgstr "ピア設定"
++
++msgid "Peer socket tos"
++msgstr "ピアソケットã®TOS"
++
++msgid "Port forwarding enabled"
++msgstr "ãƒãƒ¼ãƒˆè»¢é€ã‚’有効ã«ã™ã‚‹"
++
++msgid "Preferred"
++msgstr "優先ã™ã‚‹"
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr "キューイング設定"
++
++msgid "RPC URL"
++msgstr "RPC URL"
++
++msgid "RPC authentication required"
++msgstr "RPC èªè¨¼æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹"
++
++msgid "RPC bind address"
++msgstr "RPC ãƒã‚¤ãƒ³ãƒ‰ã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++msgid "RPC enabled"
++msgstr "RPC機能を有効ã«ã™ã‚‹"
++
++msgid "RPC password"
++msgstr "RPC パスワード"
++
++msgid "RPC port"
++msgstr "RPC ãƒãƒ¼ãƒˆ"
++
++msgid "RPC settings"
++msgstr "RPC 設定"
++
++msgid "RPC username"
++msgstr "RPC ユーザーå"
++
++msgid "RPC whitelist"
++msgstr "RPC ホワイトリスト"
++
++msgid "RPC whitelist enabled"
++msgstr "RPC ホワイトリスト機能を有効ã«ã™ã‚‹"
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr "デーモンã®ãƒ¦ãƒ¼ã‚¶ãƒ¼æ¨©é™è¨­å®š"
++
++msgid "Scheduling"
++msgstr "スケジューラ設定"
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr "torrent 完了時ã«ã‚¹ã‚¯ãƒªãƒ—トを実行ã™ã‚‹"
++
++msgid "Script torrent done filename"
++msgstr "torrent 完了時ã«å®Ÿè¡Œã™ã‚‹ã‚¹ã‚¯ãƒªãƒ—ト・ファイルパス"
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr "下り速度制é™"
++
++msgid "Speed limit down enabled"
++msgstr "下り速度制é™æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹"
++
++msgid "Speed limit up"
++msgstr "上り速度制é™"
++
++msgid "Speed limit up enabled"
++msgstr "上り速度制é™æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹"
++
++msgid "Transmission"
++msgstr "Transmission"
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr "Transmissionã¯ã€ã‚·ãƒ³ãƒ—ルãªbittorrentクライアントã§ã™ã€‚"
++
++msgid "Trash original torrent files"
++msgstr "オリジナルã®torrent ファイルをゴミ箱ã«ç§»å‹•ã™ã‚‹"
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr "監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr "uTP を有効ã«ã™ã‚‹"
+diff --git a/feeds/luci/applications/luci-app-transmission/po/ms/transmission.po b/feeds/luci/applications/luci-app-transmission/po/ms/transmission.po
+new file mode 100644
+index 0000000..3125fc2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/ms/transmission.po
+@@ -0,0 +1,280 @@
++msgid "Alternative download speed"
++msgstr ""
++
++msgid "Alternative speed enabled"
++msgstr ""
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr ""
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/no/transmission.po b/feeds/luci/applications/luci-app-transmission/po/no/transmission.po
+new file mode 100644
+index 0000000..cb86841
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/no/transmission.po
+@@ -0,0 +1,298 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-03-25 21:10+0200\n"
++"PO-Revision-Date: 2013-04-05 09:10+0200\n"
++"Last-Translator: protx <lars.hardy@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: no\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "Alternativ nedlastingshastighet"
++
++msgid "Alternative speed enabled"
++msgstr "Alternativ hastighet aktivert"
++
++msgid "Alternative speed time begin"
++msgstr "Alternativ hastighet start tid"
++
++msgid "Alternative speed time day"
++msgstr "Alternativ hastighet tid på dagen"
++
++msgid "Alternative speed time end"
++msgstr "Alternativ hastighet tid når ferdig"
++
++msgid "Alternative speed timing enabled"
++msgstr "Alternativ hastighet tidspunkt aktivert"
++
++msgid "Alternative upload speed"
++msgstr "Alternativ opplastingshastighet"
++
++msgid "Automatically start added torrents"
++msgstr "Start automatisk torrents som legges til"
++
++msgid "Bandwidth settings"
++msgstr "BÃ¥ndbredde innstillinger"
++
++msgid "Binding address IPv4"
++msgstr "Bindinger IPv4 adresse"
++
++msgid "Binding address IPv6"
++msgstr "Bindinger IPv6 adresse"
++
++msgid "Block list enabled"
++msgstr "Blokkeringsliste aktivert"
++
++msgid "Blocklist URL"
++msgstr "Blokkeringsliste URL"
++
++msgid "Blocklists"
++msgstr "Blokkeringsliste"
++
++msgid "Cache size in MB"
++msgstr "Bufferstørrelse i MB"
++
++msgid "Config file directory"
++msgstr "Mappe for konfigurasjonsfil"
++
++msgid "DHT enabled"
++msgstr "DHT aktivert"
++
++msgid "Debug"
++msgstr "Feilsøking"
++
++msgid "Download directory"
++msgstr "Nedlastingsmappe"
++
++msgid "Download queue enabled"
++msgstr "Nedlastingkø aktivert"
++
++msgid "Download queue size"
++msgstr "Nedlastingkø størrelse"
++
++msgid "Enable watch directory"
++msgstr "Aktiver overvåking av torrent mappe"
++
++msgid "Enabled"
++msgstr "Aktivert"
++
++msgid "Encryption"
++msgstr "Kryptering"
++
++msgid "Error"
++msgstr "Feil"
++
++msgid "Fast"
++msgstr "Rask"
++
++msgid "Files and Locations"
++msgstr "Filer og plasseringer"
++
++msgid "Forced"
++msgstr "Tvunget"
++
++msgid "Full"
++msgstr "Full"
++
++msgid "Global peer limit"
++msgstr "Global peer grense"
++
++msgid "Global settings"
++msgstr "Globale innstillinger"
++
++msgid "Idle seeding limit"
++msgstr "Inaktiv seeding grense"
++
++msgid "Idle seeding limit enabled"
++msgstr "Inaktiv seeding grense aktivert"
++
++msgid "Incomplete directory"
++msgstr "Ufullstendig mappe"
++
++msgid "Incomplete directory enabled"
++msgstr "Ufullstendig mappe aktivert"
++
++msgid "Info"
++msgstr "Info"
++
++msgid "LPD enabled"
++msgstr "LPD aktivert"
++
++msgid "Lazy bitfield enabled"
++msgstr "Lazy bitfield aktivert"
++
++msgid "Message level"
++msgstr "Nivå for meldinger"
++
++msgid "Miscellaneous"
++msgstr "Diverse"
++
++msgid "None"
++msgstr "Ingen"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++"Nummer/bitfield. Start med 0, og for hver dag en vil at planleggeren skal "
++"være aktivert legger en til en verdi. For Søndag - 1, Mandag - 2, Tirsdag - "
++"4, Onsdag - 8, Torsdag - 16, Fredag - 32, Lørdag - 64"
++
++msgid "Off"
++msgstr "Av"
++
++msgid "Open Web Interface"
++msgstr "Ã…pne webgrensesnitt"
++
++msgid "PEX enabled"
++msgstr "PEX aktivert"
++
++msgid "Peer Port settings"
++msgstr "Peer port innstillinger"
++
++msgid "Peer congestion algorithm"
++msgstr "Peer congestion algoritme"
++
++msgid "Peer limit per torrent"
++msgstr "Peer grense per torrent"
++
++msgid "Peer port"
++msgstr "Peer port"
++
++msgid "Peer port random high"
++msgstr "Peer port tilfeldig høy"
++
++msgid "Peer port random low"
++msgstr "Peer port tilfeldig lav"
++
++msgid "Peer port random on start"
++msgstr "Peer port tilfeldig ved start"
++
++msgid "Peer settings"
++msgstr "Peer innstillinger"
++
++msgid "Peer socket tos"
++msgstr "Peer tilslutning tos"
++
++msgid "Port forwarding enabled"
++msgstr "Port videresending aktivert"
++
++msgid "Preferred"
++msgstr "Prioritert"
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/pl/transmission.po b/feeds/luci/applications/luci-app-transmission/po/pl/transmission.po
+new file mode 100644
+index 0000000..f010d56
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/pl/transmission.po
+@@ -0,0 +1,302 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-04-19 21:20+0200\n"
++"PO-Revision-Date: 2014-02-25 18:13+0200\n"
++"Last-Translator: TheTranslator2238 <mateusz2238@outlook.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "Alternatywna prędkość pobierania"
++
++msgid "Alternative speed enabled"
++msgstr "Prędkość alternatywna włączona"
++
++msgid "Alternative speed time begin"
++msgstr "Godzina włączenia prędkości alternatywnej"
++
++msgid "Alternative speed time day"
++msgstr "Dzień prędkości alternatywnej"
++
++msgid "Alternative speed time end"
++msgstr "Godzina wyłączenia prędkości alternatywnej"
++
++msgid "Alternative speed timing enabled"
++msgstr "Włączanie prędkości alternatywnej w podanym czasie"
++
++msgid "Alternative upload speed"
++msgstr "Alternatywna prędkość wysyłania"
++
++msgid "Automatically start added torrents"
++msgstr "Automatyczne rozpoczęcie pobierania nowych torrentów"
++
++msgid "Bandwidth settings"
++msgstr "Ustawienia przepustowości"
++
++msgid "Binding address IPv4"
++msgstr "Przypisanie adresu IPv4"
++
++msgid "Binding address IPv6"
++msgstr "Przypisanie adresu IPv6"
++
++msgid "Block list enabled"
++msgstr "Lista blokowania włączona"
++
++msgid "Blocklist URL"
++msgstr "URL listy blokowania"
++
++msgid "Blocklists"
++msgstr "Listy blokowania"
++
++msgid "Cache size in MB"
++msgstr "Wielkość cache w MB"
++
++msgid "Config file directory"
++msgstr "Katalog z plikiem konfiguracyjnym"
++
++msgid "DHT enabled"
++msgstr "DHT włączone"
++
++msgid "Debug"
++msgstr "Debug"
++
++msgid "Download directory"
++msgstr "Katalog pobierania"
++
++msgid "Download queue enabled"
++msgstr "Kolejka pobierania włączona"
++
++msgid "Download queue size"
++msgstr "Rozmiar kolejki pobierania"
++
++msgid "Enable watch directory"
++msgstr "WÅ‚Ä…cz folder obserwowany"
++
++msgid "Enabled"
++msgstr "WÅ‚Ä…czone"
++
++msgid "Encryption"
++msgstr "Szyfrowanie"
++
++msgid "Error"
++msgstr "BÅ‚Ä…d"
++
++msgid "Fast"
++msgstr "Szybko"
++
++msgid "Files and Locations"
++msgstr "Pliki i położenia"
++
++msgid "Forced"
++msgstr "Wymuszone"
++
++msgid "Full"
++msgstr "Pełne"
++
++msgid "Global peer limit"
++msgstr "Globalny limit peerów"
++
++msgid "Global settings"
++msgstr "Ustawienia globalne"
++
++msgid "Idle seeding limit"
++msgstr "Limit przesyłu w bezczynności"
++
++msgid "Idle seeding limit enabled"
++msgstr "Włączony limit transferu podczas bezczynności"
++
++msgid "Incomplete directory"
++msgstr "Niekompletny katalog"
++
++msgid "Incomplete directory enabled"
++msgstr "Opcja \"Niekompletny katalog\" włączona"
++
++msgid "Info"
++msgstr "Info"
++
++msgid "LPD enabled"
++msgstr "LPD włączone"
++
++msgid "Lazy bitfield enabled"
++msgstr "Lazy bitfield włączone"
++
++msgid "Message level"
++msgstr "Poziom komunikatów"
++
++msgid "Miscellaneous"
++msgstr "Różności"
++
++msgid "None"
++msgstr "Żaden"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++"Liczba/pole bitowe. Zaczyna się od 0, następnie dla każdego dnia dla jakiego "
++"chcesz włączyć harmonogram dodaj odpowiednią wartość. Niedziela - 1, "
++"Poniedziałek - 2, Wtorek - 4, Środa - 8, Czwartek - 16, Piątek - 32, sobota "
++"- 64."
++
++msgid "Off"
++msgstr "Wyłączone"
++
++msgid "Open Web Interface"
++msgstr "Otwórz interfejs Web"
++
++msgid "PEX enabled"
++msgstr "PEX włączony"
++
++msgid "Peer Port settings"
++msgstr "Ustawienia portu peer"
++
++msgid "Peer congestion algorithm"
++msgstr "Algorytm przeciążenia peer"
++
++msgid "Peer limit per torrent"
++msgstr "Limit peer'a dla torrenta"
++
++msgid "Peer port"
++msgstr "Port peer"
++
++msgid "Peer port random high"
++msgstr "Maksymalny port peer`a"
++
++msgid "Peer port random low"
++msgstr "Minimalny port peer`a"
++
++msgid "Peer port random on start"
++msgstr "Losowy port peer`a przy starcie"
++
++msgid "Peer settings"
++msgstr "Ustawienia peer"
++
++msgid "Peer socket tos"
++msgstr "Typ gniazda <abbr title=\"Type-Of-Service w TCP\">TOS</abbr> peer`a"
++
++msgid "Port forwarding enabled"
++msgstr "Przekazywanie portów włączone"
++
++msgid "Preferred"
++msgstr "Preferowany"
++
++msgid "Prefetch enabled"
++msgstr "Pobieranie wstępne włączone"
++
++msgid "Queue stalled enabled"
++msgstr "Blokada kolejki włączona"
++
++msgid "Queue stalled minutes"
++msgstr "Blokada kolejki w min."
++
++msgid "Queueing"
++msgstr "Kolejkowanie"
++
++msgid "RPC URL"
++msgstr "Adres URL RPC"
++
++msgid "RPC authentication required"
++msgstr "Wymagana autoryzacja RPC"
++
++msgid "RPC bind address"
++msgstr "Adres węzła RPC"
++
++msgid "RPC enabled"
++msgstr "RPC włączone"
++
++msgid "RPC password"
++msgstr "Hasło RPC"
++
++msgid "RPC port"
++msgstr "Port RPC"
++
++msgid "RPC settings"
++msgstr "Ustawienia RPC"
++
++msgid "RPC username"
++msgstr "Nazwa użytkownika RPC"
++
++msgid "RPC whitelist"
++msgstr "Biała lista RPC"
++
++msgid "RPC whitelist enabled"
++msgstr "Biała lista RPC włączona"
++
++msgid "Ratio limit"
++msgstr "Dopuszczalna wartość"
++
++msgid "Ratio limit enabled"
++msgstr "Dopuszczalna wartość włączona"
++
++msgid "Rename partial files"
++msgstr "Zmień nazwy plików częściowych"
++
++msgid "Run daemon as user"
++msgstr "Włączaj demona jako użytkownik"
++
++msgid "Scheduling"
++msgstr "Harmonogramowanie"
++
++msgid "Scrape paused torrents enabled"
++msgstr "Zdzieranie wstrzymanych torentów włączone"
++
++msgid "Script torrent done enabled"
++msgstr "Włączenie wykonywania skryptu po zakończeniu pobierania"
++
++msgid "Script torrent done filename"
++msgstr "Nazwa skryptu wykonywanego po zakończeniu pobierania"
++
++msgid "Seed queue enabled"
++msgstr "Kolejkowanie Seed'ów włączone"
++
++msgid "Seed queue size"
++msgstr "Rozmiar kolejki Seed'ów"
++
++msgid "Speed limit down"
++msgstr "Limit prędkości pobierania"
++
++msgid "Speed limit down enabled"
++msgstr "Limit prędkości pobierania włączony"
++
++msgid "Speed limit up"
++msgstr "Limit prędkości wysyłania"
++
++msgid "Speed limit up enabled"
++msgstr "Limit prędkości wysyłania włączony"
++
++msgid "Transmission"
++msgstr "Transmission"
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++"Demon Transmission jest prostym klientem BitTorrent. Tutaj możesz zmienić "
++"jego ustawienia."
++
++msgid "Trash original torrent files"
++msgstr "Usuń oryginalne pliki torrent"
++
++msgid "Upload slots per torrent"
++msgstr "Liczba połączeń na plik torrent - wysyłanie"
++
++msgid "Watch directory"
++msgstr "Obserwowany folder"
++
++msgid "in minutes from midnight"
++msgstr "w minutach od północy"
++
++msgid "preallocation"
++msgstr "prealokacja"
++
++msgid "uTP enabled"
++msgstr "uTP włączone"
+diff --git a/feeds/luci/applications/luci-app-transmission/po/pt-br/transmission.po b/feeds/luci/applications/luci-app-transmission/po/pt-br/transmission.po
+new file mode 100644
+index 0000000..82ba6a4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/pt-br/transmission.po
+@@ -0,0 +1,300 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-07-06 16:27+0200\n"
++"PO-Revision-Date: 2013-04-06 22:58+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "Velocidade alternativa para baixar"
++
++msgid "Alternative speed enabled"
++msgstr "Velocidade alternativa ativada"
++
++msgid "Alternative speed time begin"
++msgstr "Hora de início da velocidade alternativa"
++
++msgid "Alternative speed time day"
++msgstr "Dia da velocidade alternativa"
++
++msgid "Alternative speed time end"
++msgstr "Hora final da velocidade alternativa"
++
++msgid "Alternative speed timing enabled"
++msgstr "Temporização da velocidade alternativa habilitada"
++
++msgid "Alternative upload speed"
++msgstr "Velocidade de subida alternativa"
++
++msgid "Automatically start added torrents"
++msgstr "Iniciar automaticamente os torrents adicionados"
++
++msgid "Bandwidth settings"
++msgstr "Configurações da velocidade do enlace"
++
++msgid "Binding address IPv4"
++msgstr "Endereço de escuta IPv4"
++
++msgid "Binding address IPv6"
++msgstr "Endereço de escuta IPv6"
++
++msgid "Block list enabled"
++msgstr "Lista de Bloqueios habilitada"
++
++msgid "Blocklist URL"
++msgstr "URL da lista de bloqueio"
++
++msgid "Blocklists"
++msgstr "Lista de Bloqueio"
++
++msgid "Cache size in MB"
++msgstr "Tamanho em MB do cache"
++
++msgid "Config file directory"
++msgstr "Diretório dos arquivos de configuração"
++
++msgid "DHT enabled"
++msgstr "DHT habilitado"
++
++msgid "Debug"
++msgstr "Depuração"
++
++msgid "Download directory"
++msgstr "Diretório de arquivos baixados"
++
++msgid "Download queue enabled"
++msgstr "Fila para baixar habilitada"
++
++msgid "Download queue size"
++msgstr "Tamanho da fila para baixar"
++
++msgid "Enable watch directory"
++msgstr "Habilitar monitoramento de diretório"
++
++msgid "Enabled"
++msgstr "Habilitar"
++
++msgid "Encryption"
++msgstr "Cifragem"
++
++msgid "Error"
++msgstr "Erro"
++
++msgid "Fast"
++msgstr "Rápido"
++
++msgid "Files and Locations"
++msgstr "Arquivos e Locais"
++
++msgid "Forced"
++msgstr "Forçado"
++
++msgid "Full"
++msgstr "Cheio"
++
++msgid "Global peer limit"
++msgstr "Limite global de parceiros conectados"
++
++msgid "Global settings"
++msgstr "Configurações Globais"
++
++msgid "Idle seeding limit"
++msgstr "Limite para parar de semear se ocioso"
++
++msgid "Idle seeding limit enabled"
++msgstr "Habilitar limite para parar de semear se ocioso"
++
++msgid "Incomplete directory"
++msgstr "Diretório de incompletos"
++
++msgid "Incomplete directory enabled"
++msgstr "Ativado diretório para arquivos incompletos"
++
++msgid "Info"
++msgstr "Informação"
++
++msgid "LPD enabled"
++msgstr "LPD habilitado"
++
++msgid "Lazy bitfield enabled"
++msgstr "Envio de campo de bits incompletos habilitado"
++
++msgid "Message level"
++msgstr "Nível de mensagens"
++
++msgid "Miscellaneous"
++msgstr "Diversos"
++
++msgid "None"
++msgstr "Nada"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++"Número/Campo de bits. Comece com 0 e, então, para cada dia você quer o "
++"agendador habilitado, adicione um valor. Para domingo - 1, segunda-feira - "
++"2, terça-feira - 4, quarta-feira - 8, quinta-feira - 16, sexta-feira - 32, "
++"Sábado - 64"
++
++msgid "Off"
++msgstr "Desligado"
++
++msgid "Open Web Interface"
++msgstr "Abrir interface Web"
++
++msgid "PEX enabled"
++msgstr "PEX habilitado"
++
++msgid "Peer Port settings"
++msgstr "Configuração de porta do parceiro"
++
++msgid "Peer congestion algorithm"
++msgstr "Algoritmo de congestionamento dos parceiro"
++
++msgid "Peer limit per torrent"
++msgstr "Limite de torrents por parceiro"
++
++msgid "Peer port"
++msgstr "Porta do parceiro"
++
++msgid "Peer port random high"
++msgstr "Limite superior da porta aleatória do parceiro"
++
++msgid "Peer port random low"
++msgstr "Limite inferior da porta aleatória do parceiro"
++
++msgid "Peer port random on start"
++msgstr "Porta aleatória inicial do parceiro"
++
++msgid "Peer settings"
++msgstr "Configuração do parceiro"
++
++msgid "Peer socket tos"
++msgstr "TOS da conexão do parceiro"
++
++msgid "Port forwarding enabled"
++msgstr "Encaminhamento de porta ativado"
++
++msgid "Preferred"
++msgstr "Preferencial"
++
++msgid "Prefetch enabled"
++msgstr "Adiantamento de leitura de disco habilitado"
++
++msgid "Queue stalled enabled"
++msgstr "Parada de fila habilitada"
++
++msgid "Queue stalled minutes"
++msgstr "Parada de fila em minutos"
++
++msgid "Queueing"
++msgstr "Filas"
++
++msgid "RPC URL"
++msgstr "RPC URL"
++
++msgid "RPC authentication required"
++msgstr "RPC requer autenticação"
++
++msgid "RPC bind address"
++msgstr "Endereço de escuta do RPC"
++
++msgid "RPC enabled"
++msgstr "RPC habilitado"
++
++msgid "RPC password"
++msgstr "Senha do RPC"
++
++msgid "RPC port"
++msgstr "Porta do RPC"
++
++msgid "RPC settings"
++msgstr "Configuração do RPC"
++
++msgid "RPC username"
++msgstr "Nome do usuario do RPC"
++
++msgid "RPC whitelist"
++msgstr "Lista branca do RPC"
++
++msgid "RPC whitelist enabled"
++msgstr "Lista branca do RPC habilitada"
++
++msgid "Ratio limit"
++msgstr "Limite da relação"
++
++msgid "Ratio limit enabled"
++msgstr "Limite da relação habilitado"
++
++msgid "Rename partial files"
++msgstr "Renomear arquivos parciais"
++
++msgid "Run daemon as user"
++msgstr "Executar serviço como usuário"
++
++msgid "Scheduling"
++msgstr "Agendamento"
++
++msgid "Scrape paused torrents enabled"
++msgstr "Busca de informações de torrents pausados ​​habilitada"
++
++msgid "Script torrent done enabled"
++msgstr "Script de conclusão de torrent habilitado"
++
++msgid "Script torrent done filename"
++msgstr "Nome do arquivo do script de conclusão de torrent"
++
++msgid "Seed queue enabled"
++msgstr "Fila de semeadura habilitada"
++
++msgid "Seed queue size"
++msgstr "Tamanho da fila de semeadura"
++
++msgid "Speed limit down"
++msgstr "Limite inferior de velocidade"
++
++msgid "Speed limit down enabled"
++msgstr "Limite inferior de velocidade habilitado"
++
++msgid "Speed limit up"
++msgstr "Limite superior de velocidade"
++
++msgid "Speed limit up enabled"
++msgstr "Limite superior de velocidade habilitado"
++
++msgid "Transmission"
++msgstr "Transmission"
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++"O Transmission é um cliente BitTorrent simples, aqui você pode configurá-lo."
++
++msgid "Trash original torrent files"
++msgstr "Apague os arquivos torrent originais"
++
++msgid "Upload slots per torrent"
++msgstr "Vagas para conexão de envio por torrent"
++
++msgid "Watch directory"
++msgstr "Monitorar diretório"
++
++msgid "in minutes from midnight"
++msgstr "em minutos a partir da meia-noite"
++
++msgid "preallocation"
++msgstr "pré-alocação"
++
++msgid "uTP enabled"
++msgstr "uTP habilitado"
+diff --git a/feeds/luci/applications/luci-app-transmission/po/pt/transmission.po b/feeds/luci/applications/luci-app-transmission/po/pt/transmission.po
+new file mode 100644
+index 0000000..512ca97
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/pt/transmission.po
+@@ -0,0 +1,297 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-05-31 23:40+0200\n"
++"PO-Revision-Date: 2013-05-31 23:47+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "Velocidade de download alternativa"
++
++msgid "Alternative speed enabled"
++msgstr "Velocidade alternativa activada"
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr "Definições de largura de banda"
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr "Directório do ficheiro de configuração"
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr "Depurar"
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr "Encriptação"
++
++msgid "Error"
++msgstr "Erro"
++
++msgid "Fast"
++msgstr "Rápido"
++
++msgid "Files and Locations"
++msgstr "Ficheiros e Localizações"
++
++msgid "Forced"
++msgstr "Forçado"
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr "Info"
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr "Nenhum"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr "Desligado"
++
++msgid "Open Web Interface"
++msgstr "Abrir Interface Web"
++
++msgid "PEX enabled"
++msgstr "PEX ativado"
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr "URL RPC"
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr "RPC ativado"
++
++msgid "RPC password"
++msgstr "Password RPC"
++
++msgid "RPC port"
++msgstr "Porta RPC"
++
++msgid "RPC settings"
++msgstr "Definições RPC"
++
++msgid "RPC username"
++msgstr "Utilizador RPC"
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr "Executar serviço como"
++
++msgid "Scheduling"
++msgstr "Agendamento"
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++"Transmission é um client simples de bittorrent, aqui pode configurar as "
++"definições."
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/ro/transmission.po b/feeds/luci/applications/luci-app-transmission/po/ro/transmission.po
+new file mode 100644
+index 0000000..8e0fc7d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/ro/transmission.po
+@@ -0,0 +1,296 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-09-25 19:17+0200\n"
++"PO-Revision-Date: 2014-06-28 19:26+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "Viteză de download alternativă"
++
++msgid "Alternative speed enabled"
++msgstr "Viteză alternativă activată"
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr "Viteza de upload alternativa"
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr "Setari latime de banda"
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr "Activat"
++
++msgid "Encryption"
++msgstr "Criptare"
++
++msgid "Error"
++msgstr "Eroare"
++
++msgid "Fast"
++msgstr "Rapid"
++
++msgid "Files and Locations"
++msgstr "Fişiere şi Locaţii"
++
++msgid "Forced"
++msgstr "Forţat"
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr "Setari globale"
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr "Informatii"
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr "Preferat"
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/ru/transmission.po b/feeds/luci/applications/luci-app-transmission/po/ru/transmission.po
+new file mode 100644
+index 0000000..fac9510
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/ru/transmission.po
+@@ -0,0 +1,306 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: transmission\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-08-15 17:35+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Alternative download speed"
++msgstr "ÐÐ»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ загрузки"
++
++msgid "Alternative speed enabled"
++msgstr "ÐÐ»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ включена"
++
++msgid "Alternative speed time begin"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° альтернативной ÑкороÑти"
++
++msgid "Alternative speed time day"
++msgstr "День альтернативной ÑкороÑти"
++
++msgid "Alternative speed time end"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð¾Ð¹ ÑкороÑти"
++
++msgid "Alternative speed timing enabled"
++msgstr "РаÑпиÑание альтернативной ÑкороÑти включено"
++
++msgid "Alternative upload speed"
++msgstr "ÐÐ»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ отдачи"
++
++msgid "Automatically start added torrents"
++msgstr "ÐвтоматичеÑки запуÑкать добавленные торренты"
++
++msgid "Bandwidth settings"
++msgstr "ÐаÑтройки ÑкороÑти"
++
++msgid "Binding address IPv4"
++msgstr "ПривÑзанный Ð°Ð´Ñ€ÐµÑ IPv4"
++
++msgid "Binding address IPv6"
++msgstr "ПривÑзанный Ð°Ð´Ñ€ÐµÑ IPv6"
++
++msgid "Block list enabled"
++msgstr "СпиÑок блокировок включен"
++
++msgid "Blocklist URL"
++msgstr "URL ÑпиÑка блокировок"
++
++msgid "Blocklists"
++msgstr "СпиÑки блокировок"
++
++msgid "Cache size in MB"
++msgstr "Размер кÑша (МБ)"
++
++msgid "Config file directory"
++msgstr "Папка файла конфигурации"
++
++msgid "DHT enabled"
++msgstr "DHT включен"
++
++msgid "Debug"
++msgstr "Отладка"
++
++msgid "Download directory"
++msgstr "Папка Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº"
++
++msgid "Download queue enabled"
++msgstr "Очередь загрузок включена"
++
++msgid "Download queue size"
++msgstr "Размер очереди загрузок"
++
++msgid "Enable watch directory"
++msgstr "Включить папку поиÑка"
++
++msgid "Enabled"
++msgstr "Включено"
++
++msgid "Encryption"
++msgstr "Шифрование"
++
++msgid "Error"
++msgstr "Ошибка"
++
++msgid "Fast"
++msgstr "БыÑтрый"
++
++msgid "Files and Locations"
++msgstr "Файлы и пути"
++
++msgid "Forced"
++msgstr "Принудительно"
++
++msgid "Full"
++msgstr "Полный"
++
++msgid "Global peer limit"
++msgstr "Глобальный лимит пиров"
++
++msgid "Global settings"
++msgstr "Общие наÑтройки"
++
++msgid "Idle seeding limit"
++msgstr "Ограничение времени ÑидированиÑ"
++
++msgid "Idle seeding limit enabled"
++msgstr "Ограничение времени ÑÐ¸Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾"
++
++msgid "Incomplete directory"
++msgstr "Папка Ð´Ð»Ñ Ð½Ðµ полноÑтью загруженых файлов"
++
++msgid "Incomplete directory enabled"
++msgstr "Папка Ð´Ð»Ñ Ð½Ðµ полноÑтью загруженых файлов включена"
++
++msgid "Info"
++msgstr "ИнформациÑ"
++
++msgid "LPD enabled"
++msgstr "LPD включено"
++
++#, fuzzy
++msgid "Lazy bitfield enabled"
++msgstr "Lazy bitfield включен"
++
++msgid "Message level"
++msgstr "Уровень Ñообщений"
++
++msgid "Miscellaneous"
++msgstr "Прочее"
++
++msgid "None"
++msgstr "ОтÑутÑтвует"
++
++#, fuzzy
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++"Ðомер/битовое поле. Ðачните Ñ 0, затем Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ днÑ, в который вы хотите "
++"включить планировщик, добавьте значение. Ð”Ð»Ñ Ð²Ð¾ÑкреÑÐµÐ½ÑŒÑ - 1, понедельника - "
++"2, вторника - 4, Ñреды - 8, четверга - 16, пÑтницы - 32, Ñубботы - 64."
++
++msgid "Off"
++msgstr "Выключено"
++
++msgid "Open Web Interface"
++msgstr "Открыть веб-интерфейÑ"
++
++msgid "PEX enabled"
++msgstr "PEX включен"
++
++msgid "Peer Port settings"
++msgstr "ÐаÑтройки порта пира"
++
++msgid "Peer congestion algorithm"
++msgstr "Ðлгоритм перегрузки пиров"
++
++msgid "Peer limit per torrent"
++msgstr "Ограничение пиров на торрент"
++
++msgid "Peer port"
++msgstr "Порт пира"
++
++msgid "Peer port random high"
++msgstr "Ðаибольший Ñлучайный порт пира"
++
++msgid "Peer port random low"
++msgstr "Ðаименьший Ñлучайный порт пира"
++
++msgid "Peer port random on start"
++msgstr "Случайный порт пира при запуÑке"
++
++msgid "Peer settings"
++msgstr "ÐаÑтройки пира"
++
++msgid "Peer socket tos"
++msgstr "Значение ToS Ñокета пира"
++
++msgid "Port forwarding enabled"
++msgstr "Перенаправление портов включено"
++
++msgid "Preferred"
++msgstr "Предпочитаемо"
++
++msgid "Prefetch enabled"
++msgstr "Предвыборка включена"
++
++#, fuzzy
++msgid "Queue stalled enabled"
++msgstr "ПриоÑтановка очереди включена"
++
++#, fuzzy
++msgid "Queue stalled minutes"
++msgstr "ПриоÑтановка очереди (мин.)"
++
++msgid "Queueing"
++msgstr "ОбÑлуживание"
++
++msgid "RPC URL"
++msgstr "URL RPC"
++
++msgid "RPC authentication required"
++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ RPC"
++
++msgid "RPC bind address"
++msgstr "RPC-адреÑ"
++
++msgid "RPC enabled"
++msgstr "RPC включен"
++
++msgid "RPC password"
++msgstr "Пароль RPC"
++
++msgid "RPC port"
++msgstr "Порт RPC"
++
++msgid "RPC settings"
++msgstr "ÐаÑтройки RPC"
++
++msgid "RPC username"
++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ RPC"
++
++msgid "RPC whitelist"
++msgstr "\"Белый\" ÑпиÑок RPC"
++
++msgid "RPC whitelist enabled"
++msgstr "\"Белый\" ÑпиÑок RPC включен"
++
++msgid "Ratio limit"
++msgstr "КоÑффициент отдачи"
++
++msgid "Ratio limit enabled"
++msgstr "КоÑффициент отдачи включен"
++
++msgid "Rename partial files"
++msgstr "Переименовывать незавершённые файлы"
++
++msgid "Run daemon as user"
++msgstr "ЗапуÑтить демон от пользователÑ"
++
++msgid "Scheduling"
++msgstr "Планирование"
++
++msgid "Scrape paused torrents enabled"
++msgstr "Производить scrape-запроÑÑ‹ у приоÑтановленных торрентов"
++
++msgid "Script torrent done enabled"
++msgstr "ЗапуÑк Ñкрипта поÑле загрузки торрента включён"
++
++msgid "Script torrent done filename"
++msgstr "Скрипт Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸"
++
++msgid "Seed queue enabled"
++msgstr "Очередь Ñидов включена"
++
++msgid "Seed queue size"
++msgstr "Размер очереди ÑидированиÑ"
++
++msgid "Speed limit down"
++msgstr "Лимит ÑкороÑти загрузки"
++
++msgid "Speed limit down enabled"
++msgstr "Лимит ÑкороÑти загрузки включен"
++
++msgid "Speed limit up"
++msgstr "Лимит ÑкороÑти отдачи"
++
++msgid "Speed limit up enabled"
++msgstr "Лимит ÑкороÑти отдачи включен"
++
++msgid "Transmission"
++msgstr "Transmission"
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++"Transmission - проÑтой bittorrent-клиент. ЗдеÑÑŒ Ð’Ñ‹ можете наÑтроить "
++"параметры."
++
++msgid "Trash original torrent files"
++msgstr "Удалить торрент-файлы"
++
++msgid "Upload slots per torrent"
++msgstr "Кол-во Ñлотов отдачи на торрент"
++
++msgid "Watch directory"
++msgstr "Папка поиÑка"
++
++msgid "in minutes from midnight"
++msgstr "в минутах от полуночи"
++
++msgid "preallocation"
++msgstr "предраÑпределение"
++
++msgid "uTP enabled"
++msgstr "uTP включен"
+diff --git a/feeds/luci/applications/luci-app-transmission/po/sk/transmission.po b/feeds/luci/applications/luci-app-transmission/po/sk/transmission.po
+new file mode 100644
+index 0000000..4b4c3af
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/sk/transmission.po
+@@ -0,0 +1,290 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Alternative download speed"
++msgstr ""
++
++msgid "Alternative speed enabled"
++msgstr ""
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr ""
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/sv/transmission.po b/feeds/luci/applications/luci-app-transmission/po/sv/transmission.po
+new file mode 100644
+index 0000000..e276ebf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/sv/transmission.po
+@@ -0,0 +1,291 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Alternative download speed"
++msgstr ""
++
++msgid "Alternative speed enabled"
++msgstr ""
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr ""
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/templates/transmission.pot b/feeds/luci/applications/luci-app-transmission/po/templates/transmission.pot
+new file mode 100644
+index 0000000..5892abc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/templates/transmission.pot
+@@ -0,0 +1,283 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Alternative download speed"
++msgstr ""
++
++msgid "Alternative speed enabled"
++msgstr ""
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr ""
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/tr/transmission.po b/feeds/luci/applications/luci-app-transmission/po/tr/transmission.po
+new file mode 100644
+index 0000000..5a4df01
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/tr/transmission.po
+@@ -0,0 +1,290 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Alternative download speed"
++msgstr ""
++
++msgid "Alternative speed enabled"
++msgstr ""
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr ""
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/uk/transmission.po b/feeds/luci/applications/luci-app-transmission/po/uk/transmission.po
+new file mode 100644
+index 0000000..1736934
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/uk/transmission.po
+@@ -0,0 +1,296 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-08-13 16:16+0200\n"
++"PO-Revision-Date: 2013-08-13 16:17+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Alternative download speed"
++msgstr "Ðльтернативна швидкіÑÑ‚ÑŒ завантаженнÑ"
++
++msgid "Alternative speed enabled"
++msgstr "Ðльтернативна швидкіÑÑ‚ÑŒ увімкнути"
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr ""
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/vi/transmission.po b/feeds/luci/applications/luci-app-transmission/po/vi/transmission.po
+new file mode 100644
+index 0000000..3125fc2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/vi/transmission.po
+@@ -0,0 +1,280 @@
++msgid "Alternative download speed"
++msgstr ""
++
++msgid "Alternative speed enabled"
++msgstr ""
++
++msgid "Alternative speed time begin"
++msgstr ""
++
++msgid "Alternative speed time day"
++msgstr ""
++
++msgid "Alternative speed time end"
++msgstr ""
++
++msgid "Alternative speed timing enabled"
++msgstr ""
++
++msgid "Alternative upload speed"
++msgstr ""
++
++msgid "Automatically start added torrents"
++msgstr ""
++
++msgid "Bandwidth settings"
++msgstr ""
++
++msgid "Binding address IPv4"
++msgstr ""
++
++msgid "Binding address IPv6"
++msgstr ""
++
++msgid "Block list enabled"
++msgstr ""
++
++msgid "Blocklist URL"
++msgstr ""
++
++msgid "Blocklists"
++msgstr ""
++
++msgid "Cache size in MB"
++msgstr ""
++
++msgid "Config file directory"
++msgstr ""
++
++msgid "DHT enabled"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Download directory"
++msgstr ""
++
++msgid "Download queue enabled"
++msgstr ""
++
++msgid "Download queue size"
++msgstr ""
++
++msgid "Enable watch directory"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Fast"
++msgstr ""
++
++msgid "Files and Locations"
++msgstr ""
++
++msgid "Forced"
++msgstr ""
++
++msgid "Full"
++msgstr ""
++
++msgid "Global peer limit"
++msgstr ""
++
++msgid "Global settings"
++msgstr ""
++
++msgid "Idle seeding limit"
++msgstr ""
++
++msgid "Idle seeding limit enabled"
++msgstr ""
++
++msgid "Incomplete directory"
++msgstr ""
++
++msgid "Incomplete directory enabled"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "LPD enabled"
++msgstr ""
++
++msgid "Lazy bitfield enabled"
++msgstr ""
++
++msgid "Message level"
++msgstr ""
++
++msgid "Miscellaneous"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++
++msgid "Off"
++msgstr ""
++
++msgid "Open Web Interface"
++msgstr ""
++
++msgid "PEX enabled"
++msgstr ""
++
++msgid "Peer Port settings"
++msgstr ""
++
++msgid "Peer congestion algorithm"
++msgstr ""
++
++msgid "Peer limit per torrent"
++msgstr ""
++
++msgid "Peer port"
++msgstr ""
++
++msgid "Peer port random high"
++msgstr ""
++
++msgid "Peer port random low"
++msgstr ""
++
++msgid "Peer port random on start"
++msgstr ""
++
++msgid "Peer settings"
++msgstr ""
++
++msgid "Peer socket tos"
++msgstr ""
++
++msgid "Port forwarding enabled"
++msgstr ""
++
++msgid "Preferred"
++msgstr ""
++
++msgid "Prefetch enabled"
++msgstr ""
++
++msgid "Queue stalled enabled"
++msgstr ""
++
++msgid "Queue stalled minutes"
++msgstr ""
++
++msgid "Queueing"
++msgstr ""
++
++msgid "RPC URL"
++msgstr ""
++
++msgid "RPC authentication required"
++msgstr ""
++
++msgid "RPC bind address"
++msgstr ""
++
++msgid "RPC enabled"
++msgstr ""
++
++msgid "RPC password"
++msgstr ""
++
++msgid "RPC port"
++msgstr ""
++
++msgid "RPC settings"
++msgstr ""
++
++msgid "RPC username"
++msgstr ""
++
++msgid "RPC whitelist"
++msgstr ""
++
++msgid "RPC whitelist enabled"
++msgstr ""
++
++msgid "Ratio limit"
++msgstr ""
++
++msgid "Ratio limit enabled"
++msgstr ""
++
++msgid "Rename partial files"
++msgstr ""
++
++msgid "Run daemon as user"
++msgstr ""
++
++msgid "Scheduling"
++msgstr ""
++
++msgid "Scrape paused torrents enabled"
++msgstr ""
++
++msgid "Script torrent done enabled"
++msgstr ""
++
++msgid "Script torrent done filename"
++msgstr ""
++
++msgid "Seed queue enabled"
++msgstr ""
++
++msgid "Seed queue size"
++msgstr ""
++
++msgid "Speed limit down"
++msgstr ""
++
++msgid "Speed limit down enabled"
++msgstr ""
++
++msgid "Speed limit up"
++msgstr ""
++
++msgid "Speed limit up enabled"
++msgstr ""
++
++msgid "Transmission"
++msgstr ""
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr ""
++
++msgid "Trash original torrent files"
++msgstr ""
++
++msgid "Upload slots per torrent"
++msgstr ""
++
++msgid "Watch directory"
++msgstr ""
++
++msgid "in minutes from midnight"
++msgstr ""
++
++msgid "preallocation"
++msgstr ""
++
++msgid "uTP enabled"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-transmission/po/zh-cn/transmission.po b/feeds/luci/applications/luci-app-transmission/po/zh-cn/transmission.po
+new file mode 100644
+index 0000000..9dd3491
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/zh-cn/transmission.po
+@@ -0,0 +1,295 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-10-08 14:06+0200\n"
++"PO-Revision-Date: 2014-06-15 04:57+0200\n"
++"Last-Translator: phantasm131 <phantasm131@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "临时下载é™é€Ÿ"
++
++msgid "Alternative speed enabled"
++msgstr "å¯ç”¨ä¸´æ—¶é™é€Ÿ"
++
++msgid "Alternative speed time begin"
++msgstr "计划é™é€Ÿå§‹äºŽ"
++
++msgid "Alternative speed time day"
++msgstr "计划é™é€Ÿæ—¥æœŸ"
++
++msgid "Alternative speed time end"
++msgstr "计划é™é€Ÿæ­¢äºŽ"
++
++msgid "Alternative speed timing enabled"
++msgstr "å¯ç”¨è®¡åˆ’é™é€Ÿ"
++
++msgid "Alternative upload speed"
++msgstr "临时上传速度"
++
++msgid "Automatically start added torrents"
++msgstr "ç§å­è‡ªåŠ¨ä¸‹è½½"
++
++msgid "Bandwidth settings"
++msgstr "带宽é…ç½®"
++
++msgid "Binding address IPv4"
++msgstr "绑定IPv4地å€"
++
++msgid "Binding address IPv6"
++msgstr "绑定IPv6地å€"
++
++msgid "Block list enabled"
++msgstr "å¯ç”¨é˜»æ­¢åˆ—表"
++
++msgid "Blocklist URL"
++msgstr "URL阻止清å•"
++
++msgid "Blocklists"
++msgstr "阻止清å•"
++
++msgid "Cache size in MB"
++msgstr "缓存大å°ï¼ˆMB)"
++
++msgid "Config file directory"
++msgstr "é…置文件的目录"
++
++msgid "DHT enabled"
++msgstr "å¯ç”¨DHT"
++
++msgid "Debug"
++msgstr "调试"
++
++msgid "Download directory"
++msgstr "下载目录"
++
++msgid "Download queue enabled"
++msgstr "å¯ç”¨ä¸‹è½½é˜Ÿåˆ—"
++
++msgid "Download queue size"
++msgstr "下载队列大å°"
++
++msgid "Enable watch directory"
++msgstr "å¯ç”¨ç§å­è½®è¯¢ç›®å½•"
++
++msgid "Enabled"
++msgstr "å¯ç”¨"
++
++msgid "Encryption"
++msgstr "加密"
++
++msgid "Error"
++msgstr "错误"
++
++msgid "Fast"
++msgstr "快速"
++
++msgid "Files and Locations"
++msgstr "文件和ä½ç½®"
++
++msgid "Forced"
++msgstr "强制"
++
++msgid "Full"
++msgstr "全分é…"
++
++msgid "Global peer limit"
++msgstr "全局Peeré™åˆ¶"
++
++msgid "Global settings"
++msgstr "全局设置"
++
++msgid "Idle seeding limit"
++msgstr "空闲åšç§é™æ—¶"
++
++msgid "Idle seeding limit enabled"
++msgstr "å¯ç”¨ç©ºé—²åšç§æ—¶é—´"
++
++msgid "Incomplete directory"
++msgstr "未完æˆç›®å½•"
++
++msgid "Incomplete directory enabled"
++msgstr "å¯ç”¨æœªå®Œæˆç›®å½•"
++
++msgid "Info"
++msgstr "ä¿¡æ¯"
++
++msgid "LPD enabled"
++msgstr "å¯ç”¨LPD"
++
++msgid "Lazy bitfield enabled"
++msgstr "å¯ç”¨ä½æ®µå»¶è¿Ÿ"
++
++msgid "Message level"
++msgstr "消æ¯çº§åˆ«"
++
++msgid "Miscellaneous"
++msgstr "其他å‚æ•°"
++
++msgid "None"
++msgstr "空"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr "生效日期是对应日期的算术加和值。对应关系:周日-1ã€å‘¨ä¸€-2ã€å‘¨äºŒ-4ã€å‘¨ä¸‰-8ã€å‘¨å››-16ã€å‘¨äº”-32ã€å‘¨å…­-64。"
++
++msgid "Off"
++msgstr "关闭"
++
++msgid "Open Web Interface"
++msgstr "Web管ç†ç•Œé¢"
++
++msgid "PEX enabled"
++msgstr "å¯ç”¨PEX"
++
++msgid "Peer Port settings"
++msgstr "Peer端å£è®¾ç½®"
++
++msgid "Peer congestion algorithm"
++msgstr "Peer拥塞算法"
++
++msgid "Peer limit per torrent"
++msgstr "æ¯ä¸ªç§å­Peeré™åˆ¶æ•°"
++
++msgid "Peer port"
++msgstr "Peer端å£"
++
++msgid "Peer port random high"
++msgstr "Peeréšæœºç«¯å£æœ€å¤§å€¼"
++
++msgid "Peer port random low"
++msgstr "Peeréšæœºç«¯å£æœ€å°å€¼"
++
++msgid "Peer port random on start"
++msgstr "Peer端å£éšæœº"
++
++msgid "Peer settings"
++msgstr "Peer设置"
++
++msgid "Peer socket tos"
++msgstr "Peer套接字tos值"
++
++msgid "Port forwarding enabled"
++msgstr "å¯ç”¨ç«¯å£è½¬å‘"
++
++msgid "Preferred"
++msgstr "优先"
++
++msgid "Prefetch enabled"
++msgstr "å¯ç”¨é¢„å–缓存"
++
++msgid "Queue stalled enabled"
++msgstr "å¯ç”¨é˜Ÿåˆ—æš‚åœ"
++
++msgid "Queue stalled minutes"
++msgstr "队列暂åœåˆ†é’Ÿ"
++
++msgid "Queueing"
++msgstr "队列"
++
++msgid "RPC URL"
++msgstr "RPC URL"
++
++msgid "RPC authentication required"
++msgstr "PRC授æƒéªŒè¯"
++
++msgid "RPC bind address"
++msgstr "RPC绑定地å€"
++
++msgid "RPC enabled"
++msgstr "å¯ç”¨PRC"
++
++msgid "RPC password"
++msgstr "RPC密ç "
++
++msgid "RPC port"
++msgstr "RPC端å£"
++
++msgid "RPC settings"
++msgstr "RPCé…ç½®"
++
++msgid "RPC username"
++msgstr "RPC用户å"
++
++msgid "RPC whitelist"
++msgstr "RPC白åå•"
++
++msgid "RPC whitelist enabled"
++msgstr "å¯ç”¨RPC白åå•"
++
++msgid "Ratio limit"
++msgstr "分享率é™å€¼"
++
++msgid "Ratio limit enabled"
++msgstr "å¯ç”¨åˆ†äº«çŽ‡é™åˆ¶"
++
++msgid "Rename partial files"
++msgstr "é‡å‘½å未完æˆæ–‡ä»¶"
++
++msgid "Run daemon as user"
++msgstr "用户组"
++
++msgid "Scheduling"
++msgstr "计划任务"
++
++msgid "Scrape paused torrents enabled"
++msgstr "忽略暂åœçš„ç§å­"
++
++msgid "Script torrent done enabled"
++msgstr "ç§å­å®Œæˆæ—¶è¿è¡Œè„šæœ¬"
++
++msgid "Script torrent done filename"
++msgstr "脚本文件å"
++
++msgid "Seed queue enabled"
++msgstr "å¯ç”¨åšç§é˜Ÿåˆ—"
++
++msgid "Seed queue size"
++msgstr "åšç§é˜Ÿåˆ—大å°"
++
++msgid "Speed limit down"
++msgstr "下载é™é€Ÿ"
++
++msgid "Speed limit down enabled"
++msgstr "å¯ç”¨ä¸‹è½½é™é€Ÿ"
++
++msgid "Speed limit up"
++msgstr "上传é™é€Ÿ"
++
++msgid "Speed limit up enabled"
++msgstr "å¯ç”¨ä¸Šä¼ é™é€Ÿ"
++
++msgid "Transmission"
++msgstr "Transmission"
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr "Transmission是个简å•æ˜“用的BT/PT客户端。"
++
++msgid "Trash original torrent files"
++msgstr "删除ç§å­æºæ–‡ä»¶"
++
++msgid "Upload slots per torrent"
++msgstr "æ¯ä¸ªç§å­ä¸Šä¼ è¿žæŽ¥æ•°"
++
++msgid "Watch directory"
++msgstr "轮询ç§å­ç›®å½•"
++
++msgid "in minutes from midnight"
++msgstr "从晚上00:00起的分钟数,é™é€Ÿåˆ°ä¸´æ—¶é€Ÿåº¦"
++
++msgid "preallocation"
++msgstr "ç£ç›˜é¢„分é…ç­–ç•¥"
++
++msgid "uTP enabled"
++msgstr "å¯ç”¨uTP"
+diff --git a/feeds/luci/applications/luci-app-transmission/po/zh-tw/transmission.po b/feeds/luci/applications/luci-app-transmission/po/zh-tw/transmission.po
+new file mode 100644
+index 0000000..78da18d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/po/zh-tw/transmission.po
+@@ -0,0 +1,295 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-16 23:11+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Alternative download speed"
++msgstr "P2P代抓下載速度"
++
++msgid "Alternative speed enabled"
++msgstr "P2P代抓速度啟用"
++
++msgid "Alternative speed time begin"
++msgstr "P2P代抓起始時間"
++
++msgid "Alternative speed time day"
++msgstr "P2P代抓起æ¯æ—¥æ™‚é–“"
++
++msgid "Alternative speed time end"
++msgstr "P2P代抓çµæŸæ™‚é–“"
++
++msgid "Alternative speed timing enabled"
++msgstr "P2P代抓週期機制啟用"
++
++msgid "Alternative upload speed"
++msgstr "P2P代抓上傳速度"
++
++msgid "Automatically start added torrents"
++msgstr "當增加種å­å¾Œè‡ªå‹•é–‹å§‹ä¸‹è¼‰"
++
++msgid "Bandwidth settings"
++msgstr "æµé‡è¨­å®š"
++
++msgid "Binding address IPv4"
++msgstr "ç¶å®šçš„IPv4ä½ç½®"
++
++msgid "Binding address IPv6"
++msgstr "ç¶å®šçš„IPv6ä½ç½®"
++
++msgid "Block list enabled"
++msgstr "啟用å°éŽ–列表"
++
++msgid "Blocklist URL"
++msgstr "å°éŽ–URL"
++
++msgid "Blocklists"
++msgstr "å°éŽ–列表"
++
++msgid "Cache size in MB"
++msgstr "å¿«å–大å°(MB)"
++
++msgid "Config file directory"
++msgstr "設定檔目錄"
++
++msgid "DHT enabled"
++msgstr "DHT啟用"
++
++msgid "Debug"
++msgstr "åµéŒ¯"
++
++msgid "Download directory"
++msgstr "下載目錄"
++
++msgid "Download queue enabled"
++msgstr "啟用下載隊列"
++
++msgid "Download queue size"
++msgstr "下載隊列大å°"
++
++msgid "Enable watch directory"
++msgstr "啟用觀看目錄"
++
++msgid "Enabled"
++msgstr "啟用"
++
++msgid "Encryption"
++msgstr "加密"
++
++msgid "Error"
++msgstr "錯誤"
++
++msgid "Fast"
++msgstr "快速"
++
++msgid "Files and Locations"
++msgstr "檔案和ä½ç½®"
++
++msgid "Forced"
++msgstr "強制"
++
++msgid "Full"
++msgstr "全速"
++
++msgid "Global peer limit"
++msgstr "一般連接é™åˆ¶"
++
++msgid "Global settings"
++msgstr "一般設定"
++
++msgid "Idle seeding limit"
++msgstr "閒置作種é™åˆ¶"
++
++msgid "Idle seeding limit enabled"
++msgstr "閒置作種é™åˆ¶æ©Ÿåˆ¶å•Ÿç”¨"
++
++msgid "Incomplete directory"
++msgstr "ä¸å®Œæ•´çš„目錄路徑"
++
++msgid "Incomplete directory enabled"
++msgstr "ä¸å®Œæ•´çš„目錄置放å€æ©Ÿåˆ¶å•Ÿç”¨"
++
++msgid "Info"
++msgstr "資訊"
++
++msgid "LPD enabled"
++msgstr "LPD啟用"
++
++msgid "Lazy bitfield enabled"
++msgstr "防ISP懶散悠閒抓法啟用"
++
++msgid "Message level"
++msgstr "訊æ¯ç­‰ç´š"
++
++msgid "Miscellaneous"
++msgstr "雜項"
++
++msgid "None"
++msgstr "None"
++
++msgid ""
++"Number/bitfield. Start with 0, then for each day you want the scheduler "
++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - "
++"8, Thursday - 16, Friday - 32, Saturday - 64"
++msgstr ""
++"數字/欄ä½. ç”±0開始,æ¯æ—¥ä½ è‹¥è¦å•Ÿç”¨æŽ’程,就加上新數值. 星期日 -1, 星期一 -2, 星期二 -4, 星期三 -8, 星期四-16, "
++"星期五-32星期六 -64"
++
++msgid "Off"
++msgstr "關閉"
++
++msgid "Open Web Interface"
++msgstr "é–‹å•ŸWeb介é¢"
++
++msgid "PEX enabled"
++msgstr "啟用PEX"
++
++msgid "Peer Port settings"
++msgstr "P2P節點埠號設定"
++
++msgid "Peer congestion algorithm"
++msgstr "P2P節點堵塞演算法"
++
++msgid "Peer limit per torrent"
++msgstr "P2P節點æ¯å€‹ç¨®å­çš„é™åˆ¶"
++
++msgid "Peer port"
++msgstr "P2P節點埠號"
++
++msgid "Peer port random high"
++msgstr "P2P節點較高隨機埠號"
++
++msgid "Peer port random low"
++msgstr "P2P節點較低隨機埠號"
++
++msgid "Peer port random on start"
++msgstr "一開始就啟用P2P節點隨機埠"
++
++msgid "Peer settings"
++msgstr "埠號設定"
++
++msgid "Peer socket tos"
++msgstr "P2P節點優先IPæ’槽"
++
++msgid "Port forwarding enabled"
++msgstr "埠轉發啟用"
++
++msgid "Preferred"
++msgstr "首é¸"
++
++msgid "Prefetch enabled"
++msgstr "é é¸å•Ÿç”¨"
++
++msgid "Queue stalled enabled"
++msgstr "隊列åœæ»¯å•Ÿç”¨"
++
++msgid "Queue stalled minutes"
++msgstr "隊列åœæ»¯åˆ†é˜"
++
++msgid "Queueing"
++msgstr "排隊中"
++
++msgid "RPC URL"
++msgstr "é ç«¯èª¿ç”¨ç¶²å€"
++
++msgid "RPC authentication required"
++msgstr "é ç«¯èª¿ç”¨éœ€è¦é©—è­‰"
++
++msgid "RPC bind address"
++msgstr "é ç«¯èª¿ç”¨ç¶å®šä½å€"
++
++msgid "RPC enabled"
++msgstr "é ç«¯èª¿ç”¨åŠŸèƒ½å•Ÿç”¨"
++
++msgid "RPC password"
++msgstr "é ç«¯èª¿ç”¨å¯†ç¢¼"
++
++msgid "RPC port"
++msgstr "é ç«¯èª¿ç”¨åŸ è™Ÿ"
++
++msgid "RPC settings"
++msgstr "é ç«¯èª¿ç”¨è¨­å®š"
++
++msgid "RPC username"
++msgstr "é ç«¯èª¿ç”¨ç”¨æˆ¶å稱"
++
++msgid "RPC whitelist"
++msgstr "é ç«¯èª¿ç”¨ç™½åå–®"
++
++msgid "RPC whitelist enabled"
++msgstr "啟用é ç«¯èª¿ç”¨ç™½åå–®"
++
++msgid "Ratio limit"
++msgstr "比率é™åˆ¶"
++
++msgid "Ratio limit enabled"
++msgstr "啟用比率é™åˆ¶"
++
++msgid "Rename partial files"
++msgstr "ä¸å®Œæ•´æª”案更å"
++
++msgid "Run daemon as user"
++msgstr "åƒç”¨æˆ¶ä½¿ç”¨ä¸€æ¨£å¸¸é§"
++
++msgid "Scheduling"
++msgstr "排程"
++
++msgid "Scrape paused torrents enabled"
++msgstr "下載暫åœé–‹å§‹åšç¨®"
++
++msgid "Script torrent done enabled"
++msgstr "作種腳本啟用"
++
++msgid "Script torrent done filename"
++msgstr "作種腳本檔å"
++
++msgid "Seed queue enabled"
++msgstr "啟用作種隊列"
++
++msgid "Seed queue size"
++msgstr "作種隊列大å°"
++
++msgid "Speed limit down"
++msgstr "下載速度é™åˆ¶"
++
++msgid "Speed limit down enabled"
++msgstr "啟用下載速度é™åˆ¶"
++
++msgid "Speed limit up"
++msgstr "上傳速度é™åˆ¶"
++
++msgid "Speed limit up enabled"
++msgstr "啟用上傳速度é™åˆ¶"
++
++msgid "Transmission"
++msgstr "傳輸任務"
++
++msgid ""
++"Transmission daemon is a simple bittorrent client, here you can configure "
++"the settings."
++msgstr "傳輸任務常é§æ˜¯ä¸€å€‹ç°¡å–®çš„bittorrent用戶端程å¼, 這裡你å¯ä»¥é…置設定"
++
++msgid "Trash original torrent files"
++msgstr "丟棄來æºç¨®å­æª”"
++
++msgid "Upload slots per torrent"
++msgstr "æ¯å€‹ç¨®å­çš„上傳æ’槽數"
++
++msgid "Watch directory"
++msgstr "監看目錄"
++
++msgid "in minutes from midnight"
++msgstr "從åˆå¤œç®—起用分表示"
++
++msgid "preallocation"
++msgstr "é å…ˆåˆ†é…"
++
++msgid "uTP enabled"
++msgstr "啟用uTP"
+diff --git a/feeds/luci/applications/luci-app-transmission/root/etc/uci-defaults/luci-transmission b/feeds/luci/applications/luci-app-transmission/root/etc/uci-defaults/luci-transmission
+new file mode 100644
+index 0000000..456e8b8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-transmission/root/etc/uci-defaults/luci-transmission
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@tranmsmission[-1]
++ add ucitrack transmission
++ set ucitrack.@transmission[-1].init=transmission
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-udpxy/Makefile b/feeds/luci/applications/luci-app-udpxy/Makefile
+new file mode 100644
+index 0000000..cb8f179
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-udpxy/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for udpxy
++LUCI_DEPENDS:=+udpxy
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-udpxy/luasrc/controller/udpxy.lua b/feeds/luci/applications/luci-app-udpxy/luasrc/controller/udpxy.lua
+new file mode 100644
+index 0000000..36a40dd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-udpxy/luasrc/controller/udpxy.lua
+@@ -0,0 +1,14 @@
++-- Copyright 2014 Ãlvaro Fernández Rojas <noltari@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.udpxy", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/udpxy") then
++ return
++ end
++
++ local page = entry({"admin", "services", "udpxy"}, cbi("udpxy"), _("udpxy"))
++ page.dependent = true
++
++end
+diff --git a/feeds/luci/applications/luci-app-udpxy/luasrc/model/cbi/udpxy.lua b/feeds/luci/applications/luci-app-udpxy/luasrc/model/cbi/udpxy.lua
+new file mode 100644
+index 0000000..d823da0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-udpxy/luasrc/model/cbi/udpxy.lua
+@@ -0,0 +1,63 @@
++-- Copyright 2014 Ãlvaro Fernández Rojas <noltari@gmail.com>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("udpxy", "udpxy", translate("udpxy is a UDP-to-HTTP multicast traffic relay daemon, here you can configure the settings."))
++
++s = m:section(TypedSection, "udpxy", "")
++s.addremove = true
++s.anonymous = false
++
++enable=s:option(Flag, "disabled", translate("Enabled"))
++enable.enabled="0"
++enable.disabled="1"
++enable.default = "1"
++enable.rmempty = false
++respawn=s:option(Flag, "respawn", translate("Respawn"))
++respawn.default = false
++
++verbose=s:option(Flag, "verbose", translate("Verbose"))
++verbose.default = false
++
++status=s:option(Flag, "status", translate("Status"))
++
++bind=s:option(Value, "bind", translate("Bind IP/Interface"))
++bind.rmempty = true
++bind.datatype = "or(ipaddr, network)"
++
++port=s:option(Value, "port", translate("Port"))
++port.rmempty = true
++port.datatype = "port"
++
++source=s:option(Value, "source", translate("Source IP/Interface"))
++source.rmempty = true
++source.datatype = "or(ipaddr, network)"
++
++max_clients=s:option(Value, "max_clients", translate("Max clients"))
++max_clients.rmempty = true
++max_clients.datatype = "range(1, 5000)"
++
++log_file=s:option(Value, "log_file", translate("Log file"))
++log_file.rmempty = true
++--log_file.datatype = "file"
++
++buffer_size=s:option(Value, "buffer_size", translate("Buffer size"))
++buffer_size.rmempty = true
++buffer_size.datatype = "range(4096,2097152)"
++
++buffer_messages=s:option(Value, "buffer_messages", translate("Buffer messages"))
++buffer_messages.rmempty = true
++buffer_messages.datatype = "or(-1, and(min(1), uinteger))"
++
++buffer_time=s:option(Value, "buffer_time", translate("Buffer time"))
++buffer_time.rmempty = true
++buffer_time.datatype = "or(-1, and(min(1), uinteger))"
++
++nice_increment=s:option(Value, "nice_increment", translate("Nice increment"))
++nice_increment.rmempty = true
++nice_increment.datatype = "or(and(max(-1), integer),and(min(1), integer))"
++
++mcsub_renew=s:option(Value, "mcsub_renew", translate("Multicast subscription renew"))
++mcsub_renew.rmempty = true
++mcsub_renew.datatype = "or(0, range(30, 64000))"
++
++return m
+diff --git a/feeds/luci/applications/luci-app-udpxy/root/etc/uci-defaults/luci-udpxy b/feeds/luci/applications/luci-app-udpxy/root/etc/uci-defaults/luci-udpxy
+new file mode 100644
+index 0000000..e93c078
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-udpxy/root/etc/uci-defaults/luci-udpxy
+@@ -0,0 +1,12 @@
++#!/bin/sh
++
++# needed for "Save and Apply" to restart udpxy
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@udpxy[-1]
++ add ucitrack udpxy
++ set ucitrack.@udpxy[-1].init="udpxy"
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-upnp/Makefile b/feeds/luci/applications/luci-app-upnp/Makefile
+new file mode 100644
+index 0000000..324e3e2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Universal Plug & Play configuration module
++LUCI_DEPENDS:=+miniupnpd
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-upnp/luasrc/controller/upnp.lua b/feeds/luci/applications/luci-app-upnp/luasrc/controller/upnp.lua
+new file mode 100644
+index 0000000..c60b7c4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/luasrc/controller/upnp.lua
+@@ -0,0 +1,74 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.upnp", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/upnpd") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "services", "upnp"}, cbi("upnp/upnp"), _("UPnP"))
++ page.dependent = true
++
++ entry({"admin", "services", "upnp", "status"}, call("act_status")).leaf = true
++ entry({"admin", "services", "upnp", "delete"}, post("act_delete")).leaf = true
++end
++
++function act_status()
++ local ipt = io.popen("iptables --line-numbers -t nat -xnvL MINIUPNPD 2>/dev/null")
++ if ipt then
++ local fwd = { }
++ while true do
++ local ln = ipt:read("*l")
++ if not ln then
++ break
++ elseif ln:match("^%d+") then
++ local num, proto, extport, intaddr, intport =
++ ln:match("^(%d+).-([a-z]+).-dpt:(%d+) to:(%S-):(%d+)")
++
++ if num and proto and extport and intaddr and intport then
++ num = tonumber(num)
++ extport = tonumber(extport)
++ intport = tonumber(intport)
++
++ fwd[#fwd+1] = {
++ num = num,
++ proto = proto:upper(),
++ extport = extport,
++ intaddr = intaddr,
++ intport = intport
++ }
++ end
++ end
++ end
++
++ ipt:close()
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(fwd)
++ end
++end
++
++function act_delete(num)
++ local idx = tonumber(num)
++ local uci = luci.model.uci.cursor()
++
++ if idx and idx > 0 then
++ luci.sys.call("iptables -t filter -D MINIUPNPD %d 2>/dev/null" % idx)
++ luci.sys.call("iptables -t nat -D MINIUPNPD %d 2>/dev/null" % idx)
++
++ local lease_file = uci:get("upnpd", "config", "upnp_lease_file")
++ if lease_file and nixio.fs.access(lease_file) then
++ luci.sys.call("sed -i -e '%dd' %q" %{ idx, lease_file })
++ end
++
++ luci.http.status(200, "OK")
++ return
++ end
++
++ luci.http.status(400, "Bad request")
++end
+diff --git a/feeds/luci/applications/luci-app-upnp/luasrc/model/cbi/upnp/upnp.lua b/feeds/luci/applications/luci-app-upnp/luasrc/model/cbi/upnp/upnp.lua
+new file mode 100644
+index 0000000..f1bb450
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/luasrc/model/cbi/upnp/upnp.lua
+@@ -0,0 +1,103 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("upnpd", luci.util.pcdata(translate("Universal Plug & Play")),
++ translate("UPnP allows clients in the local network to automatically configure the router."))
++
++m:section(SimpleSection).template = "upnp_status"
++
++s = m:section(NamedSection, "config", "upnpd", translate("MiniUPnP settings"))
++s.addremove = false
++s:tab("general", translate("General Settings"))
++s:tab("advanced", translate("Advanced Settings"))
++
++e = s:taboption("general", Flag, "_init", translate("Start UPnP and NAT-PMP service"))
++e.rmempty = false
++
++function e.cfgvalue(self, section)
++ return luci.sys.init.enabled("miniupnpd") and self.enabled or self.disabled
++end
++
++function e.write(self, section, value)
++ if value == "1" then
++ luci.sys.call("/etc/init.d/miniupnpd enable >/dev/null")
++ luci.sys.call("/etc/init.d/miniupnpd start >/dev/null")
++ else
++ luci.sys.call("/etc/init.d/miniupnpd stop >/dev/null")
++ luci.sys.call("/etc/init.d/miniupnpd disable >/dev/null")
++ end
++end
++
++s:taboption("general", Flag, "enable_upnp", translate("Enable UPnP functionality")).default = "1"
++s:taboption("general", Flag, "enable_natpmp", translate("Enable NAT-PMP functionality")).default = "1"
++
++s:taboption("general", Flag, "secure_mode", translate("Enable secure mode"),
++ translate("Allow adding forwards only to requesting ip addresses")).default = "1"
++
++s:taboption("general", Flag, "log_output", translate("Enable additional logging"),
++ translate("Puts extra debugging information into the system log"))
++
++s:taboption("general", Value, "download", translate("Downlink"),
++ translate("Value in KByte/s, informational only")).rmempty = true
++
++s:taboption("general", Value, "upload", translate("Uplink"),
++ translate("Value in KByte/s, informational only")).rmempty = true
++
++port = s:taboption("general", Value, "port", translate("Port"))
++port.datatype = "port"
++port.default = 5000
++
++
++s:taboption("advanced", Flag, "system_uptime", translate("Report system instead of daemon uptime")).default = "1"
++
++s:taboption("advanced", Value, "uuid", translate("Device UUID"))
++s:taboption("advanced", Value, "serial_number", translate("Announced serial number"))
++s:taboption("advanced", Value, "model_number", translate("Announced model number"))
++
++ni = s:taboption("advanced", Value, "notify_interval", translate("Notify interval"))
++ni.datatype = "uinteger"
++ni.placeholder = 30
++
++ct = s:taboption("advanced", Value, "clean_ruleset_threshold", translate("Clean rules threshold"))
++ct.datatype = "uinteger"
++ct.placeholder = 20
++
++ci = s:taboption("advanced", Value, "clean_ruleset_interval", translate("Clean rules interval"))
++ci.datatype = "uinteger"
++ci.placeholder = 600
++
++pu = s:taboption("advanced", Value, "presentation_url", translate("Presentation URL"))
++pu.placeholder = "http://192.168.1.1/"
++
++lf = s:taboption("advanced", Value, "upnp_lease_file", translate("UPnP lease file"))
++lf.placeholder = "/var/log/upnp.leases"
++
++
++s2 = m:section(TypedSection, "perm_rule", translate("MiniUPnP ACLs"),
++ translate("ACLs specify which external ports may be redirected to which internal addresses and ports"))
++
++s2.template = "cbi/tblsection"
++s2.sortable = true
++s2.anonymous = true
++s2.addremove = true
++
++s2:option(Value, "comment", translate("Comment"))
++
++ep = s2:option(Value, "ext_ports", translate("External ports"))
++ep.datatype = "portrange"
++ep.placeholder = "0-65535"
++
++ia = s2:option(Value, "int_addr", translate("Internal addresses"))
++ia.datatype = "ip4addr"
++ia.placeholder = "0.0.0.0/0"
++
++ip = s2:option(Value, "int_ports", translate("Internal ports"))
++ip.datatype = "portrange"
++ip.placeholder = "0-65535"
++
++ac = s2:option(ListValue, "action", translate("Action"))
++ac:value("allow")
++ac:value("deny")
++
++return m
+diff --git a/feeds/luci/applications/luci-app-upnp/luasrc/view/admin_status/index/upnp.htm b/feeds/luci/applications/luci-app-upnp/luasrc/view/admin_status/index/upnp.htm
+new file mode 100644
+index 0000000..d0c2e2e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/luasrc/view/admin_status/index/upnp.htm
+@@ -0,0 +1 @@
++<%+upnp_status%>
+diff --git a/feeds/luci/applications/luci-app-upnp/luasrc/view/upnp_status.htm b/feeds/luci/applications/luci-app-upnp/luasrc/view/upnp_status.htm
+new file mode 100644
+index 0000000..e358dcd
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/luasrc/view/upnp_status.htm
+@@ -0,0 +1,67 @@
++<script type="text/javascript">//<![CDATA[
++ function upnp_delete_fwd(idx) {
++ (new XHR()).post('<%=url('admin/services/upnp/delete')%>/' + idx, { token: '<%=token%>' },
++ function(x)
++ {
++ var tb = document.getElementById('upnp_status_table');
++ if (tb && (idx < tb.rows.length))
++ tb.rows[0].parentNode.removeChild(tb.rows[idx]);
++ }
++ );
++ }
++
++ XHR.poll(5, '<%=url('admin/services/upnp/status')%>', null,
++ function(x, st)
++ {
++ var tb = document.getElementById('upnp_status_table');
++ if (st && tb)
++ {
++ /* clear all rows */
++ while( tb.rows.length > 1 )
++ tb.deleteRow(1);
++
++ 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].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 = String.format(
++ '<input class="cbi-button cbi-input-remove" type="button" value="<%:Delete Redirect%>" 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>';
++ }
++ }
++ }
++ );
++//]]></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">&#160;</th>
++ </tr>
++ <tr class="cbi-section-table-row">
++ <td colspan="5"><em><br /><%:Collecting data...%></em></td>
++ </tr>
++ </table>
++</fieldset>
+diff --git a/feeds/luci/applications/luci-app-upnp/po/ca/upnp.po b/feeds/luci/applications/luci-app-upnp/po/ca/upnp.po
+new file mode 100644
+index 0000000..bb9f88f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/ca/upnp.po
+@@ -0,0 +1,167 @@
++# upnp.pot
++# generated from ./applications/luci-upnp/luasrc/i18n/upnp.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-07-01 08:38+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++"Els ACL especifiquen quins ports externs es poden redirigir a quines adreces "
++"i ports interns"
++
++msgid "Action"
++msgstr "Acció"
++
++msgid "Active UPnP Redirects"
++msgstr "Redireccions UPnP actives"
++
++msgid "Advanced Settings"
++msgstr "Ajusts avançats"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr "Permet que s'afegeixin redireccions només a les adreces IP peticionant"
++
++msgid "Announced model number"
++msgstr "Número de model anunciat"
++
++msgid "Announced serial number"
++msgstr "Número de sèrie anunciat"
++
++msgid "Clean rules interval"
++msgstr "Interval de neteja de regles"
++
++msgid "Clean rules threshold"
++msgstr "Llindar de neteja de regles"
++
++msgid "Client Address"
++msgstr "Adreça de client"
++
++msgid "Client Port"
++msgstr "Port de client"
++
++msgid "Collecting data..."
++msgstr "Recollint dades..."
++
++msgid "Comment"
++msgstr "Comentari"
++
++msgid "Delete Redirect"
++msgstr "Suprimeix la redirecció"
++
++msgid "Device UUID"
++msgstr "UUID de dispositiu"
++
++msgid "Downlink"
++msgstr "Enllaç de baixada"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "Habilita la funcionalitat NAT-PMP"
++
++msgid "Enable UPnP functionality"
++msgstr "Habilita la funcionalitat UPnP"
++
++msgid "Enable additional logging"
++msgstr "Habilita el registre addicional"
++
++msgid "Enable secure mode"
++msgstr "Habilita mode segur"
++
++msgid "External Port"
++msgstr "Port extern"
++
++msgid "External ports"
++msgstr "Ports externs"
++
++msgid "General Settings"
++msgstr "Ajusts generals"
++
++msgid "Internal addresses"
++msgstr "Adreces internes"
++
++msgid "Internal ports"
++msgstr "Ports interns"
++
++msgid "MiniUPnP ACLs"
++msgstr "ACLs de MiniUPnP"
++
++msgid "MiniUPnP settings"
++msgstr "Ajusts de MiniUPnP"
++
++msgid "Notify interval"
++msgstr "Interval de notificació"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Presentation URL"
++msgstr ""
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "Posa informació extra de depuració en el registre de sistema"
++
++msgid "Report system instead of daemon uptime"
++msgstr "Reporta el temps actiu del sistema en lloc del del dimoni"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "Inicia el servei UPnP i NAP-PMP"
++
++msgid "There are no active redirects."
++msgstr "No hi ha redireccions actives."
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnP permet als clients de la xarxa local configurar automàticament el "
++"router."
++
++msgid "UPnP lease file"
++msgstr "Fitxer d'arrendament UPnP"
++
++msgid "Universal Plug & Play"
++msgstr "Universal Plug & Play"
++
++msgid "Uplink"
++msgstr "Enllaç de pujada"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Valor en KByte/s, només per informació"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPnP permet als clients de la xarxa local configurar automàticament el "
++#~ "router."
++
++#~ msgid "enable"
++#~ msgstr "habilita"
++
++#~ msgid "Log output"
++#~ msgstr "Registra la sortida"
++
++#~ msgid ""
++#~ "UPNP should only be enabled if absolutely necessary as it can result in "
++#~ "high security risks for your network."
++#~ msgstr ""
++#~ "Només s'hauria d'activar l'UPnP si és absolutament necessari, ja que en "
++#~ "poden resultar alts riscos de seguretat a la teva xarxa."
+diff --git a/feeds/luci/applications/luci-app-upnp/po/cs/upnp.po b/feeds/luci/applications/luci-app-upnp/po/cs/upnp.po
+new file mode 100644
+index 0000000..3cefdcc
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/cs/upnp.po
+@@ -0,0 +1,150 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-29 21:54+0200\n"
++"Last-Translator: Astran <martin.hromadko@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 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 ""
++"ACL stanovují, které vnější porty by měly být přesměrovány na které vnitřní "
++"adresy a porty"
++
++msgid "Action"
++msgstr "Akce"
++
++msgid "Active UPnP Redirects"
++msgstr "Aktivní přesměrování UPnP"
++
++msgid "Advanced Settings"
++msgstr "PokroÄilé nastavení"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr "Povolit přesměrování pouze na dotazující ip adresy"
++
++msgid "Announced model number"
++msgstr "Oznámené Äíslo modelu"
++
++msgid "Announced serial number"
++msgstr "Oznámené sériové Äíslo"
++
++msgid "Clean rules interval"
++msgstr "Interval ÄiÅ¡tÄ›ní pravidel"
++
++msgid "Clean rules threshold"
++msgstr "Práh ÄiÅ¡tÄ›ní pravidel"
++
++msgid "Client Address"
++msgstr "Adresa klienta"
++
++msgid "Client Port"
++msgstr "Port klienta"
++
++msgid "Collecting data..."
++msgstr "Probíhá sběr dat.."
++
++msgid "Comment"
++msgstr "Komentář"
++
++msgid "Delete Redirect"
++msgstr "Odstranit přesměrování"
++
++msgid "Device UUID"
++msgstr "UUID zařízení"
++
++msgid "Downlink"
++msgstr "Downlink"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "Povolit funkÄnost NAT-PMP"
++
++msgid "Enable UPnP functionality"
++msgstr "Povolit funkÄnost UPnP"
++
++msgid "Enable additional logging"
++msgstr "Povolit přídavné logování"
++
++msgid "Enable secure mode"
++msgstr "Povolit bezpeÄný režim"
++
++msgid "External Port"
++msgstr "Vnější port"
++
++msgid "External ports"
++msgstr "Vnější porty"
++
++msgid "General Settings"
++msgstr "Obecné nastavení"
++
++msgid "Internal addresses"
++msgstr "Vnitřní adresy"
++
++msgid "Internal ports"
++msgstr "Vnitřní porty"
++
++msgid "MiniUPnP ACLs"
++msgstr "MiniUPnP ACL listy"
++
++msgid "MiniUPnP settings"
++msgstr "Nastavení MiniUPnP"
++
++msgid "Notify interval"
++msgstr "Interval oznamování"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Presentation URL"
++msgstr "Prezentace URL"
++
++msgid "Protocol"
++msgstr "Protokol"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "Vypisovat extra ladící informace do systémového záznamu"
++
++msgid "Report system instead of daemon uptime"
++msgstr "Hlásit uptime systému namísto uptime daemonu"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "Spustit službu UPnP a NAT-PMP"
++
++msgid "There are no active redirects."
++msgstr "Nejsou zde žádná aktivní přesměrování"
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnP umožňuje klientům v místní síti automaticky nakonfigurovat router."
++
++msgid "UPnP lease file"
++msgstr "Soubor UPnP výpůjÄek"
++
++msgid "Universal Plug & Play"
++msgstr "Univerzální Plug & Play"
++
++msgid "Uplink"
++msgstr "Uplink"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Pouze informaÄní hodnoty (v KByte/s)"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr "UPnP umožňuje klientům v místní síti automaticky nakonfigurovat router."
++
++#~ msgid "enable"
++#~ msgstr "povolit"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/de/upnp.po b/feeds/luci/applications/luci-app-upnp/po/de/upnp.po
+new file mode 100644
+index 0000000..fe6532d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/de/upnp.po
+@@ -0,0 +1,171 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2012-11-28 10:45+0200\n"
++"Last-Translator: dunkelschunkel <dunkelschunkel@googlemail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++"ACLs definieren, welche externen Ports zu welchen internen Adressen und "
++"Ports weitergeleitet werden dürfen"
++
++msgid "Action"
++msgstr "Aktion"
++
++msgid "Active UPnP Redirects"
++msgstr "Aktive UPnP-Weiterleitungen"
++
++msgid "Advanced Settings"
++msgstr "Erweiterte Einstellungen"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr "Nur Weiterleitungen zurück zum anfordernden Client zulassen"
++
++msgid "Announced model number"
++msgstr "Angekündigte Modellnummer"
++
++msgid "Announced serial number"
++msgstr "Angekündigte Seriennummer"
++
++msgid "Clean rules interval"
++msgstr "Aufräumintervall für Weiterleitungen"
++
++msgid "Clean rules threshold"
++msgstr "Aufräumschwellenwert für Weiterleitungen"
++
++msgid "Client Address"
++msgstr "Clientadresse"
++
++msgid "Client Port"
++msgstr "Clientport"
++
++msgid "Collecting data..."
++msgstr "Sammle Daten..."
++
++msgid "Comment"
++msgstr "Kommentar"
++
++msgid "Delete Redirect"
++msgstr "Weiterleitung löschen"
++
++msgid "Device UUID"
++msgstr "Geräte-UUID"
++
++msgid "Downlink"
++msgstr "Downlink"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "NAT-PMP Funktionalität aktivieren"
++
++msgid "Enable UPnP functionality"
++msgstr "UPnP Funktionalität aktivieren"
++
++msgid "Enable additional logging"
++msgstr "Erweiterte Protokollierung aktivieren"
++
++msgid "Enable secure mode"
++msgstr "Sicheren Modus aktivieren"
++
++msgid "External Port"
++msgstr "Externer Port"
++
++msgid "External ports"
++msgstr "Externe Ports"
++
++msgid "General Settings"
++msgstr "Allgemeine Einstellungen"
++
++msgid "Internal addresses"
++msgstr "Interne Adressen"
++
++msgid "Internal ports"
++msgstr "Interne Ports"
++
++msgid "MiniUPnP ACLs"
++msgstr "MiniUPnP ACLs"
++
++msgid "MiniUPnP settings"
++msgstr "MiniUPnP-Einstellungen"
++
++msgid "Notify interval"
++msgstr "Benachrichtigungsintervall"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Presentation URL"
++msgstr "Präsentations-URL"
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "Schreibt zusätzliche Debug-Informationen in das Systemprotokoll"
++
++msgid "Report system instead of daemon uptime"
++msgstr "Systemlaufzeit statt Prozesslaufzeit melden"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "UPnP und NAT-PMP Dienst starten"
++
++msgid "There are no active redirects."
++msgstr "Es gibt keine aktiven Weiterleitungen."
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnP erlaubt es Clients im lokalen Netzwerk automatisch Port-Weiterleitungen "
++"auf diesem Router einzurichten."
++
++msgid "UPnP lease file"
++msgstr "UPnP Lease-Datei"
++
++msgid "Universal Plug & Play"
++msgstr "Universal Plug & Play"
++
++msgid "Uplink"
++msgstr "Uplink"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Wert in Kilobyte/s, nur informativ"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPnP ermöglicht die automatische Konfiguration des Routers durch Clients im "
++#~ "lokalen Netzwerk."
++
++#~ msgid "enable"
++#~ msgstr "aktivieren"
++
++#~ msgid "Enable NAT-PMP"
++#~ msgstr "NAT-PMP aktivieren"
++
++#~ msgid "Enable UPnP Service"
++#~ msgstr "UPnP Service aktivieren"
++
++#~ msgid "Log output"
++#~ msgstr "Ausgabe protokollieren"
++
++#~ msgid ""
++#~ "UPNP should only be enabled if absolutely necessary as it can result in "
++#~ "high security risks for your network."
++#~ msgstr ""
++#~ "UPNP sollte nur wenn unbedingt nötig aktiviert werden, da es ein "
++#~ "Sicherheitsrisiko für das Netzwerk darstellen kann."
+diff --git a/feeds/luci/applications/luci-app-upnp/po/el/upnp.po b/feeds/luci/applications/luci-app-upnp/po/el/upnp.po
+new file mode 100644
+index 0000000..8b4fa0c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/el/upnp.po
+@@ -0,0 +1,140 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-28 02:08+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Active UPnP Redirects"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++
++msgid "Announced model number"
++msgstr ""
++
++msgid "Announced serial number"
++msgstr ""
++
++msgid "Clean rules interval"
++msgstr ""
++
++msgid "Clean rules threshold"
++msgstr ""
++
++msgid "Client Address"
++msgstr ""
++
++msgid "Client Port"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Delete Redirect"
++msgstr ""
++
++msgid "Device UUID"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Enable NAT-PMP functionality"
++msgstr ""
++
++msgid "Enable UPnP functionality"
++msgstr ""
++
++msgid "Enable additional logging"
++msgstr ""
++
++msgid "Enable secure mode"
++msgstr ""
++
++msgid "External Port"
++msgstr ""
++
++msgid "External ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Internal addresses"
++msgstr ""
++
++msgid "Internal ports"
++msgstr ""
++
++msgid "MiniUPnP ACLs"
++msgstr ""
++
++msgid "MiniUPnP settings"
++msgstr ""
++
++msgid "Notify interval"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Presentation URL"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Puts extra debugging information into the system log"
++msgstr ""
++
++msgid "Report system instead of daemon uptime"
++msgstr ""
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr ""
++
++msgid "There are no active redirects."
++msgstr ""
++
++msgid "UPnP"
++msgstr ""
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++
++msgid "UPnP lease file"
++msgstr ""
++
++msgid "Universal Plug & Play"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Value in KByte/s, informational only"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-upnp/po/en/upnp.po b/feeds/luci/applications/luci-app-upnp/po/en/upnp.po
+new file mode 100644
+index 0000000..215b34c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/en/upnp.po
+@@ -0,0 +1,157 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Active UPnP Redirects"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++
++msgid "Announced model number"
++msgstr ""
++
++msgid "Announced serial number"
++msgstr ""
++
++msgid "Clean rules interval"
++msgstr ""
++
++msgid "Clean rules threshold"
++msgstr ""
++
++msgid "Client Address"
++msgstr ""
++
++msgid "Client Port"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Delete Redirect"
++msgstr ""
++
++msgid "Device UUID"
++msgstr ""
++
++msgid "Downlink"
++msgstr "Downlink"
++
++msgid "Enable NAT-PMP functionality"
++msgstr ""
++
++msgid "Enable UPnP functionality"
++msgstr ""
++
++msgid "Enable additional logging"
++msgstr ""
++
++msgid "Enable secure mode"
++msgstr "Enable secure mode"
++
++msgid "External Port"
++msgstr ""
++
++msgid "External ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Internal addresses"
++msgstr ""
++
++msgid "Internal ports"
++msgstr ""
++
++msgid "MiniUPnP ACLs"
++msgstr ""
++
++msgid "MiniUPnP settings"
++msgstr ""
++
++msgid "Notify interval"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Presentation URL"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Puts extra debugging information into the system log"
++msgstr ""
++
++msgid "Report system instead of daemon uptime"
++msgstr ""
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr ""
++
++msgid "There are no active redirects."
++msgstr ""
++
++msgid "UPnP"
++msgstr ""
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++
++msgid "UPnP lease file"
++msgstr ""
++
++msgid "Universal Plug & Play"
++msgstr "Universal Plug & Play"
++
++msgid "Uplink"
++msgstr "Uplink"
++
++msgid "Value in KByte/s, informational only"
++msgstr ""
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++
++#~ msgid "Log output"
++#~ msgstr "Log output"
++
++#~ msgid ""
++#~ "UPNP should only be enabled if absolutely necessary as it can result in "
++#~ "high security risks for your network."
++#~ msgstr ""
++#~ "UPNP should only be enabled if absolutely necessary as it can result in "
++#~ "high security risks for your network."
+diff --git a/feeds/luci/applications/luci-app-upnp/po/es/upnp.po b/feeds/luci/applications/luci-app-upnp/po/es/upnp.po
+new file mode 100644
+index 0000000..91e1393
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/es/upnp.po
+@@ -0,0 +1,165 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-10-07 16:11+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++"Los ACL especifican qué puertos externos pueden ser redirigidos hacia qué "
++"direcciones y puertos internas"
++
++msgid "Action"
++msgstr "Acción"
++
++msgid "Active UPnP Redirects"
++msgstr "Redirecciones UPnP activas"
++
++msgid "Advanced Settings"
++msgstr "Configuración avanzada"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr "Permitir añadir redirecciones sólo a IPs que lo soliciten"
++
++msgid "Announced model number"
++msgstr "Número de modelo declarado"
++
++msgid "Announced serial number"
++msgstr "Número de serie declarado"
++
++msgid "Clean rules interval"
++msgstr "Intervalo de borrado de reglas"
++
++msgid "Clean rules threshold"
++msgstr "Umbral de borrado de reglas"
++
++msgid "Client Address"
++msgstr "Dirección del cliente"
++
++msgid "Client Port"
++msgstr "Puerto del cliente"
++
++msgid "Collecting data..."
++msgstr "Un momento..."
++
++msgid "Comment"
++msgstr "Comentario"
++
++msgid "Delete Redirect"
++msgstr "Borrar redirección"
++
++msgid "Device UUID"
++msgstr "UUID del dispositivo"
++
++msgid "Downlink"
++msgstr "Enlace para bajada"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "Activar la funcionalidad NAT-PMP"
++
++msgid "Enable UPnP functionality"
++msgstr "Activar la funcionalidad UPnP"
++
++msgid "Enable additional logging"
++msgstr "Activar registro adicional"
++
++msgid "Enable secure mode"
++msgstr "Habilitar modo seguro"
++
++msgid "External Port"
++msgstr "Puerto externo"
++
++msgid "External ports"
++msgstr "Puertos externos"
++
++msgid "General Settings"
++msgstr "Configuración general"
++
++msgid "Internal addresses"
++msgstr "Direcciones internas"
++
++msgid "Internal ports"
++msgstr "Puertos internos"
++
++msgid "MiniUPnP ACLs"
++msgstr "ACLs MiniUPnP"
++
++msgid "MiniUPnP settings"
++msgstr "Configuración MiniUPnP"
++
++msgid "Notify interval"
++msgstr "Intervalo de notificación"
++
++msgid "Port"
++msgstr "Puerto"
++
++msgid "Presentation URL"
++msgstr "URL de presentación"
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "Escribir información de depuración extra en el registro del sistema"
++
++msgid "Report system instead of daemon uptime"
++msgstr "Informar del tiempo activo del sistema en vez de el del demonio"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "Arrancar servicio UPnP y NAT-PMP"
++
++msgid "There are no active redirects."
++msgstr "Sin redirecciones activas."
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnP permite que los puestos de la red local configuren automáticamente el "
++"router."
++
++msgid "UPnP lease file"
++msgstr "Tiempo de cesión UPnP"
++
++msgid "Universal Plug & Play"
++msgstr "Plug & Play universal"
++
++msgid "Uplink"
++msgstr "Enlace de subida"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Valor en KBytes/s (sólo informativo)"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPnP permite que los puestos de la red local configuren automáticamente el "
++#~ "router."
++
++#~ msgid "enable"
++#~ msgstr "activar"
++
++#~ msgid "Log output"
++#~ msgstr "Loguear salida"
++
++#~ msgid ""
++#~ "UPNP should only be enabled if absolutely necessary as it can result in "
++#~ "high security risks for your network."
++#~ msgstr ""
++#~ "UPNP sólo deberia habilitarse si es abasolutamente necesario ya que puede "
++#~ "comprometer la seguridad de su red."
+diff --git a/feeds/luci/applications/luci-app-upnp/po/fr/upnp.po b/feeds/luci/applications/luci-app-upnp/po/fr/upnp.po
+new file mode 100644
+index 0000000..4390d0f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/fr/upnp.po
+@@ -0,0 +1,158 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-11-06 16:09+0200\n"
++"Last-Translator: hogsim <hogsim@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++"Les ACLs définissent quels ports externes peuvent être redirigés, vers "
++"quelles adresses et ports internes"
++
++msgid "Action"
++msgstr "Action"
++
++msgid "Active UPnP Redirects"
++msgstr "Redirections UPnP actives"
++
++msgid "Advanced Settings"
++msgstr "Paramètres avancés"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++"Permet d'ajouter des redirections seulement vers les adresses IP qui font "
++"des demandes"
++
++msgid "Announced model number"
++msgstr "Numéro de modèle déclaré"
++
++msgid "Announced serial number"
++msgstr "Numéro de série déclaré"
++
++msgid "Clean rules interval"
++msgstr "Intervalle des règles de nettoyage"
++
++msgid "Clean rules threshold"
++msgstr "Niveau des règles de nettoyage"
++
++msgid "Client Address"
++msgstr "Adresse du client"
++
++msgid "Client Port"
++msgstr "Port du client"
++
++msgid "Collecting data..."
++msgstr "Récupération des données…"
++
++msgid "Comment"
++msgstr "Commentaire"
++
++msgid "Delete Redirect"
++msgstr "Détruire la redirection"
++
++msgid "Device UUID"
++msgstr "UUID du périphérique"
++
++msgid "Downlink"
++msgstr "Lien descendant"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "Activer la fonctionnalité NAT-PMP"
++
++msgid "Enable UPnP functionality"
++msgstr "Activer la fonctionnalité UPnP"
++
++msgid "Enable additional logging"
++msgstr "Activer la journalisation additionnelle"
++
++msgid "Enable secure mode"
++msgstr "Activer le mode sécurisé"
++
++msgid "External Port"
++msgstr "Port externe"
++
++msgid "External ports"
++msgstr "Ports externes"
++
++msgid "General Settings"
++msgstr "Paramètres généraux"
++
++msgid "Internal addresses"
++msgstr "Adresses internes"
++
++msgid "Internal ports"
++msgstr "Ports internes"
++
++msgid "MiniUPnP ACLs"
++msgstr "ACLs MiniUPnP"
++
++msgid "MiniUPnP settings"
++msgstr "Paramètres MiniUPnP"
++
++msgid "Notify interval"
++msgstr "Intervalle de notification"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Presentation URL"
++msgstr "URL de présentation"
++
++msgid "Protocol"
++msgstr "Protocole"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "Rajoute des informations de debug dans le journal-système"
++
++msgid "Report system instead of daemon uptime"
++msgstr ""
++"Indiquer la durée de fonctionnement du système plutôt que celle du démon UPnP"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "Démarrer les services UPnP et NAT-PMP"
++
++msgid "There are no active redirects."
++msgstr "Il n'y a pas de redirections actives."
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnP permet à des clients du réseau local de configurer automatiquement le "
++"routeur."
++
++msgid "UPnP lease file"
++msgstr "Fichier des baux UPnP"
++
++msgid "Universal Plug & Play"
++msgstr "Universal Plug & Play"
++
++msgid "Uplink"
++msgstr "Lien remontant"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Valeur en Ko/s, pour information seulement"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPnP permet à des clients du réseau local de configurer automatiquement le "
++#~ "routeur."
++
++#~ msgid "enable"
++#~ msgstr "activer"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/he/upnp.po b/feeds/luci/applications/luci-app-upnp/po/he/upnp.po
+new file mode 100644
+index 0000000..6e4d1f1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/he/upnp.po
+@@ -0,0 +1,136 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Active UPnP Redirects"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++
++msgid "Announced model number"
++msgstr ""
++
++msgid "Announced serial number"
++msgstr ""
++
++msgid "Clean rules interval"
++msgstr ""
++
++msgid "Clean rules threshold"
++msgstr ""
++
++msgid "Client Address"
++msgstr ""
++
++msgid "Client Port"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Delete Redirect"
++msgstr ""
++
++msgid "Device UUID"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Enable NAT-PMP functionality"
++msgstr ""
++
++msgid "Enable UPnP functionality"
++msgstr ""
++
++msgid "Enable additional logging"
++msgstr ""
++
++msgid "Enable secure mode"
++msgstr ""
++
++msgid "External Port"
++msgstr ""
++
++msgid "External ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Internal addresses"
++msgstr ""
++
++msgid "Internal ports"
++msgstr ""
++
++msgid "MiniUPnP ACLs"
++msgstr ""
++
++msgid "MiniUPnP settings"
++msgstr ""
++
++msgid "Notify interval"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Presentation URL"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Puts extra debugging information into the system log"
++msgstr ""
++
++msgid "Report system instead of daemon uptime"
++msgstr ""
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr ""
++
++msgid "There are no active redirects."
++msgstr ""
++
++msgid "UPnP"
++msgstr ""
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++
++msgid "UPnP lease file"
++msgstr ""
++
++msgid "Universal Plug & Play"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Value in KByte/s, informational only"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-upnp/po/hu/upnp.po b/feeds/luci/applications/luci-app-upnp/po/hu/upnp.po
+new file mode 100644
+index 0000000..c5a2c26
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/hu/upnp.po
+@@ -0,0 +1,155 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-31 18:32+0200\n"
++"Last-Translator: juhosg <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++"Az ACL-ek határozzák meg, hogy melyik külső portok melyik belső portokra és "
++"címekre kerülhetnek továbbításra"
++
++msgid "Action"
++msgstr "Művelet"
++
++msgid "Active UPnP Redirects"
++msgstr "Aktív UPnP átirányítások"
++
++msgid "Advanced Settings"
++msgstr "Haladó beállítások"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++"Kizárólag a kérést küldő IP címre történő továbbítás hozzáadásának "
++"engedélyezése"
++
++msgid "Announced model number"
++msgstr "Közzétett modelszám"
++
++msgid "Announced serial number"
++msgstr "Közzétett sorozatszám"
++
++msgid "Clean rules interval"
++msgstr "Szabály törlési időköz"
++
++msgid "Clean rules threshold"
++msgstr "Szabály törlési küszöbérték"
++
++msgid "Client Address"
++msgstr "Ügyfél cím"
++
++msgid "Client Port"
++msgstr "Ügyfél port"
++
++msgid "Collecting data..."
++msgstr "Adatok összegyűjtése..."
++
++msgid "Comment"
++msgstr "Megjegyzés"
++
++msgid "Delete Redirect"
++msgstr "Ãtirányítás törlése"
++
++msgid "Device UUID"
++msgstr "Eszköz UUID"
++
++msgid "Downlink"
++msgstr "Letöltés"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "NAT-PMP funkció engedélyezése"
++
++msgid "Enable UPnP functionality"
++msgstr "UPnP funkció engedélyezése"
++
++msgid "Enable additional logging"
++msgstr "További naplózás engedélyezése"
++
++msgid "Enable secure mode"
++msgstr "Biztonságos mód engedélyezése"
++
++msgid "External Port"
++msgstr "Külső port"
++
++msgid "External ports"
++msgstr "Külső portok"
++
++msgid "General Settings"
++msgstr "Ãltalános beállítások"
++
++msgid "Internal addresses"
++msgstr "Belső címek"
++
++msgid "Internal ports"
++msgstr "Belső portok"
++
++msgid "MiniUPnP ACLs"
++msgstr "MiniUPnP ACL-ek"
++
++msgid "MiniUPnP settings"
++msgstr "MiniUPnP beállítások"
++
++msgid "Notify interval"
++msgstr "Értesítési időköz"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Presentation URL"
++msgstr "Bemutatkozó URL"
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "További nyomkövetési információk írása a rendszernaplóba."
++
++msgid "Report system instead of daemon uptime"
++msgstr "A démon helyett a rendszer működési idejét jeleníti meg"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "UPnP és NAT-PMP szolgáltatás elindítása"
++
++msgid "There are no active redirects."
++msgstr "Nincsenek aktív átírányítások."
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"Az UPnP lehetővé teszi a hálózatban lévő ügyfelek számára hogy automatikusan "
++"beállítsák a routert."
++
++msgid "UPnP lease file"
++msgstr "UPnP bérlet fájl"
++
++msgid "Universal Plug & Play"
++msgstr "Univerzális Plug and Play"
++
++msgid "Uplink"
++msgstr "Feltöltés"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Érték KByte/s-ban, csak tájékoztató jellegű"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "Az UPnP lehetővé teszi a hálózatban lévő ügyfelek számára hogy automatikusan "
++#~ "beállítsák a routert."
++
++#~ msgid "enable"
++#~ msgstr "engedélyezés"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/it/upnp.po b/feeds/luci/applications/luci-app-upnp/po/it/upnp.po
+new file mode 100644
+index 0000000..9ef09ea
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/it/upnp.po
+@@ -0,0 +1,155 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-02-03 13:52+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++"Le ACL specificano quali porte esterne possono essere redirezionate agli "
++"indirizzi interni e porte."
++
++msgid "Action"
++msgstr "Azione"
++
++msgid "Active UPnP Redirects"
++msgstr "Attiva reindirizzamento UPnP"
++
++msgid "Advanced Settings"
++msgstr "Opzioni Avanzate"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr "Permetti l'aggiunta della mappatura solo agli indirizzi IP richiedenti"
++
++msgid "Announced model number"
++msgstr "Numero di modello annunciato"
++
++msgid "Announced serial number"
++msgstr "Numero seriale annunciato"
++
++msgid "Clean rules interval"
++msgstr "Cancella le regole"
++
++msgid "Clean rules threshold"
++msgstr "Pulisci le regole degli eventi"
++
++msgid "Client Address"
++msgstr "Indirizzo IP"
++
++msgid "Client Port"
++msgstr "Porta"
++
++msgid "Collecting data..."
++msgstr "Raccolgo i dati..."
++
++msgid "Comment"
++msgstr "Descrizione"
++
++msgid "Delete Redirect"
++msgstr "Cancella Mappatura"
++
++msgid "Device UUID"
++msgstr "UUID del dispositivo"
++
++msgid "Downlink"
++msgstr "Downlink"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "Abilita il protocollo NAT-PMP"
++
++msgid "Enable UPnP functionality"
++msgstr "Abilita il protocollo UPnP"
++
++msgid "Enable additional logging"
++msgstr "Abilita log addizionale"
++
++msgid "Enable secure mode"
++msgstr "Abilita la modalità sicura"
++
++msgid "External Port"
++msgstr "Porta Esterna"
++
++msgid "External ports"
++msgstr "Porte Esterne"
++
++msgid "General Settings"
++msgstr "Opzioni Generali"
++
++msgid "Internal addresses"
++msgstr "Indirizzi Interni"
++
++msgid "Internal ports"
++msgstr "Porte Interne"
++
++msgid "MiniUPnP ACLs"
++msgstr "MiniUPnP ACLs"
++
++msgid "MiniUPnP settings"
++msgstr "Opzioni di MiniUPnP"
++
++msgid "Notify interval"
++msgstr "Intervello di notifica"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Presentation URL"
++msgstr "URL di presentazione"
++
++msgid "Protocol"
++msgstr "Protocollo"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "Scrivi nel log di sistema le informazioni di extra debugging"
++
++msgid "Report system instead of daemon uptime"
++msgstr "Mostra l'uptime del sistema invece del demone"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "Avvia il servizo UPnP e NAT-PMP"
++
++msgid "There are no active redirects."
++msgstr "Non ci sono mappature attive."
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnP permette ai dispositivi nella rete locale di configurare "
++"automaticamente il router."
++
++msgid "UPnP lease file"
++msgstr "UPnP lease file"
++
++msgid "Universal Plug & Play"
++msgstr "Universal Plug & Play"
++
++msgid "Uplink"
++msgstr "Uplink"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Valori in KByte/s, (informativo)"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPnP permette ai dispositivi nella rete locale di configurare "
++#~ "automaticamente il router."
++
++#~ msgid "enable"
++#~ msgstr "abilita"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/ja/upnp.po b/feeds/luci/applications/luci-app-upnp/po/ja/upnp.po
+new file mode 100644
+index 0000000..ec9208d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/ja/upnp.po
+@@ -0,0 +1,160 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-10-05 17:27+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.6\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++"アクセス制御リスト(ACL) ã¯ã€ã©ã®å¤–部ãƒãƒ¼ãƒˆã‹ã‚‰ã©ã®å†…部アドレスåŠã³ãƒãƒ¼ãƒˆã¸ãƒª"
++"ダイレクトã™ã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚"
++
++msgid "Action"
++msgstr "動作"
++
++msgid "Active UPnP Redirects"
++msgstr "稼åƒä¸­ã®UPnPリダイレクト"
++
++msgid "Advanced Settings"
++msgstr "詳細設定"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++
++msgid "Announced model number"
++msgstr "通知ã™ã‚‹ãƒ¢ãƒ‡ãƒ«ç•ªå·"
++
++msgid "Announced serial number"
++msgstr "通知ã™ã‚‹ã‚·ãƒªã‚¢ãƒ«ç•ªå·"
++
++msgid "Clean rules interval"
++msgstr "ルール消去間隔"
++
++msgid "Clean rules threshold"
++msgstr "ルール消去ã—ãã„値"
++
++msgid "Client Address"
++msgstr "クライアント・アドレス"
++
++msgid "Client Port"
++msgstr "クライアント・ãƒãƒ¼ãƒˆ"
++
++msgid "Collecting data..."
++msgstr "データåŽé›†ä¸­ã§ã™..."
++
++msgid "Comment"
++msgstr "コメント"
++
++msgid "Delete Redirect"
++msgstr "リダイレクトを削除"
++
++msgid "Device UUID"
++msgstr "デãƒã‚¤ã‚¹ UUID"
++
++msgid "Downlink"
++msgstr "ダウンリンク"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "NAT-PMP機能を有効ã«ã™ã‚‹"
++
++msgid "Enable UPnP functionality"
++msgstr "UPnP機能を有効ã«ã™ã‚‹"
++
++msgid "Enable additional logging"
++msgstr "ログ機能を有効ã«ã™ã‚‹"
++
++msgid "Enable secure mode"
++msgstr "セキュアモードを有効ã«ã™ã‚‹"
++
++msgid "External Port"
++msgstr "外部ãƒãƒ¼ãƒˆ"
++
++msgid "External ports"
++msgstr "外部ãƒãƒ¼ãƒˆ"
++
++msgid "General Settings"
++msgstr "一般設定"
++
++msgid "Internal addresses"
++msgstr "内部アドレス"
++
++msgid "Internal ports"
++msgstr "内部ãƒãƒ¼ãƒˆ"
++
++msgid "MiniUPnP ACLs"
++msgstr "MiniUPnP アクセス制御リスト (ACL)"
++
++msgid "MiniUPnP settings"
++msgstr "MiniUPnP 設定"
++
++msgid "Notify interval"
++msgstr "通知間隔"
++
++msgid "Port"
++msgstr "ãƒãƒ¼ãƒˆ"
++
++msgid "Presentation URL"
++msgstr "プレゼンテーション URL"
++
++msgid "Protocol"
++msgstr "プロトコル"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "追加ã®ãƒ‡ãƒãƒƒã‚°æƒ…報をシステムログã¸æŒ¿å…¥ã™ã‚‹"
++
++msgid "Report system instead of daemon uptime"
++msgstr "サービスã®èµ·å‹•æ™‚é–“ã®ä»£ã‚ã‚Šã«ã‚·ã‚¹ãƒ†ãƒ ã®èµ·å‹•æ™‚間を使用ã™ã‚‹"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "UPnPåŠã³NAT-PMPサービスを開始ã™ã‚‹"
++
++msgid "There are no active redirects."
++msgstr "有効ãªãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã¯ã‚ã‚Šã¾ã›ã‚“。"
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnPを使用ã™ã‚‹ã“ã¨ã§ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒè‡ªå‹•çš„ã«ãƒ«ãƒ¼ã‚¿ã‚’"
++"構æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
++
++msgid "UPnP lease file"
++msgstr "UPnP リースファイル"
++
++msgid "Universal Plug & Play"
++msgstr "ユニãƒãƒ¼ã‚µãƒ« プラグ &#38; プレイ"
++
++msgid "Uplink"
++msgstr "アップリンク"
++
++msgid "Value in KByte/s, informational only"
++msgstr ""
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr "UPnPを使用ã™ã‚‹ã“ã¨ã§ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒè‡ªå‹•çš„ã«ãƒ«ãƒ¼ã‚¿ã‚’構æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
++
++#~ msgid "enable"
++#~ msgstr "有効"
++
++#~ msgid ""
++#~ "UPNP should only be enabled if absolutely necessary as it can result in "
++#~ "high security risks for your network."
++#~ msgstr ""
++#~ "UPnPã¯ã‚ãªãŸã®ä½¿ç”¨ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«å¯¾ã—ã¦ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒªã‚¹ã‚¯ãŒç”Ÿã˜ã‚‹å¯èƒ½"
++#~ "性ãŒã‚ã‚‹ãŸã‚ã€å¿…è¦ãªå ´åˆã®ã¿æœ‰åŠ¹ã«ã—ã¦ãã ã•ã„。"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/ms/upnp.po b/feeds/luci/applications/luci-app-upnp/po/ms/upnp.po
+new file mode 100644
+index 0000000..b4dce32
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/ms/upnp.po
+@@ -0,0 +1,135 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Active UPnP Redirects"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++
++msgid "Announced model number"
++msgstr ""
++
++msgid "Announced serial number"
++msgstr ""
++
++msgid "Clean rules interval"
++msgstr ""
++
++msgid "Clean rules threshold"
++msgstr ""
++
++msgid "Client Address"
++msgstr ""
++
++msgid "Client Port"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Delete Redirect"
++msgstr ""
++
++msgid "Device UUID"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Enable NAT-PMP functionality"
++msgstr ""
++
++msgid "Enable UPnP functionality"
++msgstr ""
++
++msgid "Enable additional logging"
++msgstr ""
++
++msgid "Enable secure mode"
++msgstr ""
++
++msgid "External Port"
++msgstr ""
++
++msgid "External ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Internal addresses"
++msgstr ""
++
++msgid "Internal ports"
++msgstr ""
++
++msgid "MiniUPnP ACLs"
++msgstr ""
++
++msgid "MiniUPnP settings"
++msgstr ""
++
++msgid "Notify interval"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Presentation URL"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Puts extra debugging information into the system log"
++msgstr ""
++
++msgid "Report system instead of daemon uptime"
++msgstr ""
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr ""
++
++msgid "There are no active redirects."
++msgstr ""
++
++msgid "UPnP"
++msgstr ""
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++
++msgid "UPnP lease file"
++msgstr ""
++
++msgid "Universal Plug & Play"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Value in KByte/s, informational only"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-upnp/po/no/upnp.po b/feeds/luci/applications/luci-app-upnp/po/no/upnp.po
+new file mode 100644
+index 0000000..d528aa5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/no/upnp.po
+@@ -0,0 +1,146 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++"ACL angir hvilke eksterne porter som kan bli viderekoblet, og til hvilke "
++"interne adresser og porter."
++
++msgid "Action"
++msgstr "Handling"
++
++msgid "Active UPnP Redirects"
++msgstr "Aktive UPnP Viderekoblinger"
++
++msgid "Advanced Settings"
++msgstr "Avanserte Innstillinger"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr "Tillat videkobling kun til IP adresser som ber om det"
++
++msgid "Announced model number"
++msgstr "Annonsert modellnummer"
++
++msgid "Announced serial number"
++msgstr "Annonsert serienummer"
++
++msgid "Clean rules interval"
++msgstr "Nullstill UPnP Viderekoblinger intervall"
++
++msgid "Clean rules threshold"
++msgstr "Nullstill UPnP terskel"
++
++msgid "Client Address"
++msgstr "Klient adresse"
++
++msgid "Client Port"
++msgstr "Klient port"
++
++msgid "Collecting data..."
++msgstr "Henter data..."
++
++msgid "Comment"
++msgstr "Kommentar"
++
++msgid "Delete Redirect"
++msgstr "Fjern Viderekobling"
++
++msgid "Device UUID"
++msgstr "Enhet UUID"
++
++msgid "Downlink"
++msgstr "Nedlinje"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "Aktiver NAT-PMP funksjonalitet"
++
++msgid "Enable UPnP functionality"
++msgstr "Aktiver UPnP funksjonalitet"
++
++msgid "Enable additional logging"
++msgstr "Aktiver tilleggs logging"
++
++msgid "Enable secure mode"
++msgstr "Aktiver sikker modus"
++
++msgid "External Port"
++msgstr "Ekstern port"
++
++msgid "External ports"
++msgstr "Eksterne porter"
++
++msgid "General Settings"
++msgstr "Generelle Innstillinger"
++
++msgid "Internal addresses"
++msgstr "Interne adresser"
++
++msgid "Internal ports"
++msgstr "Interne porter"
++
++msgid "MiniUPnP ACLs"
++msgstr "MiniUPnP ACL'er"
++
++msgid "MiniUPnP settings"
++msgstr "MiniUPnP Innstillinger"
++
++msgid "Notify interval"
++msgstr "Informasjons intervall"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Presentation URL"
++msgstr "Presentasjon URL"
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "Setter ekstra debugging informasjon i systemloggen"
++
++msgid "Report system instead of daemon uptime"
++msgstr "Rapporter systemets oppetid istedenfor daemon oppetid"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "Start UPnP og NAT-PMP tjenesten"
++
++msgid "There are no active redirects."
++msgstr "Det finnes ingen aktive viderekoblinger"
++
++msgid "UPnP"
++msgstr ""
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnP gjør at klientene i det lokale nettverket automatisk kan konfigurere "
++"ruteren."
++
++msgid "UPnP lease file"
++msgstr "UPnP leie fil"
++
++msgid "Universal Plug & Play"
++msgstr "Universal Plug & Play"
++
++msgid "Uplink"
++msgstr "Opplinje"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Verdi i KByte/sek, kun for informasjon"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPnP gjør at klientene i det lokale nettverket automatisk kan konfigurere "
++#~ "ruteren."
++
++#~ msgid "enable"
++#~ msgstr "Aktiver"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/pl/upnp.po b/feeds/luci/applications/luci-app-upnp/po/pl/upnp.po
+new file mode 100644
+index 0000000..ab78180
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/pl/upnp.po
+@@ -0,0 +1,153 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-02 19:28+0200\n"
++"Last-Translator: obsy <cezary@eko.one.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 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 ""
++"Listy kontroli dostępu (ang. ACL) określają jakie porty mogą być "
++"przekierowane do jakich wewnętrznych adresów i portów"
++
++msgid "Action"
++msgstr "Akcja"
++
++msgid "Active UPnP Redirects"
++msgstr "Aktywne przekierowania UPnP"
++
++msgid "Advanced Settings"
++msgstr "Ustawienia zaawansowane"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr "Zezwól na dodawanie przekierowań tylko do odpytujących adresów IP"
++
++msgid "Announced model number"
++msgstr "Rozgłaszany nr modelu"
++
++msgid "Announced serial number"
++msgstr "rozgłaszany nr seryjny"
++
++msgid "Clean rules interval"
++msgstr "Interwał czyszczenia reguł"
++
++msgid "Clean rules threshold"
++msgstr "Próg czyszczenia reguł"
++
++msgid "Client Address"
++msgstr "Adres klienta"
++
++msgid "Client Port"
++msgstr "Port klienta"
++
++msgid "Collecting data..."
++msgstr "Zbieranie danych..."
++
++msgid "Comment"
++msgstr "Komentarz"
++
++msgid "Delete Redirect"
++msgstr "Usuń przekierowanie"
++
++msgid "Device UUID"
++msgstr "UUID urzÄ…dzenia"
++
++msgid "Downlink"
++msgstr "Downlink"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "Włącz funkcjonalność NAT-PMP"
++
++msgid "Enable UPnP functionality"
++msgstr "Włącz funkcjonalność UPnP"
++
++msgid "Enable additional logging"
++msgstr "WÅ‚Ä…cz rozszerzone raportowanie"
++
++msgid "Enable secure mode"
++msgstr "WÅ‚Ä…cz tryb bezpieczny"
++
++msgid "External Port"
++msgstr "Port zewnętrzny"
++
++msgid "External ports"
++msgstr "Porty zewnętrzne"
++
++msgid "General Settings"
++msgstr "Ustawienia główne"
++
++msgid "Internal addresses"
++msgstr "Adresy wewnętrzne"
++
++msgid "Internal ports"
++msgstr "Porty wewnętrzne"
++
++msgid "MiniUPnP ACLs"
++msgstr "Listy kontroli dostępu MiniUPnP"
++
++msgid "MiniUPnP settings"
++msgstr "Ustawienia MiniUPnP"
++
++msgid "Notify interval"
++msgstr "Interwał powiadamiania"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Presentation URL"
++msgstr "Przedstawiany URL"
++
++msgid "Protocol"
++msgstr "Protokół"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "Dodaje dodatkowe informacje debugowania do loga systemowego"
++
++msgid "Report system instead of daemon uptime"
++msgstr "Zgłaszaj czas pracy systemu zamiast czas pracy usługi"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "Uruchom usługi UPnP i NAT-PMP"
++
++msgid "There are no active redirects."
++msgstr "Nie ma aktywnych przekierowań"
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnP umożliwia klientom w sieci lokalnej automatyczne konfigurowanie routera."
++
++msgid "UPnP lease file"
++msgstr "Plik dzierżawy UPnP"
++
++msgid "Universal Plug & Play"
++msgstr "Universal Plug & Play"
++
++msgid "Uplink"
++msgstr "Uplink"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Wartość w KBajt/s, tylko informacyjnie"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPnP umożliwia klientom w sieci lokalnej automatyczne konfigurowanie "
++#~ "routera."
++
++#~ msgid "enable"
++#~ msgstr "enable"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/pt-br/upnp.po b/feeds/luci/applications/luci-app-upnp/po/pt-br/upnp.po
+new file mode 100644
+index 0000000..c16aa11
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/pt-br/upnp.po
+@@ -0,0 +1,166 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2011-10-18 22:17+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++"ACLs especificam quais portas externas podem ser redirecionadas para quais "
++"endereços e portas internos"
++
++msgid "Action"
++msgstr "Ação"
++
++msgid "Active UPnP Redirects"
++msgstr "Redirecionamentos UPnP Ativos"
++
++msgid "Advanced Settings"
++msgstr "Configurações Avançadas"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++"Permite adicionar encaminhamento apenas para o endereço IP requisitante"
++
++msgid "Announced model number"
++msgstr "Número do modelo anunciado"
++
++msgid "Announced serial number"
++msgstr "Número serial anunciado"
++
++msgid "Clean rules interval"
++msgstr "Intervalo de limpeza das regras"
++
++msgid "Clean rules threshold"
++msgstr "Limiar de limpeza das regras"
++
++msgid "Client Address"
++msgstr "Endereço do cliente"
++
++msgid "Client Port"
++msgstr "Porta do Cliente"
++
++msgid "Collecting data..."
++msgstr "Coletando dados..."
++
++msgid "Comment"
++msgstr "Comentário"
++
++msgid "Delete Redirect"
++msgstr "Apague o Redirecionamento"
++
++msgid "Device UUID"
++msgstr "UUID do Dispositivo"
++
++msgid "Downlink"
++msgstr "Velocidade de recebimento do enlace (downlink)"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "Habilite a função NAT-PMP"
++
++msgid "Enable UPnP functionality"
++msgstr "Habilite a função UPnP"
++
++msgid "Enable additional logging"
++msgstr "Habilite registros adicionais"
++
++msgid "Enable secure mode"
++msgstr "Habilite modo seguro"
++
++msgid "External Port"
++msgstr "Porta Externa"
++
++msgid "External ports"
++msgstr "Portas Externas"
++
++msgid "General Settings"
++msgstr "Configurações Gerais"
++
++msgid "Internal addresses"
++msgstr "Endereços internos"
++
++msgid "Internal ports"
++msgstr "Portas internas"
++
++msgid "MiniUPnP ACLs"
++msgstr "ACLs do MiniUPnP"
++
++msgid "MiniUPnP settings"
++msgstr "Configurações do MiniUPnP"
++
++msgid "Notify interval"
++msgstr "Intervalo de notificação"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Presentation URL"
++msgstr "URL de apresentação"
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "Envie informações extra de depuração ao registro do sistema"
++
++msgid "Report system instead of daemon uptime"
++msgstr "Informe o tempo de vida do sistema ao invés do tempo do processo"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "Dispare os serviços de UPnP e NAT-PMP"
++
++msgid "There are no active redirects."
++msgstr "Não existe redirecionamentos ativos."
++
++msgid "UPnP"
++msgstr ""
++"<abbr title=\"Universal Plug and Play, Plugue e Use Universal\">UPnP</abbr>"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnP permite os clientes da rede local configurem automaticamente o roteador."
++
++msgid "UPnP lease file"
++msgstr "Arquivo de concessão do UPnP"
++
++msgid "Universal Plug & Play"
++msgstr "Plug & Play Universal"
++
++msgid "Uplink"
++msgstr "Velocidade de envio do enlace (uplink)"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Valores em KByte/s, apenas informativas"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPnP permite os clientes da rede local configurem automaticamente o "
++#~ "roteador."
++
++#~ msgid "enable"
++#~ msgstr "habilitar"
++
++#~ msgid "Log output"
++#~ msgstr "Log de saída"
++
++#~ msgid ""
++#~ "UPNP should only be enabled if absolutely necessary as it can result in "
++#~ "high security risks for your network."
++#~ msgstr ""
++#~ "O UPNP deve ser ativado apenas se for absolutamente necessário, pois ele "
++#~ "pode resultar em elevados riscos de segurança para sua rede."
+diff --git a/feeds/luci/applications/luci-app-upnp/po/pt/upnp.po b/feeds/luci/applications/luci-app-upnp/po/pt/upnp.po
+new file mode 100644
+index 0000000..1d001b6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/pt/upnp.po
+@@ -0,0 +1,157 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Active UPnP Redirects"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++
++msgid "Announced model number"
++msgstr ""
++
++msgid "Announced serial number"
++msgstr ""
++
++msgid "Clean rules interval"
++msgstr ""
++
++msgid "Clean rules threshold"
++msgstr ""
++
++msgid "Client Address"
++msgstr ""
++
++msgid "Client Port"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Delete Redirect"
++msgstr ""
++
++msgid "Device UUID"
++msgstr ""
++
++msgid "Downlink"
++msgstr "Link para download"
++
++msgid "Enable NAT-PMP functionality"
++msgstr ""
++
++msgid "Enable UPnP functionality"
++msgstr ""
++
++msgid "Enable additional logging"
++msgstr ""
++
++msgid "Enable secure mode"
++msgstr "Enable secure mode"
++
++msgid "External Port"
++msgstr ""
++
++msgid "External ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Internal addresses"
++msgstr ""
++
++msgid "Internal ports"
++msgstr ""
++
++msgid "MiniUPnP ACLs"
++msgstr ""
++
++msgid "MiniUPnP settings"
++msgstr ""
++
++msgid "Notify interval"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Presentation URL"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Puts extra debugging information into the system log"
++msgstr ""
++
++msgid "Report system instead of daemon uptime"
++msgstr ""
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr ""
++
++msgid "There are no active redirects."
++msgstr ""
++
++msgid "UPnP"
++msgstr ""
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++
++msgid "UPnP lease file"
++msgstr ""
++
++msgid "Universal Plug & Play"
++msgstr "Plug & Play Universal"
++
++msgid "Uplink"
++msgstr "Link para Upload"
++
++msgid "Value in KByte/s, informational only"
++msgstr ""
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPNP permite os clientes da rede local automaticamente configurar o "
++#~ "roteador."
++
++#~ msgid "Log output"
++#~ msgstr "Log de saída"
++
++#~ msgid ""
++#~ "UPNP should only be enabled if absolutely necessary as it can result in "
++#~ "high security risks for your network."
++#~ msgstr ""
++#~ "O UPNP deve ser ativado apenas se for absolutamente necessário, pois ele "
++#~ "pode resultar em elevados riscos de segurança para sua rede."
+diff --git a/feeds/luci/applications/luci-app-upnp/po/ro/upnp.po b/feeds/luci/applications/luci-app-upnp/po/ro/upnp.po
+new file mode 100644
+index 0000000..f9c9500
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/ro/upnp.po
+@@ -0,0 +1,152 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-09-25 19:15+0200\n"
++"Last-Translator: Mihai <WyRwSyK@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && 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 ""
++"ACL-urile specifica porturile externe care pot fi redirectate si spre ce "
++"adrese si porturi interne"
++
++msgid "Action"
++msgstr "Actiune"
++
++msgid "Active UPnP Redirects"
++msgstr "Redirecturi active UPnP"
++
++msgid "Advanced Settings"
++msgstr "Setari avansate"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr "Permite adaugarea forward-urilor doar catre adresele ip solicitante"
++
++msgid "Announced model number"
++msgstr "Numar de model anuntat"
++
++msgid "Announced serial number"
++msgstr "Numar serial anuntat"
++
++msgid "Clean rules interval"
++msgstr "Intervalul de curatare reguli"
++
++msgid "Clean rules threshold"
++msgstr "Limita de curatare reguli"
++
++msgid "Client Address"
++msgstr "Adresa client"
++
++msgid "Client Port"
++msgstr "Port client"
++
++msgid "Collecting data..."
++msgstr "Colecteaza date.."
++
++msgid "Comment"
++msgstr "Comentariu"
++
++msgid "Delete Redirect"
++msgstr "Sterge redirect"
++
++msgid "Device UUID"
++msgstr "UUID al dispozitivului"
++
++msgid "Downlink"
++msgstr "Downlink"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "Activeaza functionalitatea NAT-PMP"
++
++msgid "Enable UPnP functionality"
++msgstr "Activeaza functionalitatea UPnP"
++
++msgid "Enable additional logging"
++msgstr "Activeaza log-area aditionala"
++
++msgid "Enable secure mode"
++msgstr "Activeaza modul securizat"
++
++msgid "External Port"
++msgstr "Port extern"
++
++msgid "External ports"
++msgstr "Porturi externe"
++
++msgid "General Settings"
++msgstr "Setari generale"
++
++msgid "Internal addresses"
++msgstr "Adrese interne"
++
++msgid "Internal ports"
++msgstr "Porturi interne"
++
++msgid "MiniUPnP ACLs"
++msgstr "Liste de acces mini UPnP"
++
++msgid "MiniUPnP settings"
++msgstr "Setari mini UPnP"
++
++msgid "Notify interval"
++msgstr "Interval de notificare"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Presentation URL"
++msgstr "Adresa de prezentare"
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "Pune informatii utile suplimentare in log-ul de sistem"
++
++msgid "Report system instead of daemon uptime"
++msgstr "Raporteaza timpul de functionare de sistem in loc de serviciu"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "Porneste UPnP si serviciul NAT-PMP"
++
++msgid "There are no active redirects."
++msgstr "Nu exista redirecturi active."
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPNP permite clientulor din reteaua locala sa configureze automat routerul."
++
++msgid "UPnP lease file"
++msgstr "Fisierul de conexiuni UPnP"
++
++msgid "Universal Plug & Play"
++msgstr "Universal Plug & Play"
++
++msgid "Uplink"
++msgstr "Uplink"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Valorea in KOcteti/s , doar informational"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPNP permite clientulor din reteaua locala sa configureze automat routerul."
++
++#~ msgid "enable"
++#~ msgstr "activeaza"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/ru/upnp.po b/feeds/luci/applications/luci-app-upnp/po/ru/upnp.po
+new file mode 100644
+index 0000000..30b94ce
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/ru/upnp.po
+@@ -0,0 +1,158 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: upnp\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-08-15 15:20+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++"СпиÑок доÑтупа определÑет, какие внешние порты могут быть перенаправлены на "
++"внутренние адреÑа и порты"
++
++msgid "Action"
++msgstr "ДейÑтвие"
++
++msgid "Active UPnP Redirects"
++msgstr "Ðктивные UPnP-переадреÑации"
++
++msgid "Advanced Settings"
++msgstr "РаÑширенные наÑтройки"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr "Разрешить перенаправление только Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ¸Ð²Ð°ÑŽÑ‰Ð¸Ñ… IP-адреÑов"
++
++msgid "Announced model number"
++msgstr "Ðомер модели"
++
++msgid "Announced serial number"
++msgstr "Серийный номер"
++
++msgid "Clean rules interval"
++msgstr "Интервал очиÑтки правил"
++
++msgid "Clean rules threshold"
++msgstr "Порог очиÑтки правил"
++
++msgid "Client Address"
++msgstr "ÐÐ´Ñ€ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°"
++
++msgid "Client Port"
++msgstr "Порт клиента"
++
++msgid "Collecting data..."
++msgstr "Сбор данных..."
++
++msgid "Comment"
++msgstr "Комментарий"
++
++msgid "Delete Redirect"
++msgstr "Удалить переадреÑацию"
++
++msgid "Device UUID"
++msgstr "UUID уÑтройÑтва"
++
++msgid "Downlink"
++msgstr "ÐиÑходÑщий канал"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "Включить NAT-PMP"
++
++msgid "Enable UPnP functionality"
++msgstr "Включить UPnP"
++
++msgid "Enable additional logging"
++msgstr "Включить дополнительное журналирование"
++
++msgid "Enable secure mode"
++msgstr "ИÑпользовать защищённый режим"
++
++msgid "External Port"
++msgstr "Внешний порт"
++
++msgid "External ports"
++msgstr "Внешние порты"
++
++msgid "General Settings"
++msgstr "Общие наÑтройки"
++
++msgid "Internal addresses"
++msgstr "Внутренние адреÑа"
++
++msgid "Internal ports"
++msgstr "Внутренние порты"
++
++msgid "MiniUPnP ACLs"
++msgstr "СпиÑок доÑтупа MiniUPnP"
++
++msgid "MiniUPnP settings"
++msgstr "ÐаÑтройки MiniUPnP"
++
++msgid "Notify interval"
++msgstr "Интервал уведомлениÑ"
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Presentation URL"
++msgstr "URL предÑтавлениÑ"
++
++msgid "Protocol"
++msgstr "Протокол"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "ДобавлÑÑ‚ÑŒ дополнительную отладочную информацию в ÑиÑтемный журнал"
++
++msgid "Report system instead of daemon uptime"
++msgstr "Сообщать Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ ÑиÑтемы вмеÑто ÑервиÑа"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "ЗапуÑтить Ñлужбы UPnP и NAT-PMP"
++
++msgid "There are no active redirects."
++msgstr "Ðктивные переадреÑации отÑутÑтвуют."
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnP позволÑет клиентам в локальной Ñети автоматичеÑки наÑтраивать "
++"маршрутизатор."
++
++msgid "UPnP lease file"
++msgstr "Файл аренды UPnP"
++
++msgid "Universal Plug & Play"
++msgstr "Universal Plug & Play"
++
++msgid "Uplink"
++msgstr "ВоÑходÑщий канал"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Значение в КБ/Ñ, только Ð´Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸"
++
++# Used in upnpmini.lua, which is marked broken, thus can be removed
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPnP позволÑет клиентам в локальной Ñети автоматичеÑки наÑтраивать "
++#~ "маршрутизатор."
++
++#~ msgid "enable"
++#~ msgstr "включить"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/sk/upnp.po b/feeds/luci/applications/luci-app-upnp/po/sk/upnp.po
+new file mode 100644
+index 0000000..c725333
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/sk/upnp.po
+@@ -0,0 +1,136 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Active UPnP Redirects"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++
++msgid "Announced model number"
++msgstr ""
++
++msgid "Announced serial number"
++msgstr ""
++
++msgid "Clean rules interval"
++msgstr ""
++
++msgid "Clean rules threshold"
++msgstr ""
++
++msgid "Client Address"
++msgstr ""
++
++msgid "Client Port"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Delete Redirect"
++msgstr ""
++
++msgid "Device UUID"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Enable NAT-PMP functionality"
++msgstr ""
++
++msgid "Enable UPnP functionality"
++msgstr ""
++
++msgid "Enable additional logging"
++msgstr ""
++
++msgid "Enable secure mode"
++msgstr ""
++
++msgid "External Port"
++msgstr ""
++
++msgid "External ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Internal addresses"
++msgstr ""
++
++msgid "Internal ports"
++msgstr ""
++
++msgid "MiniUPnP ACLs"
++msgstr ""
++
++msgid "MiniUPnP settings"
++msgstr ""
++
++msgid "Notify interval"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Presentation URL"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Puts extra debugging information into the system log"
++msgstr ""
++
++msgid "Report system instead of daemon uptime"
++msgstr ""
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr ""
++
++msgid "There are no active redirects."
++msgstr ""
++
++msgid "UPnP"
++msgstr ""
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++
++msgid "UPnP lease file"
++msgstr ""
++
++msgid "Universal Plug & Play"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Value in KByte/s, informational only"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-upnp/po/sv/upnp.po b/feeds/luci/applications/luci-app-upnp/po/sv/upnp.po
+new file mode 100644
+index 0000000..f0b564b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/sv/upnp.po
+@@ -0,0 +1,137 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Active UPnP Redirects"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++
++msgid "Announced model number"
++msgstr ""
++
++msgid "Announced serial number"
++msgstr ""
++
++msgid "Clean rules interval"
++msgstr ""
++
++msgid "Clean rules threshold"
++msgstr ""
++
++msgid "Client Address"
++msgstr ""
++
++msgid "Client Port"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Delete Redirect"
++msgstr ""
++
++msgid "Device UUID"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Enable NAT-PMP functionality"
++msgstr ""
++
++msgid "Enable UPnP functionality"
++msgstr ""
++
++msgid "Enable additional logging"
++msgstr ""
++
++msgid "Enable secure mode"
++msgstr ""
++
++msgid "External Port"
++msgstr ""
++
++msgid "External ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Internal addresses"
++msgstr ""
++
++msgid "Internal ports"
++msgstr ""
++
++msgid "MiniUPnP ACLs"
++msgstr ""
++
++msgid "MiniUPnP settings"
++msgstr ""
++
++msgid "Notify interval"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Presentation URL"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Puts extra debugging information into the system log"
++msgstr ""
++
++msgid "Report system instead of daemon uptime"
++msgstr ""
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr ""
++
++msgid "There are no active redirects."
++msgstr ""
++
++msgid "UPnP"
++msgstr ""
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++
++msgid "UPnP lease file"
++msgstr ""
++
++msgid "Universal Plug & Play"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Value in KByte/s, informational only"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-upnp/po/templates/upnp.pot b/feeds/luci/applications/luci-app-upnp/po/templates/upnp.pot
+new file mode 100644
+index 0000000..ae390c4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/templates/upnp.pot
+@@ -0,0 +1,129 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Active UPnP Redirects"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++
++msgid "Announced model number"
++msgstr ""
++
++msgid "Announced serial number"
++msgstr ""
++
++msgid "Clean rules interval"
++msgstr ""
++
++msgid "Clean rules threshold"
++msgstr ""
++
++msgid "Client Address"
++msgstr ""
++
++msgid "Client Port"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Delete Redirect"
++msgstr ""
++
++msgid "Device UUID"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Enable NAT-PMP functionality"
++msgstr ""
++
++msgid "Enable UPnP functionality"
++msgstr ""
++
++msgid "Enable additional logging"
++msgstr ""
++
++msgid "Enable secure mode"
++msgstr ""
++
++msgid "External Port"
++msgstr ""
++
++msgid "External ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Internal addresses"
++msgstr ""
++
++msgid "Internal ports"
++msgstr ""
++
++msgid "MiniUPnP ACLs"
++msgstr ""
++
++msgid "MiniUPnP settings"
++msgstr ""
++
++msgid "Notify interval"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Presentation URL"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Puts extra debugging information into the system log"
++msgstr ""
++
++msgid "Report system instead of daemon uptime"
++msgstr ""
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr ""
++
++msgid "There are no active redirects."
++msgstr ""
++
++msgid "UPnP"
++msgstr ""
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++
++msgid "UPnP lease file"
++msgstr ""
++
++msgid "Universal Plug & Play"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Value in KByte/s, informational only"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-upnp/po/tr/upnp.po b/feeds/luci/applications/luci-app-upnp/po/tr/upnp.po
+new file mode 100644
+index 0000000..cff3be2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/tr/upnp.po
+@@ -0,0 +1,136 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Active UPnP Redirects"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++
++msgid "Announced model number"
++msgstr ""
++
++msgid "Announced serial number"
++msgstr ""
++
++msgid "Clean rules interval"
++msgstr ""
++
++msgid "Clean rules threshold"
++msgstr ""
++
++msgid "Client Address"
++msgstr ""
++
++msgid "Client Port"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Delete Redirect"
++msgstr ""
++
++msgid "Device UUID"
++msgstr ""
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Enable NAT-PMP functionality"
++msgstr ""
++
++msgid "Enable UPnP functionality"
++msgstr ""
++
++msgid "Enable additional logging"
++msgstr ""
++
++msgid "Enable secure mode"
++msgstr ""
++
++msgid "External Port"
++msgstr ""
++
++msgid "External ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Internal addresses"
++msgstr ""
++
++msgid "Internal ports"
++msgstr ""
++
++msgid "MiniUPnP ACLs"
++msgstr ""
++
++msgid "MiniUPnP settings"
++msgstr ""
++
++msgid "Notify interval"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Presentation URL"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Puts extra debugging information into the system log"
++msgstr ""
++
++msgid "Report system instead of daemon uptime"
++msgstr ""
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr ""
++
++msgid "There are no active redirects."
++msgstr ""
++
++msgid "UPnP"
++msgstr ""
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++
++msgid "UPnP lease file"
++msgstr ""
++
++msgid "Universal Plug & Play"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Value in KByte/s, informational only"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-upnp/po/uk/upnp.po b/feeds/luci/applications/luci-app-upnp/po/uk/upnp.po
+new file mode 100644
+index 0000000..93afd22
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/uk/upnp.po
+@@ -0,0 +1,155 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-05-26 19:26+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 ""
++"СпиÑок кнтролю доÑтупу визначає, Ñкі зовнішні порти можуть бути "
++"переÑпрÑмовані на Ñкі внутрішні адреÑи й порти"
++
++msgid "Action"
++msgstr "ДіÑ"
++
++msgid "Active UPnP Redirects"
++msgstr "Ðктивні переÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ UPnP"
++
++msgid "Advanced Settings"
++msgstr "Додаткові параметри"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++"Дозволити Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ Ð´Ð»Ñ IP-адреÑ, що надÑилають запити"
++
++msgid "Announced model number"
++msgstr "Оголошуваний номер моделі"
++
++msgid "Announced serial number"
++msgstr "Оголошуваний Ñерійний номер"
++
++msgid "Clean rules interval"
++msgstr "Інтервал Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»"
++
++msgid "Clean rules threshold"
++msgstr "Поріг Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»"
++
++msgid "Client Address"
++msgstr "ÐдреÑа клієнта"
++
++msgid "Client Port"
++msgstr "Порт клієнта"
++
++msgid "Collecting data..."
++msgstr "Ð—Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…..."
++
++msgid "Comment"
++msgstr "Коментар"
++
++msgid "Delete Redirect"
++msgstr "Видалити переÑпрÑмуваннÑ"
++
++msgid "Device UUID"
++msgstr "UUID приÑтрою"
++
++msgid "Downlink"
++msgstr "Ðизхідний канал"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "Увімкнути функцію NAT-PMP"
++
++msgid "Enable UPnP functionality"
++msgstr "Увімкнути функцію UPnP"
++
++msgid "Enable additional logging"
++msgstr "Увімкнути додаткове журналюваннÑ"
++
++msgid "Enable secure mode"
++msgstr "Увімкнути захищений режим"
++
++msgid "External Port"
++msgstr "Зовнішній порт"
++
++msgid "External ports"
++msgstr "Зовнішні порти"
++
++msgid "General Settings"
++msgstr "Загальні наÑтройки"
++
++msgid "Internal addresses"
++msgstr "Внутрішні адреÑи"
++
++msgid "Internal ports"
++msgstr "Внутрішні порти"
++
++msgid "MiniUPnP ACLs"
++msgstr "СпиÑок контролю доÑтупу MiniUPnP"
++
++msgid "MiniUPnP settings"
++msgstr "ÐаÑтройки MiniUPnP"
++
++msgid "Notify interval"
++msgstr "Інтервал ÑповіщеннÑ"
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Presentation URL"
++msgstr "URL предÑтавлÑннÑ"
++
++msgid "Protocol"
++msgstr "Протокол"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "Включати додаткові відомоÑÑ‚Ñ– Ð´Ð»Ñ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ ÑиÑтемного журналу"
++
++msgid "Report system instead of daemon uptime"
++msgstr "ПовідомлÑти Ñ‡Ð°Ñ Ð±ÐµÐ·Ð²Ñ–Ð´Ð¼Ð¾Ð²Ð½Ð¾Ñ— роботи ÑиÑтеми, а не ÑервіÑу"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "ЗапуÑкати Ñлужби UPnP та NAT-PMP"
++
++msgid "There are no active redirects."
++msgstr "Ðемає активних переÑпрÑмувань"
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++"UPnP надає клієнтам у локальній мережі змогу автоматично наÑтроювати "
++"маршрутизатор."
++
++msgid "UPnP lease file"
++msgstr "Файл оренд UPnP"
++
++msgid "Universal Plug & Play"
++msgstr "Universal Plug & Play"
++
++msgid "Uplink"
++msgstr "ВиÑхідний канал"
++
++msgid "Value in KByte/s, informational only"
++msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (КБ/Ñ) тільки Ð´Ð»Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ—"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPnP надає клієнтам у локальній мережі змогу автоматично наÑтроювати "
++#~ "маршрутизатор."
++
++#~ msgid "enable"
++#~ msgstr "Увімкнути"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/vi/upnp.po b/feeds/luci/applications/luci-app-upnp/po/vi/upnp.po
+new file mode 100644
+index 0000000..5f95499
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/vi/upnp.po
+@@ -0,0 +1,158 @@
++# upnp.pot
++# generated from ./applications/luci-upnp/luasrc/i18n/upnp.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:59+0200\n"
++"PO-Revision-Date: 2009-08-13 04:00+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Active UPnP Redirects"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr ""
++
++msgid "Announced model number"
++msgstr ""
++
++msgid "Announced serial number"
++msgstr ""
++
++msgid "Clean rules interval"
++msgstr ""
++
++msgid "Clean rules threshold"
++msgstr ""
++
++msgid "Client Address"
++msgstr ""
++
++msgid "Client Port"
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Comment"
++msgstr ""
++
++msgid "Delete Redirect"
++msgstr ""
++
++msgid "Device UUID"
++msgstr ""
++
++msgid "Downlink"
++msgstr "Downlink"
++
++msgid "Enable NAT-PMP functionality"
++msgstr ""
++
++msgid "Enable UPnP functionality"
++msgstr ""
++
++msgid "Enable additional logging"
++msgstr ""
++
++msgid "Enable secure mode"
++msgstr "Kích hoạt chế độ an toàn"
++
++msgid "External Port"
++msgstr ""
++
++msgid "External ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "Internal addresses"
++msgstr ""
++
++msgid "Internal ports"
++msgstr ""
++
++msgid "MiniUPnP ACLs"
++msgstr ""
++
++msgid "MiniUPnP settings"
++msgstr ""
++
++msgid "Notify interval"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Presentation URL"
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Puts extra debugging information into the system log"
++msgstr ""
++
++msgid "Report system instead of daemon uptime"
++msgstr ""
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr ""
++
++msgid "There are no active redirects."
++msgstr ""
++
++msgid "UPnP"
++msgstr ""
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr ""
++
++msgid "UPnP lease file"
++msgstr ""
++
++msgid "Universal Plug & Play"
++msgstr "Universal Plug & Play"
++
++msgid "Uplink"
++msgstr "Uplink"
++
++msgid "Value in KByte/s, informational only"
++msgstr ""
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr ""
++#~ "UPNP cho phép đối tượng trong mạng địa phương tự động định dạng bộ định "
++#~ "tuyến"
++
++#~ msgid "Log output"
++#~ msgstr "Log output"
++
++#~ msgid ""
++#~ "UPNP should only be enabled if absolutely necessary as it can result in "
++#~ "high security risks for your network."
++#~ msgstr ""
++#~ "Chỉ nên kích hoạt UPNP khi thật cần thiết vì nó có thể gây nguy hiểm cho "
++#~ "mạng lưới"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/zh-cn/upnp.po b/feeds/luci/applications/luci-app-upnp/po/zh-cn/upnp.po
+new file mode 100644
+index 0000000..693bbc1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/zh-cn/upnp.po
+@@ -0,0 +1,149 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2012-09-03 18:02+0200\n"
++"Last-Translator: nKsyn <e.nksyn@gmail.com>\n"
++"Language-Team: QQ Group 75543259 <axishero@foxmail.com>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr "指定外部端å£çš„ACLå¯èƒ½ä¼šè¢«é‡å®šå‘至æŸäº›å†…部地å€åŠç«¯å£"
++
++msgid "Action"
++msgstr "动作"
++
++msgid "Active UPnP Redirects"
++msgstr "活动的UPnPé‡å®šå‘"
++
++msgid "Advanced Settings"
++msgstr "高级设置"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr "å…许添加åªè½¬å‘给请求的IP地å€(当å¯ç”¨æ—¶ï¼ŒUPnP的客户å¯ä»¥åªè½¬å‘到其IP)"
++
++msgid "Announced model number"
++msgstr "公布的型å·"
++
++msgid "Announced serial number"
++msgstr "公布的åºåˆ—å·"
++
++msgid "Clean rules interval"
++msgstr "定时自动清除无效规则"
++
++msgid "Clean rules threshold"
++msgstr "å¯åŠ¨æ—¶æ¸…除端å£è½¬å‘"
++
++msgid "Client Address"
++msgstr "客户端地å€"
++
++msgid "Client Port"
++msgstr "客户端端å£"
++
++msgid "Collecting data..."
++msgstr "正在收集数æ®"
++
++msgid "Comment"
++msgstr "备注"
++
++msgid "Delete Redirect"
++msgstr "删除转å‘规则"
++
++msgid "Device UUID"
++msgstr "设备UUID"
++
++msgid "Downlink"
++msgstr "下行速率"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "å¯ç”¨NAT-PMP功能"
++
++msgid "Enable UPnP functionality"
++msgstr "å¯ç”¨UPnP功能"
++
++msgid "Enable additional logging"
++msgstr "å¯ç”¨é¢å¤–的日志记录"
++
++msgid "Enable secure mode"
++msgstr "å¯ç”¨å®‰å…¨æ¨¡å¼"
++
++msgid "External Port"
++msgstr "外部端å£"
++
++msgid "External ports"
++msgstr "外部端å£"
++
++msgid "General Settings"
++msgstr "一般设置"
++
++msgid "Internal addresses"
++msgstr "内部地å€"
++
++msgid "Internal ports"
++msgstr "内部端å£"
++
++msgid "MiniUPnP ACLs"
++msgstr "MiniUPnPçš„ACL"
++
++msgid "MiniUPnP settings"
++msgstr "MiniUPnP设置"
++
++msgid "Notify interval"
++msgstr "警报间隔"
++
++msgid "Port"
++msgstr "端å£"
++
++msgid "Presentation URL"
++msgstr "显示URL"
++
++msgid "Protocol"
++msgstr "åè®®"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "æå–é¢å¤–的调试信æ¯è‡³ç³»ç»Ÿæ—¥å¿—"
++
++msgid "Report system instead of daemon uptime"
++msgstr "用系统è¿è¡Œæ—¶é—´ä»£æ›¿è¿›ç¨‹è¿è¡Œæ—¶é—´"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "å¯åŠ¨UPnP与NAT-PMPæœåŠ¡"
++
++msgid "There are no active redirects."
++msgstr "没有活动的é‡å®šå‘"
++
++msgid "UPnP"
++msgstr "UPnP"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr "UPnPå…许局域网内客户端自动设置路由上的端å£è½¬å‘。"
++
++msgid "UPnP lease file"
++msgstr "UPnP租约文件"
++
++msgid "Universal Plug & Play"
++msgstr "通用å³æ’å³ç”¨(UPnP)"
++
++msgid "Uplink"
++msgstr "上行速率"
++
++msgid "Value in KByte/s, informational only"
++msgstr "值为KByte/s,仅供å‚考"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr "UPnPå…许局域网内客户端自动设置路由上的端å£è½¬å‘。"
++
++#~ msgid "enable"
++#~ msgstr "å¯ç”¨"
+diff --git a/feeds/luci/applications/luci-app-upnp/po/zh-tw/upnp.po b/feeds/luci/applications/luci-app-upnp/po/zh-tw/upnp.po
+new file mode 100644
+index 0000000..dde94ae
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-upnp/po/zh-tw/upnp.po
+@@ -0,0 +1,147 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 11:40+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid ""
++"ACLs specify which external ports may be redirected to which internal "
++"addresses and ports"
++msgstr "ACLå­˜å–控制清單, 就是指定æŸäº›å¤–部埠å¯ä»¥å¾žå°Žåˆ°å…§éƒ¨ä½å€å’ŒåŸ è™Ÿ"
++
++msgid "Action"
++msgstr "啓用"
++
++msgid "Active UPnP Redirects"
++msgstr "啓用UPnP從導"
++
++msgid "Advanced Settings"
++msgstr "進階設定"
++
++msgid "Allow adding forwards only to requesting ip addresses"
++msgstr "åªå…許請求的IPä½å€æ–°å¢žå¾žå°Žæ©Ÿåˆ¶"
++
++msgid "Announced model number"
++msgstr "已宣告模組號碼"
++
++msgid "Announced serial number"
++msgstr "已宣告åºè™Ÿ"
++
++msgid "Clean rules interval"
++msgstr "清除è¦å‰‡é–“éš”"
++
++msgid "Clean rules threshold"
++msgstr "清除è¦å‰‡é–€æª»"
++
++msgid "Client Address"
++msgstr "用戶端ä½å€"
++
++msgid "Client Port"
++msgstr "用戶端埠號"
++
++msgid "Collecting data..."
++msgstr "收集數據中..."
++
++msgid "Comment"
++msgstr "è©•è«–"
++
++msgid "Delete Redirect"
++msgstr "刪除從導"
++
++msgid "Device UUID"
++msgstr "設備UUIDç¨ç«‹è­˜åˆ¥ç¢¼"
++
++msgid "Downlink"
++msgstr "下載"
++
++msgid "Enable NAT-PMP functionality"
++msgstr "啓用蘋果NAT-PMP傳輸埠å°æ‡‰é€šè¨Šå”定功能"
++
++msgid "Enable UPnP functionality"
++msgstr "啓用UPnP通用åºåˆ—埠功能"
++
++msgid "Enable additional logging"
++msgstr "啓用é¡å¤–記錄"
++
++msgid "Enable secure mode"
++msgstr "啓用安全模å¼"
++
++msgid "External Port"
++msgstr "外部埠號"
++
++msgid "External ports"
++msgstr "外部埠號範åœ"
++
++msgid "General Settings"
++msgstr "一般設定"
++
++msgid "Internal addresses"
++msgstr "內部ä½å€"
++
++msgid "Internal ports"
++msgstr "內部埠號"
++
++msgid "MiniUPnP ACLs"
++msgstr "å°åž‹UPnPå­˜å–控制清單"
++
++msgid "MiniUPnP settings"
++msgstr "å°åž‹UPnPå­˜å–控制清單設定"
++
++msgid "Notify interval"
++msgstr "æ醒間隔"
++
++msgid "Port"
++msgstr "埠號"
++
++msgid "Presentation URL"
++msgstr "介紹URL連çµ"
++
++msgid "Protocol"
++msgstr "å”è­°"
++
++msgid "Puts extra debugging information into the system log"
++msgstr "把é¡å¤–的除錯資訊放入系統log計錄中"
++
++msgid "Report system instead of daemon uptime"
++msgstr "報表系統å–代常é§æ›´æ–°æ™‚é–“"
++
++msgid "Start UPnP and NAT-PMP service"
++msgstr "啓用UPnPè·ŸNAT-PMPæœå‹™"
++
++msgid "There are no active redirects."
++msgstr "ç›®å‰ç„¡ä½œç”¨ä¸­çš„從導"
++
++msgid "UPnP"
++msgstr "UPNP通用åºåˆ—埠å”定"
++
++msgid ""
++"UPnP allows clients in the local network to automatically configure the "
++"router."
++msgstr "開放本地用戶端自動設定路由器UPNP機制"
++
++msgid "UPnP lease file"
++msgstr "UPnP租賃文件"
++
++msgid "Universal Plug & Play"
++msgstr "通用åºåˆ—埠隨æ’隨用"
++
++msgid "Uplink"
++msgstr "上傳"
++
++msgid "Value in KByte/s, informational only"
++msgstr "僅採用 KByte/s值單ä½è¡¨ç¤º"
++
++#~ msgid ""
++#~ "UPNP allows clients in the local network to automatically configure the "
++#~ "router."
++#~ msgstr "開放本地用戶端自動設定路由器UPNP機制"
++
++#~ msgid "enable"
++#~ msgstr "啓用"
+diff --git a/feeds/luci/applications/luci-app-ushare/Makefile b/feeds/luci/applications/luci-app-ushare/Makefile
+new file mode 100644
+index 0000000..5c0974c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=uShare - UPnP A/V & DLNA Media Server
++LUCI_DEPENDS:=+ushare @BROKEN
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-ushare/luasrc/controller/ushare.lua b/feeds/luci/applications/luci-app-ushare/luasrc/controller/ushare.lua
+new file mode 100644
+index 0000000..c811773
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/luasrc/controller/ushare.lua
+@@ -0,0 +1,15 @@
++-- Copyright 2008 Yanira <forum-2008@email.de>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.ushare", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/ushare") then
++ return
++ end
++
++ local page
++
++ page = entry({"admin", "services", "ushare"}, cbi("ushare"), _("uShare"), 60)
++ page.dependent = true
++end
+diff --git a/feeds/luci/applications/luci-app-ushare/luasrc/model/cbi/ushare.lua b/feeds/luci/applications/luci-app-ushare/luasrc/model/cbi/ushare.lua
+new file mode 100644
+index 0000000..0c2d1f0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/luasrc/model/cbi/ushare.lua
+@@ -0,0 +1,30 @@
++-- Copyright 2008 Yanira <forum-2008@email.de>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("ushare", translate("uShare"),
++ luci.util.pcdata(translate("uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server component that provides UPnP media devices with information on available multimedia files.")))
++
++s = m:section(TypedSection, "ushare", translate("Settings"))
++s.addremove = false
++s.anonymous = true
++
++s:option(Flag, "enabled", translate("Enable"))
++
++s:option(Value, "username", translate("Username"))
++
++s:option(Value, "servername", translate("Servername"))
++
++dif = s:option( Value, "interface", translate("Interface"))
++for _, nif in ipairs(luci.sys.net.devices()) do
++ if nif ~= "lo" then dif:value(nif) end
++end
++
++s:option(DynamicList, "content_directories", translate("Content directories"))
++
++s:option(Flag, "disable_webif", translate("Disable webinterface"))
++
++s:option(Flag, "disable_telnet", translate("Disable telnet console"))
++
++s:option(Value, "options", translate("Options"))
++
++return m
+diff --git a/feeds/luci/applications/luci-app-ushare/po/ca/ushare.po b/feeds/luci/applications/luci-app-ushare/po/ca/ushare.po
+new file mode 100644
+index 0000000..9d64596
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/ca/ushare.po
+@@ -0,0 +1,55 @@
++# ushare.pot
++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-07-01 08:29+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "Directoris de contingut"
++
++msgid "Disable telnet console"
++msgstr "Inhabilita la consola telnet"
++
++msgid "Disable webinterface"
++msgstr "Inhabilita la interfície web"
++
++msgid "Enable"
++msgstr "Habilita"
++
++msgid "Interface"
++msgstr "Interfície"
++
++msgid "Options"
++msgstr "Opcions"
++
++msgid "Servername"
++msgstr "Nom de servidor"
++
++msgid "Settings"
++msgstr "Configuració"
++
++msgid "Username"
++msgstr "Nom d'usuari"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"El uShare és un servidor de mitjans UPnP (TM) A/V i DLNA. Implementa el "
++"component servidor que proveeix els dispositius de mitjans UPnP amb "
++"informació sobre els fitxers de multimèdia disponibles."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/cs/ushare.po b/feeds/luci/applications/luci-app-ushare/po/cs/ushare.po
+new file mode 100644
+index 0000000..d908e91
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/cs/ushare.po
+@@ -0,0 +1,53 @@
++# ushare.pot
++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-29 21:49+0200\n"
++"Last-Translator: Astran <martin.hromadko@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "Složky s obsahem"
++
++msgid "Disable telnet console"
++msgstr "Zakázat telnet konzoli"
++
++msgid "Disable webinterface"
++msgstr "Zakázat webové rozhraní"
++
++msgid "Enable"
++msgstr "Povolit"
++
++msgid "Interface"
++msgstr "Rozhraní"
++
++msgid "Options"
++msgstr "Možnosti"
++
++msgid "Servername"
++msgstr "Název serveru"
++
++msgid "Settings"
++msgstr "Nastavení"
++
++msgid "Username"
++msgstr "Uživatelské jméno"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"uShare je UPnP (TM) A/V & DLNA Media Server. Implementuje souÄást serveru, "
++"který poskytuje UPnP mediální zařízení s informacemi o dostupných "
++"multimediálních souborech."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/de/ushare.po b/feeds/luci/applications/luci-app-ushare/po/de/ushare.po
+new file mode 100644
+index 0000000..d7d7e22
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/de/ushare.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2013-01-28 22:32+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "Freigabeverzeichnisse"
++
++msgid "Disable telnet console"
++msgstr "Telnet-Konsole deaktivieren"
++
++msgid "Disable webinterface"
++msgstr "Webinterface deaktivieren"
++
++msgid "Enable"
++msgstr "Aktivieren"
++
++msgid "Interface"
++msgstr "Schnittstelle"
++
++msgid "Options"
++msgstr "Optionen"
++
++msgid "Servername"
++msgstr "Servername"
++
++msgid "Settings"
++msgstr "Einstellungen"
++
++msgid "Username"
++msgstr "Benutzername"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"uShare ist ein uPNP(TM) A/V & DLNA - basierender Medien-Server. Es "
++"implementiert die Serverkomponente, welche uPNP-Geräten Informationen über "
++"verfügbare Mediendateien bereitstellt."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/el/ushare.po b/feeds/luci/applications/luci-app-ushare/po/el/ushare.po
+new file mode 100644
+index 0000000..331c8a0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/el/ushare.po
+@@ -0,0 +1,48 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-28 02:08+0200\n"
++"PO-Revision-Date: 2010-06-30 17:26+0200\n"
++"Last-Translator: Vasilis Tsiligiannis <b_tsiligiannis@silverton.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "Content directories"
++msgstr "Φάκελοι πεÏιεχομένου"
++
++msgid "Disable telnet console"
++msgstr "ΑπενεÏγοποίηση τεÏÎ¼Î±Ï„Î¹ÎºÎ¿Ï telnet"
++
++msgid "Disable webinterface"
++msgstr "ΑπενεÏγοποίηση διεπαφής web"
++
++msgid "Enable"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Options"
++msgstr "Επιλογές"
++
++msgid "Servername"
++msgstr "Όνομα εξυπηÏετητή"
++
++msgid "Settings"
++msgstr "Ρυθμίσεις"
++
++msgid "Username"
++msgstr ""
++
++msgid "uShare"
++msgstr ""
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ushare/po/en/ushare.po b/feeds/luci/applications/luci-app-ushare/po/en/ushare.po
+new file mode 100644
+index 0000000..5e5d65f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/en/ushare.po
+@@ -0,0 +1,49 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid "Content directories"
++msgstr "Content directories"
++
++msgid "Disable telnet console"
++msgstr "Disable telnet console"
++
++msgid "Disable webinterface"
++msgstr "Disable webinterface"
++
++msgid "Enable"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Options"
++msgstr "Options"
++
++msgid "Servername"
++msgstr "Servername"
++
++msgid "Settings"
++msgstr "Settings"
++
++msgid "Username"
++msgstr ""
++
++msgid "uShare"
++msgstr ""
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ushare/po/es/ushare.po b/feeds/luci/applications/luci-app-ushare/po/es/ushare.po
+new file mode 100644
+index 0000000..e8422b9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/es/ushare.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-08-25 09:23+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "Directorios de contenido"
++
++msgid "Disable telnet console"
++msgstr "Inhabilitar consola telnet"
++
++msgid "Disable webinterface"
++msgstr "Inhabilitar interfaz web"
++
++msgid "Enable"
++msgstr "Activar"
++
++msgid "Interface"
++msgstr "Interfaz"
++
++msgid "Options"
++msgstr "Opciones"
++
++msgid "Servername"
++msgstr "Nombre para el servidor"
++
++msgid "Settings"
++msgstr "Configuración"
++
++msgid "Username"
++msgstr "Nombre de usuario"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"uShare es un servidor UPnP (TM) A/V y DLNA. Implementa el componente del "
++"servidor que proporciona a los dispositivos UPnP la información disponible "
++"en los ficheros multimedia."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/fr/ushare.po b/feeds/luci/applications/luci-app-ushare/po/fr/ushare.po
+new file mode 100644
+index 0000000..e2e917d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/fr/ushare.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-08-06 13:57+0200\n"
++"Last-Translator: st <shailjathkr@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "Répertoires de contenus"
++
++msgid "Disable telnet console"
++msgstr "Désactiver la console Telnet"
++
++msgid "Disable webinterface"
++msgstr "Désactiver l'interface web"
++
++msgid "Enable"
++msgstr "Activer"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Options"
++msgstr "Options"
++
++msgid "Servername"
++msgstr "Nom du serveur"
++
++msgid "Settings"
++msgstr "Paramètres"
++
++msgid "Username"
++msgstr "Nom d'utilisateur"
++
++msgid "uShare"
++msgstr ""
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ushare/po/he/ushare.po b/feeds/luci/applications/luci-app-ushare/po/he/ushare.po
+new file mode 100644
+index 0000000..4858a9a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/he/ushare.po
+@@ -0,0 +1,52 @@
++# ushare.pot
++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-06-24 18:47+0200\n"
++"Last-Translator: GiladL <gl1000007@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Content directories"
++msgstr "ספריות תוכן"
++
++# ×”×× ×œ×›×ª×•×‘ טלנט ב×נגלית (telenet) ×ו בתעתיק עברי (טלנט)?
++msgid "Disable telnet console"
++msgstr "השבת קונסולת telnet"
++
++msgid "Disable webinterface"
++msgstr "השבת מנשק רשת"
++
++msgid "Enable"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Options"
++msgstr "×פשרויות"
++
++msgid "Servername"
++msgstr "×©× ×©×¨×ª"
++
++msgid "Settings"
++msgstr "הגדרות"
++
++msgid "Username"
++msgstr ""
++
++# ×–×” ×©× ×©×œ תוכנה ×•×œ× ×¦×¨×™×š ×œ×ª×¨×’× ×ותו
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ushare/po/hu/ushare.po b/feeds/luci/applications/luci-app-ushare/po/hu/ushare.po
+new file mode 100644
+index 0000000..6efa521
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/hu/ushare.po
+@@ -0,0 +1,53 @@
++# ushare.pot
++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-13 18:29+0200\n"
++"Last-Translator: Gábor <vargalex@freemail.hu>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "Megosztott könyvtárak"
++
++msgid "Disable telnet console"
++msgstr "Telnet-konzol tiltása"
++
++msgid "Disable webinterface"
++msgstr "Web felület tiltása"
++
++msgid "Enable"
++msgstr "Engedélyezés"
++
++msgid "Interface"
++msgstr "Interfész"
++
++msgid "Options"
++msgstr "Opciók"
++
++msgid "Servername"
++msgstr "Szerver név"
++
++msgid "Settings"
++msgstr "Beállítások"
++
++msgid "Username"
++msgstr "Felhasználónév"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"Az uShare egy UPnP (TM) A/V & DLNA média szerver. A szerver komponenst "
++"valósítja meg, amely információt szolgáltat az elérhető multimédia fájlokról "
++"az uPnP média eszközök számára."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/it/ushare.po b/feeds/luci/applications/luci-app-ushare/po/it/ushare.po
+new file mode 100644
+index 0000000..5837a11
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/it/ushare.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-02-03 14:03+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "Percorso dei contenuti"
++
++msgid "Disable telnet console"
++msgstr "Disabilita console telnet"
++
++msgid "Disable webinterface"
++msgstr "Disabilita l'interfaccia web"
++
++msgid "Enable"
++msgstr "Attiva"
++
++msgid "Interface"
++msgstr "Interfaccia"
++
++msgid "Options"
++msgstr "Opzioni"
++
++msgid "Servername"
++msgstr "Nome del server"
++
++msgid "Settings"
++msgstr "Impostazioni"
++
++msgid "Username"
++msgstr "Nome Utente"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"uShare è un Server Multimediale UPnP (TM) A / V e DLNA. Implementa il "
++"componente server che fornisce ai dispositivi multimediali UPnP, le "
++"informazioni su file multimediali disponibili."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/ja/ushare.po b/feeds/luci/applications/luci-app-ushare/po/ja/ushare.po
+new file mode 100644
+index 0000000..a217ece
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/ja/ushare.po
+@@ -0,0 +1,52 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-05-04 14:28+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "コンテンツディレクトリ"
++
++msgid "Disable telnet console"
++msgstr "telnelコンソールを無効ã«ã™ã‚‹"
++
++msgid "Disable webinterface"
++msgstr "Webインターフェースを無効ã«ã™ã‚‹"
++
++msgid "Enable"
++msgstr "サービスを有効ã«ã™ã‚‹"
++
++msgid "Interface"
++msgstr "インターフェース"
++
++msgid "Options"
++msgstr "オプション"
++
++msgid "Servername"
++msgstr "サーãƒãƒ¼å"
++
++msgid "Settings"
++msgstr "設定"
++
++msgid "Username"
++msgstr "ユーザーå"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"uShareã¯UPnP (TM) A/V ãŠã‚ˆã³ DLNA "
++"メディアサーãƒãƒ¼ã§ã‚ã‚Šã€UPnPメディアデãƒã‚¤ã‚¹ã«å¯¾ã—ã¦ãƒžãƒ«ãƒãƒ¡ãƒ‡ã‚£ã‚¢ãƒ»ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報をæä¾›ã™ã‚‹ã‚µãƒ¼ãƒãƒ¼ãƒ»ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆæ©Ÿèƒ½ã‚’実装ã—ã¦ã„ã¾ã™ã€‚"
+diff --git a/feeds/luci/applications/luci-app-ushare/po/ms/ushare.po b/feeds/luci/applications/luci-app-ushare/po/ms/ushare.po
+new file mode 100644
+index 0000000..40b24f2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/ms/ushare.po
+@@ -0,0 +1,46 @@
++# ushare.pot
++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Content directories"
++msgstr ""
++
++msgid "Disable telnet console"
++msgstr ""
++
++msgid "Disable webinterface"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Servername"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "uShare"
++msgstr ""
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ushare/po/no/ushare.po b/feeds/luci/applications/luci-app-ushare/po/no/ushare.po
+new file mode 100644
+index 0000000..321d29e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/no/ushare.po
+@@ -0,0 +1,44 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Content directories"
++msgstr "Innholdskataloger"
++
++msgid "Disable telnet console"
++msgstr "Deaktiver telnet konsoll"
++
++msgid "Disable webinterface"
++msgstr "Deaktiver webgrensesnitt"
++
++msgid "Enable"
++msgstr "Aktiver"
++
++msgid "Interface"
++msgstr "Grensesnitt"
++
++msgid "Options"
++msgstr "Alternativer"
++
++msgid "Servername"
++msgstr "Servernavn"
++
++msgid "Settings"
++msgstr "Innstillinger"
++
++msgid "Username"
++msgstr "Brukernavn"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++
++#~ msgid "ushare_desc"
++#~ msgstr "UPnP A/V og DLNA Media Server for Linux."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/pl/ushare.po b/feeds/luci/applications/luci-app-ushare/po/pl/ushare.po
+new file mode 100644
+index 0000000..2a26404
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/pl/ushare.po
+@@ -0,0 +1,54 @@
++# ushare.pot
++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-08 13:18+0200\n"
++"Last-Translator: Staszek <fistaszek@tlen.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "Katalogi zawartości"
++
++msgid "Disable telnet console"
++msgstr "Wyłącz konsolę telnet"
++
++msgid "Disable webinterface"
++msgstr "Wyłącz interfejs web"
++
++msgid "Enable"
++msgstr "WÅ‚Ä…cz"
++
++msgid "Interface"
++msgstr "Interfejs"
++
++msgid "Options"
++msgstr "Opcje"
++
++msgid "Servername"
++msgstr "Nazwa serwera"
++
++msgid "Settings"
++msgstr "Ustawienia"
++
++msgid "Username"
++msgstr "Użytkownik"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"uShare jest serwerem mediów UPnP (TM) i DLNA. Implementuje serwer, który "
++"udostępnia urządzenia medialne UPnP z informacjami na temat dostępnych "
++"plików multimedialnych."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/pt-br/ushare.po b/feeds/luci/applications/luci-app-ushare/po/pt-br/ushare.po
+new file mode 100644
+index 0000000..5fc872e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/pt-br/ushare.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2012-09-26 23:09+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "Diretórios de conteúdo"
++
++msgid "Disable telnet console"
++msgstr "Desativar console telnet"
++
++msgid "Disable webinterface"
++msgstr "Desativar interface web"
++
++msgid "Enable"
++msgstr "Habilitar"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Options"
++msgstr "Opções"
++
++msgid "Servername"
++msgstr "Nome do servidor"
++
++msgid "Settings"
++msgstr "Configurações"
++
++msgid "Username"
++msgstr "Nome do usuário"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"uShare é um Servidor de Mídia DLNA & UPnP (TM) A/V. Implementa o componente "
++"do servidor que provê aos dispositivos de mídia UPnP informações sobre os "
++"arquivos multimídias disponíveis."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/pt/ushare.po b/feeds/luci/applications/luci-app-ushare/po/pt/ushare.po
+new file mode 100644
+index 0000000..795a963
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/pt/ushare.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-06-03 23:32+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "Diretórios de conteúdo"
++
++msgid "Disable telnet console"
++msgstr "Desativar console telnet"
++
++msgid "Disable webinterface"
++msgstr "Desativar interface web"
++
++msgid "Enable"
++msgstr "Ativar"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Options"
++msgstr "Opções"
++
++msgid "Servername"
++msgstr "Nome do servidor"
++
++msgid "Settings"
++msgstr "Configurações"
++
++msgid "Username"
++msgstr "Nome Utilizador"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"O uShare é um Servidor Multimédia UPnP (TM) A/V & DLNA. Implementa o "
++"componente de servidor que fornece aos dispositivos multimédia UPnP "
++"informações sobre os ficheiros disponiveis."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/ro/ushare.po b/feeds/luci/applications/luci-app-ushare/po/ro/ushare.po
+new file mode 100644
+index 0000000..3c99754
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/ro/ushare.po
+@@ -0,0 +1,51 @@
++# ushare.pot
++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-29 20:03+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "Conţinut directoare"
++
++msgid "Disable telnet console"
++msgstr "Dezactiveaza consola telnet"
++
++msgid "Disable webinterface"
++msgstr "Dezactiveaza interfata web"
++
++msgid "Enable"
++msgstr "Activează"
++
++msgid "Interface"
++msgstr "Interfaţă"
++
++msgid "Options"
++msgstr "Optiuni"
++
++msgid "Servername"
++msgstr "Numele serverului"
++
++msgid "Settings"
++msgstr "Setari"
++
++msgid "Username"
++msgstr "Utilizator"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ushare/po/ru/ushare.po b/feeds/luci/applications/luci-app-ushare/po/ru/ushare.po
+new file mode 100644
+index 0000000..ac08e94
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/ru/ushare.po
+@@ -0,0 +1,54 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: ushare\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-08-15 11:29+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Content directories"
++msgstr "Директории Ñ Ñодержимым"
++
++msgid "Disable telnet console"
++msgstr "Выключить telnet-конÑоль"
++
++msgid "Disable webinterface"
++msgstr "Выключить веб-интерфейÑ"
++
++msgid "Enable"
++msgstr "Включить"
++
++msgid "Interface"
++msgstr "ИнтерфейÑ"
++
++msgid "Options"
++msgstr "Опции"
++
++msgid "Servername"
++msgstr "Ð˜Ð¼Ñ Ñервера"
++
++msgid "Settings"
++msgstr "ÐаÑтройки"
++
++msgid "Username"
++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"uShare - Ñто UPnP (TM) A/V DLNA медиа-Ñервер, который предоÑтавлÑет "
++"мультимедийным уÑтройÑтвам информацию о доÑтупных медиа-файлах."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/sk/ushare.po b/feeds/luci/applications/luci-app-ushare/po/sk/ushare.po
+new file mode 100644
+index 0000000..4c9022b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/sk/ushare.po
+@@ -0,0 +1,45 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Content directories"
++msgstr ""
++
++msgid "Disable telnet console"
++msgstr ""
++
++msgid "Disable webinterface"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Servername"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "uShare"
++msgstr ""
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ushare/po/sv/ushare.po b/feeds/luci/applications/luci-app-ushare/po/sv/ushare.po
+new file mode 100644
+index 0000000..50fc9d6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/sv/ushare.po
+@@ -0,0 +1,46 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Content directories"
++msgstr ""
++
++msgid "Disable telnet console"
++msgstr ""
++
++msgid "Disable webinterface"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Servername"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "uShare"
++msgstr ""
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ushare/po/templates/ushare.pot b/feeds/luci/applications/luci-app-ushare/po/templates/ushare.pot
+new file mode 100644
+index 0000000..7e4dbc1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/templates/ushare.pot
+@@ -0,0 +1,38 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Content directories"
++msgstr ""
++
++msgid "Disable telnet console"
++msgstr ""
++
++msgid "Disable webinterface"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Options"
++msgstr ""
++
++msgid "Servername"
++msgstr ""
++
++msgid "Settings"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "uShare"
++msgstr ""
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ushare/po/tr/ushare.po b/feeds/luci/applications/luci-app-ushare/po/tr/ushare.po
+new file mode 100644
+index 0000000..c905c57
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/tr/ushare.po
+@@ -0,0 +1,50 @@
++# ushare.pot
++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-10-11 22:33+0200\n"
++"Last-Translator: vincenzo <tayfun_ozturk@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: tr\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: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "İçerik Dizinleri"
++
++msgid "Disable telnet console"
++msgstr "Telnet Konsolunu Kapatma"
++
++msgid "Disable webinterface"
++msgstr "Web Arayüzünü Kapatma"
++
++msgid "Enable"
++msgstr "Aktif Hale Getir"
++
++msgid "Interface"
++msgstr "Arayüz"
++
++msgid "Options"
++msgstr "Seçenekler"
++
++msgid "Servername"
++msgstr "Sunucuadı"
++
++msgid "Settings"
++msgstr "Ayarlar"
++
++msgid "Username"
++msgstr "Kullanıcıadı"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ushare/po/uk/ushare.po b/feeds/luci/applications/luci-app-ushare/po/uk/ushare.po
+new file mode 100644
+index 0000000..d79f896
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/uk/ushare.po
+@@ -0,0 +1,53 @@
++# ushare.pot
++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-05-26 18:43+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Content directories"
++msgstr "Каталоги даних"
++
++msgid "Disable telnet console"
++msgstr "Вимкнути конÑоль Telnet"
++
++msgid "Disable webinterface"
++msgstr "Вимкнути веб-інтерфейÑ"
++
++msgid "Enable"
++msgstr "Увімкнути"
++
++msgid "Interface"
++msgstr "ІнтерфейÑ"
++
++msgid "Options"
++msgstr "Опції"
++
++msgid "Servername"
++msgstr "Ім'Ñ Ñервера"
++
++msgid "Settings"
++msgstr "ÐаÑтройки"
++
++msgid "Username"
++msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
++
++msgid "uShare"
++msgstr "uShare"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"uShare Ñ” UPnP (TM) A/V DLNA медіа-Ñервером, Ñкий надає UPnP медіа-приÑтроÑм "
++"інформацію про наÑвні мультимедійні файли."
+diff --git a/feeds/luci/applications/luci-app-ushare/po/vi/ushare.po b/feeds/luci/applications/luci-app-ushare/po/vi/ushare.po
+new file mode 100644
+index 0000000..20e5df7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/vi/ushare.po
+@@ -0,0 +1,50 @@
++# ushare.pot
++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:59+0200\n"
++"PO-Revision-Date: 2009-08-13 04:01+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "Content directories"
++msgstr "Danh bạ nội dung "
++
++msgid "Disable telnet console"
++msgstr "Vô hiệu hóa khiển telnet"
++
++msgid "Disable webinterface"
++msgstr "Vô hiệu hóa giao diện web"
++
++msgid "Enable"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Options"
++msgstr "Lá»±a chá»n "
++
++msgid "Servername"
++msgstr "tên máy chủ"
++
++msgid "Settings"
++msgstr "Cài đặt"
++
++msgid "Username"
++msgstr ""
++
++msgid "uShare"
++msgstr ""
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-ushare/po/zh-cn/ushare.po b/feeds/luci/applications/luci-app-ushare/po/zh-cn/ushare.po
+new file mode 100644
+index 0000000..f426526
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/zh-cn/ushare.po
+@@ -0,0 +1,52 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2012-09-18 16:26+0200\n"
++"Last-Translator: nKsyn <e.nksyn@gmail.com>\n"
++"Language-Team: QQ Group 75543259\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "目录"
++
++msgid "Disable telnet console"
++msgstr "关闭telnet管ç†"
++
++msgid "Disable webinterface"
++msgstr "关闭界é¢ç®¡ç†"
++
++msgid "Enable"
++msgstr "å¯ç”¨"
++
++msgid "Interface"
++msgstr "网络接å£"
++
++msgid "Options"
++msgstr "选项"
++
++msgid "Servername"
++msgstr "æœåŠ¡å™¨å"
++
++msgid "Settings"
++msgstr "设置"
++
++msgid "Username"
++msgstr "用户å"
++
++msgid "uShare"
++msgstr "UPNPæµåª’体æœåŠ¡"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr ""
++"uShare是一个UPnP(TM) A/Vå’ŒDLNA媒体æœåŠ¡å™¨ã€‚å¯ä»¥å°†å¤šåª’体文件共享到支æŒUPnP的设"
++"备上。"
+diff --git a/feeds/luci/applications/luci-app-ushare/po/zh-tw/ushare.po b/feeds/luci/applications/luci-app-ushare/po/zh-tw/ushare.po
+new file mode 100644
+index 0000000..eba6677
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/po/zh-tw/ushare.po
+@@ -0,0 +1,48 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-10 12:32+0200\n"
++"Last-Translator: mp607 <mickey60711@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Content directories"
++msgstr "目錄"
++
++msgid "Disable telnet console"
++msgstr "關閉telnet管ç†"
++
++msgid "Disable webinterface"
++msgstr "關閉網路介é¢ç®¡ç†"
++
++msgid "Enable"
++msgstr "啟用"
++
++msgid "Interface"
++msgstr "網路介é¢"
++
++msgid "Options"
++msgstr "é¸é …"
++
++msgid "Servername"
++msgstr "伺æœå™¨å稱"
++
++msgid "Settings"
++msgstr "設定"
++
++msgid "Username"
++msgstr "使用者å稱"
++
++msgid "uShare"
++msgstr "UPnP多媒體æœå‹™"
++
++msgid ""
++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server "
++"component that provides UPnP media devices with information on available "
++"multimedia files."
++msgstr "uShare是一個UPnP (TM) A/V & DLNA多媒體伺æœå™¨ã€‚å¯ä»¥å°‡å¤šåª’體檔案共用分享到支æ´UPnPçš„è£ç½®ä¸Š"
+diff --git a/feeds/luci/applications/luci-app-ushare/root/etc/uci-defaults/luci-ushare b/feeds/luci/applications/luci-app-ushare/root/etc/uci-defaults/luci-ushare
+new file mode 100755
+index 0000000..8bcb6e4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-ushare/root/etc/uci-defaults/luci-ushare
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@ushare[-1]
++ add ucitrack ushare
++ set ucitrack.@ushare[-1].init=ushare
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-vnstat/Makefile b/feeds/luci/applications/luci-app-vnstat/Makefile
+new file mode 100644
+index 0000000..6d98610
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for VnStat
++LUCI_DEPENDS:=+vnstat +vnstati
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-vnstat/luasrc/controller/vnstat.lua b/feeds/luci/applications/luci-app-vnstat/luasrc/controller/vnstat.lua
+new file mode 100644
+index 0000000..3871fa2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/luasrc/controller/vnstat.lua
+@@ -0,0 +1,11 @@
++module("luci.controller.vnstat", package.seeall)
++
++function index()
++ entry({"admin", "status", "vnstat"}, alias("admin", "status", "vnstat", "graphs"), _("VnStat Traffic Monitor"), 90)
++ entry({"admin", "status", "vnstat", "graphs"}, template("vnstat"), _("Graphs"), 1)
++ entry({"admin", "status", "vnstat", "config"}, cbi("vnstat"), _("Configuration"), 2)
++
++ entry({"mini", "network", "vnstat"}, alias("mini", "network", "vnstat", "graphs"), _("VnStat Traffic Monitor"), 90)
++ entry({"mini", "network", "vnstat", "graphs"}, template("vnstat"), _("Graphs"), 1)
++ entry({"mini", "network", "vnstat", "config"}, cbi("vnstat"), _("Configuration"), 2)
++end
+diff --git a/feeds/luci/applications/luci-app-vnstat/luasrc/model/cbi/vnstat.lua b/feeds/luci/applications/luci-app-vnstat/luasrc/model/cbi/vnstat.lua
+new file mode 100644
+index 0000000..c60c649
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/luasrc/model/cbi/vnstat.lua
+@@ -0,0 +1,82 @@
++-- Copyright 2010-2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local utl = require "luci.util"
++local sys = require "luci.sys"
++local fs = require "nixio.fs"
++local nw = require "luci.model.network"
++
++local dbdir, line
++
++for line in io.lines("/etc/vnstat.conf") do
++ dbdir = line:match("^%s*DatabaseDir%s+[\"'](%S-)[\"']")
++ if dbdir then break end
++end
++
++dbdir = dbdir or "/var/lib/vnstat"
++
++
++m = Map("vnstat", translate("VnStat"),
++ translate("VnStat is a network traffic monitor for Linux that keeps a log of network traffic for the selected interface(s)."))
++
++m.submit = translate("Restart VnStat")
++m.reset = false
++
++nw.init(luci.model.uci.cursor_state())
++
++local ifaces = { }
++local enabled = { }
++local iface
++
++if fs.access(dbdir) then
++ for iface in fs.dir(dbdir) do
++ if iface:sub(1,1) ~= '.' then
++ ifaces[iface] = iface
++ enabled[iface] = iface
++ end
++ end
++end
++
++for _, iface in ipairs(sys.net.devices()) do
++ ifaces[iface] = iface
++end
++
++
++local s = m:section(TypedSection, "vnstat")
++s.anonymous = true
++s.addremove = false
++
++mon_ifaces = s:option(Value, "interface", translate("Monitor selected interfaces"))
++mon_ifaces.template = "cbi/network_ifacelist"
++mon_ifaces.widget = "checkbox"
++mon_ifaces.cast = "table"
++mon_ifaces.noinactive = true
++mon_ifaces.nocreate = true
++
++function mon_ifaces.write(self, section, val)
++ local i
++ local s = { }
++
++ if val then
++ for _, i in ipairs(type(val) == "table" and val or { val }) do
++ s[i] = true
++ end
++ end
++
++ for i, _ in pairs(ifaces) do
++ if not s[i] then
++ fs.unlink(dbdir .. "/" .. i)
++ fs.unlink(dbdir .. "/." .. i)
++ end
++ end
++
++ if next(s) then
++ m.uci:set_list("vnstat", section, "interface", utl.keys(s))
++ else
++ m.uci:delete("vnstat", section, "interface")
++ end
++end
++
++mon_ifaces.remove = mon_ifaces.write
++
++return m
+diff --git a/feeds/luci/applications/luci-app-vnstat/luasrc/view/vnstat.htm b/feeds/luci/applications/luci-app-vnstat/luasrc/view/vnstat.htm
+new file mode 100644
+index 0000000..2b8d9ff
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/luasrc/view/vnstat.htm
+@@ -0,0 +1,101 @@
++<%#
++ Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%-
++
++local fs = require "nixio.fs"
++local sys = require "luci.sys"
++local utl = require "luci.util"
++
++local param = luci.http.formvalue
++
++local iface = param("iface")
++local style = param("style")
++
++style = (style and #style > 0) and style or "s"
++
++
++--
++-- render image
++--
++if iface then
++ style = style:gsub("[^%w]", "")
++ iface = iface:gsub("[^%w%.%-%_]", "")
++
++ luci.http.prepare_content("image/png")
++
++ local png = io.popen("vnstati -i '%s' '-%s' -o -" % { iface, style })
++ luci.http.write(png:read("*a"))
++ png:close()
++
++ return
++
++--
++-- update database
++--
++else
++ sys.call("vnstat -u >/dev/null 2>/dev/null")
++end
++
++
++--
++-- find databases
++--
++local dbdir, line
++
++for line in io.lines("/etc/vnstat.conf") do
++ dbdir = line:match("^%s*DatabaseDir%s+[\"'](%S-)[\"']")
++ if dbdir then break end
++end
++
++dbdir = dbdir or "/var/lib/vnstat"
++
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:VnStat Graphs%></h2>
++
++<form action="" method="get">
++
++<select name="style">
++ <option value="s"<%=(style == "s") and ' selected="selected"' or ''%>><%:Summary display%></option>
++ <option value="t"<%=(style == "t") and ' selected="selected"' or ''%>><%:Top 10 display%></option>
++ <option value="h"<%=(style == "h") and ' selected="selected"' or ''%>><%:Hourly traffic%></option>
++ <option value="d"<%=(style == "d") and ' selected="selected"' or ''%>><%:Daily traffic%></option>
++ <option value="m"<%=(style == "m") and ' selected="selected"' or ''%>><%:Monthly traffic%></option>
++</select>
++
++<input type="submit" value="<%:Update »%>" />
++
++</form>
++
++<br /><hr /><br />
++
++<div style="text-align:center">
++<%
++ empty = true
++ ifdir = fs.dir(dbdir)
++
++ if ifdir then
++ for iface in ifdir do
++ if iface:sub(1,1) ~= "." then
++ empty = false
++%>
++ <img src="<%=REQUEST_URI%>?iface=<%=iface%>&amp;style=<%=param('style')%>" alt="" />
++ <br /><br />
++<%
++ end
++ end
++ end
++%>
++
++<% if empty then %>
++<p><em><%:No database has been set up yet. Go to the VnStat configuration and enable monitoring for one or more interfaces.%></em></p>
++<% end %>
++
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/ca/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/ca/vnstat.po
+new file mode 100644
+index 0000000..536228e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/ca/vnstat.po
+@@ -0,0 +1,65 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-09 07:13+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: German\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configuration"
++msgstr "Configuració"
++
++msgid "Daily traffic"
++msgstr "Trànsit diari"
++
++msgid "Graphs"
++msgstr "Gràfics"
++
++msgid "Hourly traffic"
++msgstr "Trànsit per hora"
++
++msgid "Monitor selected interfaces"
++msgstr "Vigila les interfícies seleccionades"
++
++msgid "Monthly traffic"
++msgstr "Trànsit mensual"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Encara no s'ha configurat cap base de dades. Aneu a la configuració del "
++"VnStat i habilita la vigila de una o més interfícies."
++
++msgid "Restart VnStat"
++msgstr "Reinicia el VnStat"
++
++msgid "Summary display"
++msgstr "Mostra de resum"
++
++msgid "Top 10 display"
++msgstr "Mostra dels 10 principals"
++
++msgid "Update »"
++msgstr "Actualitza »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "Gràfics de VnStat"
++
++msgid "VnStat Traffic Monitor"
++msgstr "Monitor de trànsit VnStat"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"El VnStat és un monitor de trànsit de xarxa pel Linux que manté un registre "
++"del trànsit de xarxa de les interfícies seleccionades."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/cs/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/cs/vnstat.po
+new file mode 100644
+index 0000000..4818374
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/cs/vnstat.po
+@@ -0,0 +1,64 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Configuration"
++msgstr "Konfigurace"
++
++msgid "Daily traffic"
++msgstr "Denní přenos"
++
++msgid "Graphs"
++msgstr "Grafy"
++
++msgid "Hourly traffic"
++msgstr "Hodinový přenos"
++
++msgid "Monitor selected interfaces"
++msgstr "Sledovat vybraná zařízení"
++
++msgid "Monthly traffic"
++msgstr "MÄ›síÄní pÅ™enos"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Zatím nebyla nastavena žádná databáze. Přejděte na konfiguraci VnStatu a "
++"povolnet sledování jednoho nebo více zařízení."
++
++msgid "Restart VnStat"
++msgstr "Restartovat VnStat"
++
++msgid "Summary display"
++msgstr "Souhrn"
++
++msgid "Top 10 display"
++msgstr "Top 10"
++
++msgid "Update »"
++msgstr "Aktualizovat »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "Grafy VnStat"
++
++msgid "VnStat Traffic Monitor"
++msgstr "Sledování přenosu VnStat"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStat je nástroj pro sledování přenosů dat pro Linux, který ukládá "
++"informace o síťovém provozu na vybraných zařízeních."
++
++#~ msgid "The VnStat service has been restarted."
++#~ msgstr "Služba VnStat byla restartována"
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/de/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/de/vnstat.po
+new file mode 100644
+index 0000000..aab7494
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/de/vnstat.po
+@@ -0,0 +1,68 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2010-11-16 21:06+0100\n"
++"Last-Translator: Jo-Philipp Wich <jow@openwrt.org>\n"
++"Language-Team: German\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Configuration"
++msgstr "Konfiguration"
++
++msgid "Daily traffic"
++msgstr "Täglicher Verkehr"
++
++msgid "Graphs"
++msgstr "Diagramme"
++
++msgid "Hourly traffic"
++msgstr "Stündlicher Verkehr"
++
++msgid "Monitor selected interfaces"
++msgstr "Ãœberwachte Schnittstellen"
++
++msgid "Monthly traffic"
++msgstr "Monatlicher Verkehr"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Es ist noch keine Datenbank eingerichtet. Navigieren Sie zur VnStat "
++"Konfiguration und aktivieren Sie die Ãœberwachung einer oder mehrerer "
++"Schnittstellen."
++
++msgid "Restart VnStat"
++msgstr "VnStat neu starten"
++
++msgid "Summary display"
++msgstr "Ãœbersicht"
++
++msgid "Top 10 display"
++msgstr "Top 10 Anzeige"
++
++msgid "Update »"
++msgstr "Aktualisieren »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "VnStat Diagramme"
++
++msgid "VnStat Traffic Monitor"
++msgstr "VnStat Trafficüberwachung"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStat ist ein Überwachungsprogramm für Netwerkverkehr unter Linux. Das "
++"Programm protokolliert das Verkehrsvolumen auf ausgewählten Schnittstellen."
++
++#~ msgid "The VnStat service has been restarted."
++#~ msgstr "Der VnStat Dienst wurde neu gestartet."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/el/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/el/vnstat.po
+new file mode 100644
+index 0000000..04590ea
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/el/vnstat.po
+@@ -0,0 +1,59 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2010-11-16 20:54+0100\n"
++"Last-Translator: <jow@openwrt.org>\n"
++"Language-Team: German\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Daily traffic"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Hourly traffic"
++msgstr ""
++
++msgid "Monitor selected interfaces"
++msgstr ""
++
++msgid "Monthly traffic"
++msgstr ""
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++
++msgid "Restart VnStat"
++msgstr ""
++
++msgid "Summary display"
++msgstr ""
++
++msgid "Top 10 display"
++msgstr ""
++
++msgid "Update »"
++msgstr ""
++
++msgid "VnStat"
++msgstr ""
++
++msgid "VnStat Graphs"
++msgstr ""
++
++msgid "VnStat Traffic Monitor"
++msgstr ""
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/en/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/en/vnstat.po
+new file mode 100644
+index 0000000..04590ea
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/en/vnstat.po
+@@ -0,0 +1,59 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2010-11-16 20:54+0100\n"
++"Last-Translator: <jow@openwrt.org>\n"
++"Language-Team: German\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Daily traffic"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Hourly traffic"
++msgstr ""
++
++msgid "Monitor selected interfaces"
++msgstr ""
++
++msgid "Monthly traffic"
++msgstr ""
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++
++msgid "Restart VnStat"
++msgstr ""
++
++msgid "Summary display"
++msgstr ""
++
++msgid "Top 10 display"
++msgstr ""
++
++msgid "Update »"
++msgstr ""
++
++msgid "VnStat"
++msgstr ""
++
++msgid "VnStat Graphs"
++msgstr ""
++
++msgid "VnStat Traffic Monitor"
++msgstr ""
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/es/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/es/vnstat.po
+new file mode 100644
+index 0000000..b91e1bb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/es/vnstat.po
+@@ -0,0 +1,68 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-10-07 15:08+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: German\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configuration"
++msgstr "Configuración"
++
++msgid "Daily traffic"
++msgstr "Tráfico diario"
++
++msgid "Graphs"
++msgstr "Gráficas"
++
++msgid "Hourly traffic"
++msgstr "Tráfico por horas"
++
++msgid "Monitor selected interfaces"
++msgstr "Monitorizar las interfaces seleccionadas"
++
++msgid "Monthly traffic"
++msgstr "Tráfico mensual"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Todavía no se ha configurado ninguna base de datos. Vaya a la configuración "
++"de VnStat y habilite la monitorización para una o más interfaces."
++
++msgid "Restart VnStat"
++msgstr "Rearrancar VnStat"
++
++msgid "Summary display"
++msgstr "Mostrar Resumen"
++
++msgid "Top 10 display"
++msgstr "Mostrar Top 10"
++
++msgid "Update »"
++msgstr "Actualizar »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "Graficas de VnStat"
++
++msgid "VnStat Traffic Monitor"
++msgstr "Monitor de trafico de VnStat"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStat es un monitor de tráfico de red para Linux que mantiene un registro "
++"del trafico de red de la interfaz o interfaces seleccionadas."
++
++#~ msgid "The VnStat service has been restarted."
++#~ msgstr "El servicio VnStat ha sido reiniciado"
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/fr/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/fr/vnstat.po
+new file mode 100644
+index 0000000..23b644a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/fr/vnstat.po
+@@ -0,0 +1,68 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-11-23 22:33+0200\n"
++"Last-Translator: fredb <fblistes+luci@free.fr>\n"
++"Language-Team: German\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Configuration"
++msgstr "Configuration"
++
++msgid "Daily traffic"
++msgstr "Trafic quotidien"
++
++msgid "Graphs"
++msgstr "Graphes"
++
++msgid "Hourly traffic"
++msgstr "Trafic horaire"
++
++msgid "Monitor selected interfaces"
++msgstr "Surveiller les interfaces sélectionnées"
++
++msgid "Monthly traffic"
++msgstr "Trafic mensuel"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Aucun enregistrement n'a encore été configuré. Allez dans la configuration "
++"de VnStat et activez la surveillance d'une ou plusieurs interface(s)."
++
++msgid "Restart VnStat"
++msgstr "Redémarrer VnStat"
++
++msgid "Summary display"
++msgstr "Résumé"
++
++msgid "Top 10 display"
++msgstr "Top 10"
++
++msgid "Update »"
++msgstr "Mise à jour »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "Graphiques VnStat"
++
++msgid "VnStat Traffic Monitor"
++msgstr "Surveillance du trafic VnStat"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStat est un outil de surveillance du réseau pour Linux qui garde un "
++"journal du trafic du ou des interface(s) sélectionnée(s)."
++
++#~ msgid "The VnStat service has been restarted."
++#~ msgstr "Le service VnStat a été redémarré."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/he/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/he/vnstat.po
+new file mode 100644
+index 0000000..f0ef3a7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/he/vnstat.po
+@@ -0,0 +1,58 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Daily traffic"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Hourly traffic"
++msgstr ""
++
++msgid "Monitor selected interfaces"
++msgstr ""
++
++msgid "Monthly traffic"
++msgstr ""
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++
++msgid "Restart VnStat"
++msgstr ""
++
++msgid "Summary display"
++msgstr ""
++
++msgid "Top 10 display"
++msgstr ""
++
++msgid "Update »"
++msgstr ""
++
++msgid "VnStat"
++msgstr ""
++
++msgid "VnStat Graphs"
++msgstr ""
++
++msgid "VnStat Traffic Monitor"
++msgstr ""
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/hu/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/hu/vnstat.po
+new file mode 100644
+index 0000000..b198c5d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/hu/vnstat.po
+@@ -0,0 +1,65 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Configuration"
++msgstr "Beállítások"
++
++msgid "Daily traffic"
++msgstr "Napi forgalom"
++
++msgid "Graphs"
++msgstr "Grafikonok"
++
++msgid "Hourly traffic"
++msgstr "Óránkénti forgalom"
++
++msgid "Monitor selected interfaces"
++msgstr "Kiválasztott interfészek figyelése"
++
++msgid "Monthly traffic"
++msgstr "Havi forgalom"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Adatbázis még nem lett beállítva. Engedélyezze egy vagy több interfész "
++"figyelését a VnStat beállításoknál."
++
++msgid "Restart VnStat"
++msgstr "VnStat újraíndítása"
++
++msgid "Summary display"
++msgstr "Összefoglaló nézet"
++
++msgid "Top 10 display"
++msgstr "Top 10 nézet"
++
++msgid "Update »"
++msgstr "Frissítés »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "VnStat grafikonok"
++
++msgid "VnStat Traffic Monitor"
++msgstr "VnStat Forgalom Figyelő"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStat egy hálózati forgalom figyelő alkalmazás Linux alá ami naplózza a "
++"kiválasztott interfész(ek) hálózati forgalmát."
++
++#~ msgid "The VnStat service has been restarted."
++#~ msgstr "A VnStat szolgáltatás újra lett índítva."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/it/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/it/vnstat.po
+new file mode 100644
+index 0000000..8cc6e5b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/it/vnstat.po
+@@ -0,0 +1,68 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-05-17 22:00+0200\n"
++"Last-Translator: coatto87 <coatto87@gmail.com>\n"
++"Language-Team: German\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Configuration"
++msgstr "Configurazione"
++
++msgid "Daily traffic"
++msgstr "Traffico giornaliero"
++
++msgid "Graphs"
++msgstr "Grafici"
++
++msgid "Hourly traffic"
++msgstr "Traffico orario"
++
++msgid "Monitor selected interfaces"
++msgstr "Monitora le interfacce selezionate"
++
++msgid "Monthly traffic"
++msgstr "Traffico mensile"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Non è ancora stato configurato un database. Vai nella configurazione di "
++"VnStat e abilita il monitoraggio per una o più interfacce."
++
++msgid "Restart VnStat"
++msgstr "Riavvia VnStat"
++
++msgid "Summary display"
++msgstr "Riassunto"
++
++msgid "Top 10 display"
++msgstr "Top 10 display"
++
++msgid "Update »"
++msgstr "Aggiorna"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "Grafici VnStat"
++
++msgid "VnStat Traffic Monitor"
++msgstr "Monitor del traffico VnStat"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStat è un monitor del traffico di rete per Linux che scrive un log per le "
++"interfacce selezionate."
++
++#~ msgid "The VnStat service has been restarted."
++#~ msgstr "Il servizio VnStat è stato riavviato."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/ja/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/ja/vnstat.po
+new file mode 100644
+index 0000000..8708c6f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/ja/vnstat.po
+@@ -0,0 +1,68 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-08-19 06:15+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: German\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: Pootle 2.0.4\n"
++
++msgid "Configuration"
++msgstr "設定"
++
++msgid "Daily traffic"
++msgstr "1日周期ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯"
++
++msgid "Graphs"
++msgstr "グラフ"
++
++msgid "Hourly traffic"
++msgstr "1時間周期ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯"
++
++msgid "Monitor selected interfaces"
++msgstr "モニターã™ã‚‹ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’é¸æŠž"
++
++msgid "Monthly traffic"
++msgstr "1月周期ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"データベースãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。VnStat設定ページã¸ç§»å‹•ã—ã€ï¼‘ã¤ä»¥ä¸Šã®ã‚¤ãƒ³"
++"ターフェースã®ãƒ¢ãƒ‹ã‚¿ãƒªãƒ³ã‚°ã‚’有効ã«ã—ã¦ãã ã•ã„。"
++
++msgid "Restart VnStat"
++msgstr "VnStatã‚’å†èµ·å‹•"
++
++msgid "Summary display"
++msgstr "サマリーを表示"
++
++msgid "Top 10 display"
++msgstr "トップ10を表示"
++
++msgid "Update »"
++msgstr "更新 »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "VnStat グラフ"
++
++msgid "VnStat Traffic Monitor"
++msgstr "VnStatトラフィックモニタ"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStatã¯é¸æŠžã—ãŸã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚’ロギングã™ã‚‹Linuxã®"
++"トラフィックモニターã§ã™ã€‚"
++
++#~ msgid "The VnStat service has been restarted."
++#~ msgstr "VnStatサービスã¯å†èµ·å‹•ã—ã¾ã—ãŸã€‚"
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/ms/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/ms/vnstat.po
+new file mode 100644
+index 0000000..04590ea
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/ms/vnstat.po
+@@ -0,0 +1,59 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2010-11-16 20:54+0100\n"
++"Last-Translator: <jow@openwrt.org>\n"
++"Language-Team: German\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Daily traffic"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Hourly traffic"
++msgstr ""
++
++msgid "Monitor selected interfaces"
++msgstr ""
++
++msgid "Monthly traffic"
++msgstr ""
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++
++msgid "Restart VnStat"
++msgstr ""
++
++msgid "Summary display"
++msgstr ""
++
++msgid "Top 10 display"
++msgstr ""
++
++msgid "Update »"
++msgstr ""
++
++msgid "VnStat"
++msgstr ""
++
++msgid "VnStat Graphs"
++msgstr ""
++
++msgid "VnStat Traffic Monitor"
++msgstr ""
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/no/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/no/vnstat.po
+new file mode 100644
+index 0000000..c1e94d2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/no/vnstat.po
+@@ -0,0 +1,58 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Configuration"
++msgstr "Konfigurasjon"
++
++msgid "Daily traffic"
++msgstr "Trafikk hver dag"
++
++msgid "Graphs"
++msgstr "Grafer"
++
++msgid "Hourly traffic"
++msgstr "Trafikk hver time"
++
++msgid "Monitor selected interfaces"
++msgstr "Overvåk valgte grensesnitt"
++
++msgid "Monthly traffic"
++msgstr "Trafikk hver måned"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Ingen database har blitt satt opp ennå. Gå til VnStat konfigurasjonen og "
++"aktiver overvåking for ett eller flere grensesnitt."
++
++msgid "Restart VnStat"
++msgstr "Omstart VnStat"
++
++msgid "Summary display"
++msgstr "Visning av sammendrag"
++
++msgid "Top 10 display"
++msgstr "Top 10 visning"
++
++msgid "Update »"
++msgstr "Oppdater »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "VnStat Grafer"
++
++msgid "VnStat Traffic Monitor"
++msgstr "VnStat Trafikk Monitor"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStat er en nettverks trafikk monitor for Linux som loggfører "
++"nettverks trafikk for de valgte grensesnitt."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/pl/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/pl/vnstat.po
+new file mode 100644
+index 0000000..5b0d8b0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/pl/vnstat.po
+@@ -0,0 +1,69 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-09-20 12:21+0200\n"
++"Last-Translator: Michał <wispwind@gmail.com>\n"
++"Language-Team: German\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Configuration"
++msgstr "Konfiguracja"
++
++msgid "Daily traffic"
++msgstr "Obciążenie dzienne"
++
++msgid "Graphs"
++msgstr "Wykresy"
++
++msgid "Hourly traffic"
++msgstr "Obciążenie godzinowe"
++
++msgid "Monitor selected interfaces"
++msgstr "Monitoruj wybrane interfejsy"
++
++msgid "Monthly traffic"
++msgstr "Obciążenie miesięczne"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Nie ustawiono żadnej bazy danych. Idź do konfiguracji VnStat i włącz "
++"monitorowanie dla jednego lub więcej interfejsów."
++
++msgid "Restart VnStat"
++msgstr "Restartuj VnStat"
++
++msgid "Summary display"
++msgstr "Podsumowanie"
++
++msgid "Top 10 display"
++msgstr "TOP 10"
++
++msgid "Update »"
++msgstr "Aktualizuj »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "Wykresy VnStat"
++
++msgid "VnStat Traffic Monitor"
++msgstr "Monitor obciążenia VnStat"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStat to aplikacja monitorująca ruch sieciowy w Linuxie, który utrzymuje "
++"loga ruchu sieciowego dla określonych interfejsów."
++
++#~ msgid "The VnStat service has been restarted."
++#~ msgstr "Usługa VnStat została uruchomiona ponownie."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/pt-br/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/pt-br/vnstat.po
+new file mode 100644
+index 0000000..47cf09a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/pt-br/vnstat.po
+@@ -0,0 +1,68 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-11 21:02+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: German\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Configuration"
++msgstr "Configuração"
++
++msgid "Daily traffic"
++msgstr "Tráfego diário"
++
++msgid "Graphs"
++msgstr "Gráficos"
++
++msgid "Hourly traffic"
++msgstr "Tráfego horário"
++
++msgid "Monitor selected interfaces"
++msgstr "Monitore as interfaces selecionadas"
++
++msgid "Monthly traffic"
++msgstr "Tráfego mensal"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Ainda nenhum banco de dados foi definido. Vá para a configuração do VnStat "
++"ehabilite o monitoramento para um ou mais interfaces."
++
++msgid "Restart VnStat"
++msgstr "Reiniciar VnStat"
++
++msgid "Summary display"
++msgstr "Tela de resumo"
++
++msgid "Top 10 display"
++msgstr "Tela dos 10 mais"
++
++msgid "Update »"
++msgstr "Atualizar »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "Gráficos VnStat"
++
++msgid "VnStat Traffic Monitor"
++msgstr "Monitor de Tráfego VnStat"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStat é um monitor de tráfego de rede para Linux que mantém um registro do "
++"tráfego para a(s) interface(s) selecionada(s)."
++
++#~ msgid "The VnStat service has been restarted."
++#~ msgstr "O serviço VnStat foi reiniciado."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/pt/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/pt/vnstat.po
+new file mode 100644
+index 0000000..7297890
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/pt/vnstat.po
+@@ -0,0 +1,65 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-05-31 16:25+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: German\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Configuration"
++msgstr "Configuração"
++
++msgid "Daily traffic"
++msgstr "Tráfego Diário"
++
++msgid "Graphs"
++msgstr "Gráficos"
++
++msgid "Hourly traffic"
++msgstr "Tráfego por hora"
++
++msgid "Monitor selected interfaces"
++msgstr "Monitorizar as interfaces selecionadas"
++
++msgid "Monthly traffic"
++msgstr "Tráfego mensal"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Ainda não foi configurada uma base de dados. Vá até à configuração do VnStat "
++"e ative a monitorização para uma ou mais interfaces."
++
++msgid "Restart VnStat"
++msgstr "Reiniciar VnStat"
++
++msgid "Summary display"
++msgstr "Mostrar resumo"
++
++msgid "Top 10 display"
++msgstr "Mostrar Top 10"
++
++msgid "Update »"
++msgstr "Atualizar »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "Gráficos VnStat"
++
++msgid "VnStat Traffic Monitor"
++msgstr "Monitor de Tráfego VnStat"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"O VnStat é um monitor de tráfego para Linux que mantêm um registo do tráfego "
++"para as interface (s) selecionadas."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/ro/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/ro/vnstat.po
+new file mode 100644
+index 0000000..093182b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/ro/vnstat.po
+@@ -0,0 +1,69 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-07 16:01+0200\n"
++"Last-Translator: Daniel <daniel.petre@pitesti.rcs-rds.ro>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Configuration"
++msgstr "Configurare"
++
++msgid "Daily traffic"
++msgstr "Trafic zilnic"
++
++msgid "Graphs"
++msgstr "Grafice"
++
++msgid "Hourly traffic"
++msgstr "Trafic la fiecare ora"
++
++msgid "Monitor selected interfaces"
++msgstr "Monitorizeaza interfetele selectate"
++
++msgid "Monthly traffic"
++msgstr "Trafic lunar"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Nu a fost setata nici o baza de date. La configurarea VnStat se poate activa "
++"monitoriza pentru una sau mai multe interfete."
++
++msgid "Restart VnStat"
++msgstr "Restarteaza VnStat"
++
++msgid "Summary display"
++msgstr "Afiseaza sumarul"
++
++msgid "Top 10 display"
++msgstr "Afiseaza top 10"
++
++msgid "Update »"
++msgstr "Updateaza »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "Graficele VnStat"
++
++msgid "VnStat Traffic Monitor"
++msgstr "Monitorul de trafic VnStat"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"Vnstat este un monitor de retea ce pastreaza detalii legate de traficul pe "
++"interfetele selectate."
++
++#~ msgid "The VnStat service has been restarted."
++#~ msgstr "Serviciul VnStat a fost restartat."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/ru/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/ru/vnstat.po
+new file mode 100644
+index 0000000..5254ca1
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/ru/vnstat.po
+@@ -0,0 +1,71 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: vnstat\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2012-08-15 11:48+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Configuration"
++msgstr "КонфигурациÑ"
++
++msgid "Daily traffic"
++msgstr "Трафик за день"
++
++msgid "Graphs"
++msgstr "Графики"
++
++msgid "Hourly traffic"
++msgstr "Трафик за чаÑ"
++
++msgid "Monitor selected interfaces"
++msgstr "Собирать ÑтатиÑтику на выбранных интерфейÑах"
++
++msgid "Monthly traffic"
++msgstr "Трафик за меÑÑц"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"База данных не наÑтроена. Перейдите в конфигурацию и укажите интерфейÑÑ‹ Ð´Ð»Ñ "
++"Ñбора ÑтатиÑтики."
++
++msgid "Restart VnStat"
++msgstr "ПерезапуÑтить VnStat"
++
++msgid "Summary display"
++msgstr "Ð¡Ð²Ð¾Ð´Ð½Ð°Ñ ÑтатиÑтика"
++
++msgid "Top 10 display"
++msgstr "ПоÑледние 10"
++
++msgid "Update »"
++msgstr "Обновить »"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "Графики VnStat"
++
++msgid "VnStat Traffic Monitor"
++msgstr "Монитор трафика VnStat"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStat - монитор Ñетевого трафика Ð´Ð»Ñ Linux, Ñобирающий ÑтатиÑтику по "
++"выбранным интерфейÑам."
++
++#~ msgid "The VnStat service has been restarted."
++#~ msgstr "VnStat ÑÐµÑ€Ð²Ð¸Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑ‰ÐµÐ½."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/sk/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/sk/vnstat.po
+new file mode 100644
+index 0000000..5926ecf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/sk/vnstat.po
+@@ -0,0 +1,58 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Daily traffic"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Hourly traffic"
++msgstr ""
++
++msgid "Monitor selected interfaces"
++msgstr ""
++
++msgid "Monthly traffic"
++msgstr ""
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++
++msgid "Restart VnStat"
++msgstr ""
++
++msgid "Summary display"
++msgstr ""
++
++msgid "Top 10 display"
++msgstr ""
++
++msgid "Update »"
++msgstr ""
++
++msgid "VnStat"
++msgstr ""
++
++msgid "VnStat Graphs"
++msgstr ""
++
++msgid "VnStat Traffic Monitor"
++msgstr ""
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/sv/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/sv/vnstat.po
+new file mode 100644
+index 0000000..113c4d2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/sv/vnstat.po
+@@ -0,0 +1,59 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Daily traffic"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Hourly traffic"
++msgstr ""
++
++msgid "Monitor selected interfaces"
++msgstr ""
++
++msgid "Monthly traffic"
++msgstr ""
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++
++msgid "Restart VnStat"
++msgstr ""
++
++msgid "Summary display"
++msgstr ""
++
++msgid "Top 10 display"
++msgstr ""
++
++msgid "Update »"
++msgstr ""
++
++msgid "VnStat"
++msgstr ""
++
++msgid "VnStat Graphs"
++msgstr ""
++
++msgid "VnStat Traffic Monitor"
++msgstr ""
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/templates/vnstat.pot b/feeds/luci/applications/luci-app-vnstat/po/templates/vnstat.pot
+new file mode 100644
+index 0000000..4dccf05
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/templates/vnstat.pot
+@@ -0,0 +1,51 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Daily traffic"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Hourly traffic"
++msgstr ""
++
++msgid "Monitor selected interfaces"
++msgstr ""
++
++msgid "Monthly traffic"
++msgstr ""
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++
++msgid "Restart VnStat"
++msgstr ""
++
++msgid "Summary display"
++msgstr ""
++
++msgid "Top 10 display"
++msgstr ""
++
++msgid "Update »"
++msgstr ""
++
++msgid "VnStat"
++msgstr ""
++
++msgid "VnStat Graphs"
++msgstr ""
++
++msgid "VnStat Traffic Monitor"
++msgstr ""
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/tr/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/tr/vnstat.po
+new file mode 100644
+index 0000000..5e001c9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/tr/vnstat.po
+@@ -0,0 +1,58 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Daily traffic"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Hourly traffic"
++msgstr ""
++
++msgid "Monitor selected interfaces"
++msgstr ""
++
++msgid "Monthly traffic"
++msgstr ""
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++
++msgid "Restart VnStat"
++msgstr ""
++
++msgid "Summary display"
++msgstr ""
++
++msgid "Top 10 display"
++msgstr ""
++
++msgid "Update »"
++msgstr ""
++
++msgid "VnStat"
++msgstr ""
++
++msgid "VnStat Graphs"
++msgstr ""
++
++msgid "VnStat Traffic Monitor"
++msgstr ""
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/uk/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/uk/vnstat.po
+new file mode 100644
+index 0000000..5f9d257
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/uk/vnstat.po
+@@ -0,0 +1,67 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-13 15:33+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Configuration"
++msgstr "КонфігураціÑ"
++
++msgid "Daily traffic"
++msgstr "СпиÑок щоденного трафіку"
++
++msgid "Graphs"
++msgstr "Графіки"
++
++msgid "Hourly traffic"
++msgstr "СпиÑок погодинного трафіку"
++
++msgid "Monitor selected interfaces"
++msgstr "Моніторинг обраних інтерфейÑів"
++
++msgid "Monthly traffic"
++msgstr "СпиÑок щоміÑÑчного трафіку"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++"Ðе була Ñтворена база даних. Перейдіть до вкладки конфігурації VnStat та "
++"увімкніть моніторинг Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ або декількох інтерфейÑів."
++
++msgid "Restart VnStat"
++msgstr "ПерезапуÑк VnStat"
++
++#, fuzzy
++msgid "Summary display"
++msgstr "Загальна таблицÑ"
++
++msgid "Top 10 display"
++msgstr "СпиÑок Топ-10"
++
++msgid "Update »"
++msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Â»"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "Графіки VnStat"
++
++msgid "VnStat Traffic Monitor"
++msgstr "Моніторінг трафіку VnStat"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
++"VnStat - монітор мережного трафіку Ð´Ð»Ñ Linux, Ñкий веде журнал мережевого "
++"трафіку Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð½Ð¾Ð³Ð¾ інтерфейÑу або декількох інтерфейÑів."
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/vi/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/vi/vnstat.po
+new file mode 100644
+index 0000000..0303835
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/vi/vnstat.po
+@@ -0,0 +1,59 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2010-11-16 20:55+0100\n"
++"Last-Translator: <jow@openwrt.org>\n"
++"Language-Team: German\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Daily traffic"
++msgstr ""
++
++msgid "Graphs"
++msgstr ""
++
++msgid "Hourly traffic"
++msgstr ""
++
++msgid "Monitor selected interfaces"
++msgstr ""
++
++msgid "Monthly traffic"
++msgstr ""
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr ""
++
++msgid "Restart VnStat"
++msgstr ""
++
++msgid "Summary display"
++msgstr ""
++
++msgid "Top 10 display"
++msgstr ""
++
++msgid "Update »"
++msgstr ""
++
++msgid "VnStat"
++msgstr ""
++
++msgid "VnStat Graphs"
++msgstr ""
++
++msgid "VnStat Traffic Monitor"
++msgstr ""
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/zh-cn/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/zh-cn/vnstat.po
+new file mode 100644
+index 0000000..68e4905
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/zh-cn/vnstat.po
+@@ -0,0 +1,61 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-08 14:05+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: German\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Configuration"
++msgstr "é…ç½®"
++
++msgid "Daily traffic"
++msgstr "æµé‡æ—¥æŠ¥"
++
++msgid "Graphs"
++msgstr "图表"
++
++msgid "Hourly traffic"
++msgstr "æµé‡æ—¶æŠ¥"
++
++msgid "Monitor selected interfaces"
++msgstr "监控选择的接å£"
++
++msgid "Monthly traffic"
++msgstr "æµé‡æœˆæŠ¥"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr "没有创建统计数æ®ã€‚ 去VnStaté…置,并å¯åŠ¨ç›‘控一个或多个接å£ã€‚"
++
++msgid "Restart VnStat"
++msgstr "é‡ç½®VnStat"
++
++msgid "Summary display"
++msgstr "摘è¦æ˜¾ç¤º"
++
++msgid "Top 10 display"
++msgstr "显示å‰10"
++
++msgid "Update »"
++msgstr "æ›´æ–°"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "VnStat图表"
++
++msgid "VnStat Traffic Monitor"
++msgstr "VNStatæµé‡ç›‘控"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr "vnstat是一个网络æµé‡ç›‘控器,用于Linuxä¿ç•™æ‰€é€‰æŽ¥å£çš„网络æµé‡æ—¥å¿—。"
+diff --git a/feeds/luci/applications/luci-app-vnstat/po/zh-tw/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/zh-tw/vnstat.po
+new file mode 100644
+index 0000000..261747a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/po/zh-tw/vnstat.po
+@@ -0,0 +1,61 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 10:52+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Configuration"
++msgstr "設定"
++
++msgid "Daily traffic"
++msgstr "æ¯æ—¥æµé‡"
++
++msgid "Graphs"
++msgstr "圖表"
++
++msgid "Hourly traffic"
++msgstr "æ¯å°æ™‚æµé‡"
++
++msgid "Monitor selected interfaces"
++msgstr "監控é¸åˆ°çš„介é¢"
++
++msgid "Monthly traffic"
++msgstr "æ¯æœˆæµé‡"
++
++msgid ""
++"No database has been set up yet. Go to the VnStat configuration and enable "
++"monitoring for one or more interfaces."
++msgstr "尚無任何資料庫被設定. 進入VnStaté‡å°æŸä¸€å€‹æˆ–多個介é¢è¨­å®šä¸¦å•Ÿç”¨ç›£è¦–."
++
++msgid "Restart VnStat"
++msgstr "從新啟動 VnStat"
++
++msgid "Summary display"
++msgstr "顯示概è¦"
++
++msgid "Top 10 display"
++msgstr "顯示å‰10å"
++
++msgid "Update »"
++msgstr "æ›´æ–°"
++
++msgid "VnStat"
++msgstr "VnStat"
++
++msgid "VnStat Graphs"
++msgstr "VnStat圖表"
++
++msgid "VnStat Traffic Monitor"
++msgstr "VnStatæµé‡ç›£è¦–"
++
++msgid ""
++"VnStat is a network traffic monitor for Linux that keeps a log of network "
++"traffic for the selected interface(s)."
++msgstr " VnStat是一個é‡å°Linux上的網路æµé‡ç›£è¦–å¯é”到ä¿å­˜ç‰¹å®šä»‹é¢çš„æµé‡ç´€éŒ„"
+diff --git a/feeds/luci/applications/luci-app-vnstat/root/etc/uci-defaults/luci-vnstat b/feeds/luci/applications/luci-app-vnstat/root/etc/uci-defaults/luci-vnstat
+new file mode 100755
+index 0000000..fa204b3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-vnstat/root/etc/uci-defaults/luci-vnstat
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@vnstat[-1]
++ add ucitrack vnstat
++ set ucitrack.@vnstat[-1].init=vnstat
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-voice-core/Makefile b/feeds/luci/applications/luci-app-voice-core/Makefile
+new file mode 100644
+index 0000000..32c476c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Voice Software (Core)
++LUCI_DEPENDS:=@BROKEN
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-voice-core/luasrc/controller/luci_voice.lua b/feeds/luci/applications/luci-app-voice-core/luasrc/controller/luci_voice.lua
+new file mode 100644
+index 0000000..b37018d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/luasrc/controller/luci_voice.lua
+@@ -0,0 +1,21 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.luci_voice", package.seeall)
++
++function index()
++ local e
++
++ e = entry({"admin", "voice"}, template("luci_voice/index") , _("Voice"), 90)
++ e.index = true
++
++ e = entry({"mini", "voice"}, template("luci_voice/index"), _("Voice"), 90)
++ e.index = true
++
++ e = entry({"mini", "voice", "phones"}, template("luci_voice/phone_index"), _("Phones"), 90)
++ e.index = true
++
++ e = entry({"admin", "voice", "phones"}, template("luci_voice/phone_index"), _("Phones"), 90)
++ e.index = true
++
++end
+diff --git a/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/index.htm b/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/index.htm
+new file mode 100644
+index 0000000..e14862e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/index.htm
+@@ -0,0 +1,16 @@
++<%#
++ Copyright 2009 Daniel Dickinson
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content">Voice</h2>
++<p>Here you can control OpenWRT voice-related settings and see
++ voice-related information from OpenWRT</p>
++<p>In particular Asterisk configuration and information is displayed
++ here, as well as diagnostics that specifically apply to voice but are
++ not general networking diagnostics (e.g. includes SIP device scans, but not
++ ping tests). Includes PSTN phones as well as VoIP and possibly
++ non-telephony related options.
++</p>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/phone_index.htm b/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/phone_index.htm
+new file mode 100644
+index 0000000..c4466cb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/phone_index.htm
+@@ -0,0 +1,12 @@
++<%#
++ Copyright 2009 Daniel Dickinson
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content">Phones</h2>
++<p>Here you can control phone configuration and information in OpenWRT</p>
++<p>You can control the setup of phone clients and servers and see
++ information such as diagnostics related to phone devices from this menu.
++</p>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/ca/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/ca/voice_core.po
+new file mode 100644
+index 0000000..0686209
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/ca/voice_core.po
+@@ -0,0 +1,18 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-29 01:58+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Telèfons"
++
++msgid "Voice"
++msgstr "Veu"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/cs/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/cs/voice_core.po
+new file mode 100644
+index 0000000..e4eae35
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/cs/voice_core.po
+@@ -0,0 +1,21 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-29 21:47+0200\n"
++"Last-Translator: Astran <martin.hromadko@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Telefony"
++
++msgid "Voice"
++msgstr "Hlas"
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "Telefony"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/de/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/de/voice_core.po
+new file mode 100644
+index 0000000..2a03b63
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/de/voice_core.po
+@@ -0,0 +1,18 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-28 22:20+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Telefone"
++
++msgid "Voice"
++msgstr "Sprache"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/el/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/el/voice_core.po
+new file mode 100644
+index 0000000..01abb41
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/el/voice_core.po
+@@ -0,0 +1,18 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-02-16 19:15+0200\n"
++"Last-Translator: Jinxcat <bikkit@gmail.com>\n"
++"Language-Team: none\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Phones"
++msgstr "Τηλέφωνα"
++
++msgid "Voice"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/en/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/en/voice_core.po
+new file mode 100644
+index 0000000..297f873
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/en/voice_core.po
+@@ -0,0 +1,23 @@
++# Voice Core.
++# Copyright (C) 2009 Daniel Dickinson
++# Daniel Dickinson <crazycshore@gmail.com>, 2009.
++#
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2009-07-16 22:19-0400\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Phones"
++msgstr "Phones"
++
++msgid "Voice"
++msgstr ""
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "Phones"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/es/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/es/voice_core.po
+new file mode 100644
+index 0000000..74e2c23
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/es/voice_core.po
+@@ -0,0 +1,21 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-07-28 23:17+0200\n"
++"Last-Translator: Daniel <danips@gmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Teléfonos"
++
++msgid "Voice"
++msgstr "Voz"
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "l_v_adminphones"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/fr/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/fr/voice_core.po
+new file mode 100644
+index 0000000..71ef062
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/fr/voice_core.po
+@@ -0,0 +1,21 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-11-06 16:09+0200\n"
++"Last-Translator: hogsim <hogsim@gmail.com>\n"
++"Language-Team: none\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Téléphones"
++
++msgid "Voice"
++msgstr "Voix"
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "Téléphones"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/he/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/he/voice_core.po
+new file mode 100644
+index 0000000..74440e3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/he/voice_core.po
+@@ -0,0 +1,22 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-10 03:44+0200\n"
++"Last-Translator: Snoof <sagim9@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "טלפוני×"
++
++msgid "Voice"
++msgstr "קול"
++
++# מה בדיוק ×ž×ª×¨×’×ž×™× ×›×ן? ×× ×–×” phones ××– ×”×ª×¨×’×•× ×”×•× ×˜×œ×¤×•× ×™×. ×× ×–×” l_v_adminphones ××– ×–×” מונח טכני וצריך להש×יר ×ותו ×œ×œ× ×©×™× ×•×™
++#~ msgid "l_v_adminphones"
++#~ msgstr "טלפוני×"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/hu/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/hu/voice_core.po
+new file mode 100644
+index 0000000..07eaa14
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/hu/voice_core.po
+@@ -0,0 +1,21 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-01 09:34+0200\n"
++"Last-Translator: juhosg <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Phones"
++msgstr "Telefonok"
++
++msgid "Voice"
++msgstr "Hang"
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "l_v_adminphones"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/it/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/it/voice_core.po
+new file mode 100644
+index 0000000..4d22ff0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/it/voice_core.po
+@@ -0,0 +1,21 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-02-03 14:00+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Telefoni"
++
++msgid "Voice"
++msgstr "Voce"
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "l_v_adminphones"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/ja/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/ja/voice_core.po
+new file mode 100644
+index 0000000..c7e60e2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/ja/voice_core.po
+@@ -0,0 +1,18 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Phones"
++msgstr "電話"
++
++msgid "Voice"
++msgstr ""
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "l_v_adminphones"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/ms/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/ms/voice_core.po
+new file mode 100644
+index 0000000..a866bec
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/ms/voice_core.po
+@@ -0,0 +1,14 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Phones"
++msgstr ""
++
++msgid "Voice"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/no/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/no/voice_core.po
+new file mode 100644
+index 0000000..a0149da
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/no/voice_core.po
+@@ -0,0 +1,14 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Phones"
++msgstr "Telefoner"
++
++msgid "Voice"
++msgstr "Voice"
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "Admin Telefoner"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/pl/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/pl/voice_core.po
+new file mode 100644
+index 0000000..39950f8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/pl/voice_core.po
+@@ -0,0 +1,22 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-08-24 07:03+0200\n"
++"Last-Translator: goodgod261 <goodgod261@wp.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Telefony"
++
++msgid "Voice"
++msgstr "GÅ‚os"
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "l_v_adminphones"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/pt-br/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/pt-br/voice_core.po
+new file mode 100644
+index 0000000..18cab72
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/pt-br/voice_core.po
+@@ -0,0 +1,21 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-07-05 06:44+0200\n"
++"Last-Translator: rafaelff1 <rafael.f.f1@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Telefones"
++
++msgid "Voice"
++msgstr "Voz"
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "l_v_adminphones"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/pt/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/pt/voice_core.po
+new file mode 100644
+index 0000000..07d6093
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/pt/voice_core.po
+@@ -0,0 +1,18 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-05-01 00:34+0200\n"
++"Last-Translator: pedromrgoncalves <pedromrgoncalves@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Telefones"
++
++msgid "Voice"
++msgstr "Voz"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/ro/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/ro/voice_core.po
+new file mode 100644
+index 0000000..1776a51
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/ro/voice_core.po
+@@ -0,0 +1,22 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-09-25 19:14+0200\n"
++"Last-Translator: Mihai <WyRwSyK@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Telefoane"
++
++msgid "Voice"
++msgstr "Voce"
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "l_v_adminphones"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/ru/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/ru/voice_core.po
+new file mode 100644
+index 0000000..b6631df
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/ru/voice_core.po
+@@ -0,0 +1,24 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: voice_core\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2012-08-15 11:23+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Phones"
++msgstr "Телефоны"
++
++msgid "Voice"
++msgstr "ГолоÑ"
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "l_v_adminphones"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/sk/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/sk/voice_core.po
+new file mode 100644
+index 0000000..9c30581
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/sk/voice_core.po
+@@ -0,0 +1,15 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Phones"
++msgstr ""
++
++msgid "Voice"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/sv/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/sv/voice_core.po
+new file mode 100644
+index 0000000..803726a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/sv/voice_core.po
+@@ -0,0 +1,18 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-04-28 06:14+0200\n"
++"Last-Translator: Umeaboy <kristoffer.grundstrom1983@gmail.com>\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Telefoner"
++
++msgid "Voice"
++msgstr "Röst"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/templates/voice_core.pot b/feeds/luci/applications/luci-app-voice-core/po/templates/voice_core.pot
+new file mode 100644
+index 0000000..64c93eb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/templates/voice_core.pot
+@@ -0,0 +1,8 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Phones"
++msgstr ""
++
++msgid "Voice"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/tr/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/tr/voice_core.po
+new file mode 100644
+index 0000000..642538e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/tr/voice_core.po
+@@ -0,0 +1,18 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-10-11 22:25+0200\n"
++"Last-Translator: vincenzo <tayfun_ozturk@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: tr\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: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "Telefonlar"
++
++msgid "Voice"
++msgstr "Ses"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/uk/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/uk/voice_core.po
+new file mode 100644
+index 0000000..4886d72
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/uk/voice_core.po
+@@ -0,0 +1,22 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-12-29 12:56+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Phones"
++msgstr "Телефони"
++
++msgid "Voice"
++msgstr "ГолоÑ"
++
++#~ msgid "l_v_adminphones"
++#~ msgstr "l_v_adminphones"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/vi/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/vi/voice_core.po
+new file mode 100644
+index 0000000..3e45434
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/vi/voice_core.po
+@@ -0,0 +1,15 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Phones"
++msgstr ""
++
++msgid "Voice"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/zh-cn/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/zh-cn/voice_core.po
+new file mode 100644
+index 0000000..0978889
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/zh-cn/voice_core.po
+@@ -0,0 +1,18 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-08 13:41+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "è¯æœº"
++
++msgid "Voice"
++msgstr "语音"
+diff --git a/feeds/luci/applications/luci-app-voice-core/po/zh-tw/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/zh-tw/voice_core.po
+new file mode 100644
+index 0000000..e1bbf7a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-core/po/zh-tw/voice_core.po
+@@ -0,0 +1,18 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 10:41+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Phones"
++msgstr "電話"
++
++msgid "Voice"
++msgstr "語音"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/Makefile b/feeds/luci/applications/luci-app-voice-diag/Makefile
+new file mode 100644
+index 0000000..2d47918
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Voice Software (Diagnostics)
++LUCI_DEPENDS:=+luci-app-diag-devinfo @BROKEN
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-voice-diag/luasrc/controller/luci_voice/luci_voice_diag.lua b/feeds/luci/applications/luci-app-voice-diag/luasrc/controller/luci_voice/luci_voice_diag.lua
+new file mode 100644
+index 0000000..16a79d9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/luasrc/controller/luci_voice/luci_voice_diag.lua
+@@ -0,0 +1,12 @@
++-- Copyright 2009 Daniel Dickinson
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.luci_voice.luci_voice_diag", package.seeall)
++
++function index()
++ local e
++
++ e = entry({"admin", "voice", "diag"}, template("luci_voice/diag_index"), _("Diagnostics"), 90)
++ e.index = true
++ e.dependent = true
++end
+diff --git a/feeds/luci/applications/luci-app-voice-diag/luasrc/view/luci_voice/diag_index.htm b/feeds/luci/applications/luci-app-voice-diag/luasrc/view/luci_voice/diag_index.htm
+new file mode 100644
+index 0000000..e324fab
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/luasrc/view/luci_voice/diag_index.htm
+@@ -0,0 +1,10 @@
++<%#
++ Copyright 2009 Daniel Dickinson
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content"><%:Diagnostics%></h2>
++<p><%:Under this menu are options that allow you to configure and perform tests on the voice operations of your system. These are known as diagnostics.%></p>
++<p><%:The diagnostics available on your device depend on the modules that you have installed.%></p>
++<%+footer%>
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/ca/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/ca/voice_diag.po
+new file mode 100644
+index 0000000..0396100
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/ca/voice_diag.po
+@@ -0,0 +1,30 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-29 02:00+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Diagnostics"
++msgstr "Diagnòstics"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Els diagnòstics disponibles en el vostre dispositiu depenen dels mòduls que "
++"teniu instal·lats."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"En aquest menú estan opcions que us permeten configurar i realitzar proves "
++"en les operacions de veu del vostre sistema. Aquestes es coneixen com "
++"diagnòstics."
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/cs/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/cs/voice_diag.po
+new file mode 100644
+index 0000000..4939d20
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/cs/voice_diag.po
+@@ -0,0 +1,29 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Diagnostics"
++msgstr "Diagnostika"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Diagnostiky, dostupné na vašem zařízení, závisí na modulech, které máte "
++"nainstalovány."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"Pod tímto menu se nachází možnosti, které vám umožní nastavovat a provádět "
++"testy hlasových operací vašeho systému. Tyto jsou známy pod názvem "
++"diagnostika."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "Diagnostika"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/de/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/de/voice_diag.po
+new file mode 100644
+index 0000000..f60dc08
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/de/voice_diag.po
+@@ -0,0 +1,29 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-09-08 15:21+0200\n"
++"Last-Translator: Manuel <freifunk@somakoma.de>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Diagnostics"
++msgstr "Diagnose"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Welche Diagnosetools auf diesem System verfügbar sind hängt davon ab, welche "
++"Module installiert sind."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"Unter diesem Menüpunkt können Diagnosetools für sprachbezogene Dienste "
++"konfiguriert und ausgeführt werden."
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/el/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/el/voice_diag.po
+new file mode 100644
+index 0000000..4ff4f86
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/el/voice_diag.po
+@@ -0,0 +1,33 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-03-18 17:15+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: none\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Diagnostics"
++msgstr "Διαγνωστικά"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Τα διαγνωστικά που είναι διαθέσιμα για την συσκευή σας, εξαÏτώνται από τα "
++"αÏθÏώματα που έχετε εγκατεστημένα."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"Κάτω από αυτό το Î¼ÎµÎ½Î¿Ï Î²Ïίσκονται επιλογές που σας επιτÏέπουν να "
++"παÏαμετÏοποιήσετε και να Ï€Ïαγματοποιήσετε δοκιμές στις φωνητικές λειτουÏγίες "
++"του συστήματός σας. Είναι γνωστές ως διαγνωστικά."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "l_v_d_admindiag"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/en/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/en/voice_diag.po
+new file mode 100644
+index 0000000..12bb459
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/en/voice_diag.po
+@@ -0,0 +1,34 @@
++# Voice Diagnostics.
++# Copyright (C) 2009 Daniel Dickinson
++# Daniel Dickinson <crazycshore@gmail.com>, 2009.
++#
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2009-07-16 22:26-0400\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Diagnostics"
++msgstr "Diagnostics"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "Diagnostics"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/es/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/es/voice_diag.po
+new file mode 100644
+index 0000000..f2f4da2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/es/voice_diag.po
+@@ -0,0 +1,33 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-16 00:58+0200\n"
++"Last-Translator: Jose <jarre2_es_jose@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Diagnostics"
++msgstr "Diagnósticos"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Los tipos de diagnósticos disponibles en el dispositivo dependen de los "
++"módulos que ha instalado."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"En este menú hay opciones que permite realizar pruebas de configuración y "
++"funcionamiento de las operaciones de voz en su sistema. Estas opciones se "
++"conocen como diagósticos."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "l_v_d_admindiag"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/fr/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/fr/voice_diag.po
+new file mode 100644
+index 0000000..c550f06
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/fr/voice_diag.po
+@@ -0,0 +1,33 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-01-15 07:08+0200\n"
++"Last-Translator: desillu <ledesillusionniste@hotmail.com>\n"
++"Language-Team: none\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Diagnostics"
++msgstr "Diagnostics"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Les diagnostics disponibles pour votre périphérique dépendent des modules "
++"que vous avez installé."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"Ce menu contient des options vous permettant de configurer et lancer des "
++"tests sur les fonctions vocales de votre système. Ils sont nommés "
++"diagnostics."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "l_v_d_admindiag"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/he/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/he/voice_diag.po
+new file mode 100644
+index 0000000..3cd1c9f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/he/voice_diag.po
+@@ -0,0 +1,22 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/hu/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/hu/voice_diag.po
+new file mode 100644
+index 0000000..79d2379
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/hu/voice_diag.po
+@@ -0,0 +1,30 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Diagnostics"
++msgstr "Diagnosztika"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Az eszközön elérhető diagnosztikai lehetőségek a telepített összetevőktől "
++"függenek."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"Ez alatt a menüpont alatt olyan lehetőségek vannak, amelyek lehetővé teszik, "
++"hogy beállítsa és tesztelje az eszköz hangrendszerének a működését. Ezek "
++"diagnosztikaként ismertek."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "l_v_d_admindiag"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/it/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/it/voice_diag.po
+new file mode 100644
+index 0000000..620aedf
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/it/voice_diag.po
+@@ -0,0 +1,30 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-02-03 14:13+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Diagnostics"
++msgstr "Diagnostiche"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Le funzioni di diagnostica disponibili sul dispositivo dipendono i moduli "
++"che sono stati installati."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"In questo menu ci sono delle opzioni che consentono di configurare ed "
++"eseguire test sulle operazioni vocali del sistema. Questi sono noti come "
++"diagnostica."
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/ja/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/ja/voice_diag.po
+new file mode 100644
+index 0000000..715f411
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/ja/voice_diag.po
+@@ -0,0 +1,22 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/ms/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/ms/voice_diag.po
+new file mode 100644
+index 0000000..bf65c14
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/ms/voice_diag.po
+@@ -0,0 +1,21 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/no/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/no/voice_diag.po
+new file mode 100644
+index 0000000..de7aaf2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/no/voice_diag.po
+@@ -0,0 +1,25 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Diagnostics"
++msgstr "Diagnostikk"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Diagnostikk tilgjengelig på denne enheten avhenger av hvilken moduler som er "
++"installert."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"Under denne meny finner du instillinger som gjør det mulig å konfigurere og "
++"utføre 'Voice' operasjoner på systemet ditt. Dette er kjent som diagnostikk."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "Administrasjon Diagnostikk"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/pl/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/pl/voice_diag.po
+new file mode 100644
+index 0000000..cb19e22
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/pl/voice_diag.po
+@@ -0,0 +1,33 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-09-20 12:16+0200\n"
++"Last-Translator: Michał <wispwind@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Diagnostics"
++msgstr "Diagnostyka"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Diagnostyka dostępna na Twoim urządzeniu zależna jest od zainstalowanych "
++"modułów."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"To menu zawiera opcje pozwalajÄ…ce na konfiguracje i testowanie operacji "
++"głosowych w Twoim systemie. Opcje te nazwamy Diagnostyką."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "l_v_d_admindiag"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/pt-br/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/pt-br/voice_diag.po
+new file mode 100644
+index 0000000..c5d426d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/pt-br/voice_diag.po
+@@ -0,0 +1,32 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-11 20:31+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Diagnostics"
++msgstr "Diagnósticos"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Os diagnósticos disponíveis em seu dispositivo dependem dos módulos que você "
++"instalou."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"Neste menu existem opções que permite a configuração e execução de testes "
++"nas operações de voz em seu sistema. Estas são conhecidas como diagósticos."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "l_v_d_admindiag"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/pt/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/pt/voice_diag.po
+new file mode 100644
+index 0000000..5162c84
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/pt/voice_diag.po
+@@ -0,0 +1,29 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-06-01 00:00+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Diagnostics"
++msgstr "Diagnósticos"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Os diagnósticos disponiveis no dispositivo dependem dos módulos que tem "
++"instalados."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"Neste menu há opções que lhe permitem configurar e executar testes nas "
++"operações de voz do seu sistema. Estes são conhecidos como diagnósticos."
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/ro/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/ro/voice_diag.po
+new file mode 100644
+index 0000000..e6ee682
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/ro/voice_diag.po
+@@ -0,0 +1,33 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2011-10-07 16:50+0200\n"
++"Last-Translator: Daniel <daniel.petre@pitesti.rcs-rds.ro>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Diagnostics"
++msgstr "Diagnosticuri"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"Diagnosticurile disponibile pe dispozitivul tau depind de modulele instalate."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"In acest menu sunt optiuni care-ti permit sa configurezi si sa testezi "
++"diferite operatiuni de voce pe sistemul tau. Acestea sunt denumite "
++"diagnostice."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "l_v_d_admindiag"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/ru/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/ru/voice_diag.po
+new file mode 100644
+index 0000000..5c98de0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/ru/voice_diag.po
+@@ -0,0 +1,33 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: voice_diag\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2012-08-15 11:22+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Diagnostics"
++msgstr "ДиагноÑтика"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr "ДоÑтупные виды диагноÑтики завиÑÑÑ‚ от уÑтановленных модулей."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"Ð’ данном меню ÑодержатÑÑ Ð¾Ð¿Ñ†Ð¸Ð¸, которые позволÑÑŽÑ‚ вам протеÑтировать "
++"голоÑовые Ñлужбы вашей ÑиÑтемы. Это извеÑтно как \"диагноÑтика\"."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "l_v_d_admindiag"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/sk/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/sk/voice_diag.po
+new file mode 100644
+index 0000000..874e11f
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/sk/voice_diag.po
+@@ -0,0 +1,22 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/sv/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/sv/voice_diag.po
+new file mode 100644
+index 0000000..5caf949
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/sv/voice_diag.po
+@@ -0,0 +1,23 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/templates/voice_diag.pot b/feeds/luci/applications/luci-app-voice-diag/po/templates/voice_diag.pot
+new file mode 100644
+index 0000000..ba28b45
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/templates/voice_diag.pot
+@@ -0,0 +1,15 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/tr/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/tr/voice_diag.po
+new file mode 100644
+index 0000000..715f411
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/tr/voice_diag.po
+@@ -0,0 +1,22 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/uk/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/uk/voice_diag.po
+new file mode 100644
+index 0000000..60c55ba
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/uk/voice_diag.po
+@@ -0,0 +1,33 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-28 22:05+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Diagnostics"
++msgstr "ДіагноÑтика"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++"ДоÑтупніÑÑ‚ÑŒ заÑобів діагноÑтики визначаєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»Ñми, Ñкі ви вÑтановили."
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
++"Це меню міÑтить опції, Ñкі дають вам змогу Ñконфігурувати й виконати "
++"теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð¾Ð»Ð¾Ñових функцій вашої ÑиÑтеми. Інша Ñ—Ñ… назва - заÑоби "
++"діагноÑтики."
++
++#~ msgid "l_v_d_admindiag"
++#~ msgstr "l_v_d_admindiag"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/vi/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/vi/voice_diag.po
+new file mode 100644
+index 0000000..715f411
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/vi/voice_diag.po
+@@ -0,0 +1,22 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr ""
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/zh-cn/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/zh-cn/voice_diag.po
+new file mode 100644
+index 0000000..4bad894
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/zh-cn/voice_diag.po
+@@ -0,0 +1,25 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-08 13:50+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Diagnostics"
++msgstr "检测"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr "检测您已在设备上安装的模å—。"
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr "èœå•ä¸‹çš„选项,å…许您é…置和执行语音相关的测试。这些动作称为检测。"
+diff --git a/feeds/luci/applications/luci-app-voice-diag/po/zh-tw/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/zh-tw/voice_diag.po
+new file mode 100644
+index 0000000..5207a8b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-voice-diag/po/zh-tw/voice_diag.po
+@@ -0,0 +1,25 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 10:45+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Diagnostics"
++msgstr "診斷"
++
++msgid ""
++"The diagnostics available on your device depend on the modules that you have "
++"installed."
++msgstr "能å¦è¨ºæ–·ä½ çš„設備端看你已安è£çš„模組"
++
++msgid ""
++"Under this menu are options that allow you to configure and perform tests on "
++"the voice operations of your system. These are known as diagnostics."
++msgstr "é¸å–®ä¸‹æœ‰é¸é …讓你能夠設定並執行測試你系統上的語音æ“作. 這些都是已知的診斷方法"
+diff --git a/feeds/luci/applications/luci-app-watchcat/Makefile b/feeds/luci/applications/luci-app-watchcat/Makefile
+new file mode 100644
+index 0000000..7ad86c8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for Watchcat
++LUCI_DEPENDS:=+watchcat
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-watchcat/luasrc/controller/watchcat.lua b/feeds/luci/applications/luci-app-watchcat/luasrc/controller/watchcat.lua
+new file mode 100644
+index 0000000..27d5b74
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/luasrc/controller/watchcat.lua
+@@ -0,0 +1,11 @@
++-- Copyright 2012 Christian Gagneraud <chris@techworks.ie>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.watchcat", package.seeall)
++
++function index()
++ if not nixio.fs.access("/etc/config/system") then
++ return
++ end
++ entry({"admin", "services", "watchcat"}, cbi("watchcat/watchcat"), _("Watchcat"), 90)
++end
+diff --git a/feeds/luci/applications/luci-app-watchcat/luasrc/model/cbi/watchcat/watchcat.lua b/feeds/luci/applications/luci-app-watchcat/luasrc/model/cbi/watchcat/watchcat.lua
+new file mode 100644
+index 0000000..883416b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/luasrc/model/cbi/watchcat/watchcat.lua
+@@ -0,0 +1,53 @@
++-- Copyright 2012 Christian Gagneraud <chris@techworks.ie>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("system",
++ translate("Watchcat"),
++ translate("Watchcat allows configuring a periodic reboot when the " ..
++ "Internet connection has been lost for a certain period of time."
++ ))
++
++s = m:section(TypedSection, "watchcat")
++s.anonymous = true
++s.addremove = true
++
++mode = s:option(ListValue, "mode",
++ translate("Operating mode"))
++mode.default = "allways"
++mode:value("ping", "Reboot on internet connection lost")
++mode:value("allways", "Periodic reboot")
++
++forcedelay = s:option(Value, "forcedelay",
++ translate("Forced reboot delay"),
++ translate("When rebooting the system, the watchcat will trigger a soft reboot. " ..
++ "Entering a non zero value here will trigger a delayed hard reboot " ..
++ "if the soft reboot fails. Enter a number of seconds to enable, " ..
++ "use 0 to disable"))
++forcedelay.datatype = "uinteger"
++forcedelay.default = "0"
++
++period = s:option(Value, "period",
++ translate("Period"),
++ translate("In periodic mode, it defines the reboot period. " ..
++ "In internet mode, it defines the longest period of " ..
++ "time without internet access before a reboot is engaged." ..
++ "Default unit is seconds, you can use the " ..
++ "suffix 'm' for minutes, 'h' for hours or 'd' " ..
++ "for days"))
++
++pinghost = s:option(Value, "pinghosts",
++ translate("Ping host"),
++ translate("Host address to ping"))
++pinghost.datatype = "host"
++pinghost.default = "8.8.8.8"
++pinghost:depends({mode="ping"})
++
++pingperiod = s:option(Value, "pingperiod",
++ translate("Ping period"),
++ translate("How often to check internet connection. " ..
++ "Default unit is seconds, you can you use the " ..
++ "suffix 'm' for minutes, 'h' for hours or 'd' " ..
++ "for days"))
++pingperiod:depends({mode="ping"})
++
++return m
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/ca/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/ca/watchcat.po
+new file mode 100644
+index 0000000..36e6405
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/ca/watchcat.po
+@@ -0,0 +1,71 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-07-01 05:59+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Forced reboot delay"
++msgstr "Retard de reinici forçat"
++
++msgid "Host address to ping"
++msgstr "Adreça de host per al ping"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"Quan sovint que es comprova la connexió a Internet. La unitat per defecte es "
++"el segon, podeu utilitzar el sufix 'm' per minuts, 'h' per hores o 'd' per "
++"dies."
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"En mode periòdic, defineix el període de reinici. En mode de Internet, "
++"defineix el període més llarg sense accés al Internet abans que un reinici "
++"es comença. La unitat per defecte es el segon, podeu podeu utilitzar el "
++"sufix 'm' per minuts, 'h' per hores o 'd' per dies."
++
++msgid "Operating mode"
++msgstr "Mode d'operació"
++
++msgid "Period"
++msgstr "Període"
++
++msgid "Ping host"
++msgstr "Host de ping"
++
++msgid "Ping period"
++msgstr "Període de ping"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"El Watchcat permet la configuració d'un reinici periòdic o un reinici quan "
++"la connexió d'Internet ha estat perdut fa un cert període de temps."
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"Al reiniciar el sistema, el Watchcat causarà un reinici suau. Introduïu un "
++"valor diferent de zero causarà un reinici dur retardat si el reinici suau "
++"falla. Introduïu un nombre de segons per a habilitar, utilitzeu 0 per a "
++"inhabilitar."
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/cs/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/cs/watchcat.po
+new file mode 100644
+index 0000000..1bfd435
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/cs/watchcat.po
+@@ -0,0 +1,72 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-24 15:54+0200\n"
++"Last-Translator: awm1 <awm1klimes8vladimir@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Forced reboot delay"
++msgstr "Prodleva nuceného restartu"
++
++msgid "Host address to ping"
++msgstr "Adresa zařízení, vůÄi kterému bude testování pÅ™ipojení (ping)"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"Perioda testování pÅ™ipojení; výchozí Äasovou jednotkou jsou sekundy, avÅ¡ak "
++"použitím přípony \"m\" lze urÄit minuty, pomocí \"h\" hodiny a \"d\" dny"
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"Pokud je nastaven periodický režim práce, tak tato hodnota vyjadřuje "
++"interval opakování restartu. V 'internetovém' režimu práce hodnota vyjadřuje "
++"nejdelší možnou dobu, po kterou smí být zařízení bez připojení k internetu, "
++"resp. nastavenému testovacímu zařízení - po jejím uplynutí je proveden "
++"automaticky reset. Výchozí jednotkou jsou sekundy, pomocí přípony \"m\" lze "
++"nastavit minuty, pomocí \"h\" hodiny a prostřednictvím \"d\" dny"
++
++msgid "Operating mode"
++msgstr "Pracovní režim"
++
++msgid "Period"
++msgstr "Perioda"
++
++msgid "Ping host"
++msgstr "Cílové zařízení příkazu ping"
++
++msgid "Ping period"
++msgstr "Interval opakování testu ping"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"Nástroj Watchcat umožňuje nastavit periodický interval restartu zařízení a/"
++"nebo provést restart i tehdy, když dojde ke ztrátě připojení k internetu/"
++"danému zařízení po stanovenou dobu"
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"Pokud je nutno restartovat systém, provede Watchcat \"měkký\" restart "
++"(hodnota 0); zadáním nenulové hodnoty nastavíte interval (v sekundách), za "
++"který program provede \"tvrdý\" restart, pokud \"měkký\" selže."
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/de/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/de/watchcat.po
+new file mode 100644
+index 0000000..1bbc6d5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/de/watchcat.po
+@@ -0,0 +1,72 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-28 22:40+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Forced reboot delay"
++msgstr "Erzwungenen Neustart verzögern um"
++
++msgid "Host address to ping"
++msgstr "Anzupingende Host-Adresse"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"Wie oft soll die Internetverbindung überprüft werden. Standart-Einheit in "
++"Sekunden, kann aber durch angehängtes 'm' in Minuten, 'h' in Stunden und 'd' "
++"in Tage geändert werden."
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"Im periodischen Modus gibt er die Zeitdauer für einen Neustart an. Im "
++"Internet-Modus gibt er die längste Zeitdauer ohne Internetzugang an, nach "
++"der ein Neustart durchgeführt wird. Voreingestellte Einheit ist Sekunden, "
++"Sie können aber die Endungen 'm' für Minuten, 'h' für Stunden und 'd' für "
++"Tage benutzen."
++
++msgid "Operating mode"
++msgstr "Betriebsart"
++
++msgid "Period"
++msgstr "Periode"
++
++msgid "Ping host"
++msgstr "Ping-Host"
++
++msgid "Ping period"
++msgstr "Ping-Zeitdauer"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"Watchcat erlaubt die Einstellung eines automatischen Neustarts, wenn die "
++"Internetverbindung eine bestimmte Zeitlang ausgefallen ist."
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"Bei einem Neustart des Systems wird Watchcat einen Warmstart auslösen, wird "
++"hier ein Wert ungleich Null eingegeben, wird ein Kaltstart ausgelöst, sollte "
++"der Warmstart fehlschlagen. Geben Sie eine Zahl in Sekunden zur Aktivierung "
++"an, 0 schaltet diese Funktion aus."
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/el/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/el/watchcat.po
+new file mode 100644
+index 0000000..4aa0c6b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/el/watchcat.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr ""
++
++msgid "Period"
++msgstr ""
++
++msgid "Ping host"
++msgstr ""
++
++msgid "Ping period"
++msgstr ""
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/en/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/en/watchcat.po
+new file mode 100644
+index 0000000..0f9099c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/en/watchcat.po
+@@ -0,0 +1,66 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Forced reboot delay"
++msgstr "Forced reboot delay"
++
++msgid "Host address to ping"
++msgstr "Host address to ping"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++
++msgid "Operating mode"
++msgstr "Operating mode"
++
++msgid "Period"
++msgstr "Period"
++
++msgid "Ping host"
++msgstr "Ping host"
++
++msgid "Ping period"
++msgstr "Ping period"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"Watchcat allows to configure a periodic reboot and/or when internet "
++"connection has been lost for a certain period of time."
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"When rebooting the system the watchcat will trigger a soft reboot, Entering "
++"a non zero value here, will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/es/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/es/watchcat.po
+new file mode 100644
+index 0000000..c1f58fe
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/es/watchcat.po
+@@ -0,0 +1,68 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-08-23 23:07+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Forced reboot delay"
++msgstr "Espera para forzar reinicio"
++
++msgid "Host address to ping"
++msgstr "Dirección de máquina a la que hacer ping"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"Cada cuánto comprobar la conexión a internet. Por defecto son segundos, pero "
++"puede añadir 'm' para minutos, 'h' para horas o 'd' para días"
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"En modo periódico define el período de rearranque. En modo internet define "
++"el mayor período de tiempo sin acceso a internet antes de provocar un "
++"reinicio. Por defecto son segundos, pero puede añadir 'm' para minutos, 'h' "
++"para horas o 'd' para días"
++
++msgid "Operating mode"
++msgstr "Modo de operar"
++
++msgid "Period"
++msgstr "Período"
++
++msgid "Ping host"
++msgstr "Máquina a la que hacer ping"
++
++msgid "Ping period"
++msgstr "Período de ping"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"Watchcat permite configurar un reinicio periódico si la conexión a internet "
++"si pierde durante un cierto tiempo."
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"Watchcat provocará por defecto un reinicio suave. Poniendo un valor mayor "
++"que cero se provocará un reinicio completo si el anterior ha fallado"
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/fr/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/fr/watchcat.po
+new file mode 100644
+index 0000000..23af469
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/fr/watchcat.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr ""
++
++msgid "Period"
++msgstr ""
++
++msgid "Ping host"
++msgstr ""
++
++msgid "Ping period"
++msgstr ""
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/he/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/he/watchcat.po
+new file mode 100644
+index 0000000..4aa0c6b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/he/watchcat.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr ""
++
++msgid "Period"
++msgstr ""
++
++msgid "Ping host"
++msgstr ""
++
++msgid "Ping period"
++msgstr ""
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/hu/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/hu/watchcat.po
+new file mode 100644
+index 0000000..253eb77
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/hu/watchcat.po
+@@ -0,0 +1,64 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-01-31 18:09+0200\n"
++"Last-Translator: Sixtus <gelencser12@freemail.hu>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Forced reboot delay"
++msgstr "Kényszerített újraindítás késleltetése"
++
++#, fuzzy
++msgid "Host address to ping"
++msgstr "Pingelendő szerver címe"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"Internet kapcsolat ellenőrzésének gyakorisága. Alapértelmezett egység a "
++"másodperc, percekhez használd az 'm', órákhoz a 'h', vagy napokhoz a 'd' "
++"utótagot."
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"Periodikus üzemmódban ez határozza meg az újraindítás gyakoriságát. Internet "
++"üzemmódban meghatározza a leghosszabb időt újraindításig, amikor nincs "
++"internet kapcsolat. Alapértelmezett egység a másodperc, percekhez használd "
++"az 'm', órákhoz a 'h', vagy napokhoz a 'd' utótagot."
++
++msgid "Operating mode"
++msgstr "Üzemmód"
++
++msgid "Period"
++msgstr "Periódus"
++
++msgid "Ping host"
++msgstr "Ping címe"
++
++msgid "Ping period"
++msgstr "Pingelések közti idő"
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/it/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/it/watchcat.po
+new file mode 100644
+index 0000000..0acdd18
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/it/watchcat.po
+@@ -0,0 +1,72 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-02-03 14:12+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Forced reboot delay"
++msgstr "Ritardo riavvio forzato"
++
++msgid "Host address to ping"
++msgstr "Indirizzo dell'host da pingare"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"Ogni quanto si vuole controllare la connessione. Di default espresso in "
++"secondi, puoi usare il sufisso 'm' per i minuti, 'h' per le ore o 'd' per i "
++"giorni"
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"In modalità periodica, definisce il periodo di riavvio. In modalità "
++"internet, definisce il più lungo periodo del tempo senza connessione "
++"internet prima di un riavvio è pianificato. L'unità predefinita è in "
++"secondi, si può usare il suffisso 'm' per i minuti, 'h' per le ore o 'd' per "
++"i giorni."
++
++msgid "Operating mode"
++msgstr "Modalità"
++
++msgid "Period"
++msgstr "Periodo"
++
++msgid "Ping host"
++msgstr "Ping host"
++
++msgid "Ping period"
++msgstr "Periodo del Ping"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"Watchcat ti permette di configurare un riavvio periodico quando la "
++"connessione a internet è stata persa per un certo periodo."
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"Quando watchcat vuole riavviare il sistema usa un soft reboot, immetendo un "
++"valore diverso da 0 in questo campo il proverà un hard reboot se il soft "
++"reboot fallisce. Inserire un numero espresso in secondi per abilitare, usa 0 "
++"per disabilitare"
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/ja/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/ja/watchcat.po
+new file mode 100644
+index 0000000..1ae0eb4
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/ja/watchcat.po
+@@ -0,0 +1,70 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-10-06 17:09+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: none\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: Pootle 2.0.6\n"
++
++msgid "Forced reboot delay"
++msgstr "強制å†èµ·å‹•ãƒ‡ã‚£ãƒ¬ã‚¤æ™‚é–“"
++
++msgid "Host address to ping"
++msgstr "ping を実行ã™ã‚‹å®›å…ˆã‚’設定ã—ã¦ãã ã•ã„。"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"ã©ã®ç¨‹åº¦ã®é–“éš”ã§ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã‹è¨­å®šã—ã¾ã™ã€‚標準ã®å˜ä½ã¯ç§’"
++"ã§ã™ãŒã€'m'を接尾ã«ä»˜ã‘ã‚‹ã¨åˆ†ã€'h'を付ã‘ã‚‹ã¨æ™‚ã€'d'を付ã‘ã‚‹ã¨æ—¥æ•°ã«è¨­å®šã•ã‚Œã¾"
++"ã™ã€‚"
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"定期動作モードã®å ´åˆã€å†èµ·å‹•ã™ã‚‹å‘¨æœŸã‚’設定ã—ã¾ã™ã€‚インターãƒãƒƒãƒˆãƒ¢ãƒ¼ãƒ‰ã®å ´"
++"åˆã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šãŒåˆ‡æ–­çŠ¶æ…‹ã«ã‚る許容ã™ã‚‹æœŸé–“を設定ã—ã¾ã™ã€‚標準ã®å˜ä½ã¯"
++"秒ã§ã™ãŒã€'m'を接尾ã«ä»˜ã‘ã‚‹ã¨åˆ†ã€'h'を付ã‘ã‚‹ã¨æ™‚ã€'d'を付ã‘ã‚‹ã¨æ—¥æ•°ã«è¨­å®šã•ã‚Œ"
++"ã¾ã™ã€‚"
++
++msgid "Operating mode"
++msgstr "動作モード"
++
++msgid "Period"
++msgstr "周期"
++
++msgid "Ping host"
++msgstr "Ping 宛先ホスト"
++
++msgid "Ping period"
++msgstr "Ping é–“éš”"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"Watchcatã§ã¯ã€å®šæœŸçš„ãªå†èµ·å‹•ã‚„ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šãŒä¸€å®šæœŸé–“切断ã•ã‚ŒãŸéš›ã®å†"
++"èµ·å‹•ã‚’è¡Œã†ã‚ˆã†ãªè¨­å®šãŒå¯èƒ½ã§ã™ã€‚"
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"å†èµ·å‹•æ™‚ã«watchcatã¯ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ãƒªã‚»ãƒƒãƒˆã‚’実行ã—ã¾ã™ãŒã€0以外ã®å€¤ã‚’設定ã—ãŸå ´"
++"åˆã€ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ãƒªã‚»ãƒƒãƒˆãŒå¤±æ•—ã—ãŸéš›ã«è¨­å®šã•ã‚ŒãŸç§’数後ã«ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒªã‚»ãƒƒãƒˆ"
++"ã‚’è¡Œã„ã¾ã™ã€‚0を設定ã—ãŸå ´åˆã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚"
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/ms/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/ms/watchcat.po
+new file mode 100644
+index 0000000..0da283c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/ms/watchcat.po
+@@ -0,0 +1,52 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr ""
++
++msgid "Period"
++msgstr ""
++
++msgid "Ping host"
++msgstr ""
++
++msgid "Ping period"
++msgstr ""
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/no/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/no/watchcat.po
+new file mode 100644
+index 0000000..4aa0c6b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/no/watchcat.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr ""
++
++msgid "Period"
++msgstr ""
++
++msgid "Ping host"
++msgstr ""
++
++msgid "Ping period"
++msgstr ""
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/pl/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/pl/watchcat.po
+new file mode 100644
+index 0000000..ebb67ee
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/pl/watchcat.po
+@@ -0,0 +1,71 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-21 02:13+0200\n"
++"Last-Translator: Tomecki <przykryweczka@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Forced reboot delay"
++msgstr "Wymuszone opóźnienie restartu"
++
++msgid "Host address to ping"
++msgstr "Adres hosta do pingowania"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"Jak często sprawdzać połączenie internetowe. Domyślną jednostką jest "
++"sekunda, można także użyć 'm' dla minut, 'h' dla godzin lub 'd' dla dni"
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"W trybie okresowym, określa to restart. W trybie internetowym, określa "
++"najdłuższy okres czasu bez dostępu do internetu przed restartem. Domyślną "
++"jednostką jest sekunda, można także użyć 'm' dla minut, 'h' dla godzin lub "
++"'d' dla dni"
++
++msgid "Operating mode"
++msgstr "Tryb pracy"
++
++msgid "Period"
++msgstr "Okres"
++
++msgid "Ping host"
++msgstr "Host do pingowania"
++
++msgid "Ping period"
++msgstr "Czas pomiędzy wysyłaniem pingów"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"Watchcat pozwala na skonfigurowanie okresowych restartów, jeśli połączenie "
++"internetowe zostanie utracone na określony czas."
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"Restart routera Watchcat wykonuje za pomocą tzw. \"miękkiego restartu\". "
++"Wpisując tutaj wartość niezerową, wymusimy \"twardy restart\" jeśli \"miękki "
++"restart\" siÄ™ nie powiedzie. Podaj czas w sekundach lub wpisz 0 (zero) aby "
++"wyłączyć restarty."
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/pt-br/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/pt-br/watchcat.po
+new file mode 100644
+index 0000000..fe97036
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/pt-br/watchcat.po
+@@ -0,0 +1,71 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-03-29 23:20+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Forced reboot delay"
++msgstr "Atraso para reinício forçado"
++
++msgid "Host address to ping"
++msgstr "Endereço do equipamento para efetuar o PING"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"Com qual frequência deve verificar a conexão com a Internet. A unidade "
++"padrão é segundos, mas você pode usar o sufixo 'm' para minutos, 'h' para "
++"horas ou 'd' para dias"
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"No modo periódico, é definido o período para se reiniciar. No modo Internet, "
++"é definido o maior período de tempo sem acesso à Internet até que uma "
++"reiniciação é realizada. A unidade padrão é segundos, mas você pode usar o "
++"sufixo 'm' para minutos, 'h' para horas ou 'd' para dias."
++
++msgid "Operating mode"
++msgstr "Modo de Operação"
++
++msgid "Period"
++msgstr "Período"
++
++msgid "Ping host"
++msgstr "Pingar Máquina"
++
++msgid "Ping period"
++msgstr "Período de ping"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"Watchcat permite que se configure um período para reiniciar e/ou quando a "
++"conexão com à Internet foi perdida por um ser período de tempo."
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"Ao se reiniciar o sistema, watchcat acionará uma reiniciação suave. Ao se "
++"inserir um valor diferente de zero aqui, será acionado uma reiniciação "
++"forçada se a reiniciação suave falhar. Insira um número de segundos para "
++"habilitar, use 0 para desabilitar."
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/pt/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/pt/watchcat.po
+new file mode 100644
+index 0000000..f939dc9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/pt/watchcat.po
+@@ -0,0 +1,56 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-06-01 00:02+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr "Modo de operação"
++
++msgid "Period"
++msgstr "Periodo"
++
++msgid "Ping host"
++msgstr "Pingar host"
++
++msgid "Ping period"
++msgstr "Periodo de ping"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/ro/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/ro/watchcat.po
+new file mode 100644
+index 0000000..cda0911
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/ro/watchcat.po
+@@ -0,0 +1,57 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-28 19:23+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr ""
++
++msgid "Period"
++msgstr "Perioadă"
++
++msgid "Ping host"
++msgstr ""
++
++msgid "Ping period"
++msgstr ""
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/ru/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/ru/watchcat.po
+new file mode 100644
+index 0000000..83b95e2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/ru/watchcat.po
+@@ -0,0 +1,74 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: watchcat\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: \n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Forced reboot delay"
++msgstr "Задержка принудительной перезагрузки"
++
++msgid "Host address to ping"
++msgstr "ÐÐ´Ñ€ÐµÑ Ñ…Ð¾Ñта Ð´Ð»Ñ Ð¾Ð¿Ñ€Ð¾Ñа"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"Как чаÑто проверÑÑ‚ÑŒ интернет-Ñоединение. По умолчанию значение в Ñекундах, "
++"вы можете иÑпользовать ÑÑƒÑ„Ñ„Ð¸ÐºÑ 'm' Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¼Ð¸Ð½ÑƒÑ‚, 'h' - чаÑов, 'd' - "
++"дней"
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"Ð’ периодичеÑком режиме, Ð´Ð°Ð½Ð½Ð°Ñ Ð½Ð°Ñтройка определÑет период перезагрузки. Ð’ "
++"интернет-режиме, Ð´Ð°Ð½Ð½Ð°Ñ Ð½Ð°Ñтройка определÑет макÑимальный период времени без "
++"доÑтупа в интернет, поÑле которого уÑтройÑтво перезагружаетÑÑ. По умолчанию "
++"значение в Ñекундах, вы можете иÑпользовать ÑÑƒÑ„Ñ„Ð¸ÐºÑ 'm' Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¼Ð¸Ð½ÑƒÑ‚, "
++"'h' - чаÑов, 'd' - дней"
++
++msgid "Operating mode"
++msgstr "Режим работы"
++
++msgid "Period"
++msgstr "Период"
++
++msgid "Ping host"
++msgstr "ХоÑÑ‚ опроÑа"
++
++msgid "Ping period"
++msgstr "Период опроÑа"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"Watchcat позволÑет наÑтроить периодичеÑкую перезагрузку уÑтройÑтва и/или "
++"перезагрузку при потере интернет-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ð° определённое времÑ."
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"При необходимоÑти перезагрузке ÑиÑтемы, watchcat вызовет программную "
++"перезагрузку. При уÑтановке ненулевого значениÑ, будет выполнена Ð¾Ñ‚Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ "
++"Ð°Ð¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° при неудачной программной. УÑтановите количеÑтво "
++"Ñекунд Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð¹ аппаратной перезагрузки или значение 0 Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ð¾Ð¹."
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/sk/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/sk/watchcat.po
+new file mode 100644
+index 0000000..2ff7de9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/sk/watchcat.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr ""
++
++msgid "Period"
++msgstr ""
++
++msgid "Ping host"
++msgstr ""
++
++msgid "Ping period"
++msgstr ""
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/sv/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/sv/watchcat.po
+new file mode 100644
+index 0000000..dd2365a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/sv/watchcat.po
+@@ -0,0 +1,54 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr ""
++
++msgid "Period"
++msgstr ""
++
++msgid "Ping host"
++msgstr ""
++
++msgid "Ping period"
++msgstr ""
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/templates/watchcat.pot b/feeds/luci/applications/luci-app-watchcat/po/templates/watchcat.pot
+new file mode 100644
+index 0000000..490ec5c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/templates/watchcat.pot
+@@ -0,0 +1,46 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr ""
++
++msgid "Period"
++msgstr ""
++
++msgid "Ping host"
++msgstr ""
++
++msgid "Ping period"
++msgstr ""
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/tr/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/tr/watchcat.po
+new file mode 100644
+index 0000000..633e7fb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/tr/watchcat.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr ""
++
++msgid "Period"
++msgstr ""
++
++msgid "Ping host"
++msgstr ""
++
++msgid "Ping period"
++msgstr ""
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/uk/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/uk/watchcat.po
+new file mode 100644
+index 0000000..a7c2dd8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/uk/watchcat.po
+@@ -0,0 +1,61 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-08-13 16:53+0200\n"
++"Last-Translator: zubr_139 <zubr139@ukr.net>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++
++#, fuzzy
++msgid "Forced reboot delay"
++msgstr "Затримка примуÑового перезавантаженнÑ"
++
++msgid "Host address to ping"
++msgstr "ÐдреÑа Ñервера Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ зв'Ñзку"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr "Режим роботи"
++
++msgid "Period"
++msgstr "Період"
++
++msgid "Ping host"
++msgstr "Пінг вузла"
++
++msgid "Ping period"
++msgstr "Період пінгів"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"Watchcat дозволÑÑ” налаштувати періодичні Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ–/або коли "
++"Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ інтернету було втрачено протÑгом певного періоду чаÑу."
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/vi/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/vi/watchcat.po
+new file mode 100644
+index 0000000..633e7fb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/vi/watchcat.po
+@@ -0,0 +1,53 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Forced reboot delay"
++msgstr ""
++
++msgid "Host address to ping"
++msgstr ""
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++
++msgid "Operating mode"
++msgstr ""
++
++msgid "Period"
++msgstr ""
++
++msgid "Ping host"
++msgstr ""
++
++msgid "Ping period"
++msgstr ""
++
++msgid "Watchcat"
++msgstr ""
++
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/zh-cn/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/zh-cn/watchcat.po
+new file mode 100644
+index 0000000..991fc48
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/zh-cn/watchcat.po
+@@ -0,0 +1,65 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-09-24 18:18+0200\n"
++"Last-Translator: shanliren <shanliren.net@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Forced reboot delay"
++msgstr "强制é‡å¯å»¶æ—¶"
++
++msgid "Host address to ping"
++msgstr "ping主机地å€"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"检测网络连接的频率。默认å•ä½ä¸ºç§’,你å¯ä»¥ä½¿ç”¨'m'作为åŽç¼€è¡¨ç¤ºåˆ†é’Ÿï¼Œâ€˜h’表示å°"
++"时‘d’表示天。"
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"在周期模å¼ï¼Œæ­¤å¤„定义了é‡å¯çš„周期。在è”网模å¼ï¼Œè¿™ä¸ªè¡¨ç¤ºæ²¡æœ‰ç½‘络连接情况下到执"
++"è¡Œé‡å¯çš„最长时间间隔。默认å•ä½ä¸ºç§’,你å¯ä»¥ä½¿ç”¨'m'作为åŽç¼€è¡¨ç¤ºåˆ†é’Ÿï¼Œâ€˜h’表示å°"
++"时‘d’表示天。"
++
++msgid "Operating mode"
++msgstr "æ“作模å¼"
++
++msgid "Period"
++msgstr "周期"
++
++msgid "Ping host"
++msgstr "ping主机"
++
++msgid "Ping period"
++msgstr "ping周期"
++
++msgid "Watchcat"
++msgstr "WatchCat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr "WatchCatå…许设置周期性的é‡å¯ å’Œ/或者 当网络连接断开达规定时间。"
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"当é‡å¯ç³»ç»Ÿçš„时候WatchCat将会触å‘一个软é‡å¯ï¼Œåœ¨è¿™é‡Œè¾“入一个éž0的值,如果软é‡å¯"
++"失败将会触å‘一个延迟的硬é‡å¯ã€‚输入秒数å¯ç”¨ï¼Œè¾“å…¥0ç¦æ­¢åŠŸèƒ½ã€‚"
+diff --git a/feeds/luci/applications/luci-app-watchcat/po/zh-tw/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/zh-tw/watchcat.po
+new file mode 100644
+index 0000000..b4e52bb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/po/zh-tw/watchcat.po
+@@ -0,0 +1,66 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 12:00+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Forced reboot delay"
++msgstr "強制é‡å•Ÿå»¶é²"
++
++msgid "Host address to ping"
++msgstr "è¦Ping的主機ä½å€"
++
++msgid ""
++"How often to check internet connection. Default unit is seconds, you can you "
++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days"
++msgstr ""
++"多久檢查一次網際網路連線. é è¨­å–®ä½å€¼æ˜¯ç§’, å¯ä»¥æŽ¡ç”¨å–®ä½å¾Œç¶´è¡¨ç¤º, \"m\"表示分"
++"é˜, \"h\"表示å°æ™‚, \"d\"代表天數"
++
++msgid ""
++"In periodic mode, it defines the reboot period. In internet mode, it defines "
++"the longest period of time without internet access before a reboot is "
++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' "
++"for hours or 'd' for days"
++msgstr ""
++"Watchcat的定期模å¼,它將定義é‡é–‹é€±æœŸ. 在網際網路模å¼,它將定義在é‡é–‹è¢«è¨‚製若無"
++"Internetå­˜å–時採用較長時間週期 .é è¨­å–®ä½ç‚ºç§’數,å¯ä»¥æŽ¡ç”¨å–®ä½å¾Œç¶´è¡¨ç¤º, \"m\"表"
++"示分é˜, \"h\"表示å°æ™‚, \"d\"代表天數"
++
++msgid "Operating mode"
++msgstr "æ“作模å¼"
++
++msgid "Period"
++msgstr "週期"
++
++msgid "Ping host"
++msgstr "Ping主機"
++
++msgid "Ping period"
++msgstr "Ping週期"
++
++msgid "Watchcat"
++msgstr "Watchcat"
++
++#, fuzzy
++msgid ""
++"Watchcat allows configuring a periodic reboot when the Internet connection "
++"has been lost for a certain period of time."
++msgstr ""
++"Watchcatå…許定期é‡å•“並且/或者當網際網路連線斷掉時經éŽæŸæ®µæ™‚間週期後é‡å•“"
++
++#, fuzzy
++msgid ""
++"When rebooting the system, the watchcat will trigger a soft reboot. Entering "
++"a non zero value here will trigger a delayed hard reboot if the soft reboot "
++"fails. Enter a number of seconds to enable, use 0 to disable"
++msgstr ""
++"é‡é–‹ç³»çµ±æ™‚watchcat將會觸發軟é‡é–‹, 如果軟é‡é–‹å¤±æ•—, 打入0以外的數字,將會觸發硬"
++"é‡é–‹å»¶é² . 打入秒數來啟用這功能,用0表示功能關閉"
+diff --git a/feeds/luci/applications/luci-app-watchcat/root/etc/uci-defaults/luci-watchcat b/feeds/luci/applications/luci-app-watchcat/root/etc/uci-defaults/luci-watchcat
+new file mode 100644
+index 0000000..8cdb8c7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-watchcat/root/etc/uci-defaults/luci-watchcat
+@@ -0,0 +1,10 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ add ucitrack system
++ set ucitrack.@system[-1].init=watchcat
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/applications/luci-app-wol/Makefile b/feeds/luci/applications/luci-app-wol/Makefile
+new file mode 100644
+index 0000000..d935ee9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for Wake-on-LAN
++LUCI_DEPENDS:=+etherwake
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-wol/luasrc/controller/wol.lua b/feeds/luci/applications/luci-app-wol/luasrc/controller/wol.lua
+new file mode 100644
+index 0000000..73a9594
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/luasrc/controller/wol.lua
+@@ -0,0 +1,6 @@
++module("luci.controller.wol", package.seeall)
++
++function index()
++ entry({"admin", "network", "wol"}, cbi("wol"), _("Wake on LAN"), 90)
++ entry({"mini", "network", "wol"}, cbi("wol"), _("Wake on LAN"), 90)
++end
+diff --git a/feeds/luci/applications/luci-app-wol/luasrc/model/cbi/wol.lua b/feeds/luci/applications/luci-app-wol/luasrc/model/cbi/wol.lua
+new file mode 100644
+index 0000000..e87cac3
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/luasrc/model/cbi/wol.lua
+@@ -0,0 +1,94 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local sys = require "luci.sys"
++local fs = require "nixio.fs"
++
++m = SimpleForm("wol", translate("Wake on LAN"),
++ translate("Wake on LAN is a mechanism to remotely boot computers in the local network."))
++
++m.submit = translate("Wake up host")
++m.reset = false
++
++
++local has_ewk = fs.access("/usr/bin/etherwake")
++local has_wol = fs.access("/usr/bin/wol")
++
++
++s = m:section(SimpleSection)
++
++if has_ewk and has_wol then
++ bin = s:option(ListValue, "binary", translate("WoL program"),
++ translate("Sometimes only one of the two tools works. If one fails, try the other one"))
++
++ bin:value("/usr/bin/etherwake", "Etherwake")
++ bin:value("/usr/bin/wol", "WoL")
++end
++
++if has_ewk then
++ iface = s:option(ListValue, "iface", translate("Network interface to use"),
++ translate("Specifies the interface the WoL packet is sent on"))
++
++ if has_wol then
++ iface:depends("binary", "/usr/bin/etherwake")
++ end
++
++ iface:value("", translate("Broadcast on all interfaces"))
++
++ for _, e in ipairs(sys.net.devices()) do
++ if e ~= "lo" then iface:value(e) end
++ end
++end
++
++
++host = s:option(Value, "mac", translate("Host to wake up"),
++ translate("Choose the host to wake up or enter a custom MAC address to use"))
++
++sys.net.mac_hints(function(mac, name)
++ host:value(mac, "%s (%s)" %{ mac, name })
++end)
++
++
++function host.write(self, s, val)
++ local host = luci.http.formvalue("cbid.wol.1.mac")
++ if host and #host > 0 and host:match("^[a-fA-F0-9:]+$") then
++ local cmd
++ local util = luci.http.formvalue("cbid.wol.1.binary") or (
++ has_ewk and "/usr/bin/etherwake" or "/usr/bin/wol"
++ )
++
++ if util == "/usr/bin/etherwake" then
++ local iface = luci.http.formvalue("cbid.wol.1.iface")
++ cmd = "%s -D%s %q" %{
++ util, (iface ~= "" and " -i %q" % iface or ""), host
++ }
++ else
++ cmd = "%s -v %q" %{ util, host }
++ end
++
++ local msg = "<p><strong>%s</strong><br /><br /><code>%s<br /><br />" %{
++ translate("Starting WoL utility:"), cmd
++ }
++
++ local p = io.popen(cmd .. " 2>&1")
++ if p then
++ while true do
++ local l = p:read("*l")
++ if l then
++ if #l > 100 then l = l:sub(1, 100) .. "..." end
++ msg = msg .. l .. "<br />"
++ else
++ break
++ end
++ end
++ p:close()
++ end
++
++ msg = msg .. "</code></p>"
++
++ m.message = msg
++ end
++end
++
++
++return m
+diff --git a/feeds/luci/applications/luci-app-wol/po/ca/wol.po b/feeds/luci/applications/luci-app-wol/po/ca/wol.po
+new file mode 100644
+index 0000000..42f7cf7
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/ca/wol.po
+@@ -0,0 +1,58 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2014-07-01 06:15+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Difon en totes les interfícies"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++"Trieu el host per a despertar o introduïu una adreça MAC personalitzada per "
++"a utilitzar"
++
++msgid "Host to wake up"
++msgstr "Host per a despertar"
++
++msgid "Network interface to use"
++msgstr "Interfície de xarxa per a utilitzar"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"A vegades, només una de les dues eines funciona. Si un dels falla, prova la "
++"altra."
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "Especifica la interfície en que s'envia el paquet WoL"
++
++msgid "Starting WoL utility:"
++msgstr "Iniciant la utilitat WoL:"
++
++msgid "Wake on LAN"
++msgstr "Despert en LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Despert en LAN és un mecanisme per a iniciar remotament ordinadors en la "
++"xarxa local."
++
++msgid "Wake up host"
++msgstr "Desperta al host"
++
++msgid "WoL program"
++msgstr "Programa WoL"
+diff --git a/feeds/luci/applications/luci-app-wol/po/cs/wol.po b/feeds/luci/applications/luci-app-wol/po/cs/wol.po
+new file mode 100644
+index 0000000..6ee7f67
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/cs/wol.po
+@@ -0,0 +1,55 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2014-05-12 11:17+0200\n"
++"Last-Translator: sairon <llamka@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Vysílat broadcastem na všech rozhraních"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "Vyberte zařízení, které má být probuzeno, nebo zadejte jeho MAC adresu"
++
++msgid "Host to wake up"
++msgstr "Adresa zařízení, které má být probuzeno"
++
++msgid "Network interface to use"
++msgstr "Použité síťové rozhraní"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Může se stát, že pro dané cílové zařízení bude fungovat pouze jeden z "
++"programů. Pokud první selže, vyzkoušejte další."
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "Zde se nastaví síťové rozhraní, přes které budou zasílány WoL packety."
++
++msgid "Starting WoL utility:"
++msgstr "Spouštím nástroj WoL:"
++
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Funkce \"Wake on LAN\" umožňuje vzdálenÄ› spouÅ¡tÄ›t poÄítaÄe v místní síti."
++
++msgid "Wake up host"
++msgstr "Probudit zařízení"
++
++msgid "WoL program"
++msgstr "Program provádějící WoL"
+diff --git a/feeds/luci/applications/luci-app-wol/po/de/wol.po b/feeds/luci/applications/luci-app-wol/po/de/wol.po
+new file mode 100644
+index 0000000..52940ef
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/de/wol.po
+@@ -0,0 +1,58 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2011-06-11 01:37+0200\n"
++"Last-Translator: Jo-Philipp <jow@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Auf allen Schnittstellen senden"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++"Zu startenden Rechner selektieren oder benutzerdefinierte MAC-Adresse angeben"
++
++msgid "Host to wake up"
++msgstr "Anzuschaltender Rechner"
++
++msgid "Network interface to use"
++msgstr "Verwendete Schnittstelle"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Manchmal funktioniert nur eines der beiden Programme. Wenn eines "
++"fehlschlägt, versuchen Sie das Andere."
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr ""
++"Selektiert die Netzwerkschnittstelle auf der das WoL-Paket versendet wird"
++
++msgid "Starting WoL utility:"
++msgstr "Starte WoL-Programm:"
++
++msgid "Wake on LAN"
++msgstr "Wake-on-LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Wake-on-LAN ist ein Mechanismus um Geräte im lokalen Netzwerk ferngesteuert "
++"anzuschalten."
++
++msgid "Wake up host"
++msgstr "Rechner anschalten"
++
++msgid "WoL program"
++msgstr "WoL-Programm"
+diff --git a/feeds/luci/applications/luci-app-wol/po/el/wol.po b/feeds/luci/applications/luci-app-wol/po/el/wol.po
+new file mode 100644
+index 0000000..cb7c3b9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/el/wol.po
+@@ -0,0 +1,49 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2010-04-19 00:29+0200\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Broadcast on all interfaces"
++msgstr ""
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++
++msgid "Host to wake up"
++msgstr ""
++
++msgid "Network interface to use"
++msgstr ""
++
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr ""
++
++msgid "Starting WoL utility:"
++msgstr ""
++
++msgid "Wake on LAN"
++msgstr ""
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++
++msgid "Wake up host"
++msgstr ""
++
++msgid "WoL program"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wol/po/en/wol.po b/feeds/luci/applications/luci-app-wol/po/en/wol.po
+new file mode 100644
+index 0000000..48c7302
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/en/wol.po
+@@ -0,0 +1,50 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Broadcast on all interfaces"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "Choose the host to wake up or enter a custom MAC address to use"
++
++msgid "Host to wake up"
++msgstr "Host to wake up"
++
++msgid "Network interface to use"
++msgstr "Network interface to use"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Sometimes only one of both tools work. If one of fails, try the other one"
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "Specifies the interface the WoL packet is sent on"
++
++msgid "Starting WoL utility:"
++msgstr "Starting WoL utility:"
++
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++
++msgid "Wake up host"
++msgstr "Wake up host"
++
++msgid "WoL program"
++msgstr "WoL program"
+diff --git a/feeds/luci/applications/luci-app-wol/po/es/wol.po b/feeds/luci/applications/luci-app-wol/po/es/wol.po
+new file mode 100644
+index 0000000..f5bcf6b
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/es/wol.po
+@@ -0,0 +1,57 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2012-08-22 21:41+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: none\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Propagar en todas las interfaces"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "Elija la máquina a despertar o introduzca su dirección MAC"
++
++msgid "Host to wake up"
++msgstr "Máquina a despertar"
++
++msgid "Network interface to use"
++msgstr "Interfaz de red a utilizar"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"A veces, sólo se inicia una de las dos herramientas. Si una falla, intente "
++"con la otra"
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "Especifica la interfaz donde se envían los paquetes WoL"
++
++msgid "Starting WoL utility:"
++msgstr "Iniciando utilidad WoL:"
++
++# Wake on LAN es un término habitualmente utilizado en el español para referirse a esa misma función de encendido remoto a través de la red
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Wake on LAN permite arrancar ordenadores conectados en una red local de "
++"forma remota."
++
++msgid "Wake up host"
++msgstr "Despertar máquina"
++
++msgid "WoL program"
++msgstr "Programa WoL"
+diff --git a/feeds/luci/applications/luci-app-wol/po/fr/wol.po b/feeds/luci/applications/luci-app-wol/po/fr/wol.po
+new file mode 100644
+index 0000000..0bed86d
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/fr/wol.po
+@@ -0,0 +1,57 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2011-11-23 22:22+0200\n"
++"Last-Translator: fredb <fblistes+luci@free.fr>\n"
++"Language-Team: French\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Émettre sur toutes les interfaces"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "Choisir l'hôte à réveiller ou entrer une adresse MAC à utiliser"
++
++msgid "Host to wake up"
++msgstr "Hôte à réveiller"
++
++msgid "Network interface to use"
++msgstr "Interface réseau à utiliser"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Parfois seul un des deux outils fonctionne. Si l'un échoue, essayez l'autre"
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr ""
++"Spécifie l'interface sur laquelle le paquet <abbr title=\"Wake on LAN\">WoL</"
++"abbr> est envoyé"
++
++msgid "Starting WoL utility:"
++msgstr "Démarrer l'utilitaire <abbr title=\"Wake on LAN\">WoL</abbr> :"
++
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Wake on LAN est un mécanisme pour démarrer à distance les ordinateurs du "
++"réseau local."
++
++msgid "Wake up host"
++msgstr "Réveiller l'hôte"
++
++msgid "WoL program"
++msgstr "Programme <abbr title=\"Wake on LAN\">WoL</abbr>"
+diff --git a/feeds/luci/applications/luci-app-wol/po/he/wol.po b/feeds/luci/applications/luci-app-wol/po/he/wol.po
+new file mode 100644
+index 0000000..cb7c3b9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/he/wol.po
+@@ -0,0 +1,49 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2010-04-19 00:29+0200\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Broadcast on all interfaces"
++msgstr ""
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++
++msgid "Host to wake up"
++msgstr ""
++
++msgid "Network interface to use"
++msgstr ""
++
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr ""
++
++msgid "Starting WoL utility:"
++msgstr ""
++
++msgid "Wake on LAN"
++msgstr ""
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++
++msgid "Wake up host"
++msgstr ""
++
++msgid "WoL program"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wol/po/hu/wol.po b/feeds/luci/applications/luci-app-wol/po/hu/wol.po
+new file mode 100644
+index 0000000..f47191c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/hu/wol.po
+@@ -0,0 +1,59 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2012-04-06 10:42+0200\n"
++"Last-Translator: juhosg <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Szórás az összes interfészen"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++"Válassza ki a felélesztendő gépet, vagy adja meg a haszálandó egyedi MAC "
++"címet"
++
++msgid "Host to wake up"
++msgstr "Felélesztendő gép"
++
++msgid "Network interface to use"
++msgstr "Használandó interfész"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Néha csak az egyik eszköz működik. Ha valamelyik nem működik, próbálja ki a "
++"másikat."
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr ""
++"Megadja azt az interfészt amelyiken keresztül a WoL csomag kiküldésre kerül"
++
++msgid "Starting WoL utility:"
++msgstr "WoL segédprogram elindítása:"
++
++msgid "Wake on LAN"
++msgstr "Felélesztés hálózaton keresztül"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"A felélesztés hálózaton keresztül a helyi hálózatban lévő számítógépek "
++"távoli elindítására szolgáló módszer."
++
++msgid "Wake up host"
++msgstr "Gép felélesztése"
++
++msgid "WoL program"
++msgstr "WoL program"
+diff --git a/feeds/luci/applications/luci-app-wol/po/it/wol.po b/feeds/luci/applications/luci-app-wol/po/it/wol.po
+new file mode 100644
+index 0000000..63ac0d8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/it/wol.po
+@@ -0,0 +1,56 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2013-02-03 14:01+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: none\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Broadcast su tutte le interfaccie"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "Scegli l'host da \"svegliare\" o inserisci il MAC address da usare"
++
++msgid "Host to wake up"
++msgstr "Host da \"svegliare\""
++
++msgid "Network interface to use"
++msgstr "Interfacci di rete da usare"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Avvolte solo uno dei due tools funziona. Se uno fallisce, tenta di usare il "
++"secondo"
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "Secifica l'interfaccia su cui il pacchetto \"magico\" WoL è inviato"
++
++msgid "Starting WoL utility:"
++msgstr "Avvia l'utility WoL:"
++
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Wake on LAN è un meccanismo che ti permette di avviare da remoto un computer "
++"collegato alla LAN."
++
++msgid "Wake up host"
++msgstr "Sveglia Host"
++
++msgid "WoL program"
++msgstr "Programma WoL"
+diff --git a/feeds/luci/applications/luci-app-wol/po/ja/wol.po b/feeds/luci/applications/luci-app-wol/po/ja/wol.po
+new file mode 100644
+index 0000000..c18b831
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/ja/wol.po
+@@ -0,0 +1,56 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2013-10-06 17:12+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: none\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: Pootle 2.0.6\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "å…¨ã¦ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã¸ãƒ–ロードキャスト"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "èµ·å‹•ã™ã‚‹ãƒ›ã‚¹ãƒˆã®MACアドレスをé¸æŠžã¾ãŸã¯å…¥åŠ›ã—ã¦ãã ã•ã„"
++
++msgid "Host to wake up"
++msgstr "èµ·å‹•ã™ã‚‹ãƒ›ã‚¹ãƒˆã‚’指定"
++
++msgid "Network interface to use"
++msgstr "使用ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"片方ã®ãƒ„ールã®ã¿ãŒå‹•ä½œã™ã‚‹å ´åˆãŒã‚ã‚‹ãŸã‚ã€ç‰‡æ–¹ãŒå¤±æ•—ã™ã‚‹å ´åˆã¯åˆ¥ã®ãƒ„ールを試"
++"ã—ã¦ã¿ã¦ãã ã•ã„。"
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "WoLパケットをé€ä¿¡ã™ã‚‹ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ã‚’指定"
++
++msgid "Starting WoL utility:"
++msgstr "WoLユーティリティを起動:"
++
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Wake on LANã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ã‚³ãƒ³ãƒ”ュータをé éš”ã§èµ·å‹•ã•ã›ã‚‹ã“ã¨ãŒã§ã"
++"る機能ã§ã™ã€‚"
++
++msgid "Wake up host"
++msgstr "ホストを起動"
++
++msgid "WoL program"
++msgstr "WoLプログラム"
+diff --git a/feeds/luci/applications/luci-app-wol/po/ms/wol.po b/feeds/luci/applications/luci-app-wol/po/ms/wol.po
+new file mode 100644
+index 0000000..74380f2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/ms/wol.po
+@@ -0,0 +1,48 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2010-04-19 00:29+0200\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Broadcast on all interfaces"
++msgstr ""
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++
++msgid "Host to wake up"
++msgstr ""
++
++msgid "Network interface to use"
++msgstr ""
++
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr ""
++
++msgid "Starting WoL utility:"
++msgstr ""
++
++msgid "Wake on LAN"
++msgstr ""
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++
++msgid "Wake up host"
++msgstr ""
++
++msgid "WoL program"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wol/po/no/wol.po b/feeds/luci/applications/luci-app-wol/po/no/wol.po
+new file mode 100644
+index 0000000..2f0a8ad
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/no/wol.po
+@@ -0,0 +1,47 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Send på alle grensesnitt"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++"Velg hvilken vert som skal startes opp, eller angi en MAC adresse som skal "
++"brukes"
++
++msgid "Host to wake up"
++msgstr "Vert som skal startes opp"
++
++msgid "Network interface to use"
++msgstr "Nettverksgrensesnitt"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Noen ganger virker bare ett av disse verktøyene. Hvis ett av de ikke lykkes "
++"med å starte opp verten kan du prøve det andre."
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "Angir grensesnittet som WoL pakken blir sendt ut på"
++
++msgid "Starting WoL utility:"
++msgstr "Starter WoL:"
++
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Wake on LAN er en mekanisme for å starte opp datamaskiner i det lokale "
++"nettverket."
++
++msgid "Wake up host"
++msgstr "Start vert"
++
++msgid "WoL program"
++msgstr "WoL programm"
+diff --git a/feeds/luci/applications/luci-app-wol/po/pl/wol.po b/feeds/luci/applications/luci-app-wol/po/pl/wol.po
+new file mode 100644
+index 0000000..c599b9e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/pl/wol.po
+@@ -0,0 +1,57 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2011-08-25 19:04+0200\n"
++"Last-Translator: Staszek <fistaszek@tlen.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Rozgłaszaj na wszystkie interfejsy"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "Wybierz hosta z listy lub podaj adres MAC maszyny do wybudzenia"
++
++msgid "Host to wake up"
++msgstr "Host do wybudzenia"
++
++msgid "Network interface to use"
++msgstr "Użyty interfejs sieciowy"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Czasem działa tylko jedno z narzędzi. Jeżeli jedno z nich nie zadziała, "
++"proszę użyć drugiego."
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "Definiuje interfejs, na który będzie wysłany pakiet WoL"
++
++msgid "Starting WoL utility:"
++msgstr "Uruchamianie narzędzia WoL:"
++
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"\"Wake on LAN\" to mechanizm służący do zdalnego włączania komputerów w "
++"sieci lokalnej."
++
++msgid "Wake up host"
++msgstr "Wybudź hosta"
++
++msgid "WoL program"
++msgstr "Narzędzie WoL"
+diff --git a/feeds/luci/applications/luci-app-wol/po/pt-br/wol.po b/feeds/luci/applications/luci-app-wol/po/pt-br/wol.po
+new file mode 100644
+index 0000000..6a21a85
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/pt-br/wol.po
+@@ -0,0 +1,56 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2011-10-11 20:31+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Broadcast em todas as interfaces"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "Escolha o computador para acordar ou entre com um endereço MAC"
++
++msgid "Host to wake up"
++msgstr "Computador para acordar"
++
++msgid "Network interface to use"
++msgstr "Interfaces de rede para usar"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Algumas vezes, somente uma das ferramentas funciona. Se uma delas falhar, "
++"tente a outra"
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "Especifica a interface para onde os pacotes de WoL serão enviados"
++
++msgid "Starting WoL utility:"
++msgstr "Iniciando utilitário WoL:"
++
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Wake on LAN é um mecanismo para acordar/ligar remotamente computadores na "
++"rede local."
++
++msgid "Wake up host"
++msgstr "Acorda um computador"
++
++msgid "WoL program"
++msgstr "Programa WoL"
+diff --git a/feeds/luci/applications/luci-app-wol/po/pt/wol.po b/feeds/luci/applications/luci-app-wol/po/pt/wol.po
+new file mode 100644
+index 0000000..540e543
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/pt/wol.po
+@@ -0,0 +1,54 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2013-05-30 22:54+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: none\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Broadcast em todas as interfaces"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "Escolha ao host a acordar ou escreva um MAC personalizado a ser usado"
++
++msgid "Host to wake up"
++msgstr "Host a acordar"
++
++msgid "Network interface to use"
++msgstr "Interface de rede a usar"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr "Às vezes só uma das ferramentas funciona. Se uma falhar, tente a outra"
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "Especifica a interface pela qual é enviado o pacota WoL"
++
++msgid "Starting WoL utility:"
++msgstr "A iniciar a ferramenta WoL"
++
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Wake on LAN é um mecanismo para remotamente iniciar computadores numa rede "
++"local."
++
++msgid "Wake up host"
++msgstr "Acordar host"
++
++msgid "WoL program"
++msgstr "Programa de WoL"
+diff --git a/feeds/luci/applications/luci-app-wol/po/ro/wol.po b/feeds/luci/applications/luci-app-wol/po/ro/wol.po
+new file mode 100644
+index 0000000..154a3f9
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/ro/wol.po
+@@ -0,0 +1,57 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2011-10-07 16:47+0200\n"
++"Last-Translator: Daniel <daniel.petre@pitesti.rcs-rds.ro>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "Broadcast pe toate interfetele"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "Alege statie pentru \"trezire\" sau introdu o adresa MAC de folosit"
++
++msgid "Host to wake up"
++msgstr "Statie pentru \"trezire\""
++
++msgid "Network interface to use"
++msgstr "Interfata de retea pentru utilizare"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Uneori doar una dintre metode functioneaza. Daca se intampla, incearc-o pe "
++"cealalta"
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "Specifica interfata prin care pachetele WoL sunt trimise"
++
++msgid "Starting WoL utility:"
++msgstr "Pornire utilitar WoL:"
++
++msgid "Wake on LAN"
++msgstr "Activarea pe LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Activarea pe LAN e un mecanism pentru a porni de la distanta computere de pe "
++"retea."
++
++msgid "Wake up host"
++msgstr "Statie de \"trezire\""
++
++msgid "WoL program"
++msgstr "Program WoL"
+diff --git a/feeds/luci/applications/luci-app-wol/po/ru/wol.po b/feeds/luci/applications/luci-app-wol/po/ru/wol.po
+new file mode 100644
+index 0000000..9a84366
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/ru/wol.po
+@@ -0,0 +1,59 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: wol\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2012-08-15 12:07+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "ИÑпользовать широковещательную передачу на вÑе интерфейÑÑ‹"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "Выберите хоÑÑ‚, который необходимо разбудить, или введите его MAC-адреÑ"
++
++msgid "Host to wake up"
++msgstr "ХоÑÑ‚, который необходимо разбудить"
++
++msgid "Network interface to use"
++msgstr "ИÑпользуемый Ñетевой интерфейÑ"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Иногда только одна из двух утилит работает. Ð’ Ñлучае ошибки, попробуйте "
++"иÑпользовать другую"
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "ОпределÑет интерфейÑ, по которому будут поÑланы пакеты WoL"
++
++msgid "Starting WoL utility:"
++msgstr "ЗапуÑк WoL утилиты:"
++
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"Пробуждение по LAN (Wake on LAN, WoL) - технологиÑ, позволÑÑŽÑ‰Ð°Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾ "
++"«разбудить» (включить) компьютер поÑредÑтвом отправки через локальную Ñеть "
++"Ñпециальным образом Ñформированного пакета данных."
++
++msgid "Wake up host"
++msgstr "Разбудить хоÑÑ‚"
++
++msgid "WoL program"
++msgstr "Программа WoL"
+diff --git a/feeds/luci/applications/luci-app-wol/po/sk/wol.po b/feeds/luci/applications/luci-app-wol/po/sk/wol.po
+new file mode 100644
+index 0000000..eea59eb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/sk/wol.po
+@@ -0,0 +1,44 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Broadcast on all interfaces"
++msgstr ""
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++
++msgid "Host to wake up"
++msgstr ""
++
++msgid "Network interface to use"
++msgstr ""
++
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr ""
++
++msgid "Starting WoL utility:"
++msgstr ""
++
++msgid "Wake on LAN"
++msgstr ""
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++
++msgid "Wake up host"
++msgstr ""
++
++msgid "WoL program"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wol/po/sv/wol.po b/feeds/luci/applications/luci-app-wol/po/sv/wol.po
+new file mode 100644
+index 0000000..44b5995
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/sv/wol.po
+@@ -0,0 +1,45 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Broadcast on all interfaces"
++msgstr ""
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++
++msgid "Host to wake up"
++msgstr ""
++
++msgid "Network interface to use"
++msgstr ""
++
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr ""
++
++msgid "Starting WoL utility:"
++msgstr ""
++
++msgid "Wake on LAN"
++msgstr ""
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++
++msgid "Wake up host"
++msgstr ""
++
++msgid "WoL program"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wol/po/templates/wol.pot b/feeds/luci/applications/luci-app-wol/po/templates/wol.pot
+new file mode 100644
+index 0000000..1305c53
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/templates/wol.pot
+@@ -0,0 +1,37 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Broadcast on all interfaces"
++msgstr ""
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++
++msgid "Host to wake up"
++msgstr ""
++
++msgid "Network interface to use"
++msgstr ""
++
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr ""
++
++msgid "Starting WoL utility:"
++msgstr ""
++
++msgid "Wake on LAN"
++msgstr ""
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++
++msgid "Wake up host"
++msgstr ""
++
++msgid "WoL program"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wol/po/tr/wol.po b/feeds/luci/applications/luci-app-wol/po/tr/wol.po
+new file mode 100644
+index 0000000..9be6934
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/tr/wol.po
+@@ -0,0 +1,49 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2010-04-19 00:29+0200\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Broadcast on all interfaces"
++msgstr ""
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++
++msgid "Host to wake up"
++msgstr ""
++
++msgid "Network interface to use"
++msgstr ""
++
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr ""
++
++msgid "Starting WoL utility:"
++msgstr ""
++
++msgid "Wake on LAN"
++msgstr ""
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++
++msgid "Wake up host"
++msgstr ""
++
++msgid "WoL program"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wol/po/uk/wol.po b/feeds/luci/applications/luci-app-wol/po/uk/wol.po
+new file mode 100644
+index 0000000..c09d144
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/uk/wol.po
+@@ -0,0 +1,59 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2013-05-26 19:00+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Broadcast on all interfaces"
++msgstr "Широкомовна транÑлÑÑ†Ñ–Ñ Ð½Ð° вÑÑ–Ñ… інтерфейÑах"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++"Виберіть комп'ютер, Ñкий необхідно розбудити або введіть кориÑтувацьку MAC-"
++"адреÑу"
++
++msgid "Host to wake up"
++msgstr "Комп'ютер, Ñкий необхідно розбудити"
++
++msgid "Network interface to use"
++msgstr "ВикориÑтовувати мережевий інтерфейÑ"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++"Іноді працює тільки одна з цих двох утиліт. Якщо одна з них не працює, "
++"Ñпробуйте іншу."
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "Визначає інтерфейÑ, Ñким буде надіÑлано пакет WoL"
++
++msgid "Starting WoL utility:"
++msgstr "ЗапуÑк утиліти WoL:"
++
++msgid "Wake on LAN"
++msgstr "Wake on LAN"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++"ÐŸÑ€Ð¾Ð±ÑƒÐ´Ð¶ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· LAN (Wake on LAN) Ñ” технологією, що дає змогу віддалено "
++"\"будити\" (вмикати) комп'ютери у локальній мережі."
++
++msgid "Wake up host"
++msgstr "Розбудити комп'ютер"
++
++msgid "WoL program"
++msgstr "Программа WoL"
+diff --git a/feeds/luci/applications/luci-app-wol/po/vi/wol.po b/feeds/luci/applications/luci-app-wol/po/vi/wol.po
+new file mode 100644
+index 0000000..9be6934
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/vi/wol.po
+@@ -0,0 +1,49 @@
++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua
++#
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2010-04-19 00:29+0200\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Broadcast on all interfaces"
++msgstr ""
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr ""
++
++msgid "Host to wake up"
++msgstr ""
++
++msgid "Network interface to use"
++msgstr ""
++
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr ""
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr ""
++
++msgid "Starting WoL utility:"
++msgstr ""
++
++msgid "Wake on LAN"
++msgstr ""
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr ""
++
++msgid "Wake up host"
++msgstr ""
++
++msgid "WoL program"
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wol/po/zh-cn/wol.po b/feeds/luci/applications/luci-app-wol/po/zh-cn/wol.po
+new file mode 100644
+index 0000000..6d9cc72
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/zh-cn/wol.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-19 00:29+0200\n"
++"PO-Revision-Date: 2012-06-21 17:52+0200\n"
++"Last-Translator: phantasm131 <phantasm131@gmail.com>\n"
++"Language-Team: QQ Group 75543259 <axishero@foxmail.com>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "å‘所有接å£å¹¿æ’­"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "选择è¦å”¤é†’的主机或者输入自定义mac地å€"
++
++msgid "Host to wake up"
++msgstr "选择è¦å”¤é†’的主机"
++
++msgid "Network interface to use"
++msgstr "选择使用的网络接å£"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr "有时åªæœ‰ä¸€ä¸ªå·¥å…·ç”Ÿæ•ˆã€‚如果其中一个失效,请å°è¯•å¦ä¸€ä¸ª"
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "é™å®šç½‘络唤醒数æ®åŒ…将被å‘é€åˆ°çš„接å£"
++
++msgid "Starting WoL utility:"
++msgstr "正在å¯åŠ¨ç½‘络唤醒工具"
++
++msgid "Wake on LAN"
++msgstr "网络唤醒"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr "网络唤醒æ供了从远程å¯åŠ¨æœ¬åœ°ç½‘络内计算机的机制。"
++
++msgid "Wake up host"
++msgstr "唤醒主机"
++
++msgid "WoL program"
++msgstr "网络唤醒程åº"
+diff --git a/feeds/luci/applications/luci-app-wol/po/zh-tw/wol.po b/feeds/luci/applications/luci-app-wol/po/zh-tw/wol.po
+new file mode 100644
+index 0000000..ee290ec
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wol/po/zh-tw/wol.po
+@@ -0,0 +1,48 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 10:25+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Broadcast on all interfaces"
++msgstr "廣播到所有介é¢"
++
++msgid "Choose the host to wake up or enter a custom MAC address to use"
++msgstr "å«é†’訂é¸çš„主機或者打入特定的MACä½å€ä»¥ä¾¿ä½¿ç”¨"
++
++msgid "Host to wake up"
++msgstr "è¦å–šé†’主機清單"
++
++msgid "Network interface to use"
++msgstr "使用的網路介é¢"
++
++#, fuzzy
++msgid ""
++"Sometimes only one of the two tools works. If one fails, try the other one"
++msgstr "æŸäº›æ™‚候全部工具裡é¢åªæœ‰ä¸€å€‹ç™¼ç”Ÿä½œç”¨,試試å¦å¤–一個"
++
++msgid "Specifies the interface the WoL packet is sent on"
++msgstr "指定WoL喚醒å°åŒ…將傳到哪個介é¢"
++
++msgid "Starting WoL utility:"
++msgstr "啟用喚醒工具:"
++
++msgid "Wake on LAN"
++msgstr "LANå€ç¶²å–šé†’"
++
++msgid ""
++"Wake on LAN is a mechanism to remotely boot computers in the local network."
++msgstr "Wol就是在本地網路中é‡å°é ç«¯é–‹æ©Ÿé›»è…¦å–šé†’的機制"
++
++msgid "Wake up host"
++msgstr "喚醒主機"
++
++msgid "WoL program"
++msgstr "Wol喚醒程å¼"
+diff --git a/feeds/luci/applications/luci-app-wshaper/Makefile b/feeds/luci/applications/luci-app-wshaper/Makefile
+new file mode 100644
+index 0000000..63e63ab
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for wshaper
++LUCI_DEPENDS:=+wshaper
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/applications/luci-app-wshaper/luasrc/controller/wshaper.lua b/feeds/luci/applications/luci-app-wshaper/luasrc/controller/wshaper.lua
+new file mode 100644
+index 0000000..2d0fe48
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/luasrc/controller/wshaper.lua
+@@ -0,0 +1,9 @@
++-- Copyright 2011 Manuel Munz <freifunk somakoma de>
++-- Licensed to the public under the Apache License 2.0.
++
++module "luci.controller.wshaper"
++
++function index()
++ entry({"admin", "network", "wshaper"}, cbi("wshaper"), _("Wondershaper"), 80)
++end
++
+diff --git a/feeds/luci/applications/luci-app-wshaper/luasrc/model/cbi/wshaper.lua b/feeds/luci/applications/luci-app-wshaper/luasrc/model/cbi/wshaper.lua
+new file mode 100644
+index 0000000..6bd0255
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/luasrc/model/cbi/wshaper.lua
+@@ -0,0 +1,46 @@
++-- Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.tools.webadmin")
++
++m = Map("wshaper", translate("Wondershaper"),
++ translate("Wondershaper shapes traffic to ensure low latencies for interactive traffic even when your " ..
++ "internet connection is highly saturated."))
++
++s = m:section(NamedSection, "settings", "wshaper", translate("Wondershaper settings"))
++s.anonymous = true
++
++network = s:option(ListValue, "network", translate("Interface"))
++luci.tools.webadmin.cbi_add_networks(network)
++
++uplink = s:option(Value, "uplink", translate("Uplink"), translate("Upstream bandwidth in kbit/s"))
++uplink.optional = false
++uplink.datatype = "uinteger"
++uplink.default = "240"
++
++uplink = s:option(Value, "downlink", translate("Downlink"), translate("Downstream bandwidth in kbit/s"))
++uplink.optional = false
++uplink.datatype = "uinteger"
++uplink.default = "200"
++
++nopriohostsrc = s:option(DynamicList, "nopriohostsrc", translate("Low priority hosts (Source)"), translate("Host or Network in CIDR notation."))
++nopriohostsrc.optional = true
++nopriohostsrc.datatype = ipaddr
++nopriohostsrc.placeholder = "10.0.0.1/32"
++
++nopriohostdst = s:option(DynamicList, "nopriohostdst", translate("Low priority hosts (Destination)"), translate("Host or Network in CIDR notation."))
++nopriohostdst.optional = true
++nopriohostdst.datatype = ipaddr
++nopriohostdst.placeholder = "10.0.0.1/32"
++
++noprioportsrc = s:option(DynamicList, "noprioportsrc", translate("Low priority source ports"))
++noprioportsrc.optional = true
++noprioportsrc.datatype = "range(0,65535)"
++noprioportsrc.placeholder = "21"
++
++noprioportdst = s:option(DynamicList, "noprioportdst", translate("Low priority destination ports"))
++noprioportdst.optional = true
++noprioportdst.datatype = "range(0,65535)"
++noprioportdst.placeholder = "21"
++
++return m
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/ca/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/ca/wshaper.po
+new file mode 100644
+index 0000000..2560383
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/ca/wshaper.po
+@@ -0,0 +1,59 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2014-06-01 22:51+0200\n"
++"PO-Revision-Date: 2014-07-01 03:51+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Downlink"
++msgstr "Enllaç descendent"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "Amplada de banda descendent en kbit/s"
++
++msgid "Host or Network in CIDR notation."
++msgstr "Host o xarxa en notació CIDR."
++
++msgid "Interface"
++msgstr "Interfície"
++
++msgid "Low priority destination ports"
++msgstr "Ports de destí de baixa prioritat"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Hosts de baixa prioritat (destí)"
++
++msgid "Low priority hosts (Source)"
++msgstr "Hosts de baixa prioritat (origen)"
++
++msgid "Low priority source ports"
++msgstr "Ports d'origen de baixa prioritat"
++
++msgid "Uplink"
++msgstr "Enllaç ascendent"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "Amplada de banda ascendent en kbit/s"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "Ajusts del Wondershaper"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"Wondershapter afaiçona el trànsit per assegurar latències baixes per a "
++"trànsit interactiu encara que la vostra connexió de Internet estigui "
++"altament saturada."
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/cs/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/cs/wshaper.po
+new file mode 100644
+index 0000000..bca6c4e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/cs/wshaper.po
+@@ -0,0 +1,58 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-24 15:20+0200\n"
++"Last-Translator: awm1 <awm1klimes8vladimir@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Downlink"
++msgstr "Příchozí rychlost"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "Rychlost stahování dat v kbit/s"
++
++msgid "Host or Network in CIDR notation."
++msgstr "Adresa poÄítaÄe nebo sítÄ› v CIDR notaci."
++
++msgid "Interface"
++msgstr "Síťové rozhraní"
++
++msgid "Low priority destination ports"
++msgstr "Cílové porty s nízkou prioritou"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Adresy cílových poÄítaÄů s nízkou prioritou"
++
++msgid "Low priority hosts (Source)"
++msgstr "Adresy zdrojových poÄítaÄů s nízkou prioritou"
++
++msgid "Low priority source ports"
++msgstr "Zdrojové porty s nízkou prioritou"
++
++msgid "Uplink"
++msgstr "Odchozí rychlost"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "Rychlost odesílání dat v kbit/s"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "Nastavení skriptu Wondershaper"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"Úkolem skriptu Wondershaper je řízení provozu na daném síťovém rozhraní. "
++"Snaží se zajistit nízké přenosové zpoždění pro \"interaktivní\" síťový "
++"provoz (např. SSH), a to především v okamžicích, kdy ostatní síťový provoz "
++"zahltí linku."
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/de/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/de/wshaper.po
+new file mode 100644
+index 0000000..39dd617
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/de/wshaper.po
+@@ -0,0 +1,58 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: \n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: 2011-10-18 12:28+0200\n"
++"Last-Translator: Manuel <freifunk@somakoma.de>\n"
++"Language-Team: \n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Downlink"
++msgstr "Download"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "Download Bandbreite in kbit/s"
++
++msgid "Host or Network in CIDR notation."
++msgstr "Rechner oder Netzwerk in CIDR Schreibweise"
++
++msgid "Interface"
++msgstr "Schnittstelle"
++
++msgid "Low priority destination ports"
++msgstr "Zielports mit niedriger Priorität"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Zielrechner mit nideriger Priorität"
++
++msgid "Low priority hosts (Source)"
++msgstr "Quellrechner mit neidriger Priorität"
++
++msgid "Low priority source ports"
++msgstr "Quellports mit niedriger Priorität"
++
++msgid "Uplink"
++msgstr "Upload"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "Upload Bandbreite in kbit/s"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "Wondershaper Einstellungen"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"Wondershaper ermöglicht mit Hilfe von Traffic Shaping niedrige Latenzzeiten "
++"für interaktiven Internetverkehr selbst wenn die Internetverbindung extrem "
++"ausgelastet ist."
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/el/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/el/wshaper.po
+new file mode 100644
+index 0000000..6d2f092
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/el/wshaper.po
+@@ -0,0 +1,55 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-03-18 17:10+0200\n"
++"PO-Revision-Date: 2012-03-18 17:10+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr "Διεπαφή"
++
++msgid "Low priority destination ports"
++msgstr ""
++
++msgid "Low priority hosts (Destination)"
++msgstr ""
++
++msgid "Low priority hosts (Source)"
++msgstr ""
++
++msgid "Low priority source ports"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/en/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/en/wshaper.po
+new file mode 100644
+index 0000000..b685839
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/en/wshaper.po
+@@ -0,0 +1,54 @@
++msgid ""
++msgstr ""
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"Project-Id-Version: LuCI\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: \n"
++"Last-Translator: \n"
++"Language-Team: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Language: en\n"
++"X-Generator: Poedit 1.6.10\n"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Low priority destination ports"
++msgstr ""
++
++msgid "Low priority hosts (Destination)"
++msgstr ""
++
++msgid "Low priority hosts (Source)"
++msgstr ""
++
++msgid "Low priority source ports"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/es/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/es/wshaper.po
+new file mode 100644
+index 0000000..f562760
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/es/wshaper.po
+@@ -0,0 +1,58 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-04-16 01:00+0200\n"
++"PO-Revision-Date: 2012-09-03 18:57+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Downlink"
++msgstr "Enlace de bajada"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "Ancho de banda de bajada en Kbit/s"
++
++msgid "Host or Network in CIDR notation."
++msgstr "Máquina o red en notación CIDR."
++
++msgid "Interface"
++msgstr "Interfaz"
++
++msgid "Low priority destination ports"
++msgstr "Puertos de destino de prioridad baja"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Máquinas de prioridad baja (destino)"
++
++msgid "Low priority hosts (Source)"
++msgstr "Máquinas de prioridad baja (origen)"
++
++msgid "Low priority source ports"
++msgstr "Puertos de origen de prioridad baja"
++
++msgid "Uplink"
++msgstr "Enlace de salida"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "Ancho de banda de subida en Kbit/s"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "Configuración de Wondershaper"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"Wondershaper modela el tráfico para asegurar latencias bajas al tráfico "
++"interactivo incluso cuando la conexión a Internet esté muy saturada."
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/fr/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/fr/wshaper.po
+new file mode 100644
+index 0000000..2fc9f53
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/fr/wshaper.po
+@@ -0,0 +1,62 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"Project-Id-Version: LuCI\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: \n"
++"Last-Translator: \n"
++"Language-Team: \n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Language: fr\n"
++"X-Generator: Poedit 1.6.10\n"
++
++msgid "Downlink"
++msgstr "Lien descendant (télé-chargement)"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "Bande-passante descendante en kbit/s"
++
++msgid "Host or Network in CIDR notation."
++msgstr "Hôte ou réseau en notation CIDR."
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Low priority destination ports"
++msgstr "Ports-cible à faible priorité"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Hôtes-cible à faible priorité"
++
++msgid "Low priority hosts (Source)"
++msgstr "Hôtes-source à faible priorité"
++
++msgid "Low priority source ports"
++msgstr "Ports-source à faible priorité"
++
++msgid "Uplink"
++msgstr "Lien montant (envois)"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "Bande-passante montante en kbit/s"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "Paramètres Wondershaper"
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++
++#~ msgid ""
++#~ "Wondershaper uses traffic shaping to ensure low latencies for interactive "
++#~ "traffic even when your internet connection is highly saturated."
++#~ msgstr ""
++#~ "Wondershaper gère la priorités entre les flux pour assurer une faible "
++#~ "latence au trafic interactif même quand votre connexion Internet est très "
++#~ "chargée."
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/he/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/he/wshaper.po
+new file mode 100644
+index 0000000..f03d5df
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/he/wshaper.po
+@@ -0,0 +1,54 @@
++msgid ""
++msgstr ""
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"Project-Id-Version: LuCI\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: \n"
++"Last-Translator: \n"
++"Language-Team: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Language: he\n"
++"X-Generator: Poedit 1.6.10\n"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Low priority destination ports"
++msgstr ""
++
++msgid "Low priority hosts (Destination)"
++msgstr ""
++
++msgid "Low priority hosts (Source)"
++msgstr ""
++
++msgid "Low priority source ports"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/hu/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/hu/wshaper.po
+new file mode 100644
+index 0000000..2377fa5
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/hu/wshaper.po
+@@ -0,0 +1,54 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Downlink"
++msgstr "Letöltés"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "Letöltési sebesség kbit/másodberc-ben"
++
++msgid "Host or Network in CIDR notation."
++msgstr "Gép vagy hálózat (CIDR jelöléssel)"
++
++msgid "Interface"
++msgstr "Interfész"
++
++msgid "Low priority destination ports"
++msgstr "Alacsony prioritású cél portok"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Alacson prioritású cél gépek"
++
++msgid "Low priority hosts (Source)"
++msgstr "Alacsony prioritású forrás gépek"
++
++msgid "Low priority source ports"
++msgstr "Alacson prioritású forrás portok"
++
++msgid "Uplink"
++msgstr "Feltöltés"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "Feltöltési sebesség kbit/másodperc-ben"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "Wondershaper beállítások"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"A Wondershaper 'traffic shaping'-et használatával biztosítja az interaktív "
++"forgalom alacsony késleletetését még akkor is ha az internet kapcsolat "
++"erősen leterhelt."
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/it/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/it/wshaper.po
+new file mode 100644
+index 0000000..6a72c7e
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/it/wshaper.po
+@@ -0,0 +1,59 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-01-28 01:36+0200\n"
++"PO-Revision-Date: 2013-02-03 14:07+0200\n"
++"Last-Translator: Francesco <3gasas@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Downlink"
++msgstr "Collegamento discendente"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "Larghezza di banda in downstream in kbit/s"
++
++msgid "Host or Network in CIDR notation."
++msgstr "Host o rete in notazione CIDR."
++
++msgid "Interface"
++msgstr "Interfaccia"
++
++msgid "Low priority destination ports"
++msgstr "Porte di destinazione a bassa priorità"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Hosts a bassa priorità (Destinazione)"
++
++msgid "Low priority hosts (Source)"
++msgstr "Hosts a bassa priorità (Fonte)"
++
++msgid "Low priority source ports"
++msgstr "Porte sorgenti a bassa priorità"
++
++msgid "Uplink"
++msgstr "Uplink"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "Larghezza di banda in upstream in kbit/s"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "Impostazioni Wondershaper"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"WonderShaper usa la regolazione del traffico per garantire bassa latenza per "
++"il traffico interattivo anche quando la connessione a Internet è molto "
++"satura."
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/ja/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/ja/wshaper.po
+new file mode 100644
+index 0000000..d58476c
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/ja/wshaper.po
+@@ -0,0 +1,58 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-03-17 18:28+0200\n"
++"PO-Revision-Date: 2012-03-18 09:07+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.4\n"
++
++msgid "Downlink"
++msgstr "下りリンク"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "下りリンク帯域 (kbit/sec)"
++
++msgid "Host or Network in CIDR notation."
++msgstr "ホストåã¾ãŸã¯CIDR表記ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++msgid "Interface"
++msgstr "インターフェース"
++
++msgid "Low priority destination ports"
++msgstr "低優先度ã®å®›å…ˆãƒãƒ¼ãƒˆ"
++
++msgid "Low priority hosts (Destination)"
++msgstr "低優先度ã®å®›å…ˆãƒ›ã‚¹ãƒˆ"
++
++msgid "Low priority hosts (Source)"
++msgstr "低優先度ã®é€ä¿¡å…ƒãƒ›ã‚¹ãƒˆ"
++
++msgid "Low priority source ports"
++msgstr "低優先度ã®é€ä¿¡å…ƒãƒãƒ¼ãƒˆ"
++
++msgid "Uplink"
++msgstr "上りリンク"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "上りリンク帯域 (kbit/sec)"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "Wondershaper 設定"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"Wondweshaperã¯ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šãŒé£½å’ŒçŠ¶æ…‹ã®å ´åˆã§ã‚‚ã€ä½Žã„レイテンシ・円滑"
++"ãªé€šä¿¡ã‚’実ç¾ã™ã‚‹ãŸã‚ã«ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚·ã‚§ãƒ¼ãƒ”ングを行ã„ã¾ã™ã€‚"
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/ms/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/ms/wshaper.po
+new file mode 100644
+index 0000000..ede1386
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/ms/wshaper.po
+@@ -0,0 +1,54 @@
++msgid ""
++msgstr ""
++"Plural-Forms: nplurals=1; plural=0;\n"
++"Project-Id-Version: LuCI\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: \n"
++"Last-Translator: \n"
++"Language-Team: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Language: ms\n"
++"X-Generator: Poedit 1.6.10\n"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Low priority destination ports"
++msgstr ""
++
++msgid "Low priority hosts (Destination)"
++msgstr ""
++
++msgid "Low priority hosts (Source)"
++msgstr ""
++
++msgid "Low priority source ports"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/no/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/no/wshaper.po
+new file mode 100644
+index 0000000..1b1ab32
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/no/wshaper.po
+@@ -0,0 +1,54 @@
++msgid ""
++msgstr ""
++"Language: nn\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"Project-Id-Version: LuCI\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: \n"
++"Last-Translator: \n"
++"Language-Team: \n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Poedit 1.6.10\n"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Low priority destination ports"
++msgstr ""
++
++msgid "Low priority hosts (Destination)"
++msgstr ""
++
++msgid "Low priority hosts (Source)"
++msgstr ""
++
++msgid "Low priority source ports"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/pl/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/pl/wshaper.po
+new file mode 100644
+index 0000000..a85bf00
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/pl/wshaper.po
+@@ -0,0 +1,59 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-04-14 14:15+0200\n"
++"PO-Revision-Date: 2012-04-14 17:21+0200\n"
++"Last-Translator: Tomecki <przykryweczka@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Downlink"
++msgstr "Downlink"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "Przepustowość pobierania w kbit/s"
++
++msgid "Host or Network in CIDR notation."
++msgstr "Adres hosta lub adres sieci w notacji CIDR"
++
++msgid "Interface"
++msgstr "Interfejs"
++
++msgid "Low priority destination ports"
++msgstr "Porty docelowe o niskim priorytecie"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Hosty docelowe o niskim priorytecie"
++
++msgid "Low priority hosts (Source)"
++msgstr "Hosty źródłowe o niskim priorytecie"
++
++msgid "Low priority source ports"
++msgstr "Porty źródłowe o niskim priorytecie"
++
++msgid "Uplink"
++msgstr "Uplink"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "Przepustowość wysyłania w kbit/s"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "Ustawienia Wondershaper"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"Wondershaper wykorzystuje kształtowanie ruchu aby zapewnić niskie opóźnienia "
++"nawet wtedy, gdy Twoje połączenie internetowe jest wysycone."
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/pt-br/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/pt-br/wshaper.po
+new file mode 100644
+index 0000000..f973ebb
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/pt-br/wshaper.po
+@@ -0,0 +1,59 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-10-18 19:32+0200\n"
++"PO-Revision-Date: 2011-10-18 19:39+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "Downlink"
++msgstr "Velocidade para baixar (downlink)"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "Taxa de transferência para baixar em kbit/s"
++
++msgid "Host or Network in CIDR notation."
++msgstr "Equipamento ou Rede na notação CIDR."
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Low priority destination ports"
++msgstr "Portas de destino de baixa prioridade"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Equipamentos de baixa prioridade (Destino)"
++
++msgid "Low priority hosts (Source)"
++msgstr "Equipamentos de baixa prioridade (Origem)"
++
++msgid "Low priority source ports"
++msgstr "Portas de origem de baixa prioridade"
++
++msgid "Uplink"
++msgstr "Velocidade para subir (uplink)"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "Taxa de transferência para subir em kbit/s"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "Configuração do Wondershaper"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"Wondershaper usa o controle de tráfego para garantir baixa latência para "
++"tráfego interativo mesmo quando sua conexão com a internet está extremamente "
++"saturada."
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/pt/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/pt/wshaper.po
+new file mode 100644
+index 0000000..96a7be8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/pt/wshaper.po
+@@ -0,0 +1,55 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2013-05-31 12:13+0200\n"
++"PO-Revision-Date: 2013-05-31 12:15+0200\n"
++"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Low priority destination ports"
++msgstr "Porta de destino com baixa prioridade"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Hosts com baixa prioridade (Destino)"
++
++msgid "Low priority hosts (Source)"
++msgstr "Hosts com baixa prioridade (Origem)"
++
++msgid "Low priority source ports"
++msgstr "Portas de origem com baixa prioridade"
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/ro/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/ro/wshaper.po
+new file mode 100644
+index 0000000..d2569f6
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/ro/wshaper.po
+@@ -0,0 +1,56 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2014-06-28 18:45+0200\n"
++"PO-Revision-Date: 2014-06-28 18:46+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Low priority destination ports"
++msgstr ""
++
++msgid "Low priority hosts (Destination)"
++msgstr ""
++
++msgid "Low priority hosts (Source)"
++msgstr ""
++
++msgid "Low priority source ports"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/ru/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/ru/wshaper.po
+new file mode 100644
+index 0000000..1984aac
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/ru/wshaper.po
+@@ -0,0 +1,61 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: wsharper\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2012-01-26 15:09+0200\n"
++"PO-Revision-Date: 2012-08-15 11:53+0300\n"
++"Last-Translator: Roman A. aka BasicXP <x12ozmouse@ya.ru>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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.4\n"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "Downlink"
++msgstr "ÐиÑходÑщий канал"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "Ширина полоÑÑ‹ пропуÑÐºÐ°Ð½Ð¸Ñ Ð¿Ñ€Ñмого канала (кбит/Ñ)"
++
++msgid "Host or Network in CIDR notation."
++msgstr "ХоÑÑ‚ или Ñеть в нотации CIDR."
++
++msgid "Interface"
++msgstr "ИнтерфейÑ"
++
++msgid "Low priority destination ports"
++msgstr "Ðизкоприоритетные порты назначениÑ"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Ðизкоприоритетные хоÑÑ‚Ñ‹ назначениÑ"
++
++msgid "Low priority hosts (Source)"
++msgstr "Ðизкоприоритетные хоÑÑ‚Ñ‹ иÑточника"
++
++msgid "Low priority source ports"
++msgstr "Ðизкоприоритетные порты иÑточника"
++
++msgid "Uplink"
++msgstr "ВоÑходÑщий канал"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "ПропуÑÐºÐ½Ð°Ñ ÑпоÑобноÑÑ‚ÑŒ обратного канала (кбит/c)"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "УÑтановки Wondershaper"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"Wondershaper иÑпользует формирование трафика Ð´Ð»Ñ Ð¾Ð±ÐµÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð½Ð¸Ð·ÐºÐ¸Ñ… задержек "
++"интерактивного трафика даже в Ñлучае выÑокой загруженноÑти интернет-"
++"ÑоединениÑ."
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/sk/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/sk/wshaper.po
+new file mode 100644
+index 0000000..4e03aa8
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/sk/wshaper.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Low priority destination ports"
++msgstr ""
++
++msgid "Low priority hosts (Destination)"
++msgstr ""
++
++msgid "Low priority hosts (Source)"
++msgstr ""
++
++msgid "Low priority source ports"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/sv/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/sv/wshaper.po
+new file mode 100644
+index 0000000..b85651a
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/sv/wshaper.po
+@@ -0,0 +1,51 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Low priority destination ports"
++msgstr ""
++
++msgid "Low priority hosts (Destination)"
++msgstr ""
++
++msgid "Low priority hosts (Source)"
++msgstr ""
++
++msgid "Low priority source ports"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/templates/wshaper.pot b/feeds/luci/applications/luci-app-wshaper/po/templates/wshaper.pot
+new file mode 100644
+index 0000000..42de011
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/templates/wshaper.pot
+@@ -0,0 +1,43 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Low priority destination ports"
++msgstr ""
++
++msgid "Low priority hosts (Destination)"
++msgstr ""
++
++msgid "Low priority hosts (Source)"
++msgstr ""
++
++msgid "Low priority source ports"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/tr/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/tr/wshaper.po
+new file mode 100644
+index 0000000..7c0acb0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/tr/wshaper.po
+@@ -0,0 +1,50 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\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"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Low priority destination ports"
++msgstr ""
++
++msgid "Low priority hosts (Destination)"
++msgstr ""
++
++msgid "Low priority hosts (Source)"
++msgstr ""
++
++msgid "Low priority source ports"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/uk/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/uk/wshaper.po
+new file mode 100644
+index 0000000..94d20df
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/uk/wshaper.po
+@@ -0,0 +1,58 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2012-04-28 21:54+0200\n"
++"Last-Translator: Yurii <yuripet@gmail.com>\n"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "Downlink"
++msgstr "ПрÑмий канал"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "Ширина Ñмуги пропуÑÐºÐ°Ð½Ð½Ñ Ð¿Ñ€Ñмого каналу (кбіт/Ñ)"
++
++msgid "Host or Network in CIDR notation."
++msgstr "Вузол або мережа в нотації CIDR."
++
++msgid "Interface"
++msgstr "ІнтерфейÑ"
++
++msgid "Low priority destination ports"
++msgstr "Ðизькопріоритетні порти призначеннÑ"
++
++msgid "Low priority hosts (Destination)"
++msgstr "Ðизькопріоритетні вузли призначеннÑ"
++
++msgid "Low priority hosts (Source)"
++msgstr "Ðизькопріоритетні вузли джерела"
++
++msgid "Low priority source ports"
++msgstr "Ðизькопріоритетні порти джерела"
++
++msgid "Uplink"
++msgstr "Зворотній канал"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "Ширина Ñмуги пропуÑÐºÐ°Ð½Ð½Ñ Ð·Ð²Ð¾Ñ€Ð¾Ñ‚Ð½Ð¾Ð³Ð¾ каналу (кбіт/c)"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Wondershaper"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"Wondershaper викориÑтовує Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð°Ñ„Ñ–ÐºÑƒ Ð´Ð»Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð½Ð¸Ð·ÑŒÐºÐ¾Ñ— "
++"затримки інтерактивного трафіку, навіть Ñкщо ваше з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· інтернетом "
++"дуже наÑичене."
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/vi/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/vi/wshaper.po
+new file mode 100644
+index 0000000..e0b8e53
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/vi/wshaper.po
+@@ -0,0 +1,54 @@
++msgid ""
++msgstr ""
++"Plural-Forms: nplurals=1; plural=0;\n"
++"Project-Id-Version: LuCI\n"
++"POT-Creation-Date: \n"
++"PO-Revision-Date: \n"
++"Last-Translator: \n"
++"Language-Team: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Language: vi\n"
++"X-Generator: Poedit 1.6.10\n"
++
++msgid "Downlink"
++msgstr ""
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Host or Network in CIDR notation."
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Low priority destination ports"
++msgstr ""
++
++msgid "Low priority hosts (Destination)"
++msgstr ""
++
++msgid "Low priority hosts (Source)"
++msgstr ""
++
++msgid "Low priority source ports"
++msgstr ""
++
++msgid "Uplink"
++msgstr ""
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr ""
++
++msgid "Wondershaper"
++msgstr ""
++
++msgid "Wondershaper settings"
++msgstr ""
++
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/zh-cn/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/zh-cn/wshaper.po
+new file mode 100644
+index 0000000..a35ccd0
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/zh-cn/wshaper.po
+@@ -0,0 +1,58 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-11-03 08:25+0200\n"
++"PO-Revision-Date: 2013-10-10 20:15+0200\n"
++"Last-Translator: Tanyingyu <Tanyingyu@163.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "Downlink"
++msgstr "下载链接"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "下载带宽kbit/s"
++
++msgid "Host or Network in CIDR notation."
++msgstr "主机或网络的CIDR标记。"
++
++msgid "Interface"
++msgstr "端å£"
++
++msgid "Low priority destination ports"
++msgstr "低优先级目标端å£"
++
++msgid "Low priority hosts (Destination)"
++msgstr "低优先级目标主机"
++
++msgid "Low priority hosts (Source)"
++msgstr "低优先级æºä¸»æœº"
++
++msgid "Low priority source ports"
++msgstr "低优先级æºç«¯å£"
++
++msgid "Uplink"
++msgstr "上è”"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "上行带宽kbit/s"
++
++msgid "Wondershaper"
++msgstr "Wondershaper"
++
++msgid "Wondershaper settings"
++msgstr "Wondershaper设置"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"Wondershaper通过æµé‡åŒ¹é…,ç¡®ä¿ä½Žå»¶æ—¶çš„交互数æ®åŒ…,甚至当你的互è”网连接是高度饱"
++"和。"
+diff --git a/feeds/luci/applications/luci-app-wshaper/po/zh-tw/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/zh-tw/wshaper.po
+new file mode 100644
+index 0000000..1814825
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/po/zh-tw/wshaper.po
+@@ -0,0 +1,56 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-14 12:40+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "Downlink"
++msgstr "下載"
++
++msgid "Downstream bandwidth in kbit/s"
++msgstr "以 kbit/s表示的下載頻寬"
++
++msgid "Host or Network in CIDR notation."
++msgstr "CIDR無類別域間路由中的主機或網路"
++
++msgid "Interface"
++msgstr "介é¢"
++
++msgid "Low priority destination ports"
++msgstr "低優先權目地埠號"
++
++msgid "Low priority hosts (Destination)"
++msgstr "低優先權主機(目的地)"
++
++msgid "Low priority hosts (Source)"
++msgstr "低優先權主機(來æº)"
++
++msgid "Low priority source ports"
++msgstr "低優先權來æºåŸ è™Ÿ"
++
++msgid "Uplink"
++msgstr "上傳"
++
++msgid "Upstream bandwidth in kbit/s"
++msgstr "以kbit/s表示的上傳頻寬"
++
++msgid "Wondershaper"
++msgstr "Wondershaper頻寬管ç†"
++
++msgid "Wondershaper settings"
++msgstr "Wondershaper設定值"
++
++#, fuzzy
++msgid ""
++"Wondershaper shapes traffic to ensure low latencies for interactive traffic "
++"even when your internet connection is highly saturated."
++msgstr ""
++"既使你的網路連線é”到高飽和, Wondershaper採用æµé‡éŠ³åŒ–塑形以é‡å°æœªçŸ¥çš„æµé‡ä¿è­‰"
++"低延é²"
+diff --git a/feeds/luci/applications/luci-app-wshaper/root/etc/uci-defaults/wshaper b/feeds/luci/applications/luci-app-wshaper/root/etc/uci-defaults/wshaper
+new file mode 100644
+index 0000000..918dff2
+--- /dev/null
++++ b/feeds/luci/applications/luci-app-wshaper/root/etc/uci-defaults/wshaper
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@wshaper[-1]
++ set ucitrack.wshaper="wshaper"
++ set ucitrack.wshaper.exec='/etc/init.d/wshaper start'
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/luci/build/i18n-init.sh b/feeds/luci/build/i18n-init.sh
+new file mode 100755
+index 0000000..b20fbc3
+--- /dev/null
++++ b/feeds/luci/build/i18n-init.sh
+@@ -0,0 +1,24 @@
++#!/bin/sh
++
++PATTERN=$1
++SCM=
++
++[ -d .svn ] && SCM="svn"
++git=$( which git 2>/dev/null )
++[ "$git" ] && "$git" status >/dev/null && SCM="git"
++
++[ -z "$SCM" ] && {
++ echo "Unsupported SCM tool" >&2
++ exit 1
++}
++
++[ -z "$PATTERN" ] && PATTERN="*.pot"
++
++for lang in $(cd po; echo ?? ??_??); do
++ for file in $(cd po/templates; echo $PATTERN); do
++ if [ -f po/templates/$file -a ! -f "po/$lang/${file%.pot}.po" ]; then
++ msginit --no-translator -l "$lang" -i "po/templates/$file" -o "po/$lang/${file%.pot}.po"
++ $SCM add "po/$lang/${file%.pot}.po"
++ fi
++ done
++done
+diff --git a/feeds/luci/build/i18n-po2lua.pl b/feeds/luci/build/i18n-po2lua.pl
+new file mode 100755
+index 0000000..5129055
+--- /dev/null
++++ b/feeds/luci/build/i18n-po2lua.pl
+@@ -0,0 +1,27 @@
++#!/usr/bin/perl
++
++@ARGV == 2 || die "Usage: $0 <source-dir> <dest-dir>\n";
++
++my $source_dir = shift @ARGV;
++my $target_dir = shift @ARGV;
++
++if( ! -d $target_dir )
++{
++ system('mkdir', '-p', $target_dir);
++}
++
++if( open F, "find $source_dir -type f -name '*.po' |" )
++{
++ while( chomp( my $file = readline F ) )
++ {
++ my ( $lang, $basename ) = $file =~ m{.+/(\w+)/([^/]+)\.po$};
++ $lang = lc $lang;
++ $lang =~ s/_/-/g;
++
++ printf "Generating %-40s ", "$target_dir/$basename.$lang.lmo";
++ system("./build/po2lmo", $file, "$target_dir/$basename.$lang.lmo");
++ print ( -f "$target_dir/$basename.$lang.lmo" ? "done\n" : "empty\n" );
++ }
++
++ close F;
++}
+diff --git a/feeds/luci/build/i18n-scan.pl b/feeds/luci/build/i18n-scan.pl
+new file mode 100755
+index 0000000..899d90d
+--- /dev/null
++++ b/feeds/luci/build/i18n-scan.pl
+@@ -0,0 +1,128 @@
++#!/usr/bin/perl
++
++use strict;
++use warnings;
++use Text::Balanced qw(extract_bracketed extract_delimited extract_tagged);
++
++@ARGV >= 1 || die "Usage: $0 <source direcory>\n";
++
++
++my %stringtable;
++
++sub dec_lua_str
++{
++ my $s = shift;
++ $s =~ s/[\s\n]+/ /g;
++ $s =~ s/\\n/\n/g;
++ $s =~ s/\\t/\t/g;
++ $s =~ s/\\(.)/$1/g;
++ $s =~ s/^ //;
++ $s =~ s/ $//;
++ return $s;
++}
++
++sub dec_tpl_str
++{
++ my $s = shift;
++ $s =~ s/-$//;
++ $s =~ s/[\s\n]+/ /g;
++ $s =~ s/^ //;
++ $s =~ s/ $//;
++ $s =~ s/\\/\\\\/g;
++ return $s;
++}
++
++
++if( open F, "find @ARGV -type f '(' -name '*.htm' -o -name '*.lua' ')' |" )
++{
++ while( defined( my $file = readline F ) )
++ {
++ chomp $file;
++
++ if( open S, "< $file" )
++ {
++ local $/ = undef;
++ my $raw = <S>;
++ close S;
++
++
++ my $text = $raw;
++
++ while( $text =~ s/ ^ .*? (?:translate|translatef|i18n|_) [\n\s]* \( /(/sgx )
++ {
++ ( my $code, $text ) = extract_bracketed($text, q{('")});
++
++ $code =~ s/\\\n/ /g;
++ $code =~ s/^\([\n\s]*//;
++ $code =~ s/[\n\s]*\)$//;
++
++ my $res = "";
++ my $sub = "";
++
++ if( $code =~ /^['"]/ )
++ {
++ while( defined $sub )
++ {
++ ( $sub, $code ) = extract_delimited($code, q{'"}, q{\s*(?:\.\.\s*)?});
++
++ if( defined $sub && length($sub) > 2 )
++ {
++ $res .= substr $sub, 1, length($sub) - 2;
++ }
++ else
++ {
++ undef $sub;
++ }
++ }
++ }
++ elsif( $code =~ /^(\[=*\[)/ )
++ {
++ my $stag = quotemeta $1;
++ my $etag = $stag;
++ $etag =~ s/\[/]/g;
++
++ ( $res ) = extract_tagged($code, $stag, $etag);
++
++ $res =~ s/^$stag//;
++ $res =~ s/$etag$//;
++ }
++
++ $res = dec_lua_str($res);
++ $stringtable{$res}++ if $res;
++ }
++
++
++ $text = $raw;
++
++ while( $text =~ s/ ^ .*? <% -? [:_] /<%/sgx )
++ {
++ ( my $code, $text ) = extract_tagged($text, '<%', '%>');
++
++ if( defined $code )
++ {
++ $code = dec_tpl_str(substr $code, 2, length($code) - 4);
++ $stringtable{$code}++;
++ }
++ }
++ }
++ }
++
++ close F;
++}
++
++
++if( open C, "| msgcat -" )
++{
++ printf C "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n";
++
++ foreach my $key ( sort keys %stringtable )
++ {
++ if( length $key )
++ {
++ $key =~ s/"/\\"/g;
++ printf C "msgid \"%s\"\nmsgstr \"\"\n\n", $key;
++ }
++ }
++
++ close C;
++}
+diff --git a/feeds/luci/build/i18n-sync.sh b/feeds/luci/build/i18n-sync.sh
+new file mode 100755
+index 0000000..d4f9666
+--- /dev/null
++++ b/feeds/luci/build/i18n-sync.sh
+@@ -0,0 +1,18 @@
++#!/bin/sh
++
++[ -d ./build ] || {
++ echo "Execute as ./build/i18n-sync.sh" >&2
++ exit 1
++}
++
++./build/mkbasepot.sh
++
++find . -name '*.pot' -and -not -name base.pot -and -not -name rrdtool.pot | \
++ while read path; do
++ dir="${path%/po/templates/*}"
++ echo -n "Updating ${path#./} ... "
++ ./build/i18n-scan.pl "$dir" > "$path"
++ echo "done"
++ done
++
++./build/i18n-update.pl
+diff --git a/feeds/luci/build/i18n-update.pl b/feeds/luci/build/i18n-update.pl
+new file mode 100755
+index 0000000..c82b4fe
+--- /dev/null
++++ b/feeds/luci/build/i18n-update.pl
+@@ -0,0 +1,83 @@
++#!/usr/bin/perl
++
++@ARGV <= 2 || die "Usage: $0 [<po directory>] [<file pattern>]\n";
++
++my $source = shift @ARGV;
++my $pattern = shift @ARGV || '*.po';
++
++sub read_header
++{
++ my $file = shift || return;
++ local $/;
++
++ open P, "< $file" || die "open(): $!";
++ my $data = readline P;
++ close P;
++
++ $data =~ /
++ ^ (
++ msgid \s "" \n
++ msgstr \s "" \n
++ (?: " [^\n]+ " \n )+
++ \n )
++ /mx;
++
++ return $1;
++}
++
++sub write_header
++{
++ my $file = shift || return;
++ my $head = shift || return;
++ local $/;
++
++ open P, "< $file" || die "open(): $!";
++ my $data = readline P;
++ close P;
++
++ $data =~ s/
++ ^ (
++ msgid \s "" \n
++ msgstr \s "" \n
++ (?: " [^\n]+ " \n )+
++ \n )
++ /$head/mx;
++
++ open P, "> $file" || die "open(): $!";
++ print P $data;
++ close P;
++}
++
++my @dirs;
++
++if( ! $source )
++{
++ @dirs = glob("./*/*/po/");
++}
++else
++{
++ @dirs = ( $source );
++}
++
++foreach my $dir (@dirs)
++{
++ if( open F, "find $dir -type f -name '$pattern' |" )
++ {
++ while( chomp( my $file = readline F ) )
++ {
++ my ( $basename ) = $file =~ m{.+/([^/]+)\.po$};
++
++ if( -f "$dir/templates/$basename.pot" )
++ {
++ my $head = read_header($file);
++
++ printf "Updating %-40s", $file;
++ system("msgmerge", "-U", "-N", $file, "$dir/templates/$basename.pot");
++
++ write_header($file, $head);
++ }
++ }
++
++ close F;
++ }
++}
+diff --git a/feeds/luci/build/luadoc/doc.lua b/feeds/luci/build/luadoc/doc.lua
+new file mode 100755
+index 0000000..383dde2
+--- /dev/null
++++ b/feeds/luci/build/luadoc/doc.lua
+@@ -0,0 +1,126 @@
++#!/usr/bin/env lua
++-------------------------------------------------------------------------------
++-- LuaDoc launcher.
++-- @release $Id: luadoc.lua.in,v 1.1 2008/02/17 06:42:51 jasonsantos Exp $
++-------------------------------------------------------------------------------
++
++--local source = debug.getinfo(1).source or ""
++--local mypath = source:match("@(.+)/[^/]+")
++
++--package.path = package.path .. ";" .. mypath .. "/?.lua;" .. mypath .. "/?/init.lua"
++
++require "luadoc.init"
++
++-------------------------------------------------------------------------------
++-- Print version number.
++
++local function print_version ()
++ print (string.format("%s\n%s\n%s",
++ luadoc._VERSION,
++ luadoc._DESCRIPTION,
++ luadoc._COPYRIGHT))
++end
++
++-------------------------------------------------------------------------------
++-- Print usage message.
++
++local function print_help ()
++ print ("Usage: "..arg[0]..[[ [options|files]
++Generate documentation from files. Available options are:
++ -d path output directory path
++ -t path template directory path
++ -h, --help print this help and exit
++ --noindexpage do not generate global index page
++ --nofiles do not generate documentation for files
++ --nomodules do not generate documentation for modules
++ --doclet doclet_module doclet module to generate output
++ --taglet taglet_module taglet module to parse input code
++ -q, --quiet suppress all normal output
++ -v, --version print version information]])
++end
++
++local function off_messages (arg, i, options)
++ options.verbose = nil
++end
++
++-------------------------------------------------------------------------------
++-- Process options. TODO: use getopts.
++-- @class table
++-- @name OPTIONS
++
++local OPTIONS = {
++ d = function (arg, i, options)
++ local dir = arg[i+1]
++ if string.sub (dir, -2) ~= "/" then
++ dir = dir..'/'
++ end
++ options.output_dir = dir
++ return 1
++ end,
++ t = function (arg, i, options)
++ local dir = arg[i+1]
++ if string.sub (dir, -2) ~= "/" then
++ dir = dir..'/'
++ end
++ options.template_dir = dir
++ return 1
++ end,
++ h = print_help,
++ help = print_help,
++ q = off_messages,
++ quiet = off_messages,
++ v = print_version,
++ version = print_version,
++ doclet = function (arg, i, options)
++ options.doclet = arg[i+1]
++ return 1
++ end,
++ taglet = function (arg, i, options)
++ options.taglet = arg[i+1]
++ return 1
++ end,
++}
++
++-------------------------------------------------------------------------------
++
++local function process_options (arg)
++ local files = {}
++ local options = require "luadoc.config"
++ local i = 1
++ while i <= #arg do
++ local argi = arg[i]
++ if string.sub (argi, 1, 1) ~= '-' then
++ table.insert (files, argi)
++ else
++ local opt = string.sub (argi, 2)
++ if string.sub (opt, 1, 1) == '-' then
++ opt = string.gsub (opt, "%-", "")
++ end
++ if OPTIONS[opt] then
++ if OPTIONS[opt] (arg, i, options) then
++ i = i + 1
++ end
++ else
++ options[opt] = 1
++ end
++ end
++ i = i+1
++ end
++ return files, options
++end
++
++-------------------------------------------------------------------------------
++-- Main function. Process command-line parameters and call luadoc processor.
++
++function main (arg)
++ -- Process options
++ local argc = #arg
++ if argc < 1 then
++ print_help ()
++ return
++ end
++ local files, options = process_options (arg)
++ return luadoc.main(files, options)
++end
++
++main(arg)
+diff --git a/feeds/luci/build/luadoc/luadoc/config.lua b/feeds/luci/build/luadoc/luadoc/config.lua
+new file mode 100644
+index 0000000..9e4b9de
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/config.lua
+@@ -0,0 +1,34 @@
++-------------------------------------------------------------------------------
++-- LuaDoc configuration file. This file contains the default options for
++-- luadoc operation. These options can be overriden by the command line tool
++-- @see luadoc.print_help
++-- @release $Id: config.lua,v 1.6 2007/04/18 14:28:39 tomas Exp $
++-------------------------------------------------------------------------------
++
++module "luadoc.config"
++
++-------------------------------------------------------------------------------
++-- Default options
++-- @class table
++-- @name default_options
++-- @field output_dir default output directory for generated documentation, used
++-- by several doclets
++-- @field taglet parser used to analyze source code input
++-- @field doclet documentation generator
++-- @field template_dir directory with documentation templates, used by the html
++-- doclet
++-- @field verbose command line tool configuration to output processing
++-- information
++
++local default_options = {
++ output_dir = "",
++ taglet = "luadoc.taglet.standard",
++ doclet = "luadoc.doclet.html",
++ -- TODO: find a way to define doclet specific options
++ template_dir = "luadoc/doclet/html/",
++ nomodules = false,
++ nofiles = false,
++ verbose = true,
++}
++
++return default_options
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/debug.lua b/feeds/luci/build/luadoc/luadoc/doclet/debug.lua
+new file mode 100644
+index 0000000..0b75f84
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/debug.lua
+@@ -0,0 +1,46 @@
++-----------------------------------------------------------------
++-- LuaDoc debugging facilities.
++-- @release $Id: debug.lua,v 1.3 2007/04/18 14:28:39 tomas Exp $
++-----------------------------------------------------------------
++
++module "luadoc.doclet.debug"
++
++function printline()
++ print(string.rep('-', 79))
++end
++
++-----------------------------------------------------------------
++-- Print debug information about document
++-- @param doc Table with the structured documentation.
++
++function start (doc)
++ print("Files:")
++ for _, filepath in ipairs(doc.files) do
++ print('\t', filepath)
++ end
++ printline()
++
++ print("Modules:")
++ for _, modulename in ipairs(doc.modules) do
++ print('\t', modulename)
++ end
++ printline()
++
++ for i, v in pairs(doc.files) do
++ print('\t', i, v)
++ end
++ printline()
++ for i, v in pairs(doc.files[doc.files[1]]) do
++ print(i, v)
++ end
++
++ printline()
++ for i, v in pairs(doc.files[doc.files[1]].doc[1]) do
++ print(i, v)
++ end
++ printline()
++ print("Params")
++ for i, v in pairs(doc.files[doc.files[1]].doc[1].param) do
++ print(i, v)
++ end
++end
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/formatter.lua b/feeds/luci/build/luadoc/luadoc/doclet/formatter.lua
+new file mode 100644
+index 0000000..2d72538
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/formatter.lua
+@@ -0,0 +1,84 @@
++-------------------------------------------------------------------------------
++-- Doclet to format source code according to LuaDoc standard tags. This doclet
++-- (re)write .lua files adding missing standard tags. Texts are formatted to
++-- 80 columns and function parameters are added based on code analysis.
++--
++-- @release $Id: formatter.lua,v 1.5 2007/04/18 14:28:39 tomas Exp $
++-------------------------------------------------------------------------------
++
++local util = require "luadoc.util"
++local assert, ipairs, pairs, type = assert, ipairs, pairs, type
++local string = require"string"
++local table = require"table"
++
++module "luadoc.doclet.formatter"
++
++options = {
++ output_dir = "./",
++}
++
++-------------------------------------------------------------------------------
++-- Assembly the output filename for an input file.
++-- TODO: change the name of this function
++function out_file (filename)
++ local h = filename
++ h = options.output_dir..h
++ return h
++end
++
++-------------------------------------------------------------------------------
++-- Generate a new lua file for each input lua file. If the user does not
++-- specify a different output directory input files will be rewritten.
++-- @param doc documentation table
++
++function start (doc)
++ local todo = "<TODO>"
++
++ -- Process files
++ for i, file_doc in ipairs(doc.files) do
++ -- assembly the filename
++ local filename = out_file(file_doc.name)
++ luadoc.logger:info(string.format("generating file `%s'", filename))
++
++ -- TODO: confirm file overwrite
++ local f = posix.open(filename, "w")
++ assert(f, string.format("could not open `%s' for writing", filename))
++
++ for _, block in ipairs(file_doc.doc) do
++
++ -- write reorganized comments
++ f:write(string.rep("-", 80).."\n")
++
++ -- description
++ f:write(util.comment(util.wrap(block.description, 77)))
++ f:write("\n")
++
++ if block.class == "function" then
++ -- parameters
++ table.foreachi(block.param, function (_, param_name)
++ f:write(util.comment(util.wrap(string.format("@param %s %s", param_name, block.param[param_name] or todo), 77)))
++ f:write("\n")
++ end)
++
++ -- return
++ if type(block.ret) == "table" then
++ table.foreachi(block.ret, function (_, ret)
++ f:write(util.comment(util.wrap(string.format("@return %s", ret), 77)).."\n")
++ end)
++ else
++ f:write(util.comment(util.wrap(string.format("@return %s", block.ret or todo), 77)).."\n")
++ end
++ end
++
++ -- TODO: usage
++ -- TODO: see
++
++ -- write code
++ for _, line in ipairs(block.code) do
++ f:write(line.."\n")
++ end
++ end
++
++ f:close()
++ end
++end
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html.lua b/feeds/luci/build/luadoc/luadoc/doclet/html.lua
+new file mode 100644
+index 0000000..e77fb74
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/html.lua
+@@ -0,0 +1,275 @@
++-------------------------------------------------------------------------------
++-- Doclet that generates HTML output. This doclet generates a set of html files
++-- based on a group of templates. The main templates are:
++-- <ul>
++-- <li>index.lp: index of modules and files;</li>
++-- <li>file.lp: documentation for a lua file;</li>
++-- <li>module.lp: documentation for a lua module;</li>
++-- <li>function.lp: documentation for a lua function. This is a
++-- sub-template used by the others.</li>
++-- </ul>
++--
++-- @release $Id: html.lua,v 1.29 2007/12/21 17:50:48 tomas Exp $
++-------------------------------------------------------------------------------
++
++local assert, getfenv, ipairs, loadstring, pairs, setfenv, tostring, tonumber, type = assert, getfenv, ipairs, loadstring, pairs, setfenv, tostring, tonumber, type
++local io = require"io"
++local posix = require "nixio.fs"
++local lp = require "luadoc.lp"
++local luadoc = require"luadoc"
++local package = package
++local string = require"string"
++local table = require"table"
++
++module "luadoc.doclet.html"
++
++-------------------------------------------------------------------------------
++-- Looks for a file `name' in given path. Removed from compat-5.1
++-- @param path String with the path.
++-- @param name String with the name to look for.
++-- @return String with the complete path of the file found
++-- or nil in case the file is not found.
++
++local function search (path, name)
++ for c in string.gfind(path, "[^;]+") do
++ c = string.gsub(c, "%?", name)
++ local f = io.open(c)
++ if f then -- file exist?
++ f:close()
++ return c
++ end
++ end
++ return nil -- file not found
++end
++
++-------------------------------------------------------------------------------
++-- Include the result of a lp template into the current stream.
++
++function include (template, env)
++ -- template_dir is relative to package.path
++ local templatepath = options.template_dir .. template
++
++ -- search using package.path (modified to search .lp instead of .lua
++ local search_path = string.gsub(package.path, "%.lua", "")
++ local templatepath = search(search_path, templatepath)
++ assert(templatepath, string.format("template `%s' not found", template))
++
++ env = env or {}
++ env.table = table
++ env.io = io
++ env.lp = lp
++ env.ipairs = ipairs
++ env.tonumber = tonumber
++ env.tostring = tostring
++ env.type = type
++ env.luadoc = luadoc
++ env.options = options
++
++ return lp.include(templatepath, env)
++end
++
++-------------------------------------------------------------------------------
++-- Returns a link to a html file, appending "../" to the link to make it right.
++-- @param html Name of the html file to link to
++-- @return link to the html file
++
++function link (html, from)
++ local h = html
++ from = from or ""
++ string.gsub(from, "/", function () h = "../" .. h end)
++ return h
++end
++
++-------------------------------------------------------------------------------
++-- Returns the name of the html file to be generated from a module.
++-- Files with "lua" or "luadoc" extensions are replaced by "html" extension.
++-- @param modulename Name of the module to be processed, may be a .lua file or
++-- a .luadoc file.
++-- @return name of the generated html file for the module
++
++function module_link (modulename, doc, from)
++ -- TODO: replace "." by "/" to create directories?
++ -- TODO: how to deal with module names with "/"?
++ assert(modulename)
++ assert(doc)
++ from = from or ""
++
++ if doc.modules[modulename] == nil then
++-- logger:error(string.format("unresolved reference to module `%s'", modulename))
++ return
++ end
++
++ local href = "modules/" .. modulename .. ".html"
++ string.gsub(from, "/", function () href = "../" .. href end)
++ return href
++end
++
++-------------------------------------------------------------------------------
++-- Returns the name of the html file to be generated from a lua(doc) file.
++-- Files with "lua" or "luadoc" extensions are replaced by "html" extension.
++-- @param to Name of the file to be processed, may be a .lua file or
++-- a .luadoc file.
++-- @param from path of where am I, based on this we append ..'s to the
++-- beginning of path
++-- @return name of the generated html file
++
++function file_link (to, from)
++ assert(to)
++ from = from or ""
++
++ local href = to
++ href = string.gsub(href, "lua$", "html")
++ href = string.gsub(href, "luadoc$", "html")
++ href = "files/" .. href
++ string.gsub(from, "/", function () href = "../" .. href end)
++ return href
++end
++
++-------------------------------------------------------------------------------
++-- Returns a link to a function or to a table
++-- @param fname name of the function or table to link to.
++-- @param doc documentation table
++-- @param kind String specying the kinf of element to link ("functions" or "tables").
++
++function link_to (fname, doc, module_doc, file_doc, from, kind)
++ assert(fname)
++ assert(doc)
++ from = from or ""
++ kind = kind or "functions"
++
++ if file_doc then
++ for _, func_name in pairs(file_doc[kind]) do
++ if func_name == fname then
++ return file_link(file_doc.name, from) .. "#" .. fname
++ end
++ end
++ end
++
++ if module_doc and module_doc[kind] then
++ for func_name, tbl in pairs(module_doc[kind]) do
++ if func_name == fname then
++ return "#" .. fname
++ end
++ end
++ end
++
++ local _, _, modulename, fname = string.find(fname, "^(.-)[%.%:]?([^%.%:]*)$")
++ assert(fname)
++
++ -- if fname does not specify a module, use the module_doc
++ if string.len(modulename) == 0 and module_doc then
++ modulename = module_doc.name
++ end
++
++ local module_doc = doc.modules[modulename]
++ if not module_doc then
++-- logger:error(string.format("unresolved reference to function `%s': module `%s' not found", fname, modulename))
++ return
++ end
++
++ for _, func_name in pairs(module_doc[kind]) do
++ if func_name == fname then
++ return module_link(modulename, doc, from) .. "#" .. fname
++ end
++ end
++
++-- logger:error(string.format("unresolved reference to function `%s' of module `%s'", fname, modulename))
++end
++
++-------------------------------------------------------------------------------
++-- Make a link to a file, module or function
++
++function symbol_link (symbol, doc, module_doc, file_doc, from)
++ assert(symbol)
++ assert(doc)
++
++ local href =
++-- file_link(symbol, from) or
++ module_link(symbol, doc, from) or
++ link_to(symbol, doc, module_doc, file_doc, from, "functions") or
++ link_to(symbol, doc, module_doc, file_doc, from, "tables")
++
++ if not href then
++ logger:error(string.format("unresolved reference to symbol `%s'", symbol))
++ end
++
++ return href or ""
++end
++
++-------------------------------------------------------------------------------
++-- Assembly the output filename for an input file.
++-- TODO: change the name of this function
++function out_file (filename)
++ local h = filename
++ h = string.gsub(h, "lua$", "html")
++ h = string.gsub(h, "luadoc$", "html")
++ h = "files/" .. h
++-- h = options.output_dir .. string.gsub (h, "^.-([%w_]+%.html)$", "%1")
++ h = options.output_dir .. h
++ return h
++end
++
++-------------------------------------------------------------------------------
++-- Assembly the output filename for a module.
++-- TODO: change the name of this function
++function out_module (modulename)
++ local h = modulename .. ".html"
++ h = "modules/" .. h
++ h = options.output_dir .. h
++ return h
++end
++
++-----------------------------------------------------------------
++-- Generate the output.
++-- @param doc Table with the structured documentation.
++
++function start (doc)
++ -- Generate index file
++ if (#doc.files > 0 or #doc.modules > 0) and (not options.noindexpage) then
++ local filename = options.output_dir.."index.html"
++ logger:info(string.format("generating file `%s'", filename))
++ local f = posix.open(filename, "w")
++ assert(f, string.format("could not open `%s' for writing", filename))
++ io.output(f)
++ include("index.lp", { doc = doc })
++ f:close()
++ end
++
++ -- Process modules
++ if not options.nomodules then
++ for _, modulename in ipairs(doc.modules) do
++ local module_doc = doc.modules[modulename]
++ -- assembly the filename
++ local filename = out_module(modulename)
++ logger:info(string.format("generating file `%s'", filename))
++
++ local f = posix.open(filename, "w")
++ assert(f, string.format("could not open `%s' for writing", filename))
++ io.output(f)
++ include("module.lp", { doc = doc, module_doc = module_doc })
++ f:close()
++ end
++ end
++
++ -- Process files
++ if not options.nofiles then
++ for _, filepath in ipairs(doc.files) do
++ local file_doc = doc.files[filepath]
++ -- assembly the filename
++ local filename = out_file(file_doc.name)
++ logger:info(string.format("generating file `%s'", filename))
++
++ local f = posix.open(filename, "w")
++ assert(f, string.format("could not open `%s' for writing", filename))
++ io.output(f)
++ include("file.lp", { doc = doc, file_doc = file_doc} )
++ f:close()
++ end
++ end
++
++ -- copy extra files
++ local f = posix.open(options.output_dir.."luadoc.css", "w")
++ io.output(f)
++ include("luadoc.css")
++ f:close()
++end
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/constant.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/constant.lp
+new file mode 100644
+index 0000000..2e35392
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/constant.lp
+@@ -0,0 +1,28 @@
++<%
++if module_doc then
++ from = "modules/"..module_doc.name
++elseif file_doc then
++ from = "files/.."..file_doc.name
++else
++ from = ""
++end
++%>
++
++<dt><%=const.private and "local " or ""%><a name="<%=const.name%>"></a><strong><%=const.name:gsub(".+%.","")%></strong></dt>
++<dd>
++<%=const.description or ""%>
++
++<%if type(const.see) == "string" then %>
++<h3>See also:</h3>
++ <a href="<%=const.see%>"><%=const.see%></a>
++<%elseif type(const.see) == "table" and #const.see > 0 then %>
++<h3>See also:</h3>
++<ul>
++ <%for i = 1, #const.see do%>
++ <li><a href="<%=luadoc.doclet.html.symbol_link(const.see[i], doc, module_doc, file_doc, from)%>">
++ <%=const.see[i]:gsub(".+%.","")%>
++ </a>
++ <%end%>
++</ul
++<%end%>
++</dd>
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/file.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/file.lp
+new file mode 100644
+index 0000000..68f4864
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/file.lp
+@@ -0,0 +1,112 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="<%=luadoc.doclet.html.link('luadoc.css', 'files/'..file_doc.name)%>" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++<%=luadoc.doclet.html.include("menu.lp", { doc=doc, file_doc=file_doc })%>
++
++</div> <!-- id="navigation" -->
++
++<div id="content">
++
++<h1>File <code><%=file_doc.name%></code></h1>
++
++<%if file_doc.description then%>
++<p><%=file_doc.description%></p>
++<%end%>
++<%if file_doc.author then%>
++<p><b><%= #file_doc.author>1 and "Authors" or "Author" %>:</b>
++<table class="authors_list">
++<%for _, author in ipairs(file_doc.author) do%>
++ <tr><td class="name"><%= author %></td></tr>
++<%end%>
++</table>
++</p>
++<%end%>
++<%if file_doc.copyright then%>
++<p>Copyright &copy;<%=file_doc.copyright%></p>
++<%end%>
++<%if file_doc.release then%>
++<p><small><b>Release:</b> <%=file_doc.release%></small></p>
++<%end%>
++
++<%if #file_doc.functions > 0 then%>
++<h2>Functions</h2>
++<table class="function_list">
++<%for _, func_name in ipairs(file_doc.functions) do
++ local func_data = file_doc.functions[func_name]%>
++ <tr>
++ <td class="name" nowrap><%=func_data.private and "local " or ""%><a href="#<%=func_name%>"><%=func_name%></a>&nbsp;(<%=table.concat(func_data.param or {}, ", ")%>)</td>
++ <td class="summary"><%=func_data.summary%></td>
++ </tr>
++<%end%>
++</table>
++<%end%>
++
++
++<%if #file_doc.tables > 0 then%>
++<h2>Tables</h2>
++<table class="table_list">
++<%for _, tab_name in ipairs(file_doc.tables) do%>
++ <tr>
++ <td class="name" nowrap><a href="#<%=tab_name%>"><%=tab_name%></a></td>
++ <td class="summary"><%=file_doc.tables[tab_name].summary%></td>
++ </tr>
++<%end%>
++</table>
++<%end%>
++
++
++<br/>
++<br/>
++
++
++
++<%if #file_doc.functions > 0 then%>
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++<%for _, func_name in ipairs(file_doc.functions) do%>
++<%=luadoc.doclet.html.include("function.lp", { doc=doc, file_doc=file_doc, func=file_doc.functions[func_name] })%>
++<%end%>
++</dl>
++<%end%>
++
++
++<%if #file_doc.tables > 0 then%>
++<h2><a name="tables"></a>Tables</h2>
++<dl class="table">
++<%for _, tab_name in ipairs(file_doc.tables) do%>
++<%=luadoc.doclet.html.include("table.lp", { doc=doc, file_doc=file_doc, tab=file_doc.tables[tab_name] })%>
++<%end%>
++</dl>
++<%end%>
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/function.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/function.lp
+new file mode 100644
+index 0000000..29d403e
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/function.lp
+@@ -0,0 +1,64 @@
++<%
++if module_doc then
++ from = "modules/"..module_doc.name
++elseif file_doc then
++ from = "files/.."..file_doc.name
++else
++ from = ""
++end
++%>
++
++<dt><%=func.private and "local " or ""%><a name="<%=func.name%>"></a><strong><%=func.printname%></strong>&nbsp;(<%=table.concat(func.param or {}, ", ")%>)</dt>
++<dd>
++<%=func.description or ""%>
++
++<%if type(func.param) == "table" and #func.param > 0 then%>
++<h3>Parameters</h3>
++<ul>
++ <%for p = 1, #func.param do%>
++ <li>
++ <%=func.param[p]%>: <%=func.param[func.param[p]] or ""%>
++ </li>
++ <%end%>
++</ul>
++<%end%>
++
++
++<%if type(func.usage) == "string" then%>
++<h3>Usage:</h3>
++<%=func.usage%>
++<%elseif type(func.usage) == "table" then%>
++<h3>Usage</h3>
++<ul>
++ <%for _, usage in ipairs(func.usage) do%>
++ <li><%= usage %>
++ <%end%>
++</ul>
++<%end%>
++
++<%if type(func.ret) == "string" then%>
++<h3>Return value:</h3>
++<%=func.ret%>
++<%elseif type(func.ret) == "table" then%>
++<h3>Return values:</h3>
++<ol>
++ <%for _, ret in ipairs(func.ret) do%>
++ <li><%= ret %>
++ <%end%>
++</ol>
++<%end%>
++
++<%if type(func.see) == "string" then %>
++<h3>See also:</h3>
++ <a href="<%=func.see%>"><%=func.see%></a>
++<%elseif type(func.see) == "table" and #func.see > 0 then %>
++<h3>See also:</h3>
++<ul>
++ <%for i = 1, #func.see do%>
++ <li><a href="<%=luadoc.doclet.html.symbol_link(func.see[i], doc, module_doc, file_doc, from)%>">
++ <%=(oop and func.see[i]:gsub("%.",":") or func.see[i]:gsub(".+%.",""))%>
++ </a>
++ <%end%>
++</ul>
++<%end%>
++</dd>
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/index.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/index.lp
+new file mode 100644
+index 0000000..b4b9f5c
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/index.lp
+@@ -0,0 +1,67 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="<%=luadoc.doclet.html.link("luadoc.css")%>" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++<%=luadoc.doclet.html.include("menu.lp", { doc=doc })%>
++
++</div> <!-- id="navigation" -->
++
++<div id="content">
++
++
++<%if not options.nomodules and #doc.modules > 0 then%>
++<h2>Modules</h2>
++<table class="module_list">
++<!--<tr><td colspan="2">Modules</td></tr>-->
++<%for _, modulename in ipairs(doc.modules) do%>
++ <tr>
++ <td class="name"><a href="<%=luadoc.doclet.html.module_link(modulename, doc)%>"><%=modulename%></a></td>
++ <td class="summary"><%=doc.modules[modulename].summary%></td>
++ </tr>
++<%end%>
++</table>
++<%end%>
++
++
++
++<%if not options.nofiles and #doc.files > 0 then%>
++<h2>Files</h2>
++<table class="file_list">
++<!--<tr><td colspan="2">Files</td></tr>-->
++<%for _, filepath in ipairs(doc.files) do%>
++ <tr>
++ <td class="name"><a href="<%=luadoc.doclet.html.file_link(filepath)%>"><%=filepath%></a></td>
++ <td class="summary"></td>
++ </tr>
++<%end%>
++</table>
++<%end%>
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/luadoc.css b/feeds/luci/build/luadoc/luadoc/doclet/html/luadoc.css
+new file mode 100644
+index 0000000..f9f9749
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/luadoc.css
+@@ -0,0 +1,285 @@
++body {
++ margin-left: 1em;
++ margin-right: 1em;
++ font-family: arial, helvetica, geneva, sans-serif;
++ background-color:#ffffff; margin:0px;
++}
++
++code {
++ font-family: "Andale Mono", monospace;
++}
++
++tt {
++ font-family: "Andale Mono", monospace;
++}
++
++body, td, th { font-size: 11pt; }
++
++h1, h2, h3, h4 { margin-left: 0em; }
++
++textarea, pre, tt { font-size:10pt; }
++body, td, th { color:#000000; }
++small { font-size:0.85em; }
++h1 { font-size:1.5em; }
++h2 { font-size:1.25em; }
++h3 { font-size:1.15em; }
++h4 { font-size:1.06em; }
++
++a:link { font-weight:bold; color: #004080; text-decoration: none; }
++a:visited { font-weight:bold; color: #006699; text-decoration: none; }
++a:link:hover { text-decoration:underline; }
++hr { color:#cccccc }
++img { border-width: 0px; }
++
++
++h3 { padding: 1em 0 0.5em; }
++
++p { margin-left: 1em; }
++
++p.name {
++ font-family: "Andale Mono", monospace;
++ padding-top: 1em;
++ margin-left: 0em;
++}
++
++blockquote { margin-left: 3em; }
++
++pre.example {
++ background-color: rgb(245, 245, 245);
++ border-top-width: 1px;
++ border-right-width: 1px;
++ border-bottom-width: 1px;
++ border-left-width: 1px;
++ border-top-style: solid;
++ border-right-style: solid;
++ border-bottom-style: solid;
++ border-left-style: solid;
++ border-top-color: silver;
++ border-right-color: silver;
++ border-bottom-color: silver;
++ border-left-color: silver;
++ padding: 1em;
++ margin-left: 1em;
++ margin-right: 1em;
++ font-family: "Andale Mono", monospace;
++ font-size: smaller;
++}
++
++
++hr {
++ margin-left: 0em;
++ background: #00007f;
++ border: 0px;
++ height: 1px;
++}
++
++ul { list-style-type: disc; }
++
++table.index { border: 1px #00007f; }
++table.index td { text-align: left; vertical-align: top; }
++table.index ul { padding-top: 0em; margin-top: 0em; }
++
++table {
++ border: 1px solid black;
++ border-collapse: collapse;
++ margin: 1em auto;
++}
++th {
++ border: 1px solid black;
++ padding: 0.5em;
++}
++td {
++ border: 1px solid black;
++ padding: 0.5em;
++}
++div.header, div.footer { margin-left: 0em; }
++
++#container
++{
++ margin-left: 1em;
++ margin-right: 1em;
++ background-color: #f0f0f0;
++}
++
++#product
++{
++ text-align: center;
++ border-bottom: 1px solid #cccccc;
++ background-color: #ffffff;
++}
++
++#product big {
++ font-size: 2em;
++}
++
++#product_logo
++{
++}
++
++#product_name
++{
++}
++
++#product_description
++{
++}
++
++#main
++{
++ background-color: #f0f0f0;
++ border-left: 2px solid #cccccc;
++}
++
++#navigation
++{
++ float: left;
++ width: 18em;
++ margin: 0;
++ vertical-align: top;
++ background-color: #f0f0f0;
++ overflow:visible;
++}
++
++#navigation h1 {
++ background-color:#e7e7e7;
++ font-size:1.1em;
++ color:#000000;
++ text-align:left;
++ margin:0px;
++ padding:0.2em;
++ border-top:1px solid #dddddd;
++ border-bottom:1px solid #dddddd;
++}
++
++#navigation ul
++{
++ font-size:1em;
++ list-style-type: none;
++ padding: 0;
++ margin: 1px;
++}
++
++#navigation li
++{
++ text-indent: -1em;
++ margin: 0em 0em 0em 0.5em;
++ display: block;
++ padding: 3px 0px 0px 12px;
++}
++
++#navigation li li a
++{
++ padding: 0px 3px 0px -1em;
++}
++
++#content
++{
++ margin-left: 18em;
++ padding: 1em;
++ border-left: 2px solid #cccccc;
++ border-right: 2px solid #cccccc;
++ background-color: #ffffff;
++}
++
++#about
++{
++ clear: both;
++ margin: 0;
++ padding: 5px;
++ border-top: 2px solid #cccccc;
++ background-color: #ffffff;
++}
++
++@media print {
++ body {
++ font: 12pt "Times New Roman", "TimeNR", Times, serif;
++ }
++ a { font-weight:bold; color: #004080; text-decoration: underline; }
++
++ #main { background-color: #ffffff; border-left: 0px; }
++ #container { margin-left: 2%; margin-right: 2%; background-color: #ffffff; }
++
++ #content { margin-left: 0px; padding: 1em; border-left: 0px; border-right: 0px; background-color: #ffffff; }
++
++ #navigation { display: none;
++ }
++ pre.example {
++ font-family: "Andale Mono", monospace;
++ font-size: 10pt;
++ page-break-inside: avoid;
++ }
++}
++
++table.module_list td
++{
++ border-width: 1px;
++ padding: 3px;
++ border-style: solid;
++ border-color: #cccccc;
++}
++table.module_list td.name { background-color: #f0f0f0; }
++table.module_list td.summary { width: 100%; }
++
++table.file_list
++{
++ border-width: 1px;
++ border-style: solid;
++ border-color: #cccccc;
++ border-collapse: collapse;
++}
++table.file_list td
++{
++ border-width: 1px;
++ padding: 3px;
++ border-style: solid;
++ border-color: #cccccc;
++}
++table.file_list td.name { background-color: #f0f0f0; }
++table.file_list td.summary { width: 100%; }
++
++
++table.function_list
++{
++ border-width: 1px;
++ border-style: solid;
++ border-color: #cccccc;
++ border-collapse: collapse;
++}
++table.function_list td
++{
++ border-width: 1px;
++ padding: 3px;
++ border-style: solid;
++ border-color: #cccccc;
++}
++table.function_list td.name { background-color: #f0f0f0; }
++table.function_list td.summary { width: 100%; }
++
++
++table.table_list
++{
++ border-width: 1px;
++ border-style: solid;
++ border-color: #cccccc;
++ border-collapse: collapse;
++}
++table.table_list td
++{
++ border-width: 1px;
++ padding: 3px;
++ border-style: solid;
++ border-color: #cccccc;
++}
++table.table_list td.name { background-color: #f0f0f0; }
++table.table_list td.summary { width: 100%; }
++
++dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;}
++dl.function dd {padding: 0.5em 0;}
++dl.function h3 {margin: 0; font-size: medium;}
++
++dl.table dt {border-top: 1px solid #ccc; padding-top: 1em;}
++dl.table dd {padding-bottom: 1em;}
++dl.table h3 {padding: 0; margin: 0; font-size: medium;}
++
++#TODO: make module_list, file_list, function_list, table_list inherit from a list
++
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/menu.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/menu.lp
+new file mode 100644
+index 0000000..0fe3652
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/menu.lp
+@@ -0,0 +1,55 @@
++<%
++if module_doc then
++ from = "modules/"..module_doc.name
++elseif file_doc then
++ from = "files/.."..file_doc.name
++else
++ from = ""
++end
++%>
++
++<h1>LuaDoc</h1>
++<ul>
++ <%if not module_doc and not file_doc then%>
++ <li><strong>Index</strong></li>
++ <%else%>
++ <li><a href="<%=luadoc.doclet.html.link("index.html", from)%>">Index</a></li>
++ <%end%>
++</ul>
++
++
++<!-- Module list -->
++<%if not options.nomodules and #doc.modules > 0 then%>
++<h1>Modules</h1>
++<ul>
++<%for _, modulename in ipairs(doc.modules) do
++ if module_doc and module_doc.name == modulename then%>
++ <li><strong><%=modulename%></strong></li>
++ <%else%>
++ <li>
++ <a href="<%=luadoc.doclet.html.module_link(modulename, doc, from)%>"><%=modulename%></a>
++ </li>
++<% end
++end%>
++</ul>
++<%end%>
++
++
++<!-- File list -->
++<%if not options.nofiles and #doc.files > 0 then%>
++<h1>Files</h1>
++<ul>
++<%for _, filepath in ipairs(doc.files) do
++ if file_doc and file_doc.name == filepath then%>
++ <li><strong><%=filepath%></strong></li>
++ <%else%>
++ <li>
++ <a href="<%=luadoc.doclet.html.file_link(filepath, from)%>"><%=filepath%></a>
++ </li>
++<% end
++end%>
++</ul>
++<%end%>
++
++
++
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/module.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/module.lp
+new file mode 100644
+index 0000000..0798c1b
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/module.lp
+@@ -0,0 +1,155 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="<%=luadoc.doclet.html.link('luadoc.css', 'modules/'..module_doc.name)%>" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++<%=luadoc.doclet.html.include("menu.lp", { doc=doc, module_doc=module_doc })%>
++<% oop = not not ( module_doc.doc[1] and module_doc.doc[1].cstyle == "instance" ) %>
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1><%=( oop and "Object Instance" or "Class" )%> <code><%=module_doc.name%></code></h1>
++
++<p><%=module_doc.description%></p>
++<%if module_doc.author then%>
++<p><b><%= #module_doc.author>1 and "Authors" or "Author" %>:</b>
++<table class="authors_list">
++<%for _, author in ipairs(module_doc.author) do%>
++ <tr><td class="name"><%= author %></td></tr>
++<%end%>
++</table>
++</p>
++<%end%>
++<%if module_doc.copyright then%>
++<p>Copyright&copy; <%=module_doc.copyright%></p>
++<%end%>
++<%if module_doc.release then%>
++<p><small><b>Release:</b> <%=module_doc.release%></small></p>
++<%end%>
++
++<%if #module_doc.constants > 0 then %>
++<h2>Constants</h2>
++<table class="function_list">
++<%for _, const_name in ipairs(module_doc.constants) do
++ local const_data = module_doc.constants[const_name]%>
++ <tr>
++ <td class="name" nowrap><code><%=const_data.private and "local " or ""%><%=(const_name:gsub(".+%.",""))%></code></td>
++ <td class="summary"><%=const_data.summary%></td>
++ </tr>
++<%end%>
++</table>
++<%end%>
++
++<% local funcs = { }; if #module_doc.functions > 0 then %>
++<h2>Functions</h2>
++<table class="function_list">
++<%
++for _, func_name in ipairs(module_doc.functions) do
++ funcs[#funcs+1] = func_name
++end
++
++table.sort(funcs, function(a, b)
++ local func_data_a = module_doc.functions[a]
++ local func_data_b = module_doc.functions[b]
++ local x = func_data_a.sort or a
++ local y = func_data_b.sort or b
++ return x < y
++end)
++
++for _, func_name in ipairs(funcs) do
++ local func_data = module_doc.functions[func_name]
++
++ func_data.printname = func_name:gsub("^%d+#", "")
++ if oop then
++ func_data.printname = func_data.printname:gsub("%.", ":")
++ else
++ func_data.printname = func_data.printname:gsub("^.+%.", "")
++ end
++%>
++ <tr>
++ <td class="name" nowrap><%=func_data.private and "local " or ""%><a href="#<%=func_name%>"><%=func_data.printname%></a>&nbsp;(<%=table.concat(module_doc.functions[func_name].param or {}, ", ")%>)</td>
++ <td class="summary"><%=module_doc.functions[func_name].summary%></td>
++ </tr>
++<%end%>
++</table>
++<%end%>
++
++
++<% local tabs = { }; if #module_doc.tables > 0 then%>
++<h2>Tables</h2>
++<table class="table_list">
++<%
++for _, tab_name in ipairs(module_doc.tables) do
++ tabs[#tabs+1] = tab_name
++end
++
++table.sort(tabs, function(a, b)
++ local tab_data_a = module_doc.tables[a]
++ local tab_data_b = module_doc.tables[b]
++ local x = tab_data_a.sort or a
++ local y = tab_data_b.sort or b
++ return x < y
++end)
++
++for _, tab_name in ipairs(tabs) do
++%>
++ <tr>
++ <td class="name" nowrap><a href="#<%=tab_name%>"><%=tab_name%></a></td>
++ <td class="summary"><%=module_doc.tables[tab_name].summary%></td>
++ </tr>
++<%end%>
++</table>
++<%end%>
++
++
++<br/>
++<br/>
++
++<%if #module_doc.functions > 0 then%>
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++<%for _, func_name in ipairs(funcs) do%>
++<%=luadoc.doclet.html.include("function.lp", { doc=doc, module_doc=module_doc, func=module_doc.functions[func_name], oop=oop })%>
++<%end%>
++</dl>
++<%end%>
++
++<%if #module_doc.tables > 0 then%>
++<h2><a name="tables"></a>Tables</h2>
++<dl class="table">
++<%for _, tab_name in ipairs(tabs) do%>
++<%=luadoc.doclet.html.include("table.lp", { doc=doc, module_doc=module_doc, tab=module_doc.tables[tab_name] })%>
++<%end%>
++</dl>
++<%end%>
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/table.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/table.lp
+new file mode 100644
+index 0000000..5cd0239
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/table.lp
+@@ -0,0 +1,15 @@
++<dt><a name="<%=tab.name%>"></a><strong><%=tab.name%></strong></dt>
++<dd><%=tab.description%>
++
++<%if type(tab.field) == "table" and #tab.field > 0 then%>
++<em>Fields</em>
++<ul>
++ <%for p = 1, #tab.field do%>
++ <li>
++ <%=tab.field[p]%>: <%=tab.field[tab.field[p]] or ""%>
++ </li>
++ <%end%>
++</ul>
++<%end%>
++
++</dd>
+diff --git a/feeds/luci/build/luadoc/luadoc/doclet/raw.lua b/feeds/luci/build/luadoc/luadoc/doclet/raw.lua
+new file mode 100644
+index 0000000..1e880b8
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/doclet/raw.lua
+@@ -0,0 +1,12 @@
++-----------------------------------------------------------------
++-- @release $Id: raw.lua,v 1.5 2007/04/18 14:28:39 tomas Exp $
++-----------------------------------------------------------------
++
++module "luadoc.doclet.raw"
++
++-----------------------------------------------------------------
++-- Generate the output.
++-- @param doc Table with the structured documentation.
++
++function start (doc)
++end
+diff --git a/feeds/luci/build/luadoc/luadoc/init.lua b/feeds/luci/build/luadoc/luadoc/init.lua
+new file mode 100644
+index 0000000..649515d
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/init.lua
+@@ -0,0 +1,50 @@
++-------------------------------------------------------------------------------
++-- LuaDoc main function.
++-- @release $Id: init.lua,v 1.4 2008/02/17 06:42:51 jasonsantos Exp $
++-------------------------------------------------------------------------------
++
++local require = require
++
++local util = require "luadoc.util"
++
++logger = {}
++
++module ("luadoc")
++
++-------------------------------------------------------------------------------
++-- LuaDoc version number.
++
++_COPYRIGHT = "Copyright (c) 2003-2007 The Kepler Project"
++_DESCRIPTION = "Documentation Generator Tool for the Lua language"
++_VERSION = "LuaDoc 3.0.1"
++
++-------------------------------------------------------------------------------
++-- Main function
++-- @see luadoc.doclet.html, luadoc.doclet.formatter, luadoc.doclet.raw
++-- @see luadoc.taglet.standard
++
++function main (files, options)
++ logger = util.loadlogengine(options)
++
++ -- load config file
++ if options.config ~= nil then
++ -- load specified config file
++ dofile(options.config)
++ else
++ -- load default config file
++ require("luadoc.config")
++ end
++
++ local taglet = require(options.taglet)
++ local doclet = require(options.doclet)
++
++ -- analyze input
++ taglet.options = options
++ taglet.logger = logger
++ local doc = taglet.start(files)
++
++ -- generate output
++ doclet.options = options
++ doclet.logger = logger
++ doclet.start(doc)
++end
+diff --git a/feeds/luci/build/luadoc/luadoc/lp.lua b/feeds/luci/build/luadoc/luadoc/lp.lua
+new file mode 100644
+index 0000000..adf84f9
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/lp.lua
+@@ -0,0 +1,130 @@
++----------------------------------------------------------------------------
++-- Lua Pages Template Preprocessor.
++--
++-- @release $Id: lp.lua,v 1.7 2007/04/18 14:28:39 tomas Exp $
++----------------------------------------------------------------------------
++
++local assert, error, getfenv, loadstring, setfenv = assert, error, getfenv, loadstring, setfenv
++local find, format, gsub, strsub = string.find, string.format, string.gsub, string.sub
++local concat, tinsert = table.concat, table.insert
++local open = io.open
++
++module (...)
++
++----------------------------------------------------------------------------
++-- function to do output
++local outfunc = "io.write"
++-- accepts the old expression field: `$| <Lua expression> |$'
++local compatmode = true
++
++--
++-- Builds a piece of Lua code which outputs the (part of the) given string.
++-- @param s String.
++-- @param i Number with the initial position in the string.
++-- @param f Number with the final position in the string (default == -1).
++-- @return String with the correspondent Lua code which outputs the part of the string.
++--
++local function out (s, i, f)
++ s = strsub(s, i, f or -1)
++ if s == "" then return s end
++ -- we could use `%q' here, but this way we have better control
++ s = gsub(s, "([\\\n\'])", "\\%1")
++ -- substitute '\r' by '\'+'r' and let `loadstring' reconstruct it
++ s = gsub(s, "\r", "\\r")
++ return format(" %s('%s'); ", outfunc, s)
++end
++
++
++----------------------------------------------------------------------------
++-- Translate the template to Lua code.
++-- @param s String to translate.
++-- @return String with translated code.
++----------------------------------------------------------------------------
++function translate (s)
++ if compatmode then
++ s = gsub(s, "$|(.-)|%$", "<?lua = %1 ?>")
++ s = gsub(s, "<!%-%-$$(.-)$$%-%->", "<?lua %1 ?>")
++ end
++ s = gsub(s, "<%%(.-)%%>", "<?lua %1 ?>")
++ local res = {}
++ local start = 1 -- start of untranslated part in `s'
++ while true do
++ local ip, fp, target, exp, code = find(s, "<%?(%w*)[ \t]*(=?)(.-)%?>", start)
++ if not ip then break end
++ tinsert(res, out(s, start, ip-1))
++ if target ~= "" and target ~= "lua" then
++ -- not for Lua; pass whole instruction to the output
++ tinsert(res, out(s, ip, fp))
++ else
++ if exp == "=" then -- expression?
++ tinsert(res, format(" %s(%s);", outfunc, code))
++ else -- command
++ tinsert(res, format(" %s ", code))
++ end
++ end
++ start = fp + 1
++ end
++ tinsert(res, out(s, start))
++ return concat(res)
++end
++
++
++----------------------------------------------------------------------------
++-- Defines the name of the output function.
++-- @param f String with the name of the function which produces output.
++
++function setoutfunc (f)
++ outfunc = f
++end
++
++----------------------------------------------------------------------------
++-- Turns on or off the compatibility with old CGILua 3.X behavior.
++-- @param c Boolean indicating if the compatibility mode should be used.
++
++function setcompatmode (c)
++ compatmode = c
++end
++
++----------------------------------------------------------------------------
++-- Internal compilation cache.
++
++local cache = {}
++
++----------------------------------------------------------------------------
++-- Translates a template into a Lua function.
++-- Does NOT execute the resulting function.
++-- Uses a cache of templates.
++-- @param string String with the template to be translated.
++-- @param chunkname String with the name of the chunk, for debugging purposes.
++-- @return Function with the resulting translation.
++
++function compile (string, chunkname)
++ local f, err = cache[string]
++ if f then return f end
++ f, err = loadstring (translate (string), chunkname)
++ if not f then error (err, 3) end
++ cache[string] = f
++ return f
++end
++
++----------------------------------------------------------------------------
++-- Translates and executes a template in a given file.
++-- The translation creates a Lua function which will be executed in an
++-- optionally given environment.
++-- @param filename String with the name of the file containing the template.
++-- @param env Table with the environment to run the resulting function.
++
++function include (filename, env)
++ -- read the whole contents of the file
++ local fh = assert (open (filename))
++ local src = fh:read("*a")
++ fh:close()
++ -- translates the file into a function
++ local prog = compile (src, '@'..filename)
++ local _env
++ if env then
++ _env = getfenv (prog)
++ setfenv (prog, env)
++ end
++ prog ()
++end
+diff --git a/feeds/luci/build/luadoc/luadoc/taglet/standard.lua b/feeds/luci/build/luadoc/luadoc/taglet/standard.lua
+new file mode 100644
+index 0000000..ef925f8
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/taglet/standard.lua
+@@ -0,0 +1,567 @@
++-------------------------------------------------------------------------------
++-- @release $Id: standard.lua,v 1.39 2007/12/21 17:50:48 tomas Exp $
++-------------------------------------------------------------------------------
++
++local assert, pairs, tostring, type = assert, pairs, tostring, type
++local io = require "io"
++local posix = require "nixio.fs"
++local luadoc = require "luadoc"
++local util = require "luadoc.util"
++local tags = require "luadoc.taglet.standard.tags"
++local string = require "string"
++local table = require "table"
++
++module 'luadoc.taglet.standard'
++
++-------------------------------------------------------------------------------
++-- Creates an iterator for an array base on a class type.
++-- @param t array to iterate over
++-- @param class name of the class to iterate over
++
++function class_iterator (t, class)
++ return function ()
++ local i = 1
++ return function ()
++ while t[i] and t[i].class ~= class do
++ i = i + 1
++ end
++ local v = t[i]
++ i = i + 1
++ return v
++ end
++ end
++end
++
++-- Patterns for function recognition
++local identifiers_list_pattern = "%s*(.-)%s*"
++local identifier_pattern = "[^%(%s]+"
++local function_patterns = {
++ "^()%s*function%s*("..identifier_pattern..")%s*%("..identifiers_list_pattern.."%)",
++ "^%s*(local%s)%s*function%s*("..identifier_pattern..")%s*%("..identifiers_list_pattern.."%)",
++ "^()%s*("..identifier_pattern..")%s*%=%s*function%s*%("..identifiers_list_pattern.."%)",
++}
++
++-------------------------------------------------------------------------------
++-- Checks if the line contains a function definition
++-- @param line string with line text
++-- @return function information or nil if no function definition found
++
++local function check_function (line)
++ line = util.trim(line)
++
++ local info = table.foreachi(function_patterns, function (_, pattern)
++ local r, _, l, id, param = string.find(line, pattern)
++ if r ~= nil then
++ return {
++ name = id,
++ private = (l == "local"),
++ param = { } --util.split("%s*,%s*", param),
++ }
++ end
++ end)
++
++ -- TODO: remove these assert's?
++ if info ~= nil then
++ assert(info.name, "function name undefined")
++ assert(info.param, string.format("undefined parameter list for function `%s'", info.name))
++ end
++
++ return info
++end
++
++-------------------------------------------------------------------------------
++-- Checks if the line contains a module definition.
++-- @param line string with line text
++-- @param currentmodule module already found, if any
++-- @return the name of the defined module, or nil if there is no module
++-- definition
++
++local function check_module (line, currentmodule)
++ line = util.trim(line)
++
++ -- module"x.y"
++ -- module'x.y'
++ -- module[[x.y]]
++ -- module("x.y")
++ -- module('x.y')
++ -- module([[x.y]])
++ -- module(...)
++
++ local r, _, modulename = string.find(line, "^module%s*[%s\"'(%[]+([^,\"')%]]+)")
++ if r then
++ -- found module definition
++ logger:debug(string.format("found module `%s'", modulename))
++ return modulename
++ end
++ return currentmodule
++end
++
++-- Patterns for constant recognition
++local constant_patterns = {
++ "^()%s*([A-Z][A-Z0-9_]*)%s*=",
++ "^%s*(local%s)%s*([A-Z][A-Z0-9_]*)%s*=",
++}
++
++-------------------------------------------------------------------------------
++-- Checks if the line contains a constant definition
++-- @param line string with line text
++-- @return constant information or nil if no constant definition found
++
++local function check_constant (line)
++ line = util.trim(line)
++
++ local info = table.foreachi(constant_patterns, function (_, pattern)
++ local r, _, l, id = string.find(line, pattern)
++ if r ~= nil then
++ return {
++ name = id,
++ private = (l == "local"),
++ }
++ end
++ end)
++
++ -- TODO: remove these assert's?
++ if info ~= nil then
++ assert(info.name, "constant name undefined")
++ end
++
++ return info
++end
++
++-------------------------------------------------------------------------------
++-- Extracts summary information from a description. The first sentence of each
++-- doc comment should be a summary sentence, containing a concise but complete
++-- description of the item. It is important to write crisp and informative
++-- initial sentences that can stand on their own
++-- @param description text with item description
++-- @return summary string or nil if description is nil
++
++local function parse_summary (description)
++ -- summary is never nil...
++ description = description or ""
++
++ -- append an " " at the end to make the pattern work in all cases
++ description = description.." "
++
++ -- read until the first period followed by a space or tab
++ local summary = string.match(description, "(.-%.)[%s\t]")
++
++ -- if pattern did not find the first sentence, summary is the whole description
++ summary = summary or description
++
++ return summary
++end
++
++-------------------------------------------------------------------------------
++-- @param f file handle
++-- @param line current line being parsed
++-- @param modulename module already found, if any
++-- @return current line
++-- @return code block
++-- @return modulename if found
++
++local function parse_code (f, line, modulename)
++ local code = {}
++ while line ~= nil do
++ if string.find(line, "^[\t ]*%-%-%-") then
++ -- reached another luadoc block, end this parsing
++ return line, code, modulename
++ else
++ -- look for a module definition
++ modulename = check_module(line, modulename)
++
++ table.insert(code, line)
++ line = f:read()
++ end
++ end
++ -- reached end of file
++ return line, code, modulename
++end
++
++-------------------------------------------------------------------------------
++-- Parses the information inside a block comment
++-- @param block block with comment field
++-- @return block parameter
++
++local function parse_comment (block, first_line, modulename)
++
++ -- get the first non-empty line of code
++ local code = table.foreachi(block.code, function(_, line)
++ if not util.line_empty(line) then
++ -- `local' declarations are ignored in two cases:
++ -- when the `nolocals' option is turned on; and
++ -- when the first block of a file is parsed (this is
++ -- necessary to avoid confusion between the top
++ -- local declarations and the `module' definition.
++ if (options.nolocals or first_line) and line:find"^%s*local" then
++ return
++ end
++ return line
++ end
++ end)
++
++ -- parse first line of code
++ if code ~= nil then
++ local func_info = check_function(code)
++ local module_name = check_module(code)
++ local const_info = check_constant(code)
++ if func_info then
++ block.class = "function"
++ block.name = func_info.name
++ block.param = func_info.param
++ block.private = func_info.private
++ elseif const_info then
++ block.class = "constant"
++ block.name = const_info.name
++ block.private = const_info.private
++ elseif module_name then
++ block.class = "module"
++ block.name = module_name
++ block.param = {}
++ else
++ block.param = {}
++ end
++ else
++ -- TODO: comment without any code. Does this means we are dealing
++ -- with a file comment?
++ end
++
++ -- parse @ tags
++ local currenttag = "description"
++ local currenttext
++
++ table.foreachi(block.comment, function (_, line)
++ line = util.trim_comment(line)
++
++ local r, _, tag, text = string.find(line, "@([_%w%.]+)%s+(.*)")
++ if r ~= nil then
++ -- found new tag, add previous one, and start a new one
++ -- TODO: what to do with invalid tags? issue an error? or log a warning?
++ tags.handle(currenttag, block, currenttext)
++
++ currenttag = tag
++ currenttext = text
++ else
++ currenttext = util.concat(currenttext, "\n" .. line)
++ assert(string.sub(currenttext, 1, 1) ~= " ", string.format("`%s', `%s'", currenttext, line))
++ end
++ end)
++ tags.handle(currenttag, block, currenttext)
++
++ -- extracts summary information from the description
++ block.summary = parse_summary(block.description)
++ assert(string.sub(block.description, 1, 1) ~= " ", string.format("`%s'", block.description))
++
++ if block.name and block.class == "module" then
++ modulename = block.name
++ end
++
++ return block, modulename
++end
++
++-------------------------------------------------------------------------------
++-- Parses a block of comment, started with ---. Read until the next block of
++-- comment.
++-- @param f file handle
++-- @param line being parsed
++-- @param modulename module already found, if any
++-- @return line
++-- @return block parsed
++-- @return modulename if found
++
++local function parse_block (f, line, modulename, first)
++ local multiline = not not (line and line:match("%[%["))
++ local block = {
++ comment = {},
++ code = {},
++ }
++
++ while line ~= nil do
++ if (multiline == true and string.find(line, "%]%]") ~= nil) or
++ (multiline == false and string.find(line, "^[\t ]*%-%-") == nil) then
++ -- reached end of comment, read the code below it
++ -- TODO: allow empty lines
++ line, block.code, modulename = parse_code(f, line, modulename)
++
++ -- parse information in block comment
++ block, modulename = parse_comment(block, first, modulename)
++
++ return line, block, modulename
++ else
++ table.insert(block.comment, line)
++ line = f:read()
++ end
++ end
++ -- reached end of file
++
++ -- parse information in block comment
++ block, modulename = parse_comment(block, first, modulename)
++
++ return line, block, modulename
++end
++
++-------------------------------------------------------------------------------
++-- Parses a file documented following luadoc format.
++-- @param filepath full path of file to parse
++-- @param doc table with documentation
++-- @return table with documentation
++
++function parse_file (filepath, doc, handle, prev_line, prev_block, prev_modname)
++ local blocks = { prev_block }
++ local modulename = prev_modname
++
++ -- read each line
++ local f = handle or io.open(filepath, "r")
++ local i = 1
++ local line = prev_line or f:read()
++ local first = true
++ while line ~= nil do
++
++ if string.find(line, "^[\t ]*%-%-%-") then
++ -- reached a luadoc block
++ local block, newmodname
++ line, block, newmodname = parse_block(f, line, modulename, first)
++
++ if modulename and newmodname and newmodname ~= modulename then
++ doc = parse_file( nil, doc, f, line, block, newmodname )
++ else
++ table.insert(blocks, block)
++ modulename = newmodname
++ end
++ else
++ -- look for a module definition
++ local newmodname = check_module(line, modulename)
++
++ if modulename and newmodname and newmodname ~= modulename then
++ parse_file( nil, doc, f )
++ else
++ modulename = newmodname
++ end
++
++ -- TODO: keep beginning of file somewhere
++
++ line = f:read()
++ end
++ first = false
++ i = i + 1
++ end
++
++ if not handle then
++ f:close()
++ end
++
++ if filepath then
++ -- store blocks in file hierarchy
++ assert(doc.files[filepath] == nil, string.format("doc for file `%s' already defined", filepath))
++ table.insert(doc.files, filepath)
++ doc.files[filepath] = {
++ type = "file",
++ name = filepath,
++ doc = blocks,
++ -- functions = class_iterator(blocks, "function"),
++ -- tables = class_iterator(blocks, "table"),
++ }
++ --
++ local first = doc.files[filepath].doc[1]
++ if first and modulename then
++ doc.files[filepath].author = first.author
++ doc.files[filepath].copyright = first.copyright
++ doc.files[filepath].description = first.description
++ doc.files[filepath].release = first.release
++ doc.files[filepath].summary = first.summary
++ end
++ end
++
++ -- if module definition is found, store in module hierarchy
++ if modulename ~= nil then
++ if modulename == "..." then
++ assert( filepath, "Can't determine name for virtual module from filepatch" )
++ modulename = string.gsub (filepath, "%.lua$", "")
++ modulename = string.gsub (modulename, "/", ".")
++ end
++ if doc.modules[modulename] ~= nil then
++ -- module is already defined, just add the blocks
++ table.foreachi(blocks, function (_, v)
++ table.insert(doc.modules[modulename].doc, v)
++ end)
++ else
++ -- TODO: put this in a different module
++ table.insert(doc.modules, modulename)
++ doc.modules[modulename] = {
++ type = "module",
++ name = modulename,
++ doc = blocks,
++-- functions = class_iterator(blocks, "function"),
++-- tables = class_iterator(blocks, "table"),
++ author = first and first.author,
++ copyright = first and first.copyright,
++ description = "",
++ release = first and first.release,
++ summary = "",
++ }
++
++ -- find module description
++ for m in class_iterator(blocks, "module")() do
++ doc.modules[modulename].description = util.concat(
++ doc.modules[modulename].description,
++ m.description)
++ doc.modules[modulename].summary = util.concat(
++ doc.modules[modulename].summary,
++ m.summary)
++ if m.author then
++ doc.modules[modulename].author = m.author
++ end
++ if m.copyright then
++ doc.modules[modulename].copyright = m.copyright
++ end
++ if m.release then
++ doc.modules[modulename].release = m.release
++ end
++ if m.name then
++ doc.modules[modulename].name = m.name
++ end
++ end
++ doc.modules[modulename].description = doc.modules[modulename].description or (first and first.description) or ""
++ doc.modules[modulename].summary = doc.modules[modulename].summary or (first and first.summary) or ""
++ end
++
++ -- make functions table
++ doc.modules[modulename].functions = {}
++ for f in class_iterator(blocks, "function")() do
++ if f and f.name then
++ table.insert(doc.modules[modulename].functions, f.name)
++ doc.modules[modulename].functions[f.name] = f
++ end
++ end
++
++ -- make tables table
++ doc.modules[modulename].tables = {}
++ for t in class_iterator(blocks, "table")() do
++ if t and t.name then
++ table.insert(doc.modules[modulename].tables, t.name)
++ doc.modules[modulename].tables[t.name] = t
++ end
++ end
++
++ -- make constants table
++ doc.modules[modulename].constants = {}
++ for c in class_iterator(blocks, "constant")() do
++ if c and c.name then
++ table.insert(doc.modules[modulename].constants, c.name)
++ doc.modules[modulename].constants[c.name] = c
++ end
++ end
++ end
++
++ if filepath then
++ -- make functions table
++ doc.files[filepath].functions = {}
++ for f in class_iterator(blocks, "function")() do
++ if f and f.name then
++ table.insert(doc.files[filepath].functions, f.name)
++ doc.files[filepath].functions[f.name] = f
++ end
++ end
++
++ -- make tables table
++ doc.files[filepath].tables = {}
++ for t in class_iterator(blocks, "table")() do
++ if t and t.name then
++ table.insert(doc.files[filepath].tables, t.name)
++ doc.files[filepath].tables[t.name] = t
++ end
++ end
++ end
++
++ return doc
++end
++
++-------------------------------------------------------------------------------
++-- Checks if the file is terminated by ".lua" or ".luadoc" and calls the
++-- function that does the actual parsing
++-- @param filepath full path of the file to parse
++-- @param doc table with documentation
++-- @return table with documentation
++-- @see parse_file
++
++function file (filepath, doc)
++ local patterns = { "%.lua$", "%.luadoc$" }
++ local valid = table.foreachi(patterns, function (_, pattern)
++ if string.find(filepath, pattern) ~= nil then
++ return true
++ end
++ end)
++
++ if valid then
++ logger:info(string.format("processing file `%s'", filepath))
++ doc = parse_file(filepath, doc)
++ end
++
++ return doc
++end
++
++-------------------------------------------------------------------------------
++-- Recursively iterates through a directory, parsing each file
++-- @param path directory to search
++-- @param doc table with documentation
++-- @return table with documentation
++
++function directory (path, doc)
++ for f in posix.dir(path) do
++ local fullpath = path .. "/" .. f
++ local attr = posix.stat(fullpath)
++ assert(attr, string.format("error stating file `%s'", fullpath))
++
++ if attr.type == "reg" then
++ doc = file(fullpath, doc)
++ elseif attr.type == "dir" and f ~= "." and f ~= ".." then
++ doc = directory(fullpath, doc)
++ end
++ end
++ return doc
++end
++
++-- Recursively sorts the documentation table
++local function recsort (tab)
++ table.sort (tab)
++ -- sort list of functions by name alphabetically
++ for f, doc in pairs(tab) do
++ if doc.functions then
++ table.sort(doc.functions)
++ end
++ if doc.tables then
++ table.sort(doc.tables)
++ end
++ end
++end
++
++-------------------------------------------------------------------------------
++
++function start (files, doc)
++ assert(files, "file list not specified")
++
++ -- Create an empty document, or use the given one
++ doc = doc or {
++ files = {},
++ modules = {},
++ }
++ assert(doc.files, "undefined `files' field")
++ assert(doc.modules, "undefined `modules' field")
++
++ table.foreachi(files, function (_, path)
++ local attr = posix.stat(path)
++ assert(attr, string.format("error stating path `%s'", path))
++
++ if attr.type == "reg" then
++ doc = file(path, doc)
++ elseif attr.type == "dir" then
++ doc = directory(path, doc)
++ end
++ end)
++
++ -- order arrays alphabetically
++ recsort(doc.files)
++ recsort(doc.modules)
++
++ return doc
++end
+diff --git a/feeds/luci/build/luadoc/luadoc/taglet/standard/tags.lua b/feeds/luci/build/luadoc/luadoc/taglet/standard/tags.lua
+new file mode 100644
+index 0000000..e9d0354
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/taglet/standard/tags.lua
+@@ -0,0 +1,191 @@
++-------------------------------------------------------------------------------
++-- Handlers for several tags
++-- @release $Id: tags.lua,v 1.8 2007/09/05 12:39:09 tomas Exp $
++-------------------------------------------------------------------------------
++
++local luadoc = require "luadoc"
++local util = require "luadoc.util"
++local string = require "string"
++local table = require "table"
++local assert, type, tostring, tonumber = assert, type, tostring, tonumber
++
++module "luadoc.taglet.standard.tags"
++
++-------------------------------------------------------------------------------
++
++local function author (tag, block, text)
++ block[tag] = block[tag] or {}
++ if not text then
++ luadoc.logger:warn("author `name' not defined [["..text.."]]: skipping")
++ return
++ end
++ table.insert (block[tag], text)
++end
++
++-------------------------------------------------------------------------------
++-- Set the class of a comment block. Classes can be "module", "function",
++-- "table". The first two classes are automatic, extracted from the source code
++
++local function class (tag, block, text)
++ block[tag] = text
++end
++
++-------------------------------------------------------------------------------
++
++local function cstyle (tag, block, text)
++ block[tag] = text
++end
++
++-------------------------------------------------------------------------------
++
++local function sort (tag, block, text)
++ block[tag] = tonumber(text) or 0
++end
++
++-------------------------------------------------------------------------------
++
++local function copyright (tag, block, text)
++ block[tag] = text
++end
++
++-------------------------------------------------------------------------------
++
++local function description (tag, block, text)
++ block[tag] = text
++end
++
++-------------------------------------------------------------------------------
++
++local function field (tag, block, text)
++ if block["class"] ~= "table" then
++ luadoc.logger:warn("documenting `field' for block that is not a `table'")
++ end
++ block[tag] = block[tag] or {}
++
++ local _, _, name, desc = string.find(text, "^([_%w%.]+)%s+(.*)")
++ assert(name, "field name not defined")
++
++ table.insert(block[tag], name)
++ block[tag][name] = desc
++end
++
++-------------------------------------------------------------------------------
++-- Set the name of the comment block. If the block already has a name, issue
++-- an error and do not change the previous value
++
++local function name (tag, block, text)
++ if block[tag] and block[tag] ~= text then
++ luadoc.logger:error(string.format("block name conflict: `%s' -> `%s'", block[tag], text))
++ end
++
++ block[tag] = text
++end
++
++-------------------------------------------------------------------------------
++-- Processes a parameter documentation.
++-- @param tag String with the name of the tag (it must be "param" always).
++-- @param block Table with previous information about the block.
++-- @param text String with the current line beeing processed.
++
++local function param (tag, block, text)
++ block[tag] = block[tag] or {}
++ -- TODO: make this pattern more flexible, accepting empty descriptions
++ local _, _, name, desc = string.find(text, "^([_%w%.]+)%s+(.*)")
++ if not name then
++ luadoc.logger:warn("parameter `name' not defined [["..text.."]]: skipping")
++ return
++ end
++ local i = table.foreachi(block[tag], function (i, v)
++ if v == name then
++ return i
++ end
++ end)
++ if i == nil then
++ luadoc.logger:warn(string.format("documenting undefined parameter `%s'", name))
++ table.insert(block[tag], name)
++ end
++ block[tag][name] = desc
++end
++
++-------------------------------------------------------------------------------
++
++local function release (tag, block, text)
++ block[tag] = text
++end
++
++-------------------------------------------------------------------------------
++
++local function ret (tag, block, text)
++ tag = "ret"
++ if type(block[tag]) == "string" then
++ block[tag] = { block[tag], text }
++ elseif type(block[tag]) == "table" then
++ table.insert(block[tag], text)
++ else
++ block[tag] = text
++ end
++end
++
++-------------------------------------------------------------------------------
++-- @see ret
++
++local function see (tag, block, text)
++ -- see is always an array
++ block[tag] = block[tag] or {}
++
++ -- remove trailing "."
++ text = string.gsub(text, "(.*)%.$", "%1")
++
++ local s = util.split("%s*,%s*", text)
++
++ table.foreachi(s, function (_, v)
++ table.insert(block[tag], v)
++ end)
++end
++
++-------------------------------------------------------------------------------
++-- @see ret
++
++local function usage (tag, block, text)
++ if type(block[tag]) == "string" then
++ block[tag] = { block[tag], text }
++ elseif type(block[tag]) == "table" then
++ table.insert(block[tag], text)
++ else
++ block[tag] = text
++ end
++end
++
++-------------------------------------------------------------------------------
++
++local handlers = {}
++handlers["author"] = author
++handlers["class"] = class
++handlers["cstyle"] = cstyle
++handlers["copyright"] = copyright
++handlers["description"] = description
++handlers["field"] = field
++handlers["name"] = name
++handlers["param"] = param
++handlers["release"] = release
++handlers["return"] = ret
++handlers["see"] = see
++handlers["sort"] = sort
++handlers["usage"] = usage
++
++-------------------------------------------------------------------------------
++
++function handle (tag, block, text)
++ if not handlers[tag] then
++ luadoc.logger:error(string.format("undefined handler for tag `%s'", tag))
++ return
++ end
++
++ if text then
++ text = text:gsub("`([^\n]-)`", "<code>%1</code>")
++ text = text:gsub("`(.-)`", "<pre>%1</pre>")
++ end
++
++-- assert(handlers[tag], string.format("undefined handler for tag `%s'", tag))
++ return handlers[tag](tag, block, text)
++end
+diff --git a/feeds/luci/build/luadoc/luadoc/util.lua b/feeds/luci/build/luadoc/luadoc/util.lua
+new file mode 100644
+index 0000000..e1058d5
+--- /dev/null
++++ b/feeds/luci/build/luadoc/luadoc/util.lua
+@@ -0,0 +1,201 @@
++-------------------------------------------------------------------------------
++-- General utilities.
++-- @release $Id: util.lua,v 1.16 2008/02/17 06:42:51 jasonsantos Exp $
++-------------------------------------------------------------------------------
++
++local posix = require "nixio.fs"
++local type, table, string, io, assert, tostring, setmetatable, pcall = type, table, string, io, assert, tostring, setmetatable, pcall
++
++-------------------------------------------------------------------------------
++-- Module with several utilities that could not fit in a specific module
++
++module "luadoc.util"
++
++-------------------------------------------------------------------------------
++-- Removes spaces from the begining and end of a given string
++-- @param s string to be trimmed
++-- @return trimmed string
++
++function trim (s)
++ return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
++end
++
++-------------------------------------------------------------------------------
++-- Removes spaces from the begining and end of a given string, considering the
++-- string is inside a lua comment.
++-- @param s string to be trimmed
++-- @return trimmed string
++-- @see trim
++-- @see string.gsub
++
++function trim_comment (s)
++ s = string.gsub(s, "^%s*%-%-+%[%[(.*)$", "%1")
++ s = string.gsub(s, "^%s*%-%-+(.*)$", "%1")
++ return s
++end
++
++-------------------------------------------------------------------------------
++-- Checks if a given line is empty
++-- @param line string with a line
++-- @return true if line is empty, false otherwise
++
++function line_empty (line)
++ return (string.len(trim(line)) == 0)
++end
++
++-------------------------------------------------------------------------------
++-- Appends two string, but if the first one is nil, use to second one
++-- @param str1 first string, can be nil
++-- @param str2 second string
++-- @return str1 .. " " .. str2, or str2 if str1 is nil
++
++function concat (str1, str2)
++ if str1 == nil or string.len(str1) == 0 then
++ return str2
++ else
++ return str1 .. " " .. str2
++ end
++end
++
++-------------------------------------------------------------------------------
++-- Split text into a list consisting of the strings in text,
++-- separated by strings matching delim (which may be a pattern).
++-- @param delim if delim is "" then action is the same as %s+ except that
++-- field 1 may be preceeded by leading whitespace
++-- @usage split(",%s*", "Anna, Bob, Charlie,Dolores")
++-- @usage split(""," x y") gives {"x","y"}
++-- @usage split("%s+"," x y") gives {"", "x","y"}
++-- @return array with strings
++-- @see table.concat
++
++function split(delim, text)
++ local list = {}
++ if string.len(text) > 0 then
++ delim = delim or ""
++ local pos = 1
++ -- if delim matches empty string then it would give an endless loop
++ if string.find("", delim, 1) and delim ~= "" then
++ error("delim matches empty string!")
++ end
++ local first, last
++ while 1 do
++ if delim ~= "" then
++ first, last = string.find(text, delim, pos)
++ else
++ first, last = string.find(text, "%s+", pos)
++ if first == 1 then
++ pos = last+1
++ first, last = string.find(text, "%s+", pos)
++ end
++ end
++ if first then -- found?
++ table.insert(list, string.sub(text, pos, first-1))
++ pos = last+1
++ else
++ table.insert(list, string.sub(text, pos))
++ break
++ end
++ end
++ end
++ return list
++end
++
++-------------------------------------------------------------------------------
++-- Comments a paragraph.
++-- @param text text to comment with "--", may contain several lines
++-- @return commented text
++
++function comment (text)
++ text = string.gsub(text, "\n", "\n-- ")
++ return "-- " .. text
++end
++
++-------------------------------------------------------------------------------
++-- Wrap a string into a paragraph.
++-- @param s string to wrap
++-- @param w width to wrap to [80]
++-- @param i1 indent of first line [0]
++-- @param i2 indent of subsequent lines [0]
++-- @return wrapped paragraph
++
++function wrap(s, w, i1, i2)
++ w = w or 80
++ i1 = i1 or 0
++ i2 = i2 or 0
++ assert(i1 < w and i2 < w, "the indents must be less than the line width")
++ s = string.rep(" ", i1) .. s
++ local lstart, len = 1, string.len(s)
++ while len - lstart > w do
++ local i = lstart + w
++ while i > lstart and string.sub(s, i, i) ~= " " do i = i - 1 end
++ local j = i
++ while j > lstart and string.sub(s, j, j) == " " do j = j - 1 end
++ s = string.sub(s, 1, j) .. "\n" .. string.rep(" ", i2) ..
++ string.sub(s, i + 1, -1)
++ local change = i2 + 1 - (i - j)
++ lstart = j + change
++ len = len + change
++ end
++ return s
++end
++
++-------------------------------------------------------------------------------
++-- Opens a file, creating the directories if necessary
++-- @param filename full path of the file to open (or create)
++-- @param mode mode of opening
++-- @return file handle
++
++function posix.open (filename, mode)
++ local f = io.open(filename, mode)
++ if f == nil then
++ filename = string.gsub(filename, "\\", "/")
++ local dir = ""
++ for d in string.gfind(filename, ".-/") do
++ dir = dir .. d
++ posix.mkdir(dir)
++ end
++ f = io.open(filename, mode)
++ end
++ return f
++end
++
++
++----------------------------------------------------------------------------------
++-- Creates a Logger with LuaLogging, if present. Otherwise, creates a mock logger.
++-- @param options a table with options for the logging mechanism
++-- @return logger object that will implement log methods
++
++function loadlogengine(options)
++ local logenabled = pcall(function()
++ require "logging"
++ require "logging.console"
++ end)
++
++ local logging = logenabled and logging
++
++ if logenabled then
++ if options.filelog then
++ logger = logging.file("luadoc.log") -- use this to get a file log
++ else
++ logger = logging.console("[%level] %message\n")
++ end
++
++ if options.verbose then
++ logger:setLevel(logging.INFO)
++ else
++ logger:setLevel(logging.WARN)
++ end
++
++ else
++ noop = {__index=function(...)
++ return function(...)
++ -- noop
++ end
++ end}
++
++ logger = {}
++ setmetatable(logger, noop)
++ end
++
++ return logger
++end
+diff --git a/feeds/luci/build/makedocs.sh b/feeds/luci/build/makedocs.sh
+new file mode 100755
+index 0000000..955c58c
+--- /dev/null
++++ b/feeds/luci/build/makedocs.sh
+@@ -0,0 +1,21 @@
++#!/bin/bash
++
++topdir=$(pwd)
++
++[ -f "$topdir/build/makedocs.sh" -a -n "$1" ] || {
++ echo "Please execute as ./build/makedocs.sh [output directory]" >&2
++ exit 1
++}
++
++outdir=$(readlink -f "$1")
++
++mkdir -p "$outdir" || {
++ echo "Unable to mkdir '$outdir'" >&2
++ exit 1
++}
++
++(
++ cd "$topdir/build/luadoc/"
++ find "$topdir/libs/" "$topdir/modules/" -type f -name '*.lua' -or -name '*.luadoc' | \
++ xargs grep -l '@return' | xargs ./doc.lua --no-files -d "$outdir"
++)
+diff --git a/feeds/luci/build/mkbasepot.sh b/feeds/luci/build/mkbasepot.sh
+new file mode 100755
+index 0000000..7f07514
+--- /dev/null
++++ b/feeds/luci/build/mkbasepot.sh
+@@ -0,0 +1,15 @@
++#!/bin/sh
++
++[ -d ./build ] || {
++ echo "Please execute as ./build/mkbasepot.sh" >&2
++ exit 1
++}
++
++echo -n "Updating modules/luci-base/po/templates/base.pot ... "
++
++./build/i18n-scan.pl \
++ modules/luci-base/ modules/luci-mod-admin-full/ \
++ protocols/ themes/ \
++> modules/luci-base/po/templates/base.pot
++
++echo "done"
+diff --git a/feeds/luci/build/mkrevision.sh b/feeds/luci/build/mkrevision.sh
+new file mode 100755
+index 0000000..02b7fa3
+--- /dev/null
++++ b/feeds/luci/build/mkrevision.sh
+@@ -0,0 +1,27 @@
++#!/bin/sh
++
++TOPDIR="${0%mkrevision.sh}"
++
++[ -d "$TOPDIR/../build" ] || {
++ echo "Please execute as ./build/mkrevision.sh" >&2
++ exit 1
++}
++
++(
++ cd "$TOPDIR"
++ if svn info >/dev/null 2>/dev/null; then
++ revision="svn-r$(LC_ALL=C svn info | sed -ne 's/^Revision: //p')"
++ elif git log -1 >/dev/null 2>/dev/null; then
++ revision="svn-r$(LC_ALL=C git log -1 | sed -ne 's/.*git-svn-id: .*@\([0-9]\+\) .*/\1/p')"
++ if [ "$revision" = "svn-r" ]; then
++ set -- $(git log -1 --format="%ct %h")
++ secs="$(($1 % 86400))"
++ yday="$(date --utc --date="@$1" "+%y.%j")"
++ revision="$(printf 'git-%s.%05d-%s' "$yday" "$secs" "$2")"
++ fi
++ else
++ revision="unknown"
++ fi
++
++ echo "$revision"
++)
+diff --git a/feeds/luci/build/zoneinfo2lua.pl b/feeds/luci/build/zoneinfo2lua.pl
+new file mode 100755
+index 0000000..d3f0403
+--- /dev/null
++++ b/feeds/luci/build/zoneinfo2lua.pl
+@@ -0,0 +1,149 @@
++#!/usr/bin/perl
++# zoneinfo2lua.pl - Make Lua module from /usr/share/zoneinfo
++# Execute from within root of Luci feed, usually feeds/luci
++# $Id$
++
++use strict;
++
++my %TZ;
++
++my $tzdin = $ARGV[0] || "/usr/share/zoneinfo";
++my $tzdout = $ARGV[1] || "./modules/luci-base/luasrc/sys/zoneinfo";
++
++local $/ = "\012";
++open( ZTAB, "< $tzdin/zone.tab" ) || die "open($tzdin/zone.tab): $!";
++
++while( ! eof ZTAB ) {
++ chomp( my $line = readline ZTAB );
++ next if $line =~ /^#/ || $line =~ /^\s+$/;
++
++ my ( undef, undef, $zone, @comment ) = split /\s+/, $line;
++
++ printf STDERR "%-40s", $zone;
++
++ if( open ZONE, "< $tzdin/$zone" ) {
++ seek ZONE, -2, 2;
++
++ while( tell(ZONE) > 0 ) {
++ read ZONE, my $char, 1;
++ ( $char eq "\012" ) ? last : seek ZONE, -2, 1;
++ }
++
++ chomp( my $tz = readline ZONE );
++ print STDERR ( $tz || "(no tzinfo found)" ), "\n";
++ close ZONE;
++
++ if( $tz ) {
++ $zone =~ s/_/ /g;
++ $TZ{$zone} = $tz;
++ }
++ }
++ else
++ {
++ print STDERR "open($tzdin/$zone): $!\n";
++ }
++}
++
++close ZTAB;
++
++
++open(O, "> $tzdout/tzdata.lua") || die "open($tzdout/tzdata.lua): $!\n";
++
++print STDERR "Writing time zones to $tzdout/tzdata.lua ... ";
++print O <<HEAD;
++-- Licensed to the public under the Apache License 2.0.
++
++module "luci.sys.zoneinfo.tzdata"
++
++TZ = {
++HEAD
++
++foreach my $zone ( sort keys %TZ ) {
++ printf O "\t{ '%s', '%s' },\n", $zone, $TZ{$zone}
++}
++
++print O "}\n";
++close O;
++
++print STDERR "done\n";
++
++
++open (O, "> $tzdout/tzoffset.lua") || die "open($tzdout/tzoffset.lua): $!\n";
++
++print STDERR "Writing time offsets to $tzdout/tzoffset.lua ... ";
++print O <<HEAD;
++-- Licensed to the public under the Apache License 2.0.
++
++module "luci.sys.zoneinfo.tzoffset"
++
++OFFSET = {
++HEAD
++
++my %seen;
++foreach my $tz ( sort keys %TZ ) {
++ my $zone = $TZ{$tz};
++
++ if( $zone =~ /^
++ ([A-Z]+)
++ (?:
++ ( -? \d+ (?: : \d+ )? )
++ (?:
++ ([A-Z]+)
++ ( -? \d+ (?: : \d+ )? )?
++ )?
++ )?
++ \b /xo ) {
++ my ( $offset, $s, $h, $m ) = ( 0, 1, 0, 0 );
++ my ( $std, $soffset, $dst, $doffset ) = ( $1, $2, $3, $4 );
++
++ next if $seen{$std}; # and ( !$dst or $seen{$dst} );
++
++ if ( $soffset ) {
++ ( $s, $h, $m ) = $soffset =~ /^(-)?(\d+)(?::(\d+))?$/;
++
++ $s = $s ? 1 : -1;
++ $h ||= 0;
++ $m ||= 0;
++
++ $offset = $s * $h * 60 * 60;
++ $offset += $s * $m * 60;
++
++ printf O "\t%-5s = %6d,\t-- %s\n",
++ lc($std), $offset, $std;
++
++ $seen{$std} = 1;
++
++ if( $dst ) {
++ if( $doffset ) {
++ ( $s, $h, $m ) = $doffset =~ /^(-)?(\d+)(?::(\d+))?$/;
++
++ $s = $s ? 1 : -1;
++ $h ||= 0;
++ $m ||= 0;
++
++ $offset = $s * $h * 60 * 60;
++ $offset += $s * $m * 60;
++ } else {
++ $offset += 60 * 60;
++ }
++
++ printf O "\t%-5s = %6d,\t-- %s\n",
++ lc($dst), $offset, $dst;
++
++ $seen{$dst} = 1;
++ }
++ }
++ else {
++ printf O "\t%-5s = %6d,\t-- %s\n",
++ lc($std), $offset, $std;
++
++ $seen{$std} = 1;
++ }
++
++ }
++}
++
++print O "}\n";
++close O;
++
++print STDERR "done\n";
+diff --git a/feeds/luci/collections/luci-light/Makefile b/feeds/luci/collections/luci-light/Makefile
+new file mode 100644
+index 0000000..9eee97b
+--- /dev/null
++++ b/feeds/luci/collections/luci-light/Makefile
+@@ -0,0 +1,17 @@
++#
++# 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:=light
++
++LUCI_TITLE:=Minimum package set using only admin mini and the standard theme
++LUCI_DEPENDS:=+uhttpd +luci-mod-admin-mini +luci-theme-openwrt @BROKEN
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/collections/luci-ssl/Makefile b/feeds/luci/collections/luci-ssl/Makefile
+new file mode 100644
+index 0000000..07c9c50
+--- /dev/null
++++ b/feeds/luci/collections/luci-ssl/Makefile
+@@ -0,0 +1,17 @@
++#
++# 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:=ssl
++
++LUCI_TITLE:=Standard OpenWrt set with HTTPS support
++LUCI_DEPENDS:=+luci +libustream-polarssl +px5g
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/collections/luci/Makefile b/feeds/luci/collections/luci/Makefile
+new file mode 100644
+index 0000000..4625c95
+--- /dev/null
++++ b/feeds/luci/collections/luci/Makefile
+@@ -0,0 +1,19 @@
++#
++# 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:=luci
++
++LUCI_TITLE:=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
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/contrib/package/Makefile b/feeds/luci/contrib/package/Makefile
+new file mode 100644
+index 0000000..f7fac77
+--- /dev/null
++++ b/feeds/luci/contrib/package/Makefile
+@@ -0,0 +1,2 @@
++include ../../build/config.mk
++include ../../build/module.mk
+diff --git a/feeds/luci/contrib/package/community-profiles/Makefile b/feeds/luci/contrib/package/community-profiles/Makefile
+new file mode 100644
+index 0000000..1992b7c
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/Makefile
+@@ -0,0 +1,39 @@
++# Copyright (C) 2011 Manuel Munz <freifunk at somakoma de>
++# This is free software, licensed under the Apache 2.0 license.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=community-profiles
++PKG_RELEASE:=2
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/community-profiles
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=9. Freifunk
++ TITLE:=Community profiles
++ DEPENDS:=freifunk-common
++endef
++
++define Package/community-profiles/description
++ These community profiles set defaults for various free network/freifunk communities and are used by wizards like ffwizard and meshwizard.
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/community-profiles/install
++ $(CP) ./files/* $(1)/
++endef
++
++$(eval $(call BuildPackage,community-profiles))
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_31c3 b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_31c3
+new file mode 100644
+index 0000000..469e0b5
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_31c3
+@@ -0,0 +1,45 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk 31c3'
++ option 'homepage' 'http://31c3.freifunk.net'
++ option 'ssid' '02:CA:FF:EE:BA:BE'
++ option 'mesh_network' '10.197.0.0/16'
++ option 'latitude' '53.56176'
++ option 'longitude' '9.9833'
++ option 'suffix' 'olsr.31c3.freifunk.net'
++ option 'vap' '0'
++ option 'adhoc_dhcp_when_vap' '0'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.255.255'
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++ option '36' '02:36:CA:FF:EE:EE'
++
++config 'defaults' 'wifi_device'
++ option 'country' 'DE'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '12000'
++
++config 'defaults' 'olsrd'
++ option 'LinkQualityAlgorithm' 'etx_ff'
++
++config widget 'customindex'
++ option enabled '1'
++ option width '50%'
++ option paddingright '5%'
++ option template 'html'
++
++config widget 'rssbundesweit'
++ option cache '3600'
++ option width '50%'
++ option title 'bundesweiter Freifunk Blog'
++ option template 'rssfeed'
++ option enabled '1'
++ option max '10'
++ option url 'http://blog.freifunk.net/rss.xml'
++
++config widget 'clear1'
++ option template 'clear'
++ option enabled '1'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_Freifunk b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_Freifunk
+new file mode 100644
+index 0000000..b8f445a
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_Freifunk
+@@ -0,0 +1,10 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk'
++ option 'homepage' 'http://freifunk.net'
++ option 'ssid' 'www.freifunk.net'
++ option 'splash_network' '10.104.0.0/16'
++ option 'latitude' '52.000'
++ option 'longitude' '10.000'
++ option 'splash_prefix' '28'
++ option 'mesh_network' '10.0.0.0/8'
++
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_altmark b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_altmark
+new file mode 100644
+index 0000000..20d51b2
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_altmark
+@@ -0,0 +1,56 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Altmark'
++ option 'homepage' 'http://altmark.freifunk.net'
++ option 'ssid' 'altmark.freifunk.net'
++ option 'mesh_network' '10.59.0.0/16'
++ option 'latitude' '52.885'
++ option 'longitude' '11.15'
++ option 'suffix' 'olsr.altmark.freifunk.net'
++ option 'vap' '1'
++ option 'adhoc_dhcp_when_vap' '0'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.255.255'
++
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++ option '40' '02:40:CA:FF:EE:EE'
++
++config 'defaults' 'wifi_device'
++ option 'country' 'DE'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '6000'
++
++config 'defaults' 'olsrd'
++ option 'LinkQualityAlgorithm' 'etx_ff'
++
++
++config widget 'customindex'
++ option enabled '1'
++ option width '50%'
++ option paddingright '5%'
++ option template 'html'
++
++config widget 'rssffl'
++ option enabled '1'
++ option max '10'
++ option cache '3600'
++ option width '100%'
++ option title 'Freifunk Blog'
++ option template 'iframe'
++ option url 'http://freifunk.net'
++
++config widget 'rssbundesweit'
++ option cache '3600'
++ option width '50%'
++ option title 'bundesweiter Freifunk Blog'
++ option template 'rssfeed'
++ option enabled '1'
++ option max '10'
++ option url 'http://blog.freifunk.net/rss.xml'
++
++config widget 'clear1'
++ option template 'clear'
++ option enabled '1'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_arad b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_arad
+new file mode 100644
+index 0000000..55d012f
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_arad
+@@ -0,0 +1,22 @@
++config 'community' 'profile'
++ option 'name' 'arig Arad'
++ option 'homepage' 'http://arig.org.il'
++ option 'ssid' 'arig.org.il'
++ option 'latitude' '31.26'
++ option 'longitude' '35.21'
++ option 'splash_prefix' '28'
++ option 'suffix' 'arig'
++ option 'mesh_network' '10.81.8.0/22'
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++ option '13' '13:CA:FF:EE:BA:BE'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '13'
++ option 'country' 'IL'
++ option 'beacon_int' '5000'
++ option 'distance' '1500'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '6000'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_neot_semadar b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_neot_semadar
+new file mode 100644
+index 0000000..062b18e
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_neot_semadar
+@@ -0,0 +1,22 @@
++config 'community' 'profile'
++ option 'name' 'arig Neot Semadar'
++ option 'homepage' 'http://www.neot-semadar.com'
++ option 'ssid' 'arig.org.il'
++ option 'latitude' '30.05'
++ option 'longitude' '35.02'
++ option 'splash_prefix' '272'
++ option 'suffix' 'arig'
++ option 'mesh_network' '10.81.12.0/22'
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++ option '13' '13:CA:FF:EE:BA:BE'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '13'
++ option 'country' 'IL'
++ option 'beacon_int' '5000'
++ option 'distance' '1500'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '6000'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_tel-aviv b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_tel-aviv
+new file mode 100644
+index 0000000..fe7df22
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_tel-aviv
+@@ -0,0 +1,22 @@
++config 'community' 'profile'
++ option 'name' 'arig Tel Aviv'
++ option 'homepage' 'http://arig.org.il'
++ option 'ssid' 'arig.org.il'
++ option 'latitude' '32.056'
++ option 'longitude' '34.772'
++ option 'splash_prefix' '28'
++ option 'suffix' 'arig'
++ option 'mesh_network' '10.81.0.0/21'
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++ option '13' '13:CA:FF:EE:BA:BE'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '13'
++ option 'country' 'IL'
++ option 'beacon_int' '5000'
++ option 'distance' '1500'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '6000'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_augsburg b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_augsburg
+new file mode 100644
+index 0000000..4ab82cf
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_augsburg
+@@ -0,0 +1,64 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Augsburg'
++ option 'homepage' 'http://augsburg.freifunk.net'
++ option 'ssid' 'augsburg.freifunk.net'
++ option 'mesh_network' '10.11.0.0/18'
++ option 'splash_network' '10.104.0.0/16'
++ option 'latitude' '48.37071'
++ option 'longitude' '10.89475'
++ option 'suffix' 'ffa'
++ option 'splash_prefix' '27'
++ option 'vap' '1'
++ option adhoc_dhcp_when_vap '1'
++ option 'ipv6' '1'
++ option 'ipv6_config' 'auto-ipv6-fromv4'
++ option 'ipv6_prefix' 'fdca:ffee:ffa::/48'
++ #option 'extrapackages' ''
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.192.0'
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++
++config 'defaults' 'luci_splash'
++ option 'limit_up' '40'
++ option 'limit_down' '120'
++ option 'leasetime' '8'
++
++config widget 'customindex'
++ option enabled '1'
++ option width '50%'
++ option paddingright '5%'
++ option template 'html'
++
++config widget 'rssffa'
++ option enabled '1'
++ option max '10'
++ option cache '3600'
++ option width '50%'
++ option title 'Freifunk Augsburg Blog'
++ option template 'rssfeed'
++ option url 'http://augsburg.freifunk.net/blog?type=100'
++
++config widget 'rssaugsburg'
++ option cache '3600'
++ option width '50%'
++ option title 'Augsburger Blogs'
++ option template 'rssfeed'
++ option enabled '1'
++ option max '10'
++ option url 'http://wgaugsburg.de/augsburg/rss20.xml'
++
++config widget 'search'
++ option template 'search'
++ option title 'Search'
++ option enabled '1'
++ option width '50%'
++ list engine 'Google|http://www.google.de/search?q='
++ list engine 'Freifunk&#160;Augsburg|http://www.google.de/search?q=site:augsburg.freifunk.net+'
++ list engine 'Freifunk&#160;Wiki|http://wiki.freifunk.net/index.php?search='
++
++config widget 'clear1'
++ option template 'clear'
++ option enabled '1'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bayreuth b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bayreuth
+new file mode 100644
+index 0000000..90fccbd
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bayreuth
+@@ -0,0 +1,20 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Bayreuth'
++ option 'homepage' 'http://bayreuth.freifunk.net'
++ option 'ssid' 'bayreuth.freifunk.net'
++ option 'mesh_network' '10.195.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'latitude' '49.945812'
++ option 'longitude' '11.575045'
++ option 'suffix' 'ffbt'
++ option 'splash_prefix' '28'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.192.0'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '4'
++
++config 'defaults' 'wifi_iface'
++ option 'bssid' '42:CA:FF:EE:BA:BE'
++
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bensheim b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bensheim
+new file mode 100644
+index 0000000..48c1d47
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bensheim
+@@ -0,0 +1,9 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Bensheim'
++ option 'homepage' 'http://bensheim.freifunk.net'
++ option 'ssid' 'bensheim.freifunk.net'
++ option 'mesh_network' '10.49.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '49.63939'
++ option 'longitude' '8.633718'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bergischesland b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bergischesland
+new file mode 100644
+index 0000000..0de4543
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bergischesland
+@@ -0,0 +1,15 @@
++config 'community' 'profile'
++ option 'name' 'Piratenfreifunk Bergisches Land'
++ option 'homepage' 'http://www.piraten-bergisches-land.de'
++ option 'ssid' 'PiratenfunkBL'
++ option 'mesh_network' '10.3.0.0/16'
++ option 'splash_network' '192.168.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '51.26849'
++ option 'longitude' '7.19476'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '11'
++
++config 'defaults' 'wifi_iface'
++ option 'bssid' '02:40:00:42:42:42'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_berlin b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_berlin
+new file mode 100644
+index 0000000..b4694c0
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_berlin
+@@ -0,0 +1,50 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Berlin'
++ option 'homepage' 'http://berlin.freifunk.net'
++ option 'ssid' 'freifunk.net'
++ option 'ssid_scheme' 'addchannelbefore'
++ option 'mesh_network' '104.0.0.0/8'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '52.52075'
++ option 'longitude' '13.40948'
++ list 'owm_api' 'http://api.openwifimap.net'
++ list 'owm_api' 'http://owmapi.pberg.freifunk.net'
++ option 'mapserver' 'http://map.pberg.freifunk.net/'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '13'
++
++config 'defaults' 'bssidscheme'
++ option '10' '02:CA:FF:EE:BA:BE'
++ option '13' 'D2:CA:FF:EE:BA:BE'
++ option '36' '02:36:CA:FF:EE:EE'
++
++config 'defaults' 'ssidscheme'
++ option '13' 'ch13.freifunk.net'
++ option '36' 'ch36.freifunk.net'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.0.0.0'
++ option 'dns' '85.214.20.141 213.73.91.35 194.150.168.168'
++
++config 'defaults' 'olsr_interface'
++ option 'Ip4Broadcast' '255.255.255.255'
++ option 'HelloInterval' '3.0'
++ option 'HelloValidityTime' '125.0'
++ option 'TcInterval' '2.0'
++ option 'TcValidityTime' '500.0'
++ option 'MidInterval' '25.0'
++ option 'MidValidityTime' '500.0'
++ option 'HnaInterval' '10.0'
++ option 'HnaValidityTime' '125.0'
++
++config 'defaults' 'olsrd'
++ option 'AllowNoInt' 'yes'
++ option 'FIBMetric' 'flat'
++ option 'Pollrate' '0.025'
++ option 'TcRedundancy' '2'
++ option 'NatThreshold' '0.75'
++ option 'LinkQualityAlgorithm' 'etx_ff'
++ option 'RtTableDefaultOlsrPriority' '20000'
++ option 'RtTableTunnelPriority' '100000'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_carbodebit b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_carbodebit
+new file mode 100644
+index 0000000..0b263f9
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_carbodebit
+@@ -0,0 +1,23 @@
++config 'community' 'profile'
++ option 'name' 'carbodebit'
++ option 'homepage' 'http://carbodebit.net'
++ option 'ssid' 'VHDCARBES'
++ option 'mesh_network' '10.72.1.0/24'
++ option 'latitude' '43.633683'
++ option 'longitude' '2.160894'
++
++config 'defaults' 'wifi_iface'
++ option 'bssid' 'DE:78:70:E4:FA:B8'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.255.0'
++ option 'dns' '10.70.1.1 213.190.64.170 213.190.64.166'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '11'
++ option 'country' 'FR'
++ option 'distance' '2000'
++
++config 'defaults' 'bssidscheme'
++ option 'all' 'DE:78:70:E4:FA:B8'
++
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_demo b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_demo
+new file mode 100644
+index 0000000..c11a74f
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_demo
+@@ -0,0 +1,21 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Demo'
++ option 'homepage' 'http://www.freifunk.net'
++ option 'ssid' 'demo.freifunk.net'
++ option 'mesh_network' '10.11.12.0/24'
++ option 'latitude' '51.163375'
++ option 'longitude' '10.447683'
++ option 'suffix' 'ff'
++ option 'vap' '1'
++ option adhoc_dhcp_when_vap '1'
++ option 'ipv6' '1'
++ option 'ipv6_config' 'auto-ipv6-fromv4'
++ option 'ipv6_prefix' 'fdca:ffff:ffff::/48'
++ #option 'extrapackages' ''
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.255.0'
++
++config 'defaults' 'luci_splash'
++ option 'limit_up' '50'
++ option 'limit_down' '200'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_duesseldorf b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_duesseldorf
+new file mode 100644
+index 0000000..cb36aab
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_duesseldorf
+@@ -0,0 +1,15 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Duesseldorf'
++ option 'homepage' 'http://freifunk-duesseldorf.de'
++ option 'ssid' 'duesseldorf.freifunk.net'
++ option 'mesh_network' '10.40.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '51.217812'
++ option 'longitude' '6.761564'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '3'
++
++config 'defaults' 'wifi_iface'
++ option 'bssid' '02:CA:FF:EE:BA:BE'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_erfurt b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_erfurt
+new file mode 100644
+index 0000000..dba31a0
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_erfurt
+@@ -0,0 +1,48 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Erfurt'
++ option 'homepage' 'http://erfurt.freifunk.net'
++ option 'ssid' 'erfurt.freifunk.net'
++ option 'mesh_network' '10.99.0.0/16'
++ option 'latitude' '50.9768'
++ option 'longitude' '11.02367'
++ option 'suffix' 'olsr.erfurt.freifunk.net'
++ option 'vap' '1'
++ option 'adhoc_dhcp_when_vap' '0'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.0.0'
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++
++config 'defaults' 'olsrd'
++ option 'LinkQualityAlgorithm' 'etx_ff'
++
++
++config widget 'customindex'
++ option enabled '1'
++ option width '50%'
++ option paddingright '5%'
++ option template 'html'
++
++config widget 'rssffl'
++ option enabled '1'
++ option max '10'
++ option cache '3600'
++ option width '100%'
++ option title 'Freifunk Blog'
++ option template 'iframe'
++ option url 'http://freifunk.net'
++
++config widget 'rssbundesweit'
++ option cache '3600'
++ option width '50%'
++ option title 'bundesweiter Freifunk Blog'
++ option template 'rssfeed'
++ option enabled '1'
++ option max '10'
++ option url 'http://blog.freifunk.net/rss.xml'
++
++config widget 'clear1'
++ option template 'clear'
++ option enabled '1'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_evernet b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_evernet
+new file mode 100644
+index 0000000..0545360
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_evernet
+@@ -0,0 +1,25 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Evernet eG'
++ option 'homepage' 'http://www.evernet-eg.de'
++ option 'ssid' 'evernet.freifunk.net'
++ option 'mesh_network' '10.0.0.0/8'
++ option 'latitude' '51.15692062509162'
++ option 'longitude' '10.716041922569275'
++ option 'suffix' 'evernet'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.0.0.0'
++
++config 'defaults' 'bssidscheme'
++ option 'all' '02:CA:FF:EE:BA:BE'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '13'
++ option 'country' 'DE'
++ option 'txpower' '19'
++ option 'beacon_int' '5000'
++ option 'distance' '1500'
++ option 'noscan' '0'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '6000'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_freiburg b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_freiburg
+new file mode 100644
+index 0000000..eee3d6a
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_freiburg
+@@ -0,0 +1,45 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Freiburg'
++ option 'homepage' 'http://freiburg.freifunk.net'
++ option 'ssid' '02:CA:FF:EE:BA:BE'
++ option 'mesh_network' '10.60.0.0/16'
++ option 'latitude' '47.994841'
++ option 'longitude' '7.849772'
++ option 'suffix' 'olsr.freiburg.freifunk.net'
++ option 'vap' '1'
++ option 'adhoc_dhcp_when_vap' '0'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.255.255'
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++ option '40' '02:40:CA:FF:EE:EE'
++
++config 'defaults' 'wifi_device'
++ option 'country' 'DE'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '6000'
++
++config 'defaults' 'olsrd'
++ option 'LinkQualityAlgorithm' 'etx_ff'
++
++config widget 'customindex'
++ option enabled '1'
++ option width '50%'
++ option paddingright '5%'
++ option template 'html'
++
++config widget 'rssbundesweit'
++ option cache '3600'
++ option width '50%'
++ option title 'bundesweiter Freifunk Blog'
++ option template 'rssfeed'
++ option enabled '1'
++ option max '10'
++ option url 'http://blog.freifunk.net/rss.xml'
++
++config widget 'clear1'
++ option template 'clear'
++ option enabled '1'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_gadow b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_gadow
+new file mode 100644
+index 0000000..bc4a203
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_gadow
+@@ -0,0 +1,23 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Gadow'
++ option 'homepage' 'http://gadow.freifunk.net'
++ option 'ssid' 'gadow.freifunk.net'
++ option 'mesh_network' '10.61.0.0/16'
++ option 'latitude' '53.11'
++ option 'longitude' '12.61'
++ option 'vap' '1'
++ option 'adhoc_dhcp_when_vap' '0'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.255.255'
++
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++ option '40' '02:40:CA:FF:EE:EE'
++
++config 'defaults' 'wifi_device'
++ option 'country' 'DE'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '6000'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_guifibages b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_guifibages
+new file mode 100644
+index 0000000..a0fc4fc
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_guifibages
+@@ -0,0 +1,19 @@
++config 'community' 'profile'
++ option 'name' 'Guifi Bages'
++ option 'homepage' 'http://guifi.net/PlaBages'
++ option 'ssid' 'guifibages'
++ option 'mesh_network' '10.224.3.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'theme' 'luci-theme-freifunk-generic'
++ option 'latitude' '41.718437'
++ option 'longitude' '1.826477'
++ option 'suffix' 'guifibages.cat'
++ option 'splash_prefix' '27'
++ option 'extrapackages' 'luci-app-olsr-viz luci-i18n-catalan'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.0.0'
++
++config 'defaults' 'bssidscheme'
++ option 'all' '12:34:56:78:9a:bc'
++
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_halle b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_halle
+new file mode 100644
+index 0000000..0e8e43f
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_halle
+@@ -0,0 +1,40 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Halle'
++ option 'homepage' 'http://freifunk-halle.net'
++ option 'ssid' 'halle.freifunk.net'
++ option 'mesh_network' '104.62.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '51.47911'
++ option 'longitude' '11.96901'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '13'
++ option 'country' 'DE'
++
++config 'defaults' 'bssidscheme'
++ option 'all' '02:CA:FF:EE:BA:BE'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.0.0.0'
++
++config 'defaults' 'olsrd'
++ option 'AllowNoInt' 'yes'
++ option 'FIBMetric' 'flat'
++ option 'Pollrate' '0.025'
++ option 'TcRedundancy' '2'
++ option 'NatThreshold' '0.75'
++ option 'LinkQualityAlgorithm' 'etx_ff'
++ option 'LinkQualityFishEye' '1'
++ option 'Willingness' '3'
++
++config 'defaults' 'olsr_interface'
++ option 'Ip4Broadcast' '255.255.255.255'
++ option 'HelloInterval' '5.0'
++ option 'HelloValidityTime' '125.0'
++ option 'TcInterval' '3.0'
++ option 'TcValidityTime' '375.0'
++ option 'MidInterval' '25.0'
++ option 'MidValidityTime' '375.0'
++ option 'HnaInterval' '25.0'
++ option 'HnaValidityTime' '375.0'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hameln b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hameln
+new file mode 100644
+index 0000000..f305b59
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hameln
+@@ -0,0 +1,15 @@
++config 'community' 'profile'
++ option 'name' 'Hameln'
++ option 'homepage' 'http://freifunk-hameln.de'
++ option 'ssid' 'hameln.freifunk.net'
++ option 'suffix' 'ffhm'
++ option 'latitude' '52.1030706'
++ option 'longitude' '9.3514778'
++ option 'mesh_network' '10.31.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'vap' '1'
++ option adhoc_dhcp_when_vap '1'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.0.0'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hannover b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hannover
+new file mode 100644
+index 0000000..008b6c7
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hannover
+@@ -0,0 +1,12 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Hannover'
++ option 'homepage' 'http://hannover.freifunk.net'
++ option 'ssid' 'hannover.freifunk.net'
++ option 'mesh_network' '10.2.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '52.38427'
++ option 'longitude' '9.74359'
++
++config 'defaults' 'wifi_iface'
++ option 'bssid' 'CA:FF:EE:CA:FF:EE'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_heppenheim b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_heppenheim
+new file mode 100644
+index 0000000..a830494
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_heppenheim
+@@ -0,0 +1,9 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Heppenheim'
++ option 'homepage' 'http://heppenheim.freifunk.net'
++ option 'ssid' 'heppenheim.freifunk.net'
++ option 'mesh_network' '10.48.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '51.151786'
++ option 'longitude' '10.415039'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hooge b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hooge
+new file mode 100644
+index 0000000..62f6fa9
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hooge
+@@ -0,0 +1,22 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Hooge'
++ option 'homepage' 'http://hooge.freifunk.net'
++ option 'ssid' 'hooge.freifunk.net'
++ option 'mesh_network' '10.11.128.0/24'
++ option 'splash_network' '10.104.0.0/16'
++ option 'latitude' '54.572161'
++ option 'longitude' '8.559551'
++ option 'suffix' 'hooge'
++ option 'splash_prefix' '27'
++ option 'vap' '1'
++ option 'extrapackages' ''
++ list 'owm_api' 'http://api.openwifimap.net'
++ list 'owm_api' 'http://owmapi.pberg.freifunk.net'
++ option 'mapserver' 'http://openwifimap.net/'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.255.0'
++
++config 'defaults' 'luci_splash'
++ option 'limit_up' '20'
++ option 'limit_down' '50'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kiberpipa b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kiberpipa
+new file mode 100644
+index 0000000..c2a96e4
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kiberpipa
+@@ -0,0 +1,15 @@
++config 'community' 'profile'
++ option 'name' 'Kiberpipa.net'
++ option 'homepage' 'http://www.kiberpipa.net'
++ option 'ssid' 'open.kiberpipa.net'
++ option 'mesh_network' '10.14.0.0/16'
++ option 'splash_network' '10.14.128.0/17'
++ option 'splash_prefix' '27'
++ option 'latitude' '46.05063'
++ option 'longitude' '14.50402'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '8'
++
++config 'defaults' 'interface'
++ option 'dns' '10.14.0.1 208.67.222.220 208.67.220.222'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kyritz b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kyritz
+new file mode 100644
+index 0000000..f97e79f
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kyritz
+@@ -0,0 +1,57 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Kyritz'
++ option 'homepage' 'http://kyritz.freifunk.net'
++ option 'ssid' 'mesh.freifunk.net'
++ option 'mesh_network' '104.59.0.0/16'
++ option 'latitude' '52.94'
++ option 'longitude' '12.4'
++ option 'suffix' 'olsr.kyritz.freifunk.net'
++ option 'vap' '1'
++ option 'adhoc_dhcp_when_vap' '0'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.255.255'
++
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++ option '40' '02:40:CA:FF:EE:EE'
++
++config 'defaults' 'wifi_device'
++ option 'country' 'DE'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '6000'
++
++
++config 'defaults' 'olsrd'
++ option 'LinkQualityAlgorithm' 'etx_ff'
++
++
++config widget 'customindex'
++ option enabled '1'
++ option width '50%'
++ option paddingright '5%'
++ option template 'html'
++
++config widget 'rssffl'
++ option enabled '1'
++ option max '10'
++ option cache '3600'
++ option width '100%'
++ option title 'Freifunk Blog'
++ option template 'iframe'
++ option url 'http://freifunk.net'
++
++config widget 'rssbundesweit'
++ option cache '3600'
++ option width '50%'
++ option title 'bundesweiter Freifunk Blog'
++ option template 'rssfeed'
++ option enabled '1'
++ option max '10'
++ option url 'http://blog.freifunk.net/rss.xml'
++
++config widget 'clear1'
++ option template 'clear'
++ option enabled '1'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_l59 b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_l59
+new file mode 100644
+index 0000000..5e6f472
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_l59
+@@ -0,0 +1,25 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk L59'
++ option 'homepage' 'http://freifunk.net'
++ option 'ssid' 'freifunk.net'
++ option 'mesh_network' '10.59.0.0/16'
++ option 'splash_network' '6.59.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '52.26337'
++ option 'longitude' '10.52103'
++ option 'vap' '1'
++ option 'adhoc_dhcp_when_vap' '0'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.255.255'
++
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++ option '40' '02:40:CA:FF:EE:EE'
++
++config 'defaults' 'wifi_device'
++ option 'country' 'DE'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '6000'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_leipzig b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_leipzig
+new file mode 100644
+index 0000000..671f3e8
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_leipzig
+@@ -0,0 +1,55 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Leipzig'
++ option 'homepage' 'http://leipzig.freifunk.net'
++ option 'ssid' 'leipzig.freifunk.net'
++ option 'mesh_network' '10.61.0.0/16'
++ option 'latitude' '51.33348'
++ option 'longitude' '12.40297'
++ option 'suffix' 'olsr.leipzig.freifunk.net'
++ option 'vap' '1'
++ option 'adhoc_dhcp_when_vap' '0'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.255.255'
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++ option '40' '02:40:CA:FF:EE:EE'
++
++config 'defaults' 'wifi_device'
++ option 'country' 'DE'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '6000'
++
++config 'defaults' 'olsrd'
++ option 'LinkQualityAlgorithm' 'etx_ff'
++
++
++config widget 'customindex'
++ option enabled '1'
++ option width '50%'
++ option paddingright '5%'
++ option template 'html'
++
++config widget 'rssffl'
++ option enabled '1'
++ option max '10'
++ option cache '3600'
++ option width '100%'
++ option title 'Freifunk Leipzig Blog'
++ option template 'iframe'
++ option url 'http://leipzig.freifunk.net'
++
++config widget 'rssbundesweit'
++ option cache '3600'
++ option width '50%'
++ option title 'bundesweiter Freifunk Blog'
++ option template 'rssfeed'
++ option enabled '1'
++ option max '10'
++ option url 'http://blog.freifunk.net/rss.xml'
++
++config widget 'clear1'
++ option template 'clear'
++ option enabled '1'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_marburg b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_marburg
+new file mode 100644
+index 0000000..18cff80
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_marburg
+@@ -0,0 +1,12 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Marburg'
++ option 'homepage' ' http://marburg.freifunk.de'
++ option 'ssid' 'marburg.freifunk.net'
++ option 'mesh_network' '10.128.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '29'
++ option 'latitude' '49.63939'
++ option 'longitude' '8.633718'
++
++config 'defaults' 'interface'
++ option 'dns' '8.8.8.8 212.204.49.83'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_oldenburg b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_oldenburg
+new file mode 100644
+index 0000000..e967fdb
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_oldenburg
+@@ -0,0 +1,15 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Oldenburg'
++ option 'homepage' 'http://oldenburg.freifunk.net'
++ option 'ssid' 'oldenburg.freifunk.net'
++ option 'mesh_network' '10.18.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '53.14083'
++ option 'longitude' '8.21314'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '6'
++
++config 'defaults' 'wifi_iface'
++ option 'bssid' '02:CA:FF:EE:BA:BE'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_openwireless_bern b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_openwireless_bern
+new file mode 100644
+index 0000000..810ad8f
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_openwireless_bern
+@@ -0,0 +1,18 @@
++config 'community' 'profile'
++ option 'name' 'Openwireless Bern'
++ option 'homepage' 'http://bern.openwireless.ch/'
++ option 'ssid' 'www.openwireless.ch'
++ option 'mesh_network' '10.247.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '50.814788'
++ option 'longitude' '8.769239'
++
++config 'defaults' 'interface'
++ option 'dns' '208.67.222.222 208.67.220.220'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '10'
++ option 'country' '756'
++
++
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_pberg b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_pberg
+new file mode 100644
+index 0000000..1122eaa
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_pberg
+@@ -0,0 +1,38 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Berlin Prenzlauer Berg'
++ option 'homepage' 'http://pberg.freifunk.net'
++ option 'ssid' 'olsr.freifunk.net'
++ option 'mesh_network' '104.0.0.0/8'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '52.5427'
++ option 'longitude' '13.4172'
++ list 'owm_api' 'http://api.openwifimap.net'
++ list 'owm_api' 'http://owmapi.pberg.freifunk.net'
++ option 'mapserver' 'http://map.pberg.freifunk.net/'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '10'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.0.0.0'
++
++config 'defaults' 'olsr_interface'
++ option 'Ip4Broadcast' '255.255.255.255'
++ option 'HelloInterval' '3.0'
++ option 'HelloValidityTime' '125.0'
++ option 'TcInterval' '2.0'
++ option 'TcValidityTime' '500.0'
++ option 'MidInterval' '25.0'
++ option 'MidValidityTime' '500.0'
++ option 'HnaInterval' '10.0'
++ option 'HnaValidityTime' '125.0'
++
++config 'defaults' 'olsrd'
++ option 'AllowNoInt' 'yes'
++ option 'FIBMetric' 'flat'
++ option 'Pollrate' '0.025'
++ option 'TcRedundancy' '2'
++ option 'NatThreshold' '0.75'
++ option 'LinkQualityAlgorithm' 'etx_ff'
++
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_piraten_dresden b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_piraten_dresden
+new file mode 100644
+index 0000000..2af0e31
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_piraten_dresden
+@@ -0,0 +1,12 @@
++config 'community' 'profile'
++ option 'name' 'Piratenfreifunk Dresden'
++ option 'homepage' 'http://www.piraten-sachsen.de/'
++ option 'ssid' 'dresden.freifunk.net'
++ option 'mesh_network' '10.12.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '51.05081'
++ option 'longitude' '13.73420'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '1'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_potsdam b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_potsdam
+new file mode 100644
+index 0000000..c15624a
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_potsdam
+@@ -0,0 +1,19 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Potsdam'
++ option 'homepage' 'http://potsdam.freifunk.net'
++ option 'ssid' 'www.freifunk-potsdam.de'
++ option 'mesh_network' '10.22.0.0/16'
++ option 'splash_network' '192.168.22.0/24'
++ option 'splash_prefix' '24'
++ option 'latitude' '52.39349'
++ option 'longitude' '13.06489'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '5'
++
++config 'defaults' 'bssidscheme'
++ option '5' '02:CA:FF:EE:BA:BE'
++
++config 'defaults' 'interface'
++ option 'dns' '85.214.20.141 213.73.91.35 194.150.168.168'
++
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_reihen b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_reihen
+new file mode 100644
+index 0000000..a05d6a2
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_reihen
+@@ -0,0 +1,25 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Reihen'
++ option 'homepage' 'http://freifunk.reihen.de'
++ option 'ssid' 'freifunk.reihen.de'
++ option 'mesh_network' '172.23.0.0/16'
++ option 'splash_network' '172.23.26.0/29'
++ option 'latitude' '49.21'
++ option 'longitude' '8.91'
++ option 'splash_prefix' '29'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.0.0'
++ option 'dns' '172.23.25.204 172.23.31.237 141.1.1.1'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '13'
++ option 'bssid' '02:07:04:08:08:09'
++
++config 'defaults' 'bssidscheme'
++ option '13' '02:07:04:08:08:09'
++ option '36' '02:36:CA:FF:EE:EE'
++
++config 'defaults' 'ssidscheme'
++ option '13' 'ch13.freifunk.net'
++ option '36' 'ch36.freifunk.net'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_rosbach b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_rosbach
+new file mode 100644
+index 0000000..4444f70
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_rosbach
+@@ -0,0 +1,15 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Rosbach'
++ option 'homepage' 'freifunk-rosbach.de'
++ option 'ssid' 'rosbach.freifunk.net'
++ option 'mesh_network' '10.212.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '50.18'
++ option 'longitude' '8.42'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '13'
++
++config 'defaults' 'wifi_iface'
++ option 'bssid' 'D2:CA:FF:EE:BA:BE'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_schwarzach b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_schwarzach
+new file mode 100644
+index 0000000..c973ca0
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_schwarzach
+@@ -0,0 +1,12 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Schwarzach'
++ option 'homepage' 'http://schwarzach.freifunk.net'
++ option 'ssid' 'schwarzach.freifunk.net'
++ option 'mesh_network' '10.81.0.0/20'
++ option 'splash_network' '10.104.0.0/16'
++ option 'latitude' '49.373'
++ option 'longitude' '8.983'
++ option 'splash_prefix' '27'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.240.0'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_seefeld b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_seefeld
+new file mode 100644
+index 0000000..5d03f7d
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_seefeld
+@@ -0,0 +1,13 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Seefeld'
++ option 'homepage' 'http://wiki.freifunk.net/Seefeld.freifunk.net'
++ option 'ssid' 'seefeld.freifunk.net'
++ option 'mesh_network' '10.111.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '48.03485'
++ option 'longitude' '11.21279'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '1'
++ option 'bssid' '02:CA:FF:EE:BA:BB'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_stuttgart b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_stuttgart
+new file mode 100644
+index 0000000..28d60d8
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_stuttgart
+@@ -0,0 +1,13 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Stuttgart'
++ option 'homepage' 'http://freifunk-stuttgart.de'
++ option 'ssid' 'Freifunk Stuttgart'
++ option 'mesh_network' '172.21.0.0/16'
++ option 'splash_network' '10.104.0.0/16'
++ option 'latitude' '48'
++ option 'longitude' '9'
++ option 'splash_prefix' '27'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '5'
++ option 'bssid' '52:CA:FF:EE:BA:BE'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_vogtland b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_vogtland
+new file mode 100644
+index 0000000..8baeec6
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_vogtland
+@@ -0,0 +1,23 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Vogtland'
++ option 'homepage' 'http://wiki.freifunk.net/Freifunk_Vogtland'
++ option 'ssid' 'vogtland.freifunk.net'
++ option 'mesh_network' '10.204.0.0/16'
++ option 'splash_network' '6.204.0.0/16'
++ option 'splash_prefix' '27'
++ option 'latitude' '53.11'
++ option 'longitude' '12.61'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.255.255'
++
++
++config 'defaults' 'bssidscheme'
++ option '1' '02:CA:FF:EE:BA:BE'
++ option '40' '02:40:CA:FF:EE:EE'
++
++config 'defaults' 'wifi_device'
++ option 'country' 'DE'
++
++config 'defaults' 'wifi_iface'
++ option 'mcast_rate' '6000'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weil b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weil
+new file mode 100644
+index 0000000..ddba1f3
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weil
+@@ -0,0 +1,23 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Weil am Rhein'
++ option 'homepage' 'http://weil-am-rhein.freifunk.net'
++ option 'ssid' 'mesh.freifunk.net'
++ option 'mesh_network' '10.119.0.0/18'
++ option 'latitude' '47.6056'
++ option 'longitude' '7.6083'
++ option 'suffix' 'ffwr'
++ option 'vap' '1'
++ option 'adhoc_dhcp_when_vap' '0'
++ list 'owm_api' 'http://api.openwifimap.net'
++ list 'owm_api' 'http://owmapi.pberg.freifunk.net'
++ option 'mapserver' 'http://openwifimap.net/'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.192.0'
++
++config 'defaults' 'wifi_device'
++ option 'country' 'DE'
++ option 'channel' '10'
++
++config 'defaults' 'luci_splash'
++ option 'leasetime' '24'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weimar b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weimar
+new file mode 100644
+index 0000000..65938e7
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weimar
+@@ -0,0 +1,10 @@
++config 'community' 'profile'
++ option 'name' 'Weimarnetz e.V.'
++ option 'homepage' 'http://www.weimarnetz.de'
++ option 'ssid' 'weimarnetz'
++ option 'mesh_network' '10.63.0.0/16'
++ option 'latitude' '50.989530'
++ option 'longitude' '11.338675'
++
++config 'defaults' 'interface'
++ option 'dns' '217.11.48.200 217.11.49.200 8.8.8.8'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weinstadt b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weinstadt
+new file mode 100644
+index 0000000..49a42fa
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weinstadt
+@@ -0,0 +1,19 @@
++config 'community' 'profile'
++ option 'name' 'Freifunk Weinstadt'
++ option 'homepage' 'http://freifunk-weinstadt.de'
++ option 'ssid' 'freifunk-weinstadt'
++ option 'mesh_network' '172.21.0.0/16'
++ option 'splash_network' '172.21.85.0/30'
++ option 'latitude' '48.81'
++ option 'longitude' '9.39'
++ option 'splash_prefix' '30'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '13'
++ option 'bssid' '02:07:01:03:08:04'
++
++config 'defaults' 'bssidscheme'
++ option '13' '02:07:01:03:08:04'
++
++config 'defaults' 'interface'
++ option 'dns' '172.21.77.4 172.21.84.235 141.1.1.1'
+diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_wlanljubljana b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_wlanljubljana
+new file mode 100644
+index 0000000..eeefbd2
+--- /dev/null
++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_wlanljubljana
+@@ -0,0 +1,15 @@
++config 'community' 'profile'
++ option 'name' 'wlan ljubljana'
++ option 'homepage' 'http://wlan-lj.net'
++ option 'ssid' 'open.wlan-lj.net'
++ option 'mesh_network' '10.254.0.0/16'
++ option 'splash_network' '10.254.120.0/21'
++ option 'splash_prefix' '27'
++ option 'latitude' '46.05063'
++ option 'longitude' '14.50402'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '8'
++
++config 'defaults' 'interface'
++ option 'dns' '10.254.0.1 10.254.0.2'
+diff --git a/feeds/luci/contrib/package/freifunk-common/Makefile b/feeds/luci/contrib/package/freifunk-common/Makefile
+new file mode 100644
+index 0000000..c15f02d
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-common/Makefile
+@@ -0,0 +1,42 @@
++# Copyright (C) 2011 Manuel Munz <freifunk at somakoma de>
++# This is free software, licensed under the Apache 2.0 license.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freifunk-common
++PKG_RELEASE:=1
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/freifunk-common
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=9. Freifunk
++ TITLE:=Freifunk common files
++endef
++
++define Package/freifunk-common/description
++ Common files and scripts that are needed to run free wireless mesh networks.
++endef
++
++define Package/luci-mod-freifunk/conffiles
++/etc/config/freifunk
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/freifunk-common/install
++ $(CP) ./files/* $(1)/
++endef
++
++$(eval $(call BuildPackage,freifunk-common))
+diff --git a/feeds/luci/contrib/package/freifunk-common/files/etc/config/freifunk b/feeds/luci/contrib/package/freifunk-common/files/etc/config/freifunk
+new file mode 100644
+index 0000000..9a46f05
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-common/files/etc/config/freifunk
+@@ -0,0 +1,126 @@
++package 'freifunk'
++
++config 'public' 'contact'
++ option 'nickname' ''
++ option 'name' ''
++ option 'mail' ''
++ option 'phone' ''
++ option 'note' ''
++
++config 'public' 'community'
++ option 'name' 'Freifunk'
++ option 'homepage' 'http://freifunk.net'
++
++config 'fw_zone' 'zone_freifunk'
++ option 'name' 'freifunk'
++ option 'input' 'REJECT'
++ option 'forward' 'REJECT'
++ option 'output' 'ACCEPT'
++
++config 'fw_rule' 'fficmp'
++ option 'src' 'freifunk'
++ option 'target' 'ACCEPT'
++ option 'proto' 'icmp'
++
++config 'fw_rule' 'ffhttp'
++ option 'src' 'freifunk'
++ option 'target' 'ACCEPT'
++ option 'proto' 'tcp'
++ option 'dest_port' '80'
++
++config 'fw_rule' 'ffhttps'
++ option 'src' 'freifunk'
++ option 'target' 'ACCEPT'
++ option 'proto' 'tcp'
++ option 'dest_port' '443'
++
++config 'fw_rule' 'ffssh'
++ option 'src' 'freifunk'
++ option 'target' 'ACCEPT'
++ option 'proto' 'tcp'
++ option 'dest_port' '22'
++
++config 'fw_rule' 'ffolsr'
++ option 'src' 'freifunk'
++ option 'target' 'ACCEPT'
++ option 'proto' 'udp'
++ option 'dest_port' '698'
++
++config 'fw_rule' 'ffwprobe'
++ option 'src' 'freifunk'
++ option 'target' 'ACCEPT'
++ option 'proto' 'tcp'
++ option 'dest_port' '17990'
++
++config 'fw_rule' 'ffdns'
++ option 'dest_port' '53'
++ option 'src' 'freifunk'
++ option 'target' 'ACCEPT'
++ option 'proto' 'udp'
++
++config 'fw_rule' 'ffdhcp'
++ option 'src_port' '68'
++ option 'src' 'freifunk'
++ option 'target' 'ACCEPT'
++ option 'dest_port' '67'
++ option 'proto' 'udp'
++ option 'leasetime' '30m'
++
++config 'fw_rule' 'ffsplash'
++ option 'dest_port' '8082'
++ option 'src' 'freifunk'
++ option 'target' 'ACCEPT'
++ option 'proto' 'tcp'
++
++config 'fw_forwarding' 'lanfffwd'
++ option 'src' 'lan'
++ option 'dest' 'freifunk'
++
++config 'fw_forwarding' 'ffwanfwd'
++ option 'src' 'freifunk'
++ option 'dest' 'wan'
++
++config 'fw_forwarding' 'fffwd'
++ option 'src' 'freifunk'
++ option 'dest' 'freifunk'
++
++config 'include' 'freifunk'
++ option 'path' '/etc/firewall.freifunk'
++
++config 'defaults' 'system'
++ option 'zonename' 'Europe/Berlin'
++ option 'timezone' 'CET-1CEST,M3.5.0,M10.5.0/3'
++
++config 'defaults' 'wifi_device'
++ option 'channel' '1'
++ option 'diversity' '1'
++ option 'disabled' '0'
++ option 'country' 'DE'
++ option 'distance' '1000'
++
++config 'defaults' 'wifi_iface'
++ option 'mode' 'adhoc'
++ option 'encryption' 'none'
++ option 'bssid' '12:CA:FF:EE:BA:BE'
++ option 'mcast_rate' '6000'
++
++config 'defaults' 'madwifi_wifi_iface'
++ option 'bgscan' '0'
++ option 'sw_merge' '1'
++ option 'probereq' '1'
++ option 'mcast_rate' '5500'
++
++config 'defaults' 'interface'
++ option 'netmask' '255.255.0.0'
++ option 'dns' '8.8.8.8 212.204.49.83 141.1.1.1'
++
++config 'defaults' 'alias'
++ option 'netmask' '255.255.255.0'
++
++config 'defaults' 'dhcp'
++ option 'leasetime' '30m'
++ option 'start' '2'
++ option 'force' '1'
++
++config 'defaults' 'olsr_interfacedefaults'
++ option 'Ip4Broadcast' '255.255.255.255'
+diff --git a/feeds/luci/contrib/package/freifunk-common/files/etc/init.d/freifunk b/feeds/luci/contrib/package/freifunk-common/files/etc/init.d/freifunk
+new file mode 100755
+index 0000000..dbe648a
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-common/files/etc/init.d/freifunk
+@@ -0,0 +1,25 @@
++#!/bin/sh /etc/rc.common
++# Freifunk Init
++# $Id$
++
++START=99
++
++boot() {
++ test -f /etc/crontabs/root || touch /etc/crontabs/root
++
++ grep -q 'killall -HUP dnsmasq' /etc/crontabs/root || {
++ echo "*/5 * * * * killall -HUP dnsmasq" >> /etc/crontabs/root
++ }
++
++ grep -q '/usr/sbin/ff_olsr_watchdog' /etc/crontabs/root || {
++ echo "*/5 * * * * /usr/sbin/ff_olsr_watchdog" >> /etc/crontabs/root
++ }
++
++ [ -d /etc/rc.local.d ] && {
++ for file in /etc/rc.local.d/*; do
++ test -f "$file" && . "$file"
++ done
++ }
++
++ /etc/init.d/cron restart &
++}
+diff --git a/feeds/luci/contrib/package/freifunk-common/files/etc/rc.local.d/01-config-migration b/feeds/luci/contrib/package/freifunk-common/files/etc/rc.local.d/01-config-migration
+new file mode 100644
+index 0000000..11f1ad6
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-common/files/etc/rc.local.d/01-config-migration
+@@ -0,0 +1,51 @@
++# Fixup various configurations to remove quirks
++# from former versions.
++
++_log() {
++ logger -t "Config Migration" "$1"
++}
++
++_uci() {
++ uci ${2:+-c $2} get "$1" 2>/dev/null
++}
++
++
++# Splash redirector had a wrong virtual url match
++# which resulted in "No such handler"
++
++[ "$(_uci lucid.splashredir.virtual)" == "/" ] && {
++ _log "Fix splash redirector configuration"
++ uci set lucid.splashredir.virtual=''
++ uci commit lucid
++ /etc/init.d/lucid restart
++}
++
++
++# Newer OLSR versions have the MinTCVtime hack active,
++# ensure proper timings or olsrd won't start
++
++FIX=0
++for i in 0 1 2 3 4; do
++ [ -z "$(_uci olsrd.@Interface[$i].TcInterval)" ] && \
++ [ -z "$(_uci olsrd.@Interface[$i].TcValidityTime)" ] || {
++ uci delete olsrd.@Interface[$i].TcInterval
++ uci delete olsrd.@Interface[$i].TcValidityTime
++ FIX=1
++ }
++done
++
++[ "$FIX" == 1 ] && {
++ _log "Fix olsrd configuration for MinTCVTime hack"
++ uci commit olsrd
++ /etc/init.d/olsrd restart
++}
++
++
++# Ensure that the community definitions are in the
++# new format
++
++[ -z "$(_uci freifunk.leipzig.mesh_network)" ] && \
++[ -n "$(_uci freifunk.leipzig.mesh_network /rom/etc/config)" ] && {
++ _log "Converting freifunk configuration to new format"
++ cp /rom/etc/config/freifunk /etc/config/freifunk
++}
+diff --git a/feeds/luci/contrib/package/freifunk-common/files/etc/uci-defaults/freifunk b/feeds/luci/contrib/package/freifunk-common/files/etc/uci-defaults/freifunk
+new file mode 100644
+index 0000000..fe6586c
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-common/files/etc/uci-defaults/freifunk
+@@ -0,0 +1,2 @@
++uci set uhttpd.main.rfc1918_filter=0
++uci commit uhttpd
+diff --git a/feeds/luci/contrib/package/freifunk-common/files/usr/bin/ffdzero b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/ffdzero
+new file mode 100755
+index 0000000..24e8c2e
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/ffdzero
+@@ -0,0 +1,10 @@
++#!/bin/sh
++
++test "$1" = "-h" && echo -e "Usage:\n\t$0 -h\n\t$0 [ { ip | hostname } ]" >&2 && exit 1
++
++host="${1:-leipzig.freifunk.net}"
++
++wget -O /dev/null http://$host/cgi-bin-dev-zero.bin
++test "$?" = "1" && wget -O /dev/null http://$host/cgi-bin/dev-zero.bin
++test "$?" = "1" && wget -O /dev/null http://$host/cgi-bin/luci/freifunk/status/zeroes
++test "$?" = "1" && echo "$host: no zero download found..." && exit 1
+diff --git a/feeds/luci/contrib/package/freifunk-common/files/usr/bin/neigh.sh b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/neigh.sh
+new file mode 100755
+index 0000000..cf43424
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/neigh.sh
+@@ -0,0 +1,41 @@
++#!/bin/sh
++
++. /usr/share/libubox/jshn.sh
++
++VARS="localIP:Local remoteIP:Remote validityTime:vTime linkQuality:LQ neighborLinkQuality:NLQ linkCost:Cost"
++
++for HOST in 127.0.0.1 ::1;do
++ json_init
++ json_load "$(echo /links|nc ${HOST} 9090)"
++ if json_is_a links array;then
++ json_select links
++ for v in ${VARS};do
++ eval _${v%:*}=0
++ done
++ for j in 0 1;do
++ case ${j} in 1)
++ for v in ${VARS};do
++ eval printf \"%-\${_${v%:*}}s \" ${v#*:}
++ done
++ echo
++ ;;esac
++ i=1;while json_is_a ${i} object;do
++ json_select ${i}
++ json_get_vars $(for v in ${VARS};do echo ${v%:*};done)
++ case ${j} in 0)
++ for v in ${VARS};do
++ eval "test \${_${v%:*}} -lt \${#${v%:*}} && _${v%:*}=\${#${v%:*}}"
++ done
++ ;;*)
++ for v in ${VARS};do
++ eval printf \"%-\${_${v%:*}}s \" \$${v%:*}
++ done
++ echo
++ ;;esac
++ json_select ..
++ i=$(( i + 1 ))
++ done
++ done
++ fi
++ echo
++done
+diff --git a/feeds/luci/contrib/package/freifunk-common/files/usr/bin/watch.sh b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/watch.sh
+new file mode 100755
+index 0000000..728526b
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/watch.sh
+@@ -0,0 +1,11 @@
++#!/bin/sh
++command="$1"
++interval="$2"; [ -z "$interval" ] && interval=1
++
++if [ -z $command ]; then
++ echo 'Usage: watch.sh "command [options]" [interval], e.g. watch "ifconfig ath0" 2'
++ echo 'interval is optional and defaults to 1'
++ exit 1
++fi
++
++while true; do clear; $command; sleep $interval; done
+diff --git a/feeds/luci/contrib/package/freifunk-common/files/usr/sbin/ff_olsr_watchdog b/feeds/luci/contrib/package/freifunk-common/files/usr/sbin/ff_olsr_watchdog
+new file mode 100755
+index 0000000..069f4c3
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-common/files/usr/sbin/ff_olsr_watchdog
+@@ -0,0 +1,29 @@
++#!/usr/bin/lua
++
++require "os"
++require "io"
++require "uci"
++local fs = require "nixio.fs"
++
++if fs.access("/var/run/olsrd.pid") or fs.access("/var/run/olsrd4.pid") then
++ local stamp, intv
++ local x = uci.cursor()
++
++ x:foreach("olsrd", "LoadPlugin",
++ function(s)
++ if s.library == "olsrd_watchdog.so.0.1" then
++ intv = tonumber(s.interval)
++ stamp = s.file
++ end
++ end)
++
++ if intv and fs.access(stamp) then
++ local systime = os.time()
++ local wdgtime = tonumber(io.lines(stamp)())
++
++ if not wdgtime or ( systime - wdgtime ) > ( intv * 2 ) then
++ os.execute("logger -t 'OLSR watchdog' 'Process died - restarting!'")
++ os.execute("/etc/init.d/olsrd restart")
++ end
++ end
++end
+diff --git a/feeds/luci/contrib/package/freifunk-firewall/Makefile b/feeds/luci/contrib/package/freifunk-firewall/Makefile
+new file mode 100644
+index 0000000..b9d328c
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-firewall/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
++#
++# This is free software, licensed under the Apache 2.0 license.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freifunk-firewall
++PKG_RELEASE:=3
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/freifunk-firewall
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=9. Freifunk
++ TITLE:=Freifunk Firewall Addon
++ DEPENDS:=+firewall
++endef
++
++define Package/freifunk-firewall/description
++ Various firewall extensions for Freifunk. Includes NAT fixes and advanced settings.
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/freifunk-firewall/postinst
++#!/bin/sh
++[ -n "$${IPKG_INSTROOT}" ] || {
++ if ! grep -q /etc/firewall.freifunk /etc/config/firewall; then
++ uci add firewall include >/dev/null
++ uci set firewall.@include[-1].path=/etc/firewall.freifunk
++ uci commit firewall
++ fi
++}
++endef
++
++define Package/freifunk-firewall/install
++ $(CP) ./files/* $(1)/
++endef
++
++$(eval $(call BuildPackage,freifunk-firewall))
+diff --git a/feeds/luci/contrib/package/freifunk-firewall/files/etc/firewall.freifunk b/feeds/luci/contrib/package/freifunk-firewall/files/etc/firewall.freifunk
+new file mode 100644
+index 0000000..d2805f6
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-firewall/files/etc/firewall.freifunk
+@@ -0,0 +1,40 @@
++#!/bin/sh
++# Freifunk Firewall addons
++
++. /lib/functions.sh
++
++#
++# Apply advanced settings
++#
++apply_advanced() {
++ local tcp_ecn
++ local tcp_window_scaling
++ local accept_redirects
++ local accept_source_route
++
++ config_get_bool tcp_ecn $1 tcp_ecn 1
++ config_get_bool tcp_window_scaling $1 tcp_window_scaling 1
++ config_get_bool accept_redirects $1 accept_redirects 0
++ config_get_bool accept_source_route $1 accept_source_route 0
++
++ logger -t firewall.freifunk "tcp_ecn is $tcp_ecn"
++ logger -t firewall.freifunk "tcp_window_scaling is $tcp_window_scaling"
++ logger -t firewall.freifunk "accept_redirects is $accept_redirects"
++ logger -t firewall.freifunk "accept_source_route is $accept_source_route"
++
++ sysctl -w net.ipv4.tcp_ecn=$tcp_ecn >/dev/null
++ sysctl -w net.ipv4.tcp_window_scaling=$tcp_window_scaling >/dev/null
++
++ for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
++ echo $accept_redirects > $f
++ done
++
++ for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
++ echo $accept_source_route > $f
++ done
++}
++
++config_foreach apply_advanced advanced
++
++[ -x /etc/init.d/freifunk-p2pblock ] && /etc/init.d/freifunk-p2pblock enabled && \
++ ( sleep 3; /etc/init.d/freifunk-p2pblock restart )&
+diff --git a/feeds/luci/contrib/package/freifunk-firewall/files/etc/hotplug.d/firewall/23-restricted-wan b/feeds/luci/contrib/package/freifunk-firewall/files/etc/hotplug.d/firewall/23-restricted-wan
+new file mode 100644
+index 0000000..e71c852
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-firewall/files/etc/hotplug.d/firewall/23-restricted-wan
+@@ -0,0 +1,65 @@
++#!/bin/sh
++
++clear_restricted_gw()
++{
++ local state="$1"
++ local iface
++ local ifname
++ local subnet
++
++ config_get iface "$state" iface
++
++ if [ "$iface" = "$INTERFACE" ]; then
++ config_get ifname "$state" ifname
++ config_get subnet "$state" subnet
++
++ logger -t firewall.freifunk "removing local restriction to the network connected to $ifname ($iface)"
++ iptables -D forwarding_freifunk_rule -o $ifname -d $subnet -j REJECT --reject-with icmp-host-prohibited
++ uci_revert_state firewall "$state"
++ fi
++}
++
++get_enabled()
++{
++ local name
++ config_get name "$1" name
++
++ if [ "$name" = "$ZONE" ]; then
++ config_get_bool local_restrict "$1" local_restrict
++ fi
++}
++
++if [ "$ACTION" = add ]; then
++ local enabled
++ local subnet
++
++ . /lib/functions/network.sh
++
++ network_find_wan wan
++
++ [ "$INTERFACE" = "$wan" ] || return 0
++
++ network_get_subnet subnet $INTERFACE
++
++ if [ -n "$subnet" ]; then
++ config_load firewall
++
++ local_restrict=0
++ config_foreach get_enabled zone
++
++ if [ "$local_restrict" = 1 ]; then
++ logger -t firewall.freifunk "restricting local access to the network connected to $INTERFACE ($DEVICE)"
++ iptables -I forwarding_freifunk_rule -o $DEVICE -d $subnet -j REJECT --reject-with icmp-host-prohibited
++ local state="restricted_gw_${INTERFACE}"
++ uci_set_state firewall "$state" "" restricted_gw_state
++ uci_set_state firewall "$state" iface "$INTERFACE"
++ uci_set_state firewall "$state" ifname "$DEVICE"
++ uci_set_state firewall "$state" subnet "$subnet"
++ fi
++ fi
++
++elif [ "$ACTION" = remove ]; then
++ config_load firewall
++ config_foreach clear_restricted_gw restricted_gw_state
++fi
++
+diff --git a/feeds/luci/contrib/package/freifunk-gwcheck/Makefile b/feeds/luci/contrib/package/freifunk-gwcheck/Makefile
+new file mode 100644
+index 0000000..6c2affe
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-gwcheck/Makefile
+@@ -0,0 +1,40 @@
++# Copyright (C) 2011 Manuel Munz <freifunk at somakoma de>
++# This is free software, licensed under the Apache 2.0 license.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freifunk-gwcheck
++PKG_RELEASE:=4
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/freifunk-gwcheck
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=9. Freifunk
++ TITLE:=Freifunk gateway check script
++ DEPENDS:=firewall +ip +iptables-mod-ipopt +olsrd-mod-dyn-gw-plain
++endef
++
++define Package/freifunk-gwcheck/description
++ This script periodically checks if internet is available via your own gateway. If it detects that it is broken, then the defaultroute is removed from the main table and temporarilly placed in table gw-check until your internet works again. Config file is /etc/config/freifunk-gwcheck.
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/freifunk-gwcheck/install
++ $(CP) ./files/* $(1)/
++ $(CP) ./root/* $(1)/
++endef
++
++$(eval $(call BuildPackage,freifunk-gwcheck))
+diff --git a/feeds/luci/contrib/package/freifunk-gwcheck/files/etc/config/freifunk-gwcheck b/feeds/luci/contrib/package/freifunk-gwcheck/files/etc/config/freifunk-gwcheck
+new file mode 100644
+index 0000000..b174dd6
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-gwcheck/files/etc/config/freifunk-gwcheck
+@@ -0,0 +1,5 @@
++config 'gwcheck' 'hosts'
++ list 'host' 'augsburg.freifunk.net'
++ list 'host' 'vpn4.leipzig.freifunk.net'
++ list 'host' 'luci.subsignal.org'
++ list 'host' 'bbb-vpn.berlin.freifunk.net'
+diff --git a/feeds/luci/contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh b/feeds/luci/contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh
+new file mode 100755
+index 0000000..b86b668
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh
+@@ -0,0 +1,132 @@
++#!/bin/sh
++# Copyright 2013 Manuel Munz <freifunk at somakoma dot de>
++# Licensed under the GNU General Public License (GPL) v3
++# This script monitors the local internet gateway
++
++. /lib/functions.sh
++. /lib/functions/network.sh
++. /usr/share/libubox/jshn.sh
++
++# exit if dyngw_plain is not enabled or RtTable is not (254 or unset)
++config_load olsrd
++
++check_dyngw_plain()
++{
++ local cfg="$1"
++ config_get library "$cfg" library
++ if [ "${library#olsrd_dyn_gw_plain}" != "$library" ]; then
++ config_get ignore "$cfg" ignore
++ config_get RtTable "$cfg" RtTable
++ if [ "$ignore" != "1" ] && [ -z "$RtTable" -o "$RtTable" = "254" ]; then
++ exit=0
++ fi
++ fi
++}
++
++exit=1
++config_foreach check_dyngw_plain LoadPlugin
++[ "$exit" = "1" ] && exit 1
++
++#Exit if this script is already running
++pid="$(pidof ff_olsr_test_gw.sh)"
++if [ ${#pid} -gt 5 ]; then
++ logger -p debug -t gwcheck "Gateway check script is already running, exit now"
++ exit 1
++fi
++
++# exit if there is no defaultroute with metric=0 in main or gw-check table.
++defroutemain="$(ip route show |grep default |grep -v metric)"
++defroutegwcheck="$(ip route show table gw-check |grep default |grep -v metric)"
++if [ -z "$defroutegwcheck" -a -z "$defroutemain" ]; then
++ exit 1
++fi
++
++# get and shuffle list of testservers
++testserver="$(uci -q get freifunk-gwcheck.hosts.host)"
++[ -z "$testserver" ] && echo "No testservers found, exit" && exit
++
++testserver="$(for t in $testserver; do echo $t; done | awk 'BEGIN {
++ srand();
++}
++{
++ l[NR] = $0;
++}
++
++END {
++ for (i = 1; i <= NR; i++) {
++ n = int(rand() * (NR - i + 1)) + i;
++ print l[n];
++ l[n] = l[i];
++ }
++}')"
++
++check_internet() {
++ for t in $testserver; do
++ local test
++ test=$(wget -q http://$t/conntest.html -O -| grep "Internet_works")
++ if [ "$test" == "Internet_works" ]; then
++ echo 0
++ break
++ else
++ logger -p debug -t gw-check "Could not fetch http://$t/conntest.html"
++ fi
++ done
++}
++
++resolve() {
++ echo "$(nslookup $1 2>/dev/null |grep 'Address' |grep -v '127.0.0.1' |awk '{ print $3 }')"
++}
++
++get_dnsservers() {
++ # this gets all dns servers for the interface which has the default route
++
++ dns=""
++ if [ ! -x /bin/ubus ]; then
++ # ubus not present (versions before Attitude): fallback to get these from /var/state/network.
++ # We always assume that wan is the default route interface here
++ dns="$(grep network.wan.resolv_dns /var/state/network | cut -d "=" -f 2)"
++ else
++ network_find_wan wan
++ network_get_dnsserver dns $wan
++ fi
++}
++
++iw=$(check_internet)
++
++if [ "$iw" == 0 ]; then
++ # Internet available again, restore default route and remove ip rules
++ if [ -n "$defroutegwcheck" ]; then
++ ip route add $defroutegwcheck
++ ip route del $defroutegwcheck table gw-check
++ for host in $testserver; do
++ ips="$(resolve $host)"
++ for ip in $ips; do
++ [ -n "$(ip rule show | grep "to $ip lookup gw-check")" ] && ip rule del to $ip table gw-check
++ done
++ done
++ get_dnsservers
++ for d in $dns; do
++ [ -n "$(ip rule show | grep "to $d lookup gw-check")" ] && ip rule del to $d table gw-check
++ done
++ logger -p err -t gw-check "Internet is available again, default route restored ( $defroutegwcheck)"
++ fi
++
++else
++ # Check failed. Move default route to table gw-check and setup ip rules.
++ if [ -z "$(ip rule show | grep gw-check)" -a -n "$defroutemain" ]; then
++ ip route add $defroutemain table gw-check
++ ip route del $defroutemain
++ logger -p err -t gw-check "Internet is not available, default route deactivated ( $defroutemain)"
++ fi
++ for host in $testserver; do
++ ips="$(resolve $host)"
++ for ip in $ips; do
++ [ -z "$(ip rule show | grep "to $ip lookup gw-check")" ] && ip rule add to $ip table gw-check
++ done
++ done
++ get_dnsservers
++ for d in $dns; do
++ [ -z "$(ip rule show | grep "to $d lookup gw-check")" ] && ip rule add to $d table gw-check
++ done
++ logger -p err -t gw-check "Check your internet connection!"
++fi
+diff --git a/feeds/luci/contrib/package/freifunk-gwcheck/root/etc/uci-defaults/freifunk-gwcheck b/feeds/luci/contrib/package/freifunk-gwcheck/root/etc/uci-defaults/freifunk-gwcheck
+new file mode 100644
+index 0000000..33b1b99
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-gwcheck/root/etc/uci-defaults/freifunk-gwcheck
+@@ -0,0 +1,7 @@
++#!/bin/sh
++tables="/etc/iproute2/rt_tables"
++test -d /etc/iproute2/ || mkdir -p /etc/iproute2/
++grep -q "gw-check" $tables || echo "200 gw-check" >> $tables
++test -f /etc/crontabs/root || touch /etc/crontabs/root
++grep -q "ff_olsr_test_gw.sh" /etc/crontabs/root || echo "* * * * * /usr/sbin/ff_olsr_test_gw.sh" >> /etc/crontabs/root
++/etc/init.d/cron restart
+diff --git a/feeds/luci/contrib/package/freifunk-mapupdate/Makefile b/feeds/luci/contrib/package/freifunk-mapupdate/Makefile
+new file mode 100644
+index 0000000..a9281ca
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-mapupdate/Makefile
+@@ -0,0 +1,39 @@
++# Copyright (C) 2011 Manuel Munz <freifunk at somakoma de>
++# This is free software, licensed under the Apache 2.0 license.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freifunk-mapupdate
++PKG_RELEASE:=1
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/freifunk-mapupdate
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=9. Freifunk
++ TITLE:=Update script for freifunkmap
++ DEPENDS:=+olsrd-mod-nameservice
++endef
++
++define Package/freifunk-mapupdate/description
++ This script updates the freifunkmap (also known as the global map, see http://map.berlin.freifunk.net) every hour. Config file is /etc/config/freifunk-mapupdate.
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/freifunk-mapupdate/install
++ $(CP) ./files/* $(1)/
++endef
++
++$(eval $(call BuildPackage,freifunk-mapupdate))
+diff --git a/feeds/luci/contrib/package/freifunk-mapupdate/files/etc/config/freifunk-mapupdate b/feeds/luci/contrib/package/freifunk-mapupdate/files/etc/config/freifunk-mapupdate
+new file mode 100644
+index 0000000..7e98f95
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-mapupdate/files/etc/config/freifunk-mapupdate
+@@ -0,0 +1,3 @@
++config 'mapupdate' 'mapupdate'
++ option 'enabled' '1'
++ option 'mapserver' 'http://map.berlin.freifunk.net/freifunkmap.php'
+diff --git a/feeds/luci/contrib/package/freifunk-mapupdate/files/usr/sbin/ff_mapupdate.sh b/feeds/luci/contrib/package/freifunk-mapupdate/files/usr/sbin/ff_mapupdate.sh
+new file mode 100755
+index 0000000..40a077f
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-mapupdate/files/usr/sbin/ff_mapupdate.sh
+@@ -0,0 +1,59 @@
++#!/bin/sh
++
++if [ ! "$(uci -q get freifunk-mapupdate.mapupdate.enabled)" == 1 ]; then
++ exit 1
++fi
++
++MAPSERVER="$(uci -q get freifunk-mapupdate.mapupdate.mapserver)"
++[ -z "$MAPSERVER" ] && logger -t "freifunk-mapupdate:" "No mapserver configured" && exit 1
++
++#check if nameservice plugin is installed and enabled, else exit
++nslib=`uci show olsrd |grep olsrd_nameservice.so |awk {' FS="."; print $1"."$2 '}`
++if [ -n "$nslib" ]; then
++ LATLONFILE="$(uci -q get $nslib.latlon_file)"
++ if [ -z "$LATLONFILE" ]; then
++ LATLONFILE="/var/run/latlon.js"
++ fi
++ if [ ! -p "$LATLONFILE" ]; then
++ logger -t "freifunk-mapupdate:" "latlon_file not found."; exit 1
++ fi
++else
++ logger -t "freifunk-mapupdate:" "nameservice plugin not found in olsrd config."
++ exit 1
++fi
++
++HOSTNAME="$(uci show system |grep hostname |cut -d "=" -f 2)"
++HF_INFO=""
++
++# Get info for myself
++SELF=$(cat $LATLONFILE |grep ^Self | sed -e 's/Self(//' -e 's/);//' -e "s/'//g")
++OLSR_IP="$(echo $SELF |awk '{ FS=",";print $1 }')"
++LOCATION="$(uci show system |grep .location |cut -d "=" -f 2)"
++[ -n "$LOCATION" ] && NOTE="$LOCATION<br>"
++FFNOTE="$(uci -q get freifunk.contact.note)"
++[ -n "$FFNOTE" ] && NOTE="$NOTE $FFNOTE"
++NOTE="<h3><a href='http://$OLSR_IP' target='_blank'>$HOSTNAME</a></h3><p>$NOTE"
++NOTE=`echo -e "$NOTE" | sed -e 's/\ /%20/g' -e 's/&/%26/g' -e 's/"/%22/g'`
++
++UPDATESTRING="$(echo $SELF |awk '{ FS=",";print $2 }'), $(echo $SELF |awk '{ FS=",";print $3 }')"
++
++# write our coordinates to mygooglemapscoords.txt to make Freifunk Firmware happy
++echo "$UPDATESTRING" > /tmp/mygooglemapscoords.txt
++[ ! -L /www/mygooglemapscoords.txt ] && ln -s /tmp/mygooglemapscoords.txt /www/mygooglemapscoords.txt
++
++# get neighbor Info (lat, lon, lq)
++while read line; do
++ NEIGHUPD="$(echo $line |awk '{ FS=","; print $6 }'), $(echo $line |awk '{ FS=","; print $7 }'), $(echo $line |awk '{ FS=",";print $4 }')"
++ UPDATESTRING="${UPDATESTRING}, ${NEIGHUPD}"
++done << EOF
++`grep "PLink('$OLSR_IP" $LATLONFILE | sed -e 's/PLink(//' -e 's/);//' -e "s/'//g"`
++EOF
++
++# Send UPDATESTRING
++UPDATE=`echo -e "$UPDATESTRING" | sed s/\ /%20/g`
++result="$(wget "$MAPSERVER?update=$UPDATE&updateiv=3600&olsrip=$OLSR_IP&note=${NOTE}${HF_INFO}" -qO -)"
++
++if [ ! "$result" == "success update" ]; then
++ logger -t "freifunk-mapupdate:" "Update failed: $result"
++fi
++
+diff --git a/feeds/luci/contrib/package/freifunk-mapupdate/root/etc/uci-defaults/freifunk-mapupdate b/feeds/luci/contrib/package/freifunk-mapupdate/root/etc/uci-defaults/freifunk-mapupdate
+new file mode 100644
+index 0000000..dee7f1b
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-mapupdate/root/etc/uci-defaults/freifunk-mapupdate
+@@ -0,0 +1,6 @@
++#!/bin/sh
++test -f /etc/crontabs/root || touch /etc/crontabs/root
++SEED="$( dd if=/dev/urandom bs=2 count=1 2>&- | hexdump | if read line; then echo 0x${line#* }; fi )"
++MIN="$(( $SEED % 59 ))"
++grep -q "ff_mapupdate.sh" /etc/crontabs/root || echo "$MIN * * * * /usr/sbin/ff_mapupdate.sh" >> /etc/crontabs/root
++/etc/init.d/cron restart
+diff --git a/feeds/luci/contrib/package/freifunk-p2pblock/Makefile b/feeds/luci/contrib/package/freifunk-p2pblock/Makefile
+new file mode 100644
+index 0000000..8eeafbb
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-p2pblock/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2009 Andreas Seidler <tetzlav@subsignal.org>
++# Copyright (C) 2012 Jo-Philipp Wich <jow@openwrt.org>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freifunk-p2pblock
++PKG_RELEASE:=3
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/freifunk-p2pblock
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=9. Freifunk
++ TITLE:=Freifunk p2pblock Addon
++ DEPENDS:=+iptables-mod-filter +iptables-mod-ipp2p +l7-protocols +iptables-mod-conntrack-extra
++endef
++
++define Package/freifunk-p2pblock/description
++ Simple Addon for Freifunk which use iptables layer7-, ipp2p- and recent-modules
++ to block p2p/filesharing traffic
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/freifunk-p2pblock/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/freifunk-p2pblock.init $(1)/etc/init.d/freifunk-p2pblock
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/freifunk-p2pblock.config $(1)/etc/config/freifunk_p2pblock
++endef
++
++$(eval $(call BuildPackage,freifunk-p2pblock))
+diff --git a/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.config b/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.config
+new file mode 100644
+index 0000000..291260e
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.config
+@@ -0,0 +1,6 @@
++config 'settings' 'p2pblock'
++ option 'portrange' '1024:65535'
++ option 'layer7' 'edonkey bittorrent fasttrack'
++ option 'ipp2p' 'edk dc kazaa gnu bit ares soul winmx apple'
++ option 'blocktime' '60'
++ option 'whitelist' ''
+diff --git a/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.init b/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.init
+new file mode 100644
+index 0000000..5ca60c8
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.init
+@@ -0,0 +1,95 @@
++#!/bin/sh /etc/rc.common
++
++START=82
++ME="freifunk-p2pblock"
++LOCK='/var/run/p2pblock.lock'
++
++# helper-scripts
++ipt_add() {
++ logger -t "$ME" "set 'iptables -I $1'"
++ iptables -I $1
++ echo "iptables -D $1" >> $LOCK
++}
++
++start() {
++ /etc/init.d/freifunk-p2pblock enabled || return
++
++ if [ ! -s "$LOCK" ]; then
++ logger -s -t "$ME" 'starting p2pblock...'
++
++ config_load network
++ config_get wan wan ifname
++
++ if [ -n "$wan" ]; then
++ config_load freifunk_p2pblock
++ config_get layer7 p2pblock layer7
++ config_get ipp2p p2pblock ipp2p
++ config_get portrange p2pblock portrange
++ config_get blocktime p2pblock blocktime
++ config_get whitelist p2pblock whitelist
++
++ # load modules
++ insmod ipt_ipp2p 2>&-
++ insmod ipt_layer7 2>&-
++ insmod ipt_recent ip_list_tot=400 ip_pkt_list_tot=3 2>&-
++
++ # create new p2p-chain
++ iptables -N p2pblock
++ # pipe all incoming FORWARD with source-/destination-port 1024-65535 throu p2p-chain
++ ipt_add "FORWARD -i $wan -p tcp --sport $portrange --dport $portrange -j p2pblock"
++ ipt_add "FORWARD -i $wan -p udp --sport $portrange --dport $portrange -j p2pblock"
++
++ # if p2p-traffic blocked 3 packages to a destination ip then block all traffic within the next 180 sec (port 1024-65535)
++ ipt_add "p2pblock -m recent --rdest --rcheck --name P2PBLOCK --seconds $blocktime --hitcount 3 -j DROP"
++ ipt_add "p2pblock -m recent --rdest --rcheck --name P2PBLOCK --seconds $blocktime --hitcount 3 -m limit --limit 1/minute -j LOG --log-prefix P2PBLOCK-DROP:"
++
++ # create layer7-rules
++ for proto in $layer7; do
++ ipt_add "p2pblock -m layer7 --l7proto $proto -m recent --rdest --set --name P2PBLOCK"
++ ipt_add "p2pblock -m layer7 --l7proto $proto -m limit --limit 1/minute -j LOG --log-prefix P2PBLOCK-seen-$proto:"
++ done
++
++ # create ipp2p-rules
++ for proto in $ipp2p; do
++ ipt_add "p2pblock -m ipp2p --$proto -m recent --rdest --set --name P2PBLOCK"
++ ipt_add "p2pblock -m ipp2p --$proto -m limit --limit 1/minute -j LOG --log-prefix P2PBLOCK-seen-$proto:"
++ done
++
++ # insert whitelisted ips
++ for ip in $whitelist; do
++ ipt_add "p2pblock -d $ip -j RETURN"
++ done
++
++ logger -s -t "$ME" 'Done.'; return 0
++ else
++ logger -s -t "$ME" 'No wan interface present.'; return 0
++ fi
++ else
++ logger -s -t "$ME" 'WARNING! already running - Aborting!'; return 2
++ fi
++}
++
++stop() {
++ if [ -s "$LOCK" ]; then
++ logger -s -t "$ME" 'stopping p2pblock...'
++
++ # unset all rules in $LOCK-file
++ cat $LOCK | sed -ne '1!G;h;$p' | while read line; do
++ logger -t "$ME" "unset $line"
++ while eval $line 2>&-; do :; done
++ done; : > "$LOCK"
++
++ # flush and delete the p2p-chain
++ iptables -F p2pblock
++ iptables -X p2pblock
++ logger -s -t "$ME" 'Done.'; return 0
++
++ else
++ logger -s -t "$ME" 'WARNING! not running - Aborting!'; return 2
++
++ fi
++}
++
++restart() {
++ stop; sleep 1; start
++}
+diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/Makefile b/feeds/luci/contrib/package/freifunk-policyrouting/Makefile
+new file mode 100644
+index 0000000..a9301ce
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-policyrouting/Makefile
+@@ -0,0 +1,47 @@
++# Copyright (C) 2011 Manuel Munz <freifunk at somakoma de>
++# This is free software, licensed under the Apache 2.0 license.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freifunk-policyrouting
++PKG_RELEASE:=6
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/freifunk-policyrouting
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=9. Freifunk
++ TITLE:=Freifunk policy routing addon
++ DEPENDS:=+ip
++endef
++
++define Package/freifunk-policyrouting/description
++ Allows you to send your own traffic via your own default gateway while sending traffic received from the mesh to a gateway in the mesh.
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/freifunk-policyrouting/install
++ $(CP) ./files/* $(1)/
++endef
++
++define Package/freifunk-policyrouting/postinst
++#!/bin/sh
++[ -n "$${IPKG_INSTROOT}" ] || {
++ /etc/init.d/freifunk-policyrouting enabled || /etc/init.d/freifunk-policyrouting enable
++ exit 0
++}
++endef
++
++$(eval $(call BuildPackage,freifunk-policyrouting))
+diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/config/freifunk-policyrouting b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/config/freifunk-policyrouting
+new file mode 100644
+index 0000000..3dd2998
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/config/freifunk-policyrouting
+@@ -0,0 +1,7 @@
++
++config 'settings' 'pr'
++ option 'enable' '0'
++ option 'strict' '1'
++ option 'fallback' '1'
++ option 'zones' ''
++
+diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/hotplug.d/iface/30-policyrouting b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/hotplug.d/iface/30-policyrouting
+new file mode 100644
+index 0000000..327e879
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/hotplug.d/iface/30-policyrouting
+@@ -0,0 +1,104 @@
++#!/bin/sh
++
++. /lib/functions.sh
++. /lib/functions/network.sh
++
++proto="4"
++[ -f /proc/net/ipv6_route ] && proto="4 6"
++
++config_load freifunk-policyrouting
++config_get enable pr enable
++config_get fallback pr fallback
++config_get strict pr strict
++config_get zones pr zones
++
++if [ "$ACTION" = "ifup" ] && [ "$enable" = "1" ]; then
++ network_get_subnet net $INTERFACE
++ network_get_subnet6 net6 $INTERFACE
++ network_get_physdev dev $INTERFACE
++
++ if [ "$net" != "" -a -n "$dev" ]; then
++ eval $(/bin/ipcalc.sh $net)
++ if [ "$PREFIX" != "0" -a "$NETWORK" != "127.0.0.0" ]; then
++ if [ ! "$(ip r s t localnets |grep "$NETWORK/$PREFIX dev")" ]; then
++ cmd="ip r a $NETWORK/$PREFIX dev $dev table localnets"
++ $cmd
++ if [ "$?" = 0 ]; then
++ logger -s -t policyrouting "Add route: $cmd"
++ else
++ logger -s -t policyrouting "Error! Could not add route: $cmd"
++ fi
++ fi
++
++ fi
++
++ if [ -n "$net6" ]; then
++ cmd="ip -6 r a $net6 dev $dev table localnets"
++ $cmd 2>&1 > /dev/null
++ if [ "$?" = 0 ]; then
++ logger -s -t policyrouting "Add route: $cmd (IPv6)"
++ fi
++
++ fi
++
++ networks=""
++ for z in $zones; do
++ network_zone="$(uci -q get firewall.zone_${z}.network)"
++ if [ -z "$network_zone" ]; then
++ network_zone="$z"
++ fi
++ networks="$networks $network_zone"
++ done
++ for n in $networks; do
++ if [ "$INTERFACE" = "$n" ]; then
++ for p in $proto; do
++ if [ ! "$(ip -$p ru s | grep "from all iif $dev lookup olsr-default")" ]; then
++ ip -$p rule add dev "$dev" lookup olsr-default prio 20000
++ if [ "$strict" != 0 ]; then
++ ip -$p rule add dev "$dev" unreachable prio 20001
++ fi
++ if [ "$?" = 0 ]; then
++ logger -s -t policyrouting "Use mesh gateway for interface $dev (IPv$p)"
++ if [ -z "$(uci -P /var/state get freifunk-policyrouting.${INTERFACE})" ]; then
++ uci -P /var/state set freifunk-policyrouting.${INTERFACE}="state"
++ fi
++ uci -P /var/state set freifunk-policyrouting.${INTERFACE}.device="$dev"
++ else
++ logger -s -t policyrouting "Error: Could not add rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)"
++ fi
++ fi
++ done
++ fi
++ done
++ fi
++
++fi
++
++if [ "$ACTION" = "ifdown" ]; then
++ dev="$(uci -q -P /var/state get freifunk-policyrouting.${INTERFACE}.device)"
++ if [ -n "$dev" ]; then
++ networks=""
++ for z in $zones; do
++ network_zone="$(uci -q get firewall.zone_${z}.network)"
++ if [ -z "$network_zone" ]; then
++ network_zone="$z"
++ fi
++ networks="$networks $network_zone"
++ done
++ for n in $networks; do
++ if [ "$INTERFACE" = "$n" ]; then
++ for p in $proto; do
++ if [ "$(ip -$p ru s | grep "from all iif $dev lookup olsr-default")" ]; then
++ ip -$p rule del dev "$dev" lookup olsr-default prio 20000
++ ip -$p rule del dev "$dev" unreachable prio 20001
++ if [ "$?" = 0 ]; then
++ logger -s -t policyrouting "Remove rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)"
++ else
++ logger -s -t policyrouting "Error! Could not remove rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)"
++ fi
++ fi
++ done
++ fi
++ done
++ fi
++fi
+diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/init.d/freifunk-policyrouting b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/init.d/freifunk-policyrouting
+new file mode 100755
+index 0000000..05a7540
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/init.d/freifunk-policyrouting
+@@ -0,0 +1,161 @@
++#!/bin/sh /etc/rc.common
++
++START=15
++. /lib/functions/network.sh
++. /lib/functions.sh
++
++proto="4"
++[ -f /proc/net/ipv6_route ] && proto="4 6"
++[ -f /etc/config/olsrd ] && cfgs="olsrd"
++[ -f /etc/config/olsrd6 ] && cfgs="$cfgs olsrd6"
++
++config_load freifunk-policyrouting
++config_get enable pr enable
++config_get fallback pr fallback
++config_get zones pr zones
++
++
++olsrd_rmtables() {
++ for cfg in $cfgs; do
++ # Remove custom routing tables from olsrd
++ if [ "`uci -q get $cfg.@olsrd[0].RtTable`" == "111" ] || [ "`uci -q get $cfg.@olsrd[0].RtTableDefault`" == "112" ]; then
++ uci delete $cfg.@olsrd[0].RtTable
++ uci delete $cfg.@olsrd[0].RtTableDefault
++ uci commit
++ fi
++ done
++}
++
++olsrd_intalltables() {
++ for cfg in $cfgs; do
++ if [ ! "`uci -q get $cfg.@olsrd[0].RtTable`" == "111" ] || [ ! "`uci -q get $cfg.@olsrd[0].RtTableDefault`" == "112" ]; then
++ uci set $cfg.@olsrd[0].RtTable='111'
++ uci set $cfg.@olsrd[0].RtTableDefault='112'
++ uci commit $cfg
++ /etc/init.d/$cfg restart 2&> /dev/null
++ fi
++ done
++}
++
++rt_tables() {
++ tables="/etc/iproute2/rt_tables"
++ if [ -z "`grep "110" $tables`" ]; then
++ echo "110 localnets" >> $tables
++ fi
++ if [ -z "`grep "111" $tables`" ]; then
++ echo "111 olsr" >> $tables
++ fi
++ if [ -z "`grep "112" $tables`" ]; then
++ echo "112 olsr-default" >> $tables
++ fi
++
++}
++
++disable_dyngw() {
++ for cfg in $cfgs; do
++ local dyngwlib=`uci show $cfg |grep dyn_gw.so |awk {' FS="."; print $1"."$2 '}`
++ if [ -n "$dyngwlib" ]; then
++ uci set $dyngwlib.ignore=1
++ uci commit $cfg
++ fi
++
++ dyngwplainlib=`uci show $cfg |grep dyn_gw_plain |awk {' FS="."; print $1"."$2 '}`
++ if [ -n "$dyngwplainlib" ]; then
++ rttable="$(uci -q get $dyngwplainlib.RtTable)"
++ if [ -z "$rttable" ] || [ "$rttable" = "254" ]; then
++ uci set $dyngwplainlib.ignore=1
++ uci commit $cfg
++ fi
++ fi
++ done
++}
++
++restart_services() {
++ logger -s -t policyrouting -p info "Restarting services"
++ /etc/init.d/network restart 2&> /dev/null
++ for cfg in $cfgs; do
++ /etc/init.d/$cfg restart 2&> /dev/null
++ done
++}
++
++boot() {
++ if [ "$enable" = "1" ]; then
++ [ -d /var/state ] || mkdir -p /var/state
++ touch /var/state/freifunk-policyrouting
++ start noservicerestart
++ else
++ olsrd_rmtables
++ fi
++}
++
++add_lookup_rule() {
++ name=${1/-/_}
++ lookup=$2
++ prio=$3
++
++ if [ -z "$name" -o -z "$lookup" -o -z "$prio" ]; then
++ logger -s -t policyrouting "Missing parameters for add_rule!"
++ else
++ for p in $proto; do
++ if [ "$p" = "6" ]; then
++ rule="rule6"
++ else
++ rule="rule"
++ fi
++
++ uci batch <<- EOF
++ set network.${name}ipv${p}="$rule"
++ set network.${name}ipv${p}.lookup="$lookup"
++ set network.${name}ipv${p}.priority="$prio"
++ EOF
++ done
++ fi
++}
++
++del_lookup_rule() {
++ name=${1/-/_}
++ for p in $proto; do
++ uci -q delete network.${name}ipv${p}
++ done
++}
++
++start() {
++ if [ $enable = "1" ]; then
++ logger -s -t policyrouting "Starting policy routing."
++ rt_tables
++ olsrd_intalltables
++ disable_dyngw
++
++ add_lookup_rule olsr olsr 1000
++ add_lookup_rule localnets localnets 2000
++
++ if [ "$fallback" = 1 ]; then
++ add_lookup_rule olsr-default olsr-default 100000
++ fi
++ fi
++ uci commit network
++ if [ ! "$1" = "noservicerestart" ]; then
++ restart_services
++ fi
++}
++
++stop() {
++ logger -s -t policyrouting "Stopping policy routing"
++ olsrd_rmtables
++ del_lookup_rule olsr-default
++ del_lookup_rule olsr
++ del_lookup_rule localnets
++ uci commit network
++ restart_services
++ echo "Hint: To completely disable freifunk-policyrouting set enable=0 in /etc/config/freifunk-policyrouting."
++}
++
++restart() {
++ logger -s -t policyrouting "Restarting policy routing"
++ olsrd_rmtables
++ del_lookup_rule olsr-default
++ del_lookup_rule olsr
++ del_lookup_rule localnets
++ uci commit network
++ start
++}
+diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/rc.d/S15-freifunk-policyrouting b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/rc.d/S15-freifunk-policyrouting
+new file mode 120000
+index 0000000..3c3dad8
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/rc.d/S15-freifunk-policyrouting
+@@ -0,0 +1 @@
++../init.d/freifunk-policyrouting
+\ No newline at end of file
+diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/uci-defaults/freifunk-policyrouting b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/uci-defaults/freifunk-policyrouting
+new file mode 100644
+index 0000000..a1e6310
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/uci-defaults/freifunk-policyrouting
+@@ -0,0 +1,7 @@
++#!/bin/sh
++uci batch <<-EOF
++ add ucitrack freifunk-policyrouting
++ add_list ucitrack.@freifunk-policyrouting[-1].exec="/etc/init.d/freifunk-policyrouting restart"
++ commit ucitrack
++EOF
++
+diff --git a/feeds/luci/contrib/package/freifunk-watchdog/Makefile b/feeds/luci/contrib/package/freifunk-watchdog/Makefile
+new file mode 100644
+index 0000000..c720c25
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-watchdog/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2009-2012 Jo-Philipp Wich <jow@openwrt.org>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freifunk-watchdog
++PKG_RELEASE:=8
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++PKG_BUILD_DEPENDS := uci
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/freifunk-watchdog
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=9. Freifunk
++ TITLE:=Freifunk Ad-Hoc watchdog daemon
++ DEPENDS:=libuci
++endef
++
++define Package/freifunk-watchdog/description
++ A watchdog daemon that monitors wireless interfaces to ensure the correct bssid and channel.
++ The process will initiate a wireless restart as soon as it detects a bssid or channel mismatch.
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++ $(CP) ./src/* $(PKG_BUILD_DIR)/
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include" \
++ LDFLAGS="$(TARGET_LDFLAGS)"
++endef
++
++define Package/freifunk-watchdog/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/freifunk-watchdog.init $(1)/etc/init.d/freifunk-watchdog
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/freifunk-watchdog.config $(1)/etc/config/freifunk-watchdog
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ffwatchd $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,freifunk-watchdog))
+diff --git a/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.config b/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.config
+new file mode 100644
+index 0000000..b6e6543
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.config
+@@ -0,0 +1,7 @@
++config process
++ option process 'dropbear'
++ option initscript '/etc/init.d/dropbear'
++
++config process
++ option process 'crond'
++ option initscript '/etc/init.d/cron'
+diff --git a/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.init b/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.init
+new file mode 100755
+index 0000000..d6ede09
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.init
+@@ -0,0 +1,39 @@
++#!/bin/sh /etc/rc.common
++
++START=99
++PID=/var/run/ffwatchd.pid
++BIN=/usr/sbin/ffwatchd
++
++boot()
++{
++ # If watchdog service is enabled, install cronjob, create device node and start daemon
++ if /etc/init.d/freifunk-watchdog enabled 2>/dev/null; then
++ if ! grep -q "$BIN" /etc/crontabs/root 2>/dev/null; then
++ echo "* * * * * $BIN running || /etc/init.d/freifunk-watchdog restart" >> /etc/crontabs/root
++ fi
++
++ mknod /dev/watchdog c 10 130
++
++ start
++
++ # If service is disabled, find and remove related cronjob
++ elif grep -q "$BIN" /etc/crontabs/root 2>/dev/null; then
++ sed -i -e "\\'$BIN'd" /etc/crontabs/root
++ fi
++}
++
++start()
++{
++ start-stop-daemon -q -b -m -p $PID -x $BIN -S
++}
++
++stop()
++{
++ start-stop-daemon -q -p $PID -x $BIN -K
++
++ if ! /etc/init.d/freifunk-watchdog enabled; then
++ if grep -q "$BIN" /etc/crontabs/root 2>/dev/null; then
++ sed -i -e "\\'$BIN'd" /etc/crontabs/root
++ fi
++ fi
++}
+diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/Makefile b/feeds/luci/contrib/package/freifunk-watchdog/src/Makefile
+new file mode 100644
+index 0000000..e049ebc
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/Makefile
+@@ -0,0 +1,12 @@
++WD_BINARY:=ffwatchd
++WD_CFLAGS:=$(CFLAGS) -c -DBINARY=\"$(WD_BINARY)\"
++WD_LDFLAGS:=$(LDFLAGS) -lm -luci
++
++watchdog:
++ $(CC) $(WD_CFLAGS) -o ucix.o ucix.c
++ $(CC) $(WD_CFLAGS) -o watchdog.o watchdog.c
++ $(CC) $(WD_LDFLAGS) -o $(WD_BINARY) watchdog.o ucix.o
++
++clean:
++ rm -f *~ $(WD_BINARY) *.o
++
+diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.c b/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.c
+new file mode 100644
+index 0000000..f2f69fc
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.c
+@@ -0,0 +1,102 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
++ *
++ * Copyright (C) 2008 John Crispin <blogic@openwrt.org>
++ *
++ * Changed by Jo-Philipp Wich <jow@openwrt.org>
++ */
++
++#include <string.h>
++#include <stdlib.h>
++
++#include <uci_config.h>
++#include <uci.h>
++#include "ucix.h"
++
++static struct uci_ptr ptr;
++
++static inline int ucix_get_ptr(struct uci_context *ctx, const char *p, const char *s, const char *o, const char *t)
++{
++ memset(&ptr, 0, sizeof(ptr));
++ ptr.package = p;
++ ptr.section = s;
++ ptr.option = o;
++ ptr.value = t;
++ return uci_lookup_ptr(ctx, &ptr, NULL, true);
++}
++
++struct uci_context* ucix_init(const char *config_file)
++{
++ struct uci_context *ctx = uci_alloc_context();
++#ifdef uci_to_delta
++ uci_add_delta_path(ctx, "/var/state");
++#else
++ uci_add_history_path(ctx, "/var/state");
++#endif
++ if(uci_load(ctx, config_file, NULL) != UCI_OK)
++ {
++ return NULL;
++ }
++ return ctx;
++}
++
++void ucix_cleanup(struct uci_context *ctx)
++{
++ uci_free_context(ctx);
++}
++
++const char* ucix_get_option(struct uci_context *ctx, const char *p, const char *s, const char *o)
++{
++ struct uci_element *e = NULL;
++ const char *value = NULL;
++ if(ucix_get_ptr(ctx, p, s, o, NULL))
++ return NULL;
++ if (!(ptr.flags & UCI_LOOKUP_COMPLETE))
++ return NULL;
++ e = ptr.last;
++ switch (e->type)
++ {
++ case UCI_TYPE_SECTION:
++ value = uci_to_section(e)->type;
++ break;
++ case UCI_TYPE_OPTION:
++ switch(ptr.o->type) {
++ case UCI_TYPE_STRING:
++ value = ptr.o->v.string;
++ break;
++ default:
++ value = NULL;
++ break;
++ }
++ break;
++ default:
++ return 0;
++ }
++
++ return value;
++}
++
++void ucix_for_each_section_type(struct uci_context *ctx,
++ const char *p, const char *t,
++ void (*cb)(const char*, void*), void *priv)
++{
++ struct uci_element *e;
++ if(ucix_get_ptr(ctx, p, NULL, NULL, NULL))
++ return;
++ uci_foreach_element(&ptr.p->sections, e)
++ if (!strcmp(t, uci_to_section(e)->type))
++ cb(e->name, priv);
++}
++
+diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.h b/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.h
+new file mode 100644
+index 0000000..b1f5ec3
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.h
+@@ -0,0 +1,29 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
++ *
++ * Copyright (C) 2008 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _UCI_H__
++#define _UCI_H__
++struct uci_context* ucix_init(const char *config_file);
++
++void ucix_for_each_section_type(struct uci_context *ctx,
++ const char *p, const char *t,
++ void (*cb)(const char*, void*), void *priv);
++
++const char* ucix_get_option(struct uci_context *ctx,
++ const char *p, const char *s, const char *o);
++#endif
+diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.c b/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.c
+new file mode 100644
+index 0000000..f546985
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.c
+@@ -0,0 +1,527 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
++ *
++ * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
++ */
++
++#include "watchdog.h"
++
++/* Global watchdog fd, required by signal handler */
++int wdfd = -1;
++
++/* Handle finished childs */
++static void sigchld_handler(int sig)
++{
++ pid_t pid;
++
++ while( (pid = waitpid(-1, NULL, WNOHANG)) > 0 )
++ syslog(LOG_INFO, "Child returned (pid %d)", pid);
++}
++
++/* Watchdog shutdown helper */
++static void shutdown_watchdog(int sig)
++{
++ static const char wshutdown = WATCH_SHUTDOWN;
++
++ if( wdfd > -1 )
++ {
++ syslog(LOG_INFO, "Stopping watchdog timer");
++ write(wdfd, &wshutdown, 1);
++ close(wdfd);
++ wdfd = -1;
++ }
++
++ exit(0);
++}
++
++/* Get BSSID of given interface */
++static int iw_get_bssid(int iwfd, const char *ifname, char *bssid)
++{
++ struct iwreq iwrq;
++
++ if( iw_ioctl(iwfd, ifname, SIOCGIWAP, &iwrq) >= 0 )
++ {
++ unsigned char *addr = (unsigned char *)iwrq.u.ap_addr.sa_data;
++
++ sprintf(bssid, "%02X:%02X:%02X:%02X:%02X:%02X",
++ addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
++
++ return 0;
++ }
++
++ return -1;
++}
++
++/* Get channel of given interface */
++static int iw_get_channel(int iwfd, const char *ifname, int *channel)
++{
++ int i;
++ char buffer[sizeof(struct iw_range)];
++ double cur_freq, cmp_freq;
++ struct iwreq iwrq;
++ struct iw_range *range;
++
++ memset(buffer, 0, sizeof(buffer));
++
++ iwrq.u.data.pointer = (char *)buffer;
++ iwrq.u.data.length = sizeof(buffer);
++ iwrq.u.data.flags = 0;
++
++ if( iw_ioctl(iwfd, ifname, SIOCGIWRANGE, &iwrq) < 0)
++ {
++ *channel = -1;
++ return -1;
++ }
++
++ range = (struct iw_range *)buffer;
++
++ if( iw_ioctl(iwfd, ifname, SIOCGIWFREQ, &iwrq) >= 0 )
++ {
++ cur_freq = ((double)iwrq.u.freq.m) * pow(10, iwrq.u.freq.e);
++ if( cur_freq < 1000.00 )
++ {
++ *channel = (int)cur_freq;
++ return 0;
++ }
++
++ for(i = 0; i < range->num_frequency; i++)
++ {
++ cmp_freq = ((double)range->freq[i].m) * pow(10, range->freq[i].e);
++ if( cmp_freq == cur_freq )
++ {
++ *channel = (int)range->freq[i].i;
++ return 0;
++ }
++ }
++ }
++
++ *channel = -1;
++ return -1;
++}
++
++/* Get the (first) pid of given process name */
++static int find_process(const char *name)
++{
++ int pid = -1;
++ int file;
++ char buffer[128];
++ char cmpname[128];
++ DIR *dir;
++ struct dirent *entry;
++
++ if( (dir = opendir("/proc")) != NULL )
++ {
++ snprintf(cmpname, sizeof(cmpname), "Name:\t%s\n", name);
++
++ while( (entry = readdir(dir)) != NULL )
++ {
++ if( !strcmp(entry->d_name, "..") || !isdigit(*entry->d_name) )
++ continue;
++
++ sprintf(buffer, "/proc/%s/status", entry->d_name);
++ if( (file = open(buffer, O_RDONLY)) > -1 )
++ {
++ read(file, buffer, sizeof(buffer));
++ close(file);
++
++ if( strstr(buffer, cmpname) == buffer )
++ {
++ pid = atoi(entry->d_name);
++
++ /* Skip myself ... */
++ if( pid == getpid() )
++ pid = -1;
++ else
++ break;
++ }
++ }
++ }
++
++ closedir(dir);
++ return pid;
++ }
++
++ syslog(LOG_CRIT, "Unable to open /proc: %s",
++ strerror(errno));
++
++ return -1;
++}
++
++/* Get the 5 minute load average */
++static double find_loadavg(void)
++{
++ int fd;
++ char buffer[10];
++ double load = 0.00;
++
++ if( (fd = open("/proc/loadavg", O_RDONLY)) > -1 )
++ {
++ if( read(fd, buffer, sizeof(buffer)) == sizeof(buffer) )
++ load = atof(&buffer[5]);
++
++ close(fd);
++ }
++
++ return load;
++}
++
++/* Check if given uci file was updated */
++static int check_uci_update(const char *config, time_t *mtime)
++{
++ struct stat s;
++ char path[128];
++
++ snprintf(path, sizeof(path), "/var/state/%s", config);
++ if( stat(path, &s) > -1 )
++ {
++ if( (*mtime == 0) || (s.st_mtime > *mtime) )
++ {
++ *mtime = s.st_mtime;
++ return 1;
++ }
++ }
++
++ return 0;
++}
++
++/* Add tuple */
++static void load_wifi_uci_add_iface(const char *section, struct uci_wifi_iface_itr_ctx *itr)
++{
++ wifi_tuple_t *t;
++ const char *ucitmp;
++ int val = 0;
++
++ ucitmp = ucix_get_option(itr->ctx, "wireless", section, "mode");
++ if( ucitmp && !strncmp(ucitmp, "adhoc", 5) )
++ {
++ if( (t = (wifi_tuple_t *)malloc(sizeof(wifi_tuple_t))) != NULL )
++ {
++ ucitmp = ucix_get_option(itr->ctx, "wireless", section, "ifname");
++ if(ucitmp)
++ {
++ strncpy(t->ifname, ucitmp, sizeof(t->ifname));
++ val++;
++ }
++
++ ucitmp = ucix_get_option(itr->ctx, "wireless", section, "bssid");
++ if(ucitmp)
++ {
++ strncpy(t->bssid, ucitmp, sizeof(t->bssid));
++ val++;
++ }
++
++ ucitmp = ucix_get_option(itr->ctx, "wireless", section, "device");
++ if(ucitmp)
++ {
++ ucitmp = ucix_get_option(itr->ctx, "wireless", ucitmp, "channel");
++ if(ucitmp)
++ {
++ t->channel = atoi(ucitmp);
++ val++;
++ }
++ }
++
++ if( val == 3 )
++ {
++ syslog(LOG_INFO, "Monitoring %s: bssid=%s channel=%d",
++ t->ifname, t->bssid, t->channel);
++
++ t->next = itr->list;
++ itr->list = t;
++ }
++ else
++ {
++ free(t);
++ }
++ }
++ }
++}
++
++/* Load config */
++static wifi_tuple_t * load_wifi_uci(wifi_tuple_t *ifs, time_t *modtime)
++{
++ struct uci_context *ctx;
++ struct uci_wifi_iface_itr_ctx itr;
++ wifi_tuple_t *cur, *next;
++
++ if( check_uci_update("wireless", modtime) )
++ {
++ syslog(LOG_INFO, "Wireless config changed, reloading");
++
++ if( (ctx = ucix_init("wireless")) != NULL )
++ {
++ if( ifs != NULL )
++ {
++ for(cur = ifs; cur; cur = next)
++ {
++ next = cur->next;
++ free(cur);
++ }
++ }
++
++ itr.list = NULL;
++ itr.ctx = ctx;
++
++ ucix_for_each_section_type(ctx, "wireless", "wifi-iface",
++ (void *)load_wifi_uci_add_iface, &itr);
++
++ return itr.list;
++ }
++ }
++
++ return ifs;
++}
++
++/* Add tuple */
++static void load_watchdog_uci_add_process(const char *section, struct uci_process_itr_ctx *itr)
++{
++ process_tuple_t *t;
++ const char *ucitmp;
++ int val = 0;
++
++ if( (t = (process_tuple_t *)malloc(sizeof(process_tuple_t))) != NULL )
++ {
++ t->restart = 0;
++
++ ucitmp = ucix_get_option(itr->ctx, "freifunk-watchdog", section, "process");
++ if(ucitmp)
++ {
++ strncpy(t->process, ucitmp, sizeof(t->process));
++ val++;
++ }
++
++ ucitmp = ucix_get_option(itr->ctx, "freifunk-watchdog", section, "initscript");
++ if(ucitmp)
++ {
++ strncpy(t->initscript, ucitmp, sizeof(t->initscript));
++ val++;
++ }
++
++ if( val == 2 )
++ {
++ syslog(LOG_INFO, "Monitoring %s: initscript=%s",
++ t->process, t->initscript);
++
++ t->next = itr->list;
++ itr->list = t;
++ }
++ else
++ {
++ free(t);
++ }
++ }
++}
++
++/* Load config */
++static process_tuple_t * load_watchdog_uci(process_tuple_t *procs)
++{
++ struct uci_context *ctx;
++ struct uci_process_itr_ctx itr;
++ process_tuple_t *cur, *next;
++
++ syslog(LOG_INFO, "Loading watchdog config");
++
++ if( (ctx = ucix_init("freifunk-watchdog")) != NULL )
++ {
++ if( procs != NULL )
++ {
++ for(cur = procs; cur; cur = next)
++ {
++ next = cur->next;
++ free(cur);
++ }
++ }
++
++ itr.list = NULL;
++ itr.ctx = ctx;
++
++ ucix_for_each_section_type(ctx, "freifunk-watchdog", "process",
++ (void *)load_watchdog_uci_add_process, &itr);
++
++ return itr.list;
++ }
++
++ return procs;
++}
++
++/* Daemon implementation */
++static int do_daemon(void)
++{
++ static int wdtrigger = 1;
++ static int wdtimeout = BASE_INTERVAL * 2;
++ static const char wdkeepalive = WATCH_KEEPALIVE;
++
++ int iwfd;
++ int channel;
++ char bssid[18];
++ struct sigaction sa;
++
++ wifi_tuple_t *ifs = NULL, *curr_if;
++ process_tuple_t *procs = NULL, *curr_proc;
++ time_t wireless_modtime = 0;
++
++ int action_intv = 0;
++ int restart_wifi = 0;
++ int loadavg_panic = 0;
++
++ openlog(SYSLOG_IDENT, 0, LOG_DAEMON);
++ memset(&sa, 0, sizeof(sa));
++
++ if( (iwfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 )
++ {
++ syslog(LOG_ERR, "Can not open wireless control socket: %s",
++ strerror(errno));
++
++ return 1;
++ }
++
++ if( (wdfd = open(WATCH_DEVICE, O_WRONLY)) > -1 )
++ {
++ syslog(LOG_INFO, "Opened %s - polling every %i seconds",
++ WATCH_DEVICE, BASE_INTERVAL);
++
++ /* Install signal handler to halt watchdog on shutdown */
++ sa.sa_handler = shutdown_watchdog;
++ sa.sa_flags = SA_NOCLDWAIT | SA_RESTART;
++ sigaction(SIGHUP, &sa, NULL);
++ sigaction(SIGINT, &sa, NULL);
++ sigaction(SIGPIPE, &sa, NULL);
++ sigaction(SIGTERM, &sa, NULL);
++ sigaction(SIGUSR1, &sa, NULL);
++ sigaction(SIGUSR2, &sa, NULL);
++
++ /* Set watchdog timeout to twice the interval */
++ ioctl(wdfd, WDIOC_SETTIMEOUT, &wdtimeout);
++ }
++
++ /* Install signal handler to reap childs */
++ sa.sa_handler = sigchld_handler;
++ sa.sa_flags = 0;
++ sigaction(SIGCHLD, &sa, NULL);
++
++ /* Load watchdog configuration only once */
++ procs = load_watchdog_uci(procs);
++
++ while( 1 )
++ {
++ /* Check/increment action interval */
++ if( ++action_intv >= ACTION_INTERVAL )
++ {
++ /* Reset action interval */
++ action_intv = 0;
++
++ /* Check average load */
++ if( find_loadavg() >= LOAD_TRESHOLD )
++ loadavg_panic++;
++ else
++ loadavg_panic = 0;
++
++ /* Check wireless interfaces */
++ ifs = load_wifi_uci(ifs, &wireless_modtime);
++ for( curr_if = ifs; curr_if; curr_if = curr_if->next )
++ {
++ /* Get current channel and bssid */
++ if( (iw_get_bssid(iwfd, curr_if->ifname, bssid) == 0) &&
++ (iw_get_channel(iwfd, curr_if->ifname, &channel) == 0) )
++ {
++ /* Check BSSID */
++ if( strcasecmp(bssid, curr_if->bssid) != 0 )
++ {
++ syslog(LOG_WARNING, "BSSID mismatch on %s: current=%s wanted=%s",
++ curr_if->ifname, bssid, curr_if->bssid);
++
++ restart_wifi++;
++ }
++
++ /* Check channel */
++ else if( channel != curr_if->channel )
++ {
++ syslog(LOG_WARNING, "Channel mismatch on %s: current=%d wanted=%d",
++ curr_if->ifname, channel, curr_if->channel);
++
++ restart_wifi++;
++ }
++ }
++ else
++ {
++ syslog(LOG_WARNING, "Requested interface %s not present", curr_if->ifname);
++ }
++ }
++
++ /* Check processes */
++ for( curr_proc = procs; curr_proc; curr_proc = curr_proc->next )
++ {
++ if( find_process(curr_proc->process) < 0 )
++ curr_proc->restart++;
++ else
++ curr_proc->restart = 0;
++
++ /* Process restart required? */
++ if( curr_proc->restart >= HYSTERESIS )
++ {
++ curr_proc->restart = 0;
++ syslog(LOG_WARNING, "The %s process died, restarting", curr_proc->process);
++ EXEC(PROC_ACTION);
++ }
++ }
++
++
++ /* Wifi restart required? */
++ if( restart_wifi >= HYSTERESIS )
++ {
++ restart_wifi = 0;
++ syslog(LOG_WARNING, "Channel or BSSID mismatch on wireless interface, restarting");
++ EXEC(WIFI_ACTION);
++ }
++
++ /* Is there a load problem? */
++ if( loadavg_panic >= HYSTERESIS )
++ {
++ syslog(LOG_EMERG, "Critical system load level, triggering reset!");
++
++ /* Try watchdog, fall back to reboot */
++ if( wdfd > -1 )
++ ioctl(wdfd, WDIOC_SETTIMEOUT, &wdtrigger);
++ else
++ EXEC(LOAD_ACTION);
++ }
++ }
++
++
++ /* Reset watchdog timer */
++ if( wdfd > -1 )
++ write(wdfd, &wdkeepalive, 1);
++
++ sleep(BASE_INTERVAL);
++ }
++
++ shutdown_watchdog(0);
++ closelog();
++
++ return 0;
++}
++
++
++int main(int argc, char *argv[])
++{
++ /* Check if watchdog is running ... */
++ if( (argc > 1) && (strcmp(argv[1], "running") == 0) )
++ {
++ return (find_process(BINARY) == -1);
++ }
++
++ /* Start daemon */
++ return do_daemon();
++}
+diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.h b/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.h
+new file mode 100644
+index 0000000..6f2382d
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.h
+@@ -0,0 +1,142 @@
++/*
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
++ *
++ * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
++ */
++
++#include <stdio.h>
++#include <string.h>
++#include <unistd.h>
++#include <stdint.h>
++#include <stdlib.h>
++#include <syslog.h>
++#include <ctype.h>
++#include <errno.h>
++#include <dirent.h>
++#include <fcntl.h>
++#include <math.h>
++#include <time.h>
++#include <signal.h>
++#include <limits.h>
++#include <sys/wait.h>
++#include <sys/stat.h>
++#include <sys/ioctl.h>
++#include <sys/socket.h>
++#include <linux/types.h>
++#include <linux/watchdog.h>
++
++#include "ucix.h"
++#include "wireless.22.h"
++
++
++/* Watchdog poll interval */
++#define BASE_INTERVAL 5
++
++/* Action interval (N * BASE_INTERVAL) */
++#define ACTION_INTERVAL 6
++
++/* Hysteresis */
++#define HYSTERESIS 3
++
++/* How to call myself in the logs */
++#define SYSLOG_IDENT "Freifunk Watchdog"
++
++/* Process error action */
++#define PROC_ACTION curr_proc->initscript, curr_proc->initscript, "restart"
++
++/* Wifi error action */
++#define WIFI_ACTION "/sbin/wifi", "/sbin/wifi"
++
++/* Watchdog device */
++#define WATCH_DEVICE "/dev/watchdog"
++#define WATCH_SHUTDOWN 'V'
++#define WATCH_KEEPALIVE '\0'
++
++/* System load error action and treshold */
++#define LOAD_TRESHOLD 15.00
++#define LOAD_ACTION "/sbin/reboot", "/sbin/reboot"
++
++/* Fallback binary name (passed by makefile) */
++#ifndef BINARY
++#define BINARY "ffwatchd"
++#endif
++
++
++/* ifname/bssid/channel tuples */
++struct wifi_tuple {
++ char ifname[16];
++ char bssid[18];
++ int channel;
++ struct wifi_tuple *next;
++};
++
++/* structure to hold tuple-list and uci context during iteration */
++struct uci_wifi_iface_itr_ctx {
++ struct wifi_tuple *list;
++ struct uci_context *ctx;
++};
++
++typedef struct wifi_tuple wifi_tuple_t;
++
++
++/* process name/exec tuples */
++struct process_tuple {
++ char process[PATH_MAX + 1];
++ char initscript[PATH_MAX + 1];
++ int restart;
++ struct process_tuple *next;
++};
++
++/* structure to hold tuple-list and uci context during iteration */
++struct uci_process_itr_ctx {
++ struct process_tuple *list;
++ struct uci_context *ctx;
++};
++
++typedef struct process_tuple process_tuple_t;
++
++
++/* ioctl() helper (stolen from iwlib) */
++static inline int
++iw_ioctl(int skfd, /* Socket to the kernel */
++ const char * ifname, /* Device name */
++ int request, /* WE ID */
++ struct iwreq * pwrq) /* Fixed part of the request */
++{
++ /* Set device name */
++ strncpy(pwrq->ifr_ifrn.ifrn_name, ifname, 16);
++
++ /* Do the request */
++ return(ioctl(skfd, request, pwrq));
++}
++
++/* fork() & execl() helper */
++#define EXEC(x) \
++ do { \
++ switch(fork()) \
++ { \
++ case -1: \
++ syslog(LOG_CRIT, "Unable to fork child: %s", \
++ strerror(errno)); \
++ break; \
++ \
++ case 0: \
++ execl(x, NULL); \
++ syslog(LOG_CRIT, "Unable to execute action: %s", \
++ strerror(errno)); \
++ return 1; \
++ } \
++ } while(0)
++
+diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/wireless.22.h b/feeds/luci/contrib/package/freifunk-watchdog/src/wireless.22.h
+new file mode 100644
+index 0000000..1d19243
+--- /dev/null
++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/wireless.22.h
+@@ -0,0 +1,1139 @@
++/*
++ * This file define a set of standard wireless extensions
++ *
++ * Version : 22 16.3.07
++ *
++ * Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com>
++ * Copyright (c) 1997-2007 Jean Tourrilhes, All Rights Reserved.
++ */
++
++#ifndef _LINUX_WIRELESS_H
++#define _LINUX_WIRELESS_H
++
++/************************** DOCUMENTATION **************************/
++/*
++ * Initial APIs (1996 -> onward) :
++ * -----------------------------
++ * Basically, the wireless extensions are for now a set of standard ioctl
++ * call + /proc/net/wireless
++ *
++ * The entry /proc/net/wireless give statistics and information on the
++ * driver.
++ * This is better than having each driver having its entry because
++ * its centralised and we may remove the driver module safely.
++ *
++ * Ioctl are used to configure the driver and issue commands. This is
++ * better than command line options of insmod because we may want to
++ * change dynamically (while the driver is running) some parameters.
++ *
++ * The ioctl mechanimsm are copied from standard devices ioctl.
++ * We have the list of command plus a structure descibing the
++ * data exchanged...
++ * Note that to add these ioctl, I was obliged to modify :
++ * # net/core/dev.c (two place + add include)
++ * # net/ipv4/af_inet.c (one place + add include)
++ *
++ * /proc/net/wireless is a copy of /proc/net/dev.
++ * We have a structure for data passed from the driver to /proc/net/wireless
++ * Too add this, I've modified :
++ * # net/core/dev.c (two other places)
++ * # include/linux/netdevice.h (one place)
++ * # include/linux/proc_fs.h (one place)
++ *
++ * New driver API (2002 -> onward) :
++ * -------------------------------
++ * This file is only concerned with the user space API and common definitions.
++ * The new driver API is defined and documented in :
++ * # include/net/iw_handler.h
++ *
++ * Note as well that /proc/net/wireless implementation has now moved in :
++ * # net/core/wireless.c
++ *
++ * Wireless Events (2002 -> onward) :
++ * --------------------------------
++ * Events are defined at the end of this file, and implemented in :
++ * # net/core/wireless.c
++ *
++ * Other comments :
++ * --------------
++ * Do not add here things that are redundant with other mechanisms
++ * (drivers init, ifconfig, /proc/net/dev, ...) and with are not
++ * wireless specific.
++ *
++ * These wireless extensions are not magic : each driver has to provide
++ * support for them...
++ *
++ * IMPORTANT NOTE : As everything in the kernel, this is very much a
++ * work in progress. Contact me if you have ideas of improvements...
++ */
++
++/***************************** INCLUDES *****************************/
++
++/* This header is used in user-space, therefore need to be sanitised
++ * for that purpose. Those includes are usually not compatible with glibc.
++ * To know which includes to use in user-space, check iwlib.h. */
++#ifdef __KERNEL__
++#include <linux/types.h> /* for "caddr_t" et al */
++#include <linux/socket.h> /* for "struct sockaddr" et al */
++#include <linux/if.h> /* for IFNAMSIZ and co... */
++#endif /* __KERNEL__ */
++
++/***************************** VERSION *****************************/
++/*
++ * This constant is used to know the availability of the wireless
++ * extensions and to know which version of wireless extensions it is
++ * (there is some stuff that will be added in the future...)
++ * I just plan to increment with each new version.
++ */
++#define WIRELESS_EXT 22
++
++/*
++ * Changes :
++ *
++ * V2 to V3
++ * --------
++ * Alan Cox start some incompatibles changes. I've integrated a bit more.
++ * - Encryption renamed to Encode to avoid US regulation problems
++ * - Frequency changed from float to struct to avoid problems on old 386
++ *
++ * V3 to V4
++ * --------
++ * - Add sensitivity
++ *
++ * V4 to V5
++ * --------
++ * - Missing encoding definitions in range
++ * - Access points stuff
++ *
++ * V5 to V6
++ * --------
++ * - 802.11 support (ESSID ioctls)
++ *
++ * V6 to V7
++ * --------
++ * - define IW_ESSID_MAX_SIZE and IW_MAX_AP
++ *
++ * V7 to V8
++ * --------
++ * - Changed my e-mail address
++ * - More 802.11 support (nickname, rate, rts, frag)
++ * - List index in frequencies
++ *
++ * V8 to V9
++ * --------
++ * - Support for 'mode of operation' (ad-hoc, managed...)
++ * - Support for unicast and multicast power saving
++ * - Change encoding to support larger tokens (>64 bits)
++ * - Updated iw_params (disable, flags) and use it for NWID
++ * - Extracted iw_point from iwreq for clarity
++ *
++ * V9 to V10
++ * ---------
++ * - Add PM capability to range structure
++ * - Add PM modifier : MAX/MIN/RELATIVE
++ * - Add encoding option : IW_ENCODE_NOKEY
++ * - Add TxPower ioctls (work like TxRate)
++ *
++ * V10 to V11
++ * ----------
++ * - Add WE version in range (help backward/forward compatibility)
++ * - Add retry ioctls (work like PM)
++ *
++ * V11 to V12
++ * ----------
++ * - Add SIOCSIWSTATS to get /proc/net/wireless programatically
++ * - Add DEV PRIVATE IOCTL to avoid collisions in SIOCDEVPRIVATE space
++ * - Add new statistics (frag, retry, beacon)
++ * - Add average quality (for user space calibration)
++ *
++ * V12 to V13
++ * ----------
++ * - Document creation of new driver API.
++ * - Extract union iwreq_data from struct iwreq (for new driver API).
++ * - Rename SIOCSIWNAME as SIOCSIWCOMMIT
++ *
++ * V13 to V14
++ * ----------
++ * - Wireless Events support : define struct iw_event
++ * - Define additional specific event numbers
++ * - Add "addr" and "param" fields in union iwreq_data
++ * - AP scanning stuff (SIOCSIWSCAN and friends)
++ *
++ * V14 to V15
++ * ----------
++ * - Add IW_PRIV_TYPE_ADDR for struct sockaddr private arg
++ * - Make struct iw_freq signed (both m & e), add explicit padding
++ * - Add IWEVCUSTOM for driver specific event/scanning token
++ * - Add IW_MAX_GET_SPY for driver returning a lot of addresses
++ * - Add IW_TXPOW_RANGE for range of Tx Powers
++ * - Add IWEVREGISTERED & IWEVEXPIRED events for Access Points
++ * - Add IW_MODE_MONITOR for passive monitor
++ *
++ * V15 to V16
++ * ----------
++ * - Increase the number of bitrates in iw_range to 32 (for 802.11g)
++ * - Increase the number of frequencies in iw_range to 32 (for 802.11b+a)
++ * - Reshuffle struct iw_range for increases, add filler
++ * - Increase IW_MAX_AP to 64 for driver returning a lot of addresses
++ * - Remove IW_MAX_GET_SPY because conflict with enhanced spy support
++ * - Add SIOCSIWTHRSPY/SIOCGIWTHRSPY and "struct iw_thrspy"
++ * - Add IW_ENCODE_TEMP and iw_range->encoding_login_index
++ *
++ * V16 to V17
++ * ----------
++ * - Add flags to frequency -> auto/fixed
++ * - Document (struct iw_quality *)->updated, add new flags (INVALID)
++ * - Wireless Event capability in struct iw_range
++ * - Add support for relative TxPower (yick !)
++ *
++ * V17 to V18 (From Jouni Malinen <jkmaline@cc.hut.fi>)
++ * ----------
++ * - Add support for WPA/WPA2
++ * - Add extended encoding configuration (SIOCSIWENCODEEXT and
++ * SIOCGIWENCODEEXT)
++ * - Add SIOCSIWGENIE/SIOCGIWGENIE
++ * - Add SIOCSIWMLME
++ * - Add SIOCSIWPMKSA
++ * - Add struct iw_range bit field for supported encoding capabilities
++ * - Add optional scan request parameters for SIOCSIWSCAN
++ * - Add SIOCSIWAUTH/SIOCGIWAUTH for setting authentication and WPA
++ * related parameters (extensible up to 4096 parameter values)
++ * - Add wireless events: IWEVGENIE, IWEVMICHAELMICFAILURE,
++ * IWEVASSOCREQIE, IWEVASSOCRESPIE, IWEVPMKIDCAND
++ *
++ * V18 to V19
++ * ----------
++ * - Remove (struct iw_point *)->pointer from events and streams
++ * - Remove header includes to help user space
++ * - Increase IW_ENCODING_TOKEN_MAX from 32 to 64
++ * - Add IW_QUAL_ALL_UPDATED and IW_QUAL_ALL_INVALID macros
++ * - Add explicit flag to tell stats are in dBm : IW_QUAL_DBM
++ * - Add IW_IOCTL_IDX() and IW_EVENT_IDX() macros
++ *
++ * V19 to V20
++ * ----------
++ * - RtNetlink requests support (SET/GET)
++ *
++ * V20 to V21
++ * ----------
++ * - Remove (struct net_device *)->get_wireless_stats()
++ * - Change length in ESSID and NICK to strlen() instead of strlen()+1
++ * - Add IW_RETRY_SHORT/IW_RETRY_LONG retry modifiers
++ * - Power/Retry relative values no longer * 100000
++ * - Add explicit flag to tell stats are in 802.11k RCPI : IW_QUAL_RCPI
++ *
++ * V21 to V22
++ * ----------
++ * - Prevent leaking of kernel space in stream on 64 bits.
++ */
++
++/**************************** CONSTANTS ****************************/
++
++/* -------------------------- IOCTL LIST -------------------------- */
++
++/* Wireless Identification */
++#define SIOCSIWCOMMIT 0x8B00 /* Commit pending changes to driver */
++#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */
++/* SIOCGIWNAME is used to verify the presence of Wireless Extensions.
++ * Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"...
++ * Don't put the name of your driver there, it's useless. */
++
++/* Basic operations */
++#define SIOCSIWNWID 0x8B02 /* set network id (pre-802.11) */
++#define SIOCGIWNWID 0x8B03 /* get network id (the cell) */
++#define SIOCSIWFREQ 0x8B04 /* set channel/frequency (Hz) */
++#define SIOCGIWFREQ 0x8B05 /* get channel/frequency (Hz) */
++#define SIOCSIWMODE 0x8B06 /* set operation mode */
++#define SIOCGIWMODE 0x8B07 /* get operation mode */
++#define SIOCSIWSENS 0x8B08 /* set sensitivity (dBm) */
++#define SIOCGIWSENS 0x8B09 /* get sensitivity (dBm) */
++
++/* Informative stuff */
++#define SIOCSIWRANGE 0x8B0A /* Unused */
++#define SIOCGIWRANGE 0x8B0B /* Get range of parameters */
++#define SIOCSIWPRIV 0x8B0C /* Unused */
++#define SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */
++#define SIOCSIWSTATS 0x8B0E /* Unused */
++#define SIOCGIWSTATS 0x8B0F /* Get /proc/net/wireless stats */
++/* SIOCGIWSTATS is strictly used between user space and the kernel, and
++ * is never passed to the driver (i.e. the driver will never see it). */
++
++/* Spy support (statistics per MAC address - used for Mobile IP support) */
++#define SIOCSIWSPY 0x8B10 /* set spy addresses */
++#define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */
++#define SIOCSIWTHRSPY 0x8B12 /* set spy threshold (spy event) */
++#define SIOCGIWTHRSPY 0x8B13 /* get spy threshold */
++
++/* Access Point manipulation */
++#define SIOCSIWAP 0x8B14 /* set access point MAC addresses */
++#define SIOCGIWAP 0x8B15 /* get access point MAC addresses */
++#define SIOCGIWAPLIST 0x8B17 /* Deprecated in favor of scanning */
++#define SIOCSIWSCAN 0x8B18 /* trigger scanning (list cells) */
++#define SIOCGIWSCAN 0x8B19 /* get scanning results */
++
++/* 802.11 specific support */
++#define SIOCSIWESSID 0x8B1A /* set ESSID (network name) */
++#define SIOCGIWESSID 0x8B1B /* get ESSID */
++#define SIOCSIWNICKN 0x8B1C /* set node name/nickname */
++#define SIOCGIWNICKN 0x8B1D /* get node name/nickname */
++/* As the ESSID and NICKN are strings up to 32 bytes long, it doesn't fit
++ * within the 'iwreq' structure, so we need to use the 'data' member to
++ * point to a string in user space, like it is done for RANGE... */
++
++/* Other parameters useful in 802.11 and some other devices */
++#define SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */
++#define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */
++#define SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */
++#define SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */
++#define SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */
++#define SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */
++#define SIOCSIWTXPOW 0x8B26 /* set transmit power (dBm) */
++#define SIOCGIWTXPOW 0x8B27 /* get transmit power (dBm) */
++#define SIOCSIWRETRY 0x8B28 /* set retry limits and lifetime */
++#define SIOCGIWRETRY 0x8B29 /* get retry limits and lifetime */
++
++/* Encoding stuff (scrambling, hardware security, WEP...) */
++#define SIOCSIWENCODE 0x8B2A /* set encoding token & mode */
++#define SIOCGIWENCODE 0x8B2B /* get encoding token & mode */
++/* Power saving stuff (power management, unicast and multicast) */
++#define SIOCSIWPOWER 0x8B2C /* set Power Management settings */
++#define SIOCGIWPOWER 0x8B2D /* get Power Management settings */
++/* Modulation bitmask */
++#define SIOCSIWMODUL 0x8B2E /* set Modulations settings */
++#define SIOCGIWMODUL 0x8B2F /* get Modulations settings */
++
++/* WPA : Generic IEEE 802.11 informatiom element (e.g., for WPA/RSN/WMM).
++ * This ioctl uses struct iw_point and data buffer that includes IE id and len
++ * fields. More than one IE may be included in the request. Setting the generic
++ * IE to empty buffer (len=0) removes the generic IE from the driver. Drivers
++ * are allowed to generate their own WPA/RSN IEs, but in these cases, drivers
++ * are required to report the used IE as a wireless event, e.g., when
++ * associating with an AP. */
++#define SIOCSIWGENIE 0x8B30 /* set generic IE */
++#define SIOCGIWGENIE 0x8B31 /* get generic IE */
++
++/* WPA : IEEE 802.11 MLME requests */
++#define SIOCSIWMLME 0x8B16 /* request MLME operation; uses
++ * struct iw_mlme */
++/* WPA : Authentication mode parameters */
++#define SIOCSIWAUTH 0x8B32 /* set authentication mode params */
++#define SIOCGIWAUTH 0x8B33 /* get authentication mode params */
++
++/* WPA : Extended version of encoding configuration */
++#define SIOCSIWENCODEEXT 0x8B34 /* set encoding token & mode */
++#define SIOCGIWENCODEEXT 0x8B35 /* get encoding token & mode */
++
++/* WPA2 : PMKSA cache management */
++#define SIOCSIWPMKSA 0x8B36 /* PMKSA cache operation */
++
++/* -------------------- DEV PRIVATE IOCTL LIST -------------------- */
++
++/* These 32 ioctl are wireless device private, for 16 commands.
++ * Each driver is free to use them for whatever purpose it chooses,
++ * however the driver *must* export the description of those ioctls
++ * with SIOCGIWPRIV and *must* use arguments as defined below.
++ * If you don't follow those rules, DaveM is going to hate you (reason :
++ * it make mixed 32/64bit operation impossible).
++ */
++#define SIOCIWFIRSTPRIV 0x8BE0
++#define SIOCIWLASTPRIV 0x8BFF
++/* Previously, we were using SIOCDEVPRIVATE, but we now have our
++ * separate range because of collisions with other tools such as
++ * 'mii-tool'.
++ * We now have 32 commands, so a bit more space ;-).
++ * Also, all 'even' commands are only usable by root and don't return the
++ * content of ifr/iwr to user (but you are not obliged to use the set/get
++ * convention, just use every other two command). More details in iwpriv.c.
++ * And I repeat : you are not forced to use them with iwpriv, but you
++ * must be compliant with it.
++ */
++
++/* ------------------------- IOCTL STUFF ------------------------- */
++
++/* The first and the last (range) */
++#define SIOCIWFIRST 0x8B00
++#define SIOCIWLAST SIOCIWLASTPRIV /* 0x8BFF */
++#define IW_IOCTL_IDX(cmd) ((cmd) - SIOCIWFIRST)
++
++/* Odd : get (world access), even : set (root access) */
++#define IW_IS_SET(cmd) (!((cmd) & 0x1))
++#define IW_IS_GET(cmd) ((cmd) & 0x1)
++
++/* ----------------------- WIRELESS EVENTS ----------------------- */
++/* Those are *NOT* ioctls, do not issue request on them !!! */
++/* Most events use the same identifier as ioctl requests */
++
++#define IWEVTXDROP 0x8C00 /* Packet dropped to excessive retry */
++#define IWEVQUAL 0x8C01 /* Quality part of statistics (scan) */
++#define IWEVCUSTOM 0x8C02 /* Driver specific ascii string */
++#define IWEVREGISTERED 0x8C03 /* Discovered a new node (AP mode) */
++#define IWEVEXPIRED 0x8C04 /* Expired a node (AP mode) */
++#define IWEVGENIE 0x8C05 /* Generic IE (WPA, RSN, WMM, ..)
++ * (scan results); This includes id and
++ * length fields. One IWEVGENIE may
++ * contain more than one IE. Scan
++ * results may contain one or more
++ * IWEVGENIE events. */
++#define IWEVMICHAELMICFAILURE 0x8C06 /* Michael MIC failure
++ * (struct iw_michaelmicfailure)
++ */
++#define IWEVASSOCREQIE 0x8C07 /* IEs used in (Re)Association Request.
++ * The data includes id and length
++ * fields and may contain more than one
++ * IE. This event is required in
++ * Managed mode if the driver
++ * generates its own WPA/RSN IE. This
++ * should be sent just before
++ * IWEVREGISTERED event for the
++ * association. */
++#define IWEVASSOCRESPIE 0x8C08 /* IEs used in (Re)Association
++ * Response. The data includes id and
++ * length fields and may contain more
++ * than one IE. This may be sent
++ * between IWEVASSOCREQIE and
++ * IWEVREGISTERED events for the
++ * association. */
++#define IWEVPMKIDCAND 0x8C09 /* PMKID candidate for RSN
++ * pre-authentication
++ * (struct iw_pmkid_cand) */
++
++#define IWEVFIRST 0x8C00
++#define IW_EVENT_IDX(cmd) ((cmd) - IWEVFIRST)
++
++/* ------------------------- PRIVATE INFO ------------------------- */
++/*
++ * The following is used with SIOCGIWPRIV. It allow a driver to define
++ * the interface (name, type of data) for its private ioctl.
++ * Privates ioctl are SIOCIWFIRSTPRIV -> SIOCIWLASTPRIV
++ */
++
++#define IW_PRIV_TYPE_MASK 0x7000 /* Type of arguments */
++#define IW_PRIV_TYPE_NONE 0x0000
++#define IW_PRIV_TYPE_BYTE 0x1000 /* Char as number */
++#define IW_PRIV_TYPE_CHAR 0x2000 /* Char as character */
++#define IW_PRIV_TYPE_INT 0x4000 /* 32 bits int */
++#define IW_PRIV_TYPE_FLOAT 0x5000 /* struct iw_freq */
++#define IW_PRIV_TYPE_ADDR 0x6000 /* struct sockaddr */
++
++#define IW_PRIV_SIZE_FIXED 0x0800 /* Variable or fixed number of args */
++
++#define IW_PRIV_SIZE_MASK 0x07FF /* Max number of those args */
++
++/*
++ * Note : if the number of args is fixed and the size < 16 octets,
++ * instead of passing a pointer we will put args in the iwreq struct...
++ */
++
++/* ----------------------- OTHER CONSTANTS ----------------------- */
++
++/* Maximum frequencies in the range struct */
++#define IW_MAX_FREQUENCIES 32
++/* Note : if you have something like 80 frequencies,
++ * don't increase this constant and don't fill the frequency list.
++ * The user will be able to set by channel anyway... */
++
++/* Maximum bit rates in the range struct */
++#define IW_MAX_BITRATES 32
++
++/* Maximum tx powers in the range struct */
++#define IW_MAX_TXPOWER 8
++/* Note : if you more than 8 TXPowers, just set the max and min or
++ * a few of them in the struct iw_range. */
++
++/* Maximum of address that you may set with SPY */
++#define IW_MAX_SPY 8
++
++/* Maximum of address that you may get in the
++ list of access points in range */
++#define IW_MAX_AP 64
++
++/* Maximum size of the ESSID and NICKN strings */
++#define IW_ESSID_MAX_SIZE 32
++
++/* Modes of operation */
++#define IW_MODE_AUTO 0 /* Let the driver decides */
++#define IW_MODE_ADHOC 1 /* Single cell network */
++#define IW_MODE_INFRA 2 /* Multi cell network, roaming, ... */
++#define IW_MODE_MASTER 3 /* Synchronisation master or Access Point */
++#define IW_MODE_REPEAT 4 /* Wireless Repeater (forwarder) */
++#define IW_MODE_SECOND 5 /* Secondary master/repeater (backup) */
++#define IW_MODE_MONITOR 6 /* Passive monitor (listen only) */
++
++/* Statistics flags (bitmask in updated) */
++#define IW_QUAL_QUAL_UPDATED 0x01 /* Value was updated since last read */
++#define IW_QUAL_LEVEL_UPDATED 0x02
++#define IW_QUAL_NOISE_UPDATED 0x04
++#define IW_QUAL_ALL_UPDATED 0x07
++#define IW_QUAL_DBM 0x08 /* Level + Noise are dBm */
++#define IW_QUAL_QUAL_INVALID 0x10 /* Driver doesn't provide value */
++#define IW_QUAL_LEVEL_INVALID 0x20
++#define IW_QUAL_NOISE_INVALID 0x40
++#define IW_QUAL_RCPI 0x80 /* Level + Noise are 802.11k RCPI */
++#define IW_QUAL_ALL_INVALID 0x70
++
++/* Frequency flags */
++#define IW_FREQ_AUTO 0x00 /* Let the driver decides */
++#define IW_FREQ_FIXED 0x01 /* Force a specific value */
++
++/* Maximum number of size of encoding token available
++ * they are listed in the range structure */
++#define IW_MAX_ENCODING_SIZES 8
++
++/* Maximum size of the encoding token in bytes */
++#define IW_ENCODING_TOKEN_MAX 64 /* 512 bits (for now) */
++
++/* Flags for encoding (along with the token) */
++#define IW_ENCODE_INDEX 0x00FF /* Token index (if needed) */
++#define IW_ENCODE_FLAGS 0xFF00 /* Flags defined below */
++#define IW_ENCODE_MODE 0xF000 /* Modes defined below */
++#define IW_ENCODE_DISABLED 0x8000 /* Encoding disabled */
++#define IW_ENCODE_ENABLED 0x0000 /* Encoding enabled */
++#define IW_ENCODE_RESTRICTED 0x4000 /* Refuse non-encoded packets */
++#define IW_ENCODE_OPEN 0x2000 /* Accept non-encoded packets */
++#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */
++#define IW_ENCODE_TEMP 0x0400 /* Temporary key */
++
++/* Power management flags available (along with the value, if any) */
++#define IW_POWER_ON 0x0000 /* No details... */
++#define IW_POWER_TYPE 0xF000 /* Type of parameter */
++#define IW_POWER_PERIOD 0x1000 /* Value is a period/duration of */
++#define IW_POWER_TIMEOUT 0x2000 /* Value is a timeout (to go asleep) */
++#define IW_POWER_SAVING 0x4000 /* Value is relative (how aggressive)*/
++#define IW_POWER_MODE 0x0F00 /* Power Management mode */
++#define IW_POWER_UNICAST_R 0x0100 /* Receive only unicast messages */
++#define IW_POWER_MULTICAST_R 0x0200 /* Receive only multicast messages */
++#define IW_POWER_ALL_R 0x0300 /* Receive all messages though PM */
++#define IW_POWER_FORCE_S 0x0400 /* Force PM procedure for sending unicast */
++#define IW_POWER_REPEATER 0x0800 /* Repeat broadcast messages in PM period */
++#define IW_POWER_MODIFIER 0x000F /* Modify a parameter */
++#define IW_POWER_MIN 0x0001 /* Value is a minimum */
++#define IW_POWER_MAX 0x0002 /* Value is a maximum */
++#define IW_POWER_RELATIVE 0x0004 /* Value is not in seconds/ms/us */
++
++/* Transmit Power flags available */
++#define IW_TXPOW_TYPE 0x00FF /* Type of value */
++#define IW_TXPOW_DBM 0x0000 /* Value is in dBm */
++#define IW_TXPOW_MWATT 0x0001 /* Value is in mW */
++#define IW_TXPOW_RELATIVE 0x0002 /* Value is in arbitrary units */
++#define IW_TXPOW_RANGE 0x1000 /* Range of value between min/max */
++
++/* Retry limits and lifetime flags available */
++#define IW_RETRY_ON 0x0000 /* No details... */
++#define IW_RETRY_TYPE 0xF000 /* Type of parameter */
++#define IW_RETRY_LIMIT 0x1000 /* Maximum number of retries*/
++#define IW_RETRY_LIFETIME 0x2000 /* Maximum duration of retries in us */
++#define IW_RETRY_MODIFIER 0x00FF /* Modify a parameter */
++#define IW_RETRY_MIN 0x0001 /* Value is a minimum */
++#define IW_RETRY_MAX 0x0002 /* Value is a maximum */
++#define IW_RETRY_RELATIVE 0x0004 /* Value is not in seconds/ms/us */
++#define IW_RETRY_SHORT 0x0010 /* Value is for short packets */
++#define IW_RETRY_LONG 0x0020 /* Value is for long packets */
++
++/* Scanning request flags */
++#define IW_SCAN_DEFAULT 0x0000 /* Default scan of the driver */
++#define IW_SCAN_ALL_ESSID 0x0001 /* Scan all ESSIDs */
++#define IW_SCAN_THIS_ESSID 0x0002 /* Scan only this ESSID */
++#define IW_SCAN_ALL_FREQ 0x0004 /* Scan all Frequencies */
++#define IW_SCAN_THIS_FREQ 0x0008 /* Scan only this Frequency */
++#define IW_SCAN_ALL_MODE 0x0010 /* Scan all Modes */
++#define IW_SCAN_THIS_MODE 0x0020 /* Scan only this Mode */
++#define IW_SCAN_ALL_RATE 0x0040 /* Scan all Bit-Rates */
++#define IW_SCAN_THIS_RATE 0x0080 /* Scan only this Bit-Rate */
++/* struct iw_scan_req scan_type */
++#define IW_SCAN_TYPE_ACTIVE 0
++#define IW_SCAN_TYPE_PASSIVE 1
++/* Maximum size of returned data */
++#define IW_SCAN_MAX_DATA 4096 /* In bytes */
++
++/* Max number of char in custom event - use multiple of them if needed */
++#define IW_CUSTOM_MAX 256 /* In bytes */
++
++/* Generic information element */
++#define IW_GENERIC_IE_MAX 1024
++
++/* MLME requests (SIOCSIWMLME / struct iw_mlme) */
++#define IW_MLME_DEAUTH 0
++#define IW_MLME_DISASSOC 1
++#define IW_MLME_AUTH 2
++#define IW_MLME_ASSOC 3
++
++/* SIOCSIWAUTH/SIOCGIWAUTH struct iw_param flags */
++#define IW_AUTH_INDEX 0x0FFF
++#define IW_AUTH_FLAGS 0xF000
++/* SIOCSIWAUTH/SIOCGIWAUTH parameters (0 .. 4095)
++ * (IW_AUTH_INDEX mask in struct iw_param flags; this is the index of the
++ * parameter that is being set/get to; value will be read/written to
++ * struct iw_param value field) */
++#define IW_AUTH_WPA_VERSION 0
++#define IW_AUTH_CIPHER_PAIRWISE 1
++#define IW_AUTH_CIPHER_GROUP 2
++#define IW_AUTH_KEY_MGMT 3
++#define IW_AUTH_TKIP_COUNTERMEASURES 4
++#define IW_AUTH_DROP_UNENCRYPTED 5
++#define IW_AUTH_80211_AUTH_ALG 6
++#define IW_AUTH_WPA_ENABLED 7
++#define IW_AUTH_RX_UNENCRYPTED_EAPOL 8
++#define IW_AUTH_ROAMING_CONTROL 9
++#define IW_AUTH_PRIVACY_INVOKED 10
++
++/* IW_AUTH_WPA_VERSION values (bit field) */
++#define IW_AUTH_WPA_VERSION_DISABLED 0x00000001
++#define IW_AUTH_WPA_VERSION_WPA 0x00000002
++#define IW_AUTH_WPA_VERSION_WPA2 0x00000004
++
++/* IW_AUTH_PAIRWISE_CIPHER and IW_AUTH_GROUP_CIPHER values (bit field) */
++#define IW_AUTH_CIPHER_NONE 0x00000001
++#define IW_AUTH_CIPHER_WEP40 0x00000002
++#define IW_AUTH_CIPHER_TKIP 0x00000004
++#define IW_AUTH_CIPHER_CCMP 0x00000008
++#define IW_AUTH_CIPHER_WEP104 0x00000010
++
++/* IW_AUTH_KEY_MGMT values (bit field) */
++#define IW_AUTH_KEY_MGMT_802_1X 1
++#define IW_AUTH_KEY_MGMT_PSK 2
++
++/* IW_AUTH_80211_AUTH_ALG values (bit field) */
++#define IW_AUTH_ALG_OPEN_SYSTEM 0x00000001
++#define IW_AUTH_ALG_SHARED_KEY 0x00000002
++#define IW_AUTH_ALG_LEAP 0x00000004
++
++/* IW_AUTH_ROAMING_CONTROL values */
++#define IW_AUTH_ROAMING_ENABLE 0 /* driver/firmware based roaming */
++#define IW_AUTH_ROAMING_DISABLE 1 /* user space program used for roaming
++ * control */
++
++/* SIOCSIWENCODEEXT definitions */
++#define IW_ENCODE_SEQ_MAX_SIZE 8
++/* struct iw_encode_ext ->alg */
++#define IW_ENCODE_ALG_NONE 0
++#define IW_ENCODE_ALG_WEP 1
++#define IW_ENCODE_ALG_TKIP 2
++#define IW_ENCODE_ALG_CCMP 3
++/* struct iw_encode_ext ->ext_flags */
++#define IW_ENCODE_EXT_TX_SEQ_VALID 0x00000001
++#define IW_ENCODE_EXT_RX_SEQ_VALID 0x00000002
++#define IW_ENCODE_EXT_GROUP_KEY 0x00000004
++#define IW_ENCODE_EXT_SET_TX_KEY 0x00000008
++
++/* IWEVMICHAELMICFAILURE : struct iw_michaelmicfailure ->flags */
++#define IW_MICFAILURE_KEY_ID 0x00000003 /* Key ID 0..3 */
++#define IW_MICFAILURE_GROUP 0x00000004
++#define IW_MICFAILURE_PAIRWISE 0x00000008
++#define IW_MICFAILURE_STAKEY 0x00000010
++#define IW_MICFAILURE_COUNT 0x00000060 /* 1 or 2 (0 = count not supported)
++ */
++
++/* Bit field values for enc_capa in struct iw_range */
++#define IW_ENC_CAPA_WPA 0x00000001
++#define IW_ENC_CAPA_WPA2 0x00000002
++#define IW_ENC_CAPA_CIPHER_TKIP 0x00000004
++#define IW_ENC_CAPA_CIPHER_CCMP 0x00000008
++
++/* Event capability macros - in (struct iw_range *)->event_capa
++ * Because we have more than 32 possible events, we use an array of
++ * 32 bit bitmasks. Note : 32 bits = 0x20 = 2^5. */
++#define IW_EVENT_CAPA_BASE(cmd) ((cmd >= SIOCIWFIRSTPRIV) ? \
++ (cmd - SIOCIWFIRSTPRIV + 0x60) : \
++ (cmd - SIOCSIWCOMMIT))
++#define IW_EVENT_CAPA_INDEX(cmd) (IW_EVENT_CAPA_BASE(cmd) >> 5)
++#define IW_EVENT_CAPA_MASK(cmd) (1 << (IW_EVENT_CAPA_BASE(cmd) & 0x1F))
++/* Event capability constants - event autogenerated by the kernel
++ * This list is valid for most 802.11 devices, customise as needed... */
++#define IW_EVENT_CAPA_K_0 (IW_EVENT_CAPA_MASK(0x8B04) | \
++ IW_EVENT_CAPA_MASK(0x8B06) | \
++ IW_EVENT_CAPA_MASK(0x8B1A))
++#define IW_EVENT_CAPA_K_1 (IW_EVENT_CAPA_MASK(0x8B2A))
++/* "Easy" macro to set events in iw_range (less efficient) */
++#define IW_EVENT_CAPA_SET(event_capa, cmd) (event_capa[IW_EVENT_CAPA_INDEX(cmd)] |= IW_EVENT_CAPA_MASK(cmd))
++#define IW_EVENT_CAPA_SET_KERNEL(event_capa) {event_capa[0] |= IW_EVENT_CAPA_K_0; event_capa[1] |= IW_EVENT_CAPA_K_1; }
++
++/* Modulations bitmasks */
++#define IW_MODUL_ALL 0x00000000 /* Everything supported */
++#define IW_MODUL_FH 0x00000001 /* Frequency Hopping */
++#define IW_MODUL_DS 0x00000002 /* Original Direct Sequence */
++#define IW_MODUL_CCK 0x00000004 /* 802.11b : 5.5 + 11 Mb/s */
++#define IW_MODUL_11B (IW_MODUL_DS | IW_MODUL_CCK)
++#define IW_MODUL_PBCC 0x00000008 /* TI : 5.5 + 11 + 22 Mb/s */
++#define IW_MODUL_OFDM_A 0x00000010 /* 802.11a : 54 Mb/s */
++#define IW_MODUL_11A (IW_MODUL_OFDM_A)
++#define IW_MODUL_11AB (IW_MODUL_11B | IW_MODUL_11A)
++#define IW_MODUL_OFDM_G 0x00000020 /* 802.11g : 54 Mb/s */
++#define IW_MODUL_11G (IW_MODUL_11B | IW_MODUL_OFDM_G)
++#define IW_MODUL_11AG (IW_MODUL_11G | IW_MODUL_11A)
++#define IW_MODUL_TURBO 0x00000040 /* ATH : bonding, 108 Mb/s */
++/* In here we should define MIMO stuff. Later... */
++#define IW_MODUL_CUSTOM 0x40000000 /* Driver specific */
++
++/* Bitrate flags available */
++#define IW_BITRATE_TYPE 0x00FF /* Type of value */
++#define IW_BITRATE_UNICAST 0x0001 /* Maximum/Fixed unicast bitrate */
++#define IW_BITRATE_BROADCAST 0x0002 /* Fixed broadcast bitrate */
++
++/****************************** TYPES ******************************/
++
++/* --------------------------- SUBTYPES --------------------------- */
++/*
++ * Generic format for most parameters that fit in an int
++ */
++struct iw_param
++{
++ int32_t value; /* The value of the parameter itself */
++ uint8_t fixed; /* Hardware should not use auto select */
++ uint8_t disabled; /* Disable the feature */
++ uint16_t flags; /* Various specifc flags (if any) */
++};
++
++/*
++ * For all data larger than 16 octets, we need to use a
++ * pointer to memory allocated in user space.
++ */
++struct iw_point
++{
++ void *pointer; /* Pointer to the data (in user space) */
++ uint16_t length; /* number of fields or size in bytes */
++ uint16_t flags; /* Optional params */
++};
++
++/*
++ * A frequency
++ * For numbers lower than 10^9, we encode the number in 'm' and
++ * set 'e' to 0
++ * For number greater than 10^9, we divide it by the lowest power
++ * of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')...
++ * The power of 10 is in 'e', the result of the division is in 'm'.
++ */
++struct iw_freq
++{
++ int32_t m; /* Mantissa */
++ int16_t e; /* Exponent */
++ uint8_t i; /* List index (when in range struct) */
++ uint8_t flags; /* Flags (fixed/auto) */
++};
++
++/*
++ * Quality of the link
++ */
++struct iw_quality
++{
++ uint8_t qual; /* link quality (%retries, SNR,
++ %missed beacons or better...) */
++ uint8_t level; /* signal level (dBm) */
++ uint8_t noise; /* noise level (dBm) */
++ uint8_t updated; /* Flags to know if updated */
++};
++
++/*
++ * Packet discarded in the wireless adapter due to
++ * "wireless" specific problems...
++ * Note : the list of counter and statistics in net_device_stats
++ * is already pretty exhaustive, and you should use that first.
++ * This is only additional stats...
++ */
++struct iw_discarded
++{
++ uint32_t nwid; /* Rx : Wrong nwid/essid */
++ uint32_t code; /* Rx : Unable to code/decode (WEP) */
++ uint32_t fragment; /* Rx : Can't perform MAC reassembly */
++ uint32_t retries; /* Tx : Max MAC retries num reached */
++ uint32_t misc; /* Others cases */
++};
++
++/*
++ * Packet/Time period missed in the wireless adapter due to
++ * "wireless" specific problems...
++ */
++struct iw_missed
++{
++ uint32_t beacon; /* Missed beacons/superframe */
++};
++
++/*
++ * Quality range (for spy threshold)
++ */
++struct iw_thrspy
++{
++ struct sockaddr addr; /* Source address (hw/mac) */
++ struct iw_quality qual; /* Quality of the link */
++ struct iw_quality low; /* Low threshold */
++ struct iw_quality high; /* High threshold */
++};
++
++/*
++ * Optional data for scan request
++ *
++ * Note: these optional parameters are controlling parameters for the
++ * scanning behavior, these do not apply to getting scan results
++ * (SIOCGIWSCAN). Drivers are expected to keep a local BSS table and
++ * provide a merged results with all BSSes even if the previous scan
++ * request limited scanning to a subset, e.g., by specifying an SSID.
++ * Especially, scan results are required to include an entry for the
++ * current BSS if the driver is in Managed mode and associated with an AP.
++ */
++struct iw_scan_req
++{
++ uint8_t scan_type; /* IW_SCAN_TYPE_{ACTIVE,PASSIVE} */
++ uint8_t essid_len;
++ uint8_t num_channels; /* num entries in channel_list;
++ * 0 = scan all allowed channels */
++ uint8_t flags; /* reserved as padding; use zero, this may
++ * be used in the future for adding flags
++ * to request different scan behavior */
++ struct sockaddr bssid; /* ff:ff:ff:ff:ff:ff for broadcast BSSID or
++ * individual address of a specific BSS */
++
++ /*
++ * Use this ESSID if IW_SCAN_THIS_ESSID flag is used instead of using
++ * the current ESSID. This allows scan requests for specific ESSID
++ * without having to change the current ESSID and potentially breaking
++ * the current association.
++ */
++ uint8_t essid[IW_ESSID_MAX_SIZE];
++
++ /*
++ * Optional parameters for changing the default scanning behavior.
++ * These are based on the MLME-SCAN.request from IEEE Std 802.11.
++ * TU is 1.024 ms. If these are set to 0, driver is expected to use
++ * reasonable default values. min_channel_time defines the time that
++ * will be used to wait for the first reply on each channel. If no
++ * replies are received, next channel will be scanned after this. If
++ * replies are received, total time waited on the channel is defined by
++ * max_channel_time.
++ */
++ uint32_t min_channel_time; /* in TU */
++ uint32_t max_channel_time; /* in TU */
++
++ struct iw_freq channel_list[IW_MAX_FREQUENCIES];
++};
++
++/* ------------------------- WPA SUPPORT ------------------------- */
++
++/*
++ * Extended data structure for get/set encoding (this is used with
++ * SIOCSIWENCODEEXT/SIOCGIWENCODEEXT. struct iw_point and IW_ENCODE_*
++ * flags are used in the same way as with SIOCSIWENCODE/SIOCGIWENCODE and
++ * only the data contents changes (key data -> this structure, including
++ * key data).
++ *
++ * If the new key is the first group key, it will be set as the default
++ * TX key. Otherwise, default TX key index is only changed if
++ * IW_ENCODE_EXT_SET_TX_KEY flag is set.
++ *
++ * Key will be changed with SIOCSIWENCODEEXT in all cases except for
++ * special "change TX key index" operation which is indicated by setting
++ * key_len = 0 and ext_flags |= IW_ENCODE_EXT_SET_TX_KEY.
++ *
++ * tx_seq/rx_seq are only used when respective
++ * IW_ENCODE_EXT_{TX,RX}_SEQ_VALID flag is set in ext_flags. Normal
++ * TKIP/CCMP operation is to set RX seq with SIOCSIWENCODEEXT and start
++ * TX seq from zero whenever key is changed. SIOCGIWENCODEEXT is normally
++ * used only by an Authenticator (AP or an IBSS station) to get the
++ * current TX sequence number. Using TX_SEQ_VALID for SIOCSIWENCODEEXT and
++ * RX_SEQ_VALID for SIOCGIWENCODEEXT are optional, but can be useful for
++ * debugging/testing.
++ */
++struct iw_encode_ext
++{
++ uint32_t ext_flags; /* IW_ENCODE_EXT_* */
++ uint8_t tx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */
++ uint8_t rx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */
++ struct sockaddr addr; /* ff:ff:ff:ff:ff:ff for broadcast/multicast
++ * (group) keys or unicast address for
++ * individual keys */
++ uint16_t alg; /* IW_ENCODE_ALG_* */
++ uint16_t key_len;
++ uint8_t key[0];
++};
++
++/* SIOCSIWMLME data */
++struct iw_mlme
++{
++ uint16_t cmd; /* IW_MLME_* */
++ uint16_t reason_code;
++ struct sockaddr addr;
++};
++
++/* SIOCSIWPMKSA data */
++#define IW_PMKSA_ADD 1
++#define IW_PMKSA_REMOVE 2
++#define IW_PMKSA_FLUSH 3
++
++#define IW_PMKID_LEN 16
++
++struct iw_pmksa
++{
++ uint32_t cmd; /* IW_PMKSA_* */
++ struct sockaddr bssid;
++ uint8_t pmkid[IW_PMKID_LEN];
++};
++
++/* IWEVMICHAELMICFAILURE data */
++struct iw_michaelmicfailure
++{
++ uint32_t flags;
++ struct sockaddr src_addr;
++ uint8_t tsc[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */
++};
++
++/* IWEVPMKIDCAND data */
++#define IW_PMKID_CAND_PREAUTH 0x00000001 /* RNS pre-authentication enabled */
++struct iw_pmkid_cand
++{
++ uint32_t flags; /* IW_PMKID_CAND_* */
++ uint32_t index; /* the smaller the index, the higher the
++ * priority */
++ struct sockaddr bssid;
++};
++
++/* ------------------------ WIRELESS STATS ------------------------ */
++/*
++ * Wireless statistics (used for /proc/net/wireless)
++ */
++struct iw_statistics
++{
++ uint16_t status; /* Status
++ * - device dependent for now */
++
++ struct iw_quality qual; /* Quality of the link
++ * (instant/mean/max) */
++ struct iw_discarded discard; /* Packet discarded counts */
++ struct iw_missed miss; /* Packet missed counts */
++};
++
++/* ------------------------ IOCTL REQUEST ------------------------ */
++/*
++ * This structure defines the payload of an ioctl, and is used
++ * below.
++ *
++ * Note that this structure should fit on the memory footprint
++ * of iwreq (which is the same as ifreq), which mean a max size of
++ * 16 octets = 128 bits. Warning, pointers might be 64 bits wide...
++ * You should check this when increasing the structures defined
++ * above in this file...
++ */
++union iwreq_data
++{
++ /* Config - generic */
++ char name[16];
++ /* Name : used to verify the presence of wireless extensions.
++ * Name of the protocol/provider... */
++
++ struct iw_point essid; /* Extended network name */
++ struct iw_param nwid; /* network id (or domain - the cell) */
++ struct iw_freq freq; /* frequency or channel :
++ * 0-1000 = channel
++ * > 1000 = frequency in Hz */
++
++ struct iw_param sens; /* signal level threshold */
++ struct iw_param bitrate; /* default bit rate */
++ struct iw_param txpower; /* default transmit power */
++ struct iw_param rts; /* RTS threshold threshold */
++ struct iw_param frag; /* Fragmentation threshold */
++ uint32_t mode; /* Operation mode */
++ struct iw_param retry; /* Retry limits & lifetime */
++
++ struct iw_point encoding; /* Encoding stuff : tokens */
++ struct iw_param power; /* PM duration/timeout */
++ struct iw_quality qual; /* Quality part of statistics */
++
++ struct sockaddr ap_addr; /* Access point address */
++ struct sockaddr addr; /* Destination address (hw/mac) */
++
++ struct iw_param param; /* Other small parameters */
++ struct iw_point data; /* Other large parameters */
++};
++
++/*
++ * The structure to exchange data for ioctl.
++ * This structure is the same as 'struct ifreq', but (re)defined for
++ * convenience...
++ * Do I need to remind you about structure size (32 octets) ?
++ */
++struct iwreq
++{
++ union
++ {
++ char ifrn_name[16]; /* if name, e.g. "eth0" */
++ } ifr_ifrn;
++
++ /* Data part (defined just above) */
++ union iwreq_data u;
++};
++
++/* -------------------------- IOCTL DATA -------------------------- */
++/*
++ * For those ioctl which want to exchange mode data that what could
++ * fit in the above structure...
++ */
++
++/*
++ * Range of parameters
++ */
++
++struct iw_range
++{
++ /* Informative stuff (to choose between different interface) */
++ uint32_t throughput; /* To give an idea... */
++ /* In theory this value should be the maximum benchmarked
++ * TCP/IP throughput, because with most of these devices the
++ * bit rate is meaningless (overhead an co) to estimate how
++ * fast the connection will go and pick the fastest one.
++ * I suggest people to play with Netperf or any benchmark...
++ */
++
++ /* NWID (or domain id) */
++ uint32_t min_nwid; /* Minimal NWID we are able to set */
++ uint32_t max_nwid; /* Maximal NWID we are able to set */
++
++ /* Old Frequency (backward compat - moved lower ) */
++ uint16_t old_num_channels;
++ uint8_t old_num_frequency;
++
++ /* Wireless event capability bitmasks */
++ uint32_t event_capa[6];
++
++ /* signal level threshold range */
++ int32_t sensitivity;
++
++ /* Quality of link & SNR stuff */
++ /* Quality range (link, level, noise)
++ * If the quality is absolute, it will be in the range [0 ; max_qual],
++ * if the quality is dBm, it will be in the range [max_qual ; 0].
++ * Don't forget that we use 8 bit arithmetics... */
++ struct iw_quality max_qual; /* Quality of the link */
++ /* This should contain the average/typical values of the quality
++ * indicator. This should be the threshold between a "good" and
++ * a "bad" link (example : monitor going from green to orange).
++ * Currently, user space apps like quality monitors don't have any
++ * way to calibrate the measurement. With this, they can split
++ * the range between 0 and max_qual in different quality level
++ * (using a geometric subdivision centered on the average).
++ * I expect that people doing the user space apps will feedback
++ * us on which value we need to put in each driver... */
++ struct iw_quality avg_qual; /* Quality of the link */
++
++ /* Rates */
++ uint8_t num_bitrates; /* Number of entries in the list */
++ int32_t bitrate[IW_MAX_BITRATES]; /* list, in bps */
++
++ /* RTS threshold */
++ int32_t min_rts; /* Minimal RTS threshold */
++ int32_t max_rts; /* Maximal RTS threshold */
++
++ /* Frag threshold */
++ int32_t min_frag; /* Minimal frag threshold */
++ int32_t max_frag; /* Maximal frag threshold */
++
++ /* Power Management duration & timeout */
++ int32_t min_pmp; /* Minimal PM period */
++ int32_t max_pmp; /* Maximal PM period */
++ int32_t min_pmt; /* Minimal PM timeout */
++ int32_t max_pmt; /* Maximal PM timeout */
++ uint16_t pmp_flags; /* How to decode max/min PM period */
++ uint16_t pmt_flags; /* How to decode max/min PM timeout */
++ uint16_t pm_capa; /* What PM options are supported */
++
++ /* Encoder stuff */
++ uint16_t encoding_size[IW_MAX_ENCODING_SIZES]; /* Different token sizes */
++ uint8_t num_encoding_sizes; /* Number of entry in the list */
++ uint8_t max_encoding_tokens; /* Max number of tokens */
++ /* For drivers that need a "login/passwd" form */
++ uint8_t encoding_login_index; /* token index for login token */
++
++ /* Transmit power */
++ uint16_t txpower_capa; /* What options are supported */
++ uint8_t num_txpower; /* Number of entries in the list */
++ int32_t txpower[IW_MAX_TXPOWER]; /* list, in bps */
++
++ /* Wireless Extension version info */
++ uint8_t we_version_compiled; /* Must be WIRELESS_EXT */
++ uint8_t we_version_source; /* Last update of source */
++
++ /* Retry limits and lifetime */
++ uint16_t retry_capa; /* What retry options are supported */
++ uint16_t retry_flags; /* How to decode max/min retry limit */
++ uint16_t r_time_flags; /* How to decode max/min retry life */
++ int32_t min_retry; /* Minimal number of retries */
++ int32_t max_retry; /* Maximal number of retries */
++ int32_t min_r_time; /* Minimal retry lifetime */
++ int32_t max_r_time; /* Maximal retry lifetime */
++
++ /* Frequency */
++ uint16_t num_channels; /* Number of channels [0; num - 1] */
++ uint8_t num_frequency; /* Number of entry in the list */
++ struct iw_freq freq[IW_MAX_FREQUENCIES]; /* list */
++ /* Note : this frequency list doesn't need to fit channel numbers,
++ * because each entry contain its channel index */
++
++ uint32_t enc_capa; /* IW_ENC_CAPA_* bit field */
++
++ /* More power management stuff */
++ int32_t min_pms; /* Minimal PM saving */
++ int32_t max_pms; /* Maximal PM saving */
++ uint16_t pms_flags; /* How to decode max/min PM saving */
++
++ /* All available modulations for driver (hw may support less) */
++ int32_t modul_capa; /* IW_MODUL_* bit field */
++
++ /* More bitrate stuff */
++ uint32_t bitrate_capa; /* Types of bitrates supported */
++};
++
++/*
++ * Private ioctl interface information
++ */
++
++struct iw_priv_args
++{
++ uint32_t cmd; /* Number of the ioctl to issue */
++ uint16_t set_args; /* Type and number of args */
++ uint16_t get_args; /* Type and number of args */
++ char name[16]; /* Name of the extension */
++};
++
++/* ----------------------- WIRELESS EVENTS ----------------------- */
++/*
++ * Wireless events are carried through the rtnetlink socket to user
++ * space. They are encapsulated in the IFLA_WIRELESS field of
++ * a RTM_NEWLINK message.
++ */
++
++/*
++ * A Wireless Event. Contains basically the same data as the ioctl...
++ */
++struct iw_event
++{
++ uint16_t len; /* Real lenght of this stuff */
++ uint16_t cmd; /* Wireless IOCTL */
++ union iwreq_data u; /* IOCTL fixed payload */
++};
++
++/* Size of the Event prefix (including padding and alignement junk) */
++#define IW_EV_LCP_LEN (sizeof(struct iw_event) - sizeof(union iwreq_data))
++/* Size of the various events */
++#define IW_EV_CHAR_LEN (IW_EV_LCP_LEN + IFNAMSIZ)
++#define IW_EV_UINT_LEN (IW_EV_LCP_LEN + sizeof(uint32_t))
++#define IW_EV_FREQ_LEN (IW_EV_LCP_LEN + sizeof(struct iw_freq))
++#define IW_EV_PARAM_LEN (IW_EV_LCP_LEN + sizeof(struct iw_param))
++#define IW_EV_ADDR_LEN (IW_EV_LCP_LEN + sizeof(struct sockaddr))
++#define IW_EV_QUAL_LEN (IW_EV_LCP_LEN + sizeof(struct iw_quality))
++
++/* iw_point events are special. First, the payload (extra data) come at
++ * the end of the event, so they are bigger than IW_EV_POINT_LEN. Second,
++ * we omit the pointer, so start at an offset. */
++#define IW_EV_POINT_OFF (((char *) &(((struct iw_point *) NULL)->length)) - \
++ (char *) NULL)
++#define IW_EV_POINT_LEN (IW_EV_LCP_LEN + sizeof(struct iw_point) - \
++ IW_EV_POINT_OFF)
++
++/* Size of the Event prefix when packed in stream */
++#define IW_EV_LCP_PK_LEN (4)
++/* Size of the various events when packed in stream */
++#define IW_EV_CHAR_PK_LEN (IW_EV_LCP_PK_LEN + IFNAMSIZ)
++#define IW_EV_UINT_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(uint32_t))
++#define IW_EV_FREQ_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_freq))
++#define IW_EV_PARAM_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_param))
++#define IW_EV_ADDR_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr))
++#define IW_EV_QUAL_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality))
++#define IW_EV_POINT_PK_LEN (IW_EV_LCP_LEN + 4)
++
++#endif /* _LINUX_WIRELESS_H */
+diff --git a/feeds/luci/contrib/package/meshwizard/Makefile b/feeds/luci/contrib/package/meshwizard/Makefile
+new file mode 100644
+index 0000000..b4baab7
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/Makefile
+@@ -0,0 +1,39 @@
++# Copyright (C) 2011 Manuel Munz <freifunk at somakoma de>
++# This is free software, licensed under the Apache 2.0 license.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=meshwizard
++PKG_RELEASE:=0.3.1
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/meshwizard
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=9. Freifunk
++ TITLE:=Shell script based wizard for Mesh networks
++ DEPENDS:=+firewall
++endef
++
++define Package/meshwizard/description
++ A shellscript based wizard to simplify the setup of a typical mesh node (e.g. for Freifunk.net)
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/meshwizard/install
++ $(CP) ./files/* $(1)/
++endef
++
++$(eval $(call BuildPackage,meshwizard))
+diff --git a/feeds/luci/contrib/package/meshwizard/files/etc/config/meshwizard b/feeds/luci/contrib/package/meshwizard/files/etc/config/meshwizard
+new file mode 100644
+index 0000000..a60b0cc
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/etc/config/meshwizard
+@@ -0,0 +1,7 @@
++config 'netconfig' 'netconfig'
++
++config 'general' 'general'
++ option 'sharenet' '0'
++ option 'local_restrict' '1'
++ option 'cleanup' '1'
++
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/functions.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/functions.sh
+new file mode 100644
+index 0000000..b0f6cb2
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/functions.sh
+@@ -0,0 +1,118 @@
++uci_remove_list_element() {
++ local option="$1"
++ local value="$2"
++ local list="$(uci get $option)"
++ local elem
++
++ uci delete $option
++ for elem in $list; do
++ if [ "$elem" != "$value" ]; then
++ uci add_list $option=$elem
++ fi
++ done
++}
++
++# string_contains(string, substring)
++#
++# Returns 0 if the specified string contains the specified substring,
++# otherwise returns 1.
++string_contains() {
++ string="$1"
++ substring="$2"
++ if test "${string#*$substring}" != "$string"
++ then
++ return 0 # $substring is in $string
++ else
++ return 1 # $substring is not in $string
++ fi
++}
++
++# Takes 2 arguments
++# $1 = text to be displayed in the output for this section
++# $2 = section (optional)
++uci_commitverbose() {
++ echo "+ $1"
++ uci changes $2 | while read line; do
++ echo " $line"
++ done
++ uci commit $2
++}
++
++set_defaults() {
++ for def in $(env |grep "^$1" | sed 's/ /_/g'); do
++ option="${def/$1/}"
++ a="$(echo $option |cut -d '=' -f1)"
++ b="$(echo $option |cut -d '=' -f2-)"
++ b="${b//_/ }"
++ string_contains "$a" "_LENGTH" && continue
++ string_contains "$a" "_ITEM" && {
++ # special threatment for lists. use add_list and remove the
++ # item index (_ITEMx).
++ uci add_list $2.${a//_ITEM[0-9]*/}="$b"
++ } || {
++ uci set $2.$a="$b"
++ }
++ done
++}
++
++# 3 arguments: 1=config name 2=oldname 3=newname
++section_rename() {
++ uci -q rename $1.$2=$3 && msg_rename $1.$2 $1.$3 || msg_rename_error $1.$2 $1.$3
++}
++
++msg_missing_value() {
++ echo -e " \033[1mWarning:\033[0m Configuration option for $2 is missing in $1."
++}
++
++msg_success() {
++ echo " Finished."
++}
++
++msg_error() {
++ echo " \033[1mError: \033[0mThere was a problem."
++}
++
++msg_rename() {
++ echo " Renamed unnamed section $1 to $2."
++}
++
++msg_rename_error() {
++ echo " \033[1mWarning:\033[0m Could not rename $1 to $2."
++}
++
++
++restore_factory_defaults() {
++ echo "+ Restore default config as requested with cleanup=1"
++ cp -f /rom/etc/config/* /etc/config/
++ rm /etc/config/wireless
++ wifi detect > /etc/config/wireless
++ rm /etc/config/network
++ if [ -f /etc/init.d/defconfig ]; then
++ # legacy (AA)
++ /etc/init.d/defconfig start
++ [ -f /rom/etc/uci-defaults/network ] && sh /rom/etc/uci-defaults/network
++ else
++ sh /rom/etc/uci-defaults/02_network
++ fi
++}
++
++is_in_list() {
++ # checks if an item is in a list
++ local list="$1"
++ local item="$2"
++ for word in $list; do
++ [ $word = "$item" ] && return 0
++ done
++ return 1
++}
++
++add_to_list() {
++ local list="$1"
++ local item="$2"
++ is_in_list "$list" "$item" && echo $list
++ if [ -z "$list" ]; then
++ echo "$item"
++ else
++ echo "$list $item"
++ fi
++}
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/check-range-in-range.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/check-range-in-range.sh
+new file mode 100755
+index 0000000..c889c55
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/check-range-in-range.sh
+@@ -0,0 +1,31 @@
++#!/bin/sh
++# Checks whether a netrange is inside another netrange, returns 1 if true
++# Takes two arguments: $1: net from which we want to know if it is inside $2
++# nets need to be given in CIDR notation
++
++dir=$(dirname $0)
++
++awk -f $dir/common.awk -f - $* <<EOF
++BEGIN {
++
++ slpos=index(ARGV[1],"/")
++ ipaddr=ip2int(substr(ARGV[1],0,slpos-1))
++ netmask=compl(2**(32-int(substr(ARGV[1],slpos+1)))-1)
++ network=and(ipaddr,netmask)
++ broadcast=or(network,compl(netmask))
++
++ slpos2=index(ARGV[2],"/")
++ ipaddr2=ip2int(substr(ARGV[2],0,slpos2-1))
++ netmask2=compl(2**(32-int(substr(ARGV[2],slpos2+1)))-1)
++ network2=and(ipaddr2,netmask2)
++ broadcast2=or(network2,compl(netmask2))
++
++ if (network >= network2) {
++ if (network <= broadcast2) {
++ if (broadcast <= broadcast2) {
++ print "1"
++ }
++ }
++ }
++}
++EOF
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/common.awk b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/common.awk
+new file mode 100644
+index 0000000..5b03d06
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/common.awk
+@@ -0,0 +1,20 @@
++function bitcount(c) {
++ c=and(rshift(c, 1),0x55555555)+and(c,0x55555555)
++ c=and(rshift(c, 2),0x33333333)+and(c,0x33333333)
++ c=and(rshift(c, 4),0x0f0f0f0f)+and(c,0x0f0f0f0f)
++ c=and(rshift(c, 8),0x00ff00ff)+and(c,0x00ff00ff)
++ c=and(rshift(c,16),0x0000ffff)+and(c,0x0000ffff)
++ return c
++}
++
++function ip2int(ip) {
++ for (ret=0,n=split(ip,a,"\."),x=1;x<=n;x++) ret=or(lshift(ret,8),a[x])
++ return ret
++}
++
++function int2ip(ip,ret,x) {
++ ret=and(ip,255)
++ ip=rshift(ip,8)
++ for(;x<3;ret=and(ip,255)"."ret,ip=rshift(ip,8),x++);
++ return ret
++}
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_auto-ipv6-dhcpv6-ip.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_auto-ipv6-dhcpv6-ip.sh
+new file mode 100755
+index 0000000..ca623db
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_auto-ipv6-dhcpv6-ip.sh
+@@ -0,0 +1,16 @@
++#!/bin/sh
++netrenamed=$1
++
++local PREFIX="$(echo $ipv6_prefix| cut -d "/" -f 1| sed 's/::/:/')"
++
++# Get the devices mac address
++local device="$(uci -p/var/state -q get network.$1.ifname)"
++if [ -n "$device" ]; then
++ local MAC="$(ifconfig $netrenamed |grep HWaddr | awk '{ print $5 '})"
++else
++ local MAC="$(cat /sys/class/net/$1/address)"
++ local IPV6_UNIQ="$(echo $MAC | awk -F: '{ print $1$2":"$3$4":"$5$6 }')"
++fi
++
++echo "${PREFIX}${IPV6_UNIQ}:1"
++
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_bssid.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_bssid.sh
+new file mode 100755
+index 0000000..efe101f
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_bssid.sh
+@@ -0,0 +1,36 @@
++#!/bin/sh
++# create essid from channel, takes two args:
++# $1 = channel (integer)
++# $2 = community (optional)
++channel=$1
++community=$2
++
++. /lib/functions.sh
++
++
++# Try to get BSSID from profile first
++config_load profile_$community
++config_get bssid bssidscheme $channel
++if [ -z "$bssid" ]; then
++ config_get bssid bssidscheme "all"
++fi
++
++if [ -z "$bssid" ]; then
++ case $channel in
++ [1-9])
++ bssid="$(printf "%X\n" $channel)2:CA:FF:EE:BA:BE"
++ ;;
++ 1[0-4])
++ bssid="$(printf "%X\n" $channel)2:CA:FF:EE:BA:BE"
++ ;;
++ [3-9][0-9])
++ bssid="02:$channel:CA:FF:EE:EE"
++ ;;
++ 1[0-9][0-9])
++ bssid="${channel/1/12:}:CA:FF:EE:EE"
++ ;;
++ *) bssid="02:CA:FF:EE:BA:BE"
++ ;;
++ esac
++fi
++echo $bssid
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_dhcp_ip.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_dhcp_ip.sh
+new file mode 100755
+index 0000000..e559166
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_dhcp_ip.sh
+@@ -0,0 +1,6 @@
++#!/bin/sh
++# generates a dhcp-ip and netrange from a given ip/subnet
++# takes 2 arguments:
++# $1: Ip Address (of the Interface for which we want to generate an ip)
++
++echo "$1" | awk 'BEGIN { FS = "." } ; { print "6."$3"."$4".1" }'
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/initial_config.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/initial_config.sh
+new file mode 100755
+index 0000000..c1e5522
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/initial_config.sh
+@@ -0,0 +1,42 @@
++#!/bin/sh
++# This is only run once (usually after flashing an image from the imagebuilder)
++# It sets up the initial config for this node.
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++config_load system
++
++# Rename system config
++handle_system() {
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename system $1 system
++ fi
++}
++config_foreach handle_system system
++
++if [ -n "$(uci -q get meshwizard.community)" ]; then
++ set_defaults "community_" freifunk.community
++ uci -q delete meshwizard.community
++fi
++
++[ -n "$profile_homepage" ] && uci set freifunk.community.homepage="$profile_homepage"
++
++[ -n "$profile_mapserver" ] && {
++ uci -q delete freifunk.community.mapserver
++ for m in $profile_mapserver; do
++ uci add_list freifunk.community.mapserver="$m"
++ done
++}
++
++uci_commitverbose "Setup community" freifunk
++
++if [ -n "$(uci -q get meshwizard.contact)" ]; then
++ set_defaults "contact_" freifunk.contact
++ uci -q delete meshwizard.contact && uci_commitverbose "Setup contact" freifunk
++fi
++
++if [ "$has_luci" == TRUE ]; then
++ set_defaults "luci_main_" luci.main
++ uci -q delete meshwizard.luci_main && uci_commitverbose "Setup luci" luci
++fi
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/ipcalc-cidr.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/ipcalc-cidr.sh
+new file mode 100755
+index 0000000..6d7a1fb
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/ipcalc-cidr.sh
+@@ -0,0 +1,42 @@
++#!/bin/sh
++dir=$(dirname $0)
++awk -f $dir/common.awk -f - $* <<EOF
++BEGIN {
++ slpos=index(ARGV[1],"/")
++ if (slpos == 0) {
++ ipaddr=ip2int(ARGV[1])
++ netmask=ip2int(ARGV[2])
++ } else {
++ ipaddr=ip2int(substr(ARGV[1],0,slpos-1))
++ netmask=compl(2**(32-int(substr(ARGV[1],slpos+1)))-1)
++ ARGV[4]=ARGV[3]
++ ARGV[3]=ARGV[2]
++ }
++
++ network=and(ipaddr,netmask)
++ broadcast=or(network,compl(netmask))
++
++ start=or(network,and(ip2int(ARGV[3]),compl(netmask)))
++ limit=network+1
++ if (start<limit) start=limit
++
++ end=start+ARGV[4]
++ limit=or(network,compl(netmask))-1
++ if (end>limit) end=limit
++
++ print "IP="int2ip(ipaddr)
++ print "NETMASK="int2ip(netmask)
++ print "BROADCAST="int2ip(broadcast)
++ print "NETWORK="int2ip(network)
++ print "NEXTNET="int2ip(broadcast + 1)
++ print "PREFIX="32-bitcount(compl(netmask))
++
++ # range calculations:
++ # ipcalc <ip> <netmask> <start> <num>
++
++ if (ARGC > 3) {
++ print "START="int2ip(start)
++ print "END="int2ip(end)
++ }
++}
++EOF
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/read_defaults.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/read_defaults.sh
+new file mode 100755
+index 0000000..b6ffb62
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/read_defaults.sh
+@@ -0,0 +1,61 @@
++#!/bin/sh
++# These functions read the settings we need for configuration of the router
++
++read_defaults() {
++ # read default values from the 3 relevant config files and export them
++ # into the environment. Later loaded configs overwrite earlier ones. The
++ # The ordering here is from most generic to most specific:
++ # freifunk (most generic defaults)
++ # profile_* (community defaults)
++ # nodes custom config from meshwizard config file
++
++ local community="$1"
++
++ config_cb() {
++ local type="$1"
++ local name="$2"
++ local allowed_section_types="widget"
++ local allowed_section_names="
++ system
++ wifi_device
++ wifi_iface
++ interface
++ alias
++ dhcp
++ olsr_interface
++ olsr_interfacedefaults
++ profile
++ zone_freifunk
++ include
++ luci_splash
++ ipv6
++ luci_main
++ contact
++ community
++ wan
++ lan
++ general
++ ipv6
++ qos
++ "
++
++ if [ "$type" = "widget" ]; then
++ widgets=$(add_to_list "$widgets" "$name")
++ fi
++
++ if ([ -n "$name" ] && is_in_list "$allowed_section_names" $name) \
++ || is_in_list "$allowed_section_types" $type ; then
++ option_cb() {
++ local option="$1"
++ local value="$2"
++ export "${CONFIG_SECTION}_${option}"="$value"
++ }
++ else
++ option_cb() { return; }
++ fi
++ }
++ config_load freifunk
++ config_load profile_${community}
++ config_load meshwizard
++ export widgets="$widgets"
++}
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/rename-wifi.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/rename-wifi.sh
+new file mode 100755
+index 0000000..e9139ed
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/rename-wifi.sh
+@@ -0,0 +1,46 @@
++#!/bin/sh
++# This script renames IB_wifi_ interface names into real interface names used on this system.
++# E.g. wireless.IB_wifi0 would become wireless.wifi0 on madwifi and wireless.radio0 on mac80211
++
++. $dir/functions.sh
++
++posIB=-1
++
++IBwifis="$(uci show meshwizard.netconfig | grep 'IB_' | sed 's/meshwizard.netconfig\.\(IB_wifi.*\)_.*/\1/' |uniq)"
++[ -z "$(echo $IBwifis |grep IB_wifi)" ] && exit
++
++for w in $IBwifis; do
++ posIB=$(( $posIB + 1 ))
++ export IB_wifi$posIB="$w"
++done
++
++pos=0
++syswifis="$(uci show wireless |grep wifi-device | sed 's/wireless\.\(.*\)=.*/\1/' |uniq)"
++
++for s in $syswifis; do
++ export syswifi$pos="$s"
++ pos=$(( $pos + 1 ))
++done
++
++for i in `seq 0 $posIB`; do
++ IBwifi=$(eval echo \$IB_wifi$i)
++ syswifi=$(eval echo \$syswifi$i)
++
++ if [ -n "$syswifi" ]; then
++ case $IBwifi in
++ IB_wifi* )
++ # replace IB_wifi_* with actual wifi interface names, delete old ones first
++ uci show meshwizard.netconfig | grep $IBwifi | while read line; do
++ oldline=$(echo $line | cut -d "=" -f 1)
++ uci set $oldline=""
++ newline=$(echo $line |sed -e "s/$IBwifi/$syswifi/g" -e "s/'//g")
++ uci set $newline
++ done
++ ;;
++ esac
++ unset IBwifi
++ unset syswifi
++ fi
++done
++
++uci_commitverbose "Renaming wifi-devices in /etc/config/meshwizard" meshwizard
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6-interface.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6-interface.sh
+new file mode 100755
+index 0000000..adf3429
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6-interface.sh
+@@ -0,0 +1,12 @@
++#!/bin/sh
++
++net=$1
++. $dir/functions.sh
++
++ra="$(uci -q get meshwizard.netconfig.${net}_ipv6ra)"
++uci set autoipv6.${netrenamed}="interface"
++if [ -n "$ra" ]; then
++ uci set autoipv6.${netrenamed}.ra=1
++fi
++
++uci_commitverbose "Setup auto-ipv6 for interface $netrenamed" autoipv6
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6.sh
+new file mode 100755
+index 0000000..8e3f015
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6.sh
+@@ -0,0 +1,17 @@
++#!/bin/sh
++
++. $dir/functions.sh
++
++if [ "$ipv6_config" = "auto-ipv6-fromv4" ]; then
++ mode="fromv4"
++else
++ mode="random"
++fi
++
++uci set autoipv6.olsr_node.enabled=1
++uci set autoipv6.olsr_node.mode="$mode"
++uci_commitverbose "Setup auto-ipv6" autoipv6
++
++uci set network.wan.accept_ra=0
++uci_commitverbose "Do not accept ra's on wan when using auto-ipv6" network
++
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dhcp.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dhcp.sh
+new file mode 100755
+index 0000000..8cce831
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dhcp.sh
+@@ -0,0 +1,46 @@
++#!/bin/sh
++# Sets up the dhcp part of dnsmasq
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++net="$1"
++vap="$(uci -q get meshwizard.netconfig.${net}_vap)"
++
++handle_dnsmasq() {
++ config_get interface "$1" interface
++ if [ "$interface" == "${netrenamed}dhcp" ]; then
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename dhcp $1 ${netrenamed}dhcp
++ fi
++ fi
++}
++config_load dhcp
++config_foreach handle_dnsmasq dhcp
++
++[ "$net" == "lan" ] && uci -q delete dhcp.lan
++
++if [ "$supports_vap" = 1 -a "$vap" = 1 ]; then
++ uci batch <<- EOF
++ set dhcp.${netrenamed}dhcp="dhcp"
++ set dhcp.${netrenamed}dhcp.ignore="0"
++ set dhcp.${netrenamed}dhcp.interface="${netrenamed}dhcp"
++ EOF
++ set_defaults "dhcp_" dhcp.${netrenamed}dhcp
++fi
++
++ahdhcp_when_vap="$(uci get profile_$community.profile.adhoc_dhcp_when_vap)"
++if [ "$supports_vap" = 0 ] || \
++ [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ] || \
++ [ "$lan_is_olsr" = "1" -a "$lan_dhcp" = 1 ]; then
++ uci batch <<- EOF
++ set dhcp.${netrenamed}ahdhcp="dhcp"
++ set dhcp.${netrenamed}ahdhcp.ignore="0"
++ set dhcp.${netrenamed}ahdhcp.interface="${netrenamed}ahdhcp"
++ EOF
++fi
++set_defaults "dhcp_" dhcp.${netrenamed}ahdhcp
++
++uci_commitverbose "Setup DHCP for $netrenamed" dhcp
++
++
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dnsmasq.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dnsmasq.sh
+new file mode 100755
+index 0000000..9297f91
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dnsmasq.sh
+@@ -0,0 +1,29 @@
++#!/bin/sh
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++# Set dnsmasq config
++handle_dhcp() {
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename dhcp $1 dnsmasq
++ fi
++}
++
++config_load dhcp
++config_foreach handle_dhcp dnsmasq
++
++uci batch << EOF
++ set dhcp.dnsmasq.local="/$profile_suffix/"
++ set dhcp.dnsmasq.domain="$profile_suffix"
++EOF
++
++config_get addnhosts dnsmasq addnhosts
++if [ -z "${addnhosts/\var\/etc\/hosts.olsr/}" ]; then
++ uci add_list dhcp.dnsmasq.addnhosts="/var/etc/hosts.olsr"
++ if [ "$ipv6_enabled" = 1 ]; then
++ uci add_list dhcp.dnsmasq.addnhosts="/var/etc/hosts.olsr.ipv6"
++ fi
++fi
++
++uci_commitverbose "Setup dnsmasq" dhcp
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall.sh
+new file mode 100755
+index 0000000..154b2b6
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall.sh
+@@ -0,0 +1,145 @@
++#!/bin/sh
++# Add "freifunk" firewall zone
++# If wan/lan is used for olsr then remove these networks from wan/lan zones
++# Also setup rules defined in /etc/config/freifunk and /etc/config/profile_<community>
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++wan_is_olsr=$(uci -q get meshwizard.netconfig.wan_config)
++
++config_load firewall
++
++# Rename firewall zone for freifunk if unnamed
++# If wan is used for olsr then set network for the firewall zone wan to ' ' to remove the wan interface from it, else add local restrict to it
++# If lan is used for olsr then set network for the firewall zone lan to ' ' to remove the lan interface from it
++
++handle_fwzone() {
++ config_get name "$1" name
++ config_get network "$1" network
++
++ if [ "$name" == "freifunk" ]; then
++ # rename section if unnamed
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename firewall $1 zone_freifunk
++ fi
++ fi
++
++ if [ "$name" == "wan" ]; then
++ if [ "$wan_is_olsr" == 1 ]; then
++ uci set firewall.$1.network=' ' && uci_commitverbose "WAN is used for olsr, removed the wan interface from zone wan" firewall
++ else
++ uci set firewall.$1.local_restrict=1 && uci_commitverbose "Enable local_restrict for zone wan" firewall
++ fi
++ fi
++
++ if [ "$name" == "lan" ] && [ "$lan_is_olsr" == "1" ]; then
++ uci set firewall.$1.network=' ' && uci_commitverbose "LAN is used for olsr, removed the lan interface from zone lan" firewall
++ fi
++}
++
++config_foreach handle_fwzone zone
++
++uci batch << EOF
++ set firewall.zone_freifunk="zone"
++ set firewall.zone_freifunk.name="freifunk"
++ set firewall.zone_freifunk.input="$zone_freifunk_input"
++ set firewall.zone_freifunk.forward="$zone_freifunk_forward"
++ set firewall.zone_freifunk.output="$zone_freifunk_output"
++EOF
++
++uci_commitverbose "Setup firewall zones" firewall
++
++# Usually we need to setup masquerading for lan, except lan is an olsr interface or has an olsr hna-entry
++
++handle_interface() {
++ config_get interface "$1" interface
++ if [ "$interface" == "lan" ]; then
++ no_masq_lan=1
++ fi
++}
++config_load olsrd
++config_foreach handle_interface Interface
++
++LANIP="$(uci -q get network.lan.ipaddr)"
++if [ -n "$LANIP" ]; then
++ handle_hna() {
++ config_get netaddr "$1" netaddr
++ if [ "$LANIP" == "$netaddr" ]; then
++ no_masq_lan=1
++ fi
++ }
++ config_foreach handle_hna Hna4
++fi
++
++currms=$(uci -q get firewall.zone_freifunk.masq_src)
++if [ ! "$no_masq_lan" == "1" ] && [ ! "$(uci -q get meshwizard.netconfig.lan_config)" == 1 ]; then
++ uci set firewall.zone_freifunk.masq="1"
++ [ -z "$(echo $currms |grep lan)" ] && uci add_list firewall.zone_freifunk.masq_src="lan"
++fi
++
++
++# Rules, Forwardings, advanced config and includes from freifunk and
++# profile_$community config files.
++
++add_fw_rules() {
++ config_cb() {
++ local type="$1"
++ local name="$2"
++ local allowed_section_types="advanced include fw_rule fw_forwarding"
++ if is_in_list "$allowed_section_types" $type ; then
++ uci set firewall.${name}="${type/fw_/}"
++ option_cb() {
++ local option="$1"
++ local value="$2"
++ uci set firewall.${CONFIG_SECTION}.${option}="$value"
++ }
++ else
++ option_cb() { return; }
++ fi
++ }
++ config_load freifunk
++ config_load profile_${community}
++}
++add_fw_rules
++
++
++# If we use auto-ipv6-dhcp then allow 547/udp on the freifunk zone
++if [ "$ipv6_config" = "auto-ipv6-dhcpv6" ]; then
++ uci batch <<- EOF
++ set firewall.dhcpv6=rule
++ set firewall.dhcpv6.src=freifunk
++ set firewall.dhcpv6.target=ACCEPT
++ set firewall.dhcpv6.dest_port=547
++ set firewall.dhcpv6.proto=udp
++ EOF
++fi
++
++# Firewall rules to allow incoming ssh and web if enabled
++
++if [ "$wan_allowssh" == 1 ]; then
++ uci batch <<- EOF
++ set firewall.wanssh=rule
++ set firewall.wanssh.src=wan
++ set firewall.wanssh.target=ACCEPT
++ set firewall.wanssh.proto=tcp
++ set firewall.wanssh.dest_port=22
++ EOF
++fi
++
++if [ "$wan_allowweb" == 1 ]; then
++ uci batch <<- EOF
++ set firewall.wanweb=rule
++ set firewall.wanweb.src=wan
++ set firewall.wanweb.target=ACCEPT
++ set firewall.wanweb.proto=tcp
++ set firewall.wanweb.dest_port=80
++ set firewall.wanwebhttps=rule
++ set firewall.wanwebhttps.src=wan
++ set firewall.wanwebhttps.target=ACCEPT
++ set firewall.wanwebhttps.proto=tcp
++ set firewall.wanwebhttps.dest_port=443
++ EOF
++fi
++
++uci_commitverbose "Setup rules, forwardings, advanced config and includes." firewall
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall_interface.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall_interface.sh
+new file mode 100755
+index 0000000..8ca5d3b
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall_interface.sh
+@@ -0,0 +1,111 @@
++#!/bin/sh
++# This will add $net to the zone firewall (and remove it from other zones where it is referenced)
++# It will also setup rules defined in /etc/config/freifunk and /etc/config/profile_<community>
++# Arg $1 = $net
++
++net=$1
++. /lib/functions.sh
++. $dir/functions.sh
++config_load firewall
++
++# Get some variables
++type="$(uci -q get wireless.$net.type)"
++vap="$(uci -q get meshwizard.netconfig.$net\_vap)"
++wan_is_olsr=$(uci -q get meshwizard.netconfig.wan_config)
++
++# Delete old firewall zone for freifunk
++handle_fwzone() {
++ config_get name "$1" name
++ config_get network "$1" network
++
++ if [ "$2" == "zoneconf" ]; then
++ if [ "$name" == "freifunk" ]; then
++ # rename section if unnamed
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename firewall $1 zone_freifunk
++ fi
++ else
++ if [ ! "$name" == "freifunk" ] && [ -n "$netrenamed" -a -n "$(echo $network | grep $netrenamed)" ]; then
++ echo " Removed $netrenamed from firewall zone $name."
++ network_new=$(echo $network | sed -e 's/'$netrenamed'//' -e 's/^ //' -e 's/ / /' -e 's/ $//')
++ uci set firewall.$1.network="$network_new"
++ fi
++ fi
++ fi
++}
++
++config_foreach handle_fwzone zone zoneconf
++
++# Add $netrenamed and if needed ${netrenamed}dhcp to the "freifunk" zone
++config_get network zone_freifunk network
++
++# remove ${netrenamed}dhcp from networks list
++[ -n "$network" -a -n "$net" ] && network="${network/${netrenamed}dhcp/}"
++network=$(echo $network) # Removes leading and trailing whitespaces
++
++[ -n "$netrenamed" ] && [ -z "$(echo $network | grep $netrenamed)" ] && network="$network $netrenamed"
++
++if [ "$supports_vap" == "1" -a "$vap" == 1 ]; then
++ [ -n "$netrenamed" ] && [ "$network" == "${network/${netrenamed}dhcp/}" ] && network="$network ${netrenamed}dhcp"
++fi
++
++uci set firewall.zone_freifunk.network="$network"
++
++uci_commitverbose "Add '$netrenamed' to freifunk firewall zone" firewall
++
++currms=$(uci -q get firewall.zone_freifunk.masq_src)
++
++# If interfaces are outside of the mesh network they should be natted
++
++if [ "$vap" == 1 ]; then
++ # Get dhcprange and meshnet for the dhcp interface
++ if_ip="$(uci -q get network.${netrenamed}dhcp.ipaddr)"
++ if_mask="$(uci -q get network.${netrenamed}dhcp.netmask)"
++
++ [ -n "$if_ip" -a "$if_mask" ] && export $(ipcalc.sh $if_ip $if_mask)
++ [ -n "$NETWORK" -a "$PREFIX" ] && dhcprange="$NETWORK/$PREFIX"
++
++ if [ -n "$dhcprange" ]; then
++ meshnet="$(uci get profile_$community.profile.mesh_network)"
++ # check if the dhcprange is inside meshnet
++ dhcpinmesh="$($dir/helpers/check-range-in-range.sh $dhcprange $meshnet)"
++ if [ "$dhcpinmesh" == 1 ]; then
++ # needed or splash will not work
++ if [ "$has_luci_splash" == TRUE ]; then
++ uci set firewall.zone_freifunk.contrack="1"
++ fi
++ else
++ uci set firewall.zone_freifunk.masq=1
++ [ -z "$(echo $currms |grep ${netrenamed}dhcp)" ] && uci add_list firewall.zone_freifunk.masq_src="${netrenamed}dhcp"
++ fi
++ fi
++fi
++
++# Get dhcprange and meshnet for the adhoc dhcp interface
++if_ip="$(uci -q get network.${netrenamed}ahdhcp.ipaddr)"
++if_mask="$(uci -q get network.${netrenamed}ahdhcp.netmask)"
++
++[ -n "$if_ip" -a "$if_mask" ] && export $(ipcalc.sh $if_ip $if_mask)
++[ -n "$NETWORK" -a "$PREFIX" ] && dhcprangeah="$NETWORK/$PREFIX"
++
++if [ -n "$dhcprangeah" ]; then
++ meshnet="$(uci get profile_$community.profile.mesh_network)"
++ # check if the dhcprange is inside meshnet
++ dhcpinmesh="$($dir/helpers/check-range-in-range.sh $dhcprangeah $meshnet)"
++ if [ "$dhcpinmesh" == 1 ]; then
++ # needed or splash will not work
++ if [ "$has_luci_splash" == TRUE ]; then
++ uci set firewall.zone_freifunk.contrack="1"
++ fi
++ else
++ uci set firewall.zone_freifunk.masq=1
++ [ -z "$(echo $currms |grep ${netrenamed}ahdhcp)" ] && uci add_list firewall.zone_freifunk.masq_src="${netrenamed}ahdhcp"
++ fi
++fi
++
++
++for i in IP NETMASK BROADCAST NETWORK PREFIX; do
++ unset $i
++done
++
++uci_commitverbose "Setup masquerading rules for '$netrenamed'" firewall
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_ipv6.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_ipv6.sh
+new file mode 100755
+index 0000000..2f6144b
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_ipv6.sh
+@@ -0,0 +1,20 @@
++#!/bin/sh
++
++[ ! "$(uci -q get network.lan)" == "interface" ] && exit
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++# Setup IPv6 for the lan interface
++
++local ip6addr=""
++if [ "$ipv6_config" = "auto-ipv6-dhcpv6" ]; then
++ # get lan mac
++ local device="$(uci -p/var/state -q get network.lan.ifname)"
++ if [ -n "device" ]; then
++ ip6addr="$($dir/helpers/gen_auto-ipv6-dhcpv6-ip.sh $device)"
++ fi
++ uci set network.lan.ip6addr="${ip6addr}/112"
++fi
++
++uci_commitverbose "Setup ipv6 address for lan" network
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_static.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_static.sh
+new file mode 100755
+index 0000000..172dcf1
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_static.sh
+@@ -0,0 +1,17 @@
++#!/bin/sh
++# Setup static interface settings for lan if lan is not an olsr interface
++
++[ ! "$(uci -q get network.lan)" == "interface" ] && exit
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++uci batch << EOF
++ set network.lan.proto='$lan_proto'
++ set network.lan.ipaddr='$lan_ip4addr'
++ set network.lan.netmask='$lan_netmask'
++EOF
++
++uci_commitverbose "Setup static ip settings for lan" network
++
++uci delete meshwizard.lan && uci commit meshwizard
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_network.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_network.sh
+new file mode 100755
+index 0000000..7035e7f
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_network.sh
+@@ -0,0 +1,145 @@
++# setup entry in /etc/config/network for a interface
++# Argument $1: network interface
++
++net="$1"
++. /lib/functions.sh
++. $dir/functions.sh
++
++# Setup a (new) interface section for $net
++
++ipaddr=$(uci -q get meshwizard.netconfig.$net\_ip4addr)
++ip6addr=$(uci -q get meshwizard.netconfig.$net\_ip6addr)
++[ -z "$ipaddr" ] && msg_missing_value meshwizard $net\_ip4addr
++
++netmask=$(uci -q get meshwizard.netconfig.$net\_netmask)
++[ -z "$netmask" ] && netmask="$interface_netmask"
++[ -z "$netmask" ] && netmask="255.255.0.0"
++
++uci set network.$netrenamed="interface"
++set_defaults "interface_" network.$netrenamed
++
++uci batch << EOF
++ set network.$netrenamed.proto="static"
++ set network.$netrenamed.ipaddr="$ipaddr"
++ set network.$netrenamed.netmask="$netmask"
++EOF
++
++if [ "$netrenamed" = "lan" ]; then
++ # remove the bridge if the interface is used for olsr
++ # since this script is only run in this case, no need
++ # to check for lan_proto = "olsr" currently.
++ uci -q delete network.lan.type
++fi
++
++# Setup IPv6 for the interface
++local ip6addr
++if [ "$ipv6_enabled" = 1 ]; then
++ if [ "$ipv6_config" = "auto-ipv6-dhcpv6" ]; then
++ ip6addr="$($dir/helpers/gen_auto-ipv6-dhcpv6-ip.sh $netrenamed)"
++ uci set network.$netrenamed.ip6addr="${ip6addr}/112"
++ fi
++ if [ "$ipv6_config" = "static" ] && [ -n "$ip6addr" ]; then
++ uci set network.$netrenamed.ip6addr="$ip6addr"
++ fi
++fi
++
++uci_commitverbose "Setup interface $netrenamed" network
++
++# setup dhcp alias/interface
++
++net_dhcp=$(uci -q get meshwizard.netconfig.${net}_dhcp)
++if [ "$net_dhcp" == 1 ]; then
++
++ # Load meshwizard_settings
++ dhcprange="$(uci -q get meshwizard.netconfig.${net}_dhcprange)"
++ interface_ip="$(uci -q get meshwizard.netconfig.${net}_ip4addr)"
++ vap=$(uci -q get meshwizard.netconfig.${net}_vap)
++
++ # Rename config
++ handle_dhcpalias() {
++ config_get interface "$1" interface
++ if [ "$interface" == "$netrenamed" ]; then
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename network $1 ${netrenamed}dhcp
++ fi
++ fi
++ }
++ config_load network
++ config_foreach handle_dhcpalias interface
++
++ # Get IP/netmask and start-ip for $net dhcp
++ # If no dhcprange is given in /etc/config/meshwizard we autogenerate one
++
++ if [ -z "$dhcprange" ]; then
++ dhcprange="$($dir/helpers/gen_dhcp_ip.sh $interface_ip)/24"
++ uci set meshwizard.netconfig.${net}_dhcprange="$dhcprange"
++ fi
++
++ # If we use VAP and also offer dhcp on the adhoc interface then cut the dhcp
++ # range in two halves. one for the adhoc, one for the managed VAP interface
++ ahdhcp_when_vap="$(uci get profile_$community.profile.adhoc_dhcp_when_vap)"
++
++ if [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ]; then
++ # VAPs are enabled for this interface, supported and we want to
++ # also use DHCP on the adhoc interface
++ local network
++ local mask
++ network=${dhcprange%%/*}
++ mask=${dhcprange##*/}
++ # Divide network size by adding 1 to the netmask
++ mask=$(($mask + 1))
++ # Get first ip and netmask for the adhoc dhcp network
++ eval $(sh $dir/helpers/ipcalc-cidr.sh ${network}/${mask} 1 0)
++ STARTADHOC=$START
++ NETMASKADHOC=$NETMASK
++ # Get first ip and netmask for the managed dhcp network
++ eval $(sh $dir/helpers/ipcalc-cidr.sh ${NEXTNET}/${mask} 1 0)
++ STARTVAP=$START
++ NETMASKVAP=$NETMASK
++ # Add dhcp interface
++ uci batch <<- EOF
++ set network.${netrenamed}dhcp=interface
++ set network.${netrenamed}dhcp.proto=static
++ set network.${netrenamed}dhcp.ipaddr="$STARTVAP"
++ set network.${netrenamed}dhcp.netmask="$NETMASKVAP"
++ EOF
++ uci_commitverbose "Setup interface for ${netrenamed}dhcp" network
++ else
++ eval $(sh $dir/helpers/ipcalc-cidr.sh $dhcprange 1 0)
++ STARTADHOC=$START
++ NETMASKADHOC=$NETMASK
++ fi
++ if [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" != 1 ]; then
++ # vaps are enabled and supported and we do not use DHCP on adhoc
++ # Add dhcp interface
++ uci batch <<- EOF
++ set network.${netrenamed}dhcp=interface
++ set network.${netrenamed}dhcp.proto=static
++ set network.${netrenamed}dhcp.ipaddr="$STARTADHOC"
++ set network.${netrenamed}dhcp.netmask="$NETMASKADHOC"
++ EOF
++ uci_commitverbose "Setup interface for ${netrenamed}dhcp" network
++ fi
++
++
++ # Setup alias for $net adhoc interface
++ if [ "$supports_vap" = 0 ] || \
++ [ "$vap" = 0 ] || \
++ [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ] || \
++ [ "$lan_is_olsr" = "1" ]; then
++ # setup an alias interface for the main interface to use as a network for clients
++ # when one of the following conditions is met
++ # * vaps are not supported
++ # * or not enabled
++ # * or they are supported and enabled but we also want to use DHCP on the adhoc interface
++ # * or this is the lan interface and it is used for olsrd (and dhcp is enabled)
++ uci batch <<- EOF
++ set network.${netrenamed}ahdhcp=interface
++ set network.${netrenamed}ahdhcp.ifname="@${netrenamed}"
++ set network.${netrenamed}ahdhcp.proto=static
++ set network.${netrenamed}ahdhcp.ipaddr="$STARTADHOC"
++ set network.${netrenamed}ahdhcp.netmask="$NETMASKADHOC"
++ EOF
++ uci_commitverbose "Setup interface for ${netrenamed}ahdhcp" network
++ fi
++fi
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd.sh
+new file mode 100755
+index 0000000..d212ca4
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd.sh
+@@ -0,0 +1,160 @@
++#!/bin/sh
++# Sets up olsrd
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++local protocols="4"
++if [ "$ipv6_enabled" = 1 ] && [ "$has_ipv6" == "1" ]; then
++ protocols="4 6"
++fi
++
++clean_config() {
++ # Clean the config, remove interface wlan
++ handle_interface() {
++ config_get interface "$1" interface
++ if [ "$interface" = "wlan" ]; then
++ uci delete $cfg.$1
++ fi
++ }
++ config_foreach handle_interface Interface
++}
++
++rename_olsrd() {
++ #Rename olsrd basic settings
++ handle_olsrd() {
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename $cfg $1 olsrd
++ fi
++ }
++ config_foreach handle_olsrd olsrd
++}
++
++rename_interface_defaults() {
++ # Rename interface defaults
++ handle_interfacedefaults() {
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename $cfg $1 InterfaceDefaults
++ fi
++ }
++ config_foreach handle_interfacedefaults InterfaceDefaults
++}
++
++cleanup_plugins() {
++ # Rename nameservice, dyngw and httpinfo plugins
++ handle_plugin() {
++ config_get library "$1" library
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ new="$(echo $library | cut -d '.' -f 1)"
++ section_rename $cfg "$1" "$new"
++ fi
++ }
++ config_foreach handle_plugin LoadPlugin
++ uci -q delete $cfg.olsrd_httpinfo
++ uci -q delete $cfg.olsrd_dyn_gw
++}
++
++setup_nameservice() {
++ # Setup nameservice plugin
++ if [ -n "$profile_suffix" ]; then
++ suffix=".$profile_suffix"
++ else
++ suffix=".olsr"
++ fi
++ local llfile="/var/run/latlon.js"
++ local hosts="/var/etc/hosts.olsr"
++ local services="/var/run/services_olsr"
++
++ if [ "$proto" = "6" ]; then
++ local llfile="/var/run/latlon.js.ipv6"
++ local hosts="/var/etc/hosts.olsr.ipv6"
++ local services="/var/run/services_olsr.ipv6"
++ fi
++
++ uci batch <<- EOF
++ set $cfg.olsrd_nameservice=LoadPlugin
++ set $cfg.olsrd_nameservice.library="olsrd_nameservice.so.0.3"
++ set $cfg.olsrd_nameservice.latlon_file="$llfile"
++ set $cfg.olsrd_nameservice.hosts_file="$hosts"
++ set $cfg.olsrd_nameservice.sighup_pid_file="/var/run/dnsmasq.pid"
++ set $cfg.olsrd_nameservice.services_file="$services"
++ set $cfg.olsrd_nameservice.suffix="$suffix"
++ EOF
++
++ uci_commitverbose "Setup olsr nameservice plugin" $cfg
++}
++
++setup_dyngw_plain() {
++ # Setup dyngw_plain
++ # If Sharing of Internet is enabled then enable dyngw_plain plugin
++
++ if [ "$general_sharenet" == 1 ]; then
++ uci set $cfg.dyngw_plain=LoadPlugin
++ uci set $cfg.dyngw_plain.ignore=0
++ uci set $cfg.dyngw_plain.library="olsrd_dyn_gw_plain.so.0.4"
++ uci_commitverbose "Setup olsrd_dyngw_plain plugin" $cfg
++ fi
++
++}
++
++setup_watchdog() {
++ # Setup watchdog
++ local watchdogfile="/var/run/olsrd.watchdog"
++ if [ "$proto" = "6" ]; then
++ watchdogfile="/var/run/olsrd.watchdog.ipv6"
++ fi
++
++ uci batch <<- EOF
++ set $cfg.olsrd_watchdog=LoadPlugin
++ set $cfg.olsrd_watchdog.library="olsrd_watchdog.so.0.1"
++ set $cfg.olsrd_watchdog.file="$watchdogfile"
++ set $cfg.olsrd_watchdog.interval=30
++ EOF
++ uci_commitverbose "Setup olsr watchdog plugin" $cfg
++
++}
++
++setup_jsoninfo() {
++ proto="$1"
++ uci batch <<- EOF
++ set $cfg.olsrd_jsoninfo=LoadPlugin
++ set $cfg.olsrd_jsoninfo.library="olsrd_jsoninfo.so.0.0"
++ EOF
++ if [ "$proto" = "6" ]; then
++ uci set $cfg.olsrd_jsoninfo.ipv6only='1'
++ fi
++ uci_commitverbose "Setup olsr jsoninfo plugin" $cfg
++}
++
++setup_txtinfo() {
++ proto="$1"
++ uci batch <<- EOF
++ set $cfg.olsrd_txtinfo=LoadPlugin
++ set $cfg.olsrd_txtinfo.library="olsrd_txtinfo.so.0.1"
++ EOF
++ if [ "$proto" = "6" ]; then
++ uci set $cfg.olsrd_txtinfo.ipv6only='1'
++ fi
++ uci_commitverbose "Setup olsr txtinfo plugin" $cfg
++}
++
++
++for proto in $protocols; do
++ cfg="olsrd"
++ [ "$proto" == "6" ] && cfg="olsrd6"
++ config_load $cfg
++ clean_config
++ rename_olsrd
++ cleanup_plugins
++
++ uci set $cfg.olsrd.IpVersion="$proto"
++ uci set $cfg.InterfaceDefaults=InterfaceDefaults
++ set_defaults "olsr_interfacedefaults_" $cfg.InterfaceDefaults
++ uci_commitverbose "Cleanup olsrd config" $cfg
++
++ setup_nameservice
++ setup_dyngw_plain
++ setup_watchdog
++ setup_jsoninfo $proto
++ setup_txtinfo $proto
++done
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd_interface.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd_interface.sh
+new file mode 100755
+index 0000000..8f21893
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd_interface.sh
+@@ -0,0 +1,76 @@
++#!/bin/sh
++# Sets up olsrd interfaces
++# arg $1 = net
++
++net=$1
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++local protocols="4"
++if [ "$ipv6_enabled" = 1 ] && [ "$has_ipv6" == "1" ]; then
++ protocols="4 6"
++fi
++
++for proto in $protocols; do
++
++ cfg="olsrd"
++ [ "$proto" == "6" ] && cfg="olsrd6"
++
++ # Rename interface for $netrenamed
++ handle_interface() {
++ config_get interface "$1" Interface
++ if [ "$interface" == "$netrenamed" ]; then
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename $cfg $1 $netrenamed
++ fi
++ fi
++ }
++
++ config_foreach handle_interface Interface
++
++ # Setup new interface for $netrenamed
++
++ uci set $cfg.$netrenamed=Interface
++ set_defaults "olsr_interface_" $cfg.$net
++ uci set $cfg.$netrenamed.interface="$netrenamed"
++
++ uci_commitverbose "Setup olsr interface for $netrenamed." $cfg
++
++ if [ "$proto" = "4" ]; then
++ # If dhcp-network is inside the mesh_network then add HNA for it
++
++ dhcprange=$(uci -q get meshwizard.netconfig.$net\_dhcprange)
++ uci -q delete $cfg.${netrenamed}clients
++
++ if [ -n "$dhcprange" ]; then
++ meshnet="$(uci get profile_$community.profile.mesh_network)"
++ dhcpinmesh="$($dir/helpers/check-range-in-range.sh $dhcprange $meshnet)"
++
++ if [ "$dhcpinmesh" == 1 ] && [ -n "$meshnet" ]; then
++ uci set $cfg.${netrenamed}clients="Hna4"
++ eval $(sh $dir/helpers/ipcalc-cidr.sh $dhcprange)
++ uci set $cfg.${netrenamed}clients.netaddr="$NETWORK"
++ uci set $cfg.${netrenamed}clients.netmask="$NETMASK"
++ uci_commitverbose "Setup HNA for network $dhcprange" $cfg
++ fi
++ fi
++ fi
++
++ if [ "$proto" = "6" ]; then
++ # Set Hna entry for ipv6 net for static ipv6 config
++ uci -q delete $cfg.${netrenamed}static
++ if [ "$ipv6_config" = "static" ]; then
++ local v6range="$(uci -q get meshwizard.netconfig.$net\_ip6addr)"
++ local v6net="$(echo $v6range | cut -d '/' -f 1)"
++ local v6mask="$(echo $v6range | cut -d '/' -f 2)"
++ if [ -n "$v6net" ] && [ -n "$v6mask" ]; then
++ uci set $cfg.${netrenamed}static="Hna6"
++ uci set $cfg.${netrenamed}static.netaddr="$v6net"
++ uci set $cfg.${netrenamed}static.prefix="$v6mask"
++ uci_commitverbose "Setup HNA for network $v6range" $cfg
++ fi
++ fi
++ fi
++
++done
+\ No newline at end of file
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_policyrouting.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_policyrouting.sh
+new file mode 100755
+index 0000000..f898bd6
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_policyrouting.sh
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++. $dir/functions.sh
++
++uci batch << EOF
++ set freifunk-policyrouting.pr.enable=1
++ set freifunk-policyrouting.pr.strict=1
++ set freifunk-policyrouting.pr.zones="freifunk"
++EOF
++
++uci_commitverbose "Setup policyrouting" freifunk-policyrouting
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_qos.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_qos.sh
+new file mode 100755
+index 0000000..25884b3
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_qos.sh
+@@ -0,0 +1,17 @@
++#!/bin/sh
++# sets up qos-scripts for the wan interface
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++if [ ! -f /etc/config/qos ]; then
++ echo "NOT setting up QOS because /etc/config/qos-scripts was not found"
++else
++ uci batch <<- EOF
++ set qos.wan.enabled=1
++ set qos.wan.upload=$wan_up
++ set qos.wan.download=$wan_down
++ EOF
++ uci_commitverbose "Setup QOS on WAN interface." qos
++
++fi
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_splash.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_splash.sh
+new file mode 100755
+index 0000000..3c3e6a3
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_splash.sh
+@@ -0,0 +1,54 @@
++#!/bin/sh
++# Setup_splash, takes 1 argument: 1=net
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++net=$1
++vap=$(uci -q get meshwizard.netconfig.${net}_vap)
++
++if [ ! "$has_luci_splash" == TRUE ]; then
++ echo " Luci Splash is not installed, skipping setup of it."
++ exit
++fi
++
++set_defaults "luci_splash_" luci_splash.general
++uci_commitverbose "Setup general splash settings" luci_splash
++
++dhcprange=$(uci -q get meshwizard.netconfig.$net\_dhcprange)
++
++splash_net_add() {
++ uci batch <<- EOF
++ set luci_splash.$1="iface"
++ set luci_splash.$1.network="$1"
++ set luci_splash.$1.zone="freifunk"
++ EOF
++}
++
++if [ "$(uci -q get meshwizard.netconfig.$net\_dhcp)" = 1 ] && [ -n "$dhcprange" ]; then
++ handle_splash() {
++ config_get network "$1" network
++ if [ "$network" == "${netrenamed}dhcp" ]; then
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename luci_splash $1 ${netrenamed}dhcp
++ fi
++ fi
++ }
++ config_load luci_splash
++ config_foreach handle_splash iface
++
++ if [ "$supports_vap" = 1 -a "$vap" = 1 ]; then
++ splash_net_add ${netrenamed}dhcp
++ uci_commitverbose "Setup dhcpsplash for ${netrenamed}dhcp" luci_splash
++ fi
++
++ ahdhcp_when_vap="$(uci get profile_$community.profile.adhoc_dhcp_when_vap)"
++ if [ "$supports_vap" = 0 ] || \
++ [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ] || \
++ [ "$lan_dhcp" = 1 ]; then
++ splash_net_add ${netrenamed}ahdhcp
++ uci_commitverbose "Setup dhcpsplash for ${netrenamed}ahdhcp" luci_splash
++ fi
++ /etc/init.d/luci_splash enable
++fi
++
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_ssh.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_ssh.sh
+new file mode 100755
+index 0000000..38b331e
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_ssh.sh
+@@ -0,0 +1,26 @@
++#!/bin/sh
++# Setup ssh. At this point only used to store pubkeys.
++
++[ ! "$(uci -q get meshwizard.ssh)" == "system" ] && exit
++
++. /lib/functions.sh
++. $dir/functions.sh
++authorized="/etc/dropbear/authorized_keys"
++
++
++config_load meshwizard
++
++i=0
++handle_pubkeys() {
++ local k="$1"
++ ( [ -f "$authorized" ] && grep -q "$k" $authorized) || {
++ echo "$k" >> $authorized
++ i=`expr $i + 1`
++ }
++}
++
++config_list_foreach ssh pubkey handle_pubkeys
++
++uci delete meshwizard.ssh
++uci_commitverbose "Added $i pubkeys to authorized_keys" meshwizard
++
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_system.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_system.sh
+new file mode 100755
+index 0000000..e9ce953
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_system.sh
+@@ -0,0 +1,7 @@
++#!/bin/sh
++
++. $dir/functions.sh
++
++set_defaults "system_" system.system
++uci -q delete meshwizard.system && uci commit meshwizard
++uci_commitverbose "System config" system
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_uhttpd.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_uhttpd.sh
+new file mode 100755
+index 0000000..b25a175
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_uhttpd.sh
+@@ -0,0 +1,11 @@
++#!/bin/sh
++. $dir/functions.sh
++if [ "$ipv6_enabled" = "1" ]; then
++ uci batch <<- EOF
++ set uhttpd.main.listen_http="80"
++ set uhttpd.main.listen_https="443"
++ EOF
++fi
++
++uci_commitverbose "Setup uhttpd" uhttpd
++
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_dhcp.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_dhcp.sh
+new file mode 100755
+index 0000000..91fc1d8
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_dhcp.sh
+@@ -0,0 +1,18 @@
++#!/bin/sh
++# Setup dhcp interface settings for wan. This is the OpenWrt default,
++# so all we need to do here is to delete wan from meshwizard after setup.
++# Also disallow ra on wan if ipv6 is enabled
++
++[ ! "$(uci -q get network.wan)" == "interface" ] && exit
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++if [ "$ipv6_enabled" = "1" ]; then
++ uci set network.wan.accept_ra='0'
++ uci_commitverbose "Do not accept ra on wan interface" network
++fi
++
++
++uci delete meshwizard.wan && uci commit meshwizard
++
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_static.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_static.sh
+new file mode 100755
+index 0000000..570470a
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_static.sh
+@@ -0,0 +1,20 @@
++#!/bin/sh
++# Setup static interface settings for wan if wan is not an olsr interface
++
++[ ! "$(uci -q get network.wan)" == "interface" ] && exit
++
++. /lib/functions.sh
++. $dir/functions.sh
++
++uci batch << EOF
++set network.wan.proto='$wan_proto'
++set network.wan.ipaddr='$wan_ip4addr'
++set network.wan.netmask='$wan_netmask'
++set network.wan.gateway='$wan_gateway'
++set network.wan.dns='$wan_dns'
++EOF
++
++uci_commitverbose "Setup static ip settings for wan" network
++
++uci delete meshwizard.wan && uci commit meshwizard
++
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_widgets.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_widgets.sh
+new file mode 100755
+index 0000000..288252f
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_widgets.sh
+@@ -0,0 +1,14 @@
++#!/bin/sh
++. /lib/functions.sh
++ . $dir/functions.sh
++
++if [ -n "$widgets" ]; then
++ [ ! -f "/etc/config/freifunk-widgets" ] && touch /etc/config/freifunk-widgets
++ for w in $widgets; do
++ uci set freifunk-widgets.${w}=widget
++ set_defaults "${w}_" freifunk-widgets.${w}
++ uci delete profile_$community.${w}
++ done
++ uci commit profile_$community
++ uci_commitverbose "Added widget config." freifunk-widgets
++fi
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi.sh
+new file mode 100755
+index 0000000..41feb86
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi.sh
+@@ -0,0 +1,85 @@
++#!/bin/sh
++# sets up a wifi interface for meshing
++# Arguments: $1 = network interface
++
++net="$1"
++. /lib/functions.sh
++. $dir/functions.sh
++
++##### wifi-device #####
++
++# Get the type before we delete the wifi-device
++config_load wireless
++config_get type $net type
++
++# Rename wifi-device for $net
++
++handle_wifidevice() {
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename wireless $1 $net
++ fi
++}
++config_foreach handle_wifidevice wifi-device
++
++# create new wifi-device for $net
++uci set wireless.${net}=wifi-device
++
++# get and set wifi-device defaults
++set_defaults "wifi_device_" wireless.${net}
++
++channel="$(uci -q get meshwizard.netconfig.$net\_channel)"
++
++if [ -z "$channel" -o "$channel" == "default" ]; then
++ channel=$wifi_device_channel
++fi
++
++uci batch << EOF
++ set wireless.${net}.type="$type"
++ set wireless.${net}.channel="$channel"
++EOF
++
++uci_commitverbose "Setup wifi device for $netrenamed" wireless
++
++##### wifi iface
++
++# Rename wifi-iface for $net
++handle_interface() {
++ config_get device "$1" device
++ if [ "$device" == "$net" ]; then
++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then
++ section_rename wireless $1 ${net}_iface
++ fi
++ fi
++}
++config_foreach handle_interface wifi-iface
++
++# create new wifi-device for $net
++uci set wireless.$net\_iface=wifi-iface
++
++# create new wifi-iface for $net from defaults
++set_defaults "wifi_iface_" wireless.$net\_iface
++
++# overwrite some settings for type atheros (madwifi)
++if [ "$type" = "atheros" ]; then
++ set_defaults "madwifi_wifi_iface_" wireless.${net}
++fi
++
++# overwrite defaults
++bssid="$($dir/helpers/gen_bssid.sh $channel $community)"
++
++ssid="$profile_ssid"
++if [ "$profile_ssid_scheme" == "addchannel" ]; then
++ ssid="$ssid - ch$channel"
++elif [ "$profile_ssid_scheme" == "addchannelbefore" ]; then
++ ssid="ch$channel.$ssid"
++fi
++
++uci batch << EOF
++ set wireless.$net\_iface.device="${net}"
++ set wireless.$net\_iface.network="$netrenamed"
++ set wireless.$net\_iface.ssid="$ssid"
++ set wireless.$net\_iface.bssid="$bssid"
++EOF
++
++uci_commitverbose "Setup wifi interface for $netrenamed" wireless
++
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi_vap.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi_vap.sh
+new file mode 100755
+index 0000000..df58ad7
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi_vap.sh
+@@ -0,0 +1,23 @@
++#!/bin/sh
++# sets up a wifi interface for meshing
++# Arguments: $1 = network interface
++
++net="$1"
++. /lib/functions.sh
++. $dir/functions.sh
++
++## Setup a VAP interface in AP Mode
++ip4addr="$(uci get meshwizard.netconfig.$net\_ip4addr)"
++vap="$(uci -q get meshwizard.netconfig.$net\_vap)"
++
++if [ "$supports_vap" == 1 -a "$vap" == 1 ]; then
++ uci batch <<- EOF
++ set wireless.$net\_iface_dhcp="wifi-iface"
++ set wireless.$net\_iface_dhcp.device="$net"
++ set wireless.$net\_iface_dhcp.mode="ap"
++ set wireless.$net\_iface_dhcp.encryption="none"
++ set wireless.$net\_iface_dhcp.network="${netrenamed}dhcp"
++ set wireless.$net\_iface_dhcp.ssid="Freifunk-$ip4addr"
++ EOF
++ uci_commitverbose "Setup VAP interface for $netrenamed" wireless
++fi
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/supports_vap.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/supports_vap.sh
+new file mode 100755
+index 0000000..0585ab5
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/supports_vap.sh
+@@ -0,0 +1,34 @@
++#!/bin/sh
++# checks if a given device can be used for a VAP interface (1 adhoc + 1 ap)
++dev="$1"
++type="$2"
++
++
++if [ -z "$dev" -o -z "$type" ]; then
++ exit 1
++fi
++
++if [ "$type" = "atheros" ]; then
++ exit 0
++elif [ "$type" = "mac80211" ]; then
++ # not hostapd[-mini], no VAP
++ if [ ! -x /usr/sbin/hostapd ]; then
++ echo "WARNING: hostapd[-mini] is required to be able to use VAP with mac80211."
++ exit 1
++ fi
++ # get driver in use
++ netindex="$(echo $dev |sed 's/[a-zA-z]*//')"
++ if [ -d /sys/class/net/wlan${netindex}/device/driver/module ]; then
++ driver="$(basename $(ls -l /sys/class/net/wlan${netindex}/device/driver/module | sed -ne 's/.* -> //p'))"
++ if [ "$driver" = "ath9k" -o "$driver" = "ath5k" ]; then
++ exit 0
++ else
++ exit 1
++ fi
++ else
++ exit 1
++ fi
++else
++ exit 1
++fi
++
+diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/wizard.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/wizard.sh
+new file mode 100755
+index 0000000..3721489
+--- /dev/null
++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/wizard.sh
+@@ -0,0 +1,147 @@
++#!/bin/sh
++
++# This collection of scripts will take settings from /etc/config/meshwizard, /etc/config/freifunk
++# and /etc/config/profile_<community> and setup the router to participate in wireless mesh networks
++
++# Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++
++# Licensed under the Apache License, Version 2.0 (the "License")
++# You may not use this file except in compliance with the License.
++# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
++
++echo "
++/* Meshwizard 0.3.1 */
++"
++
++# config
++export dir="/usr/bin/meshwizard"
++
++. /lib/functions.sh
++. $dir/functions.sh
++. $dir/helpers/read_defaults.sh
++[ -f /proc/net/ipv6_route ] && export has_ipv6=1
++
++# Check which packages we have installed
++export has_luci=FALSE
++opkg list_installed |grep luci-mod-admin > /dev/null && export has_luci=TRUE
++export has_luci_splash=FALSE
++opkg list_installed |grep luci-app-splash > /dev/null && export has_luci_splash=TRUE
++
++# Check whether we want to cleanup/restore uci config before setting new options
++cleanup=$(uci -q get meshwizard.general.cleanup)
++[ "$cleanup" == 1 ] && restore_factory_defaults
++
++# Rename wifi interfaces
++$dir/helpers/rename-wifi.sh
++
++export lan_is_olsr="$(uci -q get meshwizard.netconfig.lan_config)"
++
++# Get community
++community="$(uci -q get meshwizard.community.name || uci -q get freifunk.community.name)"
++[ -z "$community" ] && echo "Error: Community is not set in /etc/config/freifunk, aborting now." && exit 1
++export community="$community"
++
++# we need a list of widgets later on. It will be populated in read_defaults.sh
++local widgets=""
++
++# Get a list of networks we need to setup
++networks=$(uci show meshwizard.netconfig | grep -v "netconfig=" | sed -e 's/meshwizard.netconfig\.\(.*\)\_.*/\1/' |sort|uniq)
++export networks
++[ -z "$networks" ] && echo "Error: No networks to setup could be found in /etc/config/meshwizard, aborting now." && exit 1
++
++# Read defaults and node config
++read_defaults $community
++
++# Do config
++$dir/helpers/initial_config.sh
++$dir/helpers/setup_dnsmasq.sh
++$dir/helpers/setup_system.sh
++$dir/helpers/setup_olsrd.sh
++$dir/helpers/setup_firewall.sh
++$dir/helpers/setup_ssh.sh
++$dir/helpers/setup_uhttpd.sh
++$dir/helpers/setup_widgets.sh
++
++if [ "$wan_proto" == "static" ] && [ -n "$wan_ip4addr" ] && [ -n "$wan_netmask" ]; then
++ $dir/helpers/setup_wan_static.sh
++fi
++
++if [ "$wan_proto" == "dhcp" ]; then
++ $dir/helpers/setup_wan_dhcp.sh
++fi
++
++if [ -n "$wan_down" -a -n "$wan_up" ]; then
++ $dir/helpers/setup_qos.sh
++fi
++
++if [ "$lan_proto" == "static" ] && [ -n "$lan_ip4addr" ] && [ -n "$lan_netmask" ]; then
++ $dir/helpers/setup_lan_static.sh
++fi
++
++if [ "$ipv6_enabled" == 1 ] && [ "$has_ipv6" = 1 ]; then
++ $dir/helpers/setup_lan_ipv6.sh
++ # Setup auto-ipv6
++ if [ -n "$(echo "$ipv6_config" |grep auto-ipv6)" ]; then
++ $dir/helpers/setup_auto-ipv6.sh
++ fi
++fi
++
++# Setup policyrouting if internet sharing is disabled and wan is not used for olsrd
++# Always disable it first to make sure its disabled when the user decied to share his internet
++uci set freifunk-policyrouting.pr.enable=0
++if [ ! "$general_sharenet" == 1 ] && [ ! "$(uci -q get meshwizard.netconfig.wan_proto)" == "olsr" ]; then
++ $dir/helpers/setup_policyrouting.sh
++fi
++
++# Configure found networks
++for net in $networks; do
++ # radioX devices need to be renamed
++ netrenamed="${net/radio/wireless}"
++ export netrenamed
++
++ if [ ! "$net" == "wan" ] && [ ! "$net" == "lan" ]; then
++ $dir/helpers/setup_wifi.sh $net
++ # check if this net supports vap
++ /sbin/wifi # wifi needs to be up for the check
++ export supports_vap="0"
++ type="$(uci -q get wireless.$net.type)"
++ [ -n "$type" ] && $dir/helpers/supports_vap.sh $net $type && export supports_vap=1
++ if [ "$supports_vap" = 1 ]; then
++ $dir/helpers/setup_wifi_vap.sh $net
++ fi
++ fi
++
++ $dir/helpers/setup_network.sh $net
++
++ $dir/helpers/setup_olsrd_interface.sh $net
++
++ net_dhcp=$(uci -q get meshwizard.netconfig.${net}_dhcp)
++ export ${net}_dhcp=$net_dhcp
++
++ if [ "$net" = "lan" ] && [ "$lan_is_olsr" = "1" ]; then
++ uci -q set dhcp.lan.ignore="1"
++ uci_commitverbose "Disable DHCP on LAN because it is an olsr interface." dhcp
++ fi
++
++ if [ "$net_dhcp" == 1 ]; then
++ $dir/helpers/setup_dhcp.sh $net
++ fi
++
++ $dir/helpers/setup_splash.sh $net
++ $dir/helpers/setup_firewall_interface.sh $net
++
++ if [ -n "$(echo "$ipv6_config" |grep auto-ipv6)" ]; then
++ $dir/helpers/setup_auto-ipv6-interface.sh $net
++ fi
++done
++
++##### postinstall script
++
++[ -f /etc/rc.local.meshkitpostinstall ] && /etc/rc.local.meshkitpostinstall
++
++
++##### Reboot the router (because simply restarting services gave errors)
++
++echo "+ The wizard has finished and the router will reboot now."
++
++reboot
+diff --git a/feeds/luci/contrib/package/remote-update/Makefile b/feeds/luci/contrib/package/remote-update/Makefile
+new file mode 100644
+index 0000000..4f8b3a5
+--- /dev/null
++++ b/feeds/luci/contrib/package/remote-update/Makefile
+@@ -0,0 +1,43 @@
++#
++# Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
++#
++# This is free software, licensed under the Apache 2.0 license.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=remote-update
++PKG_RELEASE:=4
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/remote-update
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=9. Freifunk
++ TITLE:=Freifunk remote update utility.
++ DEPENDS:=@TARGET_atheros||@TARGET_ar71xx||@TARGET_brcm_2_4
++endef
++
++define Package/remote-update/description
++ The freifunk remote-update utility uses sysupgrade to reflash the currently
++ running firmware while keeping most of the existing configuratio.
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/remote-update/install
++ $(CP) ./files/* $(1)/
++endef
++
++$(eval $(call BuildPackage,remote-update))
+diff --git a/feeds/luci/contrib/package/remote-update/files/usr/sbin/remote-update b/feeds/luci/contrib/package/remote-update/files/usr/sbin/remote-update
+new file mode 100755
+index 0000000..6e45e48
+--- /dev/null
++++ b/feeds/luci/contrib/package/remote-update/files/usr/sbin/remote-update
+@@ -0,0 +1,306 @@
++#!/bin/sh
++
++local tempfile=/tmp/remote-upgrade.img
++local D2='\([0-9]\{2\}\)'
++local D4='\([0-9]\{4\}\)'
++local NL='
++'
++
++find_architecture()
++{
++ local ifs="$IFS"; IFS="-"
++ set -- $(opkg list_installed kernel)
++ IFS="$ifs"
++
++ echo "$3"
++}
++
++find_image()
++{
++ case "$1" in
++ atheros)
++ echo "openwrt-atheros-combined.squashfs.img"
++ ;;
++ ar71xx)
++ echo "openwrt-ar71xx-combined.squashfs.img"
++ ;;
++ brcm)
++ echo "openwrt-brcm-2.4-squashfs.trx"
++ ;;
++ esac
++}
++
++check_image()
++{
++ local file; for file in /lib/upgrade/*.sh; do . $file; done
++ if platform_check_image "$1" >/dev/null 2>/dev/null; then
++ return 0
++ fi
++ return 1
++}
++
++find_remote_checksum()
++{
++ wget -qO- ${1%/*}/md5sums 2>/dev/null | \
++ sed -ne '/'$2'/ { s/ .*//p }'
++}
++
++find_local_checksum()
++{
++ set -- $(md5sum "$tempfile")
++ echo $1
++}
++
++find_remote_info()
++{
++ wget -qO- "${1%/*}/VERSION.txt" 2>/dev/null
++}
++
++find_remote_version()
++{
++ find_remote_info "$1" | \
++ sed -ne "s!.*$D4/$D2/$D2 $D2:$D2.*!\\1\\2\\3\\4\\5!p;t"
++}
++
++find_local_version()
++{
++ if [ -f /rom/etc/banner ]; then
++ sed -ne "s!.*$D4/$D2/$D2 $D2:$D2.*!\\1\\2\\3\\4\\5!p;t" \
++ /rom/etc/banner
++ else
++ date +"%Y%m%d%H%M" -r /bin/sh
++ fi
++}
++
++stop_service()
++{
++ [ -x /etc/init.d/$1 ] && {
++ echo -n "Stopping service $1 ... "
++ /etc/init.d/$1 stop >/dev/null 2>/dev/null
++ echo "done"
++ }
++}
++
++do_wait()
++{
++ if [ ${1:-0} -gt 0 ]; then
++ echo -n "${2:-Waiting} "
++ for i in $(seq 1 $1); do
++ printf "%-2dseconds" $(($1-$i))
++ sleep 1
++ echo -en "\b\b\b\b\b\b\b\b\b"
++ done
++ echo "${NL}"
++ fi
++}
++
++version_compare()
++{
++ local v1="$1"
++ local v2="$2"
++
++ while [ -n "$v1" -o -n "$v2" ]; do
++ if [ -z "${v2:0:4}" -o "${v1:0:4}" -gt "${v2:0:4}" ]; then
++ return 1
++ elif [ -z "${v1:0:4}" -o "${v1:0:4}" -lt "${v2:0:4}" ]; then
++ return 2
++ fi
++
++ v1="${v1:4}"
++ v2="${v2:4}"
++ done
++
++ return 0
++}
++
++usage()
++{
++ cat <<EOT
++
++Usage:
++ remote-update -h
++ remote-update [-u <update url>] -c
++ remote-update [-v] [-y] [-u <update url>] -w
++ remote-update [-d] [-n] [-v] [-y] [-s <sleep seconds>] [-u <update url>]
++
++Actions:
++ -h Display this help message and exit.
++ -c Check for firmware update and exit.
++ -w Fetch image and exit, do not perform flash write.
++
++Options:
++ -d Do not detach from terminal.
++ -n Do not backup configuration.
++ -v Skip verification of downloaded image.
++ -y Assume defaults for all questions.
++
++ -s <seconds>
++ Sleep given amount of seconds before starting flash write.
++ If ommitted and '-y' is not used, 5 seconds are assumed.
++
++ -u <url>
++ Fetch firmware image from given url. A file "md5sums" is expected
++ in the same remote directory. If there is no such file, use -v to
++ suppress verification.
++
++EOT
++
++ exit 1
++}
++
++
++while getopts "s:u:cdnvwyh" flag; do
++ case $flag in
++ s) sleeptime="$OPTARG";;
++ u) updateurl="$OPTARG";;
++ c) checkupdate=1;;
++ d) nodetach=1;;
++ n) nobackup=1;;
++ v) noverify=1;;
++ w) noflash=1;;
++ y) noquestions=1;;
++ *) usage;;
++ esac
++done
++
++
++local image_url="$updateurl"
++local image_name="${image_url##*/}"
++
++[ -z "$image_url" ] && {
++ local arch=$(find_architecture)
++ local image=$(find_image "$arch")
++ local repo=$(uci get freifunk.upgrade.repository 2>/dev/null)
++ repo=${repo:-$(uci get system.upgrade.repository 2>/dev/null)}
++
++ [ -z "$arch" ] && {
++ echo "Can not determine the current architecture."
++ exit 1
++ }
++
++ [ -z "$repo" ] && {
++ echo "No repository configured in 'system.upgrade.repository'."
++ echo "Use the '-u' flag to specify an image location."
++ exit 1
++ }
++
++ [ -z "$image" ] && {
++ echo "No suitable image for the '$arch' architecture."
++ echo "Your platform is not supported."
++ exit 1
++ }
++
++ echo "Architecture: $arch"
++ echo "Repository: $repo"
++
++ image_name="$image"
++ image_url="${repo%/}/$arch/$image"
++}
++
++
++if [ "$checkupdate" = 1 ]; then
++ local v1=$(find_local_version)
++ local v2=$(find_remote_version "$image_url")
++
++ [ -n "$v1" -a -n "$v2" ] && {
++ version_compare "$v1" "$v2"
++ [ $? == 2 ] && {
++ echo "Update available!${NL}Local: $v1${NL}Remote: $v2${NL}--"
++ find_remote_info "$image_url"
++ exit 0
++ } || {
++ echo "Local version $v1 is up to date"
++ exit 2
++ }
++ } || {
++ echo "No remote time stamp found."
++ exit 1
++ }
++else
++ if [ "$noquestions" != 1 ]; then
++ echo -n "${NL}About to download $image_name. Continue? [y] "
++ read answer
++ case "$answer" in
++ [nN]) exit 1;;
++ esac
++ fi
++
++ echo -n "Downloading $image_name ... "
++ rm -f $tempfile
++ wget -qO $tempfile "$image_url" 2>/dev/null
++ [ $? == 0 ] && echo done || {
++ echo failed
++ rm -f $tempfile
++ exit 1
++ }
++
++ if [ "$noverify" != 1 ]; then
++ echo -n "Verifying $image_name ... "
++
++ local md5_remote=$(find_remote_checksum "$image_url" "$image_name")
++ local md5_local=$(find_local_checksum)
++
++ check_image "$tempfile"
++ local image_ok=$?
++
++ if [ $image_ok = 0 -a -n "$md5_remote" -a -n "$md5_local" -a "$md5_remote" = "$md5_local" ]; then
++ echo "done"
++ else
++ if [ $image_ok != 0 ]; then
++ echo "unsupported image type"
++ else
++ echo "checksum mismatch! (local:${md5_local:-(none)} remote:${md5_remote:-(none)})"
++ fi
++
++ local answer=n
++ if [ "$noquestions" != 1 ]; then
++ echo -n "${NL}Verification failed. Continue anyway? [n] "
++ read answer
++ fi
++
++ case "$answer" in
++ [yYjJ]*) : ;;
++ *)
++ echo "Aborting."
++ rm -f $tempfile
++ exit 1
++ ;;
++ esac
++ fi
++ fi
++
++ if [ "$noflash" != 1 ]; then
++ if [ -f "$tempfile" ]; then
++ if [ "$noquestions" == 1 ]; then
++ do_wait ${sleeptime:-5} "${NL}About to start flashing, hit <Ctrl-C> to abort!${NL}${NL}Starting in"
++ else
++ if [ -z "$nobackup" ]; then
++ echo -n "${NL}Keep configuration files? [y] "
++ read answer
++ case "$answer" in
++ [nN]) nobackup=1;;
++ esac
++ fi
++
++ echo -n "${NL}About to start flashing!${NL}Hit <Enter> to continue or <Ctrl-C> to abort.${NL}"
++ read answer
++ fi
++
++ for s in lucid collectd; do stop_service $s; done
++
++ if [ "$nodetach" != 1 ]; then
++ echo -n "Starting sysupgrade in background ... "
++ /bin/busybox start-stop-daemon -S -b -x /sbin/sysupgrade -- ${nobackup:+-n} "$tempfile"
++ echo "done"
++ else
++ echo "Executing sysupgrade ... "
++ exec /sbin/sysupgrade ${nobackup:+-n} "$tempfile"
++ fi
++ else
++ echo "No upgrade image found!"
++ exit 1
++ fi
++ else
++ echo "Image saved in '$tempfile'"
++ fi
++fi
+diff --git a/feeds/luci/documentation/CBI.md b/feeds/luci/documentation/CBI.md
+new file mode 100644
+index 0000000..4ebc08a
+--- /dev/null
++++ b/feeds/luci/documentation/CBI.md
+@@ -0,0 +1,246 @@
++
++# CBI models
++are Lua files describing the structure of an UCI config file and the resulting HTML form to be evaluated by the CBI parser.<br />
++All CBI model files must return an object of type **luci.cbi.Map**.<br />
++For a commented example of a CBI model, see the [Writing Modules tutorial](ModulesHowTo.md#cbimodels).
++
++The scope of a CBI model file is automatically extended by the contents of the module **luci.cbi** and the _translate_ function from **luci.i18n**
++
++This Reference covers **the basics** of the CBI system.
++
++
++## class Map (_config, title, description_)
++This is the root object of the model.
++
++* **config:** configuration filename to be mapped, see [UCI documentation](http://wiki.openwrt.org/doc/uci) and the files in /etc/config
++* **title:** title shown in the UI
++* **description:** description shown in the UI
++
++#### function :section (_sectionclass_, ...)
++Creates a new section
++* **sectionclass**: a class object of the section
++* _additional parameters passed to the constructor of the section class_
++
++----
++
++## class NamedSection (_name, type, title, description_)
++An object describing an UCI section selected by the name.<br />
++To instantiate use: `Map:section(NamedSection, "name", "type", "title", "description")`
++
++* **name:** UCI section name
++* **type:** UCI section type
++* **title:** The title shown in the UI
++* **description:** description shown in the UI
++
++#### function :option(_optionclass_, ...)
++Creates a new option
++* **optionclass:** a class object of the section
++* _additional parameters passed to the constructor of the option class_
++
++#### property .addremove = false
++Allows the user to remove and recreate the configuration section.
++
++#### property .dynamic = false
++Marks this section as dynamic. Dynamic sections can contain an undefinded number of completely userdefined options.
++
++#### property .optional = true
++Parse optional options
++
++----
++
++## class TypedSection (_type, title, description_)
++An object describing a group of UCI sections selected by their type.<br />
++To instantiate use: `Map:section(TypedSection, "type", "title", "description")`
++* **type:** UCI section type
++* **title:** The title shown in the UI
++* **description:** description shown in the UI
++
++#### function :option(_optionclass_, ...)
++Creates a new option
++ **optionclass:** a class object of the section
++ _additional parameters passed to the constructor of the option class_
++
++#### function :depends(_key, value_)
++Only select those sections where _key == value_ <br />
++If you call this function several times the dependencies will be linked with **"or"**
++
++#### function .filter(_self, section_) -abstract-
++You can override this function to filter certain sections that will not be parsed.
++The filter function will be called for every section that should be parsed and returns **nil** for sections that should be filtered. For all other sections it should return the section name as given in the second parameter.
++
++#### property .addremove = false
++Allows the user to remove and recreate the configuration section
++
++#### property .dynamic = false
++Marks this section as dynamic. Dynamic sections can contain an undefinded number of completely userdefined options.
++
++#### property .optional = true
++Parse optional options
++
++#### property .anonymous = false
++Do not show UCI section names
++
++----
++
++## class Value (_option, title, description_)
++An object describing an option in a section of a UCI File. Creates a standard text field in the formular.<br />
++To instantiate use: `NamedSection:option(Value, "option", "title", "description")`<br />
++ or `TypedSection:option(Value, "option", "title", "description")`
++* **option:** UCI option name
++* **title:** The title shown in the UI
++* **description:** description shown in the UI
++
++#### function :depends(key, value)
++Only show this option field if another option _key_ is set to _value_ in the same section.<br />
++If you call this function several times the dependencies will be linked with **"or"**
++
++#### function :value(key, value)
++Convert this text field into a combobox if possible and add a selection option.
++
++#### property .default = nil
++The default value
++
++#### property .maxlength = nil
++The maximum inputlength (of chars) of the value
++
++#### property .optional = false
++Marks this option as optional, implies .rmempty = true
++
++#### property .rmempty = true
++Removes this option from the configuration file when the user enters an empty value
++
++#### property .size = nil
++The maximum number of chars displayed by form field
++
++----
++
++## class ListValue (_option, title, description_)
++An object describing an option in a section of a UCI File.<br />
++Creates a list box or list of radio (for selecting one of many choices) in the formular.<br />
++To instantiate use: `NamedSection:option(ListValue, "option", "title", "description")`<br />
++or `TypedSection:option(ListValue, "option", "title", "description")`
++* **option:** UCI option name
++* **title:** The title shown in the UI
++* **description:** description shown in the UI
++
++#### function :depends(key, value)
++Only show this option field if another option _key_ is set to _value_ in the same section.<br />
++If you call this function several times the dependencies will be linked with **"or"**
++
++#### function :value(_key, value_)
++Adds an entry to the selection list
++
++#### property .widget = "select"
++**"select"** shows a selction list, **"radio"** shows a list of radio buttons inside form
++
++#### property .default = nil
++The default value
++
++#### property .optional = false
++Marks this option as optional, implies .rmempty = true
++
++#### property .rmempty = true
++Removes this option from the configuration file when the user enters an empty value
++
++#### property .size = nil
++The size of the form field
++
++----
++
++## class Flag (_option, title, description_)
++An object describing an option with two possible values in a section of a UCI File.<br />
++Creates a checkbox field in the formular.<br />
++To instantiate use: `NamedSection:option(Flag, "option", ""title", "description")`<br />
++ or `TypedSection:option(Flag, "option", "title", "description")`
++* **option:** UCI option name
++* **title:** The title shown in the UI
++* **description:** description shown in the UI
++
++#### function :depends (_key, value_)
++Only show this option field if another option _key_ is set to _value_ in the same section.<br />
++If you call this function several times the dependencies will be linked with **"or"**
++
++#### property .default = nil
++The default value
++
++#### property .disabled = 0
++the value that shoudl be set if the checkbox is unchecked
++
++#### property .enabled = 1
++the value that should be set if the checkbox is checked
++
++#### property .optional = false
++Marks this option as optional, implies .rmempty = true
++
++#### property .rmempty = true
++Removes this option from the configuration file when the user enters an empty value
++
++----
++
++## class MultiValue (_option'', ''title'', ''description_)
++An object describing an option in a section of a UCI File.<br />
++Creates a list of checkboxed or a multiselectable list as form fields.<br />
++To instantiate use: `NamedSection:option(MultiValue, "option", ""title", "description")`<br />
++ or `TypedSection:option(MultiValue, "option", "title", "description")`
++* **option:** UCI option name
++* **title:** The title shown in the UI
++* **description:** description shown in the UI
++
++#### function :depends (_key, value_)
++Only show this option field if another option _key_ is set to _value_ in the same section.<br />
++If you call this function several times the dependencies will be linked with **"or"**
++
++#### function :value(_key, value_)
++Adds an entry to the list
++
++#### property .widget = "checkbox"
++**"select"** shows a selction list, **"checkbox"** shows a list of checkboxes inside form
++
++#### property .delimiter = " "
++The string which will be used to delimit the values inside stored option
++
++#### property .default = nil
++The default value
++
++#### property .optional = false
++Marks this option as optional, implies .rmempty = true
++
++#### property .rmempty = true
++Removes this option from the configuration file when the user enters an empty value
++
++#### property .size = nil
++The size of the form field (only used if property _.widget = "select"_)
++
++----
++
++## class StaticList (_option, title, description_)
++Similar to the MultiValue, but stores selected Values into a UCI list instead of a character-separated option.
++
++----
++
++## class DynamicList (_option, title, description_)
++A extensible list of user-defined values. Stores Values into a UCI list
++
++----
++
++## class DummyValue (_option, title, description_)
++Creates a readonly text in the form. !It writes no data to UCI!<br />
++To instantiate use: `NamedSection:option(DummyValue, "option", ""title", "description")`<br />
++ or `TypedSection:option(DummyValue, "option", "title", "description")`
++* **option:** UCI option name
++* **title:** The title shown in the UI
++* **description:** description shown in the UI
++
++#### property :depends (_key, value_)
++Only show this option field if another option _key_ is set to _value_ in the same section.<br />
++If you call this function several times the dependencies will be linked with **"or"**
++
++----
++
++## class TextValue (_option, title, description_)
++An object describing a multi-line textbox in a section in a non-UCI form.
++
++----
++
++## class Button (_option, title, description_)
++An object describing a Button in a section in a non-UCI form.
+diff --git a/feeds/luci/documentation/JsonRpcHowTo.md b/feeds/luci/documentation/JsonRpcHowTo.md
+new file mode 100644
+index 0000000..76d61f8
+--- /dev/null
++++ b/feeds/luci/documentation/JsonRpcHowTo.md
+@@ -0,0 +1,66 @@
++LuCI provides some of its libraries to external applications through a JSON-RPC API.
++This Howto shows how to use it and provides information about available functions.
++
++
++# Basics
++LuCI comes with an efficient JSON De-/Encoder together with a JSON-RPC-Server which implements the *JSON-RPC 1.0_' and 2.0 (partly) specifications. The LuCI JSON-RPC server offers several independent APIs. Therefore you have to use '_different URLs for every exported library*.
++Assuming your LuCI-Installation can be reached through */cgi-bin/luci_' any exported library can be reached via '''/cgi-bin/luci/rpc/''LIBRARY_*.
++
++
++# Authentication
++Most exported libraries will require a valid authentication to be called with. If you get an *HTTP 403 Forbidden_' status code you are probably missing a valid authentication token. To get such a token you have to call the function '''login''' of the RPC-Library '''auth'''. Following our example from above this login function would be provided at '_/cgi-bin/luci/rpc/auth*. The function accepts 2 parameters: username and password (of a valid user account on the host system) and returns an authentication token.
++
++If you want to call any exported library which requires an authentication token you have to *append it as an URL parameter _auth''''' to the RPC-Server URL. So instead of calling '''/cgi-bin/luci/rpc/''LIBRARY''''' you have to call '''/cgi-bin/luci/rpc/''LIBRARY''?auth=''TOKEN_*.
++
++If your JSON-RPC client is Cookie-aware (like most browsers are) you will receive the authentication token also with a session cookie and probably don't have to append it to the RPC-Server URL.
++
++
++# Exported Libraries
++## uci
++The UCI-Library */rpc/uci* offers functionality to interact with the Universal Configuration Interface.
++*Exported Functions:*
++* [(string) add(config, type)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.add)
++* [(integer) apply(config)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.apply)
++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.changes (object) changes([config])]
++* [(boolean) commit(config)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.commit)
++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.delete (boolean) delete(config, section[, option])]
++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.delete_all (boolean) delete_all(config[, type])]
++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.foreach (array) foreach(config[, type])]
++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.get (mixed) get(config, section[, option])]
++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.get_all (object) get_all(config[, section])]
++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.get (mixed) get_state(config, section[, option])]
++* [(boolean) revert(config)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.revert)
++* [(name) section(config, type, name, values)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.section)
++* [(boolean) set(config, section, option, value)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.set)
++* [(boolean) tset(config, section, values)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.tset)
++
++## uvl
++The UVL-Library */rpc/uvl* offers functionality to validate UCI files and get schemes describing UCI files.
++*Exported Functions:*
++* [(array) get_scheme(scheme)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.get_scheme)
++* [(array) validate(config, section, option)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate)
++* [(array) validate_config(config)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate_config)
++* [(array) validate_section(config, section)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate_section)
++* [(array) validate(config, section, option)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate_option)
++
++## fs
++The Filesystem library */rpc/fs* offers functionality to interact with the filesystem on the host machine.
++*Exported Functions:*
++
++* [Complete luci.fs library](http://luci.subsignal.org/api/luci/modules/luci.fs.html)
++*Note:* All functions are exported as they are except for _readfile'' which encodes its return value in base64 and ''writefile'' which only accepts base64 encoded data as second argument. Note that both functions will only be available when the ''luasocket_ packet is installed on the hostsystem.
++
++## sys
++The System library */rpc/sys* offers functionality to interact with the operating system on the host machine.
++*Exported Functions:*
++* [Complete luci.sys library](http://luci.subsignal.org/api/luci/modules/luci.sys.html)
++* [Complete luci.sys.group library](http://luci.subsignal.org/api/luci/modules/luci.sys.group.html) with prefix *group.*
++* [Complete luci.sys.net library](http://luci.subsignal.org/api/luci/modules/luci.sys.net.html) with prefix *net.*
++* [Complete luci.sys.process library](http://luci.subsignal.org/api/luci/modules/luci.sys.process.html) with prefix *process.*
++* [Complete luci.sys.user library](http://luci.subsignal.org/api/luci/modules/luci.sys.user.html) with prefix *user.*
++* [Complete luci.sys.wifi library](http://luci.subsignal.org/api/luci/modules/luci.sys.wifi.html) with prefix *wifi.*
++
++## ipkg
++The IPKG library */rpc/ipkg* offers functionality to interact with the package manager (IPKG or OPKG) on the host machine.
++*Exported Functions:*
++* [Complete luci.model.ipkg library](http://luci.subsignal.org/api/luci/modules/luci.model.ipkg.html)
+diff --git a/feeds/luci/documentation/LAR.md b/feeds/luci/documentation/LAR.md
+new file mode 100644
+index 0000000..f44d8dc
+--- /dev/null
++++ b/feeds/luci/documentation/LAR.md
+@@ -0,0 +1,87 @@
++LAR is a simple archive format to pack multiple lua source files and arbitary other resources into a single file.
++
++
++# Format Specification
++
++A LAR archive file is divided into two parts: the payload and the index lookup table.
++All segments of the archive are 4 Byte aligned to ease reading and processing of the format.
++All integers are stored in network byte order, so an implementation has to use htonl() and htons() to properly read them.
++
++Schema:
++
++ <payload:
++ <member:
++ <N*4 bytes: path of file #1>
++ <N*4 bytes: data of file #1>
++ >
++
++ <member:
++ <N*4 bytes: path of file #2>
++ <N*4 bytes: data of file #2>
++ >
++
++ ...
++
++ <member:
++ <N*4 bytes: path of file #N>
++ <N*4 bytes: data of file #N>
++ >
++ >
++
++ <index table:
++ <entry:
++ <uint32: offset for path of file #1> <uint32: length for path of file #1>
++ <uint32: offset for data of file #1> <uint32: length for data of file #1>
++ <uint16: type of file #1> <uint16: flags of file #1>
++ >
++
++ <entry:
++ <uint32: offset for path of file #2> <uint32: length for path of file #2>
++ <uint32: offset for data of file #2> <uint32: length for data of file #2>
++ <uint16: type of file #2> <uint16: flags of file #2>
++ >
++
++ ...
++
++ <entry:
++ <uint32: offset for path of file #N> <uint32: length for path of file #N>
++ <uint32: offset for data of file #N> <uint32: length for data of file #N>
++ <uint16: type of file #N> <uint16: flags of file #N>
++ >
++ >
++
++ <uint32: offset for begin of index table>
++
++
++
++# Processing
++
++In order to process an LAR archive, an implementation would have to do the following steps:
++
++## Read Index
++
++1. Locate and open the archive file
++1. Seek to end of file - 4 bytes
++1. Read 32bit index offset and swap from network to native byte order
++1. Seek to index offset, calculate index length: filesize - index offset - 4
++1. Initialize a linked list for index table entries
++1. Read each index entry until the index length is reached, read and byteswap 4 * 32bit int and 2 * 16bit int
++1. Seek to begin of file
++
++## Read Member
++
++1. Read the archive index
++1. Iterate through the linked index list, perform the following steps for each entry
++1. Seek to the specified file path offset
++1. Read as much bytes as specified in the file path length into a buffer
++1. Compare the contents of the buffer against the path of the searched member
++1. If buffer and searched path are equal, seek to the specified file data offset
++1. Read data until the file data length is reached, return
++1. Select the next index table entry and repeat from step 3, if there is no next entry then return
++
++# Reference implementation
++
++A reference implementation can be found here:
++http://luci.subsignal.org/trac/browser/luci/trunk/contrib/lar
++
++The lar.pl script is a simple packer for LAR archives and cli.c provides a utility to list and dump packed LAR archives.
+diff --git a/feeds/luci/documentation/LMO.md b/feeds/luci/documentation/LMO.md
+new file mode 100644
+index 0000000..961a45b
+--- /dev/null
++++ b/feeds/luci/documentation/LMO.md
+@@ -0,0 +1,144 @@
++LMO is a simple binary format to pack language strings into a more efficient form. Although it's suitable to store any kind of key-value table, it's only used for the LuCI *.po based translation system at the moment. The abbreviation "LMO" stands for "Lua Machine Objects" in the style of the GNU gettext *.mo format.
++
++
++# Format Specification
++
++A LMO file is divided into two parts: the payload and the index lookup table.
++All segments of the file are 4 Byte aligned to ease reading and processing of the format.
++Only unsigned 32bit integers are used and stored in network byte order, so an implementation has to use htonl() to properly read them.
++
++Schema:
++
++ <file:
++ <payload:
++ <entry #1: 4 byte aligned data>
++
++ <entry #2: 4 byte aligned data>
++
++ ...
++
++ <entry #N: 4 byte aligned data>
++ >
++
++ <index table:
++ <entry #1:
++ <uint32_t: hash of the first key>
++ <uint32_t: hash of the first value>
++ <uint32_t: file offset of the first value>
++ <uint32_t: length of the first value>
++ >
++
++ <entry #2:
++ <uint32_t: hash of the second key>
++ <uint32_t: hash of the second value>
++ <uint32_t: file offset of the second value>
++ <uint32_t: length of the second value>
++ >
++
++ ...
++
++ <entry #N:
++ <uint32_t: hash of the Nth key>
++ <uint32_t: hash of the Nth value>
++ <uint32_t: file offset of the Nth value>
++ <uint32_t: length of the Nth value>
++ >
++ >
++
++ <uint32_t: offset of the begin of index table>
++ >
++
++
++
++# Processing
++
++In order to process a LMO file, an implementation would have to do the following steps:
++
++## Read Index
++
++1. Locate and open the archive file
++1. Seek to end of file - 4 bytes (sizeof(uint32_t))
++1. Read 32bit index offset and swap from network to native byte order
++1. Seek to index offset, calculate index length: filesize - index offset - 4
++1. Initialize a linked list for index table entries
++1. Read each index entry until the index length is reached, read and byteswap 4 * uint32_t for each step
++1. Seek to begin of file
++
++## Read Entry
++
++1. Calculate the unsigned 32bit hash of the entries key value (see "Hash Function" section below)
++1. Obtain the archive index
++1. Iterate through the linked index list, perform the following steps for each entry:
++ 1. Compare the entry hash value with the calculated hash from step 1
++ 2. If the hash values are equal proceed with step 4
++ 3. Select the next entry and repeat from step 3.1
++1. Seek to the file offset specified in the selected entry
++1. Read as much bytes as specified in the entry length into a buffer
++1. Return the buffer value
++
++# Hash Function
++
++The current LuCI-LMO implementation uses the "Super Fast Hash" function which was kindly put in the public domain by it's original author. See http://www.azillionmonkeys.com/qed/hash.html for details. Below is the C-Implementation of this function:
++
++
++ #if (defined(__GNUC__) && defined(__i386__))
++ #define sfh_get16(d) (*((const uint16_t *) (d)))
++ #else
++ #define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
++ +(uint32_t)(((const uint8_t *)(d))[0]) )
++ #endif
++
++ uint32_t sfh_hash(const char * data, int len)
++ {
++ uint32_t hash = len, tmp;
++ int rem;
++
++ if (len <= NULL) return 0;
++
++ rem = len & 3;
++ len >>= 2;
++
++ /* Main loop */
++ for (;len > 0; len--) {
++ hash += sfh_get16(data);
++ tmp = (sfh_get16(data+2) << 11) ^ hash;
++ hash = (hash << 16) ^ tmp;
++ data += 2*sizeof(uint16_t);
++ hash += hash >> 11;
++ }
++
++ /* Handle end cases */
++ switch (rem) {
++ case 3: hash += sfh_get16(data);
++ hash ^= hash << 16;
++ hash ^= data[sizeof(uint16_t)] << 18;
++ hash += hash >> 11;
++ break;
++ case 2: hash += sfh_get16(data);
++ hash ^= hash << 11;
++ hash += hash >> 17;
++ break;
++ case 1: hash += *data;
++ hash ^= hash << 10;
++ hash += hash >> 1;
++ }
++
++ /* Force "avalanching" of final 127 bits */
++ hash ^= hash << 3;
++ hash += hash >> 5;
++ hash ^= hash << 4;
++ hash += hash >> 17;
++ hash ^= hash << 25;
++ hash += hash >> 6;
++
++ return hash;
++ }
++
++
++# Reference Implementation
++
++A reference implementation can be found here:
++http://luci.subsignal.org/trac/browser/luci/trunk/libs/lmo/src
++
++The lmo_po2lmo.c executable implements a *.po to *.lmo conversation utility and lmo_lookup.c is a simple *.lmo test utility.
++Lua bindings for lmo are defined in lmo_lualib.c and associated headers.
+diff --git a/feeds/luci/documentation/LuCI-0.10.md b/feeds/luci/documentation/LuCI-0.10.md
+new file mode 100644
+index 0000000..5db9895
+--- /dev/null
++++ b/feeds/luci/documentation/LuCI-0.10.md
+@@ -0,0 +1,202 @@
++[[PageOutline(2-5, Table of Contents, floated)]]
++
++
++This document describes new features and incompatibilities to LuCI 0.9.x.
++It is targeted at module authors developing external addons to LuCI.
++
++# I18N Changes
++
++## API
++
++The call conventions for the i18n api changed, there is no dedicated translation
++key anymore and the english text is used for lookup instead. This was done to
++ease the maintenance of language files.
++
++Code that uses _translate()'' or ''i18n()_ must be changed as follows:
++
++
++ -- old style:
++ translate("some_text", "Some Text")
++ translatef("some_format_text", "Some formatted Text: %d", 123)
++
++ -- new style:
++ translate("Some Text")
++ translatef("Some formatted Text: %d", 123)
++
++
++Likewise for templates:
++
++
++ <!-- old style: -->
++ <%:some_text Some Text%>
++
++ <!-- new style: -->
++ <%:Some Text%>
++
++
++If code must support both LuCI 0.9.x and 0.10.x versions, it is suggested to write the calls as follows:
++
++ translate("Some Text", "Some Text")
++
++
++An alternative is wrapping translate() calls into a helper function:
++
++ function tr(key, alt)
++ return translate(key) or translate(alt) or alt
++ end
++
++
++... which is used as follows:
++
++ tr("some_key", "Some Text")
++
++
++## Translation File Format
++
++Translation catalogs are now maintained in *.po format files. During build those get translated
++into [*.lmo archives](http://luci.subsignal.org/trac/wiki/Documentation/LMO).
++
++LuCI ships a [utility script](http://luci.subsignal.org/trac/browser/luci/branches/luci-0.10/build/i18n-lua2po.pl)
++in the build/ directory to convert old Lua translation files to the *.po format. The generated *.po files should
++be placed in the appropriate subdirectories within the top po/ file in the LuCI source tree.
++
++### Components built within the LuCI tree
++
++If components using translations are built along with the LuCI tree, the newly added *.po file are automatically
++compiled into *.lmo archives during the build process. In order to bundle the appropriate *.lmo files into the
++corresponding *.ipk packages, component Makefiles must include a "PO" variable specifying the files to include.
++
++Given a module _applications/example/'' which uses ''po/en/example.po'' and ''po/en/example-extra.po_,
++the _applications/example/Makefile_ must be changed as follows:
++
++
++ PO = example example-extra
++
++ include ../../build/config.mk
++ include ../../build/module.mk
++
++
++### Standalone components
++
++Authors who externally package LuCI components must prepare required *.lmo archives themselves.
++To convert existing Lua based message catalogs to the *.po format, the build/i18n-lua2po.pl helper script can be used.
++In order to convert *.po files into *.lmo files, the standalone "po2lmo" utility must be compiled as follows:
++
++
++ $ svn co http://svn.luci.subsignal.org/luci/branches/luci-0.10/libs/lmo
++ $ cd lmo/
++ $ make
++ $ ./src/po2lmo translations.po translations.lmo
++
++
++Note that at the time of writing, the utility program needs Lua headers installed on the system in order to compile properly.
++
++# CBI
++
++## Datatypes
++
++The server side UVL validation has been dropped to reduce space requirements on the target.
++Instead it is possible to define datatypes for CBI widgets now:
++
++
++ opt = section:option(Value, "optname", "Title Text")
++ opt.datatype = "ip4addr"
++
++
++User provided data is validated once on the frontend via JavaScript and on the server side prior to saving it.
++A list of possible datatypes can be found in the [luci.cbi.datatypes](http://luci.subsignal.org/trac/browser/luci/branches/luci-0.10/libs/web/luasrc/cbi/datatypes.lua#L26) class.
++
++## Validation
++
++Server-sided validator function can now return custom error messages to provide better feedback on invalid input.
++
++
++ opt = section:option(Value, "optname", "Title Text")
++
++ function opt.validate(self, value, section)
++ if input_is_valid(value) then
++ return value
++ else
++ return nil, "The value is invalid because ..."
++ end
++ end
++
++
++## Tabs
++
++It is now possible to break up CBI sections into multiple tabs to better organize longer forms.
++The TypedSection and NamedSection classes gained two new functions to define tabs, _tab()'' and ''taboption()_.
++
++
++ sct = map:section(TypedSection, "name", "type", "Title Text")
++
++ sct:tab("general", "General Tab Title", "General Tab Description")
++ sct:tab("advanced", "Advanced Tab Title", "Advanced Tab Description")
++
++ opt = sct:taboption("general", Value, "optname", "Title Text")
++ ...
++
++
++The _tab()_ function is declares a new tab and takes up to three arguments:
++ * Internal name of the tab, must be unique within the section
++ * Title text of the tab
++ * Optional description text for the tab
++
++The _taboption()'' function wraps ''option()_ and assigns the option object to the given tab.
++It takes up to five arguments:
++
++ * Name of the tab to assign the option to
++ * Option type, e.g. Value or DynamicList
++ * Option name
++ * Title text of the option
++ * Optional description text of the option
++
++If tabs are used within a particular section, the _option()_ function must not be used,
++doing so results in undefined behaviour.
++
++## Hooks
++
++The CBI gained support for _hooks_ which can be used to trigger additional actions during the
++life-cycle of a map:
++
++
++ map = Map("config", "Title Text")
++
++ function map.on_commit(self)
++ -- do something if the UCI configuration got committed
++ end
++
++
++The following hooks are defined:
++
++|| on_cancel || The user pressed cancel within a multi-step Delegator or a SimpleForm instance ||
++|| on_init || The CBI is about to render the Map object ||
++|| on_parse || The CBI is about to read received HTTP form values ||
++|| on_save, on_before_save || The CBI is about to save modified UCI configuration files ||
++|| on_after_save || Modified UCI configuration files just got saved
++|| on_before_commit || The CBI is about to commit the changes ||
++|| on_commit, on_after_commit, on_before_apply || Modified configurations got committed and the CBI is about to restart associated services ||
++|| on_apply, on_after_apply || All changes where completely applied (only works on Map instances with the apply_on_parse attribute set) ||
++
++## Sortable Tables
++
++TypedSection instances which use the "cbi/tblsection" template may now use a new attribute _sortable_ to allow the user to reorder table rows.
++
++
++ sct = map:section(TypedSection, "name", "type", "Title Text")
++ sct.template = "cbi/tblsection"
++ sct.sortable = true
++
++ ...
++
++
++# JavaScript
++
++The LuCI 0.10 branch introduced a new JavaScript file _xhr.js_ which provides support routines for XMLHttpRequest operations.
++Each theme must include this file in the <head> area of the document for forms to work correctly.
++
++It should be included like this:
++
++
++ <script type="text/javascript" src="<%=resource%>/xhr.js"></script>
++
+\ No newline at end of file
+diff --git a/feeds/luci/documentation/Modules.md b/feeds/luci/documentation/Modules.md
+new file mode 100644
+index 0000000..2897df9
+--- /dev/null
++++ b/feeds/luci/documentation/Modules.md
+@@ -0,0 +1,94 @@
++# Categories
++
++The LuCI modules are divided into several category directories, namely:
++* applications (Single applications or plugins for other modules or applications)
++* i18n (Translation files)
++* libs (Independent libraries)
++* modules (Collections of applications)
++* themes (Frontend themes)
++
++Each module goes into a subdirectory of any of this category-directories.
++
++# Module directory
++The contents of a module directory are as follows:
++
++## Makefile
++This is the module's makefile. If the module just contains Lua sourcecode or resources then the following Makefile should suffice.
++
++ include ../../build/config.mk
++ include ../../build/module.mk
++
++
++If you have C(++) code in your module your Makefile should at least contain the following things.
++
++ include ../../build/config.mk
++ include ../../build/gccconfig.mk
++ include ../../build/module.mk
++
++ compile:
++ # Commands to compile and link your C-code
++ # and to install them under the dist/ hierarchy
++
++ clean: luaclean
++ # Commands to clean your compiled objects
++
++
++
++## src
++The *src* directory is reserved for C sourcecode.
++
++## luasrc
++*luasrc* contains all Lua sourcecode files. These will automatically be stripped or compiled depending on the Make target and are installed in the LuCI installation directory.
++
++## lua
++*lua* is equivalent to _luasrc_ but containing Lua files will be installed in the Lua document root.
++
++## htdocs
++All files under *htdocs* will be copied to the document root of the target webserver.
++
++## root
++All directories and files under *root* will be copied to the installation target as they are.
++
++## dist
++*dist* is reserved for the builder to create a working installation tree that will represent the filesystem on the target machine.
++*DO NOT* put any files there as they will get deleted.
++
++## ipkg
++*ipkg* contains IPKG package control files, like _preinst'', ''posinst'', ''prerm'', ''postrm''. ''conffiles_.
++See IPKG documentation for details.
++
++
++# OpenWRT feed integration
++If you want to add your module to the LuCI OpenWRT feed you have to add several sections to the contrib/package/luci/Makefile.
++
++For a Web UI applications this is:
++
++A package description:
++
++ define Package/luci-app-YOURMODULE
++ $(call Package/luci/webtemplate)
++ DEPENDS+=+some-package +some-other-package
++ TITLE:=SHORT DESCRIPTION OF YOURMODULE
++ endef
++
++
++
++A package installation target:
++
++ define Package/luci-app-YOURMODULE/install
++ $(call Package/luci/install/template,$(1),applications/YOURMODULE)
++ endef
++
++
++A module build instruction:
++
++ ifneq ($(CONFIG_PACKAGE_luci-app-YOURMODULE),)
++ PKG_SELECTED_MODULES+=applications/YOURMODULE
++ endif
++
++
++
++A build package call:
++
++ $(eval $(call BuildPackage,luci-app-YOURMODULE))
++
+diff --git a/feeds/luci/documentation/ModulesHowTo.md b/feeds/luci/documentation/ModulesHowTo.md
+new file mode 100644
+index 0000000..c4dbb98
+--- /dev/null
++++ b/feeds/luci/documentation/ModulesHowTo.md
+@@ -0,0 +1,153 @@
++*Note:* If you plan to integrate your module into LuCI, you should read the [wiki:Documentation/Modules Module Reference] before.
++
++This tutorial describes how to write your own modules for the LuCI WebUI.
++For this tutorial we refer to your LuCI installation direcotry as *lucidir_' (/usr/lib/lua/luci if you are working with an installed version) and assume your LuCI installation is reachable through your webserver via '_/cgi-bin/luci*.
++
++If you are working with the development environment replace *lucidir_' with '''''/path/to/your/luci/checkout''/applications/myapplication/luasrc''' (this is a default empty module you can use for your experiments) and your LuCI installation can probably be reached via http://localhost:8080/luci/ after you ran '_make runhttpd*.
++
++
++
++# Show me the way (The dispatching process)
++To write a module you need to understand the basics of the dispatching process in LuCI.
++LuCI uses a dispatching tree that will be built by executing the index-Function of every available controller.
++The CGI-environment variable *PATH_INFO* will be used as the path in this dispatching tree, e.g.: /cgi-bin/luci/foo/bar/baz
++will be resolved to foo.bar.baz
++
++To register a function in the dispatching tree, you can use the *entry*-function of _luci.dispatcher_. entry takes 4 arguments (2 are optional):
++
++ entry(path, target, title=nil, order=nil)
++
++
++* *path* is a table that describes the position in the dispatching tree: For example a path of {"foo", "bar", "baz"} would insert your node in foo.bar.baz.
++* *target* describes the action that will be taken when a user requests the node. There are several predefined ones of which the 3 most important (call, template, cbi) are described later on on this page
++* *title* defines the title that will be visible to the user in the menu (optional)
++* *order* is a number with which nodes on the same level will be sorted in the menu (optional)
++
++You can assign more attributes by manipulating the node table returned by the entry-function. A few example attributes:
++
++* *i18n* defines which translation file should be automatically loaded when the page gets requested
++* *dependent* protects plugins to be called out of their context if a parent node is missing
++* *leaf* stops parsing the request at this node and goes no further in the dispatching tree
++* *sysauth* requires the user to authenticate with a given system user account
++
++
++# It's all about names (Naming and the module file)
++Now that you know the basics about dispatching, we can start writing modules. But before you have to choose the category and name of your new digital child.
++
++We assume you want to create a new application "myapp" with a module "mymodule".
++
++So you have to create a new subdirectory *_lucidir''/controller/myapp''' with a file '_mymodule.lua* with the following content:
++
++ module("luci.controller.myapp.mymodule", package.seeall)
++
++ function index()
++
++ end
++
++
++The first line is required for Lua to correctly identify the module and create its scope.
++The index-Function will be used to register actions in the dispatching tree.
++
++
++
++# Teaching your new child (Actions)
++So it is there and has a name but it has no actions.
++
++We assume you want to reuse your module myapp.mymodule that you begun in the last step.
++
++
++## Actions
++Reopen *_lucidir_/controller/myapp/mymodule.lua* and just add a function to it so that its content looks like this example:
++
++
++ module("luci.controller.myapp.mymodule", package.seeall)
++
++ function index()
++ entry({"click", "here", "now"}, call("action_tryme"), "Click here", 10).dependent=false
++ end
++
++ function action_tryme()
++ luci.http.prepare_content("text/plain")
++ luci.http.write("Haha, rebooting now...")
++ luci.sys.reboot()
++ end
++
++
++And now type */cgi-bin/luci/click/here/now_' ('_[http://localhost:8080/luci/click/here/now]* if you are using the development environment) in your browser.
++
++You see these action functions simple have to be added to a dispatching entry.
++
++As you might or might not know: CGI specification requires you to send a Content-Type header before you can send your content. You will find several shortcuts (like the one used above) as well as redirecting functions in the module *luci.http*
++
++## Views
++If you only want to show the user a text or some interesting familiy photos it may be enough to use a HTML-template. These templates can also include some Lua code but be aware that writing whole office suites by only using these templates might be called "dirty" by other developers.
++
++Now let's create a little template *_lucidir_/view/myapp-mymodule/helloworld.htm* with the content:
++
++
++ <%+header%>
++ <h1><%:Hello World%></h1>
++ <%+footer%>
++
++
++
++and add the following line to the index-Function of your module file.
++
++ entry({"my", "new", "template"}, template("myapp-mymodule/helloworld"), "Hello world", 20).dependent=false
++
++
++Now type */cgi-bin/luci/my/new/template_' ('_[http://localhost:8080/luci/my/new/template]* if you are using the development environment) in your browser.
++
++You may notice those fancy <% %>-Tags, these are [wiki:Documentation/Templates|template markups] used by the LuCI template processor.
++It is always good to include header and footer at the beginning and end of a template as those create the default design and menu.
++
++## <a name=cbimodels></a> CBI models
++The CBI is one of the uber coolest features of LuCI. It creates a formular based user interface and saves its contents to a specific UCI config file. You only have to describe the structure of the configuration file in a CBI model file and Luci does the rest of the work. This includes generating, parsing and validating a XHTML form and reading and writing the UCI file.
++
++So let's be serious at least for this paragraph and create a real pratical example *_lucidir_/model/cbi/myapp-mymodule/netifaces.lua* with the following contents:
++
++
++ m = Map("network", "Network") -- We want to edit the uci config file /etc/config/network
++
++ s = m:section(TypedSection, "interface", "Interfaces") -- Especially the "interface"-sections
++ s.addremove = true -- Allow the user to create and remove the interfaces
++ function s:filter(value)
++ return value ~= "loopback" and value -- Don't touch loopback
++ end
++ s:depends("proto", "static") -- Only show those with "static"
++ s:depends("proto", "dhcp") -- or "dhcp" as protocol and leave PPPoE and PPTP alone
++
++ p = s:option(ListValue, "proto", "Protocol") -- Creates an element list (select box)
++ p:value("static", "static") -- Key and value pairs
++ p:value("dhcp", "DHCP")
++ p.default = "static"
++
++ s:option(Value, "ifname", "interface", "the physical interface to be used") -- This will give a simple textbox
++
++ s:option(Value, "ipaddr", translate("ip", "IP Address")) -- Ja, das ist eine i18n-Funktion ;-)
++
++ s:option(Value, "netmask", "Netmask"):depends("proto", "static") -- You may remember this "depends" function from above
++
++ mtu = s:option(Value, "mtu", "MTU")
++ mtu.optional = true -- This one is very optional
++
++ dns = s:option(Value, "dns", "DNS-Server")
++ dns:depends("proto", "static")
++ dns.optional = true
++ function dns:validate(value) -- Now, that's nifty, eh?
++ return value:match("[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") -- Returns nil if it doesn't match otherwise returns match
++ end
++
++ gw = s:option(Value, "gateway", "Gateway")
++ gw:depends("proto", "static")
++ gw.rmempty = true -- Remove entry if it is empty
++
++ return m -- Returns the map
++
++
++and of course don't forget to add something like this to your module's index-Function.
++
++ entry({"admin", "network", "interfaces"}, cbi("myapp-mymodule/netifaces"), "Network interfaces", 30).dependent=false
++
++
++There are many more features, see [wiki:Documentation/CBI the CBI reference] and the modules shipped with LuCI.
+diff --git a/feeds/luci/documentation/Templates.md b/feeds/luci/documentation/Templates.md
+new file mode 100644
+index 0000000..dc42c28
+--- /dev/null
++++ b/feeds/luci/documentation/Templates.md
+@@ -0,0 +1,65 @@
++LuCI has a simple regex based template processor which parses HTML-files to Lua functions and allows to store precompiled template files.
++The simplest form of a template is just an ordinary HTML-file. It will be printed out to the user as is.
++
++In LuCI every template is an object with an own scope. It can therefore be instanciated and each instance can has a different scope. As every template processor. LuCI supports several special markups. Those are enclosed in `<% %>`-Tags.
++
++By adding `-` (dash) right after the opening `<%` every whitespace before the markup will be stripped. Adding a `-` right before the closing `%>` will equivalently strip every whitespace behind the markup.
++
++
++# Builtin functions and markups
++## Including Lua code
++*Markup:*
++
++ <% code %>
++
++
++
++## Writing variables and function values
++*Syntax:*
++
++ <% write (value) %>
++
++
++*Short-Markup:*
++
++ <%=value%>
++
++
++## Including templates
++*Syntax:*
++
++ <% include (templatename) %>
++
++
++*Short-Markup:*
++
++ <%+templatename%>
++
++
++
++## Translating
++*Syntax:*
++
++ <%= translate("Text to translate") %>
++
++
++
++*Short-Markup:*
++
++ <%:Text to translate%>
++
++
++
++## Commenting
++*Markup:*
++
++ <%# comment %>
++
++
++# Builtin constants
++| Name | Value |
++---------|---------
++|`REQUEST_URI`|The current URL (without server part)|
++|`controller`|Path to the Luci main dispatcher|
++|`resource`|Path to the resource directory|
++|`media`|Path to the active theme directory|
+diff --git a/feeds/luci/documentation/ThemesHowTo.md b/feeds/luci/documentation/ThemesHowTo.md
+new file mode 100644
+index 0000000..32154c7
+--- /dev/null
++++ b/feeds/luci/documentation/ThemesHowTo.md
+@@ -0,0 +1,76 @@
++# HowTo: Create Themes
++*Note:* You should read the [Module Reference](Modules.md) and the [Template Reference](Templates.md) before.
++
++We assume you want to call your new theme _mytheme_. Make sure you replace this by your module name everytime this is mentionend in this Howto.
++
++
++
++# Creating the structure
++At first create a new theme directory *themes/_mytheme_*.
++
++Create a _Makefile_ inside your theme directory with the following content:
++
++ include ../../build/config.mk
++ include ../../build/module.mk
++
++
++Create the following directory structure inside your theme directory.
++* ipkg
++* htdocs
++ * luci-static
++ * _mytheme_
++* luasrc
++ * view
++ * themes
++ * _mytheme_
++* root
++ * etc
++ * uci-defaults
++
++
++
++# Designing
++Create two LuCI HTML-Templates named _header.htm'' and ''footer.htm'' under *luasrc/view/themes/''mytheme_*.
++The _header.htm'' will be included at the beginning of each rendered page and the ''footer.htm_ at the end.
++So your _header.htm'' will probably contain a DOCTYPE description, headers, the menu and layout of the page and the ''footer.htm_ will close all remaining open tags and may add a footer bar but hey that's your choice you are the designer ;-).
++
++Just make sure your _header.htm_ *begins* with the following lines:
++
++ <%
++ require("luci.http").prepare_content("text/html")
++ -%>
++
++
++This makes sure your content will be sent to the client with the right content type. Of course you can adapt _text/html_ to your needs.
++
++
++Put any stylesheets, Javascripts, images, ... into *htdocs/luci-static/_mytheme_*.
++You should refer to this directory in your header and footer templates as: _<%=media%>''. That means for a stylesheet *htdocs/luci-static/''mytheme_/cascade.css* you would write:
++
++ <link rel="stylesheet" type="text/css" href="<%=media%>/cascade.css" />
++
++
++
++
++# Making the theme selectable
++If you are done with your work there are two last steps to do.
++To make your theme OpenWRT-capable and selectable on the settings page you should now create a file *root/etc/uci-defaults/luci-theme-_mytheme_* with the following contents:
++
++ #!/bin/sh
++ uci batch <<-EOF
++ set luci.themes.MyTheme=/luci-static/mytheme
++ commit luci
++ EOF
++
++
++and another file *ipkg/postinst* with the following content:
++
++ #!/bin/sh
++ [ -n "${IPKG_INSTROOT}" ] || {
++ ( . /etc/uci-defaults/luci-theme-mytheme ) && rm -f /etc/uci-defaults/luci-theme-mytheme
++ }
++
++
++This is some OpenWRT magic to correctly register the template with LuCI when it gets installed.
++
++That's all. Now send your theme to the LuCI developers to get it into the development repository - if you like.
+diff --git a/feeds/luci/documentation/api/index.html b/feeds/luci/documentation/api/index.html
+new file mode 100644
+index 0000000..c762b9b
+--- /dev/null
++++ b/feeds/luci/documentation/api/index.html
+@@ -0,0 +1,435 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><strong>Index</strong></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++</div> <!-- id="navigation" -->
++
++<div id="content">
++
++
++
++<h2>Modules</h2>
++<table class="module_list">
++<!--<tr><td colspan="2">Modules</td></tr>-->
++
++ <tr>
++ <td class="name"><a href="modules/luci.dispatcher.html">luci.dispatcher</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.http.html">luci.http</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.http.protocol.html">luci.http.protocol</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.http.protocol.date.html">luci.http.protocol.date</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.i18n.html">luci.i18n</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.ip.html">luci.ip</a></td>
++ <td class="summary">
++ LuCI IP calculation and netlink access library.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.ip.cidr.html">luci.ip.cidr</a></td>
++ <td class="summary">
++ IP CIDR Object.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.json.html">luci.json</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.jsonc.html">luci.jsonc</a></td>
++ <td class="summary">
++ LuCI JSON parsing and serialization library.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.jsonc.parser.html">luci.jsonc.parser</a></td>
++ <td class="summary">
++ LuCI JSON parser instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.model.ipkg.html">luci.model.ipkg</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.model.uci.html">luci.model.uci</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.rpcc.html">luci.rpcc</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.sys.html">luci.sys</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.sys.init.html">luci.sys.init</a></td>
++ <td class="summary">
++
++LuCI system utilities / init related functions.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.sys.iptparser.html">luci.sys.iptparser</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.sys.net.html">luci.sys.net</a></td>
++ <td class="summary">
++
++LuCI system utilities / network related functions.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.sys.process.html">luci.sys.process</a></td>
++ <td class="summary">
++
++LuCI system utilities / process related functions.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.sys.user.html">luci.sys.user</a></td>
++ <td class="summary">
++
++LuCI system utilities / user related functions.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.sys.wifi.html">luci.sys.wifi</a></td>
++ <td class="summary">
++
++LuCI system utilities / wifi related functions.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/luci.util.html">luci.util</a></td>
++ <td class="summary"></td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.html">nixio</a></td>
++ <td class="summary">
++ General POSIX IO library.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a></td>
++ <td class="summary">
++ Changes and improvements.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.CryptoHash.html">nixio.CryptoHash</a></td>
++ <td class="summary">
++ Cryptographical Hash and HMAC object.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.File.html">nixio.File</a></td>
++ <td class="summary">
++ Large File Object.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.README.html">nixio.README</a></td>
++ <td class="summary">
++ General Information.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.Socket.html">nixio.Socket</a></td>
++ <td class="summary">
++ Socket Object.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.TLSContext.html">nixio.TLSContext</a></td>
++ <td class="summary">
++ Transport Layer Security Context Object.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.TLSSocket.html">nixio.TLSSocket</a></td>
++ <td class="summary">
++ TLS Socket Object.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a></td>
++ <td class="summary">
++ Unified high-level I/O utility API for Files, Sockets and TLS-Sockets.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.bin.html">nixio.bin</a></td>
++ <td class="summary">
++ Binary operations and conversion.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.bit.html">nixio.bit</a></td>
++ <td class="summary">
++ Bitfield operators and mainpulation functions.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.crypto.html">nixio.crypto</a></td>
++ <td class="summary">
++ Cryptographical library.</td>
++ </tr>
++
++ <tr>
++ <td class="name"><a href="modules/nixio.fs.html">nixio.fs</a></td>
++ <td class="summary">
++ Low-level and high-level filesystem manipulation library.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/luadoc.css b/feeds/luci/documentation/api/luadoc.css
+new file mode 100644
+index 0000000..f9f9749
+--- /dev/null
++++ b/feeds/luci/documentation/api/luadoc.css
+@@ -0,0 +1,285 @@
++body {
++ margin-left: 1em;
++ margin-right: 1em;
++ font-family: arial, helvetica, geneva, sans-serif;
++ background-color:#ffffff; margin:0px;
++}
++
++code {
++ font-family: "Andale Mono", monospace;
++}
++
++tt {
++ font-family: "Andale Mono", monospace;
++}
++
++body, td, th { font-size: 11pt; }
++
++h1, h2, h3, h4 { margin-left: 0em; }
++
++textarea, pre, tt { font-size:10pt; }
++body, td, th { color:#000000; }
++small { font-size:0.85em; }
++h1 { font-size:1.5em; }
++h2 { font-size:1.25em; }
++h3 { font-size:1.15em; }
++h4 { font-size:1.06em; }
++
++a:link { font-weight:bold; color: #004080; text-decoration: none; }
++a:visited { font-weight:bold; color: #006699; text-decoration: none; }
++a:link:hover { text-decoration:underline; }
++hr { color:#cccccc }
++img { border-width: 0px; }
++
++
++h3 { padding: 1em 0 0.5em; }
++
++p { margin-left: 1em; }
++
++p.name {
++ font-family: "Andale Mono", monospace;
++ padding-top: 1em;
++ margin-left: 0em;
++}
++
++blockquote { margin-left: 3em; }
++
++pre.example {
++ background-color: rgb(245, 245, 245);
++ border-top-width: 1px;
++ border-right-width: 1px;
++ border-bottom-width: 1px;
++ border-left-width: 1px;
++ border-top-style: solid;
++ border-right-style: solid;
++ border-bottom-style: solid;
++ border-left-style: solid;
++ border-top-color: silver;
++ border-right-color: silver;
++ border-bottom-color: silver;
++ border-left-color: silver;
++ padding: 1em;
++ margin-left: 1em;
++ margin-right: 1em;
++ font-family: "Andale Mono", monospace;
++ font-size: smaller;
++}
++
++
++hr {
++ margin-left: 0em;
++ background: #00007f;
++ border: 0px;
++ height: 1px;
++}
++
++ul { list-style-type: disc; }
++
++table.index { border: 1px #00007f; }
++table.index td { text-align: left; vertical-align: top; }
++table.index ul { padding-top: 0em; margin-top: 0em; }
++
++table {
++ border: 1px solid black;
++ border-collapse: collapse;
++ margin: 1em auto;
++}
++th {
++ border: 1px solid black;
++ padding: 0.5em;
++}
++td {
++ border: 1px solid black;
++ padding: 0.5em;
++}
++div.header, div.footer { margin-left: 0em; }
++
++#container
++{
++ margin-left: 1em;
++ margin-right: 1em;
++ background-color: #f0f0f0;
++}
++
++#product
++{
++ text-align: center;
++ border-bottom: 1px solid #cccccc;
++ background-color: #ffffff;
++}
++
++#product big {
++ font-size: 2em;
++}
++
++#product_logo
++{
++}
++
++#product_name
++{
++}
++
++#product_description
++{
++}
++
++#main
++{
++ background-color: #f0f0f0;
++ border-left: 2px solid #cccccc;
++}
++
++#navigation
++{
++ float: left;
++ width: 18em;
++ margin: 0;
++ vertical-align: top;
++ background-color: #f0f0f0;
++ overflow:visible;
++}
++
++#navigation h1 {
++ background-color:#e7e7e7;
++ font-size:1.1em;
++ color:#000000;
++ text-align:left;
++ margin:0px;
++ padding:0.2em;
++ border-top:1px solid #dddddd;
++ border-bottom:1px solid #dddddd;
++}
++
++#navigation ul
++{
++ font-size:1em;
++ list-style-type: none;
++ padding: 0;
++ margin: 1px;
++}
++
++#navigation li
++{
++ text-indent: -1em;
++ margin: 0em 0em 0em 0.5em;
++ display: block;
++ padding: 3px 0px 0px 12px;
++}
++
++#navigation li li a
++{
++ padding: 0px 3px 0px -1em;
++}
++
++#content
++{
++ margin-left: 18em;
++ padding: 1em;
++ border-left: 2px solid #cccccc;
++ border-right: 2px solid #cccccc;
++ background-color: #ffffff;
++}
++
++#about
++{
++ clear: both;
++ margin: 0;
++ padding: 5px;
++ border-top: 2px solid #cccccc;
++ background-color: #ffffff;
++}
++
++@media print {
++ body {
++ font: 12pt "Times New Roman", "TimeNR", Times, serif;
++ }
++ a { font-weight:bold; color: #004080; text-decoration: underline; }
++
++ #main { background-color: #ffffff; border-left: 0px; }
++ #container { margin-left: 2%; margin-right: 2%; background-color: #ffffff; }
++
++ #content { margin-left: 0px; padding: 1em; border-left: 0px; border-right: 0px; background-color: #ffffff; }
++
++ #navigation { display: none;
++ }
++ pre.example {
++ font-family: "Andale Mono", monospace;
++ font-size: 10pt;
++ page-break-inside: avoid;
++ }
++}
++
++table.module_list td
++{
++ border-width: 1px;
++ padding: 3px;
++ border-style: solid;
++ border-color: #cccccc;
++}
++table.module_list td.name { background-color: #f0f0f0; }
++table.module_list td.summary { width: 100%; }
++
++table.file_list
++{
++ border-width: 1px;
++ border-style: solid;
++ border-color: #cccccc;
++ border-collapse: collapse;
++}
++table.file_list td
++{
++ border-width: 1px;
++ padding: 3px;
++ border-style: solid;
++ border-color: #cccccc;
++}
++table.file_list td.name { background-color: #f0f0f0; }
++table.file_list td.summary { width: 100%; }
++
++
++table.function_list
++{
++ border-width: 1px;
++ border-style: solid;
++ border-color: #cccccc;
++ border-collapse: collapse;
++}
++table.function_list td
++{
++ border-width: 1px;
++ padding: 3px;
++ border-style: solid;
++ border-color: #cccccc;
++}
++table.function_list td.name { background-color: #f0f0f0; }
++table.function_list td.summary { width: 100%; }
++
++
++table.table_list
++{
++ border-width: 1px;
++ border-style: solid;
++ border-color: #cccccc;
++ border-collapse: collapse;
++}
++table.table_list td
++{
++ border-width: 1px;
++ padding: 3px;
++ border-style: solid;
++ border-color: #cccccc;
++}
++table.table_list td.name { background-color: #f0f0f0; }
++table.table_list td.summary { width: 100%; }
++
++dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;}
++dl.function dd {padding: 0.5em 0;}
++dl.function h3 {margin: 0; font-size: medium;}
++
++dl.table dt {border-top: 1px solid #ccc; padding-top: 1em;}
++dl.table dd {padding-bottom: 1em;}
++dl.table h3 {padding: 0; margin: 0; font-size: medium;}
++
++#TODO: make module_list, file_list, function_list, table_list inherit from a list
++
+diff --git a/feeds/luci/documentation/api/modules/luci.dispatcher.html b/feeds/luci/documentation/api/modules/luci.dispatcher.html
+new file mode 100644
+index 0000000..4ae88fe
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.dispatcher.html
+@@ -0,0 +1,1151 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li><strong>luci.dispatcher</strong></li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.dispatcher</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#_">_</a>&nbsp;()</td>
++ <td class="summary">
++
++No-op function used to mark translation entries for menu labels.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#alias">alias</a>&nbsp;(...)</td>
++ <td class="summary">
++
++Create a redirect to another dispatching node.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#arcombine">arcombine</a>&nbsp;(trg1, trg2)</td>
++ <td class="summary">
++
++Create a combined dispatching target for non argv and argv requests.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#assign">assign</a>&nbsp;(path, clone, title, order)</td>
++ <td class="summary">
++
++Clone a node of the dispatching tree to another position.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#build_url">build_url</a>&nbsp;(...)</td>
++ <td class="summary">
++
++Build the URL relative to the server webroot from given virtual path.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#call">call</a>&nbsp;(name, ...)</td>
++ <td class="summary">
++
++Create a function-call dispatching target.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cbi">cbi</a>&nbsp;(model)</td>
++ <td class="summary">
++
++Create a CBI model dispatching target.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#createindex">createindex</a>&nbsp;()</td>
++ <td class="summary">
++
++Generate the dispatching index using the native file-cache based strategy.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#createtree">createtree</a>&nbsp;()</td>
++ <td class="summary">
++
++Create the dispatching tree from the index.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#dispatch">dispatch</a>&nbsp;(request)</td>
++ <td class="summary">
++
++Dispatches a LuCI virtual path.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#entry">entry</a>&nbsp;(path, target, title, order)</td>
++ <td class="summary">
++
++Create a new dispatching node and define common parameters.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#error404">error404</a>&nbsp;(message)</td>
++ <td class="summary">
++
++Send a 404 error code and render the "error404" template if available.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#error500">error500</a>&nbsp;(message)</td>
++ <td class="summary">
++
++Send a 500 error code and render the "error500" template if available.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#firstchild">firstchild</a>&nbsp;()</td>
++ <td class="summary">
++
++Alias the first (lowest order) page automatically
++
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#form">form</a>&nbsp;(model)</td>
++ <td class="summary">
++
++Create a CBI form model dispatching target.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#get">get</a>&nbsp;(...)</td>
++ <td class="summary">
++
++Fetch or create a dispatching node without setting the target module or
++
++enabling the node.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#httpdispatch">httpdispatch</a>&nbsp;(request)</td>
++ <td class="summary">
++
++Dispatch an HTTP request.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#modifier">modifier</a>&nbsp;(func, order)</td>
++ <td class="summary">
++
++Register a tree modifier.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#node">node</a>&nbsp;(...)</td>
++ <td class="summary">
++
++Fetch or create a new dispatching node.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#node_childs">node_childs</a>&nbsp;(node)</td>
++ <td class="summary">
++
++Return a sorted table of visible childs within a given node
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#node_visible">node_visible</a>&nbsp;(node)</td>
++ <td class="summary">
++
++Check whether a dispatch node shall be visible
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#rewrite">rewrite</a>&nbsp;(n, ...)</td>
++ <td class="summary">
++
++Rewrite the first x path values of the request.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#template">template</a>&nbsp;(name)</td>
++ <td class="summary">
++
++Create a template render dispatching target.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#translate">translate</a>&nbsp;(text)</td>
++ <td class="summary">
++
++Access the luci.i18n translate() api.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="_"></a><strong>_</strong>&nbsp;()</dt>
++<dd>
++
++
++No-op function used to mark translation entries for menu labels.
++
++This function does not actually translate the given argument but
++is used by build/i18n-scan.pl to find translatable entries.
++
++
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="alias"></a><strong>alias</strong>&nbsp;(...)</dt>
++<dd>
++
++
++Create a redirect to another dispatching node.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ...: Virtual path destination
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="arcombine"></a><strong>arcombine</strong>&nbsp;(trg1, trg2)</dt>
++<dd>
++
++
++Create a combined dispatching target for non argv and argv requests.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ trg1: Overview Target
++ </li>
++
++ <li>
++ trg2: Detail Target
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="assign"></a><strong>assign</strong>&nbsp;(path, clone, title, order)</dt>
++<dd>
++
++
++Clone a node of the dispatching tree to another position.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Virtual path destination
++ </li>
++
++ <li>
++ clone: Virtual path source
++ </li>
++
++ <li>
++ title: Destination node title (optional)
++ </li>
++
++ <li>
++ order: Destination node order value (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Dispatching tree node
++
++
++
++</dd>
++
++
++
++
++<dt><a name="build_url"></a><strong>build_url</strong>&nbsp;(...)</dt>
++<dd>
++
++
++Build the URL relative to the server webroot from given virtual path.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ...: Virtual path
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Relative URL
++
++
++
++</dd>
++
++
++
++
++<dt><a name="call"></a><strong>call</strong>&nbsp;(name, ...)</dt>
++<dd>
++
++
++Create a function-call dispatching target.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: Target function of local controller
++ </li>
++
++ <li>
++ ...: Additional parameters passed to the function
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cbi"></a><strong>cbi</strong>&nbsp;(model)</dt>
++<dd>
++
++
++Create a CBI model dispatching target.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ model: CBI model to be rendered
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="createindex"></a><strong>createindex</strong>&nbsp;()</dt>
++<dd>
++
++
++Generate the dispatching index using the native file-cache based strategy.
++
++
++
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="createtree"></a><strong>createtree</strong>&nbsp;()</dt>
++<dd>
++
++
++Create the dispatching tree from the index.
++
++Build the index before if it does not exist yet.
++
++
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="dispatch"></a><strong>dispatch</strong>&nbsp;(request)</dt>
++<dd>
++
++
++Dispatches a LuCI virtual path.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ request: Virtual path
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="entry"></a><strong>entry</strong>&nbsp;(path, target, title, order)</dt>
++<dd>
++
++
++Create a new dispatching node and define common parameters.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Virtual path
++ </li>
++
++ <li>
++ target: Target function to call when dispatched.
++ </li>
++
++ <li>
++ title: Destination node title
++ </li>
++
++ <li>
++ order: Destination node order value (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Dispatching tree node
++
++
++
++</dd>
++
++
++
++
++<dt><a name="error404"></a><strong>error404</strong>&nbsp;(message)</dt>
++<dd>
++
++
++Send a 404 error code and render the "error404" template if available.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ message: Custom error message (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++false
++
++
++
++</dd>
++
++
++
++
++<dt><a name="error500"></a><strong>error500</strong>&nbsp;(message)</dt>
++<dd>
++
++
++Send a 500 error code and render the "error500" template if available.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ message: Custom error message (optional)#
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++false
++
++
++
++</dd>
++
++
++
++
++<dt><a name="firstchild"></a><strong>firstchild</strong>&nbsp;()</dt>
++<dd>
++
++
++Alias the first (lowest order) page automatically
++
++
++
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="form"></a><strong>form</strong>&nbsp;(model)</dt>
++<dd>
++
++
++Create a CBI form model dispatching target.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ model: CBI form model tpo be rendered
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="get"></a><strong>get</strong>&nbsp;(...)</dt>
++<dd>
++
++
++Fetch or create a dispatching node without setting the target module or
++
++enabling the node.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ...: Virtual path
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Dispatching tree node
++
++
++
++</dd>
++
++
++
++
++<dt><a name="httpdispatch"></a><strong>httpdispatch</strong>&nbsp;(request)</dt>
++<dd>
++
++
++Dispatch an HTTP request.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ request: LuCI HTTP Request object
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="modifier"></a><strong>modifier</strong>&nbsp;(func, order)</dt>
++<dd>
++
++
++Register a tree modifier.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ func: Modifier function
++ </li>
++
++ <li>
++ order: Modifier order value (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="node"></a><strong>node</strong>&nbsp;(...)</dt>
++<dd>
++
++
++Fetch or create a new dispatching node.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ...: Virtual path
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Dispatching tree node
++
++
++
++</dd>
++
++
++
++
++<dt><a name="node_childs"></a><strong>node_childs</strong>&nbsp;(node)</dt>
++<dd>
++
++
++Return a sorted table of visible childs within a given node
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ node: Dispatch node
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Ordered table of child node names
++
++
++
++</dd>
++
++
++
++
++<dt><a name="node_visible"></a><strong>node_visible</strong>&nbsp;(node)</dt>
++<dd>
++
++
++Check whether a dispatch node shall be visible
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ node: Dispatch node
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean indicating whether the node should be visible
++
++
++
++</dd>
++
++
++
++
++<dt><a name="rewrite"></a><strong>rewrite</strong>&nbsp;(n, ...)</dt>
++<dd>
++
++
++Rewrite the first x path values of the request.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ n: Number of path values to replace
++ </li>
++
++ <li>
++ ...: Virtual path to replace removed path values with
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="template"></a><strong>template</strong>&nbsp;(name)</dt>
++<dd>
++
++
++Create a template render dispatching target.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: Template to be rendered
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="translate"></a><strong>translate</strong>&nbsp;(text)</dt>
++<dd>
++
++
++Access the luci.i18n translate() api.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ text: Text to translate
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.http.html b/feeds/luci/documentation/api/modules/luci.http.html
+new file mode 100644
+index 0000000..ea04fc2
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.http.html
+@@ -0,0 +1,854 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li><strong>luci.http</strong></li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.http</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#build_querystring">build_querystring</a>&nbsp;(table)</td>
++ <td class="summary">
++
++Create a querystring out of a table of key - value pairs.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#close">close</a>&nbsp;()</td>
++ <td class="summary">
++
++Close the HTTP-Connection.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#content">content</a>&nbsp;()</td>
++ <td class="summary">
++
++Return the request content if the request was of unknown type.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#formvalue">formvalue</a>&nbsp;(name, noparse)</td>
++ <td class="summary">
++
++Get a certain HTTP input value or a table of all input values.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#formvaluetable">formvaluetable</a>&nbsp;(prefix)</td>
++ <td class="summary">
++
++Get a table of all HTTP input values with a certain prefix.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#getcookie">getcookie</a>&nbsp;(name)</td>
++ <td class="summary">
++
++Get the value of a certain HTTP-Cookie.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#getenv">getenv</a>&nbsp;(name)</td>
++ <td class="summary">
++
++Get the value of a certain HTTP environment variable
++
++or the environment table itself.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#header">header</a>&nbsp;(key, value)</td>
++ <td class="summary">
++
++Send a HTTP-Header.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#prepare_content">prepare_content</a>&nbsp;(mime)</td>
++ <td class="summary">
++
++Set the mime type of following content data.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#redirect">redirect</a>&nbsp;(url)</td>
++ <td class="summary">
++
++Redirects the client to a new URL and closes the connection.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#setfilehandler">setfilehandler</a>&nbsp;(callback)</td>
++ <td class="summary">
++
++Set a handler function for incoming user file uploads.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#source">source</a>&nbsp;()</td>
++ <td class="summary">
++
++Get the RAW HTTP input source
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#splice">splice</a>&nbsp;(fp, size)</td>
++ <td class="summary">
++
++Splice data from a filedescriptor to the client.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#status">status</a>&nbsp;(code, message)</td>
++ <td class="summary">
++
++Set the HTTP status code and status message.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#write">write</a>&nbsp;(content, src_err)</td>
++ <td class="summary">
++
++Send a chunk of content data to the client.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#write_json">write_json</a>&nbsp;(data)</td>
++ <td class="summary">
++
++Send the given data as JSON encoded string.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="build_querystring"></a><strong>build_querystring</strong>&nbsp;(table)</dt>
++<dd>
++
++
++Create a querystring out of a table of key - value pairs.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ table: Query string source table
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Encoded HTTP query string
++
++
++
++</dd>
++
++
++
++
++<dt><a name="close"></a><strong>close</strong>&nbsp;()</dt>
++<dd>
++
++
++Close the HTTP-Connection.
++
++
++
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="content"></a><strong>content</strong>&nbsp;()</dt>
++<dd>
++
++
++Return the request content if the request was of unknown type.
++
++
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>HTTP request body
++
++ <li>HTTP request body length
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="formvalue"></a><strong>formvalue</strong>&nbsp;(name, noparse)</dt>
++<dd>
++
++
++Get a certain HTTP input value or a table of all input values.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: Name of the GET or POST variable to fetch
++ </li>
++
++ <li>
++ noparse: Don't parse POST data before getting the value
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++HTTP input value or table of all input value
++
++
++
++</dd>
++
++
++
++
++<dt><a name="formvaluetable"></a><strong>formvaluetable</strong>&nbsp;(prefix)</dt>
++<dd>
++
++
++Get a table of all HTTP input values with a certain prefix.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ prefix: Prefix
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table of all HTTP input values with given prefix
++
++
++
++</dd>
++
++
++
++
++<dt><a name="getcookie"></a><strong>getcookie</strong>&nbsp;(name)</dt>
++<dd>
++
++
++Get the value of a certain HTTP-Cookie.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: Cookie Name
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing cookie data
++
++
++
++</dd>
++
++
++
++
++<dt><a name="getenv"></a><strong>getenv</strong>&nbsp;(name)</dt>
++<dd>
++
++
++Get the value of a certain HTTP environment variable
++
++or the environment table itself.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: Environment variable
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++HTTP environment value or environment table
++
++
++
++</dd>
++
++
++
++
++<dt><a name="header"></a><strong>header</strong>&nbsp;(key, value)</dt>
++<dd>
++
++
++Send a HTTP-Header.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ key: Header key
++ </li>
++
++ <li>
++ value: Header value
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="prepare_content"></a><strong>prepare_content</strong>&nbsp;(mime)</dt>
++<dd>
++
++
++Set the mime type of following content data.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ mime: Mimetype of following content
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="redirect"></a><strong>redirect</strong>&nbsp;(url)</dt>
++<dd>
++
++
++Redirects the client to a new URL and closes the connection.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ url: Target URL
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="setfilehandler"></a><strong>setfilehandler</strong>&nbsp;(callback)</dt>
++<dd>
++
++
++Set a handler function for incoming user file uploads.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ callback: Handler function
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="source"></a><strong>source</strong>&nbsp;()</dt>
++<dd>
++
++
++Get the RAW HTTP input source
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++HTTP LTN12 source
++
++
++
++</dd>
++
++
++
++
++<dt><a name="splice"></a><strong>splice</strong>&nbsp;(fp, size)</dt>
++<dd>
++
++
++Splice data from a filedescriptor to the client.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ fp: File descriptor
++ </li>
++
++ <li>
++ size: Bytes to splice (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="status"></a><strong>status</strong>&nbsp;(code, message)</dt>
++<dd>
++
++
++Set the HTTP status code and status message.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ code: Status code
++ </li>
++
++ <li>
++ message: Status message
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="write"></a><strong>write</strong>&nbsp;(content, src_err)</dt>
++<dd>
++
++
++Send a chunk of content data to the client.
++
++This function is as a valid LTN12 sink.
++If the content chunk is nil this function will automatically invoke close.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ content: Content chunk
++ </li>
++
++ <li>
++ src_err: Error object from source (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#close">
++ close
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="write_json"></a><strong>write_json</strong>&nbsp;(data)</dt>
++<dd>
++
++
++Send the given data as JSON encoded string.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ data: Data to send
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.http.protocol.conditionals.html b/feeds/luci/documentation/api/modules/luci.http.protocol.conditionals.html
+new file mode 100644
+index 0000000..9728815
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.http.protocol.conditionals.html
+@@ -0,0 +1,556 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li><strong>luci.http.protocol.conditionals</strong></li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.http.protocol.conditionals</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#if_match">if_match</a>&nbsp;(req, stat)</td>
++ <td class="summary">
++
++14.24 / If-Match
++
++Test whether the given message object contains an "If-Match" header and
++compare it against the given stat object.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#if_modified_since">if_modified_since</a>&nbsp;(req, stat)</td>
++ <td class="summary">
++
++14.25 / If-Modified-Since
++
++Test whether the given message object contains an "If-Modified-Since" header
++and compare it against the given stat object.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#if_none_match">if_none_match</a>&nbsp;(req, stat)</td>
++ <td class="summary">
++
++14.26 / If-None-Match
++
++Test whether the given message object contains an "If-None-Match" header and
++compare it against the given stat object.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#if_range">if_range</a>&nbsp;(req, stat)</td>
++ <td class="summary">
++
++14.27 / If-Range
++
++The If-Range header is currently not implemented due to the lack of general
++byte range stuff in luci.http.protocol .</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#if_unmodified_since">if_unmodified_since</a>&nbsp;(req, stat)</td>
++ <td class="summary">
++
++14.28 / If-Unmodified-Since
++
++Test whether the given message object contains an "If-Unmodified-Since"
++header and compare it against the given stat object.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#mk_etag">mk_etag</a>&nbsp;(stat)</td>
++ <td class="summary">
++
++Implement 14.19 / ETag.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="if_match"></a><strong>if_match</strong>&nbsp;(req, stat)</dt>
++<dd>
++
++
++14.24 / If-Match
++
++Test whether the given message object contains an "If-Match" header and
++compare it against the given stat object.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ req: HTTP request message object
++ </li>
++
++ <li>
++ stat: A file.stat object
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating whether the precondition is ok
++
++ <li>Alternative status code if the precondition failed
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="if_modified_since"></a><strong>if_modified_since</strong>&nbsp;(req, stat)</dt>
++<dd>
++
++
++14.25 / If-Modified-Since
++
++Test whether the given message object contains an "If-Modified-Since" header
++and compare it against the given stat object.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ req: HTTP request message object
++ </li>
++
++ <li>
++ stat: A file.stat object
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating whether the precondition is ok
++
++ <li>Alternative status code if the precondition failed
++
++ <li>Table containing extra HTTP headers if the precondition failed
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="if_none_match"></a><strong>if_none_match</strong>&nbsp;(req, stat)</dt>
++<dd>
++
++
++14.26 / If-None-Match
++
++Test whether the given message object contains an "If-None-Match" header and
++compare it against the given stat object.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ req: HTTP request message object
++ </li>
++
++ <li>
++ stat: A file.stat object
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating whether the precondition is ok
++
++ <li>Alternative status code if the precondition failed
++
++ <li>Table containing extra HTTP headers if the precondition failed
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="if_range"></a><strong>if_range</strong>&nbsp;(req, stat)</dt>
++<dd>
++
++
++14.27 / If-Range
++
++The If-Range header is currently not implemented due to the lack of general
++byte range stuff in luci.http.protocol . This function will always return
++false, 412 to indicate a failed precondition.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ req: HTTP request message object
++ </li>
++
++ <li>
++ stat: A file.stat object
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating whether the precondition is ok
++
++ <li>Alternative status code if the precondition failed
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="if_unmodified_since"></a><strong>if_unmodified_since</strong>&nbsp;(req, stat)</dt>
++<dd>
++
++
++14.28 / If-Unmodified-Since
++
++Test whether the given message object contains an "If-Unmodified-Since"
++header and compare it against the given stat object.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ req: HTTP request message object
++ </li>
++
++ <li>
++ stat: A file.stat object
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating whether the precondition is ok
++
++ <li>Alternative status code if the precondition failed
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="mk_etag"></a><strong>mk_etag</strong>&nbsp;(stat)</dt>
++<dd>
++
++
++Implement 14.19 / ETag.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ stat: A file.stat structure
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing the generated tag suitable for ETag headers
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.http.protocol.date.html b/feeds/luci/documentation/api/modules/luci.http.protocol.date.html
+new file mode 100644
+index 0000000..d89a723
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.http.protocol.date.html
+@@ -0,0 +1,410 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li><strong>luci.http.protocol.date</strong></li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.http.protocol.date</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#compare">compare</a>&nbsp;(d1, d2)</td>
++ <td class="summary">
++
++Compare two dates which can either be unix epoch times or HTTP date strings.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#to_http">to_http</a>&nbsp;(time)</td>
++ <td class="summary">
++
++Convert the given unix epoch time to valid HTTP date string.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#to_unix">to_unix</a>&nbsp;(data)</td>
++ <td class="summary">
++
++Parse given HTTP date string and convert it to unix epoch time.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#tz_offset">tz_offset</a>&nbsp;(tz)</td>
++ <td class="summary">
++
++Return the time offset in seconds between the UTC and given time zone.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="compare"></a><strong>compare</strong>&nbsp;(d1, d2)</dt>
++<dd>
++
++
++Compare two dates which can either be unix epoch times or HTTP date strings.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ d1: The first date or epoch time to compare
++ </li>
++
++ <li>
++ d2: The first date or epoch time to compare
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>-1 - if d1 is lower then d2
++
++ <li>0 - if both dates are equal
++
++ <li>1 - if d1 is higher then d2
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="to_http"></a><strong>to_http</strong>&nbsp;(time)</dt>
++<dd>
++
++
++Convert the given unix epoch time to valid HTTP date string.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ time: Unix epoch time
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing the formatted date
++
++
++
++</dd>
++
++
++
++
++<dt><a name="to_unix"></a><strong>to_unix</strong>&nbsp;(data)</dt>
++<dd>
++
++
++Parse given HTTP date string and convert it to unix epoch time.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ data: String containing the date
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Unix epoch time
++
++
++
++</dd>
++
++
++
++
++<dt><a name="tz_offset"></a><strong>tz_offset</strong>&nbsp;(tz)</dt>
++<dd>
++
++
++Return the time offset in seconds between the UTC and given time zone.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ tz: Symbolic or numeric timezone specifier
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Time offset to UTC in seconds
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.http.protocol.html b/feeds/luci/documentation/api/modules/luci.http.protocol.html
+new file mode 100644
+index 0000000..1d45ace
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.http.protocol.html
+@@ -0,0 +1,753 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li><strong>luci.http.protocol</strong></li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.http.protocol</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#header_source">header_source</a>&nbsp;(sock)</td>
++ <td class="summary">
++
++Creates a ltn12 source from the given socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#mimedecode_message_body">mimedecode_message_body</a>&nbsp;(src, msg, filecb)</td>
++ <td class="summary">
++
++Decode a mime encoded http message body with multipart/form-data
++
++Content-Type.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#parse_message_body">parse_message_body</a>&nbsp;(src, msg, filecb)</td>
++ <td class="summary">
++
++Try to extract and decode a http message body from the given ltn12 source.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#parse_message_header">parse_message_header</a>&nbsp;(src)</td>
++ <td class="summary">
++
++Try to extract an http message header including information like protocol
++
++version, message headers and resulting CGI environment variables from the
++given ltn12 source.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#urldecode">urldecode</a>&nbsp;(str, no_plus)</td>
++ <td class="summary">
++
++Decode an urlencoded string - optionally without decoding
++
++the "+" sign to " " - and return the decoded string.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#urldecode_message_body">urldecode_message_body</a>&nbsp;(src, msg)</td>
++ <td class="summary">
++
++Decode an urlencoded http message body with application/x-www-urlencoded
++
++Content-Type.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#urldecode_params">urldecode_params</a>&nbsp;(url, tbl)</td>
++ <td class="summary">
++
++Extract and split urlencoded data pairs, separated bei either "&" or ";"
++
++from given url or string.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#urlencode">urlencode</a>&nbsp;(str)</td>
++ <td class="summary">
++
++Encode given string to x-www-urlencoded format.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#urlencode_params">urlencode_params</a>&nbsp;(tbl)</td>
++ <td class="summary">
++
++Encode each key-value-pair in given table to x-www-urlencoded format,
++
++separated by "&".</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="header_source"></a><strong>header_source</strong>&nbsp;(sock)</dt>
++<dd>
++
++
++Creates a ltn12 source from the given socket. The source will return it's
++
++data line by line with the trailing \r\n stripped of.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ sock: Readable network socket
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Ltn12 source function
++
++
++
++</dd>
++
++
++
++
++<dt><a name="mimedecode_message_body"></a><strong>mimedecode_message_body</strong>&nbsp;(src, msg, filecb)</dt>
++<dd>
++
++
++Decode a mime encoded http message body with multipart/form-data
++
++Content-Type. Stores all extracted data associated with its parameter name
++in the params table withing the given message object. Multiple parameter
++values are stored as tables, ordinary ones as strings.
++If an optional file callback function is given then it is feeded with the
++file contents chunk by chunk and only the extracted file name is stored
++within the params table. The callback function will be called subsequently
++with three arguments:
++ o Table containing decoded (name, file) and raw (headers) mime header data
++ o String value containing a chunk of the file data
++ o Boolean which indicates wheather the current chunk is the last one (eof)
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ src: Ltn12 source function
++ </li>
++
++ <li>
++ msg: HTTP message object
++ </li>
++
++ <li>
++ filecb: File callback function (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Value indicating successful operation (not nil means "ok")
++
++ <li>String containing the error if unsuccessful
++
++</ol>
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#parse_message_header">
++ parse_message_header
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="parse_message_body"></a><strong>parse_message_body</strong>&nbsp;(src, msg, filecb)</dt>
++<dd>
++
++
++Try to extract and decode a http message body from the given ltn12 source.
++
++This function will examine the Content-Type within the given message object
++to select the appropriate content decoder.
++Currently the application/x-www-urlencoded and application/form-data
++mime types are supported. If the encountered content encoding can't be
++handled then the whole message body will be stored unaltered as "content"
++property within the given message object.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ src: Ltn12 source function
++ </li>
++
++ <li>
++ msg: HTTP message object
++ </li>
++
++ <li>
++ filecb: File data callback (optional, see mimedecode_message_body())
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Value indicating successful operation (not nil means "ok")
++
++ <li>String containing the error if unsuccessful
++
++</ol>
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#parse_message_header">
++ parse_message_header
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="parse_message_header"></a><strong>parse_message_header</strong>&nbsp;(src)</dt>
++<dd>
++
++
++Try to extract an http message header including information like protocol
++
++version, message headers and resulting CGI environment variables from the
++given ltn12 source.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ src: Ltn12 source function
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++HTTP message object
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#parse_message_body">
++ parse_message_body
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="urldecode"></a><strong>urldecode</strong>&nbsp;(str, no_plus)</dt>
++<dd>
++
++
++Decode an urlencoded string - optionally without decoding
++
++the "+" sign to " " - and return the decoded string.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ str: Input string in x-www-urlencoded format
++ </li>
++
++ <li>
++ no_plus: Don't decode "+" signs to spaces
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++The decoded string
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#urlencode">
++ urlencode
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="urldecode_message_body"></a><strong>urldecode_message_body</strong>&nbsp;(src, msg)</dt>
++<dd>
++
++
++Decode an urlencoded http message body with application/x-www-urlencoded
++
++Content-Type. Stores all extracted data associated with its parameter name
++in the params table withing the given message object. Multiple parameter
++values are stored as tables, ordinary ones as strings.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ src: Ltn12 source function
++ </li>
++
++ <li>
++ msg: HTTP message object
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Value indicating successful operation (not nil means "ok")
++
++ <li>String containing the error if unsuccessful
++
++</ol>
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#parse_message_header">
++ parse_message_header
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="urldecode_params"></a><strong>urldecode_params</strong>&nbsp;(url, tbl)</dt>
++<dd>
++
++
++Extract and split urlencoded data pairs, separated bei either "&" or ";"
++
++from given url or string. Returns a table with urldecoded values.
++Simple parameters are stored as string values associated with the parameter
++name within the table. Parameters with multiple values are stored as array
++containing the corresponding values.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ url: The url or string which contains x-www-urlencoded form data
++ </li>
++
++ <li>
++ tbl: Use the given table for storing values (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing the urldecoded parameters
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#urlencode_params">
++ urlencode_params
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="urlencode"></a><strong>urlencode</strong>&nbsp;(str)</dt>
++<dd>
++
++
++Encode given string to x-www-urlencoded format.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ str: String to encode
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing the encoded data
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#urldecode">
++ urldecode
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="urlencode_params"></a><strong>urlencode_params</strong>&nbsp;(tbl)</dt>
++<dd>
++
++
++Encode each key-value-pair in given table to x-www-urlencoded format,
++
++separated by "&". Tables are encoded as parameters with multiple values by
++repeating the parameter name with each value.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ tbl: Table with the values
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing encoded values
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#urldecode_params">
++ urldecode_params
++ </a>
++
++</ul>
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.http.protocol.mime.html b/feeds/luci/documentation/api/modules/luci.http.protocol.mime.html
+new file mode 100644
+index 0000000..0b5ce0c
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.http.protocol.mime.html
+@@ -0,0 +1,326 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li><strong>luci.http.protocol.mime</strong></li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.http.protocol.mime</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#to_ext">to_ext</a>&nbsp;(mimetype)</td>
++ <td class="summary">
++
++Return corresponding extension for a given mime type or nil if the
++
++given mime-type is unknown.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#to_mime">to_mime</a>&nbsp;(filename)</td>
++ <td class="summary">
++
++Extract extension from a filename and return corresponding mime-type or
++
++"application/octet-stream" if the extension is unknown.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="to_ext"></a><strong>to_ext</strong>&nbsp;(mimetype)</dt>
++<dd>
++
++
++Return corresponding extension for a given mime type or nil if the
++
++given mime-type is unknown.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ mimetype: The mimetype to retrieve the extension from
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String with the extension or nil for unknown type
++
++
++
++</dd>
++
++
++
++
++<dt><a name="to_mime"></a><strong>to_mime</strong>&nbsp;(filename)</dt>
++<dd>
++
++
++Extract extension from a filename and return corresponding mime-type or
++
++"application/octet-stream" if the extension is unknown.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ filename: The filename for which the mime type is guessed
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containign the determined mime type
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.i18n.html b/feeds/luci/documentation/api/modules/luci.i18n.html
+new file mode 100644
+index 0000000..0111cb2
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.i18n.html
+@@ -0,0 +1,564 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li><strong>luci.i18n</strong></li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.i18n</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#clear">clear</a>&nbsp;()</td>
++ <td class="summary">
++
++Clear the translation table.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#load">load</a>&nbsp;(file, lang, force)</td>
++ <td class="summary">
++
++Load a translation and copy its data into the translation table.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#loadc">loadc</a>&nbsp;(file, force)</td>
++ <td class="summary">
++
++Load a translation file using the default translation language.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#setlanguage">setlanguage</a>&nbsp;(lang)</td>
++ <td class="summary">
++
++Set the context default translation language.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#string">string</a>&nbsp;(key)</td>
++ <td class="summary">
++
++Return the translated value for a specific translation key
++
++and ensure that the returned value is a Lua string value.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#stringf">stringf</a>&nbsp;(key, ...)</td>
++ <td class="summary">
++
++Return the translated value for a specific translation key and use it as sprintf pattern.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#translate">translate</a>&nbsp;(key)</td>
++ <td class="summary">
++
++Return the translated value for a specific translation key.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#translatef">translatef</a>&nbsp;(key, ...)</td>
++ <td class="summary">
++
++Return the translated value for a specific translation key and use it as sprintf pattern.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="clear"></a><strong>clear</strong>&nbsp;()</dt>
++<dd>
++
++
++Clear the translation table.
++
++
++
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="load"></a><strong>load</strong>&nbsp;(file, lang, force)</dt>
++<dd>
++
++
++Load a translation and copy its data into the translation table.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ file: Language file
++ </li>
++
++ <li>
++ lang: Two-letter language code
++ </li>
++
++ <li>
++ force: Force reload even if already loaded (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Success status
++
++
++
++</dd>
++
++
++
++
++<dt><a name="loadc"></a><strong>loadc</strong>&nbsp;(file, force)</dt>
++<dd>
++
++
++Load a translation file using the default translation language.
++
++Alternatively load the translation of the fallback language.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ file: Language file
++ </li>
++
++ <li>
++ force: Force reload even if already loaded (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="setlanguage"></a><strong>setlanguage</strong>&nbsp;(lang)</dt>
++<dd>
++
++
++Set the context default translation language.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ lang: Two-letter language code
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="string"></a><strong>string</strong>&nbsp;(key)</dt>
++<dd>
++
++
++Return the translated value for a specific translation key
++
++and ensure that the returned value is a Lua string value.
++This is the same as calling <code>tostring(translate(...))</code>
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ key: Default translation text
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Translated string
++
++
++
++</dd>
++
++
++
++
++<dt><a name="stringf"></a><strong>stringf</strong>&nbsp;(key, ...)</dt>
++<dd>
++
++
++Return the translated value for a specific translation key and use it as sprintf pattern.
++
++Ensure that the returned value is a Lua string value.
++This is the same as calling <code>tostring(translatef(...))</code>
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ key: Default translation text
++ </li>
++
++ <li>
++ ...: Format parameters
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Translated and formatted string
++
++
++
++</dd>
++
++
++
++
++<dt><a name="translate"></a><strong>translate</strong>&nbsp;(key)</dt>
++<dd>
++
++
++Return the translated value for a specific translation key.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ key: Default translation text
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Translated string
++
++
++
++</dd>
++
++
++
++
++<dt><a name="translatef"></a><strong>translatef</strong>&nbsp;(key, ...)</dt>
++<dd>
++
++
++Return the translated value for a specific translation key and use it as sprintf pattern.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ key: Default translation text
++ </li>
++
++ <li>
++ ...: Format parameters
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Translated and formatted string
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.ip.cidr.html b/feeds/luci/documentation/api/modules/luci.ip.cidr.html
+new file mode 100644
+index 0000000..28fb21d
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.ip.cidr.html
+@@ -0,0 +1,1269 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li><strong>luci.ip.cidr</strong></li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>luci.ip.cidr</code></h1>
++
++<p>
++ IP CIDR Object.
++ Represents an IPv4 or IPv6 address range.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.is4">cidr:is4</a>&nbsp;()</td>
++ <td class="summary">
++
++Checks whether the CIDR instance is an IPv4 address range
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.is4rfc1918">cidr:is4rfc1918</a>&nbsp;()</td>
++ <td class="summary">
++
++Checks whether the CIDR instance is within the private RFC1918 address space
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.is4linklocal">cidr:is4linklocal</a>&nbsp;()</td>
++ <td class="summary">
++
++Checks whether the CIDR instance is an IPv4 link local (Zeroconf) address
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.is6">cidr:is6</a>&nbsp;()</td>
++ <td class="summary">
++
++Checks whether the CIDR instance is an IPv6 address range
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.is6linklocal">cidr:is6linklocal</a>&nbsp;()</td>
++ <td class="summary">
++
++Checks whether the CIDR instance is an IPv6 link local address
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.is6mapped4">cidr:is6mapped4</a>&nbsp;()</td>
++ <td class="summary">
++
++Checks whether the CIDR instance is an IPv6 mapped IPv4 address
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.lower">cidr:lower</a>&nbsp;(addr)</td>
++ <td class="summary">
++
++Checks whether this CIDR instance is lower than the given argument.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.higher">cidr:higher</a>&nbsp;(addr)</td>
++ <td class="summary">
++
++Checks whether this CIDR instance is higher than the given argument.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.equal">cidr:equal</a>&nbsp;(addr)</td>
++ <td class="summary">
++
++Checks whether this CIDR instance is equal to the given argument.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.prefix">cidr:prefix</a>&nbsp;(mask)</td>
++ <td class="summary">
++
++Get or set prefix size of CIDR instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.network">cidr:network</a>&nbsp;(mask)</td>
++ <td class="summary">
++
++Derive network address of CIDR instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.host">cidr:host</a>&nbsp;()</td>
++ <td class="summary">
++
++Derive host address of CIDR instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.mask">cidr:mask</a>&nbsp;(mask)</td>
++ <td class="summary">
++
++Derive netmask of CIDR instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.broadcast">cidr:broadcast</a>&nbsp;(mask)</td>
++ <td class="summary">
++
++Derive broadcast address of CIDR instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.mapped4">cidr:mapped4</a>&nbsp;()</td>
++ <td class="summary">
++
++Derive mapped IPv4 address of CIDR instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.contains">cidr:contains</a>&nbsp;(addr)</td>
++ <td class="summary">
++
++Test whether CIDR contains given range.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.add">cidr:add</a>&nbsp;(amount, inplace)</td>
++ <td class="summary">
++
++Add given amount to CIDR instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.sub">cidr:sub</a>&nbsp;(amount, inplace)</td>
++ <td class="summary">
++
++Substract given amount from CIDR instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.minhost">cidr:minhost</a>&nbsp;()</td>
++ <td class="summary">
++
++Calculate the lowest possible host address within this CIDR instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.maxhost">cidr:maxhost</a>&nbsp;()</td>
++ <td class="summary">
++
++Calculate the highest possible host address within this CIDR instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cidr.string">cidr:string</a>&nbsp;()</td>
++ <td class="summary">
++
++Convert CIDR instance into string representation.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="cidr.is4"></a><strong>cidr:is4</strong>&nbsp;()</dt>
++<dd>
++
++
++Checks whether the CIDR instance is an IPv4 address range
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++<code>true</code> if the CIDR is an IPv4 range, else <code>false</code>
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#cidr.is6">
++ cidr:is6
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="cidr.is4rfc1918"></a><strong>cidr:is4rfc1918</strong>&nbsp;()</dt>
++<dd>
++
++
++Checks whether the CIDR instance is within the private RFC1918 address space
++
++
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("192.168.45.2/24")
++if addr:is4rfc1918() then
++ print("Is a private address")
++end</pre>
++
++
++
++<h3>Return value:</h3>
++<code>true</code> if the entire range of this CIDR lies within one of
++ the ranges <code>10.0.0.0-10.255.255.255</code>,
++ <code>172.16.0.0-172.31.0.0</code> or
++ <code>192.168.0.0-192.168.255.255</code>, else <code>false</code>.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.is4linklocal"></a><strong>cidr:is4linklocal</strong>&nbsp;()</dt>
++<dd>
++
++
++Checks whether the CIDR instance is an IPv4 link local (Zeroconf) address
++
++
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("169.254.34.125")
++if addr:is4linklocal() then
++ print("Is a zeroconf address")
++end</pre>
++
++
++
++<h3>Return value:</h3>
++<code>true</code> if the entire range of this CIDR lies within the range
++ the range <code>169.254.0.0-169.254.255.255</code>, else <code>false</code>.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.is6"></a><strong>cidr:is6</strong>&nbsp;()</dt>
++<dd>
++
++
++Checks whether the CIDR instance is an IPv6 address range
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++<code>true</code> if the CIDR is an IPv6 range, else <code>false</code>
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#cidr.is4">
++ cidr:is4
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="cidr.is6linklocal"></a><strong>cidr:is6linklocal</strong>&nbsp;()</dt>
++<dd>
++
++
++Checks whether the CIDR instance is an IPv6 link local address
++
++
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("fe92:53a:3216:af01:221:63ff:fe75:aa17/64")
++if addr:is6linklocal() then
++ print("Is a linklocal address")
++end</pre>
++
++
++
++<h3>Return value:</h3>
++<code>true</code> if the entire range of this CIDR lies within the range
++ the <code>fe80::/10</code> range, else <code>false</code>.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.is6mapped4"></a><strong>cidr:is6mapped4</strong>&nbsp;()</dt>
++<dd>
++
++
++Checks whether the CIDR instance is an IPv6 mapped IPv4 address
++
++
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("::ffff:192.168.1.1")
++if addr:is6mapped4() then
++ print("Is a mapped IPv4 address")
++end</pre>
++
++
++
++<h3>Return value:</h3>
++<code>true</code> if the address is an IPv6 mapped IPv4 address in the
++ form <code>::ffff:1.2.3.4</code>.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.lower"></a><strong>cidr:lower</strong>&nbsp;(addr)</dt>
++<dd>
++
++
++Checks whether this CIDR instance is lower than the given argument.
++The comparisation follows these rules:
++<ul><li>An IPv4 address is always lower than an IPv6 address</li>
++<li>Prefix sizes are ignored</li></ul>
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ addr: A <code>luci.ip.cidr</code> instance or a string convertable by
++ <code>luci.ip.new()</code> to compare against.
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("192.168.1.1")
++print(addr:lower(addr)) -- false
++print(addr:lower("10.10.10.10/24")) -- false
++print(addr:lower(luci.ip.new("::1"))) -- true
++print(addr:lower(luci.ip.new("192.168.200.1"))) -- true</pre>
++
++
++
++<h3>Return value:</h3>
++<code>true</code> if this CIDR is lower than the given address,
++ else <code>false</code>.
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#cidr.higher">
++ cidr:higher
++ </a>
++
++ <li><a href="#cidr.equal">
++ cidr:equal
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="cidr.higher"></a><strong>cidr:higher</strong>&nbsp;(addr)</dt>
++<dd>
++
++
++Checks whether this CIDR instance is higher than the given argument.
++The comparisation follows these rules:
++<ul><li>An IPv4 address is always lower than an IPv6 address</li>
++<li>Prefix sizes are ignored</li></ul>
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ addr: A <code>luci.ip.cidr</code> instance or a string convertable by
++ <code>luci.ip.new()</code> to compare against.
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("192.168.1.1")
++print(addr:higher(addr)) -- false
++print(addr:higher("10.10.10.10/24")) -- true
++print(addr:higher(luci.ip.new("::1"))) -- false
++print(addr:higher(luci.ip.new("192.168.200.1"))) -- false</pre>
++
++
++
++<h3>Return value:</h3>
++<code>true</code> if this CIDR is higher than the given address,
++ else <code>false</code>.
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#cidr.lower">
++ cidr:lower
++ </a>
++
++ <li><a href="#cidr.equal">
++ cidr:equal
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="cidr.equal"></a><strong>cidr:equal</strong>&nbsp;(addr)</dt>
++<dd>
++
++
++Checks whether this CIDR instance is equal to the given argument.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ addr: A <code>luci.ip.cidr</code> instance or a string convertable by
++ <code>luci.ip.new()</code> to compare against.
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("192.168.1.1")
++print(addr:equal(addr)) -- true
++print(addr:equal("192.168.1.1")) -- true
++print(addr:equal(luci.ip.new("::1"))) -- false
++
++local addr6 = luci.ip.new("::1")
++print(addr6:equal("0:0:0:0:0:0:0:1/64")) -- true
++print(addr6:equal(luci.ip.new("fe80::221:63ff:fe75:aa17"))) -- false</pre>
++
++
++
++<h3>Return value:</h3>
++<code>true</code> if this CIDR is equal to the given address,
++ else <code>false</code>.
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#cidr.lower">
++ cidr:lower
++ </a>
++
++ <li><a href="#cidr.higher">
++ cidr:higher
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="cidr.prefix"></a><strong>cidr:prefix</strong>&nbsp;(mask)</dt>
++<dd>
++
++
++Get or set prefix size of CIDR instance.
++If the optional mask parameter is given, the prefix size of this CIDR is altered
++else the current prefix size is returned.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ mask: Either a number containing the number of bits (<code>0..32</code>
++ for IPv4, <code>0..128</code> for IPv6) or a string containing a valid
++ netmask (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>local range = luci.ip.new("192.168.1.1/255.255.255.0")
++print(range:prefix()) -- 24
++
++range:prefix(16)
++print(range:prefix()) -- 16
++
++range:prefix("255.255.255.255")
++print(range:prefix()) -- 32</pre>
++
++
++
++<h3>Return value:</h3>
++Bit count of the current prefix size
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.network"></a><strong>cidr:network</strong>&nbsp;(mask)</dt>
++<dd>
++
++
++Derive network address of CIDR instance.
++
++Returns a new CIDR instance representing the network address of this instance
++with all host parts masked out. The used prefix size can be overridden by the
++optional mask parameter.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ mask: Either a number containing the number of bits (<code>0..32</code>
++ for IPv4, <code>0..128</code> for IPv6) or a string containing a valid
++ netmask (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>local range = luci.ip.new("192.168.62.243/255.255.0.0")
++print(range:network()) -- "192.168.0.0"
++print(range:network(24)) -- "192.168.62.0"
++print(range:network("255.255.255.0")) -- "192.168.62.0"
++
++local range6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
++print(range6:network()) -- "fd9b:62b3:9cc5::"</pre>
++
++
++
++<h3>Return value:</h3>
++CIDR instance representing the network address
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.host"></a><strong>cidr:host</strong>&nbsp;()</dt>
++<dd>
++
++
++Derive host address of CIDR instance.
++
++This function essentially constructs a copy of this CIDR with the prefix size
++set to <code>32</code> for IPv4 and <code>128</code> for IPv6.
++
++
++
++
++
++
++<h3>Usage:</h3>
++<pre>local range = luci.ip.new("172.19.37.45/16")
++print(range) -- "172.19.37.45/16"
++print(range:host()) -- "172.19.37.45"</pre>
++
++
++
++<h3>Return value:</h3>
++CIDR instance representing the host address
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.mask"></a><strong>cidr:mask</strong>&nbsp;(mask)</dt>
++<dd>
++
++
++Derive netmask of CIDR instance.
++
++Constructs a CIDR instance representing the netmask of this instance. The used
++prefix size can be overridden by the optional mask parameter.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ mask: Either a number containing the number of bits (<code>0..32</code>
++ for IPv4, <code>0..128</code> for IPv6) or a string containing a valid
++ netmask (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>local range = luci.ip.new("172.19.37.45/16")
++print(range:mask()) -- "255.255.0.0"
++print(range:mask(24)) -- "255.255.255.0"
++print(range:mask("255.0.0.0")) -- "255.0.0.0"</pre>
++
++
++
++<h3>Return value:</h3>
++CIDR instance representing the netmask
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.broadcast"></a><strong>cidr:broadcast</strong>&nbsp;(mask)</dt>
++<dd>
++
++
++Derive broadcast address of CIDR instance.
++
++Constructs a CIDR instance representing the broadcast address of this instance.
++The used prefix size can be overridden by the optional mask parameter.
++
++This function has no effect on IPv6 instances, it will return nothing in this
++case.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ mask: Either a number containing the number of bits (<code>0..32</code>
++ for IPv4, <code>0..128</code> for IPv6) or a string containing a valid
++ netmask (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>local range = luci.ip.new("172.19.37.45/16")
++print(range:broadcast()) -- "172.19.255.255"
++print(range:broadcast(24)) -- "172.19.37.255"
++print(range:broadcast("255.0.0.0")) -- "172.255.255.255"</pre>
++
++
++
++<h3>Return value:</h3>
++Return a new CIDR instance representing the broadcast address if this
++ instance is an IPv4 range, else return nothing.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.mapped4"></a><strong>cidr:mapped4</strong>&nbsp;()</dt>
++<dd>
++
++
++Derive mapped IPv4 address of CIDR instance.
++
++Constructs a CIDR instance representing the IPv4 address of the IPv6 mapped
++IPv4 address in this instance.
++
++This function has no effect on IPv4 instances or IPv6 instances which are not a
++mapped address, it will return nothing in this case.
++
++
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("::ffff:172.16.19.1")
++print(addr:mapped4()) -- "172.16.19.1"</pre>
++
++
++
++<h3>Return value:</h3>
++Return a new CIDR instance representing the IPv4 address if this
++ instance is an IPv6 mapped IPv4 address, else return nothing.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.contains"></a><strong>cidr:contains</strong>&nbsp;(addr)</dt>
++<dd>
++
++
++Test whether CIDR contains given range.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ addr: A <code>luci.ip.cidr</code> instance or a string convertable by
++ <code>luci.ip.new()</code> to test.
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>local range = luci.ip.new("10.24.0.0/255.255.0.0")
++print(range:contains("10.24.5.1")) -- true
++print(range:contains("::1")) -- false
++print(range:contains("10.0.0.0/8")) -- false
++
++local range6 = luci.ip.new("fe80::/10")
++print(range6:contains("fe80::221:63f:fe75:aa17/64")) -- true
++print(range6:contains("fd9b:6b3:c5:0:221:63f:fe75:aa17/64")) -- false</pre>
++
++
++
++<h3>Return value:</h3>
++<code>true</code> if this instance fully contains the given address else
++ <code>false</code>.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.add"></a><strong>cidr:add</strong>&nbsp;(amount, inplace)</dt>
++<dd>
++
++
++Add given amount to CIDR instance. If the result would overflow the maximum
++address space, the result is set to the highest possible address.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ amount: A numeric value between 0 and 0xFFFFFFFF, a
++ <code>luci.ip.cidr</code> instance or a string convertable by
++ <code>luci.ip.new()</code>.
++ </li>
++
++ <li>
++ inplace: If <code>true</code>, modify this instance instead of returning
++ a new derived CIDR instance.
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("192.168.1.1/24")
++print(addr:add(250)) -- "192.168.1.251/24"
++print(addr:add("0.0.99.0")) -- "192.168.100.1/24"
++
++addr:add(256, true) -- true
++print(addr) -- "192.168.2.1/24
++
++addr:add("255.0.0.0", true) -- false (overflow)
++print(addr) -- "255.255.255.255/24
++
++local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64")
++print(addr6:add(256)) -- "fe80::221:63f:fe75:ab17/64"
++print(addr6:add("::ffff:0")) -- "fe80::221:640:fe74:aa17/64"
++
++addr:add(256, true) -- true
++print(addr) -- "fe80::221:63f:fe75:ab17/64
++
++addr:add("ffff::", true) -- false (overflow)
++print(addr) -- "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/64"</pre>
++
++
++
++<h3>Return value:</h3>
++<ul>
++ <li>When adding inplace: Return <code>true</code> if the addition succeded
++ or <code>false</code> when the addition overflowed.</li>
++ <li>When deriving new CIDR: Return new instance representing the value of
++ this instance plus the added amount or the highest possible address if
++ the addition overflowed the available address space.</li></ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.sub"></a><strong>cidr:sub</strong>&nbsp;(amount, inplace)</dt>
++<dd>
++
++
++Substract given amount from CIDR instance. If the result would under, the lowest
++possible address is returned.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ amount: A numeric value between 0 and 0xFFFFFFFF, a
++ <code>luci.ip.cidr</code> instance or a string convertable by
++ <code>luci.ip.new()</code>.
++ </li>
++
++ <li>
++ inplace: If <code>true</code>, modify this instance instead of returning
++ a new derived CIDR instance.
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("192.168.1.1/24")
++print(addr:sub(256)) -- "192.168.0.1/24"
++print(addr:sub("0.168.0.0")) -- "192.0.1.1/24"
++
++addr:sub(256, true) -- true
++print(addr) -- "192.168.0.1/24
++
++addr:sub("255.0.0.0", true) -- false (underflow)
++print(addr) -- "0.0.0.0/24
++
++local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64")
++print(addr6:sub(256)) -- "fe80::221:63f:fe75:a917/64"
++print(addr6:sub("::ffff:0")) -- "fe80::221:63e:fe76:aa17/64"
++
++addr:sub(256, true) -- true
++print(addr) -- "fe80::221:63f:fe75:a917/64"
++
++addr:sub("ffff::", true) -- false (underflow)
++print(addr) -- "::/64"</pre>
++
++
++
++<h3>Return value:</h3>
++<ul>
++ <li>When substracting inplace: Return <code>true</code> if the substraction
++ succeded or <code>false</code> when the substraction underflowed.</li>
++ <li>When deriving new CIDR: Return new instance representing the value of
++ this instance minus the substracted amount or the lowest address if
++ the substraction underflowed.</li></ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.minhost"></a><strong>cidr:minhost</strong>&nbsp;()</dt>
++<dd>
++
++
++Calculate the lowest possible host address within this CIDR instance.
++
++
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("192.168.123.56/24")
++print(addr:minhost()) -- "192.168.123.1"
++
++local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
++print(addr6:minhost()) -- "fd9b:62b3:9cc5::1"</pre>
++
++
++
++<h3>Return value:</h3>
++Returns a new CIDR instance representing the lowest host address
++ within this range.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.maxhost"></a><strong>cidr:maxhost</strong>&nbsp;()</dt>
++<dd>
++
++
++Calculate the highest possible host address within this CIDR instance.
++
++
++
++
++
++
++<h3>Usage:</h3>
++<pre>local addr = luci.ip.new("192.168.123.56/24")
++print(addr:maxhost()) -- "192.168.123.254" (.255 is broadcast)
++
++local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
++print(addr6:maxhost()) -- "fd9b:62b3:9cc5:0:ffff:ffff:ffff:ffff"</pre>
++
++
++
++<h3>Return value:</h3>
++Returns a new CIDR instance representing the highest host address
++ within this range.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cidr.string"></a><strong>cidr:string</strong>&nbsp;()</dt>
++<dd>
++
++
++Convert CIDR instance into string representation.
++
++If the prefix size of instance is less than 32 for IPv4 or 128 for IPv6, the
++address is returned in the form "address/prefix" otherwise just "address".
++
++It is usually not required to call this function directly as CIDR objects
++define it as __tostring function in the associated metatable.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Returns a string representing the range or address of this CIDR instance
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.ip.html b/feeds/luci/documentation/api/modules/luci.ip.html
+new file mode 100644
+index 0000000..549a553
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.ip.html
+@@ -0,0 +1,934 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li><strong>luci.ip</strong></li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.ip</code></h1>
++
++<p>
++ LuCI IP calculation and netlink access library.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#new">new</a>&nbsp;(address, netmask)</td>
++ <td class="summary">
++
++Construct a new luci.ip.cidr instance and autodetect the address family.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#IPv4">IPv4</a>&nbsp;(address, netmask)</td>
++ <td class="summary">
++
++Construct a new IPv4 luci.ip.cidr instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#IPv6">IPv6</a>&nbsp;(address, netmask)</td>
++ <td class="summary">
++
++Construct a new IPv6 luci.ip.cidr instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#route">route</a>&nbsp;(address)</td>
++ <td class="summary">
++
++Determine the route leading to the given destination.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#routes">routes</a>&nbsp;(filter, callback)</td>
++ <td class="summary">
++
++Fetch all routes, optionally matching the given criteria.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#neighbors">neighbors</a>&nbsp;(filter, callback)</td>
++ <td class="summary">
++
++Fetches entries from the IPv4 ARP and IPv6 neighbour kernel table </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#link">link</a>&nbsp;(device)</td>
++ <td class="summary">
++
++Fetch basic device information </td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="new"></a><strong>new</strong>&nbsp;(address, netmask)</dt>
++<dd>
++
++
++Construct a new luci.ip.cidr instance and autodetect the address family.
++Throws an error if the given strings do not represent a valid address or
++if the given optional netmask is of a different family.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ address: String containing a valid IPv4 or IPv6 address, optionally
++with prefix size (CIDR notation) or netmask separated by slash.
++ </li>
++
++ <li>
++ netmask: String containing a valid IPv4 or IPv6 netmask or number
++containing a prefix size in bits (<code>0..32</code> for IPv4,
++<code>0..128</code> for IPv6). Overrides mask embedded in the first argument
++if specified. (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>addr = luci.ip.new("10.24.0.1/24")
++addr = luci.ip.new("10.24.0.1/255.255.255.0")
++addr = luci.ip.new("10.24.0.1", "255.255.255.0") -- separate netmask
++addr = luci.ip.new("10.24.0.1/24", 16) -- override netmask
++
++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64")
++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::")
++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::")
++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask</pre>
++
++
++
++<h3>Return value:</h3>
++A <code>luci.ip.cidr</code> object representing the given
++address/mask range.
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#IPv4">
++ IPv4
++ </a>
++
++ <li><a href="#IPv6">
++ IPv6
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="IPv4"></a><strong>IPv4</strong>&nbsp;(address, netmask)</dt>
++<dd>
++
++
++Construct a new IPv4 luci.ip.cidr instance.
++Throws an error if the given string does not represent a valid IPv4 address or
++if the given optional netmask is of a different family.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ address: String containing a valid IPv4, optionally with prefix size
++(CIDR notation) or netmask separated by slash.
++ </li>
++
++ <li>
++ netmask: String containing a valid IPv4 netmask or number
++containing a prefix size between <code>0</code> and <code>32</code> bit.
++Overrides mask embedded in the first argument if specified. (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>addr = luci.ip.IPv4("10.24.0.1/24")
++addr = luci.ip.IPv4("10.24.0.1/255.255.255.0")
++addr = luci.ip.IPv4("10.24.0.1", "255.255.255.0") -- separate netmask
++addr = luci.ip.IPv4("10.24.0.1/24", 16) -- override netmask</pre>
++
++
++
++<h3>Return value:</h3>
++A <code>luci.ip.cidr</code> object representing the given IPv4 range.
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#IPv6">
++ IPv6
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="IPv6"></a><strong>IPv6</strong>&nbsp;(address, netmask)</dt>
++<dd>
++
++
++Construct a new IPv6 luci.ip.cidr instance.
++Throws an error if the given string does not represent a valid IPv6 address or
++if the given optional netmask is of a different family.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ address: String containing a valid IPv6, optionally with prefix size
++(CIDR notation) or netmask separated by slash.
++ </li>
++
++ <li>
++ netmask: String containing a valid IPv4 netmask or number
++containing a prefix size between <code>0</code> and <code>128</code> bit.
++Overrides mask embedded in the first argument if specified. (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64")
++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::")
++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::")
++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask</pre>
++
++
++
++<h3>Return value:</h3>
++A <code>luci.ip.cidr</code> object representing the given IPv6 range.
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#IPv4">
++ IPv4
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="route"></a><strong>route</strong>&nbsp;(address)</dt>
++<dd>
++
++
++Determine the route leading to the given destination.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ address: A <code>luci.ip.cidr</code> instance or a string containing
++a valid IPv4 or IPv6 range as specified by <code>luci.ip.new()</code>.
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<ul>
++<li>Find default gateway by getting route to Google's public NS server
++<pre>rt = luci.ip.route("8.8.8.8")
++if rt ~= nil then
++ print("gateway is", rt.gw)
++end</pre></li>
++<li>Determine IPv6 upstream interface <pre>rt = luci.ip.route("2001::/7")
++if rt ~= nil then
++ print("ipv6 upstream device is", rt.dev)
++end</pre></li>
++</ul>
++
++
++
++<h3>Return value:</h3>
++<p>Table containing the fields described below.</p>
++<table id="routetable">
++<tr><th>Field</th><th>Description</th></tr>
++<tr><td><code>type</code><td>
++ <p>Route type with one of the following numeric values:</p>
++ <table>
++ <tr>
++ <td><code>1</code></td>
++ <td><code>RTN_UNICAST</code> - Gateway or direct route</td>
++ </tr>
++ <tr>
++ <td><code>2</code></td>
++ <td><code>RTN_LOCAL</code> - Accept locally</td>
++ </tr>
++ <tr>
++ <td><code>3</code></td>
++ <td><code>RTN_BROADCAST</code> -
++ Accept locally as broadcast send as broadcast</td>
++ </tr>
++ <tr>
++ <td><code>4</code></td>
++ <td><code>RTN_ANYCAST</code> -
++ Accept locally as broadcast but send as unicast</td>
++ </tr>
++ <tr>
++ <td><code>5</code></td>
++ <td><code>RTN_MULTICAST</code> - Multicast route</td>
++ </tr>
++ </table>
++</td></tr>
++<tr>
++ <td><code>family</code></td>
++ <td>Number containing the route family, <code>4</code> for IPv4 or
++ <code>6</code> for IPv6</td>
++</tr>
++<tr>
++ <td><code>dest</code></td>
++ <td>Destination <code>luci.ip.cidr</code> instance</td>
++</tr>
++<tr>
++ <td><code>gw</code></td>
++ <td>Gateway <code>luci.ip.cidr</code> instance (optional)</td>
++</tr>
++<tr>
++ <td><code>from</code></td>
++ <td>Source address <code>luci.ip.cidr</code> instance (optional)</td>
++</tr>
++<tr>
++ <td><code>src</code></td>
++ <td>Preferred source <code>luci.ip.cidr</code> instance (optional)</td>
++</tr>
++<tr>
++ <td><code>dev</code></td>
++ <td>String containing the name of the outgoing interface</td>
++</tr>
++<tr>
++ <td><code>iif</code></td>
++ <td>String containing the name of the incoming interface (optional)</td>
++</tr>
++<tr>
++ <td><code>table</code></td>
++ <td>Number of the associated routing table (<code>0..65535</code>)</td>
++</tr>
++<tr>
++ <td><code>proto</code></td>
++ <td>Number of the associated routing protocol</td>
++</tr>
++<tr>
++ <td><code>scope</code></td>
++ <td>Number describing the scope of the route, most commonly
++ <code>0</code> for global or <code>253</code> for on-link</td>
++</tr>
++<tr>
++ <td><code>metric</code></td>
++ <td>Number describing the route metric (optional)</td>
++</tr>
++<tr>
++ <td><code>expires</code></td>
++ <td>Number of seconds the prefix is valid (IPv6 only, optional)</td>
++</tr>
++<tr>
++ <td><code>error</code></td>
++ <td>Route destination error code (optional)</td>
++</tr>
++</table>
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#routes">
++ routes
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="routes"></a><strong>routes</strong>&nbsp;(filter, callback)</dt>
++<dd>
++
++
++Fetch all routes, optionally matching the given criteria.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ filter: <p>Table containing one or more of the possible filter
++critera described below (optional)</p><table>
++<tr><th>Field</th><th>Description</th></tr>
++<tr><td><code>family</code></td><td>
++ Number describing the address family to return - <code>4</code> selects
++ IPv4 routes, <code>6</code> IPv6 ones. Any other value selects both.
++</td></tr>
++<tr><td><code>iif</code></td><td>
++ String containing the incoming route interface to match.
++</td></tr>
++<tr><td><code>oif</code></td><td>
++ String containing the outgoing route interface to match.
++</td></tr>
++<tr><td><code>type</code></td><td>
++ Numeric type to match, e.g. <code>1</code> for unicast.
++</td></tr>
++<tr><td><code>scope</code></td><td>
++ Numeric scope to match, e.g. <code>253</code> for onlink.
++</td></tr>
++<tr><td><code>proto</code></td><td>
++ Numeric protocol to match, e.g. <code>2</code> for boot.
++</td></tr>
++<tr><td><code>table</code></td><td>
++ Numeric routing table to match (<code>0..65535</code>).
++</td></tr>
++<tr><td><code>gw</code></td><td>
++ String containing the gateway address to match. Can be in any notation
++ specified by <code>luci.ip.new()</code>. Prefix matching is performed when
++ comparing the routes, e.g. "192.168.1.0/24" would select routes with gateway
++ addresses <code>192.168.1.1 .. 192.168.1.255</code>.
++</td></tr>
++<tr><td><code>dest</code></td><td>
++ String containing the destination to match. Prefix matching is performed.
++</td></tr>
++<tr><td><code>from</code></td><td>
++ String containing the source address to match. Prefix matching is performed.
++</td></tr>
++<tr><td><code>src</code></td><td>
++ String containing the preferred source address to match.
++ Prefix matching is performed.
++</td></tr>
++<tr><td><code>dest_exact</code></td><td>
++ String containing the destination to match. Exact matching is performed,
++ e.g. <code>dest = "0.0.0.0/0"</code> would match <em>any</em> IPv4 route
++ while <code>dest_exact = "0.0.0.0/0"</code> will <em>only</em> match the
++ default route.
++</td></tr>
++<tr><td><code>from_exact</code></td><td>
++ String containing the source address to match. Exact matching is performed.
++</td></tr>
++</table>
++ </li>
++
++ <li>
++ callback: <p>Callback function to invoke for each found route
++instead of returning one table of route objects (optional)</p>
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<ul>
++<li>Find all IPv4 default routes:
++<pre>luci.ip.routes({ dest_exact = "0.0.0.0/0" }, function(rt)
++ print(rt.type, rt.gw, rt.dev)
++end)</pre></li>
++<li>Find all global IPv6 prefixes on the current system:
++<pre>luci.ip.routes({ from = "2001::/7" }, function(rt)
++ print(rt.from)
++end)</pre></li>
++<li>Fetch all IPv4 routes:
++<pre>routes = luci.ip.routes({ family = 4 })
++for _, rt in ipairs(routes) do
++ print(rt.dest, rt.gw, rt.dev)
++end</pre></li>
++</ul>
++
++
++
++<h3>Return value:</h3>
++If no callback function is provided, a table of routes
++<a href="#routetable">as specified by <code>luci.ip.route()</code></a>
++is returned. If a callback function is given, it is invoked for each route
++and nothing is returned.
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#route">
++ route
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="neighbors"></a><strong>neighbors</strong>&nbsp;(filter, callback)</dt>
++<dd>
++
++
++Fetches entries from the IPv4 ARP and IPv6 neighbour kernel table
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ filter: <p>Table containing one or more of the possible filter
++critera described below (optional)</p><table>
++<tr><th>Field</th><th>Description</th></tr>
++<tr><td><code>family</code></td><td>
++ Number describing the address family to return - <code>4</code> selects
++ IPv4 ARP, <code>6</code> select IPv6 neighbour entries. Any other value
++ selects both.
++</td></tr>
++<tr><td><code>dev</code></td><td>
++ String containing the associated interface to match.
++</td></tr>
++<tr><td><code>dest</code></td><td>
++ String containing the associated address to match. Can be in any notation
++ specified by <code>luci.ip.new()</code>. Prefix matching is performed when
++ comparing the addresses, e.g. "192.168.1.0/24" would select ARP entries
++ for <code>192.168.1.1 .. 192.168.1.255</code>.
++</td></tr>
++<tr><td><code>mac</code></td><td>
++ String containing MAC address to match.
++</td></tr>
++</table>
++ </li>
++
++ <li>
++ callback: <p>Callback function to invoke for each found neighbour
++entry instead of returning one table of neighbour entries (optional)</p>
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<ul>
++<li>Find all ARP neighbours in the LAN:
++<pre>luci.ip.neighbors({ dest = "192.168.0.0/16" }, function(n)
++ print(n.dest, n.mac)
++end)</pre></li>
++<li>Find all active IPv6 addresses of host with given MAC:
++<pre>luci.ip.neighbors({ family = 6, mac = "00:21:63:75:aa:17" },
++ function(n)
++ print(n.dest)
++ end)</pre></li>
++</ul>
++
++
++
++<h3>Return value:</h3>
++If no callback function is provided, a table of neighbour entries
++is returned. If a callback function is given, it is invoked for each entry
++and nothing is returned.
++
++A neighbour entry is a table containing the following fields:
++
++<table>
++<tr><th>Field</th><th>Description</th></tr>
++<tr>
++ <td><code>family</code></td>
++ <td>Number containing the neighbour entry family, <code>4</code> for IPv4
++ ARP or <code>6</code> for IPv6 NDP</td>
++</tr>
++<tr>
++ <td><code>dev</code></td>
++ <td>String containing the associated device of the neighbour entry</td>
++</tr>
++<tr>
++ <td><code>dest</code></td>
++ <td>IP address <code>luci.ip.cidr</code> instance</td>
++</tr>
++<tr>
++ <td><code>mac</code></td>
++ <td>String containing the associated MAC address</td>
++</tr>
++<tr>
++ <td><code>router</code></td>
++ <td>Boolean "true" if the neighbour entry is a router (IPv6, optional)</td>
++</tr>
++<tr>
++ <td><code>proxy</code></td>
++ <td>Boolean "true" if this is a proxy entry (optional)</td>
++</tr>
++<tr>
++ <td><code>incomplete</code></td>
++ <td>Boolean "true" if the entry is in incomplete state (optional)</td>
++</tr>
++<tr>
++ <td><code>reachable</code></td>
++ <td>Boolean "true" if the entry is in reachable state (optional)</td>
++</tr>
++<tr>
++ <td><code>stale</code></td>
++ <td>Boolean "true" if the entry is stale (optional)</td>
++</tr>
++<tr>
++ <td><code>delay</code></td>
++ <td>Boolean "true" if the entry is delayed (optional)</td>
++</tr>
++<tr>
++ <td><code>probe</code></td>
++ <td>Boolean "true" if the entry is in probe state (optional)</td>
++</tr>
++<tr>
++ <td><code>failed</code></td>
++ <td>Boolean "true" if the entry is in failed state (optional)</td>
++</tr>
++<tr>
++ <td><code>noarp</code></td>
++ <td>Boolean "true" if the entry is not caused by NDP or
++ ARP (optional)</td>
++</tr>
++<tr>
++ <td><code>permanent</code></td>
++ <td>Boolean "true" if the entry was statically configured from
++ userspace (optional)</td>
++</tr>
++</table>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="link"></a><strong>link</strong>&nbsp;(device)</dt>
++<dd>
++
++
++Fetch basic device information
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ device: String containing the network device to query
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<ul>
++<li>Test whether device br-lan exists:
++<pre>print(luci.ip.link("br-lan").name ~= nil)
++</pre></li>
++<li>Query MAC address of eth0:
++<pre>print(luci.ip.link("eth0").mac)
++</pre></li>
++</ul>
++
++
++
++<h3>Return value:</h3>
++If the given interface is found, a table containing the fields
++described below is returned, else an empty table.
++
++<table>
++<tr><th>Field</th><th>Description</th></tr>
++<tr>
++ <td><code>up</code></td>
++ <td>Boolean indicating whether the device is in IFF_RUNNING state</td>
++</tr>
++<tr>
++ <td><code>type</code></td>
++ <td>Numeric value indicating the type of the device, e.g. <code>1</code>
++ for ethernet.</td>
++</tr>
++<tr>
++ <td><code>name</code></td>
++ <td>String containing the name of the device</td>
++</tr>
++<tr>
++ <td><code>master</code></td>
++ <td>If queried device is a bridge port, string containing the name of
++ parent bridge device (optional)</td>
++</tr>
++<tr>
++ <td><code>mtu</code></td>
++ <td>Number containing the current MTU of the device</td>
++</tr>
++<tr>
++ <td><code>qlen</code></td>
++ <td>Number containing the TX queue length of the device</td>
++</tr>
++<tr>
++ <td><code>mac</code></td>
++ <td>String containing the link local address of the device in
++ dotted hex notation</td>
++</tr>
++</table>
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.json.html b/feeds/luci/documentation/api/modules/luci.json.html
+new file mode 100644
+index 0000000..761bd6e
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.json.html
+@@ -0,0 +1,598 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li><strong>luci.json</strong></li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>luci.json</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#ActiveDecoder">ActiveDecoder</a>&nbsp;(customnull)</td>
++ <td class="summary">
++
++Create a new Active JSON-Decoder.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#ActiveDecoder.get">ActiveDecoder:get</a>&nbsp;()</td>
++ <td class="summary">
++
++Fetches one JSON-object from given source
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Decoder">Decoder</a>&nbsp;(customnull)</td>
++ <td class="summary">
++
++Create a new JSON-Decoder.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Decoder.get">Decoder:get</a>&nbsp;()</td>
++ <td class="summary">
++
++Get the decoded data packets after the rawdata has been sent to the sink.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Decoder.sink">Decoder:sink</a>&nbsp;()</td>
++ <td class="summary">
++
++Create an LTN12 sink from the decoder object which accepts the JSON-Data.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Encoder">Encoder</a>&nbsp;(data, buffersize, fastescape)</td>
++ <td class="summary">
++
++Create a new JSON-Encoder.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Encoder.source">Encoder:source</a>&nbsp;()</td>
++ <td class="summary">
++
++Create an LTN12 source providing the encoded JSON-Data.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#decode">decode</a>&nbsp;(json)</td>
++ <td class="summary">
++
++Directly decode a JSON string
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#encode">encode</a>&nbsp;(obj)</td>
++ <td class="summary">
++
++Direcly encode a Lua object into a JSON string.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#null">null</a>&nbsp;()</td>
++ <td class="summary">
++
++Null replacement function
++ </td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="ActiveDecoder"></a><strong>ActiveDecoder</strong>&nbsp;(customnull)</dt>
++<dd>
++
++
++Create a new Active JSON-Decoder.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ customnull: Use luci.json.null instead of nil for decoding null
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Active JSON-Decoder
++
++
++
++</dd>
++
++
++
++
++<dt><a name="ActiveDecoder.get"></a><strong>ActiveDecoder:get</strong>&nbsp;()</dt>
++<dd>
++
++
++Fetches one JSON-object from given source
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Decoded object
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Decoder"></a><strong>Decoder</strong>&nbsp;(customnull)</dt>
++<dd>
++
++
++Create a new JSON-Decoder.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ customnull: Use luci.json.null instead of nil for decoding null
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++JSON-Decoder
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Decoder.get"></a><strong>Decoder:get</strong>&nbsp;()</dt>
++<dd>
++
++
++Get the decoded data packets after the rawdata has been sent to the sink.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Decoded data
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Decoder.sink"></a><strong>Decoder:sink</strong>&nbsp;()</dt>
++<dd>
++
++
++Create an LTN12 sink from the decoder object which accepts the JSON-Data.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++LTN12 sink
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Encoder"></a><strong>Encoder</strong>&nbsp;(data, buffersize, fastescape)</dt>
++<dd>
++
++
++Create a new JSON-Encoder.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ data: Lua-Object to be encoded.
++ </li>
++
++ <li>
++ buffersize: Blocksize of returned data source.
++ </li>
++
++ <li>
++ fastescape: Use non-standard escaping (don't escape control chars)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++JSON-Encoder
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Encoder.source"></a><strong>Encoder:source</strong>&nbsp;()</dt>
++<dd>
++
++
++Create an LTN12 source providing the encoded JSON-Data.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++LTN12 source
++
++
++
++</dd>
++
++
++
++
++<dt><a name="decode"></a><strong>decode</strong>&nbsp;(json)</dt>
++<dd>
++
++
++Directly decode a JSON string
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ json: JSON-String
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Lua object
++
++
++
++</dd>
++
++
++
++
++<dt><a name="encode"></a><strong>encode</strong>&nbsp;(obj)</dt>
++<dd>
++
++
++Direcly encode a Lua object into a JSON string.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ obj: Lua Object
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++JSON string
++
++
++
++</dd>
++
++
++
++
++<dt><a name="null"></a><strong>null</strong>&nbsp;()</dt>
++<dd>
++
++
++Null replacement function
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++null
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.jsonc.html b/feeds/luci/documentation/api/modules/luci.jsonc.html
+new file mode 100644
+index 0000000..f82eb40
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.jsonc.html
+@@ -0,0 +1,397 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li><strong>luci.jsonc</strong></li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.jsonc</code></h1>
++
++<p>
++ LuCI JSON parsing and serialization library.
++ The luci.jsonc class is a high level Lua binding to the JSON-C library to
++ allow reading and writing JSON data with minimal overhead.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#new">new</a>&nbsp;()</td>
++ <td class="summary">
++
++Construct a new luci.jsonc.parser instance.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#parse">parse</a>&nbsp;(json)</td>
++ <td class="summary">
++
++Parse a complete JSON string and convert it into a Lua data structure.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#stringify">stringify</a>&nbsp;(data, pretty)</td>
++ <td class="summary">
++
++Convert given Lua data into a JSON string.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="new"></a><strong>new</strong>&nbsp;()</dt>
++<dd>
++
++
++Construct a new luci.jsonc.parser instance.
++
++
++
++
++
++<h3>Usage:</h3>
++<code>parser = luci.jsonc.new()</code>
++
++
++
++<h3>Return value:</h3>
++A <code>luci.jsonc.parser</code> object representing a JSON-C tokener.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="parse"></a><strong>parse</strong>&nbsp;(json)</dt>
++<dd>
++
++
++Parse a complete JSON string and convert it into a Lua data structure.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ json: A string containing the JSON data to parse, must be either a
++ JSON array or a JSON object.
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>data = luci.jsonc.parse('{ "name": "John", "age": 34 }')
++print(data.name) -- "John"</pre>
++
++
++
++<h3>Return value:</h3>
++On success, a table containing the parsed JSON data is returned, on
++ failure the function returns <code>nil</code> and a string containing the reason of
++ the parse error.
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#stringify">
++ stringify
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="stringify"></a><strong>stringify</strong>&nbsp;(data, pretty)</dt>
++<dd>
++
++
++Convert given Lua data into a JSON string.
++
++This function recursively converts the given Lua data into a JSON string,
++ignoring any unsupported data. Lua tables are converted into JSON arrays if they
++only contain integer keys, mixed tables are turned into JSON objects with any
++existing numeric keys converted into strings.
++
++Lua functions, coroutines and userdata objects are ignored and Lua numbers are
++converted to integers if they do not contain fractional values.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ data: The Lua data to convert, can be a table, string, boolean or number.
++ </li>
++
++ <li>
++ pretty: A boolean value indicating whether the resulting JSON should be
++ pretty printed.
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>json = luci.jsonc.stringify({ item = true, values = { 1, 2, 3 } })
++print(json) -- '{"item":true,"values":[1,2,3]}'</pre>
++
++
++
++<h3>Return value:</h3>
++Returns a string containing the JSON representation of the given Lua
++ data.
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#parse">
++ parse
++ </a>
++
++</ul>
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.jsonc.parser.html b/feeds/luci/documentation/api/modules/luci.jsonc.parser.html
+new file mode 100644
+index 0000000..4c19cf0
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.jsonc.parser.html
+@@ -0,0 +1,460 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li><strong>luci.jsonc.parser</strong></li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>luci.jsonc.parser</code></h1>
++
++<p>
++ LuCI JSON parser instance.
++ A JSON parser instance is useful to parse JSON data chunk by chunk, without
++ the need to assemble all data in advance.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#parser.parse">parser:parse</a>&nbsp;(json)</td>
++ <td class="summary">
++
++Parses one chunk of JSON data.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#parser.get">parser:get</a>&nbsp;()</td>
++ <td class="summary">
++
++Convert parsed JSON data into Lua table.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#parser.set">parser:set</a>&nbsp;(data)</td>
++ <td class="summary">
++
++Put Lua data into the parser.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#parser.stringify">parser:stringify</a>&nbsp;(pretty)</td>
++ <td class="summary">
++
++Serialize current parser state as JSON.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="parser.parse"></a><strong>parser:parse</strong>&nbsp;(json)</dt>
++<dd>
++
++
++Parses one chunk of JSON data.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ json: String containing the JSON fragment to parse
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>parser = luci.jsonc.new()
++
++while true do
++ chunk = ... -- fetch a cunk of data, e.g. from a socket
++ finish, errmsg = <b>parser.parse(chunk)</b>
++
++ if finish == nil then
++ error("Cannot parse JSON: " .. errmsg)
++ end
++
++ if finish == true then
++ break
++ end
++end</pre>
++
++
++
++<h3>Return value:</h3>
++<ul>
++ <li><code>true</code> if a complete JSON object has been parsed and no further input is
++ expected.</li>
++ <li><code>false</code> if further input is required</li>
++ <li><code>nil</code> if an error was encountered while parsing the current chunk.
++ In this case a string describing the parse error is returned as second
++ value.</li></ul>
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#parser.get">
++ parser:get
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="parser.get"></a><strong>parser:get</strong>&nbsp;()</dt>
++<dd>
++
++
++Convert parsed JSON data into Lua table.
++
++
++
++
++
++
++<h3>Usage:</h3>
++<pre>parser = luci.jsonc.new()
++parser:parse('{ "example": "test" }')
++
++data = parser:get()
++print(data.example) -- "test"</pre>
++
++
++
++<h3>Return value:</h3>
++Parsed JSON object converted into a Lua table or <code>nil</code> if the parser
++ didn't finish or encountered an error.
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#parser.parse">
++ parser:parse
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="parser.set"></a><strong>parser:set</strong>&nbsp;(data)</dt>
++<dd>
++
++
++Put Lua data into the parser.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ data: Lua data to put into the parser object. The data is converted to an
++ internal JSON representation that can be dumped with <code>stringify()</code>.
++ The conversion follows the rules described in <code>luci.jsonc.stringify</code>.
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>parser = luci.jsonc.new()
++parser:set({ "some", "data" })</pre>
++
++
++
++<h3>Return value:</h3>
++Nothing is returned.
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#parser.stringify">
++ parser:stringify
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="parser.stringify"></a><strong>parser:stringify</strong>&nbsp;(pretty)</dt>
++<dd>
++
++
++Serialize current parser state as JSON.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ pretty: A boolean value indicating whether the resulting JSON should be pretty printed.
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++<pre>parser = luci.jsonc.new()
++parser:parse('{ "example": "test" }')
++print(parser:serialize()) -- '{"example":"test"}'</pre>
++
++
++
++<h3>Return value:</h3>
++Returns the serialized JSON data of this parser instance.
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.model.ipkg.html b/feeds/luci/documentation/api/modules/luci.model.ipkg.html
+new file mode 100644
+index 0000000..921153c
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.model.ipkg.html
+@@ -0,0 +1,734 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li><strong>luci.model.ipkg</strong></li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.model.ipkg</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#compare_versions">compare_versions</a>&nbsp;(ver1, ver2, comp)</td>
++ <td class="summary">
++
++lua version of opkg compare-versions
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#find">find</a>&nbsp;(pat, cb)</td>
++ <td class="summary">
++
++Find packages that match the given pattern.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#info">info</a>&nbsp;(pkg)</td>
++ <td class="summary">
++
++Return information about installed and available packages.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#install">install</a>&nbsp;(...)</td>
++ <td class="summary">
++
++Install one or more packages.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#installed">installed</a>&nbsp;(pkg)</td>
++ <td class="summary">
++
++Determine whether a given package is installed.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#list_all">list_all</a>&nbsp;(pat, cb)</td>
++ <td class="summary">
++
++List all packages known to opkg.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#list_installed">list_installed</a>&nbsp;(pat, cb)</td>
++ <td class="summary">
++
++List installed packages.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#overlay_root">overlay_root</a>&nbsp;()</td>
++ <td class="summary">
++
++Determines the overlay root used by opkg.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#remove">remove</a>&nbsp;(...)</td>
++ <td class="summary">
++
++Remove one or more packages.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#status">status</a>&nbsp;(pkg)</td>
++ <td class="summary">
++
++Return the package status of one or more packages.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#update">update</a>&nbsp;()</td>
++ <td class="summary">
++
++Update package lists.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#upgrade">upgrade</a>&nbsp;()</td>
++ <td class="summary">
++
++Upgrades all installed packages.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="compare_versions"></a><strong>compare_versions</strong>&nbsp;(ver1, ver2, comp)</dt>
++<dd>
++
++
++lua version of opkg compare-versions
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ver1: string version 1
++ </li>
++
++ <li>
++ ver2: string version 2
++ </li>
++
++ <li>
++ comp: string compare versions using
++ "<=" or "<" lower-equal
++ ">" or ">=" greater-equal
++ "=" equal
++ "<<" lower
++ ">>" greater
++ "~=" not equal
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean indicating the status of the compare
++
++
++
++</dd>
++
++
++
++
++<dt><a name="find"></a><strong>find</strong>&nbsp;(pat, cb)</dt>
++<dd>
++
++
++Find packages that match the given pattern.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ pat: Find packages whose names or descriptions match this pattern, nil results in zero results
++ </li>
++
++ <li>
++ cb: Callback function invoked for each patckage, receives name, version and description as arguments
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++nothing
++
++
++
++</dd>
++
++
++
++
++<dt><a name="info"></a><strong>info</strong>&nbsp;(pkg)</dt>
++<dd>
++
++
++Return information about installed and available packages.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ pkg: Limit output to a (set of) packages
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing package information
++
++
++
++</dd>
++
++
++
++
++<dt><a name="install"></a><strong>install</strong>&nbsp;(...)</dt>
++<dd>
++
++
++Install one or more packages.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ...: List of packages to install
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating the status of the action
++
++ <li>OPKG return code, STDOUT and STDERR
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="installed"></a><strong>installed</strong>&nbsp;(pkg)</dt>
++<dd>
++
++
++Determine whether a given package is installed.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ pkg: Package
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean
++
++
++
++</dd>
++
++
++
++
++<dt><a name="list_all"></a><strong>list_all</strong>&nbsp;(pat, cb)</dt>
++<dd>
++
++
++List all packages known to opkg.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ pat: Only find packages matching this pattern, nil lists all packages
++ </li>
++
++ <li>
++ cb: Callback function invoked for each package, receives name, version and description as arguments
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++nothing
++
++
++
++</dd>
++
++
++
++
++<dt><a name="list_installed"></a><strong>list_installed</strong>&nbsp;(pat, cb)</dt>
++<dd>
++
++
++List installed packages.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ pat: Only find packages matching this pattern, nil lists all packages
++ </li>
++
++ <li>
++ cb: Callback function invoked for each package, receives name, version and description as arguments
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++nothing
++
++
++
++</dd>
++
++
++
++
++<dt><a name="overlay_root"></a><strong>overlay_root</strong>&nbsp;()</dt>
++<dd>
++
++
++Determines the overlay root used by opkg.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing the directory path of the overlay root.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="remove"></a><strong>remove</strong>&nbsp;(...)</dt>
++<dd>
++
++
++Remove one or more packages.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ...: List of packages to install
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating the status of the action
++
++ <li>OPKG return code, STDOUT and STDERR
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="status"></a><strong>status</strong>&nbsp;(pkg)</dt>
++<dd>
++
++
++Return the package status of one or more packages.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ pkg: Limit output to a (set of) packages
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing package status information
++
++
++
++</dd>
++
++
++
++
++<dt><a name="update"></a><strong>update</strong>&nbsp;()</dt>
++<dd>
++
++
++Update package lists.
++
++
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating the status of the action
++
++ <li>OPKG return code, STDOUT and STDERR
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="upgrade"></a><strong>upgrade</strong>&nbsp;()</dt>
++<dd>
++
++
++Upgrades all installed packages.
++
++
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating the status of the action
++
++ <li>OPKG return code, STDOUT and STDERR
++
++</ol>
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.model.uci.html b/feeds/luci/documentation/api/modules/luci.model.uci.html
+new file mode 100644
+index 0000000..9e50d99
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.model.uci.html
+@@ -0,0 +1,1436 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li><strong>luci.model.uci</strong></li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>luci.model.uci</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.add">Cursor:add</a>&nbsp;(config, type)</td>
++ <td class="summary">
++
++Add an anonymous section.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.apply">Cursor:apply</a>&nbsp;(configlist, command)</td>
++ <td class="summary">
++
++Applies UCI configuration changes
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.changes">Cursor:changes</a>&nbsp;(config)</td>
++ <td class="summary">
++
++Get a table of saved but uncommitted changes.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.commit">Cursor:commit</a>&nbsp;(config)</td>
++ <td class="summary">
++
++Commit saved changes.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.delete">Cursor:delete</a>&nbsp;(config, section, option)</td>
++ <td class="summary">
++
++Deletes a section or an option.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.delete_all">Cursor:delete_all</a>&nbsp;(config, type, comparator)</td>
++ <td class="summary">
++
++Delete all sections of a given type that match certain criteria.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.foreach">Cursor:foreach</a>&nbsp;(config, type, callback)</td>
++ <td class="summary">
++
++Call a function for every section of a certain type.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.get">Cursor:get</a>&nbsp;(config, section, option)</td>
++ <td class="summary">
++
++Get a section type or an option
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.get_all">Cursor:get_all</a>&nbsp;(config, section)</td>
++ <td class="summary">
++
++Get all sections of a config or all values of a section.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.get_bool">Cursor:get_bool</a>&nbsp;(config, section, option)</td>
++ <td class="summary">
++
++Get a boolean option and return it's value as true or false.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.get_confdir">Cursor:get_confdir</a>&nbsp;()</td>
++ <td class="summary">
++
++Get the configuration directory.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.get_first">Cursor:get_first</a>&nbsp;(config, type, option, default)</td>
++ <td class="summary">
++
++Get the given option from the first section with the given type.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.get_list">Cursor:get_list</a>&nbsp;(config, section, option)</td>
++ <td class="summary">
++
++Get an option or list and return values as table.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.get_savedir">Cursor:get_savedir</a>&nbsp;()</td>
++ <td class="summary">
++
++Get the directory for uncomitted changes.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.load">Cursor:load</a>&nbsp;(config)</td>
++ <td class="summary">
++
++Manually load a config.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.revert">Cursor:revert</a>&nbsp;(config)</td>
++ <td class="summary">
++
++Revert saved but uncommitted changes.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.save">Cursor:save</a>&nbsp;(config)</td>
++ <td class="summary">
++
++Saves changes made to a config to make them committable.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.section">Cursor:section</a>&nbsp;(config, type, name, values)</td>
++ <td class="summary">
++
++Create a new section and initialize it with data.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.set">Cursor:set</a>&nbsp;(config, section, option, value)</td>
++ <td class="summary">
++
++Set a value or create a named section.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.set_confdir">Cursor:set_confdir</a>&nbsp;(directory)</td>
++ <td class="summary">
++
++Set the configuration directory.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.set_list">Cursor:set_list</a>&nbsp;(config, section, option, value)</td>
++ <td class="summary">
++
++Set given values as list.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.set_savedir">Cursor:set_savedir</a>&nbsp;(directory)</td>
++ <td class="summary">
++
++Set the directory for uncommited changes.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.substate">Cursor:substate</a>&nbsp;()</td>
++ <td class="summary">
++
++Create a sub-state of this cursor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.tset">Cursor:tset</a>&nbsp;(config, section, values)</td>
++ <td class="summary">
++
++Updated the data of a section using data from a table.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Cursor.unload">Cursor:unload</a>&nbsp;(config)</td>
++ <td class="summary">
++
++Discard changes made to a config.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cursor">cursor</a>&nbsp;()</td>
++ <td class="summary">
++
++Create a new UCI-Cursor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cursor_state">cursor_state</a>&nbsp;()</td>
++ <td class="summary">
++
++Create a new Cursor initialized to the state directory.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="Cursor.add"></a><strong>Cursor:add</strong>&nbsp;(config, type)</dt>
++<dd>
++
++
++Add an anonymous section.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ type: UCI section type
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Name of created section
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.apply"></a><strong>Cursor:apply</strong>&nbsp;(configlist, command)</dt>
++<dd>
++
++
++Applies UCI configuration changes
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ configlist: List of UCI configurations
++ </li>
++
++ <li>
++ command: Don't apply only return the command
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.changes"></a><strong>Cursor:changes</strong>&nbsp;(config)</dt>
++<dd>
++
++
++Get a table of saved but uncommitted changes.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table of changes
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#Cursor.save">
++ Cursor:save
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.commit"></a><strong>Cursor:commit</strong>&nbsp;(config)</dt>
++<dd>
++
++
++Commit saved changes.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean whether operation succeeded
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#Cursor.revert">
++ Cursor:revert
++ </a>
++
++ <li><a href="#Cursor.save">
++ Cursor:save
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.delete"></a><strong>Cursor:delete</strong>&nbsp;(config, section, option)</dt>
++<dd>
++
++
++Deletes a section or an option.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ section: UCI section name
++ </li>
++
++ <li>
++ option: UCI option (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean whether operation succeeded
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.delete_all"></a><strong>Cursor:delete_all</strong>&nbsp;(config, type, comparator)</dt>
++<dd>
++
++
++Delete all sections of a given type that match certain criteria.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ type: UCI section type
++ </li>
++
++ <li>
++ comparator: Function that will be called for each section and
++returns a boolean whether to delete the current section (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.foreach"></a><strong>Cursor:foreach</strong>&nbsp;(config, type, callback)</dt>
++<dd>
++
++
++Call a function for every section of a certain type.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ type: UCI section type
++ </li>
++
++ <li>
++ callback: Function to be called
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean whether operation succeeded
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.get"></a><strong>Cursor:get</strong>&nbsp;(config, section, option)</dt>
++<dd>
++
++
++Get a section type or an option
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ section: UCI section name
++ </li>
++
++ <li>
++ option: UCI option (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++UCI value
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.get_all"></a><strong>Cursor:get_all</strong>&nbsp;(config, section)</dt>
++<dd>
++
++
++Get all sections of a config or all values of a section.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ section: UCI section name (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table of UCI sections or table of UCI values
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.get_bool"></a><strong>Cursor:get_bool</strong>&nbsp;(config, section, option)</dt>
++<dd>
++
++
++Get a boolean option and return it's value as true or false.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ section: UCI section name
++ </li>
++
++ <li>
++ option: UCI option
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.get_confdir"></a><strong>Cursor:get_confdir</strong>&nbsp;()</dt>
++<dd>
++
++
++Get the configuration directory.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Configuration directory
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.get_first"></a><strong>Cursor:get_first</strong>&nbsp;(config, type, option, default)</dt>
++<dd>
++
++
++Get the given option from the first section with the given type.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ type: UCI section type
++ </li>
++
++ <li>
++ option: UCI option (optional)
++ </li>
++
++ <li>
++ default: Default value (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++UCI value
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.get_list"></a><strong>Cursor:get_list</strong>&nbsp;(config, section, option)</dt>
++<dd>
++
++
++Get an option or list and return values as table.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ section: UCI section name
++ </li>
++
++ <li>
++ option: UCI option
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++UCI value
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.get_savedir"></a><strong>Cursor:get_savedir</strong>&nbsp;()</dt>
++<dd>
++
++
++Get the directory for uncomitted changes.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Save directory
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.load"></a><strong>Cursor:load</strong>&nbsp;(config)</dt>
++<dd>
++
++
++Manually load a config.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean whether operation succeeded
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#Cursor.save">
++ Cursor:save
++ </a>
++
++ <li><a href="#Cursor.unload">
++ Cursor:unload
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.revert"></a><strong>Cursor:revert</strong>&nbsp;(config)</dt>
++<dd>
++
++
++Revert saved but uncommitted changes.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean whether operation succeeded
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#Cursor.commit">
++ Cursor:commit
++ </a>
++
++ <li><a href="#Cursor.save">
++ Cursor:save
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.save"></a><strong>Cursor:save</strong>&nbsp;(config)</dt>
++<dd>
++
++
++Saves changes made to a config to make them committable.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean whether operation succeeded
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#Cursor.load">
++ Cursor:load
++ </a>
++
++ <li><a href="#Cursor.unload">
++ Cursor:unload
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.section"></a><strong>Cursor:section</strong>&nbsp;(config, type, name, values)</dt>
++<dd>
++
++
++Create a new section and initialize it with data.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ type: UCI section type
++ </li>
++
++ <li>
++ name: UCI section name (optional)
++ </li>
++
++ <li>
++ values: Table of key - value pairs to initialize the section with
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Name of created section
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.set"></a><strong>Cursor:set</strong>&nbsp;(config, section, option, value)</dt>
++<dd>
++
++
++Set a value or create a named section.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ section: UCI section name
++ </li>
++
++ <li>
++ option: UCI option or UCI section type
++ </li>
++
++ <li>
++ value: UCI value or nil if you want to create a section
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean whether operation succeeded
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.set_confdir"></a><strong>Cursor:set_confdir</strong>&nbsp;(directory)</dt>
++<dd>
++
++
++Set the configuration directory.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ directory: UCI configuration directory
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean whether operation succeeded
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.set_list"></a><strong>Cursor:set_list</strong>&nbsp;(config, section, option, value)</dt>
++<dd>
++
++
++Set given values as list.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ section: UCI section name
++ </li>
++
++ <li>
++ option: UCI option
++ </li>
++
++ <li>
++ value: UCI value
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean whether operation succeeded
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.set_savedir"></a><strong>Cursor:set_savedir</strong>&nbsp;(directory)</dt>
++<dd>
++
++
++Set the directory for uncommited changes.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ directory: UCI changes directory
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean whether operation succeeded
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.substate"></a><strong>Cursor:substate</strong>&nbsp;()</dt>
++<dd>
++
++
++Create a sub-state of this cursor. The sub-state is tied to the parent
++
++curser, means it the parent unloads or loads configs, the sub state will
++do so as well.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++UCI state cursor tied to the parent cursor
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.tset"></a><strong>Cursor:tset</strong>&nbsp;(config, section, values)</dt>
++<dd>
++
++
++Updated the data of a section using data from a table.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++ <li>
++ section: UCI section name (optional)
++ </li>
++
++ <li>
++ values: Table of key - value pairs to update the section with
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Cursor.unload"></a><strong>Cursor:unload</strong>&nbsp;(config)</dt>
++<dd>
++
++
++Discard changes made to a config.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ config: UCI config
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean whether operation succeeded
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#Cursor.load">
++ Cursor:load
++ </a>
++
++ <li><a href="#Cursor.save">
++ Cursor:save
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="cursor"></a><strong>cursor</strong>&nbsp;()</dt>
++<dd>
++
++
++Create a new UCI-Cursor.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++UCI-Cursor
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cursor_state"></a><strong>cursor_state</strong>&nbsp;()</dt>
++<dd>
++
++
++Create a new Cursor initialized to the state directory.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++UCI cursor
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.rpcc.html b/feeds/luci/documentation/api/modules/luci.rpcc.html
+new file mode 100644
+index 0000000..f7cb020
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.rpcc.html
+@@ -0,0 +1,328 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li><strong>luci.rpcc</strong></li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>luci.rpcc</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#Client.proxy">Client:proxy</a>&nbsp;(prefix)</td>
++ <td class="summary">
++
++Create a transparent RPC proxy.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Client.request">Client:request</a>&nbsp;(method, params, notification)</td>
++ <td class="summary">
++
++Request an RP call and get the response.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="Client.proxy"></a><strong>Client:proxy</strong>&nbsp;(prefix)</dt>
++<dd>
++
++
++Create a transparent RPC proxy.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ prefix: Method prefix
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++RPC Proxy object
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Client.request"></a><strong>Client:request</strong>&nbsp;(method, params, notification)</dt>
++<dd>
++
++
++Request an RP call and get the response.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ method: Remote method
++ </li>
++
++ <li>
++ params: Parameters
++ </li>
++
++ <li>
++ notification: Notification only?
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++response
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.rpcc.ruci.html b/feeds/luci/documentation/api/modules/luci.rpcc.ruci.html
+new file mode 100644
+index 0000000..203779c
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.rpcc.ruci.html
+@@ -0,0 +1,281 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li><strong>luci.rpcc.ruci</strong></li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>luci.rpcc.ruci</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#factory">factory</a>&nbsp;(rpccl)</td>
++ <td class="summary">
++
++Create a new UCI over RPC proxy.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="factory"></a><strong>factory</strong>&nbsp;(rpccl)</dt>
++<dd>
++
++
++Create a new UCI over RPC proxy.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ rpccl: RPC client
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Network transparent UCI module
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.sys.html b/feeds/luci/documentation/api/modules/luci.sys.html
+new file mode 100644
+index 0000000..860c5fb
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.sys.html
+@@ -0,0 +1,645 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li><strong>luci.sys</strong></li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.sys</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#call">call</a>&nbsp;(...)</td>
++ <td class="summary">
++
++Execute a given shell command and return the error code
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#dmesg">dmesg</a>&nbsp;()</td>
++ <td class="summary">
++
++Retrieves the output of the "dmesg" command.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#exec">exec</a>&nbsp;(command)</td>
++ <td class="summary">
++
++Execute a given shell command and capture its standard output
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#getenv">getenv</a>&nbsp;(var)</td>
++ <td class="summary">
++
++Retrieve environment variables.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#hostname">hostname</a>&nbsp;(String)</td>
++ <td class="summary">
++
++Get or set the current hostname.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#httpget">httpget</a>&nbsp;(url, stream, target)</td>
++ <td class="summary">
++
++Returns the contents of a documented referred by an URL.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#mounts">mounts</a>&nbsp;()</td>
++ <td class="summary">
++
++Retrieve information about currently mounted file systems.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#reboot">reboot</a>&nbsp;()</td>
++ <td class="summary">
++
++Initiate a system reboot.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#syslog">syslog</a>&nbsp;()</td>
++ <td class="summary">
++
++Retrieves the output of the "logread" command.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#uniqueid">uniqueid</a>&nbsp;(bytes)</td>
++ <td class="summary">
++
++Generates a random id with specified length.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#uptime">uptime</a>&nbsp;()</td>
++ <td class="summary">
++
++Returns the current system uptime stats.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="call"></a><strong>call</strong>&nbsp;(...)</dt>
++<dd>
++
++
++Execute a given shell command and return the error code
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ...: Command to call
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Error code of the command
++
++
++
++</dd>
++
++
++
++
++<dt><a name="dmesg"></a><strong>dmesg</strong>&nbsp;()</dt>
++<dd>
++
++
++Retrieves the output of the "dmesg" command.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing the current log buffer
++
++
++
++</dd>
++
++
++
++
++<dt><a name="exec"></a><strong>exec</strong>&nbsp;(command)</dt>
++<dd>
++
++
++Execute a given shell command and capture its standard output
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ command: Command to call
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containg the return the output of the command
++
++
++
++</dd>
++
++
++
++
++<dt><a name="getenv"></a><strong>getenv</strong>&nbsp;(var)</dt>
++<dd>
++
++
++Retrieve environment variables. If no variable is given then a table
++
++containing the whole environment is returned otherwise this function returns
++the corresponding string value for the given name or nil if no such variable
++exists.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ var: Name of the environment variable to retrieve (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>String containg the value of the specified variable
++
++ <li>Table containing all variables if no variable name is given
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="hostname"></a><strong>hostname</strong>&nbsp;(String)</dt>
++<dd>
++
++
++Get or set the current hostname.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ String: containing a new hostname to set (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing the system hostname
++
++
++
++</dd>
++
++
++
++
++<dt><a name="httpget"></a><strong>httpget</strong>&nbsp;(url, stream, target)</dt>
++<dd>
++
++
++Returns the contents of a documented referred by an URL.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ url: The URL to retrieve
++ </li>
++
++ <li>
++ stream: Return a stream instead of a buffer
++ </li>
++
++ <li>
++ target: Directly write to target file name
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing the contents of given the URL
++
++
++
++</dd>
++
++
++
++
++<dt><a name="mounts"></a><strong>mounts</strong>&nbsp;()</dt>
++<dd>
++
++
++Retrieve information about currently mounted file systems.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing mount information
++
++
++
++</dd>
++
++
++
++
++<dt><a name="reboot"></a><strong>reboot</strong>&nbsp;()</dt>
++<dd>
++
++
++Initiate a system reboot.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Return value of os.execute()
++
++
++
++</dd>
++
++
++
++
++<dt><a name="syslog"></a><strong>syslog</strong>&nbsp;()</dt>
++<dd>
++
++
++Retrieves the output of the "logread" command.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing the current log buffer
++
++
++
++</dd>
++
++
++
++
++<dt><a name="uniqueid"></a><strong>uniqueid</strong>&nbsp;(bytes)</dt>
++<dd>
++
++
++Generates a random id with specified length.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ bytes: Number of bytes for the unique id
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing hex encoded id
++
++
++
++</dd>
++
++
++
++
++<dt><a name="uptime"></a><strong>uptime</strong>&nbsp;()</dt>
++<dd>
++
++
++Returns the current system uptime stats.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing total uptime in seconds
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.sys.init.html b/feeds/luci/documentation/api/modules/luci.sys.init.html
+new file mode 100644
+index 0000000..596fb7c
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.sys.init.html
+@@ -0,0 +1,516 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li><strong>luci.sys.init</strong></li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.sys.init</code></h1>
++
++<p>
++
++LuCI system utilities / init related functions.
++</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#init.disable">disable</a>&nbsp;(name)</td>
++ <td class="summary">
++
++Disable the given init script
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#init.enable">enable</a>&nbsp;(name)</td>
++ <td class="summary">
++
++Enable the given init script
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#init.enabled">enabled</a>&nbsp;(name)</td>
++ <td class="summary">
++
++Test whether the given init script is enabled
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#init.index">index</a>&nbsp;(name)</td>
++ <td class="summary">
++
++Get the index of he given init script
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#init.names">names</a>&nbsp;()</td>
++ <td class="summary">
++
++Get the names of all installed init scripts
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#init.start">start</a>&nbsp;(name)</td>
++ <td class="summary">
++
++Start the given init script
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#init.stop">stop</a>&nbsp;(name)</td>
++ <td class="summary">
++
++Stop the given init script
++ </td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="init.disable"></a><strong>disable</strong>&nbsp;(name)</dt>
++<dd>
++
++
++Disable the given init script
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: Name of the init script
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean indicating success
++
++
++
++</dd>
++
++
++
++
++<dt><a name="init.enable"></a><strong>enable</strong>&nbsp;(name)</dt>
++<dd>
++
++
++Enable the given init script
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: Name of the init script
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean indicating success
++
++
++
++</dd>
++
++
++
++
++<dt><a name="init.enabled"></a><strong>enabled</strong>&nbsp;(name)</dt>
++<dd>
++
++
++Test whether the given init script is enabled
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: Name of the init script
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean indicating whether init is enabled
++
++
++
++</dd>
++
++
++
++
++<dt><a name="init.index"></a><strong>index</strong>&nbsp;(name)</dt>
++<dd>
++
++
++Get the index of he given init script
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: Name of the init script
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Numeric index value
++
++
++
++</dd>
++
++
++
++
++<dt><a name="init.names"></a><strong>names</strong>&nbsp;()</dt>
++<dd>
++
++
++Get the names of all installed init scripts
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing the names of all inistalled init scripts
++
++
++
++</dd>
++
++
++
++
++<dt><a name="init.start"></a><strong>start</strong>&nbsp;(name)</dt>
++<dd>
++
++
++Start the given init script
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: Name of the init script
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean indicating success
++
++
++
++</dd>
++
++
++
++
++<dt><a name="init.stop"></a><strong>stop</strong>&nbsp;(name)</dt>
++<dd>
++
++
++Stop the given init script
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: Name of the init script
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean indicating success
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.sys.iptparser.html b/feeds/luci/documentation/api/modules/luci.sys.iptparser.html
+new file mode 100644
+index 0000000..122afcc
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.sys.iptparser.html
+@@ -0,0 +1,466 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li><strong>luci.sys.iptparser</strong></li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>luci.sys.iptparser</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#IptParser">IptParser</a>&nbsp;(family)</td>
++ <td class="summary">
++
++Create a new iptables parser object.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#IptParser.chain">IptParser:chain</a>&nbsp;(table, chain)</td>
++ <td class="summary">
++
++Return the given firewall chain within the given table name.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#IptParser.chains">IptParser:chains</a>&nbsp;(table)</td>
++ <td class="summary">
++
++Find the names of all chains within the given table name.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#IptParser.is_custom_target">IptParser:is_custom_target</a>&nbsp;(target)</td>
++ <td class="summary">
++
++Test whether the given target points to a custom chain.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#IptParser.resync">IptParser:resync</a>&nbsp;()</td>
++ <td class="summary">
++
++Rebuild the internal lookup table, for example when rules have changed
++
++through external commands.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#IptParser.tables">IptParser:tables</a>&nbsp;()</td>
++ <td class="summary">
++
++Find the names of all tables.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="IptParser"></a><strong>IptParser</strong>&nbsp;(family)</dt>
++<dd>
++
++
++Create a new iptables parser object.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ family: Number specifying the address family. 4 for IPv4, 6 for IPv6
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++IptParser instance
++
++
++
++</dd>
++
++
++
++
++<dt><a name="IptParser.chain"></a><strong>IptParser:chain</strong>&nbsp;(table, chain)</dt>
++<dd>
++
++
++Return the given firewall chain within the given table name.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ table: String containing the table name
++ </li>
++
++ <li>
++ chain: String containing the chain name
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing the fields "policy", "packets", "bytes"
++ and "rules". The "rules" field is a table of rule tables.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="IptParser.chains"></a><strong>IptParser:chains</strong>&nbsp;(table)</dt>
++<dd>
++
++
++Find the names of all chains within the given table name.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ table: String containing the table name
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table of chain names in the order they occur.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="IptParser.is_custom_target"></a><strong>IptParser:is_custom_target</strong>&nbsp;(target)</dt>
++<dd>
++
++
++Test whether the given target points to a custom chain.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ target: String containing the target action
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean indicating whether target is a custom chain.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="IptParser.resync"></a><strong>IptParser:resync</strong>&nbsp;()</dt>
++<dd>
++
++
++Rebuild the internal lookup table, for example when rules have changed
++
++through external commands.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++nothing
++
++
++
++</dd>
++
++
++
++
++<dt><a name="IptParser.tables"></a><strong>IptParser:tables</strong>&nbsp;()</dt>
++<dd>
++
++
++Find the names of all tables.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table of table names.
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.sys.net.html b/feeds/luci/documentation/api/modules/luci.sys.net.html
+new file mode 100644
+index 0000000..4a049e2
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.sys.net.html
+@@ -0,0 +1,569 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li><strong>luci.sys.net</strong></li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.sys.net</code></h1>
++
++<p>
++
++LuCI system utilities / network related functions.
++</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#net.arptable">arptable</a>&nbsp;()</td>
++ <td class="summary">
++
++Returns the current arp-table entries as two-dimensional table.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#net.conntrack">conntrack</a>&nbsp;()</td>
++ <td class="summary">
++
++Returns conntrack information
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#net.deviceinfo">deviceinfo</a>&nbsp;()</td>
++ <td class="summary">
++
++Return information about available network interfaces.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#net.devices">devices</a>&nbsp;()</td>
++ <td class="summary">
++
++Determine the names of available network interfaces.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#net.ipv4_hints">ipv4_hints</a>&nbsp;()</td>
++ <td class="summary">
++
++Returns a two-dimensional table of IPv4 address hints.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#net.ipv6_hints">ipv6_hints</a>&nbsp;()</td>
++ <td class="summary">
++
++Returns a two-dimensional table of IPv6 address hints.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#net.mac_hints">mac_hints</a>&nbsp;()</td>
++ <td class="summary">
++
++Returns a two-dimensional table of mac address hints.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#net.pingtest">pingtest</a>&nbsp;(host)</td>
++ <td class="summary">
++
++Tests whether the given host responds to ping probes.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#net.routes">routes</a>&nbsp;()</td>
++ <td class="summary">
++
++Returns the current kernel routing table entries.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#net.routes6">routes6</a>&nbsp;()</td>
++ <td class="summary">
++
++Returns the current ipv6 kernel routing table entries.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="net.arptable"></a><strong>arptable</strong>&nbsp;()</dt>
++<dd>
++
++
++Returns the current arp-table entries as two-dimensional table.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table of table containing the current arp entries.
++ The following fields are defined for arp entry objects:
++ { "IP address", "HW address", "HW type", "Flags", "Mask", "Device" }
++
++
++
++</dd>
++
++
++
++
++<dt><a name="net.conntrack"></a><strong>conntrack</strong>&nbsp;()</dt>
++<dd>
++
++
++Returns conntrack information
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table with the currently tracked IP connections
++
++
++
++</dd>
++
++
++
++
++<dt><a name="net.deviceinfo"></a><strong>deviceinfo</strong>&nbsp;()</dt>
++<dd>
++
++
++Return information about available network interfaces.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing all current interface names and their information
++
++
++
++</dd>
++
++
++
++
++<dt><a name="net.devices"></a><strong>devices</strong>&nbsp;()</dt>
++<dd>
++
++
++Determine the names of available network interfaces.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing all current interface names
++
++
++
++</dd>
++
++
++
++
++<dt><a name="net.ipv4_hints"></a><strong>ipv4_hints</strong>&nbsp;()</dt>
++<dd>
++
++
++Returns a two-dimensional table of IPv4 address hints.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table of table containing known hosts from various sources.
++ Each entry contains the values in the following order:
++ [ "ip", "name" ]
++
++
++
++</dd>
++
++
++
++
++<dt><a name="net.ipv6_hints"></a><strong>ipv6_hints</strong>&nbsp;()</dt>
++<dd>
++
++
++Returns a two-dimensional table of IPv6 address hints.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table of table containing known hosts from various sources.
++ Each entry contains the values in the following order:
++ [ "ip", "name" ]
++
++
++
++</dd>
++
++
++
++
++<dt><a name="net.mac_hints"></a><strong>mac_hints</strong>&nbsp;()</dt>
++<dd>
++
++
++Returns a two-dimensional table of mac address hints.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table of table containing known hosts from various sources.
++ Each entry contains the values in the following order:
++ [ "mac", "name" ]
++
++
++
++</dd>
++
++
++
++
++<dt><a name="net.pingtest"></a><strong>pingtest</strong>&nbsp;(host)</dt>
++<dd>
++
++
++Tests whether the given host responds to ping probes.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ host: String containing a hostname or IPv4 address
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Number containing 0 on success and >= 1 on error
++
++
++
++</dd>
++
++
++
++
++<dt><a name="net.routes"></a><strong>routes</strong>&nbsp;()</dt>
++<dd>
++
++
++Returns the current kernel routing table entries.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table of tables with properties of the corresponding routes.
++ The following fields are defined for route entry tables:
++ { "dest", "gateway", "metric", "refcount", "usecount", "irtt",
++ "flags", "device" }
++
++
++
++</dd>
++
++
++
++
++<dt><a name="net.routes6"></a><strong>routes6</strong>&nbsp;()</dt>
++<dd>
++
++
++Returns the current ipv6 kernel routing table entries.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table of tables with properties of the corresponding routes.
++ The following fields are defined for route entry tables:
++ { "source", "dest", "nexthop", "metric", "refcount", "usecount",
++ "flags", "device" }
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.sys.process.html b/feeds/luci/documentation/api/modules/luci.sys.process.html
+new file mode 100644
+index 0000000..9c4f0a5
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.sys.process.html
+@@ -0,0 +1,448 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li><strong>luci.sys.process</strong></li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.sys.process</code></h1>
++
++<p>
++
++LuCI system utilities / process related functions.
++</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#process.info">info</a>&nbsp;()</td>
++ <td class="summary">
++
++Get the current process id.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#process.list">list</a>&nbsp;()</td>
++ <td class="summary">
++
++Retrieve information about currently running processes.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#process.setgroup">setgroup</a>&nbsp;(gid)</td>
++ <td class="summary">
++
++Set the gid of a process identified by given pid.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#process.setuser">setuser</a>&nbsp;(uid)</td>
++ <td class="summary">
++
++Set the uid of a process identified by given pid.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#process.signal">signal</a>&nbsp;(pid, sig)</td>
++ <td class="summary">
++
++Send a signal to a process identified by given pid.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="process.info"></a><strong>info</strong>&nbsp;()</dt>
++<dd>
++
++
++Get the current process id.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Number containing the current pid
++
++
++
++</dd>
++
++
++
++
++<dt><a name="process.list"></a><strong>list</strong>&nbsp;()</dt>
++<dd>
++
++
++Retrieve information about currently running processes.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing process information
++
++
++
++</dd>
++
++
++
++
++<dt><a name="process.setgroup"></a><strong>setgroup</strong>&nbsp;(gid)</dt>
++<dd>
++
++
++Set the gid of a process identified by given pid.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ gid: Number containing the Unix group id
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating successful operation
++
++ <li>String containing the error message if failed
++
++ <li>Number containing the error code if failed
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="process.setuser"></a><strong>setuser</strong>&nbsp;(uid)</dt>
++<dd>
++
++
++Set the uid of a process identified by given pid.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ uid: Number containing the Unix user id
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating successful operation
++
++ <li>String containing the error message if failed
++
++ <li>Number containing the error code if failed
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="process.signal"></a><strong>signal</strong>&nbsp;(pid, sig)</dt>
++<dd>
++
++
++Send a signal to a process identified by given pid.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ pid: Number containing the process id
++ </li>
++
++ <li>
++ sig: Signal to send (default: 15 [SIGTERM])
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Boolean indicating successful operation
++
++ <li>Number containing the error code if failed
++
++</ol>
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.sys.user.html b/feeds/luci/documentation/api/modules/luci.sys.user.html
+new file mode 100644
+index 0000000..37126dd
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.sys.user.html
+@@ -0,0 +1,416 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li><strong>luci.sys.user</strong></li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.sys.user</code></h1>
++
++<p>
++
++LuCI system utilities / user related functions.
++</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#getuser">getuser</a>&nbsp;(uid)</td>
++ <td class="summary">
++
++Retrieve user informations for given uid.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#user.checkpasswd">checkpasswd</a>&nbsp;(username, pass)</td>
++ <td class="summary">
++
++Test whether given string matches the password of a given system user.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#user.getpasswd">getpasswd</a>&nbsp;(username)</td>
++ <td class="summary">
++
++Retrieve the current user password hash.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#user.setpasswd">setpasswd</a>&nbsp;(username, password)</td>
++ <td class="summary">
++
++Change the password of given user.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="getuser"></a><strong>getuser</strong>&nbsp;(uid)</dt>
++<dd>
++
++
++Retrieve user informations for given uid.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ uid: Number containing the Unix user id
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing the following fields:
++ { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" }
++
++
++
++</dd>
++
++
++
++
++<dt><a name="user.checkpasswd"></a><strong>checkpasswd</strong>&nbsp;(username, pass)</dt>
++<dd>
++
++
++Test whether given string matches the password of a given system user.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ username: String containing the Unix user name
++ </li>
++
++ <li>
++ pass: String containing the password to compare
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean indicating wheather the passwords are equal
++
++
++
++</dd>
++
++
++
++
++<dt><a name="user.getpasswd"></a><strong>getpasswd</strong>&nbsp;(username)</dt>
++<dd>
++
++
++Retrieve the current user password hash.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ username: String containing the username to retrieve the password for
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>String containing the hash or nil if no password is set.
++
++ <li>Password database entry
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="user.setpasswd"></a><strong>setpasswd</strong>&nbsp;(username, password)</dt>
++<dd>
++
++
++Change the password of given user.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ username: String containing the Unix user name
++ </li>
++
++ <li>
++ password: String containing the password to compare
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Number containing 0 on success and >= 1 on error
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.sys.wifi.html b/feeds/luci/documentation/api/modules/luci.sys.wifi.html
+new file mode 100644
+index 0000000..eb1f6b3
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.sys.wifi.html
+@@ -0,0 +1,284 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li><strong>luci.sys.wifi</strong></li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.sys.wifi</code></h1>
++
++<p>
++
++LuCI system utilities / wifi related functions.
++</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#wifi.getiwinfo">getiwinfo</a>&nbsp;(ifname)</td>
++ <td class="summary">
++
++Get wireless information for given interface.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="wifi.getiwinfo"></a><strong>getiwinfo</strong>&nbsp;(ifname)</dt>
++<dd>
++
++
++Get wireless information for given interface.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ifname: String containing the interface name
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++A wrapped iwinfo object instance
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/luci.util.html b/feeds/luci/documentation/api/modules/luci.util.html
+new file mode 100644
+index 0000000..301cfff
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/luci.util.html
+@@ -0,0 +1,1717 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li><strong>luci.util</strong></li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>luci.util</code></h1>
++
++<p></p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#append">append</a>&nbsp;(src, ...)</td>
++ <td class="summary">
++
++Appends numerically indexed tables or single objects to a given table.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#bigendian">bigendian</a>&nbsp;()</td>
++ <td class="summary">
++
++Test whether the current system is operating in big endian mode.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#class">class</a>&nbsp;(base)</td>
++ <td class="summary">
++
++Create a Class object (Python-style object model).</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#clone">clone</a>&nbsp;(object, deep)</td>
++ <td class="summary">
++
++Clones the given object and return it's copy.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cmatch">cmatch</a>&nbsp;(str, pattern)</td>
++ <td class="summary">
++
++Count the occurences of given substring in given string.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#combine">combine</a>&nbsp;(tbl1, tbl2, ...)</td>
++ <td class="summary">
++
++Combines two or more numerically indexed tables and single objects into one table.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#contains">contains</a>&nbsp;(table, value)</td>
++ <td class="summary">
++
++Checks whether the given table contains the given value.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#copcall">copcall</a>&nbsp;(f, ...)</td>
++ <td class="summary">
++
++This is a coroutine-safe drop-in replacement for Lua's "pcall"-function
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#coxpcall">coxpcall</a>&nbsp;(f, err, ...)</td>
++ <td class="summary">
++
++This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#dtable">dtable</a>&nbsp;()</td>
++ <td class="summary">
++
++Create a dynamic table which automatically creates subtables.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#dumptable">dumptable</a>&nbsp;(t, maxdepth)</td>
++ <td class="summary">
++
++Recursively dumps a table to stdout, useful for testing and debugging.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#exec">exec</a>&nbsp;(command)</td>
++ <td class="summary">
++
++Execute given commandline and gather stdout.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#execi">execi</a>&nbsp;(command)</td>
++ <td class="summary">
++
++Return a line-buffered iterator over the output of given command.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#get_bytecode">get_bytecode</a>&nbsp;(val)</td>
++ <td class="summary">
++
++Return the current runtime bytecode of the given data.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#imatch">imatch</a>&nbsp;(val)</td>
++ <td class="summary">
++
++Return a matching iterator for the given value.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#instanceof">instanceof</a>&nbsp;(object, class)</td>
++ <td class="summary">
++
++Test whether the given object is an instance of the given class.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#keys">keys</a>&nbsp;(t)</td>
++ <td class="summary">
++
++Retrieve all keys of given associative table.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#kspairs">kspairs</a>&nbsp;(t)</td>
++ <td class="summary">
++
++Return a key, value iterator for the given table.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#libpath">libpath</a>&nbsp;()</td>
++ <td class="summary">
++
++Returns the absolute path to LuCI base directory.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#parse_units">parse_units</a>&nbsp;(ustr)</td>
++ <td class="summary">
++
++Parse certain units from the given string and return the canonical integer
++
++value or 0 if the unit is unknown.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#pcdata">pcdata</a>&nbsp;(value)</td>
++ <td class="summary">
++
++Create valid XML PCDATA from given string.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#perror">perror</a>&nbsp;(obj)</td>
++ <td class="summary">
++
++Write given object to stderr.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#restore_data">restore_data</a>&nbsp;(str)</td>
++ <td class="summary">
++
++Restore data previously serialized with serialize_data().</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#serialize_data">serialize_data</a>&nbsp;(val)</td>
++ <td class="summary">
++
++Recursively serialize given data to lua code, suitable for restoring
++
++with loadstring().</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#serialize_json">serialize_json</a>&nbsp;(data, writer)</td>
++ <td class="summary">
++
++Convert data structure to JSON
++ </td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#spairs">spairs</a>&nbsp;(t, f)</td>
++ <td class="summary">
++
++Return a key, value iterator which returns the values sorted according to
++
++the provided callback function.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#split">split</a>&nbsp;(str, pat, max, regex)</td>
++ <td class="summary">
++
++Splits given string on a defined separator sequence and return a table
++
++containing the resulting substrings.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#strip_bytecode">strip_bytecode</a>&nbsp;(code)</td>
++ <td class="summary">
++
++Strips unnescessary lua bytecode from given string.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#striptags">striptags</a>&nbsp;(value)</td>
++ <td class="summary">
++
++Strip HTML tags from given string.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#threadlocal">threadlocal</a>&nbsp;()</td>
++ <td class="summary">
++
++Create a new or get an already existing thread local store associated with
++
++the current active coroutine.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#trim">trim</a>&nbsp;(str)</td>
++ <td class="summary">
++
++Remove leading and trailing whitespace from given string value.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#ubus">ubus</a>&nbsp;(object, method, values)</td>
++ <td class="summary">
++
++Issue an ubus call.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#update">update</a>&nbsp;(t, updates)</td>
++ <td class="summary">
++
++Update values in given table with the values from the second given table.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#vspairs">vspairs</a>&nbsp;(t)</td>
++ <td class="summary">
++
++Return a key, value iterator for the given table.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="append"></a><strong>append</strong>&nbsp;(src, ...)</dt>
++<dd>
++
++
++Appends numerically indexed tables or single objects to a given table.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ src: Target table
++ </li>
++
++ <li>
++ ...: Objects to insert
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Target table
++
++
++
++</dd>
++
++
++
++
++<dt><a name="bigendian"></a><strong>bigendian</strong>&nbsp;()</dt>
++<dd>
++
++
++Test whether the current system is operating in big endian mode.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean value indicating whether system is big endian
++
++
++
++</dd>
++
++
++
++
++<dt><a name="class"></a><strong>class</strong>&nbsp;(base)</dt>
++<dd>
++
++
++Create a Class object (Python-style object model).
++
++The class object can be instantiated by calling itself.
++Any class functions or shared parameters can be attached to this object.
++Attaching a table to the class object makes this table shared between
++all instances of this class. For object parameters use the __init__ function.
++Classes can inherit member functions and values from a base class.
++Class can be instantiated by calling them. All parameters will be passed
++to the __init__ function of this class - if such a function exists.
++The __init__ function must be used to set any object parameters that are not shared
++with other objects of this class. Any return values will be ignored.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ base: The base class to inherit from (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++A class object
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#instanceof">
++ instanceof
++ </a>
++
++ <li><a href="#clone">
++ clone
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="clone"></a><strong>clone</strong>&nbsp;(object, deep)</dt>
++<dd>
++
++
++Clones the given object and return it's copy.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ object: Table value to clone
++ </li>
++
++ <li>
++ deep: Boolean indicating whether to do recursive cloning
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Cloned table value
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cmatch"></a><strong>cmatch</strong>&nbsp;(str, pattern)</dt>
++<dd>
++
++
++Count the occurences of given substring in given string.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ str: String to search in
++ </li>
++
++ <li>
++ pattern: String containing pattern to find
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Number of found occurences
++
++
++
++</dd>
++
++
++
++
++<dt><a name="combine"></a><strong>combine</strong>&nbsp;(tbl1, tbl2, ...)</dt>
++<dd>
++
++
++Combines two or more numerically indexed tables and single objects into one table.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ tbl1: Table value to combine
++ </li>
++
++ <li>
++ tbl2: Table value to combine
++ </li>
++
++ <li>
++ ...: More tables to combine
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table value containing all values of given tables
++
++
++
++</dd>
++
++
++
++
++<dt><a name="contains"></a><strong>contains</strong>&nbsp;(table, value)</dt>
++<dd>
++
++
++Checks whether the given table contains the given value.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ table: Table value
++ </li>
++
++ <li>
++ value: Value to search within the given table
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number indicating the first index at which the given value occurs
++ within table or false.
++
++
++
++</dd>
++
++
++
++
++<dt><a name="copcall"></a><strong>copcall</strong>&nbsp;(f, ...)</dt>
++<dd>
++
++
++This is a coroutine-safe drop-in replacement for Lua's "pcall"-function
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ f: Lua function to be called protected
++ </li>
++
++ <li>
++ ...: Parameters passed to the function
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++A boolean whether the function call succeeded and the returns
++ values of the function or the error object
++
++
++
++</dd>
++
++
++
++
++<dt><a name="coxpcall"></a><strong>coxpcall</strong>&nbsp;(f, err, ...)</dt>
++<dd>
++
++
++This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ f: Lua function to be called protected
++ </li>
++
++ <li>
++ err: Custom error handler
++ </li>
++
++ <li>
++ ...: Parameters passed to the function
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++A boolean whether the function call succeeded and the return
++ values of either the function or the error handler
++
++
++
++</dd>
++
++
++
++
++<dt><a name="dtable"></a><strong>dtable</strong>&nbsp;()</dt>
++<dd>
++
++
++Create a dynamic table which automatically creates subtables.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Dynamic Table
++
++
++
++</dd>
++
++
++
++
++<dt><a name="dumptable"></a><strong>dumptable</strong>&nbsp;(t, maxdepth)</dt>
++<dd>
++
++
++Recursively dumps a table to stdout, useful for testing and debugging.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ t: Table value to dump
++ </li>
++
++ <li>
++ maxdepth: Maximum depth
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Always nil
++
++
++
++</dd>
++
++
++
++
++<dt><a name="exec"></a><strong>exec</strong>&nbsp;(command)</dt>
++<dd>
++
++
++Execute given commandline and gather stdout.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ command: String containing command to execute
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing the command's stdout
++
++
++
++</dd>
++
++
++
++
++<dt><a name="execi"></a><strong>execi</strong>&nbsp;(command)</dt>
++<dd>
++
++
++Return a line-buffered iterator over the output of given command.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ command: String containing the command to execute
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Iterator
++
++
++
++</dd>
++
++
++
++
++<dt><a name="get_bytecode"></a><strong>get_bytecode</strong>&nbsp;(val)</dt>
++<dd>
++
++
++Return the current runtime bytecode of the given data. The byte code
++
++will be stripped before it is returned.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ val: Value to return as bytecode
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String value containing the bytecode of the given data
++
++
++
++</dd>
++
++
++
++
++<dt><a name="imatch"></a><strong>imatch</strong>&nbsp;(val)</dt>
++<dd>
++
++
++Return a matching iterator for the given value. The iterator will return
++
++one token per invocation, the tokens are separated by whitespace. If the
++input value is a table, it is transformed into a string first. A nil value
++will result in a valid interator which aborts with the first invocation.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ val: The value to scan (table, string or nil)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Iterator which returns one token per call
++
++
++
++</dd>
++
++
++
++
++<dt><a name="instanceof"></a><strong>instanceof</strong>&nbsp;(object, class)</dt>
++<dd>
++
++
++Test whether the given object is an instance of the given class.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ object: Object instance
++ </li>
++
++ <li>
++ class: Class object to test against
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean indicating whether the object is an instance
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#class">
++ class
++ </a>
++
++ <li><a href="#clone">
++ clone
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="keys"></a><strong>keys</strong>&nbsp;(t)</dt>
++<dd>
++
++
++Retrieve all keys of given associative table.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ t: Table to extract keys from
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Sorted table containing the keys
++
++
++
++</dd>
++
++
++
++
++<dt><a name="kspairs"></a><strong>kspairs</strong>&nbsp;(t)</dt>
++<dd>
++
++
++Return a key, value iterator for the given table.
++
++The table pairs are sorted by key.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ t: The table to iterate
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Function value containing the corresponding iterator
++
++
++
++</dd>
++
++
++
++
++<dt><a name="libpath"></a><strong>libpath</strong>&nbsp;()</dt>
++<dd>
++
++
++Returns the absolute path to LuCI base directory.
++
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing the directory path
++
++
++
++</dd>
++
++
++
++
++<dt><a name="parse_units"></a><strong>parse_units</strong>&nbsp;(ustr)</dt>
++<dd>
++
++
++Parse certain units from the given string and return the canonical integer
++
++value or 0 if the unit is unknown. Upper- or lower case is irrelevant.
++Recognized units are:
++ o "y" - one year (60*60*24*366)
++ o "m" - one month (60*60*24*31)
++ o "w" - one week (60*60*24*7)
++ o "d" - one day (60*60*24)
++ o "h" - one hour (60*60)
++ o "min" - one minute (60)
++ o "kb" - one kilobyte (1024)
++ o "mb" - one megabyte (1024*1024)
++ o "gb" - one gigabyte (1024*1024*1024)
++ o "kib" - one si kilobyte (1000)
++ o "mib" - one si megabyte (1000*1000)
++ o "gib" - one si gigabyte (1000*1000*1000)
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ustr: String containing a numerical value with trailing unit
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Number containing the canonical value
++
++
++
++</dd>
++
++
++
++
++<dt><a name="pcdata"></a><strong>pcdata</strong>&nbsp;(value)</dt>
++<dd>
++
++
++Create valid XML PCDATA from given string.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ value: String value containing the data to escape
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String value containing the escaped data
++
++
++
++</dd>
++
++
++
++
++<dt><a name="perror"></a><strong>perror</strong>&nbsp;(obj)</dt>
++<dd>
++
++
++Write given object to stderr.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ obj: Value to write to stderr
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Boolean indicating whether the write operation was successful
++
++
++
++</dd>
++
++
++
++
++<dt><a name="restore_data"></a><strong>restore_data</strong>&nbsp;(str)</dt>
++<dd>
++
++
++Restore data previously serialized with serialize_data().
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ str: String containing the data to restore
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Value containing the restored data structure
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#serialize_data">
++ serialize_data
++ </a>
++
++ <li><a href="#get_bytecode">
++ get_bytecode
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="serialize_data"></a><strong>serialize_data</strong>&nbsp;(val)</dt>
++<dd>
++
++
++Recursively serialize given data to lua code, suitable for restoring
++
++with loadstring().
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ val: Value containing the data to serialize
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String value containing the serialized code
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#restore_data">
++ restore_data
++ </a>
++
++ <li><a href="#get_bytecode">
++ get_bytecode
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="serialize_json"></a><strong>serialize_json</strong>&nbsp;(data, writer)</dt>
++<dd>
++
++
++Convert data structure to JSON
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ data: The data to serialize
++ </li>
++
++ <li>
++ writer: A function to write a chunk of JSON data (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String containing the JSON if called without write callback
++
++
++
++</dd>
++
++
++
++
++<dt><a name="spairs"></a><strong>spairs</strong>&nbsp;(t, f)</dt>
++<dd>
++
++
++Return a key, value iterator which returns the values sorted according to
++
++the provided callback function.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ t: The table to iterate
++ </li>
++
++ <li>
++ f: A callback function to decide the order of elements
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Function value containing the corresponding iterator
++
++
++
++</dd>
++
++
++
++
++<dt><a name="split"></a><strong>split</strong>&nbsp;(str, pat, max, regex)</dt>
++<dd>
++
++
++Splits given string on a defined separator sequence and return a table
++
++containing the resulting substrings. The optional max parameter specifies
++the number of bytes to process, regardless of the actual length of the given
++string. The optional last parameter, regex, specifies whether the separator
++sequence is interpreted as regular expression.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ str: String value containing the data to split up
++ </li>
++
++ <li>
++ pat: String with separator pattern (optional, defaults to "\n")
++ </li>
++
++ <li>
++ max: Maximum times to split (optional)
++ </li>
++
++ <li>
++ regex: Boolean indicating whether to interpret the separator
++ pattern as regular expression (optional, default is false)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing the resulting substrings
++
++
++
++</dd>
++
++
++
++
++<dt><a name="strip_bytecode"></a><strong>strip_bytecode</strong>&nbsp;(code)</dt>
++<dd>
++
++
++Strips unnescessary lua bytecode from given string. Information like line
++
++numbers and debugging numbers will be discarded. Original version by
++Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html)
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ code: String value containing the original lua byte code
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String value containing the stripped lua byte code
++
++
++
++</dd>
++
++
++
++
++<dt><a name="striptags"></a><strong>striptags</strong>&nbsp;(value)</dt>
++<dd>
++
++
++Strip HTML tags from given string.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ value: String containing the HTML text
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String with HTML tags stripped of
++
++
++
++</dd>
++
++
++
++
++<dt><a name="threadlocal"></a><strong>threadlocal</strong>&nbsp;()</dt>
++<dd>
++
++
++Create a new or get an already existing thread local store associated with
++
++the current active coroutine. A thread local store is private a table object
++whose values can't be accessed from outside of the running coroutine.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table value representing the corresponding thread local store
++
++
++
++</dd>
++
++
++
++
++<dt><a name="trim"></a><strong>trim</strong>&nbsp;(str)</dt>
++<dd>
++
++
++Remove leading and trailing whitespace from given string value.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ str: String value containing whitespace padded data
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++String value with leading and trailing space removed
++
++
++
++</dd>
++
++
++
++
++<dt><a name="ubus"></a><strong>ubus</strong>&nbsp;(object, method, values)</dt>
++<dd>
++
++
++Issue an ubus call.
++
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ object: String containing the ubus object to call
++ </li>
++
++ <li>
++ method: String containing the ubus method to call
++ </li>
++
++ <li>
++ values: Table containing the values to pass
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containin the ubus result
++
++
++
++</dd>
++
++
++
++
++<dt><a name="update"></a><strong>update</strong>&nbsp;(t, updates)</dt>
++<dd>
++
++
++Update values in given table with the values from the second given table.
++
++Both table are - in fact - merged together.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ t: Table which should be updated
++ </li>
++
++ <li>
++ updates: Table containing the values to update
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Always nil
++
++
++
++</dd>
++
++
++
++
++<dt><a name="vspairs"></a><strong>vspairs</strong>&nbsp;(t)</dt>
++<dd>
++
++
++Return a key, value iterator for the given table.
++
++The table pairs are sorted by value.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ t: The table to iterate
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Function value containing the corresponding iterator
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.CHANGELOG.html b/feeds/luci/documentation/api/modules/nixio.CHANGELOG.html
+new file mode 100644
+index 0000000..48bedc8
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.CHANGELOG.html
+@@ -0,0 +1,290 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li><strong>nixio.CHANGELOG</strong></li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>nixio.CHANGELOG</code></h1>
++
++<p>
++ Changes and improvements.</p>
++
++
++
++
++
++
++
++
++
++
++<h2>Tables</h2>
++<table class="table_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#0.2">0.2</a></td>
++ <td class="summary">
++ Initial Release.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#0.3">0.3</a></td>
++ <td class="summary">
++ Service Release.</td>
++ </tr>
++
++</table>
++
++
++
++<br/>
++<br/>
++
++
++
++
++<h2><a name="tables"></a>Tables</h2>
++<dl class="table">
++
++<dt><a name="0.2"></a><strong>0.2</strong></dt>
++<dd>
++ Initial Release.
++ <ul>
++ <li>Initial Release</li>
++ </ul>
++
++
++
++</dd>
++
++
++<dt><a name="0.3"></a><strong>0.3</strong></dt>
++<dd>
++ Service Release.
++ <ul>
++ <li>Added getifaddrs() function.</li>
++ <li>Added getsockopt(), setsockopt(), getsockname() and getpeername()
++ directly to TLS-socket objects unifying the socket interface.</li>
++ <li>Added support for CyaSSL as cryptographical backend.</li>
++ <li>Added support for x509 certificates in DER format.</li>
++ <li>Added support for splice() in UnifiedIO.copyz().</li>
++ <li>Added interface to inject chunks into UnifiedIO.linesource() buffer.</li>
++ <li>Changed TLS behaviour to explicitely separate servers and clients.</li>
++ <li>Fixed usage of signed datatype breaking Base64 decoding.</li>
++ <li>Fixed namespace clashes for nixio.fs.</li>
++ <li>Fixed splice() support for some exotic C libraries.</li>
++ <li>Reconfigure axTLS cryptographical provider and mark it as obsolete.</li>
++ </ul>
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.CryptoHash.html b/feeds/luci/documentation/api/modules/nixio.CryptoHash.html
+new file mode 100644
+index 0000000..6158a77
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.CryptoHash.html
+@@ -0,0 +1,316 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li><strong>nixio.CryptoHash</strong></li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>nixio.CryptoHash</code></h1>
++
++<p>
++ Cryptographical Hash and HMAC object.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#CryptoHash.final">CryptoHash:final</a>&nbsp;()</td>
++ <td class="summary">
++ Finalize the hash and return the digest.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#CryptoHash.update">CryptoHash:update</a>&nbsp;(chunk)</td>
++ <td class="summary">
++ Add another chunk of data to be hashed.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="CryptoHash.final"></a><strong>CryptoHash:final</strong>&nbsp;()</dt>
++<dd>
++
++ Finalize the hash and return the digest.
++
++
++
++
++
++<h3>Usage:</h3>
++You cannot call update on a hash object that was already finalized
++ you can however call final multiple times to get the digest.
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>hexdigest
++
++ <li>buffer containing binary digest
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="CryptoHash.update"></a><strong>CryptoHash:update</strong>&nbsp;(chunk)</dt>
++<dd>
++
++ Add another chunk of data to be hashed.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ chunk: Chunk of data
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++CryptoHash object (self)
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.File.html b/feeds/luci/documentation/api/modules/nixio.File.html
+new file mode 100644
+index 0000000..d9e67ea
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.File.html
+@@ -0,0 +1,673 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li><strong>nixio.File</strong></li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>nixio.File</code></h1>
++
++<p>
++ Large File Object.
++ Large file operations are supported up to 52 bits if the Lua number type is
++ double (default).</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#File.close">File:close</a>&nbsp;()</td>
++ <td class="summary">
++ Close the file descriptor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#File.fileno">File:fileno</a>&nbsp;()</td>
++ <td class="summary">
++ Get the number of the filedescriptor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#File.lock">File:lock</a>&nbsp;(command, length)</td>
++ <td class="summary">
++ Apply or test a lock on the file.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#File.read">File:read</a>&nbsp;(length)</td>
++ <td class="summary">
++ Read from a file descriptor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#File.seek">File:seek</a>&nbsp;(offset, whence)</td>
++ <td class="summary">
++ Reposition read / write offset of the file descriptor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#File.setblocking">File:setblocking</a>&nbsp;(blocking)</td>
++ <td class="summary">
++ (POSIX) Set the blocking mode of the file descriptor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#File.stat">File:stat</a>&nbsp;(field)</td>
++ <td class="summary">
++ Get file status and attributes.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#File.sync">File:sync</a>&nbsp;(data_only)</td>
++ <td class="summary">
++ Synchronizes the file with the storage device.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#File.tell">File:tell</a>&nbsp;()</td>
++ <td class="summary">
++ Return the current read / write offset of the file descriptor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#File.write">File:write</a>&nbsp;(buffer, offset, length)</td>
++ <td class="summary">
++ Write to the file descriptor.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="File.close"></a><strong>File:close</strong>&nbsp;()</dt>
++<dd>
++
++ Close the file descriptor.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="File.fileno"></a><strong>File:fileno</strong>&nbsp;()</dt>
++<dd>
++
++ Get the number of the filedescriptor.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++file descriptor number
++
++
++
++</dd>
++
++
++
++
++<dt><a name="File.lock"></a><strong>File:lock</strong>&nbsp;(command, length)</dt>
++<dd>
++
++ Apply or test a lock on the file.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ command: Locking Command ["lock", "tlock", "ulock", "test"]
++ </li>
++
++ <li>
++ length: Amount of Bytes to lock from current offset (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function calls lockf() on POSIX and _locking() on Windows.
++
++ <li>The "lock" command is blocking, "tlock" is non-blocking,
++ "ulock" unlocks and "test" only tests for the lock.
++
++ <li>The "test" command is not available on Windows.
++
++ <li>Locks are by default advisory on POSIX, but mandatory on Windows.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="File.read"></a><strong>File:read</strong>&nbsp;(length)</dt>
++<dd>
++
++ Read from a file descriptor.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ length: Amount of data to read (in Bytes).
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li><strong>Warning:</strong> It is not guaranteed that all requested data
++ is read at once especially when dealing with pipes.
++ You have to check the return value - the length of the buffer actually read -
++ or use the safe IO functions in the high-level IO utility module.
++
++ <li>The length of the return buffer is limited by the (compile time)
++ nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
++ Any read request greater than that will be safely truncated to this value.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++buffer containing data successfully read
++
++
++
++</dd>
++
++
++
++
++<dt><a name="File.seek"></a><strong>File:seek</strong>&nbsp;(offset, whence)</dt>
++<dd>
++
++ Reposition read / write offset of the file descriptor.
++ The seek will be done either from the beginning of the file or relative
++ to the current position or relative to the end.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ offset: File Offset
++ </li>
++
++ <li>
++ whence: Starting point [<strong>"set"</strong>, "cur", "end"]
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function calls lseek().
++
++
++
++<h3>Return value:</h3>
++new (absolute) offset position
++
++
++
++</dd>
++
++
++
++
++<dt><a name="File.setblocking"></a><strong>File:setblocking</strong>&nbsp;(blocking)</dt>
++<dd>
++
++ (POSIX) Set the blocking mode of the file descriptor.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ blocking: (boolean)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="File.stat"></a><strong>File:stat</strong>&nbsp;(field)</dt>
++<dd>
++
++ Get file status and attributes.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ field: Only return a specific field, not the whole table (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function calls fstat().
++
++
++
++<h3>Return value:</h3>
++Table containing: <ul>
++ <li>atime = Last access timestamp</li>
++ <li>blksize = Blocksize (POSIX only)</li>
++ <li>blocks = Blocks used (POSIX only)</li>
++ <li>ctime = Creation timestamp</li>
++ <li>dev = Device ID</li>
++ <li>gid = Group ID</li>
++ <li>ino = Inode</li>
++ <li>modedec = Mode converted into a decimal number</li>
++ <li>modestr = Mode as string as returned by <code>ls -l</code></li>
++ <li>mtime = Last modification timestamp</li>
++ <li>nlink = Number of links</li>
++ <li>rdev = Device ID (if special file)</li>
++ <li>size = Size in bytes</li>
++ <li>type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]</li>
++ <li>uid = User ID</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="File.sync"></a><strong>File:sync</strong>&nbsp;(data_only)</dt>
++<dd>
++
++ Synchronizes the file with the storage device.
++ Returns when the file is successfully written to the disk.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ data_only: Do not synchronize the metadata. (optional, boolean)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function calls fsync() when data_only equals false
++ otherwise fdatasync(), on Windows _commit() is used instead.
++
++ <li>fdatasync() is only supported by Linux and Solaris. For other systems
++ the <em>data_only</em> parameter is ignored and fsync() is always called.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="File.tell"></a><strong>File:tell</strong>&nbsp;()</dt>
++<dd>
++
++ Return the current read / write offset of the file descriptor.
++
++
++
++
++
++<h3>Usage:</h3>
++This function calls lseek() with offset 0 from the current position.
++
++
++
++<h3>Return value:</h3>
++offset position
++
++
++
++</dd>
++
++
++
++
++<dt><a name="File.write"></a><strong>File:write</strong>&nbsp;(buffer, offset, length)</dt>
++<dd>
++
++ Write to the file descriptor.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ buffer: Buffer holding the data to be written.
++ </li>
++
++ <li>
++ offset: Offset to start reading the buffer from. (optional)
++ </li>
++
++ <li>
++ length: Length of chunk to read from the buffer. (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li><strong>Warning:</strong> It is not guaranteed that all data
++ in the buffer is written at once especially when dealing with pipes.
++ You have to check the return value - the number of bytes actually written -
++ or use the safe IO functions in the high-level IO utility module.
++
++ <li>Unlike standard Lua indexing the lowest offset and default is 0.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++number of bytes written
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.README.html b/feeds/luci/documentation/api/modules/nixio.README.html
+new file mode 100644
+index 0000000..a8da0f3
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.README.html
+@@ -0,0 +1,374 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li><strong>nixio.README</strong></li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>nixio.README</code></h1>
++
++<p>
++ General Information.</p>
++
++
++
++
++
++
++
++
++
++
++<h2>Tables</h2>
++<table class="table_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#Errorhandling">Errorhandling</a></td>
++ <td class="summary">
++ General error handling information.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Functions">Functions</a></td>
++ <td class="summary">
++ Function conventions.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Platforms">Platforms</a></td>
++ <td class="summary">
++ Platform information.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLS-Crypto">TLS-Crypto</a></td>
++ <td class="summary">
++ Cryptography and TLS libraries.</td>
++ </tr>
++
++</table>
++
++
++
++<br/>
++<br/>
++
++
++
++
++<h2><a name="tables"></a>Tables</h2>
++<dl class="table">
++
++<dt><a name="Errorhandling"></a><strong>Errorhandling</strong></dt>
++<dd>
++ General error handling information.
++ <ul>
++ <li> Most of the functions available in this library may fail. If any error
++ occurs the function returns <strong>nil or false</strong>, an error code
++ (usually errno) and an additional error message text (if avaialable).</li>
++ <li>At the moment false is only returned when a non-blocking I/O function
++ fails with EAGAIN, EWOULDBLOCK or WSAEWOULDBLOCK for any others nil is
++ returned as first parameter. Therefore you can use false to write portable
++ non-blocking I/O applications.</li>
++ <li>Note that the function documentation does only mention the return values
++ in case of a successful operation.</li>
++ <li>You can find a table of common error numbers and other useful constants
++ like signal numbers in <strong>nixio.const</strong> e.g. nixio.const.EINVAL,
++ nixio.const.SIGTERM, etc. For portability there is a second error constant
++ table <strong>nixio.const_sock</strong> for socket error codes. This might
++ be important if you are dealing with Windows applications, on POSIX however
++ const_sock is just an alias for const.</li>
++ <li>With some exceptions - which are explicitely stated in the function
++ documentation - all blocking functions are signal-protected and will not fail
++ with EINTR.</li>
++ <li>On POSIX the SIGPIPE signal will be set to ignore upon initialization.
++ You should restore the default behaviour or set a custom signal handler
++ in your program after loading nixio if you need this behaviour.</li>
++ </ul>
++
++
++
++</dd>
++
++
++<dt><a name="Functions"></a><strong>Functions</strong></dt>
++<dd>
++ Function conventions.
++ <br />In general all functions are namend and behave like their POSIX API
++ counterparts - where applicable - applying the following rules:
++ <ul>
++ <li>Functions should be named like the underlying POSIX API function ommiting
++ prefixes or suffixes - especially when placed in an object-context (
++ lockf -> File:lock, fsync -> File:sync, dup2 -> dup, ...)</li>
++ <li>If you are unclear about the behaviour of a function you should consult
++ your OS API documentation (e.g. the manpages).</li>
++ <li>If the name is significantly different from the POSIX-function, the
++ underlying function(s) are stated in the documentation.</li>
++ <li>Parameters should reflect those of the C-API, buffer length arguments and
++ by-reference parameters should be ommitted for pratical purposes.</li>
++ <li>If a C function accepts a bitfield as parameter, it should be translated
++ into lower case string flags representing the flags if the bitfield is the
++ last parameter and also ommiting prefixes or suffixes. (e.g. waitpid
++ (pid, &s, WNOHANG | WUNTRACED) -> waitpid(pid, "nohang", "untraced"),
++ getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) ->
++ Socket:getopt("socket", "reuseaddr"), etc.) </li>
++ <li>If it is not applicable to provide a string representation of the
++ bitfield a bitfield generator helper is provided. It is named FUNCTION_flags.
++ (open("/tmp/test", O_RDONLY | O_NONBLOCK) -> open("/tmp/test", open_flags(
++ "rdonly", "nonblock")))</li>
++ </ul>
++
++
++
++</dd>
++
++
++<dt><a name="Platforms"></a><strong>Platforms</strong></dt>
++<dd>
++ Platform information.
++ <ul>
++ <li>The minimum platform requirements are a decent POSIX 2001 support.
++ Builds are more or less tested on Linux, Solaris and FreeBSD. Builds for
++ Windows XP SP1 and later can be compiled with MinGW either from Windows
++ itself or using the MinGW cross-compiler. Earlier versions of Windows are not
++ supported.</li>
++ <li>In general all functions which don't have any remarks
++ in their documentation are available on all platforms.</li>
++ <li>Functions with a (POSIX), (Linux) or similar prefix are only available
++ on these specific platforms. Same appplies to parameters of functions
++ with a similar suffix.</li>
++ <li>Some functions might have limitations on some platforms. This should
++ be stated in the documentation. Please also consult your OS API
++ documentation.</li>
++ </ul>
++
++
++
++</dd>
++
++
++<dt><a name="TLS-Crypto"></a><strong>TLS-Crypto</strong></dt>
++<dd>
++ Cryptography and TLS libraries.
++ <ul>
++ <li>Currently 3 underlying cryptography libraries are supported: openssl,
++ cyassl and axTLS. The name of the library in use is written to
++ <strong>nixio.tls_provider</strong></li>
++ <li>You should whenever possible use openssl or cyassl as axTLS has only
++ limited support. It does not provide support for non-blocking sockets and
++ is probably less audited than the other ones.</li>
++ <li>As the supported Windows versions are not suitable for embedded devices
++ axTLS is at the moment not supported on Windows.</li>
++ </ul>
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.Socket.html b/feeds/luci/documentation/api/modules/nixio.Socket.html
+new file mode 100644
+index 0000000..105682c
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.Socket.html
+@@ -0,0 +1,1033 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li><strong>nixio.Socket</strong></li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>nixio.Socket</code></h1>
++
++<p>
++ Socket Object.
++ Supports IPv4, IPv6 and UNIX (POSIX only) families.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.accept">Socket:accept</a>&nbsp;()</td>
++ <td class="summary">
++ Accept a connection on the socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.bind">Socket:bind</a>&nbsp;(host, port)</td>
++ <td class="summary">
++ Bind the socket to a network address.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.close">Socket:close</a>&nbsp;()</td>
++ <td class="summary">
++ Close the socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.connect">Socket:connect</a>&nbsp;(host, port)</td>
++ <td class="summary">
++ Connect the socket to a network address.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.fileno">Socket:fileno</a>&nbsp;()</td>
++ <td class="summary">
++ Get the number of the filedescriptor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.getopt">Socket:getopt</a>&nbsp;(level, option)</td>
++ <td class="summary">
++ Get a socket option.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.getpeername">Socket:getpeername</a>&nbsp;()</td>
++ <td class="summary">
++ Get the peer address of a socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.getsockname">Socket:getsockname</a>&nbsp;()</td>
++ <td class="summary">
++ Get the local address of a socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.listen">Socket:listen</a>&nbsp;(backlog)</td>
++ <td class="summary">
++ Listen for connections on the socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.read ">Socket:read </a>&nbsp;(length)</td>
++ <td class="summary">
++ Receive a message on the socket (This is an alias for recv).</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.recv ">Socket:recv </a>&nbsp;(length)</td>
++ <td class="summary">
++ Receive a message on the socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.recvfrom">Socket:recvfrom</a>&nbsp;(length)</td>
++ <td class="summary">
++ Receive a message on the socket including the senders source address.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.send">Socket:send</a>&nbsp;(buffer, offset, length)</td>
++ <td class="summary">
++ Send a message on the socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.sendto">Socket:sendto</a>&nbsp;(buffer, host, port, offset, length)</td>
++ <td class="summary">
++ Send a message on the socket specifying the destination.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.setblocking">Socket:setblocking</a>&nbsp;(blocking)</td>
++ <td class="summary">
++ Set the blocking mode of the socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.setopt">Socket:setopt</a>&nbsp;(level, option, value)</td>
++ <td class="summary">
++ Set a socket option.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.shutdown">Socket:shutdown</a>&nbsp;(how)</td>
++ <td class="summary">
++ Shut down part of a full-duplex connection.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#Socket.write">Socket:write</a>&nbsp;(buffer, offset, length)</td>
++ <td class="summary">
++ Send a message on the socket (This is an alias for send).</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="Socket.accept"></a><strong>Socket:accept</strong>&nbsp;()</dt>
++<dd>
++
++ Accept a connection on the socket.
++
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>Socket Object
++
++ <li>Peer IP-Address
++
++ <li>Peer Port
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.bind"></a><strong>Socket:bind</strong>&nbsp;(host, port)</dt>
++<dd>
++
++ Bind the socket to a network address.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ host: Host (optional, default: all addresses)
++ </li>
++
++ <li>
++ port: Port or service description
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function calls getaddrinfo() and bind() but NOT listen().
++
++ <li>If <em>host</em> is a domain name it will be looked up and bind()
++ tries the IP-Addresses in the order returned by the DNS resolver
++ until the bind succeeds.
++
++ <li>UNIX sockets ignore the <em>port</em>,
++ and interpret <em>host</em> as a socket path.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.close"></a><strong>Socket:close</strong>&nbsp;()</dt>
++<dd>
++
++ Close the socket.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.connect"></a><strong>Socket:connect</strong>&nbsp;(host, port)</dt>
++<dd>
++
++ Connect the socket to a network address.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ host: Hostname or IP-Address (optional, default: localhost)
++ </li>
++
++ <li>
++ port: Port or service description
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function calls getaddrinfo() and connect().
++
++ <li>If <em>host</em> is a domain name it will be looked up and connect()
++ tries the IP-Addresses in the order returned by the DNS resolver
++ until the connect succeeds.
++
++ <li>UNIX sockets ignore the <em>port</em>,
++ and interpret <em>host</em> as a socket path.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.fileno"></a><strong>Socket:fileno</strong>&nbsp;()</dt>
++<dd>
++
++ Get the number of the filedescriptor.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++file descriptor number
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.getopt"></a><strong>Socket:getopt</strong>&nbsp;(level, option)</dt>
++<dd>
++
++ Get a socket option.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ level: Level ["socket", "tcp", "ip", "ipv6"]
++ </li>
++
++ <li>
++ option: Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf",
++ "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute",
++ "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP),
++ "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop"
++ (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops"
++ (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)]
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Value
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.getpeername"></a><strong>Socket:getpeername</strong>&nbsp;()</dt>
++<dd>
++
++ Get the peer address of a socket.
++
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>IP-Address
++
++ <li>Port
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.getsockname"></a><strong>Socket:getsockname</strong>&nbsp;()</dt>
++<dd>
++
++ Get the local address of a socket.
++
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>IP-Address
++
++ <li>Port
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.listen"></a><strong>Socket:listen</strong>&nbsp;(backlog)</dt>
++<dd>
++
++ Listen for connections on the socket.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ backlog: Length of queue for pending connections
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.read "></a><strong>Socket:read </strong>&nbsp;(length)</dt>
++<dd>
++
++ Receive a message on the socket (This is an alias for recv).
++ See the recvfrom description for more details.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ length: Amount of data to read (in Bytes).
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++buffer containing data successfully read
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#Socket.recvfrom">
++ Socket:recvfrom
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="Socket.recv "></a><strong>Socket:recv </strong>&nbsp;(length)</dt>
++<dd>
++
++ Receive a message on the socket.
++ This function is identical to recvfrom except that it does not return
++ the sender's source address. See the recvfrom description for more details.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ length: Amount of data to read (in Bytes).
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++buffer containing data successfully read
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#Socket.recvfrom">
++ Socket:recvfrom
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="Socket.recvfrom"></a><strong>Socket:recvfrom</strong>&nbsp;(length)</dt>
++<dd>
++
++ Receive a message on the socket including the senders source address.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ length: Amount of data to read (in Bytes).
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li><strong>Warning:</strong> It is not guaranteed that all requested data
++ is read at once.
++ You have to check the return value - the length of the buffer actually read -
++ or use the safe IO functions in the high-level IO utility module.
++
++ <li>The length of the return buffer is limited by the (compile time)
++ nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
++ Any read request greater than that will be safely truncated to this value.
++
++</ul>
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>buffer containing data successfully read
++
++ <li>host IP-Address of the sender
++
++ <li>port Port of the sender
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.send"></a><strong>Socket:send</strong>&nbsp;(buffer, offset, length)</dt>
++<dd>
++
++ Send a message on the socket.
++ This function is identical to sendto except for the missing destination
++ paramters. See the sendto description for a detailed description.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ buffer: Buffer holding the data to be written.
++ </li>
++
++ <li>
++ offset: Offset to start reading the buffer from. (optional)
++ </li>
++
++ <li>
++ length: Length of chunk to read from the buffer. (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number of bytes written
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#Socket.sendto">
++ Socket:sendto
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="Socket.sendto"></a><strong>Socket:sendto</strong>&nbsp;(buffer, host, port, offset, length)</dt>
++<dd>
++
++ Send a message on the socket specifying the destination.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ buffer: Buffer holding the data to be written.
++ </li>
++
++ <li>
++ host: Target IP-Address
++ </li>
++
++ <li>
++ port: Target Port
++ </li>
++
++ <li>
++ offset: Offset to start reading the buffer from. (optional)
++ </li>
++
++ <li>
++ length: Length of chunk to read from the buffer. (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li><strong>Warning:</strong> It is not guaranteed that all data
++ in the buffer is written at once.
++ You have to check the return value - the number of bytes actually written -
++ or use the safe IO functions in the high-level IO utility module.
++
++ <li>Unlike standard Lua indexing the lowest offset and default is 0.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++number of bytes written
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.setblocking"></a><strong>Socket:setblocking</strong>&nbsp;(blocking)</dt>
++<dd>
++
++ Set the blocking mode of the socket.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ blocking: (boolean)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.setopt"></a><strong>Socket:setopt</strong>&nbsp;(level, option, value)</dt>
++<dd>
++
++ Set a socket option.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ level: Level ["socket", "tcp", "ip", "ipv6"]
++ </li>
++
++ <li>
++ option: Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf",
++ "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute",
++ "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP),
++ "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop"
++ (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops"
++ (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)]
++ </li>
++
++ <li>
++ value: Value
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.shutdown"></a><strong>Socket:shutdown</strong>&nbsp;(how)</dt>
++<dd>
++
++ Shut down part of a full-duplex connection.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ how: (optional, default: rdwr) ["rdwr", "rd", "wr"]
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="Socket.write"></a><strong>Socket:write</strong>&nbsp;(buffer, offset, length)</dt>
++<dd>
++
++ Send a message on the socket (This is an alias for send).
++ See the sendto description for a detailed description.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ buffer: Buffer holding the data to be written.
++ </li>
++
++ <li>
++ offset: Offset to start reading the buffer from. (optional)
++ </li>
++
++ <li>
++ length: Length of chunk to read from the buffer. (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number of bytes written
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#Socket.sendto">
++ Socket:sendto
++ </a>
++
++</ul>
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.TLSContext.html b/feeds/luci/documentation/api/modules/nixio.TLSContext.html
+new file mode 100644
+index 0000000..a91b1ee
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.TLSContext.html
+@@ -0,0 +1,479 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li><strong>nixio.TLSContext</strong></li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>nixio.TLSContext</code></h1>
++
++<p>
++ Transport Layer Security Context Object.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSContext.create">TLSContext:create</a>&nbsp;(socket)</td>
++ <td class="summary">
++ Create a TLS Socket from a socket descriptor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSContext.set_cert">TLSContext:set_cert</a>&nbsp;(path)</td>
++ <td class="summary">
++ Assign a PEM certificate to this context.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSContext.set_ciphers">TLSContext:set_ciphers</a>&nbsp;(cipherlist)</td>
++ <td class="summary">
++ Set the available ciphers for this context.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSContext.set_key">TLSContext:set_key</a>&nbsp;(path)</td>
++ <td class="summary">
++ Assign a PEM private key to this context.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSContext.set_verify">TLSContext:set_verify</a>&nbsp;(flag1, ...)</td>
++ <td class="summary">
++ Set the verification flags of this context.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSContext.set_verify_depth">TLSContext:set_verify_depth</a>&nbsp;(depth)</td>
++ <td class="summary">
++ Set the verification depth of this context.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="TLSContext.create"></a><strong>TLSContext:create</strong>&nbsp;(socket)</dt>
++<dd>
++
++ Create a TLS Socket from a socket descriptor.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ socket: Socket Object
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++TLSSocket Object
++
++
++
++</dd>
++
++
++
++
++<dt><a name="TLSContext.set_cert"></a><strong>TLSContext:set_cert</strong>&nbsp;(path)</dt>
++<dd>
++
++ Assign a PEM certificate to this context.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Certificate File path
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function calls SSL_CTX_use_certificate_chain_file().
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="TLSContext.set_ciphers"></a><strong>TLSContext:set_ciphers</strong>&nbsp;(cipherlist)</dt>
++<dd>
++
++ Set the available ciphers for this context.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ cipherlist: String containing a list of ciphers
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function calls SSL_CTX_set_cipher_list().
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="TLSContext.set_key"></a><strong>TLSContext:set_key</strong>&nbsp;(path)</dt>
++<dd>
++
++ Assign a PEM private key to this context.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Private Key File path
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function calls SSL_CTX_use_PrivateKey_file().
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="TLSContext.set_verify"></a><strong>TLSContext:set_verify</strong>&nbsp;(flag1, ...)</dt>
++<dd>
++
++ Set the verification flags of this context.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ flag1: First Flag ["none", "peer", "verify_fail_if_no_peer_cert",
++ "client_once"]
++ </li>
++
++ <li>
++ ...: More Flags [-"-]
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function calls SSL_CTX_set_verify().
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="TLSContext.set_verify_depth"></a><strong>TLSContext:set_verify_depth</strong>&nbsp;(depth)</dt>
++<dd>
++
++ Set the verification depth of this context.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ depth: Depth
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function calls SSL_CTX_set_verify_depth().
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.TLSSocket.html b/feeds/luci/documentation/api/modules/nixio.TLSSocket.html
+new file mode 100644
+index 0000000..3d99a64
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.TLSSocket.html
+@@ -0,0 +1,575 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li><strong>nixio.TLSSocket</strong></li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>nixio.TLSSocket</code></h1>
++
++<p>
++ TLS Socket Object.
++ TLS Sockets contain the underlying socket and context in the fields
++ "socket" and "context".</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSSocket.accept">TLSSocket:accept</a>&nbsp;()</td>
++ <td class="summary">
++ Wait for a TLS handshake from a client.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSSocket.connect">TLSSocket:connect</a>&nbsp;()</td>
++ <td class="summary">
++ Initiate the TLS handshake as client with the server.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSSocket.read ">TLSSocket:read </a>&nbsp;(length)</td>
++ <td class="summary">
++ Receive a message on the socket (This is an alias for recv).</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSSocket.recv">TLSSocket:recv</a>&nbsp;(length)</td>
++ <td class="summary">
++ Receive a message on the socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSSocket.send">TLSSocket:send</a>&nbsp;(buffer, offset, length)</td>
++ <td class="summary">
++ Send a message to the socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSSocket.shutdown">TLSSocket:shutdown</a>&nbsp;()</td>
++ <td class="summary">
++ Shut down the TLS connection.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#TLSSocket.write">TLSSocket:write</a>&nbsp;(buffer, offset, length)</td>
++ <td class="summary">
++ Send a message on the socket (This is an alias for send).</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="TLSSocket.accept"></a><strong>TLSSocket:accept</strong>&nbsp;()</dt>
++<dd>
++
++ Wait for a TLS handshake from a client.
++
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function calls SSL_accept().
++
++ <li>You have to call either connect or accept before transmitting data.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#TLSSocket.connect">
++ TLSSocket:connect
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="TLSSocket.connect"></a><strong>TLSSocket:connect</strong>&nbsp;()</dt>
++<dd>
++
++ Initiate the TLS handshake as client with the server.
++
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function calls SSL_connect().
++
++ <li>You have to call either connect or accept before transmitting data.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#TLSSocket.accept">
++ TLSSocket:accept
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="TLSSocket.read "></a><strong>TLSSocket:read </strong>&nbsp;(length)</dt>
++<dd>
++
++ Receive a message on the socket (This is an alias for recv).
++ See the recv description for more details.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ length: Amount of data to read (in Bytes).
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++buffer containing data successfully read
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#TLSSocket.recv">
++ TLSSocket:recv
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="TLSSocket.recv"></a><strong>TLSSocket:recv</strong>&nbsp;(length)</dt>
++<dd>
++
++ Receive a message on the socket.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ length: Amount of data to read (in Bytes).
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function calls SSL_read().
++
++ <li><strong>Warning:</strong> It is not guaranteed that all requested data
++ is read at once.
++ You have to check the return value - the length of the buffer actually read -
++ or use the safe IO functions in the high-level IO utility module.
++
++ <li>The length of the return buffer is limited by the (compile time)
++ nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
++ Any read request greater than that will be safely truncated to this value.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++buffer containing data successfully read
++
++
++
++</dd>
++
++
++
++
++<dt><a name="TLSSocket.send"></a><strong>TLSSocket:send</strong>&nbsp;(buffer, offset, length)</dt>
++<dd>
++
++ Send a message to the socket.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ buffer: Buffer holding the data to be written.
++ </li>
++
++ <li>
++ offset: Offset to start reading the buffer from. (optional)
++ </li>
++
++ <li>
++ length: Length of chunk to read from the buffer. (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function calls SSL_write().
++
++ <li><strong>Warning:</strong> It is not guaranteed that all data
++ in the buffer is written at once.
++ You have to check the return value - the number of bytes actually written -
++ or use the safe IO functions in the high-level IO utility module.
++
++ <li>Unlike standard Lua indexing the lowest offset and default is 0.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++number of bytes written
++
++
++
++</dd>
++
++
++
++
++<dt><a name="TLSSocket.shutdown"></a><strong>TLSSocket:shutdown</strong>&nbsp;()</dt>
++<dd>
++
++ Shut down the TLS connection.
++
++
++
++
++
++<h3>Usage:</h3>
++This function calls SSL_shutdown().
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="TLSSocket.write"></a><strong>TLSSocket:write</strong>&nbsp;(buffer, offset, length)</dt>
++<dd>
++
++ Send a message on the socket (This is an alias for send).
++ See the send description for a detailed description.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ buffer: Buffer holding the data to be written.
++ </li>
++
++ <li>
++ offset: Offset to start reading the buffer from. (optional)
++ </li>
++
++ <li>
++ length: Length of chunk to read from the buffer. (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number of bytes written
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#TLSSocket.send">
++ TLSSocket:send
++ </a>
++
++</ul>
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.UnifiedIO.html b/feeds/luci/documentation/api/modules/nixio.UnifiedIO.html
+new file mode 100644
+index 0000000..22e6e91
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.UnifiedIO.html
+@@ -0,0 +1,767 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li><strong>nixio.UnifiedIO</strong></li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Object Instance <code>nixio.UnifiedIO</code></h1>
++
++<p>
++ Unified high-level I/O utility API for Files, Sockets and TLS-Sockets.
++ These functions are added to the object function tables by doing <strong>
++ require "nixio.util"</strong>, can be used on all nixio IO Descriptors and
++ are based on the shared low-level read() and write() functions.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#UnifiedIO.blocksource">UnifiedIO:blocksource</a>&nbsp;(blocksize, limit)</td>
++ <td class="summary">
++ Create a block-based iterator.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#UnifiedIO.close">UnifiedIO:close</a>&nbsp;()</td>
++ <td class="summary">
++ Close the descriptor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#UnifiedIO.copy">UnifiedIO:copy</a>&nbsp;(fdout, size)</td>
++ <td class="summary">
++ Copy data from the current descriptor to another one.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#UnifiedIO.copyz">UnifiedIO:copyz</a>&nbsp;(fdout, size)</td>
++ <td class="summary">
++ Copy data from the current descriptor to another one using kernel-space
++ copying if possible.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#UnifiedIO.is_file">UnifiedIO:is_file</a>&nbsp;()</td>
++ <td class="summary">
++ Test whether the I/O-Descriptor is a file.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#UnifiedIO.is_socket">UnifiedIO:is_socket</a>&nbsp;()</td>
++ <td class="summary">
++ Test whether the I/O-Descriptor is a socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#UnifiedIO.is_tls_socket">UnifiedIO:is_tls_socket</a>&nbsp;()</td>
++ <td class="summary">
++ Test whether the I/O-Descriptor is a TLS socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#UnifiedIO.linesource">UnifiedIO:linesource</a>&nbsp;(limit)</td>
++ <td class="summary">
++ Create a line-based iterator.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#UnifiedIO.readall">UnifiedIO:readall</a>&nbsp;(length)</td>
++ <td class="summary">
++ Read a block of data and wait until all data is available.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#UnifiedIO.sink">UnifiedIO:sink</a>&nbsp;(close_when_done)</td>
++ <td class="summary">
++ Create a sink.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#UnifiedIO.writeall">UnifiedIO:writeall</a>&nbsp;(block)</td>
++ <td class="summary">
++ Write a block of data and wait until all data is written.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="UnifiedIO.blocksource"></a><strong>UnifiedIO:blocksource</strong>&nbsp;(blocksize, limit)</dt>
++<dd>
++
++ Create a block-based iterator.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ blocksize: Advisory blocksize (optional)
++ </li>
++
++ <li>
++ limit: Amount of data to consume (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function uses the low-level read function of the descriptor.
++
++ <li>The blocksize given is only advisory and to be seen as an upper limit,
++ if an underlying read returns less bytes the chunk is nevertheless returned.
++
++ <li>If the limit parameter is ommited, the iterator returns data
++ until an end-of-file, end-of-stream, connection shutdown or similar happens.
++
++ <li>The iterator will not buffer so it is safe to mix with calls to read.
++
++ <li>If the descriptor is non-blocking the iterator may fail with EAGAIN.
++
++ <li>The iterator can be used as an LTN12 source.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++Block-based Iterator
++
++
++
++</dd>
++
++
++
++
++<dt><a name="UnifiedIO.close"></a><strong>UnifiedIO:close</strong>&nbsp;()</dt>
++<dd>
++
++ Close the descriptor.
++
++
++
++
++
++<h3>Usage:</h3>
++If the descriptor is a TLS-socket the underlying descriptor is
++ closed without touching the TLS connection.
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="UnifiedIO.copy"></a><strong>UnifiedIO:copy</strong>&nbsp;(fdout, size)</dt>
++<dd>
++
++ Copy data from the current descriptor to another one.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ fdout: Target Descriptor
++ </li>
++
++ <li>
++ size: Bytes to copy (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function uses the blocksource function of the source descriptor
++ and the sink function of the target descriptor.
++
++ <li>If the limit parameter is ommited, data is copied
++ until an end-of-file, end-of-stream, connection shutdown or similar happens.
++
++ <li>If the descriptor is non-blocking the function may fail with EAGAIN.
++
++</ul>
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>bytes that were successfully written if no error occured
++
++ <li>- reserved for error code -
++
++ <li>- reserved for error message -
++
++ <li>bytes that were successfully written even if an error occured
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="UnifiedIO.copyz"></a><strong>UnifiedIO:copyz</strong>&nbsp;(fdout, size)</dt>
++<dd>
++
++ Copy data from the current descriptor to another one using kernel-space
++ copying if possible.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ fdout: Target Descriptor
++ </li>
++
++ <li>
++ size: Bytes to copy (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function uses the sendfile() syscall to copy the data or the
++ blocksource function of the source descriptor and the sink function
++ of the target descriptor as a fallback mechanism.
++
++ <li>If the limit parameter is ommited, data is copied
++ until an end-of-file, end-of-stream, connection shutdown or similar happens.
++
++ <li>If the descriptor is non-blocking the function may fail with EAGAIN.
++
++</ul>
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>bytes that were successfully written if no error occured
++
++ <li>- reserved for error code -
++
++ <li>- reserved for error message -
++
++ <li>bytes that were successfully written even if an error occured
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="UnifiedIO.is_file"></a><strong>UnifiedIO:is_file</strong>&nbsp;()</dt>
++<dd>
++
++ Test whether the I/O-Descriptor is a file.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++boolean
++
++
++
++</dd>
++
++
++
++
++<dt><a name="UnifiedIO.is_socket"></a><strong>UnifiedIO:is_socket</strong>&nbsp;()</dt>
++<dd>
++
++ Test whether the I/O-Descriptor is a socket.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++boolean
++
++
++
++</dd>
++
++
++
++
++<dt><a name="UnifiedIO.is_tls_socket"></a><strong>UnifiedIO:is_tls_socket</strong>&nbsp;()</dt>
++<dd>
++
++ Test whether the I/O-Descriptor is a TLS socket.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++boolean
++
++
++
++</dd>
++
++
++
++
++<dt><a name="UnifiedIO.linesource"></a><strong>UnifiedIO:linesource</strong>&nbsp;(limit)</dt>
++<dd>
++
++ Create a line-based iterator.
++ Lines may end with either \n or \r\n, these control chars are not included
++ in the return value.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ limit: Line limit
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function uses the low-level read function of the descriptor.
++
++ <li><strong>Note:</strong> This function uses an internal buffer to read
++ ahead. Do NOT mix calls to read(all) and the returned iterator. If you want
++ to stop reading line-based and want to use the read(all) functions instead
++ you can pass "true" to the iterator which will flush the buffer
++ and return the bufferd data.
++
++ <li>If the limit parameter is ommited, this function uses the nixio
++ buffersize (8192B by default).
++
++ <li>If the descriptor is non-blocking the iterator may fail with EAGAIN.
++
++ <li>The iterator can be used as an LTN12 source.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++Line-based Iterator
++
++
++
++</dd>
++
++
++
++
++<dt><a name="UnifiedIO.readall"></a><strong>UnifiedIO:readall</strong>&nbsp;(length)</dt>
++<dd>
++
++ Read a block of data and wait until all data is available.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ length: Bytes to read (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function uses the low-level read function of the descriptor.
++
++ <li>If the length parameter is ommited, this function returns all data
++ that can be read before an end-of-file, end-of-stream, connection shutdown
++ or similar happens.
++
++ <li>If the descriptor is non-blocking this function may fail with EAGAIN.
++
++</ul>
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>data that was successfully read if no error occured
++
++ <li>- reserved for error code -
++
++ <li>- reserved for error message -
++
++ <li>data that was successfully read even if an error occured
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="UnifiedIO.sink"></a><strong>UnifiedIO:sink</strong>&nbsp;(close_when_done)</dt>
++<dd>
++
++ Create a sink.
++ This sink will simply write all data that it receives and optionally
++ close the descriptor afterwards.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ close_when_done: (optional, boolean)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function uses the writeall function of the descriptor.
++
++ <li>If the descriptor is non-blocking the sink may fail with EAGAIN.
++
++ <li>The iterator can be used as an LTN12 sink.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++Sink
++
++
++
++</dd>
++
++
++
++
++<dt><a name="UnifiedIO.writeall"></a><strong>UnifiedIO:writeall</strong>&nbsp;(block)</dt>
++<dd>
++
++ Write a block of data and wait until all data is written.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ block: Bytes to write
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function uses the low-level write function of the descriptor.
++
++ <li>If the descriptor is non-blocking this function may fail with EAGAIN.
++
++</ul>
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>bytes that were successfully written if no error occured
++
++ <li>- reserved for error code -
++
++ <li>- reserved for error message -
++
++ <li>bytes that were successfully written even if an error occured
++
++</ol>
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.bin.html b/feeds/luci/documentation/api/modules/nixio.bin.html
+new file mode 100644
+index 0000000..fd82879
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.bin.html
+@@ -0,0 +1,427 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li><strong>nixio.bin</strong></li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>nixio.bin</code></h1>
++
++<p>
++ Binary operations and conversion.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#b64decode">b64decode</a>&nbsp;(buffer)</td>
++ <td class="summary">
++ Base64 decode a given buffer.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#b64encode">b64encode</a>&nbsp;(buffer)</td>
++ <td class="summary">
++ Base64 encode a given buffer.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#crc32">crc32</a>&nbsp;(buffer, initial)</td>
++ <td class="summary">
++ Calculate the CRC32 value of a buffer.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#hexlify">hexlify</a>&nbsp;(buffer)</td>
++ <td class="summary">
++ Return a hexadecimal ASCII represantation of the content of a buffer.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#unhexlify">unhexlify</a>&nbsp;(hexvalue)</td>
++ <td class="summary">
++ Return a binary buffer from a hexadecimal ASCII representation.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="b64decode"></a><strong>b64decode</strong>&nbsp;(buffer)</dt>
++<dd>
++
++ Base64 decode a given buffer.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ buffer: Base 64 Encoded data
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++binary data
++
++
++
++</dd>
++
++
++
++
++<dt><a name="b64encode"></a><strong>b64encode</strong>&nbsp;(buffer)</dt>
++<dd>
++
++ Base64 encode a given buffer.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ buffer: Buffer
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++base64 encoded buffer
++
++
++
++</dd>
++
++
++
++
++<dt><a name="crc32"></a><strong>crc32</strong>&nbsp;(buffer, initial)</dt>
++<dd>
++
++ Calculate the CRC32 value of a buffer.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ buffer: Buffer
++ </li>
++
++ <li>
++ initial: Initial CRC32 value (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++crc32 value
++
++
++
++</dd>
++
++
++
++
++<dt><a name="hexlify"></a><strong>hexlify</strong>&nbsp;(buffer)</dt>
++<dd>
++
++ Return a hexadecimal ASCII represantation of the content of a buffer.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ buffer: Buffer
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++representation using characters [0-9a-f]
++
++
++
++</dd>
++
++
++
++
++<dt><a name="unhexlify"></a><strong>unhexlify</strong>&nbsp;(hexvalue)</dt>
++<dd>
++
++ Return a binary buffer from a hexadecimal ASCII representation.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ hexvalue: representation using characters [0-9a-f]
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++binary data
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.bit.html b/feeds/luci/documentation/api/modules/nixio.bit.html
+new file mode 100644
+index 0000000..b29c29d
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.bit.html
+@@ -0,0 +1,744 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li><strong>nixio.bit</strong></li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>nixio.bit</code></h1>
++
++<p>
++ Bitfield operators and mainpulation functions.
++ Can be used as a drop-in replacement for bitlib.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#arshift">arshift</a>&nbsp;(oper, shift)</td>
++ <td class="summary">
++ Arithmetically right shift a number.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#band">band</a>&nbsp;(oper1, oper2, ...)</td>
++ <td class="summary">
++ Bitwise AND several numbers.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#bnot">bnot</a>&nbsp;(oper)</td>
++ <td class="summary">
++ Invert given number.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#bor">bor</a>&nbsp;(oper1, oper2, ...)</td>
++ <td class="summary">
++ Bitwise OR several numbers.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#bxor">bxor</a>&nbsp;(oper1, oper2, ...)</td>
++ <td class="summary">
++ Bitwise XOR several numbers.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#cast">cast</a>&nbsp;(oper)</td>
++ <td class="summary">
++ Cast a number to the bit-operating range.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#check">check</a>&nbsp;(bitfield, flag1, ...)</td>
++ <td class="summary">
++ Checks whether given flags are set in a bitfield.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#div">div</a>&nbsp;(oper1, oper2, ...)</td>
++ <td class="summary">
++ Integer division of 2 or more numbers.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#lshift">lshift</a>&nbsp;(oper, shift)</td>
++ <td class="summary">
++ Left shift a number.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#rshift">rshift</a>&nbsp;(oper, shift)</td>
++ <td class="summary">
++ Right shift a number.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#set">set</a>&nbsp;(bitfield, flag1, ...)</td>
++ <td class="summary">
++ Sets one or more flags of a bitfield.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#unset">unset</a>&nbsp;(bitfield, flag1, ...)</td>
++ <td class="summary">
++ Unsets one or more flags of a bitfield.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="arshift"></a><strong>arshift</strong>&nbsp;(oper, shift)</dt>
++<dd>
++
++ Arithmetically right shift a number.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oper: number
++ </li>
++
++ <li>
++ shift: bits to shift
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number
++
++
++
++</dd>
++
++
++
++
++<dt><a name="band"></a><strong>band</strong>&nbsp;(oper1, oper2, ...)</dt>
++<dd>
++
++ Bitwise AND several numbers.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oper1: First Operand
++ </li>
++
++ <li>
++ oper2: Second Operand
++ </li>
++
++ <li>
++ ...: More Operands
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number
++
++
++
++</dd>
++
++
++
++
++<dt><a name="bnot"></a><strong>bnot</strong>&nbsp;(oper)</dt>
++<dd>
++
++ Invert given number.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oper: Operand
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number
++
++
++
++</dd>
++
++
++
++
++<dt><a name="bor"></a><strong>bor</strong>&nbsp;(oper1, oper2, ...)</dt>
++<dd>
++
++ Bitwise OR several numbers.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oper1: First Operand
++ </li>
++
++ <li>
++ oper2: Second Operand
++ </li>
++
++ <li>
++ ...: More Operands
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number
++
++
++
++</dd>
++
++
++
++
++<dt><a name="bxor"></a><strong>bxor</strong>&nbsp;(oper1, oper2, ...)</dt>
++<dd>
++
++ Bitwise XOR several numbers.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oper1: First Operand
++ </li>
++
++ <li>
++ oper2: Second Operand
++ </li>
++
++ <li>
++ ...: More Operands
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number
++
++
++
++</dd>
++
++
++
++
++<dt><a name="cast"></a><strong>cast</strong>&nbsp;(oper)</dt>
++<dd>
++
++ Cast a number to the bit-operating range.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oper: number
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number
++
++
++
++</dd>
++
++
++
++
++<dt><a name="check"></a><strong>check</strong>&nbsp;(bitfield, flag1, ...)</dt>
++<dd>
++
++ Checks whether given flags are set in a bitfield.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ bitfield: Bitfield
++ </li>
++
++ <li>
++ flag1: First Flag
++ </li>
++
++ <li>
++ ...: More Flags
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true when all flags are set, otherwise false
++
++
++
++</dd>
++
++
++
++
++<dt><a name="div"></a><strong>div</strong>&nbsp;(oper1, oper2, ...)</dt>
++<dd>
++
++ Integer division of 2 or more numbers.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oper1: Operand 1
++ </li>
++
++ <li>
++ oper2: Operand 2
++ </li>
++
++ <li>
++ ...: More Operands
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number
++
++
++
++</dd>
++
++
++
++
++<dt><a name="lshift"></a><strong>lshift</strong>&nbsp;(oper, shift)</dt>
++<dd>
++
++ Left shift a number.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oper: number
++ </li>
++
++ <li>
++ shift: bits to shift
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number
++
++
++
++</dd>
++
++
++
++
++<dt><a name="rshift"></a><strong>rshift</strong>&nbsp;(oper, shift)</dt>
++<dd>
++
++ Right shift a number.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oper: number
++ </li>
++
++ <li>
++ shift: bits to shift
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++number
++
++
++
++</dd>
++
++
++
++
++<dt><a name="set"></a><strong>set</strong>&nbsp;(bitfield, flag1, ...)</dt>
++<dd>
++
++ Sets one or more flags of a bitfield.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ bitfield: Bitfield
++ </li>
++
++ <li>
++ flag1: First Flag
++ </li>
++
++ <li>
++ ...: More Flags
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++altered bitfield
++
++
++
++</dd>
++
++
++
++
++<dt><a name="unset"></a><strong>unset</strong>&nbsp;(bitfield, flag1, ...)</dt>
++<dd>
++
++ Unsets one or more flags of a bitfield.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ bitfield: Bitfield
++ </li>
++
++ <li>
++ flag1: First Flag
++ </li>
++
++ <li>
++ ...: More Flags
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++altered bitfield
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.crypto.html b/feeds/luci/documentation/api/modules/nixio.crypto.html
+new file mode 100644
+index 0000000..79a7458
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.crypto.html
+@@ -0,0 +1,319 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li><strong>nixio.crypto</strong></li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>nixio.crypto</code></h1>
++
++<p>
++ Cryptographical library.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.crypto.hash">hash</a>&nbsp;(algo)</td>
++ <td class="summary">
++ Create a hash object.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.crypto.hmac">hmac</a>&nbsp;(algo, key)</td>
++ <td class="summary">
++ Create a HMAC object.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="nixio.crypto.hash"></a><strong>hash</strong>&nbsp;(algo)</dt>
++<dd>
++
++ Create a hash object.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ algo: Algorithm ["sha1", "md5"]
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++CryptoHash Object
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.crypto.hmac"></a><strong>hmac</strong>&nbsp;(algo, key)</dt>
++<dd>
++
++ Create a HMAC object.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ algo: Algorithm ["sha1", "md5"]
++ </li>
++
++ <li>
++ key: HMAC-Key
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++CryptoHash Object
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.fs.html b/feeds/luci/documentation/api/modules/nixio.fs.html
+new file mode 100644
+index 0000000..d4fda2c
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.fs.html
+@@ -0,0 +1,1562 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.html">nixio</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li><strong>nixio.fs</strong></li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>nixio.fs</code></h1>
++
++<p>
++ Low-level and high-level filesystem manipulation library.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.access">access</a>&nbsp;(path, mode1, ...)</td>
++ <td class="summary">
++ Check user's permission on a file.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.basename">basename</a>&nbsp;(path)</td>
++ <td class="summary">
++ Strip the directory part from a path.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.chmod">chmod</a>&nbsp;(path, mode)</td>
++ <td class="summary">
++ Change the file mode.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.chown">chown</a>&nbsp;(path, user, group)</td>
++ <td class="summary">
++ (POSIX) Change owner and group of a file.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.copy">copy</a>&nbsp;(src, dest)</td>
++ <td class="summary">
++ Copy a file, directory or symlink non-recursively preserving file mode,
++ timestamps, owner and group.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.copyr">copyr</a>&nbsp;(src, dest)</td>
++ <td class="summary">
++ Copy a file, directory or symlink recursively preserving file mode,
++ timestamps, owner and group.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.datacopy">datacopy</a>&nbsp;(src, dest, limit)</td>
++ <td class="summary">
++ Copy data between files.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.dir">dir</a>&nbsp;(path)</td>
++ <td class="summary">
++ Iterate over the entries of a directory.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.dirname">dirname</a>&nbsp;(path)</td>
++ <td class="summary">
++ Strip the base from a path.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.glob">glob</a>&nbsp;(pattern)</td>
++ <td class="summary">
++ (POSIX) Find pathnames matching a pattern.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.lchown">lchown</a>&nbsp;(path, user, group)</td>
++ <td class="summary">
++ (POSIX) Change owner and group of a file and do not resolve
++ if target is a symlink.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.link">link</a>&nbsp;(oldpath, newpath)</td>
++ <td class="summary">
++ Create a hard link.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.lstat">lstat</a>&nbsp;(path, field)</td>
++ <td class="summary">
++ Get file status and attributes and do not resolve if target is a symlink.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.mkdir">mkdir</a>&nbsp;(path, mode)</td>
++ <td class="summary">
++ Create a new directory.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.mkdirr">mkdirr</a>&nbsp;(dest, mode)</td>
++ <td class="summary">
++ Create a directory and all needed parent directories recursively.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.mkfifo">mkfifo</a>&nbsp;(path, mode)</td>
++ <td class="summary">
++ (POSIX) Create a FIFO (named pipe).</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.move">move</a>&nbsp;(src, dest)</td>
++ <td class="summary">
++ Rename a file, directory or symlink non-recursively across filesystems.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.mover">mover</a>&nbsp;(src, dest)</td>
++ <td class="summary">
++ Rename a file, directory or symlink recursively across filesystems.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.readfile">readfile</a>&nbsp;(path, limit)</td>
++ <td class="summary">
++ Read the contents of a file into a buffer.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.readlink">readlink</a>&nbsp;(path)</td>
++ <td class="summary">
++ (POSIX) Read the target of a symbolic link.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.realpath">realpath</a>&nbsp;(path)</td>
++ <td class="summary">
++ Return the cannonicalized absolute pathname.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.remove">remove</a>&nbsp;(path)</td>
++ <td class="summary">
++ Remove a file or directory.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.rename">rename</a>&nbsp;(src, dest)</td>
++ <td class="summary">
++ Renames a file or directory.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.rmdir">rmdir</a>&nbsp;(path)</td>
++ <td class="summary">
++ Remove an empty directory.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.stat">stat</a>&nbsp;(path, field)</td>
++ <td class="summary">
++ Get file status and attributes.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.statvfs">statvfs</a>&nbsp;(path)</td>
++ <td class="summary">
++ (POSIX) Get filesystem statistics.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.symlink">symlink</a>&nbsp;(oldpath, newpath)</td>
++ <td class="summary">
++ (POSIX) Create a symbolic link.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.unlink">unlink</a>&nbsp;(path)</td>
++ <td class="summary">
++ Delete a name and - if no links are left - the associated file.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.utimes">utimes</a>&nbsp;(path, actime, mtime)</td>
++ <td class="summary">
++ Change file last access and last modification time.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fs.writefile">writefile</a>&nbsp;(path, data)</td>
++ <td class="summary">
++ Write a buffer into a file truncating the file first.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="nixio.fs.access"></a><strong>access</strong>&nbsp;(path, mode1, ...)</dt>
++<dd>
++
++ Check user's permission on a file.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++ <li>
++ mode1: First Mode to check ["f", "r", "w", "x"]
++ </li>
++
++ <li>
++ ...: More Modes to check [-"-]
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.basename"></a><strong>basename</strong>&nbsp;(path)</dt>
++<dd>
++
++ Strip the directory part from a path.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function cannot fail and will never return nil.
++
++
++
++<h3>Return value:</h3>
++basename
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.chmod"></a><strong>chmod</strong>&nbsp;(path, mode)</dt>
++<dd>
++
++ Change the file mode.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++ <li>
++ mode: File mode
++ [decimal mode number, "[-r][-w][-xsS][-r][-w][-xsS][-r][-w][-xtT]"]
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>Windows only supports setting the write-protection through the
++ "Writable to others" bit.
++
++ <li><strong>Notice:</strong> The mode-flag for the functions
++ open, mkdir, mkfifo are affected by the umask.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="">
++ umask
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.chown"></a><strong>chown</strong>&nbsp;(path, user, group)</dt>
++<dd>
++
++ (POSIX) Change owner and group of a file.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++ <li>
++ user: User ID or Username (optional)
++ </li>
++
++ <li>
++ group: Group ID or Groupname (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.copy"></a><strong>copy</strong>&nbsp;(src, dest)</dt>
++<dd>
++
++ Copy a file, directory or symlink non-recursively preserving file mode,
++ timestamps, owner and group.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ src: Source path
++ </li>
++
++ <li>
++ dest: Destination path
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++The destination must always be a full destination path e.g. do not
++ omit the basename even if source and destination basename are equal.
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.copyr"></a><strong>copyr</strong>&nbsp;(src, dest)</dt>
++<dd>
++
++ Copy a file, directory or symlink recursively preserving file mode,
++ timestamps, owner and group.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ src: Source path
++ </li>
++
++ <li>
++ dest: Destination path
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++The destination must always be a full destination path e.g. do not
++ omit the basename even if source and destination basename are equal.
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.datacopy"></a><strong>datacopy</strong>&nbsp;(src, dest, limit)</dt>
++<dd>
++
++ Copy data between files.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ src: Source file path
++ </li>
++
++ <li>
++ dest: Destination file path
++ </li>
++
++ <li>
++ limit: Maximum bytes to copy (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.dir"></a><strong>dir</strong>&nbsp;(path)</dt>
++<dd>
++
++ Iterate over the entries of a directory.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++The special entries "." and ".." are omitted.
++
++
++
++<h3>Return value:</h3>
++directory iterator returning one entry per call
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.dirname"></a><strong>dirname</strong>&nbsp;(path)</dt>
++<dd>
++
++ Strip the base from a path.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function cannot fail and will never return nil.
++
++
++
++<h3>Return value:</h3>
++dirname
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.glob"></a><strong>glob</strong>&nbsp;(pattern)</dt>
++<dd>
++
++ (POSIX) Find pathnames matching a pattern.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ pattern: Pattern
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>path iterator
++
++ <li>number of matches
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.lchown"></a><strong>lchown</strong>&nbsp;(path, user, group)</dt>
++<dd>
++
++ (POSIX) Change owner and group of a file and do not resolve
++ if target is a symlink.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++ <li>
++ user: User ID or Username (optional)
++ </li>
++
++ <li>
++ group: Group ID or Groupname (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.link"></a><strong>link</strong>&nbsp;(oldpath, newpath)</dt>
++<dd>
++
++ Create a hard link.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oldpath: Path
++ </li>
++
++ <li>
++ newpath: Path
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function calls link() on POSIX and CreateHardLink() on Windows.
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.lstat"></a><strong>lstat</strong>&nbsp;(path, field)</dt>
++<dd>
++
++ Get file status and attributes and do not resolve if target is a symlink.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++ <li>
++ field: Only return a specific field, not the whole table (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing attributes (see stat for a detailed description)
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#nixio.fs.stat">
++ stat
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.mkdir"></a><strong>mkdir</strong>&nbsp;(path, mode)</dt>
++<dd>
++
++ Create a new directory.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++ <li>
++ mode: File mode (optional, see chmod and umask)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#nixio.fs.chmod">
++ chmod
++ </a>
++
++ <li><a href="">
++ umask
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.mkdirr"></a><strong>mkdirr</strong>&nbsp;(dest, mode)</dt>
++<dd>
++
++ Create a directory and all needed parent directories recursively.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ dest: Destination path
++ </li>
++
++ <li>
++ mode: File mode (optional, see chmod and umask)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#nixio.fs.chmod">
++ chmod
++ </a>
++
++ <li><a href="">
++ umask
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.mkfifo"></a><strong>mkfifo</strong>&nbsp;(path, mode)</dt>
++<dd>
++
++ (POSIX) Create a FIFO (named pipe).
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++ <li>
++ mode: File mode (optional, see chmod and umask)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#nixio.fs.chmod">
++ chmod
++ </a>
++
++ <li><a href="">
++ umask
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.move"></a><strong>move</strong>&nbsp;(src, dest)</dt>
++<dd>
++
++ Rename a file, directory or symlink non-recursively across filesystems.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ src: Source path
++ </li>
++
++ <li>
++ dest: Destination path
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++The destination must always be a full destination path e.g. do not
++ omit the basename even if source and destination basename are equal.
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.mover"></a><strong>mover</strong>&nbsp;(src, dest)</dt>
++<dd>
++
++ Rename a file, directory or symlink recursively across filesystems.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ src: Source path
++ </li>
++
++ <li>
++ dest: Destination path
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++The destination must always be a full destination path e.g. do not
++ omit the basename even if source and destination basename are equal.
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.readfile"></a><strong>readfile</strong>&nbsp;(path, limit)</dt>
++<dd>
++
++ Read the contents of a file into a buffer.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++ <li>
++ limit: Maximum bytes to read (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++file contents
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.readlink"></a><strong>readlink</strong>&nbsp;(path)</dt>
++<dd>
++
++ (POSIX) Read the target of a symbolic link.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++target path
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.realpath"></a><strong>realpath</strong>&nbsp;(path)</dt>
++<dd>
++
++ Return the cannonicalized absolute pathname.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++absolute path
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.remove"></a><strong>remove</strong>&nbsp;(path)</dt>
++<dd>
++
++ Remove a file or directory.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.rename"></a><strong>rename</strong>&nbsp;(src, dest)</dt>
++<dd>
++
++ Renames a file or directory.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ src: Source path
++ </li>
++
++ <li>
++ dest: Destination path
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++It is normally not possible to rename files accross fileystems.
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.rmdir"></a><strong>rmdir</strong>&nbsp;(path)</dt>
++<dd>
++
++ Remove an empty directory.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.stat"></a><strong>stat</strong>&nbsp;(path, field)</dt>
++<dd>
++
++ Get file status and attributes.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++ <li>
++ field: Only return a specific field, not the whole table (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing: <ul>
++ <li>atime = Last access timestamp</li>
++ <li>blksize = Blocksize (POSIX only)</li>
++ <li>blocks = Blocks used (POSIX only)</li>
++ <li>ctime = Creation timestamp</li>
++ <li>dev = Device ID</li>
++ <li>gid = Group ID</li>
++ <li>ino = Inode</li>
++ <li>modedec = Mode converted into a decimal number</li>
++ <li>modestr = Mode as string as returned by <code>ls -l</code></li>
++ <li>mtime = Last modification timestamp</li>
++ <li>nlink = Number of links</li>
++ <li>rdev = Device ID (if special file)</li>
++ <li>size = Size in bytes</li>
++ <li>type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]</li>
++ <li>uid = User ID</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.statvfs"></a><strong>statvfs</strong>&nbsp;(path)</dt>
++<dd>
++
++ (POSIX) Get filesystem statistics.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path to any file within the filesystem.
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing: <ul>
++ <li>bavail = available blocks</li>
++ <li>bfree = free blocks</li>
++ <li>blocks = number of fragments</li>
++ <li>frsize = fragment size</li>
++ <li>favail = available inodes</li>
++ <li>ffree = free inodes</li>
++ <li>files = inodes</li>
++ <li>flag = flags</li>
++ <li>fsid = filesystem ID</li>
++ <li>namemax = maximum filename length</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.symlink"></a><strong>symlink</strong>&nbsp;(oldpath, newpath)</dt>
++<dd>
++
++ (POSIX) Create a symbolic link.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oldpath: Path
++ </li>
++
++ <li>
++ newpath: Path
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.unlink"></a><strong>unlink</strong>&nbsp;(path)</dt>
++<dd>
++
++ Delete a name and - if no links are left - the associated file.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.utimes"></a><strong>utimes</strong>&nbsp;(path, actime, mtime)</dt>
++<dd>
++
++ Change file last access and last modification time.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++ <li>
++ actime: Last access timestamp (optional, default: current time)
++ </li>
++
++ <li>
++ mtime: Last modification timestamp (optional, default: actime)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fs.writefile"></a><strong>writefile</strong>&nbsp;(path, data)</dt>
++<dd>
++
++ Write a buffer into a file truncating the file first.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Path
++ </li>
++
++ <li>
++ data: Data to write
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/api/modules/nixio.html b/feeds/luci/documentation/api/modules/nixio.html
+new file mode 100644
+index 0000000..f02fe3b
+--- /dev/null
++++ b/feeds/luci/documentation/api/modules/nixio.html
+@@ -0,0 +1,2405 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
++ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html>
++<head>
++ <title>Reference</title>
++ <link rel="stylesheet" href="../luadoc.css" type="text/css" />
++ <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/-->
++</head>
++
++<body>
++<div id="container">
++
++<div id="product">
++ <div id="product_logo"></div>
++ <div id="product_name"><big><b></b></big></div>
++ <div id="product_description"></div>
++</div> <!-- id="product" -->
++
++<div id="main">
++
++<div id="navigation">
++
++
++<h1>LuaDoc</h1>
++<ul>
++
++ <li><a href="../index.html">Index</a></li>
++
++</ul>
++
++
++<!-- Module list -->
++
++<h1>Modules</h1>
++<ul>
++
++ <li>
++ <a href="../modules/luci.dispatcher.html">luci.dispatcher</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.html">luci.http</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.html">luci.http.protocol</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.conditionals.html">luci.http.protocol.conditionals</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.date.html">luci.http.protocol.date</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.http.protocol.mime.html">luci.http.protocol.mime</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.i18n.html">luci.i18n</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.html">luci.ip</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.ip.cidr.html">luci.ip.cidr</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.json.html">luci.json</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.html">luci.jsonc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.jsonc.parser.html">luci.jsonc.parser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.ipkg.html">luci.model.ipkg</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.model.uci.html">luci.model.uci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.html">luci.rpcc</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.rpcc.ruci.html">luci.rpcc.ruci</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.html">luci.sys</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.init.html">luci.sys.init</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.iptparser.html">luci.sys.iptparser</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.net.html">luci.sys.net</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.process.html">luci.sys.process</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.user.html">luci.sys.user</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.sys.wifi.html">luci.sys.wifi</a>
++ </li>
++
++ <li>
++ <a href="../modules/luci.util.html">luci.util</a>
++ </li>
++
++ <li><strong>nixio</strong></li>
++
++ <li>
++ <a href="../modules/nixio.CHANGELOG.html">nixio.CHANGELOG</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.CryptoHash.html">nixio.CryptoHash</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.File.html">nixio.File</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.README.html">nixio.README</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.Socket.html">nixio.Socket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSContext.html">nixio.TLSContext</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.TLSSocket.html">nixio.TLSSocket</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.UnifiedIO.html">nixio.UnifiedIO</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bin.html">nixio.bin</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.bit.html">nixio.bit</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.crypto.html">nixio.crypto</a>
++ </li>
++
++ <li>
++ <a href="../modules/nixio.fs.html">nixio.fs</a>
++ </li>
++
++</ul>
++
++
++
++<!-- File list -->
++
++
++
++
++
++
++
++</div><!-- id="navigation" -->
++
++<div id="content">
++
++<h1>Class <code>nixio</code></h1>
++
++<p>
++ General POSIX IO library.</p>
++
++
++
++
++
++
++
++<h2>Functions</h2>
++<table class="function_list">
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.bind">bind</a>&nbsp;(host, port, family, socktype)</td>
++ <td class="summary">
++ Create a new socket and bind it to a network address.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.chdir">chdir</a>&nbsp;(path)</td>
++ <td class="summary">
++ Change the working directory.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.closelog">closelog</a>&nbsp;()</td>
++ <td class="summary">
++ (POSIX) Close the connection to the system logger.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.connect">connect</a>&nbsp;(host, port, family, socktype)</td>
++ <td class="summary">
++ Create a new socket and connect to a network address.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.crypt">crypt</a>&nbsp;(key, salt)</td>
++ <td class="summary">
++ (POSIX) Encrypt a user password.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.dup">dup</a>&nbsp;(oldfd, newfd)</td>
++ <td class="summary">
++ Duplicate a file descriptor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.errno">errno</a>&nbsp;()</td>
++ <td class="summary">
++ Get the last system error code.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.exec">exec</a>&nbsp;(executable, ...)</td>
++ <td class="summary">
++ Execute a file to replace the current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.exece">exece</a>&nbsp;(executable, arguments, environment)</td>
++ <td class="summary">
++ Execute a file with a custom environment to replace the current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.execp">execp</a>&nbsp;(executable, ...)</td>
++ <td class="summary">
++ Invoke the shell and execute a file to replace the current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.fork">fork</a>&nbsp;()</td>
++ <td class="summary">
++ (POSIX) Clone the current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getaddrinfo">getaddrinfo</a>&nbsp;(host, family, service)</td>
++ <td class="summary">
++ Look up a hostname and service via DNS.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getcwd">getcwd</a>&nbsp;()</td>
++ <td class="summary">
++ Get the current working directory.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getenv">getenv</a>&nbsp;(variable)</td>
++ <td class="summary">
++ Get the current environment table or a specific environment variable.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getgid">getgid</a>&nbsp;()</td>
++ <td class="summary">
++ (POSIX) Get the group id of the current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getgr">getgr</a>&nbsp;(group)</td>
++ <td class="summary">
++ (POSIX) Get all or a specific user group.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getifaddrs">getifaddrs</a>&nbsp;()</td>
++ <td class="summary">
++ (Linux, BSD) Get a list of available network interfaces and their addresses.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getnameinfo">getnameinfo</a>&nbsp;(ipaddr)</td>
++ <td class="summary">
++ Reverse look up an IP-Address via DNS.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getpid">getpid</a>&nbsp;()</td>
++ <td class="summary">
++ Get the ID of the current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getppid">getppid</a>&nbsp;()</td>
++ <td class="summary">
++ (POSIX) Get the parent process id of the current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getproto">getproto</a>&nbsp;(proto)</td>
++ <td class="summary">
++ Get all or a specifc proto entry.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getprotobyname">getprotobyname</a>&nbsp;(name)</td>
++ <td class="summary">
++ Get protocol entry by name.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getprotobynumber">getprotobynumber</a>&nbsp;(proto)</td>
++ <td class="summary">
++ Get protocol entry by number.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getpw">getpw</a>&nbsp;(user)</td>
++ <td class="summary">
++ (POSIX) Get all or a specific user account.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getsp">getsp</a>&nbsp;(user)</td>
++ <td class="summary">
++ (Linux, Solaris) Get all or a specific shadow password entry.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.getuid">getuid</a>&nbsp;()</td>
++ <td class="summary">
++ (POSIX) Get the user id of the current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.kill">kill</a>&nbsp;(target, signal)</td>
++ <td class="summary">
++ (POSIX) Send a signal to one or more processes.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.nanosleep">nanosleep</a>&nbsp;(seconds, nanoseconds)</td>
++ <td class="summary">
++ Sleep for a specified amount of time.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.nice">nice</a>&nbsp;(nice)</td>
++ <td class="summary">
++ (POSIX) Change priority of current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.open">open</a>&nbsp;(path, flags, mode)</td>
++ <td class="summary">
++ Open a file.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.open_flags">open_flags</a>&nbsp;(flag1, ...)</td>
++ <td class="summary">
++ Generate flags for a call to open().</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.openlog">openlog</a>&nbsp;(ident, flag1, ...)</td>
++ <td class="summary">
++ (POSIX) Open a connection to the system logger.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.pipe">pipe</a>&nbsp;()</td>
++ <td class="summary">
++ Create a pipe.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.poll">poll</a>&nbsp;(fds, timeout)</td>
++ <td class="summary">
++ Wait for some event on a file descriptor.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.poll_flags">poll_flags</a>&nbsp;(mode1, ...)</td>
++ <td class="summary">
++ Generate events-bitfield or parse revents-bitfield for poll.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.sendfile">sendfile</a>&nbsp;(socket, file, length)</td>
++ <td class="summary">
++ (POSIX) Send data from a file to a socket in kernel-space.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.setenv">setenv</a>&nbsp;(variable, value)</td>
++ <td class="summary">
++ Set or unset a environment variable.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.setgid">setgid</a>&nbsp;(gid)</td>
++ <td class="summary">
++ (POSIX) Set the group id of the current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.setlogmask">setlogmask</a>&nbsp;(priority)</td>
++ <td class="summary">
++ (POSIX) Set the logmask of the system logger for current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.setsid">setsid</a>&nbsp;()</td>
++ <td class="summary">
++ (POSIX) Create a new session and set the process group ID.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.setuid">setuid</a>&nbsp;(gid)</td>
++ <td class="summary">
++ (POSIX) Set the user id of the current process.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.signal">signal</a>&nbsp;(signal, handler)</td>
++ <td class="summary">
++ Ignore or use set the default handler for a signal.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.socket">socket</a>&nbsp;(domain, type)</td>
++ <td class="summary">
++ Create a new socket.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.splice">splice</a>&nbsp;(fdin, fdout, length, flags)</td>
++ <td class="summary">
++ (Linux) Send data from / to a pipe in kernel-space.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.splice_flags">splice_flags</a>&nbsp;(flag1, ...)</td>
++ <td class="summary">
++ (Linux) Generate a flag bitfield for a call to splice.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.strerror">strerror</a>&nbsp;(errno)</td>
++ <td class="summary">
++ Get the error message for the corresponding error code.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.sysinfo">sysinfo</a>&nbsp;()</td>
++ <td class="summary">
++ (Linux) Get overall system statistics.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.syslog">syslog</a>&nbsp;(priority)</td>
++ <td class="summary">
++ (POSIX) Write a message to the system logger.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.times">times</a>&nbsp;()</td>
++ <td class="summary">
++ (POSIX) Get process times.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.tls">tls</a>&nbsp;(mode)</td>
++ <td class="summary">
++ Create a new TLS context.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.umask">umask</a>&nbsp;(mask)</td>
++ <td class="summary">
++ Sets the file mode creation mask.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.uname">uname</a>&nbsp;()</td>
++ <td class="summary">
++ (POSIX) Get information about current system and kernel.</td>
++ </tr>
++
++ <tr>
++ <td class="name" nowrap><a href="#nixio.waitpid">waitpid</a>&nbsp;(pid, flag1, ...)</td>
++ <td class="summary">
++ (POSIX) Wait for a process to change state.</td>
++ </tr>
++
++</table>
++
++
++
++
++
++
++<br/>
++<br/>
++
++
++<h2><a name="functions"></a>Functions</h2>
++<dl class="function">
++
++
++
++<dt><a name="nixio.bind"></a><strong>bind</strong>&nbsp;(host, port, family, socktype)</dt>
++<dd>
++
++ Create a new socket and bind it to a network address.
++ This function is a shortcut for calling nixio.socket and then bind()
++ on the socket object.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ host: Hostname or IP-Address (optional, default: all addresses)
++ </li>
++
++ <li>
++ port: Port or service description
++ </li>
++
++ <li>
++ family: Address family [<strong>"any"</strong>, "inet", "inet6"]
++ </li>
++
++ <li>
++ socktype: Socket Type [<strong>"stream"</strong>, "dgram"]
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This functions calls getaddrinfo(), socket(),
++ setsockopt() and bind() but NOT listen().
++
++ <li>The <em>reuseaddr</em>-option is automatically set before binding.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++Socket Object
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.chdir"></a><strong>chdir</strong>&nbsp;(path)</dt>
++<dd>
++
++ Change the working directory.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: New working directory
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.closelog"></a><strong>closelog</strong>&nbsp;()</dt>
++<dd>
++
++ (POSIX) Close the connection to the system logger.
++
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.connect"></a><strong>connect</strong>&nbsp;(host, port, family, socktype)</dt>
++<dd>
++
++ Create a new socket and connect to a network address.
++ This function is a shortcut for calling nixio.socket and then connect()
++ on the socket object.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ host: Hostname or IP-Address (optional, default: localhost)
++ </li>
++
++ <li>
++ port: Port or service description
++ </li>
++
++ <li>
++ family: Address family [<strong>"any"</strong>, "inet", "inet6"]
++ </li>
++
++ <li>
++ socktype: Socket Type [<strong>"stream"</strong>, "dgram"]
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This functions calls getaddrinfo(), socket() and connect().
++
++
++
++<h3>Return value:</h3>
++Socket Object
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.crypt"></a><strong>crypt</strong>&nbsp;(key, salt)</dt>
++<dd>
++
++ (POSIX) Encrypt a user password.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ key: Key
++ </li>
++
++ <li>
++ salt: Salt
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++password hash
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.dup"></a><strong>dup</strong>&nbsp;(oldfd, newfd)</dt>
++<dd>
++
++ Duplicate a file descriptor.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ oldfd: Old descriptor [File Object, Socket Object (POSIX only)]
++ </li>
++
++ <li>
++ newfd: New descriptor to serve as copy (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This funcation calls dup2() if <em>newfd</em> is set, otherwise dup().
++
++
++
++<h3>Return value:</h3>
++File Object of new descriptor
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.errno"></a><strong>errno</strong>&nbsp;()</dt>
++<dd>
++
++ Get the last system error code.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Error code
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.exec"></a><strong>exec</strong>&nbsp;(executable, ...)</dt>
++<dd>
++
++ Execute a file to replace the current process.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ executable: Executable
++ </li>
++
++ <li>
++ ...: Parameters
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>The name of the executable is automatically passed as argv[0]
++
++ <li>This function does not return on success.
++
++</ul>
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.exece"></a><strong>exece</strong>&nbsp;(executable, arguments, environment)</dt>
++<dd>
++
++ Execute a file with a custom environment to replace the current process.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ executable: Executable
++ </li>
++
++ <li>
++ arguments: Argument Table
++ </li>
++
++ <li>
++ environment: Environment Table (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>The name of the executable is automatically passed as argv[0]
++
++ <li>This function does not return on success.
++
++</ul>
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.execp"></a><strong>execp</strong>&nbsp;(executable, ...)</dt>
++<dd>
++
++ Invoke the shell and execute a file to replace the current process.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ executable: Executable
++ </li>
++
++ <li>
++ ...: Parameters
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>The name of the executable is automatically passed as argv[0]
++
++ <li>This function does not return on success.
++
++</ul>
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.fork"></a><strong>fork</strong>&nbsp;()</dt>
++<dd>
++
++ (POSIX) Clone the current process.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++the child process id for the parent process, 0 for the child process
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getaddrinfo"></a><strong>getaddrinfo</strong>&nbsp;(host, family, service)</dt>
++<dd>
++
++ Look up a hostname and service via DNS.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ host: hostname to lookup (optional)
++ </li>
++
++ <li>
++ family: address family [<strong>"any"</strong>, "inet", "inet6"]
++ </li>
++
++ <li>
++ service: service name or port (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing one or more tables containing: <ul>
++ <li>family = ["inet", "inet6"]</li>
++ <li>socktype = ["stream", "dgram", "raw"]</li>
++ <li>address = Resolved IP-Address</li>
++ <li>port = Resolved Port (if service was given)</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getcwd"></a><strong>getcwd</strong>&nbsp;()</dt>
++<dd>
++
++ Get the current working directory.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++workign directory
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getenv"></a><strong>getenv</strong>&nbsp;(variable)</dt>
++<dd>
++
++ Get the current environment table or a specific environment variable.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ variable: Variable (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++environment table or single environment variable
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getgid"></a><strong>getgid</strong>&nbsp;()</dt>
++<dd>
++
++ (POSIX) Get the group id of the current process.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++process group id
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getgr"></a><strong>getgr</strong>&nbsp;(group)</dt>
++<dd>
++
++ (POSIX) Get all or a specific user group.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ group: Group ID or groupname (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing: <ul>
++ <li>name = Group Name</li>
++ <li>gid = Group ID</li>
++ <li>passwd = Password</li>
++ <li>mem = {Member #1, Member #2, ...}</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getifaddrs"></a><strong>getifaddrs</strong>&nbsp;()</dt>
++<dd>
++
++ (Linux, BSD) Get a list of available network interfaces and their addresses.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing one or more tables containing: <ul>
++ <li>name = Interface Name</li>
++ <li>family = ["inet", "inet6", "packet"]</li>
++ <li>addr = Interface Address (IPv4, IPv6, MAC, ...)</li>
++ <li>broadaddr = Broadcast Address</li>
++ <li>dstaddr = Destination Address (Point-to-Point)</li>
++ <li>netmask = Netmask (if available)</li>
++ <li>prefix = Prefix (if available)</li>
++ <li>flags = Table of interface flags (up, multicast, loopback, ...)</li>
++ <li>data = Statistics (Linux, "packet"-family)</li>
++ <li>hatype = Hardware Type Identifier (Linix, "packet"-family)</li>
++ <li>ifindex = Interface Index (Linux, "packet"-family)</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getnameinfo"></a><strong>getnameinfo</strong>&nbsp;(ipaddr)</dt>
++<dd>
++
++ Reverse look up an IP-Address via DNS.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ipaddr: IPv4 or IPv6-Address
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++FQDN
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getpid"></a><strong>getpid</strong>&nbsp;()</dt>
++<dd>
++
++ Get the ID of the current process.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++process id
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getppid"></a><strong>getppid</strong>&nbsp;()</dt>
++<dd>
++
++ (POSIX) Get the parent process id of the current process.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++parent process id
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getproto"></a><strong>getproto</strong>&nbsp;(proto)</dt>
++<dd>
++
++ Get all or a specifc proto entry.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ proto: protocol number or name to lookup (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table (or if no parameter is given, a table of tables)
++ containing the following fields: <ul>
++ <li>name = Protocol Name</li>
++ <li>proto = Protocol Number</li>
++ <li>aliases = Table of alias names</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getprotobyname"></a><strong>getprotobyname</strong>&nbsp;(name)</dt>
++<dd>
++
++ Get protocol entry by name.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ name: protocol name to lookup
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function returns nil if the given protocol is unknown.
++
++
++
++<h3>Return value:</h3>
++Table containing the following fields: <ul>
++ <li>name = Protocol Name</li>
++ <li>proto = Protocol Number</li>
++ <li>aliases = Table of alias names</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getprotobynumber"></a><strong>getprotobynumber</strong>&nbsp;(proto)</dt>
++<dd>
++
++ Get protocol entry by number.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ proto: protocol number to lookup
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++This function returns nil if the given protocol is unknown.
++
++
++
++<h3>Return value:</h3>
++Table containing the following fields: <ul>
++ <li>name = Protocol Name</li>
++ <li>proto = Protocol Number</li>
++ <li>aliases = Table of alias names</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getpw"></a><strong>getpw</strong>&nbsp;(user)</dt>
++<dd>
++
++ (POSIX) Get all or a specific user account.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ user: User ID or username (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing: <ul>
++ <li>name = Name</li>
++ <li>uid = ID</li>
++ <li>gid = Group ID</li>
++ <li>passwd = Password</li>
++ <li>dir = Home directory</li>
++ <li>gecos = Information</li>
++ <li>shell = Shell</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getsp"></a><strong>getsp</strong>&nbsp;(user)</dt>
++<dd>
++
++ (Linux, Solaris) Get all or a specific shadow password entry.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ user: username (optional)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing: <ul>
++ <li>namp = Name</li>
++ <li>expire = Expiration Date</li>
++ <li>flag = Flags</li>
++ <li>inact = Inactivity Date</li>
++ <li>lstchg = Last change</li>
++ <li>max = Maximum</li>
++ <li>min = Minimum</li>
++ <li>warn = Warning</li>
++ <li>pwdp = Password Hash</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.getuid"></a><strong>getuid</strong>&nbsp;()</dt>
++<dd>
++
++ (POSIX) Get the user id of the current process.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++process user id
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.kill"></a><strong>kill</strong>&nbsp;(target, signal)</dt>
++<dd>
++
++ (POSIX) Send a signal to one or more processes.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ target: Target process of process group.
++ </li>
++
++ <li>
++ signal: Signal to send
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.nanosleep"></a><strong>nanosleep</strong>&nbsp;(seconds, nanoseconds)</dt>
++<dd>
++
++ Sleep for a specified amount of time.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ seconds: Seconds to wait (optional)
++ </li>
++
++ <li>
++ nanoseconds: Nanoseconds to wait (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>Not all systems support nanosecond precision but you can expect
++ to have at least maillisecond precision.
++
++ <li>This function is not signal-protected and may fail with EINTR.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.nice"></a><strong>nice</strong>&nbsp;(nice)</dt>
++<dd>
++
++ (POSIX) Change priority of current process.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ nice: Nice Value
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.open"></a><strong>open</strong>&nbsp;(path, flags, mode)</dt>
++<dd>
++
++ Open a file.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ path: Filesystem path to open
++ </li>
++
++ <li>
++ flags: Flag string or number (see open_flags).
++ [<strong>"r"</strong>, "r+", "w", "w+", "a", "a+"]
++ </li>
++
++ <li>
++ mode: File mode for newly created files (see chmod, umask).
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++Although this function also supports the traditional fopen()
++ file flags it does not create a file stream but uses the open() syscall.
++
++
++
++<h3>Return value:</h3>
++File Object
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#nixio.umask">
++ umask
++ </a>
++
++ <li><a href="#nixio.open_flags">
++ open_flags
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="nixio.open_flags"></a><strong>open_flags</strong>&nbsp;(flag1, ...)</dt>
++<dd>
++
++ Generate flags for a call to open().
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ flag1: First Flag ["append", "creat", "excl", "nonblock", "ndelay",
++ "sync", "trunc", "rdonly", "wronly", "rdwr"]
++ </li>
++
++ <li>
++ ...: More Flags [-"-]
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function cannot fail and will never return nil.
++
++ <li>The "nonblock" and "ndelay" flags are aliases.
++
++ <li>The "nonblock", "ndelay" and "sync" flags are no-ops on Windows.
++
++</ul>
++
++
++
++<h3>Return value:</h3>
++flag to be used as second paramter to open
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.openlog"></a><strong>openlog</strong>&nbsp;(ident, flag1, ...)</dt>
++<dd>
++
++ (POSIX) Open a connection to the system logger.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ ident: Identifier
++ </li>
++
++ <li>
++ flag1: Flag 1 ["cons", "nowait", "pid", "perror", "ndelay", "odelay"]
++ </li>
++
++ <li>
++ ...: More flags [-"-]
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.pipe"></a><strong>pipe</strong>&nbsp;()</dt>
++<dd>
++
++ Create a pipe.
++
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>File Object of the read end
++
++ <li>File Object of the write end
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.poll"></a><strong>poll</strong>&nbsp;(fds, timeout)</dt>
++<dd>
++
++ Wait for some event on a file descriptor.
++ poll() sets the revents-field of the tables provided by fds to a bitfield
++ indicating the events that occured.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ fds: Table containing one or more tables containing <ul>
++ <li> fd = I/O Descriptor [Socket Object, File Object (POSIX)]</li>
++ <li> events = events to wait for (bitfield generated with poll_flags)</li>
++ </ul>
++ </li>
++
++ <li>
++ timeout: Timeout in milliseconds
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage</h3>
++<ul>
++
++ <li>This function works in-place on the provided table and only
++ writes the revents field, you can use other fields on your demand.
++
++ <li>All metamethods on the tables provided as fds are ignored.
++
++ <li>The revents-fields are not reset when the call times out.
++ You have to check the first return value to be 0 to handle this case.
++
++ <li>If you want to wait on a TLS-Socket you have to use the underlying
++ socket instead.
++
++ <li>On Windows poll is emulated through select(), can only be used
++ on socket descriptors and cannot take more than 64 descriptors per call.
++
++ <li>This function is not signal-protected and may fail with EINTR.
++
++</ul>
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>number of ready IO descriptors
++
++ <li>the fds-table with revents-fields set
++
++</ol>
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#nixio.poll_flags">
++ poll_flags
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="nixio.poll_flags"></a><strong>poll_flags</strong>&nbsp;(mode1, ...)</dt>
++<dd>
++
++ Generate events-bitfield or parse revents-bitfield for poll.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ mode1: revents-Flag bitfield returned from poll to parse OR
++ ["in", "out", "err", "pri" (POSIX), "hup" (POSIX), "nval" (POSIX)]
++ </li>
++
++ <li>
++ ...: More mode strings for generating the flag [-"-]
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++table with boolean fields reflecting the mode parameter
++ <strong>OR</strong> bitfield to use for the events-Flag field
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#nixio.poll">
++ poll
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="nixio.sendfile"></a><strong>sendfile</strong>&nbsp;(socket, file, length)</dt>
++<dd>
++
++ (POSIX) Send data from a file to a socket in kernel-space.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ socket: Socket Object
++ </li>
++
++ <li>
++ file: File Object
++ </li>
++
++ <li>
++ length: Amount of data to send (in Bytes).
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++bytes sent
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.setenv"></a><strong>setenv</strong>&nbsp;(variable, value)</dt>
++<dd>
++
++ Set or unset a environment variable.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ variable: Variable
++ </li>
++
++ <li>
++ value: Value (optional)
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++The environment variable will be unset if value is ommited.
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.setgid"></a><strong>setgid</strong>&nbsp;(gid)</dt>
++<dd>
++
++ (POSIX) Set the group id of the current process.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ gid: New Group ID
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.setlogmask"></a><strong>setlogmask</strong>&nbsp;(priority)</dt>
++<dd>
++
++ (POSIX) Set the logmask of the system logger for current process.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ priority: Priority ["emerg", "alert", "crit", "err", "warning",
++ "notice", "info", "debug"]
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.setsid"></a><strong>setsid</strong>&nbsp;()</dt>
++<dd>
++
++ (POSIX) Create a new session and set the process group ID.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++session id
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.setuid"></a><strong>setuid</strong>&nbsp;(gid)</dt>
++<dd>
++
++ (POSIX) Set the user id of the current process.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ gid: New User ID
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.signal"></a><strong>signal</strong>&nbsp;(signal, handler)</dt>
++<dd>
++
++ Ignore or use set the default handler for a signal.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ signal: Signal
++ </li>
++
++ <li>
++ handler: ["ign", "dfl"]
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++true
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.socket"></a><strong>socket</strong>&nbsp;(domain, type)</dt>
++<dd>
++
++ Create a new socket.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ domain: Domain ["inet", "inet6", "unix"]
++ </li>
++
++ <li>
++ type: Type ["stream", "dgram", "raw"]
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Socket Object
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.splice"></a><strong>splice</strong>&nbsp;(fdin, fdout, length, flags)</dt>
++<dd>
++
++ (Linux) Send data from / to a pipe in kernel-space.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ fdin: Input I/O descriptor
++ </li>
++
++ <li>
++ fdout: Output I/O descriptor
++ </li>
++
++ <li>
++ length: Amount of data to send (in Bytes).
++ </li>
++
++ <li>
++ flags: (optional, bitfield generated by splice_flags)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++bytes sent
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#nixio.splice_flags">
++ splice_flags
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="nixio.splice_flags"></a><strong>splice_flags</strong>&nbsp;(flag1, ...)</dt>
++<dd>
++
++ (Linux) Generate a flag bitfield for a call to splice.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ flag1: First Flag ["move", "nonblock", "more"]
++ </li>
++
++ <li>
++ ...: More flags [-"-]
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Flag bitfield
++
++
++
++<h3>See also:</h3>
++<ul>
++
++ <li><a href="#nixio.splice">
++ splice
++ </a>
++
++</ul>
++
++</dd>
++
++
++
++
++<dt><a name="nixio.strerror"></a><strong>strerror</strong>&nbsp;(errno)</dt>
++<dd>
++
++ Get the error message for the corresponding error code.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ errno: System error code
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++Error message
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.sysinfo"></a><strong>sysinfo</strong>&nbsp;()</dt>
++<dd>
++
++ (Linux) Get overall system statistics.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing: <ul>
++ <li>uptime = system uptime in seconds</li>
++ <li>loads = {loadavg1, loadavg5, loadavg15}</li>
++ <li>totalram = total RAM</li>
++ <li>freeram = free RAM</li>
++ <li>sharedram = shared RAM</li>
++ <li>bufferram = buffered RAM</li>
++ <li>totalswap = total SWAP</li>
++ <li>freeswap = free SWAP</li>
++ <li>procs = number of running processes</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.syslog"></a><strong>syslog</strong>&nbsp;(priority)</dt>
++<dd>
++
++ (POSIX) Write a message to the system logger.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ priority: Priority ["emerg", "alert", "crit", "err", "warning",
++ "notice", "info", "debug"]
++ </li>
++
++</ul>
++
++
++
++
++
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.times"></a><strong>times</strong>&nbsp;()</dt>
++<dd>
++
++ (POSIX) Get process times.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing: <ul>
++ <li>utime = user time</li>
++ <li>utime = system time</li>
++ <li>cutime = children user time</li>
++ <li>cstime = children system time</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.tls"></a><strong>tls</strong>&nbsp;(mode)</dt>
++<dd>
++
++ Create a new TLS context.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ mode: TLS-Mode ["client", "server"]
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return value:</h3>
++TLSContext Object
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.umask"></a><strong>umask</strong>&nbsp;(mask)</dt>
++<dd>
++
++ Sets the file mode creation mask.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ mask: New creation mask (see chmod for format specifications)
++ </li>
++
++</ul>
++
++
++
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>the old umask as decimal mode number
++
++ <li>the old umask as mode string
++
++</ol>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.uname"></a><strong>uname</strong>&nbsp;()</dt>
++<dd>
++
++ (POSIX) Get information about current system and kernel.
++
++
++
++
++
++
++
++<h3>Return value:</h3>
++Table containing: <ul>
++ <li>sysname = operating system</li>
++ <li>nodename = network name (usually hostname)</li>
++ <li>release = OS release</li>
++ <li>version = OS version</li>
++ <li>machine = hardware identifier</li>
++ </ul>
++
++
++
++</dd>
++
++
++
++
++<dt><a name="nixio.waitpid"></a><strong>waitpid</strong>&nbsp;(pid, flag1, ...)</dt>
++<dd>
++
++ (POSIX) Wait for a process to change state.
++
++
++<h3>Parameters</h3>
++<ul>
++
++ <li>
++ pid: Process ID (optional, default: any childprocess)
++ </li>
++
++ <li>
++ flag1: Flag (optional) ["nohang", "untraced", "continued"]
++ </li>
++
++ <li>
++ ...: More Flags [-"-]
++ </li>
++
++</ul>
++
++
++
++
++<h3>Usage:</h3>
++If the "nohang" is given this function becomes non-blocking.
++
++
++
++<h3>Return values:</h3>
++<ol>
++
++ <li>process id of child or 0 if no child has changed state
++
++ <li>["exited", "signaled", "stopped"]
++
++ <li>[exit code, terminate signal, stop signal]
++
++</ol>
++
++
++
++</dd>
++
++
++</dl>
++
++
++
++
++
++</div> <!-- id="content" -->
++
++</div> <!-- id="main" -->
++
++<div id="about">
++ <p><a href="http://validator.w3.org/check?uri=referer"><img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /></a></p>
++</div> <!-- id="about" -->
++
++</div> <!-- id="container" -->
++</body>
++</html>
+diff --git a/feeds/luci/documentation/i18n.md b/feeds/luci/documentation/i18n.md
+new file mode 100644
+index 0000000..fdacb08
+--- /dev/null
++++ b/feeds/luci/documentation/i18n.md
+@@ -0,0 +1,17 @@
++# General
++Translations are saved in the folder po/. You find the reference in po/templates/<package>.pot. The actual translation files can be found at po/<lang>/<package>.po .
++
++In order to use the commands below you need to have the _gettext'' utilities (''msgcat'', ''msgfmt'', ''msgmerge_) installed on your system.
++
++# Rebuild po files
++If you want to rebuild the translations after you made changes to a package this is an easy way:
++
++
++ ./build/i18n-scan.pl applications/[package] > po/templates/[application].pot
++ ./build/i18n-update.pl po [application].po
++
++*Note:* Some packages share translation files, in this case you need to scan through all their folders. The first command from above should then be:
++
++
++ ./build/i18n-scan.pl applications/[package-1] applications/[package-2] applications/[package-n] > po/templates/[application].pot
++
+diff --git a/feeds/luci/libs/luci-lib-httpclient/Makefile b/feeds/luci/libs/luci-lib-httpclient/Makefile
+new file mode 100644
+index 0000000..1e7fd1b
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-httpclient/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=HTTP(S) client library
++LUCI_DEPENDS:=+luci-base +luci-lib-nixio
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient.lua b/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient.lua
+new file mode 100644
+index 0000000..c76cc54
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient.lua
+@@ -0,0 +1,368 @@
++-- Copyright 2009 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require "nixio.util"
++local nixio = require "nixio"
++
++local ltn12 = require "luci.ltn12"
++local util = require "luci.util"
++local table = require "table"
++local http = require "luci.http.protocol"
++local date = require "luci.http.protocol.date"
++
++local type, pairs, ipairs, tonumber = type, pairs, ipairs, tonumber
++local unpack = unpack
++
++module "luci.httpclient"
++
++function chunksource(sock, buffer)
++ buffer = buffer or ""
++ return function()
++ local output
++ local _, endp, count = buffer:find("^([0-9a-fA-F]+);?.-\r\n")
++ while not count and #buffer <= 1024 do
++ local newblock, code = sock:recv(1024 - #buffer)
++ if not newblock then
++ return nil, code
++ end
++ buffer = buffer .. newblock
++ _, endp, count = buffer:find("^([0-9a-fA-F]+);?.-\r\n")
++ end
++ count = tonumber(count, 16)
++ if not count then
++ return nil, -1, "invalid encoding"
++ elseif count == 0 then
++ return nil
++ elseif count + 2 <= #buffer - endp then
++ output = buffer:sub(endp+1, endp+count)
++ buffer = buffer:sub(endp+count+3)
++ return output
++ else
++ output = buffer:sub(endp+1, endp+count)
++ buffer = ""
++ if count - #output > 0 then
++ local remain, code = sock:recvall(count-#output)
++ if not remain then
++ return nil, code
++ end
++ output = output .. remain
++ count, code = sock:recvall(2)
++ else
++ count, code = sock:recvall(count+2-#buffer+endp)
++ end
++ if not count then
++ return nil, code
++ end
++ return output
++ end
++ end
++end
++
++
++function request_to_buffer(uri, options)
++ local source, code, msg = request_to_source(uri, options)
++ local output = {}
++
++ if not source then
++ return nil, code, msg
++ end
++
++ source, code = ltn12.pump.all(source, (ltn12.sink.table(output)))
++
++ if not source then
++ return nil, code
++ end
++
++ return table.concat(output)
++end
++
++function request_to_source(uri, options)
++ local status, response, buffer, sock = request_raw(uri, options)
++ if not status then
++ return status, response, buffer
++ elseif status ~= 200 and status ~= 206 then
++ return nil, status, buffer
++ end
++
++ if response.headers["Transfer-Encoding"] == "chunked" then
++ return chunksource(sock, buffer)
++ else
++ return ltn12.source.cat(ltn12.source.string(buffer), sock:blocksource())
++ end
++end
++
++--
++-- GET HTTP-resource
++--
++function request_raw(uri, options)
++ options = options or {}
++ local pr, auth, host, port, path
++
++ if options.params then
++ uri = uri .. '?' .. http.urlencode_params(options.params)
++ end
++
++ if uri:find("%[") then
++ if uri:find("@") then
++ pr, auth, host, port, path = uri:match("(%w+)://(.+)@(%b[]):?([0-9]*)(.*)")
++ host = host:sub(2,-2)
++ else
++ pr, host, port, path = uri:match("(%w+)://(%b[]):?([0-9]*)(.*)")
++ host = host:sub(2,-2)
++ end
++ else
++ if uri:find("@") then
++ pr, auth, host, port, path =
++ uri:match("(%w+)://(.+)@([%w-.]+):?([0-9]*)(.*)")
++ else
++ pr, host, port, path = uri:match("(%w+)://([%w-.]+):?([0-9]*)(.*)")
++ end
++ end
++
++ if not host then
++ return nil, -1, "unable to parse URI"
++ end
++
++ if pr ~= "http" and pr ~= "https" then
++ return nil, -2, "protocol not supported"
++ end
++
++ port = #port > 0 and port or (pr == "https" and 443 or 80)
++ path = #path > 0 and path or "/"
++
++ options.depth = options.depth or 10
++ local headers = options.headers or {}
++ local protocol = options.protocol or "HTTP/1.1"
++ headers["User-Agent"] = headers["User-Agent"] or "LuCI httpclient 0.1"
++
++ if headers.Connection == nil then
++ headers.Connection = "close"
++ end
++
++ if auth and not headers.Authorization then
++ headers.Authorization = "Basic " .. nixio.bin.b64encode(auth)
++ end
++
++ local sock, code, msg = nixio.connect(host, port)
++ if not sock then
++ return nil, code, msg
++ end
++
++ sock:setsockopt("socket", "sndtimeo", options.sndtimeo or 15)
++ sock:setsockopt("socket", "rcvtimeo", options.rcvtimeo or 15)
++
++ if pr == "https" then
++ local tls = options.tls_context or nixio.tls()
++ sock = tls:create(sock)
++ local stat, code, error = sock:connect()
++ if not stat then
++ return stat, code, error
++ end
++ end
++
++ -- Pre assemble fixes
++ if protocol == "HTTP/1.1" then
++ headers.Host = headers.Host or host
++ end
++
++ if type(options.body) == "table" then
++ options.body = http.urlencode_params(options.body)
++ end
++
++ if type(options.body) == "string" then
++ headers["Content-Length"] = headers["Content-Length"] or #options.body
++ headers["Content-Type"] = headers["Content-Type"] or
++ "application/x-www-form-urlencoded"
++ options.method = options.method or "POST"
++ end
++
++ if type(options.body) == "function" then
++ options.method = options.method or "POST"
++ end
++
++ if options.cookies then
++ local cookiedata = {}
++ for _, c in ipairs(options.cookies) do
++ local cdo = c.flags.domain
++ local cpa = c.flags.path
++ if (cdo == host or cdo == "."..host or host:sub(-#cdo) == cdo)
++ and (cpa == path or cpa == "/" or cpa .. "/" == path:sub(#cpa+1))
++ and (not c.flags.secure or pr == "https")
++ then
++ cookiedata[#cookiedata+1] = c.key .. "=" .. c.value
++ end
++ end
++ if headers["Cookie"] then
++ headers["Cookie"] = headers["Cookie"] .. "; " .. table.concat(cookiedata, "; ")
++ else
++ headers["Cookie"] = table.concat(cookiedata, "; ")
++ end
++ end
++
++ -- Assemble message
++ local message = {(options.method or "GET") .. " " .. path .. " " .. protocol}
++
++ for k, v in pairs(headers) do
++ if type(v) == "string" or type(v) == "number" then
++ message[#message+1] = k .. ": " .. v
++ elseif type(v) == "table" then
++ for i, j in ipairs(v) do
++ message[#message+1] = k .. ": " .. j
++ end
++ end
++ end
++
++ message[#message+1] = ""
++ message[#message+1] = ""
++
++ -- Send request
++ sock:sendall(table.concat(message, "\r\n"))
++
++ if type(options.body) == "string" then
++ sock:sendall(options.body)
++ elseif type(options.body) == "function" then
++ local res = {options.body(sock)}
++ if not res[1] then
++ sock:close()
++ return unpack(res)
++ end
++ end
++
++ -- Create source and fetch response
++ local linesrc = sock:linesource()
++ local line, code, error = linesrc()
++
++ if not line then
++ sock:close()
++ return nil, code, error
++ end
++
++ local protocol, status, msg = line:match("^([%w./]+) ([0-9]+) (.*)")
++
++ if not protocol then
++ sock:close()
++ return nil, -3, "invalid response magic: " .. line
++ end
++
++ local response = {
++ status = line, headers = {}, code = 0, cookies = {}, uri = uri
++ }
++
++ line = linesrc()
++ while line and line ~= "" do
++ local key, val = line:match("^([%w-]+)%s?:%s?(.*)")
++ if key and key ~= "Status" then
++ if type(response.headers[key]) == "string" then
++ response.headers[key] = {response.headers[key], val}
++ elseif type(response.headers[key]) == "table" then
++ response.headers[key][#response.headers[key]+1] = val
++ else
++ response.headers[key] = val
++ end
++ end
++ line = linesrc()
++ end
++
++ if not line then
++ sock:close()
++ return nil, -4, "protocol error"
++ end
++
++ -- Parse cookies
++ if response.headers["Set-Cookie"] then
++ local cookies = response.headers["Set-Cookie"]
++ for _, c in ipairs(type(cookies) == "table" and cookies or {cookies}) do
++ local cobj = cookie_parse(c)
++ cobj.flags.path = cobj.flags.path or path:match("(/.*)/?[^/]*")
++ if not cobj.flags.domain or cobj.flags.domain == "" then
++ cobj.flags.domain = host
++ response.cookies[#response.cookies+1] = cobj
++ else
++ local hprt, cprt = {}, {}
++
++ -- Split hostnames and save them in reverse order
++ for part in host:gmatch("[^.]*") do
++ table.insert(hprt, 1, part)
++ end
++ for part in cobj.flags.domain:gmatch("[^.]*") do
++ table.insert(cprt, 1, part)
++ end
++
++ local valid = true
++ for i, part in ipairs(cprt) do
++ -- If parts are different and no wildcard
++ if hprt[i] ~= part and #part ~= 0 then
++ valid = false
++ break
++ -- Wildcard on invalid position
++ elseif hprt[i] ~= part and #part == 0 then
++ if i ~= #cprt or (#hprt ~= i and #hprt+1 ~= i) then
++ valid = false
++ break
++ end
++ end
++ end
++ -- No TLD cookies
++ if valid and #cprt > 1 and #cprt[2] > 0 then
++ response.cookies[#response.cookies+1] = cobj
++ end
++ end
++ end
++ end
++
++ -- Follow
++ response.code = tonumber(status)
++ if response.code and options.depth > 0 then
++ if (response.code == 301 or response.code == 302 or response.code == 307)
++ and response.headers.Location then
++ local nuri = response.headers.Location or response.headers.location
++ if not nuri then
++ return nil, -5, "invalid reference"
++ end
++ if not nuri:find("https?://") then
++ nuri = pr .. "://" .. host .. ":" .. port .. nuri
++ end
++
++ options.depth = options.depth - 1
++ if options.headers then
++ options.headers.Host = nil
++ end
++ sock:close()
++
++ return request_raw(nuri, options)
++ end
++ end
++
++ return response.code, response, linesrc(true)..sock:readall(), sock
++end
++
++function cookie_parse(cookiestr)
++ local key, val, flags = cookiestr:match("%s?([^=;]+)=?([^;]*)(.*)")
++ if not key then
++ return nil
++ end
++
++ local cookie = {key = key, value = val, flags = {}}
++ for fkey, fval in flags:gmatch(";%s?([^=;]+)=?([^;]*)") do
++ fkey = fkey:lower()
++ if fkey == "expires" then
++ fval = date.to_unix(fval:gsub("%-", " "))
++ end
++ cookie.flags[fkey] = fval
++ end
++
++ return cookie
++end
++
++function cookie_create(cookie)
++ local cookiedata = {cookie.key .. "=" .. cookie.value}
++
++ for k, v in pairs(cookie.flags) do
++ if k == "expires" then
++ v = date.to_http(v):gsub(", (%w+) (%w+) (%w+) ", ", %1-%2-%3 ")
++ end
++ cookiedata[#cookiedata+1] = k .. ((#v > 0) and ("=" .. v) or "")
++ end
++
++ return table.concat(cookiedata, "; ")
++end
+diff --git a/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient/receiver.lua b/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient/receiver.lua
+new file mode 100644
+index 0000000..b886e96
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient/receiver.lua
+@@ -0,0 +1,284 @@
++-- Copyright 2009 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require "nixio.util"
++local nixio = require "nixio"
++local httpc = require "luci.httpclient"
++local ltn12 = require "luci.ltn12"
++
++local print, tonumber, require, unpack = print, tonumber, require, unpack
++
++module "luci.httpclient.receiver"
++
++local function prepare_fd(target)
++ -- Open fd for appending
++ local oflags = nixio.open_flags("wronly", "creat")
++ local file, code, msg = nixio.open(target, oflags)
++ if not file then
++ return file, code, msg
++ end
++
++ -- Acquire lock
++ local stat, code, msg = file:lock("tlock")
++ if not stat then
++ return stat, code, msg
++ end
++
++ file:seek(0, "end")
++
++ return file
++end
++
++local function splice_async(sock, pipeout, pipein, file, cb)
++ local ssize = 65536
++ local smode = nixio.splice_flags("move", "more", "nonblock")
++
++ -- Set pipe non-blocking otherwise we might end in a deadlock
++ local stat, code, msg = pipein:setblocking(false)
++ if stat then
++ stat, code, msg = pipeout:setblocking(false)
++ end
++ if not stat then
++ return stat, code, msg
++ end
++
++
++ local pollsock = {
++ {fd=sock, events=nixio.poll_flags("in")}
++ }
++
++ local pollfile = {
++ {fd=file, events=nixio.poll_flags("out")}
++ }
++
++ local done
++ local active -- Older splice implementations sometimes don't detect EOS
++
++ repeat
++ active = false
++
++ -- Socket -> Pipe
++ repeat
++ nixio.poll(pollsock, 15000)
++
++ stat, code, msg = nixio.splice(sock, pipeout, ssize, smode)
++ if stat == nil then
++ return stat, code, msg
++ elseif stat == 0 then
++ done = true
++ break
++ elseif stat then
++ active = true
++ end
++ until stat == false
++
++ -- Pipe -> File
++ repeat
++ nixio.poll(pollfile, 15000)
++
++ stat, code, msg = nixio.splice(pipein, file, ssize, smode)
++ if stat == nil then
++ return stat, code, msg
++ elseif stat then
++ active = true
++ end
++ until stat == false
++
++ if cb then
++ cb(file)
++ end
++
++ if not active then
++ -- We did not splice any data, maybe EOS, fallback to default
++ return false
++ end
++ until done
++
++ pipein:close()
++ pipeout:close()
++ sock:close()
++ file:close()
++ return true
++end
++
++local function splice_sync(sock, pipeout, pipein, file, cb)
++ local os = require "os"
++ local ssize = 65536
++ local smode = nixio.splice_flags("move", "more")
++ local stat
++
++ -- This is probably the only forking http-client ;-)
++ local pid, code, msg = nixio.fork()
++ if not pid then
++ return pid, code, msg
++ elseif pid == 0 then
++ pipein:close()
++ file:close()
++
++ repeat
++ stat, code = nixio.splice(sock, pipeout, ssize, smode)
++ until not stat or stat == 0
++
++ pipeout:close()
++ sock:close()
++ os.exit(stat or code)
++ else
++ pipeout:close()
++ sock:close()
++
++ repeat
++ stat, code, msg = nixio.splice(pipein, file, ssize, smode)
++ if cb then
++ cb(file)
++ end
++ until not stat or stat == 0
++
++ pipein:close()
++ file:close()
++
++ if not stat then
++ nixio.kill(pid, 15)
++ nixio.wait(pid)
++ return stat, code, msg
++ else
++ pid, msg, code = nixio.wait(pid)
++ if msg == "exited" then
++ if code == 0 then
++ return true
++ else
++ return nil, code, nixio.strerror(code)
++ end
++ else
++ return nil, -0x11, "broken pump"
++ end
++ end
++ end
++end
++
++function request_to_file(uri, target, options, cbs)
++ options = options or {}
++ cbs = cbs or {}
++ options.headers = options.headers or {}
++ local hdr = options.headers
++ local file, code, msg
++
++ if target then
++ file, code, msg = prepare_fd(target)
++ if not file then
++ return file, code, msg
++ end
++
++ local off = file:tell()
++
++ -- Set content range
++ if off > 0 then
++ hdr.Range = hdr.Range or ("bytes=" .. off .. "-")
++ end
++ end
++
++ local code, resp, buffer, sock = httpc.request_raw(uri, options)
++ if not code then
++ -- No success
++ if file then
++ file:close()
++ end
++ return code, resp, buffer
++ elseif hdr.Range and code ~= 206 then
++ -- We wanted a part but we got the while file
++ sock:close()
++ if file then
++ file:close()
++ end
++ return nil, -4, code, resp
++ elseif not hdr.Range and code ~= 200 then
++ -- We encountered an error
++ sock:close()
++ if file then
++ file:close()
++ end
++ return nil, -4, code, resp
++ end
++
++ if cbs.on_header then
++ local stat = {cbs.on_header(file, code, resp)}
++ if stat[1] == false then
++ if file then
++ file:close()
++ end
++ sock:close()
++ return unpack(stat)
++ elseif stat[2] then
++ file = file and stat[2]
++ end
++ end
++
++ if not file then
++ return nil, -5, "no target given"
++ end
++
++ local chunked = resp.headers["Transfer-Encoding"] == "chunked"
++ local stat
++
++ -- Write the buffer to file
++ file:writeall(buffer)
++
++ repeat
++ if not options.splice or not sock:is_socket() or chunked then
++ break
++ end
++
++ -- This is a plain TCP socket and there is no encoding so we can splice
++
++ local pipein, pipeout, msg = nixio.pipe()
++ if not pipein then
++ sock:close()
++ file:close()
++ return pipein, pipeout, msg
++ end
++
++
++ -- Adjust splice values
++ local ssize = 65536
++ local smode = nixio.splice_flags("move", "more")
++
++ -- Splicing 512 bytes should never block on a fresh pipe
++ local stat, code, msg = nixio.splice(sock, pipeout, 512, smode)
++ if stat == nil then
++ break
++ end
++
++ -- Now do the real splicing
++ local cb = cbs.on_write
++ if options.splice == "asynchronous" then
++ stat, code, msg = splice_async(sock, pipeout, pipein, file, cb)
++ elseif options.splice == "synchronous" then
++ stat, code, msg = splice_sync(sock, pipeout, pipein, file, cb)
++ else
++ break
++ end
++
++ if stat == false then
++ break
++ end
++
++ return stat, code, msg
++ until true
++
++ local src = chunked and httpc.chunksource(sock) or sock:blocksource()
++ local snk = file:sink()
++
++ if cbs.on_write then
++ src = ltn12.source.chain(src, function(chunk)
++ cbs.on_write(file)
++ return chunk
++ end)
++ end
++
++ -- Fallback to read/write
++ stat, code, msg = ltn12.pump.all(src, snk)
++
++ file:close()
++ sock:close()
++ return stat and true, code, msg
++end
++
+diff --git a/feeds/luci/libs/luci-lib-ip/Makefile b/feeds/luci/libs/luci-lib-ip/Makefile
+new file mode 100644
+index 0000000..eb80dcb
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-ip/Makefile
+@@ -0,0 +1,14 @@
++#
++# Copyright (C) 2015 LuCI Team <luci@lists.subsignal.org>
++#
++# This is free software, licensed under the Apache License, Version 2.0 .
++#
++
++include $(TOPDIR)/rules.mk
++
++LUCI_TITLE:=Lua library for IP calculation and routing information
++LUCI_DEPENDS:=+liblua +libnl-tiny
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/libs/luci-lib-ip/src/Makefile b/feeds/luci/libs/luci-lib-ip/src/Makefile
+new file mode 100644
+index 0000000..76abd27
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-ip/src/Makefile
+@@ -0,0 +1,17 @@
++IP_CFLAGS = -std=gnu99 -I$(STAGING_DIR)/usr/include/libnl-tiny/
++IP_LDFLAGS = -llua -lm -lnl-tiny
++IP_OBJ = ip.o
++IP_LIB = ip.so
++
++%.o: %.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(LUA_CFLAGS) $(IP_CFLAGS) $(FPIC) -c -o $@ $<
++
++compile: $(IP_OBJ)
++ $(CC) $(LDFLAGS) -shared -o $(IP_LIB) $(IP_OBJ) $(IP_LDFLAGS)
++
++install: compile
++ mkdir -p $(DESTDIR)/usr/lib/lua/luci
++ cp $(IP_LIB) $(DESTDIR)/usr/lib/lua/luci/$(IP_LIB)
++
++clean:
++ rm -f *.o *.so
+diff --git a/feeds/luci/libs/luci-lib-ip/src/ip.c b/feeds/luci/libs/luci-lib-ip/src/ip.c
+new file mode 100644
+index 0000000..b91966c
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-ip/src/ip.c
+@@ -0,0 +1,1392 @@
++/*
++Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Unless required by applicable law or agreed to in writing, software
++distributed under the License is distributed on an "AS IS" BASIS,
++WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++See the License for the specific language governing permissions and
++limitations under the License.
++*/
++
++#define _GNU_SOURCE
++
++#include <stdio.h>
++#include <stdint.h>
++#include <stdbool.h>
++#include <unistd.h>
++#include <errno.h>
++#include <string.h>
++#include <limits.h>
++
++#include <lua.h>
++#include <lualib.h>
++#include <lauxlib.h>
++
++#include <net/if.h>
++#include <netinet/ether.h>
++#include <arpa/inet.h>
++#include <netlink/msg.h>
++#include <netlink/attr.h>
++#include <netlink/socket.h>
++#include <linux/rtnetlink.h>
++
++#define LUCI_IP "luci.ip"
++#define LUCI_IP_CIDR "luci.ip.cidr"
++
++#define RTA_INT(x) (*(int *)RTA_DATA(x))
++#define RTA_U32(x) (*(uint32_t *)RTA_DATA(x))
++
++static int hz = 0;
++static struct nl_sock *sock = NULL;
++
++typedef struct {
++ union {
++ struct in_addr v4;
++ struct in6_addr v6;
++ } addr;
++ int len;
++ int bits;
++ int family;
++ bool exact;
++} cidr_t;
++
++struct dump_filter {
++ bool get;
++ int family;
++ int iif;
++ int oif;
++ int type;
++ int scope;
++ int proto;
++ int table;
++ cidr_t gw;
++ cidr_t from;
++ cidr_t src;
++ cidr_t dst;
++ struct ether_addr mac;
++};
++
++struct dump_state {
++ int index;
++ int pending;
++ int callback;
++ struct lua_State *L;
++ struct dump_filter *filter;
++};
++
++
++static int _cidr_new(lua_State *L, int index, int family, bool mask);
++
++static cidr_t *L_checkcidr (lua_State *L, int index, cidr_t *p)
++{
++ if (lua_type(L, index) == LUA_TUSERDATA)
++ return luaL_checkudata(L, index, LUCI_IP_CIDR);
++
++ if (_cidr_new(L, index, p ? p->family : 0, false))
++ return lua_touserdata(L, -1);
++
++ luaL_error(L, "Invalid operand");
++ return NULL;
++}
++
++static bool parse_mask(int family, const char *mask, int *bits)
++{
++ char *e;
++ struct in_addr m;
++ struct in6_addr m6;
++
++ if (family == AF_INET && inet_pton(AF_INET, mask, &m))
++ {
++ for (*bits = 0, m.s_addr = ntohl(m.s_addr);
++ *bits < 32 && (m.s_addr << *bits) & 0x80000000;
++ ++*bits);
++ }
++ else if (family == AF_INET6 && inet_pton(AF_INET6, mask, &m6))
++ {
++ for (*bits = 0;
++ *bits < 128 && (m6.s6_addr[*bits / 8] << (*bits % 8)) & 128;
++ ++*bits);
++ }
++ else
++ {
++ *bits = strtoul(mask, &e, 10);
++
++ if (e == mask || *e != 0 || *bits > ((family == AF_INET) ? 32 : 128))
++ return false;
++ }
++
++ return true;
++}
++
++static bool parse_cidr(const char *dest, cidr_t *pp)
++{
++ char *p, buf[INET6_ADDRSTRLEN * 2 + 2];
++ uint8_t bitlen = 0;
++
++ strncpy(buf, dest, sizeof(buf) - 1);
++
++ p = strchr(buf, '/');
++
++ if (p)
++ *p++ = 0;
++
++ if (inet_pton(AF_INET, buf, &pp->addr.v4))
++ {
++ bitlen = 32;
++ pp->family = AF_INET;
++ pp->len = sizeof(struct in_addr);
++ }
++ else if (inet_pton(AF_INET6, buf, &pp->addr.v6))
++ {
++ bitlen = 128;
++ pp->family = AF_INET6;
++ pp->len = sizeof(struct in6_addr);
++ }
++ else
++ return false;
++
++ if (p)
++ {
++ if (!parse_mask(pp->family, p, &pp->bits))
++ return false;
++ }
++ else
++ {
++ pp->bits = bitlen;
++ }
++
++ return true;
++}
++
++static int L_getint(lua_State *L, int index, const char *name)
++{
++ int rv = 0;
++
++ lua_getfield(L, index, name);
++
++ if (lua_type(L, -1) == LUA_TNUMBER)
++ rv = lua_tonumber(L, -1);
++
++ lua_pop(L, 1);
++
++ return rv;
++}
++
++static const char * L_getstr(lua_State *L, int index, const char *name)
++{
++ const char *rv = NULL;
++
++ lua_getfield(L, index, name);
++
++ if (lua_type(L, -1) == LUA_TSTRING)
++ rv = lua_tostring(L, -1);
++
++ lua_pop(L, 1);
++
++ return rv;
++}
++
++static void L_setint(struct lua_State *L, const char *name, uint32_t n)
++{
++ lua_pushinteger(L, n);
++ lua_setfield(L, -2, name);
++}
++
++static void L_setbool(struct lua_State *L, const char *name, bool val)
++{
++ lua_pushboolean(L, val);
++ lua_setfield(L, -2, name);
++}
++
++static void L_setaddr(struct lua_State *L, const char *name,
++ int family, void *addr, int bits)
++{
++ cidr_t *p;
++
++ if (!addr)
++ return;
++
++ p = lua_newuserdata(L, sizeof(*p));
++
++ if (!p)
++ return;
++
++ if (family == AF_INET)
++ {
++ p->family = AF_INET;
++ p->bits = (bits < 0) ? 32 : bits;
++ p->len = sizeof(p->addr.v4);
++ p->addr.v4 = *(struct in_addr *)addr;
++ }
++ else
++ {
++ p->family = AF_INET6;
++ p->bits = (bits < 0) ? 128 : bits;
++ p->len = sizeof(p->addr.v6);
++ p->addr.v6 = *(struct in6_addr *)addr;
++ }
++
++ luaL_getmetatable(L, LUCI_IP_CIDR);
++ lua_setmetatable(L, -2);
++ lua_setfield(L, -2, name);
++}
++
++static void L_setstr(struct lua_State *L, const char *name, const char *val)
++{
++ lua_pushstring(L, val);
++ lua_setfield(L, -2, name);
++}
++
++static void L_setdev(struct lua_State *L, const char *name,
++ struct nlattr *attr)
++{
++ char buf[32];
++
++ if (if_indextoname(RTA_INT(attr), buf))
++ L_setstr(L, name, buf);
++}
++
++static int L_checkbits(lua_State *L, int index, cidr_t *p)
++{
++ int bits;
++
++ if (lua_gettop(L) < index || lua_isnil(L, index))
++ {
++ bits = p->bits;
++ }
++ else if (lua_type(L, index) == LUA_TNUMBER)
++ {
++ bits = lua_tointeger(L, index);
++
++ if (bits < 0 || bits > ((p->family == AF_INET) ? 32 : 128))
++ return luaL_error(L, "Invalid prefix size");
++ }
++ else if (lua_type(L, index) == LUA_TSTRING)
++ {
++ if (!parse_mask(p->family, lua_tostring(L, index), &bits))
++ return luaL_error(L, "Invalid netmask format");
++ }
++ else
++ {
++ return luaL_error(L, "Invalid data type");
++ }
++
++ return bits;
++}
++
++static int _cidr_new(lua_State *L, int index, int family, bool mask)
++{
++ uint32_t n;
++ const char *addr;
++ cidr_t cidr = { }, *cidrp;
++
++ if (lua_type(L, index) == LUA_TNUMBER)
++ {
++ n = htonl(lua_tointeger(L, index));
++
++ if (family == AF_INET6)
++ {
++ cidr.family = AF_INET6;
++ cidr.bits = 128;
++ cidr.len = sizeof(cidr.addr.v6);
++ cidr.addr.v6.s6_addr[12] = n;
++ cidr.addr.v6.s6_addr[13] = (n >> 8);
++ cidr.addr.v6.s6_addr[14] = (n >> 16);
++ cidr.addr.v6.s6_addr[15] = (n >> 24);
++ }
++ else
++ {
++ cidr.family = AF_INET;
++ cidr.bits = 32;
++ cidr.len = sizeof(cidr.addr.v4);
++ cidr.addr.v4.s_addr = n;
++ }
++ }
++ else
++ {
++ addr = luaL_checkstring(L, index);
++
++ if (!parse_cidr(addr, &cidr))
++ return 0;
++
++ if (family && cidr.family != family)
++ return 0;
++
++ if (mask)
++ cidr.bits = L_checkbits(L, index + 1, &cidr);
++ }
++
++ if (!(cidrp = lua_newuserdata(L, sizeof(*cidrp))))
++ return 0;
++
++ *cidrp = cidr;
++ luaL_getmetatable(L, LUCI_IP_CIDR);
++ lua_setmetatable(L, -2);
++ return 1;
++}
++
++static int cidr_new(lua_State *L)
++{
++ return _cidr_new(L, 1, 0, true);
++}
++
++static int cidr_ipv4(lua_State *L)
++{
++ return _cidr_new(L, 1, AF_INET, true);
++}
++
++static int cidr_ipv6(lua_State *L)
++{
++ return _cidr_new(L, 1, AF_INET6, true);
++}
++
++static int cidr_is4(lua_State *L)
++{
++ cidr_t *p = L_checkcidr(L, 1, NULL);
++
++ lua_pushboolean(L, p->family == AF_INET);
++ return 1;
++}
++
++static int cidr_is4rfc1918(lua_State *L)
++{
++ cidr_t *p = L_checkcidr(L, 1, NULL);
++ uint32_t a = htonl(p->addr.v4.s_addr);
++
++ lua_pushboolean(L, (p->family == AF_INET &&
++ ((a >= 0x0A000000 && a <= 0x0AFFFFFF) ||
++ (a >= 0xAC100000 && a <= 0xAC1FFFFF) ||
++ (a >= 0xC0A80000 && a <= 0xC0A8FFFF))));
++
++ return 1;
++}
++
++static int cidr_is4linklocal(lua_State *L)
++{
++ cidr_t *p = L_checkcidr(L, 1, NULL);
++ uint32_t a = htonl(p->addr.v4.s_addr);
++
++ lua_pushboolean(L, (p->family == AF_INET &&
++ a >= 0xA9FE0000 &&
++ a <= 0xA9FEFFFF));
++
++ return 1;
++}
++
++static bool _is_mapped4(cidr_t *p)
++{
++ return (p->family == AF_INET6 &&
++ p->addr.v6.s6_addr[0] == 0 &&
++ p->addr.v6.s6_addr[1] == 0 &&
++ p->addr.v6.s6_addr[2] == 0 &&
++ p->addr.v6.s6_addr[3] == 0 &&
++ p->addr.v6.s6_addr[4] == 0 &&
++ p->addr.v6.s6_addr[5] == 0 &&
++ p->addr.v6.s6_addr[6] == 0 &&
++ p->addr.v6.s6_addr[7] == 0 &&
++ p->addr.v6.s6_addr[8] == 0 &&
++ p->addr.v6.s6_addr[9] == 0 &&
++ p->addr.v6.s6_addr[10] == 0xFF &&
++ p->addr.v6.s6_addr[11] == 0xFF);
++}
++
++static int cidr_is6mapped4(lua_State *L)
++{
++ cidr_t *p = L_checkcidr(L, 1, NULL);
++
++ lua_pushboolean(L, _is_mapped4(p));
++ return 1;
++}
++
++static int cidr_is6(lua_State *L)
++{
++ cidr_t *p = L_checkcidr(L, 1, NULL);
++
++ lua_pushboolean(L, p->family == AF_INET6);
++ return 1;
++}
++
++static int cidr_is6linklocal(lua_State *L)
++{
++ cidr_t *p = L_checkcidr(L, 1, NULL);
++
++ lua_pushboolean(L, (p->family == AF_INET6 &&
++ p->addr.v6.s6_addr[0] == 0xFE &&
++ p->addr.v6.s6_addr[1] >= 0x80 &&
++ p->addr.v6.s6_addr[1] <= 0xBF));
++
++ return 1;
++}
++
++static int _cidr_cmp(lua_State *L)
++{
++ cidr_t *a = L_checkcidr(L, 1, NULL);
++ cidr_t *b = L_checkcidr(L, 2, NULL);
++
++ if (a->family != b->family)
++ return (a->family - b->family);
++
++ return memcmp(&a->addr.v6, &b->addr.v6, a->len);
++}
++
++static int cidr_lower(lua_State *L)
++{
++ lua_pushboolean(L, _cidr_cmp(L) < 0);
++ return 1;
++}
++
++static int cidr_higher(lua_State *L)
++{
++ lua_pushboolean(L, _cidr_cmp(L) > 0);
++ return 1;
++}
++
++static int cidr_equal(lua_State *L)
++{
++ lua_pushboolean(L, _cidr_cmp(L) == 0);
++ return 1;
++}
++
++static int cidr_lower_equal(lua_State *L)
++{
++ lua_pushboolean(L, _cidr_cmp(L) <= 0);
++ return 1;
++}
++
++static int cidr_prefix(lua_State *L)
++{
++ cidr_t *p = L_checkcidr(L, 1, NULL);
++ int bits = L_checkbits(L, 2, p);
++
++ p->bits = bits;
++ lua_pushinteger(L, p->bits);
++ return 1;
++}
++
++static void _apply_mask(cidr_t *p, int bits, bool inv)
++{
++ uint8_t b, i;
++
++ if (bits <= 0)
++ {
++ memset(&p->addr.v6, inv * 0xFF, p->len);
++ }
++ else if (p->family == AF_INET && bits <= 32)
++ {
++ if (inv)
++ p->addr.v4.s_addr |= ntohl((1 << (32 - bits)) - 1);
++ else
++ p->addr.v4.s_addr &= ntohl(~((1 << (32 - bits)) - 1));
++ }
++ else if (p->family == AF_INET6 && bits <= 128)
++ {
++ for (i = 0; i < sizeof(p->addr.v6.s6_addr); i++)
++ {
++ b = (bits > 8) ? 8 : bits;
++ if (inv)
++ p->addr.v6.s6_addr[i] |= ~((uint8_t)(0xFF << (8 - b)));
++ else
++ p->addr.v6.s6_addr[i] &= (uint8_t)(0xFF << (8 - b));
++ bits -= b;
++ }
++ }
++}
++
++static int cidr_network(lua_State *L)
++{
++ cidr_t *p1 = L_checkcidr(L, 1, NULL), *p2;
++ int bits = L_checkbits(L, 2, p1);
++
++ if (!(p2 = lua_newuserdata(L, sizeof(*p2))))
++ return 0;
++
++ *p2 = *p1;
++ p2->bits = (p1->family == AF_INET) ? 32 : 128;
++ _apply_mask(p2, bits, false);
++
++ luaL_getmetatable(L, LUCI_IP_CIDR);
++ lua_setmetatable(L, -2);
++ return 1;
++}
++
++static int cidr_host(lua_State *L)
++{
++ cidr_t *p1 = L_checkcidr(L, 1, NULL);
++ cidr_t *p2 = lua_newuserdata(L, sizeof(*p2));
++
++ if (!p2)
++ return 0;
++
++ *p2 = *p1;
++ p2->bits = (p1->family == AF_INET) ? 32 : 128;
++
++ luaL_getmetatable(L, LUCI_IP_CIDR);
++ lua_setmetatable(L, -2);
++ return 1;
++}
++
++static int cidr_mask(lua_State *L)
++{
++ cidr_t *p1 = L_checkcidr(L, 1, NULL), *p2;
++ int bits = L_checkbits(L, 2, p1);
++
++ if (!(p2 = lua_newuserdata(L, sizeof(*p2))))
++ return 0;
++
++ p2->bits = (p1->family == AF_INET) ? 32 : 128;
++ p2->family = p1->family;
++
++ memset(&p2->addr.v6.s6_addr, 0xFF, sizeof(p2->addr.v6.s6_addr));
++ _apply_mask(p2, bits, false);
++
++ luaL_getmetatable(L, LUCI_IP_CIDR);
++ lua_setmetatable(L, -2);
++ return 1;
++}
++
++static int cidr_broadcast(lua_State *L)
++{
++ cidr_t *p1 = L_checkcidr(L, 1, NULL);
++ cidr_t *p2;
++ int bits = L_checkbits(L, 2, p1);
++
++ if (p1->family == AF_INET6)
++ return 0;
++
++ if (!(p2 = lua_newuserdata(L, sizeof(*p2))))
++ return 0;
++
++ *p2 = *p1;
++ p2->bits = (p1->family == AF_INET) ? 32 : 128;
++ _apply_mask(p2, bits, true);
++
++ luaL_getmetatable(L, LUCI_IP_CIDR);
++ lua_setmetatable(L, -2);
++ return 1;
++}
++
++static int cidr_mapped4(lua_State *L)
++{
++ cidr_t *p1 = L_checkcidr(L, 1, NULL);
++ cidr_t *p2;
++
++ if (!_is_mapped4(p1))
++ return 0;
++
++ if (!(p2 = lua_newuserdata(L, sizeof(*p2))))
++ return 0;
++
++ p2->family = AF_INET;
++ p2->bits = (p1->bits > 32) ? 32 : p1->bits;
++ memcpy(&p2->addr.v4, p1->addr.v6.s6_addr + 12, sizeof(p2->addr.v4));
++
++ luaL_getmetatable(L, LUCI_IP_CIDR);
++ lua_setmetatable(L, -2);
++ return 1;
++}
++
++static int cidr_contains(lua_State *L)
++{
++ cidr_t *p1 = L_checkcidr(L, 1, NULL);
++ cidr_t *p2 = L_checkcidr(L, 2, NULL);
++ cidr_t a = *p1, b = *p2;
++ bool rv = false;
++
++ if (p1->family == p2->family && p1->bits <= p2->bits)
++ {
++ _apply_mask(&a, p1->bits, false);
++ _apply_mask(&b, p1->bits, false);
++
++ rv = !memcmp(&a.addr.v6, &b.addr.v6, a.len);
++ }
++
++ lua_pushboolean(L, rv);
++ return 1;
++}
++
++#define S6_BYTE(a, i) \
++ (a)->addr.v6.s6_addr[sizeof((a)->addr.v6.s6_addr) - (i) - 1]
++
++static int _cidr_add_sub(lua_State *L, bool add)
++{
++ cidr_t *p1 = L_checkcidr(L, 1, NULL);
++ cidr_t *p2 = L_checkcidr(L, 2, p1);
++ cidr_t r = *p1;
++ bool inplace = lua_isboolean(L, 3) ? lua_toboolean(L, 3) : false;
++ bool ok = true;
++ uint8_t i, carry;
++ uint32_t a, b;
++
++ if (p1->family == p2->family)
++ {
++ if (p1->family == AF_INET6)
++ {
++ for (i = 0, carry = 0; i < sizeof(r.addr.v6.s6_addr); i++)
++ {
++ if (add)
++ {
++ S6_BYTE(&r, i) = S6_BYTE(p1, i) + S6_BYTE(p2, i) + carry;
++ carry = (S6_BYTE(p1, i) + S6_BYTE(p2, i) + carry) / 256;
++ }
++ else
++ {
++ S6_BYTE(&r, i) = (S6_BYTE(p1, i) - S6_BYTE(p2, i) - carry);
++ carry = (S6_BYTE(p1, i) < (S6_BYTE(p2, i) + carry));
++ }
++ }
++
++ /* would over/underflow */
++ if (carry)
++ {
++ memset(&r.addr.v6, add * 0xFF, sizeof(r.addr.v6));
++ ok = false;
++ }
++ }
++ else
++ {
++ a = ntohl(p1->addr.v4.s_addr);
++ b = ntohl(p2->addr.v4.s_addr);
++
++ /* would over/underflow */
++ if ((add && (UINT_MAX - a) < b) || (!add && a < b))
++ {
++ r.addr.v4.s_addr = add * 0xFFFFFFFF;
++ ok = false;
++ }
++ else
++ {
++ r.addr.v4.s_addr = add ? htonl(a + b) : htonl(a - b);
++ }
++ }
++ }
++ else
++ {
++ ok = false;
++ }
++
++ if (inplace)
++ {
++ *p1 = r;
++ lua_pushboolean(L, ok);
++ return 1;
++ }
++
++ if (!(p1 = lua_newuserdata(L, sizeof(*p1))))
++ return 0;
++
++ *p1 = r;
++
++ luaL_getmetatable(L, LUCI_IP_CIDR);
++ lua_setmetatable(L, -2);
++ return 1;
++}
++
++static int cidr_add(lua_State *L)
++{
++ return _cidr_add_sub(L, true);
++}
++
++static int cidr_sub(lua_State *L)
++{
++ return _cidr_add_sub(L, false);
++}
++
++static int cidr_minhost(lua_State *L)
++{
++ cidr_t *p = L_checkcidr(L, 1, NULL);
++ cidr_t r = *p;
++ uint8_t i, rest, carry;
++
++ _apply_mask(&r, r.bits, false);
++
++ if (r.family == AF_INET6 && r.bits < 128)
++ {
++ r.bits = 128;
++
++ for (i = 0, carry = 1; i < sizeof(r.addr.v6.s6_addr); i++)
++ {
++ rest = (S6_BYTE(&r, i) + carry) > 255;
++ S6_BYTE(&r, i) += carry;
++ carry = rest;
++ }
++ }
++ else if (r.family == AF_INET && r.bits < 32)
++ {
++ r.bits = 32;
++ r.addr.v4.s_addr = htonl(ntohl(r.addr.v4.s_addr) + 1);
++ }
++
++ if (!(p = lua_newuserdata(L, sizeof(*p))))
++ return 0;
++
++ *p = r;
++
++ luaL_getmetatable(L, LUCI_IP_CIDR);
++ lua_setmetatable(L, -2);
++ return 1;
++}
++
++static int cidr_maxhost(lua_State *L)
++{
++ cidr_t *p = L_checkcidr(L, 1, NULL);
++ cidr_t r = *p;
++
++ _apply_mask(&r, r.bits, true);
++
++ if (r.family == AF_INET && r.bits < 32)
++ {
++ r.bits = 32;
++ r.addr.v4.s_addr = htonl(ntohl(r.addr.v4.s_addr) - 1);
++ }
++ else if (r.family == AF_INET6)
++ {
++ r.bits = 128;
++ }
++
++ if (!(p = lua_newuserdata(L, sizeof(*p))))
++ return 0;
++
++ *p = r;
++
++ luaL_getmetatable(L, LUCI_IP_CIDR);
++ lua_setmetatable(L, -2);
++ return 1;
++}
++
++static int cidr_gc (lua_State *L)
++{
++ return 0;
++}
++
++static int cidr_tostring (lua_State *L)
++{
++ char buf[INET6_ADDRSTRLEN];
++ cidr_t *p = L_checkcidr(L, 1, NULL);
++
++ if ((p->family == AF_INET && p->bits < 32) ||
++ (p->family == AF_INET6 && p->bits < 128))
++ {
++ lua_pushfstring(L, "%s/%d",
++ inet_ntop(p->family, &p->addr.v6, buf, sizeof(buf)),
++ p->bits);
++ }
++ else
++ {
++ lua_pushstring(L, inet_ntop(p->family, &p->addr.v6, buf, sizeof(buf)));
++ }
++
++ return 1;
++}
++
++/*
++ * route functions
++ */
++
++static bool diff_prefix(int family, void *addr, int bits, cidr_t *p)
++{
++ uint8_t i, b, r;
++ uint32_t m;
++
++ if (!p->family)
++ return false;
++
++ if (!addr || p->family != family || p->bits > bits)
++ return true;
++
++ if (family == AF_INET6)
++ {
++ for (i = 0, r = p->bits; i < sizeof(struct in6_addr); i++)
++ {
++ b = r ? (0xFF << (8 - ((r > 8) ? 8 : r))) : 0;
++
++ if ((((struct in6_addr *)addr)->s6_addr[i] & b) !=
++ (p->addr.v6.s6_addr[i] & b))
++ return true;
++
++ r -= ((r > 8) ? 8 : r);
++ }
++ }
++ else
++ {
++ m = p->bits ? htonl(~((1 << (32 - p->bits)) - 1)) : 0;
++
++ if ((((struct in_addr *)addr)->s_addr & m) != (p->addr.v4.s_addr & m))
++ return true;
++ }
++
++ return (p->exact && p->bits != bits);
++}
++
++static int cb_dump_route(struct nl_msg *msg, void *arg)
++{
++ struct dump_state *s = arg;
++ struct dump_filter *f = s->filter;
++ struct nlmsghdr *hdr = nlmsg_hdr(msg);
++ struct rtmsg *rt = NLMSG_DATA(hdr);
++ struct nlattr *tb[RTA_MAX+1];
++ struct in6_addr *src, *dst, *gw, *from, def = { };
++ int iif, oif, bitlen;
++ uint32_t table;
++
++ if (hdr->nlmsg_type != RTM_NEWROUTE ||
++ (rt->rtm_family != AF_INET && rt->rtm_family != AF_INET6))
++ return NL_SKIP;
++
++ nlmsg_parse(hdr, sizeof(*rt), tb, RTA_MAX, NULL);
++
++ iif = tb[RTA_IIF] ? RTA_INT(tb[RTA_IIF]) : 0;
++ oif = tb[RTA_OIF] ? RTA_INT(tb[RTA_OIF]) : 0;
++ table = tb[RTA_TABLE] ? RTA_U32(tb[RTA_TABLE]) : rt->rtm_table;
++ from = tb[RTA_SRC] ? RTA_DATA(tb[RTA_SRC]) : NULL;
++ src = tb[RTA_PREFSRC] ? RTA_DATA(tb[RTA_PREFSRC]) : NULL;
++ dst = tb[RTA_DST] ? RTA_DATA(tb[RTA_DST]) : &def;
++ gw = tb[RTA_GATEWAY] ? RTA_DATA(tb[RTA_GATEWAY]) : NULL;
++
++ bitlen = (rt->rtm_family == AF_INET6) ? 128 : 32;
++
++ if ((f->type && rt->rtm_type != f->type) ||
++ (f->family && rt->rtm_family != f->family) ||
++ (f->proto && rt->rtm_protocol != f->proto) ||
++ (f->scope && rt->rtm_scope != f->scope) ||
++ (f->iif && iif != f->iif) ||
++ (f->oif && oif != f->oif) ||
++ (f->table && table != f->table) ||
++ diff_prefix(rt->rtm_family, from, rt->rtm_src_len, &f->from) ||
++ diff_prefix(rt->rtm_family, dst, rt->rtm_dst_len, &f->dst) ||
++ diff_prefix(rt->rtm_family, gw, bitlen, &f->gw) ||
++ diff_prefix(rt->rtm_family, src, bitlen, &f->src))
++ goto out;
++
++ if (s->callback)
++ lua_pushvalue(s->L, 2);
++
++ lua_newtable(s->L);
++
++ L_setint(s->L, "type", rt->rtm_type);
++ L_setint(s->L, "family", (rt->rtm_family == AF_INET) ? 4 : 6);
++
++ L_setaddr(s->L, "dest", rt->rtm_family, dst, rt->rtm_dst_len);
++
++ if (gw)
++ L_setaddr(s->L, "gw", rt->rtm_family, gw, -1);
++
++ if (from)
++ L_setaddr(s->L, "from", rt->rtm_family, from, rt->rtm_src_len);
++
++ if (iif)
++ L_setdev(s->L, "iif", tb[RTA_IIF]);
++
++ if (oif)
++ L_setdev(s->L, "dev", tb[RTA_OIF]);
++
++ L_setint(s->L, "table", table);
++ L_setint(s->L, "proto", rt->rtm_protocol);
++ L_setint(s->L, "scope", rt->rtm_scope);
++
++ if (src)
++ L_setaddr(s->L, "src", rt->rtm_family, src, -1);
++
++ if (tb[RTA_PRIORITY])
++ L_setint(s->L, "metric", RTA_U32(tb[RTA_PRIORITY]));
++
++ if (rt->rtm_family == AF_INET6 && tb[RTA_CACHEINFO])
++ {
++ struct rta_cacheinfo *ci = RTA_DATA(tb[RTA_CACHEINFO]);
++
++ if (ci->rta_expires)
++ {
++ if (ci->rta_expires)
++ L_setint(s->L, "expires", ci->rta_expires / hz);
++
++ if (ci->rta_error != 0)
++ L_setint(s->L, "error", ci->rta_error);
++ }
++ }
++
++ s->index++;
++
++ if (s->callback)
++ lua_call(s->L, 1, 0);
++ else if (hdr->nlmsg_flags & NLM_F_MULTI)
++ lua_rawseti(s->L, -2, s->index);
++
++out:
++ s->pending = !!(hdr->nlmsg_flags & NLM_F_MULTI);
++ return NL_SKIP;
++}
++
++static int
++cb_done(struct nl_msg *msg, void *arg)
++{
++ struct dump_state *s = arg;
++ s->pending = 0;
++ return NL_STOP;
++}
++
++static int
++cb_error(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg)
++{
++ struct dump_state *s = arg;
++ s->pending = 0;
++ return NL_STOP;
++}
++
++static int _error(lua_State *L, int code, const char *msg)
++{
++ lua_pushnil(L);
++ lua_pushnumber(L, code ? code : errno);
++ lua_pushstring(L, msg ? msg : strerror(errno));
++
++ return 3;
++}
++
++static int _route_dump(lua_State *L, struct dump_filter *filter)
++{
++ int flags = NLM_F_REQUEST;
++ struct dump_state s = {
++ .L = L,
++ .pending = 1,
++ .index = 0,
++ .callback = lua_isfunction(L, 2),
++ .filter = filter
++ };
++
++ if (!hz)
++ hz = sysconf(_SC_CLK_TCK);
++
++ if (!sock)
++ {
++ sock = nl_socket_alloc();
++ if (!sock)
++ return _error(L, -1, "Out of memory");
++
++ if (nl_connect(sock, NETLINK_ROUTE))
++ return _error(L, 0, NULL);
++ }
++
++ struct nl_msg *msg;
++ struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT);
++ struct rtmsg rtm = {
++ .rtm_family = filter->family,
++ .rtm_dst_len = filter->dst.bits,
++ .rtm_src_len = filter->src.bits
++ };
++
++ if (!filter->get)
++ flags |= NLM_F_DUMP;
++
++ msg = nlmsg_alloc_simple(RTM_GETROUTE, flags);
++ if (!msg)
++ goto out;
++
++ nlmsg_append(msg, &rtm, sizeof(rtm), 0);
++
++ if (filter->get)
++ nla_put(msg, RTA_DST, filter->dst.len, &filter->dst.addr.v6);
++
++ nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_dump_route, &s);
++ nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, cb_done, &s);
++ nl_cb_err(cb, NL_CB_CUSTOM, cb_error, &s);
++
++ nl_send_auto_complete(sock, msg);
++
++ if (!filter->get && !s.callback)
++ lua_newtable(L);
++
++ while (s.pending > 0)
++ nl_recvmsgs(sock, cb);
++
++ nlmsg_free(msg);
++
++out:
++ nl_cb_put(cb);
++ return (s.callback == 0);
++}
++
++static int route_get(lua_State *L)
++{
++ struct dump_filter filter = { .get = true };
++ const char *dest = luaL_checkstring(L, 1);
++
++ if (!parse_cidr(dest, &filter.dst))
++ return _error(L, -1, "Invalid destination");
++
++ filter.family = filter.dst.family;
++
++ return _route_dump(L, &filter);
++}
++
++static int route_dump(lua_State *L)
++{
++ const char *s;
++ cidr_t p = { };
++ struct dump_filter filter = { };
++
++ if (lua_type(L, 1) == LUA_TTABLE)
++ {
++ filter.family = L_getint(L, 1, "family");
++
++ if (filter.family == 4)
++ filter.family = AF_INET;
++ else if (filter.family == 6)
++ filter.family = AF_INET6;
++ else
++ filter.family = 0;
++
++ if ((s = L_getstr(L, 1, "iif")) != NULL)
++ filter.iif = if_nametoindex(s);
++
++ if ((s = L_getstr(L, 1, "oif")) != NULL)
++ filter.oif = if_nametoindex(s);
++
++ filter.type = L_getint(L, 1, "type");
++ filter.scope = L_getint(L, 1, "scope");
++ filter.proto = L_getint(L, 1, "proto");
++ filter.table = L_getint(L, 1, "table");
++
++ if ((s = L_getstr(L, 1, "gw")) != NULL && parse_cidr(s, &p))
++ filter.gw = p;
++
++ if ((s = L_getstr(L, 1, "from")) != NULL && parse_cidr(s, &p))
++ filter.from = p;
++
++ if ((s = L_getstr(L, 1, "src")) != NULL && parse_cidr(s, &p))
++ filter.src = p;
++
++ if ((s = L_getstr(L, 1, "dest")) != NULL && parse_cidr(s, &p))
++ filter.dst = p;
++
++ if ((s = L_getstr(L, 1, "from_exact")) != NULL && parse_cidr(s, &p))
++ filter.from = p, filter.from.exact = true;
++
++ if ((s = L_getstr(L, 1, "dest_exact")) != NULL && parse_cidr(s, &p))
++ filter.dst = p, filter.dst.exact = true;
++ }
++
++ return _route_dump(L, &filter);
++}
++
++
++static bool diff_macaddr(struct ether_addr *mac1, struct ether_addr *mac2)
++{
++ struct ether_addr empty = { };
++
++ if (!memcmp(mac2, &empty, sizeof(empty)))
++ return false;
++
++ if (!mac1 || memcmp(mac1, mac2, sizeof(empty)))
++ return true;
++
++ return false;
++}
++
++static int cb_dump_neigh(struct nl_msg *msg, void *arg)
++{
++ char buf[32];
++ struct ether_addr *mac;
++ struct in6_addr *dst;
++ struct dump_state *s = arg;
++ struct dump_filter *f = s->filter;
++ struct nlmsghdr *hdr = nlmsg_hdr(msg);
++ struct ndmsg *nd = NLMSG_DATA(hdr);
++ struct nlattr *tb[NDA_MAX+1];
++ int bitlen;
++
++ if (hdr->nlmsg_type != RTM_NEWNEIGH ||
++ (nd->ndm_family != AF_INET && nd->ndm_family != AF_INET6))
++ return NL_SKIP;
++
++ nlmsg_parse(hdr, sizeof(*nd), tb, NDA_MAX, NULL);
++
++ mac = tb[NDA_LLADDR] ? RTA_DATA(tb[NDA_LLADDR]) : NULL;
++ dst = tb[NDA_DST] ? RTA_DATA(tb[NDA_DST]) : NULL;
++
++ bitlen = (nd->ndm_family == AF_INET) ? 32 : 128;
++
++ if ((f->family && nd->ndm_family != f->family) ||
++ (f->iif && nd->ndm_ifindex != f->iif) ||
++ (f->type && !(f->type & nd->ndm_state)) ||
++ diff_prefix(nd->ndm_family, dst, bitlen, &f->dst) ||
++ diff_macaddr(mac, &f->mac))
++ goto out;
++
++ if (s->callback)
++ lua_pushvalue(s->L, 2);
++
++ lua_newtable(s->L);
++
++ L_setint(s->L, "family", (nd->ndm_family == AF_INET) ? 4 : 6);
++ L_setstr(s->L, "dev", if_indextoname(nd->ndm_ifindex, buf));
++
++ L_setbool(s->L, "router", (nd->ndm_flags & NTF_ROUTER));
++ L_setbool(s->L, "proxy", (nd->ndm_flags & NTF_PROXY));
++
++ L_setbool(s->L, "incomplete", (nd->ndm_state & NUD_INCOMPLETE));
++ L_setbool(s->L, "reachable", (nd->ndm_state & NUD_REACHABLE));
++ L_setbool(s->L, "stale", (nd->ndm_state & NUD_STALE));
++ L_setbool(s->L, "delay", (nd->ndm_state & NUD_DELAY));
++ L_setbool(s->L, "probe", (nd->ndm_state & NUD_PROBE));
++ L_setbool(s->L, "failed", (nd->ndm_state & NUD_FAILED));
++ L_setbool(s->L, "noarp", (nd->ndm_state & NUD_NOARP));
++ L_setbool(s->L, "permanent", (nd->ndm_state & NUD_PERMANENT));
++
++ if (dst)
++ L_setaddr(s->L, "dest", nd->ndm_family, dst, -1);
++
++ if (mac)
++ {
++ snprintf(buf, sizeof(buf), "%02x:%02x:%02x:%02x:%02x:%02x",
++ mac->ether_addr_octet[0], mac->ether_addr_octet[1],
++ mac->ether_addr_octet[2], mac->ether_addr_octet[3],
++ mac->ether_addr_octet[4], mac->ether_addr_octet[5]);
++
++ lua_pushstring(s->L, buf);
++ lua_setfield(s->L, -2, "mac");
++ }
++
++ s->index++;
++
++ if (s->callback)
++ lua_call(s->L, 1, 0);
++ else if (hdr->nlmsg_flags & NLM_F_MULTI)
++ lua_rawseti(s->L, -2, s->index);
++
++out:
++ s->pending = !!(hdr->nlmsg_flags & NLM_F_MULTI);
++ return NL_SKIP;
++}
++
++static int neighbor_dump(lua_State *L)
++{
++ cidr_t p = { };
++ const char *s;
++ struct ether_addr *mac;
++ struct dump_filter filter = { .type = 0xFF & ~NUD_NOARP };
++ struct dump_state st = {
++ .callback = lua_isfunction(L, 2),
++ .pending = 1,
++ .filter = &filter,
++ .L = L
++ };
++
++ if (lua_type(L, 1) == LUA_TTABLE)
++ {
++ filter.family = L_getint(L, 1, "family");
++
++ if (filter.family == 4)
++ filter.family = AF_INET;
++ else if (filter.family == 6)
++ filter.family = AF_INET6;
++ else
++ filter.family = 0;
++
++ if ((s = L_getstr(L, 1, "dev")) != NULL)
++ filter.iif = if_nametoindex(s);
++
++ if ((s = L_getstr(L, 1, "dest")) != NULL && parse_cidr(s, &p))
++ filter.dst = p;
++
++ if ((s = L_getstr(L, 1, "mac")) != NULL &&
++ (mac = ether_aton(s)) != NULL)
++ filter.mac = *mac;
++ }
++
++ if (!sock)
++ {
++ sock = nl_socket_alloc();
++ if (!sock)
++ return _error(L, -1, "Out of memory");
++
++ if (nl_connect(sock, NETLINK_ROUTE))
++ return _error(L, 0, NULL);
++ }
++
++ struct nl_msg *msg;
++ struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT);
++ struct ndmsg ndm = {
++ .ndm_family = filter.family
++ };
++
++ msg = nlmsg_alloc_simple(RTM_GETNEIGH, NLM_F_REQUEST | NLM_F_DUMP);
++ if (!msg)
++ goto out;
++
++ nlmsg_append(msg, &ndm, sizeof(ndm), 0);
++
++ nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_dump_neigh, &st);
++ nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, cb_done, &st);
++ nl_cb_err(cb, NL_CB_CUSTOM, cb_error, &st);
++
++ nl_send_auto_complete(sock, msg);
++
++ if (!st.callback)
++ lua_newtable(L);
++
++ while (st.pending > 0)
++ nl_recvmsgs(sock, cb);
++
++ nlmsg_free(msg);
++
++out:
++ nl_cb_put(cb);
++ return (st.callback == 0);
++}
++
++
++static int cb_dump_link(struct nl_msg *msg, void *arg)
++{
++ char *p, *addr, buf[48];
++ struct dump_state *s = arg;
++ struct nlmsghdr *hdr = nlmsg_hdr(msg);
++ struct ifinfomsg *ifm = NLMSG_DATA(hdr);
++ struct nlattr *tb[IFLA_MAX+1];
++ int i, len;
++
++ if (hdr->nlmsg_type != RTM_NEWLINK)
++ return NL_SKIP;
++
++ nlmsg_parse(hdr, sizeof(*ifm), tb, IFLA_MAX, NULL);
++
++ L_setbool(s->L, "up", (ifm->ifi_flags & IFF_RUNNING));
++ L_setint(s->L, "type", ifm->ifi_type);
++ L_setstr(s->L, "name", if_indextoname(ifm->ifi_index, buf));
++
++ if (tb[IFLA_MTU])
++ L_setint(s->L, "mtu", RTA_U32(tb[IFLA_MTU]));
++
++ if (tb[IFLA_TXQLEN])
++ L_setint(s->L, "qlen", RTA_U32(tb[IFLA_TXQLEN]));
++
++ if (tb[IFLA_MASTER])
++ L_setdev(s->L, "master", tb[IFLA_MASTER]);
++
++ if (tb[IFLA_ADDRESS])
++ {
++ len = nla_len(tb[IFLA_ADDRESS]);
++ addr = nla_get_string(tb[IFLA_ADDRESS]);
++
++ if ((len * 3) <= sizeof(buf))
++ {
++ for (p = buf, i = 0; i < len; i++)
++ p += sprintf(p, "%s%02x", (i ? ":" : ""), (uint8_t)*addr++);
++
++ L_setstr(s->L, "mac", buf);
++ }
++ }
++
++ s->pending = 0;
++ return NL_SKIP;
++}
++
++static int link_get(lua_State *L)
++{
++ const char *dev = luaL_checkstring(L, 1);
++ struct dump_state st = {
++ .pending = 1,
++ .L = L
++ };
++
++ if (!sock)
++ {
++ sock = nl_socket_alloc();
++ if (!sock)
++ return _error(L, -1, "Out of memory");
++
++ if (nl_connect(sock, NETLINK_ROUTE))
++ return _error(L, 0, NULL);
++ }
++
++ struct nl_msg *msg = nlmsg_alloc_simple(RTM_GETLINK, NLM_F_REQUEST);
++ struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT);
++ struct ifinfomsg ifm = { .ifi_index = if_nametoindex(dev) };
++
++ if (!msg || !cb)
++ return 0;
++
++ nlmsg_append(msg, &ifm, sizeof(ifm), 0);
++
++ nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_dump_link, &st);
++ nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, cb_done, &st);
++ nl_cb_err(cb, NL_CB_CUSTOM, cb_error, &st);
++
++ lua_newtable(L);
++
++ nl_send_auto_complete(sock, msg);
++
++ while (st.pending > 0)
++ nl_recvmsgs(sock, cb);
++
++ nlmsg_free(msg);
++ nl_cb_put(cb);
++
++ return 1;
++}
++
++
++static const luaL_reg ip_methods[] = {
++ { "new", cidr_new },
++ { "IPv4", cidr_ipv4 },
++ { "IPv6", cidr_ipv6 },
++
++ { "route", route_get },
++ { "routes", route_dump },
++
++ { "neighbors", neighbor_dump },
++
++ { "link", link_get },
++
++ { }
++};
++
++static const luaL_reg ip_cidr_methods[] = {
++ { "is4", cidr_is4 },
++ { "is4rfc1918", cidr_is4rfc1918 },
++ { "is4linklocal", cidr_is4linklocal },
++ { "is6", cidr_is6 },
++ { "is6linklocal", cidr_is6linklocal },
++ { "is6mapped4", cidr_is6mapped4 },
++ { "lower", cidr_lower },
++ { "higher", cidr_higher },
++ { "equal", cidr_equal },
++ { "prefix", cidr_prefix },
++ { "network", cidr_network },
++ { "host", cidr_host },
++ { "mask", cidr_mask },
++ { "broadcast", cidr_broadcast },
++ { "mapped4", cidr_mapped4 },
++ { "contains", cidr_contains },
++ { "add", cidr_add },
++ { "sub", cidr_sub },
++ { "minhost", cidr_minhost },
++ { "maxhost", cidr_maxhost },
++ { "string", cidr_tostring },
++
++ { "__lt", cidr_lower },
++ { "__le", cidr_lower_equal },
++ { "__eq", cidr_equal },
++ { "__add", cidr_add },
++ { "__sub", cidr_sub },
++ { "__gc", cidr_gc },
++ { "__tostring", cidr_tostring },
++
++ { }
++};
++
++int luaopen_luci_ip(lua_State *L)
++{
++ luaL_register(L, LUCI_IP, ip_methods);
++
++ luaL_newmetatable(L, LUCI_IP_CIDR);
++ luaL_register(L, NULL, ip_cidr_methods);
++ lua_pushvalue(L, -1);
++ lua_setfield(L, -2, "__index");
++ lua_pop(L, 1);
++
++ return 1;
++}
+diff --git a/feeds/luci/libs/luci-lib-ip/src/ip.luadoc b/feeds/luci/libs/luci-lib-ip/src/ip.luadoc
+new file mode 100644
+index 0000000..e32ae72
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-ip/src/ip.luadoc
+@@ -0,0 +1,831 @@
++--- LuCI IP calculation and netlink access library.
++module "luci.ip"
++
++---[[
++Construct a new luci.ip.cidr instance and autodetect the address family.
++Throws an error if the given strings do not represent a valid address or
++if the given optional netmask is of a different family.
++@class function
++@sort 1
++@name new
++@param address String containing a valid IPv4 or IPv6 address, optionally
++with prefix size (CIDR notation) or netmask separated by slash.
++@param netmask String containing a valid IPv4 or IPv6 netmask or number
++containing a prefix size in bits (`0..32` for IPv4,
++`0..128` for IPv6). Overrides mask embedded in the first argument
++if specified. (optional)
++@return A `luci.ip.cidr` object representing the given
++address/mask range.
++@usage `addr = luci.ip.new("10.24.0.1/24")
++addr = luci.ip.new("10.24.0.1/255.255.255.0")
++addr = luci.ip.new("10.24.0.1", "255.255.255.0") -- separate netmask
++addr = luci.ip.new("10.24.0.1/24", 16) -- override netmask
++
++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64")
++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::")
++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::")
++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask`
++@see IPv4
++@see IPv6
++]]
++
++---[[
++Construct a new IPv4 luci.ip.cidr instance.
++Throws an error if the given string does not represent a valid IPv4 address or
++if the given optional netmask is of a different family.
++@class function
++@sort 2
++@name IPv4
++@param address String containing a valid IPv4, optionally with prefix size
++(CIDR notation) or netmask separated by slash.
++@param netmask String containing a valid IPv4 netmask or number
++containing a prefix size between `0` and `32` bit.
++Overrides mask embedded in the first argument if specified. (optional)
++@return A `luci.ip.cidr` object representing the given IPv4 range.
++@usage `addr = luci.ip.IPv4("10.24.0.1/24")
++addr = luci.ip.IPv4("10.24.0.1/255.255.255.0")
++addr = luci.ip.IPv4("10.24.0.1", "255.255.255.0") -- separate netmask
++addr = luci.ip.IPv4("10.24.0.1/24", 16) -- override netmask`
++@see IPv6
++]]
++
++---[[
++Construct a new IPv6 luci.ip.cidr instance.
++Throws an error if the given string does not represent a valid IPv6 address or
++if the given optional netmask is of a different family.
++@class function
++@sort 3
++@name IPv6
++@param address String containing a valid IPv6, optionally with prefix size
++(CIDR notation) or netmask separated by slash.
++@param netmask String containing a valid IPv4 netmask or number
++containing a prefix size between `0` and `128` bit.
++Overrides mask embedded in the first argument if specified. (optional)
++@return A `luci.ip.cidr` object representing the given IPv6 range.
++@usage `addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64")
++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::")
++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::")
++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask`
++@see IPv4
++]]
++
++---[[
++Determine the route leading to the given destination.
++@class function
++@sort 4
++@name route
++@param address A `luci.ip.cidr` instance or a string containing
++a valid IPv4 or IPv6 range as specified by `luci.ip.new()`.
++@return <p>Table containing the fields described below.</p>
++<table id="routetable">
++<tr><th>Field</th><th>Description</th></tr>
++<tr><td>`type`<td>
++ <p>Route type with one of the following numeric values:</p>
++ <table>
++ <tr>
++ <td>`1`</td>
++ <td>`RTN_UNICAST` - Gateway or direct route</td>
++ </tr>
++ <tr>
++ <td>`2`</td>
++ <td>`RTN_LOCAL` - Accept locally</td>
++ </tr>
++ <tr>
++ <td>`3`</td>
++ <td>`RTN_BROADCAST` -
++ Accept locally as broadcast send as broadcast</td>
++ </tr>
++ <tr>
++ <td>`4`</td>
++ <td>`RTN_ANYCAST` -
++ Accept locally as broadcast but send as unicast</td>
++ </tr>
++ <tr>
++ <td>`5`</td>
++ <td>`RTN_MULTICAST` - Multicast route</td>
++ </tr>
++ </table>
++</td></tr>
++<tr>
++ <td>`family`</td>
++ <td>Number containing the route family, `4` for IPv4 or
++ `6` for IPv6</td>
++</tr>
++<tr>
++ <td>`dest`</td>
++ <td>Destination `luci.ip.cidr` instance</td>
++</tr>
++<tr>
++ <td>`gw`</td>
++ <td>Gateway `luci.ip.cidr` instance (optional)</td>
++</tr>
++<tr>
++ <td>`from`</td>
++ <td>Source address `luci.ip.cidr` instance (optional)</td>
++</tr>
++<tr>
++ <td>`src`</td>
++ <td>Preferred source `luci.ip.cidr` instance (optional)</td>
++</tr>
++<tr>
++ <td>`dev`</td>
++ <td>String containing the name of the outgoing interface</td>
++</tr>
++<tr>
++ <td>`iif`</td>
++ <td>String containing the name of the incoming interface (optional)</td>
++</tr>
++<tr>
++ <td>`table`</td>
++ <td>Number of the associated routing table (`0..65535`)</td>
++</tr>
++<tr>
++ <td>`proto`</td>
++ <td>Number of the associated routing protocol</td>
++</tr>
++<tr>
++ <td>`scope`</td>
++ <td>Number describing the scope of the route, most commonly
++ `0` for global or `253` for on-link</td>
++</tr>
++<tr>
++ <td>`metric`</td>
++ <td>Number describing the route metric (optional)</td>
++</tr>
++<tr>
++ <td>`expires`</td>
++ <td>Number of seconds the prefix is valid (IPv6 only, optional)</td>
++</tr>
++<tr>
++ <td>`error`</td>
++ <td>Route destination error code (optional)</td>
++</tr>
++</table>
++@usage <ul>
++<li>Find default gateway by getting route to Google's public NS server
++`rt = luci.ip.route("8.8.8.8")
++if rt ~= nil then
++ print("gateway is", rt.gw)
++end`</li>
++<li>Determine IPv6 upstream interface `rt = luci.ip.route("2001::/7")
++if rt ~= nil then
++ print("ipv6 upstream device is", rt.dev)
++end`</li>
++</ul>
++@see routes
++]]
++
++---[[
++Fetch all routes, optionally matching the given criteria.
++@class function
++@sort 5
++@name routes
++@param filter <p>Table containing one or more of the possible filter
++critera described below (optional)</p><table>
++<tr><th>Field</th><th>Description</th></tr>
++<tr><td>`family`</td><td>
++ Number describing the address family to return - `4` selects
++ IPv4 routes, `6` IPv6 ones. Any other value selects both.
++</td></tr>
++<tr><td>`iif`</td><td>
++ String containing the incoming route interface to match.
++</td></tr>
++<tr><td>`oif`</td><td>
++ String containing the outgoing route interface to match.
++</td></tr>
++<tr><td>`type`</td><td>
++ Numeric type to match, e.g. `1` for unicast.
++</td></tr>
++<tr><td>`scope`</td><td>
++ Numeric scope to match, e.g. `253` for onlink.
++</td></tr>
++<tr><td>`proto`</td><td>
++ Numeric protocol to match, e.g. `2` for boot.
++</td></tr>
++<tr><td>`table`</td><td>
++ Numeric routing table to match (`0..65535`).
++</td></tr>
++<tr><td>`gw`</td><td>
++ String containing the gateway address to match. Can be in any notation
++ specified by `luci.ip.new()`. Prefix matching is performed when
++ comparing the routes, e.g. "192.168.1.0/24" would select routes with gateway
++ addresses `192.168.1.1 .. 192.168.1.255`.
++</td></tr>
++<tr><td>`dest`</td><td>
++ String containing the destination to match. Prefix matching is performed.
++</td></tr>
++<tr><td>`from`</td><td>
++ String containing the source address to match. Prefix matching is performed.
++</td></tr>
++<tr><td>`src`</td><td>
++ String containing the preferred source address to match.
++ Prefix matching is performed.
++</td></tr>
++<tr><td>`dest_exact`</td><td>
++ String containing the destination to match. Exact matching is performed,
++ e.g. `dest = "0.0.0.0/0"` would match <em>any</em> IPv4 route
++ while `dest_exact = "0.0.0.0/0"` will <em>only</em> match the
++ default route.
++</td></tr>
++<tr><td>`from_exact`</td><td>
++ String containing the source address to match. Exact matching is performed.
++</td></tr>
++</table>
++@param callback <p>Callback function to invoke for each found route
++instead of returning one table of route objects (optional)</p>
++@return If no callback function is provided, a table of routes
++<a href="#routetable">as specified by `luci.ip.route()`</a>
++is returned. If a callback function is given, it is invoked for each route
++and nothing is returned.
++@see route
++@usage <ul>
++<li>Find all IPv4 default routes:
++`luci.ip.routes({ dest_exact = "0.0.0.0/0" }, function(rt)
++ print(rt.type, rt.gw, rt.dev)
++end)`</li>
++<li>Find all global IPv6 prefixes on the current system:
++`luci.ip.routes({ from = "2001::/7" }, function(rt)
++ print(rt.from)
++end)`</li>
++<li>Fetch all IPv4 routes:
++`routes = luci.ip.routes({ family = 4 })
++for _, rt in ipairs(routes) do
++ print(rt.dest, rt.gw, rt.dev)
++end`</li>
++</ul>
++]]
++
++---[[
++Fetches entries from the IPv4 ARP and IPv6 neighbour kernel table
++@class function
++@sort 6
++@name neighbors
++@param filter <p>Table containing one or more of the possible filter
++critera described below (optional)</p><table>
++<tr><th>Field</th><th>Description</th></tr>
++<tr><td>`family`</td><td>
++ Number describing the address family to return - `4` selects
++ IPv4 ARP, `6` select IPv6 neighbour entries. Any other value
++ selects both.
++</td></tr>
++<tr><td>`dev`</td><td>
++ String containing the associated interface to match.
++</td></tr>
++<tr><td>`dest`</td><td>
++ String containing the associated address to match. Can be in any notation
++ specified by `luci.ip.new()`. Prefix matching is performed when
++ comparing the addresses, e.g. "192.168.1.0/24" would select ARP entries
++ for `192.168.1.1 .. 192.168.1.255`.
++</td></tr>
++<tr><td>`mac`</td><td>
++ String containing MAC address to match.
++</td></tr>
++</table>
++@param callback <p>Callback function to invoke for each found neighbour
++entry instead of returning one table of neighbour entries (optional)</p>
++@return If no callback function is provided, a table of neighbour entries
++is returned. If a callback function is given, it is invoked for each entry
++and nothing is returned.
++
++A neighbour entry is a table containing the following fields:
++
++<table>
++<tr><th>Field</th><th>Description</th></tr>
++<tr>
++ <td>`family`</td>
++ <td>Number containing the neighbour entry family, `4` for IPv4
++ ARP or `6` for IPv6 NDP</td>
++</tr>
++<tr>
++ <td>`dev`</td>
++ <td>String containing the associated device of the neighbour entry</td>
++</tr>
++<tr>
++ <td>`dest`</td>
++ <td>IP address `luci.ip.cidr` instance</td>
++</tr>
++<tr>
++ <td>`mac`</td>
++ <td>String containing the associated MAC address</td>
++</tr>
++<tr>
++ <td>`router`</td>
++ <td>Boolean "true" if the neighbour entry is a router (IPv6, optional)</td>
++</tr>
++<tr>
++ <td>`proxy`</td>
++ <td>Boolean "true" if this is a proxy entry (optional)</td>
++</tr>
++<tr>
++ <td>`incomplete`</td>
++ <td>Boolean "true" if the entry is in incomplete state (optional)</td>
++</tr>
++<tr>
++ <td>`reachable`</td>
++ <td>Boolean "true" if the entry is in reachable state (optional)</td>
++</tr>
++<tr>
++ <td>`stale`</td>
++ <td>Boolean "true" if the entry is stale (optional)</td>
++</tr>
++<tr>
++ <td>`delay`</td>
++ <td>Boolean "true" if the entry is delayed (optional)</td>
++</tr>
++<tr>
++ <td>`probe`</td>
++ <td>Boolean "true" if the entry is in probe state (optional)</td>
++</tr>
++<tr>
++ <td>`failed`</td>
++ <td>Boolean "true" if the entry is in failed state (optional)</td>
++</tr>
++<tr>
++ <td>`noarp`</td>
++ <td>Boolean "true" if the entry is not caused by NDP or
++ ARP (optional)</td>
++</tr>
++<tr>
++ <td>`permanent`</td>
++ <td>Boolean "true" if the entry was statically configured from
++ userspace (optional)</td>
++</tr>
++</table>
++@usage <ul>
++<li>Find all ARP neighbours in the LAN:
++`luci.ip.neighbors({ dest = "192.168.0.0/16" }, function(n)
++ print(n.dest, n.mac)
++end)`</li>
++<li>Find all active IPv6 addresses of host with given MAC:
++`luci.ip.neighbors({ family = 6, mac = "00:21:63:75:aa:17" },
++ function(n)
++ print(n.dest)
++ end)`</li>
++</ul>
++]]
++
++---[[
++Fetch basic device information
++@class function
++@sort 7
++@name link
++@param device String containing the network device to query
++@return If the given interface is found, a table containing the fields
++described below is returned, else an empty table.
++
++<table>
++<tr><th>Field</th><th>Description</th></tr>
++<tr>
++ <td>`up`</td>
++ <td>Boolean indicating whether the device is in IFF_RUNNING state</td>
++</tr>
++<tr>
++ <td>`type`</td>
++ <td>Numeric value indicating the type of the device, e.g. `1`
++ for ethernet.</td>
++</tr>
++<tr>
++ <td>`name`</td>
++ <td>String containing the name of the device</td>
++</tr>
++<tr>
++ <td>`master`</td>
++ <td>If queried device is a bridge port, string containing the name of
++ parent bridge device (optional)</td>
++</tr>
++<tr>
++ <td>`mtu`</td>
++ <td>Number containing the current MTU of the device</td>
++</tr>
++<tr>
++ <td>`qlen`</td>
++ <td>Number containing the TX queue length of the device</td>
++</tr>
++<tr>
++ <td>`mac`</td>
++ <td>String containing the link local address of the device in
++ dotted hex notation</td>
++</tr>
++</table>
++@usage <ul>
++<li>Test whether device br-lan exists:
++`print(luci.ip.link("br-lan").name ~= nil)
++`</li>
++<li>Query MAC address of eth0:
++`print(luci.ip.link("eth0").mac)
++`</li>
++</ul>
++]]
++
++
++--- IP CIDR Object.
++-- Represents an IPv4 or IPv6 address range.
++-- @cstyle instance
++module "luci.ip.cidr"
++
++---[[
++Checks whether the CIDR instance is an IPv4 address range
++
++@class function
++@sort 1
++@name cidr.is4
++@see cidr.is6
++@return `true` if the CIDR is an IPv4 range, else `false`
++]]
++
++---[[
++Checks whether the CIDR instance is within the private RFC1918 address space
++
++@class function
++@sort 2
++@name cidr.is4rfc1918
++@return `true` if the entire range of this CIDR lies within one of
++ the ranges `10.0.0.0-10.255.255.255`,
++ `172.16.0.0-172.31.0.0` or
++ `192.168.0.0-192.168.255.255`, else `false`.
++@usage `local addr = luci.ip.new("192.168.45.2/24")
++if addr:is4rfc1918() then
++ print("Is a private address")
++end`
++]]
++
++---[[
++Checks whether the CIDR instance is an IPv4 link local (Zeroconf) address
++
++@class function
++@sort 3
++@name cidr.is4linklocal
++@return `true` if the entire range of this CIDR lies within the range
++ the range `169.254.0.0-169.254.255.255`, else `false`.
++@usage `local addr = luci.ip.new("169.254.34.125")
++if addr:is4linklocal() then
++ print("Is a zeroconf address")
++end`
++]]
++
++---[[
++Checks whether the CIDR instance is an IPv6 address range
++
++@class function
++@sort 4
++@name cidr.is6
++@see cidr.is4
++@return `true` if the CIDR is an IPv6 range, else `false`
++]]
++
++---[[
++Checks whether the CIDR instance is an IPv6 link local address
++
++@class function
++@sort 5
++@name cidr.is6linklocal
++@return `true` if the entire range of this CIDR lies within the range
++ the `fe80::/10` range, else `false`.
++@usage `local addr = luci.ip.new("fe92:53a:3216:af01:221:63ff:fe75:aa17/64")
++if addr:is6linklocal() then
++ print("Is a linklocal address")
++end`
++]]
++
++---[[
++Checks whether the CIDR instance is an IPv6 mapped IPv4 address
++
++@class function
++@sort 6
++@name cidr.is6mapped4
++@return `true` if the address is an IPv6 mapped IPv4 address in the
++ form `::ffff:1.2.3.4`.
++@usage `local addr = luci.ip.new("::ffff:192.168.1.1")
++if addr:is6mapped4() then
++ print("Is a mapped IPv4 address")
++end`
++]]
++
++---[[
++Checks whether this CIDR instance is lower than the given argument.
++The comparisation follows these rules:
++<ul><li>An IPv4 address is always lower than an IPv6 address</li>
++<li>Prefix sizes are ignored</li></ul>
++
++@class function
++@sort 7
++@name cidr.lower
++@param addr A `luci.ip.cidr` instance or a string convertable by
++ `luci.ip.new()` to compare against.
++@return `true` if this CIDR is lower than the given address,
++ else `false`.
++@usage `local addr = luci.ip.new("192.168.1.1")
++print(addr:lower(addr)) -- false
++print(addr:lower("10.10.10.10/24")) -- false
++print(addr:lower(luci.ip.new("::1"))) -- true
++print(addr:lower(luci.ip.new("192.168.200.1"))) -- true`
++@see cidr.higher
++@see cidr.equal
++]]
++
++---[[
++Checks whether this CIDR instance is higher than the given argument.
++The comparisation follows these rules:
++<ul><li>An IPv4 address is always lower than an IPv6 address</li>
++<li>Prefix sizes are ignored</li></ul>
++
++@class function
++@sort 8
++@name cidr.higher
++@param addr A `luci.ip.cidr` instance or a string convertable by
++ `luci.ip.new()` to compare against.
++@return `true` if this CIDR is higher than the given address,
++ else `false`.
++@usage `local addr = luci.ip.new("192.168.1.1")
++print(addr:higher(addr)) -- false
++print(addr:higher("10.10.10.10/24")) -- true
++print(addr:higher(luci.ip.new("::1"))) -- false
++print(addr:higher(luci.ip.new("192.168.200.1"))) -- false`
++@see cidr.lower
++@see cidr.equal
++]]
++
++---[[
++Checks whether this CIDR instance is equal to the given argument.
++
++@class function
++@sort 9
++@name cidr.equal
++@param addr A `luci.ip.cidr` instance or a string convertable by
++ `luci.ip.new()` to compare against.
++@return `true` if this CIDR is equal to the given address,
++ else `false`.
++@usage `local addr = luci.ip.new("192.168.1.1")
++print(addr:equal(addr)) -- true
++print(addr:equal("192.168.1.1")) -- true
++print(addr:equal(luci.ip.new("::1"))) -- false
++
++local addr6 = luci.ip.new("::1")
++print(addr6:equal("0:0:0:0:0:0:0:1/64")) -- true
++print(addr6:equal(luci.ip.new("fe80::221:63ff:fe75:aa17"))) -- false`
++@see cidr.lower
++@see cidr.higher
++]]
++
++---[[
++Get or set prefix size of CIDR instance.
++If the optional mask parameter is given, the prefix size of this CIDR is altered
++else the current prefix size is returned.
++
++@class function
++@sort 10
++@name cidr.prefix
++@param mask Either a number containing the number of bits (`0..32`
++ for IPv4, `0..128` for IPv6) or a string containing a valid
++ netmask (optional)
++@return Bit count of the current prefix size
++@usage `local range = luci.ip.new("192.168.1.1/255.255.255.0")
++print(range:prefix()) -- 24
++
++range:prefix(16)
++print(range:prefix()) -- 16
++
++range:prefix("255.255.255.255")
++print(range:prefix()) -- 32`
++]]
++
++---[[
++Derive network address of CIDR instance.
++
++Returns a new CIDR instance representing the network address of this instance
++with all host parts masked out. The used prefix size can be overridden by the
++optional mask parameter.
++
++@class function
++@sort 11
++@name cidr.network
++@param mask Either a number containing the number of bits (`0..32`
++ for IPv4, `0..128` for IPv6) or a string containing a valid
++ netmask (optional)
++@return CIDR instance representing the network address
++@usage `local range = luci.ip.new("192.168.62.243/255.255.0.0")
++print(range:network()) -- "192.168.0.0"
++print(range:network(24)) -- "192.168.62.0"
++print(range:network("255.255.255.0")) -- "192.168.62.0"
++
++local range6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
++print(range6:network()) -- "fd9b:62b3:9cc5::"`
++]]
++
++---[[
++Derive host address of CIDR instance.
++
++This function essentially constructs a copy of this CIDR with the prefix size
++set to `32` for IPv4 and `128` for IPv6.
++
++@class function
++@sort 12
++@name cidr.host
++@return CIDR instance representing the host address
++@usage `local range = luci.ip.new("172.19.37.45/16")
++print(range) -- "172.19.37.45/16"
++print(range:host()) -- "172.19.37.45"`
++]]
++
++---[[
++Derive netmask of CIDR instance.
++
++Constructs a CIDR instance representing the netmask of this instance. The used
++prefix size can be overridden by the optional mask parameter.
++
++@class function
++@sort 13
++@name cidr.mask
++@param mask Either a number containing the number of bits (`0..32`
++ for IPv4, `0..128` for IPv6) or a string containing a valid
++ netmask (optional)
++@return CIDR instance representing the netmask
++@usage `local range = luci.ip.new("172.19.37.45/16")
++print(range:mask()) -- "255.255.0.0"
++print(range:mask(24)) -- "255.255.255.0"
++print(range:mask("255.0.0.0")) -- "255.0.0.0"`
++]]
++
++---[[
++Derive broadcast address of CIDR instance.
++
++Constructs a CIDR instance representing the broadcast address of this instance.
++The used prefix size can be overridden by the optional mask parameter.
++
++This function has no effect on IPv6 instances, it will return nothing in this
++case.
++
++@class function
++@sort 14
++@name cidr.broadcast
++@param mask Either a number containing the number of bits (`0..32`
++ for IPv4, `0..128` for IPv6) or a string containing a valid
++ netmask (optional)
++@return Return a new CIDR instance representing the broadcast address if this
++ instance is an IPv4 range, else return nothing.
++@usage `local range = luci.ip.new("172.19.37.45/16")
++print(range:broadcast()) -- "172.19.255.255"
++print(range:broadcast(24)) -- "172.19.37.255"
++print(range:broadcast("255.0.0.0")) -- "172.255.255.255"`
++]]
++
++---[[
++Derive mapped IPv4 address of CIDR instance.
++
++Constructs a CIDR instance representing the IPv4 address of the IPv6 mapped
++IPv4 address in this instance.
++
++This function has no effect on IPv4 instances or IPv6 instances which are not a
++mapped address, it will return nothing in this case.
++
++@class function
++@sort 15
++@name cidr.mapped4
++@return Return a new CIDR instance representing the IPv4 address if this
++ instance is an IPv6 mapped IPv4 address, else return nothing.
++@usage `local addr = luci.ip.new("::ffff:172.16.19.1")
++print(addr:mapped4()) -- "172.16.19.1"`
++]]
++
++---[[
++Test whether CIDR contains given range.
++
++@class function
++@sort 16
++@name cidr.contains
++@param addr A `luci.ip.cidr` instance or a string convertable by
++ `luci.ip.new()` to test.
++@return `true` if this instance fully contains the given address else
++ `false`.
++@usage `local range = luci.ip.new("10.24.0.0/255.255.0.0")
++print(range:contains("10.24.5.1")) -- true
++print(range:contains("::1")) -- false
++print(range:contains("10.0.0.0/8")) -- false
++
++local range6 = luci.ip.new("fe80::/10")
++print(range6:contains("fe80::221:63f:fe75:aa17/64")) -- true
++print(range6:contains("fd9b:6b3:c5:0:221:63f:fe75:aa17/64")) -- false`
++]]
++
++---[[
++Add given amount to CIDR instance. If the result would overflow the maximum
++address space, the result is set to the highest possible address.
++
++@class function
++@sort 17
++@name cidr.add
++@param amount A numeric value between 0 and 0xFFFFFFFF, a
++ `luci.ip.cidr` instance or a string convertable by
++ `luci.ip.new()`.
++@param inplace If `true`, modify this instance instead of returning
++ a new derived CIDR instance.
++@return <ul>
++ <li>When adding inplace: Return `true` if the addition succeded
++ or `false` when the addition overflowed.</li>
++ <li>When deriving new CIDR: Return new instance representing the value of
++ this instance plus the added amount or the highest possible address if
++ the addition overflowed the available address space.</li></ul>
++@usage `local addr = luci.ip.new("192.168.1.1/24")
++print(addr:add(250)) -- "192.168.1.251/24"
++print(addr:add("0.0.99.0")) -- "192.168.100.1/24"
++
++addr:add(256, true) -- true
++print(addr) -- "192.168.2.1/24
++
++addr:add("255.0.0.0", true) -- false (overflow)
++print(addr) -- "255.255.255.255/24
++
++local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64")
++print(addr6:add(256)) -- "fe80::221:63f:fe75:ab17/64"
++print(addr6:add("::ffff:0")) -- "fe80::221:640:fe74:aa17/64"
++
++addr:add(256, true) -- true
++print(addr) -- "fe80::221:63f:fe75:ab17/64
++
++addr:add("ffff::", true) -- false (overflow)
++print(addr) -- "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/64"`
++]]
++
++---[[
++Substract given amount from CIDR instance. If the result would under, the lowest
++possible address is returned.
++
++@class function
++@sort 18
++@name cidr.sub
++@param amount A numeric value between 0 and 0xFFFFFFFF, a
++ `luci.ip.cidr` instance or a string convertable by
++ `luci.ip.new()`.
++@param inplace If `true`, modify this instance instead of returning
++ a new derived CIDR instance.
++@return <ul>
++ <li>When substracting inplace: Return `true` if the substraction
++ succeded or `false` when the substraction underflowed.</li>
++ <li>When deriving new CIDR: Return new instance representing the value of
++ this instance minus the substracted amount or the lowest address if
++ the substraction underflowed.</li></ul>
++@usage `local addr = luci.ip.new("192.168.1.1/24")
++print(addr:sub(256)) -- "192.168.0.1/24"
++print(addr:sub("0.168.0.0")) -- "192.0.1.1/24"
++
++addr:sub(256, true) -- true
++print(addr) -- "192.168.0.1/24
++
++addr:sub("255.0.0.0", true) -- false (underflow)
++print(addr) -- "0.0.0.0/24
++
++local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64")
++print(addr6:sub(256)) -- "fe80::221:63f:fe75:a917/64"
++print(addr6:sub("::ffff:0")) -- "fe80::221:63e:fe76:aa17/64"
++
++addr:sub(256, true) -- true
++print(addr) -- "fe80::221:63f:fe75:a917/64"
++
++addr:sub("ffff::", true) -- false (underflow)
++print(addr) -- "::/64"`
++]]
++
++---[[
++Calculate the lowest possible host address within this CIDR instance.
++
++@class function
++@sort 19
++@name cidr.minhost
++@return Returns a new CIDR instance representing the lowest host address
++ within this range.
++@usage `local addr = luci.ip.new("192.168.123.56/24")
++print(addr:minhost()) -- "192.168.123.1"
++
++local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
++print(addr6:minhost()) -- "fd9b:62b3:9cc5::1"`
++]]
++
++---[[
++Calculate the highest possible host address within this CIDR instance.
++
++@class function
++@sort 20
++@name cidr.maxhost
++@return Returns a new CIDR instance representing the highest host address
++ within this range.
++@usage `local addr = luci.ip.new("192.168.123.56/24")
++print(addr:maxhost()) -- "192.168.123.254" (.255 is broadcast)
++
++local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64")
++print(addr6:maxhost()) -- "fd9b:62b3:9cc5:0:ffff:ffff:ffff:ffff"`
++]]
++
++---[[
++Convert CIDR instance into string representation.
++
++If the prefix size of instance is less than 32 for IPv4 or 128 for IPv6, the
++address is returned in the form "address/prefix" otherwise just "address".
++
++It is usually not required to call this function directly as CIDR objects
++define it as __tostring function in the associated metatable.
++
++@class function
++@sort 21
++@name cidr.string
++@return Returns a string representing the range or address of this CIDR instance
++]]
+diff --git a/feeds/luci/libs/luci-lib-json/Makefile b/feeds/luci/libs/luci-lib-json/Makefile
+new file mode 100644
+index 0000000..069886d
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-json/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI JSON library
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/libs/luci-lib-json/luasrc/json.lua b/feeds/luci/libs/luci-lib-json/luasrc/json.lua
+new file mode 100644
+index 0000000..f7b57f9
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-json/luasrc/json.lua
+@@ -0,0 +1,530 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local nixio = require "nixio"
++local util = require "luci.util"
++local table = require "table"
++local string = require "string"
++local coroutine = require "coroutine"
++
++local assert = assert
++local tonumber = tonumber
++local tostring = tostring
++local error = error
++local type = type
++local pairs = pairs
++local ipairs = ipairs
++local next = next
++local pcall = pcall
++
++local band = nixio.bit.band
++local bor = nixio.bit.bor
++local rshift = nixio.bit.rshift
++local char = string.char
++
++local getmetatable = getmetatable
++
++module "luci.json"
++
++
++function decode(json, ...)
++ local a = ActiveDecoder(function() return nil end, ...)
++ a.chunk = json
++ local s, obj = pcall(a.get, a)
++ return s and obj or nil
++end
++
++
++function encode(obj, ...)
++ local out = {}
++ local e = Encoder(obj, 1, ...):source()
++ local chnk, err
++ repeat
++ chnk, err = e()
++ out[#out+1] = chnk
++ until not chnk
++ return not err and table.concat(out) or nil
++end
++
++
++function null()
++ return null
++end
++
++Encoder = util.class()
++
++function Encoder.__init__(self, data, buffersize, fastescape)
++ self.data = data
++ self.buffersize = buffersize or 512
++ self.buffer = ""
++ self.fastescape = fastescape
++
++ getmetatable(self).__call = Encoder.source
++end
++
++function Encoder.source(self)
++ local source = coroutine.create(self.dispatch)
++ return function()
++ local res, data = coroutine.resume(source, self, self.data, true)
++ if res then
++ return data
++ else
++ return nil, data
++ end
++ end
++end
++
++function Encoder.dispatch(self, data, start)
++ local parser = self.parsers[type(data)]
++
++ parser(self, data)
++
++ if start then
++ if #self.buffer > 0 then
++ coroutine.yield(self.buffer)
++ end
++
++ coroutine.yield()
++ end
++end
++
++function Encoder.put(self, chunk)
++ if self.buffersize < 2 then
++ coroutine.yield(chunk)
++ else
++ if #self.buffer + #chunk > self.buffersize then
++ local written = 0
++ local fbuffer = self.buffersize - #self.buffer
++
++ coroutine.yield(self.buffer .. chunk:sub(written + 1, fbuffer))
++ written = fbuffer
++
++ while #chunk - written > self.buffersize do
++ fbuffer = written + self.buffersize
++ coroutine.yield(chunk:sub(written + 1, fbuffer))
++ written = fbuffer
++ end
++
++ self.buffer = chunk:sub(written + 1)
++ else
++ self.buffer = self.buffer .. chunk
++ end
++ end
++end
++
++function Encoder.parse_nil(self)
++ self:put("null")
++end
++
++function Encoder.parse_bool(self, obj)
++ self:put(obj and "true" or "false")
++end
++
++function Encoder.parse_number(self, obj)
++ self:put(tostring(obj))
++end
++
++function Encoder.parse_string(self, obj)
++ if self.fastescape then
++ self:put('"' .. obj:gsub('\\', '\\\\'):gsub('"', '\\"') .. '"')
++ else
++ self:put('"' ..
++ obj:gsub('[%c\\"]',
++ function(char)
++ return '\\u00%02x' % char:byte()
++ end
++ )
++ .. '"')
++ end
++end
++
++function Encoder.parse_iter(self, obj)
++ if obj == null then
++ return self:put("null")
++ end
++
++ if type(obj) == "table" and (#obj == 0 and next(obj)) then
++ self:put("{")
++ local first = true
++
++ for key, entry in pairs(obj) do
++ if key ~= null then
++ first = first or self:put(",")
++ first = first and false
++ self:parse_string(tostring(key))
++ self:put(":")
++ self:dispatch(entry)
++ end
++ end
++
++ self:put("}")
++ else
++ self:put("[")
++ local first = true
++
++ if type(obj) == "table" then
++ for i=1, #obj do
++ first = first or self:put(",")
++ first = first and nil
++ self:dispatch(obj[i])
++ end
++ else
++ for entry in obj do
++ first = first or self:put(",")
++ first = first and nil
++ self:dispatch(entry)
++ end
++ end
++
++ self:put("]")
++ end
++end
++
++Encoder.parsers = {
++ ['nil'] = Encoder.parse_nil,
++ ['table'] = Encoder.parse_iter,
++ ['number'] = Encoder.parse_number,
++ ['string'] = Encoder.parse_string,
++ ['boolean'] = Encoder.parse_bool,
++ ['function'] = Encoder.parse_iter
++}
++
++
++Decoder = util.class()
++
++function Decoder.__init__(self, customnull)
++ self.cnull = customnull
++ getmetatable(self).__call = Decoder.sink
++end
++
++function Decoder.sink(self)
++ local sink = coroutine.create(self.dispatch)
++ return function(...)
++ return coroutine.resume(sink, self, ...)
++ end
++end
++
++
++function Decoder.get(self)
++ return self.data
++end
++
++function Decoder.dispatch(self, chunk, src_err, strict)
++ local robject, object
++ local oset = false
++
++ while chunk do
++ while chunk and #chunk < 1 do
++ chunk = self:fetch()
++ end
++
++ assert(not strict or chunk, "Unexpected EOS")
++ if not chunk then break end
++
++ local char = chunk:sub(1, 1)
++ local parser = self.parsers[char]
++ or (char:match("%s") and self.parse_space)
++ or (char:match("[0-9-]") and self.parse_number)
++ or error("Unexpected char '%s'" % char)
++
++ chunk, robject = parser(self, chunk)
++
++ if parser ~= self.parse_space then
++ assert(not oset, "Scope violation: Too many objects")
++ object = robject
++ oset = true
++
++ if strict then
++ return chunk, object
++ end
++ end
++ end
++
++ assert(not src_err, src_err)
++ assert(oset, "Unexpected EOS")
++
++ self.data = object
++end
++
++
++function Decoder.fetch(self)
++ local tself, chunk, src_err = coroutine.yield()
++ assert(chunk or not src_err, src_err)
++ return chunk
++end
++
++
++function Decoder.fetch_atleast(self, chunk, bytes)
++ while #chunk < bytes do
++ local nchunk = self:fetch()
++ assert(nchunk, "Unexpected EOS")
++ chunk = chunk .. nchunk
++ end
++
++ return chunk
++end
++
++
++function Decoder.fetch_until(self, chunk, pattern)
++ local start = chunk:find(pattern)
++
++ while not start do
++ local nchunk = self:fetch()
++ assert(nchunk, "Unexpected EOS")
++ chunk = chunk .. nchunk
++ start = chunk:find(pattern)
++ end
++
++ return chunk, start
++end
++
++
++function Decoder.parse_space(self, chunk)
++ local start = chunk:find("[^%s]")
++
++ while not start do
++ chunk = self:fetch()
++ if not chunk then
++ return nil
++ end
++ start = chunk:find("[^%s]")
++ end
++
++ return chunk:sub(start)
++end
++
++
++function Decoder.parse_literal(self, chunk, literal, value)
++ chunk = self:fetch_atleast(chunk, #literal)
++ assert(chunk:sub(1, #literal) == literal, "Invalid character sequence")
++ return chunk:sub(#literal + 1), value
++end
++
++
++function Decoder.parse_null(self, chunk)
++ return self:parse_literal(chunk, "null", self.cnull and null)
++end
++
++
++function Decoder.parse_true(self, chunk)
++ return self:parse_literal(chunk, "true", true)
++end
++
++
++function Decoder.parse_false(self, chunk)
++ return self:parse_literal(chunk, "false", false)
++end
++
++
++function Decoder.parse_number(self, chunk)
++ local chunk, start = self:fetch_until(chunk, "[^0-9eE.+-]")
++ local number = tonumber(chunk:sub(1, start - 1))
++ assert(number, "Invalid number specification")
++ return chunk:sub(start), number
++end
++
++
++function Decoder.parse_string(self, chunk)
++ local str = ""
++ local object = nil
++ assert(chunk:sub(1, 1) == '"', 'Expected "')
++ chunk = chunk:sub(2)
++
++ while true do
++ local spos = chunk:find('[\\"]')
++ if spos then
++ str = str .. chunk:sub(1, spos - 1)
++
++ local char = chunk:sub(spos, spos)
++ if char == '"' then -- String end
++ chunk = chunk:sub(spos + 1)
++ break
++ elseif char == "\\" then -- Escape sequence
++ chunk, object = self:parse_escape(chunk:sub(spos))
++ str = str .. object
++ end
++ else
++ str = str .. chunk
++ chunk = self:fetch()
++ assert(chunk, "Unexpected EOS while parsing a string")
++ end
++ end
++
++ return chunk, str
++end
++
++
++function Decoder.utf8_encode(self, s1, s2)
++ local n = s1 * 256 + s2
++
++ if n >= 0 and n <= 0x7F then
++ return char(n)
++ elseif n >= 0 and n <= 0x7FF then
++ return char(
++ bor(band(rshift(n, 6), 0x1F), 0xC0),
++ bor(band(n, 0x3F), 0x80)
++ )
++ elseif n >= 0 and n <= 0xFFFF then
++ return char(
++ bor(band(rshift(n, 12), 0x0F), 0xE0),
++ bor(band(rshift(n, 6), 0x3F), 0x80),
++ bor(band(n, 0x3F), 0x80)
++ )
++ elseif n >= 0 and n <= 0x10FFFF then
++ return char(
++ bor(band(rshift(n, 18), 0x07), 0xF0),
++ bor(band(rshift(n, 12), 0x3F), 0x80),
++ bor(band(rshift(n, 6), 0x3F), 0x80),
++ bor(band(n, 0x3F), 0x80)
++ )
++ else
++ return "?"
++ end
++end
++
++
++function Decoder.parse_escape(self, chunk)
++ local str = ""
++ chunk = self:fetch_atleast(chunk:sub(2), 1)
++ local char = chunk:sub(1, 1)
++ chunk = chunk:sub(2)
++
++ if char == '"' then
++ return chunk, '"'
++ elseif char == "\\" then
++ return chunk, "\\"
++ elseif char == "u" then
++ chunk = self:fetch_atleast(chunk, 4)
++ local s1, s2 = chunk:sub(1, 2), chunk:sub(3, 4)
++ s1, s2 = tonumber(s1, 16), tonumber(s2, 16)
++ assert(s1 and s2, "Invalid Unicode character")
++
++ return chunk:sub(5), self:utf8_encode(s1, s2)
++ elseif char == "/" then
++ return chunk, "/"
++ elseif char == "b" then
++ return chunk, "\b"
++ elseif char == "f" then
++ return chunk, "\f"
++ elseif char == "n" then
++ return chunk, "\n"
++ elseif char == "r" then
++ return chunk, "\r"
++ elseif char == "t" then
++ return chunk, "\t"
++ else
++ error("Unexpected escaping sequence '\\%s'" % char)
++ end
++end
++
++
++function Decoder.parse_array(self, chunk)
++ chunk = chunk:sub(2)
++ local array = {}
++ local nextp = 1
++
++ local chunk, object = self:parse_delimiter(chunk, "%]")
++
++ if object then
++ return chunk, array
++ end
++
++ repeat
++ chunk, object = self:dispatch(chunk, nil, true)
++ table.insert(array, nextp, object)
++ nextp = nextp + 1
++
++ chunk, object = self:parse_delimiter(chunk, ",%]")
++ assert(object, "Delimiter expected")
++ until object == "]"
++
++ return chunk, array
++end
++
++
++function Decoder.parse_object(self, chunk)
++ chunk = chunk:sub(2)
++ local array = {}
++ local name
++
++ local chunk, object = self:parse_delimiter(chunk, "}")
++
++ if object then
++ return chunk, array
++ end
++
++ repeat
++ chunk = self:parse_space(chunk)
++ assert(chunk, "Unexpected EOS")
++
++ chunk, name = self:parse_string(chunk)
++
++ chunk, object = self:parse_delimiter(chunk, ":")
++ assert(object, "Separator expected")
++
++ chunk, object = self:dispatch(chunk, nil, true)
++ array[name] = object
++
++ chunk, object = self:parse_delimiter(chunk, ",}")
++ assert(object, "Delimiter expected")
++ until object == "}"
++
++ return chunk, array
++end
++
++
++function Decoder.parse_delimiter(self, chunk, delimiter)
++ while true do
++ chunk = self:fetch_atleast(chunk, 1)
++ local char = chunk:sub(1, 1)
++ if char:match("%s") then
++ chunk = self:parse_space(chunk)
++ assert(chunk, "Unexpected EOS")
++ elseif char:match("[%s]" % delimiter) then
++ return chunk:sub(2), char
++ else
++ return chunk, nil
++ end
++ end
++end
++
++
++Decoder.parsers = {
++ ['"'] = Decoder.parse_string,
++ ['t'] = Decoder.parse_true,
++ ['f'] = Decoder.parse_false,
++ ['n'] = Decoder.parse_null,
++ ['['] = Decoder.parse_array,
++ ['{'] = Decoder.parse_object
++}
++
++
++ActiveDecoder = util.class(Decoder)
++
++function ActiveDecoder.__init__(self, source, customnull)
++ Decoder.__init__(self, customnull)
++ self.source = source
++ self.chunk = nil
++ getmetatable(self).__call = self.get
++end
++
++
++function ActiveDecoder.get(self)
++ local chunk, src_err, object
++ if not self.chunk then
++ chunk, src_err = self.source()
++ else
++ chunk = self.chunk
++ end
++
++ self.chunk, object = self:dispatch(chunk, src_err, true)
++ return object
++end
++
++
++function ActiveDecoder.fetch(self)
++ local chunk, src_err = self.source()
++ assert(chunk or not src_err, src_err)
++ return chunk
++end
+diff --git a/feeds/luci/libs/luci-lib-json/luasrc/json.luadoc b/feeds/luci/libs/luci-lib-json/luasrc/json.luadoc
+new file mode 100644
+index 0000000..37f97d2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-json/luasrc/json.luadoc
+@@ -0,0 +1,94 @@
++---[[
++LuCI JSON-Library
++
++@cstyle instance
++]]
++module "luci.json"
++
++---[[
++Directly decode a JSON string
++
++@class function
++@name decode
++@param json JSON-String
++@return Lua object
++]]
++
++---[[
++Direcly encode a Lua object into a JSON string.
++
++@class function
++@name encode
++@param obj Lua Object
++@return JSON string
++]]
++
++---[[
++Null replacement function
++
++@class function
++@name null
++@return null
++]]
++
++---[[
++Create a new JSON-Encoder.
++
++@class function
++@name Encoder
++@param data Lua-Object to be encoded.
++@param buffersize Blocksize of returned data source.
++@param fastescape Use non-standard escaping (don't escape control chars)
++@return JSON-Encoder
++]]
++
++---[[
++Create an LTN12 source providing the encoded JSON-Data.
++
++@class function
++@name Encoder.source
++@return LTN12 source
++]]
++
++---[[
++Create a new JSON-Decoder.
++
++@class function
++@name Decoder
++@param customnull Use luci.json.null instead of nil for decoding null
++@return JSON-Decoder
++]]
++
++---[[
++Create an LTN12 sink from the decoder object which accepts the JSON-Data.
++
++@class function
++@name Decoder.sink
++@return LTN12 sink
++]]
++
++---[[
++Get the decoded data packets after the rawdata has been sent to the sink.
++
++@class function
++@name Decoder.get
++@return Decoded data
++]]
++
++---[[
++Create a new Active JSON-Decoder.
++
++@class function
++@name ActiveDecoder
++@param customnull Use luci.json.null instead of nil for decoding null
++@return Active JSON-Decoder
++]]
++
++---[[
++Fetches one JSON-object from given source
++
++@class function
++@name ActiveDecoder.get
++@return Decoded object
++]]
++
+diff --git a/feeds/luci/libs/luci-lib-jsonc/Makefile b/feeds/luci/libs/luci-lib-jsonc/Makefile
+new file mode 100644
+index 0000000..6a63dab
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-jsonc/Makefile
+@@ -0,0 +1,14 @@
++#
++# Copyright (C) 2015 LuCI Team <luci@lists.subsignal.org>
++#
++# This is free software, licensed under the Apache License, Version 2.0 .
++#
++
++include $(TOPDIR)/rules.mk
++
++LUCI_TITLE:=Lua binding for JSON-C
++LUCI_DEPENDS:=+liblua +libjson-c
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/libs/luci-lib-jsonc/src/Makefile b/feeds/luci/libs/luci-lib-jsonc/src/Makefile
+new file mode 100644
+index 0000000..e15fbac
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-jsonc/src/Makefile
+@@ -0,0 +1,17 @@
++JSONC_CFLAGS = -std=gnu99 -I$(STAGING_DIR)/usr/include/json-c/
++JSONC_LDFLAGS = -llua -lm -ljson-c
++JSONC_OBJ = jsonc.o
++JSONC_LIB = jsonc.so
++
++%.o: %.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(LUA_CFLAGS) $(JSONC_CFLAGS) $(FPIC) -c -o $@ $<
++
++compile: $(JSONC_OBJ)
++ $(CC) $(LDFLAGS) -shared -o $(JSONC_LIB) $(JSONC_OBJ) $(JSONC_LDFLAGS)
++
++install: compile
++ mkdir -p $(DESTDIR)/usr/lib/lua/luci
++ cp $(JSONC_LIB) $(DESTDIR)/usr/lib/lua/luci/$(JSONC_LIB)
++
++clean:
++ rm -f *.o *.so
+diff --git a/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c
+new file mode 100644
+index 0000000..b857c97
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c
+@@ -0,0 +1,390 @@
++/*
++Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Unless required by applicable law or agreed to in writing, software
++distributed under the License is distributed on an "AS IS" BASIS,
++WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++See the License for the specific language governing permissions and
++limitations under the License.
++*/
++
++#define _GNU_SOURCE
++
++#include <math.h>
++#include <stdbool.h>
++#include <json-c/json.h>
++
++#include <lua.h>
++#include <lualib.h>
++#include <lauxlib.h>
++
++#define LUCI_JSONC "luci.jsonc"
++#define LUCI_JSONC_PARSER "luci.jsonc.parser"
++
++struct json_state {
++ struct json_object *obj;
++ struct json_tokener *tok;
++ enum json_tokener_error err;
++};
++
++static void _json_to_lua(lua_State *L, struct json_object *obj);
++static struct json_object * _lua_to_json(lua_State *L, int index);
++
++static int json_new(lua_State *L)
++{
++ struct json_state *s;
++ struct json_tokener *tok = json_tokener_new();
++
++ if (!tok)
++ return 0;
++
++ s = lua_newuserdata(L, sizeof(*s));
++
++ if (!s)
++ {
++ json_tokener_free(tok);
++ return 0;
++ }
++
++ s->tok = tok;
++ s->obj = NULL;
++ s->err = json_tokener_continue;
++
++ luaL_getmetatable(L, LUCI_JSONC_PARSER);
++ lua_setmetatable(L, -2);
++
++ return 1;
++}
++
++static int json_parse(lua_State *L)
++{
++ size_t len;
++ const char *json = luaL_checklstring(L, 1, &len);
++ struct json_state s = {
++ .tok = json_tokener_new()
++ };
++
++ if (!s.tok)
++ return 0;
++
++ s.obj = json_tokener_parse_ex(s.tok, json, len);
++ s.err = json_tokener_get_error(s.tok);
++
++ if (s.obj)
++ {
++ _json_to_lua(L, s.obj);
++ json_object_put(s.obj);
++ }
++ else
++ {
++ lua_pushnil(L);
++ }
++
++ if (s.err == json_tokener_continue)
++ s.err = json_tokener_error_parse_eof;
++
++ if (s.err)
++ lua_pushstring(L, json_tokener_error_desc(s.err));
++
++ json_tokener_free(s.tok);
++ return (1 + !!s.err);
++}
++
++static int json_stringify(lua_State *L)
++{
++ struct json_object *obj = _lua_to_json(L, 1);
++ bool pretty = lua_toboolean(L, 2);
++ int flags = 0;
++
++ if (pretty)
++ flags |= JSON_C_TO_STRING_PRETTY | JSON_C_TO_STRING_SPACED;
++
++ lua_pushstring(L, json_object_to_json_string_ext(obj, flags));
++ json_object_put(obj);
++ return 1;
++}
++
++
++static int json_parse_chunk(lua_State *L)
++{
++ size_t len;
++ struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER);
++ const char *chunk = luaL_checklstring(L, 2, &len);
++
++ s->obj = json_tokener_parse_ex(s->tok, chunk, len);
++ s->err = json_tokener_get_error(s->tok);
++
++ if (!s->err)
++ {
++ lua_pushboolean(L, true);
++ return 1;
++ }
++ else if (s->err == json_tokener_continue)
++ {
++ lua_pushboolean(L, false);
++ return 1;
++ }
++
++ lua_pushnil(L);
++ lua_pushstring(L, json_tokener_error_desc(s->err));
++ return 2;
++}
++
++static void _json_to_lua(lua_State *L, struct json_object *obj)
++{
++ int n;
++
++ switch (json_object_get_type(obj))
++ {
++ case json_type_object:
++ lua_newtable(L);
++ json_object_object_foreach(obj, key, val)
++ {
++ _json_to_lua(L, val);
++ lua_setfield(L, -2, key);
++ }
++ break;
++
++ case json_type_array:
++ lua_newtable(L);
++ for (n = 0; n < json_object_array_length(obj); n++)
++ {
++ _json_to_lua(L, json_object_array_get_idx(obj, n));
++ lua_rawseti(L, -2, n + 1);
++ }
++ break;
++
++ case json_type_boolean:
++ lua_pushboolean(L, json_object_get_boolean(obj));
++ break;
++
++ case json_type_int:
++ lua_pushinteger(L, json_object_get_int(obj));
++ break;
++
++ case json_type_double:
++ lua_pushnumber(L, json_object_get_double(obj));
++ break;
++
++ case json_type_string:
++ lua_pushstring(L, json_object_get_string(obj));
++ break;
++
++ case json_type_null:
++ lua_pushnil(L);
++ break;
++ }
++}
++
++static int json_parse_get(lua_State *L)
++{
++ struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER);
++
++ if (!s->obj || s->err)
++ lua_pushnil(L);
++ else
++ _json_to_lua(L, s->obj);
++
++ return 1;
++}
++
++static int _lua_test_array(lua_State *L, int index)
++{
++ int max = 0;
++ lua_Number idx;
++
++ lua_pushnil(L);
++
++ /* check for non-integer keys */
++ while (lua_next(L, index))
++ {
++ if (lua_type(L, -2) != LUA_TNUMBER)
++ goto out;
++
++ idx = lua_tonumber(L, -2);
++
++ if (idx != (lua_Number)(lua_Integer)idx)
++ goto out;
++
++ if (idx <= 0)
++ goto out;
++
++ if (idx > max)
++ max = idx;
++
++ lua_pop(L, 1);
++ continue;
++
++out:
++ lua_pop(L, 2);
++ return -1;
++ }
++
++ /* check for holes */
++ //for (i = 1; i <= max; i++)
++ //{
++ // lua_rawgeti(L, index, i);
++ //
++ // if (lua_isnil(L, -1))
++ // {
++ // lua_pop(L, 1);
++ // return 0;
++ // }
++ //
++ // lua_pop(L, 1);
++ //}
++
++ return max;
++}
++
++static struct json_object * _lua_to_json(lua_State *L, int index)
++{
++ lua_Number nd, ni;
++ struct json_object *obj;
++ const char *key;
++ int i, max;
++
++ switch (lua_type(L, index))
++ {
++ case LUA_TTABLE:
++ max = _lua_test_array(L, index);
++
++ if (max >= 0)
++ {
++ obj = json_object_new_array();
++
++ if (!obj)
++ return NULL;
++
++ for (i = 1; i <= max; i++)
++ {
++ lua_rawgeti(L, index, i);
++
++ json_object_array_put_idx(obj, i - 1,
++ _lua_to_json(L, lua_gettop(L)));
++
++ lua_pop(L, 1);
++ }
++
++ return obj;
++ }
++
++ obj = json_object_new_object();
++
++ if (!obj)
++ return NULL;
++
++ lua_pushnil(L);
++
++ while (lua_next(L, index))
++ {
++ lua_pushvalue(L, -2);
++ key = lua_tostring(L, -1);
++
++ if (key)
++ json_object_object_add(obj, key,
++ _lua_to_json(L, lua_gettop(L) - 1));
++
++ lua_pop(L, 2);
++ }
++
++ return obj;
++
++ case LUA_TNIL:
++ return NULL;
++
++ case LUA_TBOOLEAN:
++ return json_object_new_boolean(lua_toboolean(L, index));
++
++ case LUA_TNUMBER:
++ nd = lua_tonumber(L, index);
++ ni = lua_tointeger(L, index);
++
++ if (nd == ni)
++ return json_object_new_int(nd);
++
++ return json_object_new_double(nd);
++
++ case LUA_TSTRING:
++ return json_object_new_string(lua_tostring(L, index));
++ }
++
++ return NULL;
++}
++
++static int json_parse_set(lua_State *L)
++{
++ struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER);
++
++ s->err = 0;
++ s->obj = _lua_to_json(L, 2);
++
++ return 0;
++}
++
++static int json_tostring(lua_State *L)
++{
++ struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER);
++ bool pretty = lua_toboolean(L, 2);
++ int flags = 0;
++
++ if (pretty)
++ flags |= JSON_C_TO_STRING_PRETTY | JSON_C_TO_STRING_SPACED;
++
++ lua_pushstring(L, json_object_to_json_string_ext(s->obj, flags));
++ return 1;
++}
++
++static int json_gc(lua_State *L)
++{
++ struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER);
++
++ if (s->obj)
++ json_object_put(s->obj);
++
++ if (s->tok)
++ json_tokener_free(s->tok);
++
++ return 0;
++}
++
++
++static const luaL_reg jsonc_methods[] = {
++ { "new", json_new },
++ { "parse", json_parse },
++ { "stringify", json_stringify },
++
++ { }
++};
++
++static const luaL_reg jsonc_parser_methods[] = {
++ { "parse", json_parse_chunk },
++ { "get", json_parse_get },
++ { "set", json_parse_set },
++ { "stringify", json_tostring },
++
++ { "__gc", json_gc },
++ { "__tostring", json_tostring },
++
++ { }
++};
++
++
++int luaopen_luci_jsonc(lua_State *L)
++{
++ luaL_register(L, LUCI_JSONC, jsonc_methods);
++
++ luaL_newmetatable(L, LUCI_JSONC_PARSER);
++ luaL_register(L, NULL, jsonc_parser_methods);
++ lua_pushvalue(L, -1);
++ lua_setfield(L, -2, "__index");
++ lua_pop(L, 1);
++
++ return 1;
++}
+diff --git a/feeds/luci/libs/luci-lib-jsonc/src/jsonc.luadoc b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.luadoc
+new file mode 100644
+index 0000000..2ee9ceb
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.luadoc
+@@ -0,0 +1,134 @@
++--- LuCI JSON parsing and serialization library.
++-- The luci.jsonc class is a high level Lua binding to the JSON-C library to
++-- allow reading and writing JSON data with minimal overhead.
++module "luci.jsonc"
++
++---[[
++Construct a new luci.jsonc.parser instance.
++@class function
++@sort 1
++@name new
++@return A `luci.jsonc.parser` object representing a JSON-C tokener.
++@usage `parser = luci.jsonc.new()`
++]]
++
++---[[
++Parse a complete JSON string and convert it into a Lua data structure.
++@class function
++@sort 2
++@name parse
++@param json A string containing the JSON data to parse, must be either a
++ JSON array or a JSON object.
++@return On success, a table containing the parsed JSON data is returned, on
++ failure the function returns `nil` and a string containing the reason of
++ the parse error.
++@usage `data = luci.jsonc.parse('{ "name": "John", "age": 34 }')
++print(data.name) -- "John"`
++@see stringify
++]]
++
++---[[
++Convert given Lua data into a JSON string.
++
++This function recursively converts the given Lua data into a JSON string,
++ignoring any unsupported data. Lua tables are converted into JSON arrays if they
++only contain integer keys, mixed tables are turned into JSON objects with any
++existing numeric keys converted into strings.
++
++Lua functions, coroutines and userdata objects are ignored and Lua numbers are
++converted to integers if they do not contain fractional values.
++
++@class function
++@sort 3
++@name stringify
++@param data The Lua data to convert, can be a table, string, boolean or number.
++@param pretty A boolean value indicating whether the resulting JSON should be
++ pretty printed.
++@return Returns a string containing the JSON representation of the given Lua
++ data.
++@usage `json = luci.jsonc.stringify({ item = true, values = { 1, 2, 3 } })
++print(json) -- '{"item":true,"values":[1,2,3]}'`
++@see parse
++]]
++
++
++--- LuCI JSON parser instance.
++-- A JSON parser instance is useful to parse JSON data chunk by chunk, without
++-- the need to assemble all data in advance.
++-- @cstyle instance
++module "luci.jsonc.parser"
++
++---[[
++Parses one chunk of JSON data.
++
++@class function
++@sort 1
++@name parser.parse
++@see parser.get
++@param json String containing the JSON fragment to parse
++@return <ul>
++ <li>`true` if a complete JSON object has been parsed and no further input is
++ expected.</li>
++ <li>`false` if further input is required</li>
++ <li>`nil` if an error was encountered while parsing the current chunk.
++ In this case a string describing the parse error is returned as second
++ value.</li></ul>
++@usage `parser = luci.jsonc.new()
++
++while true do
++ chunk = ... -- fetch a cunk of data, e.g. from a socket
++ finish, errmsg = <b>parser.parse(chunk)</b>
++
++ if finish == nil then
++ error("Cannot parse JSON: " .. errmsg)
++ end
++
++ if finish == true then
++ break
++ end
++end`
++]]
++
++---[[
++Convert parsed JSON data into Lua table.
++
++@class function
++@sort 2
++@name parser.get
++@see parser.parse
++@return Parsed JSON object converted into a Lua table or `nil` if the parser
++ didn't finish or encountered an error.
++@usage `parser = luci.jsonc.new()
++parser:parse('{ "example": "test" }')
++
++data = parser:get()
++print(data.example) -- "test"`
++]]
++
++---[[
++Put Lua data into the parser.
++
++@class function
++@sort 3
++@name parser.set
++@see parser.stringify
++@param data Lua data to put into the parser object. The data is converted to an
++ internal JSON representation that can be dumped with `stringify()`.
++ The conversion follows the rules described in `luci.jsonc.stringify`.
++@return Nothing is returned.
++@usage `parser = luci.jsonc.new()
++parser:set({ "some", "data" })`
++]]
++
++---[[
++Serialize current parser state as JSON.
++
++@class function
++@sort 4
++@name parser.stringify
++@param pretty A boolean value indicating whether the resulting JSON should be pretty printed.
++@return Returns the serialized JSON data of this parser instance.
++@usage `parser = luci.jsonc.new()
++parser:parse('{ "example": "test" }')
++print(parser:serialize()) -- '{"example":"test"}'`
++]]
+diff --git a/feeds/luci/libs/luci-lib-luaneightbl/Makefile b/feeds/luci/libs/luci-lib-luaneightbl/Makefile
+new file mode 100644
+index 0000000..f0185b8
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-luaneightbl/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=neightbl - Lua lib for IPv6 neighbors
++LUCI_DEPENDS:=+liblua
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/libs/luci-lib-luaneightbl/src/Makefile b/feeds/luci/libs/luci-lib-luaneightbl/src/Makefile
+new file mode 100644
+index 0000000..f856d2f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-luaneightbl/src/Makefile
+@@ -0,0 +1,17 @@
++NEIGHTBL_CFLAGS = -std=gnu99
++NEIGHTBL_LDFLAGS = -llua -lm
++NEIGHTBL_OBJ = neightbl.o
++NEIGHTBL_LIB = neightbl.so
++
++%.o: %.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(LUA_CFLAGS) $(NEIGHTBL_CFLAGS) $(FPIC) -c -o $@ $<
++
++compile: $(NEIGHTBL_OBJ)
++ $(CC) $(LDFLAGS) -shared -o $(NEIGHTBL_LIB) $(NEIGHTBL_OBJ) $(NEIGHTBL_LDFLAGS)
++
++install: compile
++ mkdir -p $(DESTDIR)/usr/lib/lua
++ cp $(NEIGHTBL_LIB) $(DESTDIR)/usr/lib/lua/$(NEIGHTBL_LIB)
++
++clean:
++ rm -f *.o *.so
+diff --git a/feeds/luci/libs/luci-lib-luaneightbl/src/neightbl.c b/feeds/luci/libs/luci-lib-luaneightbl/src/neightbl.c
+new file mode 100644
+index 0000000..987ec5e
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-luaneightbl/src/neightbl.c
+@@ -0,0 +1,122 @@
++/*
++License:
++Copyright 2013 Steven Barth <steven@midlink.org>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Unless required by applicable law or agreed to in writing, software
++distributed under the License is distributed on an "AS IS" BASIS,
++WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++See the License for the specific language governing permissions and
++limitations under the License.
++*/
++
++#include <stdlib.h>
++#include <stdbool.h>
++#include <lua.h>
++#include <lualib.h>
++#include <lauxlib.h>
++#include <linux/rtnetlink.h>
++#include <sys/socket.h>
++#include <errno.h>
++#include <unistd.h>
++#include <string.h>
++#include <net/if.h>
++#include <arpa/inet.h>
++#include <netinet/ether.h>
++
++char *ether_ntoa_l (const struct ether_addr *addr, char *buf)
++{
++ sprintf (buf, "%02x:%02x:%02x:%02x:%02x:%02x",
++ addr->ether_addr_octet[0], addr->ether_addr_octet[1],
++ addr->ether_addr_octet[2], addr->ether_addr_octet[3],
++ addr->ether_addr_octet[4], addr->ether_addr_octet[5]);
++ return buf;
++}
++
++static int neightbl_get(lua_State *L) {
++ int sock = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE);
++ struct sockaddr_nl kernel = {AF_NETLINK, 0, 0, 0};
++ if (connect(sock, (struct sockaddr*)&kernel, sizeof(kernel)))
++ goto error;
++
++ const char *ifname = luaL_checkstring(L, 1);
++ int ifindex = if_nametoindex(ifname);
++ if (ifindex <= 0)
++ goto error;
++
++ struct {
++ struct nlmsghdr hdr;
++ struct ndmsg ndm;
++ } req = {
++ {sizeof(req), RTM_GETNEIGH, NLM_F_REQUEST | NLM_F_DUMP, 1, 0},
++ {AF_INET6, 0, 0, ifindex, 0, 0, 0},
++ };
++
++ if (send(sock, &req, sizeof(req), 0) != sizeof(req))
++ goto error;
++
++ lua_newtable(L);
++
++ char buf[8192];
++ struct nlmsghdr *nh = (struct nlmsghdr*)buf;
++ do {
++ ssize_t len = recv(sock, buf, sizeof(buf), 0);
++ if (len < 0) {
++ lua_pop(L, 1);
++ goto error;
++ }
++
++
++ for (;NLMSG_OK(nh, (size_t)len) && nh->nlmsg_type == RTM_NEWNEIGH;
++ nh = NLMSG_NEXT(nh, len)) {
++ struct ndmsg *ndm = NLMSG_DATA(nh);
++ if (NLMSG_PAYLOAD(nh, 0) < sizeof(*ndm) || ndm->ndm_ifindex != ifindex)
++ continue;
++
++ ssize_t alen = NLMSG_PAYLOAD(nh, sizeof(*ndm));
++ char buf[INET6_ADDRSTRLEN] = {0}, *mac = NULL, str_buf[ETH_ALEN];
++ for (struct rtattr *rta = (struct rtattr*)&ndm[1]; RTA_OK(rta, alen);
++ rta = RTA_NEXT(rta, alen)) {
++ if (rta->rta_type == NDA_DST && RTA_PAYLOAD(rta) >= sizeof(struct in6_addr))
++ inet_ntop(AF_INET6, RTA_DATA(rta), buf, sizeof(buf));
++ else if (rta->rta_type == NDA_LLADDR && RTA_PAYLOAD(rta) >= 6)
++ mac = ether_ntoa_l(RTA_DATA(rta),str_buf);
++ }
++
++ if (mac)
++ lua_pushstring(L, mac);
++ else
++ lua_pushboolean(L, false);
++
++ lua_setfield(L, -2, buf);
++ }
++ } while (nh->nlmsg_type == RTM_NEWNEIGH);
++
++ close(sock);
++ return 1;
++
++error:
++ close(sock);
++ lua_pushnil(L);
++ lua_pushinteger(L, errno);
++ lua_pushstring(L, strerror(errno));
++ return 3;
++}
++
++
++static const luaL_reg R[] = {
++ {"get", neightbl_get},
++ {NULL, NULL}
++};
++
++
++int luaopen_neightbl(lua_State *l)
++{
++ luaL_register(l, "neightbl", R);
++ return 1;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/.gitignore b/feeds/luci/libs/luci-lib-nixio/.gitignore
+new file mode 100644
+index 0000000..a21f2a2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/.gitignore
+@@ -0,0 +1,11 @@
++src/libaxtls.a
++.depend
++.config.*
++_stage
++conf
++lex.zconf.c
++lkc_defs.h
++mconf
++zconf.tab.h
++zconf.tab.c
++src/nixio.dll
+diff --git a/feeds/luci/libs/luci-lib-nixio/LICENSE b/feeds/luci/libs/luci-lib-nixio/LICENSE
+new file mode 100644
+index 0000000..f49a4e1
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/LICENSE
+@@ -0,0 +1,201 @@
++ Apache License
++ Version 2.0, January 2004
++ http://www.apache.org/licenses/
++
++ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
++
++ 1. Definitions.
++
++ "License" shall mean the terms and conditions for use, reproduction,
++ and distribution as defined by Sections 1 through 9 of this document.
++
++ "Licensor" shall mean the copyright owner or entity authorized by
++ the copyright owner that is granting the License.
++
++ "Legal Entity" shall mean the union of the acting entity and all
++ other entities that control, are controlled by, or are under common
++ control with that entity. For the purposes of this definition,
++ "control" means (i) the power, direct or indirect, to cause the
++ direction or management of such entity, whether by contract or
++ otherwise, or (ii) ownership of fifty percent (50%) or more of the
++ outstanding shares, or (iii) beneficial ownership of such entity.
++
++ "You" (or "Your") shall mean an individual or Legal Entity
++ exercising permissions granted by this License.
++
++ "Source" form shall mean the preferred form for making modifications,
++ including but not limited to software source code, documentation
++ source, and configuration files.
++
++ "Object" form shall mean any form resulting from mechanical
++ transformation or translation of a Source form, including but
++ not limited to compiled object code, generated documentation,
++ and conversions to other media types.
++
++ "Work" shall mean the work of authorship, whether in Source or
++ Object form, made available under the License, as indicated by a
++ copyright notice that is included in or attached to the work
++ (an example is provided in the Appendix below).
++
++ "Derivative Works" shall mean any work, whether in Source or Object
++ form, that is based on (or derived from) the Work and for which the
++ editorial revisions, annotations, elaborations, or other modifications
++ represent, as a whole, an original work of authorship. For the purposes
++ of this License, Derivative Works shall not include works that remain
++ separable from, or merely link (or bind by name) to the interfaces of,
++ the Work and Derivative Works thereof.
++
++ "Contribution" shall mean any work of authorship, including
++ the original version of the Work and any modifications or additions
++ to that Work or Derivative Works thereof, that is intentionally
++ submitted to Licensor for inclusion in the Work by the copyright owner
++ or by an individual or Legal Entity authorized to submit on behalf of
++ the copyright owner. For the purposes of this definition, "submitted"
++ means any form of electronic, verbal, or written communication sent
++ to the Licensor or its representatives, including but not limited to
++ communication on electronic mailing lists, source code control systems,
++ and issue tracking systems that are managed by, or on behalf of, the
++ Licensor for the purpose of discussing and improving the Work, but
++ excluding communication that is conspicuously marked or otherwise
++ designated in writing by the copyright owner as "Not a Contribution."
++
++ "Contributor" shall mean Licensor and any individual or Legal Entity
++ on behalf of whom a Contribution has been received by Licensor and
++ subsequently incorporated within the Work.
++
++ 2. Grant of Copyright License. Subject to the terms and conditions of
++ this License, each Contributor hereby grants to You a perpetual,
++ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++ copyright license to reproduce, prepare Derivative Works of,
++ publicly display, publicly perform, sublicense, and distribute the
++ Work and such Derivative Works in Source or Object form.
++
++ 3. Grant of Patent License. Subject to the terms and conditions of
++ this License, each Contributor hereby grants to You a perpetual,
++ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++ (except as stated in this section) patent license to make, have made,
++ use, offer to sell, sell, import, and otherwise transfer the Work,
++ where such license applies only to those patent claims licensable
++ by such Contributor that are necessarily infringed by their
++ Contribution(s) alone or by combination of their Contribution(s)
++ with the Work to which such Contribution(s) was submitted. If You
++ institute patent litigation against any entity (including a
++ cross-claim or counterclaim in a lawsuit) alleging that the Work
++ or a Contribution incorporated within the Work constitutes direct
++ or contributory patent infringement, then any patent licenses
++ granted to You under this License for that Work shall terminate
++ as of the date such litigation is filed.
++
++ 4. Redistribution. You may reproduce and distribute copies of the
++ Work or Derivative Works thereof in any medium, with or without
++ modifications, and in Source or Object form, provided that You
++ meet the following conditions:
++
++ (a) You must give any other recipients of the Work or
++ Derivative Works a copy of this License; and
++
++ (b) You must cause any modified files to carry prominent notices
++ stating that You changed the files; and
++
++ (c) You must retain, in the Source form of any Derivative Works
++ that You distribute, all copyright, patent, trademark, and
++ attribution notices from the Source form of the Work,
++ excluding those notices that do not pertain to any part of
++ the Derivative Works; and
++
++ (d) If the Work includes a "NOTICE" text file as part of its
++ distribution, then any Derivative Works that You distribute must
++ include a readable copy of the attribution notices contained
++ within such NOTICE file, excluding those notices that do not
++ pertain to any part of the Derivative Works, in at least one
++ of the following places: within a NOTICE text file distributed
++ as part of the Derivative Works; within the Source form or
++ documentation, if provided along with the Derivative Works; or,
++ within a display generated by the Derivative Works, if and
++ wherever such third-party notices normally appear. The contents
++ of the NOTICE file are for informational purposes only and
++ do not modify the License. You may add Your own attribution
++ notices within Derivative Works that You distribute, alongside
++ or as an addendum to the NOTICE text from the Work, provided
++ that such additional attribution notices cannot be construed
++ as modifying the License.
++
++ You may add Your own copyright statement to Your modifications and
++ may provide additional or different license terms and conditions
++ for use, reproduction, or distribution of Your modifications, or
++ for any such Derivative Works as a whole, provided Your use,
++ reproduction, and distribution of the Work otherwise complies with
++ the conditions stated in this License.
++
++ 5. Submission of Contributions. Unless You explicitly state otherwise,
++ any Contribution intentionally submitted for inclusion in the Work
++ by You to the Licensor shall be under the terms and conditions of
++ this License, without any additional terms or conditions.
++ Notwithstanding the above, nothing herein shall supersede or modify
++ the terms of any separate license agreement you may have executed
++ with Licensor regarding such Contributions.
++
++ 6. Trademarks. This License does not grant permission to use the trade
++ names, trademarks, service marks, or product names of the Licensor,
++ except as required for reasonable and customary use in describing the
++ origin of the Work and reproducing the content of the NOTICE file.
++
++ 7. Disclaimer of Warranty. Unless required by applicable law or
++ agreed to in writing, Licensor provides the Work (and each
++ Contributor provides its Contributions) on an "AS IS" BASIS,
++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
++ implied, including, without limitation, any warranties or conditions
++ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
++ PARTICULAR PURPOSE. You are solely responsible for determining the
++ appropriateness of using or redistributing the Work and assume any
++ risks associated with Your exercise of permissions under this License.
++
++ 8. Limitation of Liability. In no event and under no legal theory,
++ whether in tort (including negligence), contract, or otherwise,
++ unless required by applicable law (such as deliberate and grossly
++ negligent acts) or agreed to in writing, shall any Contributor be
++ liable to You for damages, including any direct, indirect, special,
++ incidental, or consequential damages of any character arising as a
++ result of this License or out of the use or inability to use the
++ Work (including but not limited to damages for loss of goodwill,
++ work stoppage, computer failure or malfunction, or any and all
++ other commercial damages or losses), even if such Contributor
++ has been advised of the possibility of such damages.
++
++ 9. Accepting Warranty or Additional Liability. While redistributing
++ the Work or Derivative Works thereof, You may choose to offer,
++ and charge a fee for, acceptance of support, warranty, indemnity,
++ or other liability obligations and/or rights consistent with this
++ License. However, in accepting such obligations, You may act only
++ on Your own behalf and on Your sole responsibility, not on behalf
++ of any other Contributor, and only if You agree to indemnify,
++ defend, and hold each Contributor harmless for any liability
++ incurred by, or claims asserted against, such Contributor by reason
++ of your accepting any such warranty or additional liability.
++
++ END OF TERMS AND CONDITIONS
++
++ APPENDIX: How to apply the Apache License to your work.
++
++ To apply the Apache License to your work, attach the following
++ boilerplate notice, with the fields enclosed by brackets "[]"
++ replaced with your own identifying information. (Don't include
++ the brackets!) The text should be enclosed in the appropriate
++ comment syntax for the file format. We also recommend that a
++ file or class name and description of purpose be included on the
++ same "printed page" as the copyright notice for easier
++ identification within third-party archives.
++
++ Copyright [yyyy] [name of copyright owner]
++
++ Licensed under the Apache License, Version 2.0 (the "License");
++ you may not use this file except in compliance with the License.
++ You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++ Unless required by applicable law or agreed to in writing, software
++ distributed under the License is distributed on an "AS IS" BASIS,
++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ See the License for the specific language governing permissions and
++ limitations under the License.
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/Makefile b/feeds/luci/libs/luci-lib-nixio/Makefile
+new file mode 100644
+index 0000000..41800fe
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=NIXIO POSIX library
++LUCI_DEPENDS:=+PACKAGE_luci-lib-nixio_openssl:libopenssl +PACKAGE_luci-lib-nixio_cyassl:libcyassl +liblua
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/libs/luci-lib-nixio/NOTICE b/feeds/luci/libs/luci-lib-nixio/NOTICE
+new file mode 100644
+index 0000000..96d1192
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/NOTICE
+@@ -0,0 +1,10 @@
++nixio - Linux I/O library for lua
++Copyright 2009 Steven Barth <steven@midlink.org>
++Licensed under the Apache License, Version 2.0.
++
++Contains code from:
++axTLS - Copyright 2008 Cameron Rich
++
++Thanks for testing, feedback and code snippets:
++John Crispin <blogic@openwrt.org>
++Jo-Philipp Wich <jow@openwrt.org>
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/README b/feeds/luci/libs/luci-lib-nixio/README
+new file mode 100644
+index 0000000..ba9b36b
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/README
+@@ -0,0 +1,13 @@
++Building:
++ Use GNU Make.
++ make or gmake depending on your system.
++
++ Special make flags:
++
++ OS Override Target OS [Linux|FreeBSD|SunOS|Windows]
++ NIXIO_TLS TLS-Library [*openssl|axtls]
++ NIXIO_CROSS_CC MinGW CC (Windows) `which i586-mingw32msvc-cc`
++ LUA_CFLAGS Lua CFLAGS `pkg-config --cflags lua5.1`
++ LUA_TARGET Lua compile target [*source|strip|compile]
++ LUA_MODULEDIR Install LUA_PATH "/usr/share/lua/5.1"
++ LUA_LIBRARYDIR Install LUA_CPATH "/usr/lib/lua/5.1"
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/Makefile
+new file mode 100644
+index 0000000..02c33d2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/Makefile
+@@ -0,0 +1,181 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++-include config/.config
++
++ifneq ($(strip $(HAVE_DOT_CONFIG)),y)
++all: menuconfig
++else
++all: target
++endif
++
++include config/makefile.conf
++
++target : $(STAGE) $(TARGET)
++
++# VERSION has to come from the command line
++RELEASE=axTLS-$(VERSION)
++
++# standard version
++target:
++ $(MAKE) -C crypto
++ $(MAKE) -C ssl
++ifdef CONFIG_AXHTTPD
++ $(MAKE) -C httpd
++endif
++ifdef CONFIG_BINDINGS
++ $(MAKE) -C bindings
++endif
++ifdef CONFIG_SAMPLES
++ $(MAKE) -C samples
++endif
++
++$(STAGE) : ssl/version.h
++ @mkdir -p $(STAGE)
++
++# create a version file with something in it.
++ssl/version.h:
++ @echo "#define AXTLS_VERSION \"(no version)\"" > ssl/version.h
++
++$(PREFIX) :
++ @mkdir -p $(PREFIX)/lib
++ @mkdir -p $(PREFIX)/bin
++
++release:
++ $(MAKE) -C config/scripts/config clean
++ -$(MAKE) clean
++ -@rm config/*.msi config/*.back.aip config/config.h config/.config*
++ -@rm www/index.20*
++ -@rm -fr $(STAGE)
++ @echo "#define AXTLS_VERSION \"$(VERSION)\"" > ssl/version.h
++ cd ../; tar cvfz $(RELEASE).tar.gz --wildcards-match-slash --exclude .svn axTLS; cd -;
++
++docs:
++ $(MAKE) -C docsrc doco
++
++# build the Win32 demo release version
++win32_demo:
++ @echo "#define AXTLS_VERSION \"$(VERSION)\"" > ssl/version.h
++ $(MAKE) win32releaseconf
++
++install: $(PREFIX) all
++ cp --no-dereference $(STAGE)/libax* $(PREFIX)/lib
++ chmod 755 $(PREFIX)/lib/libax*
++ifdef CONFIG_SAMPLES
++ install -m 755 $(STAGE)/ax* $(PREFIX)/bin
++endif
++ifdef CONFIG_HTTP_HAS_AUTHORIZATION
++ install -m 755 $(STAGE)/htpasswd $(PREFIX)/bin
++endif
++ifdef CONFIG_PLATFORM_CYGWIN
++ install -m 755 $(STAGE)/cygaxtls.dll $(PREFIX)/bin
++endif
++ifdef CONFIG_PERL_BINDINGS
++ install -m 755 $(STAGE)/axtlsp.pm `perl -e 'use Config; print $$Config{installarchlib};'`
++endif
++ @mkdir -p -m 755 $(PREFIX)/include/axTLS
++ install -m 644 crypto/*.h $(PREFIX)/include/axTLS
++ install -m 644 ssl/*.h $(PREFIX)/include/axTLS
++ -rm $(PREFIX)/include/axTLS/cert.h
++ -rm $(PREFIX)/include/axTLS/private_key.h
++ install -m 644 config/config.h $(PREFIX)/include/axTLS
++
++installclean:
++ -@rm $(PREFIX)/lib/libax* > /dev/null 2>&1
++ -@rm $(PREFIX)/bin/ax* > /dev/null 2>&1
++ -@rm $(PREFIX)/bin/axhttpd* > /dev/null 2>&1
++ -@rm `perl -e 'use Config; print $$Config{installarchlib};'`/axtlsp.pm > /dev/null 2>&1
++
++test:
++ cd $(STAGE); ssltest; ../ssl/test/test_axssl.sh; cd -;
++
++# tidy up things
++clean::
++ @cd crypto; $(MAKE) clean
++ @cd ssl; $(MAKE) clean
++ @cd httpd; $(MAKE) clean
++ @cd samples; $(MAKE) clean
++ @cd docsrc; $(MAKE) clean
++ @cd bindings; $(MAKE) clean
++
++# ---------------------------------------------------------------------------
++# mconf stuff
++# ---------------------------------------------------------------------------
++
++CONFIG_CONFIG_IN = config/Config.in
++CONFIG_DEFCONFIG = config/defconfig
++
++config/scripts/config/conf: config/scripts/config/Makefile
++ $(MAKE) -C config/scripts/config conf
++ -@if [ ! -f config/.config ] ; then \
++ cp $(CONFIG_DEFCONFIG) config/.config; \
++ fi
++
++config/scripts/config/mconf: config/scripts/config/Makefile
++ $(MAKE) -C config/scripts/config ncurses conf mconf
++ -@if [ ! -f config/.config ] ; then \
++ cp $(CONFIG_DEFCONFIG) .config; \
++ fi
++
++cleanconf:
++ $(MAKE) -C config/scripts/config clean
++ @rm -f config/.config
++
++menuconfig: config/scripts/config/mconf
++ @./config/scripts/config/mconf $(CONFIG_CONFIG_IN)
++
++config: config/scripts/config/conf
++ @./config/scripts/config/conf $(CONFIG_CONFIG_IN)
++
++oldconfig: config/scripts/config/conf
++ @./config/scripts/config/conf -o $(CONFIG_CONFIG_IN)
++
++default: config/scripts/config/conf
++ @./config/scripts/config/conf -d $(CONFIG_CONFIG_IN) > /dev/null
++ $(MAKE)
++
++randconfig: config/scripts/config/conf
++ @./config/scripts/config/conf -r $(CONFIG_CONFIG_IN)
++
++allnoconfig: config/scripts/config/conf
++ @./config/scripts/config/conf -n $(CONFIG_CONFIG_IN)
++
++allyesconfig: config/scripts/config/conf
++ @./config/scripts/config/conf -y $(CONFIG_CONFIG_IN)
++
++# The special win32 release configuration
++win32releaseconf: config/scripts/config/conf
++ @./config/scripts/config/conf -D config/win32config $(CONFIG_CONFIG_IN) > /dev/null
++ $(MAKE)
++
++# The special linux release configuration
++linuxconf: config/scripts/config/conf
++ @./config/scripts/config/conf -D config/linuxconfig $(CONFIG_CONFIG_IN) > /dev/null
++ $(MAKE)
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/README b/feeds/luci/libs/luci-lib-nixio/axTLS/README
+new file mode 100644
+index 0000000..c8926d9
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/README
+@@ -0,0 +1,3 @@
++
++See www/index.html for the README, CHANGELOG, LICENSE and other notes.
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Config.in b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Config.in
+new file mode 100644
+index 0000000..12a696b
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Config.in
+@@ -0,0 +1,105 @@
++#
++# For a description of the syntax of this configuration file,
++# see scripts/config/Kconfig-language.txt
++#
++menu "Language Bindings"
++
++config CONFIG_BINDINGS
++ bool "Create language bindings"
++ default n
++ help
++ axTLS supports language bindings in C#, VB.NET, Java and Perl.
++
++ Select Y here if you want to build the various language bindings.
++
++config CONFIG_CSHARP_BINDINGS
++ bool "Create C# bindings"
++ default n
++ depends on CONFIG_BINDINGS
++ help
++ Build C# bindings.
++
++ This requires .NET to be installed on Win32 platforms and mono to be
++ installed on all other platforms.
++
++config CONFIG_VBNET_BINDINGS
++ bool "Create VB.NET bindings"
++ default n
++ depends on CONFIG_BINDINGS
++ help
++ Build VB.NET bindings.
++
++ This requires the .NET to be installed and is only built under Win32
++ platforms.
++
++menu ".Net Framework"
++depends on CONFIG_CSHARP_BINDINGS || CONFIG_VBNET_BINDINGS
++config CONFIG_DOT_NET_FRAMEWORK_BASE
++ string "Location of .NET Framework"
++ default "c:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727"
++endmenu
++
++config CONFIG_JAVA_BINDINGS
++ bool "Create Java bindings"
++ default n
++ depends on CONFIG_BINDINGS
++ help
++ Build Java bindings.
++
++ Current Issues (see README):
++ * Needs Java 1.4 or better.
++ * If building under Win32 it will use the Win32 JDK.
++
++menu "Java Home"
++depends on CONFIG_JAVA_BINDINGS
++config CONFIG_JAVA_HOME
++ string "Location of JDK"
++ default "c:\\Program Files\\Java\\jdk1.5.0_06" if CONFIG_PLATFORM_WIN32 || CONFIG_PLATFORM_CYGWIN
++ default "/usr/local/jdk142" if !CONFIG_PLATFORM_WIN32 && !CONFIG_PLATFORM_CYGWIN
++ depends on CONFIG_JAVA_BINDINGS
++ help
++ The location of Sun's JDK.
++endmenu
++
++config CONFIG_PERL_BINDINGS
++ bool "Create Perl bindings"
++ default n
++ depends on CONFIG_BINDINGS
++ help
++ Build Perl bindings.
++
++ Current Issues (see README):
++ * 64 bit versions don't work at present.
++ * libperl.so needs to be in the shared library path.
++
++menu "Perl Home"
++depends on CONFIG_PERL_BINDINGS && CONFIG_PLATFORM_WIN32
++config CONFIG_PERL_CORE
++ string "Location of Perl CORE"
++ default "c:\\perl\\lib\\CORE"
++ help:
++ works with ActiveState
++ "http://www.activestate.com/Products/ActivePerl"
++
++config CONFIG_PERL_LIB
++ string "Name of Perl Library"
++ default "perl58.lib"
++endmenu
++
++config CONFIG_LUA_BINDINGS
++ bool "Create Lua bindings"
++ default n
++ depends on CONFIG_BINDINGS && !CONFIG_PLATFORM_WIN32
++ help
++ Build Lua bindings (see www.lua.org).
++
++menu "Lua Home"
++depends on CONFIG_LUA_BINDINGS
++config CONFIG_LUA_CORE
++ string "Location of Lua CORE"
++ default "/usr/local"
++ help:
++ If the Lua exists on another directory then this needs to be changed
++endmenu
++
++endmenu
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Makefile
+new file mode 100644
+index 0000000..7654fbb
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Makefile
+@@ -0,0 +1,86 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++all:
++
++include ../config/.config
++include ../config/makefile.conf
++
++ifdef CONFIG_CSHARP_BINDINGS
++all: csharp/axInterface.cs
++endif
++
++ifdef CONFIG_VBNET_BINDINGS
++all: vbnet/axInterface.vb
++endif
++
++ifdef CONFIG_JAVA_BINDINGS
++all: java/axtlsj.java
++endif
++
++ifdef CONFIG_PERL_BINDINGS
++all: perl/axTLSp_wrap.c
++endif
++
++ifdef CONFIG_LUA_BINDINGS
++all: lua/axTLSl_wrap.c
++endif
++
++csharp/axInterface.cs: ../ssl/ssl.h
++ @perl ./generate_interface.pl -csharp
++
++vbnet/axInterface.vb: ../ssl/ssl.h
++ @perl ./generate_interface.pl -vbnet
++
++java/axTLSj.i: ../ssl/ssl.h
++ @perl ./generate_SWIG_interface.pl -java
++
++java/axtlsj.java: java/axTLSj.i $(wildcard java/SSL*.java)
++ @cd java; swig -java -package axTLSj axTLSj.i; $(MAKE)
++
++perl/axTLSp.i: ../ssl/ssl.h
++ @perl ./generate_SWIG_interface.pl -perl
++
++perl/axTLSp_wrap.c: perl/axTLSp.i
++ @cd perl; swig -perl5 axTLSp.i; $(MAKE)
++
++lua/axTLSl.i: ../ssl/ssl.h
++ @perl ./generate_SWIG_interface.pl -lua
++
++lua/axTLSl_wrap.c: lua/axTLSl.i
++ @cd lua; swig -lua axTLSl.i; $(MAKE)
++
++clean::
++ $(MAKE) -C csharp clean
++ $(MAKE) -C vbnet clean
++ $(MAKE) -C java clean
++ $(MAKE) -C perl clean
++ $(MAKE) -C lua clean
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/README b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/README
+new file mode 100644
+index 0000000..8bc3109
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/README
+@@ -0,0 +1,43 @@
++===============================================================================
++= Language Bindings =
++===============================================================================
++
++The tools to generate the various language bindings are done here.
++SWIG 1.3.24 or better is required for creating the Java and Perl bindings.
++
++Perl scripts are used to parse ssl.h and automagically give the appropriate
++bindings.
++
++At present, the four languages supported are:
++
++* C#
++* VB.NET
++* Java
++* Perl
++
++To generate each binding run the following:
++
++C#:
++> generate_interface.pl -csharp
++
++VB.NET:
++> generate_interface.pl -vbnet
++
++
++Java:
++> generate_SWIG_interface.pl -java
++> cd java; swig -java -package axTLSj -noextern axTLSj.i
++
++Perl:
++> generate_SWIG_interface.pl -perl
++> cd perl; swig -noextern -perl axTLSp.i
++
++Java and Perl both create a library each called libaxtlsj.so and libaxtlsp.so
++(or axtlsj.dll and atlsp.dll on Win32 platforms).
++
++Note: the "-noextern" is deprecated in swig 1.3.27 and newer. The "-noextern"
++option was required to get Win32 bindings to work (which is why is has probably
++been deprecated).
++
++Each binding (except for Perl) has an extra helper interface to make life
++easier.
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/Makefile
+new file mode 100644
+index 0000000..3414f85
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/Makefile
+@@ -0,0 +1,35 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++include ../../config/.config
++include ../../config/makefile.conf
++
++clean::
++ @rm -f axssl* axInterface.cs
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/axTLS.cs b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/axTLS.cs
+new file mode 100644
+index 0000000..cf64a25
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/axTLS.cs
+@@ -0,0 +1,491 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * A wrapper around the unmanaged interface to give a semi-decent C# API
++ */
++
++using System;
++using System.Runtime.InteropServices;
++using System.Net.Sockets;
++
++/**
++ * @defgroup csharp_api C# API.
++ *
++ * Ensure that the appropriate Dispose() methods are called when finished with
++ * various objects - otherwise memory leaks will result.
++ * @{
++ */
++namespace axTLS
++{
++ /**
++ * @class SSL
++ * @ingroup csharp_api
++ * @brief A representation of an SSL connection.
++ */
++ public class SSL
++ {
++ public IntPtr m_ssl; /**< A pointer to the real SSL type */
++
++ /**
++ * @brief Store the reference to an SSL context.
++ * @param ip [in] A reference to an SSL object.
++ */
++ public SSL(IntPtr ip)
++ {
++ m_ssl = ip;
++ }
++
++ /**
++ * @brief Free any used resources on this connection.
++ *
++ * A "Close Notify" message is sent on this connection (if possible).
++ * It is up to the application to close the socket.
++ */
++ public void Dispose()
++ {
++ axtls.ssl_free(m_ssl);
++ }
++
++ /**
++ * @brief Return the result of a handshake.
++ * @return SSL_OK if the handshake is complete and ok.
++ * @see ssl.h for the error code list.
++ */
++ public int HandshakeStatus()
++ {
++ return axtls.ssl_handshake_status(m_ssl);
++ }
++
++ /**
++ * @brief Return the SSL cipher id.
++ * @return The cipher id which is one of:
++ * - SSL_AES128_SHA (0x2f)
++ * - SSL_AES256_SHA (0x35)
++ * - SSL_RC4_128_SHA (0x05)
++ * - SSL_RC4_128_MD5 (0x04)
++ */
++ public byte GetCipherId()
++ {
++ return axtls.ssl_get_cipher_id(m_ssl);
++ }
++
++ /**
++ * @brief Get the session id for a handshake.
++ *
++ * This will be a 32 byte sequence and is available after the first
++ * handshaking messages are sent.
++ * @return The session id as a 32 byte sequence.
++ * @note A SSLv23 handshake may have only 16 valid bytes.
++ */
++ public byte[] GetSessionId()
++ {
++ IntPtr ptr = axtls.ssl_get_session_id(m_ssl);
++ byte sess_id_size = axtls.ssl_get_session_id_size(m_ssl);
++ byte[] result = new byte[sess_id_size];
++ Marshal.Copy(ptr, result, 0, sess_id_size);
++ return result;
++ }
++
++ /**
++ * @brief Retrieve an X.509 distinguished name component.
++ *
++ * When a handshake is complete and a certificate has been exchanged,
++ * then the details of the remote certificate can be retrieved.
++ *
++ * This will usually be used by a client to check that the server's
++ * common name matches the URL.
++ *
++ * A full handshake needs to occur for this call to work.
++ *
++ * @param component [in] one of:
++ * - SSL_X509_CERT_COMMON_NAME
++ * - SSL_X509_CERT_ORGANIZATION
++ * - SSL_X509_CERT_ORGANIZATIONAL_NAME
++ * - SSL_X509_CA_CERT_COMMON_NAME
++ * - SSL_X509_CA_CERT_ORGANIZATION
++ * - SSL_X509_CA_CERT_ORGANIZATIONAL_NAME
++ * @return The appropriate string (or null if not defined)
++ */
++ public string GetCertificateDN(int component)
++ {
++ return axtls.ssl_get_cert_dn(m_ssl, component);
++ }
++ }
++
++ /**
++ * @class SSLUtil
++ * @ingroup csharp_api
++ * @brief Some global helper functions.
++ */
++ public class SSLUtil
++ {
++
++ /**
++ * @brief Return the build mode of the axTLS project.
++ * @return The build mode is one of:
++ * - SSL_BUILD_SERVER_ONLY
++ * - SSL_BUILD_ENABLE_VERIFICATION
++ * - SSL_BUILD_ENABLE_CLIENT
++ * - SSL_BUILD_FULL_MODE
++ */
++ public static int BuildMode()
++ {
++ return axtls.ssl_get_config(axtls.SSL_BUILD_MODE);
++ }
++
++ /**
++ * @brief Return the number of chained certificates that the
++ * client/server supports.
++ * @return The number of supported server certificates.
++ */
++ public static int MaxCerts()
++ {
++ return axtls.ssl_get_config(axtls.SSL_MAX_CERT_CFG_OFFSET);
++ }
++
++ /**
++ * @brief Return the number of CA certificates that the client/server
++ * supports.
++ * @return The number of supported CA certificates.
++ */
++ public static int MaxCACerts()
++ {
++ return axtls.ssl_get_config(axtls.SSL_MAX_CA_CERT_CFG_OFFSET);
++ }
++
++ /**
++ * @brief Indicate if PEM is supported.
++ * @return true if PEM supported.
++ */
++ public static bool HasPEM()
++ {
++ return axtls.ssl_get_config(axtls.SSL_HAS_PEM) > 0 ? true : false;
++ }
++
++ /**
++ * @brief Display the text string of the error.
++ * @param error_code [in] The integer error code.
++ */
++ public static void DisplayError(int error_code)
++ {
++ axtls.ssl_display_error(error_code);
++ }
++
++ /**
++ * @brief Return the version of the axTLS project.
++ */
++ public static string Version()
++ {
++ return axtls.ssl_version();
++ }
++ }
++
++ /**
++ * @class SSLCTX
++ * @ingroup csharp_api
++ * @brief A base object for SSLServer/SSLClient.
++ */
++ public class SSLCTX
++ {
++ /**
++ * @brief A reference to the real client/server context.
++ */
++ protected IntPtr m_ctx;
++
++ /**
++ * @brief Establish a new client/server context.
++ *
++ * This function is called before any client/server SSL connections are
++ * made. If multiple threads are used, then each thread will have its
++ * own SSLCTX context. Any number of connections may be made with a
++ * single context.
++ *
++ * Each new connection will use the this context's private key and
++ * certificate chain. If a different certificate chain is required,
++ * then a different context needs to be be used.
++ *
++ * @param options [in] Any particular options. At present the options
++ * supported are:
++ * - SSL_SERVER_VERIFY_LATER (client only): Don't stop a handshake if
++ * the server authentication fails. The certificate can be
++ * authenticated later with a call to VerifyCert().
++ * - SSL_CLIENT_AUTHENTICATION (server only): Enforce client
++ * authentication i.e. each handshake will include a "certificate
++ * request" message from the server.
++ * - SSL_DISPLAY_BYTES (full mode build only): Display the byte
++ * sequences during the handshake.
++ * - SSL_DISPLAY_STATES (full mode build only): Display the state
++ * changes during the handshake.
++ * - SSL_DISPLAY_CERTS (full mode build only): Display the
++ * certificates that are passed during a handshake.
++ * - SSL_DISPLAY_RSA (full mode build only): Display the RSA key
++ * details that are passed during a handshake.
++ * @param num_sessions [in] The number of sessions to be used for
++ * session caching. If this value is 0, then there is no session
++ * caching.
++ * @return A client/server context.
++ */
++ protected SSLCTX(uint options, int num_sessions)
++ {
++ m_ctx = axtls.ssl_ctx_new(options, num_sessions);
++ }
++
++ /**
++ * @brief Remove a client/server context.
++ *
++ * Frees any used resources used by this context. Each connection will
++ * be sent a "Close Notify" alert (if possible).
++ */
++ public void Dispose()
++ {
++ axtls.ssl_ctx_free(m_ctx);
++ }
++
++ /**
++ * @brief Read the SSL data stream.
++ * @param ssl [in] An SSL object reference.
++ * @param in_data [out] After a successful read, the decrypted data
++ * will be here. It will be null otherwise.
++ * @return The number of decrypted bytes:
++ * - if > 0, then the handshaking is complete and we are returning the
++ * number of decrypted bytes.
++ * - SSL_OK if the handshaking stage is successful (but not yet
++ * complete).
++ * - < 0 if an error.
++ * @see ssl.h for the error code list.
++ * @note Use in_data before doing any successive ssl calls.
++ */
++ public int Read(SSL ssl, out byte[] in_data)
++ {
++ IntPtr ptr = IntPtr.Zero;
++ int ret = axtls.ssl_read(ssl.m_ssl, ref ptr);
++
++ if (ret > axtls.SSL_OK)
++ {
++ in_data = new byte[ret];
++ Marshal.Copy(ptr, in_data, 0, ret);
++ }
++ else
++ {
++ in_data = null;
++ }
++
++ return ret;
++ }
++
++ /**
++ * @brief Write to the SSL data stream.
++ * @param ssl [in] An SSL obect reference.
++ * @param out_data [in] The data to be written
++ * @return The number of bytes sent, or if < 0 if an error.
++ * @see ssl.h for the error code list.
++ */
++ public int Write(SSL ssl, byte[] out_data)
++ {
++ return axtls.ssl_write(ssl.m_ssl, out_data, out_data.Length);
++ }
++
++ /**
++ * @brief Write to the SSL data stream.
++ * @param ssl [in] An SSL obect reference.
++ * @param out_data [in] The data to be written
++ * @param out_len [in] The number of bytes to be written
++ * @return The number of bytes sent, or if < 0 if an error.
++ * @see ssl.h for the error code list.
++ */
++ public int Write(SSL ssl, byte[] out_data, int out_len)
++ {
++ return axtls.ssl_write(ssl.m_ssl, out_data, out_len);
++ }
++
++ /**
++ * @brief Find an ssl object based on a Socket reference.
++ *
++ * Goes through the list of SSL objects maintained in a client/server
++ * context to look for a socket match.
++ * @param s [in] A reference to a <A HREF="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemnetsocketssocketclasstopic.asp">Socket</A> object.
++ * @return A reference to the SSL object. Returns null if the object
++ * could not be found.
++ */
++ public SSL Find(Socket s)
++ {
++ int client_fd = s.Handle.ToInt32();
++ return new SSL(axtls. ssl_find(m_ctx, client_fd));
++ }
++
++ /**
++ * @brief Authenticate a received certificate.
++ *
++ * This call is usually made by a client after a handshake is complete
++ * and the context is in SSL_SERVER_VERIFY_LATER mode.
++ * @param ssl [in] An SSL object reference.
++ * @return SSL_OK if the certificate is verified.
++ */
++ public int VerifyCert(SSL ssl)
++ {
++ return axtls.ssl_verify_cert(ssl.m_ssl);
++ }
++
++ /**
++ * @brief Force the client to perform its handshake again.
++ *
++ * For a client this involves sending another "client hello" message.
++ * For the server is means sending a "hello request" message.
++ *
++ * This is a blocking call on the client (until the handshake
++ * completes).
++ * @param ssl [in] An SSL object reference.
++ * @return SSL_OK if renegotiation instantiation was ok
++ */
++ public int Renegotiate(SSL ssl)
++ {
++ return axtls.ssl_renegotiate(ssl.m_ssl);
++ }
++
++ /**
++ * @brief Load a file into memory that is in binary DER or ASCII PEM
++ * format.
++ *
++ * These are temporary objects that are used to load private keys,
++ * certificates etc into memory.
++ * @param obj_type [in] The format of the file. Can be one of:
++ * - SSL_OBJ_X509_CERT (no password required)
++ * - SSL_OBJ_X509_CACERT (no password required)
++ * - SSL_OBJ_RSA_KEY (AES128/AES256 PEM encryption supported)
++ * - SSL_OBJ_P8 (RC4-128 encrypted data supported)
++ * - SSL_OBJ_P12 (RC4-128 encrypted data supported)
++ *
++ * PEM files are automatically detected (if supported).
++ * @param filename [in] The location of a file in DER/PEM format.
++ * @param password [in] The password used. Can be null if not required.
++ * @return SSL_OK if all ok
++ */
++ public int ObjLoad(int obj_type, string filename, string password)
++ {
++ return axtls.ssl_obj_load(m_ctx, obj_type, filename, password);
++ }
++
++ /**
++ * @brief Transfer binary data into the object loader.
++ *
++ * These are temporary objects that are used to load private keys,
++ * certificates etc into memory.
++ * @param obj_type [in] The format of the memory data.
++ * @param data [in] The binary data to be loaded.
++ * @param len [in] The amount of data to be loaded.
++ * @param password [in] The password used. Can be null if not required.
++ * @return SSL_OK if all ok
++ */
++ public int ObjLoad(int obj_type, byte[] data, int len, string password)
++ {
++ return axtls.ssl_obj_memory_load(m_ctx, obj_type,
++ data, len, password);
++ }
++ }
++
++ /**
++ * @class SSLServer
++ * @ingroup csharp_api
++ * @brief The server context.
++ *
++ * All server connections are started within a server context.
++ */
++ public class SSLServer : SSLCTX
++ {
++ /**
++ * @brief Start a new server context.
++ *
++ * @see SSLCTX for details.
++ */
++ public SSLServer(uint options, int num_sessions) :
++ base(options, num_sessions) {}
++
++ /**
++ * @brief Establish a new SSL connection to an SSL client.
++ *
++ * It is up to the application to establish the initial socket
++ * connection.
++ *
++ * Call Dispose() when the connection is to be removed.
++ * @param s [in] A reference to a <A HREF="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemnetsocketssocketclasstopic.asp">Socket</A> object.
++ * @return An SSL object reference.
++ */
++ public SSL Connect(Socket s)
++ {
++ int client_fd = s.Handle.ToInt32();
++ return new SSL(axtls.ssl_server_new(m_ctx, client_fd));
++ }
++ }
++
++ /**
++ * @class SSLClient
++ * @ingroup csharp_api
++ * @brief The client context.
++ *
++ * All client connections are started within a client context.
++ */
++ public class SSLClient : SSLCTX
++ {
++ /**
++ * @brief Start a new client context.
++ *
++ * @see SSLCTX for details.
++ */
++ public SSLClient(uint options, int num_sessions) :
++ base(options, num_sessions) {}
++
++ /**
++ * @brief Establish a new SSL connection to an SSL server.
++ *
++ * It is up to the application to establish the initial socket
++ * connection.
++ *
++ * This is a blocking call - it will finish when the handshake is
++ * complete (or has failed).
++ *
++ * Call Dispose() when the connection is to be removed.
++ * @param s [in] A reference to a <A HREF="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemnetsocketssocketclasstopic.asp">Socket</A> object.
++ * @param session_id [in] A 32 byte session id for session resumption.
++ * This can be null if no session resumption is not required.
++ * @return An SSL object reference. Use SSL.handshakeStatus() to check
++ * if a handshake succeeded.
++ */
++ public SSL Connect(Socket s, byte[] session_id)
++ {
++ int client_fd = s.Handle.ToInt32();
++ byte sess_id_size = (byte)(session_id != null ?
++ session_id.Length : 0);
++ return new SSL(axtls.ssl_client_new(m_ctx, client_fd, session_id,
++ sess_id_size));
++ }
++ }
++}
++/** @} */
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_SWIG_interface.pl b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_SWIG_interface.pl
+new file mode 100755
+index 0000000..4b25179
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_SWIG_interface.pl
+@@ -0,0 +1,393 @@
++#!/usr/bin/perl
++
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++#===============================================================
++# Transforms function signature into SWIG format
++sub transformSignature
++{
++ foreach $item (@_)
++ {
++ $line =~ s/STDCALL //g;
++ $line =~ s/EXP_FUNC/extern/g;
++
++ # make API Java more 'byte' friendly
++ $line =~ s/uint32_t/int/g;
++ $line =~ s/const uint8_t \* /const unsigned char \* /g;
++ $line =~ s/\(void\)/()/g;
++ if ($ARGV[0] eq "-java")
++ {
++ $line =~ s/.*ssl_read.*//g;
++ $line =~ s/const uint8_t \*(\w+)/const signed char $1\[\]/g;
++ $line =~ s/uint8_t/signed char/g;
++ }
++ elsif ($ARGV[0] eq "-perl")
++ {
++ $line =~ s/const uint8_t \*(\w+)/const unsigned char $1\[\]/g;
++ $line =~ s/uint8_t/unsigned char/g;
++ }
++ else # lua
++ {
++ $line =~ s/const uint8_t \*session_id/const unsigned char session_id\[\]/g;
++ $line =~ s/const uint8_t \*\w+/unsigned char *INPUT/g;
++ $line =~ s/uint8_t/unsigned char/g;
++ }
++ }
++
++ return $line;
++}
++
++# Parse input file
++sub parseFile
++{
++ foreach $line (@_)
++ {
++ next if $line =~ /ssl_x509_create/; # ignore for now
++
++ # test for a #define
++ if (!$skip && $line =~ m/^#define/)
++ {
++ $splitDefine = 1 if $line =~ m/\\$/;
++ print DATA_OUT $line;
++
++ # check line is not split
++ next if $splitDefine == 1;
++ }
++
++ # pick up second line of #define statement
++ if ($splitDefine)
++ {
++ print DATA_OUT $line;
++
++ # check line is not split
++ $splitDefine = ($line =~ m/\\$/);
++ next;
++ }
++
++ # test for function declaration
++ if (!$skip && $line =~ /EXP_FUNC/ && $line !~/\/\*/)
++ {
++ $line = transformSignature($line);
++ $splitFunctionDeclaration = $line !~ /;/;
++ print DATA_OUT $line;
++ next;
++ }
++
++ if ($splitFunctionDeclaration)
++ {
++ $line = transformSignature($line);
++ $splitFunctionDeclaration = $line !~ /;/;
++ print DATA_OUT $line;
++ next;
++ }
++ }
++}
++
++#===============================================================
++
++# Determine which module to build from cammand-line options
++use strict;
++use Getopt::Std;
++
++my $module;
++my $interfaceFile;
++my $data_file;
++my $skip;
++my $splitLine;
++my @raw_data;
++
++if (not defined $ARGV[0])
++{
++ goto ouch;
++}
++
++if ($ARGV[0] eq "-java")
++{
++ print "Generating Java interface file\n";
++ $module = "axtlsj";
++ $interfaceFile = "java/axTLSj.i";
++}
++elsif ($ARGV[0] eq "-perl")
++{
++ print "Generating Perl interface file\n";
++ $module = "axtlsp";
++ $interfaceFile = "perl/axTLSp.i";
++}
++elsif ($ARGV[0] eq "-lua")
++{
++ print "Generating lua interface file\n";
++ $module = "axtlsl";
++ $interfaceFile = "lua/axTLSl.i";
++}
++else
++{
++ouch:
++ die "Usage: $0 [-java | -perl | -lua]\n";
++}
++
++# Input file required to generate SWIG interface file.
++$data_file = "../ssl/ssl.h";
++
++# Open input files
++open(DATA_IN, $data_file) || die("Could not open file ($data_file)!");
++@raw_data = <DATA_IN>;
++
++# Open output file
++open(DATA_OUT, ">$interfaceFile") || die("Cannot Open File");
++
++#
++# I wish I could say it was easy to generate the Perl/Java/Lua bindings,
++# but each had their own set of challenges... :-(.
++#
++print DATA_OUT << "END";
++%module $module\n
++
++/* include our own header */
++%inline %{
++#include "ssl.h"
++%}
++
++%include "typemaps.i"
++/* Some SWIG magic to make the API a bit more Java friendly */
++#ifdef SWIGJAVA
++
++%apply long { SSL * };
++%apply long { SSL_CTX * };
++%apply long { SSLObjLoader * };
++
++/* allow "unsigned char []" to become "byte[]" */
++%include "arrays_java.i"
++
++/* convert these pointers to use long */
++%apply signed char[] {unsigned char *};
++%apply signed char[] {signed char *};
++
++/* allow ssl_get_session_id() to return "byte[]" */
++%typemap(out) unsigned char * ssl_get_session_id \"if (result) jresult = SWIG_JavaArrayOutSchar(jenv, result, ssl_get_session_id_size((SSL const *)arg1));\"
++
++/* allow ssl_client_new() to have a null session_id input */
++%typemap(in) const signed char session_id[] (jbyte *jarr) {
++ if (jarg3 == NULL)
++ {
++ jresult = (jint)ssl_client_new(arg1,arg2,NULL,0);
++ return jresult;
++ }
++
++ if (!SWIG_JavaArrayInSchar(jenv, &jarr, &arg3, jarg3)) return 0;
++}
++
++/* Lot's of work required for an ssl_read() due to its various custom
++ * requirements.
++ */
++%native (ssl_read) int ssl_read(SSL *ssl, jobject in_data);
++%{
++JNIEXPORT jint JNICALL Java_axTLSj_axtlsjJNI_ssl_1read(JNIEnv *jenv, jclass jcls, jint jarg1, jobject jarg2) {
++ jint jresult = 0 ;
++ SSL *arg1;
++ unsigned char *arg2;
++ jbyte *jarr;
++ int result;
++ JNIEnv e = *jenv;
++ jclass holder_class;
++ jfieldID fid;
++
++ arg1 = (SSL *)jarg1;
++ result = (int)ssl_read(arg1, &arg2);
++
++ /* find the "m_buf" entry in the SSLReadHolder class */
++ if (!(holder_class = e->GetObjectClass(jenv,jarg2)) ||
++ !(fid = e->GetFieldID(jenv,holder_class, "m_buf", "[B")))
++ return SSL_NOT_OK;
++
++ if (result > SSL_OK)
++ {
++ int i;
++
++ /* create a new byte array to hold the read data */
++ jbyteArray jarray = e->NewByteArray(jenv, result);
++
++ /* copy the bytes across to the java byte array */
++ jarr = e->GetByteArrayElements(jenv, jarray, 0);
++ for (i = 0; i < result; i++)
++ jarr[i] = (jbyte)arg2[i];
++
++ /* clean up and set the new m_buf object */
++ e->ReleaseByteArrayElements(jenv, jarray, jarr, 0);
++ e->SetObjectField(jenv, jarg2, fid, jarray);
++ }
++ else /* set to null */
++ e->SetObjectField(jenv, jarg2, fid, NULL);
++
++ jresult = (jint)result;
++ return jresult;
++}
++%}
++
++/* Big hack to get hold of a socket's file descriptor */
++%typemap (jtype) long "Object"
++%typemap (jstype) long "Object"
++%native (getFd) int getFd(long sock);
++%{
++JNIEXPORT jint JNICALL Java_axTLSj_axtlsjJNI_getFd(JNIEnv *env, jclass jcls, jobject sock)
++{
++ JNIEnv e = *env;
++ jfieldID fid;
++ jobject impl;
++ jobject fdesc;
++
++ /* get the SocketImpl from the Socket */
++ if (!(jcls = e->GetObjectClass(env,sock)) ||
++ !(fid = e->GetFieldID(env,jcls,"impl","Ljava/net/SocketImpl;")) ||
++ !(impl = e->GetObjectField(env,sock,fid))) return -1;
++
++ /* get the FileDescriptor from the SocketImpl */
++ if (!(jcls = e->GetObjectClass(env,impl)) ||
++ !(fid = e->GetFieldID(env,jcls,"fd","Ljava/io/FileDescriptor;")) ||
++ !(fdesc = e->GetObjectField(env,impl,fid))) return -1;
++
++ /* get the fd from the FileDescriptor */
++ if (!(jcls = e->GetObjectClass(env,fdesc)) ||
++ !(fid = e->GetFieldID(env,jcls,"fd","I"))) return -1;
++
++ /* return the descriptor */
++ return e->GetIntField(env,fdesc,fid);
++}
++%}
++
++#endif
++
++/* Some SWIG magic to make the API a bit more Perl friendly */
++#ifdef SWIGPERL
++
++/* for ssl_session_id() */
++%typemap(out) const unsigned char * {
++ SV *svs = newSVpv((unsigned char *)\$1, ssl_get_session_id_size((SSL const *)arg1));
++ \$result = newRV(svs);
++ sv_2mortal(\$result);
++ argvi++;
++}
++
++/* for ssl_write() */
++%typemap(in) const unsigned char out_data[] {
++ SV* tempsv;
++ if (!SvROK(\$input))
++ croak("Argument \$argnum is not a reference.");
++ tempsv = SvRV(\$input);
++ if (SvTYPE(tempsv) != SVt_PV)
++ croak("Argument \$argnum is not an string.");
++ \$1 = (unsigned char *)SvPV(tempsv, PL_na);
++}
++
++/* for ssl_read() */
++%typemap(in) unsigned char **in_data (unsigned char *buf) {
++ \$1 = &buf;
++}
++
++%typemap(argout) unsigned char **in_data {
++ if (result > SSL_OK) {
++ SV *svs = newSVpv(*\$1, result);
++ \$result = newRV(svs);
++ sv_2mortal(\$result);
++ argvi++;
++ }
++}
++
++/* for ssl_client_new() */
++%typemap(in) const unsigned char session_id[] {
++ /* check for a reference */
++ if (SvOK(\$input) && SvROK(\$input)) {
++ SV* tempsv = SvRV(\$input);
++ if (SvTYPE(tempsv) != SVt_PV)
++ croak("Argument \$argnum is not an string.");
++ \$1 = (unsigned char *)SvPV(tempsv, PL_na);
++ }
++ else
++ \$1 = NULL;
++}
++
++#endif
++
++/* Some SWIG magic to make the API a bit more Lua friendly */
++#ifdef SWIGLUA
++SWIG_NUMBER_TYPEMAP(unsigned char);
++SWIG_TYPEMAP_NUM_ARR(uchar,unsigned char);
++
++/* for ssl_session_id() */
++%typemap(out) const unsigned char * {
++ int i;
++ lua_newtable(L);
++ for (i = 0; i < ssl_get_session_id_size((SSL const *)arg1); i++){
++ lua_pushnumber(L,(lua_Number)result[i]);
++ lua_rawseti(L,-2,i+1); /* -1 is the number, -2 is the table */
++ }
++ SWIG_arg++;
++}
++
++/* for ssl_read() */
++%typemap(in) unsigned char **in_data (unsigned char *buf) {
++ \$1 = &buf;
++}
++
++%typemap(argout) unsigned char **in_data {
++ if (result > SSL_OK) {
++ int i;
++ lua_newtable(L);
++ for (i = 0; i < result; i++){
++ lua_pushnumber(L,(lua_Number)buf2[i]);
++ lua_rawseti(L,-2,i+1); /* -1 is the number, -2 is the table */
++ }
++ SWIG_arg++;
++ }
++}
++
++/* for ssl_client_new() */
++%typemap(in) const unsigned char session_id[] {
++ if (lua_isnil(L,\$input))
++ \$1 = NULL;
++ else
++ \$1 = SWIG_get_uchar_num_array_fixed(L,\$input, ssl_get_session_id((SSL const *)\$1));
++}
++
++#endif
++
++END
++
++# Initialise loop variables
++$skip = 1;
++$splitLine = 0;
++
++parseFile(@raw_data);
++
++close(DATA_IN);
++close(DATA_OUT);
++
++#===============================================================
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_interface.pl b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_interface.pl
+new file mode 100755
+index 0000000..c24bff9
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_interface.pl
+@@ -0,0 +1,322 @@
++#!/usr/bin/perl -w
++
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++#===============================================================
++# This application transforms ssl.h into interfaces that can be used by
++# other language bindings. It is "SWIG"-like in nature in that various
++# files are generated based on the axTLS API.
++#
++# The file produced is axInterface.? (depending on the file extension).
++#
++#===============================================================
++
++use strict;
++
++my $CSHARP = 0;
++my $VBNET = 1;
++
++my $binding;
++my $skip = 0;
++my $signature_ret_type;
++
++# Transforms function signature into an Interface format
++sub transformSignature
++{
++ my $item;
++ my ($line) = @_;
++
++ foreach $item ($line)
++ {
++ # our very basic preprocessor
++ if ($binding == $CSHARP)
++ {
++ $line =~ s/STDCALL //;
++ $line =~ s/EXP_FUNC/ [DllImport ("axtls")]\n public static extern/;
++ $line =~ s/uint32_t/uint/g;
++ $line =~ s/uint8_t \*\*/ref IntPtr /g;
++ $line =~ s/const uint8_t \* /IntPtr /g;
++ $line =~ s/const uint8_t \*/byte[] /g; # note: subtle diff
++ $line =~ s/uint8_t \* ?/byte[] /g;
++ $line =~ s/uint8_t ?/byte /g;
++ $line =~ s/const char \* ?/string /g;
++ $line =~ s/const SSL_CTX \* ?/IntPtr /g;
++ $line =~ s/SSL_CTX \* ?/IntPtr /g;
++ $line =~ s/SSLObjLoader \* ?/IntPtr /g;
++ $line =~ s/const SSL \* ?/IntPtr /g;
++ $line =~ s/SSL \* ?/IntPtr /g;
++ $line =~ s/\(void\)/()/g;
++ }
++ elsif ($binding == $VBNET)
++ {
++ if ($line =~ /EXP_FUNC/)
++ {
++ # Procedure or function?
++ my $invariant = $line =~ /void /;
++
++ my $proc = $invariant ? "Sub" : "Function";
++ ($signature_ret_type) = $line =~ /EXP_FUNC (.*) STDCALL/;
++ $line =~ s/EXP_FUNC .* STDCALL / <DllImport("axtls")> Public Shared $proc _\n /;
++
++ $signature_ret_type =~ s/const uint8_t \*/As IntPtr/;
++ $signature_ret_type =~ s/const char \*/As String/;
++ $signature_ret_type =~ s/SSL_CTX \*/As IntPtr/;
++ $signature_ret_type =~ s/SSLObjLoader \*/As IntPtr/;
++ $signature_ret_type =~ s/SSL \*/As IntPtr/;
++ $signature_ret_type =~ s/uint8_t/As Byte/;
++ $signature_ret_type =~ s/int/As Integer/;
++ $signature_ret_type =~ s/void//;
++ $signature_ret_type .= "\n End $proc\n\n";
++ }
++
++ $line =~ s/uint32_t (\w+)/ByVal $1 As Integer/g;
++ $line =~ s/int (\w+)/ByVal $1 As Integer/g;
++ $line =~ s/uint8_t \*\* ?(\w+)/ByRef $1 As IntPtr/g;
++ $line =~ s/const uint8_t \* ?(\w+)/ByVal $1() As Byte/g;
++ $line =~ s/uint8_t \* ?(\w+)/ByVal $1() As Byte/g;
++ $line =~ s/uint8_t ?(\w+)/ByVal $1 As Byte/g;
++ $line =~ s/const char \* ?(\w+)/ByVal $1 As String/g;
++ $line =~ s/const SSL_CTX \* ?(\w+)/ByVal $1 As IntPtr/g;
++ $line =~ s/SSL_CTX \* ?(\w+)/ByVal $1 As IntPtr/g;
++ $line =~ s/SSLObjLoader \* ?(\w+)/ByVal $1 As IntPtr/g;
++ $line =~ s/const SSL \* ?(\w+)/ByVal $1 As IntPtr/g;
++ $line =~ s/SSL \* ?(\w+)/ByVal $1 As IntPtr/g;
++ $line =~ s/void \* ?(\w+)/Byval $1 As IntPtr/g;
++ $line =~ s/\(void\)/()/g;
++ $line =~ s/void//g;
++ $line =~ s/;\n/ $signature_ret_type;/;
++ }
++ }
++
++ return $line;
++}
++
++# Parse input file
++sub parseFile
++{
++ my (@file) = @_;
++ my $line;
++ my $splitDefine = 0;
++ my $splitFunctionDeclaration;
++ my $vb_hack = " ";
++ my $vb_line_hack = 0;
++
++ $skip = 0;
++
++ foreach $line (@file)
++ {
++ next if $line =~ /sl_x509_create/; # ignore for now
++
++ # test for a #define
++ if (!$skip && $line =~ m/^#define/)
++ {
++ $splitDefine = 1 if $line =~ m/\\$/;
++
++ if ($binding == $VBNET)
++ {
++ $line =~ s/\|/Or/g;
++ $line =~ s/ 0x/ &H/;
++ }
++
++ my ($name, $value) = $line =~ /#define (\w+) +([^\\]*)[\\]?\n/;
++
++ if (defined $name && defined $value)
++ {
++ # C# constant translation
++ if ($binding == $CSHARP)
++ {
++ $line = " public const int $name = $value";
++ }
++ # VB.NET constant translation
++ elsif ($binding == $VBNET)
++ {
++ $line = " Public Const $name As Integer = $value";
++ }
++ }
++
++ next if $line =~ /#define/; # ignore any other defines
++
++ print DATA_OUT $line;
++
++ # check line is not split
++ next if $splitDefine == 1;
++ print DATA_OUT ";" if $binding == $CSHARP;
++ print DATA_OUT "\n";
++ }
++
++ # pick up second line of #define statement
++ if ($splitDefine)
++ {
++ if ($line !~ /\\$/)
++ {
++ $line =~ s/$/;/ if $binding == $CSHARP; # add the ";"
++ }
++
++ $line =~ s/ ?\| ?/ Or /g
++ if ($binding == $VBNET);
++
++ # check line is not split
++ $splitDefine = ($line =~ m/\\$/);
++
++ # ignore trailing "\"
++ $line =~ s/\\$// if $binding == $CSHARP;
++ $line =~ s/\\$/_/ if $binding == $VBNET;
++ print DATA_OUT $line;
++ next;
++ }
++
++ # test for function declaration
++ if (!$skip && $line =~ /EXP_FUNC/ && $line !~ /\/\*/)
++ {
++ $line = transformSignature($line);
++ $splitFunctionDeclaration = $line !~ /;/;
++ $line =~ s/;// if ($binding == $VBNET);
++ $line =~ s/\n$/ _\n/ if ($binding == $VBNET) &&
++ $splitFunctionDeclaration;
++ print DATA_OUT $line;
++ next;
++ }
++
++ if ($splitFunctionDeclaration)
++ {
++ $line = transformSignature($line);
++ $splitFunctionDeclaration = $line !~ /;/;
++ $line =~ s/;// if ($binding == $VBNET);
++ $line =~ s/\n/ _\n/ if ($binding == $VBNET) &&
++ $splitFunctionDeclaration == 1;
++ print DATA_OUT $line;
++ next;
++ }
++ }
++}
++
++#===============================================================
++
++# Determine which module to build from command-line options
++use strict;
++use Getopt::Std;
++
++my $binding_prefix;
++my $binding_suffix;
++my $data_file;
++my @raw_data;
++
++if (not defined $ARGV[0])
++{
++ goto ouch;
++}
++
++if ($ARGV[0] eq "-csharp")
++{
++ print "Generating C# interface file\n";
++ $binding_prefix = "csharp";
++ $binding_suffix = "cs";
++ $binding = $CSHARP;
++}
++elsif ($ARGV[0] eq "-vbnet")
++{
++ print "Generating VB.NET interface file\n";
++ $binding_prefix = "vbnet";
++ $binding_suffix = "vb";
++ $binding = $VBNET;
++}
++else
++{
++ouch:
++ die "Usage: $0 [-csharp | -vbnet]\n";
++}
++
++my $interfaceFile = "$binding_prefix/axInterface.$binding_suffix";
++
++# Input file required to generate interface file.
++$data_file = "../ssl/ssl.h";
++
++# Open input files
++open(DATA_IN, $data_file) || die("Could not open file ($data_file)!");
++@raw_data = <DATA_IN>;
++
++
++# Open output file
++if ($binding == $CSHARP || $binding == $VBNET)
++{
++ open(DATA_OUT, ">$interfaceFile") || die("Cannot Open File");
++}
++
++# SPEC interface file header
++if ($binding == $CSHARP)
++{
++ # generate the C#/C interface file
++ print DATA_OUT << "END";
++// The C# to C interface definition file for the axTLS project
++// Do not modify - this file is generated
++
++using System;
++using System.Runtime.InteropServices;
++
++namespace axTLS
++{
++ public class axtls
++ {
++END
++}
++elsif ($binding == $VBNET)
++{
++ # generate the VB.NET/C interface file
++ print DATA_OUT << "END";
++' The VB.NET to C interface definition file for the axTLS project
++' Do not modify - this file is generated
++
++Imports System
++Imports System.Runtime.InteropServices
++
++Namespace axTLSvb
++ Public Class axtls
++END
++}
++
++parseFile(@raw_data);
++
++# finish up
++if ($binding == $CSHARP)
++{
++ print DATA_OUT " };\n";
++ print DATA_OUT "};\n";
++}
++elsif ($binding == $VBNET)
++{
++ print DATA_OUT " End Class\nEnd Namespace\n";
++}
++
++close(DATA_IN);
++close(DATA_OUT);
++
++#===============================================================
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/Makefile
+new file mode 100644
+index 0000000..8df1d0a
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/Makefile
+@@ -0,0 +1,94 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++AXTLS_HOME=../..
++
++include $(AXTLS_HOME)/config/.config
++include $(AXTLS_HOME)/config/makefile.conf
++include $(AXTLS_HOME)/config/makefile.java.conf
++
++all: lib jar
++
++JAR=$(AXTLS_HOME)/$(STAGE)/axtls.jar
++
++ifdef CONFIG_PLATFORM_WIN32
++TARGET=$(AXTLS_HOME)/$(STAGE)/axtlsj.dll
++else
++TARGET=$(AXTLS_HOME)/$(STAGE)/libaxtlsj.so
++endif
++
++lib: $(TARGET)
++axTLSj_wrap.o : axTLSj_wrap.c
++
++JAVA_FILES= \
++ axtlsjJNI.java \
++ axtlsjConstants.java \
++ axtlsj.java \
++ SSLReadHolder.java \
++ SSL.java \
++ SSLUtil.java \
++ SSLCTX.java \
++ SSLServer.java \
++ SSLClient.java
++
++OBJ=axTLSj_wrap.o
++
++JAVA_CLASSES:=$(JAVA_FILES:%.java=classes/axTLSj/%.class)
++
++ifdef CONFIG_PLATFORM_WIN32
++LDFLAGS += axtls.lib /libpath:"$(AXTLS_HOME)/$(STAGE)"
++
++include $(AXTLS_HOME)/config/makefile.post
++
++$(TARGET) : $(OBJ)
++ $(LD) $(LDFLAGS) $(LDSHARED) /out:$@ $(OBJ)
++else # Not Win32
++
++$(TARGET) : $(OBJ)
++ $(LD) $(LDFLAGS) -L $(AXTLS_HOME)/$(STAGE) $(LDSHARED) -o $@ $(OBJ) -laxtls
++endif
++
++jar: $(OBJ) $(JAR)
++
++# if we are doing the samples then defer creating the jar until then
++$(JAR): $(JAVA_CLASSES)
++ifndef CONFIG_JAVA_SAMPLES
++ jar cvf $@ -C classes axTLSj
++else
++ @if [ ! -f $(JAR) ]; then touch $(JAR); fi
++endif
++
++classes/axTLSj/%.class : %.java
++ javac -d classes -classpath classes $^
++
++clean::
++ @rm -f $(JAR) $(TARGET) SWIG* axtls* *.i *.c
++ @rm -fr classes/*
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSL.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSL.java
+new file mode 100644
+index 0000000..b53a6da
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSL.java
+@@ -0,0 +1,137 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * A wrapper around the unmanaged interface to give a semi-decent Java API
++ */
++
++package axTLSj;
++
++import java.io.*;
++import java.util.*;
++
++/**
++ * @defgroup java_api Java API.
++ *
++ * Ensure that the appropriate dispose() methods are called when finished with
++ * various objects - otherwise memory leaks will result.
++ */
++
++/**
++ * @class SSL
++ * @ingroup java_api
++ * @brief A representation of an SSL connection.
++ *
++ */
++public class SSL
++{
++ public int m_ssl; /**< A pointer to the real SSL type */
++
++ /**
++ * @brief Store the reference to an SSL context.
++ * @param ip [in] A reference to an SSL object.
++ */
++ public SSL(int ip)
++ {
++ m_ssl = ip;
++ }
++
++ /**
++ * @brief Free any used resources on this connection.
++ *
++ * A "Close Notify" message is sent on this connection (if possible). It
++ * is up to the application to close the socket.
++ */
++ public void dispose()
++ {
++ axtlsj.ssl_free(m_ssl);
++ }
++
++ /**
++ * @brief Return the result of a handshake.
++ * @return SSL_OK if the handshake is complete and ok.
++ * @see ssl.h for the error code list.
++ */
++ public int handshakeStatus()
++ {
++ return axtlsj.ssl_handshake_status(m_ssl);
++ }
++
++ /**
++ * @brief Return the SSL cipher id.
++ * @return The cipher id which is one of:
++ * - SSL_AES128_SHA (0x2f)
++ * - SSL_AES256_SHA (0x35)
++ * - SSL_RC4_128_SHA (0x05)
++ * - SSL_RC4_128_MD5 (0x04)
++ */
++ public byte getCipherId()
++ {
++ return axtlsj.ssl_get_cipher_id(m_ssl);
++ }
++
++ /**
++ * @brief Get the session id for a handshake.
++ *
++ * This will be a 32 byte sequence and is available after the first
++ * handshaking messages are sent.
++ * @return The session id as a 32 byte sequence.
++ * @note A SSLv23 handshake may have only 16 valid bytes.
++ */
++ public byte[] getSessionId()
++ {
++ return axtlsj.ssl_get_session_id(m_ssl);
++ }
++
++ /**
++ * @brief Retrieve an X.509 distinguished name component.
++ *
++ * When a handshake is complete and a certificate has been exchanged,
++ * then the details of the remote certificate can be retrieved.
++ *
++ * This will usually be used by a client to check that the server's common
++ * name matches the URL.
++ *
++ * A full handshake needs to occur for this call to work.
++ *
++ * @param component [in] one of:
++ * - SSL_X509_CERT_COMMON_NAME
++ * - SSL_X509_CERT_ORGANIZATION
++ * - SSL_X509_CERT_ORGANIZATIONAL_NAME
++ * - SSL_X509_CA_CERT_COMMON_NAME
++ * - SSL_X509_CA_CERT_ORGANIZATION
++ * - SSL_X509_CA_CERT_ORGANIZATIONAL_NAME
++ * @return The appropriate string (or null if not defined)
++ */
++ public String getCertificateDN(int component)
++ {
++ return axtlsj.ssl_get_cert_dn(m_ssl, component);
++ }
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLCTX.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLCTX.java
+new file mode 100644
+index 0000000..1cd3e03
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLCTX.java
+@@ -0,0 +1,229 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * A wrapper around the unmanaged interface to give a semi-decent Java API
++ */
++
++package axTLSj;
++
++import java.net.*;
++
++/**
++ * @class SSLCTX
++ * @ingroup java_api
++ * @brief A base object for SSLServer/SSLClient.
++ */
++public class SSLCTX
++{
++ /**
++ * A reference to the real client/server context.
++ */
++ protected int m_ctx;
++
++ /**
++ * @brief Establish a new client/server context.
++ *
++ * This function is called before any client/server SSL connections are
++ * made. If multiple threads are used, then each thread will have its
++ * own SSLCTX context. Any number of connections may be made with a single
++ * context.
++ *
++ * Each new connection will use the this context's private key and
++ * certificate chain. If a different certificate chain is required, then a
++ * different context needs to be be used.
++ *
++ * @param options [in] Any particular options. At present the options
++ * supported are:
++ * - SSL_SERVER_VERIFY_LATER (client only): Don't stop a handshake if the
++ * server authentication fails. The certificate can be authenticated later
++ * with a call to verifyCert().
++ * - SSL_CLIENT_AUTHENTICATION (server only): Enforce client authentication
++ * i.e. each handshake will include a "certificate request" message from
++ * the server.
++ * - SSL_DISPLAY_BYTES (full mode build only): Display the byte sequences
++ * during the handshake.
++ * - SSL_DISPLAY_STATES (full mode build only): Display the state changes
++ * during the handshake.
++ * - SSL_DISPLAY_CERTS (full mode build only): Display the certificates that
++ * are passed during a handshake.
++ * - SSL_DISPLAY_RSA (full mode build only): Display the RSA key details
++ * that are passed during a handshake.
++ *
++ * @param num_sessions [in] The number of sessions to be used for session
++ * caching. If this value is 0, then there is no session caching.
++ *
++ * If this option is null, then the default internal private key/
++ * certificate pair is used (if CONFIG_SSL_USE_DEFAULT_KEY is set).
++ *
++ * The resources used by this object are automatically freed.
++ * @return A client/server context.
++ */
++ protected SSLCTX(int options, int num_sessions)
++ {
++ m_ctx = axtlsj.ssl_ctx_new(options, num_sessions);
++ }
++
++ /**
++ * @brief Remove a client/server context.
++ *
++ * Frees any used resources used by this context. Each connection will be
++ * sent a "Close Notify" alert (if possible).
++ */
++ public void dispose()
++ {
++ axtlsj.ssl_ctx_free(m_ctx);
++ }
++
++ /**
++ * @brief Read the SSL data stream.
++ * @param ssl [in] An SSL object reference.
++ * @param rh [out] After a successful read, the decrypted data can be
++ * retrieved with rh.getData(). It will be null otherwise.
++ * @return The number of decrypted bytes:
++ * - if > 0, then the handshaking is complete and we are returning the
++ * number of decrypted bytes.
++ * - SSL_OK if the handshaking stage is successful (but not yet complete).
++ * - < 0 if an error.
++ * @see ssl.h for the error code list.
++ * @note Use rh before doing any successive ssl calls.
++ */
++ public int read(SSL ssl, SSLReadHolder rh)
++ {
++ return axtlsj.ssl_read(ssl.m_ssl, rh);
++ }
++
++ /**
++ * @brief Write to the SSL data stream.
++ * @param ssl [in] An SSL obect reference.
++ * @param out_data [in] The data to be written
++ * @return The number of bytes sent, or if < 0 if an error.
++ * @see ssl.h for the error code list.
++ */
++ public int write(SSL ssl, byte[] out_data)
++ {
++ return axtlsj.ssl_write(ssl.m_ssl, out_data, out_data.length);
++ }
++
++ /**
++ * @brief Write to the SSL data stream.
++ * @param ssl [in] An SSL obect reference.
++ * @param out_data [in] The data to be written
++ * @param out_len [in] The number of bytes to be written
++ * @return The number of bytes sent, or if < 0 if an error.
++ * @see ssl.h for the error code list.
++ */
++ public int write(SSL ssl, byte[] out_data, int out_len)
++ {
++ return axtlsj.ssl_write(ssl.m_ssl, out_data, out_len);
++ }
++
++ /**
++ * @brief Find an ssl object based on a Socket reference.
++ *
++ * Goes through the list of SSL objects maintained in a client/server
++ * context to look for a socket match.
++ * @param s [in] A reference to a <A HREF="http://java.sun.com/j2se/1.4.2/docs/api">Socket</A> object.
++ * @return A reference to the SSL object. Returns null if the object
++ * could not be found.
++ */
++ public SSL find(Socket s)
++ {
++ int client_fd = axtlsj.getFd(s);
++ return new SSL(axtlsj.ssl_find(m_ctx, client_fd));
++ }
++
++ /**
++ * @brief Authenticate a received certificate.
++ *
++ * This call is usually made by a client after a handshake is complete
++ * and the context is in SSL_SERVER_VERIFY_LATER mode.
++ * @param ssl [in] An SSL object reference.
++ * @return SSL_OK if the certificate is verified.
++ */
++ public int verifyCert(SSL ssl)
++ {
++ return axtlsj.ssl_verify_cert(ssl.m_ssl);
++ }
++
++ /**
++ * @brief Force the client to perform its handshake again.
++ *
++ * For a client this involves sending another "client hello" message.
++ * For the server is means sending a "hello request" message.
++ *
++ * This is a blocking call on the client (until the handshake completes).
++ * @param ssl [in] An SSL object reference.
++ * @return SSL_OK if renegotiation instantiation was ok
++ */
++ public int renegotiate(SSL ssl)
++ {
++ return axtlsj.ssl_renegotiate(ssl.m_ssl);
++ }
++
++ /**
++ * @brief Load a file into memory that is in binary DER or ASCII PEM format.
++ *
++ * These are temporary objects that are used to load private keys,
++ * certificates etc into memory.
++ * @param obj_type [in] The format of the file. Can be one of:
++ * - SSL_OBJ_X509_CERT (no password required)
++ * - SSL_OBJ_X509_CACERT (no password required)
++ * - SSL_OBJ_RSA_KEY (AES128/AES256 PEM encryption supported)
++ * - SSL_OBJ_P8 (RC4-128 encrypted data supported)
++ * - SSL_OBJ_P12 (RC4-128 encrypted data supported)
++ *
++ * PEM files are automatically detected (if supported).
++ * @param filename [in] The location of a file in DER/PEM format.
++ * @param password [in] The password used. Can be null if not required.
++ * @return SSL_OK if all ok
++ */
++ public int objLoad(int obj_type, String filename, String password)
++ {
++ return axtlsj.ssl_obj_load(m_ctx, obj_type, filename, password);
++ }
++
++ /**
++ * @brief Transfer binary data into the object loader.
++ *
++ * These are temporary objects that are used to load private keys,
++ * certificates etc into memory.
++ * @param obj_type [in] The format of the memory data.
++ * @param data [in] The binary data to be loaded.
++ * @param len [in] The amount of data to be loaded.
++ * @param password [in] The password used. Can be null if not required.
++ * @return SSL_OK if all ok
++ */
++
++ public int objLoad(int obj_type, byte[] data, int len, String password)
++ {
++ return axtlsj.ssl_obj_memory_load(m_ctx, obj_type, data, len, password);
++ }
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLClient.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLClient.java
+new file mode 100644
+index 0000000..f65fe9c
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLClient.java
+@@ -0,0 +1,81 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * A wrapper around the unmanaged interface to give a semi-decent Java API
++ */
++
++package axTLSj;
++
++import java.net.*;
++
++/**
++ * @class SSLClient
++ * @ingroup java_api
++ * @brief The client context.
++ *
++ * All client connections are started within a client context.
++ */
++public class SSLClient extends SSLCTX
++{
++ /**
++ * @brief Start a new client context.
++ *
++ * @see SSLCTX for details.
++ */
++ public SSLClient(int options, int num_sessions)
++ {
++ super(options, num_sessions);
++ }
++
++ /**
++ * @brief Establish a new SSL connection to an SSL server.
++ *
++ * It is up to the application to establish the initial socket connection.
++ *
++ * This is a blocking call - it will finish when the handshake is
++ * complete (or has failed).
++ *
++ * Call dispose() when the connection is to be removed.
++ * @param s [in] A reference to a <A HREF="http://java.sun.com/j2se/1.4.2/docs/api">Socket</A> object.
++ * @param session_id [in] A 32 byte session id for session resumption. This
++ * can be null if no session resumption is not required.
++ * @return An SSL object reference. Use SSL.handshakeStatus() to check
++ * if a handshake succeeded.
++ */
++ public SSL connect(Socket s, byte[] session_id)
++ {
++ int client_fd = axtlsj.getFd(s);
++ byte sess_id_size = (byte)(session_id != null ?
++ session_id.length : 0);
++ return new SSL(axtlsj.ssl_client_new(m_ctx, client_fd, session_id,
++ sess_id_size));
++ }
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLReadHolder.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLReadHolder.java
+new file mode 100644
+index 0000000..91fd76b
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLReadHolder.java
+@@ -0,0 +1,61 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * A wrapper around the unmanaged interface to give a semi-decent Java API
++ */
++
++package axTLSj;
++
++/**
++ * @class SSLReadHolder
++ * @ingroup java_api
++ * @brief A holder for data read in an SSL read.
++ */
++public class SSLReadHolder
++{
++ /**
++ * @brief Contruct a new read holder object.
++ */
++ public SSLReadHolder()
++ {
++ m_buf = null;
++ }
++
++ /**
++ * @brief Retrieve the reference to the read data.
++ */
++ public byte[] getData()
++ {
++ return m_buf;
++ }
++
++ private byte[] m_buf;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLServer.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLServer.java
+new file mode 100644
+index 0000000..514ccb0
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLServer.java
+@@ -0,0 +1,72 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * A wrapper around the unmanaged interface to give a semi-decent Java API
++ */
++
++package axTLSj;
++
++import java.net.*;
++
++/**
++ * @class SSLServer
++ * @ingroup java_api
++ * @brief The server context.
++ *
++ * All server connections are started within a server context.
++ */
++public class SSLServer extends SSLCTX
++{
++ /**
++ * @brief Start a new server context.
++ *
++ * @see SSLCTX for details.
++ */
++ public SSLServer(int options, int num_sessions)
++ {
++ super(options, num_sessions);
++ }
++
++ /**
++ * @brief Establish a new SSL connection to an SSL client.
++ *
++ * It is up to the application to establish the initial socket connection.
++ *
++ * Call dispose() when the connection is to be removed.
++ * @param s [in] A reference to a <A HREF="http://java.sun.com/j2se/1.4.2/docs/api">Socket</A> object.
++ * @return An SSL object reference.
++ */
++ public SSL connect(Socket s)
++ {
++ int client_fd = axtlsj.getFd(s);
++ return new SSL(axtlsj.ssl_server_new(m_ctx, client_fd));
++ }
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLUtil.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLUtil.java
+new file mode 100644
+index 0000000..3d53de5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLUtil.java
+@@ -0,0 +1,116 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * A wrapper around the unmanaged interface to give a semi-decent Java API
++ */
++
++package axTLSj;
++
++import java.io.*;
++import java.util.*;
++
++/**
++ * @class SSLUtil
++ * @ingroup java_api
++ * @brief Some global helper functions.
++ *
++ */
++public class SSLUtil
++{
++ /**
++ * @brief Load up the ddl/shared library
++ */
++ static
++ {
++ System.loadLibrary("axtlsj");
++ }
++
++ /**
++ * @brief Return the build mode of the axTLS project.
++ * @return The build mode is one of:
++ * - SSL_BUILD_SERVER_ONLY
++ * - SSL_BUILD_ENABLE_VERIFICATION
++ * - SSL_BUILD_ENABLE_CLIENT
++ * - SSL_BUILD_FULL_MODE
++ */
++ public static int buildMode()
++ {
++ return axtlsj.ssl_get_config(axtlsj.SSL_BUILD_MODE);
++ }
++
++ /**
++ * @brief Return the number of chained certificates that the client/server
++ * supports.
++ * @return The number of supported client/server certificates.
++ */
++ public static int maxCerts()
++ {
++ return axtlsj.ssl_get_config(axtlsj.SSL_MAX_CERT_CFG_OFFSET);
++ }
++
++ /**
++ * @brief Return the number of CA certificates that the client/server
++ * supports.
++ * @return The number of supported CA certificates.
++ */
++ public static int maxCACerts()
++ {
++ return axtlsj.ssl_get_config(axtlsj.SSL_MAX_CA_CERT_CFG_OFFSET);
++ }
++
++ /**
++ * @brief Indicate if PEM is supported.
++ * @return true if PEM supported.
++ */
++ public static boolean hasPEM()
++ {
++ return axtlsj.ssl_get_config(axtlsj.SSL_HAS_PEM) > 0 ? true : false;
++ }
++
++ /**
++ * @brief Display the text string of the error.
++ * @param error_code [in] The integer error code.
++ * @see ssl.h for the error code list.
++ */
++ public static void displayError(int error_code)
++ {
++ axtlsj.ssl_display_error(error_code);
++ }
++
++ /**
++ * @brief Return the version of the axTLS project.
++ */
++ public static String version()
++ {
++ return axtlsj.ssl_version();
++ }
++}
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/lua/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/lua/Makefile
+new file mode 100644
+index 0000000..daacf92
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/lua/Makefile
+@@ -0,0 +1,67 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++AXTLS_HOME=../..
++
++include $(AXTLS_HOME)/config/.config
++include $(AXTLS_HOME)/config/makefile.conf
++
++all: lib
++
++
++ifdef CONFIG_PLATFORM_WIN32
++TARGET=$(AXTLS_HOME)/$(STAGE)/axtlsl.dll
++else
++TARGET=$(CONFIG_LUA_CORE)/lib/lua/5.1/axtlsl.so
++endif
++
++ifneq ($(MAKECMDGOALS), clean)
++
++lib: $(TARGET)
++OBJ:=axTLSl_wrap.o
++include $(AXTLS_HOME)/config/makefile.post
++
++# there are a few static functions that aren't used
++CFLAGS += -funit-at-a-time
++
++$(TARGET) : $(OBJ)
++ $(LD) $(LDFLAGS) $(LDSHARED) -o $@ $^ -L$(AXTLS_HOME)/$(STAGE) -L$(CONFIG_LUA_CORE)/lib -laxtls -llua
++
++CFLAGS += -I $(CONFIG_LUA_CORE)/include
++else
++CFLAGS += /I"`cygpath -w $(CONFIG_LUA_CORE)/include`"
++LDFLAGS += axtls.lib /libpath:"$(AXTLS_HOME)/$(STAGE)"
++
++$(TARGET) : $(OBJ)
++ $(LD) $(LDFLAGS) $(LDSHARED) /out:$@ $(OBJ)
++endif # WIN32
++
++clean::
++ @rm -f $(TARGET) *.i axTLSl* .depend
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/perl/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/perl/Makefile
+new file mode 100644
+index 0000000..92fd3c5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/perl/Makefile
+@@ -0,0 +1,91 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++AXTLS_HOME=../..
++
++include $(AXTLS_HOME)/config/.config
++include $(AXTLS_HOME)/config/makefile.conf
++
++all: lib
++
++ifdef CONFIG_PLATFORM_WIN32
++TARGET=$(AXTLS_HOME)/$(STAGE)/axtlsp.dll
++else
++TARGET=$(AXTLS_HOME)/$(STAGE)/libaxtlsp.so
++endif
++
++ifneq ($(MAKECMDGOALS), clean)
++
++ifdef CONFIG_PLATFORM_WIN32
++PERL5_CORE:=$(shell cygpath -w "$(CONFIG_PERL_CORE)")
++else
++PERL5_CORE= $(shell perl -e 'use Config; print $$Config{archlib};')/CORE
++endif
++
++all: test_perl
++
++test_perl:
++ @if ! [ -d "$(PERL5_CORE)" ]; then \
++ echo "*** Error: Perl not installed at $(CONFIG_PERL_CORE) - go to " \
++ "http://www.cpan.org/authors/id/G/GR/GRAHAMC/SiePerl-5.8.0-bin-1.0-Win32.INSTALL.exe" && exit 1; \
++ fi
++
++endif
++
++lib: $(TARGET)
++OBJ:=axTLSp_wrap.o
++include $(AXTLS_HOME)/config/makefile.post
++
++ifndef CONFIG_PLATFORM_WIN32 # Linux/Unix/Cygwin
++
++#
++# Could have used libperl.a, but it increases the library to over 1MB, so just
++# use libperl.so. But this needs to be in the shared library path for things to
++# work.
++#
++$(TARGET) : $(OBJ)
++ $(LD) $(LDFLAGS) -L$(AXTLS_HOME)/$(STAGE) -L$(PERL5_CORE) $(LDSHARED) -o $@ $(OBJ) -laxtls -lperl
++ifdef CONFIG_PLATFORM_CYGWIN
++ cd $(AXTLS_HOME)/$(STAGE); ln -sf $(notdir $@) axtlsp.dll
++endif
++ @install axtlsp.pm $(AXTLS_HOME)/$(STAGE)
++
++CFLAGS += -D_GNU_SOURCE -I$(PERL5_CORE)
++else
++CFLAGS += /I"$(PERL5_CORE)"
++LDFLAGS += $(CONFIG_PERL_LIB) /libpath:"$(PERL5_CORE)" axtls.lib /libpath:"$(AXTLS_HOME)/$(STAGE)"
++
++$(TARGET) : $(OBJ)
++ $(LD) $(LDFLAGS) $(LDSHARED) /out:$@ $(OBJ)
++ install axtlsp.pm $(AXTLS_HOME)/$(STAGE)
++endif # WIN32
++
++clean::
++ @rm -f $(TARGET) axtls* *.i axTLSp* *.c .depend $(AXTLS_HOME)/$(STAGE)/axtlsp.pm
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/Makefile
+new file mode 100644
+index 0000000..7da60d0
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/Makefile
+@@ -0,0 +1,35 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++include ../../config/.config
++include ../../config/makefile.conf
++
++clean::
++ @rm -f axssl* axInterface.vb
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/axTLSvb.vb b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/axTLSvb.vb
+new file mode 100644
+index 0000000..9388273
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/axTLSvb.vb
+@@ -0,0 +1,200 @@
++'
++' Copyright (c) 2007, Cameron Rich
++'
++' All rights reserved.
++'
++' Redistribution and use in source and binary forms, with or without
++' modification, are permitted provided that the following conditions are met:
++'
++' * Redistributions of source code must retain the above copyright notice,
++' this list of conditions and the following disclaimer.
++' * Redistributions in binary form must reproduce the above copyright
++' notice, this list of conditions and the following disclaimer in the
++' documentation and/or other materials provided with the distribution.
++' * Neither the name of the axTLS project nor the names of its
++' contributors may be used to endorse or promote products derived
++' from this software without specific prior written permission.
++'
++' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++' "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++' LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++' A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++' CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++' TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++' DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++' OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++' NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++' THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++'
++
++'
++' A wrapper around the unmanaged Integererface to give a semi-decent VB.NET API
++'
++
++Imports System
++Imports System.Runtime.InteropServices
++Imports System.Net.Sockets
++Imports axTLSvb
++
++Namespace axTLSvb
++ Public Class SSL
++ Public m_ssl As IntPtr
++
++ Public Sub New(ByRef ip As IntPtr)
++ m_ssl = ip
++ End Sub
++
++ Public Sub Dispose()
++ axtls.ssl_free(m_ssl)
++ End Sub
++
++ Public Function HandshakeStatus() As Integer
++ Return axtls.ssl_handshake_status(m_ssl)
++ End Function
++
++ Public Function GetCipherId() As Byte
++ Return axtls.ssl_get_cipher_id(m_ssl)
++ End Function
++
++ Public Function GetSessionId() As Byte()
++ Dim ptr As IntPtr = axtls.ssl_get_session_id(m_ssl)
++ Dim sess_id_size As Integer = axtls.ssl_get_session_id_size(m_ssl)
++ Dim result(sess_id_size-1) As Byte
++ Marshal.Copy(ptr, result, 0, sess_id_size)
++ Return result
++ End Function
++
++ Public Function GetCertificateDN(component As Integer) As String
++ Return axtls.ssl_get_cert_dn(m_ssl, component)
++ End Function
++ End Class
++
++ Public Class SSLUtil
++ Private dummy As Integer ' need something here
++
++ Public Shared Function BuildMode() As Integer
++ Return axtls.ssl_get_config(axtls.SSL_BUILD_MODE)
++ End Function
++
++ Public Shared Function MaxCerts() As Integer
++ Return axtls.ssl_get_config(axtls.SSL_MAX_CERT_CFG_OFFSET)
++ End Function
++
++ Public Shared Function MaxCACerts() As Integer
++ Return axtls.ssl_get_config(axtls.SSL_MAX_CA_CERT_CFG_OFFSET)
++ End Function
++
++ Public Shared Function HasPEM() As Boolean
++ If axtls.ssl_get_config(axtls.SSL_HAS_PEM) > 0 Then
++ Return True
++ Else
++ Return False
++ End If
++ End Function
++
++ Public Shared Sub DisplayError(ByVal error_code As Integer)
++ axtls.ssl_display_error(error_code)
++ End Sub
++
++ Public Shared Function Version() As String
++ Return axtls.ssl_version()
++ End Function
++ End Class
++
++ Public Class SSLCTX
++ Protected m_ctx As IntPtr
++
++ Protected Sub New(ByVal options As Integer, _
++ ByVal num_sessions As Integer)
++ m_ctx = axtls.ssl_ctx_new(options, num_sessions)
++ End Sub
++
++ Public Sub Dispose()
++ axtls.ssl_ctx_free(m_ctx)
++ End Sub
++
++ Public Function Read(ByVal ssl As SSL, ByRef in_data As Byte()) As Integer
++ Dim ptr As IntPtr = IntPtr.Zero
++ Dim ret as Integer = axtls.ssl_read(ssl.m_ssl, ptr)
++
++ If ret > axtls.SSL_OK Then
++ ReDim in_data(ret)
++ Marshal.Copy(ptr, in_data, 0, ret)
++ Else
++ in_data = Nothing
++ End If
++
++ Return ret
++ End Function
++
++ Public Function Write(ByVal ssl As SSL, _
++ ByVal data As Byte(), len As Integer) As Integer
++ Return axtls.ssl_write(ssl.m_ssl, data, len)
++ End Function
++
++ Public Function Find(ByVal s As Socket) As SSL
++ Dim client_fd As Integer = s.Handle.ToInt32()
++ Return New SSL(axtls.ssl_find(m_ctx, client_fd))
++ End Function
++
++ Public Function VerifyCert(ByVal ssl As SSL) As Integer
++ Return axtls.ssl_verify_cert(ssl.m_ssl)
++ End Function
++
++ Public Function Renegotiate(ByVal ssl As SSL) As Integer
++ Return axtls.ssl_renegotiate(ssl.m_ssl)
++ End Function
++
++ Public Function ObjLoad(ByVal obj_type As Integer, _
++ ByVal filename As String, _
++ password As String) As Integer
++ Return axtls.ssl_obj_load(m_ctx, obj_type, filename, password)
++ End Function
++
++ Public Function ObjLoad(ByVal obj_type As Integer, _
++ ByVal data As Byte(), ByVal len As Integer, _
++ password As String) As Integer
++ Return axtls.ssl_obj_memory_load( _
++ m_ctx, obj_type, data, len, password)
++ End Function
++ End Class
++
++ Public Class SSLServer
++ Inherits SSLCTX
++
++ Public Sub New(ByVal options As Integer, _
++ ByVal num_sessions As Integer)
++ MyBase.New(options, num_sessions)
++ End Sub
++
++ Public Function Connect(ByVal s As Socket) As SSL
++ Dim client_fd As Integer = s.Handle.ToInt32()
++ Return New SSL(axtls.ssl_server_new(m_ctx, client_fd))
++ End Function
++ End Class
++
++ Public Class SSLClient
++ Inherits SSLCTX
++
++ Public Sub New(ByVal options As Integer, _
++ ByVal num_sessions As Integer)
++ MyBase.New(options, num_sessions)
++ End Sub
++
++ Public Function Connect(ByVal s As Socket, _
++ ByVal session_id As Byte()) As SSL
++ Dim client_fd As Integer = s.Handle.ToInt32()
++ Dim sess_id_size As Byte
++ If session_id is Nothing Then
++ sess_id_size = 0
++ Else
++ sess_id_size = session_id.Length
++ End If
++
++ Return New SSL(axtls.ssl_client_new(m_ctx, client_fd, session_id, _
++ sess_id_size))
++ End Function
++
++ End Class
++End Namespace
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/.config b/feeds/luci/libs/luci-lib-nixio/axTLS/config/.config
+new file mode 100644
+index 0000000..46cd061
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/.config
+@@ -0,0 +1,112 @@
++#
++# Automatically generated make config: don't edit
++#
++HAVE_DOT_CONFIG=y
++CONFIG_PLATFORM_LINUX=y
++# CONFIG_PLATFORM_CYGWIN is not set
++# CONFIG_PLATFORM_WIN32 is not set
++
++#
++# General Configuration
++#
++PREFIX="/usr"
++# CONFIG_DEBUG is not set
++CONFIG_STRIP_UNWANTED_SECTIONS=y
++# CONFIG_VISUAL_STUDIO_7_0 is not set
++# CONFIG_VISUAL_STUDIO_8_0 is not set
++CONFIG_VISUAL_STUDIO_7_0_BASE=""
++CONFIG_VISUAL_STUDIO_8_0_BASE=""
++CONFIG_EXTRA_CFLAGS_OPTIONS="-fpic"
++CONFIG_EXTRA_LDFLAGS_OPTIONS=""
++
++#
++# SSL Library
++#
++# CONFIG_SSL_SERVER_ONLY is not set
++# CONFIG_SSL_CERT_VERIFICATION is not set
++# CONFIG_SSL_ENABLE_CLIENT is not set
++CONFIG_SSL_FULL_MODE=y
++# CONFIG_SSL_SKELETON_MODE is not set
++# CONFIG_SSL_PROT_LOW is not set
++CONFIG_SSL_PROT_MEDIUM=y
++# CONFIG_SSL_PROT_HIGH is not set
++# CONFIG_SSL_USE_DEFAULT_KEY is not set
++CONFIG_SSL_PRIVATE_KEY_LOCATION="/etc/nixio/rsa_main.der"
++CONFIG_SSL_PRIVATE_KEY_PASSWORD=""
++CONFIG_SSL_X509_CERT_LOCATION=""
++# CONFIG_SSL_GENERATE_X509_CERT is not set
++CONFIG_SSL_X509_COMMON_NAME=""
++CONFIG_SSL_X509_ORGANIZATION_NAME=""
++CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME=""
++# CONFIG_SSL_ENABLE_V23_HANDSHAKE is not set
++# CONFIG_SSL_HAS_PEM is not set
++# CONFIG_SSL_USE_PKCS12 is not set
++CONFIG_SSL_EXPIRY_TIME=24
++CONFIG_X509_MAX_CA_CERTS=4
++CONFIG_SSL_MAX_CERTS=2
++CONFIG_SSL_CTX_MUTEXING=y
++CONFIG_USE_DEV_URANDOM=y
++# CONFIG_WIN32_USE_CRYPTO_LIB is not set
++# CONFIG_OPENSSL_COMPATIBLE is not set
++# CONFIG_PERFORMANCE_TESTING is not set
++# CONFIG_SSL_TEST is not set
++# CONFIG_AXHTTPD is not set
++# CONFIG_HTTP_STATIC_BUILD is not set
++CONFIG_HTTP_PORT=0
++CONFIG_HTTP_HTTPS_PORT=0
++CONFIG_HTTP_SESSION_CACHE_SIZE=0
++CONFIG_HTTP_WEBROOT=""
++CONFIG_HTTP_TIMEOUT=0
++# CONFIG_HTTP_HAS_CGI is not set
++CONFIG_HTTP_CGI_EXTENSIONS=""
++# CONFIG_HTTP_ENABLE_LUA is not set
++CONFIG_HTTP_LUA_PREFIX=""
++CONFIG_HTTP_LUA_CGI_LAUNCHER=""
++# CONFIG_HTTP_BUILD_LUA is not set
++# CONFIG_HTTP_DIRECTORIES is not set
++# CONFIG_HTTP_HAS_AUTHORIZATION is not set
++# CONFIG_HTTP_HAS_IPV6 is not set
++# CONFIG_HTTP_ENABLE_DIFFERENT_USER is not set
++CONFIG_HTTP_USER=""
++# CONFIG_HTTP_VERBOSE is not set
++# CONFIG_HTTP_IS_DAEMON is not set
++
++#
++# Language Bindings
++#
++# CONFIG_BINDINGS is not set
++# CONFIG_CSHARP_BINDINGS is not set
++# CONFIG_VBNET_BINDINGS is not set
++CONFIG_DOT_NET_FRAMEWORK_BASE=""
++# CONFIG_JAVA_BINDINGS is not set
++CONFIG_JAVA_HOME=""
++# CONFIG_PERL_BINDINGS is not set
++CONFIG_PERL_CORE=""
++CONFIG_PERL_LIB=""
++# CONFIG_LUA_BINDINGS is not set
++CONFIG_LUA_CORE=""
++
++#
++# Samples
++#
++# CONFIG_SAMPLES is not set
++# CONFIG_C_SAMPLES is not set
++# CONFIG_CSHARP_SAMPLES is not set
++# CONFIG_VBNET_SAMPLES is not set
++# CONFIG_JAVA_SAMPLES is not set
++# CONFIG_PERL_SAMPLES is not set
++# CONFIG_LUA_SAMPLES is not set
++
++#
++# BigInt Options
++#
++# CONFIG_BIGINT_CLASSICAL is not set
++# CONFIG_BIGINT_MONTGOMERY is not set
++CONFIG_BIGINT_BARRETT=y
++CONFIG_BIGINT_CRT=y
++# CONFIG_BIGINT_KARATSUBA is not set
++MUL_KARATSUBA_THRESH=0
++SQU_KARATSUBA_THRESH=0
++CONFIG_BIGINT_SLIDING_WINDOW=y
++CONFIG_BIGINT_SQUARE=y
++# CONFIG_BIGINT_CHECK_ON is not set
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/Config.in b/feeds/luci/libs/luci-lib-nixio/axTLS/config/Config.in
+new file mode 100644
+index 0000000..dc40756
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/Config.in
+@@ -0,0 +1,114 @@
++#
++# For a description of the syntax of this configuration file,
++# see scripts/config/Kconfig-language.txt
++#
++
++mainmenu "axTLS Configuration"
++
++config HAVE_DOT_CONFIG
++ bool
++ default y
++
++choice
++ prompt "Platform"
++ default CONFIG_PLATFORM_LINUX
++
++config CONFIG_PLATFORM_LINUX
++ bool "Linux"
++
++config CONFIG_PLATFORM_CYGWIN
++ bool "Cygwin"
++
++config CONFIG_PLATFORM_WIN32
++ bool "Win32"
++
++endchoice
++
++menu "General Configuration"
++
++config PREFIX
++ string "axTLS installation prefix"
++ depends on !CONFIG_PLATFORM_WIN32
++ default "/usr/local"
++ help
++ Define your directory to install axTLS files/subdirs in.
++
++config CONFIG_DEBUG
++ bool "Build axTLS with Debugging symbols"
++ default n
++ help
++ Say Y here if you wish to compile axTLS with debugging symbols.
++ This will allow you to use a debugger to examine axTLS internals.
++ This increases the size of the binary considerably and should only be
++ used when doing development.
++ If you are doing development and want to debug axTLS, answer Y.
++
++ Most people should answer N.
++
++config CONFIG_STRIP_UNWANTED_SECTIONS
++ depends on !CONFIG_PLATFORM_WIN32 && !CONFIG_DEBUG
++ bool "Strip unwanted sections from elf binaries"
++ default y
++ help
++ Strip unwanted sections from the resulting binaries
++
++menu "Microsoft Compiler Options"
++depends on CONFIG_PLATFORM_WIN32
++
++choice
++ prompt "Compiler"
++ depends on CONFIG_PLATFORM_WIN32
++ default CONFIG_VISUAL_STUDIO_7_0
++
++config CONFIG_VISUAL_STUDIO_7_0
++ bool "Visual Studio 7.0 (2003)"
++ help
++ Use Microsoft's Visual Studio 2003 platform.
++
++config CONFIG_VISUAL_STUDIO_8_0
++ bool "Visual Studio 8.0 (2005)"
++ help
++ Use Microsoft's Visual Studio 2005 platform.
++
++endchoice
++
++config CONFIG_VISUAL_STUDIO_7_0_BASE
++ string "Base"
++ depends on CONFIG_VISUAL_STUDIO_7_0
++ default "c:\\Program Files\\Microsoft Visual Studio .NET 2003"
++
++config CONFIG_VISUAL_STUDIO_8_0_BASE
++ string "Base"
++ depends on CONFIG_VISUAL_STUDIO_8_0
++ default "c:\\Program Files\\Microsoft Visual Studio 8"
++
++endmenu
++
++config CONFIG_EXTRA_CFLAGS_OPTIONS
++ string "Any extra CFLAGS options for the compiler?"
++ help
++ Do you want to pass any extra CFLAGS options to the compiler as
++ you build axTLS? If so, this is the option for you... For
++ example, if you want to add some simple compiler switches (like
++ -march=i686), or check for warnings using -Werror, just those
++ options here.
++
++config CONFIG_EXTRA_LDFLAGS_OPTIONS
++ string "Any extra LDFLAGS options for the compiler?"
++ help
++ Do you want to pass any extra LDFLAGS options to the compiler?
++
++endmenu
++
++source ssl/Config.in
++config CONFIG_AXHTTPD
++ bool "Enable HTTP/HTTPS Web Server"
++ default y
++ help
++ Build the AXHTTPD web server
++
++source httpd/Config.in
++source bindings/Config.in
++source samples/Config.in
++source ssl/BigIntConfig.in
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/JMeter.jmx b/feeds/luci/libs/luci-lib-nixio/axTLS/config/JMeter.jmx
+new file mode 100755
+index 0000000..f62c03f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/JMeter.jmx
+@@ -0,0 +1,247 @@
++<jmeterTestPlan version="1.2" properties="1.8">
++ <hashTree>
++ <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="axhttpd Test Plan" enabled="true">
++ <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
++ <collectionProp name="Arguments.arguments"/>
++ </elementProp>
++ <stringProp name="TestPlan.user_define_classpath"></stringProp>
++ <boolProp name="TestPlan.serialize_threadgroups">true</boolProp>
++ <boolProp name="TestPlan.functional_mode">false</boolProp>
++ <stringProp name="TestPlan.comments"></stringProp>
++ </TestPlan>
++ <hashTree>
++ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Test 1" enabled="true">
++ <longProp name="ThreadGroup.start_time">1152004173000</longProp>
++ <stringProp name="ThreadGroup.delay"></stringProp>
++ <stringProp name="ThreadGroup.duration"></stringProp>
++ <stringProp name="ThreadGroup.num_threads">16</stringProp>
++ <boolProp name="ThreadGroup.scheduler">false</boolProp>
++ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
++ <stringProp name="LoopController.loops">10</stringProp>
++ <boolProp name="LoopController.continue_forever">false</boolProp>
++ </elementProp>
++ <longProp name="ThreadGroup.end_time">1152004173000</longProp>
++ <stringProp name="ThreadGroup.on_sample_error">stopthread</stringProp>
++ <stringProp name="ThreadGroup.ramp_time">0</stringProp>
++ </ThreadGroup>
++ <hashTree>
++ <HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Normal" enabled="true">
++ <stringProp name="HTTPSampler.path">/index.html</stringProp>
++ <stringProp name="HTTPSampler.method">GET</stringProp>
++ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
++ <stringProp name="HTTPSampler.protocol"></stringProp>
++ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
++ <stringProp name="HTTPSampler.port">80</stringProp>
++ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
++ <collectionProp name="Arguments.arguments"/>
++ </elementProp>
++ <stringProp name="HTTPSampler.mimetype"></stringProp>
++ <stringProp name="HTTPSampler.FILE_FIELD"></stringProp>
++ <stringProp name="HTTPSampler.monitor">false</stringProp>
++ <stringProp name="HTTPSampler.domain">127.0.0.1</stringProp>
++ <stringProp name="HTTPSampler.FILE_NAME"></stringProp>
++ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
++ </HTTPSampler>
++ <hashTree/>
++ </hashTree>
++ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Test 2" enabled="true">
++ <longProp name="ThreadGroup.start_time">1152004173000</longProp>
++ <stringProp name="ThreadGroup.delay"></stringProp>
++ <stringProp name="ThreadGroup.duration"></stringProp>
++ <stringProp name="ThreadGroup.num_threads">16</stringProp>
++ <boolProp name="ThreadGroup.scheduler">false</boolProp>
++ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
++ <stringProp name="LoopController.loops">10</stringProp>
++ <boolProp name="LoopController.continue_forever">false</boolProp>
++ </elementProp>
++ <longProp name="ThreadGroup.end_time">1152004173000</longProp>
++ <stringProp name="ThreadGroup.on_sample_error">stopthread</stringProp>
++ <stringProp name="ThreadGroup.ramp_time">0</stringProp>
++ </ThreadGroup>
++ <hashTree>
++ <HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="RC4" enabled="true">
++ <stringProp name="HTTPSampler.path">/index.html</stringProp>
++ <stringProp name="HTTPSampler.method">GET</stringProp>
++ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
++ <stringProp name="HTTPSampler.protocol">HTTPS</stringProp>
++ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
++ <stringProp name="HTTPSampler.port">443</stringProp>
++ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
++ <collectionProp name="Arguments.arguments"/>
++ </elementProp>
++ <stringProp name="HTTPSampler.mimetype"></stringProp>
++ <stringProp name="HTTPSampler.FILE_FIELD"></stringProp>
++ <stringProp name="HTTPSampler.monitor">false</stringProp>
++ <stringProp name="HTTPSampler.domain">127.0.0.1</stringProp>
++ <stringProp name="HTTPSampler.FILE_NAME"></stringProp>
++ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
++ </HTTPSampler>
++ <hashTree/>
++ </hashTree>
++ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Test 3" enabled="true">
++ <longProp name="ThreadGroup.start_time">1152004173000</longProp>
++ <stringProp name="ThreadGroup.delay"></stringProp>
++ <stringProp name="ThreadGroup.duration"></stringProp>
++ <stringProp name="ThreadGroup.num_threads">16</stringProp>
++ <boolProp name="ThreadGroup.scheduler">false</boolProp>
++ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
++ <stringProp name="LoopController.loops">10</stringProp>
++ <boolProp name="LoopController.continue_forever">false</boolProp>
++ </elementProp>
++ <longProp name="ThreadGroup.end_time">1152004173000</longProp>
++ <stringProp name="ThreadGroup.on_sample_error">stopthread</stringProp>
++ <stringProp name="ThreadGroup.ramp_time">0</stringProp>
++ </ThreadGroup>
++ <hashTree>
++ <HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="AES128" enabled="true">
++ <stringProp name="HTTPSampler.path">/index.html</stringProp>
++ <stringProp name="HTTPSampler.method">GET</stringProp>
++ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
++ <stringProp name="HTTPSampler.protocol">HTTPS</stringProp>
++ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
++ <stringProp name="HTTPSampler.port">2443</stringProp>
++ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
++ <collectionProp name="Arguments.arguments"/>
++ </elementProp>
++ <stringProp name="HTTPSampler.mimetype"></stringProp>
++ <stringProp name="HTTPSampler.FILE_FIELD"></stringProp>
++ <stringProp name="HTTPSampler.monitor">false</stringProp>
++ <stringProp name="HTTPSampler.domain">127.0.0.1</stringProp>
++ <stringProp name="HTTPSampler.FILE_NAME"></stringProp>
++ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
++ </HTTPSampler>
++ <hashTree/>
++ </hashTree>
++ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Test 4" enabled="true">
++ <longProp name="ThreadGroup.start_time">1152004173000</longProp>
++ <stringProp name="ThreadGroup.delay"></stringProp>
++ <stringProp name="ThreadGroup.duration"></stringProp>
++ <stringProp name="ThreadGroup.num_threads">16</stringProp>
++ <boolProp name="ThreadGroup.scheduler">false</boolProp>
++ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
++ <stringProp name="LoopController.loops">10</stringProp>
++ <boolProp name="LoopController.continue_forever">false</boolProp>
++ </elementProp>
++ <longProp name="ThreadGroup.end_time">1152004173000</longProp>
++ <stringProp name="ThreadGroup.on_sample_error">stopthread</stringProp>
++ <stringProp name="ThreadGroup.ramp_time">0</stringProp>
++ </ThreadGroup>
++ <hashTree>
++ <HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="AES256" enabled="true">
++ <stringProp name="HTTPSampler.path">/index.html</stringProp>
++ <stringProp name="HTTPSampler.method">GET</stringProp>
++ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
++ <stringProp name="HTTPSampler.protocol">HTTPS</stringProp>
++ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
++ <stringProp name="HTTPSampler.port">3443</stringProp>
++ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
++ <collectionProp name="Arguments.arguments"/>
++ </elementProp>
++ <stringProp name="HTTPSampler.mimetype"></stringProp>
++ <stringProp name="HTTPSampler.FILE_FIELD"></stringProp>
++ <stringProp name="HTTPSampler.monitor">false</stringProp>
++ <stringProp name="HTTPSampler.domain">127.0.0.1</stringProp>
++ <stringProp name="HTTPSampler.FILE_NAME"></stringProp>
++ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
++ </HTTPSampler>
++ <hashTree/>
++ </hashTree>
++ <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Test 5" enabled="true">
++ <longProp name="ThreadGroup.start_time">1152004173000</longProp>
++ <stringProp name="ThreadGroup.delay"></stringProp>
++ <stringProp name="ThreadGroup.duration"></stringProp>
++ <stringProp name="ThreadGroup.num_threads">16</stringProp>
++ <boolProp name="ThreadGroup.scheduler">false</boolProp>
++ <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
++ <stringProp name="LoopController.loops">10</stringProp>
++ <boolProp name="LoopController.continue_forever">false</boolProp>
++ </elementProp>
++ <longProp name="ThreadGroup.end_time">1152004173000</longProp>
++ <stringProp name="ThreadGroup.on_sample_error">stopthread</stringProp>
++ <stringProp name="ThreadGroup.ramp_time">0</stringProp>
++ </ThreadGroup>
++ <hashTree>
++ <HTTPSampler guiclass="HttpTestSampleGui" testclass="HTTPSampler" testname="Skeleton (RC4)" enabled="true">
++ <stringProp name="HTTPSampler.path">/index.html</stringProp>
++ <stringProp name="HTTPSampler.method">GET</stringProp>
++ <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
++ <stringProp name="HTTPSampler.protocol">HTTPS</stringProp>
++ <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
++ <stringProp name="HTTPSampler.port">1443</stringProp>
++ <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
++ <collectionProp name="Arguments.arguments"/>
++ </elementProp>
++ <stringProp name="HTTPSampler.mimetype"></stringProp>
++ <stringProp name="HTTPSampler.FILE_FIELD"></stringProp>
++ <stringProp name="HTTPSampler.monitor">false</stringProp>
++ <stringProp name="HTTPSampler.domain">127.0.0.1</stringProp>
++ <stringProp name="HTTPSampler.FILE_NAME"></stringProp>
++ <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
++ </HTTPSampler>
++ <hashTree/>
++ </hashTree>
++ <ResultCollector guiclass="StatGraphVisualizer" testclass="ResultCollector" testname="Aggregate Graph" enabled="true">
++ <objProp>
++ <value class="SampleSaveConfiguration">
++ <time>true</time>
++ <latency>true</latency>
++ <timestamp>true</timestamp>
++ <success>true</success>
++ <label>true</label>
++ <code>true</code>
++ <message>true</message>
++ <threadName>true</threadName>
++ <dataType>true</dataType>
++ <encoding>false</encoding>
++ <assertions>true</assertions>
++ <subresults>true</subresults>
++ <responseData>false</responseData>
++ <samplerData>false</samplerData>
++ <xml>false</xml>
++ <fieldNames>false</fieldNames>
++ <responseHeaders>false</responseHeaders>
++ <requestHeaders>false</requestHeaders>
++ <responseDataOnError>false</responseDataOnError>
++ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
++ <assertionsResultsToSave>0</assertionsResultsToSave>
++ </value>
++ <name>saveConfig</name>
++ </objProp>
++ <stringProp name="filename"></stringProp>
++ <boolProp name="ResultCollector.error_logging">false</boolProp>
++ </ResultCollector>
++ <hashTree/>
++ <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="false">
++ <objProp>
++ <value class="SampleSaveConfiguration">
++ <time>true</time>
++ <latency>true</latency>
++ <timestamp>true</timestamp>
++ <success>true</success>
++ <label>true</label>
++ <code>true</code>
++ <message>true</message>
++ <threadName>true</threadName>
++ <dataType>true</dataType>
++ <encoding>false</encoding>
++ <assertions>true</assertions>
++ <subresults>true</subresults>
++ <responseData>false</responseData>
++ <samplerData>false</samplerData>
++ <xml>false</xml>
++ <fieldNames>false</fieldNames>
++ <responseHeaders>false</responseHeaders>
++ <requestHeaders>false</requestHeaders>
++ <responseDataOnError>false</responseDataOnError>
++ <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
++ <assertionsResultsToSave>0</assertionsResultsToSave>
++ </value>
++ <name>saveConfig</name>
++ </objProp>
++ <stringProp name="filename"></stringProp>
++ <boolProp name="ResultCollector.error_logging">false</boolProp>
++ </ResultCollector>
++ <hashTree/>
++ </hashTree>
++ </hashTree>
++</jmeterTestPlan>
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/Rules.mak b/feeds/luci/libs/luci-lib-nixio/axTLS/config/Rules.mak
+new file mode 100644
+index 0000000..c0308da
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/Rules.mak
+@@ -0,0 +1,220 @@
++# Rules.make for busybox
++#
++# Copyright (C) 1999-2005 by Erik Andersen <andersen@codepoet.org>
++#
++# Licensed under GPLv2, see the file LICENSE in this tarball for details.
++#
++
++# Pull in the user's busybox configuration
++ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
++-include $(top_builddir)/.config
++endif
++
++#--------------------------------------------------------
++PROG := busybox
++MAJOR_VERSION :=1
++MINOR_VERSION :=1
++SUBLEVEL_VERSION:=0
++EXTRAVERSION :=
++VERSION :=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL_VERSION)$(EXTRAVERSION)
++BUILDTIME := $(shell TZ=UTC date -u "+%Y.%m.%d-%H:%M%z")
++
++
++#--------------------------------------------------------
++# With a modern GNU make(1) (highly recommended, that's what all the
++# developers use), all of the following configuration values can be
++# overridden at the command line. For example:
++# make CROSS=powerpc-linux- top_srcdir="$HOME/busybox" PREFIX=/mnt/app
++#--------------------------------------------------------
++
++# If you are running a cross compiler, you will want to set 'CROSS'
++# to something more interesting... Target architecture is determined
++# by asking the CC compiler what arch it compiles things for, so unless
++# your compiler is broken, you should not need to specify TARGET_ARCH
++CROSS =$(subst ",, $(strip $(CROSS_COMPILER_PREFIX)))
++CC = $(CROSS)gcc
++AR = $(CROSS)ar
++AS = $(CROSS)as
++LD = $(CROSS)ld
++NM = $(CROSS)nm
++STRIP = $(CROSS)strip
++CPP = $(CC) -E
++# MAKEFILES = $(top_builddir)/.config
++RM = rm
++RM_F = $(RM) -f
++LN = ln
++LN_S = $(LN) -s
++MKDIR = mkdir
++MKDIR_P = $(MKDIR) -p
++MV = mv
++CP = cp
++
++
++# What OS are you compiling busybox for? This allows you to include
++# OS specific things, syscall overrides, etc.
++TARGET_OS=linux
++
++# Select the compiler needed to build binaries for your development system
++HOSTCC = gcc
++HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
++
++# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc.
++LC_ALL:= C
++
++# If you want to add some simple compiler switches (like -march=i686),
++# especially from the command line, use this instead of CFLAGS directly.
++# For optimization overrides, it's better still to set OPTIMIZATION.
++CFLAGS_EXTRA=$(subst ",, $(strip $(EXTRA_CFLAGS_OPTIONS)))
++
++# To compile vs some other alternative libc, you may need to use/adjust
++# the following lines to meet your needs...
++#
++# If you are using Red Hat 6.x with the compatible RPMs (for developing under
++# Red Hat 5.x and glibc 2.0) uncomment the following. Be sure to read about
++# using the compatible RPMs (compat-*) at http://www.redhat.com !
++#LIBCDIR:=/usr/i386-glibc20-linux
++#
++# For other libraries, you are on your own. But these may (or may not) help...
++#LDFLAGS+=-nostdlib
++#LIBRARIES:=$(LIBCDIR)/lib/libc.a -lgcc
++#CROSS_CFLAGS+=-nostdinc -I$(LIBCDIR)/include -I$(GCCINCDIR) -funsigned-char
++#GCCINCDIR:=$(shell gcc -print-search-dirs | sed -ne "s/install: \(.*\)/\1include/gp")
++
++WARNINGS=-Wall -Wstrict-prototypes -Wshadow
++CFLAGS=-I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir)
++ARFLAGS=cru
++
++
++# gcc centric. Perhaps fiddle with findstring gcc,$(CC) for the rest
++# get the CC MAJOR/MINOR version
++CC_MAJOR:=$(shell printf "%02d" $(shell echo __GNUC__ | $(CC) -E -xc - | tail -n 1))
++CC_MINOR:=$(shell printf "%02d" $(shell echo __GNUC_MINOR__ | $(CC) -E -xc - | tail -n 1))
++
++#--------------------------------------------------------
++export VERSION BUILDTIME HOSTCC HOSTCFLAGS CROSS CC AR AS LD NM STRIP CPP
++ifeq ($(strip $(TARGET_ARCH)),)
++TARGET_ARCH:=$(shell $(CC) -dumpmachine | sed -e s'/-.*//' \
++ -e 's/i.86/i386/' \
++ -e 's/sparc.*/sparc/' \
++ -e 's/arm.*/arm/g' \
++ -e 's/m68k.*/m68k/' \
++ -e 's/ppc/powerpc/g' \
++ -e 's/v850.*/v850/g' \
++ -e 's/sh[234]/sh/' \
++ -e 's/mips-.*/mips/' \
++ -e 's/mipsel-.*/mipsel/' \
++ -e 's/cris.*/cris/' \
++ )
++endif
++
++# A nifty macro to make testing gcc features easier
++check_gcc=$(shell \
++ if [ "$(1)" != "" ]; then \
++ if $(CC) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; \
++ then echo "$(1)"; else echo "$(2)"; fi \
++ fi)
++
++# Setup some shortcuts so that silent mode is silent like it should be
++ifeq ($(subst s,,$(MAKEFLAGS)),$(MAKEFLAGS))
++export MAKE_IS_SILENT=n
++SECHO=@echo
++else
++export MAKE_IS_SILENT=y
++SECHO=-@false
++endif
++
++CFLAGS+=$(call check_gcc,-funsigned-char,)
++
++#--------------------------------------------------------
++# Arch specific compiler optimization stuff should go here.
++# Unless you want to override the defaults, do not set anything
++# for OPTIMIZATION...
++
++# use '-Os' optimization if available, else use -O2
++OPTIMIZATION:=$(call check_gcc,-Os,-O2)
++
++# Some nice architecture specific optimizations
++ifeq ($(strip $(TARGET_ARCH)),arm)
++ OPTIMIZATION+=-fstrict-aliasing
++endif
++ifeq ($(strip $(TARGET_ARCH)),i386)
++ OPTIMIZATION+=$(call check_gcc,-march=i386,)
++ OPTIMIZATION+=$(call check_gcc,-mpreferred-stack-boundary=2,)
++ OPTIMIZATION+=$(call check_gcc,-falign-functions=0 -falign-jumps=0 -falign-loops=0,\
++ -malign-functions=0 -malign-jumps=0 -malign-loops=0)
++endif
++OPTIMIZATIONS:=$(OPTIMIZATION) -fomit-frame-pointer
++
++#
++#--------------------------------------------------------
++# If you're going to do a lot of builds with a non-vanilla configuration,
++# it makes sense to adjust parameters above, so you can type "make"
++# by itself, instead of following it by the same half-dozen overrides
++# every time. The stuff below, on the other hand, is probably less
++# prone to casual user adjustment.
++#
++
++ifeq ($(strip $(CONFIG_LFS)),y)
++ # For large file summit support
++ CFLAGS+=-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
++endif
++ifeq ($(strip $(CONFIG_DMALLOC)),y)
++ # For testing mem leaks with dmalloc
++ CFLAGS+=-DDMALLOC
++ LIBRARIES:=-ldmalloc
++else
++ ifeq ($(strip $(CONFIG_EFENCE)),y)
++ LIBRARIES:=-lefence
++ endif
++endif
++ifeq ($(strip $(CONFIG_DEBUG)),y)
++ CFLAGS +=$(WARNINGS) -g -D_GNU_SOURCE
++ LDFLAGS +=-Wl,-warn-common
++ STRIPCMD:=/bin/true -Not_stripping_since_we_are_debugging
++else
++ CFLAGS+=$(WARNINGS) $(OPTIMIZATIONS) -D_GNU_SOURCE -DNDEBUG
++ LDFLAGS += -Wl,-warn-common
++ STRIPCMD:=$(STRIP) -s --remove-section=.note --remove-section=.comment
++endif
++ifeq ($(strip $(CONFIG_STATIC)),y)
++ LDFLAGS += --static
++endif
++
++ifeq ($(strip $(CONFIG_SELINUX)),y)
++ LIBRARIES += -lselinux
++endif
++
++ifeq ($(strip $(PREFIX)),)
++ PREFIX:=`pwd`/_install
++endif
++
++# Additional complications due to support for pristine source dir.
++# Include files in the build directory should take precedence over
++# the copy in top_srcdir, both during the compilation phase and the
++# shell script that finds the list of object files.
++# Work in progress by <ldoolitt@recycle.lbl.gov>.
++
++
++OBJECTS:=$(APPLET_SOURCES:.c=.o) busybox.o usage.o applets.o
++CFLAGS += $(CROSS_CFLAGS)
++ifdef BB_INIT_SCRIPT
++ CFLAGS += -DINIT_SCRIPT='"$(BB_INIT_SCRIPT)"'
++endif
++
++# Put user-supplied flags at the end, where they
++# have a chance of winning.
++CFLAGS += $(CFLAGS_EXTRA)
++
++#------------------------------------------------------------
++# Installation options
++ifeq ($(strip $(CONFIG_INSTALL_APPLET_HARDLINKS)),y)
++INSTALL_OPTS=--hardlinks
++endif
++ifeq ($(strip $(CONFIG_INSTALL_APPLET_SYMLINKS)),y)
++INSTALL_OPTS=--symlinks
++endif
++ifeq ($(strip $(CONFIG_INSTALL_APPLET_DONT)),y)
++INSTALL_OPTS=
++endif
++
++.PHONY: dummy
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/axhttpd.aip b/feeds/luci/libs/luci-lib-nixio/axTLS/config/axhttpd.aip
+new file mode 100755
+index 0000000..412fe3b
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/axhttpd.aip
+@@ -0,0 +1,136 @@
++<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
++<DOCUMENT type="Advanced Installer" CreateVersion="3.9" version="6.0.1" modules="freeware" RootPath="." Language="en">
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
++ <ROW Property="ALLUSERS" Value="2"/>
++ <ROW Property="ARPCOMMENTS" Value="This installer database contains the logic and data required to install &lt;product name&gt;." ValueLocId="*"/>
++ <ROW Property="ARPPRODUCTICON" Value="controlPanelIcon.exe"/>
++ <ROW Property="ARPURLINFOABOUT" Value="http://axtls.cerocclub.com.au"/>
++ <ROW Property="BannerBitmap" Value="default_banner.bmp" Type="1"/>
++ <ROW Property="DialogBitmap" Value="default_dialog.bmp" Type="1"/>
++ <ROW Property="Manufacturer" Value="axTLS" ValueLocId="*"/>
++ <ROW Property="ProductCode" Value="1033:{F49FFA19-C243-4627-BE13-7DEDA4E700D0} "/>
++ <ROW Property="ProductLanguage" Value="1033"/>
++ <ROW Property="ProductName" Value="Axhttpd" ValueLocId="*"/>
++ <ROW Property="ProductVersion" Value="1.1.8"/>
++ <ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND"/>
++ <ROW Property="UpgradeCode" Value="{93E5623E-740C-449C-9770-EDABD392868D}"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
++ <ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
++ <ROW Directory="New_Folder_DIR" Directory_Parent="APPDIR" DefaultDir="include"/>
++ <ROW Directory="SHORTCUTDIR" Directory_Parent="TARGETDIR" DefaultDir="SHORTC~1|SHORTCUTDIR" IsPseudoRoot="1"/>
++ <ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
++ <ROW Directory="another_dir_DIR" Directory_Parent="test_dir_DIR" DefaultDir="anothe~1|another_dir"/>
++ <ROW Directory="bin_DIR" Directory_Parent="test_dir_DIR" DefaultDir="bin"/>
++ <ROW Directory="no_http_DIR" Directory_Parent="test_dir_DIR" DefaultDir="no_http"/>
++ <ROW Directory="no_ssl_DIR" Directory_Parent="test_dir_DIR" DefaultDir="no_ssl"/>
++ <ROW Directory="test_dir_DIR" Directory_Parent="www_DIR" DefaultDir="test_dir"/>
++ <ROW Directory="www_DIR" Directory_Parent="APPDIR" DefaultDir="www"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
++ <ROW Component="another_dir" ComponentId="{3F073789-DB33-40BC-BF88-922C6DF252EC}" Directory_="another_dir_DIR" Attributes="0"/>
++ <ROW Component="axhttpd.exe" ComponentId="{0AEFFA20-29FA-4304-8227-F9ED0E6B8A0A}" Directory_="APPDIR" Attributes="0" KeyPath="axhttpd.exe" FullKeyPath="APPDIR\axhttpd.exe"/>
++ <ROW Component="axssl.exe" ComponentId="{E1E96774-7BFC-45B9-BA33-FC0C631921FD}" Directory_="APPDIR" Attributes="0" KeyPath="axssl.exe" FullKeyPath="APPDIR\axssl.exe"/>
++ <ROW Component="axtls.dll" ComponentId="{4C741E75-A18A-4FC9-972C-C1EF583713EB}" Directory_="APPDIR" Attributes="0" KeyPath="axtls.dll" FullKeyPath="APPDIR\axtls.dll"/>
++ <ROW Component="axtls.jar" ComponentId="{796CB0A9-6214-4531-A330-9B37420B7799}" Directory_="APPDIR" Attributes="0" KeyPath="axtls.static.lib" FullKeyPath="APPDIR"/>
++ <ROW Component="bigint.h" ComponentId="{FC3E492B-D4F0-41FB-A977-76F6E9FE9FFE}" Directory_="New_Folder_DIR" Attributes="0" KeyPath="bigint.h" FullKeyPath="APPDIR\include"/>
++ <ROW Component="favicon.ico" ComponentId="{9A1AB507-100A-470D-A002-CD8262CA4913}" Directory_="www_DIR" Attributes="0" KeyPath="favicon.ico" FullKeyPath="APPDIR\www"/>
++ <ROW Component="htaccess" ComponentId="{F53CB1D5-A3B9-4401-B0BA-B6AB1DA860B7}" Directory_="no_ssl_DIR" Attributes="0" KeyPath="htaccess" FullKeyPath="APPDIR\www\test_dir\no_ssl"/>
++ <ROW Component="htaccess_1" ComponentId="{953D1999-CC00-4F85-9B48-2CD83ACAE2F9}" Directory_="no_http_DIR" Attributes="0" KeyPath="htaccess_1" FullKeyPath="APPDIR\www\test_dir\no_http"/>
++ <ROW Component="htaccess_2" ComponentId="{6F181A8B-B313-47E2-AF79-AABFDBD353D8}" Directory_="bin_DIR" Attributes="0" KeyPath="htaccess_2" FullKeyPath="APPDIR\www\test_dir\bin"/>
++ <ROW Component="htpasswd.exe" ComponentId="{9FE1AAD2-4E35-443A-AAE5-3A7D03A52AAA}" Directory_="APPDIR" Attributes="0" KeyPath="htpasswd.exe" FullKeyPath="APPDIR\htpasswd.exe"/>
++ <ROW Component="test_dir" ComponentId="{832C9295-CF2A-402E-BB3C-65BCBCBB5971}" Directory_="test_dir_DIR" Attributes="0"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
++ <ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0" Components="axhttpd.exe axssl.exe axtls.dll axtls.jar favicon.ico bigint.h htpasswd.exe another_dir htaccess htaccess_2 htaccess_1 test_dir"/>
++ <ATTRIBUTE name="CurrentFeature" value="MainFeature"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiFilesComponent">
++ <ROW File="axhttpd.exe" Component_="axhttpd.exe" FileName="axhttpd.exe" Attributes="0" SourcePath="..\_stage\axhttpd.exe" SelfReg="false" Sequence="1"/>
++ <ROW File="axssl.exe" Component_="axssl.exe" FileName="axssl.exe" Attributes="0" SourcePath="..\_stage\axssl.exe" SelfReg="false" Sequence="2"/>
++ <ROW File="axtls.dll" Component_="axtls.dll" FileName="axtls.dll" Attributes="0" SourcePath="..\_stage\axtls.dll" SelfReg="false" Sequence="3"/>
++ <ROW File="axtls.lib" Component_="axtls.jar" FileName="axtls.lib" Attributes="0" SourcePath="..\_stage\axtls.lib" SelfReg="false" Sequence="4"/>
++ <ROW File="axtls.static.lib" Component_="axtls.jar" FileName="axtlss~1.lib|axtls.static.lib" Attributes="0" SourcePath="..\_stage\axtls.static.lib" SelfReg="false" Sequence="5"/>
++ <ROW File="bigint.h" Component_="bigint.h" FileName="bigint.h" Attributes="0" SourcePath="..\crypto\bigint.h" SelfReg="false" Sequence="12"/>
++ <ROW File="bigint_impl.h" Component_="bigint.h" FileName="bigint~1.h|bigint_impl.h" Attributes="0" SourcePath="..\crypto\bigint_impl.h" SelfReg="false" Sequence="9"/>
++ <ROW File="crypto.h" Component_="bigint.h" FileName="crypto.h" Attributes="0" SourcePath="..\crypto\crypto.h" SelfReg="false" Sequence="10"/>
++ <ROW File="crypto_misc.h" Component_="bigint.h" FileName="crypto~1.h|crypto_misc.h" Attributes="0" SourcePath="..\ssl\crypto_misc.h" SelfReg="false" Sequence="21"/>
++ <ROW File="favicon.ico" Component_="favicon.ico" FileName="favicon.ico" Attributes="0" SourcePath="..\www\favicon.ico" SelfReg="false" Sequence="6"/>
++ <ROW File="htaccess" Component_="htaccess" FileName="htacce~1|.htaccess" Attributes="0" SourcePath="..\www\test_dir\no_ssl\.htaccess" SelfReg="false" Sequence="15"/>
++ <ROW File="htaccess_1" Component_="htaccess_1" FileName="htacce~1|.htaccess" Attributes="0" SourcePath="..\www\test_dir\no_http\.htaccess" SelfReg="false" Sequence="18"/>
++ <ROW File="htaccess_2" Component_="htaccess_2" FileName="htacce~1|.htaccess" Attributes="0" SourcePath="..\www\test_dir\bin\.htaccess" SelfReg="false" Sequence="17"/>
++ <ROW File="htpasswd" Component_="htaccess_1" FileName="htpass~1|.htpasswd" Attributes="0" SourcePath="..\www\test_dir\no_http\.htpasswd" SelfReg="false" Sequence="19"/>
++ <ROW File="htpasswd.exe" Component_="htpasswd.exe" FileName="htpasswd.exe" Attributes="0" SourcePath="..\_stage\htpasswd.exe" SelfReg="false" Sequence="14"/>
++ <ROW File="index.html" Component_="favicon.ico" FileName="index~1.htm|index.html" Attributes="0" SourcePath="..\www\index.html" SelfReg="false" Sequence="7"/>
++ <ROW File="index.html_1" Component_="htaccess" FileName="index~1.htm|index.html" Attributes="0" SourcePath="..\www\test_dir\no_ssl\index.html" SelfReg="false" Sequence="16"/>
++ <ROW File="index.html_2" Component_="htaccess_1" FileName="index~1.htm|index.html" Attributes="0" SourcePath="..\www\test_dir\no_http\index.html" SelfReg="false" Sequence="20"/>
++ <ROW File="os_port.h" Component_="bigint.h" FileName="os_port.h" Attributes="0" SourcePath="..\ssl\os_port.h" SelfReg="false" Sequence="13"/>
++ <ROW File="ssl.h" Component_="bigint.h" FileName="ssl.h" Attributes="0" SourcePath="..\ssl\ssl.h" SelfReg="false" Sequence="8"/>
++ <ROW File="tls1.h" Component_="bigint.h" FileName="tls1.h" Attributes="0" SourcePath="..\ssl\tls1.h" SelfReg="false" Sequence="11"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
++ <ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" InstallationType="4"/>
++ <ATTRIBUTE name="CurrentBuild" value="DefaultBuild"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
++ <ROW Path="&lt;ui.ail&gt;"/>
++ <ROW Path="&lt;ui_en.ail&gt;"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
++ <ROW Fragment="FolderDlg.aip" Path="&lt;FolderDlg.aip&gt;"/>
++ <ROW Fragment="StaticUIStrings.aip" Path="&lt;StaticUIStrings.aip&gt;"/>
++ <ROW Fragment="UI.aip" Path="&lt;UI.aip&gt;"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
++ <ROW Name="aicustact.dll" SourcePath="&lt;aicustact.dll&gt;"/>
++ <ROW Name="default_banner.bmp" SourcePath="&lt;default-banner.bmp&gt;"/>
++ <ROW Name="default_dialog.bmp" SourcePath="&lt;default-dialog.bmp&gt;"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiControlComponent">
++ <ATTRIBUTE name="FixedSizeBitmaps" value="0"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
++ <ROW Dialog_="FolderDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="1"/>
++ <ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="1"/>
++ <ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL" Ordering="1"/>
++ <ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL" Ordering="3"/>
++ <ROW Dialog_="MaintenanceTypeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceWelcomeDlg" Condition="AI_MAINT" Ordering="1"/>
++ <ROW Dialog_="MaintenanceWelcomeDlg" Control_="Next" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="2"/>
++ <ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="1"/>
++ <ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="2"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
++ <ROW Directory_="another_dir_DIR" Component_="another_dir"/>
++ <ROW Directory_="test_dir_DIR" Component_="test_dir"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
++ <ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
++ <ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
++ <ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
++ <ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
++ <ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]" MultiBuildTarget="DefaultBuild:[ProgramFilesFolder][ProductName]"/>
++ <ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]"/>
++ <ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiIconsComponent">
++ <ROW Name="controlPanelIcon.exe" SourcePath="..\..\axhttpd\www\favicon.ico" Index="0"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
++ <ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel &lt;&gt; 5)" Sequence="210"/>
++ <ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="740"/>
++ <ROW Action="AI_STORE_LOCATION" Condition="Not Installed" Sequence="1545"/>
++ <ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE=&quot;No&quot; AND (Not Installed)" Sequence="1300"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
++ <ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="740"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiShortsComponent">
++ <ROW Shortcut="axhttpd.exe" Directory_="SHORTCUTDIR" Name="axhttpd" Component_="axhttpd.exe" Target="[#axhttpd.exe]" Description="axhttpd.exe" Hotkey="0" IconIndex="0" ShowCmd="1" WkDir="APPDIR"/>
++ <ROW Shortcut="axssl_client" Directory_="SHORTCUTDIR" Name="axsslc~1|axssl client" Component_="axssl.exe" Target="[#axssl.exe]" Arguments="s_client" Hotkey="0" IconIndex="0" ShowCmd="1" WkDir="APPDIR"/>
++ <ROW Shortcut="axssl_server" Directory_="SHORTCUTDIR" Name="axssls~1|axssl server" Component_="axssl.exe" Target="[#axssl.exe]" Arguments="s_server" Hotkey="0" IconIndex="0" ShowCmd="1" WkDir="APPDIR"/>
++ </COMPONENT>
++ <COMPONENT cid="caphyon.advinst.msicomp.MsiUpgradeComponent">
++ <ROW UpgradeCode="[|UpgradeCode]" VersionMax="[|ProductVersion]" Attributes="1025" ActionProperty="OLDPRODUCTS"/>
++ <ROW UpgradeCode="[|UpgradeCode]" VersionMin="[|ProductVersion]" Attributes="2" ActionProperty="AI_NEWERPRODUCTFOUND"/>
++ </COMPONENT>
++</DOCUMENT>
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/axtls.RES b/feeds/luci/libs/luci-lib-nixio/axTLS/config/axtls.RES
+new file mode 100644
+index 0000000000000000000000000000000000000000..2929b3b679fddfb78bb58ebbccc5c0c4a9eb37d8
+GIT binary patch
+literal 22748
+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
+E0E3frQ2+n{
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/axtls.rc b/feeds/luci/libs/luci-lib-nixio/axTLS/config/axtls.rc
+new file mode 100644
+index 0000000..0f288aa
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/axtls.rc
+@@ -0,0 +1,32 @@
++//Microsoft Visual C++ generated resource script.
++//
++#define APSTUDIO_READONLY_SYMBOLS
++/////////////////////////////////////////////////////////////////////////////
++//
++// Generated from the TEXTINCLUDE 2 resource.
++//
++#define APSTUDIO_HIDDEN_SYMBOLS
++#undef APSTUDIO_HIDDEN_SYMBOLS
++/////////////////////////////////////////////////////////////////////////////
++#undef APSTUDIO_READONLY_SYMBOLS
++
++#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
++LANGUAGE 9, 1
++#pragma code_page(1252)
++
++/////////////////////////////////////////////////////////////////////////////
++//
++// Icon
++//
++
++// Icon with lowest ID value placed first to ensure application icon
++// remains consistent on all systems.
++
++IDI_AXTLS ICON "../www/favicon.ico"
++
++
++#endif
++/////////////////////////////////////////////////////////////////////////////
++
++
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/config.h b/feeds/luci/libs/luci-lib-nixio/axTLS/config/config.h
+new file mode 100644
+index 0000000..0f861f3
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/config.h
+@@ -0,0 +1,113 @@
++/*
++ * Automatically generated header file: don't edit
++ */
++
++#define HAVE_DOT_CONFIG 1
++#define CONFIG_PLATFORM_LINUX 1
++#undef CONFIG_PLATFORM_CYGWIN
++#undef CONFIG_PLATFORM_WIN32
++
++/*
++ * General Configuration
++ */
++#define PREFIX "/usr"
++#undef CONFIG_DEBUG
++#define CONFIG_STRIP_UNWANTED_SECTIONS 1
++#undef CONFIG_VISUAL_STUDIO_7_0
++#undef CONFIG_VISUAL_STUDIO_8_0
++#define CONFIG_VISUAL_STUDIO_7_0_BASE ""
++#define CONFIG_VISUAL_STUDIO_8_0_BASE ""
++#define CONFIG_EXTRA_CFLAGS_OPTIONS "-fpic"
++#define CONFIG_EXTRA_LDFLAGS_OPTIONS ""
++
++/*
++ * SSL Library
++ */
++#undef CONFIG_SSL_SERVER_ONLY
++#undef CONFIG_SSL_CERT_VERIFICATION
++#undef CONFIG_SSL_ENABLE_CLIENT
++#define CONFIG_SSL_FULL_MODE 1
++#undef CONFIG_SSL_SKELETON_MODE
++#undef CONFIG_SSL_PROT_LOW
++#define CONFIG_SSL_PROT_MEDIUM 1
++#undef CONFIG_SSL_PROT_HIGH
++#undef CONFIG_SSL_USE_DEFAULT_KEY
++#define CONFIG_SSL_PRIVATE_KEY_LOCATION "/etc/nixio/rsa_main.der"
++#define CONFIG_SSL_PRIVATE_KEY_PASSWORD ""
++#define CONFIG_SSL_X509_CERT_LOCATION ""
++#undef CONFIG_SSL_GENERATE_X509_CERT
++#define CONFIG_SSL_X509_COMMON_NAME ""
++#define CONFIG_SSL_X509_ORGANIZATION_NAME ""
++#define CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME ""
++#undef CONFIG_SSL_ENABLE_V23_HANDSHAKE
++#undef CONFIG_SSL_HAS_PEM
++#undef CONFIG_SSL_USE_PKCS12
++#define CONFIG_SSL_EXPIRY_TIME 24
++#define CONFIG_X509_MAX_CA_CERTS 4
++#define CONFIG_SSL_MAX_CERTS 2
++#define CONFIG_SSL_CTX_MUTEXING 1
++#define CONFIG_USE_DEV_URANDOM 1
++#undef CONFIG_WIN32_USE_CRYPTO_LIB
++#undef CONFIG_OPENSSL_COMPATIBLE
++#undef CONFIG_PERFORMANCE_TESTING
++#undef CONFIG_SSL_TEST
++#undef CONFIG_AXHTTPD
++#undef CONFIG_HTTP_STATIC_BUILD
++#define CONFIG_HTTP_PORT
++#define CONFIG_HTTP_HTTPS_PORT
++#define CONFIG_HTTP_SESSION_CACHE_SIZE
++#define CONFIG_HTTP_WEBROOT ""
++#define CONFIG_HTTP_TIMEOUT
++#undef CONFIG_HTTP_HAS_CGI
++#define CONFIG_HTTP_CGI_EXTENSIONS ""
++#undef CONFIG_HTTP_ENABLE_LUA
++#define CONFIG_HTTP_LUA_PREFIX ""
++#define CONFIG_HTTP_LUA_CGI_LAUNCHER ""
++#undef CONFIG_HTTP_BUILD_LUA
++#undef CONFIG_HTTP_DIRECTORIES
++#undef CONFIG_HTTP_HAS_AUTHORIZATION
++#undef CONFIG_HTTP_HAS_IPV6
++#undef CONFIG_HTTP_ENABLE_DIFFERENT_USER
++#define CONFIG_HTTP_USER ""
++#undef CONFIG_HTTP_VERBOSE
++#undef CONFIG_HTTP_IS_DAEMON
++
++/*
++ * Language Bindings
++ */
++#undef CONFIG_BINDINGS
++#undef CONFIG_CSHARP_BINDINGS
++#undef CONFIG_VBNET_BINDINGS
++#define CONFIG_DOT_NET_FRAMEWORK_BASE ""
++#undef CONFIG_JAVA_BINDINGS
++#define CONFIG_JAVA_HOME ""
++#undef CONFIG_PERL_BINDINGS
++#define CONFIG_PERL_CORE ""
++#define CONFIG_PERL_LIB ""
++#undef CONFIG_LUA_BINDINGS
++#define CONFIG_LUA_CORE ""
++
++/*
++ * Samples
++ */
++#undef CONFIG_SAMPLES
++#undef CONFIG_C_SAMPLES
++#undef CONFIG_CSHARP_SAMPLES
++#undef CONFIG_VBNET_SAMPLES
++#undef CONFIG_JAVA_SAMPLES
++#undef CONFIG_PERL_SAMPLES
++#undef CONFIG_LUA_SAMPLES
++
++/*
++ * BigInt Options
++ */
++#undef CONFIG_BIGINT_CLASSICAL
++#undef CONFIG_BIGINT_MONTGOMERY
++#define CONFIG_BIGINT_BARRETT 1
++#define CONFIG_BIGINT_CRT 1
++#undef CONFIG_BIGINT_KARATSUBA
++#define MUL_KARATSUBA_THRESH
++#define SQU_KARATSUBA_THRESH
++#define CONFIG_BIGINT_SLIDING_WINDOW 1
++#define CONFIG_BIGINT_SQUARE 1
++#undef CONFIG_BIGINT_CHECK_ON
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/linuxconfig b/feeds/luci/libs/luci-lib-nixio/axTLS/config/linuxconfig
+new file mode 100644
+index 0000000..614fdd8
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/linuxconfig
+@@ -0,0 +1,119 @@
++#
++# Automatically generated make config: don't edit
++#
++HAVE_DOT_CONFIG=y
++CONFIG_PLATFORM_LINUX=y
++# CONFIG_PLATFORM_CYGWIN is not set
++# CONFIG_PLATFORM_SOLARIS is not set
++# CONFIG_PLATFORM_WIN32 is not set
++
++#
++# General Configuration
++#
++PREFIX="/usr/local"
++# CONFIG_DEBUG is not set
++CONFIG_STRIP_UNWANTED_SECTIONS=y
++# CONFIG_VISUAL_STUDIO_7_0 is not set
++# CONFIG_VISUAL_STUDIO_8_0 is not set
++CONFIG_VISUAL_STUDIO_7_0_BASE=""
++CONFIG_VISUAL_STUDIO_8_0_BASE=""
++CONFIG_EXTRA_CFLAGS_OPTIONS=""
++CONFIG_EXTRA_LDFLAGS_OPTIONS=""
++
++#
++# SSL Library
++#
++# CONFIG_SSL_SERVER_ONLY is not set
++# CONFIG_SSL_CERT_VERIFICATION is not set
++# CONFIG_SSL_ENABLE_CLIENT is not set
++CONFIG_SSL_FULL_MODE=y
++# CONFIG_SSL_SKELETON_MODE is not set
++# CONFIG_SSL_PROT_LOW is not set
++CONFIG_SSL_PROT_MEDIUM=y
++# CONFIG_SSL_PROT_HIGH is not set
++CONFIG_SSL_USE_DEFAULT_KEY=y
++CONFIG_SSL_PRIVATE_KEY_LOCATION=""
++CONFIG_SSL_PRIVATE_KEY_PASSWORD=""
++CONFIG_SSL_X509_CERT_LOCATION=""
++CONFIG_SSL_GENERATE_X509_CERT=y
++CONFIG_SSL_X509_COMMON_NAME=""
++CONFIG_SSL_X509_ORGANIZATION_NAME=""
++CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME=""
++CONFIG_SSL_ENABLE_V23_HANDSHAKE=y
++CONFIG_SSL_HAS_PEM=y
++CONFIG_SSL_USE_PKCS12=y
++CONFIG_SSL_EXPIRY_TIME=24
++CONFIG_X509_MAX_CA_CERTS=4
++CONFIG_SSL_MAX_CERTS=2
++# CONFIG_SSL_CTX_MUTEXING is not set
++CONFIG_USE_DEV_URANDOM=y
++# CONFIG_WIN32_USE_CRYPTO_LIB is not set
++CONFIG_OPENSSL_COMPATIBLE=y
++# CONFIG_PERFORMANCE_TESTING is not set
++# CONFIG_SSL_TEST is not set
++CONFIG_AXHTTPD=y
++
++#
++# Axhttpd Configuration
++#
++# CONFIG_HTTP_STATIC_BUILD is not set
++CONFIG_HTTP_PORT=80
++CONFIG_HTTP_HTTPS_PORT=443
++CONFIG_HTTP_SESSION_CACHE_SIZE=5
++CONFIG_HTTP_WEBROOT="../www"
++CONFIG_HTTP_TIMEOUT=300
++
++#
++# CGI
++#
++CONFIG_HTTP_HAS_CGI=y
++CONFIG_HTTP_CGI_EXTENSIONS=".lua,.lp"
++CONFIG_HTTP_ENABLE_LUA=y
++CONFIG_HTTP_LUA_PREFIX="/usr/local"
++CONFIG_HTTP_LUA_CGI_LAUNCHER="/bin/cgi"
++# CONFIG_HTTP_BUILD_LUA is not set
++CONFIG_HTTP_DIRECTORIES=y
++CONFIG_HTTP_HAS_AUTHORIZATION=y
++# CONFIG_HTTP_HAS_IPV6 is not set
++# CONFIG_HTTP_VERBOSE is not set
++# CONFIG_HTTP_IS_DAEMON is not set
++
++#
++# Language Bindings
++#
++CONFIG_BINDINGS=y
++# CONFIG_CSHARP_BINDINGS is not set
++# CONFIG_VBNET_BINDINGS is not set
++CONFIG_DOT_NET_FRAMEWORK_BASE=""
++# CONFIG_JAVA_BINDINGS is not set
++CONFIG_JAVA_HOME=""
++# CONFIG_PERL_BINDINGS is not set
++CONFIG_PERL_CORE=""
++CONFIG_PERL_LIB=""
++# CONFIG_LUA_BINDINGS is not set
++CONFIG_LUA_CORE=""
++
++#
++# Samples
++#
++CONFIG_SAMPLES=y
++CONFIG_C_SAMPLES=y
++# CONFIG_CSHARP_SAMPLES is not set
++# CONFIG_VBNET_SAMPLES is not set
++# CONFIG_JAVA_SAMPLES is not set
++# CONFIG_PERL_SAMPLES is not set
++# CONFIG_LUA_SAMPLES is not set
++
++#
++# BigInt Options
++#
++# CONFIG_BIGINT_CLASSICAL is not set
++# CONFIG_BIGINT_MONTGOMERY is not set
++CONFIG_BIGINT_BARRETT=y
++CONFIG_BIGINT_CRT=y
++# CONFIG_BIGINT_KARATSUBA is not set
++MUL_KARATSUBA_THRESH=0
++SQU_KARATSUBA_THRESH=0
++CONFIG_BIGINT_SLIDING_WINDOW=y
++CONFIG_BIGINT_SQUARE=y
++# CONFIG_BIGINT_CHECK_ON is not set
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.conf b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.conf
+new file mode 100644
+index 0000000..9f9db13
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.conf
+@@ -0,0 +1,127 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++#
++# A standard makefile for all makefiles
++#
++
++# All executables and libraries go here
++STAGE=./_stage
++
++ifneq ($(MAKECMDGOALS), clean)
++
++# Give an initial rule
++all:
++
++# Win32
++ifdef CONFIG_PLATFORM_WIN32
++
++ifdef CONFIG_VISUAL_STUDIO_7_0
++CONFIG_VISUAL_STUDIO_7_0_BASE_UNIX:=$(shell cygpath -u $(CONFIG_VISUAL_STUDIO_7_0_BASE))
++export INCLUDE=$(shell echo "$(CONFIG_VISUAL_STUDIO_7_0_BASE)\vc7\include;$(CONFIG_VISUAL_STUDIO_7_0_BASE)\vc7\platformsdk\include")
++export LIB=$(shell echo "$(CONFIG_VISUAL_STUDIO_7_0_BASE)\vc7\\platformsdk\lib;$(CONFIG_VISUAL_STUDIO_7_0_BASE)\vc7\lib")
++PATH:=$(CONFIG_VISUAL_STUDIO_7_0_BASE_UNIX)/vc7/bin:$(CONFIG_VISUAL_STUDIO_7_0_BASE_UNIX)/common7/ide:$(PATH)
++else
++ifdef CONFIG_VISUAL_STUDIO_8_0
++CONFIG_VISUAL_STUDIO_8_0_BASE_UNIX:=$(shell cygpath -u $(CONFIG_VISUAL_STUDIO_8_0_BASE))
++export INCLUDE=$(shell echo "$(CONFIG_VISUAL_STUDIO_8_0_BASE)\vc\include;$(CONFIG_VISUAL_STUDIO_8_0_BASE)\vc\platformsdk\include")
++export LIB=$(shell echo "$(CONFIG_VISUAL_STUDIO_8_0_BASE)\vc\platformsdk\lib;$(CONFIG_VISUAL_STUDIO_8_0_BASE)\vc\lib")
++PATH:=$(CONFIG_VISUAL_STUDIO_8_0_BASE_UNIX)/vc/bin:$(CONFIG_VISUAL_STUDIO_8_0_BASE_UNIX)/common7/ide:$(PATH)
++stuff:
++ @echo $(INCLUDE)
++endif
++endif
++
++CC=cl.exe
++LD=link.exe
++AXTLS_INCLUDE=$(shell cygpath -w $(AXTLS_HOME))
++CFLAGS+=/nologo /W3 /D"WIN32" /D"_MBCS" /D"_CONSOLE" /D"_CRT_SECURE_NO_DEPRECATE" /FD /I"$(AXTLS_INCLUDE)crypto" /I"$(AXTLS_INCLUDE)ssl" /I"$(AXTLS_INCLUDE)config" /c
++LDFLAGS=/nologo /subsystem:console /machine:I386
++LDSHARED = /dll
++AR=lib /nologo
++
++ifdef CONFIG_DEBUG
++ CFLAGS += /Gm /Zi /Od /D "_DEBUG"
++ LDFLAGS += /debug /incremental:yes
++else
++ CFLAGS += /O2 /D "NDEBUG"
++ LDFLAGS += /incremental:no
++endif
++
++else # Not Win32
++
++-include .depend
++
++CFLAGS += -I$(AXTLS_HOME)/config -I$(AXTLS_HOME)/ssl -I$(AXTLS_HOME)/crypto
++LD=$(CC)
++STRIP=strip
++
++# Solaris
++ifdef CONFIG_PLATFORM_SOLARIS
++CFLAGS += -DCONFIG_PLATFORM_SOLARIS
++LDFLAGS += -lsocket -lnsl -lc
++LDSHARED = -G
++# Linux/Cygwin
++else
++CFLAGS += -Wall -Wstrict-prototypes -Wshadow
++LDSHARED = -shared
++
++# Linux
++ifndef CONFIG_PLATFORM_CYGWIN
++# CFLAGS += -fPIC
++
++# Cygwin
++else
++CFLAGS += -DCONFIG_PLATFORM_CYGWIN
++LDFLAGS += -enable-auto-import
++endif
++endif
++
++ifdef CONFIG_DEBUG
++CFLAGS += -g
++else
++LDFLAGS += -s
++ifdef CONFIG_PLATFORM_SOLARIS
++CFLAGS += -O
++else
++CFLAGS += -O3
++endif
++
++endif # CONFIG_DEBUG
++endif # WIN32
++
++CFLAGS+=$(subst ",, $(strip $(CONFIG_EXTRA_CFLAGS_OPTIONS)))
++LDFLAGS+=$(subst ",, $(strip $(CONFIG_EXTRA_LDFLAGS_OPTIONS)))
++
++endif # not 'clean'
++
++clean::
++ -@rm -f *.o *.obj core* *.out *~ \.depend vc*0*
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.dotnet.conf b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.dotnet.conf
+new file mode 100644
+index 0000000..9cff4fd
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.dotnet.conf
+@@ -0,0 +1,65 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++ifneq ($(MAKECMDGOALS), clean)
++
++ifdef CONFIG_PLATFORM_WIN32
++GO_DOT_NET=y
++endif
++
++ifdef CONFIG_PLATFORM_CYGWIN
++GO_DOT_NET=y
++endif
++
++ifdef GO_DOT_NET
++all: test_dot_net_location
++
++# find out where the C# compiler is
++CONFIG_DOT_NET_FRAMEWORK_BASE:=$(shell cygpath -u $(CONFIG_DOT_NET_FRAMEWORK_BASE))
++
++test_dot_net_location:
++ @if ! [ -d "$(CONFIG_DOT_NET_FRAMEWORK_BASE)" ]; then \
++ echo "*** Error: .NET path of $(CONFIG_DOT_NET_FRAMEWORK_BASE) doesn't exist" && exit 1; \
++ fi
++
++PATH:=$(CONFIG_DOT_NET_FRAMEWORK_BASE):$(PATH)
++
++else # Linux?
++all: test_mcs
++
++test_mcs:
++ @if ! mcs --about > /dev/null 2>&1; then \
++ echo "Mono not installed! - go " \
++ "to http://www.mono-project.com/Main_Page" && exit 1; \
++ fi
++
++endif # Linux
++
++endif # not 'clean'
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.java.conf b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.java.conf
+new file mode 100644
+index 0000000..9b22462
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.java.conf
+@@ -0,0 +1,58 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++ifneq ($(MAKECMDGOALS), clean)
++
++ifdef CONFIG_PLATFORM_CYGWIN
++CFLAGS += -I"$(CONFIG_JAVA_HOME)/include"
++CFLAGS += -I"$(CONFIG_JAVA_HOME)/include/win32"
++JAVA_BIN:=$(CONFIG_JAVA_HOME)/bin
++else
++
++ifdef CONFIG_PLATFORM_WIN32
++CFLAGS += /I"$(shell cygpath -w $(CONFIG_JAVA_HOME)/include)"
++CFLAGS += /I"$(shell cygpath -w $(CONFIG_JAVA_HOME)/include/win32)"
++JAVA_BIN:=$(shell cygpath -u $(CONFIG_JAVA_HOME)/bin)
++else # Linux
++CFLAGS += -I$(CONFIG_JAVA_HOME)/include
++
++ifdef CONFIG_PLATFORM_SOLARIS
++CFLAGS += -I$(CONFIG_JAVA_HOME)/include/solaris
++else
++CFLAGS += -I$(CONFIG_JAVA_HOME)/include/linux
++endif
++
++JAVA_BIN:=$(CONFIG_JAVA_HOME)/bin
++endif
++endif
++
++PATH:=$(JAVA_BIN):$(PATH)
++
++endif # not 'clean'
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.post b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.post
+new file mode 100644
+index 0000000..033981c
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.post
+@@ -0,0 +1,19 @@
++
++ifneq ($(MAKECMDGOALS), clean)
++ifndef CONFIG_PLATFORM_WIN32
++ifndef CONFIG_PLATFORM_SOLARIS
++# do dependencies
++-include .depend
++all : .depend
++.depend: $(wildcard *.c)
++ @$(CC) $(CFLAGS) -MM $^ > $@
++endif # 'not' solaris
++endif # 'not' win32
++
++ifdef CONFIG_PLATFORM_WIN32
++OBJ:=$(OBJ:.o=.obj)
++%.obj : %.c
++ $(CC) $(CFLAGS) $<
++endif # win32
++
++endif # end of 'not' clean
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Kconfig-language.txt b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Kconfig-language.txt
+new file mode 100644
+index 0000000..493749b
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Kconfig-language.txt
+@@ -0,0 +1,255 @@
++Introduction
++------------
++
++The configuration database is collection of configuration options
++organized in a tree structure:
++
++ +- Code maturity level options
++ | +- Prompt for development and/or incomplete code/drivers
++ +- General setup
++ | +- Networking support
++ | +- System V IPC
++ | +- BSD Process Accounting
++ | +- Sysctl support
++ +- Loadable module support
++ | +- Enable loadable module support
++ | +- Set version information on all module symbols
++ | +- Kernel module loader
++ +- ...
++
++Every entry has its own dependencies. These dependencies are used
++to determine the visible of an entry. Any child entry is only
++visible if its parent entry is also visible.
++
++Menu entries
++------------
++
++Most entries define a config option, all other entries help to organize
++them. A single configuration option is defined like this:
++
++config MODVERSIONS
++ bool "Set version information on all module symbols"
++ depends MODULES
++ help
++ Usually, modules have to be recompiled whenever you switch to a new
++ kernel. ...
++
++Every line starts with a key word and can be followed by multiple
++arguments. "config" starts a new config entry. The following lines
++define attributes for this config option. Attributes can be the type of
++the config option, input prompt, dependencies, help text and default
++values. A config option can be defined multiple times with the same
++name, but every definition can have only a single input prompt and the
++type must not conflict.
++
++Menu attributes
++---------------
++
++A menu entry can have a number of attributes. Not all of them are
++applicable everywhere (see syntax).
++
++- type definition: "bool"/"tristate"/"string"/"hex"/"integer"
++ Every config option must have a type. There are only two basic types:
++ tristate and string, the other types base on these two. The type
++ definition optionally accepts an input prompt, so these two examples
++ are equivalent:
++
++ bool "Networking support"
++ and
++ bool
++ prompt "Networking support"
++
++- input prompt: "prompt" <prompt> ["if" <expr>]
++ Every menu entry can have at most one prompt, which is used to display
++ to the user. Optionally dependencies only for this prompt can be added
++ with "if".
++
++- default value: "default" <symbol> ["if" <expr>]
++ A config option can have any number of default values. If multiple
++ default values are visible, only the first defined one is active.
++ Default values are not limited to the menu entry, where they are
++ defined, this means the default can be defined somewhere else or be
++ overriden by an earlier definition.
++ The default value is only assigned to the config symbol if no other
++ value was set by the user (via the input prompt above). If an input
++ prompt is visible the default value is presented to the user and can
++ be overridden by him.
++ Optionally dependencies only for this default value can be added with
++ "if".
++
++- dependencies: "depends on"/"requires" <expr>
++ This defines a dependency for this menu entry. If multiple
++ dependencies are defined they are connected with '&&'. Dependencies
++ are applied to all other options within this menu entry (which also
++ accept "if" expression), so these two examples are equivalent:
++
++ bool "foo" if BAR
++ default y if BAR
++ and
++ depends on BAR
++ bool "foo"
++ default y
++
++- help text: "help"
++ This defines a help text. The end of the help text is determined by
++ the level indentation, this means it ends at the first line which has
++ a smaller indentation than the first line of the help text.
++
++
++Menu dependencies
++-----------------
++
++Dependencies define the visibility of a menu entry and can also reduce
++the input range of tristate symbols. The tristate logic used in the
++expressions uses one more state than normal boolean logic to express the
++module state. Dependency expressions have the following syntax:
++
++<expr> ::= <symbol> (1)
++ <symbol> '=' <symbol> (2)
++ <symbol> '!=' <symbol> (3)
++ '(' <expr> ')' (4)
++ '!' <expr> (5)
++ <expr> '||' <expr> (6)
++ <expr> '&&' <expr> (7)
++
++Expressions are listed in decreasing order of precedence.
++
++(1) Convert the symbol into an expression. Boolean and tristate symbols
++ are simply converted into the respective expression values. All
++ other symbol types result in 'n'.
++(2) If the values of both symbols are equal, it returns 'y',
++ otherwise 'n'.
++(3) If the values of both symbols are equal, it returns 'n',
++ otherwise 'y'.
++(4) Returns the value of the expression. Used to override precedence.
++(5) Returns the result of (2-/expr/).
++(6) Returns the result of min(/expr/, /expr/).
++(7) Returns the result of max(/expr/, /expr/).
++
++An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2
++respectively for calculations). A menu entry becomes visible when it's
++expression evaluates to 'm' or 'y'.
++
++There are two type of symbols: constant and nonconstant symbols.
++Nonconstant symbols are the most common ones and are defined with the
++'config' statement. Nonconstant symbols consist entirely of alphanumeric
++characters or underscores.
++Constant symbols are only part of expressions. Constant symbols are
++always surrounded by single or double quotes. Within the quote any
++other character is allowed and the quotes can be escaped using '\'.
++
++Menu structure
++--------------
++
++The position of a menu entry in the tree is determined in two ways. First
++it can be specified explicitely:
++
++menu "Network device support"
++ depends NET
++
++config NETDEVICES
++ ...
++
++endmenu
++
++All entries within the "menu" ... "endmenu" block become a submenu of
++"Network device support". All subentries inherit the dependencies from
++the menu entry, e.g. this means the dependency "NET" is added to the
++dependency list of the config option NETDEVICES.
++
++The other way to generate the menu structure is done by analyzing the
++dependencies. If a menu entry somehow depends on the previous entry, it
++can be made a submenu of it. First the the previous (parent) symbol must
++be part of the dependency list and then one of these two condititions
++must be true:
++- the child entry must become invisible, if the parent is set to 'n'
++- the child entry must only be visible, if the parent is visible
++
++config MODULES
++ bool "Enable loadable module support"
++
++config MODVERSIONS
++ bool "Set version information on all module symbols"
++ depends MODULES
++
++comment "module support disabled"
++ depends !MODULES
++
++MODVERSIONS directly depends on MODULES, this means it's only visible if
++MODULES is different from 'n'. The comment on the other hand is always
++visible when MODULES it's visible (the (empty) dependency of MODULES is
++also part of the comment dependencies).
++
++
++Kconfig syntax
++--------------
++
++The configuration file describes a series of menu entries, where every
++line starts with a keyword (except help texts). The following keywords
++end a menu entry:
++- config
++- choice/endchoice
++- comment
++- menu/endmenu
++- if/endif
++- source
++The first four also start the definition of a menu entry.
++
++config:
++
++ "config" <symbol>
++ <config options>
++
++This defines a config symbol <symbol> and accepts any of above
++attributes as options.
++
++choices:
++
++ "choice"
++ <choice options>
++ <choice block>
++ "endchoice"
++
++This defines a choice group and accepts any of above attributes as
++options. A choice can only be of type bool or tristate, while a boolean
++choice only allows a single config entry to be selected, a tristate
++choice also allows any number of config entries to be set to 'm'. This
++can be used if multiple drivers for a single hardware exists and only a
++single driver can be compiled/loaded into the kernel, but all drivers
++can be compiled as modules.
++A choice accepts another option "optional", which allows to set the
++choice to 'n' and no entry needs to be selected.
++
++comment:
++
++ "comment" <prompt>
++ <comment options>
++
++This defines a comment which is displayed to the user during the
++configuration process and is also echoed to the output files. The only
++possible options are dependencies.
++
++menu:
++
++ "menu" <prompt>
++ <menu options>
++ <menu block>
++ "endmenu"
++
++This defines a menu block, see "Menu structure" above for more
++information. The only possible options are dependencies.
++
++if:
++
++ "if" <expr>
++ <if block>
++ "endif"
++
++This defines an if block. The dependency expression <expr> is appended
++to all enclosed menu entries.
++
++source:
++
++ "source" <prompt>
++
++This reads the specified configuration file. This file is always parsed.
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Makefile
+new file mode 100644
+index 0000000..7399501
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Makefile
+@@ -0,0 +1,121 @@
++# Makefile for axTLS
++#
++# Copyright (C) 2002 Erik Andersen <andersen@codepoet.org>
++
++top_srcdir=../..
++top_builddir=../..
++srcdir=$(top_srcdir)/scripts/config
++include $(top_srcdir)/Rules.mak
++
++all: ncurses conf mconf
++
++ifeq ($(shell uname),SunOS)
++LIBS = -lcurses
++else
++LIBS = -lncurses
++endif
++ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
++ HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
++else
++ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h))
++ HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
++else
++ifeq (/usr/local/include/ncurses/ncurses.h, $(wildcard /usr/local/include/ncurses/ncurses.h))
++ HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses.h>"
++else
++ifeq (/usr/local/include/ncurses/curses.h, $(wildcard /usr/local/include/ncurses/curses.h))
++ HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
++else
++ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h))
++ HOSTNCURSES += -DCURSES_LOC="<ncurses.h>"
++else
++ HOSTNCURSES += -DCURSES_LOC="<curses.h>"
++endif
++endif
++endif
++endif
++endif
++
++CONF_SRC = conf.c
++MCONF_SRC = mconf.c
++LXD_SRC = lxdialog/checklist.c lxdialog/menubox.c lxdialog/textbox.c \
++ lxdialog/yesno.c lxdialog/inputbox.c lxdialog/util.c \
++ lxdialog/msgbox.c
++
++SHARED_SRC = zconf.tab.c
++SHARED_DEPS := $(srcdir)/lkc.h $(srcdir)/lkc_proto.h \
++ lkc_defs.h $(srcdir)/expr.h zconf.tab.h
++CONF_OBJS = $(patsubst %.c,%.o, $(CONF_SRC))
++MCONF_OBJS = $(patsubst %.c,%.o, $(MCONF_SRC) $(LXD_SRC))
++SHARED_OBJS = $(patsubst %.c,%.o, $(SHARED_SRC))
++
++conf: $(CONF_OBJS) $(SHARED_OBJS)
++ $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@
++
++mconf: $(MCONF_OBJS) $(SHARED_OBJS)
++ $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ $(LIBS)
++
++$(CONF_OBJS): %.o : $(srcdir)/%.c $(SHARED_DEPS)
++ $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
++
++$(MCONF_OBJS): %.o : $(srcdir)/%.c $(SHARED_DEPS)
++ @[ -d $(@D) ] || mkdir -v $(@D)
++ $(HOSTCC) $(HOSTCFLAGS) $(HOSTNCURSES) -I. -c $< -o $@
++
++lkc_defs.h: $(srcdir)/lkc_proto.h
++ @sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
++
++###
++# The following requires flex/bison
++# By default we use the _shipped versions, uncomment the
++# following line if you are modifying the flex/bison src.
++#LKC_GENPARSER := 1
++
++ifdef LKC_GENPARSER
++
++%.tab.c %.tab.h: $(srcdir)/%.y
++ bison -t -d -v -b $* -p $(notdir $*) $<
++
++lex.%.c: $(srcdir)/%.l
++ flex -P$(notdir $*) -o$@ $<
++else
++
++lex.zconf.o: lex.zconf.c $(SHARED_DEPS)
++ $(HOSTCC) $(HOSTCFLAGS) -I$(srcdir) -c $< -o $@
++
++lex.zconf.c: $(srcdir)/lex.zconf.c_shipped
++ cp $< $@
++
++zconf.tab.c: $(srcdir)/zconf.tab.c_shipped
++ cp $< $@
++
++zconf.tab.h: $(srcdir)/zconf.tab.h_shipped
++ cp $< $@
++endif
++
++zconf.tab.o: zconf.tab.c lex.zconf.c $(srcdir)/confdata.c $(srcdir)/expr.c \
++ $(srcdir)/symbol.c $(srcdir)/menu.c $(SHARED_DEPS)
++ $(HOSTCC) $(HOSTCFLAGS) -I$(srcdir) -I. -c $< -o $@
++
++.PHONY: ncurses
++
++ncurses:
++ @echo "main() {}" > lxtemp.c
++ @if $(HOSTCC) lxtemp.c $(LIBS) ; then \
++ rm -f lxtemp.c a.out; \
++ else \
++ rm -f lxtemp.c; \
++ echo -e "\007" ;\
++ echo ">> Unable to find the Ncurses libraries." ;\
++ echo ">>" ;\
++ echo ">> You must have Ncurses installed in order" ;\
++ echo ">> to use 'make menuconfig'" ;\
++ echo ;\
++ exit 1 ;\
++ fi
++
++clean:
++ rm -f *.o *~ ../../*~ core *.exe $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS)
++ rm -f conf conf.exe mconf mconf.exe zconf.tab.c zconf.tab.h lex.zconf.c lkc_defs.h
++ rm -f ../..config.h
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/conf.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/conf.c
+new file mode 100644
+index 0000000..1524467
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/conf.c
+@@ -0,0 +1,583 @@
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#include <ctype.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <time.h>
++#include <sys/stat.h>
++
++#define LKC_DIRECT_LINK
++#include "lkc.h"
++
++static void conf(struct menu *menu);
++static void check_conf(struct menu *menu);
++
++enum {
++ ask_all,
++ ask_new,
++ ask_silent,
++ set_default,
++ set_yes,
++ set_mod,
++ set_no,
++ set_random
++} input_mode = ask_all;
++char *defconfig_file;
++
++static int indent = 1;
++static int valid_stdin = 1;
++static int conf_cnt;
++static char line[128];
++static struct menu *rootEntry;
++
++static char nohelp_text[] = "Sorry, no help available for this option yet.\n";
++
++static void strip(char *str)
++{
++ char *p = str;
++ int l;
++
++ while ((isspace(*p)))
++ p++;
++ l = strlen(p);
++ if (p != str)
++ memmove(str, p, l + 1);
++ if (!l)
++ return;
++ p = str + l - 1;
++ while ((isspace(*p)))
++ *p-- = 0;
++}
++
++static void check_stdin(void)
++{
++ if (!valid_stdin && input_mode == ask_silent) {
++ printf("aborted!\n\n");
++ printf("Console input/output is redirected. ");
++ printf("Run 'make oldconfig' to update configuration.\n\n");
++ exit(1);
++ }
++}
++
++static void conf_askvalue(struct symbol *sym, const char *def)
++{
++ enum symbol_type type = sym_get_type(sym);
++ tristate val;
++
++ if (!sym_has_value(sym))
++ printf("(NEW) ");
++
++ line[0] = '\n';
++ line[1] = 0;
++
++ if (!sym_is_changable(sym)) {
++ printf("%s\n", def);
++ line[0] = '\n';
++ line[1] = 0;
++ return;
++ }
++
++ switch (input_mode) {
++ case ask_new:
++ case ask_silent:
++ if (sym_has_value(sym)) {
++ printf("%s\n", def);
++ return;
++ }
++ check_stdin();
++ case ask_all:
++ fflush(stdout);
++ fgets(line, 128, stdin);
++ return;
++ case set_default:
++ printf("%s\n", def);
++ return;
++ default:
++ break;
++ }
++
++ switch (type) {
++ case S_INT:
++ case S_HEX:
++ case S_STRING:
++ printf("%s\n", def);
++ return;
++ default:
++ ;
++ }
++ switch (input_mode) {
++ case set_yes:
++ if (sym_tristate_within_range(sym, yes)) {
++ line[0] = 'y';
++ line[1] = '\n';
++ line[2] = 0;
++ break;
++ }
++ case set_mod:
++ if (type == S_TRISTATE) {
++ if (sym_tristate_within_range(sym, mod)) {
++ line[0] = 'm';
++ line[1] = '\n';
++ line[2] = 0;
++ break;
++ }
++ } else {
++ if (sym_tristate_within_range(sym, yes)) {
++ line[0] = 'y';
++ line[1] = '\n';
++ line[2] = 0;
++ break;
++ }
++ }
++ case set_no:
++ if (sym_tristate_within_range(sym, no)) {
++ line[0] = 'n';
++ line[1] = '\n';
++ line[2] = 0;
++ break;
++ }
++ case set_random:
++ do {
++ val = (tristate)(random() % 3);
++ } while (!sym_tristate_within_range(sym, val));
++ switch (val) {
++ case no: line[0] = 'n'; break;
++ case mod: line[0] = 'm'; break;
++ case yes: line[0] = 'y'; break;
++ }
++ line[1] = '\n';
++ line[2] = 0;
++ break;
++ default:
++ break;
++ }
++ printf("%s", line);
++}
++
++int conf_string(struct menu *menu)
++{
++ struct symbol *sym = menu->sym;
++ const char *def, *help;
++
++ while (1) {
++ printf("%*s%s ", indent - 1, "", menu->prompt->text);
++ printf("(%s) ", sym->name);
++ def = sym_get_string_value(sym);
++ if (sym_get_string_value(sym))
++ printf("[%s] ", def);
++ conf_askvalue(sym, def);
++ switch (line[0]) {
++ case '\n':
++ break;
++ case '?':
++ /* print help */
++ if (line[1] == '\n') {
++ help = nohelp_text;
++ if (menu->sym->help)
++ help = menu->sym->help;
++ printf("\n%s\n", menu->sym->help);
++ def = NULL;
++ break;
++ }
++ default:
++ line[strlen(line)-1] = 0;
++ def = line;
++ }
++ if (def && sym_set_string_value(sym, def))
++ return 0;
++ }
++}
++
++static int conf_sym(struct menu *menu)
++{
++ struct symbol *sym = menu->sym;
++ int type;
++ tristate oldval, newval;
++ const char *help;
++
++ while (1) {
++ printf("%*s%s ", indent - 1, "", menu->prompt->text);
++ if (sym->name)
++ printf("(%s) ", sym->name);
++ type = sym_get_type(sym);
++ putchar('[');
++ oldval = sym_get_tristate_value(sym);
++ switch (oldval) {
++ case no:
++ putchar('N');
++ break;
++ case mod:
++ putchar('M');
++ break;
++ case yes:
++ putchar('Y');
++ break;
++ }
++ if (oldval != no && sym_tristate_within_range(sym, no))
++ printf("/n");
++ if (oldval != mod && sym_tristate_within_range(sym, mod))
++ printf("/m");
++ if (oldval != yes && sym_tristate_within_range(sym, yes))
++ printf("/y");
++ if (sym->help)
++ printf("/?");
++ printf("] ");
++ conf_askvalue(sym, sym_get_string_value(sym));
++ strip(line);
++
++ switch (line[0]) {
++ case 'n':
++ case 'N':
++ newval = no;
++ if (!line[1] || !strcmp(&line[1], "o"))
++ break;
++ continue;
++ case 'm':
++ case 'M':
++ newval = mod;
++ if (!line[1])
++ break;
++ continue;
++ case 'y':
++ case 'Y':
++ newval = yes;
++ if (!line[1] || !strcmp(&line[1], "es"))
++ break;
++ continue;
++ case 0:
++ newval = oldval;
++ break;
++ case '?':
++ goto help;
++ default:
++ continue;
++ }
++ if (sym_set_tristate_value(sym, newval))
++ return 0;
++help:
++ help = nohelp_text;
++ if (sym->help)
++ help = sym->help;
++ printf("\n%s\n", help);
++ }
++}
++
++static int conf_choice(struct menu *menu)
++{
++ struct symbol *sym, *def_sym;
++ struct menu *child;
++ int type;
++ bool is_new;
++
++ sym = menu->sym;
++ type = sym_get_type(sym);
++ is_new = !sym_has_value(sym);
++ if (sym_is_changable(sym)) {
++ conf_sym(menu);
++ sym_calc_value(sym);
++ switch (sym_get_tristate_value(sym)) {
++ case no:
++ return 1;
++ case mod:
++ return 0;
++ case yes:
++ break;
++ }
++ } else {
++ switch (sym_get_tristate_value(sym)) {
++ case no:
++ return 1;
++ case mod:
++ printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
++ return 0;
++ case yes:
++ break;
++ }
++ }
++
++ while (1) {
++ int cnt, def;
++
++ printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
++ def_sym = sym_get_choice_value(sym);
++ cnt = def = 0;
++ line[0] = '0';
++ line[1] = 0;
++ for (child = menu->list; child; child = child->next) {
++ if (!menu_is_visible(child))
++ continue;
++ if (!child->sym) {
++ printf("%*c %s\n", indent, '*', menu_get_prompt(child));
++ continue;
++ }
++ cnt++;
++ if (child->sym == def_sym) {
++ def = cnt;
++ printf("%*c", indent, '>');
++ } else
++ printf("%*c", indent, ' ');
++ printf(" %d. %s", cnt, menu_get_prompt(child));
++ if (child->sym->name)
++ printf(" (%s)", child->sym->name);
++ if (!sym_has_value(child->sym))
++ printf(" (NEW)");
++ printf("\n");
++ }
++ printf("%*schoice", indent - 1, "");
++ if (cnt == 1) {
++ printf("[1]: 1\n");
++ goto conf_childs;
++ }
++ printf("[1-%d", cnt);
++ if (sym->help)
++ printf("?");
++ printf("]: ");
++ switch (input_mode) {
++ case ask_new:
++ case ask_silent:
++ if (!is_new) {
++ cnt = def;
++ printf("%d\n", cnt);
++ break;
++ }
++ check_stdin();
++ case ask_all:
++ fflush(stdout);
++ fgets(line, 128, stdin);
++ strip(line);
++ if (line[0] == '?') {
++ printf("\n%s\n", menu->sym->help ?
++ menu->sym->help : nohelp_text);
++ continue;
++ }
++ if (!line[0])
++ cnt = def;
++ else if (isdigit(line[0]))
++ cnt = atoi(line);
++ else
++ continue;
++ break;
++ case set_random:
++ def = (random() % cnt) + 1;
++ case set_default:
++ case set_yes:
++ case set_mod:
++ case set_no:
++ cnt = def;
++ printf("%d\n", cnt);
++ break;
++ }
++
++ conf_childs:
++ for (child = menu->list; child; child = child->next) {
++ if (!child->sym || !menu_is_visible(child))
++ continue;
++ if (!--cnt)
++ break;
++ }
++ if (!child)
++ continue;
++ if (line[strlen(line) - 1] == '?') {
++ printf("\n%s\n", child->sym->help ?
++ child->sym->help : nohelp_text);
++ continue;
++ }
++ sym_set_choice_value(sym, child->sym);
++ if (child->list) {
++ indent += 2;
++ conf(child->list);
++ indent -= 2;
++ }
++ return 1;
++ }
++}
++
++static void conf(struct menu *menu)
++{
++ struct symbol *sym;
++ struct property *prop;
++ struct menu *child;
++
++ if (!menu_is_visible(menu))
++ return;
++
++ sym = menu->sym;
++ prop = menu->prompt;
++ if (prop) {
++ const char *prompt;
++
++ switch (prop->type) {
++ case P_MENU:
++ if (input_mode == ask_silent && rootEntry != menu) {
++ check_conf(menu);
++ return;
++ }
++ case P_COMMENT:
++ prompt = menu_get_prompt(menu);
++ if (prompt)
++ printf("%*c\n%*c %s\n%*c\n",
++ indent, '*',
++ indent, '*', prompt,
++ indent, '*');
++ default:
++ ;
++ }
++ }
++
++ if (!sym)
++ goto conf_childs;
++
++ if (sym_is_choice(sym)) {
++ conf_choice(menu);
++ if (sym->curr.tri != mod)
++ return;
++ goto conf_childs;
++ }
++
++ switch (sym->type) {
++ case S_INT:
++ case S_HEX:
++ case S_STRING:
++ conf_string(menu);
++ break;
++ default:
++ conf_sym(menu);
++ break;
++ }
++
++conf_childs:
++ if (sym)
++ indent += 2;
++ for (child = menu->list; child; child = child->next)
++ conf(child);
++ if (sym)
++ indent -= 2;
++}
++
++static void check_conf(struct menu *menu)
++{
++ struct symbol *sym;
++ struct menu *child;
++
++ if (!menu_is_visible(menu))
++ return;
++
++ sym = menu->sym;
++ if (sym) {
++ if (sym_is_changable(sym) && !sym_has_value(sym)) {
++ if (!conf_cnt++)
++ printf("*\n* Restart config...\n*\n");
++ rootEntry = menu_get_parent_menu(menu);
++ conf(rootEntry);
++ }
++ if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod)
++ return;
++ }
++
++ for (child = menu->list; child; child = child->next)
++ check_conf(child);
++}
++
++int main(int ac, char **av)
++{
++ int i = 1;
++ const char *name;
++ struct stat tmpstat;
++
++ if (ac > i && av[i][0] == '-') {
++ switch (av[i++][1]) {
++ case 'o':
++ input_mode = ask_new;
++ break;
++ case 's':
++ input_mode = ask_silent;
++ valid_stdin = isatty(0) && isatty(1) && isatty(2);
++ break;
++ case 'd':
++ input_mode = set_default;
++ break;
++ case 'D':
++ input_mode = set_default;
++ defconfig_file = av[i++];
++ if (!defconfig_file) {
++ printf("%s: No default config file specified\n",
++ av[0]);
++ exit(1);
++ }
++ break;
++ case 'n':
++ input_mode = set_no;
++ break;
++ case 'm':
++ input_mode = set_mod;
++ break;
++ case 'y':
++ input_mode = set_yes;
++ break;
++ case 'r':
++ input_mode = set_random;
++ srandom(time(NULL));
++ break;
++ case 'h':
++ case '?':
++ printf("%s [-o|-s] config\n", av[0]);
++ exit(0);
++ }
++ }
++ name = av[i];
++ if (!name) {
++ printf("%s: configuration file missing\n", av[0]);
++ }
++ conf_parse(name);
++ //zconfdump(stdout);
++ switch (input_mode) {
++ case set_default:
++ if (!defconfig_file)
++ defconfig_file = conf_get_default_confname();
++ if (conf_read(defconfig_file)) {
++ printf("***\n"
++ "*** Can't find default configuration \"%s\"!\n"
++ "***\n", defconfig_file);
++ exit(1);
++ }
++ break;
++ case ask_silent:
++ if (stat(".config", &tmpstat)) {
++ printf("***\n"
++ "*** You have not yet configured axTLS!\n"
++ "***\n"
++ "*** Please run some configurator (e.g. \"make oldconfig\" or\n"
++ "*** \"make menuconfig\" or \"make config\").\n"
++ "***\n");
++ exit(1);
++ }
++ case ask_all:
++ case ask_new:
++ conf_read(NULL);
++ break;
++ default:
++ break;
++ }
++
++ if (input_mode != ask_silent) {
++ rootEntry = &rootmenu;
++ conf(&rootmenu);
++ if (input_mode == ask_all) {
++ input_mode = ask_silent;
++ valid_stdin = 1;
++ }
++ }
++ do {
++ conf_cnt = 0;
++ check_conf(&rootmenu);
++ } while (conf_cnt);
++ if (conf_write(NULL)) {
++ fprintf(stderr, "\n*** Error during writing of the axTLS configuration.\n\n");
++ return 1;
++ }
++ return 0;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/confdata.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/confdata.c
+new file mode 100644
+index 0000000..a59e245
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/confdata.c
+@@ -0,0 +1,458 @@
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#include <sys/stat.h>
++#include <ctype.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++
++#define LKC_DIRECT_LINK
++#include "lkc.h"
++
++const char conf_def_filename[] = "config/.config";
++
++const char conf_defname[] = "config/defconfig";
++
++const char *conf_confnames[] = {
++ "config/.config",
++ conf_defname,
++ NULL,
++};
++
++static char *conf_expand_value(const char *in)
++{
++ struct symbol *sym;
++ const char *src;
++ static char res_value[SYMBOL_MAXLENGTH];
++ char *dst, name[SYMBOL_MAXLENGTH];
++
++ res_value[0] = 0;
++ dst = name;
++ while ((src = strchr(in, '$'))) {
++ strncat(res_value, in, src - in);
++ src++;
++ dst = name;
++ while (isalnum(*src) || *src == '_')
++ *dst++ = *src++;
++ *dst = 0;
++ sym = sym_lookup(name, 0);
++ sym_calc_value(sym);
++ strcat(res_value, sym_get_string_value(sym));
++ in = src;
++ }
++ strcat(res_value, in);
++
++ return res_value;
++}
++
++char *conf_get_default_confname(void)
++{
++ struct stat buf;
++ static char fullname[PATH_MAX+1];
++ char *env, *name;
++
++ name = conf_expand_value(conf_defname);
++ env = getenv(SRCTREE);
++ if (env) {
++ sprintf(fullname, "%s/%s", env, name);
++ if (!stat(fullname, &buf))
++ return fullname;
++ }
++ return name;
++}
++
++int conf_read(const char *name)
++{
++ FILE *in = NULL;
++ char line[1024];
++ char *p, *p2;
++ int lineno = 0;
++ struct symbol *sym;
++ struct property *prop;
++ struct expr *e;
++ int i;
++
++ if (name) {
++ in = zconf_fopen(name);
++ } else {
++ const char **names = conf_confnames;
++ while ((name = *names++)) {
++ name = conf_expand_value(name);
++ in = zconf_fopen(name);
++ if (in) {
++ printf("#\n"
++ "# using defaults found in %s\n"
++ "#\n", name);
++ break;
++ }
++ }
++ }
++
++ if (!in)
++ return 1;
++
++ for_all_symbols(i, sym) {
++ sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED;
++ sym->flags &= ~SYMBOL_VALID;
++ switch (sym->type) {
++ case S_INT:
++ case S_HEX:
++ case S_STRING:
++ if (sym->user.val)
++ free(sym->user.val);
++ default:
++ sym->user.val = NULL;
++ sym->user.tri = no;
++ }
++ }
++
++ while (fgets(line, sizeof(line), in)) {
++ lineno++;
++ sym = NULL;
++ switch (line[0]) {
++ case '#':
++ if (line[1]!=' ')
++ continue;
++ p = strchr(line + 2, ' ');
++ if (!p)
++ continue;
++ *p++ = 0;
++ if (strncmp(p, "is not set", 10))
++ continue;
++ sym = sym_find(line + 2);
++ if (!sym) {
++ fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 2);
++ break;
++ }
++ switch (sym->type) {
++ case S_BOOLEAN:
++ case S_TRISTATE:
++ sym->user.tri = no;
++ sym->flags &= ~SYMBOL_NEW;
++ break;
++ default:
++ ;
++ }
++ break;
++
++ case 'A' ... 'Z':
++ p = strchr(line, '=');
++ if (!p)
++ continue;
++ *p++ = 0;
++ p2 = strchr(p, '\n');
++ if (p2)
++ *p2 = 0;
++ sym = sym_find(line);
++ if (!sym) {
++ fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line);
++ break;
++ }
++ switch (sym->type) {
++ case S_TRISTATE:
++ if (p[0] == 'm') {
++ sym->user.tri = mod;
++ sym->flags &= ~SYMBOL_NEW;
++ break;
++ }
++ case S_BOOLEAN:
++ if (p[0] == 'y') {
++ sym->user.tri = yes;
++ sym->flags &= ~SYMBOL_NEW;
++ break;
++ }
++ if (p[0] == 'n') {
++ sym->user.tri = no;
++ sym->flags &= ~SYMBOL_NEW;
++ break;
++ }
++ break;
++ case S_STRING:
++ if (*p++ != '"')
++ break;
++ for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
++ if (*p2 == '"') {
++ *p2 = 0;
++ break;
++ }
++ memmove(p2, p2 + 1, strlen(p2));
++ }
++ if (!p2) {
++ fprintf(stderr, "%s:%d: invalid string found\n", name, lineno);
++ exit(1);
++ }
++ case S_INT:
++ case S_HEX:
++ if (sym_string_valid(sym, p)) {
++ sym->user.val = strdup(p);
++ sym->flags &= ~SYMBOL_NEW;
++ } else {
++ fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name);
++ exit(1);
++ }
++ break;
++ default:
++ ;
++ }
++ break;
++ case '\n':
++ break;
++ default:
++ continue;
++ }
++ if (sym && sym_is_choice_value(sym)) {
++ struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
++ switch (sym->user.tri) {
++ case no:
++ break;
++ case mod:
++ if (cs->user.tri == yes)
++ /* warn? */;
++ break;
++ case yes:
++ if (cs->user.tri != no)
++ /* warn? */;
++ cs->user.val = sym;
++ break;
++ }
++ cs->user.tri = E_OR(cs->user.tri, sym->user.tri);
++ cs->flags &= ~SYMBOL_NEW;
++ }
++ }
++ fclose(in);
++
++ if (modules_sym)
++ sym_calc_value(modules_sym);
++ for_all_symbols(i, sym) {
++ sym_calc_value(sym);
++ if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
++ if (sym->visible == no)
++ sym->flags |= SYMBOL_NEW;
++ switch (sym->type) {
++ case S_STRING:
++ case S_INT:
++ case S_HEX:
++ if (!sym_string_within_range(sym, sym->user.val))
++ sym->flags |= SYMBOL_NEW;
++ default:
++ break;
++ }
++ }
++ if (!sym_is_choice(sym))
++ continue;
++ prop = sym_get_choice_prop(sym);
++ for (e = prop->expr; e; e = e->left.expr)
++ if (e->right.sym->visible != no)
++ sym->flags |= e->right.sym->flags & SYMBOL_NEW;
++ }
++
++ sym_change_count = 1;
++
++ return 0;
++}
++
++struct menu *next_menu(struct menu *menu)
++{
++ if (menu->list) return menu->list;
++ do {
++ if (menu->next) {
++ menu = menu->next;
++ break;
++ }
++ } while ((menu = menu->parent));
++
++ return menu;
++}
++
++#define SYMBOL_FORCEWRITE (1<<31)
++
++int conf_write(const char *name)
++{
++ FILE *out, *out_h;
++ struct symbol *sym;
++ struct menu *menu;
++ const char *basename;
++ char dirname[128], tmpname[128], newname[128];
++ int type, l;
++ const char *str;
++
++ dirname[0] = 0;
++ if (name && name[0]) {
++ struct stat st;
++ char *slash;
++
++ if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
++ strcpy(dirname, name);
++ strcat(dirname, "/");
++ basename = conf_def_filename;
++ } else if ((slash = strrchr(name, '/'))) {
++ int size = slash - name + 1;
++ memcpy(dirname, name, size);
++ dirname[size] = 0;
++ if (slash[1])
++ basename = slash + 1;
++ else
++ basename = conf_def_filename;
++ } else
++ basename = name;
++ } else
++ basename = conf_def_filename;
++
++ sprintf(newname, "config/%s.tmpconfig.%d", dirname, (int)getpid());
++ out = fopen(newname, "w");
++ if (!out)
++ return 1;
++ out_h = NULL;
++ if (!name) {
++ out_h = fopen("config/.tmpconfig.h", "w");
++ if (!out_h)
++ return 1;
++ }
++ fprintf(out, "#\n"
++ "# Automatically generated make config: don't edit\n"
++ "#\n");
++ if (out_h) {
++ fprintf(out_h, "/*\n"
++ " * Automatically generated header file: don't edit\n"
++ " */\n\n");
++#if 0
++ "/* Version Number */\n"
++ "#define BB_VER \"%s\"\n"
++ "#define BB_BT \"%s\"\n",
++ getenv("VERSION"),
++ getenv("BUILDTIME"));
++ if (getenv("EXTRA_VERSION"))
++ fprintf(out_h, "#define BB_EXTRA_VERSION \"%s\"\n",
++ getenv("EXTRA_VERSION"));
++ fprintf(out_h, "\n");
++#endif
++ }
++
++ if (!sym_change_count)
++ sym_clear_all_valid();
++
++ /* Force write of all non-duplicate symbols. */
++
++ /* Write out everything by default. */
++ for(menu = rootmenu.list; menu; menu = next_menu(menu))
++ if (menu->sym) menu->sym->flags |= SYMBOL_FORCEWRITE;
++
++ menu = rootmenu.list;
++ while (menu) {
++ sym = menu->sym;
++ if (!sym) {
++ if (!menu_is_visible(menu))
++ goto next;
++ str = menu_get_prompt(menu);
++ fprintf(out, "\n"
++ "#\n"
++ "# %s\n"
++ "#\n", str);
++ if (out_h)
++ fprintf(out_h, "\n"
++ "/*\n"
++ " * %s\n"
++ " */\n", str);
++ } else if (!(sym->flags & SYMBOL_CHOICE)) {
++ sym_calc_value(sym);
++ if (!(sym->flags & SYMBOL_FORCEWRITE))
++ goto next;
++
++ sym->flags &= ~SYMBOL_FORCEWRITE;
++ type = sym->type;
++ if (type == S_TRISTATE) {
++ sym_calc_value(modules_sym);
++ if (modules_sym->curr.tri == no)
++ type = S_BOOLEAN;
++ }
++ switch (type) {
++ case S_BOOLEAN:
++ case S_TRISTATE:
++ switch (sym_get_tristate_value(sym)) {
++ case no:
++ fprintf(out, "# %s is not set\n", sym->name);
++ if (out_h)
++ fprintf(out_h, "#undef %s\n", sym->name);
++ break;
++ case mod:
++#if 0
++ fprintf(out, "%s=m\n", sym->name);
++ if (out_h)
++ fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
++#endif
++ break;
++ case yes:
++ fprintf(out, "%s=y\n", sym->name);
++ if (out_h)
++ fprintf(out_h, "#define %s 1\n", sym->name);
++ break;
++ }
++ break;
++ case S_STRING:
++ // fix me
++ str = sym_get_string_value(sym);
++ fprintf(out, "%s=\"", sym->name);
++ if (out_h)
++ fprintf(out_h, "#define %s \"", sym->name);
++ do {
++ l = strcspn(str, "\"\\");
++ if (l) {
++ fwrite(str, l, 1, out);
++ if (out_h)
++ fwrite(str, l, 1, out_h);
++ }
++ str += l;
++ while (*str == '\\' || *str == '"') {
++ fprintf(out, "\\%c", *str);
++ if (out_h)
++ fprintf(out_h, "\\%c", *str);
++ str++;
++ }
++ } while (*str);
++ fputs("\"\n", out);
++ if (out_h)
++ fputs("\"\n", out_h);
++ break;
++ case S_HEX:
++ str = sym_get_string_value(sym);
++ if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
++ fprintf(out, "%s=%s\n", sym->name, *str ? str : "0");
++ if (out_h)
++ fprintf(out_h, "#define %s 0x%s\n", sym->name, str);
++ break;
++ }
++ case S_INT:
++ str = sym_get_string_value(sym);
++ fprintf(out, "%s=%s\n", sym->name, *str ? str : "0");
++ if (out_h)
++ fprintf(out_h, "#define %s %s\n", sym->name, str);
++ break;
++ }
++ }
++next:
++ menu = next_menu(menu);
++ }
++ fclose(out);
++ if (out_h) {
++ fclose(out_h);
++ rename("config/.tmpconfig.h", "config/config.h");
++ file_write_dep(NULL);
++ }
++ if (!name || basename != conf_def_filename) {
++ if (!name)
++ name = conf_def_filename;
++ sprintf(tmpname, "%s.old", name);
++ rename(name, tmpname);
++ }
++ sprintf(tmpname, "%s%s", dirname, basename);
++ if (rename(newname, tmpname))
++ return 1;
++
++ sym_change_count = 0;
++
++ return 0;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.c
+new file mode 100644
+index 0000000..30e4f9d
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.c
+@@ -0,0 +1,1099 @@
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#define LKC_DIRECT_LINK
++#include "lkc.h"
++
++#define DEBUG_EXPR 0
++
++struct expr *expr_alloc_symbol(struct symbol *sym)
++{
++ struct expr *e = malloc(sizeof(*e));
++ memset(e, 0, sizeof(*e));
++ e->type = E_SYMBOL;
++ e->left.sym = sym;
++ return e;
++}
++
++struct expr *expr_alloc_one(enum expr_type type, struct expr *ce)
++{
++ struct expr *e = malloc(sizeof(*e));
++ memset(e, 0, sizeof(*e));
++ e->type = type;
++ e->left.expr = ce;
++ return e;
++}
++
++struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2)
++{
++ struct expr *e = malloc(sizeof(*e));
++ memset(e, 0, sizeof(*e));
++ e->type = type;
++ e->left.expr = e1;
++ e->right.expr = e2;
++ return e;
++}
++
++struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2)
++{
++ struct expr *e = malloc(sizeof(*e));
++ memset(e, 0, sizeof(*e));
++ e->type = type;
++ e->left.sym = s1;
++ e->right.sym = s2;
++ return e;
++}
++
++struct expr *expr_alloc_and(struct expr *e1, struct expr *e2)
++{
++ if (!e1)
++ return e2;
++ return e2 ? expr_alloc_two(E_AND, e1, e2) : e1;
++}
++
++struct expr *expr_alloc_or(struct expr *e1, struct expr *e2)
++{
++ if (!e1)
++ return e2;
++ return e2 ? expr_alloc_two(E_OR, e1, e2) : e1;
++}
++
++struct expr *expr_copy(struct expr *org)
++{
++ struct expr *e;
++
++ if (!org)
++ return NULL;
++
++ e = malloc(sizeof(*org));
++ memcpy(e, org, sizeof(*org));
++ switch (org->type) {
++ case E_SYMBOL:
++ e->left = org->left;
++ break;
++ case E_NOT:
++ e->left.expr = expr_copy(org->left.expr);
++ break;
++ case E_EQUAL:
++ case E_UNEQUAL:
++ e->left.sym = org->left.sym;
++ e->right.sym = org->right.sym;
++ break;
++ case E_AND:
++ case E_OR:
++ case E_CHOICE:
++ e->left.expr = expr_copy(org->left.expr);
++ e->right.expr = expr_copy(org->right.expr);
++ break;
++ default:
++ printf("can't copy type %d\n", e->type);
++ free(e);
++ e = NULL;
++ break;
++ }
++
++ return e;
++}
++
++void expr_free(struct expr *e)
++{
++ if (!e)
++ return;
++
++ switch (e->type) {
++ case E_SYMBOL:
++ break;
++ case E_NOT:
++ expr_free(e->left.expr);
++ return;
++ case E_EQUAL:
++ case E_UNEQUAL:
++ break;
++ case E_OR:
++ case E_AND:
++ expr_free(e->left.expr);
++ expr_free(e->right.expr);
++ break;
++ default:
++ printf("how to free type %d?\n", e->type);
++ break;
++ }
++ free(e);
++}
++
++static int trans_count;
++
++#define e1 (*ep1)
++#define e2 (*ep2)
++
++static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2)
++{
++ if (e1->type == type) {
++ __expr_eliminate_eq(type, &e1->left.expr, &e2);
++ __expr_eliminate_eq(type, &e1->right.expr, &e2);
++ return;
++ }
++ if (e2->type == type) {
++ __expr_eliminate_eq(type, &e1, &e2->left.expr);
++ __expr_eliminate_eq(type, &e1, &e2->right.expr);
++ return;
++ }
++ if (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
++ e1->left.sym == e2->left.sym && (e1->left.sym->flags & (SYMBOL_YES|SYMBOL_NO)))
++ return;
++ if (!expr_eq(e1, e2))
++ return;
++ trans_count++;
++ expr_free(e1); expr_free(e2);
++ switch (type) {
++ case E_OR:
++ e1 = expr_alloc_symbol(&symbol_no);
++ e2 = expr_alloc_symbol(&symbol_no);
++ break;
++ case E_AND:
++ e1 = expr_alloc_symbol(&symbol_yes);
++ e2 = expr_alloc_symbol(&symbol_yes);
++ break;
++ default:
++ ;
++ }
++}
++
++void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
++{
++ if (!e1 || !e2)
++ return;
++ switch (e1->type) {
++ case E_OR:
++ case E_AND:
++ __expr_eliminate_eq(e1->type, ep1, ep2);
++ default:
++ ;
++ }
++ if (e1->type != e2->type) switch (e2->type) {
++ case E_OR:
++ case E_AND:
++ __expr_eliminate_eq(e2->type, ep1, ep2);
++ default:
++ ;
++ }
++ e1 = expr_eliminate_yn(e1);
++ e2 = expr_eliminate_yn(e2);
++}
++
++#undef e1
++#undef e2
++
++int expr_eq(struct expr *e1, struct expr *e2)
++{
++ int res, old_count;
++
++ if (e1->type != e2->type)
++ return 0;
++ switch (e1->type) {
++ case E_EQUAL:
++ case E_UNEQUAL:
++ return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym;
++ case E_SYMBOL:
++ return e1->left.sym == e2->left.sym;
++ case E_NOT:
++ return expr_eq(e1->left.expr, e2->left.expr);
++ case E_AND:
++ case E_OR:
++ e1 = expr_copy(e1);
++ e2 = expr_copy(e2);
++ old_count = trans_count;
++ expr_eliminate_eq(&e1, &e2);
++ res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
++ e1->left.sym == e2->left.sym);
++ expr_free(e1);
++ expr_free(e2);
++ trans_count = old_count;
++ return res;
++ case E_CHOICE:
++ case E_RANGE:
++ case E_NONE:
++ /* panic */;
++ }
++
++ if (DEBUG_EXPR) {
++ expr_fprint(e1, stdout);
++ printf(" = ");
++ expr_fprint(e2, stdout);
++ printf(" ?\n");
++ }
++
++ return 0;
++}
++
++struct expr *expr_eliminate_yn(struct expr *e)
++{
++ struct expr *tmp;
++
++ if (e) switch (e->type) {
++ case E_AND:
++ e->left.expr = expr_eliminate_yn(e->left.expr);
++ e->right.expr = expr_eliminate_yn(e->right.expr);
++ if (e->left.expr->type == E_SYMBOL) {
++ if (e->left.expr->left.sym == &symbol_no) {
++ expr_free(e->left.expr);
++ expr_free(e->right.expr);
++ e->type = E_SYMBOL;
++ e->left.sym = &symbol_no;
++ e->right.expr = NULL;
++ return e;
++ } else if (e->left.expr->left.sym == &symbol_yes) {
++ free(e->left.expr);
++ tmp = e->right.expr;
++ *e = *(e->right.expr);
++ free(tmp);
++ return e;
++ }
++ }
++ if (e->right.expr->type == E_SYMBOL) {
++ if (e->right.expr->left.sym == &symbol_no) {
++ expr_free(e->left.expr);
++ expr_free(e->right.expr);
++ e->type = E_SYMBOL;
++ e->left.sym = &symbol_no;
++ e->right.expr = NULL;
++ return e;
++ } else if (e->right.expr->left.sym == &symbol_yes) {
++ free(e->right.expr);
++ tmp = e->left.expr;
++ *e = *(e->left.expr);
++ free(tmp);
++ return e;
++ }
++ }
++ break;
++ case E_OR:
++ e->left.expr = expr_eliminate_yn(e->left.expr);
++ e->right.expr = expr_eliminate_yn(e->right.expr);
++ if (e->left.expr->type == E_SYMBOL) {
++ if (e->left.expr->left.sym == &symbol_no) {
++ free(e->left.expr);
++ tmp = e->right.expr;
++ *e = *(e->right.expr);
++ free(tmp);
++ return e;
++ } else if (e->left.expr->left.sym == &symbol_yes) {
++ expr_free(e->left.expr);
++ expr_free(e->right.expr);
++ e->type = E_SYMBOL;
++ e->left.sym = &symbol_yes;
++ e->right.expr = NULL;
++ return e;
++ }
++ }
++ if (e->right.expr->type == E_SYMBOL) {
++ if (e->right.expr->left.sym == &symbol_no) {
++ free(e->right.expr);
++ tmp = e->left.expr;
++ *e = *(e->left.expr);
++ free(tmp);
++ return e;
++ } else if (e->right.expr->left.sym == &symbol_yes) {
++ expr_free(e->left.expr);
++ expr_free(e->right.expr);
++ e->type = E_SYMBOL;
++ e->left.sym = &symbol_yes;
++ e->right.expr = NULL;
++ return e;
++ }
++ }
++ break;
++ default:
++ ;
++ }
++ return e;
++}
++
++/*
++ * bool FOO!=n => FOO
++ */
++struct expr *expr_trans_bool(struct expr *e)
++{
++ if (!e)
++ return NULL;
++ switch (e->type) {
++ case E_AND:
++ case E_OR:
++ case E_NOT:
++ e->left.expr = expr_trans_bool(e->left.expr);
++ e->right.expr = expr_trans_bool(e->right.expr);
++ break;
++ case E_UNEQUAL:
++ // FOO!=n -> FOO
++ if (e->left.sym->type == S_TRISTATE) {
++ if (e->right.sym == &symbol_no) {
++ e->type = E_SYMBOL;
++ e->right.sym = NULL;
++ }
++ }
++ break;
++ default:
++ ;
++ }
++ return e;
++}
++
++/*
++ * e1 || e2 -> ?
++ */
++struct expr *expr_join_or(struct expr *e1, struct expr *e2)
++{
++ struct expr *tmp;
++ struct symbol *sym1, *sym2;
++
++ if (expr_eq(e1, e2))
++ return expr_copy(e1);
++ if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
++ return NULL;
++ if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
++ return NULL;
++ if (e1->type == E_NOT) {
++ tmp = e1->left.expr;
++ if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
++ return NULL;
++ sym1 = tmp->left.sym;
++ } else
++ sym1 = e1->left.sym;
++ if (e2->type == E_NOT) {
++ if (e2->left.expr->type != E_SYMBOL)
++ return NULL;
++ sym2 = e2->left.expr->left.sym;
++ } else
++ sym2 = e2->left.sym;
++ if (sym1 != sym2)
++ return NULL;
++ if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
++ return NULL;
++ if (sym1->type == S_TRISTATE) {
++ if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
++ ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
++ (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) {
++ // (a='y') || (a='m') -> (a!='n')
++ return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no);
++ }
++ if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
++ ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
++ (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) {
++ // (a='y') || (a='n') -> (a!='m')
++ return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod);
++ }
++ if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
++ ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
++ (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) {
++ // (a='m') || (a='n') -> (a!='y')
++ return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes);
++ }
++ }
++ if (sym1->type == S_BOOLEAN && sym1 == sym2) {
++ if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) ||
++ (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL))
++ return expr_alloc_symbol(&symbol_yes);
++ }
++
++ if (DEBUG_EXPR) {
++ printf("optimize (");
++ expr_fprint(e1, stdout);
++ printf(") || (");
++ expr_fprint(e2, stdout);
++ printf(")?\n");
++ }
++ return NULL;
++}
++
++struct expr *expr_join_and(struct expr *e1, struct expr *e2)
++{
++ struct expr *tmp;
++ struct symbol *sym1, *sym2;
++
++ if (expr_eq(e1, e2))
++ return expr_copy(e1);
++ if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
++ return NULL;
++ if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
++ return NULL;
++ if (e1->type == E_NOT) {
++ tmp = e1->left.expr;
++ if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
++ return NULL;
++ sym1 = tmp->left.sym;
++ } else
++ sym1 = e1->left.sym;
++ if (e2->type == E_NOT) {
++ if (e2->left.expr->type != E_SYMBOL)
++ return NULL;
++ sym2 = e2->left.expr->left.sym;
++ } else
++ sym2 = e2->left.sym;
++ if (sym1 != sym2)
++ return NULL;
++ if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
++ return NULL;
++
++ if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) ||
++ (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes))
++ // (a) && (a='y') -> (a='y')
++ return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
++
++ if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) ||
++ (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no))
++ // (a) && (a!='n') -> (a)
++ return expr_alloc_symbol(sym1);
++
++ if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) ||
++ (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod))
++ // (a) && (a!='m') -> (a='y')
++ return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
++
++ if (sym1->type == S_TRISTATE) {
++ if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) {
++ // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
++ sym2 = e1->right.sym;
++ if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
++ return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
++ : expr_alloc_symbol(&symbol_no);
++ }
++ if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) {
++ // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
++ sym2 = e2->right.sym;
++ if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
++ return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
++ : expr_alloc_symbol(&symbol_no);
++ }
++ if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
++ ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
++ (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes)))
++ // (a!='y') && (a!='n') -> (a='m')
++ return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod);
++
++ if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
++ ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
++ (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes)))
++ // (a!='y') && (a!='m') -> (a='n')
++ return expr_alloc_comp(E_EQUAL, sym1, &symbol_no);
++
++ if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
++ ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
++ (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod)))
++ // (a!='m') && (a!='n') -> (a='m')
++ return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
++
++ if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) ||
++ (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) ||
++ (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) ||
++ (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes))
++ return NULL;
++ }
++
++ if (DEBUG_EXPR) {
++ printf("optimize (");
++ expr_fprint(e1, stdout);
++ printf(") && (");
++ expr_fprint(e2, stdout);
++ printf(")?\n");
++ }
++ return NULL;
++}
++
++static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2)
++{
++#define e1 (*ep1)
++#define e2 (*ep2)
++ struct expr *tmp;
++
++ if (e1->type == type) {
++ expr_eliminate_dups1(type, &e1->left.expr, &e2);
++ expr_eliminate_dups1(type, &e1->right.expr, &e2);
++ return;
++ }
++ if (e2->type == type) {
++ expr_eliminate_dups1(type, &e1, &e2->left.expr);
++ expr_eliminate_dups1(type, &e1, &e2->right.expr);
++ return;
++ }
++ if (e1 == e2)
++ return;
++
++ switch (e1->type) {
++ case E_OR: case E_AND:
++ expr_eliminate_dups1(e1->type, &e1, &e1);
++ default:
++ ;
++ }
++
++ switch (type) {
++ case E_OR:
++ tmp = expr_join_or(e1, e2);
++ if (tmp) {
++ expr_free(e1); expr_free(e2);
++ e1 = expr_alloc_symbol(&symbol_no);
++ e2 = tmp;
++ trans_count++;
++ }
++ break;
++ case E_AND:
++ tmp = expr_join_and(e1, e2);
++ if (tmp) {
++ expr_free(e1); expr_free(e2);
++ e1 = expr_alloc_symbol(&symbol_yes);
++ e2 = tmp;
++ trans_count++;
++ }
++ break;
++ default:
++ ;
++ }
++#undef e1
++#undef e2
++}
++
++static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2)
++{
++#define e1 (*ep1)
++#define e2 (*ep2)
++ struct expr *tmp, *tmp1, *tmp2;
++
++ if (e1->type == type) {
++ expr_eliminate_dups2(type, &e1->left.expr, &e2);
++ expr_eliminate_dups2(type, &e1->right.expr, &e2);
++ return;
++ }
++ if (e2->type == type) {
++ expr_eliminate_dups2(type, &e1, &e2->left.expr);
++ expr_eliminate_dups2(type, &e1, &e2->right.expr);
++ }
++ if (e1 == e2)
++ return;
++
++ switch (e1->type) {
++ case E_OR:
++ expr_eliminate_dups2(e1->type, &e1, &e1);
++ // (FOO || BAR) && (!FOO && !BAR) -> n
++ tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
++ tmp2 = expr_copy(e2);
++ tmp = expr_extract_eq_and(&tmp1, &tmp2);
++ if (expr_is_yes(tmp1)) {
++ expr_free(e1);
++ e1 = expr_alloc_symbol(&symbol_no);
++ trans_count++;
++ }
++ expr_free(tmp2);
++ expr_free(tmp1);
++ expr_free(tmp);
++ break;
++ case E_AND:
++ expr_eliminate_dups2(e1->type, &e1, &e1);
++ // (FOO && BAR) || (!FOO || !BAR) -> y
++ tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
++ tmp2 = expr_copy(e2);
++ tmp = expr_extract_eq_or(&tmp1, &tmp2);
++ if (expr_is_no(tmp1)) {
++ expr_free(e1);
++ e1 = expr_alloc_symbol(&symbol_yes);
++ trans_count++;
++ }
++ expr_free(tmp2);
++ expr_free(tmp1);
++ expr_free(tmp);
++ break;
++ default:
++ ;
++ }
++#undef e1
++#undef e2
++}
++
++struct expr *expr_eliminate_dups(struct expr *e)
++{
++ int oldcount;
++ if (!e)
++ return e;
++
++ oldcount = trans_count;
++ while (1) {
++ trans_count = 0;
++ switch (e->type) {
++ case E_OR: case E_AND:
++ expr_eliminate_dups1(e->type, &e, &e);
++ expr_eliminate_dups2(e->type, &e, &e);
++ default:
++ ;
++ }
++ if (!trans_count)
++ break;
++ e = expr_eliminate_yn(e);
++ }
++ trans_count = oldcount;
++ return e;
++}
++
++struct expr *expr_transform(struct expr *e)
++{
++ struct expr *tmp;
++
++ if (!e)
++ return NULL;
++ switch (e->type) {
++ case E_EQUAL:
++ case E_UNEQUAL:
++ case E_SYMBOL:
++ case E_CHOICE:
++ break;
++ default:
++ e->left.expr = expr_transform(e->left.expr);
++ e->right.expr = expr_transform(e->right.expr);
++ }
++
++ switch (e->type) {
++ case E_EQUAL:
++ if (e->left.sym->type != S_BOOLEAN)
++ break;
++ if (e->right.sym == &symbol_no) {
++ e->type = E_NOT;
++ e->left.expr = expr_alloc_symbol(e->left.sym);
++ e->right.sym = NULL;
++ break;
++ }
++ if (e->right.sym == &symbol_mod) {
++ printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name);
++ e->type = E_SYMBOL;
++ e->left.sym = &symbol_no;
++ e->right.sym = NULL;
++ break;
++ }
++ if (e->right.sym == &symbol_yes) {
++ e->type = E_SYMBOL;
++ e->right.sym = NULL;
++ break;
++ }
++ break;
++ case E_UNEQUAL:
++ if (e->left.sym->type != S_BOOLEAN)
++ break;
++ if (e->right.sym == &symbol_no) {
++ e->type = E_SYMBOL;
++ e->right.sym = NULL;
++ break;
++ }
++ if (e->right.sym == &symbol_mod) {
++ printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name);
++ e->type = E_SYMBOL;
++ e->left.sym = &symbol_yes;
++ e->right.sym = NULL;
++ break;
++ }
++ if (e->right.sym == &symbol_yes) {
++ e->type = E_NOT;
++ e->left.expr = expr_alloc_symbol(e->left.sym);
++ e->right.sym = NULL;
++ break;
++ }
++ break;
++ case E_NOT:
++ switch (e->left.expr->type) {
++ case E_NOT:
++ // !!a -> a
++ tmp = e->left.expr->left.expr;
++ free(e->left.expr);
++ free(e);
++ e = tmp;
++ e = expr_transform(e);
++ break;
++ case E_EQUAL:
++ case E_UNEQUAL:
++ // !a='x' -> a!='x'
++ tmp = e->left.expr;
++ free(e);
++ e = tmp;
++ e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL;
++ break;
++ case E_OR:
++ // !(a || b) -> !a && !b
++ tmp = e->left.expr;
++ e->type = E_AND;
++ e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
++ tmp->type = E_NOT;
++ tmp->right.expr = NULL;
++ e = expr_transform(e);
++ break;
++ case E_AND:
++ // !(a && b) -> !a || !b
++ tmp = e->left.expr;
++ e->type = E_OR;
++ e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
++ tmp->type = E_NOT;
++ tmp->right.expr = NULL;
++ e = expr_transform(e);
++ break;
++ case E_SYMBOL:
++ if (e->left.expr->left.sym == &symbol_yes) {
++ // !'y' -> 'n'
++ tmp = e->left.expr;
++ free(e);
++ e = tmp;
++ e->type = E_SYMBOL;
++ e->left.sym = &symbol_no;
++ break;
++ }
++ if (e->left.expr->left.sym == &symbol_mod) {
++ // !'m' -> 'm'
++ tmp = e->left.expr;
++ free(e);
++ e = tmp;
++ e->type = E_SYMBOL;
++ e->left.sym = &symbol_mod;
++ break;
++ }
++ if (e->left.expr->left.sym == &symbol_no) {
++ // !'n' -> 'y'
++ tmp = e->left.expr;
++ free(e);
++ e = tmp;
++ e->type = E_SYMBOL;
++ e->left.sym = &symbol_yes;
++ break;
++ }
++ break;
++ default:
++ ;
++ }
++ break;
++ default:
++ ;
++ }
++ return e;
++}
++
++int expr_contains_symbol(struct expr *dep, struct symbol *sym)
++{
++ if (!dep)
++ return 0;
++
++ switch (dep->type) {
++ case E_AND:
++ case E_OR:
++ return expr_contains_symbol(dep->left.expr, sym) ||
++ expr_contains_symbol(dep->right.expr, sym);
++ case E_SYMBOL:
++ return dep->left.sym == sym;
++ case E_EQUAL:
++ case E_UNEQUAL:
++ return dep->left.sym == sym ||
++ dep->right.sym == sym;
++ case E_NOT:
++ return expr_contains_symbol(dep->left.expr, sym);
++ default:
++ ;
++ }
++ return 0;
++}
++
++bool expr_depends_symbol(struct expr *dep, struct symbol *sym)
++{
++ if (!dep)
++ return false;
++
++ switch (dep->type) {
++ case E_AND:
++ return expr_depends_symbol(dep->left.expr, sym) ||
++ expr_depends_symbol(dep->right.expr, sym);
++ case E_SYMBOL:
++ return dep->left.sym == sym;
++ case E_EQUAL:
++ if (dep->left.sym == sym) {
++ if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod)
++ return true;
++ }
++ break;
++ case E_UNEQUAL:
++ if (dep->left.sym == sym) {
++ if (dep->right.sym == &symbol_no)
++ return true;
++ }
++ break;
++ default:
++ ;
++ }
++ return false;
++}
++
++struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2)
++{
++ struct expr *tmp = NULL;
++ expr_extract_eq(E_AND, &tmp, ep1, ep2);
++ if (tmp) {
++ *ep1 = expr_eliminate_yn(*ep1);
++ *ep2 = expr_eliminate_yn(*ep2);
++ }
++ return tmp;
++}
++
++struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2)
++{
++ struct expr *tmp = NULL;
++ expr_extract_eq(E_OR, &tmp, ep1, ep2);
++ if (tmp) {
++ *ep1 = expr_eliminate_yn(*ep1);
++ *ep2 = expr_eliminate_yn(*ep2);
++ }
++ return tmp;
++}
++
++void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2)
++{
++#define e1 (*ep1)
++#define e2 (*ep2)
++ if (e1->type == type) {
++ expr_extract_eq(type, ep, &e1->left.expr, &e2);
++ expr_extract_eq(type, ep, &e1->right.expr, &e2);
++ return;
++ }
++ if (e2->type == type) {
++ expr_extract_eq(type, ep, ep1, &e2->left.expr);
++ expr_extract_eq(type, ep, ep1, &e2->right.expr);
++ return;
++ }
++ if (expr_eq(e1, e2)) {
++ *ep = *ep ? expr_alloc_two(type, *ep, e1) : e1;
++ expr_free(e2);
++ if (type == E_AND) {
++ e1 = expr_alloc_symbol(&symbol_yes);
++ e2 = expr_alloc_symbol(&symbol_yes);
++ } else if (type == E_OR) {
++ e1 = expr_alloc_symbol(&symbol_no);
++ e2 = expr_alloc_symbol(&symbol_no);
++ }
++ }
++#undef e1
++#undef e2
++}
++
++struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym)
++{
++ struct expr *e1, *e2;
++
++ if (!e) {
++ e = expr_alloc_symbol(sym);
++ if (type == E_UNEQUAL)
++ e = expr_alloc_one(E_NOT, e);
++ return e;
++ }
++ switch (e->type) {
++ case E_AND:
++ e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
++ e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
++ if (sym == &symbol_yes)
++ e = expr_alloc_two(E_AND, e1, e2);
++ if (sym == &symbol_no)
++ e = expr_alloc_two(E_OR, e1, e2);
++ if (type == E_UNEQUAL)
++ e = expr_alloc_one(E_NOT, e);
++ return e;
++ case E_OR:
++ e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
++ e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
++ if (sym == &symbol_yes)
++ e = expr_alloc_two(E_OR, e1, e2);
++ if (sym == &symbol_no)
++ e = expr_alloc_two(E_AND, e1, e2);
++ if (type == E_UNEQUAL)
++ e = expr_alloc_one(E_NOT, e);
++ return e;
++ case E_NOT:
++ return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym);
++ case E_UNEQUAL:
++ case E_EQUAL:
++ if (type == E_EQUAL) {
++ if (sym == &symbol_yes)
++ return expr_copy(e);
++ if (sym == &symbol_mod)
++ return expr_alloc_symbol(&symbol_no);
++ if (sym == &symbol_no)
++ return expr_alloc_one(E_NOT, expr_copy(e));
++ } else {
++ if (sym == &symbol_yes)
++ return expr_alloc_one(E_NOT, expr_copy(e));
++ if (sym == &symbol_mod)
++ return expr_alloc_symbol(&symbol_yes);
++ if (sym == &symbol_no)
++ return expr_copy(e);
++ }
++ break;
++ case E_SYMBOL:
++ return expr_alloc_comp(type, e->left.sym, sym);
++ case E_CHOICE:
++ case E_RANGE:
++ case E_NONE:
++ /* panic */;
++ }
++ return NULL;
++}
++
++tristate expr_calc_value(struct expr *e)
++{
++ tristate val1, val2;
++ const char *str1, *str2;
++
++ if (!e)
++ return yes;
++
++ switch (e->type) {
++ case E_SYMBOL:
++ sym_calc_value(e->left.sym);
++ return e->left.sym->curr.tri;
++ case E_AND:
++ val1 = expr_calc_value(e->left.expr);
++ val2 = expr_calc_value(e->right.expr);
++ return E_AND(val1, val2);
++ case E_OR:
++ val1 = expr_calc_value(e->left.expr);
++ val2 = expr_calc_value(e->right.expr);
++ return E_OR(val1, val2);
++ case E_NOT:
++ val1 = expr_calc_value(e->left.expr);
++ return E_NOT(val1);
++ case E_EQUAL:
++ sym_calc_value(e->left.sym);
++ sym_calc_value(e->right.sym);
++ str1 = sym_get_string_value(e->left.sym);
++ str2 = sym_get_string_value(e->right.sym);
++ return !strcmp(str1, str2) ? yes : no;
++ case E_UNEQUAL:
++ sym_calc_value(e->left.sym);
++ sym_calc_value(e->right.sym);
++ str1 = sym_get_string_value(e->left.sym);
++ str2 = sym_get_string_value(e->right.sym);
++ return !strcmp(str1, str2) ? no : yes;
++ default:
++ printf("expr_calc_value: %d?\n", e->type);
++ return no;
++ }
++}
++
++int expr_compare_type(enum expr_type t1, enum expr_type t2)
++{
++#if 0
++ return 1;
++#else
++ if (t1 == t2)
++ return 0;
++ switch (t1) {
++ case E_EQUAL:
++ case E_UNEQUAL:
++ if (t2 == E_NOT)
++ return 1;
++ case E_NOT:
++ if (t2 == E_AND)
++ return 1;
++ case E_AND:
++ if (t2 == E_OR)
++ return 1;
++ case E_OR:
++ if (t2 == E_CHOICE)
++ return 1;
++ case E_CHOICE:
++ if (t2 == 0)
++ return 1;
++ default:
++ return -1;
++ }
++ printf("[%dgt%d?]", t1, t2);
++ return 0;
++#endif
++}
++
++void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)
++{
++ if (!e) {
++ fn(data, "y");
++ return;
++ }
++
++ if (expr_compare_type(prevtoken, e->type) > 0)
++ fn(data, "(");
++ switch (e->type) {
++ case E_SYMBOL:
++ if (e->left.sym->name)
++ fn(data, e->left.sym->name);
++ else
++ fn(data, "<choice>");
++ break;
++ case E_NOT:
++ fn(data, "!");
++ expr_print(e->left.expr, fn, data, E_NOT);
++ break;
++ case E_EQUAL:
++ fn(data, e->left.sym->name);
++ fn(data, "=");
++ fn(data, e->right.sym->name);
++ break;
++ case E_UNEQUAL:
++ fn(data, e->left.sym->name);
++ fn(data, "!=");
++ fn(data, e->right.sym->name);
++ break;
++ case E_OR:
++ expr_print(e->left.expr, fn, data, E_OR);
++ fn(data, " || ");
++ expr_print(e->right.expr, fn, data, E_OR);
++ break;
++ case E_AND:
++ expr_print(e->left.expr, fn, data, E_AND);
++ fn(data, " && ");
++ expr_print(e->right.expr, fn, data, E_AND);
++ break;
++ case E_CHOICE:
++ fn(data, e->right.sym->name);
++ if (e->left.expr) {
++ fn(data, " ^ ");
++ expr_print(e->left.expr, fn, data, E_CHOICE);
++ }
++ break;
++ case E_RANGE:
++ fn(data, "[");
++ fn(data, e->left.sym->name);
++ fn(data, " ");
++ fn(data, e->right.sym->name);
++ fn(data, "]");
++ break;
++ default:
++ {
++ char buf[32];
++ sprintf(buf, "<unknown type %d>", e->type);
++ fn(data, buf);
++ break;
++ }
++ }
++ if (expr_compare_type(prevtoken, e->type) > 0)
++ fn(data, ")");
++}
++
++static void expr_print_file_helper(void *data, const char *str)
++{
++ fwrite(str, strlen(str), 1, data);
++}
++
++void expr_fprint(struct expr *e, FILE *out)
++{
++ expr_print(e, expr_print_file_helper, out, E_NONE);
++}
++
++static void expr_print_gstr_helper(void *data, const char *str)
++{
++ str_append((struct gstr*)data, str);
++}
++
++void expr_gstr_print(struct expr *e, struct gstr *gs)
++{
++ expr_print(e, expr_print_gstr_helper, gs, E_NONE);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.h b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.h
+new file mode 100644
+index 0000000..7d39ff4
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.h
+@@ -0,0 +1,195 @@
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#ifndef EXPR_H
++#define EXPR_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdio.h>
++#ifndef __cplusplus
++#include <stdbool.h>
++#endif
++
++struct file {
++ struct file *next;
++ struct file *parent;
++ char *name;
++ int lineno;
++ int flags;
++};
++
++#define FILE_BUSY 0x0001
++#define FILE_SCANNED 0x0002
++#define FILE_PRINTED 0x0004
++
++typedef enum tristate {
++ no, mod, yes
++} tristate;
++
++enum expr_type {
++ E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
++};
++
++union expr_data {
++ struct expr *expr;
++ struct symbol *sym;
++};
++
++struct expr {
++ enum expr_type type;
++ union expr_data left, right;
++};
++
++#define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2))
++#define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2))
++#define E_NOT(dep) (2-(dep))
++
++struct expr_value {
++ struct expr *expr;
++ tristate tri;
++};
++
++struct symbol_value {
++ void *val;
++ tristate tri;
++};
++
++enum symbol_type {
++ S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
++};
++
++struct symbol {
++ struct symbol *next;
++ char *name;
++ char *help;
++ enum symbol_type type;
++ struct symbol_value curr, user;
++ tristate visible;
++ int flags;
++ struct property *prop;
++ struct expr *dep, *dep2;
++ struct expr_value rev_dep;
++};
++
++#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
++
++#define SYMBOL_YES 0x0001
++#define SYMBOL_MOD 0x0002
++#define SYMBOL_NO 0x0004
++#define SYMBOL_CONST 0x0007
++#define SYMBOL_CHECK 0x0008
++#define SYMBOL_CHOICE 0x0010
++#define SYMBOL_CHOICEVAL 0x0020
++#define SYMBOL_PRINTED 0x0040
++#define SYMBOL_VALID 0x0080
++#define SYMBOL_OPTIONAL 0x0100
++#define SYMBOL_WRITE 0x0200
++#define SYMBOL_CHANGED 0x0400
++#define SYMBOL_NEW 0x0800
++#define SYMBOL_AUTO 0x1000
++#define SYMBOL_CHECKED 0x2000
++#define SYMBOL_CHECK_DONE 0x4000
++#define SYMBOL_WARNED 0x8000
++
++#define SYMBOL_MAXLENGTH 256
++#define SYMBOL_HASHSIZE 257
++#define SYMBOL_HASHMASK 0xff
++
++enum prop_type {
++ P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
++};
++
++struct property {
++ struct property *next;
++ struct symbol *sym;
++ enum prop_type type;
++ const char *text;
++ struct expr_value visible;
++ struct expr *expr;
++ struct menu *menu;
++ struct file *file;
++ int lineno;
++};
++
++#define for_all_properties(sym, st, tok) \
++ for (st = sym->prop; st; st = st->next) \
++ if (st->type == (tok))
++#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
++#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
++#define for_all_prompts(sym, st) \
++ for (st = sym->prop; st; st = st->next) \
++ if (st->text)
++
++struct menu {
++ struct menu *next;
++ struct menu *parent;
++ struct menu *list;
++ struct symbol *sym;
++ struct property *prompt;
++ struct expr *dep;
++ unsigned int flags;
++ //char *help;
++ struct file *file;
++ int lineno;
++ void *data;
++};
++
++#define MENU_CHANGED 0x0001
++#define MENU_ROOT 0x0002
++
++#ifndef SWIG
++
++extern struct file *file_list;
++extern struct file *current_file;
++struct file *lookup_file(const char *name);
++
++extern struct symbol symbol_yes, symbol_no, symbol_mod;
++extern struct symbol *modules_sym;
++extern int cdebug;
++struct expr *expr_alloc_symbol(struct symbol *sym);
++struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
++struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
++struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
++struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
++struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
++struct expr *expr_copy(struct expr *org);
++void expr_free(struct expr *e);
++int expr_eq(struct expr *e1, struct expr *e2);
++void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
++tristate expr_calc_value(struct expr *e);
++struct expr *expr_eliminate_yn(struct expr *e);
++struct expr *expr_trans_bool(struct expr *e);
++struct expr *expr_eliminate_dups(struct expr *e);
++struct expr *expr_transform(struct expr *e);
++int expr_contains_symbol(struct expr *dep, struct symbol *sym);
++bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
++struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
++struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
++void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
++struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
++
++void expr_fprint(struct expr *e, FILE *out);
++struct gstr; /* forward */
++void expr_gstr_print(struct expr *e, struct gstr *gs);
++
++static inline int expr_is_yes(struct expr *e)
++{
++ return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
++}
++
++static inline int expr_is_no(struct expr *e)
++{
++ return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
++}
++#endif
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* EXPR_H */
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lex.zconf.c_shipped b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lex.zconf.c_shipped
+new file mode 100644
+index 0000000..b877bb6
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lex.zconf.c_shipped
+@@ -0,0 +1,3688 @@
++
++#line 3 "lex.zconf.c"
++
++#define YY_INT_ALIGNED short int
++
++/* A lexical scanner generated by flex */
++
++#define FLEX_SCANNER
++#define YY_FLEX_MAJOR_VERSION 2
++#define YY_FLEX_MINOR_VERSION 5
++#define YY_FLEX_SUBMINOR_VERSION 31
++#if YY_FLEX_SUBMINOR_VERSION > 0
++#define FLEX_BETA
++#endif
++
++/* First, we deal with platform-specific or compiler-specific issues. */
++
++/* begin standard C headers. */
++#include <stdio.h>
++#include <string.h>
++#include <errno.h>
++#include <stdlib.h>
++
++/* end standard C headers. */
++
++/* flex integer type definitions */
++
++#ifndef FLEXINT_H
++#define FLEXINT_H
++
++/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
++
++#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
++#include <inttypes.h>
++typedef int8_t flex_int8_t;
++typedef uint8_t flex_uint8_t;
++typedef int16_t flex_int16_t;
++typedef uint16_t flex_uint16_t;
++typedef int32_t flex_int32_t;
++typedef uint32_t flex_uint32_t;
++#else
++typedef signed char flex_int8_t;
++typedef short int flex_int16_t;
++typedef int flex_int32_t;
++typedef unsigned char flex_uint8_t;
++typedef unsigned short int flex_uint16_t;
++typedef unsigned int flex_uint32_t;
++#endif /* ! C99 */
++
++/* Limits of integral types. */
++#ifndef INT8_MIN
++#define INT8_MIN (-128)
++#endif
++#ifndef INT16_MIN
++#define INT16_MIN (-32767-1)
++#endif
++#ifndef INT32_MIN
++#define INT32_MIN (-2147483647-1)
++#endif
++#ifndef INT8_MAX
++#define INT8_MAX (127)
++#endif
++#ifndef INT16_MAX
++#define INT16_MAX (32767)
++#endif
++#ifndef INT32_MAX
++#define INT32_MAX (2147483647)
++#endif
++#ifndef UINT8_MAX
++#define UINT8_MAX (255U)
++#endif
++#ifndef UINT16_MAX
++#define UINT16_MAX (65535U)
++#endif
++#ifndef UINT32_MAX
++#define UINT32_MAX (4294967295U)
++#endif
++
++#endif /* ! FLEXINT_H */
++
++#ifdef __cplusplus
++
++/* The "const" storage-class-modifier is valid. */
++#define YY_USE_CONST
++
++#else /* ! __cplusplus */
++
++#if __STDC__
++
++#define YY_USE_CONST
++
++#endif /* __STDC__ */
++#endif /* ! __cplusplus */
++
++#ifdef YY_USE_CONST
++#define yyconst const
++#else
++#define yyconst
++#endif
++
++/* Returned upon end-of-file. */
++#define YY_NULL 0
++
++/* Promotes a possibly negative, possibly signed char to an unsigned
++ * integer for use as an array index. If the signed char is negative,
++ * we want to instead treat it as an 8-bit unsigned char, hence the
++ * double cast.
++ */
++#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
++
++/* Enter a start condition. This macro really ought to take a parameter,
++ * but we do it the disgusting crufty way forced on us by the ()-less
++ * definition of BEGIN.
++ */
++#define BEGIN (yy_start) = 1 + 2 *
++
++/* Translate the current start state into a value that can be later handed
++ * to BEGIN to return to the state. The YYSTATE alias is for lex
++ * compatibility.
++ */
++#define YY_START (((yy_start) - 1) / 2)
++#define YYSTATE YY_START
++
++/* Action number for EOF rule of a given start state. */
++#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
++
++/* Special action meaning "start processing a new file". */
++#define YY_NEW_FILE zconfrestart(zconfin )
++
++#define YY_END_OF_BUFFER_CHAR 0
++
++/* Size of default input buffer. */
++#ifndef YY_BUF_SIZE
++#define YY_BUF_SIZE 16384
++#endif
++
++#ifndef YY_TYPEDEF_YY_BUFFER_STATE
++#define YY_TYPEDEF_YY_BUFFER_STATE
++typedef struct yy_buffer_state *YY_BUFFER_STATE;
++#endif
++
++extern int zconfleng;
++
++extern FILE *zconfin, *zconfout;
++
++#define EOB_ACT_CONTINUE_SCAN 0
++#define EOB_ACT_END_OF_FILE 1
++#define EOB_ACT_LAST_MATCH 2
++
++ #define YY_LESS_LINENO(n)
++
++/* Return all but the first "n" matched characters back to the input stream. */
++#define yyless(n) \
++ do \
++ { \
++ /* Undo effects of setting up zconftext. */ \
++ int yyless_macro_arg = (n); \
++ YY_LESS_LINENO(yyless_macro_arg);\
++ *yy_cp = (yy_hold_char); \
++ YY_RESTORE_YY_MORE_OFFSET \
++ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
++ YY_DO_BEFORE_ACTION; /* set up zconftext again */ \
++ } \
++ while ( 0 )
++
++#define unput(c) yyunput( c, (yytext_ptr) )
++
++/* The following is because we cannot portably get our hands on size_t
++ * (without autoconf's help, which isn't available because we want
++ * flex-generated scanners to compile on their own).
++ */
++
++#ifndef YY_TYPEDEF_YY_SIZE_T
++#define YY_TYPEDEF_YY_SIZE_T
++typedef unsigned int yy_size_t;
++#endif
++
++#ifndef YY_STRUCT_YY_BUFFER_STATE
++#define YY_STRUCT_YY_BUFFER_STATE
++struct yy_buffer_state
++ {
++ FILE *yy_input_file;
++
++ char *yy_ch_buf; /* input buffer */
++ char *yy_buf_pos; /* current position in input buffer */
++
++ /* Size of input buffer in bytes, not including room for EOB
++ * characters.
++ */
++ yy_size_t yy_buf_size;
++
++ /* Number of characters read into yy_ch_buf, not including EOB
++ * characters.
++ */
++ int yy_n_chars;
++
++ /* Whether we "own" the buffer - i.e., we know we created it,
++ * and can realloc() it to grow it, and should free() it to
++ * delete it.
++ */
++ int yy_is_our_buffer;
++
++ /* Whether this is an "interactive" input source; if so, and
++ * if we're using stdio for input, then we want to use getc()
++ * instead of fread(), to make sure we stop fetching input after
++ * each newline.
++ */
++ int yy_is_interactive;
++
++ /* Whether we're considered to be at the beginning of a line.
++ * If so, '^' rules will be active on the next match, otherwise
++ * not.
++ */
++ int yy_at_bol;
++
++ int yy_bs_lineno; /**< The line count. */
++ int yy_bs_column; /**< The column count. */
++
++ /* Whether to try to fill the input buffer when we reach the
++ * end of it.
++ */
++ int yy_fill_buffer;
++
++ int yy_buffer_status;
++
++#define YY_BUFFER_NEW 0
++#define YY_BUFFER_NORMAL 1
++ /* When an EOF's been seen but there's still some text to process
++ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
++ * shouldn't try reading from the input source any more. We might
++ * still have a bunch of tokens to match, though, because of
++ * possible backing-up.
++ *
++ * When we actually see the EOF, we change the status to "new"
++ * (via zconfrestart()), so that the user can continue scanning by
++ * just pointing zconfin at a new input file.
++ */
++#define YY_BUFFER_EOF_PENDING 2
++
++ };
++#endif /* !YY_STRUCT_YY_BUFFER_STATE */
++
++/* Stack of input buffers. */
++static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
++static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
++static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
++
++/* We provide macros for accessing buffer states in case in the
++ * future we want to put the buffer states in a more general
++ * "scanner state".
++ *
++ * Returns the top of the stack, or NULL.
++ */
++#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
++ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
++ : NULL)
++
++/* Same as previous macro, but useful when we know that the buffer stack is not
++ * NULL or when we need an lvalue. For internal use only.
++ */
++#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
++
++/* yy_hold_char holds the character lost when zconftext is formed. */
++static char yy_hold_char;
++static int yy_n_chars; /* number of characters read into yy_ch_buf */
++int zconfleng;
++
++/* Points to current character in buffer. */
++static char *yy_c_buf_p = (char *) 0;
++static int yy_init = 1; /* whether we need to initialize */
++static int yy_start = 0; /* start state number */
++
++/* Flag which is used to allow zconfwrap()'s to do buffer switches
++ * instead of setting up a fresh zconfin. A bit of a hack ...
++ */
++static int yy_did_buffer_switch_on_eof;
++
++void zconfrestart (FILE *input_file );
++void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer );
++YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size );
++void zconf_delete_buffer (YY_BUFFER_STATE b );
++void zconf_flush_buffer (YY_BUFFER_STATE b );
++void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer );
++void zconfpop_buffer_state (void );
++
++static void zconfensure_buffer_stack (void );
++static void zconf_load_buffer_state (void );
++static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file );
++
++#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER )
++
++YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size );
++YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str );
++YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len );
++
++void *zconfalloc (yy_size_t );
++void *zconfrealloc (void *,yy_size_t );
++void zconffree (void * );
++
++#define yy_new_buffer zconf_create_buffer
++
++#define yy_set_interactive(is_interactive) \
++ { \
++ if ( ! YY_CURRENT_BUFFER ){ \
++ zconfensure_buffer_stack (); \
++ YY_CURRENT_BUFFER_LVALUE = \
++ zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
++ } \
++ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
++ }
++
++#define yy_set_bol(at_bol) \
++ { \
++ if ( ! YY_CURRENT_BUFFER ){\
++ zconfensure_buffer_stack (); \
++ YY_CURRENT_BUFFER_LVALUE = \
++ zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
++ } \
++ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
++ }
++
++#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
++
++/* Begin user sect3 */
++
++#define zconfwrap(n) 1
++#define YY_SKIP_YYWRAP
++
++typedef unsigned char YY_CHAR;
++
++FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0;
++
++typedef int yy_state_type;
++
++extern int zconflineno;
++
++int zconflineno = 1;
++
++extern char *zconftext;
++#define yytext_ptr zconftext
++static yyconst flex_int16_t yy_nxt[][38] =
++ {
++ {
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0
++ },
++
++ {
++ 11, 12, 13, 14, 12, 12, 15, 12, 12, 12,
++ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
++ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
++ 12, 12, 12, 12, 12, 12, 12, 12
++ },
++
++ {
++ 11, 12, 13, 14, 12, 12, 15, 12, 12, 12,
++ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
++
++ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
++ 12, 12, 12, 12, 12, 12, 12, 12
++ },
++
++ {
++ 11, 16, 16, 17, 16, 16, 16, 16, 16, 16,
++ 16, 16, 16, 18, 16, 16, 18, 18, 19, 20,
++ 21, 22, 18, 18, 23, 24, 18, 25, 18, 26,
++ 27, 18, 28, 29, 30, 18, 18, 16
++ },
++
++ {
++ 11, 16, 16, 17, 16, 16, 16, 16, 16, 16,
++ 16, 16, 16, 18, 16, 16, 18, 18, 19, 20,
++ 21, 22, 18, 18, 23, 24, 18, 25, 18, 26,
++ 27, 18, 28, 29, 30, 18, 18, 16
++
++ },
++
++ {
++ 11, 31, 32, 33, 31, 31, 31, 31, 31, 31,
++ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
++ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
++ 31, 31, 31, 31, 31, 31, 31, 31
++ },
++
++ {
++ 11, 31, 32, 33, 31, 31, 31, 31, 31, 31,
++ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
++ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
++ 31, 31, 31, 31, 31, 31, 31, 31
++ },
++
++ {
++ 11, 34, 34, 35, 34, 36, 34, 34, 36, 34,
++ 34, 34, 34, 34, 34, 37, 34, 34, 34, 34,
++
++ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
++ 34, 34, 34, 34, 34, 34, 34, 34
++ },
++
++ {
++ 11, 34, 34, 35, 34, 36, 34, 34, 36, 34,
++ 34, 34, 34, 34, 34, 37, 34, 34, 34, 34,
++ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
++ 34, 34, 34, 34, 34, 34, 34, 34
++ },
++
++ {
++ 11, 38, 38, 39, 40, 41, 42, 43, 41, 44,
++ 45, 46, 47, 47, 48, 49, 47, 47, 47, 47,
++ 47, 47, 47, 47, 47, 50, 47, 47, 47, 51,
++ 47, 47, 47, 47, 47, 47, 47, 52
++
++ },
++
++ {
++ 11, 38, 38, 39, 40, 41, 42, 43, 41, 44,
++ 45, 46, 47, 47, 48, 49, 47, 47, 47, 47,
++ 47, 47, 47, 47, 47, 50, 47, 47, 47, 51,
++ 47, 47, 47, 47, 47, 47, 47, 52
++ },
++
++ {
++ -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
++ -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
++ -11, -11, -11, -11, -11, -11, -11, -11, -11, -11,
++ -11, -11, -11, -11, -11, -11, -11, -11
++ },
++
++ {
++ 11, -12, -12, -12, -12, -12, -12, -12, -12, -12,
++ -12, -12, -12, -12, -12, -12, -12, -12, -12, -12,
++
++ -12, -12, -12, -12, -12, -12, -12, -12, -12, -12,
++ -12, -12, -12, -12, -12, -12, -12, -12
++ },
++
++ {
++ 11, -13, 53, 54, -13, -13, 55, -13, -13, -13,
++ -13, -13, -13, -13, -13, -13, -13, -13, -13, -13,
++ -13, -13, -13, -13, -13, -13, -13, -13, -13, -13,
++ -13, -13, -13, -13, -13, -13, -13, -13
++ },
++
++ {
++ 11, -14, -14, -14, -14, -14, -14, -14, -14, -14,
++ -14, -14, -14, -14, -14, -14, -14, -14, -14, -14,
++ -14, -14, -14, -14, -14, -14, -14, -14, -14, -14,
++ -14, -14, -14, -14, -14, -14, -14, -14
++
++ },
++
++ {
++ 11, 56, 56, 57, 56, 56, 56, 56, 56, 56,
++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
++ 56, 56, 56, 56, 56, 56, 56, 56
++ },
++
++ {
++ 11, -16, -16, -16, -16, -16, -16, -16, -16, -16,
++ -16, -16, -16, -16, -16, -16, -16, -16, -16, -16,
++ -16, -16, -16, -16, -16, -16, -16, -16, -16, -16,
++ -16, -16, -16, -16, -16, -16, -16, -16
++ },
++
++ {
++ 11, -17, -17, -17, -17, -17, -17, -17, -17, -17,
++ -17, -17, -17, -17, -17, -17, -17, -17, -17, -17,
++
++ -17, -17, -17, -17, -17, -17, -17, -17, -17, -17,
++ -17, -17, -17, -17, -17, -17, -17, -17
++ },
++
++ {
++ 11, -18, -18, -18, -18, -18, -18, -18, -18, -18,
++ -18, -18, -18, 58, -18, -18, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -18
++ },
++
++ {
++ 11, -19, -19, -19, -19, -19, -19, -19, -19, -19,
++ -19, -19, -19, 58, -19, -19, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 59,
++ 58, 58, 58, 58, 58, 58, 58, -19
++
++ },
++
++ {
++ 11, -20, -20, -20, -20, -20, -20, -20, -20, -20,
++ -20, -20, -20, 58, -20, -20, 58, 58, 58, 58,
++ 58, 58, 58, 58, 60, 58, 58, 58, 58, 61,
++ 58, 58, 58, 58, 58, 58, 58, -20
++ },
++
++ {
++ 11, -21, -21, -21, -21, -21, -21, -21, -21, -21,
++ -21, -21, -21, 58, -21, -21, 58, 58, 58, 58,
++ 58, 62, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -21
++ },
++
++ {
++ 11, -22, -22, -22, -22, -22, -22, -22, -22, -22,
++ -22, -22, -22, 58, -22, -22, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 63, 58,
++ 58, 58, 58, 58, 58, 58, 58, -22
++ },
++
++ {
++ 11, -23, -23, -23, -23, -23, -23, -23, -23, -23,
++ -23, -23, -23, 58, -23, -23, 58, 58, 58, 58,
++ 58, 64, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -23
++ },
++
++ {
++ 11, -24, -24, -24, -24, -24, -24, -24, -24, -24,
++ -24, -24, -24, 58, -24, -24, 58, 58, 58, 58,
++ 58, 58, 65, 58, 58, 58, 58, 58, 66, 58,
++ 58, 58, 58, 58, 58, 58, 58, -24
++
++ },
++
++ {
++ 11, -25, -25, -25, -25, -25, -25, -25, -25, -25,
++ -25, -25, -25, 58, -25, -25, 58, 67, 58, 58,
++ 58, 68, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -25
++ },
++
++ {
++ 11, -26, -26, -26, -26, -26, -26, -26, -26, -26,
++ -26, -26, -26, 58, -26, -26, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 69, 58, 58, 58, 58, 58, 58, -26
++ },
++
++ {
++ 11, -27, -27, -27, -27, -27, -27, -27, -27, -27,
++ -27, -27, -27, 58, -27, -27, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 70, 58, 58, 58, 58, -27
++ },
++
++ {
++ 11, -28, -28, -28, -28, -28, -28, -28, -28, -28,
++ -28, -28, -28, 58, -28, -28, 58, 71, 58, 58,
++ 58, 72, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -28
++ },
++
++ {
++ 11, -29, -29, -29, -29, -29, -29, -29, -29, -29,
++ -29, -29, -29, 58, -29, -29, 58, 58, 58, 58,
++ 58, 73, 58, 58, 58, 58, 58, 58, 58, 74,
++ 58, 58, 58, 58, 75, 58, 58, -29
++
++ },
++
++ {
++ 11, -30, -30, -30, -30, -30, -30, -30, -30, -30,
++ -30, -30, -30, 58, -30, -30, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 76, 58, 58, 58, 58, -30
++ },
++
++ {
++ 11, 77, 77, -31, 77, 77, 77, 77, 77, 77,
++ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
++ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
++ 77, 77, 77, 77, 77, 77, 77, 77
++ },
++
++ {
++ 11, -32, 78, 79, -32, -32, -32, -32, -32, -32,
++ -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
++
++ -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
++ -32, -32, -32, -32, -32, -32, -32, -32
++ },
++
++ {
++ 11, 80, -33, -33, 80, 80, 80, 80, 80, 80,
++ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
++ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
++ 80, 80, 80, 80, 80, 80, 80, 80
++ },
++
++ {
++ 11, 81, 81, 82, 81, -34, 81, 81, -34, 81,
++ 81, 81, 81, 81, 81, -34, 81, 81, 81, 81,
++ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
++ 81, 81, 81, 81, 81, 81, 81, 81
++
++ },
++
++ {
++ 11, -35, -35, -35, -35, -35, -35, -35, -35, -35,
++ -35, -35, -35, -35, -35, -35, -35, -35, -35, -35,
++ -35, -35, -35, -35, -35, -35, -35, -35, -35, -35,
++ -35, -35, -35, -35, -35, -35, -35, -35
++ },
++
++ {
++ 11, -36, -36, -36, -36, -36, -36, -36, -36, -36,
++ -36, -36, -36, -36, -36, -36, -36, -36, -36, -36,
++ -36, -36, -36, -36, -36, -36, -36, -36, -36, -36,
++ -36, -36, -36, -36, -36, -36, -36, -36
++ },
++
++ {
++ 11, 83, 83, 84, 83, 83, 83, 83, 83, 83,
++ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
++
++ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
++ 83, 83, 83, 83, 83, 83, 83, 83
++ },
++
++ {
++ 11, -38, -38, -38, -38, -38, -38, -38, -38, -38,
++ -38, -38, -38, -38, -38, -38, -38, -38, -38, -38,
++ -38, -38, -38, -38, -38, -38, -38, -38, -38, -38,
++ -38, -38, -38, -38, -38, -38, -38, -38
++ },
++
++ {
++ 11, -39, -39, -39, -39, -39, -39, -39, -39, -39,
++ -39, -39, -39, -39, -39, -39, -39, -39, -39, -39,
++ -39, -39, -39, -39, -39, -39, -39, -39, -39, -39,
++ -39, -39, -39, -39, -39, -39, -39, -39
++
++ },
++
++ {
++ 11, -40, -40, -40, -40, -40, -40, -40, -40, -40,
++ -40, -40, -40, -40, 85, -40, -40, -40, -40, -40,
++ -40, -40, -40, -40, -40, -40, -40, -40, -40, -40,
++ -40, -40, -40, -40, -40, -40, -40, -40
++ },
++
++ {
++ 11, -41, -41, -41, -41, -41, -41, -41, -41, -41,
++ -41, -41, -41, -41, -41, -41, -41, -41, -41, -41,
++ -41, -41, -41, -41, -41, -41, -41, -41, -41, -41,
++ -41, -41, -41, -41, -41, -41, -41, -41
++ },
++
++ {
++ 11, 86, 86, -42, 86, 86, 86, 86, 86, 86,
++ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
++
++ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
++ 86, 86, 86, 86, 86, 86, 86, 86
++ },
++
++ {
++ 11, -43, -43, -43, -43, -43, -43, 87, -43, -43,
++ -43, -43, -43, -43, -43, -43, -43, -43, -43, -43,
++ -43, -43, -43, -43, -43, -43, -43, -43, -43, -43,
++ -43, -43, -43, -43, -43, -43, -43, -43
++ },
++
++ {
++ 11, -44, -44, -44, -44, -44, -44, -44, -44, -44,
++ -44, -44, -44, -44, -44, -44, -44, -44, -44, -44,
++ -44, -44, -44, -44, -44, -44, -44, -44, -44, -44,
++ -44, -44, -44, -44, -44, -44, -44, -44
++
++ },
++
++ {
++ 11, -45, -45, -45, -45, -45, -45, -45, -45, -45,
++ -45, -45, -45, -45, -45, -45, -45, -45, -45, -45,
++ -45, -45, -45, -45, -45, -45, -45, -45, -45, -45,
++ -45, -45, -45, -45, -45, -45, -45, -45
++ },
++
++ {
++ 11, -46, -46, -46, -46, -46, -46, -46, -46, -46,
++ -46, 88, 89, 89, -46, -46, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, -46
++ },
++
++ {
++ 11, -47, -47, -47, -47, -47, -47, -47, -47, -47,
++ -47, 89, 89, 89, -47, -47, 89, 89, 89, 89,
++
++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, -47
++ },
++
++ {
++ 11, -48, -48, -48, -48, -48, -48, -48, -48, -48,
++ -48, -48, -48, -48, -48, -48, -48, -48, -48, -48,
++ -48, -48, -48, -48, -48, -48, -48, -48, -48, -48,
++ -48, -48, -48, -48, -48, -48, -48, -48
++ },
++
++ {
++ 11, -49, -49, 90, -49, -49, -49, -49, -49, -49,
++ -49, -49, -49, -49, -49, -49, -49, -49, -49, -49,
++ -49, -49, -49, -49, -49, -49, -49, -49, -49, -49,
++ -49, -49, -49, -49, -49, -49, -49, -49
++
++ },
++
++ {
++ 11, -50, -50, -50, -50, -50, -50, -50, -50, -50,
++ -50, 89, 89, 89, -50, -50, 89, 89, 89, 89,
++ 89, 89, 91, 89, 89, 89, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, -50
++ },
++
++ {
++ 11, -51, -51, -51, -51, -51, -51, -51, -51, -51,
++ -51, 89, 89, 89, -51, -51, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, 89, 92, 89,
++ 89, 89, 89, 89, 89, 89, 89, -51
++ },
++
++ {
++ 11, -52, -52, -52, -52, -52, -52, -52, -52, -52,
++ -52, -52, -52, -52, -52, -52, -52, -52, -52, -52,
++
++ -52, -52, -52, -52, -52, -52, -52, -52, -52, -52,
++ -52, -52, -52, -52, -52, -52, -52, 93
++ },
++
++ {
++ 11, -53, 53, 54, -53, -53, 55, -53, -53, -53,
++ -53, -53, -53, -53, -53, -53, -53, -53, -53, -53,
++ -53, -53, -53, -53, -53, -53, -53, -53, -53, -53,
++ -53, -53, -53, -53, -53, -53, -53, -53
++ },
++
++ {
++ 11, -54, -54, -54, -54, -54, -54, -54, -54, -54,
++ -54, -54, -54, -54, -54, -54, -54, -54, -54, -54,
++ -54, -54, -54, -54, -54, -54, -54, -54, -54, -54,
++ -54, -54, -54, -54, -54, -54, -54, -54
++
++ },
++
++ {
++ 11, 56, 56, 57, 56, 56, 56, 56, 56, 56,
++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
++ 56, 56, 56, 56, 56, 56, 56, 56
++ },
++
++ {
++ 11, 56, 56, 57, 56, 56, 56, 56, 56, 56,
++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
++ 56, 56, 56, 56, 56, 56, 56, 56
++ },
++
++ {
++ 11, -57, -57, -57, -57, -57, -57, -57, -57, -57,
++ -57, -57, -57, -57, -57, -57, -57, -57, -57, -57,
++
++ -57, -57, -57, -57, -57, -57, -57, -57, -57, -57,
++ -57, -57, -57, -57, -57, -57, -57, -57
++ },
++
++ {
++ 11, -58, -58, -58, -58, -58, -58, -58, -58, -58,
++ -58, -58, -58, 58, -58, -58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -58
++ },
++
++ {
++ 11, -59, -59, -59, -59, -59, -59, -59, -59, -59,
++ -59, -59, -59, 58, -59, -59, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 94,
++ 58, 58, 58, 58, 58, 58, 58, -59
++
++ },
++
++ {
++ 11, -60, -60, -60, -60, -60, -60, -60, -60, -60,
++ -60, -60, -60, 58, -60, -60, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 95,
++ 58, 58, 58, 58, 58, 58, 58, -60
++ },
++
++ {
++ 11, -61, -61, -61, -61, -61, -61, -61, -61, -61,
++ -61, -61, -61, 58, -61, -61, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 96, 97, 58,
++ 58, 58, 58, 58, 58, 58, 58, -61
++ },
++
++ {
++ 11, -62, -62, -62, -62, -62, -62, -62, -62, -62,
++ -62, -62, -62, 58, -62, -62, 58, 58, 58, 58,
++
++ 58, 58, 98, 58, 58, 58, 58, 58, 58, 58,
++ 99, 58, 58, 58, 58, 58, 58, -62
++ },
++
++ {
++ 11, -63, -63, -63, -63, -63, -63, -63, -63, -63,
++ -63, -63, -63, 58, -63, -63, 58, 100, 58, 58,
++ 101, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -63
++ },
++
++ {
++ 11, -64, -64, -64, -64, -64, -64, -64, -64, -64,
++ -64, -64, -64, 58, -64, -64, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 102, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 103, -64
++
++ },
++
++ {
++ 11, -65, -65, -65, -65, -65, -65, -65, -65, -65,
++ -65, -65, -65, 58, -65, -65, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -65
++ },
++
++ {
++ 11, -66, -66, -66, -66, -66, -66, -66, -66, -66,
++ -66, -66, -66, 58, -66, -66, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 104, 58, 58, -66
++ },
++
++ {
++ 11, -67, -67, -67, -67, -67, -67, -67, -67, -67,
++ -67, -67, -67, 58, -67, -67, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 105, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -67
++ },
++
++ {
++ 11, -68, -68, -68, -68, -68, -68, -68, -68, -68,
++ -68, -68, -68, 58, -68, -68, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 106, 58,
++ 58, 58, 58, 58, 58, 58, 58, -68
++ },
++
++ {
++ 11, -69, -69, -69, -69, -69, -69, -69, -69, -69,
++ -69, -69, -69, 58, -69, -69, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 107, 58, 58, -69
++
++ },
++
++ {
++ 11, -70, -70, -70, -70, -70, -70, -70, -70, -70,
++ -70, -70, -70, 58, -70, -70, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 108,
++ 58, 58, 58, 58, 58, 58, 58, -70
++ },
++
++ {
++ 11, -71, -71, -71, -71, -71, -71, -71, -71, -71,
++ -71, -71, -71, 58, -71, -71, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 109, 58,
++ 58, 58, 58, 58, 58, 58, 58, -71
++ },
++
++ {
++ 11, -72, -72, -72, -72, -72, -72, -72, -72, -72,
++ -72, -72, -72, 58, -72, -72, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 110, 58, 58, 58, 58, 58, -72
++ },
++
++ {
++ 11, -73, -73, -73, -73, -73, -73, -73, -73, -73,
++ -73, -73, -73, 58, -73, -73, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 111, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -73
++ },
++
++ {
++ 11, -74, -74, -74, -74, -74, -74, -74, -74, -74,
++ -74, -74, -74, 58, -74, -74, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 112, 58, -74
++
++ },
++
++ {
++ 11, -75, -75, -75, -75, -75, -75, -75, -75, -75,
++ -75, -75, -75, 58, -75, -75, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 113, 58, 58, 58, 58, -75
++ },
++
++ {
++ 11, -76, -76, -76, -76, -76, -76, -76, -76, -76,
++ -76, -76, -76, 58, -76, -76, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 114, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -76
++ },
++
++ {
++ 11, 77, 77, -77, 77, 77, 77, 77, 77, 77,
++ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
++
++ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
++ 77, 77, 77, 77, 77, 77, 77, 77
++ },
++
++ {
++ 11, -78, 78, 79, -78, -78, -78, -78, -78, -78,
++ -78, -78, -78, -78, -78, -78, -78, -78, -78, -78,
++ -78, -78, -78, -78, -78, -78, -78, -78, -78, -78,
++ -78, -78, -78, -78, -78, -78, -78, -78
++ },
++
++ {
++ 11, 80, -79, -79, 80, 80, 80, 80, 80, 80,
++ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
++ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
++ 80, 80, 80, 80, 80, 80, 80, 80
++
++ },
++
++ {
++ 11, -80, -80, -80, -80, -80, -80, -80, -80, -80,
++ -80, -80, -80, -80, -80, -80, -80, -80, -80, -80,
++ -80, -80, -80, -80, -80, -80, -80, -80, -80, -80,
++ -80, -80, -80, -80, -80, -80, -80, -80
++ },
++
++ {
++ 11, 81, 81, 82, 81, -81, 81, 81, -81, 81,
++ 81, 81, 81, 81, 81, -81, 81, 81, 81, 81,
++ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
++ 81, 81, 81, 81, 81, 81, 81, 81
++ },
++
++ {
++ 11, -82, -82, -82, -82, -82, -82, -82, -82, -82,
++ -82, -82, -82, -82, -82, -82, -82, -82, -82, -82,
++
++ -82, -82, -82, -82, -82, -82, -82, -82, -82, -82,
++ -82, -82, -82, -82, -82, -82, -82, -82
++ },
++
++ {
++ 11, -83, -83, 84, -83, -83, -83, -83, -83, -83,
++ -83, -83, -83, -83, -83, -83, -83, -83, -83, -83,
++ -83, -83, -83, -83, -83, -83, -83, -83, -83, -83,
++ -83, -83, -83, -83, -83, -83, -83, -83
++ },
++
++ {
++ 11, -84, -84, -84, -84, -84, -84, -84, -84, -84,
++ -84, -84, -84, -84, -84, -84, -84, -84, -84, -84,
++ -84, -84, -84, -84, -84, -84, -84, -84, -84, -84,
++ -84, -84, -84, -84, -84, -84, -84, -84
++
++ },
++
++ {
++ 11, -85, -85, -85, -85, -85, -85, -85, -85, -85,
++ -85, -85, -85, -85, -85, -85, -85, -85, -85, -85,
++ -85, -85, -85, -85, -85, -85, -85, -85, -85, -85,
++ -85, -85, -85, -85, -85, -85, -85, -85
++ },
++
++ {
++ 11, 86, 86, -86, 86, 86, 86, 86, 86, 86,
++ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
++ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
++ 86, 86, 86, 86, 86, 86, 86, 86
++ },
++
++ {
++ 11, -87, -87, -87, -87, -87, -87, -87, -87, -87,
++ -87, -87, -87, -87, -87, -87, -87, -87, -87, -87,
++
++ -87, -87, -87, -87, -87, -87, -87, -87, -87, -87,
++ -87, -87, -87, -87, -87, -87, -87, -87
++ },
++
++ {
++ 11, -88, -88, -88, -88, -88, -88, -88, -88, -88,
++ -88, 115, 89, 89, -88, -88, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, -88
++ },
++
++ {
++ 11, -89, -89, -89, -89, -89, -89, -89, -89, -89,
++ -89, 89, 89, 89, -89, -89, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, -89
++
++ },
++
++ {
++ 11, -90, -90, -90, -90, -90, -90, -90, -90, -90,
++ -90, -90, -90, -90, -90, -90, -90, -90, -90, -90,
++ -90, -90, -90, -90, -90, -90, -90, -90, -90, -90,
++ -90, -90, -90, -90, -90, -90, -90, -90
++ },
++
++ {
++ 11, -91, -91, -91, -91, -91, -91, -91, -91, -91,
++ -91, 89, 89, 89, -91, -91, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, -91
++ },
++
++ {
++ 11, -92, -92, -92, -92, -92, -92, -92, -92, -92,
++ -92, 89, 89, 89, -92, -92, 89, 89, 89, 89,
++
++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, -92
++ },
++
++ {
++ 11, -93, -93, -93, -93, -93, -93, -93, -93, -93,
++ -93, -93, -93, -93, -93, -93, -93, -93, -93, -93,
++ -93, -93, -93, -93, -93, -93, -93, -93, -93, -93,
++ -93, -93, -93, -93, -93, -93, -93, -93
++ },
++
++ {
++ 11, -94, -94, -94, -94, -94, -94, -94, -94, -94,
++ -94, -94, -94, 58, -94, -94, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 116, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -94
++
++ },
++
++ {
++ 11, -95, -95, -95, -95, -95, -95, -95, -95, -95,
++ -95, -95, -95, 58, -95, -95, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 117, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -95
++ },
++
++ {
++ 11, -96, -96, -96, -96, -96, -96, -96, -96, -96,
++ -96, -96, -96, 58, -96, -96, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 118, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -96
++ },
++
++ {
++ 11, -97, -97, -97, -97, -97, -97, -97, -97, -97,
++ -97, -97, -97, 58, -97, -97, 58, 58, 58, 58,
++
++ 58, 58, 119, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -97
++ },
++
++ {
++ 11, -98, -98, -98, -98, -98, -98, -98, -98, -98,
++ -98, -98, -98, 58, -98, -98, 120, 121, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -98
++ },
++
++ {
++ 11, -99, -99, -99, -99, -99, -99, -99, -99, -99,
++ -99, -99, -99, 58, -99, -99, 58, 58, 58, 58,
++ 58, 122, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -99
++
++ },
++
++ {
++ 11, -100, -100, -100, -100, -100, -100, -100, -100, -100,
++ -100, -100, -100, 58, -100, -100, 58, 58, 123, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -100
++ },
++
++ {
++ 11, -101, -101, -101, -101, -101, -101, -101, -101, -101,
++ -101, -101, -101, 58, -101, -101, 58, 58, 58, 124,
++ 58, 58, 58, 58, 58, 125, 58, 126, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -101
++ },
++
++ {
++ 11, -102, -102, -102, -102, -102, -102, -102, -102, -102,
++ -102, -102, -102, 58, -102, -102, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 127, 58, 58, 58, 58, 58, 58, -102
++ },
++
++ {
++ 11, -103, -103, -103, -103, -103, -103, -103, -103, -103,
++ -103, -103, -103, 58, -103, -103, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -103
++ },
++
++ {
++ 11, -104, -104, -104, -104, -104, -104, -104, -104, -104,
++ -104, -104, -104, 58, -104, -104, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -104
++
++ },
++
++ {
++ 11, -105, -105, -105, -105, -105, -105, -105, -105, -105,
++ -105, -105, -105, 58, -105, -105, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 128, 58,
++ 58, 58, 58, 58, 58, 58, 58, -105
++ },
++
++ {
++ 11, -106, -106, -106, -106, -106, -106, -106, -106, -106,
++ -106, -106, -106, 58, -106, -106, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 129, 58, -106
++ },
++
++ {
++ 11, -107, -107, -107, -107, -107, -107, -107, -107, -107,
++ -107, -107, -107, 58, -107, -107, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 130, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -107
++ },
++
++ {
++ 11, -108, -108, -108, -108, -108, -108, -108, -108, -108,
++ -108, -108, -108, 58, -108, -108, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 131, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -108
++ },
++
++ {
++ 11, -109, -109, -109, -109, -109, -109, -109, -109, -109,
++ -109, -109, -109, 58, -109, -109, 58, 58, 58, 58,
++ 58, 58, 58, 132, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -109
++
++ },
++
++ {
++ 11, -110, -110, -110, -110, -110, -110, -110, -110, -110,
++ -110, -110, -110, 58, -110, -110, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 133, 58, -110
++ },
++
++ {
++ 11, -111, -111, -111, -111, -111, -111, -111, -111, -111,
++ -111, -111, -111, 58, -111, -111, 58, 58, 58, 58,
++ 58, 134, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -111
++ },
++
++ {
++ 11, -112, -112, -112, -112, -112, -112, -112, -112, -112,
++ -112, -112, -112, 58, -112, -112, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 135, 58, 58, 58, 58, -112
++ },
++
++ {
++ 11, -113, -113, -113, -113, -113, -113, -113, -113, -113,
++ -113, -113, -113, 58, -113, -113, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 136, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -113
++ },
++
++ {
++ 11, -114, -114, -114, -114, -114, -114, -114, -114, -114,
++ -114, -114, -114, 58, -114, -114, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 137, 58, 58, 58, -114
++
++ },
++
++ {
++ 11, -115, -115, -115, -115, -115, -115, -115, -115, -115,
++ -115, 89, 89, 89, -115, -115, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
++ 89, 89, 89, 89, 89, 89, 89, -115
++ },
++
++ {
++ 11, -116, -116, -116, -116, -116, -116, -116, -116, -116,
++ -116, -116, -116, 58, -116, -116, 58, 58, 58, 58,
++ 58, 138, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -116
++ },
++
++ {
++ 11, -117, -117, -117, -117, -117, -117, -117, -117, -117,
++ -117, -117, -117, 58, -117, -117, 58, 58, 58, 139,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -117
++ },
++
++ {
++ 11, -118, -118, -118, -118, -118, -118, -118, -118, -118,
++ -118, -118, -118, 58, -118, -118, 58, 58, 58, 58,
++ 58, 140, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -118
++ },
++
++ {
++ 11, -119, -119, -119, -119, -119, -119, -119, -119, -119,
++ -119, -119, -119, 58, -119, -119, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 141, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -119
++
++ },
++
++ {
++ 11, -120, -120, -120, -120, -120, -120, -120, -120, -120,
++ -120, -120, -120, 58, -120, -120, 58, 58, 142, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 143, 58, 58, -120
++ },
++
++ {
++ 11, -121, -121, -121, -121, -121, -121, -121, -121, -121,
++ -121, -121, -121, 58, -121, -121, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 144, 58, -121
++ },
++
++ {
++ 11, -122, -122, -122, -122, -122, -122, -122, -122, -122,
++ -122, -122, -122, 58, -122, -122, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 145, 58,
++ 58, 58, 58, 58, 58, 58, 58, -122
++ },
++
++ {
++ 11, -123, -123, -123, -123, -123, -123, -123, -123, -123,
++ -123, -123, -123, 58, -123, -123, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 146, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -123
++ },
++
++ {
++ 11, -124, -124, -124, -124, -124, -124, -124, -124, -124,
++ -124, -124, -124, 58, -124, -124, 58, 58, 58, 58,
++ 58, 58, 58, 58, 147, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -124
++
++ },
++
++ {
++ 11, -125, -125, -125, -125, -125, -125, -125, -125, -125,
++ -125, -125, -125, 58, -125, -125, 58, 58, 58, 58,
++ 58, 58, 148, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -125
++ },
++
++ {
++ 11, -126, -126, -126, -126, -126, -126, -126, -126, -126,
++ -126, -126, -126, 58, -126, -126, 58, 58, 58, 58,
++ 58, 149, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -126
++ },
++
++ {
++ 11, -127, -127, -127, -127, -127, -127, -127, -127, -127,
++ -127, -127, -127, 58, -127, -127, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -127
++ },
++
++ {
++ 11, -128, -128, -128, -128, -128, -128, -128, -128, -128,
++ -128, -128, -128, 58, -128, -128, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 150, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -128
++ },
++
++ {
++ 11, -129, -129, -129, -129, -129, -129, -129, -129, -129,
++ -129, -129, -129, 58, -129, -129, 58, 58, 58, 151,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -129
++
++ },
++
++ {
++ 11, -130, -130, -130, -130, -130, -130, -130, -130, -130,
++ -130, -130, -130, 58, -130, -130, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 152,
++ 58, 58, 58, 58, 58, 58, 58, -130
++ },
++
++ {
++ 11, -131, -131, -131, -131, -131, -131, -131, -131, -131,
++ -131, -131, -131, 58, -131, -131, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 153, 58, 58, 58, 58, 58, 58, -131
++ },
++
++ {
++ 11, -132, -132, -132, -132, -132, -132, -132, -132, -132,
++ -132, -132, -132, 58, -132, -132, 58, 58, 58, 58,
++
++ 58, 154, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -132
++ },
++
++ {
++ 11, -133, -133, -133, -133, -133, -133, -133, -133, -133,
++ -133, -133, -133, 58, -133, -133, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 155, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -133
++ },
++
++ {
++ 11, -134, -134, -134, -134, -134, -134, -134, -134, -134,
++ -134, -134, -134, 58, -134, -134, 58, 58, 58, 156,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -134
++
++ },
++
++ {
++ 11, -135, -135, -135, -135, -135, -135, -135, -135, -135,
++ -135, -135, -135, 58, -135, -135, 58, 58, 58, 157,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -135
++ },
++
++ {
++ 11, -136, -136, -136, -136, -136, -136, -136, -136, -136,
++ -136, -136, -136, 58, -136, -136, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 158, 58,
++ 58, 58, 58, 58, 58, 58, 58, -136
++ },
++
++ {
++ 11, -137, -137, -137, -137, -137, -137, -137, -137, -137,
++ -137, -137, -137, 58, -137, -137, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 159, 58, 58, -137
++ },
++
++ {
++ 11, -138, -138, -138, -138, -138, -138, -138, -138, -138,
++ -138, -138, -138, 58, -138, -138, 58, 160, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -138
++ },
++
++ {
++ 11, -139, -139, -139, -139, -139, -139, -139, -139, -139,
++ -139, -139, -139, 58, -139, -139, 58, 58, 58, 58,
++ 58, 161, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -139
++
++ },
++
++ {
++ 11, -140, -140, -140, -140, -140, -140, -140, -140, -140,
++ -140, -140, -140, 58, -140, -140, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 162, 58,
++ 58, 58, 58, 58, 58, 58, 58, -140
++ },
++
++ {
++ 11, -141, -141, -141, -141, -141, -141, -141, -141, -141,
++ -141, -141, -141, 58, -141, -141, 58, 58, 58, 58,
++ 58, 58, 58, 163, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -141
++ },
++
++ {
++ 11, -142, -142, -142, -142, -142, -142, -142, -142, -142,
++ -142, -142, -142, 58, -142, -142, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 164,
++ 58, 58, 58, 58, 58, 58, 58, -142
++ },
++
++ {
++ 11, -143, -143, -143, -143, -143, -143, -143, -143, -143,
++ -143, -143, -143, 58, -143, -143, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 165, 58, 58, 58, 58, -143
++ },
++
++ {
++ 11, -144, -144, -144, -144, -144, -144, -144, -144, -144,
++ -144, -144, -144, 58, -144, -144, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 166, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -144
++
++ },
++
++ {
++ 11, -145, -145, -145, -145, -145, -145, -145, -145, -145,
++ -145, -145, -145, 58, -145, -145, 58, 58, 58, 58,
++ 167, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -145
++ },
++
++ {
++ 11, -146, -146, -146, -146, -146, -146, -146, -146, -146,
++ -146, -146, -146, 58, -146, -146, 58, 58, 58, 58,
++ 58, 168, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -146
++ },
++
++ {
++ 11, -147, -147, -147, -147, -147, -147, -147, -147, -147,
++ -147, -147, -147, 58, -147, -147, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 169,
++ 58, 58, 58, 58, 58, 58, 58, -147
++ },
++
++ {
++ 11, -148, -148, -148, -148, -148, -148, -148, -148, -148,
++ -148, -148, -148, 58, -148, -148, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -148
++ },
++
++ {
++ 11, -149, -149, -149, -149, -149, -149, -149, -149, -149,
++ -149, -149, -149, 58, -149, -149, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 170, 58,
++ 58, 58, 58, 58, 58, 58, 58, -149
++
++ },
++
++ {
++ 11, -150, -150, -150, -150, -150, -150, -150, -150, -150,
++ -150, -150, -150, 58, -150, -150, 58, 58, 58, 58,
++ 58, 171, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -150
++ },
++
++ {
++ 11, -151, -151, -151, -151, -151, -151, -151, -151, -151,
++ -151, -151, -151, 58, -151, -151, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 172,
++ 58, 58, 58, 58, 58, 58, 58, -151
++ },
++
++ {
++ 11, -152, -152, -152, -152, -152, -152, -152, -152, -152,
++ -152, -152, -152, 58, -152, -152, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 173, 58,
++ 58, 58, 58, 58, 58, 58, 58, -152
++ },
++
++ {
++ 11, -153, -153, -153, -153, -153, -153, -153, -153, -153,
++ -153, -153, -153, 58, -153, -153, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 174, 58, 58, -153
++ },
++
++ {
++ 11, -154, -154, -154, -154, -154, -154, -154, -154, -154,
++ -154, -154, -154, 58, -154, -154, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -154
++
++ },
++
++ {
++ 11, -155, -155, -155, -155, -155, -155, -155, -155, -155,
++ -155, -155, -155, 58, -155, -155, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 175, 58, 58, 58, 58, -155
++ },
++
++ {
++ 11, -156, -156, -156, -156, -156, -156, -156, -156, -156,
++ -156, -156, -156, 58, -156, -156, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 176, 58, 58, -156
++ },
++
++ {
++ 11, -157, -157, -157, -157, -157, -157, -157, -157, -157,
++ -157, -157, -157, 58, -157, -157, 58, 58, 58, 58,
++
++ 58, 177, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -157
++ },
++
++ {
++ 11, -158, -158, -158, -158, -158, -158, -158, -158, -158,
++ -158, -158, -158, 58, -158, -158, 58, 58, 58, 58,
++ 58, 58, 58, 178, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -158
++ },
++
++ {
++ 11, -159, -159, -159, -159, -159, -159, -159, -159, -159,
++ -159, -159, -159, 58, -159, -159, 58, 179, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -159
++
++ },
++
++ {
++ 11, -160, -160, -160, -160, -160, -160, -160, -160, -160,
++ -160, -160, -160, 58, -160, -160, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 180, 58,
++ 58, 58, 58, 58, 58, 58, 58, -160
++ },
++
++ {
++ 11, -161, -161, -161, -161, -161, -161, -161, -161, -161,
++ -161, -161, -161, 58, -161, -161, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -161
++ },
++
++ {
++ 11, -162, -162, -162, -162, -162, -162, -162, -162, -162,
++ -162, -162, -162, 58, -162, -162, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 181, 58, 58, -162
++ },
++
++ {
++ 11, -163, -163, -163, -163, -163, -163, -163, -163, -163,
++ -163, -163, -163, 58, -163, -163, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -163
++ },
++
++ {
++ 11, -164, -164, -164, -164, -164, -164, -164, -164, -164,
++ -164, -164, -164, 58, -164, -164, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 182,
++ 58, 58, 58, 58, 58, 58, 58, -164
++
++ },
++
++ {
++ 11, -165, -165, -165, -165, -165, -165, -165, -165, -165,
++ -165, -165, -165, 58, -165, -165, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 183, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -165
++ },
++
++ {
++ 11, -166, -166, -166, -166, -166, -166, -166, -166, -166,
++ -166, -166, -166, 58, -166, -166, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 184, 58, 58, -166
++ },
++
++ {
++ 11, -167, -167, -167, -167, -167, -167, -167, -167, -167,
++ -167, -167, -167, 58, -167, -167, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 185, 58, 58, 58, -167
++ },
++
++ {
++ 11, -168, -168, -168, -168, -168, -168, -168, -168, -168,
++ -168, -168, -168, 58, -168, -168, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -168
++ },
++
++ {
++ 11, -169, -169, -169, -169, -169, -169, -169, -169, -169,
++ -169, -169, -169, 58, -169, -169, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 186, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -169
++
++ },
++
++ {
++ 11, -170, -170, -170, -170, -170, -170, -170, -170, -170,
++ -170, -170, -170, 58, -170, -170, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 187, 58, -170
++ },
++
++ {
++ 11, -171, -171, -171, -171, -171, -171, -171, -171, -171,
++ -171, -171, -171, 58, -171, -171, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 188, 58,
++ 58, 58, 58, 58, 58, 58, 58, -171
++ },
++
++ {
++ 11, -172, -172, -172, -172, -172, -172, -172, -172, -172,
++ -172, -172, -172, 58, -172, -172, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 189, 58,
++ 58, 58, 58, 58, 58, 58, 58, -172
++ },
++
++ {
++ 11, -173, -173, -173, -173, -173, -173, -173, -173, -173,
++ -173, -173, -173, 58, -173, -173, 58, 190, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -173
++ },
++
++ {
++ 11, -174, -174, -174, -174, -174, -174, -174, -174, -174,
++ -174, -174, -174, 58, -174, -174, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -174
++
++ },
++
++ {
++ 11, -175, -175, -175, -175, -175, -175, -175, -175, -175,
++ -175, -175, -175, 58, -175, -175, 58, 58, 58, 58,
++ 58, 191, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -175
++ },
++
++ {
++ 11, -176, -176, -176, -176, -176, -176, -176, -176, -176,
++ -176, -176, -176, 58, -176, -176, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -176
++ },
++
++ {
++ 11, -177, -177, -177, -177, -177, -177, -177, -177, -177,
++ -177, -177, -177, 58, -177, -177, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -177
++ },
++
++ {
++ 11, -178, -178, -178, -178, -178, -178, -178, -178, -178,
++ -178, -178, -178, 58, -178, -178, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -178
++ },
++
++ {
++ 11, -179, -179, -179, -179, -179, -179, -179, -179, -179,
++ -179, -179, -179, 58, -179, -179, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 192, 58, 58, -179
++
++ },
++
++ {
++ 11, -180, -180, -180, -180, -180, -180, -180, -180, -180,
++ -180, -180, -180, 58, -180, -180, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -180
++ },
++
++ {
++ 11, -181, -181, -181, -181, -181, -181, -181, -181, -181,
++ -181, -181, -181, 58, -181, -181, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -181
++ },
++
++ {
++ 11, -182, -182, -182, -182, -182, -182, -182, -182, -182,
++ -182, -182, -182, 58, -182, -182, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 193, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -182
++ },
++
++ {
++ 11, -183, -183, -183, -183, -183, -183, -183, -183, -183,
++ -183, -183, -183, 58, -183, -183, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 194, 58, 58, 58, -183
++ },
++
++ {
++ 11, -184, -184, -184, -184, -184, -184, -184, -184, -184,
++ -184, -184, -184, 58, -184, -184, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -184
++
++ },
++
++ {
++ 11, -185, -185, -185, -185, -185, -185, -185, -185, -185,
++ -185, -185, -185, 58, -185, -185, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -185
++ },
++
++ {
++ 11, -186, -186, -186, -186, -186, -186, -186, -186, -186,
++ -186, -186, -186, 58, -186, -186, 58, 58, 58, 195,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -186
++ },
++
++ {
++ 11, -187, -187, -187, -187, -187, -187, -187, -187, -187,
++ -187, -187, -187, 58, -187, -187, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -187
++ },
++
++ {
++ 11, -188, -188, -188, -188, -188, -188, -188, -188, -188,
++ -188, -188, -188, 58, -188, -188, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 196, 58, -188
++ },
++
++ {
++ 11, -189, -189, -189, -189, -189, -189, -189, -189, -189,
++ -189, -189, -189, 58, -189, -189, 58, 58, 58, 58,
++ 58, 58, 197, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -189
++
++ },
++
++ {
++ 11, -190, -190, -190, -190, -190, -190, -190, -190, -190,
++ -190, -190, -190, 58, -190, -190, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 198, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -190
++ },
++
++ {
++ 11, -191, -191, -191, -191, -191, -191, -191, -191, -191,
++ -191, -191, -191, 58, -191, -191, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 199, 58, 58, 58, -191
++ },
++
++ {
++ 11, -192, -192, -192, -192, -192, -192, -192, -192, -192,
++ -192, -192, -192, 58, -192, -192, 58, 58, 58, 58,
++
++ 58, 200, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -192
++ },
++
++ {
++ 11, -193, -193, -193, -193, -193, -193, -193, -193, -193,
++ -193, -193, -193, 58, -193, -193, 58, 58, 58, 58,
++ 58, 201, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -193
++ },
++
++ {
++ 11, -194, -194, -194, -194, -194, -194, -194, -194, -194,
++ -194, -194, -194, 58, -194, -194, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 202, 58, 58, -194
++
++ },
++
++ {
++ 11, -195, -195, -195, -195, -195, -195, -195, -195, -195,
++ -195, -195, -195, 58, -195, -195, 58, 58, 58, 58,
++ 58, 203, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -195
++ },
++
++ {
++ 11, -196, -196, -196, -196, -196, -196, -196, -196, -196,
++ -196, -196, -196, 58, -196, -196, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -196
++ },
++
++ {
++ 11, -197, -197, -197, -197, -197, -197, -197, -197, -197,
++ -197, -197, -197, 58, -197, -197, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 204, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -197
++ },
++
++ {
++ 11, -198, -198, -198, -198, -198, -198, -198, -198, -198,
++ -198, -198, -198, 58, -198, -198, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -198
++ },
++
++ {
++ 11, -199, -199, -199, -199, -199, -199, -199, -199, -199,
++ -199, -199, -199, 58, -199, -199, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -199
++
++ },
++
++ {
++ 11, -200, -200, -200, -200, -200, -200, -200, -200, -200,
++ -200, -200, -200, 58, -200, -200, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -200
++ },
++
++ {
++ 11, -201, -201, -201, -201, -201, -201, -201, -201, -201,
++ -201, -201, -201, 58, -201, -201, 58, 205, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -201
++ },
++
++ {
++ 11, -202, -202, -202, -202, -202, -202, -202, -202, -202,
++ -202, -202, -202, 58, -202, -202, 58, 206, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -202
++ },
++
++ {
++ 11, -203, -203, -203, -203, -203, -203, -203, -203, -203,
++ -203, -203, -203, 58, -203, -203, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -203
++ },
++
++ {
++ 11, -204, -204, -204, -204, -204, -204, -204, -204, -204,
++ -204, -204, -204, 58, -204, -204, 58, 58, 58, 58,
++ 58, 58, 58, 207, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -204
++
++ },
++
++ {
++ 11, -205, -205, -205, -205, -205, -205, -205, -205, -205,
++ -205, -205, -205, 58, -205, -205, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 208, 58,
++ 58, 58, 58, 58, 58, 58, 58, -205
++ },
++
++ {
++ 11, -206, -206, -206, -206, -206, -206, -206, -206, -206,
++ -206, -206, -206, 58, -206, -206, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 209, 58, 58, -206
++ },
++
++ {
++ 11, -207, -207, -207, -207, -207, -207, -207, -207, -207,
++ -207, -207, -207, 58, -207, -207, 58, 58, 58, 58,
++
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -207
++ },
++
++ {
++ 11, -208, -208, -208, -208, -208, -208, -208, -208, -208,
++ -208, -208, -208, 58, -208, -208, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -208
++ },
++
++ {
++ 11, -209, -209, -209, -209, -209, -209, -209, -209, -209,
++ -209, -209, -209, 58, -209, -209, 58, 58, 58, 58,
++ 58, 210, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -209
++
++ },
++
++ {
++ 11, -210, -210, -210, -210, -210, -210, -210, -210, -210,
++ -210, -210, -210, 58, -210, -210, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
++ 58, 58, 58, 58, 58, 58, 58, -210
++ },
++
++ } ;
++
++static yy_state_type yy_get_previous_state (void );
++static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
++static int yy_get_next_buffer (void );
++static void yy_fatal_error (yyconst char msg[] );
++
++/* Done after the current pattern has been matched and before the
++ * corresponding action - sets up zconftext.
++ */
++#define YY_DO_BEFORE_ACTION \
++ (yytext_ptr) = yy_bp; \
++ zconfleng = (size_t) (yy_cp - yy_bp); \
++ (yy_hold_char) = *yy_cp; \
++ *yy_cp = '\0'; \
++ (yy_c_buf_p) = yy_cp;
++
++#define YY_NUM_RULES 64
++#define YY_END_OF_BUFFER 65
++/* This struct is not used in this scanner,
++ but its presence is necessary. */
++struct yy_trans_info
++ {
++ flex_int32_t yy_verify;
++ flex_int32_t yy_nxt;
++ };
++static yyconst flex_int16_t yy_accept[211] =
++ { 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 65, 5, 4, 3, 2, 36, 37, 35, 35, 35,
++ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
++ 63, 60, 62, 55, 59, 58, 57, 53, 48, 42,
++ 47, 51, 53, 40, 41, 50, 50, 43, 53, 50,
++ 50, 53, 4, 3, 2, 2, 1, 35, 35, 35,
++ 35, 35, 35, 35, 16, 35, 35, 35, 35, 35,
++ 35, 35, 35, 35, 35, 35, 63, 60, 62, 61,
++ 55, 54, 57, 56, 44, 51, 38, 50, 50, 52,
++ 45, 46, 39, 35, 35, 35, 35, 35, 35, 35,
++
++ 35, 35, 30, 29, 35, 35, 35, 35, 35, 35,
++ 35, 35, 35, 35, 49, 25, 35, 35, 35, 35,
++ 35, 35, 35, 35, 35, 35, 15, 35, 7, 35,
++ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
++ 35, 35, 35, 35, 35, 35, 35, 17, 35, 35,
++ 35, 35, 35, 34, 35, 35, 35, 35, 35, 35,
++ 10, 35, 13, 35, 35, 35, 35, 33, 35, 35,
++ 35, 35, 35, 22, 35, 32, 9, 31, 35, 26,
++ 12, 35, 35, 21, 18, 35, 8, 35, 35, 35,
++ 35, 35, 27, 35, 35, 6, 35, 20, 19, 23,
++
++ 35, 35, 11, 35, 35, 35, 14, 28, 35, 24
++ } ;
++
++static yyconst flex_int32_t yy_ec[256] =
++ { 0,
++ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 2, 4, 5, 6, 1, 1, 7, 8, 9,
++ 10, 1, 1, 1, 11, 12, 12, 13, 13, 13,
++ 13, 13, 13, 13, 13, 13, 13, 1, 1, 1,
++ 14, 1, 1, 1, 13, 13, 13, 13, 13, 13,
++ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
++ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
++ 1, 15, 1, 1, 16, 1, 17, 18, 19, 20,
++
++ 21, 22, 23, 24, 25, 13, 13, 26, 27, 28,
++ 29, 30, 31, 32, 33, 34, 35, 13, 13, 36,
++ 13, 13, 1, 37, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++ 1, 1, 1, 1, 1
++ } ;
++
++extern int zconf_flex_debug;
++int zconf_flex_debug = 0;
++
++/* The intent behind this definition is that it'll catch
++ * any uses of REJECT which flex missed.
++ */
++#define REJECT reject_used_but_not_detected
++#define yymore() yymore_used_but_not_detected
++#define YY_MORE_ADJ 0
++#define YY_RESTORE_YY_MORE_OFFSET
++char *zconftext;
++
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#include <limits.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++
++#define LKC_DIRECT_LINK
++#include "lkc.h"
++
++#define START_STRSIZE 16
++
++char *text;
++static char *text_ptr;
++static int text_size, text_asize;
++
++struct buffer {
++ struct buffer *parent;
++ YY_BUFFER_STATE state;
++};
++
++struct buffer *current_buf;
++
++static int last_ts, first_ts;
++
++static void zconf_endhelp(void);
++static struct buffer *zconf_endfile(void);
++
++void new_string(void)
++{
++ text = malloc(START_STRSIZE);
++ text_asize = START_STRSIZE;
++ text_ptr = text;
++ text_size = 0;
++ *text_ptr = 0;
++}
++
++void append_string(const char *str, int size)
++{
++ int new_size = text_size + size + 1;
++ if (new_size > text_asize) {
++ text = realloc(text, new_size);
++ text_asize = new_size;
++ text_ptr = text + text_size;
++ }
++ memcpy(text_ptr, str, size);
++ text_ptr += size;
++ text_size += size;
++ *text_ptr = 0;
++}
++
++void alloc_string(const char *str, int size)
++{
++ text = malloc(size + 1);
++ memcpy(text, str, size);
++ text[size] = 0;
++}
++
++#define INITIAL 0
++#define COMMAND 1
++#define HELP 2
++#define STRING 3
++#define PARAM 4
++
++/* Special case for "unistd.h", since it is non-ANSI. We include it way
++ * down here because we want the user's section 1 to have been scanned first.
++ * The user has a chance to override it with an option.
++ */
++#include <unistd.h>
++
++#ifndef YY_EXTRA_TYPE
++#define YY_EXTRA_TYPE void *
++#endif
++
++/* Macros after this point can all be overridden by user definitions in
++ * section 1.
++ */
++
++#ifndef YY_SKIP_YYWRAP
++#ifdef __cplusplus
++extern "C" int zconfwrap (void );
++#else
++extern int zconfwrap (void );
++#endif
++#endif
++
++ static void yyunput (int c,char *buf_ptr );
++
++#ifndef yytext_ptr
++static void yy_flex_strncpy (char *,yyconst char *,int );
++#endif
++
++#ifdef YY_NEED_STRLEN
++static int yy_flex_strlen (yyconst char * );
++#endif
++
++#ifndef YY_NO_INPUT
++
++#ifdef __cplusplus
++static int yyinput (void );
++#else
++static int input (void );
++#endif
++
++#endif
++
++/* Amount of stuff to slurp up with each read. */
++#ifndef YY_READ_BUF_SIZE
++#define YY_READ_BUF_SIZE 8192
++#endif
++
++/* Copy whatever the last rule matched to the standard output. */
++#ifndef ECHO
++/* This used to be an fputs(), but since the string might contain NUL's,
++ * we now use fwrite().
++ */
++#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout )
++#endif
++
++/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
++ * is returned in "result".
++ */
++#ifndef YY_INPUT
++#define YY_INPUT(buf,result,max_size) \
++ errno=0; \
++ while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \
++ { \
++ if( errno != EINTR) \
++ { \
++ YY_FATAL_ERROR( "input in flex scanner failed" ); \
++ break; \
++ } \
++ errno=0; \
++ clearerr(zconfin); \
++ }\
++\
++
++#endif
++
++/* No semi-colon after return; correct usage is to write "yyterminate();" -
++ * we don't want an extra ';' after the "return" because that will cause
++ * some compilers to complain about unreachable statements.
++ */
++#ifndef yyterminate
++#define yyterminate() return YY_NULL
++#endif
++
++/* Number of entries by which start-condition stack grows. */
++#ifndef YY_START_STACK_INCR
++#define YY_START_STACK_INCR 25
++#endif
++
++/* Report a fatal error. */
++#ifndef YY_FATAL_ERROR
++#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
++#endif
++
++/* end tables serialization structures and prototypes */
++
++/* Default declaration of generated scanner - a define so the user can
++ * easily add parameters.
++ */
++#ifndef YY_DECL
++#define YY_DECL_IS_OURS 1
++
++extern int zconflex (void);
++
++#define YY_DECL int zconflex (void)
++#endif /* !YY_DECL */
++
++/* Code executed at the beginning of each rule, after zconftext and zconfleng
++ * have been set up.
++ */
++#ifndef YY_USER_ACTION
++#define YY_USER_ACTION
++#endif
++
++/* Code executed at the end of each rule. */
++#ifndef YY_BREAK
++#define YY_BREAK break;
++#endif
++
++#define YY_RULE_SETUP \
++ YY_USER_ACTION
++
++/** The main scanner function which does all the work.
++ */
++YY_DECL
++{
++ register yy_state_type yy_current_state;
++ register char *yy_cp, *yy_bp;
++ register int yy_act;
++
++ int str = 0;
++ int ts, i;
++
++ if ( (yy_init) )
++ {
++ (yy_init) = 0;
++
++#ifdef YY_USER_INIT
++ YY_USER_INIT;
++#endif
++
++ if ( ! (yy_start) )
++ (yy_start) = 1; /* first start state */
++
++ if ( ! zconfin )
++ zconfin = stdin;
++
++ if ( ! zconfout )
++ zconfout = stdout;
++
++ if ( ! YY_CURRENT_BUFFER ) {
++ zconfensure_buffer_stack ();
++ YY_CURRENT_BUFFER_LVALUE =
++ zconf_create_buffer(zconfin,YY_BUF_SIZE );
++ }
++
++ zconf_load_buffer_state( );
++ }
++
++ while ( 1 ) /* loops until end-of-file is reached */
++ {
++ yy_cp = (yy_c_buf_p);
++
++ /* Support of zconftext. */
++ *yy_cp = (yy_hold_char);
++
++ /* yy_bp points to the position in yy_ch_buf of the start of
++ * the current run.
++ */
++ yy_bp = yy_cp;
++
++ yy_current_state = (yy_start);
++yy_match:
++ while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 )
++ ++yy_cp;
++
++ yy_current_state = -yy_current_state;
++
++yy_find_action:
++ yy_act = yy_accept[yy_current_state];
++
++ YY_DO_BEFORE_ACTION;
++
++do_action: /* This label is used only to access EOF actions. */
++
++ switch ( yy_act )
++ { /* beginning of action switch */
++case 1:
++/* rule 1 can match eol */
++YY_RULE_SETUP
++current_file->lineno++;
++ YY_BREAK
++case 2:
++YY_RULE_SETUP
++
++ YY_BREAK
++case 3:
++/* rule 3 can match eol */
++YY_RULE_SETUP
++current_file->lineno++; return T_EOL;
++ YY_BREAK
++case 4:
++YY_RULE_SETUP
++{
++ BEGIN(COMMAND);
++}
++ YY_BREAK
++case 5:
++YY_RULE_SETUP
++{
++ unput(zconftext[0]);
++ BEGIN(COMMAND);
++}
++ YY_BREAK
++
++case 6:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_MAINMENU;
++ YY_BREAK
++case 7:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_MENU;
++ YY_BREAK
++case 8:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_ENDMENU;
++ YY_BREAK
++case 9:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_SOURCE;
++ YY_BREAK
++case 10:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_CHOICE;
++ YY_BREAK
++case 11:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_ENDCHOICE;
++ YY_BREAK
++case 12:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_COMMENT;
++ YY_BREAK
++case 13:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_CONFIG;
++ YY_BREAK
++case 14:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_MENUCONFIG;
++ YY_BREAK
++case 15:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_HELP;
++ YY_BREAK
++case 16:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_IF;
++ YY_BREAK
++case 17:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_ENDIF;
++ YY_BREAK
++case 18:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_DEPENDS;
++ YY_BREAK
++case 19:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_REQUIRES;
++ YY_BREAK
++case 20:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_OPTIONAL;
++ YY_BREAK
++case 21:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_DEFAULT;
++ YY_BREAK
++case 22:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_PROMPT;
++ YY_BREAK
++case 23:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_TRISTATE;
++ YY_BREAK
++case 24:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_DEF_TRISTATE;
++ YY_BREAK
++case 25:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_BOOLEAN;
++ YY_BREAK
++case 26:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_BOOLEAN;
++ YY_BREAK
++case 27:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_DEF_BOOLEAN;
++ YY_BREAK
++case 28:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_DEF_BOOLEAN;
++ YY_BREAK
++case 29:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_INT;
++ YY_BREAK
++case 30:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_HEX;
++ YY_BREAK
++case 31:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_STRING;
++ YY_BREAK
++case 32:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_SELECT;
++ YY_BREAK
++case 33:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_SELECT;
++ YY_BREAK
++case 34:
++YY_RULE_SETUP
++BEGIN(PARAM); return T_RANGE;
++ YY_BREAK
++case 35:
++YY_RULE_SETUP
++{
++ alloc_string(zconftext, zconfleng);
++ zconflval.string = text;
++ return T_WORD;
++ }
++ YY_BREAK
++case 36:
++YY_RULE_SETUP
++
++ YY_BREAK
++case 37:
++/* rule 37 can match eol */
++YY_RULE_SETUP
++current_file->lineno++; BEGIN(INITIAL);
++ YY_BREAK
++
++case 38:
++YY_RULE_SETUP
++return T_AND;
++ YY_BREAK
++case 39:
++YY_RULE_SETUP
++return T_OR;
++ YY_BREAK
++case 40:
++YY_RULE_SETUP
++return T_OPEN_PAREN;
++ YY_BREAK
++case 41:
++YY_RULE_SETUP
++return T_CLOSE_PAREN;
++ YY_BREAK
++case 42:
++YY_RULE_SETUP
++return T_NOT;
++ YY_BREAK
++case 43:
++YY_RULE_SETUP
++return T_EQUAL;
++ YY_BREAK
++case 44:
++YY_RULE_SETUP
++return T_UNEQUAL;
++ YY_BREAK
++case 45:
++YY_RULE_SETUP
++return T_IF;
++ YY_BREAK
++case 46:
++YY_RULE_SETUP
++return T_ON;
++ YY_BREAK
++case 47:
++YY_RULE_SETUP
++{
++ str = zconftext[0];
++ new_string();
++ BEGIN(STRING);
++ }
++ YY_BREAK
++case 48:
++/* rule 48 can match eol */
++YY_RULE_SETUP
++BEGIN(INITIAL); current_file->lineno++; return T_EOL;
++ YY_BREAK
++case 49:
++YY_RULE_SETUP
++/* ignore */
++ YY_BREAK
++case 50:
++YY_RULE_SETUP
++{
++ alloc_string(zconftext, zconfleng);
++ zconflval.string = text;
++ return T_WORD;
++ }
++ YY_BREAK
++case 51:
++YY_RULE_SETUP
++/* comment */
++ YY_BREAK
++case 52:
++/* rule 52 can match eol */
++YY_RULE_SETUP
++current_file->lineno++;
++ YY_BREAK
++case 53:
++YY_RULE_SETUP
++
++ YY_BREAK
++case YY_STATE_EOF(PARAM):
++{
++ BEGIN(INITIAL);
++ }
++ YY_BREAK
++
++case 54:
++/* rule 54 can match eol */
++*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
++(yy_c_buf_p) = yy_cp -= 1;
++YY_DO_BEFORE_ACTION; /* set up zconftext again */
++YY_RULE_SETUP
++{
++ append_string(zconftext, zconfleng);
++ zconflval.string = text;
++ return T_WORD_QUOTE;
++ }
++ YY_BREAK
++case 55:
++YY_RULE_SETUP
++{
++ append_string(zconftext, zconfleng);
++ }
++ YY_BREAK
++case 56:
++/* rule 56 can match eol */
++*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
++(yy_c_buf_p) = yy_cp -= 1;
++YY_DO_BEFORE_ACTION; /* set up zconftext again */
++YY_RULE_SETUP
++{
++ append_string(zconftext + 1, zconfleng - 1);
++ zconflval.string = text;
++ return T_WORD_QUOTE;
++ }
++ YY_BREAK
++case 57:
++YY_RULE_SETUP
++{
++ append_string(zconftext + 1, zconfleng - 1);
++ }
++ YY_BREAK
++case 58:
++YY_RULE_SETUP
++{
++ if (str == zconftext[0]) {
++ BEGIN(PARAM);
++ zconflval.string = text;
++ return T_WORD_QUOTE;
++ } else
++ append_string(zconftext, 1);
++ }
++ YY_BREAK
++case 59:
++/* rule 59 can match eol */
++YY_RULE_SETUP
++{
++ printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
++ current_file->lineno++;
++ BEGIN(INITIAL);
++ return T_EOL;
++ }
++ YY_BREAK
++case YY_STATE_EOF(STRING):
++{
++ BEGIN(INITIAL);
++ }
++ YY_BREAK
++
++case 60:
++YY_RULE_SETUP
++{
++ ts = 0;
++ for (i = 0; i < zconfleng; i++) {
++ if (zconftext[i] == '\t')
++ ts = (ts & ~7) + 8;
++ else
++ ts++;
++ }
++ last_ts = ts;
++ if (first_ts) {
++ if (ts < first_ts) {
++ zconf_endhelp();
++ return T_HELPTEXT;
++ }
++ ts -= first_ts;
++ while (ts > 8) {
++ append_string(" ", 8);
++ ts -= 8;
++ }
++ append_string(" ", ts);
++ }
++ }
++ YY_BREAK
++case 61:
++/* rule 61 can match eol */
++*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
++(yy_c_buf_p) = yy_cp -= 1;
++YY_DO_BEFORE_ACTION; /* set up zconftext again */
++YY_RULE_SETUP
++{
++ current_file->lineno++;
++ zconf_endhelp();
++ return T_HELPTEXT;
++ }
++ YY_BREAK
++case 62:
++/* rule 62 can match eol */
++YY_RULE_SETUP
++{
++ current_file->lineno++;
++ append_string("\n", 1);
++ }
++ YY_BREAK
++case 63:
++YY_RULE_SETUP
++{
++ append_string(zconftext, zconfleng);
++ if (!first_ts)
++ first_ts = last_ts;
++ }
++ YY_BREAK
++case YY_STATE_EOF(HELP):
++{
++ zconf_endhelp();
++ return T_HELPTEXT;
++ }
++ YY_BREAK
++
++case YY_STATE_EOF(INITIAL):
++case YY_STATE_EOF(COMMAND):
++{
++ if (current_buf) {
++ zconf_endfile();
++ return T_EOF;
++ }
++ fclose(zconfin);
++ yyterminate();
++}
++ YY_BREAK
++case 64:
++YY_RULE_SETUP
++YY_FATAL_ERROR( "flex scanner jammed" );
++ YY_BREAK
++
++ case YY_END_OF_BUFFER:
++ {
++ /* Amount of text matched not including the EOB char. */
++ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
++
++ /* Undo the effects of YY_DO_BEFORE_ACTION. */
++ *yy_cp = (yy_hold_char);
++ YY_RESTORE_YY_MORE_OFFSET
++
++ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
++ {
++ /* We're scanning a new file or input source. It's
++ * possible that this happened because the user
++ * just pointed zconfin at a new source and called
++ * zconflex(). If so, then we have to assure
++ * consistency between YY_CURRENT_BUFFER and our
++ * globals. Here is the right place to do so, because
++ * this is the first action (other than possibly a
++ * back-up) that will match for the new input source.
++ */
++ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
++ YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin;
++ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
++ }
++
++ /* Note that here we test for yy_c_buf_p "<=" to the position
++ * of the first EOB in the buffer, since yy_c_buf_p will
++ * already have been incremented past the NUL character
++ * (since all states make transitions on EOB to the
++ * end-of-buffer state). Contrast this with the test
++ * in input().
++ */
++ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
++ { /* This was really a NUL. */
++ yy_state_type yy_next_state;
++
++ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
++
++ yy_current_state = yy_get_previous_state( );
++
++ /* Okay, we're now positioned to make the NUL
++ * transition. We couldn't have
++ * yy_get_previous_state() go ahead and do it
++ * for us because it doesn't know how to deal
++ * with the possibility of jamming (and we don't
++ * want to build jamming into it because then it
++ * will run more slowly).
++ */
++
++ yy_next_state = yy_try_NUL_trans( yy_current_state );
++
++ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
++
++ if ( yy_next_state )
++ {
++ /* Consume the NUL. */
++ yy_cp = ++(yy_c_buf_p);
++ yy_current_state = yy_next_state;
++ goto yy_match;
++ }
++
++ else
++ {
++ yy_cp = (yy_c_buf_p);
++ goto yy_find_action;
++ }
++ }
++
++ else switch ( yy_get_next_buffer( ) )
++ {
++ case EOB_ACT_END_OF_FILE:
++ {
++ (yy_did_buffer_switch_on_eof) = 0;
++
++ if ( zconfwrap( ) )
++ {
++ /* Note: because we've taken care in
++ * yy_get_next_buffer() to have set up
++ * zconftext, we can now set up
++ * yy_c_buf_p so that if some total
++ * hoser (like flex itself) wants to
++ * call the scanner after we return the
++ * YY_NULL, it'll still work - another
++ * YY_NULL will get returned.
++ */
++ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
++
++ yy_act = YY_STATE_EOF(YY_START);
++ goto do_action;
++ }
++
++ else
++ {
++ if ( ! (yy_did_buffer_switch_on_eof) )
++ YY_NEW_FILE;
++ }
++ break;
++ }
++
++ case EOB_ACT_CONTINUE_SCAN:
++ (yy_c_buf_p) =
++ (yytext_ptr) + yy_amount_of_matched_text;
++
++ yy_current_state = yy_get_previous_state( );
++
++ yy_cp = (yy_c_buf_p);
++ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
++ goto yy_match;
++
++ case EOB_ACT_LAST_MATCH:
++ (yy_c_buf_p) =
++ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
++
++ yy_current_state = yy_get_previous_state( );
++
++ yy_cp = (yy_c_buf_p);
++ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
++ goto yy_find_action;
++ }
++ break;
++ }
++
++ default:
++ YY_FATAL_ERROR(
++ "fatal flex scanner internal error--no action found" );
++ } /* end of action switch */
++ } /* end of scanning one token */
++} /* end of zconflex */
++
++/* yy_get_next_buffer - try to read in a new buffer
++ *
++ * Returns a code representing an action:
++ * EOB_ACT_LAST_MATCH -
++ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
++ * EOB_ACT_END_OF_FILE - end of file
++ */
++static int yy_get_next_buffer (void)
++{
++ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
++ register char *source = (yytext_ptr);
++ register int number_to_move, i;
++ int ret_val;
++
++ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
++ YY_FATAL_ERROR(
++ "fatal flex scanner internal error--end of buffer missed" );
++
++ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
++ { /* Don't try to fill the buffer, so this is an EOF. */
++ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
++ {
++ /* We matched a single character, the EOB, so
++ * treat this as a final EOF.
++ */
++ return EOB_ACT_END_OF_FILE;
++ }
++
++ else
++ {
++ /* We matched some text prior to the EOB, first
++ * process it.
++ */
++ return EOB_ACT_LAST_MATCH;
++ }
++ }
++
++ /* Try to read more data. */
++
++ /* First move last chars to start of buffer. */
++ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
++
++ for ( i = 0; i < number_to_move; ++i )
++ *(dest++) = *(source++);
++
++ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
++ /* don't do the read, it's not guaranteed to return an EOF,
++ * just force an EOF
++ */
++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
++
++ else
++ {
++ size_t num_to_read =
++ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
++
++ while ( num_to_read <= 0 )
++ { /* Not enough room in the buffer - grow it. */
++
++ /* just a shorter name for the current buffer */
++ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
++
++ int yy_c_buf_p_offset =
++ (int) ((yy_c_buf_p) - b->yy_ch_buf);
++
++ if ( b->yy_is_our_buffer )
++ {
++ int new_size = b->yy_buf_size * 2;
++
++ if ( new_size <= 0 )
++ b->yy_buf_size += b->yy_buf_size / 8;
++ else
++ b->yy_buf_size *= 2;
++
++ b->yy_ch_buf = (char *)
++ /* Include room in for 2 EOB chars. */
++ zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
++ }
++ else
++ /* Can't grow it, we don't own it. */
++ b->yy_ch_buf = 0;
++
++ if ( ! b->yy_ch_buf )
++ YY_FATAL_ERROR(
++ "fatal error - scanner input buffer overflow" );
++
++ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
++
++ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
++ number_to_move - 1;
++
++ }
++
++ if ( num_to_read > YY_READ_BUF_SIZE )
++ num_to_read = YY_READ_BUF_SIZE;
++
++ /* Read in more data. */
++ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
++ (yy_n_chars), num_to_read );
++
++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
++ }
++
++ if ( (yy_n_chars) == 0 )
++ {
++ if ( number_to_move == YY_MORE_ADJ )
++ {
++ ret_val = EOB_ACT_END_OF_FILE;
++ zconfrestart(zconfin );
++ }
++
++ else
++ {
++ ret_val = EOB_ACT_LAST_MATCH;
++ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
++ YY_BUFFER_EOF_PENDING;
++ }
++ }
++
++ else
++ ret_val = EOB_ACT_CONTINUE_SCAN;
++
++ (yy_n_chars) += number_to_move;
++ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
++ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
++
++ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
++
++ return ret_val;
++}
++
++/* yy_get_previous_state - get the state just before the EOB char was reached */
++
++ static yy_state_type yy_get_previous_state (void)
++{
++ register yy_state_type yy_current_state;
++ register char *yy_cp;
++
++ yy_current_state = (yy_start);
++
++ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
++ {
++ yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)];
++ }
++
++ return yy_current_state;
++}
++
++/* yy_try_NUL_trans - try to make a transition on the NUL character
++ *
++ * synopsis
++ * next_state = yy_try_NUL_trans( current_state );
++ */
++ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
++{
++ register int yy_is_jam;
++
++ yy_current_state = yy_nxt[yy_current_state][1];
++ yy_is_jam = (yy_current_state <= 0);
++
++ return yy_is_jam ? 0 : yy_current_state;
++}
++
++ static void yyunput (int c, register char * yy_bp )
++{
++ register char *yy_cp;
++
++ yy_cp = (yy_c_buf_p);
++
++ /* undo effects of setting up zconftext */
++ *yy_cp = (yy_hold_char);
++
++ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
++ { /* need to shift things up to make room */
++ /* +2 for EOB chars. */
++ register int number_to_move = (yy_n_chars) + 2;
++ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
++ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
++ register char *source =
++ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
++
++ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
++ *--dest = *--source;
++
++ yy_cp += (int) (dest - source);
++ yy_bp += (int) (dest - source);
++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
++ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
++
++ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
++ YY_FATAL_ERROR( "flex scanner push-back overflow" );
++ }
++
++ *--yy_cp = (char) c;
++
++ (yytext_ptr) = yy_bp;
++ (yy_hold_char) = *yy_cp;
++ (yy_c_buf_p) = yy_cp;
++}
++
++#ifndef YY_NO_INPUT
++#ifdef __cplusplus
++ static int yyinput (void)
++#else
++ static int input (void)
++#endif
++
++{
++ int c;
++
++ *(yy_c_buf_p) = (yy_hold_char);
++
++ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
++ {
++ /* yy_c_buf_p now points to the character we want to return.
++ * If this occurs *before* the EOB characters, then it's a
++ * valid NUL; if not, then we've hit the end of the buffer.
++ */
++ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
++ /* This was really a NUL. */
++ *(yy_c_buf_p) = '\0';
++
++ else
++ { /* need more input */
++ int offset = (yy_c_buf_p) - (yytext_ptr);
++ ++(yy_c_buf_p);
++
++ switch ( yy_get_next_buffer( ) )
++ {
++ case EOB_ACT_LAST_MATCH:
++ /* This happens because yy_g_n_b()
++ * sees that we've accumulated a
++ * token and flags that we need to
++ * try matching the token before
++ * proceeding. But for input(),
++ * there's no matching to consider.
++ * So convert the EOB_ACT_LAST_MATCH
++ * to EOB_ACT_END_OF_FILE.
++ */
++
++ /* Reset buffer status. */
++ zconfrestart(zconfin );
++
++ /*FALLTHROUGH*/
++
++ case EOB_ACT_END_OF_FILE:
++ {
++ if ( zconfwrap( ) )
++ return EOF;
++
++ if ( ! (yy_did_buffer_switch_on_eof) )
++ YY_NEW_FILE;
++#ifdef __cplusplus
++ return yyinput();
++#else
++ return input();
++#endif
++ }
++
++ case EOB_ACT_CONTINUE_SCAN:
++ (yy_c_buf_p) = (yytext_ptr) + offset;
++ break;
++ }
++ }
++ }
++
++ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
++ *(yy_c_buf_p) = '\0'; /* preserve zconftext */
++ (yy_hold_char) = *++(yy_c_buf_p);
++
++ return c;
++}
++#endif /* ifndef YY_NO_INPUT */
++
++/** Immediately switch to a different input stream.
++ * @param input_file A readable stream.
++ *
++ * @note This function does not reset the start condition to @c INITIAL .
++ */
++ void zconfrestart (FILE * input_file )
++{
++
++ if ( ! YY_CURRENT_BUFFER ){
++ zconfensure_buffer_stack ();
++ YY_CURRENT_BUFFER_LVALUE =
++ zconf_create_buffer(zconfin,YY_BUF_SIZE );
++ }
++
++ zconf_init_buffer(YY_CURRENT_BUFFER,input_file );
++ zconf_load_buffer_state( );
++}
++
++/** Switch to a different input buffer.
++ * @param new_buffer The new input buffer.
++ *
++ */
++ void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer )
++{
++
++ /* TODO. We should be able to replace this entire function body
++ * with
++ * zconfpop_buffer_state();
++ * zconfpush_buffer_state(new_buffer);
++ */
++ zconfensure_buffer_stack ();
++ if ( YY_CURRENT_BUFFER == new_buffer )
++ return;
++
++ if ( YY_CURRENT_BUFFER )
++ {
++ /* Flush out information for old buffer. */
++ *(yy_c_buf_p) = (yy_hold_char);
++ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
++ }
++
++ YY_CURRENT_BUFFER_LVALUE = new_buffer;
++ zconf_load_buffer_state( );
++
++ /* We don't actually know whether we did this switch during
++ * EOF (zconfwrap()) processing, but the only time this flag
++ * is looked at is after zconfwrap() is called, so it's safe
++ * to go ahead and always set it.
++ */
++ (yy_did_buffer_switch_on_eof) = 1;
++}
++
++static void zconf_load_buffer_state (void)
++{
++ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
++ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
++ zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
++ (yy_hold_char) = *(yy_c_buf_p);
++}
++
++/** Allocate and initialize an input buffer state.
++ * @param file A readable stream.
++ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
++ *
++ * @return the allocated buffer state.
++ */
++ YY_BUFFER_STATE zconf_create_buffer (FILE * file, int size )
++{
++ YY_BUFFER_STATE b;
++
++ b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) );
++ if ( ! b )
++ YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
++
++ b->yy_buf_size = size;
++
++ /* yy_ch_buf has to be 2 characters longer than the size given because
++ * we need to put in 2 end-of-buffer characters.
++ */
++ b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2 );
++ if ( ! b->yy_ch_buf )
++ YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
++
++ b->yy_is_our_buffer = 1;
++
++ zconf_init_buffer(b,file );
++
++ return b;
++}
++
++/** Destroy the buffer.
++ * @param b a buffer created with zconf_create_buffer()
++ *
++ */
++ void zconf_delete_buffer (YY_BUFFER_STATE b )
++{
++
++ if ( ! b )
++ return;
++
++ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
++ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
++
++ if ( b->yy_is_our_buffer )
++ zconffree((void *) b->yy_ch_buf );
++
++ zconffree((void *) b );
++}
++
++/* Initializes or reinitializes a buffer.
++ * This function is sometimes called more than once on the same buffer,
++ * such as during a zconfrestart() or at EOF.
++ */
++ static void zconf_init_buffer (YY_BUFFER_STATE b, FILE * file )
++
++{
++ int oerrno = errno;
++
++ zconf_flush_buffer(b );
++
++ b->yy_input_file = file;
++ b->yy_fill_buffer = 1;
++
++ /* If b is the current buffer, then zconf_init_buffer was _probably_
++ * called from zconfrestart() or through yy_get_next_buffer.
++ * In that case, we don't want to reset the lineno or column.
++ */
++ if (b != YY_CURRENT_BUFFER){
++ b->yy_bs_lineno = 1;
++ b->yy_bs_column = 0;
++ }
++
++ b->yy_is_interactive = 0;
++
++ errno = oerrno;
++}
++
++/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
++ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
++ *
++ */
++ void zconf_flush_buffer (YY_BUFFER_STATE b )
++{
++ if ( ! b )
++ return;
++
++ b->yy_n_chars = 0;
++
++ /* We always need two end-of-buffer characters. The first causes
++ * a transition to the end-of-buffer state. The second causes
++ * a jam in that state.
++ */
++ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
++ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
++
++ b->yy_buf_pos = &b->yy_ch_buf[0];
++
++ b->yy_at_bol = 1;
++ b->yy_buffer_status = YY_BUFFER_NEW;
++
++ if ( b == YY_CURRENT_BUFFER )
++ zconf_load_buffer_state( );
++}
++
++/** Pushes the new state onto the stack. The new state becomes
++ * the current state. This function will allocate the stack
++ * if necessary.
++ * @param new_buffer The new state.
++ *
++ */
++void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer )
++{
++ if (new_buffer == NULL)
++ return;
++
++ zconfensure_buffer_stack();
++
++ /* This block is copied from zconf_switch_to_buffer. */
++ if ( YY_CURRENT_BUFFER )
++ {
++ /* Flush out information for old buffer. */
++ *(yy_c_buf_p) = (yy_hold_char);
++ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
++ }
++
++ /* Only push if top exists. Otherwise, replace top. */
++ if (YY_CURRENT_BUFFER)
++ (yy_buffer_stack_top)++;
++ YY_CURRENT_BUFFER_LVALUE = new_buffer;
++
++ /* copied from zconf_switch_to_buffer. */
++ zconf_load_buffer_state( );
++ (yy_did_buffer_switch_on_eof) = 1;
++}
++
++/** Removes and deletes the top of the stack, if present.
++ * The next element becomes the new top.
++ *
++ */
++void zconfpop_buffer_state (void)
++{
++ if (!YY_CURRENT_BUFFER)
++ return;
++
++ zconf_delete_buffer(YY_CURRENT_BUFFER );
++ YY_CURRENT_BUFFER_LVALUE = NULL;
++ if ((yy_buffer_stack_top) > 0)
++ --(yy_buffer_stack_top);
++
++ if (YY_CURRENT_BUFFER) {
++ zconf_load_buffer_state( );
++ (yy_did_buffer_switch_on_eof) = 1;
++ }
++}
++
++/* Allocates the stack if it does not exist.
++ * Guarantees space for at least one push.
++ */
++static void zconfensure_buffer_stack (void)
++{
++ int num_to_alloc;
++
++ if (!(yy_buffer_stack)) {
++
++ /* First allocation is just for 2 elements, since we don't know if this
++ * scanner will even need a stack. We use 2 instead of 1 to avoid an
++ * immediate realloc on the next call.
++ */
++ num_to_alloc = 1;
++ (yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc
++ (num_to_alloc * sizeof(struct yy_buffer_state*)
++ );
++
++ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
++
++ (yy_buffer_stack_max) = num_to_alloc;
++ (yy_buffer_stack_top) = 0;
++ return;
++ }
++
++ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
++
++ /* Increase the buffer to prepare for a possible push. */
++ int grow_size = 8 /* arbitrary grow size */;
++
++ num_to_alloc = (yy_buffer_stack_max) + grow_size;
++ (yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc
++ ((yy_buffer_stack),
++ num_to_alloc * sizeof(struct yy_buffer_state*)
++ );
++
++ /* zero only the new slots.*/
++ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
++ (yy_buffer_stack_max) = num_to_alloc;
++ }
++}
++
++/** Setup the input buffer state to scan directly from a user-specified character buffer.
++ * @param base the character buffer
++ * @param size the size in bytes of the character buffer
++ *
++ * @return the newly allocated buffer state object.
++ */
++YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size )
++{
++ YY_BUFFER_STATE b;
++
++ if ( size < 2 ||
++ base[size-2] != YY_END_OF_BUFFER_CHAR ||
++ base[size-1] != YY_END_OF_BUFFER_CHAR )
++ /* They forgot to leave room for the EOB's. */
++ return 0;
++
++ b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) );
++ if ( ! b )
++ YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" );
++
++ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
++ b->yy_buf_pos = b->yy_ch_buf = base;
++ b->yy_is_our_buffer = 0;
++ b->yy_input_file = 0;
++ b->yy_n_chars = b->yy_buf_size;
++ b->yy_is_interactive = 0;
++ b->yy_at_bol = 1;
++ b->yy_fill_buffer = 0;
++ b->yy_buffer_status = YY_BUFFER_NEW;
++
++ zconf_switch_to_buffer(b );
++
++ return b;
++}
++
++/** Setup the input buffer state to scan a string. The next call to zconflex() will
++ * scan from a @e copy of @a str.
++ * @param str a NUL-terminated string to scan
++ *
++ * @return the newly allocated buffer state object.
++ * @note If you want to scan bytes that may contain NUL values, then use
++ * zconf_scan_bytes() instead.
++ */
++YY_BUFFER_STATE zconf_scan_string (yyconst char * str )
++{
++
++ return zconf_scan_bytes(str,strlen(str) );
++}
++
++/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
++ * scan from a @e copy of @a bytes.
++ * @param bytes the byte buffer to scan
++ * @param len the number of bytes in the buffer pointed to by @a bytes.
++ *
++ * @return the newly allocated buffer state object.
++ */
++YY_BUFFER_STATE zconf_scan_bytes (yyconst char * bytes, int len )
++{
++ YY_BUFFER_STATE b;
++ char *buf;
++ yy_size_t n;
++ int i;
++
++ /* Get memory for full buffer, including space for trailing EOB's. */
++ n = len + 2;
++ buf = (char *) zconfalloc(n );
++ if ( ! buf )
++ YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" );
++
++ for ( i = 0; i < len; ++i )
++ buf[i] = bytes[i];
++
++ buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
++
++ b = zconf_scan_buffer(buf,n );
++ if ( ! b )
++ YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" );
++
++ /* It's okay to grow etc. this buffer, and we should throw it
++ * away when we're done.
++ */
++ b->yy_is_our_buffer = 1;
++
++ return b;
++}
++
++#ifndef YY_EXIT_FAILURE
++#define YY_EXIT_FAILURE 2
++#endif
++
++static void yy_fatal_error (yyconst char* msg )
++{
++ (void) fprintf( stderr, "%s\n", msg );
++ exit( YY_EXIT_FAILURE );
++}
++
++/* Redefine yyless() so it works in section 3 code. */
++
++#undef yyless
++#define yyless(n) \
++ do \
++ { \
++ /* Undo effects of setting up zconftext. */ \
++ int yyless_macro_arg = (n); \
++ YY_LESS_LINENO(yyless_macro_arg);\
++ zconftext[zconfleng] = (yy_hold_char); \
++ (yy_c_buf_p) = zconftext + yyless_macro_arg; \
++ (yy_hold_char) = *(yy_c_buf_p); \
++ *(yy_c_buf_p) = '\0'; \
++ zconfleng = yyless_macro_arg; \
++ } \
++ while ( 0 )
++
++/* Accessor methods (get/set functions) to struct members. */
++
++/** Get the current line number.
++ *
++ */
++int zconfget_lineno (void)
++{
++
++ return zconflineno;
++}
++
++/** Get the input stream.
++ *
++ */
++FILE *zconfget_in (void)
++{
++ return zconfin;
++}
++
++/** Get the output stream.
++ *
++ */
++FILE *zconfget_out (void)
++{
++ return zconfout;
++}
++
++/** Get the length of the current token.
++ *
++ */
++int zconfget_leng (void)
++{
++ return zconfleng;
++}
++
++/** Get the current token.
++ *
++ */
++
++char *zconfget_text (void)
++{
++ return zconftext;
++}
++
++/** Set the current line number.
++ * @param line_number
++ *
++ */
++void zconfset_lineno (int line_number )
++{
++
++ zconflineno = line_number;
++}
++
++/** Set the input stream. This does not discard the current
++ * input buffer.
++ * @param in_str A readable stream.
++ *
++ * @see zconf_switch_to_buffer
++ */
++void zconfset_in (FILE * in_str )
++{
++ zconfin = in_str ;
++}
++
++void zconfset_out (FILE * out_str )
++{
++ zconfout = out_str ;
++}
++
++int zconfget_debug (void)
++{
++ return zconf_flex_debug;
++}
++
++void zconfset_debug (int bdebug )
++{
++ zconf_flex_debug = bdebug ;
++}
++
++/* zconflex_destroy is for both reentrant and non-reentrant scanners. */
++int zconflex_destroy (void)
++{
++
++ /* Pop the buffer stack, destroying each element. */
++ while(YY_CURRENT_BUFFER){
++ zconf_delete_buffer(YY_CURRENT_BUFFER );
++ YY_CURRENT_BUFFER_LVALUE = NULL;
++ zconfpop_buffer_state();
++ }
++
++ /* Destroy the stack itself. */
++ zconffree((yy_buffer_stack) );
++ (yy_buffer_stack) = NULL;
++
++ return 0;
++}
++
++/*
++ * Internal utility routines.
++ */
++
++#ifndef yytext_ptr
++static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
++{
++ register int i;
++ for ( i = 0; i < n; ++i )
++ s1[i] = s2[i];
++}
++#endif
++
++#ifdef YY_NEED_STRLEN
++static int yy_flex_strlen (yyconst char * s )
++{
++ register int n;
++ for ( n = 0; s[n]; ++n )
++ ;
++
++ return n;
++}
++#endif
++
++void *zconfalloc (yy_size_t size )
++{
++ return (void *) malloc( size );
++}
++
++void *zconfrealloc (void * ptr, yy_size_t size )
++{
++ /* The cast to (char *) in the following accommodates both
++ * implementations that use char* generic pointers, and those
++ * that use void* generic pointers. It works with the latter
++ * because both ANSI C and C++ allow castless assignment from
++ * any pointer type to void*, and deal with argument conversions
++ * as though doing an assignment.
++ */
++ return (void *) realloc( (char *) ptr, size );
++}
++
++void zconffree (void * ptr )
++{
++ free( (char *) ptr ); /* see zconfrealloc() for (char *) cast */
++}
++
++#define YYTABLES_NAME "yytables"
++
++#undef YY_NEW_FILE
++#undef YY_FLUSH_BUFFER
++#undef yy_set_bol
++#undef yy_new_buffer
++#undef yy_set_interactive
++#undef yytext_ptr
++#undef YY_DO_BEFORE_ACTION
++
++#ifdef YY_DECL_IS_OURS
++#undef YY_DECL_IS_OURS
++#undef YY_DECL
++#endif
++
++void zconf_starthelp(void)
++{
++ new_string();
++ last_ts = first_ts = 0;
++ BEGIN(HELP);
++}
++
++static void zconf_endhelp(void)
++{
++ zconflval.string = text;
++ BEGIN(INITIAL);
++}
++
++/*
++ * Try to open specified file with following names:
++ * ./name
++ * $(srctree)/name
++ * The latter is used when srctree is separate from objtree
++ * when compiling the kernel.
++ * Return NULL if file is not found.
++ */
++FILE *zconf_fopen(const char *name)
++{
++ char *env, fullname[PATH_MAX+1];
++ FILE *f;
++
++ f = fopen(name, "r");
++ if (!f && name[0] != '/') {
++ env = getenv(SRCTREE);
++ if (env) {
++ sprintf(fullname, "%s/%s", env, name);
++ f = fopen(fullname, "r");
++ }
++ }
++ return f;
++}
++
++void zconf_initscan(const char *name)
++{
++ zconfin = zconf_fopen(name);
++ if (!zconfin) {
++ printf("can't find file %s\n", name);
++ exit(1);
++ }
++
++ current_buf = malloc(sizeof(*current_buf));
++ memset(current_buf, 0, sizeof(*current_buf));
++
++ current_file = file_lookup(name);
++ current_file->lineno = 1;
++ current_file->flags = FILE_BUSY;
++}
++
++void zconf_nextfile(const char *name)
++{
++ struct file *file = file_lookup(name);
++ struct buffer *buf = malloc(sizeof(*buf));
++ memset(buf, 0, sizeof(*buf));
++
++ current_buf->state = YY_CURRENT_BUFFER;
++ zconfin = zconf_fopen(name);
++ if (!zconfin) {
++ printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
++ exit(1);
++ }
++ zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE));
++ buf->parent = current_buf;
++ current_buf = buf;
++
++ if (file->flags & FILE_BUSY) {
++ printf("recursive scan (%s)?\n", name);
++ exit(1);
++ }
++ if (file->flags & FILE_SCANNED) {
++ printf("file %s already scanned?\n", name);
++ exit(1);
++ }
++ file->flags |= FILE_BUSY;
++ file->lineno = 1;
++ file->parent = current_file;
++ current_file = file;
++}
++
++static struct buffer *zconf_endfile(void)
++{
++ struct buffer *parent;
++
++ current_file->flags |= FILE_SCANNED;
++ current_file->flags &= ~FILE_BUSY;
++ current_file = current_file->parent;
++
++ parent = current_buf->parent;
++ if (parent) {
++ fclose(zconfin);
++ zconf_delete_buffer(YY_CURRENT_BUFFER);
++ zconf_switch_to_buffer(parent->state);
++ }
++ free(current_buf);
++ current_buf = parent;
++
++ return parent;
++}
++
++int zconf_lineno(void)
++{
++ if (current_buf)
++ return current_file->lineno - 1;
++ else
++ return 0;
++}
++
++char *zconf_curname(void)
++{
++ if (current_buf)
++ return current_file->name;
++ else
++ return "<none>";
++}
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc.h b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc.h
+new file mode 100644
+index 0000000..b8a67fc
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc.h
+@@ -0,0 +1,123 @@
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#ifndef LKC_H
++#define LKC_H
++
++#include "expr.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifdef LKC_DIRECT_LINK
++#define P(name,type,arg) extern type name arg
++#else
++#include "lkc_defs.h"
++#define P(name,type,arg) extern type (*name ## _p) arg
++#endif
++#include "lkc_proto.h"
++#undef P
++
++#define SRCTREE "srctree"
++
++int zconfparse(void);
++void zconfdump(FILE *out);
++
++extern int zconfdebug;
++void zconf_starthelp(void);
++FILE *zconf_fopen(const char *name);
++void zconf_initscan(const char *name);
++void zconf_nextfile(const char *name);
++int zconf_lineno(void);
++char *zconf_curname(void);
++
++/* confdata.c */
++extern const char conf_def_filename[];
++extern char conf_filename[];
++
++char *conf_get_default_confname(void);
++
++/* kconfig_load.c */
++void kconfig_load(void);
++
++/* menu.c */
++void menu_init(void);
++void menu_add_menu(void);
++void menu_end_menu(void);
++void menu_add_entry(struct symbol *sym);
++void menu_end_entry(void);
++void menu_add_dep(struct expr *dep);
++struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep);
++void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
++void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
++void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
++void menu_finalize(struct menu *parent);
++void menu_set_type(int type);
++
++/* util.c */
++struct file *file_lookup(const char *name);
++int file_write_dep(const char *name);
++
++struct gstr {
++ size_t len;
++ char *s;
++};
++struct gstr str_new(void);
++struct gstr str_assign(const char *s);
++void str_free(struct gstr *gs);
++void str_append(struct gstr *gs, const char *s);
++void str_printf(struct gstr *gs, const char *fmt, ...);
++const char *str_get(struct gstr *gs);
++
++/* symbol.c */
++void sym_init(void);
++void sym_clear_all_valid(void);
++void sym_set_changed(struct symbol *sym);
++struct symbol *sym_check_deps(struct symbol *sym);
++struct property *prop_alloc(enum prop_type type, struct symbol *sym);
++struct symbol *prop_get_symbol(struct property *prop);
++
++static inline tristate sym_get_tristate_value(struct symbol *sym)
++{
++ return sym->curr.tri;
++}
++
++
++static inline struct symbol *sym_get_choice_value(struct symbol *sym)
++{
++ return (struct symbol *)sym->curr.val;
++}
++
++static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval)
++{
++ return sym_set_tristate_value(chval, yes);
++}
++
++static inline bool sym_is_choice(struct symbol *sym)
++{
++ return sym->flags & SYMBOL_CHOICE ? true : false;
++}
++
++static inline bool sym_is_choice_value(struct symbol *sym)
++{
++ return sym->flags & SYMBOL_CHOICEVAL ? true : false;
++}
++
++static inline bool sym_is_optional(struct symbol *sym)
++{
++ return sym->flags & SYMBOL_OPTIONAL ? true : false;
++}
++
++static inline bool sym_has_value(struct symbol *sym)
++{
++ return sym->flags & SYMBOL_NEW ? false : true;
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* LKC_H */
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc_proto.h b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc_proto.h
+new file mode 100644
+index 0000000..6dc6d0c
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc_proto.h
+@@ -0,0 +1,40 @@
++
++/* confdata.c */
++P(conf_parse,void,(const char *name));
++P(conf_read,int,(const char *name));
++P(conf_write,int,(const char *name));
++
++/* menu.c */
++P(rootmenu,struct menu,);
++
++P(menu_is_visible,bool,(struct menu *menu));
++P(menu_get_prompt,const char *,(struct menu *menu));
++P(menu_get_root_menu,struct menu *,(struct menu *menu));
++P(menu_get_parent_menu,struct menu *,(struct menu *menu));
++
++/* symbol.c */
++P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
++P(sym_change_count,int,);
++
++P(sym_lookup,struct symbol *,(const char *name, int isconst));
++P(sym_find,struct symbol *,(const char *name));
++P(sym_re_search,struct symbol **,(const char *pattern));
++P(sym_type_name,const char *,(enum symbol_type type));
++P(sym_calc_value,void,(struct symbol *sym));
++P(sym_get_type,enum symbol_type,(struct symbol *sym));
++P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri));
++P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri));
++P(sym_toggle_tristate_value,tristate,(struct symbol *sym));
++P(sym_string_valid,bool,(struct symbol *sym, const char *newval));
++P(sym_string_within_range,bool,(struct symbol *sym, const char *str));
++P(sym_set_string_value,bool,(struct symbol *sym, const char *newval));
++P(sym_is_changable,bool,(struct symbol *sym));
++P(sym_get_choice_prop,struct property *,(struct symbol *sym));
++P(sym_get_default_prop,struct property *,(struct symbol *sym));
++P(sym_get_string_value,const char *,(struct symbol *sym));
++
++P(prop_get_type_name,const char *,(enum prop_type type));
++
++/* expr.c */
++P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2));
++P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken));
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/BIG.FAT.WARNING b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/BIG.FAT.WARNING
+new file mode 100644
+index 0000000..a8999d8
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/BIG.FAT.WARNING
+@@ -0,0 +1,4 @@
++This is NOT the official version of dialog. This version has been
++significantly modified from the original. It is for use by the Linux
++kernel configuration script. Please do not bother Savio Lam with
++questions about this program.
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/checklist.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/checklist.c
+new file mode 100644
+index 0000000..71de4a1
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/checklist.c
+@@ -0,0 +1,372 @@
++/*
++ * checklist.c -- implements the checklist box
++ *
++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
++ * Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension
++ * Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two
++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include "dialog.h"
++
++static int list_width, check_x, item_x, checkflag;
++
++/*
++ * Print list item
++ */
++static void
++print_item (WINDOW * win, const char *item, int status,
++ int choice, int selected)
++{
++ int i;
++
++ /* Clear 'residue' of last item */
++ wattrset (win, menubox_attr);
++ wmove (win, choice, 0);
++ for (i = 0; i < list_width; i++)
++ waddch (win, ' ');
++
++ wmove (win, choice, check_x);
++ wattrset (win, selected ? check_selected_attr : check_attr);
++ if (checkflag == FLAG_CHECK)
++ wprintw (win, "[%c]", status ? 'X' : ' ');
++ else
++ wprintw (win, "(%c)", status ? 'X' : ' ');
++
++ wattrset (win, selected ? tag_selected_attr : tag_attr);
++ mvwaddch(win, choice, item_x, item[0]);
++ wattrset (win, selected ? item_selected_attr : item_attr);
++ waddstr (win, (char *)item+1);
++ if (selected) {
++ wmove (win, choice, check_x+1);
++ wrefresh (win);
++ }
++}
++
++/*
++ * Print the scroll indicators.
++ */
++static void
++print_arrows (WINDOW * win, int choice, int item_no, int scroll,
++ int y, int x, int height)
++{
++ wmove(win, y, x);
++
++ if (scroll > 0) {
++ wattrset (win, uarrow_attr);
++ waddch (win, ACS_UARROW);
++ waddstr (win, "(-)");
++ }
++ else {
++ wattrset (win, menubox_attr);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ }
++
++ y = y + height + 1;
++ wmove(win, y, x);
++
++ if ((height < item_no) && (scroll + choice < item_no - 1)) {
++ wattrset (win, darrow_attr);
++ waddch (win, ACS_DARROW);
++ waddstr (win, "(+)");
++ }
++ else {
++ wattrset (win, menubox_border_attr);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ }
++}
++
++/*
++ * Display the termination buttons
++ */
++static void
++print_buttons( WINDOW *dialog, int height, int width, int selected)
++{
++ int x = width / 2 - 11;
++ int y = height - 2;
++
++ print_button (dialog, "Select", y, x, selected == 0);
++ print_button (dialog, " Help ", y, x + 14, selected == 1);
++
++ wmove(dialog, y, x+1 + 14*selected);
++ wrefresh (dialog);
++}
++
++/*
++ * Display a dialog box with a list of options that can be turned on or off
++ * The `flag' parameter is used to select between radiolist and checklist.
++ */
++int
++dialog_checklist (const char *title, const char *prompt, int height, int width,
++ int list_height, int item_no, struct dialog_list_item ** items,
++ int flag)
++
++{
++ int i, x, y, box_x, box_y;
++ int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
++ WINDOW *dialog, *list;
++
++ checkflag = flag;
++
++ /* Allocate space for storing item on/off status */
++ if ((status = malloc (sizeof (int) * item_no)) == NULL) {
++ endwin ();
++ fprintf (stderr,
++ "\nCan't allocate memory in dialog_checklist().\n");
++ exit (-1);
++ }
++
++ /* Initializes status */
++ for (i = 0; i < item_no; i++) {
++ status[i] = (items[i]->selected == 1); /* ON */
++ if ((!choice && status[i]) || items[i]->selected == 2) /* SELECTED */
++ choice = i + 1;
++ }
++ if (choice)
++ choice--;
++
++ max_choice = MIN (list_height, item_no);
++
++ /* center dialog box on screen */
++ x = (COLS - width) / 2;
++ y = (LINES - height) / 2;
++
++ draw_shadow (stdscr, y, x, height, width);
++
++ dialog = newwin (height, width, y, x);
++ keypad (dialog, TRUE);
++
++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
++ wattrset (dialog, border_attr);
++ mvwaddch (dialog, height-3, 0, ACS_LTEE);
++ for (i = 0; i < width - 2; i++)
++ waddch (dialog, ACS_HLINE);
++ wattrset (dialog, dialog_attr);
++ waddch (dialog, ACS_RTEE);
++
++ if (title != NULL && strlen(title) >= width-2 ) {
++ /* truncate long title -- mec */
++ char * title2 = malloc(width-2+1);
++ memcpy( title2, title, width-2 );
++ title2[width-2] = '\0';
++ title = title2;
++ }
++
++ if (title != NULL) {
++ wattrset (dialog, title_attr);
++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
++ waddstr (dialog, (char *)title);
++ waddch (dialog, ' ');
++ }
++
++ wattrset (dialog, dialog_attr);
++ print_autowrap (dialog, prompt, width - 2, 1, 3);
++
++ list_width = width - 6;
++ box_y = height - list_height - 5;
++ box_x = (width - list_width) / 2 - 1;
++
++ /* create new window for the list */
++ list = subwin (dialog, list_height, list_width, y+box_y+1, x+box_x+1);
++
++ keypad (list, TRUE);
++
++ /* draw a box around the list items */
++ draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2,
++ menubox_border_attr, menubox_attr);
++
++ /* Find length of longest item in order to center checklist */
++ check_x = 0;
++ for (i = 0; i < item_no; i++)
++ check_x = MAX (check_x, + strlen (items[i]->name) + 4);
++
++ check_x = (list_width - check_x) / 2;
++ item_x = check_x + 4;
++
++ if (choice >= list_height) {
++ scroll = choice - list_height + 1;
++ choice -= scroll;
++ }
++
++ /* Print the list */
++ for (i = 0; i < max_choice; i++) {
++ print_item (list, items[scroll + i]->name,
++ status[i+scroll], i, i == choice);
++ }
++
++ print_arrows(dialog, choice, item_no, scroll,
++ box_y, box_x + check_x + 5, list_height);
++
++ print_buttons(dialog, height, width, 0);
++
++ wnoutrefresh (list);
++ wnoutrefresh (dialog);
++ doupdate ();
++
++ while (key != ESC) {
++ key = wgetch (dialog);
++
++ for (i = 0; i < max_choice; i++)
++ if (toupper(key) == toupper(items[scroll + i]->name[0]))
++ break;
++
++
++ if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
++ key == '+' || key == '-' ) {
++ if (key == KEY_UP || key == '-') {
++ if (!choice) {
++ if (!scroll)
++ continue;
++ /* Scroll list down */
++ if (list_height > 1) {
++ /* De-highlight current first item */
++ print_item (list, items[scroll]->name,
++ status[scroll], 0, FALSE);
++ scrollok (list, TRUE);
++ wscrl (list, -1);
++ scrollok (list, FALSE);
++ }
++ scroll--;
++ print_item (list, items[scroll]->name,
++ status[scroll], 0, TRUE);
++ wnoutrefresh (list);
++
++ print_arrows(dialog, choice, item_no, scroll,
++ box_y, box_x + check_x + 5, list_height);
++
++ wrefresh (dialog);
++
++ continue; /* wait for another key press */
++ } else
++ i = choice - 1;
++ } else if (key == KEY_DOWN || key == '+') {
++ if (choice == max_choice - 1) {
++ if (scroll + choice >= item_no - 1)
++ continue;
++ /* Scroll list up */
++ if (list_height > 1) {
++ /* De-highlight current last item before scrolling up */
++ print_item (list, items[scroll + max_choice - 1]->name,
++ status[scroll + max_choice - 1],
++ max_choice - 1, FALSE);
++ scrollok (list, TRUE);
++ scroll (list);
++ scrollok (list, FALSE);
++ }
++ scroll++;
++ print_item (list, items[scroll + max_choice - 1]->name,
++ status[scroll + max_choice - 1],
++ max_choice - 1, TRUE);
++ wnoutrefresh (list);
++
++ print_arrows(dialog, choice, item_no, scroll,
++ box_y, box_x + check_x + 5, list_height);
++
++ wrefresh (dialog);
++
++ continue; /* wait for another key press */
++ } else
++ i = choice + 1;
++ }
++ if (i != choice) {
++ /* De-highlight current item */
++ print_item (list, items[scroll + choice]->name,
++ status[scroll + choice], choice, FALSE);
++ /* Highlight new item */
++ choice = i;
++ print_item (list, items[scroll + choice]->name,
++ status[scroll + choice], choice, TRUE);
++ wnoutrefresh (list);
++ wrefresh (dialog);
++ }
++ continue; /* wait for another key press */
++ }
++ switch (key) {
++ case 'H':
++ case 'h':
++ case '?':
++ for (i = 0; i < item_no; i++)
++ items[i]->selected = 0;
++ items[scroll + choice]->selected = 1;
++ delwin (dialog);
++ free (status);
++ return 1;
++ case TAB:
++ case KEY_LEFT:
++ case KEY_RIGHT:
++ button = ((key == KEY_LEFT ? --button : ++button) < 0)
++ ? 1 : (button > 1 ? 0 : button);
++
++ print_buttons(dialog, height, width, button);
++ wrefresh (dialog);
++ break;
++ case 'S':
++ case 's':
++ case ' ':
++ case '\n':
++ if (!button) {
++ if (flag == FLAG_CHECK) {
++ status[scroll + choice] = !status[scroll + choice];
++ wmove (list, choice, check_x);
++ wattrset (list, check_selected_attr);
++ wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' ');
++ } else {
++ if (!status[scroll + choice]) {
++ for (i = 0; i < item_no; i++)
++ status[i] = 0;
++ status[scroll + choice] = 1;
++ for (i = 0; i < max_choice; i++)
++ print_item (list, items[scroll + i]->name,
++ status[scroll + i], i, i == choice);
++ }
++ }
++ wnoutrefresh (list);
++ wrefresh (dialog);
++
++ for (i = 0; i < item_no; i++) {
++ items[i]->selected = status[i];
++ }
++ } else {
++ for (i = 0; i < item_no; i++)
++ items[i]->selected = 0;
++ items[scroll + choice]->selected = 1;
++ }
++ delwin (dialog);
++ free (status);
++ return button;
++ case 'X':
++ case 'x':
++ key = ESC;
++ case ESC:
++ break;
++ }
++
++ /* Now, update everything... */
++ doupdate ();
++ }
++
++
++ delwin (dialog);
++ free (status);
++ return -1; /* ESC pressed */
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/colors.h b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/colors.h
+new file mode 100644
+index 0000000..d34dd37
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/colors.h
+@@ -0,0 +1,161 @@
++/*
++ * colors.h -- color attribute definitions
++ *
++ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++
++/*
++ * Default color definitions
++ *
++ * *_FG = foreground
++ * *_BG = background
++ * *_HL = highlight?
++ */
++#define SCREEN_FG COLOR_CYAN
++#define SCREEN_BG COLOR_BLUE
++#define SCREEN_HL TRUE
++
++#define SHADOW_FG COLOR_BLACK
++#define SHADOW_BG COLOR_BLACK
++#define SHADOW_HL TRUE
++
++#define DIALOG_FG COLOR_BLACK
++#define DIALOG_BG COLOR_WHITE
++#define DIALOG_HL FALSE
++
++#define TITLE_FG COLOR_YELLOW
++#define TITLE_BG COLOR_WHITE
++#define TITLE_HL TRUE
++
++#define BORDER_FG COLOR_WHITE
++#define BORDER_BG COLOR_WHITE
++#define BORDER_HL TRUE
++
++#define BUTTON_ACTIVE_FG COLOR_WHITE
++#define BUTTON_ACTIVE_BG COLOR_BLUE
++#define BUTTON_ACTIVE_HL TRUE
++
++#define BUTTON_INACTIVE_FG COLOR_BLACK
++#define BUTTON_INACTIVE_BG COLOR_WHITE
++#define BUTTON_INACTIVE_HL FALSE
++
++#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE
++#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE
++#define BUTTON_KEY_ACTIVE_HL TRUE
++
++#define BUTTON_KEY_INACTIVE_FG COLOR_RED
++#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE
++#define BUTTON_KEY_INACTIVE_HL FALSE
++
++#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW
++#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE
++#define BUTTON_LABEL_ACTIVE_HL TRUE
++
++#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK
++#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE
++#define BUTTON_LABEL_INACTIVE_HL TRUE
++
++#define INPUTBOX_FG COLOR_BLACK
++#define INPUTBOX_BG COLOR_WHITE
++#define INPUTBOX_HL FALSE
++
++#define INPUTBOX_BORDER_FG COLOR_BLACK
++#define INPUTBOX_BORDER_BG COLOR_WHITE
++#define INPUTBOX_BORDER_HL FALSE
++
++#define SEARCHBOX_FG COLOR_BLACK
++#define SEARCHBOX_BG COLOR_WHITE
++#define SEARCHBOX_HL FALSE
++
++#define SEARCHBOX_TITLE_FG COLOR_YELLOW
++#define SEARCHBOX_TITLE_BG COLOR_WHITE
++#define SEARCHBOX_TITLE_HL TRUE
++
++#define SEARCHBOX_BORDER_FG COLOR_WHITE
++#define SEARCHBOX_BORDER_BG COLOR_WHITE
++#define SEARCHBOX_BORDER_HL TRUE
++
++#define POSITION_INDICATOR_FG COLOR_YELLOW
++#define POSITION_INDICATOR_BG COLOR_WHITE
++#define POSITION_INDICATOR_HL TRUE
++
++#define MENUBOX_FG COLOR_BLACK
++#define MENUBOX_BG COLOR_WHITE
++#define MENUBOX_HL FALSE
++
++#define MENUBOX_BORDER_FG COLOR_WHITE
++#define MENUBOX_BORDER_BG COLOR_WHITE
++#define MENUBOX_BORDER_HL TRUE
++
++#define ITEM_FG COLOR_BLACK
++#define ITEM_BG COLOR_WHITE
++#define ITEM_HL FALSE
++
++#define ITEM_SELECTED_FG COLOR_WHITE
++#define ITEM_SELECTED_BG COLOR_BLUE
++#define ITEM_SELECTED_HL TRUE
++
++#define TAG_FG COLOR_YELLOW
++#define TAG_BG COLOR_WHITE
++#define TAG_HL TRUE
++
++#define TAG_SELECTED_FG COLOR_YELLOW
++#define TAG_SELECTED_BG COLOR_BLUE
++#define TAG_SELECTED_HL TRUE
++
++#define TAG_KEY_FG COLOR_YELLOW
++#define TAG_KEY_BG COLOR_WHITE
++#define TAG_KEY_HL TRUE
++
++#define TAG_KEY_SELECTED_FG COLOR_YELLOW
++#define TAG_KEY_SELECTED_BG COLOR_BLUE
++#define TAG_KEY_SELECTED_HL TRUE
++
++#define CHECK_FG COLOR_BLACK
++#define CHECK_BG COLOR_WHITE
++#define CHECK_HL FALSE
++
++#define CHECK_SELECTED_FG COLOR_WHITE
++#define CHECK_SELECTED_BG COLOR_BLUE
++#define CHECK_SELECTED_HL TRUE
++
++#define UARROW_FG COLOR_GREEN
++#define UARROW_BG COLOR_WHITE
++#define UARROW_HL TRUE
++
++#define DARROW_FG COLOR_GREEN
++#define DARROW_BG COLOR_WHITE
++#define DARROW_HL TRUE
++
++/* End of default color definitions */
++
++#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y)))
++#define COLOR_NAME_LEN 10
++#define COLOR_COUNT 8
++
++/*
++ * Global variables
++ */
++
++typedef struct {
++ char name[COLOR_NAME_LEN];
++ int value;
++} color_names_st;
++
++extern color_names_st color_names[];
++extern int color_table[][3];
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/dialog.h b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/dialog.h
+new file mode 100644
+index 0000000..7bab3ad
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/dialog.h
+@@ -0,0 +1,199 @@
++
++/*
++ * dialog.h -- common declarations for all dialog modules
++ *
++ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <sys/types.h>
++#include <fcntl.h>
++#include <unistd.h>
++#include <ctype.h>
++#include <stdlib.h>
++#include <string.h>
++
++#ifdef CURSES_LOC
++#ifdef __sun__
++#define CURS_MACROS
++#endif
++#include CURSES_LOC
++
++/*
++ * Colors in ncurses 1.9.9e do not work properly since foreground and
++ * background colors are OR'd rather than separately masked. This version
++ * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible
++ * with standard curses. The simplest fix (to make this work with standard
++ * curses) uses the wbkgdset() function, not used in the original hack.
++ * Turn it off if we're building with 1.9.9e, since it just confuses things.
++ */
++#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE)
++#define OLD_NCURSES 1
++#undef wbkgdset
++#define wbkgdset(w,p) /*nothing*/
++#else
++#define OLD_NCURSES 0
++#endif
++
++#define TR(params) _tracef params
++
++#define ESC 27
++#define TAB 9
++#define MAX_LEN 2048
++#define BUF_SIZE (10*1024)
++#define MIN(x,y) (x < y ? x : y)
++#define MAX(x,y) (x > y ? x : y)
++
++
++#ifndef ACS_ULCORNER
++#define ACS_ULCORNER '+'
++#endif
++#ifndef ACS_LLCORNER
++#define ACS_LLCORNER '+'
++#endif
++#ifndef ACS_URCORNER
++#define ACS_URCORNER '+'
++#endif
++#ifndef ACS_LRCORNER
++#define ACS_LRCORNER '+'
++#endif
++#ifndef ACS_HLINE
++#define ACS_HLINE '-'
++#endif
++#ifndef ACS_VLINE
++#define ACS_VLINE '|'
++#endif
++#ifndef ACS_LTEE
++#define ACS_LTEE '+'
++#endif
++#ifndef ACS_RTEE
++#define ACS_RTEE '+'
++#endif
++#ifndef ACS_UARROW
++#define ACS_UARROW '^'
++#endif
++#ifndef ACS_DARROW
++#define ACS_DARROW 'v'
++#endif
++
++/*
++ * Attribute names
++ */
++#define screen_attr attributes[0]
++#define shadow_attr attributes[1]
++#define dialog_attr attributes[2]
++#define title_attr attributes[3]
++#define border_attr attributes[4]
++#define button_active_attr attributes[5]
++#define button_inactive_attr attributes[6]
++#define button_key_active_attr attributes[7]
++#define button_key_inactive_attr attributes[8]
++#define button_label_active_attr attributes[9]
++#define button_label_inactive_attr attributes[10]
++#define inputbox_attr attributes[11]
++#define inputbox_border_attr attributes[12]
++#define searchbox_attr attributes[13]
++#define searchbox_title_attr attributes[14]
++#define searchbox_border_attr attributes[15]
++#define position_indicator_attr attributes[16]
++#define menubox_attr attributes[17]
++#define menubox_border_attr attributes[18]
++#define item_attr attributes[19]
++#define item_selected_attr attributes[20]
++#define tag_attr attributes[21]
++#define tag_selected_attr attributes[22]
++#define tag_key_attr attributes[23]
++#define tag_key_selected_attr attributes[24]
++#define check_attr attributes[25]
++#define check_selected_attr attributes[26]
++#define uarrow_attr attributes[27]
++#define darrow_attr attributes[28]
++
++/* number of attributes */
++#define ATTRIBUTE_COUNT 29
++
++/*
++ * Global variables
++ */
++extern bool use_colors;
++
++extern chtype attributes[];
++#endif
++
++extern const char *backtitle;
++
++struct dialog_list_item {
++ char *name;
++ int namelen;
++ char *tag;
++ int selected; /* Set to 1 by dialog_*() function. */
++};
++
++/*
++ * Function prototypes
++ */
++
++void init_dialog (void);
++void end_dialog (void);
++void dialog_clear (void);
++#ifdef CURSES_LOC
++void attr_clear (WINDOW * win, int height, int width, chtype attr);
++void color_setup (void);
++void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x);
++void print_button (WINDOW * win, const char *label, int y, int x, int selected);
++void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box,
++ chtype border);
++void draw_shadow (WINDOW * win, int y, int x, int height, int width);
++#endif
++
++int first_alpha (const char *string, const char *exempt);
++int dialog_yesno (const char *title, const char *prompt, int height, int width);
++int dialog_msgbox (const char *title, const char *prompt, int height,
++ int width, int pause);
++int dialog_textbox (const char *title, const char *file, int height, int width);
++int dialog_menu (const char *title, const char *prompt, int height, int width,
++ int menu_height, const char *choice, int item_no,
++ struct dialog_list_item ** items);
++int dialog_checklist (const char *title, const char *prompt, int height,
++ int width, int list_height, int item_no,
++ struct dialog_list_item ** items, int flag);
++extern unsigned char dialog_input_result[];
++int dialog_inputbox (const char *title, const char *prompt, int height,
++ int width, const char *init);
++
++struct dialog_list_item *first_sel_item(int item_no,
++ struct dialog_list_item ** items);
++
++/*
++ * This is the base for fictitious keys, which activate
++ * the buttons.
++ *
++ * Mouse-generated keys are the following:
++ * -- the first 32 are used as numbers, in addition to '0'-'9'
++ * -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o')
++ * -- uppercase chars are used to invoke the button (M_EVENT + 'O')
++ */
++#ifdef CURSES_LOC
++#define M_EVENT (KEY_MAX+1)
++#endif
++
++
++/*
++ * The `flag' parameter in checklist is used to select between
++ * radiolist and checklist
++ */
++#define FLAG_CHECK 1
++#define FLAG_RADIO 0
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/inputbox.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/inputbox.c
+new file mode 100644
+index 0000000..fa7bebc
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/inputbox.c
+@@ -0,0 +1,240 @@
++/*
++ * inputbox.c -- implements the input box
++ *
++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include "dialog.h"
++
++unsigned char dialog_input_result[MAX_LEN + 1];
++
++/*
++ * Print the termination buttons
++ */
++static void
++print_buttons(WINDOW *dialog, int height, int width, int selected)
++{
++ int x = width / 2 - 11;
++ int y = height - 2;
++
++ print_button (dialog, " Ok ", y, x, selected==0);
++ print_button (dialog, " Help ", y, x + 14, selected==1);
++
++ wmove(dialog, y, x+1+14*selected);
++ wrefresh(dialog);
++}
++
++/*
++ * Display a dialog box for inputing a string
++ */
++int
++dialog_inputbox (const char *title, const char *prompt, int height, int width,
++ const char *init)
++{
++ int i, x, y, box_y, box_x, box_width;
++ int input_x = 0, scroll = 0, key = 0, button = -1;
++ unsigned char *instr = dialog_input_result;
++ WINDOW *dialog;
++
++ /* center dialog box on screen */
++ x = (COLS - width) / 2;
++ y = (LINES - height) / 2;
++
++
++ draw_shadow (stdscr, y, x, height, width);
++
++ dialog = newwin (height, width, y, x);
++ keypad (dialog, TRUE);
++
++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
++ wattrset (dialog, border_attr);
++ mvwaddch (dialog, height-3, 0, ACS_LTEE);
++ for (i = 0; i < width - 2; i++)
++ waddch (dialog, ACS_HLINE);
++ wattrset (dialog, dialog_attr);
++ waddch (dialog, ACS_RTEE);
++
++ if (title != NULL && strlen(title) >= width-2 ) {
++ /* truncate long title -- mec */
++ char * title2 = malloc(width-2+1);
++ memcpy( title2, title, width-2 );
++ title2[width-2] = '\0';
++ title = title2;
++ }
++
++ if (title != NULL) {
++ wattrset (dialog, title_attr);
++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
++ waddstr (dialog, (char *)title);
++ waddch (dialog, ' ');
++ }
++
++ wattrset (dialog, dialog_attr);
++ print_autowrap (dialog, prompt, width - 2, 1, 3);
++
++ /* Draw the input field box */
++ box_width = width - 6;
++ getyx (dialog, y, x);
++ box_y = y + 2;
++ box_x = (width - box_width) / 2;
++ draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2,
++ border_attr, dialog_attr);
++
++ print_buttons(dialog, height, width, 0);
++
++ /* Set up the initial value */
++ wmove (dialog, box_y, box_x);
++ wattrset (dialog, inputbox_attr);
++
++ if (!init)
++ instr[0] = '\0';
++ else
++ strcpy (instr, init);
++
++ input_x = strlen (instr);
++
++ if (input_x >= box_width) {
++ scroll = input_x - box_width + 1;
++ input_x = box_width - 1;
++ for (i = 0; i < box_width - 1; i++)
++ waddch (dialog, instr[scroll + i]);
++ } else
++ waddstr (dialog, instr);
++
++ wmove (dialog, box_y, box_x + input_x);
++
++ wrefresh (dialog);
++
++ while (key != ESC) {
++ key = wgetch (dialog);
++
++ if (button == -1) { /* Input box selected */
++ switch (key) {
++ case TAB:
++ case KEY_UP:
++ case KEY_DOWN:
++ break;
++ case KEY_LEFT:
++ continue;
++ case KEY_RIGHT:
++ continue;
++ case KEY_BACKSPACE:
++ case 127:
++ if (input_x || scroll) {
++ wattrset (dialog, inputbox_attr);
++ if (!input_x) {
++ scroll = scroll < box_width - 1 ?
++ 0 : scroll - (box_width - 1);
++ wmove (dialog, box_y, box_x);
++ for (i = 0; i < box_width; i++)
++ waddch (dialog, instr[scroll + input_x + i] ?
++ instr[scroll + input_x + i] : ' ');
++ input_x = strlen (instr) - scroll;
++ } else
++ input_x--;
++ instr[scroll + input_x] = '\0';
++ mvwaddch (dialog, box_y, input_x + box_x, ' ');
++ wmove (dialog, box_y, input_x + box_x);
++ wrefresh (dialog);
++ }
++ continue;
++ default:
++ if (key < 0x100 && isprint (key)) {
++ if (scroll + input_x < MAX_LEN) {
++ wattrset (dialog, inputbox_attr);
++ instr[scroll + input_x] = key;
++ instr[scroll + input_x + 1] = '\0';
++ if (input_x == box_width - 1) {
++ scroll++;
++ wmove (dialog, box_y, box_x);
++ for (i = 0; i < box_width - 1; i++)
++ waddch (dialog, instr[scroll + i]);
++ } else {
++ wmove (dialog, box_y, input_x++ + box_x);
++ waddch (dialog, key);
++ }
++ wrefresh (dialog);
++ } else
++ flash (); /* Alarm user about overflow */
++ continue;
++ }
++ }
++ }
++ switch (key) {
++ case 'O':
++ case 'o':
++ delwin (dialog);
++ return 0;
++ case 'H':
++ case 'h':
++ delwin (dialog);
++ return 1;
++ case KEY_UP:
++ case KEY_LEFT:
++ switch (button) {
++ case -1:
++ button = 1; /* Indicates "Cancel" button is selected */
++ print_buttons(dialog, height, width, 1);
++ break;
++ case 0:
++ button = -1; /* Indicates input box is selected */
++ print_buttons(dialog, height, width, 0);
++ wmove (dialog, box_y, box_x + input_x);
++ wrefresh (dialog);
++ break;
++ case 1:
++ button = 0; /* Indicates "OK" button is selected */
++ print_buttons(dialog, height, width, 0);
++ break;
++ }
++ break;
++ case TAB:
++ case KEY_DOWN:
++ case KEY_RIGHT:
++ switch (button) {
++ case -1:
++ button = 0; /* Indicates "OK" button is selected */
++ print_buttons(dialog, height, width, 0);
++ break;
++ case 0:
++ button = 1; /* Indicates "Cancel" button is selected */
++ print_buttons(dialog, height, width, 1);
++ break;
++ case 1:
++ button = -1; /* Indicates input box is selected */
++ print_buttons(dialog, height, width, 0);
++ wmove (dialog, box_y, box_x + input_x);
++ wrefresh (dialog);
++ break;
++ }
++ break;
++ case ' ':
++ case '\n':
++ delwin (dialog);
++ return (button == -1 ? 0 : button);
++ case 'X':
++ case 'x':
++ key = ESC;
++ case ESC:
++ break;
++ }
++ }
++
++ delwin (dialog);
++ return -1; /* ESC pressed */
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/menubox.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/menubox.c
+new file mode 100644
+index 0000000..873dc58
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/menubox.c
+@@ -0,0 +1,438 @@
++/*
++ * menubox.c -- implements the menu box
++ *
++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++/*
++ * Changes by Clifford Wolf (god@clifford.at)
++ *
++ * [ 1998-06-13 ]
++ *
++ * *) A bugfix for the Page-Down problem
++ *
++ * *) Formerly when I used Page Down and Page Up, the cursor would be set
++ * to the first position in the menu box. Now lxdialog is a bit
++ * smarter and works more like other menu systems (just have a look at
++ * it).
++ *
++ * *) Formerly if I selected something my scrolling would be broken because
++ * lxdialog is re-invoked by the Menuconfig shell script, can't
++ * remember the last scrolling position, and just sets it so that the
++ * cursor is at the bottom of the box. Now it writes the temporary file
++ * lxdialog.scrltmp which contains this information. The file is
++ * deleted by lxdialog if the user leaves a submenu or enters a new
++ * one, but it would be nice if Menuconfig could make another "rm -f"
++ * just to be sure. Just try it out - you will recognise a difference!
++ *
++ * [ 1998-06-14 ]
++ *
++ * *) Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files
++ * and menus change their size on the fly.
++ *
++ * *) If for some reason the last scrolling position is not saved by
++ * lxdialog, it sets the scrolling so that the selected item is in the
++ * middle of the menu box, not at the bottom.
++ *
++ * 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
++ * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus.
++ * This fixes a bug in Menuconfig where using ' ' to descend into menus
++ * would leave mis-synchronized lxdialog.scrltmp files lying around,
++ * fscanf would read in 'scroll', and eventually that value would get used.
++ */
++
++#include "dialog.h"
++
++static int menu_width, item_x;
++
++/*
++ * Print menu item
++ */
++static void
++print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey)
++{
++ int j;
++ char menu_item[menu_width+1];
++
++ strncpy(menu_item, item, menu_width);
++ menu_item[menu_width] = 0;
++ j = first_alpha(menu_item, "YyNnMmHh");
++
++ /* Clear 'residue' of last item */
++ wattrset (win, menubox_attr);
++ wmove (win, choice, 0);
++#if OLD_NCURSES
++ {
++ int i;
++ for (i = 0; i < menu_width; i++)
++ waddch (win, ' ');
++ }
++#else
++ wclrtoeol(win);
++#endif
++ wattrset (win, selected ? item_selected_attr : item_attr);
++ mvwaddstr (win, choice, item_x, menu_item);
++ if (hotkey) {
++ wattrset (win, selected ? tag_key_selected_attr : tag_key_attr);
++ mvwaddch(win, choice, item_x+j, menu_item[j]);
++ }
++ if (selected) {
++ wmove (win, choice, item_x+1);
++ wrefresh (win);
++ }
++}
++
++/*
++ * Print the scroll indicators.
++ */
++static void
++print_arrows (WINDOW * win, int item_no, int scroll,
++ int y, int x, int height)
++{
++ int cur_y, cur_x;
++
++ getyx(win, cur_y, cur_x);
++
++ wmove(win, y, x);
++
++ if (scroll > 0) {
++ wattrset (win, uarrow_attr);
++ waddch (win, ACS_UARROW);
++ waddstr (win, "(-)");
++ }
++ else {
++ wattrset (win, menubox_attr);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ }
++
++ y = y + height + 1;
++ wmove(win, y, x);
++
++ if ((height < item_no) && (scroll + height < item_no)) {
++ wattrset (win, darrow_attr);
++ waddch (win, ACS_DARROW);
++ waddstr (win, "(+)");
++ }
++ else {
++ wattrset (win, menubox_border_attr);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ waddch (win, ACS_HLINE);
++ }
++
++ wmove(win, cur_y, cur_x);
++}
++
++/*
++ * Display the termination buttons.
++ */
++static void
++print_buttons (WINDOW *win, int height, int width, int selected)
++{
++ int x = width / 2 - 16;
++ int y = height - 2;
++
++ print_button (win, "Select", y, x, selected == 0);
++ print_button (win, " Exit ", y, x + 12, selected == 1);
++ print_button (win, " Help ", y, x + 24, selected == 2);
++
++ wmove(win, y, x+1+12*selected);
++ wrefresh (win);
++}
++
++/*
++ * Display a menu for choosing among a number of options
++ */
++int
++dialog_menu (const char *title, const char *prompt, int height, int width,
++ int menu_height, const char *current, int item_no,
++ struct dialog_list_item ** items)
++{
++ int i, j, x, y, box_x, box_y;
++ int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, max_choice;
++ WINDOW *dialog, *menu;
++ FILE *f;
++
++ max_choice = MIN (menu_height, item_no);
++
++ /* center dialog box on screen */
++ x = (COLS - width) / 2;
++ y = (LINES - height) / 2;
++
++ draw_shadow (stdscr, y, x, height, width);
++
++ dialog = newwin (height, width, y, x);
++ keypad (dialog, TRUE);
++
++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
++ wattrset (dialog, border_attr);
++ mvwaddch (dialog, height - 3, 0, ACS_LTEE);
++ for (i = 0; i < width - 2; i++)
++ waddch (dialog, ACS_HLINE);
++ wattrset (dialog, dialog_attr);
++ wbkgdset (dialog, dialog_attr & A_COLOR);
++ waddch (dialog, ACS_RTEE);
++
++ if (title != NULL && strlen(title) >= width-2 ) {
++ /* truncate long title -- mec */
++ char * title2 = malloc(width-2+1);
++ memcpy( title2, title, width-2 );
++ title2[width-2] = '\0';
++ title = title2;
++ }
++
++ if (title != NULL) {
++ wattrset (dialog, title_attr);
++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
++ waddstr (dialog, (char *)title);
++ waddch (dialog, ' ');
++ }
++
++ wattrset (dialog, dialog_attr);
++ print_autowrap (dialog, prompt, width - 2, 1, 3);
++
++ menu_width = width - 6;
++ box_y = height - menu_height - 5;
++ box_x = (width - menu_width) / 2 - 1;
++
++ /* create new window for the menu */
++ menu = subwin (dialog, menu_height, menu_width,
++ y + box_y + 1, x + box_x + 1);
++ keypad (menu, TRUE);
++
++ /* draw a box around the menu items */
++ draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2,
++ menubox_border_attr, menubox_attr);
++
++ /*
++ * Find length of longest item in order to center menu.
++ * Set 'choice' to default item.
++ */
++ item_x = 0;
++ for (i = 0; i < item_no; i++) {
++ item_x = MAX (item_x, MIN(menu_width, strlen (items[i]->name) + 2));
++ if (strcmp(current, items[i]->tag) == 0) choice = i;
++ }
++
++ item_x = (menu_width - item_x) / 2;
++
++ /* get the scroll info from the temp file */
++ if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) {
++ if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) &&
++ (scroll+max_choice > choice) && (scroll >= 0) &&
++ (scroll+max_choice <= item_no) ) {
++ first_item = scroll;
++ choice = choice - scroll;
++ fclose(f);
++ } else {
++ scroll=0;
++ remove("lxdialog.scrltmp");
++ fclose(f);
++ f=NULL;
++ }
++ }
++ if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) {
++ if (choice >= item_no-max_choice/2)
++ scroll = first_item = item_no-max_choice;
++ else
++ scroll = first_item = choice - max_choice/2;
++ choice = choice - scroll;
++ }
++
++ /* Print the menu */
++ for (i=0; i < max_choice; i++) {
++ print_item (menu, items[first_item + i]->name, i, i == choice,
++ (items[first_item + i]->tag[0] != ':'));
++ }
++
++ wnoutrefresh (menu);
++
++ print_arrows(dialog, item_no, scroll,
++ box_y, box_x+item_x+1, menu_height);
++
++ print_buttons (dialog, height, width, 0);
++ wmove (menu, choice, item_x+1);
++ wrefresh (menu);
++
++ while (key != ESC) {
++ key = wgetch(menu);
++
++ if (key < 256 && isalpha(key)) key = tolower(key);
++
++ if (strchr("ynmh", key))
++ i = max_choice;
++ else {
++ for (i = choice+1; i < max_choice; i++) {
++ j = first_alpha(items[scroll + i]->name, "YyNnMmHh");
++ if (key == tolower(items[scroll + i]->name[j]))
++ break;
++ }
++ if (i == max_choice)
++ for (i = 0; i < max_choice; i++) {
++ j = first_alpha(items[scroll + i]->name, "YyNnMmHh");
++ if (key == tolower(items[scroll + i]->name[j]))
++ break;
++ }
++ }
++
++ if (i < max_choice ||
++ key == KEY_UP || key == KEY_DOWN ||
++ key == '-' || key == '+' ||
++ key == KEY_PPAGE || key == KEY_NPAGE) {
++
++ print_item (menu, items[scroll + choice]->name, choice, FALSE,
++ (items[scroll + choice]->tag[0] != ':'));
++
++ if (key == KEY_UP || key == '-') {
++ if (choice < 2 && scroll) {
++ /* Scroll menu down */
++ scrollok (menu, TRUE);
++ wscrl (menu, -1);
++ scrollok (menu, FALSE);
++
++ scroll--;
++
++ print_item (menu, items[scroll]->name, 0, FALSE,
++ (items[scroll]->tag[0] != ':'));
++ } else
++ choice = MAX(choice - 1, 0);
++
++ } else if (key == KEY_DOWN || key == '+') {
++
++ print_item (menu, items[scroll + choice]->name, choice, FALSE,
++ (items[scroll + choice]->tag[0] != ':'));
++
++ if ((choice > max_choice-3) &&
++ (scroll + max_choice < item_no)
++ ) {
++ /* Scroll menu up */
++ scrollok (menu, TRUE);
++ scroll (menu);
++ scrollok (menu, FALSE);
++
++ scroll++;
++
++ print_item (menu, items[scroll + max_choice - 1]->name,
++ max_choice-1, FALSE,
++ (items[scroll + max_choice - 1]->tag[0] != ':'));
++ } else
++ choice = MIN(choice+1, max_choice-1);
++
++ } else if (key == KEY_PPAGE) {
++ scrollok (menu, TRUE);
++ for (i=0; (i < max_choice); i++) {
++ if (scroll > 0) {
++ wscrl (menu, -1);
++ scroll--;
++ print_item (menu, items[scroll]->name, 0, FALSE,
++ (items[scroll]->tag[0] != ':'));
++ } else {
++ if (choice > 0)
++ choice--;
++ }
++ }
++ scrollok (menu, FALSE);
++
++ } else if (key == KEY_NPAGE) {
++ for (i=0; (i < max_choice); i++) {
++ if (scroll+max_choice < item_no) {
++ scrollok (menu, TRUE);
++ scroll(menu);
++ scrollok (menu, FALSE);
++ scroll++;
++ print_item (menu, items[scroll + max_choice - 1]->name,
++ max_choice-1, FALSE,
++ (items[scroll + max_choice - 1]->tag[0] != ':'));
++ } else {
++ if (choice+1 < max_choice)
++ choice++;
++ }
++ }
++
++ } else
++ choice = i;
++
++ print_item (menu, items[scroll + choice]->name, choice, TRUE,
++ (items[scroll + choice]->tag[0] != ':'));
++
++ print_arrows(dialog, item_no, scroll,
++ box_y, box_x+item_x+1, menu_height);
++
++ wnoutrefresh (dialog);
++ wrefresh (menu);
++
++ continue; /* wait for another key press */
++ }
++
++ switch (key) {
++ case KEY_LEFT:
++ case TAB:
++ case KEY_RIGHT:
++ button = ((key == KEY_LEFT ? --button : ++button) < 0)
++ ? 2 : (button > 2 ? 0 : button);
++
++ print_buttons(dialog, height, width, button);
++ wrefresh (menu);
++ break;
++ case ' ':
++ case 's':
++ case 'y':
++ case 'n':
++ case 'm':
++ case '/':
++ /* save scroll info */
++ if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) {
++ fprintf(f,"%d\n",scroll);
++ fclose(f);
++ }
++ delwin (dialog);
++ items[scroll + choice]->selected = 1;
++ switch (key) {
++ case 's': return 3;
++ case 'y': return 3;
++ case 'n': return 4;
++ case 'm': return 5;
++ case ' ': return 6;
++ case '/': return 7;
++ }
++ return 0;
++ case 'h':
++ case '?':
++ button = 2;
++ case '\n':
++ delwin (dialog);
++ items[scroll + choice]->selected = 1;
++
++ remove("lxdialog.scrltmp");
++ return button;
++ case 'e':
++ case 'x':
++ key = ESC;
++ case ESC:
++ break;
++ }
++ }
++
++ delwin (dialog);
++ remove("lxdialog.scrltmp");
++ return -1; /* ESC pressed */
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/msgbox.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/msgbox.c
+new file mode 100644
+index 0000000..93692e1
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/msgbox.c
+@@ -0,0 +1,85 @@
++/*
++ * msgbox.c -- implements the message box and info box
++ *
++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include "dialog.h"
++
++/*
++ * Display a message box. Program will pause and display an "OK" button
++ * if the parameter 'pause' is non-zero.
++ */
++int
++dialog_msgbox (const char *title, const char *prompt, int height, int width,
++ int pause)
++{
++ int i, x, y, key = 0;
++ WINDOW *dialog;
++
++ /* center dialog box on screen */
++ x = (COLS - width) / 2;
++ y = (LINES - height) / 2;
++
++ draw_shadow (stdscr, y, x, height, width);
++
++ dialog = newwin (height, width, y, x);
++ keypad (dialog, TRUE);
++
++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
++
++ if (title != NULL && strlen(title) >= width-2 ) {
++ /* truncate long title -- mec */
++ char * title2 = malloc(width-2+1);
++ memcpy( title2, title, width-2 );
++ title2[width-2] = '\0';
++ title = title2;
++ }
++
++ if (title != NULL) {
++ wattrset (dialog, title_attr);
++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
++ waddstr (dialog, (char *)title);
++ waddch (dialog, ' ');
++ }
++ wattrset (dialog, dialog_attr);
++ print_autowrap (dialog, prompt, width - 2, 1, 2);
++
++ if (pause) {
++ wattrset (dialog, border_attr);
++ mvwaddch (dialog, height - 3, 0, ACS_LTEE);
++ for (i = 0; i < width - 2; i++)
++ waddch (dialog, ACS_HLINE);
++ wattrset (dialog, dialog_attr);
++ waddch (dialog, ACS_RTEE);
++
++ print_button (dialog, " Ok ",
++ height - 2, width / 2 - 4, TRUE);
++
++ wrefresh (dialog);
++ while (key != ESC && key != '\n' && key != ' ' &&
++ key != 'O' && key != 'o' && key != 'X' && key != 'x')
++ key = wgetch (dialog);
++ } else {
++ key = '\n';
++ wrefresh (dialog);
++ }
++
++ delwin (dialog);
++ return key == ESC ? -1 : 0;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/textbox.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/textbox.c
+new file mode 100644
+index 0000000..a5a460b
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/textbox.c
+@@ -0,0 +1,556 @@
++/*
++ * textbox.c -- implements the text box
++ *
++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include "dialog.h"
++
++static void back_lines (int n);
++static void print_page (WINDOW * win, int height, int width);
++static void print_line (WINDOW * win, int row, int width);
++static char *get_line (void);
++static void print_position (WINDOW * win, int height, int width);
++
++static int hscroll, fd, file_size, bytes_read;
++static int begin_reached = 1, end_reached, page_length;
++static char *buf, *page;
++
++/*
++ * Display text from a file in a dialog box.
++ */
++int
++dialog_textbox (const char *title, const char *file, int height, int width)
++{
++ int i, x, y, cur_x, cur_y, fpos, key = 0;
++ int passed_end;
++ char search_term[MAX_LEN + 1];
++ WINDOW *dialog, *text;
++
++ search_term[0] = '\0'; /* no search term entered yet */
++
++ /* Open input file for reading */
++ if ((fd = open (file, O_RDONLY)) == -1) {
++ endwin ();
++ fprintf (stderr,
++ "\nCan't open input file in dialog_textbox().\n");
++ exit (-1);
++ }
++ /* Get file size. Actually, 'file_size' is the real file size - 1,
++ since it's only the last byte offset from the beginning */
++ if ((file_size = lseek (fd, 0, SEEK_END)) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError getting file size in dialog_textbox().\n");
++ exit (-1);
++ }
++ /* Restore file pointer to beginning of file after getting file size */
++ if (lseek (fd, 0, SEEK_SET) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError moving file pointer in dialog_textbox().\n");
++ exit (-1);
++ }
++ /* Allocate space for read buffer */
++ if ((buf = malloc (BUF_SIZE + 1)) == NULL) {
++ endwin ();
++ fprintf (stderr, "\nCan't allocate memory in dialog_textbox().\n");
++ exit (-1);
++ }
++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError reading file in dialog_textbox().\n");
++ exit (-1);
++ }
++ buf[bytes_read] = '\0'; /* mark end of valid data */
++ page = buf; /* page is pointer to start of page to be displayed */
++
++ /* center dialog box on screen */
++ x = (COLS - width) / 2;
++ y = (LINES - height) / 2;
++
++
++ draw_shadow (stdscr, y, x, height, width);
++
++ dialog = newwin (height, width, y, x);
++ keypad (dialog, TRUE);
++
++ /* Create window for text region, used for scrolling text */
++ text = subwin (dialog, height - 4, width - 2, y + 1, x + 1);
++ wattrset (text, dialog_attr);
++ wbkgdset (text, dialog_attr & A_COLOR);
++
++ keypad (text, TRUE);
++
++ /* register the new window, along with its borders */
++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
++
++ wattrset (dialog, border_attr);
++ mvwaddch (dialog, height-3, 0, ACS_LTEE);
++ for (i = 0; i < width - 2; i++)
++ waddch (dialog, ACS_HLINE);
++ wattrset (dialog, dialog_attr);
++ wbkgdset (dialog, dialog_attr & A_COLOR);
++ waddch (dialog, ACS_RTEE);
++
++ if (title != NULL && strlen(title) >= width-2 ) {
++ /* truncate long title -- mec */
++ char * title2 = malloc(width-2+1);
++ memcpy( title2, title, width-2 );
++ title2[width-2] = '\0';
++ title = title2;
++ }
++
++ if (title != NULL) {
++ wattrset (dialog, title_attr);
++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
++ waddstr (dialog, (char *)title);
++ waddch (dialog, ' ');
++ }
++ print_button (dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
++ wnoutrefresh (dialog);
++ getyx (dialog, cur_y, cur_x); /* Save cursor position */
++
++ /* Print first page of text */
++ attr_clear (text, height - 4, width - 2, dialog_attr);
++ print_page (text, height - 4, width - 2);
++ print_position (dialog, height, width);
++ wmove (dialog, cur_y, cur_x); /* Restore cursor position */
++ wrefresh (dialog);
++
++ while ((key != ESC) && (key != '\n')) {
++ key = wgetch (dialog);
++ switch (key) {
++ case 'E': /* Exit */
++ case 'e':
++ case 'X':
++ case 'x':
++ delwin (dialog);
++ free (buf);
++ close (fd);
++ return 0;
++ case 'g': /* First page */
++ case KEY_HOME:
++ if (!begin_reached) {
++ begin_reached = 1;
++ /* First page not in buffer? */
++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
++ endwin ();
++ fprintf (stderr,
++ "\nError moving file pointer in dialog_textbox().\n");
++ exit (-1);
++ }
++ if (fpos > bytes_read) { /* Yes, we have to read it in */
++ if (lseek (fd, 0, SEEK_SET) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError moving file pointer in "
++ "dialog_textbox().\n");
++ exit (-1);
++ }
++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
++ endwin ();
++ fprintf (stderr,
++ "\nError reading file in dialog_textbox().\n");
++ exit (-1);
++ }
++ buf[bytes_read] = '\0';
++ }
++ page = buf;
++ print_page (text, height - 4, width - 2);
++ print_position (dialog, height, width);
++ wmove (dialog, cur_y, cur_x); /* Restore cursor position */
++ wrefresh (dialog);
++ }
++ break;
++ case 'G': /* Last page */
++ case KEY_END:
++
++ end_reached = 1;
++ /* Last page not in buffer? */
++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
++ endwin ();
++ fprintf (stderr,
++ "\nError moving file pointer in dialog_textbox().\n");
++ exit (-1);
++ }
++ if (fpos < file_size) { /* Yes, we have to read it in */
++ if (lseek (fd, -BUF_SIZE, SEEK_END) == -1) {
++ endwin ();
++ fprintf (stderr,
++ "\nError moving file pointer in dialog_textbox().\n");
++ exit (-1);
++ }
++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
++ endwin ();
++ fprintf (stderr,
++ "\nError reading file in dialog_textbox().\n");
++ exit (-1);
++ }
++ buf[bytes_read] = '\0';
++ }
++ page = buf + bytes_read;
++ back_lines (height - 4);
++ print_page (text, height - 4, width - 2);
++ print_position (dialog, height, width);
++ wmove (dialog, cur_y, cur_x); /* Restore cursor position */
++ wrefresh (dialog);
++ break;
++ case 'K': /* Previous line */
++ case 'k':
++ case KEY_UP:
++ if (!begin_reached) {
++ back_lines (page_length + 1);
++
++ /* We don't call print_page() here but use scrolling to ensure
++ faster screen update. However, 'end_reached' and
++ 'page_length' should still be updated, and 'page' should
++ point to start of next page. This is done by calling
++ get_line() in the following 'for' loop. */
++ scrollok (text, TRUE);
++ wscrl (text, -1); /* Scroll text region down one line */
++ scrollok (text, FALSE);
++ page_length = 0;
++ passed_end = 0;
++ for (i = 0; i < height - 4; i++) {
++ if (!i) {
++ /* print first line of page */
++ print_line (text, 0, width - 2);
++ wnoutrefresh (text);
++ } else
++ /* Called to update 'end_reached' and 'page' */
++ get_line ();
++ if (!passed_end)
++ page_length++;
++ if (end_reached && !passed_end)
++ passed_end = 1;
++ }
++
++ print_position (dialog, height, width);
++ wmove (dialog, cur_y, cur_x); /* Restore cursor position */
++ wrefresh (dialog);
++ }
++ break;
++ case 'B': /* Previous page */
++ case 'b':
++ case KEY_PPAGE:
++ if (begin_reached)
++ break;
++ back_lines (page_length + height - 4);
++ print_page (text, height - 4, width - 2);
++ print_position (dialog, height, width);
++ wmove (dialog, cur_y, cur_x);
++ wrefresh (dialog);
++ break;
++ case 'J': /* Next line */
++ case 'j':
++ case KEY_DOWN:
++ if (!end_reached) {
++ begin_reached = 0;
++ scrollok (text, TRUE);
++ scroll (text); /* Scroll text region up one line */
++ scrollok (text, FALSE);
++ print_line (text, height - 5, width - 2);
++ wnoutrefresh (text);
++ print_position (dialog, height, width);
++ wmove (dialog, cur_y, cur_x); /* Restore cursor position */
++ wrefresh (dialog);
++ }
++ break;
++ case KEY_NPAGE: /* Next page */
++ case ' ':
++ if (end_reached)
++ break;
++
++ begin_reached = 0;
++ print_page (text, height - 4, width - 2);
++ print_position (dialog, height, width);
++ wmove (dialog, cur_y, cur_x);
++ wrefresh (dialog);
++ break;
++ case '0': /* Beginning of line */
++ case 'H': /* Scroll left */
++ case 'h':
++ case KEY_LEFT:
++ if (hscroll <= 0)
++ break;
++
++ if (key == '0')
++ hscroll = 0;
++ else
++ hscroll--;
++ /* Reprint current page to scroll horizontally */
++ back_lines (page_length);
++ print_page (text, height - 4, width - 2);
++ wmove (dialog, cur_y, cur_x);
++ wrefresh (dialog);
++ break;
++ case 'L': /* Scroll right */
++ case 'l':
++ case KEY_RIGHT:
++ if (hscroll >= MAX_LEN)
++ break;
++ hscroll++;
++ /* Reprint current page to scroll horizontally */
++ back_lines (page_length);
++ print_page (text, height - 4, width - 2);
++ wmove (dialog, cur_y, cur_x);
++ wrefresh (dialog);
++ break;
++ case ESC:
++ break;
++ }
++ }
++
++ delwin (dialog);
++ free (buf);
++ close (fd);
++ return 1; /* ESC pressed */
++}
++
++/*
++ * Go back 'n' lines in text file. Called by dialog_textbox().
++ * 'page' will be updated to point to the desired line in 'buf'.
++ */
++static void
++back_lines (int n)
++{
++ int i, fpos;
++
++ begin_reached = 0;
++ /* We have to distinguish between end_reached and !end_reached
++ since at end of file, the line is not ended by a '\n'.
++ The code inside 'if' basically does a '--page' to move one
++ character backward so as to skip '\n' of the previous line */
++ if (!end_reached) {
++ /* Either beginning of buffer or beginning of file reached? */
++ if (page == buf) {
++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError moving file pointer in "
++ "back_lines().\n");
++ exit (-1);
++ }
++ if (fpos > bytes_read) { /* Not beginning of file yet */
++ /* We've reached beginning of buffer, but not beginning of
++ file yet, so read previous part of file into buffer.
++ Note that we only move backward for BUF_SIZE/2 bytes,
++ but not BUF_SIZE bytes to avoid re-reading again in
++ print_page() later */
++ /* Really possible to move backward BUF_SIZE/2 bytes? */
++ if (fpos < BUF_SIZE / 2 + bytes_read) {
++ /* No, move less then */
++ if (lseek (fd, 0, SEEK_SET) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError moving file pointer in "
++ "back_lines().\n");
++ exit (-1);
++ }
++ page = buf + fpos - bytes_read;
++ } else { /* Move backward BUF_SIZE/2 bytes */
++ if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR)
++ == -1) {
++ endwin ();
++ fprintf (stderr, "\nError moving file pointer "
++ "in back_lines().\n");
++ exit (-1);
++ }
++ page = buf + BUF_SIZE / 2;
++ }
++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError reading file in back_lines().\n");
++ exit (-1);
++ }
++ buf[bytes_read] = '\0';
++ } else { /* Beginning of file reached */
++ begin_reached = 1;
++ return;
++ }
++ }
++ if (*(--page) != '\n') { /* '--page' here */
++ /* Something's wrong... */
++ endwin ();
++ fprintf (stderr, "\nInternal error in back_lines().\n");
++ exit (-1);
++ }
++ }
++ /* Go back 'n' lines */
++ for (i = 0; i < n; i++)
++ do {
++ if (page == buf) {
++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
++ endwin ();
++ fprintf (stderr,
++ "\nError moving file pointer in back_lines().\n");
++ exit (-1);
++ }
++ if (fpos > bytes_read) {
++ /* Really possible to move backward BUF_SIZE/2 bytes? */
++ if (fpos < BUF_SIZE / 2 + bytes_read) {
++ /* No, move less then */
++ if (lseek (fd, 0, SEEK_SET) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError moving file pointer "
++ "in back_lines().\n");
++ exit (-1);
++ }
++ page = buf + fpos - bytes_read;
++ } else { /* Move backward BUF_SIZE/2 bytes */
++ if (lseek (fd, -(BUF_SIZE / 2 + bytes_read),
++ SEEK_CUR) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError moving file pointer"
++ " in back_lines().\n");
++ exit (-1);
++ }
++ page = buf + BUF_SIZE / 2;
++ }
++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError reading file in "
++ "back_lines().\n");
++ exit (-1);
++ }
++ buf[bytes_read] = '\0';
++ } else { /* Beginning of file reached */
++ begin_reached = 1;
++ return;
++ }
++ }
++ } while (*(--page) != '\n');
++ page++;
++}
++
++/*
++ * Print a new page of text. Called by dialog_textbox().
++ */
++static void
++print_page (WINDOW * win, int height, int width)
++{
++ int i, passed_end = 0;
++
++ page_length = 0;
++ for (i = 0; i < height; i++) {
++ print_line (win, i, width);
++ if (!passed_end)
++ page_length++;
++ if (end_reached && !passed_end)
++ passed_end = 1;
++ }
++ wnoutrefresh (win);
++}
++
++/*
++ * Print a new line of text. Called by dialog_textbox() and print_page().
++ */
++static void
++print_line (WINDOW * win, int row, int width)
++{
++ int y, x;
++ char *line;
++
++ line = get_line ();
++ line += MIN (strlen (line), hscroll); /* Scroll horizontally */
++ wmove (win, row, 0); /* move cursor to correct line */
++ waddch (win, ' ');
++ waddnstr (win, line, MIN (strlen (line), width - 2));
++
++ getyx (win, y, x);
++ /* Clear 'residue' of previous line */
++#if OLD_NCURSES
++ {
++ int i;
++ for (i = 0; i < width - x; i++)
++ waddch (win, ' ');
++ }
++#else
++ wclrtoeol(win);
++#endif
++}
++
++/*
++ * Return current line of text. Called by dialog_textbox() and print_line().
++ * 'page' should point to start of current line before calling, and will be
++ * updated to point to start of next line.
++ */
++static char *
++get_line (void)
++{
++ int i = 0, fpos;
++ static char line[MAX_LEN + 1];
++
++ end_reached = 0;
++ while (*page != '\n') {
++ if (*page == '\0') {
++ /* Either end of file or end of buffer reached */
++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError moving file pointer in "
++ "get_line().\n");
++ exit (-1);
++ }
++ if (fpos < file_size) { /* Not end of file yet */
++ /* We've reached end of buffer, but not end of file yet,
++ so read next part of file into buffer */
++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError reading file in get_line().\n");
++ exit (-1);
++ }
++ buf[bytes_read] = '\0';
++ page = buf;
++ } else {
++ if (!end_reached)
++ end_reached = 1;
++ break;
++ }
++ } else if (i < MAX_LEN)
++ line[i++] = *(page++);
++ else {
++ /* Truncate lines longer than MAX_LEN characters */
++ if (i == MAX_LEN)
++ line[i++] = '\0';
++ page++;
++ }
++ }
++ if (i <= MAX_LEN)
++ line[i] = '\0';
++ if (!end_reached)
++ page++; /* move pass '\n' */
++
++ return line;
++}
++
++/*
++ * Print current position
++ */
++static void
++print_position (WINDOW * win, int height, int width)
++{
++ int fpos, percent;
++
++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
++ endwin ();
++ fprintf (stderr, "\nError moving file pointer in print_position().\n");
++ exit (-1);
++ }
++ wattrset (win, position_indicator_attr);
++ wbkgdset (win, position_indicator_attr & A_COLOR);
++ percent = !file_size ?
++ 100 : ((fpos - bytes_read + page - buf) * 100) / file_size;
++ wmove (win, height - 3, width - 9);
++ wprintw (win, "(%3d%%)", percent);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/util.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/util.c
+new file mode 100644
+index 0000000..6f83951
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/util.c
+@@ -0,0 +1,375 @@
++/*
++ * util.c
++ *
++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include "dialog.h"
++
++
++/* use colors by default? */
++bool use_colors = 1;
++
++const char *backtitle = NULL;
++
++const char *dialog_result;
++
++/*
++ * Attribute values, default is for mono display
++ */
++chtype attributes[] =
++{
++ A_NORMAL, /* screen_attr */
++ A_NORMAL, /* shadow_attr */
++ A_NORMAL, /* dialog_attr */
++ A_BOLD, /* title_attr */
++ A_NORMAL, /* border_attr */
++ A_REVERSE, /* button_active_attr */
++ A_DIM, /* button_inactive_attr */
++ A_REVERSE, /* button_key_active_attr */
++ A_BOLD, /* button_key_inactive_attr */
++ A_REVERSE, /* button_label_active_attr */
++ A_NORMAL, /* button_label_inactive_attr */
++ A_NORMAL, /* inputbox_attr */
++ A_NORMAL, /* inputbox_border_attr */
++ A_NORMAL, /* searchbox_attr */
++ A_BOLD, /* searchbox_title_attr */
++ A_NORMAL, /* searchbox_border_attr */
++ A_BOLD, /* position_indicator_attr */
++ A_NORMAL, /* menubox_attr */
++ A_NORMAL, /* menubox_border_attr */
++ A_NORMAL, /* item_attr */
++ A_REVERSE, /* item_selected_attr */
++ A_BOLD, /* tag_attr */
++ A_REVERSE, /* tag_selected_attr */
++ A_BOLD, /* tag_key_attr */
++ A_REVERSE, /* tag_key_selected_attr */
++ A_BOLD, /* check_attr */
++ A_REVERSE, /* check_selected_attr */
++ A_BOLD, /* uarrow_attr */
++ A_BOLD /* darrow_attr */
++};
++
++
++#include "colors.h"
++
++/*
++ * Table of color values
++ */
++int color_table[][3] =
++{
++ {SCREEN_FG, SCREEN_BG, SCREEN_HL},
++ {SHADOW_FG, SHADOW_BG, SHADOW_HL},
++ {DIALOG_FG, DIALOG_BG, DIALOG_HL},
++ {TITLE_FG, TITLE_BG, TITLE_HL},
++ {BORDER_FG, BORDER_BG, BORDER_HL},
++ {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
++ {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
++ {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
++ {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL},
++ {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL},
++ {BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
++ BUTTON_LABEL_INACTIVE_HL},
++ {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
++ {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
++ {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
++ {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
++ {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
++ {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
++ {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
++ {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
++ {ITEM_FG, ITEM_BG, ITEM_HL},
++ {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
++ {TAG_FG, TAG_BG, TAG_HL},
++ {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
++ {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
++ {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
++ {CHECK_FG, CHECK_BG, CHECK_HL},
++ {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
++ {UARROW_FG, UARROW_BG, UARROW_HL},
++ {DARROW_FG, DARROW_BG, DARROW_HL},
++}; /* color_table */
++
++/*
++ * Set window to attribute 'attr'
++ */
++void
++attr_clear (WINDOW * win, int height, int width, chtype attr)
++{
++ int i, j;
++
++ wattrset (win, attr);
++ for (i = 0; i < height; i++) {
++ wmove (win, i, 0);
++ for (j = 0; j < width; j++)
++ waddch (win, ' ');
++ }
++ touchwin (win);
++}
++
++void dialog_clear (void)
++{
++ attr_clear (stdscr, LINES, COLS, screen_attr);
++ /* Display background title if it exists ... - SLH */
++ if (backtitle != NULL) {
++ int i;
++
++ wattrset (stdscr, screen_attr);
++ mvwaddstr (stdscr, 0, 1, (char *)backtitle);
++ wmove (stdscr, 1, 1);
++ for (i = 1; i < COLS - 1; i++)
++ waddch (stdscr, ACS_HLINE);
++ }
++ wnoutrefresh (stdscr);
++}
++
++/*
++ * Do some initialization for dialog
++ */
++void
++init_dialog (void)
++{
++ initscr (); /* Init curses */
++ keypad (stdscr, TRUE);
++ cbreak ();
++ noecho ();
++
++
++ if (use_colors) /* Set up colors */
++ color_setup ();
++
++
++ dialog_clear ();
++}
++
++/*
++ * Setup for color display
++ */
++void
++color_setup (void)
++{
++ int i;
++
++ if (has_colors ()) { /* Terminal supports color? */
++ start_color ();
++
++ /* Initialize color pairs */
++ for (i = 0; i < ATTRIBUTE_COUNT; i++)
++ init_pair (i + 1, color_table[i][0], color_table[i][1]);
++
++ /* Setup color attributes */
++ for (i = 0; i < ATTRIBUTE_COUNT; i++)
++ attributes[i] = C_ATTR (color_table[i][2], i + 1);
++ }
++}
++
++/*
++ * End using dialog functions.
++ */
++void
++end_dialog (void)
++{
++ endwin ();
++}
++
++
++/*
++ * Print a string of text in a window, automatically wrap around to the
++ * next line if the string is too long to fit on one line. Newline
++ * characters '\n' are replaced by spaces. We start on a new line
++ * if there is no room for at least 4 nonblanks following a double-space.
++ */
++void
++print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
++{
++ int newl, cur_x, cur_y;
++ int i, prompt_len, room, wlen;
++ char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
++
++ strcpy (tempstr, prompt);
++
++ prompt_len = strlen(tempstr);
++
++ /*
++ * Remove newlines
++ */
++ for(i=0; i<prompt_len; i++) {
++ if(tempstr[i] == '\n') tempstr[i] = ' ';
++ }
++
++ if (prompt_len <= width - x * 2) { /* If prompt is short */
++ wmove (win, y, (width - prompt_len) / 2);
++ waddstr (win, tempstr);
++ } else {
++ cur_x = x;
++ cur_y = y;
++ newl = 1;
++ word = tempstr;
++ while (word && *word) {
++ sp = index(word, ' ');
++ if (sp)
++ *sp++ = 0;
++
++ /* Wrap to next line if either the word does not fit,
++ or it is the first word of a new sentence, and it is
++ short, and the next word does not fit. */
++ room = width - cur_x;
++ wlen = strlen(word);
++ if (wlen > room ||
++ (newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
++ && (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
++ cur_y++;
++ cur_x = x;
++ }
++ wmove (win, cur_y, cur_x);
++ waddstr (win, word);
++ getyx (win, cur_y, cur_x);
++ cur_x++;
++ if (sp && *sp == ' ') {
++ cur_x++; /* double space */
++ while (*++sp == ' ');
++ newl = 1;
++ } else
++ newl = 0;
++ word = sp;
++ }
++ }
++}
++
++/*
++ * Print a button
++ */
++void
++print_button (WINDOW * win, const char *label, int y, int x, int selected)
++{
++ int i, temp;
++
++ wmove (win, y, x);
++ wattrset (win, selected ? button_active_attr : button_inactive_attr);
++ waddstr (win, "<");
++ temp = strspn (label, " ");
++ label += temp;
++ wattrset (win, selected ? button_label_active_attr
++ : button_label_inactive_attr);
++ for (i = 0; i < temp; i++)
++ waddch (win, ' ');
++ wattrset (win, selected ? button_key_active_attr
++ : button_key_inactive_attr);
++ waddch (win, label[0]);
++ wattrset (win, selected ? button_label_active_attr
++ : button_label_inactive_attr);
++ waddstr (win, (char *)label + 1);
++ wattrset (win, selected ? button_active_attr : button_inactive_attr);
++ waddstr (win, ">");
++ wmove (win, y, x + temp + 1);
++}
++
++/*
++ * Draw a rectangular box with line drawing characters
++ */
++void
++draw_box (WINDOW * win, int y, int x, int height, int width,
++ chtype box, chtype border)
++{
++ int i, j;
++
++ wattrset (win, 0);
++ for (i = 0; i < height; i++) {
++ wmove (win, y + i, x);
++ for (j = 0; j < width; j++)
++ if (!i && !j)
++ waddch (win, border | ACS_ULCORNER);
++ else if (i == height - 1 && !j)
++ waddch (win, border | ACS_LLCORNER);
++ else if (!i && j == width - 1)
++ waddch (win, box | ACS_URCORNER);
++ else if (i == height - 1 && j == width - 1)
++ waddch (win, box | ACS_LRCORNER);
++ else if (!i)
++ waddch (win, border | ACS_HLINE);
++ else if (i == height - 1)
++ waddch (win, box | ACS_HLINE);
++ else if (!j)
++ waddch (win, border | ACS_VLINE);
++ else if (j == width - 1)
++ waddch (win, box | ACS_VLINE);
++ else
++ waddch (win, box | ' ');
++ }
++}
++
++/*
++ * Draw shadows along the right and bottom edge to give a more 3D look
++ * to the boxes
++ */
++void
++draw_shadow (WINDOW * win, int y, int x, int height, int width)
++{
++ int i;
++
++ if (has_colors ()) { /* Whether terminal supports color? */
++ wattrset (win, shadow_attr);
++ wmove (win, y + height, x + 2);
++ for (i = 0; i < width; i++)
++ waddch (win, winch (win) & A_CHARTEXT);
++ for (i = y + 1; i < y + height + 1; i++) {
++ wmove (win, i, x + width);
++ waddch (win, winch (win) & A_CHARTEXT);
++ waddch (win, winch (win) & A_CHARTEXT);
++ }
++ wnoutrefresh (win);
++ }
++}
++
++/*
++ * Return the position of the first alphabetic character in a string.
++ */
++int
++first_alpha(const char *string, const char *exempt)
++{
++ int i, in_paren=0, c;
++
++ for (i = 0; i < strlen(string); i++) {
++ c = tolower(string[i]);
++
++ if (strchr("<[(", c)) ++in_paren;
++ if (strchr(">])", c) && in_paren > 0) --in_paren;
++
++ if ((! in_paren) && isalpha(c) &&
++ strchr(exempt, c) == 0)
++ return i;
++ }
++
++ return 0;
++}
++
++/*
++ * Get the first selected item in the dialog_list_item list.
++ */
++struct dialog_list_item *
++first_sel_item(int item_no, struct dialog_list_item ** items)
++{
++ int i;
++
++ for (i = 0; i < item_no; i++) {
++ if (items[i]->selected)
++ return items[i];
++ }
++
++ return NULL;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/yesno.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/yesno.c
+new file mode 100644
+index 0000000..11fcc25
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/yesno.c
+@@ -0,0 +1,118 @@
++/*
++ * yesno.c -- implements the yes/no box
++ *
++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2
++ * of the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include "dialog.h"
++
++/*
++ * Display termination buttons
++ */
++static void
++print_buttons(WINDOW *dialog, int height, int width, int selected)
++{
++ int x = width / 2 - 10;
++ int y = height - 2;
++
++ print_button (dialog, " Yes ", y, x, selected == 0);
++ print_button (dialog, " No ", y, x + 13, selected == 1);
++
++ wmove(dialog, y, x+1 + 13*selected );
++ wrefresh (dialog);
++}
++
++/*
++ * Display a dialog box with two buttons - Yes and No
++ */
++int
++dialog_yesno (const char *title, const char *prompt, int height, int width)
++{
++ int i, x, y, key = 0, button = 0;
++ WINDOW *dialog;
++
++ /* center dialog box on screen */
++ x = (COLS - width) / 2;
++ y = (LINES - height) / 2;
++
++ draw_shadow (stdscr, y, x, height, width);
++
++ dialog = newwin (height, width, y, x);
++ keypad (dialog, TRUE);
++
++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
++ wattrset (dialog, border_attr);
++ mvwaddch (dialog, height-3, 0, ACS_LTEE);
++ for (i = 0; i < width - 2; i++)
++ waddch (dialog, ACS_HLINE);
++ wattrset (dialog, dialog_attr);
++ waddch (dialog, ACS_RTEE);
++
++ if (title != NULL && strlen(title) >= width-2 ) {
++ /* truncate long title -- mec */
++ char * title2 = malloc(width-2+1);
++ memcpy( title2, title, width-2 );
++ title2[width-2] = '\0';
++ title = title2;
++ }
++
++ if (title != NULL) {
++ wattrset (dialog, title_attr);
++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
++ waddstr (dialog, (char *)title);
++ waddch (dialog, ' ');
++ }
++
++ wattrset (dialog, dialog_attr);
++ print_autowrap (dialog, prompt, width - 2, 1, 3);
++
++ print_buttons(dialog, height, width, 0);
++
++ while (key != ESC) {
++ key = wgetch (dialog);
++ switch (key) {
++ case 'Y':
++ case 'y':
++ delwin (dialog);
++ return 0;
++ case 'N':
++ case 'n':
++ delwin (dialog);
++ return 1;
++
++ case TAB:
++ case KEY_LEFT:
++ case KEY_RIGHT:
++ button = ((key == KEY_LEFT ? --button : ++button) < 0)
++ ? 1 : (button > 1 ? 0 : button);
++
++ print_buttons(dialog, height, width, button);
++ wrefresh (dialog);
++ break;
++ case ' ':
++ case '\n':
++ delwin (dialog);
++ return button;
++ case ESC:
++ break;
++ }
++ }
++
++ delwin (dialog);
++ return -1; /* ESC pressed */
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mconf.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mconf.c
+new file mode 100644
+index 0000000..406eb29
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mconf.c
+@@ -0,0 +1,977 @@
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ *
++ * Introduced single menu mode (show all sub-menus in one large tree).
++ * 2002-11-06 Petr Baudis <pasky@ucw.cz>
++ *
++ * Directly use liblxdialog library routines.
++ * 2002-11-14 Petr Baudis <pasky@ucw.cz>
++ */
++
++#include <sys/ioctl.h>
++#include <sys/wait.h>
++#include <sys/termios.h>
++#include <ctype.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <limits.h>
++#include <signal.h>
++#include <stdarg.h>
++#include <stdlib.h>
++#include <string.h>
++#include <termios.h>
++#include <unistd.h>
++
++#include "lxdialog/dialog.h"
++
++#define LKC_DIRECT_LINK
++#include "lkc.h"
++
++static char menu_backtitle[128];
++static const char mconf_readme[] =
++"Overview\n"
++"--------\n"
++"Some features may be built directly into axTLS. Some features\n"
++"may be completely removed altogether. There are also certain\n"
++"parameters which are not really features, but must be\n"
++"entered in as decimal or hexadecimal numbers or possibly text.\n"
++"\n"
++"Menu items beginning with [*] or [ ] represent features\n"
++"configured to be built in or removed respectively.\n"
++"\n"
++"To change any of these features, highlight it with the cursor\n"
++"keys and press <Y> to build it in or <N> to removed it.\n"
++"You may also press the <Space Bar> to cycle\n"
++"through the available options (ie. Y->N->Y).\n"
++"\n"
++"Some additional keyboard hints:\n"
++"\n"
++"Menus\n"
++"----------\n"
++"o Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
++" you wish to change or submenu wish to select and press <Enter>.\n"
++" Submenus are designated by \"--->\".\n"
++"\n"
++" Shortcut: Press the option's highlighted letter (hotkey).\n"
++" Pressing a hotkey more than once will sequence\n"
++" through all visible items which use that hotkey.\n"
++"\n"
++" You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
++" unseen options into view.\n"
++"\n"
++"o To exit a menu use the cursor keys to highlight the <Exit> button\n"
++" and press <ENTER>.\n"
++"\n"
++" Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n"
++" using those letters. You may press a single <ESC>, but\n"
++" there is a delayed response which you may find annoying.\n"
++"\n"
++" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
++" <Exit> and <Help>\n"
++"\n"
++"o To get help with an item, use the cursor keys to highlight <Help>\n"
++" and Press <ENTER>.\n"
++"\n"
++" Shortcut: Press <H> or <?>.\n"
++"\n"
++"\n"
++"Radiolists (Choice lists)\n"
++"-----------\n"
++"o Use the cursor keys to select the option you wish to set and press\n"
++" <S> or the <SPACE BAR>.\n"
++"\n"
++" Shortcut: Press the first letter of the option you wish to set then\n"
++" press <S> or <SPACE BAR>.\n"
++"\n"
++"o To see available help for the item, use the cursor keys to highlight\n"
++" <Help> and Press <ENTER>.\n"
++"\n"
++" Shortcut: Press <H> or <?>.\n"
++"\n"
++" Also, the <TAB> and cursor keys will cycle between <Select> and\n"
++" <Help>\n"
++"\n"
++"\n"
++"Data Entry\n"
++"-----------\n"
++"o Enter the requested information and press <ENTER>\n"
++" If you are entering hexadecimal values, it is not necessary to\n"
++" add the '0x' prefix to the entry.\n"
++"\n"
++"o For help, use the <TAB> or cursor keys to highlight the help option\n"
++" and press <ENTER>. You can try <TAB><H> as well.\n"
++"\n"
++"\n"
++"Text Box (Help Window)\n"
++"--------\n"
++"o Use the cursor keys to scroll up/down/left/right. The VI editor\n"
++" keys h,j,k,l function here as do <SPACE BAR> and <B> for those\n"
++" who are familiar with less and lynx.\n"
++"\n"
++"o Press <E>, <X>, <Enter> or <Esc><Esc> to exit.\n"
++"\n"
++"\n"
++"Alternate Configuration Files\n"
++"-----------------------------\n"
++"Menuconfig supports the use of alternate configuration files for\n"
++"those who, for various reasons, find it necessary to switch\n"
++"between different configurations.\n"
++"\n"
++"At the end of the main menu you will find two options. One is\n"
++"for saving the current configuration to a file of your choosing.\n"
++"The other option is for loading a previously saved alternate\n"
++"configuration.\n"
++"\n"
++"Even if you don't use alternate configuration files, but you\n"
++"find during a Menuconfig session that you have completely messed\n"
++"up your settings, you may use the \"Load Alternate...\" option to\n"
++"restore your previously saved settings from \".config\" without\n"
++"restarting Menuconfig.\n"
++"\n"
++"Other information\n"
++"-----------------\n"
++"If you use Menuconfig in an XTERM window make sure you have your\n"
++"$TERM variable set to point to a xterm definition which supports color.\n"
++"Otherwise, Menuconfig will look rather bad. Menuconfig will not\n"
++"display correctly in a RXVT window because rxvt displays only one\n"
++"intensity of color, bright.\n"
++"\n"
++"Menuconfig will display larger menus on screens or xterms which are\n"
++"set to display more than the standard 25 row by 80 column geometry.\n"
++"In order for this to work, the \"stty size\" command must be able to\n"
++"display the screen's current row and column geometry. I STRONGLY\n"
++"RECOMMEND that you make sure you do NOT have the shell variables\n"
++"LINES and COLUMNS exported into your environment. Some distributions\n"
++"export those variables via /etc/profile. Some ncurses programs can\n"
++"become confused when those variables (LINES & COLUMNS) don't reflect\n"
++"the true screen size.\n"
++"\n"
++"Optional personality available\n"
++"------------------------------\n"
++"If you prefer to have all of the options listed in a single\n"
++"menu, rather than the default multimenu hierarchy, run the menuconfig\n"
++"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
++"\n"
++"make MENUCONFIG_MODE=single_menu menuconfig\n"
++"\n"
++"<Enter> will then unroll the appropriate category, or enfold it if it\n"
++"is already unrolled.\n"
++"\n"
++"Note that this mode can eventually be a little more CPU expensive\n"
++"(especially with a larger number of unrolled categories) than the\n"
++"default mode.\n",
++menu_instructions[] =
++ "Arrow keys navigate the menu. "
++ "<Enter> selects submenus --->. "
++ "Highlighted letters are hotkeys. "
++ "Pressing <Y> selectes a feature, while <N> will exclude a feature. "
++ "Press <Esc><Esc> to exit, <?> for Help, </> for Search. "
++ "Legend: [*] feature is selected [ ] feature is excluded",
++radiolist_instructions[] =
++ "Use the arrow keys to navigate this window or "
++ "press the hotkey of the item you wish to select "
++ "followed by the <SPACE BAR>. "
++ "Press <?> for additional information about this option.",
++inputbox_instructions_int[] =
++ "Please enter a decimal value. "
++ "Fractions will not be accepted. "
++ "Use the <TAB> key to move from the input field to the buttons below it.",
++inputbox_instructions_hex[] =
++ "Please enter a hexadecimal value. "
++ "Use the <TAB> key to move from the input field to the buttons below it.",
++inputbox_instructions_string[] =
++ "Please enter a string value. "
++ "Use the <TAB> key to move from the input field to the buttons below it.",
++setmod_text[] =
++ "This feature depends on another which has been configured as a module.\n"
++ "As a result, this feature will be built as a module.",
++nohelp_text[] =
++ "There is no help available for this option.\n",
++load_config_text[] =
++ "Enter the name of the configuration file you wish to load. "
++ "Accept the name shown to restore the configuration you "
++ "last retrieved. Leave blank to abort.",
++load_config_help[] =
++ "\n"
++ "For various reasons, one may wish to keep several different axTLS\n"
++ "configurations available on a single machine.\n"
++ "\n"
++ "If you have saved a previous configuration in a file other than the\n"
++ "axTLS's default, entering the name of the file here will allow you\n"
++ "to modify that configuration.\n"
++ "\n"
++ "If you are uncertain, then you have probably never used alternate\n"
++ "configuration files. You should therefor leave this blank to abort.\n",
++save_config_text[] =
++ "Enter a filename to which this configuration should be saved "
++ "as an alternate. Leave blank to abort.",
++save_config_help[] =
++ "\n"
++ "For various reasons, one may wish to keep different axTLS\n"
++ "configurations available on a single machine.\n"
++ "\n"
++ "Entering a file name here will allow you to later retrieve, modify\n"
++ "and use the current configuration as an alternate to whatever\n"
++ "configuration options you have selected at that time.\n"
++ "\n"
++ "If you are uncertain what all this means then you should probably\n"
++ "leave this blank.\n",
++search_help[] =
++ "\n"
++ "Search for CONFIG_ symbols and display their relations.\n"
++ "Example: search for \"^FOO\"\n"
++ "Result:\n"
++ "-----------------------------------------------------------------\n"
++ "Symbol: FOO [=m]\n"
++ "Prompt: Foo bus is used to drive the bar HW\n"
++ "Defined at drivers/pci/Kconfig:47\n"
++ "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
++ "Location:\n"
++ " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
++ " -> PCI support (PCI [=y])\n"
++ " -> PCI access mode (<choice> [=y])\n"
++ "Selects: LIBCRC32\n"
++ "Selected by: BAR\n"
++ "-----------------------------------------------------------------\n"
++ "o The line 'Prompt:' shows the text used in the menu structure for\n"
++ " this CONFIG_ symbol\n"
++ "o The 'Defined at' line tell at what file / line number the symbol\n"
++ " is defined\n"
++ "o The 'Depends on:' line tell what symbols needs to be defined for\n"
++ " this symbol to be visible in the menu (selectable)\n"
++ "o The 'Location:' lines tell where in the menu structure this symbol\n"
++ " is located\n"
++ " A location followed by a [=y] indicate that this is a selectable\n"
++ " menu item - and current value is displayed inside brackets.\n"
++ "o The 'Selects:' line tell what symbol will be automatically\n"
++ " selected if this symbol is selected (y or m)\n"
++ "o The 'Selected by' line tell what symbol has selected this symbol\n"
++ "\n"
++ "Only relevant lines are shown.\n"
++ "\n\n"
++ "Search examples:\n"
++ "Examples: USB => find all CONFIG_ symbols containing USB\n"
++ " ^USB => find all CONFIG_ symbols starting with USB\n"
++ " USB$ => find all CONFIG_ symbols ending with USB\n"
++ "\n";
++
++static char filename[PATH_MAX+1] = ".config";
++static int indent;
++static struct termios ios_org;
++static int rows = 0, cols = 0;
++static struct menu *current_menu;
++static int child_count;
++static int single_menu_mode;
++
++static struct dialog_list_item *items[16384]; /* FIXME: This ought to be dynamic. */
++static int item_no;
++
++static void conf(struct menu *menu);
++static void conf_choice(struct menu *menu);
++static void conf_string(struct menu *menu);
++static void conf_load(void);
++static void conf_save(void);
++static void show_textbox(const char *title, const char *text, int r, int c);
++static void show_helptext(const char *title, const char *text);
++static void show_help(struct menu *menu);
++static void show_file(const char *filename, const char *title, int r, int c);
++
++static void init_wsize(void)
++{
++ struct winsize ws;
++ char *env;
++
++ if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) {
++ rows = ws.ws_row;
++ cols = ws.ws_col;
++ }
++
++ if (!rows) {
++ env = getenv("LINES");
++ if (env)
++ rows = atoi(env);
++ if (!rows)
++ rows = 24;
++ }
++ if (!cols) {
++ env = getenv("COLUMNS");
++ if (env)
++ cols = atoi(env);
++ if (!cols)
++ cols = 80;
++ }
++
++ if (rows < 19 || cols < 80) {
++ fprintf(stderr, "Your display is too small to run Menuconfig!\n");
++ fprintf(stderr, "It must be at least 19 lines by 80 columns.\n");
++ exit(1);
++ }
++
++ rows -= 4;
++ cols -= 5;
++}
++
++static void cinit(void)
++{
++ item_no = 0;
++}
++
++static void cmake(void)
++{
++ items[item_no] = malloc(sizeof(struct dialog_list_item));
++ memset(items[item_no], 0, sizeof(struct dialog_list_item));
++ items[item_no]->tag = malloc(32); items[item_no]->tag[0] = 0;
++ items[item_no]->name = malloc(512); items[item_no]->name[0] = 0;
++ items[item_no]->namelen = 0;
++ item_no++;
++}
++
++static int cprint_name(const char *fmt, ...)
++{
++ va_list ap;
++ int res;
++
++ if (!item_no)
++ cmake();
++ va_start(ap, fmt);
++ res = vsnprintf(items[item_no - 1]->name + items[item_no - 1]->namelen,
++ 512 - items[item_no - 1]->namelen, fmt, ap);
++ if (res > 0)
++ items[item_no - 1]->namelen += res;
++ va_end(ap);
++
++ return res;
++}
++
++static int cprint_tag(const char *fmt, ...)
++{
++ va_list ap;
++ int res;
++
++ if (!item_no)
++ cmake();
++ va_start(ap, fmt);
++ res = vsnprintf(items[item_no - 1]->tag, 32, fmt, ap);
++ va_end(ap);
++
++ return res;
++}
++
++static void cdone(void)
++{
++ int i;
++
++ for (i = 0; i < item_no; i++) {
++ free(items[i]->tag);
++ free(items[i]->name);
++ free(items[i]);
++ }
++
++ item_no = 0;
++}
++
++static void get_prompt_str(struct gstr *r, struct property *prop)
++{
++ int i, j;
++ struct menu *submenu[8], *menu;
++
++ str_printf(r, "Prompt: %s\n", prop->text);
++ str_printf(r, " Defined at %s:%d\n", prop->menu->file->name,
++ prop->menu->lineno);
++ if (!expr_is_yes(prop->visible.expr)) {
++ str_append(r, " Depends on: ");
++ expr_gstr_print(prop->visible.expr, r);
++ str_append(r, "\n");
++ }
++ menu = prop->menu->parent;
++ for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
++ submenu[i++] = menu;
++ if (i > 0) {
++ str_printf(r, " Location:\n");
++ for (j = 4; --i >= 0; j += 2) {
++ menu = submenu[i];
++ str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu));
++ if (menu->sym) {
++ str_printf(r, " (%s [=%s])", menu->sym->name ?
++ menu->sym->name : "<choice>",
++ sym_get_string_value(menu->sym));
++ }
++ str_append(r, "\n");
++ }
++ }
++}
++
++static void get_symbol_str(struct gstr *r, struct symbol *sym)
++{
++ bool hit;
++ struct property *prop;
++
++ str_printf(r, "Symbol: %s [=%s]\n", sym->name,
++ sym_get_string_value(sym));
++ for_all_prompts(sym, prop)
++ get_prompt_str(r, prop);
++ hit = false;
++ for_all_properties(sym, prop, P_SELECT) {
++ if (!hit) {
++ str_append(r, " Selects: ");
++ hit = true;
++ } else
++ str_printf(r, " && ");
++ expr_gstr_print(prop->expr, r);
++ }
++ if (hit)
++ str_append(r, "\n");
++ if (sym->rev_dep.expr) {
++ str_append(r, " Selected by: ");
++ expr_gstr_print(sym->rev_dep.expr, r);
++ str_append(r, "\n");
++ }
++ str_append(r, "\n\n");
++}
++
++static struct gstr get_relations_str(struct symbol **sym_arr)
++{
++ struct symbol *sym;
++ struct gstr res = str_new();
++ int i;
++
++ for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
++ get_symbol_str(&res, sym);
++ if (!i)
++ str_append(&res, "No matches found.\n");
++ return res;
++}
++
++static void search_conf(void)
++{
++ struct symbol **sym_arr;
++ struct gstr res;
++
++again:
++ switch (dialog_inputbox("Search Configuration Parameter",
++ "Enter Keyword", 10, 75,
++ NULL)) {
++ case 0:
++ break;
++ case 1:
++ show_helptext("Search Configuration", search_help);
++ goto again;
++ default:
++ return;
++ }
++
++ sym_arr = sym_re_search(dialog_input_result);
++ res = get_relations_str(sym_arr);
++ free(sym_arr);
++ show_textbox("Search Results", str_get(&res), 0, 0);
++ str_free(&res);
++}
++
++static void build_conf(struct menu *menu)
++{
++ struct symbol *sym;
++ struct property *prop;
++ struct menu *child;
++ int type, tmp, doint = 2;
++ tristate val;
++ char ch;
++
++ if (!menu_is_visible(menu))
++ return;
++
++ sym = menu->sym;
++ prop = menu->prompt;
++ if (!sym) {
++ if (prop && menu != current_menu) {
++ const char *prompt = menu_get_prompt(menu);
++ switch (prop->type) {
++ case P_MENU:
++ child_count++;
++ cmake();
++ cprint_tag("m%p", menu);
++
++ if (single_menu_mode) {
++ cprint_name("%s%*c%s",
++ menu->data ? "-->" : "++>",
++ indent + 1, ' ', prompt);
++ } else {
++ cprint_name(" %*c%s --->", indent + 1, ' ', prompt);
++ }
++
++ if (single_menu_mode && menu->data)
++ goto conf_childs;
++ return;
++ default:
++ if (prompt) {
++ child_count++;
++ cmake();
++ cprint_tag(":%p", menu);
++ cprint_name("---%*c%s", indent + 1, ' ', prompt);
++ }
++ }
++ } else
++ doint = 0;
++ goto conf_childs;
++ }
++
++ cmake();
++ type = sym_get_type(sym);
++ if (sym_is_choice(sym)) {
++ struct symbol *def_sym = sym_get_choice_value(sym);
++ struct menu *def_menu = NULL;
++
++ child_count++;
++ for (child = menu->list; child; child = child->next) {
++ if (menu_is_visible(child) && child->sym == def_sym)
++ def_menu = child;
++ }
++
++ val = sym_get_tristate_value(sym);
++ if (sym_is_changable(sym)) {
++ cprint_tag("t%p", menu);
++ switch (type) {
++ case S_BOOLEAN:
++ cprint_name("[%c]", val == no ? ' ' : '*');
++ break;
++ case S_TRISTATE:
++ switch (val) {
++ case yes: ch = '*'; break;
++ case mod: ch = 'M'; break;
++ default: ch = ' '; break;
++ }
++ cprint_name("<%c>", ch);
++ break;
++ }
++ } else {
++ cprint_tag("%c%p", def_menu ? 't' : ':', menu);
++ cprint_name(" ");
++ }
++
++ cprint_name("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
++ if (val == yes) {
++ if (def_menu) {
++ cprint_name(" (%s)", menu_get_prompt(def_menu));
++ cprint_name(" --->");
++ if (def_menu->list) {
++ indent += 2;
++ build_conf(def_menu);
++ indent -= 2;
++ }
++ }
++ return;
++ }
++ } else {
++ if (menu == current_menu) {
++ cprint_tag(":%p", menu);
++ cprint_name("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
++ goto conf_childs;
++ }
++ child_count++;
++ val = sym_get_tristate_value(sym);
++ if (sym_is_choice_value(sym) && val == yes) {
++ cprint_tag(":%p", menu);
++ cprint_name(" ");
++ } else {
++ switch (type) {
++ case S_BOOLEAN:
++ cprint_tag("t%p", menu);
++ if (sym_is_changable(sym))
++ cprint_name("[%c]", val == no ? ' ' : '*');
++ else
++ cprint_name("---");
++ break;
++ case S_TRISTATE:
++ cprint_tag("t%p", menu);
++ switch (val) {
++ case yes: ch = '*'; break;
++ case mod: ch = 'M'; break;
++ default: ch = ' '; break;
++ }
++ if (sym_is_changable(sym))
++ cprint_name("<%c>", ch);
++ else
++ cprint_name("---");
++ break;
++ default:
++ cprint_tag("s%p", menu);
++ tmp = cprint_name("(%s)", sym_get_string_value(sym));
++ tmp = indent - tmp + 4;
++ if (tmp < 0)
++ tmp = 0;
++ cprint_name("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
++ (sym_has_value(sym) || !sym_is_changable(sym)) ?
++ "" : " (NEW)");
++ goto conf_childs;
++ }
++ }
++ cprint_name("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
++ (sym_has_value(sym) || !sym_is_changable(sym)) ?
++ "" : " (NEW)");
++ if (menu->prompt->type == P_MENU) {
++ cprint_name(" --->");
++ return;
++ }
++ }
++
++conf_childs:
++ indent += doint;
++ for (child = menu->list; child; child = child->next)
++ build_conf(child);
++ indent -= doint;
++}
++
++static void conf(struct menu *menu)
++{
++ struct dialog_list_item *active_item = NULL;
++ struct menu *submenu;
++ const char *prompt = menu_get_prompt(menu);
++ struct symbol *sym;
++ char active_entry[40];
++ int stat, type;
++
++ unlink("lxdialog.scrltmp");
++ active_entry[0] = 0;
++ while (1) {
++ indent = 0;
++ child_count = 0;
++ current_menu = menu;
++ cdone(); cinit();
++ build_conf(menu);
++ if (!child_count)
++ break;
++ if (menu == &rootmenu) {
++ cmake(); cprint_tag(":"); cprint_name("--- ");
++ cmake(); cprint_tag("L"); cprint_name("Load an Alternate Configuration File");
++ cmake(); cprint_tag("S"); cprint_name("Save Configuration to an Alternate File");
++ }
++ dialog_clear();
++ stat = dialog_menu(prompt ? prompt : "Main Menu",
++ menu_instructions, rows, cols, rows - 10,
++ active_entry, item_no, items);
++ if (stat < 0)
++ return;
++
++ if (stat == 1 || stat == 255)
++ break;
++
++ active_item = first_sel_item(item_no, items);
++ if (!active_item)
++ continue;
++ active_item->selected = 0;
++ strncpy(active_entry, active_item->tag, sizeof(active_entry));
++ active_entry[sizeof(active_entry)-1] = 0;
++ type = active_entry[0];
++ if (!type)
++ continue;
++
++ sym = NULL;
++ submenu = NULL;
++ if (sscanf(active_entry + 1, "%p", &submenu) == 1)
++ sym = submenu->sym;
++
++ switch (stat) {
++ case 0:
++ switch (type) {
++ case 'm':
++ if (single_menu_mode)
++ submenu->data = (void *) (long) !submenu->data;
++ else
++ conf(submenu);
++ break;
++ case 't':
++ if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
++ conf_choice(submenu);
++ else if (submenu->prompt->type == P_MENU)
++ conf(submenu);
++ break;
++ case 's':
++ conf_string(submenu);
++ break;
++ case 'L':
++ conf_load();
++ break;
++ case 'S':
++ conf_save();
++ break;
++ }
++ break;
++ case 2:
++ if (sym)
++ show_help(submenu);
++ else
++ show_helptext("README", mconf_readme);
++ break;
++ case 3:
++ if (type == 't') {
++ if (sym_set_tristate_value(sym, yes))
++ break;
++ if (sym_set_tristate_value(sym, mod))
++ show_textbox(NULL, setmod_text, 6, 74);
++ }
++ break;
++ case 4:
++ if (type == 't')
++ sym_set_tristate_value(sym, no);
++ break;
++ case 5:
++ if (type == 't')
++ sym_set_tristate_value(sym, mod);
++ break;
++ case 6:
++ if (type == 't')
++ sym_toggle_tristate_value(sym);
++ else if (type == 'm')
++ conf(submenu);
++ break;
++ case 7:
++ search_conf();
++ break;
++ }
++ }
++}
++
++static void show_textbox(const char *title, const char *text, int r, int c)
++{
++ int fd;
++
++ fd = creat(".help.tmp", 0777);
++ write(fd, text, strlen(text));
++ close(fd);
++ show_file(".help.tmp", title, r, c);
++ unlink(".help.tmp");
++}
++
++static void show_helptext(const char *title, const char *text)
++{
++ show_textbox(title, text, 0, 0);
++}
++
++static void show_help(struct menu *menu)
++{
++ struct gstr help = str_new();
++ struct symbol *sym = menu->sym;
++
++ if (sym->help)
++ {
++ if (sym->name) {
++ str_printf(&help, "%s:\n\n", sym->name);
++ str_append(&help, sym->help);
++ str_append(&help, "\n");
++ }
++ } else {
++ str_append(&help, nohelp_text);
++ }
++ get_symbol_str(&help, sym);
++ show_helptext(menu_get_prompt(menu), str_get(&help));
++ str_free(&help);
++}
++
++static void show_file(const char *filename, const char *title, int r, int c)
++{
++ while (dialog_textbox(title, filename, r ? r : rows, c ? c : cols) < 0)
++ ;
++}
++
++static void conf_choice(struct menu *menu)
++{
++ const char *prompt = menu_get_prompt(menu);
++ struct menu *child;
++ struct symbol *active;
++
++ active = sym_get_choice_value(menu->sym);
++ while (1) {
++ current_menu = menu;
++ cdone(); cinit();
++ for (child = menu->list; child; child = child->next) {
++ if (!menu_is_visible(child))
++ continue;
++ cmake();
++ cprint_tag("%p", child);
++ cprint_name("%s", menu_get_prompt(child));
++ if (child->sym == sym_get_choice_value(menu->sym))
++ items[item_no - 1]->selected = 1; /* ON */
++ else if (child->sym == active)
++ items[item_no - 1]->selected = 2; /* SELECTED */
++ else
++ items[item_no - 1]->selected = 0; /* OFF */
++ }
++
++ switch (dialog_checklist(prompt ? prompt : "Main Menu",
++ radiolist_instructions, 15, 70, 6,
++ item_no, items, FLAG_RADIO)) {
++ case 0:
++ if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) != 1)
++ break;
++ sym_set_tristate_value(child->sym, yes);
++ return;
++ case 1:
++ if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) == 1) {
++ show_help(child);
++ active = child->sym;
++ } else
++ show_help(menu);
++ break;
++ case 255:
++ return;
++ }
++ }
++}
++
++static void conf_string(struct menu *menu)
++{
++ const char *prompt = menu_get_prompt(menu);
++
++ while (1) {
++ char *heading;
++
++ switch (sym_get_type(menu->sym)) {
++ case S_INT:
++ heading = (char *) inputbox_instructions_int;
++ break;
++ case S_HEX:
++ heading = (char *) inputbox_instructions_hex;
++ break;
++ case S_STRING:
++ heading = (char *) inputbox_instructions_string;
++ break;
++ default:
++ heading = "Internal mconf error!";
++ /* panic? */;
++ }
++
++ switch (dialog_inputbox(prompt ? prompt : "Main Menu",
++ heading, 10, 75,
++ sym_get_string_value(menu->sym))) {
++ case 0:
++ if (sym_set_string_value(menu->sym, dialog_input_result))
++ return;
++ show_textbox(NULL, "You have made an invalid entry.", 5, 43);
++ break;
++ case 1:
++ show_help(menu);
++ break;
++ case 255:
++ return;
++ }
++ }
++}
++
++static void conf_load(void)
++{
++ while (1) {
++ switch (dialog_inputbox(NULL, load_config_text, 11, 55,
++ filename)) {
++ case 0:
++ if (!dialog_input_result[0])
++ return;
++ if (!conf_read(dialog_input_result))
++ return;
++ show_textbox(NULL, "File does not exist!", 5, 38);
++ break;
++ case 1:
++ show_helptext("Load Alternate Configuration", load_config_help);
++ break;
++ case 255:
++ return;
++ }
++ }
++}
++
++static void conf_save(void)
++{
++ while (1) {
++ switch (dialog_inputbox(NULL, save_config_text, 11, 55,
++ filename)) {
++ case 0:
++ if (!dialog_input_result[0])
++ return;
++ if (!conf_write(dialog_input_result))
++ return;
++ show_textbox(NULL, "Can't create file! Probably a nonexistent directory.", 5, 60);
++ break;
++ case 1:
++ show_helptext("Save Alternate Configuration", save_config_help);
++ break;
++ case 255:
++ return;
++ }
++ }
++}
++
++static void conf_cleanup(void)
++{
++ tcsetattr(1, TCSAFLUSH, &ios_org);
++ unlink(".help.tmp");
++}
++
++static void winch_handler(int sig)
++{
++ struct winsize ws;
++
++ if (ioctl(1, TIOCGWINSZ, &ws) == -1) {
++ rows = 24;
++ cols = 80;
++ } else {
++ rows = ws.ws_row;
++ cols = ws.ws_col;
++ }
++
++ if (rows < 19 || cols < 80) {
++ end_dialog();
++ fprintf(stderr, "Your display is too small to run Menuconfig!\n");
++ fprintf(stderr, "It must be at least 19 lines by 80 columns.\n");
++ exit(1);
++ }
++
++ rows -= 4;
++ cols -= 5;
++
++}
++
++int main(int ac, char **av)
++{
++ struct symbol *sym;
++ char *mode;
++ int stat;
++
++ conf_parse(av[1]);
++ conf_read(NULL);
++
++ sym = sym_lookup("VERSION", 0);
++ sym_calc_value(sym);
++ snprintf(menu_backtitle, 128, "axTLS v%s Configuration",
++ sym_get_string_value(sym));
++
++ mode = getenv("MENUCONFIG_MODE");
++ if (mode) {
++ if (!strcasecmp(mode, "single_menu"))
++ single_menu_mode = 1;
++ }
++
++ tcgetattr(1, &ios_org);
++ atexit(conf_cleanup);
++ init_wsize();
++ init_dialog();
++ signal(SIGWINCH, winch_handler);
++ conf(&rootmenu);
++ end_dialog();
++
++ /* Restart dialog to act more like when lxdialog was still separate */
++ init_dialog();
++ do {
++ stat = dialog_yesno(NULL,
++ "Do you wish to save your new axTLS configuration?", 5, 60);
++ } while (stat < 0);
++ end_dialog();
++
++ if (stat == 0) {
++ conf_write(NULL);
++ printf("\n\n"
++ "*** End of axTLS configuration.\n"
++ "*** Check the top-level Makefile for additional configuration options.\n\n");
++ } else
++ printf("\n\nYour axTLS configuration changes were NOT saved.\n\n");
++
++ return 0;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/menu.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/menu.c
+new file mode 100644
+index 0000000..0c13156
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/menu.c
+@@ -0,0 +1,390 @@
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#include <stdlib.h>
++#include <string.h>
++
++#define LKC_DIRECT_LINK
++#include "lkc.h"
++
++struct menu rootmenu;
++static struct menu **last_entry_ptr;
++
++struct file *file_list;
++struct file *current_file;
++
++static void menu_warn(struct menu *menu, const char *fmt, ...)
++{
++ va_list ap;
++ va_start(ap, fmt);
++ fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno);
++ vfprintf(stderr, fmt, ap);
++ fprintf(stderr, "\n");
++ va_end(ap);
++}
++
++static void prop_warn(struct property *prop, const char *fmt, ...)
++{
++ va_list ap;
++ va_start(ap, fmt);
++ fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno);
++ vfprintf(stderr, fmt, ap);
++ fprintf(stderr, "\n");
++ va_end(ap);
++}
++
++void menu_init(void)
++{
++ current_entry = current_menu = &rootmenu;
++ last_entry_ptr = &rootmenu.list;
++}
++
++void menu_add_entry(struct symbol *sym)
++{
++ struct menu *menu;
++
++ menu = malloc(sizeof(*menu));
++ memset(menu, 0, sizeof(*menu));
++ menu->sym = sym;
++ menu->parent = current_menu;
++ menu->file = current_file;
++ menu->lineno = zconf_lineno();
++
++ *last_entry_ptr = menu;
++ last_entry_ptr = &menu->next;
++ current_entry = menu;
++}
++
++void menu_end_entry(void)
++{
++}
++
++void menu_add_menu(void)
++{
++ current_menu = current_entry;
++ last_entry_ptr = &current_entry->list;
++}
++
++void menu_end_menu(void)
++{
++ last_entry_ptr = &current_menu->next;
++ current_menu = current_menu->parent;
++}
++
++struct expr *menu_check_dep(struct expr *e)
++{
++ if (!e)
++ return e;
++
++ switch (e->type) {
++ case E_NOT:
++ e->left.expr = menu_check_dep(e->left.expr);
++ break;
++ case E_OR:
++ case E_AND:
++ e->left.expr = menu_check_dep(e->left.expr);
++ e->right.expr = menu_check_dep(e->right.expr);
++ break;
++ case E_SYMBOL:
++ /* change 'm' into 'm' && MODULES */
++ if (e->left.sym == &symbol_mod)
++ return expr_alloc_and(e, expr_alloc_symbol(modules_sym));
++ break;
++ default:
++ break;
++ }
++ return e;
++}
++
++void menu_add_dep(struct expr *dep)
++{
++ current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
++}
++
++void menu_set_type(int type)
++{
++ struct symbol *sym = current_entry->sym;
++
++ if (sym->type == type)
++ return;
++ if (sym->type == S_UNKNOWN) {
++ sym->type = type;
++ return;
++ }
++ menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'\n",
++ sym->name ? sym->name : "<choice>",
++ sym_type_name(sym->type), sym_type_name(type));
++}
++
++struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
++{
++ struct property *prop = prop_alloc(type, current_entry->sym);
++
++ prop->menu = current_entry;
++ prop->text = prompt;
++ prop->expr = expr;
++ prop->visible.expr = menu_check_dep(dep);
++
++ if (prompt) {
++ if (current_entry->prompt)
++ menu_warn(current_entry, "prompt redefined\n");
++ current_entry->prompt = prop;
++ }
++
++ return prop;
++}
++
++void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep)
++{
++ menu_add_prop(type, prompt, NULL, dep);
++}
++
++void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep)
++{
++ menu_add_prop(type, NULL, expr, dep);
++}
++
++void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep)
++{
++ menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
++}
++
++void sym_check_prop(struct symbol *sym)
++{
++ struct property *prop;
++ struct symbol *sym2;
++ for (prop = sym->prop; prop; prop = prop->next) {
++ switch (prop->type) {
++ case P_DEFAULT:
++ if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
++ prop->expr->type != E_SYMBOL)
++ prop_warn(prop,
++ "default for config symbol '%'"
++ " must be a single symbol", sym->name);
++ break;
++ case P_SELECT:
++ sym2 = prop_get_symbol(prop);
++ if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE)
++ prop_warn(prop,
++ "config symbol '%s' uses select, but is "
++ "not boolean or tristate", sym->name);
++ else if (sym2->type == S_UNKNOWN)
++ prop_warn(prop,
++ "'select' used by config symbol '%s' "
++ "refer to undefined symbol '%s'",
++ sym->name, sym2->name);
++ else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE)
++ prop_warn(prop,
++ "'%s' has wrong type. 'select' only "
++ "accept arguments of boolean and "
++ "tristate type", sym2->name);
++ break;
++ case P_RANGE:
++ if (sym->type != S_INT && sym->type != S_HEX)
++ prop_warn(prop, "range is only allowed "
++ "for int or hex symbols");
++ if (!sym_string_valid(sym, prop->expr->left.sym->name) ||
++ !sym_string_valid(sym, prop->expr->right.sym->name))
++ prop_warn(prop, "range is invalid");
++ break;
++ default:
++ ;
++ }
++ }
++}
++
++void menu_finalize(struct menu *parent)
++{
++ struct menu *menu, *last_menu;
++ struct symbol *sym;
++ struct property *prop;
++ struct expr *parentdep, *basedep, *dep, *dep2, **ep;
++
++ sym = parent->sym;
++ if (parent->list) {
++ if (sym && sym_is_choice(sym)) {
++ /* find the first choice value and find out choice type */
++ for (menu = parent->list; menu; menu = menu->next) {
++ if (menu->sym) {
++ current_entry = parent;
++ menu_set_type(menu->sym->type);
++ current_entry = menu;
++ menu_set_type(sym->type);
++ break;
++ }
++ }
++ parentdep = expr_alloc_symbol(sym);
++ } else if (parent->prompt)
++ parentdep = parent->prompt->visible.expr;
++ else
++ parentdep = parent->dep;
++
++ for (menu = parent->list; menu; menu = menu->next) {
++ basedep = expr_transform(menu->dep);
++ basedep = expr_alloc_and(expr_copy(parentdep), basedep);
++ basedep = expr_eliminate_dups(basedep);
++ menu->dep = basedep;
++ if (menu->sym)
++ prop = menu->sym->prop;
++ else
++ prop = menu->prompt;
++ for (; prop; prop = prop->next) {
++ if (prop->menu != menu)
++ continue;
++ dep = expr_transform(prop->visible.expr);
++ dep = expr_alloc_and(expr_copy(basedep), dep);
++ dep = expr_eliminate_dups(dep);
++ if (menu->sym && menu->sym->type != S_TRISTATE)
++ dep = expr_trans_bool(dep);
++ prop->visible.expr = dep;
++ if (prop->type == P_SELECT) {
++ struct symbol *es = prop_get_symbol(prop);
++ es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
++ expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
++ }
++ }
++ }
++ for (menu = parent->list; menu; menu = menu->next)
++ menu_finalize(menu);
++ } else if (sym) {
++ basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
++ basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
++ basedep = expr_eliminate_dups(expr_transform(basedep));
++ last_menu = NULL;
++ for (menu = parent->next; menu; menu = menu->next) {
++ dep = menu->prompt ? menu->prompt->visible.expr : menu->dep;
++ if (!expr_contains_symbol(dep, sym))
++ break;
++ if (expr_depends_symbol(dep, sym))
++ goto next;
++ dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no);
++ dep = expr_eliminate_dups(expr_transform(dep));
++ dep2 = expr_copy(basedep);
++ expr_eliminate_eq(&dep, &dep2);
++ expr_free(dep);
++ if (!expr_is_yes(dep2)) {
++ expr_free(dep2);
++ break;
++ }
++ expr_free(dep2);
++ next:
++ menu_finalize(menu);
++ menu->parent = parent;
++ last_menu = menu;
++ }
++ if (last_menu) {
++ parent->list = parent->next;
++ parent->next = last_menu->next;
++ last_menu->next = NULL;
++ }
++ }
++ for (menu = parent->list; menu; menu = menu->next) {
++ if (sym && sym_is_choice(sym) && menu->sym) {
++ menu->sym->flags |= SYMBOL_CHOICEVAL;
++ if (!menu->prompt)
++ menu_warn(menu, "choice value must have a prompt");
++ for (prop = menu->sym->prop; prop; prop = prop->next) {
++ if (prop->type == P_PROMPT && prop->menu != menu) {
++ prop_warn(prop, "choice values "
++ "currently only support a "
++ "single prompt");
++ }
++ if (prop->type == P_DEFAULT)
++ prop_warn(prop, "defaults for choice "
++ "values not supported");
++ }
++ current_entry = menu;
++ menu_set_type(sym->type);
++ menu_add_symbol(P_CHOICE, sym, NULL);
++ prop = sym_get_choice_prop(sym);
++ for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr)
++ ;
++ *ep = expr_alloc_one(E_CHOICE, NULL);
++ (*ep)->right.sym = menu->sym;
++ }
++ if (menu->list && (!menu->prompt || !menu->prompt->text)) {
++ for (last_menu = menu->list; ; last_menu = last_menu->next) {
++ last_menu->parent = parent;
++ if (!last_menu->next)
++ break;
++ }
++ last_menu->next = menu->next;
++ menu->next = menu->list;
++ menu->list = NULL;
++ }
++ }
++
++ if (sym && !(sym->flags & SYMBOL_WARNED)) {
++ if (sym->type == S_UNKNOWN)
++ menu_warn(parent, "config symbol defined "
++ "without type\n");
++
++ if (sym_is_choice(sym) && !parent->prompt)
++ menu_warn(parent, "choice must have a prompt\n");
++
++ /* Check properties connected to this symbol */
++ sym_check_prop(sym);
++ sym->flags |= SYMBOL_WARNED;
++ }
++
++ if (sym && !sym_is_optional(sym) && parent->prompt) {
++ sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
++ expr_alloc_and(parent->prompt->visible.expr,
++ expr_alloc_symbol(&symbol_mod)));
++ }
++}
++
++bool menu_is_visible(struct menu *menu)
++{
++ struct menu *child;
++ struct symbol *sym;
++ tristate visible;
++
++ if (!menu->prompt)
++ return false;
++ sym = menu->sym;
++ if (sym) {
++ sym_calc_value(sym);
++ visible = menu->prompt->visible.tri;
++ } else
++ visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr);
++
++ if (visible != no)
++ return true;
++ if (!sym || sym_get_tristate_value(menu->sym) == no)
++ return false;
++
++ for (child = menu->list; child; child = child->next)
++ if (menu_is_visible(child))
++ return true;
++ return false;
++}
++
++const char *menu_get_prompt(struct menu *menu)
++{
++ if (menu->prompt)
++ return menu->prompt->text;
++ else if (menu->sym)
++ return menu->sym->name;
++ return NULL;
++}
++
++struct menu *menu_get_root_menu(struct menu *menu)
++{
++ return &rootmenu;
++}
++
++struct menu *menu_get_parent_menu(struct menu *menu)
++{
++ enum prop_type type;
++
++ for (; menu != &rootmenu; menu = menu->parent) {
++ type = menu->prompt ? menu->prompt->type : 0;
++ if (type == P_MENU)
++ break;
++ }
++ return menu;
++}
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mkconfigs b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mkconfigs
+new file mode 100755
+index 0000000..3cb7bb1
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mkconfigs
+@@ -0,0 +1,67 @@
++#!/bin/sh
++#
++# Copyright (C) 2002 Khalid Aziz <khalid_aziz at hp.com>
++# Copyright (C) 2002 Randy Dunlap <rddunlap at osdl.org>
++# Copyright (C) 2002 Al Stone <ahs3 at fc.hp.com>
++# Copyright (C) 2002 Hewlett-Packard Company
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++#
++# Busybox version by Matteo Croce <3297627799 at wind.it>
++#
++# Rules to generate bbconfig.h from .config:
++# - Retain lines that begin with "CONFIG_"
++# - Retain lines that begin with "# CONFIG_"
++# - lines that use double-quotes must \\-escape-quote them
++
++if [ $# -lt 1 ]
++then
++ config=.config
++else config=$1
++fi
++
++echo "#ifndef _BBCONFIG_H"
++echo "#define _BBCONFIG_H"
++echo \
++"/*
++ * busybox configuration options.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or (at
++ * your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
++ * NON INFRINGEMENT. See the GNU General Public License for more
++ * details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ *
++ *
++ * This file is generated automatically by scripts/config/mkconfigs.
++ * Do not edit.
++ *
++ */"
++
++echo "static char const bbconfig_config[] ="
++echo "\"CONFIG_BEGIN=n\\n\\"
++echo "`sed 's/\"/\\\\\"/g' $config | grep "^#\? \?CONFIG_" | awk '{ print $0 "\\\\n\\\\" }' `"
++echo "CONFIG_END=n\\n\";"
++echo "#endif /* _BBCONFIG_H */"
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/symbol.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/symbol.c
+new file mode 100644
+index 0000000..ea62972
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/symbol.c
+@@ -0,0 +1,809 @@
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#include <ctype.h>
++#include <stdlib.h>
++#include <string.h>
++#include <regex.h>
++#include <sys/utsname.h>
++
++#define LKC_DIRECT_LINK
++#include "lkc.h"
++
++struct symbol symbol_yes = {
++ .name = "y",
++ .curr = { "y", yes },
++ .flags = SYMBOL_YES|SYMBOL_VALID,
++}, symbol_mod = {
++ .name = "m",
++ .curr = { "m", mod },
++ .flags = SYMBOL_MOD|SYMBOL_VALID,
++}, symbol_no = {
++ .name = "n",
++ .curr = { "n", no },
++ .flags = SYMBOL_NO|SYMBOL_VALID,
++}, symbol_empty = {
++ .name = "",
++ .curr = { "", no },
++ .flags = SYMBOL_VALID,
++};
++
++int sym_change_count;
++struct symbol *modules_sym;
++tristate modules_val;
++
++void sym_add_default(struct symbol *sym, const char *def)
++{
++ struct property *prop = prop_alloc(P_DEFAULT, sym);
++
++ prop->expr = expr_alloc_symbol(sym_lookup(def, 1));
++}
++
++void sym_init(void)
++{
++ struct symbol *sym;
++ char *p;
++ static bool inited = false;
++
++ if (inited)
++ return;
++ inited = true;
++
++ sym = sym_lookup("VERSION", 0);
++ sym->type = S_STRING;
++ sym->flags |= SYMBOL_AUTO;
++ p = getenv("VERSION");
++ if (p)
++ sym_add_default(sym, p);
++
++ sym = sym_lookup("TARGET_ARCH", 0);
++ sym->type = S_STRING;
++ sym->flags |= SYMBOL_AUTO;
++ p = getenv("TARGET_ARCH");
++ if (p)
++ sym_add_default(sym, p);
++
++}
++
++enum symbol_type sym_get_type(struct symbol *sym)
++{
++ enum symbol_type type = sym->type;
++
++ if (type == S_TRISTATE) {
++ if (sym_is_choice_value(sym) && sym->visible == yes)
++ type = S_BOOLEAN;
++ else if (modules_val == no)
++ type = S_BOOLEAN;
++ }
++ return type;
++}
++
++const char *sym_type_name(enum symbol_type type)
++{
++ switch (type) {
++ case S_BOOLEAN:
++ return "boolean";
++ case S_TRISTATE:
++ return "tristate";
++ case S_INT:
++ return "integer";
++ case S_HEX:
++ return "hex";
++ case S_STRING:
++ return "string";
++ case S_UNKNOWN:
++ return "unknown";
++ case S_OTHER:
++ break;
++ }
++ return "???";
++}
++
++struct property *sym_get_choice_prop(struct symbol *sym)
++{
++ struct property *prop;
++
++ for_all_choices(sym, prop)
++ return prop;
++ return NULL;
++}
++
++struct property *sym_get_default_prop(struct symbol *sym)
++{
++ struct property *prop;
++
++ for_all_defaults(sym, prop) {
++ prop->visible.tri = expr_calc_value(prop->visible.expr);
++ if (prop->visible.tri != no)
++ return prop;
++ }
++ return NULL;
++}
++
++struct property *sym_get_range_prop(struct symbol *sym)
++{
++ struct property *prop;
++
++ for_all_properties(sym, prop, P_RANGE) {
++ prop->visible.tri = expr_calc_value(prop->visible.expr);
++ if (prop->visible.tri != no)
++ return prop;
++ }
++ return NULL;
++}
++
++static void sym_calc_visibility(struct symbol *sym)
++{
++ struct property *prop;
++ tristate tri;
++
++ /* any prompt visible? */
++ tri = no;
++ for_all_prompts(sym, prop) {
++ prop->visible.tri = expr_calc_value(prop->visible.expr);
++ tri = E_OR(tri, prop->visible.tri);
++ }
++ if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
++ tri = yes;
++ if (sym->visible != tri) {
++ sym->visible = tri;
++ sym_set_changed(sym);
++ }
++ if (sym_is_choice_value(sym))
++ return;
++ tri = no;
++ if (sym->rev_dep.expr)
++ tri = expr_calc_value(sym->rev_dep.expr);
++ if (tri == mod && sym_get_type(sym) == S_BOOLEAN)
++ tri = yes;
++ if (sym->rev_dep.tri != tri) {
++ sym->rev_dep.tri = tri;
++ sym_set_changed(sym);
++ }
++}
++
++static struct symbol *sym_calc_choice(struct symbol *sym)
++{
++ struct symbol *def_sym;
++ struct property *prop;
++ struct expr *e;
++
++ /* is the user choice visible? */
++ def_sym = sym->user.val;
++ if (def_sym) {
++ sym_calc_visibility(def_sym);
++ if (def_sym->visible != no)
++ return def_sym;
++ }
++
++ /* any of the defaults visible? */
++ for_all_defaults(sym, prop) {
++ prop->visible.tri = expr_calc_value(prop->visible.expr);
++ if (prop->visible.tri == no)
++ continue;
++ def_sym = prop_get_symbol(prop);
++ sym_calc_visibility(def_sym);
++ if (def_sym->visible != no)
++ return def_sym;
++ }
++
++ /* just get the first visible value */
++ prop = sym_get_choice_prop(sym);
++ for (e = prop->expr; e; e = e->left.expr) {
++ def_sym = e->right.sym;
++ sym_calc_visibility(def_sym);
++ if (def_sym->visible != no)
++ return def_sym;
++ }
++
++ /* no choice? reset tristate value */
++ sym->curr.tri = no;
++ return NULL;
++}
++
++void sym_calc_value(struct symbol *sym)
++{
++ struct symbol_value newval, oldval;
++ struct property *prop;
++ struct expr *e;
++
++ if (!sym)
++ return;
++
++ if (sym->flags & SYMBOL_VALID)
++ return;
++ sym->flags |= SYMBOL_VALID;
++
++ oldval = sym->curr;
++
++ switch (sym->type) {
++ case S_INT:
++ case S_HEX:
++ case S_STRING:
++ newval = symbol_empty.curr;
++ break;
++ case S_BOOLEAN:
++ case S_TRISTATE:
++ newval = symbol_no.curr;
++ break;
++ default:
++ sym->curr.val = sym->name;
++ sym->curr.tri = no;
++ return;
++ }
++ if (!sym_is_choice_value(sym))
++ sym->flags &= ~SYMBOL_WRITE;
++
++ sym_calc_visibility(sym);
++
++ /* set default if recursively called */
++ sym->curr = newval;
++
++ switch (sym_get_type(sym)) {
++ case S_BOOLEAN:
++ case S_TRISTATE:
++ if (sym_is_choice_value(sym) && sym->visible == yes) {
++ prop = sym_get_choice_prop(sym);
++ newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
++ } else if (E_OR(sym->visible, sym->rev_dep.tri) != no) {
++ sym->flags |= SYMBOL_WRITE;
++ if (sym_has_value(sym))
++ newval.tri = sym->user.tri;
++ else if (!sym_is_choice(sym)) {
++ prop = sym_get_default_prop(sym);
++ if (prop)
++ newval.tri = expr_calc_value(prop->expr);
++ }
++ newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri);
++ } else if (!sym_is_choice(sym)) {
++ prop = sym_get_default_prop(sym);
++ if (prop) {
++ sym->flags |= SYMBOL_WRITE;
++ newval.tri = expr_calc_value(prop->expr);
++ }
++ }
++ if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
++ newval.tri = yes;
++ break;
++ case S_STRING:
++ case S_HEX:
++ case S_INT:
++ if (sym->visible != no) {
++ sym->flags |= SYMBOL_WRITE;
++ if (sym_has_value(sym)) {
++ newval.val = sym->user.val;
++ break;
++ }
++ }
++ prop = sym_get_default_prop(sym);
++ if (prop) {
++ struct symbol *ds = prop_get_symbol(prop);
++ if (ds) {
++ sym->flags |= SYMBOL_WRITE;
++ sym_calc_value(ds);
++ newval.val = ds->curr.val;
++ }
++ }
++ break;
++ default:
++ ;
++ }
++
++ sym->curr = newval;
++ if (sym_is_choice(sym) && newval.tri == yes)
++ sym->curr.val = sym_calc_choice(sym);
++
++ if (memcmp(&oldval, &sym->curr, sizeof(oldval)))
++ sym_set_changed(sym);
++ if (modules_sym == sym)
++ modules_val = modules_sym->curr.tri;
++
++ if (sym_is_choice(sym)) {
++ int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
++ prop = sym_get_choice_prop(sym);
++ for (e = prop->expr; e; e = e->left.expr) {
++ e->right.sym->flags |= flags;
++ if (flags & SYMBOL_CHANGED)
++ sym_set_changed(e->right.sym);
++ }
++ }
++}
++
++void sym_clear_all_valid(void)
++{
++ struct symbol *sym;
++ int i;
++
++ for_all_symbols(i, sym)
++ sym->flags &= ~SYMBOL_VALID;
++ sym_change_count++;
++ if (modules_sym)
++ sym_calc_value(modules_sym);
++}
++
++void sym_set_changed(struct symbol *sym)
++{
++ struct property *prop;
++
++ sym->flags |= SYMBOL_CHANGED;
++ for (prop = sym->prop; prop; prop = prop->next) {
++ if (prop->menu)
++ prop->menu->flags |= MENU_CHANGED;
++ }
++}
++
++void sym_set_all_changed(void)
++{
++ struct symbol *sym;
++ int i;
++
++ for_all_symbols(i, sym)
++ sym_set_changed(sym);
++}
++
++bool sym_tristate_within_range(struct symbol *sym, tristate val)
++{
++ int type = sym_get_type(sym);
++
++ if (sym->visible == no)
++ return false;
++
++ if (type != S_BOOLEAN && type != S_TRISTATE)
++ return false;
++
++ if (type == S_BOOLEAN && val == mod)
++ return false;
++ if (sym->visible <= sym->rev_dep.tri)
++ return false;
++ if (sym_is_choice_value(sym) && sym->visible == yes)
++ return val == yes;
++ return val >= sym->rev_dep.tri && val <= sym->visible;
++}
++
++bool sym_set_tristate_value(struct symbol *sym, tristate val)
++{
++ tristate oldval = sym_get_tristate_value(sym);
++
++ if (oldval != val && !sym_tristate_within_range(sym, val))
++ return false;
++
++ if (sym->flags & SYMBOL_NEW) {
++ sym->flags &= ~SYMBOL_NEW;
++ sym_set_changed(sym);
++ }
++ if (sym_is_choice_value(sym) && val == yes) {
++ struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
++
++ cs->user.val = sym;
++ cs->flags &= ~SYMBOL_NEW;
++ }
++
++ sym->user.tri = val;
++ if (oldval != val) {
++ sym_clear_all_valid();
++ if (sym == modules_sym)
++ sym_set_all_changed();
++ }
++
++ return true;
++}
++
++tristate sym_toggle_tristate_value(struct symbol *sym)
++{
++ tristate oldval, newval;
++
++ oldval = newval = sym_get_tristate_value(sym);
++ do {
++ switch (newval) {
++ case no:
++ newval = mod;
++ break;
++ case mod:
++ newval = yes;
++ break;
++ case yes:
++ newval = no;
++ break;
++ }
++ if (sym_set_tristate_value(sym, newval))
++ break;
++ } while (oldval != newval);
++ return newval;
++}
++
++bool sym_string_valid(struct symbol *sym, const char *str)
++{
++ signed char ch;
++
++ switch (sym->type) {
++ case S_STRING:
++ return true;
++ case S_INT:
++ ch = *str++;
++ if (ch == '-')
++ ch = *str++;
++ if (!isdigit(ch))
++ return false;
++ if (ch == '0' && *str != 0)
++ return false;
++ while ((ch = *str++)) {
++ if (!isdigit(ch))
++ return false;
++ }
++ return true;
++ case S_HEX:
++ if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
++ str += 2;
++ ch = *str++;
++ do {
++ if (!isxdigit(ch))
++ return false;
++ } while ((ch = *str++));
++ return true;
++ case S_BOOLEAN:
++ case S_TRISTATE:
++ switch (str[0]) {
++ case 'y': case 'Y':
++ case 'm': case 'M':
++ case 'n': case 'N':
++ return true;
++ }
++ return false;
++ default:
++ return false;
++ }
++}
++
++bool sym_string_within_range(struct symbol *sym, const char *str)
++{
++ struct property *prop;
++ int val;
++
++ switch (sym->type) {
++ case S_STRING:
++ return sym_string_valid(sym, str);
++ case S_INT:
++ if (!sym_string_valid(sym, str))
++ return false;
++ prop = sym_get_range_prop(sym);
++ if (!prop)
++ return true;
++ val = strtol(str, NULL, 10);
++ return val >= strtol(prop->expr->left.sym->name, NULL, 10) &&
++ val <= strtol(prop->expr->right.sym->name, NULL, 10);
++ case S_HEX:
++ if (!sym_string_valid(sym, str))
++ return false;
++ prop = sym_get_range_prop(sym);
++ if (!prop)
++ return true;
++ val = strtol(str, NULL, 16);
++ return val >= strtol(prop->expr->left.sym->name, NULL, 16) &&
++ val <= strtol(prop->expr->right.sym->name, NULL, 16);
++ case S_BOOLEAN:
++ case S_TRISTATE:
++ switch (str[0]) {
++ case 'y': case 'Y':
++ return sym_tristate_within_range(sym, yes);
++ case 'm': case 'M':
++ return sym_tristate_within_range(sym, mod);
++ case 'n': case 'N':
++ return sym_tristate_within_range(sym, no);
++ }
++ return false;
++ default:
++ return false;
++ }
++}
++
++bool sym_set_string_value(struct symbol *sym, const char *newval)
++{
++ const char *oldval;
++ char *val;
++ int size;
++
++ switch (sym->type) {
++ case S_BOOLEAN:
++ case S_TRISTATE:
++ switch (newval[0]) {
++ case 'y': case 'Y':
++ return sym_set_tristate_value(sym, yes);
++ case 'm': case 'M':
++ return sym_set_tristate_value(sym, mod);
++ case 'n': case 'N':
++ return sym_set_tristate_value(sym, no);
++ }
++ return false;
++ default:
++ ;
++ }
++
++ if (!sym_string_within_range(sym, newval))
++ return false;
++
++ if (sym->flags & SYMBOL_NEW) {
++ sym->flags &= ~SYMBOL_NEW;
++ sym_set_changed(sym);
++ }
++
++ oldval = sym->user.val;
++ size = strlen(newval) + 1;
++ if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) {
++ size += 2;
++ sym->user.val = val = malloc(size);
++ *val++ = '0';
++ *val++ = 'x';
++ } else if (!oldval || strcmp(oldval, newval))
++ sym->user.val = val = malloc(size);
++ else
++ return true;
++
++ strcpy(val, newval);
++ free((void *)oldval);
++ sym_clear_all_valid();
++
++ return true;
++}
++
++const char *sym_get_string_value(struct symbol *sym)
++{
++ tristate val;
++
++ switch (sym->type) {
++ case S_BOOLEAN:
++ case S_TRISTATE:
++ val = sym_get_tristate_value(sym);
++ switch (val) {
++ case no:
++ return "n";
++ case mod:
++ return "m";
++ case yes:
++ return "y";
++ }
++ break;
++ default:
++ ;
++ }
++ return (const char *)sym->curr.val;
++}
++
++bool sym_is_changable(struct symbol *sym)
++{
++ return sym->visible > sym->rev_dep.tri;
++}
++
++struct symbol *sym_lookup(const char *name, int isconst)
++{
++ struct symbol *symbol;
++ const char *ptr;
++ char *new_name;
++ int hash = 0;
++
++ if (name) {
++ if (name[0] && !name[1]) {
++ switch (name[0]) {
++ case 'y': return &symbol_yes;
++ case 'm': return &symbol_mod;
++ case 'n': return &symbol_no;
++ }
++ }
++ for (ptr = name; *ptr; ptr++)
++ hash += *ptr;
++ hash &= 0xff;
++
++ for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
++ if (!strcmp(symbol->name, name)) {
++ if ((isconst && symbol->flags & SYMBOL_CONST) ||
++ (!isconst && !(symbol->flags & SYMBOL_CONST)))
++ return symbol;
++ }
++ }
++ new_name = strdup(name);
++ } else {
++ new_name = NULL;
++ hash = 256;
++ }
++
++ symbol = malloc(sizeof(*symbol));
++ memset(symbol, 0, sizeof(*symbol));
++ symbol->name = new_name;
++ symbol->type = S_UNKNOWN;
++ symbol->flags = SYMBOL_NEW;
++ if (isconst)
++ symbol->flags |= SYMBOL_CONST;
++
++ symbol->next = symbol_hash[hash];
++ symbol_hash[hash] = symbol;
++
++ return symbol;
++}
++
++struct symbol *sym_find(const char *name)
++{
++ struct symbol *symbol = NULL;
++ const char *ptr;
++ int hash = 0;
++
++ if (!name)
++ return NULL;
++
++ if (name[0] && !name[1]) {
++ switch (name[0]) {
++ case 'y': return &symbol_yes;
++ case 'm': return &symbol_mod;
++ case 'n': return &symbol_no;
++ }
++ }
++ for (ptr = name; *ptr; ptr++)
++ hash += *ptr;
++ hash &= 0xff;
++
++ for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
++ if (!strcmp(symbol->name, name) &&
++ !(symbol->flags & SYMBOL_CONST))
++ break;
++ }
++
++ return symbol;
++}
++
++struct symbol **sym_re_search(const char *pattern)
++{
++ struct symbol *sym, **sym_arr = NULL;
++ int i, cnt, size;
++ regex_t re;
++
++ cnt = size = 0;
++ /* Skip if empty */
++ if (strlen(pattern) == 0)
++ return NULL;
++ if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE))
++ return NULL;
++
++ for_all_symbols(i, sym) {
++ if (sym->flags & SYMBOL_CONST || !sym->name)
++ continue;
++ if (regexec(&re, sym->name, 0, NULL, 0))
++ continue;
++ if (cnt + 1 >= size) {
++ void *tmp = sym_arr;
++ size += 16;
++ sym_arr = realloc(sym_arr, size * sizeof(struct symbol *));
++ if (!sym_arr) {
++ free(tmp);
++ return NULL;
++ }
++ }
++ sym_arr[cnt++] = sym;
++ }
++ if (sym_arr)
++ sym_arr[cnt] = NULL;
++ regfree(&re);
++
++ return sym_arr;
++}
++
++
++struct symbol *sym_check_deps(struct symbol *sym);
++
++static struct symbol *sym_check_expr_deps(struct expr *e)
++{
++ struct symbol *sym;
++
++ if (!e)
++ return NULL;
++ switch (e->type) {
++ case E_OR:
++ case E_AND:
++ sym = sym_check_expr_deps(e->left.expr);
++ if (sym)
++ return sym;
++ return sym_check_expr_deps(e->right.expr);
++ case E_NOT:
++ return sym_check_expr_deps(e->left.expr);
++ case E_EQUAL:
++ case E_UNEQUAL:
++ sym = sym_check_deps(e->left.sym);
++ if (sym)
++ return sym;
++ return sym_check_deps(e->right.sym);
++ case E_SYMBOL:
++ return sym_check_deps(e->left.sym);
++ default:
++ break;
++ }
++ printf("Oops! How to check %d?\n", e->type);
++ return NULL;
++}
++
++struct symbol *sym_check_deps(struct symbol *sym)
++{
++ struct symbol *sym2;
++ struct property *prop;
++
++ if (sym->flags & SYMBOL_CHECK_DONE)
++ return NULL;
++ if (sym->flags & SYMBOL_CHECK) {
++ printf("Warning! Found recursive dependency: %s", sym->name);
++ return sym;
++ }
++
++ sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
++ sym2 = sym_check_expr_deps(sym->rev_dep.expr);
++ if (sym2)
++ goto out;
++
++ for (prop = sym->prop; prop; prop = prop->next) {
++ if (prop->type == P_CHOICE || prop->type == P_SELECT)
++ continue;
++ sym2 = sym_check_expr_deps(prop->visible.expr);
++ if (sym2)
++ goto out;
++ if (prop->type != P_DEFAULT || sym_is_choice(sym))
++ continue;
++ sym2 = sym_check_expr_deps(prop->expr);
++ if (sym2)
++ goto out;
++ }
++out:
++ if (sym2)
++ printf(" %s", sym->name);
++ sym->flags &= ~SYMBOL_CHECK;
++ return sym2;
++}
++
++struct property *prop_alloc(enum prop_type type, struct symbol *sym)
++{
++ struct property *prop;
++ struct property **propp;
++
++ prop = malloc(sizeof(*prop));
++ memset(prop, 0, sizeof(*prop));
++ prop->type = type;
++ prop->sym = sym;
++ prop->file = current_file;
++ prop->lineno = zconf_lineno();
++
++ /* append property to the prop list of symbol */
++ if (sym) {
++ for (propp = &sym->prop; *propp; propp = &(*propp)->next)
++ ;
++ *propp = prop;
++ }
++
++ return prop;
++}
++
++struct symbol *prop_get_symbol(struct property *prop)
++{
++ if (prop->expr && (prop->expr->type == E_SYMBOL ||
++ prop->expr->type == E_CHOICE))
++ return prop->expr->left.sym;
++ return NULL;
++}
++
++const char *prop_get_type_name(enum prop_type type)
++{
++ switch (type) {
++ case P_PROMPT:
++ return "prompt";
++ case P_COMMENT:
++ return "comment";
++ case P_MENU:
++ return "menu";
++ case P_DEFAULT:
++ return "default";
++ case P_CHOICE:
++ return "choice";
++ case P_SELECT:
++ return "select";
++ case P_RANGE:
++ return "range";
++ case P_UNKNOWN:
++ break;
++ }
++ return "unknown";
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/util.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/util.c
+new file mode 100644
+index 0000000..8fc95a2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/util.c
+@@ -0,0 +1,109 @@
++/*
++ * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org>
++ * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org>
++ *
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#include <string.h>
++#include "lkc.h"
++
++/* file already present in list? If not add it */
++struct file *file_lookup(const char *name)
++{
++ struct file *file;
++
++ for (file = file_list; file; file = file->next) {
++ if (!strcmp(name, file->name))
++ return file;
++ }
++
++ file = malloc(sizeof(*file));
++ memset(file, 0, sizeof(*file));
++ file->name = strdup(name);
++ file->next = file_list;
++ file_list = file;
++ return file;
++}
++
++/* write a dependency file as used by kbuild to track dependencies */
++int file_write_dep(const char *name)
++{
++ struct file *file;
++ FILE *out;
++
++ if (!name)
++ name = "config/.config.cmd";
++ out = fopen("config/.config.tmp", "w");
++ if (!out)
++ return 1;
++ fprintf(out, "deps_config := \\\n");
++ for (file = file_list; file; file = file->next) {
++ if (file->next)
++ fprintf(out, "\t%s \\\n", file->name);
++ else
++ fprintf(out, "\t%s\n", file->name);
++ }
++ fprintf(out, "\n.config include/config.h: $(deps_config)\n\n$(deps_config):\n");
++ fclose(out);
++ rename(".config.tmp", name);
++ return 0;
++}
++
++
++/* Allocate initial growable sting */
++struct gstr str_new(void)
++{
++ struct gstr gs;
++ gs.s = malloc(sizeof(char) * 64);
++ gs.len = 16;
++ strcpy(gs.s, "\0");
++ return gs;
++}
++
++/* Allocate and assign growable string */
++struct gstr str_assign(const char *s)
++{
++ struct gstr gs;
++ gs.s = strdup(s);
++ gs.len = strlen(s) + 1;
++ return gs;
++}
++
++/* Free storage for growable string */
++void str_free(struct gstr *gs)
++{
++ if (gs->s)
++ free(gs->s);
++ gs->s = NULL;
++ gs->len = 0;
++}
++
++/* Append to growable string */
++void str_append(struct gstr *gs, const char *s)
++{
++ size_t l = strlen(gs->s) + strlen(s) + 1;
++ if (l > gs->len) {
++ gs->s = realloc(gs->s, l);
++ gs->len = l;
++ }
++ strcat(gs->s, s);
++}
++
++/* Append printf formatted string to growable string */
++void str_printf(struct gstr *gs, const char *fmt, ...)
++{
++ va_list ap;
++ char s[10000]; /* big enough... */
++ va_start(ap, fmt);
++ vsnprintf(s, sizeof(s), fmt, ap);
++ str_append(gs, s);
++ va_end(ap);
++}
++
++/* Retreive value of growable string */
++const char *str_get(struct gstr *gs)
++{
++ return gs->s;
++}
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.l b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.l
+new file mode 100644
+index 0000000..55517b2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.l
+@@ -0,0 +1,366 @@
++%option backup nostdinit noyywrap never-interactive full ecs
++%option 8bit backup nodefault perf-report perf-report
++%x COMMAND HELP STRING PARAM
++%{
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#include <limits.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++
++#define LKC_DIRECT_LINK
++#include "lkc.h"
++
++#define START_STRSIZE 16
++
++char *text;
++static char *text_ptr;
++static int text_size, text_asize;
++
++struct buffer {
++ struct buffer *parent;
++ YY_BUFFER_STATE state;
++};
++
++struct buffer *current_buf;
++
++static int last_ts, first_ts;
++
++static void zconf_endhelp(void);
++static struct buffer *zconf_endfile(void);
++
++void new_string(void)
++{
++ text = malloc(START_STRSIZE);
++ text_asize = START_STRSIZE;
++ text_ptr = text;
++ text_size = 0;
++ *text_ptr = 0;
++}
++
++void append_string(const char *str, int size)
++{
++ int new_size = text_size + size + 1;
++ if (new_size > text_asize) {
++ text = realloc(text, new_size);
++ text_asize = new_size;
++ text_ptr = text + text_size;
++ }
++ memcpy(text_ptr, str, size);
++ text_ptr += size;
++ text_size += size;
++ *text_ptr = 0;
++}
++
++void alloc_string(const char *str, int size)
++{
++ text = malloc(size + 1);
++ memcpy(text, str, size);
++ text[size] = 0;
++}
++%}
++
++ws [ \n\t]
++n [A-Za-z0-9_]
++
++%%
++ int str = 0;
++ int ts, i;
++
++[ \t]*#.*\n current_file->lineno++;
++[ \t]*#.*
++
++[ \t]*\n current_file->lineno++; return T_EOL;
++
++[ \t]+ {
++ BEGIN(COMMAND);
++}
++
++. {
++ unput(yytext[0]);
++ BEGIN(COMMAND);
++}
++
++
++<COMMAND>{
++ "mainmenu" BEGIN(PARAM); return T_MAINMENU;
++ "menu" BEGIN(PARAM); return T_MENU;
++ "endmenu" BEGIN(PARAM); return T_ENDMENU;
++ "source" BEGIN(PARAM); return T_SOURCE;
++ "choice" BEGIN(PARAM); return T_CHOICE;
++ "endchoice" BEGIN(PARAM); return T_ENDCHOICE;
++ "comment" BEGIN(PARAM); return T_COMMENT;
++ "config" BEGIN(PARAM); return T_CONFIG;
++ "menuconfig" BEGIN(PARAM); return T_MENUCONFIG;
++ "help" BEGIN(PARAM); return T_HELP;
++ "if" BEGIN(PARAM); return T_IF;
++ "endif" BEGIN(PARAM); return T_ENDIF;
++ "depends" BEGIN(PARAM); return T_DEPENDS;
++ "requires" BEGIN(PARAM); return T_REQUIRES;
++ "optional" BEGIN(PARAM); return T_OPTIONAL;
++ "default" BEGIN(PARAM); return T_DEFAULT;
++ "prompt" BEGIN(PARAM); return T_PROMPT;
++ "tristate" BEGIN(PARAM); return T_TRISTATE;
++ "def_tristate" BEGIN(PARAM); return T_DEF_TRISTATE;
++ "bool" BEGIN(PARAM); return T_BOOLEAN;
++ "boolean" BEGIN(PARAM); return T_BOOLEAN;
++ "def_bool" BEGIN(PARAM); return T_DEF_BOOLEAN;
++ "def_boolean" BEGIN(PARAM); return T_DEF_BOOLEAN;
++ "int" BEGIN(PARAM); return T_INT;
++ "hex" BEGIN(PARAM); return T_HEX;
++ "string" BEGIN(PARAM); return T_STRING;
++ "select" BEGIN(PARAM); return T_SELECT;
++ "enable" BEGIN(PARAM); return T_SELECT;
++ "range" BEGIN(PARAM); return T_RANGE;
++ {n}+ {
++ alloc_string(yytext, yyleng);
++ zconflval.string = text;
++ return T_WORD;
++ }
++ .
++ \n current_file->lineno++; BEGIN(INITIAL);
++}
++
++<PARAM>{
++ "&&" return T_AND;
++ "||" return T_OR;
++ "(" return T_OPEN_PAREN;
++ ")" return T_CLOSE_PAREN;
++ "!" return T_NOT;
++ "=" return T_EQUAL;
++ "!=" return T_UNEQUAL;
++ "if" return T_IF;
++ "on" return T_ON;
++ \"|\' {
++ str = yytext[0];
++ new_string();
++ BEGIN(STRING);
++ }
++ \n BEGIN(INITIAL); current_file->lineno++; return T_EOL;
++ --- /* ignore */
++ ({n}|[-/.])+ {
++ alloc_string(yytext, yyleng);
++ zconflval.string = text;
++ return T_WORD;
++ }
++ #.* /* comment */
++ \\\n current_file->lineno++;
++ .
++ <<EOF>> {
++ BEGIN(INITIAL);
++ }
++}
++
++<STRING>{
++ [^'"\\\n]+/\n {
++ append_string(yytext, yyleng);
++ zconflval.string = text;
++ return T_WORD_QUOTE;
++ }
++ [^'"\\\n]+ {
++ append_string(yytext, yyleng);
++ }
++ \\.?/\n {
++ append_string(yytext + 1, yyleng - 1);
++ zconflval.string = text;
++ return T_WORD_QUOTE;
++ }
++ \\.? {
++ append_string(yytext + 1, yyleng - 1);
++ }
++ \'|\" {
++ if (str == yytext[0]) {
++ BEGIN(PARAM);
++ zconflval.string = text;
++ return T_WORD_QUOTE;
++ } else
++ append_string(yytext, 1);
++ }
++ \n {
++ printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
++ current_file->lineno++;
++ BEGIN(INITIAL);
++ return T_EOL;
++ }
++ <<EOF>> {
++ BEGIN(INITIAL);
++ }
++}
++
++<HELP>{
++ [ \t]+ {
++ ts = 0;
++ for (i = 0; i < yyleng; i++) {
++ if (yytext[i] == '\t')
++ ts = (ts & ~7) + 8;
++ else
++ ts++;
++ }
++ last_ts = ts;
++ if (first_ts) {
++ if (ts < first_ts) {
++ zconf_endhelp();
++ return T_HELPTEXT;
++ }
++ ts -= first_ts;
++ while (ts > 8) {
++ append_string(" ", 8);
++ ts -= 8;
++ }
++ append_string(" ", ts);
++ }
++ }
++ [ \t]*\n/[^ \t\n] {
++ current_file->lineno++;
++ zconf_endhelp();
++ return T_HELPTEXT;
++ }
++ [ \t]*\n {
++ current_file->lineno++;
++ append_string("\n", 1);
++ }
++ [^ \t\n].* {
++ append_string(yytext, yyleng);
++ if (!first_ts)
++ first_ts = last_ts;
++ }
++ <<EOF>> {
++ zconf_endhelp();
++ return T_HELPTEXT;
++ }
++}
++
++<<EOF>> {
++ if (current_buf) {
++ zconf_endfile();
++ return T_EOF;
++ }
++ fclose(yyin);
++ yyterminate();
++}
++
++%%
++void zconf_starthelp(void)
++{
++ new_string();
++ last_ts = first_ts = 0;
++ BEGIN(HELP);
++}
++
++static void zconf_endhelp(void)
++{
++ zconflval.string = text;
++ BEGIN(INITIAL);
++}
++
++
++/*
++ * Try to open specified file with following names:
++ * ./name
++ * $(srctree)/name
++ * The latter is used when srctree is separate from objtree
++ * when compiling the kernel.
++ * Return NULL if file is not found.
++ */
++FILE *zconf_fopen(const char *name)
++{
++ char *env, fullname[PATH_MAX+1];
++ FILE *f;
++
++ f = fopen(name, "r");
++ if (!f && name[0] != '/') {
++ env = getenv(SRCTREE);
++ if (env) {
++ sprintf(fullname, "%s/%s", env, name);
++ f = fopen(fullname, "r");
++ }
++ }
++ return f;
++}
++
++void zconf_initscan(const char *name)
++{
++ yyin = zconf_fopen(name);
++ if (!yyin) {
++ printf("can't find file %s\n", name);
++ exit(1);
++ }
++
++ current_buf = malloc(sizeof(*current_buf));
++ memset(current_buf, 0, sizeof(*current_buf));
++
++ current_file = file_lookup(name);
++ current_file->lineno = 1;
++ current_file->flags = FILE_BUSY;
++}
++
++void zconf_nextfile(const char *name)
++{
++ struct file *file = file_lookup(name);
++ struct buffer *buf = malloc(sizeof(*buf));
++ memset(buf, 0, sizeof(*buf));
++
++ current_buf->state = YY_CURRENT_BUFFER;
++ yyin = zconf_fopen(name);
++ if (!yyin) {
++ printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
++ exit(1);
++ }
++ yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
++ buf->parent = current_buf;
++ current_buf = buf;
++
++ if (file->flags & FILE_BUSY) {
++ printf("recursive scan (%s)?\n", name);
++ exit(1);
++ }
++ if (file->flags & FILE_SCANNED) {
++ printf("file %s already scanned?\n", name);
++ exit(1);
++ }
++ file->flags |= FILE_BUSY;
++ file->lineno = 1;
++ file->parent = current_file;
++ current_file = file;
++}
++
++static struct buffer *zconf_endfile(void)
++{
++ struct buffer *parent;
++
++ current_file->flags |= FILE_SCANNED;
++ current_file->flags &= ~FILE_BUSY;
++ current_file = current_file->parent;
++
++ parent = current_buf->parent;
++ if (parent) {
++ fclose(yyin);
++ yy_delete_buffer(YY_CURRENT_BUFFER);
++ yy_switch_to_buffer(parent->state);
++ }
++ free(current_buf);
++ current_buf = parent;
++
++ return parent;
++}
++
++int zconf_lineno(void)
++{
++ if (current_buf)
++ return current_file->lineno - 1;
++ else
++ return 0;
++}
++
++char *zconf_curname(void)
++{
++ if (current_buf)
++ return current_file->name;
++ else
++ return "<none>";
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.c_shipped b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.c_shipped
+new file mode 100644
+index 0000000..cc68dcb
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.c_shipped
+@@ -0,0 +1,2130 @@
++/* A Bison parser, made by GNU Bison 1.875a. */
++
++/* Skeleton parser for Yacc-like parsing with Bison,
++ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2, or (at your option)
++ any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 59 Temple Place - Suite 330,
++ Boston, MA 02111-1307, USA. */
++
++/* As a special exception, when this file is copied by Bison into a
++ Bison output file, you may use that output file without restriction.
++ This special exception was added by the Free Software Foundation
++ in version 1.24 of Bison. */
++
++/* Written by Richard Stallman by simplifying the original so called
++ ``semantic'' parser. */
++
++/* All symbols defined below should begin with yy or YY, to avoid
++ infringing on user name space. This should be done even for local
++ variables, as they might otherwise be expanded by user macros.
++ There are some unavoidable exceptions within include files to
++ define necessary library symbols; they are noted "INFRINGES ON
++ USER NAME SPACE" below. */
++
++/* Identify Bison output. */
++#define YYBISON 1
++
++/* Skeleton name. */
++#define YYSKELETON_NAME "yacc.c"
++
++/* Pure parsers. */
++#define YYPURE 0
++
++/* Using locations. */
++#define YYLSP_NEEDED 0
++
++/* If NAME_PREFIX is specified substitute the variables and functions
++ names. */
++#define yyparse zconfparse
++#define yylex zconflex
++#define yyerror zconferror
++#define yylval zconflval
++#define yychar zconfchar
++#define yydebug zconfdebug
++#define yynerrs zconfnerrs
++
++
++/* Tokens. */
++#ifndef YYTOKENTYPE
++# define YYTOKENTYPE
++ /* Put the tokens into the symbol table, so that GDB and other debuggers
++ know about them. */
++ enum yytokentype {
++ T_MAINMENU = 258,
++ T_MENU = 259,
++ T_ENDMENU = 260,
++ T_SOURCE = 261,
++ T_CHOICE = 262,
++ T_ENDCHOICE = 263,
++ T_COMMENT = 264,
++ T_CONFIG = 265,
++ T_MENUCONFIG = 266,
++ T_HELP = 267,
++ T_HELPTEXT = 268,
++ T_IF = 269,
++ T_ENDIF = 270,
++ T_DEPENDS = 271,
++ T_REQUIRES = 272,
++ T_OPTIONAL = 273,
++ T_PROMPT = 274,
++ T_DEFAULT = 275,
++ T_TRISTATE = 276,
++ T_DEF_TRISTATE = 277,
++ T_BOOLEAN = 278,
++ T_DEF_BOOLEAN = 279,
++ T_STRING = 280,
++ T_INT = 281,
++ T_HEX = 282,
++ T_WORD = 283,
++ T_WORD_QUOTE = 284,
++ T_UNEQUAL = 285,
++ T_EOF = 286,
++ T_EOL = 287,
++ T_CLOSE_PAREN = 288,
++ T_OPEN_PAREN = 289,
++ T_ON = 290,
++ T_SELECT = 291,
++ T_RANGE = 292,
++ T_OR = 293,
++ T_AND = 294,
++ T_EQUAL = 295,
++ T_NOT = 296
++ };
++#endif
++#define T_MAINMENU 258
++#define T_MENU 259
++#define T_ENDMENU 260
++#define T_SOURCE 261
++#define T_CHOICE 262
++#define T_ENDCHOICE 263
++#define T_COMMENT 264
++#define T_CONFIG 265
++#define T_MENUCONFIG 266
++#define T_HELP 267
++#define T_HELPTEXT 268
++#define T_IF 269
++#define T_ENDIF 270
++#define T_DEPENDS 271
++#define T_REQUIRES 272
++#define T_OPTIONAL 273
++#define T_PROMPT 274
++#define T_DEFAULT 275
++#define T_TRISTATE 276
++#define T_DEF_TRISTATE 277
++#define T_BOOLEAN 278
++#define T_DEF_BOOLEAN 279
++#define T_STRING 280
++#define T_INT 281
++#define T_HEX 282
++#define T_WORD 283
++#define T_WORD_QUOTE 284
++#define T_UNEQUAL 285
++#define T_EOF 286
++#define T_EOL 287
++#define T_CLOSE_PAREN 288
++#define T_OPEN_PAREN 289
++#define T_ON 290
++#define T_SELECT 291
++#define T_RANGE 292
++#define T_OR 293
++#define T_AND 294
++#define T_EQUAL 295
++#define T_NOT 296
++
++
++
++
++/* Copy the first part of user declarations. */
++
++
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#include <ctype.h>
++#include <stdarg.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <stdbool.h>
++
++#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
++
++#define PRINTD 0x0001
++#define DEBUG_PARSE 0x0002
++
++int cdebug = PRINTD;
++
++extern int zconflex(void);
++static void zconfprint(const char *err, ...);
++static void zconferror(const char *err);
++static bool zconf_endtoken(int token, int starttoken, int endtoken);
++
++struct symbol *symbol_hash[257];
++
++static struct menu *current_menu, *current_entry;
++
++#define YYERROR_VERBOSE
++
++
++/* Enabling traces. */
++#ifndef YYDEBUG
++# define YYDEBUG 0
++#endif
++
++/* Enabling verbose error messages. */
++#ifdef YYERROR_VERBOSE
++# undef YYERROR_VERBOSE
++# define YYERROR_VERBOSE 1
++#else
++# define YYERROR_VERBOSE 0
++#endif
++
++#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
++
++typedef union YYSTYPE {
++ int token;
++ char *string;
++ struct symbol *symbol;
++ struct expr *expr;
++ struct menu *menu;
++} YYSTYPE;
++/* Line 191 of yacc.c. */
++
++# define yystype YYSTYPE /* obsolescent; will be withdrawn */
++# define YYSTYPE_IS_DECLARED 1
++# define YYSTYPE_IS_TRIVIAL 1
++#endif
++
++
++
++/* Copy the second part of user declarations. */
++
++
++#define LKC_DIRECT_LINK
++#include "lkc.h"
++
++
++/* Line 214 of yacc.c. */
++
++
++#if ! defined (yyoverflow) || YYERROR_VERBOSE
++
++/* The parser invokes alloca or malloc; define the necessary symbols. */
++
++# if YYSTACK_USE_ALLOCA
++# define YYSTACK_ALLOC alloca
++# else
++# ifndef YYSTACK_USE_ALLOCA
++# if defined (alloca) || (defined (_ALLOCA_H) && defined (__GNUC__))
++# define YYSTACK_ALLOC alloca
++# else
++# ifdef __GNUC__
++# define YYSTACK_ALLOC __builtin_alloca
++# endif
++# endif
++# endif
++# endif
++
++# ifdef YYSTACK_ALLOC
++ /* Pacify GCC's `empty if-body' warning. */
++# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
++# else
++# if defined (__STDC__) || defined (__cplusplus)
++# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
++# define YYSIZE_T size_t
++# endif
++# define YYSTACK_ALLOC malloc
++# define YYSTACK_FREE free
++# endif
++#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
++
++
++#if (! defined (yyoverflow) \
++ && (! defined (__cplusplus) \
++ || (YYSTYPE_IS_TRIVIAL)))
++
++/* A type that is properly aligned for any stack member. */
++union yyalloc
++{
++ short yyss;
++ YYSTYPE yyvs;
++ };
++
++/* The size of the maximum gap between one aligned stack and the next. */
++# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
++
++/* The size of an array large to enough to hold all stacks, each with
++ N elements. */
++# define YYSTACK_BYTES(N) \
++ ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
++ + YYSTACK_GAP_MAXIMUM)
++
++/* Copy COUNT objects from FROM to TO. The source and destination do
++ not overlap. */
++# ifndef YYCOPY
++# if 1 < __GNUC__
++# define YYCOPY(To, From, Count) \
++ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
++# else
++# define YYCOPY(To, From, Count) \
++ do \
++ { \
++ register YYSIZE_T yyi; \
++ for (yyi = 0; yyi < (Count); yyi++) \
++ (To)[yyi] = (From)[yyi]; \
++ } \
++ while (0)
++# endif
++# endif
++
++/* Relocate STACK from its old location to the new one. The
++ local variables YYSIZE and YYSTACKSIZE give the old and new number of
++ elements in the stack, and YYPTR gives the new location of the
++ stack. Advance YYPTR to a properly aligned location for the next
++ stack. */
++# define YYSTACK_RELOCATE(Stack) \
++ do \
++ { \
++ YYSIZE_T yynewbytes; \
++ YYCOPY (&yyptr->Stack, Stack, yysize); \
++ Stack = &yyptr->Stack; \
++ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
++ yyptr += yynewbytes / sizeof (*yyptr); \
++ } \
++ while (0)
++
++#endif
++
++#if defined (__STDC__) || defined (__cplusplus)
++ typedef signed char yysigned_char;
++#else
++ typedef short yysigned_char;
++#endif
++
++/* YYFINAL -- State number of the termination state. */
++#define YYFINAL 2
++/* YYLAST -- Last index in YYTABLE. */
++#define YYLAST 201
++
++/* YYNTOKENS -- Number of terminals. */
++#define YYNTOKENS 42
++/* YYNNTS -- Number of nonterminals. */
++#define YYNNTS 41
++/* YYNRULES -- Number of rules. */
++#define YYNRULES 104
++/* YYNRULES -- Number of states. */
++#define YYNSTATES 182
++
++/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
++#define YYUNDEFTOK 2
++#define YYMAXUTOK 296
++
++#define YYTRANSLATE(YYX) \
++ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
++
++/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
++static const unsigned char yytranslate[] =
++{
++ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
++ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
++ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
++ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
++ 35, 36, 37, 38, 39, 40, 41
++};
++
++#if YYDEBUG
++/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
++ YYRHS. */
++static const unsigned short yyprhs[] =
++{
++ 0, 0, 3, 4, 7, 9, 11, 13, 17, 19,
++ 21, 23, 26, 28, 30, 32, 34, 36, 38, 42,
++ 45, 49, 52, 53, 56, 59, 62, 65, 69, 74,
++ 78, 83, 87, 91, 95, 100, 105, 110, 116, 119,
++ 122, 124, 128, 131, 132, 135, 138, 141, 144, 149,
++ 153, 157, 160, 165, 166, 169, 173, 175, 179, 182,
++ 183, 186, 189, 192, 196, 199, 201, 205, 208, 209,
++ 212, 215, 218, 222, 226, 228, 232, 235, 238, 241,
++ 242, 245, 248, 253, 257, 261, 262, 265, 267, 269,
++ 272, 275, 278, 280, 282, 283, 286, 288, 292, 296,
++ 300, 303, 307, 311, 313
++};
++
++/* YYRHS -- A `-1'-separated list of the rules' RHS. */
++static const yysigned_char yyrhs[] =
++{
++ 43, 0, -1, -1, 43, 44, -1, 45, -1, 55,
++ -1, 66, -1, 3, 77, 79, -1, 5, -1, 15,
++ -1, 8, -1, 1, 79, -1, 61, -1, 71, -1,
++ 47, -1, 49, -1, 69, -1, 79, -1, 10, 28,
++ 32, -1, 46, 50, -1, 11, 28, 32, -1, 48,
++ 50, -1, -1, 50, 51, -1, 50, 75, -1, 50,
++ 73, -1, 50, 32, -1, 21, 76, 32, -1, 22,
++ 81, 80, 32, -1, 23, 76, 32, -1, 24, 81,
++ 80, 32, -1, 26, 76, 32, -1, 27, 76, 32,
++ -1, 25, 76, 32, -1, 19, 77, 80, 32, -1,
++ 20, 81, 80, 32, -1, 36, 28, 80, 32, -1,
++ 37, 82, 82, 80, 32, -1, 7, 32, -1, 52,
++ 56, -1, 78, -1, 53, 58, 54, -1, 53, 58,
++ -1, -1, 56, 57, -1, 56, 75, -1, 56, 73,
++ -1, 56, 32, -1, 19, 77, 80, 32, -1, 21,
++ 76, 32, -1, 23, 76, 32, -1, 18, 32, -1,
++ 20, 28, 80, 32, -1, -1, 58, 45, -1, 14,
++ 81, 32, -1, 78, -1, 59, 62, 60, -1, 59,
++ 62, -1, -1, 62, 45, -1, 62, 66, -1, 62,
++ 55, -1, 4, 77, 32, -1, 63, 74, -1, 78,
++ -1, 64, 67, 65, -1, 64, 67, -1, -1, 67,
++ 45, -1, 67, 66, -1, 67, 55, -1, 67, 1,
++ 32, -1, 6, 77, 32, -1, 68, -1, 9, 77,
++ 32, -1, 70, 74, -1, 12, 32, -1, 72, 13,
++ -1, -1, 74, 75, -1, 74, 32, -1, 16, 35,
++ 81, 32, -1, 16, 81, 32, -1, 17, 81, 32,
++ -1, -1, 77, 80, -1, 28, -1, 29, -1, 5,
++ 79, -1, 8, 79, -1, 15, 79, -1, 32, -1,
++ 31, -1, -1, 14, 81, -1, 82, -1, 82, 40,
++ 82, -1, 82, 30, 82, -1, 34, 81, 33, -1,
++ 41, 81, -1, 81, 38, 81, -1, 81, 39, 81,
++ -1, 28, -1, 29, -1
++};
++
++/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
++static const unsigned short yyrline[] =
++{
++ 0, 94, 94, 95, 98, 99, 100, 101, 102, 103,
++ 104, 105, 109, 110, 111, 112, 113, 114, 120, 128,
++ 134, 142, 152, 154, 155, 156, 157, 160, 166, 173,
++ 179, 186, 192, 198, 204, 210, 216, 222, 230, 239,
++ 245, 254, 255, 261, 263, 264, 265, 266, 269, 275,
++ 281, 287, 293, 299, 301, 306, 315, 324, 325, 331,
++ 333, 334, 335, 340, 347, 353, 362, 363, 369, 371,
++ 372, 373, 374, 377, 383, 390, 397, 404, 410, 417,
++ 418, 419, 422, 427, 432, 440, 442, 447, 448, 451,
++ 452, 453, 457, 457, 459, 460, 463, 464, 465, 466,
++ 467, 468, 469, 472, 473
++};
++#endif
++
++#if YYDEBUG || YYERROR_VERBOSE
++/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
++ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
++static const char *const yytname[] =
++{
++ "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
++ "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
++ "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
++ "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE",
++ "T_DEF_TRISTATE", "T_BOOLEAN", "T_DEF_BOOLEAN", "T_STRING", "T_INT",
++ "T_HEX", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL", "T_EOF", "T_EOL",
++ "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_SELECT", "T_RANGE", "T_OR",
++ "T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block",
++ "common_block", "config_entry_start", "config_stmt",
++ "menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
++ "config_option", "choice", "choice_entry", "choice_end", "choice_stmt",
++ "choice_option_list", "choice_option", "choice_block", "if", "if_end",
++ "if_stmt", "if_block", "menu", "menu_entry", "menu_end", "menu_stmt",
++ "menu_block", "source", "source_stmt", "comment", "comment_stmt",
++ "help_start", "help", "depends_list", "depends", "prompt_stmt_opt",
++ "prompt", "end", "nl_or_eof", "if_expr", "expr", "symbol", 0
++};
++#endif
++
++# ifdef YYPRINT
++/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
++ token YYLEX-NUM. */
++static const unsigned short yytoknum[] =
++{
++ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
++ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
++ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
++ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
++ 295, 296
++};
++# endif
++
++/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
++static const unsigned char yyr1[] =
++{
++ 0, 42, 43, 43, 44, 44, 44, 44, 44, 44,
++ 44, 44, 45, 45, 45, 45, 45, 45, 46, 47,
++ 48, 49, 50, 50, 50, 50, 50, 51, 51, 51,
++ 51, 51, 51, 51, 51, 51, 51, 51, 52, 53,
++ 54, 55, 55, 56, 56, 56, 56, 56, 57, 57,
++ 57, 57, 57, 58, 58, 59, 60, 61, 61, 62,
++ 62, 62, 62, 63, 64, 65, 66, 66, 67, 67,
++ 67, 67, 67, 68, 69, 70, 71, 72, 73, 74,
++ 74, 74, 75, 75, 75, 76, 76, 77, 77, 78,
++ 78, 78, 79, 79, 80, 80, 81, 81, 81, 81,
++ 81, 81, 81, 82, 82
++};
++
++/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
++static const unsigned char yyr2[] =
++{
++ 0, 2, 0, 2, 1, 1, 1, 3, 1, 1,
++ 1, 2, 1, 1, 1, 1, 1, 1, 3, 2,
++ 3, 2, 0, 2, 2, 2, 2, 3, 4, 3,
++ 4, 3, 3, 3, 4, 4, 4, 5, 2, 2,
++ 1, 3, 2, 0, 2, 2, 2, 2, 4, 3,
++ 3, 2, 4, 0, 2, 3, 1, 3, 2, 0,
++ 2, 2, 2, 3, 2, 1, 3, 2, 0, 2,
++ 2, 2, 3, 3, 1, 3, 2, 2, 2, 0,
++ 2, 2, 4, 3, 3, 0, 2, 1, 1, 2,
++ 2, 2, 1, 1, 0, 2, 1, 3, 3, 3,
++ 2, 3, 3, 1, 1
++};
++
++/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
++ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
++ means the default is an error. */
++static const unsigned char yydefact[] =
++{
++ 2, 0, 1, 0, 0, 0, 8, 0, 0, 10,
++ 0, 0, 0, 0, 9, 93, 92, 3, 4, 22,
++ 14, 22, 15, 43, 53, 5, 59, 12, 79, 68,
++ 6, 74, 16, 79, 13, 17, 11, 87, 88, 0,
++ 0, 0, 38, 0, 0, 0, 103, 104, 0, 0,
++ 0, 96, 19, 21, 39, 42, 58, 64, 0, 76,
++ 7, 63, 73, 75, 18, 20, 0, 100, 55, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 85, 0,
++ 85, 0, 85, 85, 85, 26, 0, 0, 23, 0,
++ 25, 24, 0, 0, 0, 85, 85, 47, 44, 46,
++ 45, 0, 0, 0, 54, 41, 40, 60, 62, 57,
++ 61, 56, 81, 80, 0, 69, 71, 66, 70, 65,
++ 99, 101, 102, 98, 97, 77, 0, 0, 0, 94,
++ 94, 0, 94, 94, 0, 94, 0, 0, 0, 94,
++ 0, 78, 51, 94, 94, 0, 0, 89, 90, 91,
++ 72, 0, 83, 84, 0, 0, 0, 27, 86, 0,
++ 29, 0, 33, 31, 32, 0, 94, 0, 0, 49,
++ 50, 82, 95, 34, 35, 28, 30, 36, 0, 48,
++ 52, 37
++};
++
++/* YYDEFGOTO[NTERM-NUM]. */
++static const short yydefgoto[] =
++{
++ -1, 1, 17, 18, 19, 20, 21, 22, 52, 88,
++ 23, 24, 105, 25, 54, 98, 55, 26, 109, 27,
++ 56, 28, 29, 117, 30, 58, 31, 32, 33, 34,
++ 89, 90, 57, 91, 131, 132, 106, 35, 155, 50,
++ 51
++};
++
++/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
++ STATE-NUM. */
++#define YYPACT_NINF -99
++static const short yypact[] =
++{
++ -99, 48, -99, 38, 46, 46, -99, 46, -29, -99,
++ 46, -17, -3, -11, -99, -99, -99, -99, -99, -99,
++ -99, -99, -99, -99, -99, -99, -99, -99, -99, -99,
++ -99, -99, -99, -99, -99, -99, -99, -99, -99, 38,
++ 12, 15, -99, 18, 51, 62, -99, -99, -11, -11,
++ 4, -24, 138, 138, 160, 121, 110, -4, 81, -4,
++ -99, -99, -99, -99, -99, -99, -19, -99, -99, -11,
++ -11, 70, 70, 73, 32, -11, 46, -11, 46, -11,
++ 46, -11, 46, 46, 46, -99, 36, 70, -99, 95,
++ -99, -99, 96, 46, 106, 46, 46, -99, -99, -99,
++ -99, 38, 38, 38, -99, -99, -99, -99, -99, -99,
++ -99, -99, -99, -99, 112, -99, -99, -99, -99, -99,
++ -99, 117, -99, -99, -99, -99, -11, 33, 65, 131,
++ 1, 119, 131, 1, 136, 1, 153, 154, 155, 131,
++ 70, -99, -99, 131, 131, 156, 157, -99, -99, -99,
++ -99, 101, -99, -99, -11, 158, 159, -99, -99, 161,
++ -99, 162, -99, -99, -99, 163, 131, 164, 165, -99,
++ -99, -99, 99, -99, -99, -99, -99, -99, 166, -99,
++ -99, -99
++};
++
++/* YYPGOTO[NTERM-NUM]. */
++static const short yypgoto[] =
++{
++ -99, -99, -99, 111, -99, -99, -99, -99, 178, -99,
++ -99, -99, -99, 91, -99, -99, -99, -99, -99, -99,
++ -99, -99, -99, -99, 115, -99, -99, -99, -99, -99,
++ -99, 146, 168, 89, 27, 0, 126, -1, -98, -48,
++ -63
++};
++
++/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
++ positive, shift that token. If negative, reduce the rule which
++ number is the opposite. If zero, do what YYDEFACT says.
++ If YYTABLE_NINF, syntax error. */
++#define YYTABLE_NINF -68
++static const short yytable[] =
++{
++ 66, 67, 36, 42, 39, 40, 71, 41, 123, 124,
++ 43, 44, 74, 75, 120, 154, 72, 46, 47, 69,
++ 70, 121, 122, 48, 140, 45, 127, 128, 112, 130,
++ 49, 133, 156, 135, 158, 159, 68, 161, 60, 69,
++ 70, 165, 69, 70, 61, 167, 168, 62, 2, 3,
++ 63, 4, 5, 6, 7, 8, 9, 10, 11, 12,
++ 46, 47, 13, 14, 139, 152, 48, 126, 178, 15,
++ 16, 69, 70, 49, 37, 38, 129, 166, 151, 15,
++ 16, -67, 114, 64, -67, 5, 101, 7, 8, 102,
++ 10, 11, 12, 143, 65, 13, 103, 153, 46, 47,
++ 147, 148, 149, 69, 70, 125, 172, 134, 141, 136,
++ 137, 138, 15, 16, 5, 101, 7, 8, 102, 10,
++ 11, 12, 145, 146, 13, 103, 101, 7, 142, 102,
++ 10, 11, 12, 171, 144, 13, 103, 69, 70, 69,
++ 70, 15, 16, 100, 150, 154, 113, 108, 113, 116,
++ 73, 157, 15, 16, 74, 75, 70, 76, 77, 78,
++ 79, 80, 81, 82, 83, 84, 104, 107, 160, 115,
++ 85, 110, 73, 118, 86, 87, 74, 75, 92, 93,
++ 94, 95, 111, 96, 119, 162, 163, 164, 169, 170,
++ 173, 174, 97, 175, 176, 177, 179, 180, 181, 53,
++ 99, 59
++};
++
++static const unsigned char yycheck[] =
++{
++ 48, 49, 3, 32, 4, 5, 30, 7, 71, 72,
++ 10, 28, 16, 17, 33, 14, 40, 28, 29, 38,
++ 39, 69, 70, 34, 87, 28, 74, 75, 32, 77,
++ 41, 79, 130, 81, 132, 133, 32, 135, 39, 38,
++ 39, 139, 38, 39, 32, 143, 144, 32, 0, 1,
++ 32, 3, 4, 5, 6, 7, 8, 9, 10, 11,
++ 28, 29, 14, 15, 28, 32, 34, 35, 166, 31,
++ 32, 38, 39, 41, 28, 29, 76, 140, 126, 31,
++ 32, 0, 1, 32, 3, 4, 5, 6, 7, 8,
++ 9, 10, 11, 93, 32, 14, 15, 32, 28, 29,
++ 101, 102, 103, 38, 39, 32, 154, 80, 13, 82,
++ 83, 84, 31, 32, 4, 5, 6, 7, 8, 9,
++ 10, 11, 95, 96, 14, 15, 5, 6, 32, 8,
++ 9, 10, 11, 32, 28, 14, 15, 38, 39, 38,
++ 39, 31, 32, 54, 32, 14, 57, 56, 59, 58,
++ 12, 32, 31, 32, 16, 17, 39, 19, 20, 21,
++ 22, 23, 24, 25, 26, 27, 55, 56, 32, 58,
++ 32, 56, 12, 58, 36, 37, 16, 17, 18, 19,
++ 20, 21, 56, 23, 58, 32, 32, 32, 32, 32,
++ 32, 32, 32, 32, 32, 32, 32, 32, 32, 21,
++ 54, 33
++};
++
++/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
++ symbol of state STATE-NUM. */
++static const unsigned char yystos[] =
++{
++ 0, 43, 0, 1, 3, 4, 5, 6, 7, 8,
++ 9, 10, 11, 14, 15, 31, 32, 44, 45, 46,
++ 47, 48, 49, 52, 53, 55, 59, 61, 63, 64,
++ 66, 68, 69, 70, 71, 79, 79, 28, 29, 77,
++ 77, 77, 32, 77, 28, 28, 28, 29, 34, 41,
++ 81, 82, 50, 50, 56, 58, 62, 74, 67, 74,
++ 79, 32, 32, 32, 32, 32, 81, 81, 32, 38,
++ 39, 30, 40, 12, 16, 17, 19, 20, 21, 22,
++ 23, 24, 25, 26, 27, 32, 36, 37, 51, 72,
++ 73, 75, 18, 19, 20, 21, 23, 32, 57, 73,
++ 75, 5, 8, 15, 45, 54, 78, 45, 55, 60,
++ 66, 78, 32, 75, 1, 45, 55, 65, 66, 78,
++ 33, 81, 81, 82, 82, 32, 35, 81, 81, 77,
++ 81, 76, 77, 81, 76, 81, 76, 76, 76, 28,
++ 82, 13, 32, 77, 28, 76, 76, 79, 79, 79,
++ 32, 81, 32, 32, 14, 80, 80, 32, 80, 80,
++ 32, 80, 32, 32, 32, 80, 82, 80, 80, 32,
++ 32, 32, 81, 32, 32, 32, 32, 32, 80, 32,
++ 32, 32
++};
++
++#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
++# define YYSIZE_T __SIZE_TYPE__
++#endif
++#if ! defined (YYSIZE_T) && defined (size_t)
++# define YYSIZE_T size_t
++#endif
++#if ! defined (YYSIZE_T)
++# if defined (__STDC__) || defined (__cplusplus)
++# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
++# define YYSIZE_T size_t
++# endif
++#endif
++#if ! defined (YYSIZE_T)
++# define YYSIZE_T unsigned int
++#endif
++
++#define yyerrok (yyerrstatus = 0)
++#define yyclearin (yychar = YYEMPTY)
++#define YYEMPTY (-2)
++#define YYEOF 0
++
++#define YYACCEPT goto yyacceptlab
++#define YYABORT goto yyabortlab
++#define YYERROR goto yyerrlab1
++
++
++/* Like YYERROR except do call yyerror. This remains here temporarily
++ to ease the transition to the new meaning of YYERROR, for GCC.
++ Once GCC version 2 has supplanted version 1, this can go. */
++
++#define YYFAIL goto yyerrlab
++
++#define YYRECOVERING() (!!yyerrstatus)
++
++#define YYBACKUP(Token, Value) \
++do \
++ if (yychar == YYEMPTY && yylen == 1) \
++ { \
++ yychar = (Token); \
++ yylval = (Value); \
++ yytoken = YYTRANSLATE (yychar); \
++ YYPOPSTACK; \
++ goto yybackup; \
++ } \
++ else \
++ { \
++ yyerror ("syntax error: cannot back up");\
++ YYERROR; \
++ } \
++while (0)
++
++#define YYTERROR 1
++#define YYERRCODE 256
++
++/* YYLLOC_DEFAULT -- Compute the default location (before the actions
++ are run). */
++
++#ifndef YYLLOC_DEFAULT
++# define YYLLOC_DEFAULT(Current, Rhs, N) \
++ Current.first_line = Rhs[1].first_line; \
++ Current.first_column = Rhs[1].first_column; \
++ Current.last_line = Rhs[N].last_line; \
++ Current.last_column = Rhs[N].last_column;
++#endif
++
++/* YYLEX -- calling `yylex' with the right arguments. */
++
++#ifdef YYLEX_PARAM
++# define YYLEX yylex (YYLEX_PARAM)
++#else
++# define YYLEX yylex ()
++#endif
++
++/* Enable debugging if requested. */
++#if YYDEBUG
++
++# ifndef YYFPRINTF
++# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
++# define YYFPRINTF fprintf
++# endif
++
++# define YYDPRINTF(Args) \
++do { \
++ if (yydebug) \
++ YYFPRINTF Args; \
++} while (0)
++
++# define YYDSYMPRINT(Args) \
++do { \
++ if (yydebug) \
++ yysymprint Args; \
++} while (0)
++
++# define YYDSYMPRINTF(Title, Token, Value, Location) \
++do { \
++ if (yydebug) \
++ { \
++ YYFPRINTF (stderr, "%s ", Title); \
++ yysymprint (stderr, \
++ Token, Value); \
++ YYFPRINTF (stderr, "\n"); \
++ } \
++} while (0)
++
++/*------------------------------------------------------------------.
++| yy_stack_print -- Print the state stack from its BOTTOM up to its |
++| TOP (cinluded). |
++`------------------------------------------------------------------*/
++
++#if defined (__STDC__) || defined (__cplusplus)
++static void
++yy_stack_print (short *bottom, short *top)
++#else
++static void
++yy_stack_print (bottom, top)
++ short *bottom;
++ short *top;
++#endif
++{
++ YYFPRINTF (stderr, "Stack now");
++ for (/* Nothing. */; bottom <= top; ++bottom)
++ YYFPRINTF (stderr, " %d", *bottom);
++ YYFPRINTF (stderr, "\n");
++}
++
++# define YY_STACK_PRINT(Bottom, Top) \
++do { \
++ if (yydebug) \
++ yy_stack_print ((Bottom), (Top)); \
++} while (0)
++
++
++/*------------------------------------------------.
++| Report that the YYRULE is going to be reduced. |
++`------------------------------------------------*/
++
++#if defined (__STDC__) || defined (__cplusplus)
++static void
++yy_reduce_print (int yyrule)
++#else
++static void
++yy_reduce_print (yyrule)
++ int yyrule;
++#endif
++{
++ int yyi;
++ unsigned int yylineno = yyrline[yyrule];
++ YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
++ yyrule - 1, yylineno);
++ /* Print the symbols being reduced, and their result. */
++ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
++ YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
++ YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
++}
++
++# define YY_REDUCE_PRINT(Rule) \
++do { \
++ if (yydebug) \
++ yy_reduce_print (Rule); \
++} while (0)
++
++/* Nonzero means print parse trace. It is left uninitialized so that
++ multiple parsers can coexist. */
++int yydebug;
++#else /* !YYDEBUG */
++# define YYDPRINTF(Args)
++# define YYDSYMPRINT(Args)
++# define YYDSYMPRINTF(Title, Token, Value, Location)
++# define YY_STACK_PRINT(Bottom, Top)
++# define YY_REDUCE_PRINT(Rule)
++#endif /* !YYDEBUG */
++
++
++/* YYINITDEPTH -- initial size of the parser's stacks. */
++#ifndef YYINITDEPTH
++# define YYINITDEPTH 200
++#endif
++
++/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
++ if the built-in stack extension method is used).
++
++ Do not make this value too large; the results are undefined if
++ SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
++ evaluated with infinite-precision integer arithmetic. */
++
++#if YYMAXDEPTH == 0
++# undef YYMAXDEPTH
++#endif
++
++#ifndef YYMAXDEPTH
++# define YYMAXDEPTH 10000
++#endif
++
++
++
++#if YYERROR_VERBOSE
++
++# ifndef yystrlen
++# if defined (__GLIBC__) && defined (_STRING_H)
++# define yystrlen strlen
++# else
++/* Return the length of YYSTR. */
++static YYSIZE_T
++# if defined (__STDC__) || defined (__cplusplus)
++yystrlen (const char *yystr)
++# else
++yystrlen (yystr)
++ const char *yystr;
++# endif
++{
++ register const char *yys = yystr;
++
++ while (*yys++ != '\0')
++ continue;
++
++ return yys - yystr - 1;
++}
++# endif
++# endif
++
++# ifndef yystpcpy
++# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
++# define yystpcpy stpcpy
++# else
++/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
++ YYDEST. */
++static char *
++# if defined (__STDC__) || defined (__cplusplus)
++yystpcpy (char *yydest, const char *yysrc)
++# else
++yystpcpy (yydest, yysrc)
++ char *yydest;
++ const char *yysrc;
++# endif
++{
++ register char *yyd = yydest;
++ register const char *yys = yysrc;
++
++ while ((*yyd++ = *yys++) != '\0')
++ continue;
++
++ return yyd - 1;
++}
++# endif
++# endif
++
++#endif /* !YYERROR_VERBOSE */
++
++
++
++#if YYDEBUG
++/*--------------------------------.
++| Print this symbol on YYOUTPUT. |
++`--------------------------------*/
++
++#if defined (__STDC__) || defined (__cplusplus)
++static void
++yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
++#else
++static void
++yysymprint (yyoutput, yytype, yyvaluep)
++ FILE *yyoutput;
++ int yytype;
++ YYSTYPE *yyvaluep;
++#endif
++{
++ /* Pacify ``unused variable'' warnings. */
++ (void) yyvaluep;
++
++ if (yytype < YYNTOKENS)
++ {
++ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
++# ifdef YYPRINT
++ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
++# endif
++ }
++ else
++ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
++
++ switch (yytype)
++ {
++ default:
++ break;
++ }
++ YYFPRINTF (yyoutput, ")");
++}
++
++#endif /* ! YYDEBUG */
++/*-----------------------------------------------.
++| Release the memory associated to this symbol. |
++`-----------------------------------------------*/
++
++#if defined (__STDC__) || defined (__cplusplus)
++static void
++yydestruct (int yytype, YYSTYPE *yyvaluep)
++#else
++static void
++yydestruct (yytype, yyvaluep)
++ int yytype;
++ YYSTYPE *yyvaluep;
++#endif
++{
++ /* Pacify ``unused variable'' warnings. */
++ (void) yyvaluep;
++
++ switch (yytype)
++ {
++
++ default:
++ break;
++ }
++}
++
++
++/* Prevent warnings from -Wmissing-prototypes. */
++
++#ifdef YYPARSE_PARAM
++# if defined (__STDC__) || defined (__cplusplus)
++int yyparse (void *YYPARSE_PARAM);
++# else
++int yyparse ();
++# endif
++#else /* ! YYPARSE_PARAM */
++#if defined (__STDC__) || defined (__cplusplus)
++int yyparse (void);
++#else
++int yyparse ();
++#endif
++#endif /* ! YYPARSE_PARAM */
++
++
++
++/* The lookahead symbol. */
++int yychar;
++
++/* The semantic value of the lookahead symbol. */
++YYSTYPE yylval;
++
++/* Number of syntax errors so far. */
++int yynerrs;
++
++
++
++/*----------.
++| yyparse. |
++`----------*/
++
++#ifdef YYPARSE_PARAM
++# if defined (__STDC__) || defined (__cplusplus)
++int yyparse (void *YYPARSE_PARAM)
++# else
++int yyparse (YYPARSE_PARAM)
++ void *YYPARSE_PARAM;
++# endif
++#else /* ! YYPARSE_PARAM */
++#if defined (__STDC__) || defined (__cplusplus)
++int
++yyparse (void)
++#else
++int
++yyparse ()
++
++#endif
++#endif
++{
++
++ register int yystate;
++ register int yyn;
++ int yyresult;
++ /* Number of tokens to shift before error messages enabled. */
++ int yyerrstatus;
++ /* Lookahead token as an internal (translated) token number. */
++ int yytoken = 0;
++
++ /* Three stacks and their tools:
++ `yyss': related to states,
++ `yyvs': related to semantic values,
++ `yyls': related to locations.
++
++ Refer to the stacks thru separate pointers, to allow yyoverflow
++ to reallocate them elsewhere. */
++
++ /* The state stack. */
++ short yyssa[YYINITDEPTH];
++ short *yyss = yyssa;
++ register short *yyssp;
++
++ /* The semantic value stack. */
++ YYSTYPE yyvsa[YYINITDEPTH];
++ YYSTYPE *yyvs = yyvsa;
++ register YYSTYPE *yyvsp;
++
++
++
++#define YYPOPSTACK (yyvsp--, yyssp--)
++
++ YYSIZE_T yystacksize = YYINITDEPTH;
++
++ /* The variables used to return semantic value and location from the
++ action routines. */
++ YYSTYPE yyval;
++
++
++ /* When reducing, the number of symbols on the RHS of the reduced
++ rule. */
++ int yylen;
++
++ YYDPRINTF ((stderr, "Starting parse\n"));
++
++ yystate = 0;
++ yyerrstatus = 0;
++ yynerrs = 0;
++ yychar = YYEMPTY; /* Cause a token to be read. */
++
++ /* Initialize stack pointers.
++ Waste one element of value and location stack
++ so that they stay on the same level as the state stack.
++ The wasted elements are never initialized. */
++
++ yyssp = yyss;
++ yyvsp = yyvs;
++
++ goto yysetstate;
++
++/*------------------------------------------------------------.
++| yynewstate -- Push a new state, which is found in yystate. |
++`------------------------------------------------------------*/
++ yynewstate:
++ /* In all cases, when you get here, the value and location stacks
++ have just been pushed. so pushing a state here evens the stacks.
++ */
++ yyssp++;
++
++ yysetstate:
++ *yyssp = yystate;
++
++ if (yyss + yystacksize - 1 <= yyssp)
++ {
++ /* Get the current used size of the three stacks, in elements. */
++ YYSIZE_T yysize = yyssp - yyss + 1;
++
++#ifdef yyoverflow
++ {
++ /* Give user a chance to reallocate the stack. Use copies of
++ these so that the &'s don't force the real ones into
++ memory. */
++ YYSTYPE *yyvs1 = yyvs;
++ short *yyss1 = yyss;
++
++
++ /* Each stack pointer address is followed by the size of the
++ data in use in that stack, in bytes. This used to be a
++ conditional around just the two extra args, but that might
++ be undefined if yyoverflow is a macro. */
++ yyoverflow ("parser stack overflow",
++ &yyss1, yysize * sizeof (*yyssp),
++ &yyvs1, yysize * sizeof (*yyvsp),
++
++ &yystacksize);
++
++ yyss = yyss1;
++ yyvs = yyvs1;
++ }
++#else /* no yyoverflow */
++# ifndef YYSTACK_RELOCATE
++ goto yyoverflowlab;
++# else
++ /* Extend the stack our own way. */
++ if (YYMAXDEPTH <= yystacksize)
++ goto yyoverflowlab;
++ yystacksize *= 2;
++ if (YYMAXDEPTH < yystacksize)
++ yystacksize = YYMAXDEPTH;
++
++ {
++ short *yyss1 = yyss;
++ union yyalloc *yyptr =
++ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
++ if (! yyptr)
++ goto yyoverflowlab;
++ YYSTACK_RELOCATE (yyss);
++ YYSTACK_RELOCATE (yyvs);
++
++# undef YYSTACK_RELOCATE
++ if (yyss1 != yyssa)
++ YYSTACK_FREE (yyss1);
++ }
++# endif
++#endif /* no yyoverflow */
++
++ yyssp = yyss + yysize - 1;
++ yyvsp = yyvs + yysize - 1;
++
++
++ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
++ (unsigned long int) yystacksize));
++
++ if (yyss + yystacksize - 1 <= yyssp)
++ YYABORT;
++ }
++
++ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
++
++ goto yybackup;
++
++/*-----------.
++| yybackup. |
++`-----------*/
++yybackup:
++
++/* Do appropriate processing given the current state. */
++/* Read a lookahead token if we need one and don't already have one. */
++/* yyresume: */
++
++ /* First try to decide what to do without reference to lookahead token. */
++
++ yyn = yypact[yystate];
++ if (yyn == YYPACT_NINF)
++ goto yydefault;
++
++ /* Not known => get a lookahead token if don't already have one. */
++
++ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
++ if (yychar == YYEMPTY)
++ {
++ YYDPRINTF ((stderr, "Reading a token: "));
++ yychar = YYLEX;
++ }
++
++ if (yychar <= YYEOF)
++ {
++ yychar = yytoken = YYEOF;
++ YYDPRINTF ((stderr, "Now at end of input.\n"));
++ }
++ else
++ {
++ yytoken = YYTRANSLATE (yychar);
++ YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
++ }
++
++ /* If the proper action on seeing token YYTOKEN is to reduce or to
++ detect an error, take that action. */
++ yyn += yytoken;
++ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
++ goto yydefault;
++ yyn = yytable[yyn];
++ if (yyn <= 0)
++ {
++ if (yyn == 0 || yyn == YYTABLE_NINF)
++ goto yyerrlab;
++ yyn = -yyn;
++ goto yyreduce;
++ }
++
++ if (yyn == YYFINAL)
++ YYACCEPT;
++
++ /* Shift the lookahead token. */
++ YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
++
++ /* Discard the token being shifted unless it is eof. */
++ if (yychar != YYEOF)
++ yychar = YYEMPTY;
++
++ *++yyvsp = yylval;
++
++
++ /* Count tokens shifted since error; after three, turn off error
++ status. */
++ if (yyerrstatus)
++ yyerrstatus--;
++
++ yystate = yyn;
++ goto yynewstate;
++
++
++/*-----------------------------------------------------------.
++| yydefault -- do the default action for the current state. |
++`-----------------------------------------------------------*/
++yydefault:
++ yyn = yydefact[yystate];
++ if (yyn == 0)
++ goto yyerrlab;
++ goto yyreduce;
++
++
++/*-----------------------------.
++| yyreduce -- Do a reduction. |
++`-----------------------------*/
++yyreduce:
++ /* yyn is the number of a rule to reduce with. */
++ yylen = yyr2[yyn];
++
++ /* If YYLEN is nonzero, implement the default value of the action:
++ `$$ = $1'.
++
++ Otherwise, the following line sets YYVAL to garbage.
++ This behavior is undocumented and Bison
++ users should not rely upon it. Assigning to YYVAL
++ unconditionally makes the parser a bit smaller, and it avoids a
++ GCC warning that YYVAL may be used uninitialized. */
++ yyval = yyvsp[1-yylen];
++
++
++ YY_REDUCE_PRINT (yyn);
++ switch (yyn)
++ {
++ case 8:
++
++ { zconfprint("unexpected 'endmenu' statement"); ;}
++ break;
++
++ case 9:
++
++ { zconfprint("unexpected 'endif' statement"); ;}
++ break;
++
++ case 10:
++
++ { zconfprint("unexpected 'endchoice' statement"); ;}
++ break;
++
++ case 11:
++
++ { zconfprint("syntax error"); yyerrok; ;}
++ break;
++
++ case 18:
++
++ {
++ struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
++ sym->flags |= SYMBOL_OPTIONAL;
++ menu_add_entry(sym);
++ printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
++;}
++ break;
++
++ case 19:
++
++ {
++ menu_end_entry();
++ printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 20:
++
++ {
++ struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
++ sym->flags |= SYMBOL_OPTIONAL;
++ menu_add_entry(sym);
++ printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
++;}
++ break;
++
++ case 21:
++
++ {
++ if (current_entry->prompt)
++ current_entry->prompt->type = P_MENU;
++ else
++ zconfprint("warning: menuconfig statement without prompt");
++ menu_end_entry();
++ printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 27:
++
++ {
++ menu_set_type(S_TRISTATE);
++ printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 28:
++
++ {
++ menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
++ menu_set_type(S_TRISTATE);
++ printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 29:
++
++ {
++ menu_set_type(S_BOOLEAN);
++ printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 30:
++
++ {
++ menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
++ menu_set_type(S_BOOLEAN);
++ printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 31:
++
++ {
++ menu_set_type(S_INT);
++ printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 32:
++
++ {
++ menu_set_type(S_HEX);
++ printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 33:
++
++ {
++ menu_set_type(S_STRING);
++ printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 34:
++
++ {
++ menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
++ printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 35:
++
++ {
++ menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
++ printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 36:
++
++ {
++ menu_add_symbol(P_SELECT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
++ printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 37:
++
++ {
++ menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,yyvsp[-3].symbol, yyvsp[-2].symbol), yyvsp[-1].expr);
++ printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 38:
++
++ {
++ struct symbol *sym = sym_lookup(NULL, 0);
++ sym->flags |= SYMBOL_CHOICE;
++ menu_add_entry(sym);
++ menu_add_expr(P_CHOICE, NULL, NULL);
++ printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 39:
++
++ {
++ menu_end_entry();
++ menu_add_menu();
++;}
++ break;
++
++ case 40:
++
++ {
++ if (zconf_endtoken(yyvsp[0].token, T_CHOICE, T_ENDCHOICE)) {
++ menu_end_menu();
++ printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
++ }
++;}
++ break;
++
++ case 42:
++
++ {
++ printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno);
++ zconfnerrs++;
++;}
++ break;
++
++ case 48:
++
++ {
++ menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
++ printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 49:
++
++ {
++ menu_set_type(S_TRISTATE);
++ printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 50:
++
++ {
++ menu_set_type(S_BOOLEAN);
++ printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 51:
++
++ {
++ current_entry->sym->flags |= SYMBOL_OPTIONAL;
++ printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 52:
++
++ {
++ menu_add_symbol(P_DEFAULT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
++ printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 55:
++
++ {
++ printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
++ menu_add_entry(NULL);
++ menu_add_dep(yyvsp[-1].expr);
++ menu_end_entry();
++ menu_add_menu();
++;}
++ break;
++
++ case 56:
++
++ {
++ if (zconf_endtoken(yyvsp[0].token, T_IF, T_ENDIF)) {
++ menu_end_menu();
++ printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
++ }
++;}
++ break;
++
++ case 58:
++
++ {
++ printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno);
++ zconfnerrs++;
++;}
++ break;
++
++ case 63:
++
++ {
++ menu_add_entry(NULL);
++ menu_add_prop(P_MENU, yyvsp[-1].string, NULL, NULL);
++ printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 64:
++
++ {
++ menu_end_entry();
++ menu_add_menu();
++;}
++ break;
++
++ case 65:
++
++ {
++ if (zconf_endtoken(yyvsp[0].token, T_MENU, T_ENDMENU)) {
++ menu_end_menu();
++ printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
++ }
++;}
++ break;
++
++ case 67:
++
++ {
++ printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno);
++ zconfnerrs++;
++;}
++ break;
++
++ case 72:
++
++ { zconfprint("invalid menu option"); yyerrok; ;}
++ break;
++
++ case 73:
++
++ {
++ yyval.string = yyvsp[-1].string;
++ printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
++;}
++ break;
++
++ case 74:
++
++ {
++ zconf_nextfile(yyvsp[0].string);
++;}
++ break;
++
++ case 75:
++
++ {
++ menu_add_entry(NULL);
++ menu_add_prop(P_COMMENT, yyvsp[-1].string, NULL, NULL);
++ printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 76:
++
++ {
++ menu_end_entry();
++;}
++ break;
++
++ case 77:
++
++ {
++ printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
++ zconf_starthelp();
++;}
++ break;
++
++ case 78:
++
++ {
++ current_entry->sym->help = yyvsp[0].string;
++;}
++ break;
++
++ case 82:
++
++ {
++ menu_add_dep(yyvsp[-1].expr);
++ printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 83:
++
++ {
++ menu_add_dep(yyvsp[-1].expr);
++ printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 84:
++
++ {
++ menu_add_dep(yyvsp[-1].expr);
++ printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
++;}
++ break;
++
++ case 86:
++
++ {
++ menu_add_prop(P_PROMPT, yyvsp[-1].string, NULL, yyvsp[0].expr);
++;}
++ break;
++
++ case 89:
++
++ { yyval.token = T_ENDMENU; ;}
++ break;
++
++ case 90:
++
++ { yyval.token = T_ENDCHOICE; ;}
++ break;
++
++ case 91:
++
++ { yyval.token = T_ENDIF; ;}
++ break;
++
++ case 94:
++
++ { yyval.expr = NULL; ;}
++ break;
++
++ case 95:
++
++ { yyval.expr = yyvsp[0].expr; ;}
++ break;
++
++ case 96:
++
++ { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;}
++ break;
++
++ case 97:
++
++ { yyval.expr = expr_alloc_comp(E_EQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
++ break;
++
++ case 98:
++
++ { yyval.expr = expr_alloc_comp(E_UNEQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
++ break;
++
++ case 99:
++
++ { yyval.expr = yyvsp[-1].expr; ;}
++ break;
++
++ case 100:
++
++ { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;}
++ break;
++
++ case 101:
++
++ { yyval.expr = expr_alloc_two(E_OR, yyvsp[-2].expr, yyvsp[0].expr); ;}
++ break;
++
++ case 102:
++
++ { yyval.expr = expr_alloc_two(E_AND, yyvsp[-2].expr, yyvsp[0].expr); ;}
++ break;
++
++ case 103:
++
++ { yyval.symbol = sym_lookup(yyvsp[0].string, 0); free(yyvsp[0].string); ;}
++ break;
++
++ case 104:
++
++ { yyval.symbol = sym_lookup(yyvsp[0].string, 1); free(yyvsp[0].string); ;}
++ break;
++
++
++ }
++
++/* Line 999 of yacc.c. */
++
++
++ yyvsp -= yylen;
++ yyssp -= yylen;
++
++
++ YY_STACK_PRINT (yyss, yyssp);
++
++ *++yyvsp = yyval;
++
++
++ /* Now `shift' the result of the reduction. Determine what state
++ that goes to, based on the state we popped back to and the rule
++ number reduced by. */
++
++ yyn = yyr1[yyn];
++
++ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
++ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
++ yystate = yytable[yystate];
++ else
++ yystate = yydefgoto[yyn - YYNTOKENS];
++
++ goto yynewstate;
++
++
++/*------------------------------------.
++| yyerrlab -- here on detecting error |
++`------------------------------------*/
++yyerrlab:
++ /* If not already recovering from an error, report this error. */
++ if (!yyerrstatus)
++ {
++ ++yynerrs;
++#if YYERROR_VERBOSE
++ yyn = yypact[yystate];
++
++ if (YYPACT_NINF < yyn && yyn < YYLAST)
++ {
++ YYSIZE_T yysize = 0;
++ int yytype = YYTRANSLATE (yychar);
++ char *yymsg;
++ int yyx, yycount;
++
++ yycount = 0;
++ /* Start YYX at -YYN if negative to avoid negative indexes in
++ YYCHECK. */
++ for (yyx = yyn < 0 ? -yyn : 0;
++ yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
++ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
++ yysize += yystrlen (yytname[yyx]) + 15, yycount++;
++ yysize += yystrlen ("syntax error, unexpected ") + 1;
++ yysize += yystrlen (yytname[yytype]);
++ yymsg = (char *) YYSTACK_ALLOC (yysize);
++ if (yymsg != 0)
++ {
++ char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
++ yyp = yystpcpy (yyp, yytname[yytype]);
++
++ if (yycount < 5)
++ {
++ yycount = 0;
++ for (yyx = yyn < 0 ? -yyn : 0;
++ yyx < (int) (sizeof (yytname) / sizeof (char *));
++ yyx++)
++ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
++ {
++ const char *yyq = ! yycount ? ", expecting " : " or ";
++ yyp = yystpcpy (yyp, yyq);
++ yyp = yystpcpy (yyp, yytname[yyx]);
++ yycount++;
++ }
++ }
++ yyerror (yymsg);
++ YYSTACK_FREE (yymsg);
++ }
++ else
++ yyerror ("syntax error; also virtual memory exhausted");
++ }
++ else
++#endif /* YYERROR_VERBOSE */
++ yyerror ("syntax error");
++ }
++
++
++
++ if (yyerrstatus == 3)
++ {
++ /* If just tried and failed to reuse lookahead token after an
++ error, discard it. */
++
++ /* Return failure if at end of input. */
++ if (yychar == YYEOF)
++ {
++ /* Pop the error token. */
++ YYPOPSTACK;
++ /* Pop the rest of the stack. */
++ while (yyss < yyssp)
++ {
++ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
++ yydestruct (yystos[*yyssp], yyvsp);
++ YYPOPSTACK;
++ }
++ YYABORT;
++ }
++
++ YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
++ yydestruct (yytoken, &yylval);
++ yychar = YYEMPTY;
++
++ }
++
++ /* Else will try to reuse lookahead token after shifting the error
++ token. */
++ goto yyerrlab1;
++
++
++/*----------------------------------------------------.
++| yyerrlab1 -- error raised explicitly by an action. |
++`----------------------------------------------------*/
++yyerrlab1:
++ yyerrstatus = 3; /* Each real token shifted decrements this. */
++
++ for (;;)
++ {
++ yyn = yypact[yystate];
++ if (yyn != YYPACT_NINF)
++ {
++ yyn += YYTERROR;
++ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
++ {
++ yyn = yytable[yyn];
++ if (0 < yyn)
++ break;
++ }
++ }
++
++ /* Pop the current state because it cannot handle the error token. */
++ if (yyssp == yyss)
++ YYABORT;
++
++ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
++ yydestruct (yystos[yystate], yyvsp);
++ yyvsp--;
++ yystate = *--yyssp;
++
++ YY_STACK_PRINT (yyss, yyssp);
++ }
++
++ if (yyn == YYFINAL)
++ YYACCEPT;
++
++ YYDPRINTF ((stderr, "Shifting error token, "));
++
++ *++yyvsp = yylval;
++
++
++ yystate = yyn;
++ goto yynewstate;
++
++
++/*-------------------------------------.
++| yyacceptlab -- YYACCEPT comes here. |
++`-------------------------------------*/
++yyacceptlab:
++ yyresult = 0;
++ goto yyreturn;
++
++/*-----------------------------------.
++| yyabortlab -- YYABORT comes here. |
++`-----------------------------------*/
++yyabortlab:
++ yyresult = 1;
++ goto yyreturn;
++
++#ifndef yyoverflow
++/*----------------------------------------------.
++| yyoverflowlab -- parser overflow comes here. |
++`----------------------------------------------*/
++yyoverflowlab:
++ yyerror ("parser stack overflow");
++ yyresult = 2;
++ /* Fall through. */
++#endif
++
++yyreturn:
++#ifndef yyoverflow
++ if (yyss != yyssa)
++ YYSTACK_FREE (yyss);
++#endif
++ return yyresult;
++}
++
++
++
++
++
++void conf_parse(const char *name)
++{
++ struct symbol *sym;
++ int i;
++
++ zconf_initscan(name);
++
++ sym_init();
++ menu_init();
++ modules_sym = sym_lookup("MODULES", 0);
++ rootmenu.prompt = menu_add_prop(P_MENU, "axTLS Configuration", NULL, NULL);
++
++ //zconfdebug = 1;
++ zconfparse();
++ if (zconfnerrs)
++ exit(1);
++ menu_finalize(&rootmenu);
++ for_all_symbols(i, sym) {
++ if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
++ printf("\n");
++ else
++ sym->flags |= SYMBOL_CHECK_DONE;
++ }
++
++ sym_change_count = 1;
++}
++
++const char *zconf_tokenname(int token)
++{
++ switch (token) {
++ case T_MENU: return "menu";
++ case T_ENDMENU: return "endmenu";
++ case T_CHOICE: return "choice";
++ case T_ENDCHOICE: return "endchoice";
++ case T_IF: return "if";
++ case T_ENDIF: return "endif";
++ }
++ return "<token>";
++}
++
++static bool zconf_endtoken(int token, int starttoken, int endtoken)
++{
++ if (token != endtoken) {
++ zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken));
++ zconfnerrs++;
++ return false;
++ }
++ if (current_menu->file != current_file) {
++ zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken));
++ zconfprint("location of the '%s'", zconf_tokenname(starttoken));
++ zconfnerrs++;
++ return false;
++ }
++ return true;
++}
++
++static void zconfprint(const char *err, ...)
++{
++ va_list ap;
++
++ fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1);
++ va_start(ap, err);
++ vfprintf(stderr, err, ap);
++ va_end(ap);
++ fprintf(stderr, "\n");
++}
++
++static void zconferror(const char *err)
++{
++ fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
++}
++
++void print_quoted_string(FILE *out, const char *str)
++{
++ const char *p;
++ int len;
++
++ putc('"', out);
++ while ((p = strchr(str, '"'))) {
++ len = p - str;
++ if (len)
++ fprintf(out, "%.*s", len, str);
++ fputs("\\\"", out);
++ str = p + 1;
++ }
++ fputs(str, out);
++ putc('"', out);
++}
++
++void print_symbol(FILE *out, struct menu *menu)
++{
++ struct symbol *sym = menu->sym;
++ struct property *prop;
++
++ if (sym_is_choice(sym))
++ fprintf(out, "choice\n");
++ else
++ fprintf(out, "config %s\n", sym->name);
++ switch (sym->type) {
++ case S_BOOLEAN:
++ fputs(" boolean\n", out);
++ break;
++ case S_TRISTATE:
++ fputs(" tristate\n", out);
++ break;
++ case S_STRING:
++ fputs(" string\n", out);
++ break;
++ case S_INT:
++ fputs(" integer\n", out);
++ break;
++ case S_HEX:
++ fputs(" hex\n", out);
++ break;
++ default:
++ fputs(" ???\n", out);
++ break;
++ }
++ for (prop = sym->prop; prop; prop = prop->next) {
++ if (prop->menu != menu)
++ continue;
++ switch (prop->type) {
++ case P_PROMPT:
++ fputs(" prompt ", out);
++ print_quoted_string(out, prop->text);
++ if (!expr_is_yes(prop->visible.expr)) {
++ fputs(" if ", out);
++ expr_fprint(prop->visible.expr, out);
++ }
++ fputc('\n', out);
++ break;
++ case P_DEFAULT:
++ fputs( " default ", out);
++ expr_fprint(prop->expr, out);
++ if (!expr_is_yes(prop->visible.expr)) {
++ fputs(" if ", out);
++ expr_fprint(prop->visible.expr, out);
++ }
++ fputc('\n', out);
++ break;
++ case P_CHOICE:
++ fputs(" #choice value\n", out);
++ break;
++ default:
++ fprintf(out, " unknown prop %d!\n", prop->type);
++ break;
++ }
++ }
++ if (sym->help) {
++ int len = strlen(sym->help);
++ while (sym->help[--len] == '\n')
++ sym->help[len] = 0;
++ fprintf(out, " help\n%s\n", sym->help);
++ }
++ fputc('\n', out);
++}
++
++void zconfdump(FILE *out)
++{
++ struct property *prop;
++ struct symbol *sym;
++ struct menu *menu;
++
++ menu = rootmenu.list;
++ while (menu) {
++ if ((sym = menu->sym))
++ print_symbol(out, menu);
++ else if ((prop = menu->prompt)) {
++ switch (prop->type) {
++ case P_COMMENT:
++ fputs("\ncomment ", out);
++ print_quoted_string(out, prop->text);
++ fputs("\n", out);
++ break;
++ case P_MENU:
++ fputs("\nmenu ", out);
++ print_quoted_string(out, prop->text);
++ fputs("\n", out);
++ break;
++ default:
++ ;
++ }
++ if (!expr_is_yes(prop->visible.expr)) {
++ fputs(" depends ", out);
++ expr_fprint(prop->visible.expr, out);
++ fputc('\n', out);
++ }
++ fputs("\n", out);
++ }
++
++ if (menu->list)
++ menu = menu->list;
++ else if (menu->next)
++ menu = menu->next;
++ else while ((menu = menu->parent)) {
++ if (menu->prompt && menu->prompt->type == P_MENU)
++ fputs("\nendmenu\n", out);
++ if (menu->next) {
++ menu = menu->next;
++ break;
++ }
++ }
++ }
++}
++
++#include "lex.zconf.c"
++#include "util.c"
++#include "confdata.c"
++#include "expr.c"
++#include "symbol.c"
++#include "menu.c"
++
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.h_shipped b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.h_shipped
+new file mode 100644
+index 0000000..3b191ef
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.h_shipped
+@@ -0,0 +1,125 @@
++/* A Bison parser, made from zconf.y, by GNU bison 1.75. */
++
++/* Skeleton parser for Yacc-like parsing with Bison,
++ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2, or (at your option)
++ any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 59 Temple Place - Suite 330,
++ Boston, MA 02111-1307, USA. */
++
++/* As a special exception, when this file is copied by Bison into a
++ Bison output file, you may use that output file without restriction.
++ This special exception was added by the Free Software Foundation
++ in version 1.24 of Bison. */
++
++#ifndef BISON_ZCONF_TAB_H
++# define BISON_ZCONF_TAB_H
++
++/* Tokens. */
++#ifndef YYTOKENTYPE
++# define YYTOKENTYPE
++ /* Put the tokens into the symbol table, so that GDB and other debuggers
++ know about them. */
++ enum yytokentype {
++ T_MAINMENU = 258,
++ T_MENU = 259,
++ T_ENDMENU = 260,
++ T_SOURCE = 261,
++ T_CHOICE = 262,
++ T_ENDCHOICE = 263,
++ T_COMMENT = 264,
++ T_CONFIG = 265,
++ T_HELP = 266,
++ T_HELPTEXT = 267,
++ T_IF = 268,
++ T_ENDIF = 269,
++ T_DEPENDS = 270,
++ T_REQUIRES = 271,
++ T_OPTIONAL = 272,
++ T_PROMPT = 273,
++ T_DEFAULT = 274,
++ T_TRISTATE = 275,
++ T_BOOLEAN = 276,
++ T_INT = 277,
++ T_HEX = 278,
++ T_WORD = 279,
++ T_STRING = 280,
++ T_UNEQUAL = 281,
++ T_EOF = 282,
++ T_EOL = 283,
++ T_CLOSE_PAREN = 284,
++ T_OPEN_PAREN = 285,
++ T_ON = 286,
++ T_OR = 287,
++ T_AND = 288,
++ T_EQUAL = 289,
++ T_NOT = 290
++ };
++#endif
++#define T_MAINMENU 258
++#define T_MENU 259
++#define T_ENDMENU 260
++#define T_SOURCE 261
++#define T_CHOICE 262
++#define T_ENDCHOICE 263
++#define T_COMMENT 264
++#define T_CONFIG 265
++#define T_HELP 266
++#define T_HELPTEXT 267
++#define T_IF 268
++#define T_ENDIF 269
++#define T_DEPENDS 270
++#define T_REQUIRES 271
++#define T_OPTIONAL 272
++#define T_PROMPT 273
++#define T_DEFAULT 274
++#define T_TRISTATE 275
++#define T_BOOLEAN 276
++#define T_INT 277
++#define T_HEX 278
++#define T_WORD 279
++#define T_STRING 280
++#define T_UNEQUAL 281
++#define T_EOF 282
++#define T_EOL 283
++#define T_CLOSE_PAREN 284
++#define T_OPEN_PAREN 285
++#define T_ON 286
++#define T_OR 287
++#define T_AND 288
++#define T_EQUAL 289
++#define T_NOT 290
++
++
++
++
++#ifndef YYSTYPE
++#line 33 "zconf.y"
++typedef union {
++ int token;
++ char *string;
++ struct symbol *symbol;
++ struct expr *expr;
++ struct menu *menu;
++} yystype;
++/* Line 1281 of /usr/share/bison/yacc.c. */
++#line 118 "zconf.tab.h"
++# define YYSTYPE yystype
++#endif
++
++extern YYSTYPE zconflval;
++
++
++#endif /* not BISON_ZCONF_TAB_H */
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.y b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.y
+new file mode 100644
+index 0000000..cf45da0
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.y
+@@ -0,0 +1,690 @@
++%{
++/*
++ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
++ * Released under the terms of the GNU GPL v2.0.
++ */
++
++#include <ctype.h>
++#include <stdarg.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <stdbool.h>
++
++#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
++
++#define PRINTD 0x0001
++#define DEBUG_PARSE 0x0002
++
++int cdebug = PRINTD;
++
++extern int zconflex(void);
++static void zconfprint(const char *err, ...);
++static void zconferror(const char *err);
++static bool zconf_endtoken(int token, int starttoken, int endtoken);
++
++struct symbol *symbol_hash[257];
++
++static struct menu *current_menu, *current_entry;
++
++#define YYERROR_VERBOSE
++%}
++%expect 40
++
++%union
++{
++ int token;
++ char *string;
++ struct symbol *symbol;
++ struct expr *expr;
++ struct menu *menu;
++}
++
++%token T_MAINMENU
++%token T_MENU
++%token T_ENDMENU
++%token T_SOURCE
++%token T_CHOICE
++%token T_ENDCHOICE
++%token T_COMMENT
++%token T_CONFIG
++%token T_MENUCONFIG
++%token T_HELP
++%token <string> T_HELPTEXT
++%token T_IF
++%token T_ENDIF
++%token T_DEPENDS
++%token T_REQUIRES
++%token T_OPTIONAL
++%token T_PROMPT
++%token T_DEFAULT
++%token T_TRISTATE
++%token T_DEF_TRISTATE
++%token T_BOOLEAN
++%token T_DEF_BOOLEAN
++%token T_STRING
++%token T_INT
++%token T_HEX
++%token <string> T_WORD
++%token <string> T_WORD_QUOTE
++%token T_UNEQUAL
++%token T_EOF
++%token T_EOL
++%token T_CLOSE_PAREN
++%token T_OPEN_PAREN
++%token T_ON
++%token T_SELECT
++%token T_RANGE
++
++%left T_OR
++%left T_AND
++%left T_EQUAL T_UNEQUAL
++%nonassoc T_NOT
++
++%type <string> prompt
++%type <string> source
++%type <symbol> symbol
++%type <expr> expr
++%type <expr> if_expr
++%type <token> end
++
++%{
++#define LKC_DIRECT_LINK
++#include "lkc.h"
++%}
++%%
++input: /* empty */
++ | input block
++;
++
++block: common_block
++ | choice_stmt
++ | menu_stmt
++ | T_MAINMENU prompt nl_or_eof
++ | T_ENDMENU { zconfprint("unexpected 'endmenu' statement"); }
++ | T_ENDIF { zconfprint("unexpected 'endif' statement"); }
++ | T_ENDCHOICE { zconfprint("unexpected 'endchoice' statement"); }
++ | error nl_or_eof { zconfprint("syntax error"); yyerrok; }
++;
++
++common_block:
++ if_stmt
++ | comment_stmt
++ | config_stmt
++ | menuconfig_stmt
++ | source_stmt
++ | nl_or_eof
++;
++
++
++/* config/menuconfig entry */
++
++config_entry_start: T_CONFIG T_WORD T_EOL
++{
++ struct symbol *sym = sym_lookup($2, 0);
++ sym->flags |= SYMBOL_OPTIONAL;
++ menu_add_entry(sym);
++ printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2);
++};
++
++config_stmt: config_entry_start config_option_list
++{
++ menu_end_entry();
++ printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
++};
++
++menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL
++{
++ struct symbol *sym = sym_lookup($2, 0);
++ sym->flags |= SYMBOL_OPTIONAL;
++ menu_add_entry(sym);
++ printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2);
++};
++
++menuconfig_stmt: menuconfig_entry_start config_option_list
++{
++ if (current_entry->prompt)
++ current_entry->prompt->type = P_MENU;
++ else
++ zconfprint("warning: menuconfig statement without prompt");
++ menu_end_entry();
++ printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
++};
++
++config_option_list:
++ /* empty */
++ | config_option_list config_option
++ | config_option_list depends
++ | config_option_list help
++ | config_option_list T_EOL
++;
++
++config_option: T_TRISTATE prompt_stmt_opt T_EOL
++{
++ menu_set_type(S_TRISTATE);
++ printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
++};
++
++config_option: T_DEF_TRISTATE expr if_expr T_EOL
++{
++ menu_add_expr(P_DEFAULT, $2, $3);
++ menu_set_type(S_TRISTATE);
++ printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
++};
++
++config_option: T_BOOLEAN prompt_stmt_opt T_EOL
++{
++ menu_set_type(S_BOOLEAN);
++ printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
++};
++
++config_option: T_DEF_BOOLEAN expr if_expr T_EOL
++{
++ menu_add_expr(P_DEFAULT, $2, $3);
++ menu_set_type(S_BOOLEAN);
++ printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
++};
++
++config_option: T_INT prompt_stmt_opt T_EOL
++{
++ menu_set_type(S_INT);
++ printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno());
++};
++
++config_option: T_HEX prompt_stmt_opt T_EOL
++{
++ menu_set_type(S_HEX);
++ printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno());
++};
++
++config_option: T_STRING prompt_stmt_opt T_EOL
++{
++ menu_set_type(S_STRING);
++ printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno());
++};
++
++config_option: T_PROMPT prompt if_expr T_EOL
++{
++ menu_add_prompt(P_PROMPT, $2, $3);
++ printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
++};
++
++config_option: T_DEFAULT expr if_expr T_EOL
++{
++ menu_add_expr(P_DEFAULT, $2, $3);
++ printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
++};
++
++config_option: T_SELECT T_WORD if_expr T_EOL
++{
++ menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);
++ printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
++};
++
++config_option: T_RANGE symbol symbol if_expr T_EOL
++{
++ menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
++ printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
++};
++
++/* choice entry */
++
++choice: T_CHOICE T_EOL
++{
++ struct symbol *sym = sym_lookup(NULL, 0);
++ sym->flags |= SYMBOL_CHOICE;
++ menu_add_entry(sym);
++ menu_add_expr(P_CHOICE, NULL, NULL);
++ printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
++};
++
++choice_entry: choice choice_option_list
++{
++ menu_end_entry();
++ menu_add_menu();
++};
++
++choice_end: end
++{
++ if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) {
++ menu_end_menu();
++ printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
++ }
++};
++
++choice_stmt:
++ choice_entry choice_block choice_end
++ | choice_entry choice_block
++{
++ printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno);
++ zconfnerrs++;
++};
++
++choice_option_list:
++ /* empty */
++ | choice_option_list choice_option
++ | choice_option_list depends
++ | choice_option_list help
++ | choice_option_list T_EOL
++;
++
++choice_option: T_PROMPT prompt if_expr T_EOL
++{
++ menu_add_prompt(P_PROMPT, $2, $3);
++ printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
++};
++
++choice_option: T_TRISTATE prompt_stmt_opt T_EOL
++{
++ menu_set_type(S_TRISTATE);
++ printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
++};
++
++choice_option: T_BOOLEAN prompt_stmt_opt T_EOL
++{
++ menu_set_type(S_BOOLEAN);
++ printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
++};
++
++choice_option: T_OPTIONAL T_EOL
++{
++ current_entry->sym->flags |= SYMBOL_OPTIONAL;
++ printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
++};
++
++choice_option: T_DEFAULT T_WORD if_expr T_EOL
++{
++ menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3);
++ printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
++};
++
++choice_block:
++ /* empty */
++ | choice_block common_block
++;
++
++/* if entry */
++
++if: T_IF expr T_EOL
++{
++ printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
++ menu_add_entry(NULL);
++ menu_add_dep($2);
++ menu_end_entry();
++ menu_add_menu();
++};
++
++if_end: end
++{
++ if (zconf_endtoken($1, T_IF, T_ENDIF)) {
++ menu_end_menu();
++ printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
++ }
++};
++
++if_stmt:
++ if if_block if_end
++ | if if_block
++{
++ printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno);
++ zconfnerrs++;
++};
++
++if_block:
++ /* empty */
++ | if_block common_block
++ | if_block menu_stmt
++ | if_block choice_stmt
++;
++
++/* menu entry */
++
++menu: T_MENU prompt T_EOL
++{
++ menu_add_entry(NULL);
++ menu_add_prop(P_MENU, $2, NULL, NULL);
++ printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
++};
++
++menu_entry: menu depends_list
++{
++ menu_end_entry();
++ menu_add_menu();
++};
++
++menu_end: end
++{
++ if (zconf_endtoken($1, T_MENU, T_ENDMENU)) {
++ menu_end_menu();
++ printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
++ }
++};
++
++menu_stmt:
++ menu_entry menu_block menu_end
++ | menu_entry menu_block
++{
++ printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno);
++ zconfnerrs++;
++};
++
++menu_block:
++ /* empty */
++ | menu_block common_block
++ | menu_block menu_stmt
++ | menu_block choice_stmt
++ | menu_block error T_EOL { zconfprint("invalid menu option"); yyerrok; }
++;
++
++source: T_SOURCE prompt T_EOL
++{
++ $$ = $2;
++ printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
++};
++
++source_stmt: source
++{
++ zconf_nextfile($1);
++};
++
++/* comment entry */
++
++comment: T_COMMENT prompt T_EOL
++{
++ menu_add_entry(NULL);
++ menu_add_prop(P_COMMENT, $2, NULL, NULL);
++ printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
++};
++
++comment_stmt: comment depends_list
++{
++ menu_end_entry();
++};
++
++/* help option */
++
++help_start: T_HELP T_EOL
++{
++ printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
++ zconf_starthelp();
++};
++
++help: help_start T_HELPTEXT
++{
++ current_entry->sym->help = $2;
++};
++
++/* depends option */
++
++depends_list: /* empty */
++ | depends_list depends
++ | depends_list T_EOL
++;
++
++depends: T_DEPENDS T_ON expr T_EOL
++{
++ menu_add_dep($3);
++ printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
++}
++ | T_DEPENDS expr T_EOL
++{
++ menu_add_dep($2);
++ printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
++}
++ | T_REQUIRES expr T_EOL
++{
++ menu_add_dep($2);
++ printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
++};
++
++/* prompt statement */
++
++prompt_stmt_opt:
++ /* empty */
++ | prompt if_expr
++{
++ menu_add_prop(P_PROMPT, $1, NULL, $2);
++};
++
++prompt: T_WORD
++ | T_WORD_QUOTE
++;
++
++end: T_ENDMENU nl_or_eof { $$ = T_ENDMENU; }
++ | T_ENDCHOICE nl_or_eof { $$ = T_ENDCHOICE; }
++ | T_ENDIF nl_or_eof { $$ = T_ENDIF; }
++;
++
++nl_or_eof:
++ T_EOL | T_EOF;
++
++if_expr: /* empty */ { $$ = NULL; }
++ | T_IF expr { $$ = $2; }
++;
++
++expr: symbol { $$ = expr_alloc_symbol($1); }
++ | symbol T_EQUAL symbol { $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
++ | symbol T_UNEQUAL symbol { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
++ | T_OPEN_PAREN expr T_CLOSE_PAREN { $$ = $2; }
++ | T_NOT expr { $$ = expr_alloc_one(E_NOT, $2); }
++ | expr T_OR expr { $$ = expr_alloc_two(E_OR, $1, $3); }
++ | expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); }
++;
++
++symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); }
++ | T_WORD_QUOTE { $$ = sym_lookup($1, 1); free($1); }
++;
++
++%%
++
++void conf_parse(const char *name)
++{
++ struct symbol *sym;
++ int i;
++
++ zconf_initscan(name);
++
++ sym_init();
++ menu_init();
++ modules_sym = sym_lookup("MODULES", 0);
++ rootmenu.prompt = menu_add_prop(P_MENU, "axTLS Configuration", NULL, NULL);
++
++ //zconfdebug = 1;
++ zconfparse();
++ if (zconfnerrs)
++ exit(1);
++ menu_finalize(&rootmenu);
++ for_all_symbols(i, sym) {
++ if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
++ printf("\n");
++ else
++ sym->flags |= SYMBOL_CHECK_DONE;
++ }
++
++ sym_change_count = 1;
++}
++
++const char *zconf_tokenname(int token)
++{
++ switch (token) {
++ case T_MENU: return "menu";
++ case T_ENDMENU: return "endmenu";
++ case T_CHOICE: return "choice";
++ case T_ENDCHOICE: return "endchoice";
++ case T_IF: return "if";
++ case T_ENDIF: return "endif";
++ }
++ return "<token>";
++}
++
++static bool zconf_endtoken(int token, int starttoken, int endtoken)
++{
++ if (token != endtoken) {
++ zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken));
++ zconfnerrs++;
++ return false;
++ }
++ if (current_menu->file != current_file) {
++ zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken));
++ zconfprint("location of the '%s'", zconf_tokenname(starttoken));
++ zconfnerrs++;
++ return false;
++ }
++ return true;
++}
++
++static void zconfprint(const char *err, ...)
++{
++ va_list ap;
++
++ fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1);
++ va_start(ap, err);
++ vfprintf(stderr, err, ap);
++ va_end(ap);
++ fprintf(stderr, "\n");
++}
++
++static void zconferror(const char *err)
++{
++ fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
++}
++
++void print_quoted_string(FILE *out, const char *str)
++{
++ const char *p;
++ int len;
++
++ putc('"', out);
++ while ((p = strchr(str, '"'))) {
++ len = p - str;
++ if (len)
++ fprintf(out, "%.*s", len, str);
++ fputs("\\\"", out);
++ str = p + 1;
++ }
++ fputs(str, out);
++ putc('"', out);
++}
++
++void print_symbol(FILE *out, struct menu *menu)
++{
++ struct symbol *sym = menu->sym;
++ struct property *prop;
++
++ if (sym_is_choice(sym))
++ fprintf(out, "choice\n");
++ else
++ fprintf(out, "config %s\n", sym->name);
++ switch (sym->type) {
++ case S_BOOLEAN:
++ fputs(" boolean\n", out);
++ break;
++ case S_TRISTATE:
++ fputs(" tristate\n", out);
++ break;
++ case S_STRING:
++ fputs(" string\n", out);
++ break;
++ case S_INT:
++ fputs(" integer\n", out);
++ break;
++ case S_HEX:
++ fputs(" hex\n", out);
++ break;
++ default:
++ fputs(" ???\n", out);
++ break;
++ }
++ for (prop = sym->prop; prop; prop = prop->next) {
++ if (prop->menu != menu)
++ continue;
++ switch (prop->type) {
++ case P_PROMPT:
++ fputs(" prompt ", out);
++ print_quoted_string(out, prop->text);
++ if (!expr_is_yes(prop->visible.expr)) {
++ fputs(" if ", out);
++ expr_fprint(prop->visible.expr, out);
++ }
++ fputc('\n', out);
++ break;
++ case P_DEFAULT:
++ fputs( " default ", out);
++ expr_fprint(prop->expr, out);
++ if (!expr_is_yes(prop->visible.expr)) {
++ fputs(" if ", out);
++ expr_fprint(prop->visible.expr, out);
++ }
++ fputc('\n', out);
++ break;
++ case P_CHOICE:
++ fputs(" #choice value\n", out);
++ break;
++ default:
++ fprintf(out, " unknown prop %d!\n", prop->type);
++ break;
++ }
++ }
++ if (sym->help) {
++ int len = strlen(sym->help);
++ while (sym->help[--len] == '\n')
++ sym->help[len] = 0;
++ fprintf(out, " help\n%s\n", sym->help);
++ }
++ fputc('\n', out);
++}
++
++void zconfdump(FILE *out)
++{
++ struct property *prop;
++ struct symbol *sym;
++ struct menu *menu;
++
++ menu = rootmenu.list;
++ while (menu) {
++ if ((sym = menu->sym))
++ print_symbol(out, menu);
++ else if ((prop = menu->prompt)) {
++ switch (prop->type) {
++ case P_COMMENT:
++ fputs("\ncomment ", out);
++ print_quoted_string(out, prop->text);
++ fputs("\n", out);
++ break;
++ case P_MENU:
++ fputs("\nmenu ", out);
++ print_quoted_string(out, prop->text);
++ fputs("\n", out);
++ break;
++ default:
++ ;
++ }
++ if (!expr_is_yes(prop->visible.expr)) {
++ fputs(" depends ", out);
++ expr_fprint(prop->visible.expr, out);
++ fputc('\n', out);
++ }
++ fputs("\n", out);
++ }
++
++ if (menu->list)
++ menu = menu->list;
++ else if (menu->next)
++ menu = menu->next;
++ else while ((menu = menu->parent)) {
++ if (menu->prompt && menu->prompt->type == P_MENU)
++ fputs("\nendmenu\n", out);
++ if (menu->next) {
++ menu = menu->next;
++ break;
++ }
++ }
++ }
++}
++
++#include "lex.zconf.c"
++#include "util.c"
++#include "confdata.c"
++#include "expr.c"
++#include "symbol.c"
++#include "menu.c"
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/win32config b/feeds/luci/libs/luci-lib-nixio/axTLS/config/win32config
+new file mode 100644
+index 0000000..6c8d607
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/win32config
+@@ -0,0 +1,119 @@
++#
++# Automatically generated make config: don't edit
++#
++HAVE_DOT_CONFIG=y
++# CONFIG_PLATFORM_LINUX is not set
++# CONFIG_PLATFORM_CYGWIN is not set
++# CONFIG_PLATFORM_SOLARIS is not set
++CONFIG_PLATFORM_WIN32=y
++
++#
++# General Configuration
++#
++PREFIX=""
++# CONFIG_DEBUG is not set
++# CONFIG_STRIP_UNWANTED_SECTIONS is not set
++
++#
++# Microsoft Compiler Options
++#
++# CONFIG_VISUAL_STUDIO_7_0 is not set
++CONFIG_VISUAL_STUDIO_8_0=y
++CONFIG_VISUAL_STUDIO_7_0_BASE=""
++CONFIG_VISUAL_STUDIO_8_0_BASE="c:\\Program Files\\Microsoft Visual Studio 8"
++CONFIG_EXTRA_CFLAGS_OPTIONS=""
++CONFIG_EXTRA_LDFLAGS_OPTIONS=""
++
++#
++# SSL Library
++#
++# CONFIG_SSL_SERVER_ONLY is not set
++# CONFIG_SSL_CERT_VERIFICATION is not set
++# CONFIG_SSL_ENABLE_CLIENT is not set
++CONFIG_SSL_FULL_MODE=y
++# CONFIG_SSL_SKELETON_MODE is not set
++# CONFIG_SSL_PROT_LOW is not set
++CONFIG_SSL_PROT_MEDIUM=y
++# CONFIG_SSL_PROT_HIGH is not set
++CONFIG_SSL_USE_DEFAULT_KEY=y
++CONFIG_SSL_PRIVATE_KEY_LOCATION=""
++CONFIG_SSL_PRIVATE_KEY_PASSWORD=""
++CONFIG_SSL_X509_CERT_LOCATION=""
++CONFIG_SSL_GENERATE_X509_CERT=y
++CONFIG_SSL_X509_COMMON_NAME=""
++CONFIG_SSL_X509_ORGANIZATION_NAME=""
++CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME=""
++CONFIG_SSL_ENABLE_V23_HANDSHAKE=y
++CONFIG_SSL_HAS_PEM=y
++CONFIG_SSL_USE_PKCS12=y
++CONFIG_SSL_EXPIRY_TIME=24
++CONFIG_X509_MAX_CA_CERTS=4
++CONFIG_SSL_MAX_CERTS=2
++# CONFIG_SSL_CTX_MUTEXING is not set
++# CONFIG_USE_DEV_URANDOM is not set
++CONFIG_WIN32_USE_CRYPTO_LIB=y
++# CONFIG_OPENSSL_COMPATIBLE is not set
++# CONFIG_PERFORMANCE_TESTING is not set
++# CONFIG_SSL_TEST is not set
++CONFIG_AXHTTPD=y
++
++#
++# Axhttpd Configuration
++#
++# CONFIG_HTTP_STATIC_BUILD is not set
++CONFIG_HTTP_PORT=80
++CONFIG_HTTP_HTTPS_PORT=443
++CONFIG_HTTP_SESSION_CACHE_SIZE=5
++CONFIG_HTTP_WEBROOT="www"
++CONFIG_HTTP_TIMEOUT=300
++# CONFIG_HTTP_HAS_CGI is not set
++CONFIG_HTTP_CGI_EXTENSIONS=""
++# CONFIG_HTTP_ENABLE_LUA is not set
++CONFIG_HTTP_LUA_PREFIX=""
++CONFIG_HTTP_LUA_CGI_LAUNCHER=""
++# CONFIG_HTTP_BUILD_LUA is not set
++CONFIG_HTTP_DIRECTORIES=y
++CONFIG_HTTP_HAS_AUTHORIZATION=y
++# CONFIG_HTTP_HAS_IPV6 is not set
++CONFIG_HTTP_VERBOSE=y
++# CONFIG_HTTP_IS_DAEMON is not set
++
++#
++# Language Bindings
++#
++# CONFIG_BINDINGS is not set
++# CONFIG_CSHARP_BINDINGS is not set
++# CONFIG_VBNET_BINDINGS is not set
++CONFIG_DOT_NET_FRAMEWORK_BASE=""
++# CONFIG_JAVA_BINDINGS is not set
++CONFIG_JAVA_HOME=""
++# CONFIG_PERL_BINDINGS is not set
++CONFIG_PERL_CORE=""
++CONFIG_PERL_LIB=""
++# CONFIG_LUA_BINDINGS is not set
++CONFIG_LUA_CORE=""
++
++#
++# Samples
++#
++CONFIG_SAMPLES=y
++CONFIG_C_SAMPLES=y
++# CONFIG_CSHARP_SAMPLES is not set
++# CONFIG_VBNET_SAMPLES is not set
++# CONFIG_JAVA_SAMPLES is not set
++# CONFIG_PERL_SAMPLES is not set
++# CONFIG_LUA_SAMPLES is not set
++
++#
++# BigInt Options
++#
++# CONFIG_BIGINT_CLASSICAL is not set
++# CONFIG_BIGINT_MONTGOMERY is not set
++CONFIG_BIGINT_BARRETT=y
++CONFIG_BIGINT_CRT=y
++# CONFIG_BIGINT_KARATSUBA is not set
++MUL_KARATSUBA_THRESH=0
++SQU_KARATSUBA_THRESH=0
++CONFIG_BIGINT_SLIDING_WINDOW=y
++CONFIG_BIGINT_SQUARE=y
++# CONFIG_BIGINT_CHECK_ON is not set
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/Makefile
+new file mode 100644
+index 0000000..3ea8bdd
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++include ../config/.config
++include ../config/makefile.conf
++
++AXTLS_HOME=..
++
++OBJ=\
++ aes.o \
++ bigint.o \
++ crypto_misc.o \
++ hmac.o \
++ md2.o \
++ md5.o \
++ rc4.o \
++ rsa.o \
++ sha1.o
++
++include ../config/makefile.post
++
++all: $(OBJ)
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/aes.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/aes.c
+new file mode 100644
+index 0000000..038a45b
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/aes.c
+@@ -0,0 +1,456 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * AES implementation - this is a small code version. There are much faster
++ * versions around but they are much larger in size (i.e. they use large
++ * submix tables).
++ */
++
++#include <string.h>
++#include "crypto.h"
++
++/* all commented out in skeleton mode */
++#ifndef CONFIG_SSL_SKELETON_MODE
++
++#define rot1(x) (((x) << 24) | ((x) >> 8))
++#define rot2(x) (((x) << 16) | ((x) >> 16))
++#define rot3(x) (((x) << 8) | ((x) >> 24))
++
++/*
++ * This cute trick does 4 'mul by two' at once. Stolen from
++ * Dr B. R. Gladman <brg@gladman.uk.net> but I'm sure the u-(u>>7) is
++ * a standard graphics trick
++ * The key to this is that we need to xor with 0x1b if the top bit is set.
++ * a 1xxx xxxx 0xxx 0xxx First we mask the 7bit,
++ * b 1000 0000 0000 0000 then we shift right by 7 putting the 7bit in 0bit,
++ * c 0000 0001 0000 0000 we then subtract (c) from (b)
++ * d 0111 1111 0000 0000 and now we and with our mask
++ * e 0001 1011 0000 0000
++ */
++#define mt 0x80808080
++#define ml 0x7f7f7f7f
++#define mh 0xfefefefe
++#define mm 0x1b1b1b1b
++#define mul2(x,t) ((t)=((x)&mt), \
++ ((((x)+(x))&mh)^(((t)-((t)>>7))&mm)))
++
++#define inv_mix_col(x,f2,f4,f8,f9) (\
++ (f2)=mul2(x,f2), \
++ (f4)=mul2(f2,f4), \
++ (f8)=mul2(f4,f8), \
++ (f9)=(x)^(f8), \
++ (f8)=((f2)^(f4)^(f8)), \
++ (f2)^=(f9), \
++ (f4)^=(f9), \
++ (f8)^=rot3(f2), \
++ (f8)^=rot2(f4), \
++ (f8)^rot1(f9))
++
++/*
++ * AES S-box
++ */
++static const uint8_t aes_sbox[256] =
++{
++ 0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,
++ 0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76,
++ 0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0,
++ 0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0,
++ 0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC,
++ 0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15,
++ 0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A,
++ 0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75,
++ 0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0,
++ 0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84,
++ 0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B,
++ 0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF,
++ 0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85,
++ 0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8,
++ 0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5,
++ 0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2,
++ 0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17,
++ 0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73,
++ 0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88,
++ 0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB,
++ 0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C,
++ 0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79,
++ 0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9,
++ 0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08,
++ 0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6,
++ 0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A,
++ 0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E,
++ 0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E,
++ 0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94,
++ 0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF,
++ 0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68,
++ 0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16,
++};
++
++/*
++ * AES is-box
++ */
++static const uint8_t aes_isbox[256] =
++{
++ 0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,
++ 0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,
++ 0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,
++ 0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,
++ 0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,
++ 0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,
++ 0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,
++ 0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,
++ 0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,
++ 0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,
++ 0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,
++ 0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,
++ 0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,
++ 0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,
++ 0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,
++ 0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,
++ 0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,
++ 0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,
++ 0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,
++ 0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,
++ 0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,
++ 0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,
++ 0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,
++ 0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,
++ 0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,
++ 0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,
++ 0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,
++ 0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,
++ 0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,
++ 0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,
++ 0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,
++ 0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d
++};
++
++static const unsigned char Rcon[30]=
++{
++ 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
++ 0x1b,0x36,0x6c,0xd8,0xab,0x4d,0x9a,0x2f,
++ 0x5e,0xbc,0x63,0xc6,0x97,0x35,0x6a,0xd4,
++ 0xb3,0x7d,0xfa,0xef,0xc5,0x91,
++};
++
++/* ----- static functions ----- */
++static void AES_encrypt(const AES_CTX *ctx, uint32_t *data);
++static void AES_decrypt(const AES_CTX *ctx, uint32_t *data);
++
++/* Perform doubling in Galois Field GF(2^8) using the irreducible polynomial
++ x^8+x^4+x^3+x+1 */
++static unsigned char AES_xtime(uint32_t x)
++{
++ return x = (x&0x80) ? (x<<1)^0x1b : x<<1;
++}
++
++/**
++ * Set up AES with the key/iv and cipher size.
++ */
++void AES_set_key(AES_CTX *ctx, const uint8_t *key,
++ const uint8_t *iv, AES_MODE mode)
++{
++ int i, ii;
++ uint32_t *W, tmp, tmp2;
++ const unsigned char *ip;
++ int words;
++
++ switch (mode)
++ {
++ case AES_MODE_128:
++ i = 10;
++ words = 4;
++ break;
++
++ case AES_MODE_256:
++ i = 14;
++ words = 8;
++ break;
++
++ default: /* fail silently */
++ return;
++ }
++
++ ctx->rounds = i;
++ ctx->key_size = words;
++ W = ctx->ks;
++ for (i = 0; i < words; i+=2)
++ {
++ W[i+0]= ((uint32_t)key[ 0]<<24)|
++ ((uint32_t)key[ 1]<<16)|
++ ((uint32_t)key[ 2]<< 8)|
++ ((uint32_t)key[ 3] );
++ W[i+1]= ((uint32_t)key[ 4]<<24)|
++ ((uint32_t)key[ 5]<<16)|
++ ((uint32_t)key[ 6]<< 8)|
++ ((uint32_t)key[ 7] );
++ key += 8;
++ }
++
++ ip = Rcon;
++ ii = 4 * (ctx->rounds+1);
++ for (i = words; i<ii; i++)
++ {
++ tmp = W[i-1];
++
++ if ((i % words) == 0)
++ {
++ tmp2 =(uint32_t)aes_sbox[(tmp )&0xff]<< 8;
++ tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<<16;
++ tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<24;
++ tmp2|=(uint32_t)aes_sbox[(tmp>>24) ];
++ tmp=tmp2^(((unsigned int)*ip)<<24);
++ ip++;
++ }
++
++ if ((words == 8) && ((i % words) == 4))
++ {
++ tmp2 =(uint32_t)aes_sbox[(tmp )&0xff] ;
++ tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<< 8;
++ tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<16;
++ tmp2|=(uint32_t)aes_sbox[(tmp>>24) ]<<24;
++ tmp=tmp2;
++ }
++
++ W[i]=W[i-words]^tmp;
++ }
++
++ /* copy the iv across */
++ memcpy(ctx->iv, iv, 16);
++}
++
++/**
++ * Change a key for decryption.
++ */
++void AES_convert_key(AES_CTX *ctx)
++{
++ int i;
++ uint32_t *k,w,t1,t2,t3,t4;
++
++ k = ctx->ks;
++ k += 4;
++
++ for (i= ctx->rounds*4; i > 4; i--)
++ {
++ w= *k;
++ w = inv_mix_col(w,t1,t2,t3,t4);
++ *k++ =w;
++ }
++}
++
++/**
++ * Encrypt a byte sequence (with a block size 16) using the AES cipher.
++ */
++void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg, uint8_t *out, int length)
++{
++ int i;
++ uint32_t tin[4], tout[4], iv[4];
++
++ memcpy(iv, ctx->iv, AES_IV_SIZE);
++ for (i = 0; i < 4; i++)
++ tout[i] = ntohl(iv[i]);
++
++ for (length -= AES_BLOCKSIZE; length >= 0; length -= AES_BLOCKSIZE)
++ {
++ uint32_t msg_32[4];
++ uint32_t out_32[4];
++ memcpy(msg_32, msg, AES_BLOCKSIZE);
++ msg += AES_BLOCKSIZE;
++
++ for (i = 0; i < 4; i++)
++ tin[i] = ntohl(msg_32[i])^tout[i];
++
++ AES_encrypt(ctx, tin);
++
++ for (i = 0; i < 4; i++)
++ {
++ tout[i] = tin[i];
++ out_32[i] = htonl(tout[i]);
++ }
++
++ memcpy(out, out_32, AES_BLOCKSIZE);
++ out += AES_BLOCKSIZE;
++ }
++
++ for (i = 0; i < 4; i++)
++ iv[i] = htonl(tout[i]);
++ memcpy(ctx->iv, iv, AES_IV_SIZE);
++}
++
++/**
++ * Decrypt a byte sequence (with a block size 16) using the AES cipher.
++ */
++void AES_cbc_decrypt(AES_CTX *ctx, const uint8_t *msg, uint8_t *out, int length)
++{
++ int i;
++ uint32_t tin[4], xor[4], tout[4], data[4], iv[4];
++
++ memcpy(iv, ctx->iv, AES_IV_SIZE);
++ for (i = 0; i < 4; i++)
++ xor[i] = ntohl(iv[i]);
++
++ for (length -= 16; length >= 0; length -= 16)
++ {
++ uint32_t msg_32[4];
++ uint32_t out_32[4];
++ memcpy(msg_32, msg, AES_BLOCKSIZE);
++ msg += AES_BLOCKSIZE;
++
++ for (i = 0; i < 4; i++)
++ {
++ tin[i] = ntohl(msg_32[i]);
++ data[i] = tin[i];
++ }
++
++ AES_decrypt(ctx, data);
++
++ for (i = 0; i < 4; i++)
++ {
++ tout[i] = data[i]^xor[i];
++ xor[i] = tin[i];
++ out_32[i] = htonl(tout[i]);
++ }
++
++ memcpy(out, out_32, AES_BLOCKSIZE);
++ out += AES_BLOCKSIZE;
++ }
++
++ for (i = 0; i < 4; i++)
++ iv[i] = htonl(xor[i]);
++ memcpy(ctx->iv, iv, AES_IV_SIZE);
++}
++
++/**
++ * Encrypt a single block (16 bytes) of data
++ */
++static void AES_encrypt(const AES_CTX *ctx, uint32_t *data)
++{
++ /* To make this code smaller, generate the sbox entries on the fly.
++ * This will have a really heavy effect upon performance.
++ */
++ uint32_t tmp[4];
++ uint32_t tmp1, old_a0, a0, a1, a2, a3, row;
++ int curr_rnd;
++ int rounds = ctx->rounds;
++ const uint32_t *k = ctx->ks;
++
++ /* Pre-round key addition */
++ for (row = 0; row < 4; row++)
++ data[row] ^= *(k++);
++
++ /* Encrypt one block. */
++ for (curr_rnd = 0; curr_rnd < rounds; curr_rnd++)
++ {
++ /* Perform ByteSub and ShiftRow operations together */
++ for (row = 0; row < 4; row++)
++ {
++ a0 = (uint32_t)aes_sbox[(data[row%4]>>24)&0xFF];
++ a1 = (uint32_t)aes_sbox[(data[(row+1)%4]>>16)&0xFF];
++ a2 = (uint32_t)aes_sbox[(data[(row+2)%4]>>8)&0xFF];
++ a3 = (uint32_t)aes_sbox[(data[(row+3)%4])&0xFF];
++
++ /* Perform MixColumn iff not last round */
++ if (curr_rnd < (rounds - 1))
++ {
++ tmp1 = a0 ^ a1 ^ a2 ^ a3;
++ old_a0 = a0;
++ a0 ^= tmp1 ^ AES_xtime(a0 ^ a1);
++ a1 ^= tmp1 ^ AES_xtime(a1 ^ a2);
++ a2 ^= tmp1 ^ AES_xtime(a2 ^ a3);
++ a3 ^= tmp1 ^ AES_xtime(a3 ^ old_a0);
++ }
++
++ tmp[row] = ((a0 << 24) | (a1 << 16) | (a2 << 8) | a3);
++ }
++
++ /* KeyAddition - note that it is vital that this loop is separate from
++ the MixColumn operation, which must be atomic...*/
++ for (row = 0; row < 4; row++)
++ data[row] = tmp[row] ^ *(k++);
++ }
++}
++
++/**
++ * Decrypt a single block (16 bytes) of data
++ */
++static void AES_decrypt(const AES_CTX *ctx, uint32_t *data)
++{
++ uint32_t tmp[4];
++ uint32_t xt0,xt1,xt2,xt3,xt4,xt5,xt6;
++ uint32_t a0, a1, a2, a3, row;
++ int curr_rnd;
++ int rounds = ctx->rounds;
++ const uint32_t *k = ctx->ks + ((rounds+1)*4);
++
++ /* pre-round key addition */
++ for (row=4; row > 0;row--)
++ data[row-1] ^= *(--k);
++
++ /* Decrypt one block */
++ for (curr_rnd = 0; curr_rnd < rounds; curr_rnd++)
++ {
++ /* Perform ByteSub and ShiftRow operations together */
++ for (row = 4; row > 0; row--)
++ {
++ a0 = aes_isbox[(data[(row+3)%4]>>24)&0xFF];
++ a1 = aes_isbox[(data[(row+2)%4]>>16)&0xFF];
++ a2 = aes_isbox[(data[(row+1)%4]>>8)&0xFF];
++ a3 = aes_isbox[(data[row%4])&0xFF];
++
++ /* Perform MixColumn iff not last round */
++ if (curr_rnd<(rounds-1))
++ {
++ /* The MDS cofefficients (0x09, 0x0B, 0x0D, 0x0E)
++ are quite large compared to encryption; this
++ operation slows decryption down noticeably. */
++ xt0 = AES_xtime(a0^a1);
++ xt1 = AES_xtime(a1^a2);
++ xt2 = AES_xtime(a2^a3);
++ xt3 = AES_xtime(a3^a0);
++ xt4 = AES_xtime(xt0^xt1);
++ xt5 = AES_xtime(xt1^xt2);
++ xt6 = AES_xtime(xt4^xt5);
++
++ xt0 ^= a1^a2^a3^xt4^xt6;
++ xt1 ^= a0^a2^a3^xt5^xt6;
++ xt2 ^= a0^a1^a3^xt4^xt6;
++ xt3 ^= a0^a1^a2^xt5^xt6;
++ tmp[row-1] = ((xt0<<24)|(xt1<<16)|(xt2<<8)|xt3);
++ }
++ else
++ tmp[row-1] = ((a0<<24)|(a1<<16)|(a2<<8)|a3);
++ }
++
++ for (row = 4; row > 0; row--)
++ data[row-1] = tmp[row-1] ^ *(--k);
++ }
++}
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.c
+new file mode 100644
+index 0000000..53a5839
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.c
+@@ -0,0 +1,1575 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * @defgroup bigint_api Big Integer API
++ * @brief The bigint implementation as used by the axTLS project.
++ *
++ * The bigint library is for RSA encryption/decryption as well as signing.
++ * This code tries to minimise use of malloc/free by maintaining a small
++ * cache. A bigint context may maintain state by being made "permanent".
++ * It be be later released with a bi_depermanent() and bi_free() call.
++ *
++ * It supports the following reduction techniques:
++ * - Classical
++ * - Barrett
++ * - Montgomery
++ *
++ * It also implements the following:
++ * - Karatsuba multiplication
++ * - Squaring
++ * - Sliding window exponentiation
++ * - Chinese Remainder Theorem (implemented in rsa.c).
++ *
++ * All the algorithms used are pretty standard, and designed for different
++ * data bus sizes. Negative numbers are not dealt with at all, so a subtraction
++ * may need to be tested for negativity.
++ *
++ * This library steals some ideas from Jef Poskanzer
++ * <http://cs.marlboro.edu/term/cs-fall02/algorithms/crypto/RSA/bigint>
++ * and GMP <http://www.swox.com/gmp>. It gets most of its implementation
++ * detail from "The Handbook of Applied Cryptography"
++ * <http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf>
++ * @{
++ */
++
++#include <stdlib.h>
++#include <limits.h>
++#include <string.h>
++#include <stdio.h>
++#include <time.h>
++#include "bigint.h"
++
++#define V1 v->comps[v->size-1] /**< v1 for division */
++#define V2 v->comps[v->size-2] /**< v2 for division */
++#define U(j) tmp_u->comps[tmp_u->size-j-1] /**< uj for division */
++#define Q(j) quotient->comps[quotient->size-j-1] /**< qj for division */
++
++static bigint *bi_int_multiply(BI_CTX *ctx, bigint *bi, comp i);
++static bigint *bi_int_divide(BI_CTX *ctx, bigint *biR, comp denom);
++static bigint *alloc(BI_CTX *ctx, int size);
++static bigint *trim(bigint *bi);
++static void more_comps(bigint *bi, int n);
++#if defined(CONFIG_BIGINT_KARATSUBA) || defined(CONFIG_BIGINT_BARRETT) || \
++ defined(CONFIG_BIGINT_MONTGOMERY)
++static bigint *comp_right_shift(bigint *biR, int num_shifts);
++static bigint *comp_left_shift(bigint *biR, int num_shifts);
++#endif
++
++#ifdef CONFIG_BIGINT_CHECK_ON
++static void check(const bigint *bi);
++#else
++#define check(A) /**< disappears in normal production mode */
++#endif
++
++
++/**
++ * @brief Start a new bigint context.
++ * @return A bigint context.
++ */
++BI_CTX *bi_initialize(void)
++{
++ /* calloc() sets everything to zero */
++ BI_CTX *ctx = (BI_CTX *)calloc(1, sizeof(BI_CTX));
++
++ /* the radix */
++ ctx->bi_radix = alloc(ctx, 2);
++ ctx->bi_radix->comps[0] = 0;
++ ctx->bi_radix->comps[1] = 1;
++ bi_permanent(ctx->bi_radix);
++ return ctx;
++}
++
++/**
++ * @brief Close the bigint context and free any resources.
++ *
++ * Free up any used memory - a check is done if all objects were not
++ * properly freed.
++ * @param ctx [in] The bigint session context.
++ */
++void bi_terminate(BI_CTX *ctx)
++{
++ bi_depermanent(ctx->bi_radix);
++ bi_free(ctx, ctx->bi_radix);
++
++ if (ctx->active_count != 0)
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("bi_terminate: there were %d un-freed bigints\n",
++ ctx->active_count);
++#endif
++ abort();
++ }
++
++ bi_clear_cache(ctx);
++ free(ctx);
++}
++
++/**
++ *@brief Clear the memory cache.
++ */
++void bi_clear_cache(BI_CTX *ctx)
++{
++ bigint *p, *pn;
++
++ if (ctx->free_list == NULL)
++ return;
++
++ for (p = ctx->free_list; p != NULL; p = pn)
++ {
++ pn = p->next;
++ free(p->comps);
++ free(p);
++ }
++
++ ctx->free_count = 0;
++ ctx->free_list = NULL;
++}
++
++/**
++ * @brief Increment the number of references to this object.
++ * It does not do a full copy.
++ * @param bi [in] The bigint to copy.
++ * @return A reference to the same bigint.
++ */
++bigint *bi_copy(bigint *bi)
++{
++ check(bi);
++ if (bi->refs != PERMANENT)
++ bi->refs++;
++ return bi;
++}
++
++/**
++ * @brief Simply make a bigint object "unfreeable" if bi_free() is called on it.
++ *
++ * For this object to be freed, bi_depermanent() must be called.
++ * @param bi [in] The bigint to be made permanent.
++ */
++void bi_permanent(bigint *bi)
++{
++ check(bi);
++ if (bi->refs != 1)
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("bi_permanent: refs was not 1\n");
++#endif
++ abort();
++ }
++
++ bi->refs = PERMANENT;
++}
++
++/**
++ * @brief Take a permanent object and make it eligible for freedom.
++ * @param bi [in] The bigint to be made back to temporary.
++ */
++void bi_depermanent(bigint *bi)
++{
++ check(bi);
++ if (bi->refs != PERMANENT)
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("bi_depermanent: bigint was not permanent\n");
++#endif
++ abort();
++ }
++
++ bi->refs = 1;
++}
++
++/**
++ * @brief Free a bigint object so it can be used again.
++ *
++ * The memory itself it not actually freed, just tagged as being available
++ * @param ctx [in] The bigint session context.
++ * @param bi [in] The bigint to be freed.
++ */
++void bi_free(BI_CTX *ctx, bigint *bi)
++{
++ check(bi);
++ if (bi->refs == PERMANENT)
++ {
++ return;
++ }
++
++ if (--bi->refs > 0)
++ {
++ return;
++ }
++
++ bi->next = ctx->free_list;
++ ctx->free_list = bi;
++ ctx->free_count++;
++
++ if (--ctx->active_count < 0)
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("bi_free: active_count went negative "
++ "- double-freed bigint?\n");
++#endif
++ abort();
++ }
++}
++
++/**
++ * @brief Convert an (unsigned) integer into a bigint.
++ * @param ctx [in] The bigint session context.
++ * @param i [in] The (unsigned) integer to be converted.
++ *
++ */
++bigint *int_to_bi(BI_CTX *ctx, comp i)
++{
++ bigint *biR = alloc(ctx, 1);
++ biR->comps[0] = i;
++ return biR;
++}
++
++/**
++ * @brief Do a full copy of the bigint object.
++ * @param ctx [in] The bigint session context.
++ * @param bi [in] The bigint object to be copied.
++ */
++bigint *bi_clone(BI_CTX *ctx, const bigint *bi)
++{
++ bigint *biR = alloc(ctx, bi->size);
++ check(bi);
++ memcpy(biR->comps, bi->comps, bi->size*COMP_BYTE_SIZE);
++ return biR;
++}
++
++/**
++ * @brief Perform an addition operation between two bigints.
++ * @param ctx [in] The bigint session context.
++ * @param bia [in] A bigint.
++ * @param bib [in] Another bigint.
++ * @return The result of the addition.
++ */
++bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib)
++{
++ int n;
++ comp carry = 0;
++ comp *pa, *pb;
++
++ check(bia);
++ check(bib);
++
++ n = max(bia->size, bib->size);
++ more_comps(bia, n+1);
++ more_comps(bib, n);
++ pa = bia->comps;
++ pb = bib->comps;
++
++ do
++ {
++ comp sl, rl, cy1;
++ sl = *pa + *pb++;
++ rl = sl + carry;
++ cy1 = sl < *pa;
++ carry = cy1 | (rl < sl);
++ *pa++ = rl;
++ } while (--n != 0);
++
++ *pa = carry; /* do overflow */
++ bi_free(ctx, bib);
++ return trim(bia);
++}
++
++/**
++ * @brief Perform a subtraction operation between two bigints.
++ * @param ctx [in] The bigint session context.
++ * @param bia [in] A bigint.
++ * @param bib [in] Another bigint.
++ * @param is_negative [out] If defined, indicates that the result was negative.
++ * is_negative may be null.
++ * @return The result of the subtraction. The result is always positive.
++ */
++bigint *bi_subtract(BI_CTX *ctx,
++ bigint *bia, bigint *bib, int *is_negative)
++{
++ int n = bia->size;
++ comp *pa, *pb, carry = 0;
++
++ check(bia);
++ check(bib);
++
++ more_comps(bib, n);
++ pa = bia->comps;
++ pb = bib->comps;
++
++ do
++ {
++ comp sl, rl, cy1;
++ sl = *pa - *pb++;
++ rl = sl - carry;
++ cy1 = sl > *pa;
++ carry = cy1 | (rl > sl);
++ *pa++ = rl;
++ } while (--n != 0);
++
++ if (is_negative) /* indicate a negative result */
++ {
++ *is_negative = carry;
++ }
++
++ bi_free(ctx, trim(bib)); /* put bib back to the way it was */
++ return trim(bia);
++}
++
++/**
++ * Perform a multiply between a bigint an an (unsigned) integer
++ */
++static bigint *bi_int_multiply(BI_CTX *ctx, bigint *bia, comp b)
++{
++ int j = 0, n = bia->size;
++ bigint *biR = alloc(ctx, n + 1);
++ comp carry = 0;
++ comp *r = biR->comps;
++ comp *a = bia->comps;
++
++ check(bia);
++
++ /* clear things to start with */
++ memset(r, 0, ((n+1)*COMP_BYTE_SIZE));
++
++ do
++ {
++ long_comp tmp = *r + (long_comp)a[j]*b + carry;
++ *r++ = (comp)tmp; /* downsize */
++ carry = (comp)(tmp >> COMP_BIT_SIZE);
++ } while (++j < n);
++
++ *r = carry;
++ bi_free(ctx, bia);
++ return trim(biR);
++}
++
++/**
++ * @brief Does both division and modulo calculations.
++ *
++ * Used extensively when doing classical reduction.
++ * @param ctx [in] The bigint session context.
++ * @param u [in] A bigint which is the numerator.
++ * @param v [in] Either the denominator or the modulus depending on the mode.
++ * @param is_mod [n] Determines if this is a normal division (0) or a reduction
++ * (1).
++ * @return The result of the division/reduction.
++ */
++bigint *bi_divide(BI_CTX *ctx, bigint *u, bigint *v, int is_mod)
++{
++ int n = v->size, m = u->size-n;
++ int j = 0, orig_u_size = u->size;
++ uint8_t mod_offset = ctx->mod_offset;
++ comp d;
++ bigint *quotient, *tmp_u;
++ comp q_dash;
++
++ check(u);
++ check(v);
++
++ /* if doing reduction and we are < mod, then return mod */
++ if (is_mod && bi_compare(v, u) > 0)
++ {
++ bi_free(ctx, v);
++ return u;
++ }
++
++ quotient = alloc(ctx, m+1);
++ tmp_u = alloc(ctx, n+1);
++ v = trim(v); /* make sure we have no leading 0's */
++ d = (comp)((long_comp)COMP_RADIX/(V1+1));
++
++ /* clear things to start with */
++ memset(quotient->comps, 0, ((quotient->size)*COMP_BYTE_SIZE));
++
++ /* normalise */
++ if (d > 1)
++ {
++ u = bi_int_multiply(ctx, u, d);
++
++ if (is_mod)
++ {
++ v = ctx->bi_normalised_mod[mod_offset];
++ }
++ else
++ {
++ v = bi_int_multiply(ctx, v, d);
++ }
++ }
++
++ if (orig_u_size == u->size) /* new digit position u0 */
++ {
++ more_comps(u, orig_u_size + 1);
++ }
++
++ do
++ {
++ /* get a temporary short version of u */
++ memcpy(tmp_u->comps, &u->comps[u->size-n-1-j], (n+1)*COMP_BYTE_SIZE);
++
++ /* calculate q' */
++ if (U(0) == V1)
++ {
++ q_dash = COMP_RADIX-1;
++ }
++ else
++ {
++ q_dash = (comp)(((long_comp)U(0)*COMP_RADIX + U(1))/V1);
++ }
++
++ if (v->size > 1 && V2)
++ {
++ /* we are implementing the following:
++ if (V2*q_dash > (((U(0)*COMP_RADIX + U(1) -
++ q_dash*V1)*COMP_RADIX) + U(2))) ... */
++ comp inner = (comp)((long_comp)COMP_RADIX*U(0) + U(1) -
++ (long_comp)q_dash*V1);
++ if ((long_comp)V2*q_dash > (long_comp)inner*COMP_RADIX + U(2))
++ {
++ q_dash--;
++ }
++ }
++
++ /* multiply and subtract */
++ if (q_dash)
++ {
++ int is_negative;
++ tmp_u = bi_subtract(ctx, tmp_u,
++ bi_int_multiply(ctx, bi_copy(v), q_dash), &is_negative);
++ more_comps(tmp_u, n+1);
++
++ Q(j) = q_dash;
++
++ /* add back */
++ if (is_negative)
++ {
++ Q(j)--;
++ tmp_u = bi_add(ctx, tmp_u, bi_copy(v));
++
++ /* lop off the carry */
++ tmp_u->size--;
++ v->size--;
++ }
++ }
++ else
++ {
++ Q(j) = 0;
++ }
++
++ /* copy back to u */
++ memcpy(&u->comps[u->size-n-1-j], tmp_u->comps, (n+1)*COMP_BYTE_SIZE);
++ } while (++j <= m);
++
++ bi_free(ctx, tmp_u);
++ bi_free(ctx, v);
++
++ if (is_mod) /* get the remainder */
++ {
++ bi_free(ctx, quotient);
++ return bi_int_divide(ctx, trim(u), d);
++ }
++ else /* get the quotient */
++ {
++ bi_free(ctx, u);
++ return trim(quotient);
++ }
++}
++
++/*
++ * Perform an integer divide on a bigint.
++ */
++static bigint *bi_int_divide(BI_CTX *ctx, bigint *biR, comp denom)
++{
++ int i = biR->size - 1;
++ long_comp r = 0;
++
++ check(biR);
++
++ do
++ {
++ r = (r<<COMP_BIT_SIZE) + biR->comps[i];
++ biR->comps[i] = (comp)(r / denom);
++ r %= denom;
++ } while (--i >= 0);
++
++ return trim(biR);
++}
++
++#ifdef CONFIG_BIGINT_MONTGOMERY
++/**
++ * There is a need for the value of integer N' such that B^-1(B-1)-N^-1N'=1,
++ * where B^-1(B-1) mod N=1. Actually, only the least significant part of
++ * N' is needed, hence the definition N0'=N' mod b. We reproduce below the
++ * simple algorithm from an article by Dusse and Kaliski to efficiently
++ * find N0' from N0 and b */
++static comp modular_inverse(bigint *bim)
++{
++ int i;
++ comp t = 1;
++ comp two_2_i_minus_1 = 2; /* 2^(i-1) */
++ long_comp two_2_i = 4; /* 2^i */
++ comp N = bim->comps[0];
++
++ for (i = 2; i <= COMP_BIT_SIZE; i++)
++ {
++ if ((long_comp)N*t%two_2_i >= two_2_i_minus_1)
++ {
++ t += two_2_i_minus_1;
++ }
++
++ two_2_i_minus_1 <<= 1;
++ two_2_i <<= 1;
++ }
++
++ return (comp)(COMP_RADIX-t);
++}
++#endif
++
++#if defined(CONFIG_BIGINT_KARATSUBA) || defined(CONFIG_BIGINT_BARRETT) || \
++ defined(CONFIG_BIGINT_MONTGOMERY)
++/**
++ * Take each component and shift down (in terms of components)
++ */
++static bigint *comp_right_shift(bigint *biR, int num_shifts)
++{
++ int i = biR->size-num_shifts;
++ comp *x = biR->comps;
++ comp *y = &biR->comps[num_shifts];
++
++ check(biR);
++
++ if (i <= 0) /* have we completely right shifted? */
++ {
++ biR->comps[0] = 0; /* return 0 */
++ biR->size = 1;
++ return biR;
++ }
++
++ do
++ {
++ *x++ = *y++;
++ } while (--i > 0);
++
++ biR->size -= num_shifts;
++ return biR;
++}
++
++/**
++ * Take each component and shift it up (in terms of components)
++ */
++static bigint *comp_left_shift(bigint *biR, int num_shifts)
++{
++ int i = biR->size-1;
++ comp *x, *y;
++
++ check(biR);
++
++ if (num_shifts <= 0)
++ {
++ return biR;
++ }
++
++ more_comps(biR, biR->size + num_shifts);
++
++ x = &biR->comps[i+num_shifts];
++ y = &biR->comps[i];
++
++ do
++ {
++ *x-- = *y--;
++ } while (i--);
++
++ memset(biR->comps, 0, num_shifts*COMP_BYTE_SIZE); /* zero LS comps */
++ return biR;
++}
++#endif
++
++/**
++ * @brief Allow a binary sequence to be imported as a bigint.
++ * @param ctx [in] The bigint session context.
++ * @param data [in] The data to be converted.
++ * @param size [in] The number of bytes of data.
++ * @return A bigint representing this data.
++ */
++bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int size)
++{
++ bigint *biR = alloc(ctx, (size+COMP_BYTE_SIZE-1)/COMP_BYTE_SIZE);
++ int i, j = 0, offset = 0;
++
++ memset(biR->comps, 0, biR->size*COMP_BYTE_SIZE);
++
++ for (i = size-1; i >= 0; i--)
++ {
++ biR->comps[offset] += data[i] << (j*8);
++
++ if (++j == COMP_BYTE_SIZE)
++ {
++ j = 0;
++ offset ++;
++ }
++ }
++
++ return trim(biR);
++}
++
++#ifdef CONFIG_SSL_FULL_MODE
++/**
++ * @brief The testharness uses this code to import text hex-streams and
++ * convert them into bigints.
++ * @param ctx [in] The bigint session context.
++ * @param data [in] A string consisting of hex characters. The characters must
++ * be in upper case.
++ * @return A bigint representing this data.
++ */
++bigint *bi_str_import(BI_CTX *ctx, const char *data)
++{
++ int size = strlen(data);
++ bigint *biR = alloc(ctx, (size+COMP_NUM_NIBBLES-1)/COMP_NUM_NIBBLES);
++ int i, j = 0, offset = 0;
++ memset(biR->comps, 0, biR->size*COMP_BYTE_SIZE);
++
++ for (i = size-1; i >= 0; i--)
++ {
++ int num = (data[i] <= '9') ? (data[i] - '0') : (data[i] - 'A' + 10);
++ biR->comps[offset] += num << (j*4);
++
++ if (++j == COMP_NUM_NIBBLES)
++ {
++ j = 0;
++ offset ++;
++ }
++ }
++
++ return biR;
++}
++
++void bi_print(const char *label, bigint *x)
++{
++ int i, j;
++
++ if (x == NULL)
++ {
++ printf("%s: (null)\n", label);
++ return;
++ }
++
++ printf("%s: (size %d)\n", label, x->size);
++ for (i = x->size-1; i >= 0; i--)
++ {
++ for (j = COMP_NUM_NIBBLES-1; j >= 0; j--)
++ {
++ comp mask = 0x0f << (j*4);
++ comp num = (x->comps[i] & mask) >> (j*4);
++ putc((num <= 9) ? (num + '0') : (num + 'A' - 10), stdout);
++ }
++ }
++
++ printf("\n");
++}
++#endif
++
++/**
++ * @brief Take a bigint and convert it into a byte sequence.
++ *
++ * This is useful after a decrypt operation.
++ * @param ctx [in] The bigint session context.
++ * @param x [in] The bigint to be converted.
++ * @param data [out] The converted data as a byte stream.
++ * @param size [in] The maximum size of the byte stream. Unused bytes will be
++ * zeroed.
++ */
++void bi_export(BI_CTX *ctx, bigint *x, uint8_t *data, int size)
++{
++ int i, j, k = size-1;
++
++ check(x);
++ memset(data, 0, size); /* ensure all leading 0's are cleared */
++
++ for (i = 0; i < x->size; i++)
++ {
++ for (j = 0; j < COMP_BYTE_SIZE; j++)
++ {
++ comp mask = 0xff << (j*8);
++ int num = (x->comps[i] & mask) >> (j*8);
++ data[k--] = num;
++
++ if (k < 0)
++ {
++ break;
++ }
++ }
++ }
++
++ bi_free(ctx, x);
++}
++
++/**
++ * @brief Pre-calculate some of the expensive steps in reduction.
++ *
++ * This function should only be called once (normally when a session starts).
++ * When the session is over, bi_free_mod() should be called. bi_mod_power()
++ * relies on this function being called.
++ * @param ctx [in] The bigint session context.
++ * @param bim [in] The bigint modulus that will be used.
++ * @param mod_offset [in] There are three moduluii that can be stored - the
++ * standard modulus, and its two primes p and q. This offset refers to which
++ * modulus we are referring to.
++ * @see bi_free_mod(), bi_mod_power().
++ */
++void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset)
++{
++ int k = bim->size;
++ comp d = (comp)((long_comp)COMP_RADIX/(bim->comps[k-1]+1));
++#ifdef CONFIG_BIGINT_MONTGOMERY
++ bigint *R, *R2;
++#endif
++
++ ctx->bi_mod[mod_offset] = bim;
++ bi_permanent(ctx->bi_mod[mod_offset]);
++ ctx->bi_normalised_mod[mod_offset] = bi_int_multiply(ctx, bim, d);
++ bi_permanent(ctx->bi_normalised_mod[mod_offset]);
++
++#if defined(CONFIG_BIGINT_MONTGOMERY)
++ /* set montgomery variables */
++ R = comp_left_shift(bi_clone(ctx, ctx->bi_radix), k-1); /* R */
++ R2 = comp_left_shift(bi_clone(ctx, ctx->bi_radix), k*2-1); /* R^2 */
++ ctx->bi_RR_mod_m[mod_offset] = bi_mod(ctx, R2); /* R^2 mod m */
++ ctx->bi_R_mod_m[mod_offset] = bi_mod(ctx, R); /* R mod m */
++
++ bi_permanent(ctx->bi_RR_mod_m[mod_offset]);
++ bi_permanent(ctx->bi_R_mod_m[mod_offset]);
++
++ ctx->N0_dash[mod_offset] = modular_inverse(ctx->bi_mod[mod_offset]);
++
++#elif defined (CONFIG_BIGINT_BARRETT)
++ ctx->bi_mu[mod_offset] =
++ bi_divide(ctx, comp_left_shift(
++ bi_clone(ctx, ctx->bi_radix), k*2-1), ctx->bi_mod[mod_offset], 0);
++ bi_permanent(ctx->bi_mu[mod_offset]);
++#endif
++}
++
++/**
++ * @brief Used when cleaning various bigints at the end of a session.
++ * @param ctx [in] The bigint session context.
++ * @param mod_offset [in] The offset to use.
++ * @see bi_set_mod().
++ */
++void bi_free_mod(BI_CTX *ctx, int mod_offset)
++{
++ bi_depermanent(ctx->bi_mod[mod_offset]);
++ bi_free(ctx, ctx->bi_mod[mod_offset]);
++#if defined (CONFIG_BIGINT_MONTGOMERY)
++ bi_depermanent(ctx->bi_RR_mod_m[mod_offset]);
++ bi_depermanent(ctx->bi_R_mod_m[mod_offset]);
++ bi_free(ctx, ctx->bi_RR_mod_m[mod_offset]);
++ bi_free(ctx, ctx->bi_R_mod_m[mod_offset]);
++#elif defined(CONFIG_BIGINT_BARRETT)
++ bi_depermanent(ctx->bi_mu[mod_offset]);
++ bi_free(ctx, ctx->bi_mu[mod_offset]);
++#endif
++ bi_depermanent(ctx->bi_normalised_mod[mod_offset]);
++ bi_free(ctx, ctx->bi_normalised_mod[mod_offset]);
++}
++
++/**
++ * Perform a standard multiplication between two bigints.
++ */
++static bigint *regular_multiply(BI_CTX *ctx, bigint *bia, bigint *bib)
++{
++ int i, j, i_plus_j;
++ int n = bia->size;
++ int t = bib->size;
++ bigint *biR = alloc(ctx, n + t);
++ comp *sr = biR->comps;
++ comp *sa = bia->comps;
++ comp *sb = bib->comps;
++
++ check(bia);
++ check(bib);
++
++ /* clear things to start with */
++ memset(biR->comps, 0, ((n+t)*COMP_BYTE_SIZE));
++ i = 0;
++
++ do
++ {
++ comp carry = 0;
++ comp b = *sb++;
++ i_plus_j = i;
++ j = 0;
++
++ do
++ {
++ long_comp tmp = sr[i_plus_j] + (long_comp)sa[j]*b + carry;
++ sr[i_plus_j++] = (comp)tmp; /* downsize */
++ carry = (comp)(tmp >> COMP_BIT_SIZE);
++ } while (++j < n);
++
++ sr[i_plus_j] = carry;
++ } while (++i < t);
++
++ bi_free(ctx, bia);
++ bi_free(ctx, bib);
++ return trim(biR);
++}
++
++#ifdef CONFIG_BIGINT_KARATSUBA
++/*
++ * Karatsuba improves on regular multiplication due to only 3 multiplications
++ * being done instead of 4. The additional additions/subtractions are O(N)
++ * rather than O(N^2) and so for big numbers it saves on a few operations
++ */
++static bigint *karatsuba(BI_CTX *ctx, bigint *bia, bigint *bib, int is_square)
++{
++ bigint *x0, *x1;
++ bigint *p0, *p1, *p2;
++ int m;
++
++ if (is_square)
++ {
++ m = (bia->size + 1)/2;
++ }
++ else
++ {
++ m = (max(bia->size, bib->size) + 1)/2;
++ }
++
++ x0 = bi_clone(ctx, bia);
++ x0->size = m;
++ x1 = bi_clone(ctx, bia);
++ comp_right_shift(x1, m);
++ bi_free(ctx, bia);
++
++ /* work out the 3 partial products */
++ if (is_square)
++ {
++ p0 = bi_square(ctx, bi_copy(x0));
++ p2 = bi_square(ctx, bi_copy(x1));
++ p1 = bi_square(ctx, bi_add(ctx, x0, x1));
++ }
++ else /* normal multiply */
++ {
++ bigint *y0, *y1;
++ y0 = bi_clone(ctx, bib);
++ y0->size = m;
++ y1 = bi_clone(ctx, bib);
++ comp_right_shift(y1, m);
++ bi_free(ctx, bib);
++
++ p0 = bi_multiply(ctx, bi_copy(x0), bi_copy(y0));
++ p2 = bi_multiply(ctx, bi_copy(x1), bi_copy(y1));
++ p1 = bi_multiply(ctx, bi_add(ctx, x0, x1), bi_add(ctx, y0, y1));
++ }
++
++ p1 = bi_subtract(ctx,
++ bi_subtract(ctx, p1, bi_copy(p2), NULL), bi_copy(p0), NULL);
++
++ comp_left_shift(p1, m);
++ comp_left_shift(p2, 2*m);
++ return bi_add(ctx, p1, bi_add(ctx, p0, p2));
++}
++#endif
++
++/**
++ * @brief Perform a multiplication operation between two bigints.
++ * @param ctx [in] The bigint session context.
++ * @param bia [in] A bigint.
++ * @param bib [in] Another bigint.
++ * @return The result of the multiplication.
++ */
++bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib)
++{
++ check(bia);
++ check(bib);
++
++#ifdef CONFIG_BIGINT_KARATSUBA
++ if (min(bia->size, bib->size) < MUL_KARATSUBA_THRESH)
++ {
++ return regular_multiply(ctx, bia, bib);
++ }
++
++ return karatsuba(ctx, bia, bib, 0);
++#else
++ return regular_multiply(ctx, bia, bib);
++#endif
++}
++
++#ifdef CONFIG_BIGINT_SQUARE
++/*
++ * Perform the actual square operion. It takes into account overflow.
++ */
++static bigint *regular_square(BI_CTX *ctx, bigint *bi)
++{
++ int t = bi->size;
++ int i = 0, j;
++ bigint *biR = alloc(ctx, t*2);
++ comp *w = biR->comps;
++ comp *x = bi->comps;
++ comp carry;
++
++ memset(w, 0, biR->size*COMP_BYTE_SIZE);
++
++ do
++ {
++ long_comp tmp = w[2*i] + (long_comp)x[i]*x[i];
++ comp u = 0;
++ w[2*i] = (comp)tmp;
++ carry = (comp)(tmp >> COMP_BIT_SIZE);
++
++ for (j = i+1; j < t; j++)
++ {
++ long_comp xx = (long_comp)x[i]*x[j];
++ long_comp xx2 = 2*xx;
++ long_comp blob = (long_comp)w[i+j]+carry;
++
++ if (u) /* previous overflow */
++ {
++ blob += COMP_RADIX;
++ }
++
++
++ u = 0;
++ tmp = xx2 + blob;
++
++ /* check for overflow */
++ if ((COMP_MAX-xx) < xx || (COMP_MAX-xx2) < blob)
++ {
++ u = 1;
++ }
++
++ w[i+j] = (comp)tmp;
++ carry = (comp)(tmp >> COMP_BIT_SIZE);
++ }
++
++ w[i+t] += carry;
++
++ if (u)
++ {
++ w[i+t+1] = 1; /* add carry */
++ }
++ } while (++i < t);
++
++ bi_free(ctx, bi);
++ return trim(biR);
++}
++
++/**
++ * @brief Perform a square operation on a bigint.
++ * @param ctx [in] The bigint session context.
++ * @param bia [in] A bigint.
++ * @return The result of the multiplication.
++ */
++bigint *bi_square(BI_CTX *ctx, bigint *bia)
++{
++ check(bia);
++
++#ifdef CONFIG_BIGINT_KARATSUBA
++ if (bia->size < SQU_KARATSUBA_THRESH)
++ {
++ return regular_square(ctx, bia);
++ }
++
++ return karatsuba(ctx, bia, NULL, 1);
++#else
++ return regular_square(ctx, bia);
++#endif
++}
++#endif
++
++/**
++ * @brief Compare two bigints.
++ * @param bia [in] A bigint.
++ * @param bib [in] Another bigint.
++ * @return -1 if smaller, 1 if larger and 0 if equal.
++ */
++int bi_compare(bigint *bia, bigint *bib)
++{
++ int r, i;
++
++ check(bia);
++ check(bib);
++
++ if (bia->size > bib->size)
++ r = 1;
++ else if (bia->size < bib->size)
++ r = -1;
++ else
++ {
++ comp *a = bia->comps;
++ comp *b = bib->comps;
++
++ /* Same number of components. Compare starting from the high end
++ * and working down. */
++ r = 0;
++ i = bia->size - 1;
++
++ do
++ {
++ if (a[i] > b[i])
++ {
++ r = 1;
++ break;
++ }
++ else if (a[i] < b[i])
++ {
++ r = -1;
++ break;
++ }
++ } while (--i >= 0);
++ }
++
++ return r;
++}
++
++/*
++ * Allocate and zero more components. Does not consume bi.
++ */
++static void more_comps(bigint *bi, int n)
++{
++ if (n > bi->max_comps)
++ {
++ bi->max_comps = max(bi->max_comps * 2, n);
++ bi->comps = (comp*)realloc(bi->comps, bi->max_comps * COMP_BYTE_SIZE);
++ }
++
++ if (n > bi->size)
++ {
++ memset(&bi->comps[bi->size], 0, (n-bi->size)*COMP_BYTE_SIZE);
++ }
++
++ bi->size = n;
++}
++
++/*
++ * Make a new empty bigint. It may just use an old one if one is available.
++ * Otherwise get one off the heap.
++ */
++static bigint *alloc(BI_CTX *ctx, int size)
++{
++ bigint *biR;
++
++ /* Can we recycle an old bigint? */
++ if (ctx->free_list != NULL)
++ {
++ biR = ctx->free_list;
++ ctx->free_list = biR->next;
++ ctx->free_count--;
++
++ if (biR->refs != 0)
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("alloc: refs was not 0\n");
++#endif
++ abort(); /* create a stack trace from a core dump */
++ }
++
++ more_comps(biR, size);
++ }
++ else
++ {
++ /* No free bigints available - create a new one. */
++ biR = (bigint *)malloc(sizeof(bigint));
++ biR->comps = (comp*)malloc(size * COMP_BYTE_SIZE);
++ biR->max_comps = size; /* give some space to spare */
++ }
++
++ biR->size = size;
++ biR->refs = 1;
++ biR->next = NULL;
++ ctx->active_count++;
++ return biR;
++}
++
++/*
++ * Work out the highest '1' bit in an exponent. Used when doing sliding-window
++ * exponentiation.
++ */
++static int find_max_exp_index(bigint *biexp)
++{
++ int i = COMP_BIT_SIZE-1;
++ comp shift = COMP_RADIX/2;
++ comp test = biexp->comps[biexp->size-1]; /* assume no leading zeroes */
++
++ check(biexp);
++
++ do
++ {
++ if (test & shift)
++ {
++ return i+(biexp->size-1)*COMP_BIT_SIZE;
++ }
++
++ shift >>= 1;
++ } while (--i != 0);
++
++ return -1; /* error - must have been a leading 0 */
++}
++
++/*
++ * Is a particular bit is an exponent 1 or 0? Used when doing sliding-window
++ * exponentiation.
++ */
++static int exp_bit_is_one(bigint *biexp, int offset)
++{
++ comp test = biexp->comps[offset / COMP_BIT_SIZE];
++ int num_shifts = offset % COMP_BIT_SIZE;
++ comp shift = 1;
++ int i;
++
++ check(biexp);
++
++ for (i = 0; i < num_shifts; i++)
++ {
++ shift <<= 1;
++ }
++
++ return test & shift;
++}
++
++#ifdef CONFIG_BIGINT_CHECK_ON
++/*
++ * Perform a sanity check on bi.
++ */
++static void check(const bigint *bi)
++{
++ if (bi->refs <= 0)
++ {
++ printf("check: zero or negative refs in bigint\n");
++ abort();
++ }
++
++ if (bi->next != NULL)
++ {
++ printf("check: attempt to use a bigint from "
++ "the free list\n");
++ abort();
++ }
++}
++#endif
++
++/*
++ * Delete any leading 0's (and allow for 0).
++ */
++static bigint *trim(bigint *bi)
++{
++ check(bi);
++
++ while (bi->comps[bi->size-1] == 0 && bi->size > 1)
++ {
++ bi->size--;
++ }
++
++ return bi;
++}
++
++#if defined(CONFIG_BIGINT_MONTGOMERY)
++/**
++ * @brief Perform a single montgomery reduction.
++ * @param ctx [in] The bigint session context.
++ * @param bixy [in] A bigint.
++ * @return The result of the montgomery reduction.
++ */
++bigint *bi_mont(BI_CTX *ctx, bigint *bixy)
++{
++ int i = 0, n;
++ uint8_t mod_offset = ctx->mod_offset;
++ bigint *bim = ctx->bi_mod[mod_offset];
++ comp mod_inv = ctx->N0_dash[mod_offset];
++
++ check(bixy);
++
++ if (ctx->use_classical) /* just use classical instead */
++ {
++ return bi_mod(ctx, bixy);
++ }
++
++ n = bim->size;
++
++ do
++ {
++ bixy = bi_add(ctx, bixy, comp_left_shift(
++ bi_int_multiply(ctx, bim, bixy->comps[i]*mod_inv), i));
++ } while (++i < n);
++
++ comp_right_shift(bixy, n);
++
++ if (bi_compare(bixy, bim) >= 0)
++ {
++ bixy = bi_subtract(ctx, bixy, bim, NULL);
++ }
++
++ return bixy;
++}
++
++#elif defined(CONFIG_BIGINT_BARRETT)
++/*
++ * Stomp on the most significant components to give the illusion of a "mod base
++ * radix" operation
++ */
++static bigint *comp_mod(bigint *bi, int mod)
++{
++ check(bi);
++
++ if (bi->size > mod)
++ {
++ bi->size = mod;
++ }
++
++ return bi;
++}
++
++/*
++ * Barrett reduction has no need for some parts of the product, so ignore bits
++ * of the multiply. This routine gives Barrett its big performance
++ * improvements over Classical/Montgomery reduction methods.
++ */
++static bigint *partial_multiply(BI_CTX *ctx, bigint *bia, bigint *bib,
++ int inner_partial, int outer_partial)
++{
++ int i = 0, j, n = bia->size, t = bib->size;
++ bigint *biR;
++ comp carry;
++ comp *sr, *sa, *sb;
++
++ check(bia);
++ check(bib);
++
++ biR = alloc(ctx, n + t);
++ sa = bia->comps;
++ sb = bib->comps;
++ sr = biR->comps;
++
++ if (inner_partial)
++ {
++ memset(sr, 0, inner_partial*COMP_BYTE_SIZE);
++ }
++ else /* outer partial */
++ {
++ if (n < outer_partial || t < outer_partial) /* should we bother? */
++ {
++ bi_free(ctx, bia);
++ bi_free(ctx, bib);
++ biR->comps[0] = 0; /* return 0 */
++ biR->size = 1;
++ return biR;
++ }
++
++ memset(&sr[outer_partial], 0, (n+t-outer_partial)*COMP_BYTE_SIZE);
++ }
++
++ do
++ {
++ comp *a = sa;
++ comp b = *sb++;
++ long_comp tmp;
++ int i_plus_j = i;
++ carry = 0;
++ j = n;
++
++ if (outer_partial && i_plus_j < outer_partial)
++ {
++ i_plus_j = outer_partial;
++ a = &sa[outer_partial-i];
++ j = n-(outer_partial-i);
++ }
++
++ do
++ {
++ if (inner_partial && i_plus_j >= inner_partial)
++ {
++ break;
++ }
++
++ tmp = sr[i_plus_j] + ((long_comp)*a++)*b + carry;
++ sr[i_plus_j++] = (comp)tmp; /* downsize */
++ carry = (comp)(tmp >> COMP_BIT_SIZE);
++ } while (--j != 0);
++
++ sr[i_plus_j] = carry;
++ } while (++i < t);
++
++ bi_free(ctx, bia);
++ bi_free(ctx, bib);
++ return trim(biR);
++}
++
++/**
++ * @brief Perform a single Barrett reduction.
++ * @param ctx [in] The bigint session context.
++ * @param bi [in] A bigint.
++ * @return The result of the Barrett reduction.
++ */
++bigint *bi_barrett(BI_CTX *ctx, bigint *bi)
++{
++ bigint *q1, *q2, *q3, *r1, *r2, *r;
++ uint8_t mod_offset = ctx->mod_offset;
++ bigint *bim = ctx->bi_mod[mod_offset];
++ int k = bim->size;
++
++ check(bi);
++ check(bim);
++
++ /* use Classical method instead - Barrett cannot help here */
++ if (bi->size > k*2)
++ {
++ return bi_mod(ctx, bi);
++ }
++
++ q1 = comp_right_shift(bi_clone(ctx, bi), k-1);
++
++ /* do outer partial multiply */
++ q2 = partial_multiply(ctx, q1, ctx->bi_mu[mod_offset], 0, k-1);
++ q3 = comp_right_shift(q2, k+1);
++ r1 = comp_mod(bi, k+1);
++
++ /* do inner partial multiply */
++ r2 = comp_mod(partial_multiply(ctx, q3, bim, k+1, 0), k+1);
++ r = bi_subtract(ctx, r1, r2, NULL);
++
++ /* if (r >= m) r = r - m; */
++ if (bi_compare(r, bim) >= 0)
++ {
++ r = bi_subtract(ctx, r, bim, NULL);
++ }
++
++ return r;
++}
++#endif /* CONFIG_BIGINT_BARRETT */
++
++#ifdef CONFIG_BIGINT_SLIDING_WINDOW
++/*
++ * Work out g1, g3, g5, g7... etc for the sliding-window algorithm
++ */
++static void precompute_slide_window(BI_CTX *ctx, int window, bigint *g1)
++{
++ int k = 1, i;
++ bigint *g2;
++
++ for (i = 0; i < window-1; i++) /* compute 2^(window-1) */
++ {
++ k <<= 1;
++ }
++
++ ctx->g = (bigint **)malloc(k*sizeof(bigint *));
++ ctx->g[0] = bi_clone(ctx, g1);
++ bi_permanent(ctx->g[0]);
++ g2 = bi_residue(ctx, bi_square(ctx, ctx->g[0])); /* g^2 */
++
++ for (i = 1; i < k; i++)
++ {
++ ctx->g[i] = bi_residue(ctx, bi_multiply(ctx, ctx->g[i-1], bi_copy(g2)));
++ bi_permanent(ctx->g[i]);
++ }
++
++ bi_free(ctx, g2);
++ ctx->window = k;
++}
++#endif
++
++/**
++ * @brief Perform a modular exponentiation.
++ *
++ * This function requires bi_set_mod() to have been called previously. This is
++ * one of the optimisations used for performance.
++ * @param ctx [in] The bigint session context.
++ * @param bi [in] The bigint on which to perform the mod power operation.
++ * @param biexp [in] The bigint exponent.
++ * @return The result of the mod exponentiation operation
++ * @see bi_set_mod().
++ */
++bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp)
++{
++ int i = find_max_exp_index(biexp), j, window_size = 1;
++ bigint *biR = int_to_bi(ctx, 1);
++
++#if defined(CONFIG_BIGINT_MONTGOMERY)
++ uint8_t mod_offset = ctx->mod_offset;
++ if (!ctx->use_classical)
++ {
++ /* preconvert */
++ bi = bi_mont(ctx,
++ bi_multiply(ctx, bi, ctx->bi_RR_mod_m[mod_offset])); /* x' */
++ bi_free(ctx, biR);
++ biR = ctx->bi_R_mod_m[mod_offset]; /* A */
++ }
++#endif
++
++ check(bi);
++ check(biexp);
++
++#ifdef CONFIG_BIGINT_SLIDING_WINDOW
++ for (j = i; j > 32; j /= 5) /* work out an optimum size */
++ window_size++;
++
++ /* work out the slide constants */
++ precompute_slide_window(ctx, window_size, bi);
++#else /* just one constant */
++ ctx->g = (bigint **)malloc(sizeof(bigint *));
++ ctx->g[0] = bi_clone(ctx, bi);
++ ctx->window = 1;
++ bi_permanent(ctx->g[0]);
++#endif
++
++ /* if sliding-window is off, then only one bit will be done at a time and
++ * will reduce to standard left-to-right exponentiation */
++ do
++ {
++ if (exp_bit_is_one(biexp, i))
++ {
++ int l = i-window_size+1;
++ int part_exp = 0;
++
++ if (l < 0) /* LSB of exponent will always be 1 */
++ l = 0;
++ else
++ {
++ while (exp_bit_is_one(biexp, l) == 0)
++ l++; /* go back up */
++ }
++
++ /* build up the section of the exponent */
++ for (j = i; j >= l; j--)
++ {
++ biR = bi_residue(ctx, bi_square(ctx, biR));
++ if (exp_bit_is_one(biexp, j))
++ part_exp++;
++
++ if (j != l)
++ part_exp <<= 1;
++ }
++
++ part_exp = (part_exp-1)/2; /* adjust for array */
++ biR = bi_residue(ctx, bi_multiply(ctx, biR, ctx->g[part_exp]));
++ i = l-1;
++ }
++ else /* square it */
++ {
++ biR = bi_residue(ctx, bi_square(ctx, biR));
++ i--;
++ }
++ } while (i >= 0);
++
++ /* cleanup */
++ for (i = 0; i < ctx->window; i++)
++ {
++ bi_depermanent(ctx->g[i]);
++ bi_free(ctx, ctx->g[i]);
++ }
++
++ free(ctx->g);
++ bi_free(ctx, bi);
++ bi_free(ctx, biexp);
++#if defined CONFIG_BIGINT_MONTGOMERY
++ return ctx->use_classical ? biR : bi_mont(ctx, biR); /* convert back */
++#else /* CONFIG_BIGINT_CLASSICAL or CONFIG_BIGINT_BARRETT */
++ return biR;
++#endif
++}
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++/**
++ * @brief Perform a modular exponentiation using a temporary modulus.
++ *
++ * We need this function to check the signatures of certificates. The modulus
++ * of this function is temporary as it's just used for authentication.
++ * @param ctx [in] The bigint session context.
++ * @param bi [in] The bigint to perform the exp/mod.
++ * @param bim [in] The temporary modulus.
++ * @param biexp [in] The bigint exponent.
++ * @return The result of the mod exponentiation operation
++ * @see bi_set_mod().
++ */
++bigint *bi_mod_power2(BI_CTX *ctx, bigint *bi, bigint *bim, bigint *biexp)
++{
++ bigint *biR, *tmp_biR;
++
++ /* Set up a temporary bigint context and transfer what we need between
++ * them. We need to do this since we want to keep the original modulus
++ * which is already in this context. This operation is only called when
++ * doing peer verification, and so is not expensive :-) */
++ BI_CTX *tmp_ctx = bi_initialize();
++ bi_set_mod(tmp_ctx, bi_clone(tmp_ctx, bim), BIGINT_M_OFFSET);
++ tmp_biR = bi_mod_power(tmp_ctx,
++ bi_clone(tmp_ctx, bi),
++ bi_clone(tmp_ctx, biexp));
++ biR = bi_clone(ctx, tmp_biR);
++ bi_free(tmp_ctx, tmp_biR);
++ bi_free_mod(tmp_ctx, BIGINT_M_OFFSET);
++ bi_terminate(tmp_ctx);
++
++ bi_free(ctx, bi);
++ bi_free(ctx, bim);
++ bi_free(ctx, biexp);
++ return biR;
++}
++#endif
++
++#ifdef CONFIG_BIGINT_CRT
++/**
++ * @brief Use the Chinese Remainder Theorem to quickly perform RSA decrypts.
++ *
++ * @param ctx [in] The bigint session context.
++ * @param bi [in] The bigint to perform the exp/mod.
++ * @param dP [in] CRT's dP bigint
++ * @param dQ [in] CRT's dQ bigint
++ * @param p [in] CRT's p bigint
++ * @param q [in] CRT's q bigint
++ * @param qInv [in] CRT's qInv bigint
++ * @return The result of the CRT operation
++ */
++bigint *bi_crt(BI_CTX *ctx, bigint *bi,
++ bigint *dP, bigint *dQ,
++ bigint *p, bigint *q, bigint *qInv)
++{
++ bigint *m1, *m2, *h;
++
++ /* Montgomery has a condition the 0 < x, y < m and these products violate
++ * that condition. So disable Montgomery when using CRT */
++#if defined(CONFIG_BIGINT_MONTGOMERY)
++ ctx->use_classical = 1;
++#endif
++ ctx->mod_offset = BIGINT_P_OFFSET;
++ m1 = bi_mod_power(ctx, bi_copy(bi), dP);
++
++ ctx->mod_offset = BIGINT_Q_OFFSET;
++ m2 = bi_mod_power(ctx, bi, dQ);
++
++ h = bi_subtract(ctx, bi_add(ctx, m1, p), bi_copy(m2), NULL);
++ h = bi_multiply(ctx, h, qInv);
++ ctx->mod_offset = BIGINT_P_OFFSET;
++ h = bi_residue(ctx, h);
++#if defined(CONFIG_BIGINT_MONTGOMERY)
++ ctx->use_classical = 0; /* reset for any further operation */
++#endif
++ return bi_add(ctx, m2, bi_multiply(ctx, q, h));
++}
++#endif
++/** @} */
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.h b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.h
+new file mode 100644
+index 0000000..2966a3e
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.h
+@@ -0,0 +1,99 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#ifndef BIGINT_HEADER
++#define BIGINT_HEADER
++
++#include "crypto.h"
++
++BI_CTX *bi_initialize(void);
++void bi_terminate(BI_CTX *ctx);
++void bi_permanent(bigint *bi);
++void bi_depermanent(bigint *bi);
++void bi_clear_cache(BI_CTX *ctx);
++void bi_free(BI_CTX *ctx, bigint *bi);
++bigint *bi_copy(bigint *bi);
++bigint *bi_clone(BI_CTX *ctx, const bigint *bi);
++void bi_export(BI_CTX *ctx, bigint *bi, uint8_t *data, int size);
++bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int len);
++bigint *int_to_bi(BI_CTX *ctx, comp i);
++
++/* the functions that actually do something interesting */
++bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib);
++bigint *bi_subtract(BI_CTX *ctx, bigint *bia,
++ bigint *bib, int *is_negative);
++bigint *bi_divide(BI_CTX *ctx, bigint *bia, bigint *bim, int is_mod);
++bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib);
++bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp);
++bigint *bi_mod_power2(BI_CTX *ctx, bigint *bi, bigint *bim, bigint *biexp);
++int bi_compare(bigint *bia, bigint *bib);
++void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset);
++void bi_free_mod(BI_CTX *ctx, int mod_offset);
++
++#ifdef CONFIG_SSL_FULL_MODE
++void bi_print(const char *label, bigint *bi);
++bigint *bi_str_import(BI_CTX *ctx, const char *data);
++#endif
++
++/**
++ * @def bi_mod
++ * Find the residue of B. bi_set_mod() must be called before hand.
++ */
++#define bi_mod(A, B) bi_divide(A, B, ctx->bi_mod[ctx->mod_offset], 1)
++
++/**
++ * bi_residue() is technically the same as bi_mod(), but it uses the
++ * appropriate reduction technique (which is bi_mod() when doing classical
++ * reduction).
++ */
++#if defined(CONFIG_BIGINT_MONTGOMERY)
++#define bi_residue(A, B) bi_mont(A, B)
++bigint *bi_mont(BI_CTX *ctx, bigint *bixy);
++#elif defined(CONFIG_BIGINT_BARRETT)
++#define bi_residue(A, B) bi_barrett(A, B)
++bigint *bi_barrett(BI_CTX *ctx, bigint *bi);
++#else /* if defined(CONFIG_BIGINT_CLASSICAL) */
++#define bi_residue(A, B) bi_mod(A, B)
++#endif
++
++#ifdef CONFIG_BIGINT_SQUARE
++bigint *bi_square(BI_CTX *ctx, bigint *bi);
++#else
++#define bi_square(A, B) bi_multiply(A, bi_copy(B), B)
++#endif
++
++#ifdef CONFIG_BIGINT_CRT
++bigint *bi_crt(BI_CTX *ctx, bigint *bi,
++ bigint *dP, bigint *dQ,
++ bigint *p, bigint *q,
++ bigint *qInv);
++#endif
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint_impl.h b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint_impl.h
+new file mode 100644
+index 0000000..1483154
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint_impl.h
+@@ -0,0 +1,112 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#ifndef BIGINT_IMPL_HEADER
++#define BIGINT_IMPL_HEADER
++
++/* Maintain a number of precomputed variables when doing reduction */
++#define BIGINT_M_OFFSET 0 /**< Normal modulo offset. */
++#ifdef CONFIG_BIGINT_CRT
++#define BIGINT_P_OFFSET 1 /**< p modulo offset. */
++#define BIGINT_Q_OFFSET 2 /**< q module offset. */
++#define BIGINT_NUM_MODS 3 /**< The number of modulus constants used. */
++#else
++#define BIGINT_NUM_MODS 1
++#endif
++
++/* Architecture specific functions for big ints */
++#ifdef WIN32
++#define COMP_RADIX 4294967296i64
++#define COMP_MAX 0xFFFFFFFFFFFFFFFFui64
++#else
++#define COMP_RADIX 4294967296ULL /**< Max component + 1 */
++#define COMP_MAX 0xFFFFFFFFFFFFFFFFULL/**< (Max dbl comp -1) */
++#endif
++#define COMP_BIT_SIZE 32 /**< Number of bits in a component. */
++#define COMP_BYTE_SIZE 4 /**< Number of bytes in a component. */
++#define COMP_NUM_NIBBLES 8 /**< Used For diagnostics only. */
++
++typedef uint32_t comp; /**< A single precision component. */
++typedef uint64_t long_comp; /**< A double precision component. */
++typedef int64_t slong_comp; /**< A signed double precision component. */
++
++/**
++ * @struct _bigint
++ * @brief A big integer basic object
++ */
++struct _bigint
++{
++ struct _bigint* next; /**< The next bigint in the cache. */
++ short size; /**< The number of components in this bigint. */
++ short max_comps; /**< The heapsize allocated for this bigint */
++ int refs; /**< An internal reference count. */
++ comp* comps; /**< A ptr to the actual component data */
++};
++
++typedef struct _bigint bigint; /**< An alias for _bigint */
++
++/**
++ * Maintains the state of the cache, and a number of variables used in
++ * reduction.
++ */
++typedef struct /**< A big integer "session" context. */
++{
++ bigint *active_list; /**< Bigints currently used. */
++ bigint *free_list; /**< Bigints not used. */
++ bigint *bi_radix; /**< The radix used. */
++ bigint *bi_mod[BIGINT_NUM_MODS]; /**< modulus */
++
++#if defined(CONFIG_BIGINT_MONTGOMERY)
++ bigint *bi_RR_mod_m[BIGINT_NUM_MODS]; /**< R^2 mod m */
++ bigint *bi_R_mod_m[BIGINT_NUM_MODS]; /**< R mod m */
++ comp N0_dash[BIGINT_NUM_MODS];
++#elif defined(CONFIG_BIGINT_BARRETT)
++ bigint *bi_mu[BIGINT_NUM_MODS]; /**< Storage for mu */
++#endif
++ bigint *bi_normalised_mod[BIGINT_NUM_MODS]; /**< Normalised mod storage. */
++ bigint **g; /**< Used by sliding-window. */
++ int window; /**< The size of the sliding window */
++ int active_count; /**< Number of active bigints. */
++ int free_count; /**< Number of free bigints. */
++
++#ifdef CONFIG_BIGINT_MONTGOMERY
++ uint8_t use_classical; /**< Use classical reduction. */
++#endif
++ uint8_t mod_offset; /**< The mod offset we are using */
++} BI_CTX;
++
++#ifndef WIN32
++#define max(a,b) ((a)>(b)?(a):(b)) /**< Find the maximum of 2 numbers. */
++#define min(a,b) ((a)<(b)?(a):(b)) /**< Find the minimum of 2 numbers. */
++#endif
++
++#define PERMANENT 0x7FFF55AA /**< A magic number for permanents. */
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto.h b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto.h
+new file mode 100644
+index 0000000..5c95f21
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto.h
+@@ -0,0 +1,222 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * @file crypto.h
++ */
++
++#ifndef HEADER_CRYPTO_H
++#define HEADER_CRYPTO_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include "config.h"
++#include "os_port.h"
++#include "bigint_impl.h"
++#include "bigint.h"
++
++/* enable features based on a 'super-set' capbaility. */
++#if defined(CONFIG_SSL_FULL_MODE)
++#define CONFIG_SSL_ENABLE_CLIENT
++#define CONFIG_SSL_CERT_VERIFICATION
++#elif defined(CONFIG_SSL_ENABLE_CLIENT)
++#define CONFIG_SSL_CERT_VERIFICATION
++#endif
++
++/**************************************************************************
++ * AES declarations
++ **************************************************************************/
++
++#define AES_MAXROUNDS 14
++#define AES_BLOCKSIZE 16
++#define AES_IV_SIZE 16
++
++typedef struct aes_key_st
++{
++ uint16_t rounds;
++ uint16_t key_size;
++ uint32_t ks[(AES_MAXROUNDS+1)*8];
++ uint8_t iv[AES_IV_SIZE];
++} AES_CTX;
++
++typedef enum
++{
++ AES_MODE_128,
++ AES_MODE_256
++} AES_MODE;
++
++void AES_set_key(AES_CTX *ctx, const uint8_t *key,
++ const uint8_t *iv, AES_MODE mode);
++void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg,
++ uint8_t *out, int length);
++void AES_cbc_decrypt(AES_CTX *ks, const uint8_t *in, uint8_t *out, int length);
++void AES_convert_key(AES_CTX *ctx);
++
++/**************************************************************************
++ * RC4 declarations
++ **************************************************************************/
++
++typedef struct
++{
++ uint8_t x, y, m[256];
++} RC4_CTX;
++
++void RC4_setup(RC4_CTX *s, const uint8_t *key, int length);
++void RC4_crypt(RC4_CTX *s, const uint8_t *msg, uint8_t *data, int length);
++
++/**************************************************************************
++ * SHA1 declarations
++ **************************************************************************/
++
++#define SHA1_SIZE 20
++
++/*
++ * This structure will hold context information for the SHA-1
++ * hashing operation
++ */
++typedef struct
++{
++ uint32_t Intermediate_Hash[SHA1_SIZE/4]; /* Message Digest */
++ uint32_t Length_Low; /* Message length in bits */
++ uint32_t Length_High; /* Message length in bits */
++ uint16_t Message_Block_Index; /* Index into message block array */
++ uint8_t Message_Block[64]; /* 512-bit message blocks */
++} SHA1_CTX;
++
++void SHA1_Init(SHA1_CTX *);
++void SHA1_Update(SHA1_CTX *, const uint8_t * msg, int len);
++void SHA1_Final(uint8_t *digest, SHA1_CTX *);
++
++/**************************************************************************
++ * MD2 declarations
++ **************************************************************************/
++
++#define MD2_SIZE 16
++
++typedef struct
++{
++ unsigned char cksum[16]; /* checksum of the data block */
++ unsigned char state[48]; /* intermediate digest state */
++ unsigned char buffer[16]; /* data block being processed */
++ int left; /* amount of data in buffer */
++} MD2_CTX;
++
++EXP_FUNC void STDCALL MD2_Init(MD2_CTX *ctx);
++EXP_FUNC void STDCALL MD2_Update(MD2_CTX *ctx, const uint8_t *input, int ilen);
++EXP_FUNC void STDCALL MD2_Final(uint8_t *digest, MD2_CTX *ctx);
++
++/**************************************************************************
++ * MD5 declarations
++ **************************************************************************/
++
++#define MD5_SIZE 16
++
++typedef struct
++{
++ uint32_t state[4]; /* state (ABCD) */
++ uint32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */
++ uint8_t buffer[64]; /* input buffer */
++} MD5_CTX;
++
++EXP_FUNC void STDCALL MD5_Init(MD5_CTX *);
++EXP_FUNC void STDCALL MD5_Update(MD5_CTX *, const uint8_t *msg, int len);
++EXP_FUNC void STDCALL MD5_Final(uint8_t *digest, MD5_CTX *);
++
++/**************************************************************************
++ * HMAC declarations
++ **************************************************************************/
++void hmac_md5(const uint8_t *msg, int length, const uint8_t *key,
++ int key_len, uint8_t *digest);
++void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key,
++ int key_len, uint8_t *digest);
++
++/**************************************************************************
++ * RSA declarations
++ **************************************************************************/
++
++typedef struct
++{
++ bigint *m; /* modulus */
++ bigint *e; /* public exponent */
++ bigint *d; /* private exponent */
++#ifdef CONFIG_BIGINT_CRT
++ bigint *p; /* p as in m = pq */
++ bigint *q; /* q as in m = pq */
++ bigint *dP; /* d mod (p-1) */
++ bigint *dQ; /* d mod (q-1) */
++ bigint *qInv; /* q^-1 mod p */
++#endif
++ int num_octets;
++ BI_CTX *bi_ctx;
++} RSA_CTX;
++
++void RSA_priv_key_new(RSA_CTX **rsa_ctx,
++ const uint8_t *modulus, int mod_len,
++ const uint8_t *pub_exp, int pub_len,
++ const uint8_t *priv_exp, int priv_len
++#ifdef CONFIG_BIGINT_CRT
++ , const uint8_t *p, int p_len,
++ const uint8_t *q, int q_len,
++ const uint8_t *dP, int dP_len,
++ const uint8_t *dQ, int dQ_len,
++ const uint8_t *qInv, int qInv_len
++#endif
++ );
++void RSA_pub_key_new(RSA_CTX **rsa_ctx,
++ const uint8_t *modulus, int mod_len,
++ const uint8_t *pub_exp, int pub_len);
++void RSA_free(RSA_CTX *ctx);
++int RSA_decrypt(const RSA_CTX *ctx, const uint8_t *in_data, uint8_t *out_data,
++ int is_decryption);
++bigint *RSA_private(const RSA_CTX *c, bigint *bi_msg);
++#if defined(CONFIG_SSL_CERT_VERIFICATION) || defined(CONFIG_SSL_GENERATE_X509_CERT)
++bigint *RSA_sign_verify(BI_CTX *ctx, const uint8_t *sig, int sig_len,
++ bigint *modulus, bigint *pub_exp);
++bigint *RSA_public(const RSA_CTX * c, bigint *bi_msg);
++int RSA_encrypt(const RSA_CTX *ctx, const uint8_t *in_data, uint16_t in_len,
++ uint8_t *out_data, int is_signing);
++void RSA_print(const RSA_CTX *ctx);
++#endif
++
++/**************************************************************************
++ * RNG declarations
++ **************************************************************************/
++EXP_FUNC void STDCALL RNG_initialize(const uint8_t *seed_buf, int size);
++EXP_FUNC void STDCALL RNG_terminate(void);
++EXP_FUNC void STDCALL get_random(int num_rand_bytes, uint8_t *rand_data);
++void get_random_NZ(int num_rand_bytes, uint8_t *rand_data);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto_misc.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto_misc.c
+new file mode 100644
+index 0000000..59b72ec
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto_misc.c
+@@ -0,0 +1,357 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * Some misc. routines to help things out
++ */
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdarg.h>
++#include <stdio.h>
++#include "crypto_misc.h"
++#ifdef CONFIG_WIN32_USE_CRYPTO_LIB
++#include "wincrypt.h"
++#endif
++
++#ifndef WIN32
++static int rng_fd = -1;
++#elif defined(CONFIG_WIN32_USE_CRYPTO_LIB)
++static HCRYPTPROV gCryptProv;
++#endif
++
++#if (!defined(CONFIG_USE_DEV_URANDOM) && !defined(CONFIG_WIN32_USE_CRYPTO_LIB))
++static uint64_t rng_num;
++#endif
++
++static int rng_ref_count;
++const char * const unsupported_str = "Error: Feature not supported\n";
++
++#ifndef CONFIG_SSL_SKELETON_MODE
++/**
++ * Retrieve a file and put it into memory
++ * @return The size of the file, or -1 on failure.
++ */
++int get_file(const char *filename, uint8_t **buf)
++{
++ int total_bytes = 0;
++ int bytes_read = 0;
++ int filesize;
++ FILE *stream = fopen(filename, "rb");
++
++ if (stream == NULL)
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("file '%s' does not exist\n", filename); TTY_FLUSH();
++#endif
++ return -1;
++ }
++
++ /* Win CE doesn't support stat() */
++ fseek(stream, 0, SEEK_END);
++ filesize = ftell(stream);
++ *buf = (uint8_t *)malloc(filesize);
++ fseek(stream, 0, SEEK_SET);
++
++ do
++ {
++ bytes_read = fread(*buf+total_bytes, 1, filesize-total_bytes, stream);
++ total_bytes += bytes_read;
++ } while (total_bytes < filesize && bytes_read > 0);
++
++ fclose(stream);
++ return filesize;
++}
++#endif
++
++/**
++ * Initialise the Random Number Generator engine.
++ * - On Win32 use the platform SDK's crypto engine.
++ * - On Linux use /dev/urandom
++ * - If none of these work then use a custom RNG.
++ */
++EXP_FUNC void STDCALL RNG_initialize(const uint8_t *seed_buf, int size)
++{
++ if (rng_ref_count == 0)
++ {
++#if !defined(WIN32) && defined(CONFIG_USE_DEV_URANDOM)
++ rng_fd = ax_open("/dev/urandom", O_RDONLY);
++#elif defined(WIN32) && defined(CONFIG_WIN32_USE_CRYPTO_LIB)
++ if (!CryptAcquireContext(&gCryptProv,
++ NULL, NULL, PROV_RSA_FULL, 0))
++ {
++ if (GetLastError() == NTE_BAD_KEYSET &&
++ !CryptAcquireContext(&gCryptProv,
++ NULL,
++ NULL,
++ PROV_RSA_FULL,
++ CRYPT_NEWKEYSET))
++ {
++ printf("CryptoLib: %x\n", unsupported_str, GetLastError());
++ exit(1);
++ }
++ }
++#else
++ /* help seed with the user's private key - this is a number that
++ should be hard to find, due to the fact that it relies on knowing
++ the private key */
++ int i;
++
++ for (i = 0; i < size/(int)sizeof(uint64_t); i++)
++ rng_num ^= *((uint64_t *)&seed_buf[i*sizeof(uint64_t)]);
++
++ srand((long)&seed_buf); /* use the stack ptr as another rnd seed */
++#endif
++ }
++
++ rng_ref_count++;
++}
++
++/**
++ * Terminate the RNG engine.
++ */
++EXP_FUNC void STDCALL RNG_terminate(void)
++{
++ if (--rng_ref_count == 0)
++ {
++#ifndef WIN32
++ close(rng_fd);
++#elif defined(CONFIG_WIN32_USE_CRYPTO_LIB)
++ CryptReleaseContext(gCryptProv, 0);
++#endif
++ }
++}
++
++/**
++ * Set a series of bytes with a random number. Individual bytes can be 0
++ */
++EXP_FUNC void STDCALL get_random(int num_rand_bytes, uint8_t *rand_data)
++{
++#if !defined(WIN32) && defined(CONFIG_USE_DEV_URANDOM)
++ /* use the Linux default */
++ read(rng_fd, rand_data, num_rand_bytes); /* read from /dev/urandom */
++#elif defined(WIN32) && defined(CONFIG_WIN32_USE_CRYPTO_LIB)
++ /* use Microsoft Crypto Libraries */
++ CryptGenRandom(gCryptProv, num_rand_bytes, rand_data);
++#else /* nothing else to use, so use a custom RNG */
++ /* The method we use when we've got nothing better. Use RC4, time
++ and a couple of random seeds to generate a random sequence */
++ RC4_CTX rng_ctx;
++ struct timeval tv;
++ uint64_t big_num1, big_num2;
++
++ gettimeofday(&tv, NULL); /* yes I know we shouldn't do this */
++
++ /* all numbers by themselves are pretty simple, but combined should
++ * be a challenge */
++ big_num1 = (uint64_t)tv.tv_sec*(tv.tv_usec+1);
++ big_num2 = (uint64_t)rand()*big_num1;
++ big_num1 ^= rng_num;
++
++ memcpy(rand_data, &big_num1, sizeof(uint64_t));
++ if (num_rand_bytes > sizeof(uint64_t))
++ memcpy(&rand_data[8], &big_num2, sizeof(uint64_t));
++
++ if (num_rand_bytes > 16)
++ {
++ /* clear rest of data */
++ memset(&rand_data[16], 0, num_rand_bytes-16);
++ }
++
++ RC4_setup(&rng_ctx, rand_data, 16); /* use as a key */
++ RC4_crypt(&rng_ctx, rand_data, rand_data, num_rand_bytes);
++
++ /* use last 8 bytes for next time */
++ memcpy(&rng_num, &rand_data[num_rand_bytes-8], sizeof(uint64_t));
++#endif
++}
++
++/**
++ * Set a series of bytes with a random number. Individual bytes are not zero.
++ */
++void get_random_NZ(int num_rand_bytes, uint8_t *rand_data)
++{
++ int i;
++ get_random(num_rand_bytes, rand_data);
++
++ for (i = 0; i < num_rand_bytes; i++)
++ {
++ while (rand_data[i] == 0) /* can't be 0 */
++ rand_data[i] = (uint8_t)(rand());
++ }
++}
++
++/**
++ * Some useful diagnostic routines
++ */
++#if defined(CONFIG_SSL_FULL_MODE) || defined(CONFIG_DEBUG)
++int hex_finish;
++int hex_index;
++
++static void print_hex_init(int finish)
++{
++ hex_finish = finish;
++ hex_index = 0;
++}
++
++static void print_hex(uint8_t hex)
++{
++ static int column;
++
++ if (hex_index == 0)
++ {
++ column = 0;
++ }
++
++ printf("%02x ", hex);
++ if (++column == 8)
++ {
++ printf(": ");
++ }
++ else if (column >= 16)
++ {
++ printf("\n");
++ column = 0;
++ }
++
++ if (++hex_index >= hex_finish && column > 0)
++ {
++ printf("\n");
++ }
++}
++
++/**
++ * Spit out a blob of data for diagnostics. The data is is a nice column format
++ * for easy reading.
++ *
++ * @param format [in] The string (with possible embedded format characters)
++ * @param size [in] The number of numbers to print
++ * @param data [in] The start of data to use
++ * @param ... [in] Any additional arguments
++ */
++EXP_FUNC void STDCALL print_blob(const char *format,
++ const uint8_t *data, int size, ...)
++{
++ int i;
++ char tmp[80];
++ va_list(ap);
++
++ va_start(ap, size);
++ sprintf(tmp, "%s\n", format);
++ vprintf(tmp, ap);
++ print_hex_init(size);
++ for (i = 0; i < size; i++)
++ {
++ print_hex(data[i]);
++ }
++
++ va_end(ap);
++ TTY_FLUSH();
++}
++#elif defined(WIN32)
++/* VC6.0 doesn't handle variadic macros */
++EXP_FUNC void STDCALL print_blob(const char *format, const unsigned char *data,
++ int size, ...) {}
++#endif
++
++#if defined(CONFIG_SSL_HAS_PEM) || defined(CONFIG_HTTP_HAS_AUTHORIZATION)
++/* base64 to binary lookup table */
++static const uint8_t map[128] =
++{
++ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
++ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
++ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
++ 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
++ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
++ 255, 254, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6,
++ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
++ 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,
++ 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
++ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
++ 49, 50, 51, 255, 255, 255, 255, 255
++};
++
++EXP_FUNC int STDCALL base64_decode(const char *in, int len,
++ uint8_t *out, int *outlen)
++{
++ int g, t, x, y, z;
++ uint8_t c;
++ int ret = -1;
++
++ g = 3;
++ for (x = y = z = t = 0; x < len; x++)
++ {
++ if ((c = map[in[x]&0x7F]) == 0xff)
++ continue;
++
++ if (c == 254) /* this is the end... */
++ {
++ c = 0;
++
++ if (--g < 0)
++ goto error;
++ }
++ else if (g != 3) /* only allow = at end */
++ goto error;
++
++ t = (t<<6) | c;
++
++ if (++y == 4)
++ {
++ out[z++] = (uint8_t)((t>>16)&255);
++
++ if (g > 1)
++ out[z++] = (uint8_t)((t>>8)&255);
++
++ if (g > 2)
++ out[z++] = (uint8_t)(t&255);
++
++ y = t = 0;
++ }
++ }
++
++ if (y != 0)
++ goto error;
++
++ if (outlen)
++ *outlen = z;
++ ret = 0;
++
++error:
++#ifdef CONFIG_SSL_FULL_MODE
++ if (ret < 0)
++ printf("Error: Invalid base64\n"); TTY_FLUSH();
++#endif
++ TTY_FLUSH();
++ return ret;
++
++}
++#endif
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/hmac.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/hmac.c
+new file mode 100644
+index 0000000..9199ff2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/hmac.c
+@@ -0,0 +1,100 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * HMAC implementation - This code was originally taken from RFC2104
++ */
++
++#include <string.h>
++#include "crypto.h"
++
++/**
++ * Perform HMAC-MD5
++ */
++void hmac_md5(const uint8_t *msg, int length, const uint8_t *key,
++ int key_len, uint8_t *digest)
++{
++ MD5_CTX context;
++ uint8_t k_ipad[64];
++ uint8_t k_opad[64];
++ int i;
++
++ memset(k_ipad, 0, sizeof k_ipad);
++ memset(k_opad, 0, sizeof k_opad);
++ memcpy(k_ipad, key, key_len);
++ memcpy(k_opad, key, key_len);
++
++ for (i = 0; i < 64; i++)
++ {
++ k_ipad[i] ^= 0x36;
++ k_opad[i] ^= 0x5c;
++ }
++
++ MD5_Init(&context);
++ MD5_Update(&context, k_ipad, 64);
++ MD5_Update(&context, msg, length);
++ MD5_Final(digest, &context);
++ MD5_Init(&context);
++ MD5_Update(&context, k_opad, 64);
++ MD5_Update(&context, digest, MD5_SIZE);
++ MD5_Final(digest, &context);
++}
++
++/**
++ * Perform HMAC-SHA1
++ */
++void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key,
++ int key_len, uint8_t *digest)
++{
++ SHA1_CTX context;
++ uint8_t k_ipad[64];
++ uint8_t k_opad[64];
++ int i;
++
++ memset(k_ipad, 0, sizeof k_ipad);
++ memset(k_opad, 0, sizeof k_opad);
++ memcpy(k_ipad, key, key_len);
++ memcpy(k_opad, key, key_len);
++
++ for (i = 0; i < 64; i++)
++ {
++ k_ipad[i] ^= 0x36;
++ k_opad[i] ^= 0x5c;
++ }
++
++ SHA1_Init(&context);
++ SHA1_Update(&context, k_ipad, 64);
++ SHA1_Update(&context, msg, length);
++ SHA1_Final(digest, &context);
++ SHA1_Init(&context);
++ SHA1_Update(&context, k_opad, 64);
++ SHA1_Update(&context, digest, SHA1_SIZE);
++ SHA1_Final(digest, &context);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md2.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md2.c
+new file mode 100644
+index 0000000..bfcbd24
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md2.c
+@@ -0,0 +1,162 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * RFC 1115/1319 compliant MD2 implementation
++ * The MD2 algorithm was designed by Ron Rivest in 1989.
++ *
++ * http://www.ietf.org/rfc/rfc1115.txt
++ * http://www.ietf.org/rfc/rfc1319.txt
++ */
++
++#include <string.h>
++#include <stdio.h>
++
++#include "crypto.h"
++
++/**
++ * This code is only here to enable the verification of Verisign root
++ * certificates. So only enable it for verification mode.
++ */
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++
++static const uint8_t PI_SUBST[256] =
++{
++ 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36,
++ 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3,
++ 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C,
++ 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
++ 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E,
++ 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E,
++ 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2,
++ 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
++ 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E,
++ 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3,
++ 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56,
++ 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
++ 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D,
++ 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65,
++ 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0,
++ 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
++ 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C,
++ 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E,
++ 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81,
++ 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
++ 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88,
++ 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE,
++ 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58,
++ 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
++ 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99,
++ 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14
++};
++
++/*
++ * MD2 context setup
++ */
++EXP_FUNC void STDCALL MD2_Init(MD2_CTX *ctx)
++{
++ memset(ctx, 0, sizeof *ctx);
++}
++
++static void md2_process(MD2_CTX *ctx)
++{
++ int i, j;
++ uint8_t t = 0;
++
++ for (i = 0; i < 16; i++)
++ {
++ ctx->state[i + 16] = ctx->buffer[i];
++ ctx->state[i + 32] = ctx->buffer[i] ^ ctx->state[i];
++ }
++
++ for (i = 0; i < 18; i++)
++ {
++ for (j = 0; j < 48; j++)
++ t = (ctx->state[j] ^= PI_SUBST[t]);
++
++ t = (t + i) & 0xFF;
++ }
++
++ t = ctx->cksum[15];
++
++ for (i = 0; i < 16; i++)
++ t = (ctx->cksum[i] ^= PI_SUBST[ctx->buffer[i] ^ t]);
++}
++
++/*
++ * MD2 process buffer
++ */
++EXP_FUNC void STDCALL MD2_Update(MD2_CTX *ctx, const uint8_t *input, int ilen)
++{
++ int fill;
++
++ while (ilen > 0)
++ {
++ if (ctx->left + ilen > 16)
++ fill = 16 - ctx->left;
++ else
++ fill = ilen;
++
++ memcpy(ctx->buffer + ctx->left, input, fill);
++
++ ctx->left += fill;
++ input += fill;
++ ilen -= fill;
++
++ if (ctx->left == 16)
++ {
++ ctx->left = 0;
++ md2_process(ctx);
++ }
++ }
++}
++
++/*
++ * MD2 final digest
++ */
++EXP_FUNC void STDCALL MD2_Final(uint8_t *output, MD2_CTX *ctx)
++{
++ int i;
++ uint8_t x;
++
++ x = (uint8_t)(16 - ctx->left);
++
++ for (i = ctx->left; i < 16; i++)
++ ctx->buffer[i] = x;
++
++ md2_process(ctx);
++
++ memcpy(ctx->buffer, ctx->cksum, 16);
++ md2_process(ctx);
++
++ memcpy(output, ctx->state, 16);
++}
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md5.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md5.c
+new file mode 100644
+index 0000000..b4f86ca
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md5.c
+@@ -0,0 +1,293 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * This file implements the MD5 algorithm as defined in RFC1321
++ */
++
++#include <string.h>
++#include "crypto.h"
++
++/* Constants for MD5Transform routine.
++ */
++#define S11 7
++#define S12 12
++#define S13 17
++#define S14 22
++#define S21 5
++#define S22 9
++#define S23 14
++#define S24 20
++#define S31 4
++#define S32 11
++#define S33 16
++#define S34 23
++#define S41 6
++#define S42 10
++#define S43 15
++#define S44 21
++
++/* ----- static functions ----- */
++static void MD5Transform(uint32_t state[4], const uint8_t block[64]);
++static void Encode(uint8_t *output, uint32_t *input, uint32_t len);
++static void Decode(uint32_t *output, const uint8_t *input, uint32_t len);
++
++static const uint8_t PADDING[64] =
++{
++ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
++};
++
++/* F, G, H and I are basic MD5 functions.
++ */
++#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
++#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
++#define H(x, y, z) ((x) ^ (y) ^ (z))
++#define I(x, y, z) ((y) ^ ((x) | (~z)))
++
++/* ROTATE_LEFT rotates x left n bits. */
++#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
++
++/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
++ Rotation is separate from addition to prevent recomputation. */
++#define FF(a, b, c, d, x, s, ac) { \
++ (a) += F ((b), (c), (d)) + (x) + (uint32_t)(ac); \
++ (a) = ROTATE_LEFT ((a), (s)); \
++ (a) += (b); \
++ }
++#define GG(a, b, c, d, x, s, ac) { \
++ (a) += G ((b), (c), (d)) + (x) + (uint32_t)(ac); \
++ (a) = ROTATE_LEFT ((a), (s)); \
++ (a) += (b); \
++ }
++#define HH(a, b, c, d, x, s, ac) { \
++ (a) += H ((b), (c), (d)) + (x) + (uint32_t)(ac); \
++ (a) = ROTATE_LEFT ((a), (s)); \
++ (a) += (b); \
++ }
++#define II(a, b, c, d, x, s, ac) { \
++ (a) += I ((b), (c), (d)) + (x) + (uint32_t)(ac); \
++ (a) = ROTATE_LEFT ((a), (s)); \
++ (a) += (b); \
++ }
++
++/**
++ * MD5 initialization - begins an MD5 operation, writing a new ctx.
++ */
++EXP_FUNC void STDCALL MD5_Init(MD5_CTX *ctx)
++{
++ ctx->count[0] = ctx->count[1] = 0;
++
++ /* Load magic initialization constants.
++ */
++ ctx->state[0] = 0x67452301;
++ ctx->state[1] = 0xefcdab89;
++ ctx->state[2] = 0x98badcfe;
++ ctx->state[3] = 0x10325476;
++}
++
++/**
++ * Accepts an array of octets as the next portion of the message.
++ */
++EXP_FUNC void STDCALL MD5_Update(MD5_CTX *ctx, const uint8_t * msg, int len)
++{
++ uint32_t x;
++ int i, partLen;
++
++ /* Compute number of bytes mod 64 */
++ x = (uint32_t)((ctx->count[0] >> 3) & 0x3F);
++
++ /* Update number of bits */
++ if ((ctx->count[0] += ((uint32_t)len << 3)) < ((uint32_t)len << 3))
++ ctx->count[1]++;
++ ctx->count[1] += ((uint32_t)len >> 29);
++
++ partLen = 64 - x;
++
++ /* Transform as many times as possible. */
++ if (len >= partLen)
++ {
++ memcpy(&ctx->buffer[x], msg, partLen);
++ MD5Transform(ctx->state, ctx->buffer);
++
++ for (i = partLen; i + 63 < len; i += 64)
++ MD5Transform(ctx->state, &msg[i]);
++
++ x = 0;
++ }
++ else
++ i = 0;
++
++ /* Buffer remaining input */
++ memcpy(&ctx->buffer[x], &msg[i], len-i);
++}
++
++/**
++ * Return the 128-bit message digest into the user's array
++ */
++EXP_FUNC void STDCALL MD5_Final(uint8_t *digest, MD5_CTX *ctx)
++{
++ uint8_t bits[8];
++ uint32_t x, padLen;
++
++ /* Save number of bits */
++ Encode(bits, ctx->count, 8);
++
++ /* Pad out to 56 mod 64.
++ */
++ x = (uint32_t)((ctx->count[0] >> 3) & 0x3f);
++ padLen = (x < 56) ? (56 - x) : (120 - x);
++ MD5_Update(ctx, PADDING, padLen);
++
++ /* Append length (before padding) */
++ MD5_Update(ctx, bits, 8);
++
++ /* Store state in digest */
++ Encode(digest, ctx->state, MD5_SIZE);
++}
++
++/**
++ * MD5 basic transformation. Transforms state based on block.
++ */
++static void MD5Transform(uint32_t state[4], const uint8_t block[64])
++{
++ uint32_t a = state[0], b = state[1], c = state[2],
++ d = state[3], x[MD5_SIZE];
++
++ Decode(x, block, 64);
++
++ /* Round 1 */
++ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
++ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
++ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
++ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
++ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
++ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
++ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
++ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
++ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
++ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
++ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
++ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
++ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
++ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
++ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
++ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
++
++ /* Round 2 */
++ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
++ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
++ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
++ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
++ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
++ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
++ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
++ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
++ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
++ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
++ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
++ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
++ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
++ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
++ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
++ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
++
++ /* Round 3 */
++ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
++ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
++ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
++ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
++ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
++ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
++ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
++ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
++ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
++ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
++ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
++ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
++ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
++ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
++ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
++ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
++
++ /* Round 4 */
++ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
++ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
++ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
++ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
++ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
++ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
++ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
++ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
++ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
++ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
++ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
++ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
++ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
++ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
++ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
++ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
++
++ state[0] += a;
++ state[1] += b;
++ state[2] += c;
++ state[3] += d;
++}
++
++/**
++ * Encodes input (uint32_t) into output (uint8_t). Assumes len is
++ * a multiple of 4.
++ */
++static void Encode(uint8_t *output, uint32_t *input, uint32_t len)
++{
++ uint32_t i, j;
++
++ for (i = 0, j = 0; j < len; i++, j += 4)
++ {
++ output[j] = (uint8_t)(input[i] & 0xff);
++ output[j+1] = (uint8_t)((input[i] >> 8) & 0xff);
++ output[j+2] = (uint8_t)((input[i] >> 16) & 0xff);
++ output[j+3] = (uint8_t)((input[i] >> 24) & 0xff);
++ }
++}
++
++/**
++ * Decodes input (uint8_t) into output (uint32_t). Assumes len is
++ * a multiple of 4.
++ */
++static void Decode(uint32_t *output, const uint8_t *input, uint32_t len)
++{
++ uint32_t i, j;
++
++ for (i = 0, j = 0; j < len; i++, j += 4)
++ output[i] = ((uint32_t)input[j]) | (((uint32_t)input[j+1]) << 8) |
++ (((uint32_t)input[j+2]) << 16) | (((uint32_t)input[j+3]) << 24);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rc4.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rc4.c
+new file mode 100644
+index 0000000..57136b8
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rc4.c
+@@ -0,0 +1,91 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * An implementation of the RC4/ARC4 algorithm.
++ * Originally written by Christophe Devine.
++ */
++
++#include <string.h>
++#include "crypto.h"
++
++/**
++ * Get ready for an encrypt/decrypt operation
++ */
++void RC4_setup(RC4_CTX *ctx, const uint8_t *key, int length)
++{
++ int i, j = 0, k = 0, a;
++ uint8_t *m;
++
++ ctx->x = 0;
++ ctx->y = 0;
++ m = ctx->m;
++
++ for (i = 0; i < 256; i++)
++ m[i] = i;
++
++ for (i = 0; i < 256; i++)
++ {
++ a = m[i];
++ j = (uint8_t)(j + a + key[k]);
++ m[i] = m[j];
++ m[j] = a;
++
++ if (++k >= length)
++ k = 0;
++ }
++}
++
++/**
++ * Perform the encrypt/decrypt operation (can use it for either since
++ * this is a stream cipher).
++ */
++void RC4_crypt(RC4_CTX *ctx, const uint8_t *msg, uint8_t *out, int length)
++{
++ int i;
++ uint8_t *m, x, y, a, b;
++ out = (uint8_t *)msg;
++
++ x = ctx->x;
++ y = ctx->y;
++ m = ctx->m;
++
++ for (i = 0; i < length; i++)
++ {
++ a = m[++x];
++ y += a;
++ m[x] = b = m[y];
++ m[y] = a;
++ out[i] ^= m[(uint8_t)(a + b)];
++ }
++
++ ctx->x = x;
++ ctx->y = y;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rsa.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rsa.c
+new file mode 100644
+index 0000000..31627bb
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rsa.c
+@@ -0,0 +1,268 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * Implements the RSA public encryption algorithm. Uses the bigint library to
++ * perform its calculations.
++ */
++
++#include <stdio.h>
++#include <string.h>
++#include <time.h>
++#include <stdlib.h>
++#include "crypto.h"
++
++void RSA_priv_key_new(RSA_CTX **ctx,
++ const uint8_t *modulus, int mod_len,
++ const uint8_t *pub_exp, int pub_len,
++ const uint8_t *priv_exp, int priv_len
++#if CONFIG_BIGINT_CRT
++ , const uint8_t *p, int p_len,
++ const uint8_t *q, int q_len,
++ const uint8_t *dP, int dP_len,
++ const uint8_t *dQ, int dQ_len,
++ const uint8_t *qInv, int qInv_len
++#endif
++ )
++{
++ RSA_CTX *rsa_ctx;
++ BI_CTX *bi_ctx;
++ RSA_pub_key_new(ctx, modulus, mod_len, pub_exp, pub_len);
++ rsa_ctx = *ctx;
++ bi_ctx = rsa_ctx->bi_ctx;
++ rsa_ctx->d = bi_import(bi_ctx, priv_exp, priv_len);
++ bi_permanent(rsa_ctx->d);
++
++#ifdef CONFIG_BIGINT_CRT
++ rsa_ctx->p = bi_import(bi_ctx, p, p_len);
++ rsa_ctx->q = bi_import(bi_ctx, q, q_len);
++ rsa_ctx->dP = bi_import(bi_ctx, dP, dP_len);
++ rsa_ctx->dQ = bi_import(bi_ctx, dQ, dQ_len);
++ rsa_ctx->qInv = bi_import(bi_ctx, qInv, qInv_len);
++ bi_permanent(rsa_ctx->dP);
++ bi_permanent(rsa_ctx->dQ);
++ bi_permanent(rsa_ctx->qInv);
++ bi_set_mod(bi_ctx, rsa_ctx->p, BIGINT_P_OFFSET);
++ bi_set_mod(bi_ctx, rsa_ctx->q, BIGINT_Q_OFFSET);
++#endif
++}
++
++void RSA_pub_key_new(RSA_CTX **ctx,
++ const uint8_t *modulus, int mod_len,
++ const uint8_t *pub_exp, int pub_len)
++{
++ RSA_CTX *rsa_ctx;
++ BI_CTX *bi_ctx;
++
++ if (*ctx) /* if we load multiple certs, dump the old one */
++ RSA_free(*ctx);
++
++ bi_ctx = bi_initialize();
++ *ctx = (RSA_CTX *)calloc(1, sizeof(RSA_CTX));
++ rsa_ctx = *ctx;
++ rsa_ctx->bi_ctx = bi_ctx;
++ rsa_ctx->num_octets = (mod_len & 0xFFF0);
++ rsa_ctx->m = bi_import(bi_ctx, modulus, mod_len);
++ bi_set_mod(bi_ctx, rsa_ctx->m, BIGINT_M_OFFSET);
++ rsa_ctx->e = bi_import(bi_ctx, pub_exp, pub_len);
++ bi_permanent(rsa_ctx->e);
++}
++
++/**
++ * Free up any RSA context resources.
++ */
++void RSA_free(RSA_CTX *rsa_ctx)
++{
++ BI_CTX *bi_ctx;
++ if (rsa_ctx == NULL) /* deal with ptrs that are null */
++ return;
++
++ bi_ctx = rsa_ctx->bi_ctx;
++
++ bi_depermanent(rsa_ctx->e);
++ bi_free(bi_ctx, rsa_ctx->e);
++ bi_free_mod(rsa_ctx->bi_ctx, BIGINT_M_OFFSET);
++
++ if (rsa_ctx->d)
++ {
++ bi_depermanent(rsa_ctx->d);
++ bi_free(bi_ctx, rsa_ctx->d);
++#ifdef CONFIG_BIGINT_CRT
++ bi_depermanent(rsa_ctx->dP);
++ bi_depermanent(rsa_ctx->dQ);
++ bi_depermanent(rsa_ctx->qInv);
++ bi_free(bi_ctx, rsa_ctx->dP);
++ bi_free(bi_ctx, rsa_ctx->dQ);
++ bi_free(bi_ctx, rsa_ctx->qInv);
++ bi_free_mod(rsa_ctx->bi_ctx, BIGINT_P_OFFSET);
++ bi_free_mod(rsa_ctx->bi_ctx, BIGINT_Q_OFFSET);
++#endif
++ }
++
++ bi_terminate(bi_ctx);
++ free(rsa_ctx);
++}
++
++/**
++ * @brief Use PKCS1.5 for decryption/verification.
++ * @param ctx [in] The context
++ * @param in_data [in] The data to encrypt (must be < modulus size-11)
++ * @param out_data [out] The encrypted data.
++ * @param is_decryption [in] Decryption or verify operation.
++ * @return The number of bytes that were originally encrypted. -1 on error.
++ * @see http://www.rsasecurity.com/rsalabs/node.asp?id=2125
++ */
++int RSA_decrypt(const RSA_CTX *ctx, const uint8_t *in_data,
++ uint8_t *out_data, int is_decryption)
++{
++ const int byte_size = ctx->num_octets;
++ int i, size;
++ bigint *decrypted_bi, *dat_bi;
++ uint8_t *block = (uint8_t *)alloca(byte_size);
++
++ memset(out_data, 0, byte_size); /* initialise */
++
++ /* decrypt */
++ dat_bi = bi_import(ctx->bi_ctx, in_data, byte_size);
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ decrypted_bi = is_decryption ? /* decrypt or verify? */
++ RSA_private(ctx, dat_bi) : RSA_public(ctx, dat_bi);
++#else /* always a decryption */
++ decrypted_bi = RSA_private(ctx, dat_bi);
++#endif
++
++ /* convert to a normal block */
++ bi_export(ctx->bi_ctx, decrypted_bi, block, byte_size);
++
++ i = 10; /* start at the first possible non-padded byte */
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ if (is_decryption == 0) /* PKCS1.5 signing pads with "0xff"s */
++ {
++ while (block[i++] == 0xff && i < byte_size);
++
++ if (block[i-2] != 0xff)
++ i = byte_size; /*ensure size is 0 */
++ }
++ else /* PKCS1.5 encryption padding is random */
++#endif
++ {
++ while (block[i++] && i < byte_size);
++ }
++ size = byte_size - i;
++
++ /* get only the bit we want */
++ if (size > 0)
++ memcpy(out_data, &block[i], size);
++
++ return size ? size : -1;
++}
++
++/**
++ * Performs m = c^d mod n
++ */
++bigint *RSA_private(const RSA_CTX *c, bigint *bi_msg)
++{
++#ifdef CONFIG_BIGINT_CRT
++ return bi_crt(c->bi_ctx, bi_msg, c->dP, c->dQ, c->p, c->q, c->qInv);
++#else
++ BI_CTX *ctx = c->bi_ctx;
++ ctx->mod_offset = BIGINT_M_OFFSET;
++ return bi_mod_power(ctx, bi_msg, c->d);
++#endif
++}
++
++#ifdef CONFIG_SSL_FULL_MODE
++/**
++ * Used for diagnostics.
++ */
++void RSA_print(const RSA_CTX *rsa_ctx)
++{
++ if (rsa_ctx == NULL)
++ return;
++
++ printf("----------------- RSA DEBUG ----------------\n");
++ printf("Size:\t%d\n", rsa_ctx->num_octets);
++ bi_print("Modulus", rsa_ctx->m);
++ bi_print("Public Key", rsa_ctx->e);
++ bi_print("Private Key", rsa_ctx->d);
++}
++#endif
++
++#if defined(CONFIG_SSL_CERT_VERIFICATION) || defined(CONFIG_SSL_GENERATE_X509_CERT)
++/**
++ * Performs c = m^e mod n
++ */
++bigint *RSA_public(const RSA_CTX * c, bigint *bi_msg)
++{
++ c->bi_ctx->mod_offset = BIGINT_M_OFFSET;
++ return bi_mod_power(c->bi_ctx, bi_msg, c->e);
++}
++
++/**
++ * Use PKCS1.5 for encryption/signing.
++ * see http://www.rsasecurity.com/rsalabs/node.asp?id=2125
++ */
++int RSA_encrypt(const RSA_CTX *ctx, const uint8_t *in_data, uint16_t in_len,
++ uint8_t *out_data, int is_signing)
++{
++ int byte_size = ctx->num_octets;
++ int num_pads_needed = byte_size-in_len-3;
++ bigint *dat_bi, *encrypt_bi;
++
++ /* note: in_len+11 must be > byte_size */
++ out_data[0] = 0; /* ensure encryption block is < modulus */
++
++ if (is_signing)
++ {
++ out_data[1] = 1; /* PKCS1.5 signing pads with "0xff"'s */
++ memset(&out_data[2], 0xff, num_pads_needed);
++ }
++ else /* randomize the encryption padding with non-zero bytes */
++ {
++ out_data[1] = 2;
++ get_random_NZ(num_pads_needed, &out_data[2]);
++ }
++
++ out_data[2+num_pads_needed] = 0;
++ memcpy(&out_data[3+num_pads_needed], in_data, in_len);
++
++ /* now encrypt it */
++ dat_bi = bi_import(ctx->bi_ctx, out_data, byte_size);
++ encrypt_bi = is_signing ? RSA_private(ctx, dat_bi) :
++ RSA_public(ctx, dat_bi);
++ bi_export(ctx->bi_ctx, encrypt_bi, out_data, byte_size);
++
++ /* save a few bytes of memory */
++ bi_clear_cache(ctx->bi_ctx);
++ return byte_size;
++}
++
++#endif /* CONFIG_SSL_CERT_VERIFICATION */
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/sha1.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/sha1.c
+new file mode 100644
+index 0000000..be19100
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/sha1.c
+@@ -0,0 +1,248 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * SHA1 implementation - as defined in FIPS PUB 180-1 published April 17, 1995.
++ * This code was originally taken from RFC3174
++ */
++
++#include <string.h>
++#include "crypto.h"
++
++/*
++ * Define the SHA1 circular left shift macro
++ */
++#define SHA1CircularShift(bits,word) \
++ (((word) << (bits)) | ((word) >> (32-(bits))))
++
++/* ----- static functions ----- */
++static void SHA1PadMessage(SHA1_CTX *ctx);
++static void SHA1ProcessMessageBlock(SHA1_CTX *ctx);
++
++/**
++ * Initialize the SHA1 context
++ */
++void SHA1_Init(SHA1_CTX *ctx)
++{
++ ctx->Length_Low = 0;
++ ctx->Length_High = 0;
++ ctx->Message_Block_Index = 0;
++ ctx->Intermediate_Hash[0] = 0x67452301;
++ ctx->Intermediate_Hash[1] = 0xEFCDAB89;
++ ctx->Intermediate_Hash[2] = 0x98BADCFE;
++ ctx->Intermediate_Hash[3] = 0x10325476;
++ ctx->Intermediate_Hash[4] = 0xC3D2E1F0;
++}
++
++/**
++ * Accepts an array of octets as the next portion of the message.
++ */
++void SHA1_Update(SHA1_CTX *ctx, const uint8_t *msg, int len)
++{
++ while (len--)
++ {
++ ctx->Message_Block[ctx->Message_Block_Index++] = (*msg & 0xFF);
++ ctx->Length_Low += 8;
++
++ if (ctx->Length_Low == 0)
++ ctx->Length_High++;
++
++ if (ctx->Message_Block_Index == 64)
++ SHA1ProcessMessageBlock(ctx);
++
++ msg++;
++ }
++}
++
++/**
++ * Return the 160-bit message digest into the user's array
++ */
++void SHA1_Final(uint8_t *digest, SHA1_CTX *ctx)
++{
++ int i;
++
++ SHA1PadMessage(ctx);
++ memset(ctx->Message_Block, 0, 64);
++ ctx->Length_Low = 0; /* and clear length */
++ ctx->Length_High = 0;
++
++ for (i = 0; i < SHA1_SIZE; i++)
++ {
++ digest[i] = ctx->Intermediate_Hash[i>>2] >> 8 * ( 3 - ( i & 0x03 ) );
++ }
++}
++
++/**
++ * Process the next 512 bits of the message stored in the array.
++ */
++static void SHA1ProcessMessageBlock(SHA1_CTX *ctx)
++{
++ const uint32_t K[] = { /* Constants defined in SHA-1 */
++ 0x5A827999,
++ 0x6ED9EBA1,
++ 0x8F1BBCDC,
++ 0xCA62C1D6
++ };
++ int t; /* Loop counter */
++ uint32_t temp; /* Temporary word value */
++ uint32_t W[80]; /* Word sequence */
++ uint32_t A, B, C, D, E; /* Word buffers */
++
++ /*
++ * Initialize the first 16 words in the array W
++ */
++ for (t = 0; t < 16; t++)
++ {
++ W[t] = ctx->Message_Block[t * 4] << 24;
++ W[t] |= ctx->Message_Block[t * 4 + 1] << 16;
++ W[t] |= ctx->Message_Block[t * 4 + 2] << 8;
++ W[t] |= ctx->Message_Block[t * 4 + 3];
++ }
++
++ for (t = 16; t < 80; t++)
++ {
++ W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
++ }
++
++ A = ctx->Intermediate_Hash[0];
++ B = ctx->Intermediate_Hash[1];
++ C = ctx->Intermediate_Hash[2];
++ D = ctx->Intermediate_Hash[3];
++ E = ctx->Intermediate_Hash[4];
++
++ for (t = 0; t < 20; t++)
++ {
++ temp = SHA1CircularShift(5,A) +
++ ((B & C) | ((~B) & D)) + E + W[t] + K[0];
++ E = D;
++ D = C;
++ C = SHA1CircularShift(30,B);
++
++ B = A;
++ A = temp;
++ }
++
++ for (t = 20; t < 40; t++)
++ {
++ temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
++ E = D;
++ D = C;
++ C = SHA1CircularShift(30,B);
++ B = A;
++ A = temp;
++ }
++
++ for (t = 40; t < 60; t++)
++ {
++ temp = SHA1CircularShift(5,A) +
++ ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
++ E = D;
++ D = C;
++ C = SHA1CircularShift(30,B);
++ B = A;
++ A = temp;
++ }
++
++ for (t = 60; t < 80; t++)
++ {
++ temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
++ E = D;
++ D = C;
++ C = SHA1CircularShift(30,B);
++ B = A;
++ A = temp;
++ }
++
++ ctx->Intermediate_Hash[0] += A;
++ ctx->Intermediate_Hash[1] += B;
++ ctx->Intermediate_Hash[2] += C;
++ ctx->Intermediate_Hash[3] += D;
++ ctx->Intermediate_Hash[4] += E;
++ ctx->Message_Block_Index = 0;
++}
++
++/*
++ * According to the standard, the message must be padded to an even
++ * 512 bits. The first padding bit must be a '1'. The last 64
++ * bits represent the length of the original message. All bits in
++ * between should be 0. This function will pad the message
++ * according to those rules by filling the Message_Block array
++ * accordingly. It will also call the ProcessMessageBlock function
++ * provided appropriately. When it returns, it can be assumed that
++ * the message digest has been computed.
++ *
++ * @param ctx [in, out] The SHA1 context
++ */
++static void SHA1PadMessage(SHA1_CTX *ctx)
++{
++ /*
++ * Check to see if the current message block is too small to hold
++ * the initial padding bits and length. If so, we will pad the
++ * block, process it, and then continue padding into a second
++ * block.
++ */
++ if (ctx->Message_Block_Index > 55)
++ {
++ ctx->Message_Block[ctx->Message_Block_Index++] = 0x80;
++ while(ctx->Message_Block_Index < 64)
++ {
++ ctx->Message_Block[ctx->Message_Block_Index++] = 0;
++ }
++
++ SHA1ProcessMessageBlock(ctx);
++
++ while (ctx->Message_Block_Index < 56)
++ {
++ ctx->Message_Block[ctx->Message_Block_Index++] = 0;
++ }
++ }
++ else
++ {
++ ctx->Message_Block[ctx->Message_Block_Index++] = 0x80;
++ while(ctx->Message_Block_Index < 56)
++ {
++
++ ctx->Message_Block[ctx->Message_Block_Index++] = 0;
++ }
++ }
++
++ /*
++ * Store the message length as the last 8 octets
++ */
++ ctx->Message_Block[56] = ctx->Length_High >> 24;
++ ctx->Message_Block[57] = ctx->Length_High >> 16;
++ ctx->Message_Block[58] = ctx->Length_High >> 8;
++ ctx->Message_Block[59] = ctx->Length_High;
++ ctx->Message_Block[60] = ctx->Length_Low >> 24;
++ ctx->Message_Block[61] = ctx->Length_Low >> 16;
++ ctx->Message_Block[62] = ctx->Length_Low >> 8;
++ ctx->Message_Block[63] = ctx->Length_Low;
++ SHA1ProcessMessageBlock(ctx);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/Makefile
+new file mode 100644
+index 0000000..2826686
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/Makefile
+@@ -0,0 +1,39 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++include ../config/makefile.conf
++
++all:
++
++doco:
++ doxygen ./axTLS.dox
++
++clean::
++ @-rm -fr html *~
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/axTLS.dox b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/axTLS.dox
+new file mode 100644
+index 0000000..d9959b2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/axTLS.dox
+@@ -0,0 +1,1237 @@
++# Doxyfile 1.4.5
++
++# This file describes the settings to be used by the documentation system
++# doxygen (www.doxygen.org) for a project
++#
++# All text after a hash (#) is considered a comment and will be ignored
++# The format is:
++# TAG = value [value, ...]
++# For lists items can also be appended using:
++# TAG += value [value, ...]
++# Values that contain spaces should be placed between quotes (" ")
++
++#---------------------------------------------------------------------------
++# Project related configuration options
++#---------------------------------------------------------------------------
++
++# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
++# by quotes) that should identify the project.
++
++PROJECT_NAME = axTLS
++
++# The PROJECT_NUMBER tag can be used to enter a project or revision number.
++# This could be handy for archiving the generated documentation or
++# if some version control system is used.
++
++PROJECT_NUMBER =
++
++# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
++# base path where the generated documentation will be put.
++# If a relative path is entered, it will be relative to the location
++# where doxygen was started. If left blank the current directory will be used.
++
++OUTPUT_DIRECTORY =
++
++# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
++# 4096 sub-directories (in 2 levels) under the output directory of each output
++# format and will distribute the generated files over these directories.
++# Enabling this option can be useful when feeding doxygen a huge amount of
++# source files, where putting all generated files in the same directory would
++# otherwise cause performance problems for the file system.
++
++CREATE_SUBDIRS = NO
++
++# The OUTPUT_LANGUAGE tag is used to specify the language in which all
++# documentation generated by doxygen is written. Doxygen will use this
++# information to generate all constant output in the proper language.
++# The default language is English, other supported languages are:
++# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
++# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
++# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
++# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
++# Swedish, and Ukrainian.
++
++OUTPUT_LANGUAGE = English
++
++# This tag can be used to specify the encoding used in the generated output.
++# The encoding is not always determined by the language that is chosen,
++# but also whether or not the output is meant for Windows or non-Windows users.
++# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
++# forces the Windows encoding (this is the default for the Windows binary),
++# whereas setting the tag to NO uses a Unix-style encoding (the default for
++# all platforms other than Windows).
++
++USE_WINDOWS_ENCODING = NO
++
++# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
++# include brief member descriptions after the members that are listed in
++# the file and class documentation (similar to JavaDoc).
++# Set to NO to disable this.
++
++BRIEF_MEMBER_DESC = YES
++
++# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
++# the brief description of a member or function before the detailed description.
++# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
++# brief descriptions will be completely suppressed.
++
++REPEAT_BRIEF = YES
++
++# This tag implements a quasi-intelligent brief description abbreviator
++# that is used to form the text in various listings. Each string
++# in this list, if found as the leading text of the brief description, will be
++# stripped from the text and the result after processing the whole list, is
++# used as the annotated text. Otherwise, the brief description is used as-is.
++# If left blank, the following values are used ("$name" is automatically
++# replaced with the name of the entity): "The $name class" "The $name widget"
++# "The $name file" "is" "provides" "specifies" "contains"
++# "represents" "a" "an" "the"
++
++ABBREVIATE_BRIEF =
++
++# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
++# Doxygen will generate a detailed section even if there is only a brief
++# description.
++
++ALWAYS_DETAILED_SEC = NO
++
++# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
++# inherited members of a class in the documentation of that class as if those
++# members were ordinary class members. Constructors, destructors and assignment
++# operators of the base classes will not be shown.
++
++INLINE_INHERITED_MEMB = NO
++
++# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
++# path before files name in the file list and in the header files. If set
++# to NO the shortest path that makes the file name unique will be used.
++
++FULL_PATH_NAMES = NO
++
++# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
++# can be used to strip a user-defined part of the path. Stripping is
++# only done if one of the specified strings matches the left-hand part of
++# the path. The tag can be used to show relative paths in the file list.
++# If left blank the directory from which doxygen is run is used as the
++# path to strip.
++
++STRIP_FROM_PATH =
++
++# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
++# the path mentioned in the documentation of a class, which tells
++# the reader which header file to include in order to use a class.
++# If left blank only the name of the header file containing the class
++# definition is used. Otherwise one should specify the include paths that
++# are normally passed to the compiler using the -I flag.
++
++STRIP_FROM_INC_PATH =
++
++# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
++# (but less readable) file names. This can be useful is your file systems
++# doesn't support long names like on DOS, Mac, or CD-ROM.
++
++SHORT_NAMES = NO
++
++# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
++# will interpret the first line (until the first dot) of a JavaDoc-style
++# comment as the brief description. If set to NO, the JavaDoc
++# comments will behave just like the Qt-style comments (thus requiring an
++# explicit @brief command for a brief description.
++
++JAVADOC_AUTOBRIEF = NO
++
++# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
++# treat a multi-line C++ special comment block (i.e. a block of //! or ///
++# comments) as a brief description. This used to be the default behaviour.
++# The new default is to treat a multi-line C++ comment block as a detailed
++# description. Set this tag to YES if you prefer the old behaviour instead.
++
++MULTILINE_CPP_IS_BRIEF = NO
++
++# If the DETAILS_AT_TOP tag is set to YES then Doxygen
++# will output the detailed description near the top, like JavaDoc.
++# If set to NO, the detailed description appears after the member
++# documentation.
++
++DETAILS_AT_TOP = NO
++
++# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
++# member inherits the documentation from any documented member that it
++# re-implements.
++
++INHERIT_DOCS = YES
++
++# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
++# a new page for each member. If set to NO, the documentation of a member will
++# be part of the file/class/namespace that contains it.
++
++SEPARATE_MEMBER_PAGES = NO
++
++# The TAB_SIZE tag can be used to set the number of spaces in a tab.
++# Doxygen uses this value to replace tabs by spaces in code fragments.
++
++TAB_SIZE = 4
++
++# This tag can be used to specify a number of aliases that acts
++# as commands in the documentation. An alias has the form "name=value".
++# For example adding "sideeffect=\par Side Effects:\n" will allow you to
++# put the command \sideeffect (or @sideeffect) in the documentation, which
++# will result in a user-defined paragraph with heading "Side Effects:".
++# You can put \n's in the value part of an alias to insert newlines.
++
++ALIASES =
++
++# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
++# sources only. Doxygen will then generate output that is more tailored for C.
++# For instance, some of the names that are used will be different. The list
++# of all members will be omitted, etc.
++
++OPTIMIZE_OUTPUT_FOR_C = YES
++
++# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
++# sources only. Doxygen will then generate output that is more tailored for Java.
++# For instance, namespaces will be presented as packages, qualified scopes
++# will look different, etc.
++
++OPTIMIZE_OUTPUT_JAVA = NO
++
++# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
++# include (a tag file for) the STL sources as input, then you should
++# set this tag to YES in order to let doxygen match functions declarations and
++# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
++# func(std::string) {}). This also make the inheritance and collaboration
++# diagrams that involve STL classes more complete and accurate.
++
++BUILTIN_STL_SUPPORT = NO
++
++# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
++# tag is set to YES, then doxygen will reuse the documentation of the first
++# member in the group (if any) for the other members of the group. By default
++# all members of a group must be documented explicitly.
++
++DISTRIBUTE_GROUP_DOC = NO
++
++# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
++# the same type (for instance a group of public functions) to be put as a
++# subgroup of that type (e.g. under the Public Functions section). Set it to
++# NO to prevent subgrouping. Alternatively, this can be done per class using
++# the \nosubgrouping command.
++
++SUBGROUPING = YES
++
++#---------------------------------------------------------------------------
++# Build related configuration options
++#---------------------------------------------------------------------------
++
++# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
++# documentation are documented, even if no documentation was available.
++# Private class members and static file members will be hidden unless
++# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
++
++EXTRACT_ALL = NO
++
++# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
++# will be included in the documentation.
++
++EXTRACT_PRIVATE = NO
++
++# If the EXTRACT_STATIC tag is set to YES all static members of a file
++# will be included in the documentation.
++
++EXTRACT_STATIC = NO
++
++# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
++# defined locally in source files will be included in the documentation.
++# If set to NO only classes defined in header files are included.
++
++EXTRACT_LOCAL_CLASSES = YES
++
++# This flag is only useful for Objective-C code. When set to YES local
++# methods, which are defined in the implementation section but not in
++# the interface are included in the documentation.
++# If set to NO (the default) only methods in the interface are included.
++
++EXTRACT_LOCAL_METHODS = NO
++
++# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
++# undocumented members of documented classes, files or namespaces.
++# If set to NO (the default) these members will be included in the
++# various overviews, but no documentation section is generated.
++# This option has no effect if EXTRACT_ALL is enabled.
++
++HIDE_UNDOC_MEMBERS = NO
++
++# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
++# undocumented classes that are normally visible in the class hierarchy.
++# If set to NO (the default) these classes will be included in the various
++# overviews. This option has no effect if EXTRACT_ALL is enabled.
++
++HIDE_UNDOC_CLASSES = NO
++
++# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
++# friend (class|struct|union) declarations.
++# If set to NO (the default) these declarations will be included in the
++# documentation.
++
++HIDE_FRIEND_COMPOUNDS = NO
++
++# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
++# documentation blocks found inside the body of a function.
++# If set to NO (the default) these blocks will be appended to the
++# function's detailed documentation block.
++
++HIDE_IN_BODY_DOCS = NO
++
++# The INTERNAL_DOCS tag determines if documentation
++# that is typed after a \internal command is included. If the tag is set
++# to NO (the default) then the documentation will be excluded.
++# Set it to YES to include the internal documentation.
++
++INTERNAL_DOCS = NO
++
++# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
++# file names in lower-case letters. If set to YES upper-case letters are also
++# allowed. This is useful if you have classes or files whose names only differ
++# in case and if your file system supports case sensitive file names. Windows
++# and Mac users are advised to set this option to NO.
++
++CASE_SENSE_NAMES = YES
++
++# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
++# will show members with their full class and namespace scopes in the
++# documentation. If set to YES the scope will be hidden.
++
++HIDE_SCOPE_NAMES = NO
++
++# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
++# will put a list of the files that are included by a file in the documentation
++# of that file.
++
++SHOW_INCLUDE_FILES = NO
++
++# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
++# is inserted in the documentation for inline members.
++
++INLINE_INFO = YES
++
++# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
++# will sort the (detailed) documentation of file and class members
++# alphabetically by member name. If set to NO the members will appear in
++# declaration order.
++
++SORT_MEMBER_DOCS = NO
++
++# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
++# brief documentation of file, namespace and class members alphabetically
++# by member name. If set to NO (the default) the members will appear in
++# declaration order.
++
++SORT_BRIEF_DOCS = NO
++
++# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
++# sorted by fully-qualified names, including namespaces. If set to
++# NO (the default), the class list will be sorted only by class name,
++# not including the namespace part.
++# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
++# Note: This option applies only to the class list, not to the
++# alphabetical list.
++
++SORT_BY_SCOPE_NAME = NO
++
++# The GENERATE_TODOLIST tag can be used to enable (YES) or
++# disable (NO) the todo list. This list is created by putting \todo
++# commands in the documentation.
++
++GENERATE_TODOLIST = YES
++
++# The GENERATE_TESTLIST tag can be used to enable (YES) or
++# disable (NO) the test list. This list is created by putting \test
++# commands in the documentation.
++
++GENERATE_TESTLIST = YES
++
++# The GENERATE_BUGLIST tag can be used to enable (YES) or
++# disable (NO) the bug list. This list is created by putting \bug
++# commands in the documentation.
++
++GENERATE_BUGLIST = YES
++
++# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
++# disable (NO) the deprecated list. This list is created by putting
++# \deprecated commands in the documentation.
++
++GENERATE_DEPRECATEDLIST= YES
++
++# The ENABLED_SECTIONS tag can be used to enable conditional
++# documentation sections, marked by \if sectionname ... \endif.
++
++ENABLED_SECTIONS =
++
++# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
++# the initial value of a variable or define consists of for it to appear in
++# the documentation. If the initializer consists of more lines than specified
++# here it will be hidden. Use a value of 0 to hide initializers completely.
++# The appearance of the initializer of individual variables and defines in the
++# documentation can be controlled using \showinitializer or \hideinitializer
++# command in the documentation regardless of this setting.
++
++MAX_INITIALIZER_LINES = 30
++
++# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
++# at the bottom of the documentation of classes and structs. If set to YES the
++# list will mention the files that were used to generate the documentation.
++
++SHOW_USED_FILES = NO
++
++# If the sources in your project are distributed over multiple directories
++# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
++# in the documentation. The default is YES.
++
++SHOW_DIRECTORIES = NO
++
++# The FILE_VERSION_FILTER tag can be used to specify a program or script that
++# doxygen should invoke to get the current version for each file (typically from the
++# version control system). Doxygen will invoke the program by executing (via
++# popen()) the command <command> <input-file>, where <command> is the value of
++# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
++# provided by doxygen. Whatever the program writes to standard output
++# is used as the file version. See the manual for examples.
++
++FILE_VERSION_FILTER =
++
++#---------------------------------------------------------------------------
++# configuration options related to warning and progress messages
++#---------------------------------------------------------------------------
++
++# The QUIET tag can be used to turn on/off the messages that are generated
++# by doxygen. Possible values are YES and NO. If left blank NO is used.
++
++QUIET = NO
++
++# The WARNINGS tag can be used to turn on/off the warning messages that are
++# generated by doxygen. Possible values are YES and NO. If left blank
++# NO is used.
++
++WARNINGS = YES
++
++# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
++# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
++# automatically be disabled.
++
++WARN_IF_UNDOCUMENTED = YES
++
++# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
++# potential errors in the documentation, such as not documenting some
++# parameters in a documented function, or documenting parameters that
++# don't exist or using markup commands wrongly.
++
++WARN_IF_DOC_ERROR = YES
++
++# This WARN_NO_PARAMDOC option can be abled to get warnings for
++# functions that are documented, but have no documentation for their parameters
++# or return value. If set to NO (the default) doxygen will only warn about
++# wrong or incomplete parameter documentation, but not about the absence of
++# documentation.
++
++WARN_NO_PARAMDOC = NO
++
++# The WARN_FORMAT tag determines the format of the warning messages that
++# doxygen can produce. The string should contain the $file, $line, and $text
++# tags, which will be replaced by the file and line number from which the
++# warning originated and the warning text. Optionally the format may contain
++# $version, which will be replaced by the version of the file (if it could
++# be obtained via FILE_VERSION_FILTER)
++
++WARN_FORMAT = "$file:$line: $text"
++
++# The WARN_LOGFILE tag can be used to specify a file to which warning
++# and error messages should be written. If left blank the output is written
++# to stderr.
++
++WARN_LOGFILE =
++
++#---------------------------------------------------------------------------
++# configuration options related to the input files
++#---------------------------------------------------------------------------
++
++# The INPUT tag can be used to specify the files and/or directories that contain
++# documented source files. You may enter file names like "myfile.cpp" or
++# directories like "/usr/src/myproject". Separate the files or directories
++# with spaces.
++
++INPUT = ../bindings/csharp/axTLS.cs ../bindings/java/SSL.java ../bindings/java/SSLUtil.java ../bindings/java/SSLCTX.java ../bindings/java/SSLServer.java ../bindings/java/SSLClient.java ../bindings/java/SSLReadHolder.java ../ssl/ssl.h ../crypto/bigint.c ../crypto/bigint.h
++
++# If the value of the INPUT tag contains directories, you can use the
++# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
++# and *.h) to filter out the source-files in the directories. If left
++# blank the following patterns are tested:
++# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
++# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
++
++FILE_PATTERNS =
++
++# The RECURSIVE tag can be used to turn specify whether or not subdirectories
++# should be searched for input files as well. Possible values are YES and NO.
++# If left blank NO is used.
++
++RECURSIVE = NO
++
++# The EXCLUDE tag can be used to specify files and/or directories that should
++# excluded from the INPUT source files. This way you can easily exclude a
++# subdirectory from a directory tree whose root is specified with the INPUT tag.
++
++EXCLUDE =
++
++# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
++# directories that are symbolic links (a Unix filesystem feature) are excluded
++# from the input.
++
++EXCLUDE_SYMLINKS = NO
++
++# If the value of the INPUT tag contains directories, you can use the
++# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
++# certain files from those directories. Note that the wildcards are matched
++# against the file with absolute path, so to exclude all test directories
++# for example use the pattern */test/*
++
++EXCLUDE_PATTERNS =
++
++# The EXAMPLE_PATH tag can be used to specify one or more files or
++# directories that contain example code fragments that are included (see
++# the \include command).
++
++EXAMPLE_PATH =
++
++# If the value of the EXAMPLE_PATH tag contains directories, you can use the
++# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
++# and *.h) to filter out the source-files in the directories. If left
++# blank all files are included.
++
++EXAMPLE_PATTERNS =
++
++# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
++# searched for input files to be used with the \include or \dontinclude
++# commands irrespective of the value of the RECURSIVE tag.
++# Possible values are YES and NO. If left blank NO is used.
++
++EXAMPLE_RECURSIVE = NO
++
++# The IMAGE_PATH tag can be used to specify one or more files or
++# directories that contain image that are included in the documentation (see
++# the \image command).
++
++IMAGE_PATH = images
++
++# The INPUT_FILTER tag can be used to specify a program that doxygen should
++# invoke to filter for each input file. Doxygen will invoke the filter program
++# by executing (via popen()) the command <filter> <input-file>, where <filter>
++# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
++# input file. Doxygen will then use the output that the filter program writes
++# to standard output. If FILTER_PATTERNS is specified, this tag will be
++# ignored.
++
++INPUT_FILTER =
++
++# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
++# basis. Doxygen will compare the file name with each pattern and apply the
++# filter if there is a match. The filters are a list of the form:
++# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
++# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
++# is applied to all files.
++
++FILTER_PATTERNS =
++
++# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
++# INPUT_FILTER) will be used to filter the input files when producing source
++# files to browse (i.e. when SOURCE_BROWSER is set to YES).
++
++FILTER_SOURCE_FILES = NO
++
++#---------------------------------------------------------------------------
++# configuration options related to source browsing
++#---------------------------------------------------------------------------
++
++# If the SOURCE_BROWSER tag is set to YES then a list of source files will
++# be generated. Documented entities will be cross-referenced with these sources.
++# Note: To get rid of all source code in the generated output, make sure also
++# VERBATIM_HEADERS is set to NO.
++
++SOURCE_BROWSER = NO
++
++# Setting the INLINE_SOURCES tag to YES will include the body
++# of functions and classes directly in the documentation.
++
++INLINE_SOURCES = NO
++
++# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
++# doxygen to hide any special comment blocks from generated source code
++# fragments. Normal C and C++ comments will always remain visible.
++
++STRIP_CODE_COMMENTS = YES
++
++# If the REFERENCED_BY_RELATION tag is set to YES (the default)
++# then for each documented function all documented
++# functions referencing it will be listed.
++
++REFERENCED_BY_RELATION = YES
++
++# If the REFERENCES_RELATION tag is set to YES (the default)
++# then for each documented function all documented entities
++# called/used by that function will be listed.
++
++REFERENCES_RELATION = YES
++
++# If the USE_HTAGS tag is set to YES then the references to source code
++# will point to the HTML generated by the htags(1) tool instead of doxygen
++# built-in source browser. The htags tool is part of GNU's global source
++# tagging system (see http://www.gnu.org/software/global/global.html). You
++# will need version 4.8.6 or higher.
++
++USE_HTAGS = NO
++
++# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
++# will generate a verbatim copy of the header file for each class for
++# which an include is specified. Set to NO to disable this.
++
++VERBATIM_HEADERS = NO
++
++#---------------------------------------------------------------------------
++# configuration options related to the alphabetical class index
++#---------------------------------------------------------------------------
++
++# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
++# of all compounds will be generated. Enable this if the project
++# contains a lot of classes, structs, unions or interfaces.
++
++ALPHABETICAL_INDEX = NO
++
++# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
++# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
++# in which this list will be split (can be a number in the range [1..20])
++
++COLS_IN_ALPHA_INDEX = 5
++
++# In case all classes in a project start with a common prefix, all
++# classes will be put under the same header in the alphabetical index.
++# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
++# should be ignored while generating the index headers.
++
++IGNORE_PREFIX =
++
++#---------------------------------------------------------------------------
++# configuration options related to the HTML output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
++# generate HTML output.
++
++GENERATE_HTML = YES
++
++# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
++# If a relative path is entered the value of OUTPUT_DIRECTORY will be
++# put in front of it. If left blank `html' will be used as the default path.
++
++HTML_OUTPUT = html
++
++# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
++# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
++# doxygen will generate files with .html extension.
++
++HTML_FILE_EXTENSION = .html
++
++# The HTML_HEADER tag can be used to specify a personal HTML header for
++# each generated HTML page. If it is left blank doxygen will generate a
++# standard header.
++
++HTML_HEADER =
++
++# The HTML_FOOTER tag can be used to specify a personal HTML footer for
++# each generated HTML page. If it is left blank doxygen will generate a
++# standard footer.
++
++HTML_FOOTER = doco_footer.html
++
++# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
++# style sheet that is used by each HTML page. It can be used to
++# fine-tune the look of the HTML output. If the tag is left blank doxygen
++# will generate a default style sheet. Note that doxygen will try to copy
++# the style sheet file to the HTML output directory, so don't put your own
++# stylesheet in the HTML output directory as well, or it will be erased!
++
++HTML_STYLESHEET =
++
++# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
++# files or namespaces will be aligned in HTML using tables. If set to
++# NO a bullet list will be used.
++
++HTML_ALIGN_MEMBERS = YES
++
++# If the GENERATE_HTMLHELP tag is set to YES, additional index files
++# will be generated that can be used as input for tools like the
++# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
++# of the generated HTML documentation.
++
++GENERATE_HTMLHELP = NO
++
++# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
++# be used to specify the file name of the resulting .chm file. You
++# can add a path in front of the file if the result should not be
++# written to the html output directory.
++
++CHM_FILE =
++
++# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
++# be used to specify the location (absolute path including file name) of
++# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
++# the HTML help compiler on the generated index.hhp.
++
++HHC_LOCATION =
++
++# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
++# controls if a separate .chi index file is generated (YES) or that
++# it should be included in the master .chm file (NO).
++
++GENERATE_CHI = NO
++
++# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
++# controls whether a binary table of contents is generated (YES) or a
++# normal table of contents (NO) in the .chm file.
++
++BINARY_TOC = NO
++
++# The TOC_EXPAND flag can be set to YES to add extra items for group members
++# to the contents of the HTML help documentation and to the tree view.
++
++TOC_EXPAND = YES
++
++# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
++# top of each HTML page. The value NO (the default) enables the index and
++# the value YES disables it.
++
++DISABLE_INDEX = YES
++
++# This tag can be used to set the number of enum values (range [1..20])
++# that doxygen will group on one line in the generated HTML documentation.
++
++ENUM_VALUES_PER_LINE = 4
++
++# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
++# generated containing a tree-like index structure (just like the one that
++# is generated for HTML Help). For this to work a browser that supports
++# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
++# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
++# probably better off using the HTML help feature.
++
++GENERATE_TREEVIEW = YES
++
++# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
++# used to set the initial width (in pixels) of the frame in which the tree
++# is shown.
++
++TREEVIEW_WIDTH = 250
++
++#---------------------------------------------------------------------------
++# configuration options related to the LaTeX output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
++# generate Latex output.
++
++GENERATE_LATEX = NO
++
++# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
++# If a relative path is entered the value of OUTPUT_DIRECTORY will be
++# put in front of it. If left blank `latex' will be used as the default path.
++
++LATEX_OUTPUT = latex
++
++# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
++# invoked. If left blank `latex' will be used as the default command name.
++
++LATEX_CMD_NAME = latex
++
++# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
++# generate index for LaTeX. If left blank `makeindex' will be used as the
++# default command name.
++
++MAKEINDEX_CMD_NAME = makeindex
++
++# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
++# LaTeX documents. This may be useful for small projects and may help to
++# save some trees in general.
++
++COMPACT_LATEX = NO
++
++# The PAPER_TYPE tag can be used to set the paper type that is used
++# by the printer. Possible values are: a4, a4wide, letter, legal and
++# executive. If left blank a4wide will be used.
++
++PAPER_TYPE = a4wide
++
++# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
++# packages that should be included in the LaTeX output.
++
++EXTRA_PACKAGES =
++
++# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
++# the generated latex document. The header should contain everything until
++# the first chapter. If it is left blank doxygen will generate a
++# standard header. Notice: only use this tag if you know what you are doing!
++
++LATEX_HEADER =
++
++# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
++# is prepared for conversion to pdf (using ps2pdf). The pdf file will
++# contain links (just like the HTML output) instead of page references
++# This makes the output suitable for online browsing using a pdf viewer.
++
++PDF_HYPERLINKS = NO
++
++# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
++# plain latex in the generated Makefile. Set this option to YES to get a
++# higher quality PDF documentation.
++
++USE_PDFLATEX = NO
++
++# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
++# command to the generated LaTeX files. This will instruct LaTeX to keep
++# running if errors occur, instead of asking the user for help.
++# This option is also used when generating formulas in HTML.
++
++LATEX_BATCHMODE = NO
++
++# If LATEX_HIDE_INDICES is set to YES then doxygen will not
++# include the index chapters (such as File Index, Compound Index, etc.)
++# in the output.
++
++LATEX_HIDE_INDICES = NO
++
++#---------------------------------------------------------------------------
++# configuration options related to the RTF output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
++# The RTF output is optimized for Word 97 and may not look very pretty with
++# other RTF readers or editors.
++
++GENERATE_RTF = NO
++
++# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
++# If a relative path is entered the value of OUTPUT_DIRECTORY will be
++# put in front of it. If left blank `rtf' will be used as the default path.
++
++RTF_OUTPUT = rtf
++
++# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
++# RTF documents. This may be useful for small projects and may help to
++# save some trees in general.
++
++COMPACT_RTF = NO
++
++# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
++# will contain hyperlink fields. The RTF file will
++# contain links (just like the HTML output) instead of page references.
++# This makes the output suitable for online browsing using WORD or other
++# programs which support those fields.
++# Note: wordpad (write) and others do not support links.
++
++RTF_HYPERLINKS = NO
++
++# Load stylesheet definitions from file. Syntax is similar to doxygen's
++# config file, i.e. a series of assignments. You only have to provide
++# replacements, missing definitions are set to their default value.
++
++RTF_STYLESHEET_FILE =
++
++# Set optional variables used in the generation of an rtf document.
++# Syntax is similar to doxygen's config file.
++
++RTF_EXTENSIONS_FILE =
++
++#---------------------------------------------------------------------------
++# configuration options related to the man page output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
++# generate man pages
++
++GENERATE_MAN = NO
++
++# The MAN_OUTPUT tag is used to specify where the man pages will be put.
++# If a relative path is entered the value of OUTPUT_DIRECTORY will be
++# put in front of it. If left blank `man' will be used as the default path.
++
++MAN_OUTPUT = man
++
++# The MAN_EXTENSION tag determines the extension that is added to
++# the generated man pages (default is the subroutine's section .3)
++
++MAN_EXTENSION = .3
++
++# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
++# then it will generate one additional man file for each entity
++# documented in the real man page(s). These additional files
++# only source the real man page, but without them the man command
++# would be unable to find the correct page. The default is NO.
++
++MAN_LINKS = NO
++
++#---------------------------------------------------------------------------
++# configuration options related to the XML output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_XML tag is set to YES Doxygen will
++# generate an XML file that captures the structure of
++# the code including all documentation.
++
++GENERATE_XML = NO
++
++# The XML_OUTPUT tag is used to specify where the XML pages will be put.
++# If a relative path is entered the value of OUTPUT_DIRECTORY will be
++# put in front of it. If left blank `xml' will be used as the default path.
++
++XML_OUTPUT = xml
++
++# The XML_SCHEMA tag can be used to specify an XML schema,
++# which can be used by a validating XML parser to check the
++# syntax of the XML files.
++
++XML_SCHEMA =
++
++# The XML_DTD tag can be used to specify an XML DTD,
++# which can be used by a validating XML parser to check the
++# syntax of the XML files.
++
++XML_DTD =
++
++# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
++# dump the program listings (including syntax highlighting
++# and cross-referencing information) to the XML output. Note that
++# enabling this will significantly increase the size of the XML output.
++
++XML_PROGRAMLISTING = YES
++
++#---------------------------------------------------------------------------
++# configuration options for the AutoGen Definitions output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
++# generate an AutoGen Definitions (see autogen.sf.net) file
++# that captures the structure of the code including all
++# documentation. Note that this feature is still experimental
++# and incomplete at the moment.
++
++GENERATE_AUTOGEN_DEF = NO
++
++#---------------------------------------------------------------------------
++# configuration options related to the Perl module output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_PERLMOD tag is set to YES Doxygen will
++# generate a Perl module file that captures the structure of
++# the code including all documentation. Note that this
++# feature is still experimental and incomplete at the
++# moment.
++
++GENERATE_PERLMOD = NO
++
++# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
++# the necessary Makefile rules, Perl scripts and LaTeX code to be able
++# to generate PDF and DVI output from the Perl module output.
++
++PERLMOD_LATEX = NO
++
++# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
++# nicely formatted so it can be parsed by a human reader. This is useful
++# if you want to understand what is going on. On the other hand, if this
++# tag is set to NO the size of the Perl module output will be much smaller
++# and Perl will parse it just the same.
++
++PERLMOD_PRETTY = YES
++
++# The names of the make variables in the generated doxyrules.make file
++# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
++# This is useful so different doxyrules.make files included by the same
++# Makefile don't overwrite each other's variables.
++
++PERLMOD_MAKEVAR_PREFIX =
++
++#---------------------------------------------------------------------------
++# Configuration options related to the preprocessor
++#---------------------------------------------------------------------------
++
++# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
++# evaluate all C-preprocessor directives found in the sources and include
++# files.
++
++ENABLE_PREPROCESSING = YES
++
++# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
++# names in the source code. If set to NO (the default) only conditional
++# compilation will be performed. Macro expansion can be done in a controlled
++# way by setting EXPAND_ONLY_PREDEF to YES.
++
++MACRO_EXPANSION = YES
++
++# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
++# then the macro expansion is limited to the macros specified with the
++# PREDEFINED and EXPAND_AS_DEFINED tags.
++
++EXPAND_ONLY_PREDEF = YES
++
++# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
++# in the INCLUDE_PATH (see below) will be search if a #include is found.
++
++SEARCH_INCLUDES = YES
++
++# The INCLUDE_PATH tag can be used to specify one or more directories that
++# contain include files that are not input files but should be processed by
++# the preprocessor.
++
++INCLUDE_PATH =
++
++# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
++# patterns (like *.h and *.hpp) to filter out the header-files in the
++# directories. If left blank, the patterns specified with FILE_PATTERNS will
++# be used.
++
++INCLUDE_FILE_PATTERNS =
++
++# The PREDEFINED tag can be used to specify one or more macro names that
++# are defined before the preprocessor is started (similar to the -D option of
++# gcc). The argument of the tag is a list of macros of the form: name
++# or name=definition (no spaces). If the definition and the = are
++# omitted =1 is assumed. To prevent a macro definition from being
++# undefined via #undef or recursively expanded use the := operator
++# instead of the = operator.
++
++PREDEFINED = CONFIG_SSL_CERT_VERIFICATION CONFIG_SSL_ENABLE_CLIENT CONFIG_SSL_GENERATE_X509_CERT CONFIG_BIGINT_MONTGOMERY CONFIG_BIGINT_BARRETT CONFIG_BIGINT_CRT EXP_FUNC="" STDCALL=""
++
++# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
++# this tag can be used to specify a list of macro names that should be expanded.
++# The macro definition that is found in the sources will be used.
++# Use the PREDEFINED tag if you want to use a different macro definition.
++
++EXPAND_AS_DEFINED =
++
++# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
++# doxygen's preprocessor will remove all function-like macros that are alone
++# on a line, have an all uppercase name, and do not end with a semicolon. Such
++# function macros are typically used for boiler-plate code, and will confuse
++# the parser if not removed.
++
++SKIP_FUNCTION_MACROS = YES
++
++#---------------------------------------------------------------------------
++# Configuration::additions related to external references
++#---------------------------------------------------------------------------
++
++# The TAGFILES option can be used to specify one or more tagfiles.
++# Optionally an initial location of the external documentation
++# can be added for each tagfile. The format of a tag file without
++# this location is as follows:
++# TAGFILES = file1 file2 ...
++# Adding location for the tag files is done as follows:
++# TAGFILES = file1=loc1 "file2 = loc2" ...
++# where "loc1" and "loc2" can be relative or absolute paths or
++# URLs. If a location is present for each tag, the installdox tool
++# does not have to be run to correct the links.
++# Note that each tag file must have a unique name
++# (where the name does NOT include the path)
++# If a tag file is not located in the directory in which doxygen
++# is run, you must also specify the path to the tagfile here.
++
++TAGFILES =
++
++# When a file name is specified after GENERATE_TAGFILE, doxygen will create
++# a tag file that is based on the input files it reads.
++
++GENERATE_TAGFILE =
++
++# If the ALLEXTERNALS tag is set to YES all external classes will be listed
++# in the class index. If set to NO only the inherited external classes
++# will be listed.
++
++ALLEXTERNALS = NO
++
++# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
++# in the modules index. If set to NO, only the current project's groups will
++# be listed.
++
++EXTERNAL_GROUPS = NO
++
++# The PERL_PATH should be the absolute path and name of the perl script
++# interpreter (i.e. the result of `which perl').
++
++PERL_PATH = /usr/bin/perl
++
++#---------------------------------------------------------------------------
++# Configuration options related to the dot tool
++#---------------------------------------------------------------------------
++
++# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
++# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
++# or super classes. Setting the tag to NO turns the diagrams off. Note that
++# this option is superseded by the HAVE_DOT option below. This is only a
++# fallback. It is recommended to install and use dot, since it yields more
++# powerful graphs.
++
++CLASS_DIAGRAMS = YES
++
++# If set to YES, the inheritance and collaboration graphs will hide
++# inheritance and usage relations if the target is undocumented
++# or is not a class.
++
++HIDE_UNDOC_RELATIONS = YES
++
++# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
++# available from the path. This tool is part of Graphviz, a graph visualization
++# toolkit from AT&T and Lucent Bell Labs. The other options in this section
++# have no effect if this option is set to NO (the default)
++
++HAVE_DOT = NO
++
++# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
++# will generate a graph for each documented class showing the direct and
++# indirect inheritance relations. Setting this tag to YES will force the
++# the CLASS_DIAGRAMS tag to NO.
++
++CLASS_GRAPH = NO
++
++# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
++# will generate a graph for each documented class showing the direct and
++# indirect implementation dependencies (inheritance, containment, and
++# class references variables) of the class with other documented classes.
++
++COLLABORATION_GRAPH = NO
++
++# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
++# will generate a graph for groups, showing the direct groups dependencies
++
++GROUP_GRAPHS = NO
++
++# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
++# collaboration diagrams in a style similar to the OMG's Unified Modeling
++# Language.
++
++UML_LOOK = NO
++
++# If set to YES, the inheritance and collaboration graphs will show the
++# relations between templates and their instances.
++
++TEMPLATE_RELATIONS = NO
++
++# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
++# tags are set to YES then doxygen will generate a graph for each documented
++# file showing the direct and indirect include dependencies of the file with
++# other documented files.
++
++INCLUDE_GRAPH = NO
++
++# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
++# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
++# documented header file showing the documented files that directly or
++# indirectly include this file.
++
++INCLUDED_BY_GRAPH = NO
++
++# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
++# generate a call dependency graph for every global function or class method.
++# Note that enabling this option will significantly increase the time of a run.
++# So in most cases it will be better to enable call graphs for selected
++# functions only using the \callgraph command.
++
++CALL_GRAPH = NO
++
++# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
++# will graphical hierarchy of all classes instead of a textual one.
++
++GRAPHICAL_HIERARCHY = NO
++
++# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
++# then doxygen will show the dependencies a directory has on other directories
++# in a graphical way. The dependency relations are determined by the #include
++# relations between the files in the directories.
++
++DIRECTORY_GRAPH = NO
++
++# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
++# generated by dot. Possible values are png, jpg, or gif
++# If left blank png will be used.
++
++DOT_IMAGE_FORMAT = png
++
++# The tag DOT_PATH can be used to specify the path where the dot tool can be
++# found. If left blank, it is assumed the dot tool can be found in the path.
++
++DOT_PATH =
++
++# The DOTFILE_DIRS tag can be used to specify one or more directories that
++# contain dot files that are included in the documentation (see the
++# \dotfile command).
++
++DOTFILE_DIRS =
++
++# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
++# (in pixels) of the graphs generated by dot. If a graph becomes larger than
++# this value, doxygen will try to truncate the graph, so that it fits within
++# the specified constraint. Beware that most browsers cannot cope with very
++# large images.
++
++MAX_DOT_GRAPH_WIDTH = 1024
++
++# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
++# (in pixels) of the graphs generated by dot. If a graph becomes larger than
++# this value, doxygen will try to truncate the graph, so that it fits within
++# the specified constraint. Beware that most browsers cannot cope with very
++# large images.
++
++MAX_DOT_GRAPH_HEIGHT = 1024
++
++# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
++# graphs generated by dot. A depth value of 3 means that only nodes reachable
++# from the root by following a path via at most 3 edges will be shown. Nodes
++# that lay further from the root node will be omitted. Note that setting this
++# option to 1 or 2 may greatly reduce the computation time needed for large
++# code bases. Also note that a graph may be further truncated if the graph's
++# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
++# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
++# the graph is not depth-constrained.
++
++MAX_DOT_GRAPH_DEPTH = 0
++
++# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
++# background. This is disabled by default, which results in a white background.
++# Warning: Depending on the platform used, enabling this option may lead to
++# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
++# read).
++
++DOT_TRANSPARENT = NO
++
++# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
++# files in one run (i.e. multiple -o and -T options on the command line). This
++# makes dot run faster, but since only newer versions of dot (>1.8.10)
++# support this, this feature is disabled by default.
++
++DOT_MULTI_TARGETS = NO
++
++# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
++# generate a legend page explaining the meaning of the various boxes and
++# arrows in the dot generated graphs.
++
++GENERATE_LEGEND = YES
++
++# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
++# remove the intermediate dot files that are used to generate
++# the various graphs.
++
++DOT_CLEANUP = YES
++
++#---------------------------------------------------------------------------
++# Configuration::additions related to the search engine
++#---------------------------------------------------------------------------
++
++# The SEARCHENGINE tag specifies whether or not a search engine should be
++# used. If set to NO the values of all tags below this one will be ignored.
++
++SEARCHENGINE = NO
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/doco_footer.html b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/doco_footer.html
+new file mode 100644
+index 0000000..20c4e70
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/doco_footer.html
+@@ -0,0 +1,3 @@
++<p></p>
++<p align="center"><img src="../images/tsbasbw.gif" width="1000" height="7"></p>
++<CITE>Copyright <sup>©</sup> 2007 Cameron Rich</CITE>
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/images/axolotl.jpg b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/images/axolotl.jpg
+new file mode 100644
+index 0000000000000000000000000000000000000000..7352bbae836739e469c837a7fdb8114f786b2130
+GIT binary patch
+literal 3041
+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
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/images/tsbasbw.gif b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/images/tsbasbw.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..cf03b121bf9662b954351cf22aff54b305d0cba4
+GIT binary patch
+literal 2481
+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
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Config.in b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Config.in
+new file mode 100644
+index 0000000..513d57a
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Config.in
+@@ -0,0 +1,163 @@
++#
++# For a description of the syntax of this configuration file,
++# see scripts/config/Kconfig-language.txt
++#
++
++menu "Axhttpd Configuration"
++depends on CONFIG_AXHTTPD
++
++config CONFIG_HTTP_STATIC_BUILD
++ bool "Static Build"
++ default n
++ help
++ Select y if you want axhttpd to be a static build (i.e. don't use the
++ axtls shared library or dll).
++
++config CONFIG_HTTP_PORT
++ int "HTTP port"
++ default 80
++ help
++ The port number of the normal HTTP server.
++
++ You must be a root user in order to use the default port.
++
++config CONFIG_HTTP_HTTPS_PORT
++ int "HTTPS port"
++ default 443
++ help
++ The port number of the HTTPS server.
++
++ You must be a root user in order to use the default port.
++
++config CONFIG_HTTP_SESSION_CACHE_SIZE
++ int "SSL session cache size"
++ default 5
++ help
++ The size of the SSL session cache.
++
++ This is not actually related to the number of concurrent users, but
++ for optimum performance they should be the same (with a penalty
++ in memory usage).
++
++config CONFIG_HTTP_WEBROOT
++ string "Web root location"
++ default "../www" if !CONFIG_PLATFORM_WIN32
++ default "..\\www" if CONFIG_PLATFORM_WIN32
++ help
++ The location of the web root in relation to axhttpd. This is
++ the directory where index.html lives.
++
++config CONFIG_HTTP_TIMEOUT
++ int "Timeout"
++ default 300
++ help
++ Set the timeout of a connection in seconds.
++
++menu "CGI"
++depends on !CONFIG_PLATFORM_WIN32
++
++config CONFIG_HTTP_HAS_CGI
++ bool "Enable CGI"
++ default y
++ depends on !CONFIG_PLATFORM_WIN32
++ help
++ Enable the CGI capability. Not available on Win32 platforms.
++
++config CONFIG_HTTP_CGI_EXTENSIONS
++ string "CGI File Extension(s)"
++ default ".lua,.lp"
++ depends on CONFIG_HTTP_HAS_CGI
++ help
++ Tell axhhtpd what file extension(s) are used for CGI.
++
++ This is a comma separated list - e.g. ".php,.pl" etc
++
++config CONFIG_HTTP_ENABLE_LUA
++ bool "Enable Lua"
++ default y
++ depends on CONFIG_HTTP_HAS_CGI
++ help
++ Lua is a powerful, fast, light-weight, embeddable scripting language.
++
++ See http://www.lua.org for details.
++
++config CONFIG_HTTP_LUA_PREFIX
++ string "Lua's Installation Prefix"
++ default "/usr/local"
++ depends on CONFIG_HTTP_ENABLE_LUA
++
++ help
++ The location of Lua's installation prefix. This is also necessary for
++ Lua's cgi launcher application.
++
++config CONFIG_HTTP_LUA_CGI_LAUNCHER
++ string "CGI launcher location"
++ default "/bin/cgi.exe" if CONFIG_PLATFORM_CYGWIN
++ default "/bin/cgi" if !CONFIG_PLATFORM_CYGWIN
++ depends on CONFIG_HTTP_ENABLE_LUA
++ help
++ The location of LUA's CGI launcher application (after
++ the CONFIG_HTTP_LUA_PREFIX)
++
++config CONFIG_HTTP_BUILD_LUA
++ bool "Build Lua"
++ default n
++ depends on CONFIG_HTTP_ENABLE_LUA
++ help
++ Build Lua and install in /usr/local/bin
++
++endmenu
++
++config CONFIG_HTTP_DIRECTORIES
++ bool "Enable Directory Listing"
++ default y
++ help
++ Enable directory listing.
++
++config CONFIG_HTTP_HAS_AUTHORIZATION
++ bool "Enable authorization"
++ default y
++ help
++ Pages/directories can have passwords associated with them.
++
++config CONFIG_HTTP_HAS_IPV6
++ bool "Enable IPv6"
++ default n
++ depends on !CONFIG_PLATFORM_WIN32
++ help
++ Use IPv6 instead of IPv4.
++
++ Does not work under Win32
++
++config CONFIG_HTTP_ENABLE_DIFFERENT_USER
++ bool "Enable different user"
++ default n
++ depends on !CONFIG_PLATFORM_WIN32
++ help
++ Allow the web server to be run as a different user
++
++config CONFIG_HTTP_USER
++ string "As User"
++ default "nobody"
++ depends on CONFIG_HTTP_ENABLE_DIFFERENT_USER
++ help
++ The user name that will be used to run axhttpd.
++
++config CONFIG_HTTP_VERBOSE
++ bool "Verbose Mode"
++ default y if CONFIG_SSL_FULL_MODE
++ default n if !CONFIG_SSL_FULL_MODE
++ help
++ Enable extra statements used when using axhttpd.
++
++config CONFIG_HTTP_IS_DAEMON
++ bool "Run as a daemon"
++ default n
++ depends on !CONFIG_PLATFORM_WIN32
++ help
++ Run axhttpd as a background process.
++
++ Does not work under Win32
++
++endmenu
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Makefile
+new file mode 100644
+index 0000000..b8c18d2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Makefile
+@@ -0,0 +1,127 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++all : web_server lua
++
++AXTLS_HOME=..
++
++include $(AXTLS_HOME)/config/.config
++include $(AXTLS_HOME)/config/makefile.conf
++
++ifndef CONFIG_PLATFORM_WIN32
++
++ifdef CONFIG_PLATFORM_CYGWIN
++TARGET=$(AXTLS_HOME)/$(STAGE)/axhttpd.exe
++TARGET2=$(AXTLS_HOME)/$(STAGE)/htpasswd.exe
++else
++TARGET=$(AXTLS_HOME)/$(STAGE)/axhttpd
++TARGET2=$(AXTLS_HOME)/$(STAGE)/htpasswd
++endif
++
++ifdef CONFIG_HTTP_STATIC_BUILD
++LIBS=$(AXTLS_HOME)/$(STAGE)/libaxtls.a
++else
++LIBS=-L$(AXTLS_HOME)/$(STAGE) -laxtls
++endif
++
++ifdef CONFIG_HTTP_BUILD_LUA
++lua: kepler-1.1
++
++kepler-1.1:
++ @tar xvfz kepler-1.1-snapshot-20070521-1825.tar.gz
++ @cat kepler.patch | patch -p0
++ cd kepler-1.1; ./configure --prefix=$(CONFIG_HTTP_LUA_PREFIX) --launcher=cgi --lua-suffix= ; make install
++else
++lua:
++endif
++
++else # win32 build
++lua:
++
++TARGET=$(AXTLS_HOME)/$(STAGE)/axhttpd.exe
++TARGET2=$(AXTLS_HOME)/$(STAGE)/htpasswd.exe
++
++ifdef CONFIG_HTTP_STATIC_BUILD
++LIBS=$(AXTLS_HOME)/$(STAGE)/axtls.static.lib $(AXTLS_HOME)\\config\\axtls.res
++else
++LIBS=$(AXTLS_HOME)/$(STAGE)/axtls.lib $(AXTLS_HOME)\\config\\axtls.res
++endif
++endif
++
++ifndef CONFIG_AXHTTPD
++web_server:
++else
++
++web_server :: $(TARGET)
++
++ifdef CONFIG_HTTP_HAS_AUTHORIZATION
++web_server :: $(TARGET2)
++endif
++
++OBJ= \
++ axhttpd.o \
++ proc.o \
++ tdate_parse.o
++
++include $(AXTLS_HOME)/config/makefile.post
++
++ifndef CONFIG_PLATFORM_WIN32
++
++$(TARGET): $(OBJ) $(AXTLS_HOME)/$(STAGE)/libaxtls.a
++ $(LD) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)
++ifdef CONFIG_STRIP_UNWANTED_SECTIONS
++ $(STRIP) --remove-section=.comment $(TARGET)
++endif
++
++$(TARGET2): htpasswd.o $(AXTLS_HOME)/$(STAGE)/libaxtls.a
++ $(LD) $(LDFLAGS) -o $@ htpasswd.o $(LIBS)
++
++else # Win32
++
++OBJ:=$(OBJ:.o=.obj)
++%.obj : %.c
++ $(CC) $(CFLAGS) $<
++
++htpasswd.obj : htpasswd.c
++ $(CC) $(CFLAGS) $?
++
++$(TARGET): $(OBJ)
++ $(LD) $(LDFLAGS) /out:$@ $(LIBS) $?
++
++$(TARGET2): htpasswd.obj
++ $(LD) $(LDFLAGS) /out:$@ $(LIBS) $?
++endif
++
++endif # CONFIG_AXHTTPD
++
++clean::
++ -@rm -f $(TARGET)*
++ -@rm -fr kepler-1.1
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttp.h b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttp.h
+new file mode 100644
+index 0000000..73c299f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttp.h
+@@ -0,0 +1,154 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include "ssl.h"
++
++#define BACKLOG 15
++#define VERSION "1.0.0"
++#ifdef CONFIG_HTTP_HAS_IPV6
++#define HAVE_IPV6
++#endif
++
++#define MAXPOSTDATASIZE 30000
++#define MAXREQUESTLENGTH 256
++#define BLOCKSIZE 4096
++
++#define INITIAL_CONNECTION_SLOTS 10
++#define CONFIG_HTTP_DEFAULT_SSL_OPTIONS SSL_DISPLAY_CERTS
++
++#define STATE_WANT_TO_READ_HEAD 1
++#define STATE_WANT_TO_SEND_HEAD 2
++#define STATE_WANT_TO_READ_FILE 3
++#define STATE_WANT_TO_SEND_FILE 4
++#define STATE_DOING_DIR 5
++
++enum
++{
++ TYPE_GET,
++ TYPE_HEAD,
++ TYPE_POST
++};
++
++struct connstruct
++{
++ struct connstruct *next;
++ int state;
++ int reqtype;
++ int networkdesc;
++ int filedesc;
++ SSL *ssl;
++
++#if defined(CONFIG_HTTP_DIRECTORIES)
++#ifdef WIN32
++ HANDLE dirp;
++ WIN32_FIND_DATA file_data;
++#else
++ DIR *dirp;
++#endif
++#endif
++
++ time_t timeout;
++ char actualfile[MAXREQUESTLENGTH];
++ char filereq[MAXREQUESTLENGTH];
++ char dirname[MAXREQUESTLENGTH];
++ char server_name[MAXREQUESTLENGTH];
++ int numbytes;
++ char databuf[BLOCKSIZE];
++ uint8_t is_ssl;
++ uint8_t close_when_done;
++ time_t if_modified_since;
++
++#if defined(CONFIG_HTTP_HAS_CGI)
++ uint8_t is_cgi;
++#ifdef CONFIG_HTTP_ENABLE_LUA
++ uint8_t is_lua;
++#endif
++ int content_length;
++ char remote_addr[MAXREQUESTLENGTH];
++ char uri_request[MAXREQUESTLENGTH];
++ char uri_path_info[MAXREQUESTLENGTH];
++ char uri_query[MAXREQUESTLENGTH];
++ char cookie[MAXREQUESTLENGTH];
++#endif
++#if defined(CONFIG_HTTP_HAS_AUTHORIZATION)
++ char authorization[MAXREQUESTLENGTH];
++#endif
++ int post_read;
++ int post_state;
++ char *post_data;
++};
++
++struct serverstruct
++{
++ struct serverstruct *next;
++ int sd;
++ int is_ssl;
++ SSL_CTX *ssl_ctx;
++};
++
++#if defined(CONFIG_HTTP_HAS_CGI)
++struct cgiextstruct
++{
++ struct cgiextstruct *next;
++ char *ext;
++};
++#endif
++
++/* global prototypes */
++extern struct serverstruct *servers;
++extern struct connstruct *usedconns;
++extern struct connstruct *freeconns;
++extern const char * const server_version;
++
++#if defined(CONFIG_HTTP_HAS_CGI)
++extern struct cgiextstruct *cgiexts;
++#endif
++
++/* conn.c prototypes */
++void removeconnection(struct connstruct *cn);
++
++/* proc.c prototypes */
++void procdodir(struct connstruct *cn);
++void procreadhead(struct connstruct *cn);
++void procsendhead(struct connstruct *cn);
++void procreadfile(struct connstruct *cn);
++void procsendfile(struct connstruct *cn);
++#if defined(CONFIG_HTTP_HAS_CGI)
++void read_post_data(struct connstruct *cn);
++#endif
++
++/* misc.c prototypes */
++char *my_strncpy(char *dest, const char *src, size_t n);
++int isdir(const char *name);
++
++/* tdate prototypes */
++void tdate_init(void);
++time_t tdate_parse(const char* str);
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttpd.c b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttpd.c
+new file mode 100644
+index 0000000..35d36f6
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttpd.c
+@@ -0,0 +1,604 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include <stdio.h>
++#include <string.h>
++#include <sys/types.h>
++#include <signal.h>
++#include <stdlib.h>
++#include <sys/stat.h>
++#include <pwd.h>
++#include "axhttp.h"
++
++struct serverstruct *servers;
++struct connstruct *usedconns;
++struct connstruct *freeconns;
++const char * const server_version = "axhttpd/"AXTLS_VERSION;
++
++static void addtoservers(int sd);
++static int openlistener(int port);
++static void handlenewconnection(int listenfd, int is_ssl);
++static void addconnection(int sd, char *ip, int is_ssl);
++static void ax_chdir(void);
++
++#if defined(CONFIG_HTTP_HAS_CGI)
++struct cgiextstruct *cgiexts;
++static void addcgiext(const char *tp);
++
++#if !defined(WIN32)
++static void reaper(int sigtype)
++{
++ wait3(NULL, WNOHANG, NULL);
++}
++#endif
++#endif
++
++#ifdef CONFIG_HTTP_VERBOSE /* should really be in debug mode or something */
++/* clean up memory for valgrind */
++static void sigint_cleanup(int sig)
++{
++ struct serverstruct *sp;
++ struct connstruct *tp;
++
++ while (servers != NULL)
++ {
++ if (servers->is_ssl)
++ ssl_ctx_free(servers->ssl_ctx);
++
++ sp = servers->next;
++ free(servers);
++ servers = sp;
++ }
++
++ while (freeconns != NULL)
++ {
++ tp = freeconns->next;
++ free(freeconns);
++ freeconns = tp;
++ }
++
++ while (usedconns != NULL)
++ {
++ tp = usedconns->next;
++ free(usedconns);
++ usedconns = tp;
++ }
++
++#if defined(CONFIG_HTTP_HAS_CGI)
++ while (cgiexts)
++ {
++ struct cgiextstruct *cp = cgiexts->next;
++ if (cp == NULL) /* last entry */
++ free(cgiexts->ext);
++ free(cgiexts);
++ cgiexts = cp;
++ }
++#endif
++
++ exit(0);
++}
++
++static void die(int sigtype)
++{
++ exit(0);
++}
++#endif
++
++int main(int argc, char *argv[])
++{
++ fd_set rfds, wfds;
++ struct connstruct *tp, *to;
++ struct serverstruct *sp;
++ int rnum, wnum, active;
++ int i;
++ time_t currtime;
++
++#ifdef WIN32
++ WORD wVersionRequested = MAKEWORD(2, 2);
++ WSADATA wsaData;
++ WSAStartup(wVersionRequested,&wsaData);
++#else
++ signal(SIGPIPE, SIG_IGN);
++#if defined(CONFIG_HTTP_HAS_CGI)
++ signal(SIGCHLD, reaper);
++#endif
++#ifdef CONFIG_HTTP_VERBOSE
++ signal(SIGQUIT, die);
++#endif
++#endif
++
++#ifdef CONFIG_HTTP_VERBOSE
++ signal(SIGTERM, die);
++ signal(SIGINT, sigint_cleanup);
++#endif
++ tdate_init();
++
++ for (i = 0; i < INITIAL_CONNECTION_SLOTS; i++)
++ {
++ tp = freeconns;
++ freeconns = (struct connstruct *)calloc(1, sizeof(struct connstruct));
++ freeconns->next = tp;
++ }
++
++ if ((active = openlistener(CONFIG_HTTP_PORT)) == -1)
++ {
++#ifdef CONFIG_HTTP_VERBOSE
++ fprintf(stderr, "ERR: Couldn't bind to port %d\n",
++ CONFIG_HTTP_PORT);
++#endif
++ exit(1);
++ }
++
++ addtoservers(active);
++
++ if ((active = openlistener(CONFIG_HTTP_HTTPS_PORT)) == -1)
++ {
++#ifdef CONFIG_HTTP_VERBOSE
++ fprintf(stderr, "ERR: Couldn't bind to port %d\n",
++ CONFIG_HTTP_HTTPS_PORT);
++#endif
++ exit(1);
++ }
++
++ addtoservers(active);
++ servers->ssl_ctx = ssl_ctx_new(CONFIG_HTTP_DEFAULT_SSL_OPTIONS,
++ CONFIG_HTTP_SESSION_CACHE_SIZE);
++ servers->is_ssl = 1;
++
++#if defined(CONFIG_HTTP_HAS_CGI)
++ addcgiext(CONFIG_HTTP_CGI_EXTENSIONS);
++#endif
++
++#if defined(CONFIG_HTTP_VERBOSE)
++#if defined(CONFIG_HTTP_HAS_CGI)
++ printf("addcgiext %s\n", CONFIG_HTTP_CGI_EXTENSIONS);
++#endif
++ printf("%s: listening on ports %d (http) and %d (https)\n",
++ server_version, CONFIG_HTTP_PORT, CONFIG_HTTP_HTTPS_PORT);
++ TTY_FLUSH();
++#endif
++
++ ax_chdir();
++
++#ifdef CONFIG_HTTP_ENABLE_DIFFERENT_USER
++ {
++ struct passwd *pd = getpwnam(CONFIG_HTTP_USER);
++
++ if (pd != NULL)
++ {
++ int res = setuid(pd->pw_uid);
++ res |= setgid(pd->pw_gid);
++
++#if defined(CONFIG_HTTP_VERBOSE)
++ if (res == 0)
++ {
++ printf("change to '%s' successful\n", CONFIG_HTTP_USER);
++ TTY_FLUSH();
++ }
++#endif
++ }
++
++ }
++#endif
++
++
++#ifndef WIN32
++#ifdef CONFIG_HTTP_IS_DAEMON
++ if (fork() > 0) /* parent will die */
++ exit(0);
++
++ setsid();
++#endif
++#endif
++
++ /* main loop */
++ while (1)
++ {
++ FD_ZERO(&rfds);
++ FD_ZERO(&wfds);
++ rnum = wnum = -1;
++ sp = servers;
++
++ while (sp != NULL) /* read each server port */
++ {
++ FD_SET(sp->sd, &rfds);
++
++ if (sp->sd > rnum)
++ rnum = sp->sd;
++ sp = sp->next;
++ }
++
++ /* Add the established sockets */
++ tp = usedconns;
++ currtime = time(NULL);
++
++ while (tp != NULL)
++ {
++ if (currtime > tp->timeout) /* timed out? Kill it. */
++ {
++ to = tp;
++ tp = tp->next;
++ removeconnection(to);
++ continue;
++ }
++
++ if (tp->state == STATE_WANT_TO_READ_HEAD)
++ {
++ FD_SET(tp->networkdesc, &rfds);
++ if (tp->networkdesc > rnum)
++ rnum = tp->networkdesc;
++ }
++
++ if (tp->state == STATE_WANT_TO_SEND_HEAD)
++ {
++ FD_SET(tp->networkdesc, &wfds);
++ if (tp->networkdesc > wnum)
++ wnum = tp->networkdesc;
++ }
++
++ if (tp->state == STATE_WANT_TO_READ_FILE)
++ {
++ FD_SET(tp->filedesc, &rfds);
++ if (tp->filedesc > rnum)
++ rnum = tp->filedesc;
++ }
++
++ if (tp->state == STATE_WANT_TO_SEND_FILE)
++ {
++ FD_SET(tp->networkdesc, &wfds);
++ if (tp->networkdesc > wnum)
++ wnum = tp->networkdesc;
++ }
++
++#if defined(CONFIG_HTTP_DIRECTORIES)
++ if (tp->state == STATE_DOING_DIR)
++ {
++ FD_SET(tp->networkdesc, &wfds);
++ if (tp->networkdesc > wnum)
++ wnum = tp->networkdesc;
++ }
++#endif
++ tp = tp->next;
++ }
++
++ active = select(wnum > rnum ? wnum+1 : rnum+1,
++ rnum != -1 ? &rfds : NULL,
++ wnum != -1 ? &wfds : NULL,
++ NULL, NULL);
++
++ /* New connection? */
++ sp = servers;
++ while (active > 0 && sp != NULL)
++ {
++ if (FD_ISSET(sp->sd, &rfds))
++ {
++ handlenewconnection(sp->sd, sp->is_ssl);
++ active--;
++ }
++
++ sp = sp->next;
++ }
++
++ /* Handle the established sockets */
++ tp = usedconns;
++
++ while (active > 0 && tp != NULL)
++ {
++ to = tp;
++ tp = tp->next;
++
++ if (to->state == STATE_WANT_TO_READ_HEAD &&
++ FD_ISSET(to->networkdesc, &rfds))
++ {
++ active--;
++#if defined(CONFIG_HTTP_HAS_CGI)
++ if (to->post_state)
++ read_post_data(to);
++ else
++#endif
++ procreadhead(to);
++ }
++
++ if (to->state == STATE_WANT_TO_SEND_HEAD &&
++ FD_ISSET(to->networkdesc, &wfds))
++ {
++ active--;
++ procsendhead(to);
++ }
++
++ if (to->state == STATE_WANT_TO_READ_FILE &&
++ FD_ISSET(to->filedesc, &rfds))
++ {
++ active--;
++ procreadfile(to);
++ }
++
++ if (to->state == STATE_WANT_TO_SEND_FILE &&
++ FD_ISSET(to->networkdesc, &wfds))
++ {
++ active--;
++ procsendfile(to);
++ }
++
++#if defined(CONFIG_HTTP_DIRECTORIES)
++ if (to->state == STATE_DOING_DIR &&
++ FD_ISSET(to->networkdesc, &wfds))
++ {
++ active--;
++ procdodir(to);
++ }
++#endif
++ }
++ }
++
++ return 0;
++}
++
++#if defined(CONFIG_HTTP_HAS_CGI)
++static void addcgiext(const char *cgi_exts)
++{
++ char *cp = strdup(cgi_exts);
++
++ /* extenstions are comma separated */
++ do
++ {
++ struct cgiextstruct *ex = (struct cgiextstruct *)
++ malloc(sizeof(struct cgiextstruct));
++ ex->ext = cp;
++ ex->next = cgiexts;
++ cgiexts = ex;
++ if ((cp = strchr(cp, ',')) != NULL)
++ *cp++ = 0;
++ } while (cp != NULL);
++}
++#endif
++
++static void addtoservers(int sd)
++{
++ struct serverstruct *tp = (struct serverstruct *)
++ calloc(1, sizeof(struct serverstruct));
++ tp->next = servers;
++ tp->sd = sd;
++ servers = tp;
++}
++
++#ifdef HAVE_IPV6
++static void handlenewconnection(int listenfd, int is_ssl)
++{
++ struct sockaddr_in6 their_addr;
++ int tp = sizeof(their_addr);
++ char ipbuf[100];
++ int connfd = accept(listenfd, (struct sockaddr *)&their_addr, &tp);
++
++ if (tp == sizeof(struct sockaddr_in6))
++ inet_ntop(AF_INET6, &their_addr.sin6_addr, ipbuf, sizeof(ipbuf));
++ else if (tp == sizeof(struct sockaddr_in))
++ inet_ntop(AF_INET, &(((struct sockaddr_in *)&their_addr)->sin_addr),
++ ipbuf, sizeof(ipbuf));
++ else
++ *ipbuf = '\0';
++
++ addconnection(connfd, ipbuf, is_ssl);
++}
++
++#else
++static void handlenewconnection(int listenfd, int is_ssl)
++{
++ struct sockaddr_in their_addr;
++ socklen_t tp = sizeof(struct sockaddr_in);
++ int connfd = accept(listenfd, (struct sockaddr *)&their_addr, &tp);
++ addconnection(connfd, inet_ntoa(their_addr.sin_addr), is_ssl);
++}
++#endif
++
++static int openlistener(int port)
++{
++ int sd;
++#ifdef WIN32
++ char tp = 1;
++#else
++ int tp = 1;
++#endif
++#ifndef HAVE_IPV6
++ struct sockaddr_in my_addr;
++
++ if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
++ return -1;
++
++ memset(&my_addr, 0, sizeof(my_addr));
++ my_addr.sin_family = AF_INET;
++ my_addr.sin_port = htons((short)port);
++ my_addr.sin_addr.s_addr = INADDR_ANY;
++#else
++ struct sockaddr_in6 my_addr;
++
++ if ((sd = socket(AF_INET6, SOCK_STREAM, 0)) == -1)
++ return -1;
++
++ memset(&my_addr, 0, sizeof(my_addr));
++ my_addr.sin6_family = AF_INET6;
++ my_addr.sin6_port = htons(port);
++ my_addr.sin6_addr.s_addr = INADDR_ANY;
++#endif
++
++ setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &tp, sizeof(tp));
++ if (bind(sd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
++ {
++ close(sd);
++ return -1;
++ }
++
++ listen(sd, BACKLOG);
++ return sd;
++}
++
++/* Wrapper function for strncpy() that guarantees
++ a null-terminated string. This is to avoid any possible
++ issues due to strncpy()'s behaviour.
++ */
++char *my_strncpy(char *dest, const char *src, size_t n)
++{
++ strncpy(dest, src, n);
++ dest[n-1] = '\0';
++ return dest;
++}
++
++int isdir(const char *tpbuf)
++{
++ struct stat st;
++ char path[MAXREQUESTLENGTH];
++ strcpy(path, tpbuf);
++
++#ifdef WIN32 /* win32 stat() can't handle trailing '\' */
++ if (path[strlen(path)-1] == '\\')
++ path[strlen(path)-1] = 0;
++#endif
++
++ if (stat(path, &st) == -1)
++ return 0;
++
++ if ((st.st_mode & S_IFMT) == S_IFDIR)
++ return 1;
++
++ return 0;
++}
++
++static void addconnection(int sd, char *ip, int is_ssl)
++{
++ struct connstruct *tp;
++
++ /* Get ourselves a connstruct */
++ if (freeconns == NULL)
++ tp = (struct connstruct *)calloc(1, sizeof(struct connstruct));
++ else
++ {
++ tp = freeconns;
++ freeconns = tp->next;
++ }
++
++ /* Attach it to the used list */
++ tp->next = usedconns;
++ usedconns = tp;
++ tp->networkdesc = sd;
++
++ if (is_ssl)
++ tp->ssl = ssl_server_new(servers->ssl_ctx, sd);
++
++ tp->is_ssl = is_ssl;
++ tp->filedesc = -1;
++#if defined(CONFIG_HTTP_HAS_DIRECTORIES)
++ tp->dirp = NULL;
++#endif
++ *tp->actualfile = '\0';
++ *tp->filereq = '\0';
++ tp->state = STATE_WANT_TO_READ_HEAD;
++ tp->reqtype = TYPE_GET;
++ tp->close_when_done = 0;
++ tp->timeout = time(NULL) + CONFIG_HTTP_TIMEOUT;
++#if defined(CONFIG_HTTP_HAS_CGI)
++ strcpy(tp->remote_addr, ip);
++#endif
++}
++
++void removeconnection(struct connstruct *cn)
++{
++ struct connstruct *tp;
++ int shouldret = 0;
++
++ tp = usedconns;
++
++ if (tp == NULL || cn == NULL)
++ shouldret = 1;
++ else if (tp == cn)
++ usedconns = tp->next;
++ else
++ {
++ while (tp != NULL)
++ {
++ if (tp->next == cn)
++ {
++ tp->next = (tp->next)->next;
++ shouldret = 0;
++ break;
++ }
++
++ tp = tp->next;
++ shouldret = 1;
++ }
++ }
++
++ if (shouldret)
++ return;
++
++ /* If we did, add it to the free list */
++ cn->next = freeconns;
++ freeconns = cn;
++
++ /* Close it all down */
++ if (cn->networkdesc != -1)
++ {
++ if (cn->is_ssl)
++ {
++ ssl_free(cn->ssl);
++ cn->ssl = NULL;
++ }
++
++ SOCKET_CLOSE(cn->networkdesc);
++ }
++
++ if (cn->filedesc != -1)
++ close(cn->filedesc);
++
++#if defined(CONFIG_HTTP_HAS_DIRECTORIES)
++ if (cn->dirp != NULL)
++#ifdef WIN32
++ FindClose(cn->dirp);
++#else
++ closedir(cn->dirp);
++#endif
++#endif
++}
++
++/*
++ * Change directories one way or the other.
++ */
++static void ax_chdir(void)
++{
++ static char *webroot = CONFIG_HTTP_WEBROOT;
++
++ if (chdir(webroot))
++ {
++#ifdef CONFIG_HTTP_VERBOSE
++ fprintf(stderr, "'%s' is not a directory\n", webroot);
++#endif
++ exit(1);
++ }
++}
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/htpasswd.c b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/htpasswd.c
+new file mode 100644
+index 0000000..1a7a231
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/htpasswd.c
+@@ -0,0 +1,136 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include <stdio.h>
++#include <string.h>
++#include <stdlib.h>
++#include "ssl.h"
++
++int tfd;
++
++void base64_encode(const uint8_t *in, size_t inlen, char *out, size_t outlen)
++{
++ static const char b64str[64] =
++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
++
++ while (inlen && outlen)
++ {
++ *out++ = b64str[(in[0] >> 2) & 0x3f];
++ if (!--outlen)
++ break;
++
++ *out++ = b64str[((in[0] << 4)
++ + (--inlen ? in[1] >> 4 : 0)) & 0x3f];
++ if (!--outlen)
++ break;
++ *out++ = (inlen
++ ? b64str[((in[1] << 2)
++ + (--inlen ? in[2] >> 6 : 0))
++ & 0x3f]
++ : '=');
++ if (!--outlen)
++ break;
++ *out++ = inlen ? b64str[in[2] & 0x3f] : '=';
++ if (!--outlen)
++ break;
++ if (inlen)
++ inlen--;
++ if (inlen)
++ in += 3;
++ }
++
++ if (outlen)
++ *out = '\0';
++}
++
++static void usage(void)
++{
++ fprintf(stderr,"Usage: htpasswd username\n");
++ exit(1);
++}
++
++#ifdef WIN32
++static char * getpass(const char *prompt)
++{
++ static char buf[127];
++ FILE *fp = stdin;
++
++ printf(prompt); TTY_FLUSH();
++#if 0
++ fp = fopen("/dev/tty", "w");
++ if (fp == NULL)
++ {
++ printf("null\n"); TTY_FLUSH();
++ fp = stdin;
++ }
++#endif
++
++ fgets(buf, sizeof(buf), fp);
++ while (buf[strlen(buf)-1] < ' ')
++ buf[strlen(buf)-1] = '\0';
++
++ //if (fp != stdin)
++ // fclose(fp);
++ return buf;
++}
++#endif
++
++int main(int argc, char *argv[])
++{
++ char* pw;
++ uint8_t md5_salt[MD5_SIZE], md5_pass[MD5_SIZE];
++ char b64_salt[MD5_SIZE+10], b64_pass[MD5_SIZE+10];
++ MD5_CTX ctx;
++
++ if (argc != 2)
++ usage();
++
++ pw = strdup(getpass("New password:"));
++ if (strcmp(pw, getpass("Re-type new password:")) != 0)
++ {
++ fprintf(stderr, "They don't match, sorry.\n" );
++ exit(1);
++ }
++
++ RNG_initialize((uint8_t *)pw, sizeof(pw));
++ get_random(MD5_SIZE, md5_salt);
++ RNG_terminate();
++ base64_encode(md5_salt, MD5_SIZE, b64_salt, sizeof(b64_salt));
++
++ MD5_Init(&ctx);
++ MD5_Update(&ctx, md5_salt, MD5_SIZE);
++ MD5_Update(&ctx, (uint8_t *)pw, strlen(pw));
++ MD5_Final(md5_pass, &ctx);
++ base64_encode(md5_pass, MD5_SIZE, b64_pass, sizeof(b64_pass));
++
++ printf("Add the following to your '.htpasswd' file\n");
++ printf("%s:%s$%s\n", argv[1], b64_salt, b64_pass);
++ return 0;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/kepler-1.1-snapshot-20070521-1825.tar.gz b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/kepler-1.1-snapshot-20070521-1825.tar.gz
+new file mode 100755
+index 0000000000000000000000000000000000000000..d1caec5a53f93f043a32ec04807dff259223c32c
+GIT binary patch
+literal 768249
+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%0AF
+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
+ze`oyX%0D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%0DCk9<7tY?M8mXF
+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
+FFaS(TVi5oU
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/kepler.patch b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/kepler.patch
+new file mode 100644
+index 0000000..dbab7e5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/kepler.patch
+@@ -0,0 +1,64 @@
++diff -Naur kepler-1.1/launcher/cgi/Makefile kepler-1.1.new/launcher/cgi/Makefile
++--- kepler-1.1/launcher/cgi/Makefile 2007-04-21 06:41:49.000000000 +1000
+++++ kepler-1.1.new/launcher/cgi/Makefile 2007-05-16 22:13:38.750000000 +1000
++@@ -16,7 +16,7 @@
++
++
++ $T: $(CH) $(OBJS)
++- $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS)
+++ $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) -L../../lua-5.1.2/src -llua
++
++ build: $T
++
++diff -Naur kepler-1.1/luafilesystem/Makefile kepler-1.1.new/luafilesystem/Makefile
++--- kepler-1.1/luafilesystem/Makefile 2007-04-21 06:41:49.000000000 +1000
+++++ kepler-1.1.new/luafilesystem/Makefile 2007-05-16 22:06:25.546875000 +1000
++@@ -12,7 +12,7 @@
++ lib: src/$(LIBNAME)
++
++ src/$(LIBNAME): $(OBJS)
++- export MACOSX_DEPLOYMENT_TARGET="10.3"; $(CC) $(CFLAGS) $(LIB_OPTION) -o src/$(LIBNAME) $(OBJS)
+++ export MACOSX_DEPLOYMENT_TARGET="10.3"; $(CC) $(CFLAGS) $(LIB_OPTION) -o src/$(LIBNAME) $(OBJS) -L../lua-5.1.2/src -llua
++
++ install: src/$(LIBNAME)
++ mkdir -p $(LUA_LIBDIR)
++diff -Naur kepler-1.1/luasocket-2.0.1/src/makefile kepler-1.1.new/luasocket-2.0.1/src/makefile
++--- kepler-1.1/luasocket-2.0.1/src/makefile 2007-04-21 06:41:49.000000000 +1000
+++++ kepler-1.1.new/luasocket-2.0.1/src/makefile 2007-05-16 22:36:37.125000000 +1000
++@@ -47,10 +47,10 @@
++ all: $(SOCKET_SO) $(MIME_SO)
++
++ $(SOCKET_SO): $(SOCKET_OBJS)
++- $(LD) $(LDFLAGS) -o $@ $(SOCKET_OBJS)
+++ $(LD) $(LDFLAGS) -o $@ $(SOCKET_OBJS) -L../../lua-5.1.2/src -llua
++
++ $(MIME_SO): $(MIME_OBJS)
++- $(LD) $(LDFLAGS) -o $@ $(MIME_OBJS)
+++ $(LD) $(LDFLAGS) -o $@ $(MIME_OBJS) -L../../lua-5.1.2/src -llua
++
++ $(UNIX_SO): $(UNIX_OBJS)
++ $(LD) $(LDFLAGS) -o $@ $(UNIX_OBJS)
++diff -Naur kepler-1.1/md5/Makefile kepler-1.1.new/md5/Makefile
++--- kepler-1.1/md5/Makefile 2007-04-21 06:41:49.000000000 +1000
+++++ kepler-1.1.new/md5/Makefile 2007-05-16 22:06:44.593750000 +1000
++@@ -15,7 +15,7 @@
++
++
++ src/$(LIBNAME) : $(OBJS)
++- export MACOSX_DEPLOYMENT_TARGET="10.3"; $(CC) $(CFLAGS) $(LIB_OPTION) -o src/$(LIBNAME) $(OBJS)
+++ export MACOSX_DEPLOYMENT_TARGET="10.3"; $(CC) $(CFLAGS) $(LIB_OPTION) -o src/$(LIBNAME) $(OBJS) -L../lua-5.1.2/src -llua
++
++ $(COMPAT_DIR)/compat-5.1.o: $(COMPAT_DIR)/compat-5.1.c
++ $(CC) -c $(CFLAGS) -o $@ $(COMPAT_DIR)/compat-5.1.c
++diff -Naur kepler-1.1/rings/Makefile kepler-1.1.new/rings/Makefile
++--- kepler-1.1/rings/Makefile 2007-04-21 06:41:49.000000000 +1000
+++++ kepler-1.1.new/rings/Makefile 2007-05-16 22:05:28.765625000 +1000
++@@ -10,7 +10,7 @@
++ OBJS= src/rings.o
++
++ src/$(LIBNAME) : $(OBJS)
++- export MACOSX_DEPLOYMENT_TARGET="10.3"; $(CC) $(CFLAGS) $(LIB_OPTION) -o src/$(LIBNAME) $(OBJS)
+++ export MACOSX_DEPLOYMENT_TARGET="10.3"; $(CC) $(CFLAGS) $(LIB_OPTION) -o src/$(LIBNAME) $(OBJS) -L../lua-5.1.2/src -llua
++
++ install:
++ mkdir -p $(LUA_LIBDIR)
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/proc.c b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/proc.c
+new file mode 100644
+index 0000000..3c897c9
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/proc.c
+@@ -0,0 +1,1238 @@
++/*
++ * Copyright (c) 2007-2008, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <ctype.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++#include <time.h>
++#include <string.h>
++#include "axhttp.h"
++
++#define HTTP_VERSION "HTTP/1.1"
++
++static const char * index_file = "index.html";
++
++static int special_read(struct connstruct *cn, void *buf, size_t count);
++static int special_write(struct connstruct *cn,
++ const char *buf, size_t count);
++static void send_error(struct connstruct *cn, int err);
++static int hexit(char c);
++static void urldecode(char *buf);
++static void buildactualfile(struct connstruct *cn);
++static int sanitizefile(const char *buf);
++static int sanitizehost(char *buf);
++static int htaccess_check(struct connstruct *cn);
++static const char *getmimetype(const char *name);
++
++#if defined(CONFIG_HTTP_DIRECTORIES)
++static void urlencode(const uint8_t *s, char *t);
++static void procdirlisting(struct connstruct *cn);
++#endif
++#if defined(CONFIG_HTTP_HAS_CGI)
++static void proccgi(struct connstruct *cn);
++static void decode_path_info(struct connstruct *cn, char *path_info);
++static int init_read_post_data(char *buf, char *data, struct connstruct *cn, int old_rv);
++#endif
++#ifdef CONFIG_HTTP_HAS_AUTHORIZATION
++static int auth_check(struct connstruct *cn);
++#endif
++
++#if AXDEBUG
++#define AXDEBUGSTART \
++ { \
++ FILE *axdout; \
++ axdout = fopen("/var/log/axdebug", "a"); \
++
++#define AXDEBUGEND \
++ fclose(axdout); \
++ }
++#else /* AXDEBUG */
++#define AXDEBUGSTART
++#define AXDEBUGEND
++#endif /* AXDEBUG */
++
++/* Returns 1 if elems should continue being read, 0 otherwise */
++static int procheadelem(struct connstruct *cn, char *buf)
++{
++ char *delim, *value;
++
++ if ((delim = strchr(buf, ' ')) == NULL)
++ return 0;
++
++ *delim = 0;
++ value = delim+1;
++
++ if (strcmp(buf, "GET") == 0 || strcmp(buf, "HEAD") == 0 ||
++ strcmp(buf, "POST") == 0)
++ {
++ if (buf[0] == 'H')
++ cn->reqtype = TYPE_HEAD;
++ else if (buf[0] == 'P')
++ cn->reqtype = TYPE_POST;
++
++ if ((delim = strchr(value, ' ')) == NULL) /* expect HTTP type */
++ return 0;
++
++ *delim = 0;
++ urldecode(value);
++
++ if (sanitizefile(value) == 0)
++ {
++ send_error(cn, 403);
++ return 0;
++ }
++
++#if defined(CONFIG_HTTP_HAS_CGI)
++ decode_path_info(cn, value);
++#else
++ my_strncpy(cn->filereq, value, MAXREQUESTLENGTH);
++#endif
++ cn->if_modified_since = -1;
++ }
++ else if (strcmp(buf, "Host:") == 0)
++ {
++ if (sanitizehost(value) == 0)
++ {
++ removeconnection(cn);
++ return 0;
++ }
++
++ my_strncpy(cn->server_name, value, MAXREQUESTLENGTH);
++ }
++ else if (strcmp(buf, "Connection:") == 0 && strcmp(value, "close") == 0)
++ {
++ cn->close_when_done = 1;
++ }
++ else if (strcmp(buf, "If-Modified-Since:") == 0)
++ {
++ cn->if_modified_since = tdate_parse(value);
++ }
++ else if (strcmp(buf, "Expect:") == 0)
++ {
++ send_error(cn, 417); /* expectation failed */
++ return 0;
++ }
++#ifdef CONFIG_HTTP_HAS_AUTHORIZATION
++ else if (strcmp(buf, "Authorization:") == 0 &&
++ strncmp(value, "Basic ", 6) == 0)
++ {
++ int size;
++ if (base64_decode(&value[6], strlen(&value[6]),
++ (uint8_t *)cn->authorization, &size))
++ cn->authorization[0] = 0; /* error */
++ else
++ cn->authorization[size] = 0;
++ }
++#endif
++#if defined(CONFIG_HTTP_HAS_CGI)
++ else if (strcmp(buf, "Content-Length:") == 0)
++ {
++ sscanf(value, "%d", &cn->content_length);
++ }
++ else if (strcmp(buf, "Cookie:") == 0)
++ {
++ my_strncpy(cn->cookie, value, MAXREQUESTLENGTH);
++ }
++#endif
++
++ return 1;
++}
++
++#if defined(CONFIG_HTTP_DIRECTORIES)
++static void procdirlisting(struct connstruct *cn)
++{
++ char buf[MAXREQUESTLENGTH];
++ char actualfile[1024];
++
++ if (cn->reqtype == TYPE_HEAD)
++ {
++ snprintf(buf, sizeof(buf), HTTP_VERSION
++ " 200 OK\nContent-Type: text/html\n\n");
++ write(cn->networkdesc, buf, strlen(buf));
++ removeconnection(cn);
++ return;
++ }
++
++ strcpy(actualfile, cn->actualfile);
++
++#ifdef WIN32
++ strcat(actualfile, "*");
++ cn->dirp = FindFirstFile(actualfile, &cn->file_data);
++
++ if (cn->dirp == INVALID_HANDLE_VALUE)
++ {
++ send_error(cn, 404);
++ return;
++ }
++#else
++ if ((cn->dirp = opendir(actualfile)) == NULL)
++ {
++ send_error(cn, 404);
++ return;
++ }
++#endif
++
++ snprintf(buf, sizeof(buf), HTTP_VERSION
++ " 200 OK\nContent-Type: text/html\n\n"
++ "<html><body>\n<title>Directory Listing</title>\n"
++ "<h3>Directory listing of %s://%s%s</h3><br />\n",
++ cn->is_ssl ? "https" : "http", cn->server_name, cn->filereq);
++ special_write(cn, buf, strlen(buf));
++ cn->state = STATE_DOING_DIR;
++}
++
++void procdodir(struct connstruct *cn)
++{
++#ifndef WIN32
++ struct dirent *dp;
++#endif
++ char buf[MAXREQUESTLENGTH];
++ char encbuf[1024];
++ char *file;
++
++ do
++ {
++ buf[0] = 0;
++
++#ifdef WIN32
++ if (!FindNextFile(cn->dirp, &cn->file_data))
++#else
++ if ((dp = readdir(cn->dirp)) == NULL)
++#endif
++ {
++ snprintf(buf, sizeof(buf), "</body></html>\n");
++ special_write(cn, buf, strlen(buf));
++ removeconnection(cn);
++#ifndef WIN32
++ closedir(cn->dirp);
++#endif
++ return;
++ }
++
++#ifdef WIN32
++ file = cn->file_data.cFileName;
++#else
++ file = dp->d_name;
++#endif
++
++ /* if no index file, don't display the ".." directory */
++ if (cn->filereq[0] == '/' && cn->filereq[1] == '\0' &&
++ strcmp(file, "..") == 0)
++ continue;
++
++ /* don't display files beginning with "." */
++ if (file[0] == '.' && file[1] != '.')
++ continue;
++
++ /* make sure a '/' is at the end of a directory */
++ if (cn->filereq[strlen(cn->filereq)-1] != '/')
++ strcat(cn->filereq, "/");
++
++ /* see if the dir + file is another directory */
++ snprintf(buf, sizeof(buf), "%s%s", cn->actualfile, file);
++ if (isdir(buf))
++ strcat(file, "/");
++
++ urlencode((uint8_t *)file, encbuf);
++ snprintf(buf, sizeof(buf), "<a href=\"%s%s\">%s</a><br />\n",
++ cn->filereq, encbuf, file);
++ } while (special_write(cn, buf, strlen(buf)));
++}
++
++/* Encode funny chars -> %xx in newly allocated storage */
++/* (preserves '/' !) */
++static void urlencode(const uint8_t *s, char *t)
++{
++ const uint8_t *p = s;
++ char *tp = t;
++
++ for (; *p; p++)
++ {
++ if ((*p > 0x00 && *p < ',') ||
++ (*p > '9' && *p < 'A') ||
++ (*p > 'Z' && *p < '_') ||
++ (*p > '_' && *p < 'a') ||
++ (*p > 'z' && *p < 0xA1))
++ {
++ sprintf((char *)tp, "%%%02X", *p);
++ tp += 3;
++ }
++ else
++ {
++ *tp = *p;
++ tp++;
++ }
++ }
++
++ *tp='\0';
++}
++
++#endif
++
++void procreadhead(struct connstruct *cn)
++{
++ char buf[MAXREQUESTLENGTH*4], *tp, *next;
++ int rv;
++
++ memset(buf, 0, MAXREQUESTLENGTH*4);
++ rv = special_read(cn, buf, sizeof(buf)-1);
++ if (rv <= 0)
++ {
++ if (rv < 0) /* really dead? */
++ removeconnection(cn);
++ return;
++ }
++
++ buf[rv] = '\0';
++ next = tp = buf;
++
++#ifdef CONFIG_HTTP_HAS_AUTHORIZATION
++ cn->authorization[0] = 0;
++#endif
++
++ /* Split up lines and send to procheadelem() */
++ while (*next != '\0')
++ {
++ /* If we have a blank line, advance to next stage */
++ if (*next == '\r' || *next == '\n')
++ {
++#if defined(CONFIG_HTTP_HAS_CGI)
++ if (cn->reqtype == TYPE_POST && cn->content_length > 0)
++ {
++ if (init_read_post_data(buf,next,cn,rv) == 0)
++ return;
++ }
++#endif
++
++ buildactualfile(cn);
++ cn->state = STATE_WANT_TO_SEND_HEAD;
++ return;
++ }
++
++ while (*next != '\r' && *next != '\n' && *next != '\0')
++ next++;
++
++ if (*next == '\r')
++ {
++ *next = '\0';
++ next += 2;
++ }
++ else if (*next == '\n')
++ *next++ = '\0';
++
++ if (procheadelem(cn, tp) == 0)
++ return;
++
++ tp = next;
++ }
++}
++
++/* In this function we assume that the file has been checked for
++ * maliciousness (".."s, etc) and has been decoded
++ */
++void procsendhead(struct connstruct *cn)
++{
++ char buf[MAXREQUESTLENGTH];
++ struct stat stbuf;
++ time_t now = cn->timeout - CONFIG_HTTP_TIMEOUT;
++ char date[32];
++ int file_exists;
++
++ /* are we trying to access a file over the HTTP connection instead of a
++ * HTTPS connection? Or is this directory disabled? */
++ if (htaccess_check(cn))
++ {
++ send_error(cn, 403);
++ return;
++ }
++
++#ifdef CONFIG_HTTP_HAS_AUTHORIZATION
++ if (auth_check(cn)) /* see if there is a '.htpasswd' file */
++ {
++#ifdef CONFIG_HTTP_VERBOSE
++ printf("axhttpd: access to %s denied\n", cn->filereq); TTY_FLUSH();
++#endif
++ removeconnection(cn);
++ return;
++ }
++#endif
++
++ file_exists = stat(cn->actualfile, &stbuf);
++
++#if defined(CONFIG_HTTP_HAS_CGI)
++
++ if (file_exists != -1 && cn->is_cgi)
++ {
++ if ((stbuf.st_mode & S_IEXEC) == 0 || isdir(cn->actualfile))
++ {
++ /* A non-executable file, or directory? */
++ send_error(cn, 403);
++ }
++ else
++ proccgi(cn);
++
++ return;
++ }
++#endif
++
++ /* look for "index.html"? */
++ if (isdir(cn->actualfile))
++ {
++ char tbuf[MAXREQUESTLENGTH];
++ snprintf(tbuf, MAXREQUESTLENGTH, "%s%s", cn->actualfile, index_file);
++
++ if ((file_exists = stat(tbuf, &stbuf)) != -1)
++ my_strncpy(cn->actualfile, tbuf, MAXREQUESTLENGTH);
++ else
++ {
++#if defined(CONFIG_HTTP_DIRECTORIES)
++ /* If not, we do a directory listing of it */
++ procdirlisting(cn);
++#else
++ send_error(cn, 404);
++#endif
++ return;
++ }
++ }
++
++ if (file_exists == -1)
++ {
++ send_error(cn, 404);
++ return;
++ }
++
++ strcpy(date, ctime(&now));
++
++ /* has the file been read before? */
++ if (cn->if_modified_since != -1 && (cn->if_modified_since == 0 ||
++ cn->if_modified_since >= stbuf.st_mtime))
++ {
++ snprintf(buf, sizeof(buf), HTTP_VERSION" 304 Not Modified\nServer: "
++ "%s\nDate: %s\n", server_version, date);
++ special_write(cn, buf, strlen(buf));
++ cn->state = STATE_WANT_TO_READ_HEAD;
++ return;
++ }
++
++ if (cn->reqtype == TYPE_HEAD)
++ {
++ removeconnection(cn);
++ return;
++ }
++ else
++ {
++ int flags = O_RDONLY;
++#if defined(WIN32) || defined(CONFIG_PLATFORM_CYGWIN)
++ flags |= O_BINARY;
++#endif
++ cn->filedesc = open(cn->actualfile, flags);
++
++ if (cn->filedesc < 0)
++ {
++ send_error(cn, 404);
++ return;
++ }
++
++ snprintf(buf, sizeof(buf), HTTP_VERSION" 200 OK\nServer: %s\n"
++ "Content-Type: %s\nContent-Length: %ld\n"
++ "Date: %sLast-Modified: %s\n", server_version,
++ getmimetype(cn->actualfile), (long) stbuf.st_size,
++ date, ctime(&stbuf.st_mtime)); /* ctime() has a \n on the end */
++
++ special_write(cn, buf, strlen(buf));
++
++#ifdef CONFIG_HTTP_VERBOSE
++ printf("axhttpd: %s:/%s\n", cn->is_ssl ? "https" : "http", cn->filereq);
++ TTY_FLUSH();
++#endif
++
++#ifdef WIN32
++ for (;;)
++ {
++ procreadfile(cn);
++ if (cn->filedesc == -1)
++ break;
++
++ do
++ {
++ procsendfile(cn);
++ } while (cn->state != STATE_WANT_TO_READ_FILE);
++ }
++#else
++ cn->state = STATE_WANT_TO_READ_FILE;
++#endif
++ }
++}
++
++void procreadfile(struct connstruct *cn)
++{
++ int rv = read(cn->filedesc, cn->databuf, BLOCKSIZE);
++
++ if (rv <= 0)
++ {
++ close(cn->filedesc);
++ cn->filedesc = -1;
++
++ if (cn->close_when_done) /* close immediately */
++ removeconnection(cn);
++ else
++ { /* keep socket open - HTTP 1.1 */
++ cn->state = STATE_WANT_TO_READ_HEAD;
++ cn->numbytes = 0;
++ }
++
++ return;
++ }
++
++ cn->numbytes = rv;
++ cn->state = STATE_WANT_TO_SEND_FILE;
++}
++
++void procsendfile(struct connstruct *cn)
++{
++ int rv = special_write(cn, cn->databuf, cn->numbytes);
++
++ if (rv < 0)
++ removeconnection(cn);
++ else if (rv == cn->numbytes)
++ {
++ cn->state = STATE_WANT_TO_READ_FILE;
++ }
++ else if (rv == 0)
++ {
++ /* Do nothing */
++ }
++ else
++ {
++ memmove(cn->databuf, cn->databuf + rv, cn->numbytes - rv);
++ cn->numbytes -= rv;
++ }
++}
++
++#if defined(CONFIG_HTTP_HAS_CGI)
++/* Should this be a bit more dynamic? It would mean more calls to malloc etc */
++#define CGI_ARG_SIZE 17
++
++static void proccgi(struct connstruct *cn)
++{
++ int tpipe[2], spipe[2];
++ char *myargs[2];
++ char cgienv[CGI_ARG_SIZE][MAXREQUESTLENGTH];
++ char * cgiptr[CGI_ARG_SIZE+4];
++ const char *type = "HEAD";
++ int cgi_index = 0, i;
++ pid_t pid;
++#ifdef WIN32
++ int tmp_stdout;
++#endif
++
++ snprintf(cgienv[0], MAXREQUESTLENGTH,
++ HTTP_VERSION" 200 OK\nServer: %s\n%s",
++ server_version, (cn->reqtype == TYPE_HEAD) ? "\n" : "");
++ special_write(cn, cgienv[0], strlen(cgienv[0]));
++
++ if (cn->reqtype == TYPE_HEAD)
++ {
++ removeconnection(cn);
++ return;
++ }
++
++#ifdef CONFIG_HTTP_VERBOSE
++ printf("[CGI]: %s:/%s\n", cn->is_ssl ? "https" : "http", cn->filereq);
++ TTY_FLUSH();
++#endif
++
++ /* win32 cgi is a bit too painful */
++#ifndef WIN32
++ /* set up pipe that is used for sending POST query data to CGI script*/
++ if (cn->reqtype == TYPE_POST)
++ {
++ if (pipe(spipe) == -1)
++ {
++ printf("[CGI]: could not create pipe");
++ TTY_FLUSH();
++ return;
++ }
++ }
++
++ if (pipe(tpipe) == -1)
++ {
++ printf("[CGI]: could not create pipe");
++ TTY_FLUSH();
++ return;
++ }
++
++ /*
++ * use vfork() instead of fork() for performance
++ */
++ if ((pid = vfork()) > 0) /* parent */
++ {
++ /* Send POST query data to CGI script */
++ if ((cn->reqtype == TYPE_POST) && (cn->content_length > 0))
++ {
++ write(spipe[1], cn->post_data, cn->content_length);
++ close(spipe[0]);
++ close(spipe[1]);
++
++ /* free the memory that is allocated in read_post_data() */
++ free(cn->post_data);
++ cn->post_data = NULL;
++ }
++
++ /* Close the write descriptor */
++ close(tpipe[1]);
++ cn->filedesc = tpipe[0];
++ cn->state = STATE_WANT_TO_READ_FILE;
++ cn->close_when_done = 1;
++ return;
++ }
++
++ if (pid < 0) /* vfork failed */
++ exit(1);
++
++ /* The problem child... */
++
++ /* Our stdout/stderr goes to the socket */
++ dup2(tpipe[1], 1);
++ dup2(tpipe[1], 2);
++
++ /* If it was a POST request, send the socket data to our stdin */
++ if (cn->reqtype == TYPE_POST)
++ dup2(spipe[0], 0);
++ else /* Otherwise we can shutdown the read side of the sock */
++ shutdown(cn->networkdesc, 0);
++
++ myargs[0] = cn->actualfile;
++ myargs[1] = NULL;
++
++ /*
++ * set the cgi args. A url is defined by:
++ * http://$SERVER_NAME:$SERVER_PORT$SCRIPT_NAME$PATH_INFO?$QUERY_STRING
++ * TODO: other CGI parameters?
++ */
++ sprintf(cgienv[cgi_index++], "SERVER_SOFTWARE=%s", server_version);
++ strcpy(cgienv[cgi_index++], "DOCUMENT_ROOT=" CONFIG_HTTP_WEBROOT);
++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH,
++ "SERVER_NAME=%s", cn->server_name);
++ sprintf(cgienv[cgi_index++], "SERVER_PORT=%d",
++ cn->is_ssl ? CONFIG_HTTP_HTTPS_PORT : CONFIG_HTTP_PORT);
++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH,
++ "REQUEST_URI=%s", cn->uri_request);
++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH,
++ "SCRIPT_NAME=%s", cn->filereq);
++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH,
++ "PATH_INFO=%s", cn->uri_path_info);
++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH,
++ "QUERY_STRING=%s", cn->uri_query);
++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH,
++ "REMOTE_ADDR=%s", cn->remote_addr);
++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH,
++ "HTTP_COOKIE=%s", cn->cookie); /* note: small size */
++#if defined(CONFIG_HTTP_HAS_AUTHORIZATION)
++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH,
++ "REMOTE_USER=%s", cn->authorization);
++#endif
++
++ switch (cn->reqtype)
++ {
++ case TYPE_GET:
++ type = "GET";
++ break;
++
++ case TYPE_POST:
++ type = "POST";
++ sprintf(cgienv[cgi_index++],
++ "CONTENT_LENGTH=%d", cn->content_length);
++ strcpy(cgienv[cgi_index++], /* hard-code? */
++ "CONTENT_TYPE=application/x-www-form-urlencoded");
++ break;
++ }
++
++ sprintf(cgienv[cgi_index++], "REQUEST_METHOD=%s", type);
++
++ if (cn->is_ssl)
++ strcpy(cgienv[cgi_index++], "HTTPS=on");
++
++#ifdef CONFIG_PLATFORM_CYGWIN
++ /* TODO: find out why Lua needs this */
++ strcpy(cgienv[cgi_index++], "PATH=/usr/bin");
++#endif
++
++ if (cgi_index >= CGI_ARG_SIZE)
++ {
++ printf("Content-type: text/plain\n\nToo many CGI args (%d, %d)\n",
++ cgi_index, CGI_ARG_SIZE);
++ _exit(1);
++ }
++
++ /* copy across the pointer indexes */
++ for (i = 0; i < cgi_index; i++)
++ cgiptr[i] = cgienv[i];
++
++ cgiptr[i++] = "AUTH_TYPE=Basic";
++ cgiptr[i++] = "GATEWAY_INTERFACE=CGI/1.1";
++ cgiptr[i++] = "SERVER_PROTOCOL="HTTP_VERSION;
++ cgiptr[i] = NULL;
++
++ execve(myargs[0], myargs, cgiptr);
++ printf("Content-type: text/plain\n\nshouldn't get here\n");
++ _exit(1);
++#endif
++}
++
++static char * cgi_filetype_match(struct connstruct *cn, const char *fn)
++{
++ struct cgiextstruct *tp = cgiexts;
++
++ while (tp != NULL)
++ {
++ char *t;
++
++ if ((t = strstr(fn, tp->ext)) != NULL)
++ {
++ t += strlen(tp->ext);
++
++ if (*t == '/' || *t == '\0')
++ {
++#ifdef CONFIG_HTTP_ENABLE_LUA
++ if (strcmp(tp->ext, ".lua") == 0 || strcmp(tp->ext, ".lp") == 0)
++ cn->is_lua = 1;
++#endif
++
++ return t;
++ }
++ else
++ return NULL;
++
++ }
++
++ tp = tp->next;
++ }
++
++ return NULL;
++}
++
++static void decode_path_info(struct connstruct *cn, char *path_info)
++{
++ char *cgi_delim;
++
++ cn->is_cgi = 0;
++#ifdef CONFIG_HTTP_ENABLE_LUA
++ cn->is_lua = 0;
++#endif
++ *cn->uri_request = '\0';
++ *cn->uri_path_info = '\0';
++ *cn->uri_query = '\0';
++
++ my_strncpy(cn->uri_request, path_info, MAXREQUESTLENGTH);
++
++ /* query info? */
++ if ((cgi_delim = strchr(path_info, '?')))
++ {
++ *cgi_delim = '\0';
++ my_strncpy(cn->uri_query, cgi_delim+1, MAXREQUESTLENGTH);
++ }
++
++ if ((cgi_delim = cgi_filetype_match(cn, path_info)) != NULL)
++ {
++ cn->is_cgi = 1; /* definitely a CGI script */
++
++ /* path info? */
++ if (*cgi_delim != '\0')
++ {
++ my_strncpy(cn->uri_path_info, cgi_delim, MAXREQUESTLENGTH);
++ *cgi_delim = '\0';
++ }
++ }
++
++ /* the bit at the start must be the script name */
++ my_strncpy(cn->filereq, path_info, MAXREQUESTLENGTH);
++}
++
++static int init_read_post_data(char *buf, char *data,
++ struct connstruct *cn, int old_rv)
++{
++ char *next = data;
++ int rv = old_rv;
++ char *post_data;
++
++ /* Too much Post data to send. MAXPOSTDATASIZE should be
++ configured (now it can be chaged in the header file) */
++ if (cn->content_length > MAXPOSTDATASIZE)
++ {
++ send_error(cn, 418);
++ return 0;
++ }
++
++ /* remove CRLF */
++ while ((*next == '\r' || *next == '\n') && (next < &buf[rv]))
++ next++;
++
++ if (cn->post_data == NULL)
++ {
++ cn->post_data = (char *) calloc(1, (cn->content_length + 1));
++ /* Allocate buffer for the POST data that will be used by proccgi
++ to send POST data to the CGI script */
++
++ if (cn->post_data == NULL)
++ {
++ printf("axhttpd: could not allocate memory for POST data\n");
++ TTY_FLUSH();
++ send_error(cn, 599);
++ return 0;
++ }
++ }
++
++ cn->post_state = 0;
++ cn->post_read = 0;
++ post_data = cn->post_data;
++
++ while (next < &buf[rv])
++ {
++ /*copy POST data to buffer*/
++ *post_data = *next;
++ post_data++;
++ next++;
++ cn->post_read++;
++ if (cn->post_read == cn->content_length)
++ {
++ /* No more POST data to be copied */
++ *post_data = '\0';
++ return 1;
++ }
++ }
++
++ /* More POST data has to be read. read_post_data will continue with that */
++ cn->post_state = 1;
++ return 0;
++}
++
++void read_post_data(struct connstruct *cn)
++{
++ char buf[MAXREQUESTLENGTH*4], *next;
++ char *post_data;
++ int rv;
++
++ bzero(buf,MAXREQUESTLENGTH*4);
++ rv = special_read(cn, buf, sizeof(buf)-1);
++ if (rv <= 0)
++ {
++ if (rv < 0) /* really dead? */
++ removeconnection(cn);
++ return;
++ }
++
++ buf[rv] = '\0';
++ next = buf;
++
++ post_data = &cn->post_data[cn->post_read];
++
++ while (next < &buf[rv])
++ {
++ *post_data = *next;
++ post_data++;
++ next++;
++ cn->post_read++;
++ if (cn->post_read == cn->content_length)
++ {
++ /* No more POST data to be copied */
++ *post_data='\0';
++ cn->post_state = 0;
++ buildactualfile(cn);
++ cn->state = STATE_WANT_TO_SEND_HEAD;
++ return;
++ }
++ }
++
++ /* More POST data to read */
++}
++
++#endif /* CONFIG_HTTP_HAS_CGI */
++
++/* Decode string %xx -> char (in place) */
++static void urldecode(char *buf)
++{
++ int v;
++ char *p, *s, *w;
++
++ w = p = buf;
++
++ while (*p)
++ {
++ v = 0;
++
++ if (*p == '%')
++ {
++ s = p;
++ s++;
++
++ if (isxdigit((int) s[0]) && isxdigit((int) s[1]))
++ {
++ v = hexit(s[0])*16 + hexit(s[1]);
++
++ if (v)
++ {
++ /* do not decode %00 to null char */
++ *w = (char)v;
++ p = &s[1];
++ }
++ }
++
++ }
++
++ if (!v) *w=*p;
++ p++;
++ w++;
++ }
++
++ *w='\0';
++}
++
++static int hexit(char c)
++{
++ if (c >= '0' && c <= '9')
++ return c - '0';
++ else if (c >= 'a' && c <= 'f')
++ return c - 'a' + 10;
++ else if (c >= 'A' && c <= 'F')
++ return c - 'A' + 10;
++ else
++ return 0;
++}
++
++static void buildactualfile(struct connstruct *cn)
++{
++ char *cp;
++ snprintf(cn->actualfile, MAXREQUESTLENGTH, ".%s", cn->filereq);
++
++#ifndef WIN32
++ /* Add directory slash if not there */
++ if (isdir(cn->actualfile) &&
++ cn->actualfile[strlen(cn->actualfile)-1] != '/')
++ strcat(cn->actualfile, "/");
++
++ /* work out the directory name */
++ strncpy(cn->dirname, cn->actualfile, MAXREQUESTLENGTH);
++ if ((cp = strrchr(cn->dirname, '/')) == NULL)
++ cn->dirname[0] = 0;
++ else
++ *cp = 0;
++#else
++ {
++ char curr_dir[MAXREQUESTLENGTH];
++ char path[MAXREQUESTLENGTH];
++ char *t = cn->actualfile;
++
++ GetCurrentDirectory(MAXREQUESTLENGTH, curr_dir);
++
++ /* convert all the forward slashes to back slashes */
++ while ((t = strchr(t, '/')))
++ *t++ = '\\';
++
++ snprintf(path, MAXREQUESTLENGTH, "%s%s", curr_dir, cn->actualfile);
++ memcpy(cn->actualfile, path, MAXREQUESTLENGTH);
++
++ /* Add directory slash if not there */
++ if (isdir(cn->actualfile) &&
++ cn->actualfile[strlen(cn->actualfile)-1] != '\\')
++ strcat(cn->actualfile, "\\");
++
++ /* work out the directory name */
++ strncpy(cn->dirname, cn->actualfile, MAXREQUESTLENGTH);
++ if ((cp = strrchr(cn->dirname, '\\')) == NULL)
++ cn->dirname[0] = 0;
++ else
++ *cp = 0;
++ }
++#endif
++
++#if defined(CONFIG_HTTP_ENABLE_LUA)
++ /*
++ * Use the lua launcher if this file has a lua extension. Put this at the
++ * end as we need the directory name.
++ */
++ if (cn->is_lua)
++ sprintf(cn->actualfile, "%s%s", CONFIG_HTTP_LUA_PREFIX,
++ CONFIG_HTTP_LUA_CGI_LAUNCHER);
++#endif
++}
++
++static int sanitizefile(const char *buf)
++{
++ int len, i;
++
++ /* Don't accept anything not starting with a / */
++ if (*buf != '/')
++ return 0;
++
++ len = strlen(buf);
++ for (i = 0; i < len; i++)
++ {
++ /* Check for "/." i.e. don't send files starting with a . */
++ if (buf[i] == '/' && buf[i+1] == '.')
++ return 0;
++ }
++
++ return 1;
++}
++
++static int sanitizehost(char *buf)
++{
++ while (*buf != '\0')
++ {
++ /* Handle the port */
++ if (*buf == ':')
++ {
++ *buf = '\0';
++ return 1;
++ }
++
++ /* Enforce some basic URL rules... */
++ if ((isalnum(*buf) == 0 && *buf != '-' && *buf != '.') ||
++ (*buf == '.' && *(buf+1) == '.') ||
++ (*buf == '.' && *(buf+1) == '-') ||
++ (*buf == '-' && *(buf+1) == '.'))
++ return 0;
++
++ buf++;
++ }
++
++ return 1;
++}
++
++static FILE * exist_check(struct connstruct *cn, const char *check_file)
++{
++ char pathname[MAXREQUESTLENGTH];
++ snprintf(pathname, MAXREQUESTLENGTH, "%s/%s", cn->dirname, check_file);
++ return fopen(pathname, "r");
++}
++
++#ifdef CONFIG_HTTP_HAS_AUTHORIZATION
++static void send_authenticate(struct connstruct *cn, const char *realm)
++{
++ char buf[1024];
++
++ snprintf(buf, sizeof(buf), HTTP_VERSION" 401 Unauthorized\n"
++ "WWW-Authenticate: Basic\n"
++ "realm=\"%s\"\n", realm);
++ special_write(cn, buf, strlen(buf));
++}
++
++static int check_digest(char *salt, const char *msg_passwd)
++{
++ uint8_t b256_salt[MAXREQUESTLENGTH];
++ uint8_t real_passwd[MD5_SIZE];
++ int salt_size;
++ char *b64_passwd;
++ uint8_t md5_result[MD5_SIZE];
++ MD5_CTX ctx;
++
++ /* retrieve the salt */
++ if ((b64_passwd = strchr(salt, '$')) == NULL)
++ return -1;
++
++ *b64_passwd++ = 0;
++ if (base64_decode(salt, strlen(salt), b256_salt, &salt_size))
++ return -1;
++
++ if (base64_decode(b64_passwd, strlen(b64_passwd), real_passwd, NULL))
++ return -1;
++
++ /* very simple MD5 crypt algorithm, but then the salt we use is large */
++ MD5_Init(&ctx);
++ MD5_Update(&ctx, b256_salt, salt_size); /* process the salt */
++ MD5_Update(&ctx, (uint8_t *)msg_passwd, strlen(msg_passwd));
++ MD5_Final(md5_result, &ctx);
++ return memcmp(md5_result, real_passwd, MD5_SIZE);/* 0 = ok */
++}
++
++static int auth_check(struct connstruct *cn)
++{
++ char line[MAXREQUESTLENGTH];
++ FILE *fp;
++ char *cp;
++
++ if ((fp = exist_check(cn, ".htpasswd")) == NULL)
++ return 0; /* no .htpasswd file, so let though */
++
++ if (cn->authorization[0] == 0)
++ goto error;
++
++ /* cn->authorization is in form "username:password" */
++ if ((cp = strchr(cn->authorization, ':')) == NULL)
++ goto error;
++ else
++ *cp++ = 0; /* cp becomes the password */
++
++ while (fgets(line, sizeof(line), fp) != NULL)
++ {
++ char *b64_file_passwd;
++ int l = strlen(line);
++
++ /* nuke newline */
++ if (line[l-1] == '\n')
++ line[l-1] = 0;
++
++ /* line is form "username:salt(b64)$password(b64)" */
++ if ((b64_file_passwd = strchr(line, ':')) == NULL)
++ continue;
++
++ *b64_file_passwd++ = 0;
++
++ if (strcmp(line, cn->authorization)) /* our user? */
++ continue;
++
++ if (check_digest(b64_file_passwd, cp) == 0)
++ {
++ fclose(fp);
++ return 0;
++ }
++ }
++
++error:
++ fclose(fp);
++ send_authenticate(cn, cn->server_name);
++ return -1;
++}
++#endif
++
++static int htaccess_check(struct connstruct *cn)
++{
++ char line[MAXREQUESTLENGTH];
++ FILE *fp;
++ int ret = 0;
++
++ if ((fp = exist_check(cn, ".htaccess")) == NULL)
++ return 0; /* no .htaccess file, so let though */
++
++ while (fgets(line, sizeof(line), fp) != NULL)
++ {
++ if (strstr(line, "Deny all") || /* access to this dir denied */
++ /* Access will be denied unless SSL is active */
++ (!cn->is_ssl && strstr(line, "SSLRequireSSL")) ||
++ /* Access will be denied if SSL is active */
++ (cn->is_ssl && strstr(line, "SSLDenySSL")))
++ {
++ ret = -1;
++ break;
++ }
++ }
++
++ fclose(fp);
++ return ret;
++}
++
++static void send_error(struct connstruct *cn, int err)
++{
++ char buf[MAXREQUESTLENGTH];
++ char *title;
++ char *text;
++
++ switch (err)
++ {
++ case 403:
++ title = "Forbidden";
++ text = "File is protected";
++#ifdef CONFIG_HTTP_VERBOSE
++ printf("axhttpd: access to %s denied\n", cn->filereq); TTY_FLUSH();
++#endif
++ break;
++
++ case 404:
++ title = "Not Found";
++ text = title;
++ break;
++
++ case 418:
++ title = "POST data size is to large";
++ text = title;
++ break;
++
++ default:
++ title = "Unknown";
++ text = "Unknown";
++ break;
++ }
++
++ snprintf(buf, MAXREQUESTLENGTH, "HTTP/1.1 %d %s\n"
++ "Content-Type: text/html\n"
++ "Cache-Control: no-cache,no-store\n"
++ "Connection: close\n\n"
++ "<html>\n<head>\n<title>%d %s</title></head>\n"
++ "<body><h1>%d %s</h1>\n</body></html>\n",
++ err, title, err, title, err, text);
++ special_write(cn, buf, strlen(buf));
++ removeconnection(cn);
++}
++
++static const char *getmimetype(const char *name)
++{
++ /* only bother with a few mime types - let the browser figure the rest out */
++ if (strstr(name, ".htm"))
++ return "text/html";
++ else if (strstr(name, ".css"))
++ return "text/css";
++ else
++ return "application/octet-stream";
++}
++
++static int special_write(struct connstruct *cn,
++ const char *buf, size_t count)
++{
++ if (cn->is_ssl)
++ {
++ SSL *ssl = cn->ssl;
++ return ssl ? ssl_write(ssl, (uint8_t *)buf, count) : -1;
++ }
++ else
++ return SOCKET_WRITE(cn->networkdesc, buf, count);
++}
++
++static int special_read(struct connstruct *cn, void *buf, size_t count)
++{
++ int res;
++
++ if (cn->is_ssl)
++ {
++ uint8_t *read_buf;
++ if ((res = ssl_read(cn->ssl, &read_buf)) > SSL_OK)
++ {
++ memcpy(buf, read_buf, res > (int)count ? count : res);
++ }
++ }
++ else
++ res = SOCKET_READ(cn->networkdesc, buf, count);
++
++ return res;
++}
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/tdate_parse.c b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/tdate_parse.c
+new file mode 100644
+index 0000000..813bdc5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/tdate_parse.c
+@@ -0,0 +1,119 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include <sys/types.h>
++#include <ctype.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <time.h>
++#include "axhttp.h"
++
++struct day_mon_map
++{
++ const char* s;
++ uint8_t l;
++};
++
++static struct day_mon_map wday_tab[] =
++{
++ { "Sun", 0 }, { "Mon", 1 }, { "Tue", 2 }, { "Wed", 3 },
++ { "Thu", 4 }, { "Fri", 5 }, { "Sat", 6 },
++};
++
++static struct day_mon_map mon_tab[] =
++{
++ { "Jan", 0 }, { "Feb", 1 }, { "Mar", 2 }, { "Apr", 3 },
++ { "May", 4 }, { "Jun", 5 }, { "Jul", 6 }, { "Aug", 7 },
++ { "Sep", 8 }, { "Oct", 9 }, { "Nov", 10 }, { "Dec", 11 },
++};
++
++static int day_mon_map_compare(const char *v1, const char *v2)
++{
++ return strcmp(((struct day_mon_map*)v1)->s, ((struct day_mon_map*)v2)->s);
++}
++
++void tdate_init(void)
++{
++ qsort(wday_tab, sizeof(wday_tab)/sizeof(struct day_mon_map),
++ sizeof(struct day_mon_map),
++ (int (*)(const void *, const void *))day_mon_map_compare);
++ qsort(mon_tab, sizeof(mon_tab)/sizeof(struct day_mon_map),
++ sizeof(struct day_mon_map),
++ (int (*)(const void *, const void *))day_mon_map_compare);
++}
++
++static int8_t day_mon_map_search(const char* str,
++ const struct day_mon_map* tab, int n)
++{
++ struct day_mon_map *search = bsearch(&str, tab, n,
++ sizeof(struct day_mon_map),
++ (int (*)(const void *, const void *))day_mon_map_compare);
++ return search ? search->l : -1;
++}
++
++time_t tdate_parse(const char* str)
++{
++ struct tm tm;
++ char str_mon[4], str_wday[4];
++ int tm_sec, tm_min, tm_hour, tm_mday, tm_year;
++
++ /* Initialize. */
++ memset(&tm, 0, sizeof(struct tm));
++
++ /* wdy, DD mth YY HH:MM:SS GMT */
++ if ((sscanf(str, "%3[a-zA-Z], %d %3[a-zA-Z] %d %d:%d:%d GMT",
++ str_wday, &tm_mday, str_mon, &tm_year, &tm_hour, &tm_min,
++ &tm_sec) == 7) ||
++ /* wdy mth DD HH:MM:SS YY */
++ (sscanf(str, "%3[a-zA-Z] %3[a-zA-Z] %d %d:%d:%d %d",
++ str_wday, str_mon, &tm_mday, &tm_hour, &tm_min, &tm_sec,
++ &tm_year) == 7))
++ {
++ int8_t tm_wday = day_mon_map_search(str_wday, wday_tab,
++ sizeof(wday_tab)/sizeof(struct day_mon_map));
++ int8_t tm_mon = day_mon_map_search(str_mon, mon_tab,
++ sizeof(mon_tab)/sizeof(struct day_mon_map));
++
++ if (tm_wday < 0 || tm_mon < 0)
++ return -1;
++
++ tm.tm_wday = tm_wday;
++ tm.tm_mon = tm_mon;
++ tm.tm_mday = tm_mday;
++ tm.tm_hour = tm_hour;
++ tm.tm_min = tm_min;
++ tm.tm_sec = tm_sec;
++ tm.tm_year = tm_year - 1900;
++ return mktime(&tm);
++ }
++
++ return -1; /* error */
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Config.in b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Config.in
+new file mode 100644
+index 0000000..ecad25e
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Config.in
+@@ -0,0 +1,63 @@
++#
++# For a description of the syntax of this configuration file,
++# see scripts/config/Kconfig-language.txt
++#
++menu "Samples"
++
++config CONFIG_SAMPLES
++ bool "Create Samples"
++ default y
++ help
++ axTLS contains various sample code.
++
++ Select Y here if you want to build the various samples.
++
++config CONFIG_C_SAMPLES
++ bool "axssl - C version"
++ default y
++ depends on CONFIG_SAMPLES
++ help
++ Build the "C" version of axssl. The features enabled are very
++ dependent on the build mode ('full' mode will give all features).
++
++config CONFIG_CSHARP_SAMPLES
++ bool "axssl - C# version"
++ default y
++ depends on CONFIG_SAMPLES && CONFIG_CSHARP_BINDINGS
++ help
++ Build the "C#" version of axssl. The features enabled are very
++ dependent on the build mode ('full' mode will give all features).
++
++config CONFIG_VBNET_SAMPLES
++ bool "axssl - VB.NET version"
++ default y
++ depends on CONFIG_SAMPLES && CONFIG_VBNET_BINDINGS
++ help
++ Build the "VB.NET" version of axssl. The features enabled are very
++ dependent on the build mode ('full' mode will give all features).
++
++config CONFIG_JAVA_SAMPLES
++ bool "axssl - Java version"
++ default y
++ depends on CONFIG_SAMPLES && CONFIG_JAVA_BINDINGS
++ help
++ Build the "Java" version of axssl. The features enabled are very
++ dependent on the build mode ('full' mode will give all features).
++
++config CONFIG_PERL_SAMPLES
++ bool "axssl - Perl version"
++ default y
++ depends on CONFIG_SAMPLES && CONFIG_PERL_BINDINGS
++ help
++ Build the "Perl" version of axssl. The features enabled are very
++ dependent on the build mode ('full' mode will give all features).
++
++config CONFIG_LUA_SAMPLES
++ bool "axssl - Lua version"
++ default y
++ depends on CONFIG_SAMPLES && CONFIG_LUA_BINDINGS
++ help
++ Build the "Lua" version of axssl. The features enabled are very
++ dependent on the build mode ('full' mode will give all features).
++endmenu
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Makefile
+new file mode 100644
+index 0000000..afbdd43
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++all:
++
++include ../config/.config
++include ../config/makefile.conf
++
++all:
++ifdef CONFIG_C_SAMPLES
++ $(MAKE) -C c
++endif
++ifdef CONFIG_CSHARP_SAMPLES
++ $(MAKE) -C csharp
++endif
++ifdef CONFIG_VBNET_SAMPLES
++ $(MAKE) -C vbnet
++endif
++ifdef CONFIG_JAVA_SAMPLES
++ $(MAKE) -C java
++endif
++ifdef CONFIG_PERL_SAMPLES
++ $(MAKE) -C perl
++endif
++ifdef CONFIG_LUA_SAMPLES
++ $(MAKE) -C lua
++endif
++
++clean::
++ $(MAKE) -C c clean
++ $(MAKE) -C csharp clean
++ $(MAKE) -C vbnet clean
++ $(MAKE) -C java clean
++ $(MAKE) -C perl clean
++ $(MAKE) -C lua clean
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/Makefile
+new file mode 100644
+index 0000000..17cf9e7
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/Makefile
+@@ -0,0 +1,76 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++all : sample
++
++AXTLS_HOME=../..
++
++include $(AXTLS_HOME)/config/.config
++include $(AXTLS_HOME)/config/makefile.conf
++
++ifndef CONFIG_PLATFORM_WIN32
++
++ifdef CONFIG_PLATFORM_CYGWIN
++TARGET=$(AXTLS_HOME)/$(STAGE)/axssl.exe
++else
++TARGET=$(AXTLS_HOME)/$(STAGE)/axssl
++endif # cygwin
++
++LIBS=$(AXTLS_HOME)/$(STAGE)
++else
++TARGET=$(AXTLS_HOME)/$(STAGE)/axssl.exe
++endif
++
++ifndef CONFIG_C_SAMPLES
++sample:
++
++else
++sample : $(TARGET)
++OBJ= axssl.o
++include $(AXTLS_HOME)/config/makefile.post
++
++ifndef CONFIG_PLATFORM_WIN32
++
++$(TARGET): $(OBJ) $(LIBS)/libaxtls.a
++ $(LD) $(LDFLAGS) -o $@ $(OBJ) -L$(LIBS) -laxtls
++ifdef CONFIG_STRIP_UNWANTED_SECTIONS
++ $(STRIP) --remove-section=.comment $(TARGET)
++endif # use strip
++else # Win32
++
++$(TARGET): $(OBJ)
++ $(LD) $(LDFLAGS) $(AXTLS_HOME)/config/axtls.res /out:$@ $^ /libpath:"$(AXTLS_HOME)/$(STAGE)" axtls.lib
++endif
++
++endif # CONFIG_C_SAMPLES
++
++clean::
++ -@rm -f $(AXTLS_HOME)/$(STAGE)/axssl*
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/axssl.c b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/axssl.c
+new file mode 100644
+index 0000000..6892ee4
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/axssl.c
+@@ -0,0 +1,883 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * Demonstrate the use of the axTLS library in C with a set of
++ * command-line parameters similar to openssl. In fact, openssl clients
++ * should be able to communicate with axTLS servers and visa-versa.
++ *
++ * This code has various bits enabled depending on the configuration. To enable
++ * the most interesting version, compile with the 'full mode' enabled.
++ *
++ * To see what options you have, run the following:
++ * > axssl s_server -?
++ * > axssl s_client -?
++ *
++ * The axtls shared library must be in the same directory or be found
++ * by the OS.
++ */
++#include <string.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include "ssl.h"
++
++/* define standard input */
++#ifndef STDIN_FILENO
++#define STDIN_FILENO 0
++#endif
++
++static void do_server(int argc, char *argv[]);
++static void print_options(char *option);
++static void print_server_options(char *option);
++static void do_client(int argc, char *argv[]);
++static void print_client_options(char *option);
++static void display_cipher(SSL *ssl);
++static void display_session_id(SSL *ssl);
++
++/**
++ * Main entry point. Doesn't do much except works out whether we are a client
++ * or a server.
++ */
++int main(int argc, char *argv[])
++{
++#ifdef WIN32
++ WSADATA wsaData;
++ WORD wVersionRequested = MAKEWORD(2, 2);
++ WSAStartup(wVersionRequested, &wsaData);
++#elif !defined(CONFIG_PLATFORM_SOLARIS)
++ signal(SIGPIPE, SIG_IGN); /* ignore pipe errors */
++#endif
++
++ if (argc == 2 && strcmp(argv[1], "version") == 0)
++ {
++ printf("axssl %s %s\n", ssl_version(), __DATE__);
++ exit(0);
++ }
++
++ if (argc < 2 || (
++ strcmp(argv[1], "s_server") && strcmp(argv[1], "s_client")))
++ print_options(argc > 1 ? argv[1] : "");
++
++ strcmp(argv[1], "s_server") ?
++ do_client(argc, argv) : do_server(argc, argv);
++ return 0;
++}
++
++/**
++ * Implement the SSL server logic.
++ */
++static void do_server(int argc, char *argv[])
++{
++ int i = 2;
++ uint16_t port = 4433;
++ uint32_t options = SSL_DISPLAY_CERTS;
++ int client_fd;
++ SSL_CTX *ssl_ctx;
++ int server_fd, res = 0;
++ socklen_t client_len;
++#ifndef CONFIG_SSL_SKELETON_MODE
++ char *private_key_file = NULL;
++ const char *password = NULL;
++ char **cert;
++ int cert_index = 0;
++ int cert_size = ssl_get_config(SSL_MAX_CERT_CFG_OFFSET);
++#endif
++#ifdef WIN32
++ char yes = 1;
++#else
++ int yes = 1;
++#endif
++ struct sockaddr_in serv_addr;
++ struct sockaddr_in client_addr;
++ int quiet = 0;
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ int ca_cert_index = 0;
++ int ca_cert_size = ssl_get_config(SSL_MAX_CA_CERT_CFG_OFFSET);
++ char **ca_cert = (char **)calloc(1, sizeof(char *)*ca_cert_size);
++#endif
++ fd_set read_set;
++
++#ifndef CONFIG_SSL_SKELETON_MODE
++ cert = (char **)calloc(1, sizeof(char *)*cert_size);
++#endif
++
++ while (i < argc)
++ {
++ if (strcmp(argv[i], "-accept") == 0)
++ {
++ if (i >= argc-1)
++ {
++ print_server_options(argv[i]);
++ }
++
++ port = atoi(argv[++i]);
++ }
++#ifndef CONFIG_SSL_SKELETON_MODE
++ else if (strcmp(argv[i], "-cert") == 0)
++ {
++ if (i >= argc-1 || cert_index >= cert_size)
++ {
++ print_server_options(argv[i]);
++ }
++
++ cert[cert_index++] = argv[++i];
++ }
++ else if (strcmp(argv[i], "-key") == 0)
++ {
++ if (i >= argc-1)
++ {
++ print_server_options(argv[i]);
++ }
++
++ private_key_file = argv[++i];
++ options |= SSL_NO_DEFAULT_KEY;
++ }
++ else if (strcmp(argv[i], "-pass") == 0)
++ {
++ if (i >= argc-1)
++ {
++ print_server_options(argv[i]);
++ }
++
++ password = argv[++i];
++ }
++#endif
++ else if (strcmp(argv[i], "-quiet") == 0)
++ {
++ quiet = 1;
++ options &= ~SSL_DISPLAY_CERTS;
++ }
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ else if (strcmp(argv[i], "-verify") == 0)
++ {
++ options |= SSL_CLIENT_AUTHENTICATION;
++ }
++ else if (strcmp(argv[i], "-CAfile") == 0)
++ {
++ if (i >= argc-1 || ca_cert_index >= ca_cert_size)
++ {
++ print_server_options(argv[i]);
++ }
++
++ ca_cert[ca_cert_index++] = argv[++i];
++ }
++#endif
++#ifdef CONFIG_SSL_FULL_MODE
++ else if (strcmp(argv[i], "-debug") == 0)
++ {
++ options |= SSL_DISPLAY_BYTES;
++ }
++ else if (strcmp(argv[i], "-state") == 0)
++ {
++ options |= SSL_DISPLAY_STATES;
++ }
++ else if (strcmp(argv[i], "-show-rsa") == 0)
++ {
++ options |= SSL_DISPLAY_RSA;
++ }
++#endif
++ else /* don't know what this is */
++ {
++ print_server_options(argv[i]);
++ }
++
++ i++;
++ }
++
++ if ((ssl_ctx = ssl_ctx_new(options, SSL_DEFAULT_SVR_SESS)) == NULL)
++ {
++ fprintf(stderr, "Error: Server context is invalid\n");
++ exit(1);
++ }
++
++#ifndef CONFIG_SSL_SKELETON_MODE
++ if (private_key_file)
++ {
++ int obj_type = SSL_OBJ_RSA_KEY;
++
++ /* auto-detect the key type from the file extension */
++ if (strstr(private_key_file, ".p8"))
++ obj_type = SSL_OBJ_PKCS8;
++ else if (strstr(private_key_file, ".p12"))
++ obj_type = SSL_OBJ_PKCS12;
++
++ if (ssl_obj_load(ssl_ctx, obj_type, private_key_file, password))
++ {
++ fprintf(stderr, "Error: Private key '%s' is undefined.\n",
++ private_key_file);
++ exit(1);
++ }
++ }
++
++ for (i = 0; i < cert_index; i++)
++ {
++ if (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, cert[i], NULL))
++ {
++ printf("Certificate '%s' is undefined.\n", cert[i]);
++ exit(1);
++ }
++ }
++#endif
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ for (i = 0; i < ca_cert_index; i++)
++ {
++ if (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CACERT, ca_cert[i], NULL))
++ {
++ printf("Certificate '%s' is undefined.\n", ca_cert[i]);
++ exit(1);
++ }
++ }
++
++ free(ca_cert);
++#endif
++#ifndef CONFIG_SSL_SKELETON_MODE
++ free(cert);
++#endif
++
++ /* Create socket for incoming connections */
++ if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
++ {
++ perror("socket");
++ return;
++ }
++
++ setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
++
++ /* Construct local address structure */
++ memset(&serv_addr, 0, sizeof(serv_addr)); /* Zero out structure */
++ serv_addr.sin_family = AF_INET; /* Internet address family */
++ serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
++ serv_addr.sin_port = htons(port); /* Local port */
++
++ /* Bind to the local address */
++ if (bind(server_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
++ {
++ perror("bind");
++ exit(1);
++ }
++
++ if (listen(server_fd, 5) < 0)
++ {
++ perror("listen");
++ exit(1);
++ }
++
++ client_len = sizeof(client_addr);
++
++ /*************************************************************************
++ * This is where the interesting stuff happens. Up until now we've
++ * just been setting up sockets etc. Now we do the SSL handshake.
++ *************************************************************************/
++ for (;;)
++ {
++ SSL *ssl;
++ int reconnected = 0;
++
++ if (!quiet)
++ {
++ printf("ACCEPT\n");
++ TTY_FLUSH();
++ }
++
++ if ((client_fd = accept(server_fd,
++ (struct sockaddr *)&client_addr, &client_len)) < 0)
++ {
++ res = 1;
++ break;
++ }
++
++ ssl = ssl_server_new(ssl_ctx, client_fd);
++
++ /* now read (and display) whatever the client sends us */
++ for (;;)
++ {
++ /* allow parallel reading of client and standard input */
++ FD_ZERO(&read_set);
++ FD_SET(client_fd, &read_set);
++
++#ifndef WIN32
++ /* win32 doesn't like mixing up stdin and sockets */
++ if (isatty(STDIN_FILENO))/* but only if we are in an active shell */
++ {
++ FD_SET(STDIN_FILENO, &read_set);
++ }
++
++ if ((res = select(client_fd+1, &read_set, NULL, NULL, NULL)) > 0)
++ {
++ uint8_t buf[1024];
++
++ /* read standard input? */
++ if (FD_ISSET(STDIN_FILENO, &read_set))
++ {
++ if (fgets((char *)buf, sizeof(buf), stdin) == NULL)
++ {
++ res = SSL_ERROR_CONN_LOST;
++ }
++ else
++ {
++ /* small hack to check renegotiation */
++ if (buf[0] == 'r' && (buf[1] == '\n' || buf[1] == '\r'))
++ {
++ res = ssl_renegotiate(ssl);
++ }
++ else /* write our ramblings to the client */
++ {
++ res = ssl_write(ssl, buf, strlen((char *)buf)+1);
++ }
++ }
++ }
++ else /* a socket read */
++#endif
++ {
++ /* keep reading until we get something interesting */
++ uint8_t *read_buf;
++
++ if ((res = ssl_read(ssl, &read_buf)) == SSL_OK)
++ {
++ /* are we in the middle of doing a handshake? */
++ if (ssl_handshake_status(ssl) != SSL_OK)
++ {
++ reconnected = 0;
++ }
++ else if (!reconnected)
++ {
++ /* we are connected/reconnected */
++ if (!quiet)
++ {
++ display_session_id(ssl);
++ display_cipher(ssl);
++ }
++
++ reconnected = 1;
++ }
++ }
++
++ if (res > SSL_OK) /* display our interesting output */
++ {
++ printf("%s", read_buf);
++ TTY_FLUSH();
++ }
++ else if (res < SSL_OK && !quiet)
++ {
++ ssl_display_error(res);
++ }
++ }
++#ifndef WIN32
++ }
++#endif
++
++ if (res < SSL_OK)
++ {
++ if (!quiet)
++ {
++ printf("CONNECTION CLOSED\n");
++ TTY_FLUSH();
++ }
++
++ break;
++ }
++ }
++
++ /* client was disconnected or the handshake failed. */
++ ssl_free(ssl);
++ SOCKET_CLOSE(client_fd);
++ }
++
++ ssl_ctx_free(ssl_ctx);
++}
++
++/**
++ * Implement the SSL client logic.
++ */
++static void do_client(int argc, char *argv[])
++{
++#ifdef CONFIG_SSL_ENABLE_CLIENT
++ int res, i = 2;
++ uint16_t port = 4433;
++ uint32_t options = SSL_SERVER_VERIFY_LATER|SSL_DISPLAY_CERTS;
++ int client_fd;
++ char *private_key_file = NULL;
++ struct sockaddr_in client_addr;
++ struct hostent *hostent;
++ int reconnect = 0;
++ uint32_t sin_addr;
++ SSL_CTX *ssl_ctx;
++ SSL *ssl = NULL;
++ int quiet = 0;
++ int cert_index = 0, ca_cert_index = 0;
++ int cert_size, ca_cert_size;
++ char **ca_cert, **cert;
++ uint8_t session_id[SSL_SESSION_ID_SIZE];
++ fd_set read_set;
++ const char *password = NULL;
++
++ FD_ZERO(&read_set);
++ sin_addr = inet_addr("127.0.0.1");
++ cert_size = ssl_get_config(SSL_MAX_CERT_CFG_OFFSET);
++ ca_cert_size = ssl_get_config(SSL_MAX_CA_CERT_CFG_OFFSET);
++ ca_cert = (char **)calloc(1, sizeof(char *)*ca_cert_size);
++ cert = (char **)calloc(1, sizeof(char *)*cert_size);
++
++ while (i < argc)
++ {
++ if (strcmp(argv[i], "-connect") == 0)
++ {
++ char *host, *ptr;
++
++ if (i >= argc-1)
++ {
++ print_client_options(argv[i]);
++ }
++
++ host = argv[++i];
++ if ((ptr = strchr(host, ':')) == NULL)
++ {
++ print_client_options(argv[i]);
++ }
++
++ *ptr++ = 0;
++ port = atoi(ptr);
++ hostent = gethostbyname(host);
++
++ if (hostent == NULL)
++ {
++ print_client_options(argv[i]);
++ }
++
++ sin_addr = *((uint32_t **)hostent->h_addr_list)[0];
++ }
++ else if (strcmp(argv[i], "-cert") == 0)
++ {
++ if (i >= argc-1 || cert_index >= cert_size)
++ {
++ print_client_options(argv[i]);
++ }
++
++ cert[cert_index++] = argv[++i];
++ }
++ else if (strcmp(argv[i], "-key") == 0)
++ {
++ if (i >= argc-1)
++ {
++ print_client_options(argv[i]);
++ }
++
++ private_key_file = argv[++i];
++ options |= SSL_NO_DEFAULT_KEY;
++ }
++ else if (strcmp(argv[i], "-CAfile") == 0)
++ {
++ if (i >= argc-1 || ca_cert_index >= ca_cert_size)
++ {
++ print_client_options(argv[i]);
++ }
++
++ ca_cert[ca_cert_index++] = argv[++i];
++ }
++ else if (strcmp(argv[i], "-verify") == 0)
++ {
++ options &= ~SSL_SERVER_VERIFY_LATER;
++ }
++ else if (strcmp(argv[i], "-reconnect") == 0)
++ {
++ reconnect = 4;
++ }
++ else if (strcmp(argv[i], "-quiet") == 0)
++ {
++ quiet = 1;
++ options &= ~SSL_DISPLAY_CERTS;
++ }
++ else if (strcmp(argv[i], "-pass") == 0)
++ {
++ if (i >= argc-1)
++ {
++ print_client_options(argv[i]);
++ }
++
++ password = argv[++i];
++ }
++#ifdef CONFIG_SSL_FULL_MODE
++ else if (strcmp(argv[i], "-debug") == 0)
++ {
++ options |= SSL_DISPLAY_BYTES;
++ }
++ else if (strcmp(argv[i], "-state") == 0)
++ {
++ options |= SSL_DISPLAY_STATES;
++ }
++ else if (strcmp(argv[i], "-show-rsa") == 0)
++ {
++ options |= SSL_DISPLAY_RSA;
++ }
++#endif
++ else /* don't know what this is */
++ {
++ print_client_options(argv[i]);
++ }
++
++ i++;
++ }
++
++ if ((ssl_ctx = ssl_ctx_new(options, SSL_DEFAULT_CLNT_SESS)) == NULL)
++ {
++ fprintf(stderr, "Error: Client context is invalid\n");
++ exit(1);
++ }
++
++ if (private_key_file)
++ {
++ int obj_type = SSL_OBJ_RSA_KEY;
++
++ /* auto-detect the key type from the file extension */
++ if (strstr(private_key_file, ".p8"))
++ obj_type = SSL_OBJ_PKCS8;
++ else if (strstr(private_key_file, ".p12"))
++ obj_type = SSL_OBJ_PKCS12;
++
++ if (ssl_obj_load(ssl_ctx, obj_type, private_key_file, password))
++ {
++ fprintf(stderr, "Error: Private key '%s' is undefined.\n",
++ private_key_file);
++ exit(1);
++ }
++ }
++
++ for (i = 0; i < cert_index; i++)
++ {
++ if (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, cert[i], NULL))
++ {
++ printf("Certificate '%s' is undefined.\n", cert[i]);
++ exit(1);
++ }
++ }
++
++ for (i = 0; i < ca_cert_index; i++)
++ {
++ if (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CACERT, ca_cert[i], NULL))
++ {
++ printf("Certificate '%s' is undefined.\n", ca_cert[i]);
++ exit(1);
++ }
++ }
++
++ free(cert);
++ free(ca_cert);
++
++ /*************************************************************************
++ * This is where the interesting stuff happens. Up until now we've
++ * just been setting up sockets etc. Now we do the SSL handshake.
++ *************************************************************************/
++ client_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
++ memset(&client_addr, 0, sizeof(client_addr));
++ client_addr.sin_family = AF_INET;
++ client_addr.sin_port = htons(port);
++ client_addr.sin_addr.s_addr = sin_addr;
++
++ if (connect(client_fd, (struct sockaddr *)&client_addr,
++ sizeof(client_addr)) < 0)
++ {
++ perror("connect");
++ exit(1);
++ }
++
++ if (!quiet)
++ {
++ printf("CONNECTED\n");
++ TTY_FLUSH();
++ }
++
++ /* Try session resumption? */
++ if (reconnect)
++ {
++ while (reconnect--)
++ {
++ ssl = ssl_client_new(ssl_ctx, client_fd, session_id,
++ sizeof(session_id));
++ if ((res = ssl_handshake_status(ssl)) != SSL_OK)
++ {
++ if (!quiet)
++ {
++ ssl_display_error(res);
++ }
++
++ ssl_free(ssl);
++ exit(1);
++ }
++
++ display_session_id(ssl);
++ memcpy(session_id, ssl_get_session_id(ssl), SSL_SESSION_ID_SIZE);
++
++ if (reconnect)
++ {
++ ssl_free(ssl);
++ SOCKET_CLOSE(client_fd);
++
++ client_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
++ connect(client_fd, (struct sockaddr *)&client_addr,
++ sizeof(client_addr));
++ }
++ }
++ }
++ else
++ {
++ ssl = ssl_client_new(ssl_ctx, client_fd, NULL, 0);
++ }
++
++ /* check the return status */
++ if ((res = ssl_handshake_status(ssl)) != SSL_OK)
++ {
++ if (!quiet)
++ {
++ ssl_display_error(res);
++ }
++
++ exit(1);
++ }
++
++ if (!quiet)
++ {
++ const char *common_name = ssl_get_cert_dn(ssl,
++ SSL_X509_CERT_COMMON_NAME);
++ if (common_name)
++ {
++ printf("Common Name:\t\t\t%s\n", common_name);
++ }
++
++ display_session_id(ssl);
++ display_cipher(ssl);
++ }
++
++ for (;;)
++ {
++ uint8_t buf[1024];
++ res = SSL_OK;
++
++ /* allow parallel reading of server and standard input */
++ FD_SET(client_fd, &read_set);
++#ifndef WIN32
++ /* win32 doesn't like mixing up stdin and sockets */
++ FD_SET(STDIN_FILENO, &read_set);
++
++ if ((res = select(client_fd+1, &read_set, NULL, NULL, NULL)) > 0)
++ {
++ /* read standard input? */
++ if (FD_ISSET(STDIN_FILENO, &read_set))
++#endif
++ {
++ if (fgets((char *)buf, sizeof(buf), stdin) == NULL)
++ {
++ /* bomb out of here */
++ ssl_free(ssl);
++ break;
++ }
++ else
++ {
++ /* small hack to check renegotiation */
++ if (buf[0] == 'R' && (buf[1] == '\n' || buf[1] == '\r'))
++ {
++ res = ssl_renegotiate(ssl);
++ }
++ else
++ {
++ res = ssl_write(ssl, buf, strlen((char *)buf)+1);
++ }
++ }
++ }
++#ifndef WIN32
++ else /* a socket read */
++ {
++ uint8_t *read_buf;
++
++ res = ssl_read(ssl, &read_buf);
++
++ if (res > 0) /* display our interesting output */
++ {
++ printf("%s", read_buf);
++ TTY_FLUSH();
++ }
++ }
++ }
++#endif
++
++ if (res < 0)
++ {
++ if (!quiet)
++ {
++ ssl_display_error(res);
++ }
++
++ break; /* get outta here */
++ }
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ SOCKET_CLOSE(client_fd);
++#else
++ print_client_options(argv[1]);
++#endif
++}
++
++/**
++ * We've had some sort of command-line error. Print out the basic options.
++ */
++static void print_options(char *option)
++{
++ printf("axssl: Error: '%s' is an invalid command.\n", option);
++ printf("usage: axssl [s_server|s_client|version] [args ...]\n");
++ exit(1);
++}
++
++/**
++ * We've had some sort of command-line error. Print out the server options.
++ */
++static void print_server_options(char *option)
++{
++#ifndef CONFIG_SSL_SKELETON_MODE
++ int cert_size = ssl_get_config(SSL_MAX_CERT_CFG_OFFSET);
++#endif
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ int ca_cert_size = ssl_get_config(SSL_MAX_CA_CERT_CFG_OFFSET);
++#endif
++
++ printf("unknown option %s\n", option);
++ printf("usage: s_server [args ...]\n");
++ printf(" -accept arg\t- port to accept on (default is 4433)\n");
++#ifndef CONFIG_SSL_SKELETON_MODE
++ printf(" -cert arg\t- certificate file to add (in addition to default)"
++ " to chain -\n"
++ "\t\t Can repeat up to %d times\n", cert_size);
++ printf(" -key arg\t- Private key file to use\n");
++ printf(" -pass\t\t- private key file pass phrase source\n");
++#endif
++ printf(" -quiet\t\t- No server output\n");
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ printf(" -verify\t- turn on peer certificate verification\n");
++ printf(" -CAfile arg\t- Certificate authority\n");
++ printf("\t\t Can repeat up to %d times\n", ca_cert_size);
++#endif
++#ifdef CONFIG_SSL_FULL_MODE
++ printf(" -debug\t\t- Print more output\n");
++ printf(" -state\t\t- Show state messages\n");
++ printf(" -show-rsa\t- Show RSA state\n");
++#endif
++ exit(1);
++}
++
++/**
++ * We've had some sort of command-line error. Print out the client options.
++ */
++static void print_client_options(char *option)
++{
++#ifdef CONFIG_SSL_ENABLE_CLIENT
++ int cert_size = ssl_get_config(SSL_MAX_CERT_CFG_OFFSET);
++ int ca_cert_size = ssl_get_config(SSL_MAX_CA_CERT_CFG_OFFSET);
++#endif
++
++ printf("unknown option %s\n", option);
++#ifdef CONFIG_SSL_ENABLE_CLIENT
++ printf("usage: s_client [args ...]\n");
++ printf(" -connect host:port - who to connect to (default "
++ "is localhost:4433)\n");
++ printf(" -verify\t- turn on peer certificate verification\n");
++ printf(" -cert arg\t- certificate file to use\n");
++ printf("\t\t Can repeat up to %d times\n", cert_size);
++ printf(" -key arg\t- Private key file to use\n");
++ printf(" -CAfile arg\t- Certificate authority\n");
++ printf("\t\t Can repeat up to %d times\n", ca_cert_size);
++ printf(" -quiet\t\t- No client output\n");
++ printf(" -reconnect\t- Drop and re-make the connection "
++ "with the same Session-ID\n");
++ printf(" -pass\t\t- private key file pass phrase source\n");
++#ifdef CONFIG_SSL_FULL_MODE
++ printf(" -debug\t\t- Print more output\n");
++ printf(" -state\t\t- Show state messages\n");
++ printf(" -show-rsa\t- Show RSA state\n");
++#endif
++#else
++ printf("Change configuration to allow this feature\n");
++#endif
++ exit(1);
++}
++
++/**
++ * Display what cipher we are using
++ */
++static void display_cipher(SSL *ssl)
++{
++ printf("CIPHER is ");
++ switch (ssl_get_cipher_id(ssl))
++ {
++ case SSL_AES128_SHA:
++ printf("AES128-SHA");
++ break;
++
++ case SSL_AES256_SHA:
++ printf("AES256-SHA");
++ break;
++
++ case SSL_RC4_128_SHA:
++ printf("RC4-SHA");
++ break;
++
++ case SSL_RC4_128_MD5:
++ printf("RC4-MD5");
++ break;
++
++ default:
++ printf("Unknown - %d", ssl_get_cipher_id(ssl));
++ break;
++ }
++
++ printf("\n");
++ TTY_FLUSH();
++}
++
++/**
++ * Display what session id we have.
++ */
++static void display_session_id(SSL *ssl)
++{
++ int i;
++ const uint8_t *session_id = ssl_get_session_id(ssl);
++ int sess_id_size = ssl_get_session_id_size(ssl);
++
++ if (sess_id_size > 0)
++ {
++ printf("-----BEGIN SSL SESSION PARAMETERS-----\n");
++ for (i = 0; i < sess_id_size; i++)
++ {
++ printf("%02x", session_id[i]);
++ }
++
++ printf("\n-----END SSL SESSION PARAMETERS-----\n");
++ TTY_FLUSH();
++ }
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/Makefile
+new file mode 100644
+index 0000000..46c2421
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++include ../../config/.config
++include ../../config/makefile.conf
++include ../../config/makefile.dotnet.conf
++
++all : sample
++TARGET=../../$(STAGE)/axssl.csharp.exe
++sample : $(TARGET)
++
++$(TARGET): ../../bindings/csharp/axTLS.cs ../../bindings/csharp/axInterface.cs axssl.cs
++ifdef GO_DOT_NET
++ csc.exe /nologo /t:exe /out:"`cygpath -w $@`" $(foreach file, $^, "`cygpath -w $(file)`")
++else # use mono to build
++ mcs -out:$@ $^
++
++endif # ARCH
++
++clean::
++ -@rm -f $(TARGET)
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/axssl.cs b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/axssl.cs
+new file mode 100644
+index 0000000..dae2b8a
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/axssl.cs
+@@ -0,0 +1,758 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * Demonstrate the use of the axTLS library in C# with a set of
++ * command-line parameters similar to openssl. In fact, openssl clients
++ * should be able to communicate with axTLS servers and visa-versa.
++ *
++ * This code has various bits enabled depending on the configuration. To enable
++ * the most interesting version, compile with the 'full mode' enabled.
++ *
++ * To see what options you have, run the following:
++ * > axssl.csharp.exe s_server -?
++ * > axssl.csharp.exe s_client -?
++ *
++ * The axtls shared library must be in the same directory or be found
++ * by the OS.
++ */
++
++using System;
++using System.Net;
++using System.Net.Sockets;
++using axTLS;
++
++public class axssl
++{
++ /*
++ * Main()
++ */
++ public static void Main(string[] args)
++ {
++ if (args.Length == 1 && args[0] == "version")
++ {
++ Console.WriteLine("axssl.csharp " + SSLUtil.Version());
++ Environment.Exit(0);
++ }
++
++ axssl runner = new axssl();
++
++ if (args.Length < 1 || (args[0] != "s_server" && args[0] != "s_client"))
++ runner.print_options(args.Length > 0 ? args[0] : "");
++
++ int build_mode = SSLUtil.BuildMode();
++
++ if (args[0] == "s_server")
++ runner.do_server(build_mode, args);
++ else
++ runner.do_client(build_mode, args);
++ }
++
++ /*
++ * do_server()
++ */
++ private void do_server(int build_mode, string[] args)
++ {
++ int i = 1;
++ int port = 4433;
++ uint options = axtls.SSL_DISPLAY_CERTS;
++ bool quiet = false;
++ string password = null;
++ string private_key_file = null;
++
++ /* organise the cert/ca_cert lists */
++ int cert_size = SSLUtil.MaxCerts();
++ int ca_cert_size = SSLUtil.MaxCACerts();
++ string[] cert = new string[cert_size];
++ string[] ca_cert = new string[ca_cert_size];
++ int cert_index = 0;
++ int ca_cert_index = 0;
++
++ while (i < args.Length)
++ {
++ if (args[i] == "-accept")
++ {
++ if (i >= args.Length-1)
++ {
++ print_server_options(build_mode, args[i]);
++ }
++
++ port = Int32.Parse(args[++i]);
++ }
++ else if (args[i] == "-quiet")
++ {
++ quiet = true;
++ options &= ~(uint)axtls.SSL_DISPLAY_CERTS;
++ }
++ else if (build_mode >= axtls.SSL_BUILD_SERVER_ONLY)
++ {
++ if (args[i] == "-cert")
++ {
++ if (i >= args.Length-1 || cert_index >= cert_size)
++ {
++ print_server_options(build_mode, args[i]);
++ }
++
++ cert[cert_index++] = args[++i];
++ }
++ else if (args[i] == "-key")
++ {
++ if (i >= args.Length-1)
++ {
++ print_server_options(build_mode, args[i]);
++ }
++
++ private_key_file = args[++i];
++ options |= axtls.SSL_NO_DEFAULT_KEY;
++ }
++ else if (args[i] == "-pass")
++ {
++ if (i >= args.Length-1)
++ {
++ print_server_options(build_mode, args[i]);
++ }
++
++ password = args[++i];
++ }
++ else if (build_mode >= axtls.SSL_BUILD_ENABLE_VERIFICATION)
++ {
++ if (args[i] == "-verify")
++ {
++ options |= axtls.SSL_CLIENT_AUTHENTICATION;
++ }
++ else if (args[i] == "-CAfile")
++ {
++ if (i >= args.Length-1 || ca_cert_index >= ca_cert_size)
++ {
++ print_server_options(build_mode, args[i]);
++ }
++
++ ca_cert[ca_cert_index++] = args[++i];
++ }
++ else if (build_mode == axtls.SSL_BUILD_FULL_MODE)
++ {
++ if (args[i] == "-debug")
++ {
++ options |= axtls.SSL_DISPLAY_BYTES;
++ }
++ else if (args[i] == "-state")
++ {
++ options |= axtls.SSL_DISPLAY_STATES;
++ }
++ else if (args[i] == "-show-rsa")
++ {
++ options |= axtls.SSL_DISPLAY_RSA;
++ }
++ else
++ print_server_options(build_mode, args[i]);
++ }
++ else
++ print_server_options(build_mode, args[i]);
++ }
++ else
++ print_server_options(build_mode, args[i]);
++ }
++ else
++ print_server_options(build_mode, args[i]);
++
++ i++;
++ }
++
++ /* Create socket for incoming connections */
++ IPEndPoint ep = new IPEndPoint(IPAddress.Any, port);
++ TcpListener server_sock = new TcpListener(ep);
++ server_sock.Start();
++
++ /**********************************************************************
++ * This is where the interesting stuff happens. Up until now we've
++ * just been setting up sockets etc. Now we do the SSL handshake.
++ **********************************************************************/
++ SSLServer ssl_ctx = new SSLServer(
++ options, axtls.SSL_DEFAULT_SVR_SESS);
++
++ if (ssl_ctx == null)
++ {
++ Console.Error.WriteLine("Error: Server context is invalid");
++ Environment.Exit(1);
++ }
++
++ if (private_key_file != null)
++ {
++ int obj_type = axtls.SSL_OBJ_RSA_KEY;
++
++ if (private_key_file.EndsWith(".p8"))
++ obj_type = axtls.SSL_OBJ_PKCS8;
++ else if (private_key_file.EndsWith(".p12"))
++ obj_type = axtls.SSL_OBJ_PKCS12;
++
++ if (ssl_ctx.ObjLoad(obj_type,
++ private_key_file, password) != axtls.SSL_OK)
++ {
++ Console.Error.WriteLine("Private key '" + private_key_file +
++ "' is undefined.");
++ Environment.Exit(1);
++ }
++ }
++
++ for (i = 0; i < cert_index; i++)
++ {
++ if (ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CERT,
++ cert[i], null) != axtls.SSL_OK)
++ {
++ Console.WriteLine("Certificate '" + cert[i] +
++ "' is undefined.");
++ Environment.Exit(1);
++ }
++ }
++
++ for (i = 0; i < ca_cert_index; i++)
++ {
++ if (ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CACERT,
++ ca_cert[i], null) != axtls.SSL_OK)
++ {
++ Console.WriteLine("Certificate '" + cert[i] +
++ "' is undefined.");
++ Environment.Exit(1);
++ }
++ }
++
++ byte[] buf = null;
++ int res;
++
++ for (;;)
++ {
++ if (!quiet)
++ {
++ Console.WriteLine("ACCEPT");
++ }
++
++ Socket client_sock = server_sock.AcceptSocket();
++
++ SSL ssl = ssl_ctx.Connect(client_sock);
++
++ /* do the actual SSL handshake */
++ while ((res = ssl_ctx.Read(ssl, out buf)) == axtls.SSL_OK)
++ {
++ /* check when the connection has been established */
++ if (ssl.HandshakeStatus() == axtls.SSL_OK)
++ break;
++
++ /* could do something else here */
++ }
++
++ if (res == axtls.SSL_OK) /* connection established and ok */
++ {
++ if (!quiet)
++ {
++ display_session_id(ssl);
++ display_cipher(ssl);
++ }
++
++ /* now read (and display) whatever the client sends us */
++ for (;;)
++ {
++ /* keep reading until we get something interesting */
++ while ((res = ssl_ctx.Read(ssl, out buf)) == axtls.SSL_OK)
++ {
++ /* could do something else here */
++ }
++
++ if (res < axtls.SSL_OK)
++ {
++ if (!quiet)
++ {
++ Console.WriteLine("CONNECTION CLOSED");
++ }
++
++ break;
++ }
++
++ /* convert to string */
++ char[] str = new char[res];
++ for (i = 0; i < res; i++)
++ {
++ str[i] = (char)buf[i];
++ }
++
++ Console.Write(str);
++ }
++ }
++ else if (!quiet)
++ {
++ SSLUtil.DisplayError(res);
++ }
++
++ /* client was disconnected or the handshake failed. */
++ ssl.Dispose();
++ client_sock.Close();
++ }
++
++ /* ssl_ctx.Dispose(); */
++ }
++
++ /*
++ * do_client()
++ */
++ private void do_client(int build_mode, string[] args)
++ {
++ if (build_mode < axtls.SSL_BUILD_ENABLE_CLIENT)
++ {
++ print_client_options(build_mode, args[1]);
++ }
++
++ int i = 1, res;
++ int port = 4433;
++ bool quiet = false;
++ string password = null;
++ int reconnect = 0;
++ string private_key_file = null;
++ string hostname = "127.0.0.1";
++
++ /* organise the cert/ca_cert lists */
++ int cert_index = 0;
++ int ca_cert_index = 0;
++ int cert_size = SSLUtil.MaxCerts();
++ int ca_cert_size = SSLUtil.MaxCACerts();
++ string[] cert = new string[cert_size];
++ string[] ca_cert = new string[ca_cert_size];
++
++ uint options = axtls.SSL_SERVER_VERIFY_LATER|axtls.SSL_DISPLAY_CERTS;
++ byte[] session_id = null;
++
++ while (i < args.Length)
++ {
++ if (args[i] == "-connect")
++ {
++ string host_port;
++
++ if (i >= args.Length-1)
++ {
++ print_client_options(build_mode, args[i]);
++ }
++
++ host_port = args[++i];
++ int index_colon;
++
++ if ((index_colon = host_port.IndexOf(':')) < 0)
++ print_client_options(build_mode, args[i]);
++
++ hostname = new string(host_port.ToCharArray(),
++ 0, index_colon);
++ port = Int32.Parse(new String(host_port.ToCharArray(),
++ index_colon+1, host_port.Length-index_colon-1));
++ }
++ else if (args[i] == "-cert")
++ {
++ if (i >= args.Length-1 || cert_index >= cert_size)
++ {
++ print_client_options(build_mode, args[i]);
++ }
++
++ cert[cert_index++] = args[++i];
++ }
++ else if (args[i] == "-key")
++ {
++ if (i >= args.Length-1)
++ {
++ print_client_options(build_mode, args[i]);
++ }
++
++ private_key_file = args[++i];
++ options |= axtls.SSL_NO_DEFAULT_KEY;
++ }
++ else if (args[i] == "-CAfile")
++ {
++ if (i >= args.Length-1 || ca_cert_index >= ca_cert_size)
++ {
++ print_client_options(build_mode, args[i]);
++ }
++
++ ca_cert[ca_cert_index++] = args[++i];
++ }
++ else if (args[i] == "-verify")
++ {
++ options &= ~(uint)axtls.SSL_SERVER_VERIFY_LATER;
++ }
++ else if (args[i] == "-reconnect")
++ {
++ reconnect = 4;
++ }
++ else if (args[i] == "-quiet")
++ {
++ quiet = true;
++ options &= ~(uint)axtls.SSL_DISPLAY_CERTS;
++ }
++ else if (args[i] == "-pass")
++ {
++ if (i >= args.Length-1)
++ {
++ print_client_options(build_mode, args[i]);
++ }
++
++ password = args[++i];
++ }
++ else if (build_mode == axtls.SSL_BUILD_FULL_MODE)
++ {
++ if (args[i] == "-debug")
++ {
++ options |= axtls.SSL_DISPLAY_BYTES;
++ }
++ else if (args[i] == "-state")
++ {
++ options |= axtls.SSL_DISPLAY_STATES;
++ }
++ else if (args[i] == "-show-rsa")
++ {
++ options |= axtls.SSL_DISPLAY_RSA;
++ }
++ else
++ print_client_options(build_mode, args[i]);
++ }
++ else /* don't know what this is */
++ print_client_options(build_mode, args[i]);
++
++ i++;
++ }
++
++ // IPHostEntry hostInfo = Dns.Resolve(hostname);
++ IPHostEntry hostInfo = Dns.GetHostEntry(hostname);
++ IPAddress[] addresses = hostInfo.AddressList;
++ IPEndPoint ep = new IPEndPoint(addresses[0], port);
++ Socket client_sock = new Socket(AddressFamily.InterNetwork,
++ SocketType.Stream, ProtocolType.Tcp);
++ client_sock.Connect(ep);
++
++ if (!client_sock.Connected)
++ {
++ Console.WriteLine("could not connect");
++ Environment.Exit(1);
++ }
++
++ if (!quiet)
++ {
++ Console.WriteLine("CONNECTED");
++ }
++
++ /**********************************************************************
++ * This is where the interesting stuff happens. Up until now we've
++ * just been setting up sockets etc. Now we do the SSL handshake.
++ **********************************************************************/
++ SSLClient ssl_ctx = new SSLClient(options,
++ axtls.SSL_DEFAULT_CLNT_SESS);
++
++ if (ssl_ctx == null)
++ {
++ Console.Error.WriteLine("Error: Client context is invalid");
++ Environment.Exit(1);
++ }
++
++ if (private_key_file != null)
++ {
++ int obj_type = axtls.SSL_OBJ_RSA_KEY;
++
++ if (private_key_file.EndsWith(".p8"))
++ obj_type = axtls.SSL_OBJ_PKCS8;
++ else if (private_key_file.EndsWith(".p12"))
++ obj_type = axtls.SSL_OBJ_PKCS12;
++
++ if (ssl_ctx.ObjLoad(obj_type,
++ private_key_file, password) != axtls.SSL_OK)
++ {
++ Console.Error.WriteLine("Private key '" + private_key_file +
++ "' is undefined.");
++ Environment.Exit(1);
++ }
++ }
++
++ for (i = 0; i < cert_index; i++)
++ {
++ if (ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CERT,
++ cert[i], null) != axtls.SSL_OK)
++ {
++ Console.WriteLine("Certificate '" + cert[i] +
++ "' is undefined.");
++ Environment.Exit(1);
++ }
++ }
++
++ for (i = 0; i < ca_cert_index; i++)
++ {
++ if (ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CACERT,
++ ca_cert[i], null) != axtls.SSL_OK)
++ {
++ Console.WriteLine("Certificate '" + cert[i] +
++ "' is undefined.");
++ Environment.Exit(1);
++ }
++ }
++
++ SSL ssl = new SSL(new IntPtr(0)); /* keep compiler happy */
++
++ /* Try session resumption? */
++ if (reconnect > 0)
++ {
++ while (reconnect-- > 0)
++ {
++ ssl = ssl_ctx.Connect(client_sock, session_id);
++
++ if ((res = ssl.HandshakeStatus()) != axtls.SSL_OK)
++ {
++ if (!quiet)
++ {
++ SSLUtil.DisplayError(res);
++ }
++
++ ssl.Dispose();
++ Environment.Exit(1);
++ }
++
++ display_session_id(ssl);
++ session_id = ssl.GetSessionId();
++
++ if (reconnect > 0)
++ {
++ ssl.Dispose();
++ client_sock.Close();
++
++ /* and reconnect */
++ client_sock = new Socket(AddressFamily.InterNetwork,
++ SocketType.Stream, ProtocolType.Tcp);
++ client_sock.Connect(ep);
++ }
++ }
++ }
++ else
++ {
++ ssl = ssl_ctx.Connect(client_sock, null);
++ }
++
++ /* check the return status */
++ if ((res = ssl.HandshakeStatus()) != axtls.SSL_OK)
++ {
++ if (!quiet)
++ {
++ SSLUtil.DisplayError(res);
++ }
++
++ Environment.Exit(1);
++ }
++
++ if (!quiet)
++ {
++ string common_name =
++ ssl.GetCertificateDN(axtls.SSL_X509_CERT_COMMON_NAME);
++
++ if (common_name != null)
++ {
++ Console.WriteLine("Common Name:\t\t\t" + common_name);
++ }
++
++ display_session_id(ssl);
++ display_cipher(ssl);
++ }
++
++ for (;;)
++ {
++ string user_input = Console.ReadLine();
++
++ if (user_input == null)
++ break;
++
++ byte[] buf = new byte[user_input.Length+2];
++ buf[buf.Length-2] = (byte)'\n'; /* add the carriage return */
++ buf[buf.Length-1] = 0; /* null terminate */
++
++ for (i = 0; i < buf.Length-2; i++)
++ {
++ buf[i] = (byte)user_input[i];
++ }
++
++ if ((res = ssl_ctx.Write(ssl, buf, buf.Length)) < axtls.SSL_OK)
++ {
++ if (!quiet)
++ {
++ SSLUtil.DisplayError(res);
++ }
++
++ break;
++ }
++ }
++
++ ssl_ctx.Dispose();
++ }
++
++ /**
++ * We've had some sort of command-line error. Print out the basic options.
++ */
++ private void print_options(string option)
++ {
++ Console.WriteLine("axssl: Error: '" + option +
++ "' is an invalid command.");
++ Console.WriteLine("usage: axssl.csharp [s_server|" +
++ "s_client|version] [args ...]");
++ Environment.Exit(1);
++ }
++
++ /**
++ * We've had some sort of command-line error. Print out the server options.
++ */
++ private void print_server_options(int build_mode, string option)
++ {
++ int cert_size = SSLUtil.MaxCerts();
++ int ca_cert_size = SSLUtil.MaxCACerts();
++
++ Console.WriteLine("unknown option " + option);
++ Console.WriteLine("usage: s_server [args ...]");
++ Console.WriteLine(" -accept arg\t- port to accept on (default " +
++ "is 4433)");
++ Console.WriteLine(" -quiet\t\t- No server output");
++
++ if (build_mode >= axtls.SSL_BUILD_SERVER_ONLY)
++ {
++ Console.WriteLine(" -cert arg\t- certificate file to add (in " +
++ "addition to default) to chain -");
++ Console.WriteLine("\t\t Can repeat up to " + cert_size + " times");
++ Console.WriteLine(" -key arg\t- Private key file to use");
++ Console.WriteLine(" -pass\t\t- private key file pass phrase source");
++ }
++
++ if (build_mode >= axtls.SSL_BUILD_ENABLE_VERIFICATION)
++ {
++ Console.WriteLine(" -verify\t- turn on peer certificate " +
++ "verification");
++ Console.WriteLine(" -CAfile arg\t- Certificate authority.");
++ Console.WriteLine("\t\t Can repeat up to " +
++ ca_cert_size + "times");
++ }
++
++ if (build_mode == axtls.SSL_BUILD_FULL_MODE)
++ {
++ Console.WriteLine(" -debug\t\t- Print more output");
++ Console.WriteLine(" -state\t\t- Show state messages");
++ Console.WriteLine(" -show-rsa\t- Show RSA state");
++ }
++
++ Environment.Exit(1);
++ }
++
++ /**
++ * We've had some sort of command-line error. Print out the client options.
++ */
++ private void print_client_options(int build_mode, string option)
++ {
++ int cert_size = SSLUtil.MaxCerts();
++ int ca_cert_size = SSLUtil.MaxCACerts();
++
++ Console.WriteLine("unknown option " + option);
++
++ if (build_mode >= axtls.SSL_BUILD_ENABLE_CLIENT)
++ {
++ Console.WriteLine("usage: s_client [args ...]");
++ Console.WriteLine(" -connect host:port - who to connect to " +
++ "(default is localhost:4433)");
++ Console.WriteLine(" -verify\t- turn on peer certificate " +
++ "verification");
++ Console.WriteLine(" -cert arg\t- certificate file to use");
++ Console.WriteLine("\t\t Can repeat up to %d times", cert_size);
++ Console.WriteLine(" -key arg\t- Private key file to use");
++ Console.WriteLine(" -CAfile arg\t- Certificate authority.");
++ Console.WriteLine("\t\t Can repeat up to " + ca_cert_size +
++ " times");
++ Console.WriteLine(" -quiet\t\t- No client output");
++ Console.WriteLine(" -pass\t\t- private key file pass " +
++ "phrase source");
++ Console.WriteLine(" -reconnect\t- Drop and re-make the " +
++ "connection with the same Session-ID");
++
++ if (build_mode == axtls.SSL_BUILD_FULL_MODE)
++ {
++ Console.WriteLine(" -debug\t\t- Print more output");
++ Console.WriteLine(" -state\t\t- Show state messages");
++ Console.WriteLine(" -show-rsa\t- Show RSA state");
++ }
++ }
++ else
++ {
++ Console.WriteLine("Change configuration to allow this feature");
++ }
++
++ Environment.Exit(1);
++ }
++
++ /**
++ * Display what cipher we are using
++ */
++ private void display_cipher(SSL ssl)
++ {
++ Console.Write("CIPHER is ");
++
++ switch (ssl.GetCipherId())
++ {
++ case axtls.SSL_AES128_SHA:
++ Console.WriteLine("AES128-SHA");
++ break;
++
++ case axtls.SSL_AES256_SHA:
++ Console.WriteLine("AES256-SHA");
++ break;
++
++ case axtls.SSL_RC4_128_SHA:
++ Console.WriteLine("RC4-SHA");
++ break;
++
++ case axtls.SSL_RC4_128_MD5:
++ Console.WriteLine("RC4-MD5");
++ break;
++
++ default:
++ Console.WriteLine("Unknown - " + ssl.GetCipherId());
++ break;
++ }
++ }
++
++ /**
++ * Display what session id we have.
++ */
++ private void display_session_id(SSL ssl)
++ {
++ byte[] session_id = ssl.GetSessionId();
++
++ if (session_id.Length > 0)
++ {
++ Console.WriteLine("-----BEGIN SSL SESSION PARAMETERS-----");
++ foreach (byte b in session_id)
++ {
++ Console.Write("{0:x02}", b);
++ }
++
++ Console.WriteLine("\n-----END SSL SESSION PARAMETERS-----");
++ }
++ }
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/Makefile
+new file mode 100644
+index 0000000..b10a79f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++include ../../config/.config
++include ../../config/makefile.conf
++include ../../config/makefile.java.conf
++
++all : sample
++JAR=../../$(STAGE)/axtls.jar
++CLASSES=../../bindings/java/classes
++sample : $(JAR)
++
++$(JAR) : $(CLASSES)/axssl.class $(wildcard $(CLASSES)/axTLSj/*.class)
++ jar mcvf manifest.mf $@ -C $(CLASSES) axTLSj -C $(CLASSES) axssl.class
++
++JAVA_FILES=axssl.java
++JAVA_CLASSES:=$(JAVA_FILES:%.java=$(CLASSES)/axTLSj/%.class)
++
++$(CLASSES)/%.class : %.java
++ javac -d $(CLASSES) -classpath $(CLASSES) $^
++
++clean::
++ -@rm -f $(TARGET)
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/axssl.java b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/axssl.java
+new file mode 100644
+index 0000000..2057f29
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/axssl.java
+@@ -0,0 +1,760 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * Demonstrate the use of the axTLS library in Java with a set of
++ * command-line parameters similar to openssl. In fact, openssl clients
++ * should be able to communicate with axTLS servers and visa-versa. *
++ * This code has various bits enabled depending on the configuration. To enable
++ * the most interesting version, compile with the 'full mode' enabled.
++ *
++ * To see what options you have, run the following:
++ * > java -jar axtls.jar s_server -?
++ * > java -jar axtls.jar s_client -?
++ *
++ * The axtls/axtlsj shared libraries must be in the same directory or be found
++ * by the OS.
++ */
++
++import java.io.*;
++import java.util.*;
++import java.net.*;
++import axTLSj.*;
++
++public class axssl
++{
++ /*
++ * Main()
++ */
++ public static void main(String[] args)
++ {
++ if (args.length == 1 && args[0].equals("version"))
++ {
++ System.out.println("axtls.jar " + SSLUtil.version());
++ System.exit(0);
++ }
++
++ axssl runner = new axssl();
++
++ try
++ {
++ if (args.length < 1 ||
++ (!args[0].equals("s_server") &&
++ !args[0].equals("s_client")))
++ {
++ runner.print_options(args.length > 0 ? args[0] : "");
++ }
++
++ int build_mode = SSLUtil.buildMode();
++
++ if (args[0].equals("s_server"))
++ runner.do_server(build_mode, args);
++ else
++ runner.do_client(build_mode, args);
++ }
++ catch (Exception e)
++ {
++ System.out.println(e);
++ }
++ }
++
++ /*
++ * do_server()
++ */
++ private void do_server(int build_mode, String[] args)
++ throws Exception
++ {
++ int i = 1;
++ int port = 4433;
++ int options = axtlsj.SSL_DISPLAY_CERTS;
++ boolean quiet = false;
++ String password = null;
++ String private_key_file = null;
++
++ /* organise the cert/ca_cert lists */
++ int cert_size = SSLUtil.maxCerts();
++ int ca_cert_size = SSLUtil.maxCACerts();
++ String[] cert = new String[cert_size];
++ String[] ca_cert = new String[ca_cert_size];
++ int cert_index = 0;
++ int ca_cert_index = 0;
++
++ while (i < args.length)
++ {
++ if (args[i].equals("-accept"))
++ {
++ if (i >= args.length-1)
++ {
++ print_server_options(build_mode, args[i]);
++ }
++
++ port = Integer.parseInt(args[++i]);
++ }
++ else if (args[i].equals("-quiet"))
++ {
++ quiet = true;
++ options &= ~(int)axtlsj.SSL_DISPLAY_CERTS;
++ }
++ else if (build_mode >= axtlsj.SSL_BUILD_SERVER_ONLY)
++ {
++ if (args[i].equals("-cert"))
++ {
++ if (i >= args.length-1 || cert_index >= cert_size)
++ {
++ print_server_options(build_mode, args[i]);
++ }
++
++ cert[cert_index++] = args[++i];
++ }
++ else if (args[i].equals("-key"))
++ {
++ if (i >= args.length-1)
++ {
++ print_server_options(build_mode, args[i]);
++ }
++
++ private_key_file = args[++i];
++ options |= axtlsj.SSL_NO_DEFAULT_KEY;
++ }
++ else if (args[i].equals("-pass"))
++ {
++ if (i >= args.length-1)
++ {
++ print_server_options(build_mode, args[i]);
++ }
++
++ password = args[++i];
++ }
++ else if (build_mode >= axtlsj.SSL_BUILD_ENABLE_VERIFICATION)
++ {
++ if (args[i].equals("-verify"))
++ {
++ options |= axtlsj.SSL_CLIENT_AUTHENTICATION;
++ }
++ else if (args[i].equals("-CAfile"))
++ {
++ if (i >= args.length-1 || ca_cert_index >= ca_cert_size)
++ {
++ print_server_options(build_mode, args[i]);
++ }
++
++ ca_cert[ca_cert_index++] = args[++i];
++ }
++ else if (build_mode == axtlsj.SSL_BUILD_FULL_MODE)
++ {
++ if (args[i].equals("-debug"))
++ {
++ options |= axtlsj.SSL_DISPLAY_BYTES;
++ }
++ else if (args[i].equals("-state"))
++ {
++ options |= axtlsj.SSL_DISPLAY_STATES;
++ }
++ else if (args[i].equals("-show-rsa"))
++ {
++ options |= axtlsj.SSL_DISPLAY_RSA;
++ }
++ else
++ print_server_options(build_mode, args[i]);
++ }
++ else
++ print_server_options(build_mode, args[i]);
++ }
++ else
++ print_server_options(build_mode, args[i]);
++ }
++ else
++ print_server_options(build_mode, args[i]);
++
++ i++;
++ }
++
++ /* Create socket for incoming connections */
++ ServerSocket server_sock = new ServerSocket(port);
++
++ /**********************************************************************
++ * This is where the interesting stuff happens. Up until now we've
++ * just been setting up sockets etc. Now we do the SSL handshake.
++ **********************************************************************/
++ SSLServer ssl_ctx = new SSLServer(options,
++ axtlsj.SSL_DEFAULT_SVR_SESS);
++
++ if (ssl_ctx == null)
++ throw new Exception("Error: Server context is invalid");
++
++ if (private_key_file != null)
++ {
++ int obj_type = axtlsj.SSL_OBJ_RSA_KEY;
++
++ if (private_key_file.endsWith(".p8"))
++ obj_type = axtlsj.SSL_OBJ_PKCS8;
++ else if (private_key_file.endsWith(".p12"))
++ obj_type = axtlsj.SSL_OBJ_PKCS12;
++
++ if (ssl_ctx.objLoad(obj_type,
++ private_key_file, password) != axtlsj.SSL_OK)
++ {
++ throw new Exception("Error: Private key '" + private_key_file +
++ "' is undefined.");
++ }
++ }
++
++ for (i = 0; i < cert_index; i++)
++ {
++ if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CERT,
++ cert[i], null) != axtlsj.SSL_OK)
++ {
++ throw new Exception("Certificate '" + cert[i] +
++ "' is undefined.");
++ }
++ }
++
++ for (i = 0; i < ca_cert_index; i++)
++ {
++ if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CACERT,
++ ca_cert[i], null) != axtlsj.SSL_OK)
++ {
++ throw new Exception("Certificate '" + ca_cert[i] +
++ "' is undefined.");
++ }
++ }
++
++ int res;
++ SSLReadHolder rh = new SSLReadHolder();
++
++ for (;;)
++ {
++ if (!quiet)
++ {
++ System.out.println("ACCEPT");
++ }
++
++ Socket client_sock = server_sock.accept();
++
++ SSL ssl = ssl_ctx.connect(client_sock);
++
++ while ((res = ssl_ctx.read(ssl, rh)) == axtlsj.SSL_OK)
++ {
++ /* check when the connection has been established */
++ if (ssl.handshakeStatus() == axtlsj.SSL_OK)
++ break;
++
++ /* could do something else here */
++ }
++
++ if (res == axtlsj.SSL_OK) /* connection established and ok */
++ {
++ if (!quiet)
++ {
++ display_session_id(ssl);
++ display_cipher(ssl);
++ }
++
++ /* now read (and display) whatever the client sends us */
++ for (;;)
++ {
++ /* keep reading until we get something interesting */
++ while ((res = ssl_ctx.read(ssl, rh)) == axtlsj.SSL_OK)
++ {
++ /* could do something else here */
++ }
++
++ if (res < axtlsj.SSL_OK)
++ {
++ if (!quiet)
++ {
++ System.out.println("CONNECTION CLOSED");
++ }
++
++ break;
++ }
++
++ /* convert to String */
++ byte[] buf = rh.getData();
++ char[] str = new char[res];
++
++ for (i = 0; i < res; i++)
++ {
++ str[i] = (char)buf[i];
++ }
++
++ System.out.print(str);
++ }
++ }
++ else if (!quiet)
++ {
++ SSLUtil.displayError(res);
++ }
++
++ /* client was disconnected or the handshake failed. */
++ ssl.dispose();
++ client_sock.close();
++ }
++
++ /* ssl_ctx.dispose(); */
++ }
++
++ /*
++ * do_client()
++ */
++ private void do_client(int build_mode, String[] args)
++ throws Exception
++ {
++ if (build_mode < axtlsj.SSL_BUILD_ENABLE_CLIENT)
++ print_client_options(build_mode, args[1]);
++
++ int i = 1, res;
++ int port = 4433;
++ boolean quiet = false;
++ String password = null;
++ int reconnect = 0;
++ String private_key_file = null;
++ String hostname = "127.0.0.1";
++
++ /* organise the cert/ca_cert lists */
++ int cert_index = 0;
++ int ca_cert_index = 0;
++ int cert_size = SSLUtil.maxCerts();
++ int ca_cert_size = SSLUtil.maxCACerts();
++ String[] cert = new String[cert_size];
++ String[] ca_cert = new String[ca_cert_size];
++
++ int options = axtlsj.SSL_SERVER_VERIFY_LATER|axtlsj.SSL_DISPLAY_CERTS;
++ byte[] session_id = null;
++
++ while (i < args.length)
++ {
++ if (args[i].equals("-connect"))
++ {
++ String host_port;
++
++ if (i >= args.length-1)
++ {
++ print_client_options(build_mode, args[i]);
++ }
++
++ host_port = args[++i];
++ int index_colon;
++
++ if ((index_colon = host_port.indexOf(':')) < 0)
++ print_client_options(build_mode, args[i]);
++
++ hostname = new String(host_port.toCharArray(),
++ 0, index_colon);
++ port = Integer.parseInt(new String(host_port.toCharArray(),
++ index_colon+1, host_port.length()-index_colon-1));
++ }
++ else if (args[i].equals("-cert"))
++ {
++ if (i >= args.length-1 || cert_index >= cert_size)
++ {
++ print_client_options(build_mode, args[i]);
++ }
++
++ cert[cert_index++] = args[++i];
++ }
++ else if (args[i].equals("-CAfile"))
++ {
++ if (i >= args.length-1 || ca_cert_index >= ca_cert_size)
++ {
++ print_client_options(build_mode, args[i]);
++ }
++
++ ca_cert[ca_cert_index++] = args[++i];
++ }
++ else if (args[i].equals("-key"))
++ {
++ if (i >= args.length-1)
++ {
++ print_client_options(build_mode, args[i]);
++ }
++
++ private_key_file = args[++i];
++ options |= axtlsj.SSL_NO_DEFAULT_KEY;
++ }
++ else if (args[i].equals("-verify"))
++ {
++ options &= ~(int)axtlsj.SSL_SERVER_VERIFY_LATER;
++ }
++ else if (args[i].equals("-reconnect"))
++ {
++ reconnect = 4;
++ }
++ else if (args[i].equals("-quiet"))
++ {
++ quiet = true;
++ options &= ~(int)axtlsj.SSL_DISPLAY_CERTS;
++ }
++ else if (args[i].equals("-pass"))
++ {
++ if (i >= args.length-1)
++ {
++ print_server_options(build_mode, args[i]);
++ }
++
++ password = args[++i];
++ }
++ else if (build_mode == axtlsj.SSL_BUILD_FULL_MODE)
++ {
++ if (args[i].equals("-debug"))
++ {
++ options |= axtlsj.SSL_DISPLAY_BYTES;
++ }
++ else if (args[i].equals("-state"))
++ {
++ options |= axtlsj.SSL_DISPLAY_STATES;
++ }
++ else if (args[i].equals("-show-rsa"))
++ {
++ options |= axtlsj.SSL_DISPLAY_RSA;
++ }
++ else
++ print_client_options(build_mode, args[i]);
++ }
++ else /* don't know what this is */
++ print_client_options(build_mode, args[i]);
++
++ i++;
++ }
++
++ Socket client_sock = new Socket(hostname, port);
++
++ if (!client_sock.isConnected())
++ {
++ System.out.println("could not connect");
++ throw new Exception();
++ }
++
++ if (!quiet)
++ {
++ System.out.println("CONNECTED");
++ }
++
++ /**********************************************************************
++ * This is where the interesting stuff happens. Up until now we've
++ * just been setting up sockets etc. Now we do the SSL handshake.
++ **********************************************************************/
++ SSLClient ssl_ctx = new SSLClient(options,
++ axtlsj.SSL_DEFAULT_CLNT_SESS);
++
++ if (ssl_ctx == null)
++ {
++ throw new Exception("Error: Client context is invalid");
++ }
++
++ if (private_key_file != null)
++ {
++ int obj_type = axtlsj.SSL_OBJ_RSA_KEY;
++
++ if (private_key_file.endsWith(".p8"))
++ obj_type = axtlsj.SSL_OBJ_PKCS8;
++ else if (private_key_file.endsWith(".p12"))
++ obj_type = axtlsj.SSL_OBJ_PKCS12;
++
++ if (ssl_ctx.objLoad(obj_type,
++ private_key_file, password) != axtlsj.SSL_OK)
++ {
++ throw new Exception("Error: Private key '" + private_key_file +
++ "' is undefined.");
++ }
++ }
++
++ for (i = 0; i < cert_index; i++)
++ {
++ if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CERT,
++ cert[i], null) != axtlsj.SSL_OK)
++ {
++ throw new Exception("Certificate '" + cert[i] +
++ "' is undefined.");
++ }
++ }
++
++ for (i = 0; i < ca_cert_index; i++)
++ {
++ if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CACERT,
++ ca_cert[i], null) != axtlsj.SSL_OK)
++ {
++ throw new Exception("Certificate '" + ca_cert[i] +
++ "' is undefined.");
++ }
++ }
++
++ SSL ssl = null;
++
++ /* Try session resumption? */
++ if (reconnect > 0)
++ {
++ while (reconnect-- > 0)
++ {
++ ssl = ssl_ctx.connect(client_sock, session_id);
++
++ if ((res = ssl.handshakeStatus()) != axtlsj.SSL_OK)
++ {
++ if (!quiet)
++ {
++ SSLUtil.displayError(res);
++ }
++
++ ssl.dispose();
++ throw new Exception();
++ }
++
++ display_session_id(ssl);
++ session_id = ssl.getSessionId();
++
++ if (reconnect > 0)
++ {
++ ssl.dispose();
++ client_sock.close();
++
++ /* and reconnect */
++ client_sock = new Socket(hostname, port);
++ }
++ }
++ }
++ else
++ {
++ ssl = ssl_ctx.connect(client_sock, null);
++ }
++
++ /* check the return status */
++ if ((res = ssl.handshakeStatus()) != axtlsj.SSL_OK)
++ {
++ if (!quiet)
++ {
++ SSLUtil.displayError(res);
++ }
++
++ throw new Exception();
++ }
++
++ if (!quiet)
++ {
++ String common_name =
++ ssl.getCertificateDN(axtlsj.SSL_X509_CERT_COMMON_NAME);
++
++ if (common_name != null)
++ {
++ System.out.println("Common Name:\t\t\t" + common_name);
++ }
++
++ display_session_id(ssl);
++ display_cipher(ssl);
++ }
++
++ BufferedReader in = new BufferedReader(
++ new InputStreamReader(System.in));
++
++ for (;;)
++ {
++ String user_input = in.readLine();
++
++ if (user_input == null)
++ break;
++
++ byte[] buf = new byte[user_input.length()+2];
++ buf[buf.length-2] = (byte)'\n'; /* add the carriage return */
++ buf[buf.length-1] = 0; /* null terminate */
++
++ for (i = 0; i < buf.length-2; i++)
++ {
++ buf[i] = (byte)user_input.charAt(i);
++ }
++
++ if ((res = ssl_ctx.write(ssl, buf)) < axtlsj.SSL_OK)
++ {
++ if (!quiet)
++ {
++ SSLUtil.displayError(res);
++ }
++
++ break;
++ }
++ }
++
++ ssl_ctx.dispose();
++ }
++
++ /**
++ * We've had some sort of command-line error. Print out the basic options.
++ */
++ private void print_options(String option)
++ {
++ System.out.println("axssl: Error: '" + option +
++ "' is an invalid command.");
++ System.out.println("usage: axtlsj.jar [s_server|s_client|version] " +
++ "[args ...]");
++ System.exit(1);
++ }
++
++ /**
++ * We've had some sort of command-line error. Print out the server options.
++ */
++ private void print_server_options(int build_mode, String option)
++ {
++ int cert_size = SSLUtil.maxCerts();
++ int ca_cert_size = SSLUtil.maxCACerts();
++
++ System.out.println("unknown option " + option);
++ System.out.println("usage: s_server [args ...]");
++ System.out.println(" -accept arg\t- port to accept on (default " +
++ "is 4433)");
++ System.out.println(" -quiet\t\t- No server output");
++
++ if (build_mode >= axtlsj.SSL_BUILD_SERVER_ONLY)
++ {
++ System.out.println(" -cert arg\t- certificate file to add (in " +
++ "addition to default) to chain -");
++ System.out.println("\t\t Can repeat up to " + cert_size + " times");
++ System.out.println(" -key arg\t- Private key file to use");
++ System.out.println(" -pass\t\t- private key file pass phrase source");
++ }
++
++ if (build_mode >= axtlsj.SSL_BUILD_ENABLE_VERIFICATION)
++ {
++ System.out.println(" -verify\t- turn on peer certificate " +
++ "verification");
++ System.out.println(" -CAfile arg\t- Certificate authority. ");
++ System.out.println("\t\t Can repeat up to " +
++ ca_cert_size + " times");
++ }
++
++ if (build_mode == axtlsj.SSL_BUILD_FULL_MODE)
++ {
++ System.out.println(" -debug\t\t- Print more output");
++ System.out.println(" -state\t\t- Show state messages");
++ System.out.println(" -show-rsa\t- Show RSA state");
++ }
++
++ System.exit(1);
++ }
++
++ /**
++ * We've had some sort of command-line error. Print out the client options.
++ */
++ private void print_client_options(int build_mode, String option)
++ {
++ int cert_size = SSLUtil.maxCerts();
++ int ca_cert_size = SSLUtil.maxCACerts();
++
++ System.out.println("unknown option " + option);
++
++ if (build_mode >= axtlsj.SSL_BUILD_ENABLE_CLIENT)
++ {
++ System.out.println("usage: s_client [args ...]");
++ System.out.println(" -connect host:port - who to connect to " +
++ "(default is localhost:4433)");
++ System.out.println(" -verify\t- turn on peer certificate " +
++ "verification");
++ System.out.println(" -cert arg\t- certificate file to use");
++ System.out.println(" -key arg\t- Private key file to use");
++ System.out.println("\t\t Can repeat up to " + cert_size +
++ " times");
++ System.out.println(" -CAfile arg\t- Certificate authority.");
++ System.out.println("\t\t Can repeat up to " + ca_cert_size +
++ " times");
++ System.out.println(" -quiet\t\t- No client output");
++ System.out.println(" -pass\t\t- private key file pass " +
++ "phrase source");
++ System.out.println(" -reconnect\t- Drop and re-make the " +
++ "connection with the same Session-ID");
++
++ if (build_mode == axtlsj.SSL_BUILD_FULL_MODE)
++ {
++ System.out.println(" -debug\t\t- Print more output");
++ System.out.println(" -state\t\t- Show state messages");
++ System.out.println(" -show-rsa\t- Show RSA state");
++ }
++ }
++ else
++ {
++ System.out.println("Change configuration to allow this feature");
++ }
++
++ System.exit(1);
++ }
++
++ /**
++ * Display what cipher we are using
++ */
++ private void display_cipher(SSL ssl)
++ {
++ System.out.print("CIPHER is ");
++
++ byte ciph_id = ssl.getCipherId();
++
++ if (ciph_id == axtlsj.SSL_AES128_SHA)
++ System.out.println("AES128-SHA");
++ else if (ciph_id == axtlsj.SSL_AES256_SHA)
++ System.out.println("AES256-SHA");
++ else if (ciph_id == axtlsj.SSL_RC4_128_SHA)
++ System.out.println("RC4-SHA");
++ else if (ciph_id == axtlsj.SSL_RC4_128_MD5)
++ System.out.println("RC4-MD5");
++ else
++ System.out.println("Unknown - " + ssl.getCipherId());
++ }
++
++ public char toHexChar(int i)
++ {
++ if ((0 <= i) && (i <= 9 ))
++ return (char)('0' + i);
++ else
++ return (char)('a' + (i-10));
++ }
++
++ public void bytesToHex(byte[] data)
++ {
++ StringBuffer buf = new StringBuffer();
++ for (int i = 0; i < data.length; i++ )
++ {
++ buf.append(toHexChar((data[i]>>>4)&0x0F));
++ buf.append(toHexChar(data[i]&0x0F));
++ }
++
++ System.out.println(buf);
++ }
++
++
++ /**
++ * Display what session id we have.
++ */
++ private void display_session_id(SSL ssl)
++ {
++ byte[] session_id = ssl.getSessionId();
++
++ if (session_id.length > 0)
++ {
++ System.out.println("-----BEGIN SSL SESSION PARAMETERS-----");
++ bytesToHex(session_id);
++ System.out.println("-----END SSL SESSION PARAMETERS-----");
++ }
++ }
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/manifest.mf b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/manifest.mf
+new file mode 100644
+index 0000000..b906ed2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/manifest.mf
+@@ -0,0 +1 @@
++Main-Class: axssl
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/Makefile
+new file mode 100644
+index 0000000..a460da3
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/Makefile
+@@ -0,0 +1,43 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++include ../../config/.config
++include ../../config/makefile.conf
++
++all: samples
++TARGET=../../$(STAGE)/axssl.lua
++samples: $(TARGET)
++
++$(TARGET): axssl.lua
++ install $< $@
++
++clean::
++ -@rm -f $(TARGET)
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/axssl.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/axssl.lua
+new file mode 100755
+index 0000000..6ea26b6
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/axssl.lua
+@@ -0,0 +1,562 @@
++#!/usr/local/bin/lua
++
++--
++-- Copyright (c) 2007, Cameron Rich
++--
++-- All rights reserved.
++--
++-- Redistribution and use in source and binary forms, with or without
++-- modification, are permitted provided that the following conditions are met:
++--
++-- * Redistributions of source code must retain the above copyright notice,
++-- this list of conditions and the following disclaimer.
++-- * Redistributions in binary form must reproduce the above copyright
++-- notice, this list of conditions and the following disclaimer in the
++-- documentation and/or other materials provided with the distribution.
++-- * Neither the name of the axTLS project nor the names of its
++-- contributors may be used to endorse or promote products derived
++-- from this software without specific prior written permission.
++--
++-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++-- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++-- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++-- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++-- OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++-- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++--
++
++--
++-- Demonstrate the use of the axTLS library in Lua with a set of
++-- command-line parameters similar to openssl. In fact, openssl clients
++-- should be able to communicate with axTLS servers and visa-versa.
++--
++-- This code has various bits enabled depending on the configuration. To enable
++-- the most interesting version, compile with the 'full mode' enabled.
++--
++-- To see what options you have, run the following:
++-- > [lua] axssl s_server -?
++-- > [lua] axssl s_client -?
++--
++-- The axtls/axtlsl shared libraries must be in the same directory or be found
++-- by the OS.
++--
++--
++require "bit"
++require("axtlsl")
++local socket = require("socket")
++
++-- print version?
++if #arg == 1 and arg[1] == "version" then
++ print("axssl.lua "..axtlsl.ssl_version())
++ os.exit(1)
++end
++
++--
++-- We've had some sort of command-line error. Print out the basic options.
++--
++function print_options(option)
++ print("axssl: Error: '"..option.."' is an invalid command.")
++ print("usage: axssl [s_server|s_client|version] [args ...]")
++ os.exit(1)
++end
++
++--
++-- We've had some sort of command-line error. Print out the server options.
++--
++function print_server_options(build_mode, option)
++ local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET)
++ local ca_cert_size = axtlsl.ssl_get_config(
++ axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET)
++
++ print("unknown option "..option)
++ print("usage: s_server [args ...]")
++ print(" -accept\t- port to accept on (default is 4433)")
++ print(" -quiet\t\t- No server output")
++
++ if build_mode >= axtlsl.SSL_BUILD_SERVER_ONLY then
++ print(" -cert arg\t- certificate file to add (in addition to "..
++ "default) to chain -")
++ print("\t\t Can repeat up to "..cert_size.." times")
++ print(" -key arg\t- Private key file to use - default DER format")
++ print(" -pass\t\t- private key file pass phrase source")
++ end
++
++ if build_mode >= axtlsl.SSL_BUILD_ENABLE_VERIFICATION then
++ print(" -verify\t- turn on peer certificate verification")
++ print(" -CAfile arg\t- Certificate authority - default DER format")
++ print("\t\t Can repeat up to "..ca_cert_size.." times")
++ end
++
++ if build_mode == axtlsl.SSL_BUILD_FULL_MODE then
++ print(" -debug\t\t- Print more output")
++ print(" -state\t\t- Show state messages")
++ print(" -show-rsa\t- Show RSA state")
++ end
++
++ os.exit(1)
++end
++
++--
++-- We've had some sort of command-line error. Print out the client options.
++--
++function print_client_options(build_mode, option)
++ local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET)
++ local ca_cert_size = axtlsl.ssl_get_config(
++ axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET)
++
++ print("unknown option "..option)
++
++ if build_mode >= axtlsl.SSL_BUILD_ENABLE_CLIENT then
++ print("usage: s_client [args ...]")
++ print(" -connect host:port - who to connect to (default "..
++ "is localhost:4433)")
++ print(" -verify\t- turn on peer certificate verification")
++ print(" -cert arg\t- certificate file to use - default DER format")
++ print(" -key arg\t- Private key file to use - default DER format")
++ print("\t\t Can repeat up to "..cert_size.." times")
++ print(" -CAfile arg\t- Certificate authority - default DER format")
++ print("\t\t Can repeat up to "..ca_cert_size.."times")
++ print(" -quiet\t\t- No client output")
++ print(" -pass\t\t- private key file pass phrase source")
++ print(" -reconnect\t- Drop and re-make the connection "..
++ "with the same Session-ID")
++
++ if build_mode == axtlsl.SSL_BUILD_FULL_MODE then
++ print(" -debug\t\t- Print more output")
++ print(" -state\t\t- Show state messages")
++ print(" -show-rsa\t- Show RSA state")
++ end
++ else
++ print("Change configuration to allow this feature")
++ end
++
++ os.exit(1)
++end
++
++-- Implement the SSL server logic.
++function do_server(build_mode)
++ local i = 2
++ local v
++ local port = 4433
++ local options = axtlsl.SSL_DISPLAY_CERTS
++ local quiet = false
++ local password = ""
++ local private_key_file = nil
++ local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET)
++ local ca_cert_size = axtlsl.
++ ssl_get_config(axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET)
++ local cert = {}
++ local ca_cert = {}
++
++ while i <= #arg do
++ if arg[i] == "-accept" then
++ if i >= #arg then
++ print_server_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ port = arg[i]
++ elseif arg[i] == "-quiet" then
++ quiet = true
++ options = bit.band(options, bit.bnot(axtlsl.SSL_DISPLAY_CERTS))
++ elseif build_mode >= axtlsl.SSL_BUILD_SERVER_ONLY then
++ if arg[i] == "-cert" then
++ if i >= #arg or #cert >= cert_size then
++ print_server_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ table.insert(cert, arg[i])
++ elseif arg[i] == "-key" then
++ if i >= #arg then
++ print_server_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ private_key_file = arg[i]
++ options = bit.bor(options, axtlsl.SSL_NO_DEFAULT_KEY)
++ elseif arg[i] == "-pass" then
++ if i >= #arg then
++ print_server_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ password = arg[i]
++ elseif build_mode >= axtlsl.SSL_BUILD_ENABLE_VERIFICATION then
++ if arg[i] == "-verify" then
++ options = bit.bor(options, axtlsl.SSL_CLIENT_AUTHENTICATION)
++ elseif arg[i] == "-CAfile" then
++ if i >= #arg or #ca_cert >= ca_cert_size then
++ print_server_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ table.insert(ca_cert, arg[i])
++ elseif build_mode == axtlsl.SSL_BUILD_FULL_MODE then
++ if arg[i] == "-debug" then
++ options = bit.bor(options, axtlsl.SSL_DISPLAY_BYTES)
++ elseif arg[i] == "-state" then
++ options = bit.bor(options, axtlsl.SSL_DISPLAY_STATES)
++ elseif arg[i] == "-show-rsa" then
++ options = bit.bor(options, axtlsl.SSL_DISPLAY_RSA)
++ else
++ print_server_options(build_mode, arg[i])
++ end
++ else
++ print_server_options(build_mode, arg[i])
++ end
++ else
++ print_server_options(build_mode, arg[i])
++ end
++ else
++ print_server_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ end
++
++ -- Create socket for incoming connections
++ local server_sock = socket.try(socket.bind("*", port))
++
++ ---------------------------------------------------------------------------
++ -- This is where the interesting stuff happens. Up until now we've
++ -- just been setting up sockets etc. Now we do the SSL handshake.
++ ---------------------------------------------------------------------------
++ local ssl_ctx = axtlsl.ssl_ctx_new(options, axtlsl.SSL_DEFAULT_SVR_SESS)
++ if ssl_ctx == nil then error("Error: Server context is invalid") end
++
++ if private_key_file ~= nil then
++ local obj_type = axtlsl.SSL_OBJ_RSA_KEY
++
++ if string.find(private_key_file, ".p8") then
++ obj_type = axtlsl.SSL_OBJ_PKCS8
++ end
++
++ if string.find(private_key_file, ".p12") then
++ obj_type = axtlsl.SSL_OBJ_PKCS12
++ end
++
++ if axtlsl.ssl_obj_load(ssl_ctx, obj_type, private_key_file,
++ password) ~= axtlsl.SSL_OK then
++ error("Private key '" .. private_key_file .. "' is undefined.")
++ end
++ end
++
++ for _, v in ipairs(cert) do
++ if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CERT, v, "") ~=
++ axtlsl.SSL_OK then
++ error("Certificate '"..v .. "' is undefined.")
++ end
++ end
++
++ for _, v in ipairs(ca_cert) do
++ if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CACERT, v, "") ~=
++ axtlsl.SSL_OK then
++ error("Certificate '"..v .."' is undefined.")
++ end
++ end
++
++ while true do
++ if not quiet then print("ACCEPT") end
++ local client_sock = server_sock:accept();
++ local ssl = axtlsl.ssl_server_new(ssl_ctx, client_sock:getfd())
++
++ -- do the actual SSL handshake
++ local connected = false
++ local res
++ local buf
++
++ while true do
++ socket.select({client_sock}, nil)
++ res, buf = axtlsl.ssl_read(ssl)
++
++ if res == axtlsl.SSL_OK then -- connection established and ok
++ if axtlsl.ssl_handshake_status(ssl) == axtlsl.SSL_OK then
++ if not quiet and not connected then
++ display_session_id(ssl)
++ display_cipher(ssl)
++ end
++ connected = true
++ end
++ end
++
++ if res > axtlsl.SSL_OK then
++ for _, v in ipairs(buf) do
++ io.write(string.format("%c", v))
++ end
++ elseif res < axtlsl.SSL_OK then
++ if not quiet then
++ axtlsl.ssl_display_error(res)
++ end
++ break
++ end
++ end
++
++ -- client was disconnected or the handshake failed.
++ print("CONNECTION CLOSED")
++ axtlsl.ssl_free(ssl)
++ client_sock:close()
++ end
++
++ axtlsl.ssl_ctx_free(ssl_ctx)
++end
++
++--
++-- Implement the SSL client logic.
++--
++function do_client(build_mode)
++ local i = 2
++ local v
++ local port = 4433
++ local options =
++ bit.bor(axtlsl.SSL_SERVER_VERIFY_LATER, axtlsl.SSL_DISPLAY_CERTS)
++ local private_key_file = nil
++ local reconnect = 0
++ local quiet = false
++ local password = ""
++ local session_id = {}
++ local host = "127.0.0.1"
++ local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET)
++ local ca_cert_size = axtlsl.
++ ssl_get_config(axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET)
++ local cert = {}
++ local ca_cert = {}
++
++ while i <= #arg do
++ if arg[i] == "-connect" then
++ if i >= #arg then
++ print_client_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ local t = string.find(arg[i], ":")
++ host = string.sub(arg[i], 1, t-1)
++ port = string.sub(arg[i], t+1)
++ elseif arg[i] == "-cert" then
++ if i >= #arg or #cert >= cert_size then
++ print_client_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ table.insert(cert, arg[i])
++ elseif arg[i] == "-key" then
++ if i >= #arg then
++ print_client_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ private_key_file = arg[i]
++ options = bit.bor(options, axtlsl.SSL_NO_DEFAULT_KEY)
++ elseif arg[i] == "-CAfile" then
++ if i >= #arg or #ca_cert >= ca_cert_size then
++ print_client_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ table.insert(ca_cert, arg[i])
++ elseif arg[i] == "-verify" then
++ options = bit.band(options,
++ bit.bnot(axtlsl.SSL_SERVER_VERIFY_LATER))
++ elseif arg[i] == "-reconnect" then
++ reconnect = 4
++ elseif arg[i] == "-quiet" then
++ quiet = true
++ options = bit.band(options, bnot(axtlsl.SSL_DISPLAY_CERTS))
++ elseif arg[i] == "-pass" then
++ if i >= #arg then
++ print_server_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ password = arg[i]
++ elseif build_mode == axtlsl.SSL_BUILD_FULL_MODE then
++ if arg[i] == "-debug" then
++ options = bit.bor(options, axtlsl.SSL_DISPLAY_BYTES)
++ elseif arg[i] == "-state" then
++ options = bit.bor(axtlsl.SSL_DISPLAY_STATES)
++ elseif arg[i] == "-show-rsa" then
++ options = bit.bor(axtlsl.SSL_DISPLAY_RSA)
++ else -- don't know what this is
++ print_client_options(build_mode, arg[i])
++ end
++ else -- don't know what this is
++ print_client_options(build_mode, arg[i])
++ end
++
++ i = i + 1
++ end
++
++ local client_sock = socket.try(socket.connect(host, port))
++ local ssl
++ local res
++
++ if not quiet then print("CONNECTED") end
++
++ ---------------------------------------------------------------------------
++ -- This is where the interesting stuff happens. Up until now we've
++ -- just been setting up sockets etc. Now we do the SSL handshake.
++ ---------------------------------------------------------------------------
++ local ssl_ctx = axtlsl.ssl_ctx_new(options, axtlsl.SSL_DEFAULT_CLNT_SESS)
++
++ if ssl_ctx == nil then
++ error("Error: Client context is invalid")
++ end
++
++ if private_key_file ~= nil then
++ local obj_type = axtlsl.SSL_OBJ_RSA_KEY
++
++ if string.find(private_key_file, ".p8") then
++ obj_type = axtlsl.SSL_OBJ_PKCS8
++ end
++
++ if string.find(private_key_file, ".p12") then
++ obj_type = axtlsl.SSL_OBJ_PKCS12
++ end
++
++ if axtlsl.ssl_obj_load(ssl_ctx, obj_type, private_key_file,
++ password) ~= axtlsl.SSL_OK then
++ error("Private key '"..private_key_file.."' is undefined.")
++ end
++ end
++
++ for _, v in ipairs(cert) do
++ if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CERT, v, "") ~=
++ axtlsl.SSL_OK then
++ error("Certificate '"..v .. "' is undefined.")
++ end
++ end
++
++ for _, v in ipairs(ca_cert) do
++ if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CACERT, v, "") ~=
++ axtlsl.SSL_OK then
++ error("Certificate '"..v .."' is undefined.")
++ end
++ end
++
++ -- Try session resumption?
++ if reconnect ~= 0 then
++ local session_id = nil
++ local sess_id_size = 0
++
++ while reconnect > 0 do
++ reconnect = reconnect - 1
++ ssl = axtlsl.ssl_client_new(ssl_ctx,
++ client_sock:getfd(), session_id, sess_id_size)
++
++ res = axtlsl.ssl_handshake_status(ssl)
++ if res ~= axtlsl.SSL_OK then
++ if not quiet then axtlsl.ssl_display_error(res) end
++ axtlsl.ssl_free(ssl)
++ os.exit(1)
++ end
++
++ display_session_id(ssl)
++ session_id = axtlsl.ssl_get_session_id(ssl)
++ sess_id_size = axtlsl.ssl_get_session_id_size(ssl)
++
++ if reconnect > 0 then
++ axtlsl.ssl_free(ssl)
++ client_sock:close()
++ client_sock = socket.try(socket.connect(host, port))
++ end
++
++ end
++ else
++ ssl = axtlsl.ssl_client_new(ssl_ctx, client_sock:getfd(), nil, 0)
++ end
++
++ -- check the return status
++ res = axtlsl.ssl_handshake_status(ssl)
++ if res ~= axtlsl.SSL_OK then
++ if not quiet then axtlsl.ssl_display_error(res) end
++ os.exit(1)
++ end
++
++ if not quiet then
++ local common_name = axtlsl.ssl_get_cert_dn(ssl,
++ axtlsl.SSL_X509_CERT_COMMON_NAME)
++
++ if common_name ~= nil then
++ print("Common Name:\t\t\t"..common_name)
++ end
++
++ display_session_id(ssl)
++ display_cipher(ssl)
++ end
++
++ while true do
++ local line = io.read()
++ if line == nil then break end
++ local bytes = {}
++
++ for i = 1, #line do
++ bytes[i] = line.byte(line, i)
++ end
++
++ bytes[#line+1] = 10 -- add carriage return, null
++ bytes[#line+2] = 0
++
++ res = axtlsl.ssl_write(ssl, bytes, #bytes)
++ if res < axtlsl.SSL_OK then
++ if not quiet then axtlsl.ssl_display_error(res) end
++ break
++ end
++ end
++
++ axtlsl.ssl_ctx_free(ssl_ctx)
++ client_sock:close()
++end
++
++--
++-- Display what cipher we are using
++--
++function display_cipher(ssl)
++ io.write("CIPHER is ")
++ local cipher_id = axtlsl.ssl_get_cipher_id(ssl)
++
++ if cipher_id == axtlsl.SSL_AES128_SHA then
++ print("AES128-SHA")
++ elseif cipher_id == axtlsl.SSL_AES256_SHA then
++ print("AES256-SHA")
++ elseif axtlsl.SSL_RC4_128_SHA then
++ print("RC4-SHA")
++ elseif axtlsl.SSL_RC4_128_MD5 then
++ print("RC4-MD5")
++ else
++ print("Unknown - "..cipher_id)
++ end
++end
++
++--
++-- Display what session id we have.
++--
++function display_session_id(ssl)
++ local session_id = axtlsl.ssl_get_session_id(ssl)
++ local v
++
++ if #session_id > 0 then
++ print("-----BEGIN SSL SESSION PARAMETERS-----")
++ for _, v in ipairs(session_id) do
++ io.write(string.format("%02x", v))
++ end
++ print("\n-----END SSL SESSION PARAMETERS-----")
++ end
++end
++
++--
++-- Main entry point. Doesn't do much except works out whether we are a client
++-- or a server.
++--
++if #arg == 0 or (arg[1] ~= "s_server" and arg[1] ~= "s_client") then
++ print_options(#arg > 0 and arg[1] or "")
++end
++
++local build_mode = axtlsl.ssl_get_config(axtlsl.SSL_BUILD_MODE)
++_ = arg[1] == "s_server" and do_server(build_mode) or do_client(build_mode)
++os.exit(0)
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/Makefile
+new file mode 100644
+index 0000000..5200c43
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/Makefile
+@@ -0,0 +1,43 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++include ../../config/.config
++include ../../config/makefile.conf
++
++all: samples
++TARGET=../../$(STAGE)/axssl.pl
++samples: $(TARGET)
++
++$(TARGET): axssl.pl
++ install $< $@
++
++clean::
++ -@rm -f $(TARGET)
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/axssl.pl b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/axssl.pl
+new file mode 100755
+index 0000000..e49d522
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/axssl.pl
+@@ -0,0 +1,634 @@
++#!/usr/bin/perl -w
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++#
++# Demonstrate the use of the axTLS library in Perl with a set of
++# command-line parameters similar to openssl. In fact, openssl clients
++# should be able to communicate with axTLS servers and visa-versa.
++#
++# This code has various bits enabled depending on the configuration. To enable
++# the most interesting version, compile with the 'full mode' enabled.
++#
++# To see what options you have, run the following:
++# > [perl] axssl s_server -?
++# > [perl] axssl s_client -?
++#
++# The axtls/axtlsp shared libraries must be in the same directory or be found
++# by the OS. axtlsp.pm must be in this directory or be in @INC.
++#
++# Under Win32, ActivePerl was used (see
++# http://www.activestate.com/Products/ActivePerl/?mp=1)
++#
++use axtlsp;
++use IO::Socket;
++
++# To get access to Win32 file descriptor stuff
++my $is_win32 = 0;
++
++if ($^O eq "MSWin32")
++{
++ eval("use Win32API::File 0.08 qw( :ALL )");
++ $is_win32 = 1;
++}
++
++use strict;
++
++#
++# Win32 has some problems with socket handles
++#
++sub get_native_sock
++{
++ my ($sock) = @_;
++ return $is_win32 ? FdGetOsFHandle($sock) : $sock;
++}
++
++# print version?
++if ($#ARGV == 0 && $ARGV[0] eq "version")
++{
++ printf("axssl.pl ".axtlsp::ssl_version()."\n");
++ exit 0;
++}
++
++#
++# Main entry point. Doesn't do much except works out whether we are a client
++# or a server.
++#
++print_options($#ARGV > -1 ? $ARGV[0] : "")
++ if ($#ARGV < 0 || ($ARGV[0] ne "s_server" && $ARGV[0] ne "s_client"));
++
++
++# Cygwin/Win32 issue - flush our output continuously
++select STDOUT;
++local $|=1;
++
++my $build_mode = axtlsp::ssl_get_config($axtlsp::SSL_BUILD_MODE);
++$ARGV[0] eq "s_server" ? do_server($build_mode) : do_client($build_mode);
++
++#
++# Implement the SSL server logic.
++#
++sub do_server
++{
++ my ($build_mode) = @_;
++ my $i = 1;
++ my $port = 4433;
++ my $options = $axtlsp::SSL_DISPLAY_CERTS;
++ my $quiet = 0;
++ my $password = undef;
++ my $private_key_file = undef;
++ my $cert_size = axtlsp::ssl_get_config($axtlsp::SSL_MAX_CERT_CFG_OFFSET);
++ my $ca_cert_size = axtlsp::ssl_get_config(
++ $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET);
++ my @cert;
++ my @ca_cert;
++
++ while ($i <= $#ARGV)
++ {
++ if ($ARGV[$i] eq "-accept")
++ {
++ print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
++ $port = $ARGV[++$i];
++ }
++ elsif ($ARGV[$i] eq "-quiet")
++ {
++ $quiet = 1;
++ $options &= ~$axtlsp::SSL_DISPLAY_CERTS;
++ }
++ elsif ($build_mode >= $axtlsp::SSL_BUILD_SERVER_ONLY)
++ {
++ if ($ARGV[$i] eq "-cert")
++ {
++ print_server_options($build_mode, $ARGV[$i])
++ if $i >= $#ARGV || $#cert >= $cert_size-1;
++
++ push @cert, $ARGV[++$i];
++ }
++ elsif ($ARGV[$i] eq "-key")
++ {
++ print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
++ $private_key_file = $ARGV[++$i];
++ $options |= $axtlsp::SSL_NO_DEFAULT_KEY;
++ }
++ elsif ($ARGV[$i] eq "-pass")
++ {
++ print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
++ $password = $ARGV[++$i];
++ }
++ elsif ($build_mode >= $axtlsp::SSL_BUILD_ENABLE_VERIFICATION)
++ {
++ if ($ARGV[$i] eq "-verify")
++ {
++ $options |= $axtlsp::SSL_CLIENT_AUTHENTICATION;
++ }
++ elsif ($ARGV[$i] eq "-CAfile")
++ {
++ print_server_options($build_mode, $ARGV[$i])
++ if $i >= $#ARGV || $#ca_cert >= $ca_cert_size-1;
++ push @ca_cert, $ARGV[++$i];
++ }
++ elsif ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE)
++ {
++ if ($ARGV[$i] eq "-debug")
++ {
++ $options |= $axtlsp::SSL_DISPLAY_BYTES;
++ }
++ elsif ($ARGV[$i] eq "-state")
++ {
++ $options |= $axtlsp::SSL_DISPLAY_STATES;
++ }
++ elsif ($ARGV[$i] eq "-show-rsa")
++ {
++ $options |= $axtlsp::SSL_DISPLAY_RSA;
++ }
++ else
++ {
++ print_server_options($build_mode, $ARGV[$i]);
++ }
++ }
++ else
++ {
++ print_server_options($build_mode, $ARGV[$i]);
++ }
++ }
++ else
++ {
++ print_server_options($build_mode, $ARGV[$i]);
++ }
++ }
++ else
++ {
++ print_server_options($build_mode, $ARGV[$i]);
++ }
++
++ $i++;
++ }
++
++ # Create socket for incoming connections
++ my $server_sock = IO::Socket::INET->new(Proto => 'tcp',
++ LocalPort => $port,
++ Listen => 1,
++ Reuse => 1) or die $!;
++
++ ###########################################################################
++ # This is where the interesting stuff happens. Up until now we've
++ # just been setting up sockets etc. Now we do the SSL handshake.
++ ###########################################################################
++ my $ssl_ctx = axtlsp::ssl_ctx_new($options, $axtlsp::SSL_DEFAULT_SVR_SESS);
++ die "Error: Server context is invalid" if not defined $ssl_ctx;
++
++ if (defined $private_key_file)
++ {
++ my $obj_type = $axtlsp::SSL_OBJ_RSA_KEY;
++
++ $obj_type = $axtlsp::SSL_OBJ_PKCS8 if $private_key_file =~ /.p8$/;
++ $obj_type = $axtlsp::SSL_OBJ_PKCS12 if $private_key_file =~ /.p12$/;
++
++ die "Private key '$private_key_file' is undefined." if
++ axtlsp::ssl_obj_load($ssl_ctx, $obj_type,
++ $private_key_file, $password);
++ }
++
++ foreach (@cert)
++ {
++ die "Certificate '$_' is undefined."
++ if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CERT,
++ $_, undef) != $axtlsp::SSL_OK;
++ }
++
++ foreach (@ca_cert)
++ {
++ die "Certificate '$_' is undefined."
++ if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CACERT,
++ $_, undef) != $axtlsp::SSL_OK;
++ }
++
++ for (;;)
++ {
++ printf("ACCEPT\n") if not $quiet;
++ my $client_sock = $server_sock->accept;
++ my $native_sock = get_native_sock($client_sock->fileno);
++
++ # This doesn't work in Win32 - need to get file descriptor from socket.
++ my $ssl = axtlsp::ssl_server_new($ssl_ctx, $native_sock);
++
++ # do the actual SSL handshake
++ my $res;
++ my $buf;
++ my $connected = 0;
++
++ while (1)
++ {
++ ($res, $buf) = axtlsp::ssl_read($ssl, undef);
++ last if $res < $axtlsp::SSL_OK;
++
++ if ($res == $axtlsp::SSL_OK) # connection established and ok
++ {
++ if (axtlsp::ssl_handshake_status($ssl) == $axtlsp::SSL_OK)
++ {
++ if (!$quiet && !$connected)
++ {
++ display_session_id($ssl);
++ display_cipher($ssl);
++ }
++
++ $connected = 1;
++ }
++ }
++
++ if ($res > $axtlsp::SSL_OK)
++ {
++ printf($$buf);
++ }
++ elsif ($res < $axtlsp::SSL_OK)
++ {
++ axtlsp::ssl_display_error($res) if not $quiet;
++ last;
++ }
++ }
++
++ # client was disconnected or the handshake failed.
++ printf("CONNECTION CLOSED\n") if not $quiet;
++ axtlsp::ssl_free($ssl);
++ $client_sock->close;
++ }
++
++ axtlsp::ssl_ctx_free($ssl_ctx);
++}
++
++#
++# Implement the SSL client logic.
++#
++sub do_client
++{
++ my ($build_mode) = @_;
++ my $i = 1;
++ my $port = 4433;
++ my $options = $axtlsp::SSL_SERVER_VERIFY_LATER|$axtlsp::SSL_DISPLAY_CERTS;
++ my $private_key_file = undef;
++ my $reconnect = 0;
++ my $quiet = 0;
++ my $password = undef;
++ my @session_id;
++ my $host = "127.0.0.1";
++ my @cert;
++ my @ca_cert;
++ my $cert_size = axtlsp::ssl_get_config(
++ $axtlsp::SSL_MAX_CERT_CFG_OFFSET);
++ my $ca_cert_size = axtlsp::ssl_get_config(
++ $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET);
++
++ while ($i <= $#ARGV)
++ {
++ if ($ARGV[$i] eq "-connect")
++ {
++ print_client_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
++ ($host, $port) = split(':', $ARGV[++$i]);
++ }
++ elsif ($ARGV[$i] eq "-cert")
++ {
++ print_client_options($build_mode, $ARGV[$i])
++ if $i >= $#ARGV || $#cert >= $cert_size-1;
++
++ push @cert, $ARGV[++$i];
++ }
++ elsif ($ARGV[$i] eq "-key")
++ {
++ print_client_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
++ $private_key_file = $ARGV[++$i];
++ $options |= $axtlsp::SSL_NO_DEFAULT_KEY;
++ }
++ elsif ($ARGV[$i] eq "-CAfile")
++ {
++ print_client_options($build_mode, $ARGV[$i])
++ if $i >= $#ARGV || $#ca_cert >= $ca_cert_size-1;
++
++ push @ca_cert, $ARGV[++$i];
++ }
++ elsif ($ARGV[$i] eq "-verify")
++ {
++ $options &= ~$axtlsp::SSL_SERVER_VERIFY_LATER;
++ }
++ elsif ($ARGV[$i] eq "-reconnect")
++ {
++ $reconnect = 4;
++ }
++ elsif ($ARGV[$i] eq "-quiet")
++ {
++ $quiet = 1;
++ $options &= ~$axtlsp::SSL_DISPLAY_CERTS;
++ }
++ elsif ($ARGV[$i] eq "-pass")
++ {
++ print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV;
++ $password = $ARGV[++$i];
++ }
++ elsif ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE)
++ {
++ if ($ARGV[$i] eq "-debug")
++ {
++ $options |= $axtlsp::SSL_DISPLAY_BYTES;
++ }
++ elsif ($ARGV[$i] eq "-state")
++ {
++ $options |= $axtlsp::SSL_DISPLAY_STATES;
++ }
++ elsif ($ARGV[$i] eq "-show-rsa")
++ {
++ $options |= $axtlsp::SSL_DISPLAY_RSA;
++ }
++ else # don't know what this is
++ {
++ print_client_options($build_mode, $ARGV[$i]);
++ }
++ }
++ else # don't know what this is
++ {
++ print_client_options($build_mode, $ARGV[$i]);
++ }
++
++ $i++;
++ }
++
++ my $client_sock = new IO::Socket::INET (
++ PeerAddr => $host, PeerPort => $port, Proto => 'tcp')
++ || die ("no socket: $!");
++ my $ssl;
++ my $res;
++ my $native_sock = get_native_sock($client_sock->fileno);
++
++ printf("CONNECTED\n") if not $quiet;
++
++ ###########################################################################
++ # This is where the interesting stuff happens. Up until now we've
++ # just been setting up sockets etc. Now we do the SSL handshake.
++ ###########################################################################
++ my $ssl_ctx = axtlsp::ssl_ctx_new($options, $axtlsp::SSL_DEFAULT_CLNT_SESS);
++ die "Error: Client context is invalid" if not defined $ssl_ctx;
++
++ if (defined $private_key_file)
++ {
++ my $obj_type = $axtlsp::SSL_OBJ_RSA_KEY;
++
++ $obj_type = $axtlsp::SSL_OBJ_PKCS8 if $private_key_file =~ /.p8$/;
++ $obj_type = $axtlsp::SSL_OBJ_PKCS12 if $private_key_file =~ /.p12$/;
++
++ die "Private key '$private_key_file' is undefined." if
++ axtlsp::ssl_obj_load($ssl_ctx, $obj_type,
++ $private_key_file, $password);
++ }
++
++ foreach (@cert)
++ {
++ die "Certificate '$_' is undefined."
++ if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CERT,
++ $_, undef) != $axtlsp::SSL_OK;
++ }
++
++ foreach (@ca_cert)
++ {
++ die "Certificate '$_' is undefined."
++ if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CACERT,
++ $_, undef) != $axtlsp::SSL_OK;
++ }
++
++ # Try session resumption?
++ if ($reconnect)
++ {
++ my $session_id = undef;
++ my $sess_id_size = 0;
++
++ while ($reconnect--)
++ {
++ $ssl = axtlsp::ssl_client_new($ssl_ctx, $native_sock,
++ $session_id, $sess_id_size);
++
++ $res = axtlsp::ssl_handshake_status($ssl);
++ if ($res != $axtlsp::SSL_OK)
++ {
++ axtlsp::ssl_display_error($res) if !$quiet;
++ axtlsp::ssl_free($ssl);
++ exit 1;
++ }
++
++ display_session_id($ssl);
++ $session_id = axtlsp::ssl_get_session_id($ssl);
++
++ if ($reconnect)
++ {
++ axtlsp::ssl_free($ssl);
++ $client_sock->close;
++ $client_sock = new IO::Socket::INET (
++ PeerAddr => $host, PeerPort => $port, Proto => 'tcp')
++ || die ("no socket: $!");
++
++ }
++ }
++ }
++ else
++ {
++ $ssl = axtlsp::ssl_client_new($ssl_ctx, $native_sock, undef, 0);
++ }
++
++ # check the return status
++ $res = axtlsp::ssl_handshake_status($ssl);
++ if ($res != $axtlsp::SSL_OK)
++ {
++ axtlsp::ssl_display_error($res) if not $quiet;
++ exit 1;
++ }
++
++ if (!$quiet)
++ {
++ my $common_name = axtlsp::ssl_get_cert_dn($ssl,
++ $axtlsp::SSL_X509_CERT_COMMON_NAME);
++
++ printf("Common Name:\t\t\t%s\n", $common_name) if defined $common_name;
++ display_session_id($ssl);
++ display_cipher($ssl);
++ }
++
++ while (<STDIN>)
++ {
++ my $cstring = pack("a*x", $_); # add null terminator
++ $res = axtlsp::ssl_write($ssl, \$cstring, length($cstring));
++ if ($res < $axtlsp::SSL_OK)
++ {
++ axtlsp::ssl_display_error($res) if not $quiet;
++ last;
++ }
++ }
++
++ axtlsp::ssl_ctx_free($ssl_ctx);
++ $client_sock->close;
++}
++
++#
++# We've had some sort of command-line error. Print out the basic options.
++#
++sub print_options
++{
++ my ($option) = @_;
++ printf("axssl: Error: '%s' is an invalid command.\n", $option);
++ printf("usage: axssl [s_server|s_client|version] [args ...]\n");
++ exit 1;
++}
++
++#
++# We've had some sort of command-line error. Print out the server options.
++#
++sub print_server_options
++{
++ my ($build_mode, $option) = @_;
++ my $cert_size = axtlsp::ssl_get_config($axtlsp::SSL_MAX_CERT_CFG_OFFSET);
++ my $ca_cert_size = axtlsp::ssl_get_config(
++ $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET);
++
++ printf("unknown option %s\n", $option);
++ printf("usage: s_server [args ...]\n");
++ printf(" -accept arg\t- port to accept on (default is 4433)\n");
++ printf(" -quiet\t\t- No server output\n");
++
++ if ($build_mode >= $axtlsp::SSL_BUILD_SERVER_ONLY)
++ {
++ printf(" -cert arg\t- certificate file to add (in addition to default)".
++ " to chain -\n".
++ "\t\t Can repeat up to %d times\n", $cert_size);
++ printf(" -key arg\t- Private key file to use - default DER format\n");
++ printf(" -pass\t\t- private key file pass phrase source\n");
++ }
++
++ if ($build_mode >= $axtlsp::SSL_BUILD_ENABLE_VERIFICATION)
++ {
++ printf(" -verify\t- turn on peer certificate verification\n");
++ printf(" -CAfile arg\t- Certificate authority - default DER format\n");
++ printf("\t\t Can repeat up to %d times\n", $ca_cert_size);
++ }
++
++ if ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE)
++ {
++ printf(" -debug\t\t- Print more output\n");
++ printf(" -state\t\t- Show state messages\n");
++ printf(" -show-rsa\t- Show RSA state\n");
++ }
++
++ exit 1;
++}
++
++#
++# We've had some sort of command-line error. Print out the client options.
++#
++sub print_client_options
++{
++ my ($build_mode, $option) = @_;
++ my $cert_size = axtlsp::ssl_get_config($axtlsp::SSL_MAX_CERT_CFG_OFFSET);
++ my $ca_cert_size = axtlsp::ssl_get_config(
++ $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET);
++
++ printf("unknown option %s\n", $option);
++
++ if ($build_mode >= $axtlsp::SSL_BUILD_ENABLE_CLIENT)
++ {
++ printf("usage: s_client [args ...]\n");
++ printf(" -connect host:port - who to connect to (default ".
++ "is localhost:4433)\n");
++ printf(" -verify\t- turn on peer certificate verification\n");
++ printf(" -cert arg\t- certificate file to use - default DER format\n");
++ printf(" -key arg\t- Private key file to use - default DER format\n");
++ printf("\t\t Can repeat up to %d times\n", $cert_size);
++ printf(" -CAfile arg\t- Certificate authority - default DER format\n");
++ printf("\t\t Can repeat up to %d times\n", $ca_cert_size);
++ printf(" -quiet\t\t- No client output\n");
++ printf(" -pass\t\t- private key file pass phrase source\n");
++ printf(" -reconnect\t- Drop and re-make the connection ".
++ "with the same Session-ID\n");
++
++ if ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE)
++ {
++ printf(" -debug\t\t- Print more output\n");
++ printf(" -state\t\t- Show state messages\n");
++ printf(" -show-rsa\t- Show RSA state\n");
++ }
++ }
++ else
++ {
++ printf("Change configuration to allow this feature\n");
++ }
++
++ exit 1;
++}
++
++#
++# Display what cipher we are using
++#
++sub display_cipher
++{
++ my ($ssl) = @_;
++ printf("CIPHER is ");
++ my $cipher_id = axtlsp::ssl_get_cipher_id($ssl);
++
++ if ($cipher_id == $axtlsp::SSL_AES128_SHA)
++ {
++ printf("AES128-SHA");
++ }
++ elsif ($cipher_id == $axtlsp::SSL_AES256_SHA)
++ {
++ printf("AES256-SHA");
++ }
++ elsif ($axtlsp::SSL_RC4_128_SHA)
++ {
++ printf("RC4-SHA");
++ }
++ elsif ($axtlsp::SSL_RC4_128_MD5)
++ {
++ printf("RC4-MD5");
++ }
++ else
++ {
++ printf("Unknown - %d", $cipher_id);
++ }
++
++ printf("\n");
++}
++
++#
++# Display what session id we have.
++#
++sub display_session_id
++{
++ my ($ssl) = @_;
++ my $session_id = axtlsp::ssl_get_session_id($ssl);
++ if (length($$session_id) > 0)
++ {
++ printf("-----BEGIN SSL SESSION PARAMETERS-----\n");
++ printf(unpack("H*", $$session_id));
++ printf("\n-----END SSL SESSION PARAMETERS-----\n");
++ }
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/Makefile
+new file mode 100644
+index 0000000..0984d4e
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++include ../../config/.config
++include ../../config/makefile.conf
++include ../../config/makefile.dotnet.conf
++
++# only build on Win32 platforms
++ifdef GO_DOT_NET
++all : sample
++TARGET=../../$(STAGE)/axssl.vbnet.exe
++sample : $(TARGET)
++
++$(TARGET): ../../bindings/vbnet/axTLSvb.vb ../../bindings/vbnet/axInterface.vb axssl.vb
++ vbc.exe /r:"`cygpath -w "$(CONFIG_DOT_NET_FRAMEWORK_BASE)/System.dll"`" /nologo /t:exe /out:"`cygpath -w $@`" $(foreach file, $^, "`cygpath -w $(file)`")
++
++endif # ARCH
++
++clean::
++ -@rm -f $(TARGET)
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/axssl.vb b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/axssl.vb
+new file mode 100644
+index 0000000..1b423c8
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/axssl.vb
+@@ -0,0 +1,702 @@
++'
++' Copyright (c) 2007, Cameron Rich
++'
++' All rights reserved.
++'
++' Redistribution and use in source and binary forms, with or without
++' modification, are permitted provided that the following conditions are met:
++'
++' * Redistributions of source code must retain the above copyright notice,
++' this list of conditions and the following disclaimer.
++' * Redistributions in binary form must reproduce the above copyright
++' notice, this list of conditions and the following disclaimer in the
++' documentation and/or other materials provided with the distribution.
++' * Neither the name of the axTLS project nor the names of its
++' contributors may be used to endorse or promote products derived
++' from this software without specific prior written permission.
++'
++' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++' "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++' LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++' A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++' CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++' TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++' DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++' OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++' NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++' THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++'
++
++'
++' Demonstrate the use of the axTLS library in VB.NET with a set of
++' command-line parameters similar to openssl. In fact, openssl clients
++' should be able to communicate with axTLS servers and visa-versa.
++'
++' This code has various bits enabled depending on the configuration. To enable
++' the most interesting version, compile with the 'full mode' enabled.
++'
++' To see what options you have, run the following:
++' > axssl.vbnet.exe s_server -?
++' > axssl.vbnet.exe s_client -?
++'
++' The axtls shared library must be in the same directory or be found
++' by the OS.
++'
++
++Imports System
++Imports System.Net
++Imports System.Net.Sockets
++Imports Microsoft.VisualBasic
++Imports axTLSvb
++
++Public Class axssl
++ '
++ ' do_server()
++ '
++ Public Sub do_server(ByVal build_mode As Integer, _
++ ByVal args() As String)
++ Dim i As Integer = 1
++ Dim port As Integer = 4433
++ Dim options As Integer = axtls.SSL_DISPLAY_CERTS
++ Dim quiet As Boolean = False
++ Dim password As String = Nothing
++ Dim private_key_file As String = Nothing
++
++ ' organise the cert/ca_cert lists
++ Dim cert_size As Integer = SSLUtil.MaxCerts()
++ Dim ca_cert_size As Integer = SSLUtil.MaxCACerts()
++ Dim cert(cert_size) As String
++ Dim ca_cert(ca_cert_size) As String
++ Dim cert_index As Integer = 0
++ Dim ca_cert_index As Integer = 0
++
++ While i < args.Length
++ If args(i) = "-accept" Then
++ If i >= args.Length-1
++ print_server_options(build_mode, args(i))
++ End If
++
++ i += 1
++ port = Int32.Parse(args(i))
++ ElseIf args(i) = "-quiet"
++ quiet = True
++ options = options And Not axtls.SSL_DISPLAY_CERTS
++ ElseIf build_mode >= axtls.SSL_BUILD_SERVER_ONLY
++ If args(i) = "-cert"
++ If i >= args.Length-1 Or cert_index >= cert_size
++ print_server_options(build_mode, args(i))
++ End If
++
++ i += 1
++ cert(cert_index) = args(i)
++ cert_index += 1
++ ElseIf args(i) = "-key"
++ If i >= args.Length-1
++ print_server_options(build_mode, args(i))
++ End If
++
++ i += 1
++ private_key_file = args(i)
++ options = options Or axtls.SSL_NO_DEFAULT_KEY
++ ElseIf args(i) = "-pass"
++ If i >= args.Length-1
++ print_server_options(build_mode, args(i))
++ End If
++
++ i += 1
++ password = args(i)
++ ElseIf build_mode >= axtls.SSL_BUILD_ENABLE_VERIFICATION
++ If args(i) = "-verify" Then
++ options = options Or axtls.SSL_CLIENT_AUTHENTICATION
++ ElseIf args(i) = "-CAfile"
++ If i >= args.Length-1 Or _
++ ca_cert_index >= ca_cert_size Then
++ print_server_options(build_mode, args(i))
++ End If
++
++ i += 1
++ ca_cert(ca_cert_index) = args(i)
++ ca_cert_index += 1
++ ElseIf build_mode = axtls.SSL_BUILD_FULL_MODE
++ If args(i) = "-debug" Then
++ options = options Or axtls.SSL_DISPLAY_BYTES
++ ElseIf args(i) = "-state"
++ options = options Or axtls.SSL_DISPLAY_STATES
++ ElseIf args(i) = "-show-rsa"
++ options = options Or axtls.SSL_DISPLAY_RSA
++ Else
++ print_server_options(build_mode, args(i))
++ End If
++ Else
++ print_server_options(build_mode, args(i))
++ End If
++ Else
++ print_server_options(build_mode, args(i))
++ End If
++ End If
++
++ i += 1
++ End While
++
++ ' Create socket for incoming connections
++ Dim ep As IPEndPoint = New IPEndPoint(IPAddress.Any, port)
++ Dim server_sock As TcpListener = New TcpListener(ep)
++ server_sock.Start()
++
++ '*********************************************************************
++ ' This is where the interesting stuff happens. Up until now we've
++ ' just been setting up sockets etc. Now we do the SSL handshake.
++ '*********************************************************************/
++ Dim ssl_ctx As SSLServer = New SSLServer(options, _
++ axtls.SSL_DEFAULT_SVR_SESS)
++
++ If ssl_ctx Is Nothing Then
++ Console.Error.WriteLine("Error: Server context is invalid")
++ Environment.Exit(1)
++ End If
++
++ If private_key_file <> Nothing Then
++ Dim obj_type As Integer = axtls.SSL_OBJ_RSA_KEY
++
++ If private_key_file.EndsWith(".p8") Then
++ obj_type = axtls.SSL_OBJ_PKCS8
++ Else If (private_key_file.EndsWith(".p12"))
++ obj_type = axtls.SSL_OBJ_PKCS12
++ End If
++
++ If ssl_ctx.ObjLoad(obj_type, private_key_file, _
++ password) <> axtls.SSL_OK Then
++ Console.Error.WriteLine("Error: Private key '" & _
++ private_key_file & "' is undefined.")
++ Environment.Exit(1)
++ End If
++ End If
++
++ For i = 0 To cert_index-1
++ If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CERT, _
++ cert(i), Nothing) <> axtls.SSL_OK Then
++ Console.WriteLine("Certificate '" & cert(i) & _
++ "' is undefined.")
++ Environment.Exit(1)
++ End If
++ Next
++
++ For i = 0 To ca_cert_index-1
++ If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CACERT, _
++ ca_cert(i), Nothing) <> axtls.SSL_OK Then
++ Console.WriteLine("Certificate '" & ca_cert(i) & _
++ "' is undefined.")
++ Environment.Exit(1)
++ End If
++ Next
++
++ Dim buf As Byte() = Nothing
++ Dim res As Integer
++ Dim ssl As SSL
++
++ While 1
++ If Not quiet Then
++ Console.WriteLine("ACCEPT")
++ End If
++
++ Dim client_sock As Socket = server_sock.AcceptSocket()
++
++ ssl = ssl_ctx.Connect(client_sock)
++
++ ' do the actual SSL handshake
++ While 1
++ res = ssl_ctx.Read(ssl, buf)
++ If res <> axtls.SSL_OK Then
++ Exit While
++ End If
++
++ ' check when the connection has been established
++ If ssl.HandshakeStatus() = axtls.SSL_OK
++ Exit While
++ End If
++
++ ' could do something else here
++ End While
++
++ If res = axtls.SSL_OK Then ' connection established and ok
++ If Not quiet
++ display_session_id(ssl)
++ display_cipher(ssl)
++ End If
++
++ ' now read (and display) whatever the client sends us
++ While 1
++ ' keep reading until we get something interesting
++ While 1
++ res = ssl_ctx.Read(ssl, buf)
++ If res <> axtls.SSL_OK Then
++ Exit While
++ End If
++
++ ' could do something else here
++ End While
++
++ If res < axtls.SSL_OK
++ If Not quiet
++ Console.WriteLine("CONNECTION CLOSED")
++ End If
++
++ Exit While
++ End If
++
++ ' convert to String
++ Dim str(res) As Char
++ For i = 0 To res-1
++ str(i) = Chr(buf(i))
++ Next
++
++ Console.Write(str)
++ End While
++ ElseIf Not quiet
++ SSLUtil.DisplayError(res)
++ End If
++
++ ' client was disconnected or the handshake failed. */
++ ssl.Dispose()
++ client_sock.Close()
++ End While
++
++ ssl_ctx.Dispose()
++ End Sub
++
++ '
++ ' do_client()
++ '
++ Public Sub do_client(ByVal build_mode As Integer, _
++ ByVal args() As String)
++
++ If build_mode < axtls.SSL_BUILD_ENABLE_CLIENT Then
++ print_client_options(build_mode, args(1))
++ End If
++
++ Dim i As Integer = 1
++ Dim res As Integer
++ Dim port As Integer = 4433
++ Dim quiet As Boolean = False
++ Dim password As String = Nothing
++ Dim reconnect As Integer = 0
++ Dim private_key_file As String = Nothing
++ Dim hostname As String = "127.0.0.1"
++
++ ' organise the cert/ca_cert lists
++ Dim ssl As SSL = Nothing
++ Dim cert_size As Integer = SSLUtil.MaxCerts()
++ Dim ca_cert_size As Integer = SSLUtil.MaxCACerts()
++ Dim cert(cert_size) As String
++ Dim ca_cert(ca_cert_size) As String
++ Dim cert_index As Integer = 0
++ Dim ca_cert_index As Integer = 0
++
++ Dim options As Integer = _
++ axtls.SSL_SERVER_VERIFY_LATER Or axtls.SSL_DISPLAY_CERTS
++ Dim session_id As Byte() = Nothing
++
++ While i < args.Length
++ If args(i) = "-connect" Then
++ Dim host_port As String
++
++ If i >= args.Length-1
++ print_client_options(build_mode, args(i))
++ End If
++
++ i += 1
++ host_port = args(i)
++
++ Dim index_colon As Integer = host_port.IndexOf(":"C)
++ If index_colon < 0 Then
++ print_client_options(build_mode, args(i))
++ End If
++
++ hostname = New String(host_port.ToCharArray(), _
++ 0, index_colon)
++ port = Int32.Parse(New String(host_port.ToCharArray(), _
++ index_colon+1, host_port.Length-index_colon-1))
++ ElseIf args(i) = "-cert"
++ If i >= args.Length-1 Or cert_index >= cert_size Then
++ print_client_options(build_mode, args(i))
++ End If
++
++ i += 1
++ cert(cert_index) = args(i)
++ cert_index += 1
++ ElseIf args(i) = "-key"
++ If i >= args.Length-1
++ print_client_options(build_mode, args(i))
++ End If
++
++ i += 1
++ private_key_file = args(i)
++ options = options Or axtls.SSL_NO_DEFAULT_KEY
++ ElseIf args(i) = "-CAfile"
++ If i >= args.Length-1 Or ca_cert_index >= ca_cert_size
++ print_client_options(build_mode, args(i))
++ End If
++
++ i += 1
++ ca_cert(ca_cert_index) = args(i)
++ ca_cert_index += 1
++ ElseIf args(i) = "-verify"
++ options = options And Not axtls.SSL_SERVER_VERIFY_LATER
++ ElseIf args(i) = "-reconnect"
++ reconnect = 4
++ ElseIf args(i) = "-quiet"
++ quiet = True
++ options = options And Not axtls.SSL_DISPLAY_CERTS
++ ElseIf args(i) = "-pass"
++ If i >= args.Length-1
++ print_client_options(build_mode, args(i))
++ End If
++
++ i += 1
++ password = args(i)
++ ElseIf build_mode = axtls.SSL_BUILD_FULL_MODE
++ If args(i) = "-debug" Then
++ options = options Or axtls.SSL_DISPLAY_BYTES
++ ElseIf args(i) = "-state"
++ options = options Or axtls.SSL_DISPLAY_STATES
++ ElseIf args(i) = "-show-rsa"
++ options = options Or axtls.SSL_DISPLAY_RSA
++ Else
++ print_client_options(build_mode, args(i))
++ End If
++ Else ' don't know what this is
++ print_client_options(build_mode, args(i))
++ End If
++
++ i += 1
++ End While
++
++ 'Dim hostInfo As IPHostEntry = Dns.Resolve(hostname)
++ Dim hostInfo As IPHostEntry = Dns.GetHostEntry(hostname)
++ Dim addresses As IPAddress() = hostInfo.AddressList
++ Dim ep As IPEndPoint = New IPEndPoint(addresses(0), port)
++ Dim client_sock As Socket = New Socket(AddressFamily.InterNetwork, _
++ SocketType.Stream, ProtocolType.Tcp)
++ client_sock.Connect(ep)
++
++ If Not client_sock.Connected Then
++ Console.WriteLine("could not connect")
++ Environment.Exit(1)
++ End If
++
++ If Not quiet Then
++ Console.WriteLine("CONNECTED")
++ End If
++
++ '*********************************************************************
++ ' This is where the interesting stuff happens. Up until now we've
++ ' just been setting up sockets etc. Now we do the SSL handshake.
++ '*********************************************************************/
++ Dim ssl_ctx As SSLClient = New SSLClient(options, _
++ axtls.SSL_DEFAULT_CLNT_SESS)
++
++ If ssl_ctx Is Nothing Then
++ Console.Error.WriteLine("Error: Client context is invalid")
++ Environment.Exit(1)
++ End If
++
++ If private_key_file <> Nothing Then
++ Dim obj_type As Integer = axtls.SSL_OBJ_RSA_KEY
++
++ If private_key_file.EndsWith(".p8") Then
++ obj_type = axtls.SSL_OBJ_PKCS8
++ Else If (private_key_file.EndsWith(".p12"))
++ obj_type = axtls.SSL_OBJ_PKCS12
++ End If
++
++ If ssl_ctx.ObjLoad(obj_type, private_key_file, _
++ password) <> axtls.SSL_OK Then
++ Console.Error.WriteLine("Error: Private key '" & _
++ private_key_file & "' is undefined.")
++ Environment.Exit(1)
++ End If
++ End If
++
++ For i = 0 To cert_index-1
++ If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CERT, _
++ cert(i), Nothing) <> axtls.SSL_OK Then
++ Console.WriteLine("Certificate '" & cert(i) & _
++ "' is undefined.")
++ Environment.Exit(1)
++ End If
++ Next
++
++ For i = 0 To ca_cert_index-1
++ If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CACERT, _
++ ca_cert(i), Nothing) <> axtls.SSL_OK Then
++ Console.WriteLine("Certificate '" & ca_cert(i) & _
++ "' is undefined.")
++ Environment.Exit(1)
++ End If
++ Next
++
++ ' Try session resumption?
++ If reconnect > 0 Then
++ While reconnect > 0
++ reconnect -= 1
++ ssl = ssl_ctx.Connect(client_sock, session_id)
++
++ res = ssl.HandshakeStatus()
++ If res <> axtls.SSL_OK Then
++ If Not quiet Then
++ SSLUtil.DisplayError(res)
++ End If
++
++ ssl.Dispose()
++ Environment.Exit(1)
++ End If
++
++ display_session_id(ssl)
++ session_id = ssl.GetSessionId()
++
++ If reconnect > 0 Then
++ ssl.Dispose()
++ client_sock.Close()
++
++ ' and reconnect
++ client_sock = New Socket(AddressFamily.InterNetwork, _
++ SocketType.Stream, ProtocolType.Tcp)
++ client_sock.Connect(ep)
++ End If
++ End While
++ Else
++ ssl = ssl_ctx.Connect(client_sock, Nothing)
++ End If
++
++ ' check the return status
++ res = ssl.HandshakeStatus()
++ If res <> axtls.SSL_OK Then
++ If Not quiet Then
++ SSLUtil.DisplayError(res)
++ End If
++
++ Environment.Exit(1)
++ End If
++
++ If Not quiet Then
++ Dim common_name As String = _
++ ssl.GetCertificateDN(axtls.SSL_X509_CERT_COMMON_NAME)
++
++ If common_name <> Nothing
++ Console.WriteLine("Common Name:" & _
++ ControlChars.Tab & ControlChars.Tab & _
++ ControlChars.Tab & common_name)
++ End If
++
++ display_session_id(ssl)
++ display_cipher(ssl)
++ End If
++
++ While (1)
++ Dim user_input As String = Console.ReadLine()
++
++ If user_input = Nothing Then
++ Exit While
++ End If
++
++ Dim buf(user_input.Length+1) As Byte
++ buf(buf.Length-2) = Asc(ControlChars.Lf) ' add the carriage return
++ buf(buf.Length-1) = 0 ' null terminate
++
++ For i = 0 To user_input.Length-1
++ buf(i) = Asc(user_input.Chars(i))
++ Next
++
++ res = ssl_ctx.Write(ssl, buf, buf.Length)
++ If res < axtls.SSL_OK Then
++ If Not quiet Then
++ SSLUtil.DisplayError(res)
++ End If
++
++ Exit While
++ End If
++ End While
++
++ ssl_ctx.Dispose()
++ End Sub
++
++ '
++ ' Display what cipher we are using
++ '
++ Private Sub display_cipher(ByVal ssl As SSL)
++ Console.Write("CIPHER is ")
++
++ Select ssl.GetCipherId()
++ Case axtls.SSL_AES128_SHA
++ Console.WriteLine("AES128-SHA")
++
++ Case axtls.SSL_AES256_SHA
++ Console.WriteLine("AES256-SHA")
++
++ Case axtls.SSL_RC4_128_SHA
++ Console.WriteLine("RC4-SHA")
++
++ Case axtls.SSL_RC4_128_MD5
++ Console.WriteLine("RC4-MD5")
++
++ Case Else
++ Console.WriteLine("Unknown - " & ssl.GetCipherId())
++ End Select
++ End Sub
++
++ '
++ ' Display what session id we have.
++ '
++ Private Sub display_session_id(ByVal ssl As SSL)
++ Dim session_id As Byte() = ssl.GetSessionId()
++
++ If session_id.Length > 0 Then
++ Console.WriteLine("-----BEGIN SSL SESSION PARAMETERS-----")
++ Dim b As Byte
++ For Each b In session_id
++ Console.Write("{0:x02}", b)
++ Next
++
++ Console.WriteLine()
++ Console.WriteLine("-----END SSL SESSION PARAMETERS-----")
++ End If
++ End Sub
++
++ '
++ ' We've had some sort of command-line error. Print out the basic options.
++ '
++ Public Sub print_options(ByVal options As String)
++ Console.WriteLine("axssl: Error: '" & options & _
++ "' is an invalid command.")
++ Console.WriteLine("usage: axssl.vbnet [s_server|s_client|" & _
++ "version] [args ...]")
++ Environment.Exit(1)
++ End Sub
++
++ '
++ ' We've had some sort of command-line error. Print out the server options.
++ '
++ Private Sub print_server_options(ByVal build_mode As Integer, _
++ ByVal options As String)
++ Dim cert_size As Integer = SSLUtil.MaxCerts()
++ Dim ca_cert_size As Integer = SSLUtil.MaxCACerts()
++
++ Console.WriteLine("unknown option " & options)
++ Console.WriteLine("usage: s_server [args ...]")
++ Console.WriteLine(" -accept arg" & ControlChars.Tab & _
++ "- port to accept on (default is 4433)")
++ Console.WriteLine(" -quiet" & ControlChars.Tab & ControlChars.Tab & _
++ "- No server output")
++ If build_mode >= axtls.SSL_BUILD_SERVER_ONLY
++ Console.WriteLine(" -cert arg" & ControlChars.Tab & _
++ "- certificate file to add (in addition to default) to chain -")
++ Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _
++ " Can repeat up to " & cert_size & " times")
++ Console.WriteLine(" -key arg" & ControlChars.Tab & _
++ "- Private key file to use")
++ Console.WriteLine(" -pass" & ControlChars.Tab & ControlChars.Tab & _
++ "- private key file pass phrase source")
++ End If
++
++ If build_mode >= axtls.SSL_BUILD_ENABLE_VERIFICATION
++ Console.WriteLine(" -verify" & ControlChars.Tab & _
++ "- turn on peer certificate verification")
++ Console.WriteLine(" -CAfile arg" & ControlChars.Tab & _
++ "- Certificate authority")
++ Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _
++ " Can repeat up to " & ca_cert_size & " times")
++ End If
++
++ If build_mode = axtls.SSL_BUILD_FULL_MODE
++ Console.WriteLine(" -debug" & _
++ ControlChars.Tab & ControlChars.Tab & _
++ "- Print more output")
++ Console.WriteLine(" -state" & _
++ ControlChars.Tab & ControlChars.Tab & _
++ "- Show state messages")
++ Console.WriteLine(" -show-rsa" & _
++ ControlChars.Tab & "- Show RSA state")
++ End If
++
++ Environment.Exit(1)
++ End Sub
++
++ '
++ ' We've had some sort of command-line error. Print out the client options.
++ '
++ Private Sub print_client_options(ByVal build_mode As Integer, _
++ ByVal options As String)
++ Dim cert_size As Integer = SSLUtil.MaxCerts()
++ Dim ca_cert_size As Integer = SSLUtil.MaxCACerts()
++
++ Console.WriteLine("unknown option " & options)
++
++ If build_mode >= axtls.SSL_BUILD_ENABLE_CLIENT Then
++ Console.WriteLine("usage: s_client [args ...]")
++ Console.WriteLine(" -connect host:port - who to connect to " & _
++ "(default is localhost:4433)")
++ Console.WriteLine(" -verify" & ControlChars.Tab & _
++ "- turn on peer certificate verification")
++ Console.WriteLine(" -cert arg" & ControlChars.Tab & _
++ "- certificate file to use")
++ Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _
++ " Can repeat up to " & cert_size & " times")
++ Console.WriteLine(" -key arg" & ControlChars.Tab & _
++ "- Private key file to use")
++ Console.WriteLine(" -CAfile arg" & ControlChars.Tab & _
++ "- Certificate authority")
++ Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _
++ " Can repeat up to " & ca_cert_size & " times")
++ Console.WriteLine(" -quiet" & _
++ ControlChars.Tab & ControlChars.Tab & "- No client output")
++ Console.WriteLine(" -pass" & ControlChars.Tab & _
++ ControlChars.Tab & _
++ "- private key file pass phrase source")
++ Console.WriteLine(" -reconnect" & ControlChars.Tab & _
++ "- Drop and re-make the " & _
++ "connection with the same Session-ID")
++
++ If build_mode = axtls.SSL_BUILD_FULL_MODE Then
++ Console.WriteLine(" -debug" & _
++ ControlChars.Tab & ControlChars.Tab & _
++ "- Print more output")
++ Console.WriteLine(" -state" & _
++ ControlChars.Tab & ControlChars.Tab & _
++ "- Show state messages")
++ Console.WriteLine(" -show-rsa" & ControlChars.Tab & _
++ "- Show RSA state")
++ End If
++ Else
++ Console.WriteLine("Change configuration to allow this feature")
++ End If
++
++ Environment.Exit(1)
++ End Sub
++
++End Class
++
++Public Module MyMain
++ Function Main(ByVal args() As String) As Integer
++ Dim runner As axssl = New axssl()
++
++ If args.Length = 1 And args(0) = "version" Then
++ Console.WriteLine("axssl.vbnet " & SSLUtil.Version())
++ Environment.Exit(0)
++ End If
++
++ If args.Length < 1
++ runner.print_options("")
++ ElseIf args(0) <> "s_server" And args(0) <> "s_client"
++ runner.print_options(args(0))
++ End If
++
++ Dim build_mode As Integer = SSLUtil.BuildMode()
++
++ If args(0) = "s_server" Then
++ runner.do_server(build_mode, args)
++ Else
++ runner.do_client(build_mode, args)
++ End If
++ End Function
++End Module
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/BigIntConfig.in b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/BigIntConfig.in
+new file mode 100644
+index 0000000..04c7438
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/BigIntConfig.in
+@@ -0,0 +1,132 @@
++#
++# For a description of the syntax of this configuration file,
++# see scripts/config/Kconfig-language.txt
++#
++
++menu "BigInt Options"
++ depends on !CONFIG_SSL_SKELETON_MODE
++
++choice
++ prompt "Reduction Algorithm"
++ default CONFIG_BIGINT_BARRETT
++
++config CONFIG_BIGINT_CLASSICAL
++ bool "Classical"
++ help
++ Classical uses standard division. It has no limitations and is
++ theoretically the slowest due to the divisions used. For this particular
++ implementation it is surprisingly quite fast.
++
++config CONFIG_BIGINT_MONTGOMERY
++ bool "Montgomery"
++ help
++ Montgomery uses simple addition and multiplication to achieve its
++ performance. In this implementation it is slower than classical,
++ and it has the limitation that 0 <= x, y < m, and so is not used
++ when CRT is active.
++
++ This option will not be normally selected.
++
++config CONFIG_BIGINT_BARRETT
++ bool "Barrett"
++ help
++ Barrett performs expensive precomputation before reduction and partial
++ multiplies for computational speed. It can't be used with some of the
++ calculations when CRT is used, and so defaults to classical when this
++ occurs.
++
++ It is about 40% faster than Classical/Montgomery with the expense of
++ about 2kB, and so this option is normally selected.
++
++endchoice
++
++config CONFIG_BIGINT_CRT
++ bool "Chinese Remainder Theorem (CRT)"
++ default y
++ help
++ Allow the Chinese Remainder Theorem (CRT) to be used.
++
++ Uses a number of extra coefficients from the private key to improve the
++ performance of a decryption. This feature is one of the most
++ significant performance improvements (it reduces a decryption time by
++ over 3 times).
++
++ This option should be selected.
++
++config CONFIG_BIGINT_KARATSUBA
++ bool "Karatsuba Multiplication"
++ default n
++ help
++ Allow Karasuba multiplication to be used.
++
++ Uses 3 multiplications (plus a number of additions/subtractions)
++ instead of 4. Multiplications are O(N^2) but addition/subtraction
++ is O(N) hence for large numbers is beneficial. For this project, the
++ effect was only useful for 4096 bit keys. As these aren't likely to
++ be used, the feature is disabled by default.
++
++ It costs about 2kB to enable it.
++
++config MUL_KARATSUBA_THRESH
++ int "Karatsuba Multiplication Theshold"
++ default 20
++ depends on CONFIG_BIGINT_KARATSUBA
++ help
++ The minimum number of components needed before Karasuba muliplication
++ is used.
++
++ This is very dependent on the speed/implementation of bi_add()/
++ bi_subtract(). There is a bit of trial and error here and will be
++ at a different point for different architectures.
++
++config SQU_KARATSUBA_THRESH
++ int "Karatsuba Square Threshold"
++ default 40
++ depends on CONFIG_BIGINT_KARATSUBA && CONFIG_BIGINT_SQUARE
++ help
++ The minimum number of components needed before Karatsuba squaring
++ is used.
++
++ This is very dependent on the speed/implementation of bi_add()/
++ bi_subtract(). There is a bit of trial and error here and will be
++ at a different point for different architectures.
++
++config CONFIG_BIGINT_SLIDING_WINDOW
++ bool "Sliding Window Exponentiation"
++ default y
++ help
++ Allow Sliding-Window Exponentiation to be used.
++
++ Potentially processes more than 1 bit at a time when doing
++ exponentiation. The sliding-window technique reduces the number of
++ precomputations compared to other precomputed techniques.
++
++ It results in a considerable performance improvement with it enabled
++ (it halves the decryption time) and so should be selected.
++
++config CONFIG_BIGINT_SQUARE
++ bool "Square Algorithm"
++ default y
++ help
++ Allow squaring to be used instead of a multiplication.
++
++ Squaring is theoretically 50% faster than a standard multiply
++ (but is actually about 25% faster).
++
++ It gives a 20% speed improvement and so should be selected.
++
++config CONFIG_BIGINT_CHECK_ON
++ bool "BigInt Integrity Checking"
++ default n if !CONFIG_DEBUG
++ default y if CONFIG_DEBUG
++ help
++ This is used when developing bigint algorithms. It performs a sanity
++ check on all operations at the expense of speed.
++
++ This option is only selected when developing and should normally be
++ turned off.
++
++endmenu
++
++
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Config.in b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Config.in
+new file mode 100644
+index 0000000..d047d42
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Config.in
+@@ -0,0 +1,336 @@
++#
++# For a description of the syntax of this configuration file,
++# see scripts/config/Kconfig-language.txt
++#
++
++menu "SSL Library"
++
++choice
++ prompt "Mode"
++ default CONFIG_SSL_FULL_MODE
++
++config CONFIG_SSL_SERVER_ONLY
++ bool "Server only - no verification"
++ help
++ Enable server functionality (no client functionality).
++ This mode still supports sessions and chaining (which can be turned
++ off in configuration).
++
++ The axssl sample runs with the minimum of features.
++
++ This is the most space efficient of the modes with the library
++ about 45kB in size. Use this mode if you are doing standard SSL server
++ work.
++
++config CONFIG_SSL_CERT_VERIFICATION
++ bool "Server only - with verification"
++ help
++ Enable server functionality with client authentication (no client
++ functionality).
++
++ The axssl sample runs with the "-verify" and "-CAfile" options.
++
++ This mode produces a library about 49kB in size. Use this mode if you
++ have an SSL server which requires client authentication (which is
++ uncommon in browser applications).
++
++config CONFIG_SSL_ENABLE_CLIENT
++ bool "Client/Server enabled"
++ help
++ Enable client/server functionality (including peer authentication).
++
++ The axssl sample runs with the "s_client" option enabled.
++
++ This mode produces a library about 51kB in size. Use this mode if you
++ require axTLS to use SSL client functionality (the SSL server code
++ is always enabled).
++
++config CONFIG_SSL_FULL_MODE
++ bool "Client/Server enabled with diagnostics"
++ help
++ Enable client/server functionality including diagnostics. Most of the
++ extra size in this mode is due to the storage of various strings that
++ are used.
++
++ The axssl sample has 3 more options, "-debug", "-state" and "-show-rsa"
++
++ This mode produces a library about 58kB in size. It is suggested that
++ this mode is used only during development, or systems that have more
++ generous memory limits.
++
++ It is the default to demonstrate the features of axTLS.
++
++config CONFIG_SSL_SKELETON_MODE
++ bool "Skeleton mode - the smallest server mode"
++ help
++ This is an experiment to build the smallest library at the expense of
++ features and speed.
++
++ * Server mode only.
++ * The AES cipher is disabled.
++ * No session resumption.
++ * No external keys/certificates are supported.
++ * The bigint library has most of the performance features disabled.
++ * Some other features/API calls may not work.
++
++ This mode produces a library about 37kB in size. The main
++ disadvantage of this mode is speed - it will be much slower than the
++ other build modes.
++
++endchoice
++
++choice
++ prompt "Protocol Preference"
++ depends on !CONFIG_SSL_SKELETON_MODE
++ default CONFIG_SSL_PROT_MEDIUM
++
++config CONFIG_SSL_PROT_LOW
++ bool "Low"
++ help
++ Chooses the cipher in the order of RC4-SHA, AES128-SHA, AES256-SHA.
++
++ This will use the fastest cipher(s) but at the expense of security.
++
++config CONFIG_SSL_PROT_MEDIUM
++ bool "Medium"
++ help
++ Chooses the cipher in the order of AES128-SHA, AES256-SHA, RC4-SHA.
++
++ This mode is a balance between speed and security and is the default.
++
++config CONFIG_SSL_PROT_HIGH
++ bool "High"
++ help
++ Chooses the cipher in the order of AES256-SHA, AES128-SHA, RC4-SHA.
++
++ This will use the strongest cipher(s) at the cost of speed.
++
++endchoice
++
++config CONFIG_SSL_USE_DEFAULT_KEY
++ bool "Enable default key"
++ depends on !CONFIG_SSL_SKELETON_MODE
++ default y
++ help
++ Some applications will not require the default private key/certificate
++ that is built in. This is one way to save on a couple of kB's if an
++ external private key/certificate is used.
++
++ The private key is in ssl/private_key.h and the certificate is in
++ ssl/cert.h.
++
++ The advantage of a built-in private key/certificate is that no file
++ system is required for access. Both the certificate and the private
++ key will be automatically loaded on a ssl_ctx_new().
++
++ However this private key/certificate can never be changed (without a
++ code update).
++
++ This mode is enabled by default. Disable this mode if the
++ built-in key/certificate is not used.
++
++config CONFIG_SSL_PRIVATE_KEY_LOCATION
++ string "Private key file location"
++ depends on !CONFIG_SSL_USE_DEFAULT_KEY && !CONFIG_SSL_SKELETON_MODE
++ help
++ The file location of the private key which will be automatically
++ loaded on a ssl_ctx_new().
++
++config CONFIG_SSL_PRIVATE_KEY_PASSWORD
++ string "Private key password"
++ depends on !CONFIG_SSL_USE_DEFAULT_KEY && CONFIG_SSL_HAS_PEM
++ help
++ The password required to decrypt a PEM-encoded password file.
++
++config CONFIG_SSL_X509_CERT_LOCATION
++ string "X.509 certificate file location"
++ depends on !CONFIG_SSL_GENERATE_X509_CERT && !CONFIG_SSL_USE_DEFAULT_KEY && !CONFIG_SSL_SKELETON_MODE
++ help
++ The file location of the X.509 certificate which will be automatically
++ loaded on a ssl_ctx_new().
++
++config CONFIG_SSL_GENERATE_X509_CERT
++ bool "Generate X.509 Certificate"
++ default n
++ help
++ An X.509 certificate can be automatically generated on a
++ ssl_ctx_new(). A private key still needs to be provided (the private
++ key in ss/private_key.h will be used unless
++ CONFIG_SSL_PRIVATE_KEY_LOCATION is set).
++
++ The certificate is generated on the fly, and so a minor start-up time
++ penalty is to be expected. This feature adds around 5kB to the
++ library.
++
++ This feature is disabled by default.
++
++config CONFIG_SSL_X509_COMMON_NAME
++ string "X.509 Common Name"
++ depends on CONFIG_SSL_GENERATE_X509_CERT
++ help
++ The common name for the X.509 certificate. This should be the fully
++ qualified domain name (FQDN), e.g. www.foo.com.
++
++ If this is blank, then this will be value from gethostname() and
++ getdomainname().
++
++config CONFIG_SSL_X509_ORGANIZATION_NAME
++ string "X.509 Organization Name"
++ depends on CONFIG_SSL_GENERATE_X509_CERT
++ help
++ The organization name for the generated X.509 certificate.
++
++ This field is optional.
++
++config CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME
++ string "X.509 Organization Unit Name"
++ depends on CONFIG_SSL_GENERATE_X509_CERT
++ help
++ The organization unit name for the generated X.509 certificate.
++
++ This field is optional.
++
++config CONFIG_SSL_ENABLE_V23_HANDSHAKE
++ bool "Enable v23 Handshake"
++ default y
++ help
++ Some browsers use the v23 handshake client hello message
++ (an SSL2 format message which all SSL servers can understand).
++ It may be used if SSL2 is enabled in the browser.
++
++ Since this feature takes a kB or so, this feature may be disabled - at
++ the risk of making it incompatible with some browsers (IE6 is ok,
++ Firefox 1.5 and below use it).
++
++ Disable if backwards compatibility is not an issue (i.e. the client is
++ always using TLS1.0)
++
++config CONFIG_SSL_HAS_PEM
++ bool "Enable PEM"
++ default n if !CONFIG_SSL_FULL_MODE
++ default y if CONFIG_SSL_FULL_MODE
++ depends on !CONFIG_SSL_SKELETON_MODE
++ help
++ Enable the use of PEM format for certificates and private keys.
++
++ PEM is not normally needed - PEM files can be converted into DER files
++ quite easily. However they have the convenience of allowing multiple
++ certificates/keys in the same file.
++
++ This feature will add a couple of kB to the library.
++
++ Disable if PEM is not used (which will be in most cases).
++
++config CONFIG_SSL_USE_PKCS12
++ bool "Use PKCS8/PKCS12"
++ default n if !CONFIG_SSL_FULL_MODE
++ default y if CONFIG_SSL_FULL_MODE
++ depends on !CONFIG_SSL_SERVER_ONLY && !CONFIG_SSL_SKELETON_MODE
++ help
++ PKCS#12 certificates combine private keys and certificates together in
++ one file.
++
++ PKCS#8 private keys are also suppported (as it is a subset of PKCS#12).
++
++ The decryption of these certificates uses RC4-128 (and these
++ certificates must be encrypted using this cipher). The actual
++ algorithm is "PBE-SHA1-RC4-128".
++
++ Disable if PKCS#12 is not used (which will be in most cases).
++
++config CONFIG_SSL_EXPIRY_TIME
++ int "Session expiry time (in hours)"
++ depends on !CONFIG_SSL_SKELETON_MODE
++ default 24
++ help
++ The time (in hours) before a session expires.
++
++ A longer time means that the expensive parts of a handshake don't
++ need to be run when a client reconnects later.
++
++ The default is 1 day.
++
++config CONFIG_X509_MAX_CA_CERTS
++ int "Maximum number of certificate authorites"
++ default 4
++ depends on !CONFIG_SSL_SERVER_ONLY && !CONFIG_SSL_SKELETON_MODE
++ help
++ Determines the number of CA's allowed.
++
++ Increase this figure if more trusted sites are allowed. Each
++ certificate adds about 300 bytes (when added).
++
++ The default is to allow four certification authorities.
++
++config CONFIG_SSL_MAX_CERTS
++ int "Maximum number of chained certificates"
++ default 2
++ help
++ Determines the number of certificates used in a certificate
++ chain. The chain length must be at least 1.
++
++ Increase this figure if more certificates are to be added to the
++ chain. Each certificate adds about 300 bytes (when added).
++
++ The default is to allow one certificate + 1 certificate in the chain
++ (which may be the certificate authority certificate).
++
++config CONFIG_SSL_CTX_MUTEXING
++ bool "Enable SSL_CTX mutexing"
++ default n
++ help
++ Normally mutexing is not required - each SSL_CTX object can deal with
++ many SSL objects (as long as each SSL_CTX object is using a single
++ thread).
++
++ If the SSL_CTX object is not thread safe e.g. the case where a
++ new thread is created for each SSL object, then mutexing is required.
++
++ Select y when a mutex on the SSL_CTX object is required.
++
++config CONFIG_USE_DEV_URANDOM
++ bool "Use /dev/urandom"
++ default y
++ depends on !CONFIG_PLATFORM_WIN32
++ help
++ Use /dev/urandom. Otherwise a custom RNG is used.
++
++ This will be the default on most Linux systems.
++
++config CONFIG_WIN32_USE_CRYPTO_LIB
++ bool "Use Win32 Crypto Library"
++ depends on CONFIG_PLATFORM_WIN32
++ help
++ Microsoft produce a Crypto API which requires the Platform SDK to be
++ installed. It's used for the RNG.
++
++ This will be the default on most Win32 systems.
++
++config CONFIG_OPENSSL_COMPATIBLE
++ bool "Enable openssl API compatibility"
++ default n
++ help
++ To ease the porting of openssl applications, a subset of the openssl
++ API is wrapped around the axTLS API.
++
++ Note: not all the API is implemented, so parts may still break. And
++ it's definitely not 100% compatible.
++
++config CONFIG_PERFORMANCE_TESTING
++ bool "Build the bigint performance test tool"
++ default n
++ help
++ Used for performance testing of bigint.
++
++ This is a testing tool and is normally disabled.
++
++config CONFIG_SSL_TEST
++ bool "Build the SSL testing tool"
++ default n
++ depends on CONFIG_SSL_FULL_MODE && !CONFIG_SSL_GENERATE_X509_CERT
++ help
++ Used for sanity checking the SSL handshaking.
++
++ This is a testing tool and is normally disabled.
++
++endmenu
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Makefile
+new file mode 100644
+index 0000000..704d90a
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Makefile
+@@ -0,0 +1,123 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++AXTLS_HOME=..
++
++include $(AXTLS_HOME)/config/.config
++include $(AXTLS_HOME)/config/makefile.conf
++
++all: libs
++ifdef CONFIG_PERFORMANCE_TESTING
++ $(MAKE) -C test
++else
++ifdef CONFIG_SSL_TEST
++ $(MAKE) -C test
++endif
++endif
++
++ifndef CONFIG_PLATFORM_WIN32
++TARGET1=$(AXTLS_HOME)/$(STAGE)/libaxtls.a
++BASETARGET=libaxtls.so
++CRYPTO_PATH=$(AXTLS_HOME)/crypto/
++ifdef CONFIG_PLATFORM_CYGWIN
++TARGET2=$(AXTLS_HOME)/$(STAGE)/libaxtls.dll.a
++else
++TARGET2=$(AXTLS_HOME)/$(STAGE)/$(LIBMINOR)
++endif
++
++# shared library major/minor numbers
++LIBMAJOR=$(BASETARGET).1
++LIBMINOR=$(BASETARGET).1.2
++else
++TARGET1=$(AXTLS_HOME)/$(STAGE)/axtls.lib
++TARGET2=$(AXTLS_HOME)/$(STAGE)/axtls.dll
++STATIC_LIB=$(AXTLS_HOME)/$(STAGE)/axtls.static.lib
++CRYPTO_PATH=$(AXTLS_HOME)\\crypto\\
++endif
++
++libs: $(TARGET1) $(TARGET2)
++
++CRYPTO_OBJ=\
++ $(CRYPTO_PATH)aes.o \
++ $(CRYPTO_PATH)bigint.o \
++ $(CRYPTO_PATH)crypto_misc.o \
++ $(CRYPTO_PATH)hmac.o \
++ $(CRYPTO_PATH)md2.o \
++ $(CRYPTO_PATH)md5.o \
++ $(CRYPTO_PATH)rc4.o \
++ $(CRYPTO_PATH)rsa.o \
++ $(CRYPTO_PATH)sha1.o
++
++OBJ=\
++ asn1.o \
++ gen_cert.o \
++ loader.o \
++ openssl.o \
++ os_port.o \
++ p12.o \
++ tls1.o \
++ tls1_svr.o \
++ tls1_clnt.o \
++ x509.o
++
++include $(AXTLS_HOME)/config/makefile.post
++
++ifndef CONFIG_PLATFORM_WIN32 # Linux/Unix/Cygwin
++
++$(TARGET1) : $(OBJ)
++ $(AR) -r $@ $(CRYPTO_OBJ) $(OBJ)
++
++$(TARGET2) : $(OBJ)
++ifndef CONFIG_PLATFORM_CYGWIN
++ $(LD) $(LDFLAGS) $(LDSHARED) -o $(AXTLS_HOME)/$(STAGE)/$(LIBMINOR) $(CRYPTO_OBJ) $(OBJ)
++ cd $(AXTLS_HOME)/$(STAGE); ln -sf $(LIBMINOR) $(LIBMAJOR); ln -sf $(LIBMAJOR) $(BASETARGET); cd -
++else
++ $(LD) $(LDFLAGS) $(LDSHARED) -o $(AXTLS_HOME)/$(STAGE)/cygaxtls.dll \
++ -Wl,--out-implib=$(AXTLS_HOME)/$(STAGE)/libaxtls.dll.a \
++ -Wl,--export-all-symbols \
++ -Wl,--enable-auto-import $(CRYPTO_OBJ) $(OBJ)
++endif
++
++else # Win32
++CRYPTO_OBJ:=$(CRYPTO_OBJ:.o=.obj)
++
++$(TARGET1) : $(OBJ)
++ $(AR) /out:$@ $(CRYPTO_OBJ) $(OBJ)
++
++$(TARGET2) : $(OBJ)
++ cp $(TARGET1) $(STATIC_LIB)
++ $(LD) $(LDFLAGS) $(LDSHARED) /out:$@ $(CRYPTO_OBJ) $(OBJ)
++
++endif
++
++clean::
++ $(MAKE) -C test clean
++ -@rm -f $(AXTLS_HOME)/$(STAGE)/* *.a $(TARGET1) $(TARGET2)
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/asn1.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/asn1.c
+new file mode 100644
+index 0000000..4f2e6db
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/asn1.c
+@@ -0,0 +1,510 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * Some primitive asn methods for extraction ASN.1 data.
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <time.h>
++#include "os_port.h"
++#include "crypto.h"
++#include "crypto_misc.h"
++
++#define SIG_OID_PREFIX_SIZE 8
++#define SIG_IIS6_OID_SIZE 5
++
++/* Must be an RSA algorithm with either SHA1 or MD5 for verifying to work */
++static const uint8_t sig_oid_prefix[SIG_OID_PREFIX_SIZE] =
++{
++ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01
++};
++
++static const uint8_t sig_iis6_oid[SIG_IIS6_OID_SIZE] =
++{
++ 0x2b, 0x0e, 0x03, 0x02, 0x1d
++};
++
++/* CN, O, OU */
++static const uint8_t g_dn_types[] = { 3, 10, 11 };
++
++int get_asn1_length(const uint8_t *buf, int *offset)
++{
++ int len, i;
++
++ if (!(buf[*offset] & 0x80)) /* short form */
++ {
++ len = buf[(*offset)++];
++ }
++ else /* long form */
++ {
++ int length_bytes = buf[(*offset)++]&0x7f;
++ len = 0;
++ for (i = 0; i < length_bytes; i++)
++ {
++ len <<= 8;
++ len += buf[(*offset)++];
++ }
++ }
++
++ return len;
++}
++
++/**
++ * Skip the ASN1.1 object type and its length. Get ready to read the object's
++ * data.
++ */
++int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type)
++{
++ if (buf[*offset] != obj_type)
++ return X509_NOT_OK;
++ (*offset)++;
++ return get_asn1_length(buf, offset);
++}
++
++/**
++ * Skip over an ASN.1 object type completely. Get ready to read the next
++ * object.
++ */
++int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type)
++{
++ int len;
++
++ if (buf[*offset] != obj_type)
++ return X509_NOT_OK;
++ (*offset)++;
++ len = get_asn1_length(buf, offset);
++ *offset += len;
++ return 0;
++}
++
++/**
++ * Read an integer value for ASN.1 data
++ * Note: This function allocates memory which must be freed by the user.
++ */
++int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object)
++{
++ int len;
++
++ if ((len = asn1_next_obj(buf, offset, ASN1_INTEGER)) < 0)
++ goto end_int_array;
++
++ if (len > 1 && buf[*offset] == 0x00) /* ignore the negative byte */
++ {
++ len--;
++ (*offset)++;
++ }
++
++ *object = (uint8_t *)malloc(len);
++ memcpy(*object, &buf[*offset], len);
++ *offset += len;
++
++end_int_array:
++ return len;
++}
++
++/**
++ * Get all the RSA private key specifics from an ASN.1 encoded file
++ */
++int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx)
++{
++ int offset = 7;
++ uint8_t *modulus = NULL, *priv_exp = NULL, *pub_exp = NULL;
++ int mod_len, priv_len, pub_len;
++#ifdef CONFIG_BIGINT_CRT
++ uint8_t *p = NULL, *q = NULL, *dP = NULL, *dQ = NULL, *qInv = NULL;
++ int p_len, q_len, dP_len, dQ_len, qInv_len;
++#endif
++
++ /* not in der format */
++ if (buf[0] != ASN1_SEQUENCE) /* basic sanity check */
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("Error: This is not a valid ASN.1 file\n");
++#endif
++ return X509_INVALID_PRIV_KEY;
++ }
++
++ /* initialise the RNG */
++ RNG_initialize(buf, len);
++
++ mod_len = asn1_get_int(buf, &offset, &modulus);
++ pub_len = asn1_get_int(buf, &offset, &pub_exp);
++ priv_len = asn1_get_int(buf, &offset, &priv_exp);
++
++ if (mod_len <= 0 || pub_len <= 0 || priv_len <= 0)
++ return X509_INVALID_PRIV_KEY;
++
++#ifdef CONFIG_BIGINT_CRT
++ p_len = asn1_get_int(buf, &offset, &p);
++ q_len = asn1_get_int(buf, &offset, &q);
++ dP_len = asn1_get_int(buf, &offset, &dP);
++ dQ_len = asn1_get_int(buf, &offset, &dQ);
++ qInv_len = asn1_get_int(buf, &offset, &qInv);
++
++ if (p_len <= 0 || q_len <= 0 || dP_len <= 0 || dQ_len <= 0 || qInv_len <= 0)
++ return X509_INVALID_PRIV_KEY;
++
++ RSA_priv_key_new(rsa_ctx,
++ modulus, mod_len, pub_exp, pub_len, priv_exp, priv_len,
++ p, p_len, q, p_len, dP, dP_len, dQ, dQ_len, qInv, qInv_len);
++
++ free(p);
++ free(q);
++ free(dP);
++ free(dQ);
++ free(qInv);
++#else
++ RSA_priv_key_new(rsa_ctx,
++ modulus, mod_len, pub_exp, pub_len, priv_exp, priv_len);
++#endif
++
++ free(modulus);
++ free(priv_exp);
++ free(pub_exp);
++ return X509_OK;
++}
++
++/**
++ * Get the time of a certificate. Ignore hours/minutes/seconds.
++ */
++static int asn1_get_utc_time(const uint8_t *buf, int *offset, time_t *t)
++{
++ int ret = X509_NOT_OK, len, t_offset;
++ struct tm tm;
++
++ if (buf[(*offset)++] != ASN1_UTC_TIME)
++ goto end_utc_time;
++ len = get_asn1_length(buf, offset);
++ t_offset = *offset;
++
++ memset(&tm, 0, sizeof(struct tm));
++ tm.tm_year = (buf[t_offset] - '0')*10 + (buf[t_offset+1] - '0');
++
++ if (tm.tm_year <= 50) /* 1951-2050 thing */
++ {
++ tm.tm_year += 100;
++ }
++
++ tm.tm_mon = (buf[t_offset+2] - '0')*10 + (buf[t_offset+3] - '0') - 1;
++ tm.tm_mday = (buf[t_offset+4] - '0')*10 + (buf[t_offset+5] - '0');
++ *t = mktime(&tm);
++ *offset += len;
++ ret = X509_OK;
++
++end_utc_time:
++ return ret;
++}
++
++/**
++ * Get the version type of a certificate (which we don't actually care about)
++ */
++int asn1_version(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
++{
++ int ret = X509_NOT_OK;
++
++ (*offset) += 2; /* get past explicit tag */
++ if (asn1_skip_obj(cert, offset, ASN1_INTEGER))
++ goto end_version;
++
++ ret = X509_OK;
++end_version:
++ return ret;
++}
++
++/**
++ * Retrieve the notbefore and notafter certificate times.
++ */
++int asn1_validity(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
++{
++ return (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0 ||
++ asn1_get_utc_time(cert, offset, &x509_ctx->not_before) ||
++ asn1_get_utc_time(cert, offset, &x509_ctx->not_after));
++}
++
++/**
++ * Get the components of a distinguished name
++ */
++static int asn1_get_oid_x520(const uint8_t *buf, int *offset)
++{
++ int dn_type = 0;
++ int len;
++
++ if ((len = asn1_next_obj(buf, offset, ASN1_OID)) < 0)
++ goto end_oid;
++
++ /* expect a sequence of 2.5.4.[x] where x is a one of distinguished name
++ components we are interested in. */
++ if (len == 3 && buf[(*offset)++] == 0x55 && buf[(*offset)++] == 0x04)
++ dn_type = buf[(*offset)++];
++ else
++ {
++ *offset += len; /* skip over it */
++ }
++
++end_oid:
++ return dn_type;
++}
++
++/**
++ * Obtain an ASN.1 printable string type.
++ */
++static int asn1_get_printable_str(const uint8_t *buf, int *offset, char **str)
++{
++ int len = X509_NOT_OK;
++
++ /* some certs have this awful crud in them for some reason */
++ if (buf[*offset] != ASN1_PRINTABLE_STR &&
++ buf[*offset] != ASN1_TELETEX_STR &&
++ buf[*offset] != ASN1_IA5_STR &&
++ buf[*offset] != ASN1_UNICODE_STR)
++ goto end_pnt_str;
++
++ (*offset)++;
++ len = get_asn1_length(buf, offset);
++
++ if (buf[*offset - 1] == ASN1_UNICODE_STR)
++ {
++ int i;
++ *str = (char *)malloc(len/2+1); /* allow for null */
++
++ for (i = 0; i < len; i += 2)
++ (*str)[i/2] = buf[*offset + i + 1];
++
++ (*str)[len/2] = 0; /* null terminate */
++ }
++ else
++ {
++ *str = (char *)malloc(len+1); /* allow for null */
++ memcpy(*str, &buf[*offset], len);
++ (*str)[len] = 0; /* null terminate */
++ }
++
++ *offset += len;
++
++end_pnt_str:
++ return len;
++}
++
++/**
++ * Get the subject name (or the issuer) of a certificate.
++ */
++int asn1_name(const uint8_t *cert, int *offset, char *dn[])
++{
++ int ret = X509_NOT_OK;
++ int dn_type;
++ char *tmp = NULL;
++
++ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0)
++ goto end_name;
++
++ while (asn1_next_obj(cert, offset, ASN1_SET) >= 0)
++ {
++ int i, found = 0;
++
++ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0 ||
++ (dn_type = asn1_get_oid_x520(cert, offset)) < 0)
++ goto end_name;
++
++ if (asn1_get_printable_str(cert, offset, &tmp) < 0)
++ {
++ free(tmp);
++ goto end_name;
++ }
++
++ /* find the distinguished named type */
++ for (i = 0; i < X509_NUM_DN_TYPES; i++)
++ {
++ if (dn_type == g_dn_types[i])
++ {
++ if (dn[i] == NULL)
++ {
++ dn[i] = tmp;
++ found = 1;
++ break;
++ }
++ }
++ }
++
++ if (found == 0) /* not found so get rid of it */
++ {
++ free(tmp);
++ }
++ }
++
++ ret = X509_OK;
++end_name:
++ return ret;
++}
++
++/**
++ * Read the modulus and public exponent of a certificate.
++ */
++int asn1_public_key(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
++{
++ int ret = X509_NOT_OK, mod_len, pub_len;
++ uint8_t *modulus = NULL, *pub_exp = NULL;
++
++ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0 ||
++ asn1_skip_obj(cert, offset, ASN1_SEQUENCE) ||
++ asn1_next_obj(cert, offset, ASN1_BIT_STRING) < 0)
++ goto end_pub_key;
++
++ (*offset)++; /* ignore the padding bit field */
++
++ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0)
++ goto end_pub_key;
++
++ mod_len = asn1_get_int(cert, offset, &modulus);
++ pub_len = asn1_get_int(cert, offset, &pub_exp);
++
++ RSA_pub_key_new(&x509_ctx->rsa_ctx, modulus, mod_len, pub_exp, pub_len);
++
++ free(modulus);
++ free(pub_exp);
++ ret = X509_OK;
++
++end_pub_key:
++ return ret;
++}
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++/**
++ * Read the signature of the certificate.
++ */
++int asn1_signature(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
++{
++ int ret = X509_NOT_OK;
++
++ if (cert[(*offset)++] != ASN1_BIT_STRING)
++ goto end_sig;
++
++ x509_ctx->sig_len = get_asn1_length(cert, offset)-1;
++ (*offset)++; /* ignore bit string padding bits */
++ x509_ctx->signature = (uint8_t *)malloc(x509_ctx->sig_len);
++ memcpy(x509_ctx->signature, &cert[*offset], x509_ctx->sig_len);
++ *offset += x509_ctx->sig_len;
++ ret = X509_OK;
++
++end_sig:
++ return ret;
++}
++
++/*
++ * Compare 2 distinguished name components for equality
++ * @return 0 if a match
++ */
++static int asn1_compare_dn_comp(const char *dn1, const char *dn2)
++{
++ int ret = 1;
++
++ if ((dn1 && dn2 == NULL) || (dn1 == NULL && dn2)) goto err_no_match;
++
++ ret = (dn1 && dn2) ? strcmp(dn1, dn2) : 0;
++
++err_no_match:
++ return ret;
++}
++
++/**
++ * Clean up all of the CA certificates.
++ */
++void remove_ca_certs(CA_CERT_CTX *ca_cert_ctx)
++{
++ int i = 0;
++
++ if (ca_cert_ctx == NULL)
++ return;
++
++ while (i < CONFIG_X509_MAX_CA_CERTS && ca_cert_ctx->cert[i])
++ {
++ x509_free(ca_cert_ctx->cert[i]);
++ ca_cert_ctx->cert[i++] = NULL;
++ }
++
++ free(ca_cert_ctx);
++}
++
++/*
++ * Compare 2 distinguished names for equality
++ * @return 0 if a match
++ */
++int asn1_compare_dn(char * const dn1[], char * const dn2[])
++{
++ int i;
++
++ for (i = 0; i < X509_NUM_DN_TYPES; i++)
++ {
++ if (asn1_compare_dn_comp(dn1[i], dn2[i]))
++ return 1;
++ }
++
++ return 0; /* all good */
++}
++
++#endif
++
++/**
++ * Read the signature type of the certificate. We only support RSA-MD5 and
++ * RSA-SHA1 signature types.
++ */
++int asn1_signature_type(const uint8_t *cert,
++ int *offset, X509_CTX *x509_ctx)
++{
++ int ret = X509_NOT_OK, len;
++
++ if (cert[(*offset)++] != ASN1_OID)
++ goto end_check_sig;
++
++ len = get_asn1_length(cert, offset);
++
++ if (len == 5 && memcmp(sig_iis6_oid, &cert[*offset],
++ SIG_IIS6_OID_SIZE) == 0)
++ {
++ x509_ctx->sig_type = SIG_TYPE_SHA1;
++ }
++ else
++ {
++ if (memcmp(sig_oid_prefix, &cert[*offset], SIG_OID_PREFIX_SIZE))
++ goto end_check_sig; /* unrecognised cert type */
++
++ x509_ctx->sig_type = cert[*offset + SIG_OID_PREFIX_SIZE];
++ }
++
++ *offset += len;
++ asn1_skip_obj(cert, offset, ASN1_NULL); /* if it's there */
++ ret = X509_OK;
++
++end_check_sig:
++ return ret;
++}
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/cert.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/cert.h
+new file mode 100644
+index 0000000..7a85d2d
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/cert.h
+@@ -0,0 +1,43 @@
++unsigned char default_certificate[] = {
++ 0x30, 0x82, 0x01, 0xd7, 0x30, 0x82, 0x01, 0x40, 0x02, 0x09, 0x00, 0xf1,
++ 0xc3, 0x87, 0xc0, 0xd4, 0xf4, 0x57, 0xc3, 0x30, 0x0d, 0x06, 0x09, 0x2a,
++ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x34,
++ 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x29, 0x61,
++ 0x78, 0x54, 0x4c, 0x53, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
++ 0x20, 0x44, 0x6f, 0x64, 0x67, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,
++ 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,
++ 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x36,
++ 0x30, 0x37, 0x31, 0x31, 0x34, 0x34, 0x33, 0x32, 0x5a, 0x17, 0x0d, 0x33,
++ 0x33, 0x31, 0x30, 0x32, 0x33, 0x31, 0x31, 0x34, 0x34, 0x33, 0x32, 0x5a,
++ 0x30, 0x2c, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,
++ 0x0d, 0x61, 0x78, 0x54, 0x4c, 0x53, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65,
++ 0x63, 0x74, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
++ 0x09, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x81,
++ 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
++ 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02,
++ 0x81, 0x81, 0x00, 0xd8, 0xe0, 0xbf, 0x15, 0xde, 0xea, 0xaf, 0xe8, 0xd5,
++ 0xfd, 0x0b, 0xa8, 0xa8, 0xb3, 0xd7, 0x46, 0x5d, 0xa7, 0x26, 0x6c, 0x0c,
++ 0xb5, 0xd9, 0xbc, 0xc6, 0xf8, 0xc0, 0x78, 0xd0, 0xf6, 0x56, 0x65, 0xf8,
++ 0x29, 0x48, 0x0e, 0x7b, 0x0b, 0xa6, 0x25, 0x7e, 0xe8, 0x7b, 0x79, 0x6f,
++ 0x38, 0xe5, 0xb5, 0xb7, 0xf4, 0xe0, 0x9c, 0x91, 0x60, 0xf4, 0x06, 0xf3,
++ 0x40, 0x1e, 0xf9, 0x91, 0x19, 0xa9, 0x2f, 0x47, 0x43, 0xb5, 0x9b, 0x1e,
++ 0xdc, 0xf6, 0xaa, 0x1c, 0x49, 0x79, 0x21, 0x28, 0xcb, 0xaa, 0x49, 0x73,
++ 0xd9, 0x09, 0x05, 0x4c, 0x02, 0xf2, 0x4c, 0x4d, 0x6c, 0x1c, 0x80, 0xa7,
++ 0x14, 0x91, 0x44, 0xfc, 0x12, 0xb3, 0xe1, 0xe7, 0xe3, 0x4f, 0x44, 0xba,
++ 0x8c, 0xc3, 0x74, 0x39, 0xe8, 0x4c, 0xd0, 0xd4, 0x4c, 0x24, 0x61, 0xb4,
++ 0x40, 0x95, 0x8c, 0xc0, 0x0a, 0xb7, 0x02, 0x39, 0x31, 0x85, 0x93, 0x02,
++ 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
++ 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x0b,
++ 0x47, 0x24, 0x52, 0x7d, 0xb6, 0x63, 0x78, 0xbc, 0x80, 0xdd, 0x87, 0x6c,
++ 0x90, 0x4c, 0x33, 0xc3, 0x5c, 0xa7, 0x97, 0x09, 0x1c, 0x09, 0x4f, 0x9b,
++ 0x6e, 0xb3, 0x5a, 0x3e, 0x46, 0x92, 0x1a, 0xc7, 0x87, 0x15, 0x59, 0xe1,
++ 0x88, 0x5c, 0xce, 0x6a, 0xe2, 0x96, 0xaa, 0x32, 0xec, 0xc2, 0xed, 0x78,
++ 0x8b, 0xe0, 0x90, 0x66, 0x93, 0x14, 0xc3, 0x98, 0xab, 0x33, 0x35, 0xd3,
++ 0x7d, 0x5d, 0x51, 0x0a, 0x9c, 0xb9, 0x10, 0x58, 0x47, 0x7a, 0x98, 0x95,
++ 0x64, 0xff, 0x4c, 0x5d, 0x82, 0x19, 0xf9, 0xea, 0x0f, 0x5e, 0x9a, 0xcb,
++ 0x32, 0x27, 0x64, 0xca, 0x6f, 0x58, 0x8a, 0xd0, 0xc0, 0x36, 0xf4, 0xb9,
++ 0x63, 0x34, 0xa5, 0xda, 0x36, 0x50, 0x36, 0x49, 0xd2, 0xb7, 0x3a, 0x21,
++ 0x33, 0x5b, 0x3e, 0xd6, 0x5f, 0x0c, 0x99, 0x83, 0xb7, 0xb2, 0xf7, 0x8b,
++ 0x44, 0xc4, 0x5e, 0x73, 0x41, 0xa9, 0x02
++};
++unsigned int default_certificate_len = 475;
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/crypto_misc.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/crypto_misc.h
+new file mode 100644
+index 0000000..97cb0f2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/crypto_misc.h
+@@ -0,0 +1,164 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++*/
++
++/**
++ * @file crypto_misc.h
++ */
++
++#ifndef HEADER_CRYPTO_MISC_H
++#define HEADER_CRYPTO_MISC_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include "crypto.h"
++#include "bigint.h"
++
++/**************************************************************************
++ * X509 declarations
++ **************************************************************************/
++#define X509_OK 0
++#define X509_NOT_OK -1
++#define X509_VFY_ERROR_NO_TRUSTED_CERT -2
++#define X509_VFY_ERROR_BAD_SIGNATURE -3
++#define X509_VFY_ERROR_NOT_YET_VALID -4
++#define X509_VFY_ERROR_EXPIRED -5
++#define X509_VFY_ERROR_SELF_SIGNED -6
++#define X509_VFY_ERROR_INVALID_CHAIN -7
++#define X509_VFY_ERROR_UNSUPPORTED_DIGEST -8
++#define X509_INVALID_PRIV_KEY -9
++
++/*
++ * The Distinguished Name
++ */
++#define X509_NUM_DN_TYPES 3
++#define X509_COMMON_NAME 0
++#define X509_ORGANIZATION 1
++#define X509_ORGANIZATIONAL_UNIT 2
++
++struct _x509_ctx
++{
++ char *ca_cert_dn[X509_NUM_DN_TYPES];
++ char *cert_dn[X509_NUM_DN_TYPES];
++ time_t not_before;
++ time_t not_after;
++ uint8_t *signature;
++ uint16_t sig_len;
++ uint8_t sig_type;
++ RSA_CTX *rsa_ctx;
++ bigint *digest;
++ struct _x509_ctx *next;
++};
++
++typedef struct _x509_ctx X509_CTX;
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++typedef struct
++{
++ X509_CTX *cert[CONFIG_X509_MAX_CA_CERTS];
++} CA_CERT_CTX;
++#endif
++
++int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx);
++void x509_free(X509_CTX *x509_ctx);
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++int x509_verify(const CA_CERT_CTX *ca_cert_ctx, const X509_CTX *cert);
++#endif
++#ifdef CONFIG_SSL_FULL_MODE
++void x509_print(const X509_CTX *cert, CA_CERT_CTX *ca_cert_ctx);
++const char * x509_display_error(int error);
++#endif
++
++/**************************************************************************
++ * ASN1 declarations
++ **************************************************************************/
++#define ASN1_INTEGER 0x02
++#define ASN1_BIT_STRING 0x03
++#define ASN1_OCTET_STRING 0x04
++#define ASN1_NULL 0x05
++#define ASN1_OID 0x06
++#define ASN1_PRINTABLE_STR 0x13
++#define ASN1_TELETEX_STR 0x14
++#define ASN1_IA5_STR 0x16
++#define ASN1_UTC_TIME 0x17
++#define ASN1_UNICODE_STR 0x1e
++#define ASN1_SEQUENCE 0x30
++#define ASN1_SET 0x31
++#define ASN1_IMPLICIT_TAG 0x80
++#define ASN1_EXPLICIT_TAG 0xa0
++
++#define SIG_TYPE_MD2 0x02
++#define SIG_TYPE_MD5 0x04
++#define SIG_TYPE_SHA1 0x05
++
++int get_asn1_length(const uint8_t *buf, int *offset);
++int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx);
++int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type);
++int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type);
++int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object);
++int asn1_version(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
++int asn1_validity(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
++int asn1_name(const uint8_t *cert, int *offset, char *dn[]);
++int asn1_public_key(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++int asn1_signature(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
++int asn1_compare_dn(char * const dn1[], char * const dn2[]);
++#endif
++int asn1_signature_type(const uint8_t *cert,
++ int *offset, X509_CTX *x509_ctx);
++
++/**************************************************************************
++ * MISC declarations
++ **************************************************************************/
++#define SALT_SIZE 8
++
++extern const char * const unsupported_str;
++
++typedef void (*crypt_func)(void *, const uint8_t *, uint8_t *, int);
++typedef void (*hmac_func)(const uint8_t *msg, int length, const uint8_t *key,
++ int key_len, uint8_t *digest);
++
++int get_file(const char *filename, uint8_t **buf);
++
++#if defined(CONFIG_SSL_FULL_MODE) || defined(WIN32) || defined(CONFIG_DEBUG)
++EXP_FUNC void STDCALL print_blob(const char *format, const uint8_t *data, int size, ...);
++#else
++ #define print_blob(...)
++#endif
++
++EXP_FUNC int STDCALL base64_decode(const char *in, int len,
++ uint8_t *out, int *outlen);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/gen_cert.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/gen_cert.c
+new file mode 100644
+index 0000000..94b7490
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/gen_cert.c
+@@ -0,0 +1,363 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include "config.h"
++
++#ifdef CONFIG_SSL_GENERATE_X509_CERT
++#include <string.h>
++#include <stdlib.h>
++#include "ssl.h"
++
++/**
++ * Generate a basic X.509 certificate
++ */
++
++static uint8_t set_gen_length(int len, uint8_t *buf, int *offset)
++{
++ if (len < 0x80) /* short form */
++ {
++ buf[(*offset)++] = len;
++ return 1;
++ }
++ else /* long form */
++ {
++ int i, length_bytes = 0;
++
++ if (len & 0x00FF0000)
++ length_bytes = 3;
++ else if (len & 0x0000FF00)
++ length_bytes = 2;
++ else if (len & 0x000000FF)
++ length_bytes = 1;
++
++ buf[(*offset)++] = 0x80 + length_bytes;
++
++ for (i = length_bytes-1; i >= 0; i--)
++ {
++ buf[*offset+i] = len & 0xFF;
++ len >>= 8;
++ }
++
++ *offset += length_bytes;
++ return length_bytes+1;
++ }
++}
++
++static int pre_adjust_with_size(uint8_t type,
++ int *seq_offset, uint8_t *buf, int *offset)
++{
++ buf[(*offset)++] = type;
++ *seq_offset = *offset;
++ *offset += 4; /* fill in later */
++ return *offset;
++}
++
++static void adjust_with_size(int seq_size, int seq_start,
++ uint8_t *buf, int *offset)
++{
++ uint8_t seq_byte_size;
++ int orig_seq_size = seq_size;
++ int orig_seq_start = seq_start;
++
++ seq_size = *offset-seq_size;
++ seq_byte_size = set_gen_length(seq_size, buf, &seq_start);
++
++ if (seq_byte_size != 4)
++ {
++ memmove(&buf[orig_seq_start+seq_byte_size],
++ &buf[orig_seq_size], seq_size);
++ *offset -= 4-seq_byte_size;
++ }
++}
++
++static void gen_serial_number(uint8_t *buf, int *offset)
++{
++ static const uint8_t ser_oid[] = { ASN1_INTEGER, 1, 0x7F };
++ memcpy(&buf[*offset], ser_oid , sizeof(ser_oid));
++ *offset += sizeof(ser_oid);
++}
++
++static void gen_signature_alg(uint8_t *buf, int *offset)
++{
++ /* OBJECT IDENTIFIER sha1withRSAEncryption (1 2 840 113549 1 1 5) */
++ static const uint8_t sig_oid[] =
++ {
++ ASN1_SEQUENCE, 0x0d, ASN1_OID, 0x09,
++ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
++ ASN1_NULL, 0x00
++ };
++
++ memcpy(&buf[*offset], sig_oid, sizeof(sig_oid));
++ *offset += sizeof(sig_oid);
++}
++
++static int gen_dn(const char *name, uint8_t dn_type,
++ uint8_t *buf, int *offset)
++{
++ int ret = X509_OK;
++ int name_size = strlen(name);
++
++ if (name_size > 0x70) /* just too big */
++ {
++ ret = X509_NOT_OK;
++ goto error;
++ }
++
++ buf[(*offset)++] = ASN1_SET;
++ set_gen_length(9+name_size, buf, offset);
++ buf[(*offset)++] = ASN1_SEQUENCE;
++ set_gen_length(7+name_size, buf, offset);
++ buf[(*offset)++] = ASN1_OID;
++ buf[(*offset)++] = 3;
++ buf[(*offset)++] = 0x55;
++ buf[(*offset)++] = 0x04;
++ buf[(*offset)++] = dn_type;
++ buf[(*offset)++] = ASN1_PRINTABLE_STR;
++ buf[(*offset)++] = name_size;
++ strcpy(&buf[*offset], name);
++ *offset += name_size;
++
++error:
++ return ret;
++}
++
++static int gen_issuer(const char * dn[], uint8_t *buf, int *offset)
++{
++ int ret = X509_OK;
++ int seq_offset;
++ int seq_size = pre_adjust_with_size(
++ ASN1_SEQUENCE, &seq_offset, buf, offset);
++ char fqdn[128];
++
++ /* we need the common name, so if not configured, work out the fully
++ * qualified domain name */
++ if (dn[X509_COMMON_NAME] == NULL || strlen(dn[X509_COMMON_NAME]) == 0)
++ {
++ int fqdn_len;
++ gethostname(fqdn, sizeof(fqdn));
++ fqdn_len = strlen(fqdn);
++ fqdn[fqdn_len++] = '.';
++ getdomainname(&fqdn[fqdn_len], sizeof(fqdn)-fqdn_len);
++ fqdn_len = strlen(fqdn);
++
++ if (fqdn[fqdn_len-1] == '.') /* ensure '.' is not last char */
++ fqdn[fqdn_len-1] = 0;
++
++ dn[X509_COMMON_NAME] = fqdn;
++ }
++
++ if ((ret = gen_dn(dn[X509_COMMON_NAME], 3, buf, offset)))
++ goto error;
++
++ if (dn[X509_ORGANIZATION] != NULL && strlen(dn[X509_ORGANIZATION]) > 0)
++ {
++ if ((ret = gen_dn(dn[X509_ORGANIZATION], 10, buf, offset)))
++ goto error;
++ }
++
++ if (dn[X509_ORGANIZATIONAL_UNIT] != NULL &&
++ strlen(dn[X509_ORGANIZATIONAL_UNIT]) > 0)
++ {
++ if ((ret = gen_dn(dn[X509_ORGANIZATIONAL_UNIT], 11, buf, offset)))
++ goto error;
++ }
++
++ adjust_with_size(seq_size, seq_offset, buf, offset);
++
++error:
++ return ret;
++}
++
++static void gen_utc_time(uint8_t *buf, int *offset)
++{
++ static const uint8_t time_seq[] =
++ {
++ ASN1_SEQUENCE, 30,
++ ASN1_UTC_TIME, 13,
++ '0', '7', '0', '1', '0', '1', '0', '0', '0', '0', '0', '0', 'Z',
++ ASN1_UTC_TIME, 13, /* make it good for 30 or so years */
++ '3', '8', '0', '1', '0', '1', '0', '0', '0', '0', '0', '0', 'Z'
++ };
++
++ /* fixed time */
++ memcpy(&buf[*offset], time_seq, sizeof(time_seq));
++ *offset += sizeof(time_seq);
++}
++
++static void gen_pub_key2(const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset)
++{
++ static const uint8_t pub_key_seq[] =
++ {
++ ASN1_INTEGER, 0x03, 0x01, 0x00, 0x01 /* INTEGER 65537 */
++ };
++
++ int seq_offset;
++ int pub_key_size = rsa_ctx->num_octets;
++ uint8_t *block = (uint8_t *)alloca(pub_key_size);
++ int seq_size = pre_adjust_with_size(
++ ASN1_SEQUENCE, &seq_offset, buf, offset);
++ buf[(*offset)++] = ASN1_INTEGER;
++ bi_export(rsa_ctx->bi_ctx, rsa_ctx->m, block, pub_key_size);
++
++ if (*block & 0x80) /* make integer positive */
++ {
++ set_gen_length(pub_key_size+1, buf, offset);
++ buf[(*offset)++] = 0;
++ }
++ else
++ set_gen_length(pub_key_size, buf, offset);
++
++ memcpy(&buf[*offset], block, pub_key_size);
++ *offset += pub_key_size;
++ memcpy(&buf[*offset], pub_key_seq, sizeof(pub_key_seq));
++ *offset += sizeof(pub_key_seq);
++ adjust_with_size(seq_size, seq_offset, buf, offset);
++}
++
++static void gen_pub_key1(const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset)
++{
++ int seq_offset;
++ int seq_size = pre_adjust_with_size(
++ ASN1_BIT_STRING, &seq_offset, buf, offset);
++ buf[(*offset)++] = 0; /* bit string is multiple of 8 */
++ gen_pub_key2(rsa_ctx, buf, offset);
++ adjust_with_size(seq_size, seq_offset, buf, offset);
++}
++
++static void gen_pub_key(const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset)
++{
++ /* OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1) */
++ static const uint8_t rsa_enc_oid[] =
++ {
++ ASN1_SEQUENCE, 0x0d, ASN1_OID, 0x09,
++ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
++ ASN1_NULL, 0x00
++ };
++
++ int seq_offset;
++ int seq_size = pre_adjust_with_size(
++ ASN1_SEQUENCE, &seq_offset, buf, offset);
++
++ memcpy(&buf[*offset], rsa_enc_oid, sizeof(rsa_enc_oid));
++ *offset += sizeof(rsa_enc_oid);
++ gen_pub_key1(rsa_ctx, buf, offset);
++ adjust_with_size(seq_size, seq_offset, buf, offset);
++}
++
++static void gen_signature(const RSA_CTX *rsa_ctx, const uint8_t *sha_dgst,
++ uint8_t *buf, int *offset)
++{
++ static const uint8_t asn1_sig[] =
++ {
++ ASN1_SEQUENCE, 0x21, ASN1_SEQUENCE, 0x09, ASN1_OID, 0x05,
++ 0x2b, 0x0e, 0x03, 0x02, 0x1a, /* sha1 (1 3 14 3 2 26) */
++ ASN1_NULL, 0x00, ASN1_OCTET_STRING, 0x14
++ };
++
++ uint8_t *enc_block = (uint8_t *)alloca(rsa_ctx->num_octets);
++ uint8_t *block = (uint8_t *)alloca(sizeof(asn1_sig) + SHA1_SIZE);
++ int sig_size;
++
++ /* add the digest as an embedded asn.1 sequence */
++ memcpy(block, asn1_sig, sizeof(asn1_sig));
++ memcpy(&block[sizeof(asn1_sig)], sha_dgst, SHA1_SIZE);
++
++ sig_size = RSA_encrypt(rsa_ctx, block,
++ sizeof(asn1_sig) + SHA1_SIZE, enc_block, 1);
++
++ buf[(*offset)++] = ASN1_BIT_STRING;
++ set_gen_length(sig_size+1, buf, offset);
++ buf[(*offset)++] = 0; /* bit string is multiple of 8 */
++ memcpy(&buf[*offset], enc_block, sig_size);
++ *offset += sig_size;
++}
++
++static int gen_tbs_cert(const char * dn[],
++ const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset,
++ uint8_t *sha_dgst)
++{
++ int ret = X509_OK;
++ SHA1_CTX sha_ctx;
++ int seq_offset;
++ int begin_tbs = *offset;
++ int seq_size = pre_adjust_with_size(
++ ASN1_SEQUENCE, &seq_offset, buf, offset);
++
++ gen_serial_number(buf, offset);
++ gen_signature_alg(buf, offset);
++
++ /* CA certicate issuer */
++ if ((ret = gen_issuer(dn, buf, offset)))
++ goto error;
++
++ gen_utc_time(buf, offset);
++
++ /* certificate issuer */
++ if ((ret = gen_issuer(dn, buf, offset)))
++ goto error;
++
++ gen_pub_key(rsa_ctx, buf, offset);
++ adjust_with_size(seq_size, seq_offset, buf, offset);
++
++ SHA1_Init(&sha_ctx);
++ SHA1_Update(&sha_ctx, &buf[begin_tbs], *offset-begin_tbs);
++ SHA1_Final(sha_dgst, &sha_ctx);
++
++error:
++ return ret;
++}
++
++/**
++ * Create a new certificate.
++ */
++EXP_FUNC int STDCALL ssl_x509_create(SSL_CTX *ssl_ctx, uint32_t options, const char * dn[], uint8_t **cert_data)
++{
++ int ret = X509_OK, offset = 0, seq_offset;
++ /* allocate enough space to load a new certificate */
++ uint8_t *buf = (uint8_t *)alloca(ssl_ctx->rsa_ctx->num_octets*2 + 512);
++ uint8_t sha_dgst[SHA1_SIZE];
++ int seq_size = pre_adjust_with_size(ASN1_SEQUENCE,
++ &seq_offset, buf, &offset);
++
++ if ((ret = gen_tbs_cert(dn, ssl_ctx->rsa_ctx, buf, &offset, sha_dgst)) < 0)
++ goto error;
++
++ gen_signature_alg(buf, &offset);
++ gen_signature(ssl_ctx->rsa_ctx, sha_dgst, buf, &offset);
++ adjust_with_size(seq_size, seq_offset, buf, &offset);
++ *cert_data = (uint8_t *)malloc(offset); /* create the exact memory for it */
++ memcpy(*cert_data, buf, offset);
++
++error:
++ return ret < 0 ? ret : offset;
++}
++
++#endif
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/loader.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/loader.c
+new file mode 100644
+index 0000000..4232f7e
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/loader.c
+@@ -0,0 +1,465 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * Load certificates/keys into memory. These can be in many different formats.
++ * PEM support and other formats can be processed here.
++ *
++ * The PEM private keys may be optionally encrypted with AES128 or AES256.
++ * The encrypted PEM keys were generated with something like:
++ *
++ * openssl genrsa -aes128 -passout pass:abcd -out axTLS.key_aes128.pem 512
++ */
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++
++#include "ssl.h"
++
++static int do_obj(SSL_CTX *ssl_ctx, int obj_type,
++ SSLObjLoader *ssl_obj, const char *password);
++#ifdef CONFIG_SSL_HAS_PEM
++static int ssl_obj_PEM_load(SSL_CTX *ssl_ctx, int obj_type,
++ SSLObjLoader *ssl_obj, const char *password);
++#endif
++
++/*
++ * Load a file into memory that is in binary DER (or ascii PEM) format.
++ */
++EXP_FUNC int STDCALL ssl_obj_load(SSL_CTX *ssl_ctx, int obj_type,
++ const char *filename, const char *password)
++{
++#ifndef CONFIG_SSL_SKELETON_MODE
++ static const char * const begin = "-----BEGIN";
++ int ret = SSL_OK;
++ SSLObjLoader *ssl_obj = NULL;
++
++ if (filename == NULL)
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto error;
++ }
++
++ ssl_obj = (SSLObjLoader *)calloc(1, sizeof(SSLObjLoader));
++ ssl_obj->len = get_file(filename, &ssl_obj->buf);
++ if (ssl_obj->len <= 0)
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto error;
++ }
++
++ /* is the file a PEM file? */
++ if (strncmp((char *)ssl_obj->buf, begin, strlen(begin)) == 0)
++ {
++#ifdef CONFIG_SSL_HAS_PEM
++ ret = ssl_obj_PEM_load(ssl_ctx, obj_type, ssl_obj, password);
++#else
++ printf(unsupported_str);
++ ret = SSL_ERROR_NOT_SUPPORTED;
++#endif
++ }
++ else
++ ret = do_obj(ssl_ctx, obj_type, ssl_obj, password);
++
++error:
++ ssl_obj_free(ssl_obj);
++ return ret;
++#else
++ printf(unsupported_str);
++ return SSL_ERROR_NOT_SUPPORTED;
++#endif /* CONFIG_SSL_SKELETON_MODE */
++}
++
++/*
++ * Transfer binary data into the object loader.
++ */
++EXP_FUNC int STDCALL ssl_obj_memory_load(SSL_CTX *ssl_ctx, int mem_type,
++ const uint8_t *data, int len, const char *password)
++{
++ int ret;
++ SSLObjLoader *ssl_obj;
++
++ ssl_obj = (SSLObjLoader *)calloc(1, sizeof(SSLObjLoader));
++ ssl_obj->buf = (uint8_t *)malloc(len);
++ memcpy(ssl_obj->buf, data, len);
++ ssl_obj->len = len;
++ ret = do_obj(ssl_ctx, mem_type, ssl_obj, password);
++ ssl_obj_free(ssl_obj);
++ return ret;
++}
++
++/*
++ * Actually work out what we are doing
++ */
++static int do_obj(SSL_CTX *ssl_ctx, int obj_type,
++ SSLObjLoader *ssl_obj, const char *password)
++{
++ int ret = SSL_OK;
++
++ switch (obj_type)
++ {
++ case SSL_OBJ_RSA_KEY:
++ ret = add_private_key(ssl_ctx, ssl_obj);
++ break;
++
++ case SSL_OBJ_X509_CERT:
++ ret = add_cert(ssl_ctx, ssl_obj->buf, ssl_obj->len);
++ break;
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ case SSL_OBJ_X509_CACERT:
++ ret = add_cert_auth(ssl_ctx, ssl_obj->buf, ssl_obj->len);
++ break;
++#endif
++
++#ifdef CONFIG_SSL_USE_PKCS12
++ case SSL_OBJ_PKCS8:
++ ret = pkcs8_decode(ssl_ctx, ssl_obj, password);
++ break;
++
++ case SSL_OBJ_PKCS12:
++ ret = pkcs12_decode(ssl_ctx, ssl_obj, password);
++ break;
++#endif
++ default:
++ printf(unsupported_str);
++ ret = SSL_ERROR_NOT_SUPPORTED;
++ break;
++ }
++
++ return ret;
++}
++
++/*
++ * Clean up our mess.
++ */
++void ssl_obj_free(SSLObjLoader *ssl_obj)
++{
++ if (ssl_obj)
++ {
++ free(ssl_obj->buf);
++ free(ssl_obj);
++ }
++}
++
++/*
++ * Support for PEM encoded keys/certificates.
++ */
++#ifdef CONFIG_SSL_HAS_PEM
++
++#define NUM_PEM_TYPES 3
++#define IV_SIZE 16
++#define IS_RSA_PRIVATE_KEY 0
++#define IS_ENCRYPTED_PRIVATE_KEY 1
++#define IS_CERTIFICATE 2
++
++static const char * const begins[NUM_PEM_TYPES] =
++{
++ "-----BEGIN RSA PRIVATE KEY-----",
++ "-----BEGIN ENCRYPTED PRIVATE KEY-----",
++ "-----BEGIN CERTIFICATE-----",
++};
++
++static const char * const ends[NUM_PEM_TYPES] =
++{
++ "-----END RSA PRIVATE KEY-----",
++ "-----END ENCRYPTED PRIVATE KEY-----",
++ "-----END CERTIFICATE-----",
++};
++
++static const char * const aes_str[2] =
++{
++ "DEK-Info: AES-128-CBC,",
++ "DEK-Info: AES-256-CBC,"
++};
++
++/**
++ * Take a base64 blob of data and decrypt it (using AES) into its
++ * proper ASN.1 form.
++ */
++static int pem_decrypt(const char *where, const char *end,
++ const char *password, SSLObjLoader *ssl_obj)
++{
++ int ret = -1;
++ int is_aes_256 = 0;
++ char *start = NULL;
++ uint8_t iv[IV_SIZE];
++ int i, pem_size;
++ MD5_CTX md5_ctx;
++ AES_CTX aes_ctx;
++ uint8_t key[32]; /* AES256 size */
++
++ if (password == NULL || strlen(password) == 0)
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("Error: Need a password for this PEM file\n"); TTY_FLUSH();
++#endif
++ goto error;
++ }
++
++ if ((start = strstr((const char *)where, aes_str[0]))) /* AES128? */
++ {
++ start += strlen(aes_str[0]);
++ }
++ else if ((start = strstr((const char *)where, aes_str[1]))) /* AES256? */
++ {
++ is_aes_256 = 1;
++ start += strlen(aes_str[1]);
++ }
++ else
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("Error: Unsupported password cipher\n"); TTY_FLUSH();
++#endif
++ goto error;
++ }
++
++ /* convert from hex to binary - assumes uppercase hex */
++ for (i = 0; i < IV_SIZE; i++)
++ {
++ char c = *start++ - '0';
++ iv[i] = (c > 9 ? c + '0' - 'A' + 10 : c) << 4;
++ c = *start++ - '0';
++ iv[i] += (c > 9 ? c + '0' - 'A' + 10 : c);
++ }
++
++ while (*start == '\r' || *start == '\n')
++ start++;
++
++ /* turn base64 into binary */
++ pem_size = (int)(end-start);
++ if (base64_decode(start, pem_size, ssl_obj->buf, &ssl_obj->len) != 0)
++ goto error;
++
++ /* work out the key */
++ MD5_Init(&md5_ctx);
++ MD5_Update(&md5_ctx, (const uint8_t *)password, strlen(password));
++ MD5_Update(&md5_ctx, iv, SALT_SIZE);
++ MD5_Final(key, &md5_ctx);
++
++ if (is_aes_256)
++ {
++ MD5_Init(&md5_ctx);
++ MD5_Update(&md5_ctx, key, MD5_SIZE);
++ MD5_Update(&md5_ctx, (const uint8_t *)password, strlen(password));
++ MD5_Update(&md5_ctx, iv, SALT_SIZE);
++ MD5_Final(&key[MD5_SIZE], &md5_ctx);
++ }
++
++ /* decrypt using the key/iv */
++ AES_set_key(&aes_ctx, key, iv, is_aes_256 ? AES_MODE_256 : AES_MODE_128);
++ AES_convert_key(&aes_ctx);
++ AES_cbc_decrypt(&aes_ctx, ssl_obj->buf, ssl_obj->buf, ssl_obj->len);
++ ret = 0;
++
++error:
++ return ret;
++}
++
++/**
++ * Take a base64 blob of data and turn it into its proper ASN.1 form.
++ */
++static int new_pem_obj(SSL_CTX *ssl_ctx, int is_cacert, char *where,
++ int remain, const char *password)
++{
++ int ret = SSL_OK;
++ SSLObjLoader *ssl_obj = NULL;
++ int i, pem_size, obj_type;
++ char *start = NULL, *end = NULL;
++
++ for (i = 0; i < NUM_PEM_TYPES; i++)
++ {
++ if ((start = strstr(where, begins[i])) &&
++ (end = strstr(where, ends[i])))
++ {
++ remain -= (int)(end-start);
++ start += strlen(begins[i]);
++ pem_size = (int)(end-start);
++
++ ssl_obj = (SSLObjLoader *)calloc(1, sizeof(SSLObjLoader));
++
++ /* 4/3 bigger than what we need but so what */
++ ssl_obj->buf = (uint8_t *)calloc(1, pem_size);
++
++ if (i == IS_RSA_PRIVATE_KEY &&
++ strstr(start, "Proc-Type:") &&
++ strstr(start, "4,ENCRYPTED"))
++ {
++ /* check for encrypted PEM file */
++ if (pem_decrypt(start, end, password, ssl_obj) < 0)
++ goto error;
++ }
++ else if (base64_decode(start, pem_size,
++ ssl_obj->buf, &ssl_obj->len) != 0)
++ goto error;
++
++ switch (i)
++ {
++ case IS_RSA_PRIVATE_KEY:
++ obj_type = SSL_OBJ_RSA_KEY;
++ break;
++
++ case IS_ENCRYPTED_PRIVATE_KEY:
++ obj_type = SSL_OBJ_PKCS8;
++ break;
++
++ case IS_CERTIFICATE:
++ obj_type = is_cacert ?
++ SSL_OBJ_X509_CACERT : SSL_OBJ_X509_CERT;
++ break;
++
++ default:
++ goto error;
++ }
++
++ /* In a format we can now understand - so process it */
++ if ((ret = do_obj(ssl_ctx, obj_type, ssl_obj, password)))
++ goto error;
++
++ end += strlen(ends[i]);
++ remain -= strlen(ends[i]);
++ while (remain > 0 && (*end == '\r' || *end == '\n'))
++ {
++ end++;
++ remain--;
++ }
++
++ break;
++ }
++ }
++
++ if (i == NUM_PEM_TYPES)
++ goto error;
++
++ /* more PEM stuff to process? */
++ if (remain)
++ ret = new_pem_obj(ssl_ctx, is_cacert, end, remain, password);
++
++error:
++ ssl_obj_free(ssl_obj);
++ return ret;
++}
++
++/*
++ * Load a file into memory that is in ASCII PEM format.
++ */
++static int ssl_obj_PEM_load(SSL_CTX *ssl_ctx, int obj_type,
++ SSLObjLoader *ssl_obj, const char *password)
++{
++ char *start;
++
++ /* add a null terminator */
++ ssl_obj->len++;
++ ssl_obj->buf = (uint8_t *)realloc(ssl_obj->buf, ssl_obj->len);
++ ssl_obj->buf[ssl_obj->len-1] = 0;
++ start = (char *)ssl_obj->buf;
++ return new_pem_obj(ssl_ctx, obj_type == SSL_OBJ_X509_CACERT,
++ start, ssl_obj->len, password);
++}
++#endif /* CONFIG_SSL_HAS_PEM */
++
++/**
++ * Load the key/certificates in memory depending on compile-time and user
++ * options.
++ */
++int load_key_certs(SSL_CTX *ssl_ctx)
++{
++ int ret = SSL_OK;
++ uint32_t options = ssl_ctx->options;
++#ifdef CONFIG_SSL_GENERATE_X509_CERT
++ uint8_t *cert_data = NULL;
++ int cert_size;
++ static const char *dn[] =
++ {
++ CONFIG_SSL_X509_COMMON_NAME,
++ CONFIG_SSL_X509_ORGANIZATION_NAME,
++ CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME
++ };
++#endif
++
++ /* do the private key first */
++ if (strlen(CONFIG_SSL_PRIVATE_KEY_LOCATION) > 0)
++ {
++ if ((ret = ssl_obj_load(ssl_ctx, SSL_OBJ_RSA_KEY,
++ CONFIG_SSL_PRIVATE_KEY_LOCATION,
++ CONFIG_SSL_PRIVATE_KEY_PASSWORD)) < 0)
++ goto error;
++ }
++ else if (!(options & SSL_NO_DEFAULT_KEY))
++ {
++#if defined(CONFIG_SSL_USE_DEFAULT_KEY) || defined(CONFIG_SSL_SKELETON_MODE)
++ static const /* saves a few more bytes */
++#include "private_key.h"
++
++ ssl_obj_memory_load(ssl_ctx, SSL_OBJ_RSA_KEY, default_private_key,
++ default_private_key_len, NULL);
++#endif
++ }
++
++ /* now load the certificate */
++#ifdef CONFIG_SSL_GENERATE_X509_CERT
++ if ((cert_size = ssl_x509_create(ssl_ctx, 0, dn, &cert_data)) < 0)
++ {
++ ret = cert_size;
++ goto error;
++ }
++
++ ssl_obj_memory_load(ssl_ctx, SSL_OBJ_X509_CERT, cert_data, cert_size, NULL);
++ free(cert_data);
++#else
++ if (strlen(CONFIG_SSL_X509_CERT_LOCATION))
++ {
++ if ((ret = ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT,
++ CONFIG_SSL_X509_CERT_LOCATION, NULL)) < 0)
++ goto error;
++ }
++ else if (!(options & SSL_NO_DEFAULT_KEY))
++ {
++#if defined(CONFIG_SSL_USE_DEFAULT_KEY) || defined(CONFIG_SSL_SKELETON_MODE)
++ static const /* saves a few bytes and RAM */
++#include "cert.h"
++ ssl_obj_memory_load(ssl_ctx, SSL_OBJ_X509_CERT,
++ default_certificate, default_certificate_len, NULL);
++#endif
++ }
++#endif
++
++error:
++#ifdef CONFIG_SSL_FULL_MODE
++ if (ret)
++ {
++ printf("Error: Certificate or key not loaded\n"); TTY_FLUSH();
++ }
++#endif
++
++ return ret;
++
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/openssl.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/openssl.c
+new file mode 100644
+index 0000000..b6b9550
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/openssl.c
+@@ -0,0 +1,322 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * Enable a subset of openssl compatible functions. We don't aim to be 100%
++ * compatible - just to be able to do basic ports etc.
++ *
++ * Only really tested on mini_httpd, so I'm not too sure how extensive this
++ * port is.
++ */
++
++#include "config.h"
++
++#ifdef CONFIG_OPENSSL_COMPATIBLE
++#include <stdlib.h>
++#include <string.h>
++#include <stdarg.h>
++#include "ssl.h"
++
++#define OPENSSL_CTX_ATTR ((OPENSSL_CTX *)ssl_ctx->bonus_attr)
++
++static char *key_password = NULL;
++
++void *SSLv23_server_method(void) { return NULL; }
++void *SSLv3_server_method(void) { return NULL; }
++void *TLSv1_server_method(void) { return NULL; }
++void *SSLv23_client_method(void) { return NULL; }
++void *SSLv3_client_method(void) { return NULL; }
++void *TLSv1_client_method(void) { return NULL; }
++
++typedef void * (*ssl_func_type_t)(void);
++typedef void * (*bio_func_type_t)(void);
++
++typedef struct
++{
++ ssl_func_type_t ssl_func_type;
++} OPENSSL_CTX;
++
++SSL_CTX * SSL_CTX_new(ssl_func_type_t meth)
++{
++ SSL_CTX *ssl_ctx = ssl_ctx_new(0, 5);
++ ssl_ctx->bonus_attr = malloc(sizeof(OPENSSL_CTX));
++ OPENSSL_CTX_ATTR->ssl_func_type = meth;
++ return ssl_ctx;
++}
++
++void SSL_CTX_free(SSL_CTX * ssl_ctx)
++{
++ free(ssl_ctx->bonus_attr);
++ ssl_ctx_free(ssl_ctx);
++}
++
++SSL * SSL_new(SSL_CTX *ssl_ctx)
++{
++ SSL *ssl;
++ ssl_func_type_t ssl_func_type;
++
++ ssl = ssl_new(ssl_ctx, -1); /* fd is set later */
++ ssl_func_type = OPENSSL_CTX_ATTR->ssl_func_type;
++
++#ifdef CONFIG_SSL_ENABLE_CLIENT
++ if (ssl_func_type == SSLv23_client_method ||
++ ssl_func_type == SSLv3_client_method ||
++ ssl_func_type == TLSv1_client_method)
++ {
++ SET_SSL_FLAG(SSL_IS_CLIENT);
++ }
++ else
++#endif
++ {
++ ssl->next_state = HS_CLIENT_HELLO;
++ }
++
++ return ssl;
++}
++
++int SSL_set_fd(SSL *s, int fd)
++{
++ s->client_fd = fd;
++ return 1; /* always succeeds */
++}
++
++int SSL_accept(SSL *ssl)
++{
++ while (ssl_read(ssl, NULL) == SSL_OK)
++ {
++ if (ssl->next_state == HS_CLIENT_HELLO)
++ return 1; /* we're done */
++ }
++
++ return -1;
++}
++
++#ifdef CONFIG_SSL_ENABLE_CLIENT
++int SSL_connect(SSL *ssl)
++{
++ return do_client_connect(ssl) == SSL_OK ? 1 : -1;
++}
++#endif
++
++void SSL_free(SSL *ssl)
++{
++ ssl_free(ssl);
++}
++
++int SSL_read(SSL *ssl, void *buf, int num)
++{
++ uint8_t *read_buf;
++ int ret;
++
++ while ((ret = ssl_read(ssl, &read_buf)) == SSL_OK);
++
++ if (ret > SSL_OK)
++ {
++ memcpy(buf, read_buf, ret > num ? num : ret);
++ }
++
++ return ret;
++}
++
++int SSL_write(SSL *ssl, const void *buf, int num)
++{
++ return ssl_write(ssl, buf, num);
++}
++
++int SSL_CTX_use_certificate_file(SSL_CTX *ssl_ctx, const char *file, int type)
++{
++ return (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, file, NULL) == SSL_OK);
++}
++
++int SSL_CTX_use_PrivateKey_file(SSL_CTX *ssl_ctx, const char *file, int type)
++{
++ return (ssl_obj_load(ssl_ctx, SSL_OBJ_RSA_KEY, file, key_password) == SSL_OK);
++}
++
++int SSL_CTX_use_certificate_ASN1(SSL_CTX *ssl_ctx, int len, const uint8_t *d)
++{
++ return (ssl_obj_memory_load(ssl_ctx,
++ SSL_OBJ_X509_CERT, d, len, NULL) == SSL_OK);
++}
++
++int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx,
++ unsigned int sid_ctx_len)
++{
++ return 1;
++}
++
++int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
++{
++ return 1;
++}
++
++int SSL_CTX_use_certificate_chain_file(SSL_CTX *ssl_ctx, const char *file)
++{
++ return (ssl_obj_load(ssl_ctx,
++ SSL_OBJ_X509_CERT, file, NULL) == SSL_OK);
++}
++
++int SSL_shutdown(SSL *ssl)
++{
++ return 1;
++}
++
++/*** get/set session ***/
++SSL_SESSION *SSL_get1_session(SSL *ssl)
++{
++ return (SSL_SESSION *)ssl_get_session_id(ssl); /* note: wrong cast */
++}
++
++int SSL_set_session(SSL *ssl, SSL_SESSION *session)
++{
++ memcpy(ssl->session_id, (uint8_t *)session, SSL_SESSION_ID_SIZE);
++ return 1;
++}
++
++void SSL_SESSION_free(SSL_SESSION *session) { }
++/*** end get/set session ***/
++
++long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
++{
++ return 0;
++}
++
++void SSL_CTX_set_verify(SSL_CTX *ctx, int mode,
++ int (*verify_callback)(int, void *)) { }
++
++void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth) { }
++
++int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
++ const char *CApath)
++{
++ return 1;
++}
++
++void *SSL_load_client_CA_file(const char *file)
++{
++ return (void *)file;
++}
++
++void SSL_CTX_set_client_CA_list(SSL_CTX *ssl_ctx, void *file)
++{
++
++ ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, (const char *)file, NULL);
++}
++
++void SSLv23_method(void) { }
++
++void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, void *cb) { }
++
++void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u)
++{
++ key_password = (char *)u;
++}
++
++int SSL_peek(SSL *ssl, void *buf, int num)
++{
++ memcpy(buf, ssl->bm_data, num);
++ return num;
++}
++
++void SSL_set_bio(SSL *ssl, void *rbio, void *wbio) { }
++
++long SSL_get_verify_result(const SSL *ssl)
++{
++ return ssl_handshake_status(ssl);
++}
++
++int SSL_state(SSL *ssl)
++{
++ return 0x03; // ok state
++}
++
++/** end of could do better list */
++
++void *SSL_get_peer_certificate(const SSL *ssl)
++{
++ return &ssl->ssl_ctx->certs[0];
++}
++
++int SSL_clear(SSL *ssl)
++{
++ return 1;
++}
++
++
++int SSL_CTX_check_private_key(const SSL_CTX *ctx)
++{
++ return 1;
++}
++
++int SSL_CTX_set_cipher_list(SSL *s, const char *str)
++{
++ return 1;
++}
++
++int SSL_get_error(const SSL *ssl, int ret)
++{
++ ssl_display_error(ret);
++ return 0; /* TODO: return proper return code */
++}
++
++void SSL_CTX_set_options(SSL_CTX *ssl_ctx, int option) {}
++int SSL_library_init(void ) { return 1; }
++void SSL_load_error_strings(void ) {}
++void ERR_print_errors_fp(FILE *fp) {}
++
++#ifndef CONFIG_SSL_SKELETON_MODE
++long SSL_CTX_get_timeout(const SSL_CTX *ssl_ctx) {
++ return CONFIG_SSL_EXPIRY_TIME*3600; }
++long SSL_CTX_set_timeout(SSL_CTX *ssl_ctx, long t) {
++ return SSL_CTX_get_timeout(ssl_ctx); }
++#endif
++void BIO_printf(FILE *f, const char *format, ...)
++{
++ va_list(ap);
++ va_start(ap, format);
++ vfprintf(f, format, ap);
++ va_end(ap);
++}
++
++void* BIO_s_null(void) { return NULL; }
++FILE *BIO_new(bio_func_type_t func)
++{
++ if (func == BIO_s_null)
++ return fopen("/dev/null", "r");
++ else
++ return NULL;
++}
++
++FILE *BIO_new_fp(FILE *stream, int close_flag) { return stream; }
++int BIO_free(FILE *a) { if (a != stdout && a != stderr) fclose(a); return 1; }
++
++
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.c
+new file mode 100644
+index 0000000..6a71000
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.c
+@@ -0,0 +1,158 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * @file os_port.c
++ *
++ * OS specific functions.
++ */
++#include <time.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <stdarg.h>
++#include "os_port.h"
++
++#ifdef WIN32
++/**
++ * gettimeofday() not in Win32
++ */
++EXP_FUNC void STDCALL gettimeofday(struct timeval* t, void* timezone)
++{
++#if defined(_WIN32_WCE)
++ t->tv_sec = time(NULL);
++ t->tv_usec = 0; /* 1sec precision only */
++#else
++ struct _timeb timebuffer;
++ _ftime(&timebuffer);
++ t->tv_sec = (long)timebuffer.time;
++ t->tv_usec = 1000 * timebuffer.millitm; /* 1ms precision */
++#endif
++}
++
++/**
++ * strcasecmp() not in Win32
++ */
++EXP_FUNC int STDCALL strcasecmp(const char *s1, const char *s2)
++{
++ while (tolower(*s1) == tolower(*s2++))
++ {
++ if (*s1++ == '\0')
++ {
++ return 0;
++ }
++ }
++
++ return *(unsigned char *)s1 - *(unsigned char *)(s2 - 1);
++}
++
++
++EXP_FUNC int STDCALL getdomainname(char *buf, int buf_size)
++{
++ HKEY hKey;
++ unsigned long datatype;
++ unsigned long bufferlength = buf_size;
++
++ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
++ TEXT("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"),
++ 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
++ return -1;
++
++ RegQueryValueEx(hKey, "Domain", NULL, &datatype, buf, &bufferlength);
++ RegCloseKey(hKey);
++ return 0;
++}
++#endif
++
++#undef malloc
++#undef realloc
++#undef calloc
++
++static const char * out_of_mem_str = "out of memory";
++static const char * file_open_str = "Could not open file \"%s\"";
++
++/*
++ * Some functions that call display some error trace and then call abort().
++ * This just makes life much easier on embedded systems, since we're
++ * suffering major trauma...
++ */
++EXP_FUNC void * STDCALL ax_malloc(size_t s)
++{
++ void *x;
++
++ if ((x = malloc(s)) == NULL)
++ exit_now(out_of_mem_str);
++
++ return x;
++}
++
++EXP_FUNC void * STDCALL ax_realloc(void *y, size_t s)
++{
++ void *x;
++
++ if ((x = realloc(y, s)) == NULL)
++ exit_now(out_of_mem_str);
++
++ return x;
++}
++
++EXP_FUNC void * STDCALL ax_calloc(size_t n, size_t s)
++{
++ void *x;
++
++ if ((x = calloc(n, s)) == NULL)
++ exit_now(out_of_mem_str);
++
++ return x;
++}
++
++EXP_FUNC int STDCALL ax_open(const char *pathname, int flags)
++{
++ int x;
++
++ if ((x = open(pathname, flags)) < 0)
++ exit_now(file_open_str, pathname);
++
++ return x;
++}
++
++/**
++ * This is a call which will deliberately exit an application, but will
++ * display some information before dying.
++ */
++void exit_now(const char *format, ...)
++{
++ va_list argp;
++
++ va_start(argp, format);
++ vfprintf(stderr, format, argp);
++ va_end(argp);
++ abort();
++}
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.h
+new file mode 100644
+index 0000000..262c4dd
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.h
+@@ -0,0 +1,207 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * @file os_port.h
++ *
++ * Some stuff to minimise the differences between windows and linux/unix
++ */
++
++#ifndef HEADER_OS_PORT_H
++#define HEADER_OS_PORT_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <stdio.h>
++
++#if defined(WIN32)
++#define STDCALL __stdcall
++#define EXP_FUNC __declspec(dllexport)
++#else
++#define STDCALL
++#define EXP_FUNC
++#endif
++
++#if defined(_WIN32_WCE)
++#undef WIN32
++#define WIN32
++#endif
++
++#ifdef WIN32
++
++/* Windows CE stuff */
++#if defined(_WIN32_WCE)
++#include <basetsd.h>
++#define abort() exit(1)
++#else
++#include <io.h>
++#include <process.h>
++#include <sys/timeb.h>
++#include <fcntl.h>
++#endif /* _WIN32_WCE */
++
++#include <winsock.h>
++#include <direct.h>
++#undef getpid
++#undef open
++#undef close
++#undef sleep
++#undef gettimeofday
++#undef dup2
++#undef unlink
++
++#define SOCKET_READ(A,B,C) recv(A,B,C,0)
++#define SOCKET_WRITE(A,B,C) send(A,B,C,0)
++#define SOCKET_CLOSE(A) closesocket(A)
++#define SOCKET_BLOCK(A) u_long argp = 0; \
++ ioctlsocket(A, FIONBIO, &argp)
++#define srandom(A) srand(A)
++#define random() rand()
++#define getpid() _getpid()
++#define snprintf _snprintf
++#define open(A,B) _open(A,B)
++#define dup2(A,B) _dup2(A,B)
++#define unlink(A) _unlink(A)
++#define close(A) _close(A)
++#define read(A,B,C) _read(A,B,C)
++#define write(A,B,C) _write(A,B,C)
++#define sleep(A) Sleep(A*1000)
++#define usleep(A) Sleep(A/1000)
++#define strdup(A) _strdup(A)
++#define chroot(A) _chdir(A)
++#define chdir(A) _chdir(A)
++#define alloca(A) _alloca(A)
++#ifndef lseek
++#define lseek(A,B,C) _lseek(A,B,C)
++#endif
++
++/* This fix gets around a problem where a win32 application on a cygwin xterm
++ doesn't display regular output (until a certain buffer limit) - but it works
++ fine under a normal DOS window. This is a hack to get around the issue -
++ see http://www.khngai.com/emacs/tty.php */
++#define TTY_FLUSH() if (!_isatty(_fileno(stdout))) fflush(stdout);
++
++/*
++ * automatically build some library dependencies.
++ */
++#pragma comment(lib, "WS2_32.lib")
++#pragma comment(lib, "AdvAPI32.lib")
++
++typedef UINT8 uint8_t;
++typedef INT8 int8_t;
++typedef UINT16 uint16_t;
++typedef INT16 int16_t;
++typedef UINT32 uint32_t;
++typedef INT32 int32_t;
++typedef UINT64 uint64_t;
++typedef INT64 int64_t;
++typedef int socklen_t;
++
++EXP_FUNC void STDCALL gettimeofday(struct timeval* t,void* timezone);
++EXP_FUNC int STDCALL strcasecmp(const char *s1, const char *s2);
++EXP_FUNC int STDCALL getdomainname(char *buf, int buf_size);
++
++#else /* Not Win32 */
++
++#ifdef CONFIG_PLATFORM_SOLARIS
++#include <inttypes.h>
++#else
++#include <stdint.h>
++#endif /* Not Solaris */
++
++#include <unistd.h>
++#include <pwd.h>
++#include <netdb.h>
++#include <dirent.h>
++#include <fcntl.h>
++#include <sys/stat.h>
++#include <sys/time.h>
++#include <sys/socket.h>
++#include <sys/wait.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
++
++#define SOCKET_READ(A,B,C) read(A,B,C)
++#define SOCKET_WRITE(A,B,C) write(A,B,C)
++#define SOCKET_CLOSE(A) close(A)
++#define SOCKET_BLOCK(A) int fd = fcntl(A, F_GETFL, NULL); \
++ fcntl(A, F_SETFL, fd & ~O_NONBLOCK)
++#define TTY_FLUSH()
++
++#endif /* Not Win32 */
++
++/* some functions to mutate the way these work */
++#define malloc(A) ax_malloc(A)
++#ifndef realloc
++#define realloc(A,B) ax_realloc(A,B)
++#endif
++#define calloc(A,B) ax_calloc(A,B)
++
++EXP_FUNC void * STDCALL ax_malloc(size_t s);
++EXP_FUNC void * STDCALL ax_realloc(void *y, size_t s);
++EXP_FUNC void * STDCALL ax_calloc(size_t n, size_t s);
++EXP_FUNC int STDCALL ax_open(const char *pathname, int flags);
++
++#ifdef CONFIG_PLATFORM_LINUX
++void exit_now(const char *format, ...) __attribute((noreturn));
++#else
++void exit_now(const char *format, ...);
++#endif
++
++/* Mutexing definitions */
++#if defined(CONFIG_SSL_CTX_MUTEXING)
++#if defined(WIN32)
++#define SSL_CTX_MUTEX_TYPE HANDLE
++#define SSL_CTX_MUTEX_INIT(A) A=CreateMutex(0, FALSE, 0)
++#define SSL_CTX_MUTEX_DESTROY(A) CloseHandle(A)
++#define SSL_CTX_LOCK(A) WaitForSingleObject(A, INFINITE)
++#define SSL_CTX_UNLOCK(A) ReleaseMutex(A)
++#else
++#include <pthread.h>
++#define SSL_CTX_MUTEX_TYPE pthread_mutex_t
++#define SSL_CTX_MUTEX_INIT(A) pthread_mutex_init(&A, NULL)
++#define SSL_CTX_MUTEX_DESTROY(A) pthread_mutex_destroy(&A)
++#define SSL_CTX_LOCK(A) pthread_mutex_lock(&A)
++#define SSL_CTX_UNLOCK(A) pthread_mutex_unlock(&A)
++#endif
++#else /* no mutexing */
++#define SSL_CTX_MUTEX_INIT(A)
++#define SSL_CTX_MUTEX_DESTROY(A)
++#define SSL_CTX_LOCK(A)
++#define SSL_CTX_UNLOCK(A)
++#endif
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/p12.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/p12.c
+new file mode 100644
+index 0000000..6ed92e4
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/p12.c
+@@ -0,0 +1,486 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * Process PKCS#8/PKCS#12 keys.
++ *
++ * The decoding of a PKCS#12 key is fairly specific - this code was tested on a
++ * key generated with:
++ *
++ * openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem
++ * -keypbe PBE-SHA1-RC4-128 -certpbe PBE-SHA1-RC4-128
++ * -name "p12_withoutCA" -out axTLS.withoutCA.p12 -password pass:abcd
++ *
++ * or with a certificate chain:
++ *
++ * openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem
++ * -certfile axTLS.ca_x509.pem -keypbe PBE-SHA1-RC4-128 -certpbe
++ * PBE-SHA1-RC4-128 -name "p12_withCA" -out axTLS.withCA.p12 -password pass:abcd
++ *
++ * Note that the PBE has to be specified with PBE-SHA1-RC4-128. The
++ * private/public keys/certs have to use RSA encryption. Both the integrity
++ * and privacy passwords are the same.
++ *
++ * The PKCS#8 files were generated with something like:
++ *
++ * PEM format:
++ * openssl pkcs8 -in axTLS.key_512.pem -passout pass:abcd -topk8 -v1
++ * PBE-SHA1-RC4-128 -out axTLS.encrypted_pem.p8
++ *
++ * DER format:
++ * openssl pkcs8 -in axTLS.key_512.pem -passout pass:abcd -topk8 -outform DER
++ * -v1 PBE-SHA1-RC4-128 -out axTLS.encrypted.p8
++ */
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++
++#include "ssl.h"
++
++/* all commented out if not used */
++#ifdef CONFIG_SSL_USE_PKCS12
++
++#define BLOCK_SIZE 64
++#define PKCS12_KEY_ID 1
++#define PKCS12_IV_ID 2
++#define PKCS12_MAC_ID 3
++
++static char *make_uni_pass(const char *password, int *uni_pass_len);
++static int p8_decrypt(const char *uni_pass, int uni_pass_len,
++ const uint8_t *salt, int iter,
++ uint8_t *priv_key, int priv_key_len, int id);
++static int p8_add_key(SSL_CTX *ssl_ctx, uint8_t *priv_key);
++static int get_pbe_params(uint8_t *buf, int *offset,
++ const uint8_t **salt, int *iterations);
++
++/*
++ * Take a raw pkcs8 block and then decrypt it and turn it into a normal key.
++ */
++int pkcs8_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password)
++{
++ uint8_t *buf = ssl_obj->buf;
++ int len, offset = 0;
++ int iterations;
++ int ret = SSL_NOT_OK;
++ uint8_t *version = NULL;
++ const uint8_t *salt;
++ uint8_t *priv_key;
++ int uni_pass_len;
++ char *uni_pass = make_uni_pass(password, &uni_pass_len);
++
++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0)
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("Error: Invalid p8 ASN.1 file\n");
++#endif
++ goto error;
++ }
++
++ /* unencrypted key? */
++ if (asn1_get_int(buf, &offset, &version) > 0 && *version == 0)
++ {
++ ret = p8_add_key(ssl_ctx, buf);
++ goto error;
++ }
++
++ if (get_pbe_params(buf, &offset, &salt, &iterations) < 0)
++ goto error;
++
++ if ((len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0)
++ goto error;
++
++ priv_key = &buf[offset];
++
++ p8_decrypt(uni_pass, uni_pass_len, salt,
++ iterations, priv_key, len, PKCS12_KEY_ID);
++ ret = p8_add_key(ssl_ctx, priv_key);
++
++error:
++ free(version);
++ free(uni_pass);
++ return ret;
++}
++
++/*
++ * Take the unencrypted pkcs8 and turn it into a private key
++ */
++static int p8_add_key(SSL_CTX *ssl_ctx, uint8_t *priv_key)
++{
++ uint8_t *buf = priv_key;
++ int len, offset = 0;
++ int ret = SSL_NOT_OK;
++
++ /* Skip the preamble and go straight to the private key.
++ We only support rsaEncryption (1.2.840.113549.1.1.1) */
++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ asn1_skip_obj(buf, &offset, ASN1_INTEGER) < 0 ||
++ asn1_skip_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ (len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0)
++ goto error;
++
++ ret = asn1_get_private_key(&buf[offset], len, &ssl_ctx->rsa_ctx);
++
++error:
++ return ret;
++}
++
++/*
++ * Create the unicode password
++ */
++static char *make_uni_pass(const char *password, int *uni_pass_len)
++{
++ int pass_len = 0, i;
++ char *uni_pass;
++
++ if (password == NULL)
++ {
++ password = "";
++ }
++
++ uni_pass = (char *)malloc((strlen(password)+1)*2);
++
++ /* modify the password into a unicode version */
++ for (i = 0; i < (int)strlen(password); i++)
++ {
++ uni_pass[pass_len++] = 0;
++ uni_pass[pass_len++] = password[i];
++ }
++
++ uni_pass[pass_len++] = 0; /* null terminate */
++ uni_pass[pass_len++] = 0;
++ *uni_pass_len = pass_len;
++ return uni_pass;
++}
++
++/*
++ * Decrypt a pkcs8 block.
++ */
++static int p8_decrypt(const char *uni_pass, int uni_pass_len,
++ const uint8_t *salt, int iter,
++ uint8_t *priv_key, int priv_key_len, int id)
++{
++ uint8_t p[BLOCK_SIZE*2];
++ uint8_t d[BLOCK_SIZE];
++ uint8_t Ai[SHA1_SIZE];
++ SHA1_CTX sha_ctx;
++ RC4_CTX rc4_ctx;
++ int i;
++
++ for (i = 0; i < BLOCK_SIZE; i++)
++ {
++ p[i] = salt[i % SALT_SIZE];
++ p[BLOCK_SIZE+i] = uni_pass[i % uni_pass_len];
++ d[i] = id;
++ }
++
++ /* get the key - no IV since we are using RC4 */
++ SHA1_Init(&sha_ctx);
++ SHA1_Update(&sha_ctx, d, sizeof(d));
++ SHA1_Update(&sha_ctx, p, sizeof(p));
++ SHA1_Final(Ai, &sha_ctx);
++
++ for (i = 1; i < iter; i++)
++ {
++ SHA1_Init(&sha_ctx);
++ SHA1_Update(&sha_ctx, Ai, SHA1_SIZE);
++ SHA1_Final(Ai, &sha_ctx);
++ }
++
++ /* do the decryption */
++ if (id == PKCS12_KEY_ID)
++ {
++ RC4_setup(&rc4_ctx, Ai, 16);
++ RC4_crypt(&rc4_ctx, priv_key, priv_key, priv_key_len);
++ }
++ else /* MAC */
++ memcpy(priv_key, Ai, SHA1_SIZE);
++
++ return 0;
++}
++
++/*
++ * Take a raw pkcs12 block and the decrypt it and turn it into a certificate(s)
++ * and keys.
++ */
++int pkcs12_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password)
++{
++ uint8_t *buf = ssl_obj->buf;
++ int all_ok = 0, len, iterations, auth_safes_start,
++ auth_safes_end, auth_safes_len, key_offset, offset = 0;
++ int all_certs = 0;
++ uint8_t *version = NULL, *auth_safes = NULL, *cert, *orig_mac;
++ uint8_t key[SHA1_SIZE];
++ uint8_t mac[SHA1_SIZE];
++ const uint8_t *salt;
++ int uni_pass_len, ret;
++ int error_code = SSL_ERROR_NOT_SUPPORTED;
++ char *uni_pass = make_uni_pass(password, &uni_pass_len);
++ static const uint8_t pkcs_data[] = /* pkc7 data */
++ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01 };
++ static const uint8_t pkcs_encrypted[] = /* pkc7 encrypted */
++ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x06 };
++ static const uint8_t pkcs8_key_bag[] = /* 1.2.840.113549.1.12.10.1.2 */
++ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x02 };
++
++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0)
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("Error: Invalid p12 ASN.1 file\n");
++#endif
++ goto error;
++ }
++
++ if (asn1_get_int(buf, &offset, &version) < 0 || *version != 3)
++ {
++ error_code = SSL_ERROR_INVALID_VERSION;
++ goto error;
++ }
++
++ /* remove all the boring pcks7 bits */
++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 ||
++ len != sizeof(pkcs_data) ||
++ memcmp(&buf[offset], pkcs_data, sizeof(pkcs_data)))
++ goto error;
++
++ offset += len;
++
++ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 ||
++ asn1_next_obj(buf, &offset, ASN1_OCTET_STRING) < 0)
++ goto error;
++
++ /* work out the MAC start/end points (done on AuthSafes) */
++ auth_safes_start = offset;
++ auth_safes_end = offset;
++ if (asn1_skip_obj(buf, &auth_safes_end, ASN1_SEQUENCE) < 0)
++ goto error;
++
++ auth_safes_len = auth_safes_end - auth_safes_start;
++ auth_safes = malloc(auth_safes_len);
++
++ memcpy(auth_safes, &buf[auth_safes_start], auth_safes_len);
++
++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 ||
++ (len != sizeof(pkcs_encrypted) ||
++ memcmp(&buf[offset], pkcs_encrypted, sizeof(pkcs_encrypted))))
++ goto error;
++
++ offset += len;
++
++ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 ||
++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ asn1_skip_obj(buf, &offset, ASN1_INTEGER) < 0 ||
++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 ||
++ len != sizeof(pkcs_data) ||
++ memcmp(&buf[offset], pkcs_data, sizeof(pkcs_data)))
++ goto error;
++
++ offset += len;
++
++ /* work out the salt for the certificate */
++ if (get_pbe_params(buf, &offset, &salt, &iterations) < 0 ||
++ (len = asn1_next_obj(buf, &offset, ASN1_IMPLICIT_TAG)) < 0)
++ goto error;
++
++ /* decrypt the certificate */
++ cert = &buf[offset];
++ if ((ret = p8_decrypt(uni_pass, uni_pass_len, salt, iterations, cert,
++ len, PKCS12_KEY_ID)) < 0)
++ goto error;
++
++ offset += len;
++
++ /* load the certificate */
++ key_offset = 0;
++ all_certs = asn1_next_obj(cert, &key_offset, ASN1_SEQUENCE);
++
++ /* keep going until all certs are loaded */
++ while (key_offset < all_certs)
++ {
++ int cert_offset = key_offset;
++
++ if (asn1_skip_obj(cert, &cert_offset, ASN1_SEQUENCE) < 0 ||
++ asn1_next_obj(cert, &key_offset, ASN1_SEQUENCE) < 0 ||
++ asn1_skip_obj(cert, &key_offset, ASN1_OID) < 0 ||
++ asn1_next_obj(cert, &key_offset, ASN1_EXPLICIT_TAG) < 0 ||
++ asn1_next_obj(cert, &key_offset, ASN1_SEQUENCE) < 0 ||
++ asn1_skip_obj(cert, &key_offset, ASN1_OID) < 0 ||
++ asn1_next_obj(cert, &key_offset, ASN1_EXPLICIT_TAG) < 0 ||
++ (len = asn1_next_obj(cert, &key_offset, ASN1_OCTET_STRING)) < 0)
++ goto error;
++
++ if ((ret = add_cert(ssl_ctx, &cert[key_offset], len)) < 0)
++ goto error;
++
++ key_offset = cert_offset;
++ }
++
++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 ||
++ len != sizeof(pkcs_data) ||
++ memcmp(&buf[offset], pkcs_data, sizeof(pkcs_data)))
++ goto error;
++
++ offset += len;
++
++ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 ||
++ asn1_next_obj(buf, &offset, ASN1_OCTET_STRING) < 0 ||
++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 ||
++ (len != sizeof(pkcs8_key_bag)) ||
++ memcmp(&buf[offset], pkcs8_key_bag, sizeof(pkcs8_key_bag)))
++ goto error;
++
++ offset += len;
++
++ /* work out the salt for the private key */
++ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 ||
++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ get_pbe_params(buf, &offset, &salt, &iterations) < 0 ||
++ (len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0)
++ goto error;
++
++ /* decrypt the private key */
++ cert = &buf[offset];
++ if ((ret = p8_decrypt(uni_pass, uni_pass_len, salt, iterations, cert,
++ len, PKCS12_KEY_ID)) < 0)
++ goto error;
++
++ offset += len;
++
++ /* load the private key */
++ if ((ret = p8_add_key(ssl_ctx, cert)) < 0)
++ goto error;
++
++ /* miss out on friendly name, local key id etc */
++ if (asn1_skip_obj(buf, &offset, ASN1_SET) < 0)
++ goto error;
++
++ /* work out the MAC */
++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ asn1_skip_obj(buf, &offset, ASN1_SEQUENCE) < 0 ||
++ (len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0 ||
++ len != SHA1_SIZE)
++ goto error;
++
++ orig_mac = &buf[offset];
++ offset += len;
++
++ /* get the salt */
++ if ((len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0 || len != 8)
++ goto error;
++
++ salt = &buf[offset];
++
++ /* work out what the mac should be */
++ if ((ret = p8_decrypt(uni_pass, uni_pass_len, salt, iterations,
++ key, SHA1_SIZE, PKCS12_MAC_ID)) < 0)
++ goto error;
++
++ hmac_sha1(auth_safes, auth_safes_len, key, SHA1_SIZE, mac);
++
++ if (memcmp(mac, orig_mac, SHA1_SIZE))
++ {
++ error_code = SSL_ERROR_INVALID_HMAC;
++ goto error;
++ }
++
++ all_ok = 1;
++
++error:
++ free(version);
++ free(uni_pass);
++ free(auth_safes);
++ return all_ok ? SSL_OK : error_code;
++}
++
++/*
++ * Retrieve the salt/iteration details from a PBE block.
++ */
++static int get_pbe_params(uint8_t *buf, int *offset,
++ const uint8_t **salt, int *iterations)
++{
++ static const uint8_t pbeSH1RC4[] = /* pbeWithSHAAnd128BitRC4 */
++ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x01 };
++
++ int i, len;
++ uint8_t *iter = NULL;
++ int error_code = SSL_ERROR_NOT_SUPPORTED;
++
++ /* Get the PBE type */
++ if (asn1_next_obj(buf, offset, ASN1_SEQUENCE) < 0 ||
++ (len = asn1_next_obj(buf, offset, ASN1_OID)) < 0)
++ goto error;
++
++ /* we expect pbeWithSHAAnd128BitRC4 (1.2.840.113549.1.12.1.1)
++ which is the only algorithm we support */
++ if (len != sizeof(pbeSH1RC4) ||
++ memcmp(&buf[*offset], pbeSH1RC4, sizeof(pbeSH1RC4)))
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("Error: pkcs8/pkcs12 must use \"PBE-SHA1-RC4-128\"\n");
++#endif
++ goto error;
++ }
++
++ *offset += len;
++
++ if (asn1_next_obj(buf, offset, ASN1_SEQUENCE) < 0 ||
++ (len = asn1_next_obj(buf, offset, ASN1_OCTET_STRING)) < 0 ||
++ len != 8)
++ goto error;
++
++ *salt = &buf[*offset];
++ *offset += len;
++
++ if ((len = asn1_get_int(buf, offset, &iter)) < 0)
++ goto error;
++
++ *iterations = 0;
++ for (i = 0; i < len; i++)
++ {
++ (*iterations) <<= 8;
++ (*iterations) += iter[i];
++ }
++
++ free(iter);
++ error_code = SSL_OK; /* got here - we are ok */
++
++error:
++ return error_code;
++}
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/private_key.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/private_key.h
+new file mode 100644
+index 0000000..96a5253
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/private_key.h
+@@ -0,0 +1,54 @@
++unsigned char default_private_key[] = {
++ 0x30, 0x82, 0x02, 0x5d, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xd8,
++ 0xe0, 0xbf, 0x15, 0xde, 0xea, 0xaf, 0xe8, 0xd5, 0xfd, 0x0b, 0xa8, 0xa8,
++ 0xb3, 0xd7, 0x46, 0x5d, 0xa7, 0x26, 0x6c, 0x0c, 0xb5, 0xd9, 0xbc, 0xc6,
++ 0xf8, 0xc0, 0x78, 0xd0, 0xf6, 0x56, 0x65, 0xf8, 0x29, 0x48, 0x0e, 0x7b,
++ 0x0b, 0xa6, 0x25, 0x7e, 0xe8, 0x7b, 0x79, 0x6f, 0x38, 0xe5, 0xb5, 0xb7,
++ 0xf4, 0xe0, 0x9c, 0x91, 0x60, 0xf4, 0x06, 0xf3, 0x40, 0x1e, 0xf9, 0x91,
++ 0x19, 0xa9, 0x2f, 0x47, 0x43, 0xb5, 0x9b, 0x1e, 0xdc, 0xf6, 0xaa, 0x1c,
++ 0x49, 0x79, 0x21, 0x28, 0xcb, 0xaa, 0x49, 0x73, 0xd9, 0x09, 0x05, 0x4c,
++ 0x02, 0xf2, 0x4c, 0x4d, 0x6c, 0x1c, 0x80, 0xa7, 0x14, 0x91, 0x44, 0xfc,
++ 0x12, 0xb3, 0xe1, 0xe7, 0xe3, 0x4f, 0x44, 0xba, 0x8c, 0xc3, 0x74, 0x39,
++ 0xe8, 0x4c, 0xd0, 0xd4, 0x4c, 0x24, 0x61, 0xb4, 0x40, 0x95, 0x8c, 0xc0,
++ 0x0a, 0xb7, 0x02, 0x39, 0x31, 0x85, 0x93, 0x02, 0x03, 0x01, 0x00, 0x01,
++ 0x02, 0x81, 0x81, 0x00, 0x94, 0x07, 0x72, 0xe5, 0xbe, 0xad, 0x79, 0x3b,
++ 0xf7, 0x33, 0x2c, 0x8e, 0x05, 0xf8, 0x1a, 0x6b, 0xd0, 0xe8, 0x91, 0xf5,
++ 0x16, 0x07, 0xd9, 0x82, 0x5c, 0x5c, 0xd5, 0x22, 0xa1, 0x9e, 0x42, 0x02,
++ 0x7f, 0x8b, 0xcd, 0xbe, 0xf4, 0x85, 0x52, 0xf6, 0x2c, 0xd5, 0x09, 0xd2,
++ 0x2c, 0xf4, 0x2c, 0xf6, 0x07, 0x85, 0x80, 0xf9, 0xdc, 0xd0, 0xcc, 0x3f,
++ 0x22, 0x31, 0x15, 0xf3, 0x49, 0xf2, 0xb5, 0xe2, 0x69, 0x99, 0x04, 0x04,
++ 0x49, 0x21, 0xdb, 0x9f, 0xa1, 0x54, 0x5a, 0xfa, 0xe4, 0xd9, 0xf9, 0x07,
++ 0x05, 0xff, 0x9a, 0x65, 0xa4, 0xeb, 0xf2, 0x47, 0xce, 0x56, 0xc7, 0x72,
++ 0x49, 0x48, 0x5c, 0xe8, 0x14, 0xd7, 0x8f, 0x25, 0xcc, 0x49, 0x29, 0x06,
++ 0x6a, 0x54, 0x7b, 0x17, 0xdc, 0x9e, 0xd4, 0x53, 0xf0, 0xf5, 0x9e, 0x85,
++ 0x25, 0xa1, 0xeb, 0x3d, 0xe9, 0x2f, 0xb9, 0x9c, 0xf6, 0xe1, 0x80, 0x81,
++ 0x02, 0x41, 0x00, 0xee, 0x02, 0x78, 0xc7, 0x78, 0x85, 0x04, 0x97, 0xcc,
++ 0x36, 0xbd, 0xd6, 0x11, 0xe2, 0xc7, 0x39, 0xd9, 0x34, 0x51, 0x72, 0x6f,
++ 0x8a, 0x0f, 0xcd, 0x88, 0x32, 0x33, 0x9b, 0xc7, 0xa7, 0x03, 0x77, 0xd9,
++ 0x82, 0x35, 0xb6, 0xdd, 0x1f, 0xc2, 0xc1, 0x13, 0x40, 0x83, 0x55, 0xeb,
++ 0x60, 0xeb, 0x81, 0x8e, 0x0c, 0x16, 0x62, 0xb4, 0xb4, 0x3c, 0xeb, 0x08,
++ 0x80, 0x9c, 0x79, 0xd3, 0x38, 0xca, 0xf1, 0x02, 0x41, 0x00, 0xe9, 0x45,
++ 0x5f, 0x2e, 0x16, 0xcc, 0x93, 0x50, 0x40, 0xb6, 0x79, 0xbc, 0x38, 0xe0,
++ 0x56, 0x68, 0x50, 0xd3, 0x2f, 0x73, 0x8c, 0x8c, 0x2a, 0x0e, 0x81, 0x4a,
++ 0x8a, 0xbb, 0xcc, 0xf0, 0x64, 0x34, 0x46, 0x9f, 0x07, 0x7d, 0x22, 0xb6,
++ 0xf9, 0x46, 0xac, 0x57, 0x23, 0x8c, 0x1e, 0xeb, 0xd3, 0x05, 0x4d, 0xa8,
++ 0x83, 0x6a, 0x67, 0xf6, 0xa6, 0xb1, 0xab, 0x8e, 0xc1, 0xef, 0xef, 0x7d,
++ 0xf0, 0xc3, 0x02, 0x40, 0x2f, 0xc6, 0x59, 0x3e, 0x18, 0xe8, 0x02, 0x73,
++ 0x01, 0xef, 0xdf, 0x0d, 0x30, 0x4b, 0xe8, 0x17, 0xa9, 0x8c, 0xc1, 0xe8,
++ 0x89, 0x91, 0x19, 0xf8, 0xf4, 0xa4, 0xb7, 0x0d, 0x46, 0xf7, 0x34, 0x50,
++ 0x03, 0x5e, 0x0a, 0xb0, 0x29, 0x14, 0xae, 0x00, 0x19, 0x80, 0x32, 0x9c,
++ 0xb5, 0x81, 0x9f, 0xe4, 0x42, 0x82, 0x14, 0xa0, 0x3d, 0x8b, 0x8c, 0x4a,
++ 0xd5, 0x4b, 0x13, 0x9d, 0xb4, 0x93, 0x4a, 0xd1, 0x02, 0x40, 0x64, 0x8c,
++ 0x83, 0x77, 0x61, 0x5a, 0x73, 0x11, 0x3f, 0xa3, 0xa8, 0x1b, 0x8a, 0xc4,
++ 0xa0, 0x5a, 0x3c, 0xa4, 0x9b, 0x2a, 0x8a, 0x65, 0x8c, 0x67, 0x4e, 0x31,
++ 0xac, 0x55, 0x41, 0x04, 0x49, 0x9d, 0x02, 0xe7, 0xdf, 0x99, 0x7f, 0xd2,
++ 0x30, 0xe6, 0xd6, 0xb8, 0x84, 0xd9, 0x0c, 0x27, 0x08, 0x81, 0x9b, 0xb4,
++ 0xcc, 0x58, 0x9c, 0x51, 0x84, 0x0e, 0xc7, 0x6d, 0x34, 0x89, 0x50, 0xc9,
++ 0x0f, 0x73, 0x02, 0x41, 0x00, 0xda, 0xde, 0x5e, 0x1a, 0xac, 0x1d, 0x1d,
++ 0xd7, 0xb9, 0x65, 0x26, 0x00, 0xf5, 0xd4, 0xe4, 0x28, 0x84, 0x86, 0x2f,
++ 0x00, 0x9c, 0x41, 0x00, 0x52, 0xe1, 0x47, 0x91, 0xc0, 0x52, 0x05, 0x4e,
++ 0x0f, 0x2f, 0x0d, 0xca, 0x9b, 0x3d, 0x89, 0x41, 0xbf, 0xee, 0x9f, 0xa1,
++ 0xe6, 0x9d, 0xa4, 0xeb, 0x45, 0x7f, 0xe3, 0xcb, 0xa4, 0x6b, 0x0a, 0xe2,
++ 0x7e, 0xb0, 0x87, 0x5c, 0x40, 0xb1, 0x51, 0x11, 0x1d
++};
++unsigned int default_private_key_len = 609;
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/ssl.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/ssl.h
+new file mode 100644
+index 0000000..539d0a3
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/ssl.h
+@@ -0,0 +1,474 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * @mainpage axTLS API
++ *
++ * @image html axolotl.jpg
++ *
++ * The axTLS library has features such as:
++ * - The TLSv1 SSL client/server protocol
++ * - No requirement to use any openssl libraries.
++ * - A choice between AES block (128/256 bit) and RC4 (128 bit) stream ciphers.
++ * - RSA encryption/decryption with variable sized keys (up to 4096 bits).
++ * - Certificate chaining and peer authentication.
++ * - Session resumption, session renegotiation.
++ * - ASN.1, X.509, PKCS#8, PKCS#12 keys/certificates with DER/PEM encoding.
++ * - Highly configurable compile time options.
++ * - Portable across many platforms (written in ANSI C), and has language
++ * bindings in C, C#, VB.NET, Java, Perl and Lua.
++ * - Partial openssl API compatibility (via a wrapper).
++ * - A very small footprint (around 50-60kB for the library in 'server-only'
++ * mode).
++ * - No dependencies on sockets - can use serial connections for example.
++ * - A very simple API - ~ 20 functions/methods.
++ *
++ * A list of these functions/methods are described below.
++ *
++ * @ref c_api
++ *
++ * @ref bigint_api
++ *
++ * @ref csharp_api
++ *
++ * @ref java_api
++ */
++#ifndef HEADER_SSL_H
++#define HEADER_SSL_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <time.h>
++//#include "crypto.h"
++
++/* need to predefine before ssl_lib.h gets to it */
++#define SSL_SESSION_ID_SIZE 32
++
++#include "tls1.h"
++
++/* The optional parameters that can be given to the client/server SSL engine */
++#define SSL_CLIENT_AUTHENTICATION 0x00010000
++#define SSL_SERVER_VERIFY_LATER 0x00020000
++#define SSL_NO_DEFAULT_KEY 0x00040000
++#define SSL_DISPLAY_STATES 0x00080000
++#define SSL_DISPLAY_BYTES 0x00100000
++#define SSL_DISPLAY_CERTS 0x00200000
++#define SSL_DISPLAY_RSA 0x00400000
++
++/* errors that can be generated */
++#define SSL_OK 0
++#define SSL_NOT_OK -1
++#define SSL_ERROR_DEAD -2
++#define SSL_ERROR_CONN_LOST -256
++#define SSL_ERROR_SOCK_SETUP_FAILURE -258
++#define SSL_ERROR_INVALID_HANDSHAKE -260
++#define SSL_ERROR_INVALID_PROT_MSG -261
++#define SSL_ERROR_INVALID_HMAC -262
++#define SSL_ERROR_INVALID_VERSION -263
++#define SSL_ERROR_INVALID_SESSION -265
++#define SSL_ERROR_NO_CIPHER -266
++#define SSL_ERROR_BAD_CERTIFICATE -268
++#define SSL_ERROR_INVALID_KEY -269
++#define SSL_ERROR_FINISHED_INVALID -271
++#define SSL_ERROR_NO_CERT_DEFINED -272
++#define SSL_ERROR_NOT_SUPPORTED -274
++#define SSL_X509_OFFSET -512
++#define SSL_X509_ERROR(A) (SSL_X509_OFFSET+A)
++
++/* these are all the alerts that are recognized */
++#define SSL_ALERT_CLOSE_NOTIFY 0
++#define SSL_ALERT_UNEXPECTED_MESSAGE 10
++#define SSL_ALERT_BAD_RECORD_MAC 20
++#define SSL_ALERT_HANDSHAKE_FAILURE 40
++#define SSL_ALERT_BAD_CERTIFICATE 42
++#define SSL_ALERT_ILLEGAL_PARAMETER 47
++#define SSL_ALERT_DECODE_ERROR 50
++#define SSL_ALERT_DECRYPT_ERROR 51
++#define SSL_ALERT_INVALID_VERSION 70
++
++/* The ciphers that are supported */
++#define SSL_AES128_SHA 0x2f
++#define SSL_AES256_SHA 0x35
++#define SSL_RC4_128_SHA 0x05
++#define SSL_RC4_128_MD5 0x04
++
++/* build mode ids' */
++#define SSL_BUILD_SKELETON_MODE 0x01
++#define SSL_BUILD_SERVER_ONLY 0x02
++#define SSL_BUILD_ENABLE_VERIFICATION 0x03
++#define SSL_BUILD_ENABLE_CLIENT 0x04
++#define SSL_BUILD_FULL_MODE 0x05
++
++/* offsets to retrieve configuration information */
++#define SSL_BUILD_MODE 0
++#define SSL_MAX_CERT_CFG_OFFSET 1
++#define SSL_MAX_CA_CERT_CFG_OFFSET 2
++#define SSL_HAS_PEM 3
++
++/* default session sizes */
++#define SSL_DEFAULT_SVR_SESS 5
++#define SSL_DEFAULT_CLNT_SESS 1
++
++/* X.509/X.520 distinguished name types */
++#define SSL_X509_CERT_COMMON_NAME 0
++#define SSL_X509_CERT_ORGANIZATION 1
++#define SSL_X509_CERT_ORGANIZATIONAL_NAME 2
++#define SSL_X509_CA_CERT_COMMON_NAME 3
++#define SSL_X509_CA_CERT_ORGANIZATION 4
++#define SSL_X509_CA_CERT_ORGANIZATIONAL_NAME 5
++
++/* SSL object loader types */
++#define SSL_OBJ_X509_CERT 1
++#define SSL_OBJ_X509_CACERT 2
++#define SSL_OBJ_RSA_KEY 3
++#define SSL_OBJ_PKCS8 4
++#define SSL_OBJ_PKCS12 5
++
++/**
++ * @defgroup c_api Standard C API
++ * @brief The standard interface in C.
++ * @{
++ */
++
++/**
++ * @brief Establish a new client/server context.
++ *
++ * This function is called before any client/server SSL connections are made.
++ *
++ * Each new connection will use the this context's private key and
++ * certificate chain. If a different certificate chain is required, then a
++ * different context needs to be be used.
++ *
++ * There are two threading models supported - a single thread with one
++ * SSL_CTX can support any number of SSL connections - and multiple threads can
++ * support one SSL_CTX object each (the default). But if a single SSL_CTX
++ * object uses many SSL objects in individual threads, then the
++ * CONFIG_SSL_CTX_MUTEXING option needs to be configured.
++ *
++ * @param options [in] Any particular options. At present the options
++ * supported are:
++ * - SSL_SERVER_VERIFY_LATER (client only): Don't stop a handshake if the server
++ * authentication fails. The certificate can be authenticated later with a
++ * call to ssl_verify_cert().
++ * - SSL_CLIENT_AUTHENTICATION (server only): Enforce client authentication
++ * i.e. each handshake will include a "certificate request" message from the
++ * server. Only available if verification has been enabled.
++ * - SSL_DISPLAY_BYTES (full mode build only): Display the byte sequences
++ * during the handshake.
++ * - SSL_DISPLAY_STATES (full mode build only): Display the state changes
++ * during the handshake.
++ * - SSL_DISPLAY_CERTS (full mode build only): Display the certificates that
++ * are passed during a handshake.
++ * - SSL_DISPLAY_RSA (full mode build only): Display the RSA key details that
++ * are passed during a handshake.
++ *
++ * @param num_sessions [in] The number of sessions to be used for session
++ * caching. If this value is 0, then there is no session caching. This option
++ * is not used in skeleton mode.
++ * @return A client/server context.
++ */
++EXP_FUNC SSL_CTX * STDCALL ssl_ctx_new(uint32_t options, int num_sessions);
++
++/**
++ * @brief Remove a client/server context.
++ *
++ * Frees any used resources used by this context. Each connection will be
++ * sent a "Close Notify" alert (if possible).
++ * @param ssl_ctx [in] The client/server context.
++ */
++EXP_FUNC void STDCALL ssl_ctx_free(SSL_CTX *ssl_ctx);
++
++/**
++ * @brief (server only) Establish a new SSL connection to an SSL client.
++ *
++ * It is up to the application to establish the logical connection (whether it
++ * is a socket, serial connection etc).
++ * @param ssl_ctx [in] The server context.
++ * @param client_fd [in] The client's file descriptor.
++ * @return An SSL object reference.
++ */
++EXP_FUNC SSL * STDCALL ssl_server_new(SSL_CTX *ssl_ctx, int client_fd);
++
++/**
++ * @brief (client only) Establish a new SSL connection to an SSL server.
++ *
++ * It is up to the application to establish the initial logical connection
++ * (whether it is a socket, serial connection etc).
++ *
++ * This is a blocking call - it will finish when the handshake is complete (or
++ * has failed).
++ * @param ssl_ctx [in] The client context.
++ * @param client_fd [in] The client's file descriptor.
++ * @param session_id [in] A 32 byte session id for session resumption. This
++ * can be null if no session resumption is being used or required. This option
++ * is not used in skeleton mode.
++ * @param sess_id_size The size of the session id (max 32)
++ * @return An SSL object reference. Use ssl_handshake_status() to check
++ * if a handshake succeeded.
++ */
++EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, int client_fd, const uint8_t *session_id, uint8_t sess_id_size);
++
++/**
++ * @brief Free any used resources on this connection.
++
++ * A "Close Notify" message is sent on this connection (if possible). It is up
++ * to the application to close the socket or file descriptor.
++ * @param ssl [in] The ssl object reference.
++ */
++EXP_FUNC void STDCALL ssl_free(SSL *ssl);
++
++/**
++ * @brief Read the SSL data stream.
++ * The socket must be in blocking mode.
++ * @param ssl [in] An SSL object reference.
++ * @param in_data [out] If the read was successful, a pointer to the read
++ * buffer will be here. Do NOT ever free this memory as this buffer is used in
++ * sucessive calls. If the call was unsuccessful, this value will be null.
++ * @return The number of decrypted bytes:
++ * - if > 0, then the handshaking is complete and we are returning the number
++ * of decrypted bytes.
++ * - SSL_OK if the handshaking stage is successful (but not yet complete).
++ * - < 0 if an error.
++ * @see ssl.h for the error code list.
++ * @note Use in_data before doing any successive ssl calls.
++ */
++EXP_FUNC int STDCALL ssl_read(SSL *ssl, uint8_t **in_data);
++
++/**
++ * @brief Write to the SSL data stream.
++ * The socket must be in blocking mode.
++ * @param ssl [in] An SSL obect reference.
++ * @param out_data [in] The data to be written
++ * @param out_len [in] The number of bytes to be written.
++ * @return The number of bytes sent, or if < 0 if an error.
++ * @see ssl.h for the error code list.
++ */
++EXP_FUNC int STDCALL ssl_write(SSL *ssl, const uint8_t *out_data, int out_len);
++
++/**
++ * @brief Find an ssl object based on a file descriptor.
++ *
++ * Goes through the list of SSL objects maintained in a client/server context
++ * to look for a file descriptor match.
++ * @param ssl_ctx [in] The client/server context.
++ * @param client_fd [in] The file descriptor.
++ * @return A reference to the SSL object. Returns null if the object could not
++ * be found.
++ */
++EXP_FUNC SSL * STDCALL ssl_find(SSL_CTX *ssl_ctx, int client_fd);
++
++/**
++ * @brief Get the session id for a handshake.
++ *
++ * This will be a 32 byte sequence and is available after the first
++ * handshaking messages are sent.
++ * @param ssl [in] An SSL object reference.
++ * @return The session id as a 32 byte sequence.
++ * @note A SSLv23 handshake may have only 16 valid bytes.
++ */
++EXP_FUNC const uint8_t * STDCALL ssl_get_session_id(const SSL *ssl);
++
++/**
++ * @brief Get the session id size for a handshake.
++ *
++ * This will normally be 32 but could be 0 (no session id) or something else.
++ * @param ssl [in] An SSL object reference.
++ * @return The size of the session id.
++ */
++EXP_FUNC uint8_t STDCALL ssl_get_session_id_size(const SSL *ssl);
++
++/**
++ * @brief Return the cipher id (in the SSL form).
++ * @param ssl [in] An SSL object reference.
++ * @return The cipher id. This will be one of the following:
++ * - SSL_AES128_SHA (0x2f)
++ * - SSL_AES256_SHA (0x35)
++ * - SSL_RC4_128_SHA (0x05)
++ * - SSL_RC4_128_MD5 (0x04)
++ */
++EXP_FUNC uint8_t STDCALL ssl_get_cipher_id(const SSL *ssl);
++
++/**
++ * @brief Return the status of the handshake.
++ * @param ssl [in] An SSL object reference.
++ * @return SSL_OK if the handshake is complete and ok.
++ * @see ssl.h for the error code list.
++ */
++EXP_FUNC int STDCALL ssl_handshake_status(const SSL *ssl);
++
++/**
++ * @brief Retrieve various parameters about the axTLS engine.
++ * @param offset [in] The configuration offset. It will be one of the following:
++ * - SSL_BUILD_MODE The build mode. This will be one of the following:
++ * - SSL_BUILD_SERVER_ONLY (basic server mode)
++ * - SSL_BUILD_ENABLE_VERIFICATION (server can do client authentication)
++ * - SSL_BUILD_ENABLE_CLIENT (client/server capabilties)
++ * - SSL_BUILD_FULL_MODE (client/server with diagnostics)
++ * - SSL_BUILD_SKELETON_MODE (skeleton mode)
++ * - SSL_MAX_CERT_CFG_OFFSET The maximum number of certificates allowed.
++ * - SSL_MAX_CA_CERT_CFG_OFFSET The maximum number of CA certificates allowed.
++ * - SSL_HAS_PEM 1 if supported
++ * @return The value of the requested parameter.
++ */
++EXP_FUNC int STDCALL ssl_get_config(int offset);
++
++/**
++ * @brief Display why the handshake failed.
++ *
++ * This call is only useful in a 'full mode' build. The output is to stdout.
++ * @param error_code [in] An error code.
++ * @see ssl.h for the error code list.
++ */
++EXP_FUNC void STDCALL ssl_display_error(int error_code);
++
++/**
++ * @brief Authenticate a received certificate.
++ *
++ * This call is usually made by a client after a handshake is complete and the
++ * context is in SSL_SERVER_VERIFY_LATER mode.
++ * @param ssl [in] An SSL object reference.
++ * @return SSL_OK if the certificate is verified.
++ */
++EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl);
++
++/**
++ * @brief Retrieve an X.509 distinguished name component.
++ *
++ * When a handshake is complete and a certificate has been exchanged, then the
++ * details of the remote certificate can be retrieved.
++ *
++ * This will usually be used by a client to check that the server's common
++ * name matches the URL.
++ *
++ * A full handshake needs to occur for this call to work properly.
++ *
++ * @param ssl [in] An SSL object reference.
++ * @param component [in] one of:
++ * - SSL_X509_CERT_COMMON_NAME
++ * - SSL_X509_CERT_ORGANIZATION
++ * - SSL_X509_CERT_ORGANIZATIONAL_NAME
++ * - SSL_X509_CA_CERT_COMMON_NAME
++ * - SSL_X509_CA_CERT_ORGANIZATION
++ * - SSL_X509_CA_CERT_ORGANIZATIONAL_NAME
++ * @return The appropriate string (or null if not defined)
++ * @note Verification build mode must be enabled.
++ */
++EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component);
++
++/**
++ * @brief Force the client to perform its handshake again.
++ *
++ * For a client this involves sending another "client hello" message.
++ * For the server is means sending a "hello request" message.
++ *
++ * This is a blocking call on the client (until the handshake completes).
++ *
++ * @param ssl [in] An SSL object reference.
++ * @return SSL_OK if renegotiation instantiation was ok
++ */
++EXP_FUNC int STDCALL ssl_renegotiate(SSL *ssl);
++
++/**
++ * @brief Process a file that is in binary DER or ASCII PEM format.
++ *
++ * These are temporary objects that are used to load private keys,
++ * certificates etc into memory.
++ * @param ssl_ctx [in] The client/server context.
++ * @param obj_type [in] The format of the file. Can be one of:
++ * - SSL_OBJ_X509_CERT (no password required)
++ * - SSL_OBJ_X509_CACERT (no password required)
++ * - SSL_OBJ_RSA_KEY (AES128/AES256 PEM encryption supported)
++ * - SSL_OBJ_PKCS8 (RC4-128 encrypted data supported)
++ * - SSL_OBJ_PKCS12 (RC4-128 encrypted data supported)
++ *
++ * PEM files are automatically detected (if supported). The object type is
++ * also detected, and so is not relevant for these types of files.
++ * @param filename [in] The location of a file in DER/PEM format.
++ * @param password [in] The password used. Can be null if not required.
++ * @return SSL_OK if all ok
++ * @note Not available in skeleton build mode.
++ */
++EXP_FUNC int STDCALL ssl_obj_load(SSL_CTX *ssl_ctx, int obj_type, const char *filename, const char *password);
++
++/**
++ * @brief Process binary data.
++ *
++ * These are temporary objects that are used to load private keys,
++ * certificates etc into memory.
++ * @param ssl_ctx [in] The client/server context.
++ * @param obj_type [in] The format of the memory data.
++ * @param data [in] The binary data to be loaded.
++ * @param len [in] The amount of data to be loaded.
++ * @param password [in] The password used. Can be null if not required.
++ * @return SSL_OK if all ok
++ * @see ssl_obj_load for more details on obj_type.
++ */
++EXP_FUNC int STDCALL ssl_obj_memory_load(SSL_CTX *ssl_ctx, int obj_type, const uint8_t *data, int len, const char *password);
++
++#ifdef CONFIG_SSL_GENERATE_X509_CERT
++/**
++ * @brief Create an X.509 certificate.
++ *
++ * This certificate is a self-signed v1 cert with a fixed start/stop validity
++ * times. It is signed with an internal private key in ssl_ctx.
++ *
++ * @param ssl_ctx [in] The client/server context.
++ * @param options [in] Not used yet.
++ * @param dn [in] An array of distinguished name strings. The array is defined
++ * by:
++ * - SSL_X509_CERT_COMMON_NAME (0)
++ * - If SSL_X509_CERT_COMMON_NAME is empty or not defined, then the
++ * hostname will be used.
++ * - SSL_X509_CERT_ORGANIZATION (1)
++ * - If SSL_X509_CERT_ORGANIZATION is empty or not defined, then $USERNAME
++ * will be used.
++ * - SSL_X509_CERT_ORGANIZATIONAL_NAME (2)
++ * - SSL_X509_CERT_ORGANIZATIONAL_NAME is optional.
++ * @param cert_data [out] The certificate as a sequence of bytes.
++ * @return < 0 if an error, or the size of the certificate in bytes.
++ * @note cert_data must be freed when there is no more need for it.
++ */
++EXP_FUNC int STDCALL ssl_x509_create(SSL_CTX *ssl_ctx, uint32_t options, const char * dn[], uint8_t **cert_data);
++#endif
++
++/**
++ * @brief Return the axTLS library version as a string.
++ */
++EXP_FUNC const char * STDCALL ssl_version(void);
++
++/** @} */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/Makefile
+new file mode 100644
+index 0000000..56c711f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/Makefile
+@@ -0,0 +1,97 @@
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++all:
++
++AXTLS_HOME=../..
++
++include $(AXTLS_HOME)/config/.config
++include $(AXTLS_HOME)/config/makefile.conf
++
++ifdef CONFIG_PERFORMANCE_TESTING
++all: performance
++endif
++
++ifdef CONFIG_SSL_TEST
++all: ssltesting
++endif
++
++include $(AXTLS_HOME)/config/makefile.post
++
++ifndef CONFIG_PLATFORM_WIN32
++performance: $(AXTLS_HOME)/$(STAGE)/perf_bigint
++ssltesting: $(AXTLS_HOME)/$(STAGE)/ssltest
++LIBS=$(AXTLS_HOME)/$(STAGE)
++
++$(AXTLS_HOME)/$(STAGE)/perf_bigint: perf_bigint.o $(LIBS)/libaxtls.a
++ $(CC) $(LDFLAGS) -o $@ $^ -L $(LIBS) -laxtls
++
++$(AXTLS_HOME)/$(STAGE)/ssltest: ssltest.o $(LIBS)/libaxtls.a
++ $(CC) $(LDFLAGS) -o $@ $^ -lpthread -L $(LIBS) -laxtls
++else
++performance: $(AXTLS_HOME)/$(STAGE)/perf_bigint.exe
++ssltesting: $(AXTLS_HOME)/$(STAGE)/ssltest.exe
++
++CRYPTO_PATH="$(AXTLS_INCLUDE)crypto\\"
++AXTLS_SSL_PATH="$(AXTLS_INCLUDE)ssl\\"
++
++CRYPTO_OBJ=\
++ $(CRYPTO_PATH)aes.obj \
++ $(CRYPTO_PATH)bigint.obj \
++ $(CRYPTO_PATH)crypto_misc.obj \
++ $(CRYPTO_PATH)hmac.obj \
++ $(CRYPTO_PATH)md2.obj \
++ $(CRYPTO_PATH)md5.obj \
++ $(CRYPTO_PATH)rc4.obj \
++ $(CRYPTO_PATH)rsa.obj \
++ $(CRYPTO_PATH)sha1.obj
++
++OBJ=\
++ $(AXTLS_SSL_PATH)asn1.obj \
++ $(AXTLS_SSL_PATH)gen_cert.obj \
++ $(AXTLS_SSL_PATH)loader.obj \
++ $(AXTLS_SSL_PATH)openssl.obj \
++ $(AXTLS_SSL_PATH)os_port.obj \
++ $(AXTLS_SSL_PATH)p12.obj \
++ $(AXTLS_SSL_PATH)x509.obj \
++ $(AXTLS_SSL_PATH)tls1.obj \
++ $(AXTLS_SSL_PATH)tls1_svr.obj \
++ $(AXTLS_SSL_PATH)tls1_clnt.obj
++
++$(AXTLS_HOME)/$(STAGE)/perf_bigint.exe: perf_bigint.obj
++ $(LD) $(LDFLAGS) /out:$@ $? $(CRYPTO_OBJ) $(OBJ)
++
++$(AXTLS_HOME)/$(STAGE)/ssltest.exe: ssltest.obj
++ $(LD) $(LDFLAGS) /out:$@ $? $(CRYPTO_OBJ) $(OBJ)
++endif
++
++clean::
++ -@rm -f $(AXTLS_HOME)/$(STAGE)/perf_bigint* $(AXTLS_HOME)/$(STAGE)/ssltest*
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_key.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_key.pem
+new file mode 100644
+index 0000000..7c8ac8a
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_key.pem
+@@ -0,0 +1,15 @@
++-----BEGIN RSA PRIVATE KEY-----
++MIICWwIBAAKBgQCnZdk20fYWh8O6kDTt0AuJWyp0YIrb7W1UNNMPXI5wA4J59IVj
++Nmk5wocm9+Hqzbg7rORAN/mHPBhzLAjhnm1HODs36hW15DtbDkkH4wCM/Tsyv79m
++n0xq1V6peK3t9vi2D4p/IRjHkYR2jm+BeknopijhY0kHHfpGTHa2DnVirwIDAQAB
++AoGAd4Ia5SxYiBU9A0BYyT8yPUm8sYELIaAL4YYk+F6Xwhh/Whnb8MyzquzaGFP4
++Ee30jYYNHlvX5VheDDtvy8OTN5FgKNNdzvW15iA4Hxje04ZI7W87G7OIxm7aYRid
++sG4XqZBtsOdj33IRd9hgozywGJ2qRqS6nn2KxRv1w07RniECQQDZAlKxijdn+vQ7
++8/8mXzC+FwQtzeTUCuLrBJcos9I/591ABoxYkWcYLxpFqgCEVwb1qfPBJkL07JPt
++Fu6CTnBFAkEAxXmUBs47x5QM99qyBO5UwW0Ksrm/WD4guaaxzQShMt/HzgJl613z
++/x4FtxiQJHAr6r2K0t5xTJx89LVKuouYYwJAImue6DAvJ5wDfzrtXo28snn+HLHK
++uONdKL/apgcXszE4w74GJsoxWwGlniUf3d3b6b1iP2GtPyIDOJjpjduZLQJAE4jS
++VtYB3d1MZxxQLeKxqayyuTlcr0r+C79sqT5C//hZGIzuLhlOMLd0k0cvwxsBjSgQ
++2ok8pfp49fAVI1z5xwJAVmJgLc/mSti5A2q3c8HW8qvMJEDPWbpb7p8pg4ePtpa8
++EE3TO4O4J2H+k40C397km4yZXdkNQsiT1zVljJZpiw==
++-----END RSA PRIVATE KEY-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_x509.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_x509.cer
+new file mode 100644
+index 0000000000000000000000000000000000000000..9c9936b8e98d0b7475e522377e64ee5cb7d9858c
+GIT binary patch
+literal 483
+zcmXqLV!UtA#OT4q$uKvs*kYO0(kKI7HcqWJkGAi;jEt<T3<f5KMg|6K%%Ln?!kUQ{
+zAwIzh0Y&*)smUb@F8L|xl?u+OMJ1VOnaPPIsS1vzB^mienI)A5a^k!OW<Y3eXlP<$
+zY!oHVYiw+2U}OyCl4)w=d}P-#vNA9?_A(eWb}}_KGAvKMX?F3OSo`5!6HMM-;O>mp
+zDoN<N{Wdqm<T8IuUjcJd<(JlEvrNlF?P}j2zB;?Zdd(9D^PlZD62&?k59j5&TUeXF
+z65aa5I-1Xu{V_w&Uu&cN`_tz8WL=G0S+Vx*w;$X1yXqAsj!$eU>&tJf@_eyO<6*KV
+zyX-GFpR#RyrAh0Vm>C%uk(~z&JZ7M~WVst|nJiE@P*UHyEW+SG%xvc~wa?bgyU%&o
+z__O9cjynut$9A5`TwES67IMd>m+OQ}^u4t{;lgJg9l!sr<hS6(t0&gyeEuXn;qTl+
+zqd9e9cYNGWhP3y5*xUak&Q$K_U#W+44D(rL9oX`UJ$iZ2>3OSV*OvR3NHYY8-f#GI
+I<)^zO0PSqO5dZ)H
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_x509.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_x509.pem
+new file mode 100644
+index 0000000..86f6597
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_x509.pem
+@@ -0,0 +1,13 @@
++-----BEGIN CERTIFICATE-----
++MIIB3zCCAUgCCQCdbnM4pjqlWjANBgkqhkiG9w0BAQUFADA0MTIwMAYDVQQKEylh
++eFRMUyBQcm9qZWN0IERvZGd5IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNjA2
++MDcxMTQ0MzJaFw0zMzEwMjMxMTQ0MzJaMDQxMjAwBgNVBAoTKWF4VExTIFByb2pl
++Y3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
++A4GNADCBiQKBgQCnZdk20fYWh8O6kDTt0AuJWyp0YIrb7W1UNNMPXI5wA4J59IVj
++Nmk5wocm9+Hqzbg7rORAN/mHPBhzLAjhnm1HODs36hW15DtbDkkH4wCM/Tsyv79m
++n0xq1V6peK3t9vi2D4p/IRjHkYR2jm+BeknopijhY0kHHfpGTHa2DnVirwIDAQAB
++MA0GCSqGSIb3DQEBBQUAA4GBAB0LgNo0oCcwIie5plgwwFybQ8x95q6e3wndM/Mp
++3gjcAFbGuchpo3dfFlTcRI0KyERb3q1MVxPM4sff9nT7EdHVyK9s8/ITkP2dcTKc
++flbcTEfJVIeM8L2P5F41Hvn9GuGcMW8EmsC06gdbp1LLnqsdrXdMNBsAUBXfgPrU
+++UcZ
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.device_key b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.device_key
+new file mode 100644
+index 0000000000000000000000000000000000000000..4e981d143e1383828b8a76e18c57e0b0f59b202f
+GIT binary patch
+literal 609
+zcmV-n0-pUaf&yIv0RRGlfdJGZ4h<43zjh$NmAe*gFd;CkIEWYaUz#Bpms2~d;TZ=+
+zk`Pe_4BeOCv@NwmC65?N)gXrn?#|TyB9lU`OINiLyb68LKj!YuC$?l`)u2L1ZuNgc
+z=Sux+ln*4$Nfhl{gttWP`YNkiPpo0p0h3)_$nwg2s|lRS$t9_kyc+@o0RRC4fq?*^
+zL=H=j!{3Frp6Ni0WB0Agp#h-CLCM~qOnu)|K)UjF%r<fVRLj|liDwP<SptGae;VJ_
+zMhe!}k{!Dh@96KmOI`q<?WRqvvfO61H={0;KF%Ej{gR}3kHpi(rVmH`Y?3%o`Hd9A
+zgG6g{q(Yvh0YNF%rC0uB-yx7-xur1zK>+-Ic-(fn!L=2LAE_OnV2@ezYPqfv?7EVw
+ztnGa>p_(hpRr+n(N$Ooc;-Ug;rmFgzfA1^_2-*k;^0%11vl#+G0M`^95MJ-`(OR-i
+zBA|9yFh78sA*+l|0wMujX*I%@o4%O>ok-BGDtQP3_l0oh2@5c16ixpA!QhEf#zLZF
+zQvyK%tS>_pbrT+q^2G&mI(6scS|AxC&V>TLsLms2K>j$f{xgTlW2bz`iWbV^SZp~M
+zSQa|OOK(li0kpVqV}#k^0zZ3z5inI#a)-o>oxVh6us#Gh)Z2ij5G5&LpFzr;@!ous
+zU+nPW;~#)v8B_>M%wA;<W+FnTDWWP&usbLS7Xm>5u?2*padHnE!MbMQTY+(0Wgg|0
+v3cKQF;e2bA5N6M*E~R!7Tl|5&J97n<934}R7|5Rx8jwm@UwAr_9k^bwbVnG3
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.device_key.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.device_key.pem
+new file mode 100644
+index 0000000..2bcf5e3
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.device_key.pem
+@@ -0,0 +1,15 @@
++-----BEGIN RSA PRIVATE KEY-----
++MIICXQIBAAKBgQDUIg4NEiu/diDAlbsWbTAhMKw4iBf2X5ohGJdTO6vhGQdEkhBR
++Bgzdl9+0LbVDJY8YStUghwnuztT+IpNCrUtXtRK8Cn3QP+buzSe2ZGPVoEJIbvV/
++QudK/WuUDyTNSRTtW4S3RO36KqtbT6xh1QGTXV3I8sp7qwmcysklqZW8GwIDAQAB
++AoGBAKBEDkuPw9+Ftp7pQIxj963LoQGgyEHJ3p9Mfd9TQLrydsw2cf9Uy9mKiWcN
++9VkCgkZ/Gt/VRgrW1pIduxXv6O+8S14An+2mTayy3Ga1N6MulD7OHQP9kqR4j8TT
++xaYPR/1skjhQ+Y0Uw4NEa3OkQp6lAUEp1aVX/mTfIZBguaUxAkEA/H543Ha6wbUV
++iB+pHaBgj1nzarmuEey6kqqs7X0zoZory1X6bdpJ6l0/4qICa6aq+pt/7ywJCNoI
++CPK3mL2zGQJBANcUHRBe7/HRWrJNIqB2WDA/gJshq4xOAiIBXWk1wpabvpkCnUjQ
++rip5CAL3hXDnCQswZxRN/v7B4IlSxkKiY1MCQQCsL0MUdRMejfLFBXI6defjWiAZ
++I86FAr6oziNnQP44sf4zh8pjp3zIihbK4lhsORhYFjrES29NzgG0uHBjhNnhAj97
++gBEwVVNyh8SMnb5EZbA+BDjU24CmECUpYZ9Bypzx3nyTX+zw4uMfgGAZVAhLzF5l
++DmYiQqcpoipMsDsoCBcCQQCxBYSicXIPG8G6ZuFbgXFcZR7llgq74mbhfGuVEGbP
++qS6ldhJb/IG9O3MFlRwdU44YyJ8QGpBKWF94OpIduF6w
++-----END RSA PRIVATE KEY-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.encrypted.p8 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.encrypted.p8
+new file mode 100644
+index 0000000000000000000000000000000000000000..8b0a7eb4117de421cfb917de7f03055fdfe2c28f
+GIT binary patch
+literal 385
+zcmV-{0e=24f&qOn90m$1hDe6@4FL=R0Wb~(2zv&jLbrq;i2?!$00e>oTecB0S5Ch{
+zHl7H=qA4HIOB;)ah$8h!;8it(u3j>D`liQs0*+k*%XW@PAMoO|ZVtaORrZR~IdUoh
+zNf*1NZ0jCJOsIuor2Ouh<c)ot>Y5SBS)gmT$Plt&Ub|ujkSvY}HF3T6ZV$+;=Cj1_
+zqiV0Xy#~l}wq>xTcs~vcY@+sZ^yo(jDeDIm8}2%S8s3H&bnWkZz@9kPK8*&28D$i9
+z3|2M?_7i99)`(fX3rvXr@m91pnk>4N^QQR5XPP=(qj)V!5qKV+KU4NR01UFqcL=0O
+z<WqeKmP8KC*)QM=McME}H<QCTa_BX@namc)CF_|xU$3*#>)<VdUvKAmO0=-igR~fl
+z-mO`%dym`o6F9p4n$=wvn!II#&PnKR3lXVbV;jds=xH2us6!2fitgX)P5>N0{uLA$
+f>0oNt1g(0Zzb?&!uhc`Lu&kDME*dK^i&ZfFoN%%v
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.encrypted_pem.p8 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.encrypted_pem.p8
+new file mode 100644
+index 0000000..19ca3c5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.encrypted_pem.p8
+@@ -0,0 +1,11 @@
++-----BEGIN ENCRYPTED PRIVATE KEY-----
++MIIBfTAcBgoqhkiG9w0BDAEBMA4ECN+YmhCv0ILdAgIIAASCAVu0QEfMkp0xUsNq
++0Ek4Nsa/uxcs8N/2P7Ae7qCakkvsdRvvPPH0y+wuj5NgrG6WpPeeEx9fI2oNNTfC
++pwncH0Xm99ofVrgMX6XC45LDZtzXNSZd4TdBP6xvlYXbuGegp5GPJ8emzscHCFhC
++JfPHemRAcB7DhiWukPosuSUr5R8OluEMJrQLHuQtlDAvMjLEI98lSchPxF8LKCk3
++SS2uCcmc+4WiR0nHG9BOaGi38+PytHAnbfo1mfVSQzLfgLicMAVGysfQ9QOgpQOO
++ygYfM/s7Duwbl0rshyXVJP+7BpYJnPtHvO4BTiizU7ZEr4WBiEnnANDrupSdsxeH
+++cxZo70YJVdoPdgMd2ke6EIkUhp7HughFg+okldlEtJA4muKeEzwAxZu0TqxOtZ8
++UYRS4Ygk+rN7Y0qTKSYwSkrFBwUDkpctYjRUOeAZ/mYMKWmMn1ejAb5Is7bjEIxl
++tw==
++-----END ENCRYPTED PRIVATE KEY-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_1024 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_1024
+new file mode 100644
+index 0000000000000000000000000000000000000000..5b6ba1d037b002b0d62c9903a3582daac05f77e2
+GIT binary patch
+literal 609
+zcmV-n0-pUaf&yIv0RRGlfdJUxzZKr<ujtkN3#h2G*G65ZCTt9~*}TU1z<AL1R%Q4p
+zNDg}orX_ypdwFj-<+Zo;;GB_Q^ak@l9{G_OsV_%EwVNK?_Np97c_Apvs!4O%2?b07
+z@=Q%^9Dt`3kwp9wv*G9CPei(m!*n_5OwiO!Bw@5bm5jg&w*omag_8mU0RRC4fq?*&
+z2Xf`Ut$925Gc1k;_!?`_=#ljn2ibyLT-73>o<ahDi_O0Dg;Mq`)d|up^epxVg@F0o
+z(9Ay~F%|Pk^0ne=nFIt$A={s!R9gDv+4%<r|C(i_>+(m=R>yKlNL=U?*N-L4Nht<u
+zRC^cPp43zD^`3<#q3b>AFS(rd;edexK>+Roc*l5!1eeS<z19)p$2r+FQF3pJ56y@&
+zGn>b!19#biHMZR!!od?jgH`Kb>w%687GkutJnIO6oO#nY%JBk00O>_vE*8v_P(ZeM
+zyg1-iXi(EHbBv5C4uMLFyUg%pG)A8XeImB`MyyvOj2`RL1x=`fYG?MQv8#^3@9%x^
+z!va7r##ufX=mK*A@81nDOXwG=jKS!Mks0{(q_+)5_cTxgUJ9@&6s`anfHIu5fuH0;
+zf)t=Vi;POuOB0>6lS<J7KxB-AcVSv{5kI4-8;ZoBT0EqiDvD){XHGG!RY3$vodW0I
+znSatS=GM4`*$gKLft$3<Se#LW4##aYiBQQ8a{@sC+TLCotQ{TKxn(8*_0;4jgoZBw
+voIwCm;YX3cQUy*AFAd6@J&8fT?w_INouunUf8)!fYYO6iu!megu~88nIFuu9
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_1024.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_1024.pem
+new file mode 100644
+index 0000000..4f5ad4e
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_1024.pem
+@@ -0,0 +1,15 @@
++-----BEGIN RSA PRIVATE KEY-----
++MIICXQIBAAKBgQDY4L8V3uqv6NX9C6ios9dGXacmbAy12bzG+MB40PZWZfgpSA57
++C6Ylfuh7eW845bW39OCckWD0BvNAHvmRGakvR0O1mx7c9qocSXkhKMuqSXPZCQVM
++AvJMTWwcgKcUkUT8ErPh5+NPRLqMw3Q56EzQ1EwkYbRAlYzACrcCOTGFkwIDAQAB
++AoGBAJQHcuW+rXk79zMsjgX4GmvQ6JH1FgfZglxc1SKhnkICf4vNvvSFUvYs1QnS
++LPQs9geFgPnc0Mw/IjEV80nyteJpmQQESSHbn6FUWvrk2fkHBf+aZaTr8kfOVsdy
++SUhc6BTXjyXMSSkGalR7F9ye1FPw9Z6FJaHrPekvuZz24YCBAkEA7gJ4x3iFBJfM
++Nr3WEeLHOdk0UXJvig/NiDIzm8enA3fZgjW23R/CwRNAg1XrYOuBjgwWYrS0POsI
++gJx50zjK8QJBAOlFXy4WzJNQQLZ5vDjgVmhQ0y9zjIwqDoFKirvM8GQ0Rp8HfSK2
+++UasVyOMHuvTBU2og2pn9qaxq47B7+998MMCQC/GWT4Y6AJzAe/fDTBL6BepjMHo
++iZEZ+PSktw1G9zRQA14KsCkUrgAZgDKctYGf5EKCFKA9i4xK1UsTnbSTStECQGSM
++g3dhWnMRP6OoG4rEoFo8pJsqimWMZ04xrFVBBEmdAuffmX/SMObWuITZDCcIgZu0
++zFicUYQOx200iVDJD3MCQQDa3l4arB0d17llJgD11OQohIYvAJxBAFLhR5HAUgVO
++Dy8Nyps9iUG/7p+h5p2k60V/48ukawrifrCHXECxUREd
++-----END RSA PRIVATE KEY-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_2048 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_2048
+new file mode 100644
+index 0000000000000000000000000000000000000000..0af642de231ac7143db034bbf595842a2c7c9f85
+GIT binary patch
+literal 1191
+zcmV;Y1X%kpf&`-i0RRGm0RaHQpugMt&u|7rv!C9LJ=rhBH$C@fYh{Ath`JqsrwVq?
+zA;rGwdz;vW#=#sA1YEwE5j|QuiSkR15=5=(@4UbWOLeF_S#o-F8XALLbhnX29W0$0
+z`^6U}4UEEJE#HKhq!Uh&FZ9AsCOsK;yP?!b@<$f99GRjI+k0MRvI+F2GfIq-0(2*<
+zI@+{M1%IXd(F9**b0+8=WCc3!R90Z=+`AS3+BF!K@+u=)cS!#laK$+W*UPbkBh$%E
+z9O&R=BhkV~W3pb9<VuK(GMUN@H5A*RR6xg^y^H~c@T)cVq-y`~U}DSScugVtmfbA2
+z%+ls>0gAIAV!eeFdnK&`0|5X50)hbn0KrYIAk0gtB;cu1_*7~DLp$s41j1L{dy$8u
+z>Q{6SrHuFJ5=4!AZ6f&-rB0VNk}EF%GnIau0>!zBGX8BCm(}Gomw{5otF4q+j_!<A
+zA=h{AZk~4g`j6L?T^{Yz**r_c%{<Uom4VGA)ElHC2iWJK351mkRrSyH2>p^p<y5Eb
+zOBjO$UMpQTviHZfS$yQJ6M%Cfuhel4SaiLNcOaOyoHLWio(XzMG7twCcX0Y8M|39W
+z+&6JA+(WFM&PHD|dMS(Io@O6sR>1sm3^l)5OV-`8fG^47KzM3=dOYqWQN}Mx08R?P
+zYG(QI^V0Ya2D(mOH<Fm=JM%WORRV#50QFY9`olPt_GFIfpq;w+5p8)jmLY&XujUa(
+zNK6FB1Jl9zg3g{m#gz9CDvkuEY}qmL$s~q<;8&D)3AI>Z6n3J@*&>6Q$zUudW;ASZ
+zQzH5(Vi)P&Q`Izs^HP*fY*{R7YiqEtv!@<vIoO~!5U81Q>=|O8tlwC^M*Cwj0|J48
+z0LvBOMMw2v^dO~mza7xFv4n50Qe?_on9muo``SJVw9twDxz;$tm3C(+A5JQ?3KbZA
+zjJgHmx*IBX4Ilw`JwQ-@w86>Eta4z4TXD9^xK10mFm*b9*FGd6pGoDEYM0?EA=1$?
+zAh{7-VIk);QUektIB7B1=h0D7V+h(3j{<>!Ay@B-IXxJRi!d!JY9)Q_y>BYaL$g&;
+zytn>PR~(ZYzYOl@OGA*<38Cgn$53>6_^#wDST1{Xw-R%AJ5f%kWK&JFV-I!P2AUax
+z?0^i4+Xou6@<J21TN1ArL(%FosgLr?w6Q0^2j_=UV^ON-YO<(4)L3Q_Ev>fpn6>Md
+z0)c=X@A}4A#y*Q%XsE;Fq)6I8SgLZZ^7^m458-?+{^(mFM#e>F<Mc@jEJw)Qpabk&
+zk-(@&AL%0<FcdiX7v4DpOBt9>-0j)c{*7c|js3Dusa$NJOJF%*s<_@CX`P5&9Zxl{
+zJ26krm{pSK35pUk>#y4J{_H2XK9P;o*ErV#fq*qDV<*E0RC9D5w-*D^YaVVcH?W@L
+z7s;4%??z;ZXmnf~khf-nE#R3RkTMy<Ys(iy6@Wfd0%%ES+FRK!(pr8S74;YA5qiqe
+z9XPww4_waym1wD)8+izPSjO)UCz32VC$bSAw6U1h<^ul<(2Tl{`W7ruei79MT3KX_
+FDTxquHyr=~
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_2048.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_2048.pem
+new file mode 100644
+index 0000000..beddb72
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_2048.pem
+@@ -0,0 +1,27 @@
++-----BEGIN RSA PRIVATE KEY-----
++MIIEowIBAAKCAQEAwqC/2/rPcAZEs5/ejT3ZL8Q3Pfdna2WC44i6HYCnCnbOIcW+
++6Xub2IXGwRwQBFy+mRE9WjqJ8kuOEkSt6e+8wAhLdag7WXJ6cxoag110t5FEHSyd
++GfvFFyUNjMJhLd+EmaQTTpEv9MJPJj0Zdruh1EjyRxa4HJmiD9t7XmWyCfSmM0qM
++kgJ0J6s62rRMBX+l/NEEX2VzJugdZAU671RWYOncuxX/2jUYlvIqI1l3SP8acMU5
++BtfLsYMj08lNHOjgZCPRwkdjsl6U5EqIizKZygw1FNugVEDHnL2MAYXwqzX3pGr/
++72Biy+J4TSH6lt0stszS5m8BirMgYr2FFHslrQIDAQABAoIBAQDBTa0gzEupJOCp
++UvhUagBDO+vuBMJX3XuRh6PqV3QQpYz36BJEjXttIvkTpU6XNpIrLv8zlX6bAsW5
++iTL+bRiX1eU0l4FSxqutlFiO7oxVIdd37m6edvv6j9eUXR7t09k8S8TNPNBXlYHN
++JdQbpCIH2OehCYSVC1X1z/UI/ZJF5VSn7UsYgwReK102svfHtll85K0TgHMir9Rx
++Dlh0vYx3IJi2nDOTyJ4JekkyEAcYd3D6JUd0JujcN3Ev3EOsns5GXzN6KYvinmYf
++Z1bA/HEMNb9ZS9bdsoAvyeJAeGp8ejzuJVHGL0kATgrAamb58fPS+A8Guk5eN5KY
++5zvzNrJVAoGBAPVWvPrDOJX2ZI7poJ269xFteTWWIYA+r+YRRkhMBMcD08H5gs6e
++QMWU9w8qjgSmbNkx8skkhn/gV5R3CbVYYRR2osrZIoOayWAsJmY0bHFTIvooYhfp
++3lPVNIPzUpRObFksamtrsK+zpx5qOdigNhComXLsGWKfrN9Yvkb7YzIDAoGBAMsV
++4UVH9WH0IKV1vx3QtrGEb69SZMpbmM8ZsPvaPgq00In9udY4w5V2ZygfTiq0ChUY
++fYy6BeO6Gyp2DSABdz1AUH+0wcnNrHJghFtxtsq4Thu4MHU6ftc+JCGfSeWUapfh
++KiHS0TEguRFcYSHnM1IDEiU4aTHY59FRUWMI2hKPAoGAIVfviTk9GIyLMC0qaiV9
++7L1vKsxDs1VRvLf+UFcckxu/DO7nS0OQ1Amh5krHUHR5+K7kK1gue3S3EnN3O1FO
++qGRTTbRjD3XbBpoZgeyADIrbBxqz8kITuFsSrxhD0eoyqY/yyrSxJ8AH54dSY1Gq
++52qyqD7UWGYRLa229pi165cCgYAd7/rGWMY+i1toqMPkpEjaQFiqcq3y+q+7D+F8
++Lv7oWyFGxkVn4/RJCyxHyN2gA+xckcCoRx/pIx0wFDj5F945BEsZmE7c7dnW/o1k
++YY39sk+pXGygS2A5YKq43h9pnYhdHU81rzsxT86YVZLoCYoSM+uv2vH+7Ce4PpGN
++1Nc41wKBgDUrYyfDB1RzdB63FwPRax5uLjewnuMXyZhy70ZkiGh0XBuQt2aCLeCZ
++HpAyGcJryxdDFYA+UwJoSWjaW9ku0lp+GxX1F+cResrRHTi70w9czwGVaKmcG3kI
++fFjG7w8nkiw5J7IRH7SxmNbmAv8L0Iy6jvoWLFB+EdUGWllkjCmJ
++-----END RSA PRIVATE KEY-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_4096 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_4096
+new file mode 100644
+index 0000000000000000000000000000000000000000..c205382ab7aff86732f3dfe2ed465797770e4de7
+GIT binary patch
+literal 2349
+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
+Tbx&XXcZMQG44N=;lHrQ{Y;S%h
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_4096.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_4096.pem
+new file mode 100644
+index 0000000..9929467
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_4096.pem
+@@ -0,0 +1,51 @@
++-----BEGIN RSA PRIVATE KEY-----
++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
++-----END RSA PRIVATE KEY-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_512 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_512
+new file mode 100644
+index 0000000000000000000000000000000000000000..7ae50f23bdc90e48f165aff330220508a99699f5
+GIT binary patch
+literal 321
+zcmV-H0lxk)f&o1O0RRF)0MR=zU#S5?J%(*^zCdnK!AXBtb)hXb<-t7<AR5slZTfW5
+zJ|nPj{Ge*y>_Lcx{!|rfVZ|0=xRXKgPd)!Gy#fOP009C)0Fimb?T$65*W6;Z_#YNk
+zQ@#a*O7BqLt*OZgemVyg$o&?(z~q?GMVVlAY-DAL#~wAJ%@hSVITaeX4+WM10RkZa
+z=<C<0-`J3<JRzh6F>2Ex*d>@xxG0k=x#?fIqh)t}0wDn9_HXM@#5)1QLVZv(dI{VJ
+z<#zME>JR1d(>*U^;<!NqApqUavgw?9b&=SA#N9<+P{2Du+98<Z^7}$5uflGNb5#N%
+z0K;8s)v|{ZPCF5Jp0h0B#d0-gs!3GYZqw9HExe&OK>{HF#AygqJ2JGkYa5*N@$(u=
+Tmj7@iAR3)zxTTMr$9H6O@syE#
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_512.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_512.pem
+new file mode 100644
+index 0000000..1e2fb41
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_512.pem
+@@ -0,0 +1,9 @@
++-----BEGIN RSA PRIVATE KEY-----
++MIIBPQIBAAJBANE7MF+pAUI9hm1yvkBuUcFJf1d1oS025cE9DyAa0SNt+nTSPiOw
++cPygat7sQYiE/lQVa2HFFmK4k0HxTz3/Lr0CAwEAAQJBAJF5xO2ONajX3GK2+B8W
++VVO+BYNK71DfranJCX46BxXI/Ra7wOSY0UWZYHVsZGWJxx41os0UBTg5FRq4DwWW
++AQECIQDo69eo39iQqjwhpAQxatMh2CWYT7gokyu56V+5o2V3fQIhAOX2b+tQxDsB
++w0J9UDN6CdwI5XbzveoP5fHTPS9j4rhBAiEA3c+y6Zx6dZHYf8TdRV5QwDtB2iGY
++4/L7Qimvwm6Lc1UCIQDDXWrVsocTTjsReJ6zLOHFcjVnqklU2W7T1E8tvKE3QQIh
++AMRpCFM7MrS2axuc8/HzGkqW/3AlIBqdZbilj5zHd2R0
++-----END RSA PRIVATE KEY-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes128.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes128.pem
+new file mode 100644
+index 0000000..8961bd9
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes128.pem
+@@ -0,0 +1,12 @@
++-----BEGIN RSA PRIVATE KEY-----
++Proc-Type: 4,ENCRYPTED
++DEK-Info: AES-128-CBC,B3A0D2BCEF4DE916D0BBA30A6885251B
++
++v8y74AGReaPLmDt6O8wir6hX1Ze8K4fVNkrLqfDMdW5E7jBXKO8riCMNmSjQ9fyh
++eTicej93+8krcIvSXKW18TdO+EWezQevgnLrAZQWaNPH2j4B+K5gm701uiiKFKVa
++1zngAOByePYlN6z4JLbiCyJRhxSo5zCaUYkKC2eGh8mlE64QmokPSCAj0wcCDzGh
++hdhBg1vm0GmaQwIDVn+8zMfahscXVMtBmyQf5YP4PQW2nqOt7aZHjBNdg9qnBpGw
++b6YuY7eZ4FgQvYcsNCi34NroJb9pkTrrF2F9Meb6+3So7jtMFG/YaJdCuXtf01g/
++Qm+XA5pJUtIUr/hLQjhkaOVUtXv/k0o/MR4k5CbAmboLt6YHf5V8+01vk0bvv5dI
++70pVdXMmx26xDZOGmjYzd93PWc+75jak3GN2fbWryQs=
++-----END RSA PRIVATE KEY-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes256.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes256.pem
+new file mode 100644
+index 0000000..7671a30
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes256.pem
+@@ -0,0 +1,12 @@
++-----BEGIN RSA PRIVATE KEY-----
++Proc-Type: 4,ENCRYPTED
++DEK-Info: AES-256-CBC,F076229CDC2BCB3B8722E3865855B45C
++
++WFV9QWzr4tNmD+1OeQ7BceQg5LVQHp20Jo1Ax29lq8JTPzeObhtaU2MUHlcPKHUS
++vK4FyQxJ25CyMubbnaZqCCz9pNbseFuJ1tob9UqRmXkZ8HV3snRjJRbcctD+V9x+
++Ymi1GreXoDQtMp0FtMiFjPvIYciBQnaRv2ChMAnGXNbZXCxWWA9E5S3a+yWzo+gd
++wEcowL+SUac1PEDGHokhKn7nctvI9cC4hE6JmKM1sD68/U3rRPXMGqmC7umqyT5P
++gjWBb1uu0iRjFC9eQUsaKPxey5Be710GFlyf/Ff/tep7RhkryIWEPvIzYCBf6rhk
++3pysFgTjfiUuBYUNumjXr/q5hgdtb75788XUDxKwAoUx+m8gi0nJg35CN2nmQ054
++VJxcZlNv0wqnJ+GTTZeN6fiAhTpVtHsqHQomRSfaBiw=
++-----END RSA PRIVATE KEY-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.noname.p12 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.noname.p12
+new file mode 100644
+index 0000000000000000000000000000000000000000..9d27999fa053e524fa4ca893c2d13ce9ed49bb7c
+GIT binary patch
+literal 1483
+zcmXqLVm;2p$ZXKW+RMhN)#lOmotKfFaX}Mn9ZM5y6;Qa$poyspA;q?!i76W>l+MJ+
+z0HhKSGK>Z?Y+O(ico-QC_*gicZ@+tPGI5?Z6B7qRLlcv+>xsu7BXuG}7WFyS3yN1O
+zJiB%z_haDaFJk>AMt=^4KDj&FlSO0x2d<QxS86g>f3KgsbB{=vL6^R#b?e&OS-QcS
+zGCN$<U)|R-j!7>J5|-cmTV%e54S!<I%v}PPV|KXlHLx*$yLR({dh!!ry@wxHbn`4(
+zrtp2X+e+Js(du58+nw_ke0kN+V{!Xvi_Fs7aa@776~ZoOpZC!@dwTJu`zsGbFtTzU
+zV+vj++iuruakX9a|Bea!8F%F+h9C6ZcjM}8$+$o7GhC~-@P|jAoLB4`x8g`>)2?UI
+zWu*`8Kl-TagceQVV7aLOe%rD0rav=xK9;Py<7Mxpy7}0RueYwx?_+3MS>c%f$vi$Y
+z>qPY0e-jNE!}i!EIz_nZJDZx%Fa4AynB5}RZoGR%m9)iXor<N;f=u>?9S-~7oa}kp
+z&%|qA>g?W->CVE3V>Q*gZY<JRHEFfbz3(d?tL<){;r=Jb)zq$UYu|_DE{+Rn%agu3
+z3%yNqDAxJ&KPvBHYVlpK^9Np3U%31K+EVcXONOeVXMz#IUMYO>|2(~y2WNWEVzf?I
+z<(U-KKKn^n)b)LfN?Z=|E{NH6jr(|qli}4W=1uv^j~B=u=E~*SW5W}$okLAO`S{IP
+zm&N{b_Df#*<hYK*$5%h?%<kN2Ykj=tWHF{M&i$wP)aNUE=q~qX4iZd{IXV|SGrD-v
+zIiS8g&5U6OdnH3-iVSmG`@wrZzP^$SjQCnA|78E~>e&uoyfd~wEuSU-w(_`~mv6zJ
+zXND(%Y3vJ98Uv=jrz}lO4}rpWf%qmHH!Q_*F){%q7Xk(6VkShcPs!1(#%Z>ogb37L
+z{j#quvpMaUTGqUyQ-7E)zkJ$hUr<88Ndd{X+aJDG=s(t#T=rr1MYoSPrQV;Yy}z+m
+zy?`~c?A~9^kPHi*)!q-?Fa37Dv_6naZgJ(Ox~e3WYP$wqCBy$MnR+L9v<?`a5ep4p
+zld((SiSlf=yCE(gW-`xKRMt!}E(zZ|gL(1NxWndoJkcy0{rF>^ugY2xd#-gtrp&?V
+z<qeLLc76U^Q!xA5inNBn{EAOMlBSfKT}l^~i<*1fHfT>%1b_dxY9+VRUwb~ASsUAx
+z{&$<{bAPTu(cML_!?$=aJkI&ra-Px8)p5DT#2>Fzt$sAlbPs*aYTIDLJE^z&&fe?l
+z^Sk%Vzox!;X90tFQ`-xh6V7XQZrpS%wK>%Iy6xiU|AVYWX5_w_yT7M+A7@N?Xa9pO
+zC+yntHF^4$pPv6HK!{B^ccmIv%Zd0HP5-EE{lWK-zxlMywZ@@flle{ob(fXKCWfJZ
+z_vby)@(Da^SW$QG_ddtyKiO82(qFgbfBia<K{WUK@v0@8%M9km7`g9Ml!=JFY;&07
+z;BMK#GCA+R%hYCcIoDjVkM?JaDL&9)b2@egzt_?YS=tt76H~+8`^8zdojJWSHhA^%
+z%R#?3RVlUWC2Fm&Okh&DaIf!hu=-Tp`d@1<h2LteH&Eqmuql|-$1K0EC+O?j|I-Sl
+zo!#B%5qNOD*)pRK5gQ#jCfw?r^|sf%cEZyiQ?*+jpV3SZ{+~MIyXvK$Be(3gd@WZ|
+zFD@!s%%x_{^-aOxVSa|#GK(|ZzovbydogRlJK+t2D+C@|{!TM|Xc^|NYQ$^#)>rGH
+zyBpJ1of*Za&nY)6zS(c*82^(q&7^aotL?qtXSb}Jp<BOf^9f^a&mD!Q4OI=4;R%{k
+z)KH8?#Bf{p!<{BM|00^2HDfq4lGuA!Sr`}^C>n6Gv1;=%GfA;Bu!uO$<hdKxZPoGP
+cR^P@Mi2?_#oJ#kwaA*sLUsS1SO#mfq04q$GivR!s
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.unencrypted.p8 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.unencrypted.p8
+new file mode 100644
+index 0000000000000000000000000000000000000000..d04694b1fdfe85f10841cadc6681a121a4c3c7eb
+GIT binary patch
+literal 347
+zcmV-h0i^ygf&o_o0RS)!1_>&LNQU<f0RaI800e>oK`?>=Jpus$0zm-LJ1}3V0YW{7
+zZF0UqZc)KWe^+&(EjH!BJr5un(Iaj8bkaT}uyFjKYToQYh=l%B6>DL|7Gk)QLGe#L
+z|1P}(0|5X50zm+gdBp9GHK^CzVz&4n7FAQe1%pcOP~WYo$q9Zs2NlTu7Q4XYn9)U<
+zV0CO{Wr@cgHKNTF1vohs8n_PymH`0*Apq#>*Qnpvkg7Z(qy#Z)(;?U;m`}JUlPkID
+zU%8`YcYOjO0Oj^?>rliy0mDLlP&0Z7+z91%^S$a1<?+)!FJt1kK>{HF-OsY=oO*SU
+z*nh;`MP5+AJ3-nZnB(&MLMgApZi{nO0wDmyU24^`hZ9aa5qO@nEaAm+HD{_xRM~FR
+t)K4wEp*KMSAppc_2va*Uw6<#-ob&PX8cLS`a3vrbon^SCkDSMMWONLcmL~uJ
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.unencrypted_pem.p8 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.unencrypted_pem.p8
+new file mode 100644
+index 0000000..e07375a
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.unencrypted_pem.p8
+@@ -0,0 +1,10 @@
++-----BEGIN PRIVATE KEY-----
++MIIBVwIBADANBgkqhkiG9w0BAQEFAASCAUEwggE9AgEAAkEA0TswX6kBQj2GbXK+
++QG5RwUl/V3WhLTblwT0PIBrRI236dNI+I7Bw/KBq3uxBiIT+VBVrYcUWYriTQfFP
++Pf8uvQIDAQABAkEAkXnE7Y41qNfcYrb4HxZVU74Fg0rvUN+tqckJfjoHFcj9FrvA
++5JjRRZlgdWxkZYnHHjWizRQFODkVGrgPBZYBAQIhAOjr16jf2JCqPCGkBDFq0yHY
++JZhPuCiTK7npX7mjZXd9AiEA5fZv61DEOwHDQn1QM3oJ3AjldvO96g/l8dM9L2Pi
++uEECIQDdz7LpnHp1kdh/xN1FXlDAO0HaIZjj8vtCKa/CbotzVQIhAMNdatWyhxNO
++OxF4nrMs4cVyNWeqSVTZbtPUTy28oTdBAiEAxGkIUzsytLZrG5zz8fMaSpb/cCUg
++Gp1luKWPnMd3ZHQ=
++-----END PRIVATE KEY-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.withCA.p12 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.withCA.p12
+new file mode 100644
+index 0000000000000000000000000000000000000000..ae029dee0fd45e90460d0eacd15f9be1882756ea
+GIT binary patch
+literal 2089
+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
+G|9=4=O4!W+
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.withoutCA.p12 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.withoutCA.p12
+new file mode 100644
+index 0000000000000000000000000000000000000000..c4eb54c444ca361efa2c3b4e4d5082607b2bb693
+GIT binary patch
+literal 1573
+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
+E1>TCewg3PC
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_1024.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_1024.cer
+new file mode 100644
+index 0000000000000000000000000000000000000000..fc92d056429c92b14fdc609505a5528a38ddd3da
+GIT binary patch
+literal 475
+zcmXqLV!Uq9#OT1p$?)-T`++N8!VeqpvT<s)d9;1!Wn^S!WiT)?G%_$?V-98E64p$t
+z2=NJ42q?<WN=+_NaLG?euT*eOEh@=O%S=uzNmXzxEy>6)$}FigkQ3)MFatt!Lqii2
+zW1}c>USnfJ10!Q7*FeWm%s>QUDldwuhC&7cAaQ14PD3MeJp&*#G-#ZU>?%f92Ij_I
+z27|^<rp88w8xQu2-g~wF#nr#uD^_g2?iRaTEr)08%{|9{9H_YPEiCnirUzd&_cGPG
+z7uA*d7EiZs|MFnY#Dp(wpB?0WPLy1!@9w;Hw%na>t7JSY6*W$;@+`i|$?C)O$;UTG
+zreV3rM3+B8n;$-Z?C-Lx=WvPT3!e*Dd{h#*I85z1z_p#p(y(<h6Eh<NBeL^=fyNAU
+z7q`1gQ0=zliaiZ?+jA!P7$1&VKAlsB(|>l}<|sS2Nm9q#MI#?}#GK1|G;Nj9n?r9a
+zx*tqPn=Ep8#%g2J%eAqATyu5`M7USYn40q6C$>rQ=PUlWS*MNEQ%>babX_=L_GM?X
+j$<kY90cM_;wp%G0N84SC=b72Oebe`Dmm_h-jw_h};#;++
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_1024.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_1024.pem
+new file mode 100644
+index 0000000..81f3eaf
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_1024.pem
+@@ -0,0 +1,12 @@
++-----BEGIN CERTIFICATE-----
++MIIB1zCCAUACCQDxw4fA1PRXwzANBgkqhkiG9w0BAQUFADA0MTIwMAYDVQQKEylh
++eFRMUyBQcm9qZWN0IERvZGd5IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNjA2
++MDcxMTQ0MzJaFw0zMzEwMjMxMTQ0MzJaMCwxFjAUBgNVBAoTDWF4VExTIFByb2pl
++Y3QxEjAQBgNVBAMTCTEyNy4wLjAuMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
++gYEA2OC/Fd7qr+jV/QuoqLPXRl2nJmwMtdm8xvjAeND2VmX4KUgOewumJX7oe3lv
++OOW1t/TgnJFg9AbzQB75kRmpL0dDtZse3PaqHEl5ISjLqklz2QkFTALyTE1sHICn
++FJFE/BKz4efjT0S6jMN0OehM0NRMJGG0QJWMwAq3AjkxhZMCAwEAATANBgkqhkiG
++9w0BAQUFAAOBgQALRyRSfbZjeLyA3YdskEwzw1ynlwkcCU+bbrNaPkaSGseHFVnh
++iFzOauKWqjLswu14i+CQZpMUw5irMzXTfV1RCpy5EFhHepiVZP9MXYIZ+eoPXprL
++Midkym9YitDANvS5YzSl2jZQNknStzohM1s+1l8MmYO3sveLRMRec0GpAg==
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_2048.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_2048.cer
+new file mode 100644
+index 0000000000000000000000000000000000000000..c0badf7288617f5d618a62e1ad4a1343697a98ca
+GIT binary patch
+literal 607
+zcmXqLVv06sVm!jc$?)-T`++N8!jBm6vT<s)d9;1!Wn^SwWiT)?G%_$?V-98E64p$t
+z2=NJ42q?<WN=+_NaLG?euT*eOEh@=O%S=uzNmXzxEy>6)$}FigkQ3)MFatt!Lqii2
+zW1}c>USnfJ10!Q7*FeWm%s>QUDldwuhC&7cAaQ14PD3MeJp&*#1iDZO*;$ON49rc8
+z{0u;GE~X|%MutNR_TT<>zJSeT^Za|gwm0>UnA?6&&rWT6+_6ixVL4aXImM&<URKY(
+z(R%Eli~vi_zL|oyQC6Lwy!(V)*1mkd=KzOy=?d$}qN-vkspi;{?Gs&Ob>>R`J}R!t
+z+jA&U_kPRFCBl9a^}ihQSF@EY+r99L$0v8O9WpZ)@!zhFOWnlzWtp*8&m^W2_0?9l
+zw)n8tFa2|oB|f!S?S*U#tJV9Eu!NU)c8mVMWhyc4la_L1xyOI0f}@sf*H3S3R=#}F
+zSLVfo6y=MD+><xOO?l$g(QP#I6pyLM?FAtY$LH+rVQl@d+VuO9tpD#5l1@LW@KyXZ
+z?XJ$YGnby_Gj?rONZQ*fQmwj{iJ6gs5jli_5y#xv$Y7%%R{UjM&z~<$iCOpOTHLl-
+zX13O#)auLBi#|qA7WF%dZ2i@=w_J|vQpWV(Vfo5oFY5Py%?LfWG579L8;L-TlY5Po
+zy_rL7Ry6)w|M38C+PPyV(vCfEX%Y^;mu4~dqnLzDLb&InW8Lp&W%`?+J34>iH`Cet
+R9GogVhX2<0z0YoW4gkCo^O*nu
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_2048.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_2048.pem
+new file mode 100644
+index 0000000..1ed0141
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_2048.pem
+@@ -0,0 +1,15 @@
++-----BEGIN CERTIFICATE-----
++MIICWzCCAcQCCQDxw4fA1PRXxDANBgkqhkiG9w0BAQQFADA0MTIwMAYDVQQKEylh
++eFRMUyBQcm9qZWN0IERvZGd5IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNjA2
++MDcxMTQ0MzJaFw0zMzEwMjMxMTQ0MzJaMCwxFjAUBgNVBAoTDWF4VExTIFByb2pl
++Y3QxEjAQBgNVBAMTCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
++AQoCggEBAMKgv9v6z3AGRLOf3o092S/ENz33Z2tlguOIuh2Apwp2ziHFvul7m9iF
++xsEcEARcvpkRPVo6ifJLjhJErenvvMAIS3WoO1lyenMaGoNddLeRRB0snRn7xRcl
++DYzCYS3fhJmkE06RL/TCTyY9GXa7odRI8kcWuByZog/be15lsgn0pjNKjJICdCer
++Otq0TAV/pfzRBF9lcyboHWQFOu9UVmDp3LsV/9o1GJbyKiNZd0j/GnDFOQbXy7GD
++I9PJTRzo4GQj0cJHY7JelORKiIsymcoMNRTboFRAx5y9jAGF8Ks196Rq/+9gYsvi
++eE0h+pbdLLbM0uZvAYqzIGK9hRR7Ja0CAwEAATANBgkqhkiG9w0BAQQFAAOBgQA8
++L1Zz9K6M/PQCYWrfnTjbPKY2rTB1OvSV0Uwy5KKPQRS1+oK9dx4K0miX+1ZvI1bo
++f7/1aFXOsW3dpTwYUSjJvTMjSwNUPKiB/q/xwA1mzsbIZsbnhIITU95mOJ3xFhgc
++YFdJ4saL7pppTzfOxZ+h9jWbDwgJJAwx/q+O72uE5w==
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_4096.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_4096.cer
+new file mode 100644
+index 0000000000000000000000000000000000000000..40bbe94fdd8d5fc57dd7463e4e9530b9d661e7c6
+GIT binary patch
+literal 863
+zcmXqLVvaUwVmiXa$?)-T`++N8!jBs8vT<s)d9;1!Wn^SwWiT)?G%_$?V-98E64p$t
+z2=NJ42q?<WN=+_NaLG?euT*eOEh@=O%S=uzNmXzxEy>6)$}FigkQ3)MFatt!Lqii2
+zW1}c>USnfJ10!Q7*FeWm%s>QUDldwuhC&7cAaQ14PD3MeJp&*#1iDZO*;$ON49rbT
+z{0u;GE~X|XMutD?TV}>;ow{Ja^XqY}Kx&Zef|Au{+XOz`xm&ZC_3Bzx*40-wFfQg@
+zm%j3gNv(kccj0BVI|(i7yZNjX1&Wq@zCAtZ{?bm~_lp<D{G4MuJ?-#`P4nv}&ka5Q
+zbUS<Zo0tg-XXB@*?p*(6ujTinE{DA0luKp4zOG3VT+j21JzXI{I;f$4MLEN=(jT`I
+z*NH7Y7WKT8t&;Ek#V00H93I4Q6y7~ML#g%p(eK;T|9O?pd>MDeGtww(0oyI-?vNu6
+z^TXM09Ex^dDZ;tar^LMBOeK%H7W;SJ#A{)zrj;<gVere_`nzx0!;fCgWef?Q7yaKS
+zr4ilXAY(uEyx9LQQ?JVl>HmnoStPqxZLgEm3zNIDcdNGvx){gK$*>jXI`gWlo-;Cf
+zm$Cl}S9azz?Pun<HNR_GJ9*!N<cV){?s2X^Xu(qWe?juSS8-}i@zWmueUUbI-h0KJ
+z5uy&?PMplqTzX8kN3OlJOD#mbeQ$xIhncb1t}cG1zKt4ZZWbhdKI9N}R&R;C${X3^
+zcV$oS$P89hzs_a;ZQh0%ddt7QsW|&+wsq%Sulf5K=Ffe~RdcS{_)z(b@Jk0B^0iNQ
+zZ#ZKq6tV1o6i1HW7F+9THl;_VcQu3m$nDr)b~=9odlr+;S=}dgrxklvq!gZ=_T|t-
+zR^JVZ57wCKTHbP-vbyTLp+cb52JRU<&8zAUukL4JW@KPQP9eaA%iP$=P_$vKZRN}p
+zU%y;??9-n5HOxaTsQ$C=%SBbY^xh`?Z{Oox^0K1x(P9y)jt<@0`)8M3G1}1{SYvp6
+zRmKV7oew&fY_?`jH!!b``uxkyKBpy2JhMHPf8rH?@ed*&W^SAl*1&h%>i3$k++BCg
+c{uLH|{+cssT4etA3m$>ump}GawD^_-0G~{BVE_OC
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_4096.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_4096.pem
+new file mode 100644
+index 0000000..b7aed1c
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_4096.pem
+@@ -0,0 +1,20 @@
++-----BEGIN CERTIFICATE-----
++MIIDWzCCAsQCCQDxw4fA1PRXxTANBgkqhkiG9w0BAQQFADA0MTIwMAYDVQQKEylh
++eFRMUyBQcm9qZWN0IERvZGd5IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNjA2
++MDcxMTQ0MzJaFw0zMzEwMjMxMTQ0MzJaMCwxFjAUBgNVBAoTDWF4VExTIFByb2pl
++Y3QxEjAQBgNVBAMTCTEyNy4wLjAuMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
++AgoCggIBAPwntJldKsrQMAz6410QZVIdoHSrNrYQ8NzdfKMF1a0lBavUsAGjDa5n
++qfQ0fTBAC3HTJtxghCe7DjohEHKk89uXYt+liQ3vo6Nc+Zw9l2bDyLKffpOdVc/l
++tweL7FyQIM1fl2W5r/S9OffFRMJKXiN1HPXrfGYRrwz6B2cgUBtSgI+odwCmdfjb
++Ya4Wo8Za53UGeQ7v0eQ0lEDgXAhx3c2YIoXXxfe2J/5KdZnpXtRJWTJaoAbaQ4tU
++xECfVwbYwltHqRQJuUx0N4DMeQwnKgf3DWHWVqqWdALsAE5utfuOpuHxSoN2AGDz
++ov++GihbiEAcP5XPFv/0ldcfEi/4X9lyHb0mvUIa6DTdHd17thFEM12caD0TCszq
++in8JWVu6M0+oRQcDzIfMn4aD7oKtk76gY5HtbN4Jr8E4BHH/oGPe6l4mQl+W4f3o
++Zp2e7yG5WBVA9sjJbCmlxiWMHod1iiZUJ4e9cEFINjMWuooPIo6xKMzZcGHzwkBa
++zS6kHyTsHcfdHcu4aVMlJ9cKN/aesJgup/XseM3imzuJ3UqfvwCfneUKfM6DM8J3
++mFfSwUBvK8uLsMw5Elim/1oIbBG0PTt7BiLiNd0pU/weuL92y2+QB2oCPM0t5D7L
++IYyoZHHNlvTCkQVNsCHgrDUtOdpGlKt6zzEgUTqwC5i5N3p/w6uPAgMBAAEwDQYJ
++KoZIhvcNAQEEBQADgYEAcrCtPXmZyPX01uNMh2X1VkgmUn/zLemierou7WD/h7xL
++dOl4eeKjFBqIiC19382m1DK4h1F8MceqaMgTueCJpLM7A2cwN3ta8/pGP2yEVhdp
++h10PkdRPF/AU8JmxnFaADsc6+6xWbbrdNv5xcvP1bJKWWW+30EhRF9PxjXiETXc=
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_512.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_512.cer
+new file mode 100644
+index 0000000000000000000000000000000000000000..48c6e13aa0af5678668c7d4a3245a3304030f01e
+GIT binary patch
+literal 406
+zcmXqLVw_~q_=ky;;p5@<16RI;A2Q%&<J4;NX#38~$jHjdU|?csWMII?9LmBateIF5
+z;uEY8P?VpQnp~pblAn@Zso<PiRFavNnVeXXs^C~!l96AOSyE{rC(dhN288B@h9)M)
+zMp5Ft#>R#QM#fOCfsUb=fe6G@UKCReg$x8h;>^OFhDPRk20&<N5QFR}Mpg!9Zw3Po
+zCP#*g)&}t_8J%p~a*Osk<OLq|tPd|;sB8B0pe?_G)J5goUnQ69ls6RoS&((_jblg4
+zzYx*v#G_(KJ0?4R^tb)5x0i{Tk%1A}Y@mmk8ygw8T<y9KM14K_+%vyx^*)0-Vb=Of
+z^Mp;VUh%%N{nBP3u`f~Uw-)Z%{B_zi<u6}KRZ?ae<R5$`QgP~KtDBA7^o#xt*Tp#V
+zm}6L1oi7y--zB+a(l70&CztXn9MJDQdVZoyvbRyt?vfp=#N@B8oOG{$>Zk9;ChBUA
+P9b0QY{GW6AgzOst>~fQg
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_512.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_512.pem
+new file mode 100644
+index 0000000..8191e48
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_512.pem
+@@ -0,0 +1,11 @@
++-----BEGIN CERTIFICATE-----
++MIIBkjCB/AIJAPHDh8DU9FfCMA0GCSqGSIb3DQEBBQUAMDQxMjAwBgNVBAoTKWF4
++VExTIFByb2plY3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA2MDYw
++NzExNDQzMloXDTMzMTAyMzExNDQzMlowLDEWMBQGA1UEChMNYXhUTFMgUHJvamVj
++dDESMBAGA1UEAxMJMTI3LjAuMC4xMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANE7
++MF+pAUI9hm1yvkBuUcFJf1d1oS025cE9DyAa0SNt+nTSPiOwcPygat7sQYiE/lQV
++a2HFFmK4k0HxTz3/Lr0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAKRT6LwFr1xedJ
++b4qrvjB+EwV/0p4TNNXUS9S30rMSFvRar7VxvLP1lpYj9PR1JGSZMG/B6hR4yumF
++Rjwel9FPgNcWCW4DXAWqz3UQF7oZtJL6K+XJpQ0gwC+Nxc+RRGNLMlK7dLiqFh/V
++qZLej5Xy93M0JyZBiLV88P+c08gd7A==
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes128.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes128.pem
+new file mode 100644
+index 0000000..9a75fe9
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes128.pem
+@@ -0,0 +1,11 @@
++-----BEGIN CERTIFICATE-----
++MIIBkjCB/AIJAPHDh8DU9FfHMA0GCSqGSIb3DQEBBQUAMDQxMjAwBgNVBAoTKWF4
++VExTIFByb2plY3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA2MDYw
++NzExNDQzMloXDTMzMTAyMzExNDQzMlowLDEWMBQGA1UEChMNYXhUTFMgUHJvamVj
++dDESMBAGA1UEAxMJMTI3LjAuMC4xMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMDo
++g6K2iXFftW+Qk+rrzkMGWrtfY6YSxPstPRrI7akluUEoyWGITXbK6L3QfERrf2eu
++CnWyciQiHVRoHC0EgZUCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBT6YhR8x/bBteK
++lr8E0l4mATOnYlsmge+z/SFYs4bDBofqlwQCVJXNSBA4ZsEjgP9qIWTu/85QrVGq
++LrkewSM6Oeh95LGnE+uhJVtIX++O+Hsex3H1UL067dCG99XmDhqbEU9AI6YSZu2p
++cjoSowFELtOoG667+id9QObfV3EQoQ==
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes256.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes256.pem
+new file mode 100644
+index 0000000..4f3074e
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes256.pem
+@@ -0,0 +1,11 @@
++-----BEGIN CERTIFICATE-----
++MIIBkjCB/AIJAPHDh8DU9FfIMA0GCSqGSIb3DQEBBQUAMDQxMjAwBgNVBAoTKWF4
++VExTIFByb2plY3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA2MDYw
++NzExNDQzMloXDTMzMTAyMzExNDQzMlowLDEWMBQGA1UEChMNYXhUTFMgUHJvamVj
++dDESMBAGA1UEAxMJMTI3LjAuMC4xMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANAW
++9PdXa5u4gWi5VB5p/eQmOtteRq9/54JkiEs8cVNrTQgZsjjU1LGedE3JwBqZ1EIW
++HGPjcGg5dVxFjkn7RekCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBmJMt0Crdd/BPn
++EdmzsVXou0zTizTC8wyUPMVpg/KzzP7fhZux/ZIrH9/RVcJd9y+B2/mXc3C+K99+
++TXQoYKsLGArfDPzmpy1wPrdEcB1A9gkWDl1Uq6xRyvrVm3gX8NTITRuGKL9njgWx
++2SrApIBtOOUOinYtfH3745cVVl5HOA==
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_after.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_after.pem
+new file mode 100644
+index 0000000..79eb9cc
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_after.pem
+@@ -0,0 +1,11 @@
++-----BEGIN CERTIFICATE-----
++MIIBkjCB/AIJAPHDh8DU9FfKMA0GCSqGSIb3DQEBBQUAMDQxMjAwBgNVBAoTKWF4
++VExTIFByb2plY3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA2MDYw
++NzExNDQzMloXDTA1MDYwNzExNDQzMlowLDEWMBQGA1UEChMNYXhUTFMgUHJvamVj
++dDESMBAGA1UEAxMJMTI3LjAuMC4xMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANE7
++MF+pAUI9hm1yvkBuUcFJf1d1oS025cE9DyAa0SNt+nTSPiOwcPygat7sQYiE/lQV
++a2HFFmK4k0HxTz3/Lr0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQCmPSs9EceViMZD
++ZTXDZpQWJFcXaeInrXWgYWyVgnHBY/eSuqNCxkV/ehv/Wc5pWBGnrX+4cSvQ+TpQ
++FdZegeOjvgipjtJb/0TJCcvgcdHTntEM0h7VXjfbsJXAHwJPFzWIKxV4jeFXnaaw
++W+YHrj9GQ8PnFmapPuh4h/y6LyHAcg==
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_before.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_before.pem
+new file mode 100644
+index 0000000..fe72b54
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_before.pem
+@@ -0,0 +1,11 @@
++-----BEGIN CERTIFICATE-----
++MIIBkjCB/AIJAPHDh8DU9FfJMA0GCSqGSIb3DQEBBQUAMDQxMjAwBgNVBAoTKWF4
++VExTIFByb2plY3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTI0MTIz
++MTE0MDAwMFoXDTI1MTIzMTE0MDAwMFowLDEWMBQGA1UEChMNYXhUTFMgUHJvamVj
++dDESMBAGA1UEAxMJMTI3LjAuMC4xMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANE7
++MF+pAUI9hm1yvkBuUcFJf1d1oS025cE9DyAa0SNt+nTSPiOwcPygat7sQYiE/lQV
++a2HFFmK4k0HxTz3/Lr0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQApbldYefE8A0ez
++SYvAuCtYxx/2KHwBRD/cR0q7widl9WGjVC/dsnbFo109vHEr3FP1HVYSI0aweiaK
++XZmpUyJ9DprbbWQqaLuDnqIH8X7kfiMuO7/LGQc812iDJI2Akxp9cIlPBFBD8GVx
+++0EphzSodDDlLD8bPqLaWTE+8Ydtjw==
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_device.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_device.cer
+new file mode 100644
+index 0000000000000000000000000000000000000000..c966743c9ca724ecb81928d0f6ad7e62b29eab92
+GIT binary patch
+literal 401
+zcmXqLV(c|&Vl-#sWcYZv{lJwk;l~Vk**LY@JlekVGBUEVG8pI>iW!KoF^95n3G*ga
+zg!lw21Qg|Gr6!jc3K<B1#F>RT4UNq841mzkKu(<3zzhh@4Gm39jE$nid5w(?4UCMT
+zTmx-GO#^j^X$mN&DY&GTWhSR8IHwksWTs^%CzhldG|oqM3?nN8b7L=qL1QOVV<W>A
+zB|csu?fqp62d3^8%Qa9mSYy#4{w;o%qQvxI>(vh>*<B_H1hVnmoqm6d?p9~jehIIu
+z3hkWl&RzMZG}&pbclcJJJzTXH?4P|mtG+EI`RW2EkG!w-PS3smW>4W)IqNC%Ho9fI
+z%iCXCtE2tbBwl5l92<M$)2Zs!oO4c{R9!iBk2DiABLgF{^MGN+?8qRnJ@DK*r6kRQ
+zou!f8d$dn2ktz*-u-<dx)#DCf4@GC2zl%QMx4GT9;@g7M%efZ}Rf5VD`U~Sc_su=`
+KLZ@nBTsQzLwv8$P
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_device.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_device.pem
+new file mode 100644
+index 0000000..e9cbaaf
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_device.pem
+@@ -0,0 +1,24 @@
++-----BEGIN CERTIFICATE-----
++MIIBjTCCATcCCQDxw4fA1PRXxjANBgkqhkiG9w0BAQUFADAsMRYwFAYDVQQKEw1h
++eFRMUyBQcm9qZWN0MRIwEAYDVQQDEwkxMjcuMC4wLjEwHhcNMDYwNjA3MTE0NDMy
++WhcNMzMxMDIzMTE0NDMyWjArMSkwJwYDVQQKEyBheFRMUyBQcm9qZWN0IERldmlj
++ZSBDZXJ0aWZpY2F0ZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1CIODRIr
++v3YgwJW7Fm0wITCsOIgX9l+aIRiXUzur4RkHRJIQUQYM3ZfftC21QyWPGErVIIcJ
++7s7U/iKTQq1LV7USvAp90D/m7s0ntmRj1aBCSG71f0LnSv1rlA8kzUkU7VuEt0Tt
+++iqrW0+sYdUBk11dyPLKe6sJnMrJJamVvBsCAwEAATANBgkqhkiG9w0BAQUFAANB
++ABC3Uc6uImIpcLl1WYu8K8qkGnVT4K9JkdXHQFbhFZs37lvITrOHQ3j2oGXTbdAx
++JFJ3II9xXkm+nc7oLHqhXlc=
++-----END CERTIFICATE-----
++-----BEGIN CERTIFICATE-----
++MIIB3zCCAUgCCQCdbnM4pjqlWjANBgkqhkiG9w0BAQUFADA0MTIwMAYDVQQKEylh
++eFRMUyBQcm9qZWN0IERvZGd5IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNjA2
++MDcxMTQ0MzJaFw0zMzEwMjMxMTQ0MzJaMDQxMjAwBgNVBAoTKWF4VExTIFByb2pl
++Y3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
++A4GNADCBiQKBgQCnZdk20fYWh8O6kDTt0AuJWyp0YIrb7W1UNNMPXI5wA4J59IVj
++Nmk5wocm9+Hqzbg7rORAN/mHPBhzLAjhnm1HODs36hW15DtbDkkH4wCM/Tsyv79m
++n0xq1V6peK3t9vi2D4p/IRjHkYR2jm+BeknopijhY0kHHfpGTHa2DnVirwIDAQAB
++MA0GCSqGSIb3DQEBBQUAA4GBAB0LgNo0oCcwIie5plgwwFybQ8x95q6e3wndM/Mp
++3gjcAFbGuchpo3dfFlTcRI0KyERb3q1MVxPM4sff9nT7EdHVyK9s8/ITkP2dcTKc
++flbcTEfJVIeM8L2P5F41Hvn9GuGcMW8EmsC06gdbp1LLnqsdrXdMNBsAUBXfgPrU
+++UcZ
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/datatest.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/datatest.c
+new file mode 100644
+index 0000000..2a5e836
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/datatest.c
+@@ -0,0 +1,43 @@
++
++#include <string.h>
++#include <stdlib.h>
++#include "ssl.h"
++
++int main(int argc, char *argv[])
++{
++ bigint *m1, *m2, *d;
++ BI_CTX *ctx = bi_initialize();
++ char cmp1[1024], cmp2[1024];
++
++ const char *plaintext = /* 128 byte number */
++ "01aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee"
++ "01aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee";
++ d = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext));
++ memset(cmp1, 0, sizeof(cmp1));
++
++ while (1)
++ {
++ bi_set_mod(ctx, bi_clone(ctx, d), 0);
++ m1 = bi_square(ctx, bi_copy(d));
++ m2 = bi_residue(ctx, m1);
++ bi_free_mod(ctx, 0);
++
++ //bi_export(ctx, bi_copy(d), cmp1, sizeof(cmp1));
++ bi_export(ctx, m2, cmp2, sizeof(cmp2));
++
++ if (memcmp(cmp1, cmp2, sizeof(cmp1)) != 0)
++ {
++ printf("Error!\n"); TTY_FLUSH();
++ break;
++ }
++
++ d = bi_add(ctx, d, int_to_bi(ctx, 1));
++ }
++
++ bi_free(ctx, d);
++ bi_terminate(ctx);
++ printf("all good\n"); TTY_FLUSH();
++ return 0;
++
++}
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/datatest.c.old b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/datatest.c.old
+new file mode 100644
+index 0000000..a5703fb
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/datatest.c.old
+@@ -0,0 +1,280 @@
++#include "crypto.h"
++
++#include <string.h>
++#include <stdlib.h>
++//#define DEBUG_TEST
++
++typedef enum {
++ encrypt, decrypt
++} CryptoMode;
++
++void hex_dump(const char* header, const unsigned char* data, const unsigned int data_length)
++{
++ unsigned int byte_count;
++ printf("%s (%d bytes):\n", header, data_length);
++ for(byte_count = 0; byte_count < data_length; ++byte_count)
++ {
++ printf("%02X", data[byte_count]);
++ }
++ printf("\n");
++}
++
++void do_rsa(const CryptoMode crypto_mode,
++ const unsigned char* data, const unsigned int data_length,
++ const unsigned char* modulus, const unsigned int modulus_length,
++ const unsigned char* exponent, const unsigned int exponent_length,
++ unsigned char* result, const unsigned int result_length)
++{
++ RSA_CTX* rsa_context = NULL;
++ BI_CTX *bi_ctx;
++ bigint *plaintext_bi;
++ bigint *enc_data_bi, *dec_data_bi;
++
++#ifdef DEBUG_TEST
++ printf("do_rsa:\n");
++ hex_dump("data", data, data_length);
++ hex_dump("modulus", modulus, modulus_length);
++ hex_dump("exponent", exponent, exponent_length);
++#endif
++
++ RSA_priv_key_new(&rsa_context, modulus, modulus_length, exponent, exponent_length, exponent, exponent_length);
++ memset(result, 0, result_length);
++ bi_ctx = rsa_context->bi_ctx;
++
++ switch(crypto_mode)
++ {
++ case encrypt:
++#ifdef DEBUG_TEST
++ printf("encrypt\n");
++#endif
++ plaintext_bi = bi_import(bi_ctx, data, data_length);
++ enc_data_bi = RSA_public(rsa_context, plaintext_bi);
++ bi_export(bi_ctx, enc_data_bi, result, result_length);
++ break;
++
++ case decrypt:
++
++#ifdef DEBUG_TEST
++ printf("decrypt\n");
++#endif
++ plaintext_bi = bi_import(bi_ctx, data, data_length);
++ dec_data_bi = RSA_private(rsa_context, plaintext_bi);
++ bi_export(bi_ctx, dec_data_bi, result, result_length);
++ break;
++ }
++#ifdef DEBUG_TEST
++ hex_dump("result", result, result_length);
++#endif
++
++ RSA_free(rsa_context);
++}
++
++void test_matching(char* test_description,
++ const unsigned char* expected, const unsigned int expected_length,
++ const unsigned char* result, const unsigned int result_length)
++{
++ int test_result = memcmp(expected, result, expected_length);
++ printf("Testing %s ... ", test_description);
++ if(test_result == 0)
++ {
++ printf("ok.\n");
++ }
++ else
++ {
++ printf("failed!\n");
++ hex_dump("should be", expected, expected_length);
++ hex_dump("but is", result, result_length);
++ }
++}
++
++void encrypt_decrypt_should_yield_original(char* test_description,
++ const unsigned char* data, const unsigned int data_length,
++ const unsigned char* modulus, const unsigned int modulus_length,
++ const unsigned char* private_exponent, const unsigned int private_exponent_length,
++ const unsigned char* public_exponent, const unsigned int public_exponent_length,
++ const unsigned char* cryptogram, const unsigned int cryptogram_length)
++{
++ const unsigned int calculated_cryptogram_length = modulus_length;
++ unsigned char* calculated_cryptogram = malloc(calculated_cryptogram_length);
++ const unsigned int decrypted_data_length = modulus_length;
++ unsigned char* decrypted_data = malloc(decrypted_data_length);
++
++ printf("\nRunning \"%s\" ...\n", test_description);
++
++#ifdef DEBUG_TEST
++ printf("encrypt_decrypt_should_yield_original:\n");
++ hex_dump("data", data, data_length);
++ hex_dump("modulus", modulus, modulus_length);
++ hex_dump("private_exponent", private_exponent, private_exponent_length);
++ hex_dump("public_exponent", public_exponent, public_exponent_length);
++ hex_dump("cryptogram", cryptogram, cryptogram_length);
++#endif
++
++ do_rsa(encrypt, data, data_length,
++ modulus, modulus_length,
++ private_exponent, private_exponent_length,
++ calculated_cryptogram, calculated_cryptogram_length);
++
++#ifdef DEBUG_TEST
++ hex_dump("calculated_cryptogram", calculated_cryptogram, calculated_cryptogram_length);
++#endif
++
++ if(cryptogram != NULL)
++ {
++ test_matching("cryptogram", cryptogram, cryptogram_length,
++ calculated_cryptogram, calculated_cryptogram_length);
++ }
++
++ do_rsa(decrypt, calculated_cryptogram, calculated_cryptogram_length,
++ modulus, modulus_length,
++ public_exponent, public_exponent_length,
++ decrypted_data, decrypted_data_length);
++
++ test_matching("decrypted plaintext", data, data_length,
++ decrypted_data, decrypted_data_length);
++
++ free(calculated_cryptogram);
++ free(decrypted_data);
++}
++
++/* configure without CRT!
++
++ prepare data with:
++ > echo "<string>" |
++ ruby -ne '$_.gsub!(/ /, "").scan(/../).each_with_index \
++ { |b, i| print "\"\n\"" if i % 16 == 0; print "\\x" + b;}' */
++int main(int argc, char *argv[])
++{
++#if 0
++ unsigned char stuff[] = {
++ 0x22, 0x33, 0x44, 0x81,
++ 0xF1, 0xFF, 0xAA, 0xBB,
++ 0xCC, 0xDD, 0xEE , 0x01,
++ 0x45, 0x44, 0xfa, 0x8d,
++ 0xfa, 0x20, 0x99, 0xFF,
++ 0xab, 0xda, 0xac, 0x40 };
++ unsigned char resA[sizeof(stuff)*2], resB[sizeof(stuff)*2];
++
++ BI_CTX *bi_ctx = bi_initialize();
++ bigint *bi_data1, *bi_data2, *res1, *res2;
++ bi_data1 = bi_import(bi_ctx, stuff, sizeof(stuff));
++ bi_data2 = bi_import(bi_ctx, stuff, sizeof(stuff));
++
++ res1 = bi_multiply(bi_ctx, bi_copy(bi_data1), bi_copy(bi_data2));
++ res2 = bi_multiply(bi_ctx, bi_data1, bi_data2);
++ bi_print("MULTIPLY", res1);
++ bi_print("SQUARE", res2);
++ bi_export(bi_ctx, res1, resA, sizeof(resA));
++ bi_export(bi_ctx, res2, resB, sizeof(resB));
++ if (memcmp(resA, resB, sizeof(resA)))
++ printf("OUCH - difference!\n");
++ bi_terminate(bi_ctx);
++
++ exit(0);
++#endif
++ encrypt_decrypt_should_yield_original("Works only with Montgomery",
++ (const unsigned char*) /* data */
++ "\xBC\xD3\x12\x6C\x93\x13\x14\x4C\x00\x5D\xFD\xBF\xDE\xE4\xD3\x60"
++ "\x29\xB8\xAE\x47\xBE\x0B\xB6\x0A\x39\x88\xB7\x93\x19\x14\xE8\x88"
++ "\x4A\xDE\x00\x46\x89\x5A\x11\x1A\xC4\x8F\xE8\xF7\x27\xAC\x59\x80"
++ "\x03\xC1\x93\x14\x01\x00\x93\x15\x07\x00\x00\x00\x01\x01\x05\x20"
++ "\x93\x16\x0F\x42\x34\x33\x3A\x58\x30\x30\x30\x31\x30\x31\x30\x30"
++ "\x30\x31\x92\x6B\x10\x6C\x69\x62\x65\x6C\x6D\x65\x74\x72\x65\x65"
++ "\x2E\x73\x6F\x2E\x30\x93\x18\x02\xA5\x92\x92\x6C\x03\x96\xE3\x0C"
++ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xB7\xBE", 128,
++ (const unsigned char*) /* modulus */
++ "\xc4\x5a\xcb\x35\x95\xad\x32\x4a\xcf\x9c\x82\x45\x13\xb7\x42\x35"
++ "\x22\x32\x6d\x2e\x6d\x26\x2e\x6d\x00\x9b\xae\x2d\x9e\x78\x1e\xdd"
++ "\x40\x23\x17\xa8\xbb\xa1\x07\x86\xb4\x3c\xbc\xe8\xd5\xfc\xd9\xeb"
++ "\x3c\xad\x63\x11\xf3\x1d\x64\x81\x96\xf2\xf5\xfe\xca\x5a\xf7\x8a"
++ "\x15\xcb\x90\x81\x68\xae\x59\xb4\xe1\xa4\x41\x99\xcd\xf3\x98\xbd"
++ "\x3c\x48\x37\xdb\xa1\xc3\x1c\x6f\x43\xd1\x89\x23\xe5\x3d\xa3\xa5"
++ "\x92\x7b\x19\x14\x1e\x7a\xf3\x88\x8a\x36\x21\x3e\x16\x40\x3c\xd7"
++ "\xd3\xdb\x13\xaf\xc9\x68\x45\x84\xb3\x39\x8f\x02\xed\x28\x02\x5f", 128,
++ (const unsigned char*) /* private exponent */
++ "\x5d\x19\xb7\xb4\x66\x8d\xc2\x84\xda\x3f\x99\x3c\xeb\x86\x3e\xec"
++ "\x36\x94\xb6\x54\x07\x08\xcd\x86\x7d\x7d\x53\x6e\xe9\xee\x86\xa3"
++ "\xdd\x5f\x46\x3e\x89\x08\x67\x2b\x25\x96\x8e\xf3\xcf\x52\x9e\x78"
++ "\xfd\x42\x30\xf1\x37\xd6\xbd\xea\xfc\x09\xa3\x3d\xf5\xf0\x7f\xe1"
++ "\xb1\xe0\x69\x13\x44\xf9\x8b\x95\x58\x2a\x81\xb3\xa8\x15\xce\x7e"
++ "\xd3\xea\x97\x0a\xa2\x14\xd4\xae\xc7\x75\xbb\x9f\x68\xa5\x53\x0e"
++ "\x85\x29\x88\x48\x6c\xc9\xcc\xde\x72\x40\x3a\x4c\x82\xde\x3c\xfb"
++ "\x08\xf8\x2c\x26\xb5\xd4\xea\xc4\xca\x98\x6e\x43\x3e\x67\x54\xc1", 128,
++ (const unsigned char*) /* public exponent */
++ "\x01\x00\x01", 3,
++ (const unsigned char*) /* precalculated encrypted data */
++ "\x93\xE8\x1F\xF9\x70\xFA\xAA\xED\x54\xFD\x48\x37\xC9\x71\x9A\x11"
++ "\x69\x80\xB4\x22\x0C\xAD\x5A\x95\x65\xCA\x7C\xF7\x70\x56\x92\xCB"
++ "\x45\x6D\x58\x84\x21\x80\x23\x76\x21\x4A\x61\x99\xC1\x11\x9C\x0F"
++ "\x40\xED\x80\x9C\x8F\x3A\x4F\x01\xB5\x72\xC3\x24\xAE\xF3\x6B\x98"
++ "\xA8\x60\xAC\xAF\x95\x98\x9A\xAA\xA4\x28\xF2\x02\x05\xFC\xF3\xDD"
++ "\xB0\x5A\x4E\xDE\x3C\x41\x4B\x1C\x5B\x1F\xF6\x3D\xAF\x93\x43\xCB"
++ "\xD8\xC7\x24\x97\x8F\x49\xE5\x5B\x10\x51\x3B\x1E\xA6\x39\xEA\x4E"
++ "\xA5\xE0\x71\x8C\xCA\x34\x8C\x2F\x6C\x5C\x78\x34\x86\x7C\x54\x6A", 128);
++
++ encrypt_decrypt_should_yield_original("Works only with Barrett",
++ (const unsigned char*) /* data */
++ "\x36\x42\x32\xe4\x1e\x78\x02\x8e\xfb\x64\x5f\x0c\xfc\x5a\xd7\x5c"
++ "\xe4\xb5\x91\x5c\x4b\x00\x87\x28\x87\x9b\xa0\x4b\x09\xc2\x6b\x64"
++ "\xac\x4b\xcf\xa5\xee\x8a\xb7\xc9\xc9\x90\x02\xc1\xa3\x47\x5c\x6b"
++ "\x71\x5d\x5d\x49\x27\xe1\x15\xc6\xcf\x37\x9e\xa7\x0f\xa1\xad\x96"
++ "\x83\xef\x4b\x53\x68\xcd\x77\xfc\x14\x5f\xf5\xb7\x78\xb0\x10\xeb"
++ "\x0d\x61\x94\x01\xf6\xaa\x1b\x19\x23\x39\xa7\xcc\x6c\x42\x4a\x87"
++ "\x79\x27\x04\xc6\xec\x8e\x50\xba\xb9\x26\x89\xd4\x00\x01\x25\xe5"
++ "\xf3\x9e\x98\x0c\x8d\x2e\x43\x1e\xe9\x29\x90\xd2\x75\x61\x85\xe7", 128,
++ (const unsigned char*) /* modulus */
++ "\x37\x0c\x32\xe4\x1e\x78\x02\x8e\xfb\x64\x5f\x0c\xfc\x5a\xd7\x5c"
++ "\xe4\xb5\x91\x5c\x4b\x00\x87\x28\x87\x9b\xa0\x4b\x09\xc2\x6b\x64"
++ "\xac\x4b\xcf\xa5\xee\x8a\xb7\xc9\xc9\x90\x02\xc1\xa3\x47\x5c\x6b"
++ "\x71\x5d\x5d\x49\x27\xe1\x15\xc6\xcf\x37\x9e\xa7\x0f\xa1\xad\x96"
++ "\x83\xef\x4b\x53\x68\xcd\x77\xfc\x14\x5f\xf5\xb7\x78\xb0\x10\xeb"
++ "\x0d\x61\x94\x01\xf6\xaa\x1b\x19\x23\x39\xa7\xcc\x6c\x42\x4a\x87"
++ "\x79\x27\x04\xc6\xec\x8e\x50\xba\xb9\x26\x89\xd4\x00\x01\x25\xe5"
++ "\xf3\x9e\x98\x0c\x8d\x2e\x43\x1e\xe9\x29\x90\xd2\x75\x61\x85\xe7", 128,
++ (const unsigned char*) /* private exponent */
++ "\x16\x3a\x76\xd2\x66\xfb\x4f\x0d\x2d\xb6\x7a\x2b\x64\x3b\xca\x7b"
++ "\x58\x5f\x79\x33\x2b\x96\x2a\xfd\xd2\xc4\xa5\x15\xa7\xfb\x3a\x22"
++ "\x8c\xf0\x90\x09\x11\x2a\x32\xcc\xe8\xf7\x9e\x25\x53\x29\x9d\xc8"
++ "\x45\x1e\xce\x6c\x9c\x0d\xe8\x1d\x3f\xcf\xd5\xe0\xe0\x0f\x09\x69"
++ "\x2d\xe7\xd5\xe6\xe5\x10\xd9\x4e\x20\xdb\xbd\xa1\x04\x6b\xe6\x1d"
++ "\x4c\x79\x28\x47\x30\x11\xde\x14\xb4\x6e\x35\x98\x38\x50\x44\x82"
++ "\xbd\xc4\xfb\x03\xb3\xf6\x5e\x5a\x29\xfa\x29\xaa\xde\xe4\xfd\x15"
++ "\xbe\xed\x4f\x93\x9d\x0d\x29\xe8\xd7\xa3\xf4\x18\xc8\x98\xb1\x01", 128,
++ (const unsigned char*) /* public exponent */
++ "\x01\x00\x01", 3,
++ NULL, 0);
++
++ encrypt_decrypt_should_yield_original("Works always",
++ (const unsigned char*) /* data */
++ "\xB9\x42\x32\xe4\x1e\x78\x02\x8e\xfb\x64\x5f\x0c\xfc\x5a\xd7\x5c"
++ "\xe4\xb5\x91\x5c\x4b\x00\x87\x28\x87\x9b\xa0\x4b\x09\xc2\x6b\x64"
++ "\xac\x4b\xcf\xa5\xee\x8a\xb7\xc9\xc9\x90\x02\xc1\xa3\x47\x5c\x6b"
++ "\x71\x5d\x5d\x49\x27\xe1\x15\xc6\xcf\x37\x9e\xa7\x0f\xa1\xad\x96"
++ "\x83\xef\x4b\x53\x68\xcd\x77\xfc\x14\x5f\xf5\xb7\x78\xb0\x10\xeb"
++ "\x0d\x61\x94\x01\xf6\xaa\x1b\x19\x23\x39\xa7\xcc\x6c\x42\x4a\x87"
++ "\x79\x27\x04\xc6\xec\x8e\x50\xba\xb9\x26\x89\xd4\x00\x01\x25\xe5"
++ "\xf3\x9e\x98\x0c\x8d\x2e\x43\x1e\xe9\x29\x90\xd2\x75\x61\x85\xe7", 128,
++ (const unsigned char*) /* modulus */
++ "\xB9\x77\xEC\x83\x95\xAF\xB1\xF8\x21\x21\xFF\x05\x5E\x0C\x91\x0C"
++ "\x2E\xD5\xD2\x94\x1C\x38\x5E\xED\x5A\xCF\x84\xD0\x12\x8B\xAA\x4B"
++ "\x3A\x63\x65\x78\x13\xED\x24\x4E\x83\xF2\xF5\x02\x66\x5D\xFC\xC1"
++ "\x80\x5B\x78\x78\xB4\x0B\x45\xE5\x22\xC6\xCD\xEB\xCC\x74\x0B\x0B"
++ "\xD8\x8B\x91\x99\x48\x8E\x74\xA9\xD0\x1A\x39\x94\xC2\xD4\x2E\x9A"
++ "\x8C\x0C\x35\x0D\x97\x8F\xC4\x62\x20\xE9\x78\x40\x97\x05\x98\xE6"
++ "\x22\x48\x3D\x3D\xCA\x6A\x3F\xEF\xB0\x23\x14\x30\xDA\x35\x46\x65"
++ "\x55\xEF\xEB\xA1\xA9\xCF\x83\xE7\xEF\xF2\x83\x6D\x38\xEA\x88\xED", 128,
++ (const unsigned char*) /* private exponent */
++ "\x52\x2A\x68\xE3\x9A\xAA\xED\xA3\x49\xBA\x6F\xEA\x86\xD1\xF6\x68"
++ "\x79\x4F\x4D\x2D\x44\x9B\x4C\xA2\xC6\xBA\x6C\xD2\x69\x84\xEA\x7A"
++ "\xCD\x71\x3F\x80\xC5\x03\x28\x34\x88\x8C\x58\x33\x29\xFA\xB5\x81"
++ "\x5C\x46\x29\xC6\xFF\xAC\x86\xD8\x8E\x61\x98\xD4\xC0\x0D\x20\xDE"
++ "\xEB\x61\x1C\x0C\x3C\x19\xA3\x75\x10\x7D\xDA\xA9\x55\xA7\x64\x5F"
++ "\xE0\xB6\x35\x62\x00\xD9\xD2\xF7\xA4\xDF\x85\xFF\xDF\x86\x75\x29"
++ "\x66\x16\x03\x8C\xC0\xB0\x3F\xAB\xBA\x41\xB3\x3C\x76\x58\xB6\xE2"
++ "\x1F\x36\x47\x5F\x1F\x0E\x4C\xB5\x29\x90\xDC\xA1\xF8\xFA\x58\x19", 128,
++ (const unsigned char*) /* public exponent */
++ "\x01\x00\x01", 3,
++ NULL, 0);
++
++ return 0;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/deutsche_telecom.x509_ca b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/deutsche_telecom.x509_ca
+new file mode 100644
+index 0000000000000000000000000000000000000000..0f4b96a0d5b66ac34b258e34a8943630d55feacc
+GIT binary patch
+literal 670
+zcmXqLVwz>p#KgRSnTe5!iBZLXmyJ`a&7<u*FC!xhD}zCyA-4f18*?ZNn=q4$tD%g6
+z6o|tmEbNk6T2h>xk*W}qnv<HHpR3^LZYXac3zFp)77Nh@2?wVpD})r47MCbEr{<NU
+z78xoVD1sC)3rk^W56aI6DsxmYG>{YLwX`%aH?TA`G&V6Xh!W>D1apmyO)Y`kfpAje
+zeB^LpWMyD(>}4=$>||<eWVmp5HqQca7Z?8ZiVnr;VIS-=GX!_tH2>7N?y$<5%!OzF
+zERzTg``<m^=-}<=6*`u;6B-?tzQ267p;yA@Q4kOJ{O>9Ao-X*XBQfdA{s)V1MQHyO
+zWy#)aHLqswC)*oOrXGIdcj#m4Y98-5?oH8;9tM=&_?EauBId2}0&ltI-~KIoDw&uW
+z85kEk890CgUzU$Wj73Dm@KODoQ$kaJe=JbA?W-YN=#+TOfFBt2vcfDJ25gLs|CtzB
+z4fsF;{6G#13o!QCki7_udS;;C=E@5EntVbwMZq<0PCjey;-LEFE80^xr_VBLt0)o^
+z{eRuHSc9>xWA4OP_pWJj^Vlt(S>nKR=8eFEls^UAc3BFke~M!W*vfs)>;B68FPk|v
+z8vb08JMyN$t<~qA>juWD7Hh=jyLr9SJ-zpI>PD-l%e+~<`HcU|RG(;Raeo+<;^qYa
+DuXy4z
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/equifax.x509_ca b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/equifax.x509_ca
+new file mode 100644
+index 0000000000000000000000000000000000000000..79b0a3f98764a07fdf6cae1a80eebf704d1f8796
+GIT binary patch
+literal 646
+zcmXqLVrnvIVtl=TnTe5!iIK&CmyJ`a&7<u*FC!xhD}zC>A-4f18*?ZNn=n&ou%V2B
+z6o|tmEbLlXnwgeZp%9#!Tw0W>;F*`KXQ*bN0+MAGmPM0Ibt)~+%u6jUR&aLIH8hYD
+z=e4vnFf%eVFfjmvC~;mR10*hOENz^R>^DYM2Ij_I27|^<rp88wbNZ5d#J88<o4hhU
+zidWp<M2cs|7p0q#SB_-3eb{1pw3S)m*m~Ecih-_<uf-zFjPf4^B&GcP8#rf`%FQox
+zo3+}x6fX-|nB?>_<V7vG>GV!Yaq7<?pU|kI{1*OhzjA-*nO>8vdHv|ahSG);D}~qW
+z>v(UKw>n<SB8h2(Q1!q5Wz0;>j0}v6(+pA!1lc$f+B_KBemDWcpM{x;f!%-~7^bqq
+zjEw(TSPhtglz}`*K$%6tK&(N;tHLNq@OGq_S={}DB4!R*?lnFO4P-$I_*lePuuG#x
+zF*DHrrO_*9GYdX@8Rm2L=SrUgyt6)^NzHtwT6QLK`?Zk6vS(+mk-WR5_38uLKS>J9
+zTf8GuKR)_7Rnh+ImAVKy_x2FGh=p6X{?K|~_<YadZyP<`9$jCM{WPp<mimkuw<MA0
+oC;#Lz3sp8)$a*yO{t^GDHBEbK(z0c?d+R4fo{iFK+GJh{0RBANs{jB1
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/gnutls.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/gnutls.cer
+new file mode 100755
+index 0000000000000000000000000000000000000000..312e3654048b040de7fe4267a0a16abbf0ddcb49
+GIT binary patch
+literal 599
+zcmXqLVhT2BV%)cYnTe5!iIKs8n~hVe&7<u*FC!zXfuy0hfhZeuC=0VNpL<?uh)=LW
+zNosM4g0rK6oH(z6xq*>^nW3?Pk)dG}kZXa&H83}nHjo5q<q{S`)>@oeRF+y~C}AK5
+zF_#}?pk8`jX-Q78UVc%!LE{``H!w0c_AnSUb}%(IT;CP5elgDny_M==tAhJhysmF7
+z^~s*G&+FB8xgXw#vyR;2W!Uk`M_ArWZ1TOL_s5pRZOYqrimM~Ebi%Z^%fk2YSeNlm
+zm)raDP5tGSZ+^F?EXZEqajv|sc#fg)f7=u5mL}xg+}0B{D}UR*`B{6He^_9w{&l<T
+zq^Hy76bD_Kf9*uyMkZ!P2FAsWlMNat81MicFDuN*_@9NzfWbft#1mu@HV|yW@QyG@
+zPL+knfQyYon~jl`m7ST<fFC5t57N%c%*?)k!9W%yz{euSBJ%pUYu?izs;7E-n|VuK
+zwq3a!x~0@W9we>I0t~bUk(V|yzt>L6d&agTOlQ%<1HtMiK21dqF;?crMuy~AZ)cCC
+zcar#4F@K*Wyr$(`<HptT7O&4J|9f&n)qSPYC;gzEw%hKqa<W{pkzIUC@@MwK@U^qF
+z#aa!DpH8{)sPR|c_u?y$q{^z4PiEbye|q9%ZPT9;e}l~Ux~wgNHv0s(Rjhumd^F+7
+evq?93r>=edOf)X_qG#W2@k=EugP0m@R{;Q^*WZi)
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/header_issue.dat b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/header_issue.dat
+new file mode 100755
+index 0000000000000000000000000000000000000000..a48d23d2b937820a533bc1394d6c155fd28c1959
+GIT binary patch
+literal 1159
+zcmWe*W@Kq%Vqj2XW^_B{aBjXp>E)wm*3`MA7YKbx?VUNb&ow+D@R^CtrU!`(45kd+
+z3@iZ*EWQj(j0R1Ne}Q;86SDvVivceir&gOs+jm|@Mpjk^gU02C@&>YO%%Ln?!eYS%
+znMJ92B?`{@xw)lznaPPInfZCehI|G*AO+mQtO1U?;Q@xK2Fh?lI2pynic1R$@{39w
+ziXqyQ^K<op*igto0HlpwnA0_}BtNetzdX;7+kg`!#v#n)=LO@i2{VNT!(72EECw|O
+z%@qc6;=Gm?28ISkhGs@4CMHqhyoTn6Mn)D;u0bZMc_=oK>_r&^DUdsvg@wz@%k`ix
+z(#=UO2Kme&200WNSs9qU84Ns_92wpo`5|5!qql9!X6NU%!l&1>n0uS&D5^(1N_N=q
+zT3#1Xo$~t3DZM?rcUCRjoTpWPC&fDJUdopHOj#<c1G(LwuVi9oWMD)#8yG{(jtrqD
+z41)X>EUEFSSFWs-_7#%qy;W$R;IY>2#oG<fXG~^lsd#>L(LO(Mop($Bszg1H5j-<7
+zYyB}vW~D>tw?BFLXek4en?Vzk6EF?DVd7-C`OWT+eQSgcnmt1@C72qS8d)Mz0)#t+
+ze1a<>?d5STc=(BH&V_n5t}ZuuwkKi#Kd5eDJK@OGejq5*ct+H>r89oKDBiP7sKoTQ
+zuBR~j#n<b<tD5jM{jdpG`eP!lgv7<}tK_qnn`h4s-YY5TZ~Z?0UHbX&QZpIN-d7Jz
+un{I{ue9ZX$@8k2^^|rJ(9awhqU;wwnhlMXaQ!Q?q>TEypxQCB{fdK$z?p#a&
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/killopenssl.sh b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/killopenssl.sh
+new file mode 100755
+index 0000000..17950fb
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/killopenssl.sh
+@@ -0,0 +1,2 @@
++#!/bin/sh
++ps -ef|grep openssl | /usr/bin/awk '{print $2}' |xargs kill -9
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/make_certs.sh b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/make_certs.sh
+new file mode 100755
+index 0000000..dfc39d4
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/make_certs.sh
+@@ -0,0 +1,174 @@
++#!/bin/sh
++
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++#
++# Generate the certificates and keys for testing.
++#
++
++PROJECT_NAME="axTLS Project"
++
++# Generate the openssl configuration files.
++cat > ca_cert.conf << EOF
++[ req ]
++distinguished_name = req_distinguished_name
++prompt = no
++
++[ req_distinguished_name ]
++ O = $PROJECT_NAME Dodgy Certificate Authority
++EOF
++
++cat > certs.conf << EOF
++[ req ]
++distinguished_name = req_distinguished_name
++prompt = no
++
++[ req_distinguished_name ]
++ O = $PROJECT_NAME
++ CN = 127.0.0.1
++EOF
++
++cat > device_cert.conf << EOF
++[ req ]
++distinguished_name = req_distinguished_name
++prompt = no
++
++[ req_distinguished_name ]
++ O = $PROJECT_NAME Device Certificate
++EOF
++
++# private key generation
++openssl genrsa -out axTLS.ca_key.pem 1024
++openssl genrsa -out axTLS.key_512.pem 512
++openssl genrsa -out axTLS.key_1024.pem 1024
++openssl genrsa -out axTLS.key_2048.pem 2048
++openssl genrsa -out axTLS.key_4096.pem 4096
++openssl genrsa -out axTLS.device_key.pem 1024
++openssl genrsa -aes128 -passout pass:abcd -out axTLS.key_aes128.pem 512
++openssl genrsa -aes256 -passout pass:abcd -out axTLS.key_aes256.pem 512
++
++# convert private keys into DER format
++openssl rsa -in axTLS.key_512.pem -out axTLS.key_512 -outform DER
++openssl rsa -in axTLS.key_1024.pem -out axTLS.key_1024 -outform DER
++openssl rsa -in axTLS.key_2048.pem -out axTLS.key_2048 -outform DER
++openssl rsa -in axTLS.key_4096.pem -out axTLS.key_4096 -outform DER
++openssl rsa -in axTLS.device_key.pem -out axTLS.device_key -outform DER
++
++# cert requests
++openssl req -out axTLS.ca_x509.req -key axTLS.ca_key.pem -new \
++ -config ./ca_cert.conf
++openssl req -out axTLS.x509_512.req -key axTLS.key_512.pem -new \
++ -config ./certs.conf
++openssl req -out axTLS.x509_1024.req -key axTLS.key_1024.pem -new \
++ -config ./certs.conf
++openssl req -out axTLS.x509_2048.req -key axTLS.key_2048.pem -new \
++ -config ./certs.conf
++openssl req -out axTLS.x509_4096.req -key axTLS.key_4096.pem -new \
++ -config ./certs.conf
++openssl req -out axTLS.x509_device.req -key axTLS.device_key.pem -new \
++ -config ./device_cert.conf
++openssl req -out axTLS.x509_aes128.req -key axTLS.key_aes128.pem \
++ -new -config ./certs.conf -passin pass:abcd
++openssl req -out axTLS.x509_aes256.req -key axTLS.key_aes256.pem \
++ -new -config ./certs.conf -passin pass:abcd
++
++# generate the actual certs.
++openssl x509 -req -in axTLS.ca_x509.req -out axTLS.ca_x509.pem \
++ -sha1 -days 10000 -signkey axTLS.ca_key.pem
++openssl x509 -req -in axTLS.x509_512.req -out axTLS.x509_512.pem \
++ -sha1 -CAcreateserial -days 10000 \
++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem
++openssl x509 -req -in axTLS.x509_1024.req -out axTLS.x509_1024.pem \
++ -sha1 -CAcreateserial -days 10000 \
++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem
++openssl x509 -req -in axTLS.x509_2048.req -out axTLS.x509_2048.pem \
++ -md5 -CAcreateserial -days 10000 \
++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem
++openssl x509 -req -in axTLS.x509_4096.req -out axTLS.x509_4096.pem \
++ -md5 -CAcreateserial -days 10000 \
++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem
++openssl x509 -req -in axTLS.x509_device.req -out axTLS.x509_device.pem \
++ -sha1 -CAcreateserial -days 10000 \
++ -CA axTLS.x509_512.pem -CAkey axTLS.key_512.pem
++openssl x509 -req -in axTLS.x509_aes128.req \
++ -out axTLS.x509_aes128.pem \
++ -sha1 -CAcreateserial -days 10000 \
++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem
++openssl x509 -req -in axTLS.x509_aes256.req \
++ -out axTLS.x509_aes256.pem \
++ -sha1 -CAcreateserial -days 10000 \
++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem
++
++# note: must be root to do this
++DATE_NOW=`date`
++if date -s "Jan 1 2025"; then
++openssl x509 -req -in axTLS.x509_512.req -out axTLS.x509_bad_before.pem \
++ -sha1 -CAcreateserial -days 365 \
++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem
++date -s "$DATE_NOW"
++touch axTLS.x509_bad_before.pem
++fi
++openssl x509 -req -in axTLS.x509_512.req -out axTLS.x509_bad_after.pem \
++ -sha1 -CAcreateserial -days -365 \
++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem
++
++# some cleanup
++rm axTLS*.req
++rm axTLS.srl
++rm *.conf
++
++# need this for the client tests
++openssl x509 -in axTLS.ca_x509.pem -outform DER -out axTLS.ca_x509.cer
++openssl x509 -in axTLS.x509_512.pem -outform DER -out axTLS.x509_512.cer
++openssl x509 -in axTLS.x509_1024.pem -outform DER -out axTLS.x509_1024.cer
++openssl x509 -in axTLS.x509_2048.pem -outform DER -out axTLS.x509_2048.cer
++openssl x509 -in axTLS.x509_4096.pem -outform DER -out axTLS.x509_4096.cer
++openssl x509 -in axTLS.x509_device.pem -outform DER -out axTLS.x509_device.cer
++
++# generate pkcs8 files (use RC4-128 for encryption)
++openssl pkcs8 -in axTLS.key_512.pem -passout pass:abcd -topk8 -v1 PBE-SHA1-RC4-128 -out axTLS.encrypted_pem.p8
++openssl pkcs8 -in axTLS.key_512.pem -passout pass:abcd -topk8 -outform DER -v1 PBE-SHA1-RC4-128 -out axTLS.encrypted.p8
++openssl pkcs8 -in axTLS.key_512.pem -nocrypt -topk8 -out axTLS.unencrypted_pem.p8
++openssl pkcs8 -in axTLS.key_512.pem -nocrypt -topk8 -outform DER -out axTLS.unencrypted.p8
++
++# generate pkcs12 files (use RC4-128 for encryption)
++openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem -certfile axTLS.ca_x509.pem -keypbe PBE-SHA1-RC4-128 -certpbe PBE-SHA1-RC4-128 -name "p12_with_CA" -out axTLS.withCA.p12 -password pass:abcd
++openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem -keypbe PBE-SHA1-RC4-128 -certpbe PBE-SHA1-RC4-128 -name "p12_without_CA" -out axTLS.withoutCA.p12 -password pass:abcd
++openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem -keypbe PBE-SHA1-RC4-128 -certpbe PBE-SHA1-RC4-128 -out axTLS.noname.p12 -password pass:abcd
++
++# PEM certificate chain
++cat axTLS.ca_x509.pem >> axTLS.x509_device.pem
++
++# set default key/cert for use in the server
++xxd -i axTLS.x509_1024.cer | sed -e \
++ "s/axTLS_x509_1024_cer/default_certificate/" > ../../ssl/cert.h
++xxd -i axTLS.key_1024 | sed -e \
++ "s/axTLS_key_1024/default_private_key/" > ../../ssl/private_key.h
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/microsoft.x509_ca b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/microsoft.x509_ca
+new file mode 100644
+index 0000000000000000000000000000000000000000..b90803452b6cd92749d3e34c60420fd20e5b1c4f
+GIT binary patch
+literal 1046
+zcmXqLVi7WEV*0g!nTe5!iJ##hL${4hhu}rKZ^>`&I~ee?acZ@Bw0-AgWMpAwFeot8
+zHqc~a4rSpMR&vfSs4U7%&nQvQNY+#^w6ru=@Xbsv$}i4OD^YOHFDlS8lrxZlC>BMP
+z$uCMQ$;{6)R5XwW$ukQ}AmoGc^Gg&QOG`5Hi!w_p4dldmEzJ!K4Gj#;4S*m@oY%;}
+z(8$;j${hd~H8Cn72MZ%B19KB2KZ8LNBNtN>BO}8~ro9IXo>_nLlh&9&y&}%w)uNTX
+zs_{SmP4!v4{omY03U)Pti)JtCPcX{9=#*0VZcW+AkXxT#&uNqCpWl+U`Dk`klJYfK
+zn|u6>lU__avR^lC)~pP*nHQ{d_Va9wP&?@MoXgH)n$AiM%N1`to1GrF@b8|L6PmcD
+zsb*n<Zn@9PnOjn<X9dU@a;S*RU-^8Zw!|~r8Ob6E5v-~6WzB=yzb}73h3S~|<^7?q
+zn>!o!TfGUH;<xVa@~Yetzx5Jlrg3U0GK5b^$TZ*WEyQjU_CNafk~A)kWtSSm!ryPR
+zjuUGvXSwxl-@1mW|2CYhzqVYeD8}a0o(~+0l?*nswVvFpP%hkhpNW}~fpKx;3WLU_
+z291k=@hi*7(m2bYae9M5^o4@=nML!I1M5UK`S$%ky|9S>@z+EkjRPZ-kzwi!?gPD_
+zr%RZ=-NC4Gqg?QFOoGw;dEBS%SSNP$pR{_W_~}FVWSy-G+)pIE|8xC}wRO}=vyjYx
+zD!KM2&#bz~T65R1*LJ=@LDuenLjDq&2mV}eek>TJ;QuPAdi^TN6WZpgy8BWW3U#US
+zColdUBJ)%6<TcUHL2L4yjoAM-iT`+-p2HjXZSTjR<9nYUG5Dik$k`z~Ra46Msw~se
+zj|~r)w?u#0c=ts3yHwBPK_T0=Flz|?pK$F1M}OUp=|@+a>pZD?vZDNP*#d?OS@s7n
+znRPvI6k1`LC7pHK^x+j5mM1G*Sx!V5Tjcr5@Fs2NTGVs-YKXntS((sf1-FH)+9#LJ
+IUw&x;05YnPSO5S3
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/microsoft.x509_ca.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/microsoft.x509_ca.pem
+new file mode 100644
+index 0000000..478e60b
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/microsoft.x509_ca.pem
+@@ -0,0 +1,24 @@
++-----BEGIN CERTIFICATE-----
++MIIEEjCCAvqgAwIBAgIPAMEAizw8iBHRPvZj7N9AMA0GCSqGSIb3DQEBBAUAMHAx
++KzApBgNVBAsTIkNvcHlyaWdodCAoYykgMTk5NyBNaWNyb3NvZnQgQ29ycC4xHjAc
++BgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0
++IFJvb3QgQXV0aG9yaXR5MB4XDTk3MDExMDA3MDAwMFoXDTIwMTIzMTA3MDAwMFow
++cDErMCkGA1UECxMiQ29weXJpZ2h0IChjKSAxOTk3IE1pY3Jvc29mdCBDb3JwLjEe
++MBwGA1UECxMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3Nv
++ZnQgUm9vdCBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
++AQCpAr3BcOY78k4bKJ+XeF4w6qKpjSVf+P6VTKO3/p2iID58UaKboo9gMmvRQmR5
++7qx2yVTa8uuchhyPn4Rms8VremIj1h083g8BkuiWxL8tZpqaaCaZ0Dosvwy1WCbB
++RucKPjiWLKkoOajsSYNC44QPu5psVWGsgnyhYC13TOmZtGQ7mlAcMQgkFJ+p55Er
++GOY9mGMUYFgFZZ8dN1KH96fvlALGG9O/VUWziYC/OuxUlE6u/ad6bXROrxjMlgko
++IQBXkGBpN7tLEgc8Vv9b+6RmCgim0oFWV++2O14WgXcE2va+roCV/rDNf9anGnJc
++PMq88AijIjCzBoXJsyB3E4XfAgMBAAGjgagwgaUwgaIGA1UdAQSBmjCBl4AQW9Bw
++72lyniNRfhSyTY7/y6FyMHAxKzApBgNVBAsTIkNvcHlyaWdodCAoYykgMTk5NyBN
++aWNyb3NvZnQgQ29ycC4xHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEh
++MB8GA1UEAxMYTWljcm9zb2Z0IFJvb3QgQXV0aG9yaXR5gg8AwQCLPDyIEdE+9mPs
++30AwDQYJKoZIhvcNAQEEBQADggEBAJXoC8CN85cYNe24ASTYdxHzXGAyn54Lyz4F
++kYiPyTrmIfLwV5MstaBHyGLv/NfMOztaqTZUaf4kbT/JzKreBXzdMY09nxBwarv+
++Ek8YacD80EPjEVogT+pie6+qGcgrNyUtvmWhEoolD2Oj91Qc+SHJ1hXzUqxuQzIH
++/YIX+OVnbA1R9r3xUse958Qw/CAxCYgdlSkaTdUdAqXxgOADtFv0sd3IV+5lScdS
++VLa0AygS/5DW8AiPfriXxas3LOR65Kh343agANBqP8HSNorgQRKoNWobats14dQc
++BOSoRQTIWjM4bk0cDWK3CqKM09VUP0bNHFWmcNsSOoeTdZ+n0qA=
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ms_iis.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ms_iis.cer
+new file mode 100755
+index 0000000..250b926
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ms_iis.cer
+@@ -0,0 +1,13 @@
++-----BEGIN CERTIFICATE-----
++MIIB5jCCAVOgAwIBAgIQWPe7KyA+U7lLUohulwW2HDAJBgUrDgMCHQUAMCExHzAd
++BgNVBAMTFmF4dGxzLmNlcm9jY2x1Yi5jb20uYXUwHhcNMDgwMzE3MTAyMTA2WhcN
++MDkwMzE3MTAyMTA2WjAhMR8wHQYDVQQDExZheHRscy5jZXJvY2NsdWIuY29tLmF1
++MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9JqHlQjrQMt3JW8yxcGhFagDa
++D4QiIY8+KItTt13fIBt5g1AG4VXniaylSqKKYNPwVzqSWl7WhxMmoFU73veF8o4M
++G0Zc5qbVB6ukrSV4WaTgHrIO6pWkyiaQ4L/eYfCo/2pByhl0IUKkf/TMN346/rFg
++JgrElx01l6QHNQrzVQIDAQABoycwJTATBgNVHSUEDDAKBggrBgEFBQcDATAOBgNV
++HQ8EBwMFALAAAAAwCQYFKw4DAh0FAAOBgQAbH94H1fryngROJ//Oa0D3vvTO8CJ3
++8VW+3gQEwrPBOWmN6RV8OM0dE6pf8wD3s7PTCcM5+/HI1Qk53nUGrNiOmKM1s0JB
++bvsO9RT+UF8mtdbo/n30M0MHMWPCC76baW3R+ANBp/V/z4l1ytpUTt+MHvz0VlUs
++J4uJA3s3uh23Tg==
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/perf_bigint.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/perf_bigint.c
+new file mode 100644
+index 0000000..a4ffab6
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/perf_bigint.c
+@@ -0,0 +1,228 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * Some performance testing of bigint.
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include "ssl.h"
++
++/**************************************************************************
++ * BIGINT tests
++ *
++ **************************************************************************/
++
++int main(int argc, char *argv[])
++{
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ RSA_CTX *rsa_ctx;
++ BI_CTX *ctx;
++ bigint *bi_data, *bi_res;
++ int diff, res = 1;
++ struct timeval tv_old, tv_new;
++ const char *plaintext;
++ uint8_t compare[MAX_KEY_BYTE_SIZE];
++ int i, max_biggie = 10; /* really crank performance */
++ int len;
++ uint8_t *buf;
++
++ /**
++ * 512 bit key
++ */
++ plaintext = /* 64 byte number */
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^";
++
++ len = get_file("../ssl/test/axTLS.key_512", &buf);
++ asn1_get_private_key(buf, len, &rsa_ctx);
++ ctx = rsa_ctx->bi_ctx;
++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext));
++ bi_res = RSA_public(rsa_ctx, bi_data);
++ bi_data = bi_res; /* reuse again */
++
++ gettimeofday(&tv_old, NULL);
++ for (i = 0; i < max_biggie; i++)
++ {
++ bi_res = RSA_private(rsa_ctx, bi_copy(bi_data));
++ if (i < max_biggie-1)
++ {
++ bi_free(ctx, bi_res);
++ }
++ }
++
++ gettimeofday(&tv_new, NULL);
++ bi_free(ctx, bi_data);
++
++ diff = (tv_new.tv_sec-tv_old.tv_sec)*1000 +
++ (tv_new.tv_usec-tv_old.tv_usec)/1000;
++ printf("512 bit decrypt time: %dms\n", diff/max_biggie);
++ TTY_FLUSH();
++ bi_export(ctx, bi_res, compare, 64);
++ RSA_free(rsa_ctx);
++ free(buf);
++ if (memcmp(plaintext, compare, 64) != 0)
++ goto end;
++
++ /**
++ * 1024 bit key
++ */
++ plaintext = /* 128 byte number */
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^";
++
++ len = get_file("../ssl/test/axTLS.key_1024", &buf);
++ asn1_get_private_key(buf, len, &rsa_ctx);
++ ctx = rsa_ctx->bi_ctx;
++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext));
++ bi_res = RSA_public(rsa_ctx, bi_data);
++ bi_data = bi_res; /* reuse again */
++
++ gettimeofday(&tv_old, NULL);
++ for (i = 0; i < max_biggie; i++)
++ {
++ bi_res = RSA_private(rsa_ctx, bi_copy(bi_data));
++ if (i < max_biggie-1)
++ {
++ bi_free(ctx, bi_res);
++ }
++ }
++
++ gettimeofday(&tv_new, NULL);
++ bi_free(ctx, bi_data);
++
++ diff = (tv_new.tv_sec-tv_old.tv_sec)*1000 +
++ (tv_new.tv_usec-tv_old.tv_usec)/1000;
++ printf("1024 bit decrypt time: %dms\n", diff/max_biggie);
++ TTY_FLUSH();
++ bi_export(ctx, bi_res, compare, 128);
++ RSA_free(rsa_ctx);
++ free(buf);
++ if (memcmp(plaintext, compare, 128) != 0)
++ goto end;
++
++ /**
++ * 2048 bit key
++ */
++ plaintext = /* 256 byte number */
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^";
++
++ len = get_file("../ssl/test/axTLS.key_2048", &buf);
++ asn1_get_private_key(buf, len, &rsa_ctx);
++ ctx = rsa_ctx->bi_ctx;
++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext));
++ bi_res = RSA_public(rsa_ctx, bi_data);
++ bi_data = bi_res; /* reuse again */
++
++ gettimeofday(&tv_old, NULL);
++ for (i = 0; i < max_biggie; i++)
++ {
++ bi_res = RSA_private(rsa_ctx, bi_copy(bi_data));
++ if (i < max_biggie-1)
++ {
++ bi_free(ctx, bi_res);
++ }
++ }
++ gettimeofday(&tv_new, NULL);
++ bi_free(ctx, bi_data);
++
++ diff = (tv_new.tv_sec-tv_old.tv_sec)*1000 +
++ (tv_new.tv_usec-tv_old.tv_usec)/1000;
++ printf("2048 bit decrypt time: %dms\n", diff/max_biggie);
++ TTY_FLUSH();
++ bi_export(ctx, bi_res, compare, 256);
++ RSA_free(rsa_ctx);
++ free(buf);
++ if (memcmp(plaintext, compare, 256) != 0)
++ goto end;
++
++ /**
++ * 4096 bit key
++ */
++ plaintext = /* 512 byte number */
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"
++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^";
++
++ len = get_file("../ssl/test/axTLS.key_4096", &buf);
++ asn1_get_private_key(buf, len, &rsa_ctx);
++ ctx = rsa_ctx->bi_ctx;
++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext));
++ gettimeofday(&tv_old, NULL);
++ bi_res = RSA_public(rsa_ctx, bi_data);
++ gettimeofday(&tv_new, NULL);
++ diff = (tv_new.tv_sec-tv_old.tv_sec)*1000 +
++ (tv_new.tv_usec-tv_old.tv_usec)/1000;
++ printf("4096 bit encrypt time: %dms\n", diff);
++ TTY_FLUSH();
++ bi_data = bi_res; /* reuse again */
++
++ gettimeofday(&tv_old, NULL);
++ for (i = 0; i < max_biggie; i++)
++ {
++ bi_res = RSA_private(rsa_ctx, bi_copy(bi_data));
++ if (i < max_biggie-1)
++ {
++ bi_free(ctx, bi_res);
++ }
++ }
++
++ gettimeofday(&tv_new, NULL);
++ bi_free(ctx, bi_data);
++
++ diff = (tv_new.tv_sec-tv_old.tv_sec)*1000 +
++ (tv_new.tv_usec-tv_old.tv_usec)/1000;
++ printf("4096 bit decrypt time: %dms\n", diff/max_biggie);
++ TTY_FLUSH();
++ bi_export(ctx, bi_res, compare, 512);
++ RSA_free(rsa_ctx);
++ free(buf);
++ if (memcmp(plaintext, compare, 512) != 0)
++ goto end;
++
++ /* done */
++ printf("Bigint performance testing complete\n");
++ res = 0;
++
++end:
++ return res;
++#else
++ return 0;
++#endif
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/socgen.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/socgen.cer
+new file mode 100755
+index 0000000000000000000000000000000000000000..a4278705b77b573b2d248ed305c22b2d09adcacd
+GIT binary patch
+literal 980
+zcmXqLV!mL|#B95OnTe5!NkD<!UQA;3LDto4mHbYXDlatPW#iOp^Jx3d%gD&e%3u(0
+z$Zf#M#vIDRCd?EXY^Y!$2jXxEiw6ZeD!3$;Bq{`_CYKgvmQ?B}c;+SR8R{A6fK+e`
+ztAZs`f$~LVsYMFTsYNB3X_?81C7Jno3XY{E8TlYx26E!O24)6kMivHO5C!C#gSbY<
+zrk19bQ3j2jNG?b#G88c21DVeu%<fuToS&DMYRC_CGf;$Gge@d9J+-LPP|`pg>_`!T
+z;QZvw)RI&M_td=9qQsn3Lm2}pu<JyGq0UZK2q?-=DNP2s%23Wg1|-WYBASz*o>`Kb
+zlb2eeSDc@mo|>nZoS$pZI3GE97+D#Z8+#dmE@WzKWVoD|Jf%l(uZI1`=4qA=*RJJA
+z?chpsFj>bp<>2Cnn~pKH_~~}+WSdv5Vp-g~=R*{W@9c}qf6Ug-cl@<zX_h@h&#s5_
+zP95G;wIrV{?S;w>VZLQQ_OCeH@^h`o<PB{5Z=4HR#CYf1F4l;a-L(d$7mZJ<#e@s!
+zzd0@DAZ6m9mE^xSn2DK@fpKvYV~Rl&V*)tJWQAFn3>XZ!fnJj3XJKJxVqIWh1LDZD
+zm>L)x7%tFXpxdUMQBqQ1rLUh{l%ofXrp)5Zbg*Cbf$<B8KuG-Q0TmdyfOIRc*cw<H
+zSh8^^w0SVL{cvSu7iTumGSFb-&}IWB8FnT{F&U7d#XwWb%ga$sEh<PfkOi5d$|7bU
+z0@K3G2xl=Fn84VKj4T=kY6dDWz5!#K1k|<p$;AaI1{>tUR59|fBpSpoj9n0I5NQx@
+z5Gux*nVXoNs-K>jW}s*wZ@|vRs?EpDB*h}q|Map{+nV0K?8E09vaWbY=u}JU8K{aW
+zL+t=2fqWD@^vjCDVjz=Ha|v@D1Bd<W*UzIQFRgLE`t6&3ThaZlhnD-o=gUg<+?cuZ
+z^^+-U7b_WT5Z@E$ma^gr@3BSw(#sXrX|GaFi?HZ)yy(ZX(I(=vnp&g7?>A4&`;!%a
+z`ZjicJXrPWUp61x_6yT?-1OPGnCp)Bskw&pd3$HgaIL><mUR1kql*6nnQ!JfoB$9p
+BGXwwt
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ssltest.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ssltest.c
+new file mode 100644
+index 0000000..d525e1a
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ssltest.c
+@@ -0,0 +1,1983 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * The testing of the crypto and ssl stuff goes here. Keeps the individual code
++ * modules from being uncluttered with test code.
++ *
++ * This is test code - I make no apologies for the quality!
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <signal.h>
++#include <string.h>
++#include <errno.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++
++#ifndef WIN32
++#include <pthread.h>
++#endif
++
++#include "ssl.h"
++
++#define DEFAULT_CERT "../ssl/test/axTLS.x509_512.cer"
++#define DEFAULT_KEY "../ssl/test/axTLS.key_512"
++//#define DEFAULT_SVR_OPTION SSL_DISPLAY_BYTES|SSL_DISPLAY_STATES
++#define DEFAULT_SVR_OPTION 0
++#define DEFAULT_CLNT_OPTION 0
++//#define DEFAULT_CLNT_OPTION SSL_DISPLAY_BYTES|SSL_DISPLAY_STATES
++
++static int g_port = 19001;
++
++/**************************************************************************
++ * AES tests
++ *
++ * Run through a couple of the RFC3602 tests to verify that AES is correct.
++ **************************************************************************/
++#define TEST1_SIZE 16
++#define TEST2_SIZE 32
++
++static int AES_test(BI_CTX *bi_ctx)
++{
++ AES_CTX aes_key;
++ int res = 1;
++ uint8_t key[TEST1_SIZE];
++ uint8_t iv[TEST1_SIZE];
++
++ {
++ /*
++ Case #1: Encrypting 16 bytes (1 block) using AES-CBC
++ Key : 0x06a9214036b8a15b512e03d534120006
++ IV : 0x3dafba429d9eb430b422da802c9fac41
++ Plaintext : "Single block msg"
++ Ciphertext: 0xe353779c1079aeb82708942dbe77181a
++
++ */
++ char *in_str = "Single block msg";
++ uint8_t ct[TEST1_SIZE];
++ uint8_t enc_data[TEST1_SIZE];
++ uint8_t dec_data[TEST1_SIZE];
++
++ bigint *key_bi = bi_str_import(
++ bi_ctx, "06A9214036B8A15B512E03D534120006");
++ bigint *iv_bi = bi_str_import(
++ bi_ctx, "3DAFBA429D9EB430B422DA802C9FAC41");
++ bigint *ct_bi = bi_str_import(
++ bi_ctx, "E353779C1079AEB82708942DBE77181A");
++ bi_export(bi_ctx, key_bi, key, TEST1_SIZE);
++ bi_export(bi_ctx, iv_bi, iv, TEST1_SIZE);
++ bi_export(bi_ctx, ct_bi, ct, TEST1_SIZE);
++
++ AES_set_key(&aes_key, key, iv, AES_MODE_128);
++ AES_cbc_encrypt(&aes_key, (const uint8_t *)in_str,
++ enc_data, sizeof(enc_data));
++ if (memcmp(enc_data, ct, sizeof(ct)))
++ {
++ printf("Error: AES ENCRYPT #1 failed\n");
++ goto end;
++ }
++
++ AES_set_key(&aes_key, key, iv, AES_MODE_128);
++ AES_convert_key(&aes_key);
++ AES_cbc_decrypt(&aes_key, enc_data, dec_data, sizeof(enc_data));
++
++ if (memcmp(dec_data, in_str, sizeof(dec_data)))
++ {
++ printf("Error: AES DECRYPT #1 failed\n");
++ goto end;
++ }
++ }
++
++ {
++ /*
++ Case #2: Encrypting 32 bytes (2 blocks) using AES-CBC
++ Key : 0xc286696d887c9aa0611bbb3e2025a45a
++ IV : 0x562e17996d093d28ddb3ba695a2e6f58
++ Plaintext : 0x000102030405060708090a0b0c0d0e0f
++ 101112131415161718191a1b1c1d1e1f
++ Ciphertext: 0xd296cd94c2cccf8a3a863028b5e1dc0a
++ 7586602d253cfff91b8266bea6d61ab1
++ */
++ uint8_t in_data[TEST2_SIZE];
++ uint8_t ct[TEST2_SIZE];
++ uint8_t enc_data[TEST2_SIZE];
++ uint8_t dec_data[TEST2_SIZE];
++
++ bigint *in_bi = bi_str_import(bi_ctx,
++ "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F");
++ bigint *key_bi = bi_str_import(
++ bi_ctx, "C286696D887C9AA0611BBB3E2025A45A");
++ bigint *iv_bi = bi_str_import(
++ bi_ctx, "562E17996D093D28DDB3BA695A2E6F58");
++ bigint *ct_bi = bi_str_import(bi_ctx,
++ "D296CD94C2CCCF8A3A863028B5E1DC0A7586602D253CFFF91B8266BEA6D61AB1");
++ bi_export(bi_ctx, in_bi, in_data, TEST2_SIZE);
++ bi_export(bi_ctx, key_bi, key, TEST1_SIZE);
++ bi_export(bi_ctx, iv_bi, iv, TEST1_SIZE);
++ bi_export(bi_ctx, ct_bi, ct, TEST2_SIZE);
++
++ AES_set_key(&aes_key, key, iv, AES_MODE_128);
++ AES_cbc_encrypt(&aes_key, (const uint8_t *)in_data,
++ enc_data, sizeof(enc_data));
++
++ if (memcmp(enc_data, ct, sizeof(ct)))
++ {
++ printf("Error: ENCRYPT #2 failed\n");
++ goto end;
++ }
++
++ AES_set_key(&aes_key, key, iv, AES_MODE_128);
++ AES_convert_key(&aes_key);
++ AES_cbc_decrypt(&aes_key, enc_data, dec_data, sizeof(enc_data));
++ if (memcmp(dec_data, in_data, sizeof(dec_data)))
++ {
++ printf("Error: DECRYPT #2 failed\n");
++ goto end;
++ }
++ }
++
++ res = 0;
++ printf("All AES tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * RC4 tests
++ *
++ * ARC4 tests vectors from OpenSSL (crypto/rc4/rc4test.c)
++ **************************************************************************/
++static const uint8_t keys[7][30]=
++{
++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
++ {8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
++ {4,0xef,0x01,0x23,0x45},
++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
++ {4,0xef,0x01,0x23,0x45},
++};
++
++static const uint8_t data_len[7]={8,8,8,20,28,10};
++static uint8_t data[7][30]=
++{
++ {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xff},
++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++ 0x00,0x00,0x00,0x00,0xff},
++ {0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
++ 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
++ 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
++ 0x12,0x34,0x56,0x78,0xff},
++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
++ {0},
++};
++
++static const uint8_t output[7][30]=
++{
++ {0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96,0x00},
++ {0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79,0x00},
++ {0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a,0x00},
++ {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,
++ 0xbd,0x61,0x5a,0x11,0x62,0xe1,0xc7,0xba,
++ 0x36,0xb6,0x78,0x58,0x00},
++ {0x66,0xa0,0x94,0x9f,0x8a,0xf7,0xd6,0x89,
++ 0x1f,0x7f,0x83,0x2b,0xa8,0x33,0xc0,0x0c,
++ 0x89,0x2e,0xbe,0x30,0x14,0x3c,0xe2,0x87,
++ 0x40,0x01,0x1e,0xcf,0x00},
++ {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,0xbd,0x61,0x00},
++ {0},
++};
++
++static int RC4_test(BI_CTX *bi_ctx)
++{
++ int i, res = 1;
++ RC4_CTX s;
++
++ for (i = 0; i < 6; i++)
++ {
++ RC4_setup(&s, &keys[i][1], keys[i][0]);
++ RC4_crypt(&s, data[i], data[i], data_len[i]);
++
++ if (memcmp(data[i], output[i], data_len[i]))
++ {
++ printf("Error: RC4 CRYPT #%d failed\n", i);
++ goto end;
++ }
++ }
++
++ res = 0;
++ printf("All RC4 tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * SHA1 tests
++ *
++ * Run through a couple of the RFC3174 tests to verify that SHA1 is correct.
++ **************************************************************************/
++static int SHA1_test(BI_CTX *bi_ctx)
++{
++ SHA1_CTX ctx;
++ uint8_t ct[SHA1_SIZE];
++ uint8_t digest[SHA1_SIZE];
++ int res = 1;
++
++ {
++ const char *in_str = "abc";
++ bigint *ct_bi = bi_str_import(bi_ctx,
++ "A9993E364706816ABA3E25717850C26C9CD0D89D");
++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
++
++ SHA1_Init(&ctx);
++ SHA1_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
++ SHA1_Final(digest, &ctx);
++
++ if (memcmp(digest, ct, sizeof(ct)))
++ {
++ printf("Error: SHA1 #1 failed\n");
++ goto end;
++ }
++ }
++
++ {
++ const char *in_str =
++ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
++ bigint *ct_bi = bi_str_import(bi_ctx,
++ "84983E441C3BD26EBAAE4AA1F95129E5E54670F1");
++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
++
++ SHA1_Init(&ctx);
++ SHA1_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
++ SHA1_Final(digest, &ctx);
++
++ if (memcmp(digest, ct, sizeof(ct)))
++ {
++ printf("Error: SHA1 #2 failed\n");
++ goto end;
++ }
++ }
++
++ res = 0;
++ printf("All SHA1 tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * MD5 tests
++ *
++ * Run through a couple of the RFC1321 tests to verify that MD5 is correct.
++ **************************************************************************/
++static int MD5_test(BI_CTX *bi_ctx)
++{
++ MD5_CTX ctx;
++ uint8_t ct[MD5_SIZE];
++ uint8_t digest[MD5_SIZE];
++ int res = 1;
++
++ {
++ const char *in_str = "abc";
++ bigint *ct_bi = bi_str_import(bi_ctx,
++ "900150983CD24FB0D6963F7D28E17F72");
++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
++
++ MD5_Init(&ctx);
++ MD5_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
++ MD5_Final(digest, &ctx);
++
++ if (memcmp(digest, ct, sizeof(ct)))
++ {
++ printf("Error: MD5 #1 failed\n");
++ goto end;
++ }
++ }
++
++ {
++ const char *in_str =
++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
++ bigint *ct_bi = bi_str_import(
++ bi_ctx, "D174AB98D277D9F5A5611C2C9F419D9F");
++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
++
++ MD5_Init(&ctx);
++ MD5_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
++ MD5_Final(digest, &ctx);
++
++ if (memcmp(digest, ct, sizeof(ct)))
++ {
++ printf("Error: MD5 #2 failed\n");
++ goto end;
++ }
++ }
++ res = 0;
++ printf("All MD5 tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * HMAC tests
++ *
++ * Run through a couple of the RFC2202 tests to verify that HMAC is correct.
++ **************************************************************************/
++static int HMAC_test(BI_CTX *bi_ctx)
++{
++ uint8_t key[SHA1_SIZE];
++ uint8_t ct[SHA1_SIZE];
++ uint8_t dgst[SHA1_SIZE];
++ int res = 1;
++ const char *key_str;
++
++ const char *data_str = "Hi There";
++ bigint *key_bi = bi_str_import(bi_ctx, "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B");
++ bigint *ct_bi = bi_str_import(bi_ctx, "9294727A3638BB1C13F48EF8158BFC9D");
++ bi_export(bi_ctx, key_bi, key, MD5_SIZE);
++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
++ hmac_md5((const uint8_t *)data_str, 8, key, MD5_SIZE, dgst);
++ if (memcmp(dgst, ct, MD5_SIZE))
++ {
++ printf("HMAC MD5 #1 failed\n");
++ goto end;
++ }
++
++ data_str = "what do ya want for nothing?";
++ key_str = "Jefe";
++ ct_bi = bi_str_import(bi_ctx, "750C783E6AB0B503EAA86E310A5DB738");
++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
++ hmac_md5((const uint8_t *)data_str, 28, (const uint8_t *)key_str, 4, dgst);
++ if (memcmp(dgst, ct, MD5_SIZE))
++ {
++ printf("HMAC MD5 #2 failed\n");
++ goto end;
++ }
++
++ data_str = "Hi There";
++ key_bi = bi_str_import(bi_ctx, "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B");
++ bi_export(bi_ctx, key_bi, key, SHA1_SIZE);
++ ct_bi = bi_str_import(bi_ctx, "B617318655057264E28BC0B6FB378C8EF146BE00");
++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
++
++ hmac_sha1((const uint8_t *)data_str, 8,
++ (const uint8_t *)key, SHA1_SIZE, dgst);
++ if (memcmp(dgst, ct, SHA1_SIZE))
++ {
++ printf("HMAC SHA1 #1 failed\n");
++ goto end;
++ }
++
++ data_str = "what do ya want for nothing?";
++ key_str = "Jefe";
++ ct_bi = bi_str_import(bi_ctx, "EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79");
++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
++
++ hmac_sha1((const uint8_t *)data_str, 28, (const uint8_t *)key_str, 5, dgst);
++ if (memcmp(dgst, ct, SHA1_SIZE))
++ {
++ printf("HMAC SHA1 failed\n");
++ exit(1);
++ }
++
++ res = 0;
++ printf("All HMAC tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * BIGINT tests
++ *
++ **************************************************************************/
++static int BIGINT_test(BI_CTX *ctx)
++{
++ int res = 1;
++ bigint *bi_data, *bi_exp, *bi_res;
++ const char *expnt, *plaintext, *mod;
++ uint8_t compare[MAX_KEY_BYTE_SIZE];
++
++ /**
++ * 512 bit key
++ */
++ plaintext = /* 64 byte number */
++ "01aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee";
++
++ mod = "C30773C8ABE09FCC279EE0E5343370DE"
++ "8B2FFDB6059271E3005A7CEEF0D35E0A"
++ "1F9915D95E63560836CC2EB2C289270D"
++ "BCAE8CAF6F5E907FC2759EE220071E1B";
++
++ expnt = "A1E556CD1738E10DF539E35101334E97"
++ "BE8D391C57A5C89A7AD9A2EA2ACA1B3D"
++ "F3140F5091CC535CBAA47CEC4159EE1F"
++ "B6A3661AFF1AB758426EAB158452A9B9";
++
++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext));
++ bi_exp = int_to_bi(ctx, 0x10001);
++ bi_set_mod(ctx, bi_str_import(ctx, mod), 0);
++ bi_res = bi_mod_power(ctx, bi_data, bi_exp);
++
++ bi_data = bi_res; /* resuse again - see if we get the original */
++
++ bi_exp = bi_str_import(ctx, expnt);
++ bi_res = bi_mod_power(ctx, bi_data, bi_exp);
++ bi_free_mod(ctx, 0);
++
++ bi_export(ctx, bi_res, compare, 64);
++ if (memcmp(plaintext, compare, 64) != 0)
++ goto end;
++
++ printf("All BIGINT tests passed\n");
++ res = 0;
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * RSA tests
++ *
++ * Use the results from openssl to verify PKCS1 etc
++ **************************************************************************/
++static int RSA_test(void)
++{
++ int res = 1;
++ const char *plaintext = /* 128 byte hex number */
++ "1aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee2"
++ "1aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeee2\012";
++ uint8_t enc_data[128], dec_data[128];
++ RSA_CTX *rsa_ctx = NULL;
++ BI_CTX *bi_ctx;
++ bigint *plaintext_bi;
++ bigint *enc_data_bi, *dec_data_bi;
++ uint8_t enc_data2[128], dec_data2[128];
++ int size;
++ int len;
++ uint8_t *buf;
++
++ /* extract the private key elements */
++ len = get_file("../ssl/test/axTLS.key_1024", &buf);
++ if (asn1_get_private_key(buf, len, &rsa_ctx) < 0)
++ {
++ goto end;
++ }
++
++ free(buf);
++ bi_ctx = rsa_ctx->bi_ctx;
++ plaintext_bi = bi_import(bi_ctx,
++ (const uint8_t *)plaintext, strlen(plaintext));
++
++ /* basic rsa encrypt */
++ enc_data_bi = RSA_public(rsa_ctx, plaintext_bi);
++ bi_export(bi_ctx, bi_copy(enc_data_bi), enc_data, sizeof(enc_data));
++
++ /* basic rsa decrypt */
++ dec_data_bi = RSA_private(rsa_ctx, enc_data_bi);
++ bi_export(bi_ctx, dec_data_bi, dec_data, sizeof(dec_data));
++
++ if (memcmp(dec_data, plaintext, strlen(plaintext)))
++ {
++ printf("Error: DECRYPT #1 failed\n");
++ goto end;
++ }
++
++ RSA_encrypt(rsa_ctx, (const uint8_t *)"abc", 3, enc_data2, 0);
++ size = RSA_decrypt(rsa_ctx, enc_data2, dec_data2, 1);
++ if (memcmp("abc", dec_data2, 3))
++ {
++ printf("Error: ENCRYPT/DECRYPT #2 failed\n");
++ goto end;
++ }
++
++ RSA_free(rsa_ctx);
++ res = 0;
++ printf("All RSA tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * Cert Testing
++ *
++ **************************************************************************/
++static int cert_tests(void)
++{
++ int res = -1, len;
++ X509_CTX *x509_ctx;
++ SSL_CTX *ssl_ctx;
++ uint8_t *buf;
++
++ /* check a bunch of 3rd party certificates */
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/microsoft.x509_ca", &buf);
++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #1\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/thawte.x509_ca", &buf);
++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #2\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/deutsche_telecom.x509_ca", &buf);
++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #3\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/equifax.x509_ca", &buf);
++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #4\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/gnutls.cer", &buf);
++ if ((res = add_cert(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #5\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/socgen.cer", &buf);
++ if ((res = add_cert(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #6\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/verisign.x509_ca", &buf);
++ if ((res = add_cert_auth(ssl_ctx, buf, len)) <0)
++ {
++ printf("Cert #7\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ if (get_file("../ssl/test/verisign.x509_my_cert", &buf) < 0 ||
++ x509_new(buf, &len, &x509_ctx))
++ {
++ printf("Cert #8\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ x509_free(x509_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ if ((res = ssl_obj_load(ssl_ctx,
++ SSL_OBJ_X509_CERT, "../ssl/test/ms_iis.cer", NULL)) != SSL_OK)
++ {
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ res = 0; /* all ok */
++ printf("All Certificate tests passed\n");
++
++bad_cert:
++ if (res)
++ printf("Error: A certificate test failed\n");
++ return res;
++}
++
++/**
++ * init a server socket.
++ */
++static int server_socket_init(int *port)
++{
++ struct sockaddr_in serv_addr;
++ int server_fd;
++ char yes = 1;
++
++ /* Create socket for incoming connections */
++ if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
++ {
++ return -1;
++ }
++
++ setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
++
++go_again:
++ /* Construct local address structure */
++ memset(&serv_addr, 0, sizeof(serv_addr)); /* Zero out structure */
++ serv_addr.sin_family = AF_INET; /* Internet address family */
++ serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
++ serv_addr.sin_port = htons(*port); /* Local port */
++
++ /* Bind to the local address */
++ if (bind(server_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
++ {
++ (*port)++;
++ goto go_again;
++ }
++ /* Mark the socket so it will listen for incoming connections */
++ if (listen(server_fd, 3000) < 0)
++ {
++ return -1;
++ }
++
++ return server_fd;
++}
++
++/**
++ * init a client socket.
++ */
++static int client_socket_init(uint16_t port)
++{
++ struct sockaddr_in address;
++ int client_fd;
++
++ address.sin_family = AF_INET;
++ address.sin_port = htons(port);
++ address.sin_addr.s_addr = inet_addr("127.0.0.1");
++ client_fd = socket(AF_INET, SOCK_STREAM, 0);
++ if (connect(client_fd, (struct sockaddr *)&address, sizeof(address)) < 0)
++ {
++ perror("socket");
++ SOCKET_CLOSE(client_fd);
++ client_fd = -1;
++ }
++
++ return client_fd;
++}
++
++/**************************************************************************
++ * SSL Server Testing
++ *
++ **************************************************************************/
++typedef struct
++{
++ /* not used as yet */
++ int dummy;
++} SVR_CTX;
++
++typedef struct
++{
++ const char *testname;
++ const char *openssl_option;
++} client_t;
++
++static void do_client(client_t *clnt)
++{
++ char openssl_buf[2048];
++
++ /* make sure the main thread goes first */
++ sleep(0);
++
++ /* show the session ids in the reconnect test */
++ if (strcmp(clnt->testname, "Session Reuse") == 0)
++ {
++ sprintf(openssl_buf, "echo \"hello client\" | openssl s_client "
++ "-connect localhost:%d %s 2>&1 | grep \"Session-ID:\"",
++ g_port, clnt->openssl_option);
++ }
++ else
++ {
++ sprintf(openssl_buf, "echo \"hello client\" | openssl s_client "
++#ifdef WIN32
++ "-connect localhost:%d -quiet %s",
++#else
++ "-connect localhost:%d -quiet %s > /dev/null 2>&1",
++#endif
++ g_port, clnt->openssl_option);
++ }
++
++ system(openssl_buf);
++}
++
++static int SSL_server_test(
++ const char *testname,
++ const char *openssl_option,
++ const char *device_cert,
++ const char *product_cert,
++ const char *private_key,
++ const char *ca_cert,
++ const char *password,
++ int axtls_option)
++{
++ int server_fd, ret = 0;
++ SSL_CTX *ssl_ctx = NULL;
++ struct sockaddr_in client_addr;
++ uint8_t *read_buf;
++ socklen_t clnt_len = sizeof(client_addr);
++ client_t client_data;
++#ifndef WIN32
++ pthread_t thread;
++#endif
++ g_port++;
++
++ client_data.testname = testname;
++ client_data.openssl_option = openssl_option;
++
++ if ((server_fd = server_socket_init(&g_port)) < 0)
++ goto error;
++
++ if (private_key)
++ {
++ axtls_option |= SSL_NO_DEFAULT_KEY;
++ }
++
++ if ((ssl_ctx = ssl_ctx_new(axtls_option, SSL_DEFAULT_SVR_SESS)) == NULL)
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto error;
++ }
++
++ if (private_key)
++ {
++ int obj_type = SSL_OBJ_RSA_KEY;
++
++ if (strstr(private_key, ".p8"))
++ obj_type = SSL_OBJ_PKCS8;
++ else if (strstr(private_key, ".p12"))
++ obj_type = SSL_OBJ_PKCS12;
++
++ if (ssl_obj_load(ssl_ctx, obj_type, private_key, password))
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto error;
++ }
++ }
++
++ if (device_cert) /* test chaining */
++ {
++ if ((ret = ssl_obj_load(ssl_ctx,
++ SSL_OBJ_X509_CERT, device_cert, NULL)) != SSL_OK)
++ goto error;
++ }
++
++ if (product_cert) /* test chaining */
++ {
++ if ((ret = ssl_obj_load(ssl_ctx,
++ SSL_OBJ_X509_CERT, product_cert, NULL)) != SSL_OK)
++ goto error;
++ }
++
++ if (ca_cert) /* test adding certificate authorities */
++ {
++ if ((ret = ssl_obj_load(ssl_ctx,
++ SSL_OBJ_X509_CACERT, ca_cert, NULL)) != SSL_OK)
++ goto error;
++ }
++
++#ifndef WIN32
++ pthread_create(&thread, NULL,
++ (void *(*)(void *))do_client, (void *)&client_data);
++ pthread_detach(thread);
++#else
++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_client,
++ (LPVOID)&client_data, 0, NULL);
++#endif
++
++ for (;;)
++ {
++ int client_fd, size = 0;
++ SSL *ssl;
++
++ /* Wait for a client to connect */
++ if ((client_fd = accept(server_fd,
++ (struct sockaddr *)&client_addr, &clnt_len)) < 0)
++ {
++ ret = SSL_ERROR_SOCK_SETUP_FAILURE;
++ goto error;
++ }
++
++ /* we are ready to go */
++ ssl = ssl_server_new(ssl_ctx, client_fd);
++ while ((size = ssl_read(ssl, &read_buf)) == SSL_OK);
++ SOCKET_CLOSE(client_fd);
++
++ if (size < SSL_OK) /* got some alert or something nasty */
++ {
++ ret = size;
++
++ if (ret == SSL_ERROR_CONN_LOST)
++ {
++ ret = SSL_OK;
++ continue;
++ }
++
++ break; /* we've got a problem */
++ }
++ else /* looks more promising */
++ {
++ if (strstr("hello client", (char *)read_buf) == NULL)
++ {
++ printf("SSL server test \"%s\" passed\n", testname);
++ TTY_FLUSH();
++ ret = 0;
++ break;
++ }
++ }
++
++ ssl_free(ssl);
++ }
++
++ SOCKET_CLOSE(server_fd);
++
++error:
++ ssl_ctx_free(ssl_ctx);
++ return ret;
++}
++
++int SSL_server_tests(void)
++{
++ int ret = -1;
++ struct stat stat_buf;
++ SVR_CTX svr_test_ctx;
++ memset(&svr_test_ctx, 0, sizeof(SVR_CTX));
++
++ printf("### starting server tests\n"); TTY_FLUSH();
++
++ /* Go through the algorithms */
++
++ /*
++ * TLS1 client hello
++ */
++ if ((ret = SSL_server_test("TLSv1", "-cipher RC4-SHA -tls1",
++ NULL, NULL, NULL, NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * AES128-SHA
++ */
++ if ((ret = SSL_server_test("AES256-SHA", "-cipher AES128-SHA",
++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
++ DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * AES256-SHA
++ */
++ if ((ret = SSL_server_test("AES256-SHA", "-cipher AES128-SHA",
++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
++ DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * RC4-SHA
++ */
++ if ((ret = SSL_server_test("RC4-SHA", "-cipher RC4-SHA",
++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
++ DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * RC4-MD5
++ */
++ if ((ret = SSL_server_test("RC4-MD5", "-cipher RC4-MD5",
++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
++ DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * Session Reuse
++ * all the session id's should match for session resumption.
++ */
++ if ((ret = SSL_server_test("Session Reuse",
++ "-cipher RC4-SHA -reconnect",
++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
++ DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * 512 bit RSA key
++ */
++ if ((ret = SSL_server_test("512 bit key", "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_512.cer", NULL,
++ "../ssl/test/axTLS.key_512",
++ NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * 1024 bit RSA key (check certificate chaining)
++ */
++ if ((ret = SSL_server_test("1024 bit key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_device.cer",
++ "../ssl/test/axTLS.x509_512.cer",
++ "../ssl/test/axTLS.device_key",
++ NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * 2048 bit RSA key
++ */
++ if ((ret = SSL_server_test("2048 bit key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_2048.cer", NULL,
++ "../ssl/test/axTLS.key_2048",
++ NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * 4096 bit RSA key
++ */
++ if ((ret = SSL_server_test("4096 bit key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_4096.cer", NULL,
++ "../ssl/test/axTLS.key_4096",
++ NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * Client Verification
++ */
++ if ((ret = SSL_server_test("Client Verification",
++ "-cipher RC4-SHA -tls1 "
++ "-cert ../ssl/test/axTLS.x509_2048.pem "
++ "-key ../ssl/test/axTLS.key_2048.pem ",
++ NULL, NULL, NULL,
++ "../ssl/test/axTLS.ca_x509.cer", NULL,
++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)))
++ goto cleanup;
++
++ /* this test should fail */
++ if (stat("../ssl/test/axTLS.x509_bad_before.pem", &stat_buf) >= 0)
++ {
++ if ((ret = SSL_server_test("Error: Bad Before Cert",
++ "-cipher RC4-SHA -tls1 "
++ "-cert ../ssl/test/axTLS.x509_bad_before.pem "
++ "-key ../ssl/test/axTLS.key_512.pem ",
++ NULL, NULL, NULL,
++ "../ssl/test/axTLS.ca_x509.cer", NULL,
++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) !=
++ SSL_X509_ERROR(X509_VFY_ERROR_NOT_YET_VALID))
++ goto cleanup;
++
++ printf("SSL server test \"%s\" passed\n", "Bad Before Cert");
++ TTY_FLUSH();
++ ret = 0; /* is ok */
++ }
++
++ /* this test should fail */
++ if ((ret = SSL_server_test("Error: Bad After Cert",
++ "-cipher RC4-SHA -tls1 "
++ "-cert ../ssl/test/axTLS.x509_bad_after.pem "
++ "-key ../ssl/test/axTLS.key_512.pem ",
++ NULL, NULL, NULL,
++ "../ssl/test/axTLS.ca_x509.cer", NULL,
++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) !=
++ SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED))
++ goto cleanup;
++
++ printf("SSL server test \"%s\" passed\n", "Bad After Cert");
++ TTY_FLUSH();
++
++ /*
++ * No trusted cert
++ */
++ if ((ret = SSL_server_test("Error: No trusted certificate",
++ "-cipher RC4-SHA -tls1 "
++ "-cert ../ssl/test/axTLS.x509_512.pem "
++ "-key ../ssl/test/axTLS.key_512.pem ",
++ NULL, NULL, NULL,
++ NULL, NULL,
++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) !=
++ SSL_X509_ERROR(X509_VFY_ERROR_NO_TRUSTED_CERT))
++ goto cleanup;
++
++ printf("SSL server test \"%s\" passed\n", "No trusted certificate");
++ TTY_FLUSH();
++
++ /*
++ * Self-signed (from the server)
++ */
++ if ((ret = SSL_server_test("Error: Self-signed certificate (from server)",
++ "-cipher RC4-SHA -tls1 "
++ "-cert ../ssl/test/axTLS.x509_512.pem "
++ "-key ../ssl/test/axTLS.key_512.pem "
++ "-CAfile ../ssl/test/axTLS.ca_x509.pem ",
++ NULL, NULL, NULL,
++ NULL, NULL,
++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) !=
++ SSL_X509_ERROR(X509_VFY_ERROR_SELF_SIGNED))
++ goto cleanup;
++
++ printf("SSL server test \"%s\" passed\n",
++ "Self-signed certificate (from server)");
++ TTY_FLUSH();
++
++ /*
++ * Self-signed (from the client)
++ */
++ if ((ret = SSL_server_test("Self-signed certificate (from client)",
++ "-cipher RC4-SHA -tls1 "
++ "-cert ../ssl/test/axTLS.x509_512.pem "
++ "-key ../ssl/test/axTLS.key_512.pem ",
++ NULL, NULL, NULL,
++ "../ssl/test/axTLS.ca_x509.cer",
++ NULL,
++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)))
++ goto cleanup;
++
++ /*
++ * Key in PEM format
++ */
++ if ((ret = SSL_server_test("Key in PEM format",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_512.cer", NULL,
++ "../ssl/test/axTLS.key_512.pem", NULL,
++ NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * Cert in PEM format
++ */
++ if ((ret = SSL_server_test("Cert in PEM format",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_512.pem", NULL,
++ "../ssl/test/axTLS.key_512.pem", NULL,
++ NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * Cert chain in PEM format
++ */
++ if ((ret = SSL_server_test("Cert chain in PEM format",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_device.pem",
++ NULL, "../ssl/test/axTLS.device_key.pem",
++ "../ssl/test/axTLS.ca_x509.pem", NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * AES128 Encrypted key
++ */
++ if ((ret = SSL_server_test("AES128 encrypted key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_aes128.pem", NULL,
++ "../ssl/test/axTLS.key_aes128.pem",
++ NULL, "abcd", DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * AES256 Encrypted key
++ */
++ if ((ret = SSL_server_test("AES256 encrypted key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_aes256.pem", NULL,
++ "../ssl/test/axTLS.key_aes256.pem",
++ NULL, "abcd", DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * AES128 Encrypted invalid key
++ */
++ if ((ret = SSL_server_test("AES128 encrypted invalid key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_aes128.pem", NULL,
++ "../ssl/test/axTLS.key_aes128.pem",
++ NULL, "xyz", DEFAULT_SVR_OPTION)) != SSL_ERROR_INVALID_KEY)
++ goto cleanup;
++
++ printf("SSL server test \"%s\" passed\n", "AES128 encrypted invalid key");
++ TTY_FLUSH();
++
++ /*
++ * PKCS#8 key (encrypted)
++ */
++ if ((ret = SSL_server_test("pkcs#8 encrypted", "-cipher RC4-SHA",
++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.encrypted.p8",
++ NULL, "abcd", DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * PKCS#8 key (unencrypted)
++ */
++ if ((ret = SSL_server_test("pkcs#8 unencrypted", "-cipher RC4-SHA",
++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.unencrypted.p8",
++ NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * PKCS#12 key/certificate
++ */
++ if ((ret = SSL_server_test("pkcs#12 with CA", "-cipher RC4-SHA",
++ NULL, NULL, "../ssl/test/axTLS.withCA.p12",
++ NULL, "abcd", DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ if ((ret = SSL_server_test("pkcs#12 no CA", "-cipher RC4-SHA",
++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.withoutCA.p12",
++ NULL, "abcd", DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ ret = 0;
++
++cleanup:
++ if (ret)
++ {
++ printf("Error: A server test failed\n");
++ ssl_display_error(ret);
++ exit(1);
++ }
++ else
++ {
++ printf("All server tests passed\n"); TTY_FLUSH();
++ }
++
++ return ret;
++}
++
++/**************************************************************************
++ * SSL Client Testing
++ *
++ **************************************************************************/
++typedef struct
++{
++ uint8_t session_id[SSL_SESSION_ID_SIZE];
++#ifndef WIN32
++ pthread_t server_thread;
++#endif
++ int start_server;
++ int stop_server;
++ int do_reneg;
++} CLNT_SESSION_RESUME_CTX;
++
++typedef struct
++{
++ const char *testname;
++ const char *openssl_option;
++} server_t;
++
++static void do_server(server_t *svr)
++{
++ char openssl_buf[2048];
++#ifndef WIN32
++ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
++#endif
++ sprintf(openssl_buf, "openssl s_server -tls1 "
++ "-accept %d -quiet %s ", g_port, svr->openssl_option);
++ system(openssl_buf);
++}
++
++static int SSL_client_test(
++ const char *test,
++ SSL_CTX **ssl_ctx,
++ const char *openssl_option,
++ CLNT_SESSION_RESUME_CTX *sess_resume,
++ uint32_t client_options,
++ const char *private_key,
++ const char *password,
++ const char *cert)
++{
++ server_t server_data;
++ SSL *ssl = NULL;
++ int client_fd = -1;
++ uint8_t *session_id = NULL;
++ int ret = 1;
++#ifndef WIN32
++ pthread_t thread;
++#endif
++
++ if (sess_resume == NULL || sess_resume->start_server)
++ {
++ g_port++;
++ server_data.openssl_option = openssl_option;
++
++#ifndef WIN32
++ pthread_create(&thread, NULL,
++ (void *(*)(void *))do_server, (void *)&server_data);
++ pthread_detach(thread);
++#else
++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_server,
++ (LPVOID)&server_data, 0, NULL);
++#endif
++ }
++
++ usleep(200000); /* allow server to start */
++
++ if (*ssl_ctx == NULL)
++ {
++ if (private_key)
++ {
++ client_options |= SSL_NO_DEFAULT_KEY;
++ }
++
++ if ((*ssl_ctx = ssl_ctx_new(
++ client_options, SSL_DEFAULT_CLNT_SESS)) == NULL)
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto client_test_exit;
++ }
++
++ if (private_key)
++ {
++ int obj_type = SSL_OBJ_RSA_KEY;
++
++ if (strstr(private_key, ".p8"))
++ obj_type = SSL_OBJ_PKCS8;
++ else if (strstr(private_key, ".p12"))
++ obj_type = SSL_OBJ_PKCS12;
++
++ if (ssl_obj_load(*ssl_ctx, obj_type, private_key, password))
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto client_test_exit;
++ }
++ }
++
++ if (cert)
++ {
++ if ((ret = ssl_obj_load(*ssl_ctx,
++ SSL_OBJ_X509_CERT, cert, NULL)) != SSL_OK)
++ {
++ printf("could not add cert %s (%d)\n", cert, ret);
++ TTY_FLUSH();
++ goto client_test_exit;
++ }
++ }
++
++ if (ssl_obj_load(*ssl_ctx, SSL_OBJ_X509_CACERT,
++ "../ssl/test/axTLS.ca_x509.cer", NULL))
++ {
++ printf("could not add cert auth\n"); TTY_FLUSH();
++ goto client_test_exit;
++ }
++ }
++
++ if (sess_resume && !sess_resume->start_server)
++ {
++ session_id = sess_resume->session_id;
++ }
++
++ if ((client_fd = client_socket_init(g_port)) < 0)
++ {
++ printf("could not start socket on %d\n", g_port); TTY_FLUSH();
++ goto client_test_exit;
++ }
++
++ ssl = ssl_client_new(*ssl_ctx, client_fd, session_id, sizeof(session_id));
++
++ /* check the return status */
++ if ((ret = ssl_handshake_status(ssl)))
++ goto client_test_exit;
++
++ /* renegotiate client */
++ if (sess_resume && sess_resume->do_reneg)
++ {
++ if (ssl_renegotiate(ssl) < 0)
++ goto client_test_exit;
++ }
++
++ if (sess_resume)
++ {
++ memcpy(sess_resume->session_id,
++ ssl_get_session_id(ssl), SSL_SESSION_ID_SIZE);
++ }
++
++ if (IS_SET_SSL_FLAG(SSL_SERVER_VERIFY_LATER) &&
++ (ret = ssl_verify_cert(ssl)))
++ {
++ goto client_test_exit;
++ }
++
++ ssl_write(ssl, (uint8_t *)"hello world\n", 13);
++ if (sess_resume)
++ {
++ const uint8_t *sess_id = ssl_get_session_id(ssl);
++ int i;
++
++ printf(" Session-ID: ");
++ for (i = 0; i < SSL_SESSION_ID_SIZE; i++)
++ {
++ printf("%02X", sess_id[i]);
++ }
++ printf("\n");
++ TTY_FLUSH();
++ }
++
++ ret = 0;
++
++client_test_exit:
++ ssl_free(ssl);
++ SOCKET_CLOSE(client_fd);
++ usleep(200000); /* allow openssl to say something */
++
++ if (sess_resume)
++ {
++ if (sess_resume->stop_server)
++ {
++ ssl_ctx_free(*ssl_ctx);
++ *ssl_ctx = NULL;
++#ifndef WIN32
++ pthread_cancel(sess_resume->server_thread);
++#endif
++ }
++ else if (sess_resume->start_server)
++ {
++#ifndef WIN32
++ sess_resume->server_thread = thread;
++#endif
++ }
++ }
++ else
++ {
++ ssl_ctx_free(*ssl_ctx);
++ *ssl_ctx = NULL;
++#ifndef WIN32
++ pthread_cancel(thread);
++#endif
++ }
++
++ if (ret == 0)
++ {
++ printf("SSL client test \"%s\" passed\n", test);
++ TTY_FLUSH();
++ }
++
++ return ret;
++}
++
++int SSL_client_tests(void)
++{
++ int ret = -1;
++ SSL_CTX *ssl_ctx = NULL;
++ CLNT_SESSION_RESUME_CTX sess_resume;
++ memset(&sess_resume, 0, sizeof(CLNT_SESSION_RESUME_CTX));
++
++ sess_resume.start_server = 1;
++ printf("### starting client tests\n");
++
++ if ((ret = SSL_client_test("512 bit key",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_512.pem "
++ "-key ../ssl/test/axTLS.key_512.pem", &sess_resume,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ /* all the session id's should match for session resumption */
++ sess_resume.start_server = 0;
++ if ((ret = SSL_client_test("Client session resumption #1",
++ &ssl_ctx, NULL, &sess_resume,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ sess_resume.do_reneg = 1;
++ if ((ret = SSL_client_test("Client renegotiation",
++ &ssl_ctx, NULL, &sess_resume,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++ sess_resume.do_reneg = 0;
++
++ sess_resume.stop_server = 1;
++ if ((ret = SSL_client_test("Client session resumption #2",
++ &ssl_ctx, NULL, &sess_resume,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ if ((ret = SSL_client_test("1024 bit key",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_1024.pem "
++ "-key ../ssl/test/axTLS.key_1024.pem", NULL,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ if ((ret = SSL_client_test("2048 bit key",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_2048.pem "
++ "-key ../ssl/test/axTLS.key_2048.pem", NULL,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ if ((ret = SSL_client_test("4096 bit key",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_4096.pem "
++ "-key ../ssl/test/axTLS.key_4096.pem", NULL,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ if ((ret = SSL_client_test("Server cert chaining",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_device.pem "
++ "-key ../ssl/test/axTLS.device_key.pem "
++ "-CAfile ../ssl/test/axTLS.x509_512.pem ", NULL,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ /* Check the server can verify the client */
++ if ((ret = SSL_client_test("Client peer authentication",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_2048.pem "
++ "-key ../ssl/test/axTLS.key_2048.pem "
++ "-CAfile ../ssl/test/axTLS.ca_x509.pem "
++ "-verify 1 ", NULL, DEFAULT_CLNT_OPTION,
++ "../ssl/test/axTLS.key_1024", NULL,
++ "../ssl/test/axTLS.x509_1024.cer")))
++ goto cleanup;
++
++ /* Should get an "ERROR" from openssl (as the handshake fails as soon as
++ * the certificate verification fails) */
++ if ((ret = SSL_client_test("Error: Expired cert (verify now)",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_bad_after.pem "
++ "-key ../ssl/test/axTLS.key_512.pem", NULL,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)) !=
++ SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED))
++ {
++ printf("*** Error: %d\n", ret);
++ goto cleanup;
++ }
++
++ printf("SSL client test \"Expired cert (verify now)\" passed\n");
++
++ /* There is no "ERROR" from openssl */
++ if ((ret = SSL_client_test("Error: Expired cert (verify later)",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_bad_after.pem "
++ "-key ../ssl/test/axTLS.key_512.pem", NULL,
++ DEFAULT_CLNT_OPTION|SSL_SERVER_VERIFY_LATER, NULL,
++ NULL, NULL)) != SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED))
++ {
++ printf("*** Error: %d\n", ret);
++ goto cleanup;
++ }
++
++ printf("SSL client test \"Expired cert (verify later)\" passed\n");
++ ret = 0;
++
++cleanup:
++ if (ret)
++ {
++ ssl_display_error(ret);
++ printf("Error: A client test failed\n");
++ exit(1);
++ }
++ else
++ {
++ printf("All client tests passed\n"); TTY_FLUSH();
++ }
++
++ return ret;
++}
++
++/**************************************************************************
++ * SSL Basic Testing (test a big packet handshake)
++ *
++ **************************************************************************/
++static uint8_t basic_buf[256*1024];
++
++static void do_basic(void)
++{
++ int client_fd;
++ SSL *ssl_clnt;
++ SSL_CTX *ssl_clnt_ctx = ssl_ctx_new(
++ DEFAULT_CLNT_OPTION, SSL_DEFAULT_CLNT_SESS);
++ usleep(200000); /* allow server to start */
++
++ if ((client_fd = client_socket_init(g_port)) < 0)
++ goto error;
++
++ if (ssl_obj_load(ssl_clnt_ctx, SSL_OBJ_X509_CACERT,
++ "../ssl/test/axTLS.ca_x509.cer", NULL))
++ goto error;
++
++ ssl_clnt = ssl_client_new(ssl_clnt_ctx, client_fd, NULL, 0);
++
++ /* check the return status */
++ if (ssl_handshake_status(ssl_clnt) < 0)
++ {
++ printf("YA YA\n");
++ ssl_display_error(ssl_handshake_status(ssl_clnt));
++ goto error;
++ }
++
++ ssl_write(ssl_clnt, basic_buf, sizeof(basic_buf));
++ ssl_free(ssl_clnt);
++
++error:
++ ssl_ctx_free(ssl_clnt_ctx);
++ SOCKET_CLOSE(client_fd);
++
++ /* exit this thread */
++}
++
++static int SSL_basic_test(void)
++{
++ int server_fd, client_fd, ret = 0, size = 0, offset = 0;
++ SSL_CTX *ssl_svr_ctx = NULL;
++ struct sockaddr_in client_addr;
++ uint8_t *read_buf;
++ socklen_t clnt_len = sizeof(client_addr);
++ SSL *ssl_svr;
++#ifndef WIN32
++ pthread_t thread;
++#endif
++ memset(basic_buf, 0xA5, sizeof(basic_buf)/2);
++ memset(&basic_buf[sizeof(basic_buf)/2], 0x5A, sizeof(basic_buf)/2);
++
++ if ((server_fd = server_socket_init(&g_port)) < 0)
++ goto error;
++
++ ssl_svr_ctx = ssl_ctx_new(DEFAULT_SVR_OPTION, SSL_DEFAULT_SVR_SESS);
++
++#ifndef WIN32
++ pthread_create(&thread, NULL,
++ (void *(*)(void *))do_basic, NULL);
++ pthread_detach(thread);
++#else
++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_basic, NULL, 0, NULL);
++#endif
++
++ /* Wait for a client to connect */
++ if ((client_fd = accept(server_fd,
++ (struct sockaddr *) &client_addr, &clnt_len)) < 0)
++ {
++ ret = SSL_ERROR_SOCK_SETUP_FAILURE;
++ goto error;
++ }
++
++ /* we are ready to go */
++ ssl_svr = ssl_server_new(ssl_svr_ctx, client_fd);
++
++ do
++ {
++ while ((size = ssl_read(ssl_svr, &read_buf)) == SSL_OK);
++
++ if (size < SSL_OK) /* got some alert or something nasty */
++ {
++ printf("Server ");
++ ssl_display_error(size);
++ ret = size;
++ break;
++ }
++ else /* looks more promising */
++ {
++ if (memcmp(read_buf, &basic_buf[offset], size) != 0)
++ {
++ ret = SSL_NOT_OK;
++ break;
++ }
++ }
++
++ offset += size;
++ } while (offset < sizeof(basic_buf));
++
++ printf(ret == SSL_OK && offset == sizeof(basic_buf) ?
++ "SSL basic test passed\n" :
++ "SSL basic test failed\n");
++ TTY_FLUSH();
++
++ ssl_free(ssl_svr);
++ SOCKET_CLOSE(server_fd);
++ SOCKET_CLOSE(client_fd);
++
++error:
++ ssl_ctx_free(ssl_svr_ctx);
++ return ret;
++}
++
++#if !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING)
++/**************************************************************************
++ * Multi-Threading Tests
++ *
++ **************************************************************************/
++#define NUM_THREADS 100
++
++typedef struct
++{
++ SSL_CTX *ssl_clnt_ctx;
++ int port;
++ int thread_id;
++} multi_t;
++
++void do_multi_clnt(multi_t *multi_data)
++{
++ int res = 1, client_fd, i;
++ SSL *ssl = NULL;
++ char tmp[5];
++
++ if ((client_fd = client_socket_init(multi_data->port)) < 0)
++ goto client_test_exit;
++
++ sleep(1);
++ ssl = ssl_client_new(multi_data->ssl_clnt_ctx, client_fd, NULL, 0);
++
++ if ((res = ssl_handshake_status(ssl)))
++ {
++ printf("Client ");
++ ssl_display_error(res);
++ goto client_test_exit;
++ }
++
++ sprintf(tmp, "%d\n", multi_data->thread_id);
++ for (i = 0; i < 10; i++)
++ ssl_write(ssl, (uint8_t *)tmp, strlen(tmp)+1);
++
++client_test_exit:
++ ssl_free(ssl);
++ SOCKET_CLOSE(client_fd);
++ free(multi_data);
++}
++
++void do_multi_svr(SSL *ssl)
++{
++ uint8_t *read_buf;
++ int *res_ptr = malloc(sizeof(int));
++ int res;
++
++ for (;;)
++ {
++ res = ssl_read(ssl, &read_buf);
++
++ /* kill the client */
++ if (res != SSL_OK)
++ {
++ if (res == SSL_ERROR_CONN_LOST)
++ {
++ SOCKET_CLOSE(ssl->client_fd);
++ ssl_free(ssl);
++ break;
++ }
++ else if (res > 0)
++ {
++ /* do nothing */
++ }
++ else /* some problem */
++ {
++ printf("Server ");
++ ssl_display_error(res);
++ goto error;
++ }
++ }
++ }
++
++ res = SSL_OK;
++error:
++ *res_ptr = res;
++ pthread_exit(res_ptr);
++}
++
++int multi_thread_test(void)
++{
++ int server_fd = -1;
++ SSL_CTX *ssl_server_ctx;
++ SSL_CTX *ssl_clnt_ctx;
++ pthread_t clnt_threads[NUM_THREADS];
++ pthread_t svr_threads[NUM_THREADS];
++ int i, res = 0;
++ struct sockaddr_in client_addr;
++ socklen_t clnt_len = sizeof(client_addr);
++
++ printf("Do multi-threading test (takes a minute)\n");
++
++ ssl_server_ctx = ssl_ctx_new(DEFAULT_SVR_OPTION, SSL_DEFAULT_SVR_SESS);
++ ssl_clnt_ctx = ssl_ctx_new(DEFAULT_CLNT_OPTION, SSL_DEFAULT_CLNT_SESS);
++
++ if (ssl_obj_load(ssl_clnt_ctx, SSL_OBJ_X509_CACERT,
++ "../ssl/test/axTLS.ca_x509.cer", NULL))
++ goto error;
++
++ if ((server_fd = server_socket_init(&g_port)) < 0)
++ goto error;
++
++ for (i = 0; i < NUM_THREADS; i++)
++ {
++ multi_t *multi_data = (multi_t *)malloc(sizeof(multi_t));
++ multi_data->ssl_clnt_ctx = ssl_clnt_ctx;
++ multi_data->port = g_port;
++ multi_data->thread_id = i+1;
++ pthread_create(&clnt_threads[i], NULL,
++ (void *(*)(void *))do_multi_clnt, (void *)multi_data);
++ pthread_detach(clnt_threads[i]);
++ }
++
++ for (i = 0; i < NUM_THREADS; i++)
++ {
++ SSL *ssl_svr;
++ int client_fd = accept(server_fd,
++ (struct sockaddr *)&client_addr, &clnt_len);
++
++ if (client_fd < 0)
++ goto error;
++
++ ssl_svr = ssl_server_new(ssl_server_ctx, client_fd);
++
++ pthread_create(&svr_threads[i], NULL,
++ (void *(*)(void *))do_multi_svr, (void *)ssl_svr);
++ }
++
++ /* make sure we've run all of the threads */
++ for (i = 0; i < NUM_THREADS; i++)
++ {
++ void *thread_res;
++ pthread_join(svr_threads[i], &thread_res);
++
++ if (*((int *)thread_res) != 0)
++ res = 1;
++
++ free(thread_res);
++ }
++
++ if (res)
++ goto error;
++
++ printf("Multi-thread test passed (%d)\n", NUM_THREADS);
++error:
++ ssl_ctx_free(ssl_server_ctx);
++ ssl_ctx_free(ssl_clnt_ctx);
++ SOCKET_CLOSE(server_fd);
++ return res;
++}
++#endif /* !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING) */
++
++/**************************************************************************
++ * Header issue
++ *
++ **************************************************************************/
++static void do_header_issue(void)
++{
++ char axtls_buf[2048];
++#ifndef WIN32
++ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
++#endif
++ sprintf(axtls_buf, "./axssl s_client -connect localhost:%d", g_port);
++ system(axtls_buf);
++}
++
++static int header_issue(void)
++{
++ FILE *f = fopen("../ssl/test/header_issue.dat", "r");
++ int server_fd = -1, client_fd = -1, ret = 1;
++ uint8_t buf[2048];
++ int size = 0;
++ struct sockaddr_in client_addr;
++ socklen_t clnt_len = sizeof(client_addr);
++#ifndef WIN32
++ pthread_t thread;
++#endif
++
++ if (f == NULL || (server_fd = server_socket_init(&g_port)) < 0)
++ goto error;
++
++#ifndef WIN32
++ pthread_create(&thread, NULL,
++ (void *(*)(void *))do_header_issue, NULL);
++ pthread_detach(thread);
++#else
++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_header_issue,
++ NULL, 0, NULL);
++#endif
++ if ((client_fd = accept(server_fd,
++ (struct sockaddr *) &client_addr, &clnt_len)) < 0)
++ {
++ ret = SSL_ERROR_SOCK_SETUP_FAILURE;
++ goto error;
++ }
++
++ size = fread(buf, 1, sizeof(buf), f);
++ SOCKET_WRITE(client_fd, buf, size);
++ usleep(200000);
++
++ ret = 0;
++error:
++ fclose(f);
++ SOCKET_CLOSE(client_fd);
++ SOCKET_CLOSE(server_fd);
++ TTY_FLUSH();
++ system("killall axssl");
++ return ret;
++}
++
++/**************************************************************************
++ * main()
++ *
++ **************************************************************************/
++int main(int argc, char *argv[])
++{
++ int ret = 1;
++ BI_CTX *bi_ctx;
++ int fd;
++
++#ifdef WIN32
++ WSADATA wsaData;
++ WORD wVersionRequested = MAKEWORD(2, 2);
++ WSAStartup(wVersionRequested, &wsaData);
++ fd = _open("test_result.txt", O_WRONLY|O_TEMPORARY|O_CREAT, _S_IWRITE);
++ dup2(fd, 2); /* write stderr to this file */
++#else
++ fd = open("/dev/null", O_WRONLY); /* write stderr to /dev/null */
++ signal(SIGPIPE, SIG_IGN); /* ignore pipe errors */
++ dup2(fd, 2);
++#endif
++
++ /* can't do testing in this mode */
++#if defined CONFIG_SSL_GENERATE_X509_CERT
++ printf("Error: Must compile with default key/certificates\n");
++ exit(1);
++#endif
++
++ bi_ctx = bi_initialize();
++
++ if (AES_test(bi_ctx))
++ {
++ printf("AES tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (RC4_test(bi_ctx))
++ {
++ printf("RC4 tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (MD5_test(bi_ctx))
++ {
++ printf("MD5 tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (SHA1_test(bi_ctx))
++ {
++ printf("SHA1 tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (HMAC_test(bi_ctx))
++ {
++ printf("HMAC tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (BIGINT_test(bi_ctx))
++ {
++ printf("BigInt tests failed!\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ bi_terminate(bi_ctx);
++
++ if (RSA_test())
++ {
++ printf("RSA tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (cert_tests())
++ {
++ printf("CERT tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++#if !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING)
++ if (multi_thread_test())
++ goto cleanup;
++#endif
++
++ if (SSL_basic_test())
++ goto cleanup;
++
++ system("sh ../ssl/test/killopenssl.sh");
++
++ if (SSL_client_tests())
++ goto cleanup;
++
++ system("sh ../ssl/test/killopenssl.sh");
++
++ if (SSL_server_tests())
++ goto cleanup;
++
++ system("sh ../ssl/test/killopenssl.sh");
++
++ if (header_issue())
++ {
++ printf("Header tests failed\n"); TTY_FLUSH();
++ goto cleanup;
++ }
++
++ ret = 0; /* all ok */
++ printf("**** ALL TESTS PASSED ****\n"); TTY_FLUSH();
++cleanup:
++
++ if (ret)
++ printf("Error: Some tests failed!\n");
++
++ close(fd);
++ return ret;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ssltest.c.bak b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ssltest.c.bak
+new file mode 100644
+index 0000000..ca9637f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ssltest.c.bak
+@@ -0,0 +1,1940 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * The testing of the crypto and ssl stuff goes here. Keeps the individual code
++ * modules from being uncluttered with test code.
++ *
++ * This is test code - I make no apologies for the quality!
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <signal.h>
++#include <string.h>
++#include <errno.h>
++#include <sys/stat.h>
++#include <fcntl.h>
++
++#ifndef WIN32
++#include <pthread.h>
++#endif
++
++#include "ssl.h"
++
++#define DEFAULT_CERT "../ssl/test/axTLS.x509_512.cer"
++#define DEFAULT_KEY "../ssl/test/axTLS.key_512"
++//#define DEFAULT_SVR_OPTION SSL_DISPLAY_BYTES|SSL_DISPLAY_STATES
++#define DEFAULT_SVR_OPTION 0
++#define DEFAULT_CLNT_OPTION 0
++//#define DEFAULT_CLNT_OPTION SSL_DISPLAY_BYTES|SSL_DISPLAY_STATES
++
++static int g_port = 19001;
++
++/**************************************************************************
++ * AES tests
++ *
++ * Run through a couple of the RFC3602 tests to verify that AES is correct.
++ **************************************************************************/
++#define TEST1_SIZE 16
++#define TEST2_SIZE 32
++
++static int AES_test(BI_CTX *bi_ctx)
++{
++ AES_CTX aes_key;
++ int res = 1;
++ uint8_t key[TEST1_SIZE];
++ uint8_t iv[TEST1_SIZE];
++
++ {
++ /*
++ Case #1: Encrypting 16 bytes (1 block) using AES-CBC
++ Key : 0x06a9214036b8a15b512e03d534120006
++ IV : 0x3dafba429d9eb430b422da802c9fac41
++ Plaintext : "Single block msg"
++ Ciphertext: 0xe353779c1079aeb82708942dbe77181a
++
++ */
++ char *in_str = "Single block msg";
++ uint8_t ct[TEST1_SIZE];
++ uint8_t enc_data[TEST1_SIZE];
++ uint8_t dec_data[TEST1_SIZE];
++
++ bigint *key_bi = bi_str_import(
++ bi_ctx, "06A9214036B8A15B512E03D534120006");
++ bigint *iv_bi = bi_str_import(
++ bi_ctx, "3DAFBA429D9EB430B422DA802C9FAC41");
++ bigint *ct_bi = bi_str_import(
++ bi_ctx, "E353779C1079AEB82708942DBE77181A");
++ bi_export(bi_ctx, key_bi, key, TEST1_SIZE);
++ bi_export(bi_ctx, iv_bi, iv, TEST1_SIZE);
++ bi_export(bi_ctx, ct_bi, ct, TEST1_SIZE);
++
++ AES_set_key(&aes_key, key, iv, AES_MODE_128);
++ AES_cbc_encrypt(&aes_key, (const uint8_t *)in_str,
++ enc_data, sizeof(enc_data));
++ if (memcmp(enc_data, ct, sizeof(ct)))
++ {
++ printf("Error: AES ENCRYPT #1 failed\n");
++ goto end;
++ }
++
++ AES_set_key(&aes_key, key, iv, AES_MODE_128);
++ AES_convert_key(&aes_key);
++ AES_cbc_decrypt(&aes_key, enc_data, dec_data, sizeof(enc_data));
++
++ if (memcmp(dec_data, in_str, sizeof(dec_data)))
++ {
++ printf("Error: AES DECRYPT #1 failed\n");
++ goto end;
++ }
++ }
++
++ {
++ /*
++ Case #2: Encrypting 32 bytes (2 blocks) using AES-CBC
++ Key : 0xc286696d887c9aa0611bbb3e2025a45a
++ IV : 0x562e17996d093d28ddb3ba695a2e6f58
++ Plaintext : 0x000102030405060708090a0b0c0d0e0f
++ 101112131415161718191a1b1c1d1e1f
++ Ciphertext: 0xd296cd94c2cccf8a3a863028b5e1dc0a
++ 7586602d253cfff91b8266bea6d61ab1
++ */
++ uint8_t in_data[TEST2_SIZE];
++ uint8_t ct[TEST2_SIZE];
++ uint8_t enc_data[TEST2_SIZE];
++ uint8_t dec_data[TEST2_SIZE];
++
++ bigint *in_bi = bi_str_import(bi_ctx,
++ "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F");
++ bigint *key_bi = bi_str_import(
++ bi_ctx, "C286696D887C9AA0611BBB3E2025A45A");
++ bigint *iv_bi = bi_str_import(
++ bi_ctx, "562E17996D093D28DDB3BA695A2E6F58");
++ bigint *ct_bi = bi_str_import(bi_ctx,
++ "D296CD94C2CCCF8A3A863028B5E1DC0A7586602D253CFFF91B8266BEA6D61AB1");
++ bi_export(bi_ctx, in_bi, in_data, TEST2_SIZE);
++ bi_export(bi_ctx, key_bi, key, TEST1_SIZE);
++ bi_export(bi_ctx, iv_bi, iv, TEST1_SIZE);
++ bi_export(bi_ctx, ct_bi, ct, TEST2_SIZE);
++
++ AES_set_key(&aes_key, key, iv, AES_MODE_128);
++ AES_cbc_encrypt(&aes_key, (const uint8_t *)in_data,
++ enc_data, sizeof(enc_data));
++
++ if (memcmp(enc_data, ct, sizeof(ct)))
++ {
++ printf("Error: ENCRYPT #2 failed\n");
++ goto end;
++ }
++
++ AES_set_key(&aes_key, key, iv, AES_MODE_128);
++ AES_convert_key(&aes_key);
++ AES_cbc_decrypt(&aes_key, enc_data, dec_data, sizeof(enc_data));
++ if (memcmp(dec_data, in_data, sizeof(dec_data)))
++ {
++ printf("Error: DECRYPT #2 failed\n");
++ goto end;
++ }
++ }
++
++ res = 0;
++ printf("All AES tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * RC4 tests
++ *
++ * ARC4 tests vectors from OpenSSL (crypto/rc4/rc4test.c)
++ **************************************************************************/
++static const uint8_t keys[7][30]=
++{
++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
++ {8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
++ {4,0xef,0x01,0x23,0x45},
++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef},
++ {4,0xef,0x01,0x23,0x45},
++};
++
++static const uint8_t data_len[7]={8,8,8,20,28,10};
++static uint8_t data[7][30]=
++{
++ {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xff},
++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
++ 0x00,0x00,0x00,0x00,0xff},
++ {0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
++ 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
++ 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0,
++ 0x12,0x34,0x56,0x78,0xff},
++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff},
++ {0},
++};
++
++static const uint8_t output[7][30]=
++{
++ {0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96,0x00},
++ {0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79,0x00},
++ {0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a,0x00},
++ {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,
++ 0xbd,0x61,0x5a,0x11,0x62,0xe1,0xc7,0xba,
++ 0x36,0xb6,0x78,0x58,0x00},
++ {0x66,0xa0,0x94,0x9f,0x8a,0xf7,0xd6,0x89,
++ 0x1f,0x7f,0x83,0x2b,0xa8,0x33,0xc0,0x0c,
++ 0x89,0x2e,0xbe,0x30,0x14,0x3c,0xe2,0x87,
++ 0x40,0x01,0x1e,0xcf,0x00},
++ {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,0xbd,0x61,0x00},
++ {0},
++};
++
++static int RC4_test(BI_CTX *bi_ctx)
++{
++ int i, res = 1;
++ RC4_CTX s;
++
++ for (i = 0; i < 6; i++)
++ {
++ RC4_setup(&s, &keys[i][1], keys[i][0]);
++ RC4_crypt(&s, data[i], data[i], data_len[i]);
++
++ if (memcmp(data[i], output[i], data_len[i]))
++ {
++ printf("Error: RC4 CRYPT #%d failed\n", i);
++ goto end;
++ }
++ }
++
++ res = 0;
++ printf("All RC4 tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * SHA1 tests
++ *
++ * Run through a couple of the RFC3174 tests to verify that SHA1 is correct.
++ **************************************************************************/
++static int SHA1_test(BI_CTX *bi_ctx)
++{
++ SHA1_CTX ctx;
++ uint8_t ct[SHA1_SIZE];
++ uint8_t digest[SHA1_SIZE];
++ int res = 1;
++
++ {
++ const char *in_str = "abc";
++ bigint *ct_bi = bi_str_import(bi_ctx,
++ "A9993E364706816ABA3E25717850C26C9CD0D89D");
++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
++
++ SHA1_Init(&ctx);
++ SHA1_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
++ SHA1_Final(digest, &ctx);
++
++ if (memcmp(digest, ct, sizeof(ct)))
++ {
++ printf("Error: SHA1 #1 failed\n");
++ goto end;
++ }
++ }
++
++ {
++ const char *in_str =
++ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
++ bigint *ct_bi = bi_str_import(bi_ctx,
++ "84983E441C3BD26EBAAE4AA1F95129E5E54670F1");
++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
++
++ SHA1_Init(&ctx);
++ SHA1_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
++ SHA1_Final(digest, &ctx);
++
++ if (memcmp(digest, ct, sizeof(ct)))
++ {
++ printf("Error: SHA1 #2 failed\n");
++ goto end;
++ }
++ }
++
++ res = 0;
++ printf("All SHA1 tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * MD5 tests
++ *
++ * Run through a couple of the RFC1321 tests to verify that MD5 is correct.
++ **************************************************************************/
++static int MD5_test(BI_CTX *bi_ctx)
++{
++ MD5_CTX ctx;
++ uint8_t ct[MD5_SIZE];
++ uint8_t digest[MD5_SIZE];
++ int res = 1;
++
++ {
++ const char *in_str = "abc";
++ bigint *ct_bi = bi_str_import(bi_ctx,
++ "900150983CD24FB0D6963F7D28E17F72");
++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
++
++ MD5_Init(&ctx);
++ MD5_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
++ MD5_Final(digest, &ctx);
++
++ if (memcmp(digest, ct, sizeof(ct)))
++ {
++ printf("Error: MD5 #1 failed\n");
++ goto end;
++ }
++ }
++
++ {
++ const char *in_str =
++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
++ bigint *ct_bi = bi_str_import(
++ bi_ctx, "D174AB98D277D9F5A5611C2C9F419D9F");
++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
++
++ MD5_Init(&ctx);
++ MD5_Update(&ctx, (const uint8_t *)in_str, strlen(in_str));
++ MD5_Final(digest, &ctx);
++
++ if (memcmp(digest, ct, sizeof(ct)))
++ {
++ printf("Error: MD5 #2 failed\n");
++ goto end;
++ }
++ }
++ res = 0;
++ printf("All MD5 tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * HMAC tests
++ *
++ * Run through a couple of the RFC2202 tests to verify that HMAC is correct.
++ **************************************************************************/
++static int HMAC_test(BI_CTX *bi_ctx)
++{
++ uint8_t key[SHA1_SIZE];
++ uint8_t ct[SHA1_SIZE];
++ uint8_t dgst[SHA1_SIZE];
++ int res = 1;
++ const char *key_str;
++
++ const char *data_str = "Hi There";
++ bigint *key_bi = bi_str_import(bi_ctx, "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B");
++ bigint *ct_bi = bi_str_import(bi_ctx, "9294727A3638BB1C13F48EF8158BFC9D");
++ bi_export(bi_ctx, key_bi, key, MD5_SIZE);
++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
++ hmac_md5((const uint8_t *)data_str, 8, key, MD5_SIZE, dgst);
++ if (memcmp(dgst, ct, MD5_SIZE))
++ {
++ printf("HMAC MD5 #1 failed\n");
++ goto end;
++ }
++
++ data_str = "what do ya want for nothing?";
++ key_str = "Jefe";
++ ct_bi = bi_str_import(bi_ctx, "750C783E6AB0B503EAA86E310A5DB738");
++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE);
++ hmac_md5((const uint8_t *)data_str, 28, (const uint8_t *)key_str, 4, dgst);
++ if (memcmp(dgst, ct, MD5_SIZE))
++ {
++ printf("HMAC MD5 #2 failed\n");
++ goto end;
++ }
++
++ data_str = "Hi There";
++ key_bi = bi_str_import(bi_ctx, "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B");
++ bi_export(bi_ctx, key_bi, key, SHA1_SIZE);
++ ct_bi = bi_str_import(bi_ctx, "B617318655057264E28BC0B6FB378C8EF146BE00");
++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
++
++ hmac_sha1((const uint8_t *)data_str, 8,
++ (const uint8_t *)key, SHA1_SIZE, dgst);
++ if (memcmp(dgst, ct, SHA1_SIZE))
++ {
++ printf("HMAC SHA1 #1 failed\n");
++ goto end;
++ }
++
++ data_str = "what do ya want for nothing?";
++ key_str = "Jefe";
++ ct_bi = bi_str_import(bi_ctx, "EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79");
++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE);
++
++ hmac_sha1((const uint8_t *)data_str, 28, (const uint8_t *)key_str, 5, dgst);
++ if (memcmp(dgst, ct, SHA1_SIZE))
++ {
++ printf("HMAC SHA1 failed\n");
++ exit(1);
++ }
++
++ res = 0;
++ printf("All HMAC tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * BIGINT tests
++ *
++ **************************************************************************/
++static int BIGINT_test(BI_CTX *ctx)
++{
++ int res = 1;
++ bigint *bi_data, *bi_exp, *bi_res;
++ const char *expnt, *plaintext, *mod;
++ uint8_t compare[MAX_KEY_BYTE_SIZE];
++
++ /**
++ * 512 bit key
++ */
++ plaintext = /* 64 byte number */
++ "01aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee";
++
++ mod = "C30773C8ABE09FCC279EE0E5343370DE"
++ "8B2FFDB6059271E3005A7CEEF0D35E0A"
++ "1F9915D95E63560836CC2EB2C289270D"
++ "BCAE8CAF6F5E907FC2759EE220071E1B";
++
++ expnt = "A1E556CD1738E10DF539E35101334E97"
++ "BE8D391C57A5C89A7AD9A2EA2ACA1B3D"
++ "F3140F5091CC535CBAA47CEC4159EE1F"
++ "B6A3661AFF1AB758426EAB158452A9B9";
++
++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext));
++ bi_exp = int_to_bi(ctx, 0x10001);
++ bi_set_mod(ctx, bi_str_import(ctx, mod), 0);
++ bi_res = bi_mod_power(ctx, bi_data, bi_exp);
++
++ bi_data = bi_res; /* resuse again - see if we get the original */
++
++ bi_exp = bi_str_import(ctx, expnt);
++ bi_res = bi_mod_power(ctx, bi_data, bi_exp);
++ bi_free_mod(ctx, 0);
++
++ bi_export(ctx, bi_res, compare, 64);
++ if (memcmp(plaintext, compare, 64) != 0)
++ goto end;
++
++ printf("All BIGINT tests passed\n");
++ res = 0;
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * RSA tests
++ *
++ * Use the results from openssl to verify PKCS1 etc
++ **************************************************************************/
++static int RSA_test(void)
++{
++ int res = 1;
++ const char *plaintext = /* 128 byte hex number */
++ "1aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee2"
++ "1aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeee2\012";
++ uint8_t enc_data[128], dec_data[128];
++ RSA_CTX *rsa_ctx = NULL;
++ BI_CTX *bi_ctx;
++ bigint *plaintext_bi;
++ bigint *enc_data_bi, *dec_data_bi;
++ uint8_t enc_data2[128], dec_data2[128];
++ int size;
++ int len;
++ uint8_t *buf;
++
++ /* extract the private key elements */
++ len = get_file("../ssl/test/axTLS.key_1024", &buf);
++ if (asn1_get_private_key(buf, len, &rsa_ctx) < 0)
++ {
++ goto end;
++ }
++
++ free(buf);
++ bi_ctx = rsa_ctx->bi_ctx;
++ plaintext_bi = bi_import(bi_ctx,
++ (const uint8_t *)plaintext, strlen(plaintext));
++
++ /* basic rsa encrypt */
++ enc_data_bi = RSA_public(rsa_ctx, plaintext_bi);
++ bi_export(bi_ctx, bi_copy(enc_data_bi), enc_data, sizeof(enc_data));
++
++ /* basic rsa decrypt */
++ dec_data_bi = RSA_private(rsa_ctx, enc_data_bi);
++ bi_export(bi_ctx, dec_data_bi, dec_data, sizeof(dec_data));
++
++ if (memcmp(dec_data, plaintext, strlen(plaintext)))
++ {
++ printf("Error: DECRYPT #1 failed\n");
++ goto end;
++ }
++
++ RSA_encrypt(rsa_ctx, (const uint8_t *)"abc", 3, enc_data2, 0);
++ size = RSA_decrypt(rsa_ctx, enc_data2, dec_data2, 1);
++ if (memcmp("abc", dec_data2, 3))
++ {
++ printf("Error: ENCRYPT/DECRYPT #2 failed\n");
++ goto end;
++ }
++
++ RSA_free(rsa_ctx);
++ res = 0;
++ printf("All RSA tests passed\n");
++
++end:
++ return res;
++}
++
++/**************************************************************************
++ * Cert Testing
++ *
++ **************************************************************************/
++static int cert_tests(void)
++{
++ int res = -1, len;
++ X509_CTX *x509_ctx;
++ SSL_CTX *ssl_ctx;
++ uint8_t *buf;
++
++ /* check a bunch of 3rd party certificates */
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/microsoft.x509_ca", &buf);
++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #1\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/thawte.x509_ca", &buf);
++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #2\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/deutsche_telecom.x509_ca", &buf);
++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #3\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/equifax.x509_ca", &buf);
++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #4\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/gnutls.cer", &buf);
++ if ((res = add_cert(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #5\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/socgen.cer", &buf);
++ if ((res = add_cert(ssl_ctx, buf, len)) < 0)
++ {
++ printf("Cert #6\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ len = get_file("../ssl/test/verisign.x509_ca", &buf);
++ if ((res = add_cert_auth(ssl_ctx, buf, len)) <0)
++ {
++ printf("Cert #7\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ free(buf);
++
++ if (get_file("../ssl/test/verisign.x509_my_cert", &buf) < 0 ||
++ x509_new(buf, &len, &x509_ctx))
++ {
++ printf("Cert #8\n");
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ x509_free(x509_ctx);
++ free(buf);
++
++ ssl_ctx = ssl_ctx_new(0, 0);
++ if ((res = ssl_obj_load(ssl_ctx,
++ SSL_OBJ_X509_CERT, "../ssl/test/ms_iis.cer", NULL)) != SSL_OK)
++ {
++ ssl_display_error(res);
++ goto bad_cert;
++ }
++
++ ssl_ctx_free(ssl_ctx);
++ res = 0; /* all ok */
++ printf("All Certificate tests passed\n");
++
++bad_cert:
++ if (res)
++ printf("Error: A certificate test failed\n");
++ return res;
++}
++
++/**
++ * init a server socket.
++ */
++static int server_socket_init(int *port)
++{
++ struct sockaddr_in serv_addr;
++ int server_fd;
++ char yes = 1;
++
++ /* Create socket for incoming connections */
++ if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
++ {
++ return -1;
++ }
++
++ setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
++
++go_again:
++ /* Construct local address structure */
++ memset(&serv_addr, 0, sizeof(serv_addr)); /* Zero out structure */
++ serv_addr.sin_family = AF_INET; /* Internet address family */
++ serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
++ serv_addr.sin_port = htons(*port); /* Local port */
++
++ /* Bind to the local address */
++ if (bind(server_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
++ {
++ (*port)++;
++ goto go_again;
++ }
++ /* Mark the socket so it will listen for incoming connections */
++ if (listen(server_fd, 3000) < 0)
++ {
++ return -1;
++ }
++
++ return server_fd;
++}
++
++/**
++ * init a client socket.
++ */
++static int client_socket_init(uint16_t port)
++{
++ struct sockaddr_in address;
++ int client_fd;
++
++ address.sin_family = AF_INET;
++ address.sin_port = htons(port);
++ address.sin_addr.s_addr = inet_addr("127.0.0.1");
++ client_fd = socket(AF_INET, SOCK_STREAM, 0);
++ if (connect(client_fd, (struct sockaddr *)&address, sizeof(address)) < 0)
++ {
++ perror("socket");
++ SOCKET_CLOSE(client_fd);
++ client_fd = -1;
++ }
++
++ return client_fd;
++}
++
++/**************************************************************************
++ * SSL Server Testing
++ *
++ **************************************************************************/
++typedef struct
++{
++ /* not used as yet */
++ int dummy;
++} SVR_CTX;
++
++typedef struct
++{
++ const char *testname;
++ const char *openssl_option;
++} client_t;
++
++static void do_client(client_t *clnt)
++{
++ char openssl_buf[2048];
++
++ /* make sure the main thread goes first */
++ sleep(0);
++
++ /* show the session ids in the reconnect test */
++ if (strcmp(clnt->testname, "Session Reuse") == 0)
++ {
++ sprintf(openssl_buf, "echo \"hello client\" | openssl s_client "
++ "-connect localhost:%d %s 2>&1 | grep \"Session-ID:\"",
++ g_port, clnt->openssl_option);
++ }
++ else
++ {
++ sprintf(openssl_buf, "echo \"hello client\" | openssl s_client "
++#ifdef WIN32
++ "-connect localhost:%d -quiet %s",
++#else
++ "-connect localhost:%d -quiet %s > /dev/null 2>&1",
++#endif
++ g_port, clnt->openssl_option);
++ }
++
++ system(openssl_buf);
++}
++
++static int SSL_server_test(
++ const char *testname,
++ const char *openssl_option,
++ const char *device_cert,
++ const char *product_cert,
++ const char *private_key,
++ const char *ca_cert,
++ const char *password,
++ int axolotls_option)
++{
++ int server_fd, ret = 0;
++ SSL_CTX *ssl_ctx = NULL;
++ struct sockaddr_in client_addr;
++ uint8_t *read_buf;
++ socklen_t clnt_len = sizeof(client_addr);
++ client_t client_data;
++#ifndef WIN32
++ pthread_t thread;
++#endif
++ g_port++;
++
++ client_data.testname = testname;
++ client_data.openssl_option = openssl_option;
++
++ if ((server_fd = server_socket_init(&g_port)) < 0)
++ goto error;
++
++ if (private_key)
++ {
++ axolotls_option |= SSL_NO_DEFAULT_KEY;
++ }
++
++ if ((ssl_ctx = ssl_ctx_new(axolotls_option, SSL_DEFAULT_SVR_SESS)) == NULL)
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto error;
++ }
++
++ if (private_key)
++ {
++ int obj_type = SSL_OBJ_RSA_KEY;
++
++ if (strstr(private_key, ".p8"))
++ obj_type = SSL_OBJ_PKCS8;
++ else if (strstr(private_key, ".p12"))
++ obj_type = SSL_OBJ_PKCS12;
++
++ if (ssl_obj_load(ssl_ctx, obj_type, private_key, password))
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto error;
++ }
++ }
++
++ if (device_cert) /* test chaining */
++ {
++ if ((ret = ssl_obj_load(ssl_ctx,
++ SSL_OBJ_X509_CERT, device_cert, NULL)) != SSL_OK)
++ goto error;
++ }
++
++ if (product_cert) /* test chaining */
++ {
++ if ((ret = ssl_obj_load(ssl_ctx,
++ SSL_OBJ_X509_CERT, product_cert, NULL)) != SSL_OK)
++ goto error;
++ }
++
++ if (ca_cert) /* test adding certificate authorities */
++ {
++ if ((ret = ssl_obj_load(ssl_ctx,
++ SSL_OBJ_X509_CACERT, ca_cert, NULL)) != SSL_OK)
++ goto error;
++ }
++
++#ifndef WIN32
++ pthread_create(&thread, NULL,
++ (void *(*)(void *))do_client, (void *)&client_data);
++ pthread_detach(thread);
++#else
++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_client,
++ (LPVOID)&client_data, 0, NULL);
++#endif
++
++ for (;;)
++ {
++ int client_fd, size = 0;
++ SSL *ssl;
++
++ /* Wait for a client to connect */
++ if ((client_fd = accept(server_fd,
++ (struct sockaddr *)&client_addr, &clnt_len)) < 0)
++ {
++ ret = SSL_ERROR_SOCK_SETUP_FAILURE;
++ goto error;
++ }
++
++ /* we are ready to go */
++ ssl = ssl_server_new(ssl_ctx, client_fd);
++ while ((size = ssl_read(ssl, &read_buf)) == SSL_OK);
++ SOCKET_CLOSE(client_fd);
++
++ if (size < SSL_OK) /* got some alert or something nasty */
++ {
++ ret = size;
++
++ if (ret == SSL_ERROR_CONN_LOST)
++ {
++ ret = SSL_OK;
++ continue;
++ }
++
++ break; /* we've got a problem */
++ }
++ else /* looks more promising */
++ {
++ if (strstr("hello client", (char *)read_buf) == NULL)
++ {
++ printf("SSL server test \"%s\" passed\n", testname);
++ TTY_FLUSH();
++ ret = 0;
++ break;
++ }
++ }
++
++ ssl_free(ssl);
++ }
++
++ SOCKET_CLOSE(server_fd);
++
++error:
++ ssl_ctx_free(ssl_ctx);
++ return ret;
++}
++
++int SSL_server_tests(void)
++{
++ int ret = -1;
++ struct stat stat_buf;
++ SVR_CTX svr_test_ctx;
++ memset(&svr_test_ctx, 0, sizeof(SVR_CTX));
++
++ printf("### starting server tests\n"); TTY_FLUSH();
++
++ /* Go through the algorithms */
++
++ /*
++ * TLS1 client hello
++ */
++ if ((ret = SSL_server_test("TLSv1", "-cipher RC4-SHA -tls1",
++ NULL, NULL, NULL, NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * AES128-SHA
++ */
++ if ((ret = SSL_server_test("AES256-SHA", "-cipher AES128-SHA",
++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
++ DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * AES256-SHA
++ */
++ if ((ret = SSL_server_test("AES256-SHA", "-cipher AES128-SHA",
++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
++ DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * RC4-SHA
++ */
++ if ((ret = SSL_server_test("RC4-SHA", "-cipher RC4-SHA",
++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
++ DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * RC4-MD5
++ */
++ if ((ret = SSL_server_test("RC4-MD5", "-cipher RC4-MD5",
++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
++ DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * Session Reuse
++ * all the session id's should match for session resumption.
++ */
++ if ((ret = SSL_server_test("Session Reuse",
++ "-cipher RC4-SHA -reconnect",
++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL,
++ DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * 512 bit RSA key
++ */
++ if ((ret = SSL_server_test("512 bit key", "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_512.cer", NULL,
++ "../ssl/test/axTLS.key_512",
++ NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * 1024 bit RSA key (check certificate chaining)
++ */
++ if ((ret = SSL_server_test("1024 bit key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_device.cer",
++ "../ssl/test/axTLS.x509_512.cer",
++ "../ssl/test/axTLS.device_key",
++ NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * 2048 bit RSA key
++ */
++ if ((ret = SSL_server_test("2048 bit key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_2048.cer", NULL,
++ "../ssl/test/axTLS.key_2048",
++ NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * 4096 bit RSA key
++ */
++ if ((ret = SSL_server_test("4096 bit key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_4096.cer", NULL,
++ "../ssl/test/axTLS.key_4096",
++ NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * Client Verification
++ */
++ if ((ret = SSL_server_test("Client Verification",
++ "-cipher RC4-SHA -tls1 "
++ "-cert ../ssl/test/axTLS.x509_2048.pem "
++ "-key ../ssl/test/axTLS.key_2048.pem ",
++ NULL, NULL, NULL,
++ "../ssl/test/axTLS.ca_x509.cer", NULL,
++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)))
++ goto cleanup;
++
++ /* this test should fail */
++ if (stat("../ssl/test/axTLS.x509_bad_before.pem", &stat_buf) >= 0)
++ {
++ if ((ret = SSL_server_test("Bad Before Cert",
++ "-cipher RC4-SHA -tls1 "
++ "-cert ../ssl/test/axTLS.x509_bad_before.pem "
++ "-key ../ssl/test/axTLS.key_512.pem ",
++ NULL, NULL, NULL,
++ "../ssl/test/axTLS.ca_x509.cer", NULL,
++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) !=
++ SSL_X509_ERROR(X509_VFY_ERROR_NOT_YET_VALID))
++ goto cleanup;
++
++ printf("SSL server test \"%s\" passed\n", "Bad Before Cert");
++ TTY_FLUSH();
++ ret = 0; /* is ok */
++ }
++
++ /* this test should fail */
++ if ((ret = SSL_server_test("Bad After Cert",
++ "-cipher RC4-SHA -tls1 "
++ "-cert ../ssl/test/axTLS.x509_bad_after.pem "
++ "-key ../ssl/test/axTLS.key_512.pem ",
++ NULL, NULL, NULL,
++ "../ssl/test/axTLS.ca_x509.cer", NULL,
++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) !=
++ SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED))
++ goto cleanup;
++
++ printf("SSL server test \"%s\" passed\n", "Bad After Cert");
++ TTY_FLUSH();
++
++ /*
++ * Key in PEM format
++ */
++ if ((ret = SSL_server_test("Key in PEM format",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_512.cer", NULL,
++ "../ssl/test/axTLS.key_512.pem", NULL,
++ NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * Cert in PEM format
++ */
++ if ((ret = SSL_server_test("Cert in PEM format",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_512.pem", NULL,
++ "../ssl/test/axTLS.key_512.pem", NULL,
++ NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * Cert chain in PEM format
++ */
++ if ((ret = SSL_server_test("Cert chain in PEM format",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_device.pem",
++ NULL, "../ssl/test/axTLS.device_key.pem",
++ "../ssl/test/axTLS.ca_x509.pem", NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * AES128 Encrypted key
++ */
++ if ((ret = SSL_server_test("AES128 encrypted key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_aes128.pem", NULL,
++ "../ssl/test/axTLS.key_aes128.pem",
++ NULL, "abcd", DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * AES256 Encrypted key
++ */
++ if ((ret = SSL_server_test("AES256 encrypted key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_aes256.pem", NULL,
++ "../ssl/test/axTLS.key_aes256.pem",
++ NULL, "abcd", DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * AES128 Encrypted invalid key
++ */
++ if ((ret = SSL_server_test("AES128 encrypted invalid key",
++ "-cipher RC4-SHA",
++ "../ssl/test/axTLS.x509_aes128.pem", NULL,
++ "../ssl/test/axTLS.key_aes128.pem",
++ NULL, "xyz", DEFAULT_SVR_OPTION)) != SSL_ERROR_INVALID_KEY)
++ goto cleanup;
++
++ printf("SSL server test \"%s\" passed\n", "AES128 encrypted invalid key");
++ TTY_FLUSH();
++
++ /*
++ * PKCS#8 key (encrypted)
++ */
++ if ((ret = SSL_server_test("pkcs#8 encrypted", "-cipher RC4-SHA",
++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.encrypted.p8",
++ NULL, "abcd", DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * PKCS#8 key (unencrypted)
++ */
++ if ((ret = SSL_server_test("pkcs#8 unencrypted", "-cipher RC4-SHA",
++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.unencrypted.p8",
++ NULL, NULL, DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ * PKCS#12 key/certificate
++ */
++ if ((ret = SSL_server_test("pkcs#12 with CA", "-cipher RC4-SHA",
++ NULL, NULL, "../ssl/test/axTLS.withCA.p12",
++ NULL, "abcd", DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ if ((ret = SSL_server_test("pkcs#12 no CA", "-cipher RC4-SHA",
++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.withoutCA.p12",
++ NULL, "abcd", DEFAULT_SVR_OPTION)))
++ goto cleanup;
++
++ /*
++ *
++ */
++
++ ret = 0;
++
++cleanup:
++ if (ret)
++ {
++ printf("Error: A server test failed\n");
++ ssl_display_error(ret);
++ exit(1);
++ }
++ else
++ {
++ printf("All server tests passed\n"); TTY_FLUSH();
++ }
++
++ return ret;
++}
++
++/**************************************************************************
++ * SSL Client Testing
++ *
++ **************************************************************************/
++typedef struct
++{
++ uint8_t session_id[SSL_SESSION_ID_SIZE];
++#ifndef WIN32
++ pthread_t server_thread;
++#endif
++ int start_server;
++ int stop_server;
++ int do_reneg;
++} CLNT_SESSION_RESUME_CTX;
++
++typedef struct
++{
++ const char *testname;
++ const char *openssl_option;
++} server_t;
++
++static void do_server(server_t *svr)
++{
++ char openssl_buf[2048];
++#ifndef WIN32
++ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
++#endif
++ sprintf(openssl_buf, "openssl s_server -tls1 "
++ "-accept %d -quiet %s ", g_port, svr->openssl_option);
++ system(openssl_buf);
++}
++
++static int SSL_client_test(
++ const char *test,
++ SSL_CTX **ssl_ctx,
++ const char *openssl_option,
++ CLNT_SESSION_RESUME_CTX *sess_resume,
++ uint32_t client_options,
++ const char *private_key,
++ const char *password,
++ const char *cert)
++{
++ server_t server_data;
++ SSL *ssl = NULL;
++ int client_fd = -1;
++ uint8_t *session_id = NULL;
++ int ret = 1;
++#ifndef WIN32
++ pthread_t thread;
++#endif
++
++ if (sess_resume == NULL || sess_resume->start_server)
++ {
++ g_port++;
++ server_data.openssl_option = openssl_option;
++
++#ifndef WIN32
++ pthread_create(&thread, NULL,
++ (void *(*)(void *))do_server, (void *)&server_data);
++ pthread_detach(thread);
++#else
++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_server,
++ (LPVOID)&server_data, 0, NULL);
++#endif
++ }
++
++ usleep(200000); /* allow server to start */
++
++ if (*ssl_ctx == NULL)
++ {
++ if (private_key)
++ {
++ client_options |= SSL_NO_DEFAULT_KEY;
++ }
++
++ if ((*ssl_ctx = ssl_ctx_new(
++ client_options, SSL_DEFAULT_CLNT_SESS)) == NULL)
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto client_test_exit;
++ }
++
++ if (private_key)
++ {
++ int obj_type = SSL_OBJ_RSA_KEY;
++
++ if (strstr(private_key, ".p8"))
++ obj_type = SSL_OBJ_PKCS8;
++ else if (strstr(private_key, ".p12"))
++ obj_type = SSL_OBJ_PKCS12;
++
++ if (ssl_obj_load(*ssl_ctx, obj_type, private_key, password))
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto client_test_exit;
++ }
++ }
++
++ if (cert)
++ {
++ if ((ret = ssl_obj_load(*ssl_ctx,
++ SSL_OBJ_X509_CERT, cert, NULL)) != SSL_OK)
++ {
++ printf("could not add cert %s (%d)\n", cert, ret);
++ TTY_FLUSH();
++ goto client_test_exit;
++ }
++ }
++
++ if (ssl_obj_load(*ssl_ctx, SSL_OBJ_X509_CACERT,
++ "../ssl/test/axTLS.ca_x509.cer", NULL))
++ {
++ printf("could not add cert auth\n"); TTY_FLUSH();
++ goto client_test_exit;
++ }
++ }
++
++ if (sess_resume && !sess_resume->start_server)
++ {
++ session_id = sess_resume->session_id;
++ }
++
++ if ((client_fd = client_socket_init(g_port)) < 0)
++ {
++ printf("could not start socket on %d\n", g_port); TTY_FLUSH();
++ goto client_test_exit;
++ }
++
++ ssl = ssl_client_new(*ssl_ctx, client_fd, session_id, sizeof(session_id));
++
++ /* check the return status */
++ if ((ret = ssl_handshake_status(ssl)))
++ goto client_test_exit;
++
++ /* renegotiate client */
++ if (sess_resume && sess_resume->do_reneg)
++ {
++ if (ssl_renegotiate(ssl) < 0)
++ goto client_test_exit;
++ }
++
++ if (sess_resume)
++ {
++ memcpy(sess_resume->session_id,
++ ssl_get_session_id(ssl), SSL_SESSION_ID_SIZE);
++ }
++
++ if (IS_SET_SSL_FLAG(SSL_SERVER_VERIFY_LATER) &&
++ (ret = ssl_verify_cert(ssl)))
++ {
++ goto client_test_exit;
++ }
++
++ ssl_write(ssl, (uint8_t *)"hello world\n", 13);
++ if (sess_resume)
++ {
++ const uint8_t *sess_id = ssl_get_session_id(ssl);
++ int i;
++
++ printf(" Session-ID: ");
++ for (i = 0; i < SSL_SESSION_ID_SIZE; i++)
++ {
++ printf("%02X", sess_id[i]);
++ }
++ printf("\n");
++ TTY_FLUSH();
++ }
++
++ ret = 0;
++
++client_test_exit:
++ ssl_free(ssl);
++ SOCKET_CLOSE(client_fd);
++ usleep(200000); /* allow openssl to say something */
++
++ if (sess_resume)
++ {
++ if (sess_resume->stop_server)
++ {
++ ssl_ctx_free(*ssl_ctx);
++ *ssl_ctx = NULL;
++#ifndef WIN32
++ pthread_cancel(sess_resume->server_thread);
++#endif
++ }
++ else if (sess_resume->start_server)
++ {
++#ifndef WIN32
++ sess_resume->server_thread = thread;
++#endif
++ }
++ }
++ else
++ {
++ ssl_ctx_free(*ssl_ctx);
++ *ssl_ctx = NULL;
++#ifndef WIN32
++ pthread_cancel(thread);
++#endif
++ }
++
++ if (ret == 0)
++ {
++ printf("SSL client test \"%s\" passed\n", test);
++ TTY_FLUSH();
++ }
++
++ return ret;
++}
++
++int SSL_client_tests(void)
++{
++ int ret = -1;
++ SSL_CTX *ssl_ctx = NULL;
++ CLNT_SESSION_RESUME_CTX sess_resume;
++ memset(&sess_resume, 0, sizeof(CLNT_SESSION_RESUME_CTX));
++
++ sess_resume.start_server = 1;
++ printf("### starting client tests\n");
++
++ if ((ret = SSL_client_test("512 bit key",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_512.pem "
++ "-key ../ssl/test/axTLS.key_512.pem", &sess_resume,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ /* all the session id's should match for session resumption */
++ sess_resume.start_server = 0;
++ if ((ret = SSL_client_test("Client session resumption #1",
++ &ssl_ctx, NULL, &sess_resume,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ sess_resume.do_reneg = 1;
++ if ((ret = SSL_client_test("Client renegotiation",
++ &ssl_ctx, NULL, &sess_resume,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++ sess_resume.do_reneg = 0;
++
++ sess_resume.stop_server = 1;
++ if ((ret = SSL_client_test("Client session resumption #2",
++ &ssl_ctx, NULL, &sess_resume,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ if ((ret = SSL_client_test("1024 bit key",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_1024.pem "
++ "-key ../ssl/test/axTLS.key_1024.pem", NULL,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ if ((ret = SSL_client_test("2048 bit key",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_2048.pem "
++ "-key ../ssl/test/axTLS.key_2048.pem", NULL,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ if ((ret = SSL_client_test("4096 bit key",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_4096.pem "
++ "-key ../ssl/test/axTLS.key_4096.pem", NULL,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ if ((ret = SSL_client_test("Server cert chaining",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_device.pem "
++ "-key ../ssl/test/axTLS.device_key.pem "
++ "-CAfile ../ssl/test/axTLS.x509_512.pem ", NULL,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)))
++ goto cleanup;
++
++ /* Check the server can verify the client */
++ if ((ret = SSL_client_test("Client peer authentication",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_2048.pem "
++ "-key ../ssl/test/axTLS.key_2048.pem "
++ "-CAfile ../ssl/test/axTLS.ca_x509.pem "
++ "-verify 1 ", NULL, DEFAULT_CLNT_OPTION,
++ "../ssl/test/axTLS.key_1024", NULL,
++ "../ssl/test/axTLS.x509_1024.cer")))
++ goto cleanup;
++
++ /* Should get an "ERROR" from openssl (as the handshake fails as soon as
++ * the certificate verification fails) */
++ if ((ret = SSL_client_test("Error: Expired cert (verify now)",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_bad_after.pem "
++ "-key ../ssl/test/axTLS.key_512.pem", NULL,
++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)) !=
++ SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED))
++ {
++ printf("*** Error: %d\n", ret);
++ goto cleanup;
++ }
++
++ printf("SSL client test \"Expired cert (verify now)\" passed\n");
++
++ /* There is no "ERROR" from openssl */
++ if ((ret = SSL_client_test("Error: Expired cert (verify later)",
++ &ssl_ctx,
++ "-cert ../ssl/test/axTLS.x509_bad_after.pem "
++ "-key ../ssl/test/axTLS.key_512.pem", NULL,
++ DEFAULT_CLNT_OPTION|SSL_SERVER_VERIFY_LATER, NULL,
++ NULL, NULL)) != SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED))
++ {
++ printf("*** Error: %d\n", ret);
++ goto cleanup;
++ }
++
++ printf("SSL client test \"Expired cert (verify later)\" passed\n");
++ ret = 0;
++
++cleanup:
++ if (ret)
++ {
++ ssl_display_error(ret);
++ printf("Error: A client test failed\n");
++ exit(1);
++ }
++ else
++ {
++ printf("All client tests passed\n"); TTY_FLUSH();
++ }
++
++ return ret;
++}
++
++/**************************************************************************
++ * SSL Basic Testing (test a big packet handshake)
++ *
++ **************************************************************************/
++static uint8_t basic_buf[256*1024];
++
++static void do_basic(void)
++{
++ int client_fd;
++ SSL *ssl_clnt;
++ SSL_CTX *ssl_clnt_ctx = ssl_ctx_new(
++ DEFAULT_CLNT_OPTION, SSL_DEFAULT_CLNT_SESS);
++ usleep(200000); /* allow server to start */
++
++ if ((client_fd = client_socket_init(g_port)) < 0)
++ goto error;
++
++ if (ssl_obj_load(ssl_clnt_ctx, SSL_OBJ_X509_CACERT,
++ "../ssl/test/axTLS.ca_x509.cer", NULL))
++ goto error;
++
++ ssl_clnt = ssl_client_new(ssl_clnt_ctx, client_fd, NULL, 0);
++
++ /* check the return status */
++ if (ssl_handshake_status(ssl_clnt) < 0)
++ {
++ printf("YA YA\n");
++ ssl_display_error(ssl_handshake_status(ssl_clnt));
++ goto error;
++ }
++
++ ssl_write(ssl_clnt, basic_buf, sizeof(basic_buf));
++ ssl_free(ssl_clnt);
++
++error:
++ ssl_ctx_free(ssl_clnt_ctx);
++ SOCKET_CLOSE(client_fd);
++
++ /* exit this thread */
++}
++
++static int SSL_basic_test(void)
++{
++ int server_fd, client_fd, ret = 0, size = 0, offset = 0;
++ SSL_CTX *ssl_svr_ctx = NULL;
++ struct sockaddr_in client_addr;
++ uint8_t *read_buf;
++ socklen_t clnt_len = sizeof(client_addr);
++ SSL *ssl_svr;
++#ifndef WIN32
++ pthread_t thread;
++#endif
++ memset(basic_buf, 0xA5, sizeof(basic_buf)/2);
++ memset(&basic_buf[sizeof(basic_buf)/2], 0x5A, sizeof(basic_buf)/2);
++
++ if ((server_fd = server_socket_init(&g_port)) < 0)
++ goto error;
++
++ ssl_svr_ctx = ssl_ctx_new(DEFAULT_SVR_OPTION, SSL_DEFAULT_SVR_SESS);
++
++#ifndef WIN32
++ pthread_create(&thread, NULL,
++ (void *(*)(void *))do_basic, NULL);
++ pthread_detach(thread);
++#else
++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_basic, NULL, 0, NULL);
++#endif
++
++ /* Wait for a client to connect */
++ if ((client_fd = accept(server_fd,
++ (struct sockaddr *) &client_addr, &clnt_len)) < 0)
++ {
++ ret = SSL_ERROR_SOCK_SETUP_FAILURE;
++ goto error;
++ }
++
++ /* we are ready to go */
++ ssl_svr = ssl_server_new(ssl_svr_ctx, client_fd);
++
++ do
++ {
++ while ((size = ssl_read(ssl_svr, &read_buf)) == SSL_OK);
++
++ if (size < SSL_OK) /* got some alert or something nasty */
++ {
++ printf("Server ");
++ ssl_display_error(size);
++ ret = size;
++ break;
++ }
++ else /* looks more promising */
++ {
++ if (memcmp(read_buf, &basic_buf[offset], size) != 0)
++ {
++ ret = SSL_NOT_OK;
++ break;
++ }
++ }
++
++ offset += size;
++ } while (offset < sizeof(basic_buf));
++
++ printf(ret == SSL_OK && offset == sizeof(basic_buf) ?
++ "SSL basic test passed\n" :
++ "SSL basic test failed\n");
++ TTY_FLUSH();
++
++ ssl_free(ssl_svr);
++ SOCKET_CLOSE(server_fd);
++ SOCKET_CLOSE(client_fd);
++
++error:
++ ssl_ctx_free(ssl_svr_ctx);
++ return ret;
++}
++
++#if !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING)
++/**************************************************************************
++ * Multi-Threading Tests
++ *
++ **************************************************************************/
++#define NUM_THREADS 100
++
++typedef struct
++{
++ SSL_CTX *ssl_clnt_ctx;
++ int port;
++ int thread_id;
++} multi_t;
++
++void do_multi_clnt(multi_t *multi_data)
++{
++ int res = 1, client_fd, i;
++ SSL *ssl = NULL;
++ char tmp[5];
++
++ if ((client_fd = client_socket_init(multi_data->port)) < 0)
++ goto client_test_exit;
++
++ sleep(1);
++ ssl = ssl_client_new(multi_data->ssl_clnt_ctx, client_fd, NULL, 0);
++
++ if ((res = ssl_handshake_status(ssl)))
++ {
++ printf("Client ");
++ ssl_display_error(res);
++ goto client_test_exit;
++ }
++
++ sprintf(tmp, "%d\n", multi_data->thread_id);
++ for (i = 0; i < 10; i++)
++ ssl_write(ssl, (uint8_t *)tmp, strlen(tmp)+1);
++
++client_test_exit:
++ ssl_free(ssl);
++ SOCKET_CLOSE(client_fd);
++ free(multi_data);
++}
++
++void do_multi_svr(SSL *ssl)
++{
++ uint8_t *read_buf;
++ int *res_ptr = malloc(sizeof(int));
++ int res;
++
++ for (;;)
++ {
++ res = ssl_read(ssl, &read_buf);
++
++ /* kill the client */
++ if (res != SSL_OK)
++ {
++ if (res == SSL_ERROR_CONN_LOST)
++ {
++ SOCKET_CLOSE(ssl->client_fd);
++ ssl_free(ssl);
++ break;
++ }
++ else if (res > 0)
++ {
++ /* do nothing */
++ }
++ else /* some problem */
++ {
++ printf("Server ");
++ ssl_display_error(res);
++ goto error;
++ }
++ }
++ }
++
++ res = SSL_OK;
++error:
++ *res_ptr = res;
++ pthread_exit(res_ptr);
++}
++
++int multi_thread_test(void)
++{
++ int server_fd = -1;
++ SSL_CTX *ssl_server_ctx;
++ SSL_CTX *ssl_clnt_ctx;
++ pthread_t clnt_threads[NUM_THREADS];
++ pthread_t svr_threads[NUM_THREADS];
++ int i, res = 0;
++ struct sockaddr_in client_addr;
++ socklen_t clnt_len = sizeof(client_addr);
++
++ printf("Do multi-threading test (takes a minute)\n");
++
++ ssl_server_ctx = ssl_ctx_new(DEFAULT_SVR_OPTION, SSL_DEFAULT_SVR_SESS);
++ ssl_clnt_ctx = ssl_ctx_new(DEFAULT_CLNT_OPTION, SSL_DEFAULT_CLNT_SESS);
++
++ if (ssl_obj_load(ssl_clnt_ctx, SSL_OBJ_X509_CACERT,
++ "../ssl/test/axTLS.ca_x509.cer", NULL))
++ goto error;
++
++ if ((server_fd = server_socket_init(&g_port)) < 0)
++ goto error;
++
++ for (i = 0; i < NUM_THREADS; i++)
++ {
++ multi_t *multi_data = (multi_t *)malloc(sizeof(multi_t));
++ multi_data->ssl_clnt_ctx = ssl_clnt_ctx;
++ multi_data->port = g_port;
++ multi_data->thread_id = i+1;
++ pthread_create(&clnt_threads[i], NULL,
++ (void *(*)(void *))do_multi_clnt, (void *)multi_data);
++ pthread_detach(clnt_threads[i]);
++ }
++
++ for (i = 0; i < NUM_THREADS; i++)
++ {
++ SSL *ssl_svr;
++ int client_fd = accept(server_fd,
++ (struct sockaddr *)&client_addr, &clnt_len);
++
++ if (client_fd < 0)
++ goto error;
++
++ ssl_svr = ssl_server_new(ssl_server_ctx, client_fd);
++
++ pthread_create(&svr_threads[i], NULL,
++ (void *(*)(void *))do_multi_svr, (void *)ssl_svr);
++ }
++
++ /* make sure we've run all of the threads */
++ for (i = 0; i < NUM_THREADS; i++)
++ {
++ void *thread_res;
++ pthread_join(svr_threads[i], &thread_res);
++
++ if (*((int *)thread_res) != 0)
++ res = 1;
++
++ free(thread_res);
++ }
++
++ if (res)
++ goto error;
++
++ printf("Multi-thread test passed (%d)\n", NUM_THREADS);
++error:
++ ssl_ctx_free(ssl_server_ctx);
++ ssl_ctx_free(ssl_clnt_ctx);
++ SOCKET_CLOSE(server_fd);
++ return res;
++}
++#endif /* !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING) */
++
++/**************************************************************************
++ * Header issue
++ *
++ **************************************************************************/
++static void do_header_issue(void)
++{
++ char axtls_buf[2048];
++#ifndef WIN32
++ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
++#endif
++ sprintf(axtls_buf, "./axssl s_client -connect localhost:%d", g_port);
++ system(axtls_buf);
++}
++
++static int header_issue(void)
++{
++ FILE *f = fopen("../ssl/test/header_issue.dat", "r");
++ int server_fd = -1, client_fd = -1, ret = 1;
++ uint8_t buf[2048];
++ int size = 0;
++ struct sockaddr_in client_addr;
++ socklen_t clnt_len = sizeof(client_addr);
++#ifndef WIN32
++ pthread_t thread;
++#endif
++
++ if (f == NULL || (server_fd = server_socket_init(&g_port)) < 0)
++ goto error;
++
++#ifndef WIN32
++ pthread_create(&thread, NULL,
++ (void *(*)(void *))do_header_issue, NULL);
++ pthread_detach(thread);
++#else
++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_header_issue,
++ NULL, 0, NULL);
++#endif
++ if ((client_fd = accept(server_fd,
++ (struct sockaddr *) &client_addr, &clnt_len)) < 0)
++ {
++ ret = SSL_ERROR_SOCK_SETUP_FAILURE;
++ goto error;
++ }
++
++ size = fread(buf, 1, sizeof(buf), f);
++ SOCKET_WRITE(client_fd, buf, size);
++ usleep(200000);
++
++ ret = 0;
++error:
++ fclose(f);
++ SOCKET_CLOSE(client_fd);
++ SOCKET_CLOSE(server_fd);
++ TTY_FLUSH();
++ system("killall axssl");
++ return ret;
++}
++
++/**************************************************************************
++ * main()
++ *
++ **************************************************************************/
++int main(int argc, char *argv[])
++{
++ int ret = 1;
++ BI_CTX *bi_ctx;
++ int fd;
++
++#ifdef WIN32
++ WSADATA wsaData;
++ WORD wVersionRequested = MAKEWORD(2, 2);
++ WSAStartup(wVersionRequested, &wsaData);
++ fd = _open("test_result.txt", O_WRONLY|O_TEMPORARY|O_CREAT, _S_IWRITE);
++ dup2(fd, 2); /* write stderr to this file */
++#else
++ fd = open("/dev/null", O_WRONLY); /* write stderr to /dev/null */
++ signal(SIGPIPE, SIG_IGN); /* ignore pipe errors */
++ dup2(fd, 2);
++#endif
++
++ /* can't do testing in this mode */
++#if defined CONFIG_SSL_GENERATE_X509_CERT
++ printf("Error: Must compile with default key/certificates\n");
++ exit(1);
++#endif
++
++ bi_ctx = bi_initialize();
++
++ if (AES_test(bi_ctx))
++ {
++ printf("AES tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (RC4_test(bi_ctx))
++ {
++ printf("RC4 tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (MD5_test(bi_ctx))
++ {
++ printf("MD5 tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (SHA1_test(bi_ctx))
++ {
++ printf("SHA1 tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (HMAC_test(bi_ctx))
++ {
++ printf("HMAC tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (BIGINT_test(bi_ctx))
++ {
++ printf("BigInt tests failed!\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ bi_terminate(bi_ctx);
++
++ if (RSA_test())
++ {
++ printf("RSA tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++ if (cert_tests())
++ {
++ printf("CERT tests failed\n");
++ goto cleanup;
++ }
++ TTY_FLUSH();
++
++#if !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING)
++ if (multi_thread_test())
++ goto cleanup;
++#endif
++
++ if (SSL_basic_test())
++ goto cleanup;
++
++ system("sh ../ssl/test/killopenssl.sh");
++
++ if (SSL_client_tests())
++ goto cleanup;
++
++ system("sh ../ssl/test/killopenssl.sh");
++
++ if (SSL_server_tests())
++ goto cleanup;
++
++ system("sh ../ssl/test/killopenssl.sh");
++
++ if (header_issue())
++ {
++ printf("Header tests failed\n"); TTY_FLUSH();
++ goto cleanup;
++ }
++
++ ret = 0; /* all ok */
++ printf("**** ALL TESTS PASSED ****\n"); TTY_FLUSH();
++cleanup:
++
++ if (ret)
++ printf("Error: Some tests failed!\n");
++
++ close(fd);
++ return ret;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/test_axssl.sh b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/test_axssl.sh
+new file mode 100755
+index 0000000..acf11a6
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/test_axssl.sh
+@@ -0,0 +1,163 @@
++#!/bin/sh
++
++#
++# Copyright (c) 2007, Cameron Rich
++#
++# All rights reserved.
++#
++# Redistribution and use in source and binary forms, with or without
++# modification, are permitted provided that the following conditions are met:
++#
++# * Redistributions of source code must retain the above copyright notice,
++# this list of conditions and the following disclaimer.
++# * Redistributions in binary form must reproduce the above copyright
++# notice, this list of conditions and the following disclaimer in the
++# documentation and/or other materials provided with the distribution.
++# * Neither the name of the axTLS project nor the names of its
++# contributors may be used to endorse or promote products derived
++# from this software without specific prior written permission.
++#
++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++#
++
++#
++# Test the various axssl bindings. To run it, got to the _install directory
++# and run this script from there.
++#
++
++if grep "CONFIG_PLATFORM_WIN32=y" "../config/.config" > /dev/null; then
++ JAVA_EXE="$JAVA_HOME/bin/java.exe"
++ PERL_BIN="/cygdrive/c/Perl/bin/perl"
++ KILL_AXSSL="kill %1"
++ KILL_CSHARP="kill %1"
++ KILL_PERL="kill %1"
++ KILL_JAVA="kill %1"
++ KILL_LUA="kill %1"
++else
++ if grep "CONFIG_PLATFORM_CYGWIN=y" "../config/.config" > /dev/null; then
++ # no .net or java on cygwin
++ PERL_BIN=/usr/bin/perl
++ KILL_AXSSL="killall axssl"
++ KILL_PERL="killall /usr/bin/perl"
++ KILL_LUA="killall /usr/local/bin/lua"
++ else # Linux
++ JAVA_EXE=/usr/java/default/bin/java
++ PERL_BIN=/usr/bin/perl
++ KILL_AXSSL="killall axssl"
++ KILL_CSHARP="killall mono"
++ KILL_PERL="killall /usr/bin/perl"
++ RUN_CSHARP="mono"
++ KILL_JAVA="killall $JAVA_EXE"
++ KILL_LUA="killall /usr/local/bin/lua"
++ fi
++fi
++
++BASE=..
++SERVER_ARGS="s_server -accept 15001 -verify -CAfile $BASE/ssl/test/axTLS.ca_x509.cer"
++CLIENT_ARGS="s_client -reconnect -connect localhost:15001 -verify -CAfile $BASE/ssl/test/axTLS.ca_x509.cer -key $BASE/ssl/test/axTLS.key_1024 -cert $BASE/ssl/test/axTLS.x509_1024.cer"
++
++# check pem arguments
++SERVER_PEM_ARGS="s_server -accept 15001 -pass abcd -key $BASE/ssl/test/axTLS.key_aes128.pem -cert $BASE/ssl/test/axTLS.x509_aes128.pem"
++CLIENT_PEM_ARGS="s_client -connect localhost:15001 -CAfile $BASE/ssl/test/axTLS.ca_x509.pem -key $BASE/ssl/test/axTLS.key_1024.pem -cert $BASE/ssl/test/axTLS.x509_1024.pem"
++
++export LD_LIBRARY_PATH=.:`perl -e 'use Config; print $Config{archlib};'`/CORE
++
++if [ -x ./axssl ]; then
++echo "############################# C SAMPLE ###########################"
++./axssl $SERVER_ARGS &
++echo "C Test passed" | ./axssl $CLIENT_ARGS
++$KILL_AXSSL
++sleep 1
++
++./axssl $SERVER_PEM_ARGS &
++echo "C Test passed" | ./axssl $CLIENT_PEM_ARGS
++$KILL_AXSSL
++sleep 1
++echo "### C tests complete"
++fi
++
++if [ -f ./axtls.jar ]; then
++echo "########################## JAVA SAMPLE ###########################"
++"$JAVA_EXE" -jar ./axtls.jar $SERVER_ARGS &
++echo "Java Test passed" | "$JAVA_EXE" -jar ./axtls.jar $CLIENT_ARGS
++$KILL_JAVA
++sleep 1
++
++"$JAVA_EXE" -jar ./axtls.jar $SERVER_PEM_ARGS &
++echo "Java Test passed" | "$JAVA_EXE" -jar ./axtls.jar $CLIENT_PEM_ARGS
++$KILL_JAVA
++sleep 1
++
++echo "### Java tests complete"
++fi
++
++if [ -x ./axssl.csharp.exe ]; then
++echo "############################ C# SAMPLE ###########################"
++$RUN_CSHARP ./axssl.csharp.exe $SERVER_ARGS &
++echo "C# Test passed" | $RUN_CSHARP ./axssl.csharp.exe $CLIENT_ARGS
++$KILL_CSHARP
++sleep 1
++
++$RUN_CSHARP ./axssl.csharp.exe $SERVER_PEM_ARGS &
++echo "C# Test passed" | $RUN_CSHARP ./axssl.csharp.exe $CLIENT_PEM_ARGS
++$KILL_CSHARP
++sleep 1
++
++echo "### C# tests complete"
++fi
++
++if [ -x ./axssl.vbnet.exe ]; then
++echo "######################## VB.NET SAMPLE ###########################"
++echo $SERVER_ARGS
++echo $CLIENT_ARGS
++./axssl.vbnet $SERVER_ARGS &
++echo "VB.NET Test passed" | ./axssl.vbnet.exe $CLIENT_ARGS
++kill %1
++sleep 1
++
++./axssl.vbnet $SERVER_PEM_ARGS &
++echo "VB.NET Test passed" | ./axssl.vbnet.exe $CLIENT_PEM_ARGS
++kill %1
++sleep 1
++echo "### VB.NET tests complete"
++fi
++
++if [ -f ./axssl.pl ]; then
++echo "########################## PERL SAMPLE ###########################"
++"$PERL_BIN" ./axssl.pl $SERVER_ARGS &
++echo "Perl Test passed" | "$PERL_BIN" ./axssl.pl $CLIENT_ARGS
++$KILL_PERL
++sleep 1
++
++"$PERL_BIN" ./axssl.pl $SERVER_PEM_ARGS &
++echo "Perl Test passed" | "$PERL_BIN" ./axssl.pl $CLIENT_PEM_ARGS
++$KILL_PERL
++sleep 1
++echo "### Perl tests complete"
++fi
++
++if [ -f ./axssl.lua ]; then
++echo "########################## LUA SAMPLE ###########################"
++./axssl.lua $SERVER_ARGS &
++echo "Lua Test passed" | ./axssl.lua $CLIENT_ARGS
++$KILL_LUA
++sleep 1
++
++./axssl.lua $SERVER_PEM_ARGS &
++echo "Lua Test passed" | ./axssl.lua $CLIENT_PEM_ARGS
++$KILL_LUA
++sleep 1
++echo "### Lua tests complete"
++fi
++
++echo "########################## ALL TESTS COMPLETE ###########################"
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/thawte.x509_ca b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/thawte.x509_ca
+new file mode 100644
+index 0000000000000000000000000000000000000000..59b1059f84086fa580dc1001303c4db4e070e572
+GIT binary patch
+literal 811
+zcmXqLVpcb3Vw$jknTe5!iILHOmyJ`a&7<u*FC!xhD}zDfIYVv(PB!LH7B*p~C`Ut4
+z17Q${LzpK#wYVg;C{MvTu^`n@$Up!j%r49c;wpsXm**ME8c2i0xP(PQG7`&6QWc!@
+z^NLGzN;31(6_S$;H4M~1(%i!G&Z$KunQ58Hi6xo&c?!X)MP-@Esl^H|nPr*9KoLVl
+z19^~2W?>1aK><anxtXQ8V5O-=3eJvT!(i^_WE7JufT++d1{#)H<WK^3fL?Nbu7R95
+zuceuRg@K^~7(|Kl8W|WG83U22rKx4q@bhrveB?M~WMyD(>;=YaCsSi1!zDAbtnTZF
+zqUYUebWG~Ec<0FydhNn{8R@BF?(Zc$Os#^xXlJqYTkF3Hd%V7_cb@q7d0SFTnS9@$
+z=3Jy0cw_d3^b5OqC$WhXUzvP*x)#Hn7(bppzeI!nd~(UVCFqsMF<)Qz@y}IOZN=N%
+zf+J3JvhHmb+)-@5ioN%XlkanfxiaQV%!~|-i-ipY4fugEEGx{&_@9N<fEh?3yBU}c
+znSqW~^Ux7H6!GhYSP9RnRq-MApRS**NQjHeGf!43H>=wue#B(wSB};{CmAjN`|kTB
+z=H&c*ca+=jgU1BrKYDG@a65VUh*RyJU#lbYu5J(P5PZC(RWiHDX9<tc+Lue#*?&Cj
+nnL4ZI=m|U3?Nes%o@7+W{-G`IZGieR-et-^cb{IyF5(0LRxS$7
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/verisign.x509_ca b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/verisign.x509_ca
+new file mode 100644
+index 0000000000000000000000000000000000000000..d2ea1289d6f43b837eb685446af97d942a8d98e6
+GIT binary patch
+literal 668
+zcmXqLVwz#l#Kg!Xps-^4y4y`m_YRsZ@Kf8{UTnb2#;Mij(e|B}k&%g&!Jx6nklTQh
+zjX9KsO_(V(*ihU+6vW{Y<_k+L$_&m-&(l%x%uCiYG%(NuNpK6RyX6-tgrpXiC<K%i
+z733GE7AyGY<y7h^DEQ?oBo-H!7A58-rxxoO8W|XXbTA8R!i-V~DauUDQ3y^=E-gw0
+zQblE{P@{tK^Gg(*9S!8fc@0brj0`Ldz#vMT*9gS5Fful^G_{NxY|d?*j~t$itPISJ
+zy}&T-WNK_=n6LQ#sP&|<nex+F<}a8eu(B;OAjhBaM8*Mzu!XBQJ%2l2*m~(8pF%<L
+ze5Fs73XhG>`CKd5-@#z5p&(TMr~SNx>{S1)iXw~p883_fotvm7>@WOHLUXNt;H*b_
+z|IQe^xO{Hv`^QNljGg@tW>o80?|dhoUHjsH8z1xKWBTV_tO(!D#LURRi0nLIbTb3p
+zWwp-Y-R7SHR;@y@?^|{x`0o6ab&@xk`Ta5fEloQwoG`H15dW%Sy}DTBd%Xlc@q%Y{
+zucp0BS^d~*a<WyyjF~y}`}t=7nbx)GkJQtNbvM@D_`K2g<0bZ^Y3`429?vv;=phz3
+lXGM?UMztI5<<-fYw^|!5);_qj<Mwqi%VXK?eIF|x0RUHq@TmX*
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/verisign.x509_ca.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/verisign.x509_ca.pem
+new file mode 100644
+index 0000000..d5ef5d2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/verisign.x509_ca.pem
+@@ -0,0 +1,16 @@
++-----BEGIN CERTIFICATE-----
++MIICmDCCAgECECCol67bggLewTagTia9h3MwDQYJKoZIhvcNAQECBQAwgYwxCzAJ
++BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEwMC4GA1UECxMnRm9y
++IFRlc3QgUHVycG9zZXMgT25seS4gIE5vIGFzc3VyYW5jZXMuMTIwMAYDVQQDEylW
++ZXJpU2lnbiBUcmlhbCBTZWN1cmUgU2VydmVyIFRlc3QgUm9vdCBDQTAeFw0wNTAy
++MDkwMDAwMDBaFw0yNTAyMDgyMzU5NTlaMIGMMQswCQYDVQQGEwJVUzEXMBUGA1UE
++ChMOVmVyaVNpZ24sIEluYy4xMDAuBgNVBAsTJ0ZvciBUZXN0IFB1cnBvc2VzIE9u
++bHkuICBObyBhc3N1cmFuY2VzLjEyMDAGA1UEAxMpVmVyaVNpZ24gVHJpYWwgU2Vj
++dXJlIFNlcnZlciBUZXN0IFJvb3QgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ
++AoGBAJ8h98U7klaZH5cEn6CSEKmGWVBsTwHIaMAAVqGqCUn7Q9C10sEOIHBznyLy
++eSDjMs5M1nC/iAA7KCASf/yHz0AdlU+1IRSijwHTF/2dYSoTTxP2GCmtL1Ga4i7+
++zDDo086V7+NiFAGJj+CYey47ue4Xa33o/4YOA9PGL87oqFe7AgMBAAEwDQYJKoZI
++hvcNAQECBQADgYEAOq447rP5EDqFEl3vhLhgTbnyaskNYwPvxk+0grnQyDA4sF/q
++gK8nFlnvLmAOF3DmfuqW6WSr4zqTYzpwmJlsn48Om/yWirL8GuWRftit2POxTfHS
++B8VmR+PZx2k24UgWUZyojDGxJtiHd3tjCdqFgTit4NK429cWOcZrh47xeOI=
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/verisign.x509_my_cert b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/verisign.x509_my_cert
+new file mode 100644
+index 0000000000000000000000000000000000000000..426c9ff7f1c0af7c2376af6a0868cc1429f06347
+GIT binary patch
+literal 1095
+zcmXqLVsSQTVqUX=nTe5!Nx=PkIJd$6<5O-ul|KDSsAZ7>FB_*;n@8JsUPeY%RtAH{
+z9z$*ePB!LH7B*p~&|pJx15pr%OPDV#wJ0+<Gd)j7!80#e&(Od?4<x}YtnQXyq!5x?
+zT%r(AT2zo<oLa2lpO;gqr=Z}MuaH<=Tw0Wvmz-LxXJ}+#0MfxMtO+wpA*3iXF-IXd
+zHMz7X6-X78r9zDg%Fi!RaCS716X!KBGcYtXGXR4q2-n!a$k^1<)H2GTaVL^<9YYOy
+z47fmca0oL8=A;-38t{X7>>?aaMVZA(iFv7pk_O@+AubVt#ESf!{1BgDg@B^`tkmQZ
+zLs0`^kQBEFkD-B)i9%9li9&X2rJ<F91w_~|B(*5FSRp@6p|m(vA+bcEyu4fw=;F*`
+zV5sON=jZAt7ZmH407D`<Q9&bF)4<eF+CUPdmsvyzq!w&rNlr0PtzKS{LF0Vnz-MG-
+zU~cRMMnET1V<W@1JCC30y{dWUu};3Q`PhSA<E~sKX&vdF`2q$tDKSA?_-?rH$=+LH
+zWO}h}nSDWShjil}##eL0E00fE_ByBRVs@l!!@t=VM3{t+d^(o=Z%c#L{7Jw5lsx<4
+zsKj{J|CsrT$;)?(FBO*;O5Lj1KI4T$eZkHNzxIprO-OyX<AnXYGe4P_85tNCH!+qP
+zG%*%}(}S!q3zGqZ0XNV;vivM8%uK8c4BSB+c@_r)I|G{qRtqfJ%rZ(!3as??gTsO#
+zk*b?ql!F>ZKq+vngJKw%B24vwDh#|p1}Oj&s-uBD8&^V`2V>h0S4MVG149FSHV$nz
+zVA5n~ViZ#b8D9)EA5X{|$b!sLWf3zFf$3ysgtM3oOkiwAMivbNH3JnG-+-}A0_yzy
+z<l+JpR~zKQR59|fBpSpoj9n0I5NQx@5Gux*nVXoNs-K>jW}s*wZ@|vRs?EpDB*h}q
+z|Map{+nV0K?8E09vaWbY=u}JU8K^@10Q5pmetJHN9r|U(U@?$MsF{)(m>{%MIgMNe
+zF3gcp;g*^HXwj|JH%sakW^XY%?K}Ip+slNyvt8M1?Uz`5cz$g&-`l2-@0b62`(fXd
+z*3a*ARU9g<^p4fEd<fXn`n;x_tFOZPj(O`D$;k#WznmrR{_tfDP+B={)!l=hYVMuv
+dFWzaEBw8?qo-|YCxP90BWP6ZnFyD^d69G?mT9W_(
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/verisign.x509_my_cert.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/verisign.x509_my_cert.pem
+new file mode 100644
+index 0000000..5b6c1ff
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/verisign.x509_my_cert.pem
+@@ -0,0 +1,25 @@
++-----BEGIN CERTIFICATE-----
++MIIEQzCCA6ygAwIBAgIQR/dXCzC/x5Ta5RvL6hKEojANBgkqhkiG9w0BAQUFADCB
++jDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTAwLgYDVQQL
++EydGb3IgVGVzdCBQdXJwb3NlcyBPbmx5LiAgTm8gYXNzdXJhbmNlcy4xMjAwBgNV
++BAMTKVZlcmlTaWduIFRyaWFsIFNlY3VyZSBTZXJ2ZXIgVGVzdCBSb290IENBMB4X
++DTA2MDExNjAwMDAwMFoXDTA2MDEzMDIzNTk1OVowgbkxCzAJBgNVBAYTAkFVMQww
++CgYDVQQIEwNRbGQxETAPBgNVBAcUCEJyaXNiYW5lMRkwFwYDVQQKFBBheG9sb1RM
++UyBQcm9qZWN0MRUwEwYDVQQLFAwxMDI0IGJpdCBrZXkxOjA4BgNVBAsUMVRlcm1z
++IG9mIHVzZSBhdCB3d3cudmVyaXNpZ24uY29tL2Nwcy90ZXN0Y2EgKGMpMDUxGzAZ
++BgNVBAMUEnd3dy5heG9sb3Rscy5jby5ucjCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
++gYkCgYEAttzj5S7qfOZIrh9xg8bgjTOKbSIbLBuMnxAwfGRcUrQO2EQOHd6kMjXR
++hqY/cG2IG4G8AeqdV3nHlKbrbHbRa1lFgP6b0BQCE8TyxmP+tIAqn5L6/HTm+EEi
++Ad1Pxjeok6e7F6UXHxJltSGHmOhAf3C5kPq/FQ6QZeG4yD/uzPkCAwEAAaOCAXUw
++ggFxMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgWgMEcGA1UdHwRAMD4wPKA6oDiGNmh0
++dHA6Ly9TVlJTZWN1cmUtY3JsLnZlcmlzaWduLmNvbS9TVlJUcmlhbFJvb3QyMDA1
++LmNybDBKBgNVHSAEQzBBMD8GCmCGSAGG+EUBBxUwMTAvBggrBgEFBQcCARYjaHR0
++cHM6Ly93d3cudmVyaXNpZ24uY29tL2Nwcy90ZXN0Y2EwHQYDVR0lBBYwFAYIKwYB
++BQUHAwEGCCsGAQUFBwMCMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0
++cDovL29jc3AudmVyaXNpZ24uY29tMG0GCCsGAQUFBwEMBGEwX6FdoFswWTBXMFUW
++CWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgsexkuMCUW
++I2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMA0GCSqGSIb3DQEB
++BQUAA4GBACtlCTJFENCcHCQLHJfiotqr2XR+oWu0MstNm8dG6WB+zYprrT+kOPDn
++1rMO7YLx76f67fC+lIXz720kQHk6LsZ8hPBQvIXnfIsKjng73DeFzBmTMFz6Qxjd
+++E0FUCKplqrdwUkmR4kH6O4pdGE4AlXJNiUI2903yYdSRVMOuLuR
++-----END CERTIFICATE-----
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1.c
+new file mode 100755
+index 0000000..658c2c1
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1.c
+@@ -0,0 +1,2057 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * Common ssl/tlsv1 code to both the client and server implementations.
++ */
++
++#include <string.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <stdarg.h>
++#include "ssl.h"
++
++/* The session expiry time */
++#define SSL_EXPIRY_TIME (CONFIG_SSL_EXPIRY_TIME*3600)
++
++static const uint8_t g_hello_request[] = { HS_HELLO_REQUEST, 0, 0, 0 };
++static const uint8_t g_chg_cipher_spec_pkt[] = { 1 };
++static const char * server_finished = "server finished";
++static const char * client_finished = "client finished";
++
++static int do_handshake(SSL *ssl, uint8_t *buf, int read_len);
++static void set_key_block(SSL *ssl, int is_write);
++static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len);
++static void *crypt_new(SSL *ssl, uint8_t *key, uint8_t *iv, int is_decrypt);
++static int send_raw_packet(SSL *ssl, uint8_t protocol);
++
++/**
++ * The server will pick the cipher based on the order that the order that the
++ * ciphers are listed. This order is defined at compile time.
++ */
++#ifdef CONFIG_SSL_SKELETON_MODE
++const uint8_t ssl_prot_prefs[NUM_PROTOCOLS] =
++{ SSL_RC4_128_SHA };
++#else
++static void session_free(SSL_SESSION *ssl_sessions[], int sess_index);
++
++const uint8_t ssl_prot_prefs[NUM_PROTOCOLS] =
++#ifdef CONFIG_SSL_PROT_LOW /* low security, fast speed */
++{ SSL_RC4_128_SHA, SSL_AES128_SHA, SSL_AES256_SHA, SSL_RC4_128_MD5 };
++#elif CONFIG_SSL_PROT_MEDIUM /* medium security, medium speed */
++{ SSL_AES128_SHA, SSL_AES256_SHA, SSL_RC4_128_SHA, SSL_RC4_128_MD5 };
++#else /* CONFIG_SSL_PROT_HIGH */ /* high security, low speed */
++{ SSL_AES256_SHA, SSL_AES128_SHA, SSL_RC4_128_SHA, SSL_RC4_128_MD5 };
++#endif
++#endif /* CONFIG_SSL_SKELETON_MODE */
++
++/**
++ * The cipher map containing all the essentials for each cipher.
++ */
++#ifdef CONFIG_SSL_SKELETON_MODE
++static const cipher_info_t cipher_info[NUM_PROTOCOLS] =
++{
++ { /* RC4-SHA */
++ SSL_RC4_128_SHA, /* RC4-SHA */
++ 16, /* key size */
++ 0, /* iv size */
++ 2*(SHA1_SIZE+16), /* key block size */
++ 0, /* no padding */
++ SHA1_SIZE, /* digest size */
++ hmac_sha1, /* hmac algorithm */
++ (crypt_func)RC4_crypt, /* encrypt */
++ (crypt_func)RC4_crypt /* decrypt */
++ },
++};
++#else
++static const cipher_info_t cipher_info[NUM_PROTOCOLS] =
++{
++ { /* AES128-SHA */
++ SSL_AES128_SHA, /* AES128-SHA */
++ 16, /* key size */
++ 16, /* iv size */
++ 2*(SHA1_SIZE+16+16), /* key block size */
++ 16, /* block padding size */
++ SHA1_SIZE, /* digest size */
++ hmac_sha1, /* hmac algorithm */
++ (crypt_func)AES_cbc_encrypt, /* encrypt */
++ (crypt_func)AES_cbc_decrypt /* decrypt */
++ },
++ { /* AES256-SHA */
++ SSL_AES256_SHA, /* AES256-SHA */
++ 32, /* key size */
++ 16, /* iv size */
++ 2*(SHA1_SIZE+32+16), /* key block size */
++ 16, /* block padding size */
++ SHA1_SIZE, /* digest size */
++ hmac_sha1, /* hmac algorithm */
++ (crypt_func)AES_cbc_encrypt, /* encrypt */
++ (crypt_func)AES_cbc_decrypt /* decrypt */
++ },
++ { /* RC4-SHA */
++ SSL_RC4_128_SHA, /* RC4-SHA */
++ 16, /* key size */
++ 0, /* iv size */
++ 2*(SHA1_SIZE+16), /* key block size */
++ 0, /* no padding */
++ SHA1_SIZE, /* digest size */
++ hmac_sha1, /* hmac algorithm */
++ (crypt_func)RC4_crypt, /* encrypt */
++ (crypt_func)RC4_crypt /* decrypt */
++ },
++ /*
++ * This protocol is from SSLv2 days and is unlikely to be used - but was
++ * useful for testing different possible digest algorithms.
++ */
++ { /* RC4-MD5 */
++ SSL_RC4_128_MD5, /* RC4-MD5 */
++ 16, /* key size */
++ 0, /* iv size */
++ 2*(MD5_SIZE+16), /* key block size */
++ 0, /* no padding */
++ MD5_SIZE, /* digest size */
++ hmac_md5, /* hmac algorithm */
++ (crypt_func)RC4_crypt, /* encrypt */
++ (crypt_func)RC4_crypt /* decrypt */
++ },
++};
++#endif
++
++static void prf(const uint8_t *sec, int sec_len, uint8_t *seed, int seed_len,
++ uint8_t *out, int olen);
++static const cipher_info_t *get_cipher_info(uint8_t cipher);
++static void increment_read_sequence(SSL *ssl);
++static void increment_write_sequence(SSL *ssl);
++static void add_hmac_digest(SSL *ssl, int snd, uint8_t *hmac_header,
++ const uint8_t *buf, int buf_len, uint8_t *hmac_buf);
++
++/* win32 VC6.0 doesn't have variadic macros */
++#if defined(WIN32) && !defined(CONFIG_SSL_FULL_MODE)
++void DISPLAY_BYTES(SSL *ssl, const char *format,
++ const uint8_t *data, int size, ...) {}
++#endif
++
++/**
++ * Establish a new client/server context.
++ */
++EXP_FUNC SSL_CTX *STDCALL ssl_ctx_new(uint32_t options, int num_sessions)
++{
++ SSL_CTX *ssl_ctx = (SSL_CTX *)calloc(1, sizeof (SSL_CTX));
++ ssl_ctx->options = options;
++
++ if (load_key_certs(ssl_ctx) < 0)
++ {
++ free(ssl_ctx); /* can't load our key/certificate pair, so die */
++ return NULL;
++ }
++
++#ifndef CONFIG_SSL_SKELETON_MODE
++ ssl_ctx->num_sessions = num_sessions;
++#endif
++
++ SSL_CTX_MUTEX_INIT(ssl_ctx->mutex);
++
++#ifndef CONFIG_SSL_SKELETON_MODE
++ if (num_sessions)
++ {
++ ssl_ctx->ssl_sessions = (SSL_SESSION **)
++ calloc(1, num_sessions*sizeof(SSL_SESSION *));
++ }
++#endif
++
++ return ssl_ctx;
++}
++
++/*
++ * Remove a client/server context.
++ */
++EXP_FUNC void STDCALL ssl_ctx_free(SSL_CTX *ssl_ctx)
++{
++ SSL *ssl;
++ int i;
++
++ if (ssl_ctx == NULL)
++ return;
++
++ ssl = ssl_ctx->head;
++
++ /* clear out all the ssl entries */
++ while (ssl)
++ {
++ SSL *next = ssl->next;
++ ssl_free(ssl);
++ ssl = next;
++ }
++
++#ifndef CONFIG_SSL_SKELETON_MODE
++ /* clear out all the sessions */
++ for (i = 0; i < ssl_ctx->num_sessions; i++)
++ session_free(ssl_ctx->ssl_sessions, i);
++
++ free(ssl_ctx->ssl_sessions);
++#endif
++
++ i = 0;
++ while (i < CONFIG_SSL_MAX_CERTS && ssl_ctx->certs[i].buf)
++ {
++ free(ssl_ctx->certs[i].buf);
++ ssl_ctx->certs[i++].buf = NULL;
++ }
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ remove_ca_certs(ssl_ctx->ca_cert_ctx);
++#endif
++ ssl_ctx->chain_length = 0;
++ SSL_CTX_MUTEX_DESTROY(ssl_ctx->mutex);
++ RSA_free(ssl_ctx->rsa_ctx);
++ RNG_terminate();
++ free(ssl_ctx);
++}
++
++/*
++ * Free any used resources used by this connection.
++ */
++EXP_FUNC void STDCALL ssl_free(SSL *ssl)
++{
++ SSL_CTX *ssl_ctx;
++
++ if (ssl == NULL) /* just ignore null pointers */
++ return;
++
++ /* spec says we must notify when we are dying */
++ send_alert(ssl, SSL_ALERT_CLOSE_NOTIFY);
++
++ ssl_ctx = ssl->ssl_ctx;
++
++ SSL_CTX_LOCK(ssl_ctx->mutex);
++
++ /* adjust the server SSL list */
++ if (ssl->prev)
++ ssl->prev->next = ssl->next;
++ else
++ ssl_ctx->head = ssl->next;
++
++ if (ssl->next)
++ ssl->next->prev = ssl->prev;
++ else
++ ssl_ctx->tail = ssl->prev;
++
++ SSL_CTX_UNLOCK(ssl_ctx->mutex);
++
++ /* may already be free - but be sure */
++ free(ssl->encrypt_ctx);
++ free(ssl->decrypt_ctx);
++ disposable_free(ssl);
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ x509_free(ssl->x509_ctx);
++#endif
++
++ free(ssl);
++}
++
++/*
++ * Read the SSL connection and send any alerts for various errors.
++ */
++EXP_FUNC int STDCALL ssl_read(SSL *ssl, uint8_t **in_data)
++{
++ int ret = basic_read(ssl, in_data);
++
++ /* check for return code so we can send an alert */
++ if (ret < SSL_OK)
++ {
++ if (ret != SSL_ERROR_CONN_LOST)
++ {
++ send_alert(ssl, ret);
++#ifndef CONFIG_SSL_SKELETON_MODE
++ /* something nasty happened, so get rid of this session */
++ kill_ssl_session(ssl->ssl_ctx->ssl_sessions, ssl);
++#endif
++ }
++ }
++
++ return ret;
++}
++
++/*
++ * Write application data to the client
++ */
++EXP_FUNC int STDCALL ssl_write(SSL *ssl, const uint8_t *out_data, int out_len)
++{
++ int n = out_len, nw, i, tot = 0;
++
++ /* maximum size of a TLS packet is around 16kB, so fragment */
++ do
++ {
++ nw = n;
++
++ if (nw > RT_MAX_PLAIN_LENGTH) /* fragment if necessary */
++ nw = RT_MAX_PLAIN_LENGTH;
++
++ if ((i = send_packet(ssl, PT_APP_PROTOCOL_DATA,
++ &out_data[tot], nw)) <= 0)
++ {
++ out_len = i; /* an error */
++ break;
++ }
++
++ tot += i;
++ n -= i;
++ } while (n > 0);
++
++ return out_len;
++}
++
++/**
++ * Add a certificate to the certificate chain.
++ */
++int add_cert(SSL_CTX *ssl_ctx, const uint8_t *buf, int len)
++{
++ int ret = SSL_ERROR_NO_CERT_DEFINED, i = 0;
++ SSL_CERT *ssl_cert;
++ X509_CTX *cert = NULL;
++ int offset;
++
++ while (ssl_ctx->certs[i].buf && i < CONFIG_SSL_MAX_CERTS)
++ i++;
++
++ if (i == CONFIG_SSL_MAX_CERTS) /* too many certs */
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("Error: maximum number of certs added - change of "
++ "compile-time configuration required\n");
++#endif
++ goto error;
++ }
++
++ if ((ret = x509_new(buf, &offset, &cert)))
++ goto error;
++
++#if defined (CONFIG_SSL_FULL_MODE)
++ if (ssl_ctx->options & SSL_DISPLAY_CERTS)
++ x509_print(cert, NULL);
++#endif
++
++ ssl_cert = &ssl_ctx->certs[i];
++ ssl_cert->size = len;
++ ssl_cert->buf = (uint8_t *)malloc(len);
++ memcpy(ssl_cert->buf, buf, len);
++ ssl_ctx->chain_length++;
++ len -= offset;
++ ret = SSL_OK; /* ok so far */
++
++ /* recurse? */
++ if (len > 0)
++ {
++ ret = add_cert(ssl_ctx, &buf[offset], len);
++ }
++
++error:
++ x509_free(cert); /* don't need anymore */
++ return ret;
++}
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++/**
++ * Add a certificate authority.
++ */
++int add_cert_auth(SSL_CTX *ssl_ctx, const uint8_t *buf, int len)
++{
++ int ret = SSL_ERROR_NO_CERT_DEFINED;
++ int i = 0;
++ int offset;
++ CA_CERT_CTX *ca_cert_ctx;
++
++ if (ssl_ctx->ca_cert_ctx == NULL)
++ ssl_ctx->ca_cert_ctx = (CA_CERT_CTX *)calloc(1, sizeof(CA_CERT_CTX));
++
++ ca_cert_ctx = ssl_ctx->ca_cert_ctx;
++
++ while (i < CONFIG_X509_MAX_CA_CERTS && ca_cert_ctx->cert[i])
++ i++;
++
++ if (i > CONFIG_X509_MAX_CA_CERTS)
++ {
++#ifdef CONFIG_SSL_FULL_MODE
++ printf("Error: maximum number of CA certs added - change of "
++ "compile-time configuration required\n");
++#endif
++ goto error;
++ }
++
++ if ((ret = x509_new(buf, &offset, &ca_cert_ctx->cert[i])))
++ goto error;
++
++ len -= offset;
++ ret = SSL_OK; /* ok so far */
++
++ /* recurse? */
++ if (len > 0)
++ ret = add_cert_auth(ssl_ctx, &buf[offset], len);
++
++error:
++ return ret;
++}
++
++/*
++ * Retrieve an X.509 distinguished name component
++ */
++EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component)
++{
++ if (ssl->x509_ctx == NULL)
++ return NULL;
++
++ switch (component)
++ {
++ case SSL_X509_CERT_COMMON_NAME:
++ return ssl->x509_ctx->cert_dn[X509_COMMON_NAME];
++
++ case SSL_X509_CERT_ORGANIZATION:
++ return ssl->x509_ctx->cert_dn[X509_ORGANIZATION];
++
++ case SSL_X509_CERT_ORGANIZATIONAL_NAME:
++ return ssl->x509_ctx->cert_dn[X509_ORGANIZATIONAL_UNIT];
++
++ case SSL_X509_CA_CERT_COMMON_NAME:
++ return ssl->x509_ctx->ca_cert_dn[X509_COMMON_NAME];
++
++ case SSL_X509_CA_CERT_ORGANIZATION:
++ return ssl->x509_ctx->ca_cert_dn[X509_ORGANIZATION];
++
++ case SSL_X509_CA_CERT_ORGANIZATIONAL_NAME:
++ return ssl->x509_ctx->ca_cert_dn[X509_ORGANIZATIONAL_UNIT];
++
++ default:
++ return NULL;
++ }
++}
++
++#endif
++
++/*
++ * Find an ssl object based on the client's file descriptor.
++ */
++EXP_FUNC SSL * STDCALL ssl_find(SSL_CTX *ssl_ctx, int client_fd)
++{
++ SSL *ssl;
++
++ SSL_CTX_LOCK(ssl_ctx->mutex);
++ ssl = ssl_ctx->head;
++
++ /* search through all the ssl entries */
++ while (ssl)
++ {
++ if (ssl->client_fd == client_fd)
++ {
++ SSL_CTX_UNLOCK(ssl_ctx->mutex);
++ return ssl;
++ }
++
++ ssl = ssl->next;
++ }
++
++ SSL_CTX_UNLOCK(ssl_ctx->mutex);
++ return NULL;
++}
++
++/*
++ * Force the client to perform its handshake again.
++ */
++EXP_FUNC int STDCALL ssl_renegotiate(SSL *ssl)
++{
++ int ret = SSL_OK;
++
++ disposable_new(ssl);
++#ifdef CONFIG_SSL_ENABLE_CLIENT
++ if (IS_SET_SSL_FLAG(SSL_IS_CLIENT))
++ {
++ ret = do_client_connect(ssl);
++ }
++ else
++#endif
++ {
++ send_packet(ssl, PT_HANDSHAKE_PROTOCOL,
++ g_hello_request, sizeof(g_hello_request));
++ SET_SSL_FLAG(SSL_NEED_RECORD);
++ }
++
++ return ret;
++}
++
++/**
++ * @brief Get what we need for key info.
++ * @param cipher [in] The cipher information we are after
++ * @param key_size [out] The key size for the cipher
++ * @param iv_size [out] The iv size for the cipher
++ * @return The amount of key information we need.
++ */
++static const cipher_info_t *get_cipher_info(uint8_t cipher)
++{
++ int i;
++
++ for (i = 0; i < NUM_PROTOCOLS; i++)
++ {
++ if (cipher_info[i].cipher == cipher)
++ {
++ return &cipher_info[i];
++ }
++ }
++
++ return NULL; /* error */
++}
++
++/*
++ * Get a new ssl context for a new connection.
++ */
++SSL *ssl_new(SSL_CTX *ssl_ctx, int client_fd)
++{
++ SSL *ssl = (SSL *)calloc(1, sizeof(SSL));
++ ssl->ssl_ctx = ssl_ctx;
++ ssl->need_bytes = SSL_RECORD_SIZE; /* need a record */
++ ssl->client_fd = client_fd;
++ ssl->flag = SSL_NEED_RECORD;
++ ssl->bm_data = ssl->bm_all_data+BM_RECORD_OFFSET; /* space at the start */
++ ssl->hs_status = SSL_NOT_OK; /* not connected */
++#ifdef CONFIG_ENABLE_VERIFICATION
++ ssl->ca_cert_ctx = ssl_ctx->ca_cert_ctx;
++#endif
++ disposable_new(ssl);
++
++ /* a bit hacky but saves a few bytes of memory */
++ ssl->flag |= ssl_ctx->options;
++ SSL_CTX_LOCK(ssl_ctx->mutex);
++
++ if (ssl_ctx->head == NULL)
++ {
++ ssl_ctx->head = ssl;
++ ssl_ctx->tail = ssl;
++ }
++ else
++ {
++ ssl->prev = ssl_ctx->tail;
++ ssl_ctx->tail->next = ssl;
++ ssl_ctx->tail = ssl;
++ }
++
++ SSL_CTX_UNLOCK(ssl_ctx->mutex);
++ return ssl;
++}
++
++/*
++ * Add a private key to a context.
++ */
++int add_private_key(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj)
++{
++ int ret = SSL_OK;
++
++ /* get the private key details */
++ if (asn1_get_private_key(ssl_obj->buf, ssl_obj->len, &ssl_ctx->rsa_ctx))
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto error;
++ }
++
++error:
++ return ret;
++}
++
++/**
++ * Increment the read sequence number (as a 64 bit endian indepenent #)
++ */
++static void increment_read_sequence(SSL *ssl)
++{
++ int i;
++
++ for (i = 7; i >= 0; i--)
++ {
++ if (++ssl->read_sequence[i])
++ break;
++ }
++}
++
++/**
++ * Increment the read sequence number (as a 64 bit endian indepenent #)
++ */
++static void increment_write_sequence(SSL *ssl)
++{
++ int i;
++
++ for (i = 7; i >= 0; i--)
++ {
++ if (++ssl->write_sequence[i])
++ break;
++ }
++}
++
++/**
++ * Work out the HMAC digest in a packet.
++ */
++static void add_hmac_digest(SSL *ssl, int mode, uint8_t *hmac_header,
++ const uint8_t *buf, int buf_len, uint8_t *hmac_buf)
++{
++ int hmac_len = buf_len + 8 + SSL_RECORD_SIZE;
++ uint8_t *t_buf = (uint8_t *)alloca(hmac_len+10);
++
++ memcpy(t_buf, (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_WRITE) ?
++ ssl->write_sequence : ssl->read_sequence, 8);
++ memcpy(&t_buf[8], hmac_header, SSL_RECORD_SIZE);
++ memcpy(&t_buf[8+SSL_RECORD_SIZE], buf, buf_len);
++
++ ssl->cipher_info->hmac(t_buf, hmac_len,
++ (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_READ) ?
++ ssl->server_mac : ssl->client_mac,
++ ssl->cipher_info->digest_size, hmac_buf);
++
++#if 0
++ print_blob("record", ssl->hmac_tx, SSL_RECORD_SIZE);
++ print_blob("buf", buf, buf_len);
++ if (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_WRITE)
++ {
++ print_blob("write seq", ssl->write_sequence, 8);
++ }
++ else
++ {
++ print_blob("read seq", ssl->read_sequence, 8);
++ }
++
++ if (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_READ)
++ {
++ print_blob("server mac",
++ ssl->server_mac, ssl->cipher_info->digest_size);
++ }
++ else
++ {
++ print_blob("client mac",
++ ssl->client_mac, ssl->cipher_info->digest_size);
++ }
++ print_blob("hmac", hmac_buf, SHA1_SIZE);
++#endif
++}
++
++/**
++ * Verify that the digest of a packet is correct.
++ */
++static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len)
++{
++ uint8_t hmac_buf[SHA1_SIZE];
++ int hmac_offset;
++
++ if (ssl->cipher_info->padding_size)
++ {
++ hmac_offset = read_len-buf[read_len-1]-ssl->cipher_info->digest_size-1;
++ }
++ else
++ {
++ hmac_offset = read_len - ssl->cipher_info->digest_size;
++ }
++
++ /* sanity check the offset */
++ if (hmac_offset < 0)
++ {
++ return SSL_ERROR_INVALID_HMAC;
++ }
++
++ ssl->hmac_header[3] = hmac_offset >> 8; /* insert size */
++ ssl->hmac_header[4] = hmac_offset & 0xff;
++ add_hmac_digest(ssl, mode, ssl->hmac_header, buf, hmac_offset, hmac_buf);
++
++ if (memcmp(hmac_buf, &buf[hmac_offset], ssl->cipher_info->digest_size))
++ {
++ return SSL_ERROR_INVALID_HMAC;
++ }
++
++ return hmac_offset;
++}
++
++/**
++ * Add a packet to the end of our sent and received packets, so that we may use
++ * it to calculate the hash at the end.
++ */
++void add_packet(SSL *ssl, const uint8_t *pkt, int len)
++{
++ MD5_Update(&ssl->dc->md5_ctx, pkt, len);
++ SHA1_Update(&ssl->dc->sha1_ctx, pkt, len);
++}
++
++/**
++ * Work out the MD5 PRF.
++ */
++static void p_hash_md5(const uint8_t *sec, int sec_len,
++ uint8_t *seed, int seed_len, uint8_t *out, int olen)
++{
++ uint8_t a1[128];
++
++ /* A(1) */
++ hmac_md5(seed, seed_len, sec, sec_len, a1);
++ memcpy(&a1[MD5_SIZE], seed, seed_len);
++ hmac_md5(a1, MD5_SIZE+seed_len, sec, sec_len, out);
++
++ while (olen > MD5_SIZE)
++ {
++ uint8_t a2[MD5_SIZE];
++ out += MD5_SIZE;
++ olen -= MD5_SIZE;
++
++ /* A(N) */
++ hmac_md5(a1, MD5_SIZE, sec, sec_len, a2);
++ memcpy(a1, a2, MD5_SIZE);
++
++ /* work out the actual hash */
++ hmac_md5(a1, MD5_SIZE+seed_len, sec, sec_len, out);
++ }
++}
++
++/**
++ * Work out the SHA1 PRF.
++ */
++static void p_hash_sha1(const uint8_t *sec, int sec_len,
++ uint8_t *seed, int seed_len, uint8_t *out, int olen)
++{
++ uint8_t a1[128];
++
++ /* A(1) */
++ hmac_sha1(seed, seed_len, sec, sec_len, a1);
++ memcpy(&a1[SHA1_SIZE], seed, seed_len);
++ hmac_sha1(a1, SHA1_SIZE+seed_len, sec, sec_len, out);
++
++ while (olen > SHA1_SIZE)
++ {
++ uint8_t a2[SHA1_SIZE];
++ out += SHA1_SIZE;
++ olen -= SHA1_SIZE;
++
++ /* A(N) */
++ hmac_sha1(a1, SHA1_SIZE, sec, sec_len, a2);
++ memcpy(a1, a2, SHA1_SIZE);
++
++ /* work out the actual hash */
++ hmac_sha1(a1, SHA1_SIZE+seed_len, sec, sec_len, out);
++ }
++}
++
++/**
++ * Work out the PRF.
++ */
++static void prf(const uint8_t *sec, int sec_len, uint8_t *seed, int seed_len,
++ uint8_t *out, int olen)
++{
++ int len, i;
++ const uint8_t *S1, *S2;
++ uint8_t xbuf[256]; /* needs to be > the amount of key data */
++ uint8_t ybuf[256]; /* needs to be > the amount of key data */
++
++ len = sec_len/2;
++ S1 = sec;
++ S2 = &sec[len];
++ len += (sec_len & 1); /* add for odd, make longer */
++
++ p_hash_md5(S1, len, seed, seed_len, xbuf, olen);
++ p_hash_sha1(S2, len, seed, seed_len, ybuf, olen);
++
++ for (i = 0; i < olen; i++)
++ out[i] = xbuf[i] ^ ybuf[i];
++}
++
++/**
++ * Generate a master secret based on the client/server random data and the
++ * premaster secret.
++ */
++void generate_master_secret(SSL *ssl, const uint8_t *premaster_secret)
++{
++ uint8_t buf[128]; /* needs to be > 13+32+32 in size */
++ strcpy((char *)buf, "master secret");
++ memcpy(&buf[13], ssl->dc->client_random, SSL_RANDOM_SIZE);
++ memcpy(&buf[45], ssl->dc->server_random, SSL_RANDOM_SIZE);
++ prf(premaster_secret, SSL_SECRET_SIZE, buf, 77, ssl->dc->master_secret,
++ SSL_SECRET_SIZE);
++}
++
++/**
++ * Generate a 'random' blob of data used for the generation of keys.
++ */
++static void generate_key_block(uint8_t *client_random, uint8_t *server_random,
++ uint8_t *master_secret, uint8_t *key_block, int key_block_size)
++{
++ uint8_t buf[128];
++ strcpy((char *)buf, "key expansion");
++ memcpy(&buf[13], server_random, SSL_RANDOM_SIZE);
++ memcpy(&buf[45], client_random, SSL_RANDOM_SIZE);
++ prf(master_secret, SSL_SECRET_SIZE, buf, 77, key_block, key_block_size);
++}
++
++/**
++ * Calculate the digest used in the finished message. This function also
++ * doubles up as a certificate verify function.
++ */
++void finished_digest(SSL *ssl, const char *label, uint8_t *digest)
++{
++ uint8_t mac_buf[128];
++ uint8_t *q = mac_buf;
++ MD5_CTX md5_ctx = ssl->dc->md5_ctx;
++ SHA1_CTX sha1_ctx = ssl->dc->sha1_ctx;
++
++ if (label)
++ {
++ strcpy((char *)q, label);
++ q += strlen(label);
++ }
++
++ MD5_Final(q, &md5_ctx);
++ q += MD5_SIZE;
++
++ SHA1_Final(q, &sha1_ctx);
++ q += SHA1_SIZE;
++
++ if (label)
++ {
++ prf(ssl->dc->master_secret, SSL_SECRET_SIZE, mac_buf, (int)(q-mac_buf),
++ digest, SSL_FINISHED_HASH_SIZE);
++ }
++ else /* for use in a certificate verify */
++ {
++ memcpy(digest, mac_buf, MD5_SIZE + SHA1_SIZE);
++ }
++
++#if 0
++ printf("label: %s\n", label);
++ print_blob("master secret", ssl->dc->master_secret, 48);
++ print_blob("mac_buf", mac_buf, q-mac_buf);
++ print_blob("finished digest", digest, SSL_FINISHED_HASH_SIZE);
++#endif
++}
++
++/**
++ * Retrieve (and initialise) the context of a cipher.
++ */
++static void *crypt_new(SSL *ssl, uint8_t *key, uint8_t *iv, int is_decrypt)
++{
++ switch (ssl->cipher)
++ {
++#ifndef CONFIG_SSL_SKELETON_MODE
++ case SSL_AES128_SHA:
++ {
++ AES_CTX *aes_ctx = (AES_CTX *)malloc(sizeof(AES_CTX));
++ AES_set_key(aes_ctx, key, iv, AES_MODE_128);
++
++ if (is_decrypt)
++ {
++ AES_convert_key(aes_ctx);
++ }
++
++ return (void *)aes_ctx;
++ }
++
++ case SSL_AES256_SHA:
++ {
++ AES_CTX *aes_ctx = (AES_CTX *)malloc(sizeof(AES_CTX));
++ AES_set_key(aes_ctx, key, iv, AES_MODE_256);
++
++ if (is_decrypt)
++ {
++ AES_convert_key(aes_ctx);
++ }
++
++ return (void *)aes_ctx;
++ }
++ break;
++
++ case SSL_RC4_128_MD5:
++#endif
++ case SSL_RC4_128_SHA:
++ {
++ RC4_CTX *rc4_ctx = (RC4_CTX *)malloc(sizeof(RC4_CTX));
++ RC4_setup(rc4_ctx, key, 16);
++ return (void *)rc4_ctx;
++ }
++ break;
++ }
++
++ return NULL; /* its all gone wrong */
++}
++
++/**
++ * Send a packet over the socket.
++ */
++static int send_raw_packet(SSL *ssl, uint8_t protocol)
++{
++ uint8_t *rec_buf = ssl->bm_all_data;
++ int pkt_size = SSL_RECORD_SIZE+ssl->bm_index;
++ int sent = 0;
++ int ret = SSL_OK;
++
++ rec_buf[0] = protocol;
++ rec_buf[1] = 0x03; /* version = 3.1 (TLS) */
++ rec_buf[2] = 0x01;
++ rec_buf[3] = ssl->bm_index >> 8;
++ rec_buf[4] = ssl->bm_index & 0xff;
++
++ DISPLAY_BYTES(ssl, "sending %d bytes", ssl->bm_all_data,
++ pkt_size, pkt_size);
++
++ while (sent < pkt_size)
++ {
++ if ((ret = SOCKET_WRITE(ssl->client_fd,
++ &ssl->bm_all_data[sent], pkt_size)) < 0)
++ {
++ ret = SSL_ERROR_CONN_LOST;
++ break;
++ }
++
++ sent += ret;
++
++ /* keep going until the write buffer has some space */
++ if (sent != pkt_size)
++ {
++ fd_set wfds;
++ FD_ZERO(&wfds);
++ FD_SET(ssl->client_fd, &wfds);
++
++ if (select(ssl->client_fd + 1, NULL, &wfds, NULL, NULL) < 0)
++ {
++ ret = SSL_ERROR_CONN_LOST;
++ break;
++ }
++ }
++ }
++
++ SET_SSL_FLAG(SSL_NEED_RECORD); /* reset for next time */
++ ssl->bm_index = 0;
++
++ if (protocol != PT_APP_PROTOCOL_DATA)
++ {
++ /* always return SSL_OK during handshake */
++ ret = SSL_OK;
++ }
++
++ return ret;
++}
++
++/**
++ * Send an encrypted packet with padding bytes if necessary.
++ */
++int send_packet(SSL *ssl, uint8_t protocol, const uint8_t *in, int length)
++{
++ int msg_length = length;
++ int ret, pad_bytes = 0;
++ ssl->bm_index = msg_length;
++
++ /* if our state is bad, don't bother */
++ if (ssl->hs_status == SSL_ERROR_DEAD)
++ return SSL_ERROR_CONN_LOST;
++
++ if (in) /* has the buffer already been initialised? */
++ {
++ memcpy(ssl->bm_data, in, length);
++ }
++
++ if (IS_SET_SSL_FLAG(SSL_TX_ENCRYPTED))
++ {
++ int mode = IS_SET_SSL_FLAG(SSL_IS_CLIENT) ?
++ SSL_CLIENT_WRITE : SSL_SERVER_WRITE;
++ uint8_t hmac_header[SSL_RECORD_SIZE];
++
++ hmac_header[0] = protocol;
++ hmac_header[1] = 0x03;
++ hmac_header[2] = 0x01;
++ hmac_header[3] = length >> 8;
++ hmac_header[4] = length & 0xff;
++
++ if (protocol == PT_HANDSHAKE_PROTOCOL)
++ {
++ DISPLAY_STATE(ssl, 1, ssl->bm_data[0], 0);
++
++ if (ssl->bm_data[0] != HS_HELLO_REQUEST)
++ {
++ add_packet(ssl, ssl->bm_data, ssl->bm_index);
++ }
++ }
++
++ /* add the packet digest */
++ msg_length += ssl->cipher_info->digest_size;
++ ssl->bm_index = msg_length;
++ add_hmac_digest(ssl, mode, hmac_header, ssl->bm_data, length,
++ &ssl->bm_data[length]);
++
++ /* add padding? */
++ if (ssl->cipher_info->padding_size)
++ {
++ int last_blk_size = msg_length%ssl->cipher_info->padding_size;
++ pad_bytes = ssl->cipher_info->padding_size - last_blk_size;
++
++ /* ensure we always have at least 1 padding byte */
++ if (pad_bytes == 0)
++ pad_bytes += ssl->cipher_info->padding_size;
++
++ memset(&ssl->bm_data[msg_length], pad_bytes-1, pad_bytes);
++ msg_length += pad_bytes;
++ ssl->bm_index = msg_length;
++ }
++
++ DISPLAY_BYTES(ssl, "unencrypted write", ssl->bm_data, msg_length);
++ increment_write_sequence(ssl);
++
++ /* now encrypt the packet */
++ ssl->cipher_info->encrypt(ssl->encrypt_ctx, ssl->bm_data,
++ ssl->bm_data, msg_length);
++ }
++ else if (protocol == PT_HANDSHAKE_PROTOCOL)
++ {
++ DISPLAY_STATE(ssl, 1, ssl->bm_data[0], 0);
++
++ if (ssl->bm_data[0] != HS_HELLO_REQUEST)
++ {
++ add_packet(ssl, ssl->bm_data, ssl->bm_index);
++ }
++ }
++
++ if ((ret = send_raw_packet(ssl, protocol)) <= 0)
++ return ret;
++
++ return length; /* just return what we wanted to send */
++}
++
++/**
++ * Work out the cipher keys we are going to use for this session based on the
++ * master secret.
++ */
++static void set_key_block(SSL *ssl, int is_write)
++{
++ const cipher_info_t *ciph_info = get_cipher_info(ssl->cipher);
++ uint8_t *q;
++ uint8_t client_key[32], server_key[32]; /* big enough for AES256 */
++ uint8_t client_iv[16], server_iv[16]; /* big enough for AES128/256 */
++ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
++
++ /* only do once in a handshake */
++ if (ssl->dc->key_block == NULL)
++ {
++ ssl->dc->key_block = (uint8_t *)malloc(ciph_info->key_block_size);
++
++#if 0
++ print_blob("client", ssl->dc->client_random, 32);
++ print_blob("server", ssl->dc->server_random, 32);
++ print_blob("master", ssl->dc->master_secret, SSL_SECRET_SIZE);
++#endif
++ generate_key_block(ssl->dc->client_random, ssl->dc->server_random,
++ ssl->dc->master_secret, ssl->dc->key_block,
++ ciph_info->key_block_size);
++#if 0
++ print_blob("keyblock", ssl->key_block, ciph_info->key_block_size);
++#endif
++ }
++
++ q = ssl->dc->key_block;
++
++ if ((is_client && is_write) || (!is_client && !is_write))
++ {
++ memcpy(ssl->client_mac, q, ciph_info->digest_size);
++ }
++
++ q += ciph_info->digest_size;
++
++ if ((!is_client && is_write) || (is_client && !is_write))
++ {
++ memcpy(ssl->server_mac, q, ciph_info->digest_size);
++ }
++
++ q += ciph_info->digest_size;
++ memcpy(client_key, q, ciph_info->key_size);
++ q += ciph_info->key_size;
++ memcpy(server_key, q, ciph_info->key_size);
++ q += ciph_info->key_size;
++
++#ifndef CONFIG_SSL_SKELETON_MODE
++ if (ciph_info->iv_size) /* RC4 has no IV, AES does */
++ {
++ memcpy(client_iv, q, ciph_info->iv_size);
++ q += ciph_info->iv_size;
++ memcpy(server_iv, q, ciph_info->iv_size);
++ q += ciph_info->iv_size;
++ }
++#endif
++
++ free(is_write ? ssl->encrypt_ctx : ssl->decrypt_ctx);
++
++ /* now initialise the ciphers */
++ if (is_client)
++ {
++ finished_digest(ssl, server_finished, ssl->dc->final_finish_mac);
++
++ if (is_write)
++ ssl->encrypt_ctx = crypt_new(ssl, client_key, client_iv, 0);
++ else
++ ssl->decrypt_ctx = crypt_new(ssl, server_key, server_iv, 1);
++ }
++ else
++ {
++ finished_digest(ssl, client_finished, ssl->dc->final_finish_mac);
++
++ if (is_write)
++ ssl->encrypt_ctx = crypt_new(ssl, server_key, server_iv, 0);
++ else
++ ssl->decrypt_ctx = crypt_new(ssl, client_key, client_iv, 1);
++ }
++
++ ssl->cipher_info = ciph_info;
++}
++
++/**
++ * Read the SSL connection.
++ */
++int basic_read(SSL *ssl, uint8_t **in_data)
++{
++ int ret = SSL_OK;
++ int read_len, is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
++ uint8_t *buf = ssl->bm_data;
++
++ read_len = SOCKET_READ(ssl->client_fd, &buf[ssl->bm_read_index],
++ ssl->need_bytes-ssl->got_bytes);
++
++ /* connection has gone, so die */
++ if (read_len <= 0)
++ {
++ ret = SSL_ERROR_CONN_LOST;
++ ssl->hs_status = SSL_ERROR_DEAD; /* make sure it stays dead */
++ goto error;
++ }
++
++ DISPLAY_BYTES(ssl, "received %d bytes",
++ &ssl->bm_data[ssl->bm_read_index], read_len, read_len);
++
++ ssl->got_bytes += read_len;
++ ssl->bm_read_index += read_len;
++
++ /* haven't quite got what we want, so try again later */
++ if (ssl->got_bytes < ssl->need_bytes)
++ return SSL_OK;
++
++ read_len = ssl->got_bytes;
++ ssl->got_bytes = 0;
++
++ if (IS_SET_SSL_FLAG(SSL_NEED_RECORD))
++ {
++ /* check for sslv2 "client hello" */
++ if (buf[0] & 0x80 && buf[2] == 1 && buf[3] == 0x03)
++ {
++#ifdef CONFIG_SSL_ENABLE_V23_HANDSHAKE
++ DISPLAY_BYTES(ssl, "ssl2 record", buf, 5);
++ add_packet(ssl, &buf[2], 3);
++ ret = process_sslv23_client_hello(ssl);
++#else
++ printf("Error: no SSLv23 handshaking allowed\n"); TTY_FLUSH();
++ ret = SSL_ERROR_NOT_SUPPORTED;
++#endif
++ goto error; /* not an error - just get out of here */
++ }
++
++ ssl->need_bytes = (buf[3] << 8) + buf[4];
++
++ /* do we violate the spec with the message size? */
++ if (ssl->need_bytes > RT_MAX_PLAIN_LENGTH+RT_EXTRA-BM_RECORD_OFFSET)
++ {
++ ret = SSL_ERROR_INVALID_PROT_MSG;
++ goto error;
++ }
++
++ CLR_SSL_FLAG(SSL_NEED_RECORD);
++ memcpy(ssl->hmac_header, buf, 3); /* store for hmac */
++ ssl->record_type = buf[0];
++ goto error; /* no error, we're done */
++ }
++
++ /* for next time - just do it now in case of an error */
++ SET_SSL_FLAG(SSL_NEED_RECORD);
++ ssl->need_bytes = SSL_RECORD_SIZE;
++
++ /* decrypt if we need to */
++ if (IS_SET_SSL_FLAG(SSL_RX_ENCRYPTED))
++ {
++ ssl->cipher_info->decrypt(ssl->decrypt_ctx, buf, buf, read_len);
++ read_len = verify_digest(ssl,
++ is_client ? SSL_CLIENT_READ : SSL_SERVER_READ, buf, read_len);
++
++ /* does the hmac work? */
++ if (read_len < 0)
++ {
++ ret = read_len;
++ goto error;
++ }
++
++ DISPLAY_BYTES(ssl, "decrypted", buf, read_len);
++ increment_read_sequence(ssl);
++ }
++
++ /* The main part of the SSL packet */
++ switch (ssl->record_type)
++ {
++ case PT_HANDSHAKE_PROTOCOL:
++ ssl->dc->bm_proc_index = 0;
++ ret = do_handshake(ssl, buf, read_len);
++ break;
++
++ case PT_CHANGE_CIPHER_SPEC:
++ if (ssl->next_state != HS_FINISHED)
++ {
++ ret = SSL_ERROR_INVALID_HANDSHAKE;
++ goto error;
++ }
++
++ /* all encrypted from now on */
++ SET_SSL_FLAG(SSL_RX_ENCRYPTED);
++ set_key_block(ssl, 0);
++ memset(ssl->read_sequence, 0, 8);
++ break;
++
++ case PT_APP_PROTOCOL_DATA:
++ if (in_data)
++ {
++ *in_data = ssl->bm_data; /* point to the work buffer */
++ (*in_data)[read_len] = 0; /* null terminate just in case */
++ }
++
++ ret = read_len;
++ break;
++
++ case PT_ALERT_PROTOCOL:
++ /* return the alert # with alert bit set */
++ ret = -buf[1];
++ DISPLAY_ALERT(ssl, buf[1]);
++ break;
++
++ default:
++ ret = SSL_ERROR_INVALID_PROT_MSG;
++ break;
++ }
++
++error:
++ ssl->bm_read_index = 0; /* reset to go again */
++
++ if (ret < SSL_OK && in_data)/* if all wrong, then clear this buffer ptr */
++ *in_data = NULL;
++
++ return ret;
++}
++
++/**
++ * Do some basic checking of data and then perform the appropriate handshaking.
++ */
++static int do_handshake(SSL *ssl, uint8_t *buf, int read_len)
++{
++ int hs_len = (buf[2]<<8) + buf[3];
++ uint8_t handshake_type = buf[0];
++ int ret = SSL_OK;
++ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
++
++ /* some integrity checking on the handshake */
++ PARANOIA_CHECK(read_len-SSL_HS_HDR_SIZE, hs_len);
++
++ if (handshake_type != ssl->next_state)
++ {
++ /* handle a special case on the client */
++ if (!is_client || handshake_type != HS_CERT_REQ ||
++ ssl->next_state != HS_SERVER_HELLO_DONE)
++ {
++ ret = SSL_ERROR_INVALID_HANDSHAKE;
++ goto error;
++ }
++ }
++
++ hs_len += SSL_HS_HDR_SIZE; /* adjust for when adding packets */
++ ssl->bm_index = hs_len; /* store the size and check later */
++ DISPLAY_STATE(ssl, 0, handshake_type, 0);
++
++ if (handshake_type != HS_CERT_VERIFY && handshake_type != HS_HELLO_REQUEST)
++ add_packet(ssl, buf, hs_len);
++
++#if defined(CONFIG_SSL_ENABLE_CLIENT)
++ ret = is_client ?
++ do_clnt_handshake(ssl, handshake_type, buf, hs_len) :
++ do_svr_handshake(ssl, handshake_type, buf, hs_len);
++#else
++ ret = do_svr_handshake(ssl, handshake_type, buf, hs_len);
++#endif
++
++ /* just use recursion to get the rest */
++ if (hs_len < read_len && ret == SSL_OK)
++ ret = do_handshake(ssl, &buf[hs_len], read_len-hs_len);
++
++error:
++ return ret;
++}
++
++/**
++ * Sends the change cipher spec message. We have just read a finished message
++ * from the client.
++ */
++int send_change_cipher_spec(SSL *ssl)
++{
++ int ret = send_packet(ssl, PT_CHANGE_CIPHER_SPEC,
++ g_chg_cipher_spec_pkt, sizeof(g_chg_cipher_spec_pkt));
++ SET_SSL_FLAG(SSL_TX_ENCRYPTED);
++ set_key_block(ssl, 1);
++ memset(ssl->write_sequence, 0, 8);
++ return ret;
++}
++
++/**
++ * Send a "finished" message
++ */
++int send_finished(SSL *ssl)
++{
++ uint8_t *buf = ssl->bm_data;
++
++ buf[0] = HS_FINISHED;
++ buf[1] = 0;
++ buf[2] = 0;
++ buf[3] = SSL_FINISHED_HASH_SIZE;
++
++ /* now add the finished digest mac (12 bytes) */
++ finished_digest(ssl,
++ IS_SET_SSL_FLAG(SSL_IS_CLIENT) ?
++ client_finished : server_finished, &buf[4]);
++
++#ifndef CONFIG_SSL_SKELETON_MODE
++ /* store in the session cache */
++ if (!IS_SET_SSL_FLAG(SSL_SESSION_RESUME) && ssl->ssl_ctx->num_sessions)
++ {
++ memcpy(ssl->session->master_secret,
++ ssl->dc->master_secret, SSL_SECRET_SIZE);
++ }
++#endif
++
++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL,
++ NULL, SSL_FINISHED_HASH_SIZE+4);
++}
++
++/**
++ * Send an alert message.
++ * Return 1 if the alert was an "error".
++ */
++int send_alert(SSL *ssl, int error_code)
++{
++ int alert_num = 0;
++ int is_warning = 0;
++ uint8_t buf[2];
++
++ /* Don't bother we're already dead */
++ if (ssl->hs_status == SSL_ERROR_DEAD)
++ {
++ return SSL_ERROR_CONN_LOST;
++ }
++
++#ifdef CONFIG_SSL_FULL_MODE
++ if (IS_SET_SSL_FLAG(SSL_DISPLAY_STATES))
++ ssl_display_error(error_code);
++#endif
++
++ switch (error_code)
++ {
++ case SSL_ALERT_CLOSE_NOTIFY:
++ is_warning = 1;
++ alert_num = SSL_ALERT_CLOSE_NOTIFY;
++ break;
++
++ case SSL_ERROR_CONN_LOST: /* don't send alert just yet */
++ is_warning = 1;
++ break;
++
++ case SSL_ERROR_INVALID_HANDSHAKE:
++ case SSL_ERROR_INVALID_PROT_MSG:
++ alert_num = SSL_ALERT_HANDSHAKE_FAILURE;
++ break;
++
++ case SSL_ERROR_INVALID_HMAC:
++ case SSL_ERROR_FINISHED_INVALID:
++ alert_num = SSL_ALERT_BAD_RECORD_MAC;
++ break;
++
++ case SSL_ERROR_INVALID_VERSION:
++ alert_num = SSL_ALERT_INVALID_VERSION;
++ break;
++
++ case SSL_ERROR_INVALID_SESSION:
++ case SSL_ERROR_NO_CIPHER:
++ case SSL_ERROR_INVALID_KEY:
++ alert_num = SSL_ALERT_ILLEGAL_PARAMETER;
++ break;
++
++ case SSL_ERROR_BAD_CERTIFICATE:
++ alert_num = SSL_ALERT_BAD_CERTIFICATE;
++ break;
++
++ default:
++ /* a catch-all for any badly verified certificates */
++ alert_num = (error_code <= SSL_X509_OFFSET) ?
++ SSL_ALERT_BAD_CERTIFICATE : SSL_ALERT_UNEXPECTED_MESSAGE;
++ break;
++ }
++
++ buf[0] = is_warning ? 1 : 2;
++ buf[1] = alert_num;
++ send_packet(ssl, PT_ALERT_PROTOCOL, buf, sizeof(buf));
++ DISPLAY_ALERT(ssl, alert_num);
++ return is_warning ? 0 : 1;
++}
++
++/**
++ * Process a client finished message.
++ */
++int process_finished(SSL *ssl, int hs_len)
++{
++ uint8_t *buf = ssl->bm_data;
++ int ret = SSL_OK;
++ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
++ int resume = IS_SET_SSL_FLAG(SSL_SESSION_RESUME);
++
++ PARANOIA_CHECK(ssl->bm_index, SSL_FINISHED_HASH_SIZE+4);
++
++ /* check that we all work before we continue */
++ if (memcmp(ssl->dc->final_finish_mac, &buf[4], SSL_FINISHED_HASH_SIZE))
++ return SSL_ERROR_FINISHED_INVALID;
++
++ if ((!is_client && !resume) || (is_client && resume))
++ {
++ if ((ret = send_change_cipher_spec(ssl)) == SSL_OK)
++ ret = send_finished(ssl);
++ }
++
++ /* if we ever renegotiate */
++ ssl->next_state = is_client ? HS_HELLO_REQUEST : HS_CLIENT_HELLO;
++ ssl->hs_status = ret; /* set the final handshake status */
++
++error:
++ return ret;
++}
++
++/**
++ * Send a certificate.
++ */
++int send_certificate(SSL *ssl)
++{
++ int i = 0;
++ uint8_t *buf = ssl->bm_data;
++ int offset = 7;
++ int chain_length;
++
++ buf[0] = HS_CERTIFICATE;
++ buf[1] = 0;
++ buf[4] = 0;
++
++ while (i < ssl->ssl_ctx->chain_length)
++ {
++ SSL_CERT *cert = &ssl->ssl_ctx->certs[i];
++ buf[offset++] = 0;
++ buf[offset++] = cert->size >> 8; /* cert 1 length */
++ buf[offset++] = cert->size & 0xff;
++ memcpy(&buf[offset], cert->buf, cert->size);
++ offset += cert->size;
++ i++;
++ }
++
++ chain_length = offset - 7;
++ buf[5] = chain_length >> 8; /* cert chain length */
++ buf[6] = chain_length & 0xff;
++ chain_length += 3;
++ buf[2] = chain_length >> 8; /* handshake length */
++ buf[3] = chain_length & 0xff;
++ ssl->bm_index = offset;
++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset);
++}
++
++/**
++ * Create a blob of memory that we'll get rid of once the handshake is
++ * complete.
++ */
++void disposable_new(SSL *ssl)
++{
++ if (ssl->dc == NULL)
++ {
++ ssl->dc = (DISPOSABLE_CTX *)calloc(1, sizeof(DISPOSABLE_CTX));
++ MD5_Init(&ssl->dc->md5_ctx);
++ SHA1_Init(&ssl->dc->sha1_ctx);
++ }
++}
++
++/**
++ * Remove the temporary blob of memory.
++ */
++void disposable_free(SSL *ssl)
++{
++ if (ssl->dc)
++ {
++ free(ssl->dc->key_block);
++ memset(ssl->dc, 0, sizeof(DISPOSABLE_CTX));
++ free(ssl->dc);
++ ssl->dc = NULL;
++ }
++
++}
++
++#ifndef CONFIG_SSL_SKELETON_MODE /* no session resumption in this mode */
++/**
++ * Find if an existing session has the same session id. If so, use the
++ * master secret from this session for session resumption.
++ */
++SSL_SESSION *ssl_session_update(int max_sessions, SSL_SESSION *ssl_sessions[],
++ SSL *ssl, const uint8_t *session_id)
++{
++ time_t tm = time(NULL);
++ time_t oldest_sess_time = tm;
++ SSL_SESSION *oldest_sess = NULL;
++ int i;
++
++ /* no sessions? Then bail */
++ if (max_sessions == 0)
++ return NULL;
++
++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
++ if (session_id)
++ {
++ for (i = 0; i < max_sessions; i++)
++ {
++ if (ssl_sessions[i])
++ {
++ /* kill off any expired sessions */
++ if (tm > ssl_sessions[i]->conn_time + SSL_EXPIRY_TIME)
++ {
++ session_free(ssl_sessions, i);
++ continue;
++ }
++
++ /* if the session id matches, it must still be less than
++ the expiry time */
++ if (memcmp(ssl_sessions[i]->session_id, session_id,
++ SSL_SESSION_ID_SIZE) == 0)
++ {
++ ssl->session_index = i;
++ memcpy(ssl->dc->master_secret,
++ ssl_sessions[i]->master_secret, SSL_SECRET_SIZE);
++ SET_SSL_FLAG(SSL_SESSION_RESUME);
++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
++ return ssl_sessions[i]; /* a session was found */
++ }
++ }
++ }
++ }
++
++ /* If we've got here, no matching session was found - so create one */
++ for (i = 0; i < max_sessions; i++)
++ {
++ if (ssl_sessions[i] == NULL)
++ {
++ /* perfect, this will do */
++ ssl_sessions[i] = (SSL_SESSION *)calloc(1, sizeof(SSL_SESSION));
++ ssl_sessions[i]->conn_time = tm;
++ ssl->session_index = i;
++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
++ return ssl_sessions[i]; /* return the session object */
++ }
++ else if (ssl_sessions[i]->conn_time <= oldest_sess_time)
++ {
++ /* find the oldest session */
++ oldest_sess_time = ssl_sessions[i]->conn_time;
++ oldest_sess = ssl_sessions[i];
++ ssl->session_index = i;
++ }
++ }
++
++ /* ok, we've used up all of our sessions. So blow the oldest session away */
++ oldest_sess->conn_time = tm;
++ memset(oldest_sess->session_id, 0, sizeof(SSL_SESSION_ID_SIZE));
++ memset(oldest_sess->master_secret, 0, sizeof(SSL_SECRET_SIZE));
++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
++ return oldest_sess;
++}
++
++/**
++ * Free an existing session.
++ */
++static void session_free(SSL_SESSION *ssl_sessions[], int sess_index)
++{
++ if (ssl_sessions[sess_index])
++ {
++ free(ssl_sessions[sess_index]);
++ ssl_sessions[sess_index] = NULL;
++ }
++}
++
++/**
++ * This ssl object doesn't want this session anymore.
++ */
++void kill_ssl_session(SSL_SESSION **ssl_sessions, SSL *ssl)
++{
++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
++
++ if (ssl->ssl_ctx->num_sessions)
++ {
++ session_free(ssl_sessions, ssl->session_index);
++ ssl->session = NULL;
++ }
++
++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
++}
++#endif /* CONFIG_SSL_SKELETON_MODE */
++
++/*
++ * Get the session id for a handshake. This will be a 32 byte sequence.
++ */
++EXP_FUNC const uint8_t * STDCALL ssl_get_session_id(const SSL *ssl)
++{
++ return ssl->session_id;
++}
++
++/*
++ * Get the session id size for a handshake.
++ */
++EXP_FUNC uint8_t STDCALL ssl_get_session_id_size(const SSL *ssl)
++{
++ return ssl->sess_id_size;
++}
++
++/*
++ * Return the cipher id (in the SSL form).
++ */
++EXP_FUNC uint8_t STDCALL ssl_get_cipher_id(const SSL *ssl)
++{
++ return ssl->cipher;
++}
++
++/*
++ * Return the status of the handshake.
++ */
++EXP_FUNC int STDCALL ssl_handshake_status(const SSL *ssl)
++{
++ return ssl->hs_status;
++}
++
++/*
++ * Retrieve various parameters about the SSL engine.
++ */
++EXP_FUNC int STDCALL ssl_get_config(int offset)
++{
++ switch (offset)
++ {
++ /* return the appropriate build mode */
++ case SSL_BUILD_MODE:
++#if defined(CONFIG_SSL_FULL_MODE)
++ return SSL_BUILD_FULL_MODE;
++#elif defined(CONFIG_SSL_ENABLE_CLIENT)
++ return SSL_BUILD_ENABLE_CLIENT;
++#elif defined(CONFIG_ENABLE_VERIFICATION)
++ return SSL_BUILD_ENABLE_VERIFICATION;
++#elif defined(CONFIG_SSL_SERVER_ONLY )
++ return SSL_BUILD_SERVER_ONLY;
++#else
++ return SSL_BUILD_SKELETON_MODE;
++#endif
++
++ case SSL_MAX_CERT_CFG_OFFSET:
++ return CONFIG_SSL_MAX_CERTS;
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ case SSL_MAX_CA_CERT_CFG_OFFSET:
++ return CONFIG_X509_MAX_CA_CERTS;
++#endif
++#ifdef CONFIG_SSL_HAS_PEM
++ case SSL_HAS_PEM:
++ return 1;
++#endif
++ default:
++ return 0;
++ }
++}
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++/**
++ * Authenticate a received certificate.
++ */
++EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl)
++{
++ int ret;
++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
++ ret = x509_verify(ssl->ssl_ctx->ca_cert_ctx, ssl->x509_ctx);
++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
++
++ if (ret) /* modify into an SSL error type */
++ {
++ ret = SSL_X509_ERROR(ret);
++ }
++
++ return ret;
++}
++
++/**
++ * Process a certificate message.
++ */
++int process_certificate(SSL *ssl, X509_CTX **x509_ctx)
++{
++ int ret = SSL_OK;
++ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index];
++ int pkt_size = ssl->bm_index;
++ int cert_size, offset = 5;
++ int total_cert_size = (buf[offset]<<8) + buf[offset+1];
++ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
++ X509_CTX **chain = x509_ctx;
++ offset += 2;
++
++ PARANOIA_CHECK(total_cert_size, offset);
++
++ while (offset < total_cert_size)
++ {
++ offset++; /* skip empty char */
++ cert_size = (buf[offset]<<8) + buf[offset+1];
++ offset += 2;
++
++ if (x509_new(&buf[offset], NULL, chain))
++ {
++ ret = SSL_ERROR_BAD_CERTIFICATE;
++ goto error;
++ }
++
++ /* DISPLAY_CERT(ssl, *chain); */
++ chain = &((*chain)->next);
++ offset += cert_size;
++ }
++
++ PARANOIA_CHECK(pkt_size, offset);
++
++ /* if we are client we can do the verify now or later */
++ if (is_client && !IS_SET_SSL_FLAG(SSL_SERVER_VERIFY_LATER))
++ {
++ ret = ssl_verify_cert(ssl);
++ }
++
++ ssl->next_state = is_client ? HS_SERVER_HELLO_DONE : HS_CLIENT_KEY_XCHG;
++ ssl->dc->bm_proc_index += offset;
++error:
++ return ret;
++}
++
++#endif /* CONFIG_SSL_CERT_VERIFICATION */
++
++/**
++ * Debugging routine to display SSL handshaking stuff.
++ */
++#ifdef CONFIG_SSL_FULL_MODE
++/**
++ * Debugging routine to display SSL states.
++ */
++void DISPLAY_STATE(SSL *ssl, int is_send, uint8_t state, int not_ok)
++{
++ const char *str;
++
++ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_STATES))
++ return;
++
++ printf(not_ok ? "Error - invalid State:\t" : "State:\t");
++ printf(is_send ? "sending " : "receiving ");
++
++ switch (state)
++ {
++ case HS_HELLO_REQUEST:
++ str = "Hello Request (0)";
++ break;
++
++ case HS_CLIENT_HELLO:
++ str = "Client Hello (1)";
++ break;
++
++ case HS_SERVER_HELLO:
++ str = "Server Hello (2)";
++ break;
++
++ case HS_CERTIFICATE:
++ str = "Certificate (11)";
++ break;
++
++ case HS_SERVER_KEY_XCHG:
++ str = "Certificate Request (12)";
++ break;
++
++ case HS_CERT_REQ:
++ str = "Certificate Request (13)";
++ break;
++
++ case HS_SERVER_HELLO_DONE:
++ str = "Server Hello Done (14)";
++ break;
++
++ case HS_CERT_VERIFY:
++ str = "Certificate Verify (15)";
++ break;
++
++ case HS_CLIENT_KEY_XCHG:
++ str = "Client Key Exchange (16)";
++ break;
++
++ case HS_FINISHED:
++ str = "Finished (16)";
++ break;
++
++ default:
++ str = "Error (Unknown)";
++
++ break;
++ }
++
++ printf("%s\n", str);
++ TTY_FLUSH();
++}
++
++/**
++ * Debugging routine to display X509 certificates.
++ */
++void DISPLAY_CERT(SSL *ssl, const X509_CTX *x509_ctx)
++{
++ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_CERTS))
++ return;
++
++ x509_print(x509_ctx, ssl->ssl_ctx->ca_cert_ctx);
++ TTY_FLUSH();
++}
++
++/**
++ * Debugging routine to display RSA objects
++ */
++void DISPLAY_RSA(SSL *ssl, const RSA_CTX *rsa_ctx)
++{
++ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_RSA))
++ return;
++
++ RSA_print(rsa_ctx);
++ TTY_FLUSH();
++}
++
++/**
++ * Debugging routine to display SSL handshaking bytes.
++ */
++void DISPLAY_BYTES(SSL *ssl, const char *format,
++ const uint8_t *data, int size, ...)
++{
++ va_list(ap);
++
++ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_BYTES))
++ return;
++
++ va_start(ap, size);
++ print_blob(format, data, size, va_arg(ap, char *));
++ va_end(ap);
++ TTY_FLUSH();
++}
++
++/**
++ * Debugging routine to display SSL handshaking errors.
++ */
++EXP_FUNC void STDCALL ssl_display_error(int error_code)
++{
++ if (error_code == SSL_OK)
++ return;
++
++ printf("Error: ");
++
++ /* X509 error? */
++ if (error_code < SSL_X509_OFFSET)
++ {
++ printf("%s\n", x509_display_error(error_code - SSL_X509_OFFSET));
++ return;
++ }
++
++ /* SSL alert error code */
++ if (error_code > SSL_ERROR_CONN_LOST)
++ {
++ printf("SSL error %d\n", -error_code);
++ return;
++ }
++
++ switch (error_code)
++ {
++ case SSL_ERROR_DEAD:
++ printf("connection dead");
++ break;
++
++ case SSL_ERROR_INVALID_HANDSHAKE:
++ printf("invalid handshake");
++ break;
++
++ case SSL_ERROR_INVALID_PROT_MSG:
++ printf("invalid protocol message");
++ break;
++
++ case SSL_ERROR_INVALID_HMAC:
++ printf("invalid mac");
++ break;
++
++ case SSL_ERROR_INVALID_VERSION:
++ printf("invalid version");
++ break;
++
++ case SSL_ERROR_INVALID_SESSION:
++ printf("invalid session");
++ break;
++
++ case SSL_ERROR_NO_CIPHER:
++ printf("no cipher");
++ break;
++
++ case SSL_ERROR_CONN_LOST:
++ printf("connection lost");
++ break;
++
++ case SSL_ERROR_BAD_CERTIFICATE:
++ printf("bad certificate");
++ break;
++
++ case SSL_ERROR_INVALID_KEY:
++ printf("invalid key");
++ break;
++
++ case SSL_ERROR_FINISHED_INVALID:
++ printf("finished invalid");
++ break;
++
++ case SSL_ERROR_NO_CERT_DEFINED:
++ printf("no certificate defined");
++ break;
++
++ case SSL_ERROR_NOT_SUPPORTED:
++ printf("Option not supported");
++ break;
++
++ default:
++ printf("undefined as yet - %d", error_code);
++ break;
++ }
++
++ printf("\n");
++ TTY_FLUSH();
++}
++
++/**
++ * Debugging routine to display alerts.
++ */
++void DISPLAY_ALERT(SSL *ssl, int alert)
++{
++ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_STATES))
++ return;
++
++ printf("Alert: ");
++
++ switch (alert)
++ {
++ case SSL_ALERT_CLOSE_NOTIFY:
++ printf("close notify");
++ break;
++
++ case SSL_ALERT_INVALID_VERSION:
++ printf("invalid version");
++ break;
++
++ case SSL_ALERT_BAD_CERTIFICATE:
++ printf("bad certificate");
++ break;
++
++ case SSL_ALERT_UNEXPECTED_MESSAGE:
++ printf("unexpected message");
++ break;
++
++ case SSL_ALERT_BAD_RECORD_MAC:
++ printf("bad record mac");
++ break;
++
++ case SSL_ALERT_HANDSHAKE_FAILURE:
++ printf("handshake failure");
++ break;
++
++ case SSL_ALERT_ILLEGAL_PARAMETER:
++ printf("illegal parameter");
++ break;
++
++ case SSL_ALERT_DECODE_ERROR:
++ printf("decode error");
++ break;
++
++ case SSL_ALERT_DECRYPT_ERROR:
++ printf("decrypt error");
++ break;
++
++ default:
++ printf("alert - (unknown %d)", alert);
++ break;
++ }
++
++ printf("\n");
++ TTY_FLUSH();
++}
++
++#endif /* CONFIG_SSL_FULL_MODE */
++
++/**
++ * Return the version of this library.
++ */
++EXP_FUNC const char * STDCALL ssl_version()
++{
++ static const char * axtls_version = AXTLS_VERSION;
++ return axtls_version;
++}
++
++/**
++ * Enable the various language bindings to work regardless of the
++ * configuration - they just return an error statement and a bad return code.
++ */
++#if !defined(CONFIG_SSL_FULL_MODE)
++EXP_FUNC void STDCALL ssl_display_error(int error_code) {}
++#endif
++
++#ifdef CONFIG_BINDINGS
++#if !defined(CONFIG_SSL_ENABLE_CLIENT)
++EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, int client_fd, const
++ uint8_t *session_id, uint8_t sess_id_size)
++{
++ printf(unsupported_str);
++ return NULL;
++}
++#endif
++
++#if !defined(CONFIG_SSL_CERT_VERIFICATION)
++EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl)
++{
++ printf(unsupported_str);
++ return -1;
++}
++
++EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component)
++{
++ printf(unsupported_str);
++ return NULL;
++}
++
++#endif /* CONFIG_SSL_CERT_VERIFICATION */
++
++#endif /* CONFIG_BINDINGS */
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1.h
+new file mode 100755
+index 0000000..b64b4fd
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1.h
+@@ -0,0 +1,289 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * @file tls1.h
++ *
++ * @brief The definitions for the TLS library.
++ */
++#ifndef HEADER_SSL_LIB_H
++#define HEADER_SSL_LIB_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include "version.h"
++#include "crypto.h"
++#include "os_port.h"
++#include "crypto_misc.h"
++
++#define SSL_RANDOM_SIZE 32
++#define SSL_SECRET_SIZE 48
++#define SSL_FINISHED_HASH_SIZE 12
++#define SSL_RECORD_SIZE 5
++#define SSL_SERVER_READ 0
++#define SSL_SERVER_WRITE 1
++#define SSL_CLIENT_READ 2
++#define SSL_CLIENT_WRITE 3
++#define SSL_HS_HDR_SIZE 4
++
++/* the flags we use while establishing a connection */
++#define SSL_NEED_RECORD 0x0001
++#define SSL_TX_ENCRYPTED 0x0002
++#define SSL_RX_ENCRYPTED 0x0004
++#define SSL_SESSION_RESUME 0x0008
++#define SSL_IS_CLIENT 0x0010
++#define SSL_HAS_CERT_REQ 0x0020
++
++/* some macros to muck around with flag bits */
++#define SET_SSL_FLAG(A) (ssl->flag |= A)
++#define CLR_SSL_FLAG(A) (ssl->flag &= ~A)
++#define IS_SET_SSL_FLAG(A) (ssl->flag & A)
++
++#define MAX_KEY_BYTE_SIZE 512 /* for a 4096 bit key */
++#define RT_MAX_PLAIN_LENGTH 16384
++#define RT_EXTRA 1024
++#define BM_RECORD_OFFSET 5
++
++#ifdef CONFIG_SSL_SKELETON_MODE
++#define NUM_PROTOCOLS 1
++#else
++#define NUM_PROTOCOLS 4
++#endif
++
++#define PARANOIA_CHECK(A, B) if (A < B) { \
++ ret = SSL_ERROR_INVALID_HANDSHAKE; goto error; }
++
++/* protocol types */
++enum
++{
++ PT_CHANGE_CIPHER_SPEC = 20,
++ PT_ALERT_PROTOCOL,
++ PT_HANDSHAKE_PROTOCOL,
++ PT_APP_PROTOCOL_DATA
++};
++
++/* handshaking types */
++enum
++{
++ HS_HELLO_REQUEST,
++ HS_CLIENT_HELLO,
++ HS_SERVER_HELLO,
++ HS_CERTIFICATE = 11,
++ HS_SERVER_KEY_XCHG,
++ HS_CERT_REQ,
++ HS_SERVER_HELLO_DONE,
++ HS_CERT_VERIFY,
++ HS_CLIENT_KEY_XCHG,
++ HS_FINISHED = 20
++};
++
++typedef struct
++{
++ uint8_t cipher;
++ uint8_t key_size;
++ uint8_t iv_size;
++ uint8_t key_block_size;
++ uint8_t padding_size;
++ uint8_t digest_size;
++ hmac_func hmac;
++ crypt_func encrypt;
++ crypt_func decrypt;
++} cipher_info_t;
++
++struct _SSLObjLoader
++{
++ uint8_t *buf;
++ int len;
++};
++
++typedef struct _SSLObjLoader SSLObjLoader;
++
++typedef struct
++{
++ time_t conn_time;
++ uint8_t session_id[SSL_SESSION_ID_SIZE];
++ uint8_t master_secret[SSL_SECRET_SIZE];
++} SSL_SESSION;
++
++typedef struct
++{
++ uint8_t *buf;
++ int size;
++} SSL_CERT;
++
++typedef struct
++{
++ MD5_CTX md5_ctx;
++ SHA1_CTX sha1_ctx;
++ uint8_t final_finish_mac[SSL_FINISHED_HASH_SIZE];
++ uint8_t *key_block;
++ uint8_t master_secret[SSL_SECRET_SIZE];
++ uint8_t client_random[SSL_RANDOM_SIZE]; /* client's random sequence */
++ uint8_t server_random[SSL_RANDOM_SIZE]; /* server's random sequence */
++ uint16_t bm_proc_index;
++} DISPOSABLE_CTX;
++
++struct _SSL
++{
++ uint32_t flag;
++ uint16_t need_bytes;
++ uint16_t got_bytes;
++ uint8_t record_type;
++ uint8_t cipher;
++ uint8_t sess_id_size;
++ int16_t next_state;
++ int16_t hs_status;
++ DISPOSABLE_CTX *dc; /* temporary data which we'll get rid of soon */
++ int client_fd;
++ const cipher_info_t *cipher_info;
++ void *encrypt_ctx;
++ void *decrypt_ctx;
++ uint8_t bm_all_data[RT_MAX_PLAIN_LENGTH+RT_EXTRA];
++ uint8_t *bm_data;
++ uint16_t bm_index;
++ uint16_t bm_read_index;
++ struct _SSL *next; /* doubly linked list */
++ struct _SSL *prev;
++ struct _SSL_CTX *ssl_ctx; /* back reference to a clnt/svr ctx */
++#ifndef CONFIG_SSL_SKELETON_MODE
++ uint16_t session_index;
++ SSL_SESSION *session;
++#endif
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ X509_CTX *x509_ctx;
++#endif
++
++ uint8_t session_id[SSL_SESSION_ID_SIZE];
++ uint8_t client_mac[SHA1_SIZE]; /* for HMAC verification */
++ uint8_t server_mac[SHA1_SIZE]; /* for HMAC verification */
++ uint8_t read_sequence[8]; /* 64 bit sequence number */
++ uint8_t write_sequence[8]; /* 64 bit sequence number */
++ uint8_t hmac_header[SSL_RECORD_SIZE]; /* rx hmac */
++};
++
++typedef struct _SSL SSL;
++
++struct _SSL_CTX
++{
++ uint32_t options;
++ uint8_t chain_length;
++ RSA_CTX *rsa_ctx;
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ CA_CERT_CTX *ca_cert_ctx;
++#endif
++ SSL *head;
++ SSL *tail;
++ SSL_CERT certs[CONFIG_SSL_MAX_CERTS];
++#ifndef CONFIG_SSL_SKELETON_MODE
++ uint16_t num_sessions;
++ SSL_SESSION **ssl_sessions;
++#endif
++#ifdef CONFIG_SSL_CTX_MUTEXING
++ SSL_CTX_MUTEX_TYPE mutex;
++#endif
++#ifdef CONFIG_OPENSSL_COMPATIBLE
++ void *bonus_attr;
++#endif
++};
++
++typedef struct _SSL_CTX SSL_CTX;
++
++/* backwards compatibility */
++typedef struct _SSL_CTX SSLCTX;
++
++extern const uint8_t ssl_prot_prefs[NUM_PROTOCOLS];
++
++SSL *ssl_new(SSL_CTX *ssl_ctx, int client_fd);
++void disposable_new(SSL *ssl);
++void disposable_free(SSL *ssl);
++int send_packet(SSL *ssl, uint8_t protocol,
++ const uint8_t *in, int length);
++int do_svr_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len);
++int do_clnt_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len);
++int process_finished(SSL *ssl, int hs_len);
++int process_sslv23_client_hello(SSL *ssl);
++int send_alert(SSL *ssl, int error_code);
++int send_finished(SSL *ssl);
++int send_certificate(SSL *ssl);
++int basic_read(SSL *ssl, uint8_t **in_data);
++int send_change_cipher_spec(SSL *ssl);
++void finished_digest(SSL *ssl, const char *label, uint8_t *digest);
++void generate_master_secret(SSL *ssl, const uint8_t *premaster_secret);
++void add_packet(SSL *ssl, const uint8_t *pkt, int len);
++int add_cert(SSL_CTX *ssl_ctx, const uint8_t *buf, int len);
++int add_private_key(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj);
++void ssl_obj_free(SSLObjLoader *ssl_obj);
++int pkcs8_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password);
++int pkcs12_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password);
++int load_key_certs(SSL_CTX *ssl_ctx);
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++int add_cert_auth(SSL_CTX *ssl_ctx, const uint8_t *buf, int len);
++void remove_ca_certs(CA_CERT_CTX *ca_cert_ctx);
++#endif
++#ifdef CONFIG_SSL_ENABLE_CLIENT
++int do_client_connect(SSL *ssl);
++#endif
++
++#ifdef CONFIG_SSL_FULL_MODE
++void DISPLAY_STATE(SSL *ssl, int is_send, uint8_t state, int not_ok);
++void DISPLAY_BYTES(SSL *ssl, const char *format,
++ const uint8_t *data, int size, ...);
++void DISPLAY_CERT(SSL *ssl, const X509_CTX *x509_ctx);
++void DISPLAY_RSA(SSL *ssl, const RSA_CTX *rsa_ctx);
++void DISPLAY_ALERT(SSL *ssl, int alert);
++#else
++#define DISPLAY_STATE(A,B,C,D)
++#define DISPLAY_CERT(A,B)
++#define DISPLAY_RSA(A,B)
++#define DISPLAY_ALERT(A, B)
++#ifdef WIN32
++void DISPLAY_BYTES(SSL *ssl, const char *format,/* win32 has no variadic macros */
++ const uint8_t *data, int size, ...);
++#else
++#define DISPLAY_BYTES(A,B,C,D,...)
++#endif
++#endif
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++int process_certificate(SSL *ssl, X509_CTX **x509_ctx);
++#endif
++
++SSL_SESSION *ssl_session_update(int max_sessions,
++ SSL_SESSION *ssl_sessions[], SSL *ssl,
++ const uint8_t *session_id);
++void kill_ssl_session(SSL_SESSION **ssl_sessions, SSL *ssl);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_clnt.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_clnt.c
+new file mode 100644
+index 0000000..9131433
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_clnt.c
+@@ -0,0 +1,386 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include <stdlib.h>
++#include <string.h>
++#include <time.h>
++#include <stdio.h>
++
++#include "ssl.h"
++
++#ifdef CONFIG_SSL_ENABLE_CLIENT /* all commented out if no client */
++
++static int send_client_hello(SSL *ssl);
++static int process_server_hello(SSL *ssl);
++static int process_server_hello_done(SSL *ssl);
++static int send_client_key_xchg(SSL *ssl);
++static int process_cert_req(SSL *ssl);
++static int send_cert_verify(SSL *ssl);
++
++/*
++ * Establish a new SSL connection to an SSL server.
++ */
++EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, int client_fd, const
++ uint8_t *session_id, uint8_t sess_id_size)
++{
++ SSL *ssl;
++ int ret;
++
++ SOCKET_BLOCK(client_fd); /* ensure blocking mode */
++ ssl = ssl_new(ssl_ctx, client_fd);
++
++ if (session_id && ssl_ctx->num_sessions)
++ {
++ if (sess_id_size > SSL_SESSION_ID_SIZE) /* validity check */
++ {
++ ssl_free(ssl);
++ return NULL;
++ }
++
++ memcpy(ssl->session_id, session_id, sess_id_size);
++ ssl->sess_id_size = sess_id_size;
++ SET_SSL_FLAG(SSL_SESSION_RESUME); /* just flag for later */
++ }
++
++ SET_SSL_FLAG(SSL_IS_CLIENT);
++ ret = do_client_connect(ssl);
++ return ssl;
++}
++
++/*
++ * Process the handshake record.
++ */
++int do_clnt_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len)
++{
++ int ret = SSL_OK;
++
++ /* To get here the state must be valid */
++ switch (handshake_type)
++ {
++ case HS_SERVER_HELLO:
++ ret = process_server_hello(ssl);
++ break;
++
++ case HS_CERTIFICATE:
++ ret = process_certificate(ssl, &ssl->x509_ctx);
++ break;
++
++ case HS_SERVER_HELLO_DONE:
++ if ((ret = process_server_hello_done(ssl)) == SSL_OK)
++ {
++ if (IS_SET_SSL_FLAG(SSL_HAS_CERT_REQ))
++ {
++ if ((ret = send_certificate(ssl)) == SSL_OK &&
++ (ret = send_client_key_xchg(ssl)) == SSL_OK)
++ {
++ send_cert_verify(ssl);
++ }
++ }
++ else
++ {
++ ret = send_client_key_xchg(ssl);
++ }
++
++ if (ret == SSL_OK &&
++ (ret = send_change_cipher_spec(ssl)) == SSL_OK)
++ {
++ ret = send_finished(ssl);
++ }
++ }
++ break;
++
++ case HS_CERT_REQ:
++ ret = process_cert_req(ssl);
++ break;
++
++ case HS_FINISHED:
++ ret = process_finished(ssl, hs_len);
++ disposable_free(ssl); /* free up some memory */
++ break;
++
++ case HS_HELLO_REQUEST:
++ disposable_new(ssl);
++ ret = do_client_connect(ssl);
++ break;
++ }
++
++ return ret;
++}
++
++/*
++ * Do the handshaking from the beginning.
++ */
++int do_client_connect(SSL *ssl)
++{
++ int ret = SSL_OK;
++
++ send_client_hello(ssl); /* send the client hello */
++ ssl->bm_read_index = 0;
++ ssl->next_state = HS_SERVER_HELLO;
++ ssl->hs_status = SSL_NOT_OK; /* not connected */
++ x509_free(ssl->x509_ctx);
++
++ /* sit in a loop until it all looks good */
++ while (ssl->hs_status != SSL_OK)
++ {
++ ret = basic_read(ssl, NULL);
++
++ if (ret < SSL_OK)
++ {
++ if (ret != SSL_ERROR_CONN_LOST)
++ {
++ /* let the server know we are dying and why */
++ if (send_alert(ssl, ret))
++ {
++ /* something nasty happened, so get rid of it */
++ kill_ssl_session(ssl->ssl_ctx->ssl_sessions, ssl);
++ }
++ }
++
++ break;
++ }
++ }
++
++ ssl->hs_status = ret; /* connected? */
++ return ret;
++}
++
++/*
++ * Send the initial client hello.
++ */
++static int send_client_hello(SSL *ssl)
++{
++ uint8_t *buf = ssl->bm_data;
++ time_t tm = time(NULL);
++ uint8_t *tm_ptr = &buf[6]; /* time will go here */
++ int i, offset;
++
++ buf[0] = HS_CLIENT_HELLO;
++ buf[1] = 0;
++ buf[2] = 0;
++ /* byte 3 is calculated later */
++ buf[4] = 0x03;
++ buf[5] = 0x01;
++
++ /* client random value - spec says that 1st 4 bytes are big endian time */
++ *tm_ptr++ = (uint8_t)(((long)tm & 0xff000000) >> 24);
++ *tm_ptr++ = (uint8_t)(((long)tm & 0x00ff0000) >> 16);
++ *tm_ptr++ = (uint8_t)(((long)tm & 0x0000ff00) >> 8);
++ *tm_ptr++ = (uint8_t)(((long)tm & 0x000000ff));
++ get_random(SSL_RANDOM_SIZE-4, &buf[10]);
++ memcpy(ssl->dc->client_random, &buf[6], SSL_RANDOM_SIZE);
++ offset = 6 + SSL_RANDOM_SIZE;
++
++ /* give session resumption a go */
++ if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME)) /* set initially by user */
++ {
++ buf[offset++] = ssl->sess_id_size;
++ memcpy(&buf[offset], ssl->session_id, ssl->sess_id_size);
++ offset += ssl->sess_id_size;
++ CLR_SSL_FLAG(SSL_SESSION_RESUME); /* clear so we can set later */
++ }
++ else
++ {
++ /* no session id - because no session resumption just yet */
++ buf[offset++] = 0;
++ }
++
++ buf[offset++] = 0; /* number of ciphers */
++ buf[offset++] = NUM_PROTOCOLS*2;/* number of ciphers */
++
++ /* put all our supported protocols in our request */
++ for (i = 0; i < NUM_PROTOCOLS; i++)
++ {
++ buf[offset++] = 0; /* cipher we are using */
++ buf[offset++] = ssl_prot_prefs[i];
++ }
++
++ buf[offset++] = 1; /* no compression */
++ buf[offset++] = 0;
++ buf[3] = offset - 4; /* handshake size */
++
++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset);
++}
++
++/*
++ * Process the server hello.
++ */
++static int process_server_hello(SSL *ssl)
++{
++ uint8_t *buf = ssl->bm_data;
++ int pkt_size = ssl->bm_index;
++ int version = (buf[4] << 4) + buf[5];
++ int num_sessions = ssl->ssl_ctx->num_sessions;
++ uint8_t sess_id_size;
++ int offset, ret = SSL_OK;
++
++ /* check that we are talking to a TLSv1 server */
++ if (version != 0x31)
++ return SSL_ERROR_INVALID_VERSION;
++
++ /* get the server random value */
++ memcpy(ssl->dc->server_random, &buf[6], SSL_RANDOM_SIZE);
++ offset = 6 + SSL_RANDOM_SIZE; /* skip of session id size */
++ sess_id_size = buf[offset++];
++
++ if (num_sessions)
++ {
++ ssl->session = ssl_session_update(num_sessions,
++ ssl->ssl_ctx->ssl_sessions, ssl, &buf[offset]);
++ memcpy(ssl->session->session_id, &buf[offset], sess_id_size);
++
++ /* pad the rest with 0's */
++ if (sess_id_size < SSL_SESSION_ID_SIZE)
++ {
++ memset(&ssl->session->session_id[sess_id_size], 0,
++ SSL_SESSION_ID_SIZE-sess_id_size);
++ }
++ }
++
++ memcpy(ssl->session_id, &buf[offset], sess_id_size);
++ ssl->sess_id_size = sess_id_size;
++ offset += sess_id_size;
++
++ /* get the real cipher we are using */
++ ssl->cipher = buf[++offset];
++ ssl->next_state = IS_SET_SSL_FLAG(SSL_SESSION_RESUME) ?
++ HS_FINISHED : HS_CERTIFICATE;
++
++ offset++; // skip the compr
++ PARANOIA_CHECK(pkt_size, offset);
++ ssl->dc->bm_proc_index = offset+1;
++
++error:
++ return ret;
++}
++
++/**
++ * Process the server hello done message.
++ */
++static int process_server_hello_done(SSL *ssl)
++{
++ ssl->next_state = HS_FINISHED;
++ return SSL_OK;
++}
++
++/*
++ * Send a client key exchange message.
++ */
++static int send_client_key_xchg(SSL *ssl)
++{
++ uint8_t *buf = ssl->bm_data;
++ uint8_t premaster_secret[SSL_SECRET_SIZE];
++ int enc_secret_size = -1;
++
++ buf[0] = HS_CLIENT_KEY_XCHG;
++ buf[1] = 0;
++
++ premaster_secret[0] = 0x03; /* encode the version number */
++ premaster_secret[1] = 0x01;
++ get_random(SSL_SECRET_SIZE-2, &premaster_secret[2]);
++ DISPLAY_RSA(ssl, ssl->x509_ctx->rsa_ctx);
++
++ /* rsa_ctx->bi_ctx is not thread-safe */
++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
++ enc_secret_size = RSA_encrypt(ssl->x509_ctx->rsa_ctx, premaster_secret,
++ SSL_SECRET_SIZE, &buf[6], 0);
++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
++
++ buf[2] = (enc_secret_size + 2) >> 8;
++ buf[3] = (enc_secret_size + 2) & 0xff;
++ buf[4] = enc_secret_size >> 8;
++ buf[5] = enc_secret_size & 0xff;
++
++ generate_master_secret(ssl, premaster_secret);
++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, enc_secret_size+6);
++}
++
++/*
++ * Process the certificate request.
++ */
++static int process_cert_req(SSL *ssl)
++{
++ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index];
++ int ret = SSL_OK;
++ int offset = (buf[2] << 4) + buf[3];
++ int pkt_size = ssl->bm_index;
++
++ /* don't do any processing - we will send back an RSA certificate anyway */
++ ssl->next_state = HS_SERVER_HELLO_DONE;
++ SET_SSL_FLAG(SSL_HAS_CERT_REQ);
++ ssl->dc->bm_proc_index += offset;
++ PARANOIA_CHECK(pkt_size, offset);
++error:
++ return ret;
++}
++
++/*
++ * Send a certificate verify message.
++ */
++static int send_cert_verify(SSL *ssl)
++{
++ uint8_t *buf = ssl->bm_data;
++ uint8_t dgst[MD5_SIZE+SHA1_SIZE];
++ RSA_CTX *rsa_ctx = ssl->ssl_ctx->rsa_ctx;
++ int n = 0, ret;
++
++ DISPLAY_RSA(ssl, rsa_ctx);
++
++ buf[0] = HS_CERT_VERIFY;
++ buf[1] = 0;
++
++ finished_digest(ssl, NULL, dgst); /* calculate the digest */
++
++ /* rsa_ctx->bi_ctx is not thread-safe */
++ if (rsa_ctx)
++ {
++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
++ n = RSA_encrypt(rsa_ctx, dgst, sizeof(dgst), &buf[6], 1);
++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
++
++ if (n == 0)
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto error;
++ }
++ }
++
++ buf[4] = n >> 8; /* add the RSA size (not officially documented) */
++ buf[5] = n & 0xff;
++ n += 2;
++ buf[2] = n >> 8;
++ buf[3] = n & 0xff;
++ ret = send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, n+4);
++
++error:
++ return ret;
++}
++
++#endif /* CONFIG_SSL_ENABLE_CLIENT */
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_svr.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_svr.c
+new file mode 100644
+index 0000000..45b9bec
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_svr.c
+@@ -0,0 +1,476 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++
++#include "ssl.h"
++
++static const uint8_t g_hello_done[] = { HS_SERVER_HELLO_DONE, 0, 0, 0 };
++
++static int process_client_hello(SSL *ssl);
++static int send_server_hello_sequence(SSL *ssl);
++static int send_server_hello(SSL *ssl);
++static int send_server_hello_done(SSL *ssl);
++static int process_client_key_xchg(SSL *ssl);
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++static int send_certificate_request(SSL *ssl);
++static int process_cert_verify(SSL *ssl);
++#endif
++
++/*
++ * Establish a new SSL connection to an SSL client.
++ */
++EXP_FUNC SSL * STDCALL ssl_server_new(SSL_CTX *ssl_ctx, int client_fd)
++{
++ SSL *ssl;
++
++ ssl = ssl_new(ssl_ctx, client_fd);
++ ssl->next_state = HS_CLIENT_HELLO;
++
++#ifdef CONFIG_SSL_FULL_MODE
++ if (ssl_ctx->chain_length == 0)
++ printf("Warning - no server certificate defined\n"); TTY_FLUSH();
++#endif
++
++ return ssl;
++}
++
++/*
++ * Process the handshake record.
++ */
++int do_svr_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len)
++{
++ int ret = SSL_OK;
++ ssl->hs_status = SSL_NOT_OK; /* not connected */
++
++ /* To get here the state must be valid */
++ switch (handshake_type)
++ {
++ case HS_CLIENT_HELLO:
++ if ((ret = process_client_hello(ssl)) == SSL_OK)
++ ret = send_server_hello_sequence(ssl);
++ break;
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ case HS_CERTIFICATE:/* the client sends its cert */
++ ret = process_certificate(ssl, &ssl->x509_ctx);
++
++ if (ret == SSL_OK) /* verify the cert */
++ {
++ int cert_res;
++ cert_res = x509_verify(
++ ssl->ssl_ctx->ca_cert_ctx, ssl->x509_ctx);
++ ret = (cert_res == 0) ? SSL_OK : SSL_X509_ERROR(cert_res);
++ }
++ break;
++
++ case HS_CERT_VERIFY:
++ ret = process_cert_verify(ssl);
++ add_packet(ssl, buf, hs_len); /* needs to be done after */
++ break;
++#endif
++ case HS_CLIENT_KEY_XCHG:
++ ret = process_client_key_xchg(ssl);
++ break;
++
++ case HS_FINISHED:
++ ret = process_finished(ssl, hs_len);
++ disposable_free(ssl); /* free up some memory */
++ break;
++ }
++
++ return ret;
++}
++
++/*
++ * Process a client hello message.
++ */
++static int process_client_hello(SSL *ssl)
++{
++ uint8_t *buf = ssl->bm_data;
++ uint8_t *record_buf = ssl->hmac_header;
++ int pkt_size = ssl->bm_index;
++ int i, j, cs_len, id_len, offset = 6 + SSL_RANDOM_SIZE;
++ int version = (record_buf[1] << 4) + record_buf[2];
++ int ret = SSL_OK;
++
++ /* should be v3.1 (TLSv1) or better - we'll send in v3.1 mode anyway */
++ if (version < 0x31)
++ {
++ ret = SSL_ERROR_INVALID_VERSION;
++ ssl_display_error(ret);
++ goto error;
++ }
++
++ memcpy(ssl->dc->client_random, &buf[6], SSL_RANDOM_SIZE);
++
++ /* process the session id */
++ id_len = buf[offset++];
++ if (id_len > SSL_SESSION_ID_SIZE)
++ {
++ return SSL_ERROR_INVALID_SESSION;
++ }
++
++#ifndef CONFIG_SSL_SKELETON_MODE
++ ssl->session = ssl_session_update(ssl->ssl_ctx->num_sessions,
++ ssl->ssl_ctx->ssl_sessions, ssl, id_len ? &buf[offset] : NULL);
++#endif
++
++ offset += id_len;
++ cs_len = (buf[offset]<<8) + buf[offset+1];
++ offset += 3; /* add 1 due to all cipher suites being 8 bit */
++
++ PARANOIA_CHECK(pkt_size, offset);
++
++ /* work out what cipher suite we are going to use */
++ for (j = 0; j < NUM_PROTOCOLS; j++)
++ {
++ for (i = 0; i < cs_len; i += 2)
++ {
++ if (ssl_prot_prefs[j] == buf[offset+i]) /* got a match? */
++ {
++ ssl->cipher = ssl_prot_prefs[j];
++ goto do_state;
++ }
++ }
++ }
++
++ /* ouch! protocol is not supported */
++ ret = SSL_ERROR_NO_CIPHER;
++
++do_state:
++error:
++ return ret;
++}
++
++#ifdef CONFIG_SSL_ENABLE_V23_HANDSHAKE
++/*
++ * Some browsers use a hybrid SSLv2 "client hello"
++ */
++int process_sslv23_client_hello(SSL *ssl)
++{
++ uint8_t *buf = ssl->bm_data;
++ int bytes_needed = ((buf[0] & 0x7f) << 8) + buf[1];
++ int version = (buf[3] << 4) + buf[4];
++ int ret = SSL_OK;
++
++ /* we have already read 3 extra bytes so far */
++ int read_len = SOCKET_READ(ssl->client_fd, buf, bytes_needed-3);
++ int cs_len = buf[1];
++ int id_len = buf[3];
++ int ch_len = buf[5];
++ int i, j, offset = 8; /* start at first cipher */
++ int random_offset = 0;
++
++ DISPLAY_BYTES(ssl, "received %d bytes", buf, read_len, read_len);
++
++ /* should be v3.1 (TLSv1) or better - we'll send in v3.1 mode anyway */
++ if (version < 0x31)
++ {
++ return SSL_ERROR_INVALID_VERSION;
++ }
++
++ add_packet(ssl, buf, read_len);
++
++ /* connection has gone, so die */
++ if (bytes_needed < 0)
++ {
++ return SSL_ERROR_CONN_LOST;
++ }
++
++ /* now work out what cipher suite we are going to use */
++ for (j = 0; j < NUM_PROTOCOLS; j++)
++ {
++ for (i = 0; i < cs_len; i += 3)
++ {
++ if (ssl_prot_prefs[j] == buf[offset+i])
++ {
++ ssl->cipher = ssl_prot_prefs[j];
++ goto server_hello;
++ }
++ }
++ }
++
++ /* ouch! protocol is not supported */
++ ret = SSL_ERROR_NO_CIPHER;
++ goto error;
++
++server_hello:
++ /* get the session id */
++ offset += cs_len - 2; /* we've gone 2 bytes past the end */
++#ifndef CONFIG_SSL_SKELETON_MODE
++ ssl->session = ssl_session_update(ssl->ssl_ctx->num_sessions,
++ ssl->ssl_ctx->ssl_sessions, ssl, id_len ? &buf[offset] : NULL);
++#endif
++
++ /* get the client random data */
++ offset += id_len;
++
++ /* random can be anywhere between 16 and 32 bytes long - so it is padded
++ * with 0's to the left */
++ if (ch_len == 0x10)
++ {
++ random_offset += 0x10;
++ }
++
++ memcpy(&ssl->dc->client_random[random_offset], &buf[offset], ch_len);
++ ret = send_server_hello_sequence(ssl);
++
++error:
++ return ret;
++}
++#endif
++
++/*
++ * Send the entire server hello sequence
++ */
++static int send_server_hello_sequence(SSL *ssl)
++{
++ int ret;
++
++ if ((ret = send_server_hello(ssl)) == SSL_OK)
++ {
++#ifndef CONFIG_SSL_SKELETON_MODE
++ /* resume handshake? */
++ if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME))
++ {
++ if ((ret = send_change_cipher_spec(ssl)) == SSL_OK)
++ {
++ ret = send_finished(ssl);
++ ssl->next_state = HS_FINISHED;
++ }
++ }
++ else
++#endif
++ if ((ret = send_certificate(ssl)) == SSL_OK)
++ {
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ /* ask the client for its certificate */
++ if (IS_SET_SSL_FLAG(SSL_CLIENT_AUTHENTICATION))
++ {
++ if ((ret = send_certificate_request(ssl)) == SSL_OK)
++ {
++ ret = send_server_hello_done(ssl);
++ ssl->next_state = HS_CERTIFICATE;
++ }
++ }
++ else
++#endif
++ {
++ ret = send_server_hello_done(ssl);
++ ssl->next_state = HS_CLIENT_KEY_XCHG;
++ }
++ }
++ }
++
++ return ret;
++}
++
++/*
++ * Send a server hello message.
++ */
++static int send_server_hello(SSL *ssl)
++{
++ uint8_t *buf = ssl->bm_data;
++ int offset = 0;
++
++ buf[0] = HS_SERVER_HELLO;
++ buf[1] = 0;
++ buf[2] = 0;
++ /* byte 3 is calculated later */
++ buf[4] = 0x03;
++ buf[5] = 0x01;
++
++ /* server random value */
++ get_random(SSL_RANDOM_SIZE, &buf[6]);
++ memcpy(ssl->dc->server_random, &buf[6], SSL_RANDOM_SIZE);
++ offset = 6 + SSL_RANDOM_SIZE;
++
++#ifndef CONFIG_SSL_SKELETON_MODE
++ if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME))
++ {
++ /* retrieve id from session cache */
++ buf[offset++] = SSL_SESSION_ID_SIZE;
++ memcpy(&buf[offset], ssl->session->session_id, SSL_SESSION_ID_SIZE);
++ memcpy(ssl->session_id, ssl->session->session_id, SSL_SESSION_ID_SIZE);
++ ssl->sess_id_size = SSL_SESSION_ID_SIZE;
++ offset += SSL_SESSION_ID_SIZE;
++ }
++ else /* generate our own session id */
++#endif
++ {
++#ifndef CONFIG_SSL_SKELETON_MODE
++ buf[offset++] = SSL_SESSION_ID_SIZE;
++ get_random(SSL_SESSION_ID_SIZE, &buf[offset]);
++ memcpy(ssl->session_id, &buf[offset], SSL_SESSION_ID_SIZE);
++ ssl->sess_id_size = SSL_SESSION_ID_SIZE;
++
++ /* store id in session cache */
++ if (ssl->ssl_ctx->num_sessions)
++ {
++ memcpy(ssl->session->session_id,
++ ssl->session_id, SSL_SESSION_ID_SIZE);
++ }
++
++ offset += SSL_SESSION_ID_SIZE;
++#else
++ buf[offset++] = 0; /* don't bother with session id in skelton mode */
++#endif
++ }
++
++ buf[offset++] = 0; /* cipher we are using */
++ buf[offset++] = ssl->cipher;
++ buf[offset++] = 0; /* no compression */
++ buf[3] = offset - 4; /* handshake size */
++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset);
++}
++
++/*
++ * Send the server hello done message.
++ */
++static int send_server_hello_done(SSL *ssl)
++{
++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL,
++ g_hello_done, sizeof(g_hello_done));
++}
++
++/*
++ * Pull apart a client key exchange message. Decrypt the pre-master key (using
++ * our RSA private key) and then work out the master key. Initialise the
++ * ciphers.
++ */
++static int process_client_key_xchg(SSL *ssl)
++{
++ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index];
++ int pkt_size = ssl->bm_index;
++ int premaster_size, secret_length = (buf[2] << 8) + buf[3];
++ uint8_t premaster_secret[MAX_KEY_BYTE_SIZE];
++ RSA_CTX *rsa_ctx = ssl->ssl_ctx->rsa_ctx;
++ int offset = 4;
++ int ret = SSL_OK;
++
++ if (rsa_ctx == NULL)
++ {
++ ret = SSL_ERROR_NO_CERT_DEFINED;
++ goto error;
++ }
++
++ /* is there an extra size field? */
++ if ((secret_length - 2) == rsa_ctx->num_octets)
++ offset += 2;
++
++ PARANOIA_CHECK(pkt_size, rsa_ctx->num_octets+offset);
++
++ /* rsa_ctx->bi_ctx is not thread-safe */
++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
++ premaster_size = RSA_decrypt(rsa_ctx, &buf[offset], premaster_secret, 1);
++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
++
++ if (premaster_size != SSL_SECRET_SIZE ||
++ premaster_secret[0] != 0x03 || /* check version is 3.1 (TLS) */
++ premaster_secret[1] != 0x01)
++ {
++ /* guard against a Bleichenbacher attack */
++ memset(premaster_secret, 0, SSL_SECRET_SIZE);
++ /* and continue - will die eventually when checking the mac */
++ }
++
++#if 0
++ print_blob("pre-master", premaster_secret, SSL_SECRET_SIZE);
++#endif
++
++ generate_master_secret(ssl, premaster_secret);
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ ssl->next_state = IS_SET_SSL_FLAG(SSL_CLIENT_AUTHENTICATION) ?
++ HS_CERT_VERIFY : HS_FINISHED;
++#else
++ ssl->next_state = HS_FINISHED;
++#endif
++error:
++ ssl->dc->bm_proc_index += rsa_ctx->num_octets+offset;
++ return ret;
++}
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++static const uint8_t g_cert_request[] = { HS_CERT_REQ, 0, 0, 4, 1, 0, 0, 0 };
++
++/*
++ * Send the certificate request message.
++ */
++static int send_certificate_request(SSL *ssl)
++{
++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL,
++ g_cert_request, sizeof(g_cert_request));
++}
++
++/*
++ * Ensure the client has the private key by first decrypting the packet and
++ * then checking the packet digests.
++ */
++static int process_cert_verify(SSL *ssl)
++{
++ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index];
++ int pkt_size = ssl->bm_index;
++ uint8_t dgst_buf[MAX_KEY_BYTE_SIZE];
++ uint8_t dgst[MD5_SIZE+SHA1_SIZE];
++ X509_CTX *x509_ctx = ssl->x509_ctx;
++ int ret = SSL_OK;
++ int n;
++
++ PARANOIA_CHECK(pkt_size, x509_ctx->rsa_ctx->num_octets+6);
++ DISPLAY_RSA(ssl, x509_ctx->rsa_ctx);
++
++ /* rsa_ctx->bi_ctx is not thread-safe */
++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
++ n = RSA_decrypt(x509_ctx->rsa_ctx, &buf[6], dgst_buf, 0);
++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
++
++ if (n != SHA1_SIZE + MD5_SIZE)
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ goto end_cert_vfy;
++ }
++
++ finished_digest(ssl, NULL, dgst); /* calculate the digest */
++ if (memcmp(dgst_buf, dgst, MD5_SIZE + SHA1_SIZE))
++ {
++ ret = SSL_ERROR_INVALID_KEY;
++ }
++
++end_cert_vfy:
++ ssl->next_state = HS_FINISHED;
++error:
++ return ret;
++}
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/version.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/version.h
+new file mode 100644
+index 0000000..72260bf
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/version.h
+@@ -0,0 +1 @@
++#define AXTLS_VERSION "1.2.1"
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/x509.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/x509.c
+new file mode 100644
+index 0000000..37db7f4
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/x509.c
+@@ -0,0 +1,502 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/**
++ * @file x509.c
++ *
++ * Certificate processing.
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <time.h>
++#include "os_port.h"
++#include "crypto_misc.h"
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++/**
++ * Retrieve the signature from a certificate.
++ */
++static const uint8_t *get_signature(const uint8_t *asn1_sig, int *len)
++{
++ int offset = 0;
++ const uint8_t *ptr = NULL;
++
++ if (asn1_next_obj(asn1_sig, &offset, ASN1_SEQUENCE) < 0 ||
++ asn1_skip_obj(asn1_sig, &offset, ASN1_SEQUENCE))
++ goto end_get_sig;
++
++ if (asn1_sig[offset++] != ASN1_OCTET_STRING)
++ goto end_get_sig;
++ *len = get_asn1_length(asn1_sig, &offset);
++ ptr = &asn1_sig[offset]; /* all ok */
++
++end_get_sig:
++ return ptr;
++}
++
++#endif
++
++/**
++ * Construct a new x509 object.
++ * @return 0 if ok. < 0 if there was a problem.
++ */
++int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx)
++{
++ int begin_tbs, end_tbs;
++ int ret = X509_NOT_OK, offset = 0, cert_size = 0;
++ X509_CTX *x509_ctx;
++ BI_CTX *bi_ctx;
++
++ *ctx = (X509_CTX *)calloc(1, sizeof(X509_CTX));
++ x509_ctx = *ctx;
++
++ /* get the certificate size */
++ asn1_skip_obj(cert, &cert_size, ASN1_SEQUENCE);
++
++ if (asn1_next_obj(cert, &offset, ASN1_SEQUENCE) < 0)
++ goto end_cert;
++
++ begin_tbs = offset; /* start of the tbs */
++ end_tbs = begin_tbs; /* work out the end of the tbs */
++ asn1_skip_obj(cert, &end_tbs, ASN1_SEQUENCE);
++
++ if (asn1_next_obj(cert, &offset, ASN1_SEQUENCE) < 0)
++ goto end_cert;
++
++ if (cert[offset] == ASN1_EXPLICIT_TAG) /* optional version */
++ {
++ if (asn1_version(cert, &offset, x509_ctx))
++ goto end_cert;
++ }
++
++ if (asn1_skip_obj(cert, &offset, ASN1_INTEGER) || /* serial number */
++ asn1_next_obj(cert, &offset, ASN1_SEQUENCE) < 0)
++ goto end_cert;
++
++ /* make sure the signature is ok */
++ if (asn1_signature_type(cert, &offset, x509_ctx))
++ {
++ ret = X509_VFY_ERROR_UNSUPPORTED_DIGEST;
++ goto end_cert;
++ }
++
++ if (asn1_name(cert, &offset, x509_ctx->ca_cert_dn) ||
++ asn1_validity(cert, &offset, x509_ctx) ||
++ asn1_name(cert, &offset, x509_ctx->cert_dn) ||
++ asn1_public_key(cert, &offset, x509_ctx))
++ goto end_cert;
++
++ bi_ctx = x509_ctx->rsa_ctx->bi_ctx;
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION /* only care if doing verification */
++ /* use the appropriate signature algorithm (SHA1/MD5/MD2) */
++ if (x509_ctx->sig_type == SIG_TYPE_MD5)
++ {
++ MD5_CTX md5_ctx;
++ uint8_t md5_dgst[MD5_SIZE];
++ MD5_Init(&md5_ctx);
++ MD5_Update(&md5_ctx, &cert[begin_tbs], end_tbs-begin_tbs);
++ MD5_Final(md5_dgst, &md5_ctx);
++ x509_ctx->digest = bi_import(bi_ctx, md5_dgst, MD5_SIZE);
++ }
++ else if (x509_ctx->sig_type == SIG_TYPE_SHA1)
++ {
++ SHA1_CTX sha_ctx;
++ uint8_t sha_dgst[SHA1_SIZE];
++ SHA1_Init(&sha_ctx);
++ SHA1_Update(&sha_ctx, &cert[begin_tbs], end_tbs-begin_tbs);
++ SHA1_Final(sha_dgst, &sha_ctx);
++ x509_ctx->digest = bi_import(bi_ctx, sha_dgst, SHA1_SIZE);
++ }
++ else if (x509_ctx->sig_type == SIG_TYPE_MD2)
++ {
++ MD2_CTX md2_ctx;
++ uint8_t md2_dgst[MD2_SIZE];
++ MD2_Init(&md2_ctx);
++ MD2_Update(&md2_ctx, &cert[begin_tbs], end_tbs-begin_tbs);
++ MD2_Final(md2_dgst, &md2_ctx);
++ x509_ctx->digest = bi_import(bi_ctx, md2_dgst, MD2_SIZE);
++ }
++
++ offset = end_tbs; /* skip the v3 data */
++ if (asn1_skip_obj(cert, &offset, ASN1_SEQUENCE) ||
++ asn1_signature(cert, &offset, x509_ctx))
++ goto end_cert;
++#endif
++
++ if (len)
++ {
++ *len = cert_size;
++ }
++
++ ret = X509_OK;
++end_cert:
++
++#ifdef CONFIG_SSL_FULL_MODE
++ if (ret)
++ {
++ printf("Error: Invalid X509 ASN.1 file\n");
++ }
++#endif
++
++ return ret;
++}
++
++/**
++ * Free an X.509 object's resources.
++ */
++void x509_free(X509_CTX *x509_ctx)
++{
++ X509_CTX *next;
++ int i;
++
++ if (x509_ctx == NULL) /* if already null, then don't bother */
++ return;
++
++ for (i = 0; i < X509_NUM_DN_TYPES; i++)
++ {
++ free(x509_ctx->ca_cert_dn[i]);
++ free(x509_ctx->cert_dn[i]);
++ }
++
++ free(x509_ctx->signature);
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++ if (x509_ctx->digest)
++ {
++ bi_free(x509_ctx->rsa_ctx->bi_ctx, x509_ctx->digest);
++ }
++#endif
++
++ RSA_free(x509_ctx->rsa_ctx);
++
++ next = x509_ctx->next;
++ free(x509_ctx);
++ x509_free(next); /* clear the chain */
++}
++
++#ifdef CONFIG_SSL_CERT_VERIFICATION
++/**
++ * Take a signature and decrypt it.
++ */
++static bigint *sig_verify(BI_CTX *ctx, const uint8_t *sig, int sig_len,
++ bigint *modulus, bigint *pub_exp)
++{
++ int i, size;
++ bigint *decrypted_bi, *dat_bi;
++ bigint *bir = NULL;
++ uint8_t *block = (uint8_t *)alloca(sig_len);
++
++ /* decrypt */
++ dat_bi = bi_import(ctx, sig, sig_len);
++ ctx->mod_offset = BIGINT_M_OFFSET;
++
++ /* convert to a normal block */
++ decrypted_bi = bi_mod_power2(ctx, dat_bi, modulus, pub_exp);
++
++ bi_export(ctx, decrypted_bi, block, sig_len);
++ ctx->mod_offset = BIGINT_M_OFFSET;
++
++ i = 10; /* start at the first possible non-padded byte */
++ while (block[i++] && i < sig_len);
++ size = sig_len - i;
++
++ /* get only the bit we want */
++ if (size > 0)
++ {
++ int len;
++ const uint8_t *sig_ptr = get_signature(&block[i], &len);
++
++ if (sig_ptr)
++ {
++ bir = bi_import(ctx, sig_ptr, len);
++ }
++ }
++
++ /* save a few bytes of memory */
++ bi_clear_cache(ctx);
++ return bir;
++}
++
++/**
++ * Do some basic checks on the certificate chain.
++ *
++ * Certificate verification consists of a number of checks:
++ * - The date of the certificate is after the start date.
++ * - The date of the certificate is before the finish date.
++ * - A root certificate exists in the certificate store.
++ * - That the certificate(s) are not self-signed.
++ * - The certificate chain is valid.
++ * - The signature of the certificate is valid.
++ */
++int x509_verify(const CA_CERT_CTX *ca_cert_ctx, const X509_CTX *cert)
++{
++ int ret = X509_OK, i = 0;
++ bigint *cert_sig;
++ X509_CTX *next_cert = NULL;
++ BI_CTX *ctx = NULL;
++ bigint *mod = NULL, *expn = NULL;
++ int match_ca_cert = 0;
++ struct timeval tv;
++ uint8_t is_self_signed = 0;
++
++ if (cert == NULL)
++ {
++ ret = X509_VFY_ERROR_NO_TRUSTED_CERT;
++ goto end_verify;
++ }
++
++ /* a self-signed certificate that is not in the CA store - use this
++ to check the signature */
++ if (asn1_compare_dn(cert->ca_cert_dn, cert->cert_dn) == 0)
++ {
++ is_self_signed = 1;
++ ctx = cert->rsa_ctx->bi_ctx;
++ mod = cert->rsa_ctx->m;
++ expn = cert->rsa_ctx->e;
++ }
++
++ gettimeofday(&tv, NULL);
++
++ /* check the not before date */
++ if (tv.tv_sec < cert->not_before)
++ {
++ ret = X509_VFY_ERROR_NOT_YET_VALID;
++ goto end_verify;
++ }
++
++ /* check the not after date */
++ if (tv.tv_sec > cert->not_after)
++ {
++ ret = X509_VFY_ERROR_EXPIRED;
++ goto end_verify;
++ }
++
++ next_cert = cert->next;
++
++ /* last cert in the chain - look for a trusted cert */
++ if (next_cert == NULL)
++ {
++ if (ca_cert_ctx != NULL)
++ {
++ /* go thu the CA store */
++ while (i < CONFIG_X509_MAX_CA_CERTS && ca_cert_ctx->cert[i])
++ {
++ if (asn1_compare_dn(cert->ca_cert_dn,
++ ca_cert_ctx->cert[i]->cert_dn) == 0)
++ {
++ /* use this CA certificate for signature verification */
++ match_ca_cert = 1;
++ ctx = ca_cert_ctx->cert[i]->rsa_ctx->bi_ctx;
++ mod = ca_cert_ctx->cert[i]->rsa_ctx->m;
++ expn = ca_cert_ctx->cert[i]->rsa_ctx->e;
++ break;
++ }
++
++ i++;
++ }
++ }
++
++ /* couldn't find a trusted cert (& let self-signed errors be returned) */
++ if (!match_ca_cert && !is_self_signed)
++ {
++ ret = X509_VFY_ERROR_NO_TRUSTED_CERT;
++ goto end_verify;
++ }
++ }
++ else if (asn1_compare_dn(cert->ca_cert_dn, next_cert->cert_dn) != 0)
++ {
++ /* check the chain */
++ ret = X509_VFY_ERROR_INVALID_CHAIN;
++ goto end_verify;
++ }
++ else /* use the next certificate in the chain for signature verify */
++ {
++ ctx = next_cert->rsa_ctx->bi_ctx;
++ mod = next_cert->rsa_ctx->m;
++ expn = next_cert->rsa_ctx->e;
++ }
++
++ /* cert is self signed */
++ if (!match_ca_cert && is_self_signed)
++ {
++ ret = X509_VFY_ERROR_SELF_SIGNED;
++ goto end_verify;
++ }
++
++ /* check the signature */
++ cert_sig = sig_verify(ctx, cert->signature, cert->sig_len,
++ bi_clone(ctx, mod), bi_clone(ctx, expn));
++
++ if (cert_sig && cert->digest)
++ {
++ if (bi_compare(cert_sig, cert->digest) != 0)
++ ret = X509_VFY_ERROR_BAD_SIGNATURE;
++
++
++ bi_free(ctx, cert_sig);
++ }
++ else
++ {
++ ret = X509_VFY_ERROR_BAD_SIGNATURE;
++ }
++
++ if (ret)
++ goto end_verify;
++
++ /* go down the certificate chain using recursion. */
++ if (next_cert != NULL)
++ {
++ ret = x509_verify(ca_cert_ctx, next_cert);
++ }
++
++end_verify:
++ return ret;
++}
++#endif
++
++#if defined (CONFIG_SSL_FULL_MODE)
++/**
++ * Used for diagnostics.
++ */
++static const char *not_part_of_cert = "<Not Part Of Certificate>";
++void x509_print(const X509_CTX *cert, CA_CERT_CTX *ca_cert_ctx)
++{
++ if (cert == NULL)
++ return;
++
++ printf("=== CERTIFICATE ISSUED TO ===\n");
++ printf("Common Name (CN):\t\t");
++ printf("%s\n", cert->cert_dn[X509_COMMON_NAME] ?
++ cert->cert_dn[X509_COMMON_NAME] : not_part_of_cert);
++
++ printf("Organization (O):\t\t");
++ printf("%s\n", cert->cert_dn[X509_ORGANIZATION] ?
++ cert->cert_dn[X509_ORGANIZATION] : not_part_of_cert);
++
++ printf("Organizational Unit (OU):\t");
++ printf("%s\n", cert->cert_dn[X509_ORGANIZATIONAL_UNIT] ?
++ cert->cert_dn[X509_ORGANIZATIONAL_UNIT] : not_part_of_cert);
++
++ printf("=== CERTIFICATE ISSUED BY ===\n");
++ printf("Common Name (CN):\t\t");
++ printf("%s\n", cert->ca_cert_dn[X509_COMMON_NAME] ?
++ cert->ca_cert_dn[X509_COMMON_NAME] : not_part_of_cert);
++
++ printf("Organization (O):\t\t");
++ printf("%s\n", cert->ca_cert_dn[X509_ORGANIZATION] ?
++ cert->ca_cert_dn[X509_ORGANIZATION] : not_part_of_cert);
++
++ printf("Organizational Unit (OU):\t");
++ printf("%s\n", cert->ca_cert_dn[X509_ORGANIZATIONAL_UNIT] ?
++ cert->ca_cert_dn[X509_ORGANIZATIONAL_UNIT] : not_part_of_cert);
++
++ printf("Not Before:\t\t\t%s", ctime(&cert->not_before));
++ printf("Not After:\t\t\t%s", ctime(&cert->not_after));
++ printf("RSA bitsize:\t\t\t%d\n", cert->rsa_ctx->num_octets*8);
++ printf("Sig Type:\t\t\t");
++ switch (cert->sig_type)
++ {
++ case SIG_TYPE_MD5:
++ printf("MD5\n");
++ break;
++ case SIG_TYPE_SHA1:
++ printf("SHA1\n");
++ break;
++ case SIG_TYPE_MD2:
++ printf("MD2\n");
++ break;
++ default:
++ printf("Unrecognized: %d\n", cert->sig_type);
++ break;
++ }
++
++ if (ca_cert_ctx)
++ {
++ printf("Verify:\t\t\t\t%s\n",
++ x509_display_error(x509_verify(ca_cert_ctx, cert)));
++ }
++
++#if 0
++ print_blob("Signature", cert->signature, cert->sig_len);
++ bi_print("Modulus", cert->rsa_ctx->m);
++ bi_print("Pub Exp", cert->rsa_ctx->e);
++#endif
++
++ if (ca_cert_ctx)
++ {
++ x509_print(cert->next, ca_cert_ctx);
++ }
++
++ TTY_FLUSH();
++}
++
++const char * x509_display_error(int error)
++{
++ switch (error)
++ {
++ case X509_OK:
++ return "Certificate verify successful";
++
++ case X509_NOT_OK:
++ return "X509 not ok";
++
++ case X509_VFY_ERROR_NO_TRUSTED_CERT:
++ return "No trusted cert is available";
++
++ case X509_VFY_ERROR_BAD_SIGNATURE:
++ return "Bad signature";
++
++ case X509_VFY_ERROR_NOT_YET_VALID:
++ return "Cert is not yet valid";
++
++ case X509_VFY_ERROR_EXPIRED:
++ return "Cert has expired";
++
++ case X509_VFY_ERROR_SELF_SIGNED:
++ return "Cert is self-signed";
++
++ case X509_VFY_ERROR_INVALID_CHAIN:
++ return "Chain is invalid (check order of certs)";
++
++ case X509_VFY_ERROR_UNSUPPORTED_DIGEST:
++ return "Unsupported digest";
++
++ case X509_INVALID_PRIV_KEY:
++ return "Invalid private key";
++
++ default:
++ return "Unknown";
++ }
++}
++#endif /* CONFIG_SSL_FULL_MODE */
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/bin/.htaccess b/feeds/luci/libs/luci-lib-nixio/axTLS/www/bin/.htaccess
+new file mode 100644
+index 0000000..4496fa9
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/bin/.htaccess
+@@ -0,0 +1,2 @@
++Deny all
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/favicon.ico b/feeds/luci/libs/luci-lib-nixio/axTLS/www/favicon.ico
+new file mode 100644
+index 0000000000000000000000000000000000000000..9f6f30e4c6de09f2e93be5e3cbde8a97850b1989
+GIT binary patch
+literal 22486
+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
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/index.html b/feeds/luci/libs/luci-lib-nixio/axTLS/www/index.html
+new file mode 100755
+index 0000000..25cd2e6
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/index.html
+@@ -0,0 +1,7106 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
++<head>
++<script type="text/javascript">
++//<![CDATA[
++var version = {major: 2, minor: 1, revision: 3, date: new Date("Nov 3, 2006"), extensions: {}};
++//]]>
++</script>
++<!--
++TiddlyWiki 2.1.3 by Jeremy Ruston, (jeremy [at] osmosoft [dot] com)
++
++Copyright (c) Osmosoft Limited 2004-2006
++
++Redistribution and use in source and binary forms, with or without modification,
++are permitted provided that the following conditions are met:
++
++Redistributions of source code must retain the above copyright notice, this
++list of conditions and the following disclaimer.
++
++Redistributions in binary form must reproduce the above copyright notice, this
++list of conditions and the following disclaimer in the documentation and/or other
++materials provided with the distribution.
++
++Neither the name of the Osmosoft Limited nor the names of its contributors may be
++used to endorse or promote products derived from this software without specific
++prior written permission.
++
++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
++EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
++SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
++INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
++BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
++CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
++ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
++DAMAGE.
++-->
++<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
++<!--PRE-HEAD-START-->
++<!--{{{-->
++<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>
++<!--}}}-->
++<!--PRE-HEAD-END-->
++<title> axTLS Embedded SSL - changes, notes and errata </title>
++<script type="text/javascript">
++//<![CDATA[
++// ---------------------------------------------------------------------------------
++// Configuration repository
++// ---------------------------------------------------------------------------------
++
++// Miscellaneous options
++var config = {
++ numRssItems: 20, // Number of items in the RSS feed
++ animFast: 0.12, // Speed for animations (lower == slower)
++ animSlow: 0.01, // Speed for EasterEgg animations
++ cascadeFast: 20, // Speed for cascade animations (higher == slower)
++ cascadeSlow: 60, // Speed for EasterEgg cascade animations
++ cascadeDepth: 5, // Depth of cascade animation
++ displayStartupTime: false // Whether to display startup time
++ };
++
++// Messages
++config.messages = {
++ messageClose: {},
++ dates: {}
++};
++
++// Options that can be set in the options panel and/or cookies
++config.options = {
++ chkRegExpSearch: false,
++ chkCaseSensitiveSearch: false,
++ chkAnimate: true,
++ chkSaveBackups: true,
++ chkAutoSave: false,
++ chkGenerateAnRssFeed: false,
++ chkSaveEmptyTemplate: false,
++ chkOpenInNewWindow: true,
++ chkToggleLinks: false,
++ chkHttpReadOnly: true,
++ chkForceMinorUpdate: false,
++ chkConfirmDelete: true,
++ chkInsertTabs: false,
++ txtBackupFolder: "",
++ txtMainTab: "tabTimeline",
++ txtMoreTab: "moreTabAll",
++ txtMaxEditRows: "30"
++ };
++
++// List of notification functions to be called when certain tiddlers are changed or deleted
++config.notifyTiddlers = [
++ {name: "StyleSheetLayout", notify: refreshStyles},
++ {name: "StyleSheetColors", notify: refreshStyles},
++ {name: "StyleSheet", notify: refreshStyles},
++ {name: "StyleSheetPrint", notify: refreshStyles},
++ {name: "PageTemplate", notify: refreshPageTemplate},
++ {name: "SiteTitle", notify: refreshPageTitle},
++ {name: "SiteSubtitle", notify: refreshPageTitle},
++ {name: "ColorPalette", notify: refreshColorPalette},
++ {name: null, notify: refreshDisplay}
++ ];
++
++// Default tiddler templates
++var DEFAULT_VIEW_TEMPLATE = 1;
++var DEFAULT_EDIT_TEMPLATE = 2;
++config.tiddlerTemplates = {
++ 1: "ViewTemplate",
++ 2: "EditTemplate"
++ };
++
++// More messages (rather a legacy layout that shouldn't really be like this)
++config.views = {
++ wikified: {
++ tag: {}
++ },
++ editor: {
++ tagChooser: {}
++ }
++ };
++
++// Macros; each has a 'handler' member that is inserted later
++config.macros = {
++ today: {},
++ version: {},
++ search: {sizeTextbox: 15},
++ tiddler: {},
++ tag: {},
++ tags: {},
++ tagging: {},
++ timeline: {},
++ allTags: {},
++ list: {
++ all: {},
++ missing: {},
++ orphans: {},
++ shadowed: {}
++ },
++ closeAll: {},
++ permaview: {},
++ saveChanges: {},
++ slider: {},
++ option: {},
++ newTiddler: {},
++ newJournal: {},
++ sparkline: {},
++ tabs: {},
++ gradient: {},
++ message: {},
++ view: {},
++ edit: {},
++ tagChooser: {},
++ toolbar: {},
++ br: {},
++ plugins: {},
++ refreshDisplay: {},
++ importTiddlers: {}
++ };
++
++// Commands supported by the toolbar macro
++config.commands = {
++ closeTiddler: {},
++ closeOthers: {},
++ editTiddler: {},
++ saveTiddler: {hideReadOnly: true},
++ cancelTiddler: {},
++ deleteTiddler: {hideReadOnly: true},
++ permalink: {},
++ references: {},
++ jump: {}
++ };
++
++// Browser detection... In a very few places, there's nothing else for it but to
++// know what browser we're using.
++config.userAgent = navigator.userAgent.toLowerCase();
++config.browser = {
++ isIE: config.userAgent.indexOf("msie") != -1 && config.userAgent.indexOf("opera") == -1,
++ ieVersion: /MSIE (\d.\d)/i.exec(config.userAgent), // config.browser.ieVersion[1], if it exists, will be the IE version string, eg "6.0"
++ isSafari: config.userAgent.indexOf("applewebkit") != -1,
++ isBadSafari: !((new RegExp("[\u0150\u0170]","g")).test("\u0150")),
++ firefoxDate: /Gecko\/(\d{8})/i.exec(config.userAgent), // config.browser.firefoxDate[1], if it exists, will be Firefox release date as "YYYYMMDD"
++ isOpera: config.userAgent.indexOf("opera") != -1,
++ isLinux: config.userAgent.indexOf("linux") != -1,
++ isUnix: config.userAgent.indexOf("x11") != -1,
++ isMac: config.userAgent.indexOf("mac") != -1,
++ isWindows: config.userAgent.indexOf("win") != -1
++ };
++
++// Basic regular expressions
++config.textPrimitives = {
++ upperLetter: "[A-Z\u00c0-\u00de\u0150\u0170]",
++ lowerLetter: "[a-z0-9_\\-\u00df-\u00ff\u0151\u0171]",
++ anyLetter: "[A-Za-z0-9_\\-\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]",
++ anyLetterStrict: "[A-Za-z0-9\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]"
++ };
++if(config.browser.isBadSafari)
++ config.textPrimitives = {
++ upperLetter: "[A-Z\u00c0-\u00de]",
++ lowerLetter: "[a-z0-9_\\-\u00df-\u00ff]",
++ anyLetter: "[A-Za-z0-9_\\-\u00c0-\u00de\u00df-\u00ff]",
++ anyLetterStrict: "[A-Za-z0-9\u00c0-\u00de\u00df-\u00ff]"
++ }
++config.textPrimitives.sliceSeparator = "::";
++config.textPrimitives.urlPattern = "[a-z]{3,8}:[^\\s:'\"][^\\s'\"]*(?:/|\\b)";
++config.textPrimitives.unWikiLink = "~";
++config.textPrimitives.wikiLink = "(?:(?:" + config.textPrimitives.upperLetter + "+" +
++ config.textPrimitives.lowerLetter + "+" +
++ config.textPrimitives.upperLetter +
++ config.textPrimitives.anyLetter + "*)|(?:" +
++ config.textPrimitives.upperLetter + "{2,}" +
++ config.textPrimitives.lowerLetter + "+))";
++
++config.textPrimitives.cssLookahead = "(?:(" + config.textPrimitives.anyLetter + "+)\\(([^\\)\\|\\n]+)(?:\\):))|(?:(" + config.textPrimitives.anyLetter + "+):([^;\\|\\n]+);)";
++config.textPrimitives.cssLookaheadRegExp = new RegExp(config.textPrimitives.cssLookahead,"mg");
++
++config.textPrimitives.brackettedLink = "\\[\\[([^\\]]+)\\]\\]";
++config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\]";
++config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
++ config.textPrimitives.brackettedLink + ")|(?:" +
++ config.textPrimitives.urlPattern + ")","mg");
++config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
++ config.textPrimitives.titledBrackettedLink + ")|(?:" +
++ config.textPrimitives.brackettedLink + ")|(?:" +
++ config.textPrimitives.urlPattern + ")","mg");
++
++// ---------------------------------------------------------------------------------
++// Shadow tiddlers
++// ---------------------------------------------------------------------------------
++
++config.shadowTiddlers = {
++ ColorPalette: "Background: #fff\n" +
++ "Foreground: #000\n" +
++ "PrimaryPale: #8cf\n" +
++ "PrimaryLight: #18f\n" +
++ "PrimaryMid: #04b\n" +
++ "PrimaryDark: #014\n" +
++ "SecondaryPale: #ffc\n" +
++ "SecondaryLight: #fe8\n" +
++ "SecondaryMid: #db4\n" +
++ "SecondaryDark: #841\n" +
++ "TertiaryPale: #eee\n" +
++ "TertiaryLight: #ccc\n" +
++ "TertiaryMid: #999\n" +
++ "TertiaryDark: #666\n" +
++ "Error: #f88\n",
++ StyleSheet: "",
++ StyleSheetColors: "/*{{{*/\nbody {\n background: [[ColorPalette::Background]];\n color: [[ColorPalette::Foreground]];\n}\n\na{\n color: [[ColorPalette::PrimaryMid]];\n}\n\na:hover{\n background: [[ColorPalette::PrimaryMid]];\n color: [[ColorPalette::Background]];\n}\n\na img{\n border: 0;\n}\n\nh1,h2,h3,h4,h5 {\n color: [[ColorPalette::SecondaryDark]];\n background: [[ColorPalette::PrimaryPale]];\n}\n\n.button {\n color: [[ColorPalette::PrimaryDark]];\n border: 1px solid [[ColorPalette::Background]];\n}\n\n.button:hover {\n color: [[ColorPalette::PrimaryDark]];\n background: [[ColorPalette::SecondaryLight]];\n border-color: [[ColorPalette::SecondaryMid]];\n}\n\n.button:active {\n color: [[ColorPalette::Background]];\n background: [[ColorPalette::SecondaryMid]];\n border: 1px solid [[ColorPalette::SecondaryDark]];\n}\n\n.header {\n background: [[ColorPalette::PrimaryMid]];\n}\n\n.headerShadow {\n color: [[ColorPalette::Foreground]];\n}\n\n.headerShadow a {\n font-weight: normal;\n color: [[ColorPalette::Foreground]];\n}\n\n.headerForeground {\n color: [[ColorPalette::Background]];\n}\n\n.headerForeground a {\n font-weight: normal;\n color: [[ColorPalette::PrimaryPale]];\n}\n\n.tabSelected{\n color: [[ColorPalette::PrimaryDark]];\n background: [[ColorPalette::TertiaryPale]];\n border-left: 1px solid [[ColorPalette::TertiaryLight]];\n border-top: 1px solid [[ColorPalette::TertiaryLight]];\n border-right: 1px solid [[ColorPalette::TertiaryLight]];\n}\n\n.tabUnselected {\n color: [[ColorPalette::Background]];\n background: [[ColorPalette::TertiaryMid]];\n}\n\n.tabContents {\n color: [[ColorPalette::PrimaryDark]];\n background: [[ColorPalette::TertiaryPale]];\n border: 1px solid [[ColorPalette::TertiaryLight]];\n}\n\n.tabContents .button {\n border: 0;}\n\n#sidebar {\n}\n\n#sidebarOptions input {\n border: 1px solid [[ColorPalette::PrimaryMid]];\n}\n\n#sidebarOptions .sliderPanel {\n background: [[ColorPalette::PrimaryPale]];\n}\n\n#sidebarOptions .sliderPanel a {\n border: none;\n color: [[ColorPalette::PrimaryMid]];\n}\n\n#sidebarOptions .sliderPanel a:hover {\n color: [[ColorPalette::Background]];\n background: [[ColorPalette::PrimaryMid]];\n}\n\n#sidebarOptions .sliderPanel a:active {\n color: [[ColorPalette::PrimaryMid]];\n background: [[ColorPalette::Background]];\n}\n\n.wizard {\n background: [[ColorPalette::SecondaryLight]];\n border-top: 1px solid [[ColorPalette::SecondaryMid]];\n border-left: 1px solid [[ColorPalette::SecondaryMid]];\n}\n\n.wizard h1 {\n color: [[ColorPalette::SecondaryDark]];\n}\n\n.wizard h2 {\n color: [[ColorPalette::Foreground]];\n}\n\n.wizardStep {\n background: [[ColorPalette::Background]];\n border-top: 1px solid [[ColorPalette::SecondaryMid]];\n border-bottom: 1px solid [[ColorPalette::SecondaryMid]];\n border-left: 1px solid [[ColorPalette::SecondaryMid]];\n}\n\n.wizard .button {\n color: [[ColorPalette::Background]];\n background: [[ColorPalette::PrimaryMid]];\n border-top: 1px solid [[ColorPalette::PrimaryLight]];\n border-right: 1px solid [[ColorPalette::PrimaryDark]];\n border-bottom: 1px solid [[ColorPalette::PrimaryDark]];\n border-left: 1px solid [[ColorPalette::PrimaryLight]];\n}\n\n.wizard .button:hover {\n color: [[ColorPalette::PrimaryLight]];\n background: [[ColorPalette::PrimaryDark]];\n border-color: [[ColorPalette::PrimaryLight]];\n}\n\n.wizard .button:active {\n color: [[ColorPalette::Background]];\n background: [[ColorPalette::PrimaryMid]];\n border-top: 1px solid [[ColorPalette::PrimaryLight]];\n border-right: 1px solid [[ColorPalette::PrimaryDark]];\n border-bottom: 1px solid [[ColorPalette::PrimaryDark]];\n border-left: 1px solid [[ColorPalette::PrimaryLight]];\n}\n\n#messageArea {\n border: 1px solid [[ColorPalette::SecondaryDark]];\n background: [[ColorPalette::SecondaryMid]];\n color: [[ColorPalette::PrimaryDark]];\n}\n\n#messageArea .button {\n padding: 0.2em 0.2em 0.2em 0.2em;\n color: [[ColorPalette::PrimaryDark]];\n background: [[ColorPalette::Background]];\n}\n\n.popup {\n background: [[ColorPalette::PrimaryLight]];\n border: 1px solid [[ColorPalette::PrimaryMid]];\n}\n\n.popup hr {\n color: [[ColorPalette::PrimaryDark]];\n background: [[ColorPalette::PrimaryDark]];\n border-bottom: 1px;\n}\n\n.listBreak div{\n border-bottom: 1px solid [[ColorPalette::PrimaryDark]];\n}\n\n.popup li.disabled {\n color: [[ColorPalette::PrimaryMid]];\n}\n\n.popup li a, .popup li a:visited {\n color: [[ColorPalette::TertiaryPale]];\n border: none;\n}\n\n.popup li a:hover {\n background: [[ColorPalette::PrimaryDark]];\n color: [[ColorPalette::Background]];\n border: none;\n}\n\n.tiddler .defaultCommand {\n font-weight: bold;\n}\n\n.shadow .title {\n color: [[ColorPalette::TertiaryDark]];\n}\n\n.title {\n color: [[ColorPalette::SecondaryDark]];\n}\n\n.subtitle {\n color: [[ColorPalette::TertiaryDark]];\n}\n\n.toolbar {\n color: [[ColorPalette::PrimaryMid]];\n}\n\n.tagging, .tagged {\n border: 1px solid [[ColorPalette::TertiaryPale]];\n background-color: [[ColorPalette::TertiaryPale]];\n}\n\n.selected .tagging, .selected .tagged {\n background-color: [[ColorPalette::TertiaryLight]];\n border: 1px solid [[ColorPalette::TertiaryMid]];\n}\n\n.tagging .listTitle, .tagged .listTitle {\n color: [[ColorPalette::PrimaryDark]];\n}\n\n.tagging .button, .tagged .button {\n border: none;\n}\n\n.footer {\n color: [[ColorPalette::TertiaryLight]];\n}\n\n.selected .footer {\n color: [[ColorPalette::TertiaryMid]];\n}\n\n.sparkline {\n background: [[ColorPalette::PrimaryPale]];\n border: 0;\n}\n\n.sparktick {\n background: [[ColorPalette::PrimaryDark]];\n}\n\n.error, .errorButton {\n color: [[ColorPalette::Foreground]];\n background: [[ColorPalette::Error]];\n}\n\n.warning {\n color: [[ColorPalette::Foreground]];\n background: [[ColorPalette::SecondaryPale]];\n}\n\n.cascade {\n background: [[ColorPalette::TertiaryPale]];\n color: [[ColorPalette::TertiaryMid]];\n border: 1px solid [[ColorPalette::TertiaryMid]];\n}\n\n.imageLink, #displayArea .imageLink {\n background: transparent;\n}\n\n.viewer .listTitle {list-style-type: none; margin-left: -2em;}\n\n.viewer .button {\n border: 1px solid [[ColorPalette::SecondaryMid]];\n}\n\n.viewer blockquote {\n border-left: 3px solid [[ColorPalette::TertiaryDark]];\n}\n\n.viewer table {\n border: 2px solid [[ColorPalette::TertiaryDark]];\n}\n\n.viewer th, thead td {\n background: [[ColorPalette::SecondaryMid]];\n border: 1px solid [[ColorPalette::TertiaryDark]];\n color: [[ColorPalette::Background]];\n}\n\n.viewer td, .viewer tr {\n border: 1px solid [[ColorPalette::TertiaryDark]];\n}\n\n.viewer pre {\n border: 1px solid [[ColorPalette::SecondaryLight]];\n background: [[ColorPalette::SecondaryPale]];\n}\n\n.viewer code {\n color: [[ColorPalette::SecondaryDark]];\n}\n\n.viewer hr {\n border: 0;\n border-top: dashed 1px [[ColorPalette::TertiaryDark]];\n color: [[ColorPalette::TertiaryDark]];\n}\n\n.highlight, .marked {\n background: [[ColorPalette::SecondaryLight]];\n}\n\n.editor input {\n border: 1px solid [[ColorPalette::PrimaryMid]];\n}\n\n.editor textarea {\n border: 1px solid [[ColorPalette::PrimaryMid]];\n width: 100%;\n}\n\n.editorFooter {\n color: [[ColorPalette::TertiaryMid]];\n}\n\n/*}}}*/",
++ StyleSheetLayout: "/*{{{*/\n* html .tiddler {\n height: 1%;\n}\n\nbody {\n font-size: .75em;\n font-family: arial,helvetica;\n margin: 0;\n padding: 0;\n}\n\nh1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: 0.4em;\n}\n\nh1 {font-size: 1.35em;}\nh2 {font-size: 1.25em;}\nh3 {font-size: 1.1em;}\nh4 {font-size: 1em;}\nh5 {font-size: .9em;}\n\nhr {\n height: 1px;\n}\n\na{\n text-decoration: none;\n}\n\ndt {font-weight: bold;}\n\nol { list-style-type: decimal }\nol ol { list-style-type: lower-alpha }\nol ol ol { list-style-type: lower-roman }\nol ol ol ol { list-style-type: decimal }\nol ol ol ol ol { list-style-type: lower-alpha }\nol ol ol ol ol ol { list-style-type: lower-roman }\nol ol ol ol ol ol ol { list-style-type: decimal }\n\n.txtOptionInput {\n width: 11em;\n}\n\n#contentWrapper .chkOptionInput {\n border: 0;\n}\n\n.externalLink {\n text-decoration: underline;\n}\n\n.indent {margin-left:3em;}\n.outdent {margin-left:3em; text-indent:-3em;}\ncode.escaped {white-space:nowrap;}\n\n.tiddlyLinkExisting {\n font-weight: bold;\n}\n\n.tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler a bold */\na.tiddlyLinkNonExisting.shadow {\n font-weight: bold;\n}\n\n#mainMenu .tiddlyLinkExisting, \n#mainMenu .tiddlyLinkNonExisting,\n#sidebarTabs .tiddlyLinkNonExisting{\n font-weight: normal;\n font-style: normal;\n}\n\n#sidebarTabs .tiddlyLinkExisting {\n font-weight: bold;\n font-style: normal;\n}\n\n.header {\n position: relative;\n}\n\n.header a:hover {\n background: transparent;\n}\n\n.headerShadow {\n position: relative;\n padding: 4.5em 0em 1em 1em;\n left: -1px;\n top: -1px;\n}\n\n.headerForeground {\n position: absolute;\n padding: 4.5em 0em 1em 1em;\n left: 0px;\n top: 0px;\n}\n\n.siteTitle {\n font-size: 3em;\n}\n\n.siteSubtitle {\n font-size: 1.2em;\n}\n\n#mainMenu {\n position: absolute;\n left: 0;\n width: 10em;\n text-align: right;\n line-height: 1.6em;\n padding: 1.5em 0.5em 0.5em 0.5em;\n font-size: 1.1em;\n}\n\n#sidebar {\n position: absolute;\n right: 3px;\n width: 16em;\n font-size: .9em;\n}\n\n#sidebarOptions {\n padding-top: 0.3em;\n}\n\n#sidebarOptions a {\n margin: 0em 0.2em;\n padding: 0.2em 0.3em;\n display: block;\n}\n\n#sidebarOptions input {\n margin: 0.4em 0.5em;\n}\n\n#sidebarOptions .sliderPanel {\n margin-left: 1em;\n padding: 0.5em;\n font-size: .85em;\n}\n\n#sidebarOptions .sliderPanel a {\n font-weight: bold;\n display: inline;\n padding: 0;\n}\n\n#sidebarOptions .sliderPanel input {\n margin: 0 0 .3em 0;\n}\n\n#sidebarTabs .tabContents {\n width: 15em;\n overflow: hidden;\n}\n\n.wizard {\n padding: 0.1em 0em 0em 2em;\n}\n\n.wizard h1 {\n font-size: 2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.4em 0em 0.2em 0em;\n}\n\n.wizard h2 {\n font-size: 1.2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.2em 0em 0.2em 0em;\n}\n\n.wizardStep {\n padding: 1em 1em 1em 1em;\n}\n\n.wizard .button {\n margin: 0.5em 0em 0em 0em;\n font-size: 1.2em;\n}\n\n#messageArea {\nposition:absolute; top:0; right:0; margin: 0.5em; padding: 0.5em;\n}\n\n*[id='messageArea'] {\nposition:fixed !important; z-index:99;}\n\n.messageToolbar {\ndisplay: block;\ntext-align: right;\n}\n\n#messageArea a{\n text-decoration: underline;\n}\n\n.popup {\n font-size: .9em;\n padding: 0.2em;\n list-style: none;\n margin: 0;\n}\n\n.popup hr {\n display: block;\n height: 1px;\n width: auto;\n padding: 0;\n margin: 0.2em 0em;\n}\n\n.listBreak {\n font-size: 1px;\n line-height: 1px;\n}\n\n.listBreak div {\n margin: 2px 0;\n}\n\n.popup li.disabled {\n padding: 0.2em;\n}\n\n.popup li a{\n display: block;\n padding: 0.2em;\n}\n\n.tabset {\n padding: 1em 0em 0em 0.5em;\n}\n\n.tab {\n margin: 0em 0em 0em 0.25em;\n padding: 2px;\n}\n\n.tabContents {\n padding: 0.5em;\n}\n\n.tabContents ul, .tabContents ol {\n margin: 0;\n padding: 0;\n}\n\n.txtMainTab .tabContents li {\n list-style: none;\n}\n\n.tabContents li.listLink {\n margin-left: .75em;\n}\n\n#displayArea {\n margin: 1em 17em 0em 14em;\n}\n\n\n.toolbar {\n text-align: right;\n font-size: .9em;\n visibility: hidden;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.tiddler {\n padding: 1em 1em 0em 1em;\n}\n\n.missing .viewer,.missing .title {\n font-style: italic;\n}\n\n.title {\n font-size: 1.6em;\n font-weight: bold;\n}\n\n.missing .subtitle {\n display: none;\n}\n\n.subtitle {\n font-size: 1.1em;\n}\n\n.tiddler .button {\n padding: 0.2em 0.4em;\n}\n\n.tagging {\nmargin: 0.5em 0.5em 0.5em 0;\nfloat: left;\ndisplay: none;\n}\n\n.isTag .tagging {\ndisplay: block;\n}\n\n.tagged {\nmargin: 0.5em;\nfloat: right;\n}\n\n.tagging, .tagged {\nfont-size: 0.9em;\npadding: 0.25em;\n}\n\n.tagging ul, .tagged ul {\nlist-style: none;margin: 0.25em;\npadding: 0;\n}\n\n.tagClear {\nclear: both;\n}\n\n.footer {\n font-size: .9em;\n}\n\n.footer li {\ndisplay: inline;\n}\n\n* html .viewer pre {\n width: 99%;\n padding: 0 0 1em 0;\n}\n\n.viewer {\n line-height: 1.4em;\n padding-top: 0.5em;\n}\n\n.viewer .button {\n margin: 0em 0.25em;\n padding: 0em 0.25em;\n}\n\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul, .viewer ol{\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer table {\n border-collapse: collapse;\n margin: 0.8em 1.0em;\n}\n\n.viewer th, .viewer td, .viewer tr,.viewer caption{\n padding: 3px;\n}\n\n.viewer table.listView {\n font-size: 0.85em;\n margin: 0.8em 1.0em;\n}\n\n.viewer table.listView th, .viewer table.listView td, .viewer table.listView tr {\n padding: 0px 3px 0px 3px;\n}\n\n.viewer pre {\n padding: 0.5em;\n margin-left: 0.5em;\n font-size: 1.2em;\n line-height: 1.4em;\n overflow: auto;\n}\n\n.viewer code {\n font-size: 1.2em;\n line-height: 1.4em;\n}\n\n.editor {\nfont-size: 1.1em;\n}\n\n.editor input, .editor textarea {\n display: block;\n width: 100%;\n font: inherit;\n}\n\n.editorFooter {\n padding: 0.25em 0em;\n font-size: .9em;\n}\n\n.editorFooter .button {\npadding-top: 0px; padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\npadding: 0;\nmargin: 1px 0px 1px 0px;\n}\n\n.sparkline {\n line-height: 1em;\n}\n\n.sparktick {\n outline: 0;\n}\n\n.zoomer {\n font-size: 1.1em;\n position: absolute;\n padding: 1em;\n}\n\n.cascade {\n font-size: 1.1em;\n position: absolute;\n overflow: hidden;\n}\n/*}}}*/",
++ StyleSheetPrint: "/*{{{*/\n@media print {\n#mainMenu, #sidebar, #messageArea, .toolbar {display: none ! important;}\n#displayArea {margin: 1em 1em 0em 1em;}\n/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */\nnoscript {display:none;}\n}\n/*}}}*/",
++ PageTemplate: "<!--{{{-->\n<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->",
++ ViewTemplate: "<!--{{{-->\n<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler permalink references jump'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date [[DD MMM YYYY]]'></span>)</div>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>\n<!--}}}-->",
++ EditTemplate: "<!--{{{-->\n<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>\n<div class='title' macro='view title'></div>\n<div class='editor' macro='edit title'></div>\n<div class='editor' macro='edit text'></div>\n<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>\n<!--}}}-->",
++ MarkupPreHead: "<!--{{{-->\n<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>\n<!--}}}-->",
++ MarkupPostHead: "",
++ MarkupPreBody: "",
++ MarkupPostBody: ""
++ };
++
++// ---------------------------------------------------------------------------------
++// Translateable strings
++// ---------------------------------------------------------------------------------
++
++// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone
++
++merge(config.options,{
++ txtUserName: "YourName"});
++
++merge(config.messages,{
++ customConfigError: "Problems were encountered loading plugins. See PluginManager for details",
++ pluginError: "Error: %0",
++ pluginDisabled: "Not executed because disabled via 'systemConfigDisable' tag",
++ pluginForced: "Executed because forced via 'systemConfigForce' tag",
++ pluginVersionError: "Not executed because this plugin needs a newer version of TiddlyWiki",
++ nothingSelected: "Nothing is selected. You must select one or more items first",
++ savedSnapshotError: "It appears that this TiddlyWiki has been incorrectly saved. Please see http://www.tiddlywiki.com/#DownloadSoftware for details",
++ subtitleUnknown: "(unknown)",
++ undefinedTiddlerToolTip: "The tiddler '%0' doesn't yet exist",
++ shadowedTiddlerToolTip: "The tiddler '%0' doesn't yet exist, but has a pre-defined shadow value",
++ tiddlerLinkTooltip: "%0 - %1, %2",
++ externalLinkTooltip: "External link to %0",
++ noTags: "There are no tagged tiddlers",
++ notFileUrlError: "You need to save this TiddlyWiki to a file before you can save changes",
++ cantSaveError: "It's not possible to save changes. This could be because your browser doesn't support saving (instead, use FireFox if you can), or because the pathname to your TiddlyWiki file contains illegal characters",
++ invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
++ backupSaved: "Backup saved",
++ backupFailed: "Failed to save backup file",
++ rssSaved: "RSS feed saved",
++ rssFailed: "Failed to save RSS feed file",
++ emptySaved: "Empty template saved",
++ emptyFailed: "Failed to save empty template file",
++ mainSaved: "Main TiddlyWiki file saved",
++ mainFailed: "Failed to save main TiddlyWiki file. Your changes have not been saved",
++ macroError: "Error in macro <<%0>>",
++ macroErrorDetails: "Error while executing macro <<%0>>:\n%1",
++ missingMacro: "No such macro",
++ overwriteWarning: "A tiddler named '%0' already exists. Choose OK to overwrite it",
++ unsavedChangesWarning: "WARNING! There are unsaved changes in TiddlyWiki\n\nChoose OK to save\nChoose CANCEL to discard",
++ confirmExit: "--------------------------------\n\nThere are unsaved changes in TiddlyWiki. If you continue you will lose those changes\n\n--------------------------------",
++ saveInstructions: "SaveChanges",
++ unsupportedTWFormat: "Unsupported TiddlyWiki format '%0'",
++ tiddlerSaveError: "Error when saving tiddler '%0'",
++ tiddlerLoadError: "Error when loading tiddler '%0'",
++ wrongSaveFormat: "Cannot save with storage format '%0'. Using standard format for save.",
++ invalidFieldName: "Invalid field name %0",
++ fieldCannotBeChanged: "Field '%0' cannot be changed"});
++
++merge(config.messages.messageClose,{
++ text: "close",
++ tooltip: "close this message area"});
++
++config.messages.dates.months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November","December"];
++config.messages.dates.days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
++config.messages.dates.shortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
++config.messages.dates.shortDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
++
++merge(config.views.wikified.tag,{
++ labelNoTags: "no tags",
++ labelTags: "tags: ",
++ openTag: "Open tag '%0'",
++ tooltip: "Show tiddlers tagged with '%0'",
++ openAllText: "Open all",
++ openAllTooltip: "Open all of these tiddlers",
++ popupNone: "No other tiddlers tagged with '%0'"});
++
++merge(config.views.wikified,{
++ defaultText: "The tiddler '%0' doesn't yet exist. Double-click to create it",
++ defaultModifier: "(missing)",
++ shadowModifier: "(built-in shadow tiddler)",
++ createdPrompt: "created"});
++
++merge(config.views.editor,{
++ tagPrompt: "Type tags separated with spaces, [[use double square brackets]] if necessary, or add existing",
++ defaultText: "Type the text for '%0'"});
++
++merge(config.views.editor.tagChooser,{
++ text: "tags",
++ tooltip: "Choose existing tags to add to this tiddler",
++ popupNone: "There are no tags defined",
++ tagTooltip: "Add the tag '%0'"});
++
++merge(config.macros.search,{
++ label: "search",
++ prompt: "Search this TiddlyWiki",
++ accessKey: "F",
++ successMsg: "%0 tiddlers found matching %1",
++ failureMsg: "No tiddlers found matching %0"});
++
++merge(config.macros.tagging,{
++ label: "tagging: ",
++ labelNotTag: "not tagging",
++ tooltip: "List of tiddlers tagged with '%0'"});
++
++merge(config.macros.timeline,{
++ dateFormat: "DD MMM YYYY"});
++
++merge(config.macros.allTags,{
++ tooltip: "Show tiddlers tagged with '%0'",
++ noTags: "There are no tagged tiddlers"});
++
++config.macros.list.all.prompt = "All tiddlers in alphabetical order";
++config.macros.list.missing.prompt = "Tiddlers that have links to them but are not defined";
++config.macros.list.orphans.prompt = "Tiddlers that are not linked to from any other tiddlers";
++config.macros.list.shadowed.prompt = "Tiddlers shadowed with default contents";
++
++merge(config.macros.closeAll,{
++ label: "close all",
++ prompt: "Close all displayed tiddlers (except any that are being edited)"});
++
++merge(config.macros.permaview,{
++ label: "permaview",
++ prompt: "Link to an URL that retrieves all the currently displayed tiddlers"});
++
++merge(config.macros.saveChanges,{
++ label: "save changes",
++ prompt: "Save all tiddlers to create a new TiddlyWiki",
++ accessKey: "S"});
++
++merge(config.macros.newTiddler,{
++ label: "new tiddler",
++ prompt: "Create a new tiddler",
++ title: "New Tiddler",
++ accessKey: "N"});
++
++merge(config.macros.newJournal,{
++ label: "new journal",
++ prompt: "Create a new tiddler from the current date and time",
++ accessKey: "J"});
++
++merge(config.macros.plugins,{
++ skippedText: "(This plugin has not been executed because it was added since startup)",
++ noPluginText: "There are no plugins installed",
++ confirmDeleteText: "Are you sure you want to delete these tiddlers:\n\n%0",
++ listViewTemplate : {
++ columns: [
++ {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
++ {name: 'Title', field: 'title', tiddlerLink: 'title', title: "Title", type: 'TiddlerLink'},
++ {name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},
++ {name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},
++ {name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
++ {name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
++ {name: 'Log', field: 'log', title: "Log", type: 'StringList'}
++ ],
++ rowClasses: [
++ {className: 'error', field: 'error'},
++ {className: 'warning', field: 'warning'}
++ ],
++ actions: [
++ {caption: "More actions...", name: ''},
++ {caption: "Remove systemConfig tag", name: 'remove'},
++ {caption: "Delete these tiddlers forever", name: 'delete'}
++ ]}
++ });
++
++merge(config.macros.refreshDisplay,{
++ label: "refresh",
++ prompt: "Redraw the entire TiddlyWiki display"
++ });
++
++merge(config.macros.importTiddlers,{
++ readOnlyWarning: "You cannot import tiddlers into a read-only TiddlyWiki. Try opening the TiddlyWiki file from a file:// URL",
++ defaultPath: "http://www.tiddlywiki.com/index.html",
++ fetchLabel: "fetch",
++ fetchPrompt: "Fetch the tiddlywiki file",
++ fetchError: "There were problems fetching the tiddlywiki file",
++ confirmOverwriteText: "Are you sure you want to overwrite these tiddlers:\n\n%0",
++ wizardTitle: "Import tiddlers from another TiddlyWiki file",
++ step1: "Step 1: Locate the TiddlyWiki file",
++ step1prompt: "Enter the URL or pathname here: ",
++ step1promptFile: "...or browse for a file: ",
++ step1promptFeeds: "...or select a pre-defined feed: ",
++ step1feedPrompt: "Choose...",
++ step2: "Step 2: Loading TiddlyWiki file",
++ step2Text: "Please wait while the file is loaded from: %0",
++ step3: "Step 3: Choose the tiddlers to import",
++ step4: "%0 tiddler(s) imported",
++ step5: "Done",
++ listViewTemplate: {
++ columns: [
++ {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
++ {name: 'Title', field: 'title', title: "Title", type: 'String'},
++ {name: 'Snippet', field: 'text', title: "Snippet", type: 'String'},
++ {name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
++ ],
++ rowClasses: [
++ ],
++ actions: [
++ {caption: "More actions...", name: ''},
++ {caption: "Import these tiddlers", name: 'import'}
++ ]}
++ });
++
++merge(config.commands.closeTiddler,{
++ text: "close",
++ tooltip: "Close this tiddler"});
++
++merge(config.commands.closeOthers,{
++ text: "close others",
++ tooltip: "Close all other tiddlers"});
++
++merge(config.commands.editTiddler,{
++ text: "edit",
++ tooltip: "Edit this tiddler",
++ readOnlyText: "view",
++ readOnlyTooltip: "View the source of this tiddler"});
++
++merge(config.commands.saveTiddler,{
++ text: "done",
++ tooltip: "Save changes to this tiddler"});
++
++merge(config.commands.cancelTiddler,{
++ text: "cancel",
++ tooltip: "Undo changes to this tiddler",
++ warning: "Are you sure you want to abandon your changes to '%0'?",
++ readOnlyText: "done",
++ readOnlyTooltip: "View this tiddler normally"});
++
++merge(config.commands.deleteTiddler,{
++ text: "delete",
++ tooltip: "Delete this tiddler",
++ warning: "Are you sure you want to delete '%0'?"});
++
++merge(config.commands.permalink,{
++ text: "permalink",
++ tooltip: "Permalink for this tiddler"});
++
++merge(config.commands.references,{
++ text: "references",
++ tooltip: "Show tiddlers that link to this one",
++ popupNone: "No references"});
++
++merge(config.commands.jump,{
++ text: "jump",
++ tooltip: "Jump to another open tiddler"});
++
++merge(config.shadowTiddlers,{
++ DefaultTiddlers: "GettingStarted",
++ MainMenu: "GettingStarted",
++ SiteTitle: "My TiddlyWiki",
++ SiteSubtitle: "a reusable non-linear personal web notebook",
++ SiteUrl: "http://www.tiddlywiki.com/",
++ GettingStarted: "To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:\n* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)\n* MainMenu: The menu (usually on the left)\n* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened\nYou'll also need to enter your username for signing your edits: <<option txtUserName>>",
++ SideBarOptions: "<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>",
++ OptionsPanel: "These InterfaceOptions for customising TiddlyWiki are saved in your browser\n\nYour username for signing your edits. Write it as a WikiWord (eg JoeBloggs)\n\n<<option txtUserName>>\n<<option chkSaveBackups>> SaveBackups\n<<option chkAutoSave>> AutoSave\n<<option chkRegExpSearch>> RegExpSearch\n<<option chkCaseSensitiveSearch>> CaseSensitiveSearch\n<<option chkAnimate>> EnableAnimations\n\n----\nAdvancedOptions\nPluginManager\nImportTiddlers",
++ AdvancedOptions: "<<option chkGenerateAnRssFeed>> GenerateAnRssFeed\n<<option chkOpenInNewWindow>> OpenLinksInNewWindow\n<<option chkSaveEmptyTemplate>> SaveEmptyTemplate\n<<option chkToggleLinks>> Clicking on links to tiddlers that are already open causes them to close\n^^(override with Control or other modifier key)^^\n<<option chkHttpReadOnly>> HideEditingFeatures when viewed over HTTP\n<<option chkForceMinorUpdate>> Treat edits as MinorChanges by preserving date and time\n^^(override with Shift key when clicking 'done' or by pressing Ctrl-Shift-Enter^^\n<<option chkConfirmDelete>> ConfirmBeforeDeleting\nMaximum number of lines in a tiddler edit box: <<option txtMaxEditRows>>\nFolder name for backup files: <<option txtBackupFolder>>\n<<option chkInsertTabs>> Use tab key to insert tab characters instead of jumping to next field",
++ SideBarTabs: "<<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>",
++ TabTimeline: "<<timeline>>",
++ TabAll: "<<list all>>",
++ TabTags: "<<allTags>>",
++ TabMore: "<<tabs txtMoreTab Missing 'Missing tiddlers' TabMoreMissing Orphans 'Orphaned tiddlers' TabMoreOrphans Shadowed 'Shadowed tiddlers' TabMoreShadowed>>",
++ TabMoreMissing: "<<list missing>>",
++ TabMoreOrphans: "<<list orphans>>",
++ TabMoreShadowed: "<<list shadowed>>",
++ PluginManager: "<<plugins>>",
++ ImportTiddlers: "<<importTiddlers>>"});
++
++// ---------------------------------------------------------------------------------
++// Main
++// ---------------------------------------------------------------------------------
++
++var params = null; // Command line parameters
++var store = null; // TiddlyWiki storage
++var story = null; // Main story
++var formatter = null; // Default formatters for the wikifier
++config.parsers = {}; // Hashmap of alternative parsers for the wikifier
++var anim = new Animator(); // Animation engine
++var readOnly = false; // Whether we're in readonly mode
++var highlightHack = null; // Embarrassing hack department...
++var hadConfirmExit = false; // Don't warn more than once
++var safeMode = false; // Disable all plugins and cookies
++var installedPlugins = []; // Information filled in when plugins are executed
++var startingUp = false; // Whether we're in the process of starting up
++var pluginInfo,tiddler; // Used to pass information to plugins in loadPlugins()
++
++// Whether to use the JavaSaver applet
++var useJavaSaver = config.browser.isSafari || config.browser.isOpera;
++
++// Starting up
++function main()
++{
++ var now, then = new Date();
++ startingUp = true;
++ window.onbeforeunload = function(e) {if(window.confirmExit) return confirmExit();};
++ params = getParameters();
++ if(params)
++ params = params.parseParams("open",null,false);
++ store = new TiddlyWiki();
++ invokeParamifier(params,"oninit");
++ story = new Story("tiddlerDisplay","tiddler");
++ addEvent(document,"click",Popup.onDocumentClick);
++ saveTest();
++ loadOptionsCookie();
++ for(var s=0; s<config.notifyTiddlers.length; s++)
++ store.addNotification(config.notifyTiddlers[s].name,config.notifyTiddlers[s].notify);
++ store.loadFromDiv("storeArea","store",true);
++ invokeParamifier(params,"onload");
++ var pluginProblem = loadPlugins();
++ formatter = new Formatter(config.formatters);
++ readOnly = (window.location.protocol == "file:") ? false : config.options.chkHttpReadOnly;
++ invokeParamifier(params,"onconfig");
++ store.notifyAll();
++ restart();
++ if(pluginProblem)
++ {
++ story.displayTiddler(null,"PluginManager");
++ displayMessage(config.messages.customConfigError);
++ }
++ now = new Date();
++ if(config.displayStartupTime)
++ displayMessage("TiddlyWiki startup in " + (now-then)/1000 + " seconds");
++ startingUp = false;
++}
++
++// Restarting
++function restart()
++{
++ invokeParamifier(params,"onstart");
++ if(story.isEmpty())
++ {
++ var defaultParams = store.getTiddlerText("DefaultTiddlers").parseParams("open",null,false);
++ invokeParamifier(defaultParams,"onstart");
++ }
++ window.scrollTo(0,0);
++}
++
++function saveTest()
++{
++ var saveTest = document.getElementById("saveTest");
++ if(saveTest.hasChildNodes())
++ alert(config.messages.savedSnapshotError);
++ saveTest.appendChild(document.createTextNode("savetest"));
++}
++
++function loadPlugins()
++{
++ if(safeMode)
++ return false;
++ var configTiddlers = store.getTaggedTiddlers("systemConfig");
++ installedPlugins = [];
++ var hadProblem = false;
++ for(var t=0; t<configTiddlers.length; t++)
++ {
++ tiddler = configTiddlers[t];
++ pluginInfo = getPluginInfo(tiddler);
++ if(isPluginExecutable(pluginInfo))
++ {
++ pluginInfo.executed = true;
++ pluginInfo.error = false;
++ try
++ {
++ if(tiddler.text && tiddler.text != "")
++ window.eval(tiddler.text);
++ }
++ catch(e)
++ {
++ pluginInfo.log.push(config.messages.pluginError.format([exceptionText(e)]));
++ pluginInfo.error = true;
++ hadProblem = true;
++ }
++ }
++ else
++ pluginInfo.warning = true;
++ installedPlugins.push(pluginInfo);
++ }
++ return hadProblem;
++}
++
++function getPluginInfo(tiddler)
++{
++ var p = store.getTiddlerSlices(tiddler.title,["Name","Description","Version","CoreVersion","Date","Source","Author","License","Browsers"]);
++ p.tiddler = tiddler;
++ p.title = tiddler.title;
++ p.log = [];
++ return p;
++}
++
++// Check that a particular plugin is valid for execution
++function isPluginExecutable(plugin)
++{
++ if(plugin.tiddler.isTagged("systemConfigDisable"))
++ return verifyTail(plugin,false,config.messages.pluginDisabled);
++ if(plugin.tiddler.isTagged("systemConfigForce"))
++ return verifyTail(plugin,true,config.messages.pluginForced);
++ if(plugin["CoreVersion"])
++ {
++ var coreVersion = plugin["CoreVersion"].split(".");
++ var w = parseInt(coreVersion[0]) - version.major;
++ if(w == 0 && coreVersion[1])
++ w = parseInt(coreVersion[1]) - version.minor;
++ if(w == 0 && coreVersion[2])
++ w = parseInt(coreVersion[2]) - version.revision;
++ if(w > 0)
++ return verifyTail(plugin,false,config.messages.pluginVersionError);
++ }
++ return true;
++}
++
++function verifyTail(plugin,result,message)
++{
++ plugin.log.push(message);
++ return result;
++}
++
++function invokeMacro(place,macro,params,wikifier,tiddler)
++{
++ try
++ {
++ var m = config.macros[macro];
++ if(m && m.handler)
++ m.handler(place,macro,params.readMacroParams(),wikifier,params,tiddler);
++ else
++ createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,config.messages.missingMacro]));
++ }
++ catch(ex)
++ {
++ createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,ex.toString()]));
++ }
++}
++
++// ---------------------------------------------------------------------------------
++// Paramifiers
++// ---------------------------------------------------------------------------------
++
++function getParameters()
++{
++ var p = null;
++ if(window.location.hash)
++ {
++ p = decodeURI(window.location.hash.substr(1));
++ if(config.browser.firefoxDate != null && config.browser.firefoxDate[1] < "20051111")
++ p = convertUTF8ToUnicode(p);
++ }
++ return p;
++}
++
++function invokeParamifier(params,handler)
++{
++ if(!params || params.length == undefined || params.length <= 1)
++ return;
++ for(var t=1; t<params.length; t++)
++ {
++ var p = config.paramifiers[params[t].name];
++ if(p && p[handler] instanceof Function)
++ p[handler](params[t].value);
++ }
++}
++
++config.paramifiers = {};
++
++config.paramifiers.start = {
++ oninit: function(v) {
++ safeMode = v.toLowerCase() == "safe";
++ }
++};
++
++config.paramifiers.open = {
++ onstart: function(v) {
++ story.displayTiddler("bottom",v,null,false,false);
++ }
++};
++
++config.paramifiers.story = {
++ onstart: function(v) {
++ var list = store.getTiddlerText(v,"").parseParams("open",null,false);
++ invokeParamifier(list,"onstart");
++ }
++};
++
++config.paramifiers.search = {
++ onstart: function(v) {
++ story.search(v,false,false);
++ }
++};
++
++config.paramifiers.searchRegExp = {
++ onstart: function(v) {
++ story.prototype.search(v,false,true);
++ }
++};
++
++config.paramifiers.tag = {
++ onstart: function(v) {
++ var tagged = store.getTaggedTiddlers(v,"title");
++ for(var t=0; t<tagged.length; t++)
++ story.displayTiddler("bottom",tagged[t].title,null,false,false);
++ }
++};
++
++config.paramifiers.newTiddler = {
++ onstart: function(v) {
++ if(!readOnly)
++ {
++ story.displayTiddler(null,v,DEFAULT_EDIT_TEMPLATE);
++ story.focusTiddler(v,"text");
++ }
++ }
++};
++
++config.paramifiers.newJournal = {
++ onstart: function(v) {
++ if(!readOnly)
++ {
++ var now = new Date();
++ var title = now.formatString(v.trim());
++ story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);
++ story.focusTiddler(title,"text");
++ }
++ }
++};
++
++// ---------------------------------------------------------------------------------
++// Formatter helpers
++// ---------------------------------------------------------------------------------
++
++function Formatter(formatters)
++{
++ this.formatters = [];
++ var pattern = [];
++ for(var n=0; n<formatters.length; n++)
++ {
++ pattern.push("(" + formatters[n].match + ")");
++ this.formatters.push(formatters[n]);
++ }
++ this.formatterRegExp = new RegExp(pattern.join("|"),"mg");
++}
++
++config.formatterHelpers = {
++
++ createElementAndWikify: function(w)
++ {
++ w.subWikifyTerm(createTiddlyElement(w.output,this.element),this.termRegExp);
++ },
++
++ inlineCssHelper: function(w)
++ {
++ var styles = [];
++ config.textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;
++ var lookaheadMatch = config.textPrimitives.cssLookaheadRegExp.exec(w.source);
++ while(lookaheadMatch && lookaheadMatch.index == w.nextMatch)
++ {
++ var s,v;
++ if(lookaheadMatch[1])
++ {
++ s = lookaheadMatch[1].unDash();
++ v = lookaheadMatch[2];
++ }
++ else
++ {
++ s = lookaheadMatch[3].unDash();
++ v = lookaheadMatch[4];
++ }
++ if (s=="bgcolor")
++ s = "backgroundColor";
++ styles.push({style: s, value: v});
++ w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
++ config.textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;
++ lookaheadMatch = config.textPrimitives.cssLookaheadRegExp.exec(w.source);
++ }
++ return styles;
++ },
++
++ applyCssHelper: function(e,styles)
++ {
++ for(var t=0; t< styles.length; t++)
++ {
++ try
++ {
++ e.style[styles[t].style] = styles[t].value;
++ }
++ catch (ex)
++ {
++ }
++ }
++ },
++
++ enclosedTextHelper: function(w)
++ {
++ this.lookaheadRegExp.lastIndex = w.matchStart;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
++ if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
++ {
++ var text = lookaheadMatch[1];
++ if(config.browser.isIE)
++ text = text.replace(/\n/g,"\r");
++ createTiddlyElement(w.output,this.element,null,null,text);
++ w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
++ }
++ },
++
++ isExternalLink: function(link)
++ {
++ if(store.tiddlerExists(link) || store.isShadowTiddler(link))
++ {
++ //# Definitely not an external link
++ return false;
++ }
++ var urlRegExp = new RegExp(config.textPrimitives.urlPattern,"mg");
++ if(urlRegExp.exec(link))
++ {
++ // Definitely an external link
++ return true;
++ }
++ if (link.indexOf(".")!=-1 || link.indexOf("\\")!=-1 || link.indexOf("/")!=-1)
++ {
++ //# Link contains . / or \ so is probably an external link
++ return true;
++ }
++ //# Otherwise assume it is not an external link
++ return false;
++ }
++
++};
++
++// ---------------------------------------------------------------------------------
++// Standard formatters
++// ---------------------------------------------------------------------------------
++
++config.formatters = [
++{
++ name: "table",
++ match: "^\\|(?:[^\\n]*)\\|(?:[fhck]?)$",
++ lookaheadRegExp: /^\|([^\n]*)\|([fhck]?)$/mg,
++ rowTermRegExp: /(\|(?:[fhck]?)$\n?)/mg,
++ cellRegExp: /(?:\|([^\n\|]*)\|)|(\|[fhck]?$\n?)/mg,
++ cellTermRegExp: /((?:\x20*)\|)/mg,
++ rowTypes: {"c":"caption", "h":"thead", "":"tbody", "f":"tfoot"},
++
++ handler: function(w)
++ {
++ var table = createTiddlyElement(w.output,"table");
++ var prevColumns = [];
++ var currRowType = null;
++ var rowContainer;
++ var rowCount = 0;
++ w.nextMatch = w.matchStart;
++ this.lookaheadRegExp.lastIndex = w.nextMatch;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
++ while(lookaheadMatch && lookaheadMatch.index == w.nextMatch)
++ {
++ var nextRowType = lookaheadMatch[2];
++ if(nextRowType == "k")
++ {
++ table.className = lookaheadMatch[1];
++ w.nextMatch += lookaheadMatch[0].length+1;
++ }
++ else
++ {
++ if(nextRowType != currRowType)
++ {
++ rowContainer = createTiddlyElement(table,this.rowTypes[nextRowType]);
++ currRowType = nextRowType;
++ }
++ if(currRowType == "c")
++ {
++ // Caption
++ w.nextMatch++;
++ if(rowContainer != table.firstChild)
++ table.insertBefore(rowContainer,table.firstChild);
++ rowContainer.setAttribute("align",rowCount == 0?"top":"bottom");
++ w.subWikifyTerm(rowContainer,this.rowTermRegExp);
++ }
++ else
++ {
++ this.rowHandler(w,createTiddlyElement(rowContainer,"tr",null,(rowCount&1)?"oddRow":"evenRow"),prevColumns);
++ rowCount++;
++ }
++ }
++ this.lookaheadRegExp.lastIndex = w.nextMatch;
++ lookaheadMatch = this.lookaheadRegExp.exec(w.source);
++ }
++ },
++ rowHandler: function(w,e,prevColumns)
++ {
++ var col = 0;
++ var colSpanCount = 1;
++ var prevCell = null;
++ this.cellRegExp.lastIndex = w.nextMatch;
++ var cellMatch = this.cellRegExp.exec(w.source);
++ while(cellMatch && cellMatch.index == w.nextMatch)
++ {
++ if(cellMatch[1] == "~")
++ {
++ // Rowspan
++ var last = prevColumns[col];
++ if(last)
++ {
++ last.rowSpanCount++;
++ last.element.setAttribute("rowspan",last.rowSpanCount);
++ last.element.setAttribute("rowSpan",last.rowSpanCount); // Needed for IE
++ last.element.valign = "center";
++ }
++ w.nextMatch = this.cellRegExp.lastIndex-1;
++ }
++ else if(cellMatch[1] == ">")
++ {
++ // Colspan
++ colSpanCount++;
++ w.nextMatch = this.cellRegExp.lastIndex-1;
++ }
++ else if(cellMatch[2])
++ {
++ // End of row
++ if(prevCell && colSpanCount > 1)
++ {
++ prevCell.setAttribute("colspan",colSpanCount);
++ prevCell.setAttribute("colSpan",colSpanCount); // Needed for IE
++ }
++ w.nextMatch = this.cellRegExp.lastIndex;
++ break;
++ }
++ else
++ {
++ // Cell
++ w.nextMatch++;
++ var styles = config.formatterHelpers.inlineCssHelper(w);
++ var spaceLeft = false;
++ var chr = w.source.substr(w.nextMatch,1);
++ while(chr == " ")
++ {
++ spaceLeft = true;
++ w.nextMatch++;
++ chr = w.source.substr(w.nextMatch,1);
++ }
++ var cell;
++ if(chr == "!")
++ {
++ cell = createTiddlyElement(e,"th");
++ w.nextMatch++;
++ }
++ else
++ cell = createTiddlyElement(e,"td");
++ prevCell = cell;
++ prevColumns[col] = {rowSpanCount:1, element:cell};
++ if(colSpanCount > 1)
++ {
++ cell.setAttribute("colspan",colSpanCount);
++ cell.setAttribute("colSpan",colSpanCount); // Needed for IE
++ colSpanCount = 1;
++ }
++ config.formatterHelpers.applyCssHelper(cell,styles);
++ w.subWikifyTerm(cell,this.cellTermRegExp);
++ if(w.matchText.substr(w.matchText.length-2,1) == " ") // spaceRight
++ cell.align = spaceLeft ? "center" : "left";
++ else if(spaceLeft)
++ cell.align = "right";
++ w.nextMatch--;
++ }
++ col++;
++ this.cellRegExp.lastIndex = w.nextMatch;
++ cellMatch = this.cellRegExp.exec(w.source);
++ }
++ }
++},
++
++{
++ name: "heading",
++ match: "^!{1,5}",
++ termRegExp: /(\n)/mg,
++ handler: function(w)
++ {
++ w.subWikifyTerm(createTiddlyElement(w.output,"h" + w.matchLength),this.termRegExp);
++ }
++},
++
++{
++ name: "list",
++ match: "^(?:(?:(?:\\*)|(?:#)|(?:;)|(?::))+)",
++ lookaheadRegExp: /^(?:(?:(\*)|(#)|(;)|(:))+)/mg,
++ termRegExp: /(\n)/mg,
++ handler: function(w)
++ {
++ var placeStack = [w.output];
++ var currLevel = 0, currType = null;
++ var listLevel, listType, itemType;
++ w.nextMatch = w.matchStart;
++ this.lookaheadRegExp.lastIndex = w.nextMatch;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
++ while(lookaheadMatch && lookaheadMatch.index == w.nextMatch)
++ {
++ if(lookaheadMatch[1])
++ {
++ listType = "ul";
++ itemType = "li";
++ }
++ else if(lookaheadMatch[2])
++ {
++ listType = "ol";
++ itemType = "li";
++ }
++ else if(lookaheadMatch[3])
++ {
++ listType = "dl";
++ itemType = "dt";
++ }
++ else if(lookaheadMatch[4])
++ {
++ listType = "dl";
++ itemType = "dd";
++ }
++ listLevel = lookaheadMatch[0].length;
++ w.nextMatch += lookaheadMatch[0].length;
++ if(listLevel > currLevel)
++ {
++ for(var t=currLevel; t<listLevel; t++)
++ placeStack.push(createTiddlyElement(placeStack[placeStack.length-1],listType));
++ }
++ else if(listLevel < currLevel)
++ {
++ for(var t=currLevel; t>listLevel; t--)
++ placeStack.pop();
++ }
++ else if(listLevel == currLevel && listType != currType)
++ {
++ placeStack.pop();
++ placeStack.push(createTiddlyElement(placeStack[placeStack.length-1],listType));
++ }
++ currLevel = listLevel;
++ currType = listType;
++ var e = createTiddlyElement(placeStack[placeStack.length-1],itemType);
++ w.subWikifyTerm(e,this.termRegExp);
++ this.lookaheadRegExp.lastIndex = w.nextMatch;
++ lookaheadMatch = this.lookaheadRegExp.exec(w.source);
++ }
++ }
++},
++
++{
++ name: "quoteByBlock",
++ match: "^<<<\\n",
++ termRegExp: /(^<<<(\n|$))/mg,
++ element: "blockquote",
++ handler: config.formatterHelpers.createElementAndWikify
++},
++
++{
++ name: "quoteByLine",
++ match: "^>+",
++ lookaheadRegExp: /^>+/mg,
++ termRegExp: /(\n)/mg,
++ element: "blockquote",
++ handler: function(w)
++ {
++ var placeStack = [w.output];
++ var currLevel = 0;
++ var newLevel = w.matchLength;
++ var t;
++ do {
++ if(newLevel > currLevel)
++ {
++ for(t=currLevel; t<newLevel; t++)
++ placeStack.push(createTiddlyElement(placeStack[placeStack.length-1],this.element));
++ }
++ else if(newLevel < currLevel)
++ {
++ for(t=currLevel; t>newLevel; t--)
++ placeStack.pop();
++ }
++ currLevel = newLevel;
++ w.subWikifyTerm(placeStack[placeStack.length-1],this.termRegExp);
++ createTiddlyElement(placeStack[placeStack.length-1],"br");
++ this.lookaheadRegExp.lastIndex = w.nextMatch;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
++ var matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;
++ if(matched)
++ {
++ newLevel = lookaheadMatch[0].length;
++ w.nextMatch += lookaheadMatch[0].length;
++ }
++ } while(matched);
++ }
++},
++
++{
++ name: "rule",
++ match: "^----+$\\n?",
++ handler: function(w)
++ {
++ createTiddlyElement(w.output,"hr");
++ }
++},
++
++{
++ name: "monospacedByLine",
++ match: "^\\{\\{\\{\\n",
++ lookaheadRegExp: /^\{\{\{\n((?:^[^\n]*\n)+?)(^\}\}\}$\n?)/mg,
++ element: "pre",
++ handler: config.formatterHelpers.enclosedTextHelper
++},
++
++{
++ name: "monospacedByLineForCSS",
++ match: "^/\\*[\\{]{3}\\*/\\n",
++ lookaheadRegExp: /\/\*[\{]{3}\*\/\n*((?:^[^\n]*\n)+?)(\n*^\/\*[\}]{3}\*\/$\n?)/mg,
++ element: "pre",
++ handler: config.formatterHelpers.enclosedTextHelper
++},
++
++{
++ name: "monospacedByLineForPlugin",
++ match: "^//\\{\\{\\{\\n",
++ lookaheadRegExp: /^\/\/\{\{\{\n\n*((?:^[^\n]*\n)+?)(\n*^\/\/\}\}\}$\n?)/mg,
++ element: "pre",
++ handler: config.formatterHelpers.enclosedTextHelper
++},
++
++{
++ name: "monospacedByLineForTemplate",
++ match: "^<!--[\\{]{3}-->\\n",
++ lookaheadRegExp: /<!--[\{]{3}-->\n*((?:^[^\n]*\n)+?)(\n*^<!--[\}]{3}-->$\n?)/mg,
++ element: "pre",
++ handler: config.formatterHelpers.enclosedTextHelper
++},
++
++{
++ name: "wikifyCommentForPlugin",
++ match: "^/\\*\\*\\*\\n",
++ termRegExp: /(^\*\*\*\/\n)/mg,
++ handler: function(w)
++ {
++ w.subWikifyTerm(w.output,this.termRegExp);
++ }
++},
++
++{
++ name: "wikifyCommentForTemplate",
++ match: "^<!---\\n",
++ termRegExp: /(^--->\n)/mg,
++ handler: function(w)
++ {
++ w.subWikifyTerm(w.output,this.termRegExp);
++ }
++},
++
++{
++ name: "macro",
++ match: "<<",
++ lookaheadRegExp: /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,
++ handler: function(w)
++ {
++ this.lookaheadRegExp.lastIndex = w.matchStart;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
++ if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[1])
++ {
++ w.nextMatch = this.lookaheadRegExp.lastIndex;
++ invokeMacro(w.output,lookaheadMatch[1],lookaheadMatch[2],w,w.tiddler);
++ }
++ }
++},
++
++{
++ name: "prettyLink",
++ match: "\\[\\[",
++ lookaheadRegExp: /\[\[(.*?)(?:\|(~)?(.*?))?\]\]/mg,
++ handler: function(w)
++ {
++ this.lookaheadRegExp.lastIndex = w.matchStart;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
++ if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
++ {
++ var e;
++ var text = lookaheadMatch[1];
++ if(lookaheadMatch[3])
++ {
++ // Pretty bracketted link
++ var link = lookaheadMatch[3];
++ e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link))
++ ? createExternalLink(w.output,link)
++ : createTiddlyLink(w.output,link,false,null,w.isStatic);
++ }
++ else
++ {
++ // Simple bracketted link
++ e = createTiddlyLink(w.output,text,false,null,w.isStatic);
++ }
++ createTiddlyText(e,text);
++ w.nextMatch = this.lookaheadRegExp.lastIndex;
++ }
++ }
++},
++
++{
++ name: "unWikiLink",
++ match: config.textPrimitives.unWikiLink+config.textPrimitives.wikiLink,
++ handler: function(w)
++ {
++ w.outputText(w.output,w.matchStart+1,w.nextMatch);
++ }
++},
++
++{
++ name: "wikiLink",
++ match: config.textPrimitives.wikiLink,
++ handler: function(w)
++ {
++ if(w.matchStart > 0)
++ {
++ var preRegExp = new RegExp(config.textPrimitives.anyLetterStrict,"mg");
++ preRegExp.lastIndex = w.matchStart-1;
++ var preMatch = preRegExp.exec(w.source);
++ if(preMatch.index == w.matchStart-1)
++ {
++ w.outputText(w.output,w.matchStart,w.nextMatch);
++ return;
++ }
++ }
++ if(w.autoLinkWikiWords == true || store.isShadowTiddler(w.matchText))
++ {
++ var link = createTiddlyLink(w.output,w.matchText,false,null,w.isStatic);
++ w.outputText(link,w.matchStart,w.nextMatch);
++ }
++ else
++ {
++ w.outputText(w.output,w.matchStart,w.nextMatch);
++ }
++ }
++},
++
++{
++ name: "urlLink",
++ match: config.textPrimitives.urlPattern,
++ handler: function(w)
++ {
++ w.outputText(createExternalLink(w.output,w.matchText),w.matchStart,w.nextMatch);
++ }
++},
++
++{
++ name: "image",
++ match: "\\[[<>]?[Ii][Mm][Gg]\\[",
++ lookaheadRegExp: /\[(<?)(>?)[Ii][Mm][Gg]\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg,
++ handler: function(w)
++ {
++ this.lookaheadRegExp.lastIndex = w.matchStart;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
++ if(lookaheadMatch && lookaheadMatch.index == w.matchStart) // Simple bracketted link
++ {
++ var e = w.output;
++ if(lookaheadMatch[5])
++ {
++ var link = lookaheadMatch[5];
++ e = config.formatterHelpers.isExternalLink(link) ? createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic);
++ addClass(e,"imageLink");
++ }
++ var img = createTiddlyElement(e,"img");
++ if(lookaheadMatch[1])
++ img.align = "left";
++ else if(lookaheadMatch[2])
++ img.align = "right";
++ if(lookaheadMatch[3])
++ img.title = lookaheadMatch[3];
++ img.src = lookaheadMatch[4];
++ w.nextMatch = this.lookaheadRegExp.lastIndex;
++ }
++ }
++},
++
++{
++ name: "html",
++ match: "<[Hh][Tt][Mm][Ll]>",
++ lookaheadRegExp: /<[Hh][Tt][Mm][Ll]>((?:.|\n)*?)<\/[Hh][Tt][Mm][Ll]>/mg,
++ handler: function(w)
++ {
++ this.lookaheadRegExp.lastIndex = w.matchStart;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
++ if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
++ {
++ createTiddlyElement(w.output,"span").innerHTML = lookaheadMatch[1];
++ w.nextMatch = this.lookaheadRegExp.lastIndex;
++ }
++ }
++},
++
++{
++ name: "commentByBlock",
++ match: "/%",
++ lookaheadRegExp: /\/%((?:.|\n)*?)%\//mg,
++ handler: function(w)
++ {
++ this.lookaheadRegExp.lastIndex = w.matchStart;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
++ if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
++ w.nextMatch = this.lookaheadRegExp.lastIndex;
++ }
++},
++
++{
++ name: "boldByChar",
++ match: "''",
++ termRegExp: /('')/mg,
++ element: "strong",
++ handler: config.formatterHelpers.createElementAndWikify
++},
++
++{
++ name: "italicByChar",
++ match: "//",
++ termRegExp: /(\/\/)/mg,
++ element: "em",
++ handler: config.formatterHelpers.createElementAndWikify
++},
++
++{
++ name: "underlineByChar",
++ match: "__",
++ termRegExp: /(__)/mg,
++ element: "u",
++ handler: config.formatterHelpers.createElementAndWikify
++},
++
++{
++ name: "strikeByChar",
++ match: "--(?!\\s|$)",
++ termRegExp: /((?!\s)--|(?=\n\n))/mg,
++ element: "strike",
++ handler: config.formatterHelpers.createElementAndWikify
++},
++
++{
++ name: "superscriptByChar",
++ match: "\\^\\^",
++ termRegExp: /(\^\^)/mg,
++ element: "sup",
++ handler: config.formatterHelpers.createElementAndWikify
++},
++
++{
++ name: "subscriptByChar",
++ match: "~~",
++ termRegExp: /(~~)/mg,
++ element: "sub",
++ handler: config.formatterHelpers.createElementAndWikify
++},
++
++{
++ name: "monospacedByChar",
++ match: "\\{\\{\\{",
++ lookaheadRegExp: /\{\{\{((?:.|\n)*?)\}\}\}/mg,
++ handler: function(w)
++ {
++ this.lookaheadRegExp.lastIndex = w.matchStart;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
++ if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
++ {
++ createTiddlyElement(w.output,"code",null,null,lookaheadMatch[1]);
++ w.nextMatch = this.lookaheadRegExp.lastIndex;
++ }
++ }
++},
++
++{
++ name: "styleByChar",
++ match: "@@",
++ termRegExp: /(@@)/mg,
++ handler: function(w)
++ {
++ var e = createTiddlyElement(w.output,"span");
++ var styles = config.formatterHelpers.inlineCssHelper(w);
++ if(styles.length == 0)
++ e.className = "marked";
++ else
++ config.formatterHelpers.applyCssHelper(e,styles);
++ w.subWikifyTerm(e,this.termRegExp);
++ }
++},
++
++{
++ name: "lineBreak",
++ match: "\\n|<br ?/?>",
++ handler: function(w)
++ {
++ createTiddlyElement(w.output,"br");
++ }
++},
++
++{
++ name: "rawText",
++ match: "\\\"{3}|<nowiki>",
++ lookaheadRegExp: /(?:\"{3}|<nowiki>)((?:.|\n)*?)(?:\"{3}|<\/nowiki>)/mg,
++ handler: function(w)
++ {
++ this.lookaheadRegExp.lastIndex = w.matchStart;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
++ if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
++ {
++ createTiddlyElement(w.output,"span",null,null,lookaheadMatch[1]);
++ w.nextMatch = this.lookaheadRegExp.lastIndex;
++ }
++ }
++},
++
++{
++ name: "mdash",
++ match: "--",
++ handler: function(w)
++ {
++ createTiddlyElement(w.output,"span").innerHTML = "&mdash;";
++ }
++},
++
++{
++ name: "htmlEntitiesEncoding",
++ match: "(?:(?:&#?[a-zA-Z0-9]{2,8};|.)(?:&#?(?:x0*(?:3[0-6][0-9a-fA-F]|1D[c-fC-F][0-9a-fA-F]|20[d-fD-F][0-9a-fA-F]|FE2[0-9a-fA-F])|0*(?:76[89]|7[7-9][0-9]|8[0-7][0-9]|761[6-9]|76[2-7][0-9]|84[0-3][0-9]|844[0-7]|6505[6-9]|6506[0-9]|6507[0-1]));)+|&#?[a-zA-Z0-9]{2,8};)",
++ handler: function(w)
++ {
++ createTiddlyElement(w.output,"span").innerHTML = w.matchText;
++ }
++},
++
++{
++ name: "customClasses",
++ match: "\\{\\{",
++ termRegExp: /(\}\}\})/mg,
++ lookaheadRegExp: /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg,
++ handler: function(w)
++ {
++ this.lookaheadRegExp.lastIndex = w.matchStart;
++ var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
++ if(lookaheadMatch)
++ {
++ var e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
++ w.nextMatch = this.lookaheadRegExp.lastIndex;
++ w.subWikifyTerm(e,this.termRegExp);
++ }
++ }
++}
++
++];
++
++// ---------------------------------------------------------------------------------
++// Wikifier
++// ---------------------------------------------------------------------------------
++
++function getParser(tiddler)
++{
++ var f = formatter;
++ if(tiddler!=null)
++ {
++ for(var i in config.parsers)
++ {
++ if(tiddler.isTagged(config.parsers[i].formatTag))
++ {
++ f = config.parsers[i];
++ break;
++ }
++ }
++ }
++ return f;
++}
++
++function wikify(source,output,highlightRegExp,tiddler)
++{
++ if(source && source != "")
++ {
++ var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);
++ wikifier.subWikifyUnterm(output);
++ }
++}
++
++function wikifyStatic(source,highlightRegExp,tiddler)
++{
++ var e = createTiddlyElement(document.body,"div");
++ e.style.display = "none";
++ var html = "";
++ if(source && source != "")
++ {
++ var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);
++ wikifier.isStatic = true;
++ wikifier.subWikifyUnterm(e);
++ html = e.innerHTML;
++ e.parentNode.removeChild(e);
++ }
++ return html;
++}
++
++// Wikify a named tiddler to plain text
++function wikifyPlain(title)
++{
++ if(store.tiddlerExists(title) || store.isShadowTiddler(title))
++ {
++ var wikifier = new Wikifier(store.getTiddlerText(title),formatter,null,store.getTiddler(title));
++ return wikifier.wikifyPlain();
++ }
++ else
++ return "";
++}
++
++// Highlight plain text into an element
++function highlightify(source,output,highlightRegExp)
++{
++ if(source && source != "")
++ {
++ var wikifier = new Wikifier(source,formatter,highlightRegExp);
++ wikifier.outputText(output,0,source.length);
++ }
++}
++
++// Construct a wikifier object
++// source - source string that's going to be wikified
++// formatter - Formatter() object containing the list of formatters to be used
++// highlightRegExp - regular expression of the text string to highlight
++// tiddler - reference to the tiddler that's taken to be the container for this wikification
++function Wikifier(source,formatter,highlightRegExp,tiddler)
++{
++ this.source = source;
++ this.output = null;
++ this.formatter = formatter;
++ this.nextMatch = 0;
++ this.autoLinkWikiWords = tiddler && tiddler.autoLinkWikiWords() == false ? false : true;
++ this.highlightRegExp = highlightRegExp;
++ this.highlightMatch = null;
++ this.isStatic = false;
++ if(highlightRegExp)
++ {
++ highlightRegExp.lastIndex = 0;
++ this.highlightMatch = highlightRegExp.exec(source);
++ }
++ this.tiddler = tiddler;
++}
++
++Wikifier.prototype.wikifyPlain = function()
++{
++ var e = createTiddlyElement(document.body,"div");
++ e.style.display = "none";
++ this.subWikify(e);
++ var text = getPlainText(e);
++ e.parentNode.removeChild(e);
++ return text;
++}
++
++Wikifier.prototype.subWikify = function(output,terminator)
++{
++ // Handle the terminated and unterminated cases separately
++ if (terminator)
++ this.subWikifyTerm(output,new RegExp("(" + terminator + ")","mg"));
++ else
++ this.subWikifyUnterm(output);
++}
++
++Wikifier.prototype.subWikifyUnterm = function(output)
++{
++ // subWikify() can be indirectly recursive, so we need to save the old output pointer
++ var oldOutput = this.output;
++ this.output = output;
++ // Get the first match
++ this.formatter.formatterRegExp.lastIndex = this.nextMatch;
++ var formatterMatch = this.formatter.formatterRegExp.exec(this.source);
++ while(formatterMatch)
++ {
++ // Output any text before the match
++ if(formatterMatch.index > this.nextMatch)
++ this.outputText(this.output,this.nextMatch,formatterMatch.index);
++ // Set the match parameters for the handler
++ this.matchStart = formatterMatch.index;
++ this.matchLength = formatterMatch[0].length;
++ this.matchText = formatterMatch[0];
++ this.nextMatch = this.formatter.formatterRegExp.lastIndex;
++ // Figure out which formatter matched and call its handler
++ for(var t=1; t<formatterMatch.length; t++)
++ {
++ if(formatterMatch[t])
++ {
++ this.formatter.formatters[t-1].handler(this);
++ this.formatter.formatterRegExp.lastIndex = this.nextMatch;
++ break;
++ }
++ }
++ // Get the next match
++ formatterMatch = this.formatter.formatterRegExp.exec(this.source);
++ }
++ // Output any text after the last match
++ if(this.nextMatch < this.source.length)
++ {
++ this.outputText(this.output,this.nextMatch,this.source.length);
++ this.nextMatch = this.source.length;
++ }
++ // Restore the output pointer
++ this.output = oldOutput;
++}
++
++Wikifier.prototype.subWikifyTerm = function(output,terminatorRegExp)
++{
++ // subWikify() can be indirectly recursive, so we need to save the old output pointer
++ var oldOutput = this.output;
++ this.output = output;
++ // Get the first matches for the formatter and terminator RegExps
++ terminatorRegExp.lastIndex = this.nextMatch;
++ var terminatorMatch = terminatorRegExp.exec(this.source);
++ this.formatter.formatterRegExp.lastIndex = this.nextMatch;
++ var formatterMatch = this.formatter.formatterRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);
++ while(terminatorMatch || formatterMatch)
++ {
++ // Check for a terminator match before the next formatter match
++ if(terminatorMatch && (!formatterMatch || terminatorMatch.index <= formatterMatch.index))
++ {
++ // Output any text before the match
++ if(terminatorMatch.index > this.nextMatch)
++ this.outputText(this.output,this.nextMatch,terminatorMatch.index);
++ // Set the match parameters
++ this.matchText = terminatorMatch[1];
++ this.matchLength = terminatorMatch[1].length;
++ this.matchStart = terminatorMatch.index;
++ this.nextMatch = this.matchStart + this.matchLength;
++ // Restore the output pointer
++ this.output = oldOutput;
++ return;
++ }
++ // It must be a formatter match; output any text before the match
++ if(formatterMatch.index > this.nextMatch)
++ this.outputText(this.output,this.nextMatch,formatterMatch.index);
++ // Set the match parameters
++ this.matchStart = formatterMatch.index;
++ this.matchLength = formatterMatch[0].length;
++ this.matchText = formatterMatch[0];
++ this.nextMatch = this.formatter.formatterRegExp.lastIndex;
++ // Figure out which formatter matched and call its handler
++ for(var t=1; t<formatterMatch.length; t++)
++ {
++ if(formatterMatch[t])
++ {
++ this.formatter.formatters[t-1].handler(this);
++ this.formatter.formatterRegExp.lastIndex = this.nextMatch;
++ break;
++ }
++ }
++ // Get the next match
++ terminatorRegExp.lastIndex = this.nextMatch;
++ terminatorMatch = terminatorRegExp.exec(this.source);
++ formatterMatch = this.formatter.formatterRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);
++ }
++ // Output any text after the last match
++ if(this.nextMatch < this.source.length)
++ {
++ this.outputText(this.output,this.nextMatch,this.source.length);
++ this.nextMatch = this.source.length;
++ }
++ // Restore the output pointer
++ this.output = oldOutput;
++}
++
++Wikifier.prototype.outputText = function(place,startPos,endPos)
++{
++ // Check for highlights
++ while(this.highlightMatch && (this.highlightRegExp.lastIndex > startPos) && (this.highlightMatch.index < endPos) && (startPos < endPos))
++ {
++ // Deal with any plain text before the highlight
++ if(this.highlightMatch.index > startPos)
++ {
++ createTiddlyText(place,this.source.substring(startPos,this.highlightMatch.index));
++ startPos = this.highlightMatch.index;
++ }
++ // Deal with the highlight
++ var highlightEnd = Math.min(this.highlightRegExp.lastIndex,endPos);
++ var theHighlight = createTiddlyElement(place,"span",null,"highlight",this.source.substring(startPos,highlightEnd));
++ startPos = highlightEnd;
++ // Nudge along to the next highlight if we're done with this one
++ if(startPos >= this.highlightRegExp.lastIndex)
++ this.highlightMatch = this.highlightRegExp.exec(this.source);
++ }
++ // Do the unhighlighted text left over
++ if(startPos < endPos)
++ {
++ createTiddlyText(place,this.source.substring(startPos,endPos));
++ }
++}
++
++// ---------------------------------------------------------------------------------
++// Macro definitions
++// ---------------------------------------------------------------------------------
++
++config.macros.today.handler = function(place,macroName,params)
++{
++ var now = new Date();
++ var text;
++ if(params[0])
++ text = now.formatString(params[0].trim());
++ else
++ text = now.toLocaleString();
++ createTiddlyElement(place,"span",null,null,text);
++}
++
++config.macros.version.handler = function(place)
++{
++ createTiddlyElement(place,"span",null,null,version.major + "." + version.minor + "." + version.revision + (version.beta ? " (beta " + version.beta + ")" : ""));
++}
++
++config.macros.list.handler = function(place,macroName,params)
++{
++ var type = params[0] ? params[0] : "all";
++ var theList = document.createElement("ul");
++ place.appendChild(theList);
++ if(this[type].prompt)
++ createTiddlyElement(theList,"li",null,"listTitle",this[type].prompt);
++ var results;
++ if(this[type].handler)
++ results = this[type].handler(params);
++ for(var t = 0; t < results.length; t++)
++ {
++ var theListItem = document.createElement("li")
++ theList.appendChild(theListItem);
++ if(typeof results[t] == "string")
++ createTiddlyLink(theListItem,results[t],true);
++ else
++ createTiddlyLink(theListItem,results[t].title,true);
++ }
++}
++
++config.macros.list.all.handler = function(params)
++{
++ return store.reverseLookup("tags","excludeLists",false,"title");
++}
++
++config.macros.list.missing.handler = function(params)
++{
++ return store.getMissingLinks();
++}
++
++config.macros.list.orphans.handler = function(params)
++{
++ return store.getOrphans();
++}
++
++config.macros.list.shadowed.handler = function(params)
++{
++ return store.getShadowed();
++}
++
++config.macros.allTags.handler = function(place,macroName,params)
++{
++ var tags = store.getTags();
++ var theDateList = createTiddlyElement(place,"ul");
++ if(tags.length == 0)
++ createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);
++ for(var t=0; t<tags.length; t++)
++ {
++ var theListItem =createTiddlyElement(theDateList,"li");
++ var theTag = createTiddlyButton(theListItem,tags[t][0] + " (" + tags[t][1] + ")",this.tooltip.format([tags[t][0]]),onClickTag);
++ theTag.setAttribute("tag",tags[t][0]);
++ }
++}
++
++config.macros.timeline.handler = function(place,macroName,params)
++{
++ var field = params[0] ? params[0] : "modified";
++ var tiddlers = store.reverseLookup("tags","excludeLists",false,field);
++ var lastDay = "";
++ var last = params[1] ? tiddlers.length-Math.min(tiddlers.length,parseInt(params[1])) : 0;
++ for(var t=tiddlers.length-1; t>=last; t--)
++ {
++ var tiddler = tiddlers[t];
++ var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
++ if(theDay != lastDay)
++ {
++ var theDateList = document.createElement("ul");
++ place.appendChild(theDateList);
++ createTiddlyElement(theDateList,"li",null,"listTitle",tiddler[field].formatString(this.dateFormat));
++ lastDay = theDay;
++ }
++ var theDateListItem = createTiddlyElement(theDateList,"li",null,"listLink");
++ theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));
++ }
++}
++
++config.macros.search.handler = function(place,macroName,params)
++{
++ var searchTimeout = null;
++ var btn = createTiddlyButton(place,this.label,this.prompt,this.onClick);
++ var txt = createTiddlyElement(place,"input",null,"txtOptionInput");
++ if(params[0])
++ txt.value = params[0];
++ txt.onkeyup = this.onKeyPress;
++ txt.onfocus = this.onFocus;
++ txt.setAttribute("size",this.sizeTextbox);
++ txt.setAttribute("accessKey",this.accessKey);
++ txt.setAttribute("autocomplete","off");
++ txt.setAttribute("lastSearchText","");
++ if(config.browser.isSafari)
++ {
++ txt.setAttribute("type","search");
++ txt.setAttribute("results","5");
++ }
++ else
++ txt.setAttribute("type","text");
++}
++
++// Global because there's only ever one outstanding incremental search timer
++config.macros.search.timeout = null;
++
++config.macros.search.doSearch = function(txt)
++{
++ if(txt.value.length > 0)
++ {
++ story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
++ txt.setAttribute("lastSearchText",txt.value);
++ }
++}
++
++config.macros.search.onClick = function(e)
++{
++ config.macros.search.doSearch(this.nextSibling);
++ return false;
++}
++
++config.macros.search.onKeyPress = function(e)
++{
++ if(!e) var e = window.event;
++ switch(e.keyCode)
++ {
++ case 13: // Ctrl-Enter
++ case 10: // Ctrl-Enter on IE PC
++ config.macros.search.doSearch(this);
++ break;
++ case 27: // Escape
++ this.value = "";
++ clearMessage();
++ break;
++ }
++ if(this.value.length > 2)
++ {
++ if(this.value != this.getAttribute("lastSearchText"))
++ {
++ if(config.macros.search.timeout)
++ clearTimeout(config.macros.search.timeout);
++ var txt = this;
++ config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);
++ }
++ }
++ else
++ {
++ if(config.macros.search.timeout)
++ clearTimeout(config.macros.search.timeout);
++ }
++}
++
++config.macros.search.onFocus = function(e)
++{
++ this.select();
++}
++
++config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler)
++{
++ params = paramString.parseParams("name",null,true,false,true);
++ var names = params[0]["name"];
++ var tiddlerName = names[0];
++ var className = names[1] ? names[1] : null;
++ var args = params[0]["with"];
++ var wrapper = createTiddlyElement(place,"span",null,className);
++ if(!args)
++ {
++ wrapper.setAttribute("refresh","content");
++ wrapper.setAttribute("tiddler",tiddlerName);
++ }
++ var text = store.getTiddlerText(tiddlerName);
++ if(text)
++ {
++ var stack = config.macros.tiddler.tiddlerStack;
++ if(stack.indexOf(tiddlerName) !== -1)
++ return;
++ stack.push(tiddlerName);
++ try
++ {
++ var n = args ? Math.min(args.length,9) : 0;
++ for(var i=0; i<n; i++)
++ {
++ var placeholderRE = new RegExp("\\$" + (i + 1),"mg");
++ text = text.replace(placeholderRE,args[i]);
++ }
++ config.macros.tiddler.renderText(wrapper,text,tiddlerName,params);
++ }
++ finally
++ {
++ stack.pop();
++ }
++ }
++}
++
++config.macros.tiddler.renderText = function(place,text,tiddlerName,params)
++{
++ wikify(text,place,null,store.getTiddler(tiddlerName));
++}
++
++config.macros.tiddler.tiddlerStack = [];
++
++config.macros.tag.handler = function(place,macroName,params)
++{
++ createTagButton(place,params[0]);
++}
++
++config.macros.tags.handler = function(place,macroName,params,wikifier,paramString,tiddler)
++{
++ params = paramString.parseParams("anon",null,true,false,false);
++ var theList = createTiddlyElement(place,"ul");
++ var title = getParam(params,"anon","");
++ if(title && store.tiddlerExists(title))
++ tiddler = store.getTiddler(title);
++ var sep = getParam(params,"sep"," ");
++ var lingo = config.views.wikified.tag;
++ var prompt = tiddler.tags.length == 0 ? lingo.labelNoTags : lingo.labelTags;
++ createTiddlyElement(theList,"li",null,"listTitle",prompt.format([tiddler.title]));
++ for(var t=0; t<tiddler.tags.length; t++)
++ {
++ createTagButton(createTiddlyElement(theList,"li"),tiddler.tags[t],tiddler.title);
++ if(t<tiddler.tags.length-1)
++ createTiddlyText(theList,sep);
++ }
++}
++
++config.macros.tagging.handler = function(place,macroName,params,wikifier,paramString,tiddler)
++{
++ params = paramString.parseParams("anon",null,true,false,false);
++ var theList = createTiddlyElement(place,"ul");
++ var title = getParam(params,"anon","");
++ if(title == "" && tiddler instanceof Tiddler)
++ title = tiddler.title;
++ var sep = getParam(params,"sep"," ");
++ theList.setAttribute("title",this.tooltip.format([title]));
++ var tagged = store.getTaggedTiddlers(title);
++ var prompt = tagged.length == 0 ? this.labelNotTag : this.label;
++ createTiddlyElement(theList,"li",null,"listTitle",prompt.format([title,tagged.length]));
++ for(var t=0; t<tagged.length; t++)
++ {
++ createTiddlyLink(createTiddlyElement(theList,"li"),tagged[t].title,true);
++ if(t<tagged.length-1)
++ createTiddlyText(theList,sep);
++ }
++}
++
++config.macros.closeAll.handler = function(place)
++{
++ createTiddlyButton(place,this.label,this.prompt,this.onClick);
++}
++
++config.macros.closeAll.onClick = function(e)
++{
++ story.closeAllTiddlers();
++ return false;
++}
++
++config.macros.permaview.handler = function(place)
++{
++ createTiddlyButton(place,this.label,this.prompt,this.onClick);
++}
++
++config.macros.permaview.onClick = function(e)
++{
++ story.permaView();
++ return false;
++}
++
++config.macros.saveChanges.handler = function(place)
++{
++ if(!readOnly)
++ createTiddlyButton(place,this.label,this.prompt,this.onClick,null,null,this.accessKey);
++}
++
++config.macros.saveChanges.onClick = function(e)
++{
++ saveChanges();
++ return false;
++}
++
++config.macros.slider.onClickSlider = function(e)
++{
++ if(!e) var e = window.event;
++ var n = this.nextSibling;
++ var cookie = n.getAttribute("cookie");
++ var isOpen = n.style.display != "none";
++ if(anim && config.options.chkAnimate)
++ anim.startAnimating(new Slider(n,!isOpen,e.shiftKey || e.altKey,"none"));
++ else
++ n.style.display = isOpen ? "none" : "block";
++ config.options[cookie] = !isOpen;
++ saveOptionCookie(cookie);
++ return false;
++}
++
++config.macros.slider.createSlider = function(place,cookie,title,tooltip)
++{
++ var cookie = cookie ? cookie : "";
++ var btn = createTiddlyButton(place,title,tooltip,this.onClickSlider);
++ var panel = createTiddlyElement(null,"div",null,"sliderPanel");
++ panel.setAttribute("cookie",cookie);
++ panel.style.display = config.options[cookie] ? "block" : "none";
++ place.appendChild(panel);
++ return panel;
++}
++
++config.macros.slider.handler = function(place,macroName,params)
++{
++ var panel = this.createSlider(place,params[0],params[2],params[3]);
++ var text = store.getTiddlerText(params[1]);
++ panel.setAttribute("refresh", "content");
++ panel.setAttribute("tiddler", params[1]);
++ if(text)
++ wikify(text,panel,null,store.getTiddler(params[1]));
++}
++
++config.macros.option.onChangeOption = function(e)
++{
++ var opt = this.getAttribute("option");
++ var elementType,valueField;
++ if(opt)
++ {
++ switch(opt.substr(0,3))
++ {
++ case "txt":
++ elementType = "input";
++ valueField = "value";
++ break;
++ case "chk":
++ elementType = "input";
++ valueField = "checked";
++ break;
++ }
++ config.options[opt] = this[valueField];
++ saveOptionCookie(opt);
++ var nodes = document.getElementsByTagName(elementType);
++ for(var t=0; t<nodes.length; t++)
++ {
++ var optNode = nodes[t].getAttribute("option");
++ if(opt == optNode)
++ nodes[t][valueField] = this[valueField];
++ }
++ }
++ return(true);
++}
++
++config.macros.option.handler = function(place,macroName,params)
++{
++ var opt = params[0];
++ if(config.options[opt] == undefined)
++ return;
++ var c;
++ switch(opt.substr(0,3))
++ {
++ case "txt":
++ c = document.createElement("input");
++ c.onkeyup = this.onChangeOption;
++ c.setAttribute("option",opt);
++ c.className = "txtOptionInput";
++ place.appendChild(c);
++ c.value = config.options[opt];
++ break;
++ case "chk":
++ c = document.createElement("input");
++ c.setAttribute("type","checkbox");
++ c.onclick = this.onChangeOption;
++ c.setAttribute("option",opt);
++ c.className = "chkOptionInput";
++ place.appendChild(c);
++ c.checked = config.options[opt];
++ break;
++ }
++}
++
++
++
++config.macros.newTiddler.createNewTiddlerButton = function(place,title,params,label,prompt,accessKey,newFocus,isJournal)
++{
++ var tags = [];
++ for(var t=1; t<params.length; t++)
++ if((params[t].name == "anon" && t != 1) || (params[t].name == "tag"))
++ tags.push(params[t].value);
++ label = getParam(params,"label",label);
++ prompt = getParam(params,"prompt",prompt);
++ accessKey = getParam(params,"accessKey",accessKey);
++ newFocus = getParam(params,"focus",newFocus);
++ var btn = createTiddlyButton(place,label,prompt,this.onClickNewTiddler,null,null,accessKey);
++ btn.setAttribute("newTitle",title);
++ btn.setAttribute("isJournal",isJournal);
++ btn.setAttribute("params",tags.join("|"));
++ btn.setAttribute("newFocus",newFocus);
++ btn.setAttribute("newTemplate",getParam(params,"template",DEFAULT_EDIT_TEMPLATE));
++ var text = getParam(params,"text");
++ if(text !== undefined)
++ btn.setAttribute("newText",text);
++ return btn;
++}
++
++config.macros.newTiddler.onClickNewTiddler = function()
++{
++ var title = this.getAttribute("newTitle");
++ if(this.getAttribute("isJournal"))
++ {
++ var now = new Date();
++ title = now.formatString(title.trim());
++ }
++ var params = this.getAttribute("params").split("|");
++ var focus = this.getAttribute("newFocus");
++ var template = this.getAttribute("newTemplate");
++ story.displayTiddler(null,title,template);
++ var text = this.getAttribute("newText");
++ if(typeof text == "string")
++ story.getTiddlerField(title,"text").value = text.format([title]);
++ for(var t=0;t<params.length;t++)
++ story.setTiddlerTag(title,params[t],+1);
++ story.focusTiddler(title,focus);
++ return false;
++}
++
++config.macros.newTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler)
++{
++ if(!readOnly)
++ {
++ params = paramString.parseParams("anon",null,true,false,false);
++ var title = params[1] && params[1].name == "anon" ? params[1].value : this.title;
++ title = getParam(params,"title",title);
++ this.createNewTiddlerButton(place,title,params,this.label,this.prompt,this.accessKey,"title",false);
++ }
++}
++
++config.macros.newJournal.handler = function(place,macroName,params,wikifier,paramString,tiddler)
++{
++ if(!readOnly)
++ {
++ params = paramString.parseParams("anon",null,true,false,false);
++ var title = params[1] && params[1].name == "anon" ? params[1].value : "";
++ title = getParam(params,"title",title);
++ config.macros.newTiddler.createNewTiddlerButton(place,title,params,this.label,this.prompt,this.accessKey,"text",true);
++ }
++}
++
++config.macros.sparkline.handler = function(place,macroName,params)
++{
++ var data = [];
++ var min = 0;
++ var max = 0;
++ for(var t=0; t<params.length; t++)
++ {
++ var v = parseInt(params[t]);
++ if(v < min)
++ min = v;
++ if(v > max)
++ max = v;
++ data.push(v);
++ }
++ if(data.length < 1)
++ return;
++ var box = createTiddlyElement(place,"span",null,"sparkline",String.fromCharCode(160));
++ box.title = data.join(",");
++ var w = box.offsetWidth;
++ var h = box.offsetHeight;
++ box.style.paddingRight = (data.length * 2 - w) + "px";
++ box.style.position = "relative";
++ for(var d=0; d<data.length; d++)
++ {
++ var tick = document.createElement("img");
++ tick.border = 0;
++ tick.className = "sparktick";
++ tick.style.position = "absolute";
++ tick.src = "data:image/gif,GIF89a%01%00%01%00%91%FF%00%FF%FF%FF%00%00%00%C0%C0%C0%00%00%00!%F9%04%01%00%00%02%00%2C%00%00%00%00%01%00%01%00%40%02%02T%01%00%3B";
++ tick.style.left = d*2 + "px";
++ tick.style.width = "2px";
++ var v = Math.floor(((data[d] - min)/(max-min)) * h);
++ tick.style.top = (h-v) + "px";
++ tick.style.height = v + "px";
++ box.appendChild(tick);
++ }
++}
++
++config.macros.tabs.handler = function(place,macroName,params)
++{
++ var cookie = params[0];
++ var numTabs = (params.length-1)/3;
++ var wrapper = createTiddlyElement(null,"div",null,cookie);
++ var tabset = createTiddlyElement(wrapper,"div",null,"tabset");
++ tabset.setAttribute("cookie",cookie);
++ var validTab = false;
++ for(var t=0; t<numTabs; t++)
++ {
++ var label = params[t*3+1];
++ var prompt = params[t*3+2];
++ var content = params[t*3+3];
++ var tab = createTiddlyButton(tabset,label,prompt,this.onClickTab,"tab tabUnselected");
++ tab.setAttribute("tab",label);
++ tab.setAttribute("content",content);
++ tab.title = prompt;
++ if(config.options[cookie] == label)
++ validTab = true;
++ }
++ if(!validTab)
++ config.options[cookie] = params[1];
++ place.appendChild(wrapper);
++ this.switchTab(tabset,config.options[cookie]);
++}
++
++config.macros.tabs.onClickTab = function(e)
++{
++ config.macros.tabs.switchTab(this.parentNode,this.getAttribute("tab"));
++ return false;
++}
++
++config.macros.tabs.switchTab = function(tabset,tab)
++{
++ var cookie = tabset.getAttribute("cookie");
++ var theTab = null
++ var nodes = tabset.childNodes;
++ for(var t=0; t<nodes.length; t++)
++ if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab)
++ {
++ theTab = nodes[t];
++ theTab.className = "tab tabSelected";
++ }
++ else
++ nodes[t].className = "tab tabUnselected"
++ if(theTab)
++ {
++ if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")
++ tabset.parentNode.removeChild(tabset.nextSibling);
++ var tabContent = createTiddlyElement(null,"div",null,"tabContents");
++ tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);
++ var contentTitle = theTab.getAttribute("content");
++ wikify(store.getTiddlerText(contentTitle),tabContent,null,store.getTiddler(contentTitle));
++ if(cookie)
++ {
++ config.options[cookie] = tab;
++ saveOptionCookie(cookie);
++ }
++ }
++}
++
++// <<gradient [[tiddler name]] vert|horiz rgb rgb rgb rgb... >>
++config.macros.gradient.handler = function(place,macroName,params,wikifier)
++{
++ var terminator = ">>";
++ var panel;
++ if(wikifier)
++ panel = createTiddlyElement(place,"div",null,"gradient");
++ else
++ panel = place;
++ panel.style.position = "relative";
++ panel.style.overflow = "hidden";
++ panel.style.zIndex = "0";
++ var t;
++ if(wikifier)
++ {
++ var styles = config.formatterHelpers.inlineCssHelper(wikifier);
++ config.formatterHelpers.applyCssHelper(panel,styles);
++ }
++ var colours = [];
++ for(t=1; t<params.length; t++)
++ {
++ var c = new RGB(params[t]);
++ if(c)
++ colours.push(c);
++ }
++ drawGradient(panel,params[0] != "vert",colours);
++ if(wikifier)
++ wikifier.subWikify(panel,terminator);
++ if(document.all)
++ {
++ panel.style.height = "100%";
++ panel.style.width = "100%";
++ }
++}
++
++config.macros.message.handler = function(place,macroName,params)
++{
++ if(params[0])
++ {
++ var m = config;
++ var p = params[0].split(".");
++ for(var t=0; t<p.length; t++)
++ {
++ if(p[t] in m)
++ m = m[p[t]];
++ else
++ break;
++ }
++ createTiddlyText(place,m.toString().format(params.splice(1)));
++ }
++}
++
++config.macros.view.handler = function(place,macroName,params,wikifier,paramString,tiddler)
++{
++ if((tiddler instanceof Tiddler) && params[0])
++ {
++ var value = store.getValue(tiddler,params[0]);
++ if(value != undefined)
++ switch(params[1])
++ {
++ case undefined:
++ highlightify(value,place,highlightHack);
++ break;
++ case "link":
++ createTiddlyLink(place,value,true);
++ break;
++ case "wikified":
++ wikify(value,place,highlightHack,tiddler);
++ break;
++ case "date":
++ value = Date.convertFromYYYYMMDDHHMM(value);
++ if(params[2])
++ createTiddlyText(place,value.formatString(params[2]));
++ else
++ createTiddlyText(place,value);
++ break;
++ }
++ }
++}
++
++config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler)
++{
++ var field = params[0];
++ if((tiddler instanceof Tiddler) && field)
++ {
++ story.setDirty(tiddler.title,true);
++ if(field != "text")
++ {
++ var e = createTiddlyElement(null,"input");
++ if(tiddler.isReadOnly())
++ e.setAttribute("readOnly","readOnly");
++ e.setAttribute("edit",field);
++ e.setAttribute("type","text");
++ var v = store.getValue(tiddler,field);
++ if(!v)
++ v = "";
++ e.value = v;
++ e.setAttribute("size","40");
++ e.setAttribute("autocomplete","off");
++ place.appendChild(e);
++ }
++ else
++ {
++ var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");
++ var wrapper2 = createTiddlyElement(wrapper1,"div");
++ var e = createTiddlyElement(wrapper2,"textarea");
++ if(tiddler.isReadOnly())
++ e.setAttribute("readOnly","readOnly");
++ var v = store.getValue(tiddler,field);
++ if(!v)
++ v = "";
++ e.value = v;
++ var rows = 10;
++ var lines = v.match(/\n/mg);
++ var maxLines = Math.max(parseInt(config.options.txtMaxEditRows),5);
++ if(lines != null && lines.length > rows)
++ rows = lines.length + 5;
++ rows = Math.min(rows,maxLines);
++ e.setAttribute("rows",rows);
++ e.setAttribute("edit",field);
++ place.appendChild(wrapper1);
++ }
++ }
++}
++
++config.macros.tagChooser.onClick = function(e)
++{
++ if(!e) var e = window.event;
++ var lingo = config.views.editor.tagChooser;
++ var popup = Popup.create(this);
++ var tags = store.getTags();
++ if(tags.length == 0)
++ createTiddlyText(createTiddlyElement(popup,"li"),lingo.popupNone);
++ for(var t=0; t<tags.length; t++)
++ {
++ var theTag = createTiddlyButton(createTiddlyElement(popup,"li"),tags[t][0],lingo.tagTooltip.format([tags[t][0]]),config.macros.tagChooser.onTagClick);
++ theTag.setAttribute("tag",tags[t][0]);
++ theTag.setAttribute("tiddler", this.getAttribute("tiddler"));
++ }
++ Popup.show(popup,false);
++ e.cancelBubble = true;
++ if(e.stopPropagation) e.stopPropagation();
++ return(false);
++}
++
++config.macros.tagChooser.onTagClick = function(e)
++{
++ if(!e) var e = window.event;
++ var tag = this.getAttribute("tag");
++ var title = this.getAttribute("tiddler");
++ if(!readOnly)
++ story.setTiddlerTag(title,tag,0);
++ return(false);
++}
++
++config.macros.tagChooser.handler = function(place,macroName,params,wikifier,paramString,tiddler)
++{
++ if(tiddler instanceof Tiddler)
++ {
++ var title = tiddler.title;
++ var lingo = config.views.editor.tagChooser;
++ var btn = createTiddlyButton(place,lingo.text,lingo.tooltip,this.onClick);
++ btn.setAttribute("tiddler", title);
++ }
++}
++
++// Create a toolbar command button
++// place - parent DOM element
++// command - reference to config.commands[] member -or- name of member
++// tiddler - reference to tiddler that toolbar applies to
++// theClass - the class to give the button
++config.macros.toolbar.createCommand = function(place,commandName,tiddler,theClass)
++{
++ if(typeof commandName != "string")
++ {
++ var c = null;
++ for(var t in config.commands)
++ if(config.commands[t] == commandName)
++ c = t;
++ commandName = c;
++ }
++ if((tiddler instanceof Tiddler) && (typeof commandName == "string"))
++ {
++ var title = tiddler.title;
++ var command = config.commands[commandName];
++ var ro = tiddler.isReadOnly();
++ var shadow = store.isShadowTiddler(title) && !store.tiddlerExists(title);
++ var text = ro && command.readOnlyText ? command.readOnlyText : command.text;
++ var tooltip = ro && command.readOnlyTooltip ? command.readOnlyTooltip : command.tooltip;
++ if((!ro || (ro && !command.hideReadOnly)) && !(shadow && command.hideShadow))
++
++ {
++ var btn = createTiddlyButton(null,text,tooltip,this.onClickCommand);
++ btn.setAttribute("commandName", commandName);
++ btn.setAttribute("tiddler", title);
++ if(theClass)
++ addClass(btn,theClass);
++ place.appendChild(btn);
++ }
++ }
++}
++
++config.macros.toolbar.onClickCommand = function(e)
++{
++ if(!e) var e = window.event;
++ var command = config.commands[this.getAttribute("commandName")];
++ return command.handler(e,this,this.getAttribute("tiddler"));
++}
++
++// Invoke the first command encountered from a given place that is tagged with a specified class
++config.macros.toolbar.invokeCommand = function(place,theClass,event)
++{
++ var children = place.getElementsByTagName("a")
++ for(var t=0; t<children.length; t++)
++ {
++ var c = children[t];
++ if(hasClass(c,theClass) && c.getAttribute && c.getAttribute("commandName"))
++ {
++ if(c.onclick instanceof Function)
++ c.onclick.call(c,event);
++ break;
++ }
++ }
++}
++
++config.macros.toolbar.handler = function(place,macroName,params,wikifier,paramString,tiddler)
++{
++ for(var t=0; t<params.length; t++)
++ {
++ var c = params[t];
++ var theClass = "";
++ switch(c.substr(0,1))
++ {
++ case "+":
++ theClass = "defaultCommand";
++ c = c.substr(1);
++ break;
++ case "-":
++ theClass = "cancelCommand";
++ c = c.substr(1);
++ break;
++ }
++ if(c in config.commands)
++ this.createCommand(place,c,tiddler,theClass);
++ }
++}
++
++config.macros.plugins.handler = function(place,macroName,params,wikifier,paramString,tiddler)
++{
++ var e = createTiddlyElement(place,"div");
++ e.setAttribute("refresh","macro");
++ e.setAttribute("macroName","plugins");
++ e.setAttribute("params",paramString);
++ this.refresh(e,paramString);
++}
++
++config.macros.plugins.refresh = function(place,params)
++{
++ var selectedRows = [];
++ ListView.forEachSelector(place,function(e,rowName) {
++ if(e.checked)
++ selectedRows.push(e.getAttribute("rowName"));
++ });
++ removeChildren(place);
++ params = params.parseParams("anon");
++ var plugins = installedPlugins.slice(0);
++ var t,tiddler,p;
++ var configTiddlers = store.getTaggedTiddlers("systemConfig");
++ for(t=0; t<configTiddlers.length; t++)
++ {
++ tiddler = configTiddlers[t];
++ if(plugins.findByField("title",tiddler.title) == null)
++ {
++ p = getPluginInfo(tiddler);
++ p.executed = false;
++ p.log.splice(0,0,this.skippedText);
++ plugins.push(p);
++ }
++ }
++ for(t=0; t<plugins.length; t++)
++ {
++ var p = plugins[t];
++ p.forced = p.tiddler.isTagged("systemConfigForce");
++ p.disabled = p.tiddler.isTagged("systemConfigDisable");
++ p.Selected = selectedRows.indexOf(plugins[t].title) != -1;
++ }
++ if(plugins.length == 0)
++ createTiddlyElement(place,"em",null,null,this.noPluginText);
++ else
++ ListView.create(place,plugins,this.listViewTemplate,this.onSelectCommand);
++}
++
++config.macros.plugins.onSelectCommand = function(command,rowNames)
++{
++ var t;
++ switch(command)
++ {
++ case "remove":
++ for(t=0; t<rowNames.length; t++)
++ store.setTiddlerTag(rowNames[t],false,"systemConfig");
++ break;
++ case "delete":
++ if(rowNames.length > 0 && confirm(config.macros.plugins.confirmDeleteText.format([rowNames.join(", ")])))
++ {
++ for(t=0; t<rowNames.length; t++)
++ {
++ store.removeTiddler(rowNames[t]);
++ story.closeTiddler(rowNames[t],true,false);
++ }
++ }
++ break;
++ }
++ if(config.options.chkAutoSave)
++ saveChanges(true);
++}
++
++config.macros.refreshDisplay.handler = function(place)
++{
++ createTiddlyButton(place,this.label,this.prompt,this.onClick);
++}
++
++config.macros.refreshDisplay.onClick = function(e)
++{
++ refreshAll();
++ return false;
++}
++
++config.macros.importTiddlers.handler = function(place,macroName,params,wikifier,paramString,tiddler)
++{
++ if(readOnly)
++ {
++ createTiddlyElement(place,"div",null,"marked",this.readOnlyWarning);
++ return;
++ }
++ var importer = createTiddlyElement(null,"div",null,"importTiddler wizard");
++ createTiddlyElement(importer,"h1",null,null,this.wizardTitle);
++ createTiddlyElement(importer,"h2",null,"step1",this.step1);
++ var step = createTiddlyElement(importer,"div",null,"wizardStep");
++ createTiddlyText(step,this.step1prompt);
++ var input = createTiddlyElement(null,"input",null,"txtOptionInput");
++ input.type = "text";
++ input.size = 50;
++ step.appendChild(input);
++ importer.inputBox = input;
++ createTiddlyElement(step,"br");
++ createTiddlyText(step,this.step1promptFile);
++ var fileInput = createTiddlyElement(null,"input",null,"txtOptionInput");
++ fileInput.type = "file";
++ fileInput.size = 50;
++ fileInput.onchange = this.onBrowseChange;
++ fileInput.onkeyup = this.onBrowseChange;
++ step.appendChild(fileInput);
++ createTiddlyElement(step,"br");
++ createTiddlyText(step,this.step1promptFeeds);
++ var feeds = this.getFeeds([{caption: this.step1feedPrompt, name: ""}]);
++ createTiddlyDropDown(step,this.onFeedChange,feeds);
++ createTiddlyElement(step,"br");
++ createTiddlyButton(step,this.fetchLabel,this.fetchPrompt,this.onFetch,null,null,null);
++ place.appendChild(importer);
++}
++
++config.macros.importTiddlers.getFeeds = function(feeds)
++{
++ var tagged = store.getTaggedTiddlers("contentPublisher","title");
++ for(var t=0; t<tagged.length; t++)
++ feeds.push({caption: tagged[t].title, name: store.getTiddlerSlice(tagged[t].title,"URL")});
++ return feeds;
++}
++
++config.macros.importTiddlers.onFeedChange = function(e)
++{
++ var importer = findRelated(this,"importTiddler","className","parentNode");
++ importer.inputBox.value = this.value;
++ this.selectedIndex = 0;
++}
++
++config.macros.importTiddlers.onBrowseChange = function(e)
++{
++ var importer = findRelated(this,"importTiddler","className","parentNode");
++ importer.inputBox.value = "file://" + this.value;
++}
++
++config.macros.importTiddlers.onFetch = function(e)
++{
++ var importer = findRelated(this,"importTiddler","className","parentNode");
++ var url = importer.inputBox.value;
++ var cutoff = findRelated(importer.firstChild,"step2","className","nextSibling");
++ while(cutoff)
++ {
++ var temp = cutoff.nextSibling;
++ cutoff.parentNode.removeChild(cutoff);
++ cutoff = temp;
++ }
++ createTiddlyElement(importer,"h2",null,"step2",config.macros.importTiddlers.step2);
++ var step = createTiddlyElement(importer,"div",null,"wizardStep",config.macros.importTiddlers.step2Text.format([url]));
++ loadRemoteFile(url,config.macros.importTiddlers.onLoad,importer);
++}
++
++config.macros.importTiddlers.onLoad = function(status,params,responseText,url,xhr)
++{
++ if(!status)
++ {
++ displayMessage(this.fetchError);
++ return;
++ }
++ var importer = params;
++ // Check that the tiddler we're in hasn't been closed - doesn't work on IE
++// var p = importer;
++// while(p.parentNode)
++// p = p.parentNode;
++// if(!(p instanceof HTMLDocument))
++// return;
++ // Crack out the content - (should be refactored)
++ var posOpeningDiv = responseText.indexOf(startSaveArea);
++ var limitClosingDiv = responseText.indexOf("<!--POST-BODY-START--"+">");
++ var posClosingDiv = responseText.lastIndexOf(endSaveArea,limitClosingDiv == -1 ? responseText.length : limitClosingDiv);
++ if((posOpeningDiv == -1) || (posClosingDiv == -1))
++ {
++ alert(config.messages.invalidFileError.format([url]));
++ return;
++ }
++ var content = "<html><body>" + responseText.substring(posOpeningDiv,posClosingDiv + endSaveArea.length) + "</body></html>";
++ // Create the iframe
++ var iframe = document.createElement("iframe");
++ iframe.style.display = "none";
++ importer.insertBefore(iframe,importer.firstChild);
++ var doc = iframe.document;
++ if(iframe.contentDocument)
++ doc = iframe.contentDocument; // For NS6
++ else if(iframe.contentWindow)
++ doc = iframe.contentWindow.document; // For IE5.5 and IE6
++ // Put the content in the iframe
++ doc.open();
++ doc.writeln(content);
++ doc.close();
++ // Load the content into a TiddlyWiki() object
++ var storeArea = doc.getElementById("storeArea");
++ var importStore = new TiddlyWiki();
++ importStore.loadFromDiv(storeArea,"store");
++ // Get rid of the iframe
++ iframe.parentNode.removeChild(iframe);
++ // Extract data for the listview
++ var tiddlers = [];
++ importStore.forEachTiddler(function(title,tiddler)
++ {
++ var t = {};
++ t.title = title;
++ t.modified = tiddler.modified;
++ t.modifier = tiddler.modifier;
++ t.text = tiddler.text.substr(0,50);
++ t.tags = tiddler.tags;
++ tiddlers.push(t);
++ });
++ // Display the listview
++ createTiddlyElement(importer,"h2",null,"step3",config.macros.importTiddlers.step3);
++ var step = createTiddlyElement(importer,"div",null,"wizardStep");
++ ListView.create(step,tiddlers,config.macros.importTiddlers.listViewTemplate,config.macros.importTiddlers.onSelectCommand);
++ // Save the importer
++ importer.store = importStore;
++}
++
++config.macros.importTiddlers.onSelectCommand = function(listView,command,rowNames)
++{
++ var importer = findRelated(listView,"importTiddler","className","parentNode");
++ switch(command)
++ {
++ case "import":
++ config.macros.importTiddlers.doImport(importer,rowNames);
++ break;
++ }
++ if(config.options.chkAutoSave)
++ saveChanges(true);
++}
++
++config.macros.importTiddlers.doImport = function(importer,rowNames)
++{
++ var theStore = importer.store;
++ var overwrite = new Array();
++ var t;
++ for(t=0; t<rowNames.length; t++)
++ {
++ if(store.tiddlerExists(rowNames[t]))
++ overwrite.push(rowNames[t]);
++ }
++ if(overwrite.length > 0)
++ if(!confirm(this.confirmOverwriteText.format([overwrite.join(", ")])))
++ return;
++ for(t=0; t<rowNames.length; t++)
++ {
++ var inbound = theStore.fetchTiddler(rowNames[t]);
++ store.saveTiddler(inbound.title, inbound.title, inbound.text, inbound.modifier, inbound.modified, inbound.tags);
++ store.fetchTiddler(inbound.title).created = inbound.created;
++ store.notify(rowNames[t],false);
++ }
++ store.notifyAll();
++ store.setDirty(true);
++ createTiddlyElement(importer,"h2",null,"step4",this.step4.format([rowNames.length]));
++ var step = createTiddlyElement(importer,"div",null,"wizardStep");
++ for(t=0; t<rowNames.length; t++)
++ {
++ createTiddlyLink(step,rowNames[t],true);
++ createTiddlyElement(step,"br");
++ }
++ createTiddlyElement(importer,"h2",null,"step5",this.step5);
++}
++// ---------------------------------------------------------------------------------
++// Menu and toolbar commands
++// ---------------------------------------------------------------------------------
++
++config.commands.closeTiddler.handler = function(event,src,title)
++{
++ story.closeTiddler(title,true,event.shiftKey || event.altKey);
++ return false;
++}
++
++config.commands.closeOthers.handler = function(event,src,title)
++{
++ story.closeAllTiddlers(title);
++ return false;
++}
++
++config.commands.editTiddler.handler = function(event,src,title)
++{
++ clearMessage();
++ story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);
++ story.focusTiddler(title,"text");
++ return false;
++}
++
++config.commands.saveTiddler.handler = function(event,src,title)
++{
++ var newTitle = story.saveTiddler(title,event.shiftKey);
++ if(newTitle)
++ story.displayTiddler(null,newTitle);
++ return false;
++}
++
++config.commands.cancelTiddler.handler = function(event,src,title)
++{
++ if(story.hasChanges(title) && !readOnly)
++ if(!confirm(this.warning.format([title])))
++ return false;
++ story.setDirty(title,false);
++ story.displayTiddler(null,title);
++ return false;
++}
++
++config.commands.deleteTiddler.handler = function(event,src,title)
++{
++ var deleteIt = true;
++ if (config.options.chkConfirmDelete)
++ deleteIt = confirm(this.warning.format([title]));
++ if (deleteIt)
++ {
++ store.removeTiddler(title);
++ story.closeTiddler(title,true,event.shiftKey || event.altKey);
++ if(config.options.chkAutoSave)
++ saveChanges();
++ }
++ return false;
++}
++
++config.commands.permalink.handler = function(event,src,title)
++{
++ var t = encodeURIComponent(String.encodeTiddlyLink(title));
++ if(window.location.hash != t)
++ window.location.hash = t;
++ return false;
++}
++
++config.commands.references.handler = function(event,src,title)
++{
++ var popup = Popup.create(src);
++ if(popup)
++ {
++ var references = store.getReferringTiddlers(title);
++ var c = false;
++ for(var r=0; r<references.length; r++)
++ if(references[r].title != title && !references[r].isTagged("excludeLists"))
++ {
++ createTiddlyLink(createTiddlyElement(popup,"li"),references[r].title,true);
++ c = true;
++ }
++ if(!c)
++ createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),this.popupNone);
++ }
++ Popup.show(popup,false);
++ event.cancelBubble = true;
++ if (event.stopPropagation) event.stopPropagation();
++ return false;
++}
++
++config.commands.jump.handler = function(event,src,title)
++{
++ var popup = Popup.create(src);
++ if(popup)
++ {
++ story.forEachTiddler(function(title,element) {
++ createTiddlyLink(createTiddlyElement(popup,"li"),title,true);
++ });
++ }
++ Popup.show(popup,false);
++ event.cancelBubble = true;
++ if (event.stopPropagation) event.stopPropagation();
++ return false;
++}
++
++// ---------------------------------------------------------------------------------
++// Tiddler() object
++// ---------------------------------------------------------------------------------
++
++function Tiddler()
++{
++ this.title = null;
++ this.text = null;
++ this.modifier = null;
++ this.modified = new Date();
++ this.created = new Date();
++ this.links = [];
++ this.linksUpdated = false;
++ this.tags = [];
++ return this;
++}
++
++Tiddler.prototype.getLinks = function()
++{
++ if(this.linksUpdated==false)
++ this.changed();
++ return this.links;
++}
++
++// Format the text for storage in an RSS item
++Tiddler.prototype.saveToRss = function(url)
++{
++ var s = [];
++ s.push("<item>");
++ s.push("<title" + ">" + this.title.htmlEncode() + "</title" + ">");
++ s.push("<description>" + wikifyStatic(this.text,null,this).htmlEncode() + "</description>");
++ for(var t=0; t<this.tags.length; t++)
++ s.push("<category>" + this.tags[t] + "</category>");
++ s.push("<link>" + url + "#" + encodeURIComponent(String.encodeTiddlyLink(this.title)) + "</link>");
++ s.push("<pubDate>" + this.modified.toGMTString() + "</pubDate>");
++ s.push("</item>");
++ return(s.join("\n"));
++}
++
++// Change the text and other attributes of a tiddler
++Tiddler.prototype.set = function(title,text,modifier,modified,tags,created,fields)
++{
++ this.assign(title,text,modifier,modified,tags,created,fields);
++ this.changed();
++ return this;
++}
++
++// Change the text and other attributes of a tiddler without triggered a tiddler.changed() call
++Tiddler.prototype.assign = function(title,text,modifier,modified,tags,created,fields)
++{
++ if(title != undefined)
++ this.title = title;
++ if(text != undefined)
++ this.text = text;
++ if(modifier != undefined)
++ this.modifier = modifier;
++ if(modified != undefined)
++ this.modified = modified;
++ if(created != undefined)
++ this.created = created;
++ if(fields != undefined)
++ this.fields = fields;
++ if(tags != undefined)
++ this.tags = (typeof tags == "string") ? tags.readBracketedList() : tags;
++ else if(this.tags == undefined)
++ this.tags = [];
++ return this;
++}
++
++// Get the tags for a tiddler as a string (space delimited, using [[brackets]] for tags containing spaces)
++Tiddler.prototype.getTags = function()
++{
++ return String.encodeTiddlyLinkList(this.tags);
++}
++
++// Test if a tiddler carries a tag
++Tiddler.prototype.isTagged = function(tag)
++{
++ return this.tags.indexOf(tag) != -1;
++}
++
++// Static method to convert "\n" to newlines, "\s" to "\"
++Tiddler.unescapeLineBreaks = function(text)
++{
++ return text ? text.unescapeLineBreaks() : "";
++}
++
++// Convert newlines to "\n", "\" to "\s"
++Tiddler.prototype.escapeLineBreaks = function()
++{
++ return this.text.escapeLineBreaks();
++}
++
++// Updates the secondary information (like links[] array) after a change to a tiddler
++Tiddler.prototype.changed = function()
++{
++ this.links = [];
++ var t = this.autoLinkWikiWords() ? 0 : 1;
++ var tiddlerLinkRegExp = t==0 ? config.textPrimitives.tiddlerAnyLinkRegExp : config.textPrimitives.tiddlerForcedLinkRegExp;
++ tiddlerLinkRegExp.lastIndex = 0;
++ var formatMatch = tiddlerLinkRegExp.exec(this.text);
++ while(formatMatch)
++ {
++ if(t==0 && formatMatch[1] && formatMatch[1] != this.title) // wikiWordLink
++ {
++ if(formatMatch.index > 0)
++ {
++ var preRegExp = new RegExp(config.textPrimitives.unWikiLink+"|"+config.textPrimitives.anyLetter,"mg");
++ preRegExp.lastIndex = formatMatch.index-1;
++ var preMatch = preRegExp.exec(this.text);
++ if(preMatch.index != formatMatch.index-1)
++ this.links.pushUnique(formatMatch[1]);
++ }
++ else
++ this.links.pushUnique(formatMatch[1]);
++ }
++ else if(formatMatch[2-t] && (store.tiddlerExists(formatMatch[3-t]) || store.isShadowTiddler(formatMatch[3-t]))) // titledBrackettedLink
++ this.links.pushUnique(formatMatch[3-t]);
++ else if(formatMatch[4-t] && formatMatch[4-t] != this.title) // brackettedLink
++ this.links.pushUnique(formatMatch[4-t]);
++ // Do not add link if match urlPattern (formatMatch[5-t])
++ formatMatch = tiddlerLinkRegExp.exec(this.text);
++ }
++ this.linksUpdated = true;
++ return;
++}
++
++Tiddler.prototype.getSubtitle = function()
++{
++ var theModifier = this.modifier;
++ if(!theModifier)
++ theModifier = config.messages.subtitleUnknown;
++ var theModified = this.modified;
++ if(theModified)
++ theModified = theModified.toLocaleString();
++ else
++ theModified = config.messages.subtitleUnknown;
++ return(config.messages.tiddlerLinkTooltip.format([this.title,theModifier,theModified]));
++}
++
++Tiddler.prototype.isReadOnly = function()
++{
++ return readOnly;
++}
++
++Tiddler.prototype.autoLinkWikiWords = function()
++{
++ return !(this.isTagged("systemConfig") || this.isTagged("excludeMissing"));
++}
++
++Tiddler.prototype.generateFingerprint = function()
++{
++ return "0x" + Crypto.hexSha1Str(this.text);
++}
++
++// ---------------------------------------------------------------------------------
++// TiddlyWiki() object contains Tiddler()s
++// ---------------------------------------------------------------------------------
++
++function TiddlyWiki()
++{
++ var tiddlers = {}; // Hashmap by name of tiddlers
++ this.tiddlersUpdated = false;
++ this.namedNotifications = []; // Array of {name:,notify:} of notification functions
++ this.notificationLevel = 0;
++ this.slices = {}; // map tiddlerName->(map sliceName->sliceValue). Lazy.
++ this.clear = function() {
++ tiddlers = {};
++ this.setDirty(false);
++ };
++ this.fetchTiddler = function(title) {
++ return tiddlers[title];
++ };
++ this.deleteTiddler = function(title) {
++ delete this.slices[title];
++ delete tiddlers[title];
++ };
++ this.addTiddler = function(tiddler) {
++ delete this.slices[tiddler.title];
++ tiddlers[tiddler.title] = tiddler;
++ };
++ this.forEachTiddler = function(callback) {
++ for(var t in tiddlers)
++ {
++ var tiddler = tiddlers[t];
++ if(tiddler instanceof Tiddler)
++ callback.call(this,t,tiddler);
++ }
++ };
++}
++
++// Set the dirty flag
++TiddlyWiki.prototype.setDirty = function(dirty)
++{
++ this.dirty = dirty;
++}
++
++TiddlyWiki.prototype.isDirty = function()
++{
++ return this.dirty;
++}
++
++TiddlyWiki.prototype.suspendNotifications = function()
++{
++ this.notificationLevel--;
++}
++
++TiddlyWiki.prototype.resumeNotifications = function()
++{
++ this.notificationLevel++;
++}
++
++// Invoke the notification handlers for a particular tiddler
++TiddlyWiki.prototype.notify = function(title,doBlanket)
++{
++ if(!this.notificationLevel)
++ for(var t=0; t<this.namedNotifications.length; t++)
++ {
++ var n = this.namedNotifications[t];
++ if((n.name == null && doBlanket) || (n.name == title))
++ n.notify(title);
++ }
++}
++
++// Invoke the notification handlers for all tiddlers
++TiddlyWiki.prototype.notifyAll = function()
++{
++ if(!this.notificationLevel)
++ for(var t=0; t<this.namedNotifications.length; t++)
++ {
++ var n = this.namedNotifications[t];
++ if(n.name)
++ n.notify(n.name);
++ }
++}
++
++// Add a notification handler to a tiddler
++TiddlyWiki.prototype.addNotification = function(title,fn)
++{
++ for (var i=0; i<this.namedNotifications.length; i++)
++ if((this.namedNotifications[i].name == title) && (this.namedNotifications[i].notify == fn))
++ return this;
++ this.namedNotifications.push({name: title, notify: fn});
++ return this;
++}
++
++TiddlyWiki.prototype.removeTiddler = function(title)
++{
++ var tiddler = this.fetchTiddler(title);
++ if(tiddler)
++ {
++ this.deleteTiddler(title);
++ this.notify(title,true);
++ this.setDirty(true);
++ }
++}
++
++TiddlyWiki.prototype.tiddlerExists = function(title)
++{
++ var t = this.fetchTiddler(title);
++ return (t != undefined);
++}
++
++TiddlyWiki.prototype.isShadowTiddler = function(title)
++{
++ return typeof config.shadowTiddlers[title] == "string";
++}
++
++TiddlyWiki.prototype.getTiddler = function(title)
++{
++ var t = this.fetchTiddler(title);
++ if(t != undefined)
++ return t;
++ else
++ return null;
++}
++
++TiddlyWiki.prototype.getTiddlerText = function(title,defaultText)
++{
++ var tiddler = this.fetchTiddler(title);
++ if(tiddler)
++ return tiddler.text;
++ if(!title)
++ return defaultText;
++ var pos = title.indexOf(config.textPrimitives.sliceSeparator);
++ if(pos != -1)
++ {
++ var slice = this.getTiddlerSlice(title.substr(0,pos),title.substr(pos + config.textPrimitives.sliceSeparator.length));
++ if(slice)
++ return slice;
++ }
++ if(this.isShadowTiddler(title))
++ return config.shadowTiddlers[title];
++ if(defaultText != undefined)
++ return defaultText;
++ return null;
++}
++
++TiddlyWiki.prototype.slicesRE = /(?:[\'\/]*~?(\w+)[\'\/]*\:[\'\/]*\s*(.*?)\s*$)|(?:\|[\'\/]*~?(\w+)\:?[\'\/]*\|\s*(.*?)\s*\|)/gm
++
++// @internal
++TiddlyWiki.prototype.calcAllSlices = function(title)
++{
++ var slices = {};
++ var text = this.getTiddlerText(title,"");
++ this.slicesRE.lastIndex = 0;
++ do
++ {
++ var m = this.slicesRE.exec(text);
++ if (m)
++ {
++ if (m[1])
++ slices[m[1]] = m[2];
++ else
++ slices[m[3]] = m[4];
++ }
++ }
++ while(m);
++ return slices;
++}
++
++// Returns the slice of text of the given name
++//#
++//# A text slice is a substring in the tiddler's text that is defined
++//# either like this
++//# aName: textSlice
++//# or
++//# |aName:| textSlice |
++//# or
++//# |aName| textSlice |
++//#
++//# In the text the name (or name:) may be decorated with '' or //. I.e.
++//# this would also a possible text slice:
++//#
++//# |''aName:''| textSlice |
++//#
++//# @param name should only contain "word characters" (i.e. "a-ZA-Z_0-9")
++//# @return [may be undefined] the (trimmed) text of the specified slice.
++TiddlyWiki.prototype.getTiddlerSlice = function(title,sliceName)
++{
++ var slices = this.slices[title];
++ if (!slices) {
++ slices = this.calcAllSlices(title);
++ this.slices[title] = slices;
++ }
++ return slices[sliceName];
++}
++
++// Build an hashmap of the specified named slices of a tiddler
++TiddlyWiki.prototype.getTiddlerSlices = function(title,sliceNames)
++{
++ var r = {};
++ for(var t=0; t<sliceNames.length; t++)
++ {
++ var slice = this.getTiddlerSlice(title,sliceNames[t]);
++ if(slice)
++ r[sliceNames[t]] = slice;
++ }
++ return r;
++}
++
++TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth)
++{
++ var bracketRegExp = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])","mg");
++ var text = this.getTiddlerText(title,null);
++ if(text == null)
++ return defaultText;
++ var textOut = [];
++ var lastPos = 0;
++ do {
++ var match = bracketRegExp.exec(text);
++ if(match)
++ {
++ textOut.push(text.substr(lastPos,match.index-lastPos));
++ if(match[1])
++ {
++ if(depth <= 0)
++ textOut.push(match[1]);
++ else
++ textOut.push(this.getRecursiveTiddlerText(match[1],"[[" + match[1] + "]]",depth-1));
++ }
++ lastPos = match.index + match[0].length;
++ }
++ else
++ textOut.push(text.substr(lastPos));
++ } while(match);
++ return(textOut.join(""));
++}
++
++TiddlyWiki.prototype.setTiddlerTag = function(title,status,tag)
++{
++ var tiddler = this.fetchTiddler(title);
++ if(tiddler)
++ {
++ var t = tiddler.tags.indexOf(tag);
++ if(t != -1)
++ tiddler.tags.splice(t,1);
++ if(status)
++ tiddler.tags.push(tag);
++ tiddler.changed();
++ this.notify(title,true);
++ this.setDirty(true);
++ }
++}
++
++TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields)
++{
++ var tiddler = this.fetchTiddler(title);
++ var created;
++ if(tiddler)
++ {
++ created = tiddler.created; // Preserve created date
++ this.deleteTiddler(title);
++ }
++ else
++ {
++ tiddler = new Tiddler();
++ created = modified;
++ }
++ tiddler.set(newTitle,newBody,modifier,modified,tags,created,fields);
++ this.addTiddler(tiddler);
++ if(title != newTitle)
++ this.notify(title,true);
++ this.notify(newTitle,true);
++ this.setDirty(true);
++ return tiddler;
++}
++
++TiddlyWiki.prototype.createTiddler = function(title)
++{
++ var tiddler = this.fetchTiddler(title);
++ if(!tiddler)
++ {
++ tiddler = new Tiddler();
++ tiddler.title = title;
++ this.addTiddler(tiddler);
++ this.setDirty(true);
++ }
++ return tiddler;
++}
++
++// Load contents of a tiddlywiki from an HTML DIV
++TiddlyWiki.prototype.loadFromDiv = function(src,idPrefix,noUpdate)
++{
++ this.idPrefix = idPrefix;
++ var storeElem = (typeof src == "string") ? document.getElementById(src) : src;
++ var tiddlers = this.getLoader().loadTiddlers(this,storeElem.childNodes);
++ this.setDirty(false);
++ if(!noUpdate)
++ {
++ for(var i = 0;i<tiddlers.length; i++)
++ tiddlers[i].changed();
++ }
++}
++
++TiddlyWiki.prototype.updateTiddlers = function()
++{
++ this.tiddlersUpdated = true;
++ this.forEachTiddler(function(title,tiddler) {
++ tiddler.changed();
++ });
++}
++
++// Return all tiddlers formatted as an HTML string
++TiddlyWiki.prototype.allTiddlersAsHtml = function()
++{
++ return store.getSaver().externalize(store);
++}
++
++// Return an array of tiddlers matching a search regular expression
++TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
++{
++ var candidates = this.reverseLookup("tags",excludeTag,false);
++ var results = [];
++ for(var t=0; t<candidates.length; t++)
++ {
++ if((candidates[t].title.search(searchRegExp) != -1) || (candidates[t].text.search(searchRegExp) != -1))
++ results.push(candidates[t]);
++ }
++ if(!sortField)
++ sortField = "title";
++ results.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
++ return results;
++}
++
++// Return an array of all the tags in use. Each member of the array is another array where [0] is the name of the tag and [1] is the number of occurances
++TiddlyWiki.prototype.getTags = function()
++{
++ var results = [];
++ this.forEachTiddler(function(title,tiddler) {
++ for(var g=0; g<tiddler.tags.length; g++)
++ {
++ var tag = tiddler.tags[g];
++ var f = false;
++ for(var c=0; c<results.length; c++)
++ if(results[c][0] == tag)
++ {
++ f = true;
++ results[c][1]++;
++ }
++ if(!f)
++ results.push([tag,1]);
++ }
++ });
++ results.sort(function(a,b) {return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : (a[0].toLowerCase() == b[0].toLowerCase() ? 0 : +1);});
++ return results;
++}
++
++// Return an array of the tiddlers that are tagged with a given tag
++TiddlyWiki.prototype.getTaggedTiddlers = function(tag,sortField)
++{
++ return this.reverseLookup("tags",tag,true,sortField);
++}
++
++// Return an array of the tiddlers that link to a given tiddler
++TiddlyWiki.prototype.getReferringTiddlers = function(title,unusedParameter,sortField)
++{
++ if(!this.tiddlersUpdated)
++ this.updateTiddlers();
++ return this.reverseLookup("links",title,true,sortField);
++}
++
++// Return an array of the tiddlers that do or do not have a specified entry in the specified storage array (ie, "links" or "tags")
++// lookupMatch == true to match tiddlers, false to exclude tiddlers
++TiddlyWiki.prototype.reverseLookup = function(lookupField,lookupValue,lookupMatch,sortField)
++{
++ var results = [];
++ this.forEachTiddler(function(title,tiddler) {
++ var f = !lookupMatch;
++ for(var lookup=0; lookup<tiddler[lookupField].length; lookup++)
++ if(tiddler[lookupField][lookup] == lookupValue)
++ f = lookupMatch;
++ if(f)
++ results.push(tiddler);
++ });
++ if(!sortField)
++ sortField = "title";
++ results.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
++ return results;
++}
++
++// Return the tiddlers as a sorted array
++TiddlyWiki.prototype.getTiddlers = function(field,excludeTag)
++{
++ var results = [];
++ this.forEachTiddler(function(title,tiddler) {
++ if(excludeTag == undefined || !tiddler.isTagged(excludeTag))
++ results.push(tiddler);
++ });
++ if(field)
++ results.sort(function(a,b) {return a[field] < b[field] ? -1 : (a[field] == b[field] ? 0 : +1);});
++ return results;
++}
++
++// Return array of names of tiddlers that are referred to but not defined
++TiddlyWiki.prototype.getMissingLinks = function(sortField)
++{
++ if(!this.tiddlersUpdated)
++ this.updateTiddlers();
++ var results = [];
++ this.forEachTiddler(function (title,tiddler) {
++ for(var n=0; n<tiddler.links.length;n++)
++ {
++ var link = tiddler.links[n];
++ if(this.fetchTiddler(link) == null && !this.isShadowTiddler(link))
++ results.pushUnique(link);
++ }
++ });
++ results.sort();
++ return results;
++}
++
++// Return an array of names of tiddlers that are defined but not referred to
++TiddlyWiki.prototype.getOrphans = function()
++{
++ var results = [];
++ this.forEachTiddler(function (title,tiddler) {
++ if(this.getReferringTiddlers(title).length == 0 && !tiddler.isTagged("excludeLists"))
++ results.push(title);
++ });
++ results.sort();
++ return results;
++}
++
++// Return an array of names of all the shadow tiddlers
++TiddlyWiki.prototype.getShadowed = function()
++{
++ var results = [];
++ for(var t in config.shadowTiddlers)
++ if(typeof config.shadowTiddlers[t] == "string")
++ results.push(t);
++ results.sort();
++ return results;
++}
++
++// Resolves a Tiddler reference or tiddler title into a Tiddler object, or null if it doesn't exist
++TiddlyWiki.prototype.resolveTiddler = function(tiddler)
++{
++ var t = (typeof tiddler == 'string') ? this.getTiddler(tiddler) : tiddler;
++ return t instanceof Tiddler ? t : null;
++}
++
++TiddlyWiki.prototype.getLoader = function()
++{
++ if (!this.loader)
++ this.loader = new TW21Loader();
++ return this.loader;
++}
++
++TiddlyWiki.prototype.getSaver = function()
++{
++ if (!this.saver)
++ this.saver = new TW21Saver();
++ return this.saver;
++}
++
++// Returns true if path is a valid field name (path),
++// i.e. a sequence of identifiers, separated by '.'
++TiddlyWiki.isValidFieldName = function (name) {
++ var match = /[a-zA-Z_]\w*(\.[a-zA-Z_]\w*)*/.exec(name);
++ return match && (match[0] == name);
++}
++
++// Throws an exception when name is not a valid field name.
++TiddlyWiki.checkFieldName = function(name) {
++ if (!TiddlyWiki.isValidFieldName(name))
++ throw config.messages.invalidFieldName.format([name]);
++}
++
++function StringFieldAccess(n, readOnly) {
++ this.set = readOnly
++ ? function(t,v) {if (v != t[n]) throw config.messages.fieldCannotBeChanged.format([n]);}
++ : function(t,v) {if (v != t[n]) {t[n] = v; return true;}};
++ this.get = function(t) {return t[n];};
++}
++
++function DateFieldAccess(n) {
++ this.set = function(t,v) {
++ var d = v instanceof Date ? v : Date.convertFromYYYYMMDDHHMM(v);
++ if (d != t[n]) {
++ t[n] = d; return true;
++ }
++ };
++ this.get = function(t) {return t[n].convertToYYYYMMDDHHMM();}
++}
++
++function LinksFieldAccess(n) {
++ this.set = function(t,v) {
++ var s = (typeof v == "string") ? v.readBracketedList() : v;
++ if (s.toString() != t[n].toString()) {
++ t[n] = s; return true;
++ }
++ };
++ this.get = function(t) {return String.encodeTiddlyLinkList(t[n]);}
++}
++
++TiddlyWiki.standardFieldAccess = {
++ // The set functions return true when setting the data has changed the value.
++
++ "title": new StringFieldAccess("title", true),
++ // Handle the "tiddler" field name as the title
++ "tiddler": new StringFieldAccess("title", true),
++
++ "text": new StringFieldAccess("text"),
++ "modifier": new StringFieldAccess("modifier"),
++ "modified": new DateFieldAccess("modified"),
++ "created": new DateFieldAccess("created"),
++ "tags": new LinksFieldAccess("tags")
++};
++
++TiddlyWiki.isStandardField = function(name) {
++ return TiddlyWiki.standardFieldAccess[name] != undefined;
++}
++
++// Sets the value of the given field of the tiddler to the value.
++// Setting an ExtendedField's value to null or undefined removes the field.
++// Setting a namespace to undefined removes all fields of that namespace.
++// The fieldName is case-insensitive.
++// All values will be converted to a string value.
++TiddlyWiki.prototype.setValue = function(tiddler, fieldName, value) {
++ TiddlyWiki.checkFieldName(fieldName);
++ var t = this.resolveTiddler(tiddler);
++ if (!t)
++ return;
++
++ fieldName = fieldName.toLowerCase();
++
++ var isRemove = (value === undefined) || (value === null);
++
++ if (!t.fields)
++ t.fields = {};
++
++ var accessor = TiddlyWiki.standardFieldAccess[fieldName];
++ if (accessor) {
++ if (isRemove)
++ // don't remove StandardFields
++ return;
++ var h = TiddlyWiki.standardFieldAccess[fieldName];
++ if (!h.set(t, value))
++ return;
++
++ } else {
++ var oldValue = t.fields[fieldName];
++
++ if (isRemove) {
++ if (oldValue !== undefined) {
++ // deletes a single field
++ delete t.fields[fieldName];
++ } else {
++ // no concrete value is defined for the fieldName
++ // so we guess this is a namespace path.
++
++ // delete all fields in a namespace
++ var re = new RegExp('^'+fieldName+'\\.');
++ var dirty = false;
++ for (var n in t.fields) {
++ if (n.match(re)) {
++ delete t.fields[n];
++ dirty = true;
++ }
++ }
++ if (!dirty)
++ return
++ }
++
++ } else {
++ // the "normal" set case. value is defined (not null/undefined)
++ // For convenience provide a nicer conversion Date->String
++ value = value instanceof Date
++ ? value.convertToYYYYMMDDHHMMSSMMM()
++ : String(value);
++ if (oldValue == value)
++ return;
++ t.fields[fieldName] = value;
++ }
++ }
++
++ // When we are here the tiddler/store really was changed.
++ this.notify(t.title,true);
++ if (!fieldName.match(/^temp\./))
++ this.setDirty(true);
++}
++
++// Returns the value of the given field of the tiddler.
++// The fieldName is case-insensitive.
++// Will only return String values (or undefined).
++TiddlyWiki.prototype.getValue = function(tiddler, fieldName) {
++ var t = this.resolveTiddler(tiddler);
++ if (!t)
++ return undefined;
++
++ fieldName = fieldName.toLowerCase();
++
++ var accessor = TiddlyWiki.standardFieldAccess[fieldName];
++ if (accessor) {
++ return accessor.get(t);
++ }
++
++ return t.fields ? t.fields[fieldName] : undefined;
++}
++
++// Calls the callback function for every field in the tiddler.
++//
++// When callback function returns a non-false value the iteration stops
++// and that value is returned.
++//
++// The order of the fields is not defined.
++//
++// @param callback a function(tiddler, fieldName, value).
++//
++TiddlyWiki.prototype.forEachField = function(tiddler, callback, onlyExtendedFields) {
++ var t = this.resolveTiddler(tiddler);
++ if (!t)
++ return undefined;
++
++ if (t.fields) {
++ for (var n in t.fields) {
++ var result = callback(t, n, t.fields[n]);
++ if (result)
++ return result;
++ }
++ }
++
++ if (onlyExtendedFields)
++ return undefined;
++
++ for (var n in TiddlyWiki.standardFieldAccess) {
++ if (n == "tiddler")
++ // even though the "title" field can also be referenced through the name "tiddler"
++ // we only visit this field once.
++ continue;
++
++ var result = callback(t, n, TiddlyWiki.standardFieldAccess[n].get(t));
++ if (result)
++ return result;
++ }
++
++ return undefined;
++};
++// ---------------------------------------------------------------------------------
++// Story functions
++// ---------------------------------------------------------------------------------
++
++// A story is a HTML div containing a sequence of tiddlers that can be manipulated
++// container - id of containing element
++// idPrefix - string prefix prepended to title to make ids for tiddlers in this story
++function Story(container,idPrefix)
++{
++ this.container = container;
++ this.idPrefix = idPrefix;
++ this.highlightRegExp = null;
++}
++
++// Iterate through all the tiddlers in a story
++// fn - callback function to be called for each tiddler. Arguments are:
++// tiddler - reference to Tiddler object
++// element - reference to tiddler display element
++Story.prototype.forEachTiddler = function(fn)
++{
++ var place = document.getElementById(this.container);
++ if(!place)
++ return;
++ var e = place.firstChild;
++ while(e)
++ {
++ var n = e.nextSibling;
++ var title = e.getAttribute("tiddler");
++ fn.call(this,title,e);
++ e = n;
++ }
++}
++
++// Display several tiddlers given their titles in an array. Parameters same as displayTiddler(), except:
++// titles - array of string titles
++Story.prototype.displayTiddlers = function(srcElement,titles,template,animate,slowly)
++{
++ for(var t = titles.length-1;t>=0;t--)
++ this.displayTiddler(srcElement,titles[t],template,animate,slowly);
++}
++
++// Display a given tiddler with a given template. If the tiddler is already displayed but with a different
++// template, it is switched to the specified template
++// srcElement - reference to element from which this one is being opened -or-
++// special positions "top", "bottom"
++// title - title of tiddler to display
++// template - the name of the tiddler containing the template -or-
++// one of the constants DEFAULT_VIEW_TEMPLATE and DEFAULT_EDIT_TEMPLATE -or-
++// null or undefined to indicate the current template if there is one, DEFAULT_VIEW_TEMPLATE if not
++// animate - whether to perform animations
++// slowly - whether to perform animations in slomo
++Story.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)
++{
++ var place = document.getElementById(this.container);
++ var tiddlerElem = document.getElementById(this.idPrefix + title);
++ if(tiddlerElem)
++ this.refreshTiddler(title,template);
++ else
++ {
++ var before = this.positionTiddler(srcElement);
++ tiddlerElem = this.createTiddler(place,before,title,template);
++ }
++ if(srcElement && typeof srcElement !== "string")
++ {
++ if(anim && config.options.chkAnimate && (animate == undefined || animate == true))
++ anim.startAnimating(new Cascade(title,srcElement,tiddlerElem,slowly),new Scroller(tiddlerElem,slowly));
++ else
++ window.scrollTo(0,ensureVisible(tiddlerElem));
++ }
++}
++
++// Figure out the appropriate position for a newly opened tiddler
++// srcElement - reference to the element containing the link to the tiddler -or-
++// special positions "top", "bottom"
++// returns - reference to the tiddler that the new one should appear before (null for the bottom of the story)
++Story.prototype.positionTiddler = function(srcElement)
++{
++ var place = document.getElementById(this.container);
++ var before;
++ if(typeof srcElement == "string")
++ {
++ switch(srcElement)
++ {
++ case "top":
++ before = place.firstChild;
++ break;
++ case "bottom":
++ before = null;
++ break;
++ }
++ }
++ else
++ {
++ var after = this.findContainingTiddler(srcElement);
++ if(after == null)
++ before = place.firstChild;
++ else if(after.nextSibling)
++ before = after.nextSibling;
++ else
++ before = null;
++ }
++ return before;
++}
++
++// Create a tiddler frame at the appropriate place in a story column
++// place - reference to parent element
++// before - null, or reference to element before which to insert new tiddler
++// title - title of new tiddler
++// template - the name of the tiddler containing the template or one of the constants DEFAULT_VIEW_TEMPLATE and DEFAULT_EDIT_TEMPLATE
++Story.prototype.createTiddler = function(place,before,title,template)
++{
++ var tiddlerElem = createTiddlyElement(null,"div",this.idPrefix + title,"tiddler");
++ tiddlerElem.setAttribute("refresh","tiddler");
++ place.insertBefore(tiddlerElem,before);
++ this.refreshTiddler(title,template);
++ return tiddlerElem;
++}
++
++// Overridable for choosing the name of the template to apply for a tiddler
++Story.prototype.chooseTemplateForTiddler = function(title,template)
++{
++ if(!template)
++ template = DEFAULT_VIEW_TEMPLATE;
++ if(template == DEFAULT_VIEW_TEMPLATE || template == DEFAULT_EDIT_TEMPLATE)
++ template = config.tiddlerTemplates[template];
++ return template;
++}
++
++// Overridable for extracting the text of a template from a tiddler
++Story.prototype.getTemplateForTiddler = function(title,template,tiddler)
++{
++ return store.getRecursiveTiddlerText(template,null,10);
++}
++
++// Apply a template to an existing tiddler if it is not already displayed using that template
++// title - title of tiddler to update
++// template - the name of the tiddler containing the template or one of the constants DEFAULT_VIEW_TEMPLATE and DEFAULT_EDIT_TEMPLATE
++// force - if true, forces the refresh even if the template hasn't changedd
++Story.prototype.refreshTiddler = function(title,template,force)
++{
++ var tiddlerElem = document.getElementById(this.idPrefix + title);
++ if(tiddlerElem)
++ {
++ if(tiddlerElem.getAttribute("dirty") == "true" && !force)
++ return tiddlerElem;
++ template = this.chooseTemplateForTiddler(title,template);
++ var currTemplate = tiddlerElem.getAttribute("template");
++ if((template != currTemplate) || force)
++ {
++ var tiddler = store.getTiddler(title);
++ if(!tiddler)
++ {
++ tiddler = new Tiddler();
++ if(store.isShadowTiddler(title))
++ tiddler.set(title,store.getTiddlerText(title),config.views.wikified.shadowModifier,version.date,[],version.date);
++ else
++ {
++ var text = template=="EditTemplate"
++ ? config.views.editor.defaultText.format([title])
++ : config.views.wikified.defaultText.format([title]);
++ tiddler.set(title,text,config.views.wikified.defaultModifier,version.date,[],version.date);
++ }
++ }
++ tiddlerElem.setAttribute("tags",tiddler.tags.join(" "));
++ tiddlerElem.setAttribute("tiddler",title);
++ tiddlerElem.setAttribute("template",template);
++ var me = this;
++ tiddlerElem.onmouseover = this.onTiddlerMouseOver;
++ tiddlerElem.onmouseout = this.onTiddlerMouseOut;
++ tiddlerElem.ondblclick = this.onTiddlerDblClick;
++ tiddlerElem[window.event?"onkeydown":"onkeypress"] = this.onTiddlerKeyPress;
++ var html = this.getTemplateForTiddler(title,template,tiddler);
++ tiddlerElem.innerHTML = html;
++ applyHtmlMacros(tiddlerElem,tiddler);
++ if(store.getTaggedTiddlers(title).length > 0)
++ addClass(tiddlerElem,"isTag");
++ else
++ removeClass(tiddlerElem,"isTag");
++ if(!store.tiddlerExists(title))
++ {
++ if(store.isShadowTiddler(title))
++ addClass(tiddlerElem,"shadow");
++ else
++ addClass(tiddlerElem,"missing");
++ }
++ else
++ {
++ removeClass(tiddlerElem,"shadow");
++ removeClass(tiddlerElem,"missing");
++ }
++ }
++ }
++ return tiddlerElem;
++}
++
++// Refresh all tiddlers in the Story
++Story.prototype.refreshAllTiddlers = function()
++{
++ var place = document.getElementById(this.container);
++ var e = place.firstChild;
++ if(!e)
++ return;
++ this.refreshTiddler(e.getAttribute("tiddler"),e.getAttribute("template"),true);
++ while((e = e.nextSibling) != null)
++ this.refreshTiddler(e.getAttribute("tiddler"),e.getAttribute("template"),true);
++}
++
++// Default tiddler onmouseover/out event handlers
++Story.prototype.onTiddlerMouseOver = function(e)
++{
++ if(window.addClass instanceof Function)
++ addClass(this,"selected");
++}
++
++Story.prototype.onTiddlerMouseOut = function(e)
++{
++ if(window.removeClass instanceof Function)
++ removeClass(this,"selected");
++}
++
++// Default tiddler ondblclick event handler
++Story.prototype.onTiddlerDblClick = function(e)
++{
++ if(!e) var e = window.event;
++ var theTarget = resolveTarget(e);
++ if(theTarget && theTarget.nodeName.toLowerCase() != "input" && theTarget.nodeName.toLowerCase() != "textarea")
++ {
++ if(document.selection && document.selection.empty)
++ document.selection.empty();
++ config.macros.toolbar.invokeCommand(this,"defaultCommand",e);
++ e.cancelBubble = true;
++ if (e.stopPropagation) e.stopPropagation();
++ return true;
++ }
++ else
++ return false;
++}
++
++Story.prototype.onTiddlerKeyPress = function(e)
++{
++ if(!e) var e = window.event;
++ clearMessage();
++ var consume = false;
++ var title = this.getAttribute("tiddler");
++ var target = resolveTarget(e);
++ switch(e.keyCode)
++ {
++ case 9: // Tab
++ if(config.options.chkInsertTabs && target.tagName.toLowerCase() == "textarea")
++ {
++ replaceSelection(target,String.fromCharCode(9));
++ consume = true;
++ }
++ if(config.isOpera)
++ {
++ target.onblur = function()
++ {
++ this.focus();
++ this.onblur = null;
++ }
++ }
++ break;
++ case 13: // Ctrl-Enter
++ case 10: // Ctrl-Enter on IE PC
++ case 77: // Ctrl-Enter is "M" on some platforms
++ if(e.ctrlKey)
++ {
++ blurElement(this);
++ config.macros.toolbar.invokeCommand(this,"defaultCommand",e);
++ consume = true;
++ }
++ break;
++ case 27: // Escape
++ blurElement(this);
++ config.macros.toolbar.invokeCommand(this,"cancelCommand",e);
++ consume = true;
++ break;
++ }
++ e.cancelBubble = consume;
++ if(consume)
++ {
++ if(e.stopPropagation) e.stopPropagation(); // Stop Propagation
++ e.returnValue = true; // Cancel The Event in IE
++ if(e.preventDefault ) e.preventDefault(); // Cancel The Event in Moz
++ }
++ return(!consume);
++};
++
++// Returns the specified field (input or textarea element) in a tiddler, otherwise the first edit field it finds
++// or null if it found no edit field at all
++Story.prototype.getTiddlerField = function(title,field)
++{
++ var tiddlerElem = document.getElementById(this.idPrefix + title);
++ var e = null;
++ if(tiddlerElem != null)
++ {
++ var children = tiddlerElem.getElementsByTagName("*");
++ for (var t=0; t<children.length; t++)
++ {
++ var c = children[t];
++ if(c.tagName.toLowerCase() == "input" || c.tagName.toLowerCase() == "textarea")
++ {
++ if(!e)
++ e = c;
++ if(c.getAttribute("edit") == field)
++ e = c;
++ }
++ }
++ }
++ return e;
++}
++
++// Focus a specified tiddler. Attempts to focus the specified field, otherwise the first edit field it finds
++Story.prototype.focusTiddler = function(title,field)
++{
++ var e = this.getTiddlerField(title,field);
++ if(e)
++ {
++ e.focus();
++ e.select();
++ }
++}
++
++// Ensures that a specified tiddler does not have the focus
++Story.prototype.blurTiddler = function(title)
++{
++ var tiddlerElem = document.getElementById(this.idPrefix + title);
++ if(tiddlerElem != null && tiddlerElem.focus && tiddlerElem.blur)
++ {
++ tiddlerElem.focus();
++ tiddlerElem.blur();
++ }
++}
++
++// Adds a specified value to the edit controls (if any) of a particular
++// array-formatted field of a particular tiddler (eg "tags")
++// title - name of tiddler
++// tag - value of field, without any [[brackets]]
++// mode - +1 to add the tag, -1 to remove it, 0 to toggle it
++// field - name of field (eg "tags")
++Story.prototype.setTiddlerField = function(title,tag,mode,field)
++{
++ var c = story.getTiddlerField(title,field);
++
++ var tags = c.value.readBracketedList();
++ tags.setItem(tag,mode);
++ c.value = String.encodeTiddlyLinkList(tags);
++}
++
++// The same as setTiddlerField but preset to the "tags" field
++Story.prototype.setTiddlerTag = function(title,tag,mode)
++{
++ Story.prototype.setTiddlerField(title,tag,mode,"tags");
++}
++
++// Close a specified tiddler
++// title - name of tiddler to close
++// animate - whether to perform animations
++// slowly - whether to perform animations in slomo
++Story.prototype.closeTiddler = function(title,animate,slowly)
++{
++ var tiddlerElem = document.getElementById(this.idPrefix + title);
++ if(tiddlerElem != null)
++ {
++ clearMessage();
++ this.scrubTiddler(tiddlerElem);
++ if(anim && config.options.chkAnimate && animate)
++ anim.startAnimating(new Slider(tiddlerElem,false,slowly,"all"));
++ else
++ tiddlerElem.parentNode.removeChild(tiddlerElem);
++ }
++}
++
++// Scrub IDs from a tiddler. This is so that the 'ghost' of a tiddler while it is being closed
++// does not interfere with things
++// tiddler - reference to the tiddler element
++Story.prototype.scrubTiddler = function(tiddlerElem)
++{
++ tiddlerElem.id = null;
++}
++
++// Set the 'dirty' flag of a tiddler
++// title - title of tiddler to change
++// dirty - new boolean status of flag
++Story.prototype.setDirty = function(title,dirty)
++{
++ var tiddlerElem = document.getElementById(this.idPrefix + title);
++ if(tiddlerElem != null)
++ tiddlerElem.setAttribute("dirty",dirty ? "true" : "false");
++}
++
++// Is a particular tiddler dirty (with unsaved changes)?
++Story.prototype.isDirty = function(title)
++{
++ var tiddlerElem = document.getElementById(this.idPrefix + title);
++ if(tiddlerElem != null)
++ return tiddlerElem.getAttribute("dirty") == "true";
++ return null;
++}
++
++// Determine whether any open tiddler are dirty
++Story.prototype.areAnyDirty = function()
++{
++ var r = false;
++ this.forEachTiddler(function(title,element) {
++ if(this.isDirty(title))
++ r = true;
++ });
++ return r;
++}
++
++// Close all tiddlers in the story
++Story.prototype.closeAllTiddlers = function(exclude)
++{
++ clearMessage();
++ this.forEachTiddler(function(title,element) {
++ if((title != exclude) && element.getAttribute("dirty") != "true")
++ this.closeTiddler(title);
++ });
++ window.scrollTo(0,0);
++}
++
++// Check if there are any tiddlers in the story
++Story.prototype.isEmpty = function()
++{
++ var place = document.getElementById(this.container);
++ return(place && place.firstChild == null);
++}
++
++// Perform a search and display the result
++// text - text to search for
++// useCaseSensitive - true for case sensitive matching
++// useRegExp - true to interpret text as a RegExp
++Story.prototype.search = function(text,useCaseSensitive,useRegExp)
++{
++ this.closeAllTiddlers();
++ highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
++ var matches = store.search(highlightHack,"title","excludeSearch");
++ var titles = [];
++ for(var t=matches.length-1; t>=0; t--)
++ titles.push(matches[t].title);
++ this.displayTiddlers(null,titles);
++ highlightHack = null;
++ var q = useRegExp ? "/" : "'";
++ if(matches.length > 0)
++ displayMessage(config.macros.search.successMsg.format([titles.length.toString(),q + text + q]));
++ else
++ displayMessage(config.macros.search.failureMsg.format([q + text + q]));
++}
++
++// Determine if the specified element is within a tiddler in this story
++// e - reference to an element
++// returns: reference to a tiddler element or null if none
++Story.prototype.findContainingTiddler = function(e)
++{
++ while(e && !hasClass(e,"tiddler"))
++ e = e.parentNode;
++ return(e);
++}
++
++// Gather any saveable fields from a tiddler element
++// e - reference to an element to scan recursively
++// fields - object to contain gathered field values
++Story.prototype.gatherSaveFields = function(e,fields)
++{
++ if(e && e.getAttribute)
++ {
++ var f = e.getAttribute("edit");
++ if(f)
++ fields[f] = e.value.replace(/\r/mg,"");;
++ if(e.hasChildNodes())
++ {
++ var c = e.childNodes;
++ for(var t=0; t<c.length; t++)
++ this.gatherSaveFields(c[t],fields)
++ }
++ }
++}
++
++// Determine whether a tiddler has any edit fields, and if so if their values have been changed
++// title - name of tiddler
++Story.prototype.hasChanges = function(title)
++{
++ var e = document.getElementById(this.idPrefix + title);
++ if(e != null)
++ {
++ var fields = {};
++ this.gatherSaveFields(e,fields);
++ var tiddler = store.fetchTiddler(title);
++ if (!tiddler)
++ return false;
++ for(var n in fields)
++ if (store.getValue(title,n) != fields[n])
++ return true;
++ }
++ return false;
++}
++
++// Save any open edit fields of a tiddler and updates the display as necessary
++// title - name of tiddler
++// minorUpdate - true if the modified date shouldn't be updated
++// returns: title of saved tiddler, or null if not saved
++Story.prototype.saveTiddler = function(title,minorUpdate)
++{
++ var tiddlerElem = document.getElementById(this.idPrefix + title);
++ if(tiddlerElem != null)
++ {
++ var fields = {};
++ this.gatherSaveFields(tiddlerElem,fields);
++ var newTitle = fields.title ? fields.title : title;
++ if(store.tiddlerExists(newTitle) && newTitle != title)
++ {
++ if(confirm(config.messages.overwriteWarning.format([newTitle.toString()])))
++ this.closeTiddler(newTitle,false,false);
++ else
++ return null;
++ }
++ tiddlerElem.id = this.idPrefix + newTitle;
++ tiddlerElem.setAttribute("tiddler",newTitle);
++ tiddlerElem.setAttribute("template",DEFAULT_VIEW_TEMPLATE);
++ tiddlerElem.setAttribute("dirty","false");
++ if(config.options.chkForceMinorUpdate)
++ minorUpdate = !minorUpdate;
++ var newDate = new Date();
++ store.saveTiddler(title,newTitle,fields.text,config.options.txtUserName,minorUpdate ? undefined : newDate,fields.tags);
++ for (var n in fields)
++ if (!TiddlyWiki.isStandardField(n))
++ store.setValue(newTitle,n,fields[n]);
++ if(config.options.chkAutoSave)
++ saveChanges();
++ return newTitle;
++ }
++ return null;
++}
++
++Story.prototype.permaView = function()
++{
++ var links = [];
++ this.forEachTiddler(function(title,element) {
++ links.push(String.encodeTiddlyLink(title));
++ });
++ var t = encodeURIComponent(links.join(" "));
++ if(t == "")
++ t = "#";
++ if(window.location.hash != t)
++ window.location.hash = t;
++}
++
++// ---------------------------------------------------------------------------------
++// Message area
++// ---------------------------------------------------------------------------------
++
++function getMessageDiv()
++{
++ var msgArea = document.getElementById("messageArea");
++ if(!msgArea)
++ return null;
++ if(!msgArea.hasChildNodes())
++ createTiddlyButton(createTiddlyElement(msgArea,"div",null,"messageToolbar"),
++ config.messages.messageClose.text,
++ config.messages.messageClose.tooltip,
++ clearMessage);
++ msgArea.style.display = "block";
++ return createTiddlyElement(msgArea,"div");
++}
++
++function displayMessage(text,linkText)
++{
++ var e = getMessageDiv();
++ if(!e)
++ {
++ alert(text);
++ return;
++ }
++ if(linkText)
++ {
++ var link = createTiddlyElement(e,"a",null,null,text);
++ link.href = linkText;
++ link.target = "_blank";
++ }
++ else
++ e.appendChild(document.createTextNode(text));
++}
++
++function clearMessage()
++{
++ var msgArea = document.getElementById("messageArea");
++ if(msgArea)
++ {
++ removeChildren(msgArea);
++ msgArea.style.display = "none";
++ }
++ return false;
++}
++
++// ---------------------------------------------------------------------------------
++// Refresh mechanism
++// ---------------------------------------------------------------------------------
++
++config.refreshers = {
++ link: function(e,changeList)
++ {
++ var title = e.getAttribute("tiddlyLink");
++ refreshTiddlyLink(e,title);
++ return true;
++ },
++
++ tiddler: function(e,changeList)
++ {
++ var title = e.getAttribute("tiddler");
++ var template = e.getAttribute("template");
++ if(changeList && changeList.indexOf(title) != -1 && !story.isDirty(title))
++ story.refreshTiddler(title,template,true);
++ else
++ refreshElements(e,changeList);
++ return true;
++ },
++
++ content: function(e,changeList)
++ {
++ var title = e.getAttribute("tiddler");
++ var force = e.getAttribute("force");
++ if(force != null || changeList == null || changeList.indexOf(title) != -1)
++ {
++ removeChildren(e);
++ wikify(store.getTiddlerText(title,title),e);
++ return true;
++ }
++ else
++ return false;
++ },
++
++ macro: function(e,changeList)
++ {
++ var macro = e.getAttribute("macroName");
++ var params = e.getAttribute("params");
++ if(macro)
++ macro = config.macros[macro];
++ if(macro && macro.refresh)
++ macro.refresh(e,params);
++ return true;
++ }
++};
++
++function refreshElements(root,changeList)
++{
++ var nodes = root.childNodes;
++ for(var c=0; c<nodes.length; c++)
++ {
++ var e = nodes[c],type;
++ if(e.getAttribute)
++ type = e.getAttribute("refresh");
++ else
++ type = null;
++ var refresher = config.refreshers[type];
++ var refreshed = false;
++ if(refresher != undefined)
++ refreshed = refresher(e,changeList);
++ if(e.hasChildNodes() && !refreshed)
++ refreshElements(e,changeList);
++ }
++}
++
++function applyHtmlMacros(root,tiddler)
++{
++ var e = root.firstChild;
++ while(e)
++ {
++ var nextChild = e.nextSibling;
++ if(e.getAttribute)
++ {
++ var macro = e.getAttribute("macro");
++ if(macro)
++ {
++ var params = "";
++ var p = macro.indexOf(" ");
++ if(p != -1)
++ {
++ params = macro.substr(p+1);
++ macro = macro.substr(0,p);
++ }
++ invokeMacro(e,macro,params,null,tiddler);
++ }
++ }
++ if(e.hasChildNodes())
++ applyHtmlMacros(e,tiddler);
++ e = nextChild;
++ }
++}
++
++function refreshPageTemplate(title)
++{
++ var stash = createTiddlyElement(document.body,"div");
++ stash.style.display = "none";
++ var display = document.getElementById("tiddlerDisplay");
++ var nodes,t;
++ if(display)
++ {
++ nodes = display.childNodes;
++ for(t=nodes.length-1; t>=0; t--)
++ stash.appendChild(nodes[t]);
++ }
++ var wrapper = document.getElementById("contentWrapper");
++ if(!title)
++ title = "PageTemplate";
++ var html = store.getRecursiveTiddlerText(title,null,10);
++ wrapper.innerHTML = html;
++ applyHtmlMacros(wrapper);
++ refreshElements(wrapper);
++ display = document.getElementById("tiddlerDisplay");
++ removeChildren(display);
++ if(!display)
++ display = createTiddlyElement(wrapper,"div","tiddlerDisplay");
++ nodes = stash.childNodes;
++ for(t=nodes.length-1; t>=0; t--)
++ display.appendChild(nodes[t]);
++ stash.parentNode.removeChild(stash);
++}
++
++function refreshDisplay(hint)
++{
++ var e = document.getElementById("contentWrapper");
++ if(typeof hint == "string")
++ hint = [hint];
++ refreshElements(e,hint);
++}
++
++function refreshPageTitle()
++{
++ document.title = wikifyPlain("SiteTitle") + " - " + wikifyPlain("SiteSubtitle");
++}
++
++function refreshStyles(title)
++{
++ setStylesheet(title == null ? "" : store.getRecursiveTiddlerText(title,"",10),title);
++}
++
++function refreshColorPalette(title)
++{
++ if(!startingUp)
++ refreshAll();
++}
++
++function refreshAll()
++{
++ refreshPageTemplate();
++ refreshDisplay();
++ refreshStyles("StyleSheetLayout");
++ refreshStyles("StyleSheetColors");
++ refreshStyles("StyleSheet");
++ refreshStyles("StyleSheetPrint");
++}
++
++// ---------------------------------------------------------------------------------
++// Options cookie stuff
++// ---------------------------------------------------------------------------------
++
++function loadOptionsCookie()
++{
++ if(safeMode)
++ return;
++ var cookies = document.cookie.split(";");
++ for(var c=0; c<cookies.length; c++)
++ {
++ var p = cookies[c].indexOf("=");
++ if(p != -1)
++ {
++ var name = cookies[c].substr(0,p).trim();
++ var value = cookies[c].substr(p+1).trim();
++ switch(name.substr(0,3))
++ {
++ case "txt":
++ config.options[name] = unescape(value);
++ break;
++ case "chk":
++ config.options[name] = value == "true";
++ break;
++ }
++ }
++ }
++}
++
++function saveOptionCookie(name)
++{
++ if(safeMode)
++ return;
++ var c = name + "=";
++ switch(name.substr(0,3))
++ {
++ case "txt":
++ c += escape(config.options[name].toString());
++ break;
++ case "chk":
++ c += config.options[name] ? "true" : "false";
++ break;
++ }
++ c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";
++ document.cookie = c;
++}
++
++// ---------------------------------------------------------------------------------
++// Saving
++// ---------------------------------------------------------------------------------
++
++var saveUsingSafari = false;
++
++var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it
++var endSaveArea = '</d' + 'iv>';
++
++// If there are unsaved changes, force the user to confirm before exitting
++function confirmExit()
++{
++ hadConfirmExit = true;
++ if((store && store.isDirty && store.isDirty()) || (story && story.areAnyDirty && story.areAnyDirty()))
++ return config.messages.confirmExit;
++}
++
++// Give the user a chance to save changes before exitting
++function checkUnsavedChanges()
++{
++ if(store && store.isDirty && store.isDirty() && window.hadConfirmExit === false)
++ {
++ if(confirm(config.messages.unsavedChangesWarning))
++ saveChanges();
++ }
++}
++
++function updateMarkupBlock(s,blockName,tiddlerName)
++{
++ return s.replaceChunk(
++ "<!--%0-START-->".format([blockName]),
++ "<!--%0-END-->".format([blockName]),
++ "\n" + store.getRecursiveTiddlerText(tiddlerName,"") + "\n");
++}
++
++// Save this tiddlywiki with the pending changes
++function saveChanges(onlyIfDirty)
++{
++ if(onlyIfDirty && !store.isDirty())
++ return;
++ clearMessage();
++ // Get the URL of the document
++ var originalPath = document.location.toString();
++ // Check we were loaded from a file URL
++ if(originalPath.substr(0,5) != "file:")
++ {
++ alert(config.messages.notFileUrlError);
++ if(store.tiddlerExists(config.messages.saveInstructions))
++ story.displayTiddler(null,config.messages.saveInstructions);
++ return;
++ }
++ var localPath = getLocalPath(originalPath);
++ // Load the original file
++ var original = loadFile(localPath);
++ if(original == null)
++ {
++ alert(config.messages.cantSaveError);
++ if(store.tiddlerExists(config.messages.saveInstructions))
++ story.displayTiddler(null,config.messages.saveInstructions);
++ return;
++ }
++ // Locate the storeArea div's
++ var posOpeningDiv = original.indexOf(startSaveArea);
++ var limitClosingDiv = original.indexOf("<!--POST-BODY-START--"+">");
++ var posClosingDiv = original.lastIndexOf(endSaveArea,limitClosingDiv == -1 ? original.length : limitClosingDiv);
++ if((posOpeningDiv == -1) || (posClosingDiv == -1))
++ {
++ alert(config.messages.invalidFileError.format([localPath]));
++ return;
++ }
++ // Save the backup
++ if(config.options.chkSaveBackups)
++ {
++ var backupPath = getBackupPath(localPath);
++ var backup = saveFile(backupPath,original);
++ if(backup)
++ displayMessage(config.messages.backupSaved,"file://" + backupPath);
++ else
++ alert(config.messages.backupFailed);
++ }
++ // Save Rss
++ if(config.options.chkGenerateAnRssFeed)
++ {
++ var rssPath = localPath.substr(0,localPath.lastIndexOf(".")) + ".xml";
++ var rssSave = saveFile(rssPath,convertUnicodeToUTF8(generateRss()));
++ if(rssSave)
++ displayMessage(config.messages.rssSaved,"file://" + rssPath);
++ else
++ alert(config.messages.rssFailed);
++ }
++ // Save empty template
++ if(config.options.chkSaveEmptyTemplate)
++ {
++ var emptyPath,p;
++ if((p = localPath.lastIndexOf("/")) != -1)
++ emptyPath = localPath.substr(0,p) + "/empty.html";
++ else if((p = localPath.lastIndexOf("\\")) != -1)
++ emptyPath = localPath.substr(0,p) + "\\empty.html";
++ else
++ emptyPath = localPath + ".empty.html";
++ var empty = original.substr(0,posOpeningDiv + startSaveArea.length) + original.substr(posClosingDiv);
++ var emptySave = saveFile(emptyPath,empty);
++ if(emptySave)
++ displayMessage(config.messages.emptySaved,"file://" + emptyPath);
++ else
++ alert(config.messages.emptyFailed);
++ }
++ var save;
++ try
++ {
++ // Save new file
++ var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + "\n" +
++ convertUnicodeToUTF8(store.allTiddlersAsHtml()) + "\n" +
++ original.substr(posClosingDiv);
++ var newSiteTitle = convertUnicodeToUTF8((wikifyPlain("SiteTitle") + " - " + wikifyPlain("SiteSubtitle")).htmlEncode());
++ revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
++ revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
++ revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
++ revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
++ revised = updateMarkupBlock(revised,"POST-BODY","MarkupPostBody");
++ save = saveFile(localPath,revised);
++ }
++ catch (e)
++ {
++ showException(e);
++ }
++ if(save)
++ {
++ displayMessage(config.messages.mainSaved,"file://" + localPath);
++ store.setDirty(false);
++ }
++ else
++ alert(config.messages.mainFailed);
++}
++
++function getLocalPath(originalPath)
++{
++ // Remove any location or query part of the URL
++ var argPos = originalPath.indexOf("?");
++ if(argPos != -1)
++ originalPath = originalPath.substr(0,argPos);
++ var hashPos = originalPath.indexOf("#");
++ if(hashPos != -1)
++ originalPath = originalPath.substr(0,hashPos);
++ // Convert file://localhost/ to file:///
++ if(originalPath.indexOf("file://localhost/") == 0)
++ originalPath = "file://" + originalPath.substr(16);
++ // Convert to a native file format assuming
++ // "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
++ // "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
++ // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
++ // "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
++ var localPath;
++ if(originalPath.charAt(9) == ":") // pc local file
++ localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
++ else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file
++ localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
++ else if(originalPath.indexOf("file:///") == 0) // mac/unix local file
++ localPath = unescape(originalPath.substr(7));
++ else if(originalPath.indexOf("file:/") == 0) // mac/unix local file
++ localPath = unescape(originalPath.substr(5));
++ else // pc network file
++ localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");
++ return localPath;
++}
++
++function getBackupPath(localPath)
++{
++ var backSlash = true;
++ var dirPathPos = localPath.lastIndexOf("\\");
++ if(dirPathPos == -1)
++ {
++ dirPathPos = localPath.lastIndexOf("/");
++ backSlash = false;
++ }
++ var backupFolder = config.options.txtBackupFolder;
++ if(!backupFolder || backupFolder == "")
++ backupFolder = ".";
++ var backupPath = localPath.substr(0,dirPathPos) + (backSlash ? "\\" : "/") + backupFolder + localPath.substr(dirPathPos);
++ backupPath = backupPath.substr(0,backupPath.lastIndexOf(".")) + "." + (new Date()).convertToYYYYMMDDHHMMSSMMM() + ".html";
++ return backupPath;
++}
++
++function generateRss()
++{
++ var s = [];
++ var d = new Date();
++ var u = store.getTiddlerText("SiteUrl");
++ // Assemble the header
++ s.push("<" + "?xml version=\"1.0\"?" + ">");
++ s.push("<rss version=\"2.0\">");
++ s.push("<channel>");
++ s.push("<title" + ">" + wikifyPlain("SiteTitle").htmlEncode() + "</title" + ">");
++ if(u)
++ s.push("<link>" + u.htmlEncode() + "</link>");
++ s.push("<description>" + wikifyPlain("SiteSubtitle").htmlEncode() + "</description>");
++ s.push("<language>en-us</language>");
++ s.push("<copyright>Copyright " + d.getFullYear() + " " + config.options.txtUserName.htmlEncode() + "</copyright>");
++ s.push("<pubDate>" + d.toGMTString() + "</pubDate>");
++ s.push("<lastBuildDate>" + d.toGMTString() + "</lastBuildDate>");
++ s.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");
++ s.push("<generator>TiddlyWiki " + version.major + "." + version.minor + "." + version.revision + "</generator>");
++ // The body
++ var tiddlers = store.getTiddlers("modified","excludeLists");
++ var n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems;
++ for (var t=tiddlers.length-1; t>=n; t--)
++ s.push(tiddlers[t].saveToRss(u));
++ // And footer
++ s.push("</channel>");
++ s.push("</rss>");
++ // Save it all
++ return s.join("\n");
++}
++
++
++// UTF-8 encoding rules:
++// 0x0000 - 0x007F: 0xxxxxxx
++// 0x0080 - 0x07FF: 110xxxxx 10xxxxxx
++// 0x0800 - 0xFFFF: 1110xxxx 10xxxxxx 10xxxxxx
++
++function convertUTF8ToUnicode(u)
++{
++ if(window.netscape == undefined)
++ return manualConvertUTF8ToUnicode(u);
++ else
++ return mozConvertUTF8ToUnicode(u);
++}
++
++function manualConvertUTF8ToUnicode(utf)
++{
++ var uni = utf;
++ var src = 0;
++ var dst = 0;
++ var b1, b2, b3;
++ var c;
++ while(src < utf.length)
++ {
++ b1 = utf.charCodeAt(src++);
++ if(b1 < 0x80)
++ dst++;
++ else if(b1 < 0xE0)
++ {
++ b2 = utf.charCodeAt(src++);
++ c = String.fromCharCode(((b1 & 0x1F) << 6) | (b2 & 0x3F));
++ uni = uni.substring(0,dst++).concat(c,utf.substr(src));
++ }
++ else
++ {
++ b2 = utf.charCodeAt(src++);
++ b3 = utf.charCodeAt(src++);
++ c = String.fromCharCode(((b1 & 0xF) << 12) | ((b2 & 0x3F) << 6) | (b3 & 0x3F));
++ uni = uni.substring(0,dst++).concat(c,utf.substr(src));
++ }
++ }
++ return(uni);
++}
++
++function mozConvertUTF8ToUnicode(u)
++{
++ try
++ {
++ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
++ var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
++ converter.charset = "UTF-8";
++ }
++ catch(e)
++ {
++ return manualConvertUTF8ToUnicode(u);
++ } // fallback
++ var s = converter.ConvertToUnicode(u);
++ var fin = converter.Finish();
++ return (fin.length > 0) ? s+fin : s;
++}
++
++function convertUnicodeToUTF8(s)
++{
++ if(window.netscape == undefined)
++ return manualConvertUnicodeToUTF8(s);
++ else
++ return mozConvertUnicodeToUTF8(s);
++}
++
++function manualConvertUnicodeToUTF8(s)
++{
++ var re = /[^\u0000-\u007F]/g ;
++ return s.replace(re, function($0) {return("&#" + $0.charCodeAt(0).toString() + ";");})
++}
++
++function mozConvertUnicodeToUTF8(s)
++{
++ try
++ {
++ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
++ var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
++ converter.charset = "UTF-8";
++ }
++ catch(e)
++ {
++ return manualConvertUnicodeToUTF8(s);
++ } // fallback
++ var u = converter.ConvertFromUnicode(s);
++ var fin = converter.Finish();
++ if(fin.length > 0)
++ return u + fin;
++ else
++ return u;
++}
++
++function saveFile(fileUrl, content)
++{
++ var r = null;
++ if((r == null) || (r == false))
++ r = mozillaSaveFile(fileUrl, content);
++ if((r == null) || (r == false))
++ r = ieSaveFile(fileUrl, content);
++ if((r == null) || (r == false))
++ r = javaSaveFile(fileUrl, content);
++ return(r);
++}
++
++function loadFile(fileUrl)
++{
++ var r = null;
++ if((r == null) || (r == false))
++ r = mozillaLoadFile(fileUrl);
++ if((r == null) || (r == false))
++ r = ieLoadFile(fileUrl);
++ if((r == null) || (r == false))
++ r = javaLoadFile(fileUrl);
++ return(r);
++}
++
++// Returns null if it can't do it, false if there's an error, true if it saved OK
++function ieSaveFile(filePath, content)
++{
++ try
++ {
++ var fso = new ActiveXObject("Scripting.FileSystemObject");
++ }
++ catch(e)
++ {
++ //alert("Exception while attempting to save\n\n" + e.toString());
++ return(null);
++ }
++ var file = fso.OpenTextFile(filePath,2,-1,0);
++ file.Write(content);
++ file.Close();
++ return(true);
++}
++
++// Returns null if it can't do it, false if there's an error, or a string of the content if successful
++function ieLoadFile(filePath)
++{
++ try
++ {
++ var fso = new ActiveXObject("Scripting.FileSystemObject");
++ var file = fso.OpenTextFile(filePath,1);
++ var content = file.ReadAll();
++ file.Close();
++ }
++ catch(e)
++ {
++ //alert("Exception while attempting to load\n\n" + e.toString());
++ return(null);
++ }
++ return(content);
++}
++
++// Returns null if it can't do it, false if there's an error, true if it saved OK
++function mozillaSaveFile(filePath, content)
++{
++ if(window.Components)
++ try
++ {
++ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
++ var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
++ file.initWithPath(filePath);
++ if (!file.exists())
++ file.create(0, 0664);
++ var out = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
++ out.init(file, 0x20 | 0x02, 00004,null);
++ out.write(content, content.length);
++ out.flush();
++ out.close();
++ return(true);
++ }
++ catch(e)
++ {
++ //alert("Exception while attempting to save\n\n" + e);
++ return(false);
++ }
++ return(null);
++}
++
++// Returns null if it can't do it, false if there's an error, or a string of the content if successful
++function mozillaLoadFile(filePath)
++{
++ if(window.Components)
++ try
++ {
++ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
++ var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
++ file.initWithPath(filePath);
++ if (!file.exists())
++ return(null);
++ var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
++ inputStream.init(file, 0x01, 00004, null);
++ var sInputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
++ sInputStream.init(inputStream);
++ return(sInputStream.read(sInputStream.available()));
++ }
++ catch(e)
++ {
++ //alert("Exception while attempting to load\n\n" + e);
++ return(false);
++ }
++ return(null);
++}
++
++function javaUrlToFilename(url)
++{
++ var f = "//localhost";
++ if(url.indexOf(f) == 0)
++ return url.substring(f.length);
++ var i = url.indexOf(":");
++ if(i > 0)
++ return url.substring(i-1);
++ return url;
++}
++
++function javaSaveFile(filePath, content)
++{
++ try
++ {
++ if(document.applets["TiddlySaver"])
++ return document.applets["TiddlySaver"].saveFile(javaUrlToFilename(filePath),"UTF-8",content);
++ }
++ catch(e)
++ {
++ }
++ try
++ {
++ var s = new java.io.PrintStream(new java.io.FileOutputStream(javaUrlToFilename(filePath)));
++ s.print(content);
++ s.close();
++ }
++ catch(e)
++ {
++ return null;
++ }
++ return true;
++}
++
++function javaLoadFile(filePath)
++{
++ try
++ {
++ if(document.applets["TiddlySaver"])
++ return String(document.applets["TiddlySaver"].loadFile(javaUrlToFilename(filePath),"UTF-8"));
++ }
++ catch(e)
++ {
++ }
++ var content = [];
++ try
++ {
++ var r = new java.io.BufferedReader(new java.io.FileReader(javaUrlToFilename(filePath)));
++ var line;
++ while ((line = r.readLine()) != null)
++ content.push(new String(line));
++ r.close();
++ }
++ catch(e)
++ {
++ return null;
++ }
++ return content.join("\n");
++}
++
++
++// ---------------------------------------------------------------------------------
++// Remote HTTP requests
++// ---------------------------------------------------------------------------------
++
++// Load a file over http
++// url - the source url
++// callback - function to call when there's a response
++// params - parameter object that gets passed to the callback for storing it's state
++// Return value is the underlying XMLHttpRequest object, or 'null' if there was an error
++// Callback function is called like this:
++// callback(status,params,responseText,xhr)
++// status - true if OK, false if error
++// params - the parameter object provided to loadRemoteFile()
++// responseText - the text of the file
++// xhr - the underlying XMLHttpRequest object
++function loadRemoteFile(url,callback,params)
++{
++ // Get an xhr object
++ var x;
++ try
++ {
++ x = new XMLHttpRequest(); // Modern
++ }
++ catch(e)
++ {
++ try
++ {
++ x = new ActiveXObject("Msxml2.XMLHTTP"); // IE 6
++ }
++ catch (e)
++ {
++ return null;
++ }
++ }
++ // Install callback
++ x.onreadystatechange = function()
++ {
++ if (x.readyState == 4)
++ {
++ if ((x.status == 0 || x.status == 200) && callback)
++ {
++ callback(true,params,x.responseText,url,x);
++ }
++ else
++ callback(false,params,null,url,x);
++ }
++ }
++ // Send request
++ if(window.netscape && window.netscape.security && document.location.protocol.indexOf("http") == -1)
++ window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
++ try
++ {
++ url = url + (url.indexOf("?") < 0 ? "?" : "&") + "nocache=" + Math.random();
++ x.open("GET",url,true);
++ if (x.overrideMimeType)
++ x.overrideMimeType("text/html");
++ x.send(null);
++ }
++ catch (e)
++ {
++ alert("Error in send " + e);
++ return null;
++ }
++ return x;
++}
++// ---------------------------------------------------------------------------------
++// TiddlyWiki-specific utility functions
++// ---------------------------------------------------------------------------------
++
++function createTiddlyButton(theParent,theText,theTooltip,theAction,theClass,theId,theAccessKey)
++{
++ var theButton = document.createElement("a");
++ if(theAction)
++ {
++ theButton.onclick = theAction;
++ theButton.setAttribute("href","javascript:;");
++ }
++ if(theTooltip)
++ theButton.setAttribute("title",theTooltip);
++ if(theText)
++ theButton.appendChild(document.createTextNode(theText));
++ if(theClass)
++ theButton.className = theClass;
++ else
++ theButton.className = "button";
++ if(theId)
++ theButton.id = theId;
++ if(theParent)
++ theParent.appendChild(theButton);
++ if(theAccessKey)
++ theButton.setAttribute("accessKey",theAccessKey);
++ return(theButton);
++}
++
++function createTiddlyLink(place,title,includeText,theClass,isStatic)
++{
++ var text = includeText ? title : null;
++ var i = getTiddlyLinkInfo(title,theClass)
++ var btn;
++ if(isStatic)
++ btn = createExternalLink(place,"#" + title);
++ else
++ btn = createTiddlyButton(place,text,i.subTitle,onClickTiddlerLink,i.classes);
++ btn.setAttribute("refresh","link");
++ btn.setAttribute("tiddlyLink",title);
++ return(btn);
++}
++
++function refreshTiddlyLink(e,title)
++{
++ var i = getTiddlyLinkInfo(title,e.className);
++ e.className = i.classes;
++ e.title = i.subTitle;
++}
++
++function getTiddlyLinkInfo(title,currClasses)
++{
++ var classes = currClasses ? currClasses.split(" ") : [];
++ classes.pushUnique("tiddlyLink");
++ var tiddler = store.fetchTiddler(title);
++ var subTitle;
++ if(tiddler)
++ {
++ subTitle = tiddler.getSubtitle();
++ classes.pushUnique("tiddlyLinkExisting");
++ classes.remove("tiddlyLinkNonExisting");
++ classes.remove("shadow");
++ }
++ else
++ {
++ classes.remove("tiddlyLinkExisting");
++ classes.pushUnique("tiddlyLinkNonExisting");
++ if(store.isShadowTiddler(title))
++ {
++ subTitle = config.messages.shadowedTiddlerToolTip.format([title]);
++ classes.pushUnique("shadow");
++ }
++ else
++ {
++ subTitle = config.messages.undefinedTiddlerToolTip.format([title]);
++ classes.remove("shadow");
++ }
++ }
++ return {classes: classes.join(" "), subTitle: subTitle};
++}
++
++function createExternalLink(place,url)
++{
++ var theLink = document.createElement("a");
++ theLink.className = "externalLink";
++ theLink.href = url;
++ theLink.title = config.messages.externalLinkTooltip.format([url]);
++ if(config.options.chkOpenInNewWindow)
++ theLink.target = "_blank";
++ place.appendChild(theLink);
++ return(theLink);
++}
++
++// Event handler for clicking on a tiddly link
++function onClickTiddlerLink(e)
++{
++ if (!e) var e = window.event;
++ var theTarget = resolveTarget(e);
++ var theLink = theTarget;
++ var title = null;
++ do {
++ title = theLink.getAttribute("tiddlyLink");
++ theLink = theLink.parentNode;
++ } while(title == null && theLink != null);
++ if(title)
++ {
++ var toggling = e.metaKey || e.ctrlKey;
++ if(config.options.chkToggleLinks)
++ toggling = !toggling;
++ var opening;
++ if(toggling && document.getElementById("tiddler" + title))
++ story.closeTiddler(title,true,e.shiftKey || e.altKey);
++ else
++ story.displayTiddler(theTarget,title,null,true,e.shiftKey || e.altKey);
++ }
++ clearMessage();
++ return(false);
++}
++
++// Create a button for a tag with a popup listing all the tiddlers that it tags
++function createTagButton(place,tag,excludeTiddler)
++{
++ var theTag = createTiddlyButton(place,tag,config.views.wikified.tag.tooltip.format([tag]),onClickTag);
++ theTag.setAttribute("tag",tag);
++ if(excludeTiddler)
++ theTag.setAttribute("tiddler",excludeTiddler);
++ return(theTag);
++}
++
++// Event handler for clicking on a tiddler tag
++function onClickTag(e)
++{
++ if (!e) var e = window.event;
++ var theTarget = resolveTarget(e);
++ var popup = Popup.create(this);
++ var tag = this.getAttribute("tag");
++ var title = this.getAttribute("tiddler");
++ if(popup && tag)
++ {
++ var tagged = store.getTaggedTiddlers(tag);
++ var titles = [];
++ var li,r;
++ for(r=0;r<tagged.length;r++)
++ if(tagged[r].title != title)
++ titles.push(tagged[r].title);
++ var lingo = config.views.wikified.tag;
++ if(titles.length > 0)
++ {
++ var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll);
++ openAll.setAttribute("tag",tag);
++ createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
++ for(r=0; r<titles.length; r++)
++ {
++ createTiddlyLink(createTiddlyElement(popup,"li"),titles[r],true);
++ }
++ }
++ else
++ createTiddlyText(createTiddlyElement(popup,"li",null,"disabled"),lingo.popupNone.format([tag]));
++ createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
++ var h = createTiddlyLink(createTiddlyElement(popup,"li"),tag,false);
++ createTiddlyText(h,lingo.openTag.format([tag]));
++ }
++ Popup.show(popup,false);
++ e.cancelBubble = true;
++ if (e.stopPropagation) e.stopPropagation();
++ return(false);
++}
++
++// Event handler for 'open all' on a tiddler popup
++function onClickTagOpenAll(e)
++{
++ if (!e) var e = window.event;
++ var tag = this.getAttribute("tag");
++ var tagged = store.getTaggedTiddlers(tag);
++ var titles = [];
++ for(var t=0; t<tagged.length; t++)
++ titles.push(tagged[t].title);
++ story.displayTiddlers(this,titles);
++ return(false);
++}
++
++function onClickError(e)
++{
++ if (!e) var e = window.event;
++ var popup = Popup.create(this);
++ var lines = this.getAttribute("errorText").split("\n");
++ for(var t=0; t<lines.length; t++)
++ createTiddlyElement(popup,"li",null,null,lines[t]);
++ Popup.show(popup,false);
++ e.cancelBubble = true;
++ if (e.stopPropagation) e.stopPropagation();
++ return false;
++}
++
++function createTiddlyDropDown(place,onchange,options)
++{
++ var sel = createTiddlyElement(place,"select");
++ sel.onchange = onchange;
++ for(var t=0; t<options.length; t++)
++ {
++ var e = createTiddlyElement(sel,"option",null,null,options[t].caption);
++ e.value = options[t].name;
++ }
++}
++
++function createTiddlyError(place,title,text)
++{
++ var btn = createTiddlyButton(place,title,null,onClickError,"errorButton");
++ if (text) btn.setAttribute("errorText",text);
++}
++
++function merge(dst,src,preserveExisting)
++{
++ for (p in src)
++ if (!preserveExisting || dst[p] === undefined)
++ dst[p] = src[p];
++ return dst;
++}
++
++// Returns a string containing the description of an exception, optionally prepended by a message
++function exceptionText(e, message)
++{
++ var s = e.description ? e.description : e.toString();
++ return message ? "%0:\n%1".format([message, s]) : s;
++}
++
++// Displays an alert of an exception description with optional message
++function showException(e, message)
++{
++ alert(exceptionText(e, message));
++}
++
++// ---------------------------------------------------------------------------------
++// Animation engine
++// ---------------------------------------------------------------------------------
++
++function Animator()
++{
++ this.running = 0; // Incremented at start of each animation, decremented afterwards. If zero, the interval timer is disabled
++ this.timerID = 0; // ID of the timer used for animating
++ this.animations = []; // List of animations in progress
++ return this;
++}
++
++// Start animation engine
++Animator.prototype.startAnimating = function() // Variable number of arguments
++{
++ for(var t=0; t<arguments.length; t++)
++ this.animations.push(arguments[t]);
++ if(this.running == 0)
++ {
++ var me = this;
++ this.timerID = window.setInterval(function() {me.doAnimate(me);},5);
++ }
++ this.running += arguments.length;
++}
++
++// Perform an animation engine tick, calling each of the known animation modules
++Animator.prototype.doAnimate = function(me)
++{
++ var a = 0;
++ while(a < me.animations.length)
++ {
++ var animation = me.animations[a];
++ if(animation.tick())
++ a++;
++ else
++ {
++ me.animations.splice(a,1);
++ if(--me.running == 0)
++ window.clearInterval(me.timerID);
++ }
++ }
++}
++
++// Map a 0..1 value to 0..1, but slow down at the start and end
++Animator.slowInSlowOut = function(progress)
++{
++ return(1-((Math.cos(progress * Math.PI)+1)/2));
++}
++
++// ---------------------------------------------------------------------------------
++// Cascade animation
++// ---------------------------------------------------------------------------------
++
++function Cascade(text,startElement,targetElement,slowly)
++{
++ var winWidth = findWindowWidth();
++ var winHeight = findWindowHeight();
++ this.elements = [];
++ this.startElement = startElement;
++ this.startLeft = findPosX(this.startElement);
++ this.startTop = findPosY(this.startElement);
++ this.startWidth = Math.min(this.startElement.offsetWidth,winWidth);
++ this.startHeight = Math.min(this.startElement.offsetHeight,winHeight);
++ this.targetElement = targetElement;
++ targetElement.style.position = "relative";
++ targetElement.style.zIndex = 2;
++ this.targetLeft = findPosX(this.targetElement);
++ this.targetTop = findPosY(this.targetElement);
++ this.targetWidth = Math.min(this.targetElement.offsetWidth,winWidth);
++ this.targetHeight = Math.min(this.targetElement.offsetHeight,winHeight);
++ this.progress = -1;
++ this.steps = slowly ? config.cascadeSlow : config.cascadeFast;
++ this.text = text;
++ this.tick();
++ return this;
++}
++
++Cascade.prototype.tick = function()
++{
++ this.progress++;
++ if(this.progress >= this.steps)
++ {
++ while(this.elements.length > 0)
++ this.removeTail();
++ this.targetElement.style.position = "static";
++ this.targetElement.style.zIndex = "";
++ return false;
++ }
++ else
++ {
++ if(this.elements.length > 0 && this.progress > config.cascadeDepth)
++ this.removeTail();
++ if(this.progress < (this.steps - config.cascadeDepth))
++ {
++ var f = Animator.slowInSlowOut(this.progress/(this.steps - config.cascadeDepth - 1));
++ var e = createTiddlyElement(document.body,"div",null,"cascade",this.text);
++ e.style.zIndex = 1;
++ e.style.left = this.startLeft + (this.targetLeft-this.startLeft) * f + "px";
++ e.style.top = this.startTop + (this.targetTop-this.startTop) * f + "px";
++ e.style.width = this.startWidth + (this.targetWidth-this.startWidth) * f + "px";
++ e.style.height = this.startHeight + (this.targetHeight-this.startHeight) * f + "px";
++ e.style.display = "block";
++ this.elements.push(e);
++ }
++ return true;
++ }
++}
++
++Cascade.prototype.removeTail = function()
++{
++ var e = this.elements[0];
++ e.parentNode.removeChild(e);
++ this.elements.shift();
++}
++
++// ---------------------------------------------------------------------------------
++// Scroller animation
++// ---------------------------------------------------------------------------------
++
++function Scroller(targetElement,slowly)
++{
++ this.targetElement = targetElement;
++ this.startScroll = findScrollY();
++ this.targetScroll = ensureVisible(targetElement);
++ this.progress = 0;
++ this.step = slowly ? config.animSlow : config.animFast;
++ return this;
++}
++
++Scroller.prototype.tick = function()
++{
++ this.progress += this.step;
++ if(this.progress > 1)
++ {
++ window.scrollTo(0,this.targetScroll);
++ return false;
++ }
++ else
++ {
++ var f = Animator.slowInSlowOut(this.progress);
++ window.scrollTo(0,this.startScroll + (this.targetScroll-this.startScroll) * f);
++ return true;
++ }
++}
++
++// ---------------------------------------------------------------------------------
++// Slider animation
++// ---------------------------------------------------------------------------------
++
++// deleteMode - "none", "all" [delete target element and it's children], [only] "children" [but not the target element]
++function Slider(element,opening,slowly,deleteMode)
++{
++ this.element = element;
++ element.style.display = "block";
++ this.deleteMode = deleteMode;
++ this.element.style.height = "auto";
++ this.realHeight = element.offsetHeight;
++ this.opening = opening;
++ this.step = slowly ? config.animSlow : config.animFast;
++ if(opening)
++ {
++ this.progress = 0;
++ element.style.height = "0px";
++ element.style.display = "block";
++ }
++ else
++ {
++ this.progress = 1;
++ this.step = -this.step;
++ }
++ element.style.overflow = "hidden";
++ return this;
++}
++
++Slider.prototype.stop = function()
++{
++ if(this.opening)
++ {
++ this.element.style.height = "auto";
++ this.element.style.opacity = 1;
++ this.element.style.filter = "alpha(opacity:100)";
++ }
++ else
++ {
++ switch(this.deleteMode)
++ {
++ case "none":
++ this.element.style.display = "none";
++ break;
++ case "all":
++ this.element.parentNode.removeChild(this.element);
++ break;
++ case "children":
++ removeChildren(this.element);
++ break;
++ }
++ }
++}
++
++Slider.prototype.tick = function()
++{
++ this.progress += this.step;
++ if(this.progress < 0 || this.progress > 1)
++ {
++ this.stop();
++ return false;
++ }
++ else
++ {
++ var f = Animator.slowInSlowOut(this.progress);
++ var h = this.realHeight * f;
++ this.element.style.height = h + "px";
++ this.element.style.opacity = f;
++ this.element.style.filter = "alpha(opacity:" + f * 100 +")";
++ return true;
++ }
++}
++
++// ---------------------------------------------------------------------------------
++// Popup menu
++// ---------------------------------------------------------------------------------
++
++var Popup = {
++ stack: [] // Array of objects with members root: and popup:
++ };
++
++Popup.create = function(root)
++{
++ Popup.remove();
++ var popup = createTiddlyElement(document.body,"ol","popup","popup");
++ Popup.stack.push({root: root, popup: popup});
++ return popup;
++}
++
++Popup.onDocumentClick = function(e)
++{
++ if (!e) var e = window.event;
++ var target = resolveTarget(e);
++ if(e.eventPhase == undefined)
++ Popup.remove();
++ else if(e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET)
++ Popup.remove();
++ return true;
++}
++
++Popup.show = function(unused,slowly)
++{
++ var curr = Popup.stack[Popup.stack.length-1];
++ var rootLeft = findPosX(curr.root);
++ var rootTop = findPosY(curr.root);
++ var rootHeight = curr.root.offsetHeight;
++ var popupLeft = rootLeft;
++ var popupTop = rootTop + rootHeight;
++ var popupWidth = curr.popup.offsetWidth;
++ var winWidth = findWindowWidth();
++ if(popupLeft + popupWidth > winWidth)
++ popupLeft = winWidth - popupWidth;
++ curr.popup.style.left = popupLeft + "px";
++ curr.popup.style.top = popupTop + "px";
++ curr.popup.style.display = "block";
++ addClass(curr.root,"highlight");
++ if(anim && config.options.chkAnimate)
++ anim.startAnimating(new Scroller(curr.popup,slowly));
++ else
++ window.scrollTo(0,ensureVisible(curr.popup));
++}
++
++Popup.remove = function()
++{
++ if(Popup.stack.length > 0)
++ {
++ Popup.removeFrom(0);
++ }
++}
++
++Popup.removeFrom = function(from)
++{
++ for(var t=Popup.stack.length-1; t>=from; t--)
++ {
++ var p = Popup.stack[t];
++ removeClass(p.root,"highlight");
++ p.popup.parentNode.removeChild(p.popup);
++ }
++ Popup.stack = Popup.stack.slice(0,from);
++}
++
++// ---------------------------------------------------------------------------------
++// ListView gadget
++// ---------------------------------------------------------------------------------
++
++var ListView = {};
++
++// Create a listview
++// place - where in the DOM tree to insert the listview
++// listObject - array of objects to be included in the listview
++// listTemplate - template for the listview
++// callback - callback for a command being selected
++// className - optional classname for the <table> element
++ListView.create = function(place,listObject,listTemplate,callback,className)
++{
++ var table = createTiddlyElement(place,"table",null,className ? className : "listView");
++ var thead = createTiddlyElement(table,"thead");
++ var r = createTiddlyElement(thead,"tr");
++ for(var t=0; t<listTemplate.columns.length; t++)
++ {
++ var columnTemplate = listTemplate.columns[t];
++ var c = createTiddlyElement(r,"th");
++ var colType = ListView.columnTypes[columnTemplate.type];
++ if(colType && colType.createHeader)
++ colType.createHeader(c,columnTemplate,t);
++ }
++ var tbody = createTiddlyElement(table,"tbody");
++ for(var rc=0; rc<listObject.length; rc++)
++ {
++ rowObject = listObject[rc];
++ r = createTiddlyElement(tbody,"tr");
++ for(var c=0; c<listTemplate.rowClasses.length; c++)
++ {
++ if(rowObject[listTemplate.rowClasses[c].field])
++ addClass(r,listTemplate.rowClasses[c].className);
++ }
++ rowObject.rowElement = rowObject;
++ rowObject.colElements = {};
++ for(var cc=0; cc<listTemplate.columns.length; cc++)
++ {
++ var c = createTiddlyElement(r,"td");
++ var columnTemplate = listTemplate.columns[cc];
++ var field = columnTemplate.field;
++ var colType = ListView.columnTypes[columnTemplate.type];
++ if(colType && colType.createItem)
++ colType.createItem(c,rowObject,field,columnTemplate,cc,rc);
++ rowObject.colElements[field] = c;
++ }
++ }
++ if(callback && listTemplate.actions)
++ createTiddlyDropDown(place,ListView.getCommandHandler(callback),listTemplate.actions);
++ if(callback && listTemplate.buttons)
++ {
++ for(t=0; t<listTemplate.buttons.length; t++)
++ {
++ var a = listTemplate.buttons[t];
++ if(a && a.name != "")
++ createTiddlyButton(place,a.caption,null,ListView.getCommandHandler(callback,a.name,a.allowEmptySelection));
++ }
++ }
++ return table;
++}
++
++ListView.getCommandHandler = function(callback,name,allowEmptySelection)
++{
++ return function(e)
++ {
++ var view = findRelated(this,"TABLE",null,"previousSibling");
++ var tiddlers = [];
++ ListView.forEachSelector(view,function(e,rowName) {
++ if(e.checked)
++ tiddlers.push(rowName);
++ });
++ if(tiddlers.length == 0 && !allowEmptySelection)
++ alert(config.messages.nothingSelected);
++ else
++ {
++ if(this.nodeName.toLowerCase() == "select")
++ {
++ callback(view,this.value,tiddlers);
++ this.selectedIndex = 0;
++ }
++ else
++ callback(view,name,tiddlers);
++ }
++ };
++}
++
++// Invoke a callback for each selector checkbox in the listview
++// view - <table> element of listView
++// callback(checkboxElement,rowName)
++// where
++// checkboxElement - DOM element of checkbox
++// rowName - name of this row as assigned by the column template
++// result: true if at least one selector was checked
++ListView.forEachSelector = function(view,callback)
++{
++ var checkboxes = view.getElementsByTagName("input");
++ var hadOne = false;
++ for(var t=0; t<checkboxes.length; t++)
++ {
++ var cb = checkboxes[t];
++ if(cb.getAttribute("type") == "checkbox")
++ {
++ var rn = cb.getAttribute("rowName");
++ if(rn)
++ {
++ callback(cb,rn);
++ hadOne = true;
++ }
++ }
++ }
++ return hadOne;
++}
++
++ListView.columnTypes = {};
++
++ListView.columnTypes.String = {
++ createHeader: function(place,columnTemplate,col)
++ {
++ createTiddlyText(place,columnTemplate.title);
++ },
++ createItem: function(place,listObject,field,columnTemplate,col,row)
++ {
++ var v = listObject[field];
++ if(v != undefined)
++ createTiddlyText(place,v);
++ }
++};
++
++ListView.columnTypes.Date = {
++ createHeader: ListView.columnTypes.String.createHeader,
++ createItem: function(place,listObject,field,columnTemplate,col,row)
++ {
++ var v = listObject[field];
++ if(v != undefined)
++ createTiddlyText(place,v.formatString(columnTemplate.dateFormat));
++ }
++};
++
++ListView.columnTypes.StringList = {
++ createHeader: ListView.columnTypes.String.createHeader,
++ createItem: function(place,listObject,field,columnTemplate,col,row)
++ {
++ var v = listObject[field];
++ if(v != undefined)
++ {
++ for(var t=0; t<v.length; t++)
++ {
++ createTiddlyText(place,v[t]);
++ createTiddlyElement(place,"br");
++ }
++ }
++ }
++};
++
++ListView.columnTypes.Selector = {
++ createHeader: function(place,columnTemplate,col)
++ {
++ createTiddlyCheckbox(place,null,false,this.onHeaderChange);
++ },
++ createItem: function(place,listObject,field,columnTemplate,col,row)
++ {
++ var e = createTiddlyCheckbox(place,null,listObject[field],null);
++ e.setAttribute("rowName",listObject[columnTemplate.rowName]);
++ },
++ onHeaderChange: function(e)
++ {
++ var state = this.checked;
++ var view = findRelated(this,"TABLE");
++ if(!view)
++ return;
++ ListView.forEachSelector(view,function(e,rowName) {
++ e.checked = state;
++ });
++ }
++};
++
++ListView.columnTypes.Tags = {
++ createHeader: ListView.columnTypes.String.createHeader,
++ createItem: function(place,listObject,field,columnTemplate,col,row)
++ {
++ var tags = listObject[field];
++ createTiddlyText(place,String.encodeTiddlyLinkList(tags));
++ }
++};
++
++ListView.columnTypes.Boolean = {
++ createHeader: ListView.columnTypes.String.createHeader,
++ createItem: function(place,listObject,field,columnTemplate,col,row)
++ {
++ if(listObject[field] == true)
++ createTiddlyText(place,columnTemplate.trueText);
++ if(listObject[field] == false)
++ createTiddlyText(place,columnTemplate.falseText);
++ }
++};
++
++ListView.columnTypes.TagCheckbox = {
++ createHeader: ListView.columnTypes.String.createHeader,
++ createItem: function(place,listObject,field,columnTemplate,col,row)
++ {
++ var e = createTiddlyCheckbox(place,null,listObject[field],this.onChange);
++ e.setAttribute("tiddler",listObject.title);
++ e.setAttribute("tag",columnTemplate.tag);
++ },
++ onChange : function(e)
++ {
++ var tag = this.getAttribute("tag");
++ var tiddler = this.getAttribute("tiddler");
++ store.setTiddlerTag(tiddler,this.checked,tag);
++ }
++};
++
++ListView.columnTypes.TiddlerLink = {
++ createHeader: ListView.columnTypes.String.createHeader,
++ createItem: function(place,listObject,field,columnTemplate,col,row)
++ {
++ var v = listObject[field];
++ if(v != undefined)
++ {
++ var link = createTiddlyLink(place,listObject[columnTemplate.tiddlerLink],false,null);
++ createTiddlyText(link,listObject[field]);
++ }
++ }
++};
++// ---------------------------------------------------------------------------------
++// Augmented methods for the JavaScript Number(), Array(), String() and Date() objects
++// ---------------------------------------------------------------------------------
++
++// Clamp a number to a range
++Number.prototype.clamp = function(min,max)
++{
++ var c = this;
++ if(c < min)
++ c = min;
++ if(c > max)
++ c = max;
++ return c;
++}
++
++// Add indexOf function if browser does not support it
++if(!Array.indexOf) {
++Array.prototype.indexOf = function(item,from)
++{
++ if(!from)
++ from = 0;
++ for(var i=from; i<this.length; i++)
++ if(this[i] === item)
++ return i;
++ return -1;
++}}
++
++// Find an entry in a given field of the members of an array
++Array.prototype.findByField = function(field,value)
++{
++ for(var t=0; t<this.length; t++)
++ if(this[t][field] == value)
++ return t;
++ return null;
++}
++
++// Return whether an entry exists in an array
++Array.prototype.contains = function(item)
++{
++ return this.indexOf(item) != -1;
++};
++
++// Adds, removes or toggles a particular value within an array
++// value - value to add
++// mode - +1 to add value, -1 to remove value, 0 to toggle it
++Array.prototype.setItem = function(value,mode)
++{
++ var p = this.indexOf(value);
++ if(mode == 0)
++ mode = (p == -1) ? +1 : -1;
++ if(mode == +1)
++ {
++ if(p == -1)
++ this.push(value);
++ }
++ else if(mode == -1)
++ {
++ if(p != -1)
++ this.splice(p,1);
++ }
++}
++
++// Return whether one of a list of values exists in an array
++Array.prototype.containsAny = function(items)
++{
++ for(var i=0; i<items.length; i++)
++ if (this.indexOf(items[i]) != -1)
++ return true;
++ return false;
++};
++
++// Return whether all of a list of values exists in an array
++Array.prototype.containsAll = function(items)
++{
++ for (var i = 0; i<items.length; i++)
++ if (this.indexOf(items[i]) == -1)
++ return false;
++ return true;
++};
++
++// Push a new value into an array only if it is not already present in the array. If the optional unique parameter is false, it reverts to a normal push
++Array.prototype.pushUnique = function(item,unique)
++{
++ if(unique != undefined && unique == false)
++ this.push(item);
++ else
++ {
++ if(this.indexOf(item) == -1)
++ this.push(item);
++ }
++}
++
++Array.prototype.remove = function(item)
++{
++ var p = this.indexOf(item);
++ if(p != -1)
++ this.splice(p,1);
++}
++
++// Get characters from the right end of a string
++String.prototype.right = function(n)
++{
++ if(n < this.length)
++ return this.slice(this.length-n);
++ else
++ return this;
++}
++
++// Trim whitespace from both ends of a string
++String.prototype.trim = function()
++{
++ return this.replace(/^\s*|\s*$/g,"");
++}
++
++// Convert a string from a CSS style property name to a JavaScript style name ("background-color" -> "backgroundColor")
++String.prototype.unDash = function()
++{
++ var s = this.split("-");
++ if(s.length > 1)
++ for(var t=1; t<s.length; t++)
++ s[t] = s[t].substr(0,1).toUpperCase() + s[t].substr(1);
++ return s.join("");
++}
++
++// Substitute substrings from an array into a format string that includes '%1'-type specifiers
++String.prototype.format = function(substrings)
++{
++ var subRegExp = /(?:%(\d+))/mg;
++ var currPos = 0;
++ var r = [];
++ do {
++ var match = subRegExp.exec(this);
++ if(match && match[1])
++ {
++ if(match.index > currPos)
++ r.push(this.substring(currPos,match.index));
++ r.push(substrings[parseInt(match[1])]);
++ currPos = subRegExp.lastIndex;
++ }
++ } while(match);
++ if(currPos < this.length)
++ r.push(this.substring(currPos,this.length));
++ return r.join("");
++}
++
++// Escape any special RegExp characters with that character preceded by a backslash
++String.prototype.escapeRegExp = function()
++{
++ var s = "\\^$*+?()=!|,{}[].";
++ var c = this;
++ for(var t=0; t<s.length; t++)
++ c = c.replace(new RegExp("\\" + s.substr(t,1),"g"),"\\" + s.substr(t,1));
++ return c;
++}
++
++// Convert "\" to "\s", newlines to "\n" (and remove carriage returns)
++String.prototype.escapeLineBreaks = function()
++{
++ return this.replace(/\\/mg,"\\s").replace(/\n/mg,"\\n").replace(/\r/mg,"");
++}
++
++// Convert "\n" to newlines, "\b" to " ", "\s" to "\" (and remove carriage returns)
++String.prototype.unescapeLineBreaks = function()
++{
++ return this.replace(/\\n/mg,"\n").replace(/\\b/mg," ").replace(/\\s/mg,"\\").replace(/\r/mg,"");
++}
++
++// Convert & to "&amp;", < to "&lt;", > to "&gt;" and " to "&quot;"
++String.prototype.htmlEncode = function()
++{
++ return(this.replace(/&/mg,"&amp;").replace(/</mg,"&lt;").replace(/>/mg,"&gt;").replace(/\"/mg,"&quot;"));
++}
++
++// Convert "&amp;" to &, "&lt;" to <, "&gt;" to > and "&quot;" to "
++String.prototype.htmlDecode = function()
++{
++ return(this.replace(/&amp;/mg,"&").replace(/&lt;/mg,"<").replace(/&gt;/mg,">").replace(/&quot;/mg,"\""));
++}
++
++// Parse a space-separated string of name:value parameters where:
++// - the name or the value can be optional (in which case separate defaults are used instead)
++// - in case of ambiguity, a lone word is taken to be a value
++// - if 'cascadeDefaults' is set to true, then the defaults are modified by updated by each specified name or value
++// - name prefixes are not allowed if the 'noNames' parameter is true
++// - if both the name and value are present they must be separated by a colon
++// - the name and the value may both be quoted with single- or double-quotes, double-square brackets
++// - names or values quoted with {{double-curly braces}} are evaluated as a JavaScript expression
++// - as long as the 'allowEval' parameter is true
++// The result is an array of objects:
++// result[0] = object with a member for each parameter name, value of that member being an array of values
++// result[1..n] = one object for each parameter, with 'name' and 'value' members
++String.prototype.parseParams = function(defaultName,defaultValue,allowEval,noNames,cascadeDefaults)
++{
++ var parseToken = function(match,p)
++ {
++ var n;
++ if(match[p]) // Double quoted
++ n = match[p];
++ else if(match[p+1]) // Single quoted
++ n = match[p+1];
++ else if(match[p+2]) // Double-square-bracket quoted
++ n = match[p+2];
++ else if(match[p+3]) // Double-brace quoted
++ try
++ {
++ n = match[p+3];
++ if(allowEval)
++ n = window.eval(n);
++ }
++ catch(e)
++ {
++ throw "Unable to evaluate {{" + match[p+3] + "}}: " + exceptionText(e);
++ }
++ else if(match[p+4]) // Unquoted
++ n = match[p+4];
++ else if(match[p+5]) // empty quote
++ n = "";
++ return n;
++ };
++ var r = [{}];
++ var dblQuote = "(?:\"((?:(?:\\\\\")|[^\"])+)\")";
++ var sngQuote = "(?:'((?:(?:\\\\\')|[^'])+)')";
++ var dblSquare = "(?:\\[\\[((?:\\s|\\S)*?)\\]\\])";
++ var dblBrace = "(?:\\{\\{((?:\\s|\\S)*?)\\}\\})";
++ var unQuoted = noNames ? "([^\"'\\s]\\S*)" : "([^\"':\\s][^\\s:]*)";
++ var emptyQuote = "((?:\"\")|(?:''))";
++ var skipSpace = "(?:\\s*)";
++ var token = "(?:" + dblQuote + "|" + sngQuote + "|" + dblSquare + "|" + dblBrace + "|" + unQuoted + "|" + emptyQuote + ")";
++ var re = noNames
++ ? new RegExp(token,"mg")
++ : new RegExp(skipSpace + token + skipSpace + "(?:(\\:)" + skipSpace + token + ")?","mg");
++ var params = [];
++ do {
++ var match = re.exec(this);
++ if(match)
++ {
++ var n = parseToken(match,1);
++ if(noNames)
++ r.push({name: "", value: n});
++ else
++ {
++ var v = parseToken(match,8);
++ if(v == null && defaultName)
++ {
++ v = n;
++ n = defaultName;
++ }
++ else if(v == null && defaultValue)
++ v = defaultValue;
++ r.push({name: n, value: v});
++ if(cascadeDefaults)
++ {
++ defaultName = n;
++ defaultValue = v;
++ }
++ }
++ }
++ } while(match);
++ // Summarise parameters into first element
++ for(var t=1; t<r.length; t++)
++ {
++ if(r[0][r[t].name])
++ r[0][r[t].name].push(r[t].value);
++ else
++ r[0][r[t].name] = [r[t].value];
++ }
++ return r;
++}
++
++// Process a string list of macro parameters into an array. Parameters can be quoted with "", '',
++// [[]], {{ }} or left unquoted (and therefore space-separated). Double-braces {{}} results in
++// an *evaluated* parameter: e.g. {{config.options.txtUserName}} results in the current user's name.
++String.prototype.readMacroParams = function()
++{
++ var p = this.parseParams("list",null,true,true);
++ var n = [];
++ for(var t=1; t<p.length; t++)
++ n.push(p[t].value);
++ return n;
++}
++
++// Process a string list of unique tiddler names into an array. Tiddler names that have spaces in them must be [[bracketed]]
++String.prototype.readBracketedList = function(unique)
++{
++ var p = this.parseParams("list",null,false,true);
++ var n = [];
++ for(var t=1; t<p.length; t++)
++ n.pushUnique(p[t].value,unique);
++ return n;
++}
++
++// Returns array with start and end index of chunk between given start and end marker, or undefined.
++String.prototype.getChunkRange = function(start,end)
++{
++ var s = this.indexOf(start);
++ if(s != -1)
++ {
++ s += start.length;
++ var e = this.indexOf(end,s);
++ if(e != -1)
++ return [s, e];
++ }
++}
++
++// Replace a chunk of a string given start and end markers
++String.prototype.replaceChunk = function(start,end,sub)
++{
++ var r = this.getChunkRange(start,end);
++ return r
++ ? this.substring(0,r[0]) + sub + this.substring(r[1])
++ : this;
++}
++
++// Returns a chunk of a string between start and end markers, or undefined
++String.prototype.getChunk = function(start,end)
++{
++ var r = this.getChunkRange(start,end);
++ if (r)
++ return this.substring(r[0],r[1]);
++}
++
++
++// Static method to bracket a string with double square brackets if it contains a space
++String.encodeTiddlyLink = function(title)
++{
++ if(title.indexOf(" ") == -1)
++ return(title);
++ else
++ return("[[" + title + "]]");
++}
++
++// Static method to encodeTiddlyLink for every item in an array and join them with spaces
++String.encodeTiddlyLinkList = function(list)
++{
++ if(list)
++ {
++ var results = [];
++ for(var t=0; t<list.length; t++)
++ results.push(String.encodeTiddlyLink(list[t]));
++ return results.join(" ");
++ }
++ else
++ return "";
++}
++
++// Static method to left-pad a string with 0s to a certain width
++String.zeroPad = function(n,d)
++{
++ var s = n.toString();
++ if(s.length < d)
++ s = "000000000000000000000000000".substr(0,d-s.length) + s;
++ return(s);
++}
++
++String.prototype.startsWith = function(prefix)
++{
++ return !prefix || this.substring(0,prefix.length) == prefix;
++}
++
++// Returns the first value of the given named parameter.
++//#
++//# @param params
++//# as returned by parseParams or null/undefined
++//# @return [may be null/undefined]
++//#
++function getParam(params, name, defaultValue) {
++ if (!params)
++ return defaultValue;
++ var p = params[0][name];
++ return p ? p[0] : defaultValue;
++}
++
++// Returns the first value of the given boolean named parameter.
++//#
++//# @param params
++//# as returned by parseParams or null/undefined
++//#
++function getFlag(params, name, defaultValue) {
++ return !!getParam(params, name, defaultValue);
++}
++
++// Substitute date components into a string
++Date.prototype.formatString = function(template)
++{
++ var t = template.replace(/0hh12/g,String.zeroPad(this.getHours12(),2));
++ t = t.replace(/hh12/g,this.getHours12());
++ t = t.replace(/0hh/g,String.zeroPad(this.getHours(),2));
++ t = t.replace(/hh/g,this.getHours());
++ t = t.replace(/0mm/g,String.zeroPad(this.getMinutes(),2));
++ t = t.replace(/mm/g,this.getMinutes());
++ t = t.replace(/0ss/g,String.zeroPad(this.getSeconds(),2));
++ t = t.replace(/ss/g,this.getSeconds());
++ t = t.replace(/[ap]m/g,this.getAmPm().toLowerCase());
++ t = t.replace(/[AP]M/g,this.getAmPm().toUpperCase());
++ t = t.replace(/wYYYY/g,this.getYearForWeekNo());
++ t = t.replace(/wYY/g,String.zeroPad(this.getYearForWeekNo()-2000,2));
++ t = t.replace(/YYYY/g,this.getFullYear());
++ t = t.replace(/YY/g,String.zeroPad(this.getFullYear()-2000,2));
++ t = t.replace(/MMM/g,config.messages.dates.months[this.getMonth()]);
++ t = t.replace(/mmm/g,config.messages.dates.shortMonths[this.getMonth()]);
++ t = t.replace(/0MM/g,String.zeroPad(this.getMonth()+1,2));
++ t = t.replace(/MM/g,this.getMonth()+1);
++ t = t.replace(/0WW/g,String.zeroPad(this.getWeek(),2));
++ t = t.replace(/WW/g,this.getWeek());
++ t = t.replace(/DDD/g,config.messages.dates.days[this.getDay()]);
++ t = t.replace(/ddd/g,config.messages.dates.shortDays[this.getDay()]);
++ t = t.replace(/0DD/g,String.zeroPad(this.getDate(),2));
++ t = t.replace(/DDth/g,this.getDate()+this.daySuffix());
++ t = t.replace(/DD/g,this.getDate());
++ return t;
++}
++
++Date.prototype.getWeek = function()
++{
++ var dt = new Date(this.getTime());
++ var d = dt.getDay();
++ if (d==0) d=7;// JavaScript Sun=0, ISO Sun=7
++ dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week to calculate weekNo
++ var n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1)+3600000)/86400000);
++ return Math.floor(n/7)+1;
++}
++
++Date.prototype.getYearForWeekNo = function()
++{
++ var dt = new Date(this.getTime());
++ var d = dt.getDay();
++ if (d==0) d=7;// JavaScript Sun=0, ISO Sun=7
++ dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week
++ return dt.getFullYear();
++}
++
++Date.prototype.getHours12 = function()
++{
++ var h = this.getHours();
++ return h > 12 ? h-12 : ( h > 0 ? h : 12 );
++}
++
++Date.prototype.getAmPm = function()
++{
++ return this.getHours() >= 12 ? "pm" : "am";
++}
++
++Date.prototype.daySuffix = function()
++{
++ var num = this.getDate();
++ if (num >= 11 && num <= 13) return "th";
++ else if (num.toString().substr(-1)=="1") return "st";
++ else if (num.toString().substr(-1)=="2") return "nd";
++ else if (num.toString().substr(-1)=="3") return "rd";
++ return "th";
++}
++
++// Convert a date to local YYYYMMDDHHMM string format
++Date.prototype.convertToLocalYYYYMMDDHHMM = function()
++{
++ return(String.zeroPad(this.getFullYear(),4) + String.zeroPad(this.getMonth()+1,2) + String.zeroPad(this.getDate(),2) + String.zeroPad(this.getHours(),2) + String.zeroPad(this.getMinutes(),2));
++}
++
++// Convert a date to UTC YYYYMMDDHHMM string format
++Date.prototype.convertToYYYYMMDDHHMM = function()
++{
++ return(String.zeroPad(this.getUTCFullYear(),4) + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2));
++}
++
++// Convert a date to UTC YYYYMMDD.HHMMSSMMM string format
++Date.prototype.convertToYYYYMMDDHHMMSSMMM = function()
++{
++ return(String.zeroPad(this.getUTCFullYear(),4) + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + "." + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2) + String.zeroPad(this.getUTCSeconds(),2) + String.zeroPad(this.getUTCMilliseconds(),4));
++}
++
++// Static method to create a date from a UTC YYYYMMDDHHMM format string
++Date.convertFromYYYYMMDDHHMM = function(d)
++{
++ var theDate = new Date(Date.UTC(parseInt(d.substr(0,4),10),
++ parseInt(d.substr(4,2),10)-1,
++ parseInt(d.substr(6,2),10),
++ parseInt(d.substr(8,2),10),
++ parseInt(d.substr(10,2),10),0,0));
++ return(theDate);
++}
++
++// ---------------------------------------------------------------------------------
++// Crypto functions and associated conversion routines
++// ---------------------------------------------------------------------------------
++
++// Crypto "namespace"
++function Crypto() {}
++
++// Convert a string to an array of big-endian 32-bit words
++Crypto.strToBe32s = function(str)
++{
++ var be = Array();
++ var len = Math.floor(str.length/4);
++ var i, j;
++ for(i=0, j=0; i<len; i++, j+=4)
++ {
++ be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
++ }
++ while (j<str.length)
++ {
++ be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
++ j++;
++ }
++ return be;
++}
++
++// Convert an array of big-endian 32-bit words to a string
++Crypto.be32sToStr = function(be)
++{
++ var str = "";
++ for(var i=0;i<be.length*32;i+=8)
++ str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
++ return str;
++}
++
++// Convert an array of big-endian 32-bit words to a hex string
++Crypto.be32sToHex = function(be)
++{
++ var hex = "0123456789ABCDEF";
++ var str = "";
++ for(var i=0;i<be.length*4;i++)
++ str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
++ return str;
++}
++
++// Return, in hex, the SHA-1 hash of a string
++Crypto.hexSha1Str = function(str)
++{
++ return Crypto.be32sToHex(Crypto.sha1Str(str));
++}
++
++// Return the SHA-1 hash of a string
++Crypto.sha1Str = function(str)
++{
++ return Crypto.sha1(Crypto.strToBe32s(str),str.length);
++}
++
++// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
++Crypto.sha1 = function(x,blen)
++{
++ // Add 32-bit integers, wrapping at 32 bits
++ //# Uses 16-bit operations internally to work around bugs in some JavaScript interpreters.
++ add32 = function(a,b)
++ {
++ var lsw = (a&0xFFFF)+(b&0xFFFF);
++ var msw = (a>>16)+(b>>16)+(lsw>>16);
++ return (msw<<16)|(lsw&0xFFFF);
++ };
++ // Add five 32-bit integers, wrapping at 32 bits
++ //# Uses 16-bit operations internally to work around bugs in some JavaScript interpreters.
++ add32x5 = function(a,b,c,d,e)
++ {
++ var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
++ var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
++ return (msw<<16)|(lsw&0xFFFF);
++ };
++ // Bitwise rotate left a 32-bit integer by 1 bit
++ rol32 = function(n)
++ {
++ return (n>>>31)|(n<<1);
++ };
++
++ var len = blen*8;
++ // Append padding so length in bits is 448 mod 512
++ x[len>>5] |= 0x80 << (24-len%32);
++ // Append length
++ x[((len+64>>9)<<4)+15] = len;
++ var w = Array(80);
++
++ var k1 = 0x5A827999;
++ var k2 = 0x6ED9EBA1;
++ var k3 = 0x8F1BBCDC;
++ var k4 = 0xCA62C1D6;
++
++ var h0 = 0x67452301;
++ var h1 = 0xEFCDAB89;
++ var h2 = 0x98BADCFE;
++ var h3 = 0x10325476;
++ var h4 = 0xC3D2E1F0;
++
++ for(var i=0;i<x.length;i+=16)
++ {
++ var j,t;
++ var a = h0;
++ var b = h1;
++ var c = h2;
++ var d = h3;
++ var e = h4;
++ for(j = 0;j<16;j++)
++ {
++ w[j] = x[i+j];
++ t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
++ e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
++ }
++ for(j=16;j<20;j++)
++ {
++ w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
++ t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
++ e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
++ }
++ for(j=20;j<40;j++)
++ {
++ w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
++ t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2);
++ e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
++ }
++ for(j=40;j<60;j++)
++ {
++ w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
++ t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3);
++ e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
++ }
++ for(j=60;j<80;j++)
++ {
++ w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
++ t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4);
++ e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
++ }
++
++ h0 = add32(h0,a);
++ h1 = add32(h1,b);
++ h2 = add32(h2,c);
++ h3 = add32(h3,d);
++ h4 = add32(h4,e);
++ }
++ return Array(h0,h1,h2,h3,h4);
++}
++
++// ---------------------------------------------------------------------------------
++// RGB colour object
++// ---------------------------------------------------------------------------------
++
++// Construct an RGB colour object from a '#rrggbb', '#rgb' or 'rgb(n,n,n)' string or from separate r,g,b values
++function RGB(r,g,b)
++{
++ this.r = 0;
++ this.g = 0;
++ this.b = 0;
++ if(typeof r == "string")
++ {
++ if(r.substr(0,1) == "#")
++ {
++ if(r.length == 7)
++ {
++ this.r = parseInt(r.substr(1,2),16)/255;
++ this.g = parseInt(r.substr(3,2),16)/255;
++ this.b = parseInt(r.substr(5,2),16)/255;
++ }
++ else
++ {
++ this.r = parseInt(r.substr(1,1),16)/15;
++ this.g = parseInt(r.substr(2,1),16)/15;
++ this.b = parseInt(r.substr(3,1),16)/15;
++ }
++ }
++ else
++ {
++ var rgbPattern = /rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/ ;
++ var c = r.match(rgbPattern);
++ if (c)
++ {
++ this.r = parseInt(c[1],10)/255;
++ this.g = parseInt(c[2],10)/255;
++ this.b = parseInt(c[3],10)/255;
++ }
++ }
++ }
++ else
++ {
++ this.r = r;
++ this.g = g;
++ this.b = b;
++ }
++ return this;
++}
++
++// Mixes this colour with another in a specified proportion
++// c = other colour to mix
++// f = 0..1 where 0 is this colour and 1 is the new colour
++// Returns an RGB object
++RGB.prototype.mix = function(c,f)
++{
++ return new RGB(this.r + (c.r-this.r) * f,this.g + (c.g-this.g) * f,this.b + (c.b-this.b) * f);
++}
++
++// Return an rgb colour as a #rrggbb format hex string
++RGB.prototype.toString = function()
++{
++ var r = this.r.clamp(0,1);
++ var g = this.g.clamp(0,1);
++ var b = this.b.clamp(0,1);
++ return("#" + ("0" + Math.floor(r * 255).toString(16)).right(2) +
++ ("0" + Math.floor(g * 255).toString(16)).right(2) +
++ ("0" + Math.floor(b * 255).toString(16)).right(2));
++}
++
++// ---------------------------------------------------------------------------------
++// DOM utilities - many derived from www.quirksmode.org
++// ---------------------------------------------------------------------------------
++
++function drawGradient(place,horiz,colours)
++{
++ for(var t=0; t<= 100; t+=2)
++ {
++ var bar = document.createElement("div");
++ place.appendChild(bar);
++ bar.style.position = "absolute";
++ bar.style.left = horiz ? t + "%" : 0;
++ bar.style.top = horiz ? 0 : t + "%";
++ bar.style.width = horiz ? (101-t) + "%" : "100%";
++ bar.style.height = horiz ? "100%" : (101-t) + "%";
++ bar.style.zIndex = -1;
++ var f = t/100;
++ var p = f*(colours.length-1);
++ bar.style.backgroundColor = colours[Math.floor(p)].mix(colours[Math.ceil(p)],p-Math.floor(p)).toString();
++ }
++}
++
++function createTiddlyText(theParent,theText)
++{
++ return theParent.appendChild(document.createTextNode(theText));
++}
++
++function createTiddlyCheckbox(theParent,caption,checked,onChange)
++{
++ var cb = document.createElement("input");
++ cb.setAttribute("type","checkbox");
++ cb.onclick = onChange;
++ theParent.appendChild(cb);
++ cb.checked = checked;
++ cb.className = "chkOptionInput";
++ if(caption)
++ wikify(caption,theParent);
++ return cb;
++}
++
++function createTiddlyElement(theParent,theElement,theID,theClass,theText)
++{
++ var e = document.createElement(theElement);
++ if(theClass != null)
++ e.className = theClass;
++ if(theID != null)
++ e.setAttribute("id",theID);
++ if(theText != null)
++ e.appendChild(document.createTextNode(theText));
++ if(theParent != null)
++ theParent.appendChild(e);
++ return(e);
++}
++
++// Add an event handler
++// Thanks to John Resig, via QuirksMode
++function addEvent(obj,type,fn)
++{
++ if(obj.attachEvent)
++ {
++ obj['e'+type+fn] = fn;
++ obj[type+fn] = function(){obj['e'+type+fn](window.event);}
++ obj.attachEvent('on'+type,obj[type+fn]);
++ }
++ else
++ obj.addEventListener(type,fn,false);
++}
++
++// Remove an event handler
++// Thanks to John Resig, via QuirksMode
++function removeEvent(obj,type,fn)
++{
++ if(obj.detachEvent)
++ {
++ obj.detachEvent('on'+type,obj[type+fn]);
++ obj[type+fn] = null;
++ }
++ else
++ obj.removeEventListener(type,fn,false);
++}
++
++function addClass(e,theClass)
++{
++ var currClass = e.className.split(" ");
++ if(currClass.indexOf(theClass) == -1)
++ e.className += " " + theClass;
++}
++
++function removeClass(e,theClass)
++{
++ var currClass = e.className.split(" ");
++ var i = currClass.indexOf(theClass);
++ while(i != -1)
++ {
++ currClass.splice(i,1);
++ i = currClass.indexOf(theClass);
++ }
++ e.className = currClass.join(" ");
++}
++
++function hasClass(e,theClass)
++{
++ if(e.className)
++ {
++ if(e.className.split(" ").indexOf(theClass) != -1)
++ return true;
++ }
++ return false;
++}
++
++// Find the closest relative with a given property value (property defaults to tagName, relative defaults to parentNode)
++function findRelated(e,value,name,relative)
++{
++ name = name ? name : "tagName";
++ relative = relative ? relative : "parentNode";
++ if(name == "className")
++ {
++ while(e && !hasClass(e,value))
++ {
++ e = e[relative];
++ }
++ }
++ else
++ {
++ while(e && e[name] != value)
++ {
++ e = e[relative];
++ }
++ }
++ return e;
++}
++
++// Resolve the target object of an event
++function resolveTarget(e)
++{
++ var obj;
++ if (e.target)
++ obj = e.target;
++ else if (e.srcElement)
++ obj = e.srcElement;
++ if (obj.nodeType == 3) // defeat Safari bug
++ obj = obj.parentNode;
++ return(obj);
++}
++
++// Return the content of an element as plain text with no formatting
++function getPlainText(e)
++{
++ var text = "";
++ if(e.innerText)
++ text = e.innerText;
++ else if(e.textContent)
++ text = e.textContent;
++ return text;
++}
++
++// Get the scroll position for window.scrollTo necessary to scroll a given element into view
++function ensureVisible(e)
++{
++ var posTop = findPosY(e);
++ var posBot = posTop + e.offsetHeight;
++ var winTop = findScrollY();
++ var winHeight = findWindowHeight();
++ var winBot = winTop + winHeight;
++ if(posTop < winTop)
++ return(posTop);
++ else if(posBot > winBot)
++ {
++ if(e.offsetHeight < winHeight)
++ return(posTop - (winHeight - e.offsetHeight));
++ else
++ return(posTop);
++ }
++ else
++ return(winTop);
++}
++
++// Get the current width of the display window
++function findWindowWidth()
++{
++ return(window.innerWidth ? window.innerWidth : document.documentElement.clientWidth);
++}
++
++// Get the current height of the display window
++function findWindowHeight()
++{
++ return(window.innerHeight ? window.innerHeight : document.documentElement.clientHeight);
++}
++
++// Get the current horizontal page scroll position
++function findScrollX()
++{
++ return(window.scrollX ? window.scrollX : document.documentElement.scrollLeft);
++}
++
++// Get the current vertical page scroll position
++function findScrollY()
++{
++ return(window.scrollY ? window.scrollY : document.documentElement.scrollTop);
++}
++
++function findPosX(obj)
++{
++ var curleft = 0;
++ while (obj.offsetParent)
++ {
++ curleft += obj.offsetLeft;
++ obj = obj.offsetParent;
++ }
++ return curleft;
++}
++
++function findPosY(obj)
++{
++ var curtop = 0;
++ while (obj.offsetParent)
++ {
++ curtop += obj.offsetTop;
++ obj = obj.offsetParent;
++ }
++ return curtop;
++}
++
++// Blur a particular element
++function blurElement(e)
++{
++ if(e != null && e.focus && e.blur)
++ {
++ e.focus();
++ e.blur();
++ }
++}
++
++// Create a non-breaking space
++function insertSpacer(place)
++{
++ var e = document.createTextNode(String.fromCharCode(160));
++ if(place)
++ place.appendChild(e);
++ return e;
++}
++
++// Remove all children of a node
++function removeChildren(e)
++{
++ while(e.hasChildNodes())
++ e.removeChild(e.firstChild);
++}
++
++// Add a stylesheet, replacing any previous custom stylesheet
++function setStylesheet(s,id)
++{
++ if(!id)
++ id = "customStyleSheet";
++ var n = document.getElementById(id);
++ if(document.createStyleSheet) // Test for IE's non-standard createStyleSheet method
++ {
++ if(n)
++ n.parentNode.removeChild(n);
++ // This failed without the &nbsp;
++ document.getElementsByTagName("head")[0].insertAdjacentHTML("beforeEnd","&nbsp;<style id='" + id + "'>" + s + "</style>");
++ }
++ else
++ {
++ if(n)
++ n.replaceChild(document.createTextNode(s),n.firstChild);
++ else
++ {
++ var n = document.createElement("style");
++ n.type = "text/css";
++ n.id = id;
++ n.appendChild(document.createTextNode(s));
++ document.getElementsByTagName("head")[0].appendChild(n);
++ }
++ }
++}
++
++// Replace the current selection of a textarea or text input and scroll it into view
++
++function replaceSelection(e,text)
++{
++ if (e.setSelectionRange)
++ {
++ var oldpos = e.selectionStart + 1;
++ e.value = e.value.substr(0,e.selectionStart) + text + e.value.substr(e.selectionStart);
++ e.setSelectionRange( oldpos, oldpos);
++ var linecount = e.value.split('\n').length;
++ var thisline = e.value.substr(0,e.selectionStart).split('\n').length-1;
++ e.scrollTop = Math.floor((thisline-e.rows/2)*e.scrollHeight/linecount);
++ }
++ else if (document.selection)
++ {
++ var range = document.selection.createRange();
++ if (range.parentElement() == e)
++ {
++ var isCollapsed = range.text == "";
++ range.text = text;
++ if (!isCollapsed)
++ {
++ range.moveStart('character', -text.length);
++ range.select();
++ }
++ }
++ }
++}
++
++// Returns the text of the given (text) node, possibly merging subsequent text nodes
++function getNodeText(e)
++{
++ var t = "";
++ while (e && e.nodeName == "#text")
++ {
++ t += e.nodeValue;
++ e = e.nextSibling;
++ }
++ return t;
++}
++//# -------------------------
++//# LoaderBase: A (abstract) storage loader that loads the tiddlers from a list of HTML elements.
++//# The format of the elements is defined by subclasses of this loader through the internalizeTiddler implementation.
++//# Subclasses must implement:
++//# function getTitle(store, e)
++//#
++//# store must implement:
++//# function createTiddler(title).
++//#
++
++function LoaderBase()
++{
++}
++
++LoaderBase.prototype.loadTiddler = function(store,e,tiddlers)
++{
++ var title = this.getTitle(store, e);
++ if (title)
++ {
++ var tiddler = store.createTiddler(title);
++ this.internalizeTiddler(store, tiddler, title, e);
++ tiddlers.push(tiddler);
++ }
++}
++
++LoaderBase.prototype.loadTiddlers = function(store,nodes)
++{
++ var tiddlers = [];
++ for (var t = 0; t < nodes.length; t++)
++ {
++ try
++ {
++ this.loadTiddler(store, nodes[t], tiddlers);
++ }
++ catch(e)
++ {
++ showException(e, config.messages.tiddlerLoadError.format([this.getTitle(store, nodes[t])]));
++ }
++ }
++ return tiddlers;
++}
++
++//# -------------------------
++//# SaverBase: a (abstract) storage saver that externalizes all tiddlers into a string,
++//# with every tiddler individually externalized (using this.externalizeTiddler) and joined with newlines
++//# Subclasses must implement:
++//# function externalizeTiddler(store, tiddler)
++//#
++//# store must implement:
++//# function getTiddlers(sortByFieldName)
++//#
++
++function SaverBase()
++{
++}
++
++SaverBase.prototype.externalize = function(store)
++{
++ var results = [];
++ var tiddlers = store.getTiddlers("title");
++ for (var t = 0; t < tiddlers.length; t++)
++ results.push(this.externalizeTiddler(store, tiddlers[t]));
++ return results.join("\n");
++}
++//--------------------------------
++// TW21Loader (inherits from LoaderBase)
++
++function TW21Loader() {};
++
++TW21Loader.prototype = new LoaderBase();
++
++TW21Loader.prototype.getTitle = function(store, e) {
++ var title = null;
++ if(e.getAttribute)
++ title = e.getAttribute("tiddler");
++ if(!title && e.id) {
++ var lenPrefix = store.idPrefix.length;
++ if (e.id.substr(0,lenPrefix) == store.idPrefix)
++ title = e.id.substr(lenPrefix);
++ }
++ return title;
++}
++
++TW21Loader.prototype.internalizeTiddler = function(store, tiddler, title, data) {
++ var text = getNodeText(data.firstChild).unescapeLineBreaks();
++ var modifier = data.getAttribute("modifier");
++ var modified = Date.convertFromYYYYMMDDHHMM(data.getAttribute("modified"));
++ var c = data.getAttribute("created");
++ var created = c ? Date.convertFromYYYYMMDDHHMM(c) : modified;
++ var tags = data.getAttribute("tags");
++ var fields = {};
++ var attrs = data.attributes;
++ for(var i = attrs.length-1; i >= 0; i--) {
++ var name = attrs[i].name;
++ if (attrs[i].specified && !TiddlyWiki.isStandardField(name)) {
++ fields[name] = attrs[i].value.unescapeLineBreaks();
++ }
++ }
++ tiddler.assign(title,text,modifier,modified,tags,created, fields);
++ return tiddler;
++};
++
++//--------------------------------
++// TW21Saver (inherits from SaverBase)
++
++function TW21Saver() {};
++
++TW21Saver.prototype = new SaverBase();
++
++TW21Saver.prototype.externalizeTiddler = function(store, tiddler)
++{
++ try {
++ var extendedFieldAttributes = "";
++ store.forEachField(tiddler,
++ function(tiddler, fieldName, value) {
++ // don't store stuff from the temp namespace
++ if (!fieldName.match(/^temp\./))
++ extendedFieldAttributes += ' %0="%1"'.format([fieldName, value.escapeLineBreaks().htmlEncode()]);
++ }, true);
++ return '<div tiddler="%0" modifier="%1" modified="%2" created="%3" tags="%4"%6>%5</div>'.format([
++ tiddler.title.htmlEncode(),
++ tiddler.modifier.htmlEncode(),
++ tiddler.modified.convertToYYYYMMDDHHMM(),
++ tiddler.created.convertToYYYYMMDDHHMM(),
++ tiddler.getTags().htmlEncode(),
++ tiddler.escapeLineBreaks().htmlEncode(),
++ extendedFieldAttributes
++ ]);
++ } catch (e) {
++ throw exceptionText(e, config.messages.tiddlerSaveError.format([tiddler.title]));
++ }
++}
++
++// ---------------------------------------------------------------------------------
++// Deprecated code
++// ---------------------------------------------------------------------------------
++
++// @Deprecated: Use createElementAndWikify and this.termRegExp instead
++config.formatterHelpers.charFormatHelper = function(w)
++{
++ w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
++}
++
++// @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
++config.formatterHelpers.monospacedByLineHelper = function(w)
++{
++ var lookaheadRegExp = new RegExp(this.lookahead,"mg");
++ lookaheadRegExp.lastIndex = w.matchStart;
++ var lookaheadMatch = lookaheadRegExp.exec(w.source);
++ if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
++ {
++ var text = lookaheadMatch[1];
++ if(config.browser.isIE)
++ text = text.replace(/\n/g,"\r");
++ createTiddlyElement(w.output,"pre",null,null,text);
++ w.nextMatch = lookaheadRegExp.lastIndex;
++ }
++}
++
++// @Deprecated: Use <br> or <br /> instead of <<br>>
++config.macros.br.handler = function(place)
++{
++ createTiddlyElement(place,"br");
++}
++
++// Find an entry in an array. Returns the array index or null
++// @Deprecated: Use indexOf instead
++Array.prototype.find = function(item)
++{
++ var i = this.indexOf(item);
++ return i == -1 ? null : i;
++}
++
++// Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
++// @Deprecated: Use store.getLoader().internalizeTiddler instead
++Tiddler.prototype.loadFromDiv = function(divRef,title)
++{
++ return store.getLoader().internalizeTiddler(store,this,title,divRef);
++}
++
++// Format the text for storage in an HTML DIV
++// @Deprecated Use store.getSaver().externalizeTiddler instead.
++Tiddler.prototype.saveToDiv = function()
++{
++ return store.getSaver().externalizeTiddler(store,this);
++}
++
++// @Deprecated: Use store.allTiddlersAsHtml() instead
++function allTiddlersAsHtml()
++{
++ return store.allTiddlersAsHtml();
++}
++
++// @Deprecated: Use refreshPageTemplate instead
++function applyPageTemplate(title)
++{
++ refreshPageTemplate(title);
++}
++
++// @Deprecated: Use story.displayTiddlers instead
++function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,slowly)
++{
++ story.displayTiddlers(srcElement,titles,template,animate,slowly);
++}
++
++// @Deprecated: Use story.displayTiddler instead
++function displayTiddler(srcElement,title,template,unused1,unused2,animate,slowly)
++{
++ story.displayTiddler(srcElement,title,template,animate,slowly);
++}
++
++// @Deprecated: Use functions on right hand side directly instead
++var createTiddlerPopup = Popup.create;
++var scrollToTiddlerPopup = Popup.show;
++var hideTiddlerPopup = Popup.remove;
++
++// @Deprecated: Use right hand side directly instead
++var regexpBackSlashEn = new RegExp("\\\\n","mg");
++var regexpBackSlash = new RegExp("\\\\","mg");
++var regexpBackSlashEss = new RegExp("\\\\s","mg");
++var regexpNewLine = new RegExp("\n","mg");
++var regexpCarriageReturn = new RegExp("\r","mg");
++// ---------------------------------------------------------------------------------
++// End of scripts
++merge(config.shadowTiddlers,{SiteTitle:'DevFire'});
++merge(config.shadowTiddlers,{MainMenu:"PageTemplate\nStyleSheet\nMainMenu\nDefaultTiddlers"});
++merge(config.shadowTiddlers,{SiteSubtitle:"a theme for ~TiddlyWiki"});
++merge(config.shadowTiddlers,{DefaultTiddlers:"LorumIpsum"});
++merge(config.shadowTiddlers,{LorumIpsum:"Aenean eros arcu, condimentum nec, dapibus ut, tincidunt sit amet, urna. Quisque viverra, eros sed imperdiet iaculis, est risus facilisis quam, id malesuada arcu nulla luctus urna. Nullam et est. Vestibulum velit sem, faucibus cursus, dapibus vestibulum, pellentesque et, urna. Donec luctus. Donec lectus. Aliquam eget eros facilisis tortor feugiat sollicitudin. Integer lobortis vulputate sapien. Sed iaculis erat ac nunc. Etiam eu enim. Mauris ipsum urna, rhoncus at, bibendum sit amet, euismod eget, dolor. Mauris fermentum quam vitae ligula. Vestibulum in libero feugiat justo dictum consectetuer. Vestibulum euismod purus eget elit. Nunc sed massa porta elit bibendum posuere. Nunc pulvinar justo sit amet odio. In sed est. Phasellus ornare elementum nulla. Nulla ipsum neque, cursus a, viverra a, imperdiet at, enim. Quisque facilisis, diam sed accumsan suscipit, odio arcu hendrerit dolor, quis aliquet massa nulla nec sem.\n!heading 1\n!!heading 2\n!!!heading3\n----\n<<tag button>>\nThis is a link to a [[StyleSheet]] tiddler.\n\n> This is a blockquote\n> This is a blockquote\n> This is a blockquote\n|>|>| !This is a header |h\n|column1|column2|column3|\n|row2| row2 |row2|\n|column1|column2|column3|\n|row2| row2 |row2|\n|column1|column2|column3|\n|row2| row2 |row2|"});
++// ---------------------------------------------------------------------------------
++//]]>
++</script>
++<style type="text/css">
++
++#saveTest {
++ display: none;
++}
++
++.zoomer {
++ display: none;
++}
++
++#messageArea {
++ display: none;
++}
++
++#copyright {
++ display: none;
++}
++
++.popup {
++ position: absolute;
++}
++
++#storeArea {
++ display: none;
++ margin: 4em 10em 3em;
++}
++
++#storeArea div {
++ padding: 0.5em;
++ margin: 1em 0em 0em 0em;
++ border-color: #f0f0f0 #606060 #404040 #d0d0d0;
++ border-style: solid;
++ border-width: 2px;
++ overflow: auto;
++}
++
++#javascriptWarning {
++ width: 100%;
++ text-align: center;
++ font-weight: bold;
++ background-color: #dd1100;
++ color: #fff;
++ padding:1em 0em;
++}
++
++</style>
++<!--POST-HEAD-START-->
++
++<!--POST-HEAD-END-->
++</head>
++<body onload="main();" onunload="if(window.checkUnsavedChanges) checkUnsavedChanges();">
++<!--PRE-BODY-START-->
++
++<!--PRE-BODY-END-->
++ <script type="text/javascript">
++//<![CDATA[
++if (useJavaSaver)
++ document.write("<applet style='position:absolute;left:-1px' name='TiddlySaver' code='TiddlySaver.class' archive='TiddlySaver.jar' width='1' height='1'></applet>");
++//]]>
++ </script>
++ <div id="copyright">
++ Welcome to TiddlyWiki by Jeremy Ruston, Copyright &copy; 2006 Osmosoft Limited
++ </div>
++ <noscript>
++ <div id="javascriptWarning">This page requires JavaScript to function properly</div>
++ </noscript>
++ <div id="saveTest"></div>
++ <div id="contentWrapper"></div>
++ <div id="contentStash"></div>
++ <div id="storeArea">
++<div tiddler="(built-in shadow tiddler)" modifier="CameronRich" modified="200702240024" created="200702240024" tags="">changes, notes and errata</div>
++<div tiddler="Cam" modifier="YourName" modified="200804011313" created="200804011313" tags="">Type the text for 'YourName'</div>
++<div tiddler="Changelog" modifier="YourName" modified="200901301233" created="200702240022" tags="">@@bgcolor(#ff0000):color(#ffffff):Changes for 1.2.1@@\n\n!!__SSL Library__\n* Certificate verification now works for Firefox.\n* Extended the openssl API.\n\n@@bgcolor(#ff0000):color(#ffffff):Changes for 1.2.0@@\n\n!!__SSL Library__\n* A self-signed certificate will be verified as ok provided that that it is on the certificate authority list.\n* Certificates are not verified when added as certificate authorities (since self-signed and expired certificates can be added to browsers etc)\n\n@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.9@@\n\n!!__SSL Library__\n* Now support MS IIS resource kit certificates (thanks to Carsten Sørensen).\n* Fixed a memory leak when freeing more than one CA certificate.\n* The bigint library had a problem with squaring which affected classical reduction (thanks to Manuel Klimek).\n\n!!__axhttpd__\n* Brought back setuid()/setgid() as an option.\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.8@@\n\n!!__SSL Library__\n* Now using a BSD style license.\n* Self-signed certificates can now be automatically generated (the keys still need to be provided).\n* A new API call //ssl_x509_create()// can be used to programatically create the certificate.\n* Certificate/keys can be loaded automatically given a file location.\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.7@@\n\n!!__SSL Library__\n\n* Variable sized session id's is now better handled for session caching. It has meant a new API call //ssl_get_session_id_size()// and a change to //ssl_client_new()// to define the session id size.\n* Muliple records with a single header are now better supported (thanks to Hervé Sibert).\n* ~MD2 added for Verisign root cert verification (thanks to Byron Rakitzis).\n* The ~MD5/~SHA1 digests are calculated incrementally to reduce memory (thanks to Byron Rakitzis).\n* The bigint cache is now cleared regularly to reduce memory.\n\n!!__axhttpd__\n\n* Improved the POST handling (thanks to Christian Melki).\n* CSS files now work properly.\n* Lua's CGI launcher location is configurable.\n* //vfork()// is now used for CGI for performance reasons.\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.6@@\n\n!!__SSL Library__\n\n* ~RC4 speed improvements\n* Lua samples/bindings now work properly\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.5@@\n\n!!__SSL Library__\n\n* Session id's can now be variable lengths in server hello messages.\n* 0 length client certificates are now supported.\n* ssl_version() now returns just the version and not the date.\n* ssl_write() was not sending complete packets under load.\n\n!!__axhttpd__\n\n* Completely updated the CGI code.\n* Lua now integrated - Lua scripts and Lua Pages now run.\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.4@@\n\n!!__SSL Library__\n\n* Fixed a Win32 crypto library issue with non-Administrator users\n* Removed compiler warnings that showed up in ~FC6.\n* GNU TLS certificates are now accepted.\n* Separated the send/receive headers for HMAC calculations.\n* Fixed a compilation problem with swig/perl/~FC6.\n* Fixed an issue with loading PEM CA certificates.\n\n!!__axhttpd__\n\n* Made //setuid()/setgid()// call an mconf option.\n* Made //chroot()// an mconf option. Default to //chdir()// instead.\n* Removed optional permissions checking.\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.1@@\n\n!!__SSL Library__\n\n* AES should now work on 16bit processors (there was an alignment problem).\n* Various freed objects are cleared before freeing.\n* Header files now installed in ///usr/local/include/axTLS//.\n* -DCYGWIN replaced with -~DCONFIG_PLATFORM_CYGWIN (and the same for Solaris).\n* removed &quot;-noextern&quot; option in Swig. Fixed some other warnings in Win32.\n* SSLCTX changed to ~SSL_CTX (to be consistent with openssl). SSLCTX still exists for backwards compatibility.\n* malloc() and friends call abort() on failure.\n* Fixed a memory leak in directory listings.\n* Added openssl() compatibility functions.\n* Fixed Cygwin 'make install' issue.\n\n!!__axhttpd__\n\n* main.c now becomes axhttpd.c.\n* Header file issue fixed (in mime_types.c).\n* //chroot()// now used for better security.\n* Basic authentication implemented (via .htpasswd).\n* SSL access/denial protection implemented (via .htaccess).\n* Directory access protection implemented (via .htaccess).\n* Can now have more than one CGI file extension in mconf.\n* &quot;~If-Modified-Since&quot; request now handled properly.\n* Performance tweaks to remove //ssl_find()//.</div>
++<div tiddler="DefaultTiddlers" modifier="CameronRich" modified="200702240019" created="200702240019" tags="">[[Read Me]]</div>
++<div tiddler="License" modifier="YourName" modified="200804011309" created="200702240022" tags="">axTLS uses a BSD style license:\n\nCopyright (c) 2008, Cameron Rich All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer. Redistributions in binary\nform must reproduce the above copyright notice, this list of conditions and\nthe following disclaimer in the documentation and/or other materials\nprovided with the distribution. Neither the name of the axTLS Project nor\nthe names of its contributors may be used to endorse or promote products\nderived from this software without specific prior written permission. \n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS IS&quot;\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\nOUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.</div>
++<div tiddler="MainMenu" modifier="CameronRich" modified="200702250353" created="200702240021" tags="">[[Read Me]] \n[[Changelog]]\n[[axhttpd]]\n[[License]]</div>
++<div tiddler="PageTemplate" modifier="YourName" modified="200701122313" created="200701122350" tags="DevFireTheme">&lt;div class='header' macro='gradient vert #390108 #900'&gt;\n&lt;div class='headerShadow'&gt;\n&lt;span class='siteTitle' refresh='content' tiddler='SiteTitle'&gt;&lt;/span&gt;&amp;nbsp;\n&lt;span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'&gt;&lt;/span&gt;\n&lt;/div&gt;\n&lt;div class='headerForeground'&gt;\n&lt;span class='siteTitle' refresh='content' tiddler='SiteTitle'&gt;&lt;/span&gt;&amp;nbsp;\n&lt;span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'&gt;&lt;/span&gt;\n&lt;/div&gt;\n&lt;/div&gt;\n&lt;div id='mainMenu'&gt;\n&lt;div refresh='content' tiddler='MainMenu'&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div id='sidebar'&gt;\n&lt;div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'&gt;&lt;/div&gt;\n&lt;div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'&gt;&lt;/div&gt;\n&lt;/div&gt;\n&lt;div id='displayArea'&gt;\n&lt;div id='messageArea'&gt;&lt;/div&gt;\n&lt;div id='tiddlerDisplay'&gt;&lt;/div&gt;\n&lt;/div&gt;</div>
++<div tiddler="Read Me" modifier="YourName" modified="200804011313" created="200702240020" tags="">!@@bgcolor(#ff0000):color(#ffffff):axTLS Quick Start Guide@@\n\nThis is a guide to get a small SSL web-server up and running quickly.\n\n!!__Introduction__\n\nThe axTLS project is an SSL client/server library using the ~TLSv1 protocol. It is designed to be small and fast, and is suited to embedded projects. A web server is included.\n\nThe basic web server + SSL library is around 60-70kB and is configurable for features or size.\n\n!!__Compilation__\n\nAll platforms require GNU make. This means on Win32 that Cygwin needs to be installed with &quot;make&quot; and various developer options selected.\n\nConfiguration now uses a tool called &quot;mconf&quot; which gives a nice way to configure options (similar to what is used in ~BusyBox and the Linux kernel).\n\nYou should be able to compile axTLS simply by extracting it, change into the extracted directory and typing:\n\n{{indent{{{{&gt; make}}}\n\nSelect your platform type, save the configuration, exit, and then type &quot;make&quot; again.\n\nIf all goes well, you should end up with an executable called &quot;axhttpd&quot; (or axhttpd.exe) in the //_stage// directory.\n\nTo play with all the various axTLS options, type:\n\n{{indent{{{{&gt; make menuconfig}}}\n\nSave the new configuration and rebuild.\n\n!!__Running it__\n\nTo run it, go to the //_stage// directory, and type (as superuser):\n\n{{indent{{{{&gt; axhttpd}}}\n\nNote: you may have to set your ~LD_LIBRARY_PATH - e.g. go to //_stage// and type //export ~LD_LIBRARY_PATH=`pwd`//\n\nAnd then point your browser at https://127.0.0.1 And you should see a this html page with a padlock appearing on your browser. or type http://127.0.0.1 to see the same page unencrypted.\n\n!!__The axssl utilities__\n\nThe axssl suite of tools are the SSL test tools in the various language bindings. They are:\n\n* axssl - C sample\n* axssl.csharp - C# sample\n* axssl.vbnet - VB.NET sample\n* axtls.jar - Java sample\n* axssl.pl - Perl sample\n* axssl.lua - Lua sample\n\nAll the tools have identical command-line parameters. e.g. to run something interesting:\n\n{{indent{{{{&gt; axssl s_server -verify -CAfile ../ssl/test/axTLS.ca_x509}}}\n\nand\n\n{{indent{{{{&gt; axssl s_client -cert ../ssl/test/axTLS.x509_1024 -key ../ssl/test/axTLS.key_1024 -reconnect}}}\n\n!!!!C#\n\nIf building under Linux or other non-Win32 platforms, Mono must be installed and the executable is run as:\n\n{{indent{{{{&gt; mono axssl.csharp.exe ...}}}\n\n!!!!Java\n\nThe java version is run as:\n\n{{indent{{{{&gt; java -jar axtls.jar &lt;options&gt;}}}\n\n!!!!Perl\n\n{{indent{{{{&gt; [perl] ./axssl.pl &lt;options&gt;}}}\n\nIf running under Win32, be sure to use the correct version of Perl (i.e. ~ActiveState's version works ok).\n\n!!!!Lua\n\n{{indent{{{{&gt; [lua] ./axssl.lua &lt;options&gt;}}}\n\n!__Known Issues__\n\n* Firefox doesn't handle legacy ~SSLv2 at all well. Disabling ~SSLv2 still initiates a ~SSLv23 handshake (v1.5). And continuous pressing of the &quot;Reload&quot; page instigates a change to ~SSLv3 for some reason (even though the TLS 1.0 option is selected). This will cause a &quot;Firefox and &lt;server&gt; cannot communicate securely because they have no common encryption algorithms&quot; (v1.5), or &quot;Firefox can't connect to &lt;server&gt; because the site uses a security protocol which isn't enabled&quot; (v2.0). See bugzilla issues 343543 and 359484 (Comment #7). It's all broken (hopefully fixed soon).\n* Perl/Java bindings don't work on 64 bit Linux machines. I can't even compile the latest version of Perl on an ~AMD64 box (using ~FC3).\n* Java 1.4 or better is required for the Java interfaces.\n* Processes that fork can't use session resumption unless some form of IPC is used.\n* Ensure libperl.so and libaxtls.so are in the shared library path when running with the perl bindings. A way to do this is with:\n\n{{indent{{{{&gt; export LD_LIBRARY_PATH=`perl -e 'use Config; print $Config{archlib};'`/CORE:.}}}\n* The lua sample requires the luabit library from http://luaforge.net/projects/bit.\n\n!!!!Win32 issues\n\n* Be careful about doing .NET executions on network drives - .NET complains with security exceptions on the binary. //TODO: Add a manifest file to prevent this.//\n* CGI has been removed from Win32 - it needs a lot more work to get it right.\n* The default Microsoft .NET SDK is v2.0.50727. Download from: http://msdn.microsoft.com/netframework/downloads/updates/default.aspx.\n\n!!!!Solaris issues\n\n* mconf doesn't work well - some manual tweaking is required for string values.\n* GNU make is required and needs to be in $PATH.\n* To get swig's library dependencies to work (and for the C library to be found), I needed to type:\n\n{{indent{{{{&gt; export LD_LIBRARY_PATH=/usr/local/gcc-3.3.1/lib:.}}}\n\n!!!!Cygwin issues\n\n* The bindings all compile but don't run under Cygwin with the exception of Perl. This is due to win32 executables being incompatible with Cygwin libraries.\n\n</div>
++<div tiddler="SiteSubtitle" modifier="CameronRich" modified="200702240025" created="200702240025" tags="">changes, notes and errata</div>
++<div tiddler="SiteTitle" modifier="CameronRich" modified="200702240023" created="200702240023" tags="">axTLS Embedded SSL</div>
++<div tiddler="SiteUrl" modifier="CameronRich" modified="200702240025" created="200702240025" tags="">http://axtls.cerocclub.com.au</div>
++<div tiddler="StyleSheet" modifier="CameronRich" modified="200702250600" created="200701122350" tags="DevFireTheme">/***\nhttp://tiddlystyles.com/#theme:DevFire\nAuthor: Clint Checketts\n***/\n\n/*{{{*/\nbody {\nbackground: #000;\n}\n/*}}}*/\n/***\n!Link styles /% ============================================================= %/\n***/\n/*{{{*/\na,\na.button,\n#mainMenu a.button,\n#sidebarOptions .sliderPanel a{\n color: #ffbf00;\n border: 0;\n background: transparent;\n}\n\na:hover,\na.button:hover,\n#mainMenu a.button:hover,\n#sidebarOptions .sliderPanel a:hover\n#sidebarOptions .sliderPanel a:active{\n color: #ff7f00;\n border: 0;\n border-bottom: #ff7f00 1px dashed;\n background: transparent;\n text-decoration: none;\n}\n\n#displayArea .button.highlight{\n color: #ffbf00;\n background: #4c4c4c;\n}\n/*}}}*/\n/***\n!Header styles /% ============================================================= %/\n***/\n/*{{{*/\n.header{\n border-bottom: 2px solid #ffbf00;\n color: #fff;\n}\n\n.headerForeground a {\n color: #fff;\n}\n\n.header a:hover {\n border-bottom: 1px dashed #fff;\n}\n/*}}}*/\n/***\n!Main menu styles /% ============================================================= %/\n***/\n/*{{{*/\n#mainMenu {color: #fff;}\n#mainMenu h1{\n font-size: 1.1em;\n}\n#mainMenu li,#mainMenu ul{\n list-style: none;\n margin: 0;\n padding: 0;\n}\n/*}}}*/\n/***\n!Sidebar styles /% ============================================================= %/\n***/\n/*{{{*/\n#sidebar {\n right: 0;\n color: #fff;\n border: 2px solid #ffbf00;\n border-width: 0 0 2px 2px;\n}\n#sidebarOptions {\n background-color: #4c4c4c;\n padding: 0;\n}\n\n#sidebarOptions a{\n margin: 0;\n color: #ffbf00;\n border: 0;\n}\n#sidebarOptions a:hover {\n color: #4c4c4c;\n background-color: #ffbf00;\n\n}\n\n#sidebarOptions a:active {\n color: #ffbf00;\n background-color: transparent;\n}\n\n#sidebarOptions .sliderPanel {\n background-color: #333;\n margin: 0;\n}\n\n#sidebarTabs {background-color: #4c4c4c;}\n#sidebarTabs .tabSelected {\n padding: 3px 3px;\n cursor: default;\n color: #ffbf00;\n background-color: #666;\n}\n#sidebarTabs .tabUnselected {\n color: #ffbf00;\n background-color: #5f5f5f;\n padding: 0 4px;\n}\n\n#sidebarTabs .tabUnselected:hover,\n#sidebarTabs .tabContents {\n background-color: #666;\n}\n\n.listTitle{color: #FFF;}\n#sidebarTabs .tabContents a{\n color: #ffbf00;\n}\n\n#sidebarTabs .tabContents a:hover{\n color: #ff7f00;\n background: transparent;\n}\n\n#sidebarTabs .txtMoreTab .tabSelected,\n#sidebarTabs .txtMoreTab .tab:hover,\n#sidebarTabs .txtMoreTab .tabContents{\n color: #ffbf00;\n background: #4c4c4c;\n}\n\n#sidebarTabs .txtMoreTab .tabUnselected {\n color: #ffbf00;\n background: #5f5f5f;\n}\n\n.tab.tabSelected, .tab.tabSelected:hover{color: #ffbf00; border: 0; background-color: #4c4c4c;cursor:default;}\n.tab.tabUnselected {background-color: #666;}\n.tab.tabUnselected:hover{color:#ffbf00; border: 0;background-color: #4c4c4c;}\n.tabContents {\n background-color: #4c4c4c;\n border: 0;\n}\n.tabContents .tabContents{background: #666;}\n.tabContents .tabSelected{background: #666;}\n.tabContents .tabUnselected{background: #5f5f5f;}\n.tabContents .tab:hover{background: #666;}\n/*}}}*/\n/***\n!Message area styles /% ============================================================= %/\n***/\n/*{{{*/\n#messageArea {background-color: #666; color: #fff; border: 2px solid #ffbf00;}\n#messageArea a:link, #messageArea a:visited {color: #ffbf00; text-decoration:none;}\n#messageArea a:hover {color: #ff7f00;}\n#messageArea a:active {color: #ff7f00;}\n#messageArea .messageToolbar a{\n border: 1px solid #ffbf00;\n background: #4c4c4c;\n}\n/*}}}*/\n/***\n!Popup styles /% ============================================================= %/\n***/\n/*{{{*/\n.popup {color: #fff; background-color: #4c4c4c; border: 1px solid #ffbf00;}\n.popup li.disabled{color: #fff;}\n.popup a {color: #ffbf00; }\n.popup a:hover { background: transparent; color: #ff7f00; border: 0;}\n.popup hr {color: #ffbf00; background: #ffbf00;}\n/*}}}*/\n/***\n!Tiddler Display styles /% ============================================================= %/\n***/\n/*{{{*/\n.title{color: #fff;}\nh1, h2, h3, h4, h5 {\n color: #fff;\n background-color: transparent;\n border-bottom: 1px solid #333;\n}\n\n.subtitle{\n color: #666;\n}\n\n.viewer {color: #fff; }\n\n.viewer table{background: #666; color: #fff;}\n\n.viewer th {background-color: #996; color: #fff;}\n\n.viewer pre, .viewer code {color: #ddd; background-color: #4c4c4c; border: 1px solid #ffbf00;}\n\n.viewer hr {color: #666;}\n\n.tiddler .button {color: #4c4c4c;}\n.tiddler .button:hover { color: #ffbf00; background-color: #4c4c4c;}\n.tiddler .button:active {color: #ffbf00; background-color: #4c4c4c;}\n\n.toolbar {\n color: #4c4c4c;\n}\n\n.toolbar a.button,\n.toolbar a.button:hover,\n.toolbar a.button:active,\n.editorFooter a{\n border: 0;\n}\n\n.footer {\n color: #ddd;\n}\n\n.selected .footer {\n color: #888;\n}\n\n.highlight, .marked {\n color: #000;\n background-color: #ffe72f;\n}\n.editorFooter {\n color: #aaa;\n}\n\n.tab{\n-moz-border-radius-topleft: 3px;\n-moz-border-radius-topright: 3px;\n}\n\n.tagging,\n.tagged{\n background: #4c4c4c;\n border: 1px solid #4c4c4c; \n}\n\n.selected .tagging,\n.selected .tagged{\n background-color: #333;\n border: 1px solid #ffbf00;\n}\n\n.tagging .listTitle,\n.tagged .listTitle{\n color: #fff;\n}\n\n.tagging .button,\n.tagged .button{\n color: #ffbf00;\n border: 0;\n padding: 0;\n}\n\n.tagging .button:hover,\n.tagged .button:hover{\nbackground: transparent;\n}\n\n.selected .isTag .tagging.simple,\n.selected .tagged.simple,\n.isTag .tagging.simple,\n.tagged.simple {\n float: none;\n display: inline;\n border: 0;\n background: transparent;\n color: #fff;\n margin: 0;\n}\n\n.cascade {\n background: #4c4c4c;\n color: #ddd;\n border: 1px solid #ffbf00;\n}\n/*}}}*/</div>
++<div tiddler="axhttpd" modifier="YourName" modified="200804011308" created="200702242231" tags="">axhttpd is a small embedded web server using the axTLS library. It is based originally on the web server written by Doug Currie which is at http://www.hcsw.org/awhttpd.\n\n!@@bgcolor(#ff0000):color(#ffffff):axhttpd Features@@ \n\n!!__Basic Authentication__\n\nBasic Authentication uses a password file called &quot;.htpasswd&quot;, in the directory to be protected. This file is formatted as the familiar colon-separated username/encrypted-password pair, records delimited by newlines. The protection does not carry over to subdirectories. The utility program htpasswd is included to help manually edit .htpasswd files.\n\nThe encryption of this password uses a proprietary algorithm due to the dependency of many crypt libraries on DES. An example is in [[/test_dir/no_http|https://127.0.0.1/test_dir/no_http]] (username 'abcd', password is '1234').\n\n//Note: This is an mconf enabled configuration option.//\n\n!!__SSL Protection__\n\nDirectories/files can be accessed using the 'http' or 'https' uri prefix. If normal http access for a directory needs to be disabled, then put &quot;~SSLRequireSSL&quot; into a '.htaccess' file in the directory to be protected. \n\nConversely, use &quot;~SSLDenySSL&quot; to deny access to directories via SSL.\n\nAn example is in [[/test_dir/no_http|http://127.0.0.1/test_dir/no_http]] and [[/test_dir/no_ssl|https://127.0.0.1/test_dir/no_ssl]].\n\nEntire directories can be denied access with a &quot;Deny all&quot; directive (regardless of SSL or authentication). An example is in [[/test_dir/bin|http://127.0.0.1/test_dir/bin]]\n\n!!__CGI__\n\nMost of the CGI 1.1 variables are now placed into the script environment and should work as normal.\n\n!!__Lua and Lua Pages__\n\nThis is a small scripting language gaining popularity in embedded applications due to its small footprint and fast speed.\n\nLua has been incorporated into the build, so simply select it and it will automatically install. Try pointing your browser at [[test_main.html]|http://127.0.0.1/lua/test_main.html]] to see an example of Lua Pages.\n\n//Note: This is an mconf enabled configuration option.//\n\n!!__Directory Listing__\n\nAn mconf option. Allow the files in directories to be displayed. An example is in [[/test_dir|http://127.0.0.1/test_dir]]\n\n!!__Other Features__\n\n* Timeout - HTTP 1.1 allows for persistent connections. This is the time allowed for this connection in seconds.\n* Daemon - Puts the process in daemon mode. \n* SSL session cache size - The size of the session cache (a heavily loaded server should maintain many sessions). A session will save on expensive SSL handshaking.\n\n</div>
++</div>
++<!--POST-BODY-START-->
++
++<!--POST-BODY-END-->
++ </body>
++</html>
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/download.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/download.lua
+new file mode 100644
+index 0000000..2ee1a71
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/download.lua
+@@ -0,0 +1,75 @@
++#!/usr/local/bin/lua
++
++require"luasocket"
++
++function receive (connection)
++ connection:settimeout(0)
++ local s, status = connection:receive (2^10)
++ if status == "timeout" then
++ coroutine.yield (connection)
++ end
++ return s, status
++end
++
++function download (host, file, outfile)
++ --local f = assert (io.open (outfile, "w"))
++ local c = assert (socket.connect (host, 80))
++ c:send ("GET "..file.." HTTP/1.0\r\n\r\n")
++ while true do
++ local s, status = receive (c)
++ --f:write (s)
++ if status == "closed" then
++ break
++ end
++ end
++ c:close()
++ --f:close()
++end
++
++local threads = {}
++function get (host, file, outfile)
++ print (string.format ("Downloading %s from %s to %s", file, host, outfile))
++ local co = coroutine.create (function ()
++ return download (host, file, outfile)
++ end)
++ table.insert (threads, co)
++end
++
++function dispatcher ()
++ while true do
++ local n = table.getn (threads)
++ if n == 0 then
++ break
++ end
++ local connections = {}
++ for i = 1, n do
++ local status, res = coroutine.resume (threads[i])
++ if not res then
++ table.remove (threads, i)
++ break
++ else
++ table.insert (connections, res)
++ end
++ end
++ if table.getn (connections) == n then
++ socket.select (connections)
++ end
++ end
++end
++
++local url = arg[1]
++if not url then
++ print (string.format ("usage: %s url [times]", arg[0]))
++ os.exit()
++end
++local times = arg[2] or 5
++
++url = string.gsub (url, "^http.?://", "")
++local _, _, host, file = string.find (url, "^([^/]+)(/.*)")
++local _, _, fn = string.find (file, "([^/]+)$")
++
++for i = 1, times do
++ get (host, file, fn..i)
++end
++
++dispatcher ()
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/env.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/env.lua
+new file mode 100644
+index 0000000..c429847
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/env.lua
+@@ -0,0 +1,26 @@
++-- This file should be executed before any script in this directory
++-- according to the configuration (cgilua/conf.lua).
++
++pcall (cgilua.enablesession)
++
++local put, mkurlpath = cgilua.put, cgilua.mkurlpath
++
++cgilua.addclosefunction (function ()
++ put [[
++<p>
++<small>
++<a href="test_main.html">Main</a>]]
++ for _, test in {
++ { "Get", "test_main.lua", {ab = "cd", ef = "gh"} },
++ { "Cookies", "test_cookies.lua", },
++ { "FileSystem", "test_fs.lua", },
++ { "Libraries", "test_lib.lua", },
++ { "Session", "test_session.lua", },
++ { "Variables", "test_variables.lp", },
++ } do
++ put (string.format (' &middot; <a href="%s">%s</a>',
++ mkurlpath (test[2], test[3]), test[1]))
++ end
++ put [[
++</small>]]
++end)
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/overview.lp b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/overview.lp
+new file mode 100644
+index 0000000..4d17002
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/overview.lp
+@@ -0,0 +1,64 @@
++<?lua
++-- Tries to load known libraries
++for _, t in ipairs { "lxp", "luasql.postgres", "luasql.mysql", "luasql.oci8", "luasql.sqlite", "luasql.odbc", "socket", "xmlrpc", "soap", "lualdap", "logging", "md5", "zip", "stable", "copas", } do
++ pcall (require, t)
++end
++
++libraries = { "lxp", "luasql", "socket", "xmlrpc", "soap", "lualdap", "logging", "md5", "zip", "stable", "copas", }
++
++local colors = { "#999999", "#CCCCCC", "#FFFFFF", }
++local i = 0
++function color () i = math.mod (i + 1, 3) return colors[i + 1] end
++
++function pack_name (p) return string.gsub (p, "^([^.]+).-", "%1") end
++
++function idx (t, f) return _G[t][f] or _G[t]["_"..f] or "" end
++?>
++<html>
++<head><title>CGILua installation overview</title></head>
++
++<body bgcolor="#FFFFFF">
++<h1>CGILua installation overview</h1>
++
++<table>
++ <tr>
++ <th bgcolor="#999999">Version
++ <th bgcolor="#999999">Copyright
++ <th bgcolor="#999999">Description
++ </tr>
++<?lua
++local support = {
++ { "Lua", "_VERSION" },
++ { "compat-5.1", "_COMPAT51" },
++}
++for _, l in ipairs (support) do bg = color()
++?>
++ <tr>
++ <td bgcolor = "<%= bg %>"><%= tostring(_G[l[2]]) %>
++ <td bgcolor = "<%= bg %>">
++ <td bgcolor = "<%= bg %>">
++ </tr>
++<? end ?>
++ <tr><td colspan="4"></tr>
++<?lua
++local pack = {}
++for i, p in ipairs (libraries) do
++ local s = _G[p]
++ local n = pack_name(p)
++ if type(_G[n]) == "table" and _G[n]._VERSION then
++ pack[n] = true
++ table.insert (pack, n)
++ end
++end
++table.sort (pack)
++for _, p in ipairs (pack) do bg = color() ?>
++ <tr>
++ <td bgcolor = "<%= bg %>"><%= idx(p,"VERSION") %>
++ <td bgcolor = "<%= bg %>"><small><%= idx(p,"COPYRIGHT") %></small>
++ <td bgcolor = "<%= bg %>"><small><%= idx(p,"DESCRIPTION") %></small>
++ </tr>
++<?lua end ?>
++</table>
++
++</body>
++</html>
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/prepara_sql2.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/prepara_sql2.lua
+new file mode 100644
+index 0000000..6a37c2f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/prepara_sql2.lua
+@@ -0,0 +1,31 @@
++#!/usr/local/bin/lua
++
++MAX_ROWS = arg[1] or 10
++
++require"postgres"
++
++local env = assert (luasql.postgres ())
++local conn = assert (env:connect ("luasql-test", "tomas"))
++
++-- Apaga restos de outros testes.
++conn:execute "drop table t2"
++conn:execute "drop table t1"
++
++-- Criando as tabelas.
++assert (conn:execute [[create table t1 (
++ a int,
++ b int
++)]])
++assert (conn:execute [[create table t2 (
++ c int,
++ d int
++)]])
++
++-- Preenchedo as tabelas.
++for i = 1, MAX_ROWS do
++ local ii = 2*i
++ assert (conn:execute (string.format ([[
++insert into t1 values (%d, %d);
++insert into t2 values (%d, %d);]],
++ ii, i, ii, i)))
++end
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_conc.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_conc.lua
+new file mode 100644
+index 0000000..bbb9be7
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_conc.lua
+@@ -0,0 +1,38 @@
++cgilua.htmlheader()
++if ap then
++ local pid, ppid = ap.pid ()
++ if not ppid then
++ ppid = "no parent pid"
++ end
++ cgilua.put ("pid = "..pid.." ("..ppid..")".."\n")
++end
++
++assert(type(stable.get) == "function")
++assert(type(stable.set) == "function")
++
++cgilua.put"stable.pairs = {<br>\n"
++for i, v in stable.pairs () do
++ cgilua.put (i.." = "..tostring(v).."<br>\n")
++end
++cgilua.put"}<br>\n"
++
++local counter = stable.get"counter" or 0
++stable.set ("counter", counter + 1)
++
++local f = stable.get"f"
++if not f then
++ local d = os.date()
++ stable.set ("f", function () return d end)
++else
++ cgilua.put ("f() = "..tostring (f ()))
++end
++
++cgilua.put"<br>\n"
++for i = 1,800 do
++ cgilua.put (i)
++ for ii = 1,1000 do
++ cgilua.put ("<!>")
++ end
++ cgilua.put ("\n")
++end
++cgilua.put ("End")
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lp b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lp
+new file mode 100644
+index 0000000..932b9c5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lp
+@@ -0,0 +1,13 @@
++<?lua
++local cookies = require"cgilua.cookies"
++CL_COOKIE = "cgilua_cookie"
++
++local test = cookies.get (CL_COOKIE)
++cookies.sethtml (CL_COOKIE, os.date())
++?>
++
++<h1>Testing Cookies library</h1>
++
++<%= CL_COOKIE%> = <%= tostring(test)%><br>
++Assigning current date to cookie!<br>
++Reload this script to check cookie's value!
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lua
+new file mode 100644
+index 0000000..6af935e
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lua
+@@ -0,0 +1,14 @@
++local cookies = require"cgilua.cookies"
++CL_COOKIE = "cgilua_cookie"
++
++local test = cookies.get (CL_COOKIE)
++cookies.set (CL_COOKIE, os.date())
++
++cgilua.htmlheader ()
++cgilua.put ([[
++<h1>Testing Cookies library</h1>
++
++]]..CL_COOKIE..' = '..tostring(test)..[[<br>
++Assigning current date to cookie!<br>
++Reload this script to check cookie's value!
++]])
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_err.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_err.lua
+new file mode 100644
+index 0000000..4d6ffc9
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_err.lua
+@@ -0,0 +1,4 @@
++cgilua.htmlheader()
++cgilua.put"Oi!"
++--io.write"something\n"
++cgilua.errorlog ("eca", "emerg")
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_fs.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_fs.lua
+new file mode 100644
+index 0000000..566ed8b
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_fs.lua
+@@ -0,0 +1,23 @@
++function link_dir (dir, base)
++ local path = base.."/"..dir
++ local mode = lfs.attributes (path).mode
++ if mode == "directory" then
++ return string.format ('<a href="%s">%s</a>',
++ cgilua.mkurlpath ("test_fs.lua", { dir = path }),
++ dir)
++ else
++ return dir
++ end
++end
++
++cgilua.htmlheader ()
++cgilua.put ("<h1>Testing Filesystem library</h1>\n")
++cgilua.put ("<table>\n")
++cgilua.put ("<tr><td colspan=2>Testing <b>dir</b></td></tr>\n")
++local i = 0
++local dir = cgi.dir or "."
++for file in lfs.dir (dir) do
++ i = i+1
++ cgilua.put ("<tr><td>"..i.."</td><td>"..link_dir(file, dir).."</td></tr>\n")
++end
++cgilua.put ("</table>\n")
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_htk.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_htk.lua
+new file mode 100644
+index 0000000..ac1de6c
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_htk.lua
+@@ -0,0 +1,22 @@
++require"htk"
++
++local a_table = {}
++for i = 1, 20 do
++ local l = {}
++ for j = 1, 20 do
++ table.insert (l, HTK.TD { "cell "..i..","..j })
++ end
++ table.insert (a_table, HTK.TR (l))
++end
++
++cgilua.htmlheader()
++cgilua.put (HTK.HTML {
++ HTK.HEAD { HTK.TITLE { "Titulo da Pagina" } },
++ HTK.BODY {
++ bgcolor = "#FFFFFF",
++ HTK.H1 { "Titulo da Pagina" },
++ HTK.P {},
++ "Uma página qualquer",
++ HTK.TABLE (a_table),
++ }
++})
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_lib.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_lib.lua
+new file mode 100644
+index 0000000..5041253
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_lib.lua
+@@ -0,0 +1,31 @@
++local function getfield (t, f)
++ for w in string.gfind(f, "[%w_]+") do
++ if not t then return nil end
++ t = t[w]
++ end
++ return t
++end
++
++function test_lib (libname)
++ local ok, err = pcall (require, libname)
++ if not ok then
++ cgilua.put ("Library <tt><b>"..libname.."</b></tt> not found<br>\n"..
++ err)
++ else
++ cgilua.put ("Library <tt><b>"..libname.."</b></tt><br>\n")
++ local t = getfield (_G, libname)
++ if type(t) ~= "table" then
++ cgilua.put (tostring(t))
++ else
++ for i, v in pairs (t) do
++ cgilua.put ("&nbsp;&nbsp;"..tostring(i).." = "..tostring(v).."<br>\n")
++ end
++ end
++ end
++ cgilua.put ("\n<p>\n")
++end
++
++cgilua.htmlheader ()
++for _, lib in ipairs { "lfs", "socket", "luasql.postgres", "luasql", "lxp", "lxp.lom", "lualdap", "htk", "xmlrpc", "xmlrpc.http" } do
++ test_lib (lib)
++end
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.html b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.html
+new file mode 100644
+index 0000000..a50dd63
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.html
+@@ -0,0 +1,127 @@
++<html>
++<head><title>Test Page</title></head>
++
++<table border>
++ <tr>
++ <th colspan="4"> GET: </td>
++ </tr>
++ <tr>
++ <td>Lua script</td>
++ <td><a href="test_main.lua?field1=ab&field2=cd&field1=ef">module</a></td>
++ </tr>
++ <tr>
++ <td>HTML template</td>
++ <td><a href="test_main.lp?field1=ab&field2=cd&field1=ef">module</a></td>
++ </tr>
++
++ <tr>
++ <th colspan="4"> POST: </td>
++ </tr>
++ <tr>
++ <td colspan="4">
++ <form method="POST" action="">
++ <table>
++ <tr>
++ <td colspan="4">
++ field 1: <input type="text" name="field1"><br>
++ field 2: <input type="text" name="field2"><br>
++ field 3:
++ <input type="checkbox" name="field3" value="op 1">op 1
++ <input type="checkbox" name="field3" value="op 2">op 2
++ <input type="checkbox" name="field3" value="op 3">op 3
++ </td>
++ </tr>
++ <tr>
++ <td>Lua script</td>
++ <td>
++ <a href="javascript:document.forms[0].action='test_main.lua';document.forms[0].submit()">module</a>
++ </td>
++ </tr>
++ <tr>
++ <td>HTML template</td>
++ <td>
++ <a href="javascript:document.forms[0].action='test_main.lp';document.forms[0].submit()">module</a>
++ </td>
++ </tr>
++ </table>
++ </form>
++ </td>
++ </tr>
++
++ <tr>
++ <th colspan="4"> POST (with upload): </td>
++ </tr>
++ <tr>
++ <td colspan="4">
++ <form method="POST" enctype="multipart/form-data" action="">
++ <table>
++ <tr>
++ <td colspan="4">
++ field 1: <input type="text" name="field1"><br>
++ file (binary!): <input type="file" name="file"><br>
++ </td>
++ </tr>
++ <tr>
++ <td>Lua script</td>
++ <td>
++ <a href="javascript:document.forms[1].action='test_main.lua';document.forms[1].submit()">module</a>
++ </td>
++ </tr>
++ <tr>
++ <td>HTML template</td>
++ <td>
++ <a href="javascript:document.forms[1].action='test_main.lp';document.forms[1].submit()">module</a>
++ </td>
++ </tr>
++ </table>
++ </form>
++ </td>
++ </tr>
++ <tr>
++ <th colspan="4"> Cookies: </td>
++ </tr>
++ <tr>
++ <td>Lua script</td>
++ <td><a href="test_cookies.lua">module</a></td>
++ </tr>
++ <tr>
++ <td>HTML template</td>
++ <td><a href="test_cookies.lp">module</a></td>
++ </tr>
++ <tr>
++ <th colspan="4"> Filesystem: </td>
++ </tr>
++ <tr>
++ <td>Lua script</td>
++ <td><a href="test_fs.lua">module</a></td>
++ </tr>
++ <tr>
++ <th colspan="4"> Session: </td>
++ </tr>
++ <tr>
++ <td>Lua script</td>
++ <td><a href="test_session.lua">module</a></td>
++ </tr>
++ <tr>
++ <th colspan="4"> CGI Variables: </td>
++ </tr>
++ <tr>
++ <td>HTML template</td>
++ <td><a href="test_variables.lp">module</a></td>
++ </tr>
++ <tr>
++ <th colspan="4"> Library Overview: </td>
++ </tr>
++ <tr>
++ <td>HTML template</td>
++ <td><a href="overview.lp">module</a></td>
++ </tr>
++ <tr>
++ <th colspan="4"> Concurrency </td>
++ </tr>
++ <tr>
++ <td>Lua script</td>
++ <td><a href="test_conc.lua">module</a></td>
++ </tr>
++</table>
++</html>
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lp b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lp
+new file mode 100644
+index 0000000..917ee1e
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lp
+@@ -0,0 +1,31 @@
++<html>
++<head><title>Embeded Lua Test</title></head>
++
++<body>
++cgi = {
++<?lua
++for i,v in pairs (cgi) do
++ if type(v) == "table" then
++ local vv = "{"
++ for a,b in pairs(v) do
++ vv = string.format ("%s%s = %s<br>\n", vv, a, tostring(b))
++ end
++ v = vv.."}"
++ end
++?>
++<%= i %> = <%= tostring(v) %> <br>
++<%
++end
++%>
++}
++<br>
++Remote address: <%= cgilua.servervariable"REMOTE_ADDR" %>
++<br>
++Is persistent = <%= tostring (SAPI.Info.ispersistent) %>
++<br>
++ap = <?lua= tostring(ap) ?> <br>
++lfcgi = <% = tostring(lfcgi) %> <br>
++<%= (ap and ap.handler()) or "" %> <br>
++
++</body>
++</html>
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lua
+new file mode 100644
+index 0000000..0e997a2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lua
+@@ -0,0 +1,46 @@
++cgilua.htmlheader()
++cgilua.put[[
++<html>
++<head><title>Script Lua Test</title></head>
++
++<body>
++cgi = {
++]]
++
++for i,v in pairs (cgi) do
++ if type(v) == "table" then
++ local vv = "{"
++ for a,b in pairs(v) do
++ vv = string.format ("%s%s = %s<br>\n", vv, a, tostring(b))
++ end
++ v = vv.."}"
++ end
++ cgilua.put (string.format ("%s = %s<br>\n", i, tostring(v)))
++end
++cgilua.put "}<br>\n"
++cgilua.put ("Remote address: "..cgilua.servervariable"REMOTE_ADDR")
++cgilua.put "<br>\n"
++cgilua.put ("Is persistent = "..tostring (SAPI.Info.ispersistent).."<br>\n")
++cgilua.put ("ap="..tostring(ap).."<br>\n")
++cgilua.put ("lfcgi="..tostring(lfcgi).."<br>\n")
++
++-- Checking Virtual Environment
++local my_output = cgilua.put
++cgilua.put = nil
++local status, err = pcall (function ()
++ assert (cgilua.put == nil, "cannot change cgilua.put value")
++end)
++cgilua.put = my_output
++assert (status == true, err)
++
++-- Checking require
++local status, err = pcall (function () require"unknown_module" end)
++assert (status == false, "<tt>unknown_module</tt> loaded!")
++-- assert (package == nil, "Access to <tt>package</tt> table allowed!")
++
++cgilua.put[[
++<p>
++</body>
++</html>
++]]
++cgilua = nil
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_session.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_session.lua
+new file mode 100644
+index 0000000..d97cc45
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_session.lua
+@@ -0,0 +1,43 @@
++cgilua.enablesession ()
++
++function pt (tab)
++ for i, v in pairs (tab) do
++ local vv = v
++ if type(v) == "table" then
++ vv = ""
++ for _i, _v in pairs (v) do
++ vv = vv..string.format ("%s = %q, ", _i, _v)
++ end
++ vv = '{'..vv..'}'
++ end
++ cgilua.put (string.format ("%s = %s<br>\n", tostring (i), tostring (vv)))
++ end
++end
++
++
++if cgi.field then
++ if not cgilua.session.data.field then
++ cgilua.session.data.field = {}
++ end
++ table.insert (cgilua.session.data.field, cgi.field)
++end
++cgilua.htmlheader()
++if cgilua.session then
++ cgilua.put "cgi = {<br>\n"
++ pt (cgi)
++ cgilua.put "}<br>\n"
++ cgilua.put "cgilua.session.data = {<br>\n"
++ pt (cgilua.session.data)
++ cgilua.put "}<br>\n"
++
++ cgilua.put [[<form action="]]
++ cgilua.put (cgilua.mkurlpath"test_session.lua")
++ cgilua.put [[" method="POST">
++ field: <input type="text" name="field" value="]]
++ cgilua.put (cgi.field or "")
++ cgilua.put [["><br>
++ <input type="submit"><br>
++</form>]]
++else
++ cgilua.put "Sessions library is not available or not well configured"
++end
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql.lua
+new file mode 100644
+index 0000000..085ce97
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql.lua
+@@ -0,0 +1,13 @@
++local s = require"luasql.postgres"
++
++local env = assert (luasql.postgres ())
++local conn = assert (env:connect ("luasql-test", "tomas"))
++local cur = assert (conn:execute ("select count(*) from fetch_test"))
++
++cgilua.htmlheader()
++cgilua.put ("Total lines at table fetch_test is "..cur:fetch())
++cgilua.put (string.format ("<br>\n%s == %s<br>\n", tostring(s), tostring(luasql)))
++
++cur:close()
++conn:close()
++env:close()
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql2.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql2.lua
+new file mode 100644
+index 0000000..a2f6ee1
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql2.lua
+@@ -0,0 +1,24 @@
++require"postgres"
++
++local env = assert (luasql.postgres ())
++local conn = assert (env:connect ("luasql-test", "tomas"))
++local cur = assert (conn:execute ("select count(*) from t1"))
++local total = tonumber (cur:fetch())
++cur:close()
++local aleatorio = math.random(total)
++local cur = assert (conn:execute ("select * from t1, t2 where b = d and a != "..2*aleatorio))
++
++cgilua.htmlheader()
++cgilua.put ("Aleatorio = "..aleatorio.."<br>\n")
++
++local a,b,c,d = cur:fetch()
++cgilua.put ("<table>\n")
++while a do
++-- cgilua.put ("<tr><td>",a,"<td>",b,"<td>",c,"<td>",d,"</tr>")
++ a,b,c,d = cur:fetch()
++end
++cgilua.put ("</table>\n")
++
++cur:close()
++conn:close()
++env:close()
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_variables.lp b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_variables.lp
+new file mode 100644
+index 0000000..c1ac332
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_variables.lp
+@@ -0,0 +1,14 @@
++<table>
++<% for _, var in pairs { "SERVER_SOFTWARE", "SERVER_NAME", "GATEWAY_INTERFACE", "SERVER_PROTOCOL", "SERVER_PORT", "REQUEST_METHOD", "PATH_INFO", "PATH_TRANSLATED", "SCRIPT_NAME", "QUERY_STRING", "REMOTE_HOST", "REMOTE_ADDR", "AUTH_TYPE", "REMOTE_USER", "REMOTE_IDENT", "CONTENT_TYPE", "CONTENT_LENGTH", "HTTP_REFERER", "HTTP_COOKIE", "SCRIPT_FILENAME", "DOCUMENT_ROOT", } do %>
++ <tr><td><%= var %><td>=<td>"<%= cgilua.servervariable(var) or "<i>not defined</i>"%>"</tr>
++<% end %>
++</table>
++
++<p>
++<table>
++<% for _, var in ipairs { "script_file", "script_path", "script_pdir", "script_vdir", "script_vpath", "urlpath", } do %>
++ <tr><td><%= var %><td>=<td>"<%= cgilua[var] %>"</tr>
++<% end %>
++</table>
++
++<p>
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/bin/.htaccess b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/bin/.htaccess
+new file mode 100644
+index 0000000..8fd8c46
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/bin/.htaccess
+@@ -0,0 +1 @@
++Deny all
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htaccess b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htaccess
+new file mode 100644
+index 0000000..3e20076
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htaccess
+@@ -0,0 +1 @@
++SSLRequireSSL
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htpasswd b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htpasswd
+new file mode 100644
+index 0000000..0471b01
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htpasswd
+@@ -0,0 +1,2 @@
++abcd:CQhgDPyy0rvEU8OMxnQIvg==$YdJfIKZimFLYxPf/rbnhtQ==
++yaya:Syuss5jE2FNGVdr0kKGoHg==$WLw/SgHZFuAoOuml3GTJVw==
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/index.html b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/index.html
+new file mode 100644
+index 0000000..8b86eba
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/index.html
+@@ -0,0 +1,6 @@
++<html>
++<head><title>axhttpd is running</title></head>
++<body>
++Looks like you got to this directory.
++</body>
++</html>
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/.htaccess b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/.htaccess
+new file mode 100644
+index 0000000..d980d26
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/.htaccess
+@@ -0,0 +1 @@
++SSLDenySSL
+diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/index.html b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/index.html
+new file mode 100644
+index 0000000..8b86eba
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/index.html
+@@ -0,0 +1,6 @@
++<html>
++<head><title>axhttpd is running</title></head>
++<body>
++Looks like you got to this directory.
++</body>
++</html>
+diff --git a/feeds/luci/libs/luci-lib-nixio/axtls-config/.config b/feeds/luci/libs/luci-lib-nixio/axtls-config/.config
+new file mode 100644
+index 0000000..46cd061
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axtls-config/.config
+@@ -0,0 +1,112 @@
++#
++# Automatically generated make config: don't edit
++#
++HAVE_DOT_CONFIG=y
++CONFIG_PLATFORM_LINUX=y
++# CONFIG_PLATFORM_CYGWIN is not set
++# CONFIG_PLATFORM_WIN32 is not set
++
++#
++# General Configuration
++#
++PREFIX="/usr"
++# CONFIG_DEBUG is not set
++CONFIG_STRIP_UNWANTED_SECTIONS=y
++# CONFIG_VISUAL_STUDIO_7_0 is not set
++# CONFIG_VISUAL_STUDIO_8_0 is not set
++CONFIG_VISUAL_STUDIO_7_0_BASE=""
++CONFIG_VISUAL_STUDIO_8_0_BASE=""
++CONFIG_EXTRA_CFLAGS_OPTIONS="-fpic"
++CONFIG_EXTRA_LDFLAGS_OPTIONS=""
++
++#
++# SSL Library
++#
++# CONFIG_SSL_SERVER_ONLY is not set
++# CONFIG_SSL_CERT_VERIFICATION is not set
++# CONFIG_SSL_ENABLE_CLIENT is not set
++CONFIG_SSL_FULL_MODE=y
++# CONFIG_SSL_SKELETON_MODE is not set
++# CONFIG_SSL_PROT_LOW is not set
++CONFIG_SSL_PROT_MEDIUM=y
++# CONFIG_SSL_PROT_HIGH is not set
++# CONFIG_SSL_USE_DEFAULT_KEY is not set
++CONFIG_SSL_PRIVATE_KEY_LOCATION="/etc/nixio/rsa_main.der"
++CONFIG_SSL_PRIVATE_KEY_PASSWORD=""
++CONFIG_SSL_X509_CERT_LOCATION=""
++# CONFIG_SSL_GENERATE_X509_CERT is not set
++CONFIG_SSL_X509_COMMON_NAME=""
++CONFIG_SSL_X509_ORGANIZATION_NAME=""
++CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME=""
++# CONFIG_SSL_ENABLE_V23_HANDSHAKE is not set
++# CONFIG_SSL_HAS_PEM is not set
++# CONFIG_SSL_USE_PKCS12 is not set
++CONFIG_SSL_EXPIRY_TIME=24
++CONFIG_X509_MAX_CA_CERTS=4
++CONFIG_SSL_MAX_CERTS=2
++CONFIG_SSL_CTX_MUTEXING=y
++CONFIG_USE_DEV_URANDOM=y
++# CONFIG_WIN32_USE_CRYPTO_LIB is not set
++# CONFIG_OPENSSL_COMPATIBLE is not set
++# CONFIG_PERFORMANCE_TESTING is not set
++# CONFIG_SSL_TEST is not set
++# CONFIG_AXHTTPD is not set
++# CONFIG_HTTP_STATIC_BUILD is not set
++CONFIG_HTTP_PORT=0
++CONFIG_HTTP_HTTPS_PORT=0
++CONFIG_HTTP_SESSION_CACHE_SIZE=0
++CONFIG_HTTP_WEBROOT=""
++CONFIG_HTTP_TIMEOUT=0
++# CONFIG_HTTP_HAS_CGI is not set
++CONFIG_HTTP_CGI_EXTENSIONS=""
++# CONFIG_HTTP_ENABLE_LUA is not set
++CONFIG_HTTP_LUA_PREFIX=""
++CONFIG_HTTP_LUA_CGI_LAUNCHER=""
++# CONFIG_HTTP_BUILD_LUA is not set
++# CONFIG_HTTP_DIRECTORIES is not set
++# CONFIG_HTTP_HAS_AUTHORIZATION is not set
++# CONFIG_HTTP_HAS_IPV6 is not set
++# CONFIG_HTTP_ENABLE_DIFFERENT_USER is not set
++CONFIG_HTTP_USER=""
++# CONFIG_HTTP_VERBOSE is not set
++# CONFIG_HTTP_IS_DAEMON is not set
++
++#
++# Language Bindings
++#
++# CONFIG_BINDINGS is not set
++# CONFIG_CSHARP_BINDINGS is not set
++# CONFIG_VBNET_BINDINGS is not set
++CONFIG_DOT_NET_FRAMEWORK_BASE=""
++# CONFIG_JAVA_BINDINGS is not set
++CONFIG_JAVA_HOME=""
++# CONFIG_PERL_BINDINGS is not set
++CONFIG_PERL_CORE=""
++CONFIG_PERL_LIB=""
++# CONFIG_LUA_BINDINGS is not set
++CONFIG_LUA_CORE=""
++
++#
++# Samples
++#
++# CONFIG_SAMPLES is not set
++# CONFIG_C_SAMPLES is not set
++# CONFIG_CSHARP_SAMPLES is not set
++# CONFIG_VBNET_SAMPLES is not set
++# CONFIG_JAVA_SAMPLES is not set
++# CONFIG_PERL_SAMPLES is not set
++# CONFIG_LUA_SAMPLES is not set
++
++#
++# BigInt Options
++#
++# CONFIG_BIGINT_CLASSICAL is not set
++# CONFIG_BIGINT_MONTGOMERY is not set
++CONFIG_BIGINT_BARRETT=y
++CONFIG_BIGINT_CRT=y
++# CONFIG_BIGINT_KARATSUBA is not set
++MUL_KARATSUBA_THRESH=0
++SQU_KARATSUBA_THRESH=0
++CONFIG_BIGINT_SLIDING_WINDOW=y
++CONFIG_BIGINT_SQUARE=y
++# CONFIG_BIGINT_CHECK_ON is not set
+diff --git a/feeds/luci/libs/luci-lib-nixio/axtls-config/config.h b/feeds/luci/libs/luci-lib-nixio/axtls-config/config.h
+new file mode 100644
+index 0000000..0f861f3
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/axtls-config/config.h
+@@ -0,0 +1,113 @@
++/*
++ * Automatically generated header file: don't edit
++ */
++
++#define HAVE_DOT_CONFIG 1
++#define CONFIG_PLATFORM_LINUX 1
++#undef CONFIG_PLATFORM_CYGWIN
++#undef CONFIG_PLATFORM_WIN32
++
++/*
++ * General Configuration
++ */
++#define PREFIX "/usr"
++#undef CONFIG_DEBUG
++#define CONFIG_STRIP_UNWANTED_SECTIONS 1
++#undef CONFIG_VISUAL_STUDIO_7_0
++#undef CONFIG_VISUAL_STUDIO_8_0
++#define CONFIG_VISUAL_STUDIO_7_0_BASE ""
++#define CONFIG_VISUAL_STUDIO_8_0_BASE ""
++#define CONFIG_EXTRA_CFLAGS_OPTIONS "-fpic"
++#define CONFIG_EXTRA_LDFLAGS_OPTIONS ""
++
++/*
++ * SSL Library
++ */
++#undef CONFIG_SSL_SERVER_ONLY
++#undef CONFIG_SSL_CERT_VERIFICATION
++#undef CONFIG_SSL_ENABLE_CLIENT
++#define CONFIG_SSL_FULL_MODE 1
++#undef CONFIG_SSL_SKELETON_MODE
++#undef CONFIG_SSL_PROT_LOW
++#define CONFIG_SSL_PROT_MEDIUM 1
++#undef CONFIG_SSL_PROT_HIGH
++#undef CONFIG_SSL_USE_DEFAULT_KEY
++#define CONFIG_SSL_PRIVATE_KEY_LOCATION "/etc/nixio/rsa_main.der"
++#define CONFIG_SSL_PRIVATE_KEY_PASSWORD ""
++#define CONFIG_SSL_X509_CERT_LOCATION ""
++#undef CONFIG_SSL_GENERATE_X509_CERT
++#define CONFIG_SSL_X509_COMMON_NAME ""
++#define CONFIG_SSL_X509_ORGANIZATION_NAME ""
++#define CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME ""
++#undef CONFIG_SSL_ENABLE_V23_HANDSHAKE
++#undef CONFIG_SSL_HAS_PEM
++#undef CONFIG_SSL_USE_PKCS12
++#define CONFIG_SSL_EXPIRY_TIME 24
++#define CONFIG_X509_MAX_CA_CERTS 4
++#define CONFIG_SSL_MAX_CERTS 2
++#define CONFIG_SSL_CTX_MUTEXING 1
++#define CONFIG_USE_DEV_URANDOM 1
++#undef CONFIG_WIN32_USE_CRYPTO_LIB
++#undef CONFIG_OPENSSL_COMPATIBLE
++#undef CONFIG_PERFORMANCE_TESTING
++#undef CONFIG_SSL_TEST
++#undef CONFIG_AXHTTPD
++#undef CONFIG_HTTP_STATIC_BUILD
++#define CONFIG_HTTP_PORT
++#define CONFIG_HTTP_HTTPS_PORT
++#define CONFIG_HTTP_SESSION_CACHE_SIZE
++#define CONFIG_HTTP_WEBROOT ""
++#define CONFIG_HTTP_TIMEOUT
++#undef CONFIG_HTTP_HAS_CGI
++#define CONFIG_HTTP_CGI_EXTENSIONS ""
++#undef CONFIG_HTTP_ENABLE_LUA
++#define CONFIG_HTTP_LUA_PREFIX ""
++#define CONFIG_HTTP_LUA_CGI_LAUNCHER ""
++#undef CONFIG_HTTP_BUILD_LUA
++#undef CONFIG_HTTP_DIRECTORIES
++#undef CONFIG_HTTP_HAS_AUTHORIZATION
++#undef CONFIG_HTTP_HAS_IPV6
++#undef CONFIG_HTTP_ENABLE_DIFFERENT_USER
++#define CONFIG_HTTP_USER ""
++#undef CONFIG_HTTP_VERBOSE
++#undef CONFIG_HTTP_IS_DAEMON
++
++/*
++ * Language Bindings
++ */
++#undef CONFIG_BINDINGS
++#undef CONFIG_CSHARP_BINDINGS
++#undef CONFIG_VBNET_BINDINGS
++#define CONFIG_DOT_NET_FRAMEWORK_BASE ""
++#undef CONFIG_JAVA_BINDINGS
++#define CONFIG_JAVA_HOME ""
++#undef CONFIG_PERL_BINDINGS
++#define CONFIG_PERL_CORE ""
++#define CONFIG_PERL_LIB ""
++#undef CONFIG_LUA_BINDINGS
++#define CONFIG_LUA_CORE ""
++
++/*
++ * Samples
++ */
++#undef CONFIG_SAMPLES
++#undef CONFIG_C_SAMPLES
++#undef CONFIG_CSHARP_SAMPLES
++#undef CONFIG_VBNET_SAMPLES
++#undef CONFIG_JAVA_SAMPLES
++#undef CONFIG_PERL_SAMPLES
++#undef CONFIG_LUA_SAMPLES
++
++/*
++ * BigInt Options
++ */
++#undef CONFIG_BIGINT_CLASSICAL
++#undef CONFIG_BIGINT_MONTGOMERY
++#define CONFIG_BIGINT_BARRETT 1
++#define CONFIG_BIGINT_CRT 1
++#undef CONFIG_BIGINT_KARATSUBA
++#define MUL_KARATSUBA_THRESH
++#define SQU_KARATSUBA_THRESH
++#define CONFIG_BIGINT_SLIDING_WINDOW 1
++#define CONFIG_BIGINT_SQUARE 1
++#undef CONFIG_BIGINT_CHECK_ON
+diff --git a/feeds/luci/libs/luci-lib-nixio/axtls-root/etc/nixio/rsa_main.der b/feeds/luci/libs/luci-lib-nixio/axtls-root/etc/nixio/rsa_main.der
+new file mode 100644
+index 0000000000000000000000000000000000000000..e17fdc0a0c70ea2783896858d75539f404048eb5
+GIT binary patch
+literal 609
+zcmV-n0-pUaf&yIv0RRGlfdJOj{f-NB6s=ZkK6xsdxjSkca%)`@KJMk(U>WOiS|#Eb
+zoAWdEN;`Dk9cL|zgXLJx;E>AL(m2eAPKsA&nS6t2IO9Qqj~%MAO&FPJU<Ys3FK9gt
+zJp%~}T0=FY+E8D;<Wwq&l&t2rzqc$tn~ktI8CR^6?7dyXQ8(LWAQ=J!0RRC4fq)Y_
+znLl5W`()60Wb7Y)9okKkB0{a-_BI#j#q~?~r(^)C$2zNt=M4{5+BW0@y4i|rY5Gge
+zz;j6pOJZV_X-;dk1a%Ziq#H`F)jvB5^Lt+Q{sFPigwQre*fN(r@TkA#dYd;*7*yXD
+z47DQ*hQg53<$lO?c54tiV;`)vFaZKV0Q@Jcup_@+PU=CYs`p+IaDy$hrP^sZP^s|w
+z<Pt+ZR5f#|`>ne3v)6C7X8x$f3Ls#j((1AIKfm6r=>2r<0Rlk)+8ds;3PW2BHX@!+
+z+hK(B+-P4V<v;cpsI3XEQ~7*Fbyv}H@GfN5EDK^vDwen+vNieHY<EKLTa^)h_nZ3}
+z0zm+Qp>yf!w#%h*Q09HYMjiPTw>^`#K{_${>*UNAhjLe-QzEC>oUjDg(3zP*dP*_&
+zi#Mt6_9p@(1-mBPhHL=>Km>PKQkFe7+8AfC5;cv}sUoyUZh$#O63X*%B~P~IB8~c#
+zVPqw*4(qG<0Z7UDPfU{PVAo~A%Nw}+xVzm)(E>pL>Dj&<G6v#6Sj|vdNkx&6fQR7@
+vxOgs2N%a4^3Tut0$H0_&bN(y>i5m%8UI~~REC*EW9J5XLU*A84D;RtmF~=XW
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/CHANGELOG.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/CHANGELOG.lua
+new file mode 100644
+index 0000000..aa31841
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/CHANGELOG.lua
+@@ -0,0 +1,29 @@
++--- Changes and improvements.
++module "nixio.CHANGELOG"
++
++--- Service Release.
++-- <ul>
++-- <li>Added getifaddrs() function.</li>
++-- <li>Added getsockopt(), setsockopt(), getsockname() and getpeername()
++-- directly to TLS-socket objects unifying the socket interface.</li>
++-- <li>Added support for CyaSSL as cryptographical backend.</li>
++-- <li>Added support for x509 certificates in DER format.</li>
++-- <li>Added support for splice() in UnifiedIO.copyz().</li>
++-- <li>Added interface to inject chunks into UnifiedIO.linesource() buffer.</li>
++-- <li>Changed TLS behaviour to explicitely separate servers and clients.</li>
++-- <li>Fixed usage of signed datatype breaking Base64 decoding.</li>
++-- <li>Fixed namespace clashes for nixio.fs.</li>
++-- <li>Fixed splice() support for some exotic C libraries.</li>
++-- <li>Reconfigure axTLS cryptographical provider and mark it as obsolete.</li>
++-- </ul>
++-- @class table
++-- @name 0.3
++-- @return !
++
++--- Initial Release.
++-- <ul>
++-- <li>Initial Release</li>
++-- </ul>
++-- @class table
++-- @name 0.2
++-- @return !
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/README.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/README.lua
+new file mode 100644
+index 0000000..ee3e3a2
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/README.lua
+@@ -0,0 +1,95 @@
++--- General Information.
++module "nixio.README"
++
++--- General error handling information.
++-- <ul>
++-- <li> Most of the functions available in this library may fail. If any error
++-- occurs the function returns <strong>nil or false</strong>, an error code
++-- (usually errno) and an additional error message text (if avaialable).</li>
++-- <li>At the moment false is only returned when a non-blocking I/O function
++-- fails with EAGAIN, EWOULDBLOCK or WSAEWOULDBLOCK for any others nil is
++-- returned as first parameter. Therefore you can use false to write portable
++-- non-blocking I/O applications.</li>
++-- <li>Note that the function documentation does only mention the return values
++-- in case of a successful operation.</li>
++-- <li>You can find a table of common error numbers and other useful constants
++-- like signal numbers in <strong>nixio.const</strong> e.g. nixio.const.EINVAL,
++-- nixio.const.SIGTERM, etc. For portability there is a second error constant
++-- table <strong>nixio.const_sock</strong> for socket error codes. This might
++-- be important if you are dealing with Windows applications, on POSIX however
++-- const_sock is just an alias for const.</li>
++-- <li>With some exceptions - which are explicitely stated in the function
++-- documentation - all blocking functions are signal-protected and will not fail
++-- with EINTR.</li>
++-- <li>On POSIX the SIGPIPE signal will be set to ignore upon initialization.
++-- You should restore the default behaviour or set a custom signal handler
++-- in your program after loading nixio if you need this behaviour.</li>
++-- </ul>
++-- @class table
++-- @name Errorhandling
++-- @return !
++
++--- Function conventions.
++-- <br />In general all functions are namend and behave like their POSIX API
++-- counterparts - where applicable - applying the following rules:
++-- <ul>
++-- <li>Functions should be named like the underlying POSIX API function ommiting
++-- prefixes or suffixes - especially when placed in an object-context (
++-- lockf -> File:lock, fsync -> File:sync, dup2 -> dup, ...)</li>
++-- <li>If you are unclear about the behaviour of a function you should consult
++-- your OS API documentation (e.g. the manpages).</li>
++-- <li>If the name is significantly different from the POSIX-function, the
++-- underlying function(s) are stated in the documentation.</li>
++-- <li>Parameters should reflect those of the C-API, buffer length arguments and
++-- by-reference parameters should be ommitted for pratical purposes.</li>
++-- <li>If a C function accepts a bitfield as parameter, it should be translated
++-- into lower case string flags representing the flags if the bitfield is the
++-- last parameter and also ommiting prefixes or suffixes. (e.g. waitpid
++-- (pid, &s, WNOHANG | WUNTRACED) -> waitpid(pid, "nohang", "untraced"),
++-- getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) ->
++-- Socket:getopt("socket", "reuseaddr"), etc.) </li>
++-- <li>If it is not applicable to provide a string representation of the
++-- bitfield a bitfield generator helper is provided. It is named FUNCTION_flags.
++-- (open("/tmp/test", O_RDONLY | O_NONBLOCK) -> open("/tmp/test", open_flags(
++-- "rdonly", "nonblock")))</li>
++-- </ul>
++-- @class table
++-- @name Functions
++-- @return !
++
++--- Platform information.
++-- <ul>
++-- <li>The minimum platform requirements are a decent POSIX 2001 support.
++-- Builds are more or less tested on Linux, Solaris and FreeBSD. Builds for
++-- Windows XP SP1 and later can be compiled with MinGW either from Windows
++-- itself or using the MinGW cross-compiler. Earlier versions of Windows are not
++-- supported.</li>
++-- <li>In general all functions which don't have any remarks
++-- in their documentation are available on all platforms.</li>
++-- <li>Functions with a (POSIX), (Linux) or similar prefix are only available
++-- on these specific platforms. Same appplies to parameters of functions
++-- with a similar suffix.</li>
++-- <li>Some functions might have limitations on some platforms. This should
++-- be stated in the documentation. Please also consult your OS API
++-- documentation.</li>
++-- </ul>
++-- @usage Tes
++-- @class table
++-- @name Platforms
++-- @return !
++
++--- Cryptography and TLS libraries.
++-- <ul>
++-- <li>Currently 3 underlying cryptography libraries are supported: openssl,
++-- cyassl and axTLS. The name of the library in use is written to
++-- <strong>nixio.tls_provider</strong></li>
++-- <li>You should whenever possible use openssl or cyassl as axTLS has only
++-- limited support. It does not provide support for non-blocking sockets and
++-- is probably less audited than the other ones.</li>
++-- <li>As the supported Windows versions are not suitable for embedded devices
++-- axTLS is at the moment not supported on Windows.</li>
++-- </ul>
++-- @usage Tes
++-- @class table
++-- @name TLS-Crypto
++-- @return !
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.CryptoHash.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.CryptoHash.lua
+new file mode 100644
+index 0000000..a08b48d
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.CryptoHash.lua
+@@ -0,0 +1,17 @@
++--- Cryptographical Hash and HMAC object.
++-- @cstyle instance
++module "nixio.CryptoHash"
++
++--- Add another chunk of data to be hashed.
++-- @class function
++-- @name CryptoHash.update
++-- @param chunk Chunk of data
++-- @return CryptoHash object (self)
++
++--- Finalize the hash and return the digest.
++-- @class function
++-- @name CryptoHash.final
++-- @usage You cannot call update on a hash object that was already finalized
++-- you can however call final multiple times to get the digest.
++-- @return hexdigest
++-- @return buffer containing binary digest
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.File.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.File.lua
+new file mode 100644
+index 0000000..368562a
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.File.lua
+@@ -0,0 +1,109 @@
++--- Large File Object.
++-- Large file operations are supported up to 52 bits if the Lua number type is
++-- double (default).
++-- @cstyle instance
++module "nixio.File"
++
++--- Write to the file descriptor.
++-- @class function
++-- @name File.write
++-- @usage <strong>Warning:</strong> It is not guaranteed that all data
++-- in the buffer is written at once especially when dealing with pipes.
++-- You have to check the return value - the number of bytes actually written -
++-- or use the safe IO functions in the high-level IO utility module.
++-- @usage Unlike standard Lua indexing the lowest offset and default is 0.
++-- @param buffer Buffer holding the data to be written.
++-- @param offset Offset to start reading the buffer from. (optional)
++-- @param length Length of chunk to read from the buffer. (optional)
++-- @return number of bytes written
++
++--- Read from a file descriptor.
++-- @class function
++-- @name File.read
++-- @usage <strong>Warning:</strong> It is not guaranteed that all requested data
++-- is read at once especially when dealing with pipes.
++-- You have to check the return value - the length of the buffer actually read -
++-- or use the safe IO functions in the high-level IO utility module.
++-- @usage The length of the return buffer is limited by the (compile time)
++-- nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
++-- Any read request greater than that will be safely truncated to this value.
++-- @param length Amount of data to read (in Bytes).
++-- @return buffer containing data successfully read
++
++--- Reposition read / write offset of the file descriptor.
++-- The seek will be done either from the beginning of the file or relative
++-- to the current position or relative to the end.
++-- @class function
++-- @name File.seek
++-- @usage This function calls lseek().
++-- @param offset File Offset
++-- @param whence Starting point [<strong>"set"</strong>, "cur", "end"]
++-- @return new (absolute) offset position
++
++--- Return the current read / write offset of the file descriptor.
++-- @class function
++-- @name File.tell
++-- @usage This function calls lseek() with offset 0 from the current position.
++-- @return offset position
++
++--- Synchronizes the file with the storage device.
++-- Returns when the file is successfully written to the disk.
++-- @class function
++-- @name File.sync
++-- @usage This function calls fsync() when data_only equals false
++-- otherwise fdatasync(), on Windows _commit() is used instead.
++-- @usage fdatasync() is only supported by Linux and Solaris. For other systems
++-- the <em>data_only</em> parameter is ignored and fsync() is always called.
++-- @param data_only Do not synchronize the metadata. (optional, boolean)
++-- @return true
++
++--- Apply or test a lock on the file.
++-- @class function
++-- @name File.lock
++-- @usage This function calls lockf() on POSIX and _locking() on Windows.
++-- @usage The "lock" command is blocking, "tlock" is non-blocking,
++-- "ulock" unlocks and "test" only tests for the lock.
++-- @usage The "test" command is not available on Windows.
++-- @usage Locks are by default advisory on POSIX, but mandatory on Windows.
++-- @param command Locking Command ["lock", "tlock", "ulock", "test"]
++-- @param length Amount of Bytes to lock from current offset (optional)
++-- @return true
++
++--- Get file status and attributes.
++-- @class function
++-- @name File.stat
++-- @param field Only return a specific field, not the whole table (optional)
++-- @usage This function calls fstat().
++-- @return Table containing: <ul>
++-- <li>atime = Last access timestamp</li>
++-- <li>blksize = Blocksize (POSIX only)</li>
++-- <li>blocks = Blocks used (POSIX only)</li>
++-- <li>ctime = Creation timestamp</li>
++-- <li>dev = Device ID</li>
++-- <li>gid = Group ID</li>
++-- <li>ino = Inode</li>
++-- <li>modedec = Mode converted into a decimal number</li>
++-- <li>modestr = Mode as string as returned by `ls -l`</li>
++-- <li>mtime = Last modification timestamp</li>
++-- <li>nlink = Number of links</li>
++-- <li>rdev = Device ID (if special file)</li>
++-- <li>size = Size in bytes</li>
++-- <li>type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]</li>
++-- <li>uid = User ID</li>
++-- </ul>
++
++--- Close the file descriptor.
++-- @class function
++-- @name File.close
++-- @return true
++
++--- Get the number of the filedescriptor.
++-- @class function
++-- @name File.fileno
++-- @return file descriptor number
++
++--- (POSIX) Set the blocking mode of the file descriptor.
++-- @class function
++-- @name File.setblocking
++-- @param blocking (boolean)
++-- @return true
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.Socket.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.Socket.lua
+new file mode 100644
+index 0000000..7123393
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.Socket.lua
+@@ -0,0 +1,170 @@
++--- Socket Object.
++-- Supports IPv4, IPv6 and UNIX (POSIX only) families.
++-- @cstyle instance
++module "nixio.Socket"
++
++--- Get the local address of a socket.
++-- @class function
++-- @name Socket.getsockname
++-- @return IP-Address
++-- @return Port
++
++--- Get the peer address of a socket.
++-- @class function
++-- @name Socket.getpeername
++-- @return IP-Address
++-- @return Port
++
++--- Bind the socket to a network address.
++-- @class function
++-- @name Socket.bind
++-- @usage This function calls getaddrinfo() and bind() but NOT listen().
++-- @usage If <em>host</em> is a domain name it will be looked up and bind()
++-- tries the IP-Addresses in the order returned by the DNS resolver
++-- until the bind succeeds.
++-- @usage UNIX sockets ignore the <em>port</em>,
++-- and interpret <em>host</em> as a socket path.
++-- @param host Host (optional, default: all addresses)
++-- @param port Port or service description
++-- @return true
++
++--- Connect the socket to a network address.
++-- @class function
++-- @name Socket.connect
++-- @usage This function calls getaddrinfo() and connect().
++-- @usage If <em>host</em> is a domain name it will be looked up and connect()
++-- tries the IP-Addresses in the order returned by the DNS resolver
++-- until the connect succeeds.
++-- @usage UNIX sockets ignore the <em>port</em>,
++-- and interpret <em>host</em> as a socket path.
++-- @param host Hostname or IP-Address (optional, default: localhost)
++-- @param port Port or service description
++-- @return true
++
++--- Listen for connections on the socket.
++-- @class function
++-- @name Socket.listen
++-- @param backlog Length of queue for pending connections
++-- @return true
++
++--- Accept a connection on the socket.
++-- @class function
++-- @name Socket.accept
++-- @return Socket Object
++-- @return Peer IP-Address
++-- @return Peer Port
++
++--- Send a message on the socket specifying the destination.
++-- @class function
++-- @name Socket.sendto
++-- @usage <strong>Warning:</strong> It is not guaranteed that all data
++-- in the buffer is written at once.
++-- You have to check the return value - the number of bytes actually written -
++-- or use the safe IO functions in the high-level IO utility module.
++-- @usage Unlike standard Lua indexing the lowest offset and default is 0.
++-- @param buffer Buffer holding the data to be written.
++-- @param host Target IP-Address
++-- @param port Target Port
++-- @param offset Offset to start reading the buffer from. (optional)
++-- @param length Length of chunk to read from the buffer. (optional)
++-- @return number of bytes written
++
++--- Send a message on the socket.
++-- This function is identical to sendto except for the missing destination
++-- paramters. See the sendto description for a detailed description.
++-- @class function
++-- @name Socket.send
++-- @param buffer Buffer holding the data to be written.
++-- @param offset Offset to start reading the buffer from. (optional)
++-- @param length Length of chunk to read from the buffer. (optional)
++-- @see Socket.sendto
++-- @return number of bytes written
++
++--- Send a message on the socket (This is an alias for send).
++-- See the sendto description for a detailed description.
++-- @class function
++-- @name Socket.write
++-- @param buffer Buffer holding the data to be written.
++-- @param offset Offset to start reading the buffer from. (optional)
++-- @param length Length of chunk to read from the buffer. (optional)
++-- @see Socket.sendto
++-- @return number of bytes written
++
++--- Receive a message on the socket including the senders source address.
++-- @class function
++-- @name Socket.recvfrom
++-- @usage <strong>Warning:</strong> It is not guaranteed that all requested data
++-- is read at once.
++-- You have to check the return value - the length of the buffer actually read -
++-- or use the safe IO functions in the high-level IO utility module.
++-- @usage The length of the return buffer is limited by the (compile time)
++-- nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
++-- Any read request greater than that will be safely truncated to this value.
++-- @param length Amount of data to read (in Bytes).
++-- @return buffer containing data successfully read
++-- @return host IP-Address of the sender
++-- @return port Port of the sender
++
++--- Receive a message on the socket.
++-- This function is identical to recvfrom except that it does not return
++-- the sender's source address. See the recvfrom description for more details.
++-- @class function
++-- @name Socket.recv
++-- @param length Amount of data to read (in Bytes).
++-- @see Socket.recvfrom
++-- @return buffer containing data successfully read
++
++--- Receive a message on the socket (This is an alias for recv).
++-- See the recvfrom description for more details.
++-- @class function
++-- @name Socket.read
++-- @param length Amount of data to read (in Bytes).
++-- @see Socket.recvfrom
++-- @return buffer containing data successfully read
++
++--- Close the socket.
++-- @class function
++-- @name Socket.close
++-- @return true
++
++--- Shut down part of a full-duplex connection.
++-- @class function
++-- @name Socket.shutdown
++-- @param how (optional, default: rdwr) ["rdwr", "rd", "wr"]
++-- @return true
++
++--- Get the number of the filedescriptor.
++-- @class function
++-- @name Socket.fileno
++-- @return file descriptor number
++
++--- Set the blocking mode of the socket.
++-- @class function
++-- @name Socket.setblocking
++-- @param blocking (boolean)
++-- @return true
++
++--- Set a socket option.
++-- @class function
++-- @name Socket.setopt
++-- @param level Level ["socket", "tcp", "ip", "ipv6"]
++-- @param option Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf",
++-- "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute",
++-- "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP),
++-- "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop"
++-- (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops"
++-- (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)]
++-- @param value Value
++-- @return true
++
++--- Get a socket option.
++-- @class function
++-- @name Socket.getopt
++-- @param level Level ["socket", "tcp", "ip", "ipv6"]
++-- @param option Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf",
++-- "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute",
++-- "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP),
++-- "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop"
++-- (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops"
++-- (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)]
++-- @return Value
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSContext.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSContext.lua
+new file mode 100644
+index 0000000..7cc0711
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSContext.lua
+@@ -0,0 +1,46 @@
++--- Transport Layer Security Context Object.
++-- @cstyle instance
++module "nixio.TLSContext"
++
++--- Create a TLS Socket from a socket descriptor.
++-- @class function
++-- @name TLSContext.create
++-- @param socket Socket Object
++-- @return TLSSocket Object
++
++--- Assign a PEM certificate to this context.
++-- @class function
++-- @name TLSContext.set_cert
++-- @usage This function calls SSL_CTX_use_certificate_chain_file().
++-- @param path Certificate File path
++-- @return true
++
++--- Assign a PEM private key to this context.
++-- @class function
++-- @name TLSContext.set_key
++-- @usage This function calls SSL_CTX_use_PrivateKey_file().
++-- @param path Private Key File path
++-- @return true
++
++--- Set the available ciphers for this context.
++-- @class function
++-- @name TLSContext.set_ciphers
++-- @usage This function calls SSL_CTX_set_cipher_list().
++-- @param cipherlist String containing a list of ciphers
++-- @return true
++
++--- Set the verification depth of this context.
++-- @class function
++-- @name TLSContext.set_verify_depth
++-- @usage This function calls SSL_CTX_set_verify_depth().
++-- @param depth Depth
++-- @return true
++
++--- Set the verification flags of this context.
++-- @class function
++-- @name TLSContext.set_verify
++-- @usage This function calls SSL_CTX_set_verify().
++-- @param flag1 First Flag ["none", "peer", "verify_fail_if_no_peer_cert",
++-- "client_once"]
++-- @param ... More Flags [-"-]
++-- @return true
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSSocket.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSSocket.lua
+new file mode 100644
+index 0000000..b932cde
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSSocket.lua
+@@ -0,0 +1,73 @@
++--- TLS Socket Object.
++-- TLS Sockets contain the underlying socket and context in the fields
++-- "socket" and "context".
++-- @cstyle instance
++module "nixio.TLSSocket"
++
++--- Initiate the TLS handshake as client with the server.
++-- @class function
++-- @name TLSSocket.connect
++-- @usage This function calls SSL_connect().
++-- @usage You have to call either connect or accept before transmitting data.
++-- @see TLSSocket.accept
++-- @return true
++
++--- Wait for a TLS handshake from a client.
++-- @class function
++-- @name TLSSocket.accept
++-- @usage This function calls SSL_accept().
++-- @usage You have to call either connect or accept before transmitting data.
++-- @see TLSSocket.connect
++-- @return true
++
++--- Send a message to the socket.
++-- @class function
++-- @name TLSSocket.send
++-- @usage This function calls SSL_write().
++-- @usage <strong>Warning:</strong> It is not guaranteed that all data
++-- in the buffer is written at once.
++-- You have to check the return value - the number of bytes actually written -
++-- or use the safe IO functions in the high-level IO utility module.
++-- @usage Unlike standard Lua indexing the lowest offset and default is 0.
++-- @param buffer Buffer holding the data to be written.
++-- @param offset Offset to start reading the buffer from. (optional)
++-- @param length Length of chunk to read from the buffer. (optional)
++-- @return number of bytes written
++
++--- Send a message on the socket (This is an alias for send).
++-- See the send description for a detailed description.
++-- @class function
++-- @name TLSSocket.write
++-- @param buffer Buffer holding the data to be written.
++-- @param offset Offset to start reading the buffer from. (optional)
++-- @param length Length of chunk to read from the buffer. (optional)
++-- @see TLSSocket.send
++-- @return number of bytes written
++
++--- Receive a message on the socket.
++-- @class function
++-- @name TLSSocket.recv
++-- @usage This function calls SSL_read().
++-- @usage <strong>Warning:</strong> It is not guaranteed that all requested data
++-- is read at once.
++-- You have to check the return value - the length of the buffer actually read -
++-- or use the safe IO functions in the high-level IO utility module.
++-- @usage The length of the return buffer is limited by the (compile time)
++-- nixio buffersize which is <em>nixio.const.buffersize</em> (8192 by default).
++-- Any read request greater than that will be safely truncated to this value.
++-- @param length Amount of data to read (in Bytes).
++-- @return buffer containing data successfully read
++
++--- Receive a message on the socket (This is an alias for recv).
++-- See the recv description for more details.
++-- @class function
++-- @name TLSSocket.read
++-- @param length Amount of data to read (in Bytes).
++-- @see TLSSocket.recv
++-- @return buffer containing data successfully read
++
++--- Shut down the TLS connection.
++-- @class function
++-- @name TLSSocket.shutdown
++-- @usage This function calls SSL_shutdown().
++-- @return true
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.UnifiedIO.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.UnifiedIO.lua
+new file mode 100644
+index 0000000..6e407ff
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.UnifiedIO.lua
+@@ -0,0 +1,129 @@
++--- Unified high-level I/O utility API for Files, Sockets and TLS-Sockets.
++-- These functions are added to the object function tables by doing <strong>
++-- require "nixio.util"</strong>, can be used on all nixio IO Descriptors and
++-- are based on the shared low-level read() and write() functions.
++-- @cstyle instance
++module "nixio.UnifiedIO"
++
++--- Test whether the I/O-Descriptor is a socket.
++-- @class function
++-- @name UnifiedIO.is_socket
++-- @return boolean
++
++--- Test whether the I/O-Descriptor is a TLS socket.
++-- @class function
++-- @name UnifiedIO.is_tls_socket
++-- @return boolean
++
++--- Test whether the I/O-Descriptor is a file.
++-- @class function
++-- @name UnifiedIO.is_file
++-- @return boolean
++
++--- Read a block of data and wait until all data is available.
++-- @class function
++-- @name UnifiedIO.readall
++-- @usage This function uses the low-level read function of the descriptor.
++-- @usage If the length parameter is ommited, this function returns all data
++-- that can be read before an end-of-file, end-of-stream, connection shutdown
++-- or similar happens.
++-- @usage If the descriptor is non-blocking this function may fail with EAGAIN.
++-- @param length Bytes to read (optional)
++-- @return data that was successfully read if no error occured
++-- @return - reserved for error code -
++-- @return - reserved for error message -
++-- @return data that was successfully read even if an error occured
++
++--- Write a block of data and wait until all data is written.
++-- @class function
++-- @name UnifiedIO.writeall
++-- @usage This function uses the low-level write function of the descriptor.
++-- @usage If the descriptor is non-blocking this function may fail with EAGAIN.
++-- @param block Bytes to write
++-- @return bytes that were successfully written if no error occured
++-- @return - reserved for error code -
++-- @return - reserved for error message -
++-- @return bytes that were successfully written even if an error occured
++
++--- Create a line-based iterator.
++-- Lines may end with either \n or \r\n, these control chars are not included
++-- in the return value.
++-- @class function
++-- @name UnifiedIO.linesource
++-- @usage This function uses the low-level read function of the descriptor.
++-- @usage <strong>Note:</strong> This function uses an internal buffer to read
++-- ahead. Do NOT mix calls to read(all) and the returned iterator. If you want
++-- to stop reading line-based and want to use the read(all) functions instead
++-- you can pass "true" to the iterator which will flush the buffer
++-- and return the bufferd data.
++-- @usage If the limit parameter is ommited, this function uses the nixio
++-- buffersize (8192B by default).
++-- @usage If the descriptor is non-blocking the iterator may fail with EAGAIN.
++-- @usage The iterator can be used as an LTN12 source.
++-- @param limit Line limit
++-- @return Line-based Iterator
++
++--- Create a block-based iterator.
++-- @class function
++-- @name UnifiedIO.blocksource
++-- @usage This function uses the low-level read function of the descriptor.
++-- @usage The blocksize given is only advisory and to be seen as an upper limit,
++-- if an underlying read returns less bytes the chunk is nevertheless returned.
++-- @usage If the limit parameter is ommited, the iterator returns data
++-- until an end-of-file, end-of-stream, connection shutdown or similar happens.
++-- @usage The iterator will not buffer so it is safe to mix with calls to read.
++-- @usage If the descriptor is non-blocking the iterator may fail with EAGAIN.
++-- @usage The iterator can be used as an LTN12 source.
++-- @param blocksize Advisory blocksize (optional)
++-- @param limit Amount of data to consume (optional)
++-- @return Block-based Iterator
++
++--- Create a sink.
++-- This sink will simply write all data that it receives and optionally
++-- close the descriptor afterwards.
++-- @class function
++-- @name UnifiedIO.sink
++-- @usage This function uses the writeall function of the descriptor.
++-- @usage If the descriptor is non-blocking the sink may fail with EAGAIN.
++-- @usage The iterator can be used as an LTN12 sink.
++-- @param close_when_done (optional, boolean)
++-- @return Sink
++
++--- Copy data from the current descriptor to another one.
++-- @class function
++-- @name UnifiedIO.copy
++-- @usage This function uses the blocksource function of the source descriptor
++-- and the sink function of the target descriptor.
++-- @usage If the limit parameter is ommited, data is copied
++-- until an end-of-file, end-of-stream, connection shutdown or similar happens.
++-- @usage If the descriptor is non-blocking the function may fail with EAGAIN.
++-- @param fdout Target Descriptor
++-- @param size Bytes to copy (optional)
++-- @return bytes that were successfully written if no error occured
++-- @return - reserved for error code -
++-- @return - reserved for error message -
++-- @return bytes that were successfully written even if an error occured
++
++--- Copy data from the current descriptor to another one using kernel-space
++-- copying if possible.
++-- @class function
++-- @name UnifiedIO.copyz
++-- @usage This function uses the sendfile() syscall to copy the data or the
++-- blocksource function of the source descriptor and the sink function
++-- of the target descriptor as a fallback mechanism.
++-- @usage If the limit parameter is ommited, data is copied
++-- until an end-of-file, end-of-stream, connection shutdown or similar happens.
++-- @usage If the descriptor is non-blocking the function may fail with EAGAIN.
++-- @param fdout Target Descriptor
++-- @param size Bytes to copy (optional)
++-- @return bytes that were successfully written if no error occured
++-- @return - reserved for error code -
++-- @return - reserved for error message -
++-- @return bytes that were successfully written even if an error occured
++
++--- Close the descriptor.
++-- @class function
++-- @name UnifiedIO.close
++-- @usage If the descriptor is a TLS-socket the underlying descriptor is
++-- closed without touching the TLS connection.
++-- @return true
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bin.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bin.lua
+new file mode 100644
+index 0000000..13e125d
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bin.lua
+@@ -0,0 +1,33 @@
++--- Binary operations and conversion.
++module "nixio.bin"
++
++--- Return a hexadecimal ASCII represantation of the content of a buffer.
++-- @class function
++-- @name hexlify
++-- @param buffer Buffer
++-- @return representation using characters [0-9a-f]
++
++--- Return a binary buffer from a hexadecimal ASCII representation.
++-- @class function
++-- @name unhexlify
++-- @param hexvalue representation using characters [0-9a-f]
++-- @return binary data
++
++--- Calculate the CRC32 value of a buffer.
++-- @class function
++-- @name crc32
++-- @param buffer Buffer
++-- @param initial Initial CRC32 value (optional)
++-- @return crc32 value
++
++--- Base64 encode a given buffer.
++-- @class function
++-- @name b64encode
++-- @param buffer Buffer
++-- @return base64 encoded buffer
++
++--- Base64 decode a given buffer.
++-- @class function
++-- @name b64decode
++-- @param buffer Base 64 Encoded data
++-- @return binary data
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bit.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bit.lua
+new file mode 100644
+index 0000000..6951dd5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bit.lua
+@@ -0,0 +1,92 @@
++--- Bitfield operators and mainpulation functions.
++-- Can be used as a drop-in replacement for bitlib.
++module "nixio.bit"
++
++--- Bitwise OR several numbers.
++-- @class function
++-- @name bor
++-- @param oper1 First Operand
++-- @param oper2 Second Operand
++-- @param ... More Operands
++-- @return number
++
++--- Invert given number.
++-- @class function
++-- @name bnot
++-- @param oper Operand
++-- @return number
++
++--- Bitwise AND several numbers.
++-- @class function
++-- @name band
++-- @param oper1 First Operand
++-- @param oper2 Second Operand
++-- @param ... More Operands
++-- @return number
++
++--- Bitwise XOR several numbers.
++-- @class function
++-- @name bxor
++-- @param oper1 First Operand
++-- @param oper2 Second Operand
++-- @param ... More Operands
++-- @return number
++
++--- Left shift a number.
++-- @class function
++-- @name lshift
++-- @param oper number
++-- @param shift bits to shift
++-- @return number
++
++--- Right shift a number.
++-- @class function
++-- @name rshift
++-- @param oper number
++-- @param shift bits to shift
++-- @return number
++
++--- Arithmetically right shift a number.
++-- @class function
++-- @name arshift
++-- @param oper number
++-- @param shift bits to shift
++-- @return number
++
++--- Integer division of 2 or more numbers.
++-- @class function
++-- @name div
++-- @param oper1 Operand 1
++-- @param oper2 Operand 2
++-- @param ... More Operands
++-- @return number
++
++--- Cast a number to the bit-operating range.
++-- @class function
++-- @name cast
++-- @param oper number
++-- @return number
++
++--- Sets one or more flags of a bitfield.
++-- @class function
++-- @name set
++-- @param bitfield Bitfield
++-- @param flag1 First Flag
++-- @param ... More Flags
++-- @return altered bitfield
++
++--- Unsets one or more flags of a bitfield.
++-- @class function
++-- @name unset
++-- @param bitfield Bitfield
++-- @param flag1 First Flag
++-- @param ... More Flags
++-- @return altered bitfield
++
++--- Checks whether given flags are set in a bitfield.
++-- @class function
++-- @name check
++-- @param bitfield Bitfield
++-- @param flag1 First Flag
++-- @param ... More Flags
++-- @return true when all flags are set, otherwise false
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.crypto.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.crypto.lua
+new file mode 100644
+index 0000000..158d0fc
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.crypto.lua
+@@ -0,0 +1,15 @@
++--- Cryptographical library.
++module "nixio.crypto"
++
++--- Create a hash object.
++-- @class function
++-- @name nixio.crypto.hash
++-- @param algo Algorithm ["sha1", "md5"]
++-- @return CryptoHash Object
++
++--- Create a HMAC object.
++-- @class function
++-- @name nixio.crypto.hmac
++-- @param algo Algorithm ["sha1", "md5"]
++-- @param key HMAC-Key
++-- @return CryptoHash Object
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.fs.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.fs.lua
+new file mode 100644
+index 0000000..5d08719
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.fs.lua
+@@ -0,0 +1,265 @@
++--- Low-level and high-level filesystem manipulation library.
++module "nixio.fs"
++
++
++--- Check user's permission on a file.
++-- @class function
++-- @name nixio.fs.access
++-- @param path Path
++-- @param mode1 First Mode to check ["f", "r", "w", "x"]
++-- @param ... More Modes to check [-"-]
++-- @return true
++
++--- Strip the directory part from a path.
++-- @class function
++-- @name nixio.fs.basename
++-- @usage This function cannot fail and will never return nil.
++-- @param path Path
++-- @return basename
++
++--- Strip the base from a path.
++-- @class function
++-- @name nixio.fs.dirname
++-- @usage This function cannot fail and will never return nil.
++-- @param path Path
++-- @return dirname
++
++--- Return the cannonicalized absolute pathname.
++-- @class function
++-- @name nixio.fs.realpath
++-- @param path Path
++-- @return absolute path
++
++--- Remove a file or directory.
++-- @class function
++-- @name nixio.fs.remove
++-- @param path Path
++-- @return true
++
++--- Delete a name and - if no links are left - the associated file.
++-- @class function
++-- @name nixio.fs.unlink
++-- @param path Path
++-- @return true
++
++--- Renames a file or directory.
++-- @class function
++-- @name nixio.fs.rename
++-- @param src Source path
++-- @param dest Destination path
++-- @usage It is normally not possible to rename files accross fileystems.
++-- @return true
++
++--- Remove an empty directory.
++-- @class function
++-- @name nixio.fs.rmdir
++-- @param path Path
++-- @return true
++
++--- Create a new directory.
++-- @class function
++-- @name nixio.fs.mkdir
++-- @param path Path
++-- @param mode File mode (optional, see chmod and umask)
++-- @see nixio.fs.chmod
++-- @see nixio.umask
++-- @return true
++
++--- Change the file mode.
++-- @class function
++-- @name nixio.fs.chmod
++-- @usage Windows only supports setting the write-protection through the
++-- "Writable to others" bit.
++-- @usage <strong>Notice:</strong> The mode-flag for the functions
++-- open, mkdir, mkfifo are affected by the umask.
++-- @param path Path
++-- @param mode File mode
++-- [decimal mode number, "[-r][-w][-xsS][-r][-w][-xsS][-r][-w][-xtT]"]
++-- @see nixio.umask
++-- @return true
++
++--- Iterate over the entries of a directory.
++-- @class function
++-- @name nixio.fs.dir
++-- @usage The special entries "." and ".." are omitted.
++-- @param path Path
++-- @return directory iterator returning one entry per call
++
++--- Create a hard link.
++-- @class function
++-- @name nixio.fs.link
++-- @usage This function calls link() on POSIX and CreateHardLink() on Windows.
++-- @param oldpath Path
++-- @param newpath Path
++-- @return true
++
++--- Change file last access and last modification time.
++-- @class function
++-- @name nixio.fs.utimes
++-- @param path Path
++-- @param actime Last access timestamp (optional, default: current time)
++-- @param mtime Last modification timestamp (optional, default: actime)
++-- @return true
++
++--- Get file status and attributes.
++-- @class function
++-- @name nixio.fs.stat
++-- @param path Path
++-- @param field Only return a specific field, not the whole table (optional)
++-- @return Table containing: <ul>
++-- <li>atime = Last access timestamp</li>
++-- <li>blksize = Blocksize (POSIX only)</li>
++-- <li>blocks = Blocks used (POSIX only)</li>
++-- <li>ctime = Creation timestamp</li>
++-- <li>dev = Device ID</li>
++-- <li>gid = Group ID</li>
++-- <li>ino = Inode</li>
++-- <li>modedec = Mode converted into a decimal number</li>
++-- <li>modestr = Mode as string as returned by `ls -l`</li>
++-- <li>mtime = Last modification timestamp</li>
++-- <li>nlink = Number of links</li>
++-- <li>rdev = Device ID (if special file)</li>
++-- <li>size = Size in bytes</li>
++-- <li>type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]</li>
++-- <li>uid = User ID</li>
++-- </ul>
++
++--- Get file status and attributes and do not resolve if target is a symlink.
++-- @class function
++-- @name nixio.fs.lstat
++-- @param path Path
++-- @param field Only return a specific field, not the whole table (optional)
++-- @see nixio.fs.stat
++-- @return Table containing attributes (see stat for a detailed description)
++
++--- (POSIX) Change owner and group of a file.
++-- @class function
++-- @name nixio.fs.chown
++-- @param path Path
++-- @param user User ID or Username (optional)
++-- @param group Group ID or Groupname (optional)
++-- @return true
++
++--- (POSIX) Change owner and group of a file and do not resolve
++-- if target is a symlink.
++-- @class function
++-- @name nixio.fs.lchown
++-- @param path Path
++-- @param user User ID or Username (optional)
++-- @param group Group ID or Groupname (optional)
++-- @return true
++
++--- (POSIX) Create a FIFO (named pipe).
++-- @class function
++-- @name nixio.fs.mkfifo
++-- @param path Path
++-- @param mode File mode (optional, see chmod and umask)
++-- @see nixio.fs.chmod
++-- @see nixio.umask
++-- @return true
++
++--- (POSIX) Create a symbolic link.
++-- @class function
++-- @name nixio.fs.symlink
++-- @param oldpath Path
++-- @param newpath Path
++-- @return true
++
++--- (POSIX) Read the target of a symbolic link.
++-- @class function
++-- @name nixio.fs.readlink
++-- @param path Path
++-- @return target path
++
++--- (POSIX) Find pathnames matching a pattern.
++-- @class function
++-- @name nixio.fs.glob
++-- @param pattern Pattern
++-- @return path iterator
++-- @return number of matches
++
++--- (POSIX) Get filesystem statistics.
++-- @class function
++-- @name nixio.fs.statvfs
++-- @param path Path to any file within the filesystem.
++-- @return Table containing: <ul>
++-- <li>bavail = available blocks</li>
++-- <li>bfree = free blocks</li>
++-- <li>blocks = number of fragments</li>
++-- <li>frsize = fragment size</li>
++-- <li>favail = available inodes</li>
++-- <li>ffree = free inodes</li>
++-- <li>files = inodes</li>
++-- <li>flag = flags</li>
++-- <li>fsid = filesystem ID</li>
++-- <li>namemax = maximum filename length</li>
++-- </ul>
++
++--- Read the contents of a file into a buffer.
++-- @class function
++-- @name nixio.fs.readfile
++-- @param path Path
++-- @param limit Maximum bytes to read (optional)
++-- @return file contents
++
++--- Write a buffer into a file truncating the file first.
++-- @class function
++-- @name nixio.fs.writefile
++-- @param path Path
++-- @param data Data to write
++-- @return true
++
++--- Copy data between files.
++-- @class function
++-- @name nixio.fs.datacopy
++-- @param src Source file path
++-- @param dest Destination file path
++-- @param limit Maximum bytes to copy (optional)
++-- @return true
++
++--- Copy a file, directory or symlink non-recursively preserving file mode,
++-- timestamps, owner and group.
++-- @class function
++-- @name nixio.fs.copy
++-- @usage The destination must always be a full destination path e.g. do not
++-- omit the basename even if source and destination basename are equal.
++-- @param src Source path
++-- @param dest Destination path
++-- @return true
++
++--- Rename a file, directory or symlink non-recursively across filesystems.
++-- @class function
++-- @name nixio.fs.move
++-- @usage The destination must always be a full destination path e.g. do not
++-- omit the basename even if source and destination basename are equal.
++-- @param src Source path
++-- @param dest Destination path
++-- @return true
++
++--- Create a directory and all needed parent directories recursively.
++-- @class function
++-- @name nixio.fs.mkdirr
++-- @param dest Destination path
++-- @param mode File mode (optional, see chmod and umask)
++-- @see nixio.fs.chmod
++-- @see nixio.umask
++-- @return true
++
++--- Rename a file, directory or symlink recursively across filesystems.
++-- @class function
++-- @name nixio.fs.mover
++-- @usage The destination must always be a full destination path e.g. do not
++-- omit the basename even if source and destination basename are equal.
++-- @param src Source path
++-- @param dest Destination path
++-- @return true
++
++--- Copy a file, directory or symlink recursively preserving file mode,
++-- timestamps, owner and group.
++-- @class function
++-- @name nixio.fs.copyr
++-- @usage The destination must always be a full destination path e.g. do not
++-- omit the basename even if source and destination basename are equal.
++-- @param src Source path
++-- @param dest Destination path
++-- @return true
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.lua
+new file mode 100644
+index 0000000..1b434d7
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.lua
+@@ -0,0 +1,467 @@
++--- General POSIX IO library.
++module "nixio"
++
++--- Look up a hostname and service via DNS.
++-- @class function
++-- @name nixio.getaddrinfo
++-- @param host hostname to lookup (optional)
++-- @param family address family [<strong>"any"</strong>, "inet", "inet6"]
++-- @param service service name or port (optional)
++-- @return Table containing one or more tables containing: <ul>
++-- <li>family = ["inet", "inet6"]</li>
++-- <li>socktype = ["stream", "dgram", "raw"]</li>
++-- <li>address = Resolved IP-Address</li>
++-- <li>port = Resolved Port (if service was given)</li>
++-- </ul>
++
++--- Reverse look up an IP-Address via DNS.
++-- @class function
++-- @name nixio.getnameinfo
++-- @param ipaddr IPv4 or IPv6-Address
++-- @return FQDN
++
++--- (Linux, BSD) Get a list of available network interfaces and their addresses.
++-- @class function
++-- @name nixio.getifaddrs
++-- @return Table containing one or more tables containing: <ul>
++-- <li>name = Interface Name</li>
++-- <li>family = ["inet", "inet6", "packet"]</li>
++-- <li>addr = Interface Address (IPv4, IPv6, MAC, ...)</li>
++-- <li>broadaddr = Broadcast Address</li>
++-- <li>dstaddr = Destination Address (Point-to-Point)</li>
++-- <li>netmask = Netmask (if available)</li>
++-- <li>prefix = Prefix (if available)</li>
++-- <li>flags = Table of interface flags (up, multicast, loopback, ...)</li>
++-- <li>data = Statistics (Linux, "packet"-family)</li>
++-- <li>hatype = Hardware Type Identifier (Linix, "packet"-family)</li>
++-- <li>ifindex = Interface Index (Linux, "packet"-family)</li>
++-- </ul>
++
++--- Get protocol entry by name.
++-- @usage This function returns nil if the given protocol is unknown.
++-- @class function
++-- @name nixio.getprotobyname
++-- @param name protocol name to lookup
++-- @return Table containing the following fields: <ul>
++-- <li>name = Protocol Name</li>
++-- <li>proto = Protocol Number</li>
++-- <li>aliases = Table of alias names</li>
++-- </ul>
++
++--- Get protocol entry by number.
++-- @usage This function returns nil if the given protocol is unknown.
++-- @class function
++-- @name nixio.getprotobynumber
++-- @param proto protocol number to lookup
++-- @return Table containing the following fields: <ul>
++-- <li>name = Protocol Name</li>
++-- <li>proto = Protocol Number</li>
++-- <li>aliases = Table of alias names</li>
++-- </ul>
++
++--- Get all or a specifc proto entry.
++-- @class function
++-- @name nixio.getproto
++-- @param proto protocol number or name to lookup (optional)
++-- @return Table (or if no parameter is given, a table of tables)
++-- containing the following fields: <ul>
++-- <li>name = Protocol Name</li>
++-- <li>proto = Protocol Number</li>
++-- <li>aliases = Table of alias names</li>
++-- </ul>
++
++--- Create a new socket and bind it to a network address.
++-- This function is a shortcut for calling nixio.socket and then bind()
++-- on the socket object.
++-- @usage This functions calls getaddrinfo(), socket(),
++-- setsockopt() and bind() but NOT listen().
++-- @usage The <em>reuseaddr</em>-option is automatically set before binding.
++-- @class function
++-- @name nixio.bind
++-- @param host Hostname or IP-Address (optional, default: all addresses)
++-- @param port Port or service description
++-- @param family Address family [<strong>"any"</strong>, "inet", "inet6"]
++-- @param socktype Socket Type [<strong>"stream"</strong>, "dgram"]
++-- @return Socket Object
++
++--- Create a new socket and connect to a network address.
++-- This function is a shortcut for calling nixio.socket and then connect()
++-- on the socket object.
++-- @usage This functions calls getaddrinfo(), socket() and connect().
++-- @class function
++-- @name nixio.connect
++-- @param host Hostname or IP-Address (optional, default: localhost)
++-- @param port Port or service description
++-- @param family Address family [<strong>"any"</strong>, "inet", "inet6"]
++-- @param socktype Socket Type [<strong>"stream"</strong>, "dgram"]
++-- @return Socket Object
++
++--- Open a file.
++-- @class function
++-- @name nixio.open
++-- @usage Although this function also supports the traditional fopen()
++-- file flags it does not create a file stream but uses the open() syscall.
++-- @param path Filesystem path to open
++-- @param flags Flag string or number (see open_flags).
++-- [<strong>"r"</strong>, "r+", "w", "w+", "a", "a+"]
++-- @param mode File mode for newly created files (see chmod, umask).
++-- @see nixio.umask
++-- @see nixio.open_flags
++-- @return File Object
++
++--- Generate flags for a call to open().
++-- @class function
++-- @name nixio.open_flags
++-- @usage This function cannot fail and will never return nil.
++-- @usage The "nonblock" and "ndelay" flags are aliases.
++-- @usage The "nonblock", "ndelay" and "sync" flags are no-ops on Windows.
++-- @param flag1 First Flag ["append", "creat", "excl", "nonblock", "ndelay",
++-- "sync", "trunc", "rdonly", "wronly", "rdwr"]
++-- @param ... More Flags [-"-]
++-- @return flag to be used as second paramter to open
++
++--- Duplicate a file descriptor.
++-- @class function
++-- @name nixio.dup
++-- @usage This funcation calls dup2() if <em>newfd</em> is set, otherwise dup().
++-- @param oldfd Old descriptor [File Object, Socket Object (POSIX only)]
++-- @param newfd New descriptor to serve as copy (optional)
++-- @return File Object of new descriptor
++
++--- Create a pipe.
++-- @class function
++-- @name nixio.pipe
++-- @return File Object of the read end
++-- @return File Object of the write end
++
++--- Get the last system error code.
++-- @class function
++-- @name nixio.errno
++-- @return Error code
++
++--- Get the error message for the corresponding error code.
++-- @class function
++-- @name nixio.strerror
++-- @param errno System error code
++-- @return Error message
++
++--- Sleep for a specified amount of time.
++-- @class function
++-- @usage Not all systems support nanosecond precision but you can expect
++-- to have at least maillisecond precision.
++-- @usage This function is not signal-protected and may fail with EINTR.
++-- @param seconds Seconds to wait (optional)
++-- @param nanoseconds Nanoseconds to wait (optional)
++-- @name nixio.nanosleep
++-- @return true
++
++--- Generate events-bitfield or parse revents-bitfield for poll.
++-- @class function
++-- @name nixio.poll_flags
++-- @param mode1 revents-Flag bitfield returned from poll to parse OR
++-- ["in", "out", "err", "pri" (POSIX), "hup" (POSIX), "nval" (POSIX)]
++-- @param ... More mode strings for generating the flag [-"-]
++-- @see nixio.poll
++-- @return table with boolean fields reflecting the mode parameter
++-- <strong>OR</strong> bitfield to use for the events-Flag field
++
++--- Wait for some event on a file descriptor.
++-- poll() sets the revents-field of the tables provided by fds to a bitfield
++-- indicating the events that occured.
++-- @class function
++-- @usage This function works in-place on the provided table and only
++-- writes the revents field, you can use other fields on your demand.
++-- @usage All metamethods on the tables provided as fds are ignored.
++-- @usage The revents-fields are not reset when the call times out.
++-- You have to check the first return value to be 0 to handle this case.
++-- @usage If you want to wait on a TLS-Socket you have to use the underlying
++-- socket instead.
++-- @usage On Windows poll is emulated through select(), can only be used
++-- on socket descriptors and cannot take more than 64 descriptors per call.
++-- @usage This function is not signal-protected and may fail with EINTR.
++-- @param fds Table containing one or more tables containing <ul>
++-- <li> fd = I/O Descriptor [Socket Object, File Object (POSIX)]</li>
++-- <li> events = events to wait for (bitfield generated with poll_flags)</li>
++-- </ul>
++-- @param timeout Timeout in milliseconds
++-- @name nixio.poll
++-- @see nixio.poll_flags
++-- @return number of ready IO descriptors
++-- @return the fds-table with revents-fields set
++
++--- (POSIX) Clone the current process.
++-- @class function
++-- @name nixio.fork
++-- @return the child process id for the parent process, 0 for the child process
++
++--- (POSIX) Send a signal to one or more processes.
++-- @class function
++-- @name nixio.kill
++-- @param target Target process of process group.
++-- @param signal Signal to send
++-- @return true
++
++--- (POSIX) Get the parent process id of the current process.
++-- @class function
++-- @name nixio.getppid
++-- @return parent process id
++
++--- (POSIX) Get the user id of the current process.
++-- @class function
++-- @name nixio.getuid
++-- @return process user id
++
++--- (POSIX) Get the group id of the current process.
++-- @class function
++-- @name nixio.getgid
++-- @return process group id
++
++--- (POSIX) Set the group id of the current process.
++-- @class function
++-- @name nixio.setgid
++-- @param gid New Group ID
++-- @return true
++
++--- (POSIX) Set the user id of the current process.
++-- @class function
++-- @name nixio.setuid
++-- @param gid New User ID
++-- @return true
++
++--- (POSIX) Change priority of current process.
++-- @class function
++-- @name nixio.nice
++-- @param nice Nice Value
++-- @return true
++
++--- (POSIX) Create a new session and set the process group ID.
++-- @class function
++-- @name nixio.setsid
++-- @return session id
++
++--- (POSIX) Wait for a process to change state.
++-- @class function
++-- @name nixio.waitpid
++-- @usage If the "nohang" is given this function becomes non-blocking.
++-- @param pid Process ID (optional, default: any childprocess)
++-- @param flag1 Flag (optional) ["nohang", "untraced", "continued"]
++-- @param ... More Flags [-"-]
++-- @return process id of child or 0 if no child has changed state
++-- @return ["exited", "signaled", "stopped"]
++-- @return [exit code, terminate signal, stop signal]
++
++--- (POSIX) Get process times.
++-- @class function
++-- @name nixio.times
++-- @return Table containing: <ul>
++-- <li>utime = user time</li>
++-- <li>utime = system time</li>
++-- <li>cutime = children user time</li>
++-- <li>cstime = children system time</li>
++-- </ul>
++
++--- (POSIX) Get information about current system and kernel.
++-- @class function
++-- @name nixio.uname
++-- @return Table containing: <ul>
++-- <li>sysname = operating system</li>
++-- <li>nodename = network name (usually hostname)</li>
++-- <li>release = OS release</li>
++-- <li>version = OS version</li>
++-- <li>machine = hardware identifier</li>
++-- </ul>
++
++--- Change the working directory.
++-- @class function
++-- @name nixio.chdir
++-- @param path New working directory
++-- @return true
++
++--- Ignore or use set the default handler for a signal.
++-- @class function
++-- @name nixio.signal
++-- @param signal Signal
++-- @param handler ["ign", "dfl"]
++-- @return true
++
++--- Get the ID of the current process.
++-- @class function
++-- @name nixio.getpid
++-- @return process id
++
++--- Get the current working directory.
++-- @class function
++-- @name nixio.getcwd
++-- @return workign directory
++
++--- Get the current environment table or a specific environment variable.
++-- @class function
++-- @name nixio.getenv
++-- @param variable Variable (optional)
++-- @return environment table or single environment variable
++
++--- Set or unset a environment variable.
++-- @class function
++-- @name nixio.setenv
++-- @usage The environment variable will be unset if value is ommited.
++-- @param variable Variable
++-- @param value Value (optional)
++-- @return true
++
++--- Execute a file to replace the current process.
++-- @class function
++-- @name nixio.exec
++-- @usage The name of the executable is automatically passed as argv[0]
++-- @usage This function does not return on success.
++-- @param executable Executable
++-- @param ... Parameters
++
++--- Invoke the shell and execute a file to replace the current process.
++-- @class function
++-- @name nixio.execp
++-- @usage The name of the executable is automatically passed as argv[0]
++-- @usage This function does not return on success.
++-- @param executable Executable
++-- @param ... Parameters
++
++--- Execute a file with a custom environment to replace the current process.
++-- @class function
++-- @name nixio.exece
++-- @usage The name of the executable is automatically passed as argv[0]
++-- @usage This function does not return on success.
++-- @param executable Executable
++-- @param arguments Argument Table
++-- @param environment Environment Table (optional)
++
++--- Sets the file mode creation mask.
++-- @class function
++-- @name nixio.umask
++-- @param mask New creation mask (see chmod for format specifications)
++-- @return the old umask as decimal mode number
++-- @return the old umask as mode string
++
++--- (Linux) Get overall system statistics.
++-- @class function
++-- @name nixio.sysinfo
++-- @return Table containing: <ul>
++-- <li>uptime = system uptime in seconds</li>
++-- <li>loads = {loadavg1, loadavg5, loadavg15}</li>
++-- <li>totalram = total RAM</li>
++-- <li>freeram = free RAM</li>
++-- <li>sharedram = shared RAM</li>
++-- <li>bufferram = buffered RAM</li>
++-- <li>totalswap = total SWAP</li>
++-- <li>freeswap = free SWAP</li>
++-- <li>procs = number of running processes</li>
++-- </ul>
++
++--- Create a new socket.
++-- @class function
++-- @name nixio.socket
++-- @param domain Domain ["inet", "inet6", "unix"]
++-- @param type Type ["stream", "dgram", "raw"]
++-- @return Socket Object
++
++--- (POSIX) Send data from a file to a socket in kernel-space.
++-- @class function
++-- @name nixio.sendfile
++-- @param socket Socket Object
++-- @param file File Object
++-- @param length Amount of data to send (in Bytes).
++-- @return bytes sent
++
++--- (Linux) Send data from / to a pipe in kernel-space.
++-- @class function
++-- @name nixio.splice
++-- @param fdin Input I/O descriptor
++-- @param fdout Output I/O descriptor
++-- @param length Amount of data to send (in Bytes).
++-- @param flags (optional, bitfield generated by splice_flags)
++-- @see nixio.splice_flags
++-- @return bytes sent
++
++--- (Linux) Generate a flag bitfield for a call to splice.
++-- @class function
++-- @name nixio.splice_flags
++-- @param flag1 First Flag ["move", "nonblock", "more"]
++-- @param ... More flags [-"-]
++-- @see nixio.splice
++-- @return Flag bitfield
++
++--- (POSIX) Open a connection to the system logger.
++-- @class function
++-- @name nixio.openlog
++-- @param ident Identifier
++-- @param flag1 Flag 1 ["cons", "nowait", "pid", "perror", "ndelay", "odelay"]
++-- @param ... More flags [-"-]
++
++--- (POSIX) Close the connection to the system logger.
++-- @class function
++-- @name nixio.closelog
++
++--- (POSIX) Write a message to the system logger.
++-- @class function
++-- @name nixio.syslog
++-- @param priority Priority ["emerg", "alert", "crit", "err", "warning",
++-- "notice", "info", "debug"]
++-- @param message
++
++--- (POSIX) Set the logmask of the system logger for current process.
++-- @class function
++-- @name nixio.setlogmask
++-- @param priority Priority ["emerg", "alert", "crit", "err", "warning",
++-- "notice", "info", "debug"]
++
++--- (POSIX) Encrypt a user password.
++-- @class function
++-- @name nixio.crypt
++-- @param key Key
++-- @param salt Salt
++-- @return password hash
++
++--- (POSIX) Get all or a specific user group.
++-- @class function
++-- @name nixio.getgr
++-- @param group Group ID or groupname (optional)
++-- @return Table containing: <ul>
++-- <li>name = Group Name</li>
++-- <li>gid = Group ID</li>
++-- <li>passwd = Password</li>
++-- <li>mem = {Member #1, Member #2, ...}</li>
++-- </ul>
++
++--- (POSIX) Get all or a specific user account.
++-- @class function
++-- @name nixio.getpw
++-- @param user User ID or username (optional)
++-- @return Table containing: <ul>
++-- <li>name = Name</li>
++-- <li>uid = ID</li>
++-- <li>gid = Group ID</li>
++-- <li>passwd = Password</li>
++-- <li>dir = Home directory</li>
++-- <li>gecos = Information</li>
++-- <li>shell = Shell</li>
++-- </ul>
++
++--- (Linux, Solaris) Get all or a specific shadow password entry.
++-- @class function
++-- @name nixio.getsp
++-- @param user username (optional)
++-- @return Table containing: <ul>
++-- <li>namp = Name</li>
++-- <li>expire = Expiration Date</li>
++-- <li>flag = Flags</li>
++-- <li>inact = Inactivity Date</li>
++-- <li>lstchg = Last change</li>
++-- <li>max = Maximum</li>
++-- <li>min = Minimum</li>
++-- <li>warn = Warning</li>
++-- <li>pwdp = Password Hash</li>
++-- </ul>
++
++--- Create a new TLS context.
++-- @class function
++-- @name nixio.tls
++-- @param mode TLS-Mode ["client", "server"]
++-- @return TLSContext Object
+diff --git a/feeds/luci/libs/luci-lib-nixio/nixio-0.3-1.rockspec b/feeds/luci/libs/luci-lib-nixio/nixio-0.3-1.rockspec
+new file mode 100644
+index 0000000..755cf81
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/nixio-0.3-1.rockspec
+@@ -0,0 +1,37 @@
++package = "nixio"
++version = "0.3-1"
++source = {
++ url = "http://dev.luci.freifunk-halle.net/nixio/nixio-0.3.tar.bz2"
++}
++description = {
++ summary = "System, Networking and I/O library for Lua",
++ detailed = [[
++ Nixio is a multi-platform library offering a wide variety
++ of features such as IPv4, IPv6 and UNIX networking, large file I/O, file
++ system operations, system and process control, POSIX user/group management,
++ basic cryptographical hashing, hmac and TLS support, bit operations and
++ binary conversion.
++ ]],
++ homepage = "http://luci.subsignal.org",
++ license = "Apache 2.0",
++ maintainer = "Steven Barth",
++}
++dependencies = {
++ "lua >= 5.1"
++}
++external_dependencies = {
++ OPENSSL = {
++ header = "openssl/ssl.h",
++ }
++}
++build = {
++ type = "make",
++ build_variables = {
++ NIXIO_LDFLAGS = "-lcrypt -L$(OPENSSL_LIBDIR) -I$(OPENSSL_INCDIR)",
++ LUA_CFLAGS = "$(CFLAGS) -I$(LUA_INCDIR)",
++ },
++ install_variables = {
++ LUA_MODULEDIR = "$(LUADIR)",
++ LUA_LIBRARYDIR = "$(LIBDIR)",
++ },
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/root/lib/upgrade/luci-add-conffiles.sh b/feeds/luci/libs/luci-lib-nixio/root/lib/upgrade/luci-add-conffiles.sh
+new file mode 100644
+index 0000000..77399b9
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/root/lib/upgrade/luci-add-conffiles.sh
+@@ -0,0 +1,16 @@
++add_luci_conffiles()
++{
++ local filelist="$1"
++
++ # save ssl certs
++ if [ -d /etc/nixio ]; then
++ find /etc/nixio -type f >> $filelist
++ fi
++
++ # save uhttpd certs
++ [ -f "/etc/uhttpd.key" ] && echo /etc/uhttpd.key >> $filelist
++ [ -f "/etc/uhttpd.crt" ] && echo /etc/uhttpd.crt >> $filelist
++}
++
++sysupgrade_init_conffiles="$sysupgrade_init_conffiles add_luci_conffiles"
++
+diff --git a/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/fs.lua b/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/fs.lua
+new file mode 100644
+index 0000000..8883835
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/fs.lua
+@@ -0,0 +1,175 @@
++--[[
++nixio - Linux I/O library for lua
++
++Copyright 2009 Steven Barth <steven@midlink.org>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++http://www.apache.org/licenses/LICENSE-2.0
++
++$Id$
++]]--
++
++local table = require "table"
++local nixio = require "nixio"
++local type, ipairs, setmetatable = type, ipairs, setmetatable
++require "nixio.util"
++
++
++module ("nixio.fs", function(m) setmetatable(m, {__index = nixio.fs}) end)
++
++
++function readfile(path, limit)
++ local fd, code, msg = nixio.open(path, "r")
++ local data
++ if not fd then
++ return nil, code, msg
++ end
++
++ data, code, msg = fd:readall(limit)
++
++ fd:close()
++ return data, code, msg
++end
++
++
++function writefile(path, data)
++ local fd, code, msg, stat = nixio.open(path, "w")
++ if not fd then
++ return nil, code, msg
++ end
++
++ stat, code, msg = fd:writeall(data)
++
++ fd:close()
++ return stat, code, msg
++end
++
++function datacopy(src, dest, size)
++ local fdin, code, msg = nixio.open(src, "r")
++ if not fdin then
++ return nil, code, msg
++ end
++
++ local fdout, code, msg = nixio.open(dest, "w")
++ if not fdout then
++ return nil, code, msg
++ end
++
++ local stat, code, msg, sent = fdin:copy(fdout, size)
++ fdin:close()
++ fdout:close()
++
++ return stat, code, msg, sent
++end
++
++function copy(src, dest)
++ local stat, code, msg, res = nixio.fs.lstat(src)
++ if not stat then
++ return nil, code, msg
++ end
++
++ if stat.type == "dir" then
++ if nixio.fs.stat(dest, type) ~= "dir" then
++ res, code, msg = nixio.fs.mkdir(dest)
++ else
++ stat = true
++ end
++ elseif stat.type == "lnk" then
++ res, code, msg = nixio.fs.symlink(nixio.fs.readlink(src), dest)
++ elseif stat.type == "reg" then
++ res, code, msg = datacopy(src, dest)
++ end
++
++ if not res then
++ return nil, code, msg
++ end
++
++ nixio.fs.utimes(dest, stat.atime, stat.mtime)
++
++ if nixio.fs.lchown then
++ nixio.fs.lchown(dest, stat.uid, stat.gid)
++ end
++
++ if stat.type ~= "lnk" then
++ nixio.fs.chmod(dest, stat.modedec)
++ end
++
++ return true
++end
++
++function move(src, dest)
++ local stat, code, msg = nixio.fs.rename(src, dest)
++ if not stat and code == nixio.const.EXDEV then
++ stat, code, msg = copy(src, dest)
++ if stat then
++ stat, code, msg = nixio.fs.unlink(src)
++ end
++ end
++ return stat, code, msg
++end
++
++function mkdirr(dest, mode)
++ if nixio.fs.stat(dest, "type") == "dir" then
++ return true
++ else
++ local stat, code, msg = nixio.fs.mkdir(dest, mode)
++ if not stat and code == nixio.const.ENOENT then
++ stat, code, msg = mkdirr(nixio.fs.dirname(dest), mode)
++ if stat then
++ stat, code, msg = nixio.fs.mkdir(dest, mode)
++ end
++ end
++ return stat, code, msg
++ end
++end
++
++local function _recurse(cb, src, dest)
++ local type = nixio.fs.lstat(src, "type")
++ if type ~= "dir" then
++ return cb(src, dest)
++ else
++ local stat, se, code, msg, s, c, m = true, nixio.const.sep
++ if dest then
++ s, c, m = cb(src, dest)
++ stat, code, msg = stat and s, c or code, m or msg
++ end
++
++ for e in nixio.fs.dir(src) do
++ if dest then
++ s, c, m = _recurse(cb, src .. se .. e, dest .. se .. e)
++ else
++ s, c, m = _recurse(cb, src .. se .. e)
++ end
++ stat, code, msg = stat and s, c or code, m or msg
++ end
++
++ if not dest then -- Postfix
++ s, c, m = cb(src)
++ stat, code, msg = stat and s, c or code, m or msg
++ end
++
++ return stat, code, msg
++ end
++end
++
++function copyr(src, dest)
++ return _recurse(copy, src, dest)
++end
++
++function mover(src, dest)
++ local stat, code, msg = nixio.fs.rename(src, dest)
++ if not stat and code == nixio.const.EXDEV then
++ stat, code, msg = _recurse(copy, src, dest)
++ if stat then
++ stat, code, msg = _recurse(nixio.fs.remove, src)
++ end
++ end
++ return stat, code, msg
++end
++
++function remover(src)
++ return _recurse(nixio.fs.remove, src)
++end
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/util.lua b/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/util.lua
+new file mode 100644
+index 0000000..63d2f62
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/util.lua
+@@ -0,0 +1,270 @@
++--[[
++nixio - Linux I/O library for lua
++
++Copyright 2009 Steven Barth <steven@midlink.org>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++http://www.apache.org/licenses/LICENSE-2.0
++
++$Id$
++]]--
++
++local table = require "table"
++local nixio = require "nixio"
++local getmetatable, assert, pairs, type = getmetatable, assert, pairs, type
++local tostring = tostring
++
++module "nixio.util"
++
++local BUFFERSIZE = nixio.const.buffersize
++local ZIOBLKSIZE = 65536
++local socket = nixio.meta_socket
++local tls_socket = nixio.meta_tls_socket
++local file = nixio.meta_file
++local uname = nixio.uname()
++local ZBUG = uname.sysname == "Linux" and uname.release:sub(1, 3) == "2.4"
++
++function consume(iter, append)
++ local tbl = append or {}
++ if iter then
++ for obj in iter do
++ tbl[#tbl+1] = obj
++ end
++ end
++ return tbl
++end
++
++local meta = {}
++
++function meta.is_socket(self)
++ return (getmetatable(self) == socket)
++end
++
++function meta.is_tls_socket(self)
++ return (getmetatable(self) == tls_socket)
++end
++
++function meta.is_file(self)
++ return (getmetatable(self) == file)
++end
++
++function meta.readall(self, len)
++ local block, code, msg = self:read(len or BUFFERSIZE)
++
++ if not block then
++ return nil, code, msg, ""
++ elseif #block == 0 then
++ return "", nil, nil, ""
++ end
++
++ local data, total = {block}, #block
++
++ while not len or len > total do
++ block, code, msg = self:read(len and (len - total) or BUFFERSIZE)
++
++ if not block then
++ return nil, code, msg, table.concat(data)
++ elseif #block == 0 then
++ break
++ end
++
++ data[#data+1], total = block, total + #block
++ end
++
++ local data = #data > 1 and table.concat(data) or data[1]
++ return data, nil, nil, data
++end
++meta.recvall = meta.readall
++
++function meta.writeall(self, data)
++ data = tostring(data)
++ local sent, code, msg = self:write(data)
++
++ if not sent then
++ return nil, code, msg, 0
++ end
++
++ local total = sent
++
++ while total < #data do
++ sent, code, msg = self:write(data, total)
++
++ if not sent then
++ return nil, code, msg, total
++ end
++
++ total = total + sent
++ end
++
++ return total, nil, nil, total
++end
++meta.sendall = meta.writeall
++
++function meta.linesource(self, limit)
++ limit = limit or BUFFERSIZE
++ local buffer = ""
++ local bpos = 0
++ return function(flush)
++ local line, endp, _
++
++ if flush then
++ line = buffer:sub(bpos + 1)
++ buffer = type(flush) == "string" and flush or ""
++ bpos = 0
++ return line
++ end
++
++ while not line do
++ _, endp, line = buffer:find("(.-)\r?\n", bpos + 1)
++ if line then
++ bpos = endp
++ return line
++ elseif #buffer < limit + bpos then
++ local newblock, code, msg = self:read(limit + bpos - #buffer)
++ if not newblock then
++ return nil, code, msg
++ elseif #newblock == 0 then
++ return nil
++ end
++ buffer = buffer:sub(bpos + 1) .. newblock
++ bpos = 0
++ else
++ return nil, 0
++ end
++ end
++ end
++end
++
++function meta.blocksource(self, bs, limit)
++ bs = bs or BUFFERSIZE
++ return function()
++ local toread = bs
++ if limit then
++ if limit < 1 then
++ return nil
++ elseif limit < toread then
++ toread = limit
++ end
++ end
++
++ local block, code, msg = self:read(toread)
++
++ if not block then
++ return nil, code, msg
++ elseif #block == 0 then
++ return nil
++ else
++ if limit then
++ limit = limit - #block
++ end
++
++ return block
++ end
++ end
++end
++
++function meta.sink(self, close)
++ return function(chunk, src_err)
++ if not chunk and not src_err and close then
++ if self.shutdown then
++ self:shutdown()
++ end
++ self:close()
++ elseif chunk and #chunk > 0 then
++ return self:writeall(chunk)
++ end
++ return true
++ end
++end
++
++function meta.copy(self, fdout, size)
++ local source = self:blocksource(nil, size)
++ local sink = fdout:sink()
++ local sent, chunk, code, msg = 0
++
++ repeat
++ chunk, code, msg = source()
++ sink(chunk, code, msg)
++ sent = chunk and (sent + #chunk) or sent
++ until not chunk
++ return not code and sent or nil, code, msg, sent
++end
++
++function meta.copyz(self, fd, size)
++ local sent, lsent, code, msg = 0
++ local splicable
++
++ if not ZBUG and self:is_file() then
++ local ftype = self:stat("type")
++ if nixio.sendfile and fd:is_socket() and ftype == "reg" then
++ repeat
++ lsent, code, msg = nixio.sendfile(fd, self, size or ZIOBLKSIZE)
++ if lsent then
++ sent = sent + lsent
++ size = size and (size - lsent)
++ end
++ until (not lsent or lsent == 0 or (size and size == 0))
++ if lsent or (not lsent and sent == 0 and
++ code ~= nixio.const.ENOSYS and code ~= nixio.const.EINVAL) then
++ return lsent and sent, code, msg, sent
++ end
++ elseif nixio.splice and not fd:is_tls_socket() and ftype == "fifo" then
++ splicable = true
++ end
++ end
++
++ if nixio.splice and fd:is_file() and not splicable then
++ splicable = not self:is_tls_socket() and fd:stat("type") == "fifo"
++ end
++
++ if splicable then
++ repeat
++ lsent, code, msg = nixio.splice(self, fd, size or ZIOBLKSIZE)
++ if lsent then
++ sent = sent + lsent
++ size = size and (size - lsent)
++ end
++ until (not lsent or lsent == 0 or (size and size == 0))
++ if lsent or (not lsent and sent == 0 and
++ code ~= nixio.const.ENOSYS and code ~= nixio.const.EINVAL) then
++ return lsent and sent, code, msg, sent
++ end
++ end
++
++ return self:copy(fd, size)
++end
++
++if tls_socket then
++ function tls_socket.close(self)
++ return self.socket:close()
++ end
++
++ function tls_socket.getsockname(self)
++ return self.socket:getsockname()
++ end
++
++ function tls_socket.getpeername(self)
++ return self.socket:getpeername()
++ end
++
++ function tls_socket.getsockopt(self, ...)
++ return self.socket:getsockopt(...)
++ end
++ tls_socket.getopt = tls_socket.getsockopt
++
++ function tls_socket.setsockopt(self, ...)
++ return self.socket:setsockopt(...)
++ end
++ tls_socket.setopt = tls_socket.setsockopt
++end
++
++for k, v in pairs(meta) do
++ file[k] = v
++ socket[k] = v
++ if tls_socket then
++ tls_socket[k] = v
++ end
++end
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/Makefile b/feeds/luci/libs/luci-lib-nixio/src/Makefile
+new file mode 100644
+index 0000000..a7e9a77
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/Makefile
+@@ -0,0 +1,120 @@
++OS = Linux
++AXTLS_VERSION = 1.2.1
++AXTLS_DIR = axTLS
++AXTLS_FILE = $(AXTLS_DIR)-$(AXTLS_VERSION).tar.gz
++#NIXIO_TLS ?= openssl
++NIXIO_SHADOW ?= $(shell echo 'int main(void){ return !getspnam("root"); }' | $(CC) $(CFLAGS) -include shadow.h -xc -o/dev/null - 2>/dev/null && echo yes)
++NIXIO_SO = nixio.so
++NIXIO_LDFLAGS = -llua -lm -ldl
++CFLAGS += -std=gnu99
++
++ifeq (,$(findstring Darwin,$(OS)))
++ NIXIO_LDFLAGS += -lcrypt -shared
++else
++ NIXIO_LDFLAGS += -bundle -undefined dynamic_lookup
++ EXTRA_CFLAGS += -D__DARWIN__
++endif
++
++NIXIO_OBJ = nixio.o socket.o sockopt.o bind.o address.o \
++ protoent.o poll.o io.o file.o splice.o process.o \
++ syslog.o bit.o binary.o fs.o user.o \
++ $(if $(NIXIO_TLS),tls-crypto.o tls-context.o tls-socket.o,)
++
++ifeq ($(NIXIO_TLS),axtls)
++ TLS_CFLAGS = -IaxTLS/ssl -IaxTLS/crypto -IaxTLS/config -include axtls-compat.h
++ TLS_DEPENDS = axtls-compat.o
++ NIXIO_OBJ += axtls-compat.o libaxtls.a
++endif
++
++ifeq ($(NIXIO_TLS),openssl)
++ NIXIO_LDFLAGS += -lssl -lcrypto
++endif
++
++ifeq ($(NIXIO_TLS),cyassl)
++ NIXIO_LDFLAGS += -lcyassl
++ TLS_DEPENDS = cyassl-compat.o
++ TLS_CFLAGS = -include cyassl-compat.h
++ NIXIO_OBJ += cyassl-compat.o
++endif
++
++ifeq ($(NIXIO_TLS),)
++ NIXIO_CFLAGS += -DNO_TLS
++endif
++
++ifneq ($(NIXIO_SHADOW),yes)
++ NIXIO_CFLAGS += -DNO_SHADOW
++endif
++
++
++ifeq ($(OS),SunOS)
++ NIXIO_LDFLAGS += -lsocket -lnsl -lsendfile
++endif
++
++ifneq (,$(findstring MINGW,$(OS))$(findstring mingw,$(OS))$(findstring Windows,$(OS)))
++ NIXIO_CROSS_CC:=$(shell which i586-mingw32msvc-cc)
++ifneq (,$(NIXIO_CROSS_CC))
++ CC:=$(NIXIO_CROSS_CC)
++endif
++ NIXIO_OBJ += mingw-compat.o
++ NIXIO_LDFLAGS_POST:=-llua -lssl -lcrypto -lws2_32 -lgdi32
++ FPIC:=
++ EXTRA_CFLAGS += -D_WIN32_WINNT=0x0501
++ LUA_CFLAGS:=
++ NIXIO_SO:=nixio.dll
++ NIXIO_LDFLAGS:=
++endif
++
++
++%.o: %.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(NIXIO_CFLAGS) $(LUA_CFLAGS) $(FPIC) -c -o $@ $<
++
++ifneq ($(NIXIO_TLS),)
++tls-crypto.o: $(TLS_DEPENDS) tls-crypto.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(NIXIO_CFLAGS) $(LUA_CFLAGS) $(FPIC) $(TLS_CFLAGS) -c -o $@ tls-crypto.c
++
++tls-context.o: $(TLS_DEPENDS) tls-context.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(NIXIO_CFLAGS) $(LUA_CFLAGS) $(FPIC) $(TLS_CFLAGS) -c -o $@ tls-context.c
++
++tls-socket.o: $(TLS_DEPENDS) tls-socket.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(NIXIO_CFLAGS) $(LUA_CFLAGS) $(FPIC) $(TLS_CFLAGS) -c -o $@ tls-socket.c
++
++axtls-compat.o: libaxtls.a axtls-compat.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(NIXIO_CFLAGS) $(LUA_CFLAGS) $(FPIC) $(TLS_CFLAGS) -c -o $@ axtls-compat.c
++ mkdir -p dist
++ cp -pR axtls-root/* dist/
++endif
++
++compile: $(NIXIO_OBJ)
++ $(CC) $(LDFLAGS) $(SHLIB_FLAGS) -o $(NIXIO_SO) $(NIXIO_OBJ) $(NIXIO_LDFLAGS) $(NIXIO_LDFLAGS_POST)
++ mkdir -p dist/usr/lib/lua
++ cp $(NIXIO_SO) dist/usr/lib/lua/$(NIXIO_SO)
++
++$(AXTLS_DIR)/.prepared:
++ #rm -rf $(AXTLS_DIR)
++ #tar xvfz $(AXTLS_FILE)
++ cp axtls-config/.config axtls-config/config.h $(AXTLS_DIR)/config
++ touch $@
++
++libaxtls.a: $(AXTLS_DIR)/.prepared
++ $(MAKE) -C $(AXTLS_DIR) CC="$(CC)" CFLAGS="$(CFLAGS) $(EXTRA_CFLAGS) $(FPIC) -Wall -pedantic -I../config -I../ssl -I../crypto" LDFLAGS="$(LDFLAGS)" OS="$(OS)" clean all
++ cp -p $(AXTLS_DIR)/_stage/libaxtls.a src
++ # *************************************************************************
++ #
++ #
++ #
++ # *** WARNING ***
++ # The use of the axTLS cryptographical provider is discouraged!
++ # Please switch to either CyaSSL or OpenSSL.
++ # Support for axTLS might be removed in the near future.
++ #
++ #
++ #
++ #**************************************************************************
++
++clean:
++ rm -f *.o *.so *.a *.dll
++ rm -f $(AXTLS_DIR)/.prepared
++
++install: compile
++ mkdir -p $(DESTDIR)
++ cp -pR dist/* $(DESTDIR)/
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/address.c b/feeds/luci/libs/luci-lib-nixio/src/address.c
+new file mode 100644
+index 0000000..8ab4fa8
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/address.c
+@@ -0,0 +1,567 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <sys/types.h>
++#include <sys/param.h>
++#include <errno.h>
++#include <string.h>
++
++#ifdef __linux__
++
++#include <signal.h>
++#include <setjmp.h>
++#include <unistd.h>
++
++/* setjmp() / longjmp() stuff */
++static jmp_buf nixio__jump_alarm;
++static void nixio__handle_alarm(int sig) { longjmp(nixio__jump_alarm, 1); }
++
++#include <linux/netdevice.h>
++
++/* struct net_device_stats is buggy on amd64, redefine it */
++struct nixio__nds {
++ uint32_t rx_packets;
++ uint32_t tx_packets;
++ uint32_t rx_bytes;
++ uint32_t tx_bytes;
++ uint32_t rx_errors;
++ uint32_t tx_errors;
++ uint32_t rx_dropped;
++ uint32_t tx_dropped;
++ uint32_t multicast;
++ uint32_t collisions;
++
++ uint32_t rx_length_errors;
++ uint32_t rx_over_errors;
++ uint32_t rx_crc_errors;
++ uint32_t rx_frame_errors;
++ uint32_t rx_fifo_errors;
++ uint32_t rx_missed_errors;
++
++ uint32_t tx_aborted_errors;
++ uint32_t tx_carrier_errors;
++ uint32_t tx_fifo_errors;
++ uint32_t tx_heartbeat_errors;
++ uint32_t tx_window_errors;
++
++ uint32_t rx_compressed;
++ uint32_t tx_compressed;
++};
++#endif
++
++#ifndef NI_MAXHOST
++#define NI_MAXHOST 1025
++#endif
++
++/**
++ * address pushing helper
++ */
++int nixio__addr_parse(nixio_addr *addr, struct sockaddr *saddr) {
++ void *baddr;
++
++ addr->family = saddr->sa_family;
++ if (saddr->sa_family == AF_INET) {
++ struct sockaddr_in *inetaddr = (struct sockaddr_in*)saddr;
++ addr->port = ntohs(inetaddr->sin_port);
++ baddr = &inetaddr->sin_addr;
++ } else if (saddr->sa_family == AF_INET6) {
++ struct sockaddr_in6 *inet6addr = (struct sockaddr_in6*)saddr;
++ addr->port = ntohs(inet6addr->sin6_port);
++ baddr = &inet6addr->sin6_addr;
++#ifdef AF_PACKET
++ } else if (saddr->sa_family == AF_PACKET) {
++ struct sockaddr_ll *etheradddr = (struct sockaddr_ll*)saddr;
++ addr->prefix = etheradddr->sll_hatype;
++ addr->port = etheradddr->sll_ifindex;
++ char *c = addr->host;
++ for (size_t i = 0; i < etheradddr->sll_halen; i++) {
++ *c++ = nixio__bin2hex[(etheradddr->sll_addr[i] & 0xf0) >> 4];
++ *c++ = nixio__bin2hex[(etheradddr->sll_addr[i] & 0x0f)];
++ *c++ = ':';
++ }
++ *(c-1) = 0;
++ return 0;
++#endif
++ } else {
++ errno = EAFNOSUPPORT;
++ return -1;
++ }
++
++ if (!inet_ntop(saddr->sa_family, baddr, addr->host, sizeof(addr->host))) {
++ return -1;
++ }
++
++ return 0;
++}
++
++/**
++ * address pulling helper
++ */
++int nixio__addr_write(nixio_addr *addr, struct sockaddr *saddr) {
++ if (addr->family == AF_UNSPEC) {
++ if (strchr(addr->host, ':')) {
++ addr->family = AF_INET6;
++ } else {
++ addr->family = AF_INET;
++ }
++ }
++ if (addr->family == AF_INET) {
++ struct sockaddr_in *inetaddr = (struct sockaddr_in *)saddr;
++ memset(inetaddr, 0, sizeof(struct sockaddr_in));
++
++ if (inet_pton(AF_INET, addr->host, &inetaddr->sin_addr) < 1) {
++ return -1;
++ }
++
++ inetaddr->sin_family = AF_INET;
++ inetaddr->sin_port = htons((uint16_t)addr->port);
++ return 0;
++ } else if (addr->family == AF_INET6) {
++ struct sockaddr_in6 *inet6addr = (struct sockaddr_in6 *)saddr;
++ memset(inet6addr, 0, sizeof(struct sockaddr_in6));
++
++ if (inet_pton(AF_INET6, addr->host, &inet6addr->sin6_addr) < 1) {
++ return -1;
++ }
++
++ inet6addr->sin6_family = AF_INET6;
++ inet6addr->sin6_port = htons((uint16_t)addr->port);
++ return 0;
++ } else {
++ errno = EAFNOSUPPORT;
++ return -1;
++ }
++}
++
++/**
++ * netmask to prefix helper
++ */
++int nixio__addr_prefix(struct sockaddr *saddr) {
++ int prefix = 0;
++ size_t len;
++ uint8_t *addr;
++
++ if (saddr->sa_family == AF_INET) {
++ addr = (uint8_t*)(&((struct sockaddr_in*)saddr)->sin_addr);
++ len = 4;
++ } else if (saddr->sa_family == AF_INET6) {
++ addr = (uint8_t*)(&((struct sockaddr_in6*)saddr)->sin6_addr);
++ len = 16;
++ } else {
++ errno = EAFNOSUPPORT;
++ return -1;
++ }
++
++ for (size_t i = 0; i < len; i++) {
++ if (addr[i] == 0xff) {
++ prefix += 8;
++ } else if (addr[i] == 0x00) {
++ break;
++ } else {
++ for (uint8_t c = addr[i]; c; c <<= 1) {
++ prefix++;
++ }
++ }
++ }
++
++ return prefix;
++}
++
++/**
++ * getaddrinfo(host, family, port)
++ */
++static int nixio_getaddrinfo(lua_State *L) {
++ const char *host = NULL;
++ if (!lua_isnoneornil(L, 1)) {
++ host = luaL_checklstring(L, 1, NULL);
++ }
++ const char *family = luaL_optlstring(L, 2, "any", NULL);
++ const char *port = lua_tolstring(L, 3, NULL);
++
++ struct addrinfo hints, *result, *rp;
++ memset(&hints, 0, sizeof(hints));
++
++ if (!strcmp(family, "any")) {
++ hints.ai_family = AF_UNSPEC;
++ } else if (!strcmp(family, "inet")) {
++ hints.ai_family = AF_INET;
++ } else if (!strcmp(family, "inet6")) {
++ hints.ai_family = AF_INET6;
++ } else {
++ return luaL_argerror(L, 2, "supported values: any, inet, inet6");
++ }
++
++ hints.ai_socktype = 0;
++ hints.ai_protocol = 0;
++
++ int aistat = getaddrinfo(host, port, &hints, &result);
++ if (aistat) {
++ lua_pushnil(L);
++ lua_pushinteger(L, aistat);
++ lua_pushstring(L, gai_strerror(aistat));
++ return 3;
++ }
++
++ /* create socket object */
++ lua_newtable(L);
++ int i = 1;
++
++ for (rp = result; rp != NULL; rp = rp->ai_next) {
++ /* avoid duplicate results */
++#ifndef __WINNT__
++ if (!port && rp->ai_socktype != SOCK_STREAM) {
++ continue;
++ }
++#endif
++
++ if (rp->ai_family == AF_INET || rp->ai_family == AF_INET6) {
++ lua_createtable(L, 0, port ? 4 : 2);
++ if (rp->ai_family == AF_INET) {
++ lua_pushliteral(L, "inet");
++ } else if (rp->ai_family == AF_INET6) {
++ lua_pushliteral(L, "inet6");
++ }
++ lua_setfield(L, -2, "family");
++
++ if (port) {
++ switch (rp->ai_socktype) {
++ case SOCK_STREAM:
++ lua_pushliteral(L, "stream");
++ break;
++ case SOCK_DGRAM:
++ lua_pushliteral(L, "dgram");
++ break;
++ case SOCK_RAW:
++ lua_pushliteral(L, "raw");
++ break;
++ default:
++ lua_pushnil(L);
++ break;
++ }
++ lua_setfield(L, -2, "socktype");
++ }
++
++ nixio_addr addr;
++ if (nixio__addr_parse(&addr, rp->ai_addr)) {
++ freeaddrinfo(result);
++ return nixio__perror_s(L);
++ }
++
++ if (port) {
++ lua_pushinteger(L, addr.port);
++ lua_setfield(L, -2, "port");
++ }
++
++ lua_pushstring(L, addr.host);
++ lua_setfield(L, -2, "address");
++ lua_rawseti(L, -2, i++);
++ }
++ }
++
++ freeaddrinfo(result);
++
++ return 1;
++}
++
++/**
++ * getnameinfo(address, family[, timeout])
++ */
++static int nixio_getnameinfo(lua_State *L) {
++ const char *ip = luaL_checkstring(L, 1);
++ const char *family = luaL_optstring(L, 2, NULL);
++
++#ifdef __linux__
++ struct sigaction sa_new, sa_old;
++ int timeout = luaL_optnumber(L, 3, 0);
++ if (timeout > 0 && timeout < 1000)
++ {
++ sa_new.sa_handler = nixio__handle_alarm;
++ sa_new.sa_flags = 0;
++ sigemptyset(&sa_new.sa_mask);
++ sigaction(SIGALRM, &sa_new, &sa_old);
++
++ /* user timeout exceeded */
++ if (setjmp(nixio__jump_alarm))
++ {
++ sigaction(SIGALRM, &sa_old, NULL);
++
++ lua_pushnil(L);
++ lua_pushinteger(L, EAI_AGAIN);
++ lua_pushstring(L, gai_strerror(EAI_AGAIN));
++
++ return 3;
++ }
++
++ ualarm(timeout * 1000, 0);
++ }
++#endif
++
++ char host[NI_MAXHOST];
++
++ struct sockaddr_storage saddr;
++ nixio_addr addr;
++ memset(&addr, 0, sizeof(addr));
++ strncpy(addr.host, ip, sizeof(addr.host) - 1);
++
++ if (!family) {
++ addr.family = AF_UNSPEC;
++ } else if (!strcmp(family, "inet")) {
++ addr.family = AF_INET;
++ } else if (!strcmp(family, "inet6")) {
++ addr.family = AF_INET6;
++ } else {
++ return luaL_argerror(L, 2, "supported values: inet, inet6");
++ }
++
++ nixio__addr_write(&addr, (struct sockaddr *)&saddr);
++
++ int res = getnameinfo((struct sockaddr *)&saddr,
++ (saddr.ss_family == AF_INET)
++ ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6),
++ host, sizeof(host), NULL, 0, NI_NAMEREQD);
++
++#ifdef __linux__
++ if (timeout > 0 && timeout < 1000)
++ {
++ ualarm(0, 0);
++ sigaction(SIGALRM, &sa_old, NULL);
++ }
++#endif
++
++ if (res) {
++ lua_pushnil(L);
++ lua_pushinteger(L, res);
++ lua_pushstring(L, gai_strerror(res));
++ return 3;
++ } else {
++ lua_pushstring(L, host);
++ return 1;
++ }
++}
++
++/**
++ * getsockname()
++ */
++static int nixio_sock_getsockname(lua_State *L) {
++ int sockfd = nixio__checksockfd(L);
++ struct sockaddr_storage saddr;
++ socklen_t addrlen = sizeof(saddr);
++ nixio_addr addr;
++
++ if (getsockname(sockfd, (struct sockaddr*)&saddr, &addrlen) ||
++ nixio__addr_parse(&addr, (struct sockaddr*)&saddr)) {
++ return nixio__perror_s(L);
++ }
++
++ lua_pushstring(L, addr.host);
++ lua_pushinteger(L, addr.port);
++ return 2;
++}
++
++/**
++ * getpeername()
++ */
++static int nixio_sock_getpeername(lua_State *L) {
++ int sockfd = nixio__checksockfd(L);
++ struct sockaddr_storage saddr;
++ socklen_t addrlen = sizeof(saddr);
++ nixio_addr addr;
++
++ if (getpeername(sockfd, (struct sockaddr*)&saddr, &addrlen) ||
++ nixio__addr_parse(&addr, (struct sockaddr*)&saddr)) {
++ return nixio__perror_s(L);
++ }
++
++ lua_pushstring(L, addr.host);
++ lua_pushinteger(L, addr.port);
++ return 2;
++}
++
++#if defined(__linux__) || defined(BSD)
++#ifdef BSD
++#include <net/if.h>
++#endif
++#include <ifaddrs.h>
++
++static int nixio_getifaddrs(lua_State *L) {
++ nixio_addr addr;
++ struct ifaddrs *ifaddr, *c;
++ if (getifaddrs(&ifaddr) == -1) {
++ return nixio__perror(L);
++ }
++
++ lua_newtable(L);
++ unsigned int i = 1;
++
++ for (c = ifaddr; c; c = c->ifa_next) {
++ lua_newtable(L);
++
++ lua_pushstring(L, c->ifa_name);
++ lua_setfield(L, -2, "name");
++
++ lua_createtable(L, 0, 7);
++ lua_pushboolean(L, c->ifa_flags & IFF_UP);
++ lua_setfield(L, -2, "up");
++
++ lua_pushboolean(L, c->ifa_flags & IFF_BROADCAST);
++ lua_setfield(L, -2, "broadcast");
++
++ lua_pushboolean(L, c->ifa_flags & IFF_LOOPBACK);
++ lua_setfield(L, -2, "loopback");
++
++ lua_pushboolean(L, c->ifa_flags & IFF_POINTOPOINT);
++ lua_setfield(L, -2, "pointtopoint");
++
++ lua_pushboolean(L, c->ifa_flags & IFF_NOARP);
++ lua_setfield(L, -2, "noarp");
++
++ lua_pushboolean(L, c->ifa_flags & IFF_PROMISC);
++ lua_setfield(L, -2, "promisc");
++
++ lua_pushboolean(L, c->ifa_flags & IFF_MULTICAST);
++ lua_setfield(L, -2, "multicast");
++ lua_setfield(L, -2, "flags");
++
++ if (c->ifa_addr) {
++ if (!nixio__addr_parse(&addr, c->ifa_addr)) {
++ lua_pushstring(L, addr.host);
++ lua_setfield(L, -2, "addr");
++ }
++
++ if (c->ifa_addr->sa_family == AF_INET) {
++ lua_pushliteral(L, "inet");
++ } else if (c->ifa_addr->sa_family == AF_INET6) {
++ lua_pushliteral(L, "inet6");
++#ifdef AF_PACKET
++ } else if (c->ifa_addr->sa_family == AF_PACKET) {
++ lua_pushliteral(L, "packet");
++#endif
++ } else {
++ lua_pushliteral(L, "unknown");
++ }
++ lua_setfield(L, -2, "family");
++
++#ifdef __linux__
++ if (c->ifa_addr->sa_family == AF_PACKET) {
++ lua_pushinteger(L, addr.port);
++ lua_setfield(L, -2, "ifindex");
++
++ lua_pushinteger(L, addr.prefix);
++ lua_setfield(L, -2, "hatype");
++ }
++#endif
++ }
++
++#ifdef __linux__
++ if (c->ifa_data && (!c->ifa_addr
++ || c->ifa_addr->sa_family == AF_PACKET)) {
++ if (!c->ifa_addr) {
++ lua_pushliteral(L, "packet");
++ lua_setfield(L, -2, "family");
++ }
++
++ lua_createtable(L, 0, 10);
++ struct nixio__nds *stats = c->ifa_data;
++
++ lua_pushnumber(L, stats->rx_packets);
++ lua_setfield(L, -2, "rx_packets");
++
++ lua_pushnumber(L, stats->tx_packets);
++ lua_setfield(L, -2, "tx_packets");
++
++ lua_pushnumber(L, stats->rx_bytes);
++ lua_setfield(L, -2, "rx_bytes");
++
++ lua_pushnumber(L, stats->tx_bytes);
++ lua_setfield(L, -2, "tx_bytes");
++
++ lua_pushnumber(L, stats->rx_errors);
++ lua_setfield(L, -2, "rx_errors");
++
++ lua_pushnumber(L, stats->tx_errors);
++ lua_setfield(L, -2, "tx_errors");
++
++ lua_pushnumber(L, stats->rx_dropped);
++ lua_setfield(L, -2, "rx_dropped");
++
++ lua_pushnumber(L, stats->tx_dropped);
++ lua_setfield(L, -2, "tx_dropped");
++
++ lua_pushnumber(L, stats->multicast);
++ lua_setfield(L, -2, "multicast");
++
++ lua_pushnumber(L, stats->collisions);
++ lua_setfield(L, -2, "collisions");
++ } else {
++ lua_newtable(L);
++ }
++ lua_setfield(L, -2, "data");
++#endif
++
++ if (c->ifa_netmask && !nixio__addr_parse(&addr, c->ifa_netmask)) {
++ lua_pushstring(L, addr.host);
++ lua_setfield(L, -2, "netmask");
++
++ lua_pushinteger(L, nixio__addr_prefix(c->ifa_netmask));
++ lua_setfield(L, -2, "prefix");
++ }
++
++ if (c->ifa_broadaddr && !nixio__addr_parse(&addr, c->ifa_broadaddr)) {
++ lua_pushstring(L, addr.host);
++ lua_setfield(L, -2, "broadaddr");
++ }
++
++ if (c->ifa_dstaddr && !nixio__addr_parse(&addr, c->ifa_dstaddr)) {
++ lua_pushstring(L, addr.host);
++ lua_setfield(L, -2, "dstaddr");
++ }
++
++ lua_rawseti(L, -2, i++);
++ }
++
++ freeifaddrs(ifaddr);
++ return 1;
++}
++#endif
++
++
++/* module table */
++static const luaL_reg R[] = {
++#if defined(__linux__) || defined(BSD)
++ {"getifaddrs", nixio_getifaddrs},
++#endif
++ {"getaddrinfo", nixio_getaddrinfo},
++ {"getnameinfo", nixio_getnameinfo},
++ {NULL, NULL}
++};
++
++/* object table */
++static const luaL_reg M[] = {
++ {"getsockname", nixio_sock_getsockname},
++ {"getpeername", nixio_sock_getpeername},
++ {NULL, NULL}
++};
++
++void nixio_open_address(lua_State *L) {
++ luaL_register(L, NULL, R);
++
++ lua_pushvalue(L, -2);
++ luaL_register(L, NULL, M);
++ lua_pop(L, 1);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.c b/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.c
+new file mode 100644
+index 0000000..2c5b746
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.c
+@@ -0,0 +1,297 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * Enable a subset of openssl compatible functions. We don't aim to be 100%
++ * compatible - just to be able to do basic ports etc.
++ *
++ * Only really tested on mini_httpd, so I'm not too sure how extensive this
++ * port is.
++ */
++
++#include "config.h"
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdarg.h>
++#include "ssl.h"
++
++static char *key_password = NULL;
++
++void *SSLv23_server_method(void) { return NULL; }
++void *SSLv3_server_method(void) { return NULL; }
++void *TLSv1_server_method(void) { return NULL; }
++void *SSLv23_client_method(void) { return NULL; }
++void *SSLv3_client_method(void) { return NULL; }
++void *TLSv1_client_method(void) { return NULL; }
++void *SSLv23_method(void) { return NULL; }
++void *TLSv1_method(void) { return NULL; }
++
++SSL_CTX * SSL_CTX_new(void *meth)
++{
++ SSL_CTX *ssl_ctx = ssl_ctx_new(SSL_SERVER_VERIFY_LATER, 5);
++ return ssl_ctx;
++}
++
++void SSL_CTX_free(SSL_CTX * ssl_ctx)
++{
++ ssl_ctx_free(ssl_ctx);
++}
++
++SSL * SSL_new(SSL_CTX *ssl_ctx)
++{
++ SSL *ssl;
++
++ ssl = ssl_new(ssl_ctx, -1); /* fd is set later */
++
++ return ssl;
++}
++
++int SSL_set_fd(SSL *s, int fd)
++{
++ s->client_fd = fd;
++ return 1; /* always succeeds */
++}
++
++int SSL_accept(SSL *ssl)
++{
++ ssl->next_state = HS_CLIENT_HELLO;
++ while (ssl_read(ssl, NULL) == SSL_OK)
++ {
++ if (ssl->next_state == HS_CLIENT_HELLO)
++ return 1; /* we're done */
++ }
++
++ return -1;
++}
++
++int SSL_connect(SSL *ssl)
++{
++ SET_SSL_FLAG(SSL_IS_CLIENT);
++ int stat = do_client_connect(ssl);
++ ssl_display_error(stat);
++ return (stat == SSL_OK) ? 1 : -1;
++}
++
++void SSL_free(SSL *ssl)
++{
++ ssl_free(ssl);
++}
++
++int SSL_read(SSL *ssl, void *buf, int num)
++{
++ uint8_t *read_buf;
++ int ret;
++
++ while ((ret = ssl_read(ssl, &read_buf)) == SSL_OK);
++
++ if (ret > SSL_OK)
++ {
++ memcpy(buf, read_buf, ret > num ? num : ret);
++ }
++
++ return ret;
++}
++
++int SSL_write(SSL *ssl, const void *buf, int num)
++{
++ return ssl_write(ssl, buf, num);
++}
++
++int SSL_CTX_use_certificate_file(SSL_CTX *ssl_ctx, const char *file, int type)
++{
++ return (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, file, NULL) == SSL_OK);
++}
++
++int SSL_CTX_use_PrivateKey_file(SSL_CTX *ssl_ctx, const char *file, int type)
++{
++ return (ssl_obj_load(ssl_ctx, SSL_OBJ_RSA_KEY, file, key_password) == SSL_OK);
++}
++
++int SSL_CTX_use_certificate_ASN1(SSL_CTX *ssl_ctx, int len, const uint8_t *d)
++{
++ return (ssl_obj_memory_load(ssl_ctx,
++ SSL_OBJ_X509_CERT, d, len, NULL) == SSL_OK);
++}
++
++int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx,
++ unsigned int sid_ctx_len)
++{
++ return 1;
++}
++
++int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
++{
++ return 1;
++}
++
++int SSL_CTX_use_certificate_chain_file(SSL_CTX *ssl_ctx, const char *file)
++{
++ return (ssl_obj_load(ssl_ctx,
++ SSL_OBJ_X509_CERT, file, NULL) == SSL_OK);
++}
++
++int SSL_shutdown(SSL *ssl)
++{
++ return 1;
++}
++
++/*** get/set session ***/
++SSL_SESSION *SSL_get1_session(SSL *ssl)
++{
++ return (SSL_SESSION *)ssl_get_session_id(ssl); /* note: wrong cast */
++}
++
++int SSL_set_session(SSL *ssl, SSL_SESSION *session)
++{
++ memcpy(ssl->session_id, (uint8_t *)session, SSL_SESSION_ID_SIZE);
++ return 1;
++}
++
++void SSL_SESSION_free(SSL_SESSION *session) { }
++/*** end get/set session ***/
++
++long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
++{
++ return 0;
++}
++
++void SSL_CTX_set_verify(SSL_CTX *ctx, int mode,
++ int (*verify_callback)(int, void *)) {
++ if (mode & SSL_VERIFY_PEER) {
++ ctx->options &= ~SSL_SERVER_VERIFY_LATER;
++ ctx->options |= SSL_CLIENT_AUTHENTICATION;
++ } else {
++ ctx->options |= SSL_SERVER_VERIFY_LATER;
++ ctx->options &= ~SSL_CLIENT_AUTHENTICATION;
++ }
++}
++
++void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth) { }
++
++int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
++ const char *CApath)
++{
++ return 1;
++}
++
++void *SSL_load_client_CA_file(const char *file)
++{
++ return (void *)file;
++}
++
++void SSL_CTX_set_client_CA_list(SSL_CTX *ssl_ctx, void *file)
++{
++
++ ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, (const char *)file, NULL);
++}
++
++void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, void *cb) { }
++
++void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u)
++{
++ key_password = (char *)u;
++}
++
++int SSL_peek(SSL *ssl, void *buf, int num)
++{
++ memcpy(buf, ssl->bm_data, num);
++ return num;
++}
++
++void SSL_set_bio(SSL *ssl, void *rbio, void *wbio) { }
++
++long SSL_get_verify_result(const SSL *ssl)
++{
++ return ssl_handshake_status(ssl);
++}
++
++int SSL_state(SSL *ssl)
++{
++ return 0x03; // ok state
++}
++
++/** end of could do better list */
++
++void *SSL_get_peer_certificate(const SSL *ssl)
++{
++ return &ssl->ssl_ctx->certs[0];
++}
++
++int SSL_clear(SSL *ssl)
++{
++ return 1;
++}
++
++
++int SSL_CTX_check_private_key(const SSL_CTX *ctx)
++{
++ return 1;
++}
++
++int SSL_CTX_set_cipher_list(SSL_CTX *s, const char *str)
++{
++ return 1;
++}
++
++int SSL_get_error(const SSL *ssl, int ret)
++{
++ ssl_display_error(ret);
++ return ret; /* TODO: return proper return code */
++}
++
++void SSL_CTX_set_options(SSL_CTX *ssl_ctx, int option) {}
++int SSL_library_init(void ) { return 1; }
++void SSL_load_error_strings(void ) {}
++void ERR_print_errors_fp(FILE *fp) {}
++
++long SSL_CTX_get_timeout(const SSL_CTX *ssl_ctx) {
++ return CONFIG_SSL_EXPIRY_TIME*3600; }
++long SSL_CTX_set_timeout(SSL_CTX *ssl_ctx, long t) {
++ return SSL_CTX_get_timeout(ssl_ctx); }
++void BIO_printf(FILE *f, const char *format, ...)
++{
++ va_list(ap);
++ va_start(ap, format);
++ vfprintf(f, format, ap);
++ va_end(ap);
++}
++
++void* BIO_s_null(void) { return NULL; }
++FILE *BIO_new(bio_func_type_t func)
++{
++ if (func == BIO_s_null)
++ return fopen("/dev/null", "r");
++ else
++ return NULL;
++}
++
++FILE *BIO_new_fp(FILE *stream, int close_flag) { return stream; }
++int BIO_free(FILE *a) { if (a != stdout && a != stderr) fclose(a); return 1; }
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.h b/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.h
+new file mode 100644
+index 0000000..aee24f5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.h
+@@ -0,0 +1,150 @@
++/*
++ * Copyright (c) 2007, Cameron Rich
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions are met:
++ *
++ * * Redistributions of source code must retain the above copyright notice,
++ * this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright notice,
++ * this list of conditions and the following disclaimer in the documentation
++ * and/or other materials provided with the distribution.
++ * * Neither the name of the axTLS project nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++/*
++ * Enable a subset of openssl compatible functions. We don't aim to be 100%
++ * compatible - just to be able to do basic ports etc.
++ *
++ * Only really tested on mini_httpd, so I'm not too sure how extensive this
++ * port is.
++ */
++
++#include "nixio.h"
++#include "config.h"
++
++#define WITH_AXTLS 1
++#define WITHOUT_OPENSSL 1
++#define SSL_OP_NO_SSLv3 0x02000000L
++#define SSL_OP_NO_SSLv2 0x01000000L
++#define SSL_FILETYPE_PEM 1
++#define SSL_FILETYPE_ASN1 2
++#define SSL_VERIFY_NONE 0x00
++#define SSL_VERIFY_PEER 0x01
++#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02
++#define SSL_VERIFY_CLIENT_ONCE 0x03
++#define MD5_DIGEST_LENGTH 16
++#define SHA_DIGEST_LENGTH 20
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdarg.h>
++#include "ssl.h"
++
++typedef SHA1_CTX SHA_CTX;
++
++void *SSLv23_server_method(void);
++void *SSLv3_server_method(void);
++void *TLSv1_server_method(void);
++void *SSLv23_client_method(void);
++void *SSLv3_client_method(void);
++void *TLSv1_client_method(void);
++void *SSLv23_method(void);
++void *TLSv1_method(void);
++
++
++typedef void * (*ssl_func_type_t)(void);
++typedef void * (*bio_func_type_t)(void);
++
++SSL_CTX * SSL_CTX_new(void *meth);
++void SSL_CTX_free(SSL_CTX * ssl_ctx);
++SSL * SSL_new(SSL_CTX *ssl_ctx);
++int SSL_set_fd(SSL *s, int fd);
++int SSL_accept(SSL *ssl);
++int SSL_connect(SSL *ssl);
++void SSL_free(SSL *ssl);
++int SSL_read(SSL *ssl, void *buf, int num);
++int SSL_write(SSL *ssl, const void *buf, int num);
++int SSL_CTX_use_certificate_file(SSL_CTX *ssl_ctx, const char *file, int type);
++int SSL_CTX_use_PrivateKey_file(SSL_CTX *ssl_ctx, const char *file, int type);
++int SSL_CTX_use_certificate_ASN1(SSL_CTX *ssl_ctx, int len, const uint8_t *d);
++int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx,
++ unsigned int sid_ctx_len);
++int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx);
++int SSL_CTX_use_certificate_chain_file(SSL_CTX *ssl_ctx, const char *file);
++int SSL_shutdown(SSL *ssl);
++
++/*** get/set session ***/
++SSL_SESSION *SSL_get1_session(SSL *ssl);
++int SSL_set_session(SSL *ssl, SSL_SESSION *session);
++void SSL_SESSION_free(SSL_SESSION *session);
++/*** end get/set session ***/
++
++long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg);
++void SSL_CTX_set_verify(SSL_CTX *ctx, int mode,
++ int (*verify_callback)(int, void *));
++
++void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth);
++
++int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
++ const char *CApath);
++
++void *SSL_load_client_CA_file(const char *file);
++
++void SSL_CTX_set_client_CA_list(SSL_CTX *ssl_ctx, void *file);
++
++void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, void *cb);
++
++void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u);
++
++int SSL_peek(SSL *ssl, void *buf, int num);
++
++void SSL_set_bio(SSL *ssl, void *rbio, void *wbio);
++
++long SSL_get_verify_result(const SSL *ssl);
++
++int SSL_state(SSL *ssl);
++
++/** end of could do better list */
++
++void *SSL_get_peer_certificate(const SSL *ssl);
++
++int SSL_clear(SSL *ssl);
++
++
++int SSL_CTX_check_private_key(const SSL_CTX *ctx);
++
++int SSL_CTX_set_cipher_list(SSL_CTX *s, const char *str);
++
++int SSL_get_error(const SSL *ssl, int ret);
++
++void SSL_CTX_set_options(SSL_CTX *ssl_ctx, int option);
++int SSL_library_init(void );
++void SSL_load_error_strings(void );
++void ERR_print_errors_fp(FILE *fp);
++
++long SSL_CTX_get_timeout(const SSL_CTX *ssl_ctx);
++long SSL_CTX_set_timeout(SSL_CTX *ssl_ctx, long t);
++void BIO_printf(FILE *f, const char *format, ...);
++
++void* BIO_s_null(void);
++FILE *BIO_new(bio_func_type_t func);
++
++FILE *BIO_new_fp(FILE *stream, int close_flag);
++int BIO_free(FILE *a);
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/binary.c b/feeds/luci/libs/luci-lib-nixio/src/binary.c
+new file mode 100644
+index 0000000..2c41622
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/binary.c
+@@ -0,0 +1,313 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <stdlib.h>
++
++const char nixio__bin2hex[16] = {
++'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
++};
++
++static unsigned char nixio__b64encode_tbl[] =
++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
++
++static unsigned char nixio__b64decode_tbl[] = {
++ 0x3e, 0xff, 0xff, 0xff, 0x3f, 0x34, 0x35, 0x36,
++ 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff,
++ 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x01,
++ 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
++ 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
++ 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x1b,
++ 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
++ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,
++ 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33
++};
++
++static const uint32_t nixio__crc32_tbl[] = {
++ 0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U,
++ 0x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U,
++ 0xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U,
++ 0x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU,
++ 0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U,
++ 0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U,
++ 0xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U,
++ 0xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU,
++ 0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U,
++ 0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU,
++ 0xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U,
++ 0xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U,
++ 0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U,
++ 0x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU,
++ 0x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU,
++ 0xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U,
++ 0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU,
++ 0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U,
++ 0x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U,
++ 0xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U,
++ 0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU,
++ 0x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U,
++ 0xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U,
++ 0xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU,
++ 0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U,
++ 0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U,
++ 0x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U,
++ 0x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U,
++ 0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U,
++ 0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU,
++ 0x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU,
++ 0x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U,
++ 0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U,
++ 0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU,
++ 0x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU,
++ 0x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U,
++ 0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU,
++ 0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U,
++ 0x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU,
++ 0x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U,
++ 0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU,
++ 0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U,
++ 0x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U,
++ 0x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU,
++ 0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U,
++ 0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U,
++ 0x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U,
++ 0x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U,
++ 0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U,
++ 0xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U,
++ 0x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU,
++ 0x2d02ef8dU
++};
++
++static int nixio_bin_crc32(lua_State *L) {
++ size_t len;
++ const char *buffer = luaL_checklstring(L, 1, &len);
++ uint32_t value = luaL_optinteger(L, 2, 0);
++
++ value = ~value;
++ for (size_t i=0; i<len; i++) {
++ value = nixio__crc32_tbl[(value ^ buffer[i]) & 0xffU ] ^ (value >> 8);
++ }
++
++ lua_pushinteger(L, (int)(value ^ 0xffffffffU));
++ return 1;
++}
++
++static int nixio_bin_hexlify(lua_State *L) {
++ size_t len, lenout;
++ luaL_checktype(L, 1, LUA_TSTRING);
++ const unsigned char *data = (unsigned char*)lua_tolstring(L, 1, &len);
++
++ if (len == 0) {
++ lua_pushvalue(L, 1);
++ return 1;
++ }
++
++ lenout = len * 2;
++ luaL_argcheck(L, lenout > len, 1, "size overflow");
++
++ char *out = malloc(lenout);
++ if (!out) {
++ return luaL_error(L, NIXIO_OOM);
++ }
++
++ for (size_t i=0; i < len; i++) {
++ out[2*i] = nixio__bin2hex[(data[i] & 0xf0) >> 4];
++ out[2*i+1] = nixio__bin2hex[(data[i] & 0x0f)];
++ }
++
++ lua_pushlstring(L, out, lenout);
++ free(out);
++
++ return 1;
++}
++
++
++static int nixio_bin_unhexlify(lua_State *L) {
++ size_t len, lenout;
++ const char *data = luaL_checklstring(L, 1, &len);
++
++ if (len == 0) {
++ lua_pushvalue(L, 1);
++ return 1;
++ } else if (len % 2) {
++ errno = EINVAL;
++ return nixio__perror(L);
++ }
++
++ lenout = len / 2;
++ char *out = malloc(lenout);
++ if (!out) {
++ return luaL_error(L, NIXIO_OOM);
++ }
++
++ for (size_t i=0; i < lenout; i++) {
++ char c = data[2*i];
++ if (c >= '0' && c <= '9') {
++ out[i] = (c - '0') << 4;
++ } else if (c >= 'a' && c <= 'f') {
++ out[i] = (c - 'a' + 10) << 4;
++ } else if (data[2*i] >= 'A' && c <= 'F') {
++ out[i] = (c - 'A' + 10) << 4;
++ } else {
++ free(out);
++ errno = EINVAL;
++ return nixio__perror(L);
++ }
++
++ c = data[2*i+1];
++ if (c >= '0' && c <= '9') {
++ out[i] += c - '0';
++ } else if (c >= 'a' && c <= 'f') {
++ out[i] += c - 'a' + 10;
++ } else if (c >= 'A' && c <= 'F') {
++ out[i] += c - 'A' + 10;
++ } else {
++ free(out);
++ errno = EINVAL;
++ return nixio__perror(L);
++ }
++ }
++
++ lua_pushlstring(L, out, lenout);
++ free(out);
++
++ return 1;
++}
++
++static int nixio_bin_b64encode(lua_State *L) {
++ size_t len, lenout, pad, i;
++ const uint8_t *data = (const uint8_t*)luaL_checklstring(L, 1, &len);
++
++ lenout = len / 3;
++ lenout *= 4;
++
++ pad = len % 3;
++
++ if (len == 0) {
++ lua_pushvalue(L, 1);
++ return 1;
++ } else if (pad) {
++ lenout += 4;
++ }
++
++ luaL_argcheck(L, lenout > len, 1, "size overflow");
++
++ char *out = malloc(lenout);
++ if (!out) {
++ return luaL_error(L, NIXIO_OOM);
++ }
++
++ uint8_t *o = (uint8_t*)out;
++ for (i = 0; i < len; i += 3) {
++ uint32_t cv = (data[i] << 16) | (data[i+1] << 8) | data[i+2];
++ *(o+3) = nixio__b64encode_tbl[ cv & 0x3f];
++ *(o+2) = nixio__b64encode_tbl[(cv >> 6) & 0x3f];
++ *(o+1) = nixio__b64encode_tbl[(cv >> 12) & 0x3f];
++ *o = nixio__b64encode_tbl[(cv >> 18) & 0x3f];
++ o += 4;
++ }
++
++ if (pad) {
++ uint32_t cv = data[len-pad] << 16;
++ *(o-1) = '=';
++ *(o-2) = '=';
++ if (pad == 2) {
++ cv |= data[len-pad+1] << 8;
++ *(o-2) = nixio__b64encode_tbl[(cv >> 6) & 0x3f];
++ }
++ *(o-3) = nixio__b64encode_tbl[(cv >> 12) & 0x3f];
++ *(o-4) = nixio__b64encode_tbl[(cv >> 18) & 0x3f];
++ }
++
++ lua_pushlstring(L, out, lenout);
++ free(out);
++ return 1;
++}
++
++static int nixio_bin_b64decode(lua_State *L) {
++ size_t len, lenout, i;
++ const char *dt = luaL_checklstring(L, 1, &len);
++
++ if (len == 0) {
++ lua_pushvalue(L, 1);
++ return 1;
++ } else if (len % 4) {
++ errno = EINVAL;
++ return nixio__perror(L);
++ }
++
++ lenout = len / 4 * 3;
++
++ unsigned char *out = malloc(lenout);
++ if (!out) {
++ return luaL_error(L, NIXIO_OOM);
++ }
++
++ unsigned char *o = out;
++ for (i = 0; i < len; i += 4) {
++ uint32_t cv = 0;
++ for (int j = 0; j < 4; j++) {
++ unsigned char c = dt[i + j] - 43;
++ if (c > 79 || (c = nixio__b64decode_tbl[c]) == 0xff) {
++ free(out);
++ errno = EINVAL;
++ return nixio__perror(L);
++ }
++
++ cv |= c;
++ if (j != 3) {
++ cv <<= 6;
++ }
++ }
++
++ *(o+2) = (unsigned char)(cv & 0xff);
++ *(o+1) = (unsigned char)((cv >> 8) & 0xff);
++ *o = (unsigned char)((cv >> 16) & 0xff);
++ o += 3;
++ }
++
++ if (dt[len-1] == '=') {
++ lenout--;
++ }
++
++ if (dt[len-2] == '=') {
++ lenout--;
++ }
++
++ lua_pushlstring(L, (char*)out, lenout);
++ free(out);
++ return 1;
++}
++
++/* module table */
++static const luaL_reg R[] = {
++ {"hexlify", nixio_bin_hexlify},
++ {"unhexlify", nixio_bin_unhexlify},
++ {"crc32", nixio_bin_crc32},
++ {"b64encode", nixio_bin_b64encode},
++ {"b64decode", nixio_bin_b64decode},
++ {NULL, NULL}
++};
++
++
++void nixio_open_bin(lua_State *L) {
++ lua_newtable(L);
++ luaL_register(L, NULL, R);
++ lua_setfield(L, -2, "bin");
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/bind.c b/feeds/luci/libs/luci-lib-nixio/src/bind.c
+new file mode 100644
+index 0000000..68e1df8
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/bind.c
+@@ -0,0 +1,293 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <sys/types.h>
++#include <string.h>
++#include <unistd.h>
++#include <errno.h>
++
++
++/**
++ * connect()/bind() shortcut
++ */
++static int nixio__bind_connect(lua_State *L, int do_bind) {
++ const char *host = NULL;
++ if (!lua_isnoneornil(L, 1)) {
++ host = luaL_checklstring(L, 1, NULL);
++ }
++ const char *port = luaL_checklstring(L, 2, NULL);
++ const char *family = luaL_optlstring(L, 3, "any", NULL);
++ const char *socktype = luaL_optlstring(L, 4, "stream", NULL);
++
++ struct addrinfo hints, *result, *rp;
++ memset(&hints, 0, sizeof(hints));
++
++ if (!strcmp(family, "any")) {
++ hints.ai_family = AF_UNSPEC;
++ } else if (!strcmp(family, "inet")) {
++ hints.ai_family = AF_INET;
++ } else if (!strcmp(family, "inet6")) {
++ hints.ai_family = AF_INET6;
++ } else {
++ return luaL_argerror(L, 3, "supported values: any, inet, inet6");
++ }
++
++ if (!strcmp(socktype, "any")) {
++ hints.ai_socktype = 0;
++ } else if (!strcmp(socktype, "stream")) {
++ hints.ai_socktype = SOCK_STREAM;
++ } else if (!strcmp(socktype, "dgram")) {
++ hints.ai_socktype = SOCK_DGRAM;
++ } else {
++ return luaL_argerror(L, 4, "supported values: any, stream, dgram");
++ }
++
++ if (do_bind) {
++ hints.ai_flags |= AI_PASSIVE;
++ }
++
++ hints.ai_protocol = 0;
++
++ int aistat = getaddrinfo(host, port, &hints, &result);
++ if (aistat) {
++ lua_pushnil(L);
++ lua_pushinteger(L, aistat);
++ lua_pushstring(L, gai_strerror(aistat));
++ return 3;
++ }
++
++ /* create socket object */
++ nixio_sock *sock = lua_newuserdata(L, sizeof(nixio_sock));
++ int status = -1, clstat;
++
++ for (rp = result; rp != NULL; rp = rp->ai_next) {
++ sock->fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
++ if (sock->fd == -1) {
++ continue;
++ }
++
++ if (do_bind) {
++ int one = 1;
++ setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR,
++ (char*)&one, sizeof(one));
++ status = bind(sock->fd, rp->ai_addr, rp->ai_addrlen);
++ } else {
++ do {
++ status = connect(sock->fd, rp->ai_addr, rp->ai_addrlen);
++ } while (status == -1 && errno == EINTR);
++ }
++
++ /* on success */
++ if (!status) {
++ sock->domain = rp->ai_family;
++ sock->type = rp->ai_socktype;
++ sock->protocol = rp->ai_protocol;
++ break;
++ }
++
++ do {
++#ifndef __WINNT__
++ clstat = close(sock->fd);
++#else
++ clstat = closesocket(sock->fd);
++#endif
++ } while (clstat == -1 && errno == EINTR);
++ }
++
++ freeaddrinfo(result);
++
++ /* on failure */
++ if (status) {
++ return nixio__perror_s(L);
++ }
++
++ luaL_getmetatable(L, NIXIO_META);
++ lua_setmetatable(L, -2);
++
++ return 1;
++}
++
++/**
++ * bind(host, port, [family=any], [type=any]) shortcut
++ */
++static int nixio_bind(lua_State *L) {
++ return nixio__bind_connect(L, 1);
++}
++
++/**
++ * connect(host, port, [family=any], [type=any]) shortcut
++ */
++static int nixio_connect(lua_State *L) {
++ return nixio__bind_connect(L, 0);
++}
++
++/**
++ * bind()/connect() helper
++ */
++static int nixio_sock__bind_connect(lua_State *L, int do_bind) {
++ nixio_sock *sock = nixio__checksock(L);
++ int status = -1;
++
++ if (sock->domain == AF_INET || sock->domain == AF_INET6) {
++ const char *host = NULL;
++ if (!lua_isnoneornil(L, 2)) {
++ host = luaL_checklstring(L, 2, NULL);
++ }
++ const char *port = luaL_checklstring(L, 3, NULL);
++
++ struct addrinfo hints, *result, *rp;
++
++ memset(&hints, 0, sizeof(hints));
++ hints.ai_family = sock->domain;
++ hints.ai_socktype = sock->type;
++ hints.ai_protocol = sock->protocol;
++
++ if (do_bind) {
++ hints.ai_flags |= AI_PASSIVE;
++ }
++
++ int aistat = getaddrinfo(host, port, &hints, &result);
++ if (aistat) {
++ lua_pushnil(L);
++ lua_pushinteger(L, aistat);
++ lua_pushstring(L, gai_strerror(aistat));
++ return 3;
++ }
++
++ for (rp = result; rp != NULL; rp = rp->ai_next) {
++ if (do_bind) {
++ status = bind(sock->fd, rp->ai_addr, rp->ai_addrlen);
++ } else {
++ do {
++ status = connect(sock->fd, rp->ai_addr, rp->ai_addrlen);
++ } while (status == -1 && errno == EINTR);
++ }
++
++ /* on success */
++ if (!status || errno == EINPROGRESS) {
++ break;
++ }
++ }
++
++ freeaddrinfo(result);
++#ifndef __WINNT__
++ } else if (sock->domain == AF_UNIX) {
++ size_t pathlen;
++ const char *path = luaL_checklstring(L, 2, &pathlen);
++
++ struct sockaddr_un addr;
++ addr.sun_family = AF_UNIX;
++ luaL_argcheck(L, pathlen <= sizeof(addr.sun_path), 2, "out of range");
++ memcpy(addr.sun_path, path, pathlen);
++ socklen_t alen = sizeof(sa_family_t) + pathlen;
++
++ if (do_bind) {
++ status = bind(sock->fd, (struct sockaddr*)&addr, alen);
++ } else {
++ do {
++ status = connect(sock->fd, (struct sockaddr*)&addr, alen);
++ } while (status == -1 && errno == EINTR);
++ }
++#endif
++ } else {
++ return luaL_error(L, "not supported");
++ }
++ return nixio__pstatus_s(L, !status);
++}
++
++/**
++ * bind()
++ */
++static int nixio_sock_bind(lua_State *L) {
++ return nixio_sock__bind_connect(L, 1);
++}
++
++/**
++ * connect()
++ */
++static int nixio_sock_connect(lua_State *L) {
++ return nixio_sock__bind_connect(L, 0);
++}
++
++/**
++ * listen()
++ */
++static int nixio_sock_listen(lua_State *L) {
++ int sockfd = nixio__checksockfd(L);
++ int backlog = luaL_checkinteger(L, 2);
++ return nixio__pstatus_s(L, !listen(sockfd, backlog));
++}
++
++/**
++ * accept()
++ */
++static int nixio_sock_accept(lua_State *L) {
++ nixio_sock *sock = nixio__checksock(L);
++ struct sockaddr_storage saddr;
++ nixio_addr addr;
++ socklen_t saddrlen = sizeof(saddr);
++ int newfd;
++
++ do {
++ newfd = accept(sock->fd, (struct sockaddr *)&saddr, &saddrlen);
++ } while (newfd == -1 && errno == EINTR);
++ if (newfd < 0) {
++ return nixio__perror_s(L);
++ }
++
++ /* create userdata */
++ nixio_sock *clsock = lua_newuserdata(L, sizeof(nixio_sock));
++ luaL_getmetatable(L, NIXIO_META);
++ lua_setmetatable(L, -2);
++
++ memcpy(clsock, sock, sizeof(clsock));
++ clsock->fd = newfd;
++
++ if (!nixio__addr_parse(&addr, (struct sockaddr *)&saddr)) {
++ lua_pushstring(L, addr.host);
++ lua_pushinteger(L, addr.port);
++ return 3;
++ } else {
++ return 1;
++ }
++}
++
++/* module table */
++static const luaL_reg R[] = {
++ {"bind", nixio_bind},
++ {"connect", nixio_connect},
++ {NULL, NULL}
++};
++
++/* object table */
++static const luaL_reg M[] = {
++ {"bind", nixio_sock_bind},
++ {"connect", nixio_sock_connect},
++ {"listen", nixio_sock_listen},
++ {"accept", nixio_sock_accept},
++ {NULL, NULL}
++};
++
++void nixio_open_bind(lua_State *L) {
++ luaL_register(L, NULL, R);
++
++ lua_pushvalue(L, -2);
++ luaL_register(L, NULL, M);
++ lua_pop(L, 1);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/bit.c b/feeds/luci/libs/luci-lib-nixio/src/bit.c
+new file mode 100644
+index 0000000..1b352c5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/bit.c
+@@ -0,0 +1,149 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <stdint.h>
++#include <stdlib.h>
++
++/* 52 bit maximum precision */
++#ifdef NIXIO_DOUBLE
++#define NIXIO_BIT_BMAX 52
++#define NIXIO_BIT_NMAX 0xfffffffffffff
++#else
++#define NIXIO_BIT_BMAX 32
++#define NIXIO_BIT_NMAX 0xffffffff
++#endif
++
++#define NIXIO_BIT_XOP(BIT_XOP) \
++ uint64_t oper = nixio__checknumber(L, 1); \
++ const int args = lua_gettop(L); \
++ \
++ for (int i = 2; i <= args; i++) { \
++ uint64_t oper2 = nixio__checknumber(L, i); \
++ oper BIT_XOP oper2; \
++ } \
++ \
++ nixio__pushnumber(L, oper); \
++ return 1; \
++
++
++static int nixio_bit_or(lua_State *L) {
++ NIXIO_BIT_XOP(|=);
++}
++
++static int nixio_bit_and(lua_State *L) {
++ NIXIO_BIT_XOP(&=);
++}
++
++static int nixio_bit_xor(lua_State *L) {
++ NIXIO_BIT_XOP(^=);
++}
++
++static int nixio_bit_unset(lua_State *L) {
++ NIXIO_BIT_XOP(&= ~);
++}
++
++static int nixio_bit_not(lua_State *L) {
++ nixio__pushnumber(L,
++ (~((uint64_t)nixio__checknumber(L, 1))) & NIXIO_BIT_NMAX);
++ return 1;
++}
++
++static int nixio_bit_shl(lua_State *L) {
++ uint64_t oper = nixio__checknumber(L, 1);
++ oper <<= luaL_checkinteger(L, 2);
++ if (oper > NIXIO_BIT_NMAX) {
++ return luaL_error(L, "arithmetic overflow");
++ } else {
++ nixio__pushnumber(L, oper);
++ return 1;
++ }
++}
++
++static int nixio_bit_ashr(lua_State *L) {
++ int64_t oper = nixio__checknumber(L, 1);
++ nixio__pushnumber(L, oper >> luaL_checkinteger(L, 2));
++ return 1;
++}
++
++static int nixio_bit_shr(lua_State *L) {
++ uint64_t oper = nixio__checknumber(L, 1);
++ nixio__pushnumber(L, oper >> luaL_checkinteger(L, 2));
++ return 1;
++}
++
++static int nixio_bit_div(lua_State *L) {
++ uint64_t oper = luaL_checknumber(L, 1);
++ const int args = lua_gettop(L);
++
++ for (int i = 2; i <= args; i++) {
++ uint64_t oper2 = nixio__checknumber(L, i);
++ oper /= oper2;
++ }
++
++ nixio__pushnumber(L, oper);
++ return 1;
++}
++
++static int nixio_bit_check(lua_State *L) {
++ uint64_t oper = nixio__checknumber(L, 1);
++ uint64_t oper2 = nixio__checknumber(L, 2);
++ lua_pushboolean(L, (oper & oper2) == oper2);
++ return 1;
++}
++
++static int nixio_bit_cast(lua_State *L) {
++ nixio__pushnumber(L, ((uint64_t)nixio__checknumber(L, 1)) & NIXIO_BIT_NMAX);
++ return 1;
++}
++
++static int nixio_bit_swap(lua_State *L) {
++ uint64_t op = nixio__checknumber(L, 1);
++ op = (op >> 24) | ((op >> 8) & 0xff00) | ((op & 0xff00) << 8) | (op << 24);
++ nixio__pushnumber(L, op);
++ return 1;
++}
++
++/* module table */
++static const luaL_reg R[] = {
++ {"bor", nixio_bit_or},
++ {"set", nixio_bit_or},
++ {"band", nixio_bit_and},
++ {"bxor", nixio_bit_xor},
++ {"unset", nixio_bit_unset},
++ {"bnot", nixio_bit_not},
++ {"rshift", nixio_bit_shr},
++ {"arshift", nixio_bit_ashr},
++ {"lshift", nixio_bit_shl},
++ {"div", nixio_bit_div},
++ {"check", nixio_bit_check},
++ {"cast", nixio_bit_cast},
++ {"tobit", nixio_bit_cast},
++ {"bswap", nixio_bit_swap},
++ {NULL, NULL}
++};
++
++void nixio_open_bit(lua_State *L) {
++ lua_newtable(L);
++ luaL_register(L, NULL, R);
++ nixio__pushnumber(L, NIXIO_BIT_BMAX);
++ lua_setfield(L, -2, "bits");
++ nixio__pushnumber(L, NIXIO_BIT_NMAX);
++ lua_setfield(L, -2, "max");
++ lua_setfield(L, -2, "bit");
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.c b/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.c
+new file mode 100644
+index 0000000..a483119
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.c
+@@ -0,0 +1,31 @@
++#include "cyassl-compat.h"
++
++int MD5_Init(MD5_CTX *md5) {
++ InitMd5(md5);
++ return 1;
++}
++
++int MD5_Update(MD5_CTX *md5, void *input, unsigned long sz) {
++ Md5Update(md5, input, (word32)sz);
++ return 1;
++}
++
++int MD5_Final(void *input, MD5_CTX *md5) {
++ Md5Final(md5, input);
++ return 1;
++}
++
++int SHA1_Init(SHA_CTX *sha) {
++ InitSha(sha);
++ return 1;
++}
++
++int SHA1_Update(SHA_CTX *sha, void *input, unsigned long sz) {
++ ShaUpdate(sha, input, (word32)sz);
++ return 1;
++}
++
++int SHA1_Final(void *input, SHA_CTX *sha) {
++ ShaFinal(sha, input);
++ return 1;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.h b/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.h
+new file mode 100644
+index 0000000..b2cdc92
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.h
+@@ -0,0 +1,32 @@
++#define WITH_CYASSL
++#define WITHOUT_OPENSSL
++#include <openssl/ssl.h>
++
++typedef unsigned int word32;
++
++
++#define MD5_DIGEST_LENGTH 16
++typedef struct MD5_CTX {
++ int dummy[24];
++} MD5_CTX;
++
++void InitMd5(MD5_CTX*);
++void Md5Update(MD5_CTX*, void*, word32);
++void Md5Final(MD5_CTX*, void*);
++
++
++#define SHA_DIGEST_LENGTH 20
++typedef struct SHA_CTX {
++ int dummy[24];
++} SHA_CTX;
++
++void InitSha(SHA_CTX*);
++void ShaUpdate(SHA_CTX*, void*, word32);
++void ShaFinal(SHA_CTX*, void*);
++
++int MD5_Init(MD5_CTX *md5);
++int MD5_Update(MD5_CTX *md5, void *input, unsigned long sz);
++int MD5_Final(void *input, MD5_CTX *md5);
++int SHA1_Init(SHA_CTX *md5);
++int SHA1_Update(SHA_CTX *sha, void *input, unsigned long sz);
++int SHA1_Final(void *input, SHA_CTX *sha);
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/file.c b/feeds/luci/libs/luci-lib-nixio/src/file.c
+new file mode 100644
+index 0000000..b86e040
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/file.c
+@@ -0,0 +1,402 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <errno.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include <unistd.h>
++#include <fcntl.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <sys/param.h>
++
++
++static int nixio_open(lua_State *L) {
++ const char *filename = luaL_checklstring(L, 1, NULL);
++ int flags;
++
++ if (lua_isnoneornil(L, 2)) {
++ flags = O_RDONLY;
++ } else if (lua_isnumber(L, 2)) {
++ flags = lua_tointeger(L, 2);
++ } else if (lua_isstring(L, 2)) {
++ const char *str = lua_tostring(L, 2);
++ if (!strcmp(str, "r")) {
++ flags = O_RDONLY;
++ } else if (!strcmp(str, "r+")) {
++ flags = O_RDWR;
++ } else if (!strcmp(str, "w")) {
++ flags = O_WRONLY | O_CREAT | O_TRUNC;
++ } else if (!strcmp(str, "w+")) {
++ flags = O_RDWR | O_CREAT | O_TRUNC;
++ } else if (!strcmp(str, "a")) {
++ flags = O_WRONLY | O_CREAT | O_APPEND;
++ } else if (!strcmp(str, "a+")) {
++ flags = O_RDWR | O_CREAT | O_APPEND;
++ } else {
++ return luaL_argerror(L, 2, "supported values: r, r+, w, w+, a, a+");
++ }
++ } else {
++ return luaL_argerror(L, 2, "open flags or string expected");
++ }
++
++ int fd;
++
++ do {
++ fd = open(filename, flags, nixio__check_mode(L, 3, 0666));
++ } while (fd == -1 && errno == EINTR);
++ if (fd == -1) {
++ return nixio__perror(L);
++ }
++
++ int *udata = lua_newuserdata(L, sizeof(int));
++ if (!udata) {
++ return luaL_error(L, "out of memory");
++ }
++
++ *udata = fd;
++
++ luaL_getmetatable(L, NIXIO_FILE_META);
++ lua_setmetatable(L, -2);
++
++ return 1;
++}
++
++static int nixio_open_flags(lua_State *L) {
++ int mode = 0;
++ const int j = lua_gettop(L);
++ for (int i=1; i<=j; i++) {
++ const char *flag = luaL_checkstring(L, i);
++ if (!strcmp(flag, "append")) {
++ mode |= O_APPEND;
++ } else if (!strcmp(flag, "creat")) {
++ mode |= O_CREAT;
++ } else if (!strcmp(flag, "excl")) {
++ mode |= O_EXCL;
++ } else if (!strcmp(flag, "nonblock") || !strcmp(flag, "ndelay")) {
++#ifndef __WINNT__
++ mode |= O_NONBLOCK;
++#endif
++ } else if (!strcmp(flag, "sync")) {
++#ifndef __WINNT__
++ mode |= O_SYNC;
++#endif
++ } else if (!strcmp(flag, "trunc")) {
++ mode |= O_TRUNC;
++ } else if (!strcmp(flag, "rdonly")) {
++ mode |= O_RDONLY;
++ } else if (!strcmp(flag, "wronly")) {
++ mode |= O_WRONLY;
++ } else if (!strcmp(flag, "rdwr")) {
++ mode |= O_RDWR;
++ } else {
++ return luaL_argerror(L, i, "supported values: append, creat, "
++ "excl, nonblock, ndelay, sync, trunc");
++ }
++ }
++ lua_pushinteger(L, mode);
++ return 1;
++}
++
++static int nixio_dup(lua_State *L) {
++ int oldfd = nixio__checkfd(L, 1);
++ int newfd = (lua_gettop(L) > 1) ? nixio__checkfd(L, 2) : -1;
++ int stat = (newfd == -1) ? dup(oldfd) : dup2(oldfd, newfd);
++
++ if (stat == -1) {
++ return nixio__perror(L);
++ } else {
++ if (newfd == -1) {
++ int *udata = lua_newuserdata(L, sizeof(int));
++ if (!udata) {
++ return luaL_error(L, "out of memory");
++ }
++
++ *udata = stat;
++ luaL_getmetatable(L, NIXIO_FILE_META);
++ lua_setmetatable(L, -2);
++ } else {
++ lua_pushvalue(L, 2);
++ }
++ return 1;
++ }
++}
++
++static int nixio_pipe(lua_State *L) {
++ int pipefd[2], *udata;
++ if (pipe(pipefd)) {
++ return nixio__perror(L);
++ }
++
++ luaL_getmetatable(L, NIXIO_FILE_META);
++ udata = lua_newuserdata(L, sizeof(int));
++ if (!udata) {
++ return luaL_error(L, "out of memory");
++ }
++
++ *udata = pipefd[0];
++ lua_pushvalue(L, -2);
++ lua_setmetatable(L, -2);
++
++
++ udata = lua_newuserdata(L, sizeof(int));
++ if (!udata) {
++ return luaL_error(L, "out of memory");
++ }
++
++ *udata = pipefd[1];
++ lua_pushvalue(L, -3);
++ lua_setmetatable(L, -2);
++
++ return 2;
++}
++
++static int nixio_file_write(lua_State *L) {
++ int fd = nixio__checkfd(L, 1);
++ size_t len;
++ ssize_t sent;
++ const char *data = luaL_checklstring(L, 2, &len);
++
++ if (lua_gettop(L) > 2) {
++ int offset = luaL_optint(L, 3, 0);
++ if (offset) {
++ if (offset < len) {
++ data += offset;
++ len -= offset;
++ } else {
++ len = 0;
++ }
++ }
++
++ unsigned int wlen = luaL_optint(L, 4, len);
++ if (wlen < len) {
++ len = wlen;
++ }
++ }
++
++ do {
++ sent = write(fd, data, len);
++ } while(sent == -1 && errno == EINTR);
++ if (sent >= 0) {
++ lua_pushinteger(L, sent);
++ return 1;
++ } else {
++ return nixio__perror(L);
++ }
++}
++
++static int nixio_file_read(lua_State *L) {
++ int fd = nixio__checkfd(L, 1);
++ char buffer[NIXIO_BUFFERSIZE];
++ uint req = luaL_checkinteger(L, 2);
++ int readc;
++
++ /* We limit the readsize to NIXIO_BUFFERSIZE */
++ req = (req > NIXIO_BUFFERSIZE) ? NIXIO_BUFFERSIZE : req;
++
++ do {
++ readc = read(fd, buffer, req);
++ } while (readc == -1 && errno == EINTR);
++
++ if (readc < 0) {
++ return nixio__perror(L);
++ } else {
++ lua_pushlstring(L, buffer, readc);
++ return 1;
++ }
++}
++
++
++static int nixio_file_seek(lua_State *L) {
++ int fd = nixio__checkfd(L, 1);
++ off_t len = (off_t)nixio__checknumber(L, 2);
++ int whence;
++ const char *whstr = luaL_optlstring(L, 3, "set", NULL);
++ if (!strcmp(whstr, "set")) {
++ whence = SEEK_SET;
++ } else if (!strcmp(whstr, "cur")) {
++ whence = SEEK_CUR;
++ } else if (!strcmp(whstr, "end")) {
++ whence = SEEK_END;
++ } else {
++ return luaL_argerror(L, 3, "supported values: set, cur, end");
++ }
++ len = lseek(fd, len, whence);
++ if (len == -1) {
++ return nixio__perror(L);
++ } else {
++ nixio__pushnumber(L, len);
++ return 1;
++ }
++}
++
++static int nixio_file_tell(lua_State *L) {
++ int fd = nixio__checkfd(L, 1);
++ off_t pos = lseek(fd, 0, SEEK_CUR);
++ if (pos < 0) {
++ return nixio__perror(L);
++ } else {
++ nixio__pushnumber(L, pos);
++ return 1;
++ }
++}
++
++static int nixio_file_stat(lua_State *L) {
++ nixio_stat_t buf;
++ if (fstat(nixio__checkfd(L, 1), &buf)) {
++ return nixio__perror(L);
++ } else {
++ nixio__push_stat(L, &buf);
++ if (lua_isstring(L, 2)) {
++ lua_getfield(L, -1, lua_tostring(L, 2));
++ }
++ return 1;
++ }
++}
++
++static int nixio_file_sync(lua_State *L) {
++ int fd = nixio__checkfd(L, 1);
++ int stat;
++#if (!defined BSD && !defined __WINNT__)
++ int dataonly = lua_toboolean(L, 2);
++ do {
++ stat = (dataonly) ? fdatasync(fd) : fsync(fd);
++ } while (stat == -1 && errno == EINTR);
++ return nixio__pstatus(L, !stat);
++#else
++ do {
++ stat = fsync(fd);
++ } while (stat == -1 && errno == EINTR);
++ return nixio__pstatus(L, !stat);
++#endif
++}
++
++static int nixio_file_lock(lua_State *L) {
++ int fd = nixio__checkfd(L, 1);
++ const char *flag = luaL_checkstring(L, 2);
++ off_t len = (off_t)nixio__optnumber(L, 3, 0);
++ int stat;
++
++ int cmd = 0;
++ if (!strcmp(flag, "lock")) {
++ cmd = F_LOCK;
++ } else if (!strcmp(flag, "tlock")) {
++ cmd = F_TLOCK;
++ } else if (!strcmp(flag, "ulock")) {
++ cmd = F_ULOCK;
++ } else if (!strcmp(flag, "test")) {
++ cmd = F_TEST;
++ } else {
++ return luaL_argerror(L, 2,
++ "supported values: lock, tlock, ulock, test");
++ }
++
++ do {
++ stat = lockf(fd, cmd, len);
++ } while (stat == -1 && errno == EINTR);
++
++ return nixio__pstatus(L, !stat);
++}
++
++static int nixio_file_close(lua_State *L) {
++ int *fdp = luaL_checkudata(L, 1, NIXIO_FILE_META);
++ luaL_argcheck(L, *fdp != -1, 1, "invalid file object");
++ int res;
++ do {
++ res = close(*fdp);
++ } while (res == -1 && errno == EINTR);
++ *fdp = -1;
++ return nixio__pstatus(L, !res);
++}
++
++static int nixio_file__gc(lua_State *L) {
++ int *fdp = luaL_checkudata(L, 1, NIXIO_FILE_META);
++ int res;
++ if (*fdp > 2) {
++ do {
++ res = close(*fdp);
++ } while (res == -1 && errno == EINTR);
++ *fdp = -1;
++ }
++ return 0;
++}
++
++/**
++ * string representation
++ */
++static int nixio_file__tostring(lua_State *L) {
++ lua_pushfstring(L, "nixio file %d", nixio__tofd(L, 1));
++ return 1;
++}
++
++/* method table */
++static const luaL_reg M[] = {
++ {"write", nixio_file_write},
++ {"read", nixio_file_read},
++ {"tell", nixio_file_tell},
++ {"seek", nixio_file_seek},
++ {"stat", nixio_file_stat},
++ {"sync", nixio_file_sync},
++ {"lock", nixio_file_lock},
++ {"close", nixio_file_close},
++ {"__gc", nixio_file__gc},
++ {"__tostring", nixio_file__tostring},
++ {NULL, NULL}
++};
++
++/* module table */
++static const luaL_reg R[] = {
++ {"dup", nixio_dup},
++ {"open", nixio_open},
++ {"open_flags", nixio_open_flags},
++ {"pipe", nixio_pipe},
++ {NULL, NULL}
++};
++
++void nixio_open_file(lua_State *L) {
++ luaL_register(L, NULL, R);
++
++ luaL_newmetatable(L, NIXIO_FILE_META);
++ luaL_register(L, NULL, M);
++ lua_pushvalue(L, -1);
++ lua_setfield(L, -2, "__index");
++
++ int *uin = lua_newuserdata(L, sizeof(int));
++ int *uout = lua_newuserdata(L, sizeof(int));
++ int *uerr = lua_newuserdata(L, sizeof(int));
++
++ if (!uin || !uout || !uerr) {
++ luaL_error(L, "out of memory");
++ }
++
++ *uin = STDIN_FILENO;
++ *uout = STDOUT_FILENO;
++ *uerr = STDERR_FILENO;
++
++ for (int i = -4; i < -1; i++) {
++ lua_pushvalue(L, -4);
++ lua_setmetatable(L, i);
++ }
++
++ lua_setfield(L, -5, "stderr");
++ lua_setfield(L, -4, "stdout");
++ lua_setfield(L, -3, "stdin");
++ lua_setfield(L, -2, "meta_file");
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/fs.c b/feeds/luci/libs/luci-lib-nixio/src/fs.c
+new file mode 100644
+index 0000000..12ca111
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/fs.c
+@@ -0,0 +1,566 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <libgen.h>
++#include <string.h>
++#include <unistd.h>
++#include <limits.h>
++#include <stdlib.h>
++#include <sys/stat.h>
++#include <sys/types.h>
++#include <sys/time.h>
++#include <dirent.h>
++
++/* Reads argument from given index and transforms it into a mode bitfield */
++int nixio__check_mode(lua_State *L, int idx, int def) {
++ if (lua_isnoneornil(L, idx) && def > 0) {
++ return def;
++ } else if (lua_isstring(L, idx) && lua_objlen(L, idx) == 9) {
++ int mode = 0;
++ const char *modestr = lua_tostring(L, idx);
++ int i;
++ for (i=0; i<9; i++) {
++ if (i % 3 == 0) { /* read flags */
++ if (modestr[i] == 'r') {
++ mode |= 1 << (8 - i);
++ } else if (modestr[i] != '-') {
++ break;
++ }
++ } else if (i % 3 == 1) { /* write flags */
++ if (modestr[i] == 'w') {
++ mode |= 1 << (8 - i);
++ } else if (modestr[i] != '-') {
++ break;
++ }
++ } else if (i == 2) {
++ if (modestr[i] == 'x') {
++ mode |= 00100;
++ } else if (modestr[i] == 's') {
++ mode |= 04100;
++ } else if (modestr[i] == 'S') {
++ mode |= 04000;
++ } else if (modestr[i] != '-') {
++ break;
++ }
++ } else if (i == 5) {
++ if (modestr[i] == 'x') {
++ mode |= 00010;
++ } else if (modestr[i] == 's') {
++ mode |= 02010;
++ } else if (modestr[i] == 'S') {
++ mode |= 02000;
++ } else if (modestr[i] != '-') {
++ break;
++ }
++ } else if (i == 8) {
++ if (modestr[i] == 'x') {
++ mode |= 00001;
++ } else if (modestr[i] == 't') {
++ mode |= 01001;
++ } else if (modestr[i] == 'T') {
++ mode |= 01000;
++ } else if (modestr[i] != '-') {
++ break;
++ }
++ }
++ }
++ if (i == 9) { /* successfully parsed */
++ return mode;
++ }
++ } else if (lua_isnumber(L, idx)) {
++ int decmode = lua_tointeger(L, idx);
++ int s = (decmode % 10000) / 1000;
++ int u = (decmode % 1000) / 100;
++ int g = (decmode % 100) / 10;
++ int o = (decmode % 10);
++
++ if (s>=0 && s<=7 && u>=0 && u<=7 && g>=0 && g<=7 && o>=0 && o<=7) {
++ return (s << 9) + (u << 6) + (g << 3) + o;
++ }
++ }
++
++ return luaL_argerror(L, idx, "supported values: [0-7]?[0-7][0-7][0-7], "
++ "[-r][-w][-xsS][-r][-w][-xsS][-r][-w][-xtT]");
++}
++
++/* Transforms a mode into the modestring */
++int nixio__mode_write(int mode, char *modestr) {
++ if (modestr) {
++ modestr[0] = (mode & 00400) ? 'r' : '-';
++ modestr[1] = (mode & 00200) ? 'w' : '-';
++ modestr[2] = ((mode & 04100) == 04100) ? 's' :
++ (mode & 04000) ? 'S' : (mode & 00100) ? 'x' : '-';
++ modestr[3] = (mode & 00040) ? 'r' : '-';
++ modestr[4] = (mode & 00020) ? 'w' : '-';
++ modestr[5] = ((mode & 02010) == 02010) ? 's' :
++ (mode & 02000) ? 'S' : (mode & 00010) ? 'x' : '-';
++ modestr[6] = (mode & 00004) ? 'r' : '-';
++ modestr[7] = (mode & 00002) ? 'w' : '-';
++ modestr[8] = ((mode & 01001) == 01001) ? 't' :
++ (mode & 01000) ? 'T' : (mode & 00001) ? 'x' : '-';
++ }
++
++ return (mode & 00007) + ((mode & 00070) >> 3) * 10 +
++ ((mode & 00700) >> 6) * 100 + ((mode & 07000) >> 9) * 1000;
++}
++
++static int nixio_access(lua_State *L) {
++ const char *path = luaL_checkstring(L, 1);
++ int mode = F_OK;
++
++ for (const char *s = luaL_optstring(L, 2, "f"); *s; s++) {
++ if (*s == 'r') {
++ mode |= R_OK;
++ } else if (*s == 'w') {
++ mode |= W_OK;
++ } else if (*s == 'x') {
++ mode |= X_OK;
++ } else if (*s != 'f') {
++ return luaL_argerror(L, 2, "supported values: [frwx]");
++ }
++ }
++
++ return nixio__pstatus(L, !access(path, mode));
++}
++
++static int nixio_basename(lua_State *L) {
++ const char *path = luaL_checkstring(L, 1);
++ char base[PATH_MAX];
++ base[PATH_MAX-1] = 0;
++
++ strncpy(base, path, PATH_MAX-1);
++ lua_pushstring(L, basename(base));
++ return 1;
++}
++
++static int nixio_dirname(lua_State *L) {
++ const char *path = luaL_checkstring(L, 1);
++ char base[PATH_MAX];
++ base[PATH_MAX-1] = 0;
++
++ strncpy(base, path, PATH_MAX-1);
++ lua_pushstring(L, dirname(base));
++ return 1;
++}
++
++static int nixio_realpath(lua_State *L) {
++ const char *path = luaL_checkstring(L, 1);
++ char real[PATH_MAX];
++
++ if (!realpath(path, real)) {
++ return nixio__perror(L);
++ } else {
++ lua_pushstring(L, real);
++ return 1;
++ }
++}
++
++static int nixio_remove(lua_State *L) {
++ return nixio__pstatus(L, !remove(luaL_checkstring(L, 1)));
++}
++
++static int nixio_unlink(lua_State *L) {
++ return nixio__pstatus(L, !unlink(luaL_checkstring(L, 1)));
++}
++
++static int nixio_rename(lua_State *L) {
++ return nixio__pstatus(L,
++ !rename(luaL_checkstring(L, 1), luaL_checkstring(L, 2)));
++}
++
++static int nixio_rmdir(lua_State *L) {
++ return nixio__pstatus(L, !rmdir(luaL_checkstring(L, 1)));
++}
++
++static int nixio_mkdir(lua_State *L) {
++ return nixio__pstatus(L,
++ !mkdir(luaL_checkstring(L, 1), nixio__check_mode(L, 2, 0777)));
++}
++
++static int nixio_chmod(lua_State *L) {
++ return nixio__pstatus(L,
++ !chmod(luaL_checkstring(L, 1), nixio__check_mode(L, 2, -1)));
++}
++
++static int nixio_dir__gc(lua_State *L) {
++ DIR **dirp = lua_touserdata(L, 1);
++ if (dirp && *dirp) {
++ closedir(*dirp);
++ *dirp = NULL;
++ }
++ return 0;
++}
++
++static int nixio_dir__iter(lua_State *L) {
++ DIR **dirp = lua_touserdata(L, lua_upvalueindex(1));
++ struct dirent *entry;
++ const char *n = NULL;
++
++ if (*dirp) {
++ do {
++ entry = readdir(*dirp);
++ n = (entry) ? entry->d_name : NULL;
++ } while(n && n[0] == '.' && (n[1] == 0 || (n[1] == '.' && n[2] == 0)));
++ }
++
++ if (n) {
++ lua_pushstring(L, n);
++ } else {
++ if (*dirp) {
++ closedir(*dirp);
++ *dirp = NULL;
++ }
++ lua_pushnil(L);
++ }
++
++ return 1;
++}
++
++static int nixio_dir(lua_State *L) {
++ const char *path = luaL_optstring(L, 1, ".");
++ DIR **dirp = lua_newuserdata(L, sizeof(DIR *));
++
++ *dirp = opendir(path);
++ if (!*dirp) {
++ return nixio__perror(L);
++ } else {
++ luaL_getmetatable(L, NIXIO_DIR_META);
++ lua_setmetatable(L, -2);
++ lua_pushcclosure(L, nixio_dir__iter, 1);
++ return 1;
++ }
++}
++
++static int nixio_link(lua_State *L) {
++ return nixio__pstatus(L,
++ !link(luaL_checkstring(L, 1), luaL_checkstring(L, 2)));
++}
++
++static int nixio_utimes(lua_State *L) {
++ const char *path = luaL_checkstring(L, 1);
++ if (lua_gettop(L) < 2 || (lua_isnoneornil(L, 2) && lua_isnoneornil(L, 3))) {
++ return nixio__pstatus(L, !utimes(path, NULL));
++ } else {
++ double atime = nixio__checknumber(L, 2);
++ double mtime = nixio__optnumber(L, 3, atime);
++ struct timeval times[2];
++
++ times[0].tv_sec = atime;
++ times[0].tv_usec = 0;
++ times[1].tv_sec = mtime;
++ times[1].tv_usec = 0;
++
++ return nixio__pstatus(L, !utimes(path, times));
++ }
++}
++
++int nixio__push_stat(lua_State *L, nixio_stat_t *buf) {
++ lua_createtable(L, 0, 15);
++
++ lua_pushinteger(L, buf->st_dev);
++ lua_setfield(L, -2, "dev");
++
++ lua_pushinteger(L, buf->st_ino);
++ lua_setfield(L, -2, "ino");
++
++ if (S_ISREG(buf->st_mode)) {
++ lua_pushliteral(L, "reg");
++ } else if (S_ISDIR(buf->st_mode)) {
++ lua_pushliteral(L, "dir");
++ } else if (S_ISCHR(buf->st_mode)) {
++ lua_pushliteral(L, "chr");
++ } else if (S_ISBLK(buf->st_mode)) {
++ lua_pushliteral(L, "blk");
++ } else if (S_ISFIFO(buf->st_mode)) {
++ lua_pushliteral(L, "fifo");
++ } else if (S_ISLNK(buf->st_mode)) {
++ lua_pushliteral(L, "lnk");
++ } else if (S_ISSOCK(buf->st_mode)) {
++ lua_pushliteral(L, "sock");
++ } else {
++ lua_pushliteral(L, "unknown");
++ }
++ lua_setfield(L, -2, "type");
++
++ char modestr[9];
++ lua_pushinteger(L, nixio__mode_write(buf->st_mode, modestr));
++ lua_setfield(L, -2, "modedec");
++
++ lua_pushlstring(L, modestr, 9);
++ lua_setfield(L, -2, "modestr");
++
++ lua_pushinteger(L, buf->st_nlink);
++ lua_setfield(L, -2, "nlink");
++
++ lua_pushinteger(L, buf->st_uid);
++ lua_setfield(L, -2, "uid");
++
++ lua_pushinteger(L, buf->st_gid);
++ lua_setfield(L, -2, "gid");
++
++ lua_pushinteger(L, buf->st_rdev);
++ lua_setfield(L, -2, "rdev");
++
++ nixio__pushnumber(L, buf->st_size);
++ lua_setfield(L, -2, "size");
++
++ lua_pushinteger(L, buf->st_atime);
++ lua_setfield(L, -2, "atime");
++
++ lua_pushinteger(L, buf->st_mtime);
++ lua_setfield(L, -2, "mtime");
++
++ lua_pushinteger(L, buf->st_ctime);
++ lua_setfield(L, -2, "ctime");
++
++#ifndef __WINNT__
++ lua_pushinteger(L, buf->st_blksize);
++ lua_setfield(L, -2, "blksize");
++
++ lua_pushinteger(L, buf->st_blocks);
++ lua_setfield(L, -2, "blocks");
++#endif
++
++ return 1;
++}
++
++static int nixio_stat(lua_State *L) {
++ nixio_stat_t buf;
++ if (stat(luaL_checkstring(L, 1), &buf)) {
++ return nixio__perror(L);
++ } else {
++ nixio__push_stat(L, &buf);
++ if (lua_isstring(L, 2)) {
++ lua_getfield(L, -1, lua_tostring(L, 2));
++ }
++ return 1;
++ }
++}
++
++static int nixio_lstat(lua_State *L) {
++ nixio_stat_t buf;
++ if (stat(luaL_checkstring(L, 1), &buf)) {
++ return nixio__perror(L);
++ } else {
++ nixio__push_stat(L, &buf);
++ if (lua_isstring(L, 2)) {
++ lua_getfield(L, -1, lua_tostring(L, 2));
++ }
++ return 1;
++ }
++}
++
++#ifndef __WINNT__
++
++static int nixio_chown(lua_State *L) {
++ return nixio__pstatus(L,
++ !chown(
++ luaL_checkstring(L, 1),
++ lua_isnoneornil(L, 2) ? -1 : nixio__check_user(L, 2),
++ lua_isnoneornil(L, 3) ? -1 : nixio__check_group(L, 3)
++ )
++ );
++}
++
++static int nixio_lchown(lua_State *L) {
++ return nixio__pstatus(L,
++ !lchown(
++ luaL_checkstring(L, 1),
++ lua_isnoneornil(L, 2) ? -1 : nixio__check_user(L, 2),
++ lua_isnoneornil(L, 3) ? -1 : nixio__check_group(L, 3)
++ )
++ );
++}
++
++static int nixio_mkfifo(lua_State *L) {
++ return nixio__pstatus(L,
++ !mkfifo(luaL_checkstring(L, 1), nixio__check_mode(L, 2, -1)));
++}
++
++static int nixio_symlink(lua_State *L) {
++ return nixio__pstatus(L,
++ !symlink(luaL_checkstring(L, 1), luaL_checkstring(L, 2)));
++}
++
++static int nixio_readlink(lua_State *L) {
++ char dest[PATH_MAX];
++ ssize_t res = readlink(luaL_checkstring(L, 1), dest, sizeof(dest));
++ if (res < 0) {
++ return nixio__perror(L);
++ } else {
++ lua_pushlstring(L, dest, res);
++ return 1;
++ }
++}
++
++#include <glob.h>
++
++typedef struct {
++ glob_t gl;
++ size_t pos;
++ int freed;
++} nixio_glob_t;
++
++static int nixio_glob__iter(lua_State *L) {
++ nixio_glob_t *globres = lua_touserdata(L, lua_upvalueindex(1));
++ if (!globres->freed && globres->pos < globres->gl.gl_pathc) {
++ lua_pushstring(L, globres->gl.gl_pathv[(globres->pos)++]);
++ } else {
++ if (!globres->freed) {
++ globfree(&globres->gl);
++ globres->freed = 1;
++ }
++ lua_pushnil(L);
++ }
++ return 1;
++}
++
++static int nixio_glob__gc(lua_State *L) {
++ nixio_glob_t *globres = lua_touserdata(L, 1);
++ if (globres && !globres->freed) {
++ globres->freed = 1;
++ globfree(&globres->gl);
++ }
++ return 0;
++}
++
++static int nixio_glob(lua_State *L) {
++ const char *pattern = luaL_optstring(L, 1, "*");
++ nixio_glob_t *globres = lua_newuserdata(L, sizeof(nixio_glob_t));
++ if (!globres) {
++ return luaL_error(L, NIXIO_OOM);
++ }
++ globres->pos = 0;
++ globres->freed = 0;
++
++ int globstat = glob(pattern, 0, NULL, &globres->gl);
++ if (globstat == GLOB_NOMATCH) {
++ lua_pushcfunction(L, nixio__nulliter);
++ lua_pushinteger(L, 0);
++ } else if (globstat) {
++ return nixio__perror(L);
++ } else {
++ luaL_getmetatable(L, NIXIO_GLOB_META);
++ lua_setmetatable(L, -2);
++ lua_pushcclosure(L, nixio_glob__iter, 1);
++ lua_pushinteger(L, globres->gl.gl_pathc);
++ }
++ return 2;
++}
++
++#include <sys/statvfs.h>
++
++static int nixio__push_statvfs(lua_State *L, struct statvfs *buf) {
++ lua_createtable(L, 0, 12);
++
++ nixio__pushnumber(L, buf->f_bavail);
++ lua_setfield(L, -2, "bavail");
++
++ nixio__pushnumber(L, buf->f_bfree);
++ lua_setfield(L, -2, "bfree");
++
++ nixio__pushnumber(L, buf->f_blocks);
++ lua_setfield(L, -2, "blocks");
++
++ nixio__pushnumber(L, buf->f_bsize);
++ lua_setfield(L, -2, "bsize");
++
++ nixio__pushnumber(L, buf->f_frsize);
++ lua_setfield(L, -2, "frsize");
++
++ nixio__pushnumber(L, buf->f_favail);
++ lua_setfield(L, -2, "favail");
++
++ nixio__pushnumber(L, buf->f_ffree);
++ lua_setfield(L, -2, "ffree");
++
++ nixio__pushnumber(L, buf->f_files);
++ lua_setfield(L, -2, "files");
++
++ nixio__pushnumber(L, buf->f_flag);
++ lua_setfield(L, -2, "flag");
++
++ nixio__pushnumber(L, buf->f_fsid);
++ lua_setfield(L, -2, "fsid");
++
++ nixio__pushnumber(L, buf->f_namemax);
++ lua_setfield(L, -2, "namemax");
++
++ return 1;
++}
++
++static int nixio_statvfs(lua_State *L) {
++ struct statvfs buf;
++ if (statvfs(luaL_optstring(L, 1, "."), &buf)) {
++ return nixio__perror(L);
++ } else {
++ return nixio__push_statvfs(L, &buf);
++ }
++}
++
++#endif /* !__WINNT__ */
++
++
++
++/* module table */
++static const luaL_reg R[] = {
++#ifndef __WINNT__
++ {"glob", nixio_glob},
++ {"mkfifo", nixio_mkfifo},
++ {"symlink", nixio_symlink},
++ {"readlink", nixio_readlink},
++ {"chown", nixio_chown},
++ {"lchown", nixio_lchown},
++ {"statvfs", nixio_statvfs},
++#endif
++ {"chmod", nixio_chmod},
++ {"access", nixio_access},
++ {"basename", nixio_basename},
++ {"dir", nixio_dir},
++ {"dirname", nixio_dirname},
++ {"realpath", nixio_realpath},
++ {"mkdir", nixio_mkdir},
++ {"rmdir", nixio_rmdir},
++ {"link", nixio_link},
++ {"unlink", nixio_unlink},
++ {"utimes", nixio_utimes},
++ {"rename", nixio_rename},
++ {"remove", nixio_remove},
++ {"stat", nixio_stat},
++ {"lstat", nixio_lstat},
++ {NULL, NULL}
++};
++
++void nixio_open_fs(lua_State *L) {
++ lua_newtable(L);
++ luaL_register(L, NULL, R);
++ lua_setfield(L, -2, "fs");
++
++ luaL_newmetatable(L, NIXIO_DIR_META);
++ lua_pushcfunction(L, nixio_dir__gc);
++ lua_setfield(L, -2, "__gc");
++ lua_pop(L, 1);
++
++#ifndef __WINNT__
++ luaL_newmetatable(L, NIXIO_GLOB_META);
++ lua_pushcfunction(L, nixio_glob__gc);
++ lua_setfield(L, -2, "__gc");
++ lua_pop(L, 1);
++#endif
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/io.c b/feeds/luci/libs/luci-lib-nixio/src/io.c
+new file mode 100644
+index 0000000..12d5c7d
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/io.c
+@@ -0,0 +1,225 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <errno.h>
++#include <string.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <sys/types.h>
++
++
++/**
++ * send() / sendto() helper
++ */
++static int nixio_sock__sendto(lua_State *L, int to) {
++ nixio_sock *sock = nixio__checksock(L);
++ struct sockaddr_storage addr_in;
++#ifndef __WINNT__
++ struct sockaddr_un addr_un;
++#endif
++ struct sockaddr *addr = NULL;
++ socklen_t alen = 0;
++ int argoff = 2;
++
++ if (to) {
++ argoff += 2;
++ if (sock->domain == AF_INET || sock->domain == AF_INET6) {
++ const char *address = luaL_checkstring(L, 3);
++ addr = (struct sockaddr*)&addr_in;
++ alen = sizeof(addr_in);
++
++ nixio_addr naddr;
++ memset(&naddr, 0, sizeof(naddr));
++ strncpy(naddr.host, address, sizeof(naddr.host) - 1);
++ naddr.port = (uint16_t)luaL_checkinteger(L, 4);
++ naddr.family = sock->domain;
++
++ if (nixio__addr_write(&naddr, addr)) {
++ return nixio__perror_s(L);
++ }
++ }
++
++#ifndef __WINNT__
++ else if (sock->domain == AF_UNIX) {
++ size_t pathlen;
++ const char *path = luaL_checklstring(L, 3, &pathlen);
++
++ addr_un.sun_family = AF_UNIX;
++ luaL_argcheck(L, pathlen <= sizeof(addr_un.sun_path), 3, "out of range");
++ memcpy(addr_un.sun_path, path, pathlen);
++
++ addr = (struct sockaddr*)&addr_un;
++ alen = sizeof(sa_family_t) + pathlen;
++ }
++#endif
++ }
++
++ size_t len;
++ ssize_t sent;
++ const char *data = luaL_checklstring(L, 2, &len);
++
++ if (lua_gettop(L) > argoff) {
++ int offset = luaL_optint(L, argoff + 1, 0);
++ if (offset) {
++ if (offset < len) {
++ data += offset;
++ len -= offset;
++ } else {
++ len = 0;
++ }
++ }
++
++ unsigned int wlen = luaL_optint(L, argoff + 2, len);
++ if (wlen < len) {
++ len = wlen;
++ }
++ }
++
++ do {
++ sent = sendto(sock->fd, data, len, 0, addr, alen);
++ } while(sent == -1 && errno == EINTR);
++ if (sent >= 0) {
++ lua_pushinteger(L, sent);
++ return 1;
++ } else {
++ return nixio__perror_s(L);
++ }
++}
++
++/**
++ * send(data)
++ */
++static int nixio_sock_send(lua_State *L) {
++ return nixio_sock__sendto(L, 0);
++}
++
++/**
++ * sendto(data, address, port)
++ */
++static int nixio_sock_sendto(lua_State *L) {
++ return nixio_sock__sendto(L, 1);
++}
++
++
++/**
++ * recv() / recvfrom() helper
++ */
++static int nixio_sock__recvfrom(lua_State *L, int from) {
++ nixio_sock *sock = nixio__checksock(L);
++ char buffer[NIXIO_BUFFERSIZE];
++ struct sockaddr_storage addr_in;
++#ifndef __WINNT__
++ struct sockaddr_un addr_un;
++#endif
++ struct sockaddr *addr = NULL;
++ socklen_t alen = 0;
++ uint req = luaL_checkinteger(L, 2);
++ int readc;
++
++ if (sock->domain == AF_INET || sock->domain == AF_INET6) {
++ addr = (from) ? (struct sockaddr*)&addr_in : NULL;
++ alen = (from) ? sizeof(addr_in) : 0;
++ }
++#ifndef __WINNT__
++ else if (sock->domain == AF_UNIX) {
++ addr = (from) ? (struct sockaddr*)&addr_un : NULL;
++ alen = (from) ? sizeof(addr_un) : 0;
++ }
++#endif
++
++ /* We limit the readsize to NIXIO_BUFFERSIZE */
++ req = (req > NIXIO_BUFFERSIZE) ? NIXIO_BUFFERSIZE : req;
++
++ do {
++ readc = recvfrom(sock->fd, buffer, req, 0, addr, &alen);
++ } while (readc == -1 && errno == EINTR);
++
++#ifdef __WINNT__
++ if (readc < 0) {
++ int e = WSAGetLastError();
++ if (e == WSAECONNRESET || e == WSAECONNABORTED || e == WSAESHUTDOWN) {
++ readc = 0;
++ }
++ }
++#endif
++
++ if (readc < 0) {
++ return nixio__perror_s(L);
++ } else {
++ lua_pushlstring(L, buffer, readc);
++
++ if (!from) {
++ return 1;
++ }
++ /* push address. */
++ if (sock->domain == AF_INET || sock->domain == AF_INET6) {
++ nixio_addr naddr;
++ if (!nixio__addr_parse(&naddr, (struct sockaddr *)&addr_in)) {
++ lua_pushstring(L, naddr.host);
++ lua_pushinteger(L, naddr.port);
++ return 3;
++ } else {
++ return 1;
++ }
++ }
++#ifndef __WINNT__
++ else if (sock->domain == AF_UNIX && alen > sizeof(sa_family_t)) {
++ /* if first char is non-null then the path is not in the
++ abstract namespace and alen includes the trailing null */
++ if (addr_un.sun_path[0])
++ --alen;
++ lua_pushlstring(L, addr_un.sun_path, alen - sizeof(sa_family_t));
++ return 2;
++ }
++#endif
++ }
++ return 1;
++}
++
++/**
++ * recv(count)
++ */
++static int nixio_sock_recv(lua_State *L) {
++ return nixio_sock__recvfrom(L, 0);
++}
++
++/**
++ * recvfrom(count)
++ */
++static int nixio_sock_recvfrom(lua_State *L) {
++ return nixio_sock__recvfrom(L, 1);
++}
++
++
++/* module table */
++static const luaL_reg M[] = {
++ {"send", nixio_sock_send},
++ {"sendto", nixio_sock_sendto},
++ {"recv", nixio_sock_recv},
++ {"recvfrom",nixio_sock_recvfrom},
++ {"write", nixio_sock_send},
++ {"read", nixio_sock_recv},
++ {NULL, NULL}
++};
++
++void nixio_open_io(lua_State *L) {
++ lua_pushvalue(L, -2);
++ luaL_register(L, NULL, M);
++ lua_pop(L, 1);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.c b/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.c
+new file mode 100644
+index 0000000..02be504
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.c
+@@ -0,0 +1,220 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <string.h>
++#include <fcntl.h>
++#include <errno.h>
++#include <sys/locking.h>
++#include <sys/time.h>
++#include <sys/utime.h>
++
++void nixio_open__mingw(lua_State *L) {
++ _fmode = _O_BINARY;
++
++ WSADATA wsa;
++
++ if (WSAStartup(MAKEWORD(2, 2), &wsa)) {
++ luaL_error(L, "Unable to initialize Winsock");
++ }
++
++ lua_newtable(L);
++
++ NIXIO_WSA_CONSTANT(WSAEACCES);
++ NIXIO_WSA_CONSTANT(WSAEINTR);
++ NIXIO_WSA_CONSTANT(WSAEINVAL);
++ NIXIO_WSA_CONSTANT(WSAEBADF);
++ NIXIO_WSA_CONSTANT(WSAEFAULT);
++ NIXIO_WSA_CONSTANT(WSAEMFILE);
++ NIXIO_WSA_CONSTANT(WSAENAMETOOLONG);
++ NIXIO_WSA_CONSTANT(WSAELOOP);
++ NIXIO_WSA_CONSTANT(WSAEAFNOSUPPORT);
++ NIXIO_WSA_CONSTANT(WSAENOBUFS);
++ NIXIO_WSA_CONSTANT(WSAEPROTONOSUPPORT);
++ NIXIO_WSA_CONSTANT(WSAENOPROTOOPT);
++ NIXIO_WSA_CONSTANT(WSAEADDRINUSE);
++ NIXIO_WSA_CONSTANT(WSAENETDOWN);
++ NIXIO_WSA_CONSTANT(WSAENETUNREACH);
++ NIXIO_WSA_CONSTANT(WSAECONNABORTED);
++ NIXIO_WSA_CONSTANT(WSAECONNRESET);
++
++ lua_setfield(L, -2, "const_sock");
++}
++
++const char* nixio__mgw_inet_ntop
++(int af, const void *src, char *dst, socklen_t size) {
++ struct sockaddr_storage saddr;
++ memset(&saddr, 0, sizeof(saddr));
++
++ DWORD hostlen = size, sl;
++ if (af == AF_INET) {
++ struct sockaddr_in *saddr4 = (struct sockaddr_in *)&saddr;
++ memcpy(&saddr4->sin_addr, src, sizeof(saddr4->sin_addr));
++ saddr4->sin_family = AF_INET;
++ saddr4->sin_port = 0;
++ sl = sizeof(struct sockaddr_in);
++ } else if (af == AF_INET6) {
++ struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)&saddr;
++ memcpy(&saddr6->sin6_addr, src, sizeof(saddr6->sin6_addr));
++ saddr6->sin6_family = AF_INET6;
++ saddr6->sin6_port = 0;
++ sl = sizeof(struct sockaddr_in6);
++ } else {
++ return NULL;
++ }
++ if (WSAAddressToString((struct sockaddr*)&saddr, sl, NULL, dst, &hostlen)) {
++ return NULL;
++ }
++ return dst;
++}
++
++int nixio__mgw_inet_pton (int af, const char *src, void *dst) {
++ struct sockaddr_storage sa;
++ int sl = sizeof(sa);
++
++ if (!WSAStringToAddress((char*)src, af, NULL, (struct sockaddr*)&sa, &sl)) {
++ if (af == AF_INET) {
++ struct in_addr ina = ((struct sockaddr_in *)&sa)->sin_addr;
++ memcpy(dst, &ina, sizeof(ina));
++ return 1;
++ } else if (af == AF_INET6) {
++ struct in_addr6 ina6 = ((struct sockaddr_in6 *)&sa)->sin6_addr;
++ memcpy(dst, &ina6, sizeof(ina6));
++ return 1;
++ } else {
++ WSASetLastError(WSAEAFNOSUPPORT);
++ return -1;
++ }
++ } else {
++ return -1;
++ }
++}
++
++int nixio__mgw_nanosleep(const struct timespec *req, struct timespec *rem) {
++ if (rem) {
++ rem->tv_sec = 0;
++ rem->tv_nsec = 0;
++ }
++ Sleep(req->tv_sec * 1000 + req->tv_nsec * 1000000);
++ return 0;
++}
++
++int nixio__mgw_poll(struct pollfd *fds, int nfds, int timeout) {
++ if (!fds || !nfds) {
++ Sleep(timeout);
++ return 0;
++ }
++
++ struct timeval tv;
++ int high = 0, rf = 0, wf = 0, ef = 0;
++ fd_set rfds, wfds, efds;
++ FD_ZERO(&rfds);
++ FD_ZERO(&wfds);
++ FD_ZERO(&efds);
++
++ tv.tv_sec = timeout / 1000;
++ tv.tv_usec = (timeout % 1000) * 1000;
++
++ for (int i = 0; i < nfds; i++) {
++ if (fds->events & POLLIN) {
++ FD_SET(fds->fd, &rfds);
++ rf++;
++ }
++ if (fds->events & POLLOUT) {
++ FD_SET(fds->fd, &wfds);
++ wf++;
++ }
++ if (fds->events & POLLERR) {
++ FD_SET(fds->fd, &efds);
++ ef++;
++ }
++ if (fds->fd > high) {
++ high = fds->fd;
++ }
++ }
++
++ int stat = select(high + 1, (rf) ? &rfds : NULL,
++ (wf) ? &wfds : NULL, (ef) ? &efds : NULL, &tv);
++ if (stat < 1) {
++ errno = WSAGetLastError();
++ return stat;
++ }
++
++ high = 0;
++
++ for (int i = 0; i < nfds; i++) {
++ fds->revents = 0;
++ if ((fds->events & POLLIN) && FD_ISSET(fds->fd, &rfds)) {
++ fds->revents |= POLLIN;
++ }
++ if ((fds->events & POLLOUT) && FD_ISSET(fds->fd, &wfds)) {
++ fds->revents |= POLLOUT;
++ }
++ if ((fds->events & POLLERR) && FD_ISSET(fds->fd, &efds)) {
++ fds->revents |= POLLERR;
++ }
++ if (fds->revents) {
++ high++;
++ }
++ }
++
++ return high;
++}
++
++int nixio__mgw_lockf(int fd, int cmd, off_t len) {
++ int stat;
++ if (cmd == F_LOCK) {
++ do {
++ stat = _locking(fd, _LK_LOCK, len);
++ } while (stat == -1 && errno == EDEADLOCK);
++ } else if (cmd == F_TLOCK) {
++ stat = _locking(fd, _LK_NBLCK, len);
++ } else if (cmd == F_ULOCK) {
++ stat = _locking(fd, _LK_UNLCK, len);
++ } else {
++ stat = -1;
++ errno = EINVAL;
++ }
++ return stat;
++}
++
++char* nixio__mgw_realpath(const char *path, char *resolved) {
++ if (GetFullPathName(path, PATH_MAX, resolved, NULL)) {
++ return resolved;
++ } else {
++ errno = GetLastError();
++ return NULL;
++ }
++}
++
++int nixio__mgw_link(const char *oldpath, const char *newpath) {
++ if (!CreateHardLink(newpath, oldpath, NULL)) {
++ errno = GetLastError();
++ return -1;
++ } else {
++ return 0;
++ }
++}
++
++int nixio__mgw_utimes(const char *filename, const struct timeval times[2]) {
++ struct _utimbuf timebuffer;
++ timebuffer.actime = times[0].tv_sec;
++ timebuffer.modtime = times[1].tv_sec;
++
++ return _utime(filename, &timebuffer);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.h b/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.h
+new file mode 100644
+index 0000000..a26a4be
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.h
+@@ -0,0 +1,112 @@
++#ifndef NIXIO_MINGW_COMPAT_H_
++#define NIXIO_MINGW_COMPAT_H_
++
++#include <winsock2.h>
++#include <ws2tcpip.h>
++#include <io.h>
++#include <process.h>
++#include <stdint.h>
++#include <sys/stat.h>
++#include <errno.h>
++
++typedef unsigned int uint;
++typedef unsigned long ulong;
++
++#define S_ISLNK(m) 0
++#define S_ISSOCK(m) 0
++
++#define EWOULDBLOCK WSAEWOULDBLOCK
++#define EAFNOSUPPORT WSAEAFNOSUPPORT
++#define ENOPROTOOPT WSAENOPROTOOPT
++
++#define SHUT_RD SD_RECEIVE
++#define SHUT_WR SD_SEND
++#define SHUT_RDWR SD_BOTH
++
++#define pipe(fds) _pipe(fds, 65536, 0)
++#define fsync _commit
++#define lseek lseek64
++#define stat _stati64
++#define lstat _stati64
++#define fstat _fstati64
++
++
++#define F_LOCK 1
++#define F_ULOCK 0
++#define F_TLOCK 2
++#define F_TEST 3
++int nixio__mgw_lockf(int fd, int cmd, off_t len);
++#define lockf nixio__mgw_lockf
++
++const char* nixio__mgw_inet_ntop
++(int af, const void *src, char *dst, socklen_t size);
++#define inet_ntop nixio__mgw_inet_ntop
++
++int nixio__mgw_inet_pton (int af, const char *src, void *dst);
++#define inet_pton nixio__mgw_inet_pton
++
++
++#ifndef POLLIN
++#define POLLIN 0x001
++#define POLLOUT 0x004
++#define POLLERR 0x008
++struct pollfd {
++ int fd;
++ short events;
++ short revents;
++};
++#endif
++
++typedef int nfds_t;
++int nixio__mgw_poll(struct pollfd *fds, nfds_t nfds, int timeout);
++#define poll nixio__mgw_poll
++
++
++struct timespec {
++ time_t tv_sec;
++ long tv_nsec;
++};
++
++int nixio__mgw_nanosleep(const struct timespec *req, struct timespec *rem);
++#define nanosleep nixio__mgw_nanosleep
++
++
++char* nixio__mgw_realpath(const char *path, char *resolved);
++#define realpath nixio__mgw_realpath
++
++
++int nixio__mgw_link(const char *oldpath, const char *newpath);
++#define link nixio__mgw_link
++
++
++int nixio__mgw_utimes(const char *filename, const struct timeval times[2]);
++#define utimes nixio__mgw_utimes
++
++
++#define setenv(k, v, o) !SetEnvironmentVariable(k, v)
++#define unsetenv(k) !SetEnvironmentVariable(k, NULL)
++
++#define execv(p, a) execv(p, (const char* const*)a)
++#define execvp(p, a) execvp(p, (const char* const*)a)
++#define execve(p, a, e) execve(p, (const char* const*)a, (const char* const*)e)
++
++#define mkdir(p, m) mkdir(p)
++
++
++#define nixio__perror_s(L) \
++ errno = WSAGetLastError(); \
++ return nixio__perror(L);
++
++#define nixio__pstatus_s(L, c) \
++ errno = WSAGetLastError(); \
++ return nixio__pstatus(L, c);
++
++
++
++#define NIXIO_WSA_CONSTANT(x) \
++ lua_pushinteger(L, x); \
++ lua_setfield(L, -2, #x+3);
++
++void nixio_open__mingw(lua_State *L);
++
++#endif /* NIXIO_MINGW_COMPAT_H_ */
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/nixio-tls.h b/feeds/luci/libs/luci-lib-nixio/src/nixio-tls.h
+new file mode 100644
+index 0000000..0fac5a9
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/nixio-tls.h
+@@ -0,0 +1,53 @@
++#ifndef NIXIO_TLS_H_
++#define NIXIO_TLS_H_
++
++#include "nixio.h"
++#include <sys/types.h>
++
++#ifndef WITHOUT_OPENSSL
++#include <openssl/ssl.h>
++#include <openssl/md5.h>
++#include <openssl/sha.h>
++#endif
++
++#define NIXIO_TLS_CTX_META "nixio.tls.ctx"
++#define NIXIO_TLS_SOCK_META "nixio.tls.sock"
++
++typedef struct nixio_tls_socket {
++ SSL *socket;
++#ifdef WITH_AXTLS
++ char connected;
++ size_t pbufsiz;
++ char *pbufpos;
++ char *pbuffer;
++#endif
++} nixio_tls_sock;
++
++#define NIXIO_CRYPTO_HASH_META "nixio.crypto.hash"
++#define NIXIO_DIGEST_SIZE 64
++#define NIXIO_CRYPTO_BLOCK_SIZE 64
++
++#define NIXIO_HASH_NONE 0
++#define NIXIO_HASH_MD5 0x01
++#define NIXIO_HASH_SHA1 0x02
++
++#define NIXIO_HMAC_BIT 0x40
++
++typedef int(*nixio_hash_initcb)(void *);
++typedef int(*nixio_hash_updatecb)(void *, const void *, unsigned long);
++typedef int(*nixio_hash_finalcb)(unsigned char *, void *);
++
++typedef struct nixio_hash_obj {
++ uint type;
++ unsigned char digest[NIXIO_DIGEST_SIZE];
++ size_t digest_size;
++ unsigned char key[NIXIO_CRYPTO_BLOCK_SIZE];
++ size_t key_size;
++ size_t block_size;
++ void *ctx;
++ nixio_hash_initcb init;
++ nixio_hash_updatecb update;
++ nixio_hash_finalcb final;
++} nixio_hash;
++
++#endif /* NIXIO_TLS_H_ */
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/nixio.c b/feeds/luci/libs/luci-lib-nixio/src/nixio.c
+new file mode 100644
+index 0000000..ae81c6f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/nixio.c
+@@ -0,0 +1,240 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <stdio.h>
++#include <string.h>
++#include <errno.h>
++#include <signal.h>
++
++#define VERSION 0.4
++
++
++/* pushes nil, error number and errstring on the stack */
++int nixio__perror(lua_State *L) {
++ if (errno == EAGAIN || errno == EWOULDBLOCK) {
++ lua_pushboolean(L, 0);
++ } else {
++ lua_pushnil(L);
++ }
++ lua_pushinteger(L, errno);
++ lua_pushstring(L, strerror(errno));
++ return 3;
++}
++
++/* pushes true, if operation succeeded, otherwise call nixio__perror */
++int nixio__pstatus(lua_State *L, int condition) {
++ if (condition) {
++ lua_pushboolean(L, 1);
++ return 1;
++ } else {
++ return nixio__perror(L);
++ }
++}
++
++/* checks whether the first argument is a socket and returns it */
++nixio_sock* nixio__checksock(lua_State *L) {
++ nixio_sock *sock = (nixio_sock*)luaL_checkudata(L, 1, NIXIO_META);
++ luaL_argcheck(L, sock->fd != -1, 1, "invalid socket object");
++ return sock;
++}
++
++/* read fd from nixio_sock object */
++int nixio__checksockfd(lua_State *L) {
++ return nixio__checksock(L)->fd;
++}
++
++/* return any possible fd, otherwise error out */
++int nixio__checkfd(lua_State *L, int ud) {
++ int fd = nixio__tofd(L, ud);
++ return (fd != -1) ? fd : luaL_argerror(L, ud, "invalid file descriptor");
++}
++
++/* return any possible fd */
++int nixio__tofd(lua_State *L, int ud) {
++ void *udata = lua_touserdata(L, ud);
++ int fd = -1;
++ if (lua_getmetatable(L, ud)) {
++ luaL_getmetatable(L, NIXIO_META);
++ luaL_getmetatable(L, NIXIO_FILE_META);
++ luaL_getmetatable(L, LUA_FILEHANDLE);
++ if (lua_rawequal(L, -3, -4)) {
++ fd = ((nixio_sock*)udata)->fd;
++ } else if (lua_rawequal(L, -2, -4)) {
++ fd = *((int*)udata);
++ } else if (lua_rawequal(L, -1, -4)) {
++ fd = (*((FILE **)udata)) ? fileno(*((FILE **)udata)) : -1;
++ }
++ lua_pop(L, 4);
++ }
++ return fd;
++}
++
++/* An empty iterator */
++int nixio__nulliter(lua_State *L) {
++ lua_pushnil(L);
++ return 1;
++}
++
++static int nixio_errno(lua_State *L) {
++ lua_pushinteger(L, errno);
++ return 1;
++}
++
++static int nixio_strerror(lua_State *L) {
++ lua_pushstring(L, strerror(luaL_checkinteger(L, 1)));
++ return 1;
++}
++
++/* object table */
++static const luaL_reg R[] = {
++ {"errno", nixio_errno},
++ {"strerror", nixio_strerror},
++ {NULL, NULL}
++};
++
++/* entry point */
++NIXIO_API int luaopen_nixio(lua_State *L) {
++ /* create metatable */
++ luaL_newmetatable(L, NIXIO_META);
++
++ /* metatable.__index = metatable */
++ lua_pushvalue(L, -1);
++ lua_setfield(L, -2, "__index");
++
++ /* register module */
++ luaL_register(L, "nixio", R);
++
++ /* register metatable as socket_meta */
++ lua_pushvalue(L, -2);
++ lua_setfield(L, -2, "meta_socket");
++
++ /* register methods */
++#ifdef __WINNT__
++ nixio_open__mingw(L);
++#endif
++ nixio_open_file(L);
++ nixio_open_socket(L);
++ nixio_open_sockopt(L);
++ nixio_open_bind(L);
++ nixio_open_address(L);
++ nixio_open_protoent(L);
++ nixio_open_poll(L);
++ nixio_open_io(L);
++ nixio_open_splice(L);
++ nixio_open_process(L);
++ nixio_open_syslog(L);
++ nixio_open_bit(L);
++ nixio_open_bin(L);
++ nixio_open_fs(L);
++ nixio_open_user(L);
++
++#ifndef NO_TLS
++ nixio_open_tls_crypto(L);
++ nixio_open_tls_context(L);
++ nixio_open_tls_socket(L);
++#endif
++
++ /* module version */
++ lua_pushinteger(L, VERSION);
++ lua_setfield(L, -2, "version");
++
++ /* some constants */
++ lua_newtable(L);
++
++ lua_pushliteral(L, NIXIO_SEP);
++ lua_setfield(L, -2, "sep");
++
++ lua_pushliteral(L, NIXIO_PATHSEP);
++ lua_setfield(L, -2, "pathsep");
++
++ lua_pushinteger(L, NIXIO_BUFFERSIZE);
++ lua_setfield(L, -2, "buffersize");
++
++ NIXIO_PUSH_CONSTANT(EACCES);
++ NIXIO_PUSH_CONSTANT(EINTR);
++ NIXIO_PUSH_CONSTANT(ENOSYS);
++ NIXIO_PUSH_CONSTANT(EINVAL);
++ NIXIO_PUSH_CONSTANT(EAGAIN);
++ NIXIO_PUSH_CONSTANT(ENOMEM);
++ NIXIO_PUSH_CONSTANT(ENOENT);
++ NIXIO_PUSH_CONSTANT(ECHILD);
++ NIXIO_PUSH_CONSTANT(EIO);
++ NIXIO_PUSH_CONSTANT(EBADF);
++ NIXIO_PUSH_CONSTANT(EFAULT);
++ NIXIO_PUSH_CONSTANT(EFBIG);
++ NIXIO_PUSH_CONSTANT(ENOSPC);
++ NIXIO_PUSH_CONSTANT(EPIPE);
++ NIXIO_PUSH_CONSTANT(ESPIPE);
++ NIXIO_PUSH_CONSTANT(EISDIR);
++ NIXIO_PUSH_CONSTANT(EPERM);
++ NIXIO_PUSH_CONSTANT(EEXIST);
++ NIXIO_PUSH_CONSTANT(EMFILE);
++ NIXIO_PUSH_CONSTANT(ENAMETOOLONG);
++ NIXIO_PUSH_CONSTANT(ENFILE);
++ NIXIO_PUSH_CONSTANT(ENODEV);
++ NIXIO_PUSH_CONSTANT(EXDEV);
++ NIXIO_PUSH_CONSTANT(ENOTDIR);
++ NIXIO_PUSH_CONSTANT(ENXIO);
++ NIXIO_PUSH_CONSTANT(EROFS);
++ NIXIO_PUSH_CONSTANT(EBUSY);
++ NIXIO_PUSH_CONSTANT(ESRCH);
++ NIXIO_PUSH_CONSTANT(SIGINT);
++ NIXIO_PUSH_CONSTANT(SIGTERM);
++ NIXIO_PUSH_CONSTANT(SIGSEGV);
++
++#ifndef __WINNT__
++ NIXIO_PUSH_CONSTANT(EALREADY);
++ NIXIO_PUSH_CONSTANT(EINPROGRESS);
++ NIXIO_PUSH_CONSTANT(EWOULDBLOCK);
++ NIXIO_PUSH_CONSTANT(ELOOP);
++ NIXIO_PUSH_CONSTANT(EOVERFLOW);
++ NIXIO_PUSH_CONSTANT(ETXTBSY);
++ NIXIO_PUSH_CONSTANT(EAFNOSUPPORT);
++ NIXIO_PUSH_CONSTANT(ENOBUFS);
++ NIXIO_PUSH_CONSTANT(EPROTONOSUPPORT);
++ NIXIO_PUSH_CONSTANT(ENOPROTOOPT);
++ NIXIO_PUSH_CONSTANT(EADDRINUSE);
++ NIXIO_PUSH_CONSTANT(ENETDOWN);
++ NIXIO_PUSH_CONSTANT(ENETUNREACH);
++
++ NIXIO_PUSH_CONSTANT(SIGALRM);
++ NIXIO_PUSH_CONSTANT(SIGKILL);
++ NIXIO_PUSH_CONSTANT(SIGHUP);
++ NIXIO_PUSH_CONSTANT(SIGSTOP);
++ NIXIO_PUSH_CONSTANT(SIGCONT);
++ NIXIO_PUSH_CONSTANT(SIGCHLD);
++ NIXIO_PUSH_CONSTANT(SIGQUIT);
++ NIXIO_PUSH_CONSTANT(SIGUSR1);
++ NIXIO_PUSH_CONSTANT(SIGUSR2);
++ NIXIO_PUSH_CONSTANT(SIGIO);
++ NIXIO_PUSH_CONSTANT(SIGURG);
++ NIXIO_PUSH_CONSTANT(SIGPIPE);
++
++ lua_pushvalue(L, -1);
++ lua_setfield(L, -3, "const_sock");
++
++ signal(SIGPIPE, SIG_IGN);
++#endif /* !__WINNT__ */
++ lua_setfield(L, -2, "const");
++
++ /* remove meta table */
++ lua_remove(L, -2);
++
++ return 1;
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/nixio.h b/feeds/luci/libs/luci-lib-nixio/src/nixio.h
+new file mode 100644
+index 0000000..8802e92
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/nixio.h
+@@ -0,0 +1,133 @@
++#ifndef NIXIO_H_
++#define NIXIO_H_
++
++#define NIXIO_OOM "out of memory"
++
++#define NIXIO_META "nixio.socket"
++#define NIXIO_FILE_META "nixio.file"
++#define NIXIO_GLOB_META "nixio.glob"
++#define NIXIO_DIR_META "nixio.dir"
++#define _FILE_OFFSET_BITS 64
++
++#define NIXIO_PUSH_CONSTANT(x) \
++ lua_pushinteger(L, x); \
++ lua_setfield(L, -2, #x);
++
++/* uClibc: broken as always */
++#define _LARGEFILE_SOURCE
++
++#include <lua.h>
++#include <lualib.h>
++#include <lauxlib.h>
++#include <luaconf.h>
++
++#define NIXIO_BUFFERSIZE 8192
++
++typedef struct nixio_socket {
++ int fd;
++ int domain;
++ int type;
++ int protocol;
++} nixio_sock;
++
++typedef struct nixio_address {
++ int family;
++ char host[128];
++ int port;
++ int prefix;
++} nixio_addr;
++
++int nixio__perror(lua_State *L);
++int nixio__pstatus(lua_State *L, int condition);
++
++#if defined(LUA_NUMBER_DOUBLE) || defined(LNUM_DOUBLE) || defined(LNUM_LDOUBLE)
++#define NIXIO_DOUBLE 1
++#define nixio__checknumber luaL_checknumber
++#define nixio__pushnumber lua_pushnumber
++#define nixio__optnumber luaL_optnumber
++#else
++#define nixio__checknumber luaL_checkinteger
++#define nixio__pushnumber lua_pushinteger
++#define nixio__optnumber luaL_optinteger
++#endif
++
++
++#ifndef __WINNT__
++
++#define NIXIO_API extern
++
++#include <sys/types.h>
++#include <sys/socket.h>
++#include <arpa/inet.h>
++#include <netinet/in.h>
++#include <netinet/tcp.h>
++#include <sys/un.h>
++#include <netdb.h>
++#include <poll.h>
++#include <sys/stat.h>
++#include <errno.h>
++
++#define NIXIO_SEP "/"
++#define NIXIO_PATHSEP ":"
++
++#define nixio__perror_s nixio__perror
++#define nixio__pstatus_s nixio__pstatus
++
++int nixio__check_group(lua_State *L, int idx);
++int nixio__check_user(lua_State *L, int idx);
++
++typedef struct stat nixio_stat_t;
++
++#else /* __WINNT__ */
++
++#define NIXIO_API extern __declspec(dllexport)
++#define NIXIO_SEP "\\"
++#define NIXIO_PATHSEP ";"
++#include "mingw-compat.h"
++
++typedef struct _stati64 nixio_stat_t;
++
++#endif
++
++nixio_sock* nixio__checksock(lua_State *L);
++int nixio__checksockfd(lua_State *L);
++int nixio__checkfd(lua_State *L, int ud);
++int nixio__tofd(lua_State *L, int ud);
++int nixio__nulliter(lua_State *L);
++
++int nixio__addr_parse(nixio_addr *addr, struct sockaddr *saddr);
++int nixio__addr_write(nixio_addr *addr, struct sockaddr *saddr);
++
++int nixio__check_mode(lua_State *L, int idx, int def);
++int nixio__mode_write(int mode, char *modestr);
++
++int nixio__push_stat(lua_State *L, nixio_stat_t *buf);
++
++const char nixio__bin2hex[16];
++
++/* Module functions */
++void nixio_open_file(lua_State *L);
++void nixio_open_socket(lua_State *L);
++void nixio_open_sockopt(lua_State *L);
++void nixio_open_bind(lua_State *L);
++void nixio_open_address(lua_State *L);
++void nixio_open_protoent(lua_State *L);
++void nixio_open_poll(lua_State *L);
++void nixio_open_io(lua_State *L);
++void nixio_open_splice(lua_State *L);
++void nixio_open_process(lua_State *L);
++void nixio_open_syslog(lua_State *L);
++void nixio_open_bit(lua_State *L);
++void nixio_open_bin(lua_State *L);
++void nixio_open_fs(lua_State *L);
++void nixio_open_user(lua_State *L);
++
++#ifndef NO_TLS
++void nixio_open_tls_crypto(lua_State *L);
++void nixio_open_tls_context(lua_State *L);
++void nixio_open_tls_socket(lua_State *L);
++#endif
++
++/* Method functions */
++
++#endif /* NIXIO_H_ */
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/poll.c b/feeds/luci/libs/luci-lib-nixio/src/poll.c
+new file mode 100644
+index 0000000..1211bc7
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/poll.c
+@@ -0,0 +1,210 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <time.h>
++#include <errno.h>
++#include <string.h>
++#include <stdlib.h>
++#include <sys/time.h>
++
++
++static int nixio_gettimeofday(lua_State *L) {
++ struct timeval tv;
++ gettimeofday(&tv, NULL);
++ nixio__pushnumber(L, tv.tv_sec);
++ nixio__pushnumber(L, tv.tv_usec);
++ return 2;
++}
++
++
++/**
++ * nanosleep()
++ */
++static int nixio_nanosleep(lua_State *L) {
++ struct timespec req, rem;
++ req.tv_sec = luaL_optint(L, 1, 0);
++ req.tv_nsec = luaL_optint(L, 2, 0);
++
++ int status = nanosleep(&req, &rem);
++ if (!status) {
++ lua_pushboolean(L, 1);
++ return 1;
++ } else {
++ if (errno == EINTR) {
++ lua_pushboolean(L, 0);
++ lua_pushinteger(L, rem.tv_sec);
++ lua_pushinteger(L, rem.tv_nsec);
++ return 3;
++ } else {
++ return nixio__perror(L);
++ }
++ }
++}
++
++/**
++ * Checks whether a flag is set in the bitmap and sets the matching table value
++ */
++static void nixio_poll_flags__r(lua_State *L, int *map, int f, const char *t) {
++ lua_pushstring(L, t);
++ if (*map & f) {
++ lua_pushboolean(L, 1);
++ } else {
++ lua_pushnil(L);
++ }
++ lua_rawset(L, -3);
++}
++
++/**
++ * Translate integer to poll flags and vice versa
++ */
++static int nixio_poll_flags(lua_State *L) {
++ int flags;
++ if (lua_isnumber(L, 1)) {
++ flags = luaL_checkinteger(L, 1);
++ lua_newtable(L);
++ nixio_poll_flags__r(L, &flags, POLLIN, "in");
++ nixio_poll_flags__r(L, &flags, POLLOUT, "out");
++ nixio_poll_flags__r(L, &flags, POLLERR, "err");
++#ifndef __WINNT__
++ nixio_poll_flags__r(L, &flags, POLLPRI, "pri");
++ nixio_poll_flags__r(L, &flags, POLLHUP, "hup");
++ nixio_poll_flags__r(L, &flags, POLLNVAL, "nval");
++#endif
++ } else {
++ flags = 0;
++ const int j = lua_gettop(L);
++ for (int i=1; i<=j; i++) {
++ const char *flag = luaL_checkstring(L, i);
++ if (!strcmp(flag, "in")) {
++ flags |= POLLIN;
++ } else if (!strcmp(flag, "out")) {
++ flags |= POLLOUT;
++ } else if (!strcmp(flag, "err")) {
++ flags |= POLLERR;
++ } else if (!strcmp(flag, "pri")) {
++#ifndef __WINNT__
++ flags |= POLLPRI;
++#endif
++ } else if (!strcmp(flag, "hup")) {
++#ifndef __WINNT__
++ flags |= POLLHUP;
++#endif
++ } else if (!strcmp(flag, "nval")) {
++#ifndef __WINNT__
++ flags |= POLLNVAL;
++#endif
++ } else {
++ return luaL_argerror(L, i,
++ "supported values: in, pri, out, err, hup, nval");
++ }
++ }
++ lua_pushinteger(L, flags);
++ }
++ return 1;
++}
++
++/**
++ * poll({{fd = socket, events = FLAGS}, ...}, timeout)
++ */
++static int nixio_poll(lua_State *L) {
++ int len = lua_objlen(L, 1);
++ int i, fd;
++ int timeout = luaL_optint(L, 2, 0);
++ int status = -1;
++
++ /* we are being abused as sleep() replacement... */
++ if (lua_isnoneornil(L, 1) || len < 1) {
++ if (!poll(NULL, 0, timeout)) {
++ lua_pushinteger(L, 0);
++ return 1;
++ } else {
++ return nixio__perror(L);
++ }
++ }
++
++ luaL_checktype(L, 1, LUA_TTABLE);
++ struct pollfd *fds = calloc(len, sizeof(struct pollfd));
++ if (!fds) {
++ return luaL_error(L, NIXIO_OOM);
++ }
++
++ for (i = 0; i < len; i++) {
++ lua_rawgeti(L, 1, i+1);
++ if (!lua_istable(L, -1)) {
++ free(fds);
++ return luaL_argerror(L, 1, "invalid datastructure");
++ }
++
++ lua_pushliteral(L, "fd");
++ lua_rawget(L, -2);
++ fd = nixio__tofd(L, -1);
++ if (fd == -1) {
++ free(fds);
++ return luaL_argerror(L, 1, "invalid fd in datastructure");
++ }
++ fds[i].fd = fd;
++
++ lua_pushliteral(L, "events");
++ lua_rawget(L, -3);
++ fds[i].events = (short)lua_tointeger(L, -1);
++
++ lua_pop(L, 3);
++ }
++
++ status = poll(fds, (nfds_t)len, timeout);
++
++ if (status == 0) {
++ free(fds);
++ lua_pushboolean(L, 0);
++ return 1;
++ } else if (status < 0) {
++ free(fds);
++ return nixio__perror(L);
++ }
++
++ for (i = 0; i < len; i++) {
++ lua_rawgeti(L, 1, i+1);
++
++ lua_pushliteral(L, "revents");
++ lua_pushinteger(L, fds[i].revents);
++ lua_rawset(L, -3);
++
++ lua_pop(L, 1);
++ }
++
++ free(fds);
++
++ lua_pushinteger(L, status);
++ lua_pushvalue(L, 1);
++
++ return 2;
++}
++
++/* module table */
++static const luaL_reg R[] = {
++ {"gettimeofday", nixio_gettimeofday},
++ {"nanosleep", nixio_nanosleep},
++ {"poll", nixio_poll},
++ {"poll_flags", nixio_poll_flags},
++ {NULL, NULL}
++};
++
++void nixio_open_poll(lua_State *L) {
++ luaL_register(L, NULL, R);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/process.c b/feeds/luci/libs/luci-lib-nixio/src/process.c
+new file mode 100644
+index 0000000..5ae9b82
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/process.c
+@@ -0,0 +1,450 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <stdlib.h>
++#include <unistd.h>
++#include <errno.h>
++#include <string.h>
++#include <sys/stat.h>
++#include <sys/types.h>
++#include <signal.h>
++
++#define NIXIO_EXECVE 0x01
++#define NIXIO_EXECV 0x02
++#define NIXIO_EXECVP 0x03
++
++int nixio__exec(lua_State *L, int m) {
++ const char *path = luaL_checkstring(L, 1);
++ const char *arg;
++ int argn, i;
++
++ if (m == NIXIO_EXECVE) {
++ luaL_checktype(L, 2, LUA_TTABLE);
++ argn = lua_objlen(L, 2) + 1;
++ } else {
++ argn = lua_gettop(L);
++ }
++
++ char **args = lua_newuserdata(L, sizeof(char*) * (argn + 1));
++ args[argn] = NULL;
++ args[0] = (char *)path;
++
++ if (m == NIXIO_EXECVE) {
++ for (i = 1; i < argn; i++) {
++ lua_rawgeti(L, 2, i);
++ arg = lua_tostring(L, -1);
++ luaL_argcheck(L, arg, 2, "invalid argument");
++ args[i] = (char *)arg;
++ }
++
++ if (lua_isnoneornil(L, 3)) {
++ execv(path, args);
++ } else {
++ luaL_checktype(L, 3, LUA_TTABLE);
++ argn = 0;
++ lua_pushnil(L);
++ while (lua_next(L, 3)) {
++ if (!lua_checkstack(L, 1)) {
++ lua_settop(L, 0);
++ return luaL_error(L, "stack overflow");
++ }
++
++ if (lua_type(L, -2) != LUA_TSTRING || !lua_isstring(L, -1)) {
++ return luaL_argerror(L, 3, "invalid environment");
++ }
++
++ lua_pushfstring(L, "%s=%s",
++ lua_tostring(L, -2), lua_tostring(L, -1));
++
++ lua_insert(L, 5);
++ lua_pop(L, 1);
++ argn++;
++ }
++
++ char **env = lua_newuserdata(L, sizeof(char*) * (argn + 1));
++ env[argn] = NULL;
++
++ for (i = 1; i <= argn; i++) {
++ env[i-1] = (char *)lua_tostring(L, -(i+1));
++ }
++
++ execve(path, args, env);
++ }
++ } else {
++ for (i = 2; i <= argn; i++) {
++ arg = luaL_checkstring(L, i);
++ args[i-1] = (char *)arg;
++ }
++
++ if (m == NIXIO_EXECV) {
++ execv(path, args);
++ } else {
++ execvp(path, args);
++ }
++ }
++
++ return nixio__perror(L);
++}
++
++#ifndef __WINNT__
++#include <sys/utsname.h>
++#include <sys/times.h>
++#include <sys/wait.h>
++#include <pwd.h>
++#include <grp.h>
++
++static int nixio_fork(lua_State *L) {
++ pid_t pid = fork();
++ if (pid == -1) {
++ return nixio__perror(L);
++ } else {
++ lua_pushinteger(L, pid);
++ return 1;
++ }
++}
++
++static int nixio_kill(lua_State *L) {
++ return nixio__pstatus(L, !kill(luaL_checkint(L, 1), luaL_checkint(L, 2)));
++}
++
++static int nixio_getppid(lua_State *L) {
++ lua_pushinteger(L, getppid());
++ return 1;
++}
++
++static int nixio_getuid(lua_State *L) {
++ lua_pushinteger(L, getuid());
++ return 1;
++}
++
++static int nixio_getgid(lua_State *L) {
++ lua_pushinteger(L, getgid());
++ return 1;
++}
++
++static int nixio_setgid(lua_State *L) {
++ return nixio__pstatus(L, !setgid(nixio__check_group(L, 1)));
++}
++
++static int nixio_setuid(lua_State *L) {
++ return nixio__pstatus(L, !setuid(nixio__check_user(L, 1)));
++}
++
++static int nixio_nice(lua_State *L) {
++ int nval = luaL_checkint(L, 1);
++
++ errno = 0;
++ nval = nice(nval);
++
++ if (nval == -1 && errno) {
++ return nixio__perror(L);
++ } else {
++ lua_pushinteger(L, nval);
++ return 1;
++ }
++}
++
++static int nixio_setsid(lua_State *L) {
++ pid_t pid = setsid();
++
++ if (pid == -1) {
++ return nixio__perror(L);
++ } else {
++ lua_pushinteger(L, pid);
++ return 1;
++ }
++}
++
++static int nixio_wait(lua_State *L) {
++ pid_t pidin = luaL_optinteger(L, 1, -1), pidout;
++ int options = 0, status;
++
++ const int j = lua_gettop(L);
++ for (int i=2; i<=j; i++) {
++ const char *flag = luaL_checkstring(L, i);
++ if (!strcmp(flag, "nohang")) {
++ options |= WNOHANG;
++ } else if (!strcmp(flag, "untraced")) {
++ options |= WUNTRACED;
++ } else if (!strcmp(flag, "continued")) {
++ options |= WCONTINUED;
++ } else {
++ return luaL_argerror(L, i,
++ "supported values: nohang, untraced, continued");
++ }
++ }
++
++ do {
++ pidout = waitpid(pidin, &status, options);
++ } while (pidout == -1 && errno == EINTR);
++
++ if (pidout == 0) {
++ lua_pushboolean(L, 0);
++ return 1;
++ } else if (pidout == -1) {
++ return nixio__perror(L);
++ } else {
++ lua_pushinteger(L, pidout);
++ }
++
++ if (WIFEXITED(status)) {
++ lua_pushliteral(L, "exited");
++ lua_pushinteger(L, WEXITSTATUS(status));
++ } else if (WIFSIGNALED(status)) {
++ lua_pushliteral(L, "signaled");
++ lua_pushinteger(L, WTERMSIG(status));
++ } else if (WIFSTOPPED(status)) {
++ lua_pushliteral(L, "stopped");
++ lua_pushinteger(L, WSTOPSIG(status));
++ } else {
++ return 1;
++ }
++
++ return 3;
++}
++
++static int nixio_times(lua_State *L) {
++ struct tms buf;
++ if (times(&buf) == -1) {
++ return nixio__perror(L);
++ } else {
++ lua_createtable(L, 0, 4);
++ nixio__pushnumber(L, buf.tms_cstime);
++ lua_setfield(L, -2, "cstime");
++
++ nixio__pushnumber(L, buf.tms_cutime);
++ lua_setfield(L, -2, "cutime");
++
++ nixio__pushnumber(L, buf.tms_stime);
++ lua_setfield(L, -2, "stime");
++
++ nixio__pushnumber(L, buf.tms_utime);
++ lua_setfield(L, -2, "utime");
++
++ return 1;
++ }
++}
++
++static int nixio_uname(lua_State *L) {
++ struct utsname buf;
++ if (uname(&buf)) {
++ return nixio__perror(L);
++ }
++
++ lua_createtable(L, 0, 5);
++
++ lua_pushstring(L, buf.machine);
++ lua_setfield(L, -2, "machine");
++
++ lua_pushstring(L, buf.version);
++ lua_setfield(L, -2, "version");
++
++ lua_pushstring(L, buf.release);
++ lua_setfield(L, -2, "release");
++
++ lua_pushstring(L, buf.nodename);
++ lua_setfield(L, -2, "nodename");
++
++ lua_pushstring(L, buf.sysname);
++ lua_setfield(L, -2, "sysname");
++
++ return 1;
++}
++
++#endif /* !__WINNT__ */
++
++static int nixio_chdir(lua_State *L) {
++ return nixio__pstatus(L, !chdir(luaL_checkstring(L, 1)));
++}
++
++static int nixio_signal(lua_State *L) {
++ int sig = luaL_checkinteger(L, 1);
++ const char *val = luaL_checkstring(L, 2);
++
++ if (!strcmp(val, "ign") || !strcmp(val, "ignore")) {
++ return nixio__pstatus(L, signal(sig, SIG_IGN) != SIG_ERR);
++ } else if (!strcmp(val, "dfl") || !strcmp(val, "default")) {
++ return nixio__pstatus(L, signal(sig, SIG_DFL) != SIG_ERR);
++ } else {
++ return luaL_argerror(L, 2, "supported values: ign, dfl");
++ }
++}
++
++static int nixio_getpid(lua_State *L) {
++ lua_pushinteger(L, getpid());
++ return 1;
++}
++
++static int nixio_getenv(lua_State *L) {
++ const char *key = luaL_optstring(L, 1, NULL);
++ if (key) {
++ const char *val = getenv(key);
++ if (val) {
++ lua_pushstring(L, val);
++ } else {
++ lua_pushnil(L);
++ }
++ } else {
++ lua_newtable(L);
++ extern char **environ;
++ for (char **c = environ; *c; c++) {
++ const char *delim = strchr(*c, '=');
++ if (!delim) {
++ return luaL_error(L, "invalid environment");
++ }
++ lua_pushlstring(L, *c, delim-*c);
++ lua_pushstring(L, delim + 1);
++ lua_rawset(L, -3);
++ }
++ }
++ return 1;
++}
++
++static int nixio_setenv(lua_State *L) {
++ const char *key = luaL_checkstring(L, 1);
++ const char *val = luaL_optstring(L, 2, NULL);
++ return nixio__pstatus(L, (val) ? !setenv(key, val, 1) : !unsetenv(key));
++}
++
++static int nixio_exec(lua_State *L) {
++ return nixio__exec(L, NIXIO_EXECV);
++}
++
++static int nixio_execp(lua_State *L) {
++ return nixio__exec(L, NIXIO_EXECVP);
++}
++
++static int nixio_exece(lua_State *L) {
++ return nixio__exec(L, NIXIO_EXECVE);
++}
++
++static int nixio_getcwd(lua_State *L) {
++ char path[PATH_MAX];
++
++ if (getcwd(path, sizeof(path))) {
++ lua_pushstring(L, path);
++ return 1;
++ } else {
++ return nixio__perror(L);
++ }
++}
++
++static int nixio_umask(lua_State *L) {
++ char mask[9];
++ lua_pushinteger(L,
++ nixio__mode_write(umask(nixio__check_mode(L, 1, -1)), mask));
++ lua_pushlstring(L, mask, 9);
++ return 2;
++}
++
++#ifdef __linux__
++
++#include <sys/sysinfo.h>
++
++static int nixio_sysinfo(lua_State *L) {
++ struct sysinfo info;
++ if (sysinfo(&info)) {
++ return nixio__perror(L);
++ }
++
++ lua_createtable(L, 0, 12);
++
++ nixio__pushnumber(L, info.bufferram);
++ lua_setfield(L, -2, "bufferram");
++
++ nixio__pushnumber(L, info.freehigh);
++ lua_setfield(L, -2, "freehigh");
++
++ nixio__pushnumber(L, info.freeram);
++ lua_setfield(L, -2, "freeram");
++
++ nixio__pushnumber(L, info.freeswap);
++ lua_setfield(L, -2, "freeswap");
++
++ lua_createtable(L, 0, 3);
++ for (int i=0; i<3; i++) {
++ lua_pushnumber(L, info.loads[i] / 65536.);
++ lua_rawseti(L, -2, i+1);
++ }
++ lua_setfield(L, -2, "loads");
++
++ lua_pushinteger(L, info.mem_unit);
++ lua_setfield(L, -2, "mem_unit");
++
++ lua_pushinteger(L, info.procs);
++ lua_setfield(L, -2, "procs");
++
++ nixio__pushnumber(L, info.sharedram);
++ lua_setfield(L, -2, "sharedram");
++
++ nixio__pushnumber(L, info.totalhigh);
++ lua_setfield(L, -2, "totalhigh");
++
++ nixio__pushnumber(L, info.totalram);
++ lua_setfield(L, -2, "totalram");
++
++ nixio__pushnumber(L, info.totalswap);
++ lua_setfield(L, -2, "totalswap");
++
++ lua_pushinteger(L, info.uptime);
++ lua_setfield(L, -2, "uptime");
++
++ return 1;
++}
++
++#endif
++
++
++/* module table */
++static const luaL_reg R[] = {
++#ifdef __linux__
++ {"sysinfo", nixio_sysinfo},
++#endif
++#ifndef __WINNT__
++ {"fork", nixio_fork},
++ {"kill", nixio_kill},
++ {"nice", nixio_nice},
++ {"getppid", nixio_getppid},
++ {"getuid", nixio_getuid},
++ {"getgid", nixio_getgid},
++ {"setuid", nixio_setuid},
++ {"setgid", nixio_setgid},
++ {"setsid", nixio_setsid},
++ {"wait", nixio_wait},
++ {"waitpid", nixio_wait},
++ {"times", nixio_times},
++ {"uname", nixio_uname},
++#endif
++ {"chdir", nixio_chdir},
++ {"signal", nixio_signal},
++ {"getpid", nixio_getpid},
++ {"getenv", nixio_getenv},
++ {"setenv", nixio_setenv},
++ {"putenv", nixio_setenv},
++ {"exec", nixio_exec},
++ {"execp", nixio_execp},
++ {"exece", nixio_exece},
++ {"getcwd", nixio_getcwd},
++ {"umask", nixio_umask},
++ {NULL, NULL}
++};
++
++void nixio_open_process(lua_State *L) {
++ luaL_register(L, NULL, R);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/protoent.c b/feeds/luci/libs/luci-lib-nixio/src/protoent.c
+new file mode 100644
+index 0000000..bda68a5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/protoent.c
+@@ -0,0 +1,103 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2011 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++
++#ifndef __WINNT__
++#include <netdb.h>
++#endif
++
++/**
++ * protoent conversion helper
++ */
++static int nixio__pushprotoent(lua_State *L, struct protoent *e) {
++ int i;
++ if (e) {
++ lua_newtable(L);
++
++ lua_pushstring(L, e->p_name);
++ lua_setfield(L, -2, "name");
++
++ lua_pushnumber(L, e->p_proto);
++ lua_setfield(L, -2, "proto");
++
++ lua_newtable(L);
++ for (i = 0; e->p_aliases[i]; i++) {
++ lua_pushstring(L, e->p_aliases[i]);
++ lua_rawseti(L, -2, i+1);
++ }
++ lua_setfield(L, -2, "aliases");
++ return 1;
++ } else {
++ return 0;
++ }
++}
++
++/**
++ * getprotobyname(name)
++ */
++static int nixio_getprotobyname(lua_State *L) {
++ const char *name = luaL_checkstring(L, 1);
++ struct protoent *res = getprotobyname(name);
++ return nixio__pushprotoent(L, res);
++}
++
++/**
++ * getprotobynumber(proto)
++ */
++static int nixio_getprotobynumber(lua_State *L) {
++ int proto = luaL_checkinteger(L, 1);
++ struct protoent *res = getprotobynumber(proto);
++ return nixio__pushprotoent(L, res);
++}
++
++/**
++ * getproto(name_or_proto)
++ */
++static int nixio_getproto(lua_State *L) {
++ int i = 1;
++ struct protoent *res;
++ if (lua_isnumber(L, 1)) {
++ return nixio_getprotobynumber(L);
++ } else if (lua_isstring(L, 1)) {
++ return nixio_getprotobyname(L);
++ } else if (lua_isnoneornil(L, 1)) {
++ setprotoent(1);
++ lua_newtable(L);
++ while ((res = getprotoent()) != NULL) {
++ nixio__pushprotoent(L, res);
++ lua_rawseti(L, -2, i++);
++ }
++ endprotoent();
++ return 1;
++ } else {
++ return luaL_argerror(L, 1, "supported values: <protoname>, <protonumber>");
++ }
++}
++
++/* module table */
++static const luaL_reg R[] = {
++ {"getprotobyname", nixio_getprotobyname},
++ {"getprotobynumber", nixio_getprotobynumber},
++ {"getproto", nixio_getproto},
++ {NULL, NULL}
++};
++
++void nixio_open_protoent(lua_State *L) {
++ luaL_register(L, NULL, R);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/socket.c b/feeds/luci/libs/luci-lib-nixio/src/socket.c
+new file mode 100644
+index 0000000..17c6afc
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/socket.c
+@@ -0,0 +1,173 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <unistd.h>
++#include <string.h>
++#include <errno.h>
++
++
++/**
++ * create new socket
++ */
++static int nixio_socket(lua_State *L) {
++ const char *domain = luaL_optlstring(L, 1, "", NULL);
++ const char *type = luaL_optlstring(L, 2, "", NULL);
++ const char *proto = lua_tolstring(L, 3, NULL);
++
++ nixio_sock *sock = lua_newuserdata(L, sizeof(nixio_sock));
++ if (!sock) {
++ return luaL_error(L, "out of memory");
++ }
++
++ if (!strcmp(domain, "inet")) {
++ sock->domain = AF_INET;
++ } else if (!strcmp(domain, "inet6")) {
++ sock->domain = AF_INET6;
++ } else if (!strcmp(domain, "unix")) {
++ sock->domain = AF_UNIX;
++ /*} else if (!strcmp(domain, "packet")) {
++ sock->domain = AF_PACKET;*/
++ } else {
++ return luaL_argerror(L, 1,
++ "supported values: inet, inet6, unix, packet"
++ );
++ }
++
++ if (!strcmp(type, "stream")) {
++ sock->type = SOCK_STREAM;
++ } else if (!strcmp(type, "dgram")) {
++ sock->type = SOCK_DGRAM;
++ } else if (!strcmp(type, "raw")) {
++ sock->type = SOCK_RAW;
++ } else {
++ return luaL_argerror(L, 2, "supported values: stream, dgram, raw");
++ }
++
++ if (!proto) {
++ sock->protocol = 0;
++ } else if (!strcmp(proto, "icmp")) {
++ sock->protocol = IPPROTO_ICMP;
++ } else if (!strcmp(proto, "icmpv6")) {
++ sock->protocol = IPPROTO_ICMPV6;
++ } else {
++ return luaL_argerror(L, 3, "supported values: [empty], icmp, icmpv6");
++ }
++
++ /* create userdata */
++ luaL_getmetatable(L, NIXIO_META);
++ lua_setmetatable(L, -2);
++
++ sock->fd = socket(sock->domain, sock->type, sock->protocol);
++
++ if (sock->fd < 0) {
++ return nixio__perror_s(L);
++ }
++
++ return 1;
++}
++
++/**
++ * close a socket
++ */
++static int nixio_sock_close(lua_State *L) {
++ nixio_sock *sock = nixio__checksock(L);
++ int sockfd = sock->fd;
++ int res;
++ sock->fd = -1;
++
++ do {
++#ifndef __WINNT__
++ res = close(sockfd);
++#else
++ res = closesocket(sockfd);
++#endif
++ } while (res == -1 && errno == EINTR);
++
++ return nixio__pstatus_s(L, !res);
++}
++
++/**
++ * garbage collector
++ */
++static int nixio_sock__gc(lua_State *L) {
++ nixio_sock *sock = (nixio_sock*)luaL_checkudata(L, 1, NIXIO_META);
++ int res;
++ if (sock && sock->fd != -1) {
++ do {
++#ifndef __WINNT__
++ res = close(sock->fd);
++#else
++ res = closesocket(sock->fd);
++#endif
++ } while (res == -1 && errno == EINTR);
++ }
++ return 0;
++}
++
++/**
++ * string representation
++ */
++static int nixio_sock__tostring(lua_State *L) {
++ lua_pushfstring(L, "nixio socket %d", nixio__checksockfd(L));
++ return 1;
++}
++
++/**
++ * shutdown a socket
++ */
++static int nixio_sock_shutdown(lua_State *L) {
++ int sockfd = nixio__checksockfd(L);
++ const char *what = luaL_optlstring(L, 2, "rdwr", NULL);
++ int how;
++
++ if (!strcmp(what, "rdwr") || !strcmp(what, "both")) {
++ how = SHUT_RDWR;
++ } else if (!strcmp(what, "rd") || !strcmp(what, "read")) {
++ how = SHUT_RD;
++ } else if (!strcmp(what, "wr") || !strcmp(what, "write")) {
++ how = SHUT_WR;
++ } else {
++ return luaL_argerror(L, 2, "supported values: both, read, write");
++ }
++
++ return nixio__pstatus_s(L, !shutdown(sockfd, how));
++}
++
++/* module table */
++static const luaL_reg R[] = {
++ {"socket", nixio_socket},
++ {NULL, NULL}
++};
++
++/* object table */
++static const luaL_reg M[] = {
++ {"close", nixio_sock_close},
++ {"shutdown", nixio_sock_shutdown},
++ {"__gc", nixio_sock__gc},
++ {"__tostring", nixio_sock__tostring},
++ {NULL, NULL}
++};
++
++void nixio_open_socket(lua_State *L) {
++ luaL_register(L, NULL, R);
++
++ lua_pushvalue(L, -2);
++ luaL_register(L, NULL, M);
++ lua_pop(L, 1);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/sockopt.c b/feeds/luci/libs/luci-lib-nixio/src/sockopt.c
+new file mode 100644
+index 0000000..cede884
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/sockopt.c
+@@ -0,0 +1,390 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++
++#ifndef __WINNT__
++#include <net/if.h>
++#endif
++
++#include <sys/types.h>
++#include <sys/time.h>
++#include <string.h>
++#include <fcntl.h>
++#include <errno.h>
++
++#ifndef IPV6_ADD_MEMBERSHIP
++#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
++#endif
++
++#ifndef IPV6_DROP_MEMBERSHIP
++#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
++#endif
++
++static int nixio_sock_fileno(lua_State *L) {
++ lua_pushinteger(L, nixio__checkfd(L, 1));
++ return 1;
++}
++
++/**
++ * setblocking()
++ */
++static int nixio_sock_setblocking(lua_State *L) {
++ int fd = nixio__checkfd(L, 1);
++ luaL_checkany(L, 2);
++ int set = lua_toboolean(L, 2);
++
++#ifndef __WINNT__
++
++ int flags = fcntl(fd, F_GETFL);
++
++ if (flags == -1) {
++ return nixio__perror(L);
++ }
++
++ if (!set) {
++ flags |= O_NONBLOCK;
++ } else {
++ flags &= ~O_NONBLOCK;
++ }
++
++ return nixio__pstatus(L, !fcntl(fd, F_SETFL, flags));
++
++#else /* __WINNT__ */
++
++ lua_getmetatable(L, 1);
++ luaL_getmetatable(L, NIXIO_META);
++ if (lua_equal(L, -1, -2)) { /* Socket */
++ unsigned long val = !set;
++ return nixio__pstatus_s(L, !ioctlsocket(fd, FIONBIO, &val));
++ } else { /* File */
++ WSASetLastError(WSAENOTSOCK);
++ return nixio__perror_s(L);
++ }
++
++#endif /* __WINNT__ */
++}
++
++static int nixio__gso_int(lua_State *L, int fd, int level, int opt, int set) {
++ int value;
++ socklen_t optlen = sizeof(value);
++ if (!set) {
++ if (!getsockopt(fd, level, opt, (char *)&value, &optlen)) {
++ lua_pushinteger(L, value);
++ return 1;
++ }
++ } else {
++ value = luaL_checkinteger(L, set);
++ if (!setsockopt(fd, level, opt, (char *)&value, optlen)) {
++ lua_pushboolean(L, 1);
++ return 1;
++ }
++ }
++ return nixio__perror_s(L);
++}
++
++static int nixio__gso_ling(lua_State *L, int fd, int level, int opt, int set) {
++ struct linger value;
++ socklen_t optlen = sizeof(value);
++ if (!set) {
++ if (!getsockopt(fd, level, opt, (char *)&value, &optlen)) {
++ lua_pushinteger(L, value.l_onoff ? value.l_linger : 0);
++ return 1;
++ }
++ } else {
++ value.l_linger = luaL_checkinteger(L, set);
++ value.l_onoff = value.l_linger ? 1 : 0;
++ if (!setsockopt(fd, level, opt, (char *)&value, optlen)) {
++ lua_pushboolean(L, 1);
++ return 1;
++ }
++ }
++ return nixio__perror_s(L);
++}
++
++static int nixio__gso_timev(lua_State *L, int fd, int level, int opt, int set) {
++ struct timeval value;
++ socklen_t optlen = sizeof(value);
++ if (!set) {
++ if (!getsockopt(fd, level, opt, (char *)&value, &optlen)) {
++ lua_pushinteger(L, value.tv_sec);
++ lua_pushinteger(L, value.tv_usec);
++ return 2;
++ }
++ } else {
++ value.tv_sec = luaL_checkinteger(L, set);
++ value.tv_usec = luaL_optinteger(L, set + 1, 0);
++ if (!setsockopt(fd, level, opt, (char *)&value, optlen)) {
++ lua_pushboolean(L, 1);
++ return 1;
++ }
++ }
++ return nixio__perror_s(L);
++}
++
++#ifdef SO_BINDTODEVICE
++
++static int nixio__gso_b(lua_State *L, int fd, int level, int opt, int set) {
++ if (!set) {
++ socklen_t optlen = IFNAMSIZ;
++ char ifname[IFNAMSIZ];
++ if (!getsockopt(fd, level, opt, (char *)ifname, &optlen)) {
++ lua_pushlstring(L, ifname, optlen);
++ return 1;
++ }
++ } else {
++ size_t valuelen;
++ const char *value = luaL_checklstring(L, set, &valuelen);
++ luaL_argcheck(L, valuelen <= IFNAMSIZ, set, "invalid interface name");
++ if (!setsockopt(fd, level, opt, (char *)value, valuelen)) {
++ lua_pushboolean(L, 1);
++ return 1;
++ }
++ }
++ return nixio__perror_s(L);
++}
++
++#endif /* SO_BINDTODEVICE */
++
++static int nixio__gso_mreq4(lua_State *L, int fd, int level, int opt, int set) {
++ struct ip_mreq value;
++ socklen_t optlen = sizeof(value);
++ if (!set) {
++ char buf[INET_ADDRSTRLEN];
++ if (!getsockopt(fd, level, opt, (char *)&value, &optlen)) {
++ if (!inet_ntop(AF_INET, &value.imr_multiaddr, buf, sizeof(buf))) {
++ return nixio__perror_s(L);
++ }
++ lua_pushstring(L, buf);
++ if (!inet_ntop(AF_INET, &value.imr_interface, buf, sizeof(buf))) {
++ return nixio__perror_s(L);
++ }
++ lua_pushstring(L, buf);
++ return 2;
++ }
++ } else {
++ const char *maddr = luaL_checkstring(L, set);
++ const char *iface = luaL_optstring(L, set + 1, "0.0.0.0");
++ if (inet_pton(AF_INET, maddr, &value.imr_multiaddr) < 1) {
++ return nixio__perror_s(L);
++ }
++ if (inet_pton(AF_INET, iface, &value.imr_interface) < 1) {
++ return nixio__perror_s(L);
++ }
++ if (!setsockopt(fd, level, opt, (char *)&value, optlen)) {
++ lua_pushboolean(L, 1);
++ return 1;
++ }
++ }
++ return nixio__perror_s(L);
++}
++
++static int nixio__gso_mreq6(lua_State *L, int fd, int level, int opt, int set) {
++ struct ipv6_mreq val;
++ socklen_t optlen = sizeof(val);
++ if (!set) {
++ char buf[INET_ADDRSTRLEN];
++ if (!getsockopt(fd, level, opt, (char *)&val, &optlen)) {
++ if (!inet_ntop(AF_INET6, &val.ipv6mr_multiaddr, buf, sizeof(buf))) {
++ return nixio__perror_s(L);
++ }
++ lua_pushstring(L, buf);
++ lua_pushinteger(L, val.ipv6mr_interface);
++ return 2;
++ }
++ } else {
++ const char *maddr = luaL_checkstring(L, set);
++ if (inet_pton(AF_INET6, maddr, &val.ipv6mr_multiaddr) < 1) {
++ return nixio__perror_s(L);
++ }
++ val.ipv6mr_interface = luaL_optlong(L, set + 1, 0);
++ if (!setsockopt(fd, level, opt, (char *)&val, optlen)) {
++ lua_pushboolean(L, 1);
++ return 1;
++ }
++ }
++ return nixio__perror_s(L);
++}
++
++/**
++ * get/setsockopt() helper
++ */
++static int nixio__getsetsockopt(lua_State *L, int set) {
++ nixio_sock *sock = nixio__checksock(L);
++ const char *level = luaL_optlstring(L, 2, "", NULL);
++ const char *option = luaL_optlstring(L, 3, "", NULL);
++ set = (set) ? 4 : 0;
++
++ if (!strcmp(level, "socket")) {
++ if (!strcmp(option, "keepalive")) {
++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_KEEPALIVE, set);
++ } else if (!strcmp(option, "reuseaddr")) {
++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_REUSEADDR, set);
++ } else if (!strcmp(option, "rcvbuf")) {
++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_RCVBUF, set);
++ } else if (!strcmp(option, "sndbuf")) {
++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_SNDBUF, set);
++ } else if (!strcmp(option, "priority")) {
++#ifdef SO_PRIORITY
++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_PRIORITY, set);
++#else
++ return nixio__pstatus(L, !(errno = ENOPROTOOPT));
++#endif
++ } else if (!strcmp(option, "broadcast")) {
++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_BROADCAST, set);
++ } else if (!strcmp(option, "dontroute")) {
++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_DONTROUTE, set);
++ } else if (!strcmp(option, "error")) {
++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_ERROR, set);
++ } else if (!strcmp(option, "oobinline")) {
++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_OOBINLINE, set);
++ } else if (!strcmp(option, "linger")) {
++ return nixio__gso_ling(L, sock->fd, SOL_SOCKET, SO_LINGER, set);
++ } else if (!strcmp(option, "sndtimeo")) {
++ return nixio__gso_timev(L, sock->fd, SOL_SOCKET, SO_SNDTIMEO, set);
++ } else if (!strcmp(option, "rcvtimeo")) {
++ return nixio__gso_timev(L, sock->fd, SOL_SOCKET, SO_RCVTIMEO, set);
++ } else if (!strcmp(option, "bindtodevice")) {
++#ifdef SO_BINDTODEVICE
++ return nixio__gso_b(L, sock->fd, SOL_SOCKET, SO_BINDTODEVICE, set);
++#else
++ return nixio__pstatus(L, !(errno = ENOPROTOOPT));
++#endif
++ } else {
++ return luaL_argerror(L, 3, "supported values: keepalive, reuseaddr,"
++ " sndbuf, rcvbuf, priority, broadcast, linger, sndtimeo, rcvtimeo,"
++ " dontroute, bindtodevice, error, oobinline"
++ );
++ }
++ } else if (!strcmp(level, "tcp")) {
++ if (!strcmp(option, "cork")) {
++#ifdef TCP_CORK
++ return nixio__gso_int(L, sock->fd, IPPROTO_TCP, TCP_CORK, set);
++#else
++ return nixio__pstatus(L, !(errno = ENOPROTOOPT));
++#endif
++ } else if (!strcmp(option, "nodelay")) {
++ return nixio__gso_int(L, sock->fd, IPPROTO_TCP, TCP_NODELAY, set);
++ } else {
++ return luaL_argerror(L, 3, "supported values: cork, nodelay");
++ }
++ } else if (!strcmp(level, "ip")) {
++ if (!strcmp(option, "mtu")) {
++#ifdef IP_MTU
++ return nixio__gso_int(L, sock->fd, IPPROTO_IP, IP_MTU, set);
++#else
++ return nixio__pstatus(L, !(errno = ENOPROTOOPT));
++#endif
++ } else if (!strcmp(option, "hdrincl")) {
++ return nixio__gso_int(L, sock->fd, IPPROTO_IP, IP_HDRINCL,
++ set);
++ } else if (!strcmp(option, "multicast_loop")) {
++ return nixio__gso_int(L, sock->fd, IPPROTO_IP, IP_MULTICAST_LOOP,
++ set);
++ } else if (!strcmp(option, "multicast_ttl")) {
++ return nixio__gso_int(L, sock->fd, IPPROTO_IP, IP_MULTICAST_TTL,
++ set);
++ } else if (!strcmp(option, "multicast_if")) {
++ return nixio__gso_mreq4(L, sock->fd, IPPROTO_IP, IP_MULTICAST_IF,
++ set);
++ } else if (!strcmp(option, "add_membership")) {
++ return nixio__gso_mreq4(L, sock->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
++ set);
++ } else if (!strcmp(option, "drop_membership")) {
++ return nixio__gso_mreq4(L, sock->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP,
++ set);
++ } else {
++ return luaL_argerror(L, 3,
++ "supported values: hdrincl, mtu, multicast_loop, "
++ "multicast_ttl, multicast_if, add_membership, drop_membership");
++ }
++ } else if (!strcmp(level, "ipv6")) {
++ if (!strcmp(option, "mtu")) {
++#ifdef IPV6_MTU
++ return nixio__gso_int(L, sock->fd, IPPROTO_IPV6, IPV6_MTU, set);
++#else
++ return nixio__pstatus(L, !(errno = ENOPROTOOPT));
++#endif
++ } else if (!strcmp(option, "v6only")) {
++#ifdef IPV6_V6ONLY
++ return nixio__gso_int(L, sock->fd, IPPROTO_IPV6, IPV6_V6ONLY, set);
++#else
++ return nixio__pstatus(L, !(errno = ENOPROTOOPT));
++#endif
++ } else if (!strcmp(option, "multicast_loop")) {
++ return nixio__gso_int(L, sock->fd, IPPROTO_IPV6,
++ IPV6_MULTICAST_LOOP, set);
++ } else if (!strcmp(option, "multicast_hops")) {
++ return nixio__gso_int(L, sock->fd, IPPROTO_IPV6,
++ IPV6_MULTICAST_HOPS, set);
++ } else if (!strcmp(option, "multicast_if")) {
++ return nixio__gso_mreq6(L, sock->fd, IPPROTO_IPV6,
++ IPV6_MULTICAST_IF, set);
++ } else if (!strcmp(option, "add_membership")) {
++ return nixio__gso_mreq6(L, sock->fd, IPPROTO_IPV6,
++ IPV6_ADD_MEMBERSHIP, set);
++ } else if (!strcmp(option, "drop_membership")) {
++ return nixio__gso_mreq6(L, sock->fd, IPPROTO_IPV6,
++ IPV6_DROP_MEMBERSHIP, set);
++ } else {
++ return luaL_argerror(L, 3,
++ "supported values: v6only, mtu, multicast_loop, multicast_hops,"
++ " multicast_if, add_membership, drop_membership");
++ }
++ } else {
++ return luaL_argerror(L, 2, "supported values: socket, tcp, ip, ipv6");
++ }
++}
++
++/**
++ * getsockopt()
++ */
++static int nixio_sock_getsockopt(lua_State *L) {
++ return nixio__getsetsockopt(L, 0);
++}
++
++/**
++ * setsockopt()
++ */
++static int nixio_sock_setsockopt(lua_State *L) {
++ return nixio__getsetsockopt(L, 1);
++}
++
++/* module table */
++static const luaL_reg M[] = {
++ {"setblocking", nixio_sock_setblocking},
++ {"getsockopt", nixio_sock_getsockopt},
++ {"setsockopt", nixio_sock_setsockopt},
++ {"getopt", nixio_sock_getsockopt},
++ {"setopt", nixio_sock_setsockopt},
++ {"fileno", nixio_sock_fileno},
++ {NULL, NULL}
++};
++
++void nixio_open_sockopt(lua_State *L) {
++ lua_pushvalue(L, -2);
++ luaL_register(L, NULL, M);
++ lua_pop(L, 1);
++
++ luaL_getmetatable(L, NIXIO_FILE_META);
++ lua_pushcfunction(L, nixio_sock_setblocking);
++ lua_setfield(L, -2, "setblocking");
++ lua_pushcfunction(L, nixio_sock_fileno);
++ lua_setfield(L, -2, "fileno");
++ lua_pop(L, 1);
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/splice.c b/feeds/luci/libs/luci-lib-nixio/src/splice.c
+new file mode 100644
+index 0000000..db63ea9
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/splice.c
+@@ -0,0 +1,185 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifdef __linux__
++#define _GNU_SOURCE
++#endif
++
++#include "nixio.h"
++#include <fcntl.h>
++#include <string.h>
++#include <errno.h>
++#include <unistd.h>
++#include <sys/param.h>
++
++
++#ifndef __WINNT__
++
++#ifndef BSD
++#include <sys/sendfile.h>
++#else
++#include <sys/types.h>
++#include <sys/socket.h>
++#include <sys/uio.h>
++#endif
++
++#ifdef _GNU_SOURCE
++#ifdef SPLICE_F_MOVE
++
++/* guess what sucks... */
++#ifdef __UCLIBC__
++#include <unistd.h>
++#include <sys/syscall.h>
++
++ssize_t splice(int __fdin, __off64_t *__offin, int __fdout,
++ __off64_t *__offout, size_t __len, unsigned int __flags) {
++#ifdef __NR_splice
++ return syscall(__NR_splice, __fdin, __offin, __fdout, __offout, __len, __flags);
++#else
++ (void)__fdin;
++ (void)__offin;
++ (void)__fdout;
++ (void)__offout;
++ (void)__len;
++ (void)__flags;
++ errno = ENOSYS;
++ return -1;
++#endif
++}
++
++#undef SPLICE_F_MOVE
++#undef SPLICE_F_NONBLOCK
++#undef SPLICE_F_MORE
++
++#define SPLICE_F_MOVE 1
++#define SPLICE_F_NONBLOCK 2
++#define SPLICE_F_MORE 4
++
++#endif /* __UCLIBC__ */
++
++/**
++ * splice(fd_in, fd_out, length, flags)
++ */
++static int nixio_splice(lua_State *L) {
++ int fd_in = nixio__checkfd(L, 1);
++ int fd_out = nixio__checkfd(L, 2);
++ size_t len = luaL_checkinteger(L, 3);
++ int flags = luaL_optinteger(L, 4, 0);
++ long spliced;
++
++ do {
++ spliced = splice(fd_in, NULL, fd_out, NULL, len, flags);
++ } while (spliced == -1 && errno == EINTR);
++
++ if (spliced < 0) {
++ return nixio__perror(L);
++ }
++
++ lua_pushinteger(L, spliced);
++ return 1;
++}
++
++/**
++ * Translate splice flags to integer
++ */
++static int nixio_splice_flags(lua_State *L) {
++ const int j = lua_gettop(L);
++ int flags = 0;
++ for (int i=1; i<=j; i++) {
++ const char *flag = luaL_checkstring(L, i);
++ if (!strcmp(flag, "move")) {
++ flags |= SPLICE_F_MOVE;
++ } else if (!strcmp(flag, "nonblock")) {
++ flags |= SPLICE_F_NONBLOCK;
++ } else if (!strcmp(flag, "more")) {
++ flags |= SPLICE_F_MORE;
++ } else {
++ return luaL_argerror(L, i, "supported values: "
++ "move, nonblock, more");
++ }
++ }
++ lua_pushinteger(L, flags);
++
++ return 1;
++}
++
++#endif /* SPLICE_F_MOVE */
++#endif /* _GNU_SOURCE */
++
++/**
++ * sendfile(outfd, infd, length)
++ */
++static int nixio_sendfile(lua_State *L) {
++ int sock = nixio__checksockfd(L);
++ int infd = nixio__checkfd(L, 2);
++ size_t len = luaL_checkinteger(L, 3);
++ off_t spliced;
++
++#ifndef BSD
++ do {
++ spliced = sendfile(sock, infd, NULL, len);
++ } while (spliced == -1 && errno == EINTR);
++
++ if (spliced == -1) {
++ return nixio__perror(L);
++ }
++#else
++ int r;
++ const off_t offset = lseek(infd, 0, SEEK_CUR);
++
++ do {
++#ifdef __DARWIN__
++ r = sendfile(infd, sock, offset, (off_t *)&len, NULL, 0);
++ spliced = r;
++#else
++ r = sendfile(infd, sock, offset, len, NULL, &spliced, 0);
++#endif
++ } while (r == -1 && errno == EINTR);
++
++ if (r == -1) {
++ return nixio__perror(L);
++ }
++#endif
++
++ lua_pushinteger(L, spliced);
++ return 1;
++}
++
++/* module table */
++static const luaL_reg R[] = {
++#ifdef _GNU_SOURCE
++#ifdef SPLICE_F_MOVE
++ {"splice", nixio_splice},
++ {"splice_flags", nixio_splice_flags},
++#endif
++#endif
++ {"sendfile", nixio_sendfile},
++ {NULL, NULL}
++};
++
++
++void nixio_open_splice(lua_State *L) {
++ luaL_register(L, NULL, R);
++}
++
++#else /* __WINNT__ */
++
++void nixio_open_splice(lua_State *L) {
++}
++
++#endif /* !__WINNT__ */
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/syslog.c b/feeds/luci/libs/luci-lib-nixio/src/syslog.c
+new file mode 100644
+index 0000000..89f1b1d
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/syslog.c
+@@ -0,0 +1,122 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <string.h>
++
++#ifndef __WINNT__
++#include <syslog.h>
++
++
++static int nixio_openlog(lua_State *L) {
++ int option = 0, facility = LOG_USER;
++
++ const char *ident = luaL_optstring(L, 1, "nixio");
++ const int j = lua_gettop(L);
++ for (int i=2; i<=j; i++) {
++ const char *flag = luaL_checkstring(L, i);
++ if (!strcmp(flag, "cons")) {
++ option |= LOG_CONS;
++ } else if (!strcmp(flag, "nowait")) {
++ option |= LOG_NOWAIT;
++ } else if (!strcmp(flag, "pid")) {
++ option |= LOG_PID;
++ } else if (!strcmp(flag, "perror")) {
++#ifdef LOG_PERROR
++ option |= LOG_PERROR;
++#endif
++ } else if (!strcmp(flag, "ndelay")) {
++ option |= LOG_NDELAY;
++ } else if (!strcmp(flag, "odelay")) {
++ option |= LOG_ODELAY;
++ } else {
++ return luaL_argerror(L, i,
++ "supported values: cons, nowait, pid, perror, ndelay, odelay");
++ }
++ }
++
++ openlog(ident, option, facility);
++ return 0;
++}
++
++static int nixio_closelog(lua_State *L) {
++ closelog();
++ return 0;
++}
++
++static int nixio__syslogmask(lua_State *L, int dolog) {
++ int priority;
++
++ const char *flag = luaL_checkstring(L, 1);
++ if (!strcmp(flag, "emerg")) {
++ priority = LOG_EMERG;
++ } else if (!strcmp(flag, "alert")) {
++ priority = LOG_ALERT;
++ } else if (!strcmp(flag, "crit")) {
++ priority = LOG_CRIT;
++ } else if (!strcmp(flag, "err")) {
++ priority = LOG_ERR;
++ } else if (!strcmp(flag, "warning")) {
++ priority = LOG_WARNING;
++ } else if (!strcmp(flag, "notice")) {
++ priority = LOG_NOTICE;
++ } else if (!strcmp(flag, "info")) {
++ priority = LOG_INFO;
++ } else if (!strcmp(flag, "debug")) {
++ priority = LOG_DEBUG;
++ } else {
++ return luaL_argerror(L, 1, "supported values: emerg, alert, crit, err, "
++ "warning, notice, info, debug");
++ }
++
++ if (dolog) {
++ const char *msg = luaL_checkstring(L, 2);
++ syslog(priority, "%s", msg);
++ } else {
++ setlogmask(LOG_UPTO(priority));
++ }
++ return 0;
++}
++
++static int nixio_setlogmask(lua_State *L) {
++ return nixio__syslogmask(L, 0);
++}
++
++static int nixio_syslog(lua_State *L) {
++ return nixio__syslogmask(L, 1);
++}
++
++/* module table */
++static const luaL_reg R[] = {
++ {"openlog", nixio_openlog},
++ {"syslog", nixio_syslog},
++ {"setlogmask", nixio_setlogmask},
++ {"closelog", nixio_closelog},
++ {NULL, NULL}
++};
++
++void nixio_open_syslog(lua_State *L) {
++ luaL_register(L, NULL, R);
++}
++
++#else /* __WINNT__ */
++
++void nixio_open_syslog(lua_State *L) {
++}
++
++#endif /* __WINNT__ */
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/tls-context.c b/feeds/luci/libs/luci-lib-nixio/src/tls-context.c
+new file mode 100644
+index 0000000..e9a833f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/tls-context.c
+@@ -0,0 +1,248 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio-tls.h"
++#include <string.h>
++
++static SSL_CTX* nixio__checktlsctx(lua_State *L) {
++ SSL_CTX **ctx = (SSL_CTX **)luaL_checkudata(L, 1, NIXIO_TLS_CTX_META);
++ luaL_argcheck(L, *ctx, 1, "invalid context");
++ return *ctx;
++}
++
++static int nixio__tls_perror(lua_State *L, int code) {
++ lua_pushnil(L);
++ lua_pushinteger(L, code);
++ return 2;
++}
++
++static int nixio__tls_pstatus(lua_State *L, int code) {
++ if (code == 1) {
++ lua_pushboolean(L, 1);
++ return 1;
++ } else {
++ return nixio__tls_perror(L, code);
++ }
++}
++
++static int nixio_tls_ctx(lua_State * L) {
++ const char *method = luaL_optlstring(L, 1, "client", NULL);
++
++ luaL_getmetatable(L, NIXIO_TLS_CTX_META);
++ SSL_CTX **ctx = lua_newuserdata(L, sizeof(SSL_CTX *));
++ if (!ctx) {
++ return luaL_error(L, "out of memory");
++ }
++
++ /* create userdata */
++ lua_pushvalue(L, -2);
++ lua_setmetatable(L, -2);
++
++ if (!strcmp(method, "client")) {
++ *ctx = SSL_CTX_new(TLSv1_client_method());
++ } else if (!strcmp(method, "server")) {
++ *ctx = SSL_CTX_new(TLSv1_server_method());
++ } else {
++ return luaL_argerror(L, 1, "supported values: client, server");
++ }
++
++ if (!(*ctx)) {
++ return luaL_error(L, "unable to create TLS context");
++ }
++
++#ifdef WITH_CYASSL
++ SSL_CTX_set_verify(*ctx, SSL_VERIFY_NONE, NULL);
++#endif
++
++ return 1;
++}
++
++static int nixio_tls_ctx_create(lua_State *L) {
++ SSL_CTX *ctx = nixio__checktlsctx(L);
++ int fd = nixio__checkfd(L, 2);
++
++ lua_createtable(L, 0, 3);
++ nixio_tls_sock *sock = lua_newuserdata(L, sizeof(nixio_tls_sock));
++ if (!sock) {
++ return luaL_error(L, "out of memory");
++ }
++ memset(sock, 0, sizeof(nixio_tls_sock));
++
++ /* create userdata */
++ luaL_getmetatable(L, NIXIO_TLS_SOCK_META);
++ lua_pushvalue(L, -1);
++ lua_setmetatable(L, -3);
++
++ sock->socket = SSL_new(ctx);
++ if (!sock->socket) {
++ return nixio__tls_perror(L, 0);
++ }
++
++ if (SSL_set_fd(sock->socket, fd) != 1) {
++ return nixio__tls_perror(L, 0);
++ }
++
++ /* save context and socket to prevent GC from collecting them */
++ lua_setmetatable(L, -3);
++ lua_setfield(L, -2, "connection");
++
++ lua_pushvalue(L, 1);
++ lua_setfield(L, -2, "context");
++
++ lua_pushvalue(L, 2);
++ lua_setfield(L, -2, "socket");
++
++ return 1;
++}
++
++static int nixio_tls_ctx_set_cert(lua_State *L) {
++ SSL_CTX *ctx = nixio__checktlsctx(L);
++ const char *cert = luaL_checkstring(L, 2);
++ const char *type = luaL_optstring(L, 3, "chain");
++ int ktype;
++
++ if (!strcmp(type, "chain")) {
++ return nixio__tls_pstatus(L,
++ SSL_CTX_use_certificate_chain_file(ctx, cert));
++ } else if (!strcmp(type, "pem")) {
++ ktype = SSL_FILETYPE_PEM;
++ } else if (!strcmp(type, "asn1")) {
++ ktype = SSL_FILETYPE_ASN1;
++ } else {
++ return luaL_argerror(L, 3, "supported values: chain, pem, asn1");
++ }
++
++ return nixio__tls_pstatus(L,
++ SSL_CTX_use_certificate_file(ctx, cert, ktype));
++}
++
++static int nixio_tls_ctx_set_verify_locations(lua_State *L) {
++ SSL_CTX *ctx = nixio__checktlsctx(L);
++ const char *CAfile = luaL_optstring(L, 2, NULL);
++ const char *CApath = luaL_optstring(L, 3, NULL);
++ return nixio__tls_pstatus(L, SSL_CTX_load_verify_locations(ctx,
++ CAfile, CApath));
++}
++
++static int nixio_tls_ctx_set_key(lua_State *L) {
++ SSL_CTX *ctx = nixio__checktlsctx(L);
++ const char *cert = luaL_checkstring(L, 2);
++ const char *type = luaL_optstring(L, 3, "pem");
++ int ktype;
++
++ if (!strcmp(type, "pem")) {
++ ktype = SSL_FILETYPE_PEM;
++ } else if (!strcmp(type, "asn1")) {
++ ktype = SSL_FILETYPE_ASN1;
++ } else {
++ return luaL_argerror(L, 3, "supported values: pem, asn1");
++ }
++
++ return nixio__tls_pstatus(L, SSL_CTX_use_PrivateKey_file(ctx, cert, ktype));
++}
++
++static int nixio_tls_ctx_set_ciphers(lua_State *L) {
++ SSL_CTX *ctx = nixio__checktlsctx(L);
++ size_t len;
++ const char *ciphers = luaL_checklstring(L, 2, &len);
++ luaL_argcheck(L, len < 255, 2, "cipher string too long");
++ return nixio__tls_pstatus(L, SSL_CTX_set_cipher_list(ctx, ciphers));
++}
++
++static int nixio_tls_ctx_set_verify(lua_State *L) {
++ SSL_CTX *ctx = nixio__checktlsctx(L);
++ const int j = lua_gettop(L);
++ int flags = 0;
++ for (int i=2; i<=j; i++) {
++ const char *flag = luaL_checkstring(L, i);
++ if (!strcmp(flag, "none")) {
++ flags |= SSL_VERIFY_NONE;
++ } else if (!strcmp(flag, "peer")) {
++ flags |= SSL_VERIFY_PEER;
++ } else if (!strcmp(flag, "verify_fail_if_no_peer_cert")) {
++ flags |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
++ } else if (!strcmp(flag, "client_once")) {
++ flags |= SSL_VERIFY_CLIENT_ONCE;
++ } else {
++ return luaL_argerror(L, i, "supported values: none, peer, "
++ "verify_fail_if_no_peer_cert, client_once");
++ }
++ }
++ SSL_CTX_set_verify(ctx, flags, NULL);
++ return 0;
++}
++
++static int nixio_tls_ctx__gc(lua_State *L) {
++ SSL_CTX **ctx = (SSL_CTX **)luaL_checkudata(L, 1, NIXIO_TLS_CTX_META);
++ if (*ctx) {
++ SSL_CTX_free(*ctx);
++ *ctx = NULL;
++ }
++ return 0;
++}
++
++static int nixio_tls_ctx__tostring(lua_State *L) {
++ SSL_CTX *ctx = nixio__checktlsctx(L);
++ lua_pushfstring(L, "nixio TLS context: %p", ctx);
++ return 1;
++}
++
++/* module table */
++static const luaL_reg R[] = {
++ {"tls", nixio_tls_ctx},
++ {NULL, NULL}
++};
++
++/* ctx function table */
++static const luaL_reg CTX_M[] = {
++ {"set_cert", nixio_tls_ctx_set_cert},
++ {"set_verify_locations", nixio_tls_ctx_set_verify_locations},
++ {"set_key", nixio_tls_ctx_set_key},
++ {"set_ciphers", nixio_tls_ctx_set_ciphers},
++ {"set_verify", nixio_tls_ctx_set_verify},
++ {"create", nixio_tls_ctx_create},
++ {"__gc", nixio_tls_ctx__gc},
++ {"__tostring", nixio_tls_ctx__tostring},
++ {NULL, NULL}
++};
++
++
++void nixio_open_tls_context(lua_State *L) {
++ /* initialize tls library */
++ SSL_load_error_strings();
++ SSL_library_init();
++
++ /* register module functions */
++ luaL_register(L, NULL, R);
++
++#if defined (WITH_AXTLS)
++ lua_pushliteral(L, "axtls");
++#elif defined (WITH_CYASSL)
++ lua_pushliteral(L, "cyassl");
++#else
++ lua_pushliteral(L, "openssl");
++#endif
++ lua_setfield(L, -2, "tls_provider");
++
++ /* create context metatable */
++ luaL_newmetatable(L, NIXIO_TLS_CTX_META);
++ lua_pushvalue(L, -1);
++ lua_setfield(L, -2, "__index");
++ luaL_register(L, NULL, CTX_M);
++ lua_setfield(L, -2, "meta_tls_context");
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/tls-crypto.c b/feeds/luci/libs/luci-lib-nixio/src/tls-crypto.c
+new file mode 100644
+index 0000000..714ec4e
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/tls-crypto.c
+@@ -0,0 +1,185 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio-tls.h"
++#include <stdlib.h>
++#include <string.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <unistd.h>
++
++static int nixio_crypto_hash__init(lua_State *L, int hmac) {
++ const char *type = luaL_checkstring(L, 1);
++ nixio_hash *hash = lua_newuserdata(L, sizeof(nixio_hash));
++
++ if (!strcmp(type, "md5")) {
++ hash->type = NIXIO_HASH_MD5;
++ hash->digest_size = MD5_DIGEST_LENGTH;
++ hash->block_size = 64;
++ hash->ctx = malloc(sizeof(MD5_CTX));
++ if (!hash->ctx) {
++ return luaL_error(L, NIXIO_OOM);
++ }
++ MD5_Init((MD5_CTX*)hash->ctx);
++ hash->init = (nixio_hash_initcb)MD5_Init;
++ hash->update = (nixio_hash_updatecb)MD5_Update;
++ hash->final = (nixio_hash_finalcb)MD5_Final;
++ } else if (!strcmp(type, "sha1")) {
++ hash->type = NIXIO_HASH_SHA1;
++ hash->digest_size = SHA_DIGEST_LENGTH;
++ hash->block_size = 64;
++ hash->ctx = malloc(sizeof(SHA_CTX));
++ if (!hash->ctx) {
++ return luaL_error(L, NIXIO_OOM);
++ }
++ SHA1_Init((SHA_CTX*)hash->ctx);
++ hash->init = (nixio_hash_initcb)SHA1_Init;
++ hash->update = (nixio_hash_updatecb)SHA1_Update;
++ hash->final = (nixio_hash_finalcb)SHA1_Final;
++ } else {
++ luaL_argerror(L, 1, "supported values: md5, sha1");
++ }
++
++ luaL_getmetatable(L, NIXIO_CRYPTO_HASH_META);
++ lua_setmetatable(L, -2);
++
++ if (hmac) {
++ const char *key = luaL_checklstring(L, 2, &hash->key_size);
++ if (hash->key_size > hash->block_size) {
++ hash->update(hash->ctx, key, hash->key_size);
++ hash->final(hash->digest, hash->ctx);
++ hash->init(hash->ctx);
++ hash->key_size = hash->digest_size;
++ memcpy(hash->key, hash->digest, hash->key_size);
++ } else {
++ memcpy(hash->key, key, hash->key_size);
++ }
++
++ unsigned char pad[NIXIO_CRYPTO_BLOCK_SIZE];
++ for (uint i = 0; i < hash->block_size; i++) {
++ pad[i] = (i < hash->key_size) ? (0x36 ^ hash->key[i]) : 0x36;
++ }
++ hash->update(hash->ctx, pad, hash->block_size);
++ hash->type |= NIXIO_HMAC_BIT;
++ }
++
++ return 1;
++}
++
++static int nixio_crypto_hash(lua_State *L) {
++ return nixio_crypto_hash__init(L, 0);
++}
++
++static int nixio_crypto_hmac(lua_State *L) {
++ return nixio_crypto_hash__init(L, 1);
++}
++
++static int nixio_crypto_hash_update(lua_State *L) {
++ nixio_hash *hash = luaL_checkudata(L, 1, NIXIO_CRYPTO_HASH_META);
++ if (hash->type) {
++ size_t len;
++ const char *chunk = luaL_checklstring(L, 2, &len);
++ hash->update(hash->ctx, chunk, len);
++ lua_pushvalue(L, 1);
++ return 1;
++ } else {
++ return luaL_error(L, "Tried to update finalized hash object.");
++ }
++}
++
++static int nixio_crypto_hash_final(lua_State *L) {
++ nixio_hash *hash = luaL_checkudata(L, 1, NIXIO_CRYPTO_HASH_META);
++ if (hash->type & NIXIO_HMAC_BIT) {
++ hash->final(hash->digest, hash->ctx);
++ hash->init(hash->ctx);
++
++ unsigned char pad[NIXIO_CRYPTO_BLOCK_SIZE];
++ for (uint i = 0; i < hash->block_size; i++) {
++ pad[i] = (i < hash->key_size) ? (0x5c ^ hash->key[i]) : 0x5c;
++ }
++
++ hash->update(hash->ctx, pad, hash->block_size);
++ hash->update(hash->ctx, hash->digest, hash->digest_size);
++ }
++
++ if (hash->type) {
++ hash->type = NIXIO_HASH_NONE;
++ hash->final(hash->digest, hash->ctx);
++ free(hash->ctx);
++ }
++
++ char hashdigest[NIXIO_DIGEST_SIZE*2];
++ for (uint i=0; i < hash->digest_size; i++) {
++ hashdigest[2*i] = nixio__bin2hex[(hash->digest[i] & 0xf0) >> 4];
++ hashdigest[2*i+1] = nixio__bin2hex[(hash->digest[i] & 0x0f)];
++ }
++
++ lua_pushlstring(L, hashdigest, hash->digest_size * 2);
++ memcpy(hashdigest, hash->digest, hash->digest_size);
++ lua_pushlstring(L, hashdigest, hash->digest_size);
++
++ return 2;
++}
++
++static int nixio_crypto_hash__gc(lua_State *L) {
++ nixio_hash *hash = luaL_checkudata(L, 1, NIXIO_CRYPTO_HASH_META);
++ if (hash->type) {
++ hash->final(hash->digest, hash->ctx);
++ free(hash->ctx);
++ hash->type = NIXIO_HASH_NONE;
++ }
++ return 0;
++}
++
++static int nixio_crypto_hash__tostring(lua_State *L) {
++ nixio_hash *hash = luaL_checkudata(L, 1, NIXIO_CRYPTO_HASH_META);
++ lua_pushfstring(L, "nixio hash object: %p", hash);
++ return 1;
++}
++
++
++/* module table */
++static const luaL_reg R[] = {
++ {"hash", nixio_crypto_hash},
++ {"hmac", nixio_crypto_hmac},
++ {NULL, NULL}
++};
++
++/* hash table */
++static const luaL_reg M[] = {
++ {"update", nixio_crypto_hash_update},
++ {"final", nixio_crypto_hash_final},
++ {"__gc", nixio_crypto_hash__gc},
++ {"__tostring", nixio_crypto_hash__tostring},
++ {NULL, NULL}
++};
++
++
++
++void nixio_open_tls_crypto(lua_State *L) {
++ luaL_newmetatable(L, NIXIO_CRYPTO_HASH_META);
++ luaL_register(L, NULL, M);
++ lua_pushvalue(L, -1);
++ lua_setfield(L, -2, "__index");
++ lua_pop(L, 1);
++
++ lua_newtable(L);
++ luaL_register(L, NULL, R);
++
++ lua_setfield(L, -2, "crypto");
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/tls-socket.c b/feeds/luci/libs/luci-lib-nixio/src/tls-socket.c
+new file mode 100644
+index 0000000..fe4cb60
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/tls-socket.c
+@@ -0,0 +1,263 @@
++ /*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio-tls.h"
++#include <string.h>
++#include <stdlib.h>
++
++static int nixio__tls_sock_perror(lua_State *L, SSL *sock, int code) {
++ lua_pushnil(L);
++ lua_pushinteger(L, SSL_get_error(sock, code));
++ return 2;
++}
++
++static int nixio__tls_sock_pstatus(lua_State *L, SSL *sock, int code) {
++ if (code > 0) {
++ lua_pushboolean(L, 1);
++ return 1;
++ } else {
++ return nixio__tls_sock_perror(L, sock, code);
++ }
++}
++
++static SSL* nixio__checktlssock(lua_State *L) {
++ if (lua_istable(L, 1)) {
++ lua_getfield(L, 1, "connection");
++ lua_replace(L, 1);
++ }
++ nixio_tls_sock *sock = luaL_checkudata(L, 1, NIXIO_TLS_SOCK_META);
++ luaL_argcheck(L, sock->socket, 1, "invalid context");
++ return sock->socket;
++}
++
++#ifndef WITH_AXTLS
++#define nixio_tls__check_connected(L) ;
++
++#define nixio_tls__set_connected(L, val) ;
++#else
++#define nixio_tls__check_connected(L) \
++ nixio_tls_sock *ctsock = luaL_checkudata(L, 1, NIXIO_TLS_SOCK_META); \
++ if (!ctsock->connected) { \
++ lua_pushnil(L); \
++ lua_pushinteger(L, 1); \
++ return 2; \
++ }
++
++#define nixio_tls__set_connected(L, val) \
++((nixio_tls_sock*)luaL_checkudata(L, 1, NIXIO_TLS_SOCK_META))->connected = val;
++#endif /* WITH_AXTLS */
++
++static int nixio_tls_sock_recv(lua_State *L) {
++ SSL *sock = nixio__checktlssock(L);
++ nixio_tls__check_connected(L);
++ uint req = luaL_checkinteger(L, 2);
++
++ luaL_argcheck(L, req >= 0, 2, "out of range");
++
++ /* We limit the readsize to NIXIO_BUFFERSIZE */
++ req = (req > NIXIO_BUFFERSIZE) ? NIXIO_BUFFERSIZE : req;
++
++#ifndef WITH_AXTLS
++
++ char buffer[NIXIO_BUFFERSIZE];
++ int readc = SSL_read(sock, buffer, req);
++
++ if (readc < 0) {
++ return nixio__tls_sock_pstatus(L, sock, readc);
++ } else {
++ lua_pushlstring(L, buffer, readc);
++ return 1;
++ }
++
++#else
++
++ if (!req) {
++ lua_pushliteral(L, "");
++ return 1;
++ }
++
++ nixio_tls_sock *t = lua_touserdata(L, 1);
++
++ /* AXTLS doesn't handle buffering for us, so we have to hack around*/
++ if (req < t->pbufsiz) {
++ lua_pushlstring(L, t->pbufpos, req);
++ t->pbufpos += req;
++ t->pbufsiz -= req;
++ return 1;
++ } else {
++ uint8_t *axbuf;
++ int axread;
++
++ /* while handshake pending */
++ while ((axread = ssl_read(sock, &axbuf)) == SSL_OK);
++
++ if (t->pbufsiz) {
++ lua_pushlstring(L, t->pbufpos, t->pbufsiz);
++ }
++
++ if (axread < 0) {
++ /* There is an error */
++ free(t->pbuffer);
++ t->pbuffer = t->pbufpos = NULL;
++
++ if (axread != SSL_ERROR_CONN_LOST) {
++ t->pbufsiz = 0;
++ return nixio__tls_sock_perror(L, sock, axread);
++ } else {
++ if (!t->pbufsiz) {
++ lua_pushliteral(L, "");
++ } else {
++ t->pbufsiz = 0;
++ }
++ }
++ } else {
++ int stillwant = req - t->pbufsiz;
++ if (stillwant < axread) {
++ /* we got more data than we need */
++ lua_pushlstring(L, (char *)axbuf, stillwant);
++ if(t->pbufsiz) {
++ lua_concat(L, 2);
++ }
++
++ /* remaining data goes into the buffer */
++ t->pbufpos = t->pbuffer;
++ t->pbufsiz = axread - stillwant;
++ t->pbuffer = realloc(t->pbuffer, t->pbufsiz);
++ if (!t->pbuffer) {
++ free(t->pbufpos);
++ t->pbufpos = NULL;
++ t->pbufsiz = 0;
++ return luaL_error(L, "out of memory");
++ }
++
++ t->pbufpos = t->pbuffer;
++ memcpy(t->pbufpos, axbuf + stillwant, t->pbufsiz);
++ } else {
++ lua_pushlstring(L, (char *)axbuf, axread);
++ if(t->pbufsiz) {
++ lua_concat(L, 2);
++ }
++
++ /* free buffer */
++ free(t->pbuffer);
++ t->pbuffer = t->pbufpos = NULL;
++ t->pbufsiz = 0;
++ }
++ }
++ return 1;
++ }
++
++#endif /* WITH_AXTLS */
++
++}
++
++static int nixio_tls_sock_send(lua_State *L) {
++ SSL *sock = nixio__checktlssock(L);
++ nixio_tls__check_connected(L);
++ size_t len;
++ ssize_t sent;
++ const char *data = luaL_checklstring(L, 2, &len);
++
++ if (lua_gettop(L) > 2) {
++ int offset = luaL_optint(L, 3, 0);
++ if (offset) {
++ if (offset < len) {
++ data += offset;
++ len -= offset;
++ } else {
++ len = 0;
++ }
++ }
++
++ unsigned int wlen = luaL_optint(L, 4, len);
++ if (wlen < len) {
++ len = wlen;
++ }
++ }
++
++ sent = SSL_write(sock, data, len);
++ if (sent > 0) {
++ lua_pushinteger(L, sent);
++ return 1;
++ } else {
++ return nixio__tls_sock_pstatus(L, sock, sent);
++ }
++}
++
++static int nixio_tls_sock_accept(lua_State *L) {
++ SSL *sock = nixio__checktlssock(L);
++ const int stat = SSL_accept(sock);
++ nixio_tls__set_connected(L, stat == 1);
++ return nixio__tls_sock_pstatus(L, sock, stat);
++}
++
++static int nixio_tls_sock_connect(lua_State *L) {
++ SSL *sock = nixio__checktlssock(L);
++ const int stat = SSL_connect(sock);
++ nixio_tls__set_connected(L, stat == 1);
++ return nixio__tls_sock_pstatus(L, sock, stat);
++}
++
++static int nixio_tls_sock_shutdown(lua_State *L) {
++ SSL *sock = nixio__checktlssock(L);
++ nixio_tls__set_connected(L, 0);
++ return nixio__tls_sock_pstatus(L, sock, SSL_shutdown(sock));
++}
++
++static int nixio_tls_sock__gc(lua_State *L) {
++ nixio_tls_sock *sock = luaL_checkudata(L, 1, NIXIO_TLS_SOCK_META);
++ if (sock->socket) {
++ SSL_free(sock->socket);
++ sock->socket = NULL;
++#ifdef WITH_AXTLS
++ free(sock->pbuffer);
++#endif
++ }
++ return 0;
++}
++
++static int nixio_tls_sock__tostring(lua_State *L) {
++ SSL *sock = nixio__checktlssock(L);
++ lua_pushfstring(L, "nixio TLS connection: %p", sock);
++ return 1;
++}
++
++
++/* ctx function table */
++static const luaL_reg M[] = {
++ {"recv", nixio_tls_sock_recv},
++ {"send", nixio_tls_sock_send},
++ {"read", nixio_tls_sock_recv},
++ {"write", nixio_tls_sock_send},
++ {"accept", nixio_tls_sock_accept},
++ {"connect", nixio_tls_sock_connect},
++ {"shutdown", nixio_tls_sock_shutdown},
++ {"__gc", nixio_tls_sock__gc},
++ {"__tostring", nixio_tls_sock__tostring},
++ {NULL, NULL}
++};
++
++
++void nixio_open_tls_socket(lua_State *L) {
++ /* create socket metatable */
++ luaL_newmetatable(L, NIXIO_TLS_SOCK_META);
++ luaL_register(L, NULL, M);
++ lua_pushvalue(L, -1);
++ lua_setfield(L, -2, "__index");
++ lua_setfield(L, -2, "meta_tls_socket");
++}
+diff --git a/feeds/luci/libs/luci-lib-nixio/src/user.c b/feeds/luci/libs/luci-lib-nixio/src/user.c
+new file mode 100644
+index 0000000..b701bac
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-nixio/src/user.c
+@@ -0,0 +1,263 @@
++/*
++ * nixio - Linux I/O library for lua
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "nixio.h"
++#include <sys/types.h>
++#include <errno.h>
++#include <unistd.h>
++#include <sys/param.h>
++
++#ifndef __WINNT__
++
++#include <grp.h>
++#include <pwd.h>
++
++#ifndef BSD
++#ifndef NO_SHADOW
++#include <shadow.h>
++#endif
++#include <crypt.h>
++#endif
++
++int nixio__check_group(lua_State *L, int idx) {
++ if (lua_isnumber(L, idx)) {
++ return lua_tointeger(L, idx);
++ } else if (lua_isstring(L, idx)) {
++ struct group *g = getgrnam(lua_tostring(L, idx));
++ return (!g) ? -1 : g->gr_gid;
++ } else {
++ return luaL_argerror(L, idx, "supported values: <groupname>, <gid>");
++ }
++}
++
++int nixio__check_user(lua_State *L, int idx) {
++ if (lua_isnumber(L, idx)) {
++ return lua_tointeger(L, idx);
++ } else if (lua_isstring(L, idx)) {
++ struct passwd *p = getpwnam(lua_tostring(L, idx));
++ return (!p) ? -1 : p->pw_uid;
++ } else {
++ return luaL_argerror(L, idx, "supported values: <username>, <uid>");
++ }
++}
++
++
++static int nixio__push_group(lua_State *L, struct group *gr) {
++ lua_createtable(L, 0, 4);
++ lua_pushstring(L, gr->gr_name);
++ lua_setfield(L, -2, "name");
++ lua_pushstring(L, gr->gr_passwd);
++ lua_setfield(L, -2, "passwd");
++ lua_pushinteger(L, gr->gr_gid);
++ lua_setfield(L, -2, "gid");
++ lua_newtable(L);
++
++ for (int i=0; gr->gr_mem[i]; i++) {
++ lua_pushstring(L, gr->gr_mem[i]);
++ lua_rawseti(L, -2, i+1);
++ }
++
++ lua_setfield(L, -2, "mem");
++ return 1;
++}
++
++static int nixio_getgr(lua_State *L) {
++ struct group *gr;
++ errno = 0;
++ if (lua_isnumber(L, 1)) {
++ gr = getgrgid(lua_tointeger(L, 1));
++ } else if (lua_isstring(L, 1)) {
++ gr = getgrnam(lua_tostring(L, 1));
++ } else if (lua_isnoneornil(L, 1)) {
++ lua_newtable(L);
++ int i = 0;
++
++ setgrent();
++ while ((gr = getgrent())) {
++ nixio__push_group(L, gr);
++ lua_rawseti(L, -2, ++i);
++ }
++
++ if (errno) {
++ return nixio__perror(L);
++ }
++
++ endgrent();
++ return 1;
++ } else {
++ return luaL_argerror(L, 1, "supported values: <groupname>, <gid>");
++ }
++
++ if (!gr) {
++ return nixio__perror(L);
++ } else {
++ return nixio__push_group(L, gr);
++ }
++}
++
++static int nixio__push_passwd(lua_State *L, struct passwd *pw) {
++ lua_createtable(L, 0, 7);
++ lua_pushstring(L, pw->pw_name);
++ lua_setfield(L, -2, "name");
++ lua_pushstring(L, pw->pw_passwd);
++ lua_setfield(L, -2, "passwd");
++ lua_pushinteger(L, pw->pw_gid);
++ lua_setfield(L, -2, "gid");
++ lua_pushinteger(L, pw->pw_uid);
++ lua_setfield(L, -2, "uid");
++ lua_pushstring(L, pw->pw_dir);
++ lua_setfield(L, -2, "dir");
++ lua_pushstring(L, pw->pw_gecos);
++ lua_setfield(L, -2, "gecos");
++ lua_pushstring(L, pw->pw_shell);
++ lua_setfield(L, -2, "shell");
++ return 1;
++}
++
++static int nixio_getpw(lua_State *L) {
++ struct passwd *pw;
++ errno = 0;
++ if (lua_isnumber(L, 1)) {
++ pw = getpwuid(lua_tointeger(L, 1));
++ } else if (lua_isstring(L, 1)) {
++ pw = getpwnam(lua_tostring(L, 1));
++ } else if (lua_isnoneornil(L, 1)) {
++ lua_newtable(L);
++ int i = 0;
++
++ setpwent();
++ while ((pw = getpwent())) {
++ nixio__push_passwd(L, pw);
++ lua_rawseti(L, -2, ++i);
++ }
++
++ if (errno) {
++ return nixio__perror(L);
++ }
++
++ endpwent();
++ return 1;
++ } else {
++ return luaL_argerror(L, 1, "supported values: <username>, <uid>");
++ }
++
++ if (!pw) {
++ return nixio__perror(L);
++ } else {
++ return nixio__push_passwd(L, pw);
++ }
++}
++
++#ifndef BSD
++#ifndef NO_SHADOW
++static int nixio__push_spwd(lua_State *L, struct spwd *sp) {
++ lua_createtable(L, 0, 9);
++ lua_pushstring(L, sp->sp_namp);
++ lua_setfield(L, -2, "namp");
++ lua_pushinteger(L, sp->sp_expire);
++ lua_setfield(L, -2, "expire");
++ lua_pushinteger(L, sp->sp_flag);
++ lua_setfield(L, -2, "flag");
++ lua_pushinteger(L, sp->sp_inact);
++ lua_setfield(L, -2, "inact");
++ lua_pushinteger(L, sp->sp_lstchg);
++ lua_setfield(L, -2, "lstchg");
++ lua_pushinteger(L, sp->sp_max);
++ lua_setfield(L, -2, "max");
++ lua_pushinteger(L, sp->sp_min);
++ lua_setfield(L, -2, "min");
++ lua_pushinteger(L, sp->sp_warn);
++ lua_setfield(L, -2, "warn");
++ lua_pushstring(L, sp->sp_pwdp);
++ lua_setfield(L, -2, "pwdp");
++ return 1;
++}
++
++static int nixio_getsp(lua_State *L) {
++ struct spwd *sp;
++ errno = 0;
++ if (lua_isstring(L, 1)) {
++ sp = getspnam(lua_tostring(L, 1));
++ } else if (lua_isnoneornil(L, 1)) {
++ lua_newtable(L);
++ int i = 0;
++
++ setspent();
++ while ((sp = getspent())) {
++ nixio__push_spwd(L, sp);
++ lua_rawseti(L, -2, ++i);
++ }
++
++ if (errno) {
++ return nixio__perror(L);
++ }
++
++ endspent();
++ return 1;
++ } else {
++ return luaL_argerror(L, 1, "supported values: <username>");
++ }
++
++ if (!sp) {
++ return nixio__perror(L);
++ } else {
++ return nixio__push_spwd(L, sp);
++ }
++}
++#endif /* !NO_SHADOW */
++#endif /* !BSD */
++
++static int nixio_crypt(lua_State *L) {
++ const char *key = luaL_checkstring(L, 1);
++ const char *salt = luaL_checkstring(L, 2);
++ const char *hash = crypt(key, salt);
++
++ if (hash) {
++ lua_pushstring(L, hash);
++ } else {
++ lua_pushnil(L);
++ }
++
++ return 1;
++}
++
++
++/* module table */
++static const luaL_reg R[] = {
++ {"crypt", nixio_crypt},
++ {"getgr", nixio_getgr},
++ {"getpw", nixio_getpw},
++#ifndef BSD
++#ifndef NO_SHADOW
++ {"getsp", nixio_getsp},
++#endif
++#endif
++ {NULL, NULL}
++};
++
++#else /* __WINNT__ */
++
++static const luaL_reg R[] = {
++ {NULL, NULL}
++};
++
++#endif
++
++void nixio_open_user(lua_State *L) {
++ luaL_register(L, NULL, R);
++}
+diff --git a/feeds/luci/libs/luci-lib-px5g/Makefile b/feeds/luci/libs/luci-lib-px5g/Makefile
+new file mode 100644
+index 0000000..70b95e8
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/Makefile
+@@ -0,0 +1,16 @@
++#
++# 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_TITLE:=RSA/X.509 Key Generator (required for LuCId SSL support)
++LUCI_DEPENDS:=+liblua
++
++PKG_USE_MIPS16:=0
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/libs/luci-lib-px5g/lua/px5g/util.lua b/feeds/luci/libs/luci-lib-px5g/lua/px5g/util.lua
+new file mode 100644
+index 0000000..0f07c81
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/lua/px5g/util.lua
+@@ -0,0 +1,44 @@
++--[[
++ * px5g - Embedded x509 key and certificate generator based on PolarSSL
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License, version 2.1 as published by the Free Software Foundation.
++]]--
++
++local nixio = require "nixio"
++local table = require "table"
++
++module "px5g.util"
++
++local preamble = {
++ key = "-----BEGIN RSA PRIVATE KEY-----",
++ cert = "-----BEGIN CERTIFICATE-----",
++ request = "-----BEGIN CERTIFICATE REQUEST-----"
++}
++
++local postamble = {
++ key = "-----END RSA PRIVATE KEY-----",
++ cert = "-----END CERTIFICATE-----",
++ request = "-----END CERTIFICATE REQUEST-----"
++}
++
++function der2pem(data, type)
++ local b64 = nixio.bin.b64encode(data)
++
++ local outdata = {preamble[type]}
++ for i = 1, #b64, 64 do
++ outdata[#outdata + 1] = b64:sub(i, i + 63)
++ end
++ outdata[#outdata + 1] = postamble[type]
++ outdata[#outdata + 1] = ""
++
++ return table.concat(outdata, "\n")
++end
++
++function pem2der(data)
++ local b64 = data:gsub({["\n"] = "", ["%-%-%-%-%-.-%-%-%-%-%-"] = ""})
++ return nixio.bin.b64decode(b64)
++end
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-px5g/root/usr/sbin/px5g-genkeys b/feeds/luci/libs/luci-lib-px5g/root/usr/sbin/px5g-genkeys
+new file mode 100755
+index 0000000..87a66bf
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/root/usr/sbin/px5g-genkeys
+@@ -0,0 +1,19 @@
++#!/usr/bin/lua
++local keyfile = "/etc/nixio/rsa_main.der"
++local certfile = "/etc/nixio/cert_main.der"
++
++local px5g = require "px5g"
++local nixio = require "nixio"
++local fs = require "nixio.fs"
++local os = require "os"
++nixio.umask(77)
++
++if not fs.access(certfile) then
++ local key = px5g.genkey(2048)
++ fs.writefile(keyfile, key:asn1())
++
++ local cert = key:create_selfsigned(
++ {CN=nixio.uname().nodename, O="LuCI Keymaster"},
++ os.time(), os.time() + 3600 * 24 * 366 * 15)
++ fs.writefile(certfile, cert)
++end
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/Makefile b/feeds/luci/libs/luci-lib-px5g/src/Makefile
+new file mode 100644
+index 0000000..755565e
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/Makefile
+@@ -0,0 +1,17 @@
++PX5G_CFLAGS = -I. -include polarssl/rsa.h -include polarssl/x509.h -std=gnu99
++PX5G_LDFLAGS = -llua -lm
++PX5G_OBJ = px5g.o library/bignum.o library/havege.o library/rsa.o library/sha1.o library/timing.o library/x509write.o
++PX5G_LIB = px5g.so
++
++%.o: %.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(LUA_CFLAGS) $(PX5G_CFLAGS) $(FPIC) -c -o $@ $<
++
++compile: $(PX5G_OBJ)
++ $(CC) $(LDFLAGS) -shared -o $(PX5G_LIB) $(PX5G_OBJ) $(PX5G_LDFLAGS)
++
++install: compile
++ mkdir -p $(DESTDIR)/usr/lib/lua
++ cp $(PX5G_LIB) $(DESTDIR)/usr/lib/lua/$(PX5G_LIB)
++
++clean:
++ rm -f *.o *.so
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/bignum.c b/feeds/luci/libs/luci-lib-px5g/src/library/bignum.c
+new file mode 100644
+index 0000000..8b7c12f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/library/bignum.c
+@@ -0,0 +1,2010 @@
++/*
++ * Multi-precision integer library
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++/*
++ * This MPI implementation is based on:
++ *
++ * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
++ * http://www.stillhq.com/extracted/gnupg-api/mpi/
++ * http://math.libtomcrypt.com/files/tommath.pdf
++ */
++
++#include "polarssl/config.h"
++
++#if defined(POLARSSL_BIGNUM_C)
++
++#include "polarssl/bignum.h"
++#include "polarssl/bn_mul.h"
++
++#include <string.h>
++#include <stdlib.h>
++#include <stdarg.h>
++
++#define ciL ((int) sizeof(t_int)) /* chars in limb */
++#define biL (ciL << 3) /* bits in limb */
++#define biH (ciL << 2) /* half limb size */
++
++/*
++ * Convert between bits/chars and number of limbs
++ */
++#define BITS_TO_LIMBS(i) (((i) + biL - 1) / biL)
++#define CHARS_TO_LIMBS(i) (((i) + ciL - 1) / ciL)
++
++/*
++ * Initialize one or more mpi
++ */
++void mpi_init( mpi *X, ... )
++{
++ va_list args;
++
++ va_start( args, X );
++
++ while( X != NULL )
++ {
++ X->s = 1;
++ X->n = 0;
++ X->p = NULL;
++
++ X = va_arg( args, mpi* );
++ }
++
++ va_end( args );
++}
++
++/*
++ * Unallocate one or more mpi
++ */
++void mpi_free( mpi *X, ... )
++{
++ va_list args;
++
++ va_start( args, X );
++
++ while( X != NULL )
++ {
++ if( X->p != NULL )
++ {
++ memset( X->p, 0, X->n * ciL );
++ free( X->p );
++ }
++
++ X->s = 1;
++ X->n = 0;
++ X->p = NULL;
++
++ X = va_arg( args, mpi* );
++ }
++
++ va_end( args );
++}
++
++/*
++ * Enlarge to the specified number of limbs
++ */
++int mpi_grow( mpi *X, int nblimbs )
++{
++ t_int *p;
++
++ if( X->n < nblimbs )
++ {
++ if( ( p = (t_int *) malloc( nblimbs * ciL ) ) == NULL )
++ return( 1 );
++
++ memset( p, 0, nblimbs * ciL );
++
++ if( X->p != NULL )
++ {
++ memcpy( p, X->p, X->n * ciL );
++ memset( X->p, 0, X->n * ciL );
++ free( X->p );
++ }
++
++ X->n = nblimbs;
++ X->p = p;
++ }
++
++ return( 0 );
++}
++
++/*
++ * Copy the contents of Y into X
++ */
++int mpi_copy( mpi *X, mpi *Y )
++{
++ int ret, i;
++
++ if( X == Y )
++ return( 0 );
++
++ for( i = Y->n - 1; i > 0; i-- )
++ if( Y->p[i] != 0 )
++ break;
++ i++;
++
++ X->s = Y->s;
++
++ MPI_CHK( mpi_grow( X, i ) );
++
++ memset( X->p, 0, X->n * ciL );
++ memcpy( X->p, Y->p, i * ciL );
++
++cleanup:
++
++ return( ret );
++}
++
++/*
++ * Swap the contents of X and Y
++ */
++void mpi_swap( mpi *X, mpi *Y )
++{
++ mpi T;
++
++ memcpy( &T, X, sizeof( mpi ) );
++ memcpy( X, Y, sizeof( mpi ) );
++ memcpy( Y, &T, sizeof( mpi ) );
++}
++
++/*
++ * Set value from integer
++ */
++int mpi_lset( mpi *X, int z )
++{
++ int ret;
++
++ MPI_CHK( mpi_grow( X, 1 ) );
++ memset( X->p, 0, X->n * ciL );
++
++ X->p[0] = ( z < 0 ) ? -z : z;
++ X->s = ( z < 0 ) ? -1 : 1;
++
++cleanup:
++
++ return( ret );
++}
++
++/*
++ * Return the number of least significant bits
++ */
++int mpi_lsb( mpi *X )
++{
++ int i, j, count = 0;
++
++ for( i = 0; i < X->n; i++ )
++ for( j = 0; j < (int) biL; j++, count++ )
++ if( ( ( X->p[i] >> j ) & 1 ) != 0 )
++ return( count );
++
++ return( 0 );
++}
++
++/*
++ * Return the number of most significant bits
++ */
++int mpi_msb( mpi *X )
++{
++ int i, j;
++
++ for( i = X->n - 1; i > 0; i-- )
++ if( X->p[i] != 0 )
++ break;
++
++ for( j = biL - 1; j >= 0; j-- )
++ if( ( ( X->p[i] >> j ) & 1 ) != 0 )
++ break;
++
++ return( ( i * biL ) + j + 1 );
++}
++
++/*
++ * Return the total size in bytes
++ */
++int mpi_size( mpi *X )
++{
++ return( ( mpi_msb( X ) + 7 ) >> 3 );
++}
++
++/*
++ * Convert an ASCII character to digit value
++ */
++static int mpi_get_digit( t_int *d, int radix, char c )
++{
++ *d = 255;
++
++ if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30;
++ if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37;
++ if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57;
++
++ if( *d >= (t_int) radix )
++ return( POLARSSL_ERR_MPI_INVALID_CHARACTER );
++
++ return( 0 );
++}
++
++/*
++ * Import from an ASCII string
++ */
++int mpi_read_string( mpi *X, int radix, char *s )
++{
++ int ret, i, j, n;
++ t_int d;
++ mpi T;
++
++ if( radix < 2 || radix > 16 )
++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
++
++ mpi_init( &T, NULL );
++
++ if( radix == 16 )
++ {
++ n = BITS_TO_LIMBS( strlen( s ) << 2 );
++
++ MPI_CHK( mpi_grow( X, n ) );
++ MPI_CHK( mpi_lset( X, 0 ) );
++
++ for( i = strlen( s ) - 1, j = 0; i >= 0; i--, j++ )
++ {
++ if( i == 0 && s[i] == '-' )
++ {
++ X->s = -1;
++ break;
++ }
++
++ MPI_CHK( mpi_get_digit( &d, radix, s[i] ) );
++ X->p[j / (2 * ciL)] |= d << ( (j % (2 * ciL)) << 2 );
++ }
++ }
++ else
++ {
++ MPI_CHK( mpi_lset( X, 0 ) );
++
++ for( i = 0; i < (int) strlen( s ); i++ )
++ {
++ if( i == 0 && s[i] == '-' )
++ {
++ X->s = -1;
++ continue;
++ }
++
++ MPI_CHK( mpi_get_digit( &d, radix, s[i] ) );
++ MPI_CHK( mpi_mul_int( &T, X, radix ) );
++ MPI_CHK( mpi_add_int( X, &T, d ) );
++ }
++ }
++
++cleanup:
++
++ mpi_free( &T, NULL );
++
++ return( ret );
++}
++
++/*
++ * Helper to write the digits high-order first
++ */
++static int mpi_write_hlp( mpi *X, int radix, char **p )
++{
++ int ret;
++ t_int r;
++
++ if( radix < 2 || radix > 16 )
++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
++
++ MPI_CHK( mpi_mod_int( &r, X, radix ) );
++ MPI_CHK( mpi_div_int( X, NULL, X, radix ) );
++
++ if( mpi_cmp_int( X, 0 ) != 0 )
++ MPI_CHK( mpi_write_hlp( X, radix, p ) );
++
++ if( r < 10 )
++ *(*p)++ = (char)( r + 0x30 );
++ else
++ *(*p)++ = (char)( r + 0x37 );
++
++cleanup:
++
++ return( ret );
++}
++
++/*
++ * Export into an ASCII string
++ */
++int mpi_write_string( mpi *X, int radix, char *s, int *slen )
++{
++ int ret = 0, n;
++ char *p;
++ mpi T;
++
++ if( radix < 2 || radix > 16 )
++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
++
++ n = mpi_msb( X );
++ if( radix >= 4 ) n >>= 1;
++ if( radix >= 16 ) n >>= 1;
++ n += 3;
++
++ if( *slen < n )
++ {
++ *slen = n;
++ return( POLARSSL_ERR_MPI_BUFFER_TOO_SMALL );
++ }
++
++ p = s;
++ mpi_init( &T, NULL );
++
++ if( X->s == -1 )
++ *p++ = '-';
++
++ if( radix == 16 )
++ {
++ int c, i, j, k;
++
++ for( i = X->n - 1, k = 0; i >= 0; i-- )
++ {
++ for( j = ciL - 1; j >= 0; j-- )
++ {
++ c = ( X->p[i] >> (j << 3) ) & 0xFF;
++
++ if( c == 0 && k == 0 && (i + j) != 0 )
++ continue;
++
++ p += sprintf( p, "%02X", c );
++ k = 1;
++ }
++ }
++ }
++ else
++ {
++ MPI_CHK( mpi_copy( &T, X ) );
++ MPI_CHK( mpi_write_hlp( &T, radix, &p ) );
++ }
++
++ *p++ = '\0';
++ *slen = p - s;
++
++cleanup:
++
++ mpi_free( &T, NULL );
++
++ return( ret );
++}
++
++/*
++ * Read X from an opened file
++ */
++int mpi_read_file( mpi *X, int radix, FILE *fin )
++{
++ t_int d;
++ int slen;
++ char *p;
++ char s[1024];
++
++ memset( s, 0, sizeof( s ) );
++ if( fgets( s, sizeof( s ) - 1, fin ) == NULL )
++ return( POLARSSL_ERR_MPI_FILE_IO_ERROR );
++
++ slen = strlen( s );
++ if( s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; }
++ if( s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; }
++
++ p = s + slen;
++ while( --p >= s )
++ if( mpi_get_digit( &d, radix, *p ) != 0 )
++ break;
++
++ return( mpi_read_string( X, radix, p + 1 ) );
++}
++
++/*
++ * Write X into an opened file (or stdout if fout == NULL)
++ */
++int mpi_write_file( char *p, mpi *X, int radix, FILE *fout )
++{
++ int n, ret;
++ size_t slen;
++ size_t plen;
++ char s[1024];
++
++ n = sizeof( s );
++ memset( s, 0, n );
++ n -= 2;
++
++ MPI_CHK( mpi_write_string( X, radix, s, (int *) &n ) );
++
++ if( p == NULL ) p = "";
++
++ plen = strlen( p );
++ slen = strlen( s );
++ s[slen++] = '\r';
++ s[slen++] = '\n';
++
++ if( fout != NULL )
++ {
++ if( fwrite( p, 1, plen, fout ) != plen ||
++ fwrite( s, 1, slen, fout ) != slen )
++ return( POLARSSL_ERR_MPI_FILE_IO_ERROR );
++ }
++ else
++ printf( "%s%s", p, s );
++
++cleanup:
++
++ return( ret );
++}
++
++/*
++ * Import X from unsigned binary data, big endian
++ */
++int mpi_read_binary( mpi *X, unsigned char *buf, int buflen )
++{
++ int ret, i, j, n;
++
++ for( n = 0; n < buflen; n++ )
++ if( buf[n] != 0 )
++ break;
++
++ MPI_CHK( mpi_grow( X, CHARS_TO_LIMBS( buflen - n ) ) );
++ MPI_CHK( mpi_lset( X, 0 ) );
++
++ for( i = buflen - 1, j = 0; i >= n; i--, j++ )
++ X->p[j / ciL] |= ((t_int) buf[i]) << ((j % ciL) << 3);
++
++cleanup:
++
++ return( ret );
++}
++
++/*
++ * Export X into unsigned binary data, big endian
++ */
++int mpi_write_binary( mpi *X, unsigned char *buf, int buflen )
++{
++ int i, j, n;
++
++ n = mpi_size( X );
++
++ if( buflen < n )
++ return( POLARSSL_ERR_MPI_BUFFER_TOO_SMALL );
++
++ memset( buf, 0, buflen );
++
++ for( i = buflen - 1, j = 0; n > 0; i--, j++, n-- )
++ buf[i] = (unsigned char)( X->p[j / ciL] >> ((j % ciL) << 3) );
++
++ return( 0 );
++}
++
++/*
++ * Left-shift: X <<= count
++ */
++int mpi_shift_l( mpi *X, int count )
++{
++ int ret, i, v0, t1;
++ t_int r0 = 0, r1;
++
++ v0 = count / (biL );
++ t1 = count & (biL - 1);
++
++ i = mpi_msb( X ) + count;
++
++ if( X->n * (int) biL < i )
++ MPI_CHK( mpi_grow( X, BITS_TO_LIMBS( i ) ) );
++
++ ret = 0;
++
++ /*
++ * shift by count / limb_size
++ */
++ if( v0 > 0 )
++ {
++ for( i = X->n - 1; i >= v0; i-- )
++ X->p[i] = X->p[i - v0];
++
++ for( ; i >= 0; i-- )
++ X->p[i] = 0;
++ }
++
++ /*
++ * shift by count % limb_size
++ */
++ if( t1 > 0 )
++ {
++ for( i = v0; i < X->n; i++ )
++ {
++ r1 = X->p[i] >> (biL - t1);
++ X->p[i] <<= t1;
++ X->p[i] |= r0;
++ r0 = r1;
++ }
++ }
++
++cleanup:
++
++ return( ret );
++}
++
++/*
++ * Right-shift: X >>= count
++ */
++int mpi_shift_r( mpi *X, int count )
++{
++ int i, v0, v1;
++ t_int r0 = 0, r1;
++
++ v0 = count / biL;
++ v1 = count & (biL - 1);
++
++ /*
++ * shift by count / limb_size
++ */
++ if( v0 > 0 )
++ {
++ for( i = 0; i < X->n - v0; i++ )
++ X->p[i] = X->p[i + v0];
++
++ for( ; i < X->n; i++ )
++ X->p[i] = 0;
++ }
++
++ /*
++ * shift by count % limb_size
++ */
++ if( v1 > 0 )
++ {
++ for( i = X->n - 1; i >= 0; i-- )
++ {
++ r1 = X->p[i] << (biL - v1);
++ X->p[i] >>= v1;
++ X->p[i] |= r0;
++ r0 = r1;
++ }
++ }
++
++ return( 0 );
++}
++
++/*
++ * Compare unsigned values
++ */
++int mpi_cmp_abs( mpi *X, mpi *Y )
++{
++ int i, j;
++
++ for( i = X->n - 1; i >= 0; i-- )
++ if( X->p[i] != 0 )
++ break;
++
++ for( j = Y->n - 1; j >= 0; j-- )
++ if( Y->p[j] != 0 )
++ break;
++
++ if( i < 0 && j < 0 )
++ return( 0 );
++
++ if( i > j ) return( 1 );
++ if( j > i ) return( -1 );
++
++ for( ; i >= 0; i-- )
++ {
++ if( X->p[i] > Y->p[i] ) return( 1 );
++ if( X->p[i] < Y->p[i] ) return( -1 );
++ }
++
++ return( 0 );
++}
++
++/*
++ * Compare signed values
++ */
++int mpi_cmp_mpi( mpi *X, mpi *Y )
++{
++ int i, j;
++
++ for( i = X->n - 1; i >= 0; i-- )
++ if( X->p[i] != 0 )
++ break;
++
++ for( j = Y->n - 1; j >= 0; j-- )
++ if( Y->p[j] != 0 )
++ break;
++
++ if( i < 0 && j < 0 )
++ return( 0 );
++
++ if( i > j ) return( X->s );
++ if( j > i ) return( -X->s );
++
++ if( X->s > 0 && Y->s < 0 ) return( 1 );
++ if( Y->s > 0 && X->s < 0 ) return( -1 );
++
++ for( ; i >= 0; i-- )
++ {
++ if( X->p[i] > Y->p[i] ) return( X->s );
++ if( X->p[i] < Y->p[i] ) return( -X->s );
++ }
++
++ return( 0 );
++}
++
++/*
++ * Compare signed values
++ */
++int mpi_cmp_int( mpi *X, int z )
++{
++ mpi Y;
++ t_int p[1];
++
++ *p = ( z < 0 ) ? -z : z;
++ Y.s = ( z < 0 ) ? -1 : 1;
++ Y.n = 1;
++ Y.p = p;
++
++ return( mpi_cmp_mpi( X, &Y ) );
++}
++
++/*
++ * Unsigned addition: X = |A| + |B| (HAC 14.7)
++ */
++int mpi_add_abs( mpi *X, mpi *A, mpi *B )
++{
++ int ret, i, j;
++ t_int *o, *p, c;
++
++ if( X == B )
++ {
++ mpi *T = A; A = X; B = T;
++ }
++
++ if( X != A )
++ MPI_CHK( mpi_copy( X, A ) );
++
++ for( j = B->n - 1; j >= 0; j-- )
++ if( B->p[j] != 0 )
++ break;
++
++ MPI_CHK( mpi_grow( X, j + 1 ) );
++
++ o = B->p; p = X->p; c = 0;
++
++ for( i = 0; i <= j; i++, o++, p++ )
++ {
++ *p += c; c = ( *p < c );
++ *p += *o; c += ( *p < *o );
++ }
++
++ while( c != 0 )
++ {
++ if( i >= X->n )
++ {
++ MPI_CHK( mpi_grow( X, i + 1 ) );
++ p = X->p + i;
++ }
++
++ *p += c; c = ( *p < c ); i++;
++ }
++
++cleanup:
++
++ return( ret );
++}
++
++/*
++ * Helper for mpi substraction
++ */
++static void mpi_sub_hlp( int n, t_int *s, t_int *d )
++{
++ int i;
++ t_int c, z;
++
++ for( i = c = 0; i < n; i++, s++, d++ )
++ {
++ z = ( *d < c ); *d -= c;
++ c = ( *d < *s ) + z; *d -= *s;
++ }
++
++ while( c != 0 )
++ {
++ z = ( *d < c ); *d -= c;
++ c = z; i++; d++;
++ }
++}
++
++/*
++ * Unsigned substraction: X = |A| - |B| (HAC 14.9)
++ */
++int mpi_sub_abs( mpi *X, mpi *A, mpi *B )
++{
++ mpi TB;
++ int ret, n;
++
++ if( mpi_cmp_abs( A, B ) < 0 )
++ return( POLARSSL_ERR_MPI_NEGATIVE_VALUE );
++
++ mpi_init( &TB, NULL );
++
++ if( X == B )
++ {
++ MPI_CHK( mpi_copy( &TB, B ) );
++ B = &TB;
++ }
++
++ if( X != A )
++ MPI_CHK( mpi_copy( X, A ) );
++
++ ret = 0;
++
++ for( n = B->n - 1; n >= 0; n-- )
++ if( B->p[n] != 0 )
++ break;
++
++ mpi_sub_hlp( n + 1, B->p, X->p );
++
++cleanup:
++
++ mpi_free( &TB, NULL );
++
++ return( ret );
++}
++
++/*
++ * Signed addition: X = A + B
++ */
++int mpi_add_mpi( mpi *X, mpi *A, mpi *B )
++{
++ int ret, s = A->s;
++
++ if( A->s * B->s < 0 )
++ {
++ if( mpi_cmp_abs( A, B ) >= 0 )
++ {
++ MPI_CHK( mpi_sub_abs( X, A, B ) );
++ X->s = s;
++ }
++ else
++ {
++ MPI_CHK( mpi_sub_abs( X, B, A ) );
++ X->s = -s;
++ }
++ }
++ else
++ {
++ MPI_CHK( mpi_add_abs( X, A, B ) );
++ X->s = s;
++ }
++
++cleanup:
++
++ return( ret );
++}
++
++/*
++ * Signed substraction: X = A - B
++ */
++int mpi_sub_mpi( mpi *X, mpi *A, mpi *B )
++{
++ int ret, s = A->s;
++
++ if( A->s * B->s > 0 )
++ {
++ if( mpi_cmp_abs( A, B ) >= 0 )
++ {
++ MPI_CHK( mpi_sub_abs( X, A, B ) );
++ X->s = s;
++ }
++ else
++ {
++ MPI_CHK( mpi_sub_abs( X, B, A ) );
++ X->s = -s;
++ }
++ }
++ else
++ {
++ MPI_CHK( mpi_add_abs( X, A, B ) );
++ X->s = s;
++ }
++
++cleanup:
++
++ return( ret );
++}
++
++/*
++ * Signed addition: X = A + b
++ */
++int mpi_add_int( mpi *X, mpi *A, int b )
++{
++ mpi _B;
++ t_int p[1];
++
++ p[0] = ( b < 0 ) ? -b : b;
++ _B.s = ( b < 0 ) ? -1 : 1;
++ _B.n = 1;
++ _B.p = p;
++
++ return( mpi_add_mpi( X, A, &_B ) );
++}
++
++/*
++ * Signed substraction: X = A - b
++ */
++int mpi_sub_int( mpi *X, mpi *A, int b )
++{
++ mpi _B;
++ t_int p[1];
++
++ p[0] = ( b < 0 ) ? -b : b;
++ _B.s = ( b < 0 ) ? -1 : 1;
++ _B.n = 1;
++ _B.p = p;
++
++ return( mpi_sub_mpi( X, A, &_B ) );
++}
++
++/*
++ * Helper for mpi multiplication
++ */
++static void mpi_mul_hlp( int i, t_int *s, t_int *d, t_int b )
++{
++ t_int c = 0, t = 0;
++
++#if defined(MULADDC_HUIT)
++ for( ; i >= 8; i -= 8 )
++ {
++ MULADDC_INIT
++ MULADDC_HUIT
++ MULADDC_STOP
++ }
++
++ for( ; i > 0; i-- )
++ {
++ MULADDC_INIT
++ MULADDC_CORE
++ MULADDC_STOP
++ }
++#else
++ for( ; i >= 16; i -= 16 )
++ {
++ MULADDC_INIT
++ MULADDC_CORE MULADDC_CORE
++ MULADDC_CORE MULADDC_CORE
++ MULADDC_CORE MULADDC_CORE
++ MULADDC_CORE MULADDC_CORE
++
++ MULADDC_CORE MULADDC_CORE
++ MULADDC_CORE MULADDC_CORE
++ MULADDC_CORE MULADDC_CORE
++ MULADDC_CORE MULADDC_CORE
++ MULADDC_STOP
++ }
++
++ for( ; i >= 8; i -= 8 )
++ {
++ MULADDC_INIT
++ MULADDC_CORE MULADDC_CORE
++ MULADDC_CORE MULADDC_CORE
++
++ MULADDC_CORE MULADDC_CORE
++ MULADDC_CORE MULADDC_CORE
++ MULADDC_STOP
++ }
++
++ for( ; i > 0; i-- )
++ {
++ MULADDC_INIT
++ MULADDC_CORE
++ MULADDC_STOP
++ }
++#endif
++
++ t++;
++
++ do {
++ *d += c; c = ( *d < c ); d++;
++ }
++ while( c != 0 );
++}
++
++/*
++ * Baseline multiplication: X = A * B (HAC 14.12)
++ */
++int mpi_mul_mpi( mpi *X, mpi *A, mpi *B )
++{
++ int ret, i, j;
++ mpi TA, TB;
++
++ mpi_init( &TA, &TB, NULL );
++
++ if( X == A ) { MPI_CHK( mpi_copy( &TA, A ) ); A = &TA; }
++ if( X == B ) { MPI_CHK( mpi_copy( &TB, B ) ); B = &TB; }
++
++ for( i = A->n - 1; i >= 0; i-- )
++ if( A->p[i] != 0 )
++ break;
++
++ for( j = B->n - 1; j >= 0; j-- )
++ if( B->p[j] != 0 )
++ break;
++
++ MPI_CHK( mpi_grow( X, i + j + 2 ) );
++ MPI_CHK( mpi_lset( X, 0 ) );
++
++ for( i++; j >= 0; j-- )
++ mpi_mul_hlp( i, A->p, X->p + j, B->p[j] );
++
++ X->s = A->s * B->s;
++
++cleanup:
++
++ mpi_free( &TB, &TA, NULL );
++
++ return( ret );
++}
++
++/*
++ * Baseline multiplication: X = A * b
++ */
++int mpi_mul_int( mpi *X, mpi *A, t_int b )
++{
++ mpi _B;
++ t_int p[1];
++
++ _B.s = 1;
++ _B.n = 1;
++ _B.p = p;
++ p[0] = b;
++
++ return( mpi_mul_mpi( X, A, &_B ) );
++}
++
++/*
++ * Division by mpi: A = Q * B + R (HAC 14.20)
++ */
++int mpi_div_mpi( mpi *Q, mpi *R, mpi *A, mpi *B )
++{
++ int ret, i, n, t, k;
++ mpi X, Y, Z, T1, T2;
++
++ if( mpi_cmp_int( B, 0 ) == 0 )
++ return( POLARSSL_ERR_MPI_DIVISION_BY_ZERO );
++
++ mpi_init( &X, &Y, &Z, &T1, &T2, NULL );
++
++ if( mpi_cmp_abs( A, B ) < 0 )
++ {
++ if( Q != NULL ) MPI_CHK( mpi_lset( Q, 0 ) );
++ if( R != NULL ) MPI_CHK( mpi_copy( R, A ) );
++ return( 0 );
++ }
++
++ MPI_CHK( mpi_copy( &X, A ) );
++ MPI_CHK( mpi_copy( &Y, B ) );
++ X.s = Y.s = 1;
++
++ MPI_CHK( mpi_grow( &Z, A->n + 2 ) );
++ MPI_CHK( mpi_lset( &Z, 0 ) );
++ MPI_CHK( mpi_grow( &T1, 2 ) );
++ MPI_CHK( mpi_grow( &T2, 3 ) );
++
++ k = mpi_msb( &Y ) % biL;
++ if( k < (int) biL - 1 )
++ {
++ k = biL - 1 - k;
++ MPI_CHK( mpi_shift_l( &X, k ) );
++ MPI_CHK( mpi_shift_l( &Y, k ) );
++ }
++ else k = 0;
++
++ n = X.n - 1;
++ t = Y.n - 1;
++ mpi_shift_l( &Y, biL * (n - t) );
++
++ while( mpi_cmp_mpi( &X, &Y ) >= 0 )
++ {
++ Z.p[n - t]++;
++ mpi_sub_mpi( &X, &X, &Y );
++ }
++ mpi_shift_r( &Y, biL * (n - t) );
++
++ for( i = n; i > t ; i-- )
++ {
++ if( X.p[i] >= Y.p[t] )
++ Z.p[i - t - 1] = ~0;
++ else
++ {
++#if defined(POLARSSL_HAVE_LONGLONG)
++ t_dbl r;
++
++ r = (t_dbl) X.p[i] << biL;
++ r |= (t_dbl) X.p[i - 1];
++ r /= Y.p[t];
++ if( r > ((t_dbl) 1 << biL) - 1)
++ r = ((t_dbl) 1 << biL) - 1;
++
++ Z.p[i - t - 1] = (t_int) r;
++#else
++ /*
++ * __udiv_qrnnd_c, from gmp/longlong.h
++ */
++ t_int q0, q1, r0, r1;
++ t_int d0, d1, d, m;
++
++ d = Y.p[t];
++ d0 = ( d << biH ) >> biH;
++ d1 = ( d >> biH );
++
++ q1 = X.p[i] / d1;
++ r1 = X.p[i] - d1 * q1;
++ r1 <<= biH;
++ r1 |= ( X.p[i - 1] >> biH );
++
++ m = q1 * d0;
++ if( r1 < m )
++ {
++ q1--, r1 += d;
++ while( r1 >= d && r1 < m )
++ q1--, r1 += d;
++ }
++ r1 -= m;
++
++ q0 = r1 / d1;
++ r0 = r1 - d1 * q0;
++ r0 <<= biH;
++ r0 |= ( X.p[i - 1] << biH ) >> biH;
++
++ m = q0 * d0;
++ if( r0 < m )
++ {
++ q0--, r0 += d;
++ while( r0 >= d && r0 < m )
++ q0--, r0 += d;
++ }
++ r0 -= m;
++
++ Z.p[i - t - 1] = ( q1 << biH ) | q0;
++#endif
++ }
++
++ Z.p[i - t - 1]++;
++ do
++ {
++ Z.p[i - t - 1]--;
++
++ MPI_CHK( mpi_lset( &T1, 0 ) );
++ T1.p[0] = (t < 1) ? 0 : Y.p[t - 1];
++ T1.p[1] = Y.p[t];
++ MPI_CHK( mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) );
++
++ MPI_CHK( mpi_lset( &T2, 0 ) );
++ T2.p[0] = (i < 2) ? 0 : X.p[i - 2];
++ T2.p[1] = (i < 1) ? 0 : X.p[i - 1];
++ T2.p[2] = X.p[i];
++ }
++ while( mpi_cmp_mpi( &T1, &T2 ) > 0 );
++
++ MPI_CHK( mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) );
++ MPI_CHK( mpi_shift_l( &T1, biL * (i - t - 1) ) );
++ MPI_CHK( mpi_sub_mpi( &X, &X, &T1 ) );
++
++ if( mpi_cmp_int( &X, 0 ) < 0 )
++ {
++ MPI_CHK( mpi_copy( &T1, &Y ) );
++ MPI_CHK( mpi_shift_l( &T1, biL * (i - t - 1) ) );
++ MPI_CHK( mpi_add_mpi( &X, &X, &T1 ) );
++ Z.p[i - t - 1]--;
++ }
++ }
++
++ if( Q != NULL )
++ {
++ mpi_copy( Q, &Z );
++ Q->s = A->s * B->s;
++ }
++
++ if( R != NULL )
++ {
++ mpi_shift_r( &X, k );
++ mpi_copy( R, &X );
++
++ R->s = A->s;
++ if( mpi_cmp_int( R, 0 ) == 0 )
++ R->s = 1;
++ }
++
++cleanup:
++
++ mpi_free( &X, &Y, &Z, &T1, &T2, NULL );
++
++ return( ret );
++}
++
++/*
++ * Division by int: A = Q * b + R
++ *
++ * Returns 0 if successful
++ * 1 if memory allocation failed
++ * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0
++ */
++int mpi_div_int( mpi *Q, mpi *R, mpi *A, int b )
++{
++ mpi _B;
++ t_int p[1];
++
++ p[0] = ( b < 0 ) ? -b : b;
++ _B.s = ( b < 0 ) ? -1 : 1;
++ _B.n = 1;
++ _B.p = p;
++
++ return( mpi_div_mpi( Q, R, A, &_B ) );
++}
++
++/*
++ * Modulo: R = A mod B
++ */
++int mpi_mod_mpi( mpi *R, mpi *A, mpi *B )
++{
++ int ret;
++
++ MPI_CHK( mpi_div_mpi( NULL, R, A, B ) );
++
++ while( mpi_cmp_int( R, 0 ) < 0 )
++ MPI_CHK( mpi_add_mpi( R, R, B ) );
++
++ while( mpi_cmp_mpi( R, B ) >= 0 )
++ MPI_CHK( mpi_sub_mpi( R, R, B ) );
++
++cleanup:
++
++ return( ret );
++}
++
++/*
++ * Modulo: r = A mod b
++ */
++int mpi_mod_int( t_int *r, mpi *A, int b )
++{
++ int i;
++ t_int x, y, z;
++
++ if( b == 0 )
++ return( POLARSSL_ERR_MPI_DIVISION_BY_ZERO );
++
++ if( b < 0 )
++ b = -b;
++
++ /*
++ * handle trivial cases
++ */
++ if( b == 1 )
++ {
++ *r = 0;
++ return( 0 );
++ }
++
++ if( b == 2 )
++ {
++ *r = A->p[0] & 1;
++ return( 0 );
++ }
++
++ /*
++ * general case
++ */
++ for( i = A->n - 1, y = 0; i >= 0; i-- )
++ {
++ x = A->p[i];
++ y = ( y << biH ) | ( x >> biH );
++ z = y / b;
++ y -= z * b;
++
++ x <<= biH;
++ y = ( y << biH ) | ( x >> biH );
++ z = y / b;
++ y -= z * b;
++ }
++
++ *r = y;
++
++ return( 0 );
++}
++
++/*
++ * Fast Montgomery initialization (thanks to Tom St Denis)
++ */
++static void mpi_montg_init( t_int *mm, mpi *N )
++{
++ t_int x, m0 = N->p[0];
++
++ x = m0;
++ x += ( ( m0 + 2 ) & 4 ) << 1;
++ x *= ( 2 - ( m0 * x ) );
++
++ if( biL >= 16 ) x *= ( 2 - ( m0 * x ) );
++ if( biL >= 32 ) x *= ( 2 - ( m0 * x ) );
++ if( biL >= 64 ) x *= ( 2 - ( m0 * x ) );
++
++ *mm = ~x + 1;
++}
++
++/*
++ * Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36)
++ */
++static void mpi_montmul( mpi *A, mpi *B, mpi *N, t_int mm, mpi *T )
++{
++ int i, n, m;
++ t_int u0, u1, *d;
++
++ memset( T->p, 0, T->n * ciL );
++
++ d = T->p;
++ n = N->n;
++ m = ( B->n < n ) ? B->n : n;
++
++ for( i = 0; i < n; i++ )
++ {
++ /*
++ * T = (T + u0*B + u1*N) / 2^biL
++ */
++ u0 = A->p[i];
++ u1 = ( d[0] + u0 * B->p[0] ) * mm;
++
++ mpi_mul_hlp( m, B->p, d, u0 );
++ mpi_mul_hlp( n, N->p, d, u1 );
++
++ *d++ = u0; d[n + 1] = 0;
++ }
++
++ memcpy( A->p, d, (n + 1) * ciL );
++
++ if( mpi_cmp_abs( A, N ) >= 0 )
++ mpi_sub_hlp( n, N->p, A->p );
++ else
++ /* prevent timing attacks */
++ mpi_sub_hlp( n, A->p, T->p );
++}
++
++/*
++ * Montgomery reduction: A = A * R^-1 mod N
++ */
++static void mpi_montred( mpi *A, mpi *N, t_int mm, mpi *T )
++{
++ t_int z = 1;
++ mpi U;
++
++ U.n = U.s = z;
++ U.p = &z;
++
++ mpi_montmul( A, &U, N, mm, T );
++}
++
++/*
++ * Sliding-window exponentiation: X = A^E mod N (HAC 14.85)
++ */
++int mpi_exp_mod( mpi *X, mpi *A, mpi *E, mpi *N, mpi *_RR )
++{
++ int ret, i, j, wsize, wbits;
++ int bufsize, nblimbs, nbits;
++ t_int ei, mm, state;
++ mpi RR, T, W[64];
++
++ if( mpi_cmp_int( N, 0 ) < 0 || ( N->p[0] & 1 ) == 0 )
++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
++
++ /*
++ * Init temps and window size
++ */
++ mpi_montg_init( &mm, N );
++ mpi_init( &RR, &T, NULL );
++ memset( W, 0, sizeof( W ) );
++
++ i = mpi_msb( E );
++
++ wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 :
++ ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1;
++
++ j = N->n + 1;
++ MPI_CHK( mpi_grow( X, j ) );
++ MPI_CHK( mpi_grow( &W[1], j ) );
++ MPI_CHK( mpi_grow( &T, j * 2 ) );
++
++ /*
++ * If 1st call, pre-compute R^2 mod N
++ */
++ if( _RR == NULL || _RR->p == NULL )
++ {
++ MPI_CHK( mpi_lset( &RR, 1 ) );
++ MPI_CHK( mpi_shift_l( &RR, N->n * 2 * biL ) );
++ MPI_CHK( mpi_mod_mpi( &RR, &RR, N ) );
++
++ if( _RR != NULL )
++ memcpy( _RR, &RR, sizeof( mpi ) );
++ }
++ else
++ memcpy( &RR, _RR, sizeof( mpi ) );
++
++ /*
++ * W[1] = A * R^2 * R^-1 mod N = A * R mod N
++ */
++ if( mpi_cmp_mpi( A, N ) >= 0 )
++ mpi_mod_mpi( &W[1], A, N );
++ else mpi_copy( &W[1], A );
++
++ mpi_montmul( &W[1], &RR, N, mm, &T );
++
++ /*
++ * X = R^2 * R^-1 mod N = R mod N
++ */
++ MPI_CHK( mpi_copy( X, &RR ) );
++ mpi_montred( X, N, mm, &T );
++
++ if( wsize > 1 )
++ {
++ /*
++ * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1)
++ */
++ j = 1 << (wsize - 1);
++
++ MPI_CHK( mpi_grow( &W[j], N->n + 1 ) );
++ MPI_CHK( mpi_copy( &W[j], &W[1] ) );
++
++ for( i = 0; i < wsize - 1; i++ )
++ mpi_montmul( &W[j], &W[j], N, mm, &T );
++
++ /*
++ * W[i] = W[i - 1] * W[1]
++ */
++ for( i = j + 1; i < (1 << wsize); i++ )
++ {
++ MPI_CHK( mpi_grow( &W[i], N->n + 1 ) );
++ MPI_CHK( mpi_copy( &W[i], &W[i - 1] ) );
++
++ mpi_montmul( &W[i], &W[1], N, mm, &T );
++ }
++ }
++
++ nblimbs = E->n;
++ bufsize = 0;
++ nbits = 0;
++ wbits = 0;
++ state = 0;
++
++ while( 1 )
++ {
++ if( bufsize == 0 )
++ {
++ if( nblimbs-- == 0 )
++ break;
++
++ bufsize = sizeof( t_int ) << 3;
++ }
++
++ bufsize--;
++
++ ei = (E->p[nblimbs] >> bufsize) & 1;
++
++ /*
++ * skip leading 0s
++ */
++ if( ei == 0 && state == 0 )
++ continue;
++
++ if( ei == 0 && state == 1 )
++ {
++ /*
++ * out of window, square X
++ */
++ mpi_montmul( X, X, N, mm, &T );
++ continue;
++ }
++
++ /*
++ * add ei to current window
++ */
++ state = 2;
++
++ nbits++;
++ wbits |= (ei << (wsize - nbits));
++
++ if( nbits == wsize )
++ {
++ /*
++ * X = X^wsize R^-1 mod N
++ */
++ for( i = 0; i < wsize; i++ )
++ mpi_montmul( X, X, N, mm, &T );
++
++ /*
++ * X = X * W[wbits] R^-1 mod N
++ */
++ mpi_montmul( X, &W[wbits], N, mm, &T );
++
++ state--;
++ nbits = 0;
++ wbits = 0;
++ }
++ }
++
++ /*
++ * process the remaining bits
++ */
++ for( i = 0; i < nbits; i++ )
++ {
++ mpi_montmul( X, X, N, mm, &T );
++
++ wbits <<= 1;
++
++ if( (wbits & (1 << wsize)) != 0 )
++ mpi_montmul( X, &W[1], N, mm, &T );
++ }
++
++ /*
++ * X = A^E * R * R^-1 mod N = A^E mod N
++ */
++ mpi_montred( X, N, mm, &T );
++
++cleanup:
++
++ for( i = (1 << (wsize - 1)); i < (1 << wsize); i++ )
++ mpi_free( &W[i], NULL );
++
++ if( _RR != NULL )
++ mpi_free( &W[1], &T, NULL );
++ else mpi_free( &W[1], &T, &RR, NULL );
++
++ return( ret );
++}
++
++/*
++ * Greatest common divisor: G = gcd(A, B) (HAC 14.54)
++ */
++int mpi_gcd( mpi *G, mpi *A, mpi *B )
++{
++ int ret, lz, lzt;
++ mpi TG, TA, TB;
++
++ mpi_init( &TG, &TA, &TB, NULL );
++
++ MPI_CHK( mpi_copy( &TA, A ) );
++ MPI_CHK( mpi_copy( &TB, B ) );
++
++ lz = mpi_lsb( &TA );
++ lzt = mpi_lsb( &TB );
++
++ if ( lzt < lz )
++ lz = lzt;
++
++ MPI_CHK( mpi_shift_r( &TA, lz ) );
++ MPI_CHK( mpi_shift_r( &TB, lz ) );
++
++ TA.s = TB.s = 1;
++
++ while( mpi_cmp_int( &TA, 0 ) != 0 )
++ {
++ MPI_CHK( mpi_shift_r( &TA, mpi_lsb( &TA ) ) );
++ MPI_CHK( mpi_shift_r( &TB, mpi_lsb( &TB ) ) );
++
++ if( mpi_cmp_mpi( &TA, &TB ) >= 0 )
++ {
++ MPI_CHK( mpi_sub_abs( &TA, &TA, &TB ) );
++ MPI_CHK( mpi_shift_r( &TA, 1 ) );
++ }
++ else
++ {
++ MPI_CHK( mpi_sub_abs( &TB, &TB, &TA ) );
++ MPI_CHK( mpi_shift_r( &TB, 1 ) );
++ }
++ }
++
++ MPI_CHK( mpi_shift_l( &TB, lz ) );
++ MPI_CHK( mpi_copy( G, &TB ) );
++
++cleanup:
++
++ mpi_free( &TB, &TA, &TG, NULL );
++
++ return( ret );
++}
++
++#if defined(POLARSSL_GENPRIME)
++
++/*
++ * Modular inverse: X = A^-1 mod N (HAC 14.61 / 14.64)
++ */
++int mpi_inv_mod( mpi *X, mpi *A, mpi *N )
++{
++ int ret;
++ mpi G, TA, TU, U1, U2, TB, TV, V1, V2;
++
++ if( mpi_cmp_int( N, 0 ) <= 0 )
++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
++
++ mpi_init( &TA, &TU, &U1, &U2, &G,
++ &TB, &TV, &V1, &V2, NULL );
++
++ MPI_CHK( mpi_gcd( &G, A, N ) );
++
++ if( mpi_cmp_int( &G, 1 ) != 0 )
++ {
++ ret = POLARSSL_ERR_MPI_NOT_ACCEPTABLE;
++ goto cleanup;
++ }
++
++ MPI_CHK( mpi_mod_mpi( &TA, A, N ) );
++ MPI_CHK( mpi_copy( &TU, &TA ) );
++ MPI_CHK( mpi_copy( &TB, N ) );
++ MPI_CHK( mpi_copy( &TV, N ) );
++
++ MPI_CHK( mpi_lset( &U1, 1 ) );
++ MPI_CHK( mpi_lset( &U2, 0 ) );
++ MPI_CHK( mpi_lset( &V1, 0 ) );
++ MPI_CHK( mpi_lset( &V2, 1 ) );
++
++ do
++ {
++ while( ( TU.p[0] & 1 ) == 0 )
++ {
++ MPI_CHK( mpi_shift_r( &TU, 1 ) );
++
++ if( ( U1.p[0] & 1 ) != 0 || ( U2.p[0] & 1 ) != 0 )
++ {
++ MPI_CHK( mpi_add_mpi( &U1, &U1, &TB ) );
++ MPI_CHK( mpi_sub_mpi( &U2, &U2, &TA ) );
++ }
++
++ MPI_CHK( mpi_shift_r( &U1, 1 ) );
++ MPI_CHK( mpi_shift_r( &U2, 1 ) );
++ }
++
++ while( ( TV.p[0] & 1 ) == 0 )
++ {
++ MPI_CHK( mpi_shift_r( &TV, 1 ) );
++
++ if( ( V1.p[0] & 1 ) != 0 || ( V2.p[0] & 1 ) != 0 )
++ {
++ MPI_CHK( mpi_add_mpi( &V1, &V1, &TB ) );
++ MPI_CHK( mpi_sub_mpi( &V2, &V2, &TA ) );
++ }
++
++ MPI_CHK( mpi_shift_r( &V1, 1 ) );
++ MPI_CHK( mpi_shift_r( &V2, 1 ) );
++ }
++
++ if( mpi_cmp_mpi( &TU, &TV ) >= 0 )
++ {
++ MPI_CHK( mpi_sub_mpi( &TU, &TU, &TV ) );
++ MPI_CHK( mpi_sub_mpi( &U1, &U1, &V1 ) );
++ MPI_CHK( mpi_sub_mpi( &U2, &U2, &V2 ) );
++ }
++ else
++ {
++ MPI_CHK( mpi_sub_mpi( &TV, &TV, &TU ) );
++ MPI_CHK( mpi_sub_mpi( &V1, &V1, &U1 ) );
++ MPI_CHK( mpi_sub_mpi( &V2, &V2, &U2 ) );
++ }
++ }
++ while( mpi_cmp_int( &TU, 0 ) != 0 );
++
++ while( mpi_cmp_int( &V1, 0 ) < 0 )
++ MPI_CHK( mpi_add_mpi( &V1, &V1, N ) );
++
++ while( mpi_cmp_mpi( &V1, N ) >= 0 )
++ MPI_CHK( mpi_sub_mpi( &V1, &V1, N ) );
++
++ MPI_CHK( mpi_copy( X, &V1 ) );
++
++cleanup:
++
++ mpi_free( &V2, &V1, &TV, &TB, &G,
++ &U2, &U1, &TU, &TA, NULL );
++
++ return( ret );
++}
++
++static const int small_prime[] =
++{
++ 3, 5, 7, 11, 13, 17, 19, 23,
++ 29, 31, 37, 41, 43, 47, 53, 59,
++ 61, 67, 71, 73, 79, 83, 89, 97,
++ 101, 103, 107, 109, 113, 127, 131, 137,
++ 139, 149, 151, 157, 163, 167, 173, 179,
++ 181, 191, 193, 197, 199, 211, 223, 227,
++ 229, 233, 239, 241, 251, 257, 263, 269,
++ 271, 277, 281, 283, 293, 307, 311, 313,
++ 317, 331, 337, 347, 349, 353, 359, 367,
++ 373, 379, 383, 389, 397, 401, 409, 419,
++ 421, 431, 433, 439, 443, 449, 457, 461,
++ 463, 467, 479, 487, 491, 499, 503, 509,
++ 521, 523, 541, 547, 557, 563, 569, 571,
++ 577, 587, 593, 599, 601, 607, 613, 617,
++ 619, 631, 641, 643, 647, 653, 659, 661,
++ 673, 677, 683, 691, 701, 709, 719, 727,
++ 733, 739, 743, 751, 757, 761, 769, 773,
++ 787, 797, 809, 811, 821, 823, 827, 829,
++ 839, 853, 857, 859, 863, 877, 881, 883,
++ 887, 907, 911, 919, 929, 937, 941, 947,
++ 953, 967, 971, 977, 983, 991, 997, -103
++};
++
++/*
++ * Miller-Rabin primality test (HAC 4.24)
++ */
++int mpi_is_prime( mpi *X, int (*f_rng)(void *), void *p_rng )
++{
++ int ret, i, j, n, s, xs;
++ mpi W, R, T, A, RR;
++ unsigned char *p;
++
++ if( mpi_cmp_int( X, 0 ) == 0 )
++ return( 0 );
++
++ mpi_init( &W, &R, &T, &A, &RR, NULL );
++
++ xs = X->s; X->s = 1;
++
++ /*
++ * test trivial factors first
++ */
++ if( ( X->p[0] & 1 ) == 0 )
++ return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE );
++
++ for( i = 0; small_prime[i] > 0; i++ )
++ {
++ t_int r;
++
++ if( mpi_cmp_int( X, small_prime[i] ) <= 0 )
++ return( 0 );
++
++ MPI_CHK( mpi_mod_int( &r, X, small_prime[i] ) );
++
++ if( r == 0 )
++ return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE );
++ }
++
++ /*
++ * W = |X| - 1
++ * R = W >> lsb( W )
++ */
++ s = mpi_lsb( &W );
++ MPI_CHK( mpi_sub_int( &W, X, 1 ) );
++ MPI_CHK( mpi_copy( &R, &W ) );
++ MPI_CHK( mpi_shift_r( &R, s ) );
++
++ i = mpi_msb( X );
++ /*
++ * HAC, table 4.4
++ */
++ n = ( ( i >= 1300 ) ? 2 : ( i >= 850 ) ? 3 :
++ ( i >= 650 ) ? 4 : ( i >= 350 ) ? 8 :
++ ( i >= 250 ) ? 12 : ( i >= 150 ) ? 18 : 27 );
++
++ for( i = 0; i < n; i++ )
++ {
++ /*
++ * pick a random A, 1 < A < |X| - 1
++ */
++ MPI_CHK( mpi_grow( &A, X->n ) );
++
++ p = (unsigned char *) A.p;
++ for( j = 0; j < A.n * ciL; j++ )
++ *p++ = (unsigned char) f_rng( p_rng );
++
++ j = mpi_msb( &A ) - mpi_msb( &W );
++ MPI_CHK( mpi_shift_r( &A, j + 1 ) );
++ A.p[0] |= 3;
++
++ /*
++ * A = A^R mod |X|
++ */
++ MPI_CHK( mpi_exp_mod( &A, &A, &R, X, &RR ) );
++
++ if( mpi_cmp_mpi( &A, &W ) == 0 ||
++ mpi_cmp_int( &A, 1 ) == 0 )
++ continue;
++
++ j = 1;
++ while( j < s && mpi_cmp_mpi( &A, &W ) != 0 )
++ {
++ /*
++ * A = A * A mod |X|
++ */
++ MPI_CHK( mpi_mul_mpi( &T, &A, &A ) );
++ MPI_CHK( mpi_mod_mpi( &A, &T, X ) );
++
++ if( mpi_cmp_int( &A, 1 ) == 0 )
++ break;
++
++ j++;
++ }
++
++ /*
++ * not prime if A != |X| - 1 or A == 1
++ */
++ if( mpi_cmp_mpi( &A, &W ) != 0 ||
++ mpi_cmp_int( &A, 1 ) == 0 )
++ {
++ ret = POLARSSL_ERR_MPI_NOT_ACCEPTABLE;
++ break;
++ }
++ }
++
++cleanup:
++
++ X->s = xs;
++
++ mpi_free( &RR, &A, &T, &R, &W, NULL );
++
++ return( ret );
++}
++
++/*
++ * Prime number generation
++ */
++int mpi_gen_prime( mpi *X, int nbits, int dh_flag,
++ int (*f_rng)(void *), void *p_rng )
++{
++ int ret, k, n;
++ unsigned char *p;
++ mpi Y;
++
++ if( nbits < 3 )
++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
++
++ mpi_init( &Y, NULL );
++
++ n = BITS_TO_LIMBS( nbits );
++
++ MPI_CHK( mpi_grow( X, n ) );
++ MPI_CHK( mpi_lset( X, 0 ) );
++
++ p = (unsigned char *) X->p;
++ for( k = 0; k < X->n * ciL; k++ )
++ *p++ = (unsigned char) f_rng( p_rng );
++
++ k = mpi_msb( X );
++ if( k < nbits ) MPI_CHK( mpi_shift_l( X, nbits - k ) );
++ if( k > nbits ) MPI_CHK( mpi_shift_r( X, k - nbits ) );
++
++ X->p[0] |= 3;
++
++ if( dh_flag == 0 )
++ {
++ while( ( ret = mpi_is_prime( X, f_rng, p_rng ) ) != 0 )
++ {
++ if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE )
++ goto cleanup;
++
++ MPI_CHK( mpi_add_int( X, X, 2 ) );
++ }
++ }
++ else
++ {
++ MPI_CHK( mpi_sub_int( &Y, X, 1 ) );
++ MPI_CHK( mpi_shift_r( &Y, 1 ) );
++
++ while( 1 )
++ {
++ if( ( ret = mpi_is_prime( X, f_rng, p_rng ) ) == 0 )
++ {
++ if( ( ret = mpi_is_prime( &Y, f_rng, p_rng ) ) == 0 )
++ break;
++
++ if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE )
++ goto cleanup;
++ }
++
++ if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE )
++ goto cleanup;
++
++ MPI_CHK( mpi_add_int( &Y, X, 1 ) );
++ MPI_CHK( mpi_add_int( X, X, 2 ) );
++ MPI_CHK( mpi_shift_r( &Y, 1 ) );
++ }
++ }
++
++cleanup:
++
++ mpi_free( &Y, NULL );
++
++ return( ret );
++}
++
++#endif
++
++#if defined(POLARSSL_SELF_TEST)
++
++#define GCD_PAIR_COUNT 3
++
++static const int gcd_pairs[GCD_PAIR_COUNT][3] =
++{
++ { 693, 609, 21 },
++ { 1764, 868, 28 },
++ { 768454923, 542167814, 1 }
++};
++
++/*
++ * Checkup routine
++ */
++int mpi_self_test( int verbose )
++{
++ int ret, i;
++ mpi A, E, N, X, Y, U, V;
++
++ mpi_init( &A, &E, &N, &X, &Y, &U, &V, NULL );
++
++ MPI_CHK( mpi_read_string( &A, 16,
++ "EFE021C2645FD1DC586E69184AF4A31E" \
++ "D5F53E93B5F123FA41680867BA110131" \
++ "944FE7952E2517337780CB0DB80E61AA" \
++ "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) );
++
++ MPI_CHK( mpi_read_string( &E, 16,
++ "B2E7EFD37075B9F03FF989C7C5051C20" \
++ "34D2A323810251127E7BF8625A4F49A5" \
++ "F3E27F4DA8BD59C47D6DAABA4C8127BD" \
++ "5B5C25763222FEFCCFC38B832366C29E" ) );
++
++ MPI_CHK( mpi_read_string( &N, 16,
++ "0066A198186C18C10B2F5ED9B522752A" \
++ "9830B69916E535C8F047518A889A43A5" \
++ "94B6BED27A168D31D4A52F88925AA8F5" ) );
++
++ MPI_CHK( mpi_mul_mpi( &X, &A, &N ) );
++
++ MPI_CHK( mpi_read_string( &U, 16,
++ "602AB7ECA597A3D6B56FF9829A5E8B85" \
++ "9E857EA95A03512E2BAE7391688D264A" \
++ "A5663B0341DB9CCFD2C4C5F421FEC814" \
++ "8001B72E848A38CAE1C65F78E56ABDEF" \
++ "E12D3C039B8A02D6BE593F0BBBDA56F1" \
++ "ECF677152EF804370C1A305CAF3B5BF1" \
++ "30879B56C61DE584A0F53A2447A51E" ) );
++
++ if( verbose != 0 )
++ printf( " MPI test #1 (mul_mpi): " );
++
++ if( mpi_cmp_mpi( &X, &U ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n" );
++
++ MPI_CHK( mpi_div_mpi( &X, &Y, &A, &N ) );
++
++ MPI_CHK( mpi_read_string( &U, 16,
++ "256567336059E52CAE22925474705F39A94" ) );
++
++ MPI_CHK( mpi_read_string( &V, 16,
++ "6613F26162223DF488E9CD48CC132C7A" \
++ "0AC93C701B001B092E4E5B9F73BCD27B" \
++ "9EE50D0657C77F374E903CDFA4C642" ) );
++
++ if( verbose != 0 )
++ printf( " MPI test #2 (div_mpi): " );
++
++ if( mpi_cmp_mpi( &X, &U ) != 0 ||
++ mpi_cmp_mpi( &Y, &V ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n" );
++
++ MPI_CHK( mpi_exp_mod( &X, &A, &E, &N, NULL ) );
++
++ MPI_CHK( mpi_read_string( &U, 16,
++ "36E139AEA55215609D2816998ED020BB" \
++ "BD96C37890F65171D948E9BC7CBAA4D9" \
++ "325D24D6A3C12710F10A09FA08AB87" ) );
++
++ if( verbose != 0 )
++ printf( " MPI test #3 (exp_mod): " );
++
++ if( mpi_cmp_mpi( &X, &U ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n" );
++
++ MPI_CHK( mpi_inv_mod( &X, &A, &N ) );
++
++ MPI_CHK( mpi_read_string( &U, 16,
++ "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \
++ "C3DBA76456363A10869622EAC2DD84EC" \
++ "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) );
++
++ if( verbose != 0 )
++ printf( " MPI test #4 (inv_mod): " );
++
++ if( mpi_cmp_mpi( &X, &U ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n" );
++
++ if( verbose != 0 )
++ printf( " MPI test #5 (simple gcd): " );
++
++ for ( i = 0; i < GCD_PAIR_COUNT; i++)
++ {
++ MPI_CHK( mpi_lset( &X, gcd_pairs[i][0] ) );
++ MPI_CHK( mpi_lset( &Y, gcd_pairs[i][1] ) );
++
++ MPI_CHK( mpi_gcd( &A, &X, &Y ) );
++
++ if( mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed at %d\n", i );
++
++ return( 1 );
++ }
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n" );
++
++cleanup:
++
++ if( ret != 0 && verbose != 0 )
++ printf( "Unexpected error, return code = %08X\n", ret );
++
++ mpi_free( &V, &U, &Y, &X, &N, &E, &A, NULL );
++
++ if( verbose != 0 )
++ printf( "\n" );
++
++ return( ret );
++}
++
++#endif
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/havege.c b/feeds/luci/libs/luci-lib-px5g/src/library/havege.c
+new file mode 100644
+index 0000000..266299d
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/library/havege.c
+@@ -0,0 +1,276 @@
++/*
++ * HAVEGE: HArdware Volatile Entropy Gathering and Expansion
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++/*
++ * The HAVEGE RNG was designed by Andre Seznec in 2002.
++ *
++ * http://www.irisa.fr/caps/projects/hipsor/publi.php
++ *
++ * Contact: seznec(at)irisa_dot_fr - orocheco(at)irisa_dot_fr
++ */
++
++#include <string.h>
++#include <time.h>
++
++#include "polarssl/config.h"
++
++#if defined(POLARSSL_HAVEGE_C)
++
++#include "polarssl/havege.h"
++#include "polarssl/timing.h"
++
++/* ------------------------------------------------------------------------
++ * On average, one iteration accesses two 8-word blocks in the havege WALK
++ * table, and generates 16 words in the RES array.
++ *
++ * The data read in the WALK table is updated and permuted after each use.
++ * The result of the hardware clock counter read is used for this update.
++ *
++ * 25 conditional tests are present. The conditional tests are grouped in
++ * two nested groups of 12 conditional tests and 1 test that controls the
++ * permutation; on average, there should be 6 tests executed and 3 of them
++ * should be mispredicted.
++ * ------------------------------------------------------------------------
++ */
++
++#define SWAP(X,Y) { int *T = X; X = Y; Y = T; }
++
++#define TST1_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1;
++#define TST2_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1;
++
++#define TST1_LEAVE U1++; }
++#define TST2_LEAVE U2++; }
++
++#define ONE_ITERATION \
++ \
++ PTEST = PT1 >> 20; \
++ \
++ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \
++ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \
++ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \
++ \
++ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \
++ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \
++ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \
++ \
++ PTX = (PT1 >> 18) & 7; \
++ PT1 &= 0x1FFF; \
++ PT2 &= 0x1FFF; \
++ CLK = (int) hardclock(); \
++ \
++ i = 0; \
++ A = &WALK[PT1 ]; RES[i++] ^= *A; \
++ B = &WALK[PT2 ]; RES[i++] ^= *B; \
++ C = &WALK[PT1 ^ 1]; RES[i++] ^= *C; \
++ D = &WALK[PT2 ^ 4]; RES[i++] ^= *D; \
++ \
++ IN = (*A >> (1)) ^ (*A << (31)) ^ CLK; \
++ *A = (*B >> (2)) ^ (*B << (30)) ^ CLK; \
++ *B = IN ^ U1; \
++ *C = (*C >> (3)) ^ (*C << (29)) ^ CLK; \
++ *D = (*D >> (4)) ^ (*D << (28)) ^ CLK; \
++ \
++ A = &WALK[PT1 ^ 2]; RES[i++] ^= *A; \
++ B = &WALK[PT2 ^ 2]; RES[i++] ^= *B; \
++ C = &WALK[PT1 ^ 3]; RES[i++] ^= *C; \
++ D = &WALK[PT2 ^ 6]; RES[i++] ^= *D; \
++ \
++ if( PTEST & 1 ) SWAP( A, C ); \
++ \
++ IN = (*A >> (5)) ^ (*A << (27)) ^ CLK; \
++ *A = (*B >> (6)) ^ (*B << (26)) ^ CLK; \
++ *B = IN; CLK = (int) hardclock(); \
++ *C = (*C >> (7)) ^ (*C << (25)) ^ CLK; \
++ *D = (*D >> (8)) ^ (*D << (24)) ^ CLK; \
++ \
++ A = &WALK[PT1 ^ 4]; \
++ B = &WALK[PT2 ^ 1]; \
++ \
++ PTEST = PT2 >> 1; \
++ \
++ PT2 = (RES[(i - 8) ^ PTY] ^ WALK[PT2 ^ PTY ^ 7]); \
++ PT2 = ((PT2 & 0x1FFF) & (~8)) ^ ((PT1 ^ 8) & 0x8); \
++ PTY = (PT2 >> 10) & 7; \
++ \
++ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \
++ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \
++ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \
++ \
++ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \
++ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \
++ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \
++ \
++ C = &WALK[PT1 ^ 5]; \
++ D = &WALK[PT2 ^ 5]; \
++ \
++ RES[i++] ^= *A; \
++ RES[i++] ^= *B; \
++ RES[i++] ^= *C; \
++ RES[i++] ^= *D; \
++ \
++ IN = (*A >> ( 9)) ^ (*A << (23)) ^ CLK; \
++ *A = (*B >> (10)) ^ (*B << (22)) ^ CLK; \
++ *B = IN ^ U2; \
++ *C = (*C >> (11)) ^ (*C << (21)) ^ CLK; \
++ *D = (*D >> (12)) ^ (*D << (20)) ^ CLK; \
++ \
++ A = &WALK[PT1 ^ 6]; RES[i++] ^= *A; \
++ B = &WALK[PT2 ^ 3]; RES[i++] ^= *B; \
++ C = &WALK[PT1 ^ 7]; RES[i++] ^= *C; \
++ D = &WALK[PT2 ^ 7]; RES[i++] ^= *D; \
++ \
++ IN = (*A >> (13)) ^ (*A << (19)) ^ CLK; \
++ *A = (*B >> (14)) ^ (*B << (18)) ^ CLK; \
++ *B = IN; \
++ *C = (*C >> (15)) ^ (*C << (17)) ^ CLK; \
++ *D = (*D >> (16)) ^ (*D << (16)) ^ CLK; \
++ \
++ PT1 = ( RES[(i - 8) ^ PTX] ^ \
++ WALK[PT1 ^ PTX ^ 7] ) & (~1); \
++ PT1 ^= (PT2 ^ 0x10) & 0x10; \
++ \
++ for( n++, i = 0; i < 16; i++ ) \
++ hs->pool[n % COLLECT_SIZE] ^= RES[i];
++
++/*
++ * Entropy gathering function
++ */
++static void havege_fill( havege_state *hs )
++{
++ int i, n = 0;
++ int U1, U2, *A, *B, *C, *D;
++ int PT1, PT2, *WALK, RES[16];
++ int PTX, PTY, CLK, PTEST, IN;
++
++ WALK = hs->WALK;
++ PT1 = hs->PT1;
++ PT2 = hs->PT2;
++
++ PTX = U1 = 0;
++ PTY = U2 = 0;
++
++ memset( RES, 0, sizeof( RES ) );
++
++ while( n < COLLECT_SIZE * 4 )
++ {
++ ONE_ITERATION
++ ONE_ITERATION
++ ONE_ITERATION
++ ONE_ITERATION
++ }
++
++ hs->PT1 = PT1;
++ hs->PT2 = PT2;
++
++ hs->offset[0] = 0;
++ hs->offset[1] = COLLECT_SIZE / 2;
++}
++
++/*
++ * HAVEGE initialization
++ */
++void havege_init( havege_state *hs )
++{
++ memset( hs, 0, sizeof( havege_state ) );
++
++ havege_fill( hs );
++}
++
++/*
++ * HAVEGE rand function
++ */
++int havege_rand( void *p_rng )
++{
++ int ret;
++ havege_state *hs = (havege_state *) p_rng;
++
++ if( hs->offset[1] >= COLLECT_SIZE )
++ havege_fill( hs );
++
++ ret = hs->pool[hs->offset[0]++];
++ ret ^= hs->pool[hs->offset[1]++];
++
++ return( ret );
++}
++
++#if defined(POLARSSL_RAND_TEST)
++
++#include <stdio.h>
++
++int main( int argc, char *argv[] )
++{
++ FILE *f;
++ time_t t;
++ int i, j, k;
++ havege_state hs;
++ unsigned char buf[1024];
++
++ if( argc < 2 )
++ {
++ fprintf( stderr, "usage: %s <output filename>\n", argv[0] );
++ return( 1 );
++ }
++
++ if( ( f = fopen( argv[1], "wb+" ) ) == NULL )
++ {
++ printf( "failed to open '%s' for writing.\n", argv[0] );
++ return( 1 );
++ }
++
++ havege_init( &hs );
++
++ t = time( NULL );
++
++ for( i = 0, k = 32768; i < k; i++ )
++ {
++ for( j = 0; j < sizeof( buf ); j++ )
++ buf[j] = havege_rand( &hs );
++
++ fwrite( buf, sizeof( buf ), 1, f );
++
++ printf( "Generating 32Mb of data in file '%s'... %04.1f" \
++ "%% done\r", argv[1], (100 * (float) (i + 1)) / k );
++ fflush( stdout );
++ }
++
++ if( t == time( NULL ) )
++ t--;
++
++ fclose( f );
++ return( 0 );
++}
++
++#endif
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/rsa.c b/feeds/luci/libs/luci-lib-px5g/src/library/rsa.c
+new file mode 100644
+index 0000000..131b6c6
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/library/rsa.c
+@@ -0,0 +1,750 @@
++/*
++ * The RSA public-key cryptosystem
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++/*
++ * RSA was designed by Ron Rivest, Adi Shamir and Len Adleman.
++ *
++ * http://theory.lcs.mit.edu/~rivest/rsapaper.pdf
++ * http://www.cacr.math.uwaterloo.ca/hac/about/chap8.pdf
++ */
++
++#include "polarssl/config.h"
++
++#if defined(POLARSSL_RSA_C)
++
++#include "polarssl/rsa.h"
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h>
++
++/*
++ * Initialize an RSA context
++ */
++void rsa_init( rsa_context *ctx,
++ int padding,
++ int hash_id,
++ int (*f_rng)(void *),
++ void *p_rng )
++{
++ memset( ctx, 0, sizeof( rsa_context ) );
++
++ ctx->padding = padding;
++ ctx->hash_id = hash_id;
++
++ ctx->f_rng = f_rng;
++ ctx->p_rng = p_rng;
++}
++
++#if defined(POLARSSL_GENPRIME)
++
++/*
++ * Generate an RSA keypair
++ */
++int rsa_gen_key( rsa_context *ctx, int nbits, int exponent )
++{
++ int ret;
++ mpi P1, Q1, H, G;
++
++ if( ctx->f_rng == NULL || nbits < 128 || exponent < 3 )
++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
++
++ mpi_init( &P1, &Q1, &H, &G, NULL );
++
++ /*
++ * find primes P and Q with Q < P so that:
++ * GCD( E, (P-1)*(Q-1) ) == 1
++ */
++ MPI_CHK( mpi_lset( &ctx->E, exponent ) );
++
++ do
++ {
++ MPI_CHK( mpi_gen_prime( &ctx->P, ( nbits + 1 ) >> 1, 0,
++ ctx->f_rng, ctx->p_rng ) );
++
++ MPI_CHK( mpi_gen_prime( &ctx->Q, ( nbits + 1 ) >> 1, 0,
++ ctx->f_rng, ctx->p_rng ) );
++
++ if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) < 0 )
++ mpi_swap( &ctx->P, &ctx->Q );
++
++ if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) == 0 )
++ continue;
++
++ MPI_CHK( mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) );
++ if( mpi_msb( &ctx->N ) != nbits )
++ continue;
++
++ MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) );
++ MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) );
++ MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) );
++ MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) );
++ }
++ while( mpi_cmp_int( &G, 1 ) != 0 );
++
++ /*
++ * D = E^-1 mod ((P-1)*(Q-1))
++ * DP = D mod (P - 1)
++ * DQ = D mod (Q - 1)
++ * QP = Q^-1 mod P
++ */
++ MPI_CHK( mpi_inv_mod( &ctx->D , &ctx->E, &H ) );
++ MPI_CHK( mpi_mod_mpi( &ctx->DP, &ctx->D, &P1 ) );
++ MPI_CHK( mpi_mod_mpi( &ctx->DQ, &ctx->D, &Q1 ) );
++ MPI_CHK( mpi_inv_mod( &ctx->QP, &ctx->Q, &ctx->P ) );
++
++ ctx->len = ( mpi_msb( &ctx->N ) + 7 ) >> 3;
++
++cleanup:
++
++ mpi_free( &G, &H, &Q1, &P1, NULL );
++
++ if( ret != 0 )
++ {
++ rsa_free( ctx );
++ return( POLARSSL_ERR_RSA_KEY_GEN_FAILED | ret );
++ }
++
++ return( 0 );
++}
++
++#endif
++
++/*
++ * Check a public RSA key
++ */
++int rsa_check_pubkey( rsa_context *ctx )
++{
++ if( ( ctx->N.p[0] & 1 ) == 0 ||
++ ( ctx->E.p[0] & 1 ) == 0 )
++ return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
++
++ if( mpi_msb( &ctx->N ) < 128 ||
++ mpi_msb( &ctx->N ) > 4096 )
++ return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
++
++ if( mpi_msb( &ctx->E ) < 2 ||
++ mpi_msb( &ctx->E ) > 64 )
++ return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED );
++
++ return( 0 );
++}
++
++/*
++ * Check a private RSA key
++ */
++int rsa_check_privkey( rsa_context *ctx )
++{
++ int ret;
++ mpi PQ, DE, P1, Q1, H, I, G;
++
++ if( ( ret = rsa_check_pubkey( ctx ) ) != 0 )
++ return( ret );
++
++ mpi_init( &PQ, &DE, &P1, &Q1, &H, &I, &G, NULL );
++
++ MPI_CHK( mpi_mul_mpi( &PQ, &ctx->P, &ctx->Q ) );
++ MPI_CHK( mpi_mul_mpi( &DE, &ctx->D, &ctx->E ) );
++ MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) );
++ MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) );
++ MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) );
++ MPI_CHK( mpi_mod_mpi( &I, &DE, &H ) );
++ MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) );
++
++ if( mpi_cmp_mpi( &PQ, &ctx->N ) == 0 &&
++ mpi_cmp_int( &I, 1 ) == 0 &&
++ mpi_cmp_int( &G, 1 ) == 0 )
++ {
++ mpi_free( &G, &I, &H, &Q1, &P1, &DE, &PQ, NULL );
++ return( 0 );
++ }
++
++cleanup:
++
++ mpi_free( &G, &I, &H, &Q1, &P1, &DE, &PQ, NULL );
++ return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED | ret );
++}
++
++/*
++ * Do an RSA public key operation
++ */
++int rsa_public( rsa_context *ctx,
++ unsigned char *input,
++ unsigned char *output )
++{
++ int ret, olen;
++ mpi T;
++
++ mpi_init( &T, NULL );
++
++ MPI_CHK( mpi_read_binary( &T, input, ctx->len ) );
++
++ if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
++ {
++ mpi_free( &T, NULL );
++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
++ }
++
++ olen = ctx->len;
++ MPI_CHK( mpi_exp_mod( &T, &T, &ctx->E, &ctx->N, &ctx->RN ) );
++ MPI_CHK( mpi_write_binary( &T, output, olen ) );
++
++cleanup:
++
++ mpi_free( &T, NULL );
++
++ if( ret != 0 )
++ return( POLARSSL_ERR_RSA_PUBLIC_FAILED | ret );
++
++ return( 0 );
++}
++
++/*
++ * Do an RSA private key operation
++ */
++int rsa_private( rsa_context *ctx,
++ unsigned char *input,
++ unsigned char *output )
++{
++ int ret, olen;
++ mpi T, T1, T2;
++
++ mpi_init( &T, &T1, &T2, NULL );
++
++ MPI_CHK( mpi_read_binary( &T, input, ctx->len ) );
++
++ if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 )
++ {
++ mpi_free( &T, NULL );
++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
++ }
++
++#if 0
++ MPI_CHK( mpi_exp_mod( &T, &T, &ctx->D, &ctx->N, &ctx->RN ) );
++#else
++ /*
++ * faster decryption using the CRT
++ *
++ * T1 = input ^ dP mod P
++ * T2 = input ^ dQ mod Q
++ */
++ MPI_CHK( mpi_exp_mod( &T1, &T, &ctx->DP, &ctx->P, &ctx->RP ) );
++ MPI_CHK( mpi_exp_mod( &T2, &T, &ctx->DQ, &ctx->Q, &ctx->RQ ) );
++
++ /*
++ * T = (T1 - T2) * (Q^-1 mod P) mod P
++ */
++ MPI_CHK( mpi_sub_mpi( &T, &T1, &T2 ) );
++ MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->QP ) );
++ MPI_CHK( mpi_mod_mpi( &T, &T1, &ctx->P ) );
++
++ /*
++ * output = T2 + T * Q
++ */
++ MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->Q ) );
++ MPI_CHK( mpi_add_mpi( &T, &T2, &T1 ) );
++#endif
++
++ olen = ctx->len;
++ MPI_CHK( mpi_write_binary( &T, output, olen ) );
++
++cleanup:
++
++ mpi_free( &T, &T1, &T2, NULL );
++
++ if( ret != 0 )
++ return( POLARSSL_ERR_RSA_PRIVATE_FAILED | ret );
++
++ return( 0 );
++}
++
++/*
++ * Add the message padding, then do an RSA operation
++ */
++int rsa_pkcs1_encrypt( rsa_context *ctx,
++ int mode, int ilen,
++ unsigned char *input,
++ unsigned char *output )
++{
++ int nb_pad, olen;
++ unsigned char *p = output;
++
++ olen = ctx->len;
++
++ switch( ctx->padding )
++ {
++ case RSA_PKCS_V15:
++
++ if( ilen < 0 || olen < ilen + 11 )
++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
++
++ nb_pad = olen - 3 - ilen;
++
++ *p++ = 0;
++ *p++ = RSA_CRYPT;
++
++ while( nb_pad-- > 0 )
++ {
++ do {
++ *p = (unsigned char) rand();
++ } while( *p == 0 );
++ p++;
++ }
++ *p++ = 0;
++ memcpy( p, input, ilen );
++ break;
++
++ default:
++
++ return( POLARSSL_ERR_RSA_INVALID_PADDING );
++ }
++
++ return( ( mode == RSA_PUBLIC )
++ ? rsa_public( ctx, output, output )
++ : rsa_private( ctx, output, output ) );
++}
++
++/*
++ * Do an RSA operation, then remove the message padding
++ */
++int rsa_pkcs1_decrypt( rsa_context *ctx,
++ int mode, int *olen,
++ unsigned char *input,
++ unsigned char *output,
++ int output_max_len)
++{
++ int ret, ilen;
++ unsigned char *p;
++ unsigned char buf[512];
++
++ ilen = ctx->len;
++
++ if( ilen < 16 || ilen > (int) sizeof( buf ) )
++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
++
++ ret = ( mode == RSA_PUBLIC )
++ ? rsa_public( ctx, input, buf )
++ : rsa_private( ctx, input, buf );
++
++ if( ret != 0 )
++ return( ret );
++
++ p = buf;
++
++ switch( ctx->padding )
++ {
++ case RSA_PKCS_V15:
++
++ if( *p++ != 0 || *p++ != RSA_CRYPT )
++ return( POLARSSL_ERR_RSA_INVALID_PADDING );
++
++ while( *p != 0 )
++ {
++ if( p >= buf + ilen - 1 )
++ return( POLARSSL_ERR_RSA_INVALID_PADDING );
++ p++;
++ }
++ p++;
++ break;
++
++ default:
++
++ return( POLARSSL_ERR_RSA_INVALID_PADDING );
++ }
++
++ if (ilen - (int)(p - buf) > output_max_len)
++ return( POLARSSL_ERR_RSA_OUTPUT_TO_LARGE );
++
++ *olen = ilen - (int)(p - buf);
++ memcpy( output, p, *olen );
++
++ return( 0 );
++}
++
++/*
++ * Do an RSA operation to sign the message digest
++ */
++int rsa_pkcs1_sign( rsa_context *ctx,
++ int mode,
++ int hash_id,
++ int hashlen,
++ unsigned char *hash,
++ unsigned char *sig )
++{
++ int nb_pad, olen;
++ unsigned char *p = sig;
++
++ olen = ctx->len;
++
++ switch( ctx->padding )
++ {
++ case RSA_PKCS_V15:
++
++ switch( hash_id )
++ {
++ case RSA_RAW:
++ nb_pad = olen - 3 - hashlen;
++ break;
++
++ case RSA_MD2:
++ case RSA_MD4:
++ case RSA_MD5:
++ nb_pad = olen - 3 - 34;
++ break;
++
++ case RSA_SHA1:
++ nb_pad = olen - 3 - 35;
++ break;
++
++ default:
++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
++ }
++
++ if( nb_pad < 8 )
++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
++
++ *p++ = 0;
++ *p++ = RSA_SIGN;
++ memset( p, 0xFF, nb_pad );
++ p += nb_pad;
++ *p++ = 0;
++ break;
++
++ default:
++
++ return( POLARSSL_ERR_RSA_INVALID_PADDING );
++ }
++
++ switch( hash_id )
++ {
++ case RSA_RAW:
++ memcpy( p, hash, hashlen );
++ break;
++
++ case RSA_MD2:
++ memcpy( p, ASN1_HASH_MDX, 18 );
++ memcpy( p + 18, hash, 16 );
++ p[13] = 2; break;
++
++ case RSA_MD4:
++ memcpy( p, ASN1_HASH_MDX, 18 );
++ memcpy( p + 18, hash, 16 );
++ p[13] = 4; break;
++
++ case RSA_MD5:
++ memcpy( p, ASN1_HASH_MDX, 18 );
++ memcpy( p + 18, hash, 16 );
++ p[13] = 5; break;
++
++ case RSA_SHA1:
++ memcpy( p, ASN1_HASH_SHA1, 15 );
++ memcpy( p + 15, hash, 20 );
++ break;
++
++ default:
++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
++ }
++
++ return( ( mode == RSA_PUBLIC )
++ ? rsa_public( ctx, sig, sig )
++ : rsa_private( ctx, sig, sig ) );
++}
++
++/*
++ * Do an RSA operation and check the message digest
++ */
++int rsa_pkcs1_verify( rsa_context *ctx,
++ int mode,
++ int hash_id,
++ int hashlen,
++ unsigned char *hash,
++ unsigned char *sig )
++{
++ int ret, len, siglen;
++ unsigned char *p, c;
++ unsigned char buf[512];
++
++ siglen = ctx->len;
++
++ if( siglen < 16 || siglen > (int) sizeof( buf ) )
++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA );
++
++ ret = ( mode == RSA_PUBLIC )
++ ? rsa_public( ctx, sig, buf )
++ : rsa_private( ctx, sig, buf );
++
++ if( ret != 0 )
++ return( ret );
++
++ p = buf;
++
++ switch( ctx->padding )
++ {
++ case RSA_PKCS_V15:
++
++ if( *p++ != 0 || *p++ != RSA_SIGN )
++ return( POLARSSL_ERR_RSA_INVALID_PADDING );
++
++ while( *p != 0 )
++ {
++ if( p >= buf + siglen - 1 || *p != 0xFF )
++ return( POLARSSL_ERR_RSA_INVALID_PADDING );
++ p++;
++ }
++ p++;
++ break;
++
++ default:
++
++ return( POLARSSL_ERR_RSA_INVALID_PADDING );
++ }
++
++ len = siglen - (int)( p - buf );
++
++ if( len == 34 )
++ {
++ c = p[13];
++ p[13] = 0;
++
++ if( memcmp( p, ASN1_HASH_MDX, 18 ) != 0 )
++ return( POLARSSL_ERR_RSA_VERIFY_FAILED );
++
++ if( ( c == 2 && hash_id == RSA_MD2 ) ||
++ ( c == 4 && hash_id == RSA_MD4 ) ||
++ ( c == 5 && hash_id == RSA_MD5 ) )
++ {
++ if( memcmp( p + 18, hash, 16 ) == 0 )
++ return( 0 );
++ else
++ return( POLARSSL_ERR_RSA_VERIFY_FAILED );
++ }
++ }
++
++ if( len == 35 && hash_id == RSA_SHA1 )
++ {
++ if( memcmp( p, ASN1_HASH_SHA1, 15 ) == 0 &&
++ memcmp( p + 15, hash, 20 ) == 0 )
++ return( 0 );
++ else
++ return( POLARSSL_ERR_RSA_VERIFY_FAILED );
++ }
++
++ if( len == hashlen && hash_id == RSA_RAW )
++ {
++ if( memcmp( p, hash, hashlen ) == 0 )
++ return( 0 );
++ else
++ return( POLARSSL_ERR_RSA_VERIFY_FAILED );
++ }
++
++ return( POLARSSL_ERR_RSA_INVALID_PADDING );
++}
++
++/*
++ * Free the components of an RSA key
++ */
++void rsa_free( rsa_context *ctx )
++{
++ mpi_free( &ctx->RQ, &ctx->RP, &ctx->RN,
++ &ctx->QP, &ctx->DQ, &ctx->DP,
++ &ctx->Q, &ctx->P, &ctx->D,
++ &ctx->E, &ctx->N, NULL );
++}
++
++#if defined(POLARSSL_SELF_TEST)
++
++#include "polarssl/sha1.h"
++
++/*
++ * Example RSA-1024 keypair, for test purposes
++ */
++#define KEY_LEN 128
++
++#define RSA_N "9292758453063D803DD603D5E777D788" \
++ "8ED1D5BF35786190FA2F23EBC0848AEA" \
++ "DDA92CA6C3D80B32C4D109BE0F36D6AE" \
++ "7130B9CED7ACDF54CFC7555AC14EEBAB" \
++ "93A89813FBF3C4F8066D2D800F7C38A8" \
++ "1AE31942917403FF4946B0A83D3D3E05" \
++ "EE57C6F5F5606FB5D4BC6CD34EE0801A" \
++ "5E94BB77B07507233A0BC7BAC8F90F79"
++
++#define RSA_E "10001"
++
++#define RSA_D "24BF6185468786FDD303083D25E64EFC" \
++ "66CA472BC44D253102F8B4A9D3BFA750" \
++ "91386C0077937FE33FA3252D28855837" \
++ "AE1B484A8A9A45F7EE8C0C634F99E8CD" \
++ "DF79C5CE07EE72C7F123142198164234" \
++ "CABB724CF78B8173B9F880FC86322407" \
++ "AF1FEDFDDE2BEB674CA15F3E81A1521E" \
++ "071513A1E85B5DFA031F21ECAE91A34D"
++
++#define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \
++ "2C01CAD19EA484A87EA4377637E75500" \
++ "FCB2005C5C7DD6EC4AC023CDA285D796" \
++ "C3D9E75E1EFC42488BB4F1D13AC30A57"
++
++#define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \
++ "E211C2B9E5DB1ED0BF61D0D9899620F4" \
++ "910E4168387E3C30AA1E00C339A79508" \
++ "8452DD96A9A5EA5D9DCA68DA636032AF"
++
++#define RSA_DP "C1ACF567564274FB07A0BBAD5D26E298" \
++ "3C94D22288ACD763FD8E5600ED4A702D" \
++ "F84198A5F06C2E72236AE490C93F07F8" \
++ "3CC559CD27BC2D1CA488811730BB5725"
++
++#define RSA_DQ "4959CBF6F8FEF750AEE6977C155579C7" \
++ "D8AAEA56749EA28623272E4F7D0592AF" \
++ "7C1F1313CAC9471B5C523BFE592F517B" \
++ "407A1BD76C164B93DA2D32A383E58357"
++
++#define RSA_QP "9AE7FBC99546432DF71896FC239EADAE" \
++ "F38D18D2B2F0E2DD275AA977E2BF4411" \
++ "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \
++ "A74206CEC169D74BF5A8C50D6F48EA08"
++
++#define PT_LEN 24
++#define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \
++ "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD"
++
++/*
++ * Checkup routine
++ */
++int rsa_self_test( int verbose )
++{
++ int len;
++ rsa_context rsa;
++ unsigned char sha1sum[20];
++ unsigned char rsa_plaintext[PT_LEN];
++ unsigned char rsa_decrypted[PT_LEN];
++ unsigned char rsa_ciphertext[KEY_LEN];
++
++ memset( &rsa, 0, sizeof( rsa_context ) );
++
++ rsa.len = KEY_LEN;
++ mpi_read_string( &rsa.N , 16, RSA_N );
++ mpi_read_string( &rsa.E , 16, RSA_E );
++ mpi_read_string( &rsa.D , 16, RSA_D );
++ mpi_read_string( &rsa.P , 16, RSA_P );
++ mpi_read_string( &rsa.Q , 16, RSA_Q );
++ mpi_read_string( &rsa.DP, 16, RSA_DP );
++ mpi_read_string( &rsa.DQ, 16, RSA_DQ );
++ mpi_read_string( &rsa.QP, 16, RSA_QP );
++
++ if( verbose != 0 )
++ printf( " RSA key validation: " );
++
++ if( rsa_check_pubkey( &rsa ) != 0 ||
++ rsa_check_privkey( &rsa ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n PKCS#1 encryption : " );
++
++ memcpy( rsa_plaintext, RSA_PT, PT_LEN );
++
++ if( rsa_pkcs1_encrypt( &rsa, RSA_PUBLIC, PT_LEN,
++ rsa_plaintext, rsa_ciphertext ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n PKCS#1 decryption : " );
++
++ if( rsa_pkcs1_decrypt( &rsa, RSA_PRIVATE, &len,
++ rsa_ciphertext, rsa_decrypted,
++ sizeof(rsa_decrypted) ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n PKCS#1 data sign : " );
++
++ sha1( rsa_plaintext, PT_LEN, sha1sum );
++
++ if( rsa_pkcs1_sign( &rsa, RSA_PRIVATE, RSA_SHA1, 20,
++ sha1sum, rsa_ciphertext ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n PKCS#1 sig. verify: " );
++
++ if( rsa_pkcs1_verify( &rsa, RSA_PUBLIC, RSA_SHA1, 20,
++ sha1sum, rsa_ciphertext ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n\n" );
++
++ rsa_free( &rsa );
++
++ return( 0 );
++}
++
++#endif
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/sha1.c b/feeds/luci/libs/luci-lib-px5g/src/library/sha1.c
+new file mode 100644
+index 0000000..54a4416
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/library/sha1.c
+@@ -0,0 +1,622 @@
++/*
++ * FIPS-180-1 compliant SHA-1 implementation
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++/*
++ * The SHA-1 standard was published by NIST in 1993.
++ *
++ * http://www.itl.nist.gov/fipspubs/fip180-1.htm
++ */
++
++#include "polarssl/config.h"
++
++#if defined(POLARSSL_SHA1_C)
++
++#include "polarssl/sha1.h"
++
++#include <string.h>
++#include <stdio.h>
++
++/*
++ * 32-bit integer manipulation macros (big endian)
++ */
++#ifndef GET_ULONG_BE
++#define GET_ULONG_BE(n,b,i) \
++{ \
++ (n) = ( (unsigned long) (b)[(i) ] << 24 ) \
++ | ( (unsigned long) (b)[(i) + 1] << 16 ) \
++ | ( (unsigned long) (b)[(i) + 2] << 8 ) \
++ | ( (unsigned long) (b)[(i) + 3] ); \
++}
++#endif
++
++#ifndef PUT_ULONG_BE
++#define PUT_ULONG_BE(n,b,i) \
++{ \
++ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
++ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
++ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
++ (b)[(i) + 3] = (unsigned char) ( (n) ); \
++}
++#endif
++
++/*
++ * SHA-1 context setup
++ */
++void sha1_starts( sha1_context *ctx )
++{
++ ctx->total[0] = 0;
++ ctx->total[1] = 0;
++
++ ctx->state[0] = 0x67452301;
++ ctx->state[1] = 0xEFCDAB89;
++ ctx->state[2] = 0x98BADCFE;
++ ctx->state[3] = 0x10325476;
++ ctx->state[4] = 0xC3D2E1F0;
++}
++
++static void sha1_process( sha1_context *ctx, unsigned char data[64] )
++{
++ unsigned long temp, W[16], A, B, C, D, E;
++
++ GET_ULONG_BE( W[ 0], data, 0 );
++ GET_ULONG_BE( W[ 1], data, 4 );
++ GET_ULONG_BE( W[ 2], data, 8 );
++ GET_ULONG_BE( W[ 3], data, 12 );
++ GET_ULONG_BE( W[ 4], data, 16 );
++ GET_ULONG_BE( W[ 5], data, 20 );
++ GET_ULONG_BE( W[ 6], data, 24 );
++ GET_ULONG_BE( W[ 7], data, 28 );
++ GET_ULONG_BE( W[ 8], data, 32 );
++ GET_ULONG_BE( W[ 9], data, 36 );
++ GET_ULONG_BE( W[10], data, 40 );
++ GET_ULONG_BE( W[11], data, 44 );
++ GET_ULONG_BE( W[12], data, 48 );
++ GET_ULONG_BE( W[13], data, 52 );
++ GET_ULONG_BE( W[14], data, 56 );
++ GET_ULONG_BE( W[15], data, 60 );
++
++#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
++
++#define R(t) \
++( \
++ temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ \
++ W[(t - 14) & 0x0F] ^ W[ t & 0x0F], \
++ ( W[t & 0x0F] = S(temp,1) ) \
++)
++
++#define P(a,b,c,d,e,x) \
++{ \
++ e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \
++}
++
++ A = ctx->state[0];
++ B = ctx->state[1];
++ C = ctx->state[2];
++ D = ctx->state[3];
++ E = ctx->state[4];
++
++#define F(x,y,z) (z ^ (x & (y ^ z)))
++#define K 0x5A827999
++
++ P( A, B, C, D, E, W[0] );
++ P( E, A, B, C, D, W[1] );
++ P( D, E, A, B, C, W[2] );
++ P( C, D, E, A, B, W[3] );
++ P( B, C, D, E, A, W[4] );
++ P( A, B, C, D, E, W[5] );
++ P( E, A, B, C, D, W[6] );
++ P( D, E, A, B, C, W[7] );
++ P( C, D, E, A, B, W[8] );
++ P( B, C, D, E, A, W[9] );
++ P( A, B, C, D, E, W[10] );
++ P( E, A, B, C, D, W[11] );
++ P( D, E, A, B, C, W[12] );
++ P( C, D, E, A, B, W[13] );
++ P( B, C, D, E, A, W[14] );
++ P( A, B, C, D, E, W[15] );
++ P( E, A, B, C, D, R(16) );
++ P( D, E, A, B, C, R(17) );
++ P( C, D, E, A, B, R(18) );
++ P( B, C, D, E, A, R(19) );
++
++#undef K
++#undef F
++
++#define F(x,y,z) (x ^ y ^ z)
++#define K 0x6ED9EBA1
++
++ P( A, B, C, D, E, R(20) );
++ P( E, A, B, C, D, R(21) );
++ P( D, E, A, B, C, R(22) );
++ P( C, D, E, A, B, R(23) );
++ P( B, C, D, E, A, R(24) );
++ P( A, B, C, D, E, R(25) );
++ P( E, A, B, C, D, R(26) );
++ P( D, E, A, B, C, R(27) );
++ P( C, D, E, A, B, R(28) );
++ P( B, C, D, E, A, R(29) );
++ P( A, B, C, D, E, R(30) );
++ P( E, A, B, C, D, R(31) );
++ P( D, E, A, B, C, R(32) );
++ P( C, D, E, A, B, R(33) );
++ P( B, C, D, E, A, R(34) );
++ P( A, B, C, D, E, R(35) );
++ P( E, A, B, C, D, R(36) );
++ P( D, E, A, B, C, R(37) );
++ P( C, D, E, A, B, R(38) );
++ P( B, C, D, E, A, R(39) );
++
++#undef K
++#undef F
++
++#define F(x,y,z) ((x & y) | (z & (x | y)))
++#define K 0x8F1BBCDC
++
++ P( A, B, C, D, E, R(40) );
++ P( E, A, B, C, D, R(41) );
++ P( D, E, A, B, C, R(42) );
++ P( C, D, E, A, B, R(43) );
++ P( B, C, D, E, A, R(44) );
++ P( A, B, C, D, E, R(45) );
++ P( E, A, B, C, D, R(46) );
++ P( D, E, A, B, C, R(47) );
++ P( C, D, E, A, B, R(48) );
++ P( B, C, D, E, A, R(49) );
++ P( A, B, C, D, E, R(50) );
++ P( E, A, B, C, D, R(51) );
++ P( D, E, A, B, C, R(52) );
++ P( C, D, E, A, B, R(53) );
++ P( B, C, D, E, A, R(54) );
++ P( A, B, C, D, E, R(55) );
++ P( E, A, B, C, D, R(56) );
++ P( D, E, A, B, C, R(57) );
++ P( C, D, E, A, B, R(58) );
++ P( B, C, D, E, A, R(59) );
++
++#undef K
++#undef F
++
++#define F(x,y,z) (x ^ y ^ z)
++#define K 0xCA62C1D6
++
++ P( A, B, C, D, E, R(60) );
++ P( E, A, B, C, D, R(61) );
++ P( D, E, A, B, C, R(62) );
++ P( C, D, E, A, B, R(63) );
++ P( B, C, D, E, A, R(64) );
++ P( A, B, C, D, E, R(65) );
++ P( E, A, B, C, D, R(66) );
++ P( D, E, A, B, C, R(67) );
++ P( C, D, E, A, B, R(68) );
++ P( B, C, D, E, A, R(69) );
++ P( A, B, C, D, E, R(70) );
++ P( E, A, B, C, D, R(71) );
++ P( D, E, A, B, C, R(72) );
++ P( C, D, E, A, B, R(73) );
++ P( B, C, D, E, A, R(74) );
++ P( A, B, C, D, E, R(75) );
++ P( E, A, B, C, D, R(76) );
++ P( D, E, A, B, C, R(77) );
++ P( C, D, E, A, B, R(78) );
++ P( B, C, D, E, A, R(79) );
++
++#undef K
++#undef F
++
++ ctx->state[0] += A;
++ ctx->state[1] += B;
++ ctx->state[2] += C;
++ ctx->state[3] += D;
++ ctx->state[4] += E;
++}
++
++/*
++ * SHA-1 process buffer
++ */
++void sha1_update( sha1_context *ctx, unsigned char *input, int ilen )
++{
++ int fill;
++ unsigned long left;
++
++ if( ilen <= 0 )
++ return;
++
++ left = ctx->total[0] & 0x3F;
++ fill = 64 - left;
++
++ ctx->total[0] += ilen;
++ ctx->total[0] &= 0xFFFFFFFF;
++
++ if( ctx->total[0] < (unsigned long) ilen )
++ ctx->total[1]++;
++
++ if( left && ilen >= fill )
++ {
++ memcpy( (void *) (ctx->buffer + left),
++ (void *) input, fill );
++ sha1_process( ctx, ctx->buffer );
++ input += fill;
++ ilen -= fill;
++ left = 0;
++ }
++
++ while( ilen >= 64 )
++ {
++ sha1_process( ctx, input );
++ input += 64;
++ ilen -= 64;
++ }
++
++ if( ilen > 0 )
++ {
++ memcpy( (void *) (ctx->buffer + left),
++ (void *) input, ilen );
++ }
++}
++
++static const unsigned char sha1_padding[64] =
++{
++ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
++};
++
++/*
++ * SHA-1 final digest
++ */
++void sha1_finish( sha1_context *ctx, unsigned char output[20] )
++{
++ unsigned long last, padn;
++ unsigned long high, low;
++ unsigned char msglen[8];
++
++ high = ( ctx->total[0] >> 29 )
++ | ( ctx->total[1] << 3 );
++ low = ( ctx->total[0] << 3 );
++
++ PUT_ULONG_BE( high, msglen, 0 );
++ PUT_ULONG_BE( low, msglen, 4 );
++
++ last = ctx->total[0] & 0x3F;
++ padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
++
++ sha1_update( ctx, (unsigned char *) sha1_padding, padn );
++ sha1_update( ctx, msglen, 8 );
++
++ PUT_ULONG_BE( ctx->state[0], output, 0 );
++ PUT_ULONG_BE( ctx->state[1], output, 4 );
++ PUT_ULONG_BE( ctx->state[2], output, 8 );
++ PUT_ULONG_BE( ctx->state[3], output, 12 );
++ PUT_ULONG_BE( ctx->state[4], output, 16 );
++}
++
++/*
++ * output = SHA-1( input buffer )
++ */
++void sha1( unsigned char *input, int ilen, unsigned char output[20] )
++{
++ sha1_context ctx;
++
++ sha1_starts( &ctx );
++ sha1_update( &ctx, input, ilen );
++ sha1_finish( &ctx, output );
++
++ memset( &ctx, 0, sizeof( sha1_context ) );
++}
++
++/*
++ * output = SHA-1( file contents )
++ */
++int sha1_file( char *path, unsigned char output[20] )
++{
++ FILE *f;
++ size_t n;
++ sha1_context ctx;
++ unsigned char buf[1024];
++
++ if( ( f = fopen( path, "rb" ) ) == NULL )
++ return( 1 );
++
++ sha1_starts( &ctx );
++
++ while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )
++ sha1_update( &ctx, buf, (int) n );
++
++ sha1_finish( &ctx, output );
++
++ memset( &ctx, 0, sizeof( sha1_context ) );
++
++ if( ferror( f ) != 0 )
++ {
++ fclose( f );
++ return( 2 );
++ }
++
++ fclose( f );
++ return( 0 );
++}
++
++/*
++ * SHA-1 HMAC context setup
++ */
++void sha1_hmac_starts( sha1_context *ctx, unsigned char *key, int keylen )
++{
++ int i;
++ unsigned char sum[20];
++
++ if( keylen > 64 )
++ {
++ sha1( key, keylen, sum );
++ keylen = 20;
++ key = sum;
++ }
++
++ memset( ctx->ipad, 0x36, 64 );
++ memset( ctx->opad, 0x5C, 64 );
++
++ for( i = 0; i < keylen; i++ )
++ {
++ ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
++ ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
++ }
++
++ sha1_starts( ctx );
++ sha1_update( ctx, ctx->ipad, 64 );
++
++ memset( sum, 0, sizeof( sum ) );
++}
++
++/*
++ * SHA-1 HMAC process buffer
++ */
++void sha1_hmac_update( sha1_context *ctx, unsigned char *input, int ilen )
++{
++ sha1_update( ctx, input, ilen );
++}
++
++/*
++ * SHA-1 HMAC final digest
++ */
++void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] )
++{
++ unsigned char tmpbuf[20];
++
++ sha1_finish( ctx, tmpbuf );
++ sha1_starts( ctx );
++ sha1_update( ctx, ctx->opad, 64 );
++ sha1_update( ctx, tmpbuf, 20 );
++ sha1_finish( ctx, output );
++
++ memset( tmpbuf, 0, sizeof( tmpbuf ) );
++}
++
++/*
++ * output = HMAC-SHA-1( hmac key, input buffer )
++ */
++void sha1_hmac( unsigned char *key, int keylen,
++ unsigned char *input, int ilen,
++ unsigned char output[20] )
++{
++ sha1_context ctx;
++
++ sha1_hmac_starts( &ctx, key, keylen );
++ sha1_hmac_update( &ctx, input, ilen );
++ sha1_hmac_finish( &ctx, output );
++
++ memset( &ctx, 0, sizeof( sha1_context ) );
++}
++
++#if defined(POLARSSL_SELF_TEST)
++/*
++ * FIPS-180-1 test vectors
++ */
++static unsigned char sha1_test_buf[3][57] =
++{
++ { "abc" },
++ { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" },
++ { "" }
++};
++
++static const int sha1_test_buflen[3] =
++{
++ 3, 56, 1000
++};
++
++static const unsigned char sha1_test_sum[3][20] =
++{
++ { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,
++ 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D },
++ { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE,
++ 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 },
++ { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E,
++ 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F }
++};
++
++/*
++ * RFC 2202 test vectors
++ */
++static unsigned char sha1_hmac_test_key[7][26] =
++{
++ { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B"
++ "\x0B\x0B\x0B\x0B" },
++ { "Jefe" },
++ { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
++ "\xAA\xAA\xAA\xAA" },
++ { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10"
++ "\x11\x12\x13\x14\x15\x16\x17\x18\x19" },
++ { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C"
++ "\x0C\x0C\x0C\x0C" },
++ { "" }, /* 0xAA 80 times */
++ { "" }
++};
++
++static const int sha1_hmac_test_keylen[7] =
++{
++ 20, 4, 20, 25, 20, 80, 80
++};
++
++static unsigned char sha1_hmac_test_buf[7][74] =
++{
++ { "Hi There" },
++ { "what do ya want for nothing?" },
++ { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
++ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
++ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
++ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD"
++ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" },
++ { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
++ "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
++ "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
++ "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD"
++ "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" },
++ { "Test With Truncation" },
++ { "Test Using Larger Than Block-Size Key - Hash Key First" },
++ { "Test Using Larger Than Block-Size Key and Larger"
++ " Than One Block-Size Data" }
++};
++
++static const int sha1_hmac_test_buflen[7] =
++{
++ 8, 28, 50, 50, 20, 54, 73
++};
++
++static const unsigned char sha1_hmac_test_sum[7][20] =
++{
++ { 0xB6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xE2, 0x8B,
++ 0xC0, 0xB6, 0xFB, 0x37, 0x8C, 0x8E, 0xF1, 0x46, 0xBE, 0x00 },
++ { 0xEF, 0xFC, 0xDF, 0x6A, 0xE5, 0xEB, 0x2F, 0xA2, 0xD2, 0x74,
++ 0x16, 0xD5, 0xF1, 0x84, 0xDF, 0x9C, 0x25, 0x9A, 0x7C, 0x79 },
++ { 0x12, 0x5D, 0x73, 0x42, 0xB9, 0xAC, 0x11, 0xCD, 0x91, 0xA3,
++ 0x9A, 0xF4, 0x8A, 0xA1, 0x7B, 0x4F, 0x63, 0xF1, 0x75, 0xD3 },
++ { 0x4C, 0x90, 0x07, 0xF4, 0x02, 0x62, 0x50, 0xC6, 0xBC, 0x84,
++ 0x14, 0xF9, 0xBF, 0x50, 0xC8, 0x6C, 0x2D, 0x72, 0x35, 0xDA },
++ { 0x4C, 0x1A, 0x03, 0x42, 0x4B, 0x55, 0xE0, 0x7F, 0xE7, 0xF2,
++ 0x7B, 0xE1 },
++ { 0xAA, 0x4A, 0xE5, 0xE1, 0x52, 0x72, 0xD0, 0x0E, 0x95, 0x70,
++ 0x56, 0x37, 0xCE, 0x8A, 0x3B, 0x55, 0xED, 0x40, 0x21, 0x12 },
++ { 0xE8, 0xE9, 0x9D, 0x0F, 0x45, 0x23, 0x7D, 0x78, 0x6D, 0x6B,
++ 0xBA, 0xA7, 0x96, 0x5C, 0x78, 0x08, 0xBB, 0xFF, 0x1A, 0x91 }
++};
++
++/*
++ * Checkup routine
++ */
++int sha1_self_test( int verbose )
++{
++ int i, j, buflen;
++ unsigned char buf[1024];
++ unsigned char sha1sum[20];
++ sha1_context ctx;
++
++ /*
++ * SHA-1
++ */
++ for( i = 0; i < 3; i++ )
++ {
++ if( verbose != 0 )
++ printf( " SHA-1 test #%d: ", i + 1 );
++
++ sha1_starts( &ctx );
++
++ if( i == 2 )
++ {
++ memset( buf, 'a', buflen = 1000 );
++
++ for( j = 0; j < 1000; j++ )
++ sha1_update( &ctx, buf, buflen );
++ }
++ else
++ sha1_update( &ctx, sha1_test_buf[i],
++ sha1_test_buflen[i] );
++
++ sha1_finish( &ctx, sha1sum );
++
++ if( memcmp( sha1sum, sha1_test_sum[i], 20 ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n" );
++ }
++
++ if( verbose != 0 )
++ printf( "\n" );
++
++ for( i = 0; i < 7; i++ )
++ {
++ if( verbose != 0 )
++ printf( " HMAC-SHA-1 test #%d: ", i + 1 );
++
++ if( i == 5 || i == 6 )
++ {
++ memset( buf, '\xAA', buflen = 80 );
++ sha1_hmac_starts( &ctx, buf, buflen );
++ }
++ else
++ sha1_hmac_starts( &ctx, sha1_hmac_test_key[i],
++ sha1_hmac_test_keylen[i] );
++
++ sha1_hmac_update( &ctx, sha1_hmac_test_buf[i],
++ sha1_hmac_test_buflen[i] );
++
++ sha1_hmac_finish( &ctx, sha1sum );
++
++ buflen = ( i == 4 ) ? 12 : 20;
++
++ if( memcmp( sha1sum, sha1_hmac_test_sum[i], buflen ) != 0 )
++ {
++ if( verbose != 0 )
++ printf( "failed\n" );
++
++ return( 1 );
++ }
++
++ if( verbose != 0 )
++ printf( "passed\n" );
++ }
++
++ if( verbose != 0 )
++ printf( "\n" );
++
++ return( 0 );
++}
++
++#endif
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/timing.c b/feeds/luci/libs/luci-lib-px5g/src/library/timing.c
+new file mode 100644
+index 0000000..6b7ab74
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/library/timing.c
+@@ -0,0 +1,265 @@
++/*
++ * Portable interface to the CPU cycle counter
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include "polarssl/config.h"
++
++#if defined(POLARSSL_TIMING_C)
++
++#include "polarssl/timing.h"
++
++#if defined(WIN32)
++
++#include <windows.h>
++#include <winbase.h>
++
++struct _hr_time
++{
++ LARGE_INTEGER start;
++};
++
++#else
++
++#include <unistd.h>
++#include <sys/types.h>
++#include <sys/time.h>
++#include <signal.h>
++#include <time.h>
++
++struct _hr_time
++{
++ struct timeval start;
++};
++
++#endif
++
++#if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
++
++unsigned long hardclock( void )
++{
++ unsigned long tsc;
++ __asm rdtsc
++ __asm mov [tsc], eax
++ return( tsc );
++}
++
++#else
++#if defined(__GNUC__) && defined(__i386__)
++
++unsigned long hardclock( void )
++{
++ unsigned long tsc;
++ asm( "rdtsc" : "=a" (tsc) );
++ return( tsc );
++}
++
++#else
++#if defined(__GNUC__) && (defined(__amd64__) || defined(__x86_64__))
++
++unsigned long hardclock( void )
++{
++ unsigned long lo, hi;
++ asm( "rdtsc" : "=a" (lo), "=d" (hi) );
++ return( lo | (hi << 32) );
++}
++
++#else
++#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
++
++unsigned long hardclock( void )
++{
++ unsigned long tbl, tbu0, tbu1;
++
++ do
++ {
++ asm( "mftbu %0" : "=r" (tbu0) );
++ asm( "mftb %0" : "=r" (tbl ) );
++ asm( "mftbu %0" : "=r" (tbu1) );
++ }
++ while( tbu0 != tbu1 );
++
++ return( tbl );
++}
++
++#else
++#if defined(__GNUC__) && defined(__sparc__)
++
++unsigned long hardclock( void )
++{
++ unsigned long tick;
++ asm( ".byte 0x83, 0x41, 0x00, 0x00" );
++ asm( "mov %%g1, %0" : "=r" (tick) );
++ return( tick );
++}
++
++#else
++#if defined(__GNUC__) && defined(__alpha__)
++
++unsigned long hardclock( void )
++{
++ unsigned long cc;
++ asm( "rpcc %0" : "=r" (cc) );
++ return( cc & 0xFFFFFFFF );
++}
++
++#else
++#if defined(__GNUC__) && defined(__ia64__)
++
++unsigned long hardclock( void )
++{
++ unsigned long itc;
++ asm( "mov %0 = ar.itc" : "=r" (itc) );
++ return( itc );
++}
++
++#else
++
++static int hardclock_init = 0;
++static struct timeval tv_init;
++
++unsigned long hardclock( void )
++{
++ struct timeval tv_cur;
++
++ if( hardclock_init == 0 )
++ {
++ gettimeofday( &tv_init, NULL );
++ hardclock_init = 1;
++ }
++
++ gettimeofday( &tv_cur, NULL );
++ return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000
++ + ( tv_cur.tv_usec - tv_init.tv_usec ) );
++}
++
++#endif /* generic */
++#endif /* IA-64 */
++#endif /* Alpha */
++#endif /* SPARC8 */
++#endif /* PowerPC */
++#endif /* AMD64 */
++#endif /* i586+ */
++
++int alarmed = 0;
++
++#if defined(WIN32)
++
++unsigned long get_timer( struct hr_time *val, int reset )
++{
++ unsigned long delta;
++ LARGE_INTEGER offset, hfreq;
++ struct _hr_time *t = (struct _hr_time *) val;
++
++ QueryPerformanceCounter( &offset );
++ QueryPerformanceFrequency( &hfreq );
++
++ delta = (unsigned long)( ( 1000 *
++ ( offset.QuadPart - t->start.QuadPart ) ) /
++ hfreq.QuadPart );
++
++ if( reset )
++ QueryPerformanceCounter( &t->start );
++
++ return( delta );
++}
++
++DWORD WINAPI TimerProc( LPVOID uElapse )
++{
++ Sleep( (DWORD) uElapse );
++ alarmed = 1;
++ return( TRUE );
++}
++
++void set_alarm( int seconds )
++{
++ DWORD ThreadId;
++
++ alarmed = 0;
++ CloseHandle( CreateThread( NULL, 0, TimerProc,
++ (LPVOID) ( seconds * 1000 ), 0, &ThreadId ) );
++}
++
++void m_sleep( int milliseconds )
++{
++ Sleep( milliseconds );
++}
++
++#else
++
++unsigned long get_timer( struct hr_time *val, int reset )
++{
++ unsigned long delta;
++ struct timeval offset;
++ struct _hr_time *t = (struct _hr_time *) val;
++
++ gettimeofday( &offset, NULL );
++
++ delta = ( offset.tv_sec - t->start.tv_sec ) * 1000
++ + ( offset.tv_usec - t->start.tv_usec ) / 1000;
++
++ if( reset )
++ {
++ t->start.tv_sec = offset.tv_sec;
++ t->start.tv_usec = offset.tv_usec;
++ }
++
++ return( delta );
++}
++
++static void sighandler( int signum )
++{
++ alarmed = 1;
++ signal( signum, sighandler );
++}
++
++void set_alarm( int seconds )
++{
++ alarmed = 0;
++ signal( SIGALRM, sighandler );
++ alarm( seconds );
++}
++
++void m_sleep( int milliseconds )
++{
++ struct timeval tv;
++
++ tv.tv_sec = milliseconds / 1000;
++ tv.tv_usec = milliseconds * 1000;
++
++ select( 0, NULL, NULL, NULL, &tv );
++}
++
++#endif
++
++#endif
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/x509write.c b/feeds/luci/libs/luci-lib-px5g/src/library/x509write.c
+new file mode 100644
+index 0000000..173610c
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/library/x509write.c
+@@ -0,0 +1,1137 @@
++/*
++ * X.509 certificate and private key writing
++ *
++ * Copyright (C) 2006-2007 Pascal Vizeli <pvizeli@yahoo.de>
++ * Modifications (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License, version 2.1 as published by the Free Software Foundation.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
++ * MA 02110-1301 USA
++ */
++/*
++ * The ITU-T X.509 standard defines a certificat format for PKI.
++ *
++ * http://www.ietf.org/rfc/rfc2459.txt
++ * http://www.ietf.org/rfc/rfc3279.txt
++ *
++ * ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-1v2.asc
++ *
++ * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf
++ * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
++ *
++ * For CRS:
++ * http://www.faqs.org/rfcs/rfc2314.html
++ */
++#include "polarssl/config.h"
++#include "polarssl/x509.h"
++/* #include "polarssl/base64.h" */
++#include "polarssl/sha1.h"
++
++#include <string.h>
++#include <stdlib.h>
++#include <stdio.h>
++#include <stdarg.h>
++#include <time.h>
++
++#define and &&
++#define or ||
++
++#if defined _MSC_VER && !defined snprintf
++#define snprintf _snprintf
++#endif
++
++static int x509write_realloc_node(x509_node *node, size_t larger);
++static int x509write_file(x509_node *node, char *path, int format, const char* pem_prolog, const char* pem_epilog);
++
++/*
++ * evaluate how mani octet have this integer
++ */
++static int asn1_eval_octet(unsigned int digit)
++{
++ int i, byte;
++
++ for (byte = 4, i = 24; i >= 0; i -= 8, --byte)
++ if (((digit >> i) & 0xFF) != 0)
++ return byte;
++
++ return 0;
++}
++
++/*
++ * write the asn.1 lenght form into p
++ */
++static int asn1_add_len(unsigned int size, x509_node *node)
++{
++ if (size > 127) {
++
++ /* long size */
++ int byte = asn1_eval_octet(size);
++ int i = 0;
++
++ *(node->p) = (0x80 | byte) & 0xFF;
++ ++node->p;
++
++ for (i = byte; i > 0; --i) {
++
++ *(node->p) = (size >> ((i - 1) * 8)) & 0xFF;
++ ++node->p;
++ }
++
++ } else {
++
++ /* short size */
++ *(node->p) = size & 0xFF;
++ if (size != 0)
++ ++node->p;
++ }
++
++ return 0;
++}
++
++/*
++ * write a ans.1 object into p
++ */
++static int asn1_add_obj(unsigned char *value, unsigned int size, int tag,
++ x509_node *node)
++{
++ int tl = 2;
++
++ if (tag == ASN1_BIT_STRING)
++ ++tl;
++
++ if (size > 127)
++ x509write_realloc_node(node, (size_t) size + tl +
++ asn1_eval_octet(size));
++ else
++ x509write_realloc_node(node, (size_t) size + tl);
++
++ if (node->data == NULL)
++ return 1;
++
++ /* tag */
++ *(node->p) = tag & 0xFF;
++ ++node->p;
++
++ /* len */
++ if (tag == ASN1_BIT_STRING) {
++ asn1_add_len((unsigned int) size + 1, node);
++ *(node->p) = 0x00;
++ ++node->p;
++ } else {
++ asn1_add_len((unsigned int) size, node);
++ }
++
++ /* value */
++ if (size > 0) {
++
++ memcpy(node->p, value, (size_t) size);
++ if ((node->p += size -1) != node->end)
++ return POLARSSL_ERR_X509_POINT_ERROR;
++ } else {
++ /* make nothing -> NULL */
++ }
++
++ return 0;
++}
++
++/*
++ * write a asn.1 conform integer object
++ */
++static int asn1_add_int(signed int value, x509_node *node)
++{
++ signed int i = 0, neg = 1;
++ unsigned int byte, u_val = 0, tmp_val = 0;
++
++ /* if negate? */
++ if (value < 0) {
++ neg = -1;
++ u_val = ~value;
++ } else {
++ u_val = value;
++ }
++
++ byte = asn1_eval_octet(u_val);
++ /* 0 isn't NULL */
++ if (byte == 0)
++ byte = 1;
++
++ /* ASN.1 integer is signed! */
++ if (byte < 4 and ((u_val >> ((byte -1) * 8)) & 0xFF) == 0x80)
++ byte += 1;
++
++ if (x509write_realloc_node(node, (size_t) byte + 2) != 0)
++ return 1;
++
++ /* tag */
++ *(node->p) = ASN1_INTEGER;
++ ++node->p;
++
++ /* len */
++ asn1_add_len(byte, node);
++
++ /* value */
++ for (i = byte; i > 0; --i) {
++
++ tmp_val = (u_val >> ((i - 1) * 8)) & 0xFF;
++ if (neg == 1)
++ *(node->p) = tmp_val;
++ else
++ *(node->p) = ~tmp_val;
++
++ if (i > 1)
++ ++node->p;
++ }
++
++ if (node->p != node->end)
++ return POLARSSL_ERR_X509_POINT_ERROR;
++
++ return 0;
++}
++
++/*
++ * write a asn.1 conform mpi object
++ */
++static int asn1_add_mpi(mpi *value, int tag, x509_node *node)
++{
++ size_t size = (mpi_msb(value) / 8) + 1;
++ unsigned char *buf;
++ int buf_len = (int) size, tl = 2;
++
++ if (tag == ASN1_BIT_STRING)
++ ++tl;
++
++ if (size > 127)
++ x509write_realloc_node(node, size + (size_t) tl +
++ asn1_eval_octet((unsigned int)size));
++ else
++ x509write_realloc_node(node, size + (size_t) tl);
++
++ if (node->data == NULL)
++ return 1;
++
++ buf = (unsigned char*) malloc(size);
++ if (mpi_write_binary(value, buf, buf_len) != 0)
++ return POLARSSL_ERR_MPI_BUFFER_TOO_SMALL;
++
++ /* tag */
++ *(node->p) = tag & 0xFF;
++ ++node->p;
++
++ /* len */
++ if (tag == ASN1_BIT_STRING) {
++ asn1_add_len((unsigned int) size + 1, node);
++ *(node->p) = 0x00;
++ ++node->p;
++ } else {
++ asn1_add_len((unsigned int) size, node);
++ }
++
++ /* value */
++ memcpy(node->p, buf, size);
++ free(buf);
++
++ if ((node->p += (int) size -1) != node->end)
++ return POLARSSL_ERR_X509_POINT_ERROR;
++
++ return 0;
++}
++
++/*
++ * write a node into asn.1 conform object
++ */
++static int asn1_append_tag(x509_node *node, int tag)
++{
++ int tl = 2;
++
++ x509_node tmp;
++ x509write_init_node(&tmp);
++
++ if (tag == ASN1_BIT_STRING)
++ ++tl;
++
++ if (node->len > 127)
++ x509write_realloc_node(&tmp, node->len + (size_t) tl +
++ asn1_eval_octet((unsigned int)node->len));
++ else
++ x509write_realloc_node(&tmp, node->len + (size_t) tl);
++
++ if (tmp.data == NULL) {
++ x509write_free_node(&tmp);
++ return 1;
++ }
++
++ /* tag */
++ *(tmp.p) = tag & 0xFF;
++ ++tmp.p;
++
++ /* len */
++ if (tag == ASN1_BIT_STRING) {
++ asn1_add_len((unsigned int) node->len + 1, &tmp);
++ *(tmp.p) = 0x00;
++ ++tmp.p;
++ } else {
++ asn1_add_len((unsigned int) node->len, &tmp);
++ }
++
++ /* value */
++ memcpy(tmp.p, node->data, node->len);
++
++ /* good? */
++ if ((tmp.p += (int) node->len -1) != tmp.end) {
++ x509write_free_node(&tmp);
++ return POLARSSL_ERR_X509_POINT_ERROR;
++ }
++
++ free(node->data);
++ node->data = tmp.data;
++ node->p = tmp.p;
++ node->end = tmp.end;
++ node->len = tmp.len;
++
++ return 0;
++}
++
++/*
++ * write nodes into a asn.1 object
++ */
++static int asn1_append_nodes(x509_node *node, int tag, int anz, ...)
++{
++ va_list ap;
++ size_t size = 0;
++ x509_node *tmp;
++ int count;
++
++ va_start(ap, anz);
++ count = anz;
++
++ while (count--) {
++
++ tmp = va_arg(ap, x509_node*);
++ if (tmp->data != NULL)
++ size += tmp->len;
++ }
++
++ if ( size > 127) {
++ if (x509write_realloc_node(node, size + (size_t) 2 +
++ asn1_eval_octet(size)) != 0)
++ return 1;
++ } else {
++ if (x509write_realloc_node(node, size + (size_t) 2) != 0)
++ return 1;
++ }
++
++ /* tag */
++ *(node->p) = tag & 0xFF;
++ ++node->p;
++
++ /* len */
++ asn1_add_len(size, node);
++
++ /* value */
++ va_start(ap, anz);
++ count = anz;
++
++ while (count--) {
++
++ tmp = va_arg(ap, x509_node*);
++ if (tmp->data != NULL) {
++
++ memcpy(node->p, tmp->data, tmp->len);
++ if ((node->p += (int) tmp->len -1) != node->end)
++ ++node->p;
++ }
++ }
++
++ va_end(ap);
++ return 0;
++}
++
++/*
++ * write a ASN.1 conform object identifiere include a "tag"
++ */
++static int asn1_add_oid(x509_node *node, unsigned char *oid, size_t len,
++ int tag, int tag_val, unsigned char *value, size_t val_len)
++{
++ int ret;
++ x509_node tmp;
++
++ x509write_init_node(&tmp);
++
++ /* OBJECT IDENTIFIER */
++ if ((ret = asn1_add_obj(oid, len, ASN1_OID, &tmp)) != 0) {
++ x509write_free_node(&tmp);
++ return ret;
++ }
++
++ /* value */
++ if ((ret = asn1_add_obj(value, val_len, tag_val, &tmp)) != 0) {
++ x509write_free_node(&tmp);
++ return ret;
++ }
++
++ /* SET/SEQUENCE */
++ if ((ret = asn1_append_nodes(node, tag, 1, &tmp)) != 0) {
++ x509write_free_node(&tmp);
++ return ret;
++ }
++
++ x509write_free_node(&tmp);
++ return 0;
++}
++
++/*
++ * utcTime UTCTime
++ */
++static int asn1_add_date_utc(unsigned char *time, x509_node *node)
++{
++ unsigned char date[13], *sp;
++ x509_time xtime;
++ int ret;
++
++ sscanf((char*)time, "%d-%d-%d %d:%d:%d", &xtime.year, &xtime.mon,
++ &xtime.day, &xtime.hour, &xtime.min, &xtime.sec);
++
++ /* convert to YY */
++ if (xtime.year > 2000)
++ xtime.year -= 2000;
++ else
++ xtime.year -= 1900;
++
++ snprintf((char*)date, 13, "%2d%2d%2d%2d%2d%2d", xtime.year, xtime.mon, xtime.day,
++ xtime.hour, xtime.min, xtime.sec);
++
++ /* replace ' ' to '0' */
++ for (sp = date; *sp != '\0'; ++sp)
++ if (*sp == '\x20')
++ *sp = '\x30';
++
++ date[12] = 'Z';
++
++ if ((ret = asn1_add_obj(date, 13, ASN1_UTC_TIME, node)) != 0)
++ return ret;
++
++ return 0;
++}
++
++/*
++ * serialize an rsa key into DER
++ */
++
++int x509write_serialize_key(rsa_context *rsa, x509_node *node)
++{
++ int ret = 0;
++ x509write_init_node(node);
++
++ /* vers, n, e, d, p, q, dp, dq, pq */
++ if ((ret = asn1_add_int(rsa->ver, node)) != 0)
++ return ret;
++ if ((ret = asn1_add_mpi(&rsa->N, ASN1_INTEGER, node)) != 0)
++ return ret;
++ if ((ret = asn1_add_mpi(&rsa->E, ASN1_INTEGER, node)) != 0)
++ return ret;
++ if ((ret = asn1_add_mpi(&rsa->D, ASN1_INTEGER, node)) != 0)
++ return ret;
++ if ((ret = asn1_add_mpi(&rsa->P, ASN1_INTEGER, node)) != 0)
++ return ret;
++ if ((ret = asn1_add_mpi(&rsa->Q, ASN1_INTEGER, node)) != 0)
++ return ret;
++ if ((ret = asn1_add_mpi(&rsa->DP, ASN1_INTEGER, node)) != 0)
++ return ret;
++ if ((ret = asn1_add_mpi(&rsa->DQ, ASN1_INTEGER, node)) != 0)
++ return ret;
++ if ((ret = asn1_add_mpi(&rsa->QP, ASN1_INTEGER, node)) != 0)
++ return ret;
++ if ((ret = asn1_append_tag(node, ASN1_CONSTRUCTED | ASN1_SEQUENCE)) != 0)
++ return ret;
++
++ return 0;
++}
++
++/*
++ * write a der/pem encoded rsa private key into a file
++ */
++int x509write_keyfile(rsa_context *rsa, char *path, int out_flag)
++{
++ int ret = 0;
++ const char key_beg[] = "-----BEGIN RSA PRIVATE KEY-----\n",
++ key_end[] = "-----END RSA PRIVATE KEY-----\n";
++ x509_node node;
++
++ x509write_init_node(&node);
++ if ((ret = x509write_serialize_key(rsa,&node)) != 0) {
++ x509write_free_node(&node);
++ return ret;
++ }
++
++ ret = x509write_file(&node,path,out_flag,key_beg,key_end);
++ x509write_free_node(&node);
++
++ return ret;
++}
++
++
++/*
++ * reasize the memory for node
++ */
++static int x509write_realloc_node(x509_node *node, size_t larger)
++{
++ /* init len */
++ if (node->data == NULL) {
++ node->len = 0;
++ node->data = malloc(larger);
++ if(node->data == NULL)
++ return 1;
++ } else {
++ /* realloc memory */
++ if ((node->data = realloc(node->data, node->len + larger)) == NULL)
++ return 1;
++ }
++
++ /* init pointer */
++ node->p = &node->data[node->len];
++ node->len += larger;
++ node->end = &node->data[node->len -1];
++
++ return 0;
++}
++
++/*
++ * init node
++ */
++void x509write_init_node(x509_node *node)
++{
++ memset(node, 0, sizeof(x509_node));
++}
++
++/*
++ * clean memory
++ */
++void x509write_free_node(x509_node *node)
++{
++ if (node->data != NULL)
++ free(node->data);
++ node->p = NULL;
++ node->end = NULL;
++ node->len = 0;
++}
++
++/*
++ * write a x509 certificate into file
++ */
++int x509write_crtfile(x509_raw *chain, unsigned char *path, int out_flag)
++{
++ const char cer_beg[] = "-----BEGIN CERTIFICATE-----\n",
++ cer_end[] = "-----END CERTIFICATE-----\n";
++
++ return x509write_file(&chain->raw, (char*)path, out_flag, cer_beg, cer_end);
++}
++
++/*
++ * write a x509 certificate into file
++ */
++int x509write_csrfile(x509_raw *chain, unsigned char *path, int out_flag)
++{
++ const char cer_beg[] = "-----BEGIN CERTIFICATE REQUEST-----\n",
++ cer_end[] = "-----END CERTIFICATE REQUEST-----\n";
++
++ return x509write_file(&chain->raw, (char*)path, out_flag, cer_beg, cer_end);
++}
++
++/*
++ * write an x509 file
++ */
++static int x509write_file(x509_node *node, char *path, int format,
++ const char* pem_prolog, const char* pem_epilog)
++{
++ FILE *ofstream;
++ int is_err = 1/*, buf_len, i, n*/;
++ /* char* base_buf; */
++
++ if ((ofstream = fopen(path, "wb")) == NULL)
++ return 1;
++
++ switch (format) {
++ case X509_OUTPUT_DER:
++ if (fwrite(node->data, 1, node->len, ofstream)
++ != node->len)
++ is_err = -1;
++ break;
++/*
++ case X509_OUTPUT_PEM:
++ if (fprintf(ofstream,pem_prolog)<0) {
++ is_err = -1;
++ break;
++ }
++
++ buf_len = node->len << 1;
++ base_buf = (char*) malloc((size_t)buf_len);
++ memset(base_buf,0,buf_len);
++ if (base64_encode(base_buf, &buf_len, node->data,
++ (int) node->len) != 0) {
++ is_err = -1;
++ break;
++ }
++
++ n=strlen(base_buf);
++ for(i=0;i<n;i+=64) {
++ fprintf(ofstream,"%.64s\n",&base_buf[i]);
++ }
++
++ if (fprintf(ofstream, pem_epilog)<0) {
++ is_err = -1;
++ break;
++ }
++
++ free(base_buf); */
++ }
++
++ fclose(ofstream);
++
++ if (is_err == -1)
++ return 1;
++
++ return 0;
++}
++
++
++/*
++ * add the owner public key to x509 certificate
++ */
++int x509write_add_pubkey(x509_raw *chain, rsa_context *pubkey)
++{
++ x509_node n_tmp, n_tmp2, *node;
++ int ret;
++
++ node = &chain->subpubkey;
++
++ x509write_init_node(&n_tmp);
++ x509write_init_node(&n_tmp2);
++
++ /*
++ * RSAPublicKey ::= SEQUENCE {
++ * modulus INTEGER, -- n
++ * publicExponent INTEGER -- e
++ * }
++ */
++ if ((ret = asn1_add_mpi(&pubkey->N, ASN1_INTEGER, &n_tmp)) != 0) {
++ x509write_free_node(&n_tmp);
++ x509write_free_node(&n_tmp2);
++ return ret;
++ }
++ if ((ret = asn1_add_mpi(&pubkey->E, ASN1_INTEGER, &n_tmp)) != 0) {
++ x509write_free_node(&n_tmp);
++ x509write_free_node(&n_tmp2);
++ return ret;
++ }
++ if ((ret = asn1_append_tag(&n_tmp, ASN1_CONSTRUCTED | ASN1_SEQUENCE))
++ != 0) {
++ x509write_free_node(&n_tmp);
++ x509write_free_node(&n_tmp2);
++ return ret;
++ }
++
++ /*
++ * SubjectPublicKeyInfo ::= SEQUENCE {
++ * algorithm AlgorithmIdentifier,
++ * subjectPublicKey BIT STRING }
++ */
++ if ((ret = asn1_append_tag(&n_tmp, ASN1_BIT_STRING)) != 0) {
++ x509write_free_node(&n_tmp);
++ x509write_free_node(&n_tmp2);
++ return ret;
++ }
++ if ((ret = asn1_add_oid(&n_tmp2, (unsigned char*)OID_PKCS1_RSA, 9,
++ ASN1_CONSTRUCTED | ASN1_SEQUENCE, ASN1_NULL,
++ (unsigned char *)"", 0)) != 0) {
++ x509write_free_node(&n_tmp);
++ x509write_free_node(&n_tmp2);
++ return ret;
++ }
++
++ if ((ret = asn1_append_nodes(node, ASN1_CONSTRUCTED | ASN1_SEQUENCE, 2,
++ &n_tmp2, &n_tmp))) {
++ x509write_free_node(&n_tmp);
++ x509write_free_node(&n_tmp2);
++ return ret;
++ }
++
++ x509write_free_node(&n_tmp);
++ x509write_free_node(&n_tmp2);
++ return 0;
++}
++
++/*
++ * RelativeDistinguishedName ::=
++ * SET OF AttributeTypeAndValue
++ *
++ * AttributeTypeAndValue ::= SEQUENCE {
++ * type AttributeType,
++ * value AttributeValue }
++ */
++static int x509write_add_name(x509_node *node, unsigned char *oid,
++ unsigned int oid_len, unsigned char *value, int len, int value_tag)
++{
++ int ret;
++ x509_node n_tmp;
++
++ x509write_init_node(&n_tmp);
++
++ if ((ret = asn1_add_oid(&n_tmp, oid, oid_len,
++ ASN1_CONSTRUCTED | ASN1_SEQUENCE, value_tag,
++ value, len))) {
++ x509write_free_node(&n_tmp);
++ return ret;
++ }
++
++ if ((asn1_append_nodes(node, ASN1_CONSTRUCTED | ASN1_SET, 1, &n_tmp))
++ != 0) {
++ x509write_free_node(&n_tmp);
++ return ret;
++ }
++
++ x509write_free_node(&n_tmp);
++ return 0;
++}
++
++/*
++ * Parse the name string and add to node
++ */
++static int x509write_parse_names(x509_node *node, unsigned char *names)
++{
++ unsigned char *sp, *begin = NULL;
++ unsigned char oid[3] = OID_X520, tag[4], *tag_sp = tag;
++ unsigned char *C = NULL, *CN = NULL, *O = NULL, *OU = NULL,
++ *ST = NULL, *L = NULL, *R = NULL;
++ int C_len = 0, CN_len = 0, O_len = 0, OU_len = 0, ST_len = 0,
++ L_len = 0, R_len = 0;
++ int ret = 0, is_tag = 1, is_begin = -1, len = 0;
++
++
++ for (sp = names; ; ++sp) {
++
++ /* filter tag */
++ if (is_tag == 1) {
++
++ if (tag_sp == &tag[3])
++ return POLARSSL_ERR_X509_VALUE_TO_LENGTH;
++
++ /* is tag end? */
++ if (*sp == '=') {
++ is_tag = -1;
++ *tag_sp = '\0';
++ is_begin = 1;
++ /* set len 0 (reset) */
++ len = 0;
++ } else {
++ /* tag hasn't ' '! */
++ if (*sp != ' ') {
++ *tag_sp = *sp;
++ ++tag_sp;
++ }
++ }
++ /* filter value */
++ } else {
++
++ /* set pointer of value begin */
++ if (is_begin == 1) {
++ begin = sp;
++ is_begin = -1;
++ }
++
++ /* is value at end? */
++ if (*sp == ';' or *sp == '\0') {
++ is_tag = 1;
++
++ /* common name */
++ if (tag[0] == 'C' and tag[1] == 'N') {
++ CN = begin;
++ CN_len = len;
++
++ /* organization */
++ } else if (tag[0] == 'O' and tag[1] == '\0') {
++ O = begin;
++ O_len = len;
++
++ /* country */
++ } else if (tag[0] == 'C' and tag[1] == '\0') {
++ C = begin;
++ C_len = len;
++
++ /* organisation unit */
++ } else if (tag[0] == 'O' and tag[1] == 'U') {
++ OU = begin;
++ OU_len = len;
++
++ /* state */
++ } else if (tag[0] == 'S' and tag[1] == 'T') {
++ ST = begin;
++ ST_len = len;
++
++ /* locality */
++ } else if (tag[0] == 'L' and tag[1] == '\0') {
++ L = begin;
++ L_len = len;
++
++ /* email */
++ } else if (tag[0] == 'R' and tag[1] == '\0') {
++ R = begin;
++ R_len = len;
++ }
++
++ /* set tag poiner to begin */
++ tag_sp = tag;
++
++ /* is at end? */
++ if (*sp == '\0' or *(sp +1) == '\0')
++ break;
++ } else {
++ ++len;
++ }
++ }
++
++ /* make saver */
++ if (*sp == '\0')
++ break;
++ } /* end for */
++
++ /* country */
++ if (C != NULL) {
++ oid[2] = X520_COUNTRY;
++ if ((ret = x509write_add_name(node, oid, 3, C, C_len,
++ ASN1_PRINTABLE_STRING)) != 0)
++ return ret;
++ }
++
++ /* state */
++ if (ST != NULL) {
++ oid[2] = X520_STATE;
++ if ((ret = x509write_add_name(node, oid, 3, ST, ST_len,
++ ASN1_PRINTABLE_STRING)) != 0)
++ return ret;
++ }
++
++ /* locality */
++ if (L != NULL) {
++ oid[2] = X520_LOCALITY;
++ if ((ret = x509write_add_name(node, oid, 3, L, L_len,
++ ASN1_PRINTABLE_STRING)) != 0)
++ return ret;
++ }
++
++ /* organization */
++ if (O != NULL) {
++ oid[2] = X520_ORGANIZATION;
++ if ((ret = x509write_add_name(node, oid, 3, O, O_len,
++ ASN1_PRINTABLE_STRING)) != 0)
++ return ret;
++ }
++
++ /* organisation unit */
++ if (OU != NULL) {
++ oid[2] = X520_ORG_UNIT;
++ if ((ret = x509write_add_name(node, oid, 3, OU, OU_len,
++ ASN1_PRINTABLE_STRING)) != 0)
++ return ret;
++ }
++
++ /* common name */
++ if (CN != NULL) {
++ oid[2] = X520_COMMON_NAME;
++ if ((ret = x509write_add_name(node, oid, 3, CN, CN_len,
++ ASN1_PRINTABLE_STRING)) != 0)
++ return ret;
++ }
++
++ /* email */
++ if (R != NULL) {
++ if ((ret = x509write_add_name(node, (unsigned char*)OID_PKCS9_EMAIL,
++ 9, R, R_len, ASN1_IA5_STRING)) != 0)
++ return ret;
++ }
++
++ if ((asn1_append_tag(node, ASN1_CONSTRUCTED | ASN1_SEQUENCE)) != 0)
++ return ret;
++
++ return 0;
++}
++
++/*
++ * Copy raw data from orginal ca to node
++ */
++static int x509write_copy_from_raw(x509_node *node, x509_buf *raw)
++{
++ if (x509write_realloc_node(node, raw->len) != 0)
++ return 1;
++
++ memcpy(node->p, raw->p, (size_t)raw->len);
++ if ((node->p += raw->len -1) != node->end)
++ return POLARSSL_ERR_X509_POINT_ERROR;
++
++ return 0;
++}
++
++/*
++ * Add the issuer
++ */
++
++int x509write_add_issuer(x509_raw *crt, unsigned char *issuer)
++{
++ return x509write_parse_names(&crt->issuer, issuer);
++}
++
++/*
++ * Add the subject
++ */
++int x509write_add_subject(x509_raw *crt, unsigned char *subject)
++{
++ return x509write_parse_names(&crt->subject, subject);
++}
++
++/*
++ * Copy issuer line from another cert to issuer
++ */
++int x509write_copy_issuer(x509_raw *crt, x509_cert *from_crt)
++{
++ return x509write_copy_from_raw(&crt->issuer, &from_crt->issuer_raw);
++}
++
++/*
++ * Copy subject line from another cert
++ */
++int x509write_copy_subject(x509_raw *crt, x509_cert *from_crt)
++{
++ return x509write_copy_from_raw(&crt->subject, &from_crt->subject_raw);
++}
++
++/*
++ * Copy subject line form antoher cert into issuer
++ */
++int x509write_copy_issuer_form_subject(x509_raw *crt,
++ x509_cert *from_crt)
++{
++ return x509write_copy_from_raw(&crt->issuer, &from_crt->subject_raw);
++}
++
++/*
++ * Copy issuer line from another cert into subject
++ */
++int x509write_copy_subject_from_issuer(x509_raw *crt,
++ x509_cert * from_crt)
++{
++ return x509write_copy_from_raw(&crt->subject, &from_crt->issuer_raw);
++}
++
++/*
++ * Validity ::= SEQUENCE {
++ * notBefore Time,
++ * notAfter Time }
++ *
++ * Time ::= CHOICE {
++ * utcTime UTCTime,
++ * generalTime GeneralizedTime }
++ */
++/* TODO: No handle GeneralizedTime! */
++int x509write_add_validity(x509_raw *chain, unsigned char *befor,
++ unsigned char *after)
++{
++ int ret;
++
++ x509_node *node = &chain->validity;
++
++ /* notBefore */
++ if ((ret = asn1_add_date_utc(befor, node)) != 0)
++ return ret;
++
++ /* notAfter */
++ if ((ret = asn1_add_date_utc(after, node)) != 0)
++ return ret;
++
++ if ((ret = asn1_append_tag(node, ASN1_CONSTRUCTED | ASN1_SEQUENCE)) != 0)
++ return ret;
++
++ return 0;
++}
++
++/*
++ * make hash from tbs and sign that with private key
++ */
++static int x509write_make_sign(x509_raw *chain, rsa_context *privkey)
++{
++ int ret;
++ unsigned char hash[20], *sign;
++ size_t sign_len = (size_t) mpi_size(&privkey->N);
++
++ /* make hash */
++ sha1(chain->tbs.data, chain->tbs.len, hash);
++
++ /* create sign */
++ sign = (unsigned char *) malloc(sign_len);
++ if (sign == NULL)
++ return 1;
++
++ if ((ret = rsa_pkcs1_sign(privkey, RSA_PRIVATE, RSA_SHA1, 20, hash,
++ sign)) != 0)
++ return ret;
++
++ if ((ret = asn1_add_obj(sign, sign_len, ASN1_BIT_STRING,
++ &chain->sign)) != 0)
++ return ret;
++
++ /*
++ * AlgorithmIdentifier ::= SEQUENCE {
++ * algorithm OBJECT IDENTIFIER,
++ * parameters ANY DEFINED BY algorithm OPTIONAL }
++ */
++ return asn1_add_oid(&chain->signalg, (unsigned char*)OID_PKCS1_RSA_SHA, 9,
++ ASN1_CONSTRUCTED | ASN1_SEQUENCE, ASN1_NULL,
++ (unsigned char*)"", 0);
++}
++
++/*
++ * Create a self signed certificate
++ */
++int x509write_create_sign(x509_raw *chain, rsa_context *privkey)
++{
++ int ret, serial;
++
++ /*
++ * Version ::= INTEGER { v1(0), v2(1), v3(2) }
++ */
++ if ((ret = asn1_add_int(2, &chain->version)) != 0)
++ return ret;
++
++ if ((ret = asn1_append_tag(&chain->version, ASN1_CONTEXT_SPECIFIC |
++ ASN1_CONSTRUCTED)) != 0)
++ return ret;
++
++
++ /*
++ * CertificateSerialNumber ::= INTEGER
++ */
++ srand((unsigned int) time(NULL));
++ serial = rand();
++ if ((ret = asn1_add_int(serial, &chain->serial)) != 0)
++ return ret;
++
++ /*
++ * AlgorithmIdentifier ::= SEQUENCE {
++ * algorithm OBJECT IDENTIFIER,
++ * parameters ANY DEFINED BY algorithm OPTIONAL }
++ */
++ if ((ret = asn1_add_oid(&chain->tbs_signalg,
++ (unsigned char*)OID_PKCS1_RSA_SHA, 9, ASN1_CONSTRUCTED |
++ ASN1_SEQUENCE, ASN1_NULL, (unsigned char*)"", 0)) != 0)
++ return ret;
++
++ /*
++ * Create the tbs
++ */
++ if ((ret = asn1_append_nodes(&chain->tbs, ASN1_CONSTRUCTED |
++ ASN1_SEQUENCE, 7, &chain->version, &chain->serial,
++ &chain->tbs_signalg, &chain->issuer, &chain->validity,
++ &chain->subject, &chain->subpubkey)) != 0)
++ return ret;
++
++ /* make signing */
++ if ((ret = x509write_make_sign(chain, privkey)) != 0)
++ return ret;
++
++ /* finishing */
++ if ((ret = asn1_append_nodes(&chain->raw, ASN1_CONSTRUCTED |
++ ASN1_SEQUENCE, 3, &chain->tbs, &chain->signalg,
++ &chain->sign)) != 0)
++ return ret;
++
++ return 0;
++}
++
++int x509write_create_selfsign(x509_raw *chain, rsa_context *privkey)
++{
++ /*
++ * On self signed certificate are subject and issuer the same
++ */
++ x509write_free_node(&chain->issuer);
++ chain->issuer = chain->subject;
++ return x509write_create_sign(chain, privkey);
++}
++
++/*
++ * CertificationRequestInfo ::= SEQUENCE {
++ * version Version,
++ * subject Name,
++ * subjectPublicKeyInfo SubjectPublicKeyInfo,
++ * attributes [0] IMPLICIT Attributes }
++ *
++ * CertificationRequest ::= SEQUENCE {
++ * certificationRequestInfo CertificationRequestInfo,
++ * signatureAlgorithm SignatureAlgorithmIdentifier,
++ * signature Signature }
++ *
++ * It use chain.serail for attributes!
++ *
++ */
++int x509write_create_csr(x509_raw *chain, rsa_context *privkey)
++{
++ int ret;
++
++ /* version ::= INTEGER */
++ if ((ret = asn1_add_int(0, &chain->version)) != 0)
++ return ret;
++
++ /* write attributes */
++ if ((ret = asn1_add_obj((unsigned char*)"", 0, ASN1_CONTEXT_SPECIFIC |
++ ASN1_CONSTRUCTED, &chain->serial)) != 0)
++ return ret;
++
++ /* create CertificationRequestInfo */
++ if ((ret = asn1_append_nodes(&chain->tbs, ASN1_CONSTRUCTED |
++ ASN1_SEQUENCE, 4, &chain->version, &chain->subject,
++ &chain->subpubkey, &chain->serial)) != 0)
++ return ret;
++
++ /* make signing */
++ if ((ret = x509write_make_sign(chain, privkey)) != 0)
++ return ret;
++
++ /* finish */
++ if ((ret = asn1_append_nodes(&chain->raw, ASN1_CONSTRUCTED | ASN1_SEQUENCE,
++ 3, &chain->tbs, &chain->signalg, &chain->sign)) != 0)
++ return ret;
++
++ return ret;
++}
++
++/*
++ * Free memory
++ */
++void x509write_free_raw(x509_raw *chain)
++{
++ x509write_free_node(&chain->raw);
++ x509write_free_node(&chain->tbs);
++ x509write_free_node(&chain->version);
++ x509write_free_node(&chain->serial);
++ x509write_free_node(&chain->tbs_signalg);
++ x509write_free_node(&chain->issuer);
++ x509write_free_node(&chain->validity);
++ if (chain->subject.data != chain->issuer.data)
++ x509write_free_node(&chain->subject);
++ x509write_free_node(&chain->subpubkey);
++ x509write_free_node(&chain->signalg);
++ x509write_free_node(&chain->sign);
++}
++
++void x509write_init_raw(x509_raw *chain)
++{
++ memset((void *) chain, 0, sizeof(x509_raw));
++}
++
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/bignum.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/bignum.h
+new file mode 100644
+index 0000000..c667303
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/bignum.h
+@@ -0,0 +1,437 @@
++/**
++ * \file bignum.h
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#ifndef POLARSSL_BIGNUM_H
++#define POLARSSL_BIGNUM_H
++
++#include <stdio.h>
++
++#define POLARSSL_ERR_MPI_FILE_IO_ERROR -0x0002
++#define POLARSSL_ERR_MPI_BAD_INPUT_DATA -0x0004
++#define POLARSSL_ERR_MPI_INVALID_CHARACTER -0x0006
++#define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL -0x0008
++#define POLARSSL_ERR_MPI_NEGATIVE_VALUE -0x000A
++#define POLARSSL_ERR_MPI_DIVISION_BY_ZERO -0x000C
++#define POLARSSL_ERR_MPI_NOT_ACCEPTABLE -0x000E
++
++#define MPI_CHK(f) if( ( ret = f ) != 0 ) goto cleanup
++
++/*
++ * Define the base integer type, architecture-wise
++ */
++#if defined(POLARSSL_HAVE_INT8)
++typedef unsigned char t_int;
++typedef unsigned short t_dbl;
++#else
++#if defined(POLARSSL_HAVE_INT16)
++typedef unsigned short t_int;
++typedef unsigned long t_dbl;
++#else
++ typedef unsigned long t_int;
++ #if defined(_MSC_VER) && defined(_M_IX86)
++ typedef unsigned __int64 t_dbl;
++ #else
++ #if defined(__amd64__) || defined(__x86_64__) || \
++ defined(__ppc64__) || defined(__powerpc64__) || \
++ defined(__ia64__) || defined(__alpha__)
++ typedef unsigned int t_dbl __attribute__((mode(TI)));
++ #else
++ typedef unsigned long long t_dbl;
++ #endif
++ #endif
++#endif
++#endif
++
++/**
++ * \brief MPI structure
++ */
++typedef struct
++{
++ int s; /*!< integer sign */
++ int n; /*!< total # of limbs */
++ t_int *p; /*!< pointer to limbs */
++}
++mpi;
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/**
++ * \brief Initialize one or more mpi
++ */
++void mpi_init( mpi *X, ... );
++
++/**
++ * \brief Unallocate one or more mpi
++ */
++void mpi_free( mpi *X, ... );
++
++/**
++ * \brief Enlarge to the specified number of limbs
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_grow( mpi *X, int nblimbs );
++
++/**
++ * \brief Copy the contents of Y into X
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_copy( mpi *X, mpi *Y );
++
++/**
++ * \brief Swap the contents of X and Y
++ */
++void mpi_swap( mpi *X, mpi *Y );
++
++/**
++ * \brief Set value from integer
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_lset( mpi *X, int z );
++
++/**
++ * \brief Return the number of least significant bits
++ */
++int mpi_lsb( mpi *X );
++
++/**
++ * \brief Return the number of most significant bits
++ */
++int mpi_msb( mpi *X );
++
++/**
++ * \brief Return the total size in bytes
++ */
++int mpi_size( mpi *X );
++
++/**
++ * \brief Import from an ASCII string
++ *
++ * \param X destination mpi
++ * \param radix input numeric base
++ * \param s null-terminated string buffer
++ *
++ * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code
++ */
++int mpi_read_string( mpi *X, int radix, char *s );
++
++/**
++ * \brief Export into an ASCII string
++ *
++ * \param X source mpi
++ * \param radix output numeric base
++ * \param s string buffer
++ * \param slen string buffer size
++ *
++ * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code
++ *
++ * \note Call this function with *slen = 0 to obtain the
++ * minimum required buffer size in *slen.
++ */
++int mpi_write_string( mpi *X, int radix, char *s, int *slen );
++
++/**
++ * \brief Read X from an opened file
++ *
++ * \param X destination mpi
++ * \param radix input numeric base
++ * \param fin input file handle
++ *
++ * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code
++ */
++int mpi_read_file( mpi *X, int radix, FILE *fin );
++
++/**
++ * \brief Write X into an opened file, or stdout
++ *
++ * \param p prefix, can be NULL
++ * \param X source mpi
++ * \param radix output numeric base
++ * \param fout output file handle
++ *
++ * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code
++ *
++ * \note Set fout == NULL to print X on the console.
++ */
++int mpi_write_file( char *p, mpi *X, int radix, FILE *fout );
++
++/**
++ * \brief Import X from unsigned binary data, big endian
++ *
++ * \param X destination mpi
++ * \param buf input buffer
++ * \param buflen input buffer size
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_read_binary( mpi *X, unsigned char *buf, int buflen );
++
++/**
++ * \brief Export X into unsigned binary data, big endian
++ *
++ * \param X source mpi
++ * \param buf output buffer
++ * \param buflen output buffer size
++ *
++ * \return 0 if successful,
++ * POLARSSL_ERR_MPI_BUFFER_TOO_SMALL if buf isn't large enough
++ *
++ * \note Call this function with *buflen = 0 to obtain the
++ * minimum required buffer size in *buflen.
++ */
++int mpi_write_binary( mpi *X, unsigned char *buf, int buflen );
++
++/**
++ * \brief Left-shift: X <<= count
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_shift_l( mpi *X, int count );
++
++/**
++ * \brief Right-shift: X >>= count
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_shift_r( mpi *X, int count );
++
++/**
++ * \brief Compare unsigned values
++ *
++ * \return 1 if |X| is greater than |Y|,
++ * -1 if |X| is lesser than |Y| or
++ * 0 if |X| is equal to |Y|
++ */
++int mpi_cmp_abs( mpi *X, mpi *Y );
++
++/**
++ * \brief Compare signed values
++ *
++ * \return 1 if X is greater than Y,
++ * -1 if X is lesser than Y or
++ * 0 if X is equal to Y
++ */
++int mpi_cmp_mpi( mpi *X, mpi *Y );
++
++/**
++ * \brief Compare signed values
++ *
++ * \return 1 if X is greater than z,
++ * -1 if X is lesser than z or
++ * 0 if X is equal to z
++ */
++int mpi_cmp_int( mpi *X, int z );
++
++/**
++ * \brief Unsigned addition: X = |A| + |B|
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_add_abs( mpi *X, mpi *A, mpi *B );
++
++/**
++ * \brief Unsigned substraction: X = |A| - |B|
++ *
++ * \return 0 if successful,
++ * POLARSSL_ERR_MPI_NEGATIVE_VALUE if B is greater than A
++ */
++int mpi_sub_abs( mpi *X, mpi *A, mpi *B );
++
++/**
++ * \brief Signed addition: X = A + B
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_add_mpi( mpi *X, mpi *A, mpi *B );
++
++/**
++ * \brief Signed substraction: X = A - B
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_sub_mpi( mpi *X, mpi *A, mpi *B );
++
++/**
++ * \brief Signed addition: X = A + b
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_add_int( mpi *X, mpi *A, int b );
++
++/**
++ * \brief Signed substraction: X = A - b
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_sub_int( mpi *X, mpi *A, int b );
++
++/**
++ * \brief Baseline multiplication: X = A * B
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_mul_mpi( mpi *X, mpi *A, mpi *B );
++
++/**
++ * \brief Baseline multiplication: X = A * b
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_mul_int( mpi *X, mpi *A, t_int b );
++
++/**
++ * \brief Division by mpi: A = Q * B + R
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed,
++ * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if B == 0
++ *
++ * \note Either Q or R can be NULL.
++ */
++int mpi_div_mpi( mpi *Q, mpi *R, mpi *A, mpi *B );
++
++/**
++ * \brief Division by int: A = Q * b + R
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed,
++ * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0
++ *
++ * \note Either Q or R can be NULL.
++ */
++int mpi_div_int( mpi *Q, mpi *R, mpi *A, int b );
++
++/**
++ * \brief Modulo: R = A mod B
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed,
++ * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if B == 0
++ */
++int mpi_mod_mpi( mpi *R, mpi *A, mpi *B );
++
++/**
++ * \brief Modulo: r = A mod b
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed,
++ * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0
++ */
++int mpi_mod_int( t_int *r, mpi *A, int b );
++
++/**
++ * \brief Sliding-window exponentiation: X = A^E mod N
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed,
++ * POLARSSL_ERR_MPI_BAD_INPUT_DATA if N is negative or even
++ *
++ * \note _RR is used to avoid re-computing R*R mod N across
++ * multiple calls, which speeds up things a bit. It can
++ * be set to NULL if the extra performance is unneeded.
++ */
++int mpi_exp_mod( mpi *X, mpi *A, mpi *E, mpi *N, mpi *_RR );
++
++/**
++ * \brief Greatest common divisor: G = gcd(A, B)
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed
++ */
++int mpi_gcd( mpi *G, mpi *A, mpi *B );
++
++/**
++ * \brief Modular inverse: X = A^-1 mod N
++ *
++ * \return 0 if successful,
++ * 1 if memory allocation failed,
++ * POLARSSL_ERR_MPI_BAD_INPUT_DATA if N is negative or nil
++ * POLARSSL_ERR_MPI_NOT_ACCEPTABLE if A has no inverse mod N
++ */
++int mpi_inv_mod( mpi *X, mpi *A, mpi *N );
++
++/**
++ * \brief Miller-Rabin primality test
++ *
++ * \return 0 if successful (probably prime),
++ * 1 if memory allocation failed,
++ * POLARSSL_ERR_MPI_NOT_ACCEPTABLE if X is not prime
++ */
++int mpi_is_prime( mpi *X, int (*f_rng)(void *), void *p_rng );
++
++/**
++ * \brief Prime number generation
++ *
++ * \param X destination mpi
++ * \param nbits required size of X in bits
++ * \param dh_flag if 1, then (X-1)/2 will be prime too
++ * \param f_rng RNG function
++ * \param p_rng RNG parameter
++ *
++ * \return 0 if successful (probably prime),
++ * 1 if memory allocation failed,
++ * POLARSSL_ERR_MPI_BAD_INPUT_DATA if nbits is < 3
++ */
++int mpi_gen_prime( mpi *X, int nbits, int dh_flag,
++ int (*f_rng)(void *), void *p_rng );
++
++/**
++ * \brief Checkup routine
++ *
++ * \return 0 if successful, or 1 if the test failed
++ */
++int mpi_self_test( int verbose );
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* bignum.h */
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/bn_mul.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/bn_mul.h
+new file mode 100644
+index 0000000..f6d34da
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/bn_mul.h
+@@ -0,0 +1,731 @@
++/**
++ * \file bn_mul.h
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++/*
++ * Multiply source vector [s] with b, add result
++ * to destination vector [d] and set carry c.
++ *
++ * Currently supports:
++ *
++ * . IA-32 (386+) . AMD64 / EM64T
++ * . IA-32 (SSE2) . Motorola 68000
++ * . PowerPC, 32-bit . MicroBlaze
++ * . PowerPC, 64-bit . TriCore
++ * . SPARC v8 . ARM v3+
++ * . Alpha . MIPS32
++ * . C, longlong . C, generic
++ */
++#ifndef POLARSSL_BN_MUL_H
++#define POLARSSL_BN_MUL_H
++
++#include "polarssl/config.h"
++
++#if defined(POLARSSL_HAVE_ASM)
++
++#if defined(__GNUC__)
++#if defined(__i386__)
++
++#define MULADDC_INIT \
++ asm( "movl %%ebx, %0 " : "=m" (t)); \
++ asm( "movl %0, %%esi " :: "m" (s)); \
++ asm( "movl %0, %%edi " :: "m" (d)); \
++ asm( "movl %0, %%ecx " :: "m" (c)); \
++ asm( "movl %0, %%ebx " :: "m" (b));
++
++#define MULADDC_CORE \
++ asm( "lodsl " ); \
++ asm( "mull %ebx " ); \
++ asm( "addl %ecx, %eax " ); \
++ asm( "adcl $0, %edx " ); \
++ asm( "addl (%edi), %eax " ); \
++ asm( "adcl $0, %edx " ); \
++ asm( "movl %edx, %ecx " ); \
++ asm( "stosl " );
++
++#if defined(POLARSSL_HAVE_SSE2)
++
++#define MULADDC_HUIT \
++ asm( "movd %ecx, %mm1 " ); \
++ asm( "movd %ebx, %mm0 " ); \
++ asm( "movd (%edi), %mm3 " ); \
++ asm( "paddq %mm3, %mm1 " ); \
++ asm( "movd (%esi), %mm2 " ); \
++ asm( "pmuludq %mm0, %mm2 " ); \
++ asm( "movd 4(%esi), %mm4 " ); \
++ asm( "pmuludq %mm0, %mm4 " ); \
++ asm( "movd 8(%esi), %mm6 " ); \
++ asm( "pmuludq %mm0, %mm6 " ); \
++ asm( "movd 12(%esi), %mm7 " ); \
++ asm( "pmuludq %mm0, %mm7 " ); \
++ asm( "paddq %mm2, %mm1 " ); \
++ asm( "movd 4(%edi), %mm3 " ); \
++ asm( "paddq %mm4, %mm3 " ); \
++ asm( "movd 8(%edi), %mm5 " ); \
++ asm( "paddq %mm6, %mm5 " ); \
++ asm( "movd 12(%edi), %mm4 " ); \
++ asm( "paddq %mm4, %mm7 " ); \
++ asm( "movd %mm1, (%edi) " ); \
++ asm( "movd 16(%esi), %mm2 " ); \
++ asm( "pmuludq %mm0, %mm2 " ); \
++ asm( "psrlq $32, %mm1 " ); \
++ asm( "movd 20(%esi), %mm4 " ); \
++ asm( "pmuludq %mm0, %mm4 " ); \
++ asm( "paddq %mm3, %mm1 " ); \
++ asm( "movd 24(%esi), %mm6 " ); \
++ asm( "pmuludq %mm0, %mm6 " ); \
++ asm( "movd %mm1, 4(%edi) " ); \
++ asm( "psrlq $32, %mm1 " ); \
++ asm( "movd 28(%esi), %mm3 " ); \
++ asm( "pmuludq %mm0, %mm3 " ); \
++ asm( "paddq %mm5, %mm1 " ); \
++ asm( "movd 16(%edi), %mm5 " ); \
++ asm( "paddq %mm5, %mm2 " ); \
++ asm( "movd %mm1, 8(%edi) " ); \
++ asm( "psrlq $32, %mm1 " ); \
++ asm( "paddq %mm7, %mm1 " ); \
++ asm( "movd 20(%edi), %mm5 " ); \
++ asm( "paddq %mm5, %mm4 " ); \
++ asm( "movd %mm1, 12(%edi) " ); \
++ asm( "psrlq $32, %mm1 " ); \
++ asm( "paddq %mm2, %mm1 " ); \
++ asm( "movd 24(%edi), %mm5 " ); \
++ asm( "paddq %mm5, %mm6 " ); \
++ asm( "movd %mm1, 16(%edi) " ); \
++ asm( "psrlq $32, %mm1 " ); \
++ asm( "paddq %mm4, %mm1 " ); \
++ asm( "movd 28(%edi), %mm5 " ); \
++ asm( "paddq %mm5, %mm3 " ); \
++ asm( "movd %mm1, 20(%edi) " ); \
++ asm( "psrlq $32, %mm1 " ); \
++ asm( "paddq %mm6, %mm1 " ); \
++ asm( "movd %mm1, 24(%edi) " ); \
++ asm( "psrlq $32, %mm1 " ); \
++ asm( "paddq %mm3, %mm1 " ); \
++ asm( "movd %mm1, 28(%edi) " ); \
++ asm( "addl $32, %edi " ); \
++ asm( "addl $32, %esi " ); \
++ asm( "psrlq $32, %mm1 " ); \
++ asm( "movd %mm1, %ecx " );
++
++#define MULADDC_STOP \
++ asm( "emms " ); \
++ asm( "movl %0, %%ebx " :: "m" (t)); \
++ asm( "movl %%ecx, %0 " : "=m" (c)); \
++ asm( "movl %%edi, %0 " : "=m" (d)); \
++ asm( "movl %%esi, %0 " : "=m" (s) :: \
++ "eax", "ecx", "edx", "esi", "edi" );
++
++#else
++
++#define MULADDC_STOP \
++ asm( "movl %0, %%ebx " :: "m" (t)); \
++ asm( "movl %%ecx, %0 " : "=m" (c)); \
++ asm( "movl %%edi, %0 " : "=m" (d)); \
++ asm( "movl %%esi, %0 " : "=m" (s) :: \
++ "eax", "ecx", "edx", "esi", "edi" );
++
++#endif /* SSE2 */
++#endif /* i386 */
++
++#if defined(__amd64__) || defined (__x86_64__)
++
++#define MULADDC_INIT \
++ asm( "movq %0, %%rsi " :: "m" (s)); \
++ asm( "movq %0, %%rdi " :: "m" (d)); \
++ asm( "movq %0, %%rcx " :: "m" (c)); \
++ asm( "movq %0, %%rbx " :: "m" (b)); \
++ asm( "xorq %r8, %r8 " );
++
++#define MULADDC_CORE \
++ asm( "movq (%rsi),%rax " ); \
++ asm( "mulq %rbx " ); \
++ asm( "addq $8, %rsi " ); \
++ asm( "addq %rcx, %rax " ); \
++ asm( "movq %r8, %rcx " ); \
++ asm( "adcq $0, %rdx " ); \
++ asm( "nop " ); \
++ asm( "addq %rax, (%rdi) " ); \
++ asm( "adcq %rdx, %rcx " ); \
++ asm( "addq $8, %rdi " );
++
++#define MULADDC_STOP \
++ asm( "movq %%rcx, %0 " : "=m" (c)); \
++ asm( "movq %%rdi, %0 " : "=m" (d)); \
++ asm( "movq %%rsi, %0 " : "=m" (s) :: \
++ "rax", "rcx", "rdx", "rbx", "rsi", "rdi", "r8" );
++
++#endif /* AMD64 */
++
++#if defined(__mc68020__) || defined(__mcpu32__)
++
++#define MULADDC_INIT \
++ asm( "movl %0, %%a2 " :: "m" (s)); \
++ asm( "movl %0, %%a3 " :: "m" (d)); \
++ asm( "movl %0, %%d3 " :: "m" (c)); \
++ asm( "movl %0, %%d2 " :: "m" (b)); \
++ asm( "moveq #0, %d0 " );
++
++#define MULADDC_CORE \
++ asm( "movel %a2@+, %d1 " ); \
++ asm( "mulul %d2, %d4:%d1 " ); \
++ asm( "addl %d3, %d1 " ); \
++ asm( "addxl %d0, %d4 " ); \
++ asm( "moveq #0, %d3 " ); \
++ asm( "addl %d1, %a3@+ " ); \
++ asm( "addxl %d4, %d3 " );
++
++#define MULADDC_STOP \
++ asm( "movl %%d3, %0 " : "=m" (c)); \
++ asm( "movl %%a3, %0 " : "=m" (d)); \
++ asm( "movl %%a2, %0 " : "=m" (s) :: \
++ "d0", "d1", "d2", "d3", "d4", "a2", "a3" );
++
++#define MULADDC_HUIT \
++ asm( "movel %a2@+, %d1 " ); \
++ asm( "mulul %d2, %d4:%d1 " ); \
++ asm( "addxl %d3, %d1 " ); \
++ asm( "addxl %d0, %d4 " ); \
++ asm( "addl %d1, %a3@+ " ); \
++ asm( "movel %a2@+, %d1 " ); \
++ asm( "mulul %d2, %d3:%d1 " ); \
++ asm( "addxl %d4, %d1 " ); \
++ asm( "addxl %d0, %d3 " ); \
++ asm( "addl %d1, %a3@+ " ); \
++ asm( "movel %a2@+, %d1 " ); \
++ asm( "mulul %d2, %d4:%d1 " ); \
++ asm( "addxl %d3, %d1 " ); \
++ asm( "addxl %d0, %d4 " ); \
++ asm( "addl %d1, %a3@+ " ); \
++ asm( "movel %a2@+, %d1 " ); \
++ asm( "mulul %d2, %d3:%d1 " ); \
++ asm( "addxl %d4, %d1 " ); \
++ asm( "addxl %d0, %d3 " ); \
++ asm( "addl %d1, %a3@+ " ); \
++ asm( "movel %a2@+, %d1 " ); \
++ asm( "mulul %d2, %d4:%d1 " ); \
++ asm( "addxl %d3, %d1 " ); \
++ asm( "addxl %d0, %d4 " ); \
++ asm( "addl %d1, %a3@+ " ); \
++ asm( "movel %a2@+, %d1 " ); \
++ asm( "mulul %d2, %d3:%d1 " ); \
++ asm( "addxl %d4, %d1 " ); \
++ asm( "addxl %d0, %d3 " ); \
++ asm( "addl %d1, %a3@+ " ); \
++ asm( "movel %a2@+, %d1 " ); \
++ asm( "mulul %d2, %d4:%d1 " ); \
++ asm( "addxl %d3, %d1 " ); \
++ asm( "addxl %d0, %d4 " ); \
++ asm( "addl %d1, %a3@+ " ); \
++ asm( "movel %a2@+, %d1 " ); \
++ asm( "mulul %d2, %d3:%d1 " ); \
++ asm( "addxl %d4, %d1 " ); \
++ asm( "addxl %d0, %d3 " ); \
++ asm( "addl %d1, %a3@+ " ); \
++ asm( "addxl %d0, %d3 " );
++
++#endif /* MC68000 */
++
++#if defined(__powerpc__) || defined(__ppc__)
++#if defined(__powerpc64__) || defined(__ppc64__)
++
++#if defined(__MACH__) && defined(__APPLE__)
++
++#define MULADDC_INIT \
++ asm( "ld r3, %0 " :: "m" (s)); \
++ asm( "ld r4, %0 " :: "m" (d)); \
++ asm( "ld r5, %0 " :: "m" (c)); \
++ asm( "ld r6, %0 " :: "m" (b)); \
++ asm( "addi r3, r3, -8 " ); \
++ asm( "addi r4, r4, -8 " ); \
++ asm( "addic r5, r5, 0 " );
++
++#define MULADDC_CORE \
++ asm( "ldu r7, 8(r3) " ); \
++ asm( "mulld r8, r7, r6 " ); \
++ asm( "mulhdu r9, r7, r6 " ); \
++ asm( "adde r8, r8, r5 " ); \
++ asm( "ld r7, 8(r4) " ); \
++ asm( "addze r5, r9 " ); \
++ asm( "addc r8, r8, r7 " ); \
++ asm( "stdu r8, 8(r4) " );
++
++#define MULADDC_STOP \
++ asm( "addze r5, r5 " ); \
++ asm( "addi r4, r4, 8 " ); \
++ asm( "addi r3, r3, 8 " ); \
++ asm( "std r5, %0 " : "=m" (c)); \
++ asm( "std r4, %0 " : "=m" (d)); \
++ asm( "std r3, %0 " : "=m" (s) :: \
++ "r3", "r4", "r5", "r6", "r7", "r8", "r9" );
++
++#else
++
++#define MULADDC_INIT \
++ asm( "ld %%r3, %0 " :: "m" (s)); \
++ asm( "ld %%r4, %0 " :: "m" (d)); \
++ asm( "ld %%r5, %0 " :: "m" (c)); \
++ asm( "ld %%r6, %0 " :: "m" (b)); \
++ asm( "addi %r3, %r3, -8 " ); \
++ asm( "addi %r4, %r4, -8 " ); \
++ asm( "addic %r5, %r5, 0 " );
++
++#define MULADDC_CORE \
++ asm( "ldu %r7, 8(%r3) " ); \
++ asm( "mulld %r8, %r7, %r6 " ); \
++ asm( "mulhdu %r9, %r7, %r6 " ); \
++ asm( "adde %r8, %r8, %r5 " ); \
++ asm( "ld %r7, 8(%r4) " ); \
++ asm( "addze %r5, %r9 " ); \
++ asm( "addc %r8, %r8, %r7 " ); \
++ asm( "stdu %r8, 8(%r4) " );
++
++#define MULADDC_STOP \
++ asm( "addze %r5, %r5 " ); \
++ asm( "addi %r4, %r4, 8 " ); \
++ asm( "addi %r3, %r3, 8 " ); \
++ asm( "std %%r5, %0 " : "=m" (c)); \
++ asm( "std %%r4, %0 " : "=m" (d)); \
++ asm( "std %%r3, %0 " : "=m" (s) :: \
++ "r3", "r4", "r5", "r6", "r7", "r8", "r9" );
++
++#endif
++
++#else /* PPC32 */
++
++#if defined(__MACH__) && defined(__APPLE__)
++
++#define MULADDC_INIT \
++ asm( "lwz r3, %0 " :: "m" (s)); \
++ asm( "lwz r4, %0 " :: "m" (d)); \
++ asm( "lwz r5, %0 " :: "m" (c)); \
++ asm( "lwz r6, %0 " :: "m" (b)); \
++ asm( "addi r3, r3, -4 " ); \
++ asm( "addi r4, r4, -4 " ); \
++ asm( "addic r5, r5, 0 " );
++
++#define MULADDC_CORE \
++ asm( "lwzu r7, 4(r3) " ); \
++ asm( "mullw r8, r7, r6 " ); \
++ asm( "mulhwu r9, r7, r6 " ); \
++ asm( "adde r8, r8, r5 " ); \
++ asm( "lwz r7, 4(r4) " ); \
++ asm( "addze r5, r9 " ); \
++ asm( "addc r8, r8, r7 " ); \
++ asm( "stwu r8, 4(r4) " );
++
++#define MULADDC_STOP \
++ asm( "addze r5, r5 " ); \
++ asm( "addi r4, r4, 4 " ); \
++ asm( "addi r3, r3, 4 " ); \
++ asm( "stw r5, %0 " : "=m" (c)); \
++ asm( "stw r4, %0 " : "=m" (d)); \
++ asm( "stw r3, %0 " : "=m" (s) :: \
++ "r3", "r4", "r5", "r6", "r7", "r8", "r9" );
++
++#else
++
++#define MULADDC_INIT \
++ asm( "lwz %%r3, %0 " :: "m" (s)); \
++ asm( "lwz %%r4, %0 " :: "m" (d)); \
++ asm( "lwz %%r5, %0 " :: "m" (c)); \
++ asm( "lwz %%r6, %0 " :: "m" (b)); \
++ asm( "addi %r3, %r3, -4 " ); \
++ asm( "addi %r4, %r4, -4 " ); \
++ asm( "addic %r5, %r5, 0 " );
++
++#define MULADDC_CORE \
++ asm( "lwzu %r7, 4(%r3) " ); \
++ asm( "mullw %r8, %r7, %r6 " ); \
++ asm( "mulhwu %r9, %r7, %r6 " ); \
++ asm( "adde %r8, %r8, %r5 " ); \
++ asm( "lwz %r7, 4(%r4) " ); \
++ asm( "addze %r5, %r9 " ); \
++ asm( "addc %r8, %r8, %r7 " ); \
++ asm( "stwu %r8, 4(%r4) " );
++
++#define MULADDC_STOP \
++ asm( "addze %r5, %r5 " ); \
++ asm( "addi %r4, %r4, 4 " ); \
++ asm( "addi %r3, %r3, 4 " ); \
++ asm( "stw %%r5, %0 " : "=m" (c)); \
++ asm( "stw %%r4, %0 " : "=m" (d)); \
++ asm( "stw %%r3, %0 " : "=m" (s) :: \
++ "r3", "r4", "r5", "r6", "r7", "r8", "r9" );
++
++#endif
++
++#endif /* PPC32 */
++#endif /* PPC64 */
++
++#if defined(__sparc__)
++
++#define MULADDC_INIT \
++ asm( "ld %0, %%o0 " :: "m" (s)); \
++ asm( "ld %0, %%o1 " :: "m" (d)); \
++ asm( "ld %0, %%o2 " :: "m" (c)); \
++ asm( "ld %0, %%o3 " :: "m" (b));
++
++#define MULADDC_CORE \
++ asm( "ld [%o0], %o4 " ); \
++ asm( "inc 4, %o0 " ); \
++ asm( "ld [%o1], %o5 " ); \
++ asm( "umul %o3, %o4, %o4 " ); \
++ asm( "addcc %o4, %o2, %o4 " ); \
++ asm( "rd %y, %g1 " ); \
++ asm( "addx %g1, 0, %g1 " ); \
++ asm( "addcc %o4, %o5, %o4 " ); \
++ asm( "st %o4, [%o1] " ); \
++ asm( "addx %g1, 0, %o2 " ); \
++ asm( "inc 4, %o1 " );
++
++#define MULADDC_STOP \
++ asm( "st %%o2, %0 " : "=m" (c)); \
++ asm( "st %%o1, %0 " : "=m" (d)); \
++ asm( "st %%o0, %0 " : "=m" (s) :: \
++ "g1", "o0", "o1", "o2", "o3", "o4", "o5" );
++
++#endif /* SPARCv8 */
++
++#if defined(__microblaze__) || defined(microblaze)
++
++#define MULADDC_INIT \
++ asm( "lwi r3, %0 " :: "m" (s)); \
++ asm( "lwi r4, %0 " :: "m" (d)); \
++ asm( "lwi r5, %0 " :: "m" (c)); \
++ asm( "lwi r6, %0 " :: "m" (b)); \
++ asm( "andi r7, r6, 0xffff" ); \
++ asm( "bsrli r6, r6, 16 " );
++
++#define MULADDC_CORE \
++ asm( "lhui r8, r3, 0 " ); \
++ asm( "addi r3, r3, 2 " ); \
++ asm( "lhui r9, r3, 0 " ); \
++ asm( "addi r3, r3, 2 " ); \
++ asm( "mul r10, r9, r6 " ); \
++ asm( "mul r11, r8, r7 " ); \
++ asm( "mul r12, r9, r7 " ); \
++ asm( "mul r13, r8, r6 " ); \
++ asm( "bsrli r8, r10, 16 " ); \
++ asm( "bsrli r9, r11, 16 " ); \
++ asm( "add r13, r13, r8 " ); \
++ asm( "add r13, r13, r9 " ); \
++ asm( "bslli r10, r10, 16 " ); \
++ asm( "bslli r11, r11, 16 " ); \
++ asm( "add r12, r12, r10 " ); \
++ asm( "addc r13, r13, r0 " ); \
++ asm( "add r12, r12, r11 " ); \
++ asm( "addc r13, r13, r0 " ); \
++ asm( "lwi r10, r4, 0 " ); \
++ asm( "add r12, r12, r10 " ); \
++ asm( "addc r13, r13, r0 " ); \
++ asm( "add r12, r12, r5 " ); \
++ asm( "addc r5, r13, r0 " ); \
++ asm( "swi r12, r4, 0 " ); \
++ asm( "addi r4, r4, 4 " );
++
++#define MULADDC_STOP \
++ asm( "swi r5, %0 " : "=m" (c)); \
++ asm( "swi r4, %0 " : "=m" (d)); \
++ asm( "swi r3, %0 " : "=m" (s) :: \
++ "r3", "r4" , "r5" , "r6" , "r7" , "r8" , \
++ "r9", "r10", "r11", "r12", "r13" );
++
++#endif /* MicroBlaze */
++
++#if defined(__tricore__)
++
++#define MULADDC_INIT \
++ asm( "ld.a %%a2, %0 " :: "m" (s)); \
++ asm( "ld.a %%a3, %0 " :: "m" (d)); \
++ asm( "ld.w %%d4, %0 " :: "m" (c)); \
++ asm( "ld.w %%d1, %0 " :: "m" (b)); \
++ asm( "xor %d5, %d5 " );
++
++#define MULADDC_CORE \
++ asm( "ld.w %d0, [%a2+] " ); \
++ asm( "madd.u %e2, %e4, %d0, %d1 " ); \
++ asm( "ld.w %d0, [%a3] " ); \
++ asm( "addx %d2, %d2, %d0 " ); \
++ asm( "addc %d3, %d3, 0 " ); \
++ asm( "mov %d4, %d3 " ); \
++ asm( "st.w [%a3+], %d2 " );
++
++#define MULADDC_STOP \
++ asm( "st.w %0, %%d4 " : "=m" (c)); \
++ asm( "st.a %0, %%a3 " : "=m" (d)); \
++ asm( "st.a %0, %%a2 " : "=m" (s) :: \
++ "d0", "d1", "e2", "d4", "a2", "a3" );
++
++#endif /* TriCore */
++
++#if defined(__arm__)
++
++#define MULADDC_INIT \
++ asm( "ldr r0, %0 " :: "m" (s)); \
++ asm( "ldr r1, %0 " :: "m" (d)); \
++ asm( "ldr r2, %0 " :: "m" (c)); \
++ asm( "ldr r3, %0 " :: "m" (b));
++
++#define MULADDC_CORE \
++ asm( "ldr r4, [r0], #4 " ); \
++ asm( "mov r5, #0 " ); \
++ asm( "ldr r6, [r1] " ); \
++ asm( "umlal r2, r5, r3, r4 " ); \
++ asm( "adds r7, r6, r2 " ); \
++ asm( "adc r2, r5, #0 " ); \
++ asm( "str r7, [r1], #4 " );
++
++#define MULADDC_STOP \
++ asm( "str r2, %0 " : "=m" (c)); \
++ asm( "str r1, %0 " : "=m" (d)); \
++ asm( "str r0, %0 " : "=m" (s) :: \
++ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7" );
++
++#endif /* ARMv3 */
++
++#if defined(__alpha__)
++
++#define MULADDC_INIT \
++ asm( "ldq $1, %0 " :: "m" (s)); \
++ asm( "ldq $2, %0 " :: "m" (d)); \
++ asm( "ldq $3, %0 " :: "m" (c)); \
++ asm( "ldq $4, %0 " :: "m" (b));
++
++#define MULADDC_CORE \
++ asm( "ldq $6, 0($1) " ); \
++ asm( "addq $1, 8, $1 " ); \
++ asm( "mulq $6, $4, $7 " ); \
++ asm( "umulh $6, $4, $6 " ); \
++ asm( "addq $7, $3, $7 " ); \
++ asm( "cmpult $7, $3, $3 " ); \
++ asm( "ldq $5, 0($2) " ); \
++ asm( "addq $7, $5, $7 " ); \
++ asm( "cmpult $7, $5, $5 " ); \
++ asm( "stq $7, 0($2) " ); \
++ asm( "addq $2, 8, $2 " ); \
++ asm( "addq $6, $3, $3 " ); \
++ asm( "addq $5, $3, $3 " );
++
++#define MULADDC_STOP \
++ asm( "stq $3, %0 " : "=m" (c)); \
++ asm( "stq $2, %0 " : "=m" (d)); \
++ asm( "stq $1, %0 " : "=m" (s) :: \
++ "$1", "$2", "$3", "$4", "$5", "$6", "$7" );
++
++#endif /* Alpha */
++
++#if defined(__mips__)
++
++#define MULADDC_INIT \
++ asm( "lw $10, %0 " :: "m" (s)); \
++ asm( "lw $11, %0 " :: "m" (d)); \
++ asm( "lw $12, %0 " :: "m" (c)); \
++ asm( "lw $13, %0 " :: "m" (b));
++
++#define MULADDC_CORE \
++ asm( "lw $14, 0($10) " ); \
++ asm( "multu $13, $14 " ); \
++ asm( "addi $10, $10, 4 " ); \
++ asm( "mflo $14 " ); \
++ asm( "mfhi $9 " ); \
++ asm( "addu $14, $12, $14 " ); \
++ asm( "lw $15, 0($11) " ); \
++ asm( "sltu $12, $14, $12 " ); \
++ asm( "addu $15, $14, $15 " ); \
++ asm( "sltu $14, $15, $14 " ); \
++ asm( "addu $12, $12, $9 " ); \
++ asm( "sw $15, 0($11) " ); \
++ asm( "addu $12, $12, $14 " ); \
++ asm( "addi $11, $11, 4 " );
++
++#define MULADDC_STOP \
++ asm( "sw $12, %0 " : "=m" (c)); \
++ asm( "sw $11, %0 " : "=m" (d)); \
++ asm( "sw $10, %0 " : "=m" (s) :: \
++ "$9", "$10", "$11", "$12", "$13", "$14", "$15" );
++
++#endif /* MIPS */
++#endif /* GNUC */
++
++#if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
++
++#define MULADDC_INIT \
++ __asm mov esi, s \
++ __asm mov edi, d \
++ __asm mov ecx, c \
++ __asm mov ebx, b
++
++#define MULADDC_CORE \
++ __asm lodsd \
++ __asm mul ebx \
++ __asm add eax, ecx \
++ __asm adc edx, 0 \
++ __asm add eax, [edi] \
++ __asm adc edx, 0 \
++ __asm mov ecx, edx \
++ __asm stosd
++
++#if defined(POLARSSL_HAVE_SSE2)
++
++#define EMIT __asm _emit
++
++#define MULADDC_HUIT \
++ EMIT 0x0F EMIT 0x6E EMIT 0xC9 \
++ EMIT 0x0F EMIT 0x6E EMIT 0xC3 \
++ EMIT 0x0F EMIT 0x6E EMIT 0x1F \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \
++ EMIT 0x0F EMIT 0x6E EMIT 0x16 \
++ EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \
++ EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x04 \
++ EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \
++ EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x08 \
++ EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \
++ EMIT 0x0F EMIT 0x6E EMIT 0x7E EMIT 0x0C \
++ EMIT 0x0F EMIT 0xF4 EMIT 0xF8 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xCA \
++ EMIT 0x0F EMIT 0x6E EMIT 0x5F EMIT 0x04 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xDC \
++ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x08 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xEE \
++ EMIT 0x0F EMIT 0x6E EMIT 0x67 EMIT 0x0C \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xFC \
++ EMIT 0x0F EMIT 0x7E EMIT 0x0F \
++ EMIT 0x0F EMIT 0x6E EMIT 0x56 EMIT 0x10 \
++ EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \
++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \
++ EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x14 \
++ EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \
++ EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x18 \
++ EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \
++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x04 \
++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \
++ EMIT 0x0F EMIT 0x6E EMIT 0x5E EMIT 0x1C \
++ EMIT 0x0F EMIT 0xF4 EMIT 0xD8 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xCD \
++ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x10 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xD5 \
++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x08 \
++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xCF \
++ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x14 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xE5 \
++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x0C \
++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xCA \
++ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x18 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xF5 \
++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x10 \
++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xCC \
++ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x1C \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xDD \
++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x14 \
++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xCE \
++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x18 \
++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \
++ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \
++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x1C \
++ EMIT 0x83 EMIT 0xC7 EMIT 0x20 \
++ EMIT 0x83 EMIT 0xC6 EMIT 0x20 \
++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \
++ EMIT 0x0F EMIT 0x7E EMIT 0xC9
++
++#define MULADDC_STOP \
++ EMIT 0x0F EMIT 0x77 \
++ __asm mov c, ecx \
++ __asm mov d, edi \
++ __asm mov s, esi \
++
++#else
++
++#define MULADDC_STOP \
++ __asm mov c, ecx \
++ __asm mov d, edi \
++ __asm mov s, esi \
++
++#endif /* SSE2 */
++#endif /* MSVC */
++
++#endif /* POLARSSL_HAVE_ASM */
++
++#if !defined(MULADDC_CORE)
++#if defined(POLARSSL_HAVE_LONGLONG)
++
++#define MULADDC_INIT \
++{ \
++ t_dbl r; \
++ t_int r0, r1;
++
++#define MULADDC_CORE \
++ r = *(s++) * (t_dbl) b; \
++ r0 = r; \
++ r1 = r >> biL; \
++ r0 += c; r1 += (r0 < c); \
++ r0 += *d; r1 += (r0 < *d); \
++ c = r1; *(d++) = r0;
++
++#define MULADDC_STOP \
++}
++
++#else
++#define MULADDC_INIT \
++{ \
++ t_int s0, s1, b0, b1; \
++ t_int r0, r1, rx, ry; \
++ b0 = ( b << biH ) >> biH; \
++ b1 = ( b >> biH );
++
++#define MULADDC_CORE \
++ s0 = ( *s << biH ) >> biH; \
++ s1 = ( *s >> biH ); s++; \
++ rx = s0 * b1; r0 = s0 * b0; \
++ ry = s1 * b0; r1 = s1 * b1; \
++ r1 += ( rx >> biH ); \
++ r1 += ( ry >> biH ); \
++ rx <<= biH; ry <<= biH; \
++ r0 += rx; r1 += (r0 < rx); \
++ r0 += ry; r1 += (r0 < ry); \
++ r0 += c; r1 += (r0 < c); \
++ r0 += *d; r1 += (r0 < *d); \
++ c = r1; *(d++) = r0;
++
++#define MULADDC_STOP \
++}
++
++#endif /* C (generic) */
++#endif /* C (longlong) */
++
++#endif /* bn_mul.h */
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/config.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/config.h
+new file mode 100644
+index 0000000..6463e52
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/config.h
+@@ -0,0 +1,329 @@
++/**
++ * \file config.h
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ * This set of compile-time options may be used to enable
++ * or disable features selectively, and reduce the global
++ * memory footprint.
++ */
++#ifndef POLARSSL_CONFIG_H
++#define POLARSSL_CONFIG_H
++
++#ifndef _CRT_SECURE_NO_DEPRECATE
++#define _CRT_SECURE_NO_DEPRECATE 1
++#endif
++
++/*
++ * Uncomment if native integers are 8-bit wide.
++ *
++#define POLARSSL_HAVE_INT8
++ */
++
++/*
++ * Uncomment if native integers are 16-bit wide.
++ *
++#define POLARSSL_HAVE_INT16
++ */
++
++/*
++ * Uncomment if the compiler supports long long.
++ */
++#define POLARSSL_HAVE_LONGLONG
++
++
++/*
++ * Uncomment to enable the use of assembly code.
++ */
++#define POLARSSL_HAVE_ASM
++
++/*
++ * Uncomment if the CPU supports SSE2 (IA-32 specific).
++ *
++#define POLARSSL_HAVE_SSE2
++ */
++
++/*
++ * Enable all SSL/TLS debugging messages.
++ */
++#define POLARSSL_DEBUG_MSG
++
++/*
++ * Enable the checkup functions (*_self_test).
++ */
++#define POLARSSL_SELF_TEST
++
++/*
++ * Enable the prime-number generation code.
++ */
++#define POLARSSL_GENPRIME
++
++/*
++ * Uncomment this macro to store the AES tables in ROM.
++ *
++#define POLARSSL_AES_ROM_TABLES
++ */
++
++/*
++ * Module: library/aes.c
++ * Caller: library/ssl_tls.c
++ *
++ * This module enables the following ciphersuites:
++ * SSL_RSA_AES_128_SHA
++ * SSL_RSA_AES_256_SHA
++ * SSL_EDH_RSA_AES_256_SHA
++ */
++#define POLARSSL_AES_C
++
++/*
++ * Module: library/arc4.c
++ * Caller: library/ssl_tls.c
++ *
++ * This module enables the following ciphersuites:
++ * SSL_RSA_RC4_128_MD5
++ * SSL_RSA_RC4_128_SHA
++ */
++#define POLARSSL_ARC4_C
++
++/*
++ * Module: library/base64.c
++ * Caller: library/x509parse.c
++ *
++ * This module is required for X.509 support.
++ */
++#define POLARSSL_BASE64_C
++
++/*
++ * Module: library/bignum.c
++ * Caller: library/dhm.c
++ * library/rsa.c
++ * library/ssl_tls.c
++ * library/x509parse.c
++ *
++ * This module is required for RSA and DHM support.
++ */
++#define POLARSSL_BIGNUM_C
++
++/*
++ * Module: library/camellia.c
++ * Caller:
++ *
++ * This module enabled the following cipher suites:
++ */
++#define POLARSSL_CAMELLIA_C
++
++/*
++ * Module: library/certs.c
++ * Caller:
++ *
++ * This module is used for testing (ssl_client/server).
++ */
++#define POLARSSL_CERTS_C
++
++/*
++ * Module: library/debug.c
++ * Caller: library/ssl_cli.c
++ * library/ssl_srv.c
++ * library/ssl_tls.c
++ *
++ * This module provides debugging functions.
++ */
++#define POLARSSL_DEBUG_C
++
++/*
++ * Module: library/des.c
++ * Caller: library/ssl_tls.c
++ *
++ * This module enables the following ciphersuites:
++ * SSL_RSA_DES_168_SHA
++ * SSL_EDH_RSA_DES_168_SHA
++ */
++#define POLARSSL_DES_C
++
++/*
++ * Module: library/dhm.c
++ * Caller: library/ssl_cli.c
++ * library/ssl_srv.c
++ *
++ * This module enables the following ciphersuites:
++ * SSL_EDH_RSA_DES_168_SHA
++ * SSL_EDH_RSA_AES_256_SHA
++ */
++#define POLARSSL_DHM_C
++
++/*
++ * Module: library/havege.c
++ * Caller:
++ *
++ * This module enables the HAVEGE random number generator.
++ */
++#define POLARSSL_HAVEGE_C
++
++/*
++ * Module: library/md2.c
++ * Caller: library/x509parse.c
++ *
++ * Uncomment to enable support for (rare) MD2-signed X.509 certs.
++ *
++#define POLARSSL_MD2_C
++ */
++
++/*
++ * Module: library/md4.c
++ * Caller: library/x509parse.c
++ *
++ * Uncomment to enable support for (rare) MD4-signed X.509 certs.
++ *
++#define POLARSSL_MD4_C
++ */
++
++/*
++ * Module: library/md5.c
++ * Caller: library/ssl_tls.c
++ * library/x509parse.c
++ *
++ * This module is required for SSL/TLS and X.509.
++ */
++#define POLARSSL_MD5_C
++
++/*
++ * Module: library/net.c
++ * Caller:
++ *
++ * This module provides TCP/IP networking routines.
++ */
++#define POLARSSL_NET_C
++
++/*
++ * Module: library/padlock.c
++ * Caller: library/aes.c
++ *
++ * This modules adds support for the VIA PadLock on x86.
++ */
++#define POLARSSL_PADLOCK_C
++
++/*
++ * Module: library/rsa.c
++ * Caller: library/ssl_cli.c
++ * library/ssl_srv.c
++ * library/ssl_tls.c
++ * library/x509.c
++ *
++ * This module is required for SSL/TLS and MD5-signed certificates.
++ */
++#define POLARSSL_RSA_C
++
++/*
++ * Module: library/sha1.c
++ * Caller: library/ssl_cli.c
++ * library/ssl_srv.c
++ * library/ssl_tls.c
++ * library/x509parse.c
++ *
++ * This module is required for SSL/TLS and SHA1-signed certificates.
++ */
++#define POLARSSL_SHA1_C
++
++/*
++ * Module: library/sha2.c
++ * Caller:
++ *
++ * This module adds support for SHA-224 and SHA-256.
++ */
++#define POLARSSL_SHA2_C
++
++/*
++ * Module: library/sha4.c
++ * Caller:
++ *
++ * This module adds support for SHA-384 and SHA-512.
++ */
++#define POLARSSL_SHA4_C
++
++/*
++ * Module: library/ssl_cli.c
++ * Caller:
++ *
++ * This module is required for SSL/TLS client support.
++ */
++#define POLARSSL_SSL_CLI_C
++
++/*
++ * Module: library/ssl_srv.c
++ * Caller:
++ *
++ * This module is required for SSL/TLS server support.
++ */
++#define POLARSSL_SSL_SRV_C
++
++/*
++ * Module: library/ssl_tls.c
++ * Caller: library/ssl_cli.c
++ * library/ssl_srv.c
++ *
++ * This module is required for SSL/TLS.
++ */
++#define POLARSSL_SSL_TLS_C
++
++/*
++ * Module: library/timing.c
++ * Caller: library/havege.c
++ *
++ * This module is used by the HAVEGE random number generator.
++ */
++#define POLARSSL_TIMING_C
++
++/*
++ * Module: library/x509parse.c
++ * Caller: library/ssl_cli.c
++ * library/ssl_srv.c
++ * library/ssl_tls.c
++ *
++ * This module is required for X.509 certificate parsing.
++ */
++#define POLARSSL_X509_PARSE_C
++
++/*
++ * Module: library/x509_write.c
++ * Caller:
++ *
++ * This module is required for X.509 certificate writing.
++ */
++#define POLARSSL_X509_WRITE_C
++
++/*
++ * Module: library/xtea.c
++ * Caller:
++ */
++#define POLARSSL_XTEA_C
++
++#endif /* config.h */
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/havege.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/havege.h
+new file mode 100644
+index 0000000..c27ceca
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/havege.h
+@@ -0,0 +1,75 @@
++/**
++ * \file havege.h
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#ifndef POLARSSL_HAVEGE_H
++#define POLARSSL_HAVEGE_H
++
++#define COLLECT_SIZE 1024
++
++/**
++ * \brief HAVEGE state structure
++ */
++typedef struct
++{
++ int PT1, PT2, offset[2];
++ int pool[COLLECT_SIZE];
++ int WALK[8192];
++}
++havege_state;
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/**
++ * \brief HAVEGE initialization
++ *
++ * \param hs HAVEGE state to be initialized
++ */
++void havege_init( havege_state *hs );
++
++/**
++ * \brief HAVEGE rand function
++ *
++ * \param rng_st points to an HAVEGE state
++ *
++ * \return A random int
++ */
++int havege_rand( void *p_rng );
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* havege.h */
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/rsa.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/rsa.h
+new file mode 100644
+index 0000000..b31dc2f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/rsa.h
+@@ -0,0 +1,309 @@
++/**
++ * \file rsa.h
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#ifndef POLARSSL_RSA_H
++#define POLARSSL_RSA_H
++
++#include "polarssl/bignum.h"
++
++#define POLARSSL_ERR_RSA_BAD_INPUT_DATA -0x0400
++#define POLARSSL_ERR_RSA_INVALID_PADDING -0x0410
++#define POLARSSL_ERR_RSA_KEY_GEN_FAILED -0x0420
++#define POLARSSL_ERR_RSA_KEY_CHECK_FAILED -0x0430
++#define POLARSSL_ERR_RSA_PUBLIC_FAILED -0x0440
++#define POLARSSL_ERR_RSA_PRIVATE_FAILED -0x0450
++#define POLARSSL_ERR_RSA_VERIFY_FAILED -0x0460
++#define POLARSSL_ERR_RSA_OUTPUT_TO_LARGE -0x0470
++
++/*
++ * PKCS#1 constants
++ */
++#define RSA_RAW 0
++#define RSA_MD2 2
++#define RSA_MD4 3
++#define RSA_MD5 4
++#define RSA_SHA1 5
++#define RSA_SHA256 6
++
++#define RSA_PUBLIC 0
++#define RSA_PRIVATE 1
++
++#define RSA_PKCS_V15 0
++#define RSA_PKCS_V21 1
++
++#define RSA_SIGN 1
++#define RSA_CRYPT 2
++
++/*
++ * DigestInfo ::= SEQUENCE {
++ * digestAlgorithm DigestAlgorithmIdentifier,
++ * digest Digest }
++ *
++ * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
++ *
++ * Digest ::= OCTET STRING
++ */
++#define ASN1_HASH_MDX \
++ "\x30\x20\x30\x0C\x06\x08\x2A\x86\x48" \
++ "\x86\xF7\x0D\x02\x00\x05\x00\x04\x10"
++
++#define ASN1_HASH_SHA1 \
++ "\x30\x21\x30\x09\x06\x05\x2B\x0E\x03" \
++ "\x02\x1A\x05\x00\x04\x14"
++
++/**
++ * \brief RSA context structure
++ */
++typedef struct
++{
++ int ver; /*!< always 0 */
++ int len; /*!< size(N) in chars */
++
++ mpi N; /*!< public modulus */
++ mpi E; /*!< public exponent */
++
++ mpi D; /*!< private exponent */
++ mpi P; /*!< 1st prime factor */
++ mpi Q; /*!< 2nd prime factor */
++ mpi DP; /*!< D % (P - 1) */
++ mpi DQ; /*!< D % (Q - 1) */
++ mpi QP; /*!< 1 / (Q % P) */
++
++ mpi RN; /*!< cached R^2 mod N */
++ mpi RP; /*!< cached R^2 mod P */
++ mpi RQ; /*!< cached R^2 mod Q */
++
++ int padding; /*!< 1.5 or OAEP/PSS */
++ int hash_id; /*!< hash identifier */
++ int (*f_rng)(void *); /*!< RNG function */
++ void *p_rng; /*!< RNG parameter */
++}
++rsa_context;
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/**
++ * \brief Initialize an RSA context
++ *
++ * \param ctx RSA context to be initialized
++ * \param padding RSA_PKCS_V15 or RSA_PKCS_V21
++ * \param hash_id RSA_PKCS_V21 hash identifier
++ * \param f_rng RNG function
++ * \param p_rng RNG parameter
++ *
++ * \note The hash_id parameter is actually ignored
++ * when using RSA_PKCS_V15 padding.
++ *
++ * \note Currently (xyssl-0.8), RSA_PKCS_V21 padding
++ * is not supported.
++ */
++void rsa_init( rsa_context *ctx,
++ int padding,
++ int hash_id,
++ int (*f_rng)(void *),
++ void *p_rng );
++
++/**
++ * \brief Generate an RSA keypair
++ *
++ * \param ctx RSA context that will hold the key
++ * \param nbits size of the public key in bits
++ * \param exponent public exponent (e.g., 65537)
++ *
++ * \note rsa_init() must be called beforehand to setup
++ * the RSA context (especially f_rng and p_rng).
++ *
++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
++ */
++int rsa_gen_key( rsa_context *ctx, int nbits, int exponent );
++
++/**
++ * \brief Check a public RSA key
++ *
++ * \param ctx RSA context to be checked
++ *
++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
++ */
++int rsa_check_pubkey( rsa_context *ctx );
++
++/**
++ * \brief Check a private RSA key
++ *
++ * \param ctx RSA context to be checked
++ *
++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
++ */
++int rsa_check_privkey( rsa_context *ctx );
++
++/**
++ * \brief Do an RSA public key operation
++ *
++ * \param ctx RSA context
++ * \param input input buffer
++ * \param output output buffer
++ *
++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
++ *
++ * \note This function does NOT take care of message
++ * padding. Also, be sure to set input[0] = 0.
++ *
++ * \note The input and output buffers must be large
++ * enough (eg. 128 bytes if RSA-1024 is used).
++ */
++int rsa_public( rsa_context *ctx,
++ unsigned char *input,
++ unsigned char *output );
++
++/**
++ * \brief Do an RSA private key operation
++ *
++ * \param ctx RSA context
++ * \param input input buffer
++ * \param output output buffer
++ *
++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
++ *
++ * \note The input and output buffers must be large
++ * enough (eg. 128 bytes if RSA-1024 is used).
++ */
++int rsa_private( rsa_context *ctx,
++ unsigned char *input,
++ unsigned char *output );
++
++/**
++ * \brief Add the message padding, then do an RSA operation
++ *
++ * \param ctx RSA context
++ * \param mode RSA_PUBLIC or RSA_PRIVATE
++ * \param ilen contains the the plaintext length
++ * \param input buffer holding the data to be encrypted
++ * \param output buffer that will hold the ciphertext
++ *
++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
++ *
++ * \note The output buffer must be as large as the size
++ * of ctx->N (eg. 128 bytes if RSA-1024 is used).
++ */
++int rsa_pkcs1_encrypt( rsa_context *ctx,
++ int mode, int ilen,
++ unsigned char *input,
++ unsigned char *output );
++
++/**
++ * \brief Do an RSA operation, then remove the message padding
++ *
++ * \param ctx RSA context
++ * \param mode RSA_PUBLIC or RSA_PRIVATE
++ * \param input buffer holding the encrypted data
++ * \param output buffer that will hold the plaintext
++ * \param olen will contain the plaintext length
++ * \param output_max_len maximum length of the output buffer
++ *
++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
++ *
++ * \note The output buffer must be as large as the size
++ * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise
++ * an error is thrown.
++ */
++int rsa_pkcs1_decrypt( rsa_context *ctx,
++ int mode, int *olen,
++ unsigned char *input,
++ unsigned char *output,
++ int output_max_len);
++
++/**
++ * \brief Do a private RSA to sign a message digest
++ *
++ * \param ctx RSA context
++ * \param mode RSA_PUBLIC or RSA_PRIVATE
++ * \param hash_id RSA_RAW, RSA_MD{2,4,5} or RSA_SHA{1,256}
++ * \param hashlen message digest length (for RSA_RAW only)
++ * \param hash buffer holding the message digest
++ * \param sig buffer that will hold the ciphertext
++ *
++ * \return 0 if the signing operation was successful,
++ * or an POLARSSL_ERR_RSA_XXX error code
++ *
++ * \note The "sig" buffer must be as large as the size
++ * of ctx->N (eg. 128 bytes if RSA-1024 is used).
++ */
++int rsa_pkcs1_sign( rsa_context *ctx,
++ int mode,
++ int hash_id,
++ int hashlen,
++ unsigned char *hash,
++ unsigned char *sig );
++
++/**
++ * \brief Do a public RSA and check the message digest
++ *
++ * \param ctx points to an RSA public key
++ * \param mode RSA_PUBLIC or RSA_PRIVATE
++ * \param hash_id RSA_RAW, RSA_MD{2,4,5} or RSA_SHA{1,256}
++ * \param hashlen message digest length (for RSA_RAW only)
++ * \param hash buffer holding the message digest
++ * \param sig buffer holding the ciphertext
++ *
++ * \return 0 if the verify operation was successful,
++ * or an POLARSSL_ERR_RSA_XXX error code
++ *
++ * \note The "sig" buffer must be as large as the size
++ * of ctx->N (eg. 128 bytes if RSA-1024 is used).
++ */
++int rsa_pkcs1_verify( rsa_context *ctx,
++ int mode,
++ int hash_id,
++ int hashlen,
++ unsigned char *hash,
++ unsigned char *sig );
++
++/**
++ * \brief Free the components of an RSA key
++ */
++void rsa_free( rsa_context *ctx );
++
++/**
++ * \brief Checkup routine
++ *
++ * \return 0 if successful, or 1 if the test failed
++ */
++int rsa_self_test( int verbose );
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* rsa.h */
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/sha1.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/sha1.h
+new file mode 100644
+index 0000000..3ca7dc3
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/sha1.h
+@@ -0,0 +1,150 @@
++/**
++ * \file sha1.h
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#ifndef POLARSSL_SHA1_H
++#define POLARSSL_SHA1_H
++
++/**
++ * \brief SHA-1 context structure
++ */
++typedef struct
++{
++ unsigned long total[2]; /*!< number of bytes processed */
++ unsigned long state[5]; /*!< intermediate digest state */
++ unsigned char buffer[64]; /*!< data block being processed */
++
++ unsigned char ipad[64]; /*!< HMAC: inner padding */
++ unsigned char opad[64]; /*!< HMAC: outer padding */
++}
++sha1_context;
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/**
++ * \brief SHA-1 context setup
++ *
++ * \param ctx context to be initialized
++ */
++void sha1_starts( sha1_context *ctx );
++
++/**
++ * \brief SHA-1 process buffer
++ *
++ * \param ctx SHA-1 context
++ * \param input buffer holding the data
++ * \param ilen length of the input data
++ */
++void sha1_update( sha1_context *ctx, unsigned char *input, int ilen );
++
++/**
++ * \brief SHA-1 final digest
++ *
++ * \param ctx SHA-1 context
++ * \param output SHA-1 checksum result
++ */
++void sha1_finish( sha1_context *ctx, unsigned char output[20] );
++
++/**
++ * \brief Output = SHA-1( input buffer )
++ *
++ * \param input buffer holding the data
++ * \param ilen length of the input data
++ * \param output SHA-1 checksum result
++ */
++void sha1( unsigned char *input, int ilen, unsigned char output[20] );
++
++/**
++ * \brief Output = SHA-1( file contents )
++ *
++ * \param path input file name
++ * \param output SHA-1 checksum result
++ *
++ * \return 0 if successful, 1 if fopen failed,
++ * or 2 if fread failed
++ */
++int sha1_file( char *path, unsigned char output[20] );
++
++/**
++ * \brief SHA-1 HMAC context setup
++ *
++ * \param ctx HMAC context to be initialized
++ * \param key HMAC secret key
++ * \param keylen length of the HMAC key
++ */
++void sha1_hmac_starts( sha1_context *ctx, unsigned char *key, int keylen );
++
++/**
++ * \brief SHA-1 HMAC process buffer
++ *
++ * \param ctx HMAC context
++ * \param input buffer holding the data
++ * \param ilen length of the input data
++ */
++void sha1_hmac_update( sha1_context *ctx, unsigned char *input, int ilen );
++
++/**
++ * \brief SHA-1 HMAC final digest
++ *
++ * \param ctx HMAC context
++ * \param output SHA-1 HMAC checksum result
++ */
++void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] );
++
++/**
++ * \brief Output = HMAC-SHA-1( hmac key, input buffer )
++ *
++ * \param key HMAC secret key
++ * \param keylen length of the HMAC key
++ * \param input buffer holding the data
++ * \param ilen length of the input data
++ * \param output HMAC-SHA-1 result
++ */
++void sha1_hmac( unsigned char *key, int keylen,
++ unsigned char *input, int ilen,
++ unsigned char output[20] );
++
++/**
++ * \brief Checkup routine
++ *
++ * \return 0 if successful, or 1 if the test failed
++ */
++int sha1_self_test( int verbose );
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* sha1.h */
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/timing.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/timing.h
+new file mode 100644
+index 0000000..62d627f
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/timing.h
+@@ -0,0 +1,81 @@
++/**
++ * \file timing.h
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#ifndef POLARSSL_TIMING_H
++#define POLARSSL_TIMING_H
++
++/**
++ * \brief timer structure
++ */
++struct hr_time
++{
++ unsigned char opaque[32];
++};
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++extern int alarmed;
++
++/**
++ * \brief Return the CPU cycle counter value
++ */
++unsigned long hardclock( void );
++
++/**
++ * \brief Return the elapsed time in milliseconds
++ *
++ * \param val points to a timer structure
++ * \param reset if set to 1, the timer is restarted
++ */
++unsigned long get_timer( struct hr_time *val, int reset );
++
++/**
++ * \brief Setup an alarm clock
++ *
++ * \param seconds delay before the "alarmed" flag is set
++ */
++void set_alarm( int seconds );
++
++/**
++ * \brief Sleep for a certain amount of time
++ */
++void m_sleep( int milliseconds );
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* timing.h */
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/x509.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/x509.h
+new file mode 100644
+index 0000000..908a1db
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/x509.h
+@@ -0,0 +1,549 @@
++/**
++ * \file x509.h
++ *
++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine
++ *
++ * Copyright (C) 2009 Paul Bakker <polarssl_maintainer at polarssl dot org>
++ *
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * * Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * * Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++#ifndef POLARSSL_X509_H
++#define POLARSSL_X509_H
++
++#include "polarssl/rsa.h"
++
++#define POLARSSL_ERR_ASN1_OUT_OF_DATA -0x0014
++#define POLARSSL_ERR_ASN1_UNEXPECTED_TAG -0x0016
++#define POLARSSL_ERR_ASN1_INVALID_LENGTH -0x0018
++#define POLARSSL_ERR_ASN1_LENGTH_MISMATCH -0x001A
++#define POLARSSL_ERR_ASN1_INVALID_DATA -0x001C
++
++#define POLARSSL_ERR_X509_FEATURE_UNAVAILABLE -0x0020
++#define POLARSSL_ERR_X509_CERT_INVALID_PEM -0x0040
++#define POLARSSL_ERR_X509_CERT_INVALID_FORMAT -0x0060
++#define POLARSSL_ERR_X509_CERT_INVALID_VERSION -0x0080
++#define POLARSSL_ERR_X509_CERT_INVALID_SERIAL -0x00A0
++#define POLARSSL_ERR_X509_CERT_INVALID_ALG -0x00C0
++#define POLARSSL_ERR_X509_CERT_INVALID_NAME -0x00E0
++#define POLARSSL_ERR_X509_CERT_INVALID_DATE -0x0100
++#define POLARSSL_ERR_X509_CERT_INVALID_PUBKEY -0x0120
++#define POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE -0x0140
++#define POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS -0x0160
++#define POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION -0x0180
++#define POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG -0x01A0
++#define POLARSSL_ERR_X509_CERT_UNKNOWN_PK_ALG -0x01C0
++#define POLARSSL_ERR_X509_CERT_SIG_MISMATCH -0x01E0
++#define POLARSSL_ERR_X509_CERT_VERIFY_FAILED -0x0200
++#define POLARSSL_ERR_X509_KEY_INVALID_PEM -0x0220
++#define POLARSSL_ERR_X509_KEY_INVALID_VERSION -0x0240
++#define POLARSSL_ERR_X509_KEY_INVALID_FORMAT -0x0260
++#define POLARSSL_ERR_X509_KEY_INVALID_ENC_IV -0x0280
++#define POLARSSL_ERR_X509_KEY_UNKNOWN_ENC_ALG -0x02A0
++#define POLARSSL_ERR_X509_KEY_PASSWORD_REQUIRED -0x02C0
++#define POLARSSL_ERR_X509_KEY_PASSWORD_MISMATCH -0x02E0
++#define POLARSSL_ERR_X509_POINT_ERROR -0x0300
++#define POLARSSL_ERR_X509_VALUE_TO_LENGTH -0x0320
++
++#define BADCERT_EXPIRED 1
++#define BADCERT_REVOKED 2
++#define BADCERT_CN_MISMATCH 4
++#define BADCERT_NOT_TRUSTED 8
++
++/*
++ * DER constants
++ */
++#define ASN1_BOOLEAN 0x01
++#define ASN1_INTEGER 0x02
++#define ASN1_BIT_STRING 0x03
++#define ASN1_OCTET_STRING 0x04
++#define ASN1_NULL 0x05
++#define ASN1_OID 0x06
++#define ASN1_UTF8_STRING 0x0C
++#define ASN1_SEQUENCE 0x10
++#define ASN1_SET 0x11
++#define ASN1_PRINTABLE_STRING 0x13
++#define ASN1_T61_STRING 0x14
++#define ASN1_IA5_STRING 0x16
++#define ASN1_UTC_TIME 0x17
++#define ASN1_UNIVERSAL_STRING 0x1C
++#define ASN1_BMP_STRING 0x1E
++#define ASN1_PRIMITIVE 0x00
++#define ASN1_CONSTRUCTED 0x20
++#define ASN1_CONTEXT_SPECIFIC 0x80
++
++/*
++ * various object identifiers
++ */
++#define X520_COMMON_NAME 3
++#define X520_COUNTRY 6
++#define X520_LOCALITY 7
++#define X520_STATE 8
++#define X520_ORGANIZATION 10
++#define X520_ORG_UNIT 11
++#define PKCS9_EMAIL 1
++
++#define X509_OUTPUT_DER 0x01
++#define X509_OUTPUT_PEM 0x02
++#define PEM_LINE_LENGTH 72
++#define X509_ISSUER 0x01
++#define X509_SUBJECT 0x02
++
++#define OID_X520 "\x55\x04"
++#define OID_CN "\x55\x04\x03"
++#define OID_PKCS1 "\x2A\x86\x48\x86\xF7\x0D\x01\x01"
++#define OID_PKCS1_RSA "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01"
++#define OID_PKCS1_RSA_SHA "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05"
++#define OID_PKCS9 "\x2A\x86\x48\x86\xF7\x0D\x01\x09"
++#define OID_PKCS9_EMAIL "\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01"
++
++/*
++ * Structures for parsing X.509 certificates
++ */
++typedef struct _x509_buf
++{
++ int tag;
++ int len;
++ unsigned char *p;
++}
++x509_buf;
++
++typedef struct _x509_name
++{
++ x509_buf oid;
++ x509_buf val;
++ struct _x509_name *next;
++}
++x509_name;
++
++typedef struct _x509_time
++{
++ int year, mon, day;
++ int hour, min, sec;
++}
++x509_time;
++
++typedef struct _x509_cert
++{
++ x509_buf raw;
++ x509_buf tbs;
++
++ int version;
++ x509_buf serial;
++ x509_buf sig_oid1;
++
++ x509_buf issuer_raw;
++ x509_buf subject_raw;
++
++ x509_name issuer;
++ x509_name subject;
++
++ x509_time valid_from;
++ x509_time valid_to;
++
++ x509_buf pk_oid;
++ rsa_context rsa;
++
++ x509_buf issuer_id;
++ x509_buf subject_id;
++ x509_buf v3_ext;
++
++ int ca_istrue;
++ int max_pathlen;
++
++ x509_buf sig_oid2;
++ x509_buf sig;
++
++ struct _x509_cert *next;
++}
++x509_cert;
++
++/*
++ * Structures for writing X.509 certificates
++ */
++typedef struct _x509_node
++{
++ unsigned char *data;
++ unsigned char *p;
++ unsigned char *end;
++
++ size_t len;
++}
++x509_node;
++
++typedef struct _x509_raw
++{
++ x509_node raw;
++ x509_node tbs;
++
++ x509_node version;
++ x509_node serial;
++ x509_node tbs_signalg;
++ x509_node issuer;
++ x509_node validity;
++ x509_node subject;
++ x509_node subpubkey;
++
++ x509_node signalg;
++ x509_node sign;
++}
++x509_raw;
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/**
++ * \brief Parse one or more certificates and add them
++ * to the chained list
++ *
++ * \param chain points to the start of the chain
++ * \param buf buffer holding the certificate data
++ * \param buflen size of the buffer
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509parse_crt( x509_cert *crt, unsigned char *buf, int buflen );
++
++/**
++ * \brief Load one or more certificates and add them
++ * to the chained list
++ *
++ * \param chain points to the start of the chain
++ * \param path filename to read the certificates from
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509parse_crtfile( x509_cert *crt, char *path );
++
++/**
++ * \brief Parse a private RSA key
++ *
++ * \param rsa RSA context to be initialized
++ * \param buf input buffer
++ * \param buflen size of the buffer
++ * \param pwd password for decryption (optional)
++ * \param pwdlen size of the password
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509parse_key( rsa_context *rsa,
++ unsigned char *buf, int buflen,
++ unsigned char *pwd, int pwdlen );
++
++/**
++ * \brief Load and parse a private RSA key
++ *
++ * \param rsa RSA context to be initialized
++ * \param path filename to read the private key from
++ * \param pwd password to decrypt the file (can be NULL)
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509parse_keyfile( rsa_context *rsa, char *path, char *password );
++
++/**
++ * \brief Store the certificate DN in printable form into buf;
++ * no more than (end - buf) characters will be written.
++ */
++int x509parse_dn_gets( char *buf, char *end, x509_name *dn );
++
++/**
++ * \brief Returns an informational string about the
++ * certificate.
++ */
++char *x509parse_cert_info( char *prefix, x509_cert *crt );
++
++/**
++ * \brief Return 0 if the certificate is still valid,
++ * or BADCERT_EXPIRED
++ */
++int x509parse_expired( x509_cert *crt );
++
++/**
++ * \brief Verify the certificate signature
++ *
++ * \param crt a certificate to be verified
++ * \param trust_ca the trusted CA chain
++ * \param cn expected Common Name (can be set to
++ * NULL if the CN must not be verified)
++ * \param flags result of the verification
++ *
++ * \return 0 if successful or POLARSSL_ERR_X509_SIG_VERIFY_FAILED,
++ * in which case *flags will have one or more of
++ * the following values set:
++ * BADCERT_EXPIRED --
++ * BADCERT_REVOKED --
++ * BADCERT_CN_MISMATCH --
++ * BADCERT_NOT_TRUSTED
++ *
++ * \note TODO: add two arguments, depth and crl
++ */
++int x509parse_verify( x509_cert *crt,
++ x509_cert *trust_ca,
++ char *cn, int *flags );
++
++/**
++ * \brief Unallocate all certificate data
++ */
++void x509_free( x509_cert *crt );
++
++/**
++ * \brief Checkup routine
++ *
++ * \return 0 if successful, or 1 if the test failed
++ */
++int x509_self_test( int verbose );
++
++/**
++ * \brief Write a certificate info file
++ *
++ * \param chain points to the raw certificate data
++ * \param path filename to write the certificate to
++ * \param format X509_OUTPUT_DER or X509_OUTPUT_PEM
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509write_crtfile( x509_raw *chain,
++ unsigned char *path,
++ int format );
++
++/**
++ * \brief Write a certificate signing request message format file
++ *
++ * \param chain points to the raw certificate (with x509write_create_csr) data
++ * \param path filename to write the certificate to
++ * \param format X509_OUTPUT_DER or X509_OUTPUT_PEM
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509write_csrfile( x509_raw *chain,
++ unsigned char *path,
++ int format );
++
++/*
++ * \brief Write a private RSA key into a file
++ *
++ * \param rsa points to an RSA key
++ * \param path filename to write the key to
++ * \param format X509_OUTPUT_DER or X509_OUTPUT_PEM
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509write_keyfile( rsa_context *rsa,
++ char *path,
++ int format );
++
++/**
++ * \brief Add a public key to certificate
++ *
++ * \param chain points to the raw certificate data
++ * \param pubkey points to an RSA key
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509write_add_pubkey( x509_raw *chain, rsa_context *pubkey );
++
++/**
++ * \brief Create x509 subject/issuer field to raw certificate
++ * from string or CA cert. Make string NULL if you will
++ * use the CA copy function or make CA NULL then used
++ * the string parse.
++ *
++ * \param chain points to the raw certificate data
++ * \param names a string that can hold (separete with ";"):
++ * CN=CommonName
++ * -- O=Organization
++ * -- OU=OrgUnit
++ * -- ST=State
++ * -- L=Locality
++ * -- R=Email
++ * -- C=Country
++ * . Make that NULL if you didn't need that.
++ * \param flag flag is X509_ISSUER or X509_SUBJECT that defined
++ * where change
++ * \param ca the certificate for copy data. Make that NULL if you
++ * didn't need that.
++ * \param ca_flag set the ca field from copy to crt
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509write_add_customize ( x509_raw *crt,
++ unsigned char *names,
++ int flag,
++ x509_cert *ca,
++ int ca_flag );
++
++/**
++* \brief Add x509 issuer field
++*
++* \param chain points to the raw certificate data
++* \param issuer a string holding (separete with ";"):
++* CN=CommonName
++* -- O=Organization
++* -- OU=OrgUnit
++* -- ST=State
++* -- L=Locality
++* -- R=Email
++* -- C=Country
++* . Set this to NULL if not needed.
++* \return 0 if successful, or a specific X509 error code
++*/
++int x509write_add_issuer( x509_raw *crt, unsigned char *issuer);
++
++/**
++ * \brief Add x509 subject field
++ *
++ * \param chain points to the raw certificate data
++ * \param subject a string holding (separete with ";"):
++ * CN=CommonName
++ * -- O=Organization
++ * -- OU=OrgUnit
++ * -- ST=State
++ * -- L=Locality
++ * -- R=Email
++ * -- C=Country
++ * . Set this to NULL if not needed.
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509write_add_subject( x509_raw *crt, unsigned char *subject);
++
++/**
++* \brief Copy x509 issuer field from another certificate
++*
++* \param chain points to the raw certificate data
++* \param from_crt the certificate whose issuer is to be copied.
++* \return 0 if successful, or a specific X509 error code
++*/
++int x509write_copy_issuer(x509_raw *crt, x509_cert *from_crt);
++
++/**
++* \brief Copy x509 subject field from another certificate
++*
++* \param chain points to the raw certificate data
++* \param from_crt the certificate whose subject is to be copied.
++* \return 0 if successful, or a specific X509 error code
++*/
++int x509write_copy_subject(x509_raw *crt, x509_cert *from_crt);
++
++/**
++* \brief Copy x509 issuer field from the subject of another certificate
++*
++* \param chain points to the raw certificate data
++* \param from_crt the certificate whose subject is to be copied.
++* \return 0 if successful, or a specific X509 error code
++*/
++int x509write_copy_issuer_from_subject(x509_raw *crt, x509_cert *from_crt);
++
++/**
++* \brief Copy x509 subject field from the issuer of another certificate
++*
++* \param chain points to the raw certificate data
++* \param from_crt the certificate whose issuer is to be copied.
++* \return 0 if successful, or a specific X509 error code
++*/
++int x509write_copy_subject_from_issuer(x509_raw *crt, x509_cert *from_crt);
++
++/**
++ * \brief Create x509 validity time in UTC
++ *
++ * \param chain points to the raw certificate data
++ * \param before valid not before in format YYYY-MM-DD hh:mm:ss
++ * \param after valid not after in format YYYY-MM-DD hh:mm:ss
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509write_add_validity( x509_raw *crt,
++ unsigned char *before,
++ unsigned char *after );
++
++/**
++ * \brief Create a self-signed certificate
++ *
++ * \param chain points to the raw certificate data
++ * \param rsa a private key to sign the certificate
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509write_create_selfsign( x509_raw *crt, rsa_context *raw );
++
++/**
++ * \brief Create a certificate
++ *
++ * \param chain points to the raw certificate data
++ * \param rsa a private key to sign the certificate
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509write_create_sign( x509_raw *crt, rsa_context *raw );
++
++/**
++ * \brief Create a certificate signing request
++ *
++ * \param chain points to the raw certificate data. Didn't use the
++ * same chain that u have use for certificate.
++ * \param privkey a rsa private key
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509write_create_csr( x509_raw *chain, rsa_context *privkey );
++
++/**
++ * \brief Serialize an rsa key into DER
++ *
++ * \param rsa a rsa key for output
++ * \param node a x509 node for write into
++ *
++ * \return 0 if successful, or a specific X509 error code
++ */
++int x509write_serialize_key( rsa_context *rsa, x509_node *node );
++
++/**
++ * \brief Unallocate all raw certificate data
++ */
++void x509write_free_raw( x509_raw *crt );
++
++/**
++ * \brief Allocate all raw certificate data
++ */
++void x509write_init_raw( x509_raw *crt );
++
++/**
++ * \brief Unallocate all node certificate data
++ */
++void x509write_free_node( x509_node *crt_node );
++
++/**
++ * \brief Allocate all node certificate data
++ */
++void x509write_init_node( x509_node *crt_node );
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* x509.h */
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/px5g.c b/feeds/luci/libs/luci-lib-px5g/src/px5g.c
+new file mode 100644
+index 0000000..feecd01
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/px5g.c
+@@ -0,0 +1,159 @@
++/*
++ * px5g - Embedded x509 key and certificate generator based on PolarSSL
++ *
++ * Copyright (C) 2009 Steven Barth <steven@midlink.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License, version 2.1 as published by the Free Software Foundation.
++ *
++ * This library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
++ * MA 02110-1301 USA
++ */
++
++#include "px5g.h"
++#include <time.h>
++#include <string.h>
++#define VERSION 0.1
++
++static char *xfields[] = {"CN", "O", "C", "OU", "ST", "L", "R"};
++
++static int px5g_genkey(lua_State *L) {
++ int keysize = luaL_checkint(L, 1), pexp = luaL_optint(L, 2, 65537), ret;
++ px5g_rsa *px5g = lua_newuserdata(L, sizeof(px5g_rsa));
++ if (!px5g) {
++ return luaL_error(L, "out of memory");
++ }
++
++ px5g->stat = 1;
++ havege_init(&px5g->hs);
++ rsa_init(&px5g->rsa, RSA_PKCS_V15, 0, havege_rand, &px5g->hs);
++
++ if ((ret = rsa_gen_key(&px5g->rsa, keysize, pexp))) {
++ lua_pushnil(L);
++ lua_pushinteger(L, ret);
++ return 2;
++ }
++
++ luaL_getmetatable(L, PX5G_KEY_META);
++ lua_setmetatable(L, -2);
++ return 1;
++}
++
++static int px5g_rsa_asn1(lua_State *L) {
++ int ret;
++ px5g_rsa *px5g = luaL_checkudata(L, 1, PX5G_KEY_META);
++ x509_node node;
++
++ x509write_init_node(&node);
++ if ((ret = x509write_serialize_key(&px5g->rsa, &node))) {
++ x509write_free_node(&node);
++ lua_pushnil(L);
++ lua_pushinteger(L, ret);
++ return 2;
++ }
++
++ lua_pushlstring(L, (char*)node.data, node.len);
++ x509write_free_node(&node);
++ return 1;
++}
++
++static int px5g_rsa_create_selfsigned(lua_State *L) {
++ px5g_rsa *px5g = luaL_checkudata(L, 1, PX5G_KEY_META);
++ luaL_checktype(L, 2, LUA_TTABLE);
++ time_t from = (time_t)luaL_checknumber(L, 3);
++ time_t to = (time_t)luaL_checknumber(L, 4);
++ char fstr[20], tstr[20];
++
++ lua_pushliteral(L, "CN");
++ lua_rawget(L, 2);
++ luaL_argcheck(L, lua_isstring(L, -1), 2, "CN missing");
++ lua_pop(L, 1);
++
++ luaL_argcheck(L,
++ strftime(fstr, sizeof(fstr), "%F %H:%M:%S", gmtime(&from)),
++ 3, "Invalid Time");
++
++ luaL_argcheck(L,
++ strftime(tstr, sizeof(tstr), "%F %H:%M:%S", gmtime(&to)),
++ 4, "Invalid Time");
++
++ size_t join = 1;
++ lua_pushliteral(L, "");
++ for (int i = 0; i < (sizeof(xfields) / sizeof(*xfields)); i++) {
++ lua_pushstring(L, xfields[i]);
++ lua_rawget(L, 2);
++ if (lua_isstring(L, -1)) {
++ const char *val = lua_tostring(L, -1);
++ luaL_argcheck(L, !strchr(val, ';'), 2, "Invalid Value");
++ lua_pushfstring(L, "%s=%s;", xfields[i], val);
++ lua_remove(L, -2);
++ join++;
++ } else {
++ lua_pop(L, 1);
++ }
++ }
++ lua_concat(L, join);
++
++ x509_raw cert;
++ x509write_init_raw(&cert);
++ x509write_add_pubkey(&cert, &px5g->rsa);
++ x509write_add_subject(&cert, (unsigned char*)lua_tostring(L, -1));
++ x509write_add_validity(&cert, (unsigned char*)fstr, (unsigned char*)tstr);
++ x509write_create_selfsign(&cert, &px5g->rsa);
++
++ lua_pushlstring(L, (char*)cert.raw.data, cert.raw.len);
++ x509write_free_raw(&cert);
++ return 1;
++}
++
++static int px5g_rsa__gc(lua_State *L) {
++ px5g_rsa *px5g = luaL_checkudata(L, 1, PX5G_KEY_META);
++ if (px5g->stat) {
++ rsa_free(&px5g->rsa);
++ px5g->stat = 0;
++ }
++ return 0;
++}
++
++static int px5g_rsa__tostring(lua_State *L) {
++ px5g_rsa *px5g = luaL_checkudata(L, 1, PX5G_KEY_META);
++ lua_pushfstring(L, "px5g context %p", px5g);
++ return 1;
++}
++
++/* method table */
++static const luaL_reg M[] = {
++ {"asn1", px5g_rsa_asn1},
++ {"create_selfsigned", px5g_rsa_create_selfsigned},
++ {"__gc", px5g_rsa__gc},
++ {"__tostring", px5g_rsa__tostring},
++ {NULL, NULL}
++};
++
++/* module table */
++static const luaL_reg R[] = {
++ {"genkey", px5g_genkey},
++ {NULL, NULL}
++};
++
++int luaopen_px5g(lua_State *L) {
++ /* register module */
++ luaL_register(L, "px5g", R);
++
++ /* Meta Table */
++ luaL_newmetatable(L, PX5G_KEY_META);
++ luaL_register(L, NULL, M);
++ lua_pushvalue(L, -1);
++ lua_setfield(L, -2, "__index");
++
++ lua_setfield(L, -2, "meta_key");
++ return 1;
++}
+diff --git a/feeds/luci/libs/luci-lib-px5g/src/px5g.h b/feeds/luci/libs/luci-lib-px5g/src/px5g.h
+new file mode 100644
+index 0000000..47542b5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-px5g/src/px5g.h
+@@ -0,0 +1,16 @@
++#include <lua.h>
++#include <lualib.h>
++#include <lauxlib.h>
++
++#include "polarssl/havege.h"
++#include "polarssl/bignum.h"
++#include "polarssl/x509.h"
++#include "polarssl/rsa.h"
++
++#define PX5G_KEY_META "px5g.key"
++
++typedef struct px5g_rsa {
++ int stat;
++ havege_state hs;
++ rsa_context rsa;
++} px5g_rsa;
+diff --git a/feeds/luci/libs/luci-lib-rpcc/Makefile b/feeds/luci/libs/luci-lib-rpcc/Makefile
+new file mode 100644
+index 0000000..e0fea28
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-rpcc/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI Support for AHCPd
++LUCI_DEPENDS:=@BROKEN
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.lua b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.lua
+new file mode 100644
+index 0000000..5558910
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.lua
+@@ -0,0 +1,59 @@
++-- Copyright 2009 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local util = require "luci.util"
++local json = require "luci.json"
++local ltn12 = require "luci.ltn12"
++local nixio = require "nixio", require "nixio.util"
++
++local tostring, assert, setmetatable = tostring, assert, setmetatable
++local error = error
++
++module "luci.rpcc"
++
++RQLIMIT = 32 * nixio.const.buffersize
++
++Client = util.class()
++
++function Client.__init__(self, fd, v1)
++ self.fd = fd
++ self.uniqueid = tostring(self):match("0x([a-f0-9]+)")
++ self.msgid = 1
++ self.v1 = v1
++end
++
++function Client.request(self, method, params, notification)
++ local oldchunk = self.decoder and self.decoder.chunk
++ self.decoder = json.ActiveDecoder(self.fd:blocksource(nil, RQLIMIT))
++ self.decoder.chunk = oldchunk
++
++ local reqid = self.msgid .. self.uniqueid
++ local reqdata = json.Encoder({
++ id = (not notification) and (self.msgid .. self.uniqueid) or nil,
++ jsonrpc = (not self.v1) and "2.0" or nil,
++ method = method,
++ params = params
++ })
++ ltn12.pump.all(reqdata:source(), self.fd:sink())
++ if not notification then
++ self.msgid = self.msgid + 1
++ local response = self.decoder:get()
++ assert(response.id == reqid, "Invalid response id")
++ if response.error then
++ error(response.error.message or response.error)
++ end
++ return response.result
++ end
++end
++
++function Client.proxy(self, prefix)
++ prefix = prefix or ""
++ return setmetatable({}, {
++ __call = function(proxy, ...)
++ return self:request(prefix, {...})
++ end,
++ __index = function(proxy, name)
++ return self:proxy(prefix .. name .. ".")
++ end
++ })
++end
+\ No newline at end of file
+diff --git a/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.luadoc b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.luadoc
+new file mode 100644
+index 0000000..5609bfd
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.luadoc
+@@ -0,0 +1,36 @@
++---[[
++LuCI RPC Client.
++
++@cstyle instance
++]]
++module "luci.rpcc"
++
++---[[
++Create a new JSON-RPC stream client.
++
++@class function
++@param fd File descriptor
++@param v1 Use protocol version 1.0
++@return RPC Client
++]]
++
++---[[
++Request an RP call and get the response.
++
++@class function
++@name Client.request
++@param method Remote method
++@param params Parameters
++@param notification Notification only?
++@return response
++]]
++
++---[[
++Create a transparent RPC proxy.
++
++@class function
++@name Client.proxy
++@param prefix Method prefix
++@return RPC Proxy object
++]]
++
+diff --git a/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.lua b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.lua
+new file mode 100644
+index 0000000..275c396
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.lua
+@@ -0,0 +1,48 @@
++-- Copyright 2009 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local util = require "luci.util"
++local rawget, setmetatable = rawget, setmetatable
++local ipairs = ipairs
++
++module "luci.rpcc.ruci"
++
++
++local Proxy = util.class()
++
++function factory(rpccl)
++ return {
++ cursor = function(...)
++ return Proxy(rpccl, rpccl:request("ruci.cursor", {...}))
++ end,
++ cursor_state = function(...)
++ return Proxy(rpccl, rpccl:request("ruci.cursor_state", {...}))
++ end
++ }
++end
++
++function Proxy.__init__(self, rpccl, objid)
++ self.__rpccl = rpccl
++ self.__objid = objid
++
++ setmetatable(self, {
++ __index = function(self, key)
++ return rawget(self, key) or Proxy[key] or function(self, ...)
++ local argv = {self.__objid, ...}
++ return self.__rpccl:request("ruci."..key, argv)
++ end
++ end
++ })
++end
++
++function Proxy.foreach(self, config, section, callback)
++ local sections = self.__rpccl:request("ruci.foreach", {self.__objid, config, section})
++ if sections then
++ for _, s in ipairs(sections) do
++ callback(s)
++ end
++ return true
++ else
++ return false
++ end
++end
+diff --git a/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.luadoc b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.luadoc
+new file mode 100644
+index 0000000..9c842c5
+--- /dev/null
++++ b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.luadoc
+@@ -0,0 +1,16 @@
++---[[
++Transparent UCI over RPC client.
++
++@cstyle instance
++]]
++module "luci.rpcc.ruci"
++
++---[[
++Create a new UCI over RPC proxy.
++
++@class function
++@name factory
++@param rpccl RPC client
++@return Network transparent UCI module
++]]
++
+diff --git a/feeds/luci/luci.mk b/feeds/luci/luci.mk
+new file mode 100644
+index 0000000..1e56edd
+--- /dev/null
++++ b/feeds/luci/luci.mk
+@@ -0,0 +1,216 @@
++#
++# Copyright (C) 2008-2015 The LuCI Team <luci@lists.subsignal.org>
++#
++# This is free software, licensed under the Apache License, Version 2.0 .
++#
++
++LUCI_NAME?=$(notdir ${CURDIR})
++LUCI_TYPE?=$(word 2,$(subst -, ,$(LUCI_NAME)))
++LUCI_BASENAME?=$(patsubst luci-$(LUCI_TYPE)-%,%,$(LUCI_NAME))
++LUCI_LANGUAGES:=$(filter-out templates,$(notdir $(wildcard ${CURDIR}/po/*)))
++LUCI_DEFAULTS:=$(notdir $(wildcard ${CURDIR}/root/etc/uci-defaults/*))
++LUCI_PKGARCH?=$(if $(realpath src/Makefile),,all)
++
++# Language code titles
++LUCI_LANG.ca=Català (Catalan)
++LUCI_LANG.cs=Čeština (Czech)
++LUCI_LANG.de=Deutsch (German)
++LUCI_LANG.el=Ελληνικά (Greek)
++LUCI_LANG.en=English
++LUCI_LANG.es=Español (Spanish)
++LUCI_LANG.fr=Français (French)
++LUCI_LANG.he=עִבְרִית (Hebrew)
++LUCI_LANG.hu=Magyar (Hungarian)
++LUCI_LANG.it=Italiano (Italian)
++LUCI_LANG.ja=日本語 (Japanese)
++LUCI_LANG.ms=Bahasa Melayu (Malay)
++LUCI_LANG.no=Norsk (Norwegian)
++LUCI_LANG.pl=Polski (Polish)
++LUCI_LANG.pt-br=Português do Brasil (Brazialian Portuguese)
++LUCI_LANG.pt=Português (Portuguese)
++LUCI_LANG.ro=Română (Romanian)
++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.vi=Tiếng Việt (Vietnamese)
++LUCI_LANG.zh-cn=æ™®é€šè¯ (Chinese)
++LUCI_LANG.zh-tw=臺ç£è¯èªž (Taiwanese)
++
++# Submenu titles
++LUCI_MENU.col=1. Collections
++LUCI_MENU.mod=2. Modules
++LUCI_MENU.app=3. Applications
++LUCI_MENU.theme=4. Themes
++LUCI_MENU.proto=5. Protocols
++LUCI_MENU.lib=6. Libraries
++
++
++PKG_NAME?=$(LUCI_NAME)
++
++PKG_VERSION?=$(if $(DUMP),x,$(strip $(shell \
++ if svn info >/dev/null 2>/dev/null; then \
++ revision="svn-r$$(LC_ALL=C svn info | sed -ne 's/^Revision: //p')"; \
++ elif git log -1 >/dev/null 2>/dev/null; then \
++ revision="svn-r$$(LC_ALL=C git log -1 | sed -ne 's/.*git-svn-id: .*@\([0-9]\+\) .*/\1/p')"; \
++ if [ "$$revision" = "svn-r" ]; then \
++ set -- $$(git log -1 --format="%ct %h"); \
++ secs="$$(($$1 % 86400))"; \
++ yday="$$(date --utc --date="@$$1" "+%y.%j")"; \
++ revision="$$(printf 'git-%s.%05d-%s' "$$yday" "$$secs" "$$2")"; \
++ fi; \
++ else \
++ revision="unknown"; \
++ fi; \
++ echo "$$revision" \
++)))
++
++PKG_RELEASE?=1
++PKG_INSTALL:=$(if $(realpath src/Makefile),1)
++PKG_BUILD_DEPENDS += lua/host luci-base/host $(LUCI_BUILD_DEPENDS)
++PKG_CONFIG_DEPENDS += CONFIG_LUCI_SRCDIET
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/$(PKG_NAME)
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=$(if $(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.app))
++ TITLE:=$(if $(LUCI_TITLE),$(LUCI_TITLE),LuCI $(LUCI_NAME) $(LUCI_TYPE))
++ DEPENDS:=$(LUCI_DEPENDS)
++ $(if $(LUCI_PKGARCH),PKGARCH:=$(LUCI_PKGARCH))
++endef
++
++ifneq ($(LUCI_DESCRIPTION),)
++ define Package/$(PKG_NAME)/description
++ $(strip $(LUCI_DESCRIPTION))
++ endef
++endif
++
++# Language selection for luci-base
++ifeq ($(PKG_NAME),luci-base)
++ define Package/luci-base/config
++ config LUCI_SRCDIET
++ bool "Minify Lua sources"
++ default n
++
++ menu "Translations"$(foreach lang,$(LUCI_LANGUAGES),
++
++ config LUCI_LANG_$(lang)
++ tristate "$(shell echo '$(LUCI_LANG.$(lang))' | sed -e 's/^.* (\(.*\))$$/\1/') ($(lang))")
++
++ endmenu
++ endef
++endif
++
++define Build/Prepare
++ for d in luasrc htdocs root src; do \
++ if [ -d ./$$$$d ]; then \
++ mkdir -p $(PKG_BUILD_DIR)/$$$$d; \
++ $(CP) ./$$$$d/* $(PKG_BUILD_DIR)/$$$$d/; \
++ fi; \
++ done
++ $(call Build/Prepare/Default)
++endef
++
++define Build/Configure
++endef
++
++ifneq ($(wildcard ${CURDIR}/src/Makefile),)
++ MAKE_PATH := src/
++ MAKE_VARS += FPIC="$(FPIC)" LUCI_VERSION="$(PKG_VERSION)"
++
++ define Build/Compile
++ $(call Build/Compile/Default,clean compile)
++ endef
++else
++ define Build/Compile
++ endef
++endif
++
++HTDOCS = /www
++LUA_LIBRARYDIR = /usr/lib/lua
++LUCI_LIBRARYDIR = $(LUA_LIBRARYDIR)/luci
++
++define SrcDiet
++ $(FIND) $(1) -type f -name '*.lua' | while read src; do \
++ if $(STAGING_DIR_HOST)/bin/lua $(STAGING_DIR_HOST)/bin/LuaSrcDiet \
++ --noopt-binequiv -o "$$$$src.o" "$$$$src"; \
++ then mv "$$$$src.o" "$$$$src"; fi; \
++ done
++endef
++
++define Package/$(PKG_NAME)/install
++ if [ -d $(PKG_BUILD_DIR)/luasrc ]; then \
++ $(INSTALL_DIR) $(1)$(LUCI_LIBRARYDIR); \
++ cp -pR $(PKG_BUILD_DIR)/luasrc/* $(1)$(LUCI_LIBRARYDIR)/; \
++ $(FIND) $(1)$(LUCI_LIBRARYDIR)/ -type f -name '*.luadoc' | $(XARGS) rm; \
++ $(if $(CONFIG_LUCI_SRCDIET),$(call SrcDiet,$(1)$(LUCI_LIBRARYDIR)/),true); \
++ else true; fi
++ if [ -d $(PKG_BUILD_DIR)/htdocs ]; then \
++ $(INSTALL_DIR) $(1)$(HTDOCS); \
++ cp -pR $(PKG_BUILD_DIR)/htdocs/* $(1)$(HTDOCS)/; \
++ else true; fi
++ if [ -d $(PKG_BUILD_DIR)/root ]; then \
++ $(INSTALL_DIR) $(1)/; \
++ cp -pR $(PKG_BUILD_DIR)/root/* $(1)/; \
++ else true; fi
++ if [ -d $(PKG_BUILD_DIR)/src ]; then \
++ $(call Build/Install/Default) \
++ $(CP) $(PKG_INSTALL_DIR)/* $(1)/; \
++ else true; fi
++endef
++
++ifneq ($(LUCI_DEFAULTS),)
++define Package/$(PKG_NAME)/postinst
++[ -n "$${IPKG_INSTROOT}" ] || {$(foreach script,$(LUCI_DEFAULTS),
++ (. /etc/uci-defaults/$(script)) && rm -f /etc/uci-defaults/$(script))
++ exit 0
++}
++endef
++endif
++
++
++LUCI_BUILD_PACKAGES := $(PKG_NAME)
++
++define LuciTranslation
++ define Package/luci-i18n-$(LUCI_BASENAME)-$(1)
++ SECTION:=luci
++ CATEGORY:=LuCI
++ TITLE:=$(PKG_NAME) - $(1) translation
++ HIDDEN:=1
++ DEFAULT:=LUCI_LANG_$(1)||(ALL&&m)
++ DEPENDS:=$(PKG_NAME)
++ PKGARCH:=all
++ endef
++
++ define Package/luci-i18n-$(LUCI_BASENAME)-$(1)/description
++ Translation for $(PKG_NAME) - $(LUCI_LANG.$(1))
++ endef
++
++ define Package/luci-i18n-$(LUCI_BASENAME)-$(1)/install
++ $$(INSTALL_DIR) $$(1)/etc/uci-defaults
++ echo "uci set luci.languages.$(subst -,_,$(1))='$(LUCI_LANG.$(1))'; uci commit luci" \
++ > $$(1)/etc/uci-defaults/luci-i18n-$(LUCI_BASENAME)-$(1)
++ $$(INSTALL_DIR) $$(1)$(LUCI_LIBRARYDIR)/i18n
++ $(foreach po,$(wildcard ${CURDIR}/po/$(1)/*.po), \
++ po2lmo $(po) \
++ $$(1)$(LUCI_LIBRARYDIR)/i18n/$(basename $(notdir $(po))).$(1).lmo;)
++ endef
++
++ define Package/luci-i18n-$(LUCI_BASENAME)-$(1)/postinst
++ [ -n "$$$${IPKG_INSTROOT}" ] || {
++ (. /etc/uci-defaults/luci-i18n-$(LUCI_BASENAME)-$(1)) && rm -f /etc/uci-defaults/luci-i18n-$(LUCI_BASENAME)-$(1)
++ exit 0
++ }
++ endef
++
++ LUCI_BUILD_PACKAGES += luci-i18n-$(LUCI_BASENAME)-$(1)
++
++endef
++
++$(foreach lang,$(LUCI_LANGUAGES),$(eval $(call LuciTranslation,$(lang))))
++$(foreach pkg,$(LUCI_BUILD_PACKAGES),$(eval $(call BuildPackage,$(pkg))))
+diff --git a/feeds/luci/modules/luci-base/Makefile b/feeds/luci/modules/luci-base/Makefile
+new file mode 100644
+index 0000000..54506b0
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/Makefile
+@@ -0,0 +1,43 @@
++#
++# Copyright (C) 2008-2015 The LuCI Team <luci@lists.subsignal.org>
++#
++# This is free software, licensed under the Apache License, Version 2.0 .
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-base
++
++LUCI_TYPE:=mod
++LUCI_BASENAME:=base
++
++LUCI_TITLE:=LuCI core libraries
++LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua
++
++PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2
++PKG_SOURCE_URL:=https://luasrcdiet.googlecode.com/files
++PKG_MD5SUM:=8a0812701e29b6715e4d76f2f118264a
++
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/LuaSrcDiet-0.12.1
++
++include $(INCLUDE_DIR)/host-build.mk
++
++include ../../luci.mk
++
++define Host/Configure
++endef
++
++define Host/Compile
++ $(MAKE) -C src/ clean po2lmo
++ $(MAKE) -C $(HOST_BUILD_DIR) bin/LuaSrcDiet.lua
++endef
++
++define Host/Install
++ $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin
++ $(INSTALL_BIN) src/po2lmo $(STAGING_DIR_HOST)/bin/po2lmo
++ $(INSTALL_BIN) $(HOST_BUILD_DIR)/bin/LuaSrcDiet.lua $(STAGING_DIR_HOST)/bin/LuaSrcDiet
++endef
++
++$(eval $(call HostBuild))
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/modules/luci-base/htdocs/cgi-bin/luci b/feeds/luci/modules/luci-base/htdocs/cgi-bin/luci
+new file mode 100755
+index 0000000..529d1d0
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/htdocs/cgi-bin/luci
+@@ -0,0 +1,5 @@
++#!/usr/bin/lua
++require "luci.cacheloader"
++require "luci.sgi.cgi"
++luci.dispatcher.indexcache = "/tmp/luci-indexcache"
++luci.sgi.cgi.run()
+\ No newline at end of file
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi.js b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi.js
+new file mode 100644
+index 0000000..5e31bf2
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi.js
+@@ -0,0 +1,1339 @@
++/*
++ LuCI - Lua Configuration Interface
++
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2012 Jo-Philipp Wich <jow@openwrt.org>
++
++ Licensed under the Apache License, Version 2.0 (the "License");
++ you may not use this file except in compliance with the License.
++ You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++*/
++
++var cbi_d = [];
++var cbi_t = [];
++var cbi_c = [];
++
++var cbi_validators = {
++
++ 'integer': function()
++ {
++ return (this.match(/^-?[0-9]+$/) != null);
++ },
++
++ 'uinteger': function()
++ {
++ return (cbi_validators.integer.apply(this) && (this >= 0));
++ },
++
++ 'float': function()
++ {
++ return !isNaN(parseFloat(this));
++ },
++
++ 'ufloat': function()
++ {
++ return (cbi_validators['float'].apply(this) && (this >= 0));
++ },
++
++ 'ipaddr': function()
++ {
++ return cbi_validators.ip4addr.apply(this) ||
++ cbi_validators.ip6addr.apply(this);
++ },
++
++ 'ip4addr': function()
++ {
++ if (this.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})(\/(\S+))?$/))
++ {
++ return (RegExp.$1 >= 0) && (RegExp.$1 <= 255) &&
++ (RegExp.$2 >= 0) && (RegExp.$2 <= 255) &&
++ (RegExp.$3 >= 0) && (RegExp.$3 <= 255) &&
++ (RegExp.$4 >= 0) && (RegExp.$4 <= 255) &&
++ ((RegExp.$6.indexOf('.') < 0)
++ ? ((RegExp.$6 >= 0) && (RegExp.$6 <= 32))
++ : (cbi_validators.ip4addr.apply(RegExp.$6)))
++ ;
++ }
++
++ return false;
++ },
++
++ 'ip6addr': function()
++ {
++ if( this.match(/^([a-fA-F0-9:.]+)(\/(\d+))?$/) )
++ {
++ if( !RegExp.$2 || ((RegExp.$3 >= 0) && (RegExp.$3 <= 128)) )
++ {
++ var addr = RegExp.$1;
++
++ if( addr == '::' )
++ {
++ return true;
++ }
++
++ if( addr.indexOf('.') > 0 )
++ {
++ var off = addr.lastIndexOf(':');
++
++ if( !(off && cbi_validators.ip4addr.apply(addr.substr(off+1))) )
++ return false;
++
++ addr = addr.substr(0, off) + ':0:0';
++ }
++
++ if( addr.indexOf('::') >= 0 )
++ {
++ var colons = 0;
++ var fill = '0';
++
++ for( var i = 1; i < (addr.length-1); i++ )
++ if( addr.charAt(i) == ':' )
++ colons++;
++
++ if( colons > 7 )
++ return false;
++
++ for( var i = 0; i < (7 - colons); i++ )
++ fill += ':0';
++
++ if (addr.match(/^(.*?)::(.*?)$/))
++ addr = (RegExp.$1 ? RegExp.$1 + ':' : '') + fill +
++ (RegExp.$2 ? ':' + RegExp.$2 : '');
++ }
++
++ return (addr.match(/^(?:[a-fA-F0-9]{1,4}:){7}[a-fA-F0-9]{1,4}$/) != null);
++ }
++ }
++
++ return false;
++ },
++
++ 'port': function()
++ {
++ return cbi_validators.integer.apply(this) &&
++ (this >= 0) && (this <= 65535);
++ },
++
++ 'portrange': function()
++ {
++ if (this.match(/^(\d+)-(\d+)$/))
++ {
++ var p1 = RegExp.$1;
++ var p2 = RegExp.$2;
++
++ return cbi_validators.port.apply(p1) &&
++ cbi_validators.port.apply(p2) &&
++ (parseInt(p1) <= parseInt(p2))
++ ;
++ }
++ else
++ {
++ return cbi_validators.port.apply(this);
++ }
++ },
++
++ 'macaddr': function()
++ {
++ return (this.match(/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/) != null);
++ },
++
++ 'host': function()
++ {
++ return cbi_validators.hostname.apply(this) ||
++ cbi_validators.ipaddr.apply(this);
++ },
++
++ 'hostname': function()
++ {
++ if (this.length <= 253)
++ return (this.match(/^[a-zA-Z0-9]+$/) != null ||
++ (this.match(/^[a-zA-Z0-9_][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$/) &&
++ this.match(/[^0-9.]/)));
++
++ return false;
++ },
++
++ 'network': function()
++ {
++ return cbi_validators.uciname.apply(this) ||
++ cbi_validators.host.apply(this);
++ },
++
++ 'wpakey': function()
++ {
++ var v = this;
++
++ if( v.length == 64 )
++ return (v.match(/^[a-fA-F0-9]{64}$/) != null);
++ else
++ return (v.length >= 8) && (v.length <= 63);
++ },
++
++ 'wepkey': function()
++ {
++ var v = this;
++
++ if ( v.substr(0,2) == 's:' )
++ v = v.substr(2);
++
++ if( (v.length == 10) || (v.length == 26) )
++ return (v.match(/^[a-fA-F0-9]{10,26}$/) != null);
++ else
++ return (v.length == 5) || (v.length == 13);
++ },
++
++ 'uciname': function()
++ {
++ return (this.match(/^[a-zA-Z0-9_]+$/) != null);
++ },
++
++ 'range': function(min, max)
++ {
++ var val = parseFloat(this);
++ if (!isNaN(min) && !isNaN(max) && !isNaN(val))
++ return ((val >= min) && (val <= max));
++
++ return false;
++ },
++
++ 'min': function(min)
++ {
++ var val = parseFloat(this);
++ if (!isNaN(min) && !isNaN(val))
++ return (val >= min);
++
++ return false;
++ },
++
++ 'max': function(max)
++ {
++ var val = parseFloat(this);
++ if (!isNaN(max) && !isNaN(val))
++ return (val <= max);
++
++ return false;
++ },
++
++ 'rangelength': function(min, max)
++ {
++ var val = '' + this;
++ if (!isNaN(min) && !isNaN(max))
++ return ((val.length >= min) && (val.length <= max));
++
++ return false;
++ },
++
++ 'minlength': function(min)
++ {
++ var val = '' + this;
++ if (!isNaN(min))
++ return (val.length >= min);
++
++ return false;
++ },
++
++ 'maxlength': function(max)
++ {
++ var val = '' + this;
++ if (!isNaN(max))
++ return (val.length <= max);
++
++ return false;
++ },
++
++ 'or': function()
++ {
++ for (var i = 0; i < arguments.length; i += 2)
++ {
++ if (typeof arguments[i] != 'function')
++ {
++ if (arguments[i] == this)
++ return true;
++ i--;
++ }
++ else if (arguments[i].apply(this, arguments[i+1]))
++ {
++ return true;
++ }
++ }
++ return false;
++ },
++
++ 'and': function()
++ {
++ for (var i = 0; i < arguments.length; i += 2)
++ {
++ if (typeof arguments[i] != 'function')
++ {
++ if (arguments[i] != this)
++ return false;
++ i--;
++ }
++ else if (!arguments[i].apply(this, arguments[i+1]))
++ {
++ return false;
++ }
++ }
++ return true;
++ },
++
++ 'neg': function()
++ {
++ return cbi_validators.or.apply(
++ this.replace(/^[ \t]*![ \t]*/, ''), arguments);
++ },
++
++ 'list': function(subvalidator, subargs)
++ {
++ if (typeof subvalidator != 'function')
++ return false;
++
++ var tokens = this.match(/[^ \t]+/g);
++ for (var i = 0; i < tokens.length; i++)
++ if (!subvalidator.apply(tokens[i], subargs))
++ return false;
++
++ return true;
++ },
++ 'phonedigit': function()
++ {
++ return (this.match(/^[0-9\*#!\.]+$/) != null);
++ }
++};
++
++
++function cbi_d_add(field, dep, next) {
++ var obj = document.getElementById(field);
++ if (obj) {
++ var entry
++ for (var i=0; i<cbi_d.length; i++) {
++ if (cbi_d[i].id == field) {
++ entry = cbi_d[i];
++ break;
++ }
++ }
++ if (!entry) {
++ entry = {
++ "node": obj,
++ "id": field,
++ "parent": obj.parentNode.id,
++ "next": next,
++ "deps": []
++ };
++ cbi_d.unshift(entry);
++ }
++ entry.deps.push(dep)
++ }
++}
++
++function cbi_d_checkvalue(target, ref) {
++ var t = document.getElementById(target);
++ var value;
++
++ 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 : "";
++ }
++ }
++
++ return (value == ref)
++}
++
++function cbi_d_check(deps) {
++ var reverse;
++ var def = false;
++ for (var i=0; i<deps.length; i++) {
++ var istat = true;
++ reverse = false;
++ for (var j in deps[i]) {
++ if (j == "!reverse") {
++ reverse = true;
++ } else if (j == "!default") {
++ def = true;
++ istat = false;
++ } else {
++ istat = (istat && cbi_d_checkvalue(j, deps[i][j]))
++ }
++ }
++ if (istat) {
++ return !reverse;
++ }
++ }
++ return def;
++}
++
++function cbi_d_update() {
++ var state = false;
++ for (var i=0; i<cbi_d.length; i++) {
++ var entry = cbi_d[i];
++ var next = document.getElementById(entry.next)
++ var node = document.getElementById(entry.id)
++ var parent = document.getElementById(entry.parent)
++
++ if (node && node.parentNode && !cbi_d_check(entry.deps)) {
++ node.parentNode.removeChild(node);
++ state = true;
++ if( entry.parent )
++ cbi_c[entry.parent]--;
++ } else if ((!node || !node.parentNode) && cbi_d_check(entry.deps)) {
++ if (!next) {
++ parent.appendChild(entry.node);
++ } else {
++ next.parentNode.insertBefore(entry.node, next);
++ }
++ state = true;
++ if( entry.parent )
++ cbi_c[entry.parent]++;
++ }
++ }
++
++ if (entry && entry.parent) {
++ if (!cbi_t_update())
++ cbi_tag_last(parent);
++ }
++
++ if (state) {
++ cbi_d_update();
++ }
++}
++
++function cbi_bind(obj, type, callback, mode) {
++ if (!obj.addEventListener) {
++ obj.attachEvent('on' + type,
++ function(){
++ var e = window.event;
++
++ if (!e.target && e.srcElement)
++ e.target = e.srcElement;
++
++ return !!callback(e);
++ }
++ );
++ } else {
++ obj.addEventListener(type, callback, !!mode);
++ }
++ return obj;
++}
++
++function cbi_combobox(id, values, def, man) {
++ var selid = "cbi.combobox." + id;
++ if (document.getElementById(selid)) {
++ return
++ }
++
++ var obj = document.getElementById(id)
++ var sel = document.createElement("select");
++ sel.id = selid;
++ sel.className = obj.className.replace(/cbi-input-text/, 'cbi-input-select');
++
++ if (obj.nextSibling) {
++ obj.parentNode.insertBefore(sel, obj.nextSibling);
++ } else {
++ obj.parentNode.appendChild(sel);
++ }
++
++ var dt = obj.getAttribute('cbi_datatype');
++ var op = obj.getAttribute('cbi_optional');
++
++ if (dt)
++ cbi_validate_field(sel, op == 'true', dt);
++
++ if (!values[obj.value]) {
++ if (obj.value == "") {
++ var optdef = document.createElement("option");
++ optdef.value = "";
++ optdef.appendChild(document.createTextNode(def));
++ sel.appendChild(optdef);
++ } else {
++ var opt = document.createElement("option");
++ opt.value = obj.value;
++ opt.selected = "selected";
++ opt.appendChild(document.createTextNode(obj.value));
++ sel.appendChild(opt);
++ }
++ }
++
++ for (var i in values) {
++ var opt = document.createElement("option");
++ opt.value = i;
++
++ if (obj.value == i) {
++ opt.selected = "selected";
++ }
++
++ opt.appendChild(document.createTextNode(values[i]));
++ sel.appendChild(opt);
++ }
++
++ var optman = document.createElement("option");
++ optman.value = "";
++ optman.appendChild(document.createTextNode(man));
++ sel.appendChild(optman);
++
++ obj.style.display = "none";
++
++ cbi_bind(sel, "change", function() {
++ if (sel.selectedIndex == sel.options.length - 1) {
++ obj.style.display = "inline";
++ sel.parentNode.removeChild(sel);
++ obj.focus();
++ } else {
++ obj.value = sel.options[sel.selectedIndex].value;
++ }
++
++ try {
++ cbi_d_update();
++ } catch (e) {
++ //Do nothing
++ }
++ })
++
++ // Retrigger validation in select
++ sel.focus();
++ sel.blur();
++}
++
++function cbi_combobox_init(id, values, def, man) {
++ var obj = document.getElementById(id);
++ cbi_bind(obj, "blur", function() {
++ cbi_combobox(id, values, def, man)
++ });
++ cbi_combobox(id, values, def, man);
++}
++
++function cbi_filebrowser(id, url, defpath) {
++ var field = document.getElementById(id);
++ var browser = window.open(
++ url + ( field.value || defpath || '' ) + '?field=' + id,
++ "luci_filebrowser", "width=300,height=400,left=100,top=200,scrollbars=yes"
++ );
++
++ browser.focus();
++}
++
++function cbi_browser_init(id, respath, url, defpath)
++{
++ function cbi_browser_btnclick(e) {
++ cbi_filebrowser(id, url, defpath);
++ return false;
++ }
++
++ var field = document.getElementById(id);
++
++ var btn = document.createElement('img');
++ btn.className = 'cbi-image-button';
++ btn.src = respath + '/cbi/folder.gif';
++ field.parentNode.insertBefore(btn, field.nextSibling);
++
++ cbi_bind(btn, 'click', cbi_browser_btnclick);
++}
++
++function cbi_dynlist_init(name, respath, datatype, optional, choices)
++{
++ var input0 = document.getElementsByName(name)[0];
++ var prefix = input0.name;
++ var parent = input0.parentNode;
++ var holder = input0.placeholder;
++
++ var values;
++
++ function cbi_dynlist_redraw(focus, add, del)
++ {
++ values = [ ];
++
++ while (parent.firstChild)
++ {
++ var n = parent.firstChild;
++ var i = parseInt(n.index);
++
++ if (i != del)
++ {
++ if (n.nodeName.toLowerCase() == 'input')
++ values.push(n.value || '');
++ else if (n.nodeName.toLowerCase() == 'select')
++ values[values.length-1] = n.options[n.selectedIndex].value;
++ }
++
++ parent.removeChild(n);
++ }
++
++ if (add >= 0)
++ {
++ focus = add+1;
++ values.splice(focus, 0, '');
++ }
++ else if (values.length == 0)
++ {
++ focus = 0;
++ values.push('');
++ }
++
++ for (var i = 0; i < values.length; i++)
++ {
++ var t = document.createElement('input');
++ t.id = prefix + '.' + (i+1);
++ t.name = prefix;
++ t.value = values[i];
++ t.type = 'text';
++ t.index = i;
++ t.className = 'cbi-input-text';
++
++ if (i == 0 && holder)
++ {
++ t.placeholder = holder;
++ }
++
++ var b = document.createElement('img');
++ b.src = respath + ((i+1) < values.length ? '/cbi/remove.gif' : '/cbi/add.gif');
++ b.className = 'cbi-image-button';
++
++ parent.appendChild(t);
++ parent.appendChild(b);
++ parent.appendChild(document.createElement('br'));
++
++ if (datatype)
++ {
++ cbi_validate_field(t.id, ((i+1) == values.length) || optional, datatype);
++ }
++
++ if (choices)
++ {
++ cbi_combobox_init(t.id, choices[0], '', choices[1]);
++ t.nextSibling.index = i;
++
++ cbi_bind(t.nextSibling, 'keydown', cbi_dynlist_keydown);
++ cbi_bind(t.nextSibling, 'keypress', cbi_dynlist_keypress);
++
++ if (i == focus || -i == focus)
++ t.nextSibling.focus();
++ }
++ else
++ {
++ cbi_bind(t, 'keydown', cbi_dynlist_keydown);
++ cbi_bind(t, 'keypress', cbi_dynlist_keypress);
++
++ if (i == focus)
++ {
++ t.focus();
++ }
++ else if (-i == focus)
++ {
++ t.focus();
++
++ /* force cursor to end */
++ var v = t.value;
++ t.value = ' '
++ t.value = v;
++ }
++ }
++
++ cbi_bind(b, 'click', cbi_dynlist_btnclick);
++ }
++ }
++
++ function cbi_dynlist_keypress(ev)
++ {
++ ev = ev ? ev : window.event;
++
++ var se = ev.target ? ev.target : ev.srcElement;
++
++ if (se.nodeType == 3)
++ se = se.parentNode;
++
++ switch (ev.keyCode)
++ {
++ /* backspace, delete */
++ case 8:
++ case 46:
++ if (se.value.length == 0)
++ {
++ if (ev.preventDefault)
++ ev.preventDefault();
++
++ return false;
++ }
++
++ return true;
++
++ /* enter, arrow up, arrow down */
++ case 13:
++ case 38:
++ case 40:
++ if (ev.preventDefault)
++ ev.preventDefault();
++
++ return false;
++ }
++
++ return true;
++ }
++
++ function cbi_dynlist_keydown(ev)
++ {
++ ev = ev ? ev : window.event;
++
++ var se = ev.target ? ev.target : ev.srcElement;
++
++ if (se.nodeType == 3)
++ se = se.parentNode;
++
++ var prev = se.previousSibling;
++ while (prev && prev.name != name)
++ prev = prev.previousSibling;
++
++ var next = se.nextSibling;
++ while (next && next.name != name)
++ next = next.nextSibling;
++
++ /* advance one further in combobox case */
++ if (next && next.nextSibling.name == name)
++ next = next.nextSibling;
++
++ switch (ev.keyCode)
++ {
++ /* backspace, delete */
++ case 8:
++ case 46:
++ var del = (se.nodeName.toLowerCase() == 'select')
++ ? true : (se.value.length == 0);
++
++ if (del)
++ {
++ if (ev.preventDefault)
++ ev.preventDefault();
++
++ var focus = se.index;
++ if (ev.keyCode == 8)
++ focus = -focus+1;
++
++ cbi_dynlist_redraw(focus, -1, se.index);
++
++ return false;
++ }
++
++ break;
++
++ /* enter */
++ case 13:
++ cbi_dynlist_redraw(-1, se.index, -1);
++ break;
++
++ /* arrow up */
++ case 38:
++ if (prev)
++ prev.focus();
++
++ break;
++
++ /* arrow down */
++ case 40:
++ if (next)
++ next.focus();
++
++ break;
++ }
++
++ return true;
++ }
++
++ function cbi_dynlist_btnclick(ev)
++ {
++ ev = ev ? ev : window.event;
++
++ var se = ev.target ? ev.target : ev.srcElement;
++
++ if (se.src.indexOf('remove') > -1)
++ {
++ se.previousSibling.value = '';
++
++ cbi_dynlist_keydown({
++ target: se.previousSibling,
++ keyCode: 8
++ });
++ }
++ else
++ {
++ cbi_dynlist_keydown({
++ target: se.previousSibling,
++ keyCode: 13
++ });
++ }
++
++ return false;
++ }
++
++ cbi_dynlist_redraw(NaN, -1, -1);
++}
++
++//Hijacks the CBI form to send via XHR (requires Prototype)
++function cbi_hijack_forms(layer, win, fail, load) {
++ var forms = layer.getElementsByTagName('form');
++ for (var i=0; i<forms.length; i++) {
++ $(forms[i]).observe('submit', function(event) {
++ // Prevent the form from also submitting the regular way
++ event.stop();
++
++ // Submit via XHR
++ event.element().request({
++ onSuccess: win,
++ onFailure: fail
++ });
++
++ if (load) {
++ load();
++ }
++ });
++ }
++}
++
++
++function cbi_t_add(section, tab) {
++ var t = document.getElementById('tab.' + section + '.' + tab);
++ var c = document.getElementById('container.' + section + '.' + tab);
++
++ if( t && c ) {
++ cbi_t[section] = (cbi_t[section] || [ ]);
++ cbi_t[section][tab] = { 'tab': t, 'container': c, 'cid': c.id };
++ }
++}
++
++function cbi_t_switch(section, tab) {
++ if( cbi_t[section] && cbi_t[section][tab] ) {
++ var o = cbi_t[section][tab];
++ var h = document.getElementById('tab.' + section);
++ for( var tid in cbi_t[section] ) {
++ var o2 = cbi_t[section][tid];
++ if( o.tab.id != o2.tab.id ) {
++ o2.tab.className = o2.tab.className.replace(/(^| )cbi-tab( |$)/, " cbi-tab-disabled ");
++ o2.container.style.display = 'none';
++ }
++ else {
++ if(h) h.value = tab;
++ o2.tab.className = o2.tab.className.replace(/(^| )cbi-tab-disabled( |$)/, " cbi-tab ");
++ o2.container.style.display = 'block';
++ }
++ }
++ }
++ return false
++}
++
++function cbi_t_update() {
++ var hl_tabs = [ ];
++ var updated = false;
++
++ for( var sid in cbi_t )
++ for( var tid in cbi_t[sid] )
++ {
++ if( cbi_c[cbi_t[sid][tid].cid] == 0 ) {
++ cbi_t[sid][tid].tab.style.display = 'none';
++ }
++ else if( cbi_t[sid][tid].tab && cbi_t[sid][tid].tab.style.display == 'none' ) {
++ cbi_t[sid][tid].tab.style.display = '';
++
++ var t = cbi_t[sid][tid].tab;
++ t.className += ' cbi-tab-highlighted';
++ hl_tabs.push(t);
++ }
++
++ cbi_tag_last(cbi_t[sid][tid].container);
++ updated = true;
++ }
++
++ if( hl_tabs.length > 0 )
++ window.setTimeout(function() {
++ for( var i = 0; i < hl_tabs.length; i++ )
++ hl_tabs[i].className = hl_tabs[i].className.replace(/ cbi-tab-highlighted/g, '');
++ }, 750);
++
++ return updated;
++}
++
++
++function cbi_validate_form(form, errmsg)
++{
++ /* if triggered by a section removal or addition, don't validate */
++ if( form.cbi_state == 'add-section' || form.cbi_state == 'del-section' )
++ return true;
++
++ if( form.cbi_validators )
++ {
++ for( var i = 0; i < form.cbi_validators.length; i++ )
++ {
++ var validator = form.cbi_validators[i];
++ if( !validator() && errmsg )
++ {
++ alert(errmsg);
++ return false;
++ }
++ }
++ }
++
++ return true;
++}
++
++function cbi_validate_reset(form)
++{
++ window.setTimeout(
++ function() { cbi_validate_form(form, null) }, 100
++ );
++
++ return true;
++}
++
++function cbi_validate_compile(code)
++{
++ var pos = 0;
++ var esc = false;
++ var depth = 0;
++ var stack = [ ];
++
++ code += ',';
++
++ for (var i = 0; i < code.length; i++)
++ {
++ if (esc)
++ {
++ esc = false;
++ continue;
++ }
++
++ switch (code.charCodeAt(i))
++ {
++ case 92:
++ esc = true;
++ break;
++
++ case 40:
++ case 44:
++ if (depth <= 0)
++ {
++ if (pos < i)
++ {
++ var label = code.substring(pos, i);
++ label = label.replace(/\\(.)/g, '$1');
++ label = label.replace(/^[ \t]+/g, '');
++ label = label.replace(/[ \t]+$/g, '');
++
++ if (label && !isNaN(label))
++ {
++ stack.push(parseFloat(label));
++ }
++ else if (label.match(/^(['"]).*\1$/))
++ {
++ stack.push(label.replace(/^(['"])(.*)\1$/, '$2'));
++ }
++ else if (typeof cbi_validators[label] == 'function')
++ {
++ stack.push(cbi_validators[label]);
++ stack.push(null);
++ }
++ else
++ {
++ throw "Syntax error, unhandled token '"+label+"'";
++ }
++ }
++ pos = i+1;
++ }
++ depth += (code.charCodeAt(i) == 40);
++ break;
++
++ case 41:
++ if (--depth <= 0)
++ {
++ if (typeof stack[stack.length-2] != 'function')
++ throw "Syntax error, argument list follows non-function";
++
++ stack[stack.length-1] =
++ arguments.callee(code.substring(pos, i));
++
++ pos = i+1;
++ }
++ break;
++ }
++ }
++
++ return stack;
++}
++
++function cbi_validate_field(cbid, optional, type)
++{
++ var field = (typeof cbid == "string") ? document.getElementById(cbid) : cbid;
++ var vstack; try { vstack = cbi_validate_compile(type); } catch(e) { };
++
++ if (field && vstack && typeof vstack[0] == "function")
++ {
++ var validator = function()
++ {
++ // is not detached
++ if( field.form )
++ {
++ field.className = field.className.replace(/ cbi-input-invalid/g, '');
++
++ // validate value
++ var value = (field.options && field.options.selectedIndex > -1)
++ ? field.options[field.options.selectedIndex].value : field.value;
++
++ if (!(((value.length == 0) && optional) || vstack[0].apply(value, vstack[1])))
++ {
++ // invalid
++ field.className += ' cbi-input-invalid';
++ return false;
++ }
++ }
++
++ return true;
++ };
++
++ if( ! field.form.cbi_validators )
++ field.form.cbi_validators = [ ];
++
++ field.form.cbi_validators.push(validator);
++
++ cbi_bind(field, "blur", validator);
++ cbi_bind(field, "keyup", validator);
++
++ if (field.nodeName == 'SELECT')
++ {
++ cbi_bind(field, "change", validator);
++ cbi_bind(field, "click", validator);
++ }
++
++ field.setAttribute("cbi_validate", validator);
++ field.setAttribute("cbi_datatype", type);
++ field.setAttribute("cbi_optional", (!!optional).toString());
++
++ validator();
++
++ var fcbox = document.getElementById('cbi.combobox.' + field.id);
++ if (fcbox)
++ cbi_validate_field(fcbox, optional, type);
++ }
++}
++
++function cbi_row_swap(elem, up, store)
++{
++ var tr = elem.parentNode;
++ while (tr && tr.nodeName.toLowerCase() != 'tr')
++ tr = tr.parentNode;
++
++ if (!tr)
++ return false;
++
++ var table = tr.parentNode;
++ while (table && table.nodeName.toLowerCase() != 'table')
++ table = table.parentNode;
++
++ if (!table)
++ return false;
++
++ 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]);
++
++ break;
++ }
++ }
++
++ 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);
++ }
++
++ var input = document.getElementById(store);
++ if (input)
++ input.value = ids.join(' ');
++
++ return false;
++}
++
++function cbi_tag_last(container)
++{
++ var last;
++
++ for (var i = 0; i < container.childNodes.length; i++)
++ {
++ var c = container.childNodes[i];
++ if (c.nodeType == 1 && c.nodeName.toLowerCase() == 'div')
++ {
++ c.className = c.className.replace(/ cbi-value-last$/, '');
++ last = c;
++ }
++ }
++
++ if (last)
++ {
++ last.className += ' cbi-value-last';
++ }
++}
++
++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)
++ return;
++
++ var html_esc = [/&/g, '&#38;', /"/g, '&#34;', /'/g, '&#39;', /</g, '&#60;', />/g, '&#62;'];
++ var quot_esc = [/"/g, '&#34;', /'/g, '&#39;'];
++
++ function esc(s, r) {
++ for( var i = 0; i < r.length; i += 2 )
++ s = s.replace(r[i], r[i+1]);
++ return s;
++ }
++
++ var str = this;
++ var out = '';
++ var re = /^(([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X|q|h|j|t|m))/;
++ var a = b = [], numSubstitutions = 0, numMatches = 0;
++
++ while( a = re.exec(str) )
++ {
++ var m = a[1];
++ var leftpart = a[2], pPad = a[3], pJustify = a[4], pMinLength = a[5];
++ var pPrecision = a[6], pType = a[7];
++
++ numMatches++;
++
++ if (pType == '%')
++ {
++ subst = '%';
++ }
++ else
++ {
++ if (numSubstitutions < arguments.length)
++ {
++ var param = arguments[numSubstitutions++];
++
++ var pad = '';
++ if (pPad && pPad.substr(0,1) == "'")
++ pad = leftpart.substr(1,1);
++ else if (pPad)
++ pad = pPad;
++
++ var justifyRight = true;
++ if (pJustify && pJustify === "-")
++ justifyRight = false;
++
++ var minLength = -1;
++ if (pMinLength)
++ minLength = parseInt(pMinLength);
++
++ var precision = -1;
++ if (pPrecision && pType == 'f')
++ precision = parseInt(pPrecision.substring(1));
++
++ var subst = param;
++
++ switch(pType)
++ {
++ case 'b':
++ subst = (parseInt(param) || 0).toString(2);
++ break;
++
++ case 'c':
++ subst = String.fromCharCode(parseInt(param) || 0);
++ break;
++
++ case 'd':
++ subst = (parseInt(param) || 0);
++ break;
++
++ case 'u':
++ subst = Math.abs(parseInt(param) || 0);
++ break;
++
++ case 'f':
++ subst = (precision > -1)
++ ? ((parseFloat(param) || 0.0)).toFixed(precision)
++ : (parseFloat(param) || 0.0);
++ break;
++
++ case 'o':
++ subst = (parseInt(param) || 0).toString(8);
++ break;
++
++ case 's':
++ subst = param;
++ break;
++
++ case 'x':
++ subst = ('' + (parseInt(param) || 0).toString(16)).toLowerCase();
++ break;
++
++ case 'X':
++ subst = ('' + (parseInt(param) || 0).toString(16)).toUpperCase();
++ break;
++
++ case 'h':
++ subst = esc(param, html_esc);
++ break;
++
++ case 'q':
++ subst = esc(param, quot_esc);
++ break;
++
++ case 'j':
++ subst = String.serialize(param);
++ break;
++
++ case 't':
++ var td = 0;
++ var th = 0;
++ var tm = 0;
++ var ts = (param || 0);
++
++ if (ts > 60) {
++ tm = Math.floor(ts / 60);
++ ts = (ts % 60);
++ }
++
++ if (tm > 60) {
++ th = Math.floor(tm / 60);
++ tm = (tm % 60);
++ }
++
++ if (th > 24) {
++ td = Math.floor(th / 24);
++ th = (th % 24);
++ }
++
++ subst = (td > 0)
++ ? String.format('%dd %dh %dm %ds', td, th, tm, ts)
++ : String.format('%dh %dm %ds', th, tm, ts);
++
++ break;
++
++ case 'm':
++ var mf = pMinLength ? parseInt(pMinLength) : 1000;
++ var pr = pPrecision ? Math.floor(10*parseFloat('0'+pPrecision)) : 2;
++
++ var i = 0;
++ var val = parseFloat(param || 0);
++ var units = [ '', 'K', 'M', 'G', 'T', 'P', 'E' ];
++
++ for (i = 0; (i < units.length) && (val > mf); i++)
++ val /= mf;
++
++ subst = val.toFixed(pr) + ' ' + units[i];
++ break;
++ }
++ }
++ }
++
++ out += leftpart + subst;
++ str = str.substr(m.length);
++ }
++
++ return out + str;
++}
++
++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 = [ ];
++ for (var i = 1; i < arguments.length; i++)
++ a.push(arguments[i]);
++ return ''.format.apply(arguments[0], a);
++}
++
++String.nobr = function()
++{
++ var a = [ ];
++ for (var i = 1; i < arguments.length; i++)
++ a.push(arguments[i]);
++ return ''.nobr.apply(arguments[0], a);
++}
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/add.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/add.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..0888abf85ed10d3bdadb25b30b49e8c35b8233d9
+GIT binary patch
+literal 378
+zcmZ?wbhEHb6krfwxT?YM=;a5`&}?V#n2z-)rk?s^=Nj6%`^~-Q?==mbXC1h9`pm_a
+zJ=P67ET*3H=saLQ{j_)8HuL@?E|ZSCPdMs&_4bo#r@XE{|4_Brxch*^ymP;U605@t
+zCcgRjt!Rzz)3;yCrf*qt@%P5-e?EQtb>RNr-FN=3zVdt9tv~<4fPor7@h1x-1A_*G
+z4#+T&pBUJtADCR=A+xAY{q)Mqma1&c{a=cmxa4~mroT4KS#`Qg<xxi8Ii=?C8#5Ec
+z1dKaXR%LheoGx%Nn(3re?&qCWQ>Uof=)~+&T;I{j*sYXaTd%6BpddF%U0!DD^qC5h
+za!gM1`zFkilw?>wPi9)j8Wt9I))h*%tJiLm*{Loqq9hZ|aDstdhKpl`^aUv?Mn)zk
+OR#uKC*E=qb4Aua>fQ#$^
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/apply.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/apply.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..82ae7ed821f7524c0356e40f79a0379fc634d535
+GIT binary patch
+literal 268
+zcmV+n0rUPxNk%w1VGsZi0K^{vM3g9B!ajxBR(;h{C|4L|#z9W1FZTQNam`88@5?V|
+z96pC8chOCN)>Mw(T#DRUiQ8Fv(@#mEENRI^ZOca`PZo5~OEz>Nz2>iuw1BeWp~dOA
+zBTN<S_~`%t|NsC0A^8LW0018VEC2ui01yBW000Gv;P-iCX?mjQ8Eh*_0I;B=ksV#G
+zcZYVNtAoSwfCw6c2qU2Y8ahOyAjz<72+mGX;Ato=h$~Rik&>zi%BC{z2#%%nWDQ(&
+zkP#APQYdIRbsbb52orn(e?S)<Uuk^-h=3ys2WWc*kO3Hy9ts%=8=)H-q!<~JBLo$z
+S9IdXXDkmo?w6(S$Apkp4rEE6<
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/arrow.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/arrow.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..10d797e9b0d7c0fb0cb3e13c4e7a11508161f230
+GIT binary patch
+literal 135
+zcmV;20C@jLNk%w1VG95Y0J9DNRb+aCjh(Q!!P3^;^!4^&ZiAVkucWNFY<Z06>g~J1
+z%8r<(-QeVRgO&gP{{R30A^8LW000gEEC2ui01E&M06+vZ(8)=q0AK`A2tAn4V1q?&
+p9d!Z1mQ}E{1V<7C3PltEGGGP@1A|xv9lPESaCFRSx11yb06WwgHGu#C
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/down.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/down.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..f0bb6a4ea640d9b2beda344c7485d260f5761779
+GIT binary patch
+literal 131
+zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK
+zK=CIFBLf3BgAPaxWCjC^LBUDS)q5?HkM0ihoS_kK#PIl-D%-2j1P>Oa%ti-AnU~WT
+VI^xvQF6&qvTT*m#iwgsTH2{W9F7W^W
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/download.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/download.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..f99a5383b23fc4270a45048cea54b7d84e4c632b
+GIT binary patch
+literal 189
+zcmZ?wbhEHb6krfw*v!umwaLqI!OQM5F>k&<yZm;~h1b8h;*QR~(zECJ#wpt$FTb`}
+zVWvQGzpFsbrT<`{_>+Z^fq|bvhXDvcW-zd1eeis_YHo#<8bh&USm7b|HfiTo^1C<-
+zB2&*9?YY;WqkfgAr7?@)##fnMrp5vd5e9?B>jf-W))_Q3ne(cwV{E9XUS-Jmz%6-U
+ohKzU%--1K~l{<@Algzi@uNL9X;o>Z>(Bsa^YtS>66lAal0Is`BfB*mh
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/edit.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/edit.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..e06e37c7509d07a98a4acc6eeb5d40777fdb912f
+GIT binary patch
+literal 272
+zcmV+r0q_1tNk%v~VGsZi0Q3L=V0V>>ugJjP{dk$T<m~mR)BMKa{Yh18^Y;0&*!)yw
+ze(mw~oXz{?^8U2Z;6qDX-tYd@<nWol)#>r~sLS5q=<g{pLq0`Sy@>$-yaxZ#SE11S
+zRIB!<(fT-LmH+?$EC2ui01yBW000G*;3tk`DMpS%Nm39Du;)pl6A@EB5xm!Np4!Af
+zBnlcnph84J6a~km2eJG}oCYZJ=Ydc~*KCvvDSSTxgcd_Cm=B`#5u?d;3!M!C{uwM9
+zbQu_Bd3p~bei3zpcpDoG6^DHb2?~}900Ru06&HvI2?=-w0|2G~3!WbU5ePdx1QoIi
+W4i<=*mj?$A4;L2}RVKnBApkpjesy~Q
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/fieldadd.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/fieldadd.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..eebe0fffe007105e4ce41a133cd245989df89116
+GIT binary patch
+literal 371
+zcmZ?wbh9u|6krfw_{zZW|GeMpEk^&ppZIqp{q-#2*GpypKk@m0DeV7?)PKK@zCNA$
+z`dro2lOEGfdA01Zo^;&3Zkzdpqptt|eeXPA|NqbH{v$3`n~kTR_U=C5@c+lT*LU_b
+z?6CO%>(2l8{r~^I{r|G{^@*_mA7}snwCwdU*P=DL|Gypj|E%Km1>^spH~#;&>;M1%
+z43q&Kkamz?7}#bwOfB%x;WE_{^4uEG;IQ~&rq>>Ww&uf$2W&Y#d)-qvvCKHjo^RAt
+z=rC<r#h=Auc{+!Kvicvb5cl+Es?yZZP^xp{5)yH$YEx2Dlu>q4kYj3YZC6y3<z$>D
+zr`kV9R$fhWp_cOEnn}ymI22c}?ccD1gH4{*NnLLJyiIJo_iCwg%E_FTWYSo^f@PY2
+SKp-O{D=W)wx4SNm4AubY36m`V
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/file.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/file.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..342a8463d2912b82b01c3c2deb3ce92e7cf5e4a1
+GIT binary patch
+literal 267
+zcmZ?wbhEHb6krfw_#(~l=;a5`&}?V#n2z-)rk?s^=Nj6%`^~-Q?==mbXC1h9`pm_v
+zx1U^n{$bv^-$9Ah;RO@leEjzG?bovDTb5k>z47{=Pv3qWxc_(eoxiKE{N8r!&;S4b
+z8Bl@ZPZm}N25ANzkTA$j2G))RYJE?3%#~_R^t9#)(#g~~<{~i9eb2`WQa(qVRO0le
+zbsbdq3h6qUocb!mZs8H1wxE?+b8d7`YkJwm7Jj<WTaW$R%a2(`oqJ3toeI3O%v^~{
+zNk|~OR+yKUp|PT+sE&n&owcbdy0~M4z+@?YZc%H7g$(QhTpUgOEBW{s8JU<^SvlfV
+Kx2h;ISOWm|7jWVL
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/find.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/find.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..9ae5e3489bb888d198eb923bb095b48b04403705
+GIT binary patch
+literal 273
+zcmV+s0q*`sNk%w1VGsZi0K^{vc9*og-TcMk{nhCBh_A@i+vHYljktnV?e+bOcW6yp
+zbLH*z_4)kq_4;Q^Gl{$GpO1s<@%ZNQ{aZUCuG8g1OkMl^{;_vPn!whm%ie)&TX<hf
+zvDo~u(c}OB|NsC0A^8LW0018VEC2ui01yBW000G!peK&x_?_NBbs2^c1Rw(zN)1bt
+z>r4L_o{y)q5EzYtB;xTCWf;e!643y9FwiJ6z-cH%*eE2C&?LHF520~{Ks*+N*(+Kf
+z6ATMOGH`g(00>C|cno`e9u*=05rZ2M2z-c&9*lzt8<GbTiHi(L92^=Bq!SmMA_fHw
+XJSC>600y!Ov<els9;PL`yCDEOn8SHN
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/folder.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/folder.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..22b583bb59d0ce46153152c18a33219a0b7c2944
+GIT binary patch
+literal 698
+zcmV;r0!95tNk%w1VGsZi0LFR%5=C(rN^}@XbQnr?8A@~+OLZAbb{|oDB~^bgUx+wp
+zk~?aWKWvgjZIMB7nn7`!LUEZwahgMNnnZG%P?O73md<9Byj7UcR+-RPo6=aE(`}i-
+zTAkEeoz+~P)?J|2UZB`sq1a!d*<hpEVWit)q}yYq++?NQWTxF^r`~3$-e#!ZXQ|+5
+zs^Dm=;c2VlX{_UFtmA5}<7=(tY_8;NuH|j7<!-O$Zm{NWvFC8H=Ww#<akJ@`t-*4%
+z>2kE{g|XOkwd;Ab>T|a1bhhkywd#Ad>UFp6cDL<(x9okm?0&fIc)IU+y6}9u?s>cL
+zfV%E`yz-8@;ex#Gf4%XLy5fSp@qxbce!umEzVU^>^M=3jgu(QP!1I*9=ZV7fhQs%Y
+z!}W;8`Hsf-i^%(t$N7xO{E^A|kjnj(%lw$n{+-VKn$iE9(f_H_`l{6Xr`i9>)!(q%
+z|FPQtvD^Q);Q!Lx<?izJ{{H^||Nl>t%1@HYPm;<{lFCn#%1@HYA^uK7a%Ew3Wn>^?
+zc_2$=c4=-POmAarWh@{vFflPLFf%PMG$3Ygav)4~LrE?mAW~&)Wnpt=WFTp7bZ;PZ
+zXk{Q!bz*F3V<1FtZDDC{E&w6<1OW;Fe*i210000G01yBG2gQJYf`f#Ge|UL`iiU%E
+z4Fdv^0C9|ec>{8Eb8>YId5n1ib8n<>Ks|P;sdtD5UQ)1C8wn8(4i5?li3bZ45)%*>
+zXk1rRPHh5-0dQtyVqi@~J~=fnVacIvSW!$zKRPxsEGSyo0%}i4K|41xEh!};Rs@Lx
+zX+u0XGcGD7A|D)}m^+h$#)}mvMu6y$;erx+p~k=%M<Rp=4Hzm=C<3v-nlD|pWSIhG
+gNfIMM$`nY{pg^RT0tm<?P@q8`M2d3iycq}pJC$!+6aWAK
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/help.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/help.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..9dfa0e196aba9bf0dd70074ccdb980d07de9e903
+GIT binary patch
+literal 266
+zcmV+l0rmbzNk%w1VGsZi0K^{vX}bO=Q+JG$m|w5)cDL-S*7{tb+@Z<qW~$>?p4qk8
+z_sQn}X|3gLf|Hfa{4HFBMq+vzJXv+X|6!-#{r&xKvgu!?-l)&;*zNvYc8feuU~I4F
+zQ<~I5R%ieJ|NsC0A^8LW0018VEC2ui01yBW000Gt;3s}wX?kNyLPFa#5UP3^wk(CC
+zKe9+;gdm|(VMuts4zO}DT@VOK1m)={2pi9Zf$&VC9jdjm*+RV&K$v9RFu0|I!2+1F
+z6;Q;%BcIpB1z!^u289U*e{2p3gL?-F2^@(e8U&FXn3w<oJ(L6h1EB+(9uzYg4-WwW
+Q4^yTpBqt@Xw6!4sJBdwm?EnA(
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/key.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/key.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..e3853e5afd54d40a853e4cb7934917316f073e7d
+GIT binary patch
+literal 230
+zcmZ?wbhEHb6krfwI3mt)cB=6G?XEvwEV;5k@%#*tlih-MHikVr5_NB*)q`F6Z*J|r
+zvPAsmO8wiLbI(i?dbrK;$sVs`?flOVdj0+R=-Z?2x2F^Tg8>5$p!k!8k%2*+K?fuc
+zvXg-|`GIQRqSUCAs4#&;3tm~By~MCQ%rwwORo7gy-yy?BWny%m`4$Z=kEQF}JtY=+
+zUfLA?(#?Ar^XBeQKBmcC4v)^p`DK_cQ206RTqffIk;3UrB1Hyj7R*hC%3_Rs)g7Jc
+Jeaeaq)&Qp@T0Z~)
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/link.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/link.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..f0bb78da6b1e2cb17aa1a0e21c80e02979f6321a
+GIT binary patch
+literal 279
+zcmV+y0qFimNk%w1VGsZi0K^{vm&^Qekgn|U_T}yMiLlDm+vLaN{=MG)S8$O@RcrG0
+z`m5CYWS!x)+5Dr>`-!{kQek_q(&TBN;zLVZ)#vbFn&Fzj)~L(g-skTrF+)B@RpROJ
+ze4)L|%+de<|NsC0A^8LW0018VEC2ui01yBW000G)peK&x_?;dVMVDm}1jhw|hep&O
+z==<P52%9G|Fc^)8q~ZY-T@*({QmIftL>8z~GHrORSgnM6@HQ4;4*@!6xGR+fIw4vg
+zByI*g?ikQL90EyhXA2I80}~>FNeyv^hX5Oj9sz=0a*zN37#bo03T1_nn*yF52n7l~
+d8?74{0v#Ej2(=Ip2?-Mu8X6f_CBY>j06X7qcdP&a
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/reload.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/reload.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..8268958a19e016741fffb8309b1174e548f5ce19
+GIT binary patch
+literal 248
+zcmV<U00;j^Nk%w1VGsZi0K^{vx#E*%mqPyj{nPHZz2%j++Lf)#nQov-YMn!8m_%xt
+zNVnXRp1g^Q)Ii?y%wCZ^wAYo0)IY`WnTOCow%C`5(LiXLLc{Ku*7Cc#;FQzzu(jBg
+z{{H?@hb#a8|NsC0A^8LW0018VEC2ui01yBW000Gb;3tk=>51h?dP)!|<#Vc>gJ1)O
+z9Y&Xm98YHe08|<ajBi%zFgj4mBtr0UfI^F@b0K7wq=Y93ErU(ywCU3{TRq}cM{|)Z
+yJr*lUD2YrcWluj%5(^C#MG!s$as~$l1sf0w4p%B3GAu4IGnY(jDxspIApkq&UTtpx
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/remove.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/remove.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..bf43a0a0bc63494a69a63fe5d0fef5b683be221d
+GIT binary patch
+literal 385
+zcmZ?wbhEHb6krfwxT?gk?be@1FF$yOW;=VwbgVxy_0*pO_y5|thVH)ew{!QK(`PQu
+zI&kgY^Y@yD&g(8ez54vahKr9^oW6JU_LF(%eg`F1hZjuTc>T}nE5Daq{Qc(Rx3cM5
+zjz9kQ*3j_j+pnL#{d)WH+j&{p|6ssC8=&};g^__li9rWsJjhQBZ1WCGDDaT!>RZ^(
+zEEK83!O|Nd>|`Z3*C*`uOEs;l0!ub)PUp?=f27@0VfU<`vGKzV%|l1oS?<>Z^@_<=
+zC~_&t)O6G|iMKeh$aQzhi;0Q%F-^$to;pK9LUxv-l;q?Z@dd)N%uel7=1K?)Gp=1y
+z$56M4m6eCxNh-frev|MX$^D9=LUJ*T=NWk<xp)tVUKbHzVq#`yXXkBoeeB}MU=0BC
+CGJ~i9
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/reset.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/reset.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..c941c19028c479d4a27a7ee04d6e0e66b6bce599
+GIT binary patch
+literal 258
+zcmZ?wbhEHb6krfwI3myRx}@ZPMa9G9<ZoNH{6Bf}V|@IdsZ;+gTQ)g2_g_|4rMmj{
+z(9maDS@+`NX7u!ASy;5{>sPtC-3SYNk)IzaCG{5wQd4hOTmQRpBi`QrZFzZjOw5(w
+z;B+Ua|6ri_lZBCiL7qW}0SG{LGO*S^P_K*2tV;HB^Xpa+Tva9QCeXgnd6P%76fc9p
+zOamsHcy<jHDaj@V)~7Fd+U7kvs@!3>;@YDln|Vuw<0nl$s8=rCxw48uw_56lMa6}$
+zEFa1XibC1A+uFH>WUA~WrMhG$PUPgWRp}FBoy96PRn(YYfNQZp@O&*5b=4JX)+#bs
+F0{{l~XioqD
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/save.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/save.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..35e949963e4b7a5f04fd1c8932a980901e3d4385
+GIT binary patch
+literal 263
+zcmV+i0r>t$Nk%w1VGsZi0K^{vcEd+Ya4xgmmXXkDk(iA6{P)e~xr@?RgUwTMzeLpS
+z#Wq<Qev@rdf-IBfSBd0I?DyrU<#)p7sa<+Te$_{S%TJ8uP)uMvaf@7w&S0e4cYxVQ
+zX}CU8XF~t~|NsC0A^8LW0018VEC2ui01yBW000Gq;3s}wX?kNyPDINv6RLWcVMtLP
+zHL^$>hu{H$s5p4O4v<)^3=A2^0_EulhRp%QGjIf`R%Ru$RUj;1k~O1%3=|$g0$`b{
+z1p`T8E1%cF0ssJ7eF+H<c2yc2f`*119DhC+2MLgu91m$D9+VFhpc|SV1v3{7sHjst
+NDJLc>u(2Z{06R}5X@39!
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/up.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/up.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..e8234178efaea626368f6bb5fffaa716e862b596
+GIT binary patch
+literal 130
+zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK
+zK=CIFBLf3BgAPaxWCjC^e!)r4)q5>o$4-6JJxOK08WYFNxvd2&rdbFb<OrUZ!LX#g
+UlR55X`tH~w%Lzq0I~f?P0f*=?AOHXW
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/user.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/user.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..dcb5c2a899c84ee0be36e6b92222cdde6fbb8ad3
+GIT binary patch
+literal 246
+zcmV<S015v`Nk%w1VGsZi0K^{vRe+{&p2Z$9Q&fPZqIXJAd7&shX0w%ZEk|)gXp{2j
+z-Xk_#@8Z@{e4}TTyG?bS$(wa2JY~+MgN?P=HdBBuM{;O)f5Vh$I97wPc14L{GU?aG
+zs?hR&tkwVj|NsC0A^8LW0018VEC2ui01yBW000GZ;3tk=>5VArX{>gpqy}ZQ3xBIb
+z?{>Ooo8TtXQxO=NV3P1sT@;64^wK0*F2c<PQ^f%|n2UG|ZhF3*4rYz%OgM<wnUk(}
+w9Dz<mKHwDSX#pGt9RhrQfE|K_h9nJt9FdU=jVc}w2^bU=dtD?ZB`F~QJA~0^RR910
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/bridge.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/bridge.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..7faadecf92cf03e26ed917924ecd0a27d0385265
+GIT binary patch
+literal 681
+zcmV;a0#^NrP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007TNkl<Zcmbu*
+zQ-B;n6a~;1f5*0M+qTWY+O}=mw#{K|+qTs=)v>jwY|!s`db?4bMa4uk*E7&^V9Dyc
+zWMgh=vYP%x-%#5Lzo6VH2U**iyVgo-P*q)tn%ZherM0YH!Rl3rPl$o4x=;vkIC|^|
+zw(QuBZoPXUD<=z2pFig03K>Y3T?fn??iKbO*bfhHFYq2bx(}&L0+H%=F_^H3a7>&!
+z4RaPO#Hg|3z<a-eo`JR%nCRFT3>`TVQ)bM-=<y#W@HZ2y3B+LBJ-x7Y^$2WOHx?Rd
+zvwqwlDkcu=*N(xqty8dO)ll#x>^TdU&KDOJ=Ht$t+qiP=GM>G71}`5^Jb(H0!xPM{
+zOsw+qbC8vlj>O~?gocO1%Ekt7@rG?s18rSR^}t|%+`N4WckbOlZb2sJ;pqyVg8#%t
+zOBPriIeHkkZr#AK6Nhm2+$p$uxZvKy+Z_J~YT~sW1A~LmYWOO|r5ABBMHRm(j7;<l
+z42|{HldFf5dt_uVw2Vw3QOdcL^f=DP&kIVW0tpFGAaZT8-ZlrCA-i$m&Rdw88KO<Q
+zHnZq!>-D^$<|pC8a`tf5)uos+eaaEy_4FOA8!W>Tvz&)h=PtGzKVhW(go$Ij6Ek4Y
+z0D5n_PI|dX)E>+gIwL151@jipDI%u%Jnv3gfl^G>NVrc#4d^TL7tE#4HoKJZr>E1T
+z<c{=Fhh@RTR$3R83p^^(byavjVw&|BM?W=D5YlIZT^=<2B@lR2LEXO=>V6Vzw9mu1
+zt${s>86`@fKdIkozQe+?f{28^8zM})EplAS_Yt!|KZ$;;%cLFuHTKCnlMK4D)%383
+P00000NkvXXu0mjfn6E|q
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/bridge_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/bridge_disabled.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..b3e620b3a13f5cca1337f191465c02d38b5e0286
+GIT binary patch
+literal 405
+zcmV;G0c!q<P)<h;3K|Lk000e1NJLTq000mG000mO1ONa4wfZ;e00048Nkl<ZcmZ9<
+z18`kI7=Y1lx3+EDwr$(CZQHi(c5B=As0~N4abNye_Y4ooZNW}qb2QVBZdedQrE^x;
+z%o?(O5EgOX>XgfdHy`b=G@5WUE}34>!TN1&;yD{=B@v35{pF6sd@);$7(esk@z{29
+z=b&k7I+(gf%qyb-PB9Wg12Q3Kz>i#Hq8dQV5lT>y{D8uZ+YDwaM=3+7C{m`!keRLo
+z;Eo^^PvImrNy`IqkS3K<DZkQ(TzHa(%lL}c!Ecz}Drlh;P_F6b?H13Jjnci5zjPB9
+zQtQ9j{-@jPyGV~r*_175&rNgx48YWvn{Qmc@%V1@-B7UDj@Pr#w;kAEP@{ZM5n$q~
+z{SSseyYi;PGH97=+pDqX(8TCSj1{*x&#RRaphJlTE7yMLQW%Pp#E^nZK5Tih_WqV<
+zo1ZWFFfcz1!%nrXJ#=QT-tFq4U<x+%ZL^C6!T5lMHJ+Nf00000NkvXXu0mjfh4#T7
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/encryption.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/encryption.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..77628336045bf443bb8d2430a8210fbf0a4139e8
+GIT binary patch
+literal 920
+zcmV;J184k+P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv000ADNkl<ZcmdUw
+zGn_PM9LK-U%<i6E`xrY-%q~V5vx@CHtb=P})Uj<lX<qB>TaF(5v-8Qs=d1D?^QQs-
+zdno3Hi-2>1bwCcN0yW?P;CsNZ2;8&RUV9BZ_0&@`Ffbs4gM;$**I&ys&pcySuU;Ji
+zw*rmRiS?No-Irf}`K>R!@WQe>3B_WOFbr9~d^v4xZR*fN56z8@jh)=n)3XBjbiPi`
+zIO?dQg2~BA`RS*hqO;FFdk4@146RwSX8hV~uhl>Q{Ik6J>Z@|fDW`<Moj}XnV~1Dk
+z%4E}~O>)pd2Ymx<25tmS1+J;P__a<Fr*U<6cbm+?-awwYpq_7Ocz9So`|Ps_7zC~Z
+zjt4q{mB3jY9UUXPckh<8pUmCSKr??sj%iSjp-`*Us8lKd39tp|1%?3)yw}&)rwfGw
+zts6D~EXyMDW_(Q7HhB-Vwy(c2j14EAd=@qi`0lIE8JjHAwstu|ln^DF#zLO`I@ZyC
+z@X?ftC3-h~M;uhx(pP+;s<{-10GX-~ncVsj&MAy>IID3kAuNtyo%vIh0L~hmj<Iow
+zjY7VA>uIiht{>oVU=t8d8IckQ$9GX4-i5Uq8`p@F2x|-|@RWy$V2s8l0j4@h5|nTV
+z88!ghrzLRCBGzOZAPN*fdUMYM<)Or(lmeA*tNQ5Up~&C^is?%hL<B?#t7S}5B~D_D
+zF?f)&AOdMWIu0rL7OOSZ3IE2_5qUnTQspUDY}i1OgqXO7(+Prycz|;_-IB&vk8%(J
+zP|S@0XED}bl7!OeAX-PnQJ9vRvZv7?0wxJ@se>G#Am``iMj$AB<>Tk_tZeN>Clz!Y
+zr-dUzMj%L9u&z-Z9zvYZ*s>DnnFE0{I31yr8pV-u!YCvO1FX?$nUGT`CuwB3I3VXc
+zoU{0a#<_OjA$}guYhYD-SJpv{a|ZB00U~MsSRGOs>Zj1yh}I2rBfwe&i&#xis*uFt
+z@6Wt3e?G1NPRE!yK;`l@HZP|#UYyhapyjB&n@?y~HL9aMgyl(s$^=n51toM?NpFfX
+zF_OeMQ3xJkwZzBYY~kCT!N<VoSsC$EjK=_v0kVMUBj7IJNT4Y*JEf~tKpU_D$TN3X
+uU=-*B#sH(38h&=;0-%^X1kl-J0Dc2nd-zm`6!0|w0000<MNUMnLSTZBp{Xwb
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/encryption_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/encryption_disabled.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..9a8721b02c1f32d0a38ad5a2909309c64d10e89c
+GIT binary patch
+literal 888
+zcmV-;1Bd*HP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0009&Nkl<Zcmds$
+z1B^Xa6o<ciXKj18wrxaz#K}etYPWG3)V6H}wQcin+g$t2o4GiBJ9){A`W9)_Z_G32
+z`_1Kl$$7wgz$oxF@Bwff{}H$EzyJQbUViyy*}Z$W{Q2jf^6IOvx`u{^6mSu<K$GLi
+z3of|eh6M{2w9T70kKy5A8XFrq_0&`KLk~Svde&KIJrCT>ESZ1ONhhU-hK6MM^5qlV
+z-QA0TC{tkPHP>7dEnT`)KK}S)nLBsxSfX$ie6)T0c3Hc2tsHmUaqj|u0%rhc)zsAd
+za_zO(rY3bg{q)l@@D?*A<9N8Ir$>JO{r3rA18^=-3Mk;Dj*gC<+qP|!$!vfX%#=e8
+zIV9Y?d9!@=)mP)dN}vu<<k-Gw(IWZc^Unp?%PhDD*qvP-2dWxN^<zgL*ebP^rIN`)
+z9)IjHdHm5wq_ntDnrbVO^Oa@A$#(y?207;FqvX&-4wkltN;!VN8mTDcO`uefqY9`2
+z9MA)pp$$Lay~0|LcLwic!r@+=w*V+W0Pif`M7Su#r9&2c@d}r}z6;>^0&<KdOAeGk
+zIIxw`o~<}%aM1)&oW@xT3bfLQ2-X^0oWhO|5vNA*2w7S*dGOvL&XV9k6es`%T5Hf6
+zr4>pkP#Tm%sQ{geFDM`{f{1_!;rJ*v9w&+;thHzWtq}nir7%%QQQ&aK;JlE9yakjF
+z(Alr7X=x#jLu^KqH!*@nG~hknlqdQ|d-fmzis===JFK(VIA)}855}a4(qR%RN+)VW
+zz{VkdvV#IZK|xLoI=>)Apn{CZLTXz(sm*jz-`Yl9Yb&+Q&Do`ihUUi1xq9$|c%h`c
+zc6uF%w|JAr#1jnn4iKh8;xL7?CJB=Qh4PXp^HGX|z~j9mC@Pt51{w(p(Ylzr_O5IO
+z5#C!sg91bn|IUPr?cGIDNeRXjPcsAO5FFwRsgW__C?xsktwrU+Oa_^aQmBl|lCo;X
+z28O3q;DPVIc>lTs+AEpp+le)X*rahL!ih(t&_R+9i6%6niWnam;@1W10e%FW;$H~h
+z6bF|8moamG1il2mQ$U^?)B$Zk3sA`PaX=riQ<0wlC<KZC#q<%t0OlW*8M2XxWZeV+
+O0000<MNUMnLSTYr)1jaM
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/ethernet.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/ethernet.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..e3d24f2791bcdb1b79e3dcc2e857972d0d1fd0cb
+GIT binary patch
+literal 701
+zcmV;u0z&<XP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007nNkl<Zcmajc
+z17PG@6b9h`PHo$^?e-aK+qP}nwr$(C?b>#dv%Ty38%Bo=6^tD}viZON)Y&0P5~{-(
+zLtK1pTJxqY4dhWlK|z6QNN_0f3vvknBf>A}djygsQ6B(gsD$y<C=~=&A_yQ5)YUYg
+ztgHk<5cqli%OoOH696ERP?iD8ib^<f;uLHg9nrIQU!<g_fr!AbF`%XZ1W}ZrqO6K>
+z6Q{$$-U;vC$Kuw_8vqEu&PN^<G5pBFwfZj>Y8oZHDF~tpL{S8<5MbpiXxg+fI2mK2
+zOim6mnT!t-PX23PVm}dvHd7E5>c#tqD2e4O=-#s{RxV!+?#0VjG3(Z?L1tDa{;%^N
+zBBT645`p7Y@eeVS55ONDJ$B@orj48ZZe?YOyn;N^(b8cn*Q`W~mMtKP0zkhmlBldg
+zR&EBLVq+7Pl;t2uMO0W=h>suNQ&B+?d-wYNw|V?b%gTKG^Z^|FyKVvZN3`#RQFAww
+zOH6wyHug20ICYdfyxqH?29KZJXMEz|Lc6X$J8I*78o%Ws#l?Q0sF;YosD)pLmEiE#
+zkiBn4Z@f!x4JPcW^QZ5q@NmE0_{O~9GDnv->xTR`aL>-xQ%`>AJm+j-!?8zRdUn|0
+z2rjbk&Lg8Y+#yxJp1onwS=*)Ew*Q>lZk*U~?BUxz7G9)2i!W2(C6}q=tW(MV4%@rl
+zxAW%RV>aF%?bmtp|KQqAKSd+f-lRTDu2ApAm#E*;E5!dd8+Rblsp0e;)_;%e1IQTy
+zfOm(@hV@1tsuS94djtS<o^>A3^Qa$cQ)lvOhkBD{*#AFvsGe_I9$CHI*!i%#Z8Zt#
+jw$;|P%{mR>=K?+hqBApH$C)si00000NkvXXu0mjfvW!xT
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/ethernet_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/ethernet_disabled.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..d8792df54b1afe3286b9b8c1ca2d4bb404b5b6b1
+GIT binary patch
+literal 399
+zcmV;A0dW3_P)<h;3K|Lk000e1NJLTq000mG000mO1ONa4wfZ;e00042Nkl<ZcmY+8
+zGhi?=07hT#w{6?DZQHhO+t_NawXLc9P`jOK`;scvTR#dkZ`W*pt!ik85ZT2?PjyC9
+zF=mCVPzVKRq&W_>0Z>pUB%SGvNf`}Zp(Gfz!=yVwOyMTEC?wFqAe#*DnM@inpbc#k
+zI<u8N+N|0djsS-2gh4qgn88$5Qint|HE<nEAYrbZEMhlnk$^;kp1_jVpARn|S6yND
+z6E>VcmxB^Qf5<H8UQ=gQlCCOyBz4nS43SX`oCDUK{1vd)JJTm9Xx>&j5C;I~zSspi
+z1Y`xSe*qmi32@iOHgfm#Ek{=E1lT$1=z&{L-`Rh2dv1AhByjDmP1xLBLwg-xboA8o
+zzrUmYMf?l@?DF9Lndi1g&nyN$23Yz03;rANKk8rf3+LTWH|?e$oa*;v$>o{wA7)P9
+tdS}P^Z3pKqrUycQ8gPF2u^s^Ds0Tsmea{@!+>HPL002ovPDHLkV1n(dt;_%b
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/loading.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/loading.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..715431483265b3427e1fb8f74df570a11e5c9435
+GIT binary patch
+literal 1786
+zcmZXUdsLI>9mk)%ByVmI6GFHrBot#n64OX#lwk?TC4pdolmdpDpq4;E13@H+B?$?a
+zfR&p-5nW(l!{w|hN&$<FDcEA&>Z~%g9tB!2H8Qqwn78e?m(!jz&i4HKJm>j*e&_pq
+zp9D#~XsenDm|&R*Mn*<vXJ_Z<=O-p6j7DQbL<9<j3J3_8nwsk9=ujvWZ{EBCYZmJb
+zF(pos9xIl|33z-r6tcy7iN;_65rnTETfG*bA8ThM`GSF`e|-FQ0u6T(CLixf!-2Lo
+zZ6KlFzjcnp7Y1#bDH3Qg6;$Ui-;W1HhV=7ex!pV<2}AuWF_r_wlmkA77}n-gg>XXo
+zXOYBCv@#bQe?5P0uNUD^c|uecaLe-o)rS&uYv^Sdaa0Q*%20MI>mnf>9^Kd9{kzEi
+z!4rvgYwytT$q{-dfAm7>`sPGkeM3psZxgF{M(T9^=k3s?mfSC?+5Wj-?~Kda20E(}
+zvT}HisJr3^J5#%LHIIl-mAPMOcw3)E>GD>pPVH%2-nT$U-wyLUHe2%n*s|k)X7>d?
+z$m}J^>@Jkhm6bBE<6Qksb(%%3nSSq7S}&t8GMUY#hxM%IVo33wMc!8L(9dyp_deOT
+z(+ay%2F=$v)ArWQL=Sl+LYQmK5VIETk~tO|4qP#x`M3T4>mMOEP;IUvn#`6eV|{ha
+zv8Lvh)`W_~l>bJsng<<_e%08(5xOQ7seTUGWjT%0ANVzgVixsuqR*`0sF%B?nD!*W
+z?UyBEJt3&gTn!QBVxGYL2KD3SIF*r&u4b`-dj<7_<nOZ?Q!qodeJmbdN9hGyZjyC6
+zz4VB}3vx52@YKbbI!!F0Ia3<AMgxmz_yG!{k*}Q@CyOIoCljwe7{!U>yR%a3fI+rF
+zJg{&Bf*Pe({{rJ|^oCs_3hUk6>tWnn&s);aF^P?s{YVSsWSNI;E>O2FH&0f)J>>X_
+zf3_`H0>;Zktd6DELfB}+zH`J>3s({AVDlO}GCuGGz6gCEzwgZ8q;JR<@WZ6w_wi!G
+zd?w}*-n#1+iKF!3c3oL~{xL`&ZsB;zaVAGE-@ArsUA7M;)6NgB3@lcBdAzzj`PR|z
+zYQtX1fngH8yF<kvn^<{;vWEZUvF}|xR(~kF6yE=TWClVu$lcElPL>;tluOY#_RM=0
+zN8D+40jlpWR$@&1qXpifkF2BUApw&Nop$h55hazT9j%6C*|F_J=O@$d7v~Dq$r+XJ
+z{8TC)&M-glz8YC9a=2EUTL&CL_t<Dy05Iij0t|oXQ^SU=@VhxCxa<Jdiar3EwHRxO
+zTESi;wGN<=D1s2F!$=q=o9|oToX@?veQrLD3UaR(R#`aB3dN>B4{l>$9FJ%t^1sn5
+z4C%?e%570*dj!QS{mlMh+pA~WP?i{{A8F&MhfYqhjdOJmVO}fRdF81^y{RW?8{;rc
+zE!F#(sF>2X>dXzbl~lqp-=kax7A{J`!^KH!d~nG7^hE*!=)%>iK%#Z(*VpFe^vuzt
+z8Y>iLC7W+&Yw6e8nr`k8xLJM(cC>QIaLlK2ySvI6cUdJ5CuQPCwo2t5fzQM(s_ZE2
+z;6J*Kb2_*C9}K6YkDffw`qSy1opgorU=g*F7D>Zkt3^Q{g{={Q5cn@8DMti`a^`Q?
+z&U=8S9J89t5SkrKxkKF*YB>XfX(Opm80h&6<lz`&%g;?s=uU57yxxt@Fq!ef)IgHm
+zlqp!>7(OL=b}?WR{P1p{W4{l({^#gRFYYg96bnnSK)2shuMFKyudSlG<uPh#1kA^k
+zB~8LLG61amwJLdhdaP?g<l1%dj*6|{tvU51lpI<SC?R?;ZOoG%;b=hN1?N)my%(U)
+z-Elh9i)Vg<iKf}Qzl&?TAR?s@@{%`By4#I%=S+3G5A;;qeo(gwSMbfiodPJMz#os^
+zv&A2WmISO}qW}(h8LLH6l6_;_CttMWr(B&&)5aUknI%n{(bOVuMRC!C@;@wT(!55E
+z3(torMq~TZr(-zWhU-f@2^nX=s2aL*xIYv=k@_0OZK#)?jNPqyXNe8@)lkW|Ky?WZ
+zLu-HlKuGv>1c>~S<DNa`{^^4I@SJR_tnvG^IT{GgPoSM>VI;74b(f`tz!cOnAULT7
+z#-wl`(_>E?C-bvUhBD%N_K)BA8%f9{lYei}FP<HyrY7I%j!pu9w{-DsOaS5-kYNwQ
+W&0z9F8IJ5V=;J{d2eMK?<bMF`6n4b`
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/port_down.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/port_down.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..5a2b235d0a51193676d7e6c1cefc47889be473a4
+GIT binary patch
+literal 769
+zcmV+c1OEJpP)<h;3K|Lk000e1NJLTq0015U000;W0ssI2Vhh^n0008WNkl<ZcmcJQ
+zgYqOj6vfX?r-vWbwr#7ldWQA${hwfM+qOAoD;v~wbx+nfH5KPKC$|F({55d^o40I2
+zzl2q{B)-*uVE-X*I=(iU5t9N58!D413WXHDEQJ<dArq0~FhKxVx?QJwfbV;jpCsDi
+zGA5Z!F@!jE^2D|4*ZRz5GTE(Lw@w&8(RDMjD+mLbrpX$O^fZUNimT=M{=-KP?L~WD
+z_u12@63vJ}<gkqAdtnq=0ZI8)LFlyG`}Xg9^X7FB1OOV%)}bROg@}kqvPO&;zGB%T
+zxs=;?Zs+s4MGF=$T(nr)54&yS+jeal9RgjsdilkR=h~fLsnu>=zfGi~q%BgZRJwWl
+z?)0fs0QkOt{N(Ym<HrvhI-H0_v2i=rM8XgOoV#%4?YsBJslyoc#2DVbefRF&d(QcS
+zd9#NM8B(j&hYyqJ#O~4PG+U6A`EvpkQ8RTC3#N+R)^qfFgw{7)Lk-esM{g9OG@8XZ
+zNJ~)|2a$1U@9Vf(u|uKIOrf=(6gE|c29h2oA|d)WU&=KRdI4c^h+$x+lBR2lM1x|k
+z2@8))M&^)3p>{3huu((X`D`dajA?&Fx=bG{MK5p-+hMYqL}bM}DdWqyHXCE^w9<&7
+z?XKtMvO%}Y^SQ9&x%o_R>e{4_<qU*IbEXU-N}`!@9SflNGcrdVAD3gs#Bvm}852rT
+z<V;g3n>yiBtL;LHgx(>pb{%s~K(vx!BBDaE2w=|aSpd3Nb^JD@j+yipOgeimV!19i
+zn-8(<So^-0&lT3K-B2ohDwj)0+7R$O4{34Emo8m4=>NgJb7<}BxUtji<Z|8r|NDRE
+z_C4qmfs&Q9YK^Mp+IlZ4)pD^=%w%#3pk+R(VKZX79j0BHl?$yms-EwC>%NWy-e@);
+zf2PUOx0>wx`q!U9yCdz|{##4m@3T4w{+d1mA)xGcVF)?q00000NkvXXu0mjfT&#A=
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/port_up.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/port_up.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..8105e77d0878e1bd4a4f4953365ca1cab3a80ab5
+GIT binary patch
+literal 1151
+zcmV-_1c3XAP)<h;3K|Lk000e1NJLTq0015U000;W0ssI2Vhh^n000C=Nkl<ZcmcJP
+zMU*Q=7=_C^p7H3o<L>SZE8N{(H@L3ZuW(pBwz#`XdY;Sp#FL4>q`mmNa~e(rhZ`&X
+za{HFBO`A5M|3?fyXPtd!TRZ>5x+VTc{qMi`A+tL=PbQdv5a#Vr_%aNggZ{uZ{~a>M
+zm{P(q6iIWt^=%DMRi)KW6S|E{2r!As;QY%kJ{RZ37IO}Vb8c>KWO!5%9MGldnmvFw
+zxkk;?C=*PsB}G;DEbO`c);kEH1U{4kqFgEGH*(8MOMoUAg9Az&imK>_(H2OPUo!-$
+zUVrz!cazD4rfK)x^8lDq6s1@yW-^I#rP9c1+xBhncDr4N9CYZxha3v_b-8Z)Zgb7e
+zIn3kodfmS1$=NF|y9zvJvnjwya$S-nRn=ga+vPrB|AWssb#85aC6!8i^zp}o!@~pp
+z0gQ=Z8Sk96u4}nmZed|za&j`8%@TqQ&KaXjW7HIjga>D5_7#{APpmC1FUYbCv&!X4
+zU;xmzXWl?Jvn%D&)@@sLUC-oFP#qr|kAx#Y1gg{F8XXz$>+Og3WGW8aTt4gb`k+dw
+z89BGq*)>?mW%Cnb6EMf+ad895s$8j=;S$Dbb)#4=RcmE}@ao!XCYy%#28$7f0B*6`
+z_chWqRgsl?U5Z3Qflxrz)oRs*YPyOnb^C~JD7u0m&{R5!KsFj%wmD?iy7{cS4l;Ce
+z95FL>2u?9JpU>wNRgV|BZr}r^2ah^rx?uv@G8(P{jj+wNALZAQZV3v+V#D`aZ@%@}
+zS3l;}UWN@~$Xu5mdi0SC&N@m_D6-Xvo)U14xzUz&i@-8uhY9wFX4SAi>fmms`CMdW
+zEwN*{=yJNTeeQ#Sa9?kqb;``6YapWqZRceP3IdQRef^U?AFuV#>=*3yQooP>7~3T=
+z&Ee?+bmO^UBL@RPfLU&YhHD#Z1!5OD6Bt#gnGDCzy!_oKvG{PHYkV}|^Lak`c2}JS
+z2BO|G4+}Gpz<PW7LZJu%=I2Gzjldvl+j5(02v-mUC_MW7_uE!B#v?uBqd|!M-7mIF
+zk`m~3Uwd+Bc02;Z;aEnaLl~j$yLQB4v9r!PyQjO?K8GFmHAlt0#<Oo_ihFh7PESP2
+zHTjDlcB`6xz*z6&S0C*62-X3?aP0v%mC7El&p}5Va#S=LH4kL9)WLOwoGVF>zVLHR
+z=F`LdQxoBMy7Zm63{lP<J@&-4#|n%fTfj}HvSXtoZnqcWQ53mSEh(zf`M%DT<VRnK
+z0e5nwZ)Rd}IkEAbxCADyIDP8IbM}?$RmoasWPShi)6d;~{<>0Ebk*SyYI4=)wFQzl
+z{fdf;riKR~2a_9Hf+5$QIeu_h5k(O-YiJ}wE!i~QLj4W>$P1#T<FRND<gk(~Hn`WF
+zJ$~MCLoHC=xorPI3;MO6sj8uoaL?pKWIbE?R$PQ3m!2{lG~!=<5l8<*zW`lrPYj<=
+R%SiwL002ovPDHLkV1k1~EiV87
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-0-25.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-0-25.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..b3a8118afcc008caf688f233f1ca35753e31f212
+GIT binary patch
+literal 462
+zcmV;<0WtoGP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0004%Nkl<Zcmb8r
+z1I!;m6a?_8?Z&L_hDG$*|DX)Y7`5Z#qDHlCyN#VRwrkt%-R;aa?>1X=l3%jX%go|`
+za_rc?@dpp@T^jA!v7>u){6~8C8L*(Hsy;DwHH}HDHZA71#DBz5axRCZMT-`&{IP*m
+z{I>GD_pf_MMD*7KR<X9GA*rsaD|G4HZJ@jm0mNS?&^eHVMWmMmOEWZse$`<Aq5U&s
+z<>oD#jirdl71f0Z`o)1Eg9ojxuB=PUpaFv`MM4TZy^r--Owi8<vMg1WrwDTYZ3B7t
+zO#^~9p|tYy`1(~BmPYSBusP{qAbLtr<h>*!Dkh8?+;e{Y#DR&KQa&`fe)B_nM+cKT
+zf^wi3&=vI~OY;vY`SeW+^ZZ>3QXmP&?fi-iO`_t!$IK~ng87sQ9`LaN$#77C!Uh<U
+z;S)c7`g-7FMyP1u0v{$w47~F{HbCR@lLscRxpr^znydGxue<hO>H7Uo&zwJb-|X4H
+z>&e**r|ezWdvMpC_&#^>)V(b`H_iq^IsxeXpE?4-XJUD)9OopkBLDyZ07*qoM6N<$
+Ef`h@~g#Z8m
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-0.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-0.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..333b1557ba5d9b5df28ec13542337b338eec48fb
+GIT binary patch
+literal 439
+zcmV;o0Z9IdP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0004gNkl<Zcmb7?
+zL$=;Q97KPyy@1%$3^RS!7Q%U)6$A^2Z5s=UZ8oZ!r{DX`bI-p<b#8UHbo0A&=gQ{m
+zH!mM7oI7`J@#Jm_R;*mRXRv?dXk>VB?C7)^Q+7`6roe)<)}%aT%9QkNX%H1Fm4E;F
+zv4n&a+7?8`p~2Ck1O3B^1@jlJqoWi=AZ;hWS^<zU0Y@_BN#V~%23K!f-CC3<Pnom{
+zgcNLm<T%0x1sgZ4KRnPElmqM6Zs;Q>Haj?1^pPg8zCde5ZIon;t2Cgq6$TK*3AK+y
+z|2LBXD-j_aDwG)nDsCZ9Shjr4?*87Pqk;55zWw+%+rmo3SO{nX$iPPZLcT_0H2$l<
+z5>fh}konY6wqpVynG|w?HktuRXdRlx6@y$v0W-`SBmy8GqSA(?Kp7>>su`CjkjOae
+zY7OMl)$`XLKfC|>(bM~H9zTEZ_Uxt8pJI+&x_aT`<7W?2j$FQe;bqBBo<Def>iqHT
+h<@V+U=6A{5fOuw`u$Hg{&b9ym002ovPDHLkV1i~b$#MVy
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-25-50.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-25-50.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..b465de3f575fdf90a7919b23b77a1dd10da9cd29
+GIT binary patch
+literal 465
+zcmV;?0WSWDP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0004)Nkl<Zcmb8q
+z!vYmy90l-`?KauAU7Kuk6ZhH6Fb|Mz+w~N^Lbf&dqd84q=DGKGIXDOZlM^Qn^gn!b
+z|B7JOu3a@t;y==~S*yh(hmVP9^vH2hnR2BTl*WHV)J!A;Q>s)cFn?^oilHvOefO%C
+znIib>1z2&^$g$Cg;iD<4R<%ZJb3*_q{yITLpsHX@)y)h{iTq)|YA|~3xjAFjURpsn
+zAC>Q}rU)d*3k0xVT%cFm1{=l>Y7<fIx-Ev8e%<Wq9_niju%9Qq{h;>zZ3^aHoO!rA
+zV=f3280CZsYp(WZ-5^fWlA;DubywC6+>K2Fa6*^1wHJ*U*gB%=L)u5rUVf-3>Yy~I
+zCOIvrfb|2W<oiVR$?F94>}>*Zo>UOtNxxEMldqVPA5yXW35rwWi5@0o!WlU$Sg`@5
+zs^Er_as2fHA5v}u#JnKJ3B_h|@gEyt+^W-urmeqmciQ^v_hxOpaew&oGf()LCapdD
+z`23|a_s(5B{mK5rdv1r%7cQT<yKVR8dH9?vxvKxEat<E>z$u^5N&ZZ}00000NkvXX
+Hu0mjfM=so5
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-50-75.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-50-75.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..cd7bcaf9a6da38490231f92e4045cfc1a2c96a4d
+GIT binary patch
+literal 467
+zcmV;^0WAKBP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0004+Nkl<Zcmb7<
+zB@|R)5QXo&HQe3Z-7VuDNoYSyg^Kh_qv0++(EAqLb$#DI!kNS1{ymrZ{(A}k!TIxN
+zHzcw32s*8FrilMw+Vt5+r%#)?2LQ4x!`16o@LvKJRptbzP$<CpqhM3@?yz!yK7ye3
+zyfb|2WPwA3zYDTTeq`U~#iv_chV#Du_PLtEA#;QLy+Xa6;D=LSHPsM+pubA6{rJ@b
+zgyJXwP?Z%d22leXVSFoq{z9;N-o%q*Mh+PR0MA~$Z?NbWff+0+0A2z5v!K}#ecR08
+zG<wPUf0ICyeo5enSJ-px&ITq~kD#098H+|@HNRIi1ga{C2%jn}oj0O7X5`Sl0MNfu
+z#GQM!`mkX`;N-Eoga9n~S^;p1?ViZ1dJj&wuYm3AfM1gfEM~-_!dHr&oVCIl@zsYc
+zDj+2W`%nl~%|ZY(1E45&yR3N#G7|WAjsd^A>}w+VA|N6-#pf^H==)aw1TZRQM6G74
+z^x)BprvT7u^-8@wJ=G8l#0RR?>i!K`M#d_y35ah1;r~zo&5yoh9~{uUK_mbG002ov
+JPDHLkV1k;>+e!cc
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-75-100.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-75-100.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..f7a3658df8d05f8fa037d84cf8e920308980ff0e
+GIT binary patch
+literal 457
+zcmV;)0XF`LP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0004yNkl<Zcmb7C
+zCA3vR6g_i!io4Sn?oP%%lF+_B6)Mszi5_t2flj7;cmMC&+#{^B-Uu%H$@rEtW8gn<
+z?ZJmrXy_z3*tGVn2LFMBJJ;Xew0`9^?JsH7;Q8Cn@LvQ-#4{ZW3S!ab&je?BKCW&o
+z!F%8^vrw*SFJ0yc;O_)U)84yrcJI@)Ku`>i&y2E2m%z1ujWC~8`U6E(u`Fsh0%BnP
+z1;NFKFK-#Bt=B#?9YT_j7g@k{f#f$4j_%m@c;mX28?`?&HoJhtfuJH5=HNgjekSPT
+z#M7?Q3uPrszI8wZp$6(k9sKw>3TqQpRS>dh->Zrk4rKls_wQKSvvJ+3>pED{tigv*
+zU*=b@UI_~8)I$X1SOZUxl|&QsWmmmTfD#XATPcA+j1X$z2y%<uM0WOB52<Z;Z3svb
+z4<QJPkHB4mqCmEeATg>C^J%MOF*n6qaIdj8IyS|#sT~3kQ%j6VJ88XdU~E`7rD<6&
+zZ8hu<<!NRLi@FBJBw~Oj4Ro<g=ivXKwmV+|vP(2^wu#`^00000NkvXXu0mjf`X9_Q
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-none.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-none.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..4a11356af2ea5d5c188b82d30322077052da4964
+GIT binary patch
+literal 639
+zcmV-_0)YLAP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006;Nkl<Zcmb7?
+z1CUTb9EX4VaJI8;+qP?vHOMtqqg>-`+qP}nXZvp5?Pb?D^ZfSPzX<+=ZQIs0=TbMr
+zC-QRmatHrG*>aVpmMdGK4**z}g+2Rr<G%z#DkTJm!M1G}{wP?nVnv9zuR8{x$j-?K
+zRZ7A@2>vc`J?$~wy7ru{l!D>qs~7P~D;S6-0Oa3OkU~I834@YSf0hvts9!~}e$)C9
+z7EuuZptP<pl|<ItH^{#C0NF_izBz4L!@F3qLIKn-1l6imnOVAInW(~$Up&itw`d7S
+zbPV9_1z*biGGDGndhue28ZivUVBrTCql$3~bEK_Z@2R7sVKr}puxXRPh75|&ga$o)
+z6fsMdK>~1o91fPxEhz<Z3l{pkdF#4^`Xi`yOK3AVM~?gYM#mzzVtLr7&w|(_$SGZ>
+z;*@e_%lG{}9Oo{a%@k4~?b>w+LJ-iRDNG$wcJG7ljobcK+m<NPuQ%R}9S`UJ!}1R2
+zOy<+vFT<hK$EurZD@wHnNXnjlz^Svys#z_oY~Nmif^)c@o&bTi7-y>BK;gj{l!i7D
+zc-N@~n^N+A_5!#UuR<0?LOQg|G~(<Fmtau}UZdIzi!%O2Kskk(G*bhQ$Z+IVD$jym
+zzCyacF9LgYgXH--=iCL@XD$Hs>i}g+Wso)NS8fOn4r;A62(buBOiFUYL&F#Vq^G31
+z!Dr6<M!b9P%`96x9v*NBA<<zWxpu#v>2XPk)A0#^00F-{CiwYP-B6*z1ap}CPw)Kz
+Z-~-xuDw_#&s%ZcK002ovPDHLkV1j6fDJB2_
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/switch.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/switch.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..be99b19badcd389e58cad6e04d067890a58943d8
+GIT binary patch
+literal 680
+zcmV;Z0$2TsP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007SNkl<Zcmbu+
+z1C$(V5QgDza1q<KwYF{Bwr$(??!>lj+qP|YS0=WfgCF%C7XB6|J~7(z@#DwC0kHTJ
+zo40JDzrh6vM~)pKXLmOY7&-)V=g$QT2GeKFK)=C*;qK*$6Q_>9Zt!Izm>>YQZre<C
+z4Rs`|s7ji;`XnwTORo(bB|_@jdZePEO_Qfgq=u%3ubN?_MTk!XfYTgCsu#fH{fozs
+zZsIj-o%3kf>N$WHc=56sz~O({2;Y~%XIU1C@?zM!EnPU|;opD$#cLxZ1$gn|8D73*
+zASp2t8~|JSuNyA7Ts{B>V`Zwr*}8Qzb?em)ty;Fi-Me?NaN#1neDM-Q1YJEHv~Jx7
+z49fsS;BvSC2m}ro<|X(%KKMtE9}xyD4jwwdh>J?_Y^`na<mnT%ZPSi&^Kv+9s%pZR
+z#iuv`2wzA_Nu;C44zM?FU83VBkFpy#uOV4^>2UmvnEOP$CMP*GJSKkv4O4bxFI+f5
+zOP4Jo1!Z|p{0tG{H5vEXRWX7+lsIu8UA%CX6qV&?;U}cLCgTl_uvsT#1-od3QPOlh
+zb&(i3IZ<D{)6=+O@G!fEFqPn$(`?h1opsGy^~5-S;jz(9O@r~8g8#IIu}wRvxu~}<
+zdbze8<}g`jsJ$TBIDWwnui|y&SGs}x%Qld6&hl&85wjXaTqn$k6YPi;b)BG#*X%Qw
+zQ&jyn@+;d&zNPCapnT(-yG6p>D?^Mkr}ov1_5*mGAvD%$LT7{6`Fb)wQ{*A!nzIJz
+zFv?J-pI&P1AcK^wfx7YG9YpMP0knL#tq;UJCUq0{nACr`T|=u+7w`(`j$~?zc=-ST
+O0000<MNUMnLSTZ-xjo(h
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/switch_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/switch_disabled.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..54588d24d1c2293a11021ed862bed2603e8fc8cc
+GIT binary patch
+literal 398
+zcmV;90df9`P)<h;3K|Lk000e1NJLTq000mG000mO1ONa4wfZ;e00041Nkl<Zcmaiv
+zGoTOw7=XV+wr$(CTeEG~)Rb-8Hc#2cvu)e9{o9}{5Vj7BX+~-(1wUR7N})9Pq1e4#
+zqO@0DC@IP#rLD4Daa3%ToX8DD6!|VV(UyG(?4T{K{Noonk;BL!G8~C$U_8};q<oPP
+z$SDk?LaLlvF&Rb?CniY!0T~G~t3af3YO5;2b&{IiMHDN$5A#S81xAyaj$RB!xb>xV
+zN<jOe<ziDR5+!IsJ%fsQYWfx3Y{&o4|36!fT2v&t2pBi{gud!UoU-{@^SZErT*$J=
+zc0TfE>&JuNb{n-C0>J26Gy2V*IcF3A6T6-JzV<4W04BGcHf__6Lmv(s2h}5&&u*VL
+z8srh%Ttj{TZdhBpN3|BDAVm89eGzZt^|#OHmO%+-z{2gvz8re9>-qYV<2DQ#Po3<`
+sdatcDr6y$ETn-6={HN7|8A8^HX`u0bX&RxdKL7v#07*qoM6N<$f`KlvegFUf
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/tunnel.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/tunnel.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..63eabfef5901b6cfc80a4fabfce7aad6d24f8174
+GIT binary patch
+literal 343
+zcmV-d0jU0oP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003VNkl<Zcmb7C
+zwN}MI6vU;a!}*@qA}#JTxVyW%JG8jFI}L6%KR}m(!S}`IoZY=Hlh{;NR?im{6hrSY
+z&PEAzN|FRE(9gJ}{&OBA_nl7)1qeS&x#}Sp_Yv;l>gwjjB8mkP8rPB1zJ>Iz9b|Ry
+zBB^y#EbtB00#Wtrh;QCTUR4*2@*)%nDp^KI-4@L7qR4?MUX;3-;-#{(W=_7JoR_fL
+zbp#YG!jd&D7AUVQO<r7{eY?H8#?tB>&MuCj#7jieE???mfr_e9Z0~L`8Ec!%e9dvd
+z0@laWS5Sh;i~3=lP3G|B1Avgxt(PoL4ZuN(m#_DPFYX_2K|ka8TY~HSyx|d{uS&eE
+ptS|7z`nP^?xWjd!H~}3-&pYTsqv2#^;dcN4002ovPDHLkV1jqApAP^4
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/tunnel_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/tunnel_disabled.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..ca79d81707c1a9476ce729e4cb88b3aa32ef0cc7
+GIT binary patch
+literal 235
+zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6HhH=@hE&9r_HX1pWFX)gYrwiF
+z!GufeR!NA?0lqC41kCMN8x@k;R6HCU*>xu9@heOADLl8Id#7gZeM!O7_DXKanHkFu
+zPO9cR9net8y`ks#WXC?S6E`+~&v8EZV++?IHpMhyF3r9jy;cI-FKWNoAh_I~O<E>9
+zY<`n>*Dt@5yjxEeEV<7+N7FK}%#x#VowiBV;tu2E+>5hLO}KYm?M(Bcvd)u<-{u_+
+j&Rz8(PO#35!!WKUd)o0e{wc9Q*E4v!`njxgN@xNAZp&FF
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/vlan.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/vlan.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..be99b19badcd389e58cad6e04d067890a58943d8
+GIT binary patch
+literal 680
+zcmV;Z0$2TsP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007SNkl<Zcmbu+
+z1C$(V5QgDza1q<KwYF{Bwr$(??!>lj+qP|YS0=WfgCF%C7XB6|J~7(z@#DwC0kHTJ
+zo40JDzrh6vM~)pKXLmOY7&-)V=g$QT2GeKFK)=C*;qK*$6Q_>9Zt!Izm>>YQZre<C
+z4Rs`|s7ji;`XnwTORo(bB|_@jdZePEO_Qfgq=u%3ubN?_MTk!XfYTgCsu#fH{fozs
+zZsIj-o%3kf>N$WHc=56sz~O({2;Y~%XIU1C@?zM!EnPU|;opD$#cLxZ1$gn|8D73*
+zASp2t8~|JSuNyA7Ts{B>V`Zwr*}8Qzb?em)ty;Fi-Me?NaN#1neDM-Q1YJEHv~Jx7
+z49fsS;BvSC2m}ro<|X(%KKMtE9}xyD4jwwdh>J?_Y^`na<mnT%ZPSi&^Kv+9s%pZR
+z#iuv`2wzA_Nu;C44zM?FU83VBkFpy#uOV4^>2UmvnEOP$CMP*GJSKkv4O4bxFI+f5
+zOP4Jo1!Z|p{0tG{H5vEXRWX7+lsIu8UA%CX6qV&?;U}cLCgTl_uvsT#1-od3QPOlh
+zb&(i3IZ<D{)6=+O@G!fEFqPn$(`?h1opsGy^~5-S;jz(9O@r~8g8#IIu}wRvxu~}<
+zdbze8<}g`jsJ$TBIDWwnui|y&SGs}x%Qld6&hl&85wjXaTqn$k6YPi;b)BG#*X%Qw
+zQ&jyn@+;d&zNPCapnT(-yG6p>D?^Mkr}ov1_5*mGAvD%$LT7{6`Fb)wQ{*A!nzIJz
+zFv?J-pI&P1AcK^wfx7YG9YpMP0knL#tq;UJCUq0{nACr`T|=u+7w`(`j$~?zc=-ST
+O0000<MNUMnLSTZ-xjo(h
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/vlan_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/vlan_disabled.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..54588d24d1c2293a11021ed862bed2603e8fc8cc
+GIT binary patch
+literal 398
+zcmV;90df9`P)<h;3K|Lk000e1NJLTq000mG000mO1ONa4wfZ;e00041Nkl<Zcmaiv
+zGoTOw7=XV+wr$(CTeEG~)Rb-8Hc#2cvu)e9{o9}{5Vj7BX+~-(1wUR7N})9Pq1e4#
+zqO@0DC@IP#rLD4Daa3%ToX8DD6!|VV(UyG(?4T{K{Noonk;BL!G8~C$U_8};q<oPP
+z$SDk?LaLlvF&Rb?CniY!0T~G~t3af3YO5;2b&{IiMHDN$5A#S81xAyaj$RB!xb>xV
+zN<jOe<ziDR5+!IsJ%fsQYWfx3Y{&o4|36!fT2v&t2pBi{gud!UoU-{@^SZErT*$J=
+zc0TfE>&JuNb{n-C0>J26Gy2V*IcF3A6T6-JzV<4W04BGcHf__6Lmv(s2h}5&&u*VL
+z8srh%Ttj{TZdhBpN3|BDAVm89eGzZt^|#OHmO%+-z{2gvz8re9>-qYV<2DQ#Po3<`
+sdatcDr6y$ETn-6={HN7|8A8^HX`u0bX&RxdKL7v#07*qoM6N<$f`KlvegFUf
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..80a23e8e9a740f8f69e1ad82f3bcdede9f05953b
+GIT binary patch
+literal 767
+zcmV<b0s#GqP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0008UNkl<ZcmZXP
+z1B|3w5QXo16FwWkDqh>RjrQ2KZQGt{_t>^=+q1U!ukG4oe3Hto)cL*!S;#?C?#6}P
+zJQaRam(=}b5Zbl@2Y0-!Wfu-AyxsU-Hm&~Ujzj)6ljyF~dWoGZ{rF~G9Nh7S9Wsl~
+zLJld%pTzf~dA5U@u#>J4QlFp~)l_N}*U^ZBJKnHEX1PQ5$ny_u(dGX4z&@YFbS-z&
+z32Vtz45*ni;`Ytb^jzOE4BX!uaeHU+h8;4<qJu8kB_GF%9DnosRr8E!Q*Ltv%e`#Q
+zD8Az<&A{UeNHaY(0&G*?FL=Wa8D!Bxm+VrCQ?X4O-FC$)C)FsvyOicu{K_by^8?#F
+zi0bQWhvt?l;Ft$f(hvB69WuzGgD%;r7<*gZt3vsKOQAqMplV7xyy4{omlDb$t_;lF
+zLMU_hP}~7;*dc=~I_MJ2Im6Tx2l0UUCDZgz=KQXwcN_~Suf$T&_ZES^e+GCbmH^(c
+zLk3xN$U=52#D*Kkw%N=3RTf{d$_2l~jL&rqji6}e2RhDiR6%J4_$Q`+#ts=|(ILxo
+zL{m6!E$RuPIcN9HPmh9zQxv7`n?{wC7C>i5GmMW80(QtCOBS+Afln|ymBjz=RTIrc
+z@KWX~DodfbyquaE>xWpL2-H0!<4uiK5W!8JLk8I;7iCU3!CYY~?H?H(f{xC1$~Vv-
+zIJPnKH$5AxZ#Y&os91PYQ<I}`m8HBN*}cj<vL-x!VoOhNH#D_0!pzJROpFgfS4S)4
+z<P|}5T=aNlRXGTR+!kbmLjqUIbSCY@%<MF1X{*m~*t9<3!o~A-*REfwHZ;<G6B{1|
+zMaB70Tv7<5V<W(1Gmeneadfh6kByIp>o>37AcWw5+#;QQ(m5cV{kY$!-?NB{2?u8v
+xhqe{6tDEC@WNq*!Bc1PMWbj!TH+QFR&R6-E(9NL9xs?C_002ovPDHLkV1lfHa5w+}
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..9e466aebf41d819f6bfbf5dd70c5b193fb2a7295
+GIT binary patch
+literal 2276
+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
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big_disabled.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..6f9fff3813e2e051a7429f042ebf8c23d7b42378
+GIT binary patch
+literal 1512
+zcmV<E1sD2>P)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg000HANkl<ZcmcJO
+z1C%4n9>%|aRV$s=WH#g7$s%iA``+cVZ5=$@wr$(C?YFiywrA35Rn^PMTF3X-#`m3H
+zH3;W;tya~(6;CLfV;lXAz;Xms732nW+l4CydYYNb-k+h4hB{ld3A=snZ2bLfftK=a
+zvUy4Y0h!WOxA=zAMNjrx2~4O$((h~y|5&f!sI$pW!;cG~K+g#%CzxrZCO0%g8ba4~
+zL(4S9NBNY!);twg@i(<b7Tnzt01yB?(}wl+2|&@STRfT<LFe2sB9rUH03}6g#YrLr
+z(lKjBeQ=0WEmJ`B^$=iZht)WPn)>UD@EbBMr#rHkwu&~@Dr=Lf?WL`<s5@G&A%p+=
+z;`<p;OBBux;W38keQxq?%(I5d9TR~j{II3EfH}HDzI2tt^2|z|$~?(6nG-x2?P#97
+zO}tmEZ&+MCA~e7VvJjYWoM_f~o<}|v!sS7g>14uC27rVTEq2nW71q&+=chG3&|Drw
+zl!Zos5e={c>idm;)X3VMimb&a%ka1kJ1HD}+-xaD(6#bM`UDS=n<xh-6r8x)K0W>$
+z@xzMhzz74R+ms9#c|C6Tgz0I1WvN35sQKjM-?;E=?DMQ#I{A2NM&M9ospgxWC*t<J
+zK43H@(ghf53QL%wL6?QVkgjsmb~A@S&L8V+B7pE{Hr6TUBQSGmyK<#lyQ_fOt6joi
+z0UAI?Rg<*|PL?N|99fVKZ;*|O#$g~r2t}%q%?c$8aAZ~GYwOx~8*60L4Hydz&PmfL
+z^^k+bcw8WxTg~B@(T`#L5X~XC$c_q(!$L0gbRv!O&|s`?fH-tj#yAUSTZ%%NxtWPl
+zZW>yf7UI1CmZD8lnldMwa+5HbG26mI#uX1;#B~EXG0`kZGOKT@Q*rQO|5Rzt3G>U1
+z4Y(=0DcgYMMwp*-rb@+r)Phr;R-a^&YN?5OLDE-g7fjINo=R(M6X~Mm`04dw=~g<Z
+zjEYg&uWq4A>Gb-R<GLV<?Mmz79zlXt+LOL|!FOkrF>M1vy4$<fD+O5`m^U(N{{r2V
+zM6xoL`~qY4ypiGnq*7h$-R(jG)3!3cJ9F+|5PP~->q@B7p_sbLNLAL<@fK7NsYA{C
+zT8H)1cngXhDnr^;j;VA=C|z}}7JDxI&ig0V-b7J8<vcjqzd7_x|GrfgZG(p;aycuJ
+zQmd#@KR(pkFcU2QvL1?b(4TDn`rm<b22j~w`fi;wm9WC{7b2P4vXcEi^Z(`lKHbwl
+zH;lW8VI|9LiDdZ;R;a|B*>`L97pQXvb%)ut+4P+a0~$=34>sQ`>3{KLmuR$C++#n4
+zIDU$Dw6O7C=8wvxietBD|Nh2t;F1Dh-{AUS<PLkp5YGEI=6@2;9&1{&vGW0jpr43s
+zBh_8QtsC`YE0XU|8At9?2fy}D;EDoZ&#ATP#1`w;hu#&jBih#DRx8GjvjYd@C-dL6
+z|2Mn2!|5=0L??^#k6-&cE<m`9=PkZ%@6(*VnsB%JQx@&w-_iR>k)Uk$-iDVw&HDD-
+zw)LMog-g(I8H+aEXN{wRFJYGAKdW672`4cVW6n+W6-lpkuQj>}r-17ie8LQdo)q+<
+z875*(%3(Ro$K#RVnd8yk>~D=Ln&0*`=lfGrEiZ|$Wk8_H3m)b6;zuwlj%>4=d4YAp
+zv~rzM=j5ibmkb&s)P?)p?>!$Mhq~H;Jtx1p|FQ0O!V@1o{MYv7UfElxmu0gayP_pu
+z<c;uQVH9on@$7%vK2w3Z(g4d}w88GenE1vI`(q5^Zvf!Xh6VE%H!N}1>Sfi;;~d>%
+zZ?OAbjQ3q-@HWq$eh$7ZhClkAw?l!Sn^=7!5Li*WXVJP>`kNlje}v3??d%l>_LB6=
+zpPyFL^&Z3^WcAQF>bh!F{^X3et^DS10lr?w?h6Lj;#{0AEr7!P!T$mN&5K^5InvMo
+O0000<MNUMnLSTZ}&;)b<
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_disabled.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..e989a2bd3def286810a37ccd2ba6eeeca511ff48
+GIT binary patch
+literal 494
+zcmV<K0TKR*P)<h;3K|Lk000e1NJLTq000mG000mO1ONa4wfZ;e0005CNkl<ZcmZ|E
+zGk9157)Igmxr%Mu=2p(d9^1BU+qRRjX1vt4mb#7k7r~ZyJcj{*Fi`*)VLJFa(K^u%
+ze&nF;@s<K&*)*kQxpwsyy%xQ8^=7#=rC4_FFu<+=z}T2uGu^OZtXb;~n>ABo4#s<j
+zag$}2(ln*nUuN6RQu@<@vw>3j+s?ntq}eo0cF9c^Zo0%oo$PkVPH#^MSR{H+VT<i4
+z+3DR5Q74IU(`6XpiU=dSqqw654RMuc_yS%98arA$ij3^vBfwp=P%HgZNmxyB=1lvi
+z0xF>PPnk0{#U)|srwX;)H35X4p3;r3=}AkO>7wGLvL9WPGSib5T{EQ{dK%z>rS0#6
+z!u1F4mVyZ$OG-i;jPSr-q4&G6w2eLfz9UwV9`7jgapCkex<@Z5(qqKR-xvS518@`Z
+z2p*icMbqD2(%{qN>;)Q}@CbGj*}HJXKQHM%)&2+zk2@ZFHu2UQ0st@kM*zk<9?~Mc
+zqZf3Srk_qW-J;13paKUZ-cjrb%+LD;R3?q|yuV0S=p{k?@aL2dzCWP~4q_08IC$Wk
+kL*Lu{GVCeDQHlWk0fb(%J{%wa-T(jq07*qoM6N<$f_$*)IsgCw
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/xhr.js b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/xhr.js
+new file mode 100644
+index 0000000..701c12a
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/xhr.js
+@@ -0,0 +1,241 @@
++/*
++ * xhr.js - XMLHttpRequest helper class
++ * (c) 2008-2010 Jo-Philipp Wich
++ */
++
++XHR = function()
++{
++ this.reinit = function()
++ {
++ if (window.XMLHttpRequest) {
++ this._xmlHttp = new XMLHttpRequest();
++ }
++ else if (window.ActiveXObject) {
++ this._xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
++ }
++ else {
++ alert("xhr.js: XMLHttpRequest is not supported by this browser!");
++ }
++ }
++
++ this.busy = function() {
++ if (!this._xmlHttp)
++ return false;
++
++ switch (this._xmlHttp.readyState)
++ {
++ case 1:
++ case 2:
++ case 3:
++ return true;
++
++ default:
++ return false;
++ }
++ }
++
++ this.abort = function() {
++ if (this.busy())
++ this._xmlHttp.abort();
++ }
++
++ this.get = function(url,data,callback)
++ {
++ this.reinit();
++
++ var xhr = this._xmlHttp;
++ var code = this._encode(data);
++
++ url = location.protocol + '//' + location.host + url;
++
++ if (code)
++ if (url.substr(url.length-1,1) == '&')
++ url += code;
++ else
++ url += '?' + code;
++
++ xhr.open('GET', url, true);
++
++ xhr.onreadystatechange = function()
++ {
++ if (xhr.readyState == 4) {
++ var json = null;
++ if (xhr.getResponseHeader("Content-Type") == "application/json") {
++ try {
++ json = eval('(' + xhr.responseText + ')');
++ }
++ catch(e) {
++ json = null;
++ }
++ }
++
++ callback(xhr, json);
++ }
++ }
++
++ xhr.send(null);
++ }
++
++ this.post = function(url,data,callback)
++ {
++ this.reinit();
++
++ var xhr = this._xmlHttp;
++ var code = this._encode(data);
++
++ xhr.onreadystatechange = function()
++ {
++ if (xhr.readyState == 4)
++ callback(xhr);
++ }
++
++ xhr.open('POST', url, true);
++ xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
++ xhr.setRequestHeader('Content-length', code.length);
++ xhr.setRequestHeader('Connection', 'close');
++ xhr.send(code);
++ }
++
++ this.cancel = function()
++ {
++ this._xmlHttp.onreadystatechange = function(){};
++ this._xmlHttp.abort();
++ }
++
++ this.send_form = function(form,callback,extra_values)
++ {
++ var code = '';
++
++ for (var i = 0; i < form.elements.length; i++)
++ {
++ var e = form.elements[i];
++
++ if (e.options)
++ {
++ code += (code ? '&' : '') +
++ form.elements[i].name + '=' + encodeURIComponent(
++ e.options[e.selectedIndex].value
++ );
++ }
++ else if (e.length)
++ {
++ for (var j = 0; j < e.length; j++)
++ if (e[j].name) {
++ code += (code ? '&' : '') +
++ e[j].name + '=' + encodeURIComponent(e[j].value);
++ }
++ }
++ else
++ {
++ code += (code ? '&' : '') +
++ e.name + '=' + encodeURIComponent(e.value);
++ }
++ }
++
++ if (typeof extra_values == 'object')
++ for (var key in extra_values)
++ code += (code ? '&' : '') +
++ key + '=' + encodeURIComponent(extra_values[key]);
++
++ return(
++ (form.method == 'get')
++ ? this.get(form.getAttribute('action'), code, callback)
++ : this.post(form.getAttribute('action'), code, callback)
++ );
++ }
++
++ this._encode = function(obj)
++ {
++ obj = obj ? obj : { };
++ obj['_'] = Math.random();
++
++ if (typeof obj == 'object')
++ {
++ var code = '';
++ var self = this;
++
++ for (var k in obj)
++ code += (code ? '&' : '') +
++ k + '=' + encodeURIComponent(obj[k]);
++
++ return code;
++ }
++
++ return obj;
++ }
++}
++
++XHR.get = function(url, data, callback)
++{
++ (new XHR()).get(url, data, callback);
++}
++
++XHR.poll = function(interval, url, data, callback)
++{
++ if (isNaN(interval) || interval < 1)
++ interval = 5;
++
++ if (!XHR._q)
++ {
++ XHR._t = 0;
++ XHR._q = [ ];
++ XHR._r = function() {
++ for (var i = 0, e = XHR._q[0]; i < XHR._q.length; e = XHR._q[++i])
++ {
++ if (!(XHR._t % e.interval) && !e.xhr.busy())
++ e.xhr.get(e.url, e.data, e.callback);
++ }
++
++ XHR._t++;
++ };
++ }
++
++ XHR._q.push({
++ interval: interval,
++ callback: callback,
++ url: url,
++ data: data,
++ xhr: new XHR()
++ });
++
++ XHR.run();
++}
++
++XHR.halt = function()
++{
++ if (XHR._i)
++ {
++ /* show & set poll indicator */
++ try {
++ document.getElementById('xhr_poll_status').style.display = '';
++ document.getElementById('xhr_poll_status_on').style.display = 'none';
++ document.getElementById('xhr_poll_status_off').style.display = '';
++ } catch(e) { }
++
++ window.clearInterval(XHR._i);
++ XHR._i = null;
++ }
++}
++
++XHR.run = function()
++{
++ if (XHR._r && !XHR._i)
++ {
++ /* show & set poll indicator */
++ try {
++ document.getElementById('xhr_poll_status').style.display = '';
++ document.getElementById('xhr_poll_status_on').style.display = '';
++ document.getElementById('xhr_poll_status_off').style.display = 'none';
++ } catch(e) { }
++
++ /* kick first round manually to prevent one second lag when setting up
++ * the poll interval */
++ XHR._r();
++ XHR._i = window.setInterval(XHR._r, 1000);
++ }
++}
++
++XHR.running = function()
++{
++ return !!(XHR._r && XHR._i);
++}
+diff --git a/feeds/luci/modules/luci-base/luasrc/cacheloader.lua b/feeds/luci/modules/luci-base/luasrc/cacheloader.lua
+new file mode 100644
+index 0000000..11e5f69
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/cacheloader.lua
+@@ -0,0 +1,12 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local config = require "luci.config"
++local ccache = require "luci.ccache"
++
++module "luci.cacheloader"
++
++if config.ccache and config.ccache.enable == "1" then
++ ccache.cache_ondemand()
++end
+\ No newline at end of file
+diff --git a/feeds/luci/modules/luci-base/luasrc/cbi.lua b/feeds/luci/modules/luci-base/luasrc/cbi.lua
+new file mode 100644
+index 0000000..b5b2c8d
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/cbi.lua
+@@ -0,0 +1,1869 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.cbi", package.seeall)
++
++require("luci.template")
++local util = require("luci.util")
++require("luci.http")
++
++
++--local event = require "luci.sys.event"
++local fs = require("nixio.fs")
++local uci = require("luci.model.uci")
++local datatypes = require("luci.cbi.datatypes")
++local dispatcher = require("luci.dispatcher")
++local class = util.class
++local instanceof = util.instanceof
++
++FORM_NODATA = 0
++FORM_PROCEED = 0
++FORM_VALID = 1
++FORM_DONE = 1
++FORM_INVALID = -1
++FORM_CHANGED = 2
++FORM_SKIP = 4
++
++AUTO = true
++
++CREATE_PREFIX = "cbi.cts."
++REMOVE_PREFIX = "cbi.rts."
++RESORT_PREFIX = "cbi.sts."
++FEXIST_PREFIX = "cbi.cbe."
++
++-- Loads a CBI map from given file, creating an environment and returns it
++function load(cbimap, ...)
++ local fs = require "nixio.fs"
++ local i18n = require "luci.i18n"
++ require("luci.config")
++ require("luci.util")
++
++ local upldir = "/lib/uci/upload/"
++ local cbidir = luci.util.libpath() .. "/model/cbi/"
++ local func, err
++
++ if fs.access(cbidir..cbimap..".lua") then
++ func, err = loadfile(cbidir..cbimap..".lua")
++ elseif fs.access(cbimap) then
++ func, err = loadfile(cbimap)
++ else
++ func, err = nil, "Model '" .. cbimap .. "' not found!"
++ end
++
++ assert(func, err)
++
++ local env = {
++ translate=i18n.translate,
++ translatef=i18n.translatef,
++ arg={...}
++ }
++
++ setfenv(func, setmetatable(env, {__index =
++ function(tbl, key)
++ return rawget(tbl, key) or _M[key] or _G[key]
++ end}))
++
++ local maps = { func() }
++ local uploads = { }
++ local has_upload = false
++
++ for i, map in ipairs(maps) do
++ if not instanceof(map, Node) then
++ error("CBI map returns no valid map object!")
++ return nil
++ else
++ map:prepare()
++ if map.upload_fields then
++ has_upload = true
++ for _, field in ipairs(map.upload_fields) do
++ uploads[
++ field.config .. '.' ..
++ (field.section.sectiontype or '1') .. '.' ..
++ field.option
++ ] = true
++ end
++ end
++ end
++ end
++
++ if has_upload then
++ local uci = luci.model.uci.cursor()
++ local prm = luci.http.context.request.message.params
++ local fd, cbid
++
++ luci.http.setfilehandler(
++ function( field, chunk, eof )
++ if not field then return end
++ if field.name and not cbid then
++ local c, s, o = field.name:gmatch(
++ "cbid%.([^%.]+)%.([^%.]+)%.([^%.]+)"
++ )()
++
++ if c and s and o then
++ local t = uci:get( c, s ) or s
++ if uploads[c.."."..t.."."..o] then
++ local path = upldir .. field.name
++ fd = io.open(path, "w")
++ if fd then
++ cbid = field.name
++ prm[cbid] = path
++ end
++ end
++ end
++ end
++
++ if field.name == cbid and fd then
++ fd:write(chunk)
++ end
++
++ if eof and fd then
++ fd:close()
++ fd = nil
++ cbid = nil
++ end
++ end
++ )
++ end
++
++ return maps
++end
++
++--
++-- Compile a datatype specification into a parse tree for evaluation later on
++--
++local cdt_cache = { }
++
++function compile_datatype(code)
++ local i
++ local pos = 0
++ local esc = false
++ local depth = 0
++ local stack = { }
++
++ for i = 1, #code+1 do
++ local byte = code:byte(i) or 44
++ if esc then
++ esc = false
++ elseif byte == 92 then
++ esc = true
++ elseif byte == 40 or byte == 44 then
++ if depth <= 0 then
++ if pos < i then
++ local label = code:sub(pos, i-1)
++ :gsub("\\(.)", "%1")
++ :gsub("^%s+", "")
++ :gsub("%s+$", "")
++
++ if #label > 0 and tonumber(label) then
++ stack[#stack+1] = tonumber(label)
++ elseif label:match("^'.*'$") or label:match('^".*"$') then
++ stack[#stack+1] = label:gsub("[\"'](.*)[\"']", "%1")
++ elseif type(datatypes[label]) == "function" then
++ stack[#stack+1] = datatypes[label]
++ stack[#stack+1] = { }
++ else
++ error("Datatype error, bad token %q" % label)
++ end
++ end
++ pos = i + 1
++ end
++ depth = depth + (byte == 40 and 1 or 0)
++ elseif byte == 41 then
++ depth = depth - 1
++ if depth <= 0 then
++ if type(stack[#stack-1]) ~= "function" then
++ error("Datatype error, argument list follows non-function")
++ end
++ stack[#stack] = compile_datatype(code:sub(pos, i-1))
++ pos = i + 1
++ end
++ end
++ end
++
++ return stack
++end
++
++function verify_datatype(dt, value)
++ if dt and #dt > 0 then
++ if not cdt_cache[dt] then
++ local c = compile_datatype(dt)
++ if c and type(c[1]) == "function" then
++ cdt_cache[dt] = c
++ else
++ error("Datatype error, not a function expression")
++ end
++ end
++ if cdt_cache[dt] then
++ return cdt_cache[dt][1](value, unpack(cdt_cache[dt][2]))
++ end
++ end
++ return true
++end
++
++
++-- Node pseudo abstract class
++Node = class()
++
++function Node.__init__(self, title, description)
++ self.children = {}
++ self.title = title or ""
++ self.description = description or ""
++ self.template = "cbi/node"
++end
++
++-- hook helper
++function Node._run_hook(self, hook)
++ if type(self[hook]) == "function" then
++ return self[hook](self)
++ end
++end
++
++function Node._run_hooks(self, ...)
++ local f
++ local r = false
++ for _, f in ipairs(arg) do
++ if type(self[f]) == "function" then
++ self[f](self)
++ r = true
++ end
++ end
++ return r
++end
++
++-- Prepare nodes
++function Node.prepare(self, ...)
++ for k, child in ipairs(self.children) do
++ child:prepare(...)
++ end
++end
++
++-- Append child nodes
++function Node.append(self, obj)
++ table.insert(self.children, obj)
++end
++
++-- Parse this node and its children
++function Node.parse(self, ...)
++ for k, child in ipairs(self.children) do
++ child:parse(...)
++ end
++end
++
++-- Render this node
++function Node.render(self, scope)
++ scope = scope or {}
++ scope.self = self
++
++ luci.template.render(self.template, scope)
++end
++
++-- Render the children
++function Node.render_children(self, ...)
++ local k, node
++ for k, node in ipairs(self.children) do
++ node.last_child = (k == #self.children)
++ node:render(...)
++ end
++end
++
++
++--[[
++A simple template element
++]]--
++Template = class(Node)
++
++function Template.__init__(self, template)
++ Node.__init__(self)
++ self.template = template
++end
++
++function Template.render(self)
++ luci.template.render(self.template, {self=self})
++end
++
++function Template.parse(self, readinput)
++ self.readinput = (readinput ~= false)
++ return Map.formvalue(self, "cbi.submit") and FORM_DONE or FORM_NODATA
++end
++
++
++--[[
++Map - A map describing a configuration file
++]]--
++Map = class(Node)
++
++function Map.__init__(self, config, ...)
++ Node.__init__(self, ...)
++
++ self.config = config
++ self.parsechain = {self.config}
++ self.template = "cbi/map"
++ self.apply_on_parse = nil
++ self.readinput = true
++ self.proceed = false
++ self.flow = {}
++
++ self.uci = uci.cursor()
++ self.save = true
++
++ self.changed = false
++
++ local path = "%s/%s" %{ self.uci:get_confdir(), self.config }
++ if fs.stat(path, "type") ~= "reg" then
++ fs.writefile(path, "")
++ end
++
++ local ok, err = self.uci:load(self.config)
++ if not ok then
++ local url = dispatcher.build_url(unpack(dispatcher.context.request))
++ local source = self:formvalue("cbi.source")
++ if type(source) == "string" then
++ fs.writefile(path, source:gsub("\r\n", "\n"))
++ ok, err = self.uci:load(self.config)
++ if ok then
++ luci.http.redirect(url)
++ end
++ end
++ self.save = false
++ end
++
++ if not ok then
++ self.template = "cbi/error"
++ self.error = err
++ self.source = fs.readfile(path) or ""
++ self.pageaction = false
++ end
++end
++
++function Map.formvalue(self, key)
++ return self.readinput and luci.http.formvalue(key)
++end
++
++function Map.formvaluetable(self, key)
++ return self.readinput and luci.http.formvaluetable(key) or {}
++end
++
++function Map.get_scheme(self, sectiontype, option)
++ if not option then
++ return self.scheme and self.scheme.sections[sectiontype]
++ else
++ return self.scheme and self.scheme.variables[sectiontype]
++ and self.scheme.variables[sectiontype][option]
++ end
++end
++
++function Map.submitstate(self)
++ return self:formvalue("cbi.submit")
++end
++
++-- Chain foreign config
++function Map.chain(self, config)
++ table.insert(self.parsechain, config)
++end
++
++function Map.state_handler(self, state)
++ return state
++end
++
++-- Use optimized UCI writing
++function Map.parse(self, readinput, ...)
++ if self:formvalue("cbi.skip") then
++ self.state = FORM_SKIP
++ elseif not self.save then
++ self.state = FORM_INVALID
++ elseif not self:submitstate() then
++ self.state = FORM_NODATA
++ end
++
++ -- Back out early to prevent unauthorized changes on the subsequent parse
++ if self.state ~= nil then
++ return self:state_handler(self.state)
++ end
++
++ self.readinput = (readinput ~= false)
++ self:_run_hooks("on_parse")
++
++ Node.parse(self, ...)
++
++ self:_run_hooks("on_save", "on_before_save")
++ for i, config in ipairs(self.parsechain) do
++ self.uci:save(config)
++ end
++ self:_run_hooks("on_after_save")
++ if (not self.proceed and self.flow.autoapply) or luci.http.formvalue("cbi.apply") then
++ self:_run_hooks("on_before_commit")
++ for i, config in ipairs(self.parsechain) do
++ self.uci:commit(config)
++
++ -- Refresh data because commit changes section names
++ self.uci:load(config)
++ end
++ self:_run_hooks("on_commit", "on_after_commit", "on_before_apply")
++ if self.apply_on_parse then
++ self.uci:apply(self.parsechain)
++ self:_run_hooks("on_apply", "on_after_apply")
++ else
++ -- This is evaluated by the dispatcher and delegated to the
++ -- template which in turn fires XHR to perform the actual
++ -- apply actions.
++ self.apply_needed = true
++ end
++
++ -- Reparse sections
++ Node.parse(self, true)
++ end
++ for i, config in ipairs(self.parsechain) do
++ self.uci:unload(config)
++ end
++ if type(self.commit_handler) == "function" then
++ self:commit_handler(self:submitstate())
++ end
++
++ if self.proceed then
++ self.state = FORM_PROCEED
++ elseif self.changed then
++ self.state = FORM_CHANGED
++ else
++ self.state = FORM_VALID
++ end
++
++ return self:state_handler(self.state)
++end
++
++function Map.render(self, ...)
++ self:_run_hooks("on_init")
++ Node.render(self, ...)
++end
++
++-- Creates a child section
++function Map.section(self, class, ...)
++ if instanceof(class, AbstractSection) then
++ local obj = class(self, ...)
++ self:append(obj)
++ return obj
++ else
++ error("class must be a descendent of AbstractSection")
++ end
++end
++
++-- UCI add
++function Map.add(self, sectiontype)
++ return self.uci:add(self.config, sectiontype)
++end
++
++-- UCI set
++function Map.set(self, section, option, value)
++ if type(value) ~= "table" or #value > 0 then
++ if option then
++ return self.uci:set(self.config, section, option, value)
++ else
++ return self.uci:set(self.config, section, value)
++ end
++ else
++ return Map.del(self, section, option)
++ end
++end
++
++-- UCI del
++function Map.del(self, section, option)
++ if option then
++ return self.uci:delete(self.config, section, option)
++ else
++ return self.uci:delete(self.config, section)
++ end
++end
++
++-- UCI get
++function Map.get(self, section, option)
++ if not section then
++ return self.uci:get_all(self.config)
++ elseif option then
++ return self.uci:get(self.config, section, option)
++ else
++ return self.uci:get_all(self.config, section)
++ end
++end
++
++--[[
++Compound - Container
++]]--
++Compound = class(Node)
++
++function Compound.__init__(self, ...)
++ Node.__init__(self)
++ self.template = "cbi/compound"
++ self.children = {...}
++end
++
++function Compound.populate_delegator(self, delegator)
++ for _, v in ipairs(self.children) do
++ v.delegator = delegator
++ end
++end
++
++function Compound.parse(self, ...)
++ local cstate, state = 0
++
++ for k, child in ipairs(self.children) do
++ cstate = child:parse(...)
++ state = (not state or cstate < state) and cstate or state
++ end
++
++ return state
++end
++
++
++--[[
++Delegator - Node controller
++]]--
++Delegator = class(Node)
++function Delegator.__init__(self, ...)
++ Node.__init__(self, ...)
++ self.nodes = {}
++ self.defaultpath = {}
++ self.pageaction = false
++ self.readinput = true
++ self.allow_reset = false
++ self.allow_cancel = false
++ self.allow_back = false
++ self.allow_finish = false
++ self.template = "cbi/delegator"
++end
++
++function Delegator.set(self, name, node)
++ assert(not self.nodes[name], "Duplicate entry")
++
++ self.nodes[name] = node
++end
++
++function Delegator.add(self, name, node)
++ node = self:set(name, node)
++ self.defaultpath[#self.defaultpath+1] = name
++end
++
++function Delegator.insert_after(self, name, after)
++ local n = #self.chain + 1
++ for k, v in ipairs(self.chain) do
++ if v == after then
++ n = k + 1
++ break
++ end
++ end
++ table.insert(self.chain, n, name)
++end
++
++function Delegator.set_route(self, ...)
++ local n, chain, route = 0, self.chain, {...}
++ for i = 1, #chain do
++ if chain[i] == self.current then
++ n = i
++ break
++ end
++ end
++ for i = 1, #route do
++ n = n + 1
++ chain[n] = route[i]
++ end
++ for i = n + 1, #chain do
++ chain[i] = nil
++ end
++end
++
++function Delegator.get(self, name)
++ local node = self.nodes[name]
++
++ if type(node) == "string" then
++ node = load(node, name)
++ end
++
++ if type(node) == "table" and getmetatable(node) == nil then
++ node = Compound(unpack(node))
++ end
++
++ return node
++end
++
++function Delegator.parse(self, ...)
++ if self.allow_cancel and Map.formvalue(self, "cbi.cancel") then
++ if self:_run_hooks("on_cancel") then
++ return FORM_DONE
++ end
++ end
++
++ if not Map.formvalue(self, "cbi.delg.current") then
++ self:_run_hooks("on_init")
++ end
++
++ local newcurrent
++ self.chain = self.chain or self:get_chain()
++ self.current = self.current or self:get_active()
++ self.active = self.active or self:get(self.current)
++ assert(self.active, "Invalid state")
++
++ local stat = FORM_DONE
++ if type(self.active) ~= "function" then
++ self.active:populate_delegator(self)
++ stat = self.active:parse()
++ else
++ self:active()
++ end
++
++ if stat > FORM_PROCEED then
++ if Map.formvalue(self, "cbi.delg.back") then
++ newcurrent = self:get_prev(self.current)
++ else
++ newcurrent = self:get_next(self.current)
++ end
++ elseif stat < FORM_PROCEED then
++ return stat
++ end
++
++
++ if not Map.formvalue(self, "cbi.submit") then
++ return FORM_NODATA
++ elseif stat > FORM_PROCEED
++ and (not newcurrent or not self:get(newcurrent)) then
++ return self:_run_hook("on_done") or FORM_DONE
++ else
++ self.current = newcurrent or self.current
++ self.active = self:get(self.current)
++ if type(self.active) ~= "function" then
++ self.active:populate_delegator(self)
++ local stat = self.active:parse(false)
++ if stat == FORM_SKIP then
++ return self:parse(...)
++ else
++ return FORM_PROCEED
++ end
++ else
++ return self:parse(...)
++ end
++ end
++end
++
++function Delegator.get_next(self, state)
++ for k, v in ipairs(self.chain) do
++ if v == state then
++ return self.chain[k+1]
++ end
++ end
++end
++
++function Delegator.get_prev(self, state)
++ for k, v in ipairs(self.chain) do
++ if v == state then
++ return self.chain[k-1]
++ end
++ end
++end
++
++function Delegator.get_chain(self)
++ local x = Map.formvalue(self, "cbi.delg.path") or self.defaultpath
++ return type(x) == "table" and x or {x}
++end
++
++function Delegator.get_active(self)
++ return Map.formvalue(self, "cbi.delg.current") or self.chain[1]
++end
++
++--[[
++Page - A simple node
++]]--
++
++Page = class(Node)
++Page.__init__ = Node.__init__
++Page.parse = function() end
++
++
++--[[
++SimpleForm - A Simple non-UCI form
++]]--
++SimpleForm = class(Node)
++
++function SimpleForm.__init__(self, config, title, description, data)
++ Node.__init__(self, title, description)
++ self.config = config
++ self.data = data or {}
++ self.template = "cbi/simpleform"
++ self.dorender = true
++ self.pageaction = false
++ self.readinput = true
++end
++
++SimpleForm.formvalue = Map.formvalue
++SimpleForm.formvaluetable = Map.formvaluetable
++
++function SimpleForm.parse(self, readinput, ...)
++ self.readinput = (readinput ~= false)
++
++ if self:formvalue("cbi.skip") then
++ return FORM_SKIP
++ end
++
++ if self:formvalue("cbi.cancel") and self:_run_hooks("on_cancel") then
++ return FORM_DONE
++ end
++
++ if self:submitstate() then
++ Node.parse(self, 1, ...)
++ end
++
++ local valid = true
++ for k, j in ipairs(self.children) do
++ for i, v in ipairs(j.children) do
++ valid = valid
++ and (not v.tag_missing or not v.tag_missing[1])
++ and (not v.tag_invalid or not v.tag_invalid[1])
++ and (not v.error)
++ end
++ end
++
++ local state =
++ not self:submitstate() and FORM_NODATA
++ or valid and FORM_VALID
++ or FORM_INVALID
++
++ self.dorender = not self.handle
++ if self.handle then
++ local nrender, nstate = self:handle(state, self.data)
++ self.dorender = self.dorender or (nrender ~= false)
++ state = nstate or state
++ end
++ return state
++end
++
++function SimpleForm.render(self, ...)
++ if self.dorender then
++ Node.render(self, ...)
++ end
++end
++
++function SimpleForm.submitstate(self)
++ return self:formvalue("cbi.submit")
++end
++
++function SimpleForm.section(self, class, ...)
++ if instanceof(class, AbstractSection) then
++ local obj = class(self, ...)
++ self:append(obj)
++ return obj
++ else
++ error("class must be a descendent of AbstractSection")
++ end
++end
++
++-- Creates a child field
++function SimpleForm.field(self, class, ...)
++ local section
++ for k, v in ipairs(self.children) do
++ if instanceof(v, SimpleSection) then
++ section = v
++ break
++ end
++ end
++ if not section then
++ section = self:section(SimpleSection)
++ end
++
++ if instanceof(class, AbstractValue) then
++ local obj = class(self, section, ...)
++ obj.track_missing = true
++ section:append(obj)
++ return obj
++ else
++ error("class must be a descendent of AbstractValue")
++ end
++end
++
++function SimpleForm.set(self, section, option, value)
++ self.data[option] = value
++end
++
++
++function SimpleForm.del(self, section, option)
++ self.data[option] = nil
++end
++
++
++function SimpleForm.get(self, section, option)
++ return self.data[option]
++end
++
++
++function SimpleForm.get_scheme()
++ return nil
++end
++
++
++Form = class(SimpleForm)
++
++function Form.__init__(self, ...)
++ SimpleForm.__init__(self, ...)
++ self.embedded = true
++end
++
++
++--[[
++AbstractSection
++]]--
++AbstractSection = class(Node)
++
++function AbstractSection.__init__(self, map, sectiontype, ...)
++ Node.__init__(self, ...)
++ self.sectiontype = sectiontype
++ self.map = map
++ self.config = map.config
++ self.optionals = {}
++ self.defaults = {}
++ self.fields = {}
++ self.tag_error = {}
++ self.tag_invalid = {}
++ self.tag_deperror = {}
++ self.changed = false
++
++ self.optional = true
++ self.addremove = false
++ self.dynamic = false
++end
++
++-- Define a tab for the section
++function AbstractSection.tab(self, tab, title, desc)
++ self.tabs = self.tabs or { }
++ self.tab_names = self.tab_names or { }
++
++ self.tab_names[#self.tab_names+1] = tab
++ self.tabs[tab] = {
++ title = title,
++ description = desc,
++ childs = { }
++ }
++end
++
++-- Check whether the section has tabs
++function AbstractSection.has_tabs(self)
++ return (self.tabs ~= nil) and (next(self.tabs) ~= nil)
++end
++
++-- Appends a new option
++function AbstractSection.option(self, class, option, ...)
++ if instanceof(class, AbstractValue) then
++ local obj = class(self.map, self, option, ...)
++ self:append(obj)
++ self.fields[option] = obj
++ return obj
++ elseif class == true then
++ error("No valid class was given and autodetection failed.")
++ else
++ error("class must be a descendant of AbstractValue")
++ end
++end
++
++-- Appends a new tabbed option
++function AbstractSection.taboption(self, tab, ...)
++
++ assert(tab and self.tabs and self.tabs[tab],
++ "Cannot assign option to not existing tab %q" % tostring(tab))
++
++ local l = self.tabs[tab].childs
++ local o = AbstractSection.option(self, ...)
++
++ if o then l[#l+1] = o end
++
++ return o
++end
++
++-- Render a single tab
++function AbstractSection.render_tab(self, tab, ...)
++
++ assert(tab and self.tabs and self.tabs[tab],
++ "Cannot render not existing tab %q" % tostring(tab))
++
++ local k, node
++ for k, node in ipairs(self.tabs[tab].childs) do
++ node.last_child = (k == #self.tabs[tab].childs)
++ node:render(...)
++ end
++end
++
++-- Parse optional options
++function AbstractSection.parse_optionals(self, section)
++ if not self.optional then
++ return
++ end
++
++ self.optionals[section] = {}
++
++ local field = self.map:formvalue("cbi.opt."..self.config.."."..section)
++ for k,v in ipairs(self.children) do
++ if v.optional and not v:cfgvalue(section) and not self:has_tabs() then
++ if field == v.option then
++ field = nil
++ self.map.proceed = true
++ else
++ table.insert(self.optionals[section], v)
++ end
++ end
++ end
++
++ if field and #field > 0 and self.dynamic then
++ self:add_dynamic(field)
++ end
++end
++
++-- Add a dynamic option
++function AbstractSection.add_dynamic(self, field, optional)
++ local o = self:option(Value, field, field)
++ o.optional = optional
++end
++
++-- Parse all dynamic options
++function AbstractSection.parse_dynamic(self, section)
++ if not self.dynamic then
++ return
++ end
++
++ local arr = luci.util.clone(self:cfgvalue(section))
++ local form = self.map:formvaluetable("cbid."..self.config.."."..section)
++ for k, v in pairs(form) do
++ arr[k] = v
++ end
++
++ for key,val in pairs(arr) do
++ local create = true
++
++ for i,c in ipairs(self.children) do
++ if c.option == key then
++ create = false
++ end
++ end
++
++ if create and key:sub(1, 1) ~= "." then
++ self.map.proceed = true
++ self:add_dynamic(key, true)
++ end
++ end
++end
++
++-- Returns the section's UCI table
++function AbstractSection.cfgvalue(self, section)
++ return self.map:get(section)
++end
++
++-- Push events
++function AbstractSection.push_events(self)
++ --luci.util.append(self.map.events, self.events)
++ self.map.changed = true
++end
++
++-- Removes the section
++function AbstractSection.remove(self, section)
++ self.map.proceed = true
++ return self.map:del(section)
++end
++
++-- Creates the section
++function AbstractSection.create(self, section)
++ local stat
++
++ if section then
++ stat = section:match("^[%w_]+$") and self.map:set(section, nil, self.sectiontype)
++ else
++ section = self.map:add(self.sectiontype)
++ stat = section
++ end
++
++ if stat then
++ for k,v in pairs(self.children) do
++ if v.default then
++ self.map:set(section, v.option, v.default)
++ end
++ end
++
++ for k,v in pairs(self.defaults) do
++ self.map:set(section, k, v)
++ end
++ end
++
++ self.map.proceed = true
++
++ return stat
++end
++
++
++SimpleSection = class(AbstractSection)
++
++function SimpleSection.__init__(self, form, ...)
++ AbstractSection.__init__(self, form, nil, ...)
++ self.template = "cbi/nullsection"
++end
++
++
++Table = class(AbstractSection)
++
++function Table.__init__(self, form, data, ...)
++ local datasource = {}
++ local tself = self
++ datasource.config = "table"
++ self.data = data or {}
++
++ datasource.formvalue = Map.formvalue
++ datasource.formvaluetable = Map.formvaluetable
++ datasource.readinput = true
++
++ function datasource.get(self, section, option)
++ return tself.data[section] and tself.data[section][option]
++ end
++
++ function datasource.submitstate(self)
++ return Map.formvalue(self, "cbi.submit")
++ end
++
++ function datasource.del(...)
++ return true
++ end
++
++ function datasource.get_scheme()
++ return nil
++ end
++
++ AbstractSection.__init__(self, datasource, "table", ...)
++ self.template = "cbi/tblsection"
++ self.rowcolors = true
++ self.anonymous = true
++end
++
++function Table.parse(self, readinput)
++ self.map.readinput = (readinput ~= false)
++ for i, k in ipairs(self:cfgsections()) do
++ if self.map:submitstate() then
++ Node.parse(self, k)
++ end
++ end
++end
++
++function Table.cfgsections(self)
++ local sections = {}
++
++ for i, v in luci.util.kspairs(self.data) do
++ table.insert(sections, i)
++ end
++
++ return sections
++end
++
++function Table.update(self, data)
++ self.data = data
++end
++
++
++
++--[[
++NamedSection - A fixed configuration section defined by its name
++]]--
++NamedSection = class(AbstractSection)
++
++function NamedSection.__init__(self, map, section, stype, ...)
++ AbstractSection.__init__(self, map, stype, ...)
++
++ -- Defaults
++ self.addremove = false
++ self.template = "cbi/nsection"
++ self.section = section
++end
++
++function NamedSection.parse(self, novld)
++ local s = self.section
++ local active = self:cfgvalue(s)
++
++ if self.addremove then
++ local path = self.config.."."..s
++ if active then -- Remove the section
++ if self.map:formvalue("cbi.rns."..path) and self:remove(s) then
++ self:push_events()
++ return
++ end
++ else -- Create and apply default values
++ if self.map:formvalue("cbi.cns."..path) then
++ self:create(s)
++ return
++ end
++ end
++ end
++
++ if active then
++ AbstractSection.parse_dynamic(self, s)
++ if self.map:submitstate() then
++ Node.parse(self, s)
++ end
++ AbstractSection.parse_optionals(self, s)
++
++ if self.changed then
++ self:push_events()
++ end
++ end
++end
++
++
++--[[
++TypedSection - A (set of) configuration section(s) defined by the type
++ addremove: Defines whether the user can add/remove sections of this type
++ anonymous: Allow creating anonymous sections
++ validate: a validation function returning nil if the section is invalid
++]]--
++TypedSection = class(AbstractSection)
++
++function TypedSection.__init__(self, map, type, ...)
++ AbstractSection.__init__(self, map, type, ...)
++
++ self.template = "cbi/tsection"
++ self.deps = {}
++ self.anonymous = false
++end
++
++-- Return all matching UCI sections for this TypedSection
++function TypedSection.cfgsections(self)
++ local sections = {}
++ self.map.uci:foreach(self.map.config, self.sectiontype,
++ function (section)
++ if self:checkscope(section[".name"]) then
++ table.insert(sections, section[".name"])
++ end
++ end)
++
++ return sections
++end
++
++-- Limits scope to sections that have certain option => value pairs
++function TypedSection.depends(self, option, value)
++ table.insert(self.deps, {option=option, value=value})
++end
++
++function TypedSection.parse(self, novld)
++ if self.addremove then
++ -- Remove
++ local crval = REMOVE_PREFIX .. self.config
++ local name = self.map:formvaluetable(crval)
++ for k,v in pairs(name) do
++ if k:sub(-2) == ".x" then
++ k = k:sub(1, #k - 2)
++ end
++ if self:cfgvalue(k) and self:checkscope(k) then
++ self:remove(k)
++ end
++ end
++ end
++
++ local co
++ for i, k in ipairs(self:cfgsections()) do
++ AbstractSection.parse_dynamic(self, k)
++ if self.map:submitstate() then
++ Node.parse(self, k, novld)
++ end
++ AbstractSection.parse_optionals(self, k)
++ end
++
++ if self.addremove then
++ -- Create
++ local created
++ local crval = CREATE_PREFIX .. self.config .. "." .. self.sectiontype
++ local origin, name = next(self.map:formvaluetable(crval))
++ if self.anonymous then
++ if name then
++ created = self:create(nil, origin)
++ end
++ else
++ if name then
++ -- Ignore if it already exists
++ if self:cfgvalue(name) then
++ name = nil;
++ end
++
++ name = self:checkscope(name)
++
++ if not name then
++ self.err_invalid = true
++ end
++
++ if name and #name > 0 then
++ created = self:create(name, origin) and name
++ if not created then
++ self.invalid_cts = true
++ end
++ end
++ end
++ end
++
++ if created then
++ AbstractSection.parse_optionals(self, created)
++ end
++ end
++
++ if self.sortable then
++ 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
++ for sid in util.imatch(order) do
++ self.map.uci:reorder(self.config, sid, num)
++ num = num + 1
++ end
++ self.changed = (num > 0)
++ end
++ end
++
++ if created or self.changed then
++ self:push_events()
++ end
++end
++
++-- Verifies scope of sections
++function TypedSection.checkscope(self, section)
++ -- Check if we are not excluded
++ if self.filter and not self:filter(section) then
++ return nil
++ end
++
++ -- Check if at least one dependency is met
++ if #self.deps > 0 and self:cfgvalue(section) then
++ local stat = false
++
++ for k, v in ipairs(self.deps) do
++ if self:cfgvalue(section)[v.option] == v.value then
++ stat = true
++ end
++ end
++
++ if not stat then
++ return nil
++ end
++ end
++
++ return self:validate(section)
++end
++
++
++-- Dummy validate function
++function TypedSection.validate(self, section)
++ return section
++end
++
++
++--[[
++AbstractValue - An abstract Value Type
++ null: Value can be empty
++ valid: A function returning the value if it is valid otherwise nil
++ depends: A table of option => value pairs of which one must be true
++ default: The default value
++ size: The size of the input fields
++ rmempty: Unset value if empty
++ optional: This value is optional (see AbstractSection.optionals)
++]]--
++AbstractValue = class(Node)
++
++function AbstractValue.__init__(self, map, section, option, ...)
++ Node.__init__(self, ...)
++ self.section = section
++ self.option = option
++ self.map = map
++ self.config = map.config
++ self.tag_invalid = {}
++ self.tag_missing = {}
++ self.tag_reqerror = {}
++ self.tag_error = {}
++ self.deps = {}
++ self.subdeps = {}
++ --self.cast = "string"
++
++ self.track_missing = false
++ self.rmempty = true
++ self.default = nil
++ self.size = nil
++ self.optional = false
++end
++
++function AbstractValue.prepare(self)
++ self.cast = self.cast or "string"
++end
++
++-- Add a dependencie to another section field
++function AbstractValue.depends(self, field, value)
++ local deps
++ if type(field) == "string" then
++ deps = {}
++ deps[field] = value
++ else
++ deps = field
++ end
++
++ table.insert(self.deps, {deps=deps, add=""})
++end
++
++-- Generates the unique CBID
++function AbstractValue.cbid(self, section)
++ return "cbid."..self.map.config.."."..section.."."..self.option
++end
++
++-- Return whether this object should be created
++function AbstractValue.formcreated(self, section)
++ local key = "cbi.opt."..self.config.."."..section
++ return (self.map:formvalue(key) == self.option)
++end
++
++-- Returns the formvalue for this object
++function AbstractValue.formvalue(self, section)
++ return self.map:formvalue(self:cbid(section))
++end
++
++function AbstractValue.additional(self, value)
++ self.optional = value
++end
++
++function AbstractValue.mandatory(self, value)
++ self.rmempty = not value
++end
++
++function AbstractValue.add_error(self, section, type, msg)
++ self.error = self.error or { }
++ self.error[section] = msg or type
++
++ self.section.error = self.section.error or { }
++ self.section.error[section] = self.section.error[section] or { }
++ table.insert(self.section.error[section], msg or type)
++
++ if type == "invalid" then
++ self.tag_invalid[section] = true
++ elseif type == "missing" then
++ self.tag_missing[section] = true
++ end
++
++ self.tag_error[section] = true
++ self.map.save = false
++end
++
++function AbstractValue.parse(self, section, novld)
++ local fvalue = self:formvalue(section)
++ local cvalue = self:cfgvalue(section)
++
++ -- If favlue and cvalue are both tables and have the same content
++ -- make them identical
++ if type(fvalue) == "table" and type(cvalue) == "table" then
++ local equal = #fvalue == #cvalue
++ if equal then
++ for i=1, #fvalue do
++ if cvalue[i] ~= fvalue[i] then
++ equal = false
++ end
++ end
++ end
++ if equal then
++ fvalue = cvalue
++ end
++ end
++
++ if fvalue and #fvalue > 0 then -- If we have a form value, write it to UCI
++ local val_err
++ fvalue, val_err = self:validate(fvalue, section)
++ fvalue = self:transform(fvalue)
++
++ if not fvalue and not novld then
++ self:add_error(section, "invalid", val_err)
++ end
++
++ if fvalue and (self.forcewrite or not (fvalue == cvalue)) then
++ if self:write(section, fvalue) then
++ -- Push events
++ self.section.changed = true
++ --luci.util.append(self.map.events, self.events)
++ end
++ 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)
++ end
++ elseif cvalue ~= fvalue and not novld then
++ -- trigger validator with nil value to get custom user error msg.
++ local _, val_err = self:validate(nil, section)
++ self:add_error(section, "missing", val_err)
++ end
++ end
++end
++
++-- Render if this value exists or if it is mandatory
++function AbstractValue.render(self, s, scope)
++ if not self.optional or self.section:has_tabs() or self:cfgvalue(s) or self:formcreated(s) then
++ scope = scope or {}
++ scope.section = s
++ scope.cbid = self:cbid(s)
++ Node.render(self, scope)
++ end
++end
++
++-- Return the UCI value of this object
++function AbstractValue.cfgvalue(self, section)
++ local value
++ if self.tag_error[section] then
++ value = self:formvalue(section)
++ else
++ value = self.map:get(section, self.option)
++ end
++
++ if not value then
++ return nil
++ elseif not self.cast or self.cast == type(value) then
++ return value
++ elseif self.cast == "string" then
++ if type(value) == "table" then
++ return value[1]
++ end
++ elseif self.cast == "table" then
++ return { value }
++ end
++end
++
++-- Validate the form value
++function AbstractValue.validate(self, value)
++ if self.datatype and value then
++ if type(value) == "table" then
++ local v
++ for _, v in ipairs(value) do
++ if v and #v > 0 and not verify_datatype(self.datatype, v) then
++ return nil
++ end
++ end
++ else
++ if not verify_datatype(self.datatype, value) then
++ return nil
++ end
++ end
++ end
++
++ return value
++end
++
++AbstractValue.transform = AbstractValue.validate
++
++
++-- Write to UCI
++function AbstractValue.write(self, section, value)
++ return self.map:set(section, self.option, value)
++end
++
++-- Remove from UCI
++function AbstractValue.remove(self, section)
++ return self.map:del(section, self.option)
++end
++
++
++
++
++--[[
++Value - A one-line value
++ maxlength: The maximum length
++]]--
++Value = class(AbstractValue)
++
++function Value.__init__(self, ...)
++ AbstractValue.__init__(self, ...)
++ self.template = "cbi/value"
++ self.keylist = {}
++ self.vallist = {}
++ self.readonly = nil
++end
++
++function Value.reset_values(self)
++ self.keylist = {}
++ self.vallist = {}
++end
++
++function Value.value(self, key, val)
++ val = val or key
++ table.insert(self.keylist, tostring(key))
++ table.insert(self.vallist, tostring(val))
++end
++
++function Value.parse(self, section, novld)
++ if self.readonly then return end
++ AbstractValue.parse(self, section, novld)
++end
++
++-- DummyValue - This does nothing except being there
++DummyValue = class(AbstractValue)
++
++function DummyValue.__init__(self, ...)
++ AbstractValue.__init__(self, ...)
++ self.template = "cbi/dvalue"
++ self.value = nil
++end
++
++function DummyValue.cfgvalue(self, section)
++ local value
++ if self.value then
++ if type(self.value) == "function" then
++ value = self:value(section)
++ else
++ value = self.value
++ end
++ else
++ value = AbstractValue.cfgvalue(self, section)
++ end
++ return value
++end
++
++function DummyValue.parse(self)
++
++end
++
++
++--[[
++Flag - A flag being enabled or disabled
++]]--
++Flag = class(AbstractValue)
++
++function Flag.__init__(self, ...)
++ AbstractValue.__init__(self, ...)
++ self.template = "cbi/fvalue"
++
++ self.enabled = "1"
++ self.disabled = "0"
++ self.default = self.disabled
++end
++
++-- A flag can only have two states: set or unset
++function Flag.parse(self, section, novld)
++ local fexists = self.map:formvalue(
++ FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option)
++
++ if fexists then
++ local fvalue = self:formvalue(section) and self.enabled or self.disabled
++ local cvalue = self:cfgvalue(section)
++ local val_err
++ fvalue, val_err = self:validate(fvalue, section)
++ if not fvalue then
++ if not novld then
++ self:add_error(section, "invalid", val_err)
++ end
++ return
++ end
++ if fvalue == self.default and (self.optional or self.rmempty) then
++ self:remove(section)
++ else
++ self:write(section, fvalue)
++ end
++ if (fvalue ~= cvalue) then self.section.changed = true end
++ else
++ self:remove(section)
++ self.section.changed = true
++ end
++end
++
++function Flag.cfgvalue(self, section)
++ return AbstractValue.cfgvalue(self, section) or self.default
++end
++function Flag.validate(self, value)
++ return value
++end
++
++--[[
++ListValue - A one-line value predefined in a list
++ widget: The widget that will be used (select, radio)
++]]--
++ListValue = class(AbstractValue)
++
++function ListValue.__init__(self, ...)
++ AbstractValue.__init__(self, ...)
++ self.template = "cbi/lvalue"
++
++ self.keylist = {}
++ self.vallist = {}
++ self.size = 1
++ self.widget = "select"
++end
++
++function ListValue.reset_values(self)
++ self.keylist = {}
++ self.vallist = {}
++end
++
++function ListValue.value(self, key, val, ...)
++ if luci.util.contains(self.keylist, key) then
++ return
++ end
++
++ val = val or key
++ table.insert(self.keylist, tostring(key))
++ table.insert(self.vallist, tostring(val))
++
++ for i, deps in ipairs({...}) do
++ self.subdeps[#self.subdeps + 1] = {add = "-"..key, deps=deps}
++ end
++end
++
++function ListValue.validate(self, val)
++ if luci.util.contains(self.keylist, val) then
++ return val
++ else
++ return nil
++ end
++end
++
++
++
++--[[
++MultiValue - Multiple delimited values
++ widget: The widget that will be used (select, checkbox)
++ delimiter: The delimiter that will separate the values (default: " ")
++]]--
++MultiValue = class(AbstractValue)
++
++function MultiValue.__init__(self, ...)
++ AbstractValue.__init__(self, ...)
++ self.template = "cbi/mvalue"
++
++ self.keylist = {}
++ self.vallist = {}
++
++ self.widget = "checkbox"
++ self.delimiter = " "
++end
++
++function MultiValue.render(self, ...)
++ if self.widget == "select" and not self.size then
++ self.size = #self.vallist
++ end
++
++ AbstractValue.render(self, ...)
++end
++
++function MultiValue.reset_values(self)
++ self.keylist = {}
++ self.vallist = {}
++end
++
++function MultiValue.value(self, key, val)
++ if luci.util.contains(self.keylist, key) then
++ return
++ end
++
++ val = val or key
++ table.insert(self.keylist, tostring(key))
++ table.insert(self.vallist, tostring(val))
++end
++
++function MultiValue.valuelist(self, section)
++ local val = self:cfgvalue(section)
++
++ if not(type(val) == "string") then
++ return {}
++ end
++
++ return luci.util.split(val, self.delimiter)
++end
++
++function MultiValue.validate(self, val)
++ val = (type(val) == "table") and val or {val}
++
++ local result
++
++ for i, value in ipairs(val) do
++ if luci.util.contains(self.keylist, value) then
++ result = result and (result .. self.delimiter .. value) or value
++ end
++ end
++
++ return result
++end
++
++
++StaticList = class(MultiValue)
++
++function StaticList.__init__(self, ...)
++ MultiValue.__init__(self, ...)
++ self.cast = "table"
++ self.valuelist = self.cfgvalue
++
++ if not self.override_scheme
++ and self.map:get_scheme(self.section.sectiontype, self.option) then
++ local vs = self.map:get_scheme(self.section.sectiontype, self.option)
++ if self.value and vs.values and not self.override_values then
++ for k, v in pairs(vs.values) do
++ self:value(k, v)
++ end
++ end
++ end
++end
++
++function StaticList.validate(self, value)
++ value = (type(value) == "table") and value or {value}
++
++ local valid = {}
++ for i, v in ipairs(value) do
++ if luci.util.contains(self.keylist, v) then
++ table.insert(valid, v)
++ end
++ end
++ return valid
++end
++
++
++DynamicList = class(AbstractValue)
++
++function DynamicList.__init__(self, ...)
++ AbstractValue.__init__(self, ...)
++ self.template = "cbi/dynlist"
++ self.cast = "table"
++ self.keylist = {}
++ self.vallist = {}
++end
++
++function DynamicList.reset_values(self)
++ self.keylist = {}
++ self.vallist = {}
++end
++
++function DynamicList.value(self, key, val)
++ val = val or key
++ table.insert(self.keylist, tostring(key))
++ table.insert(self.vallist, tostring(val))
++end
++
++function DynamicList.write(self, section, value)
++ local t = { }
++
++ if type(value) == "table" then
++ local x
++ for _, x in ipairs(value) do
++ if x and #x > 0 then
++ t[#t+1] = x
++ end
++ end
++ else
++ t = { value }
++ end
++
++ if self.cast == "string" then
++ value = table.concat(t, " ")
++ else
++ value = t
++ end
++
++ return AbstractValue.write(self, section, value)
++end
++
++function DynamicList.cfgvalue(self, section)
++ local value = AbstractValue.cfgvalue(self, section)
++
++ if type(value) == "string" then
++ local x
++ local t = { }
++ for x in value:gmatch("%S+") do
++ if #x > 0 then
++ t[#t+1] = x
++ end
++ end
++ value = t
++ end
++
++ return value
++end
++
++function DynamicList.formvalue(self, section)
++ local value = AbstractValue.formvalue(self, section)
++
++ if type(value) == "string" then
++ if self.cast == "string" then
++ local x
++ local t = { }
++ for x in value:gmatch("%S+") do
++ t[#t+1] = x
++ end
++ value = t
++ else
++ value = { value }
++ end
++ end
++
++ return value
++end
++
++
++--[[
++TextValue - A multi-line value
++ rows: Rows
++]]--
++TextValue = class(AbstractValue)
++
++function TextValue.__init__(self, ...)
++ AbstractValue.__init__(self, ...)
++ self.template = "cbi/tvalue"
++end
++
++--[[
++Button
++]]--
++Button = class(AbstractValue)
++
++function Button.__init__(self, ...)
++ AbstractValue.__init__(self, ...)
++ self.template = "cbi/button"
++ self.inputstyle = nil
++ self.rmempty = true
++end
++
++
++FileUpload = class(AbstractValue)
++
++function FileUpload.__init__(self, ...)
++ AbstractValue.__init__(self, ...)
++ self.template = "cbi/upload"
++ if not self.map.upload_fields then
++ self.map.upload_fields = { self }
++ else
++ self.map.upload_fields[#self.map.upload_fields+1] = self
++ end
++end
++
++function FileUpload.formcreated(self, section)
++ return AbstractValue.formcreated(self, section) or
++ self.map:formvalue("cbi.rlf."..section.."."..self.option) or
++ self.map:formvalue("cbi.rlf."..section.."."..self.option..".x")
++end
++
++function FileUpload.cfgvalue(self, section)
++ local val = AbstractValue.cfgvalue(self, section)
++ if val and fs.access(val) then
++ return val
++ end
++ return nil
++end
++
++function FileUpload.formvalue(self, section)
++ local val = AbstractValue.formvalue(self, section)
++ if val then
++ if not self.map:formvalue("cbi.rlf."..section.."."..self.option) and
++ not self.map:formvalue("cbi.rlf."..section.."."..self.option..".x")
++ then
++ return val
++ end
++ fs.unlink(val)
++ self.value = nil
++ end
++ return nil
++end
++
++function FileUpload.remove(self, section)
++ local val = AbstractValue.formvalue(self, section)
++ if val and fs.access(val) then fs.unlink(val) end
++ return AbstractValue.remove(self, section)
++end
++
++
++FileBrowser = class(AbstractValue)
++
++function FileBrowser.__init__(self, ...)
++ AbstractValue.__init__(self, ...)
++ self.template = "cbi/browser"
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/cbi/datatypes.lua b/feeds/luci/modules/luci-base/luasrc/cbi/datatypes.lua
+new file mode 100644
+index 0000000..ebd7e59
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/cbi/datatypes.lua
+@@ -0,0 +1,333 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local ip = require "luci.ip"
++local math = require "math"
++local util = require "luci.util"
++local tonumber, tostring, type, unpack, select = tonumber, tostring, type, unpack, select
++
++
++module "luci.cbi.datatypes"
++
++
++_M['or'] = function(v, ...)
++ local i
++ for i = 1, select('#', ...), 2 do
++ local f = select(i, ...)
++ local a = select(i+1, ...)
++ if type(f) ~= "function" then
++ if f == v then
++ return true
++ end
++ i = i - 1
++ elseif f(v, unpack(a)) then
++ return true
++ end
++ end
++ return false
++end
++
++_M['and'] = function(v, ...)
++ local i
++ for i = 1, select('#', ...), 2 do
++ local f = select(i, ...)
++ local a = select(i+1, ...)
++ if type(f) ~= "function" then
++ if f ~= v then
++ return false
++ end
++ i = i - 1
++ elseif not f(v, unpack(a)) then
++ return false
++ end
++ end
++ return true
++end
++
++function neg(v, ...)
++ return _M['or'](v:gsub("^%s*!%s*", ""), ...)
++end
++
++function list(v, subvalidator, subargs)
++ if type(subvalidator) ~= "function" then
++ return false
++ end
++ local token
++ for token in v:gmatch("%S+") do
++ if not subvalidator(token, unpack(subargs)) then
++ return false
++ end
++ end
++ return true
++end
++
++function bool(val)
++ if val == "1" or val == "yes" or val == "on" or val == "true" then
++ return true
++ elseif val == "0" or val == "no" or val == "off" or val == "false" then
++ return true
++ elseif val == "" or val == nil then
++ return true
++ end
++
++ return false
++end
++
++function uinteger(val)
++ local n = tonumber(val)
++ if n ~= nil and math.floor(n) == n and n >= 0 then
++ return true
++ end
++
++ return false
++end
++
++function integer(val)
++ local n = tonumber(val)
++ if n ~= nil and math.floor(n) == n then
++ return true
++ end
++
++ return false
++end
++
++function ufloat(val)
++ local n = tonumber(val)
++ return ( n ~= nil and n >= 0 )
++end
++
++function float(val)
++ return ( tonumber(val) ~= nil )
++end
++
++function ipaddr(val)
++ return ip4addr(val) or ip6addr(val)
++end
++
++function ip4addr(val)
++ if val then
++ return ip.IPv4(val) and true or false
++ end
++
++ return false
++end
++
++function ip4prefix(val)
++ val = tonumber(val)
++ return ( val and val >= 0 and val <= 32 )
++end
++
++function ip6addr(val)
++ if val then
++ return ip.IPv6(val) and true or false
++ end
++
++ return false
++end
++
++function ip6prefix(val)
++ val = tonumber(val)
++ return ( val and val >= 0 and val <= 128 )
++end
++
++function port(val)
++ val = tonumber(val)
++ return ( val and val >= 0 and val <= 65535 )
++end
++
++function portrange(val)
++ local p1, p2 = val:match("^(%d+)%-(%d+)$")
++ if p1 and p2 and port(p1) and port(p2) then
++ return true
++ else
++ return port(val)
++ end
++end
++
++function macaddr(val)
++ if val and val:match(
++ "^[a-fA-F0-9]+:[a-fA-F0-9]+:[a-fA-F0-9]+:" ..
++ "[a-fA-F0-9]+:[a-fA-F0-9]+:[a-fA-F0-9]+$"
++ ) then
++ local parts = util.split( val, ":" )
++
++ for i = 1,6 do
++ parts[i] = tonumber( parts[i], 16 )
++ if parts[i] < 0 or parts[i] > 255 then
++ return false
++ end
++ end
++
++ return true
++ end
++
++ return false
++end
++
++function hostname(val)
++ if val and (#val < 254) and (
++ val:match("^[a-zA-Z_]+$") or
++ (val:match("^[a-zA-Z0-9_][a-zA-Z0-9_%-%.]*[a-zA-Z0-9]$") and
++ val:match("[^0-9%.]"))
++ ) then
++ return true
++ end
++ return false
++end
++
++function host(val)
++ return hostname(val) or ipaddr(val)
++end
++
++function network(val)
++ return uciname(val) or host(val)
++end
++
++function wpakey(val)
++ if #val == 64 then
++ return (val:match("^[a-fA-F0-9]+$") ~= nil)
++ else
++ return (#val >= 8) and (#val <= 63)
++ end
++end
++
++function wepkey(val)
++ if val:sub(1, 2) == "s:" then
++ val = val:sub(3)
++ end
++
++ if (#val == 10) or (#val == 26) then
++ return (val:match("^[a-fA-F0-9]+$") ~= nil)
++ else
++ return (#val == 5) or (#val == 13)
++ end
++end
++
++function string(val)
++ return true -- Everything qualifies as valid string
++end
++
++function directory( val, seen )
++ local s = fs.stat(val)
++ seen = seen or { }
++
++ if s and not seen[s.ino] then
++ seen[s.ino] = true
++ if s.type == "dir" then
++ return true
++ elseif s.type == "lnk" then
++ return directory( fs.readlink(val), seen )
++ end
++ end
++
++ return false
++end
++
++function file( val, seen )
++ local s = fs.stat(val)
++ seen = seen or { }
++
++ if s and not seen[s.ino] then
++ seen[s.ino] = true
++ if s.type == "reg" then
++ return true
++ elseif s.type == "lnk" then
++ return file( fs.readlink(val), seen )
++ end
++ end
++
++ return false
++end
++
++function device( val, seen )
++ local s = fs.stat(val)
++ seen = seen or { }
++
++ if s and not seen[s.ino] then
++ seen[s.ino] = true
++ if s.type == "chr" or s.type == "blk" then
++ return true
++ elseif s.type == "lnk" then
++ return device( fs.readlink(val), seen )
++ end
++ end
++
++ return false
++end
++
++function uciname(val)
++ return (val:match("^[a-zA-Z0-9_]+$") ~= nil)
++end
++
++function range(val, min, max)
++ val = tonumber(val)
++ min = tonumber(min)
++ max = tonumber(max)
++
++ if val ~= nil and min ~= nil and max ~= nil then
++ return ((val >= min) and (val <= max))
++ end
++
++ return false
++end
++
++function min(val, min)
++ val = tonumber(val)
++ min = tonumber(min)
++
++ if val ~= nil and min ~= nil then
++ return (val >= min)
++ end
++
++ return false
++end
++
++function max(val, max)
++ val = tonumber(val)
++ max = tonumber(max)
++
++ if val ~= nil and max ~= nil then
++ return (val <= max)
++ end
++
++ return false
++end
++
++function rangelength(val, min, max)
++ val = tostring(val)
++ min = tonumber(min)
++ max = tonumber(max)
++
++ if val ~= nil and min ~= nil and max ~= nil then
++ return ((#val >= min) and (#val <= max))
++ end
++
++ return false
++end
++
++function minlength(val, min)
++ val = tostring(val)
++ min = tonumber(min)
++
++ if val ~= nil and min ~= nil then
++ return (#val >= min)
++ end
++
++ return false
++end
++
++function maxlength(val, max)
++ val = tostring(val)
++ max = tonumber(max)
++
++ if val ~= nil and max ~= nil then
++ return (#val <= max)
++ end
++
++ return false
++end
++
++function phonedigit(val)
++ return (val:match("^[0-9\*#!%.]+$") ~= nil)
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/ccache.lua b/feeds/luci/modules/luci-base/luasrc/ccache.lua
+new file mode 100644
+index 0000000..bcc76e6
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/ccache.lua
+@@ -0,0 +1,76 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local io = require "io"
++local fs = require "nixio.fs"
++local util = require "luci.util"
++local nixio = require "nixio"
++local debug = require "debug"
++local string = require "string"
++local package = require "package"
++
++local type, loadfile = type, loadfile
++
++
++module "luci.ccache"
++
++function cache_ondemand(...)
++ if debug.getinfo(1, 'S').source ~= "=?" then
++ cache_enable(...)
++ end
++end
++
++function cache_enable(cachepath, mode)
++ cachepath = cachepath or "/tmp/luci-modulecache"
++ mode = mode or "r--r--r--"
++
++ local loader = package.loaders[2]
++ local uid = nixio.getuid()
++
++ if not fs.stat(cachepath) then
++ fs.mkdir(cachepath)
++ end
++
++ local function _encode_filename(name)
++ local encoded = ""
++ for i=1, #name do
++ encoded = encoded .. ("%2X" % string.byte(name, i))
++ end
++ return encoded
++ end
++
++ local function _load_sane(file)
++ local stat = fs.stat(file)
++ if stat and stat.uid == uid and stat.modestr == mode then
++ return loadfile(file)
++ end
++ end
++
++ local function _write_sane(file, func)
++ if nixio.getuid() == uid then
++ local fp = io.open(file, "w")
++ if fp then
++ fp:write(util.get_bytecode(func))
++ fp:close()
++ fs.chmod(file, mode)
++ end
++ end
++ end
++
++ package.loaders[2] = function(mod)
++ local encoded = cachepath .. "/" .. _encode_filename(mod)
++ local modcons = _load_sane(encoded)
++
++ if modcons then
++ return modcons
++ end
++
++ -- No cachefile
++ modcons = loader(mod)
++ if type(modcons) == "function" then
++ _write_sane(encoded, modcons)
++ end
++ return modcons
++ end
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/config.lua b/feeds/luci/modules/luci-base/luasrc/config.lua
+new file mode 100644
+index 0000000..d01153f
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/config.lua
+@@ -0,0 +1,18 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local util = require "luci.util"
++module("luci.config",
++ function(m)
++ if pcall(require, "luci.model.uci") then
++ local config = util.threadlocal()
++ setmetatable(m, {
++ __index = function(tbl, key)
++ if not config[key] then
++ config[key] = luci.model.uci.cursor():get_all("luci", key)
++ end
++ return config[key]
++ end
++ })
++ end
++ end)
+diff --git a/feeds/luci/modules/luci-base/luasrc/controller/admin/servicectl.lua b/feeds/luci/modules/luci-base/luasrc/controller/admin/servicectl.lua
+new file mode 100644
+index 0000000..1d73eb4
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/controller/admin/servicectl.lua
+@@ -0,0 +1,49 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.admin.servicectl", package.seeall)
++
++function index()
++ entry({"servicectl"}, alias("servicectl", "status")).sysauth = "root"
++ entry({"servicectl", "status"}, call("action_status")).leaf = true
++ entry({"servicectl", "restart"}, post("action_restart")).leaf = true
++end
++
++function action_status()
++ local data = nixio.fs.readfile("/var/run/luci-reload-status")
++ if data then
++ luci.http.write("/etc/config/")
++ luci.http.write(data)
++ else
++ luci.http.write("finish")
++ end
++end
++
++function action_restart(args)
++ local uci = require "luci.model.uci".cursor()
++ if args then
++ local service
++ local services = { }
++
++ for service in args:gmatch("[%w_-]+") do
++ services[#services+1] = service
++ end
++
++ local command = uci:apply(services, true)
++ if nixio.fork() == 0 then
++ local i = nixio.open("/dev/null", "r")
++ local o = nixio.open("/dev/null", "w")
++
++ nixio.dup(i, nixio.stdin)
++ nixio.dup(o, nixio.stdout)
++
++ i:close()
++ o:close()
++
++ nixio.exec("/bin/sh", unpack(command))
++ else
++ luci.http.write("OK")
++ os.exit(0)
++ end
++ end
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/debug.lua b/feeds/luci/modules/luci-base/luasrc/debug.lua
+new file mode 100644
+index 0000000..8ff1bb6
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/debug.lua
+@@ -0,0 +1,37 @@
++local debug = require "debug"
++local io = require "io"
++local collectgarbage, floor = collectgarbage, math.floor
++
++module "luci.debug"
++__file__ = debug.getinfo(1, 'S').source:sub(2)
++
++-- Enables the memory tracer with given flags and returns a function to disable the tracer again
++function trap_memtrace(flags, dest)
++ flags = flags or "clr"
++ local tracefile = io.open(dest or "/tmp/memtrace", "w")
++ local peak = 0
++
++ local function trap(what, line)
++ local info = debug.getinfo(2, "Sn")
++ local size = floor(collectgarbage("count"))
++ if size > peak then
++ peak = size
++ end
++ if tracefile then
++ tracefile:write(
++ "[", what, "] ", info.source, ":", (line or "?"), "\t",
++ (info.namewhat or ""), "\t",
++ (info.name or ""), "\t",
++ size, " (", peak, ")\n"
++ )
++ end
++ end
++
++ debug.sethook(trap, flags)
++
++ return function()
++ debug.sethook()
++ tracefile:close()
++ end
++end
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/dispatcher.lua b/feeds/luci/modules/luci-base/luasrc/dispatcher.lua
+new file mode 100644
+index 0000000..cd5d77a
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/dispatcher.lua
+@@ -0,0 +1,910 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local sys = require "luci.sys"
++local util = require "luci.util"
++local http = require "luci.http"
++local nixio = require "nixio", require "nixio.util"
++
++module("luci.dispatcher", package.seeall)
++context = util.threadlocal()
++uci = require "luci.model.uci"
++i18n = require "luci.i18n"
++_M.fs = fs
++
++authenticator = {}
++
++-- Index table
++local index = nil
++
++-- Fastindex
++local fi
++
++
++function build_url(...)
++ local path = {...}
++ local url = { http.getenv("SCRIPT_NAME") or "" }
++
++ local p
++ for _, p in ipairs(path) do
++ if p:match("^[a-zA-Z0-9_%-%.%%/,;]+$") then
++ url[#url+1] = "/"
++ url[#url+1] = p
++ end
++ end
++
++ if #path == 0 then
++ url[#url+1] = "/"
++ end
++
++ return table.concat(url, "")
++end
++
++function node_visible(node)
++ if node then
++ return not (
++ (not node.title or #node.title == 0) or
++ (not node.target or node.hidden == true) or
++ (type(node.target) == "table" and node.target.type == "firstchild" and
++ (type(node.nodes) ~= "table" or not next(node.nodes)))
++ )
++ end
++ return false
++end
++
++function node_childs(node)
++ local rv = { }
++ if node then
++ local k, v
++ for k, v in util.spairs(node.nodes,
++ function(a, b)
++ return (node.nodes[a].order or 100)
++ < (node.nodes[b].order or 100)
++ end)
++ do
++ if node_visible(v) then
++ rv[#rv+1] = k
++ end
++ end
++ end
++ return rv
++end
++
++
++function error404(message)
++ http.status(404, "Not Found")
++ message = message or "Not Found"
++
++ require("luci.template")
++ if not util.copcall(luci.template.render, "error404") then
++ http.prepare_content("text/plain")
++ http.write(message)
++ end
++ return false
++end
++
++function error500(message)
++ util.perror(message)
++ if not context.template_header_sent then
++ http.status(500, "Internal Server Error")
++ http.prepare_content("text/plain")
++ http.write(message)
++ else
++ require("luci.template")
++ if not util.copcall(luci.template.render, "error500", {message=message}) then
++ http.prepare_content("text/plain")
++ http.write(message)
++ end
++ end
++ return false
++end
++
++function authenticator.htmlauth(validator, accs, default)
++ local user = http.formvalue("luci_username")
++ local pass = http.formvalue("luci_password")
++
++ if user and validator(user, pass) then
++ return user
++ end
++
++ require("luci.i18n")
++ require("luci.template")
++ context.path = {}
++ http.status(403, "Forbidden")
++ luci.template.render("sysauth", {duser=default, fuser=user})
++
++ return false
++
++end
++
++function httpdispatch(request, prefix)
++ http.context.request = request
++
++ local r = {}
++ context.request = r
++
++ local pathinfo = http.urldecode(request:getenv("PATH_INFO") or "", true)
++
++ if prefix then
++ for _, node in ipairs(prefix) do
++ r[#r+1] = node
++ end
++ end
++
++ for node in pathinfo:gmatch("[^/]+") do
++ r[#r+1] = node
++ end
++
++ local stat, err = util.coxpcall(function()
++ dispatch(context.request)
++ end, error500)
++
++ http.close()
++
++ --context._disable_memtrace()
++end
++
++local function require_post_security(target)
++ if type(target) == "table" then
++ if type(target.post) == "table" then
++ local param_name, required_val, request_val
++
++ for param_name, required_val in pairs(target.post) do
++ request_val = http.formvalue(param_name)
++
++ if (type(required_val) == "string" and
++ request_val ~= required_val) or
++ (required_val == true and
++ (request_val == nil or request_val == ""))
++ then
++ return false
++ end
++ end
++
++ return true
++ end
++
++ return (target.post == true)
++ end
++
++ return false
++end
++
++function test_post_security()
++ if http.getenv("REQUEST_METHOD") ~= "POST" then
++ http.status(405, "Method Not Allowed")
++ http.header("Allow", "POST")
++ return false
++ end
++
++ if http.formvalue("token") ~= context.authtoken then
++ http.status(403, "Forbidden")
++ luci.template.render("csrftoken")
++ return false
++ end
++
++ return true
++end
++
++function dispatch(request)
++ --context._disable_memtrace = require "luci.debug".trap_memtrace("l")
++ local ctx = context
++ ctx.path = request
++
++ local conf = require "luci.config"
++ assert(conf.main,
++ "/etc/config/luci seems to be corrupt, unable to find section 'main'")
++
++ local lang = conf.main.lang or "auto"
++ if lang == "auto" then
++ local aclang = http.getenv("HTTP_ACCEPT_LANGUAGE") or ""
++ for lpat in aclang:gmatch("[%w-]+") do
++ lpat = lpat and lpat:gsub("-", "_")
++ if conf.languages[lpat] then
++ lang = lpat
++ break
++ end
++ end
++ end
++ require "luci.i18n".setlanguage(lang)
++
++ local c = ctx.tree
++ local stat
++ if not c then
++ c = createtree()
++ end
++
++ local track = {}
++ local args = {}
++ ctx.args = args
++ ctx.requestargs = ctx.requestargs or args
++ local n
++ local preq = {}
++ local freq = {}
++
++ for i, s in ipairs(request) do
++ preq[#preq+1] = s
++ freq[#freq+1] = s
++ c = c.nodes[s]
++ n = i
++ if not c then
++ break
++ end
++
++ util.update(track, c)
++
++ if c.leaf then
++ break
++ end
++ end
++
++ if c and c.leaf then
++ for j=n+1, #request do
++ args[#args+1] = request[j]
++ freq[#freq+1] = request[j]
++ end
++ end
++
++ ctx.requestpath = ctx.requestpath or freq
++ ctx.path = preq
++
++ if track.i18n then
++ i18n.loadc(track.i18n)
++ end
++
++ -- Init template engine
++ if (c and c.index) or not track.notemplate then
++ local tpl = require("luci.template")
++ local media = track.mediaurlbase or luci.config.main.mediaurlbase
++ if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then
++ media = nil
++ for name, theme in pairs(luci.config.themes) do
++ if name:sub(1,1) ~= "." and pcall(tpl.Template,
++ "themes/%s/header" % fs.basename(theme)) then
++ media = theme
++ end
++ end
++ assert(media, "No valid theme found")
++ end
++
++ local function _ifattr(cond, key, val)
++ if cond then
++ local env = getfenv(3)
++ local scope = (type(env.self) == "table") and env.self
++ return string.format(
++ ' %s="%s"', tostring(key),
++ util.pcdata(tostring( val
++ or (type(env[key]) ~= "function" and env[key])
++ or (scope and type(scope[key]) ~= "function" and scope[key])
++ or "" ))
++ )
++ else
++ return ''
++ end
++ end
++
++ tpl.context.viewns = setmetatable({
++ write = http.write;
++ include = function(name) tpl.Template(name):render(getfenv(2)) end;
++ translate = i18n.translate;
++ translatef = i18n.translatef;
++ export = function(k, v) if tpl.context.viewns[k] == nil then tpl.context.viewns[k] = v end end;
++ striptags = util.striptags;
++ pcdata = util.pcdata;
++ media = media;
++ theme = fs.basename(media);
++ resource = luci.config.main.resourcebase;
++ ifattr = function(...) return _ifattr(...) end;
++ attr = function(...) return _ifattr(true, ...) end;
++ url = build_url;
++ }, {__index=function(table, key)
++ if key == "controller" then
++ return build_url()
++ elseif key == "REQUEST_URI" then
++ return build_url(unpack(ctx.requestpath))
++ elseif key == "token" then
++ return ctx.authtoken
++ else
++ return rawget(table, key) or _G[key]
++ end
++ end})
++ end
++
++ track.dependent = (track.dependent ~= false)
++ assert(not track.dependent or not track.auto,
++ "Access Violation\nThe page at '" .. table.concat(request, "/") .. "/' " ..
++ "has no parent node so the access to this location has been denied.\n" ..
++ "This is a software bug, please report this message at " ..
++ "http://luci.subsignal.org/trac/newticket"
++ )
++
++ if track.sysauth then
++ local authen = type(track.sysauth_authenticator) == "function"
++ and track.sysauth_authenticator
++ or authenticator[track.sysauth_authenticator]
++
++ local def = (type(track.sysauth) == "string") and track.sysauth
++ local accs = def and {track.sysauth} or track.sysauth
++ local sess = ctx.authsession
++ if not sess then
++ sess = http.getcookie("sysauth")
++ sess = sess and sess:match("^[a-f0-9]*$")
++ end
++
++ local sdat = (util.ubus("session", "get", { ubus_rpc_session = sess }) or { }).values
++ local user, token
++
++ if sdat then
++ user = sdat.user
++ token = sdat.token
++ else
++ local eu = http.getenv("HTTP_AUTH_USER")
++ local ep = http.getenv("HTTP_AUTH_PASS")
++ if eu and ep and sys.user.checkpasswd(eu, ep) then
++ authen = function() return eu end
++ end
++ end
++
++ if not util.contains(accs, user) then
++ if authen then
++ local user, sess = authen(sys.user.checkpasswd, accs, def)
++ local token
++ if not user or not util.contains(accs, user) then
++ return
++ else
++ if not sess then
++ local sdat = util.ubus("session", "create", { timeout = tonumber(luci.config.sauth.sessiontime) })
++ if sdat then
++ token = sys.uniqueid(16)
++ util.ubus("session", "set", {
++ ubus_rpc_session = sdat.ubus_rpc_session,
++ values = {
++ user = user,
++ token = token,
++ section = sys.uniqueid(16)
++ }
++ })
++ sess = sdat.ubus_rpc_session
++ end
++ end
++
++ if sess and token then
++ http.header("Set-Cookie", 'sysauth=%s; path=%s' %{ sess, build_url() })
++
++ ctx.authsession = sess
++ ctx.authtoken = token
++ ctx.authuser = user
++
++ http.redirect(build_url(unpack(ctx.requestpath)))
++ end
++ end
++ else
++ http.status(403, "Forbidden")
++ return
++ end
++ else
++ ctx.authsession = sess
++ ctx.authtoken = token
++ ctx.authuser = user
++ end
++ end
++
++ if c and require_post_security(c.target) then
++ if not test_post_security(c) then
++ return
++ end
++ end
++
++ if track.setgroup then
++ sys.process.setgroup(track.setgroup)
++ end
++
++ if track.setuser then
++ -- trigger ubus connection before dropping root privs
++ util.ubus()
++
++ sys.process.setuser(track.setuser)
++ end
++
++ local target = nil
++ if c then
++ if type(c.target) == "function" then
++ target = c.target
++ elseif type(c.target) == "table" then
++ target = c.target.target
++ end
++ end
++
++ if c and (c.index or type(target) == "function") then
++ ctx.dispatched = c
++ ctx.requested = ctx.requested or ctx.dispatched
++ end
++
++ if c and c.index then
++ local tpl = require "luci.template"
++
++ if util.copcall(tpl.render, "indexer", {}) then
++ return true
++ end
++ end
++
++ if type(target) == "function" then
++ util.copcall(function()
++ local oldenv = getfenv(target)
++ local module = require(c.module)
++ local env = setmetatable({}, {__index=
++
++ function(tbl, key)
++ return rawget(tbl, key) or module[key] or oldenv[key]
++ end})
++
++ setfenv(target, env)
++ end)
++
++ local ok, err
++ if type(c.target) == "table" then
++ ok, err = util.copcall(target, c.target, unpack(args))
++ 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)"))
++ else
++ local root = node()
++ if not root or not root.target then
++ error404("No root node was registered, this usually happens if no module was installed.\n" ..
++ "Install luci-mod-admin-full and retry. " ..
++ "If the module is already installed, try removing the /tmp/luci-indexcache file.")
++ else
++ error404("No page is registered at '/" .. table.concat(request, "/") .. "'.\n" ..
++ "If this url belongs to an extension, make sure it is properly installed.\n" ..
++ "If the extension was recently installed, try removing the /tmp/luci-indexcache file.")
++ end
++ end
++end
++
++function createindex()
++ local controllers = { }
++ local base = "%s/controller/" % util.libpath()
++ local _, path
++
++ for path in (fs.glob("%s*.lua" % base) or function() end) do
++ controllers[#controllers+1] = path
++ end
++
++ for path in (fs.glob("%s*/*.lua" % base) or function() end) do
++ controllers[#controllers+1] = path
++ end
++
++ if indexcache then
++ local cachedate = fs.stat(indexcache, "mtime")
++ if cachedate then
++ local realdate = 0
++ for _, obj in ipairs(controllers) do
++ local omtime = fs.stat(obj, "mtime")
++ realdate = (omtime and omtime > realdate) and omtime or realdate
++ end
++
++ if cachedate > realdate and sys.process.info("uid") == 0 then
++ assert(
++ sys.process.info("uid") == fs.stat(indexcache, "uid")
++ and fs.stat(indexcache, "modestr") == "rw-------",
++ "Fatal: Indexcache is not sane!"
++ )
++
++ index = loadfile(indexcache)()
++ return index
++ end
++ end
++ end
++
++ index = {}
++
++ for _, path in ipairs(controllers) do
++ local modname = "luci.controller." .. path:sub(#base+1, #path-4):gsub("/", ".")
++ local mod = require(modname)
++ assert(mod ~= true,
++ "Invalid controller file found\n" ..
++ "The file '" .. path .. "' contains an invalid module line.\n" ..
++ "Please verify whether the module name is set to '" .. modname ..
++ "' - It must correspond to the file path!")
++
++ local idx = mod.index
++ assert(type(idx) == "function",
++ "Invalid controller file found\n" ..
++ "The file '" .. path .. "' contains no index() function.\n" ..
++ "Please make sure that the controller contains a valid " ..
++ "index function and verify the spelling!")
++
++ index[modname] = idx
++ end
++
++ if indexcache then
++ local f = nixio.open(indexcache, "w", 600)
++ f:writeall(util.get_bytecode(index))
++ f:close()
++ end
++end
++
++-- Build the index before if it does not exist yet.
++function createtree()
++ if not index then
++ createindex()
++ end
++
++ local ctx = context
++ local tree = {nodes={}, inreq=true}
++ local modi = {}
++
++ ctx.treecache = setmetatable({}, {__mode="v"})
++ ctx.tree = tree
++ ctx.modifiers = modi
++
++ -- Load default translation
++ require "luci.i18n".loadc("base")
++
++ local scope = setmetatable({}, {__index = luci.dispatcher})
++
++ for k, v in pairs(index) do
++ scope._NAME = k
++ setfenv(v, scope)
++ v()
++ end
++
++ local function modisort(a,b)
++ return modi[a].order < modi[b].order
++ end
++
++ for _, v in util.spairs(modi, modisort) do
++ scope._NAME = v.module
++ setfenv(v.func, scope)
++ v.func()
++ end
++
++ return tree
++end
++
++function modifier(func, order)
++ context.modifiers[#context.modifiers+1] = {
++ func = func,
++ order = order or 0,
++ module
++ = getfenv(2)._NAME
++ }
++end
++
++function assign(path, clone, title, order)
++ local obj = node(unpack(path))
++ obj.nodes = nil
++ obj.module = nil
++
++ obj.title = title
++ obj.order = order
++
++ setmetatable(obj, {__index = _create_node(clone)})
++
++ return obj
++end
++
++function entry(path, target, title, order)
++ local c = node(unpack(path))
++
++ c.target = target
++ c.title = title
++ c.order = order
++ c.module = getfenv(2)._NAME
++
++ return c
++end
++
++-- enabling the node.
++function get(...)
++ return _create_node({...})
++end
++
++function node(...)
++ local c = _create_node({...})
++
++ c.module = getfenv(2)._NAME
++ c.auto = nil
++
++ return c
++end
++
++function _create_node(path)
++ if #path == 0 then
++ return context.tree
++ end
++
++ local name = table.concat(path, ".")
++ local c = context.treecache[name]
++
++ if not c then
++ local last = table.remove(path)
++ local parent = _create_node(path)
++
++ c = {nodes={}, auto=true}
++ -- the node is "in request" if the request path matches
++ -- at least up to the length of the node path
++ if parent.inreq and context.path[#path+1] == last then
++ c.inreq = true
++ end
++ parent.nodes[last] = c
++ context.treecache[name] = c
++ end
++ return c
++end
++
++-- Subdispatchers --
++
++function _firstchild()
++ local path = { unpack(context.path) }
++ local name = table.concat(path, ".")
++ local node = context.treecache[name]
++
++ local lowest
++ if node and node.nodes and next(node.nodes) then
++ local k, v
++ for k, v in pairs(node.nodes) do
++ if not lowest or
++ (v.order or 100) < (node.nodes[lowest].order or 100)
++ then
++ lowest = k
++ end
++ end
++ end
++
++ assert(lowest ~= nil,
++ "The requested node contains no childs, unable to redispatch")
++
++ path[#path+1] = lowest
++ dispatch(path)
++end
++
++function firstchild()
++ return { type = "firstchild", target = _firstchild }
++end
++
++function alias(...)
++ local req = {...}
++ return function(...)
++ for _, r in ipairs({...}) do
++ req[#req+1] = r
++ end
++
++ dispatch(req)
++ end
++end
++
++function rewrite(n, ...)
++ local req = {...}
++ return function(...)
++ local dispatched = util.clone(context.dispatched)
++
++ for i=1,n do
++ table.remove(dispatched, 1)
++ end
++
++ for i, r in ipairs(req) do
++ table.insert(dispatched, i, r)
++ end
++
++ for _, r in ipairs({...}) do
++ dispatched[#dispatched+1] = r
++ end
++
++ dispatch(dispatched)
++ end
++end
++
++
++local function _call(self, ...)
++ local func = getfenv()[self.name]
++ assert(func ~= nil,
++ 'Cannot resolve function "' .. self.name .. '". Is it misspelled or local?')
++
++ assert(type(func) == "function",
++ 'The symbol "' .. self.name .. '" does not refer to a function but data ' ..
++ 'of type "' .. type(func) .. '".')
++
++ if #self.argv > 0 then
++ return func(unpack(self.argv), ...)
++ else
++ return func(...)
++ end
++end
++
++function call(name, ...)
++ return {type = "call", argv = {...}, name = name, target = _call}
++end
++
++function post_on(params, name, ...)
++ return {
++ type = "call",
++ post = params,
++ argv = { ... },
++ name = name,
++ target = _call
++ }
++end
++
++function post(...)
++ return post_on(true, ...)
++end
++
++
++local _template = function(self, ...)
++ require "luci.template".render(self.view)
++end
++
++function template(name)
++ return {type = "template", view = name, target = _template}
++end
++
++
++local function _cbi(self, ...)
++ local cbi = require "luci.cbi"
++ local tpl = require "luci.template"
++ local http = require "luci.http"
++
++ local config = self.config or {}
++ local maps = cbi.load(self.model, ...)
++
++ local state = nil
++
++ for i, res in ipairs(maps) do
++ res.flow = config
++ local cstate = res:parse()
++ if cstate and (not state or cstate < state) then
++ state = cstate
++ end
++ end
++
++ local function _resolve_path(path)
++ return type(path) == "table" and build_url(unpack(path)) or path
++ end
++
++ if config.on_valid_to and state and state > 0 and state < 2 then
++ http.redirect(_resolve_path(config.on_valid_to))
++ return
++ end
++
++ if config.on_changed_to and state and state > 1 then
++ http.redirect(_resolve_path(config.on_changed_to))
++ return
++ end
++
++ if config.on_success_to and state and state > 0 then
++ http.redirect(_resolve_path(config.on_success_to))
++ return
++ end
++
++ if config.state_handler then
++ if not config.state_handler(state, maps) then
++ return
++ end
++ end
++
++ http.header("X-CBI-State", state or 0)
++
++ if not config.noheader then
++ tpl.render("cbi/header", {state = state})
++ end
++
++ local redirect
++ local messages
++ local applymap = false
++ local pageaction = true
++ local parsechain = { }
++
++ for i, res in ipairs(maps) do
++ if res.apply_needed and res.parsechain then
++ local c
++ for _, c in ipairs(res.parsechain) do
++ parsechain[#parsechain+1] = c
++ end
++ applymap = true
++ end
++
++ if res.redirect then
++ redirect = redirect or res.redirect
++ end
++
++ if res.pageaction == false then
++ pageaction = false
++ end
++
++ if res.message then
++ messages = messages or { }
++ messages[#messages+1] = res.message
++ end
++ end
++
++ for i, res in ipairs(maps) do
++ res:render({
++ firstmap = (i == 1),
++ applymap = applymap,
++ redirect = redirect,
++ messages = messages,
++ pageaction = pageaction,
++ parsechain = parsechain
++ })
++ end
++
++ if not config.nofooter then
++ tpl.render("cbi/footer", {
++ flow = config,
++ pageaction = pageaction,
++ redirect = redirect,
++ state = state,
++ autoapply = config.autoapply
++ })
++ end
++end
++
++function cbi(model, config)
++ return {
++ type = "cbi",
++ post = { ["cbi.submit"] = "1" },
++ config = config,
++ model = model,
++ target = _cbi
++ }
++end
++
++
++local function _arcombine(self, ...)
++ local argv = {...}
++ local target = #argv > 0 and self.targets[2] or self.targets[1]
++ setfenv(target.target, self.env)
++ target:target(unpack(argv))
++end
++
++function arcombine(trg1, trg2)
++ return {type = "arcombine", env = getfenv(), target = _arcombine, targets = {trg1, trg2}}
++end
++
++
++local function _form(self, ...)
++ local cbi = require "luci.cbi"
++ local tpl = require "luci.template"
++ local http = require "luci.http"
++
++ local maps = luci.cbi.load(self.model, ...)
++ local state = nil
++
++ for i, res in ipairs(maps) do
++ local cstate = res:parse()
++ if cstate and (not state or cstate < state) then
++ state = cstate
++ end
++ end
++
++ http.header("X-CBI-State", state or 0)
++ tpl.render("header")
++ for i, res in ipairs(maps) do
++ res:render()
++ end
++ tpl.render("footer")
++end
++
++function form(model)
++ return {
++ type = "cbi",
++ post = { ["cbi.submit"] = "1" },
++ model = model,
++ target = _form
++ }
++end
++
++translate = i18n.translate
++
++-- This function does not actually translate the given argument but
++-- is used by build/i18n-scan.pl to find translatable entries.
++function _(text)
++ return text
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/dispatcher.luadoc b/feeds/luci/modules/luci-base/luasrc/dispatcher.luadoc
+new file mode 100644
+index 0000000..743463c
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/dispatcher.luadoc
+@@ -0,0 +1,220 @@
++---[[
++LuCI web dispatcher.
++]]
++module "luci.dispatcher"
++
++---[[
++Build the URL relative to the server webroot from given virtual path.
++
++@class function
++@name build_url
++@param ... Virtual path
++@return Relative URL
++]]
++
++---[[
++Check whether a dispatch node shall be visible
++
++@class function
++@name node_visible
++@param node Dispatch node
++@return Boolean indicating whether the node should be visible
++]]
++
++---[[
++Return a sorted table of visible childs within a given node
++
++@class function
++@name node_childs
++@param node Dispatch node
++@return Ordered table of child node names
++]]
++
++---[[
++Send a 404 error code and render the "error404" template if available.
++
++@class function
++@name error404
++@param message Custom error message (optional)
++@return false
++]]
++
++---[[
++Send a 500 error code and render the "error500" template if available.
++
++@class function
++@name error500
++@param message Custom error message (optional)#
++@return false
++]]
++
++---[[
++Dispatch an HTTP request.
++
++@class function
++@name httpdispatch
++@param request LuCI HTTP Request object
++]]
++
++---[[
++Dispatches a LuCI virtual path.
++
++@class function
++@name dispatch
++@param request Virtual path
++]]
++
++---[[
++Generate the dispatching index using the native file-cache based strategy.
++
++
++@class function
++@name createindex
++]]
++
++---[[
++Create the dispatching tree from the index.
++
++Build the index before if it does not exist yet.
++
++@class function
++@name createtree
++]]
++
++---[[
++Register a tree modifier.
++
++@class function
++@name modifier
++@param func Modifier function
++@param order Modifier order value (optional)
++]]
++
++---[[
++Clone a node of the dispatching tree to another position.
++
++@class function
++@name assign
++@param path Virtual path destination
++@param clone Virtual path source
++@param title Destination node title (optional)
++@param order Destination node order value (optional)
++@return Dispatching tree node
++]]
++
++---[[
++Create a new dispatching node and define common parameters.
++
++@class function
++@name entry
++@param path Virtual path
++@param target Target function to call when dispatched.
++@param title Destination node title
++@param order Destination node order value (optional)
++@return Dispatching tree node
++]]
++
++---[[
++Fetch or create a dispatching node without setting the target module or
++
++enabling the node.
++@class function
++@name get
++@param ... Virtual path
++@return Dispatching tree node
++]]
++
++---[[
++Fetch or create a new dispatching node.
++
++@class function
++@name node
++@param ... Virtual path
++@return Dispatching tree node
++]]
++
++---[[
++Alias the first (lowest order) page automatically
++
++
++@class function
++@name firstchild
++]]
++
++---[[
++Create a redirect to another dispatching node.
++
++@class function
++@name alias
++@param ... Virtual path destination
++]]
++
++---[[
++Rewrite the first x path values of the request.
++
++@class function
++@name rewrite
++@param n Number of path values to replace
++@param ... Virtual path to replace removed path values with
++]]
++
++---[[
++Create a function-call dispatching target.
++
++@class function
++@name call
++@param name Target function of local controller
++@param ... Additional parameters passed to the function
++]]
++
++---[[
++Create a template render dispatching target.
++
++@class function
++@name template
++@param name Template to be rendered
++]]
++
++---[[
++Create a CBI model dispatching target.
++
++@class function
++@name cbi
++@param model CBI model to be rendered
++]]
++
++---[[
++Create a combined dispatching target for non argv and argv requests.
++
++@class function
++@name arcombine
++@param trg1 Overview Target
++@param trg2 Detail Target
++]]
++
++---[[
++Create a CBI form model dispatching target.
++
++@class function
++@name form
++@param model CBI form model tpo be rendered
++]]
++
++---[[
++Access the luci.i18n translate() api.
++
++@class function
++@name translate
++@param text Text to translate
++]]
++
++---[[
++No-op function used to mark translation entries for menu labels.
++
++This function does not actually translate the given argument but
++is used by build/i18n-scan.pl to find translatable entries.
++
++@class function
++@name _
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/http.lua b/feeds/luci/modules/luci-base/luasrc/http.lua
+new file mode 100644
+index 0000000..a92d8af
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/http.lua
+@@ -0,0 +1,236 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ltn12 = require "luci.ltn12"
++local protocol = require "luci.http.protocol"
++local util = require "luci.util"
++local string = require "string"
++local coroutine = require "coroutine"
++local table = require "table"
++
++local ipairs, pairs, next, type, tostring, error =
++ ipairs, pairs, next, type, tostring, error
++
++module "luci.http"
++
++context = util.threadlocal()
++
++Request = util.class()
++function Request.__init__(self, env, sourcein, sinkerr)
++ self.input = sourcein
++ self.error = sinkerr
++
++
++ -- File handler nil by default to let .content() work
++ self.filehandler = nil
++
++ -- HTTP-Message table
++ self.message = {
++ env = env,
++ headers = {},
++ params = protocol.urldecode_params(env.QUERY_STRING or ""),
++ }
++
++ self.parsed_input = false
++end
++
++function Request.formvalue(self, name, noparse)
++ if not noparse and not self.parsed_input then
++ self:_parse_input()
++ end
++
++ if name then
++ return self.message.params[name]
++ else
++ return self.message.params
++ end
++end
++
++function Request.formvaluetable(self, prefix)
++ local vals = {}
++ prefix = prefix and prefix .. "." or "."
++
++ if not self.parsed_input then
++ self:_parse_input()
++ end
++
++ local void = self.message.params[nil]
++ for k, v in pairs(self.message.params) do
++ if k:find(prefix, 1, true) == 1 then
++ vals[k:sub(#prefix + 1)] = tostring(v)
++ end
++ end
++
++ return vals
++end
++
++function Request.content(self)
++ if not self.parsed_input then
++ self:_parse_input()
++ end
++
++ return self.message.content, self.message.content_length
++end
++
++function Request.getcookie(self, name)
++ local c = string.gsub(";" .. (self:getenv("HTTP_COOKIE") or "") .. ";", "%s*;%s*", ";")
++ local p = ";" .. name .. "=(.-);"
++ local i, j, value = c:find(p)
++ return value and urldecode(value)
++end
++
++function Request.getenv(self, name)
++ if name then
++ return self.message.env[name]
++ else
++ return self.message.env
++ end
++end
++
++function Request.setfilehandler(self, callback)
++ self.filehandler = callback
++end
++
++function Request._parse_input(self)
++ protocol.parse_message_body(
++ self.input,
++ self.message,
++ self.filehandler
++ )
++ self.parsed_input = true
++end
++
++function close()
++ if not context.eoh then
++ context.eoh = true
++ coroutine.yield(3)
++ end
++
++ if not context.closed then
++ context.closed = true
++ coroutine.yield(5)
++ end
++end
++
++function content()
++ return context.request:content()
++end
++
++function formvalue(name, noparse)
++ return context.request:formvalue(name, noparse)
++end
++
++function formvaluetable(prefix)
++ return context.request:formvaluetable(prefix)
++end
++
++function getcookie(name)
++ return context.request:getcookie(name)
++end
++
++-- or the environment table itself.
++function getenv(name)
++ return context.request:getenv(name)
++end
++
++function setfilehandler(callback)
++ return context.request:setfilehandler(callback)
++end
++
++function header(key, value)
++ if not context.headers then
++ context.headers = {}
++ end
++ context.headers[key:lower()] = value
++ coroutine.yield(2, key, value)
++end
++
++function prepare_content(mime)
++ if not context.headers or not context.headers["content-type"] then
++ if mime == "application/xhtml+xml" then
++ if not getenv("HTTP_ACCEPT") or
++ not getenv("HTTP_ACCEPT"):find("application/xhtml+xml", nil, true) then
++ mime = "text/html; charset=UTF-8"
++ end
++ header("Vary", "Accept")
++ end
++ header("Content-Type", mime)
++ end
++end
++
++function source()
++ return context.request.input
++end
++
++function status(code, message)
++ code = code or 200
++ message = message or "OK"
++ context.status = code
++ coroutine.yield(1, code, message)
++end
++
++-- This function is as a valid LTN12 sink.
++-- If the content chunk is nil this function will automatically invoke close.
++function write(content, src_err)
++ if not content then
++ if src_err then
++ error(src_err)
++ else
++ close()
++ end
++ return true
++ elseif #content == 0 then
++ return true
++ else
++ if not context.eoh then
++ if not context.status then
++ status()
++ end
++ if not context.headers or not context.headers["content-type"] then
++ header("Content-Type", "text/html; charset=utf-8")
++ end
++ if not context.headers["cache-control"] then
++ header("Cache-Control", "no-cache")
++ header("Expires", "0")
++ end
++
++
++ context.eoh = true
++ coroutine.yield(3)
++ end
++ coroutine.yield(4, content)
++ return true
++ end
++end
++
++function splice(fd, size)
++ coroutine.yield(6, fd, size)
++end
++
++function redirect(url)
++ status(302, "Found")
++ header("Location", url)
++ close()
++end
++
++function build_querystring(q)
++ local s = { "?" }
++
++ for k, v in pairs(q) do
++ if #s > 1 then s[#s+1] = "&" end
++
++ s[#s+1] = urldecode(k)
++ s[#s+1] = "="
++ s[#s+1] = urldecode(v)
++ end
++
++ return table.concat(s, "")
++end
++
++urldecode = protocol.urldecode
++
++urlencode = protocol.urlencode
++
++function write_json(x)
++ util.serialize_json(x, write)
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/http.luadoc b/feeds/luci/modules/luci-base/luasrc/http.luadoc
+new file mode 100644
+index 0000000..8a325db
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/http.luadoc
+@@ -0,0 +1,165 @@
++---[[
++LuCI Web Framework high-level HTTP functions.
++]]
++module "luci.http"
++
++---[[
++Close the HTTP-Connection.
++
++
++@class function
++@name close
++]]
++
++---[[
++Return the request content if the request was of unknown type.
++
++@class function
++@name content
++@return HTTP request body
++@return HTTP request body length
++]]
++
++---[[
++Get a certain HTTP input value or a table of all input values.
++
++@class function
++@name formvalue
++@param name Name of the GET or POST variable to fetch
++@param noparse Don't parse POST data before getting the value
++@return HTTP input value or table of all input value
++]]
++
++---[[
++Get a table of all HTTP input values with a certain prefix.
++
++@class function
++@name formvaluetable
++@param prefix Prefix
++@return Table of all HTTP input values with given prefix
++]]
++
++---[[
++Get the value of a certain HTTP-Cookie.
++
++@class function
++@name getcookie
++@param name Cookie Name
++@return String containing cookie data
++]]
++
++---[[
++Get the value of a certain HTTP environment variable
++
++or the environment table itself.
++@class function
++@name getenv
++@param name Environment variable
++@return HTTP environment value or environment table
++]]
++
++---[[
++Set a handler function for incoming user file uploads.
++
++@class function
++@name setfilehandler
++@param callback Handler function
++]]
++
++---[[
++Send a HTTP-Header.
++
++@class function
++@name header
++@param key Header key
++@param value Header value
++]]
++
++---[[
++Set the mime type of following content data.
++
++@class function
++@name prepare_content
++@param mime Mimetype of following content
++]]
++
++---[[
++Get the RAW HTTP input source
++
++@class function
++@name source
++@return HTTP LTN12 source
++]]
++
++---[[
++Set the HTTP status code and status message.
++
++@class function
++@name status
++@param code Status code
++@param message Status message
++]]
++
++---[[
++Send a chunk of content data to the client.
++
++This function is as a valid LTN12 sink.
++If the content chunk is nil this function will automatically invoke close.
++@class function
++@name write
++@param content Content chunk
++@param src_err Error object from source (optional)
++@see close
++]]
++
++---[[
++Splice data from a filedescriptor to the client.
++
++@class function
++@name splice
++@param fp File descriptor
++@param size Bytes to splice (optional)
++]]
++
++---[[
++Redirects the client to a new URL and closes the connection.
++
++@class function
++@name redirect
++@param url Target URL
++]]
++
++---[[
++Create a querystring out of a table of key - value pairs.
++
++@class function
++@name build_querystring
++@param table Query string source table
++@return Encoded HTTP query string
++]]
++
++---[[
++Return the URL-decoded equivalent of a string.
++
++@param str URL-encoded string
++@param no_plus Don't decode + to " "
++@return URL-decoded string
++@see urlencode
++]]
++
++---[[
++Return the URL-encoded equivalent of a string.
++
++@param str Source string
++@return URL-encoded string
++@see urldecode
++]]
++
++---[[
++Send the given data as JSON encoded string.
++
++@class function
++@name write_json
++@param data Data to send
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol.lua b/feeds/luci/modules/luci-base/luasrc/http/protocol.lua
+new file mode 100644
+index 0000000..8592726
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol.lua
+@@ -0,0 +1,623 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++-- This class contains several functions useful for http message- and content
++-- decoding and to retrive form data from raw http messages.
++module("luci.http.protocol", package.seeall)
++
++local ltn12 = require("luci.ltn12")
++
++HTTP_MAX_CONTENT = 1024*8 -- 8 kB maximum content size
++
++-- the "+" sign to " " - and return the decoded string.
++function urldecode( str, no_plus )
++
++ local function __chrdec( hex )
++ return string.char( tonumber( hex, 16 ) )
++ end
++
++ if type(str) == "string" then
++ if not no_plus then
++ str = str:gsub( "+", " " )
++ end
++
++ str = str:gsub( "%%([a-fA-F0-9][a-fA-F0-9])", __chrdec )
++ end
++
++ return str
++end
++
++-- from given url or string. Returns a table with urldecoded values.
++-- Simple parameters are stored as string values associated with the parameter
++-- name within the table. Parameters with multiple values are stored as array
++-- containing the corresponding values.
++function urldecode_params( url, tbl )
++
++ local params = tbl or { }
++
++ if url:find("?") then
++ url = url:gsub( "^.+%?([^?]+)", "%1" )
++ end
++
++ for pair in url:gmatch( "[^&;]+" ) do
++
++ -- find key and value
++ local key = urldecode( pair:match("^([^=]+)") )
++ local val = urldecode( pair:match("^[^=]+=(.+)$") )
++
++ -- store
++ if type(key) == "string" and key:len() > 0 then
++ if type(val) ~= "string" then val = "" end
++
++ if not params[key] then
++ params[key] = val
++ elseif type(params[key]) ~= "table" then
++ params[key] = { params[key], val }
++ else
++ table.insert( params[key], val )
++ end
++ end
++ end
++
++ return params
++end
++
++function urlencode( str )
++
++ local function __chrenc( chr )
++ return string.format(
++ "%%%02x", string.byte( chr )
++ )
++ end
++
++ if type(str) == "string" then
++ str = str:gsub(
++ "([^a-zA-Z0-9$_%-%.!*'(),])",
++ __chrenc
++ )
++ end
++
++ return str
++end
++
++-- separated by "&". Tables are encoded as parameters with multiple values by
++-- repeating the parameter name with each value.
++function urlencode_params( tbl )
++ local enc = ""
++
++ for k, v in pairs(tbl) do
++ if type(v) == "table" then
++ for i, v2 in ipairs(v) do
++ enc = enc .. ( #enc > 0 and "&" or "" ) ..
++ urlencode(k) .. "=" .. urlencode(v2)
++ end
++ else
++ enc = enc .. ( #enc > 0 and "&" or "" ) ..
++ urlencode(k) .. "=" .. urlencode(v)
++ end
++ end
++
++ return enc
++end
++
++-- (Internal function)
++-- Initialize given parameter and coerce string into table when the parameter
++-- already exists.
++local function __initval( tbl, key )
++ if tbl[key] == nil then
++ tbl[key] = ""
++ elseif type(tbl[key]) == "string" then
++ tbl[key] = { tbl[key], "" }
++ else
++ table.insert( tbl[key], "" )
++ end
++end
++
++-- (Internal function)
++-- Append given data to given parameter, either by extending the string value
++-- or by appending it to the last string in the parameter's value table.
++local function __appendval( tbl, key, chunk )
++ if type(tbl[key]) == "table" then
++ tbl[key][#tbl[key]] = tbl[key][#tbl[key]] .. chunk
++ else
++ tbl[key] = tbl[key] .. chunk
++ end
++end
++
++-- (Internal function)
++-- Finish the value of given parameter, either by transforming the string value
++-- or - in the case of multi value parameters - the last element in the
++-- associated values table.
++local function __finishval( tbl, key, handler )
++ if handler then
++ if type(tbl[key]) == "table" then
++ tbl[key][#tbl[key]] = handler( tbl[key][#tbl[key]] )
++ else
++ tbl[key] = handler( tbl[key] )
++ end
++ end
++end
++
++
++-- Table of our process states
++local process_states = { }
++
++-- Extract "magic", the first line of a http message.
++-- Extracts the message type ("get", "post" or "response"), the requested uri
++-- or the status code if the line descripes a http response.
++process_states['magic'] = function( msg, chunk, err )
++
++ if chunk ~= nil then
++ -- ignore empty lines before request
++ if #chunk == 0 then
++ return true, nil
++ end
++
++ -- Is it a request?
++ local method, uri, http_ver = chunk:match("^([A-Z]+) ([^ ]+) HTTP/([01]%.[019])$")
++
++ -- Yup, it is
++ if method then
++
++ msg.type = "request"
++ msg.request_method = method:lower()
++ msg.request_uri = uri
++ msg.http_version = tonumber( http_ver )
++ msg.headers = { }
++
++ -- We're done, next state is header parsing
++ return true, function( chunk )
++ return process_states['headers']( msg, chunk )
++ end
++
++ -- Is it a response?
++ else
++
++ local http_ver, code, message = chunk:match("^HTTP/([01]%.[019]) ([0-9]+) ([^\r\n]+)$")
++
++ -- Is a response
++ if code then
++
++ msg.type = "response"
++ msg.status_code = code
++ msg.status_message = message
++ msg.http_version = tonumber( http_ver )
++ msg.headers = { }
++
++ -- We're done, next state is header parsing
++ return true, function( chunk )
++ return process_states['headers']( msg, chunk )
++ end
++ end
++ end
++ end
++
++ -- Can't handle it
++ return nil, "Invalid HTTP message magic"
++end
++
++
++-- Extract headers from given string.
++process_states['headers'] = function( msg, chunk )
++
++ if chunk ~= nil then
++
++ -- Look for a valid header format
++ local hdr, val = chunk:match( "^([A-Za-z][A-Za-z0-9%-_]+): +(.+)$" )
++
++ if type(hdr) == "string" and hdr:len() > 0 and
++ type(val) == "string" and val:len() > 0
++ then
++ msg.headers[hdr] = val
++
++ -- Valid header line, proceed
++ return true, nil
++
++ elseif #chunk == 0 then
++ -- Empty line, we won't accept data anymore
++ return false, nil
++ else
++ -- Junk data
++ return nil, "Invalid HTTP header received"
++ end
++ else
++ return nil, "Unexpected EOF"
++ end
++end
++
++
++-- data line by line with the trailing \r\n stripped of.
++function header_source( sock )
++ return ltn12.source.simplify( function()
++
++ local chunk, err, part = sock:receive("*l")
++
++ -- Line too long
++ if chunk == nil then
++ if err ~= "timeout" then
++ return nil, part
++ and "Line exceeds maximum allowed length"
++ or "Unexpected EOF"
++ else
++ return nil, err
++ end
++
++ -- Line ok
++ elseif chunk ~= nil then
++
++ -- Strip trailing CR
++ chunk = chunk:gsub("\r$","")
++
++ return chunk, nil
++ end
++ end )
++end
++
++-- Content-Type. Stores all extracted data associated with its parameter name
++-- in the params table withing the given message object. Multiple parameter
++-- values are stored as tables, ordinary ones as strings.
++-- If an optional file callback function is given then it is feeded with the
++-- file contents chunk by chunk and only the extracted file name is stored
++-- within the params table. The callback function will be called subsequently
++-- with three arguments:
++-- o Table containing decoded (name, file) and raw (headers) mime header data
++-- o String value containing a chunk of the file data
++-- o Boolean which indicates wheather the current chunk is the last one (eof)
++function mimedecode_message_body( src, msg, filecb )
++
++ if msg and msg.env.CONTENT_TYPE then
++ msg.mime_boundary = msg.env.CONTENT_TYPE:match("^multipart/form%-data; boundary=(.+)$")
++ end
++
++ if not msg.mime_boundary then
++ return nil, "Invalid Content-Type found"
++ end
++
++
++ local tlen = 0
++ local inhdr = false
++ local field = nil
++ local store = nil
++ local lchunk = nil
++
++ local function parse_headers( chunk, field )
++
++ local stat
++ repeat
++ chunk, stat = chunk:gsub(
++ "^([A-Z][A-Za-z0-9%-_]+): +([^\r\n]+)\r\n",
++ function(k,v)
++ field.headers[k] = v
++ return ""
++ end
++ )
++ until stat == 0
++
++ chunk, stat = chunk:gsub("^\r\n","")
++
++ -- End of headers
++ if stat > 0 then
++ if field.headers["Content-Disposition"] then
++ if field.headers["Content-Disposition"]:match("^form%-data; ") then
++ field.name = field.headers["Content-Disposition"]:match('name="(.-)"')
++ field.file = field.headers["Content-Disposition"]:match('filename="(.+)"$')
++ end
++ end
++
++ if not field.headers["Content-Type"] then
++ field.headers["Content-Type"] = "text/plain"
++ end
++
++ if field.name and field.file and filecb then
++ __initval( msg.params, field.name )
++ __appendval( msg.params, field.name, field.file )
++
++ store = filecb
++ elseif field.name then
++ __initval( msg.params, field.name )
++
++ store = function( hdr, buf, eof )
++ __appendval( msg.params, field.name, buf )
++ end
++ else
++ store = nil
++ end
++
++ return chunk, true
++ end
++
++ return chunk, false
++ end
++
++ local function snk( chunk )
++
++ tlen = tlen + ( chunk and #chunk or 0 )
++
++ if msg.env.CONTENT_LENGTH and tlen > tonumber(msg.env.CONTENT_LENGTH) + 2 then
++ return nil, "Message body size exceeds Content-Length"
++ end
++
++ if chunk and not lchunk then
++ lchunk = "\r\n" .. chunk
++
++ elseif lchunk then
++ local data = lchunk .. ( chunk or "" )
++ local spos, epos, found
++
++ repeat
++ spos, epos = data:find( "\r\n--" .. msg.mime_boundary .. "\r\n", 1, true )
++
++ if not spos then
++ spos, epos = data:find( "\r\n--" .. msg.mime_boundary .. "--\r\n", 1, true )
++ end
++
++
++ if spos then
++ local predata = data:sub( 1, spos - 1 )
++
++ if inhdr then
++ predata, eof = parse_headers( predata, field )
++
++ if not eof then
++ return nil, "Invalid MIME section header"
++ elseif not field.name then
++ return nil, "Invalid Content-Disposition header"
++ end
++ end
++
++ if store then
++ store( field, predata, true )
++ end
++
++
++ field = { headers = { } }
++ found = found or true
++
++ data, eof = parse_headers( data:sub( epos + 1, #data ), field )
++ inhdr = not eof
++ end
++ until not spos
++
++ if found then
++ -- We found at least some boundary. Save
++ -- the unparsed remaining data for the
++ -- next chunk.
++ lchunk, data = data, nil
++ else
++ -- There was a complete chunk without a boundary. Parse it as headers or
++ -- append it as data, depending on our current state.
++ if inhdr then
++ lchunk, eof = parse_headers( data, field )
++ inhdr = not eof
++ else
++ -- We're inside data, so append the data. Note that we only append
++ -- lchunk, not all of data, since there is a chance that chunk
++ -- contains half a boundary. Assuming that each chunk is at least the
++ -- boundary in size, this should prevent problems
++ store( field, lchunk, false )
++ lchunk, chunk = chunk, nil
++ end
++ end
++ end
++
++ return true
++ end
++
++ return ltn12.pump.all( src, snk )
++end
++
++-- Content-Type. Stores all extracted data associated with its parameter name
++-- in the params table withing the given message object. Multiple parameter
++-- values are stored as tables, ordinary ones as strings.
++function urldecode_message_body( src, msg )
++
++ local tlen = 0
++ local lchunk = nil
++
++ local function snk( chunk )
++
++ tlen = tlen + ( chunk and #chunk or 0 )
++
++ if msg.env.CONTENT_LENGTH and tlen > tonumber(msg.env.CONTENT_LENGTH) + 2 then
++ return nil, "Message body size exceeds Content-Length"
++ elseif tlen > HTTP_MAX_CONTENT then
++ return nil, "Message body size exceeds maximum allowed length"
++ end
++
++ if not lchunk and chunk then
++ lchunk = chunk
++
++ elseif lchunk then
++ local data = lchunk .. ( chunk or "&" )
++ local spos, epos
++
++ repeat
++ spos, epos = data:find("^.-[;&]")
++
++ if spos then
++ local pair = data:sub( spos, epos - 1 )
++ local key = pair:match("^(.-)=")
++ local val = pair:match("=([^%s]*)%s*$")
++
++ if key and #key > 0 then
++ __initval( msg.params, key )
++ __appendval( msg.params, key, val )
++ __finishval( msg.params, key, urldecode )
++ end
++
++ data = data:sub( epos + 1, #data )
++ end
++ until not spos
++
++ lchunk = data
++ end
++
++ return true
++ end
++
++ return ltn12.pump.all( src, snk )
++end
++
++-- version, message headers and resulting CGI environment variables from the
++-- given ltn12 source.
++function parse_message_header( src )
++
++ local ok = true
++ local msg = { }
++
++ local sink = ltn12.sink.simplify(
++ function( chunk )
++ return process_states['magic']( msg, chunk )
++ end
++ )
++
++ -- Pump input data...
++ while ok do
++
++ -- get data
++ ok, err = ltn12.pump.step( src, sink )
++
++ -- error
++ if not ok and err then
++ return nil, err
++
++ -- eof
++ elseif not ok then
++
++ -- Process get parameters
++ if ( msg.request_method == "get" or msg.request_method == "post" ) and
++ msg.request_uri:match("?")
++ then
++ msg.params = urldecode_params( msg.request_uri )
++ else
++ msg.params = { }
++ end
++
++ -- Populate common environment variables
++ msg.env = {
++ CONTENT_LENGTH = msg.headers['Content-Length'];
++ CONTENT_TYPE = msg.headers['Content-Type'] or msg.headers['Content-type'];
++ REQUEST_METHOD = msg.request_method:upper();
++ REQUEST_URI = msg.request_uri;
++ SCRIPT_NAME = msg.request_uri:gsub("?.+$","");
++ SCRIPT_FILENAME = ""; -- XXX implement me
++ SERVER_PROTOCOL = "HTTP/" .. string.format("%.1f", msg.http_version);
++ QUERY_STRING = msg.request_uri:match("?")
++ and msg.request_uri:gsub("^.+?","") or ""
++ }
++
++ -- Populate HTTP_* environment variables
++ for i, hdr in ipairs( {
++ 'Accept',
++ 'Accept-Charset',
++ 'Accept-Encoding',
++ 'Accept-Language',
++ 'Connection',
++ 'Cookie',
++ 'Host',
++ 'Referer',
++ 'User-Agent',
++ } ) do
++ local var = 'HTTP_' .. hdr:upper():gsub("%-","_")
++ local val = msg.headers[hdr]
++
++ msg.env[var] = val
++ end
++ end
++ end
++
++ return msg
++end
++
++-- This function will examine the Content-Type within the given message object
++-- to select the appropriate content decoder.
++-- Currently the application/x-www-urlencoded and application/form-data
++-- mime types are supported. If the encountered content encoding can't be
++-- handled then the whole message body will be stored unaltered as "content"
++-- property within the given message object.
++function parse_message_body( src, msg, filecb )
++ -- Is it multipart/mime ?
++ if msg.env.REQUEST_METHOD == "POST" and msg.env.CONTENT_TYPE and
++ msg.env.CONTENT_TYPE:match("^multipart/form%-data")
++ then
++
++ return mimedecode_message_body( src, msg, filecb )
++
++ -- Is it application/x-www-form-urlencoded ?
++ elseif msg.env.REQUEST_METHOD == "POST" and msg.env.CONTENT_TYPE and
++ msg.env.CONTENT_TYPE:match("^application/x%-www%-form%-urlencoded")
++ then
++ return urldecode_message_body( src, msg, filecb )
++
++
++ -- Unhandled encoding
++ -- If a file callback is given then feed it chunk by chunk, else
++ -- store whole buffer in message.content
++ else
++
++ local sink
++
++ -- If we have a file callback then feed it
++ if type(filecb) == "function" then
++ local meta = {
++ name = "raw",
++ encoding = msg.env.CONTENT_TYPE
++ }
++ sink = function( chunk )
++ if chunk then
++ return filecb(meta, chunk, false)
++ else
++ return filecb(meta, nil, true)
++ end
++ end
++ -- ... else append to .content
++ else
++ msg.content = ""
++ msg.content_length = 0
++
++ sink = function( chunk )
++ if chunk then
++ if ( msg.content_length + #chunk ) <= HTTP_MAX_CONTENT then
++ msg.content = msg.content .. chunk
++ msg.content_length = msg.content_length + #chunk
++ return true
++ else
++ return nil, "POST data exceeds maximum allowed length"
++ end
++ end
++ return true
++ end
++ end
++
++ -- Pump data...
++ while true do
++ local ok, err = ltn12.pump.step( src, sink )
++
++ if not ok and err then
++ return nil, err
++ elseif not ok then -- eof
++ return true
++ end
++ end
++
++ return true
++ end
++end
++
++statusmsg = {
++ [200] = "OK",
++ [206] = "Partial Content",
++ [301] = "Moved Permanently",
++ [302] = "Found",
++ [304] = "Not Modified",
++ [400] = "Bad Request",
++ [403] = "Forbidden",
++ [404] = "Not Found",
++ [405] = "Method Not Allowed",
++ [408] = "Request Time-out",
++ [411] = "Length Required",
++ [412] = "Precondition Failed",
++ [416] = "Requested range not satisfiable",
++ [500] = "Internal Server Error",
++ [503] = "Server Unavailable",
++}
+diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol.luadoc b/feeds/luci/modules/luci-base/luasrc/http/protocol.luadoc
+new file mode 100644
+index 0000000..67a60d9
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol.luadoc
+@@ -0,0 +1,142 @@
++---[[
++LuCI http protocol class.
++
++This class contains several functions useful for http message- and content
++decoding and to retrive form data from raw http messages.
++]]
++module "luci.http.protocol"
++
++---[[
++Decode an urlencoded string - optionally without decoding
++
++the "+" sign to " " - and return the decoded string.
++@class function
++@name urldecode
++@param str Input string in x-www-urlencoded format
++@param no_plus Don't decode "+" signs to spaces
++@return The decoded string
++@see urlencode
++]]
++
++---[[
++Extract and split urlencoded data pairs, separated bei either "&" or ";"
++
++from given url or string. Returns a table with urldecoded values.
++Simple parameters are stored as string values associated with the parameter
++name within the table. Parameters with multiple values are stored as array
++containing the corresponding values.
++@class function
++@name urldecode_params
++@param url The url or string which contains x-www-urlencoded form data
++@param tbl Use the given table for storing values (optional)
++@return Table containing the urldecoded parameters
++@see urlencode_params
++]]
++
++---[[
++Encode given string to x-www-urlencoded format.
++
++@class function
++@name urlencode
++@param str String to encode
++@return String containing the encoded data
++@see urldecode
++]]
++
++---[[
++Encode each key-value-pair in given table to x-www-urlencoded format,
++
++separated by "&". Tables are encoded as parameters with multiple values by
++repeating the parameter name with each value.
++@class function
++@name urlencode_params
++@param tbl Table with the values
++@return String containing encoded values
++@see urldecode_params
++]]
++
++---[[
++Creates a ltn12 source from the given socket. The source will return it's
++
++data line by line with the trailing \r\n stripped of.
++@class function
++@name header_source
++@param sock Readable network socket
++@return Ltn12 source function
++]]
++
++---[[
++Decode a mime encoded http message body with multipart/form-data
++
++Content-Type. Stores all extracted data associated with its parameter name
++in the params table withing the given message object. Multiple parameter
++values are stored as tables, ordinary ones as strings.
++If an optional file callback function is given then it is feeded with the
++file contents chunk by chunk and only the extracted file name is stored
++within the params table. The callback function will be called subsequently
++with three arguments:
++ o Table containing decoded (name, file) and raw (headers) mime header data
++ o String value containing a chunk of the file data
++ o Boolean which indicates wheather the current chunk is the last one (eof)
++@class function
++@name mimedecode_message_body
++@param src Ltn12 source function
++@param msg HTTP message object
++@param filecb File callback function (optional)
++@return Value indicating successful operation (not nil means "ok")
++@return String containing the error if unsuccessful
++@see parse_message_header
++]]
++
++---[[
++Decode an urlencoded http message body with application/x-www-urlencoded
++
++Content-Type. Stores all extracted data associated with its parameter name
++in the params table withing the given message object. Multiple parameter
++values are stored as tables, ordinary ones as strings.
++@class function
++@name urldecode_message_body
++@param src Ltn12 source function
++@param msg HTTP message object
++@return Value indicating successful operation (not nil means "ok")
++@return String containing the error if unsuccessful
++@see parse_message_header
++]]
++
++---[[
++Try to extract an http message header including information like protocol
++
++version, message headers and resulting CGI environment variables from the
++given ltn12 source.
++@class function
++@name parse_message_header
++@param src Ltn12 source function
++@return HTTP message object
++@see parse_message_body
++]]
++
++---[[
++Try to extract and decode a http message body from the given ltn12 source.
++
++This function will examine the Content-Type within the given message object
++to select the appropriate content decoder.
++Currently the application/x-www-urlencoded and application/form-data
++mime types are supported. If the encountered content encoding can't be
++handled then the whole message body will be stored unaltered as "content"
++property within the given message object.
++@class function
++@name parse_message_body
++@param src Ltn12 source function
++@param msg HTTP message object
++@param filecb File data callback (optional, see mimedecode_message_body())
++@return Value indicating successful operation (not nil means "ok")
++@return String containing the error if unsuccessful
++@see parse_message_header
++]]
++
++---[[
++Table containing human readable messages for several http status codes.
++
++@class table
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.lua b/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.lua
+new file mode 100644
+index 0000000..d31a4e3
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.lua
+@@ -0,0 +1,110 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++-- This class provides basic ETag handling and implements most of the
++-- conditional HTTP/1.1 headers specified in RFC2616 Sct. 14.24 - 14.28 .
++module("luci.http.protocol.conditionals", package.seeall)
++
++local date = require("luci.http.protocol.date")
++
++
++function mk_etag( stat )
++ if stat ~= nil then
++ return string.format( '"%x-%x-%x"', stat.ino, stat.size, stat.mtime )
++ end
++end
++
++-- Test whether the given message object contains an "If-Match" header and
++-- compare it against the given stat object.
++function if_match( req, stat )
++ local h = req.headers
++ local etag = mk_etag( stat )
++
++ -- Check for matching resource
++ if type(h['If-Match']) == "string" then
++ for ent in h['If-Match']:gmatch("([^, ]+)") do
++ if ( ent == '*' or ent == etag ) and stat ~= nil then
++ return true
++ end
++ end
++
++ return false, 412
++ end
++
++ return true
++end
++
++-- Test whether the given message object contains an "If-Modified-Since" header
++-- and compare it against the given stat object.
++function if_modified_since( req, stat )
++ local h = req.headers
++
++ -- Compare mtimes
++ if type(h['If-Modified-Since']) == "string" then
++ local since = date.to_unix( h['If-Modified-Since'] )
++
++ if stat == nil or since < stat.mtime then
++ return true
++ end
++
++ return false, 304, {
++ ["ETag"] = mk_etag( stat );
++ ["Date"] = date.to_http( os.time() );
++ ["Last-Modified"] = date.to_http( stat.mtime )
++ }
++ end
++
++ return true
++end
++
++-- Test whether the given message object contains an "If-None-Match" header and
++-- compare it against the given stat object.
++function if_none_match( req, stat )
++ local h = req.headers
++ local etag = mk_etag( stat )
++ local method = req.env and req.env.REQUEST_METHOD or "GET"
++
++ -- Check for matching resource
++ if type(h['If-None-Match']) == "string" then
++ for ent in h['If-None-Match']:gmatch("([^, ]+)") do
++ if ( ent == '*' or ent == etag ) and stat ~= nil then
++ if method == "GET" or method == "HEAD" then
++ return false, 304, {
++ ["ETag"] = etag;
++ ["Date"] = date.to_http( os.time() );
++ ["Last-Modified"] = date.to_http( stat.mtime )
++ }
++ else
++ return false, 412
++ end
++ end
++ end
++ end
++
++ return true
++end
++
++-- The If-Range header is currently not implemented due to the lack of general
++-- byte range stuff in luci.http.protocol . This function will always return
++-- false, 412 to indicate a failed precondition.
++function if_range( req, stat )
++ -- Sorry, no subranges (yet)
++ return false, 412
++end
++
++-- Test whether the given message object contains an "If-Unmodified-Since"
++-- header and compare it against the given stat object.
++function if_unmodified_since( req, stat )
++ local h = req.headers
++
++ -- Compare mtimes
++ if type(h['If-Unmodified-Since']) == "string" then
++ local since = date.to_unix( h['If-Unmodified-Since'] )
++
++ if stat ~= nil and since <= stat.mtime then
++ return false, 412
++ end
++ end
++
++ return true
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.luadoc b/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.luadoc
+new file mode 100644
+index 0000000..9cfe02d
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.luadoc
+@@ -0,0 +1,85 @@
++---[[
++LuCI http protocol implementation - HTTP/1.1 bits.
++
++This class provides basic ETag handling and implements most of the
++conditional HTTP/1.1 headers specified in RFC2616 Sct. 14.24 - 14.28 .
++]]
++module "luci.http.protocol.conditionals"
++
++---[[
++Implement 14.19 / ETag.
++
++@class function
++@name mk_etag
++@param stat A file.stat structure
++@return String containing the generated tag suitable for ETag headers
++]]
++
++---[[
++14.24 / If-Match
++
++Test whether the given message object contains an "If-Match" header and
++compare it against the given stat object.
++@class function
++@name if_match
++@param req HTTP request message object
++@param stat A file.stat object
++@return Boolean indicating whether the precondition is ok
++@return Alternative status code if the precondition failed
++]]
++
++---[[
++14.25 / If-Modified-Since
++
++Test whether the given message object contains an "If-Modified-Since" header
++and compare it against the given stat object.
++@class function
++@name if_modified_since
++@param req HTTP request message object
++@param stat A file.stat object
++@return Boolean indicating whether the precondition is ok
++@return Alternative status code if the precondition failed
++@return Table containing extra HTTP headers if the precondition failed
++]]
++
++---[[
++14.26 / If-None-Match
++
++Test whether the given message object contains an "If-None-Match" header and
++compare it against the given stat object.
++@class function
++@name if_none_match
++@param req HTTP request message object
++@param stat A file.stat object
++@return Boolean indicating whether the precondition is ok
++@return Alternative status code if the precondition failed
++@return Table containing extra HTTP headers if the precondition failed
++]]
++
++---[[
++14.27 / If-Range
++
++The If-Range header is currently not implemented due to the lack of general
++byte range stuff in luci.http.protocol . This function will always return
++false, 412 to indicate a failed precondition.
++@class function
++@name if_range
++@param req HTTP request message object
++@param stat A file.stat object
++@return Boolean indicating whether the precondition is ok
++@return Alternative status code if the precondition failed
++]]
++
++---[[
++14.28 / If-Unmodified-Since
++
++Test whether the given message object contains an "If-Unmodified-Since"
++header and compare it against the given stat object.
++@class function
++@name if_unmodified_since
++@param req HTTP request message object
++@param stat A file.stat object
++@return Boolean indicating whether the precondition is ok
++@return Alternative status code if the precondition failed
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/date.lua b/feeds/luci/modules/luci-base/luasrc/http/protocol/date.lua
+new file mode 100644
+index 0000000..e440219
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/date.lua
+@@ -0,0 +1,87 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++-- This class contains functions to parse, compare and format http dates.
++module("luci.http.protocol.date", package.seeall)
++
++require("luci.sys.zoneinfo")
++
++
++MONTHS = {
++ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
++ "Sep", "Oct", "Nov", "Dec"
++}
++
++function tz_offset(tz)
++
++ if type(tz) == "string" then
++
++ -- check for a numeric identifier
++ local s, v = tz:match("([%+%-])([0-9]+)")
++ if s == '+' then s = 1 else s = -1 end
++ if v then v = tonumber(v) end
++
++ if s and v then
++ return s * 60 * ( math.floor( v / 100 ) * 60 + ( v % 100 ) )
++
++ -- lookup symbolic tz
++ elseif luci.sys.zoneinfo.OFFSET[tz:lower()] then
++ return luci.sys.zoneinfo.OFFSET[tz:lower()]
++ end
++
++ end
++
++ -- bad luck
++ return 0
++end
++
++function to_unix(date)
++
++ local wd, day, mon, yr, hr, min, sec, tz = date:match(
++ "([A-Z][a-z][a-z]), ([0-9]+) " ..
++ "([A-Z][a-z][a-z]) ([0-9]+) " ..
++ "([0-9]+):([0-9]+):([0-9]+) " ..
++ "([A-Z0-9%+%-]+)"
++ )
++
++ if day and mon and yr and hr and min and sec then
++ -- find month
++ local month = 1
++ for i = 1, 12 do
++ if MONTHS[i] == mon then
++ month = i
++ break
++ end
++ end
++
++ -- convert to epoch time
++ return tz_offset(tz) + os.time( {
++ year = yr,
++ month = month,
++ day = day,
++ hour = hr,
++ min = min,
++ sec = sec
++ } )
++ end
++
++ return 0
++end
++
++function to_http(time)
++ return os.date( "%a, %d %b %Y %H:%M:%S GMT", time )
++end
++
++function compare(d1, d2)
++
++ if d1:match("[^0-9]") then d1 = to_unix(d1) end
++ if d2:match("[^0-9]") then d2 = to_unix(d2) end
++
++ if d1 == d2 then
++ return 0
++ elseif d1 < d2 then
++ return -1
++ else
++ return 1
++ end
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/date.luadoc b/feeds/luci/modules/luci-base/luasrc/http/protocol/date.luadoc
+new file mode 100644
+index 0000000..d6f1c8d
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/date.luadoc
+@@ -0,0 +1,46 @@
++---[[
++LuCI http protocol implementation - date helper class.
++
++This class contains functions to parse, compare and format http dates.
++]]
++module "luci.http.protocol.date"
++
++---[[
++Return the time offset in seconds between the UTC and given time zone.
++
++@class function
++@name tz_offset
++@param tz Symbolic or numeric timezone specifier
++@return Time offset to UTC in seconds
++]]
++
++---[[
++Parse given HTTP date string and convert it to unix epoch time.
++
++@class function
++@name to_unix
++@param data String containing the date
++@return Unix epoch time
++]]
++
++---[[
++Convert the given unix epoch time to valid HTTP date string.
++
++@class function
++@name to_http
++@param time Unix epoch time
++@return String containing the formatted date
++]]
++
++---[[
++Compare two dates which can either be unix epoch times or HTTP date strings.
++
++@class function
++@name compare
++@param d1 The first date or epoch time to compare
++@param d2 The first date or epoch time to compare
++@return -1 - if d1 is lower then d2
++@return 0 - if both dates are equal
++@return 1 - if d1 is higher then d2
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.lua b/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.lua
+new file mode 100644
+index 0000000..2b99d8e
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.lua
+@@ -0,0 +1,78 @@
++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++-- This class provides functions to guess mime types from file extensions and
++-- vice versa.
++module("luci.http.protocol.mime", package.seeall)
++
++require("luci.util")
++
++MIME_TYPES = {
++ ["txt"] = "text/plain";
++ ["js"] = "text/javascript";
++ ["css"] = "text/css";
++ ["htm"] = "text/html";
++ ["html"] = "text/html";
++ ["patch"] = "text/x-patch";
++ ["c"] = "text/x-csrc";
++ ["h"] = "text/x-chdr";
++ ["o"] = "text/x-object";
++ ["ko"] = "text/x-object";
++
++ ["bmp"] = "image/bmp";
++ ["gif"] = "image/gif";
++ ["png"] = "image/png";
++ ["jpg"] = "image/jpeg";
++ ["jpeg"] = "image/jpeg";
++ ["svg"] = "image/svg+xml";
++
++ ["zip"] = "application/zip";
++ ["pdf"] = "application/pdf";
++ ["xml"] = "application/xml";
++ ["xsl"] = "application/xml";
++ ["doc"] = "application/msword";
++ ["ppt"] = "application/vnd.ms-powerpoint";
++ ["xls"] = "application/vnd.ms-excel";
++ ["odt"] = "application/vnd.oasis.opendocument.text";
++ ["odp"] = "application/vnd.oasis.opendocument.presentation";
++ ["pl"] = "application/x-perl";
++ ["sh"] = "application/x-shellscript";
++ ["php"] = "application/x-php";
++ ["deb"] = "application/x-deb";
++ ["iso"] = "application/x-cd-image";
++ ["tgz"] = "application/x-compressed-tar";
++
++ ["mp3"] = "audio/mpeg";
++ ["ogg"] = "audio/x-vorbis+ogg";
++ ["wav"] = "audio/x-wav";
++
++ ["mpg"] = "video/mpeg";
++ ["mpeg"] = "video/mpeg";
++ ["avi"] = "video/x-msvideo";
++}
++
++-- "application/octet-stream" if the extension is unknown.
++function to_mime(filename)
++ if type(filename) == "string" then
++ local ext = filename:match("[^%.]+$")
++
++ if ext and MIME_TYPES[ext:lower()] then
++ return MIME_TYPES[ext:lower()]
++ end
++ end
++
++ return "application/octet-stream"
++end
++
++-- given mime-type is unknown.
++function to_ext(mimetype)
++ if type(mimetype) == "string" then
++ for ext, type in luci.util.kspairs( MIME_TYPES ) do
++ if type == mimetype then
++ return ext
++ end
++ end
++ end
++
++ return nil
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.luadoc b/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.luadoc
+new file mode 100644
+index 0000000..195b5fc
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.luadoc
+@@ -0,0 +1,34 @@
++---[[
++LuCI http protocol implementation - mime helper class.
++
++This class provides functions to guess mime types from file extensions and
++vice versa.
++]]
++module "luci.http.protocol.mime"
++
++---[[
++MIME mapping table containg extension - mimetype relations.
++
++@class table
++]]
++
++---[[
++Extract extension from a filename and return corresponding mime-type or
++
++"application/octet-stream" if the extension is unknown.
++@class function
++@name to_mime
++@param filename The filename for which the mime type is guessed
++@return String containign the determined mime type
++]]
++
++---[[
++Return corresponding extension for a given mime type or nil if the
++
++given mime-type is unknown.
++@class function
++@name to_ext
++@param mimetype The mimetype to retrieve the extension from
++@return String with the extension or nil for unknown type
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/i18n.lua b/feeds/luci/modules/luci-base/luasrc/i18n.lua
+new file mode 100644
+index 0000000..bcb16d5
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/i18n.lua
+@@ -0,0 +1,55 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.i18n", package.seeall)
++require("luci.util")
++
++local tparser = require "luci.template.parser"
++
++table = {}
++i18ndir = luci.util.libpath() .. "/i18n/"
++loaded = {}
++context = luci.util.threadlocal()
++default = "en"
++
++function clear()
++end
++
++function load(file, lang, force)
++end
++
++-- Alternatively load the translation of the fallback language.
++function loadc(file, force)
++end
++
++function setlanguage(lang)
++ context.lang = lang:gsub("_", "-")
++ context.parent = (context.lang:match("^([a-z][a-z])_"))
++ if not tparser.load_catalog(context.lang, i18ndir) then
++ if context.parent then
++ tparser.load_catalog(context.parent, i18ndir)
++ return context.parent
++ end
++ end
++ return context.lang
++end
++
++function translate(key)
++ return tparser.translate(key) or key
++end
++
++function translatef(key, ...)
++ return tostring(translate(key)):format(...)
++end
++
++-- and ensure that the returned value is a Lua string value.
++-- This is the same as calling <code>tostring(translate(...))</code>
++function string(key)
++ return tostring(translate(key))
++end
++
++-- Ensure that the returned value is a Lua string value.
++-- This is the same as calling <code>tostring(translatef(...))</code>
++function stringf(key, ...)
++ return tostring(translate(key)):format(...)
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/i18n.luadoc b/feeds/luci/modules/luci-base/luasrc/i18n.luadoc
+new file mode 100644
+index 0000000..aa38841
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/i18n.luadoc
+@@ -0,0 +1,84 @@
++---[[
++LuCI translation library.
++]]
++module "luci.i18n"
++
++---[[
++Clear the translation table.
++
++
++@class function
++@name clear
++]]
++
++---[[
++Load a translation and copy its data into the translation table.
++
++@class function
++@name load
++@param file Language file
++@param lang Two-letter language code
++@param force Force reload even if already loaded (optional)
++@return Success status
++]]
++
++---[[
++Load a translation file using the default translation language.
++
++Alternatively load the translation of the fallback language.
++@class function
++@name loadc
++@param file Language file
++@param force Force reload even if already loaded (optional)
++]]
++
++---[[
++Set the context default translation language.
++
++@class function
++@name setlanguage
++@param lang Two-letter language code
++]]
++
++---[[
++Return the translated value for a specific translation key.
++
++@class function
++@name translate
++@param key Default translation text
++@return Translated string
++]]
++
++---[[
++Return the translated value for a specific translation key and use it as sprintf pattern.
++
++@class function
++@name translatef
++@param key Default translation text
++@param ... Format parameters
++@return Translated and formatted string
++]]
++
++---[[
++Return the translated value for a specific translation key
++
++and ensure that the returned value is a Lua string value.
++This is the same as calling <code>tostring(translate(...))</code>
++@class function
++@name string
++@param key Default translation text
++@return Translated string
++]]
++
++---[[
++Return the translated value for a specific translation key and use it as sprintf pattern.
++
++Ensure that the returned value is a Lua string value.
++This is the same as calling <code>tostring(translatef(...))</code>
++@class function
++@name stringf
++@param key Default translation text
++@param ... Format parameters
++@return Translated and formatted string
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/ltn12.lua b/feeds/luci/modules/luci-base/luasrc/ltn12.lua
+new file mode 100644
+index 0000000..3a7268c
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/ltn12.lua
+@@ -0,0 +1,316 @@
++--[[
++LuaSocket 2.0.2 license
++Copyright � 2004-2007 Diego Nehab
++
++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:
++
++The above copyright notice and this permission notice shall be included in
++all copies or substantial portions of the Software.
++
++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.
++]]--
++--[[
++ Changes made by LuCI project:
++ * Renamed to luci.ltn12 to avoid collisions with luasocket
++ * Added inline documentation
++]]--
++-----------------------------------------------------------------------------
++-- LTN12 - Filters, sources, sinks and pumps.
++-- LuaSocket toolkit.
++-- Author: Diego Nehab
++-- RCS ID: $Id$
++-----------------------------------------------------------------------------
++
++-----------------------------------------------------------------------------
++-- Declare module
++-----------------------------------------------------------------------------
++local string = require("string")
++local table = require("table")
++local base = _G
++
++-- See http://lua-users.org/wiki/FiltersSourcesAndSinks for design concepts
++module("luci.ltn12")
++
++filter = {}
++source = {}
++sink = {}
++pump = {}
++
++-- 2048 seems to be better in windows...
++BLOCKSIZE = 2048
++_VERSION = "LTN12 1.0.1"
++
++-----------------------------------------------------------------------------
++-- Filter stuff
++-----------------------------------------------------------------------------
++
++
++-- by passing it each chunk and updating a context between calls.
++function filter.cycle(low, ctx, extra)
++ base.assert(low)
++ return function(chunk)
++ local ret
++ ret, ctx = low(ctx, chunk, extra)
++ return ret
++ end
++end
++
++-- (thanks to Wim Couwenberg)
++function filter.chain(...)
++ local n = table.getn(arg)
++ local top, index = 1, 1
++ local retry = ""
++ return function(chunk)
++ retry = chunk and retry
++ while true do
++ if index == top then
++ chunk = arg[index](chunk)
++ if chunk == "" or top == n then return chunk
++ elseif chunk then index = index + 1
++ else
++ top = top+1
++ index = top
++ end
++ else
++ chunk = arg[index](chunk or "")
++ if chunk == "" then
++ index = index - 1
++ chunk = retry
++ elseif chunk then
++ if index == n then return chunk
++ else index = index + 1 end
++ else base.error("filter returned inappropriate nil") end
++ end
++ end
++ end
++end
++
++-----------------------------------------------------------------------------
++-- Source stuff
++-----------------------------------------------------------------------------
++
++
++-- create an empty source
++local function empty()
++ return nil
++end
++
++function source.empty()
++ return empty
++end
++
++function source.error(err)
++ return function()
++ return nil, err
++ end
++end
++
++function source.file(handle, io_err)
++ if handle then
++ return function()
++ local chunk = handle:read(BLOCKSIZE)
++ if chunk and chunk:len() == 0 then chunk = nil end
++ if not chunk then handle:close() end
++ return chunk
++ end
++ else return source.error(io_err or "unable to open file") end
++end
++
++function source.simplify(src)
++ base.assert(src)
++ return function()
++ local chunk, err_or_new = src()
++ src = err_or_new or src
++ if not chunk then return nil, err_or_new
++ else return chunk end
++ end
++end
++
++function source.string(s)
++ if s then
++ local i = 1
++ return function()
++ local chunk = string.sub(s, i, i+BLOCKSIZE-1)
++ i = i + BLOCKSIZE
++ if chunk ~= "" then return chunk
++ else return nil end
++ end
++ else return source.empty() end
++end
++
++function source.rewind(src)
++ base.assert(src)
++ local t = {}
++ return function(chunk)
++ if not chunk then
++ chunk = table.remove(t)
++ if not chunk then return src()
++ else return chunk end
++ else
++ t[#t+1] = chunk
++ end
++ end
++end
++
++function source.chain(src, f)
++ base.assert(src and f)
++ local last_in, last_out = "", ""
++ local state = "feeding"
++ local err
++ return function()
++ if not last_out then
++ base.error('source is empty!', 2)
++ end
++ while true do
++ if state == "feeding" then
++ last_in, err = src()
++ if err then return nil, err end
++ last_out = f(last_in)
++ if not last_out then
++ if last_in then
++ base.error('filter returned inappropriate nil')
++ else
++ return nil
++ end
++ elseif last_out ~= "" then
++ state = "eating"
++ if last_in then last_in = "" end
++ return last_out
++ end
++ else
++ last_out = f(last_in)
++ if last_out == "" then
++ if last_in == "" then
++ state = "feeding"
++ else
++ base.error('filter returned ""')
++ end
++ elseif not last_out then
++ if last_in then
++ base.error('filter returned inappropriate nil')
++ else
++ return nil
++ end
++ else
++ return last_out
++ end
++ end
++ end
++ end
++end
++
++-- Sources will be used one after the other, as if they were concatenated
++-- (thanks to Wim Couwenberg)
++function source.cat(...)
++ local src = table.remove(arg, 1)
++ return function()
++ while src do
++ local chunk, err = src()
++ if chunk then return chunk end
++ if err then return nil, err end
++ src = table.remove(arg, 1)
++ end
++ end
++end
++
++-----------------------------------------------------------------------------
++-- Sink stuff
++-----------------------------------------------------------------------------
++
++
++function sink.table(t)
++ t = t or {}
++ local f = function(chunk, err)
++ if chunk then t[#t+1] = chunk end
++ return 1
++ end
++ return f, t
++end
++
++function sink.simplify(snk)
++ base.assert(snk)
++ return function(chunk, err)
++ local ret, err_or_new = snk(chunk, err)
++ if not ret then return nil, err_or_new end
++ snk = err_or_new or snk
++ return 1
++ end
++end
++
++function sink.file(handle, io_err)
++ if handle then
++ return function(chunk, err)
++ if not chunk then
++ handle:close()
++ return 1
++ else return handle:write(chunk) end
++ end
++ else return sink.error(io_err or "unable to open file") end
++end
++
++-- creates a sink that discards data
++local function null()
++ return 1
++end
++
++function sink.null()
++ return null
++end
++
++function sink.error(err)
++ return function()
++ return nil, err
++ end
++end
++
++function sink.chain(f, snk)
++ base.assert(f and snk)
++ return function(chunk, err)
++ if chunk ~= "" then
++ local filtered = f(chunk)
++ local done = chunk and ""
++ while true do
++ local ret, snkerr = snk(filtered, err)
++ if not ret then return nil, snkerr end
++ if filtered == done then return 1 end
++ filtered = f(done)
++ end
++ else return 1 end
++ end
++end
++
++-----------------------------------------------------------------------------
++-- Pump stuff
++-----------------------------------------------------------------------------
++
++
++function pump.step(src, snk)
++ local chunk, src_err = src()
++ local ret, snk_err = snk(chunk, src_err)
++ if chunk and ret then return 1
++ else return nil, src_err or snk_err end
++end
++
++function pump.all(src, snk, step)
++ base.assert(src and snk)
++ step = step or pump.step
++ while true do
++ local ret, err = step(src, snk)
++ if not ret then
++ if err then return nil, err
++ else return 1 end
++ end
++ end
++end
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua
+new file mode 100644
+index 0000000..dc702e4
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua
+@@ -0,0 +1,67 @@
++-- Copyright 2011-2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++local ifc = net:get_interface()
++
++local hostname, accept_ra, send_rs
++local bcast, defaultroute, peerdns, dns, metric, clientid, vendorclass
++
++
++hostname = section:taboption("general", Value, "hostname",
++ translate("Hostname to send when requesting DHCP"))
++
++hostname.placeholder = luci.sys.hostname()
++hostname.datatype = "hostname"
++
++
++bcast = section:taboption("advanced", Flag, "broadcast",
++ translate("Use broadcast flag"),
++ translate("Required for certain ISPs, e.g. Charter with DOCSIS 3"))
++
++bcast.default = bcast.disabled
++
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Use default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++peerdns = section:taboption("advanced", Flag, "peerdns",
++ translate("Use DNS servers advertised by peer"),
++ translate("If unchecked, the advertised DNS server addresses are ignored"))
++
++peerdns.default = peerdns.enabled
++
++
++dns = section:taboption("advanced", DynamicList, "dns",
++ translate("Use custom DNS servers"))
++
++dns:depends("peerdns", "")
++dns.datatype = "ipaddr"
++dns.cast = "string"
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++
++
++clientid = section:taboption("advanced", Value, "clientid",
++ translate("Client ID to send when requesting DHCP"))
++
++
++vendorclass = section:taboption("advanced", Value, "vendorid",
++ translate("Vendor Class to send when requesting DHCP"))
++
++
++luci.tools.proto.opt_macaddr(section, ifc, translate("Override MAC address"))
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU"))
++mtu.placeholder = "1500"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_none.lua b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_none.lua
+new file mode 100644
+index 0000000..6fdded9
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_none.lua
+@@ -0,0 +1,4 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
+diff --git a/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua
+new file mode 100644
+index 0000000..f49fed4
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua
+@@ -0,0 +1,81 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++local ifc = net:get_interface()
++
++local ipaddr, netmask, gateway, broadcast, dns, accept_ra, send_rs, ip6addr, ip6gw
++local mtu, metric
++
++
++ipaddr = section:taboption("general", Value, "ipaddr", translate("IPv4 address"))
++ipaddr.datatype = "ip4addr"
++
++
++netmask = section:taboption("general", Value, "netmask",
++ translate("IPv4 netmask"))
++
++netmask.datatype = "ip4addr"
++netmask:value("255.255.255.0")
++netmask:value("255.255.0.0")
++netmask:value("255.0.0.0")
++
++
++gateway = section:taboption("general", Value, "gateway", translate("IPv4 gateway"))
++gateway.datatype = "ip4addr"
++
++
++broadcast = section:taboption("general", Value, "broadcast", translate("IPv4 broadcast"))
++broadcast.datatype = "ip4addr"
++
++
++dns = section:taboption("general", DynamicList, "dns",
++ translate("Use custom DNS servers"))
++
++dns.datatype = "ipaddr"
++dns.cast = "string"
++
++
++if luci.model.network:has_ipv6() then
++
++ local ip6assign = section:taboption("general", Value, "ip6assign", translate("IPv6 assignment length"),
++ translate("Assign a part of given length of every public IPv6-prefix to this interface"))
++ ip6assign:value("", translate("disabled"))
++ ip6assign:value("64")
++ ip6assign.datatype = "max(64)"
++
++ local ip6hint = section:taboption("general", Value, "ip6hint", translate("IPv6 assignment hint"),
++ translate("Assign prefix parts using this hexadecimal subprefix ID for this interface."))
++ for i=33,64 do ip6hint:depends("ip6assign", i) end
++
++ ip6addr = section:taboption("general", Value, "ip6addr", translate("IPv6 address"))
++ ip6addr.datatype = "ip6addr"
++ ip6addr:depends("ip6assign", "")
++
++
++ ip6gw = section:taboption("general", Value, "ip6gw", translate("IPv6 gateway"))
++ ip6gw.datatype = "ip6addr"
++ ip6gw:depends("ip6assign", "")
++
++
++ local ip6prefix = s:taboption("general", Value, "ip6prefix", translate("IPv6 routed prefix"),
++ translate("Public prefix routed to this device for distribution to clients."))
++ ip6prefix.datatype = "ip6addr"
++ ip6prefix:depends("ip6assign", "")
++
++end
++
++
++luci.tools.proto.opt_macaddr(section, ifc, translate("Override MAC address"))
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU"))
++mtu.placeholder = "1500"
++mtu.datatype = "max(9200)"
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
+diff --git a/feeds/luci/modules/luci-base/luasrc/model/firewall.lua b/feeds/luci/modules/luci-base/luasrc/model/firewall.lua
+new file mode 100644
+index 0000000..5573a9b
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/model/firewall.lua
+@@ -0,0 +1,566 @@
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local type, pairs, ipairs, table, luci, math
++ = type, pairs, ipairs, table, luci, math
++
++local tpl = require "luci.template.parser"
++local utl = require "luci.util"
++local uci = require "luci.model.uci"
++
++module "luci.model.firewall"
++
++
++local uci_r, uci_s
++
++function _valid_id(x)
++ return (x and #x > 0 and x:match("^[a-zA-Z0-9_]+$"))
++end
++
++function _get(c, s, o)
++ return uci_r:get(c, s, o)
++end
++
++function _set(c, s, o, v)
++ if v ~= nil then
++ if type(v) == "boolean" then v = v and "1" or "0" end
++ return uci_r:set(c, s, o, v)
++ else
++ return uci_r:delete(c, s, o)
++ end
++end
++
++
++function init(cursor)
++ uci_r = cursor or uci_r or uci.cursor()
++ uci_s = uci_r:substate()
++
++ return _M
++end
++
++function save(self, ...)
++ uci_r:save(...)
++ uci_r:load(...)
++end
++
++function commit(self, ...)
++ uci_r:commit(...)
++ uci_r:load(...)
++end
++
++function get_defaults()
++ return defaults()
++end
++
++function new_zone(self)
++ local name = "newzone"
++ local count = 1
++
++ while self:get_zone(name) do
++ count = count + 1
++ name = "newzone%d" % count
++ end
++
++ return self:add_zone(name)
++end
++
++function add_zone(self, n)
++ if _valid_id(n) and not self:get_zone(n) then
++ local d = defaults()
++ local z = uci_r:section("firewall", "zone", nil, {
++ name = n,
++ network = " ",
++ input = d:input() or "DROP",
++ forward = d:forward() or "DROP",
++ output = d:output() or "DROP"
++ })
++
++ return z and zone(z)
++ end
++end
++
++function get_zone(self, n)
++ if uci_r:get("firewall", n) == "zone" then
++ return zone(n)
++ else
++ local z
++ uci_r:foreach("firewall", "zone",
++ function(s)
++ if n and s.name == n then
++ z = s['.name']
++ return false
++ end
++ end)
++ return z and zone(z)
++ end
++end
++
++function get_zones(self)
++ local zones = { }
++ local znl = { }
++
++ uci_r:foreach("firewall", "zone",
++ function(s)
++ if s.name then
++ znl[s.name] = zone(s['.name'])
++ end
++ end)
++
++ local z
++ for z in utl.kspairs(znl) do
++ zones[#zones+1] = znl[z]
++ end
++
++ return zones
++end
++
++function get_zone_by_network(self, net)
++ local z
++
++ uci_r:foreach("firewall", "zone",
++ function(s)
++ if s.name and net then
++ local n
++ for n in utl.imatch(s.network or s.name) do
++ if n == net then
++ z = s['.name']
++ return false
++ end
++ end
++ end
++ end)
++
++ return z and zone(z)
++end
++
++function del_zone(self, n)
++ local r = false
++
++ if uci_r:get("firewall", n) == "zone" then
++ local z = uci_r:get("firewall", n, "name")
++ r = uci_r:delete("firewall", n)
++ n = z
++ else
++ uci_r:foreach("firewall", "zone",
++ function(s)
++ if n and s.name == n then
++ r = uci_r:delete("firewall", s['.name'])
++ return false
++ end
++ end)
++ end
++
++ if r then
++ uci_r:foreach("firewall", "rule",
++ function(s)
++ if s.src == n or s.dest == n then
++ uci_r:delete("firewall", s['.name'])
++ end
++ end)
++
++ uci_r:foreach("firewall", "redirect",
++ function(s)
++ if s.src == n or s.dest == n then
++ uci_r:delete("firewall", s['.name'])
++ end
++ end)
++
++ uci_r:foreach("firewall", "forwarding",
++ function(s)
++ if s.src == n or s.dest == n then
++ uci_r:delete("firewall", s['.name'])
++ end
++ end)
++ end
++
++ return r
++end
++
++function rename_zone(self, old, new)
++ local r = false
++
++ if _valid_id(new) and not self:get_zone(new) then
++ uci_r:foreach("firewall", "zone",
++ function(s)
++ if old and s.name == old then
++ if not s.network then
++ uci_r:set("firewall", s['.name'], "network", old)
++ end
++ uci_r:set("firewall", s['.name'], "name", new)
++ r = true
++ return false
++ end
++ end)
++
++ if r then
++ uci_r:foreach("firewall", "rule",
++ function(s)
++ if s.src == old then
++ uci_r:set("firewall", s['.name'], "src", new)
++ end
++ if s.dest == old then
++ uci_r:set("firewall", s['.name'], "dest", new)
++ end
++ end)
++
++ uci_r:foreach("firewall", "redirect",
++ function(s)
++ if s.src == old then
++ uci_r:set("firewall", s['.name'], "src", new)
++ end
++ if s.dest == old then
++ uci_r:set("firewall", s['.name'], "dest", new)
++ end
++ end)
++
++ uci_r:foreach("firewall", "forwarding",
++ function(s)
++ if s.src == old then
++ uci_r:set("firewall", s['.name'], "src", new)
++ end
++ if s.dest == old then
++ uci_r:set("firewall", s['.name'], "dest", new)
++ end
++ end)
++ end
++ end
++
++ return r
++end
++
++function del_network(self, net)
++ local z
++ if net then
++ for _, z in ipairs(self:get_zones()) do
++ z:del_network(net)
++ end
++ end
++end
++
++
++defaults = utl.class()
++function defaults.__init__(self)
++ uci_r:foreach("firewall", "defaults",
++ function(s)
++ self.sid = s['.name']
++ return false
++ end)
++
++ self.sid = self.sid or uci_r:section("firewall", "defaults", nil, { })
++end
++
++function defaults.get(self, opt)
++ return _get("firewall", self.sid, opt)
++end
++
++function defaults.set(self, opt, val)
++ return _set("firewall", self.sid, opt, val)
++end
++
++function defaults.syn_flood(self)
++ return (self:get("syn_flood") == "1")
++end
++
++function defaults.drop_invalid(self)
++ return (self:get("drop_invalid") == "1")
++end
++
++function defaults.input(self)
++ return self:get("input") or "DROP"
++end
++
++function defaults.forward(self)
++ return self:get("forward") or "DROP"
++end
++
++function defaults.output(self)
++ return self:get("output") or "DROP"
++end
++
++
++zone = utl.class()
++function zone.__init__(self, z)
++ if uci_r:get("firewall", z) == "zone" then
++ self.sid = z
++ self.data = uci_r:get_all("firewall", z)
++ else
++ uci_r:foreach("firewall", "zone",
++ function(s)
++ if s.name == z then
++ self.sid = s['.name']
++ self.data = s
++ return false
++ end
++ end)
++ end
++end
++
++function zone.get(self, opt)
++ return _get("firewall", self.sid, opt)
++end
++
++function zone.set(self, opt, val)
++ return _set("firewall", self.sid, opt, val)
++end
++
++function zone.masq(self)
++ return (self:get("masq") == "1")
++end
++
++function zone.name(self)
++ return self:get("name")
++end
++
++function zone.network(self)
++ return self:get("network")
++end
++
++function zone.input(self)
++ return self:get("input") or defaults():input() or "DROP"
++end
++
++function zone.forward(self)
++ return self:get("forward") or defaults():forward() or "DROP"
++end
++
++function zone.output(self)
++ return self:get("output") or defaults():output() or "DROP"
++end
++
++function zone.add_network(self, net)
++ if uci_r:get("network", net) == "interface" then
++ local nets = { }
++
++ local n
++ for n in utl.imatch(self:get("network") or self:get("name")) do
++ if n ~= net then
++ nets[#nets+1] = n
++ end
++ end
++
++ nets[#nets+1] = net
++
++ _M:del_network(net)
++ self:set("network", table.concat(nets, " "))
++ end
++end
++
++function zone.del_network(self, net)
++ local nets = { }
++
++ local n
++ for n in utl.imatch(self:get("network") or self:get("name")) do
++ if n ~= net then
++ nets[#nets+1] = n
++ end
++ end
++
++ if #nets > 0 then
++ self:set("network", table.concat(nets, " "))
++ else
++ self:set("network", " ")
++ end
++end
++
++function zone.get_networks(self)
++ local nets = { }
++
++ local n
++ for n in utl.imatch(self:get("network") or self:get("name")) do
++ nets[#nets+1] = n
++ end
++
++ return nets
++end
++
++function zone.clear_networks(self)
++ self:set("network", " ")
++end
++
++function zone.get_forwardings_by(self, what)
++ local name = self:name()
++ local forwards = { }
++
++ uci_r:foreach("firewall", "forwarding",
++ function(s)
++ if s.src and s.dest and s[what] == name then
++ forwards[#forwards+1] = forwarding(s['.name'])
++ end
++ end)
++
++ return forwards
++end
++
++function zone.add_forwarding_to(self, dest)
++ local exist, forward
++
++ for _, forward in ipairs(self:get_forwardings_by('src')) do
++ if forward:dest() == dest then
++ exist = true
++ break
++ end
++ end
++
++ if not exist and dest ~= self:name() and _valid_id(dest) then
++ local s = uci_r:section("firewall", "forwarding", nil, {
++ src = self:name(),
++ dest = dest
++ })
++
++ return s and forwarding(s)
++ end
++end
++
++function zone.add_forwarding_from(self, src)
++ local exist, forward
++
++ for _, forward in ipairs(self:get_forwardings_by('dest')) do
++ if forward:src() == src then
++ exist = true
++ break
++ end
++ end
++
++ if not exist and src ~= self:name() and _valid_id(src) then
++ local s = uci_r:section("firewall", "forwarding", nil, {
++ src = src,
++ dest = self:name()
++ })
++
++ return s and forwarding(s)
++ end
++end
++
++function zone.del_forwardings_by(self, what)
++ local name = self:name()
++
++ uci_r:delete_all("firewall", "forwarding",
++ function(s)
++ return (s.src and s.dest and s[what] == name)
++ end)
++end
++
++function zone.add_redirect(self, options)
++ options = options or { }
++ options.src = self:name()
++
++ local s = uci_r:section("firewall", "redirect", nil, options)
++ return s and redirect(s)
++end
++
++function zone.add_rule(self, options)
++ options = options or { }
++ options.src = self:name()
++
++ local s = uci_r:section("firewall", "rule", nil, options)
++ return s and rule(s)
++end
++
++function zone.get_color(self)
++ if self and self:name() == "lan" then
++ return "#90f090"
++ elseif self and self:name() == "wan" then
++ return "#f09090"
++ elseif self then
++ math.randomseed(tpl.hash(self:name()))
++
++ local r = math.random(128)
++ local g = math.random(128)
++ local min = 0
++ local max = 128
++
++ if ( r + g ) < 128 then
++ min = 128 - r - g
++ else
++ max = 255 - r - g
++ end
++
++ local b = min + math.floor( math.random() * ( max - min ) )
++
++ return "#%02x%02x%02x" % { 0xFF - r, 0xFF - g, 0xFF - b }
++ else
++ return "#eeeeee"
++ end
++end
++
++
++forwarding = utl.class()
++function forwarding.__init__(self, f)
++ self.sid = f
++end
++
++function forwarding.src(self)
++ return uci_r:get("firewall", self.sid, "src")
++end
++
++function forwarding.dest(self)
++ return uci_r:get("firewall", self.sid, "dest")
++end
++
++function forwarding.src_zone(self)
++ return zone(self:src())
++end
++
++function forwarding.dest_zone(self)
++ return zone(self:dest())
++end
++
++
++rule = utl.class()
++function rule.__init__(self, f)
++ self.sid = f
++end
++
++function rule.get(self, opt)
++ return _get("firewall", self.sid, opt)
++end
++
++function rule.set(self, opt, val)
++ return _set("firewall", self.sid, opt, val)
++end
++
++function rule.src(self)
++ return uci_r:get("firewall", self.sid, "src")
++end
++
++function rule.dest(self)
++ return uci_r:get("firewall", self.sid, "dest")
++end
++
++function rule.src_zone(self)
++ return zone(self:src())
++end
++
++function rule.dest_zone(self)
++ return zone(self:dest())
++end
++
++
++redirect = utl.class()
++function redirect.__init__(self, f)
++ self.sid = f
++end
++
++function redirect.get(self, opt)
++ return _get("firewall", self.sid, opt)
++end
++
++function redirect.set(self, opt, val)
++ return _set("firewall", self.sid, opt, val)
++end
++
++function redirect.src(self)
++ return uci_r:get("firewall", self.sid, "src")
++end
++
++function redirect.dest(self)
++ return uci_r:get("firewall", self.sid, "dest")
++end
++
++function redirect.src_zone(self)
++ return zone(self:src())
++end
++
++function redirect.dest_zone(self)
++ return zone(self:dest())
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/model/ipkg.lua b/feeds/luci/modules/luci-base/luasrc/model/ipkg.lua
+new file mode 100644
+index 0000000..e653b03
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/model/ipkg.lua
+@@ -0,0 +1,242 @@
++-- Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local os = require "os"
++local io = require "io"
++local fs = require "nixio.fs"
++local util = require "luci.util"
++
++local type = type
++local pairs = pairs
++local error = error
++local table = table
++
++local ipkg = "opkg --force-removal-of-dependent-packages --force-overwrite --nocase"
++local icfg = "/etc/opkg.conf"
++
++module "luci.model.ipkg"
++
++
++-- Internal action function
++local function _action(cmd, ...)
++ local pkg = ""
++ for k, v in pairs({...}) do
++ pkg = pkg .. " '" .. v:gsub("'", "") .. "'"
++ end
++
++ local c = "%s %s %s >/tmp/opkg.stdout 2>/tmp/opkg.stderr" %{ ipkg, cmd, pkg }
++ local r = os.execute(c)
++ local e = fs.readfile("/tmp/opkg.stderr")
++ local o = fs.readfile("/tmp/opkg.stdout")
++
++ fs.unlink("/tmp/opkg.stderr")
++ fs.unlink("/tmp/opkg.stdout")
++
++ return r, o or "", e or ""
++end
++
++-- Internal parser function
++local function _parselist(rawdata)
++ if type(rawdata) ~= "function" then
++ error("OPKG: Invalid rawdata given")
++ end
++
++ local data = {}
++ local c = {}
++ local l = nil
++
++ for line in rawdata do
++ if line:sub(1, 1) ~= " " then
++ local key, val = line:match("(.-): ?(.*)%s*")
++
++ if key and val then
++ if key == "Package" then
++ c = {Package = val}
++ data[val] = c
++ elseif key == "Status" then
++ c.Status = {}
++ for j in val:gmatch("([^ ]+)") do
++ c.Status[j] = true
++ end
++ else
++ c[key] = val
++ end
++ l = key
++ end
++ else
++ -- Multi-line field
++ c[l] = c[l] .. "\n" .. line
++ end
++ end
++
++ return data
++end
++
++-- Internal lookup function
++local function _lookup(act, pkg)
++ local cmd = ipkg .. " " .. act
++ if pkg then
++ cmd = cmd .. " '" .. pkg:gsub("'", "") .. "'"
++ end
++
++ -- OPKG sometimes kills the whole machine because it sucks
++ -- Therefore we have to use a sucky approach too and use
++ -- tmpfiles instead of directly reading the output
++ local tmpfile = os.tmpname()
++ os.execute(cmd .. (" >%s 2>/dev/null" % tmpfile))
++
++ local data = _parselist(io.lines(tmpfile))
++ os.remove(tmpfile)
++ return data
++end
++
++
++function info(pkg)
++ return _lookup("info", pkg)
++end
++
++function status(pkg)
++ return _lookup("status", pkg)
++end
++
++function install(...)
++ return _action("install", ...)
++end
++
++function installed(pkg)
++ local p = status(pkg)[pkg]
++ return (p and p.Status and p.Status.installed)
++end
++
++function remove(...)
++ return _action("remove", ...)
++end
++
++function update()
++ return _action("update")
++end
++
++function upgrade()
++ return _action("upgrade")
++end
++
++-- List helper
++local function _list(action, pat, cb)
++ local fd = io.popen(ipkg .. " " .. action ..
++ (pat and (" '%s'" % pat:gsub("'", "")) or ""))
++
++ if fd then
++ local name, version, sz, desc
++ while true do
++ local line = fd:read("*l")
++ if not line then break end
++
++ name, version, sz, desc = line:match("^(.-) %- (.-) %- (.-) %- (.+)")
++
++ if not name then
++ name, version, sz = line:match("^(.-) %- (.-) %- (.+)")
++ desc = ""
++ end
++
++ if name and version then
++ if #version > 26 then
++ version = version:sub(1,21) .. ".." .. version:sub(-3,-1)
++ end
++
++ cb(name, version, sz, desc)
++ end
++
++ name = nil
++ version = nil
++ sz = nil
++ desc = nil
++ end
++
++ fd:close()
++ end
++end
++
++function list_all(pat, cb)
++ _list("list --size", pat, cb)
++end
++
++function list_installed(pat, cb)
++ _list("list_installed --size", pat, cb)
++end
++
++function find(pat, cb)
++ _list("find --size", pat, cb)
++end
++
++
++function overlay_root()
++ local od = "/"
++ local fd = io.open(icfg, "r")
++
++ if fd then
++ local ln
++
++ repeat
++ ln = fd:read("*l")
++ if ln and ln:match("^%s*option%s+overlay_root%s+") then
++ od = ln:match("^%s*option%s+overlay_root%s+(%S+)")
++
++ local s = fs.stat(od)
++ if not s or s.type ~= "dir" then
++ od = "/"
++ end
++
++ break
++ end
++ until not ln
++
++ fd:close()
++ end
++
++ return od
++end
++
++function compare_versions(ver1, comp, ver2)
++ if not ver1 or not ver2
++ or not comp or not (#comp > 0) then
++ error("Invalid parameters")
++ return nil
++ end
++ -- correct compare string
++ if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~="
++ elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<="
++ elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">="
++ elseif comp == "=" or comp == "==" then comp = "=="
++ elseif comp == "<<" then comp = "<"
++ elseif comp == ">>" then comp = ">"
++ else
++ error("Invalid compare string")
++ return nil
++ end
++
++ local av1 = util.split(ver1, "[%.%-]", nil, true)
++ local av2 = util.split(ver2, "[%.%-]", nil, true)
++
++ local max = table.getn(av1)
++ if (table.getn(av1) < table.getn(av2)) then
++ max = table.getn(av2)
++ end
++
++ for i = 1, max, 1 do
++ local s1 = av1[i] or ""
++ local s2 = av2[i] or ""
++
++ -- first "not equal" found return true
++ if comp == "~=" and (s1 ~= s2) then return true end
++ -- first "lower" found return true
++ if (comp == "<" or comp == "<=") and (s1 < s2) then return true end
++ -- first "greater" found return true
++ if (comp == ">" or comp == ">=") and (s1 > s2) then return true end
++ -- not equal then return false
++ if (s1 ~= s2) then return false end
++ end
++
++ -- all equal and not compare greater or lower then true
++ return not (comp == "<" or comp == ">")
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/model/ipkg.luadoc b/feeds/luci/modules/luci-base/luasrc/model/ipkg.luadoc
+new file mode 100644
+index 0000000..4e1548d
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/model/ipkg.luadoc
+@@ -0,0 +1,125 @@
++---[[
++LuCI OPKG call abstraction library
++]]
++module "luci.model.ipkg"
++
++---[[
++Return information about installed and available packages.
++
++@class function
++@name info
++@param pkg Limit output to a (set of) packages
++@return Table containing package information
++]]
++
++---[[
++Return the package status of one or more packages.
++
++@class function
++@name status
++@param pkg Limit output to a (set of) packages
++@return Table containing package status information
++]]
++
++---[[
++Install one or more packages.
++
++@class function
++@name install
++@param ... List of packages to install
++@return Boolean indicating the status of the action
++@return OPKG return code, STDOUT and STDERR
++]]
++
++---[[
++Determine whether a given package is installed.
++
++@class function
++@name installed
++@param pkg Package
++@return Boolean
++]]
++
++---[[
++Remove one or more packages.
++
++@class function
++@name remove
++@param ... List of packages to install
++@return Boolean indicating the status of the action
++@return OPKG return code, STDOUT and STDERR
++]]
++
++---[[
++Update package lists.
++
++@class function
++@name update
++@return Boolean indicating the status of the action
++@return OPKG return code, STDOUT and STDERR
++]]
++
++---[[
++Upgrades all installed packages.
++
++@class function
++@name upgrade
++@return Boolean indicating the status of the action
++@return OPKG return code, STDOUT and STDERR
++]]
++
++---[[
++List all packages known to opkg.
++
++@class function
++@name list_all
++@param pat Only find packages matching this pattern, nil lists all packages
++@param cb Callback function invoked for each package, receives name, version and description as arguments
++@return nothing
++]]
++
++---[[
++List installed packages.
++
++@class function
++@name list_installed
++@param pat Only find packages matching this pattern, nil lists all packages
++@param cb Callback function invoked for each package, receives name, version and description as arguments
++@return nothing
++]]
++
++---[[
++Find packages that match the given pattern.
++
++@class function
++@name find
++@param pat Find packages whose names or descriptions match this pattern, nil results in zero results
++@param cb Callback function invoked for each patckage, receives name, version and description as arguments
++@return nothing
++]]
++
++---[[
++Determines the overlay root used by opkg.
++
++@class function
++@name overlay_root
++@return String containing the directory path of the overlay root.
++]]
++
++---[[
++lua version of opkg compare-versions
++
++@class function
++@name compare_versions
++@param ver1 string version 1
++@param ver2 string version 2
++@param comp string compare versions using
++ "<=" or "<" lower-equal
++ ">" or ">=" greater-equal
++ "=" equal
++ "<<" lower
++ ">>" greater
++ "~=" not equal
++@return Boolean indicating the status of the compare
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/model/network.lua b/feeds/luci/modules/luci-base/luasrc/model/network.lua
+new file mode 100644
+index 0000000..20e1032
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/model/network.lua
+@@ -0,0 +1,1579 @@
++-- Copyright 2009-2015 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local type, next, pairs, ipairs, loadfile, table
++ = type, next, pairs, ipairs, loadfile, table
++
++local tonumber, tostring, math = tonumber, tostring, math
++
++local require = require
++
++local nxo = require "nixio"
++local nfs = require "nixio.fs"
++local ipc = require "luci.ip"
++local sys = require "luci.sys"
++local utl = require "luci.util"
++local dsp = require "luci.dispatcher"
++local uci = require "luci.model.uci"
++local lng = require "luci.i18n"
++
++module "luci.model.network"
++
++
++IFACE_PATTERNS_VIRTUAL = { }
++IFACE_PATTERNS_IGNORE = { "^wmaster%d", "^wifi%d", "^hwsim%d", "^imq%d", "^ifb%d", "^mon%.wlan%d", "^sit%d", "^gre%d", "^lo$" }
++IFACE_PATTERNS_WIRELESS = { "^wlan%d", "^wl%d", "^ath%d", "^%w+%.network%d" }
++
++
++protocol = utl.class()
++
++local _protocols = { }
++
++local _interfaces, _bridge, _switch, _tunnel
++local _ubusnetcache, _ubusdevcache, _ubuswificache
++local _uci_real, _uci_state
++
++function _filter(c, s, o, r)
++ local val = _uci_real:get(c, s, o)
++ if val then
++ local l = { }
++ if type(val) == "string" then
++ for val in val:gmatch("%S+") do
++ if val ~= r then
++ l[#l+1] = val
++ end
++ end
++ if #l > 0 then
++ _uci_real:set(c, s, o, table.concat(l, " "))
++ else
++ _uci_real:delete(c, s, o)
++ end
++ elseif type(val) == "table" then
++ for _, val in ipairs(val) do
++ if val ~= r then
++ l[#l+1] = val
++ end
++ end
++ if #l > 0 then
++ _uci_real:set(c, s, o, l)
++ else
++ _uci_real:delete(c, s, o)
++ end
++ end
++ end
++end
++
++function _append(c, s, o, a)
++ local val = _uci_real:get(c, s, o) or ""
++ if type(val) == "string" then
++ local l = { }
++ for val in val:gmatch("%S+") do
++ if val ~= a then
++ l[#l+1] = val
++ end
++ end
++ l[#l+1] = a
++ _uci_real:set(c, s, o, table.concat(l, " "))
++ elseif type(val) == "table" then
++ local l = { }
++ for _, val in ipairs(val) do
++ if val ~= a then
++ l[#l+1] = val
++ end
++ end
++ l[#l+1] = a
++ _uci_real:set(c, s, o, l)
++ end
++end
++
++function _stror(s1, s2)
++ if not s1 or #s1 == 0 then
++ return s2 and #s2 > 0 and s2
++ else
++ return s1
++ end
++end
++
++function _get(c, s, o)
++ return _uci_real:get(c, s, o)
++end
++
++function _set(c, s, o, v)
++ if v ~= nil then
++ if type(v) == "boolean" then v = v and "1" or "0" end
++ return _uci_real:set(c, s, o, v)
++ else
++ return _uci_real:delete(c, s, o)
++ end
++end
++
++function _wifi_iface(x)
++ local _, p
++ for _, p in ipairs(IFACE_PATTERNS_WIRELESS) do
++ if x:match(p) then
++ return true
++ end
++ end
++ return false
++end
++
++function _wifi_state(key, val, field)
++ local radio, radiostate, ifc, ifcstate
++
++ if not next(_ubuswificache) then
++ _ubuswificache = utl.ubus("network.wireless", "status", {}) or {}
++
++ -- workaround extended section format
++ for radio, radiostate in pairs(_ubuswificache) do
++ for ifc, ifcstate in pairs(radiostate.interfaces) do
++ if ifcstate.section and ifcstate.section:sub(1, 1) == '@' then
++ local s = _uci_real:get_all('wireless.%s' % ifcstate.section)
++ if s then
++ ifcstate.section = s['.name']
++ end
++ end
++ end
++ end
++ end
++
++ for radio, radiostate in pairs(_ubuswificache) do
++ for ifc, ifcstate in pairs(radiostate.interfaces) do
++ if ifcstate[key] == val then
++ return ifcstate[field]
++ end
++ end
++ end
++end
++
++function _wifi_lookup(ifn)
++ -- got a radio#.network# pseudo iface, locate the corresponding section
++ local radio, ifnidx = ifn:match("^(%w+)%.network(%d+)$")
++ if radio and ifnidx then
++ local sid = nil
++ local num = 0
++
++ ifnidx = tonumber(ifnidx)
++ _uci_real:foreach("wireless", "wifi-iface",
++ function(s)
++ if s.device == radio then
++ num = num + 1
++ if num == ifnidx then
++ sid = s['.name']
++ return false
++ end
++ end
++ end)
++
++ return sid
++
++ -- looks like wifi, try to locate the section via state vars
++ elseif _wifi_iface(ifn) then
++ local sid = _wifi_state("ifname", ifn, "section")
++ if not sid then
++ _uci_state:foreach("wireless", "wifi-iface",
++ function(s)
++ if s.ifname == ifn then
++ sid = s['.name']
++ return false
++ end
++ end)
++ end
++
++ return sid
++ end
++end
++
++function _iface_virtual(x)
++ local _, p
++ for _, p in ipairs(IFACE_PATTERNS_VIRTUAL) do
++ if x:match(p) then
++ return true
++ end
++ end
++ return false
++end
++
++function _iface_ignore(x)
++ local _, p
++ for _, p in ipairs(IFACE_PATTERNS_IGNORE) do
++ if x:match(p) then
++ return true
++ end
++ end
++ return _iface_virtual(x)
++end
++
++
++function init(cursor)
++ _uci_real = cursor or _uci_real or uci.cursor()
++ _uci_state = _uci_real:substate()
++
++ _interfaces = { }
++ _bridge = { }
++ _switch = { }
++ _tunnel = { }
++
++ _ubusnetcache = { }
++ _ubusdevcache = { }
++ _ubuswificache = { }
++
++ -- read interface information
++ local n, i
++ for n, i in ipairs(nxo.getifaddrs()) do
++ local name = i.name:match("[^:]+")
++ local prnt = name:match("^([^%.]+)%.")
++
++ if _iface_virtual(name) then
++ _tunnel[name] = true
++ end
++
++ if _tunnel[name] or not _iface_ignore(name) then
++ _interfaces[name] = _interfaces[name] or {
++ idx = i.ifindex or n,
++ name = name,
++ rawname = i.name,
++ flags = { },
++ ipaddrs = { },
++ ip6addrs = { }
++ }
++
++ if prnt then
++ _switch[name] = true
++ _switch[prnt] = true
++ end
++
++ if i.family == "packet" then
++ _interfaces[name].flags = i.flags
++ _interfaces[name].stats = i.data
++ _interfaces[name].macaddr = i.addr
++ elseif i.family == "inet" then
++ _interfaces[name].ipaddrs[#_interfaces[name].ipaddrs+1] = ipc.IPv4(i.addr, i.netmask)
++ elseif i.family == "inet6" then
++ _interfaces[name].ip6addrs[#_interfaces[name].ip6addrs+1] = ipc.IPv6(i.addr, i.netmask)
++ end
++ end
++ end
++
++ -- read bridge informaton
++ local b, l
++ for l in utl.execi("brctl show") do
++ if not l:match("STP") then
++ local r = utl.split(l, "%s+", nil, true)
++ if #r == 4 then
++ b = {
++ name = r[1],
++ id = r[2],
++ stp = r[3] == "yes",
++ ifnames = { _interfaces[r[4]] }
++ }
++ if b.ifnames[1] then
++ b.ifnames[1].bridge = b
++ end
++ _bridge[r[1]] = b
++ elseif b then
++ b.ifnames[#b.ifnames+1] = _interfaces[r[2]]
++ b.ifnames[#b.ifnames].bridge = b
++ end
++ end
++ end
++
++ return _M
++end
++
++function save(self, ...)
++ _uci_real:save(...)
++ _uci_real:load(...)
++end
++
++function commit(self, ...)
++ _uci_real:commit(...)
++ _uci_real:load(...)
++end
++
++function ifnameof(self, x)
++ if utl.instanceof(x, interface) then
++ return x:name()
++ elseif utl.instanceof(x, protocol) then
++ return x:ifname()
++ elseif type(x) == "string" then
++ return x:match("^[^:]+")
++ end
++end
++
++function get_protocol(self, protoname, netname)
++ local v = _protocols[protoname]
++ if v then
++ return v(netname or "__dummy__")
++ end
++end
++
++function get_protocols(self)
++ local p = { }
++ local _, v
++ for _, v in ipairs(_protocols) do
++ p[#p+1] = v("__dummy__")
++ end
++ return p
++end
++
++function register_protocol(self, protoname)
++ local proto = utl.class(protocol)
++
++ function proto.__init__(self, name)
++ self.sid = name
++ end
++
++ function proto.proto(self)
++ return protoname
++ end
++
++ _protocols[#_protocols+1] = proto
++ _protocols[protoname] = proto
++
++ return proto
++end
++
++function register_pattern_virtual(self, pat)
++ IFACE_PATTERNS_VIRTUAL[#IFACE_PATTERNS_VIRTUAL+1] = pat
++end
++
++
++function has_ipv6(self)
++ return nfs.access("/proc/net/ipv6_route")
++end
++
++function add_network(self, n, options)
++ local oldnet = self:get_network(n)
++ if n and #n > 0 and n:match("^[a-zA-Z0-9_]+$") and not oldnet then
++ if _uci_real:section("network", "interface", n, options) then
++ return network(n)
++ end
++ elseif oldnet and oldnet:is_empty() then
++ if options then
++ local k, v
++ for k, v in pairs(options) do
++ oldnet:set(k, v)
++ end
++ end
++ return oldnet
++ end
++end
++
++function get_network(self, n)
++ if n and _uci_real:get("network", n) == "interface" then
++ return network(n)
++ end
++end
++
++function get_networks(self)
++ local nets = { }
++ local nls = { }
++
++ _uci_real:foreach("network", "interface",
++ function(s)
++ nls[s['.name']] = network(s['.name'])
++ end)
++
++ local n
++ for n in utl.kspairs(nls) do
++ nets[#nets+1] = nls[n]
++ end
++
++ return nets
++end
++
++function del_network(self, n)
++ local r = _uci_real:delete("network", n)
++ if r then
++ _uci_real:delete_all("network", "alias",
++ function(s) return (s.interface == n) end)
++
++ _uci_real:delete_all("network", "route",
++ function(s) return (s.interface == n) end)
++
++ _uci_real:delete_all("network", "route6",
++ function(s) return (s.interface == n) end)
++
++ _uci_real:foreach("wireless", "wifi-iface",
++ function(s)
++ local net
++ local rest = { }
++ for net in utl.imatch(s.network) do
++ if net ~= n then
++ rest[#rest+1] = net
++ end
++ end
++ if #rest > 0 then
++ _uci_real:set("wireless", s['.name'], "network",
++ table.concat(rest, " "))
++ else
++ _uci_real:delete("wireless", s['.name'], "network")
++ end
++ end)
++ end
++ return r
++end
++
++function rename_network(self, old, new)
++ local r
++ if new and #new > 0 and new:match("^[a-zA-Z0-9_]+$") and not self:get_network(new) then
++ r = _uci_real:section("network", "interface", new, _uci_real:get_all("network", old))
++
++ if r then
++ _uci_real:foreach("network", "alias",
++ function(s)
++ if s.interface == old then
++ _uci_real:set("network", s['.name'], "interface", new)
++ end
++ end)
++
++ _uci_real:foreach("network", "route",
++ function(s)
++ if s.interface == old then
++ _uci_real:set("network", s['.name'], "interface", new)
++ end
++ end)
++
++ _uci_real:foreach("network", "route6",
++ function(s)
++ if s.interface == old then
++ _uci_real:set("network", s['.name'], "interface", new)
++ end
++ end)
++
++ _uci_real:foreach("wireless", "wifi-iface",
++ function(s)
++ local net
++ local list = { }
++ for net in utl.imatch(s.network) do
++ if net == old then
++ list[#list+1] = new
++ else
++ list[#list+1] = net
++ end
++ end
++ if #list > 0 then
++ _uci_real:set("wireless", s['.name'], "network",
++ table.concat(list, " "))
++ end
++ end)
++
++ _uci_real:delete("network", old)
++ end
++ end
++ return r or false
++end
++
++function get_interface(self, i)
++ if _interfaces[i] or _wifi_iface(i) then
++ return interface(i)
++ else
++ local ifc
++ local num = { }
++ _uci_real:foreach("wireless", "wifi-iface",
++ function(s)
++ if s.device then
++ num[s.device] = num[s.device] and num[s.device] + 1 or 1
++ if s['.name'] == i then
++ ifc = interface(
++ "%s.network%d" %{s.device, num[s.device] })
++ return false
++ end
++ end
++ end)
++ return ifc
++ end
++end
++
++function get_interfaces(self)
++ local iface
++ local ifaces = { }
++ local seen = { }
++ local nfs = { }
++ local baseof = { }
++
++ -- find normal interfaces
++ _uci_real:foreach("network", "interface",
++ function(s)
++ for iface in utl.imatch(s.ifname) do
++ if not _iface_ignore(iface) and not _wifi_iface(iface) then
++ seen[iface] = true
++ nfs[iface] = interface(iface)
++ end
++ end
++ end)
++
++ for iface in utl.kspairs(_interfaces) do
++ if not (seen[iface] or _iface_ignore(iface) or _wifi_iface(iface)) then
++ nfs[iface] = interface(iface)
++ end
++ end
++
++ -- find vlan interfaces
++ _uci_real:foreach("network", "switch_vlan",
++ function(s)
++ if not s.device then
++ return
++ end
++
++ local base = baseof[s.device]
++ if not base then
++ if not s.device:match("^eth%d") then
++ local l
++ for l in utl.execi("swconfig dev %q help 2>/dev/null" % s.device) do
++ if not base then
++ base = l:match("^%w+: (%w+)")
++ end
++ end
++ if not base or not base:match("^eth%d") then
++ base = "eth0"
++ end
++ else
++ base = s.device
++ end
++ baseof[s.device] = base
++ end
++
++ local vid = tonumber(s.vid or s.vlan)
++ if vid ~= nil and vid >= 0 and vid <= 4095 then
++ local iface = "%s.%d" %{ base, vid }
++ if not seen[iface] then
++ seen[iface] = true
++ nfs[iface] = interface(iface)
++ end
++ end
++ end)
++
++ for iface in utl.kspairs(nfs) do
++ ifaces[#ifaces+1] = nfs[iface]
++ end
++
++ -- find wifi interfaces
++ local num = { }
++ local wfs = { }
++ _uci_real:foreach("wireless", "wifi-iface",
++ function(s)
++ if s.device then
++ num[s.device] = num[s.device] and num[s.device] + 1 or 1
++ local i = "%s.network%d" %{ s.device, num[s.device] }
++ wfs[i] = interface(i)
++ end
++ end)
++
++ for iface in utl.kspairs(wfs) do
++ ifaces[#ifaces+1] = wfs[iface]
++ end
++
++ return ifaces
++end
++
++function ignore_interface(self, x)
++ return _iface_ignore(x)
++end
++
++function get_wifidev(self, dev)
++ if _uci_real:get("wireless", dev) == "wifi-device" then
++ return wifidev(dev)
++ end
++end
++
++function get_wifidevs(self)
++ local devs = { }
++ local wfd = { }
++
++ _uci_real:foreach("wireless", "wifi-device",
++ function(s) wfd[#wfd+1] = s['.name'] end)
++
++ local dev
++ for _, dev in utl.vspairs(wfd) do
++ devs[#devs+1] = wifidev(dev)
++ end
++
++ return devs
++end
++
++function get_wifinet(self, net)
++ local wnet = _wifi_lookup(net)
++ if wnet then
++ return wifinet(wnet)
++ end
++end
++
++function add_wifinet(self, net, options)
++ if type(options) == "table" and options.device and
++ _uci_real:get("wireless", options.device) == "wifi-device"
++ then
++ local wnet = _uci_real:section("wireless", "wifi-iface", nil, options)
++ return wifinet(wnet)
++ end
++end
++
++function del_wifinet(self, net)
++ local wnet = _wifi_lookup(net)
++ if wnet then
++ _uci_real:delete("wireless", wnet)
++ return true
++ end
++ return false
++end
++
++function get_status_by_route(self, addr, mask)
++ local _, object
++ for _, object in ipairs(utl.ubus()) do
++ local net = object:match("^network%.interface%.(.+)")
++ if net then
++ local s = utl.ubus(object, "status", {})
++ if s and s.route then
++ local rt
++ for _, rt in ipairs(s.route) do
++ if not rt.table and rt.target == addr and rt.mask == mask then
++ return net, s
++ end
++ end
++ end
++ end
++ end
++end
++
++function get_status_by_address(self, addr)
++ local _, object
++ for _, object in ipairs(utl.ubus()) do
++ local net = object:match("^network%.interface%.(.+)")
++ if net then
++ local s = utl.ubus(object, "status", {})
++ if s and s['ipv4-address'] then
++ local a
++ for _, a in ipairs(s['ipv4-address']) do
++ if a.address == addr then
++ return net, s
++ end
++ end
++ end
++ if s and s['ipv6-address'] then
++ local a
++ for _, a in ipairs(s['ipv6-address']) do
++ if a.address == addr then
++ return net, s
++ end
++ end
++ end
++ end
++ end
++end
++
++function get_wannet(self)
++ local net = self:get_status_by_route("0.0.0.0", 0)
++ return net and network(net)
++end
++
++function get_wandev(self)
++ local _, stat = self:get_status_by_route("0.0.0.0", 0)
++ return stat and interface(stat.l3_device or stat.device)
++end
++
++function get_wan6net(self)
++ local net = self:get_status_by_route("::", 0)
++ return net and network(net)
++end
++
++function get_wan6dev(self)
++ local _, stat = self:get_status_by_route("::", 0)
++ return stat and interface(stat.l3_device or stat.device)
++end
++
++
++function network(name, proto)
++ if name then
++ local p = proto or _uci_real:get("network", name, "proto")
++ local c = p and _protocols[p] or protocol
++ return c(name)
++ end
++end
++
++function protocol.__init__(self, name)
++ self.sid = name
++end
++
++function protocol._get(self, opt)
++ local v = _uci_real:get("network", self.sid, opt)
++ if type(v) == "table" then
++ return table.concat(v, " ")
++ end
++ return v or ""
++end
++
++function protocol._ubus(self, field)
++ if not _ubusnetcache[self.sid] then
++ _ubusnetcache[self.sid] = utl.ubus("network.interface.%s" % self.sid,
++ "status", { })
++ end
++ if _ubusnetcache[self.sid] and field then
++ return _ubusnetcache[self.sid][field]
++ end
++ return _ubusnetcache[self.sid]
++end
++
++function protocol.get(self, opt)
++ return _get("network", self.sid, opt)
++end
++
++function protocol.set(self, opt, val)
++ return _set("network", self.sid, opt, val)
++end
++
++function protocol.ifname(self)
++ local ifname
++ if self:is_floating() then
++ ifname = self:_ubus("l3_device")
++ else
++ ifname = self:_ubus("device")
++ end
++ if not ifname then
++ local num = { }
++ _uci_real:foreach("wireless", "wifi-iface",
++ function(s)
++ if s.device then
++ num[s.device] = num[s.device]
++ and num[s.device] + 1 or 1
++
++ local net
++ for net in utl.imatch(s.network) do
++ if net == self.sid then
++ ifname = "%s.network%d" %{ s.device, num[s.device] }
++ return false
++ end
++ end
++ end
++ end)
++ end
++ return ifname
++end
++
++function protocol.proto(self)
++ return "none"
++end
++
++function protocol.get_i18n(self)
++ local p = self:proto()
++ if p == "none" then
++ return lng.translate("Unmanaged")
++ elseif p == "static" then
++ return lng.translate("Static address")
++ elseif p == "dhcp" then
++ return lng.translate("DHCP client")
++ else
++ return lng.translate("Unknown")
++ end
++end
++
++function protocol.type(self)
++ return self:_get("type")
++end
++
++function protocol.name(self)
++ return self.sid
++end
++
++function protocol.uptime(self)
++ return self:_ubus("uptime") or 0
++end
++
++function protocol.expires(self)
++ local a = tonumber(_uci_state:get("network", self.sid, "lease_acquired"))
++ local l = tonumber(_uci_state:get("network", self.sid, "lease_lifetime"))
++ if a and l then
++ l = l - (nxo.sysinfo().uptime - a)
++ return l > 0 and l or 0
++ end
++ return -1
++end
++
++function protocol.metric(self)
++ return tonumber(_uci_state:get("network", self.sid, "metric")) or 0
++end
++
++function protocol.ipaddr(self)
++ local addrs = self:_ubus("ipv4-address")
++ return addrs and #addrs > 0 and addrs[1].address
++end
++
++function protocol.netmask(self)
++ local addrs = self:_ubus("ipv4-address")
++ return addrs and #addrs > 0 and
++ ipc.IPv4("0.0.0.0/%d" % addrs[1].mask):mask():string()
++end
++
++function protocol.gwaddr(self)
++ local _, route
++ for _, route in ipairs(self:_ubus("route") or { }) do
++ if route.target == "0.0.0.0" and route.mask == 0 then
++ return route.nexthop
++ end
++ end
++end
++
++function protocol.dnsaddrs(self)
++ local dns = { }
++ local _, addr
++ for _, addr in ipairs(self:_ubus("dns-server") or { }) do
++ if not addr:match(":") then
++ dns[#dns+1] = addr
++ end
++ end
++ return dns
++end
++
++function protocol.ip6addr(self)
++ local addrs = self:_ubus("ipv6-address")
++ if addrs and #addrs > 0 then
++ return "%s/%d" %{ addrs[1].address, addrs[1].mask }
++ else
++ addrs = self:_ubus("ipv6-prefix-assignment")
++ if addrs and #addrs > 0 then
++ return "%s/%d" %{ addrs[1].address, addrs[1].mask }
++ end
++ end
++end
++
++function protocol.gw6addr(self)
++ local _, route
++ for _, route in ipairs(self:_ubus("route") or { }) do
++ if route.target == "::" and route.mask == 0 then
++ return ipc.IPv6(route.nexthop):string()
++ end
++ end
++end
++
++function protocol.dns6addrs(self)
++ local dns = { }
++ local _, addr
++ for _, addr in ipairs(self:_ubus("dns-server") or { }) do
++ if addr:match(":") then
++ dns[#dns+1] = addr
++ end
++ end
++ return dns
++end
++
++function protocol.is_bridge(self)
++ return (not self:is_virtual() and self:type() == "bridge")
++end
++
++function protocol.opkg_package(self)
++ return nil
++end
++
++function protocol.is_installed(self)
++ return true
++end
++
++function protocol.is_virtual(self)
++ return false
++end
++
++function protocol.is_floating(self)
++ return false
++end
++
++function protocol.is_empty(self)
++ if self:is_floating() then
++ return false
++ else
++ local rv = true
++
++ if (self:_get("ifname") or ""):match("%S+") then
++ rv = false
++ end
++
++ _uci_real:foreach("wireless", "wifi-iface",
++ function(s)
++ local n
++ for n in utl.imatch(s.network) do
++ if n == self.sid then
++ rv = false
++ return false
++ end
++ end
++ end)
++
++ return rv
++ end
++end
++
++function protocol.add_interface(self, ifname)
++ ifname = _M:ifnameof(ifname)
++ if ifname and not self:is_floating() then
++ -- if its a wifi interface, change its network option
++ local wif = _wifi_lookup(ifname)
++ if wif then
++ _append("wireless", wif, "network", self.sid)
++
++ -- add iface to our iface list
++ else
++ _append("network", self.sid, "ifname", ifname)
++ end
++ end
++end
++
++function protocol.del_interface(self, ifname)
++ ifname = _M:ifnameof(ifname)
++ if ifname and not self:is_floating() then
++ -- if its a wireless interface, clear its network option
++ local wif = _wifi_lookup(ifname)
++ if wif then _filter("wireless", wif, "network", self.sid) end
++
++ -- remove the interface
++ _filter("network", self.sid, "ifname", ifname)
++ end
++end
++
++function protocol.get_interface(self)
++ if self:is_virtual() then
++ _tunnel[self:proto() .. "-" .. self.sid] = true
++ return interface(self:proto() .. "-" .. self.sid, self)
++ elseif self:is_bridge() then
++ _bridge["br-" .. self.sid] = true
++ return interface("br-" .. self.sid, self)
++ else
++ local ifn = nil
++ local num = { }
++ for ifn in utl.imatch(_uci_real:get("network", self.sid, "ifname")) do
++ ifn = ifn:match("^[^:/]+")
++ return ifn and interface(ifn, self)
++ end
++ ifn = nil
++ _uci_real:foreach("wireless", "wifi-iface",
++ function(s)
++ if s.device then
++ num[s.device] = num[s.device] and num[s.device] + 1 or 1
++
++ local net
++ for net in utl.imatch(s.network) do
++ if net == self.sid then
++ ifn = "%s.network%d" %{ s.device, num[s.device] }
++ return false
++ end
++ end
++ end
++ end)
++ return ifn and interface(ifn, self)
++ end
++end
++
++function protocol.get_interfaces(self)
++ if self:is_bridge() or (self:is_virtual() and not self:is_floating()) then
++ local ifaces = { }
++
++ local ifn
++ local nfs = { }
++ for ifn in utl.imatch(self:get("ifname")) do
++ ifn = ifn:match("^[^:/]+")
++ nfs[ifn] = interface(ifn, self)
++ end
++
++ for ifn in utl.kspairs(nfs) do
++ ifaces[#ifaces+1] = nfs[ifn]
++ end
++
++ local num = { }
++ local wfs = { }
++ _uci_real:foreach("wireless", "wifi-iface",
++ function(s)
++ if s.device then
++ num[s.device] = num[s.device] and num[s.device] + 1 or 1
++
++ local net
++ for net in utl.imatch(s.network) do
++ if net == self.sid then
++ ifn = "%s.network%d" %{ s.device, num[s.device] }
++ wfs[ifn] = interface(ifn, self)
++ end
++ end
++ end
++ end)
++
++ for ifn in utl.kspairs(wfs) do
++ ifaces[#ifaces+1] = wfs[ifn]
++ end
++
++ return ifaces
++ end
++end
++
++function protocol.contains_interface(self, ifname)
++ ifname = _M:ifnameof(ifname)
++ if not ifname then
++ return false
++ elseif self:is_virtual() and self:proto() .. "-" .. self.sid == ifname then
++ return true
++ elseif self:is_bridge() and "br-" .. self.sid == ifname then
++ return true
++ else
++ local ifn
++ for ifn in utl.imatch(self:get("ifname")) do
++ ifn = ifn:match("[^:]+")
++ if ifn == ifname then
++ return true
++ end
++ end
++
++ local wif = _wifi_lookup(ifname)
++ if wif then
++ local n
++ for n in utl.imatch(_uci_real:get("wireless", wif, "network")) do
++ if n == self.sid then
++ return true
++ end
++ end
++ end
++ end
++
++ return false
++end
++
++function protocol.adminlink(self)
++ return dsp.build_url("admin", "network", "network", self.sid)
++end
++
++
++interface = utl.class()
++
++function interface.__init__(self, ifname, network)
++ local wif = _wifi_lookup(ifname)
++ if wif then
++ self.wif = wifinet(wif)
++ self.ifname = _wifi_state("section", wif, "ifname")
++ end
++
++ self.ifname = self.ifname or ifname
++ self.dev = _interfaces[self.ifname]
++ self.network = network
++end
++
++function interface._ubus(self, field)
++ if not _ubusdevcache[self.ifname] then
++ _ubusdevcache[self.ifname] = utl.ubus("network.device", "status",
++ { name = self.ifname })
++ end
++ if _ubusdevcache[self.ifname] and field then
++ return _ubusdevcache[self.ifname][field]
++ end
++ return _ubusdevcache[self.ifname]
++end
++
++function interface.name(self)
++ return self.wif and self.wif:ifname() or self.ifname
++end
++
++function interface.mac(self)
++ return (self:_ubus("macaddr") or "00:00:00:00:00:00"):upper()
++end
++
++function interface.ipaddrs(self)
++ return self.dev and self.dev.ipaddrs or { }
++end
++
++function interface.ip6addrs(self)
++ return self.dev and self.dev.ip6addrs or { }
++end
++
++function interface.type(self)
++ if self.wif or _wifi_iface(self.ifname) then
++ return "wifi"
++ elseif _bridge[self.ifname] then
++ return "bridge"
++ elseif _tunnel[self.ifname] then
++ return "tunnel"
++ elseif self.ifname:match("%.") then
++ return "vlan"
++ elseif _switch[self.ifname] then
++ return "switch"
++ else
++ return "ethernet"
++ end
++end
++
++function interface.shortname(self)
++ if self.wif then
++ return "%s %q" %{
++ self.wif:active_mode(),
++ self.wif:active_ssid() or self.wif:active_bssid()
++ }
++ else
++ return self.ifname
++ end
++end
++
++function interface.get_i18n(self)
++ if self.wif then
++ return "%s: %s %q" %{
++ lng.translate("Wireless Network"),
++ self.wif:active_mode(),
++ self.wif:active_ssid() or self.wif:active_bssid()
++ }
++ else
++ return "%s: %q" %{ self:get_type_i18n(), self:name() }
++ end
++end
++
++function interface.get_type_i18n(self)
++ local x = self:type()
++ if x == "wifi" then
++ return lng.translate("Wireless Adapter")
++ elseif x == "bridge" then
++ return lng.translate("Bridge")
++ elseif x == "switch" then
++ return lng.translate("Ethernet Switch")
++ elseif x == "vlan" then
++ return lng.translate("VLAN Interface")
++ elseif x == "tunnel" then
++ return lng.translate("Tunnel Interface")
++ else
++ return lng.translate("Ethernet Adapter")
++ end
++end
++
++function interface.adminlink(self)
++ if self.wif then
++ return self.wif:adminlink()
++ end
++end
++
++function interface.ports(self)
++ local members = self:_ubus("bridge-members")
++ if members then
++ local _, iface
++ local ifaces = { }
++ for _, iface in ipairs(members) do
++ ifaces[#ifaces+1] = interface(iface)
++ end
++ end
++end
++
++function interface.bridge_id(self)
++ if self.br then
++ return self.br.id
++ else
++ return nil
++ end
++end
++
++function interface.bridge_stp(self)
++ if self.br then
++ return self.br.stp
++ else
++ return false
++ end
++end
++
++function interface.is_up(self)
++ return self:_ubus("up") or false
++end
++
++function interface.is_bridge(self)
++ return (self:type() == "bridge")
++end
++
++function interface.is_bridgeport(self)
++ return self.dev and self.dev.bridge and true or false
++end
++
++function interface.tx_bytes(self)
++ local stat = self:_ubus("statistics")
++ return stat and stat.tx_bytes or 0
++end
++
++function interface.rx_bytes(self)
++ local stat = self:_ubus("statistics")
++ return stat and stat.rx_bytes or 0
++end
++
++function interface.tx_packets(self)
++ local stat = self:_ubus("statistics")
++ return stat and stat.tx_packets or 0
++end
++
++function interface.rx_packets(self)
++ local stat = self:_ubus("statistics")
++ return stat and stat.rx_packets or 0
++end
++
++function interface.get_network(self)
++ return self:get_networks()[1]
++end
++
++function interface.get_networks(self)
++ if not self.networks then
++ local nets = { }
++ local _, net
++ for _, net in ipairs(_M:get_networks()) do
++ if net:contains_interface(self.ifname) or
++ net:ifname() == self.ifname
++ then
++ nets[#nets+1] = net
++ end
++ end
++ table.sort(nets, function(a, b) return a.sid < b.sid end)
++ self.networks = nets
++ return nets
++ else
++ return self.networks
++ end
++end
++
++function interface.get_wifinet(self)
++ return self.wif
++end
++
++
++wifidev = utl.class()
++
++function wifidev.__init__(self, dev)
++ self.sid = dev
++ self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { }
++end
++
++function wifidev.get(self, opt)
++ return _get("wireless", self.sid, opt)
++end
++
++function wifidev.set(self, opt, val)
++ return _set("wireless", self.sid, opt, val)
++end
++
++function wifidev.name(self)
++ return self.sid
++end
++
++function wifidev.hwmodes(self)
++ local l = self.iwinfo.hwmodelist
++ if l and next(l) then
++ return l
++ else
++ return { b = true, g = true }
++ end
++end
++
++function wifidev.get_i18n(self)
++ local t = "Generic"
++ if self.iwinfo.type == "wl" then
++ t = "Broadcom"
++ elseif self.iwinfo.type == "madwifi" then
++ t = "Atheros"
++ end
++
++ local m = ""
++ local l = self:hwmodes()
++ if l.a then m = m .. "a" end
++ if l.b then m = m .. "b" end
++ if l.g then m = m .. "g" end
++ if l.n then m = m .. "n" end
++ if l.ac then m = "ac" end
++
++ return "%s 802.11%s Wireless Controller (%s)" %{ t, m, self:name() }
++end
++
++function wifidev.is_up(self)
++ if _ubuswificache[self.sid] then
++ return (_ubuswificache[self.sid].up == true)
++ end
++
++ local up = false
++ _uci_state:foreach("wireless", "wifi-iface",
++ function(s)
++ if s.device == self.sid then
++ if s.up == "1" then
++ up = true
++ return false
++ end
++ end
++ end)
++
++ return up
++end
++
++function wifidev.get_wifinet(self, net)
++ if _uci_real:get("wireless", net) == "wifi-iface" then
++ return wifinet(net)
++ else
++ local wnet = _wifi_lookup(net)
++ if wnet then
++ return wifinet(wnet)
++ end
++ end
++end
++
++function wifidev.get_wifinets(self)
++ local nets = { }
++
++ _uci_real:foreach("wireless", "wifi-iface",
++ function(s)
++ if s.device == self.sid then
++ nets[#nets+1] = wifinet(s['.name'])
++ end
++ end)
++
++ return nets
++end
++
++function wifidev.add_wifinet(self, options)
++ options = options or { }
++ options.device = self.sid
++
++ local wnet = _uci_real:section("wireless", "wifi-iface", nil, options)
++ if wnet then
++ return wifinet(wnet, options)
++ end
++end
++
++function wifidev.del_wifinet(self, net)
++ if utl.instanceof(net, wifinet) then
++ net = net.sid
++ elseif _uci_real:get("wireless", net) ~= "wifi-iface" then
++ net = _wifi_lookup(net)
++ end
++
++ if net and _uci_real:get("wireless", net, "device") == self.sid then
++ _uci_real:delete("wireless", net)
++ return true
++ end
++
++ return false
++end
++
++
++wifinet = utl.class()
++
++function wifinet.__init__(self, net, data)
++ self.sid = net
++
++ local num = { }
++ local netid
++ _uci_real:foreach("wireless", "wifi-iface",
++ function(s)
++ if s.device then
++ num[s.device] = num[s.device] and num[s.device] + 1 or 1
++ if s['.name'] == self.sid then
++ netid = "%s.network%d" %{ s.device, num[s.device] }
++ return false
++ end
++ end
++ end)
++
++ local dev = _wifi_state("section", self.sid, "ifname") or netid
++
++ self.netid = netid
++ self.wdev = dev
++ self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { }
++ self.iwdata = data or _uci_state:get_all("wireless", self.sid) or
++ _uci_real:get_all("wireless", self.sid) or { }
++end
++
++function wifinet.get(self, opt)
++ return _get("wireless", self.sid, opt)
++end
++
++function wifinet.set(self, opt, val)
++ return _set("wireless", self.sid, opt, val)
++end
++
++function wifinet.mode(self)
++ return _uci_state:get("wireless", self.sid, "mode") or "ap"
++end
++
++function wifinet.ssid(self)
++ return _uci_state:get("wireless", self.sid, "ssid")
++end
++
++function wifinet.bssid(self)
++ return _uci_state:get("wireless", self.sid, "bssid")
++end
++
++function wifinet.network(self)
++ return _uci_state:get("wifinet", self.sid, "network")
++end
++
++function wifinet.id(self)
++ return self.netid
++end
++
++function wifinet.name(self)
++ return self.sid
++end
++
++function wifinet.ifname(self)
++ local ifname = self.iwinfo.ifname
++ if not ifname or ifname:match("^wifi%d") or ifname:match("^radio%d") then
++ ifname = self.wdev
++ end
++ return ifname
++end
++
++function wifinet.get_device(self)
++ if self.iwdata.device then
++ return wifidev(self.iwdata.device)
++ end
++end
++
++function wifinet.is_up(self)
++ local ifc = self:get_interface()
++ return (ifc and ifc:is_up() or false)
++end
++
++function wifinet.active_mode(self)
++ local m = _stror(self.iwdata.mode, self.iwinfo.mode) or "ap"
++
++ if m == "ap" then m = "Master"
++ elseif m == "sta" then m = "Client"
++ elseif m == "adhoc" then m = "Ad-Hoc"
++ elseif m == "mesh" then m = "Mesh"
++ elseif m == "monitor" then m = "Monitor"
++ end
++
++ return m
++end
++
++function wifinet.active_mode_i18n(self)
++ return lng.translate(self:active_mode())
++end
++
++function wifinet.active_ssid(self)
++ return _stror(self.iwdata.ssid, self.iwinfo.ssid)
++end
++
++function wifinet.active_bssid(self)
++ return _stror(self.iwdata.bssid, self.iwinfo.bssid) or "00:00:00:00:00:00"
++end
++
++function wifinet.active_encryption(self)
++ local enc = self.iwinfo and self.iwinfo.encryption
++ return enc and enc.description or "-"
++end
++
++function wifinet.assoclist(self)
++ return self.iwinfo.assoclist or { }
++end
++
++function wifinet.frequency(self)
++ local freq = self.iwinfo.frequency
++ if freq and freq > 0 then
++ return "%.03f" % (freq / 1000)
++ end
++end
++
++function wifinet.bitrate(self)
++ local rate = self.iwinfo.bitrate
++ if rate and rate > 0 then
++ return (rate / 1000)
++ end
++end
++
++function wifinet.channel(self)
++ return self.iwinfo.channel or
++ tonumber(_uci_state:get("wireless", self.iwdata.device, "channel"))
++end
++
++function wifinet.signal(self)
++ return self.iwinfo.signal or 0
++end
++
++function wifinet.noise(self)
++ return self.iwinfo.noise or 0
++end
++
++function wifinet.country(self)
++ return self.iwinfo.country or "00"
++end
++
++function wifinet.txpower(self)
++ local pwr = (self.iwinfo.txpower or 0)
++ return pwr + self:txpower_offset()
++end
++
++function wifinet.txpower_offset(self)
++ return self.iwinfo.txpower_offset or 0
++end
++
++function wifinet.signal_level(self, s, n)
++ if self:active_bssid() ~= "00:00:00:00:00:00" then
++ local signal = s or self:signal()
++ local noise = n or self:noise()
++
++ if signal < 0 and noise < 0 then
++ local snr = -1 * (noise - signal)
++ return math.floor(snr / 5)
++ else
++ return 0
++ end
++ else
++ return -1
++ end
++end
++
++function wifinet.signal_percent(self)
++ local qc = self.iwinfo.quality or 0
++ local qm = self.iwinfo.quality_max or 0
++
++ if qc > 0 and qm > 0 then
++ return math.floor((100 / qm) * qc)
++ else
++ return 0
++ end
++end
++
++function wifinet.shortname(self)
++ return "%s %q" %{
++ lng.translate(self:active_mode()),
++ self:active_ssid() or self:active_bssid()
++ }
++end
++
++function wifinet.get_i18n(self)
++ return "%s: %s %q (%s)" %{
++ lng.translate("Wireless Network"),
++ lng.translate(self:active_mode()),
++ self:active_ssid() or self:active_bssid(),
++ self:ifname()
++ }
++end
++
++function wifinet.adminlink(self)
++ return dsp.build_url("admin", "network", "wireless", self.netid)
++end
++
++function wifinet.get_network(self)
++ return self:get_networks()[1]
++end
++
++function wifinet.get_networks(self)
++ local nets = { }
++ local net
++ for net in utl.imatch(tostring(self.iwdata.network)) do
++ if _uci_real:get("network", net) == "interface" then
++ nets[#nets+1] = network(net)
++ end
++ end
++ table.sort(nets, function(a, b) return a.sid < b.sid end)
++ return nets
++end
++
++function wifinet.get_interface(self)
++ return interface(self:ifname())
++end
++
++
++-- setup base protocols
++_M:register_protocol("static")
++_M:register_protocol("dhcp")
++_M:register_protocol("none")
++
++-- load protocol extensions
++local exts = nfs.dir(utl.libpath() .. "/model/network")
++if exts then
++ local ext
++ for ext in exts do
++ if ext:match("%.lua$") then
++ require("luci.model.network." .. ext:gsub("%.lua$", ""))
++ end
++ end
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/model/uci.lua b/feeds/luci/modules/luci-base/luasrc/model/uci.lua
+new file mode 100644
+index 0000000..1659137
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/model/uci.lua
+@@ -0,0 +1,233 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local os = require "os"
++local uci = require "uci"
++local util = require "luci.util"
++local table = require "table"
++
++
++local setmetatable, rawget, rawset = setmetatable, rawget, rawset
++local require, getmetatable = require, getmetatable
++local error, pairs, ipairs = error, pairs, ipairs
++local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack
++
++-- The typical workflow for UCI is: Get a cursor instance from the
++-- cursor factory, modify data (via Cursor.add, Cursor.delete, etc.),
++-- save the changes to the staging area via Cursor.save and finally
++-- Cursor.commit the data to the actual config files.
++-- LuCI then needs to Cursor.apply the changes so deamons etc. are
++-- reloaded.
++module "luci.model.uci"
++
++cursor = uci.cursor
++
++APIVERSION = uci.APIVERSION
++
++function cursor_state()
++ return cursor(nil, "/var/state")
++end
++
++
++inst = cursor()
++inst_state = cursor_state()
++
++local Cursor = getmetatable(inst)
++
++function Cursor.apply(self, configlist, command)
++ configlist = self:_affected(configlist)
++ if command then
++ return { "/sbin/luci-reload", unpack(configlist) }
++ else
++ return os.execute("/sbin/luci-reload %s >/dev/null 2>&1"
++ % table.concat(configlist, " "))
++ end
++end
++
++
++-- returns a boolean whether to delete the current section (optional)
++function Cursor.delete_all(self, config, stype, comparator)
++ local del = {}
++
++ if type(comparator) == "table" then
++ local tbl = comparator
++ comparator = function(section)
++ for k, v in pairs(tbl) do
++ if section[k] ~= v then
++ return false
++ end
++ end
++ return true
++ end
++ end
++
++ local function helper (section)
++
++ if not comparator or comparator(section) then
++ del[#del+1] = section[".name"]
++ end
++ end
++
++ self:foreach(config, stype, helper)
++
++ for i, j in ipairs(del) do
++ self:delete(config, j)
++ end
++end
++
++function Cursor.section(self, config, type, name, values)
++ local stat = true
++ if name then
++ stat = self:set(config, name, type)
++ else
++ name = self:add(config, type)
++ stat = name and true
++ end
++
++ if stat and values then
++ stat = self:tset(config, name, values)
++ end
++
++ return stat and name
++end
++
++function Cursor.tset(self, config, section, values)
++ local stat = true
++ for k, v in pairs(values) do
++ if k:sub(1, 1) ~= "." then
++ stat = stat and self:set(config, section, k, v)
++ end
++ end
++ return stat
++end
++
++function Cursor.get_bool(self, ...)
++ local val = self:get(...)
++ return ( val == "1" or val == "true" or val == "yes" or val == "on" )
++end
++
++function Cursor.get_list(self, config, section, option)
++ if config and section and option then
++ local val = self:get(config, section, option)
++ return ( type(val) == "table" and val or { val } )
++ end
++ return nil
++end
++
++function Cursor.get_first(self, conf, stype, opt, def)
++ local rv = def
++
++ self:foreach(conf, stype,
++ function(s)
++ local val = not opt and s['.name'] or s[opt]
++
++ if type(def) == "number" then
++ val = tonumber(val)
++ elseif type(def) == "boolean" then
++ val = (val == "1" or val == "true" or
++ val == "yes" or val == "on")
++ end
++
++ if val ~= nil then
++ rv = val
++ return false
++ end
++ end)
++
++ return rv
++end
++
++function Cursor.set_list(self, config, section, option, value)
++ if config and section and option then
++ return self:set(
++ config, section, option,
++ ( type(value) == "table" and value or { value } )
++ )
++ end
++ return false
++end
++
++-- Return a list of initscripts affected by configuration changes.
++function Cursor._affected(self, configlist)
++ configlist = type(configlist) == "table" and configlist or {configlist}
++
++ local c = cursor()
++ c:load("ucitrack")
++
++ -- Resolve dependencies
++ local reloadlist = {}
++
++ local function _resolve_deps(name)
++ local reload = {name}
++ local deps = {}
++
++ c:foreach("ucitrack", name,
++ function(section)
++ if section.affects then
++ for i, aff in ipairs(section.affects) do
++ deps[#deps+1] = aff
++ end
++ end
++ end)
++
++ for i, dep in ipairs(deps) do
++ for j, add in ipairs(_resolve_deps(dep)) do
++ reload[#reload+1] = add
++ end
++ end
++
++ return reload
++ end
++
++ -- Collect initscripts
++ for j, config in ipairs(configlist) do
++ for i, e in ipairs(_resolve_deps(config)) do
++ if not util.contains(reloadlist, e) then
++ reloadlist[#reloadlist+1] = e
++ end
++ end
++ end
++
++ return reloadlist
++end
++
++-- curser, means it the parent unloads or loads configs, the sub state will
++-- do so as well.
++function Cursor.substate(self)
++ Cursor._substates = Cursor._substates or { }
++ Cursor._substates[self] = Cursor._substates[self] or cursor_state()
++ return Cursor._substates[self]
++end
++
++local _load = Cursor.load
++function Cursor.load(self, ...)
++ if Cursor._substates and Cursor._substates[self] then
++ _load(Cursor._substates[self], ...)
++ end
++ return _load(self, ...)
++end
++
++local _unload = Cursor.unload
++function Cursor.unload(self, ...)
++ if Cursor._substates and Cursor._substates[self] then
++ _unload(Cursor._substates[self], ...)
++ end
++ return _unload(self, ...)
++end
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/model/uci.luadoc b/feeds/luci/modules/luci-base/luasrc/model/uci.luadoc
+new file mode 100644
+index 0000000..80464f7
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/model/uci.luadoc
+@@ -0,0 +1,291 @@
++---[[
++LuCI UCI model library.
++
++The typical workflow for UCI is: Get a cursor instance from the
++cursor factory, modify data (via Cursor.add, Cursor.delete, etc.),
++save the changes to the staging area via Cursor.save and finally
++Cursor.commit the data to the actual config files.
++LuCI then needs to Cursor.apply the changes so deamons etc. are
++reloaded.
++@cstyle instance
++]]
++module "luci.model.uci"
++
++---[[
++Create a new UCI-Cursor.
++
++@class function
++@name cursor
++@return UCI-Cursor
++]]
++
++---[[
++Create a new Cursor initialized to the state directory.
++
++@class function
++@name cursor_state
++@return UCI cursor
++]]
++
++---[[
++Applies UCI configuration changes
++
++@class function
++@name Cursor.apply
++@param configlist List of UCI configurations
++@param command Don't apply only return the command
++]]
++
++---[[
++Delete all sections of a given type that match certain criteria.
++
++@class function
++@name Cursor.delete_all
++@param config UCI config
++@param type UCI section type
++@param comparator Function that will be called for each section and
++returns a boolean whether to delete the current section (optional)
++]]
++
++---[[
++Create a new section and initialize it with data.
++
++@class function
++@name Cursor.section
++@param config UCI config
++@param type UCI section type
++@param name UCI section name (optional)
++@param values Table of key - value pairs to initialize the section with
++@return Name of created section
++]]
++
++---[[
++Updated the data of a section using data from a table.
++
++@class function
++@name Cursor.tset
++@param config UCI config
++@param section UCI section name (optional)
++@param values Table of key - value pairs to update the section with
++]]
++
++---[[
++Get a boolean option and return it's value as true or false.
++
++@class function
++@name Cursor.get_bool
++@param config UCI config
++@param section UCI section name
++@param option UCI option
++@return Boolean
++]]
++
++---[[
++Get an option or list and return values as table.
++
++@class function
++@name Cursor.get_list
++@param config UCI config
++@param section UCI section name
++@param option UCI option
++@return UCI value
++]]
++
++---[[
++Get the given option from the first section with the given type.
++
++@class function
++@name Cursor.get_first
++@param config UCI config
++@param type UCI section type
++@param option UCI option (optional)
++@param default Default value (optional)
++@return UCI value
++]]
++
++---[[
++Set given values as list.
++
++@class function
++@name Cursor.set_list
++@param config UCI config
++@param section UCI section name
++@param option UCI option
++@param value UCI value
++@return Boolean whether operation succeeded
++]]
++
++---[[
++Create a sub-state of this cursor. The sub-state is tied to the parent
++
++curser, means it the parent unloads or loads configs, the sub state will
++do so as well.
++@class function
++@name Cursor.substate
++@return UCI state cursor tied to the parent cursor
++]]
++
++---[[
++Add an anonymous section.
++
++@class function
++@name Cursor.add
++@param config UCI config
++@param type UCI section type
++@return Name of created section
++]]
++
++---[[
++Get a table of saved but uncommitted changes.
++
++@class function
++@name Cursor.changes
++@param config UCI config
++@return Table of changes
++@see Cursor.save
++]]
++
++---[[
++Commit saved changes.
++
++@class function
++@name Cursor.commit
++@param config UCI config
++@return Boolean whether operation succeeded
++@see Cursor.revert
++@see Cursor.save
++]]
++
++---[[
++Deletes a section or an option.
++
++@class function
++@name Cursor.delete
++@param config UCI config
++@param section UCI section name
++@param option UCI option (optional)
++@return Boolean whether operation succeeded
++]]
++
++---[[
++Call a function for every section of a certain type.
++
++@class function
++@name Cursor.foreach
++@param config UCI config
++@param type UCI section type
++@param callback Function to be called
++@return Boolean whether operation succeeded
++]]
++
++---[[
++Get a section type or an option
++
++@class function
++@name Cursor.get
++@param config UCI config
++@param section UCI section name
++@param option UCI option (optional)
++@return UCI value
++]]
++
++---[[
++Get all sections of a config or all values of a section.
++
++@class function
++@name Cursor.get_all
++@param config UCI config
++@param section UCI section name (optional)
++@return Table of UCI sections or table of UCI values
++]]
++
++---[[
++Manually load a config.
++
++@class function
++@name Cursor.load
++@param config UCI config
++@return Boolean whether operation succeeded
++@see Cursor.save
++@see Cursor.unload
++]]
++
++---[[
++Revert saved but uncommitted changes.
++
++@class function
++@name Cursor.revert
++@param config UCI config
++@return Boolean whether operation succeeded
++@see Cursor.commit
++@see Cursor.save
++]]
++
++---[[
++Saves changes made to a config to make them committable.
++
++@class function
++@name Cursor.save
++@param config UCI config
++@return Boolean whether operation succeeded
++@see Cursor.load
++@see Cursor.unload
++]]
++
++---[[
++Set a value or create a named section.
++
++@class function
++@name Cursor.set
++@param config UCI config
++@param section UCI section name
++@param option UCI option or UCI section type
++@param value UCI value or nil if you want to create a section
++@return Boolean whether operation succeeded
++]]
++
++---[[
++Get the configuration directory.
++
++@class function
++@name Cursor.get_confdir
++@return Configuration directory
++]]
++
++---[[
++Get the directory for uncomitted changes.
++
++@class function
++@name Cursor.get_savedir
++@return Save directory
++]]
++
++---[[
++Set the configuration directory.
++
++@class function
++@name Cursor.set_confdir
++@param directory UCI configuration directory
++@return Boolean whether operation succeeded
++]]
++
++---[[
++Set the directory for uncommited changes.
++
++@class function
++@name Cursor.set_savedir
++@param directory UCI changes directory
++@return Boolean whether operation succeeded
++]]
++
++---[[
++Discard changes made to a config.
++
++@class function
++@name Cursor.unload
++@param config UCI config
++@return Boolean whether operation succeeded
++@see Cursor.load
++@see Cursor.save
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/sgi/cgi.lua b/feeds/luci/modules/luci-base/luasrc/sgi/cgi.lua
+new file mode 100644
+index 0000000..68ae17a
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/sgi/cgi.lua
+@@ -0,0 +1,73 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++exectime = os.clock()
++module("luci.sgi.cgi", package.seeall)
++local ltn12 = require("luci.ltn12")
++require("nixio.util")
++require("luci.http")
++require("luci.sys")
++require("luci.dispatcher")
++
++-- Limited source to avoid endless blocking
++local function limitsource(handle, limit)
++ limit = limit or 0
++ local BLOCKSIZE = ltn12.BLOCKSIZE
++
++ return function()
++ if limit < 1 then
++ handle:close()
++ return nil
++ else
++ local read = (limit > BLOCKSIZE) and BLOCKSIZE or limit
++ limit = limit - read
++
++ local chunk = handle:read(read)
++ if not chunk then handle:close() end
++ return chunk
++ end
++ end
++end
++
++function run()
++ local r = luci.http.Request(
++ luci.sys.getenv(),
++ limitsource(io.stdin, tonumber(luci.sys.getenv("CONTENT_LENGTH"))),
++ ltn12.sink.file(io.stderr)
++ )
++
++ local x = coroutine.create(luci.dispatcher.httpdispatch)
++ local hcache = ""
++ local active = true
++
++ while coroutine.status(x) ~= "dead" do
++ local res, id, data1, data2 = coroutine.resume(x, r)
++
++ if not res then
++ print("Status: 500 Internal Server Error")
++ print("Content-Type: text/plain\n")
++ print(id)
++ break;
++ end
++
++ if active then
++ if id == 1 then
++ io.write("Status: " .. tostring(data1) .. " " .. data2 .. "\r\n")
++ elseif id == 2 then
++ hcache = hcache .. data1 .. ": " .. data2 .. "\r\n"
++ elseif id == 3 then
++ io.write(hcache)
++ io.write("\r\n")
++ elseif id == 4 then
++ io.write(tostring(data1 or ""))
++ elseif id == 5 then
++ io.flush()
++ io.close()
++ active = false
++ elseif id == 6 then
++ data1:copyz(nixio.stdout, data2)
++ data1:close()
++ end
++ end
++ end
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/sgi/uhttpd.lua b/feeds/luci/modules/luci-base/luasrc/sgi/uhttpd.lua
+new file mode 100644
+index 0000000..2836bf0
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/sgi/uhttpd.lua
+@@ -0,0 +1,89 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require "nixio.util"
++require "luci.http"
++require "luci.sys"
++require "luci.dispatcher"
++require "luci.ltn12"
++
++function handle_request(env)
++ exectime = os.clock()
++ local renv = {
++ CONTENT_LENGTH = env.CONTENT_LENGTH,
++ CONTENT_TYPE = env.CONTENT_TYPE,
++ REQUEST_METHOD = env.REQUEST_METHOD,
++ REQUEST_URI = env.REQUEST_URI,
++ PATH_INFO = env.PATH_INFO,
++ SCRIPT_NAME = env.SCRIPT_NAME:gsub("/+$", ""),
++ SCRIPT_FILENAME = env.SCRIPT_NAME,
++ SERVER_PROTOCOL = env.SERVER_PROTOCOL,
++ QUERY_STRING = env.QUERY_STRING
++ }
++
++ local k, v
++ for k, v in pairs(env.headers) do
++ k = k:upper():gsub("%-", "_")
++ renv["HTTP_" .. k] = v
++ end
++
++ local len = tonumber(env.CONTENT_LENGTH) or 0
++ local function recv()
++ if len > 0 then
++ local rlen, rbuf = uhttpd.recv(4096)
++ if rlen >= 0 then
++ len = len - rlen
++ return rbuf
++ end
++ end
++ return nil
++ end
++
++ local send = uhttpd.send
++
++ local req = luci.http.Request(
++ renv, recv, luci.ltn12.sink.file(io.stderr)
++ )
++
++
++ local x = coroutine.create(luci.dispatcher.httpdispatch)
++ local hcache = { }
++ local active = true
++
++ while coroutine.status(x) ~= "dead" do
++ local res, id, data1, data2 = coroutine.resume(x, req)
++
++ if not res then
++ send("Status: 500 Internal Server Error\r\n")
++ send("Content-Type: text/plain\r\n\r\n")
++ send(tostring(id))
++ break
++ end
++
++ if active then
++ if id == 1 then
++ send("Status: ")
++ send(tostring(data1))
++ send(" ")
++ send(tostring(data2))
++ send("\r\n")
++ elseif id == 2 then
++ hcache[data1] = data2
++ elseif id == 3 then
++ for k, v in pairs(hcache) do
++ send(tostring(k))
++ send(": ")
++ send(tostring(v))
++ send("\r\n")
++ end
++ send("\r\n")
++ elseif id == 4 then
++ send(tostring(data1 or ""))
++ elseif id == 5 then
++ active = false
++ elseif id == 6 then
++ data1:copyz(nixio.stdout, data2)
++ end
++ end
++ end
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/store.lua b/feeds/luci/modules/luci-base/luasrc/store.lua
+new file mode 100644
+index 0000000..34eb296
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/store.lua
+@@ -0,0 +1,6 @@
++-- Copyright 2009 Steven Barth <steven@midlink.org>
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local util = require "luci.util"
++module("luci.store", util.threadlocal)
+\ No newline at end of file
+diff --git a/feeds/luci/modules/luci-base/luasrc/sys.lua b/feeds/luci/modules/luci-base/luasrc/sys.lua
+new file mode 100644
+index 0000000..77f4d44
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/sys.lua
+@@ -0,0 +1,682 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local io = require "io"
++local os = require "os"
++local table = require "table"
++local nixio = require "nixio"
++local fs = require "nixio.fs"
++local uci = require "luci.model.uci"
++
++local luci = {}
++luci.util = require "luci.util"
++luci.ip = require "luci.ip"
++
++local tonumber, ipairs, pairs, pcall, type, next, setmetatable, require, select =
++ tonumber, ipairs, pairs, pcall, type, next, setmetatable, require, select
++
++
++module "luci.sys"
++
++function call(...)
++ return os.execute(...) / 256
++end
++
++exec = luci.util.exec
++
++function mounts()
++ local data = {}
++ local k = {"fs", "blocks", "used", "available", "percent", "mountpoint"}
++ local ps = luci.util.execi("df")
++
++ if not ps then
++ return
++ else
++ ps()
++ end
++
++ for line in ps do
++ local row = {}
++
++ local j = 1
++ for value in line:gmatch("[^%s]+") do
++ row[k[j]] = value
++ j = j + 1
++ end
++
++ if row[k[1]] then
++
++ -- this is a rather ugly workaround to cope with wrapped lines in
++ -- the df output:
++ --
++ -- /dev/scsi/host0/bus0/target0/lun0/part3
++ -- 114382024 93566472 15005244 86% /mnt/usb
++ --
++
++ if not row[k[2]] then
++ j = 2
++ line = ps()
++ for value in line:gmatch("[^%s]+") do
++ row[k[j]] = value
++ j = j + 1
++ end
++ end
++
++ table.insert(data, row)
++ end
++ end
++
++ return data
++end
++
++-- containing the whole environment is returned otherwise this function returns
++-- the corresponding string value for the given name or nil if no such variable
++-- exists.
++getenv = nixio.getenv
++
++function hostname(newname)
++ if type(newname) == "string" and #newname > 0 then
++ fs.writefile( "/proc/sys/kernel/hostname", newname )
++ return newname
++ else
++ return nixio.uname().nodename
++ end
++end
++
++function httpget(url, stream, target)
++ if not target then
++ local source = stream and io.popen or luci.util.exec
++ return source("wget -qO- '"..url:gsub("'", "").."'")
++ else
++ return os.execute("wget -qO '%s' '%s'" %
++ {target:gsub("'", ""), url:gsub("'", "")})
++ end
++end
++
++function reboot()
++ return os.execute("reboot >/dev/null 2>&1")
++end
++
++function syslog()
++ return luci.util.exec("logread")
++end
++
++function dmesg()
++ return luci.util.exec("dmesg")
++end
++
++function uniqueid(bytes)
++ local rand = fs.readfile("/dev/urandom", bytes)
++ return rand and nixio.bin.hexlify(rand)
++end
++
++function uptime()
++ return nixio.sysinfo().uptime
++end
++
++
++net = {}
++
++-- The following fields are defined for arp entry objects:
++-- { "IP address", "HW address", "HW type", "Flags", "Mask", "Device" }
++function net.arptable(callback)
++ local arp = (not callback) and {} or nil
++ local e, r, v
++ if fs.access("/proc/net/arp") then
++ for e in io.lines("/proc/net/arp") do
++ local r = { }, v
++ for v in e:gmatch("%S+") do
++ r[#r+1] = v
++ end
++
++ if r[1] ~= "IP" then
++ local x = {
++ ["IP address"] = r[1],
++ ["HW type"] = r[2],
++ ["Flags"] = r[3],
++ ["HW address"] = r[4],
++ ["Mask"] = r[5],
++ ["Device"] = r[6]
++ }
++
++ if callback then
++ callback(x)
++ else
++ arp = arp or { }
++ arp[#arp+1] = x
++ end
++ end
++ end
++ end
++ return arp
++end
++
++local function _nethints(what, callback)
++ local _, k, e, mac, ip, name
++ local cur = uci.cursor()
++ local ifn = { }
++ local hosts = { }
++
++ local function _add(i, ...)
++ local k = select(i, ...)
++ if k then
++ if not hosts[k] then hosts[k] = { } end
++ hosts[k][1] = select(1, ...) or hosts[k][1]
++ hosts[k][2] = select(2, ...) or hosts[k][2]
++ hosts[k][3] = select(3, ...) or hosts[k][3]
++ hosts[k][4] = select(4, ...) or hosts[k][4]
++ end
++ end
++
++ if fs.access("/proc/net/arp") then
++ for e in io.lines("/proc/net/arp") do
++ ip, mac = e:match("^([%d%.]+)%s+%S+%s+%S+%s+([a-fA-F0-9:]+)%s+")
++ if ip and mac then
++ _add(what, mac:upper(), ip, nil, nil)
++ end
++ end
++ end
++
++ if fs.access("/etc/ethers") then
++ for e in io.lines("/etc/ethers") do
++ mac, ip = e:match("^([a-f0-9]%S+) (%S+)")
++ if mac and ip then
++ _add(what, mac:upper(), ip, nil, nil)
++ end
++ end
++ end
++
++ if fs.access("/var/dhcp.leases") then
++ for e in io.lines("/var/dhcp.leases") do
++ mac, ip, name = e:match("^%d+ (%S+) (%S+) (%S+)")
++ if mac and ip then
++ _add(what, mac:upper(), ip, nil, name ~= "*" and name)
++ end
++ end
++ end
++
++ cur:foreach("dhcp", "host",
++ function(s)
++ for mac in luci.util.imatch(s.mac) do
++ _add(what, mac:upper(), s.ip, nil, s.name)
++ end
++ end)
++
++ for _, e in ipairs(nixio.getifaddrs()) do
++ if e.name ~= "lo" then
++ ifn[e.name] = ifn[e.name] or { }
++ if e.family == "packet" and e.addr and #e.addr == 17 then
++ ifn[e.name][1] = e.addr:upper()
++ elseif e.family == "inet" then
++ ifn[e.name][2] = e.addr
++ elseif e.family == "inet6" then
++ ifn[e.name][3] = e.addr
++ end
++ end
++ end
++
++ for _, e in pairs(ifn) do
++ if e[what] and (e[2] or e[3]) then
++ _add(what, e[1], e[2], e[3], e[4])
++ end
++ end
++
++ for _, e in luci.util.kspairs(hosts) do
++ callback(e[1], e[2], e[3], e[4])
++ end
++end
++
++-- Each entry contains the values in the following order:
++-- [ "mac", "name" ]
++function net.mac_hints(callback)
++ if callback then
++ _nethints(1, function(mac, v4, v6, name)
++ name = name or nixio.getnameinfo(v4 or v6, nil, 100) or v4
++ if name and name ~= mac then
++ callback(mac, name or nixio.getnameinfo(v4 or v6, nil, 100) or v4)
++ end
++ end)
++ else
++ local rv = { }
++ _nethints(1, function(mac, v4, v6, name)
++ name = name or nixio.getnameinfo(v4 or v6, nil, 100) or v4
++ if name and name ~= mac then
++ rv[#rv+1] = { mac, name or nixio.getnameinfo(v4 or v6, nil, 100) or v4 }
++ end
++ end)
++ return rv
++ end
++end
++
++-- Each entry contains the values in the following order:
++-- [ "ip", "name" ]
++function net.ipv4_hints(callback)
++ if callback then
++ _nethints(2, function(mac, v4, v6, name)
++ name = name or nixio.getnameinfo(v4, nil, 100) or mac
++ if name and name ~= v4 then
++ callback(v4, name)
++ end
++ end)
++ else
++ local rv = { }
++ _nethints(2, function(mac, v4, v6, name)
++ name = name or nixio.getnameinfo(v4, nil, 100) or mac
++ if name and name ~= v4 then
++ rv[#rv+1] = { v4, name }
++ end
++ end)
++ return rv
++ end
++end
++
++-- Each entry contains the values in the following order:
++-- [ "ip", "name" ]
++function net.ipv6_hints(callback)
++ if callback then
++ _nethints(3, function(mac, v4, v6, name)
++ name = name or nixio.getnameinfo(v6, nil, 100) or mac
++ if name and name ~= v6 then
++ callback(v6, name)
++ end
++ end)
++ else
++ local rv = { }
++ _nethints(3, function(mac, v4, v6, name)
++ name = name or nixio.getnameinfo(v6, nil, 100) or mac
++ if name and name ~= v6 then
++ rv[#rv+1] = { v6, name }
++ end
++ end)
++ return rv
++ end
++end
++
++function net.conntrack(callback)
++ local connt = {}
++ if fs.access("/proc/net/nf_conntrack", "r") then
++ for line in io.lines("/proc/net/nf_conntrack") do
++ line = line:match "^(.-( [^ =]+=).-)%2"
++ local entry, flags = _parse_mixed_record(line, " +")
++ if flags[6] ~= "TIME_WAIT" then
++ entry.layer3 = flags[1]
++ entry.layer4 = flags[3]
++ for i=1, #entry do
++ entry[i] = nil
++ end
++
++ if callback then
++ callback(entry)
++ else
++ connt[#connt+1] = entry
++ end
++ end
++ end
++ elseif fs.access("/proc/net/ip_conntrack", "r") then
++ for line in io.lines("/proc/net/ip_conntrack") do
++ line = line:match "^(.-( [^ =]+=).-)%2"
++ local entry, flags = _parse_mixed_record(line, " +")
++ if flags[4] ~= "TIME_WAIT" then
++ entry.layer3 = "ipv4"
++ entry.layer4 = flags[1]
++ for i=1, #entry do
++ entry[i] = nil
++ end
++
++ if callback then
++ callback(entry)
++ else
++ connt[#connt+1] = entry
++ end
++ end
++ end
++ else
++ return nil
++ end
++ return connt
++end
++
++function net.devices()
++ local devs = {}
++ for k, v in ipairs(nixio.getifaddrs()) do
++ if v.family == "packet" then
++ devs[#devs+1] = v.name
++ end
++ end
++ return devs
++end
++
++
++function net.deviceinfo()
++ local devs = {}
++ for k, v in ipairs(nixio.getifaddrs()) do
++ if v.family == "packet" then
++ local d = v.data
++ d[1] = d.rx_bytes
++ d[2] = d.rx_packets
++ d[3] = d.rx_errors
++ d[4] = d.rx_dropped
++ d[5] = 0
++ d[6] = 0
++ d[7] = 0
++ d[8] = d.multicast
++ d[9] = d.tx_bytes
++ d[10] = d.tx_packets
++ d[11] = d.tx_errors
++ d[12] = d.tx_dropped
++ d[13] = 0
++ d[14] = d.collisions
++ d[15] = 0
++ d[16] = 0
++ devs[v.name] = d
++ end
++ end
++ return devs
++end
++
++
++-- The following fields are defined for route entry tables:
++-- { "dest", "gateway", "metric", "refcount", "usecount", "irtt",
++-- "flags", "device" }
++function net.routes(callback)
++ local routes = { }
++
++ for line in io.lines("/proc/net/route") do
++
++ local dev, dst_ip, gateway, flags, refcnt, usecnt, metric,
++ dst_mask, mtu, win, irtt = line:match(
++ "([^%s]+)\t([A-F0-9]+)\t([A-F0-9]+)\t([A-F0-9]+)\t" ..
++ "(%d+)\t(%d+)\t(%d+)\t([A-F0-9]+)\t(%d+)\t(%d+)\t(%d+)"
++ )
++
++ if dev then
++ gateway = luci.ip.Hex( gateway, 32, luci.ip.FAMILY_INET4 )
++ dst_mask = luci.ip.Hex( dst_mask, 32, luci.ip.FAMILY_INET4 )
++ dst_ip = luci.ip.Hex(
++ dst_ip, dst_mask:prefix(dst_mask), luci.ip.FAMILY_INET4
++ )
++
++ local rt = {
++ dest = dst_ip,
++ gateway = gateway,
++ metric = tonumber(metric),
++ refcount = tonumber(refcnt),
++ usecount = tonumber(usecnt),
++ mtu = tonumber(mtu),
++ window = tonumber(window),
++ irtt = tonumber(irtt),
++ flags = tonumber(flags, 16),
++ device = dev
++ }
++
++ if callback then
++ callback(rt)
++ else
++ routes[#routes+1] = rt
++ end
++ end
++ end
++
++ return routes
++end
++
++-- The following fields are defined for route entry tables:
++-- { "source", "dest", "nexthop", "metric", "refcount", "usecount",
++-- "flags", "device" }
++function net.routes6(callback)
++ if fs.access("/proc/net/ipv6_route", "r") then
++ local routes = { }
++
++ for line in io.lines("/proc/net/ipv6_route") do
++
++ local dst_ip, dst_prefix, src_ip, src_prefix, nexthop,
++ metric, refcnt, usecnt, flags, dev = line:match(
++ "([a-f0-9]+) ([a-f0-9]+) " ..
++ "([a-f0-9]+) ([a-f0-9]+) " ..
++ "([a-f0-9]+) ([a-f0-9]+) " ..
++ "([a-f0-9]+) ([a-f0-9]+) " ..
++ "([a-f0-9]+) +([^%s]+)"
++ )
++
++ if dst_ip and dst_prefix and
++ src_ip and src_prefix and
++ nexthop and metric and
++ refcnt and usecnt and
++ flags and dev
++ then
++ src_ip = luci.ip.Hex(
++ src_ip, tonumber(src_prefix, 16), luci.ip.FAMILY_INET6, false
++ )
++
++ dst_ip = luci.ip.Hex(
++ dst_ip, tonumber(dst_prefix, 16), luci.ip.FAMILY_INET6, false
++ )
++
++ nexthop = luci.ip.Hex( nexthop, 128, luci.ip.FAMILY_INET6, false )
++
++ local rt = {
++ source = src_ip,
++ dest = dst_ip,
++ nexthop = nexthop,
++ metric = tonumber(metric, 16),
++ refcount = tonumber(refcnt, 16),
++ usecount = tonumber(usecnt, 16),
++ flags = tonumber(flags, 16),
++ device = dev,
++
++ -- lua number is too small for storing the metric
++ -- add a metric_raw field with the original content
++ metric_raw = metric
++ }
++
++ if callback then
++ callback(rt)
++ else
++ routes[#routes+1] = rt
++ end
++ end
++ end
++
++ return routes
++ end
++end
++
++function net.pingtest(host)
++ return os.execute("ping -c1 '"..host:gsub("'", '').."' >/dev/null 2>&1")
++end
++
++
++process = {}
++
++function process.info(key)
++ local s = {uid = nixio.getuid(), gid = nixio.getgid()}
++ return not key and s or s[key]
++end
++
++function process.list()
++ local data = {}
++ local k
++ local ps = luci.util.execi("/bin/busybox top -bn1")
++
++ if not ps then
++ return
++ end
++
++ for line in ps do
++ local pid, ppid, user, stat, vsz, mem, cpu, cmd = line:match(
++ "^ *(%d+) +(%d+) +(%S.-%S) +([RSDZTW][W ][<N ]) +(%d+) +(%d+%%) +(%d+%%) +(.+)"
++ )
++
++ local idx = tonumber(pid)
++ if idx then
++ data[idx] = {
++ ['PID'] = pid,
++ ['PPID'] = ppid,
++ ['USER'] = user,
++ ['STAT'] = stat,
++ ['VSZ'] = vsz,
++ ['%MEM'] = mem,
++ ['%CPU'] = cpu,
++ ['COMMAND'] = cmd
++ }
++ end
++ end
++
++ return data
++end
++
++function process.setgroup(gid)
++ return nixio.setgid(gid)
++end
++
++function process.setuser(uid)
++ return nixio.setuid(uid)
++end
++
++process.signal = nixio.kill
++
++
++user = {}
++
++-- { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" }
++user.getuser = nixio.getpw
++
++function user.getpasswd(username)
++ local pwe = nixio.getsp and nixio.getsp(username) or nixio.getpw(username)
++ local pwh = pwe and (pwe.pwdp or pwe.passwd)
++ if not pwh or #pwh < 1 or pwh == "!" or pwh == "x" then
++ return nil, pwe
++ else
++ return pwh, pwe
++ end
++end
++
++function user.checkpasswd(username, pass)
++ local pwh, pwe = user.getpasswd(username)
++ if pwe then
++ return (pwh == nil or nixio.crypt(pass, pwh) == pwh)
++ end
++ return false
++end
++
++function user.setpasswd(username, password)
++ if password then
++ password = password:gsub("'", [['"'"']])
++ end
++
++ if username then
++ username = username:gsub("'", [['"'"']])
++ end
++
++ return os.execute(
++ "(echo '" .. password .. "'; sleep 1; echo '" .. password .. "') | " ..
++ "passwd '" .. username .. "' >/dev/null 2>&1"
++ )
++end
++
++
++wifi = {}
++
++function wifi.getiwinfo(ifname)
++ local stat, iwinfo = pcall(require, "iwinfo")
++
++ if ifname then
++ local d, n = ifname:match("^(%w+)%.network(%d+)")
++ local wstate = luci.util.ubus("network.wireless", "status") or { }
++
++ d = d or ifname
++ n = n and tonumber(n) or 1
++
++ if type(wstate[d]) == "table" and
++ type(wstate[d].interfaces) == "table" and
++ type(wstate[d].interfaces[n]) == "table" and
++ type(wstate[d].interfaces[n].ifname) == "string"
++ then
++ ifname = wstate[d].interfaces[n].ifname
++ else
++ ifname = d
++ end
++
++ local t = stat and iwinfo.type(ifname)
++ local x = t and iwinfo[t] or { }
++ return setmetatable({}, {
++ __index = function(t, k)
++ if k == "ifname" then
++ return ifname
++ elseif x[k] then
++ return x[k](ifname)
++ end
++ end
++ })
++ end
++end
++
++
++init = {}
++init.dir = "/etc/init.d/"
++
++function init.names()
++ local names = { }
++ for name in fs.glob(init.dir.."*") do
++ names[#names+1] = fs.basename(name)
++ end
++ return names
++end
++
++function init.index(name)
++ if fs.access(init.dir..name) then
++ return call("env -i sh -c 'source %s%s enabled; exit ${START:-255}' >/dev/null"
++ %{ init.dir, name })
++ end
++end
++
++local function init_action(action, name)
++ if fs.access(init.dir..name) then
++ return call("env -i %s%s %s >/dev/null" %{ init.dir, name, action })
++ end
++end
++
++function init.enabled(name)
++ return (init_action("enabled", name) == 0)
++end
++
++function init.enable(name)
++ return (init_action("enable", name) == 1)
++end
++
++function init.disable(name)
++ return (init_action("disable", name) == 0)
++end
++
++function init.start(name)
++ return (init_action("start", name) == 0)
++end
++
++function init.stop(name)
++ return (init_action("stop", name) == 0)
++end
++
++
++-- Internal functions
++
++function _parse_mixed_record(cnt, delimiter)
++ delimiter = delimiter or " "
++ local data = {}
++ local flags = {}
++
++ for i, l in pairs(luci.util.split(luci.util.trim(cnt), "\n")) do
++ for j, f in pairs(luci.util.split(luci.util.trim(l), delimiter, nil, true)) do
++ local k, x, v = f:match('([^%s][^:=]*) *([:=]*) *"*([^\n"]*)"*')
++
++ if k then
++ if x == "" then
++ table.insert(flags, k)
++ else
++ data[k] = v
++ end
++ end
++ end
++ end
++
++ return data, flags
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/sys.luadoc b/feeds/luci/modules/luci-base/luasrc/sys.luadoc
+new file mode 100644
+index 0000000..54be349
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/sys.luadoc
+@@ -0,0 +1,395 @@
++---[[
++LuCI Linux and POSIX system utilities.
++]]
++module "luci.sys"
++
++---[[
++Execute a given shell command and return the error code
++
++@class function
++@name call
++@param ... Command to call
++@return Error code of the command
++]]
++
++---[[
++Execute a given shell command and capture its standard output
++
++@class function
++@name exec
++@param command Command to call
++@return String containg the return the output of the command
++]]
++
++---[[
++Retrieve information about currently mounted file systems.
++
++@class function
++@name mounts
++@return Table containing mount information
++]]
++
++---[[
++Retrieve environment variables. If no variable is given then a table
++
++containing the whole environment is returned otherwise this function returns
++the corresponding string value for the given name or nil if no such variable
++exists.
++@class function
++@name getenv
++@param var Name of the environment variable to retrieve (optional)
++@return String containg the value of the specified variable
++@return Table containing all variables if no variable name is given
++]]
++
++---[[
++Get or set the current hostname.
++
++@class function
++@name hostname
++@param String containing a new hostname to set (optional)
++@return String containing the system hostname
++]]
++
++---[[
++Returns the contents of a documented referred by an URL.
++
++@class function
++@name httpget
++@param url The URL to retrieve
++@param stream Return a stream instead of a buffer
++@param target Directly write to target file name
++@return String containing the contents of given the URL
++]]
++
++---[[
++Initiate a system reboot.
++
++@class function
++@name reboot
++@return Return value of os.execute()
++]]
++
++---[[
++Retrieves the output of the "logread" command.
++
++@class function
++@name syslog
++@return String containing the current log buffer
++]]
++
++---[[
++Retrieves the output of the "dmesg" command.
++
++@class function
++@name dmesg
++@return String containing the current log buffer
++]]
++
++---[[
++Generates a random id with specified length.
++
++@class function
++@name uniqueid
++@param bytes Number of bytes for the unique id
++@return String containing hex encoded id
++]]
++
++---[[
++Returns the current system uptime stats.
++
++@class function
++@name uptime
++@return String containing total uptime in seconds
++]]
++
++---[[
++LuCI system utilities / network related functions.
++
++@class module
++@name luci.sys.net
++]]
++
++---[[
++Returns the current arp-table entries as two-dimensional table.
++
++@class function
++@name net.arptable
++@return Table of table containing the current arp entries.
++-- The following fields are defined for arp entry objects:
++-- { "IP address", "HW address", "HW type", "Flags", "Mask", "Device" }
++]]
++
++---[[
++Returns a two-dimensional table of mac address hints.
++
++@class function
++@name net.mac_hints
++@return Table of table containing known hosts from various sources.
++ Each entry contains the values in the following order:
++ [ "mac", "name" ]
++]]
++
++---[[
++Returns a two-dimensional table of IPv4 address hints.
++
++@class function
++@name net.ipv4_hints
++@return Table of table containing known hosts from various sources.
++ Each entry contains the values in the following order:
++ [ "ip", "name" ]
++]]
++
++---[[
++Returns a two-dimensional table of IPv6 address hints.
++
++@class function
++@name net.ipv6_hints
++@return Table of table containing known hosts from various sources.
++ Each entry contains the values in the following order:
++ [ "ip", "name" ]
++]]
++
++---[[
++Returns conntrack information
++
++@class function
++@name net.conntrack
++@return Table with the currently tracked IP connections
++]]
++
++---[[
++Determine the names of available network interfaces.
++
++@class function
++@name net.devices
++@return Table containing all current interface names
++]]
++
++---[[
++Return information about available network interfaces.
++
++@class function
++@name net.deviceinfo
++@return Table containing all current interface names and their information
++]]
++
++---[[
++Returns the current kernel routing table entries.
++
++@class function
++@name net.routes
++@return Table of tables with properties of the corresponding routes.
++-- The following fields are defined for route entry tables:
++-- { "dest", "gateway", "metric", "refcount", "usecount", "irtt",
++-- "flags", "device" }
++]]
++
++---[[
++Returns the current ipv6 kernel routing table entries.
++
++@class function
++@name net.routes6
++@return Table of tables with properties of the corresponding routes.
++-- The following fields are defined for route entry tables:
++-- { "source", "dest", "nexthop", "metric", "refcount", "usecount",
++-- "flags", "device" }
++]]
++
++---[[
++Tests whether the given host responds to ping probes.
++
++@class function
++@name net.pingtest
++@param host String containing a hostname or IPv4 address
++@return Number containing 0 on success and >= 1 on error
++]]
++
++---[[
++LuCI system utilities / process related functions.
++
++@class module
++@name luci.sys.process
++]]
++
++---[[
++Get the current process id.
++
++@class function
++@name process.info
++@return Number containing the current pid
++]]
++
++---[[
++Retrieve information about currently running processes.
++
++@class function
++@name process.list
++@return Table containing process information
++]]
++
++---[[
++Set the gid of a process identified by given pid.
++
++@class function
++@name process.setgroup
++@param gid Number containing the Unix group id
++@return Boolean indicating successful operation
++@return String containing the error message if failed
++@return Number containing the error code if failed
++]]
++
++---[[
++Set the uid of a process identified by given pid.
++
++@class function
++@name process.setuser
++@param uid Number containing the Unix user id
++@return Boolean indicating successful operation
++@return String containing the error message if failed
++@return Number containing the error code if failed
++]]
++
++---[[
++Send a signal to a process identified by given pid.
++
++@class function
++@name process.signal
++@param pid Number containing the process id
++@param sig Signal to send (default: 15 [SIGTERM])
++@return Boolean indicating successful operation
++@return Number containing the error code if failed
++]]
++
++---[[
++LuCI system utilities / user related functions.
++
++@class module
++@name luci.sys.user
++]]
++
++---[[
++Retrieve user informations for given uid.
++
++@class function
++@name getuser
++@param uid Number containing the Unix user id
++@return Table containing the following fields:
++-- { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" }
++]]
++
++---[[
++Retrieve the current user password hash.
++
++@class function
++@name user.getpasswd
++@param username String containing the username to retrieve the password for
++@return String containing the hash or nil if no password is set.
++@return Password database entry
++]]
++
++---[[
++Test whether given string matches the password of a given system user.
++
++@class function
++@name user.checkpasswd
++@param username String containing the Unix user name
++@param pass String containing the password to compare
++@return Boolean indicating wheather the passwords are equal
++]]
++
++---[[
++Change the password of given user.
++
++@class function
++@name user.setpasswd
++@param username String containing the Unix user name
++@param password String containing the password to compare
++@return Number containing 0 on success and >= 1 on error
++]]
++
++---[[
++LuCI system utilities / wifi related functions.
++
++@class module
++@name luci.sys.wifi
++]]
++
++---[[
++Get wireless information for given interface.
++
++@class function
++@name wifi.getiwinfo
++@param ifname String containing the interface name
++@return A wrapped iwinfo object instance
++]]
++
++---[[
++LuCI system utilities / init related functions.
++
++@class module
++@name luci.sys.init
++]]
++
++---[[
++Get the names of all installed init scripts
++
++@class function
++@name init.names
++@return Table containing the names of all inistalled init scripts
++]]
++
++---[[
++Get the index of he given init script
++
++@class function
++@name init.index
++@param name Name of the init script
++@return Numeric index value
++]]
++
++---[[
++Test whether the given init script is enabled
++
++@class function
++@name init.enabled
++@param name Name of the init script
++@return Boolean indicating whether init is enabled
++]]
++
++---[[
++Enable the given init script
++
++@class function
++@name init.enable
++@param name Name of the init script
++@return Boolean indicating success
++]]
++
++---[[
++Disable the given init script
++
++@class function
++@name init.disable
++@param name Name of the init script
++@return Boolean indicating success
++]]
++
++---[[
++Start the given init script
++
++@class function
++@name init.start
++@param name Name of the init script
++@return Boolean indicating success
++]]
++
++---[[
++Stop the given init script
++
++@class function
++@name init.stop
++@param name Name of the init script
++@return Boolean indicating success
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/sys/iptparser.lua b/feeds/luci/modules/luci-base/luasrc/sys/iptparser.lua
+new file mode 100644
+index 0000000..2b81e0e
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/sys/iptparser.lua
+@@ -0,0 +1,349 @@
++--[[
++
++Iptables parser and query library
++(c) 2008-2009 Jo-Philipp Wich <jow@openwrt.org>
++(c) 2008-2009 Steven Barth <steven@midlink.org>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++$Id$
++
++]]--
++
++local luci = {}
++luci.util = require "luci.util"
++luci.sys = require "luci.sys"
++luci.ip = require "luci.ip"
++
++local tonumber, ipairs, table = tonumber, ipairs, table
++
++module("luci.sys.iptparser")
++
++IptParser = luci.util.class()
++
++function IptParser.__init__( self, family )
++ self._family = (tonumber(family) == 6) and 6 or 4
++ self._rules = { }
++ self._chains = { }
++
++ if self._family == 4 then
++ self._nulladdr = "0.0.0.0/0"
++ self._tables = { "filter", "nat", "mangle", "raw" }
++ self._command = "iptables -t %s --line-numbers -nxvL"
++ else
++ self._nulladdr = "::/0"
++ self._tables = { "filter", "mangle", "raw" }
++ self._command = "ip6tables -t %s --line-numbers -nxvL"
++ end
++
++ self:_parse_rules()
++end
++
++-- search criteria as only argument. If args is nil or an empty table then all
++-- rules will be returned.
++--
++-- The following keys in the args table are recognized:
++-- <ul>
++-- <li> table - Match rules that are located within the given table
++-- <li> chain - Match rules that are located within the given chain
++-- <li> target - Match rules with the given target
++-- <li> protocol - Match rules that match the given protocol, rules with
++-- protocol "all" are always matched
++-- <li> source - Match rules with the given source, rules with source
++-- "0.0.0.0/0" (::/0) are always matched
++-- <li> destination - Match rules with the given destination, rules with
++-- destination "0.0.0.0/0" (::/0) are always matched
++-- <li> inputif - Match rules with the given input interface, rules
++-- with input interface "*" (=all) are always matched
++-- <li> outputif - Match rules with the given output interface, rules
++-- with output interface "*" (=all) are always matched
++-- <li> flags - Match rules that match the given flags, current
++-- supported values are "-f" (--fragment)
++-- and "!f" (! --fragment)
++-- <li> options - Match rules containing all given options
++-- </ul>
++-- The return value is a list of tables representing the matched rules.
++-- Each rule table contains the following fields:
++-- <ul>
++-- <li> index - The index number of the rule
++-- <li> table - The table where the rule is located, can be one
++-- of "filter", "nat" or "mangle"
++-- <li> chain - The chain where the rule is located, e.g. "INPUT"
++-- or "postrouting_wan"
++-- <li> target - The rule target, e.g. "REJECT" or "DROP"
++-- <li> protocol The matching protocols, e.g. "all" or "tcp"
++-- <li> flags - Special rule options ("--", "-f" or "!f")
++-- <li> inputif - Input interface of the rule, e.g. "eth0.0"
++-- or "*" for all interfaces
++-- <li> outputif - Output interface of the rule,e.g. "eth0.0"
++-- or "*" for all interfaces
++-- <li> source - The source ip range, e.g. "0.0.0.0/0" (::/0)
++-- <li> destination - The destination ip range, e.g. "0.0.0.0/0" (::/0)
++-- <li> options - A list of specific options of the rule,
++-- e.g. { "reject-with", "tcp-reset" }
++-- <li> packets - The number of packets matched by the rule
++-- <li> bytes - The number of total bytes matched by the rule
++-- </ul>
++-- Example:
++-- <pre>
++-- ip = luci.sys.iptparser.IptParser()
++-- result = ip.find( {
++-- target="REJECT",
++-- protocol="tcp",
++-- options={ "reject-with", "tcp-reset" }
++-- } )
++-- </pre>
++-- This will match all rules with target "-j REJECT",
++-- protocol "-p tcp" (or "-p all")
++-- and the option "--reject-with tcp-reset".
++function IptParser.find( self, args )
++
++ local args = args or { }
++ local rv = { }
++
++ args.source = args.source and self:_parse_addr(args.source)
++ args.destination = args.destination and self:_parse_addr(args.destination)
++
++ for i, rule in ipairs(self._rules) do
++ local match = true
++
++ -- match table
++ if not ( not args.table or args.table:lower() == rule.table ) then
++ match = false
++ end
++
++ -- match chain
++ if not ( match == true and (
++ not args.chain or args.chain == rule.chain
++ ) ) then
++ match = false
++ end
++
++ -- match target
++ if not ( match == true and (
++ not args.target or args.target == rule.target
++ ) ) then
++ match = false
++ end
++
++ -- match protocol
++ if not ( match == true and (
++ not args.protocol or rule.protocol == "all" or
++ args.protocol:lower() == rule.protocol
++ ) ) then
++ match = false
++ end
++
++ -- match source
++ if not ( match == true and (
++ not args.source or rule.source == self._nulladdr or
++ self:_parse_addr(rule.source):contains(args.source)
++ ) ) then
++ match = false
++ end
++
++ -- match destination
++ if not ( match == true and (
++ not args.destination or rule.destination == self._nulladdr or
++ self:_parse_addr(rule.destination):contains(args.destination)
++ ) ) then
++ match = false
++ end
++
++ -- match input interface
++ if not ( match == true and (
++ not args.inputif or rule.inputif == "*" or
++ args.inputif == rule.inputif
++ ) ) then
++ match = false
++ end
++
++ -- match output interface
++ if not ( match == true and (
++ not args.outputif or rule.outputif == "*" or
++ args.outputif == rule.outputif
++ ) ) then
++ match = false
++ end
++
++ -- match flags (the "opt" column)
++ if not ( match == true and (
++ not args.flags or rule.flags == args.flags
++ ) ) then
++ match = false
++ end
++
++ -- match specific options
++ if not ( match == true and (
++ not args.options or
++ self:_match_options( rule.options, args.options )
++ ) ) then
++ match = false
++ end
++
++ -- insert match
++ if match == true then
++ rv[#rv+1] = rule
++ end
++ end
++
++ return rv
++end
++
++
++-- through external commands.
++function IptParser.resync( self )
++ self._rules = { }
++ self._chain = nil
++ self:_parse_rules()
++end
++
++
++function IptParser.tables( self )
++ return self._tables
++end
++
++
++function IptParser.chains( self, table )
++ local lookup = { }
++ local chains = { }
++ for _, r in ipairs(self:find({table=table})) do
++ if not lookup[r.chain] then
++ lookup[r.chain] = true
++ chains[#chains+1] = r.chain
++ end
++ end
++ return chains
++end
++
++
++-- and "rules". The "rules" field is a table of rule tables.
++function IptParser.chain( self, table, chain )
++ return self._chains[table:lower()] and self._chains[table:lower()][chain]
++end
++
++
++function IptParser.is_custom_target( self, target )
++ for _, r in ipairs(self._rules) do
++ if r.chain == target then
++ return true
++ end
++ end
++ return false
++end
++
++
++-- [internal] Parse address according to family.
++function IptParser._parse_addr( self, addr )
++ if self._family == 4 then
++ return luci.ip.IPv4(addr)
++ else
++ return luci.ip.IPv6(addr)
++ end
++end
++
++-- [internal] Parse iptables output from all tables.
++function IptParser._parse_rules( self )
++
++ for i, tbl in ipairs(self._tables) do
++
++ self._chains[tbl] = { }
++
++ for i, rule in ipairs(luci.util.execl(self._command % tbl)) do
++
++ if rule:find( "^Chain " ) == 1 then
++
++ local crefs
++ local cname, cpol, cpkt, cbytes = rule:match(
++ "^Chain ([^%s]*) %(policy (%w+) " ..
++ "(%d+) packets, (%d+) bytes%)"
++ )
++
++ if not cname then
++ cname, crefs = rule:match(
++ "^Chain ([^%s]*) %((%d+) references%)"
++ )
++ end
++
++ self._chain = cname
++ self._chains[tbl][cname] = {
++ policy = cpol,
++ packets = tonumber(cpkt or 0),
++ bytes = tonumber(cbytes or 0),
++ references = tonumber(crefs or 0),
++ rules = { }
++ }
++
++ else
++ if rule:find("%d") == 1 then
++
++ local rule_parts = luci.util.split( rule, "%s+", nil, true )
++ local rule_details = { }
++
++ -- cope with rules that have no target assigned
++ if rule:match("^%d+%s+%d+%s+%d+%s%s") then
++ table.insert(rule_parts, 4, nil)
++ end
++
++ -- ip6tables opt column is usually zero-width
++ if self._family == 6 then
++ table.insert(rule_parts, 6, "--")
++ end
++
++ rule_details["table"] = tbl
++ rule_details["chain"] = self._chain
++ rule_details["index"] = tonumber(rule_parts[1])
++ rule_details["packets"] = tonumber(rule_parts[2])
++ rule_details["bytes"] = tonumber(rule_parts[3])
++ rule_details["target"] = rule_parts[4]
++ rule_details["protocol"] = rule_parts[5]
++ rule_details["flags"] = rule_parts[6]
++ rule_details["inputif"] = rule_parts[7]
++ rule_details["outputif"] = rule_parts[8]
++ rule_details["source"] = rule_parts[9]
++ rule_details["destination"] = rule_parts[10]
++ rule_details["options"] = { }
++
++ for i = 11, #rule_parts do
++ if #rule_parts[i] > 0 then
++ rule_details["options"][i-10] = rule_parts[i]
++ end
++ end
++
++ self._rules[#self._rules+1] = rule_details
++
++ self._chains[tbl][self._chain].rules[
++ #self._chains[tbl][self._chain].rules + 1
++ ] = rule_details
++ end
++ end
++ end
++ end
++
++ self._chain = nil
++end
++
++
++-- [internal] Return true if optlist1 contains all elements of optlist 2.
++-- Return false in all other cases.
++function IptParser._match_options( self, o1, o2 )
++
++ -- construct a hashtable of first options list to speed up lookups
++ local oh = { }
++ for i, opt in ipairs( o1 ) do oh[opt] = true end
++
++ -- iterate over second options list
++ -- each string in o2 must be also present in o1
++ -- if o2 contains a string which is not found in o1 then return false
++ for i, opt in ipairs( o2 ) do
++ if not oh[opt] then
++ return false
++ end
++ end
++
++ return true
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/sys/iptparser.luadoc b/feeds/luci/modules/luci-base/luasrc/sys/iptparser.luadoc
+new file mode 100644
+index 0000000..071e7d5
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/sys/iptparser.luadoc
+@@ -0,0 +1,69 @@
++---[[
++LuCI iptables parser and query library
++
++@cstyle instance
++]]
++module "luci.sys.iptparser"
++
++---[[
++Create a new iptables parser object.
++
++@class function
++@name IptParser
++@param family Number specifying the address family. 4 for IPv4, 6 for IPv6
++@return IptParser instance
++]]
++
++---[[
++Find all firewall rules that match the given criteria. Expects a table with
++
++search criteria as only argument. If args is nil or an empty table then all
++rules will be returned.
++]]
++
++---[[
++Rebuild the internal lookup table, for example when rules have changed
++
++through external commands.
++@class function
++@name IptParser.resync
++@return nothing
++]]
++
++---[[
++Find the names of all tables.
++
++@class function
++@name IptParser.tables
++@return Table of table names.
++]]
++
++---[[
++Find the names of all chains within the given table name.
++
++@class function
++@name IptParser.chains
++@param table String containing the table name
++@return Table of chain names in the order they occur.
++]]
++
++---[[
++Return the given firewall chain within the given table name.
++
++@class function
++@name IptParser.chain
++@param table String containing the table name
++@param chain String containing the chain name
++@return Table containing the fields "policy", "packets", "bytes"
++-- and "rules". The "rules" field is a table of rule tables.
++]]
++
++---[[
++Test whether the given target points to a custom chain.
++
++@class function
++@name IptParser.is_custom_target
++@param target String containing the target action
++@return Boolean indicating whether target is a custom chain.
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo.lua b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo.lua
+new file mode 100644
+index 0000000..aa054a2
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo.lua
+@@ -0,0 +1,19 @@
++-- Licensed to the public under the Apache License 2.0.
++
++local setmetatable, require, rawget, rawset = setmetatable, require, rawget, rawset
++
++module "luci.sys.zoneinfo"
++
++setmetatable(_M, {
++ __index = function(t, k)
++ if k == "TZ" and not rawget(t, k) then
++ local m = require "luci.sys.zoneinfo.tzdata"
++ rawset(t, k, rawget(m, k))
++ elseif k == "OFFSET" and not rawget(t, k) then
++ local m = require "luci.sys.zoneinfo.tzoffset"
++ rawset(t, k, rawget(m, k))
++ end
++
++ return rawget(t, k)
++ end
++})
+diff --git a/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua
+new file mode 100644
+index 0000000..ff13b1c
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua
+@@ -0,0 +1,422 @@
++-- Licensed to the public under the Apache License 2.0.
++
++module "luci.sys.zoneinfo.tzdata"
++
++TZ = {
++ { 'Africa/Abidjan', 'GMT0' },
++ { 'Africa/Accra', 'GMT0' },
++ { 'Africa/Addis Ababa', 'EAT-3' },
++ { 'Africa/Algiers', 'CET-1' },
++ { 'Africa/Asmara', 'EAT-3' },
++ { 'Africa/Bamako', 'GMT0' },
++ { 'Africa/Bangui', 'WAT-1' },
++ { 'Africa/Banjul', 'GMT0' },
++ { 'Africa/Bissau', 'GMT0' },
++ { 'Africa/Blantyre', 'CAT-2' },
++ { 'Africa/Brazzaville', 'WAT-1' },
++ { 'Africa/Bujumbura', 'CAT-2' },
++ { 'Africa/Cairo', 'EET-2' },
++ { 'Africa/Casablanca', 'WET0WEST,M3.5.0,M10.5.0/3' },
++ { 'Africa/Ceuta', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Africa/Conakry', 'GMT0' },
++ { 'Africa/Dakar', 'GMT0' },
++ { 'Africa/Dar es Salaam', 'EAT-3' },
++ { 'Africa/Djibouti', 'EAT-3' },
++ { 'Africa/Douala', 'WAT-1' },
++ { 'Africa/El Aaiun', 'WET0WEST,M3.5.0,M10.5.0/3' },
++ { 'Africa/Freetown', 'GMT0' },
++ { 'Africa/Gaborone', 'CAT-2' },
++ { 'Africa/Harare', 'CAT-2' },
++ { 'Africa/Johannesburg', 'SAST-2' },
++ { 'Africa/Juba', 'EAT-3' },
++ { 'Africa/Kampala', 'EAT-3' },
++ { 'Africa/Khartoum', 'EAT-3' },
++ { 'Africa/Kigali', 'CAT-2' },
++ { 'Africa/Kinshasa', 'WAT-1' },
++ { 'Africa/Lagos', 'WAT-1' },
++ { 'Africa/Libreville', 'WAT-1' },
++ { 'Africa/Lome', 'GMT0' },
++ { 'Africa/Luanda', 'WAT-1' },
++ { 'Africa/Lubumbashi', 'CAT-2' },
++ { 'Africa/Lusaka', 'CAT-2' },
++ { 'Africa/Malabo', 'WAT-1' },
++ { 'Africa/Maputo', 'CAT-2' },
++ { 'Africa/Maseru', 'SAST-2' },
++ { 'Africa/Mbabane', 'SAST-2' },
++ { 'Africa/Mogadishu', 'EAT-3' },
++ { 'Africa/Monrovia', 'GMT0' },
++ { 'Africa/Nairobi', 'EAT-3' },
++ { 'Africa/Ndjamena', 'WAT-1' },
++ { 'Africa/Niamey', 'WAT-1' },
++ { 'Africa/Nouakchott', 'GMT0' },
++ { 'Africa/Ouagadougou', 'GMT0' },
++ { 'Africa/Porto-Novo', 'WAT-1' },
++ { 'Africa/Sao Tome', 'GMT0' },
++ { 'Africa/Tripoli', 'EET-2' },
++ { 'Africa/Tunis', 'CET-1' },
++ { 'Africa/Windhoek', 'WAT-1WAST,M9.1.0,M4.1.0' },
++ { 'America/Adak', 'HST10HDT,M3.2.0,M11.1.0' },
++ { 'America/Anchorage', 'AKST9AKDT,M3.2.0,M11.1.0' },
++ { 'America/Anguilla', 'AST4' },
++ { 'America/Antigua', 'AST4' },
++ { 'America/Araguaina', 'BRT3' },
++ { 'America/Argentina/Buenos Aires', 'ART3' },
++ { 'America/Argentina/Catamarca', 'ART3' },
++ { 'America/Argentina/Cordoba', 'ART3' },
++ { 'America/Argentina/Jujuy', 'ART3' },
++ { 'America/Argentina/La Rioja', 'ART3' },
++ { 'America/Argentina/Mendoza', 'ART3' },
++ { 'America/Argentina/Rio Gallegos', 'ART3' },
++ { 'America/Argentina/Salta', 'ART3' },
++ { 'America/Argentina/San Juan', 'ART3' },
++ { 'America/Argentina/San Luis', 'ART3' },
++ { 'America/Argentina/Tucuman', 'ART3' },
++ { 'America/Argentina/Ushuaia', 'ART3' },
++ { 'America/Aruba', 'AST4' },
++ { 'America/Asuncion', 'PYT4PYST,M10.1.0/0,M3.4.0/0' },
++ { 'America/Atikokan', 'EST5' },
++ { 'America/Bahia', 'BRT3' },
++ { 'America/Bahia Banderas', 'CST6CDT,M4.1.0,M10.5.0' },
++ { 'America/Barbados', 'AST4' },
++ { 'America/Belem', 'BRT3' },
++ { 'America/Belize', 'CST6' },
++ { 'America/Blanc-Sablon', 'AST4' },
++ { 'America/Boa Vista', 'AMT4' },
++ { 'America/Bogota', 'COT5' },
++ { 'America/Boise', 'MST7MDT,M3.2.0,M11.1.0' },
++ { 'America/Cambridge Bay', 'MST7MDT,M3.2.0,M11.1.0' },
++ { 'America/Campo Grande', 'AMT4AMST,M10.3.0/0,M2.3.0/0' },
++ { 'America/Cancun', 'EST5' },
++ { 'America/Caracas', 'VET4:30' },
++ { 'America/Cayenne', 'GFT3' },
++ { 'America/Cayman', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Chicago', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/Chihuahua', 'MST7MDT,M4.1.0,M10.5.0' },
++ { 'America/Costa Rica', 'CST6' },
++ { 'America/Creston', 'MST7' },
++ { 'America/Cuiaba', 'AMT4AMST,M10.3.0/0,M2.3.0/0' },
++ { 'America/Curacao', 'AST4' },
++ { 'America/Danmarkshavn', 'GMT0' },
++ { 'America/Dawson', 'PST8PDT,M3.2.0,M11.1.0' },
++ { 'America/Dawson Creek', 'MST7' },
++ { 'America/Denver', 'MST7MDT,M3.2.0,M11.1.0' },
++ { 'America/Detroit', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Dominica', 'AST4' },
++ { 'America/Edmonton', 'MST7MDT,M3.2.0,M11.1.0' },
++ { 'America/Eirunepe', 'ACT5' },
++ { 'America/El Salvador', 'CST6' },
++ { 'America/Fort Nelson', 'MST7' },
++ { 'America/Fortaleza', 'BRT3' },
++ { 'America/Glace Bay', 'AST4ADT,M3.2.0,M11.1.0' },
++ { 'America/Godthab', 'WGT3WGST,M3.5.0/-2,M10.5.0/-1' },
++ { 'America/Goose Bay', 'AST4ADT,M3.2.0,M11.1.0' },
++ { 'America/Grand Turk', 'AST4' },
++ { 'America/Grenada', 'AST4' },
++ { 'America/Guadeloupe', 'AST4' },
++ { 'America/Guatemala', 'CST6' },
++ { 'America/Guayaquil', 'ECT5' },
++ { 'America/Guyana', 'GYT4' },
++ { 'America/Halifax', 'AST4ADT,M3.2.0,M11.1.0' },
++ { 'America/Havana', 'CST5CDT,M3.2.0/0,M11.1.0/1' },
++ { 'America/Hermosillo', 'MST7' },
++ { 'America/Indiana/Indianapolis', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Indiana/Knox', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/Indiana/Marengo', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Indiana/Petersburg', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Indiana/Tell City', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/Indiana/Vevay', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Indiana/Vincennes', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Indiana/Winamac', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Inuvik', 'MST7MDT,M3.2.0,M11.1.0' },
++ { 'America/Iqaluit', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Jamaica', 'EST5' },
++ { 'America/Juneau', 'AKST9AKDT,M3.2.0,M11.1.0' },
++ { 'America/Kentucky/Louisville', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Kentucky/Monticello', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Kralendijk', 'AST4' },
++ { 'America/La Paz', 'BOT4' },
++ { 'America/Lima', 'PET5' },
++ { 'America/Los Angeles', 'PST8PDT,M3.2.0,M11.1.0' },
++ { 'America/Lower Princes', 'AST4' },
++ { 'America/Maceio', 'BRT3' },
++ { 'America/Managua', 'CST6' },
++ { 'America/Manaus', 'AMT4' },
++ { 'America/Marigot', 'AST4' },
++ { 'America/Martinique', 'AST4' },
++ { 'America/Matamoros', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/Mazatlan', 'MST7MDT,M4.1.0,M10.5.0' },
++ { 'America/Menominee', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/Merida', 'CST6CDT,M4.1.0,M10.5.0' },
++ { 'America/Metlakatla', 'PST8' },
++ { 'America/Mexico City', 'CST6CDT,M4.1.0,M10.5.0' },
++ { 'America/Miquelon', 'PMST3PMDT,M3.2.0,M11.1.0' },
++ { 'America/Moncton', 'AST4ADT,M3.2.0,M11.1.0' },
++ { 'America/Monterrey', 'CST6CDT,M4.1.0,M10.5.0' },
++ { 'America/Montevideo', 'UYT3' },
++ { 'America/Montserrat', 'AST4' },
++ { 'America/Nassau', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/New York', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Nipigon', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Nome', 'AKST9AKDT,M3.2.0,M11.1.0' },
++ { 'America/Noronha', 'FNT2' },
++ { 'America/North Dakota/Beulah', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/North Dakota/Center', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/North Dakota/New Salem', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/Ojinaga', 'MST7MDT,M3.2.0,M11.1.0' },
++ { 'America/Panama', 'EST5' },
++ { 'America/Pangnirtung', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Paramaribo', 'SRT3' },
++ { 'America/Phoenix', 'MST7' },
++ { 'America/Port of Spain', 'AST4' },
++ { 'America/Port-au-Prince', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Porto Velho', 'AMT4' },
++ { 'America/Puerto Rico', 'AST4' },
++ { 'America/Rainy River', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/Rankin Inlet', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/Recife', 'BRT3' },
++ { 'America/Regina', 'CST6' },
++ { 'America/Resolute', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/Rio Branco', 'ACT5' },
++ { 'America/Santa Isabel', 'PST8PDT,M4.1.0,M10.5.0' },
++ { 'America/Santarem', 'BRT3' },
++ { 'America/Santiago', 'CLT3' },
++ { 'America/Santo Domingo', 'AST4' },
++ { 'America/Sao Paulo', 'BRT3BRST,M10.3.0/0,M2.3.0/0' },
++ { 'America/Scoresbysund', 'EGT1EGST,M3.5.0/0,M10.5.0/1' },
++ { 'America/Sitka', 'AKST9AKDT,M3.2.0,M11.1.0' },
++ { 'America/St Barthelemy', 'AST4' },
++ { 'America/St Johns', 'NST3:30NDT,M3.2.0,M11.1.0' },
++ { 'America/St Kitts', 'AST4' },
++ { 'America/St Lucia', 'AST4' },
++ { 'America/St Thomas', 'AST4' },
++ { 'America/St Vincent', 'AST4' },
++ { 'America/Swift Current', 'CST6' },
++ { 'America/Tegucigalpa', 'CST6' },
++ { 'America/Thule', 'AST4ADT,M3.2.0,M11.1.0' },
++ { 'America/Thunder Bay', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Tijuana', 'PST8PDT,M3.2.0,M11.1.0' },
++ { 'America/Toronto', 'EST5EDT,M3.2.0,M11.1.0' },
++ { 'America/Tortola', 'AST4' },
++ { 'America/Vancouver', 'PST8PDT,M3.2.0,M11.1.0' },
++ { 'America/Whitehorse', 'PST8PDT,M3.2.0,M11.1.0' },
++ { 'America/Winnipeg', 'CST6CDT,M3.2.0,M11.1.0' },
++ { 'America/Yakutat', 'AKST9AKDT,M3.2.0,M11.1.0' },
++ { 'America/Yellowknife', 'MST7MDT,M3.2.0,M11.1.0' },
++ { 'Antarctica/Casey', 'AWST-8' },
++ { 'Antarctica/Davis', 'DAVT-7' },
++ { 'Antarctica/DumontDUrville', 'DDUT-10' },
++ { 'Antarctica/Macquarie', 'MIST-11' },
++ { 'Antarctica/Mawson', 'MAWT-5' },
++ { 'Antarctica/McMurdo', 'NZST-12NZDT,M9.5.0,M4.1.0/3' },
++ { 'Antarctica/Palmer', 'CLT3' },
++ { 'Antarctica/Rothera', 'ROTT3' },
++ { 'Antarctica/Syowa', 'SYOT-3' },
++ { 'Antarctica/Troll', 'UTC0CEST-2,M3.5.0/1,M10.5.0/3' },
++ { 'Antarctica/Vostok', 'VOST-6' },
++ { 'Arctic/Longyearbyen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Asia/Aden', 'AST-3' },
++ { 'Asia/Almaty', 'ALMT-6' },
++ { 'Asia/Amman', 'EET-2EEST,M3.5.4/24,M10.5.5/1' },
++ { 'Asia/Anadyr', 'ANAT-12' },
++ { 'Asia/Aqtau', 'AQTT-5' },
++ { 'Asia/Aqtobe', 'AQTT-5' },
++ { 'Asia/Ashgabat', 'TMT-5' },
++ { 'Asia/Baghdad', 'AST-3' },
++ { 'Asia/Bahrain', 'AST-3' },
++ { 'Asia/Baku', 'AZT-4AZST,M3.5.0/4,M10.5.0/5' },
++ { 'Asia/Bangkok', 'ICT-7' },
++ { 'Asia/Beirut', 'EET-2EEST,M3.5.0/0,M10.5.0/0' },
++ { 'Asia/Bishkek', 'KGT-6' },
++ { 'Asia/Brunei', 'BNT-8' },
++ { 'Asia/Chita', 'IRKT-8' },
++ { 'Asia/Choibalsan', 'CHOT-8CHOST,M3.5.6,M9.5.6/0' },
++ { 'Asia/Colombo', 'IST-5:30' },
++ { 'Asia/Damascus', 'EET-2EEST,M3.5.5/0,M10.5.5/0' },
++ { 'Asia/Dhaka', 'BDT-6' },
++ { 'Asia/Dili', 'TLT-9' },
++ { 'Asia/Dubai', 'GST-4' },
++ { 'Asia/Dushanbe', 'TJT-5' },
++ { 'Asia/Gaza', 'EET-2EEST,M3.5.5/24,M10.3.6/144' },
++ { 'Asia/Hebron', 'EET-2EEST,M3.5.5/24,M10.3.6/144' },
++ { 'Asia/Ho Chi Minh', 'ICT-7' },
++ { 'Asia/Hong Kong', 'HKT-8' },
++ { 'Asia/Hovd', 'HOVT-7HOVST,M3.5.6,M9.5.6/0' },
++ { 'Asia/Irkutsk', 'IRKT-8' },
++ { 'Asia/Jakarta', 'WIB-7' },
++ { 'Asia/Jayapura', 'WIT-9' },
++ { 'Asia/Jerusalem', 'IST-2IDT,M3.4.4/26,M10.5.0' },
++ { 'Asia/Kabul', 'AFT-4:30' },
++ { 'Asia/Kamchatka', 'PETT-12' },
++ { 'Asia/Karachi', 'PKT-5' },
++ { 'Asia/Kathmandu', 'NPT-5:45' },
++ { 'Asia/Khandyga', 'YAKT-9' },
++ { 'Asia/Kolkata', 'IST-5:30' },
++ { 'Asia/Krasnoyarsk', 'KRAT-7' },
++ { 'Asia/Kuala Lumpur', 'MYT-8' },
++ { 'Asia/Kuching', 'MYT-8' },
++ { 'Asia/Kuwait', 'AST-3' },
++ { 'Asia/Macau', 'CST-8' },
++ { 'Asia/Magadan', 'MAGT-10' },
++ { 'Asia/Makassar', 'WITA-8' },
++ { 'Asia/Manila', 'PHT-8' },
++ { 'Asia/Muscat', 'GST-4' },
++ { 'Asia/Nicosia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Asia/Novokuznetsk', 'KRAT-7' },
++ { 'Asia/Novosibirsk', 'NOVT-6' },
++ { 'Asia/Omsk', 'OMST-6' },
++ { 'Asia/Oral', 'ORAT-5' },
++ { 'Asia/Phnom Penh', 'ICT-7' },
++ { 'Asia/Pontianak', 'WIB-7' },
++ { 'Asia/Pyongyang', 'KST-8:30' },
++ { 'Asia/Qatar', 'AST-3' },
++ { 'Asia/Qyzylorda', 'QYZT-6' },
++ { 'Asia/Rangoon', 'MMT-6:30' },
++ { 'Asia/Riyadh', 'AST-3' },
++ { 'Asia/Sakhalin', 'SAKT-10' },
++ { 'Asia/Samarkand', 'UZT-5' },
++ { 'Asia/Seoul', 'KST-9' },
++ { 'Asia/Shanghai', 'CST-8' },
++ { 'Asia/Singapore', 'SGT-8' },
++ { 'Asia/Srednekolymsk', 'SRET-11' },
++ { 'Asia/Taipei', 'CST-8' },
++ { 'Asia/Tashkent', 'UZT-5' },
++ { 'Asia/Tbilisi', 'GET-4' },
++ { 'Asia/Thimphu', 'BTT-6' },
++ { 'Asia/Tokyo', 'JST-9' },
++ { 'Asia/Ulaanbaatar', 'ULAT-8ULAST,M3.5.6,M9.5.6/0' },
++ { 'Asia/Urumqi', 'XJT-6' },
++ { 'Asia/Ust-Nera', 'VLAT-10' },
++ { 'Asia/Vientiane', 'ICT-7' },
++ { 'Asia/Vladivostok', 'VLAT-10' },
++ { 'Asia/Yakutsk', 'YAKT-9' },
++ { 'Asia/Yekaterinburg', 'YEKT-5' },
++ { 'Asia/Yerevan', 'AMT-4' },
++ { 'Atlantic/Azores', 'AZOT1AZOST,M3.5.0/0,M10.5.0/1' },
++ { 'Atlantic/Bermuda', 'AST4ADT,M3.2.0,M11.1.0' },
++ { 'Atlantic/Canary', 'WET0WEST,M3.5.0/1,M10.5.0' },
++ { 'Atlantic/Cape Verde', 'CVT1' },
++ { 'Atlantic/Faroe', 'WET0WEST,M3.5.0/1,M10.5.0' },
++ { 'Atlantic/Madeira', 'WET0WEST,M3.5.0/1,M10.5.0' },
++ { 'Atlantic/Reykjavik', 'GMT0' },
++ { 'Atlantic/South Georgia', 'GST2' },
++ { 'Atlantic/St Helena', 'GMT0' },
++ { 'Atlantic/Stanley', 'FKST3' },
++ { 'Australia/Adelaide', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' },
++ { 'Australia/Brisbane', 'AEST-10' },
++ { 'Australia/Broken Hill', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' },
++ { 'Australia/Currie', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
++ { 'Australia/Darwin', 'ACST-9:30' },
++ { 'Australia/Eucla', 'ACWST-8:45' },
++ { 'Australia/Hobart', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
++ { 'Australia/Lindeman', 'AEST-10' },
++ { 'Australia/Lord Howe', 'LHST-10:30LHDT-11,M10.1.0,M4.1.0' },
++ { 'Australia/Melbourne', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
++ { 'Australia/Perth', 'AWST-8' },
++ { 'Australia/Sydney', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
++ { 'Europe/Amsterdam', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Andorra', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Athens', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Belgrade', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Berlin', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Bratislava', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Brussels', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Bucharest', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Budapest', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Busingen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Chisinau', 'EET-2EEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Copenhagen', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Dublin', 'GMT0IST,M3.5.0/1,M10.5.0' },
++ { 'Europe/Gibraltar', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Guernsey', 'GMT0BST,M3.5.0/1,M10.5.0' },
++ { 'Europe/Helsinki', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Isle of Man', 'GMT0BST,M3.5.0/1,M10.5.0' },
++ { 'Europe/Istanbul', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Jersey', 'GMT0BST,M3.5.0/1,M10.5.0' },
++ { 'Europe/Kaliningrad', 'EET-2' },
++ { 'Europe/Kiev', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Lisbon', 'WET0WEST,M3.5.0/1,M10.5.0' },
++ { 'Europe/Ljubljana', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/London', 'GMT0BST,M3.5.0/1,M10.5.0' },
++ { 'Europe/Luxembourg', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Madrid', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Malta', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Mariehamn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Minsk', 'MSK-3' },
++ { 'Europe/Monaco', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Moscow', 'MSK-3' },
++ { 'Europe/Oslo', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Paris', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Podgorica', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Prague', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Riga', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Rome', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Samara', 'SAMT-4' },
++ { 'Europe/San Marino', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Sarajevo', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Simferopol', 'MSK-3' },
++ { 'Europe/Skopje', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Sofia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Stockholm', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Tallinn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Tirane', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Uzhgorod', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Vaduz', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Vatican', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Vienna', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Vilnius', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Volgograd', 'MSK-3' },
++ { 'Europe/Warsaw', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Zagreb', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Europe/Zaporozhye', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
++ { 'Europe/Zurich', 'CET-1CEST,M3.5.0,M10.5.0/3' },
++ { 'Indian/Antananarivo', 'EAT-3' },
++ { 'Indian/Chagos', 'IOT-6' },
++ { 'Indian/Christmas', 'CXT-7' },
++ { 'Indian/Cocos', 'CCT-6:30' },
++ { 'Indian/Comoro', 'EAT-3' },
++ { 'Indian/Kerguelen', 'TFT-5' },
++ { 'Indian/Mahe', 'SCT-4' },
++ { 'Indian/Maldives', 'MVT-5' },
++ { 'Indian/Mauritius', 'MUT-4' },
++ { 'Indian/Mayotte', 'EAT-3' },
++ { 'Indian/Reunion', 'RET-4' },
++ { 'Pacific/Apia', 'WSST-13WSDT,M9.5.0/3,M4.1.0/4' },
++ { 'Pacific/Auckland', 'NZST-12NZDT,M9.5.0,M4.1.0/3' },
++ { 'Pacific/Bougainville', 'BST-11' },
++ { 'Pacific/Chatham', 'CHAST-12:45CHADT,M9.5.0/2:45,M4.1.0/3:45' },
++ { 'Pacific/Chuuk', 'CHUT-10' },
++ { 'Pacific/Easter', 'EAST5' },
++ { 'Pacific/Efate', 'VUT-11' },
++ { 'Pacific/Enderbury', 'PHOT-13' },
++ { 'Pacific/Fakaofo', 'TKT-13' },
++ { 'Pacific/Fiji', 'FJT-12FJST,M11.1.0,M1.3.0/3' },
++ { 'Pacific/Funafuti', 'TVT-12' },
++ { 'Pacific/Galapagos', 'GALT6' },
++ { 'Pacific/Gambier', 'GAMT9' },
++ { 'Pacific/Guadalcanal', 'SBT-11' },
++ { 'Pacific/Guam', 'ChST-10' },
++ { 'Pacific/Honolulu', 'HST10' },
++ { 'Pacific/Johnston', 'HST10' },
++ { 'Pacific/Kiritimati', 'LINT-14' },
++ { 'Pacific/Kosrae', 'KOST-11' },
++ { 'Pacific/Kwajalein', 'MHT-12' },
++ { 'Pacific/Majuro', 'MHT-12' },
++ { 'Pacific/Marquesas', 'MART9:30' },
++ { 'Pacific/Midway', 'SST11' },
++ { 'Pacific/Nauru', 'NRT-12' },
++ { 'Pacific/Niue', 'NUT11' },
++ { 'Pacific/Norfolk', 'NFT-11' },
++ { 'Pacific/Noumea', 'NCT-11' },
++ { 'Pacific/Pago Pago', 'SST11' },
++ { 'Pacific/Palau', 'PWT-9' },
++ { 'Pacific/Pitcairn', 'PST8' },
++ { 'Pacific/Pohnpei', 'PONT-11' },
++ { 'Pacific/Port Moresby', 'PGT-10' },
++ { 'Pacific/Rarotonga', 'CKT10' },
++ { 'Pacific/Saipan', 'ChST-10' },
++ { 'Pacific/Tahiti', 'TAHT10' },
++ { 'Pacific/Tarawa', 'GILT-12' },
++ { 'Pacific/Tongatapu', 'TOT-13' },
++ { 'Pacific/Wake', 'WAKT-12' },
++ { 'Pacific/Wallis', 'WFT-12' },
++}
+diff --git a/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua
+new file mode 100644
+index 0000000..53c8adb
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua
+@@ -0,0 +1,166 @@
++-- Licensed to the public under the Apache License 2.0.
++
++module "luci.sys.zoneinfo.tzoffset"
++
++OFFSET = {
++ gmt = 0, -- GMT
++ eat = 10800, -- EAT
++ cet = 3600, -- CET
++ wat = 3600, -- WAT
++ cat = 7200, -- CAT
++ eet = 7200, -- EET
++ wet = 0, -- WET
++ sast = 7200, -- SAST
++ hst = -36000, -- HST
++ hdt = -32400, -- HDT
++ akst = -32400, -- AKST
++ akdt = -28800, -- AKDT
++ ast = -14400, -- AST
++ brt = -10800, -- BRT
++ art = -10800, -- ART
++ pyt = -14400, -- PYT
++ pyst = -10800, -- PYST
++ est = -18000, -- EST
++ cst = -21600, -- CST
++ cdt = -18000, -- CDT
++ amt = -14400, -- AMT
++ cot = -18000, -- COT
++ mst = -25200, -- MST
++ mdt = -21600, -- MDT
++ vet = -16200, -- VET
++ gft = -10800, -- GFT
++ pst = -28800, -- PST
++ pdt = -25200, -- PDT
++ act = -18000, -- ACT
++ wgt = -10800, -- WGT
++ wgst = -7200, -- WGST
++ ect = -18000, -- ECT
++ gyt = -14400, -- GYT
++ bot = -14400, -- BOT
++ pet = -18000, -- PET
++ pmst = -10800, -- PMST
++ pmdt = -7200, -- PMDT
++ uyt = -10800, -- UYT
++ fnt = -7200, -- FNT
++ srt = -10800, -- SRT
++ clt = -10800, -- CLT
++ egt = -3600, -- EGT
++ egst = 0, -- EGST
++ nst = -12600, -- NST
++ ndt = -9000, -- NDT
++ awst = 28800, -- AWST
++ davt = 25200, -- DAVT
++ ddut = 36000, -- DDUT
++ mist = 39600, -- MIST
++ mawt = 18000, -- MAWT
++ nzst = 43200, -- NZST
++ nzdt = 46800, -- NZDT
++ rott = -10800, -- ROTT
++ syot = 10800, -- SYOT
++ utc = 0, -- UTC
++ vost = 21600, -- VOST
++ almt = 21600, -- ALMT
++ anat = 43200, -- ANAT
++ aqtt = 18000, -- AQTT
++ tmt = 18000, -- TMT
++ azt = 14400, -- AZT
++ azst = 18000, -- AZST
++ ict = 25200, -- ICT
++ kgt = 21600, -- KGT
++ bnt = 28800, -- BNT
++ irkt = 28800, -- IRKT
++ chot = 28800, -- CHOT
++ chost = 32400, -- CHOST
++ ist = 19800, -- IST
++ bdt = 21600, -- BDT
++ tlt = 32400, -- TLT
++ gst = 14400, -- GST
++ tjt = 18000, -- TJT
++ hkt = 28800, -- HKT
++ hovt = 25200, -- HOVT
++ hovst = 28800, -- HOVST
++ wib = 25200, -- WIB
++ wit = 32400, -- WIT
++ aft = 16200, -- AFT
++ pett = 43200, -- PETT
++ pkt = 18000, -- PKT
++ npt = 20700, -- NPT
++ yakt = 32400, -- YAKT
++ krat = 25200, -- KRAT
++ myt = 28800, -- MYT
++ magt = 36000, -- MAGT
++ wita = 28800, -- WITA
++ pht = 28800, -- PHT
++ novt = 21600, -- NOVT
++ omst = 21600, -- OMST
++ orat = 18000, -- ORAT
++ kst = 30600, -- KST
++ qyzt = 21600, -- QYZT
++ mmt = 23400, -- MMT
++ sakt = 36000, -- SAKT
++ uzt = 18000, -- UZT
++ sgt = 28800, -- SGT
++ sret = 39600, -- SRET
++ get = 14400, -- GET
++ btt = 21600, -- BTT
++ jst = 32400, -- JST
++ ulat = 28800, -- ULAT
++ ulast = 32400, -- ULAST
++ xjt = 21600, -- XJT
++ vlat = 36000, -- VLAT
++ yekt = 18000, -- YEKT
++ azot = -3600, -- AZOT
++ azost = 0, -- AZOST
++ cvt = -3600, -- CVT
++ fkst = -10800, -- FKST
++ acst = 34200, -- ACST
++ acdt = 37800, -- ACDT
++ aest = 36000, -- AEST
++ acwst = 31500, -- ACWST
++ lhst = 37800, -- LHST
++ lhdt = 39600, -- LHDT
++ msk = 10800, -- MSK
++ samt = 14400, -- SAMT
++ iot = 21600, -- IOT
++ cxt = 25200, -- CXT
++ cct = 23400, -- CCT
++ tft = 18000, -- TFT
++ sct = 14400, -- SCT
++ mvt = 18000, -- MVT
++ mut = 14400, -- MUT
++ ret = 14400, -- RET
++ wsst = 46800, -- WSST
++ wsdt = 50400, -- WSDT
++ bst = 39600, -- BST
++ chast = 45900, -- CHAST
++ chadt = 49500, -- CHADT
++ chut = 36000, -- CHUT
++ east = -18000, -- EAST
++ vut = 39600, -- VUT
++ phot = 46800, -- PHOT
++ tkt = 46800, -- TKT
++ fjt = 43200, -- FJT
++ fjst = 46800, -- FJST
++ tvt = 43200, -- TVT
++ galt = -21600, -- GALT
++ gamt = -32400, -- GAMT
++ sbt = 39600, -- SBT
++ lint = 50400, -- LINT
++ kost = 39600, -- KOST
++ mht = 43200, -- MHT
++ mart = -34200, -- MART
++ sst = -39600, -- SST
++ nrt = 43200, -- NRT
++ nut = -39600, -- NUT
++ nft = 39600, -- NFT
++ nct = 39600, -- NCT
++ pwt = 32400, -- PWT
++ pont = 39600, -- PONT
++ pgt = 36000, -- PGT
++ ckt = -36000, -- CKT
++ taht = -36000, -- TAHT
++ gilt = 43200, -- GILT
++ tot = 46800, -- TOT
++ wakt = 43200, -- WAKT
++ wft = 43200, -- WFT
++}
+diff --git a/feeds/luci/modules/luci-base/luasrc/template.lua b/feeds/luci/modules/luci-base/luasrc/template.lua
+new file mode 100644
+index 0000000..588028c
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/template.lua
+@@ -0,0 +1,100 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local util = require "luci.util"
++local config = require "luci.config"
++local tparser = require "luci.template.parser"
++
++local tostring, pairs, loadstring = tostring, pairs, loadstring
++local setmetatable, loadfile = setmetatable, loadfile
++local getfenv, setfenv, rawget = getfenv, setfenv, rawget
++local assert, type, error = assert, type, error
++
++--- LuCI template library.
++module "luci.template"
++
++config.template = config.template or {}
++viewdir = config.template.viewdir or util.libpath() .. "/view"
++
++
++-- Define the namespace for template modules
++context = util.threadlocal()
++
++--- Render a certain template.
++-- @param name Template name
++-- @param scope Scope to assign to template (optional)
++function render(name, scope)
++ return Template(name):render(scope or getfenv(2))
++end
++
++--- Render a template from a string.
++-- @param template Template string
++-- @param scope Scope to assign to template (optional)
++function render_string(template, scope)
++ return Template(nil, template):render(scope or getfenv(2))
++end
++
++
++-- Template class
++Template = util.class()
++
++-- Shared template cache to store templates in to avoid unnecessary reloading
++Template.cache = setmetatable({}, {__mode = "v"})
++
++
++-- Constructor - Reads and compiles the template on-demand
++function Template.__init__(self, name, template)
++ if name then
++ self.template = self.cache[name]
++ self.name = name
++ else
++ self.name = "[string]"
++ end
++
++ -- Create a new namespace for this template
++ self.viewns = context.viewns
++
++ -- If we have a cached template, skip compiling and loading
++ if not self.template then
++
++ -- Compile template
++ local err
++ local sourcefile
++
++ if name then
++ sourcefile = viewdir .. "/" .. name .. ".htm"
++ self.template, _, err = tparser.parse(sourcefile)
++ else
++ sourcefile = "[string]"
++ self.template, _, err = tparser.parse_string(template)
++ end
++
++ -- If we have no valid template throw error, otherwise cache the template
++ if not self.template then
++ error("Failed to load template '" .. name .. "'.\n" ..
++ "Error while parsing template '" .. sourcefile .. "':\n" ..
++ (err or "Unknown syntax error"))
++ elseif name then
++ self.cache[name] = self.template
++ end
++ end
++end
++
++
++-- Renders a template
++function Template.render(self, scope)
++ scope = scope or getfenv(2)
++
++ -- Put our predefined objects in the scope of the template
++ setfenv(self.template, setmetatable({}, {__index =
++ function(tbl, key)
++ return rawget(tbl, key) or self.viewns[key] or scope[key]
++ end}))
++
++ -- Now finally render the thing
++ local stat, err = util.copcall(self.template)
++ if not stat then
++ error("Failed to execute template '" .. self.name .. "'.\n" ..
++ "A runtime error occured: " .. tostring(err or "(nil)"))
++ end
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/tools/proto.lua b/feeds/luci/modules/luci-base/luasrc/tools/proto.lua
+new file mode 100644
+index 0000000..147688d
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/tools/proto.lua
+@@ -0,0 +1,36 @@
++-- Copyright 2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.tools.proto", package.seeall)
++
++function opt_macaddr(s, ifc, ...)
++ local v = luci.cbi.Value
++ local o = s:taboption("advanced", v, "macaddr", ...)
++
++ o.placeholder = ifc and ifc:mac()
++ o.datatype = "macaddr"
++
++ function o.cfgvalue(self, section)
++ local w = ifc and ifc:get_wifinet()
++ if w then
++ return w:get("macaddr")
++ else
++ return v.cfgvalue(self, section)
++ end
++ end
++
++ function o.write(self, section, value)
++ local w = ifc and ifc:get_wifinet()
++ if w then
++ w:set("macaddr", value)
++ elseif value then
++ v.write(self, section, value)
++ else
++ v.remove(self, section)
++ end
++ end
++
++ function o.remove(self, section)
++ self:write(section, nil)
++ end
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/tools/status.lua b/feeds/luci/modules/luci-base/luasrc/tools/status.lua
+new file mode 100644
+index 0000000..0dd092c
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/tools/status.lua
+@@ -0,0 +1,210 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.tools.status", package.seeall)
++
++local uci = require "luci.model.uci".cursor()
++
++local function dhcp_leases_common(family)
++ local rv = { }
++ local nfs = require "nixio.fs"
++ local leasefile = "/var/dhcp.leases"
++
++ uci:foreach("dhcp", "dnsmasq",
++ function(s)
++ if s.leasefile and nfs.access(s.leasefile) then
++ leasefile = s.leasefile
++ return false
++ end
++ end)
++
++ local fd = io.open(leasefile, "r")
++ if fd then
++ while true do
++ local ln = fd:read("*l")
++ if not ln then
++ break
++ else
++ local ts, mac, ip, name, duid = ln:match("^(%d+) (%S+) (%S+) (%S+) (%S+)")
++ if ts and mac and ip and name and duid then
++ if family == 4 and not ip:match(":") then
++ rv[#rv+1] = {
++ expires = os.difftime(tonumber(ts) or 0, os.time()),
++ macaddr = mac,
++ ipaddr = ip,
++ hostname = (name ~= "*") and name
++ }
++ elseif family == 6 and ip:match(":") then
++ rv[#rv+1] = {
++ expires = os.difftime(tonumber(ts) or 0, os.time()),
++ ip6addr = ip,
++ duid = (duid ~= "*") and duid,
++ hostname = (name ~= "*") and name
++ }
++ end
++ end
++ end
++ end
++ fd:close()
++ end
++
++ local fd = io.open("/tmp/hosts/odhcpd", "r")
++ if fd then
++ while true do
++ local ln = fd:read("*l")
++ if not ln then
++ break
++ else
++ local iface, duid, iaid, name, ts, id, length, ip = ln:match("^# (%S+) (%S+) (%S+) (%S+) (%d+) (%S+) (%S+) (.*)")
++ if ip and iaid ~= "ipv4" and family == 6 then
++ rv[#rv+1] = {
++ expires = os.difftime(tonumber(ts) or 0, os.time()),
++ duid = duid,
++ ip6addr = ip,
++ hostname = (name ~= "-") and name
++ }
++ elseif ip and iaid == "ipv4" and family == 4 then
++ rv[#rv+1] = {
++ expires = os.difftime(tonumber(ts) or 0, os.time()),
++ macaddr = duid,
++ ipaddr = ip,
++ hostname = (name ~= "-") and name
++ }
++ end
++ end
++ end
++ fd:close()
++ end
++
++ return rv
++end
++
++function dhcp_leases()
++ return dhcp_leases_common(4)
++end
++
++function dhcp6_leases()
++ return dhcp_leases_common(6)
++end
++
++function wifi_networks()
++ local rv = { }
++ local ntm = require "luci.model.network".init()
++
++ local dev
++ for _, dev in ipairs(ntm:get_wifidevs()) do
++ local rd = {
++ up = dev:is_up(),
++ device = dev:name(),
++ name = dev:get_i18n(),
++ networks = { }
++ }
++
++ local net
++ for _, net in ipairs(dev:get_wifinets()) do
++ rd.networks[#rd.networks+1] = {
++ name = net:shortname(),
++ link = net:adminlink(),
++ up = net:is_up(),
++ mode = net:active_mode(),
++ ssid = net:active_ssid(),
++ bssid = net:active_bssid(),
++ encryption = net:active_encryption(),
++ frequency = net:frequency(),
++ channel = net:channel(),
++ signal = net:signal(),
++ quality = net:signal_percent(),
++ noise = net:noise(),
++ bitrate = net:bitrate(),
++ ifname = net:ifname(),
++ assoclist = net:assoclist(),
++ country = net:country(),
++ txpower = net:txpower(),
++ txpoweroff = net:txpower_offset(),
++ disabled = (dev:get("disabled") == "1" or
++ net:get("disabled") == "1")
++ }
++ end
++
++ rv[#rv+1] = rd
++ end
++
++ return rv
++end
++
++function wifi_network(id)
++ local ntm = require "luci.model.network".init()
++ local net = ntm:get_wifinet(id)
++ if net then
++ local dev = net:get_device()
++ if dev then
++ return {
++ id = id,
++ name = net:shortname(),
++ link = net:adminlink(),
++ up = net:is_up(),
++ mode = net:active_mode(),
++ ssid = net:active_ssid(),
++ bssid = net:active_bssid(),
++ encryption = net:active_encryption(),
++ frequency = net:frequency(),
++ channel = net:channel(),
++ signal = net:signal(),
++ quality = net:signal_percent(),
++ noise = net:noise(),
++ bitrate = net:bitrate(),
++ ifname = net:ifname(),
++ assoclist = net:assoclist(),
++ country = net:country(),
++ txpower = net:txpower(),
++ txpoweroff = net:txpower_offset(),
++ disabled = (dev:get("disabled") == "1" or
++ net:get("disabled") == "1"),
++ device = {
++ up = dev:is_up(),
++ device = dev:name(),
++ name = dev:get_i18n()
++ }
++ }
++ end
++ end
++ return { }
++end
++
++function switch_status(devs)
++ local dev
++ local switches = { }
++ for dev in devs:gmatch("[^%s,]+") do
++ local ports = { }
++ local swc = io.popen("swconfig dev %q show" % dev, "r")
++ if swc then
++ local l
++ repeat
++ l = swc:read("*l")
++ if l then
++ local port, up = l:match("port:(%d+) link:(%w+)")
++ if port then
++ local speed = l:match(" speed:(%d+)")
++ local duplex = l:match(" (%w+)-duplex")
++ local txflow = l:match(" (txflow)")
++ local rxflow = l:match(" (rxflow)")
++ local auto = l:match(" (auto)")
++
++ ports[#ports+1] = {
++ port = tonumber(port) or 0,
++ speed = tonumber(speed) or 0,
++ link = (up == "up"),
++ duplex = (duplex == "full"),
++ rxflow = (not not rxflow),
++ txflow = (not not txflow),
++ auto = (not not auto)
++ }
++ end
++ end
++ until not l
++ swc:close()
++ end
++ switches[dev] = ports
++ end
++ return switches
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/tools/webadmin.lua b/feeds/luci/modules/luci-base/luasrc/tools/webadmin.lua
+new file mode 100644
+index 0000000..8273175
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/tools/webadmin.lua
+@@ -0,0 +1,105 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.tools.webadmin", package.seeall)
++
++local util = require "luci.util"
++local uci = require "luci.model.uci"
++local ip = require "luci.ip"
++
++function byte_format(byte)
++ local suff = {"B", "KB", "MB", "GB", "TB"}
++ for i=1, 5 do
++ if byte > 1024 and i < 5 then
++ byte = byte / 1024
++ else
++ return string.format("%.2f %s", byte, suff[i])
++ end
++ end
++end
++
++function date_format(secs)
++ local suff = {"min", "h", "d"}
++ local mins = 0
++ local hour = 0
++ local days = 0
++
++ secs = math.floor(secs)
++ if secs > 60 then
++ mins = math.floor(secs / 60)
++ secs = secs % 60
++ end
++
++ if mins > 60 then
++ hour = math.floor(mins / 60)
++ mins = mins % 60
++ end
++
++ if hour > 24 then
++ days = math.floor(hour / 24)
++ hour = hour % 24
++ end
++
++ if days > 0 then
++ return string.format("%.0fd %02.0fh %02.0fmin %02.0fs", days, hour, mins, secs)
++ else
++ return string.format("%02.0fh %02.0fmin %02.0fs", hour, mins, secs)
++ end
++end
++
++function cbi_add_networks(field)
++ uci.cursor():foreach("network", "interface",
++ function (section)
++ if section[".name"] ~= "loopback" then
++ field:value(section[".name"])
++ end
++ end
++ )
++ field.titleref = luci.dispatcher.build_url("admin", "network", "network")
++end
++
++function cbi_add_knownips(field)
++ local _, n
++ for _, n in ipairs(ip.neighbors({ family = 4 })) do
++ if n.dest then
++ field:value(n.dest:string())
++ end
++ end
++end
++
++function firewall_find_zone(name)
++ local find
++
++ luci.model.uci.cursor():foreach("firewall", "zone",
++ function (section)
++ if section.name == name then
++ find = section[".name"]
++ end
++ end
++ )
++
++ return find
++end
++
++function iface_get_network(iface)
++ local link = ip.link(tostring(iface))
++ if link.master then
++ iface = link.master
++ end
++
++ local cur = uci.cursor()
++ local dump = util.ubus("network.interface", "dump", { })
++ if dump then
++ local _, net
++ for _, net in ipairs(dump.interface) do
++ if net.l3_device == iface or net.device == iface then
++ -- cross check with uci to filter out @name style aliases
++ local uciname = cur:get("network", net.interface, "ifname")
++ if not uciname or uciname:sub(1, 1) ~= "@" then
++ return net.interface
++ end
++ end
++ end
++ end
++end
+diff --git a/feeds/luci/modules/luci-base/luasrc/util.lua b/feeds/luci/modules/luci-base/luasrc/util.lua
+new file mode 100644
+index 0000000..dcf8230
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/util.lua
+@@ -0,0 +1,730 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local io = require "io"
++local math = require "math"
++local table = require "table"
++local debug = require "debug"
++local ldebug = require "luci.debug"
++local string = require "string"
++local coroutine = require "coroutine"
++local tparser = require "luci.template.parser"
++
++local _ubus = require "ubus"
++local _ubus_connection = nil
++
++local getmetatable, setmetatable = getmetatable, setmetatable
++local rawget, rawset, unpack = rawget, rawset, unpack
++local tostring, type, assert = tostring, type, assert
++local ipairs, pairs, next, loadstring = ipairs, pairs, next, loadstring
++local require, pcall, xpcall = require, pcall, xpcall
++local collectgarbage, get_memory_limit = collectgarbage, get_memory_limit
++
++module "luci.util"
++
++--
++-- Pythonic string formatting extension
++--
++getmetatable("").__mod = function(a, b)
++ if not b then
++ return a
++ elseif type(b) == "table" then
++ for k, _ in pairs(b) do if type(b[k]) == "userdata" then b[k] = tostring(b[k]) end end
++ return a:format(unpack(b))
++ else
++ if type(b) == "userdata" then b = tostring(b) end
++ return a:format(b)
++ end
++end
++
++
++--
++-- Class helper routines
++--
++
++-- Instantiates a class
++local function _instantiate(class, ...)
++ local inst = setmetatable({}, {__index = class})
++
++ if inst.__init__ then
++ inst:__init__(...)
++ end
++
++ return inst
++end
++
++-- The class object can be instantiated by calling itself.
++-- Any class functions or shared parameters can be attached to this object.
++-- Attaching a table to the class object makes this table shared between
++-- all instances of this class. For object parameters use the __init__ function.
++-- Classes can inherit member functions and values from a base class.
++-- Class can be instantiated by calling them. All parameters will be passed
++-- to the __init__ function of this class - if such a function exists.
++-- The __init__ function must be used to set any object parameters that are not shared
++-- with other objects of this class. Any return values will be ignored.
++function class(base)
++ return setmetatable({}, {
++ __call = _instantiate,
++ __index = base
++ })
++end
++
++function instanceof(object, class)
++ local meta = getmetatable(object)
++ while meta and meta.__index do
++ if meta.__index == class then
++ return true
++ end
++ meta = getmetatable(meta.__index)
++ end
++ return false
++end
++
++
++--
++-- Scope manipulation routines
++--
++
++local tl_meta = {
++ __mode = "k",
++
++ __index = function(self, key)
++ local t = rawget(self, coxpt[coroutine.running()]
++ or coroutine.running() or 0)
++ return t and t[key]
++ end,
++
++ __newindex = function(self, key, value)
++ local c = coxpt[coroutine.running()] or coroutine.running() or 0
++ local r = rawget(self, c)
++ if not r then
++ rawset(self, c, { [key] = value })
++ else
++ r[key] = value
++ end
++ end
++}
++
++-- the current active coroutine. A thread local store is private a table object
++-- whose values can't be accessed from outside of the running coroutine.
++function threadlocal(tbl)
++ return setmetatable(tbl or {}, tl_meta)
++end
++
++
++--
++-- Debugging routines
++--
++
++function perror(obj)
++ return io.stderr:write(tostring(obj) .. "\n")
++end
++
++function dumptable(t, maxdepth, i, seen)
++ i = i or 0
++ seen = seen or setmetatable({}, {__mode="k"})
++
++ for k,v in pairs(t) do
++ perror(string.rep("\t", i) .. tostring(k) .. "\t" .. tostring(v))
++ if type(v) == "table" and (not maxdepth or i < maxdepth) then
++ if not seen[v] then
++ seen[v] = true
++ dumptable(v, maxdepth, i+1, seen)
++ else
++ perror(string.rep("\t", i) .. "*** RECURSION ***")
++ end
++ end
++ end
++end
++
++
++--
++-- String and data manipulation routines
++--
++
++function pcdata(value)
++ return value and tparser.pcdata(tostring(value))
++end
++
++function striptags(value)
++ return value and tparser.striptags(tostring(value))
++end
++
++-- containing the resulting substrings. The optional max parameter specifies
++-- the number of bytes to process, regardless of the actual length of the given
++-- string. The optional last parameter, regex, specifies whether the separator
++-- sequence is interpreted as regular expression.
++-- pattern as regular expression (optional, default is false)
++function split(str, pat, max, regex)
++ pat = pat or "\n"
++ max = max or #str
++
++ local t = {}
++ local c = 1
++
++ if #str == 0 then
++ return {""}
++ end
++
++ if #pat == 0 then
++ return nil
++ end
++
++ if max == 0 then
++ return str
++ end
++
++ repeat
++ local s, e = str:find(pat, c, not regex)
++ max = max - 1
++ if s and max < 0 then
++ t[#t+1] = str:sub(c)
++ else
++ t[#t+1] = str:sub(c, s and s - 1)
++ end
++ c = e and e + 1 or #str + 1
++ until not s or max < 0
++
++ return t
++end
++
++function trim(str)
++ return (str:gsub("^%s*(.-)%s*$", "%1"))
++end
++
++function cmatch(str, pat)
++ local count = 0
++ for _ in str:gmatch(pat) do count = count + 1 end
++ return count
++end
++
++-- one token per invocation, the tokens are separated by whitespace. If the
++-- input value is a table, it is transformed into a string first. A nil value
++-- will result in a valid interator which aborts with the first invocation.
++function imatch(v)
++ if type(v) == "table" then
++ local k = nil
++ return function()
++ k = next(v, k)
++ return v[k]
++ end
++
++ elseif type(v) == "number" or type(v) == "boolean" then
++ local x = true
++ return function()
++ if x then
++ x = false
++ return tostring(v)
++ end
++ end
++
++ elseif type(v) == "userdata" or type(v) == "string" then
++ return tostring(v):gmatch("%S+")
++ end
++
++ return function() end
++end
++
++-- value or 0 if the unit is unknown. Upper- or lower case is irrelevant.
++-- Recognized units are:
++-- o "y" - one year (60*60*24*366)
++-- o "m" - one month (60*60*24*31)
++-- o "w" - one week (60*60*24*7)
++-- o "d" - one day (60*60*24)
++-- o "h" - one hour (60*60)
++-- o "min" - one minute (60)
++-- o "kb" - one kilobyte (1024)
++-- o "mb" - one megabyte (1024*1024)
++-- o "gb" - one gigabyte (1024*1024*1024)
++-- o "kib" - one si kilobyte (1000)
++-- o "mib" - one si megabyte (1000*1000)
++-- o "gib" - one si gigabyte (1000*1000*1000)
++function parse_units(ustr)
++
++ local val = 0
++
++ -- unit map
++ local map = {
++ -- date stuff
++ y = 60 * 60 * 24 * 366,
++ m = 60 * 60 * 24 * 31,
++ w = 60 * 60 * 24 * 7,
++ d = 60 * 60 * 24,
++ h = 60 * 60,
++ min = 60,
++
++ -- storage sizes
++ kb = 1024,
++ mb = 1024 * 1024,
++ gb = 1024 * 1024 * 1024,
++
++ -- storage sizes (si)
++ kib = 1000,
++ mib = 1000 * 1000,
++ gib = 1000 * 1000 * 1000
++ }
++
++ -- parse input string
++ for spec in ustr:lower():gmatch("[0-9%.]+[a-zA-Z]*") do
++
++ local num = spec:gsub("[^0-9%.]+$","")
++ local spn = spec:gsub("^[0-9%.]+", "")
++
++ if map[spn] or map[spn:sub(1,1)] then
++ val = val + num * ( map[spn] or map[spn:sub(1,1)] )
++ else
++ val = val + num
++ end
++ end
++
++
++ return val
++end
++
++-- also register functions above in the central string class for convenience
++string.pcdata = pcdata
++string.striptags = striptags
++string.split = split
++string.trim = trim
++string.cmatch = cmatch
++string.parse_units = parse_units
++
++
++function append(src, ...)
++ for i, a in ipairs({...}) do
++ if type(a) == "table" then
++ for j, v in ipairs(a) do
++ src[#src+1] = v
++ end
++ else
++ src[#src+1] = a
++ end
++ end
++ return src
++end
++
++function combine(...)
++ return append({}, ...)
++end
++
++function contains(table, value)
++ for k, v in pairs(table) do
++ if value == v then
++ return k
++ end
++ end
++ return false
++end
++
++-- Both table are - in fact - merged together.
++function update(t, updates)
++ for k, v in pairs(updates) do
++ t[k] = v
++ end
++end
++
++function keys(t)
++ local keys = { }
++ if t then
++ for k, _ in kspairs(t) do
++ keys[#keys+1] = k
++ end
++ end
++ return keys
++end
++
++function clone(object, deep)
++ local copy = {}
++
++ for k, v in pairs(object) do
++ if deep and type(v) == "table" then
++ v = clone(v, deep)
++ end
++ copy[k] = v
++ end
++
++ return setmetatable(copy, getmetatable(object))
++end
++
++
++function dtable()
++ return setmetatable({}, { __index =
++ function(tbl, key)
++ return rawget(tbl, key)
++ or rawget(rawset(tbl, key, dtable()), key)
++ end
++ })
++end
++
++
++-- Serialize the contents of a table value.
++function _serialize_table(t, seen)
++ assert(not seen[t], "Recursion detected.")
++ seen[t] = true
++
++ local data = ""
++ local idata = ""
++ local ilen = 0
++
++ for k, v in pairs(t) do
++ if type(k) ~= "number" or k < 1 or math.floor(k) ~= k or ( k - #t ) > 3 then
++ k = serialize_data(k, seen)
++ v = serialize_data(v, seen)
++ data = data .. ( #data > 0 and ", " or "" ) ..
++ '[' .. k .. '] = ' .. v
++ elseif k > ilen then
++ ilen = k
++ end
++ end
++
++ for i = 1, ilen do
++ local v = serialize_data(t[i], seen)
++ idata = idata .. ( #idata > 0 and ", " or "" ) .. v
++ end
++
++ return idata .. ( #data > 0 and #idata > 0 and ", " or "" ) .. data
++end
++
++-- with loadstring().
++function serialize_data(val, seen)
++ seen = seen or setmetatable({}, {__mode="k"})
++
++ if val == nil then
++ return "nil"
++ elseif type(val) == "number" then
++ return val
++ elseif type(val) == "string" then
++ return "%q" % val
++ elseif type(val) == "boolean" then
++ return val and "true" or "false"
++ elseif type(val) == "function" then
++ return "loadstring(%q)" % get_bytecode(val)
++ elseif type(val) == "table" then
++ return "{ " .. _serialize_table(val, seen) .. " }"
++ else
++ return '"[unhandled data type:' .. type(val) .. ']"'
++ end
++end
++
++function restore_data(str)
++ return loadstring("return " .. str)()
++end
++
++
++--
++-- Byte code manipulation routines
++--
++
++-- will be stripped before it is returned.
++function get_bytecode(val)
++ local code
++
++ if type(val) == "function" then
++ code = string.dump(val)
++ else
++ code = string.dump( loadstring( "return " .. serialize_data(val) ) )
++ end
++
++ return code -- and strip_bytecode(code)
++end
++
++-- numbers and debugging numbers will be discarded. Original version by
++-- Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html)
++function strip_bytecode(code)
++ local version, format, endian, int, size, ins, num, lnum = code:byte(5, 12)
++ local subint
++ if endian == 1 then
++ subint = function(code, i, l)
++ local val = 0
++ for n = l, 1, -1 do
++ val = val * 256 + code:byte(i + n - 1)
++ end
++ return val, i + l
++ end
++ else
++ subint = function(code, i, l)
++ local val = 0
++ for n = 1, l, 1 do
++ val = val * 256 + code:byte(i + n - 1)
++ end
++ return val, i + l
++ end
++ end
++
++ local function strip_function(code)
++ local count, offset = subint(code, 1, size)
++ local stripped = { string.rep("\0", size) }
++ local dirty = offset + count
++ offset = offset + count + int * 2 + 4
++ offset = offset + int + subint(code, offset, int) * ins
++ count, offset = subint(code, offset, int)
++ for n = 1, count do
++ local t
++ t, offset = subint(code, offset, 1)
++ if t == 1 then
++ offset = offset + 1
++ elseif t == 4 then
++ offset = offset + size + subint(code, offset, size)
++ elseif t == 3 then
++ offset = offset + num
++ elseif t == 254 or t == 9 then
++ offset = offset + lnum
++ end
++ end
++ count, offset = subint(code, offset, int)
++ stripped[#stripped+1] = code:sub(dirty, offset - 1)
++ for n = 1, count do
++ local proto, off = strip_function(code:sub(offset, -1))
++ stripped[#stripped+1] = proto
++ offset = offset + off - 1
++ end
++ offset = offset + subint(code, offset, int) * int + int
++ count, offset = subint(code, offset, int)
++ for n = 1, count do
++ offset = offset + subint(code, offset, size) + size + int * 2
++ end
++ count, offset = subint(code, offset, int)
++ for n = 1, count do
++ offset = offset + subint(code, offset, size) + size
++ end
++ stripped[#stripped+1] = string.rep("\0", int * 3)
++ return table.concat(stripped), offset
++ end
++
++ return code:sub(1,12) .. strip_function(code:sub(13,-1))
++end
++
++
++--
++-- Sorting iterator functions
++--
++
++function _sortiter( t, f )
++ local keys = { }
++
++ local k, v
++ for k, v in pairs(t) do
++ keys[#keys+1] = k
++ end
++
++ local _pos = 0
++
++ table.sort( keys, f )
++
++ return function()
++ _pos = _pos + 1
++ if _pos <= #keys then
++ return keys[_pos], t[keys[_pos]], _pos
++ end
++ end
++end
++
++-- the provided callback function.
++function spairs(t,f)
++ return _sortiter( t, f )
++end
++
++-- The table pairs are sorted by key.
++function kspairs(t)
++ return _sortiter( t )
++end
++
++-- The table pairs are sorted by value.
++function vspairs(t)
++ return _sortiter( t, function (a,b) return t[a] < t[b] end )
++end
++
++
++--
++-- System utility functions
++--
++
++function bigendian()
++ return string.byte(string.dump(function() end), 7) == 0
++end
++
++function exec(command)
++ local pp = io.popen(command)
++ local data = pp:read("*a")
++ pp:close()
++
++ return data
++end
++
++function execi(command)
++ local pp = io.popen(command)
++
++ return pp and function()
++ local line = pp:read()
++
++ if not line then
++ pp:close()
++ end
++
++ return line
++ end
++end
++
++-- Deprecated
++function execl(command)
++ local pp = io.popen(command)
++ local line = ""
++ local data = {}
++
++ while true do
++ line = pp:read()
++ if (line == nil) then break end
++ data[#data+1] = line
++ end
++ pp:close()
++
++ return data
++end
++
++function ubus(object, method, data)
++ if not _ubus_connection then
++ _ubus_connection = _ubus.connect()
++ assert(_ubus_connection, "Unable to establish ubus connection")
++ end
++
++ if object and method then
++ if type(data) ~= "table" then
++ data = { }
++ end
++ return _ubus_connection:call(object, method, data)
++ elseif object then
++ return _ubus_connection:signatures(object)
++ else
++ return _ubus_connection:objects()
++ end
++end
++
++function serialize_json(x, cb)
++ local rv, push = nil, cb
++ if not push then
++ rv = { }
++ push = function(tok) rv[#rv+1] = tok end
++ end
++
++ if x == nil then
++ push("null")
++ elseif type(x) == "table" then
++ -- test if table is array like
++ local k, v
++ local n1, n2 = 0, 0
++ for k in pairs(x) do n1 = n1 + 1 end
++ for k in ipairs(x) do n2 = n2 + 1 end
++
++ if n1 == n2 and n1 > 0 then
++ push("[")
++ for k = 1, n2 do
++ if k > 1 then
++ push(",")
++ end
++ serialize_json(x[k], push)
++ end
++ push("]")
++ else
++ push("{")
++ for k, v in pairs(x) do
++ push("%q:" % tostring(k))
++ serialize_json(v, push)
++ if next(x, k) then
++ push(",")
++ end
++ end
++ push("}")
++ end
++ elseif type(x) == "number" or type(x) == "boolean" then
++ if (x ~= x) then
++ -- NaN is the only value that doesn't equal to itself.
++ push("Number.NaN")
++ else
++ push(tostring(x))
++ end
++ else
++ push('"%s"' % tostring(x):gsub('["%z\1-\31\\]',
++ function(c) return '\\u%04x' % c:byte(1) end))
++ end
++
++ if not cb then
++ return table.concat(rv, "")
++ end
++end
++
++
++function libpath()
++ return require "nixio.fs".dirname(ldebug.__file__)
++end
++
++
++--
++-- Coroutine safe xpcall and pcall versions modified for Luci
++-- original version:
++-- coxpcall 1.13 - Copyright 2005 - Kepler Project (www.keplerproject.org)
++--
++-- 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:
++--
++-- The above copyright notice and this permission notice shall be
++-- included in all copies or substantial portions of the Software.
++--
++-- 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
++
++ return performResume(err, co, ...)
++end
++
++-- values of the function or the error object
++function copcall(f, ...)
++ return coxpcall(f, copcall_id, ...)
++end
++
++-- Handle return value of protected call
++function handleReturnValue(err, co, status, ...)
++ if not status then
++ return false, err(debug.traceback(co, (...)), ...)
++ end
++
++ if coroutine.status(co) ~= 'suspended' then
++ 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
+diff --git a/feeds/luci/modules/luci-base/luasrc/util.luadoc b/feeds/luci/modules/luci-base/luasrc/util.luadoc
+new file mode 100644
+index 0000000..805eeb7
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/util.luadoc
+@@ -0,0 +1,378 @@
++---[[
++LuCI utility functions.
++]]
++module "luci.util"
++
++---[[
++Create a Class object (Python-style object model).
++
++The class object can be instantiated by calling itself.
++Any class functions or shared parameters can be attached to this object.
++Attaching a table to the class object makes this table shared between
++all instances of this class. For object parameters use the __init__ function.
++Classes can inherit member functions and values from a base class.
++Class can be instantiated by calling them. All parameters will be passed
++to the __init__ function of this class - if such a function exists.
++The __init__ function must be used to set any object parameters that are not shared
++with other objects of this class. Any return values will be ignored.
++@class function
++@name class
++@param base The base class to inherit from (optional)
++@return A class object
++@see instanceof
++@see clone
++]]
++
++---[[
++Test whether the given object is an instance of the given class.
++
++@class function
++@name instanceof
++@param object Object instance
++@param class Class object to test against
++@return Boolean indicating whether the object is an instance
++@see class
++@see clone
++]]
++
++---[[
++Create a new or get an already existing thread local store associated with
++
++the current active coroutine. A thread local store is private a table object
++whose values can't be accessed from outside of the running coroutine.
++@class function
++@name threadlocal
++@return Table value representing the corresponding thread local store
++]]
++
++---[[
++Write given object to stderr.
++
++@class function
++@name perror
++@param obj Value to write to stderr
++@return Boolean indicating whether the write operation was successful
++]]
++
++---[[
++Recursively dumps a table to stdout, useful for testing and debugging.
++
++@class function
++@name dumptable
++@param t Table value to dump
++@param maxdepth Maximum depth
++@return Always nil
++]]
++
++---[[
++Create valid XML PCDATA from given string.
++
++@class function
++@name pcdata
++@param value String value containing the data to escape
++@return String value containing the escaped data
++]]
++
++---[[
++Strip HTML tags from given string.
++
++@class function
++@name striptags
++@param value String containing the HTML text
++@return String with HTML tags stripped of
++]]
++
++---[[
++Splits given string on a defined separator sequence and return a table
++
++containing the resulting substrings. The optional max parameter specifies
++the number of bytes to process, regardless of the actual length of the given
++string. The optional last parameter, regex, specifies whether the separator
++sequence is interpreted as regular expression.
++@class function
++@name split
++@param str String value containing the data to split up
++@param pat String with separator pattern (optional, defaults to "\n")
++@param max Maximum times to split (optional)
++@param regex Boolean indicating whether to interpret the separator
++-- pattern as regular expression (optional, default is false)
++@return Table containing the resulting substrings
++]]
++
++---[[
++Remove leading and trailing whitespace from given string value.
++
++@class function
++@name trim
++@param str String value containing whitespace padded data
++@return String value with leading and trailing space removed
++]]
++
++---[[
++Count the occurences of given substring in given string.
++
++@class function
++@name cmatch
++@param str String to search in
++@param pattern String containing pattern to find
++@return Number of found occurences
++]]
++
++---[[
++Return a matching iterator for the given value. The iterator will return
++
++one token per invocation, the tokens are separated by whitespace. If the
++input value is a table, it is transformed into a string first. A nil value
++will result in a valid interator which aborts with the first invocation.
++@class function
++@name imatch
++@param val The value to scan (table, string or nil)
++@return Iterator which returns one token per call
++]]
++
++---[[
++Parse certain units from the given string and return the canonical integer
++
++value or 0 if the unit is unknown. Upper- or lower case is irrelevant.
++Recognized units are:
++-- o "y" - one year (60*60*24*366)
++ o "m" - one month (60*60*24*31)
++ o "w" - one week (60*60*24*7)
++ o "d" - one day (60*60*24)
++ o "h" - one hour (60*60)
++ o "min" - one minute (60)
++ o "kb" - one kilobyte (1024)
++ o "mb" - one megabyte (1024*1024)
++ o "gb" - one gigabyte (1024*1024*1024)
++ o "kib" - one si kilobyte (1000)
++ o "mib" - one si megabyte (1000*1000)
++ o "gib" - one si gigabyte (1000*1000*1000)
++@class function
++@name parse_units
++@param ustr String containing a numerical value with trailing unit
++@return Number containing the canonical value
++]]
++
++---[[
++Appends numerically indexed tables or single objects to a given table.
++
++@class function
++@name append
++@param src Target table
++@param ... Objects to insert
++@return Target table
++]]
++
++---[[
++Combines two or more numerically indexed tables and single objects into one table.
++
++@class function
++@name combine
++@param tbl1 Table value to combine
++@param tbl2 Table value to combine
++@param ... More tables to combine
++@return Table value containing all values of given tables
++]]
++
++---[[
++Checks whether the given table contains the given value.
++
++@class function
++@name contains
++@param table Table value
++@param value Value to search within the given table
++@return number indicating the first index at which the given value occurs
++-- within table or false.
++]]
++
++---[[
++Update values in given table with the values from the second given table.
++
++Both table are - in fact - merged together.
++@class function
++@name update
++@param t Table which should be updated
++@param updates Table containing the values to update
++@return Always nil
++]]
++
++---[[
++Retrieve all keys of given associative table.
++
++@class function
++@name keys
++@param t Table to extract keys from
++@return Sorted table containing the keys
++]]
++
++---[[
++Clones the given object and return it's copy.
++
++@class function
++@name clone
++@param object Table value to clone
++@param deep Boolean indicating whether to do recursive cloning
++@return Cloned table value
++]]
++
++---[[
++Create a dynamic table which automatically creates subtables.
++
++@class function
++@name dtable
++@return Dynamic Table
++]]
++
++---[[
++Recursively serialize given data to lua code, suitable for restoring
++
++with loadstring().
++@class function
++@name serialize_data
++@param val Value containing the data to serialize
++@return String value containing the serialized code
++@see restore_data
++@see get_bytecode
++]]
++
++---[[
++Restore data previously serialized with serialize_data().
++
++@class function
++@name restore_data
++@param str String containing the data to restore
++@return Value containing the restored data structure
++@see serialize_data
++@see get_bytecode
++]]
++
++---[[
++Return the current runtime bytecode of the given data. The byte code
++
++will be stripped before it is returned.
++@class function
++@name get_bytecode
++@param val Value to return as bytecode
++@return String value containing the bytecode of the given data
++]]
++
++---[[
++Strips unnescessary lua bytecode from given string. Information like line
++
++numbers and debugging numbers will be discarded. Original version by
++Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html)
++@class function
++@name strip_bytecode
++@param code String value containing the original lua byte code
++@return String value containing the stripped lua byte code
++]]
++
++---[[
++Return a key, value iterator which returns the values sorted according to
++
++the provided callback function.
++@class function
++@name spairs
++@param t The table to iterate
++@param f A callback function to decide the order of elements
++@return Function value containing the corresponding iterator
++]]
++
++---[[
++Return a key, value iterator for the given table.
++
++The table pairs are sorted by key.
++@class function
++@name kspairs
++@param t The table to iterate
++@return Function value containing the corresponding iterator
++]]
++
++---[[
++Return a key, value iterator for the given table.
++
++The table pairs are sorted by value.
++@class function
++@name vspairs
++@param t The table to iterate
++@return Function value containing the corresponding iterator
++]]
++
++---[[
++Test whether the current system is operating in big endian mode.
++
++@class function
++@name bigendian
++@return Boolean value indicating whether system is big endian
++]]
++
++---[[
++Execute given commandline and gather stdout.
++
++@class function
++@name exec
++@param command String containing command to execute
++@return String containing the command's stdout
++]]
++
++---[[
++Return a line-buffered iterator over the output of given command.
++
++@class function
++@name execi
++@param command String containing the command to execute
++@return Iterator
++]]
++
++---[[
++Issue an ubus call.
++
++@class function
++@name ubus
++@param object String containing the ubus object to call
++@param method String containing the ubus method to call
++@param values Table containing the values to pass
++@return Table containin the ubus result
++]]
++
++---[[
++Convert data structure to JSON
++
++@class function
++@name serialize_json
++@param data The data to serialize
++@param writer A function to write a chunk of JSON data (optional)
++@return String containing the JSON if called without write callback
++]]
++
++---[[
++Returns the absolute path to LuCI base directory.
++
++@class function
++@name libpath
++@return String containing the directory path
++]]
++
++---[[
++This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function
++
++@class function
++@name coxpcall
++@param f Lua function to be called protected
++@param err Custom error handler
++@param ... Parameters passed to the function
++@return A boolean whether the function call succeeded and the return
++-- values of either the function or the error handler
++]]
++
++---[[
++This is a coroutine-safe drop-in replacement for Lua's "pcall"-function
++
++@class function
++@name copcall
++@param f Lua function to be called protected
++@param ... Parameters passed to the function
++@return A boolean whether the function call succeeded and the returns
++-- values of the function or the error object
++]]
++
+diff --git a/feeds/luci/modules/luci-base/luasrc/version.lua b/feeds/luci/modules/luci-base/luasrc/version.lua
+new file mode 100644
+index 0000000..8af2e80
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/version.lua
+@@ -0,0 +1,9 @@
++-- Licensed to the public under the Apache License 2.0.
++
++module "luci.version"
++
++distname = "Host System"
++distversion = "SDK"
++
++luciname = "LuCI"
++luciversion = "SVN"
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/apply_xhr.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/apply_xhr.htm
+new file mode 100644
+index 0000000..daa57c1
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/apply_xhr.htm
+@@ -0,0 +1,43 @@
++<% export("cbi_apply_xhr", function(id, configs, redirect) -%>
++<fieldset class="cbi-section" id="cbi-apply-<%=id%>">
++ <legend><%:Applying changes%></legend>
++ <script type="text/javascript">//<![CDATA[
++ var apply_xhr = new XHR();
++
++ apply_xhr.post('<%=url('servicectl/restart', table.concat(configs, ","))%>', { token: '<%=token%>' },
++ function() {
++ var checkfinish = function() {
++ apply_xhr.get('<%=url('servicectl/status')%>', null,
++ function(x) {
++ if( x.responseText == 'finish' )
++ {
++ var e = document.getElementById('cbi-apply-<%=id%>-status');
++ if( e )
++ {
++ e.innerHTML = '<%:Configuration applied.%>';
++ window.setTimeout(function() {
++ e.parentNode.style.display = 'none';
++ <% if redirect then %>location.href='<%=redirect%>';<% end %>
++ }, 1000);
++ }
++ }
++ else
++ {
++ var e = document.getElementById('cbi-apply-<%=id%>-status');
++ if( e && x.responseText ) e.innerHTML = x.responseText;
++
++ window.setTimeout(checkfinish, 1000);
++ }
++ }
++ );
++ }
++
++ window.setTimeout(checkfinish, 1000);
++ }
++ );
++ //]]></script>
++
++ <img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
++ <span id="cbi-apply-<%=id%>-status"><%:Waiting for changes to be applied...%></span>
++</fieldset>
++<%- end) %>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/browser.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/browser.htm
+new file mode 100644
+index 0000000..a181201
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/browser.htm
+@@ -0,0 +1,7 @@
++<% local v = self:cfgvalue(section) -%>
++<%+cbi/valueheader%>
++ <input class="cbi-input-text" type="text"<%= attr("value", v) .. attr("name", cbid) .. attr("id", cbid) %> />
++ <script type="text/javascript">
++cbi_browser_init('<%=cbid%>', '<%=resource%>', '<%=url('admin/filebrowser')%>'<%=self.default_path and ", '"..self.default_path.."'"%>);
++ </script>
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/button.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/button.htm
+new file mode 100644
+index 0000000..30f8ddf
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/button.htm
+@@ -0,0 +1,7 @@
++<%+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)%> />
++ <% else %>
++ -
++ <% end %>
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm
+new file mode 100644
+index 0000000..220ebd4
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm
+@@ -0,0 +1,20 @@
++</div>
++<div id="cbip-<%=self.config.."-"..section.."-"..self.option%>"></div>
++</td>
++
++<% if #self.deps > 0 then -%>
++ <script type="text/javascript">
++ <% for j, d in ipairs(self.deps) do -%>
++ cbi_d_add("cbi-<%=self.config.."-"..section.."-"..self.option..d.add%>", {
++ <%-
++ for k,v in pairs(d.deps) do
++ -%>
++ <%-=string.format('"cbid.%s.%s.%s"', self.config, section, k) .. ":" .. string.format("%q", v)-%>
++ <%-if next(d.deps, k) then-%>,<%-end-%>
++ <%-
++ end
++ -%>
++ }, "cbip-<%=self.config.."-"..section.."-"..self.option%>");
++ <%- end %>
++ </script>
++<%- end %>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm
+new file mode 100644
+index 0000000..9e2e145
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm
+@@ -0,0 +1,2 @@
++<td class="cbi-value-field<% if self.error and self.error[section] then %> cbi-value-error<% end %>">
++<div id="cbi-<%=self.config.."-"..section.."-"..self.option%>">
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/compound.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/compound.htm
+new file mode 100644
+index 0000000..12d02bb
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/compound.htm
+@@ -0,0 +1 @@
++<%- self:render_children() %>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/delegator.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/delegator.htm
+new file mode 100644
+index 0000000..4fd1926
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/delegator.htm
+@@ -0,0 +1,24 @@
++<%- self.active:render() %>
++ <div class="cbi-page-actions">
++ <input type="hidden" name="cbi.delg.current" value="<%=self.current%>" />
++<% for _, x in ipairs(self.chain) do %>
++ <input type="hidden" name="cbi.delg.path" value="<%=x%>" />
++<% end %>
++<% if not self.disallow_pageactions then %>
++<% if self.allow_finish and not self:get_next(self.current) then %>
++ <input class="cbi-button cbi-button-finish" type="submit" value="<%:Finish%>" />
++<% elseif self:get_next(self.current) then %>
++ <input class="cbi-button cbi-button-next" type="submit" value="<%:Next »%>" />
++<% end %>
++<% if self.allow_cancel then %>
++ <input class="cbi-button cbi-button-cancel" type="submit" name="cbi.cancel" value="<%:Cancel%>" />
++<% end %>
++<% if self.allow_reset then %>
++ <input class="cbi-button cbi-button-reset" type="reset" value="<%:Reset%>" />
++<% end %>
++<% if self.allow_back and self:get_prev(self.current) then %>
++ <input class="cbi-button cbi-button-back" type="submit" name="cbi.delg.back" value="<%:« Back%>" />
++<% end %>
++<% end %>
++ <script type="text/javascript">cbi_d_update();</script>
++ </div>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/dvalue.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/dvalue.htm
+new file mode 100644
+index 0000000..78e6f32
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/dvalue.htm
+@@ -0,0 +1,13 @@
++<%+cbi/valueheader%>
++<% if self.href then %><a href="<%=self.href%>"><% end -%>
++ <%
++ local val = self:cfgvalue(section) or self.default or ""
++ if not self.rawhtml then
++ write(pcdata(val))
++ else
++ write(val)
++ end
++ %>
++<%- if self.href then %></a><%end%>
++<input type="hidden" id="<%=cbid%>" value="<%=pcdata(self:cfgvalue(section) or self.default or "")%>" />
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/dynlist.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/dynlist.htm
+new file mode 100644
+index 0000000..fd626a4
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/dynlist.htm
+@@ -0,0 +1,26 @@
++<%+cbi/valueheader%>
++<div>
++<%
++ local vals = self:cfgvalue(section) or {}
++ for i=1, #vals + 1 do
++ local val = vals[i]
++ if (val and #val > 0) or (i == 1) then
++%>
++ <input class="cbi-input-text" value="<%=pcdata(val)%>" onchange="cbi_d_update(this.id)" type="text"<%=
++ attr("id", cbid .. "." .. i) .. attr("name", cbid) .. ifattr(self.size, "size") ..
++ ifattr(i == 1 and self.placeholder, "placeholder", self.placeholder)
++ %> /><br />
++<% end end %>
++</div>
++<script type="text/javascript">
++cbi_dynlist_init(
++ '<%=cbid%>', '<%=resource%>', '<%=self.datatype%>',
++ <%=tostring(self.optional or self.rmempty)%>
++ <%- if #self.keylist > 0 then -%>, [{
++ <%- for i, k in ipairs(self.keylist) do -%>
++ <%-=string.format("%q", k) .. ":" .. string.format("%q", self.vallist[i])-%>
++ <%-if i<#self.keylist then-%>,<%-end-%>
++ <%- end -%>
++ }, '<%: -- custom -- %>']<% end -%>);
++</script>
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/error.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/error.htm
+new file mode 100644
+index 0000000..75ec108
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/error.htm
+@@ -0,0 +1,19 @@
++<div class="cbi-map" id="cbi-<%=self.config%>">
++ <% 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 %>
++
++ <p class="alert-message danger">
++ <%: The configuration file could not be loaded due to the following error: %><br />
++ <code><%=pcdata(self.error)%></code>
++ </p>
++
++ <textarea name="cbi.source" style="width:100%; margin-bottom:1em" rows="<%=math.max(self.source:cmatch("\n"), 10)%>"><%=pcdata(self.source)%></textarea>
++
++ <p class="alert-message">
++ <%: Edit the raw configuration data above to fix any error and hit "Save" to reload the page. %>
++ </p>
++
++ <div class="cbi-page-actions">
++ <input class="cbi-button cbi-button-apply" type="submit" name="cbi.save" value="<%:Save%>" />
++ </div>
++</div>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/filebrowser.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/filebrowser.htm
+new file mode 100644
+index 0000000..a79beeb
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/filebrowser.htm
+@@ -0,0 +1,108 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
++<head>
++ <title>Filebrowser - LuCI</title>
++ <style type="text/css">
++ #path, #listing {
++ font-size: 85%;
++ }
++
++ ul {
++ padding-left: 0;
++ list-style-type: none;
++ }
++
++ li img {
++ vertical-align: bottom;
++ margin-right: 0.2em;
++ }
++ </style>
++
++ <script type="text/javascript">
++ function callback(path) {
++ if( window.opener ) {
++ var input = window.opener.document.getElementById('<%=luci.http.formvalue('field')%>');
++ if( input ) {
++ input.value = path;
++ window.close();
++ }
++ }
++ }
++ </script>
++</head>
++<body>
++ <%
++ require("nixio.fs")
++ require("nixio.util")
++ require("luci.http")
++ require("luci.dispatcher")
++
++ local field = luci.http.formvalue('field')
++ local request = luci.dispatcher.context.args
++ local path = { '' }
++
++ for i = 1, #request do
++ if request[i] ~= '..' and #request[i] > 0 then
++ path[#path+1] = request[i]
++ end
++ end
++
++ local filepath = table.concat( path, '/' )
++ local filestat = nixio.fs.stat( filepath )
++ local baseurl = luci.dispatcher.build_url('admin', 'filebrowser')
++
++ if filestat and filestat.type == "reg" then
++ table.remove( path, #path )
++ filepath = table.concat( path, '/' ) .. '/'
++ elseif not ( filestat and filestat.type == "dir" ) then
++ path = { '' }
++ filepath = '/'
++ else
++ filepath = filepath .. '/'
++ end
++
++ local entries = nixio.util.consume((nixio.fs.dir(filepath)))
++ -%>
++ <div id="path">
++ Location:
++ <% for i, dir in ipairs(path) do %>
++ <% if i == 1 then %>
++ <a href="<%=baseurl%>?field=<%=field%>">(root)</a>
++ <% elseif next(path, i) then %>
++ <% baseurl = baseurl .. '/' .. dir %>
++ / <a href="<%=baseurl%>?field=<%=field%>"><%=dir%></a>
++ <% else %>
++ <% baseurl = baseurl .. '/' .. dir %>
++ / <%=dir%>
++ <% end %>
++ <% end %>
++ </div>
++
++ <hr />
++
++ <div id="listing">
++ <ul>
++ <% for _, e in luci.util.vspairs(entries) do
++ local stat = nixio.fs.stat(filepath..e)
++ if stat and stat.type == 'dir' then
++ -%>
++ <li class="dir">
++ <img src="<%=resource%>/cbi/folder.gif" alt="<%:Directory%>" />
++ <a href="<%=baseurl%>/<%=e%>?field=<%=field%>"><%=e%>/</a>
++ </li>
++ <% end end -%>
++
++ <% for _, e in luci.util.vspairs(entries) do
++ local stat = nixio.fs.stat(filepath..e)
++ if stat and stat.type ~= 'dir' then
++ -%>
++ <li class="file">
++ <img src="<%=resource%>/cbi/file.gif" alt="<%:File%>" />
++ <a href="#" onclick="callback('<%=filepath..e%>')"><%=e%></a>
++ </li>
++ <% end end -%>
++ </ul>
++ </div>
++</body>
++</html>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm
+new file mode 100644
+index 0000000..2a433b5
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm
+@@ -0,0 +1,59 @@
++<%+cbi/valueheader%>
++
++<%-
++ local utl = require "luci.util"
++ local fwm = require "luci.model.firewall".init()
++ local nwm = require "luci.model.network".init()
++
++ local zone, fwd, fz
++ local value = self:formvalue(section)
++ if not value or value == "-" then
++ value = self:cfgvalue(section) or self.default
++ end
++
++ local def = fwm:get_defaults()
++ local zone = fwm:get_zone(value)
++ local empty = true
++-%>
++
++<% 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()
++ empty = false %>
++ <label class="zonebadge" style="background-color:<%=fz:get_color()%>">
++ <strong><%=fz:name()%></strong>
++ </label>&#160;
++ <% end %>
++ <% if empty then %>
++ <label class="zonebadge zonebadge-empty">
++ <strong><%=zone:forward():upper()%></strong>
++ </label>
++ <% end %>
++</div>
++<% end %>
++
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm
+new file mode 100644
+index 0000000..7973437
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm
+@@ -0,0 +1,89 @@
++<%+cbi/valueheader%>
++
++<%-
++ local utl = require "luci.util"
++ local fwm = require "luci.model.firewall".init()
++ local nwm = require "luci.model.network".init()
++
++ local zone, net, iface
++ local zones = fwm:get_zones()
++ local value = self:formvalue(section)
++ if not value or value == "-" then
++ value = self:cfgvalue(section) or self.default
++ end
++
++ local selected = false
++ local checked = { }
++
++ for value in utl.imatch(value) do
++ checked[value] = true
++ end
++
++ if not next(checked) then
++ checked[""] = true
++ end
++-%>
++
++<ul style="margin:0; list-style-type:none; text-align:left">
++ <% if self.allowlocal then %>
++ <li style="padding:0.5em">
++ <input class="cbi-input-radio" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%=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")%> style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
++ <strong><%:Device%></strong>
++ <% if self.allowany and self.allowlocal then %>(<%:input%>)<% end %>
++ </label>
++ </li>
++ <% end %>
++ <% if self.allowany then %>
++ <li style="padding:0.5em">
++ <input class="cbi-input-radio" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%=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")%> style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge">
++ <strong><%:Any zone%></strong>
++ <% if self.allowany and self.allowlocal then %>(<%:forward%>)<% end %>
++ </label>
++ </li>
++ <% end %>
++ <%
++ for _, zone in utl.spairs(zones, function(a,b) return (zones[a]:name() < zones[b]:name()) end) do
++ if zone:name() ~= self.exclude then
++ selected = selected or (value == zone:name())
++ %>
++ <li style="padding:0.5em">
++ <input class="cbi-input-radio" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%=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())%> 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" />
++ <% end %>
++ <% if nempty then %><em><%:(empty)%></em><% end %>
++ </span>
++ <% end end %>
++ <% if zempty then %><em><%:(empty)%></em><% end %>
++ </label>
++ </li>
++ <% end end %>
++
++ <% if self.widget ~= "checkbox" and not self.nocreate then %>
++ <li style="padding:0.5em">
++ <input class="cbi-input-radio" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)" type="radio"<%=attr("id", cbid .. "_new") .. attr("name", cbid) .. attr("value", "-") .. ifattr(not selected, "checked", "checked")%> /> &#160;
++ <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>
++ <% end %>
++</ul>
++
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/footer.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/footer.htm
+new file mode 100644
+index 0000000..115250a
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/footer.htm
+@@ -0,0 +1,26 @@
++ <%- if pageaction then -%>
++ <div class="cbi-page-actions">
++ <% 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>
++ <% end %>
++
++ <% if flow.skip then %>
++ <input class="cbi-button cbi-button-skip" type="submit" name="cbi.skip" value="<%:Skip%>" />
++ <% end %>
++ <% if not autoapply and not flow.hideapplybtn then %>
++ <input class="cbi-button cbi-button-apply" type="submit" name="cbi.apply" value="<%:Save & Apply%>" />
++ <% end %>
++ <% if not flow.hidesavebtn then %>
++ <input class="cbi-button cbi-button-save" type="submit" value="<%:Save%>" />
++ <% end %>
++ <% if not flow.hideresetbtn then %>
++ <input class="cbi-button cbi-button-reset" type="button" value="<%:Reset%>" onclick="location.href='<%=REQUEST_URI%>'" />
++ <% end %>
++
++ <script type="text/javascript">cbi_d_update();</script>
++ </div>
++ <%- end -%>
++</form>
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valuefooter.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valuefooter.htm
+new file mode 100644
+index 0000000..4876fbc
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valuefooter.htm
+@@ -0,0 +1,59 @@
++ <% if self.description and #self.description > 0 then -%>
++ <% if not luci.util.instanceof(self, luci.cbi.DynamicList) and (not luci.util.instanceof(self, luci.cbi.Flag) or self.orientation == "horizontal") then -%>
++ <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 %>
++ <%- if self.title and #self.title > 0 then -%>
++ </div>
++ <%- end -%>
++</div>
++
++
++<% if #self.deps > 0 or #self.subdeps > 0 then -%>
++ <script type="text/javascript" id="cbip-<%=self.config.."-"..section.."-"..self.option%>">
++ <% for j, d in ipairs(self.subdeps) do -%>
++ cbi_d_add("cbi-<%=self.config.."-"..section.."-"..self.option..d.add%>", {
++ <%-
++ for k,v in pairs(d.deps) do
++ local depk
++ if k:find("!", 1, true) then
++ depk = string.format('"%s"', k)
++ elseif k:find(".", 1, true) then
++ depk = string.format('"cbid.%s"', k)
++ else
++ depk = string.format('"cbid.%s.%s.%s"', self.config, section, k)
++ end
++ -%>
++ <%-= depk .. ":" .. string.format("%q", v)-%>
++ <%-if next(d.deps, k) then-%>,<%-end-%>
++ <%-
++ end
++ -%>
++ }, "cbip-<%=self.config.."-"..section.."-"..self.option..d.add%>");
++ <%- end %>
++ <% for j, d in ipairs(self.deps) do -%>
++ cbi_d_add("cbi-<%=self.config.."-"..section.."-"..self.option..d.add%>", {
++ <%-
++ for k,v in pairs(d.deps) do
++ local depk
++ if k:find("!", 1, true) then
++ depk = string.format('"%s"', k)
++ elseif k:find(".", 1, true) then
++ depk = string.format('"cbid.%s"', k)
++ else
++ depk = string.format('"cbid.%s.%s.%s"', self.config, section, k)
++ end
++ -%>
++ <%-= depk .. ":" .. string.format("%q", v)-%>
++ <%-if next(d.deps, k) then-%>,<%-end-%>
++ <%-
++ end
++ -%>
++ }, "cbip-<%=self.config.."-"..section.."-"..self.option..d.add%>");
++ <%- end %>
++ </script>
++<%- end %>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valueheader.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valueheader.htm
+new file mode 100644
+index 0000000..aaf0854
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valueheader.htm
+@@ -0,0 +1,9 @@
++<div class="cbi-value<% if self.error and self.error[section] then %> cbi-value-error<% end %><% if self.last_child then %> cbi-value-last<% end %>" id="cbi-<%=self.config.."-"..section.."-"..self.option%>">
++ <%- if self.title and #self.title > 0 then -%>
++ <label class="cbi-value-title"<%= attr("for", cbid) %>>
++ <%- if self.titleref then -%><a title="<%=self.titledesc or translate('Go to relevant configuration page')%>" class="cbi-title-ref" href="<%=self.titleref%>"><%- end -%>
++ <%-=self.title-%>
++ <%- if self.titleref then -%></a><%- end -%>
++ </label>
++ <div class="cbi-value-field">
++ <%- end -%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/fvalue.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/fvalue.htm
+new file mode 100644
+index 0000000..a1e0808
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/fvalue.htm
+@@ -0,0 +1,9 @@
++<%+cbi/valueheader%>
++ <input type="hidden" value="1"<%=
++ attr("name", "cbi.cbe." .. self.config .. "." .. section .. "." .. self.option)
++ %> />
++ <input class="cbi-input-checkbox" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)" type="checkbox"<%=
++ attr("id", cbid) .. attr("name", cbid) .. attr("value", self.enabled or 1) ..
++ ifattr((self:cfgvalue(section) or self.default) == self.enabled, "checked", "checked")
++ %> />
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/header.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/header.htm
+new file mode 100644
+index 0000000..302df1d
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/header.htm
+@@ -0,0 +1,8 @@
++<%+header%>
++<form method="post" name="cbi" action="<%=REQUEST_URI%>" enctype="multipart/form-data" onreset="return cbi_validate_reset(this)" onsubmit="return cbi_validate_form(this, '<%:Some fields are invalid, cannot save values!%>')">
++ <div>
++ <script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++ <input type="hidden" name="token" value="<%=token%>" />
++ <input type="hidden" name="cbi.submit" value="1" />
++ <input type="submit" value="<%:Save%>" class="hidden" />
++ </div>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/lvalue.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/lvalue.htm
+new file mode 100644
+index 0000000..8cc086d
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/lvalue.htm
+@@ -0,0 +1,18 @@
++<%+cbi/valueheader%>
++<% if self.widget == "select" then %>
++ <select class="cbi-input-select" onchange="cbi_d_update(this.id)"<%= attr("id", cbid) .. attr("name", cbid) .. ifattr(self.size, "size") %>>
++ <% for i, key in pairs(self.keylist) do -%>
++ <option id="cbi-<%=self.config.."-"..section.."-"..self.option.."-"..key%>"<%= attr("value", key) .. ifattr(tostring(self:cfgvalue(section) or self.default) == key, "selected", "selected") %>><%=striptags(self.vallist[i])%></option>
++ <%- end %>
++ </select>
++<% elseif self.widget == "radio" then
++ local c = 0
++ for i, key in pairs(self.keylist) do
++ c = c + 1
++%>
++ <input class="cbi-input-radio" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)" type="radio"<%= attr("id", cbid..c) .. attr("name", cbid) .. attr("value", key) .. ifattr((self:cfgvalue(section) or self.default) == key, "checked", "checked") %> />
++ <label<%= attr("for", cbid..c) %>><%=self.vallist[i]%></label>
++<% if c == self.size then c = 0 %><% if self.orientation == "horizontal" then %>&#160;<% else %><br /><% end %>
++<% end end %>
++<% end %>
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/map.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/map.htm
+new file mode 100644
+index 0000000..e90c3f5
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/map.htm
+@@ -0,0 +1,13 @@
++<%- if firstmap and messages then local msg; for _, msg in ipairs(messages) do -%>
++ <div class="errorbox"><%=pcdata(msg)%></div>
++<%- end end -%>
++
++<%-+cbi/apply_xhr-%>
++
++<div class="cbi-map" id="cbi-<%=self.config%>">
++ <% 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 %>
++ <%- if firstmap and applymap then cbi_apply_xhr(self.config, parsechain, redirect) end -%>
++ <%- self:render_children() %>
++ <br />
++</div>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/mvalue.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/mvalue.htm
+new file mode 100644
+index 0000000..6a0b388
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/mvalue.htm
+@@ -0,0 +1,19 @@
++<% local v = self:valuelist(section) or {} -%>
++<%+cbi/valueheader%>
++<% if self.widget == "select" then %>
++ <select class="cbi-input-select" multiple="multiple" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%= attr("name", cbid) .. ifattr(self.size, "size") %>>
++ <% for i, key in pairs(self.keylist) do -%>
++ <option<%= attr("value", key) .. ifattr(luci.util.contains(v, key), "selected", "selected") %>><%=striptags(self.vallist[i])%></option>
++ <%- end %>
++ </select>
++<% elseif self.widget == "checkbox" then
++ local c = 0;
++ for i, key in pairs(self.keylist) do
++ c = c + 1
++%>
++ <input class="cbi-input-checkbox" type="checkbox" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%= attr("id", cbid..c) .. attr("name", cbid) .. attr("value", key) .. ifattr(luci.util.contains(v, key), "checked", "checked") %> />
++ <label<%= attr("for", cbid..c) %>><%=self.vallist[i]%></label><br />
++<% if c == self.size then c = 0 %><br />
++<% end end %>
++<% end %>
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/network_ifacelist.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_ifacelist.htm
+new file mode 100644
+index 0000000..643d849
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_ifacelist.htm
+@@ -0,0 +1,81 @@
++<%+cbi/valueheader%>
++
++<%-
++ local utl = require "luci.util"
++ local net = require "luci.model.network".init()
++ local cbeid = luci.cbi.FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option
++
++ local iface
++ local ifaces = net:get_interfaces()
++ local value
++
++ if self.map:formvalue(cbeid) == "1" then
++ value = self:formvalue(section) or self.default or ""
++ else
++ value = self:cfgvalue(section) or self.default
++ end
++
++ local checked = { }
++
++ if value then
++ for value in utl.imatch(value) do
++ checked[value] = true
++ end
++ else
++ local n = self.network and net:get_network(self.network)
++ if n then
++ local i
++ for _, i in ipairs(n:get_interfaces() or { n:get_interface() }) do
++ checked[i:name()] = true
++ end
++ end
++ end
++-%>
++
++<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"%>" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%=
++ attr("type", self.widget or "radio") ..
++ attr("id", cbid .. "." .. iface:name()) ..
++ attr("name", cbid) .. attr("value", iface:name()) ..
++ ifattr(checked[iface:name()], "checked", "checked")
++ %> /> &#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"%>" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%=
++ attr("type", self.widget or "radio") ..
++ attr("id", cbid .. "_custom") ..
++ attr("name", cbid) ..
++ attr("value", " ")
++ %> /> &#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>
++
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netinfo.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netinfo.htm
+new file mode 100644
+index 0000000..4fd8411
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netinfo.htm
+@@ -0,0 +1,27 @@
++<%+cbi/valueheader%>
++
++<%-
++ local value = self:formvalue(section)
++ if not value or value == "-" then
++ value = self:cfgvalue(section) or self.default
++ end
++
++ local nwm = require "luci.model.network".init()
++ local net = nwm:get_network(value)
++-%>
++
++<% if net then %>
++<span class="ifacebadge"><%=net:name()%>:
++ <%
++ local empty = true
++ for _, iface in ipairs(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 %>
++</span>
++<% end %>
++
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netlist.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netlist.htm
+new file mode 100644
+index 0000000..4f186ca
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netlist.htm
+@@ -0,0 +1,82 @@
++<%+cbi/valueheader%>
++
++<%-
++ local utl = require "luci.util"
++ local nwm = require "luci.model.network".init()
++
++ local net, iface
++ local networks = nwm:get_networks()
++ local value = self:formvalue(section)
++
++ self.cast = nil
++
++ if not value or value == "-" then
++ value = self:cfgvalue(section) or self.default
++ end
++
++ local checked = { }
++ for value in utl.imatch(value) do
++ checked[value] = true
++ 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"%>" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%=
++ 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())%>>
++ <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 %>
++ </span>
++ </label>
++ </li>
++ <% end end %>
++
++ <% if not self.nocreate then %>
++ <li style="padding:0.25em 0">
++ <input class="cbi-input-<%=self.widget or "radio"%>" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%=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;
++ <div style="padding:0.5em; display:inline">
++ <label<%=attr("for", cbid .. "_new")%>><em>
++ <%- if self.widget == "checkbox" then -%>
++ <%:create:%>
++ <%- else -%>
++ <%:unspecified -or- create:%>
++ <%- end -%>&#160;</em></label>
++ <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"%>" onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%=
++ 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>
++
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/nsection.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/nsection.htm
+new file mode 100644
+index 0000000..32e73e7
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/nsection.htm
+@@ -0,0 +1,31 @@
++<% if self:cfgvalue(self.section) then section = self.section %>
++ <fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=section%>">
++ <% if self.title and #self.title > 0 then -%>
++ <legend><%=self.title%></legend>
++ <%- end %>
++ <% if self.description and #self.description > 0 then -%>
++ <div class="cbi-section-descr"><%=self.description%></div>
++ <%- end %>
++ <% if self.addremove then -%>
++ <div class="cbi-section-remove right">
++ <input type="submit" class="cbi-button" name="cbi.rns.<%=self.config%>.<%=section%>" value="<%:Delete%>" />
++ </div>
++ <%- end %>
++ <%+cbi/tabmenu%>
++ <div class="cbi-section-node<% if self.tabs then %> cbi-section-node-tabbed<% end %>" id="cbi-<%=self.config%>-<%=section%>">
++ <%+cbi/ucisection%>
++ </div>
++ <br />
++ </fieldset>
++<% elseif self.addremove then %>
++ <% if self.template_addremove then include(self.template_addremove) else -%>
++ <fieldset 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>
++ <%- end %>
++<% end %>
++<!-- /nsection -->
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/nullsection.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/nullsection.htm
+new file mode 100644
+index 0000000..bd48950
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/nullsection.htm
+@@ -0,0 +1,38 @@
++<fieldset class="cbi-section">
++ <% if self.title and #self.title > 0 then -%>
++ <legend><%=self.title%></legend>
++ <%- end %>
++ <% if self.description and #self.description > 0 then -%>
++ <div class="cbi-section-descr"><%=self.description%></div>
++ <%- end %>
++ <div class="cbi-section-node" id="cbi-<%=self.config%>-<%=tostring(self):sub(8)%>">
++ <div>
++ <% self:render_children(1, scope or {}) %>
++ </div>
++ <% if self.error and self.error[1] then -%>
++ <div class="cbi-section-error">
++ <ul><% for _, e in ipairs(self.error[1]) do -%>
++ <li>
++ <%- if e == "invalid" then -%>
++ <%:One or more fields contain invalid values!%>
++ <%- elseif e == "missing" then -%>
++ <%:One or more required fields have no value!%>
++ <%- else -%>
++ <%=pcdata(e)%>
++ <%- end -%>
++ </li>
++ <%- end %></ul>
++ </div>
++ <%- end %>
++ </div>
++ <br />
++</fieldset>
++<%-
++ if type(self.hidden) == "table" then
++ for k, v in pairs(self.hidden) do
++-%>
++ <input type="hidden" id="<%=k%>" name="<%=k%>" value="<%=pcdata(v)%>" />
++<%-
++ end
++ end
++%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/simpleform.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/simpleform.htm
+new file mode 100644
+index 0000000..78f5c5a
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/simpleform.htm
+@@ -0,0 +1,58 @@
++<% if not self.embedded then %>
++<form method="post" enctype="multipart/form-data" action="<%=REQUEST_URI%>">
++ <div>
++ <script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++ <input type="hidden" name="token" value="<%=token%>" />
++ <input type="hidden" name="cbi.submit" value="1" />
++ </div>
++<% end %>
++ <div class="cbi-map" id="cbi-<%=self.config%>">
++ <% 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 self.errmessage then %>
++ <div class="error"><%=self.errmessage%></div>
++<%- end %>
++<% if not self.embedded then %>
++ <div class="cbi-page-actions">
++<%-
++ if type(self.hidden) == "table" then
++ for k, v in pairs(self.hidden) do
++-%>
++ <input type="hidden" id="<%=k%>" name="<%=k%>" value="<%=pcdata(v)%>" />
++<%-
++ end
++ 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>
++<% end %>
++<%- if self.flow and self.flow.skip then %>
++ <input class="cbi-button cbi-button-skip" type="submit" name="cbi.skip" value="<%:Skip%>" />
++<% end %>
++<%- if self.submit ~= false then %>
++ <input class="cbi-button cbi-button-save" type="submit" value="
++ <%- if not self.submit then -%><%-:Submit-%><%-else-%><%=self.submit%><%end-%>
++ " />
++<% end %>
++<%- if self.reset ~= false then %>
++ <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 %>
++ <script type="text/javascript">cbi_d_update();</script>
++ </div>
++</form>
++<% end %>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/tabcontainer.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/tabcontainer.htm
+new file mode 100644
+index 0000000..38c435d
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/tabcontainer.htm
+@@ -0,0 +1,7 @@
++<% for tab, data in pairs(self.tabs) do %>
++ <div class="cbi-tabcontainer" id="container.<%=self.config%>.<%=section%>.<%=tab%>"<% if tab ~= self.selected_tab then %> style="display:none"<% end %>>
++ <% if data.description then %><div class="cbi-tab-descr"><%=data.description%></div><% end %>
++ <% self:render_tab(tab, section, scope or {}) %>
++ </div>
++ <script type="text/javascript">cbi_t_add('<%=self.config%>.<%=section%>', '<%=tab%>')</script>
++<% end %>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/tabmenu.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/tabmenu.htm
+new file mode 100644
+index 0000000..b96ac9c
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/tabmenu.htm
+@@ -0,0 +1,13 @@
++<%- if self.tabs then %>
++ <ul class="cbi-tabmenu">
++ <%- self.selected_tab = luci.http.formvalue("tab." .. self.config .. "." .. section) %>
++ <%- for _, tab in ipairs(self.tab_names) do if #self.tabs[tab].childs > 0 then %>
++ <script type="text/javascript">cbi_c['container.<%=self.config%>.<%=section%>.<%=tab%>'] = <%=#self.tabs[tab].childs%>;</script>
++ <%- if not self.selected_tab then self.selected_tab = tab end %>
++ <li id="tab.<%=self.config%>.<%=section%>.<%=tab%>" class="cbi-tab<%=(tab == self.selected_tab) and '' or '-disabled'%>">
++ <a onclick="this.blur(); return cbi_t_switch('<%=self.config%>.<%=section%>', '<%=tab%>')" href="<%=REQUEST_URI%>?tab.<%=self.config%>.<%=section%>=<%=tab%>"><%=self.tabs[tab].title%></a>
++ <% if tab == self.selected_tab then %><input type="hidden" id="tab.<%=self.config%>.<%=section%>" name="tab.<%=self.config%>.<%=section%>" value="<%=tab%>" /><% end %>
++ </li>
++ <% end end -%>
++ </ul>
++<% end -%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/tblsection.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/tblsection.htm
+new file mode 100644
+index 0000000..d928791
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/tblsection.htm
+@@ -0,0 +1,146 @@
++<%-
++local rowcnt = 1
++function rowstyle()
++ rowcnt = rowcnt + 1
++ return (rowcnt % 2) + 1
++end
++
++function width(o)
++ if o.width then
++ if type(o.width) == 'number' then
++ return ' style="width:%dpx"' % o.width
++ end
++ return ' style="width:%s"' % o.width
++ end
++ return ''
++end
++-%>
++
++<!-- tblsection -->
++<fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
++ <% if self.title and #self.title > 0 then -%>
++ <legend><%=self.title%></legend>
++ <%- end %>
++ <%- if self.sortable then -%>
++ <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 -%>
++ <%- 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>
++ <%- 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 %>
++
++
++ <%-
++ for k, node in ipairs(self.children) do
++ if not node.optional then
++ node:render(section, scope or {})
++ end
++ 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 -%>
++
++ <%- if isempty then -%>
++ <tr class="cbi-section-table-row">
++ <td colspan="<%=count%>"><em><br /><%:This section contains no values yet%></em></td>
++ </tr>
++ <%- 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 %>
++
++ <%- 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%>" />
++ <script type="text/javascript">cbi_validate_field('cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>', true, 'uciname');</script>
++ <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 %>
++ <%- end -%>
++ </div>
++</fieldset>
++<!-- /tblsection -->
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/tsection.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/tsection.htm
+new file mode 100644
+index 0000000..087548b
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/tsection.htm
+@@ -0,0 +1,48 @@
++<fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
++ <% if self.title and #self.title > 0 then -%>
++ <legend><%=self.title%></legend>
++ <%- end %>
++ <div class="cbi-section-descr"><%=self.description%></div>
++ <% local isempty = true for i, k in ipairs(self:cfgsections()) do -%>
++ <% if self.addremove then -%>
++ <div class="cbi-section-remove right">
++ <input type="submit" name="cbi.rts.<%=self.config%>.<%=k%>" onclick="this.form.cbi_state='del-section'; return true" value="<%:Delete%>" class="cbi-button" />
++ </div>
++ <%- end %>
++
++ <%- section = k; isempty = false -%>
++
++ <% if not self.anonymous then -%>
++ <h3><%=section:upper()%></h3>
++ <%- end %>
++
++ <%+cbi/tabmenu%>
++
++ <fieldset class="cbi-section-node<% if self.tabs then %> cbi-section-node-tabbed<% end %>" id="cbi-<%=self.config%>-<%=section%>">
++ <%+cbi/ucisection%>
++ </fieldset>
++ <br />
++ <%- end %>
++
++ <% if isempty then -%>
++ <em><%:This section contains no values yet%><br /><br /></em>
++ <%- end %>
++
++ <% if self.addremove then -%>
++ <% if self.template_addremove then include(self.template_addremove) else -%>
++ <div class="cbi-section-create">
++ <% 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%>" />
++ <script type="text/javascript">cbi_validate_field('cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>', true, 'uciname');</script>
++ <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>
++ <%- end %>
++ <%- end %>
++ </div>
++ <%- end %>
++ <%- end %>
++</fieldset>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/tvalue.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/tvalue.htm
+new file mode 100644
+index 0000000..4841c37
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/tvalue.htm
+@@ -0,0 +1,5 @@
++<%+cbi/valueheader%>
++ <textarea class="cbi-input-textarea" <% if not self.size then %> style="width: 100%"<% else %> cols="<%=self.size%>"<% end %> onchange="cbi_d_update(this.id)"<%= attr("name", cbid) .. attr("id", cbid) .. ifattr(self.rows, "rows") .. ifattr(self.wrap, "wrap") .. ifattr(self.readonly, "readonly") %>>
++ <%-=pcdata(self:cfgvalue(section))-%>
++ </textarea>
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/ucisection.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/ucisection.htm
+new file mode 100644
+index 0000000..3b69f12
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/ucisection.htm
+@@ -0,0 +1,75 @@
++<%-
++ if type(self.hidden) == "table" then
++ for k, v in pairs(self.hidden) do
++-%>
++ <input type="hidden" id="<%=k%>" name="<%=k%>" value="<%=pcdata(v)%>" />
++<%-
++ end
++ end
++%>
++
++<% if self.tabs then %>
++ <%+cbi/tabcontainer%>
++<% else %>
++ <% self:render_children(section, scope or {}) %>
++<% end %>
++
++<% if self.error and self.error[section] then -%>
++ <div class="cbi-section-error">
++ <ul><% for _, e in ipairs(self.error[section]) do -%>
++ <li>
++ <%- if e == "invalid" then -%>
++ <%:One or more fields contain invalid values!%>
++ <%- elseif e == "missing" then -%>
++ <%:One or more required fields have no value!%>
++ <%- else -%>
++ <%=pcdata(e)%>
++ <%- end -%>
++ </li>
++ <%- end %></ul>
++ </div>
++<%- end %>
++
++<% if self.optionals[section] and #self.optionals[section] > 0 or self.dynamic then %>
++ <div class="cbi-optionals">
++ <% if self.dynamic then %>
++ <input type="text" id="cbi.opt.<%=self.config%>.<%=section%>" name="cbi.opt.<%=self.config%>.<%=section%>" />
++ <% if self.optionals[section] and #self.optionals[section] > 0 then %>
++ <script type="text/javascript">
++ cbi_combobox_init('cbi.opt.<%=self.config%>.<%=section%>', {
++ <%-
++ for i, val in pairs(self.optionals[section]) do
++ -%>
++ <%-=string.format("%q", val.option) .. ":" .. string.format("%q", striptags(val.title))-%>
++ <%-if next(self.optionals[section], i) then-%>,<%-end-%>
++ <%-
++ end
++ -%>
++ }, '', '<%-: -- custom -- -%>');
++ </script>
++ <% end %>
++ <% else %>
++ <select id="cbi.opt.<%=self.config%>.<%=section%>" name="cbi.opt.<%=self.config%>.<%=section%>">
++ <option><%: -- Additional Field -- %></option>
++ <% for key, val in pairs(self.optionals[section]) do -%>
++ <option id="cbi-<%=self.config.."-"..section.."-"..val.option%>" value="<%=val.option%>"><%=striptags(val.title)%></option>
++ <%- end %>
++ </select>
++ <script type="text/javascript"><% for key, val in pairs(self.optionals[section]) do %>
++ <% if #val.deps > 0 then %><% for j, d in ipairs(val.deps) do -%>
++ cbi_d_add("cbi-<%=self.config.."-"..section.."-"..val.option..d.add%>", {
++ <%-
++ for k,v in pairs(d.deps) do
++ -%>
++ <%-=string.format('"cbid.%s.%s.%s"', self.config, section, k) .. ":" .. string.format("%q", v)-%>
++ <%-if next(d.deps, k) then-%>,<%-end-%>
++ <%-
++ end
++ -%>
++ });
++ <%- end %><% end %>
++ <% end %></script>
++ <% end %>
++ <input type="submit" class="cbi-button cbi-button-fieldadd" value="<%:Add%>" />
++ </div>
++<% end %>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/upload.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/upload.htm
+new file mode 100644
+index 0000000..7770934
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/upload.htm
+@@ -0,0 +1,14 @@
++<%
++ local t = require("luci.tools.webadmin")
++ local v = self:cfgvalue(section)
++ local s = v and nixio.fs.stat(v)
++-%>
++<%+cbi/valueheader%>
++ <% if s then %>
++ <%:Uploaded File%> (<%=t.byte_format(s.size)%>)
++ <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" />
++ <% else %>
++ <input class="cbi-input-file" type="file"<%= attr("name", cbid) .. attr("id", cbid) %> />
++ <% end %>
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/value.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/value.htm
+new file mode 100644
+index 0000000..8a08e08
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/value.htm
+@@ -0,0 +1,36 @@
++<%+cbi/valueheader%>
++ <input type="<%=self.password and 'password" class="cbi-input-password' or 'text" class="cbi-input-text' %>" onchange="cbi_d_update(this.id)"<%=
++ attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section) or self.default) ..
++ ifattr(self.size, "size") .. ifattr(self.placeholder, "placeholder") ..
++ ifattr(self.readonly, "readonly") .. ifattr(self.maxlength, "maxlength")
++ %> />
++ <% if self.password then %><img src="<%=resource%>/cbi/reload.gif" style="vertical-align:middle" title="<%:Reveal/hide password%>" onclick="var e = document.getElementById('<%=cbid%>'); e.type = (e.type=='password') ? 'text' : 'password';" /><% end %>
++ <% if #self.keylist > 0 or self.datatype then -%>
++ <script type="text/javascript">//<![CDATA[
++ <% if #self.keylist > 0 then -%>
++ cbi_combobox_init('<%=cbid%>', {
++ <%-
++ for i, k in ipairs(self.keylist) do
++ -%>
++ <%-=string.format("%q", k) .. ":" .. string.format("%q", self.vallist[i])-%>
++ <%-if i<#self.keylist then-%>,<%-end-%>
++ <%-
++ end
++ -%>
++ }, '<%- if not self.rmempty and not self.optional then -%>
++ <%-: -- Please choose -- -%>
++ <%- elseif self.placeholder then -%>
++ <%-= pcdata(self.placeholder) -%>
++ <%- end -%>', '
++ <%- if self.combobox_manual then -%>
++ <%-=self.combobox_manual-%>
++ <%- else -%>
++ <%-: -- custom -- -%>
++ <%- end -%>');
++ <%- end %>
++ <% if self.datatype then -%>
++ cbi_validate_field('<%=cbid%>', <%=tostring((self.optional or self.rmempty) == true)%>, '<%=self.datatype:gsub("'", "\\'")%>');
++ <%- end %>
++ //]]></script>
++ <% end -%>
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/valuefooter.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/valuefooter.htm
+new file mode 100644
+index 0000000..805312e
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/valuefooter.htm
+@@ -0,0 +1 @@
++<% include( valuefooter or "cbi/full_valuefooter" ) %>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/valueheader.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/valueheader.htm
+new file mode 100644
+index 0000000..761a54a
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/valueheader.htm
+@@ -0,0 +1 @@
++<% include( valueheader or "cbi/full_valueheader" ) %>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/csrftoken.htm b/feeds/luci/modules/luci-base/luasrc/view/csrftoken.htm
+new file mode 100644
+index 0000000..57ac03f
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/csrftoken.htm
+@@ -0,0 +1,24 @@
++<%#
++ Copyright 2015 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Form token mismatch%></h2>
++<br />
++
++<p class="alert-message"><%:The submitted security token is invalid or already expired!%></p>
++
++<p><%:
++ In order to prevent unauthorized access to the system, your request has
++ been blocked. Click "Continue »" below to return to the previous page.
++%></p>
++
++<hr />
++
++<p class="right">
++ <strong><a href="#" onclick="window.history.back();">Continue »</a></strong>
++</p>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/error404.htm b/feeds/luci/modules/luci-base/luasrc/view/error404.htm
+new file mode 100644
+index 0000000..bc74226
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/error404.htm
+@@ -0,0 +1,11 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content">404 <%:Not Found%></h2>
++<p><%:Sorry, the object you requested was not found.%></p>
++<tt><%:Unable to dispatch%>: <%=luci.http.request.env.PATH_INFO%></tt>
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/error500.htm b/feeds/luci/modules/luci-base/luasrc/view/error500.htm
+new file mode 100644
+index 0000000..34a52cd
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/error500.htm
+@@ -0,0 +1,11 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content">500 <%:Internal Server Error%></h2>
++<p><%:Sorry, the server encountered an unexpected error.%></p>
++<pre class="error500"><%=message%></pre>
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/footer.htm b/feeds/luci/modules/luci-base/luasrc/view/footer.htm
+new file mode 100644
+index 0000000..f3574b6
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/footer.htm
+@@ -0,0 +1,7 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<% include("themes/" .. theme .. "/footer") %>
+\ No newline at end of file
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/header.htm b/feeds/luci/modules/luci-base/luasrc/view/header.htm
+new file mode 100644
+index 0000000..f6e20c9
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/header.htm
+@@ -0,0 +1,12 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++ if not luci.dispatcher.context.template_header_sent then
++ include("themes/" .. theme .. "/header")
++ luci.dispatcher.context.template_header_sent = true
++ end
++%>
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/indexer.htm b/feeds/luci/modules/luci-base/luasrc/view/indexer.htm
+new file mode 100644
+index 0000000..28fc3de
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/indexer.htm
+@@ -0,0 +1,7 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<% include("themes/" .. theme .. "/indexer") %>
+\ No newline at end of file
+diff --git a/feeds/luci/modules/luci-base/luasrc/view/sysauth.htm b/feeds/luci/modules/luci-base/luasrc/view/sysauth.htm
+new file mode 100644
+index 0000000..e207504
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/luasrc/view/sysauth.htm
+@@ -0,0 +1,73 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2012 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<form method="post" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>">
++ <div class="cbi-map">
++ <h2 name="content"><%:Authorization Required%></h2>
++ <div class="cbi-map-descr">
++ <%:Please enter your username and password.%>
++ <%- if fuser then %>
++ <div class="error"><%:Invalid username and/or password! Please try again.%></div>
++ <br />
++ <% end -%>
++ </div>
++ <fieldset class="cbi-section"><fieldset 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%>" />
++ </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" />
++ </div>
++ </div>
++ </fieldset></fieldset>
++ </div>
++
++ <div>
++ <input type="submit" value="<%:Login%>" class="cbi-button cbi-button-apply" />
++ <input type="reset" value="<%:Reset%>" class="cbi-button cbi-button-reset" />
++ </div>
++</form>
++<script type="text/javascript">//<![CDATA[
++ var input = document.getElementsByName('luci_password')[0];
++ if (input)
++ input.focus();
++//]]></script>
++
++<%
++local uci = require "luci.model.uci".cursor()
++local fs = require "nixio.fs"
++local https_key = uci:get("uhttpd", "main", "key")
++local https_port = uci:get("uhttpd", "main", "listen_https")
++if type(https_port) == "table" then
++ https_port = https_port[1]
++end
++
++if https_port and fs.access(https_key) then
++ https_port = https_port:match("(%d+)$")
++%>
++
++<script type="text/javascript">//<![CDATA[
++ if (document.location.protocol != 'https:') {
++ var url = 'https://' + window.location.hostname + ':' + '<%=https_port%>' + window.location.pathname;
++ var img=new Image;
++ img.onload=function(){window.location = url};
++ img.src='https://' + window.location.hostname + ':' + '<%=https_port%>' + '<%=resource%>/cbi/up.gif?' + Math.random();;
++ setTimeout(function(){
++ img.src=''
++ }, 5000);
++ }
++//]]></script>
++
++<% end %>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-base/po/ca/base.po b/feeds/luci/modules/luci-base/po/ca/base.po
+new file mode 100644
+index 0000000..378b295
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/ca/base.po
+@@ -0,0 +1,4076 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-06-06 11:17+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(finestra de %d minuts, interval de %d segons)"
++
++msgid "(%s available)"
++msgstr "(%s disponibles)"
++
++msgid "(empty)"
++msgstr "(buit)"
++
++msgid "(no interfaces attached)"
++msgstr "(sense interfícies adjuntes)"
++
++msgid "-- Additional Field --"
++msgstr "-- Camp addicional --"
++
++msgid "-- Please choose --"
++msgstr "-- Escolliu, si us plau --"
++
++msgid "-- custom --"
++msgstr "-- personalitzat --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Càrrega d'1 minut:"
++
++msgid "15 Minute Load:"
++msgstr "Càrrega de 15 minuts:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Càrrega de 5 minuts:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "Port de consulta <abbr title=\"Domain Name System\">DNS</abbr> "
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "Port del servidor <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"Es consultaran els servidors <abbr title=\"Domain Name System\">DNS</abbr> "
++"segons l'ordre del fitxer de resolució"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "Adreça <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "Passarel·la <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr ""
++"Màscara de xarxa <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"Adreça <abbr title=\"Internet Protocol Version 6\">IPv6</abbr> o Xarxa (CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "Passarel·la <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "Configuració <abbr title=\"Light Emitting Diode\">LED</abbr>"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "Nom <abbr title=\"Light Emitting Diode\">LED</abbr>"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "Adreça <abbr title=\"Media Access Control\">MAC</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"Arrendaments de <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> <abbr title=\"màxims\">max.</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"Mida <abbr title=\"màxima\">màx.</abbr> de paquet <abbr title=\"Extension "
++"Mechanisms for Domain Name System\">EDNS0</abbr>"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "Consultes concurrents <abbr title=\"màximes\">max.</abbr>"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Parella: %s / Grup: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "Suport AR"
++
++msgid "ARP retry threshold"
++msgstr "Llindar de reintent ARP"
++
++msgid "ATM Bridges"
++msgstr "Ponts ATM"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "Identificador de canal virtual (VCI) ATM"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "Identificador de camí virtual (VPI) ATM"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"Els ponts ATM mostren ethernet encapsulat en connexions AAL5 com interfícies "
++"de xarxa virtual de Linux que es poden utilitzar conjuntament amb DHCP o PPP "
++"per trucar a la xarxa del proveïdor."
++
++msgid "ATM device number"
++msgstr "Número de dispositiu ATM"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Concentrador d'accés"
++
++msgid "Access Point"
++msgstr "Punt d'accés"
++
++msgid "Action"
++msgstr "Acció"
++
++msgid "Actions"
++msgstr "Accions"
++
++msgid "Activate this network"
++msgstr "Activa aquesta xarxa"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "Rutes <abbr title=\"Internet Protocol Version 4\">IPv4</abbr> actives"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "Rutes <abbr title=\"Internet Protocol Version 6\">IPv6</abbr> actives"
++
++msgid "Active Connections"
++msgstr "Connexions actives"
++
++msgid "Active DHCP Leases"
++msgstr "Arrendaments DHCP actius"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Arrendaments DHCPv6 actius"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Afegeix"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++"Afegeix el sufix de domini local als noms servits des dels fitxers de hosts"
++
++msgid "Add new interface..."
++msgstr "Afegeix una interfície nova..."
++
++msgid "Additional Hosts files"
++msgstr "Fitxers de Hosts addicionals"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Adreça"
++
++msgid "Address to access local relay bridge"
++msgstr "Adreça per accedir al relay bridge local"
++
++msgid "Administration"
++msgstr "Administració"
++
++msgid "Advanced Settings"
++msgstr "Paràmetres avançats"
++
++msgid "Alert"
++msgstr "Alerta"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"Permet autenticació <abbr title=\"Secure Shell\">SSH</abbr> per contrasenya"
++
++msgid "Allow all except listed"
++msgstr "Permet-les totes menys les llistades"
++
++msgid "Allow listed only"
++msgstr "Permet només les llistades"
++
++msgid "Allow localhost"
++msgstr "Permetre el localhost"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"Permetre a màquines remotes de connectar als ports reenviats de l'SSH local"
++
++msgid "Allow root logins with password"
++msgstr "Permetre l'accés del l'administrador amb paraula clau"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "Permetre l'accés de l'usurari <em>root</em> amb paraula clau"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr "Permet respostes del rang 127.0.0.0/8, p.e. per serveis RBL"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "Es crearà una xarxa addicional si deixes això sense marcar."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antena 1"
++
++msgid "Antenna 2"
++msgstr "Antena 2"
++
++msgid "Antenna Configuration"
++msgstr "Configuració d'antena"
++
++msgid "Any zone"
++msgstr "Qualsevol zona"
++
++msgid "Apply"
++msgstr "Aplica"
++
++msgid "Applying changes"
++msgstr "Aplicant els canvis"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Assigna interfícies..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Estacions associades"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Controlador sense fils d'Atheros 802.11%s"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Autenticació"
++
++msgid "Authoritative"
++msgstr "Autoritzada"
++
++msgid "Authorization Required"
++msgstr "Es requereix autenticació"
++
++msgid "Auto Refresh"
++msgstr "Refresc automàtic"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Disponible"
++
++msgid "Available packages"
++msgstr "Paquets disponibles"
++
++msgid "Average:"
++msgstr "Mitjana:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Enrere"
++
++msgid "Back to Overview"
++msgstr "Enrere al Resum"
++
++msgid "Back to configuration"
++msgstr "Enrere a la configuració"
++
++msgid "Back to overview"
++msgstr "Enrere al resum"
++
++# Endarrere cap a resultats d'escaneig
++msgid "Back to scan results"
++msgstr "Enrere als resultats de l'escaneig"
++
++msgid "Background Scan"
++msgstr "Escaneig de fons"
++
++msgid "Backup / Flash Firmware"
++msgstr "Còpia de seguretat / Recàrrega de programari"
++
++msgid "Backup / Restore"
++msgstr "Còpia de seguretat / Restauració"
++
++msgid "Backup file list"
++msgstr "Llista de còpies de seguretat"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"A sota hi ha la llista determinada de fitxers per fer-ne còpia. Consisteix "
++"en els fitxers de configuració canviats i marcats per l'opkg, fitxers base "
++"essencials i els patrons de còpia de seguretat definits per l'usuari."
++
++msgid "Bitrate"
++msgstr "Velocitat de bits"
++
++msgid "Bogus NX Domain Override"
++msgstr "Substitució dels dominis NX falsos"
++
++msgid "Bridge"
++msgstr "Pont"
++
++msgid "Bridge interfaces"
++msgstr "Pont d'interfícies"
++
++msgid "Bridge unit number"
++msgstr "Número d'unitat de pont"
++
++msgid "Bring up on boot"
++msgstr "Aixecar a l'engegada"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Controlador sense fil Broadcom 802.11%s"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Controlador sense fil Broadcom BCM%04x 802.11"
++
++msgid "Buffered"
++msgstr "En memòria intermèdia"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Botons"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "Ús de CPU (%)"
++
++msgid "Cancel"
++msgstr "Cancel·la"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Cadena"
++
++msgid "Changes"
++msgstr "Canvis"
++
++msgid "Changes applied."
++msgstr "Canvis aplicats."
++
++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 "Check"
++msgstr "Comprovació"
++
++msgid "Checksum"
++msgstr "Suma de verificació"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Escolliu la zona de tallafocs que voleu assignar a aquesta interfície. Trieu "
++"<em>sense especificar</em> per esborrar la interfície de la zona associada o "
++"ompliu el camp <em>crea</em> per definir una nova zona i adjuntar-hi la "
++"interfície."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Trieu les xarxes que voleu adjuntar a la interfície sense fil o ompliu el "
++"camp <em>crea</em> per definir una xarxa nova."
++
++msgid "Cipher"
++msgstr "Xifra"
++
++msgid ""
++"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)."
++msgstr ""
++
++msgid "Client"
++msgstr "Client"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "ID de client a enviar en les sol·licituds DHCP"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++
++msgid "Close list..."
++msgstr "Tanca la llista..."
++
++msgid "Collecting data..."
++msgstr "Aplegant dades..."
++
++msgid "Command"
++msgstr "Ordre"
++
++msgid "Common Configuration"
++msgstr "Configuració comuna"
++
++msgid "Compression"
++msgstr "Compressió"
++
++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 "Confirmation"
++msgstr "Confirmació"
++
++msgid "Connect"
++msgstr "Connecta"
++
++msgid "Connected"
++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 "Country"
++msgstr "País"
++
++msgid "Country Code"
++msgstr "Codi de País"
++
++msgid "Cover the following interface"
++msgstr "Cobreix la interfície següent"
++
++msgid "Cover the following interfaces"
++msgstr "Cobreix les interfícies següents"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Crea / Assigna zona de tallafocs"
++
++msgid "Create Interface"
++msgstr "Crea interfície"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Crea un pont entre múltiples interfícies"
++
++msgid "Critical"
++msgstr "Crític"
++
++msgid "Cron Log Level"
++msgstr "Nivell de registre del Cron"
++
++msgid "Custom Interface"
++msgstr "Interfície personalitzada"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Personalitza el comportament dels <abbr title=\"Light Emitting Diode\">LED</"
++"abbr>s del dispositiu si és possible."
++
++msgid "DHCP Leases"
++msgstr "Arrendaments DHCP"
++
++msgid "DHCP Server"
++msgstr "Servidor DHCP"
++
++msgid "DHCP and DNS"
++msgstr "DHCP i DNS"
++
++msgid "DHCP client"
++msgstr "Client DHCP"
++
++msgid "DHCP-Options"
++msgstr "Opcions DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr "Arrendaments DHCPv6"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "Reenviaments DNS"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Depuració"
++
++msgid "Default %d"
++msgstr "%d per defecte"
++
++msgid "Default gateway"
++msgstr "Passarel·la per defecte"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Estat per defecte"
++
++msgid "Define a name for this network."
++msgstr "Definiu el nom d'aquesta xarxa"
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++
++msgid "Delete"
++msgstr "Suprimeix"
++
++msgid "Delete this interface"
++msgstr "Suprimeix aquesta interfície"
++
++msgid "Delete this network"
++msgstr "Suprimeix aquesta xarxa"
++
++msgid "Description"
++msgstr "Descripció"
++
++msgid "Design"
++msgstr "Disseny"
++
++msgid "Destination"
++msgstr "Destí"
++
++msgid "Device"
++msgstr "Dispositiu"
++
++msgid "Device Configuration"
++msgstr "Configuració de dispositiu"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnòstics"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Directori"
++
++msgid "Disable"
++msgstr "Inhabilita"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Inhabilita el <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> en aquesta interfície."
++
++msgid "Disable DNS setup"
++msgstr ""
++
++msgid "Disable HW-Beacon timer"
++msgstr "Inhabilita el temporitzador HW-Beacon"
++
++msgid "Disabled"
++msgstr "Inhabilitat"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Descarta les respostes RFC1918 des de dalt"
++
++msgid "Displaying only packages containing"
++msgstr "Mostrant només els paquets que contenen"
++
++msgid "Distance Optimization"
++msgstr "Optimització de distància"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Distància al membre de la xarxa més allunyat en metres."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Diversitat"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"El Dnsmasq és un servidor <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr> combinat i un reenviador de <abbr title=\"Domain Name System"
++"\">DNS</abbr> per tallafocs <abbr title=\"Network Address Translation\">NAT</"
++"abbr>"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 ""
++
++msgid "Do not send probe responses"
++msgstr "No enviïs les respostes de prova"
++
++msgid "Domain required"
++msgstr "Es requereix un domini"
++
++msgid "Domain whitelist"
++msgstr ""
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"No reenviïs les peticions <abbr title=\"Domain Name System\">DNS</abbr> "
++"sense el nom <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid "Download and install package"
++msgstr "Descarrega i instal·la el paquet"
++
++msgid "Download backup"
++msgstr "Descarrega còpia de seguritat"
++
++msgid "Dropbear Instance"
++msgstr "Instància de Dropbear"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"El Dropbear ofereix accés per la xarxa a consola <abbr title=\"Secure Shell"
++"\">SSH</abbr>i un servidor <abbr title=\"Secure Copy\">SCP</abbr> integrat"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> dinàmic"
++
++msgid "Dynamic tunnel"
++msgstr "Túnel dinàmic"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "Mètode EAP"
++
++msgid "Edit"
++msgstr "Edita"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Edita aquesta interfície"
++
++msgid "Edit this network"
++msgstr "Edita aquesta xarxa"
++
++msgid "Emergency"
++msgstr "Emergència"
++
++msgid "Enable"
++msgstr "Habilita"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Habilita l'<abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr ""
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "Habilita el passatge de trames enormes"
++
++msgid "Enable NTP client"
++msgstr "Habilita el client NTP"
++
++msgid "Enable TFTP server"
++msgstr "Habilita el servidor TFTP"
++
++msgid "Enable VLAN functionality"
++msgstr "Habilita la funcionalitat VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Habilita l'aprenentatge i l'envelliment"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr ""
++
++msgid "Enable this swap"
++msgstr ""
++
++msgid "Enable/Disable"
++msgstr "Activa/Desactiva"
++
++msgid "Enabled"
++msgstr "Habilitat"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Habilita l'Spanning Tree Protocol a aquest pont"
++
++msgid "Encapsulation mode"
++msgstr "Mode d'encapsulació"
++
++msgid "Encryption"
++msgstr "Encriptació"
++
++msgid "Erasing..."
++msgstr "Esborrant..."
++
++msgid "Error"
++msgstr "Error"
++
++msgid "Ethernet Adapter"
++msgstr "Adaptador Ethernet"
++
++msgid "Ethernet Switch"
++msgstr "Switch Ethernet"
++
++msgid "Expand hosts"
++msgstr ""
++
++msgid "Expires"
++msgstr "Caduca"
++
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr ""
++
++msgid "External system log server port"
++msgstr ""
++
++msgid "Fast Frames"
++msgstr "Fast Frames"
++
++msgid "File"
++msgstr "Fitxer"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Nom de fitxer de la imatge d'inici que es publica als clients"
++
++msgid "Filesystem"
++msgstr "Sistema de fitxers"
++
++msgid "Filter"
++msgstr "Filtre"
++
++msgid "Filter private"
++msgstr "Filtra privat"
++
++msgid "Filter useless"
++msgstr "Filtra els no útils"
++
++msgid "Find and join network"
++msgstr "Troba i uneix-te a la xarxa"
++
++msgid "Find package"
++msgstr "Cerca paquet"
++
++msgid "Finish"
++msgstr "Acaba"
++
++msgid "Firewall"
++msgstr "Tallafocs"
++
++msgid "Firewall Settings"
++msgstr "Ajusts de tallafocs"
++
++msgid "Firewall Status"
++msgstr "Estat de tallafocs"
++
++msgid "Firmware Version"
++msgstr "Versió de microprogramari"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr ""
++
++msgid "Flags"
++msgstr "Flags"
++
++msgid "Flash Firmware"
++msgstr "Reescriu el microprogramari"
++
++msgid "Flash image..."
++msgstr "Escriu una imatge..."
++
++msgid "Flash new firmware image"
++msgstr "Escriu una imatge nova"
++
++msgid "Flash operations"
++msgstr "Operacions d'escriptura"
++
++msgid "Flashing..."
++msgstr "Escrivent..."
++
++msgid "Force"
++msgstr "Força"
++
++msgid "Force CCMP (AES)"
++msgstr "Força el CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr "Força el DHCP en aquesta xarxa encara que es detecti altre servidor."
++
++msgid "Force TKIP"
++msgstr "Força el TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "Força el TKIP i el CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "Reenvia el tràfic DHCP"
++
++msgid "Forward broadcast traffic"
++msgstr "Reenvia el tràfic difós"
++
++msgid "Forwarding mode"
++msgstr "Mode de reenviament"
++
++msgid "Fragmentation Threshold"
++msgstr "Llindar de fragmentació"
++
++msgid "Frame Bursting"
++msgstr ""
++
++msgid "Free"
++msgstr "Lliures"
++
++msgid "Free space"
++msgstr "Espai lliure"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "Només GPRS"
++
++msgid "Gateway"
++msgstr "Passarel·la"
++
++msgid "Gateway ports"
++msgstr "Ports de passarel·la"
++
++msgid "General Settings"
++msgstr "Ajusts generals"
++
++msgid "General Setup"
++msgstr ""
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr ""
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Controlador sense fil 802.11%s genèric"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++"La contrasenya i la confirmació de contrasenya no es coincideixen. La "
++"contrasenya no s'ha canviat!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Vés a la configuració de contrasenya"
++
++msgid "Go to relevant configuration page"
++msgstr "Vés a la pàgina de configuració"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "Contrasenya de HE.net"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr ""
++
++msgid "Hang Up"
++msgstr "Penja"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Ací pots configurar els aspectes bàsics del teu dispositiu, com el nom de la "
++"màquina o el fus horari."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Controlador sense fil Hermes 802.11b"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++"No mostris l'<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "Entrades de noms de màquina"
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "Xarxa o adreça <abbr title=\"Internet Protocol Address\">IP</abbr>"
++
++msgid "Hostname"
++msgstr "Nom de màquina"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr ""
++
++msgid "Hostnames"
++msgstr "Noms de màquina"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "Adreça IP"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "Tallafocs IPv4"
++
++msgid "IPv4 WAN Status"
++msgstr "Estat WAN IPv4"
++
++msgid "IPv4 address"
++msgstr "Adreça IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 i IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "Difusió IPv4"
++
++msgid "IPv4 gateway"
++msgstr "Passarel·la IPv4"
++
++msgid "IPv4 netmask"
++msgstr "Màscara de xarxa IPv4"
++
++msgid "IPv4 only"
++msgstr "Només IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "Longitud de prefix IPv4"
++
++msgid "IPv4-Address"
++msgstr "Adreça IPv6"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "Tallafocs IPv6"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "Estado WAN IPv6"
++
++msgid "IPv6 address"
++msgstr "Adreça IPv6"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "Passarel·la IPv6"
++
++msgid "IPv6 only"
++msgstr "Només IPv6"
++
++msgid "IPv6 prefix"
++msgstr "Prefix IPv6"
++
++msgid "IPv6 prefix length"
++msgstr "Longitud de prefix IPv6"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "Adreça IPv6"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-en-IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6-sobre-IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6-sobre-IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "Identitat"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++
++msgid "If unchecked, no default route is configured"
++msgstr ""
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Si la teva memòria física és insuficient, les dades no usades es poden "
++"intercanviar a un dispositiu d'intercanvi, pel qual hi haurà una quantitat "
++"més gran de memòria <abbr title=\"Random Access Memory\">RAM</abbr> usable. "
++"Tingues en compte que intercanviar dades és un procés molt lent, ja que no "
++"es pot accedir al dispositiu d'intercanvi amb unes taxes tan altes com les "
++"de la <abbr title=\"Random Access Memory\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Ignora <code>/etc/hosts</code>"
++
++msgid "Ignore interface"
++msgstr "Ignora la interfície"
++
++msgid "Ignore resolve file"
++msgstr "Ignora el fitxer de resolució"
++
++msgid "Image"
++msgstr "Imatge"
++
++msgid "In"
++msgstr "En"
++
++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 "Temps d'espera d'inactivitat"
++
++msgid "Inbound:"
++msgstr "Entrant:"
++
++msgid "Info"
++msgstr "Informació"
++
++msgid "Initscript"
++msgstr "Script d'inici"
++
++msgid "Initscripts"
++msgstr "Scripts d'inici"
++
++msgid "Install"
++msgstr "Instal·la"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Instal·la el paquet %q"
++
++msgid "Install protocol extensions..."
++msgstr "Instal·la extensions de protocol"
++
++msgid "Installed packages"
++msgstr "Paquets instal·lats"
++
++msgid "Interface"
++msgstr "Interfície"
++
++msgid "Interface Configuration"
++msgstr "Configuració d'interfície"
++
++msgid "Interface Overview"
++msgstr "Visió de conjunt de la interfície"
++
++msgid "Interface is reconnecting..."
++msgstr "La interfície s'està reconnectant..."
++
++msgid "Interface is shutting down..."
++msgstr "La interfície s'està aturant..."
++
++msgid "Interface not present or not connected yet."
++msgstr ""
++
++msgid "Interface reconnected"
++msgstr ""
++
++msgid "Interface shut down"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interfícies"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "Error de servidor intern"
++
++msgid "Invalid"
++msgstr "Invàlid"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Usuari i/o contrasenya invàlids! Si us plau prova-ho de nou."
++
++#, 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 ""
++"Sembla que intentes actualitzar una imatge que no hi cap a la memòria flaix, "
++"si us plau verifica el fitxer d'imatge!"
++
++msgid "Java Script required!"
++msgstr "Es requereix JavaScript!"
++
++msgid "Join Network"
++msgstr "Uneix-te a la xarxa"
++
++msgid "Join Network: Settings"
++msgstr "Unir-se a la xarxa: Ajusts"
++
++msgid "Join Network: Wireless Scan"
++msgstr ""
++
++msgid "Keep settings"
++msgstr ""
++
++msgid "Kernel Log"
++msgstr "Registre del nucli"
++
++msgid "Kernel Version"
++msgstr "Versió del nucli"
++
++msgid "Key"
++msgstr "Clau"
++
++msgid "Key #%d"
++msgstr "Clau #%d"
++
++msgid "Kill"
++msgstr "Mata"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "Servidor L2TP"
++
++msgid "LCP echo failure threshold"
++msgstr "Llindar de fracàs d'eco LCP"
++
++msgid "LCP echo interval"
++msgstr "Interval d'eco LCP"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Etiqueta"
++
++msgid "Language"
++msgstr "Llengua"
++
++msgid "Language and Style"
++msgstr "Llengua i estil"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Duració de validitat d'arrendament"
++
++msgid "Leasefile"
++msgstr "Fitxer d'arrendament"
++
++msgid "Leasetime"
++msgstr "Duració d'arrendament"
++
++msgid "Leasetime remaining"
++msgstr "Duració d'arrendament restant"
++
++msgid "Leave empty to autodetect"
++msgstr "Deixeu-ho en blanc per autodetectar"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "Deixeu-ho en blanc per utilitzar l'adreça WAN actual"
++
++msgid "Legend:"
++msgstr "Llegenda:"
++
++msgid "Limit"
++msgstr "Límit"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Enllaç activa"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++
++msgid "Listening port for inbound DNS queries"
++msgstr ""
++
++msgid "Load"
++msgstr "Carrega"
++
++msgid "Load Average"
++msgstr "Carrega mitjana"
++
++msgid "Loading"
++msgstr "Carregant"
++
++msgid "Local IPv4 address"
++msgstr "Adreça IPv4 local"
++
++msgid "Local IPv6 address"
++msgstr "Adreça IPv6 local"
++
++msgid "Local Startup"
++msgstr "Inici local"
++
++msgid "Local Time"
++msgstr "Hora local"
++
++msgid "Local domain"
++msgstr "Domini local"
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr "Servidor local"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr "Localitza les peticions"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Nivell de sortida de registre"
++
++msgid "Log queries"
++msgstr "Registra les peticions"
++
++msgid "Logging"
++msgstr "Registre"
++
++msgid "Login"
++msgstr "Entra"
++
++msgid "Logout"
++msgstr "Surt"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr "Adreça MAC"
++
++msgid "MAC-Address Filter"
++msgstr "Filtre d'adreces MAC"
++
++msgid "MAC-Filter"
++msgstr "Filtre MAC"
++
++msgid "MAC-List"
++msgstr "Llista MAC"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Velocitat màxima"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr ""
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr ""
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++
++msgid "Maximum hold time"
++msgstr ""
++
++msgid "Maximum number of leased addresses."
++msgstr ""
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "Memòria"
++
++msgid "Memory usage (%)"
++msgstr "Ús de Memòria (%)"
++
++msgid "Metric"
++msgstr "Mètric"
++
++msgid "Minimum Rate"
++msgstr "Velocitat mínima"
++
++msgid "Minimum hold time"
++msgstr ""
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "Manca l'extensió de protocol del protocol %q"
++
++msgid "Mode"
++msgstr "Mode"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Dispositiu mòdem"
++
++msgid "Modem init timeout"
++msgstr "Temps d'espera d'inici de mòdem"
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr ""
++
++msgid "Mount Point"
++msgstr "Punt de muntatge"
++
++msgid "Mount Points"
++msgstr "Punts de muntatge"
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Els punts de muntatge defineixen en quin punt un dispositiu de memòria "
++"s'adjuntarà amb el sistema de fitxers"
++
++msgid "Mount options"
++msgstr "Opcions de muntatge"
++
++msgid "Mount point"
++msgstr ""
++
++msgid "Mounted file systems"
++msgstr "Sistemes de fitxers muntats"
++
++msgid "Move down"
++msgstr "Baixa"
++
++msgid "Move up"
++msgstr "Puja"
++
++msgid "Multicast Rate"
++msgstr "Velocitat de difusió selectiva"
++
++msgid "Multicast address"
++msgstr "Adreça de difusió selectiva"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "Candidats de servidor NTP"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Nom"
++
++msgid "Name of the new interface"
++msgstr "Nom de la nova interfície"
++
++msgid "Name of the new network"
++msgstr "Nom de la nova xarxa"
++
++msgid "Navigation"
++msgstr "Navegació"
++
++msgid "Netmask"
++msgstr "Màscara de xarxa"
++
++msgid "Network"
++msgstr "Xarxa"
++
++msgid "Network Utilities"
++msgstr "Utilitats de xarxa"
++
++msgid "Network boot image"
++msgstr "Imatge d'inici de xarxa"
++
++msgid "Network without interfaces."
++msgstr "Xarxa sense interfícies."
++
++msgid "Next »"
++msgstr "Següent"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Cap servidor DHCP configurat en aquesta interfície"
++
++msgid "No chains in this table"
++msgstr "No hi ha cadenes a aquesta taula"
++
++msgid "No files found"
++msgstr "Cap fitxer trobat"
++
++msgid "No information available"
++msgstr "Cap informació disponible"
++
++msgid "No negative cache"
++msgstr "Sense memòria cau negativa"
++
++msgid "No network configured on this device"
++msgstr "Cap xarxa configurada en aquest dispositiu"
++
++msgid "No network name specified"
++msgstr "Cap nom de xarxa especificat"
++
++msgid "No package lists available"
++msgstr "No hi ha llistes de paquets disponibles"
++
++msgid "No password set!"
++msgstr "Cap contrasenya establerta!"
++
++msgid "No rules in this chain"
++msgstr "No hi ha regles en aquesta cadena"
++
++msgid "No zone assigned"
++msgstr "Cap zona assignada"
++
++msgid "Noise"
++msgstr "Soroll"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Soroll:"
++
++msgid "None"
++msgstr "Cap"
++
++msgid "Normal"
++msgstr "Normal"
++
++msgid "Not Found"
++msgstr "No trobat"
++
++msgid "Not associated"
++msgstr "No associat"
++
++msgid "Not connected"
++msgstr "No connectat"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Nota: Els fitxers de configuració s'esborraran."
++
++msgid "Notice"
++msgstr "Avís"
++
++msgid "Nslookup"
++msgstr "Nslookup"
++
++msgid "OK"
++msgstr "D'acord"
++
++msgid "OPKG-Configuration"
++msgstr "Configuració d&#39;OPKG"
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"En aquesta pàgina pots configurar les interfícies de xarxa. Pots fer un pont "
++"entre diverses interfícies clicant sobre el camp \"interfície pont\" i "
++"introduint els noms de les diverses interfícies de xarxa separats per "
++"espais. També pots fer servir la notació <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr> <samp>INTERFACE.VLANNR</samp> (<abbr title=\"per "
++"exemple\">p.e.</abbr>: <samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "Cal especificar o el nom de host o l'adreça MAC!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "Un o més dels camps requerits conté un valor invàlid!"
++
++msgid "One or more required fields have no value!"
++msgstr "Un o més dels camps requerits no té valor!"
++
++msgid "Open list..."
++msgstr "Obre una llista..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Opció canviada"
++
++msgid "Option removed"
++msgstr "Opció treta"
++
++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 "Options"
++msgstr "Opcions"
++
++msgid "Other:"
++msgstr "Altres:"
++
++msgid "Out"
++msgstr ""
++
++msgid "Outbound:"
++msgstr "Sortint:"
++
++msgid "Outdoor Channels"
++msgstr "Canals d'exteriors"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr "Visió de conjunt"
++
++msgid "Owner"
++msgstr "Propietari"
++
++msgid "PAP/CHAP password"
++msgstr "Contrasenya PAP/CHAP"
++
++msgid "PAP/CHAP username"
++msgstr "Nom d'usuari PAP/CHAP"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "Encapsulació PPPoA"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "Es requereix el paquet libiwinfo!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "Les llistes de paquets tenen més de 24 hores"
++
++msgid "Package name"
++msgstr "Nom del paquet"
++
++msgid "Packets"
++msgstr "Paquets"
++
++msgid "Part of zone %q"
++msgstr "Part de la zona %q"
++
++msgid "Password"
++msgstr "Contrasenya"
++
++msgid "Password authentication"
++msgstr "Autenticació per contrasenya"
++
++msgid "Password of Private Key"
++msgstr "Contrasenya de la clau privada"
++
++msgid "Password successfully changed!"
++msgstr "La contrasenya s'ha canviat amb èxit!"
++
++msgid "Path to CA-Certificate"
++msgstr "Ruta als Certificats CA"
++
++msgid "Path to Client-Certificate"
++msgstr ""
++
++msgid "Path to Private Key"
++msgstr "Ruta a la clau privada"
++
++msgid "Path to executable which handles the button event"
++msgstr ""
++
++msgid "Peak:"
++msgstr "Màxim:"
++
++msgid "Perform reboot"
++msgstr "Executa un reinici"
++
++msgid "Perform reset"
++msgstr "Executa un reinici"
++
++msgid "Phy Rate:"
++msgstr "Velocitat física:"
++
++msgid "Physical Settings"
++msgstr "Ajusts físics"
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr "Paquets"
++
++msgid "Please enter your username and password."
++msgstr "Si us plau entra el teu nom d'usuari i contrasenya."
++
++msgid "Policy"
++msgstr "Política"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Port %d"
++msgstr "Port %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr "Estatus de port"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr "Evita la comunicació client a client"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr "continua"
++
++msgid "Processes"
++msgstr "Processos"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Protocol of the new interface"
++msgstr ""
++
++msgid "Protocol support is not installed"
++msgstr ""
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "Calidad"
++
++msgid "RTS/CTS Threshold"
++msgstr "Llindar RTS/CTS"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr "Velocitat RX"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "Controlador sense fil RaLink 802.11%s"
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"Llegeix <code>/etc/ethers</code> per configurar el servidor <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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr ""
++
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr ""
++
++msgid "Realtime Connections"
++msgstr ""
++
++msgid "Realtime Graphs"
++msgstr ""
++
++msgid "Realtime Load"
++msgstr ""
++
++msgid "Realtime Traffic"
++msgstr ""
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr "Reinicia"
++
++msgid "Rebooting..."
++msgstr "Reiniciant..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Arranca de nou el sistema operatiu del teu dispositiu"
++
++msgid "Receive"
++msgstr "Rep"
++
++msgid "Receiver Antenna"
++msgstr "Antena receptora"
++
++msgid "Reconnect this interface"
++msgstr "Reconnex aquesta interfície"
++
++msgid "Reconnecting interface"
++msgstr "Reconnectant la interfície"
++
++msgid "References"
++msgstr "Referències"
++
++msgid "Regulatory Domain"
++msgstr "Domini regulatori"
++
++msgid "Relay"
++msgstr "Relé"
++
++msgid "Relay Bridge"
++msgstr "Pont de relé"
++
++msgid "Relay between networks"
++msgstr "Relé entre xarxes"
++
++msgid "Relay bridge"
++msgstr "Pont de relé"
++
++msgid "Remote IPv4 address"
++msgstr "Adreça IPv6 remota"
++
++msgid "Remove"
++msgstr "Treu"
++
++msgid "Repeat scan"
++msgstr ""
++
++msgid "Replace entry"
++msgstr "Reemplaça l'entrada"
++
++msgid "Replace wireless configuration"
++msgstr "Reemplaça la configuració sense fil"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "Alguns ISP ho requereixen, per exemple el Charter amb DOCSIS 3"
++
++msgid "Reset"
++msgstr "Reinicia"
++
++msgid "Reset Counters"
++msgstr "Reinicia els comptadors"
++
++msgid "Reset to defaults"
++msgstr "Reestableix els valors per defecte"
++
++msgid "Resolv and Hosts Files"
++msgstr ""
++
++msgid "Resolve file"
++msgstr ""
++
++msgid "Restart"
++msgstr "Reinicia"
++
++msgid "Restart Firewall"
++msgstr "Reinicia Tallafocs"
++
++msgid "Restore backup"
++msgstr "Restaura còpia de seguretat"
++
++msgid "Reveal/hide password"
++msgstr "Mostra/amaga la contrasenya"
++
++msgid "Revert"
++msgstr "Reverteix"
++
++msgid "Root"
++msgstr "Arrel"
++
++msgid "Root directory for files served via TFTP"
++msgstr "Directori arrel dels fitxers servits per TFTP"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Contrasenya de l'encaminador"
++
++msgid "Routes"
++msgstr "Rutes"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Les rutes especifiquen per quina interfície i passarel·la es pot arribar a "
++"un cert ordinador o xarxa."
++
++msgid "Rule #"
++msgstr ""
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr "Accés SSH"
++
++msgid "SSH-Keys"
++msgstr "Claus SSH"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Desa"
++
++msgid "Save & Apply"
++msgstr "Desa y aplica"
++
++msgid "Save &#38; Apply"
++msgstr "Desa y aplica"
++
++msgid "Scan"
++msgstr "Escaneja"
++
++msgid "Scheduled Tasks"
++msgstr "Tasques programades"
++
++msgid "Section added"
++msgstr "Secció afegida"
++
++msgid "Section removed"
++msgstr "Secció treta"
++
++msgid "See \"mount\" manpage for details"
++msgstr ""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr "Clients separats"
++
++msgid "Separate WDS"
++msgstr "WDS separat"
++
++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"
++
++msgid "Service Type"
++msgstr "Tipus de servei"
++
++msgid "Services"
++msgstr "Serveis"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "Sincronització de hora"
++
++msgid "Setup DHCP Server"
++msgstr ""
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr "Atura aquesta interfície"
++
++msgid "Shutdown this network"
++msgstr "Atura aquesta xarxa"
++
++msgid "Signal"
++msgstr "Senyal"
++
++msgid "Signal:"
++msgstr "Senyal:"
++
++msgid "Size"
++msgstr "Mida"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "Salta"
++
++msgid "Skip to content"
++msgstr "Salta al contingut"
++
++msgid "Skip to navigation"
++msgstr "Salta a la navegació"
++
++msgid "Slot time"
++msgstr ""
++
++msgid "Software"
++msgstr "Programari"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "No es pot desar els valors perquè alguns camps estan invàlids!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Tristament, l'object que heu sol·licitat no s'ha trobat."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "Tristament, el servidor ha encontrat un error inesperat."
++
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++
++msgid "Sort"
++msgstr "Ordena"
++
++msgid "Source"
++msgstr "Origen"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr "Especifica el directori a que el dispositiu està adjuntat"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "Especifica el port d'escolta d'aquesta instància del <em>Dropbear</em>"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr "Especifiqueu el clau de xifració secret aquí."
++
++msgid "Start"
++msgstr "Inici"
++
++msgid "Start priority"
++msgstr "Prioritat d'inici"
++
++msgid "Startup"
++msgstr "Arranca"
++
++msgid "Static IPv4 Routes"
++msgstr "Rutes IPv4 estàtiques"
++
++msgid "Static IPv6 Routes"
++msgstr "Rutes IPv6 estàtiques"
++
++msgid "Static Leases"
++msgstr "Leases estàtics"
++
++msgid "Static Routes"
++msgstr "Rutes estàtiques"
++
++msgid "Static WDS"
++msgstr "WDS estàtic"
++
++msgid "Static address"
++msgstr "Adreça estàtica"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++
++msgid "Status"
++msgstr "Estat"
++
++msgid "Stop"
++msgstr "Atura"
++
++msgid "Strict order"
++msgstr "Ordre estricte"
++
++msgid "Submit"
++msgstr "Envia"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Entrada d'intercanvi"
++
++msgid "Switch"
++msgstr "Commutador"
++
++msgid "Switch %q"
++msgstr "Commutador %q"
++
++msgid "Switch %q (%s)"
++msgstr "Commutador %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Protocol de commutador"
++
++msgid "Sync with browser"
++msgstr "Sincronitza amb navegador"
++
++msgid "Synchronizing..."
++msgstr "Sincronitzant..."
++
++msgid "System"
++msgstr "Sistema"
++
++msgid "System Log"
++msgstr "Registre de sistema"
++
++msgid "System Properties"
++msgstr "Propietats de sistema"
++
++msgid "System log buffer size"
++msgstr "Mida de la memòria intermèdia del registre de sistema"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "Ajusts TFTP"
++
++msgid "TFTP server root"
++msgstr "Arrel del servidor TFTP"
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr "Velocitat TX"
++
++msgid "Table"
++msgstr "Taula"
++
++msgid "Target"
++msgstr "Destí"
++
++msgid "Terminate"
++msgstr "Acaba"
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"El paquet <em>libiwinfo-lua</em> no està instal·lat. Heu de instal·lar "
++"aquest component per tenir una configuració sense fil funcionant!"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++"Els caràcters permets són: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> i <code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"El fitxer de dispositiu de la memòria o partició (<abbr title=\"per exemple"
++"\">p.e.</abbr> <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 ""
++"El sistema the fitxers que es va fer servir per formatar la memòria (<abbr "
++"title=\"per exemple example\">p.e.</abbr> <samp><abbr title=\"Third Extended "
++"Filesystem\">ext3</abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++
++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"
++
++msgid "The following rules are currently active on this system."
++msgstr "Els següents regles estan actualment actives en aquest sistema."
++
++msgid "The given network name is not unique"
++msgstr "El nom de xarxa donat no és únic"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"El maquinari no es capaç de múltiples SSID i la configuració existent es "
++"reemplaçara si procediu."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++"La longitud del prefix IPv4 en bits, el reste s'utilitza en les adreces IPv6."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "La longitud del prefix IPv6 en bits"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr "El protocol seleccionat necessita un dispositiu assignat"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++"El sistema està esborrant la partició de configuració i es reiniciarà quan "
++"termini."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"El sistema s'està escrivent ara.<br />NO APAGUEU EL DISPOSITIU!<br />Espereu "
++"uns minuts abans d'intentar connectar-vos de nou. Pot ser necessari que "
++"renoveu l'adreça del vostre ordinador per a connectar al dispositiu de nou, "
++"depenent dels vostres ajusts."
++
++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."
++msgstr ""
++"La imatge pujada no conté un format suportat. Assegura't de triar el format "
++"d'imatge genèric per la teva plataforma."
++
++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 pending changes to revert!"
++msgstr "No hi ha canvis pendents per revertir!"
++
++msgid "There are no pending changes!"
++msgstr "No hi ha canvis pendents!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Aquest és l'únic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> a la teva xarxa local"
++
++msgid "This is the plain username for logging into the account"
++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 ""
++"Aquest és el crontab del sistema en el qual es poden definir tasques "
++"programades."
++
++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 ""
++"Aquesta llista mostra una vista general sobre els processos corrent al "
++"sistema actualment i el seu estat."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr ""
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++"Aquesta pàgina ofereix una vista general de les connexions de xarxa actives "
++"actualment."
++
++msgid "This section contains no values yet"
++msgstr "Aquesta secció no conté cap valor encara"
++
++msgid "Time Synchronization"
++msgstr "Sincronització de hora"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "La sincronització de hora encara no s'ha configurat."
++
++msgid "Timezone"
++msgstr "Zona horària"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++
++msgid "Total Available"
++msgstr "Total disponible"
++
++msgid "Traceroute"
++msgstr "Rastre de ruta"
++
++msgid "Traffic"
++msgstr "Tràfic"
++
++msgid "Transfer"
++msgstr "Transferència"
++
++msgid "Transmission Rate"
++msgstr "Taxa de transmissió"
++
++msgid "Transmit"
++msgstr "Transmet"
++
++msgid "Transmit Power"
++msgstr "Potència de transmissió"
++
++msgid "Transmitter Antenna"
++msgstr "Antena transmissora"
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr "ID del túnel"
++
++msgid "Tunnel Interface"
++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 "Turbo Mode"
++msgstr "Mode Turbo"
++
++msgid "Tx-Power"
++msgstr "Potència Tx"
++
++msgid "Type"
++msgstr "Tipus"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "Només UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "Dispositiu USB"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr "Desconegut"
++
++msgid "Unknown Error, password not changed!"
++msgstr "La contrasenya no s'ha canviat a causa d'un error desconegut!"
++
++msgid "Unmanaged"
++msgstr "Sense gestionar"
++
++msgid "Unsaved Changes"
++msgstr "Canvis sense desar"
++
++msgid "Unsupported protocol type."
++msgstr "Tipus de protocol no suportat."
++
++msgid "Update lists"
++msgstr "Actualitza les llistes"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr "Puja un arxiu..."
++
++msgid "Uploaded File"
++msgstr "Fitxer pujat"
++
++msgid "Uptime"
++msgstr "Temps d'alta"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Fes servir <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr ""
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr ""
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "Utilitza la bandera de difusió"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr ""
++
++msgid "Use default gateway"
++msgstr ""
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr ""
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr "Usat"
++
++msgid "Used Key Slot"
++msgstr ""
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Nom d'usuari"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "Interfície VLAN"
++
++msgid "VLANs on %q"
++msgstr "VLANs en %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLANs en %q (%s)"
++
++msgid "VPN Server"
++msgstr "Servidor VPN"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++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"
++
++msgid "Version"
++msgstr "Versió"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "Sistema obert WEP"
++
++msgid "WEP Shared Key"
++msgstr "Clau compartit WEP"
++
++msgid "WEP passphrase"
++msgstr "Contrasenya WEP"
++
++msgid "WMM Mode"
++msgstr "Mode WMM"
++
++msgid "WPA passphrase"
++msgstr "Contrasenya WPA"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Advertència"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr "Sense fils"
++
++msgid "Wireless Adapter"
++msgstr "Adaptador sense fils"
++
++msgid "Wireless Network"
++msgstr "Xarxa sense fils"
++
++msgid "Wireless Overview"
++msgstr "Resum sense fils"
++
++msgid "Wireless Security"
++msgstr "Seguretat sense fils"
++
++msgid "Wireless is disabled or not associated"
++msgstr "El sense fil està inhabilitat o sense associar"
++
++msgid "Wireless is restarting..."
++msgstr "Sense fils està reiniciant..."
++
++msgid "Wireless network is disabled"
++msgstr "La xarxa sense fil està inhabilitada"
++
++msgid "Wireless network is enabled"
++msgstr "La xarxa sense fils està habilitada"
++
++msgid "Wireless restarted"
++msgstr "Sense fils reinciat"
++
++msgid "Wireless shut down"
++msgstr "Sense fils aturat"
++
++msgid "Write received DNS requests to syslog"
++msgstr "Escriure les peticions DNS rebudes al syslog"
++
++msgid "XR Support"
++msgstr "Suport XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Pots activar o desactivar els scripts d'inici instal·lats ací. Els canvis "
++"s'aplicaran després d'arrancar de nou el dispositiu.<br /><strong>Atenció: "
++"Si desactives scripts d'inici necessaris com el \"network\", el teu "
++"dispositiu pot resultar inaccessible!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Has d'activar el Java Script al teu navegador o LuCI no funcionarà "
++"correctament."
++
++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 ""
++
++msgid "any"
++msgstr "qualsevol"
++
++msgid "auto"
++msgstr "auto"
++
++#, fuzzy
++msgid "automatic"
++msgstr "estàtic"
++
++msgid "baseT"
++msgstr ""
++
++msgid "bridged"
++msgstr "pontejat"
++
++msgid "create:"
++msgstr "crea:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "crea un pont entre les interfícies especificades"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "inhabilita"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "caducat"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"fitxer on els leases de <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr> s'emmagatzemaran"
++
++msgid "forward"
++msgstr "transemès"
++
++msgid "full-duplex"
++msgstr ""
++
++msgid "half-duplex"
++msgstr ""
++
++msgid "help"
++msgstr "ajuda"
++
++msgid "hidden"
++msgstr "amagat"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "si el destí és una xarxa"
++
++msgid "input"
++msgstr "entrada"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "no"
++
++msgid "no link"
++msgstr "cap enllaç"
++
++msgid "none"
++msgstr "cap"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "parat"
++
++msgid "on"
++msgstr "engegat"
++
++msgid "open"
++msgstr "obert"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "encaminat"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "etiquetat"
++
++msgid "unknown"
++msgstr "desconegut"
++
++msgid "unlimited"
++msgstr "il·limitat"
++
++msgid "unspecified"
++msgstr "sense espeficicar"
++
++msgid "unspecified -or- create:"
++msgstr "sense espeficicar -o- crear:"
++
++msgid "untagged"
++msgstr "sense etiquetar"
++
++msgid "yes"
++msgstr "sí"
++
++msgid "« Back"
++msgstr "« Enrere"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "Habilita negociació IPv6 en la enllaç PPP"
++
++#~ msgid "Path"
++#~ msgstr "Ruta"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Si us plau espera: Dispositiu arrancant-se de nou"
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Advertència: Hi ha canvis que no s'han desat i que es perdran mentre "
++#~ "s'arranca de nou!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Utilitza sempre canals de 40 MHz fins i tot si el canal secundari se "
++#~ "solapa. L'ús d'aquesta opció no compleix amb l'IEEE 802.11n-2009."
++
++#~ msgid "Cached"
++#~ msgstr "En memòria cau"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "Força el mode 40MHz"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Salts de freqüència"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "ID d'usuari de HE.net"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr ""
++#~ "Això és la ID d'usuari de 32 bytes codificat en hex, no el nom d'inici"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz, 2n canal per sobre"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz, 2n canal per sota"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Accepta les publicitats d'encaminador"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Anuncia IPv6 a la xarxa"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "ID de xarxa anunciat"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "El rang permès és entre 1 i 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "Capacitats HT"
++
++#~ msgid "HT mode"
++#~ msgstr "Mode HT"
++
++#~ msgid "Router Model"
++#~ msgstr "Model de l'encaminador"
++
++#~ msgid "Router Name"
++#~ msgstr "Nom de l'encaminador"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Esperant un encaminador..."
++
++#~ msgid "Active Leases"
++#~ msgstr "Leases Actius"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Encriptat\">Encr.</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr ""
++#~ "Escaneig <abbr title=\"Xarxa sense fils d&#39;àrea local\">WLAN</abbr>"
++
++#~ msgid "Create Network"
++#~ msgstr "Crea Xarxa"
++
++#~ msgid "Networks"
++#~ msgstr "Xarxes"
++
++#~ msgid "Power"
++#~ msgstr "Potència"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Xarxes sense fils del teu entorn local"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "Notació <abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>: "
++#~ "adreça/prefix"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "Servidor <abbr title=\"Domain Name System\">DNS</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "Broadcast <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "Adreça <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "Els ports de xarxa del teu router es poden combinar amb diverses <abbr "
++#~ "title=\"Virtual Local Area Network\">VLAN</abbr>s en les que els "
++#~ "ordinador es poden comunicar directament entre ells. Les <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s es fan servir normalment per "
++#~ "separar segments de xarxa diferents. Normalment, hi ha un port de Pujada "
++#~ "per defecte per la següent xarxa major, com Internet, i altres ports per "
++#~ "una xarxa local."
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Fitxers a guardar quan s&#39;actualitzi un nou firmware"
++
++#~ msgid "General"
++#~ msgstr "General"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Aquí pots personalitzar la configuració i funcionalitats de <abbr title="
++#~ "\"Interfície de configuració Lua\">LuCI</abbr>"
++
++#~ msgid "Post-commit actions"
++#~ msgstr "Accions Post-commit"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Aquestes comandes s&#39;executaran automàticament quan es publiqui una "
++#~ "configuració <abbr title=\"Configuració d&#39;Interfície Unificada\">UCI</"
++#~ "abbr> determinada, permetent que els canvis s&#39;apliquin a l&#39;"
++#~ "instant."
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Web <abbr title=\"Interfície d'Usuari\">UI</abbr>"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "Servidor <abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Punt d'accés (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Opcions pppd addicionals"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Desconnexió Automàtica"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Arxiu de seguretat"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Configura el servidor DNS local per fer servir els servidors anunciats "
++#~ "pel peer PPP"
++
++#~ msgid "Connect script"
++#~ msgstr "Script de connexió"
++
++#~ msgid "Create backup"
++#~ msgstr "Crea còpia de seguretat"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Script de desconnexió"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Edita llistes de paquets i destins d&#39;instal·lació"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Habilita IPv6 a l'enllaç PPP"
++
++#~ msgid "Firmware image"
++#~ msgstr "Imatge de firmware"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Ací pots crear una còpia de seguretat i restaurar la teva configuració "
++#~ "del router i - si és possible - reiniciar el router als paràmetres per "
++#~ "defecte."
++
++#~ msgid "Installation targets"
++#~ msgstr "Objectius d'instal·lació"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Mantingues els fitxers de configuració"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Keep-Alive"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Permet que el pppd reemplaci la ruta per defecte actual per fer servir "
++#~ "les interfícies PPP després de connectar-se amb èxit"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr ""
++#~ "Permet que el pppd executi aquest script abans d'establir l'enllaç PPP"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr ""
++#~ "Permet que el pppd executi aquest script abans de desconnectar l'enllaç "
++#~ "PPP"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Assegura't d'introduir el codi pin correcte o pots bloquejar la teva "
++#~ "targeta SIM!"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "La majoria d'ells són servidors de xarxa, que ofereixen un cert servei "
++#~ "pel teu dispositiu o xarxa, com l'accés a consola, servir pàgines web com "
++#~ "el <abbr title=\"Interfície de configuració Lua\">LuCI</abbr>, fer "
++#~ "enrutament mesh, enviar e-mails, ..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr ""
++#~ "Número de connexions de test fallades per iniciar reconnexió automàtica"
++
++#~ msgid "PIN code"
++#~ msgstr "Codi PIN"
++
++#~ msgid "Package lists"
++#~ msgstr "Llistes de paquets"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr ""
++#~ "Continua desfent tots els paràmetres i reiniciant els valors per defecte "
++#~ "del firmware?"
++
++#~ msgid "Processor"
++#~ msgstr "Processador"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Port Radius"
++
++#, fuzzy
++#~ msgid "Radius-Server"
++#~ msgstr "Servidor Radius"
++
++#~ msgid "Replace default route"
++#~ msgstr "Reemplaça la ruta per defecte"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Reinicia els valors per defecte del router"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr ""
++#~ "Segons a esperar per tal que el modem estigui apunt abans de provar de "
++#~ "connectar-se"
++
++#~ msgid "Service type"
++#~ msgstr "Tipus de servei"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr "Els serveis i dimonis realitzen certes tasques al teu dispositiu."
++
++#~ msgid "Settings"
++#~ msgstr "Configuració"
++
++#~ msgid "Setup wait time"
++#~ msgstr "Temps d'espera de configuració"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Ho sento, l'OpenWRT no suporta una actualització del sistema en aquesdta "
++#~ "plataforma.<br />Has actualitzar manualment el teu dispositiu."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr "Especifica arguments de línia de comanda addicionals pel pppd"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "El node de dispositiu del teu modem, p.e. /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr ""
++#~ "Temps (en segons) després del qual les connexions sense fer servir es "
++#~ "tancaran"
++
++#~ msgid "Update package lists"
++#~ msgstr "Actualitza llistes de paquets"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr ""
++#~ "Penja una imatge d'OpenWRT per actualitzar el firmware del dispositiu."
++
++#~ msgid "Upload image"
++#~ msgstr "Penja imatge"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "Fes servir peer DNS"
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Necessites instal·lar \"comgt\" per suport UMTS/GPRS, \"ppp-mod-pppoe\" "
++#~ "per suport PPPoE, \"ppp-mod-pppoa\" per suport PPPoA o \"pptp\" per "
++#~ "suport PPtP"
++
++#~ msgid "back"
++#~ msgstr "enrere"
++
++#~ msgid "buffered"
++#~ msgstr "emmagatzemat en memòria intermèdia"
++
++#~ msgid "cached"
++#~ msgstr "emmagatzemat en memòria cau"
++
++#~ msgid "free"
++#~ msgstr "lliure"
++
++#~ msgid "static"
++#~ msgstr "estàtic"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Interfície de configuració Lua\">LuCI</abbr> és una "
++#~ "col·lecció de programari lliure Lua, incloent un framework web <abbr "
++#~ "title=\"Model-Vista-Control·lador\">MVC</abbr> i una interfície web per "
++#~ "dispositius empotrats. <abbr title=\"Interfície de configuració Lua"
++#~ "\">LuCI</abbr> està llicenciada sota la Apache-License."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "Claus <abbr title=\"Secure Shell\">SSH</abbr>"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "Un servidor web HTTP/1.1 lleuger escrit en C i LUA dissenyat per servir "
++#~ "LuCI"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Un servidor web petit, que es pot fer servir per servir el <abbr title="
++#~ "\"Interfície de configuració Lua\">LuCI</abbr>."
++
++#~ msgid "About"
++#~ msgstr "Sobre"
++
++#~ msgid "Addresses"
++#~ msgstr "Addreces"
++
++#~ msgid "Admin Password"
++#~ msgstr "Contrasenya d&#39;administrador"
++
++#~ msgid "Alias"
++#~ msgstr "Àlies"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Reialme d'Autenticació"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Port de pont"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr ""
++#~ "Canvia la contrasenya de l'administrador del sistema (Usuari <code>root</"
++#~ "code>)"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Client + WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "Fitxer de configuració"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Temps d'espera de la connexió excedit"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Desenvolupadors Contribuïdors"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "DHCP assignat"
++
++#~ msgid "Document root"
++#~ msgstr "Arrel del document"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Activa el Keep-Alive"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "Pont Ethernet"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "Ací pots enganxar les claus públiques <abbr title=\"Secure Shell\">SSH</"
++#~ "abbr> (una per línia) per l'autenticació <abbr title=\"Secure Shell"
++#~ "\">SSH</abbr> per clau pública."
++
++#~ msgid "ID"
++#~ msgstr "ID"
++
++#~ msgid "IP Configuration"
++#~ msgstr "Configuració IP"
++
++#~ msgid "Interface Status"
++#~ msgstr "Estat d'Interfície"
++
++#~ msgid "Lead Development"
++#~ msgstr "Desenvolupadors principals"
++
++#~ msgid "Master"
++#~ msgstr "Master"
++
++#~ msgid "Master + WDS"
++#~ msgstr "Master + WDS"
++
++#~ msgid "Not configured"
++#~ msgstr "No configurat"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Contrasenya canviada amb èxit"
++
++#~ msgid "Plugin path"
++#~ msgstr "Directori de connectors"
++
++#~ msgid "Ports"
++#~ msgstr "Ports"
++
++#~ msgid "Primary"
++#~ msgstr "Primari"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Pàgina d&#39;inici del projecte"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "Pseudo Ad-Hoc"
++
++#~ msgid "STP"
++#~ msgstr "STP"
++
++#~ msgid "Thanks To"
++#~ msgstr "Gràcies a"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr ""
++#~ "El reialme que es mostrarà a la sol·licitiu d'autenticació per pàgines "
++#~ "protegides."
++
++#~ msgid "Unknown Error"
++#~ msgstr "Error desconegut"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "per defecte a <code>/etc/httpd.conf</code>"
++
++#~ msgid "Package lists updated"
++#~ msgstr "Llistes de paquets actualitzades"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Actualitza paquets instal·lats"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "Ací també es poden veure els registres del kernel o dels serveis, per "
++#~ "tenir una vista general del seu estat actual.'iwscan = 'Escaneig <abbr "
++#~ "title=\"Xarxa sense fils d&#39;àrea local\">WLAN</abbr>"
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "Ací pots trobar informació sobre l&#39;estat actual del sistema, com la "
++#~ "freqüència de rellotge de la <abbr title=\"Unitat Central de Processament"
++#~ "\">CPU</abbr>, l&#39;ús de memòria o les dades d&#39;interfície de xarxa."
++
++#~ msgid "Search file..."
++#~ msgstr "Cerca fitxer..."
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "<abbr title=\"Interfície de configuració Lua\">LuCI</abbr> és una "
++#~ "interfície gràfica amigable, lliure i flexible per configurar l&#39;"
++#~ "OpenWRT Kamikaze."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "I ara diverteix-te amb el teu router!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "Com que volem millorar aquesta interfície sempre, volem la teva opinió i "
++#~ "els teus suggeriments."
++
++#~ msgid "Hello!"
++#~ msgstr "Hola!"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Alerta: A <abbr title=\"Interfície de configuració Lua\">LuCI</abbr> els "
++#~ "canvis s&#39;han de confirmar clicant \"Canvis --> Desa &amp; Aplica\" "
++#~ "abans que s&#39;apliquin."
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "A les pàgines següents podràs ajustar tots els paràmetres importants del "
++#~ "teu router."
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr ""
++#~ "L&#39;equip de <abbr title=\"Interfície de configuració Lua\">LuCI</abbr>"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Aquesta és l&#39;àrea d&#39;administració de <abbr title=\"Interfície de "
++#~ "configuració Lua\">LuCI</abbr>."
++
++#~ msgid "User Interface"
++#~ msgstr "Interfície d&#39;usuari"
++
++#~ msgid "enable"
++#~ msgstr "habilita"
++
++#, fuzzy
++#~ msgid "(optional)"
++#~ msgstr "(opcional)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "Port <abbr title=\"Domain Name System\">DNS</abbr>"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "Es consultarà el servidor <abbr title=\"Domain Name System\">DNS</abbr> "
++#~ "en l'ordre del fitxer de Resolució"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr ""
++#~ "<abbr title=\"màxims\">max.</abbr> leases <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=\"màxima\">max.</abbr> mida de paquet <abbr title=\"Extension "
++#~ "Mechanisms for Domain Name System\">EDNS0</abbr>"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "Aïllament d'AP"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "Afegeix la xarxa sense fils a la xarxa física"
++
++#~ msgid "Aliases"
++#~ msgstr "Aliases"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Mida de segment Clamp"
++
++#, fuzzy
++#~ msgid "Create Or Attach Network"
++#~ msgstr "Crea Xarxa"
++
++#~ msgid "Devices"
++#~ msgstr "Dispositius"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "No reenviïs les cerques inverses per la xarxa local"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "Habilita el Servidor TFTP"
++
++#~ msgid "Errors"
++#~ msgstr "Errors"
++
++#~ msgid "Essentials"
++#~ msgstr "Essencials"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Expandeix els Noms de Domini"
++
++#~ msgid "First leased address"
++#~ msgstr "Primera adreça de lease"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Resol problemes amb llocs web inassolibles, enviant formularis o altres "
++#~ "comportaments inesperats d'alguns ISPs."
++
++#~ msgid "Hardware Address"
++#~ msgstr "Adreça <abbr title=\"Media Access Control\">MAC</abbr>"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "Ací pots configurar els dispositius sense fils instal·lats."
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "Independent (Ad-Hoc)"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Connexió a Internet"
++
++#~ msgid "Join (Client)"
++#~ msgstr "Uneix-te (Client)"
++
++#~ msgid "Leases"
++#~ msgstr "Leases"
++
++#~ msgid "Local Domain"
++#~ msgstr "Domini Local"
++
++#~ msgid "Local Network"
++#~ msgstr "Xarxa Local"
++
++#~ msgid "Local Server"
++#~ msgstr "Servidor Local"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "Imatge de Càrrega de Xarxa"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr ""
++#~ "Nom de Xarxa (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "Número d'adreces de lease"
++
++#~ msgid "Perform Actions"
++#~ msgstr "Realitza accions"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "Evita la comunicació Client a Client"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "Proveeix (Punt d'Accés)"
++
++#~ msgid "Resolvfile"
++#~ msgstr "Fitxer de Resolució"
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "Arrel del Servidor TFTP"
++
++#~ msgid "TX / RX"
++#~ msgstr "TX / RX"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "S&#39;han aplicat els següents canvis"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "Quan s&#39;actualitza un nou firmware amb un <abbr title=\"Interfície de "
++#~ "configuració Lua\">LuCI</abbr> aquests fitxers s&#39;afegiran a la "
++#~ "instal·lació del nou firmware."
++
++#, fuzzy
++#~ msgid "Wireless Scan"
++#~ msgstr "Wireless"
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "Amb el <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "els membres d'una xarxa poden rebre automàticament els seus paràmetres de "
++#~ "xarxa (adreça <abbr title=\"Internet Protocol\">IP</abbr>, màscara de "
++#~ "xarxa, servidor <abbr title=\"Domain Name System\">DNS</abbr>, ...)."
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "Pots fer servir diverses xarxes sense fils amb un sol dispositiu. Tingues "
++#~ "en compte que hi ha certes restriccions específiques del maquinari i dels "
++#~ "controlados. Normalment, pots operar 1 xarxa Ad-Hoc o fins a 3 xarxes en "
++#~ "mode Master i 1 xarxa en mode Client simultàniament.\"a_w_netid = \"Nom "
++#~ "de la xarxa (<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>)"
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "Necessites instal·lar \"ppp-mod-pppoe\" per suport PPPoE o \"pptp\" per "
++#~ "suport PPtP"
++
++#~ msgid "Zone"
++#~ msgstr "Zona"
++
++#~ msgid "additional hostfile"
++#~ msgstr "fitxer de noms addicional"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr "afegeix Noms de Domini a les entrades de noms al fitxer resolv"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "reconnecta automàticament"
++
++#~ msgid "concurrent queries"
++#~ msgstr "consultes concurrents"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr ""
++#~ "deshabilita el <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++#~ "abbr> per aquesta interfície"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "desconnecta per inactivitat durant"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "no emmagatzemis en memòria cau els desconeguts"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr ""
++#~ "filtra les consultes <abbr title=\"Domain Name System\">DNS</abbr> no "
++#~ "útils de sistemes Windows"
++
++#~ msgid "installed"
++#~ msgstr "instal·lat"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "localitza el nom de màquina depenent de la seva subxarxa"
++
++#~ msgid "not installed"
++#~ msgstr "no instal·lat"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr ""
++#~ "evita emmagatzemar en memòria cau les respostes <abbr title=\"Domain Name "
++#~ "System\">DNS</abbr> negatives"
++
++#~ msgid "query port"
++#~ msgstr "port de consulta"
++
++#~ msgid "transmitted / received"
++#~ msgstr "transmès / rebut"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "Xarxes contingudes"
++
++#~ msgid "all"
++#~ msgstr "tots"
++
++#~ msgid "Code"
++#~ msgstr "Codi"
++
++#~ msgid "Distance"
++#~ msgstr "Distància"
++
++#~ msgid "Legend"
++#~ msgstr "Llegenda"
++
++#~ msgid "Library"
++#~ msgstr "Llibreria"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "pàgina de manual de &#39;%s&#39;"
++
++#~ msgid "Package Manager"
++#~ msgstr "Gestor de paquets"
++
++#~ msgid "Service"
++#~ msgstr "Servei"
++
++#~ msgid "Statistics"
++#~ msgstr "Estadístiques"
++
++#~ msgid "zone"
++#~ msgstr "Zona"
+diff --git a/feeds/luci/modules/luci-base/po/cs/base.po b/feeds/luci/modules/luci-base/po/cs/base.po
+new file mode 100644
+index 0000000..da953ae
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/cs/base.po
+@@ -0,0 +1,3494 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-31 13:59+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d minutové okno, %d sekundový interval)"
++
++msgid "(%s available)"
++msgstr "(%s k dispozici)"
++
++msgid "(empty)"
++msgstr "(prázdný)"
++
++msgid "(no interfaces attached)"
++msgstr "(bez rozhraní připojení)"
++
++msgid "-- Additional Field --"
++msgstr "-- Doplňující pole --"
++
++msgid "-- Please choose --"
++msgstr "-- Prosím vyberte --"
++
++msgid "-- custom --"
++msgstr "-- vlastní --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Zatížení za 1 minutu:"
++
++msgid "15 Minute Load:"
++msgstr "Zatížení za 15 minut:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Zatížení za 5 minut:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "port dotazů <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "port serveru <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servery budou dotazovány podle "
++"pořadí resolvfile"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Internet Protokol Verze 4\">IPv4</abbr>-Adresa"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Verze 4\">IPv4</abbr>-Brána"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "<abbr title=\"Internet Protokol Verze 4\">IPv4</abbr>-Maska sítě"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Internet Protokol Verze 6\">IPv6</abbr>-Adresa nebo Síť (CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protokol Verze 6\">IPv6</abbr>-Brána"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Konfigurace"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Název"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-Adresa"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"Nejvyšší poÄet <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> výpůjÄek"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"Největší povolená velikost <abbr title=\"Extension Mechanisms for Domain "
++"Name System\">EDNS0</abbr> packetů"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "Nejvyšší poÄet souběžných dotazů"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "Podpora AR"
++
++msgid "ARP retry threshold"
++msgstr "ARP limit opakování"
++
++msgid "ATM Bridges"
++msgstr "ATM mosty"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "Identifikátor virtuálního kanálu ATM (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "Identifikátor virtuální cesty ATM (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"Otevře ATM mosty přes uzavřené ethernetové rozhraní v AAL5 připojení jako "
++"virtuální síťová rozhraní Linuxu, které mohou být použity ve spojení s DHCP "
++"nebo PPP vytáÄeného pÅ™ipojení od poskytovatele sítÄ›."
++
++msgid "ATM device number"
++msgstr "Äíslo ATM zařízení"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Přístupový koncentrátor"
++
++msgid "Access Point"
++msgstr "Přístupový bod"
++
++msgid "Action"
++msgstr "Akce"
++
++msgid "Actions"
++msgstr "Akce"
++
++msgid "Activate this network"
++msgstr "Aktivovat tuto síť"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++"Aktivní záznamy ve směrovací tabulce <abbr title=\"Internet Protocol Version "
++"4\">IPv4</abbr>"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++"Aktivní záznamy ve směrovací tabulce <abbr title=\"Internet Protocol Version "
++"6\">IPv6</abbr>"
++
++msgid "Active Connections"
++msgstr "Aktivní spojení"
++
++msgid "Active DHCP Leases"
++msgstr "Aktivní propůjÄené DHCP adresy (leases)"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Aktivní propůjÄené DHCPv6 adresy (leases)"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Přidat"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr "Přidat lokální koncovku k doménovým jménům ze souboru hosts"
++
++msgid "Add new interface..."
++msgstr "Přidat rozhraní..."
++
++msgid "Additional Hosts files"
++msgstr "DodateÄné Hosts soubory"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Adresa"
++
++msgid "Address to access local relay bridge"
++msgstr "Adresa pro přístup k místnímu relay bridge"
++
++msgid "Administration"
++msgstr "Správa"
++
++msgid "Advanced Settings"
++msgstr "PokroÄilé nastavení"
++
++msgid "Alert"
++msgstr "Upozornění"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr "Povolit <abbr title=\"Secure Shell\">SSH</abbr> autentizaci heslem"
++
++msgid "Allow all except listed"
++msgstr "Povolit vše mimo uvedené"
++
++msgid "Allow listed only"
++msgstr "Povolit pouze uvedené"
++
++msgid "Allow localhost"
++msgstr "Povolit localhost"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"Povolit vzdáleným hostitelům připojování k místním portům přesměrovaným "
++"pomocí SSH"
++
++msgid "Allow root logins with password"
++msgstr "Povolit pÅ™ihlaÅ¡ovaní root úÄtu pomocí hesla"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "Povolit <em>root</em> úÄtu pÅ™ihlášení bez nastaveného hesla"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr "Povolit upstream odpovědi na 127.0.0.0/8 rozsah, např. pro RBL služby"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "Pokud není zaÅ¡krtnuto, bude vytvoÅ™ena dodateÄná síť."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Anténa 1"
++
++msgid "Antenna 2"
++msgstr "Anténa 2"
++
++msgid "Antenna Configuration"
++msgstr "Konfigurace antén"
++
++msgid "Any zone"
++msgstr "Libovolná zóna"
++
++msgid "Apply"
++msgstr "Použít"
++
++msgid "Applying changes"
++msgstr "Probíhá uplatňování nastavení"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Přiřadit rozhraní..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Připojení klienti"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Atheros 802.11%s bezdrátový ovladaÄ"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Autentizace"
++
++msgid "Authoritative"
++msgstr "Autoritativní"
++
++msgid "Authorization Required"
++msgstr "Vyžadována autorizace"
++
++msgid "Auto Refresh"
++msgstr "Automaticky obnovovat"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Dostupné"
++
++msgid "Available packages"
++msgstr "Dostupné balíÄky"
++
++msgid "Average:"
++msgstr "Průměr:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Zpět"
++
++msgid "Back to Overview"
++msgstr "Zpět k přehledu"
++
++msgid "Back to configuration"
++msgstr "Zpět ke konfiguraci"
++
++msgid "Back to overview"
++msgstr "Zpět k přehledu"
++
++msgid "Back to scan results"
++msgstr "Zpět k výsledkům vyhledávání"
++
++msgid "Background Scan"
++msgstr "Vyhledávat na pozadí"
++
++msgid "Backup / Flash Firmware"
++msgstr "Zálohovat / nahrát firmware"
++
++msgid "Backup / Restore"
++msgstr "Zálohovat / obnovit"
++
++msgid "Backup file list"
++msgstr "Seznam souborů k zálohování"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"Seznam souborů k zálohování lze nalézt níže. Sestává se z konfiguraÄních "
++"souborů oznaÄených opkg, nezbyných systémových souborů a souborů "
++"vyhovujících uživatelem urÄeným vzorům."
++
++msgid "Bitrate"
++msgstr "Přenosová rychlost"
++
++msgid "Bogus NX Domain Override"
++msgstr "Přepíše falešnou hodnotu NX Domény"
++
++msgid "Bridge"
++msgstr "Síťový most"
++
++msgid "Bridge interfaces"
++msgstr "Síťové mosty"
++
++msgid "Bridge unit number"
++msgstr "Číslo síťového mostu"
++
++msgid "Bring up on boot"
++msgstr "Zapnout po startu"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Broadcom 802.11%s bezdrátový ovladaÄ"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Broadcom modul BCM%04x 802.11 bezdrátový ovladaÄ"
++
++msgid "Buffered"
++msgstr "Bufferováno"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "TlaÄítka"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "Vytížení CPU (%)"
++
++msgid "Cancel"
++msgstr "Storno"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Řetěz"
++
++msgid "Changes"
++msgstr "Změny"
++
++msgid "Changes applied."
++msgstr "Změny aplikovány."
++
++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 "Check"
++msgstr "Kontrola"
++
++msgid "Checksum"
++msgstr "Kontrolní souÄet"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Zóna firewallu přiřazená k tomuto rozhraní. Pro odstranění rozhraní z "
++"přiřazené zóny vyberte volbu <em>nespecifikovaná</em>. Pro vytvoření nové "
++"zóny a její následné přiřazení danému rozhraní vyplňte pole <em>vytvořit</"
++"em>."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Vyberte síť(ě), které chcete připojit k tomuto bezdrátovému rozhraní, nebo "
++"vyplňte pole <em>vytvořit</em> a pojmenujte novou síť."
++
++msgid "Cipher"
++msgstr "Å ifra"
++
++msgid ""
++"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)."
++msgstr ""
++"Pro stažení archivu tar s aktuální konfigurací stiskněte \"Vytvořit archiv"
++"\". Pro obnovení továrního nastavení stiskněte \"Obnovit výchozí\" (možné "
++"pouze s obrazy squashfs)."
++
++msgid "Client"
++msgstr "Klient"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "Klientské ID odesílané v DHCP požadavku"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Uzavírat neaktivní spojení po daném poÄtu sekund. Pro vypnutí Äasového "
++"omezení použijte jako hodntu nulu"
++
++msgid "Close list..."
++msgstr "Zavřít seznam..."
++
++msgid "Collecting data..."
++msgstr "Probíhá sběr dat..."
++
++msgid "Command"
++msgstr "Příkaz"
++
++msgid "Common Configuration"
++msgstr "SpoleÄná nastavení"
++
++msgid "Compression"
++msgstr "Komprese"
++
++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 "Confirmation"
++msgstr "Ověření"
++
++msgid "Connect"
++msgstr "Připojit"
++
++msgid "Connected"
++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 "Country"
++msgstr "ZemÄ›"
++
++msgid "Country Code"
++msgstr "Kód země"
++
++msgid "Cover the following interface"
++msgstr "Pokrýt následující rozhraní"
++
++msgid "Cover the following interfaces"
++msgstr "Pokrýt následující rozhraní"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Vytvořit / přiřadit zónu firewallu"
++
++msgid "Create Interface"
++msgstr "Vytvořit rozhraní"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Vytvořit síťový most přes více rozhraní"
++
++msgid "Critical"
++msgstr "Kritické"
++
++msgid "Cron Log Level"
++msgstr "Úroveň protokolování Cronu"
++
++msgid "Custom Interface"
++msgstr "Vlastní rozhraní"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Upraví chování <abbr title=\"Light Emitting Diode\">LED</abbr> diod zařízení "
++"pokud je to možné."
++
++msgid "DHCP Leases"
++msgstr "DHCP výpůjÄky"
++
++msgid "DHCP Server"
++msgstr "DHCP server"
++
++msgid "DHCP and DNS"
++msgstr "DHCP a DNS"
++
++msgid "DHCP client"
++msgstr "DHCP klient"
++
++msgid "DHCP-Options"
++msgstr "Volby DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr "DHCPv6 přidělené IP"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "Přeposílání DNS"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Ladění"
++
++msgid "Default %d"
++msgstr "Výchozí %d"
++
++msgid "Default gateway"
++msgstr "Výchozí brána"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Výchozí stav"
++
++msgid "Define a name for this network."
++msgstr "Jméno sítě."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Další možnosti DHCP, například \"<code>6,192.168.2.1,192.168.2.2</code>\", "
++"které odkazuje na různé DNS servery pro klienty."
++
++msgid "Delete"
++msgstr "Odstranit"
++
++msgid "Delete this interface"
++msgstr "Odstranit toto rozhraní"
++
++msgid "Delete this network"
++msgstr "Odstranit tuto síť"
++
++msgid "Description"
++msgstr "Popis"
++
++msgid "Design"
++msgstr "Vzhled"
++
++msgid "Destination"
++msgstr "Cíl"
++
++msgid "Device"
++msgstr "Zařízení"
++
++msgid "Device Configuration"
++msgstr "Nastavení zařízení"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnostika"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Adresář"
++
++msgid "Disable"
++msgstr "Zakázat"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Pro toto rozhraní zakázat <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>."
++
++msgid "Disable DNS setup"
++msgstr "Zakázat nastavení DNS"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Zakázat HW-Beacon ÄasovaÄ"
++
++msgid "Disabled"
++msgstr "Zakázáno"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Vyřadit upstream RFC1918 odpovědi"
++
++msgid "Displaying only packages containing"
++msgstr "Zobrazeny pouze balíÄky obsahující"
++
++msgid "Distance Optimization"
++msgstr "Optimalizace na vzdálenost"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Vzdálenost nejodlehlejšího Älena sítÄ› v metrech."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Diverzita"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq je kombinace <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr> serveru a <abbr title=\"Domain Name System\">DNS</abbr> "
++"forwarderu pro použití v <abbr title=\"Network Address Translation\">NAT</"
++"abbr> firewallech"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr "Necachovat negativní odpovědi (např. pro neexistující domény)"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr ""
++"Nepřeposílat požadavky, které nemohou být zodpovězeny veřejnými jmennými "
++"servery"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr "Nepřeposílat reverzní dotazy na místní sítě"
++
++msgid "Do not send probe responses"
++msgstr "Neodpovídat na vyhledávání"
++
++msgid "Domain required"
++msgstr "Vyžadována doména"
++
++msgid "Domain whitelist"
++msgstr "Whitelist domén"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Nepřeposílat <abbr title=\"Domain Name System\">DNS</abbr> dotazy bez <abbr "
++"title=\"Domain Name System\">DNS</abbr> jména"
++
++msgid "Download and install package"
++msgstr "Stáhnout a nainstalovat balíÄek"
++
++msgid "Download backup"
++msgstr "Stáhnout zálohu"
++
++msgid "Dropbear Instance"
++msgstr "Instance Dropbear"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear poskytuje <abbr title=\"Secure Shell\">SSH</abbr> přístup a <abbr "
++"title=\"Secure Copy\">SCP</abbr> server"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"Dynamický <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++
++msgid "Dynamic tunnel"
++msgstr "Dynamický tunel"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"Pro klienty alokovat DHCP adresy dynamicky. Pokud je volba zakázána, budou "
++"obsloužení pouze klienti se statickými výpůjÄkami."
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "Metoda EAP"
++
++msgid "Edit"
++msgstr "Upravit"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Upravit toto rozhraní"
++
++msgid "Edit this network"
++msgstr "Upravit tuto síť"
++
++msgid "Emergency"
++msgstr "Záchrana"
++
++msgid "Enable"
++msgstr "Povolit"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Povolit <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "Povolit dynamickou aktualizaci koncového bodu HE.net"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "Povolit průchod jumbo rámců"
++
++msgid "Enable NTP client"
++msgstr "Povolit NTP klienta"
++
++msgid "Enable TFTP server"
++msgstr "Povolit TFTP server"
++
++msgid "Enable VLAN functionality"
++msgstr "Povolit funkcionalitu VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Povolit ARP uÄení a stárnutí"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "Povolit tento přípojný bod"
++
++msgid "Enable this swap"
++msgstr "Povolit tento swapovací oddíl"
++
++msgid "Enable/Disable"
++msgstr "Povolit/Zakázat"
++
++msgid "Enabled"
++msgstr "Povoleno"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Na tomto síťovém mostě povolit Spanning Tree Protocol"
++
++msgid "Encapsulation mode"
++msgstr "Režim zapouzdření"
++
++msgid "Encryption"
++msgstr "Šifrování"
++
++msgid "Erasing..."
++msgstr "Odstraňování..."
++
++msgid "Error"
++msgstr "Chyba"
++
++msgid "Ethernet Adapter"
++msgstr "Ethernetový adaptér"
++
++msgid "Ethernet Switch"
++msgstr "Ethernetový switch"
++
++msgid "Expand hosts"
++msgstr "Rozšířit hostitele"
++
++msgid "Expires"
++msgstr "Vyprší"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++"ÄŒas vyprÅ¡ení vypůjÄené adresy, minimum jsou 2 minuty (<code>2m</code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Externí protokolovací server"
++
++msgid "External system log server port"
++msgstr "Port externího protokolovacího serveru"
++
++msgid "Fast Frames"
++msgstr "Rychlé rámce"
++
++msgid "File"
++msgstr "Soubor"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Název souboru s bootovacím obrazem oznamovaný klientům"
++
++msgid "Filesystem"
++msgstr "Souborový systém"
++
++msgid "Filter"
++msgstr "Filtr"
++
++msgid "Filter private"
++msgstr "Filtrovat soukromé"
++
++msgid "Filter useless"
++msgstr "Filtrovat nepotřebné"
++
++msgid "Find and join network"
++msgstr "Vyhledat a připojit síť"
++
++msgid "Find package"
++msgstr "Vyhledat balíÄek"
++
++msgid "Finish"
++msgstr "DokonÄit"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall Settings"
++msgstr "Nastavení firewallu"
++
++msgid "Firewall Status"
++msgstr "Stav firewallu"
++
++msgid "Firmware Version"
++msgstr "Verze firmwaru"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "Pevný zdrojový port pro odchozí DNS dotazy"
++
++msgid "Flags"
++msgstr "Příznaky"
++
++msgid "Flash Firmware"
++msgstr "Nahrát firmware"
++
++msgid "Flash image..."
++msgstr "Nahrát obraz..."
++
++msgid "Flash new firmware image"
++msgstr "Nahrát nový obraz s firmwarem"
++
++msgid "Flash operations"
++msgstr "Operace nad flash pamětí"
++
++msgid "Flashing..."
++msgstr "Nahrávám..."
++
++msgid "Force"
++msgstr "Vynutit"
++
++msgid "Force CCMP (AES)"
++msgstr "Vynutit CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr "Na této síti vynutit DHCP i v případě detekování jiného serveru."
++
++msgid "Force TKIP"
++msgstr "Vynutit TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "Vynutit TKIP a CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "Přeposílat DHCP provoz"
++
++msgid "Forward broadcast traffic"
++msgstr "Přeposílat broadcasty"
++
++msgid "Forwarding mode"
++msgstr "Režim přeposílání"
++
++msgid "Fragmentation Threshold"
++msgstr "Hranice fragmentace"
++
++msgid "Frame Bursting"
++msgstr "Dávkování rámců"
++
++msgid "Free"
++msgstr "Volné"
++
++msgid "Free space"
++msgstr "Volné místo"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "Pouze GPRS"
++
++msgid "Gateway"
++msgstr "Brána"
++
++msgid "Gateway ports"
++msgstr "Porty brány"
++
++msgid "General Settings"
++msgstr "Obecná nastavení"
++
++msgid "General Setup"
++msgstr "Obecné nastavení"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "VytvorÇt archív"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Generic 802.11%s Wireless Controller"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr "Heslo nezměněno z důvodu nesouhlasu nového hesla a ověření hesla!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Přejít na nastavení hesla..."
++
++msgid "Go to relevant configuration page"
++msgstr "PÅ™ejít na související konfiguraÄní stránku"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "Heslo HE.net"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Handler"
++
++msgid "Hang Up"
++msgstr "Zavěsit"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Nastavení základních vlastností zařízení jako je Äasová zóna nebo název "
++"zařízení."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++"Vložte veÅ™ejné klíÄe (na každý Å™adek jeden) pro ověřovaní SSH přístupu."
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Hermes 802.11b bezdrátový ovladaÄ"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "Skrývat <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "Záznamy hostitelů"
++
++msgid "Host expiry timeout"
++msgstr "VyprÅ¡ení Äasového limitu hostitele"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++"<abbr title=\"Internet Protocol Address\">IP</abbr> adresa hostitele nebo síť"
++
++msgid "Hostname"
++msgstr "Jméno hostitele"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "Jméno hostitele odesílané s DHCP požadavky"
++
++msgid "Hostnames"
++msgstr "Jména hostitelů"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "IP adresy"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "IPv4 firewall"
++
++msgid "IPv4 WAN Status"
++msgstr "Stav IPv4 WAN"
++
++msgid "IPv4 address"
++msgstr "IPv4 adresa"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 a IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "IPv4 broadcast"
++
++msgid "IPv4 gateway"
++msgstr "IPv4 brána"
++
++msgid "IPv4 netmask"
++msgstr "IPv4 maska sítě"
++
++msgid "IPv4 only"
++msgstr "Pouze IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "Délka IPv4 prefixu"
++
++msgid "IPv4-Address"
++msgstr "IPv4 adresa"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "IPv6 firewall"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "Stav IPv6 WAN"
++
++msgid "IPv6 address"
++msgstr "IPv6 adresa"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "IPv6 brána"
++
++msgid "IPv6 only"
++msgstr "Pouze IPv6"
++
++msgid "IPv6 prefix"
++msgstr "IPv6 prefix"
++
++msgid "IPv6 prefix length"
++msgstr "Délka IPv6 prefixu"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "IPv6 adresa"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-in-IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6-over-IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6-over-IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "Identita"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr "Namísto pevného uzlu zařízení připojovat pomocí UUID"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr "Namísto pevného uzlu zařízení připojovat pomocí názvu oddílu"
++
++msgid "If unchecked, no default route is configured"
++msgstr "Pokud není povoleno, není nastaven žádný výchozí směrovací záznam"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr "Pokud není povoleno, oznámené adresy DNS serverů budou ignorovány"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Pokud máte nedostatek fyzické pamÄ›ti, nepoužívaná data mohou být doÄasnÄ› "
++"odložena do odkládacího zařízení, což bude mít za důsledek větší množství "
++"použitelné <abbr title=\"Random Access Memory\">RAM</abbr>. Vezměte na "
++"vědomí, že odkládání dat je velice pomalý proces, stejně jako fakt, že "
++"přístup na odkládací zařízení je řádově pomalejší, než přístup do paměti "
++"<abbr title=\"Random Access Memory\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr "Ignorovat rozhraní"
++
++msgid "Ignore resolve file"
++msgstr "Ignorovat resolv soubor"
++
++msgid "Image"
++msgstr "Obraz"
++
++msgid "In"
++msgstr "DovnitÅ™"
++
++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 "ÄŒasový limit neÄinnosti"
++
++msgid "Inbound:"
++msgstr "Příchozí:"
++
++msgid "Info"
++msgstr "Info"
++
++msgid "Initscript"
++msgstr "Initskript"
++
++msgid "Initscripts"
++msgstr "Initskripty"
++
++msgid "Install"
++msgstr "Instalovat"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Instalovat balíÄek %q"
++
++msgid "Install protocol extensions..."
++msgstr "Instalovat protokolové rozšíření..."
++
++msgid "Installed packages"
++msgstr "Nainstalované balíÄky"
++
++msgid "Interface"
++msgstr "Rozhraní"
++
++msgid "Interface Configuration"
++msgstr "Konfigurace rozhraní"
++
++msgid "Interface Overview"
++msgstr "Přehled rozhraní"
++
++msgid "Interface is reconnecting..."
++msgstr "Rozhraní se znovu připojuje..."
++
++msgid "Interface is shutting down..."
++msgstr "Rozhraní se vypíná..."
++
++msgid "Interface not present or not connected yet."
++msgstr "Rozhraní není přítomné nebo je dosud nepřipojeno."
++
++msgid "Interface reconnected"
++msgstr "Rozhraní bylo znovu připojeno"
++
++msgid "Interface shut down"
++msgstr "Rozhraní bylo vypnuto"
++
++msgid "Interfaces"
++msgstr "Rozhraní"
++
++msgid "Internal"
++msgstr ""
++
++# Není co dodat.
++msgid "Internal Server Error"
++msgstr "Vnitřní chyba serveru"
++
++msgid "Invalid"
++msgstr "Neplatná vstupní hodnota"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++"Uvedené VLAN ID je neplatné! Jsou povolena pouze ID z rozsahu %d až %d."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "Uvedené VLAN ID je neplatné! Každé ID musí být jedineÄné"
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Špatné uživatelské jméno a/nebo heslo! Prosím zkuste to znovu."
++
++#, 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 ""
++"Zdá se, že se pokoušíte zapsat obraz, který se nevejde do flash paměti. "
++"Prosím ověřte soubor s obrazem!"
++
++msgid "Java Script required!"
++msgstr "Vyžadován JavaScript!"
++
++msgid "Join Network"
++msgstr "Připojit k síti"
++
++msgid "Join Network: Settings"
++msgstr "Připojit k síti: nastavení"
++
++msgid "Join Network: Wireless Scan"
++msgstr "Připojit k síti: Vyhledání bezdrátových sítí"
++
++msgid "Keep settings"
++msgstr "Zachovat nastavení"
++
++msgid "Kernel Log"
++msgstr "Záznam jádra"
++
++msgid "Kernel Version"
++msgstr "Verze jádra"
++
++msgid "Key"
++msgstr "KlíÄ"
++
++msgid "Key #%d"
++msgstr "KlÃ­Ä #%d"
++
++msgid "Kill"
++msgstr "Zabít"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "L2TP Server"
++
++msgid "LCP echo failure threshold"
++msgstr "LCP echo prahová hodnota selhání"
++
++msgid "LCP echo interval"
++msgstr "LCP interval upozornění"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Popis"
++
++msgid "Language"
++msgstr "Jazyk"
++
++msgid "Language and Style"
++msgstr "Jazyk a styl"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Doba platnosti zápůjÄky"
++
++msgid "Leasefile"
++msgstr "Soubor zájpůjÄek"
++
++msgid "Leasetime"
++msgstr "Doba trvání zápůjÄky"
++
++msgid "Leasetime remaining"
++msgstr "Zbývající doba trvání zápůjÄky"
++
++msgid "Leave empty to autodetect"
++msgstr "Ponechte prázdné pro automatickou detekci"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "Ponecháte-li prázdné, použije stávající WAN adresu"
++
++msgid "Legend:"
++msgstr "Legenda:"
++
++msgid "Limit"
++msgstr "Limit"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Odkaz na"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"Seznam <abbr title=\"Domain Name System\">DNS</abbr> serverů, na které "
++"přeposílat požadavky"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "Seznam domén, pro které povolit odpovědi podle RFC1918"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr "Seznam hostitelů, kteří udávají falešné hodnoty NX domén"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++"Poslouchat pouze na daném rozhraní, nebo pokud není specifikováno, na všech"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Port pro příchozí dotazy DNS"
++
++msgid "Load"
++msgstr "Zátěž"
++
++msgid "Load Average"
++msgstr "Zátěž průměrná"
++
++msgid "Loading"
++msgstr "NaÄítání"
++
++msgid "Local IPv4 address"
++msgstr "Místní IPv4 adresa"
++
++msgid "Local IPv6 address"
++msgstr "Místní IPv6 adresa"
++
++msgid "Local Startup"
++msgstr "Místní startup"
++
++msgid "Local Time"
++msgstr "Místní Äas"
++
++msgid "Local domain"
++msgstr "Místní doména"
++
++#, fuzzy
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++"Specifikace místní domény. Jména shodná s touto doménou nikdy nebudou "
++"přesměrována ani rozlušťována pomocí DHCP nebo souborů hosts"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++"Přípona místní domény, připojená za názvy DHCP jmen a záznamů v souboru hosts"
++
++msgid "Local server"
++msgstr "Místní server"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++"Lokalizovat jméno v závislosti na dotazující se podsíti, pokud bylo nalezeno "
++"více IP adres"
++
++msgid "Localise queries"
++msgstr "LokalizaÄní dotazy"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Úroveň logování"
++
++msgid "Log queries"
++msgstr "Dotazy pro logování"
++
++msgid "Logging"
++msgstr "Logování"
++
++msgid "Login"
++msgstr "Přihlásit"
++
++msgid "Logout"
++msgstr "Odhlásit"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr "Nejnižší zapůjÄenou adresu použít jako offset síťové adresy."
++
++msgid "MAC-Address"
++msgstr "MAC-Adresa"
++
++msgid "MAC-Address Filter"
++msgstr "Filtr MAC adres"
++
++msgid "MAC-Filter"
++msgstr "Filtr MAC"
++
++msgid "MAC-List"
++msgstr "Seznam Mac"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Nejvyšší míra"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "Nejvyšší povolené množství aktivních DHCP zápůjÄek"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "Nejvyšší povolené množství souběžných DNS dotazů"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "Nejvyšší povolená velikost EDNS.0 UDP paketů"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "Nejvyšší poÄet sekund Äekání, než bude modem pÅ™ipraven"
++
++msgid "Maximum hold time"
++msgstr "Maximální doba držení"
++
++msgid "Maximum number of leased addresses."
++msgstr "Maximální poÄet zapůjÄených adres."
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "Paměť"
++
++msgid "Memory usage (%)"
++msgstr "Využití paměti (%)"
++
++msgid "Metric"
++msgstr "Metrika"
++
++msgid "Minimum Rate"
++msgstr "Nejnižší hodnota"
++
++msgid "Minimum hold time"
++msgstr "Minimální Äas zápůjÄky"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "Chybějící rozšíření protokolu %q"
++
++msgid "Mode"
++msgstr "Mód"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Modemové zařízení"
++
++msgid "Modem init timeout"
++msgstr "Časový limit inicializace modemu"
++
++msgid "Monitor"
++msgstr "Sledování"
++
++msgid "Mount Entry"
++msgstr "Připojit vstup"
++
++msgid "Mount Point"
++msgstr "Přípojný bod"
++
++msgid "Mount Points"
++msgstr "Přípojné body"
++
++msgid "Mount Points - Mount Entry"
++msgstr "Přípojné body - vstupy"
++
++msgid "Mount Points - Swap Entry"
++msgstr "Přípojné body - změna vstupu"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Přípojný bod urÄuje místo v souborovém systému, na kterém bude pÅ™ipojeno "
++"paměťové zařízení"
++
++msgid "Mount options"
++msgstr "Volby připojení"
++
++msgid "Mount point"
++msgstr "Přípojný bod"
++
++msgid "Mounted file systems"
++msgstr "Připojené souborové systémy"
++
++msgid "Move down"
++msgstr "Přesunout dolů"
++
++msgid "Move up"
++msgstr "Přesunout nahoru"
++
++msgid "Multicast Rate"
++msgstr "Hodnota vícesměrového vysílání"
++
++msgid "Multicast address"
++msgstr "Adresa vícesměrového vysílání"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "Kandidáti NTP serveru"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Název"
++
++msgid "Name of the new interface"
++msgstr "Název nového rozhraní"
++
++msgid "Name of the new network"
++msgstr "Název nové sítě"
++
++msgid "Navigation"
++msgstr "Navigace"
++
++msgid "Netmask"
++msgstr "Síťová maska"
++
++msgid "Network"
++msgstr "Síť"
++
++msgid "Network Utilities"
++msgstr "Síťové nástroje"
++
++msgid "Network boot image"
++msgstr "Síťový bootovací obraz"
++
++msgid "Network without interfaces."
++msgstr "Síť bez rozhraní."
++
++msgid "Next »"
++msgstr "Další »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Pro toto rozhraní není nastaven žádný DHCP server"
++
++msgid "No chains in this table"
++msgstr "Žádné řetězce v této tabulce"
++
++msgid "No files found"
++msgstr "Nebyly nalezeny žádné soubory"
++
++msgid "No information available"
++msgstr "Údaje nejsou k dispozici"
++
++msgid "No negative cache"
++msgstr "Žádná negativní mezipaměť"
++
++msgid "No network configured on this device"
++msgstr "Síť není nastavena na tomto zařízení"
++
++msgid "No network name specified"
++msgstr "Neuvedeno jméno sítě"
++
++msgid "No package lists available"
++msgstr "Seznam balíÄků není k dispozici"
++
++msgid "No password set!"
++msgstr "Žádné heslo!"
++
++msgid "No rules in this chain"
++msgstr "Žádná pravidla v tomto řetězci"
++
++msgid "No zone assigned"
++msgstr "Žádná zóna nepřiřazena"
++
++msgid "Noise"
++msgstr "Å um"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Å um:"
++
++msgid "None"
++msgstr "Žádný"
++
++msgid "Normal"
++msgstr "Normální"
++
++msgid "Not Found"
++msgstr "Nenalezeno"
++
++msgid "Not associated"
++msgstr "Neasociováno"
++
++msgid "Not connected"
++msgstr "Nepřipojeno"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Pozn: KonfiguraÄní soubory budou vymazány."
++
++msgid "Notice"
++msgstr "Oznámení"
++
++msgid "Nslookup"
++msgstr "Nslookup"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "Konfigurace balíÄků OPKG"
++
++msgid "Off-State Delay"
++msgstr "Vypnutí prodlevy"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Na této stránce můžete nastavit síťová rozhraní. Můžete přemostit několik "
++"rozhraní zaškrtnutím pole \"přemostit rozhraní\" a zápisem názvů rozhraní, "
++"vzájemně oddělených mezerami. Také můžete použít <abbr title=\"Virtual Local "
++"Area Network\">VLAN</abbr> zápis <samp>INTERFACE.VLANNR</samp> (<abbr title="
++"\"například\">např.</abbr>: <samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr "Zapnutí prodlevy"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "Jedno jméno nebo mac adresa, musí být zadáno!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "Jedno nebo více polí obsahuje neplatné hodnoty!"
++
++msgid "One or more required fields have no value!"
++msgstr "Jedno nebo více požadovaných polí neobsahuje hodnotu!"
++
++msgid "Open list..."
++msgstr "Otevřít seznam..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Volba změněna"
++
++msgid "Option removed"
++msgstr "Volba odstraněna"
++
++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 "Options"
++msgstr "Možnosti"
++
++msgid "Other:"
++msgstr "Ostatní:"
++
++msgid "Out"
++msgstr "Ven"
++
++msgid "Outbound:"
++msgstr "Odchozí:"
++
++msgid "Outdoor Channels"
++msgstr "Venkovní kanály"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "Přepsat MAC adresu"
++
++msgid "Override MTU"
++msgstr "Přepsat MTU"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "Přepsat bránu v DHCP odpovědích"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++"PÅ™epsat síťovou masku, odesílanou klientům. Obvykle je spoÄítána podle "
++"subsítě, která je obsluhována."
++
++msgid "Override the table used for internal routes"
++msgstr "Přepsat tabulku, používanou pro vnitřní cesty"
++
++msgid "Overview"
++msgstr "Přehled"
++
++msgid "Owner"
++msgstr "Vlastník"
++
++msgid "PAP/CHAP password"
++msgstr "Heslo PAP/CHAP"
++
++msgid "PAP/CHAP username"
++msgstr "Uživatelské jméno PAP/CHAP"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "Zapouzdření PPPoA"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "Vyžadován balíÄek libiwinfo!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "Seznamy balíÄků jsou starší než 24 hodin"
++
++msgid "Package name"
++msgstr "Název balíÄku"
++
++msgid "Packets"
++msgstr "Pakety"
++
++msgid "Part of zone %q"
++msgstr "Část zóny %q"
++
++msgid "Password"
++msgstr "Heslo"
++
++msgid "Password authentication"
++msgstr "Autentizace heslem"
++
++msgid "Password of Private Key"
++msgstr "Heslo privátního klíÄe"
++
++msgid "Password successfully changed!"
++msgstr "Heslo bylo úspěšně změněno!"
++
++msgid "Path to CA-Certificate"
++msgstr "Cesta k certifikátu CA"
++
++msgid "Path to Client-Certificate"
++msgstr "Cesta k certifikátu klienta"
++
++msgid "Path to Private Key"
++msgstr "Cesta k privátnímu klíÄi"
++
++msgid "Path to executable which handles the button event"
++msgstr "Cesta ke spustitelnému souboru, který obsluhuje událost tlaÄítka"
++
++msgid "Peak:"
++msgstr "Å piÄka:"
++
++msgid "Perform reboot"
++msgstr "Provést restart"
++
++msgid "Perform reset"
++msgstr "Provést reset"
++
++msgid "Phy Rate:"
++msgstr "Fyzická rychlost:"
++
++msgid "Physical Settings"
++msgstr "Fyzické nastavení"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Pkts."
++msgstr "Paketů"
++
++msgid "Please enter your username and password."
++msgstr "Prosím vložte vaše uživatelské jméno a heslo."
++
++msgid "Policy"
++msgstr "Politika"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Port %d"
++msgstr "Port %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr "Port %d je neoznaÄený ve více VLAN!"
++
++msgid "Port status:"
++msgstr "Stav portu:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++"Po takovém množství LCP echo selhání předpokládám, že peer je mrtvý. "
++"Použijte 0 pro ignorování chyb"
++
++msgid "Prevents client-to-client communication"
++msgstr "Zabraňuje komunikaci klient-klient"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Prism2/2.5/3 802.11b Wireless Controller"
++
++msgid "Proceed"
++msgstr "PokraÄovat"
++
++msgid "Processes"
++msgstr "Procesy"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protokol"
++
++msgid "Protocol family"
++msgstr "Rodina protokolů"
++
++msgid "Protocol of the new interface"
++msgstr "Protokol nového rozhraní"
++
++msgid "Protocol support is not installed"
++msgstr "Podpora pro protokol není nainstalována"
++
++msgid "Provide NTP server"
++msgstr "Poskytování NTP serveru"
++
++msgid "Provide new network"
++msgstr "Poskytování nové sítě"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "Kvalita"
++
++msgid "RTS/CTS Threshold"
++msgstr "Práh RTS/CTS"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr "RX Rate"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "RaLink 802.11%s Wireless Controller"
++
++msgid "Radius-Accounting-Port"
++msgstr "Port pro Radius-Accounting"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Tajný klÃ­Ä pro Radius-Accounting"
++
++msgid "Radius-Accounting-Server"
++msgstr "Server Radius-Accounting"
++
++msgid "Radius-Authentication-Port"
++msgstr "Výběr ověřování portů"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Tajný klÃ­Ä pro Radius-Authentication"
++
++msgid "Radius-Authentication-Server"
++msgstr "Server Radius-Authentication"
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"PÅ™eÄtÄ›te si <code>/etc/ethers</code> ke konfiguraci <abbr title=\"Dynamic "
++"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."
++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 "
++"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"
++"Můžete ztratit přístup k zařízení, pokud jste připojeni prostřednictvím této "
++"sítě."
++
++msgid "Really reset all changes?"
++msgstr "Opravdu resetovat všechny změny?"
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou might lose access to this device if you are "
++"connected via this interface."
++msgstr ""
++"Opravdu vypnout síť ?\n"
++"Můžete ztratit přístup k zařízení, pokud jste připojeni prostřednictvím "
++"tohoto rozhraní."
++
++msgid ""
++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
++"you are connected via this interface."
++msgstr ""
++"Opravdu vypnout rozhraní \"%s\" ?\n"
++"Můžete ztratit přístup k zařízení, pokud jste připojeni prostřednictvím "
++"tohoto rozhraní."
++
++msgid "Really switch protocol?"
++msgstr "Opravdu prohodit protokol?"
++
++msgid "Realtime Connections"
++msgstr "PÅ™ipojení v reálném Äase"
++
++msgid "Realtime Graphs"
++msgstr "Grafy v reálném Äase"
++
++msgid "Realtime Load"
++msgstr "Zátěž v reálném Äase"
++
++msgid "Realtime Traffic"
++msgstr "Provoz v reálném Äase"
++
++msgid "Realtime Wireless"
++msgstr "Wireless v reálném Äase"
++
++msgid "Rebind protection"
++msgstr "Opětovné nastavení ochrany"
++
++msgid "Reboot"
++msgstr "Reboot"
++
++msgid "Rebooting..."
++msgstr "Rebootuji..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Rebootuje operaÄní systém vaÅ¡eho zařízení"
++
++msgid "Receive"
++msgstr "Přijmout"
++
++msgid "Receiver Antenna"
++msgstr "Přijímací anténa"
++
++msgid "Reconnect this interface"
++msgstr "Přepojit toto rozhraní"
++
++msgid "Reconnecting interface"
++msgstr "Přepojuji rozhraní"
++
++msgid "References"
++msgstr "Reference"
++
++msgid "Regulatory Domain"
++msgstr "Doména regulátora"
++
++msgid "Relay"
++msgstr "Přenos"
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr "Přenášet mezi sítěmi"
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr "Vzdálená IPv4 adresa"
++
++msgid "Remove"
++msgstr "Odstranit"
++
++msgid "Repeat scan"
++msgstr "Opakovat skenování"
++
++msgid "Replace entry"
++msgstr "Nahradit vstup"
++
++msgid "Replace wireless configuration"
++msgstr "Nahradit bezdrátovou konfiguraci"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++# Charter je poskytovate
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "Vyžadováno u některých ISP, např. Charter s DocSIS 3"
++
++msgid "Reset"
++msgstr "Reset"
++
++msgid "Reset Counters"
++msgstr "Resetovat ÄítaÄe"
++
++msgid "Reset to defaults"
++msgstr "Obnovit na výchozí"
++
++msgid "Resolv and Hosts Files"
++msgstr "Soubory Resolv a Hosts"
++
++msgid "Resolve file"
++msgstr "Soubor resolve"
++
++msgid "Restart"
++msgstr "Restart"
++
++msgid "Restart Firewall"
++msgstr "Restartovat firewall"
++
++msgid "Restore backup"
++msgstr "Obnovit zálohu"
++
++msgid "Reveal/hide password"
++msgstr "Odhalit/skrýt heslo"
++
++msgid "Revert"
++msgstr "Vrátit zpět"
++
++msgid "Root"
++msgstr "Root"
++
++msgid "Root directory for files served via TFTP"
++msgstr "Kořenový adresář souborů, přístupných přes TFTP"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Heslo routeru"
++
++msgid "Routes"
++msgstr "Trasy"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Trasy urÄují, pÅ™es jaké rozhraní a bránu může být konkrétního hosta dosaženo."
++
++msgid "Rule #"
++msgstr "Pravidlo #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr "Spustit kontrolu souborového systému před připojením zařízení"
++
++msgid "Run filesystem check"
++msgstr "Spustit kontrolu souborového systému"
++
++msgid ""
++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
++"use 6in4 instead"
++msgstr ""
++
++msgid "SIXXS-handle[/Tunnel-ID]"
++msgstr ""
++
++msgid "SSH Access"
++msgstr "Přístup přes SSH"
++
++msgid "SSH-Keys"
++msgstr "SSH klíÄe"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++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"
++
++msgid "Scheduled Tasks"
++msgstr "Naplánované úlohy"
++
++msgid "Section added"
++msgstr "Přidána sekce"
++
++msgid "Section removed"
++msgstr "Sekce odebrána"
++
++msgid "See \"mount\" manpage for details"
++msgstr "Podrobnosti viz manuálová stránka příkazu \"mount\""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++"Odesílat LCP echo požadaveky každých x sekund, úÄinné pouze ve spojení s "
++"prahem selhání."
++
++msgid "Separate Clients"
++msgstr "Oddělovat klienty"
++
++msgid "Separate WDS"
++msgstr "Oddělovat WDS"
++
++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"
++
++msgid "Service Type"
++msgstr "Typ služby"
++
++msgid "Services"
++msgstr "Služby"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "Nastavit synchronizaci Äasu"
++
++msgid "Setup DHCP Server"
++msgstr "Nastavit DHCP server"
++
++msgid "Show current backup file list"
++msgstr "Ukázat aktuální seznam záložních souborů"
++
++msgid "Shutdown this interface"
++msgstr "Shodit toho rozhraní"
++
++msgid "Shutdown this network"
++msgstr "Shodit tuto síť"
++
++msgid "Signal"
++msgstr "Signál"
++
++msgid "Signal:"
++msgstr "Signál:"
++
++msgid "Size"
++msgstr "Velikost"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "PÅ™eskoÄit"
++
++msgid "Skip to content"
++msgstr "SkoÄit na obsah"
++
++msgid "Skip to navigation"
++msgstr "SkoÄit na navigaci"
++
++msgid "Slot time"
++msgstr "Time sloty"
++
++msgid "Software"
++msgstr "Software"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Některá pole obsahují neplatné hodnoty, nelze uložit!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Omlouváme se, ale požadovaný objekt nebyl nalezen."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "Omlouváme se, na serveru doÅ¡lo k neoÄekávané vyjímce."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"Omlouváme se, ale v tomto zařízení není přítomná podpora pro upgrade "
++"systému. Nový obraz firmwaru musí být zapsán ruÄnÄ›. Prosím, obraÅ¥te se na "
++"OpenWRT wiki pro zařízení specifické instalaÄní instrukce."
++
++msgid "Sort"
++msgstr "Seřadit"
++
++msgid "Source"
++msgstr "Zdroj"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "UrÄuje port na kterém bude tato instance <em>Dropbearu</em> naslouchat"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++"UrÄuje množství neúspěšných ARP požadavků, po kterém je hostitel považován "
++"za mrtvého"
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr "UrÄuje poÄet sekund, po kterém je hostitel považovám za mrtvého"
++
++msgid "Specify the secret encryption key here."
++msgstr "Zde nastavte soukromý Å¡ifrovací klíÄ."
++
++msgid "Start"
++msgstr "Start"
++
++msgid "Start priority"
++msgstr "Priorita spouštění"
++
++msgid "Startup"
++msgstr "Po spuštění"
++
++msgid "Static IPv4 Routes"
++msgstr "Statické IPv4 trasy"
++
++msgid "Static IPv6 Routes"
++msgstr "Statické IPv6 trasy"
++
++msgid "Static Leases"
++msgstr "Statické zápůjÄky"
++
++msgid "Static Routes"
++msgstr "Statické trasy"
++
++msgid "Static WDS"
++msgstr "Statický WDS"
++
++msgid "Static address"
++msgstr "Statická adresa"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"Statické zápůjÄky se používají pro pÅ™iÅ™azení fixních IP adres a symbolických "
++"jmen DHCP klientům. Jsou také vyžadvány pro nedynamické konfigurace "
++"rozhraní, kde jsou povoleni pouze hosté s odpovídajícím nastavením."
++
++msgid "Status"
++msgstr "Stav"
++
++msgid "Stop"
++msgstr "Stop"
++
++msgid "Strict order"
++msgstr "Striktní výběr"
++
++msgid "Submit"
++msgstr "Odeslat"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Vstupní bod"
++
++msgid "Switch"
++msgstr "SmÄ›rovaÄ"
++
++msgid "Switch %q"
++msgstr "SmÄ›rovaÄ Äíslo %q"
++
++msgid "Switch %q (%s)"
++msgstr "SmÄ›rovaÄ Äíslo %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Směrovací protokol"
++
++msgid "Sync with browser"
++msgstr "Synchronizovat s prohlížeÄem"
++
++msgid "Synchronizing..."
++msgstr "Synchronizuji..."
++
++msgid "System"
++msgstr "Systém"
++
++msgid "System Log"
++msgstr "Systémový log"
++
++msgid "System Properties"
++msgstr "Vlastnosti systému"
++
++msgid "System log buffer size"
++msgstr "Velikost bufferu systémového logu"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "Nastavení TFTP"
++
++msgid "TFTP server root"
++msgstr "Kořenový adresář TFTP serveru"
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr "Rychlost TX"
++
++msgid "Table"
++msgstr ""
++
++msgid "Target"
++msgstr "Cíl"
++
++msgid "Terminate"
++msgstr "UkonÄit"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"Sekce <em>Nastavení zařízení</em> pokrývá fyzické nastavení radiového "
++"hardwaru jako kanál, vysílací výkon nebo výběr antény, které je sdíleno mezi "
++"všemi bezdrátovými sítěmi (pokud hardware podporuje multi-SSID). Nastavení "
++"konkrétní sítÄ› jako Å¡ifrování, operaÄní mód jsou seskupeny v sekci "
++"<em>Nastavení rozhraní</em>."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"BalíÄek <em>libiwinfo-lua</em> není nainstalován. Tato komponenta musí být "
++"nainstalována, aby fungovalo nastavení bezdátové sítě!"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr "IPv6 prefix pÅ™idÄ›lený poskytovatelm vÄ›tÅ¡inou konÄí <code>::</code>"
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++"Povolené znaky jsou: <code>A-Z</code>, <code>a-z</code>, <code>0-9</code> a "
++"<code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"Soubor zařízení paměti nebo oddílu (<abbr title=\"například\">např.</abbr> "
++"<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 ""
++"Souborový systém, který byl použit pro formátování paměti (<abbr title="
++"\"například\">napři.</abbr> <samp><abbr title=\"Souborový systém\">ext3</"
++"abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++"Obraz flash byl nahrán. Prosím porovnejte níže uvedený checksum a velikost "
++"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"
++
++msgid "The following rules are currently active on this system."
++msgstr "Následující pravidla jsou v nyní na tomto systému aktivní."
++
++msgid "The given network name is not unique"
++msgstr "Zadané jméno sítÄ› není jedineÄné"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"Tento hardware nepodporuje multi-SSID. Pokud budete pokraÄovat, existující "
++"konfigurace bude nahrazena."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr "Délka IPv4 prefixu v bitech, zbytek se používá v IPv6 adresách"
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "Délka IPv6 prefixu v bitech"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++"Síťové porty tohoto zařízení mohou být kombinovány do několika <abbr title="
++"\"Virtualních místních sítí\">VLAN</abbr>ve kterých poÄítaÄe mohou "
++"komunikovat přímo mezi sebou. <abbr title=\"Virtualní místní sítě \">VLAN</"
++"abbr>se Äasto používají na oddÄ›lení různých siÅ¥ových Äástí. VÄ›tÅ¡inou je "
++"jeden port pro připojení k vyšší síti (Uplink) jako třeba internet a "
++"zbývající porty pro místní síť."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "Vybraný protokol potřebuje mít přiřazeno zařízení"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++"Systém maže konfiguraÄní oddíl, po skonÄení procesu bude automaticky "
++"restartován."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"Systém nyní nahrává firmware.<br /> NEVYPÃNEJTE ZAŘÃZENÃ!<br /> PoÄkejte "
++"několik minut než se pokusíte znovu připojit. V záležitosti na vašem "
++"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."
++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 pending changes to revert!"
++msgstr "Nejsou zde žádné nevyřízené změny k navrácení!"
++
++msgid "There are no pending changes!"
++msgstr "Nejsou zde žádné nevyřízené změny!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"Zatím zde není přiřazeno zařízení, prosím připojte nějaké v záložce "
++"\"Fyzické nastavení\""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"Na tomto routeru není nastaveno heslo. Prosím, nastavte heslo uživatele root "
++"tak, abyste ochránili webové rozhraní a mohli povolit SSH."
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"Zde vidíte obsah souboru /etc/rc.local. Příkazy, které sem vložíte (před "
++"příkaz 'exit 0') budou spuštěny na konci bootovacího procesu."
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Toto je jedný <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>v mistní síti"
++
++msgid "This is the plain username for logging into the account"
++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 ""
++"Toto je systémový crontab, v němž můžete nastavit naplánované úlohy. "
++"Podrobnosti naleznete v crontab(5)."
++
++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 ""
++"V tomto seznamu vidíte přehled aktuálně běžících systémových procesů a "
++"jejich stavy."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr "Na této stránce si můžete nastavit vlastní události tlaÄítek"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "Tato stránka zobrazuje přehled aktivních síťových spojení."
++
++msgid "This section contains no values yet"
++msgstr "Tato sekce zatím neobsahuje žádné hodnoty"
++
++msgid "Time Synchronization"
++msgstr "Synchronizace Äasu"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "Synchronizace Äasu dosud není nakonfigurována."
++
++msgid "Timezone"
++msgstr "Časové pásmo"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"Zde můžete nahrát dříve vygenerovaný záložní archiv, pokud chcete obnovit "
++"konfiguraÄní soubory."
++
++msgid "Total Available"
++msgstr "Dostupná celkem"
++
++msgid "Traceroute"
++msgstr "Traceroute"
++
++msgid "Traffic"
++msgstr "Provoz"
++
++msgid "Transfer"
++msgstr "Přenos"
++
++msgid "Transmission Rate"
++msgstr "Vysílací rychlost"
++
++msgid "Transmit"
++msgstr "Přenos"
++
++msgid "Transmit Power"
++msgstr "Vysílací výkon"
++
++msgid "Transmitter Antenna"
++msgstr "Anténa vysílaÄe"
++
++msgid "Trigger"
++msgstr "Spouštění"
++
++msgid "Trigger Mode"
++msgstr "Trigger mód"
++
++msgid "Tunnel ID"
++msgstr "ID tunelu"
++
++msgid "Tunnel Interface"
++msgstr "Rozhraní tunelu"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Turbo mód"
++
++msgid "Tx-Power"
++msgstr "Tx-Power"
++
++msgid "Type"
++msgstr "Typ"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "Pouze UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "USB zařízení"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr "Neznámý"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Neznámá chyba, heslo nebylo změněno!"
++
++msgid "Unmanaged"
++msgstr "Nespravovaný"
++
++msgid "Unsaved Changes"
++msgstr "Neuložené změny"
++
++msgid "Unsupported protocol type."
++msgstr "Nepodporovaný typ protokolu."
++
++msgid "Update lists"
++msgstr "Aktualizovat seznamy"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"Nahrát obraz pro upgrade systému, jímž bude přepsán běžící firmware. "
++"Zkontrolujte \"Keep settings\" za úÄelem udržení aktuální konfigurace "
++"(vyžaduje obraz OpenWrt kompatabilního firmwaru)."
++
++msgid "Upload archive..."
++msgstr "Nahrát archiv..."
++
++msgid "Uploaded File"
++msgstr "Nahrát soubor"
++
++msgid "Uptime"
++msgstr "Uptime"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Použít <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr "Použít DHCP bránu"
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "Pomocí ISO/IEC 3166 alpha2 kódů zemí."
++
++msgid "Use MTU on tunnel interface"
++msgstr "Použít MTU na rozhraní tunelu"
++
++msgid "Use TTL on tunnel interface"
++msgstr "Použít TTL na rozhraní tunelu"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "Použít příznak broadcastu"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "Použít vlastní DNS servery"
++
++msgid "Use default gateway"
++msgstr "Použít výchozí bránu"
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr "Použít směrovací tabulku"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"Použitím tlaÄítka <em>PÅ™idat</em> pÅ™idáte novou zápůjÄku (lease). <em>MAC "
++"adresa</em> identifikuje poÄítaÄ, <em>IPv4 adresa</em> urÄuje, jaká pevná "
++"adresa bude použita. <em>Hostname</em> je přiřazeno jako symbolické jméno."
++
++msgid "Used"
++msgstr "Použit"
++
++msgid "Used Key Slot"
++msgstr ""
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Uživatelské jméno"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "Rozhraní VLAN"
++
++msgid "VLANs on %q"
++msgstr "VLANy na %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLANy na %q (%s)"
++
++msgid "VPN Server"
++msgstr "VPN server"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++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"
++
++msgid "Version"
++msgstr "Verze"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "WEP Open System"
++
++msgid "WEP Shared Key"
++msgstr "Sdílený klÃ­Ä WEP"
++
++msgid "WEP passphrase"
++msgstr "WEP heslo"
++
++msgid "WMM Mode"
++msgstr "WMM mód"
++
++msgid "WPA passphrase"
++msgstr "WPA heslo"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Varování"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr "Bezdrátová síť"
++
++msgid "Wireless Adapter"
++msgstr "Bezdrátový adaptér"
++
++msgid "Wireless Network"
++msgstr "Bezdrátová síť"
++
++msgid "Wireless Overview"
++msgstr "Přehled bezdrátových sití"
++
++msgid "Wireless Security"
++msgstr "ZabezpeÄení bezdrátové sítÄ›"
++
++msgid "Wireless is disabled or not associated"
++msgstr "Bezdrátová síť je vypnuta nebo nespojena"
++
++msgid "Wireless is restarting..."
++msgstr "Probíhá restartování bezdrátové sítě..."
++
++msgid "Wireless network is disabled"
++msgstr "Bezdrátová síť je zakázána"
++
++msgid "Wireless network is enabled"
++msgstr "Bezdrátová síť je povolena"
++
++msgid "Wireless restarted"
++msgstr "Bezdrátová síť restartována"
++
++msgid "Wireless shut down"
++msgstr "Bezdrátová síť vypnuta"
++
++msgid "Write received DNS requests to syslog"
++msgstr "Zapisovat přijaté požadavky DNS do systemového logu"
++
++msgid "XR Support"
++msgstr "Podpora XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Zde můžete povolit nebo zakázat init skripty. Změny se projeví po restartu "
++"zařízení.<br /><strong>Varování: Pokud zakážete základní init skripty jako "
++"\"network\", vaše zařízení se může stát nepřístupným!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Aby LuCI fungoval správnÄ›, musíte mít v prohlížeÄi povolený Javascript."
++
++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 ""
++
++msgid "any"
++msgstr "libovolný"
++
++msgid "auto"
++msgstr "auto"
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "přemostěný"
++
++msgid "create:"
++msgstr ""
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "vytvoří most přes vybraná rozhraní"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "zakázat"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "expirované"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"Soubor, ve kterém budou uloženy zadané <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr> výpůjÄky (leases)"
++
++msgid "forward"
++msgstr ""
++
++msgid "full-duplex"
++msgstr "plný-duplex"
++
++msgid "half-duplex"
++msgstr "poloviÄní-duplex"
++
++msgid "help"
++msgstr "pomoc"
++
++msgid "hidden"
++msgstr "skrytý"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "pokud cílem je síť"
++
++msgid "input"
++msgstr "vstup"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "ne"
++
++msgid "no link"
++msgstr "žádné spojení"
++
++msgid "none"
++msgstr "žádný"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "off"
++
++msgid "on"
++msgstr "on"
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "směrované"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "oznaÄený"
++
++msgid "unknown"
++msgstr "neznámý"
++
++msgid "unlimited"
++msgstr "neomezený"
++
++msgid "unspecified"
++msgstr "nespecifikovaný"
++
++msgid "unspecified -or- create:"
++msgstr "nespecifikovaný -nebo- vytvořit:"
++
++msgid "untagged"
++msgstr "neoznaÄený"
++
++msgid "yes"
++msgstr "ano"
++
++msgid "« Back"
++msgstr "« Zpět"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "Na PPP spoji povolit vyjednání IPv6"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "Ignorovat soubory Hosts"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Prosím poÄkejte: Provádím reboot..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr "Varování: Existují neuložené změny, které budou rebootem ztraceny!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Vždy použije kanál 40 MHz , i když překrývá sekundární kanál . Tato volba "
++#~ "není v souladu s IEEE 802.11n-2009!"
++
++#~ msgid "Cached"
++#~ msgstr "V cache"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr "Použít tento přípojný bod jako překryvné úložiště pro block-extroot"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "Vynutit 40MHz mód"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "KmitoÄtové skákání"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "Uzamknout kanál %d používaný %s"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "Použít jako kořenový souborový systém"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "Uživatelské ID HE.net"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr ""
++#~ "Toto je 32 bajtové uživatelské ID, zapsané v hex tvaru, ne přihlašovací "
++#~ "jméno"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz druhý kanál nad hlavním"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz druhý kanál pod hlavním"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "PÅ™ijímat oznámení smÄ›rovaÄů"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Na síti oznamovat IPv6"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "Oznamované ID sítě"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "Hodnota musí ležet v intervalu 1 až 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "Možnosti HT"
++
++#~ msgid "HT mode"
++#~ msgstr "Režim HT"
++
++#~ msgid "Router Model"
++#~ msgstr "Model routeru"
++
++#~ msgid "Router Name"
++#~ msgstr "Název routeru"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "Posílat žádosti o informace o směrování"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr ""
++#~ "UrÄuje dobu za kterou interface požádá o prodloužení životnosti prefixu v "
++#~ "sekundách"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr "UrÄuje dobu životnosti prefixu v sekundách"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "Použít preferovanou životnost"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "Použít platnou životnost"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Čekám na router.."
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "Povolit zabudovaný NTP server"
++
++#~ msgid "Active Leases"
++#~ msgstr "Aktivní výpůjÄky"
++
++#~ msgid "Open"
++#~ msgstr "Otevřít"
++
++#~ msgid "Bit Rate"
++#~ msgstr "Přenosová rychlost"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "Nastavení / Použít"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "Nastavení / Změny"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "Nastavení / Zrušit změny"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MAC Address"
++#~ msgstr "MAC adresa"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Šifrováno\">Šifr.</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scanování"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "Síť přiřazená k tomuto bezdrátovému rozhraní. Pro nepřiřazování rozhraní "
++#~ "k žádné síti vyberte volbu \"<em>nespecifikovaná</em>\". Pro vytvoření "
++#~ "nové sítě vyplňte pole \"<em>vytvořit</em>\"."
++
++#~ msgid "Create Network"
++#~ msgstr "Vytvořit síť"
++
++#~ msgid "Networks"
++#~ msgstr "Sítě"
++
++#~ msgid "Power"
++#~ msgstr "Výkon"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Wifi sítě v místním prostředí"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-notace : "
++#~ "adresa/prefix"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr ""
++#~ "<abbr title=\"Internet Protokol Verze 4\">IPv4</abbr>-Všesměrové vysílání"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "<abbr title=\"Internet Protokol Verze 6\">IPv6</abbr>-Adresa"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "Nastavení IPv6"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "Pozn: Pokud zde zvolíte rozhraní, které již je souÄástí jiné sítÄ›, bude "
++#~ "přesunuto do této sítě."
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "Síťové porty na vašem routeru mohou být kombinovány do několika <abbr "
++#~ "title=\"Virtual Local Area Network\">VLAN</abbr>, ve kterých mohou "
++#~ "poÄítaÄe navzájem komunikovat přímo. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr> jsou Äasto používány za úÄelem oddÄ›lení různých "
++#~ "síťových segmentů. Často je zde jeden Uplink port, sloužící pro připojení "
++#~ "do větší sítě (třeba Internetu) a ostatní porty jsou využity pro místní "
++#~ "síť."
++
++#~ msgid "Enable buffering"
++#~ msgstr "Povolit bufferování"
+diff --git a/feeds/luci/modules/luci-base/po/de/base.po b/feeds/luci/modules/luci-base/po/de/base.po
+new file mode 100644
+index 0000000..f698002
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/de/base.po
+@@ -0,0 +1,4434 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 17:57+0200\n"
++"PO-Revision-Date: 2013-03-29 12:13+0200\n"
++"Last-Translator: JoeSemler <josef.semler@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d Minuten Abschnitt, %d Sekunden Intervall)"
++
++msgid "(%s available)"
++msgstr "(%s verfügbar)"
++
++msgid "(empty)"
++msgstr "(leer)"
++
++msgid "(no interfaces attached)"
++msgstr "(keine Schnittstellen)"
++
++msgid "-- Additional Field --"
++msgstr "-- Zusätzliches Feld --"
++
++msgid "-- Please choose --"
++msgstr "-- Bitte auswählen --"
++
++msgid "-- custom --"
++msgstr "-- benutzerdefiniert --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Systemlast (1 Minute):"
++
++msgid "15 Minute Load:"
++msgstr "Systemlast (15 Minuten):"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Systemlast (5 Minuten):"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> Abfrageport"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> Serverport"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"<abbr title=\"Domain Name System\">DNS</abbr>-Server in der Reihenfolge der "
++"Resolv-Datei abfragen"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "IPv4-Adresse"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "IPv4-Gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "IPv4-Netzmaske"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr "IPv6 Host- oder Netzwerk-Addresse (CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "IPv6-Gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "LED Konfiguration"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "MAC-Adresse"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"<abbr title=\"maximal\">Max.</abbr> Anzahl von <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Leases"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"<abbr title=\"maximal\">Max.</abbr> Größe von <abbr title=\"Extension "
++"Mechanisms for Domain Name System\">EDNS0</abbr>-Paketen"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"maximal\">Max.</abbr> Anzahl gleichzeitiger Abfragen"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Paarweise: %s / Gruppe: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "AR-Unterstützung"
++
++msgid "ARP retry threshold"
++msgstr "Grenzwert für ARP-Auflösungsversuche"
++
++msgid "ATM Bridges"
++msgstr "ATM Brücken"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "ATM Virtual Channel Identifier (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "ATM Virtual Path Identifier (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"ATM Brücken exponieren in AAL5 gekapselten Ethernetverkehr als virtuelle "
++"Linux Netzwerkschnittstellen welche z.B. in Verbindung mit DHCP oder PPP "
++"genutzt werden können um sich in das Providernetzwerk einzuwählen."
++
++msgid "ATM device number"
++msgstr "ATM Geräteindex"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Access Concentrator"
++
++msgid "Access Point"
++msgstr "Access Point"
++
++msgid "Action"
++msgstr "Aktion"
++
++msgid "Actions"
++msgstr "Aktionen"
++
++msgid "Activate this network"
++msgstr "Dieses Netzwerk aktivieren"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "Aktive IPv4-Routen"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "Aktive IPv6-Routen"
++
++msgid "Active Connections"
++msgstr "Aktive Verbindungen"
++
++msgid "Active DHCP Leases"
++msgstr "Aktive DHCP-Leases"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Aktive DHCPv6-Leases"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Hinzufügen"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr "Lokalen Domainsuffx an Namen aus der Hosts-Datei anhängen"
++
++msgid "Add new interface..."
++msgstr "Neue Schnittstelle hinzufügen..."
++
++msgid "Additional Hosts files"
++msgstr "Zusätzliche Hosts-Dateien"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Adresse"
++
++msgid "Address to access local relay bridge"
++msgstr "Adresse der lokalen Relay-Brücke"
++
++msgid "Administration"
++msgstr "Administration"
++
++msgid "Advanced Settings"
++msgstr "Erweiterte Einstellungen"
++
++msgid "Alert"
++msgstr "Alarm"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr "Erlaube Anmeldung per Passwort"
++
++msgid "Allow all except listed"
++msgstr "Alle außer gelistete erlauben"
++
++msgid "Allow listed only"
++msgstr "Nur gelistete erlauben"
++
++msgid "Allow localhost"
++msgstr "Erlaube localhost"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr "Entfernten Hosts erlauben zu lokale SSH-Tunnel-Ports zu verbinden"
++
++msgid "Allow root logins with password"
++msgstr "\"root\" Login mit Passwort aktivieren"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr ""
++"Erlaubt es dem <em>root</em> Benutzer sich mit einem Passwort statt einem "
++"Zertifikat einzuloggen"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr ""
++"Dies erlaubt DNS-Antworten im 127.0.0.0/8 Bereich der z.B. für RBL Dienste "
++"genutzt wird"
++
++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 ""
++
++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 "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antenne 1"
++
++msgid "Antenna 2"
++msgstr "Antenne 2"
++
++msgid "Antenna Configuration"
++msgstr "Antennenkonfiguration"
++
++msgid "Any zone"
++msgstr "Beliebige Zone"
++
++msgid "Apply"
++msgstr "Anwenden"
++
++msgid "Applying changes"
++msgstr "Änderungen werden angewandt"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Schnittstellen zuweisen..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Assoziierte Clients"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Atheros 802.11%s W-LAN Adapter"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Authentifizierung"
++
++msgid "Authoritative"
++msgstr "Authoritativ"
++
++msgid "Authorization Required"
++msgstr "Autorisierung benötigt"
++
++msgid "Auto Refresh"
++msgstr "Automatisches Neuladen"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Verfügbar"
++
++msgid "Available packages"
++msgstr "Verfügbare Pakete"
++
++msgid "Average:"
++msgstr "Durchschnitt:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Zurück"
++
++msgid "Back to Overview"
++msgstr "Zurück zur Übersicht"
++
++msgid "Back to configuration"
++msgstr "Zurück zur Konfiguration"
++
++msgid "Back to overview"
++msgstr "Zurück zur Übersicht"
++
++msgid "Back to scan results"
++msgstr "Zurück zu den Scan-Ergebnissen"
++
++msgid "Background Scan"
++msgstr "Hintergrundscan"
++
++msgid "Backup / Flash Firmware"
++msgstr "Backup / Firmware Update"
++
++msgid "Backup / Restore"
++msgstr "Sichern / Wiederherstellen"
++
++msgid "Backup file list"
++msgstr "Liste zu sichernder Dateien"
++
++msgid "Bad address specified!"
++msgstr "Ungültige Adresse angegeben!"
++
++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 "
++"defined backup patterns."
++msgstr ""
++"Nachfolgend wird eine generierte Liste der zu sichernden Dateien angezeigt. "
++"Sie enthält alle notwendigen Systemdateien sowie die von opkg als geändert "
++"markierten Konfigurationsdateien. Des Weiteren sind die durch "
++"benutzerdefinierte Dateiemuster betroffenen Dateien enthalten."
++
++msgid "Bitrate"
++msgstr "Bitrate"
++
++msgid "Bogus NX Domain Override"
++msgstr "Ungültige \"NX-Domain\" Antworten ignorieren"
++
++msgid "Bridge"
++msgstr "Bridge"
++
++msgid "Bridge interfaces"
++msgstr "Netzwerkbrücke"
++
++msgid "Bridge unit number"
++msgstr "Geräteindex der Brücke"
++
++msgid "Bring up on boot"
++msgstr "Während des Bootvorgangs starten"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Broadcom 802.11%s W-LAN Adapter"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Broadcom BCM%04x 802.11 W-LAN Adapter"
++
++msgid "Buffered"
++msgstr "Gepuffert"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Knöpfe"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "Prozessor"
++
++msgid "CPU usage (%)"
++msgstr "CPU-Nutzung (%)"
++
++msgid "Cancel"
++msgstr "Abbrechen"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Kette"
++
++msgid "Changes"
++msgstr "Änderungen"
++
++msgid "Changes applied."
++msgstr "Änderungen angewendet."
++
++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 "Check"
++msgstr "Prüfen"
++
++msgid "Checksum"
++msgstr "Prüfsumme"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr "Diese Schnittstelle gehört bis jetzt zu keiner Firewallzone."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Wählt die Netzwerke die dieser WLAN-Schnittstelle zugeordnet werden. Das "
++"<em>erstelle</em>-Feld ausfüllen um ein neues Netzwerk zu erzeugen."
++
++msgid "Cipher"
++msgstr "Verschlüsselungsalgorithmus"
++
++msgid ""
++"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)."
++msgstr ""
++"Zum Herunterladen der aktuellen Konfigurationsdateien als gepacktes Archiv "
++"\"Sicherung erstellen\" drücken. \"Konfiguration zurücksetzen\" stellt den "
++"Auslieferungszustand des Systems wieder her (nur möglich bei squashfs-"
++"Images)."
++
++msgid "Client"
++msgstr "Client"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "Zu sendende Client-ID bei DHCP Anfragen"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Inaktive Verbindungen nach Ablauf dieser Zeit in Sekunden schließen (0 um "
++"die Verbindung immer aufrecht zu erhalten)."
++
++msgid "Close list..."
++msgstr "Schließe Liste..."
++
++msgid "Collecting data..."
++msgstr "Sammle Daten..."
++
++msgid "Command"
++msgstr "Befehl"
++
++msgid "Common Configuration"
++msgstr "Allgemeine Konfiguration"
++
++msgid "Compression"
++msgstr "Kompression"
++
++msgid "Configuration"
++msgstr "Konfiguration"
++
++msgid "Configuration applied."
++msgstr "Konfiguration angewendet."
++
++msgid "Configuration files will be kept."
++msgstr "Konfigurationsdateien sichern"
++
++msgid "Confirmation"
++msgstr "Bestätigung"
++
++msgid "Connect"
++msgstr "Verbinden"
++
++msgid "Connected"
++msgstr "Verbunden"
++
++msgid "Connection Limit"
++msgstr "Verbindungslimit"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr "Verbindungen"
++
++msgid "Country"
++msgstr "Land"
++
++msgid "Country Code"
++msgstr "Ländercode"
++
++msgid "Cover the following interface"
++msgstr "Die folgende Schnittstelle abdecken"
++
++msgid "Cover the following interfaces"
++msgstr "Die folgende Schnittstellen abdecken"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Firewallzone anlegen / zuweisen"
++
++msgid "Create Interface"
++msgstr "Erzeuge Schnittstelle"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Erzeuge Netzwerkbrücke über mehrere Schnittstellen"
++
++msgid "Critical"
++msgstr "Kritisch"
++
++msgid "Cron Log Level"
++msgstr "Cron Protokolllevel"
++
++msgid "Custom Interface"
++msgstr "benutzerdefinierte Schnittstelle"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr "Passt das Verhalten der Geräte-LEDs an - wenn dies möglich ist."
++
++msgid "DHCP Leases"
++msgstr "DHCP-Leases"
++
++msgid "DHCP Server"
++msgstr "DHCP-Server"
++
++msgid "DHCP and DNS"
++msgstr "DHCP und DNS"
++
++msgid "DHCP client"
++msgstr "DHCP Client"
++
++msgid "DHCP-Options"
++msgstr "DHCP-Optionen"
++
++msgid "DHCPv6 Leases"
++msgstr "DHCPv6-Leases"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "DNS-Weiterleitungen"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Debug"
++
++msgid "Default %d"
++msgstr "Standard %d"
++
++msgid "Default gateway"
++msgstr "Default Gateway"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Ausgangszustand"
++
++msgid "Define a name for this network."
++msgstr "Definiert einen Namen für dieses Netzwerk"
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Definiert zusätzliche DHCP-Optionen, z.B. \"<code>6,192.168.2.1,192.168.2.2</"
++"code>\" um einen anderen DNS-Server an Clients zu verteilen."
++
++msgid "Delete"
++msgstr "Löschen"
++
++msgid "Delete this interface"
++msgstr "Diese Schnittstelle löschen"
++
++msgid "Delete this network"
++msgstr "Dieses Netzwerk löschen"
++
++msgid "Description"
++msgstr "Beschreibung"
++
++msgid "Design"
++msgstr "Design"
++
++msgid "Destination"
++msgstr "Ziel"
++
++msgid "Device"
++msgstr "Gerät"
++
++msgid "Device Configuration"
++msgstr "Gerätekonfiguration"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnosen"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Verzeichnis"
++
++msgid "Disable"
++msgstr "Deaktivieren"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>-Server auf "
++"dieser Schnittstelle deaktivieren"
++
++msgid "Disable DNS setup"
++msgstr "DNS-Verarbeitung deaktivieren"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Deaktiviere Hardware-Beacon Zeitgeber"
++
++msgid "Disabled"
++msgstr "Deaktiviert"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Eingehende RFC1918-Antworten verwerfen"
++
++msgid "Displaying only packages containing"
++msgstr "Nur Pakete mit folgendem Inhalt anzeigen"
++
++msgid "Distance Optimization"
++msgstr "Distanzoptimierung"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Distanz zum am weitesten entfernten Funkpartner in Metern."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Diversität"
++
++# Nur für NAT-Firewalls?
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq ist ein kombinierter <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr>-Server und <abbr title=\"Domain Name System\">DNS</"
++"abbr>-Forwarder für <abbr title=\"Network Address Translation\">NAT</abbr> "
++"Router"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr ""
++"Negative Antworten nicht zwischenspeichern, z.B. bei nicht existierenden "
++"Domains"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr ""
++"Keine Anfragen weiterleiten welche nicht durch öffentliche Server "
++"beantwortet werden können"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr "Keine Rückwärtsauflösungen für lokale Netzwerke weiterleiten"
++
++msgid "Do not send probe responses"
++msgstr "Scan-Anforderungen nicht beantworten"
++
++msgid "Domain required"
++msgstr "Anfragen nur mit Domain"
++
++msgid "Domain whitelist"
++msgstr "Domain-Whitelist"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr "Anfragen ohne Domainnamen nicht weiterleiten"
++
++msgid "Download and install package"
++msgstr "Paket herunterladen und installieren"
++
++msgid "Download backup"
++msgstr "Backup herunterladen"
++
++msgid "Dropbear Instance"
++msgstr "Dropbear Instanz"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Der SSH-Server ermöglicht Shell-Zugriff über das Netzwerk und bietet einen "
++"integrierten SCP-Dienst."
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr "Dynamisches DHCP"
++
++msgid "Dynamic tunnel"
++msgstr "Dynamischer Tunnel"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"DHCP Adressen dynamisch erzeugen. Wenn dies deaktiviert ist, werden nur "
++"Clients mit konfigurierten statischen Leases bedient"
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "EAP-Methode"
++
++msgid "Edit"
++msgstr "Bearbeiten"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Diese Schnittstelle bearbeiten"
++
++msgid "Edit this network"
++msgstr "Dieses Netzwerk bearbeiten"
++
++msgid "Emergency"
++msgstr "Notfall"
++
++msgid "Enable"
++msgstr "Aktivieren"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> aktivieren"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "Dynamisches HE.net IP-Adress-Update aktivieren"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "Aktiviere Jumbo Frame Durchleitung"
++
++msgid "Enable NTP client"
++msgstr "Aktiviere NTP-Client"
++
++msgid "Enable TFTP server"
++msgstr "TFTP-Server aktivieren"
++
++msgid "Enable VLAN functionality"
++msgstr "VLAN-Funktionalität aktivieren"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Learning und Aging aktivieren"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "Diesen Mountpunkt aktivieren"
++
++msgid "Enable this swap"
++msgstr "Diesen Auslagerungsspeicher aktivieren"
++
++msgid "Enable/Disable"
++msgstr "Aktivieren/Deaktivieren"
++
++msgid "Enabled"
++msgstr "Aktiviert"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Aktiviert das Spanning Tree Protokoll auf dieser Netzwerkbrücke"
++
++msgid "Encapsulation mode"
++msgstr "Kapselung"
++
++msgid "Encryption"
++msgstr "Verschlüsselung"
++
++msgid "Erasing..."
++msgstr "Lösche..."
++
++msgid "Error"
++msgstr "Fehler"
++
++msgid "Ethernet Adapter"
++msgstr "Netzwerkschnittstelle"
++
++msgid "Ethernet Switch"
++msgstr "Netzwerk Switch"
++
++msgid "Expand hosts"
++msgstr "Hosts vervollständigen"
++
++msgid "Expires"
++msgstr "Verfällt"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++"Gültigkeitsdauer von vergebenen Adressen. Das Minimum sind 2 Minuten "
++"(<code>2m</code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Externer Protokollserver IP"
++
++msgid "External system log server port"
++msgstr "Externer Protokollserver Port"
++
++msgid "Fast Frames"
++msgstr "Schnelle Frames"
++
++msgid "File"
++msgstr "Datei"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Dateiname des Boot-Images welches den Clients mitgeteilt wird."
++
++msgid "Filesystem"
++msgstr "Dateisystem"
++
++msgid "Filter"
++msgstr "Filter"
++
++msgid "Filter private"
++msgstr "Private Anfragen filtern"
++
++msgid "Filter useless"
++msgstr "Windowsanfragen filtern"
++
++msgid "Find and join network"
++msgstr "Suchen und Verbinden von Netzwerken"
++
++msgid "Find package"
++msgstr "Paket suchen"
++
++msgid "Finish"
++msgstr "Fertigstellen"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall Settings"
++msgstr "Firewall Einstellungen"
++
++msgid "Firewall Status"
++msgstr "Firewall-Status"
++
++msgid "Firmware Version"
++msgstr "Firmware Version"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "Fester Port für ausgehende DNS-Anfragen"
++
++msgid "Flags"
++msgstr "Parameter"
++
++msgid "Flash Firmware"
++msgstr "Firmware aktualisieren"
++
++msgid "Flash image..."
++msgstr "Firmware aktualisieren..."
++
++msgid "Flash new firmware image"
++msgstr "Neues Firmware Image schreiben"
++
++msgid "Flash operations"
++msgstr "Flash-Operationen"
++
++msgid "Flashing..."
++msgstr "Firmware wird installiert..."
++
++msgid "Force"
++msgstr "Start erzwingen"
++
++msgid "Force CCMP (AES)"
++msgstr "CCMP (AES) erzwingen"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++"Aktiviere DHCP-Server für dieses Netzwerk, selbst wenn ein anderer aktiver "
++"Server erkannt wurde."
++
++msgid "Force TKIP"
++msgstr "Erzwinge TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "Erzwinge TKIP und CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "DHCP Traffic weiterleiten"
++
++msgid "Forward broadcast traffic"
++msgstr "Broadcasts weiterleiten"
++
++msgid "Forwarding mode"
++msgstr "Weiterleitungstyp"
++
++msgid "Fragmentation Threshold"
++msgstr "Fragmentierungsschwelle"
++
++msgid "Frame Bursting"
++msgstr "Frame Bursting"
++
++msgid "Free"
++msgstr "Frei"
++
++msgid "Free space"
++msgstr "Freier Platz"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "Nur GPRS"
++
++msgid "Gateway"
++msgstr "Gateway"
++
++msgid "Gateway ports"
++msgstr "Gateway-Ports"
++
++msgid "General Settings"
++msgstr "Allgemeine Einstellungen"
++
++msgid "General Setup"
++msgstr "Allgemeine Einstellungen"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "Sicherung erstellen"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Generischer 802.11%s W-LAN Adapter"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++"Die angegebenen Passwörter stimmen nicht überein, das Systempasswort wurde "
++"nicht geändert!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Zur Passwortkonfiguration..."
++
++msgid "Go to relevant configuration page"
++msgstr "Gehe zur entsprechenden Konfigurationsseite"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "HE.net Passwort"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Handler"
++
++msgid "Hang Up"
++msgstr "Auflegen"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"An dieser Stelle können Grundeinstellungen des Systems wie Hostname oder "
++"Zeitzone vorgenommen werden."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++"Hier können öffentliche SSH-Schlüssel reinkopiert werden (einer pro Zeile)."
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Hermes 802.11b W-LAN Adapter"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "ESSID verstecken"
++
++msgid "Host entries"
++msgstr "Host-Einträge"
++
++msgid "Host expiry timeout"
++msgstr "Host Verfallsdatum"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> oder Netzwerk"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "Zu sendender Hostname bei DHCP Anfragen"
++
++msgid "Hostnames"
++msgstr "Rechnernamen"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "IP-Adresse"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "IPv4 Firewall"
++
++msgid "IPv4 WAN Status"
++msgstr "IPv4 WAN Status"
++
++msgid "IPv4 address"
++msgstr "IPv4 Adresse"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 und IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "IPv4 Broadcast"
++
++msgid "IPv4 gateway"
++msgstr "IPv4 Gateway"
++
++msgid "IPv4 netmask"
++msgstr "IPv4 Netzmaske"
++
++msgid "IPv4 only"
++msgstr "nur IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "Länge des IPv4 Präfix"
++
++msgid "IPv4-Address"
++msgstr "IPv4-Adresse"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "IPv6 Firewall"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "IPv6 WAN Status"
++
++msgid "IPv6 address"
++msgstr "IPv6 Adresse"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "IPv6 Gateway"
++
++msgid "IPv6 only"
++msgstr "nur IPv6"
++
++msgid "IPv6 prefix"
++msgstr "IPv6 Präfix"
++
++msgid "IPv6 prefix length"
++msgstr "Länge des IPv6 Präfix"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "IPv6-Adresse"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-in-IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6-über-IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6-über-IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "Identität"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++"Wenn angegeben, wird das Gerät anhand seiner UUID statt fester Gerätedatei "
++"gemounted"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++"Wenn angegeben, wird das Gerät nach anhhand des Partitionslabels statt "
++"fester Gerätedatei gemounted"
++
++msgid "If unchecked, no default route is configured"
++msgstr "Wenn deaktiviert, wird keine Default-Route gesetzt"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr "Falls deaktiviert werden die zugewiesenen DNS-Server ignoriert"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Falls der Arbeitsspeicher des Routers nicht ausreicht, kann dieser nicht "
++"benutzte Daten zeitweise auf einem SWAP-Laufwerk auslagern um so die "
++"effektive Größe des Arbeitsspeichers zu erhöhen. Die Auslagerung der Daten "
++"ist natürlich bedeutend langsamer als direkte Arbeitsspeicherzugriffe."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Ignoriere /etc/hosts"
++
++msgid "Ignore interface"
++msgstr "Schnittstelle ignorieren"
++
++msgid "Ignore resolve file"
++msgstr "Resolv-Datei ignorieren"
++
++msgid "Image"
++msgstr "Image"
++
++msgid "In"
++msgstr "Ein"
++
++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 "Timeout bei Inaktivität"
++
++msgid "Inbound:"
++msgstr "Eingehend:"
++
++msgid "Info"
++msgstr "Info"
++
++msgid "Initscript"
++msgstr "Startscript"
++
++msgid "Initscripts"
++msgstr "Startscripte"
++
++msgid "Install"
++msgstr "Installieren"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Installiere Paket %q"
++
++msgid "Install protocol extensions..."
++msgstr "Installiere Protokoll-Erweiterungen"
++
++msgid "Installed packages"
++msgstr "Installierte Pakete"
++
++msgid "Interface"
++msgstr "Schnittstelle"
++
++msgid "Interface Configuration"
++msgstr "Schnittstellenkonfiguration"
++
++msgid "Interface Overview"
++msgstr "Schnittstellenübersicht"
++
++msgid "Interface is reconnecting..."
++msgstr "Schnittstelle verbindet neu..."
++
++msgid "Interface is shutting down..."
++msgstr "Schnittstelle fährt herunter..."
++
++msgid "Interface not present or not connected yet."
++msgstr "Schnittstelle existiert nicht oder ist nicht verbunden."
++
++msgid "Interface reconnected"
++msgstr "Schnittstelle neu verbunden"
++
++msgid "Interface shut down"
++msgstr "Schnittstelle heruntergefahren"
++
++msgid "Interfaces"
++msgstr "Schnittstellen"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "Interner Serverfehler"
++
++msgid "Invalid"
++msgstr "Ungültige Eingabe"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr "Ungültige VLAN ID angegeben! Nur IDs zwischen %d und %d sind erlaubt."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "Ungültige VLAN ID angegeben! Die ID ist muß eindeutig sein!"
++
++msgid "Invalid username and/or password! Please try again."
++msgstr ""
++"Ungültiger Benutzername oder ungültiges Passwort! Bitte erneut versuchen. "
++
++#, 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 ""
++"Das verwendete Image scheint zu groß für den internen Flash-Speicher zu "
++"sein. Überprüfen Sie die Imagedatei!"
++
++msgid "Java Script required!"
++msgstr "Java-Script benötigt!"
++
++msgid "Join Network"
++msgstr "Netzwerk beitreten"
++
++msgid "Join Network: Settings"
++msgstr "Netzwerk beitreten: Einstellungen"
++
++msgid "Join Network: Wireless Scan"
++msgstr "Netzwerk beitreten: Suche nach Netzwerken"
++
++msgid "Keep settings"
++msgstr "Konfiguration behalten"
++
++msgid "Kernel Log"
++msgstr "Kernelprotokoll"
++
++msgid "Kernel Version"
++msgstr "Kernel Version"
++
++msgid "Key"
++msgstr "Schlüssel"
++
++msgid "Key #%d"
++msgstr "Schlüssel Nr. %d"
++
++msgid "Kill"
++msgstr "Töten"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "L2TP Server"
++
++msgid "LCP echo failure threshold"
++msgstr "LCP Echo Fehler Schwellenwert"
++
++msgid "LCP echo interval"
++msgstr "LCP Echo Intervall"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Label"
++
++msgid "Language"
++msgstr "Sprache"
++
++msgid "Language and Style"
++msgstr "Sprache und Aussehen"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Lease-Gültigkeitsdauer"
++
++msgid "Leasefile"
++msgstr "Leasedatei"
++
++msgid "Leasetime"
++msgstr "Laufzeit"
++
++msgid "Leasetime remaining"
++msgstr "Verbleibende Gültigkeit"
++
++msgid "Leave empty to autodetect"
++msgstr "Zur automatischen Erkennung leer lassen"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "Leer lassen um die aktuelle WAN-Adresse zu verwenden"
++
++msgid "Legend:"
++msgstr "Legende:"
++
++msgid "Limit"
++msgstr "Limit"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Verbindung hergestellt"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"Liste von <abbr title=\"Domain Name System\">DNS</abbr>-Servern an welche "
++"Requests weitergeleitet werden"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "Liste von Domains für welche RFC1918-Antworten erlaubt sind"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr "Liste von Servern die falsche \"NX Domain\" Antworten liefern"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++"Nur auf die gegebene Schnittstelle reagieren, nutze alle wenn nicht "
++"spezifiziert"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Serverport für eingehende DNS Abfragen"
++
++msgid "Load"
++msgstr "Last"
++
++msgid "Load Average"
++msgstr "Durchschnittslast"
++
++msgid "Loading"
++msgstr "Lade"
++
++msgid "Local IPv4 address"
++msgstr "Lokale IPv4 Adresse"
++
++msgid "Local IPv6 address"
++msgstr "Lokale IPv6 Adresse"
++
++msgid "Local Startup"
++msgstr "Lokales Startskript"
++
++msgid "Local Time"
++msgstr "Lokale Zeit"
++
++msgid "Local domain"
++msgstr "Lokale Domain"
++
++#, fuzzy
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++"Spezifiziert den lokalen Domainnamen. Anfragen für Hostnamen welche auf "
++"diese Domain zutreffen werden nie weitergeleitet und ausschließlich aus DHCP-"
++"Namen oder Hosts-Dateien aufgelöst"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++"Lokaler Domain-Suffix welcher an DHCP Namen und Host-Datei Einträge "
++"angehangen wird"
++
++msgid "Local server"
++msgstr "Lokaler Server"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++"Hostnamen je nach anfragendem Subnetz auflösen wenn mehrere IPs verfügbar "
++"sind"
++
++msgid "Localise queries"
++msgstr "Lokalisiere Anfragen"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Protokolllevel"
++
++msgid "Log queries"
++msgstr "Schreibe Abfragelog"
++
++msgid "Logging"
++msgstr "Protokollierung"
++
++msgid "Login"
++msgstr "Anmelden"
++
++msgid "Logout"
++msgstr "Abmelden"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr "Kleinste vergebene Adresse (Netzwerkadresse + x)"
++
++msgid "MAC-Address"
++msgstr "MAC-Adresse"
++
++msgid "MAC-Address Filter"
++msgstr "MAC-Adressfilter"
++
++msgid "MAC-Filter"
++msgstr "MAC-Filter"
++
++msgid "MAC-List"
++msgstr "MAC-Adressliste"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Höchstübertragungsrate"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "Maximal zulässige Anzahl von aktiven DHCP-Leases"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "Maximal zulässige Anzahl an gleichzeitigen DNS-Anfragen"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "Maximal zulässige Größe von EDNS.0 UDP Paketen"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "Maximale Zeit die gewartet wird bis das Modem bereit ist (in Sekunden)"
++
++msgid "Maximum hold time"
++msgstr "Maximalzeit zum Halten der Verbindung"
++
++msgid "Maximum number of leased addresses."
++msgstr "Maximal zulässige Anzahl von vergeben DHCP-Adressen"
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "Hauptspeicher"
++
++msgid "Memory usage (%)"
++msgstr "Speichernutzung (%)"
++
++msgid "Metric"
++msgstr "Metrik"
++
++msgid "Minimum Rate"
++msgstr "Mindestübertragungsrate"
++
++msgid "Minimum hold time"
++msgstr "Minimalzeit zum Halten der Verbindung"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "Erweiterung für Protokoll %q fehlt"
++
++msgid "Mode"
++msgstr "Modus"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Modemgerät"
++
++msgid "Modem init timeout"
++msgstr "Wartezeit für Modeminitialisierung"
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr "Mount-Eintrag"
++
++msgid "Mount Point"
++msgstr "Einhängepunkt"
++
++msgid "Mount Points"
++msgstr "Einhängepunkte"
++
++msgid "Mount Points - Mount Entry"
++msgstr "Mountpunkte - Mount-Eintrag"
++
++msgid "Mount Points - Swap Entry"
++msgstr "Mountpunkte - Auslagerungsdatei"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Einhängepunkte bestimmen, an welcher Stelle des Dateisystems bestimmte "
++"Laufwerke und Speicher zur Verwendung eingebunden werden."
++
++msgid "Mount options"
++msgstr "Mount-Optionen"
++
++msgid "Mount point"
++msgstr "Mountpunkt"
++
++msgid "Mounted file systems"
++msgstr "Eingehängte Dateisysteme"
++
++msgid "Move down"
++msgstr "Nach unten schieben"
++
++msgid "Move up"
++msgstr "Nach oben schieben"
++
++msgid "Multicast Rate"
++msgstr "Multicastrate"
++
++msgid "Multicast address"
++msgstr "Multicast-Adresse"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "NTP Server Kandidaten"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Name"
++
++msgid "Name of the new interface"
++msgstr "Name der neuen Schnittstelle"
++
++msgid "Name of the new network"
++msgstr "Name des neuen Netzwerkes"
++
++msgid "Navigation"
++msgstr "Navigation"
++
++msgid "Netmask"
++msgstr "Netzmaske"
++
++msgid "Network"
++msgstr "Netzwerk"
++
++msgid "Network Utilities"
++msgstr "Netzwerk-Werkzeuge"
++
++msgid "Network boot image"
++msgstr "Netzwerk-Boot-Image"
++
++msgid "Network without interfaces."
++msgstr "Netzwerk ohne Schnittstellen."
++
++msgid "Next »"
++msgstr "Weiter »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Kein DHCP Server auf dieser Schnittstelle eingerichtet"
++
++msgid "No chains in this table"
++msgstr "Keine Ketten in dieser Tabelle"
++
++msgid "No files found"
++msgstr "Keine Dateien gefunden"
++
++msgid "No information available"
++msgstr "Keine Informationen verfügbar"
++
++msgid "No negative cache"
++msgstr "Kein Negativ-Cache"
++
++msgid "No network configured on this device"
++msgstr "Keine Netzwerke auf diesem Gerät konfiguriert"
++
++msgid "No network name specified"
++msgstr "Netzwerkname nicht angegeben"
++
++# Ich glab das ist so richtiger
++msgid "No package lists available"
++msgstr "Es sind keine Paketlisten vorhanden"
++
++msgid "No password set!"
++msgstr "Kein Passwort gesetzt!"
++
++msgid "No rules in this chain"
++msgstr "Keine Regeln in dieser Kette"
++
++msgid "No zone assigned"
++msgstr "Keine Zone zugewiesen"
++
++msgid "Noise"
++msgstr "Rauschen"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Noise:"
++
++msgid "None"
++msgstr "keine"
++
++msgid "Normal"
++msgstr "Normal"
++
++msgid "Not Found"
++msgstr "Nicht Gefunden"
++
++msgid "Not associated"
++msgstr "Nicht assoziiert"
++
++msgid "Not connected"
++msgstr "Nicht verbunden"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Warnung: Konfigurationsdateien werden gelöscht."
++
++msgid "Notice"
++msgstr "Notiz"
++
++msgid "Nslookup"
++msgstr "DNS-Auflösung"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "OPKG-Konfiguration"
++
++msgid "Off-State Delay"
++msgstr "Verzögerung für Ausschalt-Zustand"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"An dieser Stelle können die einzelnen Schnittstellen des Netzwerkes "
++"konfiguriert werden. Es können mehrere Schnittstellen zu einer Brücke "
++"zusammengefasst werden, indem diese durch Leerzeichen getrennt aufgezählt "
++"werden und ein entsprechender Haken im Feld Netzwerkbrücke gesetzt wird. Es "
++"können VLANs in der Notation SCHNITTSTELLE.VLANNR (z.B.: eth0.1) verwendet "
++"werden."
++
++msgid "On-State Delay"
++msgstr "Verzögerung für Anschalt-Zustand"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "Es muss entweder ein Hostname oder eine MAC-Adresse angegeben werden!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "Ein oder mehrere Felder enthalten ungültige Werte!"
++
++msgid "One or more required fields have no value!"
++msgstr "Ein oder mehr benötigte Felder sind nicht ausgefüllt!"
++
++msgid "Open list..."
++msgstr "Liste öffnen..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Option geändert"
++
++msgid "Option removed"
++msgstr "Option entfernt"
++
++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 "Options"
++msgstr "Optionen"
++
++msgid "Other:"
++msgstr "Andere:"
++
++msgid "Out"
++msgstr "Aus"
++
++msgid "Outbound:"
++msgstr "Ausgehend:"
++
++msgid "Outdoor Channels"
++msgstr "Funkkanal für den Ausseneinsatz"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "MAC-Adresse überschreiben"
++
++msgid "Override MTU"
++msgstr "MTU-Wert überschreiben"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "Gateway-Adresse in DHCP-Antworten überschreiben"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++"Ãœberschreibt die Netzmaske welche an Clients geschickt wird. Normalerweise "
++"wird diese vom bedienten Subnetz abgeleitet."
++
++msgid "Override the table used for internal routes"
++msgstr "Überschreibt die benutzte Tabelle für interne Routen"
++
++msgid "Overview"
++msgstr "Ãœbersicht"
++
++msgid "Owner"
++msgstr "Besitzer"
++
++msgid "PAP/CHAP password"
++msgstr "PAP/CHAP Passwort"
++
++msgid "PAP/CHAP username"
++msgstr "PAP/CHAP Benutzername"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "PPPoA Kapselung"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "Benötige das libiwinfo Paket!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "Die Paketlisten sind älter als 24 Stunden"
++
++msgid "Package name"
++msgstr "Paketname"
++
++msgid "Packets"
++msgstr "Pakete"
++
++msgid "Part of zone %q"
++msgstr "Teil von Zone %q"
++
++msgid "Password"
++msgstr "Passwort"
++
++msgid "Password authentication"
++msgstr "Passwortanmeldung"
++
++msgid "Password of Private Key"
++msgstr "Passwort des Privaten Schlüssels"
++
++msgid "Password successfully changed!"
++msgstr "Passwort erfolgreich geändert!"
++
++msgid "Path to CA-Certificate"
++msgstr "Pfad zum CA-Zertifikat"
++
++msgid "Path to Client-Certificate"
++msgstr "Pfad zu Client-Zertifikat"
++
++msgid "Path to Private Key"
++msgstr "Pfad zum Privaten Schlüssel"
++
++msgid "Path to executable which handles the button event"
++msgstr "Ausführbare Datei welche das Schalter-Ereignis verarbeitet"
++
++msgid "Peak:"
++msgstr "Spitze:"
++
++msgid "Perform reboot"
++msgstr "Neustart durchführen"
++
++msgid "Perform reset"
++msgstr "Reset durchführen"
++
++msgid "Phy Rate:"
++msgstr "Phy-Rate:"
++
++msgid "Physical Settings"
++msgstr "Physikalische Einstellungen"
++
++msgid "Ping"
++msgstr "Ping-Anfrage"
++
++msgid "Pkts."
++msgstr "Pkte."
++
++msgid "Please enter your username and password."
++msgstr "Bitte Benutzernamen und Passwort eingeben."
++
++msgid "Policy"
++msgstr "Standardregel"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Port %d"
++msgstr "Port %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr "Port %d ist untagged in mehreren VLANs!"
++
++msgid "Port status:"
++msgstr "Port-Status:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++"Deklariere den Client als tot nach der angegebenen Anzahl von LCP Echo "
++"Fehlschlägen, nutze den Wert 0 um Fehler zu ignorieren"
++
++msgid "Prevents client-to-client communication"
++msgstr "Unterbindet Client-Client-Verkehr"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Prism2/2.5/3 802.11b W-LAN Adapter"
++
++msgid "Proceed"
++msgstr "Fortfahren"
++
++msgid "Processes"
++msgstr "Prozesse"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "Protocol family"
++msgstr "Protokollfamilie"
++
++msgid "Protocol of the new interface"
++msgstr "Protokoll für die neue Schnittstelle"
++
++msgid "Protocol support is not installed"
++msgstr "Protokollunterstützung ist nicht installiert"
++
++msgid "Provide NTP server"
++msgstr "NTP-Server anbieten"
++
++msgid "Provide new network"
++msgstr "Neues Netzwerk anbieten"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "Qualität"
++
++msgid "RTS/CTS Threshold"
++msgstr "RTS/CTS-Schwelle"
++
++# Ein / Aus, eingehend / ausgehend?
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr "RX-Rate"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "RaLink 802.11%s W-LAN Adapter"
++
++msgid "Radius-Accounting-Port"
++msgstr "Radius-Accounting-Port"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Radius-Accounting-Secret"
++
++msgid "Radius-Accounting-Server"
++msgstr "Radius-Accounting-Server"
++
++msgid "Radius-Authentication-Port"
++msgstr "Radius-Authentication-Port"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Radius-Authentication-Secret"
++
++msgid "Radius-Authentication-Server"
++msgstr "Radius-Authentication-Server"
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++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."
++msgstr ""
++"Diese Schnittstelle wirklich löschen? Der Schritt kann nicht rückgängig "
++"gemacht werden!\n"
++"Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über diese "
++"Schnittstelle verbunden sind."
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"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 "
++"gemacht werden!\n"
++"Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über dieses Netzwerk "
++"verbunden sind."
++
++msgid "Really reset all changes?"
++msgstr "Sollen wirklich alle Änderungen verworfen werden?"
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou might lose access to this device if you are "
++"connected via this interface."
++msgstr ""
++"Das Netzwerk wirklich herunterfahren?\n"
++"Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über diese "
++"Schnittstelle verbunden sind."
++
++msgid ""
++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
++"you are connected via this interface."
++msgstr ""
++"Die Schnitstelle \"%s\" wirklich herunterfahren?\n"
++"Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über diese "
++"Schnittstelle verbunden sind."
++
++msgid "Really switch protocol?"
++msgstr "Protokoll wirklich wechseln?"
++
++msgid "Realtime Connections"
++msgstr "Echtzeitverbindungen"
++
++msgid "Realtime Graphs"
++msgstr "Echtzeit-Diagramme"
++
++msgid "Realtime Load"
++msgstr "Echtzeitsystemlast"
++
++msgid "Realtime Traffic"
++msgstr "Echtzeitverkehr"
++
++msgid "Realtime Wireless"
++msgstr "Echtzeit-WLAN-Signal"
++
++msgid "Rebind protection"
++msgstr "DNS-Rebind-Schutz"
++
++msgid "Reboot"
++msgstr "Neu Starten"
++
++msgid "Rebooting..."
++msgstr "Das System wird neu gestartet..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Startet das Betriebssystem des Routers neu."
++
++msgid "Receive"
++msgstr "Empfangen"
++
++msgid "Receiver Antenna"
++msgstr "Empfangsantenne"
++
++msgid "Reconnect this interface"
++msgstr "Diese Schnittstelle neu verbinden"
++
++msgid "Reconnecting interface"
++msgstr "Verbinde Schnittstelle neu"
++
++msgid "References"
++msgstr "Verweise"
++
++msgid "Regulatory Domain"
++msgstr "Geltungsbereich (Regulatory Domain)"
++
++msgid "Relay"
++msgstr "Relay"
++
++msgid "Relay Bridge"
++msgstr "Relay-Brücke"
++
++msgid "Relay between networks"
++msgstr "Zwischen folgenden Netzwerken weiterleiten"
++
++msgid "Relay bridge"
++msgstr "Relay-Brücke"
++
++msgid "Remote IPv4 address"
++msgstr "Entfernte IPv4-Adresse"
++
++msgid "Remove"
++msgstr "Entfernen"
++
++msgid "Repeat scan"
++msgstr "Scan wiederholen"
++
++msgid "Replace entry"
++msgstr "Eintrag ersetzen"
++
++msgid "Replace wireless configuration"
++msgstr "Drahtloskonfiguration ersetzen"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++"Wird von bestimmten Internet-Providern benötigt, z.B. Charter mit DOCSIS 3"
++
++msgid "Reset"
++msgstr "Zurücksetzen"
++
++msgid "Reset Counters"
++msgstr "Zähler zurücksetzen"
++
++msgid "Reset to defaults"
++msgstr "Auslieferungszustand wiederherstellen"
++
++msgid "Resolv and Hosts Files"
++msgstr "Resolv- und Hosts-Dateien"
++
++msgid "Resolve file"
++msgstr "Resolv-Datei"
++
++msgid "Restart"
++msgstr "Neustarten"
++
++msgid "Restart Firewall"
++msgstr "Firewall neu starten"
++
++msgid "Restore backup"
++msgstr "Sicherung wiederherstellen"
++
++msgid "Reveal/hide password"
++msgstr "Passwort zeigen/verstecken"
++
++msgid "Revert"
++msgstr "Verwerfen"
++
++msgid "Root"
++msgstr "Root"
++
++msgid "Root directory for files served via TFTP"
++msgstr "Wurzelverzeichnis für über TFTP ausgelieferte Dateien "
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Routerpasswort"
++
++msgid "Routes"
++msgstr "Routen"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Netzwerkrouten geben an, über welche Schnittstellen bestimmte Rechner oder "
++"Netzwerke erreicht werden können"
++
++msgid "Rule #"
++msgstr "Regel #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr "Vor dem Einhängen Dateisystemprüfung starten "
++
++msgid "Run filesystem check"
++msgstr "Dateisystemprüfung durchführen"
++
++msgid ""
++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
++"use 6in4 instead"
++msgstr ""
++
++msgid "SIXXS-handle[/Tunnel-ID]"
++msgstr ""
++
++msgid "SSH Access"
++msgstr "SSH-Zugriff"
++
++msgid "SSH-Keys"
++msgstr "SSH-Schlüssel"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Speichern"
++
++msgid "Save & Apply"
++msgstr "Speichern & Anwenden"
++
++msgid "Save &#38; Apply"
++msgstr "Speichern &#38; Anwenden"
++
++msgid "Scan"
++msgstr "Scan"
++
++msgid "Scheduled Tasks"
++msgstr "Geplante Aufgaben"
++
++msgid "Section added"
++msgstr "Sektion hinzugefügt"
++
++msgid "Section removed"
++msgstr "Sektion entfernt"
++
++msgid "See \"mount\" manpage for details"
++msgstr "Siehe \"mount\" Handbuch für Details"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++"Sende LCP Echo Anforderungen im angegebenem Interval in Sekunden, nur "
++"effektiv in Verbindung mit einem Fehler-Schwellwert"
++
++msgid "Separate Clients"
++msgstr "Clients isolieren"
++
++msgid "Separate WDS"
++msgstr "Separates WDS"
++
++msgid "Server Settings"
++msgstr "Servereinstellungen"
++
++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 "Service-Name"
++
++msgid "Service Type"
++msgstr "Service-Typ"
++
++msgid "Services"
++msgstr "Dienste"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "Zeitsynchronisierung einrichten"
++
++msgid "Setup DHCP Server"
++msgstr "DHCP Server einrichten"
++
++msgid "Show current backup file list"
++msgstr "Zeige aktuelle Liste der gesicherten Dateien"
++
++msgid "Shutdown this interface"
++msgstr "Diese Schnittstelle herunterfahren"
++
++msgid "Shutdown this network"
++msgstr "Dieses Netzwerk herunterfahren"
++
++msgid "Signal"
++msgstr "Signal"
++
++msgid "Signal:"
++msgstr "Signal:"
++
++msgid "Size"
++msgstr "Größe"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "Ãœberspringen"
++
++msgid "Skip to content"
++msgstr "Zum Inhalt springen"
++
++msgid "Skip to navigation"
++msgstr "Zur Navigation springen"
++
++msgid "Slot time"
++msgstr "Zeitslot"
++
++msgid "Software"
++msgstr "Paketverwaltung"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Einige Felder sind ungültig, kann das Formular nicht speichern!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Entschuldigung, das anfgeforderte Objekt wurde nicht gefunden."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr ""
++"Entschuldigung, auf dem Server ist ein unerwarteter Fehler aufgetreten."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"Aufgrund des fehlenden sysupgrade-Supports muss die neue Firmware manuell "
++"geflasht werden. Weitere Informationen sowie gerätespezifische "
++"Installationsanleitungen entnehmen Sie bitte dem OpenWrt Wiki."
++
++msgid "Sort"
++msgstr "Sortieren"
++
++msgid "Source"
++msgstr "Quelle"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "Gibt den zu behandelnden Tastenstatus an"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "Nennt das Verzeichnis, an welches das Gerät angebunden ist"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "Gibt den Server-Port dieser <em>Dropbear</em>-Instanz an"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++"Maximale Anzahl fehlgeschlagener ARP-Anfragen bis ein Host als nicht "
++"verfügbar gilt"
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++"Spezifiziert die maximale Anzahl an Sekunde nach denen Hoss als tot erachtet "
++"werden"
++
++msgid "Specify the secret encryption key here."
++msgstr "Geben Sie hier den geheimen Netzwerkschlüssel an"
++
++msgid "Start"
++msgstr "Start"
++
++msgid "Start priority"
++msgstr "Startpriorität"
++
++msgid "Startup"
++msgstr "Systemstart"
++
++msgid "Static IPv4 Routes"
++msgstr "Statische IPv4 Routen"
++
++msgid "Static IPv6 Routes"
++msgstr "Statische IPv6 Routen"
++
++msgid "Static Leases"
++msgstr "Statische Einträge"
++
++msgid "Static Routes"
++msgstr "Statische Routen"
++
++msgid "Static WDS"
++msgstr "Statisches WDS"
++
++msgid "Static address"
++msgstr "Statische Adresse"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"Statische Leases werden genutzt um feste IP-Adressen und Hostnames zu DHCP-"
++"Clients zuzuordnen. Sie werden auch für nicht-dynamische Schnittstellen-"
++"Konfigurationen benötigt auf denen lediglich Hosts mit zugehörigem "
++"statischem Lease-Eintrag bedient werden."
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Stop"
++msgstr "Stoppen"
++
++msgid "Strict order"
++msgstr "Strikte Reihenfolge"
++
++msgid "Submit"
++msgstr "Absenden"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Auslagerungsdatei"
++
++msgid "Switch"
++msgstr "Switch"
++
++msgid "Switch %q"
++msgstr "Switch %q"
++
++msgid "Switch %q (%s)"
++msgstr "Switch %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Wechsle Protokoll"
++
++msgid "Sync with browser"
++msgstr "Mit Browser synchronisieren"
++
++msgid "Synchronizing..."
++msgstr "Synchronisiere..."
++
++msgid "System"
++msgstr "System"
++
++msgid "System Log"
++msgstr "Systemprotokoll"
++
++msgid "System Properties"
++msgstr "Systemeigenschaften"
++
++msgid "System log buffer size"
++msgstr "Größe des Systemprotokoll-Puffers"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "TFTP Einstellungen"
++
++msgid "TFTP server root"
++msgstr "TFTP Wurzelverzeichnis"
++
++# same as RX
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr "TX-Rate"
++
++msgid "Table"
++msgstr "Tabelle"
++
++msgid "Target"
++msgstr "Ziel"
++
++msgid "Terminate"
++msgstr "Beenden"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"Die <em>Gerätekonfiguration</em> deckt physikalische Einstellungen der WLAN-"
++"Hardware wie Kanal, Sendestärke oder Antennenauswahl ab. Diese Einstellungen "
++"werden von allen Netzwerken auf dem Gerät geteilt. Netzwerk-spezifische "
++"Einstellungen wie Verschlüsselung oder Betriebsmodus sind in der "
++"<em>Schnittstellenkonfiguration</em> gruppiert."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"Das <em>libiwinfo-lua</em> Paket ist nicht installiert. Dieses Paket muss "
++"für eine funktionierende WLAN-Konfiguration vorhanden sein!"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++"Vom Provider zugewiesener IPv6 Präfix, endet normalerweise mit <code>::</"
++"code>"
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++"Erlaubte Buchstaben sind: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr "Die Gerätedatei des Speichers oder der Partition (z.B.: /dev/sda)"
++
++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 "Das Dateisystem mit dem der Speicher formatiert ist (z.B.: ext3)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++"Das Firmware-Image wurde hochgeladen. Nachfolgend sind die Prüfsumme und "
++"Dateigröße gelistet. Vergleichen Sie diese mit der Originaldatei um die "
++"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"
++
++msgid "The following rules are currently active on this system."
++msgstr "Die folgenden Regeln sind zur Zeit auf dem System aktiv."
++
++msgid "The given network name is not unique"
++msgstr "Der angebene Netzwerk-Name ist nicht eindeutig"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"Die Hardware ist nicht Multi-SSID fähig und die existierende Konfiguration "
++"wird beim Fortfahren ersetzt."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++"Länge des IPv4 Präfix in Bits, die übrigen Bits werden in der IPv6 Adresse "
++"verwendet."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "Länge des IPv6 Präfix in Bits"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++"Die Netzwerkschnittstellen dieses Geräts können zu verschienden <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s zusammengefasst werden, in denen "
++"Geräte miteinander direkt kommunizieren können. <abbr title=\"Virtual Local "
++"Area Network\">VLAN</abbr>s werden auch häufig dazu genutzt, um Netzwerke "
++"voneinander zu trennen. So ist oftmals eine Schnittstelle als Uplink zu "
++"einem größeren Netz, wie dem Internet, vorkonfiguriert und die anderen "
++"Schnittstellen bilden ein <abbr title=\"Virtual Local Area Network\">VLAN</"
++"abbr> für das lokale Netzwerk."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "Dem ausgewähltem Protokoll muss ein Gerät zugeordnet werden"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++"Die Einstellungen werden nun gelöscht! Anschließend wird ein Neustart des "
++"Systems durchgeführt."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"Der Flashvorgang läuft jetzt.<br /> SCHALTEN SIE NICHT DEN STROM AUS!<br /> "
++"Warten Sie einige Minuten bis das Gerät wieder erreichbar ist. Je nach "
++"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 ""
++
++msgid ""
++"The uploaded image file does not contain a supported format. Make sure that "
++"you choose the generic image format for your platform."
++msgstr ""
++"Das hochgeladene Firmware-Image hat ein nicht unterstütztes Format. Stellen "
++"Sie sicher dass Sie das generische Format für Ihre Platform gewählt haben."
++
++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 pending changes to revert!"
++msgstr "Es gibt keine ausstehenen Änderungen zurückzusetzen!"
++
++msgid "There are no pending changes!"
++msgstr "Es gibt keine ausstehenen Änderungen!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"Es wurde noch kein Netzwerkgerät zugeordnet, bitte ein Gerät im "
++"\"Physikalische Einstellungen\" Bereich anfügen"
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"Es ist kein Passwort auf diesem Router gesetzt. Bitte konfigurieren Sie ein "
++"Root-Passwort um das Web-Interface zu schützen und SSH zu aktivieren."
++
++msgid "This IPv4 address of the relay"
++msgstr "IPv4-Adresse des Relais"
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"Dies ist eine Liste von Shell-Glob-Mustern um Dateien und Verzeichnisse zu "
++"selektieren welche während eines System-Upgrade gesichert werden sollen. "
++"Modifizierte Dateien in /etc/config/ und bestimmte andere essenzielle "
++"Konfigurationsdateien werden automatisch gesichert."
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"Dies ist der Inhalt von /etc.rc.local. Hier kann man eigene Befehle einfügen "
++"(vor 'exit 0'), die dann am Ende des Bootvorgangs ausgeführt werden."
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++"Dies ist die lokale, vom Broker zugewiesene IPv6-Adresse, sie endet "
++"üblicherweise mit <code>:2</code>"
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr "Dies ist der einzige DHCP im lokalen Netz"
++
++msgid "This is the plain username for logging into the account"
++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 ""
++"Dies ist die System-Crontab in der geplante Aufgaben definiert werden können."
++
++msgid ""
++"This is usually the address of the nearest PoP operated by the tunnel broker"
++msgstr ""
++"Dies ist üblicherweise die Adresse des nächstgelegenen PoPs betrieben durch "
++"den Tunnelbroker"
++
++msgid ""
++"This list gives an overview over currently running system processes and "
++"their status."
++msgstr ""
++"Diese Tabelle gibt eine Übersicht über aktuell laufende Systemprozesse und "
++"deren Status."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr ""
++"Diese Seite ermöglicht die Konfiguration benutzerdefinierter Tastenaktionen"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "Diese Seite gibt eine Übersicht über aktive Netzwerkverbindungen."
++
++msgid "This section contains no values yet"
++msgstr "Diese Sektion enthält noch keine Einträge"
++
++msgid "Time Synchronization"
++msgstr "Zeitsynchronisation"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "Die Zeitsynchronisation wurde noch nicht konfiguriert."
++
++msgid "Timezone"
++msgstr "Zeitzone"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"Zum Wiederherstellen der Konfiguration kann hier ein bereits vorhandenes "
++"Backup-Archiv hochgeladen werden."
++
++msgid "Total Available"
++msgstr "Gesamt verfügbar"
++
++msgid "Traceroute"
++msgstr "Routenverfolgung"
++
++# Ich bin der Meinung Traffic versteht jeder! Wenn der Begriff "deutscher" sein soll, würde ich "Datenmenge" angeben. Aber "Verkehrs" passt nicht!
++msgid "Traffic"
++msgstr "Traffic"
++
++msgid "Transfer"
++msgstr "Transfer"
++
++msgid "Transmission Rate"
++msgstr "Ãœbertragungsrate"
++
++msgid "Transmit"
++msgstr "Senden"
++
++msgid "Transmit Power"
++msgstr "Sendeleistung"
++
++msgid "Transmitter Antenna"
++msgstr "Sendeantenne"
++
++msgid "Trigger"
++msgstr "Auslöser"
++
++msgid "Trigger Mode"
++msgstr "Auslösmechanismus"
++
++msgid "Tunnel ID"
++msgstr "Tunnel-ID"
++
++msgid "Tunnel Interface"
++msgstr "Tunnelschnittstelle"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Turbo Modus"
++
++msgid "Tx-Power"
++msgstr "Sendestärke"
++
++msgid "Type"
++msgstr "Typ"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "Nur UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "USB-Gerät"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr "Kann Anfrage nicht zustellen"
++
++msgid "Unknown"
++msgstr "Unbekannt"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Unbekannter Fehler, Passwort nicht geändert!"
++
++msgid "Unmanaged"
++msgstr "Ignoriert"
++
++msgid "Unsaved Changes"
++msgstr "Ungespeicherte Änderungen"
++
++msgid "Unsupported protocol type."
++msgstr "Nicht unterstützter Protokolltyp."
++
++msgid "Update lists"
++msgstr "Listen aktualisieren"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"Zum Ersetzen der aktuellen Firmware kann hier ein sysupgrade-Kompatibles "
++"Image hochgeladen werden. Wenn die vorhandene Konfiguration auch nach dem "
++"Update noch aktiv sein soll, aktivieren Sie \"Konfiguration behalten\"."
++
++msgid "Upload archive..."
++msgstr "Backup wiederherstellen..."
++
++msgid "Uploaded File"
++msgstr "hochgeladene Datei"
++
++msgid "Uptime"
++msgstr "Laufzeit"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Verwende /etc/ethers"
++
++msgid "Use DHCP gateway"
++msgstr "Benutze DHCP-Gateway"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "Benutze die von der Gegenstelle zugewiesenen DNS-Server"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "Muss ein ISO/IEC 3166 Länderkürzel sein."
++
++msgid "Use MTU on tunnel interface"
++msgstr "Benutze MTU auf der Tunnelschnittstelle"
++
++msgid "Use TTL on tunnel interface"
++msgstr "Benutze TTL auf der Tunnelschnittstelle"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "Benutze Broadcast-Flag"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "Benutze eigene DNS-Server"
++
++msgid "Use default gateway"
++msgstr "Benutze Standard-Gateway"
++
++msgid "Use gateway metric"
++msgstr "Benutze Gateway-Metrik"
++
++msgid "Use routing table"
++msgstr "Benutze Routing-Tabelle"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"Die <em>Hinzufügen</em> Schaltfläche fügt einen neuen Lease-Eintrag hinzu. "
++"Die <em>MAC-Adresse</em> identifiziert den Host, die <em>IPv4-Adresse</em> "
++"definiert die zu nutzende statische Adresse und der <em>Hostname</em> ist "
++"der symbolische Name der dem Host zugewisen wird."
++
++msgid "Used"
++msgstr "Belegt"
++
++msgid "Used Key Slot"
++msgstr "Benutzer Schlüsselindex"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Benutzername"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "VLAN Schnittstelle"
++
++msgid "VLANs on %q"
++msgstr "VLANs auf %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLANs auf %q (%s)"
++
++msgid "VPN Server"
++msgstr "VPN-Server"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr "Bei DHCP-Anfragen gesendete Vendor-Klasse"
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr "Verifizieren"
++
++msgid "Version"
++msgstr "Version"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "WEP Open System"
++
++msgid "WEP Shared Key"
++msgstr "WEP Shared Key"
++
++msgid "WEP passphrase"
++msgstr "WEP Schlüssel"
++
++msgid "WMM Mode"
++msgstr "WMM Modus"
++
++msgid "WPA passphrase"
++msgstr "WPA Schlüssel"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 ""
++
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Warnung"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Drahtlos"
++
++msgid "Wireless"
++msgstr "WLAN"
++
++msgid "Wireless Adapter"
++msgstr "WLAN-Gerät"
++
++msgid "Wireless Network"
++msgstr "Drahtlosnetzwerk"
++
++msgid "Wireless Overview"
++msgstr "Drahtlosübersicht"
++
++msgid "Wireless Security"
++msgstr "WLAN-Verschlüsselung"
++
++msgid "Wireless is disabled or not associated"
++msgstr "WLAN ist deaktiviert oder nicht assoziiert"
++
++msgid "Wireless is restarting..."
++msgstr "WLAN startet neu..."
++
++msgid "Wireless network is disabled"
++msgstr "Das WLAN-Netzwerk ist deaktiviert"
++
++msgid "Wireless network is enabled"
++msgstr "Das WLAN-Netzwerk ist aktiviert"
++
++msgid "Wireless restarted"
++msgstr "WLAN neu gestartet"
++
++msgid "Wireless shut down"
++msgstr "WLAN heruntergefahren"
++
++msgid "Write received DNS requests to syslog"
++msgstr "Empfangene DNS-Anfragen in das Systemprotokoll schreiben"
++
++msgid "XR Support"
++msgstr "XR-Unterstützung"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Hier können installierte Startscripte aktiviert oder deaktiviert werden. "
++"Änderungen werden erst mit einem Geräteneustart angewendet.<br /"
++"><strong>Warnung: Wenn essentialle Startscripte wie \"network\" deaktiviert "
++"werden könnte das Gerät unerreichbar werden!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Im Browser muss Java-Script aktiviert sein oder LuCI wird nicht richtig "
++"funktionieren."
++
++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 ""
++
++msgid "any"
++msgstr "beliebig"
++
++msgid "auto"
++msgstr "auto"
++
++msgid "automatic"
++msgstr "automatisch"
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "bridged"
++
++msgid "create:"
++msgstr "erstelle:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "überbrückt angegebene Schnittstelle(n)"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "deaktivieren"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "abgelaufen"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr "Speicherort für vergebenen DHCP-Adressen"
++
++msgid "forward"
++msgstr "weitergeleitet"
++
++msgid "full-duplex"
++msgstr "Voll-Duplex"
++
++msgid "half-duplex"
++msgstr "Halb-Duplex"
++
++msgid "help"
++msgstr "Hilfe"
++
++msgid "hidden"
++msgstr "versteckt"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "falls Ziel ein Netzwerk ist"
++
++msgid "input"
++msgstr "eingehend"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++msgstr "kbit/s"
++
++msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
++msgstr "Lokale DNS-Datei"
++
++msgid "minimum 1280, maximum 1480"
++msgstr ""
++
++msgid "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "nein"
++
++msgid "no link"
++msgstr "nicht verbunden"
++
++msgid "none"
++msgstr "keine"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "aus"
++
++msgid "on"
++msgstr "ein"
++
++msgid "open"
++msgstr "offen"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "routed"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "tagged"
++
++msgid "unknown"
++msgstr "unbekannt"
++
++msgid "unlimited"
++msgstr "unbegrenzt"
++
++msgid "unspecified"
++msgstr "unspezifiziert"
++
++msgid "unspecified -or- create:"
++msgstr "nichts auswählen -oder- erstellen:"
++
++msgid "untagged"
++msgstr "untagged"
++
++msgid "yes"
++msgstr "ja"
++
++msgid "« Back"
++msgstr "« Zurück"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "Aushandeln von IPv6-Adressen auf der PPP-Verbindung aktivieren"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "Hosts-Dateien ignorieren"
++
++#~ msgid "Path"
++#~ msgstr "Pfad"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Bitte warten: Neustart wird durchgeführt..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Warnung: Es gibt ungespeicherte Änderungen, die bei einem Neustart "
++#~ "verloren gehen!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Immer 40MHz Kanalbreite nutzen, auch wenn der sekundäre Kanal andere "
++#~ "Netzwerke überschneidet. Die Benutzung dieser Option verletzt den IEEE "
++#~ "802.11n-2009 Standard!"
++
++#~ msgid "Cached"
++#~ msgstr "Zwischengespeichert"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr ""
++#~ "Konfiguriert diesen Mountpunkt als Overlay-Speicher für <em>block-"
++#~ "extroot</em>"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "40MHz-Modus erzwingen"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Frequenzsprung"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "Festgelegt auf Kanal %d benutzt von %s"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "Als Wurzeldateisystem benutzen"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "HE.net Benutzer-ID"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr ""
++#~ "Die ist die 32 Zeichen lange, hexadezimal kodierte Nutzer-ID, nicht der "
++#~ "Benutzername."
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz, Sekundärkanal oberhalb"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz, Sekundärkanal unterhalb"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Routerankündigungen (RAs) akzeptieren"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "IPv6 auf folgendem Netzwerk ankündigen"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "Angekündigte Subnetz-ID"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "Erlaubter Bereich 1 bis 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "HT-Fähigkeiten"
++
++#~ msgid "HT mode"
++#~ msgstr "HT-Modus"
++
++#~ msgid "Router Model"
++#~ msgstr "Routermodell"
++
++#~ msgid "Router Name"
++#~ msgstr "Routername"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "Sende Router-Solicitations"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr "Bestimmt die bevorzugte angekündigte Prefix-Lebenszeit in Sekunden"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr "Bestimmt die gültige angeündigte Prefix-Lebenszeit in Sekunden"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "Benutze bevorzugte Lebenszeit"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "Benutze gültige Lebenszeit"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Warte auf den Router..."
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "NTP Server aktivieren"
++
++#~ msgid "Active Leases"
++#~ msgstr "Aktive Zuweisungen"
++
++#~ msgid "Open"
++#~ msgstr "Offen"
++
++#~ msgid "KB"
++#~ msgstr "KB"
++
++#~ msgid "Bit Rate"
++#~ msgstr "Bitrate"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "Konfiguration / Anwenden"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "Konfiguration / Änderungen"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "Konfiguration / Zurücksetzen"
++
++#~ msgid "MAC"
++#~ msgstr "MAC-Adresse"
++
++#~ msgid "MAC Address"
++#~ msgstr "MAC-Adresse"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Verschlüsselung\">Vers.</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "WLAN-Scan"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr "Wählt die Schnittstelle die diesem Netzwerk zugeordnet wird."
++
++#~ msgid "Create Network"
++#~ msgstr "Netzwerk anlegen"
++
++#~ msgid "Link"
++#~ msgstr "Verbindung"
++
++#~ msgid "Networks"
++#~ msgstr "Netzwerke"
++
++#~ msgid "Power"
++#~ msgstr "Leistung"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Drahtlosnetzwerke in der lokalen Umgebung des Routers:"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr "CIDR-Notation: Adresse/Prefix"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "DNS-Server"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "IPv4-Broadcast"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "IPv6-Adresse"
++
++#~ msgid "IP-Aliases"
++#~ msgstr "IP Aliase"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "IPv6 Einstellungen"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "Hinweis: When eine Schnittstelle gewählt wird, welche Mitglied eines "
++#~ "anderen Netzwerkes ist, wird sie in dieses Netzwerk verschoben"
++
++#~ msgid ""
++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might "
++#~ "lose access to this router if you are connected via this interface."
++#~ msgstr ""
++#~ "Diese Schnittstelle wirklich löschen? Der Schritt kann nicht rückgängig "
++#~ "gemacht werden!\\nDer Zugriff auf den Router könnte verlorengehen wenn "
++#~ "Sie über diese Schnittstelle verbunden sind."
++
++#~ msgid ""
++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou "
++#~ "might lose access to this router if you are connected via this network."
++#~ msgstr ""
++#~ "Dieses Drahtlosnetzwerk wirklich löschen? Der Schritt kann nicht "
++#~ "rückgängig gemacht werden!\\nDer Zugriff auf den Router könnte "
++#~ "verlorengehen wenn Sie über dieses Netzwerk verbunden sind."
++
++#~ msgid ""
++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router "
++#~ "if you are connected via this interface."
++#~ msgstr ""
++#~ "Die Schnitstelle \"%s\" wirklich herunterfahren?\\nDer Zugriff auf den "
++#~ "Router könnte verlorengehen wenn Sie über diese Schnittstelle verbunden "
++#~ "sind."
++
++#~ msgid ""
++#~ "Really shutdown network ?\\nYou might lose access to this router if you "
++#~ "are connected via this interface."
++#~ msgstr ""
++#~ "Das Netzwerk wirklich herunterfahren?\\nDer Zugriff auf den Router könnte "
++#~ "verlorengehen wenn Sie über diese Schnittstelle verbunden sind."
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "Die Netzwerkschnittstellen am Router können zu verschienden VLANs "
++#~ "zusammengefasst werden, in denen Geräte miteinander direkt kommunizieren "
++#~ "können. VLANs werden auch häufig dazu genutzt, um Netzwerke voneinander "
++#~ "zu trennen. So ist oftmals eine Schnittstelle als Uplink zu einem "
++#~ "größeren Netz, wie dem Internet, vorkonfiguriert und die anderen "
++#~ "Schnittstellen bilden ein VLAN für das lokale Netzwerk."
++
++#~ msgid "Enable buffering"
++#~ msgstr "Pufferung aktivieren"
++
++#~ msgid "IPv6-over-IPv4"
++#~ msgstr "IPv6-über-IPv4"
++
++#~ msgid "Custom Files"
++#~ msgstr "Benutzerdefinierte Dateien"
++
++#~ msgid "Custom files"
++#~ msgstr "Benutzerdefinierte Dateien"
++
++#~ msgid "Detected Files"
++#~ msgstr "Erkannte Dateien"
++
++#~ msgid "Detected files"
++#~ msgstr "Erkannte Dateien"
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Zu übernehmende Dateien bei Firmwareupgrade"
++
++#~ msgid "General"
++#~ msgstr "Allgemeines"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Hier können Eigenschaften und die Funktionalität der Oberfläche angepasst "
++#~ "werden."
++
++#~ msgid "Post-commit actions"
++#~ msgstr "UCI-Befehle beim Anwenden"
++
++#~ msgid ""
++#~ "The following files are detected by the system and will be kept "
++#~ "automatically during sysupgrade"
++#~ msgstr ""
++#~ "Die folgenden Dateien wurden vom System erkannt und werden bei einen "
++#~ "System-Update automatisch beibehalten"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Beim Anwenden der Konfiguration aus der Oberflächliche heraus können "
++#~ "automatisch die relevanten Dienste neugestart werden, sodass Änderungen "
++#~ "sofort nach dem Anwenden aktiv werden und der Router nicht erst "
++#~ "neugestartet werden muss."
++
++#~ msgid ""
++#~ "This is a list of shell glob patterns for matching files and directories "
++#~ "to include during sysupgrade"
++#~ msgstr ""
++#~ "Dies ist eine Liste von Shell-Glob-Mustern um Dateien und Verzeichnisse "
++#~ "zu wählen welche bei einem Systemupgrade beibehalten werden sollen"
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Weboberfläche"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++
++#~ msgid "AHCP Settings"
++#~ msgstr "AHCP-Einstellungen"
++
++#~ msgid "ARP ping retries"
++#~ msgstr "ARP-Ping Versuche"
++
++#~ msgid "ATM Settings"
++#~ msgstr "ATM Einstellungen"
++
++#~ msgid "Accept Router Advertisements"
++#~ msgstr "Router Advertisements akzeptieren"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Zugriffspunkt (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Weitere pppd Optionen"
++
++#~ msgid "Allowed range is 1 to FFFF"
++#~ msgstr "Der Erlaubte Bereich liegt zwischen 1 und FFFF"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Automatische Trennung"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Sicherungsarchiv"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Konfiguriert den lokalen DNS-Server so, dass er die von der Gegenstelle "
++#~ "angekündigten Nameserver-Adressen nutzt"
++
++#~ msgid "Connect script"
++#~ msgstr "Verbindungs-Script"
++
++#~ msgid "Create backup"
++#~ msgstr "Sicherung erstellen"
++
++#~ msgid "Default"
++#~ msgstr "Standard"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Trennuns-Script"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Paketlisten und Installationsziele bearbeiten"
++
++#~ msgid "Enable 4K VLANs"
++#~ msgstr "Aktiviere 4K VLANs"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "IPv6 für die PPP-Verbindung aktivieren"
++
++#~ msgid "Firmware image"
++#~ msgstr "Firmware-Image"
++
++#~ msgid "Forward DHCP"
++#~ msgstr "DHCP weiterleiten"
++
++#~ msgid "Forward broadcasts"
++#~ msgstr "Broadcasts weiterleiten"
++
++#~ msgid "HE.net Tunnel ID"
++#~ msgstr "HE.net Tunnel ID"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Auf dieser Seite können Sicherungen der Konfiguration erstellt und "
++#~ "eingespielt werden und - wenn möglich - die Grundeinstellungen "
++#~ "wiederhergestellt werden."
++
++#~ msgid "Installation targets"
++#~ msgstr "Installationsziele"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Konfigurationsdateien erhalten"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Keep-Alive"
++
++#~ msgid "Kernel"
++#~ msgstr "Kernel"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Lässt pppd die aktuelle Standardroute ersetzen und über die PPP "
++#~ "Schnittstelle leiten"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr ""
++#~ "Lässt pppd das angegebene Script nach dem Aufbau der PPP Verbindung "
++#~ "abarbeiten"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr ""
++#~ "Lässt pppd das angegebene Script vor dem Trennen der PPP Verbindung "
++#~ "abarbeiten"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Stellen Sie sicher das die richtige PIN hier eingetragen wird, sonst "
++#~ "könnte die SIM-Karte gesperrt werden!"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "Es handelt sich hierbei meist um Netzwerkserver, die verschiedene "
++#~ "Aufgaben auf dem Router erfüllen, beispielsweise Shell-Zugang ermöglichen "
++#~ "oder diese Weboberfläche über HTTP zur Verfügung stellen."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr ""
++#~ "Anzahl fehlgeschlagener Verbindungstests nach der automatisch neu "
++#~ "verbunden wird"
++
++#~ msgid "Override Gateway"
++#~ msgstr "Gateway erzwingen"
++
++#~ msgid "PIN code"
++#~ msgstr "PIN-Code"
++
++#~ msgid "PPP Settings"
++#~ msgstr "PPP Einstellungen"
++
++#~ msgid "Package lists"
++#~ msgstr "Paketlisten"
++
++#~ msgid ""
++#~ "Port <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> specify the default "
++#~ "VLAN ID added to received untagged frames."
++#~ msgstr ""
++#~ "Port <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> definieren die "
++#~ "Standard-VLAN ID welche zu empfangenen, untagged Ethernet-Frames "
++#~ "hinzugefügt wird."
++
++#~ msgid "Port PVIDs on %q"
++#~ msgstr "Port PVIDs auf %q"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr ""
++#~ "Alle aktuellen Einstellungen verwerfen und Grundeinstellungen "
++#~ "wiederherstellen?"
++
++#~ msgid "Processor"
++#~ msgstr "Prozessor"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Radius-Port"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Radius-Server"
++
++#~ msgid "Relay Settings"
++#~ msgstr "Relay-Einstellungen"
++
++#~ msgid "Replace default route"
++#~ msgstr "Standardroute ersetzen"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Grundeinstellungen wiederherstellen"
++
++#~ msgid "Routing table ID"
++#~ msgstr "Nr. der Routingtabelle"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr ""
++#~ "Zeit in Sekunden um auf die Initialisierung des Modems zu warten bevor "
++#~ "ein Verbindungsversuch unternommen wird"
++
++#~ msgid "Send Router Solicitiations"
++#~ msgstr "Router Solicititaions senden"
++
++#~ msgid "Server IPv4-Address"
++#~ msgstr "Server IPv4-Adresse"
++
++#~ msgid "Service type"
++#~ msgstr "Dienstart"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr ""
++#~ "Dienste und Hintergrundprozesse stellen den Großteil der Funktionalitäten "
++#~ "auf dem Router zur Verfügung."
++
++#~ msgid "Settings"
++#~ msgstr "Einstellungen"
++
++#~ msgid "Setup wait time"
++#~ msgstr "Initialisierungszeit"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Sorry. OpenWrt unterstützt kein Systemupdate auf dieser Platform.<br /> "
++#~ "Sie müssen das Gerät manuell neu flashen."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr ""
++#~ "Hier können zusätzliche Kommandozeilenargumente für pppd angegeben werden"
++
++#~ msgid "TTL"
++#~ msgstr "TTL"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "Geräteknoten des Modems, z.B. /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr "Zeit (in s) nach der die Verbindung bei Inaktivität getrennt wird"
++
++#~ msgid "Time Server (rdate)"
++#~ msgstr "Zeit-Server (rdate)"
++
++#~ msgid "Tunnel Settings"
++#~ msgstr "Tunnel-Einstellungen"
++
++#~ msgid "Update package lists"
++#~ msgstr "Paketlisten aktualisieren"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "Firmware-Image hochladen um das Gerät neu zu flashen."
++
++#~ msgid "Upload image"
++#~ msgstr "Image hochladen"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "DNS der Gegenstelle nutzen"
++
++#~ msgid "VLAN %d"
++#~ msgstr "VLAN %d"
++
++#~ msgid ""
++#~ "You can specify multiple DNS servers here, press enter to add a new "
++#~ "entry. Servers entered here will override automatically assigned ones."
++#~ msgstr ""
++#~ "Hier können mehrere DNS-Server angegeben werden. Enter fügt ein neues "
++#~ "Eingabefeld hinzu. Hier angegebene Server überschreiben autmatisch "
++#~ "zugewiesene Adressen."
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Für die Unterstützung von UMTS/GPRS muss \"comgt\", für PPPoE \"ppp-mod-"
++#~ "pppoe\", für PPPoA \"ppp-mod-pppoa\" und für PPtP \"pptp\" installiert "
++#~ "sein"
++
++#~ msgid "back"
++#~ msgstr "zurück"
++
++#~ msgid "buffered"
++#~ msgstr "gepuffert"
++
++#~ msgid "cached"
++#~ msgstr "gecached"
++
++#~ msgid "free"
++#~ msgstr "frei"
++
++#~ msgid "static"
++#~ msgstr "statisch"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "LuCI ist eine Sammlung freier Lua-Software einschließlich eines MVC-"
++#~ "Webframeworks und einer Weboberfläche für eingebettete Geräte. Luci steht "
++#~ "unter der Apache-Lizenz."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "SSH-Schlüssel"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "Ein schlanker HTTP/1.1 Webserver in C und Lua geschrieben um LuCI zu "
++#~ "betreiben."
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Ein kleiner Webserver, der für die Bereitstellung von LuCI genutzt werden "
++#~ "kann."
++
++#~ msgid "About"
++#~ msgstr "Ãœber"
++
++#~ msgid "Active IP Connections"
++#~ msgstr "Aktive IP Verbindungen"
++
++#~ msgid "Addresses"
++#~ msgstr "Adressen"
++
++#~ msgid "Admin Password"
++#~ msgstr "Passwort ändern"
++
++#~ msgid "Alias"
++#~ msgstr "Alias"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Anmeldeaufforderung"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Port"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr "Ändert das Passwort des Systemverwalters (Benutzer \"root\")"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Client mit WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "Konfigurationsdatei"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Verbindungszeitlimit"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Mitwirkende Entwickler"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "durch DHCP zugewiesen"
++
++#~ msgid "Document root"
++#~ msgstr "Wurzelverzeichnis"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Keep-Alive aktivieren"
++
++#~ msgid "Enable device"
++#~ msgstr "Gerät aktivieren"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "Netzwerkbrücke"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "Hier können öffentliche SSH-Schlüssel (einer pro Zeile) zur "
++#~ "Authentifizierung abgelegt werden."
++
++#~ msgid "ID"
++#~ msgstr "Bezeichner"
++
++#~ msgid "IP Configuration"
++#~ msgstr "IP Konfiguration"
++
++#~ msgid "Interface Status"
++#~ msgstr "Netzwerkschnittstellen-Status"
++
++#~ msgid "Lead Development"
++#~ msgstr "Leitende Entwicklung"
++
++#~ msgid "Master"
++#~ msgstr "Master"
++
++#~ msgid "Master + WDS"
++#~ msgstr "Master mit WDS"
++
++#~ msgid "No address configured on this interface."
++#~ msgstr "Keine Adresse auf dieser Schnittstelle konfiguriert"
++
++#~ msgid "Not configured"
++#~ msgstr "nicht konfiguriert"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Passwort erfolgreich geändert"
++
++#~ msgid "Plugin path"
++#~ msgstr "Pluginpfad"
++
++#~ msgid "Ports"
++#~ msgstr "Ports"
++
++#~ msgid "Primary"
++#~ msgstr "primär"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Projekt Homepage"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "Pseudo-Ad-Hoc (Atheros)"
++
++#~ msgid "STP"
++#~ msgstr "Spanning-Tree-Protokoll"
++
++#~ msgid "Thanks To"
++#~ msgstr "Dank an"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr "Aufforderungstext zum Anmelden im Administrationsbereich"
++
++#~ msgid "Unknown Error"
++#~ msgstr "Unbekannter Fehler"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "nutzt <code>/etc/httpd.conf</code> wenn leer"
++
++#~ msgid "Enable this switch"
++#~ msgstr "Switch aktivieren"
++
++#~ msgid "OPKG error code %i"
++#~ msgstr "OPKG Fehlercode %i"
++
++#~ msgid "Package lists updated"
++#~ msgstr "Paketlisten wurden aktualisiert"
++
++#~ msgid "Reset switch during setup"
++#~ msgstr "Switch während der Einrichtung zurücksetzen"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Installierte Pakete aktualisieren"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "Zusätzlich können hier Protokolldaten, des Kernels und diverser "
++#~ "Systemdienste eingesehen werden, um deren Zustand zu kontrollieren."
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "Hier finden sich Informationen über den aktuellen Status des Systems, "
++#~ "beispielsweise Prozessortakt, Speicherauslastung und "
++#~ "Netzwerkschnittstellen."
++
++#~ msgid "Search file..."
++#~ msgstr "Datei suchen..."
++
++#~ msgid "Server"
++#~ msgstr "Server"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "LuCI ist eine freie, flexible und benutzerfreundliche grafische "
++#~ "Oberfläche zur Konfiguration von OpenWrt Kamikaze."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "Und nun wünschen wir viel Spaß mit dem Router!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "Wir sind natürlich stets darum bemüht, diese Oberfläche noch besser und "
++#~ "intuitiver zu Gestalten und freuen uns über jegliche Art von Feedback "
++#~ "oder Verbesserungsvorschlägen."
++
++#~ msgid "Hello!"
++#~ msgstr "Hallo!"
++
++#~ msgid "LuCI Components"
++#~ msgstr "LuCI Komponenten"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Hinweis: In LuCI werden getätigte Änderungen erst nach einem Klick auf "
++#~ "Änderungen - Speichern &amp; Anwenden angewandt."
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "Auf den folgenden Seiten können alle wichtigen Einstellungen des Routers "
++#~ "vorgenommen werden."
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr "Das LuCI-Team"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr "Dies ist der Administrationsbereich von LuCI."
++
++#~ msgid "User Interface"
++#~ msgstr "Benutzeroberfläche"
++
++#~ msgid "used"
++#~ msgstr "benutzt"
++
++#~ msgid "enable"
++#~ msgstr "aktivieren"
++
++#~ msgid ""
++#~ "Port <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> specify the default "
++#~ "VLAN ID added to received untagged frames.<br />Leave the ID field empty "
++#~ "to disable auto tagging on the associated port."
++#~ msgstr ""
++#~ "Port <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> definieren die "
++#~ "standard VLAN-ID welche zu empfangen, nicht getaggten Ethernet-Frames "
++#~ "hinzugefügt wird.<br />Dieses Feld leer lassen um Auto-Tagging auf dem "
++#~ "zugehörigen Port zu deaktivieren."
++
++#~ msgid "(hidden)"
++#~ msgstr "(versteckt)"
++
++#~ msgid "(optional)"
++#~ msgstr "(optional)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "DNS-Port"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr "DNS-Server werden gemäß der Reihenfolge der Resolvdatei abgefragt"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr "maximale Anzahl von DHCP-Leases"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Extension Mechanisms "
++#~ "for Domain Name System\">EDNS0</abbr> packet size"
++#~ msgstr ""
++#~ "maximale <abbr title=\"Extension Mechanisms for Domain Name System"
++#~ "\">EDNS.0</abbr> Paketgröße"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "AP-Isolation"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "WLAN-Netz zu Netzwerk hinzufügen"
++
++#~ msgid "Aliases"
++#~ msgstr "Aliasse"
++
++#~ msgid "Attach to existing network"
++#~ msgstr "Zu bestehendem Netzwerk hinzufügen"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "MSS-Korrektur"
++
++#, fuzzy
++#~ msgid "Create Or Attach Network"
++#~ msgstr "Netzwerk anlegen"
++
++#~ msgid "DHCP"
++#~ msgstr "DHCP"
++
++#~ msgid "Devices"
++#~ msgstr "Geräte"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "Reverse DNS-Anfragen für lokale Netze nicht weiterleiten"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "TFTP-Server aktivieren"
++
++#~ msgid "Errors"
++#~ msgstr "Fehler"
++
++#~ msgid "Essentials"
++#~ msgstr "Vereinfacht"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Erweitere Hosts"
++
++#~ msgid "First leased address"
++#~ msgstr "Erste vergebene Adresse"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Behebt Probleme bei nicht erreichbaren Webseiten, Absenden von Formularen "
++#~ "oder anderes unerwartetes Verhalten für einige ISPs."
++
++#~ msgid "Hardware Address"
++#~ msgstr "Hardware Adresse"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "An dieser Stelle können eingebaute WLAN-Geräte konfiguriert werden."
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "Unabhängig (Ad-Hoc)"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Internetverbindung"
++
++#~ msgid "Join (Client)"
++#~ msgstr "Einklinken (Client)"
++
++#~ msgid "Leases"
++#~ msgstr "Zuweisungen"
++
++#~ msgid "Local Domain"
++#~ msgstr "Lokale Domain"
++
++#~ msgid "Local Network"
++#~ msgstr "Lokales Netz"
++
++#~ msgid "Local Server"
++#~ msgstr "Lokale Server"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "Netzwerk-Boot Abbild"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr "Netzkennung (ESSID)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "Anzahl vergebener Adressen"
++
++#~ msgid "Perform Actions"
++#~ msgstr "Aktionen ausführen"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "Unterbindet Client-Client-Verkehr"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "Anbieten (Access Point)"
++
++#~ msgid "Resolvfile"
++#~ msgstr "Resolvdatei"
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "TFTP-Server Wurzelverzeichnis"
++
++#~ msgid "TX / RX"
++#~ msgstr "TX / RX"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "Die folgenden Änderungen wurden übernommen"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "Die folgenden Dateien und Verzeichnisse werden beim Aktualisieren der "
++#~ "Firmware über die Oberfläche automatisch in die neue Firmware übernommen."
++
++#~ msgid "Wireless Scan"
++#~ msgstr "WLAN-Scan"
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "Mit <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "können Netzwerkteilnehmer automatisch Einstellungen wie <abbr title="
++#~ "\"Internet Protocol\">IP</abbr>-Adresse, Präfix, <abbr title=\"Domain "
++#~ "Name System\">DNS</abbr>-Server, usw. beziehen."
++
++#~ msgid ""
++#~ "You are about to join the wireless network <em><strong>%s</strong></em>. "
++#~ "In order to complete the process, you need to provide some additional "
++#~ "details."
++#~ msgstr ""
++#~ "Sie sind dabei dem Drahtlosnetzwerk <em><strong>%s</strong></em> "
++#~ "beizutreten.Um den Prozess zu beenden müssen einige weitere Angaben "
++#~ "gemacht werden."
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "Pro WLAN-Gerät können mehrere Netze bereitgestellt werden. Es sollte "
++#~ "beachtet werden, dass es hardware- / treiberspezifische Einschränkungen "
++#~ "gibt. So kann pro WLAN-Gerät in der Regel entweder 1 Ad-Hoc-Zugang ODER "
++#~ "bis zu 3 Access-Point und 1 Client-Zugang gleichzeitig erstellt werden."
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "Für die Unterstützung von PPPoE muss \"ppp-mod-pppoe\" und für PPtP \"pptp"
++#~ "\" installiert sein"
++
++#~ msgid ""
++#~ "You need to install <a href='%s'><em>wpa-supplicant</em></a> to use WPA!"
++#~ msgstr ""
++#~ "Sie müssen <a href='%s'><em>wpa-supplicant</em></a> isntallieren um WPA "
++#~ "nutzen zu können!"
++
++#~ msgid ""
++#~ "You need to install the <a href='%s'>Broadcom <em>nas</em> supplicant</a> "
++#~ "to use WPA!"
++#~ msgstr ""
++#~ "Sie müssen den <a href='%s'>Broadcom <em>nas</em> Supplikaten "
++#~ "installieren um WPA nutzen zu können!"
++
++#~ msgid "Zone"
++#~ msgstr "Zone"
++
++#~ msgid "additional hostfile"
++#~ msgstr "Zusätzliche Hostdatei"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr ""
++#~ "Fügt Domainnamen zu einfachen Hosteinträgen in der Resolvdatei hinzu"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "automatisch neu verbinden"
++
++#~ msgid "concurrent queries"
++#~ msgstr "gleichzeitige Abfragen"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr "DHCP für dieses Netzwerk deaktivieren"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "trennen bei Inaktivität nach"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "Unbekannte nicht cachen"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr "nutzlose DNS-Anfragen aktueller Windowssysteme filtern"
++
++#~ msgid "installed"
++#~ msgstr "installiert"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr ""
++#~ "Gibt die Adresse eines Hostnamen entsprechend seines Subnetzes zurück"
++
++#~ msgid "manual"
++#~ msgstr "manuell"
++
++#~ msgid "not installed"
++#~ msgstr "nicht installiert"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr "Negative DNS-Antworten nicht zwischenspeichern"
++
++#~ msgid "query port"
++#~ msgstr "Abfrageport"
++
++#~ msgid "transmitted / received"
++#~ msgstr "gesendet / empfangen"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "verbundene Netzwerke"
++
++#~ msgid "all"
++#~ msgstr "alle"
++
++#~ msgid "Code"
++#~ msgstr "Code"
++
++#~ msgid "Distance"
++#~ msgstr "Distanz"
++
++#~ msgid "Legend"
++#~ msgstr "Legende"
++
++#~ msgid "Library"
++#~ msgstr "Bibliothek"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "siehe &#39;%s&#39; manpage"
++
++#~ msgid "Package Manager"
++#~ msgstr "Packet-Manager"
++
++#~ msgid "Service"
++#~ msgstr "Dienst"
++
++#~ msgid "Statistics"
++#~ msgstr "Statistiken"
++
++#~ msgid "zone"
++#~ msgstr "Zone"
+diff --git a/feeds/luci/modules/luci-base/po/el/base.po b/feeds/luci/modules/luci-base/po/el/base.po
+new file mode 100644
+index 0000000..8d96a7a
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/el/base.po
+@@ -0,0 +1,4127 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2012-03-31 15:35+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(παÏάθυÏο %d λεπτών, διάστημα %d δευτεÏολέπτων)"
++
++msgid "(%s available)"
++msgstr "(%s διαθέσιμα)"
++
++msgid "(empty)"
++msgstr "(κενό)"
++
++msgid "(no interfaces attached)"
++msgstr "(χωÏίς Ï€ÏοσαÏτημένες διεπαφές)"
++
++msgid "-- Additional Field --"
++msgstr "-- Επιπλέον Πεδίο --"
++
++msgid "-- Please choose --"
++msgstr "-- ΠαÏακαλώ επιλέξτε --"
++
++msgid "-- custom --"
++msgstr "-- Ï€ÏοσαÏμοσμένο --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "ΦοÏτίο 1 λεπτοÏ:"
++
++msgid "15 Minute Load:"
++msgstr "ΦοÏτίο 15 λεπτών:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "ΦοÏτίο 5 λεπτών:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "ΘÏÏα εÏωτημάτων <abbr title=\"ΣÏστημα Ονόματος Τομέα\">DNS</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "ΘÏÏα εξυπηÏετητή <abbr title=\"ΣÏστημα Ονόματος Τομέα\">DNS</abbr>"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"Οι <abbr title=\"ΣÏστημα Ονόματος Τομέα\">DNS</abbr> εξυπηÏετητές θα "
++"εÏωτηθοÏν με την σειÏά εμφάνισης στο αÏχείο resolvfile"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "ΔιεÏθυνση <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "ΠÏλη <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "Μάσκα <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"ΔιεÏθυνση <abbr title=\"Internet Protocol Version 6\">IPv6</abbr> ή Δίκτυο "
++"(CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "ΠÏλη <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "ΠαÏαμετÏοποίηση <abbr title=\"Light Emitting Diode\">LED</abbr>"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "Όνομα <abbr title=\"Light Emitting Diode\">LED</abbr>"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "ΔιεÏθυνση <abbr title=\"Media Access Control\">MAC</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"<abbr title=\"μέγιστο\">Μεγ.</abbr> πλήθος <abbr title=\"ΠÏωτόκολλο "
++"ΠαÏαμετÏοποίησης Î”Ï…Î½Î±Î¼Î¹ÎºÎ¿Ï Î£Ï…ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚\">DHCP</abbr> leases"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"<abbr title=\"μέγιστο\">Μεγ.</abbr> μέγεθος πακέτου <abbr title=\"Μηχανισμοί "
++"επεκτάσεων για Συστήματα Ονόματος Τομέα\">EDNS0</abbr>"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"μέγιστο\">Μεγ.</abbr> πλήθος ταυτόχÏονων εÏωτηματων"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr ""
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "ΥποστήÏιξη AR"
++
++msgid "ARP retry threshold"
++msgstr "ÎŒÏιο επαναδοκιμών ARP"
++
++msgid "ATM Bridges"
++msgstr "ΓέφυÏες ΑΤΜ"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "ATM Εικονικό Κανάλι ΑναγνωÏιστή (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "ATM Εικονικό μονοπάτι ΑναγνωÏιστή (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"Οι γέφυÏες ATM αποκαλÏπτουν ενθυλακωμένες ethernet σε συνδέσεις AAL5 σαν "
++"εικονικές διεπαφές δικτÏου Linux, οι οποίες μποÏοÏν να χÏησιμοποιηθοÏν σε "
++"συνδυασμό με DHCP ή PPP για την κλήση Ï€Ïος τον παÏοχέα δικτÏου."
++
++msgid "ATM device number"
++msgstr "ΑÏιθμός συσκευής ATM"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "ΣυγκεντÏωτής ΠÏόσβασης "
++
++msgid "Access Point"
++msgstr "Σημείο ΠÏόσβασης"
++
++msgid "Action"
++msgstr "ΕνέÏγεια"
++
++msgid "Actions"
++msgstr "ΕνέÏγειες"
++
++msgid "Activate this network"
++msgstr "ΕνεÏγοποίηση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… δικτÏου"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++"ΕνεÏγές ΔιαδÏομές <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++"ΕνεÏγές ΔιαδÏομές <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++msgid "Active Connections"
++msgstr "ΕνεÏγές Συνδέσεις"
++
++msgid "Active DHCP Leases"
++msgstr ""
++
++msgid "Active DHCPv6 Leases"
++msgstr ""
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "ΠÏοσθήκη"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++"ΠÏοσθήκη κατάληξης Ï„Î¿Ï€Î¹ÎºÎ¿Ï Ï„Î¿Î¼Î­Î± για ονόματα εξυπηÏετοÏμενα από αÏχεία hosts "
++
++msgid "Add new interface..."
++msgstr "ΠÏοσθήκη νέας διεπαφής..."
++
++msgid "Additional Hosts files"
++msgstr "Επιπλέον αÏχεία Hosts"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "ΔιεÏθυνση"
++
++msgid "Address to access local relay bridge"
++msgstr "ΔιεÏθυνση για Ï€Ïόσβαση σε την τοπική γέφυÏα αναμετάδοσης"
++
++msgid "Administration"
++msgstr "ΔιαχείÏιση"
++
++msgid "Advanced Settings"
++msgstr "ΠÏοχωÏημένες Ρυθμίσεις"
++
++msgid "Alert"
++msgstr "Ειδοποίηση"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"ΕπιτÏέπει την εξουσιοδότηση <abbr title=\"Secure Shell\">SSH</abbr> με "
++"κωδικό Ï€Ïόσβασης"
++
++msgid "Allow all except listed"
++msgstr "Îα επιτÏέπονται όλες, εκτός από αυτές στη λίστα"
++
++msgid "Allow listed only"
++msgstr "Îα επιτÏέπονται μόνο αυτές στην λίστα"
++
++msgid "Allow localhost"
++msgstr "Îα επιτÏέπεται το localhost"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"Îα επιτÏέπεται σε απομακÏυσμένα συστήματα να συνδέονται σε τοπικά "
++"Ï€Ïοωθημένες SSH θÏÏες"
++
++msgid "Allow root logins with password"
++msgstr "Îα επιτÏέπονται root συνδέσεις με κωδικό Ï€Ïόσβασης"
++
++msgid "Allow the <em>root</em> user to login with password"
++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, "
++"Ï€.χ. για υπηÏεσίες RBL"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "Ένα επιπλέον δίκτυο θα δημιουÏγηθεί εάν αυτό αφεθεί κενό"
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "ΚεÏαία 1"
++
++msgid "Antenna 2"
++msgstr "ΚεÏαία 2"
++
++msgid "Antenna Configuration"
++msgstr ""
++
++msgid "Any zone"
++msgstr "Οιαδήποτε ζώνη"
++
++msgid "Apply"
++msgstr "ΕφαÏμογή"
++
++msgid "Applying changes"
++msgstr "ΕφαÏμογή αλλαγών"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr ""
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Συνδεδεμένοι Σταθμοί"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Εξουσιοδότηση"
++
++msgid "Authoritative"
++msgstr "ΚÏÏιος"
++
++msgid "Authorization Required"
++msgstr "Απαιτείται Εξουσιοδότηση"
++
++msgid "Auto Refresh"
++msgstr "Αυτόματη Ανανέωση"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Διαθέσιμο"
++
++msgid "Available packages"
++msgstr "Διαθέσιμα πακέτα"
++
++msgid "Average:"
++msgstr "Μέσος ÎŒÏος:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Πίσω"
++
++msgid "Back to Overview"
++msgstr "Πίσω Ï€Ïος Επισκόπηση"
++
++msgid "Back to configuration"
++msgstr "Πίσω Ï€Ïος παÏαμετÏοποίηση"
++
++msgid "Back to overview"
++msgstr "Πίσω Ï€Ïος επισκόπηση"
++
++msgid "Back to scan results"
++msgstr "Πίσω στα αποτελέσματα σάÏωσης"
++
++msgid "Background Scan"
++msgstr "ΣάÏωση ΠαÏασκηνίου"
++
++msgid "Backup / Flash Firmware"
++msgstr "ΑντίγÏαφο ασφαλείας / ΕγγÏαφή FLASH Υλικολογισμικό"
++
++msgid "Backup / Restore"
++msgstr "Αποθήκευση / ΕπαναφοÏά ΑντίγÏαφου Ασφαλείας"
++
++msgid "Backup file list"
++msgstr "Λίστα αÏχείων για αντίγÏαφο ασφαλείας"
++
++#, fuzzy
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"ΠαÏακάτω είναι η Ï€ÏοκαθοÏισμένη λίστα αÏχείων για αντιγÏαφή ασφαλείας. "
++"Αποτελείτε από αλλαγμένα αÏχεία παÏαμετÏοποίησης σημαδεμένα από το opkg, "
++"ουσιώδη βασικά αÏχεία καθώς και καθοÏισμένα από το χÏήστη μοτίβα αντιγÏάφων "
++"ασφαλείας."
++
++msgid "Bitrate"
++msgstr "Ρυθμός δεδομένων"
++
++msgid "Bogus NX Domain Override"
++msgstr "ΠαÏάκαμψη ΨευδοÏÏ‚ Τομέα NX"
++
++msgid "Bridge"
++msgstr "ΓέφυÏα"
++
++msgid "Bridge interfaces"
++msgstr "ΓεφÏÏωμα διεπαφών"
++
++msgid "Bridge unit number"
++msgstr "ΑÏιθμός μονάδας γέφυÏας"
++
++msgid "Bring up on boot"
++msgstr "Ανέβασμα κατά την εκκίνηση"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr ""
++
++msgid "Buffered"
++msgstr ""
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Κουμπιά"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr ""
++
++msgid "CPU usage (%)"
++msgstr "ΧÏήση CPU (%)"
++
++msgid "Cancel"
++msgstr "ΑκÏÏωση"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Αλυσίδα"
++
++msgid "Changes"
++msgstr "Αλλαγές"
++
++msgid "Changes applied."
++msgstr "Αλλαγές εφαÏμόστηκαν."
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "Αλλάζει τον κωδικό διαχειÏιστή για Ï€Ïόσβαση στη συσκευή"
++
++msgid "Channel"
++msgstr "Κανάλι"
++
++msgid "Check"
++msgstr "Έλεγχος"
++
++msgid "Checksum"
++msgstr "ΆθÏοισμα Ελέγχου"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Επιλέξατε την ζώνη τείχους Ï€Ïοστασίας που επιθυμητέ να αναθέσετε σε αυτήν "
++"την διεπαφή. Επιλέξτε <em>απÏοσδιόÏιστο</em> για να αφαιÏέσετε την διεπαφή "
++"από την συσχετισμένη ζώνη ή συμπληÏώστε το <em>δημιουÏγία</em> πεδίο για να "
++"Ï€ÏοσδιοÏίσετε μία νέα ζώνη και να Ï€ÏοσαÏτήσετε την διεπαφή σε αυτό."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++
++msgid "Cipher"
++msgstr ""
++
++msgid ""
++"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)."
++msgstr ""
++"Κλικ στο \"ΔημιουÏγία αÏχείου\" για να κατεβάσετε ένα tar αÏχείο με τα "
++"Ï„Ïέχοντα αÏχεία παÏαμετÏοποίησης. Για να επαναφέÏετε το υλικολογισμικό στην "
++"αÏχική του κατάσταση, κάντε κλικ στο \"Εκτέλεσε επαναφοÏά\" (δυνατό μόνο σε "
++"squashfs εικόνες)."
++
++msgid "Client"
++msgstr "Πελάτης"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "ΑναγνωÏιστικό πελάτη που αποστέλλετε κατά την αίτηση DHCP"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Κλείσιμο, μη ενεÏγών συνδέσεων μετά το πέÏας του οÏισμένου αÏÎ¹Î¸Î¼Î¿Ï "
++"δευτεÏολέπτων, χÏησιμοποιήστε 0 για να εξακολουθοÏν να υφίστανται επ' "
++"αόÏιστον"
++
++msgid "Close list..."
++msgstr "Κλείσιμο λίστας..."
++
++msgid "Collecting data..."
++msgstr "Συλλογή δεδομένων..."
++
++msgid "Command"
++msgstr "Εντολή"
++
++msgid "Common Configuration"
++msgstr "Κοινή ΠαÏαμετÏοποίηση"
++
++msgid "Compression"
++msgstr "Συμπίεση"
++
++msgid "Configuration"
++msgstr "ΠαÏαμετÏοποίηση"
++
++msgid "Configuration applied."
++msgstr "Η ΠαÏαμετÏοποίηση εφαÏμόστηκε."
++
++msgid "Configuration files will be kept."
++msgstr "Τα αÏχεία παÏαμετÏοποίησης θα διατηÏηθοÏν."
++
++msgid "Confirmation"
++msgstr "Επιβεβαίωση"
++
++msgid "Connect"
++msgstr "ΣÏνδεση"
++
++msgid "Connected"
++msgstr "Συνδεδεμένος"
++
++msgid "Connection Limit"
++msgstr "ÎŒÏιο Συνδέσεων"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr "Συνδέσεις"
++
++msgid "Country"
++msgstr "ΧώÏα"
++
++msgid "Country Code"
++msgstr "Κωδικός ΧώÏας"
++
++msgid "Cover the following interface"
++msgstr "Κάλυψη της ακόλουθης διεπαφής"
++
++msgid "Cover the following interfaces"
++msgstr "Κάλυψη των ακόλουθων διεπαφών"
++
++msgid "Create / Assign firewall-zone"
++msgstr "ΔημιουÏγία / Ανάθεση ζώνης τείχους Ï€Ïοστασίας"
++
++msgid "Create Interface"
++msgstr "ΔημιουÏγία Διεπαφής"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr ""
++
++msgid "Critical"
++msgstr ""
++
++msgid "Cron Log Level"
++msgstr "Επίπεδο ΚαταγÏαφής Cron"
++
++msgid "Custom Interface"
++msgstr ""
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Ρυθμίζει, αν είναι δυνατόν, την συμπεÏιφοÏά των <abbr title=\"Light Emitting "
++"Diode\">LED</abbr> της συσκευής."
++
++msgid "DHCP Leases"
++msgstr "DHCP Leases"
++
++msgid "DHCP Server"
++msgstr "ΕξυπηÏετητής DHCP"
++
++msgid "DHCP and DNS"
++msgstr "DHCP και DNS"
++
++msgid "DHCP client"
++msgstr "Πελάτης DHCP"
++
++msgid "DHCP-Options"
++msgstr "Επιλογές DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr ""
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "ΠÏοωθήσεις DNS"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr ""
++
++msgid "Debug"
++msgstr "Αποσφαλμάτωση"
++
++msgid "Default %d"
++msgstr "ΠÏοεπιλογή %d"
++
++msgid "Default gateway"
++msgstr "ΠÏοεπιλεγμένη Ï€Ïλη"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "ΠÏοεπιλεγμένη κατάσταση"
++
++msgid "Define a name for this network."
++msgstr "ΟÏίστε ένα όνομα για αυτό το δίκτυο."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"ΟÏίστε επιπλέον επιλογές DHCP, που διαφημίζουν διαφοÏετικοÏÏ‚ εξυπηÏετητές "
++"DNS στους πελάτες, για παÏάδειγμα \"<code>6,192.168.2.1,192.168.2.2</code>\"."
++
++msgid "Delete"
++msgstr "ΔιαγÏαφή"
++
++msgid "Delete this interface"
++msgstr "ΔιαγÏαφή αυτής της διεπαφής"
++
++msgid "Delete this network"
++msgstr "ΔιαγÏαφή Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… δικτÏου"
++
++msgid "Description"
++msgstr "ΠεÏιγÏαφή"
++
++msgid "Design"
++msgstr "Εμφάνιση"
++
++msgid "Destination"
++msgstr "ΠÏοοÏισμός"
++
++msgid "Device"
++msgstr "Συσκευή"
++
++msgid "Device Configuration"
++msgstr "ΠαÏαμετÏοποίηση Συσκευής"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Διαγνωστικά"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Κατάλογος"
++
++msgid "Disable"
++msgstr "ΑπενεÏγοποίηση"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"ΑπενεÏγοποίηση <abbr title=\"ΠÏωτόκολλο Δυναμικής Απόδοσης ΔιεÏθυνσης"
++"\">DHCP</abbr> για αυτή τη διεπαφή."
++
++msgid "Disable DNS setup"
++msgstr "ΑπενεÏγοποίηση Ïυθμίσεων DNS"
++
++msgid "Disable HW-Beacon timer"
++msgstr "ΑπενεÏγοποίηση χÏονιστή HW-Beacon"
++
++msgid "Disabled"
++msgstr "ΑπενεÏγοποιημένο"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Αγνόησε τις απαντήσεις ανοδικής Ïοής RFC1918"
++
++msgid "Displaying only packages containing"
++msgstr "Εμφάνιση μόνο πακέτων που πεÏιέχουν"
++
++msgid "Distance Optimization"
++msgstr "Βελτιστοποίηση Απόστασης"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Απόσταση σε μέτÏα από το πιο απομακÏυσμένο μέλος του δικτÏου."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "ΔιαφοÏική Λήψη"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Ο Dnsmasq είναι ένας συνδυασμός εξυπηÏετητή <abbr title=\"ΠÏωτόκολλο "
++"Δυναμικής Απόδοσης ΠαÏαμέτÏων Συστήματος\">DHCP</abbr> και Ï€Ïοωθητή<abbr "
++"title=\"ΣÏστημα Ονόματος Τομέα\">DNS</abbr> για τείχη Ï€Ïοστασίας <abbr title="
++"\"ΜεταφÏαστή ΔιεÏθυνσης ΔικτÏου\">NAT</abbr>"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 ""
++
++msgid "Do not send probe responses"
++msgstr "Îα μην στέλνονται απαντήσεις σε probes"
++
++msgid "Domain required"
++msgstr "Απαίτηση για όνομα τομέα"
++
++msgid "Domain whitelist"
++msgstr "Λευκή λίστα τομέων"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Îα μην Ï€ÏοωθοÏνται εÏωτήματα <abbr title=\"Domain Name System\">DNS</abbr> "
++"χωÏίς όνομα τομέα <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid "Download and install package"
++msgstr "Κατέβασμα και εγκατάσταση πακέτου"
++
++msgid "Download backup"
++msgstr "Κατέβασμα αντιγÏάφου ασφαλείας"
++
++msgid "Dropbear Instance"
++msgstr ""
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Το Dropbear Ï€ÏοσφέÏει Ï€Ïόσβαση σε <abbr title=\"Secure Shell\">SSH</abbr> "
++"κέλυφος μέσω δικτÏου και έναν ενσωματωμένο εξυπηÏετητή <abbr title=\"Secure "
++"Copy\">SCP</abbr>"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"Δυναμικό <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++
++msgid "Dynamic tunnel"
++msgstr "Δυναμικό τοÏνελ"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"Δυναμική απόδοση DHCP διευθÏνσεων στους πελάτες. Σε πεÏίπτωση "
++"απενεÏγοποίησης, μόνο πελάτες με στατικα leases θα εξυπηÏετοÏνται."
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "Μέθοδος EAP"
++
++msgid "Edit"
++msgstr "ΕπεξεÏγασία"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "ΕπεξεÏγασία αυτής της διεπαφής"
++
++msgid "Edit this network"
++msgstr "ΕπεξεÏγασία Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… δικτÏου"
++
++msgid "Emergency"
++msgstr "Έκτακτη ανάγκη"
++
++msgid "Enable"
++msgstr "ΕνεÏγοποίηση"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "ΕνεÏγοποίηση <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "ΕνεÏγοποίηση ενημέÏωσης Î´Ï…Î½Î±Î¼Î¹ÎºÎ¿Ï Ï„ÎµÏÎ¼Î±Ï„Î¹ÎºÎ¿Ï ÏƒÎ·Î¼ÎµÎ¯Î¿Ï… HE.net."
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "ΕνεÏγοποίηση διέλευσης Jumbo Frame"
++
++msgid "Enable NTP client"
++msgstr ""
++
++msgid "Enable TFTP server"
++msgstr "ΕνεÏγοποίηση εξυπηÏετητή TFTP"
++
++msgid "Enable VLAN functionality"
++msgstr "ΕνεÏγοποίηση λειτουÏγίας VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "ΈνεÏγοποίηση learning and aging"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "ΕνεÏγοποίηση αυτής της Ï€ÏοσάÏτησης"
++
++msgid "Enable this swap"
++msgstr "ΕνεÏγοποίηση αυτής της swap"
++
++msgid "Enable/Disable"
++msgstr "ΕνεÏγοποίηση/ΑπενεÏγοποίηση"
++
++msgid "Enabled"
++msgstr "ΕνεÏγοποιημένο"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr ""
++
++msgid "Encapsulation mode"
++msgstr "ΛειτουÏγία ενθυλάκωσης"
++
++msgid "Encryption"
++msgstr "ΚÏυπτογÏάφηση"
++
++msgid "Erasing..."
++msgstr "ΔιαγÏάφεται..."
++
++msgid "Error"
++msgstr "Σφάλμα"
++
++msgid "Ethernet Adapter"
++msgstr "ΠÏοσαÏμογέας Ethernet"
++
++msgid "Ethernet Switch"
++msgstr "Ethernet Switch"
++
++msgid "Expand hosts"
++msgstr ""
++
++msgid "Expires"
++msgstr "Λήγει"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++"Ο ελάχιστος χÏόνος λήξεως των διευθÏνσεων lease είναι 2 λεπτά (<code>2m</"
++"code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "ΕξωτεÏικός εξυπηÏετητής καταγÏαφής συστήματος"
++
++msgid "External system log server port"
++msgstr ""
++
++msgid "Fast Frames"
++msgstr "ΓÏήγοÏα Πλαίσια"
++
++msgid "File"
++msgstr "ΑÏχείο"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Όνομα αÏχείου της εικόνας εκκίνησης που διαφημίζετε στους πελάτες"
++
++msgid "Filesystem"
++msgstr "ΣÏστημα ΑÏχείων"
++
++msgid "Filter"
++msgstr "ΦίλτÏο"
++
++msgid "Filter private"
++msgstr "ΦιλτÏάÏισμα ιδιωτικών"
++
++msgid "Filter useless"
++msgstr "ΦιλτÏάÏισμα άχÏηστων"
++
++msgid "Find and join network"
++msgstr "ΕÏÏεση και σÏνδεση σε δίκτυο"
++
++msgid "Find package"
++msgstr "ΕÏÏεση πακέτου"
++
++msgid "Finish"
++msgstr "Τέλος"
++
++msgid "Firewall"
++msgstr "Τείχος ΠÏοστασίας"
++
++msgid "Firewall Settings"
++msgstr "Ρυθμίσεις Τείχους ΠÏοστασίας"
++
++msgid "Firewall Status"
++msgstr "Κατάσταση Τείχους ΠÏοστασίας"
++
++msgid "Firmware Version"
++msgstr "Έκδοση ΥλικολογισμικοÏ"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr ""
++
++msgid "Flags"
++msgstr "Σημαίες"
++
++msgid "Flash Firmware"
++msgstr "ΦλασάÏισμα Firmware"
++
++msgid "Flash image..."
++msgstr "ΦλασάÏισμα εικόνας..."
++
++msgid "Flash new firmware image"
++msgstr "ΦλασάÏισμα νέας εικόνας υλικολογισμικοÏ"
++
++msgid "Flash operations"
++msgstr "ΛειτουÏγίες φλασάÏισματος"
++
++msgid "Flashing..."
++msgstr "ΦλασάÏεται..."
++
++msgid "Force"
++msgstr "Επιβολή"
++
++msgid "Force CCMP (AES)"
++msgstr "Επιβολή CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++"Επιβολή DHCP σε αυτό το δίκτυο ακόμα κι αν έχει εντοπιστεί άλλος εξυπηÏετητής"
++
++msgid "Force TKIP"
++msgstr "Επιβολή TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "Επιβολή TKIP και CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "ΠÏοώθηση κίνησης DHCP"
++
++msgid "Forward broadcast traffic"
++msgstr "ΠÏοώθηση κίνησης broadcast"
++
++msgid "Forwarding mode"
++msgstr "Μέθοδος Ï€Ïοώθησης"
++
++msgid "Fragmentation Threshold"
++msgstr "ÎŒÏιο ΚατακεϵατισµοÏ"
++
++msgid "Frame Bursting"
++msgstr "Bursting Πλαισίων"
++
++msgid "Free"
++msgstr ""
++
++msgid "Free space"
++msgstr "ΕλεÏθεÏος χώÏος"
++
++msgid "GHz"
++msgstr ""
++
++msgid "GPRS only"
++msgstr ""
++
++msgid "Gateway"
++msgstr "ΠÏλη"
++
++msgid "Gateway ports"
++msgstr "ΘÏÏες Ï€Ïλης"
++
++msgid "General Settings"
++msgstr "Γενικές Ρυθμίσεις"
++
++msgid "General Setup"
++msgstr ""
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr ""
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr "Μετάβαση στη σχετική σελίδα Ïυθμίσεων"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr ""
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr ""
++
++msgid "Hang Up"
++msgstr "ΚÏέμασμα"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Εδώ μποÏείτε να παÏαμετÏοποιήσετε βασικές πλευÏές της συσκευής σας όπως το "
++"όνομα υπολογιστή ή τη ζώνη ÏŽÏας."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "ΚÏυφό <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "ΚαταχωÏήσεις Υπολογιστών"
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++"<abbr title=\"Internet Protocol Address\">IP</abbr> Υπολογιστή ή ΔικτÏου"
++
++msgid "Hostname"
++msgstr "Όνομα Υπολογιστή"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr ""
++
++msgid "Hostnames"
++msgstr "Ονόματα Υπολογιστών"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "ΔιεÏθυνση IP"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "IPv4 Τείχος ΠÏοστασίας"
++
++msgid "IPv4 WAN Status"
++msgstr ""
++
++msgid "IPv4 address"
++msgstr "ΔιεÏθυνση IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 και IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid "IPv4 gateway"
++msgstr "ΠÏλη IPv4"
++
++msgid "IPv4 netmask"
++msgstr "Μάσκα IPv4"
++
++msgid "IPv4 only"
++msgstr "Μόνο IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr "IPv4-ΔιεÏθυνση"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "IPv6 Τείχος ΠÏοστασίας"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "Κατάσταση IPv6 WAN"
++
++msgid "IPv6 address"
++msgstr "ΔιεÏθυνση IPv6"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "ΠÏλη IPv6"
++
++msgid "IPv6 only"
++msgstr "Μόνο IPv6"
++
++msgid "IPv6 prefix"
++msgstr ""
++
++msgid "IPv6 prefix length"
++msgstr ""
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-in-IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr ""
++
++msgid "Identity"
++msgstr "Ταυτότητα"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++"Αν οÏιστεί, Ï€ÏοσάÏτησε τη συσκευή με βάση το UUID της αντί για το "
++"καθοÏισμένο όνομα της"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++"Αν οÏιστεί, Ï€ÏοσάÏτησε τη συσκευή με βάση την ετικέτα της αντί για το "
++"καθοÏισμένο όνομα της"
++
++msgid "If unchecked, no default route is configured"
++msgstr ""
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Αν η φυσική μνήμη δεν είναι αÏκετή, μη-χÏησιμοποιοÏμενα δεδομένα μποÏοÏν "
++"Ï€ÏοσωÏινά να εναλλάσσονται σε μία συσκευή swap με αποτέλεσμα πεÏισσότεÏη "
++"ενεÏγή <abbr title=\"Random Access Memory\">RAM</abbr>. Η εναλλαγή δεδομένων "
++"είναι μία Ï€Î¿Î»Ï Î±Ïγή διαδικασία Î±Ï†Î¿Ï Î· συσκευή swap δεν μποÏεί να "
++"Ï€Ïοσπελαστεί με τους υψηλοÏÏ‚ ÏυθμοÏÏ‚ μεταφοÏάς δεδομένων που διαθέτει η "
++"<abbr title=\"Random Access Memory\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Αγνόησε <code>/etc/hosts</code>"
++
++msgid "Ignore interface"
++msgstr "Αγνόησε διεπαφή"
++
++msgid "Ignore resolve file"
++msgstr "Αγνόησε αÏχείο resolve"
++
++msgid "Image"
++msgstr ""
++
++msgid "In"
++msgstr "Είσοδος"
++
++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 ""
++
++msgid "Inbound:"
++msgstr ""
++
++msgid "Info"
++msgstr "ΠληÏοφοÏίες"
++
++msgid "Initscript"
++msgstr "ΣενάÏιο εκκίνησης"
++
++msgid "Initscripts"
++msgstr "ΣενάÏια Εκκίνησης"
++
++msgid "Install"
++msgstr "Εγκατάσταση"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Εγκατάσταση πακέτου %q"
++
++msgid "Install protocol extensions..."
++msgstr "Εγκατάσταση επεκτάσεων Ï€Ïωτοκόλλου..."
++
++msgid "Installed packages"
++msgstr "Εγκατεστημένα πακέτα"
++
++msgid "Interface"
++msgstr "Διεπαφή"
++
++msgid "Interface Configuration"
++msgstr "ΠαÏαμετÏοποίηση Διεπαφής"
++
++msgid "Interface Overview"
++msgstr "Επισκόπηση Διεπαφής"
++
++msgid "Interface is reconnecting..."
++msgstr "Η διεπαφή επανασυνδέεται..."
++
++msgid "Interface is shutting down..."
++msgstr "Η διεπαφή απενεÏγοποιείται..."
++
++msgid "Interface not present or not connected yet."
++msgstr "Η διεπαφή δεν υπάÏχει ή δεν έχει συνδεθεί ακόμη."
++
++msgid "Interface reconnected"
++msgstr "Η διεπαφή επανασυνδέθηκε"
++
++msgid "Interface shut down"
++msgstr "Η διεπαφή απενεÏγοποιήθηκε"
++
++msgid "Interfaces"
++msgstr "Διεπαφές"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr ""
++
++msgid "Invalid"
++msgstr "ΆκυÏη τιμή εισόδου"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++
++msgid "Invalid username and/or password! Please try again."
++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 ""
++"Φαίνεται πως Ï€Ïοσπαθείτε να φλασάÏετε μια εικόνα που δεν χωÏάει στην μνήμη "
++"flash, παÏακαλώ επιβεβαιώστε το αÏχείο εικόνας!"
++
++msgid "Java Script required!"
++msgstr "Απαιτείται Javascript!"
++
++msgid "Join Network"
++msgstr ""
++
++msgid "Join Network: Settings"
++msgstr ""
++
++msgid "Join Network: Wireless Scan"
++msgstr ""
++
++msgid "Keep settings"
++msgstr "ΔιατήÏηση Ïυθμίσεων"
++
++msgid "Kernel Log"
++msgstr "ΚαταγÏαφή ΠυÏήνα"
++
++msgid "Kernel Version"
++msgstr "Έκδοση ΠυÏήνα"
++
++msgid "Key"
++msgstr "Κλειδί"
++
++msgid "Key #%d"
++msgstr "Κλειδί #%d"
++
++msgid "Kill"
++msgstr "Σκότωμα"
++
++msgid "L2TP"
++msgstr ""
++
++msgid "L2TP Server"
++msgstr ""
++
++msgid "LCP echo failure threshold"
++msgstr ""
++
++msgid "LCP echo interval"
++msgstr ""
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Ετικέτα"
++
++msgid "Language"
++msgstr "Γλώσσα"
++
++msgid "Language and Style"
++msgstr ""
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Leasefile"
++msgstr "ΑÏχείο Leases"
++
++msgid "Leasetime"
++msgstr "ΧÏόνος Lease"
++
++msgid "Leasetime remaining"
++msgstr "Υπόλοιπο χÏόνου Lease"
++
++msgid "Leave empty to autodetect"
++msgstr "Αφήστε το κενό για να γίνει αυτόματη ανίχνευση"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "Αφήστε το κενό για να γίνει χÏήση της Ï„Ïέχουσας διεÏθυνσης WAN"
++
++msgid "Legend:"
++msgstr "Υπόμνημα:"
++
++msgid "Limit"
++msgstr "ÎŒÏιο"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Αναμμένο με ΖεÏξη"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++
++msgid "Listening port for inbound DNS queries"
++msgstr ""
++
++msgid "Load"
++msgstr "ΦόÏτος"
++
++msgid "Load Average"
++msgstr "Μέσος ÏŒÏος φόÏτου"
++
++msgid "Loading"
++msgstr "ΦόÏτωση"
++
++msgid "Local IPv4 address"
++msgstr "Τοπική διεÏθυνση IPv4"
++
++msgid "Local IPv6 address"
++msgstr "Τοπική διεÏθυνση IPv6"
++
++msgid "Local Startup"
++msgstr ""
++
++msgid "Local Time"
++msgstr "Τοπική ÎÏα"
++
++msgid "Local domain"
++msgstr ""
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr "Τοπικός εξυπηÏετητής"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr "Τοπικά εÏωτήματα"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Επίπεδο εξόδου αÏχείων καταγÏαφής"
++
++msgid "Log queries"
++msgstr "ΚαταγÏαφή εÏωτημάτων"
++
++msgid "Logging"
++msgstr "ΚαταγÏαφή"
++
++msgid "Login"
++msgstr "ΣÏνδεση"
++
++msgid "Logout"
++msgstr "ΑποσÏνδεση"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr "MAC-ΔιεÏθυνση"
++
++msgid "MAC-Address Filter"
++msgstr "ΦίλτÏο MAC ΔιευθÏνσεων"
++
++msgid "MAC-Filter"
++msgstr "MAC-ΦίλτÏο"
++
++msgid "MAC-List"
++msgstr "Λίστα MAC"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr ""
++
++msgid "MHz"
++msgstr ""
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Μέγιστος Ρυθμός"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "Μέγιστος επιτÏεπόμενος αÏιθμός ενεÏγών DHCP leases"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "Μέγιστος επιτÏεπόμενος αÏιθμός ταυτόχÏονων εÏωτημάτων DNS"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "Μέγιστο επιτÏεπόμενο μέγεθος EDNS.0 UDP πακέτων"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++"Μέγιστος αÏιθμός δευτεÏολέπτων αναμονής ώστε το modem να καταστεί έτοιμο"
++
++msgid "Maximum hold time"
++msgstr "Μέγιστος χÏόνος κÏάτησης"
++
++msgid "Maximum number of leased addresses."
++msgstr "Μέγιστος αÏιθμός διευθÏνσεων lease"
++
++msgid "Mbit/s"
++msgstr ""
++
++msgid "Memory"
++msgstr "Μνήμη"
++
++msgid "Memory usage (%)"
++msgstr "ΧÏήση Μνήμης (%)"
++
++msgid "Metric"
++msgstr "ΜέτÏο"
++
++msgid "Minimum Rate"
++msgstr "Ελάχιστος Ρυθμός"
++
++msgid "Minimum hold time"
++msgstr "Ελάχιστος χÏόνος κÏάτησης"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr ""
++
++msgid "Mode"
++msgstr "ΛειτουÏγία"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Συσκευή Modem"
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr "ΠαÏακολοÏθηση"
++
++#, fuzzy
++msgid "Mount Entry"
++msgstr "ΠÏοσάÏτηση"
++
++msgid "Mount Point"
++msgstr "Σημείο ΠÏοσάÏτησης"
++
++msgid "Mount Points"
++msgstr "Σημεία ΠÏοσάÏτησης"
++
++msgid "Mount Points - Mount Entry"
++msgstr "Σημεία ΠÏοσάÏτησης - Είσοδος ΠÏοσάÏτησης"
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Τα σημεία Ï€ÏοσάÏτησης οÏίζουν σε ποιο σημείο στο σÏστημα αÏχείων θα "
++"Ï€ÏοσαÏτηθεί μία συσκευή μνήμης"
++
++msgid "Mount options"
++msgstr "Επιλογές Ï€ÏοσάÏτησης"
++
++msgid "Mount point"
++msgstr "Σημείο Ï€ÏοσάÏτησης"
++
++msgid "Mounted file systems"
++msgstr "ΠÏοσαÏτημένα συστήματα αÏχείων"
++
++msgid "Move down"
++msgstr "Μετακίνηση κάτω"
++
++msgid "Move up"
++msgstr "Μετακίνηση πάνω"
++
++msgid "Multicast Rate"
++msgstr "Ρυθμός Multicast"
++
++msgid "Multicast address"
++msgstr "ΔιεÏθυνση Multicast"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr ""
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Όνομα"
++
++msgid "Name of the new interface"
++msgstr "Όνομα νέας διεπαφής"
++
++msgid "Name of the new network"
++msgstr "Όνομα νέου δικτÏου"
++
++msgid "Navigation"
++msgstr "Πλοήγηση"
++
++msgid "Netmask"
++msgstr "Μάσκα δικτÏου"
++
++msgid "Network"
++msgstr "Δίκτυο"
++
++msgid "Network Utilities"
++msgstr "ΕÏγαλεία ΔικτÏου"
++
++msgid "Network boot image"
++msgstr ""
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr "Επόμενο »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Δεν υπάÏχει Ïυθμισμένος DHCP εξυπηÏετητής για αυτή τη διεπαφή"
++
++msgid "No chains in this table"
++msgstr "Δεν υπάÏχουν αλυσίδες σε αυτόν τον πίνακα"
++
++msgid "No files found"
++msgstr "Δε βÏέθηκαν αÏχεία"
++
++msgid "No information available"
++msgstr "Δεν υπάÏχουν πληÏοφοÏίες διαθέσιμες"
++
++msgid "No negative cache"
++msgstr ""
++
++msgid "No network configured on this device"
++msgstr "Δεν υπάÏχει παÏαμετÏοποιημένο δίκτυο σε αυτή τη συσκευή"
++
++msgid "No network name specified"
++msgstr "Δεν έχει οÏιστεί όνομα δικτÏου"
++
++msgid "No package lists available"
++msgstr "Δεν υπάÏχουν διαθέσιμες λίστες πακέτων"
++
++msgid "No password set!"
++msgstr "Δεν έχει οÏιστεί κωδικός Ï€Ïόσβασης!"
++
++msgid "No rules in this chain"
++msgstr "Δεν υπάÏχει κανόνας σε αυτή την αλυσίδα"
++
++msgid "No zone assigned"
++msgstr "Δεν έχει ανατεθεί ζώνη"
++
++msgid "Noise"
++msgstr "ΘόÏυβος"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "ΘόÏυβος:"
++
++msgid "None"
++msgstr "Κανένα"
++
++msgid "Normal"
++msgstr "Φυσιολογικό"
++
++msgid "Not Found"
++msgstr ""
++
++msgid "Not associated"
++msgstr ""
++
++msgid "Not connected"
++msgstr ""
++
++msgid "Note: Configuration files will be erased."
++msgstr "Σημείωση: Τα αÏχεία παÏαμετÏοποίησης θα διαγÏαφοÏν."
++
++msgid "Notice"
++msgstr "Επισήμανση"
++
++msgid "Nslookup"
++msgstr ""
++
++msgid "OK"
++msgstr "Εντάξει"
++
++msgid "OPKG-Configuration"
++msgstr "ΠαÏαμετÏοποίηση OPKG"
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Σε αυτή τη σελίδα μποÏείτε να Ïυθμίσετε τις διεπαφές δικτÏου. ΜποÏείτε να "
++"γεφυÏώσετε πολλαπλές διεπαφές τικάÏοντας το πεδίο \"γεφÏÏωμα διεπαφών\" και "
++"εισάγοντας τα ονόματα των διεπαφών δικτÏου χωÏισμένα με κενά. ΜποÏείτε "
++"επίσης να χÏησιμοποιήσετε παÏάσταση Ï„Ïπου <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr> <samp>INTERFACE.VLANNR</samp> (<abbr title="
++"\"παÏαδείγματος χάÏιν\">Ï€.χ.</abbr>: <samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++
++msgid "One or more fields contain invalid values!"
++msgstr "Ένα ή πεÏισσότεÏα πεδία πεÏιέχουν μη έγκυÏες τιμές!"
++
++msgid "One or more required fields have no value!"
++msgstr "Ένα ή πεÏισσότεÏα πεδία δεν πεÏιέχουν τιμές!"
++
++msgid "Open list..."
++msgstr ""
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Η επιλογή άλλαξε"
++
++msgid "Option removed"
++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 "Options"
++msgstr "Επιλογές"
++
++msgid "Other:"
++msgstr ""
++
++msgid "Out"
++msgstr "Έξοδος"
++
++msgid "Outbound:"
++msgstr ""
++
++msgid "Outdoor Channels"
++msgstr "ΕξωτεÏικά Κανάλια"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr "Επισκόπηση"
++
++msgid "Owner"
++msgstr "Κάτοχος"
++
++msgid "PAP/CHAP password"
++msgstr ""
++
++msgid "PAP/CHAP username"
++msgstr ""
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "Ενθυλάκωση PPPoA"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "Απαιτείται το πακέτο libiwinfo!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "Οι λίστες πακέτων έχουν να ανανεωθοÏν πάνω από 24 ÏŽÏες"
++
++msgid "Package name"
++msgstr "Όνομα πακέτου"
++
++msgid "Packets"
++msgstr "Πακέτα"
++
++msgid "Part of zone %q"
++msgstr "ΜέÏος της ζώνης %q"
++
++msgid "Password"
++msgstr "Κωδικός ΠÏόσβασης"
++
++msgid "Password authentication"
++msgstr "Εξουσιοδότηση με κωδικό Ï€Ïόσβασης"
++
++msgid "Password of Private Key"
++msgstr "Κωδικός ΠÏόσβασης του Î™Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎšÎ»ÎµÎ¹Î´Î¹Î¿Ï"
++
++msgid "Password successfully changed!"
++msgstr "Ο κωδικός Ï€Ïόσβασης άλλαξε επιτυχώς!"
++
++msgid "Path to CA-Certificate"
++msgstr "ΔιαδÏομή για Πιστοποιητικό CA"
++
++msgid "Path to Client-Certificate"
++msgstr "ΔιαδÏομή για Πιστοποιητικό-Πελάτη"
++
++msgid "Path to Private Key"
++msgstr "ΔιαδÏομή για Ιδιωτικό Κλειδί"
++
++msgid "Path to executable which handles the button event"
++msgstr "ΔιαδÏομή για το εκτελέσιμο που χειÏίζεται το γεγονός του κουμπιοÏ"
++
++msgid "Peak:"
++msgstr ""
++
++msgid "Perform reboot"
++msgstr "Εκτέλεση επανεκκίνησης"
++
++msgid "Perform reset"
++msgstr "ΔιενέÏγεια αÏχικοποίησης"
++
++msgid "Phy Rate:"
++msgstr ""
++
++msgid "Physical Settings"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr "Πκτ."
++
++msgid "Please enter your username and password."
++msgstr "ΠαÏακαλώ εισάγετε όνομα χÏήστη και κωδικό Ï€Ïόσβασης."
++
++msgid "Policy"
++msgstr "Πολιτική"
++
++msgid "Port"
++msgstr "ΘÏÏα"
++
++msgid "Port %d"
++msgstr "ΘÏÏα %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr ""
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++#, fuzzy
++msgid "Prevents client-to-client communication"
++msgstr "ΑποτÏέπει την επικοινωνία Î¼ÎµÏ„Î±Î¾Ï Ï€ÎµÎ»Î±Ï„ÏŽÎ½"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr "Συνέχεια"
++
++msgid "Processes"
++msgstr "ΕÏγασίες"
++
++msgid "Prot."
++msgstr "ΠÏωτ."
++
++msgid "Protocol"
++msgstr "ΠÏωτόκολλο"
++
++msgid "Protocol family"
++msgstr "Οικογένεια Ï€Ïωτοκόλλου"
++
++msgid "Protocol of the new interface"
++msgstr "ΠÏωτόκολλο νέας διεπαφής"
++
++msgid "Protocol support is not installed"
++msgstr "Η υποστήÏιξη Ï€Ïωτοκόλλου δεν έχει εκγατασταθεί"
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Ψευδό Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr ""
++
++msgid "RTS/CTS Threshold"
++msgstr "ÎŒÏιο RTS/CTS"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr ""
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++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 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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr "ΑÏχικοποίηση όλων των αλλαγών;"
++
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr "Αλλαγή Ï€Ïωτοκόλλου;"
++
++msgid "Realtime Connections"
++msgstr "Συνδέσεις Ï€ÏÎ±Î³Î¼Î±Ï„Î¹ÎºÎ¿Ï Ï‡Ïόνου"
++
++msgid "Realtime Graphs"
++msgstr "ΓÏαφήματα Ï€ÏÎ±Î³Î¼Î±Ï„Î¹ÎºÎ¿Ï Ï‡Ïόνου"
++
++msgid "Realtime Load"
++msgstr ""
++
++msgid "Realtime Traffic"
++msgstr "Κίνηση Ï€ÏÎ±Î³Î¼Î±Ï„Î¹ÎºÎ¿Ï Ï‡Ïόνου"
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr "Επανεκκίνηση"
++
++msgid "Rebooting..."
++msgstr "Επανεκκίνηση..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Επανεκκίνηση του λειτουÏÎ³Î¹ÎºÎ¿Ï ÏƒÏ…ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚ της συσκευής σας"
++
++msgid "Receive"
++msgstr "Λήψη"
++
++msgid "Receiver Antenna"
++msgstr "ΚεÏαία Λήψης"
++
++msgid "Reconnect this interface"
++msgstr "ΕπανασÏνδεση της διεπαφής"
++
++msgid "Reconnecting interface"
++msgstr "ΕπανασÏνδεση της διεπαφής"
++
++msgid "References"
++msgstr "ΑναφοÏές"
++
++msgid "Regulatory Domain"
++msgstr "Ρυθμιστική ΠεÏιοχή"
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr "ΑπομακÏυσμένη διεÏθυνση IPv4"
++
++msgid "Remove"
++msgstr "ΑφαίÏεση"
++
++msgid "Repeat scan"
++msgstr "Επανάληψη σάÏωσης"
++
++msgid "Replace entry"
++msgstr "Αντικατάσταση καταχώÏησης"
++
++msgid "Replace wireless configuration"
++msgstr "Αντικατάσταση Ïυθμίσεων ασÏÏματης σÏνδεσης"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++
++msgid "Reset"
++msgstr "ΑÏχικοποίηση"
++
++msgid "Reset Counters"
++msgstr "ΑÏχικοποίηση ΜετÏητών"
++
++msgid "Reset to defaults"
++msgstr "ΑÏχικοποίηση στις Ï€Ïοεπιλεγμένες τιμές"
++
++msgid "Resolv and Hosts Files"
++msgstr "ΑÏχεία Resolv και Hosts"
++
++msgid "Resolve file"
++msgstr "ΑÏχείο Resolve"
++
++msgid "Restart"
++msgstr "Επανεκκίνηση"
++
++msgid "Restart Firewall"
++msgstr "Επανεκκίνηση Τείχους ΠÏοστασίας"
++
++msgid "Restore backup"
++msgstr "ΕπαναφοÏά αντιγÏάφου ασφαλείας"
++
++msgid "Reveal/hide password"
++msgstr ""
++
++msgid "Revert"
++msgstr "ΑναίÏεση"
++
++msgid "Root"
++msgstr "Root"
++
++msgid "Root directory for files served via TFTP"
++msgstr "Κατάλογος Root για αÏχεία που σεÏβίÏονται μέσω TFTP"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Κωδικός ΠÏόσβασης ΔÏομολογητή"
++
++#, fuzzy
++msgid "Routes"
++msgstr "ΔιαδÏομές"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Οι διαδÏομές οÏίζουν τη διεπαφή και Ï€Ïλη από την οποία κάποιος υπολογιστής ή "
++"δίκτυο μποÏεί να είναι Ï€Ïοσβάσιμο/Ï‚."
++
++msgid "Rule #"
++msgstr "Κανόνας #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr "Εκτέλεση ελέγχου του συστήματος αÏχείων Ï€Ïιν Ï€ÏοσαÏτηθεί η συσκευή"
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr "ΠÏόσβαση SSH"
++
++msgid "SSH-Keys"
++msgstr "Κλειδιά SSH"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Αποθήκευση"
++
++msgid "Save & Apply"
++msgstr "Αποθήκευση & ΕφαÏμογή"
++
++msgid "Save &#38; Apply"
++msgstr "Αποθήκευση &#38; ΕφαÏμογή"
++
++msgid "Scan"
++msgstr "ΣάÏωση"
++
++msgid "Scheduled Tasks"
++msgstr "ΠÏογÏαμματισμένες ΕÏγασίες"
++
++msgid "Section added"
++msgstr ""
++
++msgid "Section removed"
++msgstr ""
++
++msgid "See \"mount\" manpage for details"
++msgstr "Δείτε το manpage του \"mount\" για λεπτομέÏειες"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++#, fuzzy
++msgid "Separate Clients"
++msgstr "Απομόνωση Πελατών"
++
++msgid "Separate WDS"
++msgstr "ΞεχωÏιστά WDS"
++
++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 "Όνομα ΥπηÏεσίας"
++
++msgid "Service Type"
++msgstr "Είδος ΥπηÏεσίας"
++
++msgid "Services"
++msgstr "ΥπηÏεσίες"
++
++msgid "Set up Time Synchronization"
++msgstr ""
++
++msgid "Setup DHCP Server"
++msgstr "ΡÏθμιση ΕξυπηÏετητή DHCP"
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr "ΑπενεÏγοποίηση αυτής της διεπαφής"
++
++msgid "Shutdown this network"
++msgstr "ΑπενεÏγοποίηση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… δικτÏου"
++
++msgid "Signal"
++msgstr "Σήμα"
++
++msgid "Signal:"
++msgstr "Σήμα:"
++
++msgid "Size"
++msgstr "Μέγεθος"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "ΠαÏάκαμψη"
++
++msgid "Skip to content"
++msgstr "ΠαÏάκαμψη σε πεÏιεχόμενο"
++
++msgid "Skip to navigation"
++msgstr "ΠαÏάκαμψη σε πλοήγηση"
++
++msgid "Slot time"
++msgstr ""
++
++msgid "Software"
++msgstr "Λογισμικό"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Κάποια πεδία δεν είναι έγκυÏα, δεν μποÏοÏν να αποθηκευτοÏν οι τιμές!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr ""
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr ""
++
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++
++msgid "Sort"
++msgstr "Ταξινόμηση"
++
++msgid "Source"
++msgstr "Πηγή"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++#, fuzzy
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr ""
++"ΠÏοσδιοÏίζει την θÏÏα ακÏόασης Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… στιγμιοτÏπου <em>Dropbear</em>"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr "ΟÏίστε το κÏυφό κλειδί κÏυπτογÏάφησης."
++
++msgid "Start"
++msgstr "ΑÏχή"
++
++msgid "Start priority"
++msgstr "ΠÏοτεÏαιότητα εκκίνησης"
++
++msgid "Startup"
++msgstr "Εκκίνηση"
++
++msgid "Static IPv4 Routes"
++msgstr "Στατικές ΔιαδÏομές IPv4"
++
++msgid "Static IPv6 Routes"
++msgstr "Στατικές ΔιαδÏομές IPv6"
++
++msgid "Static Leases"
++msgstr "Στατικά Leases"
++
++msgid "Static Routes"
++msgstr "Στατικές ΔιαδÏομές"
++
++msgid "Static WDS"
++msgstr ""
++
++msgid "Static address"
++msgstr "Στατική διεÏθυνση"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++
++msgid "Status"
++msgstr "Κατάσταση"
++
++msgid "Stop"
++msgstr ""
++
++msgid "Strict order"
++msgstr "ΑυστηÏή σειÏά"
++
++msgid "Submit"
++msgstr "Υποβολή"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr ""
++
++msgid "Switch"
++msgstr "Switch"
++
++msgid "Switch %q"
++msgstr ""
++
++msgid "Switch %q (%s)"
++msgstr ""
++
++msgid "Switch protocol"
++msgstr ""
++
++msgid "Sync with browser"
++msgstr ""
++
++msgid "Synchronizing..."
++msgstr "ΣυγχÏονισμός..."
++
++msgid "System"
++msgstr "ΣÏστημα"
++
++msgid "System Log"
++msgstr "ΚαταγÏαφή Συστήματος"
++
++msgid "System Properties"
++msgstr "Ιδιότητες Συστήματος"
++
++msgid "System log buffer size"
++msgstr ""
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "Ρυθμίσεις TFTP"
++
++msgid "TFTP server root"
++msgstr ""
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr ""
++
++msgid "Table"
++msgstr "Πίνακας"
++
++msgid "Target"
++msgstr "Στόχος"
++
++msgid "Terminate"
++msgstr "ΤεÏματισμός"
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++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>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"Το αÏχείο συσκευής της μνήμης ή του διαμέÏισματος (<abbr title="
++"\"παÏαδείγματος χάÏην\">Ï€.χ.</abbr> <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 ""
++"Το σÏστημα αÏχείων που χÏησιμοποιήθηκε για διαμόÏφωση (<abbr title="
++"\"παÏαδείγματος χάÏην\">Ï€.χ.</abbr> <samp><abbr title=\"Third Extended "
++"Filesystem\">ext3</abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++
++msgid "The following changes have been committed"
++msgstr "Οι παÏακάτω αλλαγές έχουν υποβληθεί"
++
++msgid "The following changes have been reverted"
++msgstr "Οι παÏακάτω αλλαγές έχουν αναιÏεθεί"
++
++msgid "The following rules are currently active on this system."
++msgstr "Οι παÏακάτω κανόνες είναι αυτή τη στιγμή ενεÏγοί σε αυτό το σÏστημα."
++
++msgid "The given network name is not unique"
++msgstr "Το παÏεχόμενο όνομα δικτÏου δεν είναι μοναδικό"
++
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr ""
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++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."
++msgstr ""
++"Η εικόνα που ανεβάσατε δεν πεÏιέχει κάποια υποστηÏιζόμενη μοÏφή. Βεβαιωθείτε "
++"ότι επιλέξατε την γενική μοÏφή εικόνας για την πλατφόÏμα σας."
++
++msgid "There are no active leases."
++msgstr "Δεν υπάÏχουν ενεÏγά leases."
++
++msgid "There are no pending changes to apply!"
++msgstr ""
++
++msgid "There are no pending changes to revert!"
++msgstr ""
++
++msgid "There are no pending changes!"
++msgstr ""
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Αυτός είναι ο μόνος <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr> στο τοπικό δίκτυο"
++
++msgid "This is the plain username for logging into the account"
++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 ""
++"Αυτό είναι το crontab του συστήματος στο οποίο μποÏοÏν να οÏιστοÏν "
++"Ï€ÏογÏαμματισμένες εÏγασίες."
++
++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 allows the configuration of custom button actions"
++msgstr ""
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++"Αυτή η σελίδα δίνει μία εικόνα για τις Ï„Ïέχουσες ενεÏγές συνδέσεις δικτÏου."
++
++msgid "This section contains no values yet"
++msgstr "Αυτό το τμήμα δεν πεÏιέχει τιμές ακόμη"
++
++msgid "Time Synchronization"
++msgstr ""
++
++msgid "Time Synchronization is not configured yet."
++msgstr ""
++
++msgid "Timezone"
++msgstr "Ζώνη ÏŽÏας"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++
++msgid "Total Available"
++msgstr "Διαθέσιμο Συνολικά"
++
++msgid "Traceroute"
++msgstr ""
++
++msgid "Traffic"
++msgstr "Κίνηση"
++
++msgid "Transfer"
++msgstr "ΜεταφέÏθηκαν"
++
++msgid "Transmission Rate"
++msgstr "Ρυθμός Εκπομπής"
++
++msgid "Transmit"
++msgstr "Εκπομπή"
++
++msgid "Transmit Power"
++msgstr "ΙσχÏÏ‚ Εκπομπής"
++
++msgid "Transmitter Antenna"
++msgstr "ΚεÏαία Εκπομπής"
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr ""
++
++msgid "Tunnel Interface"
++msgstr "Διεπαφή ΤοÏνελ"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "ΛειτουÏγία Turbo"
++
++msgid "Tx-Power"
++msgstr "ΙσχÏÏ‚ Εκπομπής"
++
++msgid "Type"
++msgstr "ΤÏπος"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr ""
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "Συσκευή USB"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr "Άγνωστο"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Άγνωστο Λάθος. ο κωδικός Ï€Ïόσβασης δεν άλλαξε!"
++
++msgid "Unmanaged"
++msgstr ""
++
++msgid "Unsaved Changes"
++msgstr "Μη-αποθηκευμένες Αλλαγές"
++
++msgid "Unsupported protocol type."
++msgstr ""
++
++msgid "Update lists"
++msgstr ""
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr ""
++
++msgid "Uploaded File"
++msgstr "Το ΑÏχείο Ανέβηκε"
++
++msgid "Uptime"
++msgstr "ΧÏόνος εν λειτουÏγία"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "ΧÏήση <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr "ΧÏήση Ï€Ïλης DHCP"
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr ""
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr ""
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr ""
++
++msgid "Use default gateway"
++msgstr "ΧÏήση Ï€Ïοεπιλεγμένης Ï€Ïλης"
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr ""
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr "Σε χÏήση"
++
++msgid "Used Key Slot"
++msgstr "ΧÏησιμοποιοÏμενη Υποδοχή ΚλειδιοÏ"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Όνομα ΧÏήστη"
++
++msgid "VC-Mux"
++msgstr ""
++
++msgid "VLAN Interface"
++msgstr "Διεπαφή VLAN"
++
++msgid "VLANs on %q"
++msgstr ""
++
++msgid "VLANs on %q (%s)"
++msgstr ""
++
++msgid "VPN Server"
++msgstr "ΕξυπηÏετητής VPN"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr "Έκδοση"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr ""
++
++msgid "WEP Shared Key"
++msgstr "ΜοιÏαζόμενο κλειδί WEP"
++
++msgid "WEP passphrase"
++msgstr "Κωδική φÏάση WEP"
++
++msgid "WMM Mode"
++msgstr "ΥποστήÏιξη WMM"
++
++msgid "WPA passphrase"
++msgstr "Κωδική φÏάση WPA"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "ΠÏοειδοποίηση"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "ΑσÏÏματο"
++
++msgid "Wireless"
++msgstr "ΑσÏÏματο"
++
++msgid "Wireless Adapter"
++msgstr "ΑσÏÏματος ΠÏοσαÏμογέας"
++
++msgid "Wireless Network"
++msgstr "ΑσÏÏματο Δίκτυο"
++
++msgid "Wireless Overview"
++msgstr "Επισκόπηση ΑσÏÏματου ΔικτÏου"
++
++msgid "Wireless Security"
++msgstr "Ασφάλεια ΑσÏÏματου ΔικτÏου"
++
++msgid "Wireless is disabled or not associated"
++msgstr "Το ασÏÏματο δίκτυο είναι απενεÏγοποιημένο ή μη συνδεδεμένο"
++
++msgid "Wireless is restarting..."
++msgstr "Το ασÏÏματο δίκτυο επανεκκινείται..."
++
++msgid "Wireless network is disabled"
++msgstr "Το ασÏÏματο δίκτυο είναι ανενεÏγό"
++
++msgid "Wireless network is enabled"
++msgstr "Το ασÏÏματο δίκτυο είναι ενεÏγό"
++
++msgid "Wireless restarted"
++msgstr "Το ασÏÏματο δίκτυο επανεκκινήθηκε"
++
++msgid "Wireless shut down"
++msgstr "Το ασÏÏματο δίκτυο τεÏματίστηκε"
++
++msgid "Write received DNS requests to syslog"
++msgstr "ΚαταγÏαφή των ληφθέντων DNS αιτήσεων στο syslog"
++
++msgid "XR Support"
++msgstr "ΥποστήÏιξη XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"ΜποÏείτε να ενεÏγοποιήσετε ή να απενεÏγοποιήσετε σενάÏια εκκίνησης εδώ. Οι "
++"αλλαγές θα εφαÏμοστοÏν Î±Ï†Î¿Ï ÎµÏ€Î±Î½ÎµÎºÎºÎ¹Î½Î®ÏƒÎµÏ„Îµ τη συσκευή.<br /"
++"><strong>ΠÏοειδοποίηση: Αν απενεÏγοποιήσετε απαÏαίτητα σενάÏια εκκίνησης "
++"όπως το \"network\", η συσκευή σας μποÏεί να καταστεί μη-Ï€Ïοσβάσιμη!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++
++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 ""
++
++msgid "any"
++msgstr ""
++
++msgid "auto"
++msgstr "αυτόματα"
++
++#, fuzzy
++msgid "automatic"
++msgstr "στατικό"
++
++msgid "baseT"
++msgstr ""
++
++msgid "bridged"
++msgstr ""
++
++msgid "create:"
++msgstr ""
++
++#, fuzzy
++msgid "creates a bridge over specified interface(s)"
++msgstr "δημιουÏγεί μία γέφυÏα Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ οÏισμένων διεπαφών"
++
++msgid "dB"
++msgstr ""
++
++msgid "dBm"
++msgstr ""
++
++msgid "disable"
++msgstr "ανενεÏγό"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"αÏχείο όπου θα αποθηκεÏονται τα Leases του <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>"
++
++msgid "forward"
++msgstr "Ï€Ïοώθηση"
++
++msgid "full-duplex"
++msgstr ""
++
++msgid "half-duplex"
++msgstr ""
++
++msgid "help"
++msgstr "βοήθεια"
++
++msgid "hidden"
++msgstr ""
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "αν ο στόχος είναι ένα δίκτυο"
++
++msgid "input"
++msgstr "είσοδος"
++
++msgid "kB"
++msgstr ""
++
++msgid "kB/s"
++msgstr ""
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "όχι"
++
++msgid "no link"
++msgstr ""
++
++msgid "none"
++msgstr "κανένα"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "κλειστό"
++
++msgid "on"
++msgstr "ανοιχτό"
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr ""
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "unlimited"
++msgstr "απεÏιόÏιστα"
++
++msgid "unspecified"
++msgstr "μη-καθοÏισμένο"
++
++msgid "unspecified -or- create:"
++msgstr "μη-καθοÏισμένο -ή- δημιουÏγείστε:"
++
++msgid "untagged"
++msgstr ""
++
++msgid "yes"
++msgstr "ναι"
++
++msgid "« Back"
++msgstr "« Πίσω"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "ΕνεÏγοποίηση διαπÏαγμάτευσης IPv6 πάνω στη PPP ζεÏξη"
++
++#~ msgid "Path"
++#~ msgstr "ΔιαδÏομή"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "ΠαÏακαλώ πεÏιμένετε: Η συσκευή επανεκκινεί..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "ΠÏοειδοποίηση: ΥπάÏχουν μη-αποθηκευμένες αλλαγές που θα χαθοÏν κατά την "
++#~ "επανεκκίνηση!"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr ""
++#~ "ΟÏίζει το συγκεκÏιμένο σημείο Ï€ÏοσάÏτησης ως επικαλÏπτον αποθηκευτικό "
++#~ "χώÏο για το block-extroot"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Frequency Hopping"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "Κλειδωμένο στο κανάλι %d που χÏησιμοποιείται απ' το %s"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz με δεÏτεÏο κανάλι υψηλότεÏα"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz με δεÏτεÏο κανάλι χαμηλότεÏα"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Αποδοχή διαφημίσεων δÏομολογητή"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Διαφήμιση IPv6 στο δίκτυο"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "Διαφημιζόμενο αναγνωÏιστικό δικτÏου"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "Το επιτÏεπόμενο εÏÏος είναι από 1 έως 65535"
++
++#~ msgid "Router Model"
++#~ msgstr "Μοντέλο ΔÏομολογητή"
++
++#~ msgid "Router Name"
++#~ msgstr "Όνομα ΔÏομολογητή"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Αναμονή για δÏομολογητή..."
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "ΕνεÏγοποίηση ενσωματωμένου εξυπηÏετητή NTP"
++
++#~ msgid "Active Leases"
++#~ msgstr "ΕνεÏγά Leases"
++
++#~ msgid "Open"
++#~ msgstr "Άνοιγμα"
++
++#~ msgid "Bit Rate"
++#~ msgstr "Ρυθμός Δεδομένων"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "ΠαÏαμετÏοποίηση / ΕφαÏμογή"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "ΠαÏαμετÏοποίηση / Αλλαγές"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "ΠαÏαμετÏοποίηση / ΕπαναφοÏά"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MAC Address"
++#~ msgstr "ΔιεÏθυνση MAC"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Encrypted\">ΚÏυπτ.</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "ΣάÏωση <abbr title=\"Wireless Local Area Network\">WLAN</abbr>"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "Επιλέξατε το δίκτυο που επιθυμείτε να Ï€ÏοσαÏτήσετε σε αυτήν την ασÏÏματη "
++#~ "διεπαφή. Επιλέξτε <em>απÏοσδιόÏιστο</em> για να μην Ï€ÏοσαÏτηθεί "
++#~ "οποιοδήποτε ή συμπληÏώστε το πεδίο <em>δημιουÏγία</em> για να "
++#~ "Ï€ÏοσδιοÏίσετε ένα νέο δίκτυο."
++
++#~ msgid "Create Network"
++#~ msgstr "ΔημιουÏγία ΔικτÏου"
++
++#~ msgid "Link"
++#~ msgstr "ΖεÏξη"
++
++#~ msgid "Networks"
++#~ msgstr "Δίκτυα"
++
++#~ msgid "Power"
++#~ msgstr "ΙσχÏÏ‚"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Τοπικά ΑσÏÏματα δίκτυα"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "ΠαÏάσταση <abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>: "
++#~ "διεÏθυνση/Ï€Ïόθεμα"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "ΕξυπηÏετητής <abbr title=\"Domain Name System\">DNS</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "ΔιεÏθυνση <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "ΔιαχείÏιση IPv6"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "Σημείωση: Εάν επιλέξετε μια διεπαφή εδώ η οποία είναι μέÏος ενός άλλου "
++#~ "δικτÏου, θα μετακινηθεί σε αυτό το δίκτυο."
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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>s όπου οι "
++#~ "υπολογιστές να επικοινωνοÏν απευθείας Î¼ÎµÏ„Î±Î¾Ï Ï„Î¿Ï…Ï‚. Τα <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s συχνά χÏησιμοποιοÏνται για να "
++#~ "διαχωÏίσουν διαφοÏετικά τμήματα του δικτÏου. Συχνά υπάÏχει μία "
++#~ "Ï€Ïοεπιλεγμένη πόÏτα Uplink για σÏνδεση με ένα μεγαλÏτεÏο δίκτυο όπως το "
++#~ "internet και άλλες πόÏτες για σÏνδεση με το τοπικό δίκτυο."
++
++#~ msgid "Enable buffering"
++#~ msgstr "ΕνεÏγοποίηση buffering"
++
++#~ msgid "IPv6-over-IPv4"
++#~ msgstr "IPv6-over-IPv4"
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "ΑÏχεία που θα διατηÏηθοÏν κατά το φλασάÏισμα του firmware"
++
++#~ msgid "General"
++#~ msgstr "Γενικά"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Εδώ μποÏείτε να Ï€ÏοσαÏμόσετε τις Ïυθμίσεις και την λειτουÏγία του <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr>."
++
++#~ msgid "Post-commit actions"
++#~ msgstr "ΕνέÏγειες μετά το commit"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Αυτές οι εντολές θα εκτελεστοÏν αυτόματα όταν μία ÏÏθμιση <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> γίνει commit επιτÏέποντας "
++#~ "τις αλλαγές να εφαÏμόζονται ακαÏιαία."
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Web <abbr title=\"User Interface\">UI</abbr>"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "ΕξυπηÏετητής <abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Σημείο Ï€Ïόσβασης (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Επιπλέον επιλογές pppd"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Αυτόματη ΑποσÏνδεση"
++
++#~ msgid "Backup Archive"
++#~ msgstr "ΑÏχείο αντιγÏάφων ασφαλείας"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "ΡÏθμιση του Ï„Î¿Ï€Î¹ÎºÎ¿Ï ÎµÎ¾Ï…Ï€Î·Ïετητή DNS να χÏησιμοποιεί τους εξυπηÏετητές "
++#~ "ονόματος που διαφημίζει ο ομότιμος PPP"
++
++#~ msgid "Connect script"
++#~ msgstr "ΣενάÏιο σÏνδεσης"
++
++#~ msgid "Create backup"
++#~ msgstr "ΔημιουÏγία αντίγÏαφου ασφαλείας"
++
++#~ msgid "Disconnect script"
++#~ msgstr "ΣενάÏιο αποσÏνδεσης"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "ΕπεξεÏγασία λίστας πακέτων και Ï€ÏοοÏισμών εγκατάστασης"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "ΕνεÏγοποίηση IPv6 σε ζεÏξη PPP"
++
++#~ msgid "Firmware image"
++#~ msgstr "Εικόνα firmware"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Εδώ μποÏείτε να κÏατήσετε και να επαναφέÏετε αντίγÏαφα ασφαλείας των "
++#~ "παÏαμέτÏων του δÏομολογητή σας και - αν είναι δυνατόν - να επαναφέÏετε "
++#~ "τον δÏομολογητή στις Ï€Ïοεπιλεγμένες Ïυθμίσεις."
++
++#~ msgid "Installation targets"
++#~ msgstr "ΠÏοοÏισμοί εγκατάστασης"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "ΔιατήÏηση αÏχείων παÏαμετÏοποίησης"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Keep-Alive"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Το pppd να αντικαθιστά την Ï„Ïέχουσα Ï€Ïοεπιλεγμένη διαδÏομή για να "
++#~ "χÏησιμοποιείται η διεπαφή PPP μετά από επιτυχημένη σÏνδεση"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr "Το pppd να Ï„Ïέχει αυτό το σενάÏιο όταν η ζεÏξη PPP εγκαθιδÏÏεται"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "Το pppd να Ï„Ïέχει αυτό το σενάÏιο Ï€Ïιν η ζεÏξη PPP κλείσει"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Εξασφαλίστε ότι δηλώνετε το σωστό κωδικό pin εδώ αλλιώς μποÏεί να "
++#~ "κλειδώσετε την κάÏτα sim σας!"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "Οι πεÏισσότεÏοι είναι εξυπηÏετητές δικτÏου που Ï€ÏοσφέÏουν κάποιες "
++#~ "συγκεκÏιμένες υπηÏεσίες για την συσκευή ή το δίκτυο σας όπως Ï€Ïόσβαση στο "
++#~ "κέλυφος, υπηÏεσίες ιστοσελίδων σαν το <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>, δÏομολόγηση mesh, αποστολή ηλ. ταχυδÏομείου, ..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr ""
++#~ "ΑÏιθμός αποτυχημένων δοκιμών για την εφαÏμογή της αυτόματης επανασÏνδεσης"
++
++#~ msgid "PIN code"
++#~ msgstr "Κωδικός PIN"
++
++#~ msgid "Package lists"
++#~ msgstr "Λίστες Πακέτων"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr ""
++#~ "Θέλετε να Ï€ÏοχωÏήσετε στην αναίÏεση όλων των Ïυθμίσεων και την επαναφοÏά "
++#~ "στις Ï€Ïοεπιλεγμένες για το firmware;"
++
++#~ msgid "Processor"
++#~ msgstr "ΕπεξεÏγαστής"
++
++#~ msgid "Radius-Port"
++#~ msgstr "ΘÏÏα Radius"
++
++#~ msgid "Radius-Server"
++#~ msgstr "ΕξυπηÏετητής Radius"
++
++#~ msgid "Replace default route"
++#~ msgstr "Αντικατάσταση Ï€Ïοεπιλεγμένης διαδÏομής"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "ΕπαναφοÏά δÏομολογητή στα Ï€Ïοεπιλεγμένα"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr ""
++#~ "ΔευτεÏόλεπτα αναμονής ώστε το modem να Ï€Ïοετοιμαστεί Ï€Ïιν την Ï€Ïοσπάθεια "
++#~ "για σÏνδεση"
++
++#~ msgid "Service type"
++#~ msgstr "ΤÏπος υπηÏεσίες"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr ""
++#~ "Οι υπηÏεσίες και οι δαίμονες εκτελοÏν κάποιες συγκεκÏιμένες εÏγασίες στην "
++#~ "συσκευή σας."
++
++#~ msgid "Settings"
++#~ msgstr "Ρυθμίσεις"
++
++#~ msgid "Setup wait time"
++#~ msgstr "ΚαθοÏισμός χÏόνου αναμονής"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Συγνώμη. Το OpenWrt δεν υποστηÏίζει αναβάθμιση συστήματος σε αυτή την "
++#~ "πλατφόÏμα.<br /> ΧÏειάζεται να φλασάÏετε την συσκευή σας χειÏοκίνητα."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr "ΟÏισμός επιπλέον επιλογών pppd στην γÏαμμή εντολών"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "Ο κόμβος συσκευής του modem σας, π.χ. /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr ""
++#~ "ΧÏόνος (σε δευτεÏόλεπτα) ÏστεÏα από τον οποίο οι αχÏησιμοποίητες "
++#~ "συνδέσεις θα κλείνουν"
++
++#~ msgid "Update package lists"
++#~ msgstr "ΕνημέÏωση λίστας πακέτων"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "Ανεβάστε ένα αÏχείο εικόνας OpenWrt για να φλασάÏετε τη συσκευή."
++
++#~ msgid "Upload image"
++#~ msgstr "Ανέβασμα εικόνας"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "ΧÏήση DNS ομότιμου"
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Θα Ï€Ïέπει να εγκαταστήσετε το \"comgt\" για υποστήÏιξη UMTS/GPRS, το "
++#~ "\"ppp-mod-pppoe\" για PPPoE, το \"ppp-mod-pppoa\" για PPPoA ή το \"pptp\" "
++#~ "για PPtP"
++
++#~ msgid "back"
++#~ msgstr "πίσω"
++
++#~ msgid "buffered"
++#~ msgstr "ενδιάμεση"
++
++#~ msgid "cached"
++#~ msgstr "λανθάνουσα"
++
++#~ msgid "free"
++#~ msgstr "ελεÏθεÏη"
++
++#~ msgid "static"
++#~ msgstr "στατικό"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "Το <abbr title=\"Lua Configuration Interface\">LuCI</abbr> είναι μία "
++#~ "συλλογή από ελεÏθεÏο λογισμικό Lua που συμπεÏιλαμβάνει ένα <abbr title="
++#~ "\"Model-View-Controller\">MVC</abbr>-Webframework και ένα πεÏιβάλλον web "
++#~ "για embedded συσκευές. Το <abbr title=\"Lua Configuration Interface"
++#~ "\">LuCI</abbr> έχει άδεια Î»Î¿Î³Î¹ÏƒÎ¼Î¹ÎºÎ¿Ï Apache."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "Κλειδιά <abbr title=\"Secure Shell\">SSH</abbr>"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "Ένας ελαφÏÏÏ‚ εξυπηÏετητής web HTTP/1.1 webserver γÏαμμένος σε C και Lua "
++#~ "και σχεδιασμένος να εξυπηÏετεί το LuCI"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Ένας μικÏός εξυπηÏετητής web που μποÏεί να χÏησιμοποιηθεί για να "
++#~ "εξυπηÏετεί το <abbr title=\"Lua Configuration Interface\">LuCI</abbr>."
++
++#~ msgid "About"
++#~ msgstr "ΠεÏί"
++
++#~ msgid "Addresses"
++#~ msgstr "ΔιευθÏνσεις"
++
++#~ msgid "Admin Password"
++#~ msgstr "Κωδικός ΔιαχειÏιστή"
++
++#~ msgid "Alias"
++#~ msgstr "Ψευδώνυμο"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Realm Εξουσιοδότησης"
++
++#~ msgid "Bridge Port"
++#~ msgstr "ΠόÏτα ΓέφυÏας"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr ""
++#~ "Αλλαγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης του διαχειÏιστή του συστήματος (ΧÏήστης "
++#~ "<code>root</code>)"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Πελάτης + WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "ΑÏχείο ΠαÏαμετÏοποίησης"
++
++#~ msgid "Connection timeout"
++#~ msgstr "ΧÏόνος λήξης σÏνδεσης"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "ΣυνεισφοÏές στην Ανάπτυξη"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "Ανάθεση από DHCP"
++
++#~ msgid "Document root"
++#~ msgstr "Ρίζα εγγÏάφων"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "ΕνεÏγοποίηση Keep-Alive"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "ΓέφυÏα Ethernet"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "Εδώ μποÏείτε να επικολλήσετε δημόσια <abbr title=\"Secure Shell\">SSH</"
++#~ "abbr>-κλειδιά (ένα ανά γÏαμμή) για εξουσιοδότηση δημόσιου-ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï <abbr "
++#~ "title=\"Secure Shell\">SSH</abbr>."
++
++#~ msgid "ID"
++#~ msgstr "ID"
++
++#~ msgid "IP Configuration"
++#~ msgstr "Ρυθμίσεις IP"
++
++#~ msgid "Interface Status"
++#~ msgstr "Κατάσταση Διεπαφής"
++
++#~ msgid "Lead Development"
++#~ msgstr "Επικεφαλής Ανάπτυξης"
++
++#~ msgid "Master"
++#~ msgstr "Σημείο ΠÏόσβασης"
++
++#~ msgid "Master + WDS"
++#~ msgstr "Σημείο ΠÏόσβασης + WDS"
++
++#~ msgid "Not configured"
++#~ msgstr "Μη-Ïυθμισμένο"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Ο κωδικός Ï€Ïόσβασης αλλάχτηκε επιτυχώς"
++
++#~ msgid "Plugin path"
++#~ msgstr "ΔιαδÏομή Ï€Ïοσθέτων"
++
++#~ msgid "Ports"
++#~ msgstr "ΘÏÏες"
++
++#~ msgid "Primary"
++#~ msgstr "ΚÏÏιο"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Ιστοσελίδα του ΠÏότζεκτ"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "Ψευδό Ad-Hoc"
++
++#~ msgid "STP"
++#~ msgstr "STP"
++
++#~ msgid "Thanks To"
++#~ msgstr "ΕυχαÏιστίες"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr ""
++#~ "Το realm που θα εμφανίζεται κατά την Ï€ÏοτÏοπή για εξουσιοδότηση για τις "
++#~ "Ï€Ïοστατευμένες σελίδες."
++
++#~ msgid "Unknown Error"
++#~ msgstr "Άγνωστο Σφάλμα"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "Ï€Ïοεπιλεγμένο <code>/etc/httpd.conf</code>"
++
++#~ msgid "Package lists updated"
++#~ msgstr "Η λίστα πακέτων ενημεÏώθηκε"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Αναβάθμιση εγκατεστημένων πακέτων"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "Επίσης εδώ μποÏείτε να δείτε τα αÏχεία καταγÏαφής του πυÏήνα ή των "
++#~ "υπηÏεσιών ώστε να έχετε μια εικόνα για την Ï„Ïέχουσα κατάσταση."
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "Εδώ μποÏείτε να βÏείτε πληÏοφοÏίες για την Ï„Ïέχουσα κατάσταση του "
++#~ "συστήματος όπως την συχνότητα της <abbr title=\"Central Processing Unit"
++#~ "\">CPU</abbr>, τη χÏήση μνήμης ή τον όγκο δεδομένων των διεπαφών δικτÏου."
++
++#~ msgid "Search file..."
++#~ msgstr "ΕÏÏεση αÏχείου..."
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "Το <abbr title=\"Lua Configuration Interface\">LuCI</abbr> είναι ένα "
++#~ "ελεÏθεÏο, ευέλικτο, και φιλικό Ï€Ïος το χÏήστη γÏαφικό πεÏιβάλλον για την "
++#~ "παÏαμετÏοποίηση του OpenWrt Kamikaze."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "Και Ï„ÏŽÏα διασκεδάστε με τον δÏομολογητή σας!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "Θέλοντας πάντα να βελτιώνουμε αυτό το πεÏιβάλλον, πεÏιμένουμε την "
++#~ "ανάδÏαση και τις Ï€Ïοτάσεις σας."
++
++#~ msgid "Hello!"
++#~ msgstr "Γεια σας!"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Σημείωση: ΠÏιν εφαÏμοστοÏν οι αλλαγές στο <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> Ï€Ïέπει να επιβεβαιωθοÏν κλικάÏοντας το Αλλαγές - "
++#~ "Αποθήκευση &amp; ΕφαÏμογή."
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "Στις επόμενες σελίδες μποÏείτε να Ï€ÏοσαÏμόζετε τις πιο σημαντικές "
++#~ "Ïυθμίσεις του δÏομολογητή σας."
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr "Η ομάδα του <abbr title=\"Lua Configuration Interface\">LuCI</abbr>"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Αυτός είναι ο χώÏος διαχείÏισης του <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++
++#~ msgid "User Interface"
++#~ msgstr "ΠεÏιβάλλον ΧÏήστη"
++
++#~ msgid "enable"
++#~ msgstr "ενεÏγό"
++
++#, fuzzy
++#~ msgid "(optional)"
++#~ msgstr " (Ï€ÏοαιÏετικό)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "ΘÏÏα <abbr title=\"Domain Name System\">DNS</abbr>"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "Ο εξυπηÏετητής <abbr title=\"Domain Name System\">DNS</abbr> θα εÏωτάται "
++#~ "με την σειÏά που δηλώνεται στο αÏχείο resolv"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr ""
++#~ "<abbr title=\"μέγιστα\">μεγ.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Extension Mechanisms "
++#~ "for Domain Name System\">EDNS0</abbr> packet size"
++#~ msgstr ""
++#~ "<abbr title=\"μέγιστο\">μεγ.</abbr> μέγεθος πακέτου <abbr title="
++#~ "\"Extension Mechanisms for Domain Name System\">EDNS0</abbr>"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "Απομόνωση AP"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "ΠÏοσθήκη ΑσÏÏματου δικτÏου σε φυσικό δίκτυο"
++
++#~ msgid "Aliases"
++#~ msgstr "Ψευδώνυμα"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Μέγεθος Τμήματος ΤεμαχισμοÏ"
++
++#, fuzzy
++#~ msgid "Create Or Attach Network"
++#~ msgstr "ΔημιουÏγία ΔικτÏου"
++
++#~ msgid "Devices"
++#~ msgstr "Συσκευές"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "Îα μην Ï€ÏοωθοÏνται αντίστÏοφες αναζητήσεις για τοπικά δίκτυα"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "ΕνεÏγός εξυπηÏετητής TFTP"
++
++#~ msgid "Errors"
++#~ msgstr "Λάθη"
++
++#~ msgid "Essentials"
++#~ msgstr "Βασικά"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Ανάπτυξη ονομάτων υπολογιστών"
++
++#~ msgid "First leased address"
++#~ msgstr "ΠÏώτη διεÏθυνση lease"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "ΕπιλÏει Ï€Ïοβλήματα με μη-Ï€Ïοσβάσιμους ιστοχώÏους, την υποβολή φοÏμών ή "
++#~ "άλλες απÏοσδόκητες συμπεÏιφοÏές κάποιων ISP."
++
++#~ msgid "Hardware Address"
++#~ msgstr "ΔιεÏθυνση ΥλικοÏ"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "Εδώ μποÏείτε να Ïυθμίσετε τις εγκατεστημένες ασÏÏματες συσκευές."
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "ΑνεξάÏτητο (Ad-Hoc)"
++
++#~ msgid "Internet Connection"
++#~ msgstr "ΣÏνδεση με Διαδίκτυο"
++
++#~ msgid "Join (Client)"
++#~ msgstr "Συμμετοχή (Πελάτης)"
++
++#~ msgid "Leases"
++#~ msgstr "Leases"
++
++#~ msgid "Local Domain"
++#~ msgstr "Τοπικό Όνομα Τομέα"
++
++#~ msgid "Local Network"
++#~ msgstr "Τοπικό Δίκτυο"
++
++#~ msgid "Local Server"
++#~ msgstr "Τοπικός Διακομιστής"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "Εικόνα Εκκίνησης ΔικτÏου"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr ""
++#~ "Όνομα ΔικτÏου (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "ΑÏιθμός διευθÏνσεων lease"
++
++#~ msgid "Perform Actions"
++#~ msgstr "Εκτέλεση ΕνεÏγειών"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "ΑποτÏέπει την επικοινωνία Î¼ÎµÏ„Î±Î¾Ï Î ÎµÎ»Î±Ï„ÏŽÎ½"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "ΠαÏοχή (Σημείο ΠÏόσβασης)"
++
++#~ msgid "Resolvfile"
++#~ msgstr "ΑÏχείο Resolv"
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "Ρίζα εξυπηÏετητή TFTP"
++
++#~ msgid "TX / RX"
++#~ msgstr "TX / RX"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "Οι παÏακάτω αλλαγές έχουν εφαÏμοστεί"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "Τα παÏακάτω αÏχεία θα διατηÏοÏνται όταν φλασάÏεται το firmware μέσω του "
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr>."
++
++#, fuzzy
++#~ msgid "Wireless Scan"
++#~ msgstr "ΑσÏÏματο"
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "Με τον <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> τα "
++#~ "μέλη του δικτÏου μποÏοÏν αυτόματα να λάβουν τις Ïυθμίσεις δικτÏου τους "
++#~ "(διεÏθυνση <abbr title=\"Internet Protocol\">IP</abbr>, μάσκα δικτÏου, "
++#~ "εξυπηÏετητή <abbr title=\"Domain Name System\">DNS</abbr>, ...)."
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "Μια συσκευή μποÏεί να λειτουÏγεί σε πολλά ασÏÏματα δίκτυα. ΠÏοσοχή όμως "
++#~ "γιατί υπάÏχουν κάποιοι πεÏιοÏισμοί από το υλικό και τον οδηγό. Κανονικά, "
++#~ "μποÏοÏν να λειτουÏγοÏν: 1 δίκτυο Ad-Hoc ή μέχÏι 3 δίκτυα AP και 1 πελάτη "
++#~ "ταυτόχÏονα."
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "ΧÏειάζεται να εγκαταστήσετε το \"ppp-mod-pppoe\" για υποστήÏιξη PPPoE ή "
++#~ "το \"pptp\" για υποστήÏιξη PPtP"
++
++#~ msgid "additional hostfile"
++#~ msgstr "επιπλέον αÏχείο ονομάτων υπολογιστών"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr "Ï€Ïοσθέτει τα ονόματα τομέα στις καταχωÏήσεις του αÏχείου resolv"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "αυτόματη επανασÏνδεση"
++
++#~ msgid "concurrent queries"
++#~ msgstr "ταυτόχÏονα εÏωτήματα"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr ""
++#~ "απενεÏγοποίηση <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++#~ "abbr> για αυτή τη διεπαφή"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "αποσÏνδεση όταν είναι αδÏανές για"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "να μην διατηÏοÏνται στην λανθάνουσα μνήμη τα άγνωστα"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr ""
++#~ "φιλτÏάÏισμα άχÏηστων εÏωτημάτων <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr> των συστημάτων Windows"
++
++#~ msgid "installed"
++#~ msgstr "εγκατεστημένο"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "επιτÏέπει τοπικό όνομα υπολογιστή με βάση το υποδίκτυο του"
++
++#~ msgid "not installed"
++#~ msgstr "μη-εγκατεστημένο"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr ""
++#~ "αποτÏέπει τη διατήÏηση των αÏνητικών απαντήσεων <abbr title=\"Domain Name "
++#~ "System\">DNS</abbr> στην λανθάνουσα μνήμη"
++
++#~ msgid "query port"
++#~ msgstr "θÏÏα εÏωτημάτων"
++
++#~ msgid "transmitted / received"
++#~ msgstr "απεσταλμένα / ληφθέντα"
++
++#~ msgid "Console Log Level"
++#~ msgstr "Επίπεδο ΚαταγÏαφής ΤεÏματικοÏ"
++
++#~ msgid "Log Size"
++#~ msgstr "Μέγεθος ΑÏχείου ΚαταγÏαφής"
++
++#~ msgid "Remote Syslog IP"
++#~ msgstr "ΔιεÏθυνση ΑπομακÏυσμένου Syslog"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "Δίκτυο"
++
++#~ msgid "all"
++#~ msgstr "όλα"
++
++#~ msgid "Code"
++#~ msgstr "Κωδικός"
++
++#~ msgid "Distance"
++#~ msgstr "Απόσταση"
++
++#~ msgid "Legend"
++#~ msgstr "Υπόμνημα"
++
++#~ msgid "Library"
++#~ msgstr "Βιβλιοθήκη"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "βλέπε &#39;%s&#39; manpage"
++
++#~ msgid "Package Manager"
++#~ msgstr "ΔιαχειÏιστής Πακέτων"
++
++#~ msgid "Service"
++#~ msgstr "ΥπηÏεσία"
++
++#~ msgid "Statistics"
++#~ msgstr "Στατιστικά"
++
++#~ msgid "zone"
++#~ msgstr "Ζώνη"
+diff --git a/feeds/luci/modules/luci-base/po/en/base.po b/feeds/luci/modules/luci-base/po/en/base.po
+new file mode 100644
+index 0000000..e15ceaf
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/en/base.po
+@@ -0,0 +1,4084 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2012-04-03 08:44+0200\n"
++"Last-Translator: juhosg <juhosg@openwrt.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: en\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d minute window, %d second interval)"
++
++msgid "(%s available)"
++msgstr "(%s available)"
++
++msgid "(empty)"
++msgstr "(empty)"
++
++msgid "(no interfaces attached)"
++msgstr "(no interfaces attached)"
++
++msgid "-- Additional Field --"
++msgstr "-- Additional Field --"
++
++msgid "-- Please choose --"
++msgstr "-- Please choose --"
++
++msgid "-- custom --"
++msgstr "-- custom --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "1 Minute Load:"
++
++msgid "15 Minute Load:"
++msgstr "15 Minute Load:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "5 Minute Load:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr ""
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "AR Support"
++
++msgid "ARP retry threshold"
++msgstr "ARP retry threshold"
++
++msgid "ATM Bridges"
++msgstr "ATM Bridges"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "ATM Virtual Channel Identifier (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "ATM Virtual Path Identifier (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++
++msgid "ATM device number"
++msgstr "ATM device number"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Access Concentrator"
++
++msgid "Access Point"
++msgstr "Access Point"
++
++msgid "Action"
++msgstr "Action"
++
++msgid "Actions"
++msgstr "Actions"
++
++msgid "Activate this network"
++msgstr "Activate this network"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++
++msgid "Active Connections"
++msgstr "Active Connections"
++
++msgid "Active DHCP Leases"
++msgstr ""
++
++msgid "Active DHCPv6 Leases"
++msgstr ""
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Add"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr "Add local domain suffix to names served from hosts files"
++
++msgid "Add new interface..."
++msgstr "Add new interface..."
++
++msgid "Additional Hosts files"
++msgstr "Additional Hosts files"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Address"
++
++msgid "Address to access local relay bridge"
++msgstr "Address to access local relay bridge"
++
++msgid "Administration"
++msgstr "Administration"
++
++msgid "Advanced Settings"
++msgstr "Advanced Settings"
++
++msgid "Alert"
++msgstr "Alert"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++
++msgid "Allow all except listed"
++msgstr "Allow all except listed"
++
++msgid "Allow listed only"
++msgstr "Allow listed only"
++
++msgid "Allow localhost"
++msgstr "Allow localhost"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr "Allow remote hosts to connect to local SSH forwarded ports"
++
++msgid "Allow root logins with password"
++msgstr "Allow root logins with password"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "Allow the <em>root</em> user to login with password"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "An additional network will be created if you leave this unchecked."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antenna 1"
++
++msgid "Antenna 2"
++msgstr "Antenna 2"
++
++msgid "Antenna Configuration"
++msgstr ""
++
++msgid "Any zone"
++msgstr "Any zone"
++
++msgid "Apply"
++msgstr "Apply"
++
++msgid "Applying changes"
++msgstr "Applying changes"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Assign interfaces..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Associated Stations"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Authentication"
++
++msgid "Authoritative"
++msgstr "Authoritative"
++
++msgid "Authorization Required"
++msgstr "Authorization Required"
++
++msgid "Auto Refresh"
++msgstr "Auto Refresh"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Available"
++
++msgid "Available packages"
++msgstr "Available packages"
++
++msgid "Average:"
++msgstr "Average:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Back"
++
++msgid "Back to Overview"
++msgstr "Back to Overview"
++
++msgid "Back to configuration"
++msgstr "Back to configuration"
++
++msgid "Back to overview"
++msgstr "Back to overview"
++
++msgid "Back to scan results"
++msgstr "Back to scan results"
++
++msgid "Background Scan"
++msgstr "Background Scan"
++
++msgid "Backup / Flash Firmware"
++msgstr "Backup / Flash Firmware"
++
++msgid "Backup / Restore"
++msgstr "Backup / Restore"
++
++msgid "Backup file list"
++msgstr "Backup file list"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"Below is the determined list of files to backup. It consists of changed "
++"configuration files marked by opkg, essential base files and the user "
++"defined backup patterns."
++
++msgid "Bitrate"
++msgstr "Bitrate"
++
++msgid "Bogus NX Domain Override"
++msgstr "Bogus NX Domain Override"
++
++msgid "Bridge"
++msgstr "Bridge"
++
++msgid "Bridge interfaces"
++msgstr "Bridge interfaces"
++
++msgid "Bridge unit number"
++msgstr "Bridge unit number"
++
++msgid "Bring up on boot"
++msgstr "Bring up on boot"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr ""
++
++msgid "Buffered"
++msgstr "Buffered"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Buttons"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "CPU usage (%)"
++
++msgid "Cancel"
++msgstr "Cancel"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Chain"
++
++msgid "Changes"
++msgstr "Changes"
++
++msgid "Changes applied."
++msgstr "Changes applied."
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "Changes the administrator password for accessing the device"
++
++msgid "Channel"
++msgstr "Channel"
++
++msgid "Check"
++msgstr "Check"
++
++msgid "Checksum"
++msgstr "Checksum"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++
++msgid "Cipher"
++msgstr "Cipher"
++
++msgid ""
++"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)."
++msgstr ""
++"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)."
++
++msgid "Client"
++msgstr "Client"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "Client ID to send when requesting DHCP"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++
++msgid "Close list..."
++msgstr "Close list..."
++
++msgid "Collecting data..."
++msgstr "Collecting data..."
++
++msgid "Command"
++msgstr "Command"
++
++msgid "Common Configuration"
++msgstr "Common Configuration"
++
++msgid "Compression"
++msgstr "Compression"
++
++msgid "Configuration"
++msgstr "Configuration"
++
++msgid "Configuration applied."
++msgstr "Configuration applied."
++
++msgid "Configuration files will be kept."
++msgstr "Configuration files will be kept."
++
++msgid "Confirmation"
++msgstr "Confirmation"
++
++msgid "Connect"
++msgstr "Connect"
++
++msgid "Connected"
++msgstr "Connected"
++
++msgid "Connection Limit"
++msgstr "Connection Limit"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr "Connections"
++
++msgid "Country"
++msgstr "Country"
++
++msgid "Country Code"
++msgstr "Country Code"
++
++msgid "Cover the following interface"
++msgstr "Cover the following interface"
++
++msgid "Cover the following interfaces"
++msgstr "Cover the following interfaces"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Create / Assign firewall-zone"
++
++msgid "Create Interface"
++msgstr "Create Interface"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Create a bridge over multiple interfaces"
++
++msgid "Critical"
++msgstr "Critical"
++
++msgid "Cron Log Level"
++msgstr "Cron Log Level"
++
++msgid "Custom Interface"
++msgstr "Custom Interface"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++
++msgid "DHCP Leases"
++msgstr "DHCP Leases"
++
++msgid "DHCP Server"
++msgstr "DHCP Server"
++
++msgid "DHCP and DNS"
++msgstr "DHCP and DNS"
++
++msgid "DHCP client"
++msgstr "DHCP client"
++
++msgid "DHCP-Options"
++msgstr "DHCP-Options"
++
++msgid "DHCPv6 Leases"
++msgstr ""
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "DNS forwardings"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr ""
++
++msgid "Debug"
++msgstr "Debug"
++
++msgid "Default %d"
++msgstr "Default %d"
++
++msgid "Default gateway"
++msgstr "Default gateway"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Default state"
++
++msgid "Define a name for this network."
++msgstr "Define a name for this network."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++
++msgid "Delete"
++msgstr "Delete"
++
++msgid "Delete this interface"
++msgstr "Delete this interface"
++
++msgid "Delete this network"
++msgstr "Delete this network"
++
++msgid "Description"
++msgstr "Description"
++
++msgid "Design"
++msgstr "Design"
++
++msgid "Destination"
++msgstr "Destination"
++
++msgid "Device"
++msgstr "Device"
++
++msgid "Device Configuration"
++msgstr "Device Configuration"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnostics"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Directory"
++
++msgid "Disable"
++msgstr ""
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++
++msgid "Disable DNS setup"
++msgstr ""
++
++msgid "Disable HW-Beacon timer"
++msgstr "Disable HW-Beacon timer"
++
++msgid "Disabled"
++msgstr "Disabled"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr ""
++
++msgid "Displaying only packages containing"
++msgstr ""
++
++msgid "Distance Optimization"
++msgstr "Distance Optimization"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Distance to farthest network member in meters."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Diversity"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 ""
++
++msgid "Do not send probe responses"
++msgstr "Do not send probe responses"
++
++msgid "Domain required"
++msgstr "Domain required"
++
++msgid "Domain whitelist"
++msgstr ""
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Don&#39;t forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests "
++"without <abbr title=\"Domain Name System\">DNS</abbr>-Name"
++
++msgid "Download and install package"
++msgstr "Download and install package"
++
++msgid "Download backup"
++msgstr ""
++
++msgid "Dropbear Instance"
++msgstr ""
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++
++msgid "Dynamic tunnel"
++msgstr ""
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "EAP-Method"
++
++msgid "Edit"
++msgstr "Edit"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr ""
++
++msgid "Edit this network"
++msgstr ""
++
++msgid "Emergency"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr ""
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr ""
++
++msgid "Enable NTP client"
++msgstr ""
++
++msgid "Enable TFTP server"
++msgstr ""
++
++msgid "Enable VLAN functionality"
++msgstr ""
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr ""
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr ""
++
++msgid "Enable this swap"
++msgstr ""
++
++msgid "Enable/Disable"
++msgstr "Enable/Disable"
++
++msgid "Enabled"
++msgstr "Enabled"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Enables the Spanning Tree Protocol on this bridge"
++
++msgid "Encapsulation mode"
++msgstr ""
++
++msgid "Encryption"
++msgstr "Encryption"
++
++msgid "Erasing..."
++msgstr ""
++
++msgid "Error"
++msgstr "Error"
++
++msgid "Ethernet Adapter"
++msgstr "Ethernet Adapter"
++
++msgid "Ethernet Switch"
++msgstr "Ethernet Switch"
++
++msgid "Expand hosts"
++msgstr ""
++
++msgid "Expires"
++msgstr ""
++
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr ""
++
++msgid "External system log server port"
++msgstr ""
++
++msgid "Fast Frames"
++msgstr "Fast Frames"
++
++msgid "File"
++msgstr ""
++
++msgid "Filename of the boot image advertised to clients"
++msgstr ""
++
++msgid "Filesystem"
++msgstr "Filesystem"
++
++msgid "Filter"
++msgstr "Filter"
++
++msgid "Filter private"
++msgstr "Filter private"
++
++msgid "Filter useless"
++msgstr "Filter useless"
++
++msgid "Find and join network"
++msgstr ""
++
++msgid "Find package"
++msgstr "Find package"
++
++msgid "Finish"
++msgstr ""
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall Settings"
++msgstr "Firewall Settings"
++
++msgid "Firewall Status"
++msgstr "Firewall Status"
++
++msgid "Firmware Version"
++msgstr ""
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr ""
++
++msgid "Flags"
++msgstr "Flags"
++
++msgid "Flash Firmware"
++msgstr "Flash Firmware"
++
++msgid "Flash image..."
++msgstr ""
++
++msgid "Flash new firmware image"
++msgstr ""
++
++msgid "Flash operations"
++msgstr ""
++
++msgid "Flashing..."
++msgstr ""
++
++msgid "Force"
++msgstr "Force"
++
++msgid "Force CCMP (AES)"
++msgstr ""
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++
++msgid "Force TKIP"
++msgstr ""
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr ""
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr ""
++
++msgid "Forward broadcast traffic"
++msgstr ""
++
++msgid "Forwarding mode"
++msgstr ""
++
++msgid "Fragmentation Threshold"
++msgstr "Fragmentation Threshold"
++
++msgid "Frame Bursting"
++msgstr "Frame Bursting"
++
++msgid "Free"
++msgstr ""
++
++msgid "Free space"
++msgstr ""
++
++msgid "GHz"
++msgstr ""
++
++msgid "GPRS only"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Gateway ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General Setup"
++msgstr "General Setup"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr ""
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr "Go to relevant configuration page"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr ""
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Handler"
++
++msgid "Hang Up"
++msgstr "Hang Up"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "Host entries"
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr ""
++
++msgid "Hostnames"
++msgstr "Hostnames"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "IP address"
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 Firewall"
++msgstr ""
++
++msgid "IPv4 WAN Status"
++msgstr ""
++
++msgid "IPv4 address"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid "IPv4 gateway"
++msgstr ""
++
++msgid "IPv4 netmask"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr ""
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr ""
++
++msgid "IPv6 address"
++msgstr ""
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "IPv6 prefix"
++msgstr ""
++
++msgid "IPv6 prefix length"
++msgstr ""
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr ""
++
++msgid "Identity"
++msgstr "Identity"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++
++msgid "If unchecked, no default route is configured"
++msgstr ""
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Ignore <code>/etc/hosts</code>"
++
++msgid "Ignore interface"
++msgstr "Ignore interface"
++
++msgid "Ignore resolve file"
++msgstr "Ignore resolve file"
++
++msgid "Image"
++msgstr ""
++
++msgid "In"
++msgstr "In"
++
++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 ""
++
++msgid "Inbound:"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Initscript"
++msgstr "Initscript"
++
++msgid "Initscripts"
++msgstr "Initscripts"
++
++msgid "Install"
++msgstr "Install"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr ""
++
++msgid "Install protocol extensions..."
++msgstr ""
++
++msgid "Installed packages"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface Overview"
++msgstr ""
++
++msgid "Interface is reconnecting..."
++msgstr ""
++
++msgid "Interface is shutting down..."
++msgstr ""
++
++msgid "Interface not present or not connected yet."
++msgstr ""
++
++msgid "Interface reconnected"
++msgstr ""
++
++msgid "Interface shut down"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr ""
++
++msgid "Invalid"
++msgstr "Invalid input value"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Invalid username and/or password! Please try again."
++
++#, 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 ""
++"It appears that you try to flash an image that does not fit into the flash "
++"memory, please verify the image file!"
++
++msgid "Java Script required!"
++msgstr ""
++
++msgid "Join Network"
++msgstr "Join Network"
++
++msgid "Join Network: Settings"
++msgstr ""
++
++msgid "Join Network: Wireless Scan"
++msgstr ""
++
++msgid "Keep settings"
++msgstr ""
++
++msgid "Kernel Log"
++msgstr "Kernel Log"
++
++msgid "Kernel Version"
++msgstr ""
++
++msgid "Key"
++msgstr "Key"
++
++msgid "Key #%d"
++msgstr ""
++
++msgid "Kill"
++msgstr "Kill"
++
++msgid "L2TP"
++msgstr ""
++
++msgid "L2TP Server"
++msgstr ""
++
++msgid "LCP echo failure threshold"
++msgstr ""
++
++msgid "LCP echo interval"
++msgstr ""
++
++msgid "LLC"
++msgstr ""
++
++msgid "Label"
++msgstr ""
++
++msgid "Language"
++msgstr "Language"
++
++msgid "Language and Style"
++msgstr ""
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Leasefile"
++msgstr "Leasefile"
++
++msgid "Leasetime"
++msgstr "Leasetime"
++
++msgid "Leasetime remaining"
++msgstr "Leasetime remaining"
++
++msgid "Leave empty to autodetect"
++msgstr ""
++
++msgid "Leave empty to use the current WAN address"
++msgstr ""
++
++msgid "Legend:"
++msgstr ""
++
++msgid "Limit"
++msgstr "Limit"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Link On"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++
++msgid "Listening port for inbound DNS queries"
++msgstr ""
++
++msgid "Load"
++msgstr "Load"
++
++msgid "Load Average"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Local IPv4 address"
++msgstr ""
++
++msgid "Local IPv6 address"
++msgstr ""
++
++msgid "Local Startup"
++msgstr ""
++
++msgid "Local Time"
++msgstr "Local Time"
++
++msgid "Local domain"
++msgstr ""
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr ""
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr "Localise queries"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr ""
++
++msgid "Log queries"
++msgstr "Log queries"
++
++msgid "Logging"
++msgstr ""
++
++msgid "Login"
++msgstr "Login"
++
++msgid "Logout"
++msgstr "Logout"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr ""
++
++msgid "MAC-Address Filter"
++msgstr "MAC-Address Filter"
++
++msgid "MAC-Filter"
++msgstr "MAC-Filter"
++
++msgid "MAC-List"
++msgstr "MAC-List"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr ""
++
++msgid "MHz"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Maximum Rate"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr ""
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr ""
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++
++msgid "Maximum hold time"
++msgstr "Maximum hold time"
++
++msgid "Maximum number of leased addresses."
++msgstr ""
++
++msgid "Mbit/s"
++msgstr ""
++
++msgid "Memory"
++msgstr "Memory"
++
++msgid "Memory usage (%)"
++msgstr "Memory usage (%)"
++
++msgid "Metric"
++msgstr "Metric"
++
++msgid "Minimum Rate"
++msgstr "Minimum Rate"
++
++msgid "Minimum hold time"
++msgstr "Minimum hold time"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr ""
++
++msgid "Mode"
++msgstr "Mode"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Modem device"
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr ""
++
++msgid "Mount Point"
++msgstr "Mount Point"
++
++msgid "Mount Points"
++msgstr "Mount Points"
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++
++msgid "Mount options"
++msgstr ""
++
++msgid "Mount point"
++msgstr ""
++
++msgid "Mounted file systems"
++msgstr "Mounted file systems"
++
++msgid "Move down"
++msgstr ""
++
++msgid "Move up"
++msgstr ""
++
++msgid "Multicast Rate"
++msgstr "Multicast Rate"
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr ""
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Name"
++
++msgid "Name of the new interface"
++msgstr ""
++
++msgid "Name of the new network"
++msgstr "Name of the new network"
++
++msgid "Navigation"
++msgstr "Navigation"
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr "Network"
++
++msgid "Network Utilities"
++msgstr ""
++
++msgid "Network boot image"
++msgstr ""
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr ""
++
++msgid "No DHCP Server configured for this interface"
++msgstr ""
++
++msgid "No chains in this table"
++msgstr "No chains in this table"
++
++msgid "No files found"
++msgstr ""
++
++msgid "No information available"
++msgstr ""
++
++msgid "No negative cache"
++msgstr ""
++
++msgid "No network configured on this device"
++msgstr ""
++
++msgid "No network name specified"
++msgstr ""
++
++msgid "No package lists available"
++msgstr ""
++
++msgid "No password set!"
++msgstr ""
++
++msgid "No rules in this chain"
++msgstr "No rules in this chain"
++
++msgid "No zone assigned"
++msgstr ""
++
++msgid "Noise"
++msgstr "Noise"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "Normal"
++msgstr ""
++
++msgid "Not Found"
++msgstr ""
++
++msgid "Not associated"
++msgstr ""
++
++msgid "Not connected"
++msgstr ""
++
++msgid "Note: Configuration files will be erased."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Nslookup"
++msgstr ""
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "OPKG-Configuration"
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++
++msgid "One or more fields contain invalid values!"
++msgstr ""
++
++msgid "One or more required fields have no value!"
++msgstr ""
++
++msgid "Open list..."
++msgstr ""
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr ""
++
++msgid "Option removed"
++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 "Options"
++msgstr "Options"
++
++msgid "Other:"
++msgstr ""
++
++msgid "Out"
++msgstr "Out"
++
++msgid "Outbound:"
++msgstr ""
++
++msgid "Outdoor Channels"
++msgstr "Outdoor Channels"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr "Overview"
++
++msgid "Owner"
++msgstr "Owner"
++
++msgid "PAP/CHAP password"
++msgstr ""
++
++msgid "PAP/CHAP username"
++msgstr ""
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr ""
++
++msgid "PPP"
++msgstr ""
++
++msgid "PPPoA Encapsulation"
++msgstr "PPPoA Encapsulation"
++
++msgid "PPPoATM"
++msgstr ""
++
++msgid "PPPoE"
++msgstr ""
++
++msgid "PPtP"
++msgstr ""
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Package lists are older than 24 hours"
++msgstr ""
++
++msgid "Package name"
++msgstr "Package name"
++
++msgid "Packets"
++msgstr "Packets"
++
++msgid "Part of zone %q"
++msgstr ""
++
++msgid "Password"
++msgstr "Password"
++
++msgid "Password authentication"
++msgstr "Password authentication"
++
++msgid "Password of Private Key"
++msgstr "Password of Private Key"
++
++msgid "Password successfully changed!"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr "Path to CA-Certificate"
++
++msgid "Path to Client-Certificate"
++msgstr ""
++
++msgid "Path to Private Key"
++msgstr "Path to Private Key"
++
++msgid "Path to executable which handles the button event"
++msgstr ""
++
++msgid "Peak:"
++msgstr ""
++
++msgid "Perform reboot"
++msgstr "Perform reboot"
++
++msgid "Perform reset"
++msgstr ""
++
++msgid "Phy Rate:"
++msgstr ""
++
++msgid "Physical Settings"
++msgstr "Physical Settings"
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr "Pkts."
++
++msgid "Please enter your username and password."
++msgstr "Please enter your username and password."
++
++msgid "Policy"
++msgstr "Policy"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Port %d"
++msgstr ""
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr ""
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr "Prevents client-to-client communication"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr "Proceed"
++
++msgid "Processes"
++msgstr "Processes"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Protocol of the new interface"
++msgstr ""
++
++msgid "Protocol support is not installed"
++msgstr ""
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr ""
++
++msgid "RTS/CTS Threshold"
++msgstr "RTS/CTS Threshold"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr ""
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr ""
++
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr ""
++
++msgid "Realtime Connections"
++msgstr ""
++
++msgid "Realtime Graphs"
++msgstr ""
++
++msgid "Realtime Load"
++msgstr ""
++
++msgid "Realtime Traffic"
++msgstr ""
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr "Reboot"
++
++msgid "Rebooting..."
++msgstr ""
++
++msgid "Reboots the operating system of your device"
++msgstr "Reboots the operating system of your device"
++
++msgid "Receive"
++msgstr "Receive"
++
++msgid "Receiver Antenna"
++msgstr "Receiver Antenna"
++
++msgid "Reconnect this interface"
++msgstr ""
++
++msgid "Reconnecting interface"
++msgstr ""
++
++msgid "References"
++msgstr "References"
++
++msgid "Regulatory Domain"
++msgstr "Regulatory Domain"
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr ""
++
++msgid "Remove"
++msgstr "Remove"
++
++msgid "Repeat scan"
++msgstr "Repeat scan"
++
++msgid "Replace entry"
++msgstr "Replace entry"
++
++msgid "Replace wireless configuration"
++msgstr ""
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++
++msgid "Reset"
++msgstr "Reset"
++
++msgid "Reset Counters"
++msgstr "Reset Counters"
++
++msgid "Reset to defaults"
++msgstr ""
++
++msgid "Resolv and Hosts Files"
++msgstr ""
++
++msgid "Resolve file"
++msgstr ""
++
++msgid "Restart"
++msgstr "Restart"
++
++msgid "Restart Firewall"
++msgstr "Restart Firewall"
++
++msgid "Restore backup"
++msgstr "Restore backup"
++
++msgid "Reveal/hide password"
++msgstr ""
++
++msgid "Revert"
++msgstr "Revert"
++
++msgid "Root"
++msgstr ""
++
++msgid "Root directory for files served via TFTP"
++msgstr ""
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr ""
++
++msgid "Routes"
++msgstr "Routes"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++
++msgid "Rule #"
++msgstr "Rule #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr ""
++
++msgid "SSH-Keys"
++msgstr ""
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Save"
++
++msgid "Save & Apply"
++msgstr "Save & Apply"
++
++msgid "Save &#38; Apply"
++msgstr ""
++
++msgid "Scan"
++msgstr "Scan"
++
++msgid "Scheduled Tasks"
++msgstr "Scheduled Tasks"
++
++msgid "Section added"
++msgstr ""
++
++msgid "Section removed"
++msgstr ""
++
++msgid "See \"mount\" manpage for details"
++msgstr ""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr "Separate Clients"
++
++msgid "Separate WDS"
++msgstr "Separate WDS"
++
++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 ""
++
++msgid "Service Type"
++msgstr ""
++
++msgid "Services"
++msgstr "Services"
++
++msgid "Set up Time Synchronization"
++msgstr ""
++
++msgid "Setup DHCP Server"
++msgstr ""
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr ""
++
++msgid "Shutdown this network"
++msgstr ""
++
++msgid "Signal"
++msgstr "Signal"
++
++msgid "Signal:"
++msgstr ""
++
++msgid "Size"
++msgstr "Size"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "Skip"
++
++msgid "Skip to content"
++msgstr "Skip to content"
++
++msgid "Skip to navigation"
++msgstr "Skip to navigation"
++
++msgid "Slot time"
++msgstr "Slot time"
++
++msgid "Software"
++msgstr "Software"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr ""
++
++msgid "Sorry, the object you requested was not found."
++msgstr ""
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr ""
++
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++
++msgid "Sort"
++msgstr ""
++
++msgid "Source"
++msgstr "Source"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "Specifies the button state to handle"
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr ""
++
++msgid "Start"
++msgstr "Start"
++
++msgid "Start priority"
++msgstr "Start priority"
++
++msgid "Startup"
++msgstr ""
++
++msgid "Static IPv4 Routes"
++msgstr "Static IPv4 Routes"
++
++msgid "Static IPv6 Routes"
++msgstr "Static IPv6 Routes"
++
++msgid "Static Leases"
++msgstr "Static Leases"
++
++msgid "Static Routes"
++msgstr "Static Routes"
++
++msgid "Static WDS"
++msgstr ""
++
++msgid "Static address"
++msgstr ""
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Stop"
++msgstr "Stop"
++
++msgid "Strict order"
++msgstr "Strict order"
++
++msgid "Submit"
++msgstr "Submit"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr ""
++
++msgid "Switch"
++msgstr "Switch"
++
++msgid "Switch %q"
++msgstr ""
++
++msgid "Switch %q (%s)"
++msgstr ""
++
++msgid "Switch protocol"
++msgstr ""
++
++msgid "Sync with browser"
++msgstr ""
++
++msgid "Synchronizing..."
++msgstr ""
++
++msgid "System"
++msgstr "System"
++
++msgid "System Log"
++msgstr "System Log"
++
++msgid "System Properties"
++msgstr ""
++
++msgid "System log buffer size"
++msgstr ""
++
++msgid "TCP:"
++msgstr ""
++
++msgid "TFTP Settings"
++msgstr ""
++
++msgid "TFTP server root"
++msgstr ""
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr ""
++
++msgid "Table"
++msgstr "Table"
++
++msgid "Target"
++msgstr "Target"
++
++msgid "Terminate"
++msgstr "Terminate"
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <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 ""
++"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>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"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"
++
++msgid "The following rules are currently active on this system."
++msgstr "The following rules are currently active on this system."
++
++msgid "The given network name is not unique"
++msgstr ""
++
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr ""
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes until you try to reconnect. It might be necessary to renew the "
++"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."
++msgstr ""
++"The uploaded image file does not contain a supported format. Make sure that "
++"you choose the generic image format for your platform."
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "There are no pending changes to apply!"
++msgstr ""
++
++msgid "There are no pending changes to revert!"
++msgstr ""
++
++msgid "There are no pending changes!"
++msgstr ""
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++
++msgid "This is the plain username for logging into the account"
++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 "This is the system crontab in which scheduled tasks can be defined."
++
++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 ""
++"This list gives an overview over currently running system processes and "
++"their status."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr ""
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "This page gives an overview over currently active network connections."
++
++msgid "This section contains no values yet"
++msgstr "This section contains no values yet"
++
++msgid "Time Synchronization"
++msgstr ""
++
++msgid "Time Synchronization is not configured yet."
++msgstr ""
++
++msgid "Timezone"
++msgstr "Timezone"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++
++msgid "Total Available"
++msgstr ""
++
++msgid "Traceroute"
++msgstr ""
++
++msgid "Traffic"
++msgstr "Traffic"
++
++msgid "Transfer"
++msgstr "Transfer"
++
++msgid "Transmission Rate"
++msgstr "Transmission Rate"
++
++msgid "Transmit"
++msgstr "Transmit"
++
++msgid "Transmit Power"
++msgstr "Transmit Power"
++
++msgid "Transmitter Antenna"
++msgstr "Transmitter Antenna"
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr ""
++
++msgid "Tunnel Interface"
++msgstr ""
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Turbo Mode"
++
++msgid "Tx-Power"
++msgstr ""
++
++msgid "Type"
++msgstr "Type"
++
++msgid "UDP:"
++msgstr ""
++
++msgid "UMTS only"
++msgstr ""
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr ""
++
++msgid "USB Device"
++msgstr ""
++
++msgid "UUID"
++msgstr ""
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "Unknown Error, password not changed!"
++msgstr ""
++
++msgid "Unmanaged"
++msgstr ""
++
++msgid "Unsaved Changes"
++msgstr "Unsaved Changes"
++
++msgid "Unsupported protocol type."
++msgstr ""
++
++msgid "Update lists"
++msgstr ""
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr ""
++
++msgid "Uploaded File"
++msgstr "Uploaded File"
++
++msgid "Uptime"
++msgstr "Uptime"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Use <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr ""
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr ""
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr ""
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr ""
++
++msgid "Use default gateway"
++msgstr ""
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr ""
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr "Used"
++
++msgid "Used Key Slot"
++msgstr ""
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Username"
++
++msgid "VC-Mux"
++msgstr ""
++
++msgid "VLAN Interface"
++msgstr ""
++
++msgid "VLANs on %q"
++msgstr ""
++
++msgid "VLANs on %q (%s)"
++msgstr ""
++
++msgid "VPN Server"
++msgstr ""
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr "Version"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr ""
++
++msgid "WEP Shared Key"
++msgstr ""
++
++msgid "WEP passphrase"
++msgstr ""
++
++msgid "WMM Mode"
++msgstr "WMM Mode"
++
++msgid "WPA passphrase"
++msgstr ""
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless Adapter"
++msgstr "Wireless Adapter"
++
++msgid "Wireless Network"
++msgstr "Wireless Network"
++
++msgid "Wireless Overview"
++msgstr "Wireless Overview"
++
++msgid "Wireless Security"
++msgstr "Wireless Security"
++
++msgid "Wireless is disabled or not associated"
++msgstr ""
++
++msgid "Wireless is restarting..."
++msgstr ""
++
++msgid "Wireless network is disabled"
++msgstr ""
++
++msgid "Wireless network is enabled"
++msgstr ""
++
++msgid "Wireless restarted"
++msgstr ""
++
++msgid "Wireless shut down"
++msgstr ""
++
++msgid "Write received DNS requests to syslog"
++msgstr ""
++
++msgid "XR Support"
++msgstr "XR Support"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++
++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 ""
++
++msgid "any"
++msgstr ""
++
++msgid "auto"
++msgstr "auto"
++
++msgid "automatic"
++msgstr "automatic"
++
++msgid "baseT"
++msgstr ""
++
++msgid "bridged"
++msgstr ""
++
++msgid "create:"
++msgstr ""
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "creates a bridge over specified interface(s)"
++
++msgid "dB"
++msgstr ""
++
++msgid "dBm"
++msgstr ""
++
++msgid "disable"
++msgstr "disable"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++
++msgid "forward"
++msgstr ""
++
++msgid "full-duplex"
++msgstr ""
++
++msgid "half-duplex"
++msgstr ""
++
++msgid "help"
++msgstr "help"
++
++msgid "hidden"
++msgstr ""
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "if target is a network"
++
++msgid "input"
++msgstr ""
++
++msgid "kB"
++msgstr ""
++
++msgid "kB/s"
++msgstr ""
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "no link"
++msgstr ""
++
++msgid "none"
++msgstr "none"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr ""
++
++msgid "on"
++msgstr ""
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr ""
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "unlimited"
++msgstr ""
++
++msgid "unspecified"
++msgstr ""
++
++msgid "unspecified -or- create:"
++msgstr "unspecified -or- create:"
++
++msgid "untagged"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++msgid "« Back"
++msgstr "« Back"
++
++#~ msgid "Path"
++#~ msgstr "Path"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Please wait: Device rebooting..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++
++#~ msgid "Cached"
++#~ msgstr "Cached"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr "Configures this mount as overlay storage for block-extroot"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Frequency Hopping"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz 2nd channel above"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz 2nd channel below"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Accept router advertisements"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Advertise IPv6 on network"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "Advertised network ID"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "Allowed range is 1 to 65535"
++
++#~ msgid "Active Leases"
++#~ msgstr "Active Leases"
++
++#~ msgid "Bit Rate"
++#~ msgstr "Bit Rate"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "Configuration / Apply"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "Configuration / Changes"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "Configuration / Revert"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Encrypted\">Encr.</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++
++#~ msgid "Create Network"
++#~ msgstr "Create Network"
++
++#~ msgid "Link"
++#~ msgstr "Link"
++
++#~ msgid "Networks"
++#~ msgstr "Networks"
++
++#~ msgid "Power"
++#~ msgstr "Power"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Wifi networks in your local environment"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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."
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Files to be kept when flashing a new firmware"
++
++#~ msgid "General"
++#~ msgstr "General"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++
++#~ msgid "Post-commit actions"
++#~ msgstr "Post-commit actions"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Web <abbr title=\"User Interface\">UI</abbr>"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++
++#~ msgid "ARP ping retries"
++#~ msgstr "ARP ping retries"
++
++#~ msgid "ATM Settings"
++#~ msgstr "ATM Settings"
++
++#~ msgid "Accept Router Advertisements"
++#~ msgstr "Accept Router Advertisements"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Access point (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Additional pppd options"
++
++#~ msgid "Allowed range is 1 to FFFF"
++#~ msgstr "Allowed range is 1 to FFFF"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Automatic Disconnect"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Backup Archive"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++
++#~ msgid "Connect script"
++#~ msgstr "Connect script"
++
++#~ msgid "Create backup"
++#~ msgstr "Create backup"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Disconnect script"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Edit package lists and installation targets"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Enable IPv6 on PPP link"
++
++#~ msgid "Firmware image"
++#~ msgstr "Firmware image"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++
++#~ msgid "Installation targets"
++#~ msgstr "Installation targets"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Keep configuration files"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Keep-Alive"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr "Let pppd run this script after establishing the PPP link"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "Let pppd run this script before tearing down the PPP link"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr "Number of failed connection tests to initiate automatic reconnect"
++
++#~ msgid "PIN code"
++#~ msgstr "PIN code"
++
++#~ msgid "PPP Settings"
++#~ msgstr "PPP Settings"
++
++#~ msgid "Package lists"
++#~ msgstr "Package lists"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr "Proceed reverting all settings and resetting to firmware defaults?"
++
++#~ msgid "Processor"
++#~ msgstr "Processor"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Radius-Port"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Radius-Server"
++
++#~ msgid "Replace default route"
++#~ msgstr "Replace default route"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Reset router to defaults"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++
++#~ msgid "Service type"
++#~ msgstr "Service type"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr "Services and daemons perform certain tasks on your device."
++
++#~ msgid "Settings"
++#~ msgstr "Settings"
++
++#~ msgid "Setup wait time"
++#~ msgstr "Setup wait time"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr "Specify additional command line arguments for pppd here"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "The device node of your modem, e.g. /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr "Time (in seconds) after which an unused connection will be closed"
++
++#~ msgid "Update package lists"
++#~ msgstr "Update package lists"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "Upload an OpenWrt image file to reflash the device."
++
++#~ msgid "Upload image"
++#~ msgstr "Upload image"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "Use peer DNS"
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++
++#~ msgid "back"
++#~ msgstr "back"
++
++#~ msgid "buffered"
++#~ msgstr "buffered"
++
++#~ msgid "cached"
++#~ msgstr "cached"
++
++#~ msgid "free"
++#~ msgstr "free"
++
++#~ msgid "static"
++#~ msgstr "static"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++
++#~ msgid "About"
++#~ msgstr "About"
++
++#~ msgid "Active IP Connections"
++#~ msgstr "Active IP Connections"
++
++#~ msgid "Addresses"
++#~ msgstr "Addresses"
++
++#~ msgid "Admin Password"
++#~ msgstr "Admin Password"
++
++#~ msgid "Alias"
++#~ msgstr "Alias"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Authentication Realm"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Bridge Port"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Client + WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "Configuration file"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Connection timeout"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Contributing Developers"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "DHCP assigned"
++
++#~ msgid "Document root"
++#~ msgstr "Document root"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Enable Keep-Alive"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "Ethernet Bridge"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++
++#~ msgid "ID"
++#~ msgstr "ID"
++
++#~ msgid "IP Configuration"
++#~ msgstr "IP Configuration"
++
++#~ msgid "Interface Status"
++#~ msgstr "Interface Status"
++
++#~ msgid "Lead Development"
++#~ msgstr "Lead Development"
++
++#~ msgid "Master"
++#~ msgstr "Master"
++
++#~ msgid "Master + WDS"
++#~ msgstr "Master + WDS"
++
++#~ msgid "Not configured"
++#~ msgstr "Not configured"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Password successfully changed"
++
++#~ msgid "Plugin path"
++#~ msgstr "Plugin path"
++
++#~ msgid "Ports"
++#~ msgstr "Ports"
++
++#~ msgid "Primary"
++#~ msgstr "Primary"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Project Homepage"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "Pseudo Ad-Hoc"
++
++#~ msgid "STP"
++#~ msgstr "STP"
++
++#~ msgid "Thanks To"
++#~ msgstr "Thanks To"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++
++#~ msgid "Unknown Error"
++#~ msgstr "Unknown Error"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "defaults to <code>/etc/httpd.conf</code>"
++
++#~ msgid "OPKG error code %i"
++#~ msgstr "OPKG error code %i"
++
++#~ msgid "Package lists updated"
++#~ msgstr "Package lists updated"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Upgrade installed packages"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++
++#~ msgid "Search file..."
++#~ msgstr "Search file..."
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "And now have fun with your router!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++
++#~ msgid "Hello!"
++#~ msgstr "Hello!"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++
++#~ msgid "User Interface"
++#~ msgstr "User Interface"
++
++#~ msgid "enable"
++#~ msgstr "enable"
++
++#~ msgid "(hidden)"
++#~ msgstr "(hidden)"
++
++#~ msgid "(optional)"
++#~ msgstr "(optional)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Extension Mechanisms "
++#~ "for Domain Name System\">EDNS0</abbr> packet size"
++#~ msgstr ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Extension Mechanisms "
++#~ "for Domain Name System\">EDNS0</abbr> packet size"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "AP-Isolation"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "Add the Wifi network to physical network"
++
++#~ msgid "Aliases"
++#~ msgstr "Aliases"
++
++#~ msgid "Attach to existing network"
++#~ msgstr "Attach to existing network"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Clamp Segment Size"
++
++#~ msgid "Create Or Attach Network"
++#~ msgstr "Create Or Attach Network"
++
++#~ msgid "DHCP"
++#~ msgstr "DHCP"
++
++#~ msgid "Devices"
++#~ msgstr "Devices"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "Don&#39;t forward reverse lookups for local networks"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "Enable TFTP-Server"
++
++#~ msgid "Errors"
++#~ msgstr "Errors"
++
++#~ msgid "Essentials"
++#~ msgstr "Essentials"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Expand Hosts"
++
++#~ msgid "First leased address"
++#~ msgstr "First leased address"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++
++#~ msgid "Hardware Address"
++#~ msgstr "Hardware Address"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "Here you can configure installed wifi devices."
++
++#~ msgid ""
++#~ "If the interface is attached to an existing network it will be "
++#~ "<em>bridged</em> to the existing interfaces and is covered by the "
++#~ "firewall zone of the choosen network.<br />Uncheck the attach option to "
++#~ "define a new standalone network for this interface."
++#~ msgstr ""
++#~ "If the interface is attached to an existing network it will be "
++#~ "<em>bridged</em> to the existing interfaces and is covered by the "
++#~ "firewall zone of the choosen network.<br />Uncheck the attach option to "
++#~ "define a new standalone network for this interface."
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "Independent (Ad-Hoc)"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Internet Connection"
++
++#~ msgid "Join (Client)"
++#~ msgstr "Join (Client)"
++
++#~ msgid "Leases"
++#~ msgstr "Leases"
++
++#~ msgid "Local Domain"
++#~ msgstr "Local Domain"
++
++#~ msgid "Local Network"
++#~ msgstr "Local Network"
++
++#~ msgid "Local Server"
++#~ msgstr "Local Server"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "Network Boot Image"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "Number of leased addresses"
++
++#~ msgid "Perform Actions"
++#~ msgstr "Perform Actions"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "Prevents Client to Client communication"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "Provide (Access Point)"
++
++#~ msgid "Resolvfile"
++#~ msgstr "Resolvfile"
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "TFTP-Server Root"
++
++#~ msgid "TX / RX"
++#~ msgstr "TX / RX"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "The following changes have been applied"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++
++#~ msgid "Wireless Scan"
++#~ msgstr "Wireless Scan"
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++
++#~ msgid ""
++#~ "You are about to join the wireless network <em><strong>%s</strong></em>. "
++#~ "In order to complete the process, you need to provide some additional "
++#~ "details."
++#~ msgstr ""
++#~ "You are about to join the wireless network <em><strong>%s</strong></em>. "
++#~ "In order to complete the process, you need to provide some additional "
++#~ "details."
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++
++#~ msgid ""
++#~ "You need to install <a href='%s'><em>wpa-supplicant</em></a> to use WPA!"
++#~ msgstr ""
++#~ "You need to install <a href='%s'><em>wpa-supplicant</em></a> to use WPA!"
++
++#~ msgid ""
++#~ "You need to install the <a href='%s'>Broadcom <em>nas</em> supplicant</a> "
++#~ "to use WPA!"
++#~ msgstr ""
++#~ "You need to install the <a href='%s'>Broadcom <em>nas</em> supplicant</a> "
++#~ "to use WPA!"
++
++#~ msgid "Zone"
++#~ msgstr "Zone"
++
++#~ msgid "additional hostfile"
++#~ msgstr "additional hostfile"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr "adds domain names to hostentries in the resolv file"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "automatically reconnect"
++
++#~ msgid "concurrent queries"
++#~ msgstr "concurrent queries"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "disconnect when idle for"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "don&#39;t cache unknown"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++
++#~ msgid "installed"
++#~ msgstr "installed"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "localises the hostname depending on its subnet"
++
++#~ msgid "manual"
++#~ msgstr "manual"
++
++#~ msgid "not installed"
++#~ msgstr "not installed"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++
++#~ msgid "query port"
++#~ msgstr "query port"
++
++#~ msgid "transmitted / received"
++#~ msgstr "transmitted / received"
++
++#~ msgid "all"
++#~ msgstr "all"
++
++#~ msgid "Code"
++#~ msgstr "Code"
++
++#~ msgid "Distance"
++#~ msgstr "Distance"
++
++#~ msgid "Legend"
++#~ msgstr "Legend"
++
++#~ msgid "Library"
++#~ msgstr "Library"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "see &#39;%s&#39; manpage"
++
++#~ msgid "Package Manager"
++#~ msgstr "Package Manager"
++
++#~ msgid "Service"
++#~ msgstr "Service"
++
++#~ msgid "Statistics"
++#~ msgstr "Statistics"
++
++#~ msgid "zone"
++#~ msgstr "Zone"
+diff --git a/feeds/luci/modules/luci-base/po/es/base.po b/feeds/luci/modules/luci-base/po/es/base.po
+new file mode 100644
+index 0000000..2867229
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/es/base.po
+@@ -0,0 +1,4230 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2014-05-04 11:38+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(ventana de %d minutos, intervalo de %d segundos)"
++
++msgid "(%s available)"
++msgstr "(%s está disponible)"
++
++msgid "(empty)"
++msgstr "(vacío)"
++
++msgid "(no interfaces attached)"
++msgstr "(sin interfaces conectados)"
++
++msgid "-- Additional Field --"
++msgstr "-- Campo Adicional --"
++
++msgid "-- Please choose --"
++msgstr "-- Elija, por favor --"
++
++msgid "-- custom --"
++msgstr "-- introducir --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Carga a 1 minuto:"
++
++msgid "15 Minute Load:"
++msgstr "Carga a 15 minutos:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Carga a 5 minutos:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr ""
++"<abbr title=\"Identificador de conjunto de servicios básicos\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "Puerto de consultas al <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "Puerto del servidor <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"Los servidores de <abbr title=\"Domain Name System\">DNS</abbr> se consultan "
++"en el orden en que aparecen en el fichero resolv"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++"<abbr title=\"Identificador de conjunto de servicios extendidos\">ESSID</"
++"abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "Dirección <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr ""
++"Puerta de enlace <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "Máscara de red <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"Dirección o red (CIDR)<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr ""
++"Puerta de enlace <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "Configuración de <abbr title=\"Light Emitting Diode\">LEDs</abbr>"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "Nombre del <abbr title=\"Light Emitting Diode\">LED</abbr>"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "Dirección <abbr title=\"Media Access Control\">MAC</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"Máximas cesiones <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 "Tamaño máximo de paquetes EDNS0"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "Máximo número de consultas concurrentes"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Pairwise: %s / Grupo: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "Soporte a AR"
++
++msgid "ARP retry threshold"
++msgstr "Umbral de reintento ARP"
++
++msgid "ATM Bridges"
++msgstr "Puente ATM"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "Identificador de canal virtual ATM (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "Identificador de camino virtual ATM (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"Los puentes ATM exponen conexiones AAL5 ethernet encapsuladas como "
++"interfaces de red Linux que se pueden usar junto a DHCP o PPP para conectar "
++"a la red del proveedor."
++
++msgid "ATM device number"
++msgstr "Número de dispositivo ATM"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Concentrador de acceso"
++
++msgid "Access Point"
++msgstr "Punto de Acceso"
++
++msgid "Action"
++msgstr "Acción"
++
++msgid "Actions"
++msgstr "Acciones"
++
++msgid "Activate this network"
++msgstr "Activar esta red"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "Rutas activas <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "Rutas activas <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++msgid "Active Connections"
++msgstr "Conexiones activas"
++
++msgid "Active DHCP Leases"
++msgstr "Cesiones DHCP activas"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Cesiones DHCPv6 activas"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Añadir"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++"Añadir el sufijo de dominio local a los nombres servidos desde el fichero de "
++"máquinas"
++
++msgid "Add new interface..."
++msgstr "Añadir nueva interfaz..."
++
++msgid "Additional Hosts files"
++msgstr "Ficheros de máquinas adicionales"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Dirección"
++
++msgid "Address to access local relay bridge"
++msgstr "Dirección del puente relé local"
++
++msgid "Administration"
++msgstr "Administración"
++
++msgid "Advanced Settings"
++msgstr "Configuración avanzada"
++
++msgid "Alert"
++msgstr "Alerta"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"Permitir autenticación de contraseña via <abbr title=\"Secure Shell\">SSH</"
++"abbr>"
++
++msgid "Allow all except listed"
++msgstr "Permitir a todos excepto a los de la lista"
++
++msgid "Allow listed only"
++msgstr "Permitir a los pertenecientes en la lista"
++
++msgid "Allow localhost"
++msgstr "Permitir a la propia máquina"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr "Permitir a máquinas remotas conectar a puestos SSH locales traspasados"
++
++msgid "Allow root logins with password"
++msgstr "Permitir conexiones a root con contraseña"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "Permitir al usuario <em>root</em> conectar con contraseña"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr ""
++"Permitir respuestas en el rango 127.0.0.0/8, por ejemplo para servicios RBL"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "Se creará una red adicional si deja esto desmarcado."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antena 1"
++
++msgid "Antenna 2"
++msgstr "Antena 2"
++
++msgid "Antenna Configuration"
++msgstr "Configuración de la antena"
++
++msgid "Any zone"
++msgstr "Cualquier zona"
++
++msgid "Apply"
++msgstr "Aplicar"
++
++msgid "Applying changes"
++msgstr "Aplicando cambios"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Asigne interfaces..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Estaciones asociadas"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Controlador inalámbrico 802.11%s Atheros"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Autentificación"
++
++msgid "Authoritative"
++msgstr "Autorizado"
++
++msgid "Authorization Required"
++msgstr "Conéctese"
++
++msgid "Auto Refresh"
++msgstr "Autorefresco"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Disponible"
++
++msgid "Available packages"
++msgstr "Paquetes disponibles"
++
++msgid "Average:"
++msgstr "Media:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Volver"
++
++msgid "Back to Overview"
++msgstr "Volver al resumen"
++
++msgid "Back to configuration"
++msgstr "Volver a la configuración"
++
++msgid "Back to overview"
++msgstr "Volver al resumen"
++
++msgid "Back to scan results"
++msgstr "Volver a resultados de la exploración"
++
++msgid "Background Scan"
++msgstr "Exploración en segundo plano"
++
++msgid "Backup / Flash Firmware"
++msgstr "Copia de seguridad / Grabar firmware"
++
++msgid "Backup / Restore"
++msgstr "Salvar / Restaurar"
++
++msgid "Backup file list"
++msgstr "Salvar lista de ficheros"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"Lista de ficheros a los que hacer copia de seguridad. Es una lista de "
++"ficheros de configuración cambiados por ficheros marcados por opkg, ficheros "
++"esenciales base y los patrones de copia de seguridad definidos por el "
++"usuario."
++
++msgid "Bitrate"
++msgstr "Bitrate"
++
++msgid "Bogus NX Domain Override"
++msgstr "Ignorar dominio falso NX"
++
++msgid "Bridge"
++msgstr "Puente"
++
++msgid "Bridge interfaces"
++msgstr "Puentear interfaces"
++
++msgid "Bridge unit number"
++msgstr "Número de unidad del puente"
++
++msgid "Bring up on boot"
++msgstr "Activar en el arranque"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Controlador inalámbrico 802.11%s Broadcom"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Controlador inalámbrico 802.11 BCM%04x"
++
++msgid "Buffered"
++msgstr "En búfer"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Botones"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "Uso de CPU (%)"
++
++msgid "Cancel"
++msgstr "Cancelar"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Cadena"
++
++msgid "Changes"
++msgstr "Cambios"
++
++msgid "Changes applied."
++msgstr "Cambios aplicados."
++
++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 "Check"
++msgstr "Comprobar"
++
++msgid "Checksum"
++msgstr "Comprobación"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Elija la zona del cortafuegos a la que quiere asignar esta interfaz. "
++"Seleccione <em>no especificado</em> para eliminar la interfaz de la zona "
++"asociada o rellene el campo <em>crear</em> para definir una zona nueva a la "
++"que asignarla."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Elija la red o redes a las que quiere unir esta interfaz inalámbrica o vacíe "
++"el campo <em>crear</em> para definir una red nueva."
++
++msgid "Cipher"
++msgstr "Cifrado"
++
++msgid ""
++"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)."
++msgstr ""
++"Pulse \"generar archivo\" para descargar un fichero tar con los ficheros de "
++"configuración actuales. Para reiniciar el firmware a su estado inicial pulse "
++"\"Reiniciar\" (sólo posible con imágenes squashfs)."
++
++msgid "Client"
++msgstr "Cliente"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "ID de cliente que se enviará al solicitar DHCP"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Cerrar las conexiones inactivas tras los segundos dados. Use 0 para una "
++"conexión permanente"
++
++msgid "Close list..."
++msgstr "Cerrar lista..."
++
++msgid "Collecting data..."
++msgstr "Un momento..."
++
++msgid "Command"
++msgstr "Comando"
++
++msgid "Common Configuration"
++msgstr "Configuración común"
++
++msgid "Compression"
++msgstr "Compresión"
++
++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 "Confirmation"
++msgstr "Confirmación"
++
++msgid "Connect"
++msgstr "Conectar"
++
++msgid "Connected"
++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 "Country"
++msgstr "País"
++
++msgid "Country Code"
++msgstr "Código de país"
++
++msgid "Cover the following interface"
++msgstr "Cubre el interfaz siguiente"
++
++msgid "Cover the following interfaces"
++msgstr "Cubre los siguientes interfaces"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Crear / Asignar zona de seguridad"
++
++msgid "Create Interface"
++msgstr "Crear interfaz"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Crear un puente sobre múltiples interfaces"
++
++msgid "Critical"
++msgstr "Crítico"
++
++msgid "Cron Log Level"
++msgstr "Nivel de registro de cron"
++
++msgid "Custom Interface"
++msgstr "Interfaz propio"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Personaliza el comportamiento de los <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s del dispositivo, si es posible."
++
++msgid "DHCP Leases"
++msgstr "Cesiones DHCP"
++
++msgid "DHCP Server"
++msgstr "Servidor DHCP"
++
++msgid "DHCP and DNS"
++msgstr "DHCP y DNS"
++
++msgid "DHCP client"
++msgstr "Cliente DHCP"
++
++msgid "DHCP-Options"
++msgstr "Opciones de DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr "Cesiones DHCPv6"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "Retransmisión DNS"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Depuración"
++
++msgid "Default %d"
++msgstr "%d por defecto"
++
++msgid "Default gateway"
++msgstr "Gateway por defecto"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Estado por defecto"
++
++msgid "Define a name for this network."
++msgstr "Definir un nombre para esta red."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Definir optiones adicionales DHCP, por ejemplo "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" que publica diferentes servidores "
++"DNS a los clientes."
++
++msgid "Delete"
++msgstr "Eliminar"
++
++msgid "Delete this interface"
++msgstr "Borrar esta interfaz"
++
++msgid "Delete this network"
++msgstr "Borrar esta red"
++
++msgid "Description"
++msgstr "Descripción"
++
++msgid "Design"
++msgstr "Diseño"
++
++msgid "Destination"
++msgstr "Destino"
++
++msgid "Device"
++msgstr "Dispositivo"
++
++msgid "Device Configuration"
++msgstr "Configuración del dispositivo"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnósticos"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Directorio"
++
++msgid "Disable"
++msgstr "Desactivar"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Desactivar <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++"para esta interfaz."
++
++msgid "Disable DNS setup"
++msgstr "Desactivar configuración de DNS"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Desactivar el temporizador de baliza hardware"
++
++msgid "Disabled"
++msgstr "Desactivar"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Descartar respuestas RFC1918 salientes"
++
++msgid "Displaying only packages containing"
++msgstr "Mostrar sólo paquete que contienen"
++
++msgid "Distance Optimization"
++msgstr "Optimización de distancia"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Distancia al miembro de la red mas lejana en metros."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Diversidad"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq es un programa que combina un servidor <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr> y un reenviador <abbr title=\"Domain "
++"Name System\">DNS</abbr> para cortafuegos <abbr title=\"Network Address "
++"Translation\">NAT</abbr>"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr "No guardar respuestas negativas, por ejemplo dominios inexistentes"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr ""
++"No retransmitir peticiones que no se puedan responder por servidores de "
++"nombres públicos"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr "No retransmitir búsquedas inversas para redes locales"
++
++msgid "Do not send probe responses"
++msgstr "No enviar respuestas de prueba"
++
++msgid "Domain required"
++msgstr "Dominio requerido"
++
++msgid "Domain whitelist"
++msgstr "Lista blanca de dominios"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"No reenviar peticiones de <abbr title=\"Domain Name System\">DNS</abbr> sin "
++"un nombre de <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid "Download and install package"
++msgstr "Descargar e instalar paquete"
++
++msgid "Download backup"
++msgstr "Descargar copia de seguridad"
++
++msgid "Dropbear Instance"
++msgstr "Instancia Dropbear"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear ofrece acceso <abbr title=\"Secure Shell\">SSH</abbr> y un servidor "
++"<abbr title=\"Secure Copy\">SCP</abbr>"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> dinámico"
++
++msgid "Dynamic tunnel"
++msgstr "Túnel dinámico"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"Reparte direcciones DHCP dinámicamente a los clientes. Si se desactiva sólo "
++"se servirá a clientes con cesiones estáticas."
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "Método EAP"
++
++msgid "Edit"
++msgstr "Editar"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Editar esta interfaz"
++
++msgid "Edit this network"
++msgstr "Editar esta red"
++
++msgid "Emergency"
++msgstr "Emergencia"
++
++msgid "Enable"
++msgstr "Activar"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Activar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "Activar actualización dinámica de punto final HE.net"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "Activar paso de tramas jumbo"
++
++msgid "Enable NTP client"
++msgstr "Activar cliente NTP"
++
++msgid "Enable TFTP server"
++msgstr "Activar servidor TFTP"
++
++msgid "Enable VLAN functionality"
++msgstr "Activar funcionalidad VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Activar aprendizaje y envejecimiento"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "Active este punto de montaje"
++
++msgid "Enable this swap"
++msgstr "Activar este swap"
++
++msgid "Enable/Disable"
++msgstr "Activar/Desactivar"
++
++msgid "Enabled"
++msgstr "Activado"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Activa el protocol STP en este puente"
++
++msgid "Encapsulation mode"
++msgstr "Modo de encapsulado"
++
++msgid "Encryption"
++msgstr "Encriptación"
++
++msgid "Erasing..."
++msgstr "Borrando..."
++
++msgid "Error"
++msgstr "Error"
++
++msgid "Ethernet Adapter"
++msgstr "Adaptador ethernet"
++
++msgid "Ethernet Switch"
++msgstr "Switch ethernet"
++
++msgid "Expand hosts"
++msgstr "Expandir nombre de máquina"
++
++msgid "Expires"
++msgstr "Expira"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++"Tiempo de finalización de direcciones cedidas (mínimo dos minutos: <code>2m</"
++"code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Servidor externo de registro del sistema"
++
++msgid "External system log server port"
++msgstr "Puerto del servidor externo de registro del sistema"
++
++msgid "Fast Frames"
++msgstr "Tramas rápidas"
++
++msgid "File"
++msgstr "Fichero"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Nombre del fichero de imagen de arranque mostrado a los clientes"
++
++msgid "Filesystem"
++msgstr "Sistema de ficheros"
++
++msgid "Filter"
++msgstr "Filtro"
++
++msgid "Filter private"
++msgstr "Filtro privado"
++
++msgid "Filter useless"
++msgstr "Filtro inútil"
++
++msgid "Find and join network"
++msgstr "Encontrar y unirse a red"
++
++msgid "Find package"
++msgstr "Buscar paquete"
++
++msgid "Finish"
++msgstr "Terminar"
++
++msgid "Firewall"
++msgstr "Cortafuegos"
++
++msgid "Firewall Settings"
++msgstr "Configuración del cortafuegos"
++
++msgid "Firewall Status"
++msgstr "Estado del cortafuegos"
++
++msgid "Firmware Version"
++msgstr "Versión del firmware"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "Puerto origen fijo para peticiones de DNS salientes"
++
++msgid "Flags"
++msgstr "Indicadores"
++
++msgid "Flash Firmware"
++msgstr "Grabar firmware"
++
++msgid "Flash image..."
++msgstr "Grabar imagen..."
++
++msgid "Flash new firmware image"
++msgstr "Grabar imágenes del firmware"
++
++msgid "Flash operations"
++msgstr "Operaciones de grabado"
++
++msgid "Flashing..."
++msgstr "Grabando..."
++
++msgid "Force"
++msgstr "Forzar"
++
++msgid "Force CCMP (AES)"
++msgstr "Forzar CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr "Forzar DHCP en esta red aunque se detecte otro servidor."
++
++msgid "Force TKIP"
++msgstr "Forzar TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "Forzar TKIP y CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "Retransmitir tráfico DHCP"
++
++msgid "Forward broadcast traffic"
++msgstr "Retransmitir tráfico de propagación"
++
++msgid "Forwarding mode"
++msgstr "Modo de retransmisión"
++
++msgid "Fragmentation Threshold"
++msgstr "Umbral de fragmentación"
++
++# It should be "Frame Bursting" at once!
++msgid "Frame Bursting"
++msgstr "Frame Bursting"
++
++msgid "Free"
++msgstr "Libre"
++
++msgid "Free space"
++msgstr "Espacio libre"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "Sólo GPRS"
++
++msgid "Gateway"
++msgstr "Pasarela"
++
++msgid "Gateway ports"
++msgstr "Puertos del gateway"
++
++msgid "General Settings"
++msgstr "Configuración general"
++
++msgid "General Setup"
++msgstr "Configuración general"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "Generar archivo"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Controlador inalámbrico 802.11%s genérico"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++"La confirmación y la contraseña no coinciden. ¡No se ha cambiado la "
++"contraseña!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Ir a configuración de contraseña..."
++
++msgid "Go to relevant configuration page"
++msgstr "Ir a la página principal de configuración"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "Contraseña HE.net"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Manejador"
++
++msgid "Hang Up"
++msgstr "Suspender"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Aspectos básicos de su dispositivo como la zona horaria o nombre de máquina."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr "Claves públicas SSH. Ponga una por línea."
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Controlador inalámbrico 802.11b Hermes"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "Ocultar <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "Entradas de máquina"
++
++msgid "Host expiry timeout"
++msgstr "Espera para caducidad de máquinas"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++"Dirección <abbr title=\"Internet Protocol Address\">IP</abbr> de máquina o "
++"red"
++
++msgid "Hostname"
++msgstr "Nombre de máquina"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "Nombre de máquina a enviar cuando se solicite DHCP"
++
++msgid "Hostnames"
++msgstr "Nombres de máquina"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "Dirección IP"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "Cortafuegos IPv4"
++
++msgid "IPv4 WAN Status"
++msgstr "Estado de la WAN IPv4"
++
++msgid "IPv4 address"
++msgstr "Dirección IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "Propagación IPv4"
++
++msgid "IPv4 gateway"
++msgstr "Gateway IPv4"
++
++msgid "IPv4 netmask"
++msgstr "Máscara de red IPv4"
++
++msgid "IPv4 only"
++msgstr "Sólo IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "Longitud de prefijo IPv4"
++
++msgid "IPv4-Address"
++msgstr "Dirección IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "Cortafuegos IPv6"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "Estado de la WAN IPv6"
++
++msgid "IPv6 address"
++msgstr "Dirección IPv6"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "Gateway IPv6"
++
++msgid "IPv6 only"
++msgstr "Sólo IPv6"
++
++msgid "IPv6 prefix"
++msgstr "Prefijo IPv6"
++
++msgid "IPv6 prefix length"
++msgstr "Longitud de prefijo IPv6"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "Dirección IPv6"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-en-IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6-sobre-IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6-sobre-IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "Identidad"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++"Montar el dispositivo por su UUID en vez de un nodo fijo de dispositivo si "
++"se especifica"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++"Montar el dispositivo por la etiqueta de la partición en vez de por el nodo "
++"fijo de dispositivo si se especifica"
++
++msgid "If unchecked, no default route is configured"
++msgstr "Si está desmarcado no se configurará una ruta por defecto"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++"Si está desmarcado las direcciones de servidor DNS anunciadas se ignorarán"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Si su dispositivo no tiene memoria <abbr title=\"Random Access Memory\">RAM</"
++"abbr> suficiente, los datos no utilizados pueden ser guardados temporalmente "
++"en un dispositivo de intercambio (swap-device) liberando el espacio que "
++"ocupan. Tenga en cuenta que el intercambio es un proceso lento porque los "
++"dispositivos de intercambio no pueden transferir volúmenes de información a "
++"alta velocidad tal y como hace la memoria <abbr title=\"Random Access Memory"
++"\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Ignorar <code>/etc/hosts</code>"
++
++msgid "Ignore interface"
++msgstr "Ignorar interfaz"
++
++msgid "Ignore resolve file"
++msgstr "Ignorar el fichero resolv"
++
++msgid "Image"
++msgstr "Imagen"
++
++msgid "In"
++msgstr "Entrada"
++
++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 "Espera de inactividad"
++
++msgid "Inbound:"
++msgstr "Entrantes:"
++
++msgid "Info"
++msgstr "Información"
++
++msgid "Initscript"
++msgstr "Nombre del script de inicio"
++
++msgid "Initscripts"
++msgstr "Scripts de inicio"
++
++msgid "Install"
++msgstr "Instalar"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Instalar el paquete %q"
++
++msgid "Install protocol extensions..."
++msgstr "Instalar extensiones de protocolo..."
++
++msgid "Installed packages"
++msgstr "Paquetes instalados"
++
++msgid "Interface"
++msgstr "Interfaz"
++
++msgid "Interface Configuration"
++msgstr "Configuración del interfaz"
++
++msgid "Interface Overview"
++msgstr "Resumen de interfaces"
++
++msgid "Interface is reconnecting..."
++msgstr "Reconectando interfaz..."
++
++msgid "Interface is shutting down..."
++msgstr "Parando interfaz..."
++
++msgid "Interface not present or not connected yet."
++msgstr "El interfaz no existe o no está aún conectado."
++
++msgid "Interface reconnected"
++msgstr "Interfaz reconectado"
++
++msgid "Interface shut down"
++msgstr "Interfaz detenido"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "Error interno del servidor"
++
++msgid "Invalid"
++msgstr "Valor ingresado inválido"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr "¡ID VLAN no válido! Sólo se permiten IDs entre %d y %d."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "¡ID VLAN no válido! Sólo se permiten IDs únicos"
++
++msgid "Invalid username and/or password! Please try again."
++msgstr ""
++"¡Nombre de usuario o contraseña no válidos!. Pruebe de nuevo, por favor."
++
++#, 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 ""
++"Parece que está intentando grabar una imagen de firmware mayor que la "
++"memoria flash de su equipo. ¡Por favor, verifique el archivo!"
++
++msgid "Java Script required!"
++msgstr "¡Se necesita JavaScript!"
++
++msgid "Join Network"
++msgstr "Unirse a Red"
++
++msgid "Join Network: Settings"
++msgstr "Unirse a Red: Configuración"
++
++msgid "Join Network: Wireless Scan"
++msgstr "Unirse a una red: Exploración inalámbrica"
++
++msgid "Keep settings"
++msgstr "Conservar la configuración del router"
++
++msgid "Kernel Log"
++msgstr "Registro del Kernel"
++
++msgid "Kernel Version"
++msgstr "Versión del Kernel"
++
++msgid "Key"
++msgstr "Clave"
++
++msgid "Key #%d"
++msgstr "Clave #%d"
++
++msgid "Kill"
++msgstr "Matar"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "Servidor L2TP"
++
++msgid "LCP echo failure threshold"
++msgstr "Umbral de fracaso en eco LCP"
++
++msgid "LCP echo interval"
++msgstr "Intervalo de eco LCP"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Etiqueta"
++
++msgid "Language"
++msgstr "Idioma"
++
++msgid "Language and Style"
++msgstr "Idioma y Estilo"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Tiempo de validación de cesión"
++
++msgid "Leasefile"
++msgstr "Archivo de cesiones"
++
++msgid "Leasetime"
++msgstr "Tiempo de cesión"
++
++msgid "Leasetime remaining"
++msgstr "Tiempo de cesión restante"
++
++msgid "Leave empty to autodetect"
++msgstr "Dejar vacío para autodetectar"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "Dejar vacío para usar la dirección WAN actual"
++
++msgid "Legend:"
++msgstr "Leyenda:"
++
++msgid "Limit"
++msgstr "Límite"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Enlace activado"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"Lista de servidores <abbr title=\"Domain Name System\">DNS</abbr> a los que "
++"enviar solicitudes"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "Lista de dominios a los que se permiten respuestas RFC1918"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr "Lista de máquinas que proporcionan resultados de dominio NX falsos"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr "Escucha solo en la interfaz dada o, si no se especifica, en todas"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Puerto de escucha para consultas DNS entrantes"
++
++msgid "Load"
++msgstr "Carga"
++
++msgid "Load Average"
++msgstr "Carga Media"
++
++msgid "Loading"
++msgstr "Cargando"
++
++msgid "Local IPv4 address"
++msgstr "Dirección local IPv4"
++
++msgid "Local IPv6 address"
++msgstr "Dirección local IPv6"
++
++msgid "Local Startup"
++msgstr "Arranque local"
++
++msgid "Local Time"
++msgstr "Hora local"
++
++msgid "Local domain"
++msgstr "Dominio local"
++
++#, fuzzy
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++"Especificación de dominio local. Los nombres que coincidan con este dominio "
++"nunca se retransmiten y se resuelven desde DHCP o ficheros de máquina locales"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++"Sufijo del dominio local que se añade a los nombres DHCP y a las entradas "
++"del fichero de máquinas"
++
++msgid "Local server"
++msgstr "Servidor local"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++"Localizar nombre de máquina dependiendo de que la subred peticionaria si hay "
++"disponibles múltiples IPs"
++
++msgid "Localise queries"
++msgstr "Localizar consultas"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Nivel de registro"
++
++msgid "Log queries"
++msgstr "Registrar consultas"
++
++msgid "Logging"
++msgstr "Registro"
++
++msgid "Login"
++msgstr "Iniciar sesión"
++
++msgid "Logout"
++msgstr "Cerrar sesión"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr "Dirección cedida más baja como diferencia de la dirección de red."
++
++msgid "MAC-Address"
++msgstr "Dirección MAC"
++
++msgid "MAC-Address Filter"
++msgstr "Filtro por dirección MAC"
++
++msgid "MAC-Filter"
++msgstr "Filtro por dirección MAC"
++
++msgid "MAC-List"
++msgstr "Lista de direcciones MAC"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Ratio Máximo"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "Número máximo de cesiones DHCP activas"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "Número máximo de consultas DNS concurrentes"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "Tamaño máximo de paquetes EDNS.0 paquetes UDP"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "Segundos máximos de espera a que el módem esté activo"
++
++msgid "Maximum hold time"
++msgstr "Pausa máxima de transmisión"
++
++msgid "Maximum number of leased addresses."
++msgstr "Máximas cesiones activas."
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "Memoria"
++
++msgid "Memory usage (%)"
++msgstr "Uso de memoria (%)"
++
++msgid "Metric"
++msgstr "Métrica"
++
++msgid "Minimum Rate"
++msgstr "Ratio mínimo"
++
++msgid "Minimum hold time"
++msgstr "Pausa mínima de espera"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "Extensión de protocolo faltante para %q"
++
++msgid "Mode"
++msgstr "Modo"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Dispositivo de módem"
++
++msgid "Modem init timeout"
++msgstr "Espera de inicialización del modem"
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr "Entrada de montaje"
++
++msgid "Mount Point"
++msgstr "Punto de montaje"
++
++msgid "Mount Points"
++msgstr "Puntos de montaje"
++
++msgid "Mount Points - Mount Entry"
++msgstr "Puntos de montaje - Entrada de montaje"
++
++msgid "Mount Points - Swap Entry"
++msgstr "Puntos de montaje - Entrada de intercambio"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Los puntos de montaje definen el directorio en el que un dispositivo de "
++"memoria se unirá al sistema del archivos"
++
++msgid "Mount options"
++msgstr "Opciones de montaje"
++
++msgid "Mount point"
++msgstr "Punto de montaje"
++
++msgid "Mounted file systems"
++msgstr "Sistemas de archivo montados"
++
++msgid "Move down"
++msgstr "Bajar"
++
++msgid "Move up"
++msgstr "Subir"
++
++msgid "Multicast Rate"
++msgstr "Ratio multicast"
++
++msgid "Multicast address"
++msgstr "Dirección multicast"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "Servidores NTP a consultar"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Nombre"
++
++msgid "Name of the new interface"
++msgstr "Nombre de la nueva interfaz"
++
++msgid "Name of the new network"
++msgstr "Nombre de la nueva red"
++
++msgid "Navigation"
++msgstr "Navegación"
++
++msgid "Netmask"
++msgstr "Máscara de red"
++
++msgid "Network"
++msgstr "Red"
++
++msgid "Network Utilities"
++msgstr "Utilidades de red"
++
++msgid "Network boot image"
++msgstr "Imagen de arranque en red"
++
++msgid "Network without interfaces."
++msgstr "Red sin interfaces."
++
++msgid "Next »"
++msgstr "Siguiente »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "No se ha configurado un servidor DHCP para esta interfaz"
++
++msgid "No chains in this table"
++msgstr "No hay cadenas en esta tabla"
++
++msgid "No files found"
++msgstr "No se han encontrado ficheros"
++
++msgid "No information available"
++msgstr "No hay información disponible"
++
++msgid "No negative cache"
++msgstr "Sin caché negativa"
++
++msgid "No network configured on this device"
++msgstr "No hay red configurada para este dispositivo"
++
++msgid "No network name specified"
++msgstr "No se ha especificado un nombre de red"
++
++msgid "No package lists available"
++msgstr "No hay listas de paquetes disponibles"
++
++msgid "No password set!"
++msgstr "¡Sin contraseña!"
++
++msgid "No rules in this chain"
++msgstr "No hay reglas en esta cadena"
++
++msgid "No zone assigned"
++msgstr "Sin zona asignada"
++
++msgid "Noise"
++msgstr "Ruido"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Ruido:"
++
++msgid "None"
++msgstr "Ninguno"
++
++msgid "Normal"
++msgstr "Normal"
++
++msgid "Not Found"
++msgstr "No encontrado"
++
++msgid "Not associated"
++msgstr "No asociado"
++
++msgid "Not connected"
++msgstr "No conectado"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Nota: se borrarán los ficheros de configuración."
++
++msgid "Notice"
++msgstr "Aviso"
++
++msgid "Nslookup"
++msgstr "NSLookup"
++
++msgid "OK"
++msgstr "Aceptar"
++
++msgid "OPKG-Configuration"
++msgstr "Configuración de OPKG"
++
++msgid "Off-State Delay"
++msgstr "Retraso de desconexión"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Configure las interfaces de red. Puede hacer puentes con diferentes "
++"interfaces, marcando el campo \"puentear interfaces\" e introduciendo el "
++"nombre de las mismas separadas por espacios. También puede usar la notación "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr>, <samp>INTERFACE."
++"VLANNR</samp> (<abbr title=\"por ejemplo\">Ej.</abbr>: <samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr "Retraso de activación"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "¡Debe especificar al menos un nombre de máquina o dirección mac!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "¡Valores no válidos!"
++
++msgid "One or more required fields have no value!"
++msgstr "¡Campos vacíos!"
++
++msgid "Open list..."
++msgstr "Abrir lista..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Opción cambiada"
++
++msgid "Option removed"
++msgstr "Opción eliminada"
++
++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 "Options"
++msgstr "Opciones"
++
++msgid "Other:"
++msgstr "Otros:"
++
++msgid "Out"
++msgstr "Salida"
++
++msgid "Outbound:"
++msgstr "Saliente:"
++
++msgid "Outdoor Channels"
++msgstr "Canales al aire libre"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "Ignorar dirección MAC"
++
++msgid "Override MTU"
++msgstr "Ignorar MTU"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "Ignorar la pasarela en las respuestas DHCP"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++"Ignorar la máscara de red enviada a los clientes. Normalmente se calcula "
++"desde la subred desde la que se sirve."
++
++msgid "Override the table used for internal routes"
++msgstr "Ignorar la tabla usada para rutas internas"
++
++msgid "Overview"
++msgstr "Descripción general"
++
++msgid "Owner"
++msgstr "Propietario"
++
++msgid "PAP/CHAP password"
++msgstr "Contraseña PAP/CHAP"
++
++msgid "PAP/CHAP username"
++msgstr "Nombre de usuario PAP/CHAP"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "Encapsulación PPPoA"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "¡Se necesita el paquete libiwinfo!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "Las listas de paquetes tienen más de 24 horas"
++
++msgid "Package name"
++msgstr "Nombre del paquete"
++
++msgid "Packets"
++msgstr "Paquetes"
++
++msgid "Part of zone %q"
++msgstr "Parte de zona %q"
++
++msgid "Password"
++msgstr "Contraseña"
++
++msgid "Password authentication"
++msgstr "Autentificación de contraseña"
++
++msgid "Password of Private Key"
++msgstr "Contraseña de la Clave Privada"
++
++msgid "Password successfully changed!"
++msgstr "¡Contraseña cambiada!"
++
++msgid "Path to CA-Certificate"
++msgstr "Ruta al Certificado CA"
++
++msgid "Path to Client-Certificate"
++msgstr "Camino al certificado de cliente"
++
++msgid "Path to Private Key"
++msgstr "Ruta a la Clave Privada"
++
++msgid "Path to executable which handles the button event"
++msgstr "Ruta al ejecutable que maneja el evento button"
++
++msgid "Peak:"
++msgstr "Pico:"
++
++msgid "Perform reboot"
++msgstr "Rearrancar"
++
++msgid "Perform reset"
++msgstr "Reiniciar"
++
++msgid "Phy Rate:"
++msgstr "Ratio Phy:"
++
++msgid "Physical Settings"
++msgstr "Configuración física"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Pkts."
++msgstr "Paq."
++
++msgid "Please enter your username and password."
++msgstr "Por favor, introduzca su nombre de usuario y contraseña."
++
++msgid "Policy"
++msgstr "Política"
++
++msgid "Port"
++msgstr "Puerto"
++
++msgid "Port %d"
++msgstr "Puerto %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr "¡El puerto %d está desmarcado en múltiples VLANs!"
++
++msgid "Port status:"
++msgstr "Estado del puerto:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++"Asumir que el otro estará muerto tras estos fallos de echo LCP, use 0 para "
++"ignorar fallos"
++
++msgid "Prevents client-to-client communication"
++msgstr "Impide la comunicación cliente a cliente"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Controlador inalámbrico 802.11n Prism2/2.5/3"
++
++msgid "Proceed"
++msgstr "Proceder"
++
++msgid "Processes"
++msgstr "Procesos"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid "Protocol family"
++msgstr "Familia de procolo"
++
++msgid "Protocol of the new interface"
++msgstr "Protocolo de la nueva interfaz"
++
++msgid "Protocol support is not installed"
++msgstr "No está instalado el soporte al protocolo"
++
++msgid "Provide NTP server"
++msgstr "Dar servicio NTP"
++
++msgid "Provide new network"
++msgstr "Introduzca una nueva red"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "Calidad"
++
++msgid "RTS/CTS Threshold"
++msgstr "Umbral RTS/CTS"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr "Ratio RX"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "Controlador inalámbrico 802.11%s RaLink"
++
++msgid "Radius-Accounting-Port"
++msgstr "Puerto de contabilidad Radius"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Secreto de contabilidad Radius"
++
++msgid "Radius-Accounting-Server"
++msgstr "Servidor de contabilidad Radius"
++
++msgid "Radius-Authentication-Port"
++msgstr "Puerto de autentificación Radius"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Secreto de autentificación Radius"
++
++msgid "Radius-Authentication-Server"
++msgstr "Servidor de autentificación Radius"
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"Leer <code>/etc/ethers</code> para configurar el servidor <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."
++msgstr ""
++"¿Está seguro de borrar esta interfaz?. ¡No será posible deshacer el "
++"borrado!\n"
++"Puede perder el acceso a este dispositivo si está conectado por esta "
++"interfaz."
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"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 "
++"borrado!\n"
++"Puede perder el acceso a este dispositivo si está conectado por esta red."
++
++msgid "Really reset all changes?"
++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 "
++"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 "
++"you are connected via this interface."
++msgstr ""
++"¿Está seguro de apagar la interfaz \"%s\"?.\n"
++"Puede perder el acceso a este dispositivo si está conectado por interfaz."
++
++msgid "Really switch protocol?"
++msgstr "¿Está seguro de querer cambiar el protocolo?"
++
++msgid "Realtime Connections"
++msgstr "Conexiones en tiempo real"
++
++msgid "Realtime Graphs"
++msgstr "Gráficas en tiempo real"
++
++msgid "Realtime Load"
++msgstr "Carga en tiempo real"
++
++msgid "Realtime Traffic"
++msgstr "Tráfico en tiempo real"
++
++msgid "Realtime Wireless"
++msgstr "Red inalámbrica en tiempo real"
++
++msgid "Rebind protection"
++msgstr "Protección contra reasociación"
++
++msgid "Reboot"
++msgstr "Rearrancar"
++
++msgid "Rebooting..."
++msgstr "Rearrancando..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Rearranque el sistema operativo de su dispositivo"
++
++msgid "Receive"
++msgstr "Recibir"
++
++msgid "Receiver Antenna"
++msgstr "Antena Receptora"
++
++msgid "Reconnect this interface"
++msgstr "Reconectar esta interfaz"
++
++msgid "Reconnecting interface"
++msgstr "Reconectando la interfaz"
++
++msgid "References"
++msgstr "Referencias"
++
++msgid "Regulatory Domain"
++msgstr "Dominio Regulador"
++
++msgid "Relay"
++msgstr "Relé"
++
++msgid "Relay Bridge"
++msgstr "Puente relé"
++
++msgid "Relay between networks"
++msgstr "Relé entre redes"
++
++msgid "Relay bridge"
++msgstr "Puente relé"
++
++msgid "Remote IPv4 address"
++msgstr "Dirección IPv4 remota"
++
++msgid "Remove"
++msgstr "Desinstalar"
++
++msgid "Repeat scan"
++msgstr "Repetir exploración"
++
++msgid "Replace entry"
++msgstr "Reemplazar entrada"
++
++msgid "Replace wireless configuration"
++msgstr "Cambiar la configuración inalámbrica"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "Necesario para ciertos ISPs, por ejemplo Charter con DOCSIS 3"
++
++msgid "Reset"
++msgstr "Reiniciar"
++
++msgid "Reset Counters"
++msgstr "Reiniciar contadores"
++
++msgid "Reset to defaults"
++msgstr "Reiniciar a valores por defecto"
++
++msgid "Resolv and Hosts Files"
++msgstr "Ficheros Resolv y Hosts"
++
++msgid "Resolve file"
++msgstr "Fichero de resolución"
++
++msgid "Restart"
++msgstr "Rearrancar"
++
++msgid "Restart Firewall"
++msgstr "Rearrancar cortafuegos"
++
++msgid "Restore backup"
++msgstr "Restaurar copia de seguridad"
++
++msgid "Reveal/hide password"
++msgstr "Mostrar/ocultar contraseña"
++
++msgid "Revert"
++msgstr "Anular"
++
++msgid "Root"
++msgstr "Raíz"
++
++msgid "Root directory for files served via TFTP"
++msgstr "Directorio raíz para los ficheros servidos por TFTP"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Contraseña del router"
++
++msgid "Routes"
++msgstr "Rutas"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Las rutas especifican sobre qué interfaz y pasarela se puede llegar a una "
++"cierta máquina o red."
++
++msgid "Rule #"
++msgstr "Nº de regla"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr "Comprobar el sistema de ficheros antes de montar el dispositivo"
++
++msgid "Run filesystem check"
++msgstr "Comprobar el sistema de ficheros"
++
++msgid ""
++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
++"use 6in4 instead"
++msgstr ""
++
++msgid "SIXXS-handle[/Tunnel-ID]"
++msgstr ""
++
++msgid "SSH Access"
++msgstr "Acceso SSH"
++
++msgid "SSH-Keys"
++msgstr "Claves SSH"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Guardar"
++
++msgid "Save & Apply"
++msgstr "Guardar y aplicar"
++
++msgid "Save &#38; Apply"
++msgstr "Guardar y aplicar"
++
++msgid "Scan"
++msgstr "Explorar"
++
++msgid "Scheduled Tasks"
++msgstr "Tareas programadas"
++
++msgid "Section added"
++msgstr "Sección añadida"
++
++msgid "Section removed"
++msgstr "Sección eliminada"
++
++msgid "See \"mount\" manpage for details"
++msgstr "Vea la página del manual de \"mount\" para detalles"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++"Enviar peticiones de echo LCP cada intervalo de segundos dado, solo efectivo "
++"usado conjuntamente con el umbral de fallo"
++
++msgid "Separate Clients"
++msgstr "Aislar clientes"
++
++msgid "Separate WDS"
++msgstr "WDS aislado"
++
++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"
++
++msgid "Service Type"
++msgstr "Tipo de servicio"
++
++msgid "Services"
++msgstr "Servicios"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "Sincronización horaria"
++
++msgid "Setup DHCP Server"
++msgstr "Configuración del servidor DHCP"
++
++msgid "Show current backup file list"
++msgstr "Mostrar lista de ficheros a salvar"
++
++msgid "Shutdown this interface"
++msgstr "Apagar esta interfaz"
++
++msgid "Shutdown this network"
++msgstr "Apagar esta red"
++
++msgid "Signal"
++msgstr "Señal"
++
++msgid "Signal:"
++msgstr "Señal:"
++
++msgid "Size"
++msgstr "Tamaño"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "Saltar"
++
++msgid "Skip to content"
++msgstr "Saltar al contenido"
++
++msgid "Skip to navigation"
++msgstr "Saltar a navegación"
++
++msgid "Slot time"
++msgstr "Tiempo asignado"
++
++msgid "Software"
++msgstr "Instalación de programas"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Algunos campos no son válidos, ¡no se pueden guardar!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Objeto no encontrado."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "El servidor encontró un error inesperado."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"No está instalado el soporte para el sysupgrade, la nueva imagen debe "
++"grabarse manualmente. Por favor, mire el wiki de OpenWrt para instrucciones "
++"de instalación específicas."
++
++msgid "Sort"
++msgstr "Ordenar"
++
++msgid "Source"
++msgstr "Origen"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "Especifica el estado de botón a manejar"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "Especifica el directorio al que está enlazado el dispositivo"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr ""
++"Especifica los puertos de escucha de esta instancia de <em>Dropbear</em>"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++"Especifica la cantidad de peticiones ARP fallidas hasta suponer muerta una "
++"máquina"
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++"Especifica la cantidad de segundos a transcurrir hasta suponer muerta una "
++"máquina"
++
++msgid "Specify the secret encryption key here."
++msgstr "Especifica la clave secreta de encriptado."
++
++msgid "Start"
++msgstr "Arrancar"
++
++msgid "Start priority"
++msgstr "Prioridad de arranque"
++
++msgid "Startup"
++msgstr "Arranque"
++
++msgid "Static IPv4 Routes"
++msgstr "Rutas estáticas IPv4"
++
++msgid "Static IPv6 Routes"
++msgstr "Rutas estáticas IPv6"
++
++msgid "Static Leases"
++msgstr "Cesiones estáticas"
++
++msgid "Static Routes"
++msgstr "Rutas estáticas"
++
++msgid "Static WDS"
++msgstr "WDS estático"
++
++msgid "Static address"
++msgstr "Dirección estática"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"Las cesiones estáticas se usan para asignar direcciones IP fijas y nombres "
++"simbólicos de máquina a clientes DHCP. También son necesarias para "
++"configuraciones de interfaz no dinámica en las que a cada máquina siempre se "
++"le quiere servir la misma dirección IP."
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Stop"
++msgstr "Parar"
++
++msgid "Strict order"
++msgstr "Orden estricto"
++
++msgid "Submit"
++msgstr "Guardar"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Entrada de intercambio"
++
++msgid "Switch"
++msgstr "Switch"
++
++msgid "Switch %q"
++msgstr "Switch %q"
++
++msgid "Switch %q (%s)"
++msgstr "Switch %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Intercambiar protocolo"
++
++msgid "Sync with browser"
++msgstr "Sincronizar con el navegador"
++
++msgid "Synchronizing..."
++msgstr "Sincronizando..."
++
++msgid "System"
++msgstr "Sistema"
++
++msgid "System Log"
++msgstr "Registro del sistema"
++
++msgid "System Properties"
++msgstr "Propiedades del sistema"
++
++msgid "System log buffer size"
++msgstr "Tamaño del buffer de registro del sistema"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "Configuración TFTP"
++
++msgid "TFTP server root"
++msgstr "Raíz del servidor TFTP"
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr "Ratio TX"
++
++msgid "Table"
++msgstr "Tabla"
++
++# Target = Meta --> Objetivo --> Destino?
++msgid "Target"
++msgstr "Objetivo"
++
++msgid "Terminate"
++msgstr "Terminar"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"La sección de <em>Configuración del dispositivo</em> ocupa la configuración "
++"física del hardware de radio como el canal, la potencia de transmisión o la "
++"selección de antena que se comparte entre todas las redes inalámbricas "
++"definidas (si el hardware de radio es capaz de ser multi-SSID). "
++"Configuración por red como encriptado o modo de operación se agrupan en "
++"<em>Configuración del interfaz</em>."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"El paquete <em>libiwinfo-lua</em> no está instalado. ¡Debe instalarlo para "
++"poder configurar la conectividad inalambrica!"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++"El prefijo IPv6 asignado por el proveedor, suele termina con <code>::</code>"
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++"Los caracteres permitidos son: <code>A-Z</code>, <code>a-z</code>, "
++"<code>0-9</code> y <code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"El archivo de dispositivo de memoria o partición (<abbr title=\"Por ejemplo"
++"\">e.j.</abbr> <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 ""
++"El sistema de archivo que fue utilizado para dar formato a la memoria (<abbr "
++"title=\"por ejemplo\">Ej.</abbr> <samp><abbr title=\"Third Extended "
++"Filesystem\">ext3</abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++"Imagen recibida. Verifique que la comprobación y tamaño del fichero recibido "
++"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"
++
++msgid "The following rules are currently active on this system."
++msgstr "Rutas activas."
++
++msgid "The given network name is not unique"
++msgstr "Nombre de red repetido"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"El hardware no es capaz de multi-SSD y la configuración actual se cambiará "
++"si continúa."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++"Longitud del prefijo IPv4 en bits, el resto se usará en direcciones IPv6."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "Longitud del prefijo IPv6 en bits"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++"Los puertos de red de este dispositivo se pueden combinar en varias <abbr "
++"title=\"Virtual Local Area Network\">VLAN</abbr>s en las que los ordenadores "
++"se pueden comunicar directamente entre ellos. Las <abbr title=\"Virtual "
++"Local Area Network\">VLAN</abbr>s se usan a menudo para separar diferentes "
++"segmentos de red. Es común que exista un puerto por defecto para subida "
++"hacia una red mayor como internet y el resto se dediquen a la red local."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "Este protocolo necesita estar asignado a un dispositivo"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++"El sistema está borrando la partición de configuración y rearrancará cuando "
++"termine."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"Escribiendo en la memoria flash.<br />¡NO APAGUE EL DISPOSITIVO!<br /> "
++"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."
++msgstr ""
++"El archivo con la imagen de firmware subido no tiene un formato adecuado. "
++"Asegúrese de haber elegido la imagen correcta para su plataforma."
++
++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 pending changes to revert!"
++msgstr "¡No hay cambios a anular!"
++
++msgid "There are no pending changes!"
++msgstr "¡Sin cambios pendientes!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"No hay dispositivo asignado aún. Por favor, enlace un dispositivo de red en "
++"la pestaña \"Configuración física\""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"No hay contraseñas en este router. Por favor, configure una contraseña para "
++"proteger el interfaz web y activar SSH."
++
++msgid "This IPv4 address of the relay"
++msgstr "Dirección IPv4 del relé"
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"Lista de patrones shell con los ficheros y directorios que se deben incluir "
++"en un sysupgrade. Los ficheros modificados en /etc/config/ y ciertas otras "
++"configuraciones se guardarán automáticamente."
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"Contenido de /etc/rc.local. Ponga sus propios comandos aquí (antes de 'exit "
++"0') para ejecutarlos al final del proceso de inicio."
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++"Esta es la dirección de punto final asignada por el broker del túnel, suele "
++"terminar con <code>:2</code>"
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Este es el único servidor <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr> en la red de área local"
++
++msgid "This is the plain username for logging into the account"
++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 "Definición de tareas programadas para crontab."
++
++msgid ""
++"This is usually the address of the nearest PoP operated by the tunnel broker"
++msgstr ""
++"Esta es normalmente la dirección del PoP más cercano operada por el broker "
++"del túnel"
++
++msgid ""
++"This list gives an overview over currently running system processes and "
++"their status."
++msgstr "Procesos de sistema que se están ejecutando actualmente y su estado."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr "Configuración de acciones personalizadas para los botones"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "Conexiones de red activas."
++
++msgid "This section contains no values yet"
++msgstr "No hay reglas definidas"
++
++msgid "Time Synchronization"
++msgstr "Sincronización horaria"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "Sincronización horaria no configurada."
++
++msgid "Timezone"
++msgstr "Zona horaria"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"Para restaurar los ficheros de configuración, debe subir primero una copia "
++"de seguridad."
++
++msgid "Total Available"
++msgstr "Total disponible"
++
++msgid "Traceroute"
++msgstr "Traceroute"
++
++msgid "Traffic"
++msgstr "Tráfico"
++
++msgid "Transfer"
++msgstr "Transferencia"
++
++msgid "Transmission Rate"
++msgstr "Tasa de Transmisión"
++
++msgid "Transmit"
++msgstr "Transmitir"
++
++msgid "Transmit Power"
++msgstr "Potencia de transmisión"
++
++msgid "Transmitter Antenna"
++msgstr "Antena Transmisora"
++
++msgid "Trigger"
++msgstr "Disparador"
++
++msgid "Trigger Mode"
++msgstr "Modo de disparador"
++
++msgid "Tunnel ID"
++msgstr "ID de túnel"
++
++msgid "Tunnel Interface"
++msgstr "Interfaz de túnel"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Modo Turbo"
++
++msgid "Tx-Power"
++msgstr "Potencia-TX"
++
++msgid "Type"
++msgstr "Tipo"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "Sólo UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "Dispositivo USB"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr "Imposible repartir"
++
++msgid "Unknown"
++msgstr "Desconocido"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Error desconocido, ¡no se ha cambiado la contraseña!"
++
++msgid "Unmanaged"
++msgstr "No gestionado"
++
++msgid "Unsaved Changes"
++msgstr "Cambios no guardados"
++
++msgid "Unsupported protocol type."
++msgstr "Tipo de protocolo no soportado."
++
++msgid "Update lists"
++msgstr "Actualizar listas"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"Suba una imagen compatible con sysupgrade para reemplazar el firmware "
++"actual. Puede marcar \"Conservar la configuración\" si lo desea (es "
++"necesario que la imagen de OpenWrt sea compatible)."
++
++msgid "Upload archive..."
++msgstr "Subir archivo..."
++
++msgid "Uploaded File"
++msgstr "Archivo subido"
++
++msgid "Uptime"
++msgstr "Tiempo activo"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Usar <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr "Usar pasarela DHCP"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "Utiliza servidores DNS anunciados por otros"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "Usa códigos de país ISO/IEC 3166 alpha2."
++
++msgid "Use MTU on tunnel interface"
++msgstr "MTU a usar en el interfaz de túnel"
++
++msgid "Use TTL on tunnel interface"
++msgstr "TTL a usar en el interfaz de túnel"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "Usar marca de propagación"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "Usar servidores DNS personalizados"
++
++msgid "Use default gateway"
++msgstr "Usar pasarela por defecto"
++
++msgid "Use gateway metric"
++msgstr "Usar métrica de la pasarela"
++
++msgid "Use routing table"
++msgstr "Usar tabla de rutas"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"Pulse el botón <em>Añadir</em> para insertar una nueva cesión. <em>Dirección "
++"MAC</em> identificará la máquina, <em>dirección IPv4</em> especificará la "
++"dirección fija a usar y <em>Nombre de máquina</em> se asignará como nombre "
++"simbólico."
++
++msgid "Used"
++msgstr "Usado"
++
++msgid "Used Key Slot"
++msgstr "Espacio de clave usado"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Nombre de usuario"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "Interfaz VLAN"
++
++msgid "VLANs on %q"
++msgstr "VLANs en %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLANs en %q (%s)"
++
++msgid "VPN Server"
++msgstr "Servidor VPN"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++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"
++
++msgid "Version"
++msgstr "Versión"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "Sistema abierto WEP"
++
++msgid "WEP Shared Key"
++msgstr "Clave compartida WEP"
++
++msgid "WEP passphrase"
++msgstr "Frase de paso WEP"
++
++msgid "WMM Mode"
++msgstr "Modo WMM"
++
++msgid "WPA passphrase"
++msgstr "Frase de paso WPA"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Aviso"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr "Red inalámbrica"
++
++msgid "Wireless Adapter"
++msgstr "Adaptador inalámbrico"
++
++msgid "Wireless Network"
++msgstr "Red inalámbrica"
++
++msgid "Wireless Overview"
++msgstr "Redes inalámbricas"
++
++msgid "Wireless Security"
++msgstr "Seguridad inalámbrica"
++
++msgid "Wireless is disabled or not associated"
++msgstr "Red inalámbrica desconectada o no asociada"
++
++msgid "Wireless is restarting..."
++msgstr "Rearrancando red inalámbrica..."
++
++msgid "Wireless network is disabled"
++msgstr "Red inalámbrica desconectada"
++
++msgid "Wireless network is enabled"
++msgstr "Red inalámbrica conectada"
++
++msgid "Wireless restarted"
++msgstr "Red inalámbrica rearrancada"
++
++msgid "Wireless shut down"
++msgstr "Apagando red inalámbrica"
++
++msgid "Write received DNS requests to syslog"
++msgstr "Escribir las peticiones de DNS recibidas en el registro del sistema"
++
++msgid "XR Support"
++msgstr "Soporte de XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Gestione los scripts de inicio. Los cambios serán aplicados tras reiniciar "
++"el equipo.<br /><strong>ADVERTENCIA: ¡Si desactiva scripts de inicio "
++"esenciales como\"network\", su equipo puede no arrancar o quedar "
++"inaccesible!.</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Debe activar Javascript en su navegador o LuCI no funcionará correctamente."
++
++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 ""
++
++msgid "any"
++msgstr "cualquiera"
++
++msgid "auto"
++msgstr "auto"
++
++#, fuzzy
++msgid "automatic"
++msgstr "estático"
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "puenteado"
++
++msgid "create:"
++msgstr "crear:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "crea un puente sobre la interfaz o interfaces asociadas"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "desabilitar"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "expirado"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"archivo en el que se guardarán las direcciones <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr> cedidas"
++
++msgid "forward"
++msgstr "retransmisión"
++
++msgid "full-duplex"
++msgstr "full dúplex"
++
++msgid "half-duplex"
++msgstr "half dúplex"
++
++msgid "help"
++msgstr "ayuda"
++
++msgid "hidden"
++msgstr "oculto"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "si el destino es una red"
++
++msgid "input"
++msgstr "entrada"
++
++msgid "kB"
++msgstr "KB"
++
++msgid "kB/s"
++msgstr "KB/s"
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "no"
++
++msgid "no link"
++msgstr "sin enlace"
++
++msgid "none"
++msgstr "ninguno"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "parado"
++
++msgid "on"
++msgstr "activo"
++
++msgid "open"
++msgstr "abierto"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "enrutado"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "marcado"
++
++msgid "unknown"
++msgstr "desconocido"
++
++msgid "unlimited"
++msgstr "ilimitado"
++
++msgid "unspecified"
++msgstr "no especificado"
++
++msgid "unspecified -or- create:"
++msgstr "no especificado -o- crear:"
++
++msgid "untagged"
++msgstr "desmarcado"
++
++msgid "yes"
++msgstr "sí"
++
++msgid "« Back"
++msgstr "« Volver"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "Activar negociación IPv6 en el enlace PPP"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "Ignorar fichero de máquinas"
++
++#~ msgid "Path"
++#~ msgstr "Ruta (path)"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Espere por favor: Rearrancando dispositivo..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Advertencia: Hay cambios realizados que no han sido guardados, los mismos "
++#~ "se perderán mientras se rearranca!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Usar canales de 40MHz aunque el canal secundario solape con otro. ¡El "
++#~ "estándar IEEE 802.11n-2009 indica que no es correcto hacer esto!"
++
++#~ msgid "Cached"
++#~ msgstr "En caché"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr ""
++#~ "Configura este punto de montaje como almacenamiento de overlay para block-"
++#~ "extroot"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "Forzar modo 40MHz"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Saltos de Frecuencia"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "Bloqueado al canal %d usado por %s"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "Usar como raíz del sistema de ficheros"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "ID de usuario de HE.net"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr ""
++#~ "Esto es el ID de usuario codificado como hexadecimal de 32 bytes, no el "
++#~ "nombre de conexión"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz 2º canal por encima"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz 2º canal por debajo"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Aceptar anuncios del router"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Anunciar IPv6 en la red"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "ID de red anunciado"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "El rango permitido es desde 1 hasta 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "Habilidades HT"
++
++#~ msgid "HT mode"
++#~ msgstr "Modo HT"
++
++#~ msgid "Router Model"
++#~ msgstr "Modelo de router"
++
++#~ msgid "Router Name"
++#~ msgstr "Nombre del router"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "Enviar solicitudes de router"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr "Especifica el tiempo de prefijo anunciado preferido en segundos"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr "Especifica el tiempo de prefijo válido preferido en segundos"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "Usar tiempo de vida preferido"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "Usar tiempo de vida válido"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Esperando al router..."
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "Activar el servidor integrado NTP"
++
++#~ msgid "Active Leases"
++#~ msgstr "Cesiones activas"
++
++#~ msgid "Bit Rate"
++#~ msgstr "Bitrate"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "Configuración / Aplicar"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "Configuración / Cambios"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "Configuración / Anular"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "Encriptado"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "Explorar-<abbr title=\"Wireless Local Area Network\">WLAN</abbr>"
++
++#~ msgid "Create Network"
++#~ msgstr "Crear red"
++
++#~ msgid "Link"
++#~ msgstr "Enlace"
++
++#~ msgid "Networks"
++#~ msgstr "Redes"
++
++#~ msgid "Power"
++#~ msgstr "Potencia"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Redes inalámbricas en un entorno local"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "Notación-<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>: "
++#~ "dirección/prefijo"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "Servidor <abbr title=\"Domain Name System\">DNS</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "Difusión-<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "Dirección <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++#~ msgid "IP-Aliases"
++#~ msgstr "Alias IP"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "Configuración IPv6"
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "Los puertos de red de su router pueden ser combinados en diferentes <abbr "
++#~ "title=\"Virtual Local Area Network\">VLAN</abbr>s donde las computadoras "
++#~ "pueden comunicarse directamente con otras. Las <abbr title=\"Virtual "
++#~ "Local Area Network\">VLAN</abbr>s a menu son usadas para separar "
++#~ "diferentes segmentos de red. Además, usualmente hay un puerto de enlace "
++#~ "de subida (Uplink) para conectar a una red mas grande, por ejemplo "
++#~ "Internet y otro(s) puerto(s) para el acceso a la red local."
++
++#~ msgid "Enable buffering"
++#~ msgstr "Activar buffering"
++
++#~ msgid "IPv6-over-IPv4"
++#~ msgstr "IPv6-sobre-IPv4"
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Archivos protegidos al instalar un nuevo firmware"
++
++#~ msgid "General"
++#~ msgstr "General"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Aquí puede personalizar las configuraciones y funcionalidad de <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr>."
++
++#~ msgid "Post-commit actions"
++#~ msgstr "Acciones luego de \"Post-commit\""
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Estos comandos se ejecutan automáticamente cuando una determinada "
++#~ "configuración de la <abbr title=\"Unified configuración Interface\"> UCI "
++#~ "</abbr> es aplicada permitiendo que los cambios sean efectivos "
++#~ "inmediatamente."
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "<abbr title=\"User Interface\">Interfaz de Usuario</abbr> Web"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "Servidor <abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Punto de acceso (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Opciones adicional de pppd"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Desconectar automáticamente"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Archivo de copia de seguridad"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Configurar el servidor DNS local para usar servidores de nombre sugeridos "
++#~ "por el par PPP"
++
++#~ msgid "Connect script"
++#~ msgstr "Script de conexión"
++
++#~ msgid "Create backup"
++#~ msgstr "Crear copia de respaldo"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Script de desconexión"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Editar listas de paquetes de instalación y los objetivos "
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Ativar IPv6 sobre enlace PPP"
++
++#~ msgid "Firmware image"
++#~ msgstr "Imágen del firmware"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Aquí puede realizar una copia de respaldo o bien restaurar la "
++#~ "configuración de su ruter y, si es posible, reiniciar el ruter a su "
++#~ "configuración de fábrica."
++
++#~ msgid "Installation targets"
++#~ msgstr "Destinos de instalación"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Mantener archivos de configuración"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Mantener conectada"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Permite que pppd reemplace la ruta por defecto actual para usar la "
++#~ "interfaz ppp como ruta por defecto luego de una conexión satisfactoria"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr ""
++#~ "Permite a pppd ejecutar este script luego de establecer un enlace PPP"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "Permite a pppd ejecutar este script antes de terminar el enlace PPP"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Asegurese de escribir correctamente el código pin aquí caso contrario "
++#~ "bloqueará su tarjeta sim!"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "La mayoría de ellos son servidores de red, que ofrezcen un determinado "
++#~ "servicio para el dispositivo o la red como el acceso shell, servicio de "
++#~ "páginas web como <abbr title=\"Lua configuración Interface\"> LuCI </"
++#~ "abbr>, haciendo mesh-routing, el envío de mensajes de correo "
++#~ "electrónico, ..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr ""
++#~ "Número de tests de conexión fallida para iniciar la reconexión automática"
++
++#~ msgid "PIN code"
++#~ msgstr "Código PIN"
++
++#~ msgid "Package lists"
++#~ msgstr "Listas de paquetes"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr "Proceder a configurar su router a los valores de fábrica?"
++
++#~ msgid "Processor"
++#~ msgstr "Procesador"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Puerto servidor Radius"
++
++#, fuzzy
++#~ msgid "Radius-Server"
++#~ msgstr "Servidor Radius"
++
++#~ msgid "Replace default route"
++#~ msgstr "Reemplazar la ruta por defecto"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Reiniciar router a su configuración de fábrica"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr "Segundos a esperar al modem antes iniciar el intento de conexión"
++
++#~ msgid "Service type"
++#~ msgstr "Tipo de servicio"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr "Los servicios y demonios ejecutan ciertas tareas en su dispositivo."
++
++#~ msgid "Settings"
++#~ msgstr "Configuraciones"
++
++#~ msgid "Setup wait time"
++#~ msgstr "Configurar tiempo de espera"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Lo lamento. OpenWrt y derivados no permite la actualización de esta "
++#~ "plataforma. <br /> Para poder flashear este dispositivo deberá hacerlo en "
++#~ "forma manual."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr ""
++#~ "Especifique aquí argumentos adicionales para la línea de comando de pppd"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "El nodo de dispositivo de su modem, ej. /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr ""
++#~ "Tiempo (en segundos) luego de que una conexión no usada será cerrada"
++
++#~ msgid "Update package lists"
++#~ msgstr "Acutlizar listas de paquetes"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr ""
++#~ "Subir un archivo de imágen de OpenWrt o derivado para re-flashear el "
++#~ "dispositivo."
++
++#~ msgid "Upload image"
++#~ msgstr "Subir imágen"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "Uso de pares de DNS "
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Es necesario instalar &amp;quot;comgt&amp;quot; para UMTS/GPRS, &amp;quot;"
++#~ "ppp-mod-pppoe&amp;quot; para PPPoE, &amp;quot;ppp-mod-pppoa&amp;quot; "
++#~ "para PPPoA o &amp;quot;pptp&amp;quot; para porte PPtP"
++
++#~ msgid "back"
++#~ msgstr "volver"
++
++#~ msgid "buffered"
++#~ msgstr "buffered"
++
++#~ msgid "cached"
++#~ msgstr "en caché "
++
++#~ msgid "free"
++#~ msgstr "libre"
++
++#~ msgid "static"
++#~ msgstr "estático"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> es una colección "
++#~ "libre de software Lua incluyendo un <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework y una interfaz web para dispositivos embebidos."
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> se encuentra "
++#~ "licenciado bajo la licencia Apache (Apache-License)."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "Un servidor web HTTP/1.1 liviano escrito en C y Lua, diseñado para servir "
++#~ "LUCI "
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Un pequeño servidor web que puede ser usado para servir <abbr title=\"Lua "
++#~ "configuración Interface\"> LuCI </abbr>. "
++
++#~ msgid "About"
++#~ msgstr "Acerca de"
++
++#~ msgid "Addresses"
++#~ msgstr "Direcciones"
++
++#~ msgid "Admin Password"
++#~ msgstr "Contraseña de Admin"
++
++#~ msgid "Alias"
++#~ msgstr "Alias"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Autenticación Realm"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Puerto del puente"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr ""
++#~ "Cambiar la clave del administrador del sistema (Usuario <code>root</code>)"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Cliente + WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "Fichero configuración"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Tiempo de conexión agotado"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Desarrolladores que contribuyen"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "DHCP asignado"
++
++#~ msgid "Document root"
++#~ msgstr "Raíz de documentos"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Habilitar Keep-Alive"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "Puente ethernet"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "Aquí puede pegar las claves públicas de <abbr title=\"Secure Shell\">SSH</"
++#~ "abbr> (una por línea) para la autenticación de claves públicas de <abbr "
++#~ "title=\"Secure Shell\">SSH</abbr>."
++
++#~ msgid "ID"
++#~ msgstr "ID"
++
++#~ msgid "IP Configuration"
++#~ msgstr "Configuración IP"
++
++#~ msgid "Interface Status"
++#~ msgstr "Interfaz de Estado "
++
++#~ msgid "Lead Development"
++#~ msgstr "Lider del desarrollo"
++
++#~ msgid "Master"
++#~ msgstr "Master"
++
++#~ msgid "Master + WDS"
++#~ msgstr "Master + WDS"
++
++#~ msgid "Not configured"
++#~ msgstr "No configurado"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Contraseña cambiada satisfactoriamente"
++
++#~ msgid "Plugin path"
++#~ msgstr "Ruta del plugin"
++
++#~ msgid "Ports"
++#~ msgstr "Puertos"
++
++#~ msgid "Primary"
++#~ msgstr "Primario"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Página del proyecto "
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "Pseudo Ad-Hoc"
++
++#~ msgid "STP"
++#~ msgstr "STP"
++
++# Thanks to --> Gracias a -> Agradecemientos --> Agregadecemos a
++#~ msgid "Thanks To"
++#~ msgstr "Agregadecemos a"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr ""
++#~ "El nombre Realm el cual será mostrado en el símbolo de autenticación para "
++#~ "páginas protegidas. "
++
++#~ msgid "Unknown Error"
++#~ msgstr "Error desconocido"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "por defecto a <code>/etc/httpd.conf</code>"
++
++#~ msgid "Package lists updated"
++#~ msgstr "Listas de paquetes actualizada"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Actualizar los paquetes instalados"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "También los archivos de registro del núcleo (kernel) o servicio se pueden "
++#~ "ver aquí para obtener una visión general sobre su estado actual."
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "Aquí pude encontrar información acerca del estado actual del sistema como "
++#~ "la frecuencia del reloj de la <abbr title=\"Central Processing Unit"
++#~ "\">CPU</abbr> clock frequency, uso de la memoria o datos de la interfaz "
++#~ "de red."
++
++#~ msgid "Search file..."
++#~ msgstr "Buscar archivo..."
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> interfaz gráfica "
++#~ "libre, flexible y amigable para configurar la distro OpenWrt (Kamikaze) y "
++#~ "derivados."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "Y ahora disfrute su router!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "Como siempre queremos mejorar esta interfaz estamos esperando con interés "
++#~ "sus comentarios y sugerencias. "
++
++#~ msgid "Hello!"
++#~ msgstr "Hola !"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Aviso: En <abbr title=\"Lua Configuration Interface\">LuCI</abbr> los "
++#~ "cambios deben ser confirmados haciendo clic en \"Cambios\" y luego en "
++#~ "\"Guardar &amp; aplicar\" para que los cambios sean efectivos."
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "En las páginas siguientes puede realizar todos los ajustes importantes de "
++#~ "su router."
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr "El grupo de <abbr title=\"Lua Configuration Interface\">LuCI</abbr>"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Éste es el área de administración de <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++
++#~ msgid "User Interface"
++#~ msgstr "Interfaz de usuario"
++
++#~ msgid "enable"
++#~ msgstr "habilitar"
++
++#, fuzzy
++#~ msgid "(optional)"
++#~ msgstr ""
++#~ "<span class=\"translation-space\"> </span>\r\n"
++#~ "(opcional)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "Puerto <abbr title=\"Domain Name System\">DNS</abbr>"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "El Servidor <abbr title=\"Domain Name System\">DNS</abbr> serán "
++#~ "consultados de acuerdo al orden explicitado en el archivo \"resolv\""
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Extension Mechanisms "
++#~ "for Domain Name System\">EDNS0</abbr> packet size"
++#~ msgstr ""
++#~ "Tamaño <abbr title=\"máximo\">máx.</abbr> de paquete <abbr title="
++#~ "\"Extension Mechanisms for Domain Name System\">EDNS0</abbr>"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "Aislamiento AP"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "Añadir una red WiFi a la red física"
++
++#~ msgid "Aliases"
++#~ msgstr "Aliases"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Tamaño del segmento de la abrazadera"
++
++#, fuzzy
++#~ msgid "Create Or Attach Network"
++#~ msgstr "Crear red"
++
++#~ msgid "Devices"
++#~ msgstr "Dispositivos"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "Hacer búqueda inversa para redes locales"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "Activar Servidor TFTP"
++
++#~ msgid "Errors"
++#~ msgstr "Errores"
++
++#~ msgid "Essentials"
++#~ msgstr "Esencial"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Expandir hosts"
++
++#~ msgid "First leased address"
++#~ msgstr "Primer dirección otorgada"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Correge problemas con los sitios web inaccesibles, envío de formularios o "
++#~ "una conducta inesperada para algunos proveedores de servicios de Internet."
++
++#~ msgid "Hardware Address"
++#~ msgstr "Dirección de Hardware"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "Aquí puede configurar los dispositivos Wi-Fi instalados."
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "Independiente (ad hoc) "
++
++#~ msgid "Internet Connection"
++#~ msgstr "Conexión a Internet "
++
++#~ msgid "Join (Client)"
++#~ msgstr "Únete (Cliente) "
++
++#~ msgid "Leases"
++#~ msgstr "Brindadas"
++
++#~ msgid "Local Domain"
++#~ msgstr "Dominio local"
++
++#~ msgid "Local Network"
++#~ msgstr "Red local"
++
++#~ msgid "Local Server"
++#~ msgstr "Servidor local"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "Imágen de inicio en red"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr ""
++#~ "Nombre de la red (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "Número de direcciones otorogada"
++
++#~ msgid "Perform Actions"
++#~ msgstr "Ejectuar acciones"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "Impide la comunicación de cliente a cliente "
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "Proporcionar (Punto de Acceso) "
++
++#~ msgid "Resolvfile"
++#~ msgstr "Archivo \"resolv\""
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "Raíz del Servidor TFTP"
++
++#~ msgid "TX / RX"
++#~ msgstr "Tx / Rx"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "Los siguientes cambios se han aplicado"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "Cuando un nuevo firmware ha sido instalado con <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr> estos archivos serán agregados a la "
++#~ "nueva instalación automáticamente."
++
++#, fuzzy
++#~ msgid "Wireless Scan"
++#~ msgstr "Inalámbrico"
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "Con <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "miembros de la red pueden automáticamente recibir su configuración (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, máscara de red, servidor "
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>, ...)."
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "Puede correr varias redes Wi-Fi con un solo dispositivo. Tenga en cuenta "
++#~ "que hay restricciones que se aplican al propio hardware y al driver "
++#~ "específicamente. Normalmente puede operar 1 red Ad-Hoc o hasta 3 modo "
++#~ "Master y un Cliente de forma simultanea."
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "Es necesario instalar &amp;quot;ppp-mod-pppoe&amp;quot; para PPPoE o &amp;"
++#~ "quot;pptp&amp;quot; para PPtP support"
++
++#~ msgid "Zone"
++#~ msgstr "Zona"
++
++#~ msgid "additional hostfile"
++#~ msgstr "archivo de host adicional"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr "añadir nombre de dominios a entradas de host en el archivo resolv"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "reconectar automáticamente"
++
++#~ msgid "concurrent queries"
++#~ msgstr "consultas simultaneas"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr ""
++#~ "desactivar <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++#~ "abbr> para esta interfaz"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "desconecte cuando esté inactivo durante "
++
++#~ msgid "don't cache unknown"
++#~ msgstr "do cachear desconocido"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++
++#~ msgid "installed"
++#~ msgstr "instalado"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "Localización de nombre de host dependiendo de su subred"
++
++#~ msgid "not installed"
++#~ msgstr "no instalado"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr ""
++#~ "impedir cacheo de respuestas negativas de <abbr title=\"Domain Name System"
++#~ "\">DNS</abbr>"
++
++#~ msgid "query port"
++#~ msgstr "puerto de consulta"
++
++#~ msgid "transmitted / received"
++#~ msgstr "transmitido / recibido"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "redes contenidas"
++
++#~ msgid "all"
++#~ msgstr "todo"
++
++#~ msgid "Code"
++#~ msgstr "Código"
++
++#~ msgid "Distance"
++#~ msgstr "Distancia"
++
++#~ msgid "Legend"
++#~ msgstr "Leyenda"
++
++#~ msgid "Library"
++#~ msgstr "Biblioteca"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "ver las páginas de man de &amp;#39;%s&amp;#39;"
++
++#~ msgid "Package Manager"
++#~ msgstr "Gestor de Paquetes"
++
++#~ msgid "Service"
++#~ msgstr "Servicio"
++
++#~ msgid "Statistics"
++#~ msgstr "Estadísticas"
++
++#~ msgid "zone"
++#~ msgstr "Zona"
+diff --git a/feeds/luci/modules/luci-base/po/fr/base.po b/feeds/luci/modules/luci-base/po/fr/base.po
+new file mode 100644
+index 0000000..b216590
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/fr/base.po
+@@ -0,0 +1,4394 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2013-12-22 17:11+0200\n"
++"Last-Translator: goofy <pierre.gaufillet@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: fr\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(fenêtre de %d minutes, intervalle de %d secondes)"
++
++msgid "(%s available)"
++msgstr "(%s disponible)"
++
++msgid "(empty)"
++msgstr "(vide)"
++
++msgid "(no interfaces attached)"
++msgstr "(pas d'interface connectée)"
++
++msgid "-- Additional Field --"
++msgstr "-- Champ Supplémentaire --"
++
++msgid "-- Please choose --"
++msgstr "-- Choisir --"
++
++msgid "-- custom --"
++msgstr "-- autre --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Charge sur 1 minute :"
++
++msgid "15 Minute Load:"
++msgstr "Charge sur 15 minutes :"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Charge sur 5 minutes :"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "Port des requêtes <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "Port du serveur <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"Les serveurs <abbr title=\"Domain Name System\">DNS</abbr> seront<br/"
++">interrogés dans l'ordre du fichier de résolution"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "Adresse <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "Passerelle <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "Masque réseau <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"Adresse ou réseau <abbr title=\"Internet Protocol Version 6\">IPv6</abbr> "
++"(notation CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "Passerelle <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr ""
++"Configuration des <abbr title=\"Diode Électro-Luminescente\">DEL</abbr>s"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "Nom de la <abbr title=\"Diode Électro-Luminescente\">DEL</abbr>"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "Adresse <abbr title=\"Media Access Control\">MAC</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"Nombre de baux <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> maximum"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"taille maximum des paquets <abbr title=\"Extension Mechanisms for Domain "
++"Name System\">EDNS0</abbr>"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "Maximum de requêtes concurrentes"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "Gestion du mode AR"
++
++msgid "ARP retry threshold"
++msgstr "Niveau de ré-essai ARP"
++
++msgid "ATM Bridges"
++msgstr "Ponts ATM"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr ""
++"Identifiant de canal virtuel (<abbr title=\"Virtual Channel Idendifier"
++"\">VCI</abbr>) ATM"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr ""
++"Identifiant de chemin virtuel (<abbr title=\"Virtual Path Idendifier\">VPI</"
++"abbr>) ATM"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"Les ponts ATM présentent l'Ethernet encapsulé dans des connexions AAL5 comme "
++"des interfaces réseau virtuelles Linux qui peuvent être utilisées avec DHCP "
++"ou PPP pour se connecter au réseau du fournisseur d'accès."
++
++msgid "ATM device number"
++msgstr "Numéro de périphérique ATM"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Concentrateur d'accès"
++
++msgid "Access Point"
++msgstr "Point d'accès"
++
++msgid "Action"
++msgstr "Action"
++
++msgid "Actions"
++msgstr "Actions"
++
++msgid "Activate this network"
++msgstr "Activer ce réseau"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "Routes <abbr title=\"Internet Protocol Version 4\">IPv4</abbr> actives"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "Routes <abbr title=\"Internet Protocol Version 6\">IPv6</abbr> actives"
++
++msgid "Active Connections"
++msgstr "Connexions actives"
++
++msgid "Active DHCP Leases"
++msgstr "Bails DHCP actifs"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Bails DHCPv6 actifs"
++
++msgid "Ad-Hoc"
++msgstr "Ad-hoc"
++
++msgid "Add"
++msgstr "Ajouter"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++"Ajouter le suffixe du domaine local aux noms résolus d'après le fichier hosts"
++
++msgid "Add new interface..."
++msgstr "Ajout d'une nouvelle interface..."
++
++msgid "Additional Hosts files"
++msgstr "Fichiers hosts supplémetaires"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Adresse"
++
++msgid "Address to access local relay bridge"
++msgstr "Adresse pour accéder au pont-relais local"
++
++msgid "Administration"
++msgstr "Administration"
++
++msgid "Advanced Settings"
++msgstr "Paramètres avancés"
++
++msgid "Alert"
++msgstr "Alerte"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"Autoriser l'authentification <abbr title=\"Secure Shell\">SSH</abbr> par mot "
++"de passe"
++
++msgid "Allow all except listed"
++msgstr "Autoriser tout sauf ce qui est listé"
++
++msgid "Allow listed only"
++msgstr "Autoriser seulement ce qui est listé"
++
++msgid "Allow localhost"
++msgstr "Autoriser l'hôte local"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"Permettre à des hôtes distants de se conecter à des ports SSH locaux "
++"correspondants (« forwarded »)"
++
++msgid "Allow root logins with password"
++msgstr "Autoriser les connexions administrateur avec mot de passe"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr ""
++"Autoriser l'utilisateur <em>root</em> à se connecter avec un mot de passe"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr ""
++"Autorise les réponses de l'amont dans la plage 127.0.0.0/8, par ex. pour les "
++"services RBL"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "Un réseau supplémentaire sera créé si vous laissé ceci décoché."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antenne 1"
++
++msgid "Antenna 2"
++msgstr "Antenne 2"
++
++msgid "Antenna Configuration"
++msgstr "Configuration de l'antenne"
++
++msgid "Any zone"
++msgstr "N'importe quelle zone"
++
++msgid "Apply"
++msgstr "Appliquer"
++
++msgid "Applying changes"
++msgstr "Changements en cours"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Affecte les interfaces…"
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Équipements associés"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Contrôleur sans fil Atheros 802.11%s "
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Authentification"
++
++msgid "Authoritative"
++msgstr "Autoritaire"
++
++msgid "Authorization Required"
++msgstr "Autorisation requise"
++
++msgid "Auto Refresh"
++msgstr "Rafraîchissement automatique"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Disponible"
++
++msgid "Available packages"
++msgstr "Paquets disponibles"
++
++msgid "Average:"
++msgstr "Moyenne :"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Retour"
++
++msgid "Back to Overview"
++msgstr "Retour à la vue générale"
++
++msgid "Back to configuration"
++msgstr "Retour à la configuration"
++
++msgid "Back to overview"
++msgstr "Retour à la vue générale"
++
++msgid "Back to scan results"
++msgstr "Retour aux résultats de la recherche"
++
++msgid "Background Scan"
++msgstr "Recherche en arrière-plan"
++
++msgid "Backup / Flash Firmware"
++msgstr "Sauvegarde / Mise à jour du micrologiciel"
++
++msgid "Backup / Restore"
++msgstr "Sauvegarder / Restaurer"
++
++msgid "Backup file list"
++msgstr "Liste des fichiers de sauvegarde"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"Voici la liste des fichiers à sauvegarder. Elle est constituée des fichiers "
++"de configuration modifiés marqués par opkg, des fichiers de base essentiels, "
++"et des motifs de sauvegarde définis par l'utilisateur."
++
++msgid "Bitrate"
++msgstr "Débit"
++
++msgid "Bogus NX Domain Override"
++msgstr "Contourne les «  NX Domain » bogués"
++
++msgid "Bridge"
++msgstr "Pont"
++
++msgid "Bridge interfaces"
++msgstr "Interfaces en pont"
++
++msgid "Bridge unit number"
++msgstr "Numéro d'unité du pont"
++
++msgid "Bring up on boot"
++msgstr "L'activer au démarrage"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Contrôleur sans fil Broadcom 802.11%s"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Contrôleur sans fil Broadcom BCM%04x 802.11"
++
++msgid "Buffered"
++msgstr "Temporisé"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Boutons"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "Utilisation CPU (%)"
++
++msgid "Cancel"
++msgstr "Annuler"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Chaîne"
++
++msgid "Changes"
++msgstr "Changements"
++
++msgid "Changes applied."
++msgstr "Changements appliqués."
++
++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 "Check"
++msgstr "Vérification"
++
++msgid "Checksum"
++msgstr "Somme de contrôle"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Choisissez la zone de pare-feu à laquelle vous voulez affecter cette "
++"interface. Sélectionnez <em>non précisé</em> pour retirer l'interface de la "
++"zone associée, ou remplissez le champ <em>créer</em> pour définir une "
++"nouvelle zone et y inclure cette interface."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Choisissez le(s) réseau(x) que vous souhaitez attachez a cette interface "
++"sans-fil ou remplissez le <em>créer</em> champ pour définir un nouveau "
++"réseau. "
++
++msgid "Cipher"
++msgstr "Code de chiffrement"
++
++msgid ""
++"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)."
++msgstr ""
++"Cliquer sur \"Construire l'archive\" pour télécharger une archive tar des "
++"fichiers de la configuration actuelle. Pour réinitialiser le micrologiciel "
++"dans son état initial, cliquer sur \"Réinitialiser\" (possible seulement "
++"avec les images de type squashfs)."
++
++msgid "Client"
++msgstr "Client"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "Identifiant client à envoyer dans les requêtes DHCP"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Fermer une connexion inactive après le délai donné en secondes, mettre 0 "
++"pour garder les connexions"
++
++msgid "Close list..."
++msgstr "Fermer la liste…"
++
++msgid "Collecting data..."
++msgstr "Récupération de données..."
++
++msgid "Command"
++msgstr "Commande"
++
++msgid "Common Configuration"
++msgstr "Configuration commune"
++
++msgid "Compression"
++msgstr "Compression"
++
++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 "Confirmation"
++msgstr "Confirmation"
++
++msgid "Connect"
++msgstr "Se connecter"
++
++msgid "Connected"
++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 "Country"
++msgstr "Pays"
++
++msgid "Country Code"
++msgstr "Code pays"
++
++msgid "Cover the following interface"
++msgstr "Couvre l'interface suivante"
++
++msgid "Cover the following interfaces"
++msgstr "Couvre les interfaces suivantes"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Créer / Assigner une zone du pare-feu"
++
++msgid "Create Interface"
++msgstr "Créer une interface"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Créer un pont par dessus plusieurs interfaces"
++
++msgid "Critical"
++msgstr "Critique"
++
++msgid "Cron Log Level"
++msgstr "Niveau de journalisation de Cron"
++
++msgid "Custom Interface"
++msgstr "Interface spécifique"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Personnaliser le comportement des <abbr title=\"Diode Électro-Luminescente"
++"\">DEL</abbr>s si possible."
++
++msgid "DHCP Leases"
++msgstr "Baux DHCP"
++
++msgid "DHCP Server"
++msgstr "Serveur DHCP"
++
++msgid "DHCP and DNS"
++msgstr "DHCP et DNS"
++
++msgid "DHCP client"
++msgstr "client DHCP"
++
++msgid "DHCP-Options"
++msgstr "Options DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr "Bails DHCPv6"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "transmissions DNS"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Deboguage"
++
++msgid "Default %d"
++msgstr "%d par défaut"
++
++msgid "Default gateway"
++msgstr "Passerelle par défaut"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "État par défaut"
++
++msgid "Define a name for this network."
++msgstr "Donne un nom à ce réseau."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Définir des options DHCP supplémentaires, par exemple "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" qui publie différents serveurs "
++"DNS à ses clients."
++
++msgid "Delete"
++msgstr "Effacer"
++
++msgid "Delete this interface"
++msgstr "Supprimer cette interface"
++
++msgid "Delete this network"
++msgstr "Supprimer ce réseau"
++
++msgid "Description"
++msgstr "Description"
++
++msgid "Design"
++msgstr "Apparence"
++
++msgid "Destination"
++msgstr "Destination"
++
++msgid "Device"
++msgstr "Équipement"
++
++msgid "Device Configuration"
++msgstr "Configuration de l'équipement"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnostics"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Répertoire"
++
++msgid "Disable"
++msgstr "Désactiver"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Désactiver <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++"pour cette interface."
++
++msgid "Disable DNS setup"
++msgstr "Désactiver la configuration DNS"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Désactiver l'émission périodique de balises wifi (« HW-Beacon »)"
++
++msgid "Disabled"
++msgstr "Désactivé"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Jeter les réponses en RFC1918 amont"
++
++msgid "Displaying only packages containing"
++msgstr "N'afficher que les paquets contenant"
++
++msgid "Distance Optimization"
++msgstr "Optimisation de la distance"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Distance au membre du réseau le plus éloigné, en mètres."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Diversité"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq est un serveur <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr> combiné à un relais <abbr title=\"Domain Name System\">DNS</"
++"abbr> pour les pare-feu <abbr title=\"Network Address Translation\">NAT</"
++"abbr>"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr ""
++"Ne pas mettre en cache les réponses négatives, par ex. pour des domaines "
++"inexistants"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr ""
++"Ne pas transmettre les requêtes qui ne peuvent être résolues par les "
++"serveurs de noms publics"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr ""
++"Ne pas transmettre les requêtes de recherche inverse pour les réseaux locaux"
++
++msgid "Do not send probe responses"
++msgstr "Ne pas envoyer de réponses de test"
++
++msgid "Domain required"
++msgstr "Domaine nécessaire"
++
++msgid "Domain whitelist"
++msgstr "Liste blanche de domaines"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Ne pas transmettre de requêtes <abbr title=\"Domain Name System\">DNS</abbr> "
++"sans nom <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid "Download and install package"
++msgstr "Télécharge et installe le paquet"
++
++msgid "Download backup"
++msgstr "Télécharger la sauvegarde"
++
++msgid "Dropbear Instance"
++msgstr "Session Dropbear"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear est un serveur <abbr title=\"Secure Shell\">SSH</abbr> et intègre "
++"un serveur <abbr title=\"Secure Copy\">SCP</abbr>"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> dynamique"
++
++msgid "Dynamic tunnel"
++msgstr "Tunnel dynamique"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"Alloue dynamiquement des adresses pour les clients du DHCP. Si désactivé, "
++"seuls les clients ayant des baux statiques seront gérés."
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "Méthode EAP"
++
++msgid "Edit"
++msgstr "Éditer"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Éditer cette interface"
++
++msgid "Edit this network"
++msgstr "Éditer ce réseau"
++
++msgid "Emergency"
++msgstr "Urgence"
++
++msgid "Enable"
++msgstr "Activer"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Activer le protocole <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "Activer la mise à jour dynamique de l'extrémité du tunnel chez HE.net"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "Activer la circulation de très grandes trames (Jumbo)"
++
++msgid "Enable NTP client"
++msgstr "Activer client NTP"
++
++msgid "Enable TFTP server"
++msgstr "Activer le serveur TFTP"
++
++msgid "Enable VLAN functionality"
++msgstr "Acviter la gestion des VLANs"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Activer l'apprentissage et la péremption"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "Activer ce montage"
++
++msgid "Enable this swap"
++msgstr "Activer cette mémoire d'échange (swap)"
++
++msgid "Enable/Disable"
++msgstr "Activer/Désactiver"
++
++msgid "Enabled"
++msgstr "Activé"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr ""
++"Activer le protocole <abbr title=\"Spanning Tree Protocol\">STP</abbr> sur "
++"ce pont"
++
++msgid "Encapsulation mode"
++msgstr "Mode encapsulé"
++
++msgid "Encryption"
++msgstr "Chiffrement"
++
++msgid "Erasing..."
++msgstr "Effacement…"
++
++msgid "Error"
++msgstr "Erreur"
++
++msgid "Ethernet Adapter"
++msgstr "Module Ethernet"
++
++msgid "Ethernet Switch"
++msgstr "Commutateur Ethernet"
++
++msgid "Expand hosts"
++msgstr "Étendre le nom d'hôte"
++
++msgid "Expires"
++msgstr "Expire"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++"Délai d'expiration des adresses allouées, le minimum est de 2 minutes "
++"(<code>2m</code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Serveur distant de journaux système"
++
++msgid "External system log server port"
++msgstr "Port du serveur distant de journaux système"
++
++msgid "Fast Frames"
++msgstr "Trames rapides"
++
++msgid "File"
++msgstr "Fichier"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Nom de fichier d'une image de démarrage publiée aux clients"
++
++msgid "Filesystem"
++msgstr "Système de fichiers"
++
++msgid "Filter"
++msgstr "Filtrer"
++
++msgid "Filter private"
++msgstr "Filtrer les requêtes privées"
++
++msgid "Filter useless"
++msgstr "Filtrer les requêtes inutiles"
++
++msgid "Find and join network"
++msgstr "Cherche et rejoint un réseau"
++
++msgid "Find package"
++msgstr "Trouver un paquet"
++
++msgid "Finish"
++msgstr "Terminer"
++
++msgid "Firewall"
++msgstr "Pare-feu"
++
++msgid "Firewall Settings"
++msgstr "Paramètres du pare-feu"
++
++msgid "Firewall Status"
++msgstr "État du pare-feu"
++
++msgid "Firmware Version"
++msgstr "Version du micrologiciel"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "Port source fixe pour les requêtes DNS sortantes"
++
++msgid "Flags"
++msgstr "Options"
++
++msgid "Flash Firmware"
++msgstr "Mise à jour du micrologiciel"
++
++msgid "Flash image..."
++msgstr "Écriture de l'image…"
++
++msgid "Flash new firmware image"
++msgstr "Écrire l'image du nouveau micrologiciel"
++
++msgid "Flash operations"
++msgstr "Opérations d'écriture"
++
++msgid "Flashing..."
++msgstr "Écriture…"
++
++msgid "Force"
++msgstr "Forcer"
++
++msgid "Force CCMP (AES)"
++msgstr "Forcer CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr "Force le DHCP sur ce réseau même si un autre serveur est détecté."
++
++msgid "Force TKIP"
++msgstr "Forcer TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "Forcer TKIP et CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "Transmettre le trafic DHCP"
++
++msgid "Forward broadcast traffic"
++msgstr "Transmettre le trafic de diffusion"
++
++msgid "Forwarding mode"
++msgstr "Mode de transmission"
++
++msgid "Fragmentation Threshold"
++msgstr "Seuil de fragmentation"
++
++msgid "Frame Bursting"
++msgstr "Rafale de trames"
++
++msgid "Free"
++msgstr "Libre"
++
++msgid "Free space"
++msgstr "Espace libre"
++
++msgid "GHz"
++msgstr "Ghz"
++
++msgid "GPRS only"
++msgstr "seulement GPRS"
++
++msgid "Gateway"
++msgstr "Passerelle"
++
++msgid "Gateway ports"
++msgstr "Ports de la passerelle"
++
++msgid "General Settings"
++msgstr "Paramètres généraux"
++
++msgid "General Setup"
++msgstr "Configuration générale"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "Construire l'archive"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Contrôleur sans fil générique 802.11%s"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++"La confirmation du nouveau mot de passe ne correspond pas, changement "
++"annulé !"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Aller à la configuration du mot de passe…"
++
++msgid "Go to relevant configuration page"
++msgstr "Aller à la page de configuration correspondante"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "Mot de passe HE.net"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Gestionnaire"
++
++msgid "Hang Up"
++msgstr "Signal (HUP)"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Ici, vous pouvez configurer les aspects basiques de votre routeur comme son "
++"nom ou son fuseau horaire."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++"Vous pouvez copier ici des clés SSH publiques (une par ligne) pour une "
++"authentification SSH sur clés publiques."
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Contrôleur sans fil Hermes 802.11b"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "Cacher le ESSID"
++
++msgid "Host entries"
++msgstr "Entrées d'hôtes"
++
++msgid "Host expiry timeout"
++msgstr "Délai d'expiration pour les hôtes"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "adresse IP ou réseau"
++
++msgid "Hostname"
++msgstr "Nom d'hôte"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "Nom d'hôte à envoyer dans une requête DHCP"
++
++msgid "Hostnames"
++msgstr "Noms d'hôtes"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "Adresse IP"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "Pare-feu IPv4"
++
++msgid "IPv4 WAN Status"
++msgstr "État IPv4 du WAN"
++
++msgid "IPv4 address"
++msgstr "Adresse IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 et IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "Diffusion IPv4"
++
++msgid "IPv4 gateway"
++msgstr "Passerelle IPv4"
++
++msgid "IPv4 netmask"
++msgstr "Masque-réseau IPv4"
++
++msgid "IPv4 only"
++msgstr "IPv4 seulement"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "longueur du préfixe IPv4"
++
++msgid "IPv4-Address"
++msgstr "Adresse IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "Pare-feu IPv6"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "État IPv6 du WAN"
++
++msgid "IPv6 address"
++msgstr "Adresse IPv6"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "Passerelle IPv6"
++
++msgid "IPv6 only"
++msgstr "IPv6 seulement"
++
++msgid "IPv6 prefix"
++msgstr "Préfixe IPv6"
++
++msgid "IPv6 prefix length"
++msgstr "longueur du préfixe IPv6"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "Adresse IPv6"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6 dans IPv4 (RFC 4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6 sur IPv4 (6ème)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6 sur IPv4 (6 vers 4)"
++
++msgid "Identity"
++msgstr "Identité"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++"Monte le périphérique identifié par cet UUID au lieu d'un nom de "
++"périphérique fixe"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++"Monte le périphérique identifié par cette étiquette au lieu d'un nom de "
++"périphérique fixe"
++
++msgid "If unchecked, no default route is configured"
++msgstr "Décoché, aucune route par défaut n'est configurée"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr "Décoché, les adresses des serveurs DNS publiés sont ignorées"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Si la mémoire physique n'est pas en quantité suffisante, les données "
++"inutilisées peuvent être temporairement transférée sur une partition "
++"d'échange, relevant la quantité de RAM disponible. Ce processus est lent car "
++"la mémoire d'échange ne peut être accédée aux taux de transfert de la RAM."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Ignorer /etc/hosts"
++
++msgid "Ignore interface"
++msgstr "Ignorer l'interface"
++
++msgid "Ignore resolve file"
++msgstr "Ignorer le fichier de résolution"
++
++msgid "Image"
++msgstr "Image"
++
++msgid "In"
++msgstr "Entrée"
++
++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 "Délai d'inactivité"
++
++msgid "Inbound:"
++msgstr "Intérieur :"
++
++msgid "Info"
++msgstr "Info"
++
++msgid "Initscript"
++msgstr "Script d'initialisation"
++
++msgid "Initscripts"
++msgstr "Scripts d'initialisation"
++
++msgid "Install"
++msgstr "Installer"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Installer le paquet %q"
++
++msgid "Install protocol extensions..."
++msgstr "Installation des extensions de protocole…"
++
++msgid "Installed packages"
++msgstr "Paquets installés"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Interface Configuration"
++msgstr "Configuration de l'interface"
++
++msgid "Interface Overview"
++msgstr "Vue d'ensemble de l'interface"
++
++msgid "Interface is reconnecting..."
++msgstr "L'interface se reconnecte…"
++
++msgid "Interface is shutting down..."
++msgstr "L'interface s'arrête…"
++
++msgid "Interface not present or not connected yet."
++msgstr "L'interface n'est pas présente ou pas encore connectée."
++
++msgid "Interface reconnected"
++msgstr "Interface reconnectée"
++
++msgid "Interface shut down"
++msgstr "Interface arrêtée"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "Erreur Serveur Interne"
++
++msgid "Invalid"
++msgstr "Erreur : donnée entrée invalide"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++"Identifiant VLAN invalide !Seuls les IDs entre %d et %d sont autorisés."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++"Identifiant VLAN donné invalide ! Seuls les identifiants uniques sont "
++"autorisés"
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Nom d'utilisateur et/ou mot de passe invalides ! Réessayez !"
++
++#, 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 ""
++"Il semble que vous essayez de programmer votre routeur avec une image qui ne "
++"tient pas dans sa mémoire flash, vérifiez s'il vous plait votre fichier-"
++"image !"
++
++msgid "Java Script required!"
++msgstr "Nécessite un Script Java !"
++
++msgid "Join Network"
++msgstr "Rejoindre un réseau"
++
++msgid "Join Network: Settings"
++msgstr "Rejoindre un réseau : paramètres"
++
++msgid "Join Network: Wireless Scan"
++msgstr "Rejoindre un réseau : recherche des réseaux sans-fil"
++
++msgid "Keep settings"
++msgstr "Garder le paramètrage"
++
++msgid "Kernel Log"
++msgstr "Journal du noyau"
++
++msgid "Kernel Version"
++msgstr "Version du noyau"
++
++msgid "Key"
++msgstr "Clé"
++
++msgid "Key #%d"
++msgstr "Clé n° %d"
++
++msgid "Kill"
++msgstr "Tuer"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "Serveur L2TP"
++
++msgid "LCP echo failure threshold"
++msgstr "Seuil d'erreur des échos LCP"
++
++msgid "LCP echo interval"
++msgstr "Intervalle entre échos LCP"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Étiquette"
++
++msgid "Language"
++msgstr "Langue"
++
++msgid "Language and Style"
++msgstr "Langue et apparence"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Durée de validité d'un bail"
++
++msgid "Leasefile"
++msgstr "Fichier de baux"
++
++msgid "Leasetime"
++msgstr "Durée du bail"
++
++msgid "Leasetime remaining"
++msgstr "Durée de validité"
++
++msgid "Leave empty to autodetect"
++msgstr "Laisser vide pour l'auto-détection"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "Laisser vide pour utiliser l'adresse WAN actuelle"
++
++msgid "Legend:"
++msgstr "Légende :"
++
++msgid "Limit"
++msgstr "Limite"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Lien établi"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"Liste des serveurs auquels sont transmis les requêtes <abbr title=\"Domain "
++"Name System\">DNS</abbr>"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "Liste des domaines où sont permises les réponses de type RFC1918"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++"Liste des hôtes qui fournissent des résultats avec des « NX domain » bogués"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr "Écouter seulement sur l'interface spécifié, sinon sur toutes"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Port d'écoute des requêtes DNS entrantes"
++
++msgid "Load"
++msgstr "Charger"
++
++msgid "Load Average"
++msgstr "Charge moyenne"
++
++msgid "Loading"
++msgstr "Chargement"
++
++msgid "Local IPv4 address"
++msgstr "Adresse IPv4 locale"
++
++msgid "Local IPv6 address"
++msgstr "Adresse IPv6 locale"
++
++msgid "Local Startup"
++msgstr "Démarrage local"
++
++msgid "Local Time"
++msgstr "Heure Locale"
++
++msgid "Local domain"
++msgstr "Domaine local"
++
++#, fuzzy
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++"Domaine local à préciser. Les noms correspondants à ce domaine ne sont "
++"jamais transmis, mais résolus seulement depuis le serveur DHCP ou le fichier "
++"Hosts"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++"Suffixe du domaine local ajouté aux noms du serveur DHCP et du fichier Hosts"
++
++msgid "Local server"
++msgstr "Serveur local"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++"Trouve le nom d'hôte suivant le sous-réseau d'où vient la requête si "
++"plusieurs adresses IPs sont possibles"
++
++msgid "Localise queries"
++msgstr "Localiser les requêtes"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Niveau de journalisation"
++
++msgid "Log queries"
++msgstr "Journaliser les requêtes"
++
++msgid "Logging"
++msgstr "Journalisation"
++
++msgid "Login"
++msgstr "Connexion"
++
++msgid "Logout"
++msgstr "Déconnexion"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++"Adresse allouée la plus basse, spécifiée par un décalage à partir de "
++"l'adresse réseau."
++
++msgid "MAC-Address"
++msgstr "Adresse MAC"
++
++msgid "MAC-Address Filter"
++msgstr "Filtrage par adresses MAC"
++
++msgid "MAC-Filter"
++msgstr "Filtrage par adresses MAC"
++
++msgid "MAC-List"
++msgstr "Liste des adresses MAC"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Débit maximum"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "Nombre maximum de baux DHCP actifs"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "Nombre maximum de requêtes DNS au même moment"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "Taille maximum autorisée des paquets UDP EDNS.0"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "Délai d'attente maximum que le modem soit prêt"
++
++msgid "Maximum hold time"
++msgstr "Temps de maintien maximum"
++
++msgid "Maximum number of leased addresses."
++msgstr "Nombre maximum d'adresses allouées."
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "Mémoire"
++
++msgid "Memory usage (%)"
++msgstr "Utilisation Mémoire (%)"
++
++msgid "Metric"
++msgstr "Metrique"
++
++msgid "Minimum Rate"
++msgstr "Débit minimum"
++
++msgid "Minimum hold time"
++msgstr "Temps de maintien mimimum"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "Extention de protocole manquante pour le proto %q"
++
++msgid "Mode"
++msgstr "Mode"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Interface Modem"
++
++msgid "Modem init timeout"
++msgstr "Délai max. d'initialisation du modem"
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr "Montage"
++
++msgid "Mount Point"
++msgstr "Point de montage"
++
++msgid "Mount Points"
++msgstr "Point de montage"
++
++msgid "Mount Points - Mount Entry"
++msgstr "Points de montage - élément à monter"
++
++msgid "Mount Points - Swap Entry"
++msgstr "Points de montage - partition d'échange"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Les points de montage définissent l'attachement d'un périphérique au système "
++"de fichier"
++
++msgid "Mount options"
++msgstr "Options de montage"
++
++msgid "Mount point"
++msgstr "Point de montage"
++
++msgid "Mounted file systems"
++msgstr "Systèmes de fichiers montés"
++
++msgid "Move down"
++msgstr "Descendre"
++
++msgid "Move up"
++msgstr "Monter"
++
++msgid "Multicast Rate"
++msgstr "Débit multidiffusion"
++
++msgid "Multicast address"
++msgstr "Adresse multidiffusion"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "Serveurs NTP candidats"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Nom"
++
++msgid "Name of the new interface"
++msgstr "Nom de la nouvelle interface"
++
++msgid "Name of the new network"
++msgstr "Nom du nouveau réseau"
++
++msgid "Navigation"
++msgstr "Navigation"
++
++msgid "Netmask"
++msgstr "Masque de réseau"
++
++msgid "Network"
++msgstr "Réseau"
++
++msgid "Network Utilities"
++msgstr "Utilitaires réseau"
++
++msgid "Network boot image"
++msgstr "Image de démarrage réseau"
++
++msgid "Network without interfaces."
++msgstr "Réseau sans interfaces."
++
++msgid "Next »"
++msgstr "Prochain »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Aucun serveur DHCP configuré sur cette interface"
++
++msgid "No chains in this table"
++msgstr "Aucune chaîne dans cette table"
++
++msgid "No files found"
++msgstr "Aucun fichier trouvé"
++
++msgid "No information available"
++msgstr "Information indisponible"
++
++msgid "No negative cache"
++msgstr "Pas de cache négatif"
++
++msgid "No network configured on this device"
++msgstr "Ce périphérique n'a aucune adresse configurée"
++
++msgid "No network name specified"
++msgstr "Aucun nom de réseau donné"
++
++msgid "No package lists available"
++msgstr "Aucune liste de paquets disponible"
++
++msgid "No password set!"
++msgstr "Pas de mot de passe positionné !"
++
++msgid "No rules in this chain"
++msgstr "Aucune règle dans cette chaîne"
++
++msgid "No zone assigned"
++msgstr "Aucune zone attribuée"
++
++msgid "Noise"
++msgstr "Bruit"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Bruit :"
++
++msgid "None"
++msgstr "Vide"
++
++msgid "Normal"
++msgstr "Normal"
++
++msgid "Not Found"
++msgstr "Pas trouvé"
++
++msgid "Not associated"
++msgstr "Pas associé"
++
++msgid "Not connected"
++msgstr "Non connecté"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Note : les fichiers de configuration seront effacés."
++
++msgid "Notice"
++msgstr "Note"
++
++msgid "Nslookup"
++msgstr "Nslookup"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "Configuration OPKG"
++
++msgid "Off-State Delay"
++msgstr "Durée éteinte"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Dans cette page vous pourrez configurer les interfaces réseaux. Vous pouvez "
++"bridger différentes interfaces en cochant le champ \"bridger les interfaces"
++"\" et en saisissant les noms des interfaces réseau séparées par des espaces. "
++"Vous pouvez aussi utiliser la notation VLAN, INTERFACE.VLANNB (ex : eth0.1)."
++
++msgid "On-State Delay"
++msgstr "Durée allumée"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "Il faut indiquer un nom d'hôte ou une adresse MAC !"
++
++msgid "One or more fields contain invalid values!"
++msgstr "Un ou plusieurs champs contiennent des valeurs incorrectes !"
++
++msgid "One or more required fields have no value!"
++msgstr "Un ou plusieurs champs n'ont pas de valeur !"
++
++msgid "Open list..."
++msgstr "Ouvrir la liste…"
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Option modifiée"
++
++msgid "Option removed"
++msgstr "Option retirée"
++
++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 "Options"
++msgstr "Options"
++
++msgid "Other:"
++msgstr "Autres :"
++
++msgid "Out"
++msgstr "Sortie"
++
++msgid "Outbound:"
++msgstr "Extérieur :"
++
++msgid "Outdoor Channels"
++msgstr "Canaux en extérieur"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "Modifier l'adresse MAC"
++
++msgid "Override MTU"
++msgstr "Modifier le MTU"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "Modifier la passerelle dans les réponses DHCP"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++"Remplacer le masque réseau envoyés aux clients. Il est normalement calculé à "
++"partir du sous-réseau géré."
++
++msgid "Override the table used for internal routes"
++msgstr "Modifier la table utilisée pour les routes internes"
++
++msgid "Overview"
++msgstr "Vue d'ensemble"
++
++msgid "Owner"
++msgstr "Propriétaire"
++
++msgid "PAP/CHAP password"
++msgstr "Mot de passe PAP/CHAP"
++
++msgid "PAP/CHAP username"
++msgstr "Identifiant PAP/CHAP"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "code PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "PPPoA Encapsulation"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "Nécessite le paquet libiwinfo !"
++
++msgid "Package lists are older than 24 hours"
++msgstr "Les listes de paquets ont plus de 24 heures"
++
++msgid "Package name"
++msgstr "Nom du paquet"
++
++msgid "Packets"
++msgstr "Paquets"
++
++msgid "Part of zone %q"
++msgstr "Fait partie de la zone %q"
++
++msgid "Password"
++msgstr "Mot de passe"
++
++msgid "Password authentication"
++msgstr "Authentification par mot de passe"
++
++msgid "Password of Private Key"
++msgstr "Mot de passe de la clé privée"
++
++msgid "Password successfully changed!"
++msgstr "Mot de passe changé avec succès !"
++
++msgid "Path to CA-Certificate"
++msgstr "Chemin de la CA"
++
++msgid "Path to Client-Certificate"
++msgstr "Chemin du certificat-client"
++
++msgid "Path to Private Key"
++msgstr "Chemin de la clé privée"
++
++msgid "Path to executable which handles the button event"
++msgstr "Chemin du programme exécutable gérant les évènements liés au bouton"
++
++msgid "Peak:"
++msgstr "Pic :"
++
++msgid "Perform reboot"
++msgstr "Redémarrer"
++
++msgid "Perform reset"
++msgstr "Réinitialiser"
++
++msgid "Phy Rate:"
++msgstr "Débit de la puce:"
++
++msgid "Physical Settings"
++msgstr "Paramètres physiques"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Pkts."
++msgstr "Pqts."
++
++msgid "Please enter your username and password."
++msgstr "Saisissez votre nom d'utilisateur et mot de passe."
++
++msgid "Policy"
++msgstr "Politique"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Port %d"
++msgstr "Port %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr "Le port %d n'est pas marqué dans plusieurs VLANs !"
++
++msgid "Port status:"
++msgstr "Statut du port :"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++"Suppose que le distant a disparu une fois le nombre donné d'erreurs d'échos "
++"LCP ; utiliser 0 pour ignorer ces erreurs"
++
++msgid "Prevents client-to-client communication"
++msgstr "Empêche la communication directe entre clients"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Contrôleur sans fil Prism2/2.5/3 802.11b"
++
++msgid "Proceed"
++msgstr "Continuer"
++
++msgid "Processes"
++msgstr "Processus"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protocole"
++
++msgid "Protocol family"
++msgstr "Famille du protocole"
++
++msgid "Protocol of the new interface"
++msgstr "Protocole de la nouvelle interface"
++
++msgid "Protocol support is not installed"
++msgstr "La gestion du protocole n'est pas installée"
++
++msgid "Provide NTP server"
++msgstr "Fournir serveur NTP"
++
++msgid "Provide new network"
++msgstr "Donner un nouveau réseau"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "Qualitée"
++
++msgid "RTS/CTS Threshold"
++msgstr "Seuil RTS/CTS"
++
++msgid "RX"
++msgstr "Reçu"
++
++msgid "RX Rate"
++msgstr "Débit en réception"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "Contrôleur sans fil RaLink 802.11%s"
++
++msgid "Radius-Accounting-Port"
++msgstr "Port de la comptabilisation Radius"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Secret de la comptabilisation Radius"
++
++msgid "Radius-Accounting-Server"
++msgstr "Serveur de la comptabilisation Radius"
++
++msgid "Radius-Authentication-Port"
++msgstr "Port de l'authentification Radius"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Secret de l'authentification Radius"
++
++msgid "Radius-Authentication-Server"
++msgstr "Serveur de l'authentification Radius"
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++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."
++msgstr ""
++"Voulez-vous vraiment supprimer cette interface? L'effacement ne peut être "
++"annulé!\n"
++"Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par "
++"cette interface."
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"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 "
++"annulé!\n"
++"Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par ce "
++"réseau."
++
++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 "
++"connected via this interface."
++msgstr ""
++"Voulez-vous vraiment arrêter l'interface %s ?\n"
++"Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par "
++"cette interface."
++
++msgid ""
++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
++"you are connected via this interface."
++msgstr ""
++"Voulez-vous vraiment arrêter l'interface %s ?\n"
++"Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par "
++"cette interface."
++
++msgid "Really switch protocol?"
++msgstr "Voulez-vous vraiment changer de protocole ?"
++
++msgid "Realtime Connections"
++msgstr "Connexions temps-réel"
++
++msgid "Realtime Graphs"
++msgstr "Graphiques temps-réel"
++
++msgid "Realtime Load"
++msgstr "Charge temps-réel"
++
++msgid "Realtime Traffic"
++msgstr "Trafic temps-réel"
++
++msgid "Realtime Wireless"
++msgstr "Qualité de réception actuelle"
++
++msgid "Rebind protection"
++msgstr "Protection contre l'attaque « rebind »"
++
++msgid "Reboot"
++msgstr "Redémarrage"
++
++msgid "Rebooting..."
++msgstr "Redémarre…"
++
++msgid "Reboots the operating system of your device"
++msgstr "Redémarrage du système d'exploitation de votre équipement"
++
++msgid "Receive"
++msgstr "Reçoit"
++
++msgid "Receiver Antenna"
++msgstr "Antenne émettrice"
++
++msgid "Reconnect this interface"
++msgstr "Reconnecter cet interface"
++
++msgid "Reconnecting interface"
++msgstr "Reconnecte cet interface"
++
++msgid "References"
++msgstr "Références"
++
++msgid "Regulatory Domain"
++msgstr "Domaine de certification"
++
++msgid "Relay"
++msgstr "Relais"
++
++msgid "Relay Bridge"
++msgstr "Pont-relais"
++
++msgid "Relay between networks"
++msgstr "Relais entre réseaux"
++
++msgid "Relay bridge"
++msgstr "Pont-relais"
++
++msgid "Remote IPv4 address"
++msgstr "Adresse IPv4 distante"
++
++msgid "Remove"
++msgstr "Désinstaller"
++
++msgid "Repeat scan"
++msgstr "Répéter la recherche"
++
++msgid "Replace entry"
++msgstr "Remplacer l'entrée"
++
++msgid "Replace wireless configuration"
++msgstr "Remplacer la configuration sans-fil"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "Nécessaire avec certains FAIs, par ex. : Charter avec DOCSIS 3"
++
++msgid "Reset"
++msgstr "Remise à zéro"
++
++msgid "Reset Counters"
++msgstr "Remise à zéro des compteurs"
++
++msgid "Reset to defaults"
++msgstr "Ré-initialisation"
++
++msgid "Resolv and Hosts Files"
++msgstr "Fichiers Resolv et Hosts"
++
++msgid "Resolve file"
++msgstr "Fichier de résolution des noms"
++
++msgid "Restart"
++msgstr "Redémarrer"
++
++msgid "Restart Firewall"
++msgstr "Redémarrer le pare-feu"
++
++msgid "Restore backup"
++msgstr "Restaurer une sauvegarde"
++
++msgid "Reveal/hide password"
++msgstr "Montrer/cacher le mot de passe"
++
++msgid "Revert"
++msgstr "Revenir"
++
++msgid "Root"
++msgstr "Racine"
++
++msgid "Root directory for files served via TFTP"
++msgstr "Répertoire racine des fichiers fournis par TFTP"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Mot de passe du routeur"
++
++msgid "Routes"
++msgstr "Routes"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Avec les routes statiques vous pouvez spécifier à travers quelle interface "
++"ou passerelle un réseau peut être contacté."
++
++msgid "Rule #"
++msgstr "N° de règle"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++"Faire un vérification du système de fichiers avant de monter le périphérique"
++
++msgid "Run filesystem check"
++msgstr "Faire une vérification du système de fichiers"
++
++msgid ""
++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
++"use 6in4 instead"
++msgstr ""
++
++msgid "SIXXS-handle[/Tunnel-ID]"
++msgstr ""
++
++msgid "SSH Access"
++msgstr "Accès SSH"
++
++msgid "SSH-Keys"
++msgstr "Clés SSH"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Sauvegarder"
++
++msgid "Save & Apply"
++msgstr "Sauvegarder et Appliquer"
++
++msgid "Save &#38; Apply"
++msgstr "Sauvegarder et appliquer"
++
++msgid "Scan"
++msgstr "Scan"
++
++msgid "Scheduled Tasks"
++msgstr "Tâches Régulières"
++
++msgid "Section added"
++msgstr "Section ajoutée"
++
++msgid "Section removed"
++msgstr "Section retirée"
++
++msgid "See \"mount\" manpage for details"
++msgstr "Voir le manuel de « mount » pour les détails"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++"Envoyer des demandes d'échos LCP à intervalles donnés, en secondes ; utile "
++"uniqument associé à un seuil d'erreurs"
++
++msgid "Separate Clients"
++msgstr "Isoler les clients"
++
++msgid "Separate WDS"
++msgstr "WDS séparé"
++
++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"
++
++msgid "Service Type"
++msgstr "Type du service"
++
++msgid "Services"
++msgstr "Services"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "Configurer la synchronisation de l'heure"
++
++msgid "Setup DHCP Server"
++msgstr "Configurer le serveur DHCP"
++
++msgid "Show current backup file list"
++msgstr "Afficher la liste des fichiers de la sauvegarde actuelle"
++
++msgid "Shutdown this interface"
++msgstr "Arrêter cet interface"
++
++msgid "Shutdown this network"
++msgstr "Arrêter ce réseau"
++
++msgid "Signal"
++msgstr "Signal"
++
++msgid "Signal:"
++msgstr "Signal :"
++
++msgid "Size"
++msgstr "Taille"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "Passer au suivant"
++
++msgid "Skip to content"
++msgstr "Skip to content"
++
++msgid "Skip to navigation"
++msgstr "Skip to navigation"
++
++msgid "Slot time"
++msgstr "Tranche de temps"
++
++msgid "Software"
++msgstr "Logiciels"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Certains champs sont invalides, ne peut sauvegarder les valeurs !"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Désolé, l'objet que vous avez demandé n'as pas été trouvé."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "Désolé, le serveur à rencontré une erreur inattendue."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"Désolé, il n'y a pas de gestion de mise à jour disponible, une nouvelle "
++"image du micrologiciel doit être écrite manuellement. Reportez-vous S.V.P. "
++"au wiki OpenWrt pour connaître les instructions d'installation spécifiques à "
++"votre matériel."
++
++msgid "Sort"
++msgstr "Trier"
++
++msgid "Source"
++msgstr "Source"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "Indique l'état du bouton à gérer"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "Indique le répertoire auquel le périphérique est rattaché"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "Indique le port d'écoute de cette instance <em>Dropbear</em>"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++"Indique le nombre de requêtes ARP ratées au delà duquel les hôtes seront "
++"supposés disparus"
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr "Indique le délai après quoi les hôtes seront supposés disparus"
++
++msgid "Specify the secret encryption key here."
++msgstr "Spécifiez ici la clé secrète de chiffrage."
++
++msgid "Start"
++msgstr "Démarrer"
++
++msgid "Start priority"
++msgstr "Priorité de démarrage"
++
++msgid "Startup"
++msgstr "Démarrage"
++
++msgid "Static IPv4 Routes"
++msgstr "Routes IPv4 statiques"
++
++msgid "Static IPv6 Routes"
++msgstr "Routes IPv6 statiques"
++
++msgid "Static Leases"
++msgstr "Baux Statiques"
++
++msgid "Static Routes"
++msgstr "Routes statiques"
++
++msgid "Static WDS"
++msgstr "WDS statique"
++
++msgid "Static address"
++msgstr "Adresse statique"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"Les baux statiques sont utilisés pour donner des adresses IP fixes et des "
++"noms symboliques à des clients DHCP. Il sont également nécessaires pour les "
++"interfaces sans configuration dynamique où l'on fournit un bail aux seuls "
++"hôtes configurés."
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Stop"
++msgstr "Arrêter"
++
++msgid "Strict order"
++msgstr "Ordre stricte"
++
++msgid "Submit"
++msgstr "Soumettre"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Élement de partition d'échange"
++
++msgid "Switch"
++msgstr "Commutateur"
++
++msgid "Switch %q"
++msgstr "Commutateur %q"
++
++msgid "Switch %q (%s)"
++msgstr "Commutateur %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Protocole du commutateur"
++
++msgid "Sync with browser"
++msgstr "Synchro avec le navigateur"
++
++msgid "Synchronizing..."
++msgstr "Synchronisation…"
++
++msgid "System"
++msgstr "Système"
++
++msgid "System Log"
++msgstr "Journal système"
++
++msgid "System Properties"
++msgstr "Propriétés système"
++
++msgid "System log buffer size"
++msgstr "Taille du tampon du journal système"
++
++msgid "TCP:"
++msgstr "TCP :"
++
++msgid "TFTP Settings"
++msgstr "Paramètres TFTP"
++
++msgid "TFTP server root"
++msgstr "Racine du serveur TFTP"
++
++msgid "TX"
++msgstr "Transmis"
++
++msgid "TX Rate"
++msgstr "Débit en émission"
++
++msgid "Table"
++msgstr "Table"
++
++msgid "Target"
++msgstr "Cible"
++
++msgid "Terminate"
++msgstr "Terminer"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"La section <em>Configuration de l'équipement</em> couvre les paramètres "
++"physiques du matériel radio comme le canal, la puissance d'émission ou la "
++"sélection de l'antenne, qui sont partagés entre tous les réseaux sans-fil "
++"définis (si le matériel radio gère plusieurs réseaux SSID). Les paramètres "
++"dépendant de chaque réseau comme le chiffrage ou le mode de fonctionnement "
++"sont groupés dans <em>Configuration de l'interface</em>."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"Le paquet <em>libiwinfo-lua</em> n'est pas installé. Vous devez l'installer "
++"pour une configuration sans-fil fonctionnelle !"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++"Le préfixe IPv6 attribué par le fournisseur, se termine généralement par "
++"<code>::</code>"
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++"Les caractères autorisés sont : <code>A-Z</code>, <code>a-z</code>, "
++"<code>0-9</code> et <code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr "Le périphérique de bloc contenant la partition (ex : /dev/sda1)"
++
++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 ""
++"Le système de fichiers utilisé pour formatter le support de stockage (ex : "
++"ext3)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++"L'image du micrologiciel a été chargée. Ci-dessous la taille et la somme de "
++"contrôle de cette image, comparez-les avec le fichier original pour vous "
++"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"
++
++msgid "The following rules are currently active on this system."
++msgstr "Les règles suivantes sont actuellement actives sur ce système."
++
++msgid "The given network name is not unique"
++msgstr "Le nom de réseau donné n'est pas unique"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"Le matériel ne sait pas gérer plusieurs SSID et la configuration existante "
++"sera remplacée si vous continuez."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++"La longueur du préfixe IPv4 en bits, le reste est utilisé dans les adresses "
++"IPv6"
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "La longueur du préfixe IPv6 en bits"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++"Les ports de votre équipement peuvent être configurés pour combiner "
++"plusieurs <abbr title=\"Virtual Local Area Network\">VLANs</abbr> dans "
++"lesquels les machines connectées peuvent dialoguer directement l'une avec "
++"l'autre. Les <abbr title=\"Virtual Local Area Network\">VLAN</abbr>s sont "
++"souvent utilisés pour séparer différences sous-réseaux. Bien souvent il y a "
++"un port d'uplink pour une connexion vers un réseau plus vaste, comme "
++"internet et les autres ports sont réservés au réseau local."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "Le protocole sélectionné nécessite l'attribution d'un périphérique"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++"Le système est en train d'effacer la partition de configuration et "
++"redémarrera tout seul une fois cela fini."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes until you try to reconnect. It might be necessary to renew the "
++"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."
++msgstr ""
++"The uploaded image file does not contain a supported format. Make sure that "
++"you choose the generic image format for your platform."
++
++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 pending changes to revert!"
++msgstr "Il n'y a aucun changement à annuler !"
++
++msgid "There are no pending changes!"
++msgstr "Il n'y a aucun changement en attente !"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"Il n'y a aucun périphérique attribué pour l'instant, liez s.v.p. un "
++"périphérique réseau dans l'onglet \"Paramètres du matériel\""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"Ce routeur n'a pas de mot de passe configuré. Veuillez configurer un mot de "
++"passe pour l'utilisateur root pour protéger l'accès de votre interface web "
++"et activer l'accès par SSH."
++
++msgid "This IPv4 address of the relay"
++msgstr "L'adresse IPv4 du relais"
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"Voici la liste des motifs de type glob shell utilisés pour sélectionner les "
++"fichiers et répertoires à inclure durant la mise à jour système. Les "
++"fichiers modifiés dans /etc/config/ et certains autres sont automatiquement "
++"conservés."
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"Voici le contenu de /etc/rc.local. Placez-y vos propres commandes (avant le "
++"« exit 0 ») pour qu'ils soient exécutés en fin de démarrage."
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++"Il s'agit de l'adresse de l'extrémité locale attribuée par le fournisseur de "
++"tunnels, elle se termine habituellement avec <code>:2</code>"
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr "C'est le seul serveur DHCP sur le réseau local"
++
++msgid "This is the plain username for logging into the account"
++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 ""
++"Ceci est le système crontab avec lequel sont définies les tâches récurrentes."
++
++msgid ""
++"This is usually the address of the nearest PoP operated by the tunnel broker"
++msgstr ""
++"Il s'agit habituellement de l'adresse du plus proche PoP géré par le "
++"fournisseur de tunnels"
++
++msgid ""
++"This list gives an overview over currently running system processes and "
++"their status."
++msgstr ""
++"Cette liste donne une vue d'ensemble des processus en exécution et leur "
++"statut."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr "Cette page permet la configuration d'actions spécifiques des boutons"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++"Cette page donne une vue d'ensemble des connexions réseaux actuellement "
++"actives."
++
++msgid "This section contains no values yet"
++msgstr "Cette section ne contient pas encore de valeur"
++
++msgid "Time Synchronization"
++msgstr "Synchronisation de l'heure"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "La synchronisation de l'heure n'est pas encore configurée."
++
++msgid "Timezone"
++msgstr "Fuseau horaire"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"Pour restaurer les fichiers de configuration, vous pouvez charger ici une "
++"archive de sauvegarde construite précédemment."
++
++msgid "Total Available"
++msgstr "Total disponible"
++
++msgid "Traceroute"
++msgstr "Traceroute"
++
++msgid "Traffic"
++msgstr "Trafic"
++
++msgid "Transfer"
++msgstr "Transfert"
++
++msgid "Transmission Rate"
++msgstr "Débit d'émission"
++
++msgid "Transmit"
++msgstr "Transmet"
++
++msgid "Transmit Power"
++msgstr "Puissance d'émission"
++
++msgid "Transmitter Antenna"
++msgstr "Antenne émettrice"
++
++msgid "Trigger"
++msgstr "Déclenchement"
++
++msgid "Trigger Mode"
++msgstr "Mode de déclenchement"
++
++msgid "Tunnel ID"
++msgstr "ID du tunnel"
++
++msgid "Tunnel Interface"
++msgstr "Interface du tunnel"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Mode Turbo"
++
++msgid "Tx-Power"
++msgstr "Puissance d'émission"
++
++msgid "Type"
++msgstr "Type"
++
++msgid "UDP:"
++msgstr "UDP :"
++
++msgid "UMTS only"
++msgstr "seulement UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "Périphérique USB"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr "Impossible d'envoyer"
++
++msgid "Unknown"
++msgstr "Inconnu"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Erreur inconnue, mot de passe inchangé !"
++
++msgid "Unmanaged"
++msgstr "non-géré"
++
++msgid "Unsaved Changes"
++msgstr "Changements non appliqués"
++
++msgid "Unsupported protocol type."
++msgstr "Type de protocole non pris en charge."
++
++msgid "Update lists"
++msgstr "Mettre les listes à jour"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"Envoyer ici une image compatible avec le système de mise à jour pour "
++"remplacer le micrologiciel actuel. Cochez \"Garder la configuration\" pour "
++"maintenir la configuration actuelle (nécessite une image de micrologiciel "
++"OpenWRT compatible)."
++
++msgid "Upload archive..."
++msgstr "Envoi de l'archive…"
++
++msgid "Uploaded File"
++msgstr "Fichier Uploadé"
++
++msgid "Uptime"
++msgstr "Uptime"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Utiliser /etc/ethers"
++
++msgid "Use DHCP gateway"
++msgstr "Utiliser la passerelle DHCP"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "Utiliser les serveurs DNS publiés par le distant"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "Utiliser les codes-pays ISO/IEC 3166 alpha2."
++
++msgid "Use MTU on tunnel interface"
++msgstr "Utiliser le MTU sur l'interface du tunnel"
++
++msgid "Use TTL on tunnel interface"
++msgstr "Utiliser le TTL sur l'interface du tunnel"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "Utiliser une marque de diffusion"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "Utiliser des serveurs DNS spécifiques"
++
++msgid "Use default gateway"
++msgstr "Utiliser la passerelle par défaut"
++
++msgid "Use gateway metric"
++msgstr "Utiliser la métrique de la passerelle"
++
++msgid "Use routing table"
++msgstr "Utiliser la table de routage"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"Utiliser le bouton <em>Ajouter</em> pour créer un nouveau bail. "
++"L'<em>adresse MAC</em> identifie l'hôte, l'<em>adresse IPv4</em> décrit "
++"l'adresse fixe à utiliser et le <em>nom d'hôte</em> sera le nom symbolique "
++"attribué à l'hôte qui fait la demande."
++
++msgid "Used"
++msgstr "Utilisé"
++
++msgid "Used Key Slot"
++msgstr "Clé utilisée"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Nom d'utilisateur"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "Interface du VLAN"
++
++msgid "VLANs on %q"
++msgstr "VLANs sur %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLANs sur %q (%s)"
++
++msgid "VPN Server"
++msgstr "Serveur VPN"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++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"
++
++msgid "Version"
++msgstr "Version"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "Système ouvert WEP"
++
++msgid "WEP Shared Key"
++msgstr "Clé partagée WEP"
++
++msgid "WEP passphrase"
++msgstr "Mot de passe WEP"
++
++msgid "WMM Mode"
++msgstr "Mode WMM"
++
++msgid "WPA passphrase"
++msgstr "Mot de passe WPA"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Attention"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wi-Fi"
++
++msgid "Wireless"
++msgstr "Sans-fil"
++
++msgid "Wireless Adapter"
++msgstr "Module Wi-Fi"
++
++msgid "Wireless Network"
++msgstr "Réseau sans-fil"
++
++msgid "Wireless Overview"
++msgstr "Présentation des réseaux sans-fil"
++
++msgid "Wireless Security"
++msgstr "Sécurité des réseaux sans-fil"
++
++msgid "Wireless is disabled or not associated"
++msgstr "Le Wi-Fi est désactivé ou non associé"
++
++msgid "Wireless is restarting..."
++msgstr "Le Wi-Fi est ré-initialisé…"
++
++msgid "Wireless network is disabled"
++msgstr "Le réseau Wi-Fi est désactivé"
++
++msgid "Wireless network is enabled"
++msgstr "Le réseau Wi-Fi est activé"
++
++msgid "Wireless restarted"
++msgstr "Wi-Fi ré-initialisé"
++
++msgid "Wireless shut down"
++msgstr "Wi-Fi arrêté"
++
++msgid "Write received DNS requests to syslog"
++msgstr "Écrire les requêtes DNS reçues dans syslog"
++
++msgid "XR Support"
++msgstr "Gestion du mode XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Vous pouvez ici activer ou désactiver les scripts d'initialisation "
++"installés. Les changements seront pris en compte après un redémarrage.<br/"
++"><strong>Attention: Si vous désactivez des scripts essentiels comme \"réseau"
++"\", votre équipement pourrait ne plus être accessible&#160;!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Vous devez activer Java Script dans votre navigateur pour que LuCI "
++"fonctionne correctement."
++
++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 ""
++
++msgid "any"
++msgstr "n'importe lequel"
++
++msgid "auto"
++msgstr "auto"
++
++#, fuzzy
++msgid "automatic"
++msgstr "statique"
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "ponté"
++
++msgid "create:"
++msgstr "créer:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "créer un bridge entre plusieurs interfaces"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "désactiver"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "expiré"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr "fichier dans lequel les baux DHCP seront stockés"
++
++msgid "forward"
++msgstr "transfert"
++
++msgid "full-duplex"
++msgstr "full-duplex"
++
++msgid "half-duplex"
++msgstr "half-duplex"
++
++msgid "help"
++msgstr "aide"
++
++msgid "hidden"
++msgstr "cacher"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "si la destination est un réseau"
++
++msgid "input"
++msgstr "entrée"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "non"
++
++msgid "no link"
++msgstr "pas de lien"
++
++msgid "none"
++msgstr "aucun"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "Arrêté"
++
++msgid "on"
++msgstr "Actif"
++
++msgid "open"
++msgstr "ouvrir"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "routé"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "marqué"
++
++msgid "unknown"
++msgstr "inconnu"
++
++msgid "unlimited"
++msgstr "non limité"
++
++msgid "unspecified"
++msgstr "non précisé"
++
++msgid "unspecified -or- create:"
++msgstr "non précisé -ou- créer :"
++
++msgid "untagged"
++msgstr "non marqué"
++
++msgid "yes"
++msgstr "oui"
++
++msgid "« Back"
++msgstr "« Retour"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "Activer la négociation IPv6 sur le lien PPP"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "Ignorer le fichiers Hosts"
++
++#~ msgid "Path"
++#~ msgstr "Chemin"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Patientez s'il vous plaît: équipement en cours de redémarrage..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Attention : il reste des changements non appliqués qui seront perdus "
++#~ "après redémarrage !"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Toujours utiliser des canaux de 40MHz même si les canaux secondaires "
++#~ "peuvent chevaucher d'autres réseaux. Activer cette option n'est pas "
++#~ "compatible avec l'amendement IEEE 802.11n-2009 !"
++
++#~ msgid "Cached"
++#~ msgstr "Mis en cache"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr ""
++#~ "Configure ce point de montage comme remplacement externe du système de "
++#~ "fichier racine"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "Forcer le mode 40MHz"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Sauts en fréquence"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "Verrouilé sur le canal %d utilisé par %s"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "Utiliser comme racine du système de fichiers"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "Identifiant HE.net"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr ""
++#~ "Il s'agit de l'identifiant de 32 octets codés en hexa, pas du nom de "
++#~ "connexion"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "2ème canal 40MHz supérieur"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "2ème canal 40MHz inférieur"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Accepter les publications du routeur"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Publier l'adressage IPv6 sur le réseau"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "ID réseau publiée"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "La gamme autorisée va de 1 à 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "Capacités HT"
++
++#~ msgid "HT mode"
++#~ msgstr "Mode HT"
++
++#~ msgid "Router Model"
++#~ msgstr "Modèle de routeur"
++
++#~ msgid "Router Name"
++#~ msgstr "Nom du routeur"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "Envoyer des sollicitations au routeur"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr "Indique la durée de préférence du préfixe publiée, en secondes"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr "Indique la durée de validité du préfixe publiée, en secondes"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "Utiliser la durée de préférence"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "Utiliser la durée de validité"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Attente du routeur…"
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "Activer le serveur NTP intégré"
++
++#~ msgid "Active Leases"
++#~ msgstr "Baux actifs"
++
++#~ msgid "Open"
++#~ msgstr "Ouvert"
++
++#~ msgid "KB"
++#~ msgstr "Ko"
++
++#~ msgid "Bit Rate"
++#~ msgstr "Débit"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "Configuration / Appliquer"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "Configuration / Changements"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "Configuration / Annuler les changements"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MAC Address"
++#~ msgstr "Adresse MAC"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "Chiffré"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "Recherche <abbr title=\"Wireless Local Area Network\">WLAN</abbr>"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "Choisissez le réseau auquel vous voulez affecter cette interface sans-"
++#~ "fil. Sélectionnez <em>non précisé</em> pour ne pas l'affecter à un réseau "
++#~ "ou remplissez le champ <em>créer</em> pour définir un nouveau réseau."
++
++#~ msgid "Create Network"
++#~ msgstr "Créer un réseau"
++
++#~ msgid "Link"
++#~ msgstr "Lien"
++
++#~ msgid "Networks"
++#~ msgstr "Réseaux"
++
++#~ msgid "Power"
++#~ msgstr "Puissance"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Réseaux Wi-Fi dans votre environnement"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "Adresse/préfixe en notation <abbr title=\"Classless Inter-Domain Routing"
++#~ "\">CIDR</abbr>"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "Serveur <abbr title=\"Domain Name System\">DNS</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "Diffusion <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "Adresse <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++#~ msgid "IP-Aliases"
++#~ msgstr "Alias IP"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "Configuration IPv6"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "Note : si vous choisissez ici une interface faisant partie d'un autre "
++#~ "réseau, il sera déplacé dans ce réseau."
++
++#~ msgid ""
++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might "
++#~ "lose access to this router if you are connected via this interface."
++#~ msgstr ""
++#~ "Vraiment supprimer cet interface ? L'effacement ne peut être annulé !"
++#~ "\\nVous pourriez perdre l'accès à ce routeur si vous y êtes connecté par "
++#~ "cette interface."
++
++#~ msgid ""
++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou "
++#~ "might lose access to this router if you are connected via this network."
++#~ msgstr ""
++#~ "Vraiment supprimer ce réseau sans-fil ? effacement ne peut être annulé !"
++#~ "\\nVous pourriez perdre l'accès à ce routeur si vous y êtes connecté par "
++#~ "ce réseau."
++
++#~ msgid ""
++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router "
++#~ "if you are connected via this interface."
++#~ msgstr ""
++#~ "Vraiment arrêter cet interface « %s » ?\\nVous pourriez perdre l'accès à "
++#~ "ce routeur si vous y êtes connecté par cette interface."
++
++#~ msgid ""
++#~ "Really shutdown network ?\\nYou might lose access to this router if you "
++#~ "are connected via this interface."
++#~ msgstr ""
++#~ "Vraiment arrêter ce réseau ?\\nVous pourriez perdre l'accès à ce routeur "
++#~ "si vous y êtes connecté par ce réseau."
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "Les ports de votre routeur peuvent être configurés pour combiner "
++#~ "plusieurs VLANs dans lesquels les machines connectées peuvent dialoguer "
++#~ "directement l'une avec l'autre. Les VLANs sont souvent utilisés pour "
++#~ "séparer différences sous-réseaux. Bien souvent il y a un port d'uplink "
++#~ "pour une connexion vers un réseau plus vaste, comme internet et les "
++#~ "autres ports sont réservés au réseau local."
++
++#~ msgid "Enable buffering"
++#~ msgstr "Activer l'utilisation de tampons"
++
++#~ msgid "IPv6-over-IPv4"
++#~ msgstr "IPv6 par dessus IPv4"
++
++#~ msgid "Custom Files"
++#~ msgstr "Fichiers spécifiques"
++
++#~ msgid "Custom files"
++#~ msgstr "Fichiers spécifiques"
++
++#~ msgid "Detected Files"
++#~ msgstr "Fichiers détectés"
++
++#~ msgid "Detected files"
++#~ msgstr "Fichiers détectés"
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Fichiers à conserver lors d'une mise à jour du micrologiciel"
++
++#~ msgid "General"
++#~ msgstr "Général"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Ici, vous pouvez personnaliser les réglages et les fonctionnalités de "
++#~ "LuCI."
++
++#~ msgid "Post-commit actions"
++#~ msgstr "Actions post-changements"
++
++#~ msgid ""
++#~ "The following files are detected by the system and will be kept "
++#~ "automatically during sysupgrade"
++#~ msgstr ""
++#~ "Les fichiers suivants ont été détectés par le système et seront "
++#~ "automatiquement préservés pendant la mise à jour"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Ces commandes seront executées automatiquement lorsqu'une configuration "
++#~ "UCI est appliquée, les changement prenant effet immédiatement."
++
++#~ msgid ""
++#~ "This is a list of shell glob patterns for matching files and directories "
++#~ "to include during sysupgrade"
++#~ msgstr ""
++#~ "Voici une liste de motifs de sélection shell pour sélectionner les "
++#~ "fichiers et répertoires à inclure durant une mise à jour"
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "IU Web"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "Serveur <abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>"
++
++#~ msgid "AHCP Settings"
++#~ msgstr "Paramètres AHCP"
++
++#~ msgid "ARP ping retries"
++#~ msgstr "Essais de ping ARP"
++
++#~ msgid "ATM Settings"
++#~ msgstr "Paramètres ATM"
++
++#~ msgid "Accept Router Advertisements"
++#~ msgstr "Accepter les publications du routeur"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Point d'accès (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Options pppd supplémentaires"
++
++#~ msgid "Allowed range is 1 to FFFF"
++#~ msgstr "Plage autorisée de 1 à FFFF"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Déconnexion automatique"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Archive à restaurer"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Configurer le serveur DNS local pour utiliser le serveur de nom fourni "
++#~ "par le pair PPP"
++
++#~ msgid "Connect script"
++#~ msgstr "Script de Connexion"
++
++#~ msgid "Create backup"
++#~ msgstr "Créer une archive de sauvegarde"
++
++#~ msgid "Default"
++#~ msgstr "Défaut"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Script de Déconnexion"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Editer la liste des paquets et le répertoire de destination"
++
++#~ msgid "Enable 4K VLANs"
++#~ msgstr "Activer les VLANs 4K"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Activer l'IPv6 sur le lien PPP"
++
++#~ msgid "Firmware image"
++#~ msgstr "Firmware image"
++
++#~ msgid "Forward DHCP"
++#~ msgstr "Transmission du DHCP"
++
++#~ msgid "Forward broadcasts"
++#~ msgstr "Transmission des diffusions"
++
++#~ msgid "HE.net Tunnel ID"
++#~ msgstr "Identifiant du tunnel HE.net"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Ici, vous pouvez sauvegarder et restaurer la configuration de votre "
++#~ "routeur et, si possible, restaurer la configuration par défaut du routeur."
++
++#~ msgid "Installation targets"
++#~ msgstr "Répertoires de destination"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Keep configuration files"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Maintenir la connexion"
++
++#~ msgid "Kernel"
++#~ msgstr "Noyau"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Laisser pppd remplacer la route par défaut courante pour utiliser "
++#~ "l'interface PPP après l'établissement de la connexion"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr "pppd exécutera ce script après l'établissement du lien PPP"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "pppd exécutera ce script avant de déconnecter le lien PPP"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Assurez-vous de fournir le bon code PIN ou vous pourriez bloquer votre "
++#~ "carte SIM !"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "La plupart d'entre eux sont des serveurs réseaux, qui vous offrent "
++#~ "certains services comme un accès shell, accéder à des pages comme LuCI, "
++#~ "faire du routage mesh, envoyer des e-mails ..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr "Reconnexion si la connexion est perdue"
++
++#~ msgid "Override Gateway"
++#~ msgstr "Remplacer la passerelle"
++
++#~ msgid "PIN code"
++#~ msgstr "code PIN"
++
++#~ msgid "PPP Settings"
++#~ msgstr "Paramètres PPP"
++
++#~ msgid "Package lists"
++#~ msgstr "Listes de paquets"
++
++#~ msgid ""
++#~ "Port <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> specify the default "
++#~ "VLAN ID added to received untagged frames."
++#~ msgstr ""
++#~ "Le numéro de port <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> indique "
++#~ "l'identifiant VLAN attribué aux trames non marquées"
++
++#~ msgid "Port PVIDs on %q"
++#~ msgstr "Port PVIDs sur %q"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr ""
++#~ "Etes-vous sûr de vouloir revenir à la configuration par défaut du "
++#~ "firmware ?"
++
++#~ msgid "Processor"
++#~ msgstr "Processeur"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Port Radius"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Serveur Radius"
++
++#~ msgid "Relay Settings"
++#~ msgstr "Paramètres du relais"
++
++#~ msgid "Replace default route"
++#~ msgstr "Remplacer la route par défaut"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Revenir à la configuration par défaut du routeur"
++
++#~ msgid "Routing table ID"
++#~ msgstr "ID de la table de routage"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr ""
++#~ "Secondes à attendre pour que le modem soit prêt avant d'essayer de se "
++#~ "connecter"
++
++#~ msgid "Send Router Solicitiations"
++#~ msgstr "Envoyer des sollicitations de routeur"
++
++#~ msgid "Server IPv4-Address"
++#~ msgstr "Adresse IPv4 du serveur"
++
++#~ msgid "Service type"
++#~ msgstr "Type de service"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr ""
++#~ "Les services et démons accomplissent certaines tâches sur votre "
++#~ "équipement."
++
++#~ msgid "Settings"
++#~ msgstr "Réglages"
++
++#~ msgid "Setup wait time"
++#~ msgstr "Délai d'initialisation"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr ""
++#~ "Spécifiez ici des arguments de ligne de commande supplémentaire pour pppd"
++
++#~ msgid "TTL"
++#~ msgstr "TTL"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "Le noeud d'interface de votre modem, e.g. /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr "Délai d'inactivité à partir duquel la connexion est coupée"
++
++#~ msgid "Time Server (rdate)"
++#~ msgstr "Serveur de temps (rdate)"
++
++#~ msgid "Tunnel Settings"
++#~ msgstr "Configurion du tunnel"
++
++#~ msgid "Update package lists"
++#~ msgstr "Mettre à jour la liste des paquets"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "Upload an OpenWrt image file to reflash the device."
++
++#~ msgid "Upload image"
++#~ msgstr "Upload image"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "Utiliser le DNS fourni"
++
++#~ msgid "VLAN %d"
++#~ msgstr "VLAN %d"
++
++#~ msgid ""
++#~ "You can specify multiple DNS servers here, press enter to add a new "
++#~ "entry. Servers entered here will override automatically assigned ones."
++#~ msgstr ""
++#~ "Vous pouvez indiquer plusieurs serveurs DNS ici, tapez Entrée pour "
++#~ "ajouter un nouvel élément. Les serveurs ajoutés ici remplaceront ceux "
++#~ "attribués automatiquement."
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Vous avez besoin d'installer \"comgt\" pour le support UMTS/GPRS, \"ppp-"
++#~ "mod-pppoe\" pour le PPPoE, \"ppp-mod-pppoa\" pour le PPPoA ou \"pptp\" "
++#~ "pour le PPtP"
++
++#~ msgid "back"
++#~ msgstr "retour"
++
++#~ msgid "buffered"
++#~ msgstr "bufferisé"
++
++#~ msgid "cached"
++#~ msgstr "mis en cache"
++
++#~ msgid "free"
++#~ msgstr "libre"
++
++#~ msgid "static"
++#~ msgstr "statique"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> est une suite "
++#~ "logicielle d'applications Lua incluant un <abbr title=\"Model-View-"
++#~ "Controller\">MVC</abbr>-Webframework et une interface web pour "
++#~ "équipements embarqués. <abbr title=\"Lua Configuration Interface\">LuCI</"
++#~ "abbr> est sous license Apache."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "Clés <abbr title=\"Secure Shell\">SSH</abbr>"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr "Un serveur web HTTP/1.1 léger écrit en C et en Lua, créé pour LuCI"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr "Un serveur web léger qui peut être utilisé pour LuCI."
++
++#~ msgid "About"
++#~ msgstr "A propos"
++
++#~ msgid "Active IP Connections"
++#~ msgstr "Connexions IP actives"
++
++#~ msgid "Addresses"
++#~ msgstr "Adresses"
++
++#~ msgid "Admin Password"
++#~ msgstr "Mot de passe administrateur"
++
++#~ msgid "Alias"
++#~ msgstr "Alias"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Domaine d'authentification"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Port du pont"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr "Changer le mot de passe du système (Utilisateur \"root\")"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Client + WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "Fichier de configuration"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Délai de connexion"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Contributeurs"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "DHCP désigné"
++
++#~ msgid "Document root"
++#~ msgstr "Page racine"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Activer le maintien (Keep-Alive)"
++
++#~ msgid "Enable device"
++#~ msgstr "Activer ce périphérique"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "Pont Ethernet"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "Vous pouvez copier ici des clés SSH publiques (une par ligne) pour une "
++#~ "authentification SSH sur clés publiques."
++
++#~ msgid "ID"
++#~ msgstr "ID"
++
++#~ msgid "IP Configuration"
++#~ msgstr "Configuration IP"
++
++#~ msgid "Interface Status"
++#~ msgstr "État de l'interface"
++
++#~ msgid "Lead Development"
++#~ msgstr "Développeurs principaux"
++
++#~ msgid "Master"
++#~ msgstr "Point d'accès"
++
++#~ msgid "Master + WDS"
++#~ msgstr "Point d'accès + WDS"
++
++#~ msgid "No address configured on this interface."
++#~ msgstr "Cette interface n'a Aucune adresse configurée."
++
++#~ msgid "Not configured"
++#~ msgstr "Pas configuré"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Mot de passe changé avec succès"
++
++#~ msgid "Plugin path"
++#~ msgstr "Chemin du greffon"
++
++#~ msgid "Ports"
++#~ msgstr "Ports"
++
++#~ msgid "Primary"
++#~ msgstr "Primaire"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Page d'accueil du projet"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "Pseudo Ad-Hoc"
++
++#~ msgid "STP"
++#~ msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++#~ msgid "Thanks To"
++#~ msgstr "Merci à"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr "Le domaine qui sera affiché lors de la fenêtre d'authentification."
++
++#~ msgid "Unknown Error"
++#~ msgstr "Erreur inconnue"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "fichier de configuration par défaut : /etc/httpd.conf"
++
++#~ msgid "Enable this switch"
++#~ msgstr "Activer ce switch"
++
++#~ msgid "OPKG error code %i"
++#~ msgstr "Code d'erreur OPKG %i"
++
++#~ msgid "Package lists updated"
++#~ msgstr "Liste des paquets mise à jour"
++
++#~ msgid "Reset switch during setup"
++#~ msgstr "Ré-initialiser le switch pendant la configuration"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Mettre à jour les paquets installés"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "Les journaux des services ou du noyau peuvent être vus ici afin d'obtenir "
++#~ "un aperçu de leur état."
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "Ici, vous trouverez des informations sur l'état actuel du système comme "
++#~ "la fréquence processeur, utilisation mémoire et trafic réseau."
++
++#~ msgid "Search file..."
++#~ msgstr "Chercher un fichier..."
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> est une interface "
++#~ "graphique libre, flexible, et orientée utilisateur pour configurer "
++#~ "OpenWrt Kamikaze."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "Et maintenant que la fête commence !"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "Nous souhaitons améliorer l'interface de manière permanente, vos retours "
++#~ "et suggestions sont primordiaux."
++
++#~ msgid "Hello!"
++#~ msgstr "Bonjour !"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Vous trouverez une page de navigation sur le côté gauche permettant "
++#~ "d'accèder aux différentes pages de configuration."
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "Dans les pages suivantes vous pouvez ajuster tous les réglages importants "
++#~ "de votre routeur."
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr "L'équipe LuCI"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr "Voici la page d'administration de LuCI."
++
++#~ msgid "User Interface"
++#~ msgstr "Interface utilisateur"
++
++#~ msgid "enable"
++#~ msgstr "activer"
++
++#~ msgid "(hidden)"
++#~ msgstr "(caché)"
++
++#~ msgid "(optional)"
++#~ msgstr "(optionnel)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "Port <abbr title=\"Domain Name System\">DNS</abbr>"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "Les serveurs <abbr title=\"Domain Name System\">DNS</abbr> du fichier de "
++#~ "résolution seront interrogés dans l'ordre"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr ""
++#~ "Nombre <abbr title=\"maximal\">max.</abbr> d'attributions <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 "taille maximum du paquet. EDNS.0 "
++
++#~ msgid "AP-Isolation"
++#~ msgstr "Isolation AP"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "Ajouter ce réseau Wi-Fi au réseau physique"
++
++#~ msgid "Aliases"
++#~ msgstr "Alias"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Clamp Segment Size"
++
++#, fuzzy
++#~ msgid "Create Or Attach Network"
++#~ msgstr "Créer un réseau"
++
++#~ msgid "Devices"
++#~ msgstr "Equipements"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr ""
++#~ "Ne pas transmettre les requêtes de recherche inverse pour les réseaux "
++#~ "locaux"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "Activer le serveur TFTP"
++
++#~ msgid "Errors"
++#~ msgstr "Erreurs"
++
++#~ msgid "Essentials"
++#~ msgstr "Essentiel"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Etendre le nom d'hôte"
++
++#~ msgid "First leased address"
++#~ msgstr "Première adresse attribuée"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++
++#~ msgid "Hardware Address"
++#~ msgstr "Addresse matériel"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "Ici vous pouvez configurer les équipements Wi-Fi installés."
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "Ad-Hoc"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Connexion Internet"
++
++#~ msgid "Join (Client)"
++#~ msgstr "Client"
++
++#~ msgid "Leases"
++#~ msgstr "Baux"
++
++#~ msgid "Local Domain"
++#~ msgstr "Domaine local"
++
++#~ msgid "Local Network"
++#~ msgstr "Réseau Local"
++
++#~ msgid "Local Server"
++#~ msgstr "Serveur local"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "Image de démarrage réseau"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr "Nom du réseau (ESSID)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "Nombre d'adresses attribuées"
++
++#~ msgid "Perform Actions"
++#~ msgstr "Accomplir les actions"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "Empêche la communication directe Client à Client"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "Point d'accès"
++
++#~ msgid "Resolvfile"
++#~ msgstr "Fichier de résolution"
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "Racine du serveur TFTP"
++
++#~ msgid "TX / RX"
++#~ msgstr "TX / RX"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "Les changements suivants ont été appliqués"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "Lors d'une nouvelle installation, ces fichiers seront ajoutés à la "
++#~ "nouvelle installation."
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "Avec DHCP, les machines connectées au réseau peuvent recevoir leurs "
++#~ "réglages réseau directement (adresse IP, masque de réseau, serveur "
++#~ "DNS, ...)"
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "Vous pouvez faire fonctionner plusieurs réseaux Wi-Fi sur un seul "
++#~ "équipement. Il existe des limitations matérielles et liées au pilote. En "
++#~ "général vous pouvez faire fonctionner simultanément 1 réseau Ad-Hoc et 3 "
++#~ "points d'accès simultanément."
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "Vous avez besoin d'installer \"ppp-mod-pppoe\" pour le support PPPoE ou "
++#~ "\"pptp\" pour le PPtP"
++
++#~ msgid "Zone"
++#~ msgstr "Zone"
++
++#~ msgid "additional hostfile"
++#~ msgstr "fichiers de noms d'hôtes supplémentaires"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr "concatène le nom de domaine aux noms d'hôtes"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "reconnecter automatiquement"
++
++#~ msgid "concurrent queries"
++#~ msgstr "Requêtes concurrentes maximum"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr "désactiver DHCP sur cette interface"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "déconnecter après une inactivité de"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "Ne pas mettre en cache les requêtes négatives"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr "filtre les requêtes inutiles émises par les systèmes Windows"
++
++#~ msgid "installed"
++#~ msgstr "installé"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "localiser la réponse suivant l'émetteur de la requête"
++
++#~ msgid "not installed"
++#~ msgstr "pas installé"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr "empêche la mise en cache de requêtes DNS erronnées"
++
++#~ msgid "query port"
++#~ msgstr "port de requête"
++
++#~ msgid "transmitted / received"
++#~ msgstr "transmis / reçu"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "réseaux compris"
++
++#~ msgid "all"
++#~ msgstr "tous"
++
++#~ msgid "Code"
++#~ msgstr "Code"
++
++#~ msgid "Distance"
++#~ msgstr "Distance"
++
++#~ msgid "Legend"
++#~ msgstr "Légende"
++
++#~ msgid "Library"
++#~ msgstr "Bibliothèque"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "voir la page de man de '%s'"
++
++#~ msgid "Package Manager"
++#~ msgstr "Gestionnaire de paquets"
++
++#~ msgid "Service"
++#~ msgstr "Service"
++
++#~ msgid "Statistics"
++#~ msgstr "Statistiques"
++
++#~ msgid "zone"
++#~ msgstr "Zone"
+diff --git a/feeds/luci/modules/luci-base/po/he/base.po b/feeds/luci/modules/luci-base/po/he/base.po
+new file mode 100644
+index 0000000..30286fa
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/he/base.po
+@@ -0,0 +1,3197 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-02-02 14:32+0200\n"
++"Last-Translator: oranav <oranav@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr ""
++
++msgid "(%s available)"
++msgstr "(%s פנוי)"
++
++msgid "(empty)"
++msgstr "(ריק)"
++
++msgid "(no interfaces attached)"
++msgstr "(×ין ממשק מצורף)"
++
++msgid "-- Additional Field --"
++msgstr "-- שדה נוסף --"
++
++msgid "-- Please choose --"
++msgstr "-- × × ×œ×‘×—×•×¨ --"
++
++msgid "-- custom --"
++msgstr "-- מות×× ×ישית --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "עומס במשך דקה:"
++
++msgid "15 Minute Load:"
++msgstr "עומס במשך רבע שעה:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "עומס במשך 5 דקות:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr ""
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> יצי×ת ש×ילת×"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> יצי×ת שרת"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "כתובות <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr ""
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"כתובת ×ו רשת (CIDR) <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "הגדרות <abbr title=\"Light Emitting Diode\">LED</abbr>"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "×©× <abbr title=\"Light Emitting Diode\">LED</abbr>"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "כתובת-<abbr title=\"Media Access Control\">MAC</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr ""
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr ""
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr ""
++
++msgid "AR Support"
++msgstr "תמיכת AR"
++
++#, fuzzy
++msgid "ARP retry threshold"
++msgstr "סף נסיונות של ARP"
++
++#, fuzzy
++msgid "ATM Bridges"
++msgstr "גשרי ATM"
++
++#, fuzzy
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "מזהה ×¢×¨×•×¦×™× ×•×•×™×¨×˜×•××œ×™×™× ×©×œ ATM"
++
++#, fuzzy
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "מזהה × ×ª×™×‘×™× ×•×•×™×¨×˜×•××œ×™×™× ×©×œ ATM (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++
++msgid "ATM device number"
++msgstr "מס' התקן של ATM"
++
++msgid "AYIYA"
++msgstr ""
++
++#, fuzzy
++msgid "Access Concentrator"
++msgstr "מרכז גישות"
++
++msgid "Access Point"
++msgstr "נקודת גישה"
++
++msgid "Action"
++msgstr "פעולה"
++
++msgid "Actions"
++msgstr "פעולות"
++
++msgid "Activate this network"
++msgstr "הפעל רשת זו"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++
++msgid "Active Connections"
++msgstr "×—×™×‘×•×¨×™× ×¤×¢×™×œ×™×"
++
++msgid "Active DHCP Leases"
++msgstr "הרש×ות DHCP פעילות"
++
++msgid "Active DHCPv6 Leases"
++msgstr "הרש×ות DHCPv6 פעילות"
++
++# צריך ×ימות של מישהו שמבין יותר ×‘×ž×•×©×’×™× ×”×לו ×× ×¦×¨×™×š בכלל ×œ×ª×¨×’× ×ת ×–×” ×ו להש×יר כמו שזה
++#, fuzzy
++msgid "Ad-Hoc"
++msgstr "×ד-הוק"
++
++msgid "Add"
++msgstr "הוסף"
++
++#, fuzzy
++msgid "Add local domain suffix to names served from hosts files"
++msgstr "הוסף דומיין מקומי לשמות ×”×ž×•×’×©×™× ×ž×”×§×‘×¦×™× ×©×œ המ×רח"
++
++msgid "Add new interface..."
++msgstr "הוסף ממשק חדש..."
++
++msgid "Additional Hosts files"
++msgstr "קבצי מ×רח נוספי×"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "כתובת"
++
++msgid "Address to access local relay bridge"
++msgstr ""
++
++#, fuzzy
++msgid "Administration"
++msgstr "מנהלה"
++
++msgid "Advanced Settings"
++msgstr "הגדרות מתקדמות"
++
++#, fuzzy
++msgid "Alert"
++msgstr "×זעקה"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++
++#, fuzzy
++msgid "Allow all except listed"
++msgstr "×פשר הכל חוץ מהרשומי×"
++
++msgid "Allow listed only"
++msgstr "×פשר ×¨×©×•×ž×™× ×‘×œ×‘×“"
++
++#, fuzzy
++msgid "Allow localhost"
++msgstr "×פשר localhost"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++
++msgid "Allow root logins with password"
++msgstr ""
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr ""
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++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 ""
++
++#, fuzzy
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "רשת נוספת תווצר ×× ×ª×©×יר ×ת ×–×” ×œ× ×ž×¡×•×ž×Ÿ"
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "×נטנה 1"
++
++msgid "Antenna 2"
++msgstr "×נטנה 2"
++
++msgid "Antenna Configuration"
++msgstr "הגדרות ×נטנה"
++
++# ×זור?
++#, fuzzy
++msgid "Any zone"
++msgstr "כל תחו×"
++
++msgid "Apply"
++msgstr "החל"
++
++msgid "Applying changes"
++msgstr "מחיל הגדרות"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "הקצה ממשקי×"
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "תחנות קשורות"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "שלט ×לחוטי Atheros 802.11%s"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "×ימות"
++
++msgid "Authoritative"
++msgstr "מוסמך"
++
++msgid "Authorization Required"
++msgstr "דרוש ×ימות"
++
++msgid "Auto Refresh"
++msgstr "רענון ×וטומטי"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "זמין"
++
++msgid "Available packages"
++msgstr "חבילות זמינות"
++
++msgid "Average:"
++msgstr "ממוצע:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "חזרה"
++
++msgid "Back to Overview"
++msgstr "חזרה לסקירה"
++
++msgid "Back to configuration"
++msgstr "חזרה להגדרות"
++
++msgid "Back to overview"
++msgstr "חזרה לסקירה"
++
++msgid "Back to scan results"
++msgstr "חזרה לתוצ×ות סריקה"
++
++msgid "Background Scan"
++msgstr "סריקת רקע"
++
++msgid "Backup / Flash Firmware"
++msgstr "גיבוי / קושחת פל×ש"
++
++msgid "Backup / Restore"
++msgstr "גיבוי / שחזור"
++
++msgid "Backup file list"
++msgstr "גיבוי רשימת קבצי×"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"למטה יש ×ת הרשימה הסופית של ×§×‘×¦×™× ×œ×’×™×‘×•×™. ×”×™× ×ž×•×¨×›×‘×ª ×¢\"×™ קבצי הגדרות ששונו, "
++"×”×ž×¡×•×ž× ×™× ×‘ opkg ×Open PacKaGe Managementׂ, קבצי בסיס ×—×™×•× ×™×™× ×•×ª×‘× ×™×•×ª הגיבוי "
++"המוגדרות ע\"י המשתמש."
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Bogus NX Domain Override"
++msgstr ""
++
++msgid "Bridge"
++msgstr "גשר"
++
++msgid "Bridge interfaces"
++msgstr "ממשקי גשר"
++
++msgid "Bridge unit number"
++msgstr "מס' יח' גשר"
++
++#, fuzzy
++msgid "Bring up on boot"
++msgstr "×”×‘× ×‘×יתחול"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "שלט ×לחוטי Broadcom 802.11%s"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "שלט ×לחוטי Broadcom BCM%04x 802.11"
++
++msgid "Buffered"
++msgstr ""
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "כפתורי×"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "מעבד"
++
++msgid "CPU usage (%)"
++msgstr "שימוש מעבד (%)"
++
++msgid "Cancel"
++msgstr "בטל"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "שרשרת"
++
++msgid "Changes"
++msgstr "שינויי×"
++
++msgid "Changes applied."
++msgstr "×”×©×™× ×•×™×™× ×”×•×—×œ×•"
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "משנה ×ת סיסמת המנהל לגישה למכשיר"
++
++msgid "Channel"
++msgstr "ערוץ"
++
++msgid "Check"
++msgstr "לבדוק"
++
++msgid "Checksum"
++msgstr ""
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++
++msgid "Cipher"
++msgstr ""
++
++msgid ""
++"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)."
++msgstr ""
++
++msgid "Client"
++msgstr ""
++
++msgid "Client ID to send when requesting DHCP"
++msgstr ""
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr "סגור ×—×™×‘×•×¨×™× ×œ× ×¤×¢×™×œ×™× ×חרי מספר השניות שהוגדר, הזן 0 על-מנת ×œ× ×œ×¡×’×•×¨"
++
++msgid "Close list..."
++msgstr "סגור רשימה..."
++
++msgid "Collecting data..."
++msgstr "×וסף מידע..."
++
++msgid "Command"
++msgstr "פקודה"
++
++msgid "Common Configuration"
++msgstr "הגדרות נפוצות"
++
++msgid "Compression"
++msgstr "דחיסה"
++
++msgid "Configuration"
++msgstr "הגדרות"
++
++msgid "Configuration applied."
++msgstr "הגדרות הוחלו"
++
++msgid "Configuration files will be kept."
++msgstr "קבצי ההגדרות ישמרו."
++
++msgid "Confirmation"
++msgstr "×ישור"
++
++msgid "Connect"
++msgstr "התחבר"
++
++msgid "Connected"
++msgstr "מחובר"
++
++msgid "Connection Limit"
++msgstr "מגבלת חיבורי×"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr "חיבורי×"
++
++msgid "Country"
++msgstr "מדינה"
++
++msgid "Country Code"
++msgstr "קוד מדינה"
++
++msgid "Cover the following interface"
++msgstr "כסה ×ת הממשק הב×"
++
++msgid "Cover the following interfaces"
++msgstr "כסה ×ת ×”×ž×ž×©×§×™× ×”×‘××™×"
++
++msgid "Create / Assign firewall-zone"
++msgstr "צור / הקצה תחו×-חומת ×ש"
++
++msgid "Create Interface"
++msgstr "צור ממשק"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "צור גשר בין מספר ממשקי×"
++
++msgid "Critical"
++msgstr "קריטי"
++
++msgid "Cron Log Level"
++msgstr ""
++
++msgid "Custom Interface"
++msgstr "ממשק מות×× ×ישית"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"מת××™× ×ת הגדרות ×”-<abbr title=\"Light Emitting Diode\">LED</abbr>-×™× ×‘×ž×›×©×™×¨ "
++"(×× ×פשרי)."
++
++msgid "DHCP Leases"
++msgstr "הרש×ות DHCP"
++
++msgid "DHCP Server"
++msgstr "שרת DHCP"
++
++msgid "DHCP and DNS"
++msgstr "DHCP ו- DNS"
++
++msgid "DHCP client"
++msgstr "לקוח DHCP"
++
++msgid "DHCP-Options"
++msgstr "×פשרויות-DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr "הרש×ות DHCPv6"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr ""
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Default %d"
++msgstr ""
++
++msgid "Default gateway"
++msgstr ""
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr ""
++
++msgid "Define a name for this network."
++msgstr "הגדר ×©× ×œ×¨×©×ª זו"
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"הגדר ×פשרויות DHCP נוספות, למשל \"<code>6,192.168.2.1,192.168.2.2</code>\" "
++"×שר מציגות שרתי DNS ×©×•× ×™× ×œ×œ×§×•×—"
++
++msgid "Delete"
++msgstr "למחוק"
++
++msgid "Delete this interface"
++msgstr "מחק ממשק זה"
++
++msgid "Delete this network"
++msgstr "מחק רשת זו"
++
++msgid "Description"
++msgstr "תי×ור"
++
++msgid "Design"
++msgstr "עיצוב"
++
++msgid "Destination"
++msgstr "יעד"
++
++msgid "Device"
++msgstr "מכשיר"
++
++msgid "Device Configuration"
++msgstr "הגדרות מכשיר"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "×בחון"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++
++msgid "Disable DNS setup"
++msgstr ""
++
++msgid "Disable HW-Beacon timer"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Discard upstream RFC1918 responses"
++msgstr ""
++
++msgid "Displaying only packages containing"
++msgstr "מציג רק חבילות המכילות"
++
++msgid "Distance Optimization"
++msgstr ""
++
++msgid "Distance to farthest network member in meters."
++msgstr "מרחק לנק' הרשת הרחוקה ביותר במטרי×"
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "גיוון"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 ""
++
++msgid "Do not send probe responses"
++msgstr ""
++
++msgid "Domain required"
++msgstr ""
++
++msgid "Domain whitelist"
++msgstr ""
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++
++msgid "Download and install package"
++msgstr "הורד והתקן חבילות"
++
++msgid "Download backup"
++msgstr "הורד גיבוי"
++
++msgid "Dropbear Instance"
++msgstr ""
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear מ×פשר גישת <abbr title=\"Secure Shell\">SSH</abbr> רשתית ושרת <abbr "
++"title=\"Secure Copy\">SCP</abbr> מובנה"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr "<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> דינ×מי"
++
++msgid "Dynamic tunnel"
++msgstr ""
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr ""
++
++msgid "Edit"
++msgstr "ערוך"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "ערוך ממשק זה"
++
++msgid "Edit this network"
++msgstr "ערוך רשת זו"
++
++msgid "Emergency"
++msgstr "מצב חרו×"
++
++msgid "Enable"
++msgstr "×פשר"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "×פשר <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr ""
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr ""
++
++msgid "Enable NTP client"
++msgstr ""
++
++msgid "Enable TFTP server"
++msgstr "×פשר שרת TFTP"
++
++msgid "Enable VLAN functionality"
++msgstr "×פשר תפקוד VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "×פשר למידה והזדקנות"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr ""
++
++msgid "Enable this swap"
++msgstr ""
++
++msgid "Enable/Disable"
++msgstr ""
++
++msgid "Enabled"
++msgstr "×פשר"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr ""
++
++msgid "Encapsulation mode"
++msgstr ""
++
++msgid "Encryption"
++msgstr "הצפנה"
++
++msgid "Erasing..."
++msgstr "מוחק..."
++
++msgid "Error"
++msgstr "שגי××”"
++
++msgid "Ethernet Adapter"
++msgstr ""
++
++msgid "Ethernet Switch"
++msgstr ""
++
++msgid "Expand hosts"
++msgstr ""
++
++msgid "Expires"
++msgstr ""
++
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr ""
++
++msgid "External system log server port"
++msgstr ""
++
++msgid "Fast Frames"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "Filename of the boot image advertised to clients"
++msgstr ""
++
++msgid "Filesystem"
++msgstr ""
++
++msgid "Filter"
++msgstr ""
++
++msgid "Filter private"
++msgstr ""
++
++msgid "Filter useless"
++msgstr ""
++
++msgid "Find and join network"
++msgstr ""
++
++msgid "Find package"
++msgstr ""
++
++msgid "Finish"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Firewall Settings"
++msgstr ""
++
++msgid "Firewall Status"
++msgstr ""
++
++msgid "Firmware Version"
++msgstr ""
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr ""
++
++msgid "Flags"
++msgstr ""
++
++msgid "Flash Firmware"
++msgstr ""
++
++msgid "Flash image..."
++msgstr ""
++
++msgid "Flash new firmware image"
++msgstr ""
++
++msgid "Flash operations"
++msgstr ""
++
++msgid "Flashing..."
++msgstr ""
++
++msgid "Force"
++msgstr ""
++
++msgid "Force CCMP (AES)"
++msgstr ""
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++
++msgid "Force TKIP"
++msgstr ""
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr ""
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr ""
++
++msgid "Forward broadcast traffic"
++msgstr ""
++
++msgid "Forwarding mode"
++msgstr ""
++
++msgid "Fragmentation Threshold"
++msgstr ""
++
++msgid "Frame Bursting"
++msgstr ""
++
++msgid "Free"
++msgstr ""
++
++msgid "Free space"
++msgstr ""
++
++msgid "GHz"
++msgstr ""
++
++msgid "GPRS only"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Gateway ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General Setup"
++msgstr ""
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr ""
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr ""
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr ""
++
++msgid "Hang Up"
++msgstr ""
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++
++msgid "Host entries"
++msgstr ""
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Hostname to send when requesting DHCP"
++msgstr ""
++
++msgid "Hostnames"
++msgstr ""
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 Firewall"
++msgstr ""
++
++msgid "IPv4 WAN Status"
++msgstr ""
++
++msgid "IPv4 address"
++msgstr "כתבות IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 ו-IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid "IPv4 gateway"
++msgstr ""
++
++msgid "IPv4 netmask"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 Firewall"
++msgstr ""
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr ""
++
++msgid "IPv6 address"
++msgstr ""
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "IPv6 prefix"
++msgstr ""
++
++msgid "IPv6 prefix length"
++msgstr ""
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr ""
++
++msgid "Identity"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++
++msgid "If unchecked, no default route is configured"
++msgstr ""
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr ""
++
++msgid "Ignore resolve file"
++msgstr ""
++
++msgid "Image"
++msgstr ""
++
++msgid "In"
++msgstr ""
++
++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 ""
++
++msgid "Inbound:"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Initscript"
++msgstr ""
++
++msgid "Initscripts"
++msgstr ""
++
++msgid "Install"
++msgstr ""
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr ""
++
++msgid "Install protocol extensions..."
++msgstr ""
++
++msgid "Installed packages"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface Overview"
++msgstr ""
++
++msgid "Interface is reconnecting..."
++msgstr ""
++
++msgid "Interface is shutting down..."
++msgstr ""
++
++msgid "Interface not present or not connected yet."
++msgstr ""
++
++msgid "Interface reconnected"
++msgstr ""
++
++msgid "Interface shut down"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr "מספר VLAN שגוי! רק ×¢×¨×›×™× ×‘×™×Ÿ %d לבין %d ×”× ×—×•×§×™×™×."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "×©× ×ž×©×ª×ž×© ו/×ו סיסמה שגויי×! ×× × × ×¡×” שנית."
++
++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 ""
++
++msgid "Java Script required!"
++msgstr ""
++
++msgid "Join Network"
++msgstr ""
++
++msgid "Join Network: Settings"
++msgstr ""
++
++msgid "Join Network: Wireless Scan"
++msgstr ""
++
++msgid "Keep settings"
++msgstr ""
++
++msgid "Kernel Log"
++msgstr ""
++
++msgid "Kernel Version"
++msgstr ""
++
++msgid "Key"
++msgstr ""
++
++msgid "Key #%d"
++msgstr ""
++
++msgid "Kill"
++msgstr ""
++
++msgid "L2TP"
++msgstr ""
++
++msgid "L2TP Server"
++msgstr ""
++
++msgid "LCP echo failure threshold"
++msgstr ""
++
++msgid "LCP echo interval"
++msgstr ""
++
++msgid "LLC"
++msgstr ""
++
++msgid "Label"
++msgstr ""
++
++msgid "Language"
++msgstr ""
++
++msgid "Language and Style"
++msgstr ""
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Leasefile"
++msgstr ""
++
++msgid "Leasetime"
++msgstr ""
++
++msgid "Leasetime remaining"
++msgstr ""
++
++msgid "Leave empty to autodetect"
++msgstr ""
++
++msgid "Leave empty to use the current WAN address"
++msgstr ""
++
++msgid "Legend:"
++msgstr ""
++
++msgid "Limit"
++msgstr ""
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr ""
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++
++msgid "Listening port for inbound DNS queries"
++msgstr ""
++
++msgid "Load"
++msgstr "עומס"
++
++msgid "Load Average"
++msgstr "עומס ממוצע"
++
++msgid "Loading"
++msgstr "טוען"
++
++msgid "Local IPv4 address"
++msgstr "כתובת IPv4 מקומית"
++
++msgid "Local IPv6 address"
++msgstr "כתובת IPv6 מקומית"
++
++msgid "Local Startup"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Local domain"
++msgstr ""
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr "שרת מקומי"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr ""
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr ""
++
++msgid "Log queries"
++msgstr ""
++
++msgid "Logging"
++msgstr ""
++
++msgid "Login"
++msgstr ""
++
++msgid "Logout"
++msgstr ""
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr ""
++
++msgid "MAC-Address Filter"
++msgstr ""
++
++msgid "MAC-Filter"
++msgstr ""
++
++msgid "MAC-List"
++msgstr ""
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr ""
++
++msgid "MHz"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr ""
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr ""
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr ""
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++
++msgid "Maximum hold time"
++msgstr ""
++
++msgid "Maximum number of leased addresses."
++msgstr ""
++
++msgid "Mbit/s"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory usage (%)"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Minimum Rate"
++msgstr ""
++
++msgid "Minimum hold time"
++msgstr ""
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr ""
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr ""
++
++msgid "Mount Entry"
++msgstr ""
++
++msgid "Mount Point"
++msgstr ""
++
++msgid "Mount Points"
++msgstr ""
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++
++msgid "Mount options"
++msgstr ""
++
++msgid "Mount point"
++msgstr ""
++
++msgid "Mounted file systems"
++msgstr ""
++
++msgid "Move down"
++msgstr ""
++
++msgid "Move up"
++msgstr ""
++
++msgid "Multicast Rate"
++msgstr ""
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "NAS ID"
++msgstr ""
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr ""
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "ש×"
++
++msgid "Name of the new interface"
++msgstr ""
++
++msgid "Name of the new network"
++msgstr ""
++
++msgid "Navigation"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Utilities"
++msgstr ""
++
++msgid "Network boot image"
++msgstr ""
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr ""
++
++msgid "No DHCP Server configured for this interface"
++msgstr ""
++
++msgid "No chains in this table"
++msgstr ""
++
++msgid "No files found"
++msgstr ""
++
++msgid "No information available"
++msgstr ""
++
++msgid "No negative cache"
++msgstr ""
++
++msgid "No network configured on this device"
++msgstr ""
++
++msgid "No network name specified"
++msgstr ""
++
++msgid "No package lists available"
++msgstr "×ין רשימת חבילות זמינה"
++
++msgid "No password set!"
++msgstr "×œ× ×”×•×’×“×¨×” סיסמה!"
++
++msgid "No rules in this chain"
++msgstr ""
++
++msgid "No zone assigned"
++msgstr ""
++
++msgid "Noise"
++msgstr ""
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "Normal"
++msgstr ""
++
++msgid "Not Found"
++msgstr ""
++
++msgid "Not associated"
++msgstr ""
++
++msgid "Not connected"
++msgstr "×œ× ×ž×—×•×‘×¨"
++
++msgid "Note: Configuration files will be erased."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Nslookup"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "OPKG-Configuration"
++msgstr ""
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++
++msgid "One or more fields contain invalid values!"
++msgstr "×™×©× × ×©×“×•×ª ×”×ž×›×™×œ×™× ×¢×¨×›×™× ×‘×œ×ª×™ חוקיי×!"
++
++msgid "One or more required fields have no value!"
++msgstr ""
++
++msgid "Open list..."
++msgstr ""
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr ""
++
++msgid "Option removed"
++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 "Options"
++msgstr ""
++
++msgid "Other:"
++msgstr ""
++
++msgid "Out"
++msgstr ""
++
++msgid "Outbound:"
++msgstr ""
++
++msgid "Outdoor Channels"
++msgstr ""
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Owner"
++msgstr ""
++
++msgid "PAP/CHAP password"
++msgstr ""
++
++msgid "PAP/CHAP username"
++msgstr ""
++
++msgid "PID"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "PPP"
++msgstr ""
++
++msgid "PPPoA Encapsulation"
++msgstr ""
++
++msgid "PPPoATM"
++msgstr ""
++
++msgid "PPPoE"
++msgstr ""
++
++msgid "PPtP"
++msgstr ""
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Package lists are older than 24 hours"
++msgstr ""
++
++msgid "Package name"
++msgstr "×©× ×”×—×‘×™×œ×”"
++
++msgid "Packets"
++msgstr ""
++
++msgid "Part of zone %q"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Password authentication"
++msgstr ""
++
++msgid "Password of Private Key"
++msgstr ""
++
++msgid "Password successfully changed!"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Path to Client-Certificate"
++msgstr ""
++
++msgid "Path to Private Key"
++msgstr "נתיב למפתח הפרטי"
++
++msgid "Path to executable which handles the button event"
++msgstr ""
++
++msgid "Peak:"
++msgstr ""
++
++msgid "Perform reboot"
++msgstr ""
++
++msgid "Perform reset"
++msgstr ""
++
++msgid "Phy Rate:"
++msgstr ""
++
++msgid "Physical Settings"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr ""
++
++msgid "Please enter your username and password."
++msgstr "×× × ×”×–×Ÿ ×ת ×©× ×”×ž×©×ª×ž×© והסיסמה שלך:"
++
++msgid "Policy"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Port %d"
++msgstr ""
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr ""
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr ""
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Prot."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Protocol of the new interface"
++msgstr ""
++
++msgid "Protocol support is not installed"
++msgstr ""
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr ""
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr ""
++
++msgid "RTS/CTS Threshold"
++msgstr ""
++
++msgid "RX"
++msgstr ""
++
++msgid "RX Rate"
++msgstr "קצב קליטה"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr ""
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr ""
++
++msgid "Realtime Connections"
++msgstr ""
++
++msgid "Realtime Graphs"
++msgstr ""
++
++msgid "Realtime Load"
++msgstr ""
++
++msgid "Realtime Traffic"
++msgstr ""
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr ""
++
++msgid "Rebooting..."
++msgstr ""
++
++msgid "Reboots the operating system of your device"
++msgstr ""
++
++msgid "Receive"
++msgstr ""
++
++msgid "Receiver Antenna"
++msgstr ""
++
++msgid "Reconnect this interface"
++msgstr ""
++
++msgid "Reconnecting interface"
++msgstr ""
++
++msgid "References"
++msgstr ""
++
++msgid "Regulatory Domain"
++msgstr ""
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr ""
++
++msgid "Remove"
++msgstr ""
++
++msgid "Repeat scan"
++msgstr ""
++
++msgid "Replace entry"
++msgstr ""
++
++msgid "Replace wireless configuration"
++msgstr ""
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++
++msgid "Reset"
++msgstr ""
++
++msgid "Reset Counters"
++msgstr ""
++
++msgid "Reset to defaults"
++msgstr ""
++
++msgid "Resolv and Hosts Files"
++msgstr ""
++
++msgid "Resolve file"
++msgstr ""
++
++msgid "Restart"
++msgstr ""
++
++msgid "Restart Firewall"
++msgstr ""
++
++msgid "Restore backup"
++msgstr ""
++
++msgid "Reveal/hide password"
++msgstr ""
++
++msgid "Revert"
++msgstr ""
++
++msgid "Root"
++msgstr ""
++
++msgid "Root directory for files served via TFTP"
++msgstr ""
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++
++msgid "Rule #"
++msgstr ""
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr ""
++
++msgid "SSH-Keys"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Save & Apply"
++msgstr ""
++
++msgid "Save &#38; Apply"
++msgstr ""
++
++msgid "Scan"
++msgstr ""
++
++msgid "Scheduled Tasks"
++msgstr ""
++
++msgid "Section added"
++msgstr ""
++
++msgid "Section removed"
++msgstr ""
++
++msgid "See \"mount\" manpage for details"
++msgstr ""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr ""
++
++msgid "Separate WDS"
++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 ""
++
++msgid "Service Type"
++msgstr ""
++
++msgid "Services"
++msgstr "שירותי×"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "סנכרון זמן"
++
++msgid "Setup DHCP Server"
++msgstr ""
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr ""
++
++msgid "Shutdown this network"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Signal:"
++msgstr ""
++
++msgid "Size"
++msgstr ""
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr ""
++
++msgid "Skip to content"
++msgstr "דלג ×ל התוכן"
++
++msgid "Skip to navigation"
++msgstr "דלג ×ל הניווט"
++
++msgid "Slot time"
++msgstr ""
++
++msgid "Software"
++msgstr "תוכנה"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "חלק מהשדות ××™× × ×ª×§×™× ×™×, ×ין ×פשרות לשמור ×ת הערכי×!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "סליחה, ×ך ×”×ובייקט שביקשת ×ינו נמצ×."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "סליחה, השרת נתקל בשגי××” ×œ× ×¦×¤×•×™×”."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"סליחה, ×ין תמיכה בעדכון מערכת, ולכן קושחה חדשה חייבת להיצרב ידנית. ×× × ×¤× ×” "
++"×ל ×”-wiki של OpenWrt עבור הור×ות ספציפיות למכשיר שלך."
++
++msgid "Sort"
++msgstr "מיין"
++
++msgid "Source"
++msgstr "מקור"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start priority"
++msgstr ""
++
++msgid "Startup"
++msgstr "×תחול"
++
++msgid "Static IPv4 Routes"
++msgstr "ניתובי IPv4 סטטיי×"
++
++msgid "Static IPv6 Routes"
++msgstr "ניתובי IPv6 סטטיי×"
++
++msgid "Static Leases"
++msgstr "הקצ×ות סטטיות"
++
++msgid "Static Routes"
++msgstr "× ×™×ª×•×‘×™× ×¡×˜×˜×™×™×"
++
++msgid "Static WDS"
++msgstr "WDS סטטי"
++
++msgid "Static address"
++msgstr "כתובת סטטית"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"הקצ×ות סטטיות נועדו להקצות כתובות IP קבועות ו×ת ×©× ×”×¨×©×ª שלהן ללקוחות DHCP. "
++"הן נחוצות ×’× ×¢×‘×•×¨ הגדרות ממשק ש×ינן דינ×מיות, בהן מטופלות רק ישויות בעלות "
++"הקצ××” מת×ימה."
++
++msgid "Status"
++msgstr "מצב"
++
++msgid "Stop"
++msgstr "עצור"
++
++msgid "Strict order"
++msgstr ""
++
++msgid "Submit"
++msgstr "שלח"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr ""
++
++msgid "Switch"
++msgstr ""
++
++msgid "Switch %q"
++msgstr ""
++
++msgid "Switch %q (%s)"
++msgstr ""
++
++msgid "Switch protocol"
++msgstr ""
++
++msgid "Sync with browser"
++msgstr ""
++
++msgid "Synchronizing..."
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "System Log"
++msgstr ""
++
++msgid "System Properties"
++msgstr ""
++
++msgid "System log buffer size"
++msgstr ""
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "הגדרות TFTP"
++
++msgid "TFTP server root"
++msgstr ""
++
++msgid "TX"
++msgstr "שידור"
++
++msgid "TX Rate"
++msgstr "קצב שידור"
++
++msgid "Table"
++msgstr "טבלה"
++
++msgid "Target"
++msgstr "יעד"
++
++msgid "Terminate"
++msgstr ""
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++
++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 ""
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++
++msgid "The following changes have been committed"
++msgstr ""
++
++msgid "The following changes have been reverted"
++msgstr ""
++
++msgid "The following rules are currently active on this system."
++msgstr "×”×—×•×§×™× ×”×‘××™× ×ž××•×¤×©×¨×™× ×›×¨×’×¢ במערכת זו."
++
++msgid "The given network name is not unique"
++msgstr "×”×©× ×©× ×™×ª×Ÿ לרשת ×יננו ייחודי"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr "החומרה ××™× ×” תומכת בריבוי SSID ולכן ההגדרות הנוכחיות יוחלפו ×× ×ª×ž×©×™×š."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr ""
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"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."
++msgstr ""
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "There are no pending changes to apply!"
++msgstr ""
++
++msgid "There are no pending changes to revert!"
++msgstr ""
++
++msgid "There are no pending changes!"
++msgstr ""
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++
++msgid "This is the plain username for logging into the account"
++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 ""
++
++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 allows the configuration of custom button actions"
++msgstr "דף ×–×” מ×פשר להגדיר פעולות מיוחדות עבור הלחצני×."
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "דף ×–×” מציג סקירה של חיבורי הרשת ×”×¤×¢×™×œ×™× ×›×¨×’×¢."
++
++msgid "This section contains no values yet"
++msgstr "×זור ×–×” עדיין ×œ× ×ž×›×™×œ ערכי×."
++
++msgid "Time Synchronization"
++msgstr "סנכרון זמן"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "סנכרון זמן עדיין ×œ× ×”×•×’×“×¨."
++
++msgid "Timezone"
++msgstr "×זור זמן"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"על מנת לשחזר ×ת קבצי ההגדרות, ב×פשרותך להעלות ×רכיון גיבוי שנוצר לפני כן."
++
++msgid "Total Available"
++msgstr "סה\"כ פנוי"
++
++msgid "Traceroute"
++msgstr ""
++
++msgid "Traffic"
++msgstr "תעבורה"
++
++msgid "Transfer"
++msgstr "העברה"
++
++msgid "Transmission Rate"
++msgstr "קצב שידור"
++
++msgid "Transmit"
++msgstr "שידור"
++
++msgid "Transmit Power"
++msgstr "עוצמת שידור"
++
++msgid "Transmitter Antenna"
++msgstr "×נטנת שידור"
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr ""
++
++msgid "Tunnel Interface"
++msgstr ""
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr ""
++
++msgid "Tx-Power"
++msgstr "עוצמת שידור"
++
++msgid "Type"
++msgstr ""
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr ""
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr ""
++
++msgid "USB Device"
++msgstr ""
++
++msgid "UUID"
++msgstr ""
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "Unknown Error, password not changed!"
++msgstr ""
++
++msgid "Unmanaged"
++msgstr ""
++
++msgid "Unsaved Changes"
++msgstr ""
++
++msgid "Unsupported protocol type."
++msgstr ""
++
++msgid "Update lists"
++msgstr ""
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr ""
++
++msgid "Uploaded File"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr ""
++
++msgid "Use DHCP gateway"
++msgstr ""
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr ""
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "השתמש בדגל broadcast"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "השתמש בשרתי DNS מות××ž×™× ×ישית"
++
++msgid "Use default gateway"
++msgstr ""
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr "השתמש בטבלת ניתוב"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr ""
++
++msgid "Used Key Slot"
++msgstr ""
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "×©× ×ž×©×ª×ž×©"
++
++msgid "VC-Mux"
++msgstr ""
++
++msgid "VLAN Interface"
++msgstr ""
++
++msgid "VLANs on %q"
++msgstr ""
++
++msgid "VLANs on %q (%s)"
++msgstr ""
++
++msgid "VPN Server"
++msgstr "שרת VPN"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr "גרסה"
++
++msgid "WDS"
++msgstr ""
++
++msgid "WEP Open System"
++msgstr ""
++
++msgid "WEP Shared Key"
++msgstr ""
++
++msgid "WEP passphrase"
++msgstr "סיסמת WEP"
++
++msgid "WMM Mode"
++msgstr ""
++
++msgid "WPA passphrase"
++msgstr "סיסמת WPA"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "×זהרה"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless Adapter"
++msgstr ""
++
++msgid "Wireless Network"
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Wireless Security"
++msgstr ""
++
++msgid "Wireless is disabled or not associated"
++msgstr ""
++
++msgid "Wireless is restarting..."
++msgstr ""
++
++msgid "Wireless network is disabled"
++msgstr "רשת ×לחוטית מנוטרלת"
++
++msgid "Wireless network is enabled"
++msgstr "רשת ×לחוטית מ×ופשרת"
++
++msgid "Wireless restarted"
++msgstr ""
++
++msgid "Wireless shut down"
++msgstr ""
++
++msgid "Write received DNS requests to syslog"
++msgstr ""
++
++msgid "XR Support"
++msgstr ""
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr "×תה חייב להפעיל ×ת Java Script בדפדפן שלך; ×חרת, LuCI ×œ× ×™×¤×¢×œ כר×וי."
++
++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 ""
++
++msgid "any"
++msgstr "כלשהו"
++
++msgid "auto"
++msgstr "×וטומטי"
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr ""
++
++msgid "bridged"
++msgstr ""
++
++msgid "create:"
++msgstr ""
++
++msgid "creates a bridge over specified interface(s)"
++msgstr ""
++
++msgid "dB"
++msgstr ""
++
++msgid "dBm"
++msgstr ""
++
++msgid "disable"
++msgstr "בטל"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++
++msgid "forward"
++msgstr "קדימה"
++
++msgid "full-duplex"
++msgstr ""
++
++msgid "half-duplex"
++msgstr ""
++
++msgid "help"
++msgstr "עזרה"
++
++msgid "hidden"
++msgstr ""
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "×× ×”×™×¢×“ ×”×•× ×¨×©×ª"
++
++msgid "input"
++msgstr "קלט"
++
++msgid "kB"
++msgstr ""
++
++msgid "kB/s"
++msgstr ""
++
++msgid "kbit/s"
++msgstr ""
++
++msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
++msgstr ""
++
++msgid "minimum 1280, maximum 1480"
++msgstr ""
++
++msgid "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "ל×"
++
++msgid "no link"
++msgstr ""
++
++msgid "none"
++msgstr "לל×"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "כבוי"
++
++msgid "on"
++msgstr "פועל"
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "מנותב"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "מתויג"
++
++msgid "unknown"
++msgstr ""
++
++msgid "unlimited"
++msgstr "×œ×œ× ×”×’×‘×œ×”"
++
++msgid "unspecified"
++msgstr "×œ× ×ž×•×’×“×¨"
++
++msgid "unspecified -or- create:"
++msgstr "×œ× ×ž×•×’×“×¨ -×ו- יצר"
++
++msgid "untagged"
++msgstr "×œ× ×ž×ª×•×™×’"
++
++msgid "yes"
++msgstr "כן"
++
++msgid "« Back"
++msgstr "<< ×חורה"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "×× × ×”×ž×ª×Ÿ: המכשיר מ×ותחל מחדש..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr "×זהרה: ×™×©× × ×©×™× ×•×™×™× ×©×œ× × ×©×ž×¨×• וי×בדו בעת הפעלה מחדש!"
++
++#~ msgid "Cached"
++#~ msgstr "שמור במטמון"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40Mhz, הערוץ הנוסף מעל"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40Mhz, הערוץ הנוסף מתחת"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "×פשר פרסומות נתב"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "×¤×¨×¡× IPv6 ברשת"
++
++# זהות?
++#, fuzzy
++#~ msgid "Advertised network ID"
++#~ msgstr "×¤×¨×¡× ×¤×¨×˜×™ זהות של הרשת"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "הטווח המורשה ×”×•× 1 עד 65535"
++
++#~ msgid "Freifunk"
++#~ msgstr "×ריג"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "רשתות Wifi בסביבתך"
++
++#~ msgid "static"
++#~ msgstr "סטטי"
+diff --git a/feeds/luci/modules/luci-base/po/hu/base.po b/feeds/luci/modules/luci-base/po/hu/base.po
+new file mode 100644
+index 0000000..e1aa398
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/hu/base.po
+@@ -0,0 +1,3618 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-01-31 09:59+0200\n"
++"Last-Translator: Gabor <juhosg@openwrt.org>\n"
++"Language-Team: none\n"
++"Language: hu\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d perces ablak, %d másodperces intervallum)"
++
++msgid "(%s available)"
++msgstr "(%s elérhető)"
++
++msgid "(empty)"
++msgstr "(üres)"
++
++msgid "(no interfaces attached)"
++msgstr "(nincs csatalkoztatott interfész)"
++
++msgid "-- Additional Field --"
++msgstr "-- További mező --"
++
++msgid "-- Please choose --"
++msgstr "-- Kérem válasszon --"
++
++msgid "-- custom --"
++msgstr "-- egyéni --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Terhelés (utolsó 1 perc):"
++
++msgid "15 Minute Load:"
++msgstr "Terhelés (utolsó 15 perc):"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Terhelés (utolsó 5 perc):"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> lekérdezési port"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> szerver port"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"<abbr title=\"Domain Name System\">DNS</abbr> szerverek a resolv fájl "
++"sorrendjében"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-cím"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-útválasztó"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-cím, vagy hálózat "
++"(CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-útválasztó"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> konfiguráció"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Név"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-cím"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> bérlés"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> csomagméret"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"maximal\">Max.</abbr> párhuzamos lekérdezés"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "AR Támogatás"
++
++msgid "ARP retry threshold"
++msgstr "ARP újrapróbálkozási küszöbérték"
++
++msgid "ATM Bridges"
++msgstr "ATM Hidak"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "ATM Virtuális Csatorna Azonosító (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "ATM Virtuális Út Azonosító (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"Az ATM hidak az AAL5-be ágyazott ethernet kapcsolatokat mint virtuális Linux "
++"hálózati interfész mutatják, mely így DHCP-vel vagy PPP-vel összekapcsolva "
++"használható a szolgáltatói hálózatba történő betárcsázáshoz."
++
++msgid "ATM device number"
++msgstr "ATM eszközszám"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Elérési központ"
++
++msgid "Access Point"
++msgstr "Hozzáférési pont"
++
++msgid "Action"
++msgstr "Művelet"
++
++msgid "Actions"
++msgstr "Műveletek"
++
++msgid "Activate this network"
++msgstr "Hálózat aktiválása"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++"Aktív <abbr title=\"Internet Protocol Version 4\">IPv4</abbr> útvonalak"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++"Aktív <abbr title=\"Internet Protocol Version 6\">IPv6</abbr> útvonalak"
++
++msgid "Active Connections"
++msgstr "Aktív kapcsolatok"
++
++msgid "Active DHCP Leases"
++msgstr "Aktív DHCP bérletek"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Aktív DHCPv6 bérletek"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Hozzáadás"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++"Helyi tartomány utótag hozzáadása a hosts fájlokból kiszolgált nevekhez"
++
++msgid "Add new interface..."
++msgstr "Új interfész hozzáadása..."
++
++msgid "Additional Hosts files"
++msgstr "További 'hosts' fájlok"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Cím"
++
++msgid "Address to access local relay bridge"
++msgstr "Helyi közvetítő híd elérési címe"
++
++msgid "Administration"
++msgstr "Adminisztráció"
++
++msgid "Advanced Settings"
++msgstr "Haladó beállítások"
++
++msgid "Alert"
++msgstr "Riasztás"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"<abbr title=\"Secure Shell\">SSH</abbr> jelszó hitelesítés engedélyezése"
++
++msgid "Allow all except listed"
++msgstr "Összes engedélyezése a felsoroltakon kívül"
++
++msgid "Allow listed only"
++msgstr "Csak a felsoroltak engedélyezése"
++
++msgid "Allow localhost"
++msgstr "Lolcalhost engedélyezése"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"Távoli hostok csatlakozásának engedélyezése a helyi SSH továbbított "
++"portokhoz."
++
++msgid "Allow root logins with password"
++msgstr "root jelszavas bejelentkezésének engedélyezése"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "Engedélyezi a <em>root</em> felhasználó jelszavas bejelentkezését"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr ""
++"A 127.0.0.0/8-as tartományba eső DNS válaszok engedélyezése (pl. RBL "
++"szervizek)"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "Amennyiben ezt jelöletlenül hagyja, egy további hálózat jön létre"
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "1-es antenna"
++
++msgid "Antenna 2"
++msgstr "2-es antenna"
++
++msgid "Antenna Configuration"
++msgstr "Antenna beállítások"
++
++msgid "Any zone"
++msgstr "Bármelyik zóna"
++
++msgid "Apply"
++msgstr "Alkalmaz"
++
++msgid "Applying changes"
++msgstr "Módosítások alkalmazása"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Interfészek összekapcsolása..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Kapcsolódó kliensek"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Atheros 802.11%s vezeték-nélküli vezérlő"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Hitelesítés"
++
++msgid "Authoritative"
++msgstr "Hiteles"
++
++msgid "Authorization Required"
++msgstr "Hitelesítés szükséges"
++
++msgid "Auto Refresh"
++msgstr "Automatikus frissítés"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Elérhető"
++
++msgid "Available packages"
++msgstr "Elérhető csomagok"
++
++msgid "Average:"
++msgstr "Ãtlag:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Vissza"
++
++msgid "Back to Overview"
++msgstr "Vissza az áttekintéshez"
++
++msgid "Back to configuration"
++msgstr "Vissza a beállításokhoz"
++
++msgid "Back to overview"
++msgstr "Vissza az áttekintéshez"
++
++msgid "Back to scan results"
++msgstr "Vissza a felderítési eredményekhez"
++
++msgid "Background Scan"
++msgstr "Felderítés a háttérben"
++
++msgid "Backup / Flash Firmware"
++msgstr "Mentés / Firmware frissítés"
++
++msgid "Backup / Restore"
++msgstr "Mentés / Visszaállítás"
++
++msgid "Backup file list"
++msgstr "Mentési fájl lista"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"Alább található a biztonsági mentésbe kerülő fájlok listája. A lista az opkg "
++"által megjelölt módosított konfigurációs fájlokból, fontos alapvető "
++"fájlokból valamint a felhasználó által megadott mintáknak megfelelő "
++"fájlokból áll."
++
++msgid "Bitrate"
++msgstr "Bitráta"
++
++msgid "Bogus NX Domain Override"
++msgstr "Hamis NX tartomány felülbírálása"
++
++msgid "Bridge"
++msgstr "Híd"
++
++msgid "Bridge interfaces"
++msgstr "Híd interfészek"
++
++msgid "Bridge unit number"
++msgstr "Híd eszközszám"
++
++msgid "Bring up on boot"
++msgstr "Hozza fel a rendszer indításakor"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Broadcom 802.11%s vezeték-nélküli vezérlő"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Broadcom BCM%04x 802.11 vezeték-nélküli vezérlő"
++
++msgid "Buffered"
++msgstr "Ãtmeneti tárban van"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Gombok"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "Processzor"
++
++msgid "CPU usage (%)"
++msgstr "Processzor használat (%)"
++
++msgid "Cancel"
++msgstr "Mégsem"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Lánc"
++
++msgid "Changes"
++msgstr "Módosítások"
++
++msgid "Changes applied."
++msgstr "A módosítások alkalmazva."
++
++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"
++
++msgid "Channel"
++msgstr "Csatorna"
++
++msgid "Check"
++msgstr "Ellenőrzés"
++
++msgid "Checksum"
++msgstr "Ellenőrző összeg"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Válassza ki a tűzfal zónát amit hozzá akar rendelni ehhez az interfészhez. "
++"Válassza a <em>nincs megadva</em> elemet az interfésznek a hozzárendelt "
++"zónából történő eltávolításához, vagy töltse ki az <em>új</em> mezőt új zóna "
++"megadásához és csatlakoztassa az interfészt ahhoz."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Válassza ki azokat a hálózatokat, amelyeket csatlakoztatni akar ehhez a "
++"vezetéknélküli interfészhez, vagy töltse ki az <em>új</em> mezőt egy új "
++"hálózat definiálásához."
++
++msgid "Cipher"
++msgstr "Titkosító"
++
++msgid ""
++"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)."
++msgstr ""
++"Kattintson az \"Archívum készítése\" gombra a jelenlegi konfiguráció tar "
++"archívumként történő letöltéséhez. A firmware kezdeti állapotának "
++"visszaállításához kattintson a \"Visszaállítás végrehajtása\" gombra (csak "
++"squashfs image-ek esetén lehetséges)."
++
++msgid "Client"
++msgstr "Ügyfél"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "DHCP kérés során küldendő kliens azonosító"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Inaktív kapcsolatok bezárása a megadott másodpercek után, használjon 0-t "
++"állandó kapcsolathoz"
++
++msgid "Close list..."
++msgstr "Lista bezárása..."
++
++msgid "Collecting data..."
++msgstr "Adatok összegyűjtése..."
++
++msgid "Command"
++msgstr "Parancs"
++
++msgid "Common Configuration"
++msgstr "Ãlatános beállítás"
++
++msgid "Compression"
++msgstr "Tömörítés"
++
++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 "Confirmation"
++msgstr "Megerősítés"
++
++msgid "Connect"
++msgstr "Kapcsolódás"
++
++msgid "Connected"
++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 "Country"
++msgstr "Ország"
++
++msgid "Country Code"
++msgstr "Országkód"
++
++msgid "Cover the following interface"
++msgstr "A következő interfészt tartalmazza"
++
++msgid "Cover the following interfaces"
++msgstr "A következő interfészeket tartalmazza"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Tűzfal zóna készítés / hozzárendelés"
++
++msgid "Create Interface"
++msgstr "Új interfész"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Híd létrehozása több interfész között"
++
++msgid "Critical"
++msgstr "Kritikus"
++
++msgid "Cron Log Level"
++msgstr "Cron naplózási szint"
++
++msgid "Custom Interface"
++msgstr "Egyéni interfész"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Az eszköz <abbr title=\"Light Emitting Diode\">LED</abbr>-jei működésének "
++"testreszabása."
++
++msgid "DHCP Leases"
++msgstr "DHCP bérletek"
++
++msgid "DHCP Server"
++msgstr "DHCP kiszolgáló"
++
++msgid "DHCP and DNS"
++msgstr "DHCP és DNS"
++
++msgid "DHCP client"
++msgstr "DHCP ügyfél"
++
++msgid "DHCP-Options"
++msgstr "DHCP beállítások"
++
++msgid "DHCPv6 Leases"
++msgstr "DHCPv6 bérletek"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "DNS továbbítások"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Hibakeresés"
++
++msgid "Default %d"
++msgstr "Alapértelmezés %d"
++
++msgid "Default gateway"
++msgstr "Alapértelmezett átjáró"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Alapértelmezett állapot"
++
++msgid "Define a name for this network."
++msgstr "Adja meg a hálózat nevét."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Adjon meg további DHCP opciókat, például \"<code>6,192.168.2.1,192.168.2.2</"
++"code>\", mely különböző DNS kiszolgálókat hirdet az ügyfelek részére."
++
++msgid "Delete"
++msgstr "Törlés"
++
++msgid "Delete this interface"
++msgstr "Interfész törlése"
++
++msgid "Delete this network"
++msgstr "Hálózat törlése"
++
++msgid "Description"
++msgstr "Leírás"
++
++msgid "Design"
++msgstr "Megjelenés"
++
++msgid "Destination"
++msgstr "Cél"
++
++msgid "Device"
++msgstr "Eszköz"
++
++msgid "Device Configuration"
++msgstr "Eszköz beállítások"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnosztika"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Könyvtár"
++
++msgid "Disable"
++msgstr "Letiltás"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> tiltása ezen "
++"az interfészen."
++
++msgid "Disable DNS setup"
++msgstr "DNS beállítás letiltása"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Hardveres beacon időzítő letiltása"
++
++msgid "Disabled"
++msgstr "Letiltva"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Beérkező RFC1918 DHCP válaszok elvetése. "
++
++msgid "Displaying only packages containing"
++msgstr "Csak azon csomagok megjelenítése, amelyek tartalmazzák"
++
++msgid "Distance Optimization"
++msgstr "Távolság optimalizáció"
++
++msgid "Distance to farthest network member in meters."
++msgstr "A hálózat legtávolabbi tagjának távolsága méterben."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Diverzitás"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"A Dnsmasq egy kombinált <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-kiszolgáló és <abbr title=\"Domain Name System\">DNS</abbr>-"
++"továbbító <abbr title=\"Network Address Translation\">NAT</abbr> tűzfalak "
++"számára"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr ""
++"Ne gyorsítótárazza a negatív válaszokat, pl. nem létező domain-ok esetén"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr ""
++"Ne továbbítsa a publikus név szerverek által nem megválaszolható kéréseket"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr "Ne továbbítson fordított keresési kéréseket a helyi hálózathoz"
++
++msgid "Do not send probe responses"
++msgstr "Ne válaszoljon a szondázásra"
++
++msgid "Domain required"
++msgstr "Tartomány szükséges"
++
++msgid "Domain whitelist"
++msgstr "Tartomány fehérlista"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Ne továbbítsa a <abbr title=\"Domain Name System\">DNS</abbr>-név nélküli "
++"<abbr title=\"Domain Name System\">DNS</abbr>-kéréseket "
++
++msgid "Download and install package"
++msgstr "Csomag letöltése és telepítése"
++
++msgid "Download backup"
++msgstr "Biztonsági mentés letöltése"
++
++msgid "Dropbear Instance"
++msgstr "Dropbear példány"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"A Dropbear a hálózaton <abbr title=\"Secure Shell\">SSH</abbr> hozzáférést "
++"tesz lehetővé, valamint integrált <abbr title=\"Secure Copy\">SCP</abbr> "
++"szolgáltatást nyújt."
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"Dinamikus <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++
++msgid "Dynamic tunnel"
++msgstr "Dinamikus alagút"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"Az ügyfelek számára kiosztott DHCP címek dinamikus lefoglalása. Letiltása "
++"esetén csak a statikus DHCP bérlettel rendelkező kliensek lesznek "
++"kiszolgálva."
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "EAP metódus"
++
++msgid "Edit"
++msgstr "Szerkesztés"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Interfész szerkesztése"
++
++msgid "Edit this network"
++msgstr "Hálózat szerkesztése"
++
++msgid "Emergency"
++msgstr "Vészhelyzet"
++
++msgid "Enable"
++msgstr "Engedélyezés"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> engedélyezése"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "HE.net dinamikus végpont frissítésének engedélyezése"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "Óriás keretek átengedésének engedélyezése"
++
++msgid "Enable NTP client"
++msgstr "NTP-kliens engedélyezése"
++
++msgid "Enable TFTP server"
++msgstr "TFTP kiszolgáló engedélyezése"
++
++msgid "Enable VLAN functionality"
++msgstr "VLAN funkció engedélyezése"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Tanulás és aging engedélyezése"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "A csatolás engedélyezése"
++
++msgid "Enable this swap"
++msgstr "A lapozó terület engedélyezése"
++
++msgid "Enable/Disable"
++msgstr "Engedélyezés/Letiltás"
++
++msgid "Enabled"
++msgstr "Engedélyezve"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "A Spanning Tree prokoll engedélyezése erre a hídra"
++
++msgid "Encapsulation mode"
++msgstr "Beágyazási mód"
++
++msgid "Encryption"
++msgstr "Titkosítás"
++
++msgid "Erasing..."
++msgstr "Törlés..."
++
++msgid "Error"
++msgstr "Hiba"
++
++msgid "Ethernet Adapter"
++msgstr "Ethernet adapter"
++
++msgid "Ethernet Switch"
++msgstr "Ethernet switch"
++
++msgid "Expand hosts"
++msgstr "Gépek kibontása"
++
++msgid "Expires"
++msgstr "Lejárat"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr "A bérelt címek lejárati ideje, a minimális érték 2 perc."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Külső rendszernapló kiszolgáló"
++
++msgid "External system log server port"
++msgstr "Külső rendszernapló kiszolgáló port"
++
++msgid "Fast Frames"
++msgstr "Gyors keretek"
++
++msgid "File"
++msgstr "Fájl"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "A kliensek részére közzétett betöltö kép fájlneve"
++
++msgid "Filesystem"
++msgstr "Fájlrendszer"
++
++msgid "Filter"
++msgstr "Szűrő"
++
++msgid "Filter private"
++msgstr "Privát kérések szűrése"
++
++msgid "Filter useless"
++msgstr "Használhahatlan kérések szűrése"
++
++msgid "Find and join network"
++msgstr "Hálózatok keresése és csatlakozás"
++
++msgid "Find package"
++msgstr "Csomag keresése"
++
++msgid "Finish"
++msgstr "Befejezés"
++
++msgid "Firewall"
++msgstr "Tűzfal"
++
++msgid "Firewall Settings"
++msgstr "Tűzfal Beállítások"
++
++msgid "Firewall Status"
++msgstr "Tűzfal Ãllapot"
++
++msgid "Firmware Version"
++msgstr "Tűzfal verzió"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "Rögzített forrás port a kimenő DNS kérésekhez"
++
++msgid "Flags"
++msgstr "Flag-ek"
++
++msgid "Flash Firmware"
++msgstr "Firmware flash-elés"
++
++msgid "Flash image..."
++msgstr "Flash image..."
++
++msgid "Flash new firmware image"
++msgstr "Új firmware image flash-elése"
++
++msgid "Flash operations"
++msgstr "Flash műveletek"
++
++msgid "Flashing..."
++msgstr "Flash-elés..."
++
++msgid "Force"
++msgstr "Kényszerítés"
++
++msgid "Force CCMP (AES)"
++msgstr "CCMP (AES) kényszerítése"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++"DHCP kényszerítése ezen a hálózaton még akkor is ha van másik szerver "
++"észlelve."
++
++msgid "Force TKIP"
++msgstr "TKIP kényszerítése"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "TKIP és CCMP (AES) kényszerítése"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "DHCP forgalom továbbítás"
++
++msgid "Forward broadcast traffic"
++msgstr "Broadcast forgalom továbbítás"
++
++msgid "Forwarding mode"
++msgstr "Továbbítás módja"
++
++msgid "Fragmentation Threshold"
++msgstr "Töredezettségi küszöb"
++
++msgid "Frame Bursting"
++msgstr "Keretfűzés"
++
++msgid "Free"
++msgstr "Szabad"
++
++msgid "Free space"
++msgstr "Szabad hely"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "Csak GPRS"
++
++msgid "Gateway"
++msgstr "Ãtjáró"
++
++msgid "Gateway ports"
++msgstr "Ãtjáró portok"
++
++msgid "General Settings"
++msgstr "Ãltalános beállítások"
++
++msgid "General Setup"
++msgstr "Ãltalános beállítások"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "Archívum készítése"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Ãltalános 802.11%s vezeték-nélküli vezérlÅ‘"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr "A megadott jelszavak nem egyeznek, a jelszó nem lett megváltoztatva!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Ugrás a jelszó beállításhoz..."
++
++msgid "Go to relevant configuration page"
++msgstr "Ugrás a tárgyhoz tartozó beállításokhoz"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "HE.net jelszó"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Kezelő"
++
++msgid "Hang Up"
++msgstr "Befejezés"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Itt állíthatja be az eszköz alapvető tulajdonságait, mint például a gépnév "
++"vagy az időzóna."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++"Nyilvános kulcs alapú SSH azonosításhoz itt adhat meg nyilvános SSH "
++"kulcsokat (soronként egyet)."
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Hermes 802.11b vezeték nélküli vezérlő"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr> elrejtése"
++
++msgid "Host entries"
++msgstr "Host bejegyzések"
++
++msgid "Host expiry timeout"
++msgstr "Host lejárati idő"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> vagy hálózat"
++
++msgid "Hostname"
++msgstr "Gépnév"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "DHCP kérés során küldendő gépnév"
++
++msgid "Hostnames"
++msgstr "Gépnevek"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "IP cím"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "IPv4 tűzfal"
++
++msgid "IPv4 WAN Status"
++msgstr "IPv4 WAN állapot"
++
++msgid "IPv4 address"
++msgstr "IPv4 cím"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 és IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "IPv4 broadcast"
++
++msgid "IPv4 gateway"
++msgstr "IPv4 átjáró"
++
++msgid "IPv4 netmask"
++msgstr "IPv4 hálózati maszk"
++
++msgid "IPv4 only"
++msgstr "csak IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "IPv4 prefix hossza"
++
++msgid "IPv4-Address"
++msgstr "IPv4-cím"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "IPv6 tűzfal"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "IPv6 WAN állapot"
++
++msgid "IPv6 address"
++msgstr "IPv6 cím"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "IPv6 átjáró"
++
++msgid "IPv6 only"
++msgstr "csak IPv6"
++
++msgid "IPv6 prefix"
++msgstr "IPv6 előtag"
++
++msgid "IPv6 prefix length"
++msgstr "IPv6 prefix hossz"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "IPv6-cím"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6 IPv4-ben (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6 IPv4 felett (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6 IPv4 felett (6to4)"
++
++msgid "Identity"
++msgstr "Identitás"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++"Megadás esetén az eszköz csomópont helyett UUID alapján történő csatolása"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++"Megadás esetén az eszköz csomópont helyett címke alapján történő csatolása"
++
++msgid "If unchecked, no default route is configured"
++msgstr "Ha nincs kiválasztva, akkor nincs alapértelmezett útvonal beállítva"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++"Ha nincs kiválasztva, akkor a hirdetett DNS kiszolgáló címeket nem veszi "
++"figyelembe"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Ha a fizikai memória túl kevés a nem használt adatok ideiglenesen áttehetők "
++"egy swap-eszközre mely így nagyobb mennyiségű használható <abbr title="
++"\"Random Access Memory\">RAM</abbr>-ot eredményez. Az adatok áttétele egy "
++"nagyon lassú folyamat mivel a swap-eszköz nem érhető el akkora sebességgel "
++"mint a <abbr title=\"Random Access Memory\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr "Interfész figyelmen kívül hagyása"
++
++msgid "Ignore resolve file"
++msgstr "A resolve fájl figyelmen kívül hagyása"
++
++msgid "Image"
++msgstr "Image"
++
++msgid "In"
++msgstr "Be"
++
++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 "Inaktivitási időtúllépés"
++
++msgid "Inbound:"
++msgstr "Bejövő"
++
++msgid "Info"
++msgstr "Információk"
++
++msgid "Initscript"
++msgstr "Indítási állomány"
++
++msgid "Initscripts"
++msgstr "Indítási állományok"
++
++msgid "Install"
++msgstr "Telepítés"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "%q csomag telepítése"
++
++msgid "Install protocol extensions..."
++msgstr "Protokoll kiterjesztések telepítése..."
++
++msgid "Installed packages"
++msgstr "Telepített csomagok"
++
++msgid "Interface"
++msgstr "Interfész"
++
++msgid "Interface Configuration"
++msgstr "Interfész beállítások"
++
++msgid "Interface Overview"
++msgstr "Interfész áttekintés"
++
++msgid "Interface is reconnecting..."
++msgstr "Interfész újracsatlakoztatása..."
++
++msgid "Interface is shutting down..."
++msgstr "Interfész leállítása..."
++
++msgid "Interface not present or not connected yet."
++msgstr "Az interfész nincs jelen, vagy még nincs csatlakoztatva."
++
++msgid "Interface reconnected"
++msgstr "Interfész újracsatlakoztatva"
++
++msgid "Interface shut down"
++msgstr "Interfész leállítás"
++
++msgid "Interfaces"
++msgstr "Interfészek"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "Belső szerverhiba"
++
++msgid "Invalid"
++msgstr "Érvénytelen"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++"A megadott VLAN azonosító érvénytelen. Az azonosítónak %d és %d közé kell "
++"esnie."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++"A megadott VLAN azonosító érvénytelen! Minden VLAN-hoz egyedi azonosító kell."
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Érvénytelen felhasználói név és/vagy jelszó! Kérem próbálja újra!"
++
++#, 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 ""
++"Úgy tűnik, hogy a flash-elendő kép-file nem fér el a Flash-memóriába. Kérem "
++"ellenőrizze a kép fájlt!"
++
++msgid "Java Script required!"
++msgstr "Javascript szükséges!"
++
++msgid "Join Network"
++msgstr "Csatlakozás a hálózathoz"
++
++msgid "Join Network: Settings"
++msgstr "Csatlakozás a hálózathoz: Beállítások"
++
++msgid "Join Network: Wireless Scan"
++msgstr "Csatlakozás a hálózathoz: vezetéknélküli hálózatok keresése"
++
++msgid "Keep settings"
++msgstr "Beállítások megtartása"
++
++msgid "Kernel Log"
++msgstr "Kernel napló"
++
++msgid "Kernel Version"
++msgstr "Kernel verzió"
++
++msgid "Key"
++msgstr "Kulcs"
++
++msgid "Key #%d"
++msgstr "Kulcs #%d"
++
++msgid "Kill"
++msgstr "Kilövés"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "L2TP szerver"
++
++msgid "LCP echo failure threshold"
++msgstr "LCP echo hibaküszöb"
++
++msgid "LCP echo interval"
++msgstr "LCP Echo időtartam"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Címke"
++
++msgid "Language"
++msgstr "Nyelv"
++
++msgid "Language and Style"
++msgstr "Nyelv és megjelenés"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Bérlet érvényességi ideje"
++
++msgid "Leasefile"
++msgstr "Bérlet fájl"
++
++msgid "Leasetime"
++msgstr "Bérlet időtartama"
++
++msgid "Leasetime remaining"
++msgstr "A bérletből hátralévő idő"
++
++msgid "Leave empty to autodetect"
++msgstr "Automatikus észleléshez hagyja üresen"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "A jelenlegi WAN cím használatához hagyja üresen"
++
++msgid "Legend:"
++msgstr "Jelmagyarázat:"
++
++msgid "Limit"
++msgstr "Korlát"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Kapcsolat létrehozva"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"<abbr title=\"Domain Name System\">DNS</abbr> szerverek listája, ahová a "
++"kérések továbbításra kerülnek"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "Domain-ok listája, melyeknél az RFC1918 válaszok megengedettek"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr "A hamis NX tartomány eredményeket szolgáltató gépek listája"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++"Csak a megadott interfészen hallgat, vagy az összesen, amennyiben nem adja "
++"meg"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Szerver port a beérkező DNS kérések számára"
++
++msgid "Load"
++msgstr "Terhelés"
++
++msgid "Load Average"
++msgstr "Ãtlagos terhelés"
++
++msgid "Loading"
++msgstr "Betöltés"
++
++msgid "Local IPv4 address"
++msgstr "Helyi IPv4 cím"
++
++msgid "Local IPv6 address"
++msgstr "Helyi IPv6 cím"
++
++msgid "Local Startup"
++msgstr "Helyi indítóscript"
++
++msgid "Local Time"
++msgstr "Helyi idő"
++
++msgid "Local domain"
++msgstr "Helyi tartomány"
++
++#, fuzzy
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++"Helyi tartomány meghatározása. Az ezzel a tartománnyal egyező nevek soha "
++"nincsenek továbbítva és csak DHCP-n vagy host fájlok által kerülnek "
++"feloldásra"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++"A helyi tartomány utótag csatolása a DHCP nevekhez és hosts fájl "
++"bejegyzésekhez"
++
++msgid "Local server"
++msgstr "Helyi kiszolgáló"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++"Gépnév lokalizációja a lekérdező alhálózattól függően, ha több IP cím is "
++"elérhető"
++
++msgid "Localise queries"
++msgstr "Lekérdezések lokalizációja"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Napló kimeneti szintje"
++
++msgid "Log queries"
++msgstr "Kérések naplózása"
++
++msgid "Logging"
++msgstr "Naplózás"
++
++msgid "Login"
++msgstr "Bejelentkezés"
++
++msgid "Logout"
++msgstr "Kijelentkezés"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr "A legalacsonyabb bérleti címnek az interfész címétől való távolsága"
++
++msgid "MAC-Address"
++msgstr "MAC-cím"
++
++msgid "MAC-Address Filter"
++msgstr "MAC-cím szűrő"
++
++msgid "MAC-Filter"
++msgstr "MAC-szűrő"
++
++msgid "MAC-List"
++msgstr "MAC-lista"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Maximális sebesség"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "Aktív DHCP bérletek maximális száma"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "Párhuzamos DNS kérések maximális száma"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "EDNS.0 UDP csomagok maximális mérete"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "Maximális várakozási idő a modem kész állapotára (másodpercben)"
++
++msgid "Maximum hold time"
++msgstr "Maximális tartási idő"
++
++msgid "Maximum number of leased addresses."
++msgstr "DHCP címek maximális száma"
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "Memória"
++
++msgid "Memory usage (%)"
++msgstr "Memória használat (%)"
++
++msgid "Metric"
++msgstr "Metrika"
++
++msgid "Minimum Rate"
++msgstr "Minimális sebesség"
++
++msgid "Minimum hold time"
++msgstr "Minimális tartási idő"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "Hiányzó protokoll kiterjesztés a %q progokoll számára"
++
++msgid "Mode"
++msgstr "Mód"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Modemeszköz"
++
++msgid "Modem init timeout"
++msgstr "Modem inicializálás időtúllépés"
++
++msgid "Monitor"
++msgstr "Ellenőrzés"
++
++msgid "Mount Entry"
++msgstr "Csatolási bejegyzés"
++
++msgid "Mount Point"
++msgstr "Csatolási pont"
++
++msgid "Mount Points"
++msgstr "Csatolási pontok"
++
++msgid "Mount Points - Mount Entry"
++msgstr "Csatolási pontok - Csatolási bejegyzés"
++
++msgid "Mount Points - Swap Entry"
++msgstr "Csatolási pontok - Lapozóterület bejegyzés"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"A csatolási pontok határozzák meg, hogy egy memória eszköz hová lesz "
++"csatlakoztatva a fájlendszeren belül "
++
++msgid "Mount options"
++msgstr "Csatolási beállítások"
++
++msgid "Mount point"
++msgstr "Csatolási pont"
++
++msgid "Mounted file systems"
++msgstr "Csatolt fájlrendszerek"
++
++msgid "Move down"
++msgstr "Mozgatás lefelé"
++
++msgid "Move up"
++msgstr "Mozgatás felfelé"
++
++msgid "Multicast Rate"
++msgstr "Multicast sebesség"
++
++msgid "Multicast address"
++msgstr "Multicast cím"
++
++msgid "NAS ID"
++msgstr "NAS azonosító"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "Kijelölt NTP kiszolgálók"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Név"
++
++msgid "Name of the new interface"
++msgstr "Az új interfész neve"
++
++msgid "Name of the new network"
++msgstr "Az új hálózat neve"
++
++msgid "Navigation"
++msgstr "Navigáció"
++
++msgid "Netmask"
++msgstr "Hálózati maszk"
++
++msgid "Network"
++msgstr "Hálózat"
++
++msgid "Network Utilities"
++msgstr "Hálózati eszközök"
++
++msgid "Network boot image"
++msgstr "Hálózati rendszertöltő lemezkép"
++
++msgid "Network without interfaces."
++msgstr "Interfészhez nem rendelt hálózat"
++
++msgid "Next »"
++msgstr "Következő »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Ehhez az interfészhez nincs DHCP kiszolgáló beállítva"
++
++msgid "No chains in this table"
++msgstr "Ez a tábla nem tartalmaz láncokat."
++
++msgid "No files found"
++msgstr "Nem találhatók fájlok"
++
++msgid "No information available"
++msgstr "Nincs elérhető információ"
++
++msgid "No negative cache"
++msgstr "Nincs negatív gyorsítótár"
++
++msgid "No network configured on this device"
++msgstr "Ehhez az eszközhöz nincs hálózat beállítva"
++
++msgid "No network name specified"
++msgstr "Nincs megadva hálózatnév"
++
++msgid "No package lists available"
++msgstr "Csomaglisták nem állnak rendelkezésre"
++
++msgid "No password set!"
++msgstr "Nincs jelszó!"
++
++msgid "No rules in this chain"
++msgstr "Ez a lánc nem tartalmaz szabályokat"
++
++msgid "No zone assigned"
++msgstr "Nincs hozzárendelt zóna"
++
++msgid "Noise"
++msgstr "Zaj"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Zaj:"
++
++msgid "None"
++msgstr "Nincs"
++
++msgid "Normal"
++msgstr "Normál"
++
++msgid "Not Found"
++msgstr "Nem található"
++
++msgid "Not associated"
++msgstr "Nincs hozzárendelve"
++
++msgid "Not connected"
++msgstr "Nincs kapcsolódva"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Megjegyzés: konfigurációs fájlok törölve lesznek."
++
++msgid "Notice"
++msgstr "Megjegyzés"
++
++msgid "Nslookup"
++msgstr "Nslookup"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "OPKG-Beállítások"
++
++msgid "Off-State Delay"
++msgstr "Kikapcsolt állapot késleltetés"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Ezen az oldalon a hálózati interfészeket állíthatja be. Több interfész "
++"között híd hozható létre a \"híd interfész\" mező bejelölésével és több "
++"hálózati interfész nevének szóközzel történő elválasztásával. Lehetőség van "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> jelölés "
++"<samp>INTERFÉSZ.VLANSZÃM</samp> használatára is, pl. <samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr "Bekapcsolt állapot késleltetés"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "Legalább gépnevet vagy MAC-címet meg kell adni!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "Egy vagy több mező érvénytelen adatot tartalmaz!"
++
++msgid "One or more required fields have no value!"
++msgstr "Egy vagy több kötelezően kitöltendő mező üres!"
++
++msgid "Open list..."
++msgstr "Lista megnyitása..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Beállítás módosítva"
++
++msgid "Option removed"
++msgstr "Beállítás eltávolítva"
++
++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 "Options"
++msgstr "Lehetőségek"
++
++msgid "Other:"
++msgstr "Egyéb:"
++
++msgid "Out"
++msgstr "Ki"
++
++msgid "Outbound:"
++msgstr "Kimenő:"
++
++msgid "Outdoor Channels"
++msgstr "Kültéri csatornák"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "MAC cím felülbírálása"
++
++msgid "Override MTU"
++msgstr "MTU felülbíráslás"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "Ãtjáró felülbírálása a DHCP válaszokban"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++"Az ügyfelek részére küldött hálózati masz felülbírálása. Ez alapesetben a "
++"kiszolgált alhálózat alapján kerül meghatározásra."
++
++msgid "Override the table used for internal routes"
++msgstr "A belső útvonalakhoz használt tábla felülbírálása"
++
++msgid "Overview"
++msgstr "Ãttekintés"
++
++msgid "Owner"
++msgstr "Tulajdonos"
++
++msgid "PAP/CHAP password"
++msgstr "PAP/CHAP jelszó"
++
++msgid "PAP/CHAP username"
++msgstr "PAP/CHAP felhasználói név"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "PPPoA beágyazás"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "A libiwinfo csomag szükséges!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "A csomag listák 24 óránál régebbiek"
++
++msgid "Package name"
++msgstr "Csomagnév"
++
++msgid "Packets"
++msgstr "Csomagok"
++
++msgid "Part of zone %q"
++msgstr "A %q zóna része"
++
++msgid "Password"
++msgstr "Jelszó"
++
++msgid "Password authentication"
++msgstr "Jelszó hitelesítés"
++
++msgid "Password of Private Key"
++msgstr "A privát kulcsh jelszava"
++
++msgid "Password successfully changed!"
++msgstr "A jelszó megváltoztatása sikeres!"
++
++msgid "Path to CA-Certificate"
++msgstr "CA tanúsítvány elérési útja"
++
++msgid "Path to Client-Certificate"
++msgstr "Kliens tanúsítvány elérési útja"
++
++msgid "Path to Private Key"
++msgstr "A privát kulcs elérési útja"
++
++msgid "Path to executable which handles the button event"
++msgstr "A gomb eseményeit kezelő végrehajtható állomány elérési útja"
++
++msgid "Peak:"
++msgstr "Csúcs:"
++
++msgid "Perform reboot"
++msgstr "Újraindítás végrehajtása"
++
++msgid "Perform reset"
++msgstr "Visszaállítás végrehajtása"
++
++msgid "Phy Rate:"
++msgstr "Phy sebesség:"
++
++msgid "Physical Settings"
++msgstr "Fizikai beállítások"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Pkts."
++msgstr "csom."
++
++msgid "Please enter your username and password."
++msgstr "Adja meg a felhasználónevét és a jelszavát."
++
++msgid "Policy"
++msgstr "Szabály"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Port %d"
++msgstr "Port %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr "A %d port egyszerre több VLAN-ban is cimkézetlen!"
++
++msgid "Port status:"
++msgstr "Port állapot:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++"A peer halottnak tekintése a megadott számú LCP echo hibák után. Használjon "
++"0-t a hibák figyelmen kívül hagyásához."
++
++msgid "Prevents client-to-client communication"
++msgstr "Ügyfél-ügyfél közötti kommunikáció megakadályozása"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Prism2/2.5/3 802.11b vezeték nélküli vezérlő"
++
++msgid "Proceed"
++msgstr "Folytatás"
++
++msgid "Processes"
++msgstr "Folyamatok"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "Protocol family"
++msgstr "Protokoll család"
++
++msgid "Protocol of the new interface"
++msgstr "Az új interfész protokollja"
++
++msgid "Protocol support is not installed"
++msgstr "Protokoll támogatás nincs telepítve"
++
++msgid "Provide NTP server"
++msgstr "NTP kiszolgáló"
++
++msgid "Provide new network"
++msgstr "Új hálózat nyújtása"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Ãl Ad-hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "Minőség"
++
++msgid "RTS/CTS Threshold"
++msgstr "RTS/CTS küszöbérték"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr "RX sebesség"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "RaLink 802.11%s vezeték nélküli vezérlő"
++
++msgid "Radius-Accounting-Port"
++msgstr "Radius-Naplózási-Port"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Radius-Naplózás-Kulcs"
++
++msgid "Radius-Accounting-Server"
++msgstr "Radius-Naplózás-Kiszolgáló"
++
++msgid "Radius-Authentication-Port"
++msgstr "Radius-Hitelesítés-Port"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Radius-Hitelesítés-Kulcs"
++
++msgid "Radius-Authentication-Server"
++msgstr "Radius-Hitelesítés-Kiszolgáló"
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"Az <code>/etc/ethers</code> fájl olvasása a <abbr title=\"Dynamic Host "
++"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."
++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 "
++"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"
++"Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen a hálózaton "
++"keresztül kapcsolódik."
++
++msgid "Really reset all changes?"
++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 "
++"connected via this interface."
++msgstr ""
++"Biztos, hogy leállítja a hálózatot?!\n"
++" Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen a "
++"hálózaton keresztül kapcsolódik."
++
++msgid ""
++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
++"you are connected via this interface."
++msgstr ""
++"Biztos, hogy leállítja a \"%s\" interfészt?\n"
++" Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen az "
++"interfészen keresztül kapcsolódik."
++
++msgid "Really switch protocol?"
++msgstr "Biztos, hogy cserélni szeretné a protokollt?"
++
++msgid "Realtime Connections"
++msgstr "Valósidejű kapcsolatok"
++
++msgid "Realtime Graphs"
++msgstr "Valósidejű grafikonok"
++
++msgid "Realtime Load"
++msgstr "Valósidejű terhelés"
++
++msgid "Realtime Traffic"
++msgstr "Valósidejű forgalom"
++
++msgid "Realtime Wireless"
++msgstr "Valósidejű vezetéknélküli adatok"
++
++msgid "Rebind protection"
++msgstr "Rebind elleni védelem"
++
++msgid "Reboot"
++msgstr "Újraindítás"
++
++msgid "Rebooting..."
++msgstr "Újraindítás..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Újraindítja az eszköz operációs rendszerét"
++
++msgid "Receive"
++msgstr "Fogadás"
++
++msgid "Receiver Antenna"
++msgstr "Vevő antenna"
++
++msgid "Reconnect this interface"
++msgstr "Csatlakoztassa újra az interfészt"
++
++msgid "Reconnecting interface"
++msgstr "Interfész újracsatlakoztatása"
++
++msgid "References"
++msgstr "Hivatkozások"
++
++msgid "Regulatory Domain"
++msgstr "Szabályozó tartomány"
++
++msgid "Relay"
++msgstr "Ãtjátszás"
++
++msgid "Relay Bridge"
++msgstr "Ãtjátszó híd"
++
++msgid "Relay between networks"
++msgstr "Ãtjátszás hálózatok között"
++
++msgid "Relay bridge"
++msgstr "Ãtjátszó híd"
++
++msgid "Remote IPv4 address"
++msgstr "Távoli IPv4 cím"
++
++msgid "Remove"
++msgstr "Eltávolítás"
++
++msgid "Repeat scan"
++msgstr "Felderítés ismétlése"
++
++msgid "Replace entry"
++msgstr "Bejegyés lecserélése"
++
++msgid "Replace wireless configuration"
++msgstr "Vezetéknélküli beállítások lecserélése"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++"Szükséges bizonyos internetszolgáltatók esetén, pl. Charter 'DOCSIS 3'-al"
++
++msgid "Reset"
++msgstr "Visszaállítás"
++
++msgid "Reset Counters"
++msgstr "Számlálók nullázása"
++
++msgid "Reset to defaults"
++msgstr "Alapértelmezések visszaállítása"
++
++msgid "Resolv and Hosts Files"
++msgstr "Resolv és hosts fájlok"
++
++msgid "Resolve file"
++msgstr "Resolv fájl"
++
++msgid "Restart"
++msgstr "Újraindítás"
++
++msgid "Restart Firewall"
++msgstr "Tűzfal újraindítása"
++
++msgid "Restore backup"
++msgstr "Biztonsági mentés visszaállítása"
++
++msgid "Reveal/hide password"
++msgstr "Jelszó mutatása/elrejtése"
++
++msgid "Revert"
++msgstr "Visszavonás"
++
++msgid "Root"
++msgstr "Gyökérkönyvtár"
++
++msgid "Root directory for files served via TFTP"
++msgstr "TFTP-n keresztül megosztott fájlok gyökérkönyvtára"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Router jelszó"
++
++msgid "Routes"
++msgstr "Útvonalak"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Az útvonalak határozzák meg, hogy bizonyos gépek illetve hálózatok melyik "
++"interfészen keresztül érhetők el."
++
++msgid "Rule #"
++msgstr "Szabály #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr "Fájlrendszer ellenőrzés futtatása az eszköz csatolása előtt"
++
++msgid "Run filesystem check"
++msgstr "Fájlrendszer ellenőrzés futtatása"
++
++msgid ""
++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
++"use 6in4 instead"
++msgstr ""
++
++msgid "SIXXS-handle[/Tunnel-ID]"
++msgstr ""
++
++msgid "SSH Access"
++msgstr "SSH hozzáférés"
++
++msgid "SSH-Keys"
++msgstr "SSH kulcsok"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++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"
++
++msgid "Scheduled Tasks"
++msgstr "Ãœtemezett feladatok"
++
++msgid "Section added"
++msgstr "Szakasz hozzáadva"
++
++msgid "Section removed"
++msgstr "Szakasz eltávolítva"
++
++msgid "See \"mount\" manpage for details"
++msgstr "Részletekért lásd a 'mount' man oldalát"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++"LCP echo kérések küldése a másodpercben megadott időközönként, csak a "
++"hibaküszöbbel együtt van hatása."
++
++msgid "Separate Clients"
++msgstr "Kliensek szétválasztása"
++
++msgid "Separate WDS"
++msgstr "WDS 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"
++
++msgid "Service Type"
++msgstr "Szolgáltatás típusa"
++
++msgid "Services"
++msgstr "Szolgáltatások"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "Idő szinkronizálás beállítása"
++
++msgid "Setup DHCP Server"
++msgstr "DHCP kiszolgáló beállítása"
++
++msgid "Show current backup file list"
++msgstr "Mentendő fájlok aktuális listájának megjelenítése"
++
++msgid "Shutdown this interface"
++msgstr "Interfész leállítása"
++
++msgid "Shutdown this network"
++msgstr "Hálózat leállítása"
++
++msgid "Signal"
++msgstr "Jel"
++
++msgid "Signal:"
++msgstr "Jel:"
++
++msgid "Size"
++msgstr "Méret"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "Ugrás"
++
++msgid "Skip to content"
++msgstr "Ugrás a tartalomhoz"
++
++msgid "Skip to navigation"
++msgstr "Ugrás a navigációhoz"
++
++msgid "Slot time"
++msgstr "Időrés"
++
++msgid "Software"
++msgstr "Szoftver"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Néhán mező érvénytelen, az értékek nem menthetők!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Sajnálom, a kért objektum nem található."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "Sajnálom, a szerver váratlan hibát észlelt."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"Sajnáljuk, a 'sysupgrade' támogatás nem elérhető, az új firmware fájl "
++"telepítését manuálisan kell elvégezni. Az eszközhöz tartozó telepítési "
++"utasításokért keresse fel az OpenWrt wiki-t."
++
++msgid "Sort"
++msgstr "Sorbarendezés"
++
++msgid "Source"
++msgstr "Forrás"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "Meghatározza a gomb kezelendő állapotát"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "Megadja az eszköz csatlakozási könyvtárát."
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "Megadja a <em>Dropbear</em> példány portját"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++"Megadja a maximális sikertelen ARP kérések számát, amik után a host nem "
++"elérhetőnek tekinthető"
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++"Megadja a másodpercek számát, amik után a host nem elérhetőnek tekinthető"
++
++msgid "Specify the secret encryption key here."
++msgstr "Itt adja meg a titkosító kulcsot."
++
++msgid "Start"
++msgstr "Indítás"
++
++msgid "Start priority"
++msgstr "Indítás prioritása"
++
++msgid "Startup"
++msgstr "Rendszerindítás"
++
++msgid "Static IPv4 Routes"
++msgstr "Statikus IPv4 útvonalak"
++
++msgid "Static IPv6 Routes"
++msgstr "Statikus IPv6 útvonalak"
++
++msgid "Static Leases"
++msgstr "Statikus bérletek"
++
++msgid "Static Routes"
++msgstr "Statikus útvonalak"
++
++msgid "Static WDS"
++msgstr "Statikus WDS"
++
++msgid "Static address"
++msgstr "Statikus cím"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"A statikus bérletekkel a DHCP kliensekhez fix IP-címet és hostnevet "
++"rendelhet. Olyan nem dinamikus interfész konfigurációk esetén is "
++"szükségesek, ahol a csak a megfelelő bérlettel rendelkező hosztok kerülnek "
++"kiszolgálásra."
++
++msgid "Status"
++msgstr "Ãllapot"
++
++msgid "Stop"
++msgstr "Leállítás"
++
++msgid "Strict order"
++msgstr "Kötött sorrend"
++
++msgid "Submit"
++msgstr "Elküldés"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Lapozóterület"
++
++msgid "Switch"
++msgstr "Kapcsoló"
++
++msgid "Switch %q"
++msgstr "Kapcsoló %q"
++
++msgid "Switch %q (%s)"
++msgstr "Kapcsoló %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Protokoll csere"
++
++msgid "Sync with browser"
++msgstr "Szinkronizálás a böngészővel"
++
++msgid "Synchronizing..."
++msgstr "Szinkronizálás..."
++
++msgid "System"
++msgstr "Rendszer"
++
++msgid "System Log"
++msgstr "Rendszernapló"
++
++msgid "System Properties"
++msgstr "Rendszer tulajdonságok"
++
++msgid "System log buffer size"
++msgstr "Rendszer napló puffer méret"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "TFTP beállítások"
++
++msgid "TFTP server root"
++msgstr "TFTP szerver gyökér könyvtár"
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr "TX sebesség"
++
++msgid "Table"
++msgstr "Tábla"
++
++msgid "Target"
++msgstr "Cél"
++
++msgid "Terminate"
++msgstr "Megszakítás"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"Az <em>Eszköz beállítások</em> szakasz a rádió hardver fizikai beállításait, "
++"úgymint csatorna, adóteljesítmény vagy antenna választás teszi lehetővé, "
++"amelyen az összes definiált vezeték nélküli hálózat (ha a rádió hardver "
++"multi-SSID képes) osztozik. A hálózatonkénti beállítások, mint az "
++"titkosítás, mód az <em>Interfész beállítások</em> alá vannak csoportosítva."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"A <em>libiwinfo-lua</em> nincs telepítve. A vezetéknélküli beállítás "
++"működéséhez ezt az összetevőt telepítnei kell."
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++"A szolgáltatóhoz rendelt IPv6 előtag, általában így végződik: <code>::</code>"
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++"A következő karakterek használhatók: <code>A-Z</code>, <code>a-z</code>, "
++"<code>0-9</code> and <code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"A memória vagy partíció eszköz fájlja (<abbr title=\"például\">pl.</abbr> "
++"<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 ""
++"A memória formázásához használt fájlrendszer típusa (<abbr title=\"for "
++"example\">pl.</abbr> <samp><abbr title=\"Third Extended Filesystem\">ext3</"
++"abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++"Az image feltöltve. Alább található a fájl ellenőrző összege és mérete, "
++"hasonlítsa össze az eredeti fájllal a feltöltött adatok sértetlenségének "
++"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"
++
++msgid "The following rules are currently active on this system."
++msgstr "Jelenleg a következő szabályok aktívak a rendszeren."
++
++msgid "The given network name is not unique"
++msgstr "A megadott hálózati név már létezik"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"A hardver nem képes többszörös SSID kezelésre ezért a meglévő beállítások "
++"elvesznek ha folytatja."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++"Az IPv4 előtag hossza bitekben, a maradék az IPv6 címekben használatos."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "Az IPv6 előtag hossza bitekben"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++"Az eszközön található hálózati portok kombinálhatók több <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>-ba, amelyekben a számítógépek "
++"közvetlenül kommunikálhatnak egmással. A <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>-ok gyakran a hálózati szegmensek elkülönítésére "
++"használják. Gyakran van egy alapértelmezett Uplink port a következő nagyobb "
++"hálózathoz (pl. az internet) való kapcsolódásra és a többi port a helyi "
++"hálózathoz."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "A kiválasztott protokoll eszköz hozzárendelést igényel"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr "A rendszer most törli a konfigurációs partíciót majd újraindul."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"A rendszer frissítése folyamatban.<br /> NE KAPCSOLJA KI AZ ESZKÖZT!<br /> "
++"Várjon néhány percet, amíg az eszköz ismételten elérhető. Az eszköz "
++"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."
++msgstr ""
++"A feltöltött image fájl formátuma nem támogatott. Ügyeljen arra, hogy a "
++"platformjának megfelelő általános image formátumot válassza ki."
++
++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 pending changes to revert!"
++msgstr "Nincsenek visszavonásra váró változtatások!"
++
++msgid "There are no pending changes!"
++msgstr "Nincsenek el nem mentett változtatások!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"Nincs hozzárendelt eszköz, kérem csatoljon egy hálózati eszközt a \"Fizikai "
++"beállítások\" fülön."
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"A routeren jelenleg nincs jelszó beállítva. Ãllítsa be a root felhasználó "
++"jelszavát a felhasználói felület védelme és az SSH elérés engélyezése "
++"érdekében."
++
++msgid "This IPv4 address of the relay"
++msgstr "Az átjátszó IPV4 címe"
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"Ez egy shell mintákból álló lista a rendszer frissítés során megőrzendő "
++"fájlok és könytárak meghatározására. Az /etc/config/ könyvtárban található "
++"módosított fájlok és bizonyos további beállítások automatikusan megőrződnek."
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"Ez a /etc/rc.local fájl tartalma. Ide írhatja be a saját parancsait (az "
++"'exit 0' sor elé) a boot folyamat végén történő futtatásukhoz."
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++"Ez az alagút közvetítő (tunnel broker) által megadott helyi végpont címe, "
++"általában így végződik: <code>:2</code>"
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Ez az egyetlen <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> a helyi hálózaton"
++
++msgid "This is the plain username for logging into the account"
++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 "Ez a rendszer crontab, amiben időzített feladatok definiálhatók."
++
++msgid ""
++"This is usually the address of the nearest PoP operated by the tunnel broker"
++msgstr ""
++"Ez általában a legközelebbi alagút közvetítő (tunnel broker) által vezérelt "
++"jelenléti pont (PoP) címe"
++
++msgid ""
++"This list gives an overview over currently running system processes and "
++"their status."
++msgstr ""
++"Ez a lista a rendszerben jelenleg futó folyamatokról és azok állapotáról ad "
++"áttekintést."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr "Ez a lap a gombok egyedi működésének beállítását teszi lehetővé"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++"Ez a lap a rendszerben jelenleg aktív hálózati kapcsolatokról ad áttekintést."
++
++msgid "This section contains no values yet"
++msgstr "Ez a szakasz még nem tartalmaz értékeket"
++
++msgid "Time Synchronization"
++msgstr "Idő szinkronizálás"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "Idő szinkronizálás még nincs beállítva."
++
++msgid "Timezone"
++msgstr "Időzóna"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"Itt tölthet fel egy korábban létrehozott biztonsági mentés archívumot a "
++"konfigurációs fájlok visszaállításához."
++
++msgid "Total Available"
++msgstr "Összes elérhető"
++
++msgid "Traceroute"
++msgstr "Traceroute"
++
++msgid "Traffic"
++msgstr "Forgalom"
++
++msgid "Transfer"
++msgstr "Ãtvitel"
++
++msgid "Transmission Rate"
++msgstr "Ãtviteli sebesség"
++
++msgid "Transmit"
++msgstr "Küldés"
++
++msgid "Transmit Power"
++msgstr "Adóteljesítmény"
++
++msgid "Transmitter Antenna"
++msgstr "Adó antenna"
++
++msgid "Trigger"
++msgstr "Trigger"
++
++msgid "Trigger Mode"
++msgstr "Trigger mód"
++
++msgid "Tunnel ID"
++msgstr "Tunnel azonosító"
++
++msgid "Tunnel Interface"
++msgstr "Tunnel interfész"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Turbó mód"
++
++msgid "Tx-Power"
++msgstr "Adóteljesítmény"
++
++msgid "Type"
++msgstr "Típus"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "Csak UTMS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "USB eszköz"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr "Nem indiítható"
++
++msgid "Unknown"
++msgstr "Ismeretlen"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Ismeretlen hiba, a jelszó nem lett megváltoztatva!"
++
++msgid "Unmanaged"
++msgstr "Nem kezelt"
++
++msgid "Unsaved Changes"
++msgstr "El nem mentett módosítások"
++
++msgid "Unsupported protocol type."
++msgstr "Nem támogatott protokoll típus."
++
++msgid "Update lists"
++msgstr "Listák frissítése"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"Itt tölthet fel egy új sysupgrade-kompatibilis képet a futó firmware "
++"lecseréléséhez. A jelenlegi beállítások megtartásához jelölje be a "
++"\"Beállítások megtartása\" négyzetet (OpenWrt-vel kompatibilis firmware kép "
++"szükséges)."
++
++msgid "Upload archive..."
++msgstr "Archívum feltöltése..."
++
++msgid "Uploaded File"
++msgstr "Feltöltött fájl"
++
++msgid "Uptime"
++msgstr "Működési idő"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "<code>/etc/ethers</code> használata"
++
++msgid "Use DHCP gateway"
++msgstr "DHCP kiszolgáló használata"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "Másik fél által ajánlott DNS szerverek használata"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "ISO/IEC 3166 alpha2 országkódok használata"
++
++msgid "Use MTU on tunnel interface"
++msgstr "MTU használata az alagút interfészen"
++
++msgid "Use TTL on tunnel interface"
++msgstr "TTL használata az alagút interfészen"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "Broadcast flag használata"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "Egyedi DNS szerverek használata"
++
++msgid "Use default gateway"
++msgstr "Alapértelmezett átjáró használata"
++
++msgid "Use gateway metric"
++msgstr "Ãtjáró metrikájának használata"
++
++msgid "Use routing table"
++msgstr "Útválasztó tábla használata"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"Használja a <em>Hozzáadás</em> gombot új bérleti bejegyzés hozzáadásához. A "
++"<em>MAC-cím</em> azonosítja a gépet. az <em>IPv4-cím</em> adja meg a "
++"használandó rögzített IP címet és a <em>Gépnév</em> lesz szimbolikus névként "
++"hozzárendelve az igénylő géphez."
++
++msgid "Used"
++msgstr "Használt"
++
++msgid "Used Key Slot"
++msgstr "Használt kulcsindex"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Felhasználónév"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "VLAN interfész"
++
++msgid "VLANs on %q"
++msgstr "VLAN-ok %q-n"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLAN-ok %q-n (%s)"
++
++msgid "VPN Server"
++msgstr "VPN kiszolgáló"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++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"
++
++msgid "Version"
++msgstr "Verzió"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "WEP nyílt rendszer"
++
++msgid "WEP Shared Key"
++msgstr "WEP megosztott kulcs"
++
++msgid "WEP passphrase"
++msgstr "WEP jelmondat"
++
++msgid "WMM Mode"
++msgstr "WMM mód"
++
++msgid "WPA passphrase"
++msgstr "WPA jelmondat"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Figyelmeztetés"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr "Vezetéknélküli rész"
++
++msgid "Wireless Adapter"
++msgstr "Vezetéknélküli adapter"
++
++msgid "Wireless Network"
++msgstr "Vezetéknélküli hálózat"
++
++msgid "Wireless Overview"
++msgstr "Vezetéknélküli rész áttekintés"
++
++msgid "Wireless Security"
++msgstr "Vezetéknélküli biztonság"
++
++msgid "Wireless is disabled or not associated"
++msgstr "Vezetéknélküli hálózat le van tiltva vagy nincs kapcsolódva"
++
++msgid "Wireless is restarting..."
++msgstr "Vezetéknélküli rész újraindítása folyamatban..."
++
++msgid "Wireless network is disabled"
++msgstr "Vezetéknélküli hálózat letiltva"
++
++msgid "Wireless network is enabled"
++msgstr "Vezetéknélküli hálózat engedélyezve"
++
++msgid "Wireless restarted"
++msgstr "Vezetéknélküli rész újraindítva"
++
++msgid "Wireless shut down"
++msgstr "Vezetéknélküli rész leállítása"
++
++msgid "Write received DNS requests to syslog"
++msgstr "A kapott DNS kéréseket írja a rendszernaplóba"
++
++msgid "XR Support"
++msgstr "XR támogatás"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Itt engedélyezheti vagy tilthatja le a telepített indítási állományokat. A "
++"módosítások a rendszer újraindítása után lesznek alakalmazva.<br /"
++"><strong>Figyelem: alapvető indítási állomány pl. \"network\" letiltása "
++"esetén, az eszköz elérhetetlenné válhat!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Engélyezze a Java Szkripteket a böngészőjében, mert anélkül a LuCI nem fog "
++"megfelelően működni."
++
++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 ""
++
++msgid "any"
++msgstr "bármelyik"
++
++msgid "auto"
++msgstr "automatikus"
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "áthidalt"
++
++msgid "create:"
++msgstr "új:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "híd létrehozása a megadott interfész(ek) között"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "letiltás"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "lejárt"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"fájl ahová a <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++"bérletek tárolásra kerülnek"
++
++msgid "forward"
++msgstr "továbbítás"
++
++msgid "full-duplex"
++msgstr "full-duplex"
++
++msgid "half-duplex"
++msgstr "half-duplex"
++
++msgid "help"
++msgstr "súgó"
++
++msgid "hidden"
++msgstr "rejtett"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "ha a cél hálózat"
++
++msgid "input"
++msgstr "bemenet"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "nem"
++
++msgid "no link"
++msgstr "nincs link"
++
++msgid "none"
++msgstr "nincs"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "ki"
++
++msgid "on"
++msgstr "be"
++
++msgid "open"
++msgstr "nyitás"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "irányított"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "cimkézett"
++
++msgid "unknown"
++msgstr "ismeretlen"
++
++msgid "unlimited"
++msgstr "korlátlan"
++
++msgid "unspecified"
++msgstr "nincs meghatározva"
++
++msgid "unspecified -or- create:"
++msgstr "nincs magadva -vagy- új:"
++
++msgid "untagged"
++msgstr "cimkézetlen"
++
++msgid "yes"
++msgstr "igen"
++
++msgid "« Back"
++msgstr "« Vissza"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "IPv6 egyeztetés engedélyezése a PPP linken"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "A hosts fájlok figyelmen kívül hagyása"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Kérem várjon: az eszköz újraindul..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Figyelem: vannak el nem mentett változások melyek el fognak veszni az "
++#~ "újraindítás során!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "40 MHz csatornaszélesség használata akkor is, ha a másodlagos csatorna "
++#~ "átfedésben van. Ezen opció használata nem felel meg az IEE 902.11n-2009 "
++#~ "szabványnak!"
++
++#~ msgid "Cached"
++#~ msgstr "Gyorsítótárban van"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr ""
++#~ "Beállítja ezt a csatlakozási pontot block-extroot részére mint overlay "
++#~ "tároló"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "40 MHz mód erőltetése"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Frekvencia ugrás"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "Zárolt a %d csatornára az %s által."
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "Gyökér fájlrenszerként történő használat"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "HE.net felhasználói azonosító"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr ""
++#~ "Ez a 32 bájtos hexadecimálan kódolt felhasználói azonosító, nem a "
++#~ "bejelentkezési név"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40 MHz, második csatorna felette"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40 MHz, második csatorna alatta"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Router hirdetések elfogadása"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "IPv6 hirdetése a hálózaton"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "Hirdetett hálózati azonosító"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "Engedélyezett tartomány 1-től 65535-ig"
++
++#~ msgid "HT capabilities"
++#~ msgstr "HT képességek"
++
++#~ msgid "HT mode"
++#~ msgstr "HT mód"
++
++#~ msgid "Router Model"
++#~ msgstr "Router modell"
++
++#~ msgid "Router Name"
++#~ msgstr "Router név"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "Router kérelmezések küldése"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr ""
++#~ "Meghatározza a kihirdetett preferált előtag élettartamát másodpercben"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr ""
++#~ "Meghatározza a kihirdetett érvényes előtag élettartamát másodpercben"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "Előnyben részesített élettartam használata"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "Érvényességi időtartam használata"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Várakozás a routerre..."
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "Beépített NTP kiszolgáló engedélyezése"
++
++#~ msgid "Active Leases"
++#~ msgstr "Aktív bérletek"
++
++#~ msgid "Open"
++#~ msgstr "Megnyitás"
++
++#~ msgid "Bit Rate"
++#~ msgstr "Bit ráta"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "Beállítások / Alkalmaz"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "Beállítások / Módosítások"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "Beállítások / Visszavonás"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MAC Address"
++#~ msgstr "MAC cím"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Encrypted\">Titkosított</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-felderítés"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "Válassza ki azt a hálózatot amihez ezt a vezetéknélküli interfészt "
++#~ "csatlakoztatni akarja. Válassza a <em>nincs megadva</em> elemet ha nem "
++#~ "akarja semmilyen hálózathoz csatlakoztatni vagy töltse ki az <em>új</em> "
++#~ "mezőt új hálózat létrehozásához."
++
++#~ msgid "Create Network"
++#~ msgstr "Új hálózat"
++
++#~ msgid "Link"
++#~ msgstr "Kapcsolat"
++
++#~ msgid "Networks"
++#~ msgstr "Hálózatok"
++
++#~ msgid "Power"
++#~ msgstr "Teljesítmény"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Wifi hálózatok az Ön környezetében"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-jelölés: cím/"
++#~ "előtag"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-Szerver"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-cím"
++
++#~ msgid "IP-Aliases"
++#~ msgstr "Alternatív IP címek"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "IPv6 beállítás"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "Megjegyzés: ha olyan interfészt választ ami másik hálózat része, akkor az "
++#~ "ebbe a hálózatba lesz áthelyezve."
++
++#~ msgid ""
++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might "
++#~ "lose access to this router if you are connected via this interface."
++#~ msgstr ""
++#~ "Biztos, hogy törölni akarja ezt az interfészt? A törlés nem "
++#~ "visszavonható! Elvesztheti a hozzáférést ehhez a routerhez, ha ezen az "
++#~ "interfészen keresztül kapcsolódik hozzá."
++
++#~ msgid ""
++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou "
++#~ "might lose access to this router if you are connected via this network."
++#~ msgstr ""
++#~ "Biztos, hogy törölni akarja ezt a vezetéknélküli hálózatot? A törlés nem "
++#~ "visszavonható! Elvesztheti a hozzáférést ehhez a routerhez, ha ezen a "
++#~ "vezetéknélküli hálózaton keresztül kapcsolódik hozzá. "
++
++#~ msgid ""
++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router "
++#~ "if you are connected via this interface."
++#~ msgstr ""
++#~ "Biztos, hogy leállítja a \"%s\" interfészt? Elvesztheti a hozzáféreést "
++#~ "ehhez a routerher ha ezen az interfészen kapcsolódik hozzá."
++
++#~ msgid ""
++#~ "Really shutdown network ?\\nYou might lose access to this router if you "
++#~ "are connected via this interface."
++#~ msgstr ""
++#~ "Biztos, hogy leállítja a hálózatot? Elvesztheti a hozzáférést ehhez a "
++#~ "routerhez, ha ezen a hálózaton keresztül pacsolódik hozzá."
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "A hálózati portok a routeren összekapcsolhatók több <abbr title=\"Virtual "
++#~ "Local Area Network\">VLAN</abbr>-ba, melyeken belül a számítógépek "
++#~ "közvetlenül tudnak kommunikálni egymással. A <abbr title=\"Virtual Local "
++#~ "Area Network\">VLAN</abbr>-okat gyakran használják különböző "
++#~ "hálózatrészek szétválasztására. Ãltalában van egy felmenÅ‘ port a "
++#~ "következő nagyobb hálózathoz mint az internet, és további portok a helyi "
++#~ "hálózathoz."
++
++#~ msgid "Enable buffering"
++#~ msgstr "Ãtmeneti tárazás engedélyezése"
++
++#~ msgid "IPv6-over-IPv4"
++#~ msgstr "IPv6 IPv4 felett"
++
++#~ msgid "Time Synchronisation"
++#~ msgstr "Idő szinkronizálás"
++
++#~ msgid "Client Port"
++#~ msgstr "Ügyfél port"
++
++#~ msgid "Statistics"
++#~ msgstr "Statisztikák"
++
++#~ msgid "Client Address"
++#~ msgstr "Ügyfél cím"
++
++#~ msgid "Active UPnP Redirects"
++#~ msgstr "Aktív UPnP átirányítások"
++
++#~ msgid "Age"
++#~ msgstr "Kor"
++
++#~ msgid "The AHCP Service is not running."
++#~ msgstr "Az AHCP szolgáltatás nem fut."
++
++#~ msgid "VnStat Traffic Monitor"
++#~ msgstr "VnStat forgalom figyelő"
++
++#~ msgid "AHCP Server"
++#~ msgstr "AHCP kiszolgáló"
++
++#~ msgid "The AHCP Service is running with ID %s."
++#~ msgstr "Az AHCP szolgáltatás fut, azonosítója: %s."
++
++#~ msgid "SIP devices on Network"
++#~ msgstr "SIP eszközök a hálózaton"
++
++#~ msgid "Devices on Network"
++#~ msgstr "Eszközök a hálózaton"
++
++#~ msgid "There are no active redirects."
++#~ msgstr "Nincsenek aktív átirányítások."
++
++#~ msgid "SIP Devices on Network"
++#~ msgstr "SIP eszközök a hálózaton"
++
++#~ msgid "Active AHCP Leases"
++#~ msgstr "Aktív AHCP bérletek"
+diff --git a/feeds/luci/modules/luci-base/po/it/base.po b/feeds/luci/modules/luci-base/po/it/base.po
+new file mode 100644
+index 0000000..93cfef5
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/it/base.po
+@@ -0,0 +1,4208 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2015-04-20 10:33+0100\n"
++"Last-Translator: muxator <a.mux@inwind.it>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Poedit 1.6.10\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d finestra in minuti , %d secondi intervallo)"
++
++msgid "(%s available)"
++msgstr "(%s disponibile)"
++
++msgid "(empty)"
++msgstr "(vuoto)"
++
++msgid "(no interfaces attached)"
++msgstr "(nessuna interfaccia collegata)"
++
++msgid "-- Additional Field --"
++msgstr "-- Campo aggiuntivo --"
++
++msgid "-- Please choose --"
++msgstr "-- Per favore scegli --"
++
++msgid "-- custom --"
++msgstr "-- personalizzato --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Carico in 1 minuto:"
++
++msgid "15 Minute Load:"
++msgstr "Carico in 15 minut:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Carico in 5 minuti:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr ""
++"<abbr title=\"Servizio basilare di impostazione Identificatore\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "Richiesta porta <abbr title=\"Sistema Nome Dominio\">DNS</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "Porta Server <abbr title=\"Sistema Nome Dominio\">DNS</abbr>"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"<abbr title=\"Sistema Nome Dominio\">DNS</abbr> I server che verranno "
++"interrogati nell'ordine del resolv file"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++"<abbr title=\"Impostazione Identificatore Servizio Esteso\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "Indirizzo <abbr title=\"Protocollo Internet Versione 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "Gateway <abbr title=\"Protocollo Internet Versione 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr ""
++"Maschera di rete <abbr title=\"Protocollo Internet Versione 4\">IPv4</abbr>"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"Indirizzo <abbr title=\"Protocollo Internet Versione 6\">IPv6</abbr> o rete "
++"(CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "Gateway <abbr title=\"Protocollo Internet Versione 6\">IPv6</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "Configurazione <abbr title=\"Diodo ad Emissione di Luce\">LED</abbr>"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "<abbr title=\"Diodo ad Emissione di Luce\">LED</abbr> Nome"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "Indirizzo <abbr title=\"Controllo Accesso Supporto\">MAC</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"<abbr title=\"maximal\">Max.</abbr> Contratto <abbr title=\"Configurazione "
++"Protocollo Host Dinamico\">DHCP</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"<abbr title=\"maximal\">Max.</abbr> dimensione pacchetti <abbr title="
++"\"Estensione Meccanismi per il Sistema dei Nomi dei Domini\">EDNS0</abbr>"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"maximal\">Max.</abbr> Richiesta in uso"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Accoppiata: %s / Gruppo: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "Supporto AR"
++
++msgid "ARP retry threshold"
++msgstr "riprova soglia ARP"
++
++msgid "ATM Bridges"
++msgstr "Ponti ATM"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "Identificatore Canale Virtuale ATM (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "Identificatore Percorso Virtuale ATM (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"I ponti ATM incapsulano connessioni in AAL5, in modo che i dispositivi "
++"virtuali si possono interfacciare con le reti virtuali Linux in congiunzione "
++"con la comunicazione DHCP o PPP dell'ISP."
++
++msgid "ATM device number"
++msgstr "Numero dispositivo ATM "
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Accesso Concentratore"
++
++msgid "Access Point"
++msgstr "Punto di Accesso"
++
++msgid "Action"
++msgstr "Azione"
++
++msgid "Actions"
++msgstr "Azioni"
++
++msgid "Activate this network"
++msgstr "Attiva questa rete"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++"Instradamento <abbr title=\"Protocollo Internet Versione 4\">IPv4</abbr> "
++"attivo"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++"Instradamento <abbr title=\"Protocollo Internet Versione 6\">IPv6</abbr> "
++"attivo"
++
++msgid "Active Connections"
++msgstr "Connessioni attive"
++
++msgid "Active DHCP Leases"
++msgstr "Attiva contratti DHCP"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Attiva contratti DHCPv6"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Aggiungi"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++"Aggiungere il suffisso di dominio locale ai nomi serviti dal file hosts"
++
++msgid "Add new interface..."
++msgstr "Aggiungi nuova interfaccia..."
++
++msgid "Additional Hosts files"
++msgstr "File Hosts Aggiuntivo"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Indirizzo"
++
++msgid "Address to access local relay bridge"
++msgstr "Indirizzo per accedere al ponte locale di trasmissione"
++
++msgid "Administration"
++msgstr "Amministrazione"
++
++msgid "Advanced Settings"
++msgstr "Opzioni Avanzate"
++
++msgid "Alert"
++msgstr "Avviso"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"Permetti autenticazione <abbr title=\"Secure Shell\">SSH</abbr> tramite "
++"password"
++
++msgid "Allow all except listed"
++msgstr "Consenti tutti tranne quelli nell'elenco"
++
++msgid "Allow listed only"
++msgstr "Consenti solo quelli nell'elenco"
++
++msgid "Allow localhost"
++msgstr "Permetti localhost"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"Permetti agli host remoti di connettersi tramite ssh reindirizzando le porte"
++
++msgid "Allow root logins with password"
++msgstr "Permetti l'accesso a root con password"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "Abilita l'utente root con l'accesso via password"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr ""
++"Permetti le risposte upstream nell'intervallo 127.0.0.0/8, per esempio nei "
++"servizi RBL"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "Sarà creata una rete aggiuntiva se lasci questo senza spunta."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antenna 1"
++
++msgid "Antenna 2"
++msgstr "Antenna 2"
++
++msgid "Antenna Configuration"
++msgstr "Configurazione dell'Antenna"
++
++msgid "Any zone"
++msgstr "Qualsiasi Zona"
++
++msgid "Apply"
++msgstr "Applica"
++
++msgid "Applying changes"
++msgstr "Applica modifiche"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Assegna Interfacce..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Dispositivi Wi-Fi connessi"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Dispositivo Wireless Atheros 802.11%s"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Autenticazione PEAP"
++
++msgid "Authoritative"
++msgstr "Autoritativo"
++
++msgid "Authorization Required"
++msgstr "Autorizzazione richiesta"
++
++msgid "Auto Refresh"
++msgstr "Aggiornamento Automatico"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Disponibili"
++
++msgid "Available packages"
++msgstr "Pacchetti disponibili"
++
++msgid "Average:"
++msgstr "Media:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Indietro"
++
++msgid "Back to Overview"
++msgstr "Ritorna alla panoramica"
++
++msgid "Back to configuration"
++msgstr "Indietro alla configurazione"
++
++msgid "Back to overview"
++msgstr "Ritorna alla panoramica"
++
++msgid "Back to scan results"
++msgstr "Ritorno ai risultati della scansione"
++
++msgid "Background Scan"
++msgstr "Scansione in background"
++
++msgid "Backup / Flash Firmware"
++msgstr "Copia di Sicurezza / Flash Firmware"
++
++msgid "Backup / Restore"
++msgstr "Copia di Sicurezza / Ripristina"
++
++msgid "Backup file list"
++msgstr "Elenco dei file di cui effettuare una copia di sicurezza"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"Di seguito l'elenco dei file di cui effettuare la copia di sicurezza. Essa è "
++"composta dai file di configurazione modificati installati da opkg, file di "
++"base essenziali e i file di backup definiti dall'utente."
++
++msgid "Bitrate"
++msgstr "Bitrate"
++
++msgid "Bogus NX Domain Override"
++msgstr "Ignora Dominio Bogus NX"
++
++msgid "Bridge"
++msgstr "Ponte"
++
++msgid "Bridge interfaces"
++msgstr "Interfacce Ponte"
++
++msgid "Bridge unit number"
++msgstr "Numero Unità Ponte"
++
++msgid "Bring up on boot"
++msgstr "Attivare all'avvio"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Dispositivo Wireless Broadcom 802.11%s"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Dispositivo Wireless Broadcom BCM%04x 802.11"
++
++msgid "Buffered"
++msgstr "Buffered"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Pulsanti"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "Uso CPU (%)"
++
++msgid "Cancel"
++msgstr "Annulla"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Catena"
++
++msgid "Changes"
++msgstr "Modifiche"
++
++msgid "Changes applied."
++msgstr "Modifiche applicate."
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "Cambia la password di amministratore per accedere al dispositivo"
++
++msgid "Channel"
++msgstr "Canale"
++
++msgid "Check"
++msgstr "Verifica"
++
++msgid "Checksum"
++msgstr "Checksum"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Scegli la zona del firewall che si desidera assegnare a questa interfaccia. "
++"Selezionare <em>non specificato</em> per rimuovere l'interfaccia dalla zona "
++"associata o compilare il campo <em>crea</em> per definire una nuova zona e "
++"collegare l'interfaccia ad esso."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Segliere la/le rete/reti a cui vuoi collegare questa interfaccia wireless o "
++"riempire il campo <em>crea<em> per definire una nuova rete."
++
++msgid "Cipher"
++msgstr "Cifratura"
++
++msgid ""
++"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)."
++msgstr ""
++"Premi su \"Genera archivio\" per scaricare un archivio tar di backup dei "
++"file di configurazione attuali. Per ripristinare il firmware al suo stato "
++"iniziale premi \"Esegui RIpristino\" (solo per firmware basati su squashfs)."
++
++msgid "Client"
++msgstr "Cliente"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "ID Cliente da inviare all'interno della richiesta DHCP"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Chiudi le connessioni inattive dopo x secondi, usa 0 per connessioni "
++"persistenti"
++
++msgid "Close list..."
++msgstr "Scegliere dall'elenco..."
++
++msgid "Collecting data..."
++msgstr "Raccolgo i dati..."
++
++msgid "Command"
++msgstr "Comando"
++
++msgid "Common Configuration"
++msgstr "Configurazioni Comuni"
++
++msgid "Compression"
++msgstr "Compressione"
++
++msgid "Configuration"
++msgstr "Configurazione"
++
++msgid "Configuration applied."
++msgstr "Configurazione salvata."
++
++msgid "Configuration files will be kept."
++msgstr "I file di configurazione verranno mantenuti."
++
++msgid "Confirmation"
++msgstr "Conferma"
++
++msgid "Connect"
++msgstr "Connetti"
++
++msgid "Connected"
++msgstr "Connesso"
++
++msgid "Connection Limit"
++msgstr "Limite connessioni"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr "Connessioni"
++
++msgid "Country"
++msgstr "Nazione"
++
++msgid "Country Code"
++msgstr "Codice Nazione"
++
++msgid "Cover the following interface"
++msgstr "Coprire la seguente interfaccia"
++
++msgid "Cover the following interfaces"
++msgstr "Coprire le seguenti interfacce"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Crea / Assegna zona firewall"
++
++msgid "Create Interface"
++msgstr "Crea Interfaccia"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Crea un ponte tra interfaccie multiple"
++
++msgid "Critical"
++msgstr "Critico"
++
++msgid "Cron Log Level"
++msgstr "Livello di log del Cron"
++
++msgid "Custom Interface"
++msgstr "Interfaccia personalizzata"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Personalizza la configurazione dei <abbr title=\"Light Emitting Diode\">LED</"
++"abbr> del sistema se possibile."
++
++msgid "DHCP Leases"
++msgstr "Contratta DHCP"
++
++msgid "DHCP Server"
++msgstr "Server DHCP"
++
++msgid "DHCP and DNS"
++msgstr "DHCP e DNS"
++
++msgid "DHCP client"
++msgstr "Client DHCP"
++
++msgid "DHCP-Options"
++msgstr "Opzioni DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr "Locazioni DHCPv6"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "Inoltri DNS"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Debug"
++
++msgid "Default %d"
++msgstr "Predefinito %d"
++
++msgid "Default gateway"
++msgstr "Gateway predefinito"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Stato Predefinito"
++
++msgid "Define a name for this network."
++msgstr "Definisci un nome per questa rete."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Definisci opzioni DHCP aggiuntive, per esempio "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" fornisce differenti server DNS ai "
++"client."
++
++msgid "Delete"
++msgstr "Elimina"
++
++msgid "Delete this interface"
++msgstr "Rimuovi questa interfaccia"
++
++msgid "Delete this network"
++msgstr "Rimuovi questa rete"
++
++msgid "Description"
++msgstr "Descrizione"
++
++msgid "Design"
++msgstr "Disegno"
++
++msgid "Destination"
++msgstr "Destinazione"
++
++msgid "Device"
++msgstr "Dispositivo"
++
++msgid "Device Configuration"
++msgstr "Configurazione del dispositivo"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnostica"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Cartella"
++
++msgid "Disable"
++msgstr "Disabilita"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Disabilita <abbr title=\"Protocollo di Configurazione Host Dinamico\">DHCP</"
++"abbr> per questa interfaccia."
++
++msgid "Disable DNS setup"
++msgstr "Disabilita il setup dei DNS"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Disabilita Timer Beacon HW"
++
++msgid "Disabled"
++msgstr "Disabilitato"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Ignora risposte RFC1918 upstream"
++
++msgid "Displaying only packages containing"
++msgstr "Visualizza solo i pacchetti contenenti"
++
++msgid "Distance Optimization"
++msgstr "Ottimizzazione distanza"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Distanza del membro più lontano della rete in metri."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Diversità"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq è un server <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr> e inoltratore <abbr title=\"Domain Name System\">DNS</abbr> "
++"per firewall <abbr title=\"Network Address Translation\">NAT</abbr>"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr "Non memorizzare le repliche negative, es. per domini non esistenti"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr ""
++"Non inoltrare le richieste che non possono essere risolte dai name server "
++"pubblici"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr "Non proseguire con le ricerche inverse per le reti locali."
++
++msgid "Do not send probe responses"
++msgstr "Disabilita Probe-Responses"
++
++msgid "Domain required"
++msgstr "Dominio richiesto"
++
++msgid "Domain whitelist"
++msgstr "Elenco Domini consentiti"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Non inoltrare le richieste <abbr title=\"Domain Name System\">DNS</abbr> "
++"senza nome <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid "Download and install package"
++msgstr "Scarica e installa pacchetto"
++
++msgid "Download backup"
++msgstr "Download backup"
++
++msgid "Dropbear Instance"
++msgstr "Instanza di Dropbear"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear offre accesso <abbr title=\"Secure Shell\">SSH</abbr> e integra un "
++"server <abbr title=\"Secure Copy\">SCP</abbr>"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> dinamico"
++
++msgid "Dynamic tunnel"
++msgstr "Dynamic tunnel"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"Fornisci dinamicamente gli indirizzi DHCP ai client. Se disabilitato, solo i "
++"client con un indirizzo statico saranno serviti."
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "Metodo EAP"
++
++msgid "Edit"
++msgstr "Modifica"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Modifica questa interfaccia"
++
++msgid "Edit this network"
++msgstr "Modifica questa rete"
++
++msgid "Emergency"
++msgstr "Emergenza"
++
++msgid "Enable"
++msgstr "Abilita"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Abilita <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "Abilitazione aggiornamento endpoint dinamico HE.net"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "Abilita Jumbo Frame passthrough"
++
++msgid "Enable NTP client"
++msgstr "Attiva il client NTP"
++
++msgid "Enable TFTP server"
++msgstr "Abilita il server TFTP"
++
++msgid "Enable VLAN functionality"
++msgstr "Abilita la funzionalità VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Attivare l'apprendimento e l'invecchiamento"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "Abilita questo mount"
++
++msgid "Enable this swap"
++msgstr "Abilita questo swap"
++
++msgid "Enable/Disable"
++msgstr "Abilita/Disabilita"
++
++msgid "Enabled"
++msgstr "Abilitato"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Abilita il protocollo di Spanning Tree su questo bridge"
++
++msgid "Encapsulation mode"
++msgstr "Modalità di incapsulamento"
++
++msgid "Encryption"
++msgstr "Crittografia"
++
++msgid "Erasing..."
++msgstr "Cancellazione..."
++
++msgid "Error"
++msgstr "Errore"
++
++msgid "Ethernet Adapter"
++msgstr "Scheda di Rete"
++
++msgid "Ethernet Switch"
++msgstr "Switch di Rete"
++
++msgid "Expand hosts"
++msgstr "Espandi gli hosts"
++
++msgid "Expires"
++msgstr "Scadenze"
++
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++"Tempo di scadenza di indirizzi localizzati, il minimo è di 2 minuti (<code> "
++"2m </code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Server Log di Sistema esterno"
++
++msgid "External system log server port"
++msgstr "Porta Server Log di Sistema esterno"
++
++msgid "Fast Frames"
++msgstr "Frame veloci"
++
++msgid "File"
++msgstr "File"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Nome del file dell'immagine di avvio annunciato ai clienti."
++
++msgid "Filesystem"
++msgstr "Filesystem"
++
++msgid "Filter"
++msgstr "Filtro"
++
++msgid "Filter private"
++msgstr "Filtra privati"
++
++msgid "Filter useless"
++msgstr "Filtra inutili"
++
++msgid "Find and join network"
++msgstr "Trova e aggiungi una rete"
++
++msgid "Find package"
++msgstr "Cerca pacchetto"
++
++msgid "Finish"
++msgstr "Fine"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall Settings"
++msgstr "Impostazioni Firewall"
++
++msgid "Firewall Status"
++msgstr "Stato del Firewall"
++
++msgid "Firmware Version"
++msgstr "Versione del Firmware"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "Porta di origine fissa per le richieste DNS in uscita"
++
++msgid "Flags"
++msgstr "Flags"
++
++msgid "Flash Firmware"
++msgstr "Flash Firmware"
++
++msgid "Flash image..."
++msgstr "Flash immagine..."
++
++msgid "Flash new firmware image"
++msgstr "Flash immagine nuovo firmware"
++
++msgid "Flash operations"
++msgstr "Operazioni Flash"
++
++msgid "Flashing..."
++msgstr "Flashing..."
++
++msgid "Force"
++msgstr "Forza"
++
++msgid "Force CCMP (AES)"
++msgstr "Forza CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr "Forza DHCP su questa rete, anche se un altro server viene rilevato."
++
++msgid "Force TKIP"
++msgstr "Forza TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "Forza TKIP e CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "Inoltra il traffico DHCP"
++
++msgid "Forward broadcast traffic"
++msgstr "Inoltra il traffico broadcast"
++
++msgid "Forwarding mode"
++msgstr "Modalità di Inoltro"
++
++msgid "Fragmentation Threshold"
++msgstr "Soglia di frammentazione"
++
++msgid "Frame Bursting"
++msgstr "Frame Bursting"
++
++msgid "Free"
++msgstr "Disponibile"
++
++msgid "Free space"
++msgstr "Spazio libero"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "Solo GPRS"
++
++msgid "Gateway"
++msgstr "Gateway"
++
++msgid "Gateway ports"
++msgstr "Porte Gateway"
++
++msgid "General Settings"
++msgstr "Opzioni Generali"
++
++msgid "General Setup"
++msgstr "Impostazioni Generali"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "Genera Archivio"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Dispositivo Wireless 802.11%s Generico"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++"La conferma della password assegnata non ha prodotto risultati, la password "
++"non è stata cambiata!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Vai alla configurazione della password..."
++
++msgid "Go to relevant configuration page"
++msgstr "Vai alla pagina di configurazione relativa"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "Password HE.net"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Gestore"
++
++msgid "Hang Up"
++msgstr "Hangup"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Qui puoi configurare gli aspetti base del tuo dispositivo come l&#39;"
++"hostname o il fuso orario."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++"Qui è possibile incollare le chiavi pubbliche SSH (uno per riga) per "
++"l'autenticazione con chiave pubblica SSH."
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Dispositivo Wireless Hermes 802.11b"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "Nascondi <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "Campi host"
++
++msgid "Host expiry timeout"
++msgstr "Timeout scadenza Host"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++"<abbr title=\"Internet Protocol Address\">IP</abbr> dell&#39;host o rete"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "Nome host da inviare al momento della richiesta DHCP"
++
++msgid "Hostnames"
++msgstr "Hostname"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "Indirizzo IP"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "IPv4 Firewall"
++
++msgid "IPv4 WAN Status"
++msgstr "Stato WAN IPv4"
++
++msgid "IPv4 address"
++msgstr "Indirizzi IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "trasmissione IPv4"
++
++msgid "IPv4 gateway"
++msgstr "Gateway IPv4"
++
++msgid "IPv4 netmask"
++msgstr "Maschera rete IPv4"
++
++msgid "IPv4 only"
++msgstr "Solo IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "Lunghezza prefisso IPv4"
++
++msgid "IPv4-Address"
++msgstr "Indirizzo-IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "IPv6 Firewall"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "Stato WAN IPv6"
++
++msgid "IPv6 address"
++msgstr "Indirizzi IPv6"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "Gateway IPv6"
++
++msgid "IPv6 only"
++msgstr "Solo IPv6"
++
++msgid "IPv6 prefix"
++msgstr "Prefisso IPv6"
++
++msgid "IPv6 prefix length"
++msgstr "Lunghezza prefisso IPv6"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "Indirizzo-IPv6"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-in-IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6-su-IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6-su-IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "Identità PEAP"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++"Se specificato, montare il dispositivo dal suo UUID invece che dal nodo di "
++"dispositivo fisso"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++"Se specificato, montare il dispositivo dall'etichetta della partizione al "
++"posto di un nodo di un dispositivo fisso"
++
++msgid "If unchecked, no default route is configured"
++msgstr "Se deselezionata, alcun percorso predefinito è configurato"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++"Se deselezionata, gli indirizzi ai Server DNS annunciati saranno ignorati"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Se la tua memoria è insufficiente i dati non usati possono venire "
++"temporaneamente spostati in un'area di swap risultando in un più grande "
++"quantitativo di <abbr title=\"Random Access Memory\">RAM</abbr> usabile. "
++"Sappi che spostare dati in swap è un processo molto lento e che il "
++"dispositivo di swap non può essere acceduto alle alte velocità della <abbr "
++"title=\"Random Access Memory\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Ignora <code>/etc/hosts</code>"
++
++msgid "Ignore interface"
++msgstr "Ignora interfaccia"
++
++msgid "Ignore resolve file"
++msgstr "Ignora file resolv"
++
++msgid "Image"
++msgstr "Immagine"
++
++msgid "In"
++msgstr "In"
++
++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 "Tempo di Inattività"
++
++msgid "Inbound:"
++msgstr "in entrata:"
++
++msgid "Info"
++msgstr "Informazioni"
++
++msgid "Initscript"
++msgstr "Script di avvio"
++
++msgid "Initscripts"
++msgstr "Scripts di avvio"
++
++msgid "Install"
++msgstr "Installa"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Installa il pacchetto %q"
++
++msgid "Install protocol extensions..."
++msgstr "Installa le estensioni del protocollo..."
++
++msgid "Installed packages"
++msgstr "Pacchetti installati"
++
++msgid "Interface"
++msgstr "Interfaccia"
++
++msgid "Interface Configuration"
++msgstr "Configurazione Interfaccia"
++
++msgid "Interface Overview"
++msgstr "Riassunto Interfaccia"
++
++msgid "Interface is reconnecting..."
++msgstr "L'interfaccia si sta ricollegando..."
++
++msgid "Interface is shutting down..."
++msgstr "L'intefaccia si sta spegnendo..."
++
++msgid "Interface not present or not connected yet."
++msgstr "Interfaccia non presente o non ancora connessa."
++
++msgid "Interface reconnected"
++msgstr "Interfaccia ricollegata."
++
++msgid "Interface shut down"
++msgstr "Interfaccia spenta"
++
++msgid "Interfaces"
++msgstr "Interfacce"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "Errore del Server Interno"
++
++msgid "Invalid"
++msgstr "Valore immesso non valido"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr "ID VLAN non valido! Solo gli ID compresi tra %d e %d sono consentiti."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "ID VLAN non valido! Solo gli ID unici sono consentiti"
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Username o password non validi! Per favore riprova."
++
++#, 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 ""
++"Sembra tu stia provando a flashare un'immagine più grande delle dimensioni "
++"della memoria flash, per favore controlla il file!"
++
++msgid "Java Script required!"
++msgstr "Richiesto Java Script!"
++
++msgid "Join Network"
++msgstr "Aggiungi Rete"
++
++msgid "Join Network: Settings"
++msgstr "Aggiunta Rete: Impostazioni"
++
++msgid "Join Network: Wireless Scan"
++msgstr "Aggiunta Rete: Rilevamento Wireless"
++
++msgid "Keep settings"
++msgstr "Mantieni le Impostazioni"
++
++msgid "Kernel Log"
++msgstr "Log del kernel"
++
++msgid "Kernel Version"
++msgstr "Versione del kernel"
++
++msgid "Key"
++msgstr "Chiave"
++
++msgid "Key #%d"
++msgstr "Chiave #%d"
++
++msgid "Kill"
++msgstr "Uccidi"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "Server L2TP"
++
++msgid "LCP echo failure threshold"
++msgstr "fallimento soglia echo LCP"
++
++msgid "LCP echo interval"
++msgstr "Intervallo echo LCP"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Etichetta"
++
++msgid "Language"
++msgstr "Lingua"
++
++msgid "Language and Style"
++msgstr "Lingua e Stile"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Periodo di Validità del Lease"
++
++msgid "Leasefile"
++msgstr "File di lease"
++
++msgid "Leasetime"
++msgstr "Tempo di lease"
++
++msgid "Leasetime remaining"
++msgstr "Tempo lease residuo"
++
++msgid "Leave empty to autodetect"
++msgstr "Lasciare vuoto per l'autorilevamento"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "Lasciare vuoto per usare l'indirizzo WAN attuale"
++
++msgid "Legend:"
++msgstr "Legenda:"
++
++msgid "Limit"
++msgstr "Limite"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Collegamento on"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"Elenco di Server <abbr title=\"Sistema Nome Dimio\">DNS</abbr>a cui "
++"inoltrare le richieste in"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "Elenco di domini da consentire le risposte RFC1918 per"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr "Elenco degli host che forniscono falsi risultati di dominio NX"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr "Ascolta solo l'interfaccia data o, se non specificato, su tutte"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Porta di ascolto per le richieste DNS in entrata"
++
++msgid "Load"
++msgstr "Carico"
++
++msgid "Load Average"
++msgstr "Carico Medio"
++
++msgid "Loading"
++msgstr "Caricamento"
++
++msgid "Local IPv4 address"
++msgstr "Indirizzo IPv4 locale"
++
++msgid "Local IPv6 address"
++msgstr "Indirizzo IPv6 locale"
++
++msgid "Local Startup"
++msgstr "Avvio Locale"
++
++msgid "Local Time"
++msgstr "Ora locale"
++
++msgid "Local domain"
++msgstr "Dominio Locale"
++
++#, fuzzy
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++"Specifiche dominio locale. I nomi di dominio corrispondenti a questi criteri "
++"non sono mai inoltrate e risolti solo da DHCP o file hosts"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++"Suffisso di dominio locale aggiunto ai nomi dei DHCP e voci del file hosts"
++
++msgid "Local server"
++msgstr "Server Locale"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++"Localizzare nome host a seconda della sottorete richiedente se sono "
++"disponibili IP multipli"
++
++msgid "Localise queries"
++msgstr "Localizza richieste"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Livello di dettaglio registro"
++
++msgid "Log queries"
++msgstr "Logga richieste"
++
++msgid "Logging"
++msgstr "Logging"
++
++msgid "Login"
++msgstr "Login"
++
++msgid "Logout"
++msgstr "Logout"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr ""
++
++msgid "MAC-Address Filter"
++msgstr "Filtro dei MAC-Address"
++
++msgid "MAC-Filter"
++msgstr "Filtro MAC"
++
++msgid "MAC-List"
++msgstr "Lista MAC"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr ""
++
++msgid "MHz"
++msgstr ""
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Velocità massima"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr ""
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr ""
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++
++msgid "Maximum hold time"
++msgstr "Velocità massima"
++
++msgid "Maximum number of leased addresses."
++msgstr ""
++
++msgid "Mbit/s"
++msgstr ""
++
++msgid "Memory"
++msgstr "Memoria"
++
++msgid "Memory usage (%)"
++msgstr "Uso Memory (%)"
++
++msgid "Metric"
++msgstr "Metrica"
++
++msgid "Minimum Rate"
++msgstr "Velocità minima"
++
++msgid "Minimum hold time"
++msgstr "Velocità minima"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr ""
++
++msgid "Mode"
++msgstr "Modalità"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Dispositivo modem"
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr ""
++
++msgid "Mount Point"
++msgstr "Punto di mount"
++
++msgid "Mount Points"
++msgstr "Punto di mount"
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"I punti di mount definiscono in quale punto un dispositivo di memoria verrà "
++"attaccato al tuo filesystem"
++
++msgid "Mount options"
++msgstr "Opzioni di mount"
++
++msgid "Mount point"
++msgstr "Punto di mount"
++
++msgid "Mounted file systems"
++msgstr "File system montati"
++
++msgid "Move down"
++msgstr ""
++
++msgid "Move up"
++msgstr ""
++
++msgid "Multicast Rate"
++msgstr "Velocità multicast"
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "NAS ID"
++msgstr "ID della NAS"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr ""
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Name of the new interface"
++msgstr "Nome della nuova interfaccia"
++
++msgid "Name of the new network"
++msgstr "Nome della nuova rete"
++
++msgid "Navigation"
++msgstr "Navigazione"
++
++msgid "Netmask"
++msgstr "Maschera di rete"
++
++msgid "Network"
++msgstr "Rete"
++
++msgid "Network Utilities"
++msgstr "Utilità di Rete"
++
++msgid "Network boot image"
++msgstr ""
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr "Prossimo »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr ""
++
++msgid "No chains in this table"
++msgstr ""
++
++msgid "No files found"
++msgstr "Nessun file trovato"
++
++msgid "No information available"
++msgstr "Nessuna informazione disponibile"
++
++msgid "No negative cache"
++msgstr ""
++
++msgid "No network configured on this device"
++msgstr "Nessuna rete è configurata su questo dispositivo"
++
++msgid "No network name specified"
++msgstr ""
++
++msgid "No package lists available"
++msgstr ""
++
++msgid "No password set!"
++msgstr ""
++
++msgid "No rules in this chain"
++msgstr ""
++
++msgid "No zone assigned"
++msgstr ""
++
++msgid "Noise"
++msgstr "Rumore"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr ""
++
++msgid "None"
++msgstr "Nessuno"
++
++msgid "Normal"
++msgstr "Normale"
++
++msgid "Not Found"
++msgstr ""
++
++msgid "Not associated"
++msgstr "Non associato"
++
++msgid "Not connected"
++msgstr ""
++
++msgid "Note: Configuration files will be erased."
++msgstr ""
++
++msgid "Notice"
++msgstr "Avviso"
++
++msgid "Nslookup"
++msgstr ""
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "Configurazione di OPKG"
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"In questa pagina puoi configurare le interfacce di rete.Puoi unire più "
++"interfacce spuntando la voce \"unisci interfacce\" e inserendo i nomi di più "
++"interfacce di rete separate da spazi. Puoi anche usare la notazione <abbr "
++"title=\"Virtual Local Area Network\">VLAN</abbr> <samp>INTERFACCIA.VLANNUM</"
++"samp> (<abbr title=\"per esempio\">e.s.</abbr>: <samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++
++msgid "One or more fields contain invalid values!"
++msgstr "Uno o più campi contengono valori non validi!"
++
++msgid "One or more required fields have no value!"
++msgstr "Uno o più campi obbligatori sono vuoti!"
++
++msgid "Open list..."
++msgstr ""
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Opzione cambiata"
++
++msgid "Option removed"
++msgstr "Opzione cancellata"
++
++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 "Options"
++msgstr "Opzioni"
++
++msgid "Other:"
++msgstr "Altro:"
++
++msgid "Out"
++msgstr ""
++
++msgid "Outbound:"
++msgstr ""
++
++msgid "Outdoor Channels"
++msgstr ""
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr "Riassunto"
++
++msgid "Owner"
++msgstr "Proprietario"
++
++msgid "PAP/CHAP password"
++msgstr ""
++
++msgid "PAP/CHAP username"
++msgstr ""
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr ""
++
++msgid "PPP"
++msgstr ""
++
++msgid "PPPoA Encapsulation"
++msgstr "Incapsulamento PPPoA"
++
++msgid "PPPoATM"
++msgstr ""
++
++msgid "PPPoE"
++msgstr ""
++
++msgid "PPtP"
++msgstr ""
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "E' richiesto il pacchetto libiwinfo!"
++
++msgid "Package lists are older than 24 hours"
++msgstr ""
++
++msgid "Package name"
++msgstr "Nome pacchetto"
++
++msgid "Packets"
++msgstr "Pacchetti"
++
++msgid "Part of zone %q"
++msgstr ""
++
++msgid "Password"
++msgstr "Password"
++
++msgid "Password authentication"
++msgstr "Password di authenticazione"
++
++msgid "Password of Private Key"
++msgstr "Password della chiave privata"
++
++msgid "Password successfully changed!"
++msgstr "Password cambiata con successo!"
++
++msgid "Path to CA-Certificate"
++msgstr "Percorso al certificato CA"
++
++msgid "Path to Client-Certificate"
++msgstr ""
++
++msgid "Path to Private Key"
++msgstr "Percorso alla chiave privata"
++
++msgid "Path to executable which handles the button event"
++msgstr ""
++
++msgid "Peak:"
++msgstr "Picco:"
++
++msgid "Perform reboot"
++msgstr "Esegui un riavvio"
++
++msgid "Perform reset"
++msgstr ""
++
++msgid "Phy Rate:"
++msgstr ""
++
++msgid "Physical Settings"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr ""
++
++msgid "Please enter your username and password."
++msgstr "Per favore inserisci il tuo username e la password."
++
++msgid "Policy"
++msgstr ""
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Port %d"
++msgstr "Porta %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr ""
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr "Impedisci la comunicazione fra Client"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr "Continuare"
++
++msgid "Processes"
++msgstr "Processi"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protocollo"
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Protocol of the new interface"
++msgstr ""
++
++msgid "Protocol support is not installed"
++msgstr ""
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr ""
++
++msgid "RTS/CTS Threshold"
++msgstr "Soglia RTS/CTS"
++
++msgid "RX"
++msgstr ""
++
++msgid "RX Rate"
++msgstr ""
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"Leggi <code>/etc/ethers</code> per configurare il server <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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr ""
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou 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."
++
++msgid ""
++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr ""
++
++msgid "Realtime Connections"
++msgstr "Connessioni in tempo reale"
++
++msgid "Realtime Graphs"
++msgstr ""
++
++msgid "Realtime Load"
++msgstr "Carico in tempo reale"
++
++msgid "Realtime Traffic"
++msgstr "Traffico in tempo reale"
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr "Riavvia"
++
++msgid "Rebooting..."
++msgstr ""
++
++msgid "Reboots the operating system of your device"
++msgstr "Riavvia il sistema operativo del tuo dispositivo"
++
++msgid "Receive"
++msgstr "Ricezione"
++
++msgid "Receiver Antenna"
++msgstr "Antenna ricevente"
++
++msgid "Reconnect this interface"
++msgstr "Ricollega questa interfaccia"
++
++msgid "Reconnecting interface"
++msgstr "Sto ricollegando l'interfaccia"
++
++msgid "References"
++msgstr ""
++
++msgid "Regulatory Domain"
++msgstr ""
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr ""
++
++msgid "Remove"
++msgstr "Rimuovi"
++
++msgid "Repeat scan"
++msgstr ""
++
++msgid "Replace entry"
++msgstr "Sostituisci campo"
++
++msgid "Replace wireless configuration"
++msgstr ""
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++
++msgid "Reset"
++msgstr "Reset"
++
++msgid "Reset Counters"
++msgstr "Azzera Contatori"
++
++msgid "Reset to defaults"
++msgstr ""
++
++msgid "Resolv and Hosts Files"
++msgstr ""
++
++msgid "Resolve file"
++msgstr "File Resolve"
++
++msgid "Restart"
++msgstr "Riavvia"
++
++msgid "Restart Firewall"
++msgstr "Riavvia Firewall"
++
++msgid "Restore backup"
++msgstr "Ripristina backup"
++
++msgid "Reveal/hide password"
++msgstr ""
++
++msgid "Revert"
++msgstr "Ripristina"
++
++msgid "Root"
++msgstr ""
++
++msgid "Root directory for files served via TFTP"
++msgstr ""
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr ""
++
++msgid "Routes"
++msgstr "Route"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Le route specificano attraverso quale interfaccia e gateway un certo host o "
++"rete può essere raggiunto."
++
++msgid "Rule #"
++msgstr ""
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr ""
++
++msgid "SSH-Keys"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid "Save"
++msgstr "Salva"
++
++msgid "Save & Apply"
++msgstr "Salva & applica"
++
++msgid "Save &#38; Apply"
++msgstr ""
++
++msgid "Scan"
++msgstr "Scan"
++
++msgid "Scheduled Tasks"
++msgstr "Operazioni programmate"
++
++msgid "Section added"
++msgstr ""
++
++msgid "Section removed"
++msgstr ""
++
++msgid "See \"mount\" manpage for details"
++msgstr ""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr "Isola utenti"
++
++msgid "Separate WDS"
++msgstr "WDS separati"
++
++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 ""
++
++msgid "Service Type"
++msgstr ""
++
++msgid "Services"
++msgstr "Servizi"
++
++msgid "Set up Time Synchronization"
++msgstr ""
++
++msgid "Setup DHCP Server"
++msgstr ""
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr ""
++
++msgid "Shutdown this network"
++msgstr ""
++
++msgid "Signal"
++msgstr "Segnale"
++
++msgid "Signal:"
++msgstr ""
++
++msgid "Size"
++msgstr "Dimensione"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "Salta"
++
++msgid "Skip to content"
++msgstr "Salta a contenuto"
++
++msgid "Skip to navigation"
++msgstr "Salta a navigazione"
++
++msgid "Slot time"
++msgstr "Slot time"
++
++msgid "Software"
++msgstr "Software"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Alcuni campi non sono validi, non è possibile salvare i valori!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Siamo spiacenti, l'oggetto che hai richiesto non è stato trovato."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "Spiacente, il server ha rilevato un errore imprevisto."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"Spiacenti, non è presente alcun supporto sysupgrade, una nuova immagine "
++"firmware deve essere memorizzata (Flash) manualmente. Si prega di fare "
++"riferimento al wiki di OpenWrt per le istruzioni di installazione di "
++"dispositivi specifici."
++
++msgid "Sort"
++msgstr "Elenca"
++
++msgid "Source"
++msgstr "Origine"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "Specifica lo stato del pulsante da gestire"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "Specifica la cartella a cui è collegato il dispositivo in"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "Specifica la porta di ascolto di questa istanza <em>Dropbear</em>"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++"Consente di specificare la quantità massima di richieste ARP fallite finché "
++"gli host si presume siano morti."
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++"Specifica la quantità massima di secondi dopo di che si presume che gli host "
++"siano morti."
++
++msgid "Specify the secret encryption key here."
++msgstr "Specificare la chiave di cifratura qui."
++
++msgid "Start"
++msgstr "Inizio"
++
++msgid "Start priority"
++msgstr "Priorità di avvio"
++
++msgid "Startup"
++msgstr "Avvio"
++
++msgid "Static IPv4 Routes"
++msgstr "Instradamento statico IPv4"
++
++msgid "Static IPv6 Routes"
++msgstr "Instradamento statico IPv6"
++
++msgid "Static Leases"
++msgstr "Leases statici"
++
++msgid "Static Routes"
++msgstr "Instradamenti Statici"
++
++msgid "Static WDS"
++msgstr "WDS statico"
++
++msgid "Static address"
++msgstr "Indirizzo Statico"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"Leasing statici vengono utilizzati per assegnare indirizzi IP fissi e nomi "
++"host simbolici ai client DHCP. Essi sono necessari anche per interfacce di "
++"configurazione non dinamici, dove solo gli host con lease corrispondente "
++"servito vengono serviti."
++
++msgid "Status"
++msgstr "Stato"
++
++msgid "Stop"
++msgstr "Ferma"
++
++msgid "Strict order"
++msgstr "Ordine severo"
++
++msgid "Submit"
++msgstr "Invia"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Scambia ingresso"
++
++msgid "Switch"
++msgstr "Switch"
++
++msgid "Switch %q"
++msgstr "Switch %q"
++
++msgid "Switch %q (%s)"
++msgstr "Switch %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Cambia protocollo"
++
++msgid "Sync with browser"
++msgstr "Sincronizza con il browser"
++
++msgid "Synchronizing..."
++msgstr "Sincronizzazione..."
++
++msgid "System"
++msgstr "Sistema"
++
++msgid "System Log"
++msgstr "Log di sistema"
++
++msgid "System Properties"
++msgstr "Proprietà di Sistema"
++
++msgid "System log buffer size"
++msgstr "Dimensione Buffer Log di Sistema"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "Impostazioni TFTP"
++
++msgid "TFTP server root"
++msgstr "Server TFTP principale"
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr "Velocità di TX"
++
++msgid "Table"
++msgstr "Tabella"
++
++msgid "Target"
++msgstr "Destinazione"
++
++msgid "Terminate"
++msgstr "Termina"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"La sezione <em>Configurazione del Dispositivo</em> illustra le impostazioni "
++"fisiche del hardware radio come canale, la potenza di trasmissione o la "
++"selezione dell'antenna che viene condiviso tra tutte le reti wireless "
++"definite (se l'hardware radio è multi-SSID compatibilie). Per le "
++"impostazioni di rete come la crittografia o la modalità di funzionamento "
++"sono raggruppati nella <em>configurazione dell'interfaccia</em>."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"Il pacchetto <em>libiwinfo-lua</em> non è installato. È necessario "
++"installare questo componente per il lavoro di configurazione wireless!"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++"Il prefisso IPv6 assegnati dal provider, si conclude di solito con <code>::</"
++"code>"
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"Il file del dispositivo di memoria o della partizione (<abbr title=\"per "
++"esempio\">e.s.</abbr> <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 ""
++"Il filesystem usato per formattare la memoria (<abbr title=\"per esempio\">e."
++"s.</abbr> <samp><abbr title=\"Third Extended Filesystem\">ext3</abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"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"
++
++msgid "The following rules are currently active on this system."
++msgstr "Le seguenti regole sono al momento attive su questo sistema."
++
++msgid "The given network name is not unique"
++msgstr ""
++
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr ""
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes until you try to reconnect. It might be necessary to renew the "
++"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."
++msgstr ""
++"The uploaded image file does not contain a supported format. Make sure that "
++"you choose the generic image format for your platform."
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "There are no pending changes to apply!"
++msgstr ""
++
++msgid "There are no pending changes to revert!"
++msgstr ""
++
++msgid "There are no pending changes!"
++msgstr ""
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Questo è l&#39;unico server <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr> nella tua rete locale"
++
++msgid "This is the plain username for logging into the account"
++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 ""
++"Questa è la crontab del sistema nella quale possono essere definiti le "
++"operazioni da programmare."
++
++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 ""
++"Questa lista da un riassunto dei processi correntemente attivi e del loro "
++"stato."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr ""
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "Questa pagina ti da una riassunto delle connessioni al momento attive."
++
++msgid "This section contains no values yet"
++msgstr "Questa sezione non contiene ancora valori"
++
++msgid "Time Synchronization"
++msgstr ""
++
++msgid "Time Synchronization is not configured yet."
++msgstr ""
++
++msgid "Timezone"
++msgstr "Fuso orario"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++
++msgid "Total Available"
++msgstr "Totale"
++
++msgid "Traceroute"
++msgstr ""
++
++msgid "Traffic"
++msgstr "Traffico"
++
++msgid "Transfer"
++msgstr ""
++
++msgid "Transmission Rate"
++msgstr "Velocità di transmissione"
++
++msgid "Transmit"
++msgstr "Trasmissione"
++
++msgid "Transmit Power"
++msgstr "Potenza di trasmissione"
++
++msgid "Transmitter Antenna"
++msgstr "Antenna trasmettente"
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr ""
++
++msgid "Tunnel Interface"
++msgstr ""
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Modalità turbo"
++
++msgid "Tx-Power"
++msgstr ""
++
++msgid "Type"
++msgstr "Tipo"
++
++msgid "UDP:"
++msgstr ""
++
++msgid "UMTS only"
++msgstr ""
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr ""
++
++msgid "USB Device"
++msgstr ""
++
++msgid "UUID"
++msgstr ""
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "Unknown Error, password not changed!"
++msgstr ""
++
++msgid "Unmanaged"
++msgstr ""
++
++msgid "Unsaved Changes"
++msgstr "Modifiche non salvate"
++
++msgid "Unsupported protocol type."
++msgstr ""
++
++msgid "Update lists"
++msgstr ""
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"Carica un'immagine sysupgrade compatibile quì per sostituire il firmware in "
++"esecuzione. Attivare la spunta \"Mantieni Impostazioni\" per mantenere la "
++"configurazione corrente (richiede un immagine del firmware OpenWrt "
++"compatibile)."
++
++msgid "Upload archive..."
++msgstr "Carica archivio..."
++
++msgid "Uploaded File"
++msgstr "Invia file"
++
++msgid "Uptime"
++msgstr "Tempo di attività"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Usa <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr "Usa il DHCP del gateway"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "Usa i server DNS annunciati dal peer"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "Usa i codici delle nazioni ISO/IEC 3166 alpha2."
++
++msgid "Use MTU on tunnel interface"
++msgstr "Usa MTU nel tunnel dell'interfaccia"
++
++msgid "Use TTL on tunnel interface"
++msgstr "Usa TTL nel tunnel dell'interfaccia"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "Usa flag broadcast"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "Usa server DNS personalizzati"
++
++msgid "Use default gateway"
++msgstr "Usa il gateway predefinito"
++
++msgid "Use gateway metric"
++msgstr "Usa la metrica del gateway"
++
++msgid "Use routing table"
++msgstr "Utilizzare tabella di instradamento"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"Utilizzare il pulsante <em>Aggiungi</em> per aggiungere una nuova voce di "
++"locazione. L'<em>Indirizzo-MAC</em> identifica l'host, l'<em>Indirizzo-IPv4</"
++"em> specifica l'indirizzo fisso da utilizzare e il <em> Nome Host</em> è "
++"assegnato come nome simbolico alla richiesta dell'host."
++
++msgid "Used"
++msgstr "Usato"
++
++msgid "Used Key Slot"
++msgstr "Slot Chiave Usata"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Nome Utente"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "Interfaccia VLAN"
++
++msgid "VLANs on %q"
++msgstr "VLANs su %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLANs su %q (%s)"
++
++msgid "VPN Server"
++msgstr "Server VPN"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++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"
++
++msgid "Version"
++msgstr "Versione"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "Sistema Aperto WEP"
++
++msgid "WEP Shared Key"
++msgstr "Chiave Condivisa WEP"
++
++msgid "WEP passphrase"
++msgstr "frase di accesso WEP"
++
++msgid "WMM Mode"
++msgstr "Modalità WMM"
++
++msgid "WPA passphrase"
++msgstr "frase di accesso WPA"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 ""
++
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Avviso"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr "Wireless"
++
++msgid "Wireless Adapter"
++msgstr "Dispositivo Wireless"
++
++msgid "Wireless Network"
++msgstr "Rete Wireless"
++
++msgid "Wireless Overview"
++msgstr "Panoramica Wireless"
++
++msgid "Wireless Security"
++msgstr "Sicurezza Wireless"
++
++msgid "Wireless is disabled or not associated"
++msgstr "La rete Wireless è disattivata o non associata"
++
++msgid "Wireless is restarting..."
++msgstr "Riavvio della Wireless..."
++
++msgid "Wireless network is disabled"
++msgstr "La rete Wireless è disattivata"
++
++msgid "Wireless network is enabled"
++msgstr "La rete wireless è attivata"
++
++msgid "Wireless restarted"
++msgstr "Wireless riavviato"
++
++msgid "Wireless shut down"
++msgstr "Wireless spento"
++
++msgid "Write received DNS requests to syslog"
++msgstr "Scrittura delle richiesta DNS ricevute nel syslog"
++
++msgid "XR Support"
++msgstr "Supporto XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"È possibile abilitare o disabilitare gli script di inizializzazione "
++"installati qui. Le modifiche saranno applicate dopo il riavvio del "
++"dispositivo <br/><strong>Attenzione: Se si disattiva gli script di "
++"inizializzazione essenziali come ad esempio la \"rete\", il dispositivo "
++"potrebbe diventare inaccessibile!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"È necessario attivare Java Script nel tuo browser o LuCI non funzionerà "
++"correttamente."
++
++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 ""
++
++msgid "any"
++msgstr "qualsiasi"
++
++msgid "auto"
++msgstr "auto"
++
++#, fuzzy
++msgid "automatic"
++msgstr "statico"
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "ponte"
++
++msgid "create:"
++msgstr "crea:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "Crea un ponte sulle interfacce selezionate"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "disabilita"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "scaduto"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"file dove vengono salvati le richieste <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr> assegnate"
++
++msgid "forward"
++msgstr "inoltro"
++
++msgid "full-duplex"
++msgstr "full-duplex"
++
++msgid "half-duplex"
++msgstr "half-duplex"
++
++msgid "help"
++msgstr "aiuto"
++
++msgid "hidden"
++msgstr "nascosto"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "se la destinazione è una rete"
++
++msgid "input"
++msgstr "ingresso"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "no"
++
++msgid "no link"
++msgstr "Nessun collegamento"
++
++msgid "none"
++msgstr "nessuna"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "spento"
++
++msgid "on"
++msgstr "acceso"
++
++msgid "open"
++msgstr "apri"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "instradato"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "etichettato"
++
++msgid "unknown"
++msgstr "sconosciuto"
++
++msgid "unlimited"
++msgstr "illimitato"
++
++msgid "unspecified"
++msgstr "non specificato"
++
++msgid "unspecified -or- create:"
++msgstr "non specificato - o - creato:"
++
++msgid "untagged"
++msgstr "non etichettato"
++
++msgid "yes"
++msgstr "Sì"
++
++msgid "« Back"
++msgstr "« Indietro"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "Attiva la negoziazione IPv6 sul collegamento PPP"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "Ignora i files Hosts"
++
++#~ msgid "Path"
++#~ msgstr "Percorso"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Per favore attendi: Riavvio del dispositivo..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Attenzione: Ci sono modifiche non salvate che verranno persi riavviando!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Usare sempre i canali a 40MHz anche se con le sovrapposizioni dei canali "
++#~ "secondari. Utilizzando questa opzione non è conforme con gli standard "
++#~ "IEEE 802.11n-2009!"
++
++#~ msgid "Cached"
++#~ msgstr "Nella cache"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr ""
++#~ "Configura questo mount come memoria di sovrapposizione per il blocco-"
++#~ "extroot"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "Forza la modalità a 40MHz"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Frequency Hopping"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "Bloccato al canale %d utilizzato da %s"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "Utilizzare come filesystem di root"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "ID Utente HE.net"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "secondo canale superiore a 40MHz"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "secondo canale inferiore a 40MHz"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Accetta gli annunci di router"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Annuncia IPv6 sulla rete"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "ID di Rete Annunciato"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "Intervallo permesso 1-65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "capacità HT"
++
++#~ msgid "HT mode"
++#~ msgstr "Modalità HT"
++
++#~ msgid "Router Model"
++#~ msgstr "Modello Router"
++
++#~ msgid "Router Name"
++#~ msgstr "Nome Router"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr ""
++#~ "Specifica la durata dell'annuncio con prefisso preferito della durata in "
++#~ "secondi"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr ""
++#~ "Specifica la validità dell'annuncio con prefisso preferito della durata "
++#~ "in secondi"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "Utilizzare durata preferita"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "Utilizzare durata valida"
++
++#~ msgid "Active Leases"
++#~ msgstr "Lease attivi"
++
++#~ msgid "Open"
++#~ msgstr "Apri"
++
++#~ msgid "KB"
++#~ msgstr "KB"
++
++#~ msgid "Bit Rate"
++#~ msgstr "Bit Rate"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "Configurazione / Applica"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "Configurazioni / cambiamenti"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "Configuration / Annullali"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Encrypted\">Encr.</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "<abbr title=\"Wireless Local Area Network\">Scansione WLAN</abbr>"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "Scegli quale rete vuoi attaccare all'interfaccia wireless. Selezionando "
++#~ "<em>unspecified</em> per non associarne alcuna o <em>create</em> per "
++#~ "definirne una nuova ora."
++
++#~ msgid "Create Network"
++#~ msgstr "Crea rete"
++
++#~ msgid "Link"
++#~ msgstr "Collegamento"
++
++#~ msgid "Networks"
++#~ msgstr "Reti"
++
++#~ msgid "Power"
++#~ msgstr "Potenza"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Reti Wifi nell&#39;ambiente circostante"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "Notazione <abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>: "
++#~ "indirizzo/prefisso"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "Broadcast <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "Indirizzo <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "Nota: Se scegli un interfaccia qui che fa parte di un altro network, sarà "
++#~ "spostata in questo network."
++
++#~ msgid ""
++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might "
++#~ "lose access to this router if you are connected via this interface."
++#~ msgstr ""
++#~ "Vuoi davvero cancellare questa interfaccia? Non potrai tornare indietro!"
++#~ "\\nPotresti perdere l'accesso a questo router se stai usando questa "
++#~ "interfaccia."
++
++#~ msgid ""
++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou "
++#~ "might lose access to this router if you are connected via this network."
++#~ msgstr ""
++#~ "Vuoi davvero cancellare questa rete wireless? Non potrai tornare indietro!"
++#~ "\\nPotresti perdere l'accesso a questo router se stai usando questa rete."
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "Le porte di rete del tuo router possono essere combinate in molte <abbr "
++#~ "title=\"Virtual Local Area Network\">VLAN</abbr> nelle quali i computer "
++#~ "possono comunicare direttamente fra di loro. Le <abbr title=\"Virtual "
++#~ "Local Area Network\">VLAN</abbr> sono spesso usate per separare segmenti "
++#~ "di rete differenti. Spesso c&#39;è come predefinita una porta per la "
++#~ "connessione alla prossiam rete più grande come Internet e altre porte per "
++#~ "le reti locali."
++
++#~ msgid "Custom Files"
++#~ msgstr "Files personalizzati"
++
++#~ msgid "Custom files"
++#~ msgstr "Files personalizzati"
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Files da conservare quando si aggiorna un nuovo firmware"
++
++#~ msgid "General"
++#~ msgstr "Generale"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Qui puoi personalizzare i settaggi e le funzionalità di <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++
++#~ msgid "Post-commit actions"
++#~ msgstr "Azioni post-modifica"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Questi comandi verranno eseguiti automaticamente quando un comando di "
++#~ "configurazione <abbr title=\"Unified Configuration Interface\">UCI</abbr> "
++#~ "viene applicato permettendo alle modifiche di essere applicate "
++#~ "immediatamente."
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "<abbr title=\"User Interface\">UI</abbr> web"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "Server <abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>"
++
++#~ msgid "ARP ping retries"
++#~ msgstr "tentativi ping ARP "
++
++#~ msgid "ATM Settings"
++#~ msgstr "Impostazioni ATM"
++
++#~ msgid "Accept Router Advertisements"
++#~ msgstr "Accetta annunciamenti router"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Access point (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Opzioni pppd aggiuntive"
++
++#~ msgid "Allowed range is 1 to FFFF"
++#~ msgstr "Intervallo ammesso è tra 1 e FFFF"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Disconnetti automaticamente"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Archivio di backup"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Configura il server DNS locale per usare i server DNS negoziati da PPP"
++
++#~ msgid "Connect script"
++#~ msgstr "Script connessione"
++
++#~ msgid "Create backup"
++#~ msgstr "Crea un backup"
++
++#~ msgid "Default"
++#~ msgstr "Default"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Script disconnessione"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Modifica lista dei pacchetti e destinazione dell'installazione"
++
++#~ msgid "Enable 4K VLANs"
++#~ msgstr "Abilita 4K VLANs"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Attiva IPv6 sul collegamento PPP"
++
++#, fuzzy
++#~ msgid "Firmware image"
++#~ msgstr "Firmware image"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Qui puoi salvare e ripristinare la configurazione del tuo router e - se "
++#~ "possibile - resettare il router con le impostazioni predefinite."
++
++#~ msgid "Installation targets"
++#~ msgstr "Destinazione installazione"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Conserva i files di configurazione"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Keep-Alive"
++
++#~ msgid "Kernel"
++#~ msgstr "Kernel"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Consenti a pppd di sostituire la route di default con la route corrente "
++#~ "per usare l&#39;interfaccia PPP dopo una connessione riuscita"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr ""
++#~ "Permette a pppd di avviare questo script dopo l&#39;avvenuta connessione "
++#~ "PPP"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr ""
++#~ "Permette a pppd di avviare questo script prima della disconnessione PPP"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Fai attenzione di inserire il codice PIN corretto qui o potresti bloccare "
++#~ "la tua sim card!"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "Molti di loro sono servers, che offrono un determinato servizio al tuo "
++#~ "dispositivo o alla tua rete come accesso shell, servire pagine web come "
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr>, fare mesh "
++#~ "routing, inviare e-mails, ..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr "Numero di test di connettività falliti prima di una riconnessione"
++
++#~ msgid "PIN code"
++#~ msgstr "Codice PIN"
++
++#~ msgid "PPP Settings"
++#~ msgstr "Opzioni PPP"
++
++#~ msgid "Package lists"
++#~ msgstr "Lista pacchetti"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr ""
++#~ "Procedi annullando tutte le modifiche e resettando ai predefiniti del "
++#~ "firmware?"
++
++#~ msgid "Processor"
++#~ msgstr "Processore"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Porta Radius"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Server Radius"
++
++#~ msgid "Relay Settings"
++#~ msgstr "Opzioni Relay"
++
++#~ msgid "Replace default route"
++#~ msgstr "Sostituisci route di default"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Ripristina il router come predefinito"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr ""
++#~ "Secondi da attendere prima che il modem diventi pronto prima di provare a "
++#~ "connettersi"
++
++#~ msgid "Service type"
++#~ msgstr "Tipo di servizio"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr "Servizi e demoni svolgono alcune azioni sul tuo dispositivo."
++
++#~ msgid "Settings"
++#~ msgstr "Impostazioni"
++
++#~ msgid "Setup wait time"
++#~ msgstr "Tempo di attesa inizializzazione"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr "Specifica opzioni linea di comando aggiuntive per pppd qui"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "Il device node del tuo modem, e.s. /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr ""
++#~ "Tempo (in secondi) dopo il quale una connessione inattiva verrà chiusa"
++
++#~ msgid "Update package lists"
++#~ msgstr "Aggiorna lista pacchetti"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "Upload an OpenWrt image file to reflash the device."
++
++#~ msgid "Upload image"
++#~ msgstr "Upload image"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "Usa DNS ottenuti"
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Devi installare \"comgt\" per il supporto UMTS/GPRS, \"ppp-mod-pppoe\" "
++#~ "per PPPoE, \"ppp-mod-pppoa\" per PPPoA e \"pptp\" per PPtP"
++
++#~ msgid "back"
++#~ msgstr "indietro"
++
++#~ msgid "buffered"
++#~ msgstr "in buffer"
++
++#~ msgid "cached"
++#~ msgstr "in cache"
++
++#~ msgid "free"
++#~ msgstr "libera"
++
++#~ msgid "static"
++#~ msgstr "statico"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> è una collezione "
++#~ "di software libero scritto in Lua comprendente un Webframework e "
++#~ "interfaccia web <abbr title=\"Model-View-Controller\">MVC</abbr> per "
++#~ "dispositivi integrati. <abbr title=\"Lua Configuration Interface\">LuCI</"
++#~ "abbr> è rilasciato sotto la Apache-License."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "Chiavi <abbr title=\"Secure Shell\">SSH</abbr>s"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "Un piccolo e leggero web-server scritto in C è disegnato per integrarsi "
++#~ "con LuCi"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Un piccolo webserver che può essere usato per servire <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++
++#~ msgid "About"
++#~ msgstr "Informazioni su"
++
++#~ msgid "Active IP Connections"
++#~ msgstr "Connessioni IP attive"
++
++#~ msgid "Addresses"
++#~ msgstr "Indirizzi"
++
++#~ msgid "Admin Password"
++#~ msgstr "Password di Amministratore"
++
++#~ msgid "Alias"
++#~ msgstr "Alias"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Authentication Realm"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Porta Bridge"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr ""
++#~ "Cambia la password dell'amministratore di sistema (Utente <code>root</"
++#~ "code>)"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Client + WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "File di configurazione"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Timeout Connessione"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Contributing Developers"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "DHCP assegnato"
++
++#~ msgid "Document root"
++#~ msgstr "Radice dei documenti"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Abilita Keep-Alive"
++
++#~ msgid "Enable device"
++#~ msgstr "Abilita dispositivo"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "Qui puoi incollare le tue chiavi <abbr title=\"Secure Shell\">SSH</abbr> "
++#~ "(una per linea) per l&#39;autenticazione <abbr title=\"Secure Shell"
++#~ "\">SSH</abbr> a chiave pubblica."
++
++#~ msgid "Interface Status"
++#~ msgstr "Stato Interfaccia"
++
++#~ msgid "Lead Development"
++#~ msgstr "Lead Development"
++
++#~ msgid "No address configured on this interface."
++#~ msgstr "Nessun indirizzo è configurato su questa interfaccia."
++
++#~ msgid "Not configured"
++#~ msgstr "Non configurato"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Password cambiata con successo"
++
++#~ msgid "Plugin path"
++#~ msgstr "Percorso plugin"
++
++#~ msgid "Ports"
++#~ msgstr "Porte"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Sito del progetto"
++
++#~ msgid "Thanks To"
++#~ msgstr "Ringraziamenti"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr ""
++#~ "Il realm che verrà visualizzato al prompt di autenticazione per le pagine "
++#~ "protette."
++
++#~ msgid "Unknown Error"
++#~ msgstr "Errore sconosciuto"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "predefinito <code>/etc/httpd.conf</code>"
++
++#~ msgid "Enable this switch"
++#~ msgstr "Abilita questo switch"
++
++#~ msgid "OPKG error code %i"
++#~ msgstr "OPKG codice di errore %i"
++
++#~ msgid "Package lists updated"
++#~ msgstr "Lista pacchetti aggiornata"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Upgrade installed packages"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "Inoltre i log del kernel o dei servizi sono visualizzabili qui per avere "
++#~ "un riassunto dello stato attuale."
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "Qui puoi trovare informazione sullo stato del sistema come frequenza di "
++#~ "clock della <abbr title=\"Central Processing Unit\">CPU</abbr>, uso della "
++#~ "memoria o dati della scheda di rete."
++
++#~ msgid "Search file..."
++#~ msgstr "Cerca file..."
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> è un&#39;"
++#~ "interfaccia grafica gratuita, flessibile, e amichevole per configurare "
++#~ "OpenWrt Kamikaze."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "Ed ora buon divertimento con il tuo router!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "dal momento che vogliamo migliorare quest&#39;interfaccia accettiamo "
++#~ "suggerimenti."
++
++#~ msgid "Hello!"
++#~ msgstr "Ciao!"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Nota: Le modifiche devono essere confermate in <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr> cliccando Modifiche - Salva e "
++#~ "Applica prima di essere applicate."
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "Nelle seguenti pagine puoi impostare tutti i settaggi più importanti del "
++#~ "tuo router"
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr "Il Team di <abbr title=\"Lua Configuration Interface\">LuCI</abbr>"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Questa è l&#39;area d&#39;amministrazione di <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++
++#~ msgid "User Interface"
++#~ msgstr "Interfaccia utente"
++
++#~ msgid "enable"
++#~ msgstr "abilita"
++
++#, fuzzy
++#~ msgid "(optional)"
++#~ msgstr " (opzionale)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "Porta <abbr title=\"Domain Name System\">DNS</abbr>"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "I server <abbr title=\"Domain Name System\">DNS</abbr> verranno "
++#~ "contattati nell&#39;ordine del file resolv"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr ""
++#~ "Numero massimo di lease <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 ""
++#~ "Dimensione massima pacchetto <abbr title=\"Extension Mechanisms for "
++#~ "Domain Name System\">EDNS0</abbr>"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "Isolazione AP"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "Aggiungi la rete Wifi alla rete fisica"
++
++#~ msgid "Aliases"
++#~ msgstr "Alias"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Clamp Segment Size"
++
++#, fuzzy
++#~ msgid "Create Or Attach Network"
++#~ msgstr "Crea rete"
++
++#~ msgid "Devices"
++#~ msgstr "Dispositivi"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "Non inoltrare richieste per le reti locali"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "Abilita server TFTP"
++
++#~ msgid "Errors"
++#~ msgstr "Errori"
++
++#~ msgid "Essentials"
++#~ msgstr "Essenziali"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Espandi host"
++
++#~ msgid "First leased address"
++#~ msgstr "Primo indirizzo offerto"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++
++#~ msgid "Hardware Address"
++#~ msgstr "Hardware Address"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "Qui puoi configurare i tuoi dispositivi wireless installati."
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "Independente (Ad-Hoc)"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Connessione Internet"
++
++#~ msgid "Join (Client)"
++#~ msgstr "Partecipa (Client)"
++
++#~ msgid "Leases"
++#~ msgstr "Lease"
++
++#~ msgid "Local Domain"
++#~ msgstr "Dominio locale"
++
++#~ msgid "Local Network"
++#~ msgstr "Rete locale"
++
++#~ msgid "Local Server"
++#~ msgstr "Server locale"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "Immagine boot da rete"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr ""
++#~ "Nome rete (<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "Numero di indirizzi offerti"
++
++#~ msgid "Perform Actions"
++#~ msgstr "Esegui azioni"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "Impedisci la comunicazione fra Client"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "Offri (Access Point)"
++
++#~ msgid "Resolvfile"
++#~ msgstr "File resolv"
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "Radice del server TFTP"
++
++#~ msgid "TX / RX"
++#~ msgstr "TX / RX"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "Le seguenti modifiche sono state applicate"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "Quando si aggiorna un firmware con <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> questi files verranno aggiunti al nuovo firmware."
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "Con <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> i "
++#~ "membri della rete possono ricevere automaticamente le loro impostazioni "
++#~ "di rete (indirizzi <abbr title=\"Internet Protocol\">IP</abbr>, maschere "
++#~ "di rete, server <abbr title=\"Domain Name System\">DNS</abbr>, ...)."
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "Puoi avere più reti wifi con un solo dispositivo. Sappi ceh ci sono "
++#~ "alcune restrizioni relative all&#39;hardware ed al driver.Normalmente "
++#~ "puoi avere 1 rete Ad-Hoc o fino a 3 reti Master e uan rete in modalità "
++#~ "Client contemporaneamente."
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "Devi installare \"ppp-mod-pppoe\" per il supporto PPPoE e \"pptp\" per "
++#~ "PPtP"
++
++#~ msgid "additional hostfile"
++#~ msgstr "file hosts aggiuntivo"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr "aggiungi nomi di dominio nel file resolv"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "riconnetti automaticamente"
++
++#~ msgid "concurrent queries"
++#~ msgstr "richieste contemporanee"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr ""
++#~ "disabilita <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++#~ "abbr> per queste interfacce"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "disconnetti quando non usata per"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "non tenere sconosciuti in cache"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr ""
++#~ "Filtra richieste <abbr title=\"Domain Name System\">DNS</abbr> inutili di "
++#~ "sistemi windows"
++
++#~ msgid "installed"
++#~ msgstr "installato"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "localizza l&#39;hostname a seconda delle sue sottoreti"
++
++#~ msgid "not installed"
++#~ msgstr "non installato"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr ""
++#~ "impedisci la cache di risposte <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr> negative"
++
++#~ msgid "query port"
++#~ msgstr "porta per le richieste"
++
++#~ msgid "transmitted / received"
++#~ msgstr "transmessi / ricevuti"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "Rete"
++
++#~ msgid "all"
++#~ msgstr "tutti"
++
++#~ msgid "Code"
++#~ msgstr "Codice"
++
++#~ msgid "Distance"
++#~ msgstr "Distanza"
++
++#~ msgid "Legend"
++#~ msgstr "Legenda"
++
++#~ msgid "Library"
++#~ msgstr "Libreria"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "leggi il manuale di &#39;%s&#39;"
++
++#~ msgid "Package Manager"
++#~ msgstr "Gestore pacchetti"
++
++#~ msgid "Service"
++#~ msgstr "Servizio"
++
++#~ msgid "Statistics"
++#~ msgstr "Statistiche"
++
++#~ msgid "zone"
++#~ msgstr "Zona"
+diff --git a/feeds/luci/modules/luci-base/po/ja/base.po b/feeds/luci/modules/luci-base/po/ja/base.po
+new file mode 100644
+index 0000000..39b81e3
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/ja/base.po
+@@ -0,0 +1,4348 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2013-10-06 02:29+0200\n"
++"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\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: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d 分幅, %d 秒間隔)"
++
++msgid "(%s available)"
++msgstr "(%s 使用å¯èƒ½)"
++
++msgid "(empty)"
++msgstr "(空)"
++
++msgid "(no interfaces attached)"
++msgstr "(インターフェースãŒæŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã›ã‚“)"
++
++msgid "-- Additional Field --"
++msgstr "-- 追加項目 --"
++
++msgid "-- Please choose --"
++msgstr "-- é¸æŠžã—ã¦ãã ã•ã„ --"
++
++msgid "-- custom --"
++msgstr "-- 手動設定 --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "éŽåŽ»1分ã®è² è·:"
++
++msgid "15 Minute Load:"
++msgstr "éŽåŽ»15分ã®è² è·:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "éŽåŽ»5分ã®è² è·:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> クエリãƒãƒ¼ãƒˆ"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> サーãƒãƒ¼ãƒãƒ¼ãƒˆ"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"リゾルãƒãƒ•ã‚¡ã‚¤ãƒ«ã®é †ç•ªã«ã€<abbr title=\"Domain Name System\">DNS</abbr>サー"
++"ãƒãƒ¼ã«å•ã„åˆã‚ã›ã‚’è¡Œã„ã¾ã™"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-アドレス"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-ゲートウェイ"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-ãƒãƒƒãƒˆãƒžã‚¹ã‚¯"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-アドレスåˆã¯ãƒãƒƒãƒˆ"
++"ワーク (CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-ゲートウェイ"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> 設定"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> å"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-アドレス"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"<abbr title=\"maximal\">最大</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=\"maximal\">最大</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> パケットサイズ"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"maximal\">最大</abbr> 並列処ç†ã‚¯ã‚¨ãƒª"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr ""
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "ARサãƒãƒ¼ãƒˆ"
++
++msgid "ARP retry threshold"
++msgstr "ARPå†è©¦è¡Œã—ãã„値"
++
++msgid "ATM Bridges"
++msgstr "ATMブリッジ"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "ATM仮想ãƒãƒ£ãƒãƒ«è­˜åˆ¥å­ (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "ATMä»®æƒ³ãƒ‘ã‚¹è­˜åˆ¥å­ (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++
++msgid "ATM device number"
++msgstr "ATMデãƒã‚¤ã‚¹ç•ªå·"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Access Concentrator"
++
++msgid "Access Point"
++msgstr "アクセスãƒã‚¤ãƒ³ãƒˆ"
++
++msgid "Action"
++msgstr "動作"
++
++msgid "Actions"
++msgstr "動作"
++
++msgid "Activate this network"
++msgstr "ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’有効ã«ã™ã‚‹"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++"稼åƒä¸­ã® <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-経路情報"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++"稼åƒä¸­ã® <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-経路情報"
++
++msgid "Active Connections"
++msgstr "アクティブコãƒã‚¯ã‚·ãƒ§ãƒ³"
++
++msgid "Active DHCP Leases"
++msgstr "アクティブãªDHCPリース"
++
++msgid "Active DHCPv6 Leases"
++msgstr "アクティブãªDHCPv6リース"
++
++msgid "Ad-Hoc"
++msgstr "アドホック"
++
++msgid "Add"
++msgstr "追加"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++
++msgid "Add new interface..."
++msgstr "インターフェースã®æ–°è¦ä½œæˆ..."
++
++msgid "Additional Hosts files"
++msgstr "追加ã®ãƒ›ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "アドレス"
++
++msgid "Address to access local relay bridge"
++msgstr "ローカル・リレーブリッジã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã®IPアドレス"
++
++msgid "Administration"
++msgstr "管ç†ç”»é¢"
++
++msgid "Advanced Settings"
++msgstr "詳細設定"
++
++msgid "Alert"
++msgstr "警告"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr "<abbr title=\"Secure Shell\">SSH</abbr> パスワードèªè¨¼ã‚’許å¯ã—ã¾ã™"
++
++msgid "Allow all except listed"
++msgstr "リスト内ã®ç«¯æœ«ã‹ã‚‰ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ç¦æ­¢"
++
++msgid "Allow listed only"
++msgstr "リスト内ã®ç«¯æœ«ã‹ã‚‰ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯"
++
++msgid "Allow localhost"
++msgstr "ローカルホストを許å¯ã™ã‚‹"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"リモートホストãŒSSH転é€ã•ã‚ŒãŸãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒãƒ¼ãƒˆã«æŽ¥ç¶šã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™"
++
++msgid "Allow root logins with password"
++msgstr "パスワードを使用ã—ãŸroot権é™ã§ã®ãƒ­ã‚°ã‚¤ãƒ³ã‚’許å¯ã™ã‚‹"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "パスワードを使用ã—ãŸ<em>root</em>権é™ã§ã®ãƒ­ã‚°ã‚¤ãƒ³ã‚’許å¯ã™ã‚‹"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ãŒã‚ªãƒ•ã®å ´åˆã€è¿½åŠ ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãŒä½œæˆã•ã‚Œã¾ã™ã€‚"
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "アンテナ 1"
++
++msgid "Antenna 2"
++msgstr "アンテナ 2"
++
++msgid "Antenna Configuration"
++msgstr "アンテナ設定"
++
++msgid "Any zone"
++msgstr "å…¨ã¦ã®ã‚¾ãƒ¼ãƒ³"
++
++msgid "Apply"
++msgstr "é©ç”¨"
++
++msgid "Applying changes"
++msgstr "変更をé©ç”¨"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr ""
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "èªè¨¼æ¸ˆã¿ç«¯æœ«"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Atheros 802.11%s 無線LANコントローラ"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "èªè¨¼"
++
++msgid "Authoritative"
++msgstr "Authoritative"
++
++msgid "Authorization Required"
++msgstr "ログインèªè¨¼"
++
++msgid "Auto Refresh"
++msgstr "自動更新"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "使用å¯"
++
++msgid "Available packages"
++msgstr "インストールå¯èƒ½ãªãƒ‘ッケージ"
++
++msgid "Average:"
++msgstr "å¹³å‡å€¤:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "戻る"
++
++msgid "Back to Overview"
++msgstr "概è¦ã¸æˆ»ã‚‹"
++
++msgid "Back to configuration"
++msgstr "設定ã¸æˆ»ã‚‹"
++
++msgid "Back to overview"
++msgstr "概è¦ã¸æˆ»ã‚‹"
++
++msgid "Back to scan results"
++msgstr "スキャンçµæžœã¸æˆ»ã‚‹"
++
++msgid "Background Scan"
++msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã‚¹ã‚­ãƒ£ãƒ³"
++
++msgid "Backup / Flash Firmware"
++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ— / ファームウェア更新"
++
++msgid "Backup / Restore"
++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ— / 復元"
++
++msgid "Backup file list"
++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—・ファイルリスト"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"以下ã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®éš›ã«å«ã¾ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ãƒªã‚¹ãƒˆã§ã™ã€‚ã“ã®ãƒªã‚¹ãƒˆã¯ã€opkgã«ã‚ˆã£"
++"ã¦èªè­˜ã•ã‚Œã¦ã„る設定ファイルã€é‡è¦ãªãƒ™ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè¨­å®šã—ãŸæ­£è¦è¡¨"
++"ç¾ã«ä¸€è‡´ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸€è¦§ã§ã™ã€‚"
++
++msgid "Bitrate"
++msgstr "ビットレート"
++
++msgid "Bogus NX Domain Override"
++msgstr ""
++
++msgid "Bridge"
++msgstr "ブリッジ"
++
++msgid "Bridge interfaces"
++msgstr "ブリッジインターフェース"
++
++msgid "Bridge unit number"
++msgstr "ブリッジユニット番å·"
++
++msgid "Bring up on boot"
++msgstr "デフォルトã§èµ·å‹•ã™ã‚‹"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Broadcom 802.11%s 無線LANコントローラ"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Broadcom BCM%04x 802.11 無線LANコントローラ"
++
++msgid "Buffered"
++msgstr "ãƒãƒƒãƒ•ã‚¡"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "ボタン"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "CPU使用率 (%)"
++
++msgid "Cancel"
++msgstr "キャンセル"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "ãƒã‚§ã‚¤ãƒ³"
++
++msgid "Changes"
++msgstr "変更"
++
++msgid "Changes applied."
++msgstr "変更ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸã€‚"
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "デãƒã‚¤ã‚¹ã®ç®¡ç†è€…パスワードを変更ã—ã¾ã™"
++
++msgid "Channel"
++msgstr "ãƒãƒ£ãƒãƒ«"
++
++msgid "Check"
++msgstr "ãƒã‚§ãƒƒã‚¯"
++
++msgid "Checksum"
++msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ "
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«è¨­å®šã™ã‚‹ãƒ•ã‚¡ã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ»ã‚¾ãƒ¼ãƒ³ã‚’é¸æŠžã—ã¦ãã ã•ã„。<em>"
++"設定ã—ãªã„</em>ã‚’é¸æŠžã™ã‚‹ã¨ã€è¨­å®šæ¸ˆã¿ã®ã‚¾ãƒ¼ãƒ³ã‚’削除ã—ã¾ã™ã€‚ã¾ãŸã€<em>作æˆ</"
++"em>フィールドã«ã‚¾ãƒ¼ãƒ³åを入力ã™ã‚‹ã¨ã€æ–°ã—ãゾーンを作æˆã—ã€ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼"
++"スã«è¨­å®šã—ã¾ã™ã€‚"
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"無線インターフェースをアタッãƒã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’é¸æŠžã—ã¦ãã ã•ã„。ã¾ãŸã¯ã€"
++"<em>作æˆ</em>欄をé¸æŠžã™ã‚‹ã¨æ–°ã—ã„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’作æˆã—ã¾ã™ã€‚"
++
++msgid "Cipher"
++msgstr "æš—å·åŒ–æ–¹å¼"
++
++msgid ""
++"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)."
++msgstr ""
++"\"ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—アーカイブã®ä½œæˆ\"をクリックã™ã‚‹ã¨ã€ç¾åœ¨ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’tarå½¢å¼"
++"ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ファイルã¨ã—ã¦ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚設定ã®ãƒªã‚»ãƒƒãƒˆã‚’è¡Œã†å ´åˆã€\"設"
++"定リセット\"をクリックã—ã¦ãã ã•ã„。(ãŸã ã—ã€squashfsã‚’ãŠä½¿ã„ã®å ´åˆã®ã¿ä½¿ç”¨å¯"
++"能ã§ã™)"
++
++msgid "Client"
++msgstr "クライアント"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "DHCPリクエスト時ã«é€ä¿¡ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆID"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"設定ã—ãŸç§’数後ã«ã€ä½¿ç”¨ã—ã¦ã„ãªã„接続を閉ã˜ã¾ã™ã€‚0を設定ã—ãŸå ´åˆã€æŽ¥ç¶šã‚’維æŒã—"
++"ã¾ã™"
++
++msgid "Close list..."
++msgstr "リストを閉ã˜ã‚‹"
++
++msgid "Collecting data..."
++msgstr "データåŽé›†ä¸­ã§ã™..."
++
++msgid "Command"
++msgstr "コマンド"
++
++msgid "Common Configuration"
++msgstr "一般設定"
++
++msgid "Compression"
++msgstr "圧縮"
++
++msgid "Configuration"
++msgstr "設定"
++
++msgid "Configuration applied."
++msgstr "設定をé©ç”¨ã—ã¾ã—ãŸã€‚"
++
++msgid "Configuration files will be kept."
++msgstr "設定ファイルã¯ä¿æŒã•ã‚Œã¾ã™ã€‚"
++
++msgid "Confirmation"
++msgstr "確èª"
++
++msgid "Connect"
++msgstr "接続"
++
++msgid "Connected"
++msgstr "接続中"
++
++msgid "Connection Limit"
++msgstr "接続制é™"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶š"
++
++msgid "Country"
++msgstr "国"
++
++msgid "Country Code"
++msgstr "国コード"
++
++msgid "Cover the following interface"
++msgstr "インターフェースã®æŒ‡å®š"
++
++msgid "Cover the following interfaces"
++msgstr "インターフェースã®æŒ‡å®š"
++
++msgid "Create / Assign firewall-zone"
++msgstr "ファイアウォールゾーンã®ä½œæˆ / 割り当ã¦"
++
++msgid "Create Interface"
++msgstr "インターフェースã®ä½œæˆ"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "複数ã®ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ã‚’指定ã—ã¦ãƒ–リッジを作æˆã—ã¾ã™"
++
++msgid "Critical"
++msgstr "é‡å¤§"
++
++msgid "Cron Log Level"
++msgstr "Cronã®ãƒ­ã‚°å‡ºåŠ›ãƒ¬ãƒ™ãƒ«"
++
++msgid "Custom Interface"
++msgstr "æ–°ã—ã„インターフェース"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"<abbr title=\"Light Emitting Diode\">LED</abbr> デãƒã‚¤ã‚¹ã®æŒ™å‹•ã‚’カスタマイズ"
++"ã—ã¾ã™ã€‚"
++
++msgid "DHCP Leases"
++msgstr "DHCPリース"
++
++msgid "DHCP Server"
++msgstr "DHCPサーãƒãƒ¼"
++
++msgid "DHCP and DNS"
++msgstr "DHCP åŠã³ DNS"
++
++msgid "DHCP client"
++msgstr "DHCP クライアント"
++
++msgid "DHCP-Options"
++msgstr "DHCPオプション"
++
++msgid "DHCPv6 Leases"
++msgstr "DHCPv6 リース"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "DNSフォワーディング"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "デãƒãƒƒã‚°"
++
++msgid "Default %d"
++msgstr "標準設定 %d"
++
++msgid "Default gateway"
++msgstr "デフォルトゲートウェイ"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "標準状態"
++
++msgid "Define a name for this network."
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯åを設定ã—ã¦ãã ã•ã„。"
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"追加ã®DHCPオプションを設定ã—ã¾ã™ã€‚(例:\"<code>6,192.168.2.1,192.168.2.2</"
++"code>\" ã¨è¨­å®šã™ã‚‹ã“ã¨ã§ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«æŒ‡å®šã®DNSサーãƒãƒ¼ã‚’通知ã—ã¾ã™ã€‚)"
++
++msgid "Delete"
++msgstr "削除"
++
++msgid "Delete this interface"
++msgstr "インターフェースを削除ã—ã¾ã™"
++
++msgid "Delete this network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削除ã—ã¾ã™"
++
++msgid "Description"
++msgstr "詳細"
++
++msgid "Design"
++msgstr "デザイン"
++
++msgid "Destination"
++msgstr "宛先"
++
++msgid "Device"
++msgstr "デãƒã‚¤ã‚¹"
++
++msgid "Device Configuration"
++msgstr "デãƒã‚¤ã‚¹è¨­å®š"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "診断機能"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "ディレクトリ"
++
++msgid "Disable"
++msgstr "無効"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ã¯<abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>機能を使用ã—ã¾ã›ã‚“。"
++
++msgid "Disable DNS setup"
++msgstr "DNSセットアップを無効ã«ã™ã‚‹"
++
++msgid "Disable HW-Beacon timer"
++msgstr "HWビーコンタイマーを無効ã«ã™ã‚‹"
++
++msgid "Disabled"
++msgstr "無効"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "RFC1918ã®å¿œç­”を破棄ã—ã¾ã™"
++
++msgid "Displaying only packages containing"
++msgstr "å³è¨˜ã®è¡¨ç¤ºã‚’å«ã‚“ã ãƒ‘ッケージã®ã¿ã‚’表示中"
++
++msgid "Distance Optimization"
++msgstr "è·é›¢ã®æœ€é©åŒ–"
++
++msgid "Distance to farthest network member in meters."
++msgstr "最もé ã„端末ã¨ã®è·é›¢(メートル)を設定ã—ã¦ãã ã•ã„。"
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "ダイãƒã‚·ãƒ†ã‚£"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq 㯠<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++"サーãƒãƒ¼ã¨ <abbr title=\"Network Address Translation\">NAT</abbr>ファイア"
++"ウォールã®ç‚ºã® <abbr title=\"Domain Name System\">DNS</abbr>フォワーダーを複"
++"åˆã—ãŸã‚µãƒ¼ãƒ“スã§ã™ã€‚"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr ""
++"無効ãªãƒªãƒ—ライをキャッシュã—ã¾ã›ã‚“ (例:存在ã—ãªã„ドメインã‹ã‚‰ã®è¿”ç­”ãªã©)"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr "パブリックDNSサーãƒãƒ¼ãŒè¿”ç­”ã§ããªã‹ã£ãŸãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’転é€ã—ã¾ã›ã‚“"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr "ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸ã®é€†å¼•ãを転é€ã—ã¾ã›ã‚“"
++
++msgid "Do not send probe responses"
++msgstr "プローブレスãƒãƒ³ã‚¹ã‚’é€ä¿¡ã—ãªã„"
++
++msgid "Domain required"
++msgstr "ドメイン必須"
++
++msgid "Domain whitelist"
++msgstr "ドメイン・ホワイトリスト"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"<abbr title=\"Domain Name System\">DNS</abbr>åã®ç„¡ã„ <abbr title=\"Domain "
++"Name System\">DNS</abbr>リクエストを転é€ã—ã¾ã›ã‚“"
++
++msgid "Download and install package"
++msgstr "パッケージã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã¨ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"
++
++msgid "Download backup"
++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—アーカイブã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰"
++
++msgid "Dropbear Instance"
++msgstr "Dropbear設定"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear 㯠<abbr title=\"Secure Shell\">SSH</abbr> ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸ã®ã‚·ã‚§ãƒ«ã‚¢"
++"クセスã¨çµ±åˆã•ã‚ŒãŸ <abbr title=\"Secure Copy\">SCP</abbr> サーãƒãƒ¼ã‚’æä¾›ã—ã¾"
++"ã™ã€‚"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"ダイナミック <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++
++msgid "Dynamic tunnel"
++msgstr "動的トンãƒãƒ«æ©Ÿèƒ½"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"クライアントã«å¯¾ã—ã¦å‹•çš„ã«DHCPアドレスを割り振りã¾ã™ã€‚無効ã«è¨­å®šã—ãŸå ´åˆã€é™"
++"的リースã®ã¿ã‚’è¡Œã„ã¾ã™ã€‚"
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "EAPメソッド"
++
++msgid "Edit"
++msgstr "編集"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "インターフェースを編集"
++
++msgid "Edit this network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’編集"
++
++msgid "Emergency"
++msgstr "緊急"
++
++msgid "Enable"
++msgstr "有効"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr>を有効ã«ã™ã‚‹"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "HE.netã®å‹•çš„endpoint更新を有効ã«ã—ã¾ã™"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "ジャンボフレーム・パススルーを有効ã«ã™ã‚‹"
++
++msgid "Enable NTP client"
++msgstr "NTPクライアント機能を有効ã«ã™ã‚‹"
++
++msgid "Enable TFTP server"
++msgstr "TFTPサーãƒãƒ¼ã‚’有効ã«ã™ã‚‹"
++
++msgid "Enable VLAN functionality"
++msgstr "VLAN機能を有効ã«ã™ã‚‹"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "ラーニング・エイジング機能を有効ã«ã™ã‚‹"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "マウント設定を有効ã«ã™ã‚‹"
++
++msgid "Enable this swap"
++msgstr "スワップ設定を有効ã«ã™ã‚‹"
++
++msgid "Enable/Disable"
++msgstr "有効/無効"
++
++msgid "Enabled"
++msgstr "有効"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "スパニングツリー・プロトコルを有効ã«ã™ã‚‹"
++
++msgid "Encapsulation mode"
++msgstr "カプセル化モード"
++
++msgid "Encryption"
++msgstr "æš—å·åŒ–モード"
++
++msgid "Erasing..."
++msgstr "消去中..."
++
++msgid "Error"
++msgstr "エラー"
++
++msgid "Ethernet Adapter"
++msgstr "イーサãƒãƒƒãƒˆã‚¢ãƒ€ãƒ—ã‚¿"
++
++msgid "Ethernet Switch"
++msgstr "イーサãƒãƒƒãƒˆã‚¹ã‚¤ãƒƒãƒ"
++
++msgid "Expand hosts"
++msgstr "拡張ホスト設定"
++
++msgid "Expires"
++msgstr "期é™åˆ‡ã‚Œ"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++"リースアドレスã®æœ‰åŠ¹æ™‚間を入力ã—ã¾ã™ã€‚最å°è¨­å®šå€¤ã¯2分ã§ã™ã€‚ (<code>2m</"
++"code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "外部システムログ・サーãƒãƒ¼"
++
++msgid "External system log server port"
++msgstr "外部システムログ・サーãƒãƒ¼ãƒãƒ¼ãƒˆ"
++
++msgid "Fast Frames"
++msgstr "ファスト・フレーム"
++
++msgid "File"
++msgstr "ファイル"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "クライアントã«é€šçŸ¥ã™ã‚‹ãƒ–ートイメージã®ãƒ•ã‚¡ã‚¤ãƒ«å"
++
++msgid "Filesystem"
++msgstr "ファイルシステム"
++
++msgid "Filter"
++msgstr "フィルタ"
++
++msgid "Filter private"
++msgstr "プライベートフィルター"
++
++msgid "Filter useless"
++msgstr "Filter useless"
++
++msgid "Find and join network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’検索ã—ã¦å‚加"
++
++msgid "Find package"
++msgstr "パッケージを検索"
++
++msgid "Finish"
++msgstr "終了"
++
++msgid "Firewall"
++msgstr "ファイアウォール"
++
++msgid "Firewall Settings"
++msgstr "ファイアウォール設定"
++
++msgid "Firewall Status"
++msgstr "ファイアウォール・ステータス"
++
++msgid "Firmware Version"
++msgstr "ファームウェア・ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "DNSクエリをé€ä¿¡ã™ã‚‹é€ä¿¡å…ƒãƒãƒ¼ãƒˆã‚’固定ã—ã¾ã™"
++
++msgid "Flags"
++msgstr "フラグ"
++
++msgid "Flash Firmware"
++msgstr "ファームウェアã®æ›´æ–°"
++
++msgid "Flash image..."
++msgstr "æ›´æ–°"
++
++msgid "Flash new firmware image"
++msgstr "ファームウェアã®æ›´æ–°"
++
++msgid "Flash operations"
++msgstr "更新機能"
++
++msgid "Flashing..."
++msgstr "更新中..."
++
++msgid "Force"
++msgstr "強制"
++
++msgid "Force CCMP (AES)"
++msgstr "CCMP (AES) を使用"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++"別ã®DHCPサーãƒãƒ¼ãŒæ¤œå‡ºã•ã‚ŒãŸå ´åˆã§ã‚‚ã€DHCPサーãƒãƒ¼æ©Ÿèƒ½ã‚’強制的ã«èµ·å‹•ã—ã¾ã™ã€‚"
++
++msgid "Force TKIP"
++msgstr "TKIP を使用"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "TKIP åŠã³CCMP (AES) を使用"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "DHCPトラフィックを転é€ã™ã‚‹"
++
++msgid "Forward broadcast traffic"
++msgstr "ブロードキャスト・トラフィックを転é€ã™ã‚‹"
++
++msgid "Forwarding mode"
++msgstr "転é€ãƒ¢ãƒ¼ãƒ‰"
++
++msgid "Fragmentation Threshold"
++msgstr "フラグメンテーション閾値"
++
++msgid "Frame Bursting"
++msgstr "フレームãƒãƒ¼ã‚¹ãƒˆ"
++
++msgid "Free"
++msgstr "空ã"
++
++msgid "Free space"
++msgstr "ディスクã®ç©ºã容é‡"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "GPRSã®ã¿"
++
++msgid "Gateway"
++msgstr "ゲートウェイ"
++
++msgid "Gateway ports"
++msgstr "ゲートウェイ・ãƒãƒ¼ãƒˆ"
++
++msgid "General Settings"
++msgstr "一般設定"
++
++msgid "General Setup"
++msgstr "一般設定"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—アーカイブã®ä½œæˆ"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "802.11%s 無線LANコントローラ"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr "入力ã•ã‚ŒãŸãƒ‘スワードãŒä¸€è‡´ã—ã¾ã›ã‚“。パスワードã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "パスワード設定ã¸ç§»å‹•..."
++
++msgid "Go to relevant configuration page"
++msgstr "関連ã™ã‚‹è¨­å®šãƒšãƒ¼ã‚¸ã¸ç§»å‹•"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "HE.net パスワード"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "ãƒãƒ³ãƒ‰ãƒ©"
++
++msgid "Hang Up"
++msgstr "å†èµ·å‹•"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ãƒ›ã‚¹ãƒˆåやタイムゾーンãªã©ã®åŸºæœ¬çš„ãªè¨­å®šã‚’è¡Œã†ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚"
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr "SSH公開éµèªè¨¼ã§ä½¿ç”¨ã™ã‚‹SSH公開éµã‚’1è¡Œã¥ã¤ãƒšãƒ¼ã‚¹ãƒˆã—ã¦ãã ã•ã„。"
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Hermes 802.11b 無線LANコントローラ"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>ã®éš åŒ¿"
++
++msgid "Host entries"
++msgstr "ホストエントリー"
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++"ホスト<abbr title=\"Internet Protocol Address\">IP</abbr> ã¾ãŸã¯ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++msgid "Hostname"
++msgstr "ホストå"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "DHCPリクエスト時ã«é€ä¿¡ã™ã‚‹ãƒ›ã‚¹ãƒˆå"
++
++msgid "Hostnames"
++msgstr "ホストå"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "IPアドレス"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "IPv4 ファイアウォール"
++
++msgid "IPv4 WAN Status"
++msgstr "IPv4 WAN ステータス"
++
++msgid "IPv4 address"
++msgstr "IPv4 アドレス"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4åŠã³IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "IPv4 ブロードキャスト"
++
++msgid "IPv4 gateway"
++msgstr "IPv4 ゲートウェイ"
++
++msgid "IPv4 netmask"
++msgstr "IPv4 ãƒãƒƒãƒˆãƒžã‚¹ã‚¯"
++
++msgid "IPv4 only"
++msgstr "IPv4ã®ã¿"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "IPv4 プレフィクス長"
++
++msgid "IPv4-Address"
++msgstr "IPv4-アドレス"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "IPv6 ファイアウォール"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "IPv6 WAN ステータス"
++
++msgid "IPv6 address"
++msgstr "IPv6 アドレス"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "IPv6 ゲートウェイ"
++
++msgid "IPv6 only"
++msgstr "IPv6ã®ã¿"
++
++msgid "IPv6 prefix"
++msgstr "IPv6 プレフィクス"
++
++msgid "IPv6 prefix length"
++msgstr "IPv6 プレフィクス長"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "IPv6-アドレス"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-in-IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6-over-IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6-over-IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "識別å­"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr "固定ã®ãƒ‡ãƒã‚¤ã‚¹ãƒŽãƒ¼ãƒ‰åã®ã‹ã‚ã‚Šã«ã€è¨­å®šã—ãŸUUIDを使用ã—ã¦ãƒžã‚¦ãƒ³ãƒˆã—ã¾ã™"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++"固定ã®ãƒ‡ãƒã‚¤ã‚¹ãƒŽãƒ¼ãƒ‰åã®ã‹ã‚ã‚Šã«ã€è¨­å®šã—ãŸãƒ‘ーティションラベルを使用ã—ã¦ãƒžã‚¦"
++"ントã—ã¾ã™ã€‚"
++
++msgid "If unchecked, no default route is configured"
++msgstr "ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ãªã„å ´åˆã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ«ãƒ¼ãƒˆã‚’設定ã—ã¾ã›ã‚“"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr "ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ãªã„å ´åˆã€é€šçŸ¥ã•ã‚ŒãŸDNSサーãƒãƒ¼ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’無視ã—ã¾ã™"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"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>デãƒã‚¤ã‚¹ã«ã‚¹ãƒ¯ãƒƒãƒ—ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ãŸã ã—ã€ãƒ‡ãƒ¼"
++"ã‚¿ã®ã‚¹ãƒ¯ãƒƒãƒ—ã¯éžå¸¸ã«é…ã„処ç†ã§ã‚ã‚‹ãŸã‚ã€ã‚¹ãƒ¯ãƒƒãƒ—ã™ã‚‹ãƒ‡ãƒã‚¤ã‚¹ã«ã¯é«˜é€Ÿã«<abbr "
++"title=\"Random Access Memory\">RAM</abbr>ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ããªããªã‚‹æã‚Œ"
++"ãŒã‚ã‚Šã¾ã™ã€‚"
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "<code>/etc/hosts</code>を無視"
++
++msgid "Ignore interface"
++msgstr "インターフェースを無視ã™ã‚‹"
++
++msgid "Ignore resolve file"
++msgstr "リゾルãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’無視ã™ã‚‹"
++
++msgid "Image"
++msgstr "イメージ"
++
++msgid "In"
++msgstr "イン"
++
++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 "未使用時タイムアウト"
++
++msgid "Inbound:"
++msgstr "å—ä¿¡:"
++
++msgid "Info"
++msgstr "情報"
++
++msgid "Initscript"
++msgstr "起動スクリプト"
++
++msgid "Initscripts"
++msgstr "起動スクリプト"
++
++msgid "Install"
++msgstr "インストール"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "%q パッケージをインストールã—ã¾ã™"
++
++msgid "Install protocol extensions..."
++msgstr "プロトコル拡張機能をインストールã—ã¾ã™..."
++
++msgid "Installed packages"
++msgstr "インストール済ã¿ãƒ‘ッケージ"
++
++msgid "Interface"
++msgstr "インターフェース"
++
++msgid "Interface Configuration"
++msgstr "インターフェース設定"
++
++msgid "Interface Overview"
++msgstr "インターフェース一覧"
++
++msgid "Interface is reconnecting..."
++msgstr "インターフェースå†æŽ¥ç¶šä¸­..."
++
++msgid "Interface is shutting down..."
++msgstr "インターフェース終了中..."
++
++msgid "Interface not present or not connected yet."
++msgstr "インターフェースãŒå­˜åœ¨ã—ãªã„ã‹ã€æŽ¥ç¶šã—ã¦ã„ã¾ã›ã‚“"
++
++msgid "Interface reconnected"
++msgstr "インターフェースã®å†æŽ¥ç¶š"
++
++msgid "Interface shut down"
++msgstr "インターフェースã®çµ‚了"
++
++msgid "Interfaces"
++msgstr "インターフェース"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "内部サーãƒãƒ¼ã‚¨ãƒ©ãƒ¼"
++
++msgid "Invalid"
++msgstr "入力値ãŒä¸æ­£ã§ã™"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr "無効ãªVLAN IDã§ã™! IDã¯%dã‹ã‚‰%dã¾ã§ã®å€¤ã®ã¿å…¥åŠ›å¯èƒ½ã§ã™ã€‚"
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "無効ãªVLAN IDã§ã™! ユニークãªIDを入力ã—ã¦ãã ã•ã„。"
++
++msgid "Invalid username and/or password! Please try again."
++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 ""
++"æ›´æ–°ã—よã†ã¨ã—ãŸã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã“ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ãƒ¡ãƒ¢ãƒªã«é©åˆã—ã¾ã›ã‚“。もã†ä¸€"
++"度イメージファイルを確èªã—ã¦ãã ã•ã„!"
++
++msgid "Java Script required!"
++msgstr "JavaScriptを有効ã«ã—ã¦ãã ã•ã„!"
++
++msgid "Join Network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã™ã‚‹"
++
++msgid "Join Network: Settings"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã™ã‚‹: 設定"
++
++msgid "Join Network: Wireless Scan"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã™ã‚‹: ç„¡ç·šLANスキャン"
++
++msgid "Keep settings"
++msgstr "設定をä¿æŒã™ã‚‹"
++
++msgid "Kernel Log"
++msgstr "カーãƒãƒ«ãƒ­ã‚°"
++
++msgid "Kernel Version"
++msgstr "カーãƒãƒ«ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
++
++msgid "Key"
++msgstr "æš—å·ã‚­ãƒ¼"
++
++msgid "Key #%d"
++msgstr "キー #%d"
++
++msgid "Kill"
++msgstr "強制終了"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "L2TP サーãƒãƒ¼"
++
++msgid "LCP echo failure threshold"
++msgstr "LCP echo 失敗数ã—ãã„値"
++
++msgid "LCP echo interval"
++msgstr "LCP echo é€ä¿¡é–“éš”"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "ラベル"
++
++msgid "Language"
++msgstr "言語"
++
++msgid "Language and Style"
++msgstr "言語ã¨ã‚¹ã‚¿ã‚¤ãƒ«"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "リース有効時間"
++
++msgid "Leasefile"
++msgstr "リースファイル"
++
++msgid "Leasetime"
++msgstr "リース時間"
++
++msgid "Leasetime remaining"
++msgstr "残りリース時間"
++
++msgid "Leave empty to autodetect"
++msgstr "空欄ã®å ´åˆã€è‡ªå‹•æ¤œçŸ¥ã‚’è¡Œã„ã¾ã™"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "空欄ã®å ´åˆã€ç¾åœ¨ã®WANアドレスを使用ã—ã¾ã™"
++
++msgid "Legend:"
++msgstr "凡例:"
++
++msgid "Limit"
++msgstr "割り当ã¦æ•°"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "リンクオン"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"å•ã„åˆã‚ã›ã‚’転é€ã™ã‚‹<abbr title=\"Domain Name System\">DNS</abbr> サーãƒãƒ¼ã®"
++"リストを設定ã—ã¾ã™"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "RFC1918ã®å¿œç­”を許å¯ã™ã‚‹ãƒªã‚¹ãƒˆ"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++"指定ã—ãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’有効ã«ã—ã¾ã™ã€‚設定ã—ãªã„å ´åˆã¯ã™ã¹ã¦"
++"ã®ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãŒå¯¾è±¡ã§ã™"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "DNSクエリをå—ä¿¡ã™ã‚‹ãƒãƒ¼ãƒˆ"
++
++msgid "Load"
++msgstr "è² è·"
++
++msgid "Load Average"
++msgstr "システム平å‡è² è·"
++
++msgid "Loading"
++msgstr "ロード中"
++
++msgid "Local IPv4 address"
++msgstr "ローカル IPv4 アドレス"
++
++msgid "Local IPv6 address"
++msgstr "ローカル IPv6 アドレス"
++
++msgid "Local Startup"
++msgstr "ローカル Startup"
++
++msgid "Local Time"
++msgstr "時刻"
++
++msgid "Local domain"
++msgstr "ローカルドメイン"
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr "ローカルサーãƒãƒ¼"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr "ローカライズクエリ"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "ログ出力レベル"
++
++msgid "Log queries"
++msgstr "ログクエリー"
++
++msgid "Logging"
++msgstr "ログ"
++
++msgid "Login"
++msgstr "ログイン"
++
++msgid "Logout"
++msgstr "ログアウト"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++"ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’オフセットã¨ã—ã¦ã€æœ€å°ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã—ã¦ãã ã•ã„"
++
++msgid "MAC-Address"
++msgstr "MAC-アドレス"
++
++msgid "MAC-Address Filter"
++msgstr "MAC-アドレスフィルタ"
++
++msgid "MAC-Filter"
++msgstr "MAC-フィルタ"
++
++msgid "MAC-List"
++msgstr "MAC-リスト"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "最大レート"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "DHCPリースã®è¨±å¯ã•ã‚Œã‚‹æœ€å¤§æ•°"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "並列DNSクエリã®è¨±å¯ã•ã‚Œã‚‹æœ€å¤§æ•°"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "EDNS.0 UDP パケットサイズã®è¨±å¯ã•ã‚Œã‚‹æœ€å¤§æ•°"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "モデムãŒæº–備完了状態ã«ãªã‚‹ã¾ã§ã®æœ€å¤§å¾…ã¡æ™‚é–“"
++
++msgid "Maximum hold time"
++msgstr "最大ä¿æŒæ™‚é–“"
++
++msgid "Maximum number of leased addresses."
++msgstr "リースã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã®æœ€å¤§æ•°ã§ã™"
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "メモリー"
++
++msgid "Memory usage (%)"
++msgstr "メモリ使用率 (%)"
++
++msgid "Metric"
++msgstr "メトリック"
++
++msgid "Minimum Rate"
++msgstr "最å°ãƒ¬ãƒ¼ãƒˆ"
++
++msgid "Minimum hold time"
++msgstr "最短ä¿æŒæ™‚é–“"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "プロトコル %qã®ãƒ—ロトコル拡張ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
++
++msgid "Mode"
++msgstr "モード"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "モデムデãƒã‚¤ã‚¹"
++
++msgid "Modem init timeout"
++msgstr "モデムåˆæœŸåŒ–タイムアウト"
++
++msgid "Monitor"
++msgstr "モニター"
++
++msgid "Mount Entry"
++msgstr "マウント機能"
++
++msgid "Mount Point"
++msgstr "マウントãƒã‚¤ãƒ³ãƒˆ"
++
++msgid "Mount Points"
++msgstr "マウントãƒã‚¤ãƒ³ãƒˆ"
++
++msgid "Mount Points - Mount Entry"
++msgstr "マウントãƒã‚¤ãƒ³ãƒˆ - マウント"
++
++msgid "Mount Points - Swap Entry"
++msgstr "マウントãƒã‚¤ãƒ³ãƒˆ - スワップ"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"マウントãƒã‚¤ãƒ³ãƒˆã¯ã€è¨˜æ†¶ãƒ‡ãƒã‚¤ã‚¹ãŒãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã®ã©ã“ã«æŽ¥ç¶šã•ã‚Œã¦ã„ã‚‹ã‹ã‚’"
++"表示ã—ã¦ã„ã¾ã™ã€‚"
++
++msgid "Mount options"
++msgstr "マウントオプション"
++
++msgid "Mount point"
++msgstr "マウントãƒã‚¤ãƒ³ãƒˆ"
++
++msgid "Mounted file systems"
++msgstr "マウント中ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ "
++
++msgid "Move down"
++msgstr "下ã¸"
++
++msgid "Move up"
++msgstr "上ã¸"
++
++msgid "Multicast Rate"
++msgstr "マルãƒã‚­ãƒ£ã‚¹ãƒˆãƒ¬ãƒ¼ãƒˆ"
++
++msgid "Multicast address"
++msgstr "マルãƒã‚­ãƒ£ã‚¹ãƒˆã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "NTPサーãƒãƒ¼å€™è£œ"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "åå‰"
++
++msgid "Name of the new interface"
++msgstr "æ–°ã—ã„インターフェースã®åå‰"
++
++msgid "Name of the new network"
++msgstr "æ–°ã—ã„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®åå‰"
++
++msgid "Navigation"
++msgstr "ナビゲーション"
++
++msgid "Netmask"
++msgstr "ãƒãƒƒãƒˆãƒžã‚¹ã‚¯"
++
++msgid "Network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++msgid "Network Utilities"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£"
++
++msgid "Network boot image"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ãƒ–ート用イメージ"
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr "次 »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«ã¯DHCPサーãƒãƒ¼ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
++
++msgid "No chains in this table"
++msgstr "ãƒã‚§ã‚¤ãƒ³å†…ã«ãƒ«ãƒ¼ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“"
++
++msgid "No files found"
++msgstr "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
++
++msgid "No information available"
++msgstr "情報ãŒã‚ã‚Šã¾ã›ã‚“"
++
++msgid "No negative cache"
++msgstr "ãƒã‚¬ãƒ†ã‚£ãƒ–キャッシュを行ãªã‚ãªã„"
++
++msgid "No network configured on this device"
++msgstr "ã“ã®ãƒ‡ãƒã‚¤ã‚¹ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãŒã‚ã‚Šã¾ã›ã‚“"
++
++msgid "No network name specified"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯åãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
++
++msgid "No package lists available"
++msgstr "パッケージリストãŒã‚ã‚Šã¾ã›ã‚“"
++
++msgid "No password set!"
++msgstr "パスワードãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“!"
++
++msgid "No rules in this chain"
++msgstr "ãƒã‚§ã‚¤ãƒ³å†…ã«ãƒ«ãƒ¼ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“"
++
++msgid "No zone assigned"
++msgstr "ゾーンãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
++
++msgid "Noise"
++msgstr "ノイズ"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "ノイズ:"
++
++msgid "None"
++msgstr "ãªã—"
++
++msgid "Normal"
++msgstr "標準"
++
++msgid "Not Found"
++msgstr ""
++
++msgid "Not associated"
++msgstr "アソシエーションã•ã‚Œã¦ã„ã¾ã›ã‚“"
++
++msgid "Not connected"
++msgstr "未接続"
++
++msgid "Note: Configuration files will be erased."
++msgstr "注æ„: 設定ファイルã¯æ¶ˆåŽ»ã•ã‚Œã¾ã™ã€‚"
++
++msgid "Notice"
++msgstr "注æ„"
++
++msgid "Nslookup"
++msgstr "Nslookup"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "OPKG-設定"
++
++msgid "Off-State Delay"
++msgstr "消ç¯æ™‚é–“"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®è¨­å®šã‚’è¡Œã†ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚\"ブ"
++"リッジインターフェース\"フィールドをãƒã‚§ãƒƒã‚¯ã—ã€è¤‡æ•°ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼"
++"フェースåをスペースã§åŒºåˆ‡ã‚Šã§å…¥åŠ›ã™ã‚‹ã“ã¨ã§è¤‡æ•°ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’ブリッジ"
++"ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ã¾ãŸã€<samp>INTERFACE.VLANNR</samp>ã¨ã„ã†è¡¨è¨˜ã«ã‚ˆã‚Š<abbr "
++"title=\"Virtual Local Area Network\">VLAN</abbr>も使用ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚"
++"(<abbr title=\"for example\">例</abbr>: <samp>eth0.1</samp>)"
++
++msgid "On-State Delay"
++msgstr "点ç¯æ™‚é–“"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "1ã¤ä»¥ä¸Šã®ãƒ›ã‚¹ãƒˆåã¾ãŸã¯macアドレスを設定ã—ã¦ãã ã•ã„!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "1ã¤ä»¥ä¸Šã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ç„¡åŠ¹ãªå€¤ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ï¼"
++
++msgid "One or more required fields have no value!"
++msgstr "1ã¤ä»¥ä¸Šã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«å€¤ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼"
++
++msgid "Open list..."
++msgstr "リストを開ã"
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "変更ã•ã‚Œã‚‹ã‚ªãƒ—ション"
++
++msgid "Option removed"
++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 "Options"
++msgstr "オプション"
++
++msgid "Other:"
++msgstr "ãã®ä»–:"
++
++msgid "Out"
++msgstr "アウト"
++
++msgid "Outbound:"
++msgstr "é€ä¿¡:"
++
++msgid "Outdoor Channels"
++msgstr "屋外用周波数"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "MACアドレスを上書ãã™ã‚‹"
++
++msgid "Override MTU"
++msgstr "MTUを上書ãã™ã‚‹"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "DHCPレスãƒãƒ³ã‚¹å†…ã®ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’上書ãã™ã‚‹"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++"クライアントã¸é€šçŸ¥ã™ã‚‹ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã‚’上書ãã—ã¾ã™ã€‚通常ã¯ã€è¨­å®šã•ã‚Œã¦ã„るサブ"
++"ãƒãƒƒãƒˆã‹ã‚‰è¨ˆç®—ã•ã‚Œã¾ã™ã€‚"
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr "概è¦"
++
++msgid "Owner"
++msgstr "所有者"
++
++msgid "PAP/CHAP password"
++msgstr "PAP/CHAP パスワード"
++
++msgid "PAP/CHAP username"
++msgstr "PAP/CHAP ユーザーå"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "PPPoAカプセル化"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "libiwinfo パッケージをインストールã—ã¦ãã ã•ã„ï¼"
++
++msgid "Package lists are older than 24 hours"
++msgstr "パッケージリストã¯24時間以上å‰ã®ã‚‚ã®ã§ã™"
++
++msgid "Package name"
++msgstr "パッケージå"
++
++msgid "Packets"
++msgstr "パケット"
++
++msgid "Part of zone %q"
++msgstr "ゾーン %qã®ä¸€éƒ¨"
++
++msgid "Password"
++msgstr "パスワード"
++
++msgid "Password authentication"
++msgstr "パスワードèªè¨¼"
++
++msgid "Password of Private Key"
++msgstr "秘密éµã®ãƒ‘スワード"
++
++msgid "Password successfully changed!"
++msgstr "パスワードを変更ã—ã¾ã—ãŸ"
++
++msgid "Path to CA-Certificate"
++msgstr "CA証明書ã®ãƒ‘ス"
++
++msgid "Path to Client-Certificate"
++msgstr "クライアント証明書ã®ãƒ‘ス"
++
++msgid "Path to Private Key"
++msgstr "秘密éµã®ãƒ‘ス"
++
++msgid "Path to executable which handles the button event"
++msgstr "ボタンイベントをãƒãƒ³ãƒ‰ãƒ«ã™ã‚‹å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘ス"
++
++msgid "Peak:"
++msgstr "ピーク:"
++
++msgid "Perform reboot"
++msgstr "å†èµ·å‹•ã‚’実行"
++
++msgid "Perform reset"
++msgstr "設定リセットを実行"
++
++msgid "Phy Rate:"
++msgstr "物ç†ãƒ¬ãƒ¼ãƒˆ:"
++
++msgid "Physical Settings"
++msgstr "デãƒã‚¤ã‚¹è¨­å®š"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Pkts."
++msgstr "パケット"
++
++msgid "Please enter your username and password."
++msgstr "ユーザーåã¨ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。"
++
++msgid "Policy"
++msgstr "ãƒãƒªã‚·ãƒ¼"
++
++msgid "Port"
++msgstr "ãƒãƒ¼ãƒˆ"
++
++msgid "Port %d"
++msgstr "ãƒãƒ¼ãƒˆ %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr "ãƒãƒ¼ãƒˆ ステータス:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++"設定回数ã®LCP echo 確èªå¤±æ•—後ã€ãƒ”アノードãŒãƒ€ã‚¦ãƒ³ã—ã¦ã„ã‚‹ã‚‚ã®ã¨è¦‹ãªã—ã¾ã™ã€‚0"
++"を設定ã—ãŸå ´åˆã€å¤±æ•—ã—ã¦ã‚‚無視ã—ã¾ã™"
++
++msgid "Prevents client-to-client communication"
++msgstr "クライアントåŒå£«ã®é€šä¿¡ã‚’制é™ã—ã¾ã™"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Prism2/2.5/3 802.11b 無線LANコントローラ"
++
++msgid "Proceed"
++msgstr "続行"
++
++msgid "Processes"
++msgstr "プロセス"
++
++msgid "Prot."
++msgstr "プロトコル"
++
++msgid "Protocol"
++msgstr "プロトコル"
++
++msgid "Protocol family"
++msgstr "プロトコルファミリ"
++
++msgid "Protocol of the new interface"
++msgstr "æ–°ã—ã„インターフェースã®ãƒ—ロトコル"
++
++msgid "Protocol support is not installed"
++msgstr "プロトコルサãƒãƒ¼ãƒˆãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“"
++
++msgid "Provide NTP server"
++msgstr "NTPサーãƒãƒ¼æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹"
++
++msgid "Provide new network"
++msgstr "æ–°ã—ã„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’設定ã™ã‚‹"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "擬似アドホック (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "クオリティ"
++
++msgid "RTS/CTS Threshold"
++msgstr "RTS/CTS閾値"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr "å—信レート"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "RaLink 802.11%s 無線LANコントローラ"
++
++msgid "Radius-Accounting-Port"
++msgstr "Radiusアカウントサーãƒãƒ¼ãƒ»ãƒãƒ¼ãƒˆç•ªå·"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Radiusアカウント秘密éµ"
++
++msgid "Radius-Accounting-Server"
++msgstr "Radiusアカウントサーãƒãƒ¼"
++
++msgid "Radius-Authentication-Port"
++msgstr "Radiusèªè¨¼ã‚µãƒ¼ãƒãƒ¼ãƒ»ãƒãƒ¼ãƒˆç•ªå·"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Radiusèªè¨¼ç§˜å¯†éµ"
++
++msgid "Radius-Authentication-Server"
++msgstr "Radiusèªè¨¼ã‚µãƒ¼ãƒãƒ¼"
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>サーãƒãƒ¼ã®è¨­å®š"
++"ã¨ã—ã¦<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."
++msgstr ""
++"本当ã«ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’削除ã—ã¾ã™ã‹?一度削除ã™ã‚‹ã¨ã€å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾"
++"ã›ã‚“!\n"
++"ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’経由ã—ã¦æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããª"
++"ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚"
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++"本当ã«ã“ã®ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削除ã—ã¾ã™ã‹?一度削除ã™ã‚‹ã¨ã€å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾"
++"ã›ã‚“!\n"
++"ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’経由ã—ã¦æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã‚‹å ´"
++"åˆãŒã‚ã‚Šã¾ã™ã€‚"
++
++msgid "Really reset all changes?"
++msgstr "本当ã«å…¨ã¦ã®å¤‰æ›´ã‚’リセットã—ã¾ã™ã‹?"
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++"本当ã«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ \"%s\" ã‚’åœæ­¢ã—ã¾ã™ã‹?\n"
++"ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’経由ã—ã¦æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããª"
++"ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚"
++
++msgid "Really switch protocol?"
++msgstr "本当ã«ãƒ—ロトコルを切り替ãˆã¾ã™ã‹?"
++
++msgid "Realtime Connections"
++msgstr "リアルタイム・コãƒã‚¯ã‚·ãƒ§ãƒ³"
++
++msgid "Realtime Graphs"
++msgstr "リアルタイム・グラフ"
++
++msgid "Realtime Load"
++msgstr "リアルタイム・ロード"
++
++msgid "Realtime Traffic"
++msgstr "リアルタイム・トラフィック"
++
++msgid "Realtime Wireless"
++msgstr "リアルタイム・無線LAN"
++
++msgid "Rebind protection"
++msgstr "DNSリãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãƒ»ãƒ—ロテクション"
++
++msgid "Reboot"
++msgstr "å†èµ·å‹•"
++
++msgid "Rebooting..."
++msgstr "å†èµ·å‹•ä¸­..."
++
++msgid "Reboots the operating system of your device"
++msgstr "デãƒã‚¤ã‚¹ã®ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã‚’å†èµ·å‹•ã—ã¾ã™ã€‚"
++
++msgid "Receive"
++msgstr "å—ä¿¡"
++
++msgid "Receiver Antenna"
++msgstr "å—信アンテナ"
++
++msgid "Reconnect this interface"
++msgstr "インターフェースã®å†æŽ¥ç¶š"
++
++msgid "Reconnecting interface"
++msgstr "インターフェースå†æŽ¥ç¶šä¸­"
++
++msgid "References"
++msgstr "å‚照カウンタ"
++
++msgid "Regulatory Domain"
++msgstr "è¦åˆ¶ãƒ‰ãƒ¡ã‚¤ãƒ³"
++
++msgid "Relay"
++msgstr "リレー"
++
++msgid "Relay Bridge"
++msgstr "リレーブリッジ"
++
++msgid "Relay between networks"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯é–“ã®ãƒªãƒ¬ãƒ¼è¨­å®š"
++
++msgid "Relay bridge"
++msgstr "リレーブリッジ"
++
++msgid "Remote IPv4 address"
++msgstr "リモートIPv4アドレス"
++
++msgid "Remove"
++msgstr "削除"
++
++msgid "Repeat scan"
++msgstr "å†ã‚¹ã‚­ãƒ£ãƒ³"
++
++msgid "Replace entry"
++msgstr "エントリーã®ç½®æ›"
++
++msgid "Replace wireless configuration"
++msgstr "無線設定を置æ›ã™ã‚‹"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "DOCSIS 3.0を使用ã™ã‚‹ã„ãã¤ã‹ã®ISPã§ã¯å¿…è¦ã«ãªã‚Šã¾ã™"
++
++msgid "Reset"
++msgstr "リセット"
++
++msgid "Reset Counters"
++msgstr "カウンタã®ãƒªã‚»ãƒƒãƒˆ"
++
++msgid "Reset to defaults"
++msgstr "標準設定ã«ãƒªã‚»ãƒƒãƒˆ"
++
++msgid "Resolv and Hosts Files"
++msgstr "åå‰è§£æ±ºãŠã‚ˆã³ãƒ›ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«è¨­å®š"
++
++msgid "Resolve file"
++msgstr "リゾルãƒãƒ•ã‚¡ã‚¤ãƒ«"
++
++msgid "Restart"
++msgstr "å†èµ·å‹•"
++
++msgid "Restart Firewall"
++msgstr "ファイアウォールã®å†èµ·å‹•"
++
++msgid "Restore backup"
++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©å…ƒã™ã‚‹"
++
++msgid "Reveal/hide password"
++msgstr "パスワードを表示ã™ã‚‹/éš ã™"
++
++msgid "Revert"
++msgstr "å…ƒã«æˆ»ã™"
++
++msgid "Root"
++msgstr "ルート"
++
++msgid "Root directory for files served via TFTP"
++msgstr "TFTP経由ã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å–り扱ã†éš›ã®ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "ルーター・パスワード"
++
++msgid "Routes"
++msgstr "経路情報"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"特定ã®ãƒ›ã‚¹ãƒˆåˆã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ã€ã©ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹åŠã³ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã‚’通ã—ã¦"
++"通信を行ã†ã‹ã€çµŒè·¯æƒ…報を設定ã—ã¾ã™ã€‚"
++
++msgid "Rule #"
++msgstr "ルール #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr "デãƒã‚¤ã‚¹ã®ãƒžã‚¦ãƒ³ãƒˆã‚’è¡Œã†å‰ã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†"
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr "SSHアクセス"
++
++msgid "SSH-Keys"
++msgstr "SSHキー"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "ä¿å­˜"
++
++msgid "Save & Apply"
++msgstr "ä¿å­˜ & é©ç”¨"
++
++msgid "Save &#38; Apply"
++msgstr "ä¿å­˜ &#38; é©ç”¨"
++
++msgid "Scan"
++msgstr "スキャン"
++
++msgid "Scheduled Tasks"
++msgstr "スケジュールタスク"
++
++msgid "Section added"
++msgstr "追加ã•ã‚Œã‚‹ã‚»ã‚¯ã‚·ãƒ§ãƒ³"
++
++msgid "Section removed"
++msgstr "削除ã•ã‚Œã‚‹ã‚»ã‚¯ã‚·ãƒ§ãƒ³"
++
++msgid "See \"mount\" manpage for details"
++msgstr "詳細情報㯠\"mount\" ã®manページをå‚ç…§ã—ã¦ãã ã•ã„"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++"設定ã•ã‚ŒãŸç§’é–“éš”ã§LCP echoリクエストをé€ä¿¡ã—ã¾ã™ã€‚失敗数ã—ãã„値を設定ã—ãŸå ´"
++"åˆã®ã¿ã€æ©Ÿèƒ½ãŒæœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚"
++
++msgid "Separate Clients"
++msgstr "クライアントã®åˆ†é›¢"
++
++msgid "Separate WDS"
++msgstr "WDSを分離ã™ã‚‹"
++
++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 "サービスå"
++
++msgid "Service Type"
++msgstr "サービスタイプ"
++
++msgid "Services"
++msgstr "サービス"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "時刻設定"
++
++msgid "Setup DHCP Server"
++msgstr "DHCPサーãƒãƒ¼ã‚’設定"
++
++msgid "Show current backup file list"
++msgstr "ç¾åœ¨ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ファイルã®ãƒªã‚¹ãƒˆã‚’表示ã™ã‚‹"
++
++msgid "Shutdown this interface"
++msgstr "インターフェースを終了"
++
++msgid "Shutdown this network"
++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’終了"
++
++msgid "Signal"
++msgstr "ä¿¡å·å¼·åº¦"
++
++msgid "Signal:"
++msgstr "ä¿¡å·:"
++
++msgid "Size"
++msgstr "サイズ"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "スキップ"
++
++msgid "Skip to content"
++msgstr "コンテンツã¸ç§»å‹•"
++
++msgid "Skip to navigation"
++msgstr "ナビゲーションã¸ç§»å‹•"
++
++msgid "Slot time"
++msgstr "スロット時間"
++
++msgid "Software"
++msgstr "ソフトウェア"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "無効ãªå€¤ãŒè¨­å®šã•ã‚Œã¦ã„るフィールドãŒã‚ã‚‹ãŸã‚ã€ä¿å­˜ã§ãã¾ã›ã‚“。"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "申ã—訳ã‚ã‚Šã¾ã›ã‚“。リクエストã•ã‚ŒãŸã‚ªãƒ–ジェクトã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "申ã—訳ã‚ã‚Šã¾ã›ã‚“。サーãƒãƒ¼ã«äºˆæœŸã›ã¬ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"申ã—訳ã‚ã‚Šã¾ã›ã‚“。ç¾åœ¨ã“ã®ãƒœãƒ¼ãƒ‰ã§ã¯sysupgradeãŒã‚µãƒãƒ¼ãƒˆãŒã•ã‚Œã¦ã„ãªã„ãŸã‚ã€"
++"ファームウェア更新ã¯æ‰‹å‹•ã§è¡Œã£ã¦ã„ãŸã ãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚OpenWrt wikiã‚’å‚ç…§ã—"
++"ã¦ã€ã“ã®ãƒ‡ãƒã‚¤ã‚¹ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ‰‹é †ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
++
++msgid "Sort"
++msgstr "ソート"
++
++msgid "Source"
++msgstr "é€ä¿¡å…ƒ"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr "デãƒã‚¤ã‚¹ãŒæŽ¥ç¶šã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’設定ã—ã¾ã™"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "<em>Dropbear</em>ã®å—ä¿¡ãƒãƒ¼ãƒˆã‚’設定ã—ã¦ãã ã•ã„"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr "æš—å·éµã‚’設定ã—ã¾ã™ã€‚"
++
++msgid "Start"
++msgstr "開始"
++
++msgid "Start priority"
++msgstr "優先順ä½"
++
++msgid "Startup"
++msgstr "Startup"
++
++msgid "Static IPv4 Routes"
++msgstr "IPv4 é™çš„ルーティング"
++
++msgid "Static IPv6 Routes"
++msgstr "IPv6 é™çš„ルーティング"
++
++msgid "Static Leases"
++msgstr "é™çš„リース"
++
++msgid "Static Routes"
++msgstr "é™çš„ルーティング"
++
++msgid "Static WDS"
++msgstr "é™çš„WDS"
++
++msgid "Static address"
++msgstr "é™çš„アドレス"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"é™çš„リース機能ã¯ã€DHCPクライアントã«å¯¾ã—ã¦å›ºå®šã®IPアドレスåŠã³ä¸€æ™‚çš„ãªãƒ›ã‚¹ãƒˆ"
++"åをアサインã—ã¾ã™ã€‚ã¾ãŸã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯å¯¾å¿œã™ã‚‹ãƒªãƒ¼ã‚¹ã‚’使用ã™ã‚‹ãƒ›ã‚¹ãƒˆãŒãã®1"
++"å°ã®ã¿ã§ã€ã‹ã¤é™çš„ãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹è¨­å®šã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
++
++msgid "Status"
++msgstr "ステータス"
++
++msgid "Stop"
++msgstr "åœæ­¢"
++
++msgid "Strict order"
++msgstr "å•ã„åˆã‚ã›ã®åˆ¶é™"
++
++msgid "Submit"
++msgstr "é€ä¿¡"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "スワップ機能"
++
++msgid "Switch"
++msgstr "スイッãƒ"
++
++msgid "Switch %q"
++msgstr "スイッム%q"
++
++msgid "Switch %q (%s)"
++msgstr "スイッム%q (%s)"
++
++msgid "Switch protocol"
++msgstr "プロトコルã®åˆ‡ã‚Šæ›¿ãˆ"
++
++msgid "Sync with browser"
++msgstr "ブラウザã®æ™‚刻ã¨åŒæœŸ"
++
++msgid "Synchronizing..."
++msgstr "åŒæœŸä¸­..."
++
++msgid "System"
++msgstr "システム"
++
++msgid "System Log"
++msgstr "システムログ"
++
++msgid "System Properties"
++msgstr "システム・プロパティ"
++
++msgid "System log buffer size"
++msgstr "システムログ・ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚º"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "TFTP設定"
++
++msgid "TFTP server root"
++msgstr "TFTPサーãƒãƒ¼ãƒ»ãƒ«ãƒ¼ãƒˆ"
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr "é€ä¿¡ãƒ¬ãƒ¼ãƒˆ"
++
++msgid "Table"
++msgstr "テーブル"
++
++msgid "Target"
++msgstr "ターゲット"
++
++msgid "Terminate"
++msgstr "åœæ­¢"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"<em>デãƒã‚¤ã‚¹è¨­å®š</em>セクションã§ã¯ã€ãƒãƒ£ãƒãƒ«ã€é€ä¿¡å‡ºåŠ›ã€ã‚¢ãƒ³ãƒ†ãƒŠè¨­å®šãªã©ã®ç„¡"
++"ç·šãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®è¨­å®šã‚’è¡Œã„ã¾ã™ã€‚ã¾ãŸã€ç„¡ç·šãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒãƒžãƒ«ãƒSSID機能をサ"
++"ãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹å ´åˆã€ã“れらã®è¨­å®šã¯å…¨ã¦å…±é€šã®è¨­å®šã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚æš—å·åŒ–設定"
++"や無線モードãªã©ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ¯Žã®è¨­å®šã¯ã€<em>インターフェース設定</em>ã§è¨­å®š"
++"ã‚’è¡Œã„ã¾ã™ã€‚"
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"<em>libiwinfo-lua</em> パッケージãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“。無線設定機能を"
++"æ­£ã—ã動作ã•ã›ã‚‹ãŸã‚ã«ã€ã“ã®ãƒ‘ッケージをインストールã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++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>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"デãƒã‚¤ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯ãƒ‘ーティション(<abbr title=\"for example\">例</abbr> "
++"<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 ""
++"記憶領域をフォーマットã—ã¦ã„るファイルシステムを指定ã—ã¾ã™ã€‚(<abbr title="
++"\"for example\">例</abbr> <samp><abbr title=\"Third Extended Filesystem"
++"\">ext3</abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"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 "以下ã®å¤‰æ›´ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸ"
++
++msgid "The following changes have been reverted"
++msgstr "以下ã®å¤‰æ›´ãŒå–り消ã•ã‚Œã¾ã—ãŸ"
++
++msgid "The following rules are currently active on this system."
++msgstr "ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ã€ç¾åœ¨ä»¥ä¸‹ã®ãƒ«ãƒ¼ãƒ«ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚"
++
++msgid "The given network name is not unique"
++msgstr "設定ã•ã‚ŒãŸãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯åã¯ãƒ¦ãƒ‹ãƒ¼ã‚¯ãªã‚‚ã®ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"ã“ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã¯ãƒžãƒ«ãƒESSIDを設定ã™ã‚‹ã“ã¨ãŒã§ããªã„ãŸã‚ã€ç¶šè¡Œã—ãŸå ´åˆã€è¨­"
++"定ã¯æ—¢å­˜ã®è¨­å®šã¨ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚"
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr "é¸æŠžä¸­ã®ãƒ—ロトコルを使用ã™ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã‚’設定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr "システムã¯è¨­å®šé ˜åŸŸã‚’消去中ã§ã™ã€‚完了後ã€è‡ªå‹•çš„ã«å†èµ·å‹•ã—ã¾ã™ã€‚"
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"システム更新中ã§ã™ã€‚<br />絶対ã«é›»æºã‚’切らãªã„ã§ãã ã•ã„ï¼<br />ルーターã®å†"
++"接続ã¾ã§æ•°åˆ†ãŠå¾…ã¡ä¸‹ã•ã„。システムãŒæ›´æ–°ã•ã‚Œã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ãƒ«ãƒ¼ã‚¿ãƒ¼ã®è¨­å®šãŒå¤‰"
++"ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€å†æŽ¥ç¶šæ™‚ã«ã‚ãªãŸã®ã‚³ãƒ³ãƒ”ュータã®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."
++msgstr ""
++"アップロードã•ã‚ŒãŸã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ã“ã®ãƒœãƒ¼ãƒ‰ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„るフォー"
++"マットã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã“ã®ãƒ—ラットフォームã«é©åˆã—ãŸã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã©ã†"
++"ã‹ã€ç¢ºèªã—ã¦ãã ã•ã„。"
++
++msgid "There are no active leases."
++msgstr "リース中ã®IPアドレスã¯ã‚ã‚Šã¾ã›ã‚“。"
++
++msgid "There are no pending changes to apply!"
++msgstr "é©ç”¨ãŒæœªå®Œäº†ã®å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“ï¼"
++
++msgid "There are no pending changes to revert!"
++msgstr "復元ãŒæœªå®Œäº†ã®å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“ï¼"
++
++msgid "There are no pending changes!"
++msgstr "未完了ã®å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“ï¼"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"デãƒã‚¤ã‚¹ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。\"デãƒã‚¤ã‚¹è¨­å®š\"タブã§ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ‡ãƒã‚¤ã‚¹ã‚’"
++"é¸æŠžã—ã¦ãã ã•ã„。"
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"ルーターã«ãƒ‘スワードãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。Webインターフェースã®ä¿è­·åŠã³SSH"
++"サービスを有効ã«ã™ã‚‹ãŸã‚ã«ã€ç®¡ç†è€…パスワードを設定ã—ã¦ãã ã•ã„。"
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"以下ã¯ã€sysupgrade中ã«ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—対象ã«å«ã‚るファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘ター"
++"ンリストã§ã™ã€‚/etc/config/内ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«åŠã³ãã®ä»–特定ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã¯è‡ªå‹•"
++"çš„ã«ä¿æŒã•ã‚Œã¾ã™ã€‚"
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"/etc/rc.localを表示ã—ã¦ã„ã¾ã™ã€‚ã‚ãªãŸã®å®Ÿè¡Œã—ãŸã„コマンドを'exit 0'行より上ã«"
++"入力ã—ã¦ãã ã•ã„。ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ãƒ–ートプロセスã®æœ€å¾Œã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚"
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++"プロãƒã‚¤ãƒ€ã‹ã‚‰ã‚¢ã‚µã‚¤ãƒ³ã•ã‚ŒãŸã€ãƒ­ãƒ¼ã‚«ãƒ«ã®ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆãƒ»ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™ã€‚通常ã€"
++"<code>:2</code>ãŒçµ‚端ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ã¿ã® <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr>ã¨ã—ã¦ä½¿ç”¨ã™ã‚‹"
++
++msgid "This is the plain username for logging into the account"
++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 ""
++"スケジュールタスクシステムを使用ã™ã‚‹ã“ã¨ã§ã€å®šæœŸçš„ã«ç‰¹å®šã®ã‚¿ã‚¹ã‚¯ã®å®Ÿè¡Œã‚’è¡Œã†"
++"ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚"
++
++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 allows the configuration of custom button actions"
++msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€ãƒœã‚¿ãƒ³ã®å‹•ä½œã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€ç¾åœ¨ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’表示ã—ã¾ã™ã€‚"
++
++msgid "This section contains no values yet"
++msgstr "ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¯æœªè¨­å®šã§ã™ã€‚"
++
++msgid "Time Synchronization"
++msgstr "時刻設定"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "時刻åŒæœŸæ©Ÿèƒ½ã¯ã¾ã è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
++
++msgid "Timezone"
++msgstr "タイムゾーン"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"設定を復元ã™ã‚‹ã«ã¯ã€ä½œæˆã—ã¦ãŠã„ãŸãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—アーカイブをアップロードã—ã¦ã"
++"ã ã•ã„。"
++
++msgid "Total Available"
++msgstr "åˆè¨ˆ"
++
++msgid "Traceroute"
++msgstr "Traceroute"
++
++msgid "Traffic"
++msgstr "トラフィック"
++
++msgid "Transfer"
++msgstr "転é€"
++
++msgid "Transmission Rate"
++msgstr "転é€ãƒ¬ãƒ¼ãƒˆ"
++
++msgid "Transmit"
++msgstr "é€ä¿¡"
++
++msgid "Transmit Power"
++msgstr "電波出力"
++
++msgid "Transmitter Antenna"
++msgstr "é€ä¿¡ã‚¢ãƒ³ãƒ†ãƒŠ"
++
++msgid "Trigger"
++msgstr "トリガー"
++
++msgid "Trigger Mode"
++msgstr "トリガーモード"
++
++msgid "Tunnel ID"
++msgstr "トンãƒãƒ« ID"
++
++msgid "Tunnel Interface"
++msgstr "トンãƒãƒ«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "ターボモード"
++
++msgid "Tx-Power"
++msgstr "é€ä¿¡é›»åŠ›"
++
++msgid "Type"
++msgstr "タイプ"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "UMTSã®ã¿"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "USBデãƒã‚¤ã‚¹"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr "ä¸æ˜Ž"
++
++msgid "Unknown Error, password not changed!"
++msgstr "ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ã§ã™ã€‚パスワードã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼"
++
++msgid "Unmanaged"
++msgstr "Unmanaged"
++
++msgid "Unsaved Changes"
++msgstr "ä¿å­˜ã•ã‚Œã¦ã„ãªã„変更"
++
++msgid "Unsupported protocol type."
++msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„プロトコルタイプ"
++
++msgid "Update lists"
++msgstr "リストã®æ›´æ–°"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"システムをアップデートã™ã‚‹å ´åˆã€sysupgrade機能ã«äº’æ›æ€§ã®ã‚るファームウェアイ"
++"メージをアップロードã—ã¦ãã ã•ã„。\"設定ã®ä¿æŒ\"を有効ã«ã™ã‚‹ã¨ã€ç¾åœ¨ã®è¨­å®šã‚’"
++"維æŒã—ã¦ã‚¢ãƒƒãƒ—デートを行ã„ã¾ã™ã€‚ãŸã ã—ã€OpenWrt互æ›ã®ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒ"
++"アップロードã•ã‚ŒãŸå ´åˆã®ã¿ã€è¨­å®šã¯ä¿æŒã•ã‚Œã¾ã™ã€‚"
++
++msgid "Upload archive..."
++msgstr "アーカイブをアップロード"
++
++msgid "Uploaded File"
++msgstr "アップロード完了"
++
++msgid "Uptime"
++msgstr "起動時間"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "<code>/etc/ethers</code> を使用ã™ã‚‹"
++
++msgid "Use DHCP gateway"
++msgstr "DHCPゲートウェイを使用ã™ã‚‹"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "ピアã‹ã‚‰é€šçŸ¥ã•ã‚ŒãŸDNSサーãƒãƒ¼ã‚’使用ã™ã‚‹"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "ISO/IEC 3166 alpha2ã®å›½ã‚³ãƒ¼ãƒ‰ã‚’使用ã—ã¾ã™ã€‚"
++
++msgid "Use MTU on tunnel interface"
++msgstr "トンãƒãƒ«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®MTUを設定"
++
++msgid "Use TTL on tunnel interface"
++msgstr "トンãƒãƒ«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®TTLを設定"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "ブロードキャスト・フラグを使用ã™ã‚‹"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "DNSサーãƒãƒ¼ã‚’手動ã§è¨­å®š"
++
++msgid "Use default gateway"
++msgstr "デフォルトゲートウェイを使用ã™ã‚‹"
++
++msgid "Use gateway metric"
++msgstr "ゲートウェイ・メトリックを使用ã™ã‚‹"
++
++msgid "Use routing table"
++msgstr ""
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"<em>追加</em> ボタンを押ã—ã¦ã€æ–°ã—ãエントリーを作æˆã—ã¦ãã ã•ã„。<em>MAC-ã‚¢"
++"ドレス</em> ã¯ãã®ãƒ›ã‚¹ãƒˆã‚’識別ã—, <em>IPv4-アドレス</em> ã«ã¯æ‰•ã„ã ã™å›ºå®šã®ã‚¢"
++"ドレスを設定ã—ã¾ã™ã€‚ã¾ãŸã€<em>ホストå</em> ã¯ãã®ãƒ›ã‚¹ãƒˆã«å¯¾ã—ã¦ä¸€æ™‚çš„ãªãƒ›ã‚¹"
++"トåをアサインã—ã¾ã™ã€‚"
++
++msgid "Used"
++msgstr "使用"
++
++msgid "Used Key Slot"
++msgstr "使用ã™ã‚‹ã‚­ãƒ¼ã‚¹ãƒ­ãƒƒãƒˆ"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "ユーザーå"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "VLANインターフェース"
++
++msgid "VLANs on %q"
++msgstr "%q上ã®VLANs"
++
++msgid "VLANs on %q (%s)"
++msgstr "%q上ã®VLAN (%s)"
++
++msgid "VPN Server"
++msgstr "VPN サーãƒãƒ¼"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr "DHCPリクエストé€ä¿¡æ™‚ã®ãƒ™ãƒ³ãƒ€ãƒ¼ã‚¯ãƒ©ã‚¹ã‚’設定"
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr "確èª"
++
++msgid "Version"
++msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "WEP オープンシステム"
++
++msgid "WEP Shared Key"
++msgstr "WEP 共有キー"
++
++msgid "WEP passphrase"
++msgstr "WEP æš—å·ãƒ•ãƒ¬ãƒ¼ã‚º"
++
++msgid "WMM Mode"
++msgstr "WMM モード"
++
++msgid "WPA passphrase"
++msgstr "WPA æš—å·ãƒ•ãƒ¬ãƒ¼ã‚º"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++msgstr ""
++"WPAæš—å·åŒ–を使用ã™ã‚‹å ´åˆã€wpa_supplicant (クライアントモードã®å ´åˆ)åˆã¯ "
++"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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "警告"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "ç„¡ç·šLAN"
++
++msgid "Wireless"
++msgstr "ç„¡ç·š"
++
++msgid "Wireless Adapter"
++msgstr "無線アダプタ"
++
++msgid "Wireless Network"
++msgstr "ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++msgid "Wireless Overview"
++msgstr "ç„¡ç·šLANデãƒã‚¤ã‚¹ä¸€è¦§"
++
++msgid "Wireless Security"
++msgstr "無線LANセキュリティ"
++
++msgid "Wireless is disabled or not associated"
++msgstr "ç„¡ç·šLAN機能ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã‚‹ã‹ã€ã‚¢ã‚½ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã•ã‚Œã¦ã„ã¾ã›ã‚“"
++
++msgid "Wireless is restarting..."
++msgstr "ç„¡ç·šLAN機能å†èµ·å‹•ä¸­..."
++
++msgid "Wireless network is disabled"
++msgstr "ç„¡ç·šLAN機能ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™"
++
++msgid "Wireless network is enabled"
++msgstr "ç„¡ç·šLAN機能ã¯æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™"
++
++msgid "Wireless restarted"
++msgstr "ç„¡ç·šLAN機能ã®å†èµ·å‹•"
++
++msgid "Wireless shut down"
++msgstr "ç„¡ç·šLAN機能åœæ­¢"
++
++msgid "Write received DNS requests to syslog"
++msgstr "å—ä¿¡ã—ãŸDNSリクエストをsyslogã¸è¨˜éŒ²ã—ã¾ã™"
++
++msgid "XR Support"
++msgstr "XRサãƒãƒ¼ãƒˆ"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"ルーターãŒèµ·å‹•ã™ã‚‹éš›ã®ã‚µãƒ¼ãƒ“スã®æœ‰åŠ¹åŒ–/無効化を行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ã¾ãŸã€å¤‰æ›´"
++"ã¯å†èµ·å‹•å¾Œã«é©ç”¨ã•ã‚Œã¾ã™ã€‚<br /><strong>警告: \"network\"ã®ã‚ˆã†ãªé‡è¦ãªã‚µãƒ¼ãƒ“"
++"スを無効ã«ã™ã‚‹ã¨, ルーターã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã‚Šã¾ã™ã®ã§ã€æ³¨æ„ã—ã¦ãã ã•ã„。"
++"</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr "Java Scriptを有効ã«ã—ãªã„å ´åˆã€LuCIã¯æ­£ã—ã動作ã—ã¾ã›ã‚“。"
++
++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 ""
++
++msgid "any"
++msgstr "å…¨ã¦"
++
++msgid "auto"
++msgstr "自動"
++
++#, fuzzy
++msgid "automatic"
++msgstr "static"
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "ブリッジ"
++
++msgid "create:"
++msgstr "作æˆ:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "指定ã—ãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ãƒ–リッジを作æˆã—ã¾ã™"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "無効"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "期é™åˆ‡ã‚Œ"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>リース情報を記"
++"録ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«"
++
++msgid "forward"
++msgstr ""
++
++msgid "full-duplex"
++msgstr "全二é‡"
++
++msgid "half-duplex"
++msgstr "åŠäºŒé‡"
++
++msgid "help"
++msgstr "ヘルプ"
++
++msgid "hidden"
++msgstr ""
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "ターゲットãŒãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®å ´åˆ"
++
++msgid "input"
++msgstr ""
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "ã„ã„ãˆ"
++
++msgid "no link"
++msgstr "リンクãªã—"
++
++msgid "none"
++msgstr "ãªã—"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "オフ"
++
++msgid "on"
++msgstr "オン"
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "routed"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "tagged"
++
++msgid "unknown"
++msgstr ""
++
++msgid "unlimited"
++msgstr "無期é™"
++
++msgid "unspecified"
++msgstr "設定ã—ãªã„"
++
++msgid "unspecified -or- create:"
++msgstr "設定ã—ãªã„ -åˆã¯- 作æˆ:"
++
++msgid "untagged"
++msgstr "untagged"
++
++msgid "yes"
++msgstr "ã¯ã„"
++
++msgid "« Back"
++msgstr "« 戻る"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "PPPリンクã®IPv6ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚’有効ã«ã™ã‚‹"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "ホストファイルを無視ã™ã‚‹"
++
++#~ msgid "Path"
++#~ msgstr "パス"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„: å†èµ·å‹•ä¸­ã§ã™..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr "警告: ä¿å­˜ã•ã‚Œã¦ã„ãªã„変更ã¯å†èµ·å‹•å¾Œã«å¤±ã‚ã‚Œã¾ã™!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "第2ãƒãƒ£ãƒãƒ«ãŒé‡è¤‡ã—ã¦ã‚‚ã€å¸¸ã«40MHz帯域幅を使用ã—ã¾ã™ã€‚ãŸã ã—本オプションã¯"
++#~ "IEEE 802.11n-2009を満ãŸã—ã¦ã„ã¾ã›ã‚“!"
++
++#~ msgid "Cached"
++#~ msgstr "キャッシュ"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr "ã“ã®ãƒžã‚¦ãƒ³ãƒˆè¨­å®šã‚’block-extrootã®ã‚ªãƒ¼ãƒãƒ¼ãƒ¬ã‚¤è¨˜æ†¶é ˜åŸŸã¨ã—ã¦è¨­å®šã™ã‚‹"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "強制的ã«40MHzモードã§å‹•ä½œã™ã‚‹"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "周波数ホッピング"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "%sãŒä½¿ç”¨ã—ã¦ã„ã‚‹ãŸã‚ãƒãƒ£ãƒãƒ«%dã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "ルート・ファイルシステムã¨ã—ã¦ä½¿ç”¨ã™ã‚‹"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "HE.net ユーザーID"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr ""
++#~ "ログインåã§ã¯ãªãã€32ãƒã‚¤ãƒˆã€16進数ã§ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼IDを設定ã—ã¦"
++#~ "ãã ã•ã„"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz 上å´ç¬¬2ãƒãƒ£ãƒãƒ«"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz 下å´ç¬¬2ãƒãƒ£ãƒãƒ«"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "ルーター広告ã®å—信を許å¯ã™ã‚‹"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã®ã«IPv6 アドレスを広告ã™ã‚‹"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯IDを広告ã™ã‚‹"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "設定å¯èƒ½ãªç¯„囲ã¯1ã‹ã‚‰65535ã§ã™"
++
++#~ msgid "HT capabilities"
++#~ msgstr "HT機能"
++
++#~ msgid "HT mode"
++#~ msgstr "HTモード"
++
++#~ msgid "Router Model"
++#~ msgstr "ルーターモデル"
++
++#~ msgid "Router Name"
++#~ msgstr "ルーターå"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "ルータè¦è«‹ã‚’é€ä¿¡ã™ã‚‹"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr "通知ã™ã‚‹æŽ¨å¥¨æœ‰åŠ¹æ™‚間を設定ã—ã¦ãã ã•ã„。(秒å˜ä½)"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr "通知ã™ã‚‹æœ€çµ‚有効時間を設定ã—ã¦ãã ã•ã„。(秒å˜ä½)"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "推奨有効時間"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "最終有効時間"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "ルーターã«æŽ¥ç¶šä¸­..."
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "内蔵ã®NTPサーãƒãƒ¼ã‚’有効ã«ã™ã‚‹"
++
++#~ msgid "Active Leases"
++#~ msgstr "有効ãªãƒªãƒ¼ã‚¹"
++
++#~ msgid "Open"
++#~ msgstr "é–‹ã"
++
++#~ msgid "KB"
++#~ msgstr "キロãƒã‚¤ãƒˆ"
++
++#~ msgid "Bit Rate"
++#~ msgstr "ビットレート"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "設定 / é©ç”¨"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "設定 / 変更箇所"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "設定 / 変更箇所ã®å¾©å…ƒ"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MAC Address"
++#~ msgstr "MACアドレス"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Encrypted\">æš—å·åŒ–</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-スキャン"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "ã“ã®ç„¡ç·šã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’接続ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’é¸æŠžã—ã¦ãã ã•ã„。<em>設定"
++#~ "ã—ãªã„</em>ã‚’é¸æŠžã™ã‚‹ã¨ã€è¨­å®šæ¸ˆã¿ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削除ã—ã¾ã™ã€‚ã¾ãŸã€<em>作"
++#~ "æˆ</em>フィールドã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯åを入力ã™ã‚‹ã¨ã€æ–°ã—ããƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’設定ã—"
++#~ "ã¾ã™ã€‚"
++
++#~ msgid "Create Network"
++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ä½œæˆ"
++
++#~ msgid "Link"
++#~ msgstr "リンク"
++
++#~ msgid "Networks"
++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++#~ msgid "Power"
++#~ msgstr "出力"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "ローカル環境内ã®ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>表記: アドレス/"
++#~ "プレフィクス"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-サーãƒãƒ¼"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr ""
++#~ "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-ブロードキャスト"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-アドレス"
++
++#~ msgid "IP-Aliases"
++#~ msgstr "IPエイリアス"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "IPv6設定"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "注æ„: ä»–ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«å±žã™ã‚‹ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’指定ã—ãŸå ´åˆ, é¸æŠžã—ãŸãƒãƒƒ"
++#~ "トワークã¸ç§»å‹•ã—ã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might "
++#~ "lose access to this router if you are connected via this interface."
++#~ msgstr ""
++#~ "本当ã«ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’削除ã—ã¾ã™ã‹? 削除ã™ã‚‹ã¨å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›"
++#~ "ã‚“!\\nã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’介ã—ã¦ãƒ«ãƒ¼ã‚¿ãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã‚‹å ´åˆã€ãƒ«ãƒ¼ã‚¿ãƒ¼"
++#~ "ã«æŽ¥ç¶šã§ããªããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou "
++#~ "might lose access to this router if you are connected via this network."
++#~ msgstr ""
++#~ "本当ã«ã“ã®ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ 削除ã™ã‚‹ã¨å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾"
++#~ "ã›ã‚“!\\nã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’介ã—ã¦ãƒ«ãƒ¼ã‚¿ãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã‚‹å ´åˆã€ãƒ«ãƒ¼ã‚¿ãƒ¼ã«"
++#~ "接続ã§ããªããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router "
++#~ "if you are connected via this interface."
++#~ msgstr ""
++#~ "本当ã«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ \"%s\" を削除ã—ã¾ã™ã‹?\\nã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’介ã—"
++#~ "ã¦ãƒ«ãƒ¼ã‚¿ãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã‚‹å ´åˆã€ãƒ«ãƒ¼ã‚¿ãƒ¼ã«æŽ¥ç¶šã§ããªããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾"
++#~ "ã™ã€‚"
++
++#~ msgid ""
++#~ "Really shutdown network ?\\nYou might lose access to this router if you "
++#~ "are connected via this interface."
++#~ msgstr ""
++#~ "本当ã«ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’終了ã—ã¾ã™ã‹?\\nã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’介ã—ã¦ãƒ«ãƒ¼"
++#~ "ターã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã‚‹å ´åˆã€æŽ¥ç¶šã§ããªããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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>s を組"
++#~ "ã¿åˆã‚ã›ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚<abbr title=\"Virtual Local Area Network"
++#~ "\">VLAN</abbr> ã¯ç•°ãªã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã«åˆ¥ã‘ã‚‹éš›ã«ã‚ˆã使ã‚ã‚Œã¾ã™ã€‚"
++#~ "例ãˆã°ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®1ã¤ã‚’インターãƒãƒƒãƒˆã®ç”¨ãªå¤§ããªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ç‚ºã®ã‚¢ãƒƒãƒ—"
++#~ "リンクãƒãƒ¼ãƒˆæŽ¥ç¶šã«ä½¿ç”¨ã—ã€ãã®ä»–ã®ãƒãƒ¼ãƒˆã‚’ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ä½¿ç”¨ã—ã¾"
++#~ "ã™ã€‚"
++
++#~ msgid "Enable buffering"
++#~ msgstr "ãƒãƒƒãƒ•ã‚¡ãƒªãƒ³ã‚°ã‚’有効ã«ã™ã‚‹"
++
++#~ msgid "IPv6-over-IPv4"
++#~ msgstr "IPv6-over-IPv4"
++
++#~ msgid "Custom Files"
++#~ msgstr "手動ã§æŒ‡å®šã—ãŸãƒ•ã‚¡ã‚¤ãƒ«"
++
++#~ msgid "Custom files"
++#~ msgstr "手動指定ファイル"
++
++#~ msgid "Detected Files"
++#~ msgstr "検出ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«"
++
++#~ msgid "Detected files"
++#~ msgstr "検出ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«"
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "æ–°ã—ã„ファームウェアを書ã込んã æ™‚ã«ç¶­æŒã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«"
++
++#~ msgid "General"
++#~ msgstr "一般"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯<abbr title=\"Lua Configuration Interface\">LuCI</abbr> ã®æ©Ÿ"
++#~ "能ã¨è¨­å®šã‚’カスタマイズ出æ¥ã¾ã™ã€‚"
++
++#~ msgid "Post-commit actions"
++#~ msgstr "Post-commit actions"
++
++#~ msgid ""
++#~ "The following files are detected by the system and will be kept "
++#~ "automatically during sysupgrade"
++#~ msgstr ""
++#~ "以下ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã£ã¦æ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚ã“れらã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ãƒ•ã‚¡ãƒ¼ãƒ "
++#~ "ウェア更新時ã«è‡ªå‹•çš„ã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã‚³ãƒŸãƒƒãƒˆã•ã‚ŒãŸ <abbr title=\"Unified Configuration "
++#~ "Interface\">UCI</abbr>設定ã®å¤‰æ›´ã‚’å³åº§ã«é©å¿œã™ã‚‹ç‚ºã«ã€è‡ªå‹•çš„ã«å®Ÿè¡Œã•ã‚Œã¾"
++#~ "ã™ã€‚"
++
++#~ msgid ""
++#~ "This is a list of shell glob patterns for matching files and directories "
++#~ "to include during sysupgrade"
++#~ msgstr ""
++#~ "This is a list of shell glob patterns for matching files and directories "
++#~ "to include during sysupgrade"
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Web <abbr title=\"User Interface\">UI</abbr>"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr "<abbr title=\"Hypertext Transfer Protocol\">PPTP</abbr>-サーãƒãƒ¼"
++
++#~ msgid "AHCP Settings"
++#~ msgstr "AHCP 設定"
++
++#~ msgid "ARP ping retries"
++#~ msgstr "ARP pingリトライ"
++
++#~ msgid "ATM Settings"
++#~ msgstr "ATM設定"
++
++#~ msgid "Accept Router Advertisements"
++#~ msgstr "ルーターアドãƒã‚¿ã‚¤ã‚ºã‚’許å¯ã™ã‚‹"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "アクセスãƒã‚¤ãƒ³ãƒˆ (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "pppd 追加オプション"
++
++#~ msgid "Allowed range is 1 to FFFF"
++#~ msgstr "1ã‹ã‚‰FFFFã¾ã§ä½¿ç”¨å¯èƒ½ã§ã™ã€‚"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "自動切断"
++
++#~ msgid "Backup Archive"
++#~ msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—アーカイブ"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "ローカルDNSサーãƒãƒ¼ã«PPP接続先ã‹ã‚‰é€šçŸ¥ã•ã‚ŒãŸãƒãƒ¼ãƒ ã‚µãƒ¼ãƒãƒ¼ã‚’使用ã™ã‚‹ã‚ˆã†ã«"
++#~ "設定ã—ã¾ã™"
++
++#~ msgid "Connect script"
++#~ msgstr "接続スクリプト"
++
++#~ msgid "Create backup"
++#~ msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ä½œæˆ"
++
++#~ msgid "Default"
++#~ msgstr "標準"
++
++#~ msgid "Disconnect script"
++#~ msgstr "切断スクリプト"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "パッケージリストã¨ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®ç·¨é›†"
++
++#~ msgid "Enable 4K VLANs"
++#~ msgstr "4K VLANを有効ã«ã™ã‚‹"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "IPv6ã®PPPリンクを有効ã«ã™ã‚‹"
++
++#~ msgid "Firmware image"
++#~ msgstr "ファームウェア・イメージ"
++
++#~ msgid "Forward DHCP"
++#~ msgstr "DHCPパケットã®è»¢é€"
++
++#~ msgid "Forward broadcasts"
++#~ msgstr "ブロードキャストã®è»¢é€"
++
++#~ msgid "HE.net Tunnel ID"
++#~ msgstr "HE.net トンãƒãƒ«ID"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ãƒ«ãƒ¼ã‚¿ãƒ¼ã®è¨­å®šã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¨å¾©å…ƒã¨ã€å¯èƒ½ã§ã‚ã‚Œã°ãƒ«ãƒ¼ã‚¿ãƒ¼ã‚’"
++#~ "åˆæœŸçŠ¶æ…‹ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã€‚"
++
++#~ msgid "Installation targets"
++#~ msgstr "インストールターゲット"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "設定ファイルをä¿æŒã™ã‚‹"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "キープアライブ"
++
++#~ msgid "Kernel"
++#~ msgstr "カーãƒãƒ«"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "接続ã«æˆåŠŸã—ãŸå¾Œã€pppdã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®çµŒè·¯ã‚’PPPインターフェースを使用ã™ã‚‹æ§˜"
++#~ "ã«å¤‰æ›´ã—ã¾ã™"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr "PPPリンクã®ç¢ºç«‹å¾Œã€pppd ã¯ã“ã®ã‚¹ã‚¯ãƒªãƒ—トを実行ã—ã¾ã™ã€‚"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "PPPリンクã®åˆ‡æ–­å¾Œã€pppd ã¯ã“ã®ã‚¹ã‚¯ãƒªãƒ—トを実行ã—ã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "PINコードãŒæ­£ã—ã入力ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã¨ã€SIMカードãŒãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’"
++#~ "確èªã—ã¦ãã ã•ã„ï¼"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "デーモンやサービスã¯ã€ã‚·ã‚§ãƒ«ã‚¢ã‚¯ã‚»ã‚¹ã€<abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>ã®ã‚ˆã†ãªWEBアクセス機能ã€ãƒ¡ãƒƒã‚·ãƒ¥ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°æ©Ÿèƒ½ã€"
++#~ "メールé€ä¿¡æ©Ÿèƒ½ãªã©ã€ãƒ‡ãƒã‚¤ã‚¹ã‚„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æ©Ÿèƒ½ã‚’æä¾›ã—ã¾ã™ã€‚"
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr "自動å†æŽ¥ç¶šæ™‚ã«è¡Œã†æŽ¥ç¶šãƒ†ã‚¹ãƒˆã®å¤±æ•—æ•°"
++
++#~ msgid "Override Gateway"
++#~ msgstr "ゲートウェイアドレスを上書ãã™ã‚‹"
++
++#~ msgid "PIN code"
++#~ msgstr "PINコード"
++
++#~ msgid "PPP Settings"
++#~ msgstr "PPP設定"
++
++#~ msgid "Package lists"
++#~ msgstr "パッケージリスト"
++
++#~ msgid "Port PVIDs on %q"
++#~ msgstr "ãƒãƒ¼ãƒˆ PVIDs on %q"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr "å…¨ã¦ã®è¨­å®šã‚’å…ƒã«æˆ»ã—ã€ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã‚’åˆæœŸçŠ¶æ…‹ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã‹?"
++
++#~ msgid "Processor"
++#~ msgstr "プロセッサ"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Radiusãƒãƒ¼ãƒˆ"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Radiusサーãƒãƒ¼"
++
++#~ msgid "Relay Settings"
++#~ msgstr "リレー設定"
++
++#~ msgid "Replace default route"
++#~ msgstr "デフォルトルートを置æ›ã™ã‚‹"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "ルーターをåˆæœŸçŠ¶æ…‹ã«ãƒªã‚»ãƒƒãƒˆ"
++
++#~ msgid "Routing table ID"
++#~ msgstr "経路テーブルID"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr "接続ã™ã‚‹å‰ã«ã€ãƒ¢ãƒ‡ãƒ ã®æº–å‚™ãŒå®Œäº†ã™ã‚‹ãŸã‚ã®å¾…ã¡æ™‚間を設ã‘ã¾ã™ï¼ˆç§’)"
++
++#~ msgid "Server IPv4-Address"
++#~ msgstr "IPv4-アドレス サーãƒãƒ¼"
++
++#~ msgid "Service type"
++#~ msgstr "サービス・タイプ"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr "サービスã¨ãƒ‡ãƒ¼ãƒ¢ãƒ³ã¯ãƒ‡ãƒã‚¤ã‚¹ä¸Šã§ã€æ§˜ã€…ãªå‡¦ç†ã‚’è¡Œãªã„ã¾ã™ã€‚"
++
++#~ msgid "Settings"
++#~ msgstr "設定"
++
++#~ msgid "Setup wait time"
++#~ msgstr "å¾…ã¡æ™‚é–“ã®è¨­å®š"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "申ã—訳ã‚ã‚Šã¾ã›ã‚“。OpenWrtã§ã¯ã“ã®ãƒ—ラットフォーム上ã§ã®ã‚·ã‚¹ãƒ†ãƒ ã‚¢ãƒƒãƒ—レー"
++#~ "ドを行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。<br />手動ã§ãƒ‡ãƒã‚¤ã‚¹ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。"
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr "pppd ã®è¿½åŠ ã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³å¼•æ•°ã‚’指定ã—ã¾ã™ã€‚"
++
++#~ msgid "TTL"
++#~ msgstr "TTL"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "モデムã®ãƒ‡ãƒã‚¤ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’設定ã—ã¦ãã ã•ã„。(例: /dev/ttyUSB0)"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr "指定ã—ãŸæœŸé–“(秒)コãƒã‚¯ã‚·ãƒ§ãƒ³ãŒä½¿ç”¨ã•ã‚Œãªã„å ´åˆã«æŽ¥ç¶šã‚’é–‰ã˜ã¾ã™"
++
++#~ msgid "Time Server (rdate)"
++#~ msgstr "時刻サーãƒãƒ¼ (rdate)"
++
++#~ msgid "Tunnel Settings"
++#~ msgstr "トンãƒãƒªãƒ³ã‚°è¨­å®š"
++
++#~ msgid "Update package lists"
++#~ msgstr "パッケージリストã®æ›´æ–°"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "更新用ã®OpenWrtイメージファイルをアップロードã—ã¦ãã ã•ã„。"
++
++#~ msgid "Upload image"
++#~ msgstr "アップロード"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "ピアDNSを使用ã™ã‚‹"
++
++#~ msgid "VLAN %d"
++#~ msgstr "VLAN %d"
++
++#~ msgid ""
++#~ "You can specify multiple DNS servers here, press enter to add a new "
++#~ "entry. Servers entered here will override automatically assigned ones."
++#~ msgstr ""
++#~ "複数ã®DNSサーãƒãƒ¼ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚Enterキーを押ã™ã¨ã€ã‚¨ãƒ³ãƒˆãƒªãƒ¼ã‚’"
++#~ "追加ã§ãã¾ã™ã€‚ã¾ãŸã€è‡ªå‹•çš„ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’ã€å…¥åŠ›ã•ã‚ŒãŸã‚µãƒ¼ãƒãƒ¼ã®"
++#~ "アドレスã§ä¸Šæ›¸ãã—ã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "サービスを追加ã—ã¦ä½¿ç”¨ã™ã‚‹å ´åˆã€ãã‚Œãžã‚Œå¯¾å¿œã™ã‚‹ãƒ‘ッケージをインストールã™"
++#~ "ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚(UMTS/GPRS - \"comgt\"ã€PPPoE - \"ppp-mod-pppoe\"ã€"
++#~ "PPPoA - \"ppp-mod-pppoa\"ã€PPTP - \"pptp\")"
++
++#~ msgid "back"
++#~ msgstr "戻る"
++
++#~ msgid "buffered"
++#~ msgstr "ãƒãƒƒãƒ•ã‚¡ã‚­ãƒ£ãƒƒã‚·ãƒ¥"
++
++#~ msgid "cached"
++#~ msgstr "ページキャッシュ"
++
++#~ msgid "free"
++#~ msgstr "空ã"
++
++#~ msgid "static"
++#~ msgstr "é™çš„"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> 㯠<abbr title="
++#~ "\"Model-View-Controller\">MVC</abbr> ウェブフレームワークや組ã¿è¾¼ã¿ãƒ‡ãƒã‚¤"
++#~ "スã®ç‚ºã®ã‚¦ã‚§ãƒ–インターフェースをå«ã‚€ã€ãƒ•ãƒªãƒ¼ã® Lua ソフトウェアコレクショ"
++#~ "ンã§ã™ã€‚<abbr title=\"Lua Configuration Interface\">LuCI</abbr> 㯠Apache-"
++#~ "License ã®å…ƒã§é…布ã•ã‚Œã¦ã„ã¾ã™ã€‚"
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "<abbr title=\"Secure Shell\">SSH</abbr>-キー"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "軽é‡ãª HTTP/1.1 WEBサーãƒãƒ¼ã¯Cã¨Luaã§æ›¸ã‹ã‚Œ LuCI ã«å½¹ç«‹ã¤æ§˜ã«è¨­è¨ˆã•ã‚Œã¦ã„"
++#~ "ã¾ã™"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr>を動作ã•ã›ã‚‹ã®ã«ä½¿"
++#~ "用ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã‚‹å°ã•ãª WEBサーãƒãƒ¼ã§ã™ã€‚"
++
++#~ msgid "About"
++#~ msgstr "情報"
++
++#~ msgid "Active IP Connections"
++#~ msgstr "有効ãªIP接続"
++
++#~ msgid "Addresses"
++#~ msgstr "アドレス"
++
++#~ msgid "Admin Password"
++#~ msgstr "管ç†è€…パスワード"
++
++#~ msgid "Alias"
++#~ msgstr "エイリアス"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "èªè¨¼ãƒ¬ãƒ«ãƒ "
++
++#~ msgid "Bridge Port"
++#~ msgstr "ブリッジãƒãƒ¼ãƒˆ"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr "システム管ç†è€…ã®ãƒ‘スワードを変更ã—ã¾ã™(ユーザー <code>root</code>)"
++
++#~ msgid "Client + WDS"
++#~ msgstr "クライアント + WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "設定ファイル"
++
++#~ msgid "Connection timeout"
++#~ msgstr "接続タイムアウト"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "貢献者"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "DHCP アサイン"
++
++#~ msgid "Document root"
++#~ msgstr "ドキュメントルート"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "キープアライブ機能を有効ã«ã™ã‚‹"
++
++#~ msgid "Enable device"
++#~ msgstr "デãƒã‚¤ã‚¹ã‚’有効ã«ã™ã‚‹"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "イーサãƒãƒƒãƒˆãƒ–リッジ"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "<abbr title=\"Secure Shell\">SSH</abbr>公開éµèªè¨¼ã§ä½¿ç”¨ã™ã‚‹ <abbr title="
++#~ "\"Secure Shell\">SSH</abbr>公開éµã‚’1行ã¥ã¤è²¼ã‚Šä»˜ã‘ã¦ãã ã•ã„。"
++
++#~ msgid "ID"
++#~ msgstr "ID"
++
++#~ msgid "IP Configuration"
++#~ msgstr "IP 設定"
++
++#~ msgid "Interface Status"
++#~ msgstr "インターフェース・ステータス"
++
++#~ msgid "Lead Development"
++#~ msgstr "開発リーダー"
++
++#~ msgid "Master"
++#~ msgstr "マスター"
++
++#~ msgid "Master + WDS"
++#~ msgstr "マスター + WDS"
++
++#~ msgid "No address configured on this interface."
++#~ msgstr "アドレスãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
++
++#~ msgid "Not configured"
++#~ msgstr "未設定"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "パスワードを変更ã—ã¾ã—ãŸ"
++
++#~ msgid "Plugin path"
++#~ msgstr "プラグインパス"
++
++#~ msgid "Ports"
++#~ msgstr "ãƒãƒ¼ãƒˆ"
++
++#~ msgid "Primary"
++#~ msgstr "プライマリ"
++
++#~ msgid "Project Homepage"
++#~ msgstr "プロジェクトホームページ"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "擬似アドホック"
++
++#~ msgid "STP"
++#~ msgstr "STP"
++
++#~ msgid "Thanks To"
++#~ msgstr "ã‚ã‚ŠãŒã¨ã†"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr "レルムã¯ä¿è­·ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã§èªè¨¼ãƒ—ロンプトを表示ã—ã¾ã™ã€‚"
++
++#~ msgid "Unknown Error"
++#~ msgstr "ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "デフォルト㯠<code>/etc/httpd.conf</code>"
++
++#~ msgid "Enable this switch"
++#~ msgstr "スイッãƒã‚’有効ã«ã™ã‚‹"
++
++#~ msgid "OPKG error code %i"
++#~ msgstr "OPKGエラーコード %i"
++
++#~ msgid "Package lists updated"
++#~ msgstr "パッケージリストを更新ã—ã¾ã—ãŸ"
++
++#~ msgid "Reset switch during setup"
++#~ msgstr "起動時ã«ã‚¹ã‚¤ãƒƒãƒã‚’リセットã™ã‚‹"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "インストールã•ã‚Œã¦ã„るパッケージã®ã‚¢ãƒƒãƒ—グレード"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "ã¾ãŸã€ã‚«ãƒ¼ãƒãƒ«ã‚„サービスã®ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚‚ç¾åœ¨ã®çŠ¶æ…‹ã‚’å¾—ã‚‹ãŸã‚ã«å‚ç…§ã™ã‚‹äº‹ãŒ"
++#~ "出æ¥ã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "ã“ã“ã§ã¯ã€<abbr title=\"Central Processing Unit\">CPU</abbr>クロック周波"
++#~ "æ•°ã€ãƒ¡ãƒ¢ãƒªä½¿ç”¨é‡ã‚„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‡ãƒ¼ã‚¿ãªã©ã®ç¾åœ¨ã®ã‚·ã‚¹ãƒ†ãƒ ã®"
++#~ "状態ã«é–¢ã™ã‚‹æƒ…報を見ã¤ã‘ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚"
++
++#~ msgid "Search file..."
++#~ msgstr "Search file..."
++
++#~ msgid "Server"
++#~ msgstr "サーãƒãƒ¼"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> 㯠OpenWrt "
++#~ "Kamikaze ã®ç‚ºã®è‡ªç”±ã§ã€æŸ”軟ã§ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ•ãƒ¬ãƒ³ãƒ‰ãƒªãªã‚°ãƒ©ãƒ•ã‚£ã‚«ãƒ«ã‚¤ãƒ³ã‚¿ãƒ¼"
++#~ "フェースã§ã™ã€‚"
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "ãã‚Œã§ã¯ã€ã‚ãªãŸã®ãƒ«ãƒ¼ã‚¿ãƒ¼ã‚’楽ã—ã‚“ã§ãã ã•ã„!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "ç§ãŸã¡ã¨ã—ã¦ã¯ã€ã„ã¤ã§ã‚‚ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’改良ã—ãŸã„ã¨æœ›ã‚“ã§ãŠã‚Šã€ã‚ãª"
++#~ "ãŸã‹ã‚‰ã®ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ã¨æ案をãŠå¾…ã¡ã—ã¦ã„ã¾ã™ã€‚"
++
++#~ msgid "Hello!"
++#~ msgstr "ã“ã‚“ã«ã¡ã¯!"
++
++#~ msgid "LuCI Components"
++#~ msgstr "LuCIコンãƒãƒ¼ãƒãƒ³ãƒˆ"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "注æ„: <abbr title=\"Lua Configuration Interface\">LuCI</abbr> ã§å¤‰æ›´ã‚’è¡Œã†"
++#~ "ã«ã¯é©ç”¨å‰ã«ã€Œä¿å­˜ &amp; é©ç”¨ã€ã‚’クリックã—ã¦ç¢ºèªã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "以下ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒ«ãƒ¼ã‚¿ãƒ¼ã®å…¨ã¦ã®é‡è¦ãªè¨­å®šã‚’調整ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚"
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> ãƒãƒ¼ãƒ "
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> ã®ç®¡ç†ãƒ‘ãƒãƒ«ã§ã™ã€‚"
++
++#~ msgid "User Interface"
++#~ msgstr "ユーザーインターフェース"
++
++#~ msgid "enable"
++#~ msgstr "有効"
++
++#, fuzzy
++#~ msgid "(optional)"
++#~ msgstr " (ä»»æ„)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>サーãƒãƒ¼ã¯ãƒªã‚¾ãƒ«ãƒãƒ•ã‚¡ã‚¤ãƒ«ã®"
++#~ "é †ã«å•ã„åˆã‚ã›ã‚’è¡Œã„ã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr ""
++#~ "<abbr title=\"maximal\">max.</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=\"maximal\">max.</abbr> <abbr title=\"Extension Mechanisms "
++#~ "for Domain Name System\">EDNS0</abbr> packet size"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "APã®åˆ†é›¢"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "物ç†ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’追加ã—ã¾ã™"
++
++#~ msgid "Aliases"
++#~ msgstr "エイリアス"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Clamp Segment Size"
++
++#, fuzzy
++#~ msgid "Create Or Attach Network"
++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ä½œæˆ"
++
++#~ msgid "Devices"
++#~ msgstr "デãƒã‚¤ã‚¹"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ç‚ºã®é€†å¼•ãを転é€ã—ã¾ã›ã‚“"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "TFTPサーãƒãƒ¼ã‚’有効ã«ã™ã‚‹"
++
++#~ msgid "Errors"
++#~ msgstr "エラー"
++
++#~ msgid "Essentials"
++#~ msgstr "簡易設定"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "ホストå展開"
++
++#~ msgid "First leased address"
++#~ msgstr "先頭リースアドレス"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++
++#~ msgid "Hardware Address"
++#~ msgstr "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚¢ãƒ‰ãƒ¬ã‚¹"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "ã“ã“ã§ã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚ŒãŸç„¡ç·šãƒ‡ãƒã‚¤ã‚¹ã®è¨­å®šã‚’è¡Œã†ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚"
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "アドホック"
++
++#~ msgid "Internet Connection"
++#~ msgstr "インターãƒãƒƒãƒˆæŽ¥ç¶š"
++
++#~ msgid "Join (Client)"
++#~ msgstr "クライアント"
++
++#~ msgid "Leases"
++#~ msgstr "リース"
++
++#~ msgid "Local Domain"
++#~ msgstr "ローカルドメイン"
++
++#~ msgid "Local Network"
++#~ msgstr "ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++#~ msgid "Local Server"
++#~ msgstr "ローカルサーãƒãƒ¼"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ–ートイメージ"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr ""
++#~ "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å(<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "リースアドレス数"
++
++#~ msgid "Perform Actions"
++#~ msgstr "実行"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "クライアントåŒå£«ã®é€šä¿¡ã‚’制é™ã—ã¾ã™"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "アクセスãƒã‚¤ãƒ³ãƒˆ"
++
++#~ msgid "Resolvfile"
++#~ msgstr "リゾルãƒãƒ•ã‚¡ã‚¤ãƒ«"
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "TFTPサーãƒãƒ¼ãƒ«ãƒ¼ãƒˆ"
++
++#~ msgid "TX / RX"
++#~ msgstr "TX / RX"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "以下ã®å¤‰æ›´ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸ"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> ã«ã‚ˆã£ã¦æ–°ã—ã„"
++#~ "ファームウェアを書ã込んã æ™‚ã«ã€ã“れらã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ–°ã—ã„ファームウェアイン"
++#~ "ストールã§ã‚‚追加ã•ã‚Œã¾ã™ã€‚"
++
++#, fuzzy
++#~ msgid "Wireless Scan"
++#~ msgstr "無線アダプタ"
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> ã«ã‚ˆã£ã¦"
++#~ "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¡ãƒ³ãƒã¯è‡ªå‹•çš„ã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨­å®š(<abbr title=\"Internet "
++#~ "Protocol\">IP</abbr>アドレスã€netmask, <abbr title=\"Domain Name System"
++#~ "\">DNS</abbr>サーãƒãƒ¼ã€...)ã‚’å—ä¿¡ã—ã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "1ã¤ã®ãƒ‡ãƒã‚¤ã‚¹ã§è¤‡æ•°ã®ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’é‹ç”¨ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚特定ã®ãƒãƒ¼"
++#~ "ドウェアã¨ãƒ‰ãƒ©ã‚¤ãƒã®ä»•æ§˜ã®åˆ¶é™ãŒåœ¨ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。通常ã§ã¯1ã¤ã®"
++#~ "アドホックモードã€ã‚‚ã—ãã¯3ã¤ã¾ã§ã®ãƒžã‚¹ã‚¿ãƒ¼ãƒ¢ãƒ¼ãƒ‰ã¨1ã¤ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ¢ãƒ¼ãƒ‰"
++#~ "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’åŒæ™‚ã«ç¨¼åƒã§ãã¾ã™ã€‚"
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "PPPoE をサãƒãƒ¼ãƒˆã™ã‚‹ç‚ºã«ã¯ \"ppp-mod-pppoe\" ã‚’ã€PPtP をサãƒãƒ¼ãƒˆã™ã‚‹ç‚ºã« "
++#~ "\"pptp\" をインストールã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
++
++#~ msgid "additional hostfile"
++#~ msgstr "追加ã®ãƒ›ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr "リゾルãƒãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ›ã‚¹ãƒˆã‚¨ãƒ³ãƒˆãƒªã«ãƒ‰ãƒ¡ã‚¤ãƒ³åを追加ã—ã¾ã™"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "自動å†æŽ¥ç¶š"
++
++#~ msgid "concurrent queries"
++#~ msgstr "並列å•ã„åˆã‚ã›"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr ""
++#~ "ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ <abbr title=\"Dynamic Host Configuration Protocol"
++#~ "\">DHCP</abbr> を無効ã«ã—ã¾ã™ã€‚"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "disconnect when idle for"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "ãƒã‚¬ãƒ†ã‚£ãƒ–キャッシュを行ã‚ãªã„"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr ""
++#~ "Windowsシステムã®ç„¡é§„㪠<abbr title=\"Domain Name System\">DNS</abbr>クエ"
++#~ "リをフィルタã—ã¾ã™"
++
++#~ msgid "installed"
++#~ msgstr "インストール済ã¿"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "サブãƒãƒƒãƒˆã«ä¾å­˜ã—ãŸãƒ›ã‚¹ãƒˆåをローカライズã—ã¾ã™"
++
++#~ msgid "not installed"
++#~ msgstr "未インストール"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr ""
++#~ "ãƒã‚¬ãƒ†ã‚£ãƒ–キャッシュã®<abbr title=\"Domain Name System\">DNS</abbr>応答を"
++#~ "防ãŽã¾ã™"
++
++#~ msgid "query port"
++#~ msgstr "å•ã„åˆã‚ã›ãƒãƒ¼ãƒˆ"
++
++#~ msgid "transmitted / received"
++#~ msgstr "é€ä¿¡ / å—ä¿¡"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯"
++
++#~ msgid "all"
++#~ msgstr "å…¨ã¦"
++
++#~ msgid "Code"
++#~ msgstr "コード"
++
++#~ msgid "Distance"
++#~ msgstr "Distance"
++
++#~ msgid "Legend"
++#~ msgstr "Legend"
++
++#~ msgid "Library"
++#~ msgstr "Library"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "see &#39;%s&#39; manpage"
++
++#~ msgid "Package Manager"
++#~ msgstr "パッケージ管ç†"
++
++#~ msgid "Service"
++#~ msgstr "サービス"
++
++#~ msgid "Statistics"
++#~ msgstr "統計"
++
++#~ msgid "zone"
++#~ msgstr "ゾーン"
+diff --git a/feeds/luci/modules/luci-base/po/ms/base.po b/feeds/luci/modules/luci-base/po/ms/base.po
+new file mode 100644
+index 0000000..e297261
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/ms/base.po
+@@ -0,0 +1,3980 @@
++#, fuzzy
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-05-07 17:57+1000\n"
++"PO-Revision-Date: 2010-05-07 17:57+1000\n"
++"Last-Translator: Wai Chet Teow <waichet@hotmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr ""
++
++msgid "(%s available)"
++msgstr "(%s sedia)"
++
++msgid "(empty)"
++msgstr ""
++
++msgid "(no interfaces attached)"
++msgstr "(tiada interface dipasang)"
++
++msgid "-- Additional Field --"
++msgstr "-- Gelanggang Tambahan --"
++
++msgid "-- Please choose --"
++msgstr "-- Sila pilih --"
++
++msgid "-- custom --"
++msgstr "-- memperibadi --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr ""
++
++msgid "15 Minute Load:"
++msgstr ""
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr ""
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr ""
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr ""
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++"<abbr title=\"perkhidmatan set mengenalpasti diperpanjangkan\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "IPv4-Alamat"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "IPv4-Pintu gerbang"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "IPv4-Netmask"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr "IPv6 Host-Alamat atau Rangkaian (CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "IPv6-Pintu gerbang"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "Konfigurasi lampu LED"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr ""
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "MAC-Alamat"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr ""
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr ""
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr ""
++
++msgid "AR Support"
++msgstr "AR-Penyokong"
++
++msgid "ARP retry threshold"
++msgstr ""
++
++msgid "ATM Bridges"
++msgstr ""
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr ""
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr ""
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++
++msgid "ATM device number"
++msgstr ""
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr ""
++
++msgid "Access Point"
++msgstr "Pusat akses"
++
++msgid "Action"
++msgstr "Aksi"
++
++msgid "Actions"
++msgstr "Aksi"
++
++msgid "Activate this network"
++msgstr ""
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "Aktive IPv4-Routen"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "Aktif IPv6-Laluan"
++
++msgid "Active Connections"
++msgstr "Sambungan Aktif"
++
++msgid "Active DHCP Leases"
++msgstr ""
++
++msgid "Active DHCPv6 Leases"
++msgstr ""
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Tambah"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++
++msgid "Add new interface..."
++msgstr ""
++
++msgid "Additional Hosts files"
++msgstr ""
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Address to access local relay bridge"
++msgstr ""
++
++msgid "Administration"
++msgstr "Pentadbiran"
++
++msgid "Advanced Settings"
++msgstr "Tetapan Lanjutan"
++
++msgid "Alert"
++msgstr ""
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr "Membenarkan pengesahan kata laluan SSH"
++
++msgid "Allow all except listed"
++msgstr "Izinkan semua kecualian yang disenaraikan"
++
++msgid "Allow listed only"
++msgstr "Izinkan senarai saja"
++
++msgid "Allow localhost"
++msgstr ""
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++
++msgid "Allow root logins with password"
++msgstr ""
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr ""
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr ""
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antena 1"
++
++msgid "Antenna 2"
++msgstr "Antena 2"
++
++msgid "Antenna Configuration"
++msgstr ""
++
++msgid "Any zone"
++msgstr ""
++
++msgid "Apply"
++msgstr "Melaksanakan"
++
++msgid "Applying changes"
++msgstr "Melaksanakan perubahan"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr ""
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Associated Stesen"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Authentifizierung"
++
++msgid "Authoritative"
++msgstr "Pengesahan"
++
++msgid "Authorization Required"
++msgstr "Otorisasi Diperlukan"
++
++msgid "Auto Refresh"
++msgstr ""
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Boleh didapati"
++
++msgid "Available packages"
++msgstr ""
++
++msgid "Average:"
++msgstr ""
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Back"
++msgstr ""
++
++msgid "Back to Overview"
++msgstr ""
++
++msgid "Back to configuration"
++msgstr ""
++
++msgid "Back to overview"
++msgstr "Kembali ke ikhtisar"
++
++msgid "Back to scan results"
++msgstr "Kembali ke keputusan scan"
++
++msgid "Background Scan"
++msgstr "Latar Belakang Scan"
++
++msgid "Backup / Flash Firmware"
++msgstr ""
++
++msgid "Backup / Restore"
++msgstr "Sandaran / Mengembalikan"
++
++msgid "Backup file list"
++msgstr ""
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Bogus NX Domain Override"
++msgstr ""
++
++msgid "Bridge"
++msgstr "Bridge"
++
++msgid "Bridge interfaces"
++msgstr "Antara Muka Bridge"
++
++msgid "Bridge unit number"
++msgstr ""
++
++msgid "Bring up on boot"
++msgstr ""
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr ""
++
++msgid "Buffered"
++msgstr ""
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Butang"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr ""
++
++msgid "CPU usage (%)"
++msgstr "Penggunaan CPU (%)"
++
++msgid "Cancel"
++msgstr "Batal"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Rantai"
++
++msgid "Changes"
++msgstr "Laman"
++
++msgid "Changes applied."
++msgstr "Laman diterapkan."
++
++msgid "Changes the administrator password for accessing the device"
++msgstr ""
++
++msgid "Channel"
++msgstr "Saluran"
++
++msgid "Check"
++msgstr ""
++
++msgid "Checksum"
++msgstr "Jumlah disemak "
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr "Pilih zon firewall yang anda ingin tetapkan untuk antar muka ini."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++
++msgid "Cipher"
++msgstr ""
++
++msgid ""
++"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)."
++msgstr ""
++
++#, fuzzy
++msgid "Client"
++msgstr "Pelanggan"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr ""
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++
++msgid "Close list..."
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr "Perintah"
++
++msgid "Common Configuration"
++msgstr ""
++
++msgid "Compression"
++msgstr "Mampatan"
++
++msgid "Configuration"
++msgstr "Konfigurasi"
++
++msgid "Configuration applied."
++msgstr ""
++
++msgid "Configuration files will be kept."
++msgstr ""
++
++msgid "Confirmation"
++msgstr "Pengesahan"
++
++msgid "Connect"
++msgstr ""
++
++msgid "Connected"
++msgstr ""
++
++msgid "Connection Limit"
++msgstr "Sambungan Batas"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr ""
++
++msgid "Country"
++msgstr ""
++
++msgid "Country Code"
++msgstr "Kod negara"
++
++msgid "Cover the following interface"
++msgstr ""
++
++msgid "Cover the following interfaces"
++msgstr ""
++
++msgid "Create / Assign firewall-zone"
++msgstr "Buat / Menetapkan dinding api-zon"
++
++msgid "Create Interface"
++msgstr ""
++
++msgid "Create a bridge over multiple interfaces"
++msgstr ""
++
++msgid "Critical"
++msgstr ""
++
++msgid "Cron Log Level"
++msgstr ""
++
++msgid "Custom Interface"
++msgstr ""
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr "Mengkustomisasi perilaku peranti LED jika mungkin."
++
++msgid "DHCP Leases"
++msgstr ""
++
++msgid "DHCP Server"
++msgstr ""
++
++msgid "DHCP and DNS"
++msgstr ""
++
++msgid "DHCP client"
++msgstr ""
++
++msgid "DHCP-Options"
++msgstr "DHCP-Pilihan"
++
++msgid "DHCPv6 Leases"
++msgstr ""
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS forwardings"
++msgstr ""
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Default %d"
++msgstr ""
++
++msgid "Default gateway"
++msgstr ""
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr ""
++
++msgid "Define a name for this network."
++msgstr ""
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++
++msgid "Delete"
++msgstr "Padam"
++
++msgid "Delete this interface"
++msgstr ""
++
++msgid "Delete this network"
++msgstr ""
++
++msgid "Description"
++msgstr "Keterangan"
++
++msgid "Design"
++msgstr "Disain"
++
++msgid "Destination"
++msgstr "Tempat tujuan"
++
++msgid "Device"
++msgstr "Alat"
++
++msgid "Device Configuration"
++msgstr ""
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++
++msgid "Disable DNS setup"
++msgstr ""
++
++msgid "Disable HW-Beacon timer"
++msgstr "Mematikan pemasa HW-Beacon"
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Discard upstream RFC1918 responses"
++msgstr ""
++
++msgid "Displaying only packages containing"
++msgstr ""
++
++msgid "Distance Optimization"
++msgstr "Jarak Optimasi"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Jarak ke rangkaian terjauh ahli dalam meter."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Keanekaragaman"
++
++# Nur für NAT-Firewalls?
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq adalah gabungan <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Pelayan dan<abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder untuk <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewall"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 ""
++
++msgid "Do not send probe responses"
++msgstr "Jangan menghantar jawapan penyelidikan"
++
++msgid "Domain required"
++msgstr "Domain diperlukan"
++
++msgid "Domain whitelist"
++msgstr ""
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr "Jangan hantar permintaan DNS tanpa nama DNS"
++
++msgid "Download and install package"
++msgstr "Turun dan memasang pakej"
++
++msgid "Download backup"
++msgstr ""
++
++msgid "Dropbear Instance"
++msgstr ""
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear menawarkan SSH kulit rangkaian aksesdan pelayan yang terintegrasi."
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr "Dinamik DHCP"
++
++msgid "Dynamic tunnel"
++msgstr ""
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "EAP-Kaedah"
++
++msgid "Edit"
++msgstr "Sunting"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr ""
++
++msgid "Edit this network"
++msgstr ""
++
++msgid "Emergency"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Mengaktifkan <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr ""
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr ""
++
++msgid "Enable NTP client"
++msgstr ""
++
++msgid "Enable TFTP server"
++msgstr ""
++
++msgid "Enable VLAN functionality"
++msgstr ""
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr ""
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr ""
++
++msgid "Enable this swap"
++msgstr ""
++
++msgid "Enable/Disable"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Aktifkan spanning Tree Protokol di jambatan ini"
++
++msgid "Encapsulation mode"
++msgstr ""
++
++msgid "Encryption"
++msgstr "Enkripsi"
++
++msgid "Erasing..."
++msgstr ""
++
++msgid "Error"
++msgstr "Kesalahan"
++
++msgid "Ethernet Adapter"
++msgstr "Ethernet Adapter"
++
++msgid "Ethernet Switch"
++msgstr "Ethernet Beralih"
++
++msgid "Expand hosts"
++msgstr ""
++
++msgid "Expires"
++msgstr ""
++
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr ""
++
++msgid "External system log server port"
++msgstr ""
++
++msgid "Fast Frames"
++msgstr "Frame Cepat"
++
++msgid "File"
++msgstr ""
++
++msgid "Filename of the boot image advertised to clients"
++msgstr ""
++
++msgid "Filesystem"
++msgstr "Fail Sistem"
++
++msgid "Filter"
++msgstr "Penapis"
++
++msgid "Filter private"
++msgstr "Penapis swasta"
++
++msgid "Filter useless"
++msgstr "Penapis tak berguna"
++
++msgid "Find and join network"
++msgstr ""
++
++msgid "Find package"
++msgstr "Cari pakej"
++
++msgid "Finish"
++msgstr "Selesai"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall Settings"
++msgstr "Tetapan Firewall"
++
++msgid "Firewall Status"
++msgstr "Status Firewall"
++
++msgid "Firmware Version"
++msgstr ""
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr ""
++
++msgid "Flags"
++msgstr "Parameter"
++
++msgid "Flash Firmware"
++msgstr "Firmware Flash"
++
++msgid "Flash image..."
++msgstr ""
++
++msgid "Flash new firmware image"
++msgstr ""
++
++msgid "Flash operations"
++msgstr ""
++
++msgid "Flashing..."
++msgstr ""
++
++msgid "Force"
++msgstr "Paksa"
++
++msgid "Force CCMP (AES)"
++msgstr ""
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++
++msgid "Force TKIP"
++msgstr ""
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr ""
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr ""
++
++msgid "Forward broadcast traffic"
++msgstr ""
++
++msgid "Forwarding mode"
++msgstr ""
++
++msgid "Fragmentation Threshold"
++msgstr "Fragmentasi Ambang"
++
++msgid "Frame Bursting"
++msgstr "Bingkai Meletup"
++
++msgid "Free"
++msgstr ""
++
++msgid "Free space"
++msgstr ""
++
++msgid "GHz"
++msgstr ""
++
++msgid "GPRS only"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Gateway ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General Setup"
++msgstr "Setup Umum"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr ""
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr "Menuju ke halaman konfigurasi yang relevan"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr ""
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Kawalan"
++
++msgid "Hang Up"
++msgstr "Menutup"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Di sini anda boleh mengkonfigurasi aspek asas peranti anda seperti nama host "
++"atau zon."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "Menyembunyikan ESSID"
++
++msgid "Host entries"
++msgstr "Entri host"
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "IP host atau rangkaian"
++
++msgid "Hostname"
++msgstr "Nama Host"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr ""
++
++msgid "Hostnames"
++msgstr "Nama Host"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "Alamat IP"
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 Firewall"
++msgstr ""
++
++msgid "IPv4 WAN Status"
++msgstr ""
++
++msgid "IPv4 address"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid "IPv4 gateway"
++msgstr ""
++
++msgid "IPv4 netmask"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6"
++msgstr "Konfigurasi IPv6"
++
++msgid "IPv6 Firewall"
++msgstr ""
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr ""
++
++msgid "IPv6 address"
++msgstr ""
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "IPv6 prefix"
++msgstr ""
++
++msgid "IPv6 prefix length"
++msgstr ""
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr ""
++
++msgid "Identity"
++msgstr "Identiti"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++
++msgid "If unchecked, no default route is configured"
++msgstr ""
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Jika memori fizikal anda tidak cukup data yang boleh digunakan sementara "
++"menukar ke peranti-penukar yang dihasilkan dalam jumlah RAM berguna yang "
++"lebih tinggi. Berhati-hatilah bahawa penukaran data adalah proses yang "
++"sangat lambat kerana peranti-penukar tidak boleh diakses dengan datarates "
++"yang tinggi pada RAM."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Mengabaikan /etc/hosts"
++
++msgid "Ignore interface"
++msgstr "Abaikan antara muka"
++
++msgid "Ignore resolve file"
++msgstr "Abaikan fail yang selesai"
++
++msgid "Image"
++msgstr ""
++
++msgid "In"
++msgstr "Masuk"
++
++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 ""
++
++msgid "Inbound:"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Initscript"
++msgstr ""
++
++msgid "Initscripts"
++msgstr ""
++
++msgid "Install"
++msgstr "Memasang"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr ""
++
++msgid "Install protocol extensions..."
++msgstr ""
++
++msgid "Installed packages"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface Overview"
++msgstr ""
++
++msgid "Interface is reconnecting..."
++msgstr ""
++
++msgid "Interface is shutting down..."
++msgstr ""
++
++msgid "Interface not present or not connected yet."
++msgstr ""
++
++msgid "Interface reconnected"
++msgstr ""
++
++msgid "Interface shut down"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Interface"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr ""
++
++msgid "Invalid"
++msgstr "Tak Sah"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Username dan / atau password tak sah! Sila cuba lagi."
++
++#, 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 ""
++"Tampak bahawa anda cuba untuk flash fail gambar yang tidak sesuai dengan "
++"memori flash, sila buat pengesahan pada fail gambar!"
++
++msgid "Java Script required!"
++msgstr ""
++
++#, fuzzy
++msgid "Join Network"
++msgstr "Gabung Rangkaian"
++
++msgid "Join Network: Settings"
++msgstr ""
++
++msgid "Join Network: Wireless Scan"
++msgstr ""
++
++msgid "Keep settings"
++msgstr ""
++
++msgid "Kernel Log"
++msgstr "Log Kernel"
++
++msgid "Kernel Version"
++msgstr ""
++
++msgid "Key"
++msgstr "Kunci"
++
++msgid "Key #%d"
++msgstr ""
++
++msgid "Kill"
++msgstr "Tamatkan"
++
++msgid "L2TP"
++msgstr ""
++
++msgid "L2TP Server"
++msgstr ""
++
++msgid "LCP echo failure threshold"
++msgstr ""
++
++msgid "LCP echo interval"
++msgstr ""
++
++msgid "LLC"
++msgstr ""
++
++msgid "Label"
++msgstr ""
++
++msgid "Language"
++msgstr "Bahasa"
++
++msgid "Language and Style"
++msgstr ""
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Leasefile"
++msgstr "Sewa fail"
++
++msgid "Leasetime"
++msgstr "Masa penyewaan"
++
++msgid "Leasetime remaining"
++msgstr "Sisa masa penyewaan"
++
++msgid "Leave empty to autodetect"
++msgstr ""
++
++msgid "Leave empty to use the current WAN address"
++msgstr ""
++
++msgid "Legend:"
++msgstr ""
++
++msgid "Limit"
++msgstr "Batas"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Link Pada"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++
++msgid "Listening port for inbound DNS queries"
++msgstr ""
++
++msgid "Load"
++msgstr "Load"
++
++msgid "Load Average"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Local IPv4 address"
++msgstr ""
++
++msgid "Local IPv6 address"
++msgstr ""
++
++msgid "Local Startup"
++msgstr ""
++
++msgid "Local Time"
++msgstr "Masa Tempatan"
++
++msgid "Local domain"
++msgstr ""
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr ""
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr "Soalan tempatan"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr ""
++
++msgid "Log queries"
++msgstr "Log soalan"
++
++msgid "Logging"
++msgstr ""
++
++msgid "Login"
++msgstr "Login"
++
++msgid "Logout"
++msgstr "Logout"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr ""
++
++msgid "MAC-Address Filter"
++msgstr "Penapis alamat MAC"
++
++msgid "MAC-Filter"
++msgstr "Penapis MAC"
++
++msgid "MAC-List"
++msgstr "Senarai MAC"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr ""
++
++msgid "MHz"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Rate Maksimum"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr ""
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr ""
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++
++#, fuzzy
++msgid "Maximum hold time"
++msgstr "Memegang masa maksimum"
++
++msgid "Maximum number of leased addresses."
++msgstr ""
++
++msgid "Mbit/s"
++msgstr ""
++
++msgid "Memory"
++msgstr "Memori"
++
++msgid "Memory usage (%)"
++msgstr "Penggunaan Memori (%)"
++
++msgid "Metric"
++msgstr "Metrik"
++
++msgid "Minimum Rate"
++msgstr "Rate Minimum"
++
++#, fuzzy
++msgid "Minimum hold time"
++msgstr "Memegang masa minimum"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr ""
++
++msgid "Mode"
++msgstr "Mode"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Alat modem"
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr ""
++
++msgid "Mount Point"
++msgstr "Mount Point"
++
++msgid "Mount Points"
++msgstr "Mount Points"
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Mount Points menentukan di mana titik peranti memori akan melekat pada fail "
++"sistem"
++
++msgid "Mount options"
++msgstr ""
++
++msgid "Mount point"
++msgstr ""
++
++msgid "Mounted file systems"
++msgstr "Mounted fail sistems"
++
++msgid "Move down"
++msgstr ""
++
++msgid "Move up"
++msgstr ""
++
++msgid "Multicast Rate"
++msgstr "Multicast Rate"
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr ""
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Nama"
++
++msgid "Name of the new interface"
++msgstr ""
++
++msgid "Name of the new network"
++msgstr "Nama rangkaian baru"
++
++msgid "Navigation"
++msgstr "Navigation"
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr "Rangkaian"
++
++msgid "Network Utilities"
++msgstr ""
++
++msgid "Network boot image"
++msgstr ""
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr "Kemudian »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr ""
++
++msgid "No chains in this table"
++msgstr "Tiada rantai dalam jadual ini"
++
++msgid "No files found"
++msgstr ""
++
++msgid "No information available"
++msgstr ""
++
++msgid "No negative cache"
++msgstr ""
++
++msgid "No network configured on this device"
++msgstr ""
++
++msgid "No network name specified"
++msgstr ""
++
++msgid "No package lists available"
++msgstr ""
++
++msgid "No password set!"
++msgstr ""
++
++msgid "No rules in this chain"
++msgstr "Tidak ada peraturan dalam rantai ini"
++
++msgid "No zone assigned"
++msgstr ""
++
++msgid "Noise"
++msgstr "Kebisingan"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "Normal"
++msgstr ""
++
++msgid "Not Found"
++msgstr ""
++
++msgid "Not associated"
++msgstr ""
++
++msgid "Not connected"
++msgstr ""
++
++msgid "Note: Configuration files will be erased."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Nslookup"
++msgstr ""
++
++msgid "OK"
++msgstr "Baik"
++
++msgid "OPKG-Configuration"
++msgstr "OPKG-Konfigurasi"
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Pada halaman ini anda boleh mengkonfigurasi antara muka rangkaian. Anda "
++"boleh menjembatani beberapa antara muka dengan menanda jambatan antara muka "
++"gelanggang dan masukkan beberapa nama antara muka rangkaian dipisahkan "
++"dengan ruang. Anda juga boleh menggunakan antara muka VLAN notasi. Seperti "
++"eth0.1."
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++
++msgid "One or more fields contain invalid values!"
++msgstr ""
++
++msgid "One or more required fields have no value!"
++msgstr ""
++
++msgid "Open list..."
++msgstr ""
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr ""
++
++msgid "Option removed"
++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 "Options"
++msgstr "Pilihan"
++
++msgid "Other:"
++msgstr ""
++
++msgid "Out"
++msgstr "Keluar"
++
++msgid "Outbound:"
++msgstr ""
++
++msgid "Outdoor Channels"
++msgstr "Saluran Outdoor"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr "Keseluruhan"
++
++msgid "Owner"
++msgstr "Pemilik"
++
++msgid "PAP/CHAP password"
++msgstr ""
++
++msgid "PAP/CHAP username"
++msgstr ""
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr ""
++
++msgid "PPP"
++msgstr ""
++
++msgid "PPPoA Encapsulation"
++msgstr "Pengkapsulan PPPoA"
++
++msgid "PPPoATM"
++msgstr ""
++
++msgid "PPPoE"
++msgstr ""
++
++msgid "PPtP"
++msgstr ""
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Package lists are older than 24 hours"
++msgstr ""
++
++msgid "Package name"
++msgstr "Nama pakej"
++
++msgid "Packets"
++msgstr "Paket"
++
++msgid "Part of zone %q"
++msgstr ""
++
++msgid "Password"
++msgstr "Kata laluan"
++
++msgid "Password authentication"
++msgstr "Kata laluan pengesahan"
++
++msgid "Password of Private Key"
++msgstr "Kata Laluan Kunci Swasta"
++
++msgid "Password successfully changed!"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr "Path ke CA-Sijil"
++
++msgid "Path to Client-Certificate"
++msgstr ""
++
++msgid "Path to Private Key"
++msgstr "Path ke Kunci Swasta"
++
++msgid "Path to executable which handles the button event"
++msgstr "Path ke eksekusi yang mengendalikan acara butang"
++
++msgid "Peak:"
++msgstr ""
++
++msgid "Perform reboot"
++msgstr "Lakukan reboot"
++
++msgid "Perform reset"
++msgstr ""
++
++msgid "Phy Rate:"
++msgstr ""
++
++msgid "Physical Settings"
++msgstr "Tetapan Fizikal"
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr "Pkts."
++
++msgid "Please enter your username and password."
++msgstr "Sila masukkan username dan kata laluan anda."
++
++msgid "Policy"
++msgstr "Dasar"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Port %d"
++msgstr ""
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr ""
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr "Mencegah komunikasi sesama Pelanggan"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr "Teruskan"
++
++msgid "Processes"
++msgstr "Proses"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protokol"
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Protocol of the new interface"
++msgstr ""
++
++msgid "Protocol support is not installed"
++msgstr ""
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr ""
++
++msgid "RTS/CTS Threshold"
++msgstr "RTS/CTS-Ambang"
++
++# Ein / Aus, eingehend / ausgehend?
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr ""
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr ""
++
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr ""
++
++msgid "Realtime Connections"
++msgstr ""
++
++msgid "Realtime Graphs"
++msgstr ""
++
++msgid "Realtime Load"
++msgstr ""
++
++msgid "Realtime Traffic"
++msgstr ""
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr "Reboot"
++
++msgid "Rebooting..."
++msgstr ""
++
++msgid "Reboots the operating system of your device"
++msgstr "Reboot sistem operasi peranti anda"
++
++msgid "Receive"
++msgstr "Menerima"
++
++msgid "Receiver Antenna"
++msgstr "Antena Penerima"
++
++msgid "Reconnect this interface"
++msgstr ""
++
++msgid "Reconnecting interface"
++msgstr ""
++
++msgid "References"
++msgstr "Rujukan"
++
++msgid "Regulatory Domain"
++msgstr "Peraturan Domain"
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr ""
++
++msgid "Remove"
++msgstr "Menghapuskan"
++
++msgid "Repeat scan"
++msgstr "Ulangi scan"
++
++msgid "Replace entry"
++msgstr "Tukar entri"
++
++msgid "Replace wireless configuration"
++msgstr ""
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++
++msgid "Reset"
++msgstr "Reset"
++
++msgid "Reset Counters"
++msgstr "Reset Loket"
++
++msgid "Reset to defaults"
++msgstr ""
++
++msgid "Resolv and Hosts Files"
++msgstr ""
++
++msgid "Resolve file"
++msgstr ""
++
++msgid "Restart"
++msgstr ""
++
++msgid "Restart Firewall"
++msgstr "Restart Firewall"
++
++msgid "Restore backup"
++msgstr "Kembalikan sandaran"
++
++msgid "Reveal/hide password"
++msgstr ""
++
++msgid "Revert"
++msgstr "Kembali"
++
++msgid "Root"
++msgstr ""
++
++msgid "Root directory for files served via TFTP"
++msgstr ""
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr ""
++
++msgid "Routes"
++msgstr "Laluan"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Laluan menentukan di mana interface dan gateway host atau rangkaian tertentu "
++"yang boleh dicapai."
++
++msgid "Rule #"
++msgstr "Peraturan #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr ""
++
++msgid "SSH-Keys"
++msgstr ""
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Simpan"
++
++msgid "Save & Apply"
++msgstr "Simpan & Melaksanakan"
++
++msgid "Save &#38; Apply"
++msgstr ""
++
++msgid "Scan"
++msgstr "Scan"
++
++msgid "Scheduled Tasks"
++msgstr "Tugas Jadual"
++
++msgid "Section added"
++msgstr ""
++
++msgid "Section removed"
++msgstr ""
++
++msgid "See \"mount\" manpage for details"
++msgstr "Rujuk \"mount\" laman manual untuk detail"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr "Pisahkan Pelanggan"
++
++msgid "Separate WDS"
++msgstr "Pisahkan WDS"
++
++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 ""
++
++msgid "Service Type"
++msgstr ""
++
++msgid "Services"
++msgstr "Perkhidmatan"
++
++msgid "Set up Time Synchronization"
++msgstr ""
++
++msgid "Setup DHCP Server"
++msgstr ""
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr ""
++
++msgid "Shutdown this network"
++msgstr ""
++
++msgid "Signal"
++msgstr "Isyarat"
++
++msgid "Signal:"
++msgstr ""
++
++msgid "Size"
++msgstr "Saiz"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "Skip"
++
++msgid "Skip to content"
++msgstr "Skip ke kadar"
++
++msgid "Skip to navigation"
++msgstr "Skip ke navigation"
++
++msgid "Slot time"
++msgstr "Slot masa"
++
++msgid "Software"
++msgstr "Perisian"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr ""
++
++msgid "Sorry, the object you requested was not found."
++msgstr ""
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr ""
++
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++
++msgid "Sort"
++msgstr ""
++
++msgid "Source"
++msgstr "Sumber"
++
++msgid "Source routing"
++msgstr ""
++
++#, fuzzy
++msgid "Specifies the button state to handle"
++msgstr "Menentukan state butang untuk melaku"
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr ""
++
++msgid "Start"
++msgstr "Mula"
++
++msgid "Start priority"
++msgstr ""
++
++msgid "Startup"
++msgstr ""
++
++msgid "Static IPv4 Routes"
++msgstr "Laluan IPv4 Statik"
++
++msgid "Static IPv6 Routes"
++msgstr "Laluan IPv6 Statik"
++
++msgid "Static Leases"
++msgstr "Statische Einträge"
++
++msgid "Static Routes"
++msgstr "Laluan Statik"
++
++msgid "Static WDS"
++msgstr ""
++
++msgid "Static address"
++msgstr ""
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Stop"
++msgstr ""
++
++msgid "Strict order"
++msgstr "Order Ketat"
++
++msgid "Submit"
++msgstr "Menyerahkan"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr ""
++
++msgid "Switch"
++msgstr "Beralih"
++
++msgid "Switch %q"
++msgstr ""
++
++msgid "Switch %q (%s)"
++msgstr ""
++
++msgid "Switch protocol"
++msgstr ""
++
++msgid "Sync with browser"
++msgstr ""
++
++msgid "Synchronizing..."
++msgstr ""
++
++msgid "System"
++msgstr "Sistem"
++
++msgid "System Log"
++msgstr "Log Sistem"
++
++msgid "System Properties"
++msgstr ""
++
++msgid "System log buffer size"
++msgstr ""
++
++msgid "TCP:"
++msgstr ""
++
++msgid "TFTP Settings"
++msgstr ""
++
++msgid "TFTP server root"
++msgstr ""
++
++# same as RX
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr ""
++
++msgid "Table"
++msgstr "Meja"
++
++msgid "Target"
++msgstr "Sasaran"
++
++msgid "Terminate"
++msgstr "Menamatkan"
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++"Karakter yang diizinkan adalah: <code>A-Z</code>, <code>a-z</code>, "
++"<code>0-9</code> dan <code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr "Fail peranti memori atau partisyen, (contohnya: /dev/sda)"
++
++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 "Failsistem yang digunakan untuk memformat memori (contohnya: ext3)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++"Fail gambar flash telah di-upload. Berikut ini adalah checksum dan saiz fail "
++"yang berdaftar, membandingkannya dengan fail gambar asli untuk memastikan "
++"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"
++
++msgid "The following rules are currently active on this system."
++msgstr "Peraturan berikut sedang aktif pada sistem ini."
++
++msgid "The given network name is not unique"
++msgstr ""
++
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr ""
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"Sistem ini sekarang mula flash.<br /> JANGAN TUTUP KUASA UNTUK PERANTI!<br /"
++"> Tunggu beberapa minit sehingga anda cuba untuk menyambung kembali. Mungkin "
++"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."
++msgstr ""
++"Format Fail gambar yang diupload tidak disokongkan. Pastikan anda memilih "
++"fail format gambar yang generik untuk platform anda."
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "There are no pending changes to apply!"
++msgstr ""
++
++msgid "There are no pending changes to revert!"
++msgstr ""
++
++msgid "There are no pending changes!"
++msgstr ""
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr "Ini adalah DHCP hanya dalam rangkaian tempatan."
++
++msgid "This is the plain username for logging into the account"
++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 ""
++"Ini adalah crontab sistem di mana tugas-tugas yang dijadualkan boleh "
++"ditakrifkan."
++
++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 ""
++"Senarai ini memberikan gambaran lebih pada proses sistem yang sedang "
++"berjalan dan statusnya."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr "Laman ini membolehkan konfigurasi butang tindakan peribadi"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++"Laman ini memberikan gambaran lebih dari saat ini sambungan rangkaian yang "
++"aktif."
++
++msgid "This section contains no values yet"
++msgstr "Bahagian ini belum mengandungi nilai-nilai lagi"
++
++msgid "Time Synchronization"
++msgstr ""
++
++msgid "Time Synchronization is not configured yet."
++msgstr ""
++
++msgid "Timezone"
++msgstr "Zon masa"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++
++msgid "Total Available"
++msgstr ""
++
++msgid "Traceroute"
++msgstr ""
++
++msgid "Traffic"
++msgstr "Lalu lintas"
++
++msgid "Transfer"
++msgstr "Pemindahan"
++
++msgid "Transmission Rate"
++msgstr "Kelajuan Penghantaran"
++
++msgid "Transmit"
++msgstr "Pancar"
++
++msgid "Transmit Power"
++msgstr "Daya Pancar"
++
++msgid "Transmitter Antenna"
++msgstr "Antena Pemancar"
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr ""
++
++msgid "Tunnel Interface"
++msgstr ""
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Mod Turbo"
++
++msgid "Tx-Power"
++msgstr ""
++
++msgid "Type"
++msgstr "Jenis"
++
++msgid "UDP:"
++msgstr ""
++
++msgid "UMTS only"
++msgstr ""
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr ""
++
++msgid "USB Device"
++msgstr ""
++
++msgid "UUID"
++msgstr ""
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "Unknown Error, password not changed!"
++msgstr ""
++
++msgid "Unmanaged"
++msgstr ""
++
++msgid "Unsaved Changes"
++msgstr "Perubahan yang belum disimpan"
++
++msgid "Unsupported protocol type."
++msgstr ""
++
++msgid "Update lists"
++msgstr ""
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr ""
++
++msgid "Uploaded File"
++msgstr "Uploaded Fail"
++
++msgid "Uptime"
++msgstr "Masa Aktif"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Guna /etc/ethers"
++
++msgid "Use DHCP gateway"
++msgstr ""
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr ""
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr ""
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr ""
++
++msgid "Use default gateway"
++msgstr ""
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr ""
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr "Diguna"
++
++msgid "Used Key Slot"
++msgstr ""
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Username"
++
++msgid "VC-Mux"
++msgstr ""
++
++msgid "VLAN Interface"
++msgstr ""
++
++msgid "VLANs on %q"
++msgstr ""
++
++msgid "VLANs on %q (%s)"
++msgstr ""
++
++msgid "VPN Server"
++msgstr ""
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr "Versi"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr ""
++
++msgid "WEP Shared Key"
++msgstr ""
++
++msgid "WEP passphrase"
++msgstr ""
++
++msgid "WMM Mode"
++msgstr "WMM Mod"
++
++msgid "WPA passphrase"
++msgstr ""
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless Adapter"
++msgstr "Adapter Wayarles"
++
++msgid "Wireless Network"
++msgstr "Rangkaian Wayarles"
++
++msgid "Wireless Overview"
++msgstr "Gambaran keseluruhan Wayarles"
++
++msgid "Wireless Security"
++msgstr "Keselamatan WLAN"
++
++msgid "Wireless is disabled or not associated"
++msgstr ""
++
++msgid "Wireless is restarting..."
++msgstr ""
++
++msgid "Wireless network is disabled"
++msgstr ""
++
++msgid "Wireless network is enabled"
++msgstr ""
++
++msgid "Wireless restarted"
++msgstr ""
++
++msgid "Wireless shut down"
++msgstr ""
++
++msgid "Write received DNS requests to syslog"
++msgstr ""
++
++msgid "XR Support"
++msgstr "Sokongan XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++
++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 ""
++
++msgid "any"
++msgstr ""
++
++msgid "auto"
++msgstr "auto"
++
++msgid "automatic"
++msgstr "automatik"
++
++msgid "baseT"
++msgstr ""
++
++msgid "bridged"
++msgstr ""
++
++msgid "create:"
++msgstr ""
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "mencipta jambatan di antara muka tertentu"
++
++msgid "dB"
++msgstr ""
++
++msgid "dBm"
++msgstr ""
++
++msgid "disable"
++msgstr "mematikan"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr "fail dimana DHCP-sewa akan disimpan"
++
++msgid "forward"
++msgstr ""
++
++msgid "full-duplex"
++msgstr ""
++
++msgid "half-duplex"
++msgstr ""
++
++msgid "help"
++msgstr "Membantu"
++
++msgid "hidden"
++msgstr ""
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "jika target itu ialah rangkaian"
++
++msgid "input"
++msgstr ""
++
++msgid "kB"
++msgstr ""
++
++msgid "kB/s"
++msgstr ""
++
++msgid "kbit/s"
++msgstr ""
++
++msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
++msgstr "Fail DNS tempatan"
++
++msgid "minimum 1280, maximum 1480"
++msgstr ""
++
++msgid "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "no link"
++msgstr ""
++
++msgid "none"
++msgstr "tidak ada"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr ""
++
++msgid "on"
++msgstr ""
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr ""
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "unlimited"
++msgstr ""
++
++msgid "unspecified"
++msgstr ""
++
++msgid "unspecified -or- create:"
++msgstr "Tidak dirinci -atau- buat:"
++
++msgid "untagged"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++msgid "« Back"
++msgstr "« Kembali"
++
++#~ msgid "Path"
++#~ msgstr "Path"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Sila tunggu: Peranti sedang reboot..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr "Amaran: Ada perubahan yang belum disimpan akan hilang saat reboot!"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Melompat Frekuensi"
++
++#~ msgid "Active Leases"
++#~ msgstr "Penyewaan Aktif"
++
++#~ msgid "MAC"
++#~ msgstr "Alamat MAC"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Disulitkan\">Vers.</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "WLAN-Scan"
++
++#~ msgid "Create Network"
++#~ msgstr "Buat Jaringan"
++
++#~ msgid "Link"
++#~ msgstr "Link"
++
++#~ msgid "Networks"
++#~ msgstr "Rangkaian"
++
++#~ msgid "Power"
++#~ msgstr "Daya"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Rangkaian wifi di lingkungan tempatan"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr "CIDR-Notation: Adresse/Prefix"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "DNS-Server"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "IPv4-Siaran"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "IPv6-Alamat"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "Setup IPv6"
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "Rangkaian port pada router anda boleh digabungkan untuk beberapa VLAN di "
++#~ "mana komputer dapat berkomunikasi secara langsung dengan satu sama lain. "
++#~ "VLAN sering digunakan untuk memisahkan segmen rangkaian yang berbeza. "
++#~ "Seringkali ada secara default satu port Uplink untuk sambungan kepada "
++#~ "rangkaian yang lebih besar seterusnya seperti internet dan port lain "
++#~ "untuk rangkaian tempatan."
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Fail yang akan disimpan saat flash firmware baru"
++
++#~ msgid "General"
++#~ msgstr "Umum"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr "Di sini anda boleh melaraskan tetapan dan fungsi Luci"
++
++#~ msgid "Post-commit actions"
++#~ msgstr "UCI-komit tindakan"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Perintah-perintah ini akan dijalankan secara automatik apabila tatarajah "
++#~ "UCI diberikan komited membolehkan perubahan yang akan diterapkan langsung."
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Antarmuka pengguna Web"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Pusat akses (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Pilihan Tambahan Pppd"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Pemutusan automatik"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Arkib Sandaran"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Mengkonfigurasi pelayan DNS tempatan untuk menggunakan pelayan nama "
++#~ "diiklan oleh rakan PPP"
++
++#~ msgid "Connect script"
++#~ msgstr "Menyambung script"
++
++#~ msgid "Create backup"
++#~ msgstr "Buat Sandaran"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Putuskan naskah"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Edit senarai pakej dan target pemasangan"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Aktifkan IPv6 di PPP link"
++
++#~ msgid "Firmware image"
++#~ msgstr "Gambar Firmware"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Di sini anda boleh sandaran dan mengembalikan konfigurasi router dan - "
++#~ "jika mungkin - Reset router ke tetapan lalai."
++
++#~ msgid "Installation targets"
++#~ msgstr "Target pemasangan"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Simpan fail konfigurasi"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Keep-Alive"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Biarkan pppd menggantikan laluan asal saat ini untuk menggunakan "
++#~ "antaramuka PPP selepas berjaya menyambung"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr "Biarkan pppd menjalankan naskah ini setelah menetapkan link PPP"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "Biarkan pppd menjalankan naskah ini sebelum menghancurkan link PPP"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Pastikan bahawa anda mempunyai kod pin yang sah. Kalau tidak anda mungkin "
++#~ "akan terkunci kad sim anda!"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "Kebanyakan dari mereka adalah pelayan rangkaian, yang menawarkan "
++#~ "perkhidmatan tertentu untuk peranti anda atau rangkaian seperti akses "
++#~ "shell, melayani laman web seperti LuCI, melakukan mesh routing, "
++#~ "menghantar e-mel, dan lain-lain"
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr ""
++#~ "Jumlah ujian sambungan gagal sebelum memulakan semula sambungan automatik"
++
++#~ msgid "PIN code"
++#~ msgstr "PIN-Code"
++
++#~ msgid "PPP Settings"
++#~ msgstr "Tetapan PPP"
++
++#~ msgid "Package lists"
++#~ msgstr "Senarai pakej"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr "Teruskan mengembalikan semua tatacara dan ulang ke firmware asal?"
++
++#~ msgid "Processor"
++#~ msgstr "Processor"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Radius-Port"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Radius-Server"
++
++#~ msgid "Replace default route"
++#~ msgstr "Tukar laluan asal"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Reset router ke tetapan lalai"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr ""
++#~ "Detik untuk menunggu modem bersedia sebelum mencuba untuk menyambung"
++
++#~ msgid "Service type"
++#~ msgstr "Jenis Perkhidmatan"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr ""
++#~ "Perkhidmatan dan daemon melakukan tugas tertentu dalam peranti anda."
++
++#~ msgid "Settings"
++#~ msgstr "Tetapan"
++
++#~ msgid "Setup wait time"
++#~ msgstr "Menetapkan masa menunggu"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Maafkan. OpenWRT tidak menyokong meningkatkan sistem pada peron ini. <br /"
++#~ ">Anda perlu flash peranti anda secara manual."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr "Tentukan arahan tambahan untuk pppd di sini"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "Node peranti modem anda, contohnya /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr ""
++#~ "Waktu (dalam detik) selepas mana sambungan yang tidak terpakai akan "
++#~ "ditutup"
++
++#~ msgid "Update package lists"
++#~ msgstr "Mengemas kini senarai pakej"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "Upload fail gambar OpenWRT untuk flash semula peranti."
++
++#~ msgid "Upload image"
++#~ msgstr "Upload fail gambar"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "Guna rakan DNS"
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Anda perlu memasang \"comgt\" untuk UMTS/GPRS, \"ppp-mod-pppoe\" untuk "
++#~ "PPPoE, \"ppp-mod-pppoa\" untuk PPPoA atau \"pptp\" untuk sokongan PPtP"
++
++#~ msgid "back"
++#~ msgstr "kembali"
++
++#~ msgid "buffered"
++#~ msgstr "buffer"
++
++#~ msgid "cached"
++#~ msgstr "cache"
++
++#~ msgid "free"
++#~ msgstr "Membebaskan"
++
++#~ msgid "static"
++#~ msgstr "statik"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "Luci adalah kumpulan perisian bebas Lua termasuk MVC-Kerangka dan muka "
++#~ "web untuk peranti embedded. LuCI di lesen Lesen Apache."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "SSH-Kunci"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "Sebuah webserver HTTP/1.1 ringan ditulis dalam C dan Lua direka untuk "
++#~ "melayani Luci"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Sebuah webserver kecil yang boleh digunakan untuk melayani muka "
++#~ "Konfigurasi Lua LuCI"
++
++#~ msgid "About"
++#~ msgstr "Tentang"
++
++#~ msgid "Addresses"
++#~ msgstr "Alamat"
++
++#~ msgid "Admin Password"
++#~ msgstr "Kata Laluan Admin"
++
++#~ msgid "Alias"
++#~ msgstr "Alias"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Anmeldeaufforderung"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Bridge Port"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr "Mengubah kata laluan sistem pentadbir (User \"root\")"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Pelanggan + WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "fail konfigurasi"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Sambungan timeout"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Menyumbang Pengembang"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "DHCP ditugaskan"
++
++#~ msgid "Document root"
++#~ msgstr "Dokumen root"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Aktifkan Keep-Alive"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "Jambatan Ethernet"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr "Di sini anda boleh memasukkan kunci awam SSH untuk pengesahan."
++
++#~ msgid "ID"
++#~ msgstr "ID"
++
++#~ msgid "IP Configuration"
++#~ msgstr "Konfigurasi IP"
++
++#~ msgid "Interface Status"
++#~ msgstr "Status Interface"
++
++#~ msgid "Lead Development"
++#~ msgstr "Pemimpin Pengembangan"
++
++#~ msgid "Master"
++#~ msgstr "Master"
++
++#~ msgid "Master + WDS"
++#~ msgstr "Master + WDS"
++
++#~ msgid "Not configured"
++#~ msgstr "Belum dikonfigurasikan"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Kata laluan berjaya ditukar"
++
++#~ msgid "Plugin path"
++#~ msgstr "Tunjuk locasi Plugin"
++
++#~ msgid "Ports"
++#~ msgstr "Ports"
++
++#~ msgid "Primary"
++#~ msgstr "Primary"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Tapak Web Projek"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "Pseudo-Ad-Hoc (Atheros)"
++
++#~ msgid "STP"
++#~ msgstr "Spanning-Tree-Protokol"
++
++#~ msgid "Thanks To"
++#~ msgstr "Terima Kasih kepada"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr ""
++#~ "Wilayah yang akan dipaparkan di pengesahan prompt untuk laman yang "
++#~ "dilindungi."
++
++#~ msgid "Unknown Error"
++#~ msgstr "Kesalahan tidak diketahui"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "defaultnya <code>/etc/httpd.conf</code>"
++
++#~ msgid "OPKG error code %i"
++#~ msgstr "OPKG kod kesalahan %i"
++
++#~ msgid "Package lists updated"
++#~ msgstr "Senarai pakej dikemaskini"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Mengemas kini pakej dipasang"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "kernel atau perkhidmatan logfiles yang juga dapat dilihat di sini untuk "
++#~ "mendapatkan gambaran atassituasi kini."
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "Di sini anda dapat mencari maklumat tentang sistem saat ini status "
++#~ "seperti frekuensi masa CPU, penggunaan memori atau antara muka rangkaian "
++#~ "data."
++
++#~ msgid "Search file..."
++#~ msgstr "Cari fail ..."
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "LuCI adalah percuma, fleksibel, dan mempunyai muka pengguna grafik yang "
++#~ "ramah untuk mengkonfigurasikan OpenWRT Kamikaze."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "Nikmati router anda!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "Kami ingin selalu memperbaiki interface ini, kita berharap memperolehi "
++#~ "tanggapan dan cadangan anda"
++
++#~ msgid "Hello!"
++#~ msgstr "Halo!"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Perhatikan: Pada perubahan Luci harus disahkan dengan mengklik Laman - "
++#~ "Simpan &amp; terap sebelum perubahan diterapkan"
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "Pada halaman berikut, anda boleh menetapkan semua tatacara penting dari "
++#~ "router anda."
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr "Pasukan LuCI"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr "Ini adalah wilayah pentadbiran LuCI."
++
++#~ msgid "User Interface"
++#~ msgstr "Antara muka pengguna"
++
++#~ msgid "enable"
++#~ msgstr "membolehkan"
++
++#~ msgid "(hidden)"
++#~ msgstr "(tersembunyi)"
++
++#~ msgid "(optional)"
++#~ msgstr "(pilihan)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "DNS-Port"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "DNS-Pelayan akan dipertanyakan pada urutan menyelesaikan jumlah fail"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr "maksimum DHCP untuk disewa"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Extension Mechanisms "
++#~ "for Domain Name System\">EDNS0</abbr> packet size"
++#~ msgstr ""
++#~ "maksimum <abbr title=\"Mekanisme perpanjangan untuk DNS\">EDNS.0</abbr> "
++#~ "saiz paket"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "AP-Isolasi"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "Tambah rangkaian Wifi ke rangkaian fizikal"
++
++#~ msgid "Aliases"
++#~ msgstr "Aliases"
++
++#~ msgid "Attach to existing network"
++#~ msgstr "Lampir rangkaian yang ada"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Saiz Klip Segmen"
++
++#, fuzzy
++#~ msgid "Create Or Attach Network"
++#~ msgstr "Buat Atau Lampir Rangkaian"
++
++#~ msgid "DHCP"
++#~ msgstr "DHCP"
++
++#~ msgid "Devices"
++#~ msgstr "Alat"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "Jangan hantar reverse lookup untuk rangkaian tempatan"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "Aktifkan Tftp Server"
++
++#~ msgid "Errors"
++#~ msgstr "Kesalahan"
++
++#~ msgid "Essentials"
++#~ msgstr "Keperluan"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Memperluaskan Host"
++
++#~ msgid "First leased address"
++#~ msgstr "Alamat sewaan pertama"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Perbaikan masalah hubungan dengan laman web, menghantar bentuk atau "
++#~ "lainnya perilaku ISP yang tak terduga."
++
++#~ msgid "Hardware Address"
++#~ msgstr "Alamat Peranti"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "Di sini anda boleh mengkonfigurasi peranti wifi dipasang."
++
++#~ msgid ""
++#~ "If the interface is attached to an existing network it will be "
++#~ "<em>bridged</em> to the existing interfaces and is covered by the "
++#~ "firewall zone of the choosen network.<br />Uncheck the attach option to "
++#~ "define a new standalone network for this interface."
++#~ msgstr ""
++#~ "Jika antara muka dipasang ke rangkaian yang ada akan dijembatani kepada "
++#~ "antara muka yang ada dan ditutupi oleh zon firewall dari rangkaian yang "
++#~ "dipilih. Hapus tanda pada pilihan untuk menentukan melampirkan rangkaian "
++#~ "mandiri baru untuk antara muka ini."
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "(Ad-Hoc) Tersendiri"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Sambungan Internet"
++
++#~ msgid "Join (Client)"
++#~ msgstr "Gabung dengan (Client)"
++
++#~ msgid "Leases"
++#~ msgstr "Penyewaan"
++
++#~ msgid "Local Domain"
++#~ msgstr "Domain Tempatan"
++
++#~ msgid "Local Network"
++#~ msgstr "Rangkaian Tempatan"
++
++#~ msgid "Local Server"
++#~ msgstr "Server Tempatan"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "Boot fail gambar rangkaian"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr "Nama Rangkaian (ESSID)"
++
++#~ msgid "Network to attach interface to"
++#~ msgstr "Rangkaian untuk melampirkan antara muka ke"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "Jumlah alamat disewakan"
++
++#~ msgid "Perform Actions"
++#~ msgstr "Lakukan Tindakan"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "Mencegah komunikasi sesama Pelanggan"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "Menyediakan (Access Point)"
++
++#~ msgid "Resolvfile"
++#~ msgstr "Resolvfail"
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "TFTP-Server Root"
++
++#~ msgid "TX / RX"
++#~ msgstr "TX / RX"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "Laman berikut telah dilaksanakan"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "Ketika flash firmware baru dengan LuCI semua fail akan ditambah ketika "
++#~ "pemasangan firmware baru."
++
++#~ msgid "Wireless Scan"
++#~ msgstr "WLAN-Scan"
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "Dengan rangkaian <abbr title=\"Dynamic Host Configuration Protocol"
++#~ "\">DHCP</abbr> ahli boleh menerima tetapan rangkaian Alamat-<abbr title="
++#~ "\"Internet Protocol\">IP</abbr>, Awalan, Pelayan-<abbr title=\"Domain "
++#~ "Name System\">DNS</abbr>, dan lain-lain secara automatik"
++
++#~ msgid ""
++#~ "You are about to join the wireless network <em><strong>%s</strong></em>. "
++#~ "In order to complete the process, you need to provide some additional "
++#~ "details."
++#~ msgstr ""
++#~ "Anda akan menyertai rangkaian wayarles <em><strong>%s</strong></em>.Untuk "
++#~ "melengkapkan proses, anda perlu memberi beberapa butiran tambahan."
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "Anda boleh menjalankan beberapa rangkaian wifi dengan satu peranti. Perlu "
++#~ "diketahui bahawa ada peranti keras tertentu dan sekatan driverspecific. "
++#~ "Biasanya anda boleh beroperasi 1 Ad-Hoc atau sampai dengan 3 Master-Mode "
++#~ "dan 1 Client-Mode rangkaian secara serentak."
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "Anda perlu memasang \"ppp-mod-pppoe\" untuk PPPoE atau \"pptp\" untuk "
++#~ "sokongan PPtP"
++
++#~ msgid ""
++#~ "You need to install <a href='%s'><em>wpa-supplicant</em></a> to use WPA!"
++#~ msgstr ""
++#~ "Anda perlu memasang <a href='%s'><em>pemohan-wpa</em></a> untuk "
++#~ "menggunakan WPA!"
++
++#~ msgid ""
++#~ "You need to install the <a href='%s'>Broadcom <em>nas</em> supplicant</a> "
++#~ "to use WPA!"
++#~ msgstr ""
++#~ "Anda perlu memasang pemohan <a href='%s'>Broadcom <em>nas</em> untuk "
++#~ "menggunakan WPA!"
++
++#~ msgid "Zone"
++#~ msgstr "Zon"
++
++#~ msgid "additional hostfile"
++#~ msgstr "tambahan hostfail"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr "Menambah nama domain ke hostentries di resolv fail"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "menyambung semula secara automatik"
++
++#~ msgid "concurrent queries"
++#~ msgstr "konkuren query"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr "mematikan DHCP untuk antara muka ini"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "menamatkan sambungan apabila diam selama"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "jangan cache yang tidak diketahui"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr "menapis soalan-DNS yang tidak berguna untuk Windows-sistem"
++
++#~ msgid "installed"
++#~ msgstr "dipasang"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "Menempatkan nama host yang bergantung pada subnetnya"
++
++#~ msgid "manual"
++#~ msgstr "manual"
++
++#~ msgid "not installed"
++#~ msgstr "tidak dipasang"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr "mencegah caching untuk balasan negatif dari DNS"
++
++#~ msgid "query port"
++#~ msgstr "penyoalan port"
++
++#~ msgid "transmitted / received"
++#~ msgstr "dihantar / diterima"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "Gabung rangkaian"
++
++#~ msgid "all"
++#~ msgstr "semua"
++
++#~ msgid "Code"
++#~ msgstr "Kod"
++
++#~ msgid "Distance"
++#~ msgstr "Jarak"
++
++#~ msgid "Legend"
++#~ msgstr "Legenda"
++
++#~ msgid "Library"
++#~ msgstr "Perpustakaan"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "Rujuk &#39;%s&#39; manpage"
++
++#~ msgid "Package Manager"
++#~ msgstr "Pengurus-Paket"
++
++#~ msgid "Service"
++#~ msgstr "Servis"
++
++#~ msgid "Statistics"
++#~ msgstr "Statistik"
++
++#~ msgid "zone"
++#~ msgstr "Zon"
+diff --git a/feeds/luci/modules/luci-base/po/no/base.po b/feeds/luci/modules/luci-base/po/no/base.po
+new file mode 100644
+index 0000000..b571cbd
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/no/base.po
+@@ -0,0 +1,3997 @@
++msgid ""
++msgstr ""
++"PO-Revision-Date: 2013-03-25 23:36+0200\n"
++"Last-Translator: protx <lars.hardy@gmail.com>\n"
++"Language: no\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d minutters vindu, %d sekunds intervall)"
++
++msgid "(%s available)"
++msgstr "(%s Tilgjengelig)"
++
++msgid "(empty)"
++msgstr "(tom)"
++
++msgid "(no interfaces attached)"
++msgstr "(ingen grensesnitt tilknyttet)"
++
++msgid "-- Additional Field --"
++msgstr "-- Tilleggs Felt --"
++
++msgid "-- Please choose --"
++msgstr "-- Vennligst velg --"
++
++msgid "-- custom --"
++msgstr "-- egendefinert --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "1 minutts belastning:"
++
++msgid "15 Minute Load:"
++msgstr "15 minutters belastning:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "5 minutters belastning:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> spørre port"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servere skal følge rekkefølgen "
++"i oppslagsfilen ved spørringer"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Adresse"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Nettmaske"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Adresse eller "
++"Nettverk (CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Konfigurasjon"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Navn"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-Adresse"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"Maksimalt antall <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> leier"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"<abbr title=\"Maksimal\">Maks.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> pakke størrelse"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"Maksimal\">Maks.</abbr> samtidige spørringer"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Parvis: %s / Gruppe: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "<abbr title=\"Aksesspunkt Navn\">APN</abbr>"
++
++msgid "AR Support"
++msgstr "AR Støtte"
++
++msgid "ARP retry threshold"
++msgstr "APR terskel for nytt forsøk"
++
++msgid "ATM Bridges"
++msgstr "<abbr title=\"Asynchronous Transfer Mode\">ATM</abbr> Broer"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr ""
++"<abbr title=\"Asynchronous Transfer Mode\">ATM</abbr> Virtuell kanal "
++"identifikator <abbr title=\"Virtual Channel Identifier\">(VCI)</abbr>"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr ""
++"<abbr title=\"Asynchronous Transfer Mode\">ATM</abbr> Virtuell plasserings "
++"identifikator <abbr title=\"Virtual Path Identifier\">(VPI)</abbr>"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"ATM broer viser innkapslede ethernet i AAL5 forbindelser som virtuelle Linux-"
++"nettverk grensesnitt, dette kan brukes sammen med DHCP eller PPP for å koble "
++"seg mot en leverandørs nettverk."
++
++msgid "ATM device number"
++msgstr "<abbr title=\"Asynchronous Transfer Mode\">ATM</abbr> enhetsnummer"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Tilgangskonsentrator"
++
++msgid "Access Point"
++msgstr "Aksesspunkt"
++
++msgid "Action"
++msgstr "Handling"
++
++msgid "Actions"
++msgstr "Handlinger"
++
++msgid "Activate this network"
++msgstr "Aktiver dette nettverket"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "Aktive <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Ruter"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "Aktive <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Ruter"
++
++msgid "Active Connections"
++msgstr "Aktive Tilkoblinger"
++
++msgid "Active DHCP Leases"
++msgstr "Aktive DHCP Leier"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Aktive DHCPv6 Leier"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc (Uavhengig)"
++
++msgid "Add"
++msgstr "Legg til"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr "Legg det lokale domenesuffikset til navn utgitt fra vertsfiler"
++
++msgid "Add new interface..."
++msgstr "Legg til grensesnitt..."
++
++msgid "Additional Hosts files"
++msgstr "Tilleggs vertsfiler"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Adresse"
++
++msgid "Address to access local relay bridge"
++msgstr "Adresse for tilgang til lokal relébro"
++
++msgid "Administration"
++msgstr "Administrasjon"
++
++msgid "Advanced Settings"
++msgstr "Avanserte Innstillinger"
++
++msgid "Alert"
++msgstr "Varsle"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr "Tillat <abbr title=\"Secure Shell\">SSH</abbr> passord godkjenning"
++
++msgid "Allow all except listed"
++msgstr "Tillat alle unntatt oppførte"
++
++msgid "Allow listed only"
++msgstr "Tillat kun oppførte"
++
++msgid "Allow localhost"
++msgstr "Tillat lokalvert"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr "Tillat eksterne verter å koble til lokale SSH videresendt porter"
++
++msgid "Allow root logins with password"
++msgstr "Tillat root pålogginger med passord"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "Tillat bruker <em>root</em> å logge inn med passord"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr "Tillat oppstrøms svar i 127.0.0.0/8 nettet, f.eks for RBL tjenester"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "Et nytt nettverk vil bli opprettet hvis du tar bort haken."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antenne 1"
++
++msgid "Antenna 2"
++msgstr "Antenne 2"
++
++msgid "Antenna Configuration"
++msgstr "Antennekonfigurasjon"
++
++msgid "Any zone"
++msgstr "Alle soner"
++
++msgid "Apply"
++msgstr "Bruk"
++
++msgid "Applying changes"
++msgstr "Utfører endringer"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Tilknytt grensesnitt..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Tilkoblede Klienter"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Atheros 802.11%s Trådløs Kontroller"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Godkjenning"
++
++msgid "Authoritative"
++msgstr "Autoritativ"
++
++msgid "Authorization Required"
++msgstr "Autorisasjon er nødvendig"
++
++msgid "Auto Refresh"
++msgstr "Automatisk oppdatering"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Tilgjengelig"
++
++msgid "Available packages"
++msgstr "Tilgjengelige pakker"
++
++msgid "Average:"
++msgstr "Gjennomsnitt:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Tilbake"
++
++msgid "Back to Overview"
++msgstr "Tilbake til oversikt"
++
++msgid "Back to configuration"
++msgstr "Tilbake til konfigurasjon"
++
++msgid "Back to overview"
++msgstr "Tilbake til oversikt"
++
++msgid "Back to scan results"
++msgstr "Tilbake til skanne resultat"
++
++msgid "Background Scan"
++msgstr "Bakgrunns Skanning"
++
++msgid "Backup / Flash Firmware"
++msgstr "Sikkerhetskopiering/Firmware oppgradering"
++
++msgid "Backup / Restore"
++msgstr "Sikkerhetskopi/Gjenoppretting"
++
++msgid "Backup file list"
++msgstr "Sikkerhetskopier filliste"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"Nedenfor er listen med filer som blir sikkerthetskopiert. Listen består av "
++"konfigurasjonsfiler som er merket av opkg, essensielle enhets filer og andre "
++"filer valgt av bruker."
++
++msgid "Bitrate"
++msgstr "Bitrate"
++
++msgid "Bogus NX Domain Override"
++msgstr "Overstyr falske NX Domener"
++
++msgid "Bridge"
++msgstr "Bro"
++
++msgid "Bridge interfaces"
++msgstr "Sammenkoble grensesnitt"
++
++msgid "Bridge unit number"
++msgstr "Bro enhetsnummer"
++
++msgid "Bring up on boot"
++msgstr "Slå på ved oppstart"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Broadcom 802.11%s Trådløs Kontroller"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Broadcom BCM%04x 802.11 Trådløs Kontroller"
++
++msgid "Buffered"
++msgstr "Bufret"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Knapper"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "CPU forbruk (%)"
++
++msgid "Cancel"
++msgstr "Avbryt"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Lenke"
++
++msgid "Changes"
++msgstr "Endringer"
++
++msgid "Changes applied."
++msgstr "Endringer utført."
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "Endrer administrator passordet for tilgang til enheten"
++
++msgid "Channel"
++msgstr "Kanal"
++
++msgid "Check"
++msgstr "Kontroller"
++
++msgid "Checksum"
++msgstr "Kontrollsum"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Velg brannmur sonen du ønsker å knytte til dette grensesnittet. Velg "
++"<em>uspesifisert</em> for å fjerne grensesnittet fra den tilknyttede sonen. "
++"Eller fyll ut <em>Opprett</em> feltet for å definere en ny sone og tilknytte "
++"grensesnittet til det."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Velg det eller de nettverk du vil legge til dette trådløse grensesnittet, "
++"eller fyll ut <em>Opprett</em> feltet for å definere et nytt nettverk."
++
++msgid "Cipher"
++msgstr "Krypteringsmetode"
++
++msgid ""
++"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)."
++msgstr ""
++"Klikk \"Opprett arkiv\" for å laste ned et tar arkiv av de gjeldende "
++"konfigurasjons filer. For å nullstille firmwaren til opprinnelig tilstand, "
++"klikker du på \"Utfør nullstilling\" (kun mulig på squashfs firmwarer)."
++
++msgid "Client"
++msgstr "Klient"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "Klient ID som sendes ved DHCP spørring"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Lukk inaktiver tilkoblinger etter angitt antall sekunder, bruk 0 for en "
++"kontinuerlig tilkobling"
++
++msgid "Close list..."
++msgstr "Lukk liste..."
++
++msgid "Collecting data..."
++msgstr "Henter data..."
++
++msgid "Command"
++msgstr "Kommando"
++
++msgid "Common Configuration"
++msgstr "Vanlige Innstillinger"
++
++msgid "Compression"
++msgstr "Komprimering"
++
++msgid "Configuration"
++msgstr "Konfigurasjon"
++
++msgid "Configuration applied."
++msgstr "Konfigurasjons endring utført."
++
++msgid "Configuration files will be kept."
++msgstr "Konfigurasjonsfiler vil bli bevart."
++
++msgid "Confirmation"
++msgstr "Bekreftelse"
++
++msgid "Connect"
++msgstr "Koble til"
++
++msgid "Connected"
++msgstr "Tilkoblet"
++
++msgid "Connection Limit"
++msgstr "Tilkoblingsgrense (antall)"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr "Tilkoblinger"
++
++msgid "Country"
++msgstr "Land"
++
++msgid "Country Code"
++msgstr "Landskode"
++
++msgid "Cover the following interface"
++msgstr "Gjelder det følgende grensesnitt"
++
++msgid "Cover the following interfaces"
++msgstr "Gjelder de følgende grensesnitt"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Opprett/Tildel brannmur sone"
++
++msgid "Create Interface"
++msgstr "Opprett Grensesnitt"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Opprett en bro over flere grensesnitt"
++
++msgid "Critical"
++msgstr "Kritisk"
++
++msgid "Cron Log Level"
++msgstr "Cron logg nivå"
++
++msgid "Custom Interface"
++msgstr "Egendefinerte Grensesnitt"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Tilpasser oppførselen til enhetens <abbr title=\"Light Emitting Diode\">LED</"
++"abbr>s om mulig."
++
++msgid "DHCP Leases"
++msgstr "DHCP Leier"
++
++msgid "DHCP Server"
++msgstr "DHCP Server"
++
++msgid "DHCP and DNS"
++msgstr "DHCP og DNS"
++
++msgid "DHCP client"
++msgstr "DHCP klient"
++
++msgid "DHCP-Options"
++msgstr "DHCP-Alternativer"
++
++msgid "DHCPv6 Leases"
++msgstr "DHCPv6 Leier"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "DNS videresendinger"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Feilsøking"
++
++msgid "Default %d"
++msgstr "Standard %d"
++
++msgid "Default gateway"
++msgstr "Standard gateway"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Standard tilstand"
++
++msgid "Define a name for this network."
++msgstr "Definer et navn for dette nettverket."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Definer flere DHCP valg, f.eks \"<code>192.168.2.1,192.168.2.2</code>\" som "
++"annonserer forskjellige DNS servere til klientene."
++
++msgid "Delete"
++msgstr "Fjern"
++
++msgid "Delete this interface"
++msgstr "Fjern dette grensesnitt"
++
++msgid "Delete this network"
++msgstr "Fjern dette nettverket"
++
++msgid "Description"
++msgstr "Beskrivelse"
++
++msgid "Design"
++msgstr "Design"
++
++msgid "Destination"
++msgstr "Destinasjon"
++
++msgid "Device"
++msgstr "Enhet"
++
++msgid "Device Configuration"
++msgstr "Enhet Konfigurasjon"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Nettverksdiagnostikk"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Katalog"
++
++msgid "Disable"
++msgstr "Deaktiver"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Deaktiver <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++"for dette nettverket."
++
++msgid "Disable DNS setup"
++msgstr "Deaktiver DNS oppsett"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Deaktiver HW-Beacon timer"
++
++msgid "Disabled"
++msgstr "Deaktivert"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Forkast oppstrøms RFC1918 svar"
++
++msgid "Displaying only packages containing"
++msgstr "Viser bare pakker som inneholder"
++
++msgid "Distance Optimization"
++msgstr "Avstand Optimalisering"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Avstand i meter til det medlem av nettverket som er lengst unna."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Antennevariasjon"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq er en kombinert <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server og <abbr title=\"Domain Navn System\">DNS</abbr>-"
++"Fremsender for <abbr title =\"Network Address Translation\">NAT</abbr> "
++"brannmurer"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr "Ikke cache negative svar, f.eks for ikke eksisterende domener"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr ""
++"Ikke videresend forespørsler som ikke kan besvares med offentlige "
++"navneservere"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr "Ikke videresend reverserte oppslag for lokale nettverk"
++
++msgid "Do not send probe responses"
++msgstr "Ikke send probe svar"
++
++msgid "Domain required"
++msgstr "Domene kreves"
++
++msgid "Domain whitelist"
++msgstr "Domene hviteliste"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Ikke videresend <abbr title=\"Domain Name System\">DNS</abbr>-Forespørsler "
++"uten <abbr title=\"Domain Name System\">DNS</abbr>-Navn"
++
++msgid "Download and install package"
++msgstr "Last ned og installer pakken"
++
++msgid "Download backup"
++msgstr "Last ned sikkerhetskopi"
++
++msgid "Dropbear Instance"
++msgstr "Dropbear Instans"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear tilbyr <abbr title=\"Secure Shell\">SSH</abbr>-nettverks shell "
++"tilgang og en integrert <abbr title=\"Secure Copy\">SCP</abbr> server"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"Dynamisk <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++
++msgid "Dynamic tunnel"
++msgstr "Dynamisk tunnel"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"Dynamisk tildeling av DHCP adresser til klienter. Om deaktivert, kan en kun "
++"bruke klienter med statisk leie."
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "EAP-metode"
++
++msgid "Edit"
++msgstr "Endre"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Endre dette grensesnittet"
++
++msgid "Edit this network"
++msgstr "Endre dette nettverket"
++
++msgid "Emergency"
++msgstr "Krisesituasjon"
++
++msgid "Enable"
++msgstr "Aktiver"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Aktiver <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "Aktiver HE,net dynamisk endepunkt oppdatering"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "Aktiver Jumbo Frames gjennomgang"
++
++msgid "Enable NTP client"
++msgstr "Aktiver NTP klient"
++
++msgid "Enable TFTP server"
++msgstr "Aktiver TFTP server"
++
++msgid "Enable VLAN functionality"
++msgstr "Aktiver VLAN funksjonalitet"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Aktiver 'læring' og 'aldring'"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "Aktiver dette monteringspunktet"
++
++msgid "Enable this swap"
++msgstr "Aktiver denne swapenhet"
++
++msgid "Enable/Disable"
++msgstr "Aktiver/Deaktiver"
++
++msgid "Enabled"
++msgstr "Aktivert"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Aktiverer Spanning Tree Protocol på denne broen"
++
++msgid "Encapsulation mode"
++msgstr "Innkapsling modus"
++
++msgid "Encryption"
++msgstr "Kryptering"
++
++msgid "Erasing..."
++msgstr "Sletter..."
++
++msgid "Error"
++msgstr "Feil"
++
++msgid "Ethernet Adapter"
++msgstr "Ethernet Tilslutning"
++
++msgid "Ethernet Switch"
++msgstr "Ethernet Svitsj"
++
++msgid "Expand hosts"
++msgstr "Utvid vertsliste"
++
++msgid "Expires"
++msgstr "Utgår"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr "Utløpstid på leide adresser, minimum er 2 minutter (<code>2m</code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Ekstern systemlogg server"
++
++msgid "External system log server port"
++msgstr "Ekstern systemlogg server port"
++
++msgid "Fast Frames"
++msgstr "Fast Frames"
++
++msgid "File"
++msgstr "Fil"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Filnavn fra boot image annonsert til klienter"
++
++msgid "Filesystem"
++msgstr "Filsystem"
++
++msgid "Filter"
++msgstr "Filter"
++
++msgid "Filter private"
++msgstr "Filtrer private"
++
++msgid "Filter useless"
++msgstr "Filtrer ubrukelige"
++
++msgid "Find and join network"
++msgstr "Finn og koble til nettverk"
++
++msgid "Find package"
++msgstr "Finn pakke"
++
++msgid "Finish"
++msgstr "Fullfør"
++
++msgid "Firewall"
++msgstr "Brannmur"
++
++msgid "Firewall Settings"
++msgstr "Brannmur Innstillinger"
++
++msgid "Firewall Status"
++msgstr "Brannmur Status"
++
++msgid "Firmware Version"
++msgstr "Firmware Versjon"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "Fast kilde port for utgående DNS-spørringer"
++
++msgid "Flags"
++msgstr "Flagg"
++
++msgid "Flash Firmware"
++msgstr "Firmware Oppradering"
++
++msgid "Flash image..."
++msgstr "Flash firmware..."
++
++msgid "Flash new firmware image"
++msgstr "Flash nytt firmware image"
++
++msgid "Flash operations"
++msgstr "Flash operasjoner"
++
++msgid "Flashing..."
++msgstr "Flasher..."
++
++msgid "Force"
++msgstr "Bruk"
++
++msgid "Force CCMP (AES)"
++msgstr "Bruk CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++"Bruk DHCP i dette nettverket, selv om en annen DHCP server er oppdaget."
++
++msgid "Force TKIP"
++msgstr "Bruk TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "Bruk TKIP og CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "Videresend DHCP trafikk"
++
++msgid "Forward broadcast traffic"
++msgstr "Videresend kringkastingstrafikk"
++
++msgid "Forwarding mode"
++msgstr "Videresending modus"
++
++msgid "Fragmentation Threshold"
++msgstr "Fragmenterings Terskel"
++
++msgid "Frame Bursting"
++msgstr "Frame Bursting"
++
++msgid "Free"
++msgstr "Ledig"
++
++msgid "Free space"
++msgstr "Ledig plass"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "Kun GPRS"
++
++msgid "Gateway"
++msgstr "Gateway"
++
++msgid "Gateway ports"
++msgstr "Gateway porter"
++
++msgid "General Settings"
++msgstr "Generelle Innstillinger"
++
++msgid "General Setup"
++msgstr "Generelt Oppsett"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "Opprett arkiv"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Generell 802.11%s Trådløs Kontroller"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr "Det oppgitte passordet var ikke korrekt, passord ble ikke endret!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "GÃ¥ til passord konfigurasjon..."
++
++msgid "Go to relevant configuration page"
++msgstr "GÃ¥ til relevant konfigurasjonen side"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "HE.net passord"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Behandler"
++
++msgid "Hang Up"
++msgstr "Slå av"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Her kan du konfigurere grunnleggende aspekter av enheten som f.eks. dens "
++"vertsnavn eller tidssone."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++"Her kan du lime inn felles SSH-nøkler(en per linje), for SSH godkjenning."
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Hermes 802.11b Trådløs Kontroller"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "Skjul <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "Vertsoppføringer"
++
++msgid "Host expiry timeout"
++msgstr "Verts utløpstid"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++"Verts-<abbr title=\"Internet Protocol Address\">IP</abbr> eller Nettverk"
++
++msgid "Hostname"
++msgstr "Vertsnavn"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "Vertsnavn som sendes ved DHCP forespørsel"
++
++msgid "Hostnames"
++msgstr "Vertsnavn"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "IP adresse"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "IPv4 Brannmur"
++
++msgid "IPv4 WAN Status"
++msgstr "IPv4 WAN Status"
++
++msgid "IPv4 address"
++msgstr "IPv4 adresse"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 og IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "IPv4 kringkasting"
++
++msgid "IPv4 gateway"
++msgstr "IPv4 gateway"
++
++msgid "IPv4 netmask"
++msgstr "IPv4 nettmaske"
++
++msgid "IPv4 only"
++msgstr "Kun IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "IPv4 prefikslengde"
++
++msgid "IPv4-Address"
++msgstr "IPv4-Adresse"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "IPv6 Brannmur"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "IPv6 WAN Status"
++
++msgid "IPv6 address"
++msgstr "IPv6 adresse"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "IPv6 gateway"
++
++msgid "IPv6 only"
++msgstr "Kun IPv6"
++
++msgid "IPv6 prefix"
++msgstr "IPv6 prefiks"
++
++msgid "IPv6 prefix length"
++msgstr "IPv6 prefikslengde"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "IPv6-Adresse"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-i-IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6-over-IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6-over-IPv4 (6til4)"
++
++msgid "Identity"
++msgstr "Identitet"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr "Hvis oppgitt vil denne enhet monteres ut fra dens UUID"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr "Hvis oppgitt vil denne enheten bli montert utfra dens Volumnavn"
++
++msgid "If unchecked, no default route is configured"
++msgstr "Dersom ikke avmerket blir ingen standard rute konfigurert"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr "Dersom ikke avmerket blir de annonserte DNS server adresser ignorert"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Om ruterens fysiske minne er utilstrekkelig, ubrukte data kan midlertidig "
++"gjøres om til en swap-enhet som gir deg mere tilgjengelig <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Vær oppmerksom på at bruk av swap er "
++"mye langsommere en <abbr title=\"Random Access Memory\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr "Ignorer grensesnitt"
++
++msgid "Ignore resolve file"
++msgstr "Ignorer oppslagsfil"
++
++msgid "Image"
++msgstr "Firmware"
++
++msgid "In"
++msgstr "i"
++
++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 "Tidsavbrudd etter innaktivitet"
++
++msgid "Inbound:"
++msgstr "Innkommende:"
++
++msgid "Info"
++msgstr "Informasjon"
++
++msgid "Initscript"
++msgstr "Oppstartskript"
++
++msgid "Initscripts"
++msgstr "Oppstartsskript"
++
++msgid "Install"
++msgstr "Installer"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Installer pakken %q"
++
++msgid "Install protocol extensions..."
++msgstr "Installer protokoll utvidelser..."
++
++msgid "Installed packages"
++msgstr "Installerte pakker"
++
++msgid "Interface"
++msgstr "Grensesnitt"
++
++msgid "Interface Configuration"
++msgstr "Grensesnitt Konfigurasjon"
++
++msgid "Interface Overview"
++msgstr "Grensesnitt Oversikt"
++
++msgid "Interface is reconnecting..."
++msgstr "Grensesnittet kobler til igjen..."
++
++msgid "Interface is shutting down..."
++msgstr "Grensesnittet slår seg av..."
++
++msgid "Interface not present or not connected yet."
++msgstr "Grensesnittet er ikke tilgjengelig eller er ikke tilknyttet."
++
++msgid "Interface reconnected"
++msgstr "Grensesnittet er koblet til igjen"
++
++msgid "Interface shut down"
++msgstr "Grensesnittet er slått av"
++
++msgid "Interfaces"
++msgstr "Grensesnitt"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "Intern server feil"
++
++msgid "Invalid"
++msgstr "Ugyldig"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr "Ugyldig VLAN ID gitt! Bare IDer mellom %d og %d er tillatt."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "Ugyldig VLAN ID gitt! Bare unike ID'er er tillatt"
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Ugyldig brukernavn og/eller passord! Vennligst prøv igjen."
++
++#, 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 ""
++"Det virker som du prøver å flashe med en firmware som ikke passer inn i "
++"flash-minnet, vennligst kontroller firmware filen!"
++
++msgid "Java Script required!"
++msgstr "Java Script kreves!"
++
++msgid "Join Network"
++msgstr "Koble til nettverket"
++
++msgid "Join Network: Settings"
++msgstr "Koble til nettverk: Innstilling"
++
++msgid "Join Network: Wireless Scan"
++msgstr "Koble til nettverk: Trådløs Skanning"
++
++msgid "Keep settings"
++msgstr "Behold innstillinger"
++
++msgid "Kernel Log"
++msgstr "Kjerne Logg"
++
++msgid "Kernel Version"
++msgstr "Kjerne Versjon"
++
++msgid "Key"
++msgstr "Nøkkel"
++
++msgid "Key #%d"
++msgstr "Nøkkel #%d"
++
++msgid "Kill"
++msgstr "Drep"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "L2TP Server"
++
++msgid "LCP echo failure threshold"
++msgstr "LCP ekko feil terskel"
++
++msgid "LCP echo interval"
++msgstr "LCP ekko intervall"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Volumnavn"
++
++msgid "Language"
++msgstr "Språk"
++
++msgid "Language and Style"
++msgstr "Språk og Utseende"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Gyldig leietid"
++
++msgid "Leasefile"
++msgstr "<abbr title=\"Leasefile\">Leie-fil</abbr>"
++
++msgid "Leasetime"
++msgstr "<abbr title=\"Leasetime\">Leietid</abbr>"
++
++msgid "Leasetime remaining"
++msgstr "Gjenværende leietid"
++
++msgid "Leave empty to autodetect"
++msgstr "La stå tomt for automatisk oppdagelse"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "La stå tomt for å bruke gjeldene WAN adresse"
++
++msgid "Legend:"
++msgstr "Forklaring:"
++
++msgid "Limit"
++msgstr "Grense"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Forbindelse"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"Liste med <abbr title=\"Domain Name System\">DNS</abbr> servere som "
++"forespørsler blir videresendt til"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "Liste over domener hvor en tillater RFC1918 svar"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr "Liste over verter som returneren falske NX domene resultater"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++"Lytt kun på det angitte grensesnitt, om ingen er angitt lyttes det på alle"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Lytte-port for innkommende DNS-spørring"
++
++msgid "Load"
++msgstr "Belastning"
++
++msgid "Load Average"
++msgstr "Belastning Gjennomsnitt"
++
++msgid "Loading"
++msgstr "Laster"
++
++msgid "Local IPv4 address"
++msgstr "Lokal IPv4 adresse"
++
++msgid "Local IPv6 address"
++msgstr "Lokal IPv6 adresse"
++
++msgid "Local Startup"
++msgstr "Lokal Oppstart"
++
++msgid "Local Time"
++msgstr "Lokal tid"
++
++msgid "Local domain"
++msgstr "Lokalt domene"
++
++#, fuzzy
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++"Lokalt domene spesifikasjon. Navn som passer dette domenet blir aldri "
++"videresendt, de blir kun løst av DHCP eller vertsfiler"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr "Lokalt domenesuffiks lagt til DHCP navn og vertsfil oppføringer"
++
++msgid "Local server"
++msgstr "Lokal server"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++"Lokaliser vertsnavn avhengig av subnett hvis flere IP-adresser er "
++"tilgjengelig"
++
++msgid "Localise queries"
++msgstr "Lokalisere søk"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Logg nivå"
++
++msgid "Log queries"
++msgstr "Logg spørringer"
++
++msgid "Logging"
++msgstr "Logging"
++
++msgid "Login"
++msgstr "Logg inn"
++
++msgid "Logout"
++msgstr "Logg ut"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr "Laveste leide adresse, forskjøvet fra nettverks adressen."
++
++msgid "MAC-Address"
++msgstr "MAC-Adresse"
++
++msgid "MAC-Address Filter"
++msgstr "MAC-Addresse Filter"
++
++msgid "MAC-Filter"
++msgstr "MAC-Filter"
++
++msgid "MAC-List"
++msgstr "MAC-Liste"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Maksimal hastighet"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "Maksimalt antall aktive DHCP leieavtaler"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "Maksimalt antall samtidige DNS spørringer"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "Maksimal tillatt størrelse på EDNS.0 UDP-pakker"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "Maksimalt antall sekunder å vente på at modemet skal bli klart"
++
++msgid "Maximum hold time"
++msgstr "Maksimal holde tid"
++
++msgid "Maximum number of leased addresses."
++msgstr "Maksimalt antall utleide adresser."
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "Minne"
++
++msgid "Memory usage (%)"
++msgstr "Minne forbruk (%)"
++
++msgid "Metric"
++msgstr "Metrisk"
++
++msgid "Minimum Rate"
++msgstr "Minimum hastighet"
++
++msgid "Minimum hold time"
++msgstr "Minimum holde tid"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "Mangler protokoll utvidelse for proto %q"
++
++msgid "Mode"
++msgstr "Modus"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Modem"
++
++msgid "Modem init timeout"
++msgstr "Modem initiering tidsavbrudd"
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr "Monterings Enhet"
++
++msgid "Mount Point"
++msgstr "Monterings Punkt"
++
++msgid "Mount Points"
++msgstr "Monterings Punkter"
++
++msgid "Mount Points - Mount Entry"
++msgstr "Monterings Punkter - Monterings Enhet"
++
++msgid "Mount Points - Swap Entry"
++msgstr "Monterings Punkter - Swap Enhet"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Monterings punkter definerer hvor lagrings enheter blir tilsluttet "
++"filsystemet"
++
++msgid "Mount options"
++msgstr "Monterings alternativer"
++
++msgid "Mount point"
++msgstr "Monterings punkt"
++
++msgid "Mounted file systems"
++msgstr "Monterte Filsystemer"
++
++msgid "Move down"
++msgstr "Flytt ned"
++
++msgid "Move up"
++msgstr "Flytt opp"
++
++msgid "Multicast Rate"
++msgstr "Multicast hastighet"
++
++msgid "Multicast address"
++msgstr "Multicast adresse"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "NTP server kandidater"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Navn"
++
++msgid "Name of the new interface"
++msgstr "Navnet til det nye grensesnittet"
++
++msgid "Name of the new network"
++msgstr "Navnet til det nye nettverket"
++
++msgid "Navigation"
++msgstr "Navigasjon"
++
++msgid "Netmask"
++msgstr "Nettmaske"
++
++msgid "Network"
++msgstr "Nettverk"
++
++msgid "Network Utilities"
++msgstr "Nettverks Verktøy"
++
++msgid "Network boot image"
++msgstr "Nettverks boot image"
++
++msgid "Network without interfaces."
++msgstr "Nettverk uten grensesnitt."
++
++msgid "Next »"
++msgstr "Neste »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Ingen DHCP server er konfigurert for dette grensesnittet"
++
++msgid "No chains in this table"
++msgstr "Ingen lenker i denne tabellen"
++
++msgid "No files found"
++msgstr "Ingen filer funnet"
++
++msgid "No information available"
++msgstr "Ingen informasjon tilgjengelig"
++
++msgid "No negative cache"
++msgstr "Ingen negative cache"
++
++msgid "No network configured on this device"
++msgstr "Ingen nettverk er konfigurert på denne enheten"
++
++msgid "No network name specified"
++msgstr "Ingen nettverksnavn spesifisert"
++
++msgid "No package lists available"
++msgstr "Ingen pakkelister tilgjengelig"
++
++msgid "No password set!"
++msgstr "Ruteren er ikke passordbeskyttet!"
++
++msgid "No rules in this chain"
++msgstr "Ingen regler i denne tabellen"
++
++msgid "No zone assigned"
++msgstr "Ingen sone tilknyttet"
++
++msgid "Noise"
++msgstr "Støy"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Støy:"
++
++msgid "None"
++msgstr "Ingen"
++
++msgid "Normal"
++msgstr "Normal"
++
++msgid "Not Found"
++msgstr "Ikke funnet"
++
++msgid "Not associated"
++msgstr "Ikke tilknyttet"
++
++msgid "Not connected"
++msgstr "Ikke tilkoblet"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Merk: Konfigurasjonsfiler vil bli slettet"
++
++msgid "Notice"
++msgstr "Merk"
++
++msgid "Nslookup"
++msgstr "Nslookup"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "<abbr title=\"Open PacKaGe Management\">OPKG</abbr>-Konfigurasjon"
++
++msgid "Off-State Delay"
++msgstr "Forsinkelse ved tilstand Av"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"PÃ¥ denne siden kan du konfigurere nettverks grensesnittet. Du kan "
++"sammenkoble flere grensesnitt ved å hake av \"Sammekoble grensesnitt\" "
++"feltet og skrive inn navn på grensesnittene atskilt med mellomrom. Du kan "
++"også bruke <abbr title=\"Virtual Local Area Network\">VLAN</abbr> betegnelse "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for eksempel\">f.eks</abbr>: "
++"<samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr "Forsinkelse ved tilstand -PÃ¥-"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "Enten Vertsnavn eller Mac-adresse må oppgis!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "Ett eller flere felt inneholder ugyldige verdier!"
++
++msgid "One or more required fields have no value!"
++msgstr "Ett eller flere obligatoriske felter har ingen verdi!"
++
++msgid "Open list..."
++msgstr "Ã…pne liste..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Innstilling endret"
++
++msgid "Option removed"
++msgstr "Innstilling fjernet"
++
++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 "Options"
++msgstr "Alternativer"
++
++msgid "Other:"
++msgstr "Andre:"
++
++msgid "Out"
++msgstr "Ut"
++
++msgid "Outbound:"
++msgstr "Ugående:"
++
++msgid "Outdoor Channels"
++msgstr "Utendørs Kanaler"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "Overstyr MAC adresse"
++
++msgid "Override MTU"
++msgstr "Overstyr MTU"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "Overstyr gatewayen mottatt av DHCP respons"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++"Overstyr nettmaske sendt til klienter. Normalt er nettmasken beregnet ut fra "
++"subnettet som blir tildelt."
++
++msgid "Override the table used for internal routes"
++msgstr "Overstyr tabellen som brukes for interne ruter"
++
++msgid "Overview"
++msgstr "Oversikt"
++
++msgid "Owner"
++msgstr "Eier"
++
++msgid "PAP/CHAP password"
++msgstr "PAP/CHAP passord"
++
++msgid "PAP/CHAP username"
++msgstr "PAP/CHAP brukernavn"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "PPPoA Innkapsling"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "Pakken libiwinfo er nødvendig!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "Pakkelistene er eldre enn 24 timer"
++
++msgid "Package name"
++msgstr "Pakkenavn"
++
++msgid "Packets"
++msgstr "Pakker"
++
++msgid "Part of zone %q"
++msgstr "En del av sone %q"
++
++msgid "Password"
++msgstr "Passord"
++
++msgid "Password authentication"
++msgstr "Passord godkjenning"
++
++msgid "Password of Private Key"
++msgstr "Passord for privatnøkkel"
++
++msgid "Password successfully changed!"
++msgstr "Passordet er endret!"
++
++msgid "Path to CA-Certificate"
++msgstr "Sti til CA-sertifikat"
++
++msgid "Path to Client-Certificate"
++msgstr "Sti til klient-sertifikat"
++
++msgid "Path to Private Key"
++msgstr "Sti til privatnøkkel"
++
++msgid "Path to executable which handles the button event"
++msgstr "Sti til program som håndterer handling ved bruk av knapp"
++
++msgid "Peak:"
++msgstr "Maksimalt:"
++
++msgid "Perform reboot"
++msgstr "Omstart nå"
++
++msgid "Perform reset"
++msgstr "Foreta nullstilling"
++
++msgid "Phy Rate:"
++msgstr "Phy Hastighet:"
++
++msgid "Physical Settings"
++msgstr "Fysiske Innstillinger"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Pkts."
++msgstr "Pakker."
++
++msgid "Please enter your username and password."
++msgstr "Skriv inn ditt brukernavn og passord."
++
++msgid "Policy"
++msgstr "Policy"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Port %d"
++msgstr "Port %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr "Port %d er utagget i flere VLANs!"
++
++msgid "Port status:"
++msgstr "Port status:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++"Annta at peer er uten forbindelse om angitt LCP ekko feiler, bruk verdi 0 "
++"for å overse feil"
++
++msgid "Prevents client-to-client communication"
++msgstr "Hindrer klient-til-klient kommunikasjon"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Prism2/2.5/3 802.11b Trådløs Kontroller"
++
++msgid "Proceed"
++msgstr "Fortsett"
++
++msgid "Processes"
++msgstr "Prosesser"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protokoll"
++
++msgid "Protocol family"
++msgstr "Protokoll familie"
++
++msgid "Protocol of the new interface"
++msgstr "Protokoll til det nye grensesnittet"
++
++msgid "Protocol support is not installed"
++msgstr "Protokoll støtte er ikke installert"
++
++msgid "Provide NTP server"
++msgstr "Funger som NTP Server"
++
++msgid "Provide new network"
++msgstr "Lag nytt nettverk"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "Kvalitet"
++
++msgid "RTS/CTS Threshold"
++msgstr "RTS/CTS Terskel"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr "RX Rate"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "RaLink 802.11%s Trådløs Kontroller"
++
++msgid "Radius-Accounting-Port"
++msgstr "Radius-Accounting-Port"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Radius-Accounting-Secret"
++
++msgid "Radius-Accounting-Server"
++msgstr "Radius-Accounting-Server"
++
++msgid "Radius-Authentication-Port"
++msgstr "Radius-Authentication-Port"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Radius-Authentication-Secret"
++
++msgid "Radius-Authentication-Server"
++msgstr "Radius-Authentication-Server"
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"Benytt <code>/etc/ethers</code> for å konfigurere <abbr title=\"Dynamic Host "
++"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."
++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 "
++"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"
++"Du kan miste kontakten med ruteren om du er tilkoblet via dette nettverket."
++
++msgid "Really reset all changes?"
++msgstr "Vil du nullstille alle endringer?"
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou might lose access to this device if you are "
++"connected via this interface."
++msgstr ""
++"Slå av dette nettverket ?\n"
++"Du kan miste kontakten med ruteren om du er tilkoblet via dette "
++"grensesnittet."
++
++msgid ""
++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
++"you are connected via this interface."
++msgstr ""
++"Slå av dette grensesnittet \"%s\" ?\n"
++"Du kan miste kontakten med ruteren om du er tilkoblet via dette "
++"grensesnittet."
++
++msgid "Really switch protocol?"
++msgstr "Vil du endre protokoll?"
++
++msgid "Realtime Connections"
++msgstr "Tilkoblinger Sanntid"
++
++msgid "Realtime Graphs"
++msgstr "Grafer i sanntid"
++
++msgid "Realtime Load"
++msgstr "Belastning Sanntid"
++
++msgid "Realtime Traffic"
++msgstr "Trafikk Sanntid"
++
++msgid "Realtime Wireless"
++msgstr "Trådløst i sanntid"
++
++msgid "Rebind protection"
++msgstr "Binde beskyttelse"
++
++msgid "Reboot"
++msgstr "Omstart"
++
++msgid "Rebooting..."
++msgstr "Starter på nytt..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Omstarter operativsystemet på enheten"
++
++msgid "Receive"
++msgstr "Motta"
++
++msgid "Receiver Antenna"
++msgstr "Mottak antenne"
++
++msgid "Reconnect this interface"
++msgstr "Koble til igjen"
++
++msgid "Reconnecting interface"
++msgstr "Kobler til igjen"
++
++msgid "References"
++msgstr "Referanser"
++
++msgid "Regulatory Domain"
++msgstr "Regulerende Domene"
++
++msgid "Relay"
++msgstr "Relay"
++
++msgid "Relay Bridge"
++msgstr "Relay bro"
++
++msgid "Relay between networks"
++msgstr "Relay mellom nettverk"
++
++msgid "Relay bridge"
++msgstr "Relay bro"
++
++msgid "Remote IPv4 address"
++msgstr "Ekstern IPv4 adresse"
++
++msgid "Remove"
++msgstr "Avinstaller"
++
++msgid "Repeat scan"
++msgstr "Skann på nytt"
++
++msgid "Replace entry"
++msgstr "Erstatt oppføring"
++
++msgid "Replace wireless configuration"
++msgstr "Erstatt trådløs konfigurasjon"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "Er nødvendig for noen nettleverandører, f.eks Charter med DOCSIS 3"
++
++msgid "Reset"
++msgstr "Nullstill"
++
++msgid "Reset Counters"
++msgstr "Nullstill Tellere"
++
++msgid "Reset to defaults"
++msgstr "Nullstill til standard innstilling"
++
++msgid "Resolv and Hosts Files"
++msgstr "Oppslag og Vertsfiler"
++
++msgid "Resolve file"
++msgstr "<abbr title=\"Resolvefile\">Oppslagsfil</abbr>"
++
++msgid "Restart"
++msgstr "Omstart"
++
++msgid "Restart Firewall"
++msgstr "Omstart Brannmur"
++
++msgid "Restore backup"
++msgstr "Gjenopprett sikkerhetskopi"
++
++msgid "Reveal/hide password"
++msgstr "Vis/Skjul passord"
++
++msgid "Revert"
++msgstr "Tilbakestill"
++
++msgid "Root"
++msgstr "Rot"
++
++msgid "Root directory for files served via TFTP"
++msgstr "Rot katalog for filer gitt fra TFTP"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Ruter Passord"
++
++msgid "Routes"
++msgstr "Ruter"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Ruter, angir hvilket nettverksgrensesnitt og hvilken gateway som brukes for "
++"å nå et gitt nettverk eller vert."
++
++msgid "Rule #"
++msgstr "Regel #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr "Kjør filsystem sjekk før montering av enheten"
++
++msgid "Run filesystem check"
++msgstr "Kjør filsystem sjekk"
++
++msgid ""
++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
++"use 6in4 instead"
++msgstr ""
++
++msgid "SIXXS-handle[/Tunnel-ID]"
++msgstr ""
++
++msgid "SSH Access"
++msgstr "SSH Tilgang"
++
++msgid "SSH-Keys"
++msgstr "SSH-Nøkler"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Lagre"
++
++msgid "Save & Apply"
++msgstr "Lagre & Aktiver"
++
++msgid "Save &#38; Apply"
++msgstr "Lagre &#38; Aktiver"
++
++msgid "Scan"
++msgstr "Skann"
++
++msgid "Scheduled Tasks"
++msgstr "Planlagte Oppgaver"
++
++msgid "Section added"
++msgstr "Seksjon lagt til"
++
++msgid "Section removed"
++msgstr "Seksjon fjernet"
++
++msgid "See \"mount\" manpage for details"
++msgstr "Se \"mount\" manpage for detaljer"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++"Send LCP ekko forespørsler etter angitt intervall i sekunder, dette er kun "
++"gjeldene dersom feilterskelen er nådd"
++
++msgid "Separate Clients"
++msgstr "Separerte Klienter"
++
++msgid "Separate WDS"
++msgstr "Separert WDS"
++
++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"
++
++msgid "Service Type"
++msgstr "Tjeneste type"
++
++msgid "Services"
++msgstr "Tjenester"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "Oppsett tidssynkronisering"
++
++msgid "Setup DHCP Server"
++msgstr "Oppsett DHCP server"
++
++msgid "Show current backup file list"
++msgstr "Vis gjeldende liste med sikkerhetskopifiler"
++
++msgid "Shutdown this interface"
++msgstr "Slå av dette grensesnittet"
++
++msgid "Shutdown this network"
++msgstr "Slå av dette nettverket"
++
++msgid "Signal"
++msgstr "Signal"
++
++msgid "Signal:"
++msgstr "Signal:"
++
++msgid "Size"
++msgstr "Størrelse"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "GÃ¥ videre"
++
++msgid "Skip to content"
++msgstr "GÃ¥ til innhold"
++
++msgid "Skip to navigation"
++msgstr "GÃ¥ til navigasjon"
++
++msgid "Slot time"
++msgstr "Slot tid"
++
++msgid "Software"
++msgstr "Programvare"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Noen felt er ugyldige, kan ikke lagre verdier!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Beklager, objektet du spurte om ble ikke funnet."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "Beklager, det oppstod en uventet feil på serveren."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"Beklager, men finner ikke støtte for 'sysupgrade', ny firmware må derfor "
++"flashes manuelt. Viser til OpenWrt wiki for installering av firmare på "
++"forskjellige enheter."
++
++msgid "Sort"
++msgstr "Sortering"
++
++msgid "Source"
++msgstr "Kilde"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "Spesifiserer knappens handlemønster"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "Hvor lagrings enheten blir tilsluttet filsystemet (f.eks. /mnt/sda1)"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "Angir den lyttende porten for denne <em>Dropbear</em> instansen"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++"Angir maksimalt antall feilede ARP forespørsler før verter ansees frakoblet"
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr "Angir maksimalt antall sekunder før verter ansees som frakoblet"
++
++msgid "Specify the secret encryption key here."
++msgstr "Angi krypteringsnøkkelen her."
++
++msgid "Start"
++msgstr "Start"
++
++msgid "Start priority"
++msgstr "Start prioritet"
++
++msgid "Startup"
++msgstr "Oppstart"
++
++msgid "Static IPv4 Routes"
++msgstr "Statiske IPv4 Ruter"
++
++msgid "Static IPv6 Routes"
++msgstr "Statiske IPv6 Ruter"
++
++msgid "Static Leases"
++msgstr "Statiske Leier"
++
++msgid "Static Routes"
++msgstr "Statiske Ruter"
++
++msgid "Static WDS"
++msgstr "Statisk WDS"
++
++msgid "Static address"
++msgstr "Statisk adresse"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"Statisk leieavtaler brukes til å tildele faste IP adresser og symbolske "
++"vertsnavn til DHCP klienter. Dette er nødvendig om grensesnittet ikke er "
++"dynamisk konfigurert og kun klienter med dhcp leieavtale får IP."
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Stop"
++msgstr "Stop"
++
++msgid "Strict order"
++msgstr "Streng overholdelse"
++
++msgid "Submit"
++msgstr "Send"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Swap Enhet"
++
++msgid "Switch"
++msgstr "Svitsj"
++
++msgid "Switch %q"
++msgstr "Svitsj %q"
++
++msgid "Switch %q (%s)"
++msgstr "Svitsj %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Svitsj protokoll"
++
++msgid "Sync with browser"
++msgstr "Synkroniser med nettleser"
++
++msgid "Synchronizing..."
++msgstr "Synkroniser..."
++
++msgid "System"
++msgstr "System"
++
++msgid "System Log"
++msgstr "System Logg"
++
++msgid "System Properties"
++msgstr "System Egenskaper"
++
++msgid "System log buffer size"
++msgstr "System logg buffer størrelse"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "TFTP Innstillinger"
++
++msgid "TFTP server root"
++msgstr "TFTP server roten"
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr "TX rate"
++
++msgid "Table"
++msgstr "Tabell"
++
++msgid "Target"
++msgstr "MÃ¥l"
++
++msgid "Terminate"
++msgstr "Avslutte"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"<em>Enhet Konfigurasjon</em> seksjonen omhandler innstillingene av den "
++"trådløse enheten som kanaler, sende stryke eller antenne valg. Disse "
++"innstillingene er delt mellom alle definerte trådløse nettverk opprettet "
++"utfra denne enhet. (om den trådløse enheten støtter mulit-SSID). Nettverks "
++"innstillinger som kryptering eller kanaler er gruppert i <em>Grensesnitt "
++"Konfigurasjon</em>."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"Pakken <em>libiwinfo-lua</em> er ikke installert. Du må installere denne "
++"pakken for å kunne konfigurerer trådløse enheter!"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++"IPv6 prefikset tilordnet mot leverandør, ender som regel med <code>::</code>"
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++"Gyldige tegn er: <code>A-Z</code>, <code>a-z</code>, <code>0-9</code> og "
++"<code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"Filenheten til partisjonen eller minnet (<abbr title=\"for eksempel\">f.eks."
++"</abbr> <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 ""
++"Filsystemet som ble brukt til å formatere partisjonen eller minnet. (<abbr "
++"title=\"for eksempel\">f.eks.</abbr> <samp><abbr title=\"Third Extended "
++"Filesystem\">ext3</abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++"Firmwaren ble lastet opp. Nedenfor er kontrollsum og filstørrelse oppført, "
++"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"
++
++msgid "The following rules are currently active on this system."
++msgstr "Følgende regler er aktiver på systemet."
++
++msgid "The given network name is not unique"
++msgstr "Det angitte nettverksnavnet er ikke unikt"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"Maskinvaren er ikke multi-SSID kapabel og den ekisterende konfigurasjonen "
++"vil bli erstattet om du fortsetter."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr "Lengden IPv4 prefikset i bits, resten brukt i IPv6-adresser."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "Lengden på IPv6 prefikset i bits"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++"Nettverks portene på ruteren kan kombineres til flere <abbr title=\"Virtual "
++"Local Area Network\">VLAN</abbr>s der datamaskiner kan kommunisere direkte "
++"med hverandre. <abbr title=\"Virtual Local Area Network\">VLAN</abbr>s "
++"brukes ofte for å skille ulike nettverk segmenter. Det er vanlig og ha en "
++"Uplink port for tilkobling til større nettverk som internett og andre porter "
++"til lokalt nettverk."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "Den valgte protokoll må ha en enhet tilknyttet"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++"Systemet sletter konfigurasjonspartisjonen nå, enheten vil bli startet på "
++"nytt når dette er utført."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"Systemet flashes nå.<br /> IKKE SLÅ AV ENHETEN!<br /> Vent noen minutter før "
++"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."
++msgstr ""
++"Den opplastede programvaren er av et format som ikke støttes. Sørg for at du "
++"velger det generelle firmware-bildet for din plattform."
++
++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 pending changes to revert!"
++msgstr "Det finnes ingen endriger å reversere!"
++
++msgid "There are no pending changes!"
++msgstr "Det finnes ingen endringer!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"Det er ingen enhet som er tilordnet ennå, vennligst legg til en "
++"nettverksenhet i \"Fysiske Innstillinger\""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"Det er ikke satt noe passord på denne ruter. Vennligst konfigurer et "
++"passord, dette beskytter webgrensesnittet og aktiverer SSH."
++
++msgid "This IPv4 address of the relay"
++msgstr "Dette IPv4 adressen til relayet"
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"Dette er en liste med 'shell glob patterns' for å matche filer og kataloger "
++"som skal inkluderes under sysupgrade. Endrede filer i /etc/config/ og "
++"enkelte andre konfigurasjoner blir automatisk bevart."
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"Dette er innholdet i /etc/rc.local. Her kan du legge til egne kommandoer som "
++"blir startet ved slutten av boot sekvensen. (før 'exit 0')"
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++"Dette er den lokale endepunkt adressen som ble tildelt av tunnel 'broker', "
++"adressen ender vanligvis med <code>:2</code>"
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Dette er den eneste <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr> server i det lokale nettverket"
++
++msgid "This is the plain username for logging into the account"
++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 "Dette er systemets crontab, hvor planlagte oppgaver kan defineres."
++
++msgid ""
++"This is usually the address of the nearest PoP operated by the tunnel broker"
++msgstr ""
++"Dette er vanligvis adressen til nærmeste PoP som drives av tunell 'broker'"
++
++msgid ""
++"This list gives an overview over currently running system processes and "
++"their status."
++msgstr "Denne listen gir en oversikt over kjørende prosesser og deres status."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr ""
++"Denne siden gir mulighet for å definerte egne knappers handlingsmønster"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++"Denne siden gir en oversikt over gjeldende aktive nettverkstilkoblinger."
++
++msgid "This section contains no values yet"
++msgstr "Denne seksjonen inneholder ennå ingen verdier"
++
++msgid "Time Synchronization"
++msgstr "Tidssynkronisering"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "Tiden Synkroniseringen er ikke konfigurert ennå."
++
++msgid "Timezone"
++msgstr "Tidssone"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"For å gjenopprette konfigurasjonsfiler, kan du her laste opp et backup arkiv "
++"som ble opprettet tidligere."
++
++msgid "Total Available"
++msgstr "Totalt Tilgjengelig"
++
++msgid "Traceroute"
++msgstr "Traceroute"
++
++msgid "Traffic"
++msgstr "Trafikk"
++
++msgid "Transfer"
++msgstr "Overføring"
++
++msgid "Transmission Rate"
++msgstr "Overførings rate"
++
++msgid "Transmit"
++msgstr "Sende"
++
++msgid "Transmit Power"
++msgstr "Sende styrke"
++
++msgid "Transmitter Antenna"
++msgstr "Sende Antenne"
++
++msgid "Trigger"
++msgstr "Utløser"
++
++msgid "Trigger Mode"
++msgstr "Utløsende Tilstand"
++
++msgid "Tunnel ID"
++msgstr "Tunnel ID"
++
++msgid "Tunnel Interface"
++msgstr "Tunnel grensesnitt"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Turbo Modus"
++
++msgid "Tx-Power"
++msgstr "Tx-Styrke"
++
++msgid "Type"
++msgstr "Type"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "Kun UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "USB Enhet"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr "Kan ikke sende"
++
++msgid "Unknown"
++msgstr "Ukjent"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Ukjent feil, passordet ble ikke endret!"
++
++msgid "Unmanaged"
++msgstr "Uhåndtert"
++
++msgid "Unsaved Changes"
++msgstr "Ulagrede Endringer"
++
++msgid "Unsupported protocol type."
++msgstr "Protokoll type er ikke støttet."
++
++msgid "Update lists"
++msgstr "Oppdater lister"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"Last her opp en sysupgrade-kompatibel firmware som skal erstatte den "
++"kjørende firmware. Merk av \"Behold innstillinger\" for å beholde gjeldene "
++"konfigurasjon. (en OpenWrt kompatibel firmware er nødvendig)"
++
++msgid "Upload archive..."
++msgstr "Last opp arkiv..."
++
++msgid "Uploaded File"
++msgstr "Opplastet Fil"
++
++msgid "Uptime"
++msgstr "Oppetid"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Bruk <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr "Bruk DHCP gateway"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "Bruk DNS servere annonsert av peer"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "Bruk ISO/IEC 3166 alpha2 landskoder."
++
++msgid "Use MTU on tunnel interface"
++msgstr "Bruk MTU på tunnel grensesnitt"
++
++msgid "Use TTL on tunnel interface"
++msgstr "Bruk TTL på tunnel grensesnitt"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "Bruk kringkasting flagg"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "Bruk egendefinerte DNS servere"
++
++msgid "Use default gateway"
++msgstr "Bruk standard gateway"
++
++msgid "Use gateway metric"
++msgstr "Bruk gateway metrikk"
++
++msgid "Use routing table"
++msgstr "Bruk rutingtabellen"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"Bruk <em>Legg til</em> knappen får å legge til en leieavtale. <em>MAC-"
++"Adresse</em> identifiserer verten, <em>IPv4-Adresse</em> angir hvilken "
++"statisk IP adresse som skal brukes og <em>Vertsnavn</em> blir symbolsk "
++"tilknyttet den anmodende verten."
++
++msgid "Used"
++msgstr "Brukt"
++
++msgid "Used Key Slot"
++msgstr "Brukte Nøkler"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Brukernavn"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "VLAN grensesnitt"
++
++msgid "VLANs on %q"
++msgstr "VLANs på %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLANs på %q (%s)"
++
++msgid "VPN Server"
++msgstr "VPN server"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++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"
++
++msgid "Version"
++msgstr "Versjon"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "WEP åpent system"
++
++msgid "WEP Shared Key"
++msgstr "WEP delt nøkkel"
++
++msgid "WEP passphrase"
++msgstr "WEP passord"
++
++msgid "WMM Mode"
++msgstr "WMM Modus"
++
++msgid "WPA passphrase"
++msgstr "WPA passord"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Advarsel"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Trådløs"
++
++msgid "Wireless"
++msgstr "Trådløs"
++
++msgid "Wireless Adapter"
++msgstr "Trådløs Tilslutning"
++
++msgid "Wireless Network"
++msgstr "Trådløst Nettverk"
++
++msgid "Wireless Overview"
++msgstr "Trådløs Oversikt"
++
++msgid "Wireless Security"
++msgstr "Trådløs Sikkerhet"
++
++msgid "Wireless is disabled or not associated"
++msgstr "Trådløs er deaktiver eller ikke tilknyttet"
++
++msgid "Wireless is restarting..."
++msgstr "Trådløst starter på nytt..."
++
++msgid "Wireless network is disabled"
++msgstr "Trådløst nettverk er deaktivert"
++
++msgid "Wireless network is enabled"
++msgstr "Trådløst nettverk er aktivert"
++
++msgid "Wireless restarted"
++msgstr "Trådløst startet på nytt"
++
++msgid "Wireless shut down"
++msgstr "Trådløst er slått av"
++
++msgid "Write received DNS requests to syslog"
++msgstr "Skriv mottatte DNS forespørsler til syslog"
++
++msgid "XR Support"
++msgstr "XR Støtte"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Her kan du aktivere eller deaktivere installerte oppstartsskript. Enheten må "
++"omstartes før endringene blir tatt i bruk.<br /><strong>Advarsel: Om du "
++"deaktiverer nødvendige init skript som f.eks. \"nettverk\", kan enheten bli "
++"utilgjengelig! </strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Du må aktivere Java Script i nettleseren din ellers vil ikke LuCI fungere "
++"skikkelig."
++
++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 ""
++
++msgid "any"
++msgstr "enhver"
++
++msgid "auto"
++msgstr "auto"
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "brokoblet"
++
++msgid "create:"
++msgstr "opprett:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "Oppretter en bro mellom angitte grensesnitt"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "Deaktiver"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "utgått"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"filen der gitt <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leier vil bli lagret"
++
++msgid "forward"
++msgstr "videresend"
++
++msgid "full-duplex"
++msgstr "full-dupleks"
++
++msgid "half-duplex"
++msgstr "halv-dupleks"
++
++msgid "help"
++msgstr "Hjelp"
++
++msgid "hidden"
++msgstr "skjult"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "Dersom målet er et nettverk"
++
++msgid "input"
++msgstr "inndata"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "nei"
++
++msgid "no link"
++msgstr "ingen forbindelse"
++
++msgid "none"
++msgstr "ingen"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "av"
++
++msgid "on"
++msgstr "på"
++
++msgid "open"
++msgstr "Ã¥pen"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "rutet"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "tagget"
++
++msgid "unknown"
++msgstr "ukjent"
++
++msgid "unlimited"
++msgstr "ubegrenset"
++
++msgid "unspecified"
++msgstr "uspesifisert"
++
++msgid "unspecified -or- create:"
++msgstr "uspesifisert --eller-- opprett:"
++
++msgid "untagged"
++msgstr "utagget"
++
++msgid "yes"
++msgstr "ja"
++
++msgid "« Back"
++msgstr "« Tilbake"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "Aktiver IPv6 på PPP lenke"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "Ignorer vertsfiler"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Vent: Enheten starter på nytt..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Advarsel: Det er ulagrede endringer som vil gå tapt under omstarten!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Bruk alltid 40MHz kanaler selv om sekundær kanal overlapper. Dette "
++#~ "alternativet er ikke i samsvar med IEEE 802.11n-2009!"
++
++#~ msgid "Cached"
++#~ msgstr "Hurtigbufret"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr ""
++#~ "Konfigurerer dette monteringspunktet som overlay lagringspunkt for block-"
++#~ "extroot"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "Bruk 40MHz modus"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Frekvens Hopping"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "LÃ¥st til kanal %d brukt av %s"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "Bruk som rot filsystem"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "HE.net bruker ID"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr "Dette er det 32 byte hexkodede bruker ID'en, ikke påloggingsnavnet"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz, Sekundær kanal over"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz, Sekundær kanal under"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Godta ruterkunngjøringer"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Annonser IPv6 på nettverket"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "Annonsert nettverks ID"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "Det tillatte området er fra 1 til 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "HT Muligheter"
++
++#~ msgid "HT mode"
++#~ msgstr "HT Modus"
++
++#~ msgid "Router Model"
++#~ msgstr "Ruter Modell"
++
++#~ msgid "Router Name"
++#~ msgstr "Ruter Navn"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "Send ruter anmodninger"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr "Angir den annonserte foretrukne prefikslevetiden i sekunder"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr "Angir den annonserte gyldige prefikslevetiden i sekunder"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "Bruk foretrukket levetid"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "Bruk gyldig levetid"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Venter på ruter..."
++
++#~ msgid "Active Leases"
++#~ msgstr "Aktive leier"
++
++#~ msgid "Open"
++#~ msgstr "Ã…pne"
++
++#~ msgid "KB"
++#~ msgstr "KB"
++
++#~ msgid "Bit Rate"
++#~ msgstr "Bithastighet"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "Konfigurasjon / Bruk"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "Konfigurasjon / Endringer"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "Konfigurasjon / Tilbakestill"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MAC Address"
++#~ msgstr "MAC adresse"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Encrypted\">Kryptert</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Skanning"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "Velg det nettverket du ønsker å knytte til dette trådløse grensesnittet. "
++#~ "Velg <em>uspesifisert</em> for ikke tilknytte noe nettverk, eller fyll ut "
++#~ "<em>opprett</em> feltet for å definere et nytt nettverk."
++
++#~ msgid "Create Network"
++#~ msgstr "Opprett Nettverk"
++
++#~ msgid "Link"
++#~ msgstr "Link"
++
++#~ msgid "Networks"
++#~ msgstr "Nettverk"
++
++#~ msgid "Power"
++#~ msgstr "Styrke"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Trådløse nettverk i nærheten av deg"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notasjon: "
++#~ "adresse/prefiks"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr ""
++#~ "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Kringkasting"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Adresse"
++
++#~ msgid "IP-Aliases"
++#~ msgstr "IP aliaser"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "IPv6 oppsett"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "Vær oppmerksom på at om du velger et grensesnitt som allerede er med et "
++#~ "annet nettverk, blir det flyttet til dette nettverket"
++
++#~ msgid ""
++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might "
++#~ "lose access to this router if you are connected via this interface."
++#~ msgstr ""
++#~ "Fjerne dette grensesnittet? Slettingen kan ikke omgjøres!\\nDu kan miste "
++#~ "kontakten med ruteren om du er tilkoblet via dette grensesnittet."
++
++#~ msgid ""
++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou "
++#~ "might lose access to this router if you are connected via this network."
++#~ msgstr ""
++#~ "Fjerne dette trådløse nettverket? Slettingen kan ikke omgjøres!\\nDu kan "
++#~ "miste kontakten med ruteren om du er tilkoblet via dette nettverket."
++
++#~ msgid ""
++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router "
++#~ "if you are connected via this interface."
++#~ msgstr ""
++#~ "Slå av dette grensesnittet? \"%s\" ?\\nDu kan miste kontakten med ruteren "
++#~ "om du er tilkoblet via dette grensesnittet."
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "Nettverks portene på ruteren kan kombineres til flere <abbr title="
++#~ "\"Virtual Lokal Network\">VLAN</abbr>s der datamaskiner kan kommunisere "
++#~ "direkte med hverandre. <abbr title=\"Virtual Lokal Network\">VLAN</abbr>s "
++#~ "brukes ofte for å skille ulike nettverk segmenter. Det er vanlig og ha en "
++#~ "uplink-port for tilkobling til større nettverk som internett og andre "
++#~ "porter til lokalt nettverk."
++
++#~ msgid "Custom Files"
++#~ msgstr "Egendefinerte Filer"
++
++#~ msgid "Custom files"
++#~ msgstr "Egendefinerte filer"
++
++#~ msgid "Detected Files"
++#~ msgstr "Filer funnet"
++
++#~ msgid "Detected files"
++#~ msgstr "Filer funnet"
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Beholde filer ved programvare oppgradering"
++
++#~ msgid "General"
++#~ msgstr "Generelt"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr "Her kan du endre innstillinger og funksjonaliteten til LuCI."
++
++#~ msgid "Post-commit actions"
++#~ msgstr "Aktiver endringer"
++
++#~ msgid ""
++#~ "The following files are detected by the system and will be kept "
++#~ "automatically during sysupgrade"
++#~ msgstr ""
++#~ "Følgende filer er oppdaget av systemet og vil automatisk bli bevart under "
++#~ "systemoppgradering"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Disse endringene vil bli utført automatisk når en <abbr title=\"Unified "
++#~ "Configuration Interface\">UCI</abbr> konfigurasjon brukes, endringen trer "
++#~ "i kraft umiddelbart."
++
++#~ msgid ""
++#~ "This is a list of shell glob patterns for matching files and directories "
++#~ "to include during sysupgrade"
++#~ msgstr ""
++#~ "Dette er en liste med filer og regler som skal inkluderes ved "
++#~ "systemoppgradering"
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Web Brukergrensesnitt"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++
++#~ msgid "AHCP Settings"
++#~ msgstr "AHCP Innstillinger"
++
++#~ msgid "ARP ping retries"
++#~ msgstr "ARP ping forsøk"
++
++#~ msgid "ATM Settings"
++#~ msgstr "<abbr title=\"Asynchronous Transfer Mode\">ATM</abbr>Innstillinger"
++
++#~ msgid "Accept Router Advertisements"
++#~ msgstr "Godta Ruter Annonseringer"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Aksesspunkt (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Andre pppd alternativer"
++
++#~ msgid "Allowed range is 1 to FFFF"
++#~ msgstr "Det tillatte området er 1 til FFFF"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Automatisk nedkobling"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Sikkerhetskopi arkiv"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Konfigurer den lokale DNS-serveren slik at den bruker navnetjeneren som "
++#~ "blir gitt av PPP peer"
++
++#~ msgid "Connect script"
++#~ msgstr "Oppkoblings skript"
++
++#~ msgid "Create backup"
++#~ msgstr "Lag sikkerhetskopi"
++
++#~ msgid "Default"
++#~ msgstr "Standard"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Frakoblings skript"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Endre pakke-liste og installasjon mål"
++
++#~ msgid "Enable 4K VLANs"
++#~ msgstr "Aktiver 4K VLANs"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Aktiver IPv6 på PPP lenke"
++
++#~ msgid "Firmware image"
++#~ msgstr "Firmware fil"
++
++#~ msgid "Forward DHCP"
++#~ msgstr "Videresend DHCP"
++
++#~ msgid "Forward broadcasts"
++#~ msgstr "Videresend broadcast"
++
++#~ msgid "HE.net Tunnel ID"
++#~ msgstr "HE.net Tunnel ID"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Her kan du ta sikkerhetskopi og gjenopprette ruterens konfigurasjon og -"
++#~ "om mulig- tilbakestille ruteren til standardinnstillingene."
++
++#~ msgid "Installation targets"
++#~ msgstr "Installasjon mål"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Behold konfigurasjonsfiler"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Keep-Alive"
++
++#~ msgid "Kernel"
++#~ msgstr "Kjerne"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Etter vellykket oppkobling, la pppd erstatte standard rute og sett den "
++#~ "opp for PPP-grensesnittet"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr "La pppd kjøre dette skriptet etter PPP oppkobling"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "La pppd kjøre dette skriptet før frakobling av PPP lenke"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Pass på at du oppgir riktig PIN-kode her, om ikke kan du låse SIM-kortet!"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "De fleste av dem er nettverkstjenere som tilbyr tjenester på enheten "
++#~ "eller nettverket. Som f.eks. shell tilgang, webserver for <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, mesh ruting, sende e-"
++#~ "post, ..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr ""
++#~ "Antallet mislykkede forsøk på forbindelse før automatisk oppkobling blir "
++#~ "initiert."
++
++#~ msgid "Override Gateway"
++#~ msgstr "Overstyr Gateway"
++
++#~ msgid "PIN code"
++#~ msgstr "PIN kode"
++
++#~ msgid "PPP Settings"
++#~ msgstr "PPP Innstillinger"
++
++#~ msgid "Package lists"
++#~ msgstr "Pakke-lister"
++
++#~ msgid ""
++#~ "Port <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> specify the default "
++#~ "VLAN ID added to received untagged frames."
++#~ msgstr ""
++#~ "Port <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> spesifiserer standard "
++#~ "VLAN ID som legges på mottatte utaggete ethernet-rammer.<br />"
++
++#~ msgid "Port PVIDs on %q"
++#~ msgstr "Port PVIDs på %q"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr "Fortsette tilbakestilling av alle innstillinger til standard?"
++
++#~ msgid "Processor"
++#~ msgstr "Prosessor"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Radius-Port"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Radius-Server"
++
++#~ msgid "Relay Settings"
++#~ msgstr "Relay Innstillinger"
++
++#~ msgid "Replace default route"
++#~ msgstr "Erstatt standard rute"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Tilbakestill ruteren til standard innstilling"
++
++#~ msgid "Routing table ID"
++#~ msgstr "Ruting tabell ID"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr "Antall sekunder en må vente før modemet er klar for oppkobling"
++
++#~ msgid "Send Router Solicitiations"
++#~ msgstr "Send Ruter Anmodninger"
++
++#~ msgid "Server IPv4-Address"
++#~ msgstr "Server IPv4-Adresse"
++
++#~ msgid "Service type"
++#~ msgstr "Tjeneste type"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr "Tjenester og daemoner utfører forskjellige oppgaver på enheten."
++
++#~ msgid "Settings"
++#~ msgstr "Innstillinger"
++
++#~ msgid "Setup wait time"
++#~ msgstr "Initialiserings ventetid"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Beklager. OpenWrt støtter ikke systemoppgradering på denne plattformen."
++#~ "<br /> Du må flashe enheten manuelt."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr "Angi flere kommandolinje argumenter for pppd her"
++
++#~ msgid "TTL"
++#~ msgstr "TTL"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "Node enheten for modemet, f.eks. /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr "Tid (i sekunder) før ubrukt forbindelse vil bli frakoblet"
++
++#~ msgid "Time Server (rdate)"
++#~ msgstr "Tids Server (rdate)"
++
++#~ msgid "Tunnel Settings"
++#~ msgstr "Tunnel Innstillinger"
++
++#~ msgid "Update package lists"
++#~ msgstr "Oppdater pakke-listene"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr ""
++#~ "Last opp en OpenWrt Firmware fil, som deretter blir brukt til å "
++#~ "oppgradere enheten."
++
++#~ msgid "Upload image"
++#~ msgstr "Last opp firmware"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "Bruk peer DNS"
++
++#~ msgid "VLAN %d"
++#~ msgstr "VLAN %d"
++
++#~ msgid ""
++#~ "You can specify multiple DNS servers here, press enter to add a new "
++#~ "entry. Servers entered here will override automatically assigned ones."
++#~ msgstr ""
++#~ "Her kan du definere flere DNS servere, trykk 'Enter' for å legge til en "
++#~ "ny oppføring. Servere definert her vil overstyre de automatisk tildelte."
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Du må installere \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA eller \"pptp\" for PPtP støtte"
++
++#~ msgid "back"
++#~ msgstr "tilbake"
++
++#~ msgid "buffered"
++#~ msgstr "bufret"
++
++#~ msgid "cached"
++#~ msgstr "hurtigbufrede"
++
++#~ msgid "free"
++#~ msgstr "tilgjengelig"
++
++#~ msgid "static"
++#~ msgstr "Statisk"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> er en samling av "
++#~ "fri Lua programvare som inkluderer <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework og webgrensnitt for innebygde enheter. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> er lisensert under "
++#~ "Apache-lisensen."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "<abbr title=\"Secure Shell\">SSH</abbr>-Nøkler"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr "En lettvekts HTTP/1.1 webserver skrevet i C og Lua laget for LuCI"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "En lettvekts webserver som kan brukes til å tjene <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++
++#~ msgid "About"
++#~ msgstr "Om"
++
++#~ msgid "Active IP Connections"
++#~ msgstr "Aktive IP tilkoblinger"
++
++#~ msgid "Addresses"
++#~ msgstr "Adresser"
++
++#~ msgid "Admin Password"
++#~ msgstr "Admin Passord"
++
++#~ msgid "Alias"
++#~ msgstr "Alias"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Passord beskyttet område"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Bro Port"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr "Endre passordet for systemansvarlig (Bruker <code>root</code>)"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Klient + WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "Konfigurasjonsfil"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Tidsavbrudd for tilkobling"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Medvirkende utviklere"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "DHCP tildelt"
++
++#~ msgid "Document root"
++#~ msgstr "Dokument-roten"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Aktiver Keep-Alive"
++
++#~ msgid "Enable device"
++#~ msgstr "Aktiver enhet"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "Ethernet Bro"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "Her kan du lime inn felles <abbr title=\"Secure Shell\">SSH</abbr>-nøkler "
++#~ "(en per linje) for <abbr title=\"Secure Shell\">SSH</abbr> godkjenning."
++
++#~ msgid "ID"
++#~ msgstr "ID"
++
++#~ msgid "IP Configuration"
++#~ msgstr "IP Konfigurasjon"
++
++#~ msgid "Interface Status"
++#~ msgstr "Grensesnitt Status"
++
++#~ msgid "Lead Development"
++#~ msgstr "Hovedutviklere"
++
++#~ msgid "Master"
++#~ msgstr "Aksesspunkt"
++
++#~ msgid "Master + WDS"
++#~ msgstr "Aksesspunkt + WDS"
++
++#~ msgid "No address configured on this interface."
++#~ msgstr "Ingen adresse er konfigurert på dette grensesnittet."
++
++#~ msgid "Not configured"
++#~ msgstr "Ikke konfigurert"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Passordet er endret"
++
++#~ msgid "Plugin path"
++#~ msgstr "Plugin sti"
++
++#~ msgid "Ports"
++#~ msgstr "Porter"
++
++#~ msgid "Primary"
++#~ msgstr "Primær"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Prosjektets Hjemmeside"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "Pseudo Ad-Hoc"
++
++#~ msgid "STP"
++#~ msgstr "STP"
++
++#~ msgid "Thanks To"
++#~ msgstr "Takk til"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr "Beskrivelse av passord beskyttet område, vises ved innlogging."
++
++#~ msgid "Unknown Error"
++#~ msgstr "Ukjent feil"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "Standard <code>/etc/httpd.conf</code>"
++
++#~ msgid "Enable this switch"
++#~ msgstr "Aktiver denne svitsj"
++
++#~ msgid "OPKG error code %i"
++#~ msgstr "OPKG feil kode %i"
++
++#~ msgid "Package lists updated"
++#~ msgstr "Pakke-listene oppdatert"
++
++#~ msgid "Reset switch during setup"
++#~ msgstr "Nullstill svitsj under oppstart"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Oppgrader installerte pakker"
+diff --git a/feeds/luci/modules/luci-base/po/pl/base.po b/feeds/luci/modules/luci-base/po/pl/base.po
+new file mode 100644
+index 0000000..14b61f8
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/pl/base.po
+@@ -0,0 +1,3488 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2010-04-20 09:40+0200\n"
++"PO-Revision-Date: 2014-04-23 19:15+0200\n"
++"Last-Translator: goodgod261 <goodgod261@wp.pl>\n"
++"Language-Team: Polish\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(okno %d minut, interwał %d sekund)"
++
++msgid "(%s available)"
++msgstr "(dostępne %s)"
++
++msgid "(empty)"
++msgstr "(pusty)"
++
++msgid "(no interfaces attached)"
++msgstr "(brak podłączonych interfejsów)"
++
++msgid "-- Additional Field --"
++msgstr "-- Dodatkowe pole --"
++
++msgid "-- Please choose --"
++msgstr "-- Proszę wybrać --"
++
++msgid "-- custom --"
++msgstr "-- własne --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Obciążenie 1 min.:"
++
++msgid "15 Minute Load:"
++msgstr "Obciążenie 15 min.:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Obciążenie 5 min.:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "Port wywołania <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "Port serwera <abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"Nazwa <abbr title=\"Domain Name System\">DNS</abbr> będzie rozwijana przez "
++"kolejne serwery w porzÄ…dku podanym w resolvfile"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "Adres <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "Brama <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "Maska sieci <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"Adres sieci (CIDR) <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "Brama <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "Konfiguracja diod <abbr title=\"Light Emitting Diode\">LED</abbr>"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "Nazwa diody <abbr title=\"Light Emitting Diode\">LED</abbr>"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "Adres <abbr title=\"Media Access Control\">MAC</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"<abbr title=\"Maksymalna ilość\">Maks.</abbr> dzierżaw <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=\"Maksymalny\">Maks.</abbr> rozmiar pakietu <abbr title="
++"\"Extension Mechanisms for Domain Name System\">EDNS0</abbr>"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"Maksymalna ilość\">Maks.</abbr> zapytań równoczesnych"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Par: %s / Grup: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++# Wydaje mi się że brakuje litery R...
++msgid "AR Support"
++msgstr "Wsparcie dla ARP"
++
++msgid "ARP retry threshold"
++msgstr "Próg powtórzeń ARP"
++
++msgid "ATM Bridges"
++msgstr "Mostki ATM"
++
++# Nie wiem czy to powinno się tłumaczyć wg. mnie lepiej zostawić po angielsku
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "Identyfikator kanału wirtualnego ATM (VCI)"
++
++# j.w.
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "Identyfikator ścieżki wirtualnej ATM (VPI)"
++
++# Jak zwykle zakręciłem...niech ktoś poprawi
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"Mostki ATM maskują za-kapsułkowane ramki Ethernet w połączeniach AAL5 jako "
++"wirtualne interfejsy w Linuksie. Interfejsy takie mogą być użyte w "
++"połączeniu z protokołami DHCP lub PPP do wdzwaniania się do sieci provider`a"
++
++msgid "ATM device number"
++msgstr "Numer urzÄ…dzenia ATM"
++
++msgid "AYIYA"
++msgstr ""
++
++# co to takiego?
++msgid "Access Concentrator"
++msgstr "Koncentrator dostępowy ATM"
++
++msgid "Access Point"
++msgstr "Punkt dostępowy"
++
++msgid "Action"
++msgstr "Akcja"
++
++msgid "Actions"
++msgstr "Akcje"
++
++msgid "Activate this network"
++msgstr "Aktywuj tą sieć"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++"Aktywne trasy routingu <abbr title=\"Internet Protocol Version 4\">IPv4</"
++"abbr>"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++"Aktywne trasy routingu <abbr title=\"Internet Protocol Version 6\">IPv6</"
++"abbr>"
++
++msgid "Active Connections"
++msgstr "Aktywne połączenia"
++
++msgid "Active DHCP Leases"
++msgstr "Aktywne dzierżawy DHCP"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Aktywne dzierżawy DHCPv6"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Dodaj"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr "Dodaj lokalny sufiks domeny do nazw urządzeń z pliku hosts"
++
++msgid "Add new interface..."
++msgstr "Dodaj nowy interfejs..."
++
++msgid "Additional Hosts files"
++msgstr "Dodatkowe pliki Hosts"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Adres"
++
++# Na upartego można by zrobić Adres dostępowy mostu przekaźnikowego - ale kto to zrozumie?
++msgid "Address to access local relay bridge"
++msgstr "Adres dostępowy do \"relay bridge\""
++
++msgid "Administration"
++msgstr "ZarzÄ…dzanie"
++
++msgid "Advanced Settings"
++msgstr "Ustawienia zaawansowane"
++
++msgid "Alert"
++msgstr "Alarm"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr "Pozwól na logowanie <abbr title=\"Secure Shell\">SSH</abbr>"
++
++msgid "Allow all except listed"
++msgstr "Pozwól wszystkim oprócz wymienionych"
++
++msgid "Allow listed only"
++msgstr "Pozwól tylko wymienionym"
++
++msgid "Allow localhost"
++msgstr "Pozwól tylko sobie (localhost)"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"Pozwól zdalnym komputerom na połączenia SSH do lokalnych przekierowanych "
++"portów"
++
++msgid "Allow root logins with password"
++msgstr "Zezwól na logowanie roota przy pomocy hasła"
++
++# Brak spacji...
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "Pozwól użytkownikowi <em>root</em> na logowanie przy pomocy hasła"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr ""
++"Pozwól na ruch wychodzący (odpowiedzi) z podsieci 127.0.0.0/8, np. usługi RBL"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr ""
++"Zostanie utworzona dodatkowa sieć jeśli zostawisz tą opcję niezaznaczoną."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antena 1"
++
++msgid "Antenna 2"
++msgstr "Antena 2"
++
++msgid "Antenna Configuration"
++msgstr "Ustawienia anteny"
++
++msgid "Any zone"
++msgstr "Dowolna strefa"
++
++msgid "Apply"
++msgstr "Zatwierdź"
++
++msgid "Applying changes"
++msgstr "Wprowadzam zmiany"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Przypisz interfejsy..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Połączone stacje"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Bezprzewodowy kontroler Atheros 802.11%s"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Uwierzytelnianie"
++
++# Nawet M$ tego nie tłumaczy;)
++msgid "Authoritative"
++msgstr "Autorytatywny"
++
++msgid "Authorization Required"
++msgstr "Wymagana autoryzacja"
++
++msgid "Auto Refresh"
++msgstr "Automatyczne odświeżanie"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Dostępne"
++
++msgid "Available packages"
++msgstr "Dostępne pakiety"
++
++msgid "Average:"
++msgstr "Åšrednia:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Wróć"
++
++msgid "Back to Overview"
++msgstr "Wróć do przeglądu"
++
++msgid "Back to configuration"
++msgstr "Wróć do konfiguracji"
++
++msgid "Back to overview"
++msgstr "Wróć do przeglądu"
++
++msgid "Back to scan results"
++msgstr "Wróć do wyników skanowania"
++
++msgid "Background Scan"
++msgstr "Skanowanie w tle"
++
++msgid "Backup / Flash Firmware"
++msgstr "Kopia zapasowa/aktualizacja firmware"
++
++# NIe ma powodu skracać tekstu, zmieści się w polu.
++msgid "Backup / Restore"
++msgstr "Kopia zapasowa/Przywróć"
++
++msgid "Backup file list"
++msgstr "Kopia zapas. listy plików"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"Poniżej widoczna jest lista plików przeznaczonych do kopii zapasowej. "
++"Zawiera ona zmienione pliki konfiguracyjne oznaczone przez opkg, podstawowe "
++"pliki systemowe, oraz pliki oznaczone do kopiowania przez użytkownika."
++
++msgid "Bitrate"
++msgstr "Przepływność"
++
++msgid "Bogus NX Domain Override"
++msgstr "Podrób statystyki NXDOMAIN"
++
++msgid "Bridge"
++msgstr "Most"
++
++msgid "Bridge interfaces"
++msgstr "Interfejs mostu"
++
++msgid "Bridge unit number"
++msgstr "Numer Mostu (urzÄ…dzenia)"
++
++# Podejrzewam że chodzi o interfejs? mam rację?
++msgid "Bring up on boot"
++msgstr "PodnieÅ› przy stracie"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Bezprzewodowy kontroler Broadcom 802.11%s"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Bezprzewodowy kontroler Broadcom BCM%04x 802.11"
++
++msgid "Buffered"
++msgstr "Buforowana"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Przyciski"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "Użycie CPU (%)"
++
++msgid "Cancel"
++msgstr "Anuluj"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "ÅaÅ„cuch"
++
++msgid "Changes"
++msgstr "Zmiany"
++
++msgid "Changes applied."
++msgstr "Zmiany zostały zastosowane."
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "Zmienia hasło administratora"
++
++msgid "Channel"
++msgstr "Kanał"
++
++msgid "Check"
++msgstr "Sprawdź"
++
++msgid "Checksum"
++msgstr "Suma kontrolna"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Wybierz strefę firewalla którą chcesz przypisać do tego interfejsu. Wybierz "
++"<em>unspecified</em> aby usunąć interfejs z przypisanej strefy lub wybierz "
++"pole <em>create</em> aby zdefiniować nową strefę i przypisać ją do "
++"interfejsu."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Wybierz sieć/sieci które chcesz przyłączyć do tego interfejsu "
++"bezprzewodowego lub wypełnij pole <em>utwórz</em> aby utworzyć nową sieć."
++
++msgid "Cipher"
++msgstr "Szyfr"
++
++# Przyciski nazywają sie "Twórz archiwum" i "Wykonaj reset" a nie Przywróć Ustawienia
++msgid ""
++"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)."
++msgstr ""
++"Wciśnij \"Twórz archiwum\" aby pobrać archiwum tar zawierające bieżące pliki "
++"konfiguracyjne. Aby przywrócić ustawienia domyślne wciśnij \"Wykonaj reset"
++"\" (możliwe tylko w przypadku obrazu squashfs)."
++
++msgid "Client"
++msgstr "Klient"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "Nazwa (ID) klienta do wysłania podczas negocjacji DHCP"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Zamykaj nieaktywne połączenia po określonym czasie podanym w sekundach, "
++"wpisz 0 aby uzyskać stałe połączenie."
++
++msgid "Close list..."
++msgstr "Zamknij listÄ™..."
++
++msgid "Collecting data..."
++msgstr "Zbieranie danych..."
++
++msgid "Command"
++msgstr "Polecenie"
++
++msgid "Common Configuration"
++msgstr "Konfiguracja podstawowa"
++
++msgid "Compression"
++msgstr "Kompresja"
++
++msgid "Configuration"
++msgstr "Konfiguracja"
++
++msgid "Configuration applied."
++msgstr "Konfiguracja została zastosowana."
++
++msgid "Configuration files will be kept."
++msgstr "Pliki konfiguracyjne zostanÄ… zachowane."
++
++msgid "Confirmation"
++msgstr "Potwierdzenie"
++
++msgid "Connect"
++msgstr "Połącz"
++
++msgid "Connected"
++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 "Country"
++msgstr "Kraj"
++
++msgid "Country Code"
++msgstr "Kod kraju"
++
++# Pokrywa następujące interfejsy
++msgid "Cover the following interface"
++msgstr "Pokrywa następujący interfejs"
++
++msgid "Cover the following interfaces"
++msgstr "Pokrywa następujące interfejsy"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Utwórz / Przypisz strefę firewalla"
++
++msgid "Create Interface"
++msgstr "Utwórz interfejs"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Utwórz most pomiędzy wieloma interfejsami"
++
++msgid "Critical"
++msgstr "Krytyczne"
++
++msgid "Cron Log Level"
++msgstr "Poziom logowania Cron`a"
++
++msgid "Custom Interface"
++msgstr "Interfejs Niestandardowy"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++# Spacji zabrało i napisy się skleiły
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Dostosuj zachowanie diod <abbr title=\"Light Emitting Diode\">LED</abbr> "
++"urządzenia jeśli jest to możliwe."
++
++msgid "DHCP Leases"
++msgstr "Dzierżawy DHCP"
++
++msgid "DHCP Server"
++msgstr "Serwer DHCP"
++
++msgid "DHCP and DNS"
++msgstr "DHCP i DNS"
++
++msgid "DHCP client"
++msgstr "Klient DHCP"
++
++msgid "DHCP-Options"
++msgstr "Opcje DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr "Dzierżawy DHCPv6"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "Przekierowania DNS"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Debug"
++
++msgid "Default %d"
++msgstr "Domyślne %d"
++
++msgid "Default gateway"
++msgstr "Brama domyślna"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Stan domyślny"
++
++msgid "Define a name for this network."
++msgstr "Określ nazwę dla tej sieci."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Zdefiniuj dodatkowe opcje DHCP, np. \"<code>6,192.168.2.1,192.168.2.2</code>"
++"\" rozgłasza domyślne serwery DNS klientom DHCP."
++
++msgid "Delete"
++msgstr "Usuń"
++
++msgid "Delete this interface"
++msgstr "Usuń ten interfejs"
++
++msgid "Delete this network"
++msgstr "Usuń tą sieć"
++
++msgid "Description"
++msgstr "Opis"
++
++# Ktoś tłumaczył bez zobaczenia tego w gui. Dotyczy zmiany motywu ten opis.
++msgid "Design"
++msgstr "Motyw"
++
++msgid "Destination"
++msgstr "Przeznaczenie"
++
++msgid "Device"
++msgstr "UrzÄ…dzenie"
++
++msgid "Device Configuration"
++msgstr "Konfiguracja urzÄ…dzenia"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnostyka"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Katalog"
++
++msgid "Disable"
++msgstr "Wyłącz"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Wyłącz <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> na "
++"tym interfejsie."
++
++msgid "Disable DNS setup"
++msgstr "Wyłącz konfigurowanie DNS"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Wyłącz zegar HW-Beacon"
++
++msgid "Disabled"
++msgstr "Wyłączony"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Odrzuć wychodzące odpowiedzi RFC1918"
++
++msgid "Displaying only packages containing"
++msgstr "PokazujÄ™ tylko paczki zawierajÄ…ce"
++
++msgid "Distance Optimization"
++msgstr "Optymalizacja odległości"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Odległość do najdalej oddalonego członka sieci w metrach."
++
++msgid "Distribution feeds"
++msgstr ""
++
++# Jak poprzednio trzymam siÄ™ konwencji
++msgid "Diversity"
++msgstr "Wielorakość"
++
++# Nie wiem czy nie zamotałem ja rozumiem;)
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq jest to serwer <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr> połączony z serwerem <abbr title=\"Domain Name System\">DNS</"
++"abbr>. Jest to serwer przekazujÄ…cy (Fowarder) dla firewalli <abbr title="
++"\"Network Address Translation\">NAT</abbr>"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr "Nie cache`uj odpowiedzi negatywnych, np. nie dla bieżących domen"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr ""
++"Nie przekazuj zapytań które nie mogą być zrealizowane przez publiczne "
++"serwery nazw"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr "Nie przekazuj odwrotnych lookup`ów do sieci lokalnych"
++
++msgid "Do not send probe responses"
++msgstr "Nie wysyłaj ramek probe response"
++
++msgid "Domain required"
++msgstr "Wymagana domena"
++
++msgid "Domain whitelist"
++msgstr "Whitelist domen (Dozwolone domeny)"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Nie przekazuj zapytań <abbr title=\"Domain Name System\">DNS</abbr> bez "
++"nazwy <abbr title=\"Domain Name System\">DNS</abbr>'a"
++
++msgid "Download and install package"
++msgstr "Pobierz i zainstaluj pakiet"
++
++msgid "Download backup"
++msgstr "Pobierz kopiÄ™ zapasowÄ…"
++
++msgid "Dropbear Instance"
++msgstr "Usługa Dropbear"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear oferuje zdalny dostęp do konsoli (shell`a) poprzez swojego klienta "
++"<abbr title=\"Secure Shell\">SSH</abbr> oraz serwer <abbr title=\"Secure Copy"
++"\">SCP</abbr>"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++# "n" brakowało...
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> dynamiczne"
++
++msgid "Dynamic tunnel"
++msgstr "Tunel dynamiczny"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"Dynamicznie rezerwuje adresy DHCP dla klientów. Jeśli jest wyłączone tylko "
++"klienci posiadający stałe dzierżawy będą obsłużeni."
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "Metoda EAP"
++
++msgid "Edit"
++msgstr "Edycja"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Edytuj ten interfejs"
++
++msgid "Edit this network"
++msgstr "Edytuj tą sieć"
++
++# dosłownie nagły wypadek
++msgid "Emergency"
++msgstr "Zagrożenie"
++
++msgid "Enable"
++msgstr "WÅ‚Ä…cz"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "WÅ‚Ä…cz <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "Włącz dynamiczną aktualizację punktu końcowego sieci HE.net"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "WÅ‚Ä…cz przechodzenie ramek Jumbo"
++
++msgid "Enable NTP client"
++msgstr "WÅ‚Ä…cz klienta NTP"
++
++msgid "Enable TFTP server"
++msgstr "WÅ‚Ä…cz serwer TFTP"
++
++msgid "Enable VLAN functionality"
++msgstr "Włącz funkcjonalność VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "WÅ‚Ä…cz uczenie siÄ™ i starzenie"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "WÅ‚Ä…cz ten punkt montowania"
++
++msgid "Enable this swap"
++msgstr "WÅ‚Ä…cz ten swap"
++
++msgid "Enable/Disable"
++msgstr "Wlącz/Wyłącz"
++
++msgid "Enabled"
++msgstr "WÅ‚Ä…czony"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr ""
++"Włącz protokół <abbr title=\"Spanning Tree Protocol\">STP</abbr> na tym "
++"moście"
++
++# a może sposób kapsułkowania byłby lepszy?
++msgid "Encapsulation mode"
++msgstr "Sposób Enkapsulacji"
++
++msgid "Encryption"
++msgstr "Szyfrowanie"
++
++msgid "Erasing..."
++msgstr "Usuwanie..."
++
++msgid "Error"
++msgstr "BÅ‚Ä…d"
++
++msgid "Ethernet Adapter"
++msgstr "Karta Ethernet"
++
++msgid "Ethernet Switch"
++msgstr "Switch Ethernet"
++
++msgid "Expand hosts"
++msgstr "Rozwiń hosty"
++
++msgid "Expires"
++msgstr "Wygasa"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++"Czas wygasania dzierżawy adresu, minimum to 2 Minuty (<code>2m</code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Zewnętrzny serwer dla loga systemowego"
++
++msgid "External system log server port"
++msgstr "Port zewnętrznego serwera dla loga systemowego"
++
++msgid "Fast Frames"
++msgstr "Szybkie ramki (Fast Frames)"
++
++msgid "File"
++msgstr "Plik"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Rozgłoszono nazwę pliku obrazu startowego do klientów"
++
++msgid "Filesystem"
++msgstr "System plików"
++
++msgid "Filter"
++msgstr "Filtr"
++
++msgid "Filter private"
++msgstr "Filtruj prywatne"
++
++msgid "Filter useless"
++msgstr "Filtruj bezużyteczne"
++
++msgid "Find and join network"
++msgstr "Znajdź i podłącz się do sieci"
++
++msgid "Find package"
++msgstr "Znajdź pakiet"
++
++msgid "Finish"
++msgstr "Zakończ"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++# Nie ma potrzeby pisania z dużej litery
++msgid "Firewall Settings"
++msgstr "Ustawienia firewalla"
++
++msgid "Firewall Status"
++msgstr "Stan firewalla"
++
++msgid "Firmware Version"
++msgstr "Wersja firmware"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "Stały port źródłowy dla wychodzących zapytań DNS"
++
++msgid "Flags"
++msgstr "Flagi"
++
++msgid "Flash Firmware"
++msgstr "Aktualizuj firmware"
++
++msgid "Flash image..."
++msgstr "Wgraj obraz..."
++
++msgid "Flash new firmware image"
++msgstr "Wgraj nowy firmware"
++
++msgid "Flash operations"
++msgstr "Operacje aktualizacji"
++
++msgid "Flashing..."
++msgstr "Flashowanie..."
++
++msgid "Force"
++msgstr "WymuÅ›"
++
++msgid "Force CCMP (AES)"
++msgstr "WymuÅ› CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++"WymuÅ› uruchomienie serwera DHCP w tej sieci nawet gdy wykryto inny serwer."
++
++msgid "Force TKIP"
++msgstr "WymuÅ› TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "WymuÅ› TKIP i CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "Przekazuj ruch DHCP"
++
++msgid "Forward broadcast traffic"
++msgstr "Przekazuj broadcast`y"
++
++msgid "Forwarding mode"
++msgstr "Tryb przekazywania"
++
++msgid "Fragmentation Threshold"
++msgstr "Próg Fragmentacji"
++
++msgid "Frame Bursting"
++msgstr "Dzielenie ramek"
++
++msgid "Free"
++msgstr "Wolna"
++
++msgid "Free space"
++msgstr "Wolna przestrzeń"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "Tylko GPRS"
++
++msgid "Gateway"
++msgstr "Brama"
++
++msgid "Gateway ports"
++msgstr "Porty bramy"
++
++msgid "General Settings"
++msgstr "Ustawienia główne"
++
++msgid "General Setup"
++msgstr "Ustawienia podstawowe"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "Twórz archiwum"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Ogólny bezprzewodowy kontroler 802.11%s"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++"Hasło nie zostało zmienione, wpisane poprzednie hasło routera jest "
++"niewłaściwe!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Przejdź do konfiguracji hasła..."
++
++msgid "Go to relevant configuration page"
++msgstr "Przejdź do powiązanych ustawień"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "Hasło HE.net"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Uchwyt"
++
++msgid "Hang Up"
++msgstr "Rozłącz"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Tutaj możesz skonfigurować podstawowe ustawienia twojego urządzenia, np. "
++"nazwÄ™ hosta, strefÄ™ czasowÄ…."
++
++# nie ma słowa "autentykacji". Uwierzytelnianie!
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++"Tutaj wklej swoje klucze publiczne SSH (po jednym w linii), dla "
++"uwierzytelniania SSH"
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Kontroler bezprzewodowy Hermes 802.11b"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++"Ukryj <abbr title=\"Extended Service Set Identifier (NazwÄ™ sieci)\">ESSID</"
++"abbr>"
++
++msgid "Host entries"
++msgstr "Wpisy PC"
++
++msgid "Host expiry timeout"
++msgstr "Czas wygasania hosta"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "<abbr title=\"Internet Protocol Address\">IP</abbr> lub sieć Hosta"
++
++msgid "Hostname"
++msgstr "Nazwa hosta"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "Nazwa hosta do wysłania podczas negocjacji DHCP"
++
++msgid "Hostnames"
++msgstr "Nazwy hostów"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "Adres IP"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "Firewall IPv4"
++
++msgid "IPv4 WAN Status"
++msgstr "Status IPv4 WAN"
++
++msgid "IPv4 address"
++msgstr "Adres IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 oraz IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "Broadcast IPv4"
++
++msgid "IPv4 gateway"
++msgstr "Brama IPv4"
++
++msgid "IPv4 netmask"
++msgstr "Maska IPv4"
++
++msgid "IPv4 only"
++msgstr "Tylko IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "Długość prefiksu IPv4"
++
++msgid "IPv4-Address"
++msgstr "Adres IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "Firewall IPv6"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "Status WAN IPv6"
++
++msgid "IPv6 address"
++msgstr "Adres IPv6"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "Brama IPv6"
++
++msgid "IPv6 only"
++msgstr "Tylko IPv6"
++
++msgid "IPv6 prefix"
++msgstr "Prefiks IPv6"
++
++msgid "IPv6 prefix length"
++msgstr "Długość prefiksu IPv6"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "Adres IPv6"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-w-IPv4 (RFC4213)"
++
++# 6rd to nie "szóste", tylko IPv6 rapid deployment
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6-przez-IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6-przez-IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "Tożsamość"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++"Jeśli podano, zainstaluj urządzenie poprzez jego UUID zamiast <abbr title="
++"\"fixed device node\">ustalonego węzła urządzenia</abbr>"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++"Jeśli podano, zainstaluj urządzenie poprzez nazwę partycji zamiast <abbr "
++"title=\"fixed device node\">ustalonego węzła urządzenia</abbr>"
++
++msgid "If unchecked, no default route is configured"
++msgstr "Jeśli odznaczone, nie ma zdefiniowanej domyślnej ścieżki routingu"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr "Jeśli odznaczone, rozgłoszane adresy serwerów DNS są ignorowane"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Jeśli ilość twojej pamięci fizycznej jest niewystarczająca, nieużywane "
++"miejsce na dysku może być tymczasowo wykorzystane na urządzenie pliku "
++"wymiany. W rezultacie większa ilość pamięci <abbr title=\"Random Access "
++"Memory\">RAM</abbr> będzie dostępna. Uwaga - plik wymiany jest dużo "
++"wolniejszy niż pamięć <abbr title=\"Random Access Memory\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr "Ignoruj interfejs"
++
++msgid "Ignore resolve file"
++msgstr "Ignoruj pliki resolve"
++
++msgid "Image"
++msgstr "Obraz"
++
++msgid "In"
++msgstr "W"
++
++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 "Czas bezczynności"
++
++msgid "Inbound:"
++msgstr "PrzychodzÄ…cy:"
++
++msgid "Info"
++msgstr "Info"
++
++msgid "Initscript"
++msgstr "Skrypt startowy"
++
++msgid "Initscripts"
++msgstr "Skrypty startowe"
++
++msgid "Install"
++msgstr "Instaluj"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Instaluj pakiet %q"
++
++msgid "Install protocol extensions..."
++msgstr "Instaluj rozszerzenia protokołów..."
++
++msgid "Installed packages"
++msgstr "Zainstalowane pakiety"
++
++msgid "Interface"
++msgstr "Interfejs"
++
++msgid "Interface Configuration"
++msgstr "Konfiguracja Interfejsu"
++
++# Tam jest lista interfejsów....
++msgid "Interface Overview"
++msgstr "Przegląd Interfejsów"
++
++msgid "Interface is reconnecting..."
++msgstr "Ponowne Å‚Ä…czenie interfejsu..."
++
++msgid "Interface is shutting down..."
++msgstr "Interfejs jest wyłączany..."
++
++msgid "Interface not present or not connected yet."
++msgstr "Interfejs nie istnieje lub nie jest jeszcze podłączony."
++
++msgid "Interface reconnected"
++msgstr "Połączono ponownie interfejs"
++
++msgid "Interface shut down"
++msgstr "Wyłączono interfejs"
++
++msgid "Interfaces"
++msgstr "Interfejsy"
++
++msgid "Internal"
++msgstr ""
++
++# Nadużycie tagu abbr uważam za uzasadnione.
++msgid "Internal Server Error"
++msgstr "Wewnętrzny błąd serwera"
++
++msgid "Invalid"
++msgstr "Niewłaściwy"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr "Podano niewłaściwy ID VLAN`u! Dozwolone są tylko ID pomiędzy %d a %d."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "Podano niewłaściwy ID VLAN`u! Dozwolone są tylko unikalne ID."
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Niewłaściwy login i/lub hasło! Spróbuj ponownie."
++
++#, 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 ""
++"Wygląda na to, że próbujesz wgrać obraz większy niż twoja pamięć flash, "
++"proszę sprawdź czy to właściwy obraz!"
++
++msgid "Java Script required!"
++msgstr "Java Script jest wymagany!"
++
++msgid "Join Network"
++msgstr "Połącz z siecią"
++
++msgid "Join Network: Settings"
++msgstr "Przyłącz do sieci: Ustawienia"
++
++msgid "Join Network: Wireless Scan"
++msgstr "Przyłącz do sieci: Skanuj sieci WiFi"
++
++msgid "Keep settings"
++msgstr "Zachowaj ustawienia"
++
++msgid "Kernel Log"
++msgstr "Log jÄ…dra"
++
++msgid "Kernel Version"
++msgstr "Wersja jÄ…dra"
++
++msgid "Key"
++msgstr "Klucz"
++
++msgid "Key #%d"
++msgstr "Klucz #%d"
++
++msgid "Kill"
++msgstr "Zabij"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "Serwer L2TP"
++
++msgid "LCP echo failure threshold"
++msgstr "Próg błędu echa LCP"
++
++msgid "LCP echo interval"
++msgstr "Częstotliwość echa LCP"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Oznaczenie"
++
++msgid "Language"
++msgstr "Język"
++
++msgid "Language and Style"
++msgstr "Wygląd i język"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Czas ważności dzierżawy"
++
++msgid "Leasefile"
++msgstr "Plik dzierżaw"
++
++msgid "Leasetime"
++msgstr "Czas dzierżawy"
++
++msgid "Leasetime remaining"
++msgstr "Pozostały czas dzierżawy"
++
++msgid "Leave empty to autodetect"
++msgstr "Pozostaw niewypełnione dla autodetekcji"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "Pozostaw niewypełnione aby użyć bieżącego adresu WAN"
++
++msgid "Legend:"
++msgstr "Legenda:"
++
++msgid "Limit"
++msgstr "Limit"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Połączenie aktywne"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"Lista serwerów <abbr title=\"Domain Name System\">DNS</abbr> do których będą "
++"przekazywane zapytania"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "Lista domen zezwalajÄ…cych na odpowiedzi RFC1918"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr "Lista hostów które dostarczają zafałszowane wyniki NX domain"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++"Słuchaj tylko na podanym interfejsie, lub jeśli nie podano na wszystkich"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Port nasłuchu dla przychodzących zapytań DNS"
++
++msgid "Load"
++msgstr "Obciążenie"
++
++msgid "Load Average"
++msgstr "Średnie obciążenie"
++
++msgid "Loading"
++msgstr "Åadowanie"
++
++msgid "Local IPv4 address"
++msgstr "Lokalny adres IPv4"
++
++msgid "Local IPv6 address"
++msgstr "Lokalny adres IPv6"
++
++msgid "Local Startup"
++msgstr "Lokalny autostart"
++
++msgid "Local Time"
++msgstr "Czas lokalny"
++
++msgid "Local domain"
++msgstr "Domena lokalna"
++
++#, fuzzy
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++"Specyfikacja domeny lokalnej. Nazwy należące do tej domeny nie są "
++"przekazywane dalej ani rozwijane przez DHCP lub tylko pliki hosts"
++
++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"
++
++msgid "Local server"
++msgstr "Serwer lokalny"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++"Zlokalizuj nazwę hosta w zależności od odpytującej podsieci jeśli jest "
++"dostępne więcej niż jedno IP"
++
++msgid "Localise queries"
++msgstr "Zapytania lokalizujÄ…ce"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Poziom logowania"
++
++msgid "Log queries"
++msgstr "Loguj zapytania"
++
++msgid "Logging"
++msgstr "Logowanie"
++
++msgid "Login"
++msgstr "Zaloguj"
++
++msgid "Logout"
++msgstr "Wyloguj"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr "Najniższy wydzierżawiony adres jako offset dla adresu sieci."
++
++msgid "MAC-Address"
++msgstr "Adres MAC"
++
++msgid "MAC-Address Filter"
++msgstr "Filtr adresów MAC"
++
++msgid "MAC-Filter"
++msgstr "Filtr adresów MAC"
++
++msgid "MAC-List"
++msgstr "Lista MAC"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Maksymalna Szybkość"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "Maksymalna dozwolona liczba aktywnych dzierżaw DHCP"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "Maksymalna dozwolona liczba jednoczesnych zapytań DNS"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "Maksymalny dozwolony rozmiar pakietu EDNS.0 UDP"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "Maksymalny czas podany w sekundach do pełnej gotowości modemu"
++
++msgid "Maximum hold time"
++msgstr "Maksymalny czas podtrzymania"
++
++msgid "Maximum number of leased addresses."
++msgstr "Maksymalna liczba dzierżawionych adresów."
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "Pamięć"
++
++msgid "Memory usage (%)"
++msgstr "Użycie pamięci (%)"
++
++msgid "Metric"
++msgstr "Metryka"
++
++msgid "Minimum Rate"
++msgstr "Minimalna Szybkość"
++
++msgid "Minimum hold time"
++msgstr "Minimalny czas podtrzymania"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "Brakujące rozszerzenie protokołu dla protokołu %q"
++
++msgid "Mode"
++msgstr "Tryb"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Modem"
++
++msgid "Modem init timeout"
++msgstr "Limit czasu inicjacji modemu"
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr "Wpis montowania"
++
++msgid "Mount Point"
++msgstr "Punkt montowania"
++
++msgid "Mount Points"
++msgstr "Punkty montowania"
++
++msgid "Mount Points - Mount Entry"
++msgstr "Punkty montowania - Wpis montownia"
++
++msgid "Mount Points - Swap Entry"
++msgstr "Punkty montowania - Wpis Swap"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Punkty montowania definiują gdzie urządzenie pamięci zostanie podłączone do "
++"systemu plików"
++
++msgid "Mount options"
++msgstr "Opcje montowania"
++
++msgid "Mount point"
++msgstr "Punkt montownia"
++
++msgid "Mounted file systems"
++msgstr "Zamontowane systemy plików"
++
++msgid "Move down"
++msgstr "Przesuń w dół"
++
++msgid "Move up"
++msgstr "Przesuń w górę"
++
++msgid "Multicast Rate"
++msgstr "Szybkość Multicast`u"
++
++msgid "Multicast address"
++msgstr "Adres Multicast`u"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "Lista serwerów NTP"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Nazwa"
++
++msgid "Name of the new interface"
++msgstr "Nazwa nowego interfejsu"
++
++msgid "Name of the new network"
++msgstr "Nazwa nowej sieci"
++
++msgid "Navigation"
++msgstr "Nawigacja"
++
++msgid "Netmask"
++msgstr "Maska sieci"
++
++msgid "Network"
++msgstr "Sieć"
++
++msgid "Network Utilities"
++msgstr "Narzędzia sieciowe"
++
++msgid "Network boot image"
++msgstr "Sieciowy obraz startowy"
++
++msgid "Network without interfaces."
++msgstr "Sieć bez interfejsów"
++
++msgid "Next »"
++msgstr "Następna »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Brak skonfigurowanego serwera DHCP dla tego interfejsu"
++
++msgid "No chains in this table"
++msgstr "Brak łańcuchów w tej tablicy"
++
++msgid "No files found"
++msgstr "Nie znaleziono plików"
++
++msgid "No information available"
++msgstr "Brak dostępnych informacji"
++
++msgid "No negative cache"
++msgstr "Brak odwrotnego cache`a"
++
++msgid "No network configured on this device"
++msgstr "Brak skonfigurowanych sieci na tym urzÄ…dzeniu"
++
++msgid "No network name specified"
++msgstr "Nie podano nazwy sieci"
++
++msgid "No package lists available"
++msgstr "Brak dostępu do listy pakietów"
++
++msgid "No password set!"
++msgstr "Nie ustawiono hasła!"
++
++msgid "No rules in this chain"
++msgstr "Brak zasad w tym łańcuchu"
++
++msgid "No zone assigned"
++msgstr "Brak przypisanej strefy"
++
++msgid "Noise"
++msgstr "Szum"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Szum:"
++
++msgid "None"
++msgstr "Brak"
++
++msgid "Normal"
++msgstr "Normalny"
++
++msgid "Not Found"
++msgstr "Nie znaleziono"
++
++msgid "Not associated"
++msgstr "Nie powiÄ…zany"
++
++msgid "Not connected"
++msgstr "Nie podłączony"
++
++msgid "Note: Configuration files will be erased."
++msgstr "UWAGA: Pliki konfiguracyjne zostaną usunięte."
++
++msgid "Notice"
++msgstr "Spostrzeżenie"
++
++msgid "Nslookup"
++msgstr "Nslookup"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "Konfiguracja OPKG"
++
++msgid "Off-State Delay"
++msgstr "Zwłoka wyłączenia"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Na tej stronie można skonfigurować interfejsy urządzenia. Możesz zmostkować "
++"kilka interfejsów zaznaczając pole \"mostkuj interfejsy\", a następnie "
++"wpisując ich nazwy oddzielone spacjami. Można także użyć notacji <abbr title="
++"\"Virtual Local Area Network\">VLAN`ów</abbr> <samp>INTERFACE.VLANNR</samp> "
++"(<abbr title=\"na przykład\">np.</abbr>: <samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr "Zwłoka włączenia"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "Nazwa hosta lub adres MAC musu być podany!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "Jedno lub więcej pól zawiera nieprawidłowe wartości!"
++
++msgid "One or more required fields have no value!"
++msgstr "Jedno lub więcej pól nie posiada wpisanych wartości!"
++
++msgid "Open list..."
++msgstr "Otwórz listę..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Wartość zmieniona"
++
++msgid "Option removed"
++msgstr "Usunięto wartość"
++
++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 "Options"
++msgstr "Opcje"
++
++msgid "Other:"
++msgstr "Inne:"
++
++msgid "Out"
++msgstr "WychodzÄ…ce"
++
++msgid "Outbound:"
++msgstr "WychodzÄ…cy:"
++
++msgid "Outdoor Channels"
++msgstr "Kanały zewnętrzne"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "Nadpisz adres MAC"
++
++msgid "Override MTU"
++msgstr "Nadpisz MTU"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "Nadpisz adres bramy w odpowiedziach DHCP"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++"Nadpisz maskę sieci wysyłaną do klientów. Zazwyczaj jest ona wyliczana z "
++"podsieci która jest rozsyłana."
++
++msgid "Override the table used for internal routes"
++msgstr "Nadpisz tablicę routingu używaną dla wewnętrznych tras routowania"
++
++msgid "Overview"
++msgstr "PrzeglÄ…d"
++
++msgid "Owner"
++msgstr "Właściciel"
++
++msgid "PAP/CHAP password"
++msgstr "Hasło PAP/CHAP"
++
++msgid "PAP/CHAP username"
++msgstr "Nazwa użytkownika PAP/CHAP"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "Enkapsulacja PPPoA"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "Wymagany pakiet libiwinfo!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "Lista pakietów jest starsza niż 24 godziny"
++
++msgid "Package name"
++msgstr "Nazwa pakietu"
++
++msgid "Packets"
++msgstr "Pakiety"
++
++msgid "Part of zone %q"
++msgstr "Część strefy %q"
++
++msgid "Password"
++msgstr "Hasło"
++
++msgid "Password authentication"
++msgstr "Identyfikacja hasłem"
++
++msgid "Password of Private Key"
++msgstr "Hasło lub klucz prywatny"
++
++msgid "Password successfully changed!"
++msgstr "Pomyślnie zmieniono hasło!"
++
++msgid "Path to CA-Certificate"
++msgstr "Ścieżka do certyfikatu CA"
++
++msgid "Path to Client-Certificate"
++msgstr "Ścieżka do certyfikatu Klienta"
++
++msgid "Path to Private Key"
++msgstr "Ścieżka do Klucza Prywatnego"
++
++msgid "Path to executable which handles the button event"
++msgstr ""
++"Ścieżka do pliku wykonywalnego, który obsługuje zdarzenie dla danego "
++"przycisku"
++
++msgid "Peak:"
++msgstr "Szczyt:"
++
++msgid "Perform reboot"
++msgstr "Wykonaj restart"
++
++msgid "Perform reset"
++msgstr "Wykonaj reset"
++
++msgid "Phy Rate:"
++msgstr "Szybkość Phy:"
++
++msgid "Physical Settings"
++msgstr "Ustawienia sprzętowe"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Pkts."
++msgstr "Pktw."
++
++msgid "Please enter your username and password."
++msgstr "Proszę wprowadź swój login i hasło."
++
++msgid "Policy"
++msgstr "Zasada"
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Port %d"
++msgstr "Port %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr "Port %d jest nietagowany w wielu VLAN`ach!"
++
++msgid "Port status:"
++msgstr "Status portu:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++"Zakładaj że klient jest martwy po danej ilości błedów odpowiedzi echa LCP, "
++"wpisz 0 aby zignorować błędy"
++
++msgid "Prevents client-to-client communication"
++msgstr "Zapobiegaj komunikacji klientów pomiędzy sobą"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Kontroler bezprzewodowy Prism2/2.5/3 802.11b"
++
++msgid "Proceed"
++msgstr "Wykonaj"
++
++msgid "Processes"
++msgstr "Procesy"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protokół"
++
++msgid "Protocol family"
++msgstr "Rodzina protokołów"
++
++msgid "Protocol of the new interface"
++msgstr "Protokół nowego interfejsu"
++
++msgid "Protocol support is not installed"
++msgstr "Wsparcie dla protokołu nie jest zainstalowane"
++
++# Opcja dotyczy włączenia serwera czasu, więc "podaj" nie jest właściwym tłumaczeniem w tym miejscu - obsy
++msgid "Provide NTP server"
++msgstr "WÅ‚Ä…cz serwer NTP"
++
++msgid "Provide new network"
++msgstr "Utwórz nową sieć"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "Jakość"
++
++msgid "RTS/CTS Threshold"
++msgstr "Próg RTS/CTS"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr "Szybkość RX"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "Kontroler bezprzewodowy RaLink 802.11%s"
++
++msgid "Radius-Accounting-Port"
++msgstr "Port Radius-Accounting"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Sekret Radius-Accounting"
++
++msgid "Radius-Accounting-Server"
++msgstr "Serwer Radius-Accounting"
++
++msgid "Radius-Authentication-Port"
++msgstr "Port Radius-Authentication"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Sekret Radius-Authentication"
++
++msgid "Radius-Authentication-Server"
++msgstr "Serwer Radius-Authentication"
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"Przejrzyj plik <code>/etc/ethers</code> aby skonfigurować serwer <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."
++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 "
++"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"
++"Możesz stracić dostęp do tego urządzenia, jeśli jesteś połączony przez tę "
++"sieć!"
++
++msgid "Really reset all changes?"
++msgstr "Naprawdę usunąć wszelkie zmiany?"
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou might lose access to this device if you are "
++"connected via this interface."
++msgstr ""
++"Naprawdę wyłączyć tę sieć?\n"
++"Możesz stracić dostęp do tego urządzenia jeśli jesteś połączony przez ten "
++"interfejs!"
++
++msgid ""
++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
++"you are connected via this interface."
++msgstr ""
++"Naprawdę wyłączyć interfejs \"%s\"?\n"
++"Możesz stracić dostęp do tego urządzenia jeśli jesteś połączony przez ten "
++"interfejs!"
++
++msgid "Really switch protocol?"
++msgstr "Naprawdę zmienić protokół?"
++
++msgid "Realtime Connections"
++msgstr "Połączenia w czasie rzeczywistym"
++
++msgid "Realtime Graphs"
++msgstr "Wykresy w czasie rzeczywistym"
++
++msgid "Realtime Load"
++msgstr "Obciążenie w czasie rzeczywistym"
++
++msgid "Realtime Traffic"
++msgstr "Ruch w czasie rzeczywistym"
++
++msgid "Realtime Wireless"
++msgstr "WiFi w czasie rzeczywistym"
++
++msgid "Rebind protection"
++msgstr "Przypisz ochronÄ™"
++
++msgid "Reboot"
++msgstr "Restart"
++
++msgid "Rebooting..."
++msgstr "Ponowne uruchamianie..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Uruchamia ponownie system na twoim urzÄ…dzeniu"
++
++msgid "Receive"
++msgstr "Odebrane"
++
++msgid "Receiver Antenna"
++msgstr "Antena odbiorcza"
++
++msgid "Reconnect this interface"
++msgstr "Połącz ponownie ten interfejs"
++
++msgid "Reconnecting interface"
++msgstr "ÅÄ…czÄ™ ponownie interfejs"
++
++msgid "References"
++msgstr "Referencje"
++
++msgid "Regulatory Domain"
++msgstr "Domena regulacji"
++
++msgid "Relay"
++msgstr "Przekaźnik"
++
++msgid "Relay Bridge"
++msgstr "Most przekaźnikowy"
++
++msgid "Relay between networks"
++msgstr "Przekaźnik pomiędzy sieciami"
++
++msgid "Relay bridge"
++msgstr "Most przekaźnikowy"
++
++msgid "Remote IPv4 address"
++msgstr "Zdalny adres IPv4"
++
++msgid "Remove"
++msgstr "Usuń"
++
++msgid "Repeat scan"
++msgstr "Powtórz skanowanie"
++
++msgid "Replace entry"
++msgstr "Zamień wpis"
++
++msgid "Replace wireless configuration"
++msgstr "Zamień konfigurację WiFi"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "Wymagany dla niektórych dostawców internetu, np. Charter z DOCSIS 3"
++
++msgid "Reset"
++msgstr "Resetuj"
++
++msgid "Reset Counters"
++msgstr "Wyczyść liczniki"
++
++msgid "Reset to defaults"
++msgstr "Resetuj do domyślnych"
++
++msgid "Resolv and Hosts Files"
++msgstr "Pliki Resolv i Hosts"
++
++msgid "Resolve file"
++msgstr "Plik Resolve"
++
++msgid "Restart"
++msgstr "Uruchom ponownie"
++
++msgid "Restart Firewall"
++msgstr "Uruchom ponownie firewalla"
++
++msgid "Restore backup"
++msgstr "Przywróć kopię zapasową"
++
++msgid "Reveal/hide password"
++msgstr "Odsłoń/Ukryj hasło"
++
++msgid "Revert"
++msgstr "Przywróć"
++
++msgid "Root"
++msgstr "Root"
++
++msgid "Root directory for files served via TFTP"
++msgstr "Katalog Root`a dla plików udostępnianych przez TFTP"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Hasło routera"
++
++msgid "Routes"
++msgstr "Ścieżki routingu"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Ścieżki routingu pokazują routerowi przez który interfejs oraz którą bramę "
++"może skomunikować się z daną siecią lub komputerem."
++
++msgid "Rule #"
++msgstr "Zasada #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++"Sprawdź czy system plików nie zawiera błędów przed zamontowaniem urządzenia"
++
++msgid "Run filesystem check"
++msgstr "Sprawdź czy system plików nie zawiera błędów"
++
++msgid ""
++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
++"use 6in4 instead"
++msgstr ""
++
++msgid "SIXXS-handle[/Tunnel-ID]"
++msgstr ""
++
++msgid "SSH Access"
++msgstr "Dostęp SSH"
++
++msgid "SSH-Keys"
++msgstr "Klucze SSH"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Zapisz"
++
++msgid "Save & Apply"
++msgstr "Zapisz i zastosuj"
++
++msgid "Save &#38; Apply"
++msgstr "Zapisz i zastosuj"
++
++msgid "Scan"
++msgstr "Skanuj"
++
++# Raczej nie stosuje się kilku dużych liter w tym samym
++msgid "Scheduled Tasks"
++msgstr "Zaplanowane zadania"
++
++msgid "Section added"
++msgstr "Dodano sekcjÄ™"
++
++msgid "Section removed"
++msgstr "Usunięto sekcję"
++
++msgid "See \"mount\" manpage for details"
++msgstr "Aby poznać szczegóły przeczytaj stronę instrukcji \"mount\""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++"Co podany czas (w sekundach) wyślij zapytania LCP echo, to ustawienie działa "
++"tylko gdy ustawiony jest próg błędu LCP echo"
++
++msgid "Separate Clients"
++msgstr "Rozdziel klientów"
++
++msgid "Separate WDS"
++msgstr "Rozdziel WDS"
++
++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"
++
++msgid "Service Type"
++msgstr "Typ serwisu"
++
++msgid "Services"
++msgstr "Serwisy"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "Ustawienia synchronizacji czasu"
++
++msgid "Setup DHCP Server"
++msgstr "Ustawienia serwera DHCP"
++
++msgid "Show current backup file list"
++msgstr "Pokaż aktualną listę plików do backupu"
++
++msgid "Shutdown this interface"
++msgstr "Wyłącz ten interfejs"
++
++msgid "Shutdown this network"
++msgstr "Wyłącz tą sieć"
++
++msgid "Signal"
++msgstr "Sygnał"
++
++msgid "Signal:"
++msgstr "Sygnał:"
++
++msgid "Size"
++msgstr "Rozmiar"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "Pomiń"
++
++msgid "Skip to content"
++msgstr "Pomiń do zawartości"
++
++msgid "Skip to navigation"
++msgstr "Pomiń do nawigacji"
++
++msgid "Slot time"
++msgstr "Szczelina czasowa"
++
++msgid "Software"
++msgstr "Oprogramowanie"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Wartości pewnych pól są niewłaściwe, nie mogę ich zachować!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Przepraszamy, ale żądany obiekt nie został znaleziony."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "Przepraszamy, ale serwer napotkał nieoczekiwany błąd."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"Przepraszamy, ale nie ma wsparcia dla trybu sysupgrade. Nowy firmware musi "
++"być wgrany ręcznie. Sprawdź stronę OpenWrt wiki, aby uzyskać instrukcję dla "
++"danego urzÄ…dzenia."
++
++msgid "Sort"
++msgstr "Posortuj"
++
++msgid "Source"
++msgstr "Źródło"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "Określa zachowanie w zależności od stanu przycisku"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "Podaje katalog do którego jest podłączone urządzenie"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "Określa port nasłuchu dla tej instancji <em>Dropbear</em>"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++"Określa maksymalną ilość błędów dla zapytania ARP przed założeniem, że host "
++"jest martwy"
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++"Określa maksymalny czas w sekundach przed założeniem, że host jest martwy"
++
++msgid "Specify the secret encryption key here."
++msgstr "Określ tajny klucz szyfrowania."
++
++msgid "Start"
++msgstr "Uruchomienie"
++
++msgid "Start priority"
++msgstr "Priorytet uruchomienia"
++
++msgid "Startup"
++msgstr "Autostart"
++
++msgid "Static IPv4 Routes"
++msgstr "Statyczne ścieżki routingu IPv4"
++
++msgid "Static IPv6 Routes"
++msgstr "Statyczne ścieżki routingu IPv6"
++
++msgid "Static Leases"
++msgstr "Dzierżawy statyczne"
++
++msgid "Static Routes"
++msgstr "Statyczne ścieżki routingu"
++
++msgid "Static WDS"
++msgstr "Statyczny WDS"
++
++msgid "Static address"
++msgstr "Stały adres"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"Statyczne dzierżawy są używane do przypisania stałych adresów IP i "
++"symbolicznych nazw klientom DHCP. Są one również wymagane dla "
++"niedynamicznych konfiguracji interfejsu, gdzie obsługiwane są tylko hosty z "
++"odpowiednim dzierżawami."
++
++msgid "Status"
++msgstr "Stan"
++
++msgid "Stop"
++msgstr "Stop"
++
++msgid "Strict order"
++msgstr "Zachowaj kolejność"
++
++msgid "Submit"
++msgstr "Wyślij"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Zamień wpis"
++
++msgid "Switch"
++msgstr "Przełącznik"
++
++msgid "Switch %q"
++msgstr "Przełącznik %q"
++
++msgid "Switch %q (%s)"
++msgstr "Przełącznik %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Protokół przełącznika"
++
++msgid "Sync with browser"
++msgstr "Synchronizuj z przeglÄ…darkÄ…"
++
++msgid "Synchronizing..."
++msgstr "Synchronizacja..."
++
++msgid "System"
++msgstr "System"
++
++msgid "System Log"
++msgstr "Log systemowy"
++
++msgid "System Properties"
++msgstr "Właściwości systemu"
++
++# Wszędzie używane jest "loga" z małej litery.
++msgid "System log buffer size"
++msgstr "Rozmiar bufora loga systemu"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "Ustawienia TFTP"
++
++msgid "TFTP server root"
++msgstr "Root serwera TFTP"
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr "Szybkość TX"
++
++msgid "Table"
++msgstr "Tablica"
++
++msgid "Target"
++msgstr "Cel"
++
++msgid "Terminate"
++msgstr "Zakończ"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"Sekcja <em>Konfiguracja Urządzenia</em> zawiera sprzętowe ustawienia toru "
++"transmisji radiowej takie jak kanał, moc sygnału, czy wybór anteny, które to "
++"są wspólne dla wszystkich zdefiniowanych sieci bezprzewodowych (jeśli tor "
++"transmisji jest kompatybilny z transmisjÄ… multi-SSID). Ustawienia sieci "
++"takie jak szyfrowanie lub tryb operacji sÄ… zebrane w sekcji <em>Konfiguracja "
++"Interfejsu</em>."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"Pakiet <em>libiwinfo-lua</em> nie jest zainstalowany. Musisz go zainstalować "
++"aby WiFi prawidłowo zadziałało!"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++"Prefiks IPv6 przypisany do dostawcy, zazwyczaj kończy się <code>::</code>"
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++"Dozwolone znaki to: <code>A-Z</code>, <code>a-z</code>, <code>0-9</code> "
++"oraz <code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"Plik urządzenia - pamięci lub partycji (<abbr title=\"na przykład\">np.</"
++"abbr> <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 ""
++"System plików, który został użyty do sformatowania nośnika (<abbr title=\"na "
++"przykład\">np.</abbr> <samp><abbr title=\"Third Extended Filesystem\">ext3</"
++"abbr></samp>)"
++
++# Przycisk nazywa się "Wykonaj", więc taki sam opis ma być w podpowiedzi.
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++"Obraz flash`a został przesłany. Poniżej znajduje się suma kontrolna i "
++"rozmiar obrazu, porównaj je z sumą kontrolną i rozmiarem oryginału, aby "
++"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"
++
++msgid "The following rules are currently active on this system."
++msgstr "Następujące zasady są obecnie aktywne w tym systemie."
++
++msgid "The given network name is not unique"
++msgstr "Podana sieć NIE jest unikalna"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"Sprzęt nie jest urządzeniem typu multi-SSID, więc bieżąca konfiguracja "
++"zostanie nadpisana nową jeśli będziesz kontynuować."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++"Długość prefiksu IPv4 w bitach, pozostała część jest używana w adresach IPv6."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "Długość prefiksu IPv6 w bitach"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++"Porty sieciowe na tym urządzeniu mogą być łączone w kilka sieci <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>, w których komputery mogą "
++"komunikować się ze sobą bezpośrednio. Sieci <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr> są często stosowane w celu oddzielenia różnych "
++"segmentów sieci. Często domyślnie jeden port typu Uplink jest wykorzystywany "
++"do połączenia z większą siecią, taką jak Internet, a inne porty dla sieci "
++"lokalnej."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "Wybrany protokół potrzebuje przypisanego urządzenia"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++"System usuwa teraz partycję konfiguracji i zrestartuje się po zakończeniu."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"System wykonuje flashowanie.<br /> NIE WYÅÄ„CZAĆ URZÄ„DZENIA!<br /> Poczekaj "
++"kilka minut, zanim spróbujesz połączyć się ponownie. W zależności od "
++"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."
++msgstr ""
++"Przesłany plik obrazu nie zawiera obsługiwanego formatu. Upewnij się, że "
++"wybrałeś odpowiedni format obrazu dla danej platformy."
++
++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 pending changes to revert!"
++msgstr "Brak oczekujących zmian do przywrócenia!"
++
++msgid "There are no pending changes!"
++msgstr "Brak oczekujÄ…cych zmian!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"Żadne urządzenie nie jest jeszcze przypisane. Proszę dołączyć urządzenie "
++"sieciowe na karcie \"Ustawienia sprzętowe\""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"Hasło nie zostało ustawione. Proszę skonfigurować hasło roota, aby "
++"zabezpieczyć interfejs WWW i włączyć SSH."
++
++msgid "This IPv4 address of the relay"
++msgstr "Ten adres IPv4 przekaźnika"
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"Jest to lista globalnych wzorców dopasowywania plików i katalogów "
++"uwzględnianych podczas przeprowadzania aktualizacji z użyciem \"sysupgrade"
++"\". Zmodyfikowane pliki w /etc/config/ i w niektórych innych ustawieniach są "
++"automatycznie zachowywane."
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"To jest zawartość pliku /etc/rc.local. Wstaw tutaj własne komendy (przed "
++"'exit 0'), aby zostały wykonane pod koniec procesu rozruchu."
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++"To jest lokalny adres końcowy przypisany przez tunnel broker'a, zwykle "
++"kończący się z <code>:2</code>"
++
++# w tłumaczeniu pojawiła się spacja po DHCP</abbr> co powoduje niepoprawne wyświetlanie się strony z lang PL
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"To jest jedyny serwer <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr> w sieci lokalnej"
++
++msgid "This is the plain username for logging into the account"
++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 ""
++"To jest system crontab, w którym mogą być zdefiniowane zaplanowane zadania."
++
++msgid ""
++"This is usually the address of the nearest PoP operated by the tunnel broker"
++msgstr ""
++"Zwykle jest to adres najbliższego PoP prowadzonego przez tunnel broker'a"
++
++msgid ""
++"This list gives an overview over currently running system processes and "
++"their status."
++msgstr ""
++"Poniższa lista przedstawia aktualnie uruchomione procesy systemowe i ich "
++"status."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr ""
++"Poniższa strona umożliwia konfigurację działania niestandardowych przycisków"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "Poniższa strona przedstawia aktualnie aktywne połączenia sieciowe."
++
++msgid "This section contains no values yet"
++msgstr "Ta sekcja nie zawiera jeszcze żadnych wartości"
++
++msgid "Time Synchronization"
++msgstr "Synchronizacja czasu"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "Synchronizacja czasu nie jest jeszcze skonfigurowana."
++
++msgid "Timezone"
++msgstr "Strefa czasowa"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"Aby przywrócić pliki konfiguracyjne, można tutaj wczytać wcześniej utworzone "
++"archiwum kopii zapasowej."
++
++msgid "Total Available"
++msgstr "Całkowicie dostępna"
++
++msgid "Traceroute"
++msgstr "Trasa routowania"
++
++msgid "Traffic"
++msgstr "Ruch"
++
++msgid "Transfer"
++msgstr "Transfer"
++
++msgid "Transmission Rate"
++msgstr "Prędkość transmisji"
++
++msgid "Transmit"
++msgstr "Nadawanie"
++
++msgid "Transmit Power"
++msgstr "Siła nadawania"
++
++msgid "Transmitter Antenna"
++msgstr "Antena nadajnika"
++
++msgid "Trigger"
++msgstr "Trigger"
++
++msgid "Trigger Mode"
++msgstr "Tryb Trigger"
++
++msgid "Tunnel ID"
++msgstr "Numer identyfikacyjny tunelu"
++
++msgid "Tunnel Interface"
++msgstr "Interfejs tunelu"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Tryb Turbo"
++
++msgid "Tx-Power"
++msgstr "Moc nadawania"
++
++msgid "Type"
++msgstr "Typ"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "Tylko UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "UrzÄ…dzenie USB"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr "Nie można wysłać"
++
++msgid "Unknown"
++msgstr "Nieznany"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Nieznany błąd, hasło nie zostało zmienione"
++
++msgid "Unmanaged"
++msgstr "NiezarzÄ…dzalny"
++
++msgid "Unsaved Changes"
++msgstr "Niezapisane zmiany"
++
++msgid "Unsupported protocol type."
++msgstr "Nieobsługiwany typ protokołu."
++
++msgid "Update lists"
++msgstr "Aktualizuj listy"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"Prześlij zgodny z funkcją sysupgrade obraz tutaj, aby zastąpić aktualnie "
++"działające firmware. Zaznacz opcję \"Zachowaj ustawienia\", aby zachować "
++"bieżącą konfigurację (wymaga zgodnego obrazu firmware OpenWrt)."
++
++msgid "Upload archive..."
++msgstr "Załaduj archiwum..."
++
++msgid "Uploaded File"
++msgstr "Załaduj plik"
++
++msgid "Uptime"
++msgstr "Czas pracy"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Użyj <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr "Użyj bramy DHCP"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "Użyj serwerów DNS rozgłaszanych przez peera"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "Użyj kodów kraju ISO/IEC 3166 alpha2"
++
++msgid "Use MTU on tunnel interface"
++msgstr "Użyj MTU na interfejsie tunelu"
++
++msgid "Use TTL on tunnel interface"
++msgstr "Użyj TTL na interfejsie tunelu"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "Użyj flagi rozgłaszania"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "Użyj własnych serwerów DNS"
++
++msgid "Use default gateway"
++msgstr "Użyj domyślnej bramy"
++
++msgid "Use gateway metric"
++msgstr "Użyj metryki bramy"
++
++msgid "Use routing table"
++msgstr "Użyj tabeli routingu"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"Użyj przycisku <em>Dodaj</em>, aby dodać nowy wpis dzierżawy. <em>Adres MAC</"
++"em> identyfikuje hosta, <em>Adres IPv4</em> określa, którego stałego adresu "
++"użyć, natomiast <em>Nazwa hosta</em> jest przypisana jako symboliczna nazwa "
++"do określonego hosta."
++
++# Przy liście zamontowanych systemów plików
++msgid "Used"
++msgstr "Użyte"
++
++msgid "Used Key Slot"
++msgstr "Użyte gniazdo klucza"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Nazwa użytkownika"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "Interfejs VLAN"
++
++msgid "VLANs on %q"
++msgstr "Sieci VLAN na %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "Sieci VLAN na %q (%s)"
++
++msgid "VPN Server"
++msgstr "Serwer VPN"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++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"
++
++msgid "Version"
++msgstr "Wersja"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "Otwarty system WEP"
++
++msgid "WEP Shared Key"
++msgstr "Współdzielony klucz WEP"
++
++msgid "WEP passphrase"
++msgstr "Hasło WEP"
++
++msgid "WMM Mode"
++msgstr "Tryb WMM"
++
++msgid "WPA passphrase"
++msgstr "Hasło WPA"
++
++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 (na tryb "
++"klienta) lub hostapd (dla trybów AP lub ad-hoc)"
++
++msgid ""
++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)"
++msgstr ""
++
++# obsy: Brzmi to lepiej niż "czekanie na wprowadzanie zmian.
++msgid "Waiting for changes to be applied..."
++msgstr "Trwa wprowadzenie zmian..."
++
++msgid "Waiting for command to complete..."
++msgstr "Trwa wykonanie polecenia..."
++
++msgid "Waiting for device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Ostrzeżenie"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr "Sieć bezprzewodowa"
++
++msgid "Wireless Adapter"
++msgstr "Adapter bezprzewodowy"
++
++msgid "Wireless Network"
++msgstr "Sieć bezprzewodowa"
++
++msgid "Wireless Overview"
++msgstr "PrzeglÄ…d sieci bezprzewodowych"
++
++msgid "Wireless Security"
++msgstr "Zabezpieczenia sieci bezprzewodowych"
++
++msgid "Wireless is disabled or not associated"
++msgstr "Sieć bezprzewodowa jest wyłączona lub niepołączona"
++
++msgid "Wireless is restarting..."
++msgstr "Restart sieci bezprzewodowej..."
++
++msgid "Wireless network is disabled"
++msgstr "Sieć bezprzewodowa jest wyłączona"
++
++msgid "Wireless network is enabled"
++msgstr "Sieć bezprzewodowa jest włączona"
++
++msgid "Wireless restarted"
++msgstr "Zrestartowano sieć bezprzewodową"
++
++msgid "Wireless shut down"
++msgstr "Wyłączanie sieci bezprzewodowej"
++
++msgid "Write received DNS requests to syslog"
++msgstr "Zapisz otrzymane żądania DNS do syslog'a"
++
++msgid "XR Support"
++msgstr "Wsparcie XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Tutaj można włączyć lub wyłączyć zainstalowane skrypty. Zmiany zostaną "
++"zastosowane po ponownym uruchomieniu urządzenia.<br /><strong>Ostrzeżenie: "
++"Jeśli wyłączysz podstawowe skrypty typu \"networks\", urządzenie może stać "
++"siÄ™ nieosiÄ…galne!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Musisz włączyć obsługę Java Script w swojej przeglądarce, inaczej LuCI nie "
++"będzie działać poprawnie."
++
++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 ""
++
++msgid "any"
++msgstr "dowolny"
++
++msgid "auto"
++msgstr "auto"
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "bridged"
++
++msgid "create:"
++msgstr "utwórz:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "utwórz bridge na określonych interfejsach"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "wyłącz"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "wygasły"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"plik, w którym podano żądania <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr>, zostanie zachowany"
++
++msgid "forward"
++msgstr "przekaż"
++
++msgid "full-duplex"
++msgstr "pełny-duplex"
++
++msgid "half-duplex"
++msgstr "pół-duplex"
++
++msgid "help"
++msgstr "pomoc"
++
++msgid "hidden"
++msgstr "ukryty"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "jeżeli celem jest sieć"
++
++msgid "input"
++msgstr "wejście"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++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 ""
++
++msgid "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "nie"
++
++# skorzystałem z niemieckiego tłumaczenia
++msgid "no link"
++msgstr "niepowiÄ…zane"
++
++msgid "none"
++msgstr "żaden"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "wyłączone"
++
++msgid "on"
++msgstr "włączone"
++
++msgid "open"
++msgstr "otwarte"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "routowane"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "tagowane"
++
++msgid "unknown"
++msgstr "nieznane"
++
++msgid "unlimited"
++msgstr "nielimitowane"
++
++msgid "unspecified"
++msgstr "nieokreślone"
++
++msgid "unspecified -or- create:"
++msgstr "nieokreślone -lub- utwórz:"
++
++msgid "untagged"
++msgstr "nietagowane"
++
++msgid "yes"
++msgstr "tak"
++
++msgid "« Back"
++msgstr "« Wróć"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "WÅ‚Ä…cz negocjacjÄ™ IPv6 na Å‚Ä…czu PPP"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "Ignoruj pliki Hosts"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Proszę czekać: Ponowne uruchamianie..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Ostrzeżenie: Pozostały niezapisane zmian, które zostaną utracone podczas "
++#~ "restartu!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Zawsze używaj kanał 40MHz nawet jeśli drugi kanał pokrywa się. Użycie tej "
++#~ "opcji nie jest zgodne ze standardem IEEE 802.11n-2009!"
++
++#~ msgid "Cached"
++#~ msgstr "Cache"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr "Konfiguruje ten zasób jako zasób overlay dla block-extroot"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "WymuÅ› tryb 40MHz"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Skakanie po częstotliwościach"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "Zablokowano dla kanału %d używanego przez %s"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "Użyj systemu plików root'a"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "Login (ID) HE.net"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr ""
++#~ "To jest 32-bajtowy heksadecymalny zakodowany identyfikator użytkownika, a "
++#~ "nie login"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz drugi kanał powyżej"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz drugi kanał poniżej"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Akceptuj rozgłoszenia routera"
++
++# Dosłowne tłumaczenie
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Rozgłoś protokół IPv6 w sieci"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "Rozgłoś identyfikator sieci (network ID)"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "Dopuszczalny zakres to 1 do 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "Możliwości HT"
++
++#~ msgid "HT mode"
++#~ msgstr "Tryb HT"
++
++#~ msgid "Router Model"
++#~ msgstr "Model routera"
++
++#~ msgid "Router Name"
++#~ msgstr "Nazwa routera"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "Wyślij pakiet wymuszający rozgłoszenia routera"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr "Określa czas życia rozgłoszenia preferowanego prefiksu w sekundach"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr "Określa czas życia rozgłoszenia obowiązującego prefiksu w sekundach"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "Użyj preferowanego czasu życia"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "Użyj prawidłowego czasu życia"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Czekanie na router..."
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "WÅ‚Ä…cz wbudowany serwer NTP"
++
++#~ msgid "Active Leases"
++#~ msgstr "Aktywne dzierżawy"
++
++#~ msgid "Open"
++#~ msgstr "Otwórz"
++
++#~ msgid "Bit Rate"
++#~ msgstr "Przepływność"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "Konfiguracja / Zastosuj"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "Konfiguracja / zmiany"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "Konfiguracja / cofnięcie zmian"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MAC Address"
++#~ msgstr "Adres MAC"
+diff --git a/feeds/luci/modules/luci-base/po/pt-br/base.po b/feeds/luci/modules/luci-base/po/pt-br/base.po
+new file mode 100644
+index 0000000..2515b34
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/pt-br/base.po
+@@ -0,0 +1,4434 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2014-03-29 23:31+0200\n"
++"Last-Translator: Luiz Angelo <luizluca@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(janela de %d minutos, intervalo de %d segundos)"
++
++msgid "(%s available)"
++msgstr "(%s disponível)"
++
++msgid "(empty)"
++msgstr "(vazio)"
++
++msgid "(no interfaces attached)"
++msgstr "(nenhuma interface conectada)"
++
++msgid "-- Additional Field --"
++msgstr "-- Campo Adicional --"
++
++msgid "-- Please choose --"
++msgstr "-- Por favor, escolha --"
++
++msgid "-- custom --"
++msgstr "-- personalizado --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Carga 1 Minuto:"
++
++msgid "15 Minute Load:"
++msgstr "Carga 15 Minutos:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Carga 5 Minutos:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr ""
++"<abbr title=\"Identificador de Conjunto Básico de Serviços\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr ""
++"Porta de consulta <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr ""
++"Porta do servidor <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"O servidor <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr> irá "
++"consultar na ordem do arquivo resolvfile"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++"<abbr title=\"Identificador de Conjunto de Serviços Estendidos\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "Endereço <abbr title=\"Protocolo de Internet Versão 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "Roteador <abbr title=\"Protocolo de Internet Versão 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr ""
++"Máscara de rede <abbr title=\"Protocolo de Internet Versão 4\">IPv4</abbr>"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"Endereço do <abbr title=\"Protocolo de Internet Versão 6\">IPv6</abbr> "
++"Endereço ou rede (CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "Roteador <abbr title=\"Protocolo de Internet Versão 6\">IPv6</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "Configuração do <abbr title=\"Diodo Emissor de Luz\">LED</abbr>"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "Nome do <abbr title=\"Diodo Emissor de Luz\">LED</abbr>"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "Endereço <abbr title=\"Controle de Acesso ao Meio\">MAC</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"Numero máximo de alocações <abbr title=\"Protocolo de Configuração Dinâmica "
++"de Equipamentos\">DHCP</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"Tamanho máximo do pacote do <abbr title=\"Extension Mechanisms for Domain "
++"Name System\">EDNS0</abbr>"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "Número máximo de consultas concorrentes"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Par: %s / Grupo: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "<abbr title=\"Access Point Name\">APN</abbr>"
++
++msgid "AR Support"
++msgstr "Suporte AR"
++
++msgid "ARP retry threshold"
++msgstr ""
++"Limite de retentativas do <abbr title=\"Address Resolution Protocol\">ARP</"
++"abbr>"
++
++msgid "ATM Bridges"
++msgstr "Ponte ATM"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "Identificador de Canal Virtual ATM (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "Identificador de Caminho Virtual ATM (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"Pontes ATM expõem ethernet encapsuladas em conexões AAL5 como interfaces de "
++"rede virutais no Linux. Estas podem ser usadas em conjunto com o DHCP ou PPP "
++"para discar em um provedor de rede."
++
++msgid "ATM device number"
++msgstr "Número do dispositivo ATM"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Concentrador de Acesso"
++
++msgid "Access Point"
++msgstr "Ponto de Acceso (AP)"
++
++msgid "Action"
++msgstr "Ação"
++
++msgid "Actions"
++msgstr "Ações"
++
++msgid "Activate this network"
++msgstr "Ativar esta rede"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++"Rotas <abbr title=\"Protocolo de Internet Versão 4\">IPv4</abbr> ativas"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++"Rotas <abbr title=\"Protocolo de Internet Versão 6\">IPv6</abbr> ativas"
++
++msgid "Active Connections"
++msgstr "Conexões Ativas"
++
++msgid "Active DHCP Leases"
++msgstr "Alocações DHCP ativas"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Alocações DHCPv6 ativas"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Adicionar"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr "Adiciona um sufixo de domínio local para equipamentos conhecidos"
++
++msgid "Add new interface..."
++msgstr "Adiciona uma nova interface..."
++
++msgid "Additional Hosts files"
++msgstr "Arquivos adicionais de equipamentos conhecidos (hosts)"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Endereço"
++
++msgid "Address to access local relay bridge"
++msgstr "Endereço para acessar a ponte por retransmissão local "
++
++msgid "Administration"
++msgstr "Administração"
++
++msgid "Advanced Settings"
++msgstr "Opções Avançadas"
++
++msgid "Alert"
++msgstr "Alerta"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"Permitir autenticação <abbr title=\"Shell Seguro\">SSH</abbr> por senha"
++
++msgid "Allow all except listed"
++msgstr "Permitir todos, exceto os listados"
++
++msgid "Allow listed only"
++msgstr "Permitir somente os listados"
++
++msgid "Allow localhost"
++msgstr "Permitir computador local"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"Permitir que equipamentos remotos conectem à portas locais encaminhadas por "
++"SSH"
++
++msgid "Allow root logins with password"
++msgstr "Permite autenticação do root com senha"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "Permite que o usuário <em>root</em> se autentique utilizando senha"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr ""
++"Permite respostas que apontem para 127.0.0.0/8 de servidores externos, por "
++"exemplo, para os serviços RBL"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "Uma rede adicional será criada se você deixar isto desmarcado."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antena 1"
++
++msgid "Antenna 2"
++msgstr "Antena 2"
++
++msgid "Antenna Configuration"
++msgstr "configuração de antena"
++
++msgid "Any zone"
++msgstr "Qualquer zona"
++
++msgid "Apply"
++msgstr "Aplicar"
++
++msgid "Applying changes"
++msgstr "Aplicar as alterações"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "atribuir as interfaces"
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Estações associadas"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Controlador Wireless Atheros 802.11%s"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Autenticação"
++
++msgid "Authoritative"
++msgstr "Autoritário"
++
++msgid "Authorization Required"
++msgstr "Autorização Necessária"
++
++msgid "Auto Refresh"
++msgstr "Atualização Automática"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Disponível"
++
++msgid "Available packages"
++msgstr "Pacotes disponíveis"
++
++msgid "Average:"
++msgstr "Média:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Voltar"
++
++msgid "Back to Overview"
++msgstr "Voltar para Visão Geral"
++
++msgid "Back to configuration"
++msgstr "Voltar para configuração"
++
++msgid "Back to overview"
++msgstr "Voltar para visão geral"
++
++msgid "Back to scan results"
++msgstr "Voltar para os resultados da busca"
++
++msgid "Background Scan"
++msgstr "Busca em Segundo Plano"
++
++msgid "Backup / Flash Firmware"
++msgstr "Cópia de Segurança / Gravar Firmware"
++
++msgid "Backup / Restore"
++msgstr "Cópia de Segurança / Restauração"
++
++msgid "Backup file list"
++msgstr "Lista de arquivos para a cópia de segurança"
++
++msgid "Bad address specified!"
++msgstr "Endereço especificado está incorreto!"
++
++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 "
++"defined backup patterns."
++msgstr ""
++"Abaixo estão os arquivos para a cópia de segurança. Ela consiste de arquivos "
++"de configuração alterados marcados pelo opkg, arquivos base essenciais e "
++"padrões para a cópia de segurança definidos pelo usuário."
++
++msgid "Bitrate"
++msgstr "Taxa de bits"
++
++msgid "Bogus NX Domain Override"
++msgstr "Substituir Domínio NX Falsos"
++
++msgid "Bridge"
++msgstr "Ponte"
++
++msgid "Bridge interfaces"
++msgstr "Juntar interfaces em uma ponte"
++
++msgid "Bridge unit number"
++msgstr "Número da ponte"
++
++msgid "Bring up on boot"
++msgstr "Levantar na iniciação"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Controlador Wireless Broadcom 802.11%s"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Broadcom BCM%04x 802.11 Wireless Controlador"
++
++msgid "Buffered"
++msgstr "Buffered"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Botões"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "Uso da CPU (%)"
++
++msgid "Cancel"
++msgstr "Cancelar"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Cadeia"
++
++msgid "Changes"
++msgstr "Alterações"
++
++msgid "Changes applied."
++msgstr "Alterações aplicadas."
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "Muda a senha do administrador para acessar este dispositivo"
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check"
++msgstr "Verificar"
++
++msgid "Checksum"
++msgstr "Soma de verificação"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Escolha a zona do firewall que você quer definir para esta interface. "
++"Selecione <em>não especificado -ou- criar</em> para remover a interface da "
++"zona associada ou preencha o campo para criar uma nova zona associada a esta "
++"interface."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Escolha a rede (s) que deseja anexar a este interface wireless ou preencha o "
++"<em> criar </em> campo para definir uma nova rede."
++
++msgid "Cipher"
++msgstr "Cifra"
++
++msgid ""
++"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)."
++msgstr ""
++"Clique em \"Gerar arquivo\" para baixar um arquivo tar com os arquivos de "
++"configuração atuais. Para retornar o roteador para o seu estado inicial, "
++"clique em \"Zerar configuração\" (somente possível para imagens squashfs)."
++
++msgid "Client"
++msgstr "Cliente"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr ""
++"Identificador do cliente enviando quando a requisição do DHCP é realizada"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Feche as conexões inativas após uma dada quantidade de segundos. Use 0 para "
++"manter as conexões."
++
++msgid "Close list..."
++msgstr "Fechar a lista..."
++
++msgid "Collecting data..."
++msgstr "Coletando dados..."
++
++msgid "Command"
++msgstr "Comando"
++
++msgid "Common Configuration"
++msgstr "Configuração Comum"
++
++msgid "Compression"
++msgstr "Compressão"
++
++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 "Confirmation"
++msgstr "Confirmação"
++
++msgid "Connect"
++msgstr "Conectar"
++
++msgid "Connected"
++msgstr "Conectado"
++
++msgid "Connection Limit"
++msgstr "Limite de conexão"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr "Conexões"
++
++msgid "Country"
++msgstr "País"
++
++msgid "Country Code"
++msgstr "Código do País"
++
++msgid "Cover the following interface"
++msgstr "Utilizando a seguinte interface"
++
++msgid "Cover the following interfaces"
++msgstr "Utilizando as seguintes interfaces"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Criar / Atribuir a uma zona de firewall"
++
++msgid "Create Interface"
++msgstr "Criar Interface"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Criar uma ponte juntando múltiplas interfaces"
++
++msgid "Critical"
++msgstr "Crítico"
++
++msgid "Cron Log Level"
++msgstr "Nível de Registro da Cron"
++
++msgid "Custom Interface"
++msgstr "Interface Personalizada"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Se possível, personaliza o comportamento dos <abbr title=\"Diodo Emissor de "
++"Luz\">LED</abbr>s."
++
++msgid "DHCP Leases"
++msgstr "Alocações do DHCP"
++
++msgid "DHCP Server"
++msgstr "Servidor DHCP"
++
++msgid "DHCP and DNS"
++msgstr "DHCP e DNS"
++
++msgid "DHCP client"
++msgstr "Cliente DHCP"
++
++msgid "DHCP-Options"
++msgstr "Opções de DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr "Alocações DHCPv6"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "Encaminhamentos DNS"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Depurar"
++
++msgid "Default %d"
++msgstr "Padrão %d"
++
++msgid "Default gateway"
++msgstr "Roteador Padrão"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Estado padrão"
++
++msgid "Define a name for this network."
++msgstr "Define um nome para esta rede."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Define opções adicionais do DHCP. Por exemplo "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" que anuncia diferentes servidores "
++"DNS para os clientes."
++
++msgid "Delete"
++msgstr "Apagar"
++
++msgid "Delete this interface"
++msgstr "Apagar esta interface"
++
++msgid "Delete this network"
++msgstr "Apagar esta rede"
++
++msgid "Description"
++msgstr "Descrição"
++
++msgid "Design"
++msgstr "Tema"
++
++msgid "Destination"
++msgstr "Destino"
++
++msgid "Device"
++msgstr "Dispositivo"
++
++msgid "Device Configuration"
++msgstr "Configuração do Dispositivo"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnóstico"
++
++msgid "Dial number"
++msgstr "Número de discagem"
++
++msgid "Directory"
++msgstr "Diretório"
++
++msgid "Disable"
++msgstr "Desabilitar"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Desabilita <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++"para esta interface."
++
++msgid "Disable DNS setup"
++msgstr "Desabilita a configuração do DNS"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Desativar temporizador de Beacon de Hardware"
++
++msgid "Disabled"
++msgstr "Desabilitado"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr ""
++"Descartar respostas de servidores externos para redes privadas (RFC1918)"
++
++msgid "Displaying only packages containing"
++msgstr "Mostre somente os pacotes contendo"
++
++msgid "Distance Optimization"
++msgstr "Otimização de Distância"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Distância para o computador mais distante da rede (em metros)."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Diversidade"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq é um servidor combinado de <abbr title=\"Protocolo de Configuração "
++"Dinâmica de Hosts\">DHCP</abbr> e <abbr title=\"Sistema de Nomes de Domínios"
++"\">DNS</abbr> para firewalls <abbr title=\"Tradução de Endereço de Rede"
++"\">NAT</abbr>"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr ""
++"Não mantenha em cache para respostas negativas como, por exemplo, para os "
++"domínios inexistentes"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr ""
++"Não encaminhe requisições que não podem ser respondidas por servidores de "
++"nomes públicos"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr "Não encaminhe buscas por endereço reverso das redes local"
++
++msgid "Do not send probe responses"
++msgstr "Não enviar respostas de exames"
++
++msgid "Domain required"
++msgstr "Requerer domínio"
++
++msgid "Domain whitelist"
++msgstr "Lista branca de domínios"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Não encaminhar consultas <abbr title=\"Sistema de Nomes de Domínios\">DNS</"
++"abbr> sem o nome completo do <abbr title=\"Sistema de Nomes de Domínios"
++"\">DNS</abbr>"
++
++msgid "Download and install package"
++msgstr "Baixe e instale o pacote"
++
++msgid "Download backup"
++msgstr "Baixar a cópia de segurança"
++
++msgid "Dropbear Instance"
++msgstr "Dropbear"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear oferece um acesso shell seguro à rede <abbr title=\"Shell Seguro"
++"\">(SSH)</abbr> e um servidor <abbr title=\"Cópia Segura\">SCP</abbr> "
++"integrado"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"<abbr title=\"Protocolo de Configuração Dinâmica de Hosts\">DHCP</abbr> "
++"Dinâmico"
++
++msgid "Dynamic tunnel"
++msgstr "Túnel dinâmico"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"Aloca dinamicamente os endereços do DHCP para os clientes. Se desabilitado, "
++"somente os clientes com atribuições estáticas serão servidos. "
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "Método EAP"
++
++msgid "Edit"
++msgstr "Editar"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Editar esta interface"
++
++msgid "Edit this network"
++msgstr "Editar esta rede"
++
++msgid "Emergency"
++msgstr "Emergência"
++
++msgid "Enable"
++msgstr "Ativar"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Ativar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "Ativar a atualização de ponto final dinâmico HE.net"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "Ativar o encaminhamento de quadros jumbos (Jumbo Frames)"
++
++msgid "Enable NTP client"
++msgstr "Ativar o cliente <abbr title=\"Network Time Protocol\">NTP</abbr>"
++
++msgid "Enable TFTP server"
++msgstr "Ativar servidor TFTP"
++
++msgid "Enable VLAN functionality"
++msgstr "Ativar funcionalidade de VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Ativar o aprendizado e obsolescência"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "Ativar esta montagem"
++
++msgid "Enable this swap"
++msgstr "Ativar este espaço de troca (swap)"
++
++msgid "Enable/Disable"
++msgstr "Ativar/Desativar"
++
++msgid "Enabled"
++msgstr "Ativado"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Ativa o protocolo STP nesta ponte"
++
++msgid "Encapsulation mode"
++msgstr "Modo de encapsulamento"
++
++msgid "Encryption"
++msgstr "Cifragem"
++
++msgid "Erasing..."
++msgstr "Apagando..."
++
++msgid "Error"
++msgstr "Erro"
++
++msgid "Ethernet Adapter"
++msgstr "Adaptador Ethernet"
++
++msgid "Ethernet Switch"
++msgstr "Switch Ethernet"
++
++msgid "Expand hosts"
++msgstr "Expandir arquivos de equipamentos conhecidos (hosts)"
++
++msgid "Expires"
++msgstr "Expira"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++"Tempo de expiração dos endereços atribuídos. Mínimo é 2 minutos (<code>2m</"
++"code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Servidor externo de registros do sistema (syslog)"
++
++msgid "External system log server port"
++msgstr "Porta do servidor externo de registro do sistema (syslog)"
++
++msgid "Fast Frames"
++msgstr "Quadros Rápidos"
++
++msgid "File"
++msgstr "Arquivo"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Nome do arquivo da imagem de boot anunciada para os clientes"
++
++msgid "Filesystem"
++msgstr "Sistema de Arquivos"
++
++msgid "Filter"
++msgstr "Filtro"
++
++msgid "Filter private"
++msgstr "Filtrar endereços privados"
++
++msgid "Filter useless"
++msgstr "Filtrar consultas inúteis"
++
++msgid "Find and join network"
++msgstr "Procurar e conectar à rede"
++
++msgid "Find package"
++msgstr "Procurar pacote"
++
++msgid "Finish"
++msgstr "Terminar"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall Settings"
++msgstr "Configurações do Firewall"
++
++msgid "Firewall Status"
++msgstr "Estado do Firewall"
++
++msgid "Firmware Version"
++msgstr "Versão do Firmware"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "Porta de origem fixa para saída de consultas DNS"
++
++msgid "Flags"
++msgstr "Marcadores"
++
++msgid "Flash Firmware"
++msgstr "Gravar Firmware"
++
++msgid "Flash image..."
++msgstr "Gravar imagem..."
++
++msgid "Flash new firmware image"
++msgstr "Gravar nova imagem do firmware"
++
++msgid "Flash operations"
++msgstr "Operações na memória flash"
++
++msgid "Flashing..."
++msgstr "Gravando na flash..."
++
++msgid "Force"
++msgstr "Forçar"
++
++msgid "Force CCMP (AES)"
++msgstr "Forçar CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr "Forçar o DHCP nesta rede mesmo se outro servidor for detectado."
++
++msgid "Force TKIP"
++msgstr "Forçar TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "Forçar TKIP e CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "Encaminhar tráfego DHCP"
++
++msgid "Forward broadcast traffic"
++msgstr "Encaminhar tráfego broadcast"
++
++msgid "Forwarding mode"
++msgstr "Modo de encaminhamento"
++
++msgid "Fragmentation Threshold"
++msgstr "Limiar de Fragmentação"
++
++msgid "Frame Bursting"
++msgstr "Explosão de Quadros (Frame Bursting)"
++
++msgid "Free"
++msgstr "Livre"
++
++msgid "Free space"
++msgstr "Espaço livre"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "Somente GPRS"
++
++msgid "Gateway"
++msgstr "Roteador"
++
++msgid "Gateway ports"
++msgstr "Acesso remoto a portas encaminhadas"
++
++msgid "General Settings"
++msgstr "Configurações Gerais"
++
++msgid "General Setup"
++msgstr "Configurações Gerais"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "Gerar arquivo"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Generico 802.11%s Wireless Controlador"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr "A senha de confirmação informada não casa. Senha não alterada!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Ir para a configuração de senha..."
++
++msgid "Go to relevant configuration page"
++msgstr "Ir para a página de configuração pertinente"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "Senha HE.net"
++
++msgid "HE.net username"
++msgstr ""
++
++# Não sei que contexto isto está sendo usado
++msgid "Handler"
++msgstr "Responsável"
++
++msgid "Hang Up"
++msgstr "Suspender"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Aqui você pode configurar os aspectos básicos do seu equipamento, como o "
++"nome do equipamento ou o fuso horário."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++"Aqui você pode colar as chaves públicas do SSH (uma por linha) para a "
++"autenticação por chaves do SSH."
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Hermes 802.11b Wireless Controlador"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++"Ocultar <abbr title=\"Identificador de Conjunto de Serviços Estendidos"
++"\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "Entradas de Equipamentos"
++
++msgid "Host expiry timeout"
++msgstr "Tempo limite de expiração de equipamento"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++"<abbr title=\"Endereço do Protocolo de Internet\">IP</abbr> do Equipamento "
++"ou Rede"
++
++msgid "Hostname"
++msgstr "Nome do equipamento"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "Nome do equipamento enviado quando requisitar DHCP"
++
++msgid "Hostnames"
++msgstr "Nome dos equipamentos"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "Endereço IP"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "Firewall para IPv4"
++
++msgid "IPv4 WAN Status"
++msgstr "Estado IPv4 da WAN"
++
++msgid "IPv4 address"
++msgstr "Endereço IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "Broadcast IPv4"
++
++msgid "IPv4 gateway"
++msgstr "Roteador padrão IPv4"
++
++msgid "IPv4 netmask"
++msgstr "Máscara de rede IPv4"
++
++msgid "IPv4 only"
++msgstr "Somente IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "Tamanho do prefixo IPv4"
++
++msgid "IPv4-Address"
++msgstr "Endereço IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "Firewall para IPv6"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "Estado IPv6 da WAN"
++
++msgid "IPv6 address"
++msgstr "Endereço IPv6"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "Roteador padrão do IPv6"
++
++msgid "IPv6 only"
++msgstr "Somente IPv6"
++
++msgid "IPv6 prefix"
++msgstr "Prefixo IPv6"
++
++msgid "IPv6 prefix length"
++msgstr "Tamanho Prefixo IPv6"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "Endereço IPv6"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-in-IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6-sobre-IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6-sobre-IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "Identidade PEAP"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++"Se especificado, monta o dispositivo pelo seu UUID ao invés de um nó de "
++"dispositivo fixo"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++"Se especificado, monta o dispositivo pela etiqueta da partiçãoo ao invés de "
++"um nó de dispositivo fixo"
++
++msgid "If unchecked, no default route is configured"
++msgstr "Se desmarcado, nenhuma rota padrão será configurada"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++"Se desmarcado, os endereços dos servidores DNS anunciados serão ignorados"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Se a sua memória física for insuficiente, os dados não utilizados poderão "
++"ser armazenados temporariamente em um dispositivo swap, resultando em uma "
++"maior quantidade de memória <abbr title=\"Memória de Acesso Aleatório\">RAM</"
++"abbr> utilizável. Esteja ciente de que a troca de dados (swap) é um processo "
++"muito lento, uma vez que o dispositivo swap não pode ser acessado com taxas "
++"de transferência tão altas com a memória <abbr title=\"Memória de Acesso "
++"Aleatório\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Ignorar <code>/etc/hosts</code>"
++
++msgid "Ignore interface"
++msgstr "Ignorar interface"
++
++msgid "Ignore resolve file"
++msgstr "Ignorar arquivo de resolução de nomes (resolv.conf)"
++
++msgid "Image"
++msgstr "Imagem"
++
++msgid "In"
++msgstr "Entrada"
++
++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 "Tempo limite de inatividade"
++
++msgid "Inbound:"
++msgstr "Entrando:"
++
++msgid "Info"
++msgstr "Informação"
++
++msgid "Initscript"
++msgstr "Script de iniciação"
++
++msgid "Initscripts"
++msgstr "Scripts de iniciação"
++
++msgid "Install"
++msgstr "Instalar"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Instalar pacote %q"
++
++msgid "Install protocol extensions..."
++msgstr "Instalar extensões de protocolo..."
++
++msgid "Installed packages"
++msgstr "Pacotes instalados"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Interface Configuration"
++msgstr "Configuração da Interface"
++
++msgid "Interface Overview"
++msgstr "Visão Geral da Interface"
++
++msgid "Interface is reconnecting..."
++msgstr "A interface está reconectando..."
++
++msgid "Interface is shutting down..."
++msgstr "A interface está desligando..."
++
++msgid "Interface not present or not connected yet."
++msgstr "A interface não está presente ou não está conectada ainda."
++
++msgid "Interface reconnected"
++msgstr "Interface reconectada"
++
++msgid "Interface shut down"
++msgstr "Interface desligada"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "erro no servidor interno"
++
++msgid "Invalid"
++msgstr "Valor inválido"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++"O valor informado do ID da VLAN é inválido! Somente valores entre %d e %d "
++"são permitidos."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++"O valor informado do ID da VLAN é inválido! Somente valores únicos são "
++"permitidos."
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Usuário e/ou senha inválida! Por favor, tente novamente."
++
++#, 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 ""
++"A imagem que está a tentar carregar aparenta nao caber na flash do "
++"equipamento. Por favor verifique o arquivo da imagem!"
++
++msgid "Java Script required!"
++msgstr "É necessário Java Script!"
++
++msgid "Join Network"
++msgstr "Conectar à Rede"
++
++msgid "Join Network: Settings"
++msgstr "Conectar à Rede: Configurações"
++
++msgid "Join Network: Wireless Scan"
++msgstr "Conectar à Rede: Busca por Rede Sem Fio"
++
++msgid "Keep settings"
++msgstr "Manter configurações"
++
++msgid "Kernel Log"
++msgstr "Registo do Kernel"
++
++msgid "Kernel Version"
++msgstr "Versão do Kernel"
++
++msgid "Key"
++msgstr "Chave"
++
++msgid "Key #%d"
++msgstr "Chave #%d"
++
++msgid "Kill"
++msgstr "Matar"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "Servidor L2TP"
++
++msgid "LCP echo failure threshold"
++msgstr "Limite de falha no eco do LCP"
++
++msgid "LCP echo interval"
++msgstr "Intervalo do eco do LCP"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Etiqueta"
++
++msgid "Language"
++msgstr "Idioma"
++
++msgid "Language and Style"
++msgstr "Idioma e Estilo"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Tempo de validade da atribuição"
++
++msgid "Leasefile"
++msgstr "Arquivo de atribuições"
++
++msgid "Leasetime"
++msgstr "Tempo de atribuição do DHCP"
++
++msgid "Leasetime remaining"
++msgstr "Tempo restante da atribuição"
++
++msgid "Leave empty to autodetect"
++msgstr "Deixe vazio para detectar automaticamente"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "Deixe vazio para usar o endereço WAN atual"
++
++msgid "Legend:"
++msgstr "Legenda:"
++
++msgid "Limit"
++msgstr "Limite"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Enlace Ativo"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"Lista dos servidores <abbr title=\"Domain Name System\">DNS</abbr> para "
++"encaminhar as requisições"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++"Lista dos domínios para os quais será permitido respostas apontando para "
++"redes privadas (RFC1918)"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++"Lista de servidores <abbr title=\"Domain Name System\">DNS</abbr> que "
++"fornecem resultados errados para consultas a domínios inexistentes (NX)"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++"Escuta apenas na interface especificada. Se não especificado, escuta em todas"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Porta de escuta para a entrada das consultas DNS"
++
++msgid "Load"
++msgstr "Carga"
++
++msgid "Load Average"
++msgstr "Carga Média"
++
++msgid "Loading"
++msgstr "Carregando"
++
++msgid "Local IPv4 address"
++msgstr "Endereço IPv4 local"
++
++msgid "Local IPv6 address"
++msgstr "Endereço IPv6 local"
++
++msgid "Local Startup"
++msgstr "Iniciação Local"
++
++msgid "Local Time"
++msgstr "Hora Local"
++
++msgid "Local domain"
++msgstr "Domínio Local"
++
++#, fuzzy
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++"Especificação do domínio local. Nomes que casam com este domínio nunca serão "
++"encaminhados e são resolvidos somente pelo DHCP ou pelo arquivos de "
++"equipamentos conhecidos (hosts)"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++"Sufixo do domínio local adicionado aos nomes no DHCP e nas entradas dos "
++"arquivo de equipamentos conhecidos (hosts)"
++
++msgid "Local server"
++msgstr "Servidor local"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++"Localizar o nome do equipamento dependendo da subrede requisitante se "
++"mútliplos endereços IPs estiverem disponíveis"
++
++msgid "Localise queries"
++msgstr "Localizar consultas"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Nível de detalhamento de saída dos registros"
++
++msgid "Log queries"
++msgstr "Registar as consultas"
++
++msgid "Logging"
++msgstr "Registrando os eventos"
++
++msgid "Login"
++msgstr "Entrar"
++
++msgid "Logout"
++msgstr "Sair"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr "O endereço mais baixo concedido como deslocamento do endereço da rede."
++
++msgid "MAC-Address"
++msgstr "Endereço MAC"
++
++msgid "MAC-Address Filter"
++msgstr "Filtro de Endereço MAC"
++
++msgid "MAC-Filter"
++msgstr "Filtro de MAC"
++
++msgid "MAC-List"
++msgstr "Lista de MAC"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr ""
++"<abbr title=\"Maximum Transmission Unit/Unidade Máxima de Transmissão\">MTU</"
++"abbr>"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Taxa Máxima"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "Número máximo permitido de alocações DHCP ativas"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "Número máximo permitido de consultas DNS concorrentes"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "Tamanho máximo permitido dos pacotes UDP EDNS.0"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "Tempo máximo, em segundos, para esperar que o modem fique pronto"
++
++# Desconheço o uso
++msgid "Maximum hold time"
++msgstr "Tempo máximo de espera"
++
++msgid "Maximum number of leased addresses."
++msgstr "Número máximo de endereços atribuídos."
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "Memória"
++
++msgid "Memory usage (%)"
++msgstr "Uso da memória (%)"
++
++msgid "Metric"
++msgstr "Métrica"
++
++msgid "Minimum Rate"
++msgstr "Taxa Mínima"
++
++msgid "Minimum hold time"
++msgstr "Tempo mínimo de espera"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "Extensão para o protocolo %q está ausente"
++
++msgid "Mode"
++msgstr "Modo"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Dispositivo do Modem"
++
++msgid "Modem init timeout"
++msgstr "Estouro de tempo da iniciação do modem"
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr "Entrada de Montagem"
++
++msgid "Mount Point"
++msgstr "Ponto de Montagem"
++
++msgid "Mount Points"
++msgstr "Pontos de Montagem"
++
++msgid "Mount Points - Mount Entry"
++msgstr "Pontos de Montagem - Entrada de Montagem"
++
++msgid "Mount Points - Swap Entry"
++msgstr "Pontos de Montagem - Entrada da Swap"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Pontos de montagem definem em que ponto um dispositivo de armazenamento será "
++"anexado ao sistema de arquivos"
++
++msgid "Mount options"
++msgstr "Opções de montagem"
++
++msgid "Mount point"
++msgstr "Ponto de montagem"
++
++msgid "Mounted file systems"
++msgstr "Sistemas de arquivos montados"
++
++msgid "Move down"
++msgstr "Mover para baixo"
++
++msgid "Move up"
++msgstr "Mover para cima"
++
++msgid "Multicast Rate"
++msgstr "Taxa de Multicast"
++
++msgid "Multicast address"
++msgstr "Endereço de Multicast"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "Candidatos a servidor NTP"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Name of the new interface"
++msgstr "Nome da nova interface"
++
++msgid "Name of the new network"
++msgstr "Nome da nova rede"
++
++msgid "Navigation"
++msgstr "Navegação"
++
++msgid "Netmask"
++msgstr "Máscara de rede"
++
++msgid "Network"
++msgstr "Rede"
++
++msgid "Network Utilities"
++msgstr "Utilitários de Rede"
++
++msgid "Network boot image"
++msgstr "Imagem de boot pela rede"
++
++msgid "Network without interfaces."
++msgstr "Rede sem interfaces."
++
++msgid "Next »"
++msgstr "Próximo »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Nenhum Servidor DHCP configurado para esta interface"
++
++msgid "No chains in this table"
++msgstr "Nenhuma cadeira nesta tabela"
++
++msgid "No files found"
++msgstr "Nenhum arquivo encontrado"
++
++msgid "No information available"
++msgstr "Nenhuma informação disponível"
++
++msgid "No negative cache"
++msgstr "Nenhum cache negativo"
++
++msgid "No network configured on this device"
++msgstr "Nenhuma rede configurada neste dispositivo"
++
++msgid "No network name specified"
++msgstr "Nenhum nome de rede foi especificado"
++
++msgid "No package lists available"
++msgstr "Nenhuma lista de pacotes disponível"
++
++msgid "No password set!"
++msgstr "Nenhuma senha definida!"
++
++msgid "No rules in this chain"
++msgstr "Sem regras nesta cadeia"
++
++msgid "No zone assigned"
++msgstr "Nenhuma zona definida"
++
++msgid "Noise"
++msgstr "Ruído"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Ruído:"
++
++msgid "None"
++msgstr "Nenhum"
++
++msgid "Normal"
++msgstr "Normal"
++
++msgid "Not Found"
++msgstr "Não Encontrado"
++
++msgid "Not associated"
++msgstr "Não conectado"
++
++msgid "Not connected"
++msgstr "Não conectado"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Nota: Os arquivos de configuração serão apagados."
++
++msgid "Notice"
++msgstr "Aviso"
++
++msgid "Nslookup"
++msgstr "Nslookup"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "Configuração-OPKG"
++
++msgid "Off-State Delay"
++msgstr "Atraso no estado de desligado"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Nesta página pode configurar as interfaces de rede. Esta interface pode "
++"formar uma ponte juntando várias interfaces. Para isto, marque o campo "
++"\"Juntar interfaces em uma ponte\" e informar as várias interfaces de rede. "
++"Pode também usar a notação para <abbr title=\"Rede Local Virtual\">VLAN</"
++"abbr> <samp>INTERFACE.VLANNR</samp> (<abbr title=\"por exemplo\">ex.</abbr>: "
++"<samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr "Atraso no estado de conexões"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++"É necessário especificar ao menos um nome de equipamento ou endereço MAC!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "Um ou mais campos contém valores inválidos!"
++
++msgid "One or more required fields have no value!"
++msgstr "Um ou mais campos obrigatórios não tem valor!"
++
++msgid "Open list..."
++msgstr "Abrir lista..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Opção alterada"
++
++msgid "Option removed"
++msgstr "Opção removida"
++
++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 "Options"
++msgstr "Opções"
++
++msgid "Other:"
++msgstr "Outro:"
++
++msgid "Out"
++msgstr "Saída"
++
++msgid "Outbound:"
++msgstr "Saindo:"
++
++msgid "Outdoor Channels"
++msgstr "Canais para externo"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "Sobrescrever o endereço MAC"
++
++msgid "Override MTU"
++msgstr "Sobrescrever o MTU"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "Sobrescrever o roteador padrão nas respostas do DHCP"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++"Sobrescrever a máscara de rede enviada aos clientes. Normalmente, ela é "
++"calculada a partir da máscara da subrede de onde o cliente solicitou o "
++"endereço."
++
++msgid "Override the table used for internal routes"
++msgstr "Sobrescrever a tabela usada para as rotas internas"
++
++msgid "Overview"
++msgstr "Visão geral"
++
++msgid "Owner"
++msgstr "Dono"
++
++msgid "PAP/CHAP password"
++msgstr "Senha do PAP/CHAP"
++
++msgid "PAP/CHAP username"
++msgstr "Usuário do PAP/CHAP"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "Encapsulamento PPPoA "
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "O pacote libiwinfo é necessário!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "As listas de pacotes são mais antigas do que 24 horas"
++
++msgid "Package name"
++msgstr "Nome do Pacote"
++
++msgid "Packets"
++msgstr "Pacotes"
++
++msgid "Part of zone %q"
++msgstr "Parte da zona %q"
++
++msgid "Password"
++msgstr "Senha"
++
++msgid "Password authentication"
++msgstr "Autenticação por senha"
++
++msgid "Password of Private Key"
++msgstr "Senha da Chave Privada"
++
++msgid "Password successfully changed!"
++msgstr "A senha foi alterada com sucesso!"
++
++msgid "Path to CA-Certificate"
++msgstr "Caminho para o Certificado da AC"
++
++msgid "Path to Client-Certificate"
++msgstr "Caminho para o Certificado do Cliente"
++
++msgid "Path to Private Key"
++msgstr "Caminho para a Chave Privada"
++
++msgid "Path to executable which handles the button event"
++msgstr "Caminho para o executável que trata o evento do botão"
++
++msgid "Peak:"
++msgstr "Pico:"
++
++msgid "Perform reboot"
++msgstr "Reiniciar o sistema"
++
++msgid "Perform reset"
++msgstr "Zerar configuração"
++
++msgid "Phy Rate:"
++msgstr "Taxa física:"
++
++msgid "Physical Settings"
++msgstr "Configurações Físicas"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Pkts."
++msgstr "Pcts."
++
++msgid "Please enter your username and password."
++msgstr "Entre com o seu usuário e senha."
++
++msgid "Policy"
++msgstr "Política"
++
++msgid "Port"
++msgstr "Porta"
++
++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 "Port status:"
++msgstr "Status da porta"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++"Assumir que o parceiro está morto depois de uma data quantidade de falhas de "
++"echo do LCP. Use 0 para ignorar as falhas"
++
++msgid "Prevents client-to-client communication"
++msgstr "Impede a comunicação de cliente para cliente"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Prism2/2.5/3 802.11b Wireless Controlador"
++
++msgid "Proceed"
++msgstr "Proceder"
++
++msgid "Processes"
++msgstr "Processos"
++
++msgid "Prot."
++msgstr "Protocolo"
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid "Protocol family"
++msgstr "Família do protocolo"
++
++msgid "Protocol of the new interface"
++msgstr "Protocolo para a nova interface"
++
++msgid "Protocol support is not installed"
++msgstr "O suporte ao protocolo não está instalado"
++
++msgid "Provide NTP server"
++msgstr "Fornecer serviço <abbr title=\"Network Time Protocol\">NTP</abbr>"
++
++msgid "Provide new network"
++msgstr "Prover nova rede"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Ad-Hoc falso (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "Qualidade"
++
++msgid "RTS/CTS Threshold"
++msgstr "Limiar RTS/CTS"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr "Taxa de RX"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "RaLink 802.11%s Wireless Controlador"
++
++msgid "Radius-Accounting-Port"
++msgstr "Porta de contabilidade do RADIUS"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Segredo da contabilidade do RADIUS"
++
++msgid "Radius-Accounting-Server"
++msgstr "Servidor da contabilidade do RADIUS"
++
++msgid "Radius-Authentication-Port"
++msgstr "Porta de autenticação do RADIUS"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Segredo da autenticação do RADIUS"
++
++msgid "Radius-Authentication-Server"
++msgstr "Servidor da autenticação do RADIUS"
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"Ler <code>/etc/ethers</code> para configurar o Servidor-<abbr title="
++"\"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."
++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 "
++"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 "
++"desfeita!\n"
++"Você poderá perder o acesso a este dispositivo se você estiver conectado "
++"através desta interface."
++
++msgid "Really reset all changes?"
++msgstr "Realmente limpar todas as mudanças?"
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou might lose access to this device if you are "
++"connected via this interface."
++msgstr ""
++"Realmente desligar esta rede\"%s\" ?\n"
++"Você poderá perder o acesso a este dispositivo se você estiver conectado "
++"através desta interface."
++
++msgid ""
++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if "
++"you are connected via this interface."
++msgstr ""
++"Realmente desligar esta interface\"%s\" ?\n"
++"Você poderá perder o acesso a este dispositivo se você estiver conectado "
++"através desta interface."
++
++msgid "Really switch protocol?"
++msgstr "Realmente trocar o protocolo?"
++
++msgid "Realtime Connections"
++msgstr "Conexões em Tempo Real"
++
++msgid "Realtime Graphs"
++msgstr "Gráficos em Tempo Real"
++
++msgid "Realtime Load"
++msgstr "Carga em Tempo Real"
++
++msgid "Realtime Traffic"
++msgstr "Tráfego em Tempo Real"
++
++msgid "Realtime Wireless"
++msgstr "Rede sem fio em Tempo Real"
++
++msgid "Rebind protection"
++msgstr "Proteção contra \"Rebind\""
++
++msgid "Reboot"
++msgstr "Reiniciar"
++
++msgid "Rebooting..."
++msgstr "Reiniciando..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Reinicia o sistema operacional do seu dispositivo"
++
++msgid "Receive"
++msgstr "Receber"
++
++msgid "Receiver Antenna"
++msgstr "Antena de Recepção"
++
++msgid "Reconnect this interface"
++msgstr "Reconectar esta interface"
++
++msgid "Reconnecting interface"
++msgstr "Reconectando interface"
++
++msgid "References"
++msgstr "Referências"
++
++msgid "Regulatory Domain"
++msgstr "Domínio Regulatório"
++
++msgid "Relay"
++msgstr "Retransmissor"
++
++msgid "Relay Bridge"
++msgstr "Ponte por Retransmissão"
++
++msgid "Relay between networks"
++msgstr "Encaminha o tráfego entre as redes"
++
++msgid "Relay bridge"
++msgstr "Ponte por retransmissão"
++
++msgid "Remote IPv4 address"
++msgstr "Endereço IPv4 remoto"
++
++msgid "Remove"
++msgstr "Remover"
++
++msgid "Repeat scan"
++msgstr "Repetir busca"
++
++msgid "Replace entry"
++msgstr "Substituir entrada"
++
++msgid "Replace wireless configuration"
++msgstr "Substituir a configuração da rede sem fio"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "Requerido para alguns provedores de internet, ex. Charter com DOCSIS 3"
++
++msgid "Reset"
++msgstr "Limpar"
++
++msgid "Reset Counters"
++msgstr "Reiniciar contadores"
++
++msgid "Reset to defaults"
++msgstr "Redefinir para os valores padrão"
++
++msgid "Resolv and Hosts Files"
++msgstr "Arquivos de Resolv e Hosts"
++
++msgid "Resolve file"
++msgstr "Arquivo Resolv"
++
++msgid "Restart"
++msgstr "Reiniciar"
++
++msgid "Restart Firewall"
++msgstr "Reiniciar o firewall"
++
++msgid "Restore backup"
++msgstr "Restaurar cópia de segurança"
++
++msgid "Reveal/hide password"
++msgstr "Relevar/esconder senha"
++
++msgid "Revert"
++msgstr "Reverter"
++
++msgid "Root"
++msgstr "Raiz"
++
++msgid "Root directory for files served via TFTP"
++msgstr "Diretório raiz para arquivos disponibilizados pelo TFTP"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Senha do Roteador"
++
++msgid "Routes"
++msgstr "Rotas"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"As rotas especificam através de qual interface e roteador um certo destino "
++"podem ser alcançado."
++
++msgid "Rule #"
++msgstr "Regra #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++"Execute a verificação do sistema de arquivos antes da montagem do dispositivo"
++
++msgid "Run filesystem check"
++msgstr "Execute a verificação do sistema de arquivos "
++
++msgid ""
++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
++"use 6in4 instead"
++msgstr ""
++
++msgid "SIXXS-handle[/Tunnel-ID]"
++msgstr ""
++
++msgid "SSH Access"
++msgstr "Acesso SSH"
++
++msgid "SSH-Keys"
++msgstr "Chaves SSH"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Salvar"
++
++msgid "Save & Apply"
++msgstr "Salvar & Aplicar"
++
++msgid "Save &#38; Apply"
++msgstr "Save &#38; Aplicar"
++
++msgid "Scan"
++msgstr "Procurar"
++
++msgid "Scheduled Tasks"
++msgstr "Tarefas Agendadas"
++
++msgid "Section added"
++msgstr "Seção adicionada"
++
++msgid "Section removed"
++msgstr "Seção removida"
++
++msgid "See \"mount\" manpage for details"
++msgstr "Veja o manual (man) do comando \"mount\" para detalhes"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++"Enviar requisições de eco do LCP no dado intervalo em segundos. Somente "
++"efetivo em conjunto com o limite de falhas."
++
++msgid "Separate Clients"
++msgstr "Isolar Clientes"
++
++msgid "Separate WDS"
++msgstr "Separar WDS"
++
++msgid "Server Settings"
++msgstr "Configurações do 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 "Nome do Serviço"
++
++msgid "Service Type"
++msgstr "Tipo do Serviço"
++
++msgid "Services"
++msgstr "Serviços"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "Configurar a Sincronização do Horário"
++
++msgid "Setup DHCP Server"
++msgstr "Configurar Servidor DHCP"
++
++msgid "Show current backup file list"
++msgstr "Mostra a lista atual de arquivos para a cópia de segurança"
++
++msgid "Shutdown this interface"
++msgstr "Desligar esta interface"
++
++msgid "Shutdown this network"
++msgstr "Desligar esta rede"
++
++msgid "Signal"
++msgstr "Sinal"
++
++msgid "Signal:"
++msgstr "Sinal:"
++
++msgid "Size"
++msgstr "Tamanho"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "Pular"
++
++msgid "Skip to content"
++msgstr "Pular para o conteúdo"
++
++msgid "Skip to navigation"
++msgstr "Pular para a navegação"
++
++msgid "Slot time"
++msgstr "Intervalo de tempo"
++
++msgid "Software"
++msgstr "Software"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Alguns campos estão inválidos e os valores não podem ser salvos!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Desculpe o objeto solicitado não foi encontrado"
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "Desculpe, o servidor encontrou um erro inesperado."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"Sinto muito, não existe suporte para o sysupgrade. Uma nova imagem de "
++"firmware deve ser gravada manualmente. Por favor, consulte a wiki do OpenWrt "
++"para instruções específicas da instalação deste dispositivo."
++
++msgid "Sort"
++msgstr "Ordenar"
++
++msgid "Source"
++msgstr "Origem"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "Especifica o estado do botão para ser tratado"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "Especifica o diretório que o dispositivo está conectado"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "Especifica a porta de escuta deste <em>Dropbear</em>"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++"Especifica a quantidade máxima de requisições ARP falhadas antes de "
++"considerar que um equipamento está morto"
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++"Especifica a quantidade máxima de segundos antes de considerar que um "
++"equipamento está morto"
++
++msgid "Specify the secret encryption key here."
++msgstr "Especifique a chave de cifragem secreta aqui."
++
++msgid "Start"
++msgstr "Iniciar"
++
++msgid "Start priority"
++msgstr "Prioridade de iniciação"
++
++msgid "Startup"
++msgstr "Iniciação"
++
++msgid "Static IPv4 Routes"
++msgstr "Rotas Estáticas IPv4"
++
++msgid "Static IPv6 Routes"
++msgstr "Rotas Estáticas IPv6"
++
++msgid "Static Leases"
++msgstr "Alocações Estáticas"
++
++msgid "Static Routes"
++msgstr "Rotas Estáticas"
++
++msgid "Static WDS"
++msgstr "WDS Estático"
++
++msgid "Static address"
++msgstr "Endereço Estático"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"Alocações estáticas são usadas para definir um endereço IP fixo e nome "
++"simbólico para os clientes do DHCP. Elas também são necessárias para "
++"configurações não dinâmicas onde um computador com a alocação correspondente "
++"é provido."
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Stop"
++msgstr "Parar"
++
++msgid "Strict order"
++msgstr "Ordem Exata"
++
++msgid "Submit"
++msgstr "Enviar"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Entrada do espaço de troca (Swap)"
++
++msgid "Switch"
++msgstr "Switch"
++
++msgid "Switch %q"
++msgstr "Switch %q"
++
++msgid "Switch %q (%s)"
++msgstr "Switch %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Trocar o protocolo"
++
++msgid "Sync with browser"
++msgstr "Sincronizar com o navegador"
++
++msgid "Synchronizing..."
++msgstr "Sincronizando..."
++
++msgid "System"
++msgstr "Sistema"
++
++msgid "System Log"
++msgstr "Registo do Sistema"
++
++msgid "System Properties"
++msgstr "Propriedades do Sistema"
++
++msgid "System log buffer size"
++msgstr "Tamanho do buffer de registro do sistema"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "Configurações do TFTP"
++
++msgid "TFTP server root"
++msgstr "Raiz do servidor TFTP"
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr "Taxa de TX"
++
++msgid "Table"
++msgstr "Tabela"
++
++msgid "Target"
++msgstr "Destino"
++
++msgid "Terminate"
++msgstr "Terminar"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"A seção da <em>Configuração do Dispositivo</em> engloba as configurações "
++"físicas do rádio como canal, potência de transmissão ou seleção da antena. "
++"Estas configurações são compartilhadas entre todas as redes sem fio (se o "
++"hardware for capaz de utilizar múltiplas SSID). As configurações específicas "
++"de cada rede, como cifragem ou modo de operação estão agrupadas na "
++"<em>Configuração da Interface</em>."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"O pacote <em>libiwinfo-lua</em> não está instalado. Você precisa instalar "
++"este componente para ter uma configuração da rede sem fio funcional!"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++"O prefixo IPv6 atribuído pelo provedor, geralmente termina com<code>::</code>"
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++"Os caracteres permitidos são: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> e <code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"O arquivo do dispositivo de armazenamento ou da partição (<abbr title=\"por "
++"exemplo\">ex.</abbr> <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 ""
++"O sistema de arquivos que foi usado para formatar a unidade de armazenamento "
++"(<abbr title=\"por exemplo\">ex.</abbr> <samp><abbr title=\"Sistema de "
++"Arquivos ext3\">ext3</abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++"A imagem do firmware foi enviada. Abaixo estão a soma de verificação "
++"(checksum) e o tamanho dom arquivo. Compare-os com o arquivo original para "
++"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"
++
++msgid "The following rules are currently active on this system."
++msgstr "As seguintes regras estão atualmente ativas neste sistema."
++
++msgid "The given network name is not unique"
++msgstr "O nome de rede informado não é único"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"Este equipamento não é capaz de utilizar SSID múltiplos e as configurações "
++"existentes serão substituídas se você proceder."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++"O comprimento do prefixo IPv4 em bits, o restante é usado nos endereços IPv6."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "O comprimento do prefixo IPv6 em bits"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++"As portas de rede neste dispositivo podem ser configuradas em diversas <abbr "
++"title=\"Virtual local Network\">VLAN</abbr>s nas quais computadores em uma "
++"mesma <abbr title=\"Virtual local Network\">VLAN</abbr> podem se comunicar "
++"diretamente. <abbr title=\"Virtual local Network\">VLAN</abbr>s são muitas "
++"vezes utilizadas para separar diferentes segmentos de rede. Em geral, existe "
++"uma porta para o enlace superior (uplink) e as demais portas são utilizadas "
++"para a rede local."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "O protocolo selecionado necessita estar associado a um dispositivo"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++"O sistema está apagando agora a partição da configuração e irá reiniciar "
++"quando terminado."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"O sistema está gravando o firmware para a flash.<br /> NÃO DESLIGUE O "
++"EQUIPAMENTO!<br /> Espere alguns minutos até tentar reconectar. Dependendo "
++"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 ""
++
++msgid ""
++"The uploaded image file does not contain a supported format. Make sure that "
++"you choose the generic image format for your platform."
++msgstr ""
++"A imagem carregada não contém um formato suportado. Confirme que você "
++"escolheu uma imagem para a sua plataforma."
++
++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 pending changes to revert!"
++msgstr "Não existem modificações pendentes para reverter!"
++
++msgid "There are no pending changes!"
++msgstr "Não existem modificações pendentes!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"Ainda não existe um dispositivo associado. Por favor, associe um dispositivo "
++"de rede na aba \"Configurações Físicas\""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"Não existem uma senha definida para este roteador. Por favor, configure uma "
++"senha para o root para proteger a interface WEB e habilitar o SSH."
++
++msgid "This IPv4 address of the relay"
++msgstr "Este endereço IPv4 do repassar"
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"Esta é a lista dos padrões de expressão shell para casar com os arquivos e "
++"diretórios incluídos durante a atualização do sistema. Arquivos modificados "
++"em /etc/config/ e alguns outros arquivos de configuração são automaticamente "
++"preservados."
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"Este é o conteúdo do /etc/rc.local. Insira seus próprios comandos aqui "
++"(antes de 'exit 0') para executá-los no final do processo de boot."
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++"Este é o endereço da ponta local designado pelo agente de túnel. normalmente "
++"ele termina com <code>:2</code>"
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Este é o único <abbr title=\"Protocolo de Configuração Dinâmica de Hosts"
++"\">DHCP</abbr> na rede local"
++
++msgid "This is the plain username for logging into the account"
++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 "Este é o sistema de agendamento de tarefas."
++
++msgid ""
++"This is usually the address of the nearest PoP operated by the tunnel broker"
++msgstr ""
++"Este é normalmente o endereço do <abbr title=\"Point of Presence, Ponto de "
++"Presença\">PoP</abbr> mais próximo operado pelo agente de túnel"
++
++msgid ""
++"This list gives an overview over currently running system processes and "
++"their status."
++msgstr ""
++"Esta lista fornece uma visão geral sobre os processos em execução no sistema."
++
++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 "This page gives an overview over currently active network connections."
++msgstr "Esta página fornece informações sobre as conexões de rede ativas."
++
++msgid "This section contains no values yet"
++msgstr "Esta seção ainda não contêm valores"
++
++msgid "Time Synchronization"
++msgstr "Sincronização de horário"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "A sincronização do horário ainda não está configurada."
++
++msgid "Timezone"
++msgstr "Fuso Horário"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"Para recuperar os arquivos de configuração, você pode enviar aqui uma cópia "
++"de segurança anterior."
++
++msgid "Total Available"
++msgstr "Total Disponível"
++
++msgid "Traceroute"
++msgstr "Traceroute"
++
++msgid "Traffic"
++msgstr "Tráfego"
++
++msgid "Transfer"
++msgstr "Transferências"
++
++msgid "Transmission Rate"
++msgstr "Taxa de Transmissão"
++
++msgid "Transmit"
++msgstr "Transmitir"
++
++msgid "Transmit Power"
++msgstr "Potência de Transmissão"
++
++msgid "Transmitter Antenna"
++msgstr "Antena de Transmissão"
++
++msgid "Trigger"
++msgstr "Disparo"
++
++msgid "Trigger Mode"
++msgstr "Modo de disparo"
++
++msgid "Tunnel ID"
++msgstr "Identificador do Túnel"
++
++msgid "Tunnel Interface"
++msgstr "Interface de Tunelamento"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Modo Turbo"
++
++msgid "Tx-Power"
++msgstr "Potência de transmissão"
++
++msgid "Type"
++msgstr "Tipo"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "UMTS somente"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "Dispositivo USB"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr "Não é possível a expedição"
++
++msgid "Unknown"
++msgstr "Desconhecido"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Erro Desconhecido, a senha não foi alterada!"
++
++msgid "Unmanaged"
++msgstr "Não gerenciado"
++
++msgid "Unsaved Changes"
++msgstr "Alterações Não Salvas"
++
++msgid "Unsupported protocol type."
++msgstr "Tipo de protocolo não suportado."
++
++msgid "Update lists"
++msgstr "Atualizar listas"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"Envia uma imagem compatível do sistema para substituir o firmware em "
++"execução. Marque \"Manter configurações\" para manter as configurações "
++"atuais (requer uma imagem OpenWrt compatível)."
++
++msgid "Upload archive..."
++msgstr "Enviar arquivo..."
++
++msgid "Uploaded File"
++msgstr "Arquivo Carregado"
++
++msgid "Uptime"
++msgstr "Tempo de atividade"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Usar <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr "Use o roteador do DHCP"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "Use os servidores DNS anunciados pelo parceiro"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "Usar códigos de países ISO/IEC 3166 alpha2."
++
++msgid "Use MTU on tunnel interface"
++msgstr "Use MTU na interface do túnel"
++
++msgid "Use TTL on tunnel interface"
++msgstr "Use TTL na interface do túnel"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "Use a marcação de broadcast"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "Use servidores DNS personalizados"
++
++msgid "Use default gateway"
++msgstr "Use o roteador padrão"
++
++msgid "Use gateway metric"
++msgstr "Use a métrica do roteador"
++
++msgid "Use routing table"
++msgstr "Use a tabela de roteamento"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"Use o botão <em>Adicionar</em> para adicionar uma nova entrada de "
++"atribuição. O endereço <em>MAC-Address</em> identifica o equipamento, o "
++"endereço <em>IPv4</em> especifica o endereço fixo para usar e o <em>nome do "
++"equipamento</em> é designado como nome simbólico (DNS) para o equipamento "
++"requisitante."
++
++msgid "Used"
++msgstr "Usado"
++
++msgid "Used Key Slot"
++msgstr "Posição da Chave Usada"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Usuário"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "Interface VLAN"
++
++msgid "VLANs on %q"
++msgstr "VLANs em %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLANs em %q (%s)"
++
++msgid "VPN Server"
++msgstr "Servidor VPN"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr "Classe do fabricante para enviar quando requisitar o DHCP"
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr "Verificar"
++
++msgid "Version"
++msgstr "Versão"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "WEP Sistema Aberto"
++
++msgid "WEP Shared Key"
++msgstr "WEP Chave Compartilhada"
++
++msgid "WEP passphrase"
++msgstr "WEP Senha"
++
++msgid "WMM Mode"
++msgstr "Modo WMM"
++
++msgid "WPA passphrase"
++msgstr "WPA Senha"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 ""
++
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Atenção"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr "Rede sem fio"
++
++msgid "Wireless Adapter"
++msgstr "Dispositivo de Rede sem Fio"
++
++msgid "Wireless Network"
++msgstr "Rede sem Fio"
++
++msgid "Wireless Overview"
++msgstr "Visão Geral da Rede sem Fio"
++
++msgid "Wireless Security"
++msgstr "Segurança da Rede sem Fio"
++
++msgid "Wireless is disabled or not associated"
++msgstr "Rede sem fio está desabilitada ou não conectada"
++
++msgid "Wireless is restarting..."
++msgstr "A rede sem fio está reiniciando..."
++
++msgid "Wireless network is disabled"
++msgstr "A rede sem fio está desabilitada"
++
++msgid "Wireless network is enabled"
++msgstr "A rede sem fio está habilitada"
++
++msgid "Wireless restarted"
++msgstr "A rede sem fio reiniciou"
++
++msgid "Wireless shut down"
++msgstr "Rede sem fio desligada"
++
++msgid "Write received DNS requests to syslog"
++msgstr "Escreva as requisições DNS para o servidor de registro (syslog)"
++
++msgid "XR Support"
++msgstr "Suporte a XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Neste local, você pode ativar ou desativar os scripts de iniciação "
++"instalados. As mudanças serão aplicadas após a reiniciação do equipamento."
++"<br /><strong>Aviso: Se você desativar algum script de iniciação essencial "
++"como por exemplo \"rede/network\", o dispositivo poderá tornar-se "
++"inacessível!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Você precisa habilitar o JavaScript no seu navegador ou o LuCI não irá "
++"funcionar corretamente."
++
++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 ""
++
++msgid "any"
++msgstr "qualquer"
++
++msgid "auto"
++msgstr "automático"
++
++#, fuzzy
++msgid "automatic"
++msgstr "estático"
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "em ponte"
++
++msgid "create:"
++msgstr "criar"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "cria uma ponte sobre determinada(s) interface(s)"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "desativar"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "expirado"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"Arquivo onde as alocações <abbr title=\"Protocolo de Configuração Dinâmica "
++"de Hosts\">DHCP</abbr> são armazenadas"
++
++msgid "forward"
++msgstr "encaminhar"
++
++msgid "full-duplex"
++msgstr "full-duplex"
++
++msgid "half-duplex"
++msgstr "half-duplex"
++
++msgid "help"
++msgstr "ajuda"
++
++msgid "hidden"
++msgstr "ocultar"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "se o destino for uma rede"
++
++msgid "input"
++msgstr "entrada"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++msgstr "kbit/s"
++
++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 ""
++
++msgid "navigation Navigation"
++msgstr ""
++
++# Is this yes/no or no like in no one?
++msgid "no"
++msgstr "não"
++
++msgid "no link"
++msgstr "sem link"
++
++msgid "none"
++msgstr "nenhum"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "desligado"
++
++msgid "on"
++msgstr "ligado"
++
++msgid "open"
++msgstr "aberto"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "roteado"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "etiquetado"
++
++msgid "unknown"
++msgstr "desconhecido"
++
++msgid "unlimited"
++msgstr "ilimitado"
++
++msgid "unspecified"
++msgstr "não especificado"
++
++msgid "unspecified -or- create:"
++msgstr "não especificado -ou- criar:"
++
++msgid "untagged"
++msgstr "não etiquetado"
++
++msgid "yes"
++msgstr "sim"
++
++msgid "« Back"
++msgstr "« Voltar"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "Ativar a negociação de IPv6 no enlace PPP"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "Ignorar arquivos de equipamentos conhecidos (hosts)"
++
++#~ msgid "Path"
++#~ msgstr "Directório"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Por favor aguarde: Equipamento reiniciando..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Aviso: Existem alterações não salvas que serão perdidas durante a "
++#~ "reiniciação!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Sempre use canais 40MHz mesmo se o canal secundário estiver sobreposto. "
++#~ "Usando esta opção, você não estará de acordo com a norma IEEE "
++#~ "802.11n-2009!"
++
++#~ msgid "Cached"
++#~ msgstr "Cached"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr ""
++#~ "Configura esta montagem como um armazenamento sobreposto para o bloco-"
++#~ "extroot"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "Forçar modo 40MHz"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Salto de Frequência"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "Travado para o canal %d usado por %s"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "Usar como sistema de arquivos raiz"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "Identificador do usuário HE.net"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr ""
++#~ "Este é o identificador do usuário de 32 bytes codificado em hexadecimal, "
++#~ "não o nome do usuário"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz, 2º canal acima"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz, 2º canal abaixo"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Aceita anúncios de roteador"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Anuncie IPv6 na rede"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "Identificador da rede anunciado"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "Faixa permitida de 1 a 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "Capacidade de HT"
++
++#~ msgid "HT mode"
++#~ msgstr "Modo HT"
++
++#~ msgid "Router Model"
++#~ msgstr "Modelo do Roteador"
++
++#~ msgid "Router Name"
++#~ msgstr "Nome do Roteador"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "Enviar solicitações de roteador"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr ""
++#~ "Especifica o tempo de vida, em segundos, do prefixo preferencial anunciado"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr ""
++#~ "Especifica o tempo de vida, em segundos, do prefixo válido anunciado"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "Use o tempo de vida preferencial"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "Use o tempo de vida válido"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Esperando pelo roteador..."
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "Ativar o servidor NTP embutido"
++
++#~ msgid "Active Leases"
++#~ msgstr "Atribuições Ativas"
++
++#~ msgid "Open"
++#~ msgstr "Abrir"
++
++#~ msgid "Bit Rate"
++#~ msgstr "Taxa de Bits"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "Configuração / Aplicar"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "Configuração / Mudanças"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "Configuração / Reverter"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MAC Address"
++#~ msgstr "Endereço Físico (MAC)"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Encriptado\">Encr.</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "<abbr title=\"Rede Local Sem FIo\">WLAN</abbr>-Pesquisa"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "Escolha a rede que você quer associar com esta interface de rede sem fio. "
++#~ "Selecione <em>não especificado</em> para não ligar a interface a qualquer "
++#~ "rede ou preencha o campo <em>criar</em> para definir uma nova rede."
++
++#~ msgid "Create Network"
++#~ msgstr "Criar Rede"
++
++#~ msgid "Link"
++#~ msgstr "Enlace"
++
++#~ msgid "Networks"
++#~ msgstr "Redes"
++
++#~ msgid "Power"
++#~ msgstr "Potência"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Redes Wifi no seu ambiente local"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "Notação <abbr title=\"Roteamento entre Domínios sem Classe\">CIDR</abbr>: "
++#~ "endereço/prefixo"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "Servidor <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr ""
++#~ "Broadcast <abbr title=\"Protocolo de Internet Versão 4\">IPv4</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "Endereço <abbr title=\"Protocolo de Internet Versão 6\">IPv6</abbr>"
++
++#~ msgid "IP-Aliases"
++#~ msgstr "Endereços IP alternativos"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "Configuração do IPv6"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "Nota: Se você escolher a interface aqui que é pertencente a outra rede, "
++#~ "ela será movida para esta rede."
++
++#~ msgid ""
++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might "
++#~ "lose access to this router if you are connected via this interface."
++#~ msgstr ""
++#~ "Você realmente deseja apagar esta interface? A operação não pode ser "
++#~ "revertida!\\nVocê pode perder acesso a este roteador se voc6e está "
++#~ "conectado através desta interface."
++
++#~ msgid ""
++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou "
++#~ "might lose access to this router if you are connected via this network."
++#~ msgstr ""
++#~ "Você realmente deseja apagar esta rede sem fio? A operação não pode ser "
++#~ "revertida!\\nVocê pode perder acesso a este roteador se voc6e está "
++#~ "conectado através desta interface."
++
++#~ msgid ""
++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router "
++#~ "if you are connected via this interface."
++#~ msgstr ""
++#~ "Você realmente deseja desligar a interface \"%s\"?\\nVocê pode perder "
++#~ "acesso a este roteador se voc6e está conectado através desta interface."
++
++#~ msgid ""
++#~ "Really shutdown network ?\\nYou might lose access to this router if you "
++#~ "are connected via this interface."
++#~ msgstr ""
++#~ "Você realmente deseja desligar a rede?\\nVocê pode perder acesso a este "
++#~ "roteador se voc6e está conectado através desta rede."
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "As portas de rede do seu router podem ser combinadas com diversas <abbr "
++#~ "title=\"Rede Local Virtual\">VLAN</abbr>s em que os computadores podem "
++#~ "comunicar diretamente entre si. As <abbr title=\"Rede Local Virtual"
++#~ "\">VLAN</abbr>s são frequentemente utilizadas para separar segmentos de "
++#~ "redes diferentes. Muitas vezes é padrão uma porta para o enlace superior "
++#~ "(Uplink) para a conexão com a próxima rede maior, como a Internet. As "
++#~ "outras portas são, por padrão, utilizadas para conectar uma rede local."
++
++#~ msgid "Enable buffering"
++#~ msgstr "Ativar bufferização"
++
++#~ msgid "IPv6-over-IPv4"
++#~ msgstr "IPv6-over-IPv4"
++
++#~ msgid "Custom Files"
++#~ msgstr "Arquivos Personalizados"
++
++#~ msgid "Custom files"
++#~ msgstr "Arquivos personalizados"
++
++#~ msgid "Detected Files"
++#~ msgstr "Arquivos Detectados"
++
++#~ msgid "Detected files"
++#~ msgstr "Arquivos detectados"
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Arquivos que devem ser mantidos quando gravar um novo firmware"
++
++#~ msgid "General"
++#~ msgstr "Geral"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Aqui você pode personalizar as configurações e funcionalidades do <abbr "
++#~ "title=\"Interface de configuração Lua\">LuCI</abbr>."
++
++#~ msgid "Post-commit actions"
++#~ msgstr "Ações após a gravação"
++
++#~ msgid ""
++#~ "The following files are detected by the system and will be kept "
++#~ "automatically during sysupgrade"
++#~ msgstr ""
++#~ "Os seguintes arquivos foram detectados pelo sistema e serão mantidos "
++#~ "automaticamente durante uma atualização do sistema"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Estes comandos são executados automaticamente quando uma determinada "
++#~ "configuração da <abbr title=\"Interface de configuração unificada\">UCI</"
++#~ "abbr> está gravada, permitindo mudanças a serem aplicadas "
++#~ "instantaneamente."
++
++#~ msgid ""
++#~ "This is a list of shell glob patterns for matching files and directories "
++#~ "to include during sysupgrade"
++#~ msgstr ""
++#~ "Esta é a lista dos padrões de expressão shell para casar com os arquivos "
++#~ "e diretórios incluídos durante a atualização do sistema"
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Interface Web"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "Servidor <abbr title=\"Protocolo de Tunelamento Ponto a Ponto\">PPTP</"
++#~ "abbr>"
++
++#~ msgid "AHCP Settings"
++#~ msgstr "Configurações AHCP"
++
++#~ msgid "ARP ping retries"
++#~ msgstr "Retentativa de ping ARP"
++
++#~ msgid "ATM Settings"
++#~ msgstr "Configurações ATM"
++
++#~ msgid "Accept Router Advertisements"
++#~ msgstr "Aceita anúncios de roteador"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Ponto de acesso (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Opções adicionais do pppd"
++
++#~ msgid "Allowed range is 1 to FFFF"
++#~ msgstr "A faixa permitida é de 1 a FFFF"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Desconexão automática"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Arquivo de Backup"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Configurar o servidor DNS local para usar o servidores de nomes "
++#~ "fornecidos pelo PPP"
++
++#~ msgid "Connect script"
++#~ msgstr "Script de conexão"
++
++#~ msgid "Create backup"
++#~ msgstr "Criar backup"
++
++#~ msgid "Default"
++#~ msgstr "Padrão"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Script de desconexão"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Editar listas de pacotes e destinos da instalação"
++
++#~ msgid "Enable 4K VLANs"
++#~ msgstr "Ativar VLANs 4K"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Ativar IPv6 na conexão PPP"
++
++#~ msgid "Firmware image"
++#~ msgstr "Imagem de Firmware"
++
++#~ msgid "Forward DHCP"
++#~ msgstr "Encaminhar DHCP"
++
++#~ msgid "Forward broadcasts"
++#~ msgstr "Encaminhar broadcast"
++
++#~ msgid "HE.net Tunnel ID"
++#~ msgstr "HE.net Tunnel ID"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Aqui você pode fazer o backup e restaurar as configurações do router. "
++#~ "Também pode retornar o router para as configurações padrão."
++
++#~ msgid "Installation targets"
++#~ msgstr "Destinos da Instalação"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Manter arquivos de configuração"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Manter conectada"
++
++#~ msgid "Kernel"
++#~ msgstr "Kernel"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Permitir o pppd substituir a rota padrão atual e usar a interface PPP "
++#~ "como padrão após a conexão ser efeuada com sucesso"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr ""
++#~ "Deixar o pppd executar este script após o estabelecimento do enlace PPP"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "Deixar o pppd executar este script antes de terminar o enlace PPP"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Certifique-se que forneceu o código PIN correcto aqui, ou pode bloquear o "
++#~ "seu cartão SIM!"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "A maioria deles são servidores de rede, que oferecem um determinado "
++#~ "serviço para seu equipamento ou rede como acesso shell, servindo páginas "
++#~ "web como o <abbr title=\"Interface de configuração Lua\">LuCI</abbr>, "
++#~ "fazendo roteamento, enviando e-mails, ..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr ""
++#~ "Número de testes de conexão falhadas para iniciar a reconexão automática"
++
++#~ msgid "Override Gateway"
++#~ msgstr "Sobrescrever Gateway"
++
++#~ msgid "PIN code"
++#~ msgstr "Código PIN"
++
++#~ msgid "PPP Settings"
++#~ msgstr "Configurações do PPP"
++
++#~ msgid "Package lists"
++#~ msgstr "Listas de pacotes"
++
++#~ msgid ""
++#~ "Port <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> specify the default "
++#~ "VLAN ID added to received untagged frames."
++#~ msgstr ""
++#~ "O <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> da porta especifica o ID "
++#~ "padrão da VLAN adicionado a quadros sem etiquetas."
++
++#~ msgid "Port PVIDs on %q"
++#~ msgstr "PVIDs da Porta em %q"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr "Proceder com a restauração das configurações padrão do firmware?"
++
++#~ msgid "Processor"
++#~ msgstr "Processador"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Porta RADIUS"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Servidor RADIUS"
++
++#~ msgid "Relay Settings"
++#~ msgstr "Configuração de Relay"
++
++#~ msgid "Replace default route"
++#~ msgstr "Substituir a rota padrão"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Restaurar as configurações para o padrão"
++
++#~ msgid "Routing table ID"
++#~ msgstr "ID da tabela de roteamento"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr ""
++#~ "Segundos de espera para o modem ficar pronto antes de tentar uma conexão"
++
++#~ msgid "Send Router Solicitiations"
++#~ msgstr "Enviar Solicitações de Roteador"
++
++#~ msgid "Server IPv4-Address"
++#~ msgstr "Endereço IPv4 do Servidor"
++
++#~ msgid "Service type"
++#~ msgstr "Tipo de serviço"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr "Serviços executam diversas tarefas no seu equipamento."
++
++#~ msgid "Settings"
++#~ msgstr "Configurações"
++
++#~ msgid "Setup wait time"
++#~ msgstr "Configurar tempo de espera"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Lamentamos, mas o OpenWrt não suporta uma atualização do sistema para "
++#~ "esta plataforma.<br /> É necessário gravar manualmente seu equipamento."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr ""
++#~ "Especifique os argumentos adicionais de linha de comando para o pppd aqui"
++
++#~ msgid "TTL"
++#~ msgstr "TTL"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "O caminho do dispositivo do seu modem, ex. /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr "Tempo (em segundos) para fim de uma conexão já não utilizada"
++
++#~ msgid "Time Server (rdate)"
++#~ msgstr "Servidor de Hora (rdate)"
++
++#~ msgid "Tunnel Settings"
++#~ msgstr "Configurações de Tunelamento"
++
++#~ msgid "Update package lists"
++#~ msgstr "Atualizar listas de pacotes"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "Carregar uma imagem OpenWrt para a gravar no roteador."
++
++#~ msgid "Upload image"
++#~ msgstr "Carregar imagem"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "Utilizar DNS do parceiro"
++
++#~ msgid "VLAN %d"
++#~ msgstr "VLAN %d"
++
++#~ msgid ""
++#~ "You can specify multiple DNS servers here, press enter to add a new "
++#~ "entry. Servers entered here will override automatically assigned ones."
++#~ msgstr ""
++#~ "Você pode especificar aqui múltiplos servidores DNS. Pressione \"enter\" "
++#~ "para adicionar uma nova entrada. Os servidores informados aqui "
++#~ "sobrescreverão automaticamente os designados."
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Você precisa instalar os pacotes \"comgt\" para usar UMTS/GPRS, \"ppp-mod-"
++#~ "pppoe\" para PPPoE, \"ppp-mod-pppoa\" para PPPoA ou \"pptp\" para o "
++#~ "suporte PPtP"
++
++#~ msgid "back"
++#~ msgstr "voltar"
++
++#~ msgid "buffered"
++#~ msgstr "em buffer"
++
++#~ msgid "cached"
++#~ msgstr "em cache"
++
++#~ msgid "free"
++#~ msgstr "livre"
++
++#~ msgid "static"
++#~ msgstr "estático"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Interface de configuração Lua\">LuCI</abbr> é uma colecção "
++#~ "gratuita de programas Lua incluindo um Framework Web <abbr title=\"Modelo-"
++#~ "Visualização-Controle\">MVC</abbr> e uma Interface Web para micro-"
++#~ "dispositivos. <abbr title=\"Interface de configuração Lua\">LuCI</abbr> é "
++#~ "licenciado sob a Licença Apache."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "Chaves-<abbr title=\"Shell Seguro\">SSH</abbr>"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "Um servidor web HTTP/1.1 ligeiro escrito em C e desenvolvido em Lua para "
++#~ "servir LuCI"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Um pequeno servidor web que pode ser utilizado para servir a interface "
++#~ "<abbr title=\"Interface de configuração Lua\">LuCI</abbr>."
++
++#~ msgid "About"
++#~ msgstr "Sobre"
++
++#~ msgid "Addresses"
++#~ msgstr "Endereços"
++
++#~ msgid "Admin Password"
++#~ msgstr "Password do Administrador"
++
++#~ msgid "Alias"
++#~ msgstr "Configuração IP alternativa"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Ãrea de autenticação"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Porta do interface em ponte"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr ""
++#~ "Altera a senha do administrador do sistema (Login <code>root</code>)"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Cliente (WDS)"
++
++#~ msgid "Configuration file"
++#~ msgstr "Ficheiro de configuração"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Esgotado o tempo de ligação"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Programadores Contribuintes"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "DHCP atribuido"
++
++#~ msgid "Document root"
++#~ msgstr "Diretório raiz"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Activar keep-alive"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "Ponte Ethernet"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "Aqui pode colar suas Chaves-<abbr title=\"Shell Seguro\">SSH</abbr> "
++#~ "públicas (uma por linha) para a autenticação <abbr title=\"Shell Seguro"
++#~ "\">SSH</abbr> por chave-pública."
++
++#~ msgid "ID"
++#~ msgstr "Identificação de interface em ponte"
++
++#~ msgid "IP Configuration"
++#~ msgstr "Configuração IP"
++
++#~ msgid "Interface Status"
++#~ msgstr ""
++#~ "Aqui encontra informações sobre o estado actual do sistema, como <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr>, frequência do relógio, uso "
++#~ "de memória ou uso da interface de rede de dados."
++
++#~ msgid "Lead Development"
++#~ msgstr "Equipa de Desenvolvimento"
++
++#~ msgid "Master"
++#~ msgstr "AP"
++
++#~ msgid "Master + WDS"
++#~ msgstr "AP+WDS"
++
++#~ msgid "Not configured"
++#~ msgstr "Não configurado"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Senha alterada com sucesso"
++
++#~ msgid "Plugin path"
++#~ msgstr "Directorio de plugins"
++
++#~ msgid "Ports"
++#~ msgstr "Portas"
++
++#~ msgid "Primary"
++#~ msgstr "Primário"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Página do Projecto"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "Ahdemo"
++
++#~ msgid "STP"
++#~ msgstr "STP"
++
++#~ msgid "Thanks To"
++#~ msgstr "Obrigado a"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr ""
++#~ "A área de autenticação (realm) que será mostrada na prompt de "
++#~ "autenticação das páginas protegidas."
++
++#~ msgid "Unknown Error"
++#~ msgstr "Erro Desconhecido"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "padrão é <code>/etc/httpd.conf</code>"
++
++#~ msgid "Package lists updated"
++#~ msgstr "As listas de pacotes foram actualizadas"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Actualizar os pacotes instalados"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "Também os arquivos de logs do kernel ou dos serviços podem ser "
++#~ "consultados aqui para obter uma visão geral sobre o seu estado actual."
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "Aqui você pode encontrar informações sobre o estado actual do sistema, "
++#~ "tais como <abbr title=\"Central Processing Unit\">CPU</abbr>, frequência "
++#~ "do relógio, uso de memória ou da interface de rede de dados."
++
++#~ msgid "Search file..."
++#~ msgstr "Procurar ficheiro..."
++
++# "free as in freedom" equivale a "livre de liberdade" não de "grátis"
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "O <abbr title=\"Interface de configuração Lua\">LuCI</abbr> é um "
++#~ "interface gráfico livre, flexível e fácil de utilizar para configurar o "
++#~ "OpenWrt Kamikaze."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "E agora divirta-se com o seu router!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "Agradecemos os seus comentários e sugestões por forma a podermos "
++#~ "continuar a melhorar este interface."
++
++#~ msgid "Hello!"
++#~ msgstr "Olá!"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Aviso: No <abbr title=\"Interface de configuração Lua\">LuCI</abbr> as "
++#~ "alterações devem ser confirmadas clicando em Alterações - Salvar &amp; "
++#~ "Aplicar antes de serem aplicadas."
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "Nas próximas páginas, pode ajustar todas as definições importantes do seu "
++#~ "router."
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr ""
++#~ "A equipa do <abbr title=\"Interface de configuração Lua\">LuCI</abbr>"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Esta é a área de administração do <abbr title=\"Interface de configuração "
++#~ "Lua\">LuCI</abbr>."
++
++#~ msgid "User Interface"
++#~ msgstr "Interface do Utilizador"
++
++#~ msgid "enable"
++#~ msgstr "activar"
++
++#, fuzzy
++#~ msgid "(optional)"
++#~ msgstr " (opcional)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "Porta do <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "Servidor <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr> será "
++#~ "consultado na ordem do arquivo resolv.conf"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr ""
++#~ "<abbr title=\"máximo\">max.</abbr> de <abbr title=\"Protocolo de "
++#~ "Configuração Dinâmica de Hosts\">DHCP</abbr>-Leases"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Extension Mechanisms "
++#~ "for Domain Name System\">EDNS0</abbr> packet size"
++#~ msgstr ""
++#~ "tamanho <abbr title=\"máximo\">max.</abbr> do pacote <abbr title="
++#~ "\"Mecanismos de Extensão do Sistema de Nomes de Domínios\">EDNS0</abbr>"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "Isolamento do AP"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "Adicione a rede Wifi à rede física"
++
++#~ msgid "Aliases"
++#~ msgstr "Aliases"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Clamp Segment Size"
++
++#, fuzzy
++#~ msgid "Create Or Attach Network"
++#~ msgstr "Criar Rede"
++
++#~ msgid "Devices"
++#~ msgstr "Dispositivos"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "Não encaminhar as pesquisas reversas para redes locais"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "Activar servidor TFTP"
++
++#~ msgid "Errors"
++#~ msgstr "Erros"
++
++#~ msgid "Essentials"
++#~ msgstr "Básico"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Expandir Hosts"
++
++#~ msgid "First leased address"
++#~ msgstr "Primeiro endereço de atribuição"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Resolve problemas com websites indisponíveis, submissão de formulários ou "
++#~ "comportamentos inesperados de alguns ISP's."
++
++#~ msgid "Hardware Address"
++#~ msgstr "Endereço do Hardware"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "Aqui pode configurar os dispositivos wifi instalados. "
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "Independente (Ad-Hoc)"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Ligação Internet"
++
++#~ msgid "Join (Client)"
++#~ msgstr "Cliente (Client)"
++
++#~ msgid "Leases"
++#~ msgstr "Atribuições"
++
++#~ msgid "Local Domain"
++#~ msgstr "Domínio Local"
++
++#~ msgid "Local Network"
++#~ msgstr "Rede Local"
++
++#~ msgid "Local Server"
++#~ msgstr "Servidor Local"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "Imagem para o boot remoto (PXE)"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr ""
++#~ "Nome da Rede (<abbr title=\"Identificador de Conjunto de Serviços "
++#~ "Estendidos\">ESSID</abbr>)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "Número de endereços atribuidos"
++
++#~ msgid "Perform Actions"
++#~ msgstr "Executar Acções"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "Impede a comunicação de Cliente para Cliente"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "Ponto de Acesso (Access Point)"
++
++#~ msgid "Resolvfile"
++#~ msgstr "Ficheiro resolv.conf"
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "Directório raiz do servidor TFTP"
++
++#~ msgid "TX / RX"
++#~ msgstr "TX / RX"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "Foram aplicadas as seguintes alterações "
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "Quando gravar um novo firmware com o <abbr title=\"Interface de "
++#~ "configuração Lua\">LuCI</abbr> estes arquivos serão adicionados ao novo "
++#~ "firmware instalado."
++
++#, fuzzy
++#~ msgid "Wireless Scan"
++#~ msgstr "Wireless"
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "Com o <abbr title=\"Protocolo de Configuração Dinâmica de Hosts\">DHCP</"
++#~ "abbr> os membros da rede podem automaticamente receber as suas "
++#~ "configurações de rede (endereço-<abbr title=\"Protocolo de Internet\">IP</"
++#~ "abbr>, netmask, servidor-<abbr title=\"Sistema de Nomes de Domínios"
++#~ "\">DNS</abbr>, ...)."
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "Pode servir várias redes wifi com o mesmo dispositivo. Esteja ciente de "
++#~ "que existem certas restrições específicas do hardware e do controlador. "
++#~ "Pode normalmente operar 1 rede Ad-Hoc ou até 3 redes AP e 1 Cliente "
++#~ "simultaneamente."
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "Precisa de instalar os pacotes \"ppp-mod-pppoe\" para PPPoE ou \"pptp\" "
++#~ "para o suporte PPtP"
++
++#~ msgid "Zone"
++#~ msgstr "Zona"
++
++#~ msgid "additional hostfile"
++#~ msgstr "ficheiro de hosts adicional"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr ""
++#~ "Adiciona os nomes dos domínios às entradas de hosts no arquivo resolv.conf"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "ligação automática"
++
++#~ msgid "concurrent queries"
++#~ msgstr "Consultas simultâneas"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr ""
++#~ "desabilitar <abbr title=\"Protocolo de Configuração Dinâmica de Hosts"
++#~ "\">DHCP</abbr> para esta interface"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "desligar quando ocioso por"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "Não fazer cache de desconhecidos"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr ""
++#~ "Filtro de consultas inuteis-<abbr title=\"Sistema de Nomes de Domínios"
++#~ "\">DNS</abbr> de sistemas windows"
++
++#~ msgid "installed"
++#~ msgstr "instalado"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "Localizar o hostname dependendo de sua sub-rede"
++
++#~ msgid "not installed"
++#~ msgstr "não instalado"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr ""
++#~ "Impede o cache de respostas-<abbr title=\"Sistema de Nomes de Domínios"
++#~ "\">DNS</abbr> negativas"
++
++#~ msgid "query port"
++#~ msgstr "porta para consultas"
++
++#~ msgid "transmitted / received"
++#~ msgstr "transmitido / recebido"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "redes contidas"
++
++#~ msgid "all"
++#~ msgstr "todos"
++
++#~ msgid "Code"
++#~ msgstr "Código"
++
++#~ msgid "Distance"
++#~ msgstr "Distância"
++
++#~ msgid "Legend"
++#~ msgstr "Legenda"
++
++#~ msgid "Library"
++#~ msgstr "Biblioteca"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "veja sobre &#39;%s&#39; na página de manual (man)"
++
++#~ msgid "Package Manager"
++#~ msgstr "Gestor de Pacotes"
++
++#~ msgid "Service"
++#~ msgstr "Serviço"
++
++#~ msgid "Statistics"
++#~ msgstr "Estatísticas"
++
++#~ msgid "zone"
++#~ msgstr "Zona"
+diff --git a/feeds/luci/modules/luci-base/po/pt/base.po b/feeds/luci/modules/luci-base/po/pt/base.po
+new file mode 100644
+index 0000000..35cd986
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/pt/base.po
+@@ -0,0 +1,4136 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2013-09-22 18:50+0200\n"
++"Last-Translator: Low <pedroloureiro1@sapo.pt>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(janela de %d minutos, intervalo de %d segundos)"
++
++msgid "(%s available)"
++msgstr "(%s disponível)"
++
++msgid "(empty)"
++msgstr "(vazio)"
++
++msgid "(no interfaces attached)"
++msgstr "(não existem interfaces ligadas)"
++
++msgid "-- Additional Field --"
++msgstr "-- Campo Adicional --"
++
++msgid "-- Please choose --"
++msgstr "-- Por favor escolha --"
++
++msgid "-- custom --"
++msgstr "-- personalizado --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Carga de 1 Minuto:"
++
++msgid "15 Minute Load:"
++msgstr "Carga de 15 minutos:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Carga 5 Minutos:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr ""
++"<abbr title=\"Identificador de Conjunto Básico de Serviços\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr ""
++"Porta de consulta de <abbr title=\"Servidor de Nomes de Domínio\">DNS</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr ""
++"Porta do servidor<abbr title=\"Servidor de Nomes de Domínio\">DNS</abbr>"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"Os servidores de <abbr title=\"Servidor de Nomes de Domínio\">DNS</abbr> "
++"serão consultados pela ordem no ficheiro resolv"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++"<abbr title=\"Identificador de Conjunto de Serviços Estendidos\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "Endereço <abbr title=\"Protocolo de Internet Versão 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "Gateway <abbr title=\"Protocolo de Internet Versão 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr ""
++"Máscara de rede <abbr title=\"Protocolo de Internet Versão 4\">IPv4</abbr>"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Protocolo de Internet Versão 6\">IPv6</abbr>-Endereço ou Rede "
++"(CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "Gateway <abbr title=\"Protocolo de Internet Versão 6\">IPv6</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "Configuração do <abbr title=\"Diodo Emissor de Luz\">LED</abbr>"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "Nome da <abbr title=\"Diodo Emissor de Luz\">LED</abbr>"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "Endereço <abbr title=\"Controle de Acesso ao Meio\">MAC</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"<abbr title=\"Máximo\">Max.</abbr> de concessões<abbr title=\"Protocolo de "
++"Configuracao Dinamica de Hosts\">DHCP</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"Tamanho <abbr title=\"Máximo\">Max.</abbr> do pacote <abbr title="
++"\"Mecanismos de Extensão para Sistemas de Nomes de Domínio\">EDNS0</abbr> "
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"máximo\">Max.</abbr> consultas concorrentes"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Emparelhada: %s / Grupo: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "Suporte AR"
++
++msgid "ARP retry threshold"
++msgstr "Limiar de tentativas ARP"
++
++msgid "ATM Bridges"
++msgstr "Bridges ATM"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "Identificador Canais Virtuais ATM (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "Identificador de Caminho Virtual ATM (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"As bridges ATM expõem o encapsulamento ethernet em ligações AAL5 como uma "
++"interface de Rede Virtual Linux que pode ser usada em conjugação com o DHCP "
++"ou PPP para marcar para a rede ISP."
++
++msgid "ATM device number"
++msgstr "Número de Dispositivo ATM"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Concentrador de Acesso"
++
++msgid "Access Point"
++msgstr "Access Point (AP)"
++
++msgid "Action"
++msgstr "Acção"
++
++msgid "Actions"
++msgstr "Acções"
++
++msgid "Activate this network"
++msgstr "Ativar esta rede"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++"Rotas-<abbr title=\"Protocolo de Internet Versão 4\">IPv4</abbr> ativas"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++"Rotas-<abbr title=\"Protocolo de Internet Versão 6\">IPv6</abbr> ativas"
++
++msgid "Active Connections"
++msgstr "Ligações Ativas"
++
++msgid "Active DHCP Leases"
++msgstr "Concessões DHCP Ativas"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Concessões DHCPv6 Ativas"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Adicionar"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++"Adicionar um sufixo de domínio local aos nomes servidos dos ficheiros de "
++"hosts"
++
++msgid "Add new interface..."
++msgstr "Adicionar uma nova interface..."
++
++msgid "Additional Hosts files"
++msgstr "Ficheiro Adicional de Hosts"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Endereço"
++
++msgid "Address to access local relay bridge"
++msgstr ""
++
++msgid "Administration"
++msgstr "Administração"
++
++msgid "Advanced Settings"
++msgstr "Definições Avançadas"
++
++msgid "Alert"
++msgstr "Alerta"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"Permitir autenticação <abbr title=\"Shell Seguro\">SSH</abbr> por senha"
++
++msgid "Allow all except listed"
++msgstr "Permitir todos, excepto os listados"
++
++msgid "Allow listed only"
++msgstr "Permitir somente os listados"
++
++msgid "Allow localhost"
++msgstr "Permitir localhost"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"Permitir que hosts remotos se conectem às portas encaminhadas do SSH local"
++
++msgid "Allow root logins with password"
++msgstr "Permitir o login como root só com password"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "Permitir que o utilizador <em>root</em> faça login só com password"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr ""
++"Permitir respostas a montante na gama 127.0.0.1/8, p.e. para serviços RBL"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "Uma rede adicional será criada se deixar isto desmarcado."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antena 1"
++
++msgid "Antenna 2"
++msgstr "Antena 2"
++
++msgid "Antenna Configuration"
++msgstr "Configuração das Antenas"
++
++msgid "Any zone"
++msgstr "Qualquer zona"
++
++msgid "Apply"
++msgstr "Aplicar"
++
++msgid "Applying changes"
++msgstr "A aplicar as alterações"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Atribuir interfaces..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Estações Associadas"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Controlador Wireless Atheros 802.11%s"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Autenticação"
++
++msgid "Authoritative"
++msgstr "Autoritário"
++
++msgid "Authorization Required"
++msgstr "Autorização Requerida"
++
++msgid "Auto Refresh"
++msgstr "Actualização Automática"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Disponível"
++
++msgid "Available packages"
++msgstr "Pacotes disponíveis"
++
++msgid "Average:"
++msgstr "Média:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Voltar"
++
++msgid "Back to Overview"
++msgstr "Voltar à Visão Global"
++
++msgid "Back to configuration"
++msgstr "Voltar à configuração"
++
++msgid "Back to overview"
++msgstr "Voltar à vista global"
++
++msgid "Back to scan results"
++msgstr "Voltar aos resultados do scan"
++
++msgid "Background Scan"
++msgstr "Procurar em Segundo Plano"
++
++msgid "Backup / Flash Firmware"
++msgstr "Backup / Flashar Firmware"
++
++msgid "Backup / Restore"
++msgstr "Backup / Restauração"
++
++msgid "Backup file list"
++msgstr "Lista de ficheiros para backup"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"Abaixo está a lista de ficheiros para backup. Este consiste nos ficheiros de "
++"configuração alterados e marcados pelo opkg, ficheiros base essenciais e "
++"padrões de backup definidos pelo utilizador."
++
++msgid "Bitrate"
++msgstr "Taxa de bits"
++
++msgid "Bogus NX Domain Override"
++msgstr ""
++
++msgid "Bridge"
++msgstr "Bridge"
++
++msgid "Bridge interfaces"
++msgstr "Ativar brigde nas interfaces"
++
++msgid "Bridge unit number"
++msgstr "Número de unidade da bridge"
++
++msgid "Bring up on boot"
++msgstr "Levantar no arranque"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Controlador Wireless Broadcom 802.11%s"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Controlador Wireless Broadcom BCM%04x 802.11"
++
++msgid "Buffered"
++msgstr ""
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Botões"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "Uso da CPU (%)"
++
++msgid "Cancel"
++msgstr "Cancelar"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Cadeia"
++
++msgid "Changes"
++msgstr "Alterações"
++
++msgid "Changes applied."
++msgstr "Alterações aplicadas."
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "Altera a password de administrador para acesso ao dispositivo"
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check"
++msgstr "Verificar"
++
++msgid "Checksum"
++msgstr "Checksum"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Escolha a zona de firewall que pretende associar a esta interface. Escolha "
++"<em>não especificado</em> para remover a interface da zona associada ou "
++"coloque em branco o campo <em>criar</em> para definir a nova zona e ligar-"
++"lhe a interface."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Escolha a rede(s) à(s) qual(is) deseja ligar esta interface wireless ou "
++"preencha o campo <em>criar</em> para definir a nova rede."
++
++msgid "Cipher"
++msgstr "Cifra"
++
++msgid ""
++"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)."
++msgstr ""
++"Clique em \"Gerar arquivo\" para descarregar o ficheiro tar com os actuais "
++"ficheiros de configuração. Para voltar as definições originais do firmware, "
++"clique \" Fazer reset\" (só possível com imagens squashfs)"
++
++msgid "Client"
++msgstr "Cliente"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "ID de cliente a enviar para pedidos de DHCP"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Fechar ligação inativa após um dado tempo em segundos, usando 0 a ligação é "
++"persistente"
++
++msgid "Close list..."
++msgstr "Fechar lista..."
++
++msgid "Collecting data..."
++msgstr "A obter dados..."
++
++msgid "Command"
++msgstr "Comando"
++
++msgid "Common Configuration"
++msgstr "Configuração comum"
++
++msgid "Compression"
++msgstr "Compressão"
++
++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 "Confirmation"
++msgstr "Confirmação"
++
++msgid "Connect"
++msgstr "Ligar"
++
++msgid "Connected"
++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 "Country"
++msgstr "País"
++
++msgid "Country Code"
++msgstr "Código do País"
++
++msgid "Cover the following interface"
++msgstr "Abranger a seguinte interface"
++
++msgid "Cover the following interfaces"
++msgstr "Abranger as seguintes interfaces"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Criar / Atribuir a uma zona de firewall"
++
++msgid "Create Interface"
++msgstr "Criar interface"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Criar uma bridge entre múltiplas interfaces "
++
++msgid "Critical"
++msgstr "Critico"
++
++msgid "Cron Log Level"
++msgstr "Nível de Log do Cron"
++
++msgid "Custom Interface"
++msgstr "Interface Personalizada"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Customiza o comportamento dos <abbr title=\"Diodo Emissor de Luz\">LED</"
++"abbr>s, se possível."
++
++msgid "DHCP Leases"
++msgstr "Concessões DHCP"
++
++msgid "DHCP Server"
++msgstr "Servidor DHCP"
++
++msgid "DHCP and DNS"
++msgstr "DHCP e DNS"
++
++msgid "DHCP client"
++msgstr "Cliente DHCP"
++
++msgid "DHCP-Options"
++msgstr "Opções DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr "Concessões DHCPv6"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "Encaminhamentos DNS"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Depurar"
++
++msgid "Default %d"
++msgstr ""
++
++msgid "Default gateway"
++msgstr "Gateway predefinido"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Estado predefinido"
++
++msgid "Define a name for this network."
++msgstr "Definir um nome para esta rede."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Definir opções adicionais de DHCP, por exemplo "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" informa os clientes de diferentes "
++"servidores DNS."
++
++msgid "Delete"
++msgstr "Apagar"
++
++msgid "Delete this interface"
++msgstr "Apagar esta interface"
++
++msgid "Delete this network"
++msgstr "Apagar esta rede"
++
++msgid "Description"
++msgstr "Descrição"
++
++msgid "Design"
++msgstr "Tema"
++
++msgid "Destination"
++msgstr "Destino"
++
++msgid "Device"
++msgstr "Dispositivo"
++
++msgid "Device Configuration"
++msgstr "Configuração do Dispositivo"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnósticos"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Directório"
++
++msgid "Disable"
++msgstr "Desativar"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Desativar <abbr title=\"Protocolo Configuração Dinâmica de Hosts\">DHCP</"
++"abbr> para esta interface."
++
++msgid "Disable DNS setup"
++msgstr "Desativar configuração de DNS"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Desativar temporizador de HW-Beacon"
++
++msgid "Disabled"
++msgstr "Desativado"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Descartar respostas RFC1918 a montante"
++
++msgid "Displaying only packages containing"
++msgstr "Mostrar somente pacotes contendo"
++
++msgid "Distance Optimization"
++msgstr "Optimização de Distância"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Distância para o último host da rede em metros."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Diversidade"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq é um servidor combinado de <abbr title=\"Protocolo de Configuração "
++"Dinâmica de Hosts\">DHCP</abbr> e <abbr title=\"Sistema de Nomes de Domínios"
++"\">DNS</abbr> para firewalls <abbr title=\"Tradução de Endereço de Rede"
++"\">NAT</abbr>"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr ""
++"Não colocar em cache as respostas negativas, p.e. para dominios inexistentes"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr ""
++"Não encaminhar pedidos que não possam ser respondidos por servidor públicos "
++"de nomes"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr "Não encaminhar lookups reversos para as redes locais"
++
++msgid "Do not send probe responses"
++msgstr "Não enviar respostas a sondas"
++
++msgid "Domain required"
++msgstr "Requerer domínio"
++
++msgid "Domain whitelist"
++msgstr "Lista Branca do Dominio"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Não encaminhar consultas <abbr title=\"Sistema de Nomes de Domínios\">DNS</"
++"abbr> sem o nome do <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
++
++msgid "Download and install package"
++msgstr "Descarregar e instalar pacote"
++
++msgid "Download backup"
++msgstr "Descarregar backup"
++
++msgid "Dropbear Instance"
++msgstr "Instância do Dropbear"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear oferece um acesso shell seguro à rede <abbr title=\"Shell Seguro"
++"\">SSH</abbr> e um servidor <abbr title=\"Cópia Segura\">SCP</abbr> integrado"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"<abbr title=\"Protocolo de Configuração Dinâmica de Hosts\">DHCP</abbr> "
++"Dinâmico"
++
++msgid "Dynamic tunnel"
++msgstr "Túnel dinâmico"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"Alocar dinamicamente endereços DHCP para clientes. Se desativado, só os "
++"clientes com reservas estáticas serão servidos."
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "Metodo-EAP"
++
++msgid "Edit"
++msgstr "Editar"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Editar esta interface"
++
++msgid "Edit this network"
++msgstr "Editar esta rede"
++
++msgid "Emergency"
++msgstr "Emergência"
++
++msgid "Enable"
++msgstr "Ativar"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Ativar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "Ativar a atualização dinâmica de ponto final HE.net"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "Ativar a passagem de Jumbo Frames"
++
++msgid "Enable NTP client"
++msgstr "Ativar o cliente NTP"
++
++msgid "Enable TFTP server"
++msgstr "Ativar o servidor TFTP"
++
++msgid "Enable VLAN functionality"
++msgstr "Ativar a funcionalidade VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Ativar aprendizagem e envelhecimento"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "Ativar este mount"
++
++msgid "Enable this swap"
++msgstr "Ativar esta swap"
++
++msgid "Enable/Disable"
++msgstr "Ativar/Desativar"
++
++msgid "Enabled"
++msgstr "Ativado"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Ativa o Spanning Tree nesta bridge"
++
++msgid "Encapsulation mode"
++msgstr "Modo de encapsulamento"
++
++msgid "Encryption"
++msgstr "Encriptação"
++
++msgid "Erasing..."
++msgstr "A apagar..."
++
++msgid "Error"
++msgstr "Erro"
++
++msgid "Ethernet Adapter"
++msgstr "Adaptador Ethernet"
++
++msgid "Ethernet Switch"
++msgstr "Switch Ethernet"
++
++msgid "Expand hosts"
++msgstr "Expandir hosts"
++
++msgid "Expires"
++msgstr "Expira"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++"O tempo de caducidade dos endereços concessionados, minimo de 2 minutos "
++"(<code>2m</code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Servidor externo de logs de sistema"
++
++msgid "External system log server port"
++msgstr "Porta do Servidor externo de logs de sistema"
++
++msgid "Fast Frames"
++msgstr "Frames Rápidas"
++
++msgid "File"
++msgstr "Ficheiro"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Nome de ficheiro da imagem de boot a anunciar aos clientes"
++
++msgid "Filesystem"
++msgstr "Sistema de ficheiros"
++
++msgid "Filter"
++msgstr "Filtro"
++
++msgid "Filter private"
++msgstr "Filtrar endereços privados"
++
++msgid "Filter useless"
++msgstr "Filtro inútil"
++
++msgid "Find and join network"
++msgstr "Procurar e ligar rede"
++
++msgid "Find package"
++msgstr "Procurar pacote"
++
++msgid "Finish"
++msgstr "Terminar"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall Settings"
++msgstr "Definições da Firewall"
++
++msgid "Firewall Status"
++msgstr "Estado da Firewall"
++
++msgid "Firmware Version"
++msgstr "Versão do Firmware"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "Porta fixa de origem para saída das consultas DNS"
++
++msgid "Flags"
++msgstr "Flags"
++
++msgid "Flash Firmware"
++msgstr "Gravar Firmware"
++
++msgid "Flash image..."
++msgstr "Flashar imagem..."
++
++msgid "Flash new firmware image"
++msgstr "Flashar nova imagem do firmware"
++
++msgid "Flash operations"
++msgstr ""
++
++msgid "Flashing..."
++msgstr "A programar...."
++
++msgid "Force"
++msgstr "Forçar"
++
++msgid "Force CCMP (AES)"
++msgstr "Forçar CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr "Forçar DHCP nesta rede mesmo se outro servidor for detectado."
++
++msgid "Force TKIP"
++msgstr "Forçar TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "Forçar TKIP e CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "Encaminhar tráfego DHCP"
++
++msgid "Forward broadcast traffic"
++msgstr "Encaminhar trafego de broadcast"
++
++msgid "Forwarding mode"
++msgstr "Modo de encaminhamento"
++
++msgid "Fragmentation Threshold"
++msgstr "Margem de Fragmentação"
++
++msgid "Frame Bursting"
++msgstr "Frame Bursting"
++
++msgid "Free"
++msgstr "Livre"
++
++msgid "Free space"
++msgstr "Espaço livre"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "Só GPRS"
++
++msgid "Gateway"
++msgstr "Gateway"
++
++msgid "Gateway ports"
++msgstr "Portas de gateway"
++
++msgid "General Settings"
++msgstr "Definições Gerais"
++
++msgid "General Setup"
++msgstr "Configuração Geral"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "Gerar arquivo"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Controlador Wireless Genérico 802.11%s"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++"A confirmação de password não corresponde, a password não foi alterada!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Ir para a configuração da password"
++
++msgid "Go to relevant configuration page"
++msgstr "Ir para a página respectiva de configuração"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "Password HE.net"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Handler"
++
++msgid "Hang Up"
++msgstr "Suspender"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Aqui pode configurar os aspectos básicos do seu equipamento, como o nome do "
++"host ou o fuso horário."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++"Aqui pode colar as chaves SSH (uma por linha) para a autenticação SSH por "
++"chave pública."
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Controlador Wireless Hermes 802.11b"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++"Ocultar <abbr title=\"Identificador de Conjunto de Serviços Estendidos"
++"\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "Entradas de hosts"
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++"<abbr title=\"Endereço do Protocolo de Internet\">IP</abbr> do host ou rede"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "Hostname a enviar quando houver solicitação por DHCP"
++
++msgid "Hostnames"
++msgstr "Hostnames"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "Endereço IP"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "Firewall IPv4"
++
++msgid "IPv4 WAN Status"
++msgstr "Estado WAN IPv4"
++
++msgid "IPv4 address"
++msgstr "Endereço IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 e IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "Broadcast IPv4"
++
++msgid "IPv4 gateway"
++msgstr "Gateway IPv4"
++
++msgid "IPv4 netmask"
++msgstr "Máscara IPv4"
++
++msgid "IPv4 only"
++msgstr "Só IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "Comprimento do prefixo IPv4"
++
++msgid "IPv4-Address"
++msgstr "Endereço-IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "Firewall IPv6"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "Estado WAN IPv6"
++
++msgid "IPv6 address"
++msgstr "Endereço IPv6"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "Gateway IPv6"
++
++msgid "IPv6 only"
++msgstr "Só IPv6"
++
++msgid "IPv6 prefix"
++msgstr "Prefixo IPv6"
++
++msgid "IPv6 prefix length"
++msgstr "Comprimento do prefixo IPv6"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "Endereço-IPv6"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-em-IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6-sobre-IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6-sobre-IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "Identidade"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++
++msgid "If unchecked, no default route is configured"
++msgstr "Se desmarcado, não é configurada uma rota pré-definida"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr "Se desmarcado, os endereços servidor DNS anunciados são ignorados "
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Se a memória física for insuficiente, os dados poderão ser trocados "
++"temporariamente para um dispositivo swap, resultando em uma maior quantidade "
++"de memória utilizável <abbr title=\"Memória de Acesso Aleatório\">RAM</"
++"abbr>. Esteja ciente de que a troca de dados (swap) é um processo muito "
++"lento pois o dispositivo swap não pode ser acedido com um nível elevado de "
++"memória <abbr title=\"Memória de Acesso Aleatório\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Ignorar <code>/etc/hosts</code>"
++
++msgid "Ignore interface"
++msgstr "Ignorar interface"
++
++msgid "Ignore resolve file"
++msgstr "Ignorar ficheiro resolv.conf"
++
++msgid "Image"
++msgstr "Imagem"
++
++msgid "In"
++msgstr "Entrada"
++
++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 "Tempo de inatividade"
++
++msgid "Inbound:"
++msgstr "Entrada:"
++
++msgid "Info"
++msgstr "Info"
++
++msgid "Initscript"
++msgstr "Script de inicialização"
++
++msgid "Initscripts"
++msgstr "Scripts de Inicialização"
++
++msgid "Install"
++msgstr "Instalar"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Instalar pacote %q"
++
++msgid "Install protocol extensions..."
++msgstr "Instalar extensões do protocolo..."
++
++msgid "Installed packages"
++msgstr "Instalar pacotes"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid "Interface Configuration"
++msgstr "Configuração da Interface"
++
++msgid "Interface Overview"
++msgstr "Visão Geral da Interface"
++
++msgid "Interface is reconnecting..."
++msgstr "A interface está a religar..."
++
++msgid "Interface is shutting down..."
++msgstr "A interface está a desligar..."
++
++msgid "Interface not present or not connected yet."
++msgstr "Interface não presente ou ainda não ligada."
++
++msgid "Interface reconnected"
++msgstr "Interface religada"
++
++msgid "Interface shut down"
++msgstr "Desligar interface"
++
++msgid "Interfaces"
++msgstr "Interfaces"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "Erro Interno do Servidor"
++
++msgid "Invalid"
++msgstr "Valor inválido"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++"O ID de VLAN fornecido é inválido! Só os IDs entre %d e %d são permitidos."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "O ID de VLAN fornecido é inválido! Só os IDs únicos são permitidos."
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Username inválido e/ou a password! Por favor, tente novamente."
++
++#, 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 ""
++"A imagem que está a tentar carregar aparenta não caber na flash do "
++"equipamento. Por favor verifique o ficheiro de imagem."
++
++msgid "Java Script required!"
++msgstr "É necessário Javascript!"
++
++msgid "Join Network"
++msgstr "Associar Rede"
++
++msgid "Join Network: Settings"
++msgstr "Associar Rede: Definições"
++
++msgid "Join Network: Wireless Scan"
++msgstr "Associar Rede: Procurar Redes Wireless"
++
++msgid "Keep settings"
++msgstr "Manter definições"
++
++msgid "Kernel Log"
++msgstr "Registo do Kernel"
++
++msgid "Kernel Version"
++msgstr "Versão do Kernel"
++
++msgid "Key"
++msgstr "Chave"
++
++msgid "Key #%d"
++msgstr "Chave #%d"
++
++msgid "Kill"
++msgstr "Matar"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "Servidor L2TP"
++
++msgid "LCP echo failure threshold"
++msgstr ""
++
++msgid "LCP echo interval"
++msgstr "Intervalo de echo LCP"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Etiqueta"
++
++msgid "Language"
++msgstr "Idioma"
++
++msgid "Language and Style"
++msgstr "Língua e Tema"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Tempo de validade da concessão"
++
++msgid "Leasefile"
++msgstr "Ficheiro de concessões"
++
++msgid "Leasetime"
++msgstr "Tempo de concessão"
++
++msgid "Leasetime remaining"
++msgstr "Tempo de atribuição restante"
++
++msgid "Leave empty to autodetect"
++msgstr "Deixar em branco para auto-detecção"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "Deixar em branco para usar o endereço WAN actual"
++
++msgid "Legend:"
++msgstr "Legenda:"
++
++msgid "Limit"
++msgstr "Limite"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Link Ativo"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"Lista de servidores <abbr title=\"Sistema Nomes de Domínio\">DNS</abbr> para "
++"onde encaminhar os pedidos"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "Lista de dominios que permitem respostas RFC1918 para"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++"Escutar apenas na interface fornecida ou, se não especificada, em todas"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Porta de escuta para entrada de consultas DNS"
++
++msgid "Load"
++msgstr "Carga"
++
++msgid "Load Average"
++msgstr "Carga Média"
++
++msgid "Loading"
++msgstr "A carregar"
++
++msgid "Local IPv4 address"
++msgstr "Endereço IPv4 Local"
++
++msgid "Local IPv6 address"
++msgstr "Endereço IPv6 Local"
++
++msgid "Local Startup"
++msgstr "Arranque Local"
++
++msgid "Local Time"
++msgstr "Hora Local"
++
++msgid "Local domain"
++msgstr "Domínio local"
++
++#, fuzzy
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++"Especificação de dominio local. Os nomes que correspondam a este dominio "
++"nunca são encaminhados e resolvidos do DHCP ou do ficheiro de hosts"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++"Sufixos de dominio local a juntar aos nomes DHCP e às entradas do ficheiro "
++"de hosts"
++
++msgid "Local server"
++msgstr "Servidor local"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr "Localizar consultas"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Nível de output do log"
++
++msgid "Log queries"
++msgstr "Registo das consultas"
++
++msgid "Logging"
++msgstr ""
++
++msgid "Login"
++msgstr "Login"
++
++msgid "Logout"
++msgstr "Logout"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr "Endereço-MAC"
++
++msgid "MAC-Address Filter"
++msgstr "Filtro de Endereço-MAC"
++
++msgid "MAC-Filter"
++msgstr "Filtro-MAC"
++
++msgid "MAC-List"
++msgstr "Lista-MAC"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Taxa Máxima"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "Número máximo permitido de concessões DHCP ativas"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "Número máximo permitido de consultas DNS permitidas"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "Número máximo de segundos a esperar pelo modem para ficar pronto"
++
++msgid "Maximum hold time"
++msgstr "Tempo máximo de espera"
++
++msgid "Maximum number of leased addresses."
++msgstr "Número máximo de endereços concessionados."
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "Memória"
++
++msgid "Memory usage (%)"
++msgstr "Uso de memória (%)"
++
++msgid "Metric"
++msgstr "Métrica"
++
++msgid "Minimum Rate"
++msgstr "Taxa Mínima"
++
++msgid "Minimum hold time"
++msgstr "Tempo de retenção mínimo"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "Falta a extensão de protocolo para o protocolo %q"
++
++msgid "Mode"
++msgstr "Modo"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Dispositivo do modem"
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr "Montar Entrada"
++
++msgid "Mount Point"
++msgstr "Ponto de Montagem"
++
++msgid "Mount Points"
++msgstr "Pontos de Montagem"
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Pontos de montagem definem em que ponto um dispositivo de memória será "
++"anexado ao sistema de arquivos"
++
++msgid "Mount options"
++msgstr ""
++
++msgid "Mount point"
++msgstr "Ponto de montagem"
++
++msgid "Mounted file systems"
++msgstr "Sistemas de arquivos montados"
++
++msgid "Move down"
++msgstr "Subir"
++
++msgid "Move up"
++msgstr "Descer"
++
++msgid "Multicast Rate"
++msgstr "Taxa de Multicast"
++
++msgid "Multicast address"
++msgstr "Endereço de multicast"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "Candidatos a servidor NTP"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Nome"
++
++msgid "Name of the new interface"
++msgstr "Nome da nova interface"
++
++msgid "Name of the new network"
++msgstr "Nome da nova rede"
++
++msgid "Navigation"
++msgstr "Navegação"
++
++msgid "Netmask"
++msgstr "Mascara de rede"
++
++msgid "Network"
++msgstr "Rede"
++
++msgid "Network Utilities"
++msgstr "Ferramentas de Rede"
++
++msgid "Network boot image"
++msgstr "Imagem de arranque via rede"
++
++msgid "Network without interfaces."
++msgstr "Rede sem interfaces."
++
++msgid "Next »"
++msgstr "Seguinte »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Sem Servidor DHCP configurado nesta interface"
++
++msgid "No chains in this table"
++msgstr "Tabela sem chains"
++
++msgid "No files found"
++msgstr "Não foram encontrados ficheiros"
++
++msgid "No information available"
++msgstr "Sem informação disponível"
++
++msgid "No negative cache"
++msgstr "Sem cache negativa"
++
++msgid "No network configured on this device"
++msgstr "Nenhuma rede configurada no dispositivo"
++
++msgid "No network name specified"
++msgstr "Nome de rede não especificado"
++
++msgid "No package lists available"
++msgstr "Não há listas de pacotes disponiveis"
++
++msgid "No password set!"
++msgstr "Sem password definida!"
++
++msgid "No rules in this chain"
++msgstr "Sem regras nesta cadeia"
++
++msgid "No zone assigned"
++msgstr "Sem zona atribuída"
++
++msgid "Noise"
++msgstr "Ruído"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Ruído:"
++
++msgid "None"
++msgstr "Nenhum"
++
++msgid "Normal"
++msgstr "Normal"
++
++msgid "Not Found"
++msgstr "Não encontrado"
++
++msgid "Not associated"
++msgstr "Não associado"
++
++msgid "Not connected"
++msgstr "Não ligado"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Nota: Os ficheiros de configuração serão apagados."
++
++msgid "Notice"
++msgstr "Reparo"
++
++msgid "Nslookup"
++msgstr "Nslookup"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "Configuração-OPKG"
++
++msgid "Off-State Delay"
++msgstr "Atraso do Off-State"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Nesta página pode configurar as interfaces de rede. Pode ter várias "
++"interfaces do tipo bridge, assinalando o campo \"interfaces bridge\" e "
++"inserir os nomes de várias interfaces de rede separadas por espaços. Pode "
++"também usar a notação para <abbr title=\"Rede Local Virtual\">VLAN</abbr> "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"por exemplo\">ex.</abbr>: "
++"<samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr "Atraso do On-State"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "Um nome de host ou endereço MAC deve ser especificado!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "Um ou mais campos contêm valores inválidos!"
++
++msgid "One or more required fields have no value!"
++msgstr "Um ou mais campos obrigatórios não têm valores!"
++
++msgid "Open list..."
++msgstr "Abrir lista..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Opção alterada"
++
++msgid "Option removed"
++msgstr "Opção removida"
++
++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 "Options"
++msgstr "Opções"
++
++msgid "Other:"
++msgstr "Outro:"
++
++msgid "Out"
++msgstr "Saída"
++
++msgid "Outbound:"
++msgstr "Saída:"
++
++msgid "Outdoor Channels"
++msgstr "Canais de Outdoor"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr "Visão Geral"
++
++msgid "Owner"
++msgstr "Dono"
++
++msgid "PAP/CHAP password"
++msgstr "Password PAP/CHAP"
++
++msgid "PAP/CHAP username"
++msgstr "Utilizador PAP/CHAP"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "Encapsulamento PPPoA "
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtp"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "O pacote libiwinfo é necessário!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "As listas de pacotes têm mais de 24 horas"
++
++msgid "Package name"
++msgstr "Nome do pacote"
++
++msgid "Packets"
++msgstr "Pacotes"
++
++msgid "Part of zone %q"
++msgstr "Parte da zona %q"
++
++msgid "Password"
++msgstr "Senha"
++
++msgid "Password authentication"
++msgstr "Autenticação por senha"
++
++msgid "Password of Private Key"
++msgstr "Senha da Chave Privada"
++
++msgid "Password successfully changed!"
++msgstr "Password alterada com sucesso!"
++
++msgid "Path to CA-Certificate"
++msgstr "Directorio do Certificado CA"
++
++msgid "Path to Client-Certificate"
++msgstr "Caminho para o Certificado de Cliente"
++
++msgid "Path to Private Key"
++msgstr "Caminho da Chave Privada"
++
++msgid "Path to executable which handles the button event"
++msgstr "Caminho do executável que lida com o botão de eventos"
++
++msgid "Peak:"
++msgstr "Pico:"
++
++msgid "Perform reboot"
++msgstr "Executar reinicialização"
++
++msgid "Perform reset"
++msgstr "Executar reset"
++
++msgid "Phy Rate:"
++msgstr ""
++
++msgid "Physical Settings"
++msgstr "Definições Físicas"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Pkts."
++msgstr "Pkts."
++
++msgid "Please enter your username and password."
++msgstr "Insira o seu username e password."
++
++msgid "Policy"
++msgstr "Política"
++
++msgid "Port"
++msgstr "Porta"
++
++msgid "Port %d"
++msgstr "Porta %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr "Estado da porta:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr "Impede a comunicação cliente-a-cliente"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Controlador Wireless Prism2/2.5/3 802.11b"
++
++msgid "Proceed"
++msgstr "Proceder"
++
++msgid "Processes"
++msgstr "Processos"
++
++msgid "Prot."
++msgstr "Protocolo"
++
++msgid "Protocol"
++msgstr "Protocolo"
++
++msgid "Protocol family"
++msgstr "Família do protocolo"
++
++msgid "Protocol of the new interface"
++msgstr "Protocolo da nova interface"
++
++msgid "Protocol support is not installed"
++msgstr "O protocolo suportado não está instalado"
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "Qualidade"
++
++msgid "RTS/CTS Threshold"
++msgstr "RTS/CTS Threshold"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr "Taxa RX"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "Controlador Wireless RaLink 802.11%s"
++
++msgid "Radius-Accounting-Port"
++msgstr "Porta-Conta-Radius"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Segredo-Conta-Radius"
++
++msgid "Radius-Accounting-Server"
++msgstr "Servidor-Conta-Radius"
++
++msgid "Radius-Authentication-Port"
++msgstr "Porta-Autenticação-Radius"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Segredo-Autenticação-Radius"
++
++msgid "Radius-Authentication-Server"
++msgstr "Servidor-Autenticação-Radius"
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"Ler <code>/etc/ethers</code> para configurar o Servidor-<abbr title="
++"\"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."
++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 "
++"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"
++"Pode perde a ligação ao dispositivo, caso esta ligado através desta rede."
++
++msgid "Really reset all changes?"
++msgstr "Deseja mesmo limpar todas as alterações?"
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++"Deseja mesmo desligar a interface \"%s\" ?\n"
++"Pode perder o acesso ao dispositivo se estiver ligado através desta "
++"interface."
++
++msgid "Really switch protocol?"
++msgstr "Deseja mesmo trocar o protocolo?"
++
++msgid "Realtime Connections"
++msgstr "Ligações em Tempo Real"
++
++msgid "Realtime Graphs"
++msgstr "Gráficos em Tempo Real"
++
++msgid "Realtime Load"
++msgstr "Carga em Tempo Real"
++
++msgid "Realtime Traffic"
++msgstr "Tráfego em Tempo Real"
++
++msgid "Realtime Wireless"
++msgstr "Wireless em Tempo Real"
++
++msgid "Rebind protection"
++msgstr "Religar protecção"
++
++msgid "Reboot"
++msgstr "Reiniciar"
++
++msgid "Rebooting..."
++msgstr "A reiniciar..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Reinicia o seu dispositivo"
++
++msgid "Receive"
++msgstr "Receber"
++
++msgid "Receiver Antenna"
++msgstr "Antena de Recepção"
++
++msgid "Reconnect this interface"
++msgstr "Reconetar esta interface"
++
++msgid "Reconnecting interface"
++msgstr "A reconectar interface"
++
++msgid "References"
++msgstr "Referências"
++
++msgid "Regulatory Domain"
++msgstr "Domínio Regulatório"
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr "Endereço IPv4 remoto"
++
++msgid "Remove"
++msgstr "Remover"
++
++msgid "Repeat scan"
++msgstr "Repetir scan"
++
++msgid "Replace entry"
++msgstr "Substituir entrada"
++
++msgid "Replace wireless configuration"
++msgstr "Substituir configuração wireless"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "Necessário para certos ISPs, p.ex. Charter with DOCSIS 3"
++
++msgid "Reset"
++msgstr "Reset"
++
++msgid "Reset Counters"
++msgstr "Limpar contadores"
++
++msgid "Reset to defaults"
++msgstr ""
++
++msgid "Resolv and Hosts Files"
++msgstr "Ficheiros Resolv e Hosts"
++
++msgid "Resolve file"
++msgstr ""
++
++msgid "Restart"
++msgstr "Reiniciar"
++
++msgid "Restart Firewall"
++msgstr "Reiniciar Firewall"
++
++msgid "Restore backup"
++msgstr "Restaurar backup"
++
++msgid "Reveal/hide password"
++msgstr "Revelar/esconder password"
++
++msgid "Revert"
++msgstr "Reverter"
++
++msgid "Root"
++msgstr ""
++
++msgid "Root directory for files served via TFTP"
++msgstr ""
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Password do Router"
++
++msgid "Routes"
++msgstr "Rotas"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"As rotas especificam através de que interfaces ou gateways podem ser "
++"alcançados determinadas redes ou hosts."
++
++msgid "Rule #"
++msgstr "Regra #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++"Correr uma verificação do sistema de ficheiros antes de montar um dispositivo"
++
++msgid "Run filesystem check"
++msgstr "Correr uma verificação do sistema de ficheiros"
++
++msgid ""
++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) "
++"use 6in4 instead"
++msgstr ""
++
++msgid "SIXXS-handle[/Tunnel-ID]"
++msgstr ""
++
++msgid "SSH Access"
++msgstr "Acesso SSH"
++
++msgid "SSH-Keys"
++msgstr "Chaves-SSH"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Salvar"
++
++msgid "Save & Apply"
++msgstr "Salvar & Aplicar"
++
++msgid "Save &#38; Apply"
++msgstr "Salvar &#38; Aplicar"
++
++msgid "Scan"
++msgstr "Procurar"
++
++msgid "Scheduled Tasks"
++msgstr "Tarefas Agendadas"
++
++msgid "Section added"
++msgstr "Secção adicionada"
++
++msgid "Section removed"
++msgstr "Secção removida"
++
++msgid "See \"mount\" manpage for details"
++msgstr ""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr "Isolar Clientes"
++
++msgid "Separate WDS"
++msgstr "Separar WDS"
++
++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"
++
++msgid "Service Type"
++msgstr "Tipo de Serviço"
++
++msgid "Services"
++msgstr "Serviços"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "Configurar Sincronização Horária"
++
++msgid "Setup DHCP Server"
++msgstr "Configurar Servidor DHCP"
++
++msgid "Show current backup file list"
++msgstr "Mostrar lista ficheiros para backup"
++
++msgid "Shutdown this interface"
++msgstr "Desligar esta interface"
++
++msgid "Shutdown this network"
++msgstr "Desligar esta rede"
++
++msgid "Signal"
++msgstr "Sinal"
++
++msgid "Signal:"
++msgstr "Sinal:"
++
++msgid "Size"
++msgstr "Tamanho"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "Saltar"
++
++msgid "Skip to content"
++msgstr "Ir para o conteúdo"
++
++msgid "Skip to navigation"
++msgstr "Ir para a navegação"
++
++msgid "Slot time"
++msgstr ""
++
++msgid "Software"
++msgstr "Software"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Alguns campos são inválidos, não é possível gravar valores!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Lamento, o objecto que pediu não foi encontrado."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "Lamento, o servidor encontrou um erro inesperado."
++
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++
++msgid "Sort"
++msgstr "Ordenar"
++
++msgid "Source"
++msgstr "Origem"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "Especifica as portas de escuta desta instância <em>Dropbear</em>"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr ""
++
++msgid "Start"
++msgstr "Iniciar"
++
++msgid "Start priority"
++msgstr "Prioridade de inicialização"
++
++msgid "Startup"
++msgstr ""
++
++msgid "Static IPv4 Routes"
++msgstr "Rotas Estáticas IPv4"
++
++msgid "Static IPv6 Routes"
++msgstr "Rotas Estáticas IPv6"
++
++msgid "Static Leases"
++msgstr "Atribuições Estáticas"
++
++msgid "Static Routes"
++msgstr "Rotas Estáticas"
++
++msgid "Static WDS"
++msgstr "WDS Estático"
++
++msgid "Static address"
++msgstr "Endereço estático"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Stop"
++msgstr "Parar"
++
++msgid "Strict order"
++msgstr "Ordem exacta"
++
++msgid "Submit"
++msgstr "Enviar"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr ""
++
++msgid "Switch"
++msgstr "Switch"
++
++msgid "Switch %q"
++msgstr ""
++
++msgid "Switch %q (%s)"
++msgstr ""
++
++msgid "Switch protocol"
++msgstr ""
++
++msgid "Sync with browser"
++msgstr "Sincronizar com o browser"
++
++msgid "Synchronizing..."
++msgstr "A sincronizar..."
++
++msgid "System"
++msgstr "Sistema"
++
++msgid "System Log"
++msgstr "Registo do Sistema"
++
++msgid "System Properties"
++msgstr "Propriedades do Sistema"
++
++msgid "System log buffer size"
++msgstr ""
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "Definições TFTP"
++
++msgid "TFTP server root"
++msgstr "Raíz do servidor TFTP"
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr ""
++
++msgid "Table"
++msgstr "Tabela"
++
++msgid "Target"
++msgstr "Destino"
++
++msgid "Terminate"
++msgstr "Terminar"
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"O pacote <em>libiwinfo-lua</em> não está instalado. Precisa de instalar este "
++"pacote para que a configuração wireless funcione!"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++"O prefixo IPv6 atribuído ao provider, habitualmente termina com <code>::</"
++"code>"
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++"Os caracteres permitidos são: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> e <code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"O arquivo do dispositivo de memória ou da partição (<abbr title=\"por exemplo"
++"\">ex.</abbr> <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 ""
++"O sistema que foi usado para formatar a memória (<abbr title=\"por exemplo"
++"\">ex.</abbr> <samp><abbr title=\"Sistema de Arquivos ext3\">ext3</abbr></"
++"samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++"A imagem foi carregada. Abaixo está o checksum e o tamanho dos ficheiros, "
++"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 "
++
++msgid "The following rules are currently active on this system."
++msgstr "As seguintes regras estão actualmente acivas neste sistema."
++
++msgid "The given network name is not unique"
++msgstr "O nome dado não é único"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"O hardware não é comporta multi-SSIDs a configuração será substituída se "
++"prosseguir."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++"O tamanho do perfico IPv4 em bits, o restante é usado em endereços IPv6."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "O comprimento do prefixo IPv6 em bits"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++"As portas de rede neste dispositivo podem ser combinadas com várias <abbr "
++"title=\"Rede de Ãrea Local Virtual\">VLAN</abbr>s onde os computadores podem "
++"comunicar directamente entre eles. <abbr title=\"Rede de Ãrea Local Virtual"
++"\">VLAN</abbr>s são muito utilizadas para separar dois segmentos de rede "
++"diferentes. Muitas vezes existe por defeito uma porta de Uplink para uma "
++"ligação para a rede acima como a internet ou outras portas de uma rede local."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "O protocolo escolhido precisa de um dispositivo atribuído."
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++"O sistema está agora a limpar a partição de configuração e irá reiniciar-se "
++"quando terminar."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"O sistema está a carregar o firmware para a flash.<br /> NÃO DESLIGUE O "
++"EQUIPAMENTO!<br /> Espere alguns minutos até tentar uma ligação. Dependendo "
++"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."
++msgstr ""
++"A imagem carregada não contém um formato suportado. Confirme que escolhe uma "
++"imagem genérica para a sua plataforma."
++
++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 pending changes to revert!"
++msgstr "Não há alterações pendentes para reverter!"
++
++msgid "There are no pending changes!"
++msgstr "Não há alterações pendentes!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"Ainda não há um dispositivo atribuído, por favor ligue um dispositivo de "
++"rede nas \"Definições Físicas\""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"Não há uma password definida neste router. Por favor defina uma senha de "
++"root para proteger a interface web e ativar o SSH."
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"Este é o conteúdo de /etc/rc.local. Insira os seus próprios comandos aqui "
++"(antes de 'exit 0') para executá-los no final do processo de arranque."
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Este é o único <abbr title=\"Protocolo de Configuração Dinâmica de Hosts"
++"\">DHCP</abbr> na rede local"
++
++msgid "This is the plain username for logging into the account"
++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 "Este é o sistema de agendamento de tarefas."
++
++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 ""
++"Esta lista fornece uma visão geral sobre os processos em execução no sistema."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr ""
++"Esta página permite a configuração de botões para acções personalizadas."
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "Esta página fornece informações sobre as ligações de rede ativas."
++
++msgid "This section contains no values yet"
++msgstr "Esta secção ainda não contêm valores"
++
++msgid "Time Synchronization"
++msgstr "Sincronização Horária"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "A sincronização horária ainda não está configurada."
++
++msgid "Timezone"
++msgstr "Fuso Horário"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"Para restaurar os ficheiros de configuração, pode carregar aqui um ficheiro "
++"de backup gerado anteriormente."
++
++msgid "Total Available"
++msgstr "Total Disponível"
++
++msgid "Traceroute"
++msgstr "Traceroute"
++
++msgid "Traffic"
++msgstr "Tráfego"
++
++msgid "Transfer"
++msgstr "Transferências"
++
++msgid "Transmission Rate"
++msgstr "Taxa de Transmissão"
++
++msgid "Transmit"
++msgstr "Transmitir"
++
++msgid "Transmit Power"
++msgstr "Potência de Transmissão"
++
++msgid "Transmitter Antenna"
++msgstr "Antena de Transmissão"
++
++msgid "Trigger"
++msgstr "Trigger"
++
++msgid "Trigger Mode"
++msgstr "Modo de Trigger"
++
++msgid "Tunnel ID"
++msgstr "ID do Túnel"
++
++msgid "Tunnel Interface"
++msgstr "Interface de Túnel"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Modo Turbo"
++
++msgid "Tx-Power"
++msgstr "Potência de Tx"
++
++msgid "Type"
++msgstr "Tipo"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "Só UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "Dispositivo USB"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr "Desconhecido"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Erro Desconhecido, a password não foi alterada!"
++
++msgid "Unmanaged"
++msgstr "Não gerido"
++
++msgid "Unsaved Changes"
++msgstr "Alterações não Guardadas"
++
++msgid "Unsupported protocol type."
++msgstr "Tipo de protocolo não suportado."
++
++msgid "Update lists"
++msgstr "Actualizar listas"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr "Carregar arquivo..."
++
++msgid "Uploaded File"
++msgstr "Ficheiro carregado"
++
++msgid "Uptime"
++msgstr "Uptime"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Usar <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr "Usar a gateway do DHCP"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "Usar os servidores DNS fornecidos pelo parceiro"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr ""
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr ""
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "Usar servidores DNS personalizados"
++
++msgid "Use default gateway"
++msgstr "Usar gateway pre-definida"
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr "Usar tabela de roteamento"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr "Usado"
++
++msgid "Used Key Slot"
++msgstr ""
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Utilizador"
++
++msgid "VC-Mux"
++msgstr ""
++
++msgid "VLAN Interface"
++msgstr "Interface VLAN"
++
++msgid "VLANs on %q"
++msgstr "VLANs em %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLANs em %q (%s)"
++
++msgid "VPN Server"
++msgstr "Servidor VPN"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr "Verificar"
++
++msgid "Version"
++msgstr "Versão"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "Sistema Aberto WEP"
++
++msgid "WEP Shared Key"
++msgstr "Chave partilhada WEP"
++
++msgid "WEP passphrase"
++msgstr "Palavra-Passe WEP"
++
++msgid "WMM Mode"
++msgstr "Modo WMM"
++
++msgid "WPA passphrase"
++msgstr "Palavra-Passe WPA"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Aviso"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr "Rede Wireless"
++
++msgid "Wireless Adapter"
++msgstr "Adaptador Wireless"
++
++msgid "Wireless Network"
++msgstr "Rede Wireless"
++
++msgid "Wireless Overview"
++msgstr "Vista Global Wireless"
++
++msgid "Wireless Security"
++msgstr "Segurança Wireless"
++
++msgid "Wireless is disabled or not associated"
++msgstr "Wireless desativada ou não associada"
++
++msgid "Wireless is restarting..."
++msgstr "A Wireless está a reiniciar..."
++
++msgid "Wireless network is disabled"
++msgstr "Wireless está desativado."
++
++msgid "Wireless network is enabled"
++msgstr "A rede wireless está ativada"
++
++msgid "Wireless restarted"
++msgstr "Rede wireless reiniciada"
++
++msgid "Wireless shut down"
++msgstr "Desligar wireless"
++
++msgid "Write received DNS requests to syslog"
++msgstr "Escrever os pedidos de DNS para o syslog"
++
++msgid "XR Support"
++msgstr "Suporte XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Você pode ativar ou desativar os scripts de inicialização instalados aqui. "
++"As mudanças serão aplicadas após a reinicialização do equipamento.<br /"
++"><strong>Aviso: Se você desativar algum script de inicialização essencial "
++"como por exemplo \"rede/network\", o dispositivo poderá tornar-se "
++"inacessível!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Tem de activar o Java Script no seu browser ou a LuCI não funcionará "
++"corretamente."
++
++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 ""
++
++msgid "any"
++msgstr "qualquer"
++
++msgid "auto"
++msgstr "automático"
++
++#, fuzzy
++msgid "automatic"
++msgstr "estático"
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr ""
++
++msgid "create:"
++msgstr "criar:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "cria uma bridge sobre determinada(s) interface(s)"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "desativar"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "expirou"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"Ficheiro onde as atribuições <abbr title=\"Protocolo de Configuração "
++"Dinâmica de Hosts\">DHCP</abbr> são armazenadas"
++
++msgid "forward"
++msgstr ""
++
++msgid "full-duplex"
++msgstr "full-duplex"
++
++msgid "half-duplex"
++msgstr "half-duplex"
++
++msgid "help"
++msgstr "ajuda"
++
++msgid "hidden"
++msgstr "escondido"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "se o destino for uma rede"
++
++msgid "input"
++msgstr "entrada"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++msgstr "kbit/s"
++
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "não"
++
++msgid "no link"
++msgstr "sem link"
++
++msgid "none"
++msgstr "nenhum"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "desligado"
++
++msgid "on"
++msgstr "ligado"
++
++msgid "open"
++msgstr "abrir"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr ""
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr ""
++
++msgid "unknown"
++msgstr "desconhecido"
++
++msgid "unlimited"
++msgstr "ilimitado"
++
++msgid "unspecified"
++msgstr "não especificado"
++
++msgid "unspecified -or- create:"
++msgstr ""
++
++msgid "untagged"
++msgstr ""
++
++msgid "yes"
++msgstr "sim"
++
++msgid "« Back"
++msgstr "« Voltar"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "Ativar a negociação IPv6 no link PPP"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "Ignorar ficheiros de Hosts"
++
++#~ msgid "Path"
++#~ msgstr "Directório"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Por favor aguarde: Equipamento a reiniciar..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Aviso: Existem alterações não salvas que serão perdidas durante a "
++#~ "reinicialização!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Usar sempre os canais de 40MHz mesmo se o segundo canal se sobrepuser. "
++#~ "Usando esta opção não obdece com IEEE 802.11n-2009!"
++
++#~ msgid "Cached"
++#~ msgstr "Em cache"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "Forçar modo 40MHz"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Salto de Frequência"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "Bloqueado ao canal %d usado por %s"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "ID utilizador HE.net"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40 Mhz 2.º canal acima"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz 2.º canal abaixo"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Aceitar os avisos do router"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Anúnciar IPv6 na rede"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "ID da rede anunciada"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "O intervalo permitido é de 1 até 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "Capacidades HT"
++
++#~ msgid "HT mode"
++#~ msgstr "Modo HT"
++
++#~ msgid "Router Model"
++#~ msgstr "Modelo do Router"
++
++#~ msgid "Router Name"
++#~ msgstr "Nome do Router"
++
++#~ msgid "Active Leases"
++#~ msgstr "Atribuições Activas"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Encriptado\">Encr.</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "<abbr title=\"Rede Local Wireless\">WLAN</abbr>-Pesquisa"
++
++#~ msgid "Create Network"
++#~ msgstr "Criar Rede"
++
++#~ msgid "Link"
++#~ msgstr "Link"
++
++#~ msgid "Networks"
++#~ msgstr "Redes"
++
++#~ msgid "Power"
++#~ msgstr "Potência"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Redes Wifi no seu ambiente local"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "Notação <abbr title=\"Roteamento entre Domínios sem Classe\">CIDR</abbr>: "
++#~ "endereço/prefixo"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "Servidor <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr ""
++#~ "Broadcast <abbr title=\"Protocolo de Internet Versão 4\">IPv4</abbr>"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "Endereço <abbr title=\"Protocolo de Internet Versão 6\">IPv6</abbr>"
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "As portas de rede do seu router podem ser combinadas com diversas <abbr "
++#~ "title=\"Rede Local Virtual\">VLAN</abbr>s em que os computadores podem "
++#~ "comunicar directamente entre si. As <abbr title=\"Rede Local Virtual"
++#~ "\">VLAN</abbr>s são frequentemente utilizadas para separar segmentos de "
++#~ "redes diferentes. Muitas vezes é padrão uma porta Uplink para a ligação "
++#~ "com a próxima rede, como a Internet e outras portas para uma rede local."
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Ficheiros que devem ser mantidos quando gravar um novo firmware."
++
++#~ msgid "General"
++#~ msgstr "Geral"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Aqui pode personalizar as configurações e funcionalidades do <abbr title="
++#~ "\"Interface de configuração Lua\">LuCI</abbr>."
++
++#~ msgid "Post-commit actions"
++#~ msgstr "Acções pós-gravação"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Estes comandos são executados automaticamente quando uma determinada "
++#~ "configuração da <abbr title=\"Interface de configuração unificada\">UCI</"
++#~ "abbr> está gravada, permitindo mudanças a serem aplicadas "
++#~ "instantaneamente."
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Web <abbr title=\"Interface do Utilizador\">UI</abbr>"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Ponto de acesso (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Opções adicionais do pppd"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Fim automático de ligação"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Arquivo de backup"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Configurar o servidor DNS local para usar o servidores de nomes "
++#~ "fornecidos pelo PPP"
++
++#~ msgid "Connect script"
++#~ msgstr "Script de ligação"
++
++#~ msgid "Create backup"
++#~ msgstr "Criar backup"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Script de fim de ligação"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Editar listas de pacotes e destinos de instalação"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Activar IPv6 no link PPP"
++
++#~ msgid "Firmware image"
++#~ msgstr "Imagem de Firmware"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Aqui pode fazer o backup e restaurar as configurações do seu router. "
++#~ "Também pode restaurar seu router para as configurações pré-definidas."
++
++#~ msgid "Installation targets"
++#~ msgstr "Destino de Instalação"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Manter ficheiros de configuração"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Manter em Actividade"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Permitir o pppd substituir a rota padrão actual e usar a interface PPP "
++#~ "como padrão após a ligação ser efectuada com sucesso"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr ""
++#~ "Deixar o pppd executar este script após o estabelecimento do link PPP"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "Deixar o pppd executar este script antes de terminar o link PPP"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Certifique-se que forneceu o código PIN correcto aqui, ou pode bloquear o "
++#~ "seu cartão SIM"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "A maioria deles são servidores de rede, que oferecem um determinado "
++#~ "serviço para seu equipamento ou rede como acesso shell, servindo páginas "
++#~ "web como o <abbr title=\"Interface de configuração Lua\">LuCI</abbr>, "
++#~ "fazendo roteamento, enviando e-mails, ..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr ""
++#~ "Número de falhas do teste de ligação para reiniciar uma ligação automática"
++
++#~ msgid "PIN code"
++#~ msgstr "Código PIN"
++
++#~ msgid "Package lists"
++#~ msgstr "Listas de pacotes"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr "Proceder com a restauração das configurações pré-definidas?"
++
++#~ msgid "Processor"
++#~ msgstr "Processador"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Porta RADIUS"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Servidor RADIUS"
++
++#~ msgid "Replace default route"
++#~ msgstr "Substituir a rota padrão"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Restaurar as configurações pré-definidas do router"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr ""
++#~ "Segundos de espera para o modem ficar pronto antes de tentar uma ligação"
++
++#~ msgid "Service type"
++#~ msgstr "Tipo do serviço"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr ""
++#~ "Serviços e daemons que estão a executar diversas tarefas no seu "
++#~ "equipamento."
++
++#~ msgid "Settings"
++#~ msgstr "Definições"
++
++#~ msgid "Setup wait time"
++#~ msgstr "Configurar tempo de espera"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Lamentamos, mas o OpenWrt não suporta uma actualização do sistema para "
++#~ "esta plataforma.<br /> É necessário carregar manualmente uma imagem para "
++#~ "a flash do seu equipamento."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr ""
++#~ "Especificar argumentos adicionais por linha de comando para o pppd aqui"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "O caminho do dispositivo do seu modem, ex. /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr "Tempo (em segundos) para fim de uma ligação já não utilizada"
++
++#~ msgid "Update package lists"
++#~ msgstr "Actualizar listas de pacotes"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "Carregar uma imagem OpenWrt para a flash do router."
++
++#~ msgid "Upload image"
++#~ msgstr "Carregar imagem"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "Utilizar DNS do peer"
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Precisa de instalar os pacotes \"comgt\" para UMTS/GPRS, \"ppp-mod-pppoe"
++#~ "\" para PPPoE, \"ppp-mod-pppoa\" para PPPoA ou \"pptp\" para o suporte "
++#~ "PPtP"
++
++#~ msgid "back"
++#~ msgstr "voltar"
++
++#~ msgid "buffered"
++#~ msgstr "em buffer"
++
++#~ msgid "cached"
++#~ msgstr "em cache"
++
++#~ msgid "free"
++#~ msgstr "livre"
++
++#~ msgid "static"
++#~ msgstr "estático"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Interface de configuração Lua\">LuCI</abbr> é uma colecção "
++#~ "gratuita de programas Lua incluindo um Framework Web <abbr title=\"Modelo-"
++#~ "Visualização-Controle\">MVC</abbr> e uma Interface Web para micro-"
++#~ "dispositivos. <abbr title=\"Interface de configuração Lua\">LuCI</abbr> é "
++#~ "licenciado sob a Licença Apache."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "Chaves-<abbr title=\"Shell Seguro\">SSH</abbr>"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "Um servidor web HTTP/1.1 ligeiro escrito em C e desenvolvido em Lua para "
++#~ "servir LuCI"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Um pequeno servidor web que pode ser utilizado para servir a interface "
++#~ "<abbr title=\"Interface de configuração Lua\">LuCI</abbr>."
++
++#~ msgid "About"
++#~ msgstr "Sobre"
++
++#~ msgid "Addresses"
++#~ msgstr "Endereços"
++
++#~ msgid "Admin Password"
++#~ msgstr "Password do Administrador"
++
++#~ msgid "Alias"
++#~ msgstr "Configuração IP alternativa"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Ãrea de autenticação"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Porta do interface em ponte"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr ""
++#~ "Altera a senha do administrador do sistema (Login <code>root</code>)"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Cliente (WDS)"
++
++#~ msgid "Configuration file"
++#~ msgstr "Ficheiro de configuração"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Esgotado o tempo de ligação"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Programadores Contribuintes"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "DHCP atribuido"
++
++#~ msgid "Document root"
++#~ msgstr "Diretório raiz"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Activar keep-alive"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "Ponte Ethernet"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "Aqui pode colar suas Chaves-<abbr title=\"Shell Seguro\">SSH</abbr> "
++#~ "públicas (uma por linha) para a autenticação <abbr title=\"Shell Seguro"
++#~ "\">SSH</abbr> por chave-pública."
++
++#~ msgid "ID"
++#~ msgstr "Identificação de interface em ponte"
++
++#~ msgid "IP Configuration"
++#~ msgstr "Configuração IP"
++
++#~ msgid "Interface Status"
++#~ msgstr ""
++#~ "Aqui encontra informações sobre o estado actual do sistema, como <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr>, frequência do relógio, uso "
++#~ "de memória ou uso da interface de rede de dados."
++
++#~ msgid "Lead Development"
++#~ msgstr "Equipa de Desenvolvimento"
++
++#~ msgid "Master"
++#~ msgstr "AP"
++
++#~ msgid "Master + WDS"
++#~ msgstr "AP+WDS"
++
++#~ msgid "Not configured"
++#~ msgstr "Não configurado"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Senha alterada com sucesso"
++
++#~ msgid "Plugin path"
++#~ msgstr "Directorio de plugins"
++
++#~ msgid "Ports"
++#~ msgstr "Portas"
++
++#~ msgid "Primary"
++#~ msgstr "Primário"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Página do Projecto"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "Ahdemo"
++
++#~ msgid "STP"
++#~ msgstr "STP"
++
++#~ msgid "Thanks To"
++#~ msgstr "Obrigado a"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr ""
++#~ "A área de autenticação (realm) que será mostrada na prompt de "
++#~ "autenticação das páginas protegidas."
++
++#~ msgid "Unknown Error"
++#~ msgstr "Erro Desconhecido"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "padrão é <code>/etc/httpd.conf</code>"
++
++#~ msgid "Package lists updated"
++#~ msgstr "As listas de pacotes foram actualizadas"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Actualizar os pacotes instalados"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "Também os arquivos de logs do kernel ou dos serviços podem ser "
++#~ "consultados aqui para obter uma visão geral sobre o seu estado actual."
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "Aqui você pode encontrar informações sobre o estado actual do sistema, "
++#~ "tais como <abbr title=\"Central Processing Unit\">CPU</abbr>, frequência "
++#~ "do relógio, uso de memória ou da interface de rede de dados."
++
++#~ msgid "Search file..."
++#~ msgstr "Procurar ficheiro..."
++
++# "free as in freedom" equivale a "livre de liberdade" não de "grátis"
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "O <abbr title=\"Interface de configuração Lua\">LuCI</abbr> é um "
++#~ "interface gráfico livre, flexível e fácil de utilizar para configurar o "
++#~ "OpenWrt Kamikaze."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "E agora divirta-se com o seu router!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "Agradecemos os seus comentários e sugestões por forma a podermos "
++#~ "continuar a melhorar este interface."
++
++#~ msgid "Hello!"
++#~ msgstr "Olá!"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Aviso: No <abbr title=\"Interface de configuração Lua\">LuCI</abbr> as "
++#~ "alterações devem ser confirmadas clicando em Alterações - Salvar &amp; "
++#~ "Aplicar antes de serem aplicadas."
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "Nas próximas páginas, pode ajustar todas as definições importantes do seu "
++#~ "router."
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr ""
++#~ "A equipa do <abbr title=\"Interface de configuração Lua\">LuCI</abbr>"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Esta é a área de administração do <abbr title=\"Interface de configuração "
++#~ "Lua\">LuCI</abbr>."
++
++#~ msgid "User Interface"
++#~ msgstr "Interface do Utilizador"
++
++#~ msgid "enable"
++#~ msgstr "activar"
++
++#, fuzzy
++#~ msgid "(optional)"
++#~ msgstr " (opcional)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "Porta do <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr>"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "Servidor <abbr title=\"Sistema de Nomes de Domínios\">DNS</abbr> será "
++#~ "consultado na ordem do arquivo resolv.conf"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr ""
++#~ "<abbr title=\"máximo\">max.</abbr> de <abbr title=\"Protocolo de "
++#~ "Configuração Dinâmica de Hosts\">DHCP</abbr>-Leases"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Extension Mechanisms "
++#~ "for Domain Name System\">EDNS0</abbr> packet size"
++#~ msgstr ""
++#~ "tamanho <abbr title=\"máximo\">max.</abbr> do pacote <abbr title="
++#~ "\"Mecanismos de Extensão do Sistema de Nomes de Domínios\">EDNS0</abbr>"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "Isolamento do AP"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "Adicione a rede Wifi à rede física"
++
++#~ msgid "Aliases"
++#~ msgstr "Aliases"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Clamp Segment Size"
++
++#, fuzzy
++#~ msgid "Create Or Attach Network"
++#~ msgstr "Criar Rede"
++
++#~ msgid "Devices"
++#~ msgstr "Dispositivos"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "Não encaminhar as pesquisas reversas para redes locais"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "Activar servidor TFTP"
++
++#~ msgid "Errors"
++#~ msgstr "Erros"
++
++#~ msgid "Essentials"
++#~ msgstr "Básico"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Expandir Hosts"
++
++#~ msgid "First leased address"
++#~ msgstr "Primeiro endereço de atribuição"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Resolve problemas com websites indisponíveis, submissão de formulários ou "
++#~ "comportamentos inesperados de alguns ISP's."
++
++#~ msgid "Hardware Address"
++#~ msgstr "Endereço do Hardware"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "Aqui pode configurar os dispositivos wifi instalados. "
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "Independente (Ad-Hoc)"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Ligação Internet"
++
++#~ msgid "Join (Client)"
++#~ msgstr "Cliente (Client)"
++
++#~ msgid "Leases"
++#~ msgstr "Atribuições"
++
++#~ msgid "Local Domain"
++#~ msgstr "Domínio Local"
++
++#~ msgid "Local Network"
++#~ msgstr "Rede Local"
++
++#~ msgid "Local Server"
++#~ msgstr "Servidor Local"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "Imagem para o boot remoto (PXE)"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr ""
++#~ "Nome da Rede (<abbr title=\"Identificador de Conjunto de Serviços "
++#~ "Estendidos\">ESSID</abbr>)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "Número de endereços atribuidos"
++
++#~ msgid "Perform Actions"
++#~ msgstr "Executar Acções"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "Impede a comunicação de Cliente para Cliente"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "Ponto de Acesso (Access Point)"
++
++#~ msgid "Resolvfile"
++#~ msgstr "Ficheiro resolv.conf"
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "Directório raiz do servidor TFTP"
++
++#~ msgid "TX / RX"
++#~ msgstr "TX / RX"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "Foram aplicadas as seguintes alterações "
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "Quando gravar um novo firmware com o <abbr title=\"Interface de "
++#~ "configuração Lua\">LuCI</abbr> estes arquivos serão adicionados ao novo "
++#~ "firmware instalado."
++
++#, fuzzy
++#~ msgid "Wireless Scan"
++#~ msgstr "Wireless"
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "Com o <abbr title=\"Protocolo de Configuração Dinâmica de Hosts\">DHCP</"
++#~ "abbr> os membros da rede podem automaticamente receber as suas "
++#~ "configurações de rede (endereço-<abbr title=\"Protocolo de Internet\">IP</"
++#~ "abbr>, netmask, servidor-<abbr title=\"Sistema de Nomes de Domínios"
++#~ "\">DNS</abbr>, ...)."
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "Pode servir várias redes wifi com o mesmo dispositivo. Esteja ciente de "
++#~ "que existem certas restrições específicas do hardware e do controlador. "
++#~ "Pode normalmente operar 1 rede Ad-Hoc ou até 3 redes AP e 1 Cliente "
++#~ "simultaneamente."
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "Precisa de instalar os pacotes \"ppp-mod-pppoe\" para PPPoE ou \"pptp\" "
++#~ "para o suporte PPtP"
++
++#~ msgid "Zone"
++#~ msgstr "Zona"
++
++#~ msgid "additional hostfile"
++#~ msgstr "ficheiro de hosts adicional"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr ""
++#~ "Adiciona os nomes dos domínios às entradas de hosts no arquivo resolv.conf"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "ligação automática"
++
++#~ msgid "concurrent queries"
++#~ msgstr "Consultas simultâneas"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr ""
++#~ "desabilitar <abbr title=\"Protocolo de Configuração Dinâmica de Hosts"
++#~ "\">DHCP</abbr> para esta interface"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "desligar quando ocioso por"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "Não fazer cache de desconhecidos"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr ""
++#~ "Filtro de consultas inuteis-<abbr title=\"Sistema de Nomes de Domínios"
++#~ "\">DNS</abbr> de sistemas windows"
++
++#~ msgid "installed"
++#~ msgstr "instalado"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "Localizar o hostname dependendo de sua sub-rede"
++
++#~ msgid "not installed"
++#~ msgstr "não instalado"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr ""
++#~ "Impede o cache de respostas-<abbr title=\"Sistema de Nomes de Domínios"
++#~ "\">DNS</abbr> negativas"
++
++#~ msgid "query port"
++#~ msgstr "porta para consultas"
++
++#~ msgid "transmitted / received"
++#~ msgstr "transmitido / recebido"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "redes contidas"
++
++#~ msgid "all"
++#~ msgstr "todos"
++
++#~ msgid "Code"
++#~ msgstr "Código"
++
++#~ msgid "Distance"
++#~ msgstr "Distância"
++
++#~ msgid "Legend"
++#~ msgstr "Legenda"
++
++#~ msgid "Library"
++#~ msgstr "Biblioteca"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "veja sobre &#39;%s&#39; na página de manual (man)"
++
++#~ msgid "Package Manager"
++#~ msgstr "Gestor de Pacotes"
++
++#~ msgid "Service"
++#~ msgstr "Serviço"
++
++#~ msgid "Statistics"
++#~ msgstr "Estatísticas"
++
++#~ msgid "zone"
++#~ msgstr "Zona"
+diff --git a/feeds/luci/modules/luci-base/po/ro/base.po b/feeds/luci/modules/luci-base/po/ro/base.po
+new file mode 100644
+index 0000000..8c6c348
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/ro/base.po
+@@ -0,0 +1,3397 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-04-01 23:12+0200\n"
++"Last-Translator: xcentric <webcctvservice@gmail.com>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d fereastra minute, %d interval secunde)"
++
++msgid "(%s available)"
++msgstr "(%s disponibil)"
++
++msgid "(empty)"
++msgstr "(gol)"
++
++msgid "(no interfaces attached)"
++msgstr "(nici o interfata atasata)"
++
++msgid "-- Additional Field --"
++msgstr "-- Camp suplimentar --"
++
++msgid "-- Please choose --"
++msgstr "-- Te rog sa alegi --"
++
++msgid "-- custom --"
++msgstr "-- particularizat --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Incarcarea in ultimul minut"
++
++msgid "15 Minute Load:"
++msgstr "Incarcarea in ultimele 15 minute"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Incarcarea in ultimele 5 minute"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr>port de apelare"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> port server"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"<abbr title=\"Domain Name System\">DNS</abbr> serverul va interoga in "
++"vederea procesarii fisierului"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "Adresa <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Poarta Acces "
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "Masca de retea <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Addresa retea (CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Poarta Acces"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Configurare"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Nume"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-Addresa"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> marime pachet"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"maximal\">Max.</abbr> interogari simultane"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "Suport AR"
++
++msgid "ARP retry threshold"
++msgstr "ARP prag reincercare"
++
++msgid "ATM Bridges"
++msgstr "Punti ATM"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "ATM Indentificator Canal Virtual (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "ATM Indentificator Cale Virtual(VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"Puntile ATM expune reteaua intergrata în conexiunile AAL5 ca interfețe "
++"virtuale de rețea Linux care pot fi utilizate în asociere cu DHCP sau PPP "
++"pentru a forma în rețeaua furnizorului."
++
++msgid "ATM device number"
++msgstr "ATM numar echipament"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Concentrator de Access "
++
++msgid "Access Point"
++msgstr "Punct de Acces"
++
++msgid "Action"
++msgstr "Actiune"
++
++msgid "Actions"
++msgstr "Actiune"
++
++msgid "Activate this network"
++msgstr "Activeaza aceasta retea"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "Rute active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "Rute active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++msgid "Active Connections"
++msgstr "Conexiuni active"
++
++msgid "Active DHCP Leases"
++msgstr ""
++
++msgid "Active DHCPv6 Leases"
++msgstr ""
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Adauga"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr "Adauga un sufix local numelor servite din fisierele de tip hosts"
++
++msgid "Add new interface..."
++msgstr "Adauga interfata noua.."
++
++msgid "Additional Hosts files"
++msgstr "Fisiere de tip hosts aditionale"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Adresa"
++
++msgid "Address to access local relay bridge"
++msgstr "Adresa de acces punte locala repetor"
++
++msgid "Administration"
++msgstr "Administrare"
++
++msgid "Advanced Settings"
++msgstr "Setari avansate"
++
++msgid "Alert"
++msgstr "Alerta"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"Permite autentificarea prin parola a <abbr title=\"Secure Shell\">SSH</abbr> "
++
++msgid "Allow all except listed"
++msgstr "Permite toate cu exceptia celor listate"
++
++msgid "Allow listed only"
++msgstr "Permite doar cele listate"
++
++msgid "Allow localhost"
++msgstr "Permite localhost"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr "Permite statiilor externe sa se conecteze la porturile SSH locale"
++
++msgid "Allow root logins with password"
++msgstr "Permite autentificarea contului root cu parola"
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr "Permite contului <em>root</em> sa se autentifice cu parola"
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++msgstr ""
++"Permite raspuns upstream in plaja 127.0.0.0/8, e.g. pentru serviciile RBL"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr ""
++"Daca lasati aceasta optiune neselectata va fi creata o retea aditionala"
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Antena 1"
++
++msgid "Antenna 2"
++msgstr "Antena 2"
++
++msgid "Antenna Configuration"
++msgstr "Configurarea Antenei"
++
++msgid "Any zone"
++msgstr "Orice Zona"
++
++msgid "Apply"
++msgstr "Aplica"
++
++msgid "Applying changes"
++msgstr "Se aplica modificarile"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Inregistreaza interfetele"
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Statiile asociate"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Atheros 802.11%s Controler Fara Fir"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Autentificare"
++
++msgid "Authoritative"
++msgstr "Autoritare"
++
++msgid "Authorization Required"
++msgstr "Necesita Autorizare"
++
++msgid "Auto Refresh"
++msgstr "Reimprospatare automata"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Disponibil"
++
++msgid "Available packages"
++msgstr "Pachete disponibile"
++
++msgid "Average:"
++msgstr "Medie:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Inapoi"
++
++msgid "Back to Overview"
++msgstr "Inapoi la sumar"
++
++msgid "Back to configuration"
++msgstr "Inapoi la Configurare"
++
++msgid "Back to overview"
++msgstr "Inapoi la vedere generala"
++
++msgid "Back to scan results"
++msgstr "Inapoi la rezultatele scanarii"
++
++msgid "Background Scan"
++msgstr "Scanare in fundal"
++
++msgid "Backup / Flash Firmware"
++msgstr "Salveaza / Scrie Firmware"
++
++msgid "Backup / Restore"
++msgstr "Salveaza / Restaureaza"
++
++msgid "Backup file list"
++msgstr "Salveaza lista fisiere"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++
++msgid "Bitrate"
++msgstr "Bitrate"
++
++msgid "Bogus NX Domain Override"
++msgstr "Bogus NX Domain Override"
++
++msgid "Bridge"
++msgstr "Punte"
++
++msgid "Bridge interfaces"
++msgstr "Leaga interfetele"
++
++msgid "Bridge unit number"
++msgstr "Numarul unitatii in punte"
++
++msgid "Bring up on boot"
++msgstr "Activeaza la pornire"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Broadcom 802.11%s Controller Fara Fir"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Broadcom BCM%04x 802.11 Controller Fara Fir"
++
++msgid "Buffered"
++msgstr "Incarcat"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Butoane"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "Procesor"
++
++msgid "CPU usage (%)"
++msgstr "Utilizarea procesorului (%)"
++
++msgid "Cancel"
++msgstr "Anuleaza"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Lant"
++
++msgid "Changes"
++msgstr "Modificari"
++
++msgid "Changes applied."
++msgstr "Modificari aplicate."
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "Schimba parola administratorului pentru accesarea dispozitivului"
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check"
++msgstr "Verificare"
++
++msgid "Checksum"
++msgstr "Suma de verificare"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Alege zona paravanului care doresti sa o aloci acestei interfete. Selecteaza "
++"<em>nespecificat</em> pentru a sterge interfata sau golire <em>creaza</em> "
++"camp ce defineste o zona noua asociata interfetei."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++
++msgid "Cipher"
++msgstr ""
++
++msgid ""
++"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)."
++msgstr ""
++
++msgid "Client"
++msgstr ""
++
++msgid "Client ID to send when requesting DHCP"
++msgstr ""
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++
++msgid "Close list..."
++msgstr ""
++
++msgid "Collecting data..."
++msgstr "Colectez datele.."
++
++msgid "Command"
++msgstr "Comanda"
++
++msgid "Common Configuration"
++msgstr "Configurarea obisnuita"
++
++msgid "Compression"
++msgstr "Comprimare"
++
++msgid "Configuration"
++msgstr "Configurare"
++
++msgid "Configuration applied."
++msgstr "Configurarea aplicata."
++
++msgid "Configuration files will be kept."
++msgstr "Fisierele de configurare vor fi pastrate."
++
++msgid "Confirmation"
++msgstr "Confirmare"
++
++msgid "Connect"
++msgstr "Conectare"
++
++msgid "Connected"
++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 "Country"
++msgstr "Tara"
++
++msgid "Country Code"
++msgstr "Codul de tara"
++
++msgid "Cover the following interface"
++msgstr ""
++
++msgid "Cover the following interfaces"
++msgstr ""
++
++msgid "Create / Assign firewall-zone"
++msgstr ""
++
++msgid "Create Interface"
++msgstr "Creaza interfata"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr ""
++
++msgid "Critical"
++msgstr "Critic"
++
++msgid "Cron Log Level"
++msgstr ""
++
++msgid "Custom Interface"
++msgstr ""
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++
++msgid "DHCP Leases"
++msgstr "Conexiuni DHCP"
++
++msgid "DHCP Server"
++msgstr "Server DHCP"
++
++msgid "DHCP and DNS"
++msgstr "DHCP si DNS"
++
++msgid "DHCP client"
++msgstr ""
++
++msgid "DHCP-Options"
++msgstr "Optiuni DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr ""
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr ""
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Default %d"
++msgstr ""
++
++msgid "Default gateway"
++msgstr ""
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Stare implicita"
++
++msgid "Define a name for this network."
++msgstr "Definiti un nume pentru aceasta retea."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++
++msgid "Delete"
++msgstr "Sterge"
++
++msgid "Delete this interface"
++msgstr "Sterge aceasta interfata"
++
++msgid "Delete this network"
++msgstr "Sterge aceasta retea"
++
++msgid "Description"
++msgstr "Descriere"
++
++msgid "Design"
++msgstr ""
++
++msgid "Destination"
++msgstr "Destinatie"
++
++msgid "Device"
++msgstr "Dispozitiv"
++
++msgid "Device Configuration"
++msgstr "Configurarea dispozitivului"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "Diagnosticuri"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Director"
++
++msgid "Disable"
++msgstr "Dezactiveaza"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Dezactiveaza <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++"pentru aceasta interfata."
++
++msgid "Disable DNS setup"
++msgstr "Dezactiveaza configuratia DNS"
++
++msgid "Disable HW-Beacon timer"
++msgstr ""
++
++msgid "Disabled"
++msgstr "Dezactivat"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr ""
++
++msgid "Displaying only packages containing"
++msgstr ""
++
++msgid "Distance Optimization"
++msgstr "Optimizarea distantei"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Distanta catre cel mai departat membru din retea in metri."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Diversitate"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 ""
++
++msgid "Do not send probe responses"
++msgstr ""
++
++msgid "Domain required"
++msgstr "Domeniul necesar"
++
++msgid "Domain whitelist"
++msgstr ""
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++
++msgid "Download and install package"
++msgstr "Descarca si instaleaza pachetul"
++
++msgid "Download backup"
++msgstr "Descarca backup"
++
++msgid "Dropbear Instance"
++msgstr "Instanta dropbear"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++
++msgid "Dynamic tunnel"
++msgstr ""
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr ""
++
++msgid "Edit"
++msgstr "Editeaza"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Editeaza aceasta interfata"
++
++msgid "Edit this network"
++msgstr "Editeaza aceasta retea"
++
++msgid "Emergency"
++msgstr "Urgenta"
++
++msgid "Enable"
++msgstr "Activeaza"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Activeaza <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr ""
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr ""
++
++msgid "Enable NTP client"
++msgstr ""
++
++msgid "Enable TFTP server"
++msgstr "Activeaza serverul TFTP"
++
++msgid "Enable VLAN functionality"
++msgstr "Activeaza VLAN-urile"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr ""
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr ""
++
++msgid "Enable this swap"
++msgstr ""
++
++msgid "Enable/Disable"
++msgstr "Activeaza/Dezactiveaza"
++
++msgid "Enabled"
++msgstr "Activat"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr ""
++
++msgid "Encapsulation mode"
++msgstr "Modul de incapsulare"
++
++msgid "Encryption"
++msgstr "Criptare"
++
++msgid "Erasing..."
++msgstr "Stergere..."
++
++msgid "Error"
++msgstr "Eroare"
++
++msgid "Ethernet Adapter"
++msgstr "Adaptor de retea ethernet"
++
++msgid "Ethernet Switch"
++msgstr "Switch-ul ethernet"
++
++msgid "Expand hosts"
++msgstr ""
++
++msgid "Expires"
++msgstr "Expira"
++
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Server de log-uri extern"
++
++msgid "External system log server port"
++msgstr "Portul serverului de log-uri extern"
++
++msgid "Fast Frames"
++msgstr ""
++
++msgid "File"
++msgstr "Fisier"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr ""
++
++msgid "Filesystem"
++msgstr "Sistem de fisiere"
++
++msgid "Filter"
++msgstr "Filtreaza"
++
++msgid "Filter private"
++msgstr "Filtreaza privatele"
++
++msgid "Filter useless"
++msgstr "Filtreaza nefolositele"
++
++msgid "Find and join network"
++msgstr "Gaseste si alatura in retea"
++
++msgid "Find package"
++msgstr "Gaseste pachet"
++
++msgid "Finish"
++msgstr "Termina"
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall Settings"
++msgstr "Setarile firewall-ului"
++
++msgid "Firewall Status"
++msgstr "Status la firewall"
++
++msgid "Firmware Version"
++msgstr "Versiunea de firmware"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "Portul sursa pentru intrebarile DNS catre exterior"
++
++msgid "Flags"
++msgstr ""
++
++msgid "Flash Firmware"
++msgstr "Rescrie firmware"
++
++msgid "Flash image..."
++msgstr ""
++
++msgid "Flash new firmware image"
++msgstr ""
++
++msgid "Flash operations"
++msgstr ""
++
++msgid "Flashing..."
++msgstr ""
++
++msgid "Force"
++msgstr "Forteaza"
++
++msgid "Force CCMP (AES)"
++msgstr "Forteaza CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++"Forteaza facilitatea DHCP in aceasta retea chiar daca alt server DHCP exista."
++
++msgid "Force TKIP"
++msgstr "Forteaza TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "Forteaza TKIP si CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr ""
++
++msgid "Forward broadcast traffic"
++msgstr ""
++
++msgid "Forwarding mode"
++msgstr ""
++
++msgid "Fragmentation Threshold"
++msgstr ""
++
++msgid "Frame Bursting"
++msgstr ""
++
++msgid "Free"
++msgstr "Liber"
++
++msgid "Free space"
++msgstr "Spatiu liber"
++
++msgid "GHz"
++msgstr ""
++
++msgid "GPRS only"
++msgstr "Doar GPRS"
++
++msgid "Gateway"
++msgstr "Gateway"
++
++msgid "Gateway ports"
++msgstr "Porturile gateway"
++
++msgid "General Settings"
++msgstr "Setari principale"
++
++msgid "General Setup"
++msgstr "Configurare generala"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr ""
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr "Confirmarea parolei nu se potriveste cu prima, parola neschimbata !"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr ""
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr ""
++
++msgid "Hang Up"
++msgstr ""
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Aici poti configura aspectele de baza ale dispozitivului cum ar fi numele "
++"sau fusul orar."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "Ascunde <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "Intrari de tip host"
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Numele de host"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr ""
++
++msgid "Hostnames"
++msgstr "Nume de host"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "Adresa IP"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "Firewall IPv4"
++
++msgid "IPv4 WAN Status"
++msgstr "Statusul IPv4 pe WAN"
++
++msgid "IPv4 address"
++msgstr "Adresa IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 si IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid "IPv4 gateway"
++msgstr ""
++
++msgid "IPv4 netmask"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr "Doar IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr "Adresa IPv4"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "Firewall IPv6"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "Statusul IPv6 pe WAN"
++
++msgid "IPv6 address"
++msgstr "Adresa IPv6"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr "Doar IPv6"
++
++msgid "IPv6 prefix"
++msgstr ""
++
++msgid "IPv6 prefix length"
++msgstr ""
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr ""
++
++msgid "Identity"
++msgstr "Identitate"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++
++msgid "If unchecked, no default route is configured"
++msgstr ""
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr ""
++
++msgid "Ignore resolve file"
++msgstr ""
++
++msgid "Image"
++msgstr "Imagine"
++
++msgid "In"
++msgstr ""
++
++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 ""
++
++msgid "Inbound:"
++msgstr "Intrare:"
++
++msgid "Info"
++msgstr "Informatii"
++
++msgid "Initscript"
++msgstr "Script de initializare"
++
++msgid "Initscripts"
++msgstr "Scripturi de initializare"
++
++msgid "Install"
++msgstr "Instalati"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "Instalati pachetul %q"
++
++msgid "Install protocol extensions..."
++msgstr ""
++
++msgid "Installed packages"
++msgstr "Pachete instalate"
++
++msgid "Interface"
++msgstr "Interfata"
++
++msgid "Interface Configuration"
++msgstr "Configurarea interfetei"
++
++msgid "Interface Overview"
++msgstr "Prezentare interfata"
++
++msgid "Interface is reconnecting..."
++msgstr "Interfata se reconecteaza.."
++
++msgid "Interface is shutting down..."
++msgstr "Interfata se opreste.."
++
++msgid "Interface not present or not connected yet."
++msgstr "Interfata nu e prezenta sau nu este conectata inca."
++
++msgid "Interface reconnected"
++msgstr "Interfata reconectata"
++
++msgid "Interface shut down"
++msgstr "Interfata oprita"
++
++msgid "Interfaces"
++msgstr "Interfete"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "Eroare interna de server"
++
++msgid "Invalid"
++msgstr "Invalid"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Utilizator si/sau parola invalide! Incearcati din nou."
++
++#, 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 ""
++"Se pare ca ai incercat sa rescrii o imagine care nu are loc in memoria "
++"flash, verifica fisierul din nou!"
++
++msgid "Java Script required!"
++msgstr "Ai nevoie de Java Script !"
++
++msgid "Join Network"
++msgstr ""
++
++msgid "Join Network: Settings"
++msgstr ""
++
++msgid "Join Network: Wireless Scan"
++msgstr ""
++
++msgid "Keep settings"
++msgstr "Pastrati setarile"
++
++msgid "Kernel Log"
++msgstr "Log-ul kernelului"
++
++msgid "Kernel Version"
++msgstr "Versiunea de kernel"
++
++msgid "Key"
++msgstr ""
++
++msgid "Key #%d"
++msgstr ""
++
++msgid "Kill"
++msgstr "Opreste"
++
++msgid "L2TP"
++msgstr ""
++
++msgid "L2TP Server"
++msgstr ""
++
++msgid "LCP echo failure threshold"
++msgstr ""
++
++msgid "LCP echo interval"
++msgstr ""
++
++msgid "LLC"
++msgstr ""
++
++msgid "Label"
++msgstr "Eticheta"
++
++msgid "Language"
++msgstr "Limba"
++
++msgid "Language and Style"
++msgstr "Limba si stilul interfetei"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Leasefile"
++msgstr ""
++
++msgid "Leasetime"
++msgstr ""
++
++msgid "Leasetime remaining"
++msgstr ""
++
++msgid "Leave empty to autodetect"
++msgstr ""
++
++msgid "Leave empty to use the current WAN address"
++msgstr ""
++
++msgid "Legend:"
++msgstr "Legenda:"
++
++msgid "Limit"
++msgstr "Limita"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr ""
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++
++msgid "Listening port for inbound DNS queries"
++msgstr ""
++
++msgid "Load"
++msgstr "Incarcarea"
++
++msgid "Load Average"
++msgstr "Incarcarea medie"
++
++msgid "Loading"
++msgstr "Incarcare"
++
++msgid "Local IPv4 address"
++msgstr "Adresa IPv4 locala"
++
++msgid "Local IPv6 address"
++msgstr "Adresa IPv6 locala"
++
++msgid "Local Startup"
++msgstr ""
++
++msgid "Local Time"
++msgstr "Ora locala"
++
++msgid "Local domain"
++msgstr "Domeniu local"
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr "Server local"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr ""
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr ""
++
++msgid "Log queries"
++msgstr ""
++
++msgid "Logging"
++msgstr ""
++
++msgid "Login"
++msgstr "Autentificare"
++
++msgid "Logout"
++msgstr "Iesire"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr ""
++
++msgid "MAC-Address Filter"
++msgstr ""
++
++msgid "MAC-Filter"
++msgstr ""
++
++msgid "MAC-List"
++msgstr ""
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr ""
++
++msgid "MHz"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Rata maxima"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr ""
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "Numarul maxim de intrebari DNS simultane"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++
++msgid "Maximum hold time"
++msgstr ""
++
++msgid "Maximum number of leased addresses."
++msgstr ""
++
++msgid "Mbit/s"
++msgstr ""
++
++msgid "Memory"
++msgstr "Memorie"
++
++msgid "Memory usage (%)"
++msgstr "Utilizarea memoriei (%)"
++
++msgid "Metric"
++msgstr "Metrica"
++
++msgid "Minimum Rate"
++msgstr "Rata minima"
++
++msgid "Minimum hold time"
++msgstr ""
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr ""
++
++msgid "Mode"
++msgstr "Mod"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr ""
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr ""
++
++msgid "Mount Entry"
++msgstr ""
++
++msgid "Mount Point"
++msgstr ""
++
++msgid "Mount Points"
++msgstr ""
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++
++msgid "Mount options"
++msgstr ""
++
++msgid "Mount point"
++msgstr ""
++
++msgid "Mounted file systems"
++msgstr ""
++
++msgid "Move down"
++msgstr ""
++
++msgid "Move up"
++msgstr ""
++
++msgid "Multicast Rate"
++msgstr "Rata de multicast"
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "NAS ID"
++msgstr ""
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr ""
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Nume"
++
++msgid "Name of the new interface"
++msgstr "Numele interfetei noi"
++
++msgid "Name of the new network"
++msgstr "Numele interfetei noi"
++
++msgid "Navigation"
++msgstr "Navigare"
++
++msgid "Netmask"
++msgstr "Netmask"
++
++msgid "Network"
++msgstr "Retea"
++
++msgid "Network Utilities"
++msgstr "Utilitare de retea"
++
++msgid "Network boot image"
++msgstr ""
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr "Mai departe »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Nici un server DHCP configurat pentru aceasta interfata"
++
++msgid "No chains in this table"
++msgstr ""
++
++msgid "No files found"
++msgstr "Nici un fisier gasit"
++
++msgid "No information available"
++msgstr "Nici o informatie disponibila"
++
++msgid "No negative cache"
++msgstr ""
++
++msgid "No network configured on this device"
++msgstr "Nici o retea configurata pe acest dispozitiv"
++
++msgid "No network name specified"
++msgstr ""
++
++msgid "No package lists available"
++msgstr ""
++
++msgid "No password set!"
++msgstr "Nici o parola setata !"
++
++msgid "No rules in this chain"
++msgstr ""
++
++msgid "No zone assigned"
++msgstr ""
++
++msgid "Noise"
++msgstr "Zgomot"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Zgomot:"
++
++msgid "None"
++msgstr ""
++
++msgid "Normal"
++msgstr "Normal"
++
++msgid "Not Found"
++msgstr "Nu a fost gasit"
++
++msgid "Not associated"
++msgstr "Nu este asociat."
++
++msgid "Not connected"
++msgstr "Nu este conectat"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Nota: fisierele de configurare vor fi sterse."
++
++msgid "Notice"
++msgstr "Notificare"
++
++msgid "Nslookup"
++msgstr ""
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "Configuratia-OPKG"
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++
++msgid "One or more fields contain invalid values!"
++msgstr "Unul sau mai multe campuri contin valori invalide !"
++
++msgid "One or more required fields have no value!"
++msgstr "Unul sau mai multe campuri nu contin valori !"
++
++msgid "Open list..."
++msgstr ""
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "Optiunea schimbata"
++
++msgid "Option removed"
++msgstr "Optiunea eliminata"
++
++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 "Options"
++msgstr "Optiuni"
++
++msgid "Other:"
++msgstr "Altele:"
++
++msgid "Out"
++msgstr "Iesire"
++
++msgid "Outbound:"
++msgstr ""
++
++msgid "Outdoor Channels"
++msgstr ""
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr "Prezentare generala"
++
++msgid "Owner"
++msgstr "Proprietar"
++
++msgid "PAP/CHAP password"
++msgstr ""
++
++msgid "PAP/CHAP username"
++msgstr ""
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr ""
++
++msgid "PPP"
++msgstr ""
++
++msgid "PPPoA Encapsulation"
++msgstr "Incapsulare PPPoA"
++
++msgid "PPPoATM"
++msgstr ""
++
++msgid "PPPoE"
++msgstr ""
++
++msgid "PPtP"
++msgstr ""
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "Pachetul libiwinfo este necesar !"
++
++msgid "Package lists are older than 24 hours"
++msgstr ""
++
++msgid "Package name"
++msgstr "Numele pachetului"
++
++msgid "Packets"
++msgstr "Pachete"
++
++msgid "Part of zone %q"
++msgstr ""
++
++msgid "Password"
++msgstr "Parola"
++
++msgid "Password authentication"
++msgstr "Autentificarea cu parola"
++
++msgid "Password of Private Key"
++msgstr "Parola cheii private"
++
++msgid "Password successfully changed!"
++msgstr "Parola schimbata cu succes !"
++
++msgid "Path to CA-Certificate"
++msgstr "Calea catre certificatul CA"
++
++msgid "Path to Client-Certificate"
++msgstr ""
++
++msgid "Path to Private Key"
++msgstr "Calea catre cheia privata"
++
++msgid "Path to executable which handles the button event"
++msgstr "Calea catre executabilul care se ocupa de evenimentul butonului"
++
++msgid "Peak:"
++msgstr "Maxim:"
++
++msgid "Perform reboot"
++msgstr "Restarteaza"
++
++msgid "Perform reset"
++msgstr "Reseteaza"
++
++msgid "Phy Rate:"
++msgstr "Rata phy:"
++
++msgid "Physical Settings"
++msgstr "Setarile fizice"
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr "Packete."
++
++msgid "Please enter your username and password."
++msgstr "Introdu utilizatorul si parola."
++
++msgid "Policy"
++msgstr ""
++
++msgid "Port"
++msgstr "Port"
++
++msgid "Port %d"
++msgstr "Port %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr "Stare port:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr ""
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr "Continua"
++
++msgid "Processes"
++msgstr "Procese"
++
++msgid "Prot."
++msgstr ""
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Protocol family"
++msgstr "Familia de protocol"
++
++msgid "Protocol of the new interface"
++msgstr ""
++
++msgid "Protocol support is not installed"
++msgstr ""
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr ""
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "Calitate"
++
++msgid "RTS/CTS Threshold"
++msgstr ""
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr ""
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"Citeste fisierul <code>/etc/ethers</code> pentru configurarea serverului "
++"<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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr ""
++
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr ""
++
++msgid "Realtime Connections"
++msgstr "Conexiuni in timp real"
++
++msgid "Realtime Graphs"
++msgstr "Grafice in timp real"
++
++msgid "Realtime Load"
++msgstr "Incarcarea in timp real"
++
++msgid "Realtime Traffic"
++msgstr "Traficul in timp real"
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr "Rebooteaza"
++
++msgid "Rebooting..."
++msgstr ""
++
++msgid "Reboots the operating system of your device"
++msgstr "Rebooteaza sistemul de operare al dispozitivului tau"
++
++msgid "Receive"
++msgstr ""
++
++msgid "Receiver Antenna"
++msgstr "Antena receptorului"
++
++msgid "Reconnect this interface"
++msgstr "Reconecteaza aceasta interfata"
++
++msgid "Reconnecting interface"
++msgstr "Interfata se reconecteaza chiar acum"
++
++msgid "References"
++msgstr "Referinte"
++
++msgid "Regulatory Domain"
++msgstr "Domeniu regulatoriu"
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr ""
++
++msgid "Remove"
++msgstr "Elimina"
++
++msgid "Repeat scan"
++msgstr "Repeta scanarea"
++
++msgid "Replace entry"
++msgstr "Inlocuieste intrarea"
++
++msgid "Replace wireless configuration"
++msgstr "Inlocuieste configuratia wireless"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++
++msgid "Reset"
++msgstr "Reset"
++
++msgid "Reset Counters"
++msgstr "Reseteaza counterii"
++
++msgid "Reset to defaults"
++msgstr ""
++
++msgid "Resolv and Hosts Files"
++msgstr "Fisierele de rezolvare si hosturi DNS"
++
++msgid "Resolve file"
++msgstr "Fisierul de rezolvare"
++
++msgid "Restart"
++msgstr "Restart"
++
++msgid "Restart Firewall"
++msgstr "Restarteaza firewallul"
++
++msgid "Restore backup"
++msgstr "Reface backup-ul"
++
++msgid "Reveal/hide password"
++msgstr "Arata / ascunde parola"
++
++msgid "Revert"
++msgstr ""
++
++msgid "Root"
++msgstr ""
++
++msgid "Root directory for files served via TFTP"
++msgstr ""
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Parola routerului"
++
++msgid "Routes"
++msgstr "Rute"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++
++msgid "Rule #"
++msgstr "Regula #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr "Acces SSH"
++
++msgid "SSH-Keys"
++msgstr "Cheile SSH"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Salveaza"
++
++msgid "Save & Apply"
++msgstr "Salveaza si aplica"
++
++msgid "Save &#38; Apply"
++msgstr "Salveaza &#38; Aplica"
++
++msgid "Scan"
++msgstr "Scan"
++
++msgid "Scheduled Tasks"
++msgstr "Operatiuni programate"
++
++msgid "Section added"
++msgstr "Sectiune adaugata"
++
++msgid "Section removed"
++msgstr "Sectiune eliminata"
++
++msgid "See \"mount\" manpage for details"
++msgstr ""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr ""
++
++msgid "Separate WDS"
++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"
++
++msgid "Service Type"
++msgstr "Tip de serviciu"
++
++msgid "Services"
++msgstr "Servicii"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "Configurare sincronizare timp"
++
++msgid "Setup DHCP Server"
++msgstr "Seteaza serverul DHCP"
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr "Opreste aceasta interfata"
++
++msgid "Shutdown this network"
++msgstr "Opreste aceasta retea"
++
++msgid "Signal"
++msgstr "Semnal"
++
++msgid "Signal:"
++msgstr "Semnal:"
++
++msgid "Size"
++msgstr "Marime"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr ""
++
++msgid "Skip to content"
++msgstr ""
++
++msgid "Skip to navigation"
++msgstr ""
++
++msgid "Slot time"
++msgstr ""
++
++msgid "Software"
++msgstr "Software"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr ""
++
++msgid "Sorry, the object you requested was not found."
++msgstr ""
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr ""
++
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++
++msgid "Sort"
++msgstr ""
++
++msgid "Source"
++msgstr "Sursa"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr ""
++
++msgid "Start"
++msgstr "Start"
++
++msgid "Start priority"
++msgstr ""
++
++msgid "Startup"
++msgstr "Pornire"
++
++msgid "Static IPv4 Routes"
++msgstr "Rute statice IPv4"
++
++msgid "Static IPv6 Routes"
++msgstr "Rute statice IPv6"
++
++msgid "Static Leases"
++msgstr ""
++
++msgid "Static Routes"
++msgstr "Rute statice"
++
++msgid "Static WDS"
++msgstr ""
++
++msgid "Static address"
++msgstr ""
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Stop"
++msgstr "Stop"
++
++msgid "Strict order"
++msgstr ""
++
++msgid "Submit"
++msgstr "Trimite"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr ""
++
++msgid "Switch"
++msgstr ""
++
++msgid "Switch %q"
++msgstr ""
++
++msgid "Switch %q (%s)"
++msgstr ""
++
++msgid "Switch protocol"
++msgstr ""
++
++msgid "Sync with browser"
++msgstr ""
++
++msgid "Synchronizing..."
++msgstr ""
++
++msgid "System"
++msgstr "Sistem"
++
++msgid "System Log"
++msgstr "Log de sistem"
++
++msgid "System Properties"
++msgstr "Proprietati sistem"
++
++msgid "System log buffer size"
++msgstr ""
++
++msgid "TCP:"
++msgstr ""
++
++msgid "TFTP Settings"
++msgstr "Setarile TFTP"
++
++msgid "TFTP server root"
++msgstr ""
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr ""
++
++msgid "Table"
++msgstr "Tabel"
++
++msgid "Target"
++msgstr "Tinta"
++
++msgid "Terminate"
++msgstr "Termina"
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++
++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 ""
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++
++msgid "The following changes have been committed"
++msgstr ""
++
++msgid "The following changes have been reverted"
++msgstr ""
++
++msgid "The following rules are currently active on this system."
++msgstr ""
++
++msgid "The given network name is not unique"
++msgstr ""
++
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr ""
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"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."
++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 pending changes to revert!"
++msgstr "Nu exista modificari in asteptare de anulat !"
++
++msgid "There are no pending changes!"
++msgstr "Nu exista modificari in asteptare !"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"Nu exista o parola pe acest router. Configureaza o parola la contul root "
++"pentru a proteja interfata web si porni SSH."
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++
++msgid "This is the plain username for logging into the account"
++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 ""
++
++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 allows the configuration of custom button actions"
++msgstr ""
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time Synchronization"
++msgstr ""
++
++msgid "Time Synchronization is not configured yet."
++msgstr ""
++
++msgid "Timezone"
++msgstr "Fusul orar"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++
++msgid "Total Available"
++msgstr "Total disponibil"
++
++msgid "Traceroute"
++msgstr ""
++
++msgid "Traffic"
++msgstr "Trafic"
++
++msgid "Transfer"
++msgstr "Transfer"
++
++msgid "Transmission Rate"
++msgstr "Rata de transmitere"
++
++msgid "Transmit"
++msgstr ""
++
++msgid "Transmit Power"
++msgstr "Puterea de transmitere"
++
++msgid "Transmitter Antenna"
++msgstr "Antena de transmitere"
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr ""
++
++msgid "Tunnel Interface"
++msgstr "Interfata de tunel"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Mod turbo"
++
++msgid "Tx-Power"
++msgstr "Puterea TX"
++
++msgid "Type"
++msgstr "Tip"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "Doar UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr ""
++
++msgid "USB Device"
++msgstr "Dispozitiv USB"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr "Necunoscut"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Eroare necunoscuta, parola neschimbata !"
++
++msgid "Unmanaged"
++msgstr "Neadministrate"
++
++msgid "Unsaved Changes"
++msgstr "Modificari nesalvate"
++
++msgid "Unsupported protocol type."
++msgstr "Tipul de protocol neacceptat."
++
++msgid "Update lists"
++msgstr ""
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr ""
++
++msgid "Uploaded File"
++msgstr "Fisier incarcat"
++
++msgid "Uptime"
++msgstr "Uptime"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Foloseste <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr ""
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "Foloseste codurile de tara ISO/IEC 3166 alpha2."
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr ""
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr ""
++
++msgid "Use default gateway"
++msgstr ""
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr ""
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr "Folosit"
++
++msgid "Used Key Slot"
++msgstr "Slot de cheie folosit"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Utilizator"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "Interfata VLAN"
++
++msgid "VLANs on %q"
++msgstr "VLANuri pe %q"
++
++msgid "VLANs on %q (%s)"
++msgstr ""
++
++msgid "VPN Server"
++msgstr ""
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr "Versiune"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "Sistem deschis WEP"
++
++msgid "WEP Shared Key"
++msgstr "Sistem de cheie impartasita WEP"
++
++msgid "WEP passphrase"
++msgstr "Parola WEP"
++
++msgid "WMM Mode"
++msgstr "Mod WMM"
++
++msgid "WPA passphrase"
++msgstr "Parola WPA"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Avertizare"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr "Wireless"
++
++msgid "Wireless Adapter"
++msgstr "Adaptorul wireless"
++
++msgid "Wireless Network"
++msgstr "Retea wireless"
++
++msgid "Wireless Overview"
++msgstr "Sumarul wireless"
++
++msgid "Wireless Security"
++msgstr "Securitate wireless"
++
++msgid "Wireless is disabled or not associated"
++msgstr "Wireless-ul este dezactivat sau ne-asociat"
++
++msgid "Wireless is restarting..."
++msgstr "Wireless-ul se restarteaza.."
++
++msgid "Wireless network is disabled"
++msgstr "Reteaua wireless este dezactivata"
++
++msgid "Wireless network is enabled"
++msgstr "Reteaua wireless este activata"
++
++msgid "Wireless restarted"
++msgstr "Wireless-ul restartat"
++
++msgid "Wireless shut down"
++msgstr "Wireless-ul oprit"
++
++msgid "Write received DNS requests to syslog"
++msgstr "Scrie cererile DNS primite in syslog"
++
++msgid "XR Support"
++msgstr "Suport XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++
++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 ""
++
++msgid "any"
++msgstr "oricare"
++
++msgid "auto"
++msgstr "auto"
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr ""
++
++msgid "bridged"
++msgstr ""
++
++msgid "create:"
++msgstr ""
++
++msgid "creates a bridge over specified interface(s)"
++msgstr ""
++
++msgid "dB"
++msgstr ""
++
++msgid "dBm"
++msgstr ""
++
++msgid "disable"
++msgstr "dezactiveaza"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "expirat"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++
++msgid "forward"
++msgstr ""
++
++msgid "full-duplex"
++msgstr ""
++
++msgid "half-duplex"
++msgstr ""
++
++msgid "help"
++msgstr "ajutor"
++
++msgid "hidden"
++msgstr "ascuns"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "daca tinta este o retea"
++
++msgid "input"
++msgstr ""
++
++msgid "kB"
++msgstr ""
++
++msgid "kB/s"
++msgstr ""
++
++msgid "kbit/s"
++msgstr ""
++
++msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
++msgstr ""
++
++msgid "minimum 1280, maximum 1480"
++msgstr ""
++
++msgid "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "nu"
++
++msgid "no link"
++msgstr ""
++
++msgid "none"
++msgstr ""
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr ""
++
++msgid "on"
++msgstr ""
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "rutat"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "etichetat"
++
++msgid "unknown"
++msgstr "necunoscut"
++
++msgid "unlimited"
++msgstr "nelimitat"
++
++msgid "unspecified"
++msgstr "nespecificat"
++
++msgid "unspecified -or- create:"
++msgstr ""
++
++msgid "untagged"
++msgstr "neetichetat"
++
++msgid "yes"
++msgstr "da"
++
++msgid "« Back"
++msgstr "« Inapoi"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Asteapta: dispozitivul se restarteaza.."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Atentie: exista modificari nesalvate care vor fi pierdute la restart !"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Intotdeauna foloseste canalul de 40MHz chiar daca canalul secundar da "
++#~ "rateu. Folosirea acestei optiuni nu este compatibila cu IEEE 802.11n-2009!"
++
++#~ msgid "Cached"
++#~ msgstr "Asimilat"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "Foloseste ca sistem de fisiere primar"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz 2 canale de mai jos"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz 2 canale de mai sus"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Accepta anunturile routerului"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Anunta IPv6 in retea"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "ID-ul retelei anuntate"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "Plaja permisa este de la 1 la 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "Capabilitati HT"
++
++#~ msgid "HT mode"
++#~ msgstr "Mod HT"
++
++#~ msgid "Router Model"
++#~ msgstr "Modelul routerului"
++
++#~ msgid "Router Name"
++#~ msgstr "Numele routerului"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Asteptam dupa router.."
++
++#~ msgid "Active Leases"
++#~ msgstr "Conexiuni dhcp active"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "Configurare / Aplica"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "Configurare / Schimbari"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "Configurare / Anuleaza schimbarile"
++
++#~ msgid "Create Network"
++#~ msgstr "Creaza retea"
++
++#~ msgid "Networks"
++#~ msgstr "Retele"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Retele wireless in apropiere"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "Adresa <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
++
++#~ msgid "IP-Aliases"
++#~ msgstr "Aliasuri IP"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "Setarea IPv6"
++
++#~ msgid "Detected Files"
++#~ msgstr "Fisiere detectate"
++
++#~ msgid "Detected files"
++#~ msgstr "Fisiere detectate"
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Fisiere de pastrat cand se rescrie firmware-ul"
++
++#~ msgid "General"
++#~ msgstr "General"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Aici poti configura setarile si functionalitatea interfetei web <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr>."
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "<abbr title=\"User Interface\">Interfata</abbr> web"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Optiuni aditionale pentru pppd"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Deconectare automata"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Configureaza serverul local de DNS sa foloseasca serverele de domeniu "
++#~ "anuntate la conexiunea PPP"
++
++#~ msgid "Connect script"
++#~ msgstr "Script de conectare"
++
++#~ msgid "Default"
++#~ msgstr "Implicit"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Script pentru deconectare"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Editeaza lista de pachete si destinatiile de instalare"
++
++#~ msgid "Enable 4K VLANs"
++#~ msgstr "Activeaza 4 mii de VLAN-uri"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Activeaza IPv6 pe legatura PPP"
++
++#~ msgid "Firmware image"
++#~ msgstr "Imaginea de firmware"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Aici poti face backup si restore la configuratia routerului si daca e "
++#~ "posibil chiar resetarea routerului la modul implicit."
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Pastreaza fisierele de configurare"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Keep-Alive"
++
++#~ msgid "Kernel"
++#~ msgstr "Kernel"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "PPPD va inlocui ruta default cu cea oferita de interfata PPP dupa "
++#~ "conectarea cu succes"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr "PPPD va rula acest script dupa stabilirea conexiunii PPP"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "PPPD va rula acest script inainte sa inchida conexiunea PPP"
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr "Numarul de teste de conexiune esuate pentru a reconecta"
++
++#~ msgid "Override Gateway"
++#~ msgstr "Suprascrie gateway"
++
++#~ msgid "PIN code"
++#~ msgstr "Codul PIN"
++
++#~ msgid "PPP Settings"
++#~ msgstr "Setari PPP"
++
++#~ msgid "Package lists"
++#~ msgstr "Lista de pachete"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr "Continua anuland toate modificarile facute si resetand la default?"
++
++#~ msgid "Processor"
++#~ msgstr "Procesor"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Portul radiusului"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Serverul radius"
++
++#~ msgid "Replace default route"
++#~ msgstr "Inlocuieste ruta default"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Reseteaza routerul la default"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr ""
++#~ "Numarul de secunde de asteptat ca modemul sa devine pregatit inainte de "
++#~ "conectare"
++
++#~ msgid "Send Router Solicitiations"
++#~ msgstr "Trimite solicitari de Router"
++
++#~ msgid "Server IPv4-Address"
++#~ msgstr "Adresa IPv4 a serverului"
++
++#~ msgid "Service type"
++#~ msgstr "Tipul de serviciu"
++
++#~ msgid "Settings"
++#~ msgstr "Setari"
++
++#~ msgid "TTL"
++#~ msgstr "TTL"
++
++#~ msgid "Tunnel Settings"
++#~ msgstr "Setarile de tunel"
++
++#~ msgid "Update package lists"
++#~ msgstr "Updateaza lista de pachete"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "Uploadeaza o imagine OpenWRT pentru rescrierea firmware-ului."
++
++#~ msgid "Upload image"
++#~ msgstr "Uploadeaza firmware"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "Foloseste DNS-urile primite pe conexiune"
++
++#~ msgid "VLAN %d"
++#~ msgstr "VLAN %d"
++
++#~ msgid "back"
++#~ msgstr "inapoi"
++
++#~ msgid "static"
++#~ msgstr "static"
+diff --git a/feeds/luci/modules/luci-base/po/ru/base.po b/feeds/luci/modules/luci-base/po/ru/base.po
+new file mode 100644
+index 0000000..8085a6f
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/ru/base.po
+@@ -0,0 +1,4368 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: base\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2014-01-31 21:08+0200\n"
++"Last-Translator: Moon_dark <lenayxa@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d минутное окно, %d Ñекундный интервал)"
++
++msgid "(%s available)"
++msgstr "(%s доÑтупно)"
++
++msgid "(empty)"
++msgstr "(пуÑто)"
++
++msgid "(no interfaces attached)"
++msgstr "(нет ÑвÑзанных интерфейÑов)"
++
++msgid "-- Additional Field --"
++msgstr "-- Дополнительное поле --"
++
++msgid "-- Please choose --"
++msgstr "-- ПожалуйÑта, выберите --"
++
++msgid "-- custom --"
++msgstr "-- пользовательÑкий --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Загрузка за 1 минуту:"
++
++msgid "15 Minute Load:"
++msgstr "Загрузка за 15 минут:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Загрузка за 5 минут:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Базовый идентификатор обÑлуживаниÑ\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "Порт запроÑа <abbr title=\"СиÑтема доменных имён\">DNS</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "Порт <abbr title=\"СиÑтема доменных имён\">DNS</abbr>-Ñервера"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"<abbr title=\"СиÑтема доменных имён\">DNS</abbr> Ñерверы будут опрошены в "
++"порÑдке, определенном в resolvfile файле"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"РаÑширенный идентификатор обÑлуживаниÑ\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Интернет протокол верÑии 4\">IPv4</abbr>-адреÑ"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Интернет протокол верÑии 4\">IPv4</abbr>-Ð°Ð´Ñ€ÐµÑ ÑˆÐ»ÑŽÐ·Ð°"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "МаÑка Ñети <abbr title=\"Интернет протокол верÑии 4\">IPv4</abbr>"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Интернет протокол верÑии 6\">IPv6</abbr>-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ñеть (CIDR)"
++
++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 ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "ÐаÑтройка <abbr title=\"Светодиод\">LED</abbr>"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "Ðазвание <abbr title=\"Светодиод\">LED</abbr>"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "<abbr title=\"Управление доÑтупом к ноÑителю\">MAC</abbr>-адреÑ"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"<abbr title=\"макÑимальное\">МакÑ.</abbr> кол-во аренд <abbr title="
++"\"Протокол динамичеÑкой конфигурации узла\">DHCP</abbr>"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"<abbr title=\"макÑимальный\">МакÑ.</abbr> размер пакета <abbr title="
++"\"Extension Mechanisms for Domain Name System\">EDNS0</abbr>"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr ""
++"<abbr title=\"макÑимальное\">МакÑ.</abbr> кол-во одновременных запроÑов"
++
++# Парный шифр иÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð°Ð´Ñ€ÐµÑной передачи, а групповой - Ð´Ð»Ñ ÑˆÐ¸Ñ€Ð¾ÐºÐ¾Ð²ÐµÑ‰Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ и мультикаÑта
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Парный: %s / Групповой: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "Поддержка AR"
++
++msgid "ARP retry threshold"
++msgstr "Порог повтора ARP"
++
++msgid "ATM Bridges"
++msgstr "МоÑÑ‚Ñ‹ ATM"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "Идентификатор виртуального канала ATM (VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "Идентификатор виртуального пути ATM (VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"ATM-моÑÑ‚Ñ‹ выÑтавлÑÑŽÑ‚ инкапÑулированный Ethernet в ÑоединениÑÑ… AAL5 в "
++"качеÑтве виртуальных Ñетевых интерфейÑов Linux, которые могут быть "
++"иÑпользованы в Ñочетании Ñ DHCP или PPP Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñети провайдера."
++
++msgid "ATM device number"
++msgstr "Ðомер уÑтройÑтва ATM"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Концентратор доÑтупа"
++
++msgid "Access Point"
++msgstr "Точка доÑтупа"
++
++msgid "Action"
++msgstr "ДейÑтвие"
++
++msgid "Actions"
++msgstr "ДейÑтвиÑ"
++
++msgid "Activate this network"
++msgstr "Ðктивировать Ñту Ñеть"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++"Ðктивные маршруты <abbr title=\"Интернет протокол верÑии 4\">IPv4</abbr>"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++"Ðктивные маршруты <abbr title=\"Интернет протокол верÑии 6\">IPv6</abbr>"
++
++msgid "Active Connections"
++msgstr "Ðктивные ÑоединениÑ"
++
++msgid "Active DHCP Leases"
++msgstr "Ðктивные аренды DHCP"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Ðктивные аренды DHCPv6"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Добавить"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++"Добавить ÑÑƒÑ„Ñ„Ð¸ÐºÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ домена к именам, полученным из файлов hosts"
++
++msgid "Add new interface..."
++msgstr "Добавить новый интерфейÑ..."
++
++msgid "Additional Hosts files"
++msgstr "Дополнительные файлы hosts"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "ÐдреÑ"
++
++msgid "Address to access local relay bridge"
++msgstr "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð´Ð¾Ñтупа к локальному моÑту-ретранÑлÑтору"
++
++msgid "Administration"
++msgstr "Управление"
++
++msgid "Advanced Settings"
++msgstr "РаÑширенные наÑтройки"
++
++msgid "Alert"
++msgstr "Ð¢Ñ€ÐµÐ²Ð¾Ð¶Ð½Ð°Ñ ÑитуациÑ"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"Разрешить <abbr title=\"Secure Shell\">SSH</abbr>-аутентификацию Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ "
++"паролÑ"
++
++msgid "Allow all except listed"
++msgstr "Разрешить вÑе, кроме перечиÑленных"
++
++msgid "Allow listed only"
++msgstr "Разрешить только перечиÑленные"
++
++msgid "Allow localhost"
++msgstr "Разрешить локальный хоÑÑ‚"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"Разрешить удалённым хоÑтам подключатьÑÑ Ðº локальным перенаправленным портам "
++"SSH"
++
++msgid "Allow root logins with password"
++msgstr "Разрешить пользователю root вход Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ паролÑ"
++
++msgid "Allow the <em>root</em> user to login with password"
++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, например, Ð´Ð»Ñ RBL-ÑервиÑов"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "ЕÑли вы не выберите Ñту опцию, то будет Ñоздана Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñеть."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Ðнтенна 1"
++
++msgid "Antenna 2"
++msgstr "Ðнтенна 2"
++
++msgid "Antenna Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð°Ð½Ñ‚ÐµÐ½Ð½"
++
++msgid "Any zone"
++msgstr "Ð›ÑŽÐ±Ð°Ñ Ð·Ð¾Ð½Ð°"
++
++msgid "Apply"
++msgstr "ПринÑÑ‚ÑŒ"
++
++msgid "Applying changes"
++msgstr "Применение изменений"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Ðазначить интерфейÑÑ‹..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Подключенные клиенты"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "БеÑпроводной 802.11%s контроллер Atheros"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "ÐутентификациÑ"
++
++msgid "Authoritative"
++msgstr "Ðвторитетный"
++
++msgid "Authorization Required"
++msgstr "ТребуетÑÑ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ"
++
++msgid "Auto Refresh"
++msgstr "Ðвтообновление"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "ДоÑтупно"
++
++msgid "Available packages"
++msgstr "ДоÑтупные пакеты"
++
++msgid "Average:"
++msgstr "СреднÑÑ:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Ðазад"
++
++msgid "Back to Overview"
++msgstr "Ðазад к обзору"
++
++msgid "Back to configuration"
++msgstr "Ðазад к наÑтройке"
++
++msgid "Back to overview"
++msgstr "Ðазад к обзору"
++
++msgid "Back to scan results"
++msgstr "Ðазад к результатам ÑканированиÑ"
++
++msgid "Background Scan"
++msgstr "Фоновое Ñканирование"
++
++msgid "Backup / Flash Firmware"
++msgstr "Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ / прошивка"
++
++msgid "Backup / Restore"
++msgstr "Резервное копирование / ВоÑÑтановление"
++
++msgid "Backup file list"
++msgstr "СпиÑок файлов Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копированиÑ"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"Ðиже приводитÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ð¹ ÑпиÑок файлов Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копированиÑ. Он "
++"ÑоÑтоит из изменённых конфигурационных файлов, отмеченных opkg, необходимых "
++"базовых файлов, а также шаблонов резервного копированиÑ, определённых "
++"пользователем."
++
++msgid "Bitrate"
++msgstr "СкороÑÑ‚ÑŒ"
++
++msgid "Bogus NX Domain Override"
++msgstr "Переопределение поддельного NX-домена"
++
++msgid "Bridge"
++msgstr "МоÑÑ‚"
++
++msgid "Bridge interfaces"
++msgstr "Объединить в моÑÑ‚"
++
++msgid "Bridge unit number"
++msgstr "Ðомер моÑта"
++
++msgid "Bring up on boot"
++msgstr "ЗапуÑтить при загрузке"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "БеÑпроводной 802.11%s контроллер Broadcom"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "БеÑпроводной 802.11 контроллер Broadcom BCM%04x"
++
++msgid "Buffered"
++msgstr "Буферизировано"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Кнопки"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "ЦП"
++
++msgid "CPU usage (%)"
++msgstr "Загрузка ЦП (%)"
++
++msgid "Cancel"
++msgstr "Отменить"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Цепочка"
++
++msgid "Changes"
++msgstr "ИзменениÑ"
++
++msgid "Changes applied."
++msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ñ‹."
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "Изменить пароль админиÑтратора Ð´Ð»Ñ Ð´Ð¾Ñтупа к уÑтройÑтву"
++
++msgid "Channel"
++msgstr "Канал"
++
++msgid "Check"
++msgstr "Проверить"
++
++msgid "Checksum"
++msgstr "ÐšÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Укажите зону, которую вы хотите прикрепить к Ñтому интерфейÑу. Выберите "
++"<em>не определено</em>, чтобы удалить Ñтот Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¸Ð· зоны, или заполните "
++"поле <em>Ñоздать</em>, чтобы определить новую зону и прикрепить к ней Ñтот "
++"интерфейÑ."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Выберите Ñеть (Ñети), которые вы хотите прикрепить к Ñтому беÑпроводному "
++"интерфейÑу, или заполните поле <em>Ñоздать</em>, чтобы определить новую Ñеть."
++
++msgid "Cipher"
++msgstr "Шифрование"
++
++msgid ""
++"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)."
++msgstr ""
++"Ðажмите \"Создать архив\", чтобы загрузить tar-архив текущих "
++"конфигурационных файлов. Ð”Ð»Ñ ÑброÑа наÑтроек прошивки к иÑходному ÑоÑтоÑнию "
++"нажмите \"Выполнить ÑброÑ\" (возможно только Ð´Ð»Ñ squashfs-образов)."
++
++msgid "Client"
++msgstr "Клиент"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "ID клиента при DHCP-запроÑе"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Завершать неактивное Ñоединение поÑле заданного интервала (Ñек.), "
++"иÑпользуйте значение 0 Ð´Ð»Ñ ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ ÑоединениÑ"
++
++msgid "Close list..."
++msgstr "Закрыть ÑпиÑок..."
++
++msgid "Collecting data..."
++msgstr "Сбор информации..."
++
++msgid "Command"
++msgstr "Команда"
++
++msgid "Common Configuration"
++msgstr "ÐžÐ±Ñ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ"
++
++msgid "Compression"
++msgstr "Сжатие"
++
++msgid "Configuration"
++msgstr "КонфигурациÑ"
++
++msgid "Configuration applied."
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð°."
++
++msgid "Configuration files will be kept."
++msgstr "Конфигурационные файлы будут Ñохранены."
++
++msgid "Confirmation"
++msgstr "Подтверждение паролÑ"
++
++msgid "Connect"
++msgstr "Соединить"
++
++msgid "Connected"
++msgstr "Подключен"
++
++msgid "Connection Limit"
++msgstr "Ограничение Ñоединений"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr "СоединениÑ"
++
++msgid "Country"
++msgstr "Страна"
++
++msgid "Country Code"
++msgstr "Код Ñтраны"
++
++msgid "Cover the following interface"
++msgstr "Включить Ñледующий интерфейÑ"
++
++msgid "Cover the following interfaces"
++msgstr "Включить Ñледующие интерфейÑÑ‹"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Создать / назначить зону Ñетевого Ñкрана"
++
++msgid "Create Interface"
++msgstr "Создать интерфейÑ"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Создать моÑÑ‚ над неÑколькими интерфейÑами"
++
++msgid "Critical"
++msgstr "КритичеÑÐºÐ°Ñ ÑитуациÑ"
++
++msgid "Cron Log Level"
++msgstr "Уровень вывода Cron"
++
++msgid "Custom Interface"
++msgstr "ПользовательÑкий интерфейÑ"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"ÐаÑтройка Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ <abbr title=\"Светодиод\">LED</abbr> еÑли Ñто возможно."
++
++msgid "DHCP Leases"
++msgstr "Ðренды DHCP"
++
++msgid "DHCP Server"
++msgstr "DHCP-Ñервер"
++
++msgid "DHCP and DNS"
++msgstr "DHCP и DNS"
++
++msgid "DHCP client"
++msgstr "DHCP-клиент"
++
++msgid "DHCP-Options"
++msgstr "DHCP-ÐаÑтройки"
++
++msgid "DHCPv6 Leases"
++msgstr "Ðренды DHCPv6"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "Перенаправление запроÑов DNS"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "Отладка"
++
++msgid "Default %d"
++msgstr "По умолчанию %d"
++
++msgid "Default gateway"
++msgstr "Шлюз по умолчанию"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Ðачальное ÑоÑтоÑние"
++
++msgid "Define a name for this network."
++msgstr "Укажите Ð¸Ð¼Ñ Ñтой Ñети."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Определить дополнительные опции DHCP, например, "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\", чтобы извеÑтить клиентов о DNS-"
++"Ñерверах."
++
++msgid "Delete"
++msgstr "Удалить"
++
++msgid "Delete this interface"
++msgstr "Удалить Ñтот интерфейÑ"
++
++msgid "Delete this network"
++msgstr "Удалить Ñту Ñеть"
++
++msgid "Description"
++msgstr "ОпиÑание"
++
++msgid "Design"
++msgstr "Тема"
++
++msgid "Destination"
++msgstr "Ðазначение"
++
++msgid "Device"
++msgstr "УÑтройÑтво"
++
++msgid "Device Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑƒÑтройÑтва"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "ДиагноÑтика"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "ДиректориÑ"
++
++msgid "Disable"
++msgstr "Отключить"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Отключить <abbr title=\"Протокол динамичеÑкой конфигурации узла\">DHCP</"
++"abbr> Ð´Ð»Ñ Ñтого интерфейÑа."
++
++msgid "Disable DNS setup"
++msgstr "Отключить наÑтройку DNS"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Отключить таймер HW-Beacon"
++
++msgid "Disabled"
++msgstr "Отключено"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "ОтбраÑывать ответы RFC1918"
++
++msgid "Displaying only packages containing"
++msgstr "ПоказываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ пакеты, Ñодержащие"
++
++msgid "Distance Optimization"
++msgstr "ÐžÐ¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ€Ð°ÑÑтоÑниÑ"
++
++msgid "Distance to farthest network member in meters."
++msgstr "РаÑÑтоÑние до Ñамого удалённого Ñетевого узла в метрах."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "РазновидноÑÑ‚ÑŒ антенн"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq Ñодержит в Ñебе <abbr title=\"Протокол динамичеÑкой конфигурации узла"
++"\">DHCP</abbr>-Ñервер и <abbr title=\"Служба доменных имён\">DNS</abbr>-"
++"прокÑи Ð´Ð»Ñ Ñетевых Ñкранов <abbr title=\"Преобразование Ñетевых адреÑов"
++"\">NAT</abbr>"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++msgstr "Ðе кешировать отрицательные ответы, в Ñ‚.ч. Ð´Ð»Ñ Ð½ÐµÑущеÑтвующих доменов"
++
++msgid "Do not forward requests that cannot be answered by public name servers"
++msgstr ""
++"Ðе перенаправлÑÑ‚ÑŒ запроÑÑ‹, которые не могут быть обработаны публичными DNS-"
++"Ñерверами"
++
++msgid "Do not forward reverse lookups for local networks"
++msgstr "Ðе перенаправлÑÑ‚ÑŒ обратные DNS-запроÑÑ‹ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… Ñетей"
++
++msgid "Do not send probe responses"
++msgstr "Ðе поÑылать теÑтовые ответы"
++
++msgid "Domain required"
++msgstr "ТребуетÑÑ Ð´Ð¾Ð¼ÐµÐ½"
++
++msgid "Domain whitelist"
++msgstr "Белый ÑпиÑок доменов"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Ðе перенаправлÑÑ‚ÑŒ <abbr title=\"Служба доменных имён\">DNS</abbr>-запроÑÑ‹ "
++"без <abbr title=\"Служба доменных имён\">DNS</abbr>-имени"
++
++msgid "Download and install package"
++msgstr "Загрузить и уÑтановить пакет"
++
++msgid "Download backup"
++msgstr "Загрузить резервную копию"
++
++msgid "Dropbear Instance"
++msgstr "Dropbear"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear - Ñто <abbr title=\"Secure Shell\">SSH</abbr>-Ñервер Ñо вÑтроенным "
++"<abbr title=\"Secure Copy\">SCP</abbr>"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"ДинамичеÑкий <abbr title=\"Протокол динамичеÑкой конфигурации узла\">DHCP</"
++"abbr>"
++
++msgid "Dynamic tunnel"
++msgstr "ДинамичеÑкий туннель"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"ДинамичеÑки выделÑÑ‚ÑŒ DHCP-адреÑа клиентам. ЕÑли выключено, то будут "
++"обÑлужены только клиенты Ñ Ð¿Ð¾ÑтоÑнно арендованными адреÑами."
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "Метод EAP"
++
++# "Редактировать" длинно и не влазит по ширине в кнопку - текÑÑ‚ наезжает на иконку
++#, fuzzy
++msgid "Edit"
++msgstr "Редактировать"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++#, fuzzy
++msgid "Edit this interface"
++msgstr "Редактировать Ñтот интерфейÑ"
++
++msgid "Edit this network"
++msgstr "Редактировать Ñту Ñеть"
++
++msgid "Emergency"
++msgstr "Ð§Ñ€ÐµÐ·Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ð°Ñ ÑитуациÑ"
++
++msgid "Enable"
++msgstr "Включить"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Включить <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "Включить динамичеÑкое обновление оконечной точки HE.net"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "ПропуÑкать Jumbo-кадры"
++
++msgid "Enable NTP client"
++msgstr "Включить NTP-клиент"
++
++msgid "Enable TFTP server"
++msgstr "Включить TFTP-Ñервер"
++
++msgid "Enable VLAN functionality"
++msgstr "Включить поддержку VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Включить изучение и уÑтаревание (learning/aging)"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "Включить Ñту точку монтированиÑ"
++
++msgid "Enable this swap"
++msgstr "Включить Ñтот раздел подкачки"
++
++msgid "Enable/Disable"
++msgstr "Включить/выключить"
++
++msgid "Enabled"
++msgstr "Включено"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Включает Spanning Tree Protocol на Ñтом моÑту"
++
++msgid "Encapsulation mode"
++msgstr "Режим инкапÑулÑции"
++
++msgid "Encryption"
++msgstr "Шифрование"
++
++msgid "Erasing..."
++msgstr "Стирание..."
++
++msgid "Error"
++msgstr "Ошибка"
++
++msgid "Ethernet Adapter"
++msgstr "Ethernet-адаптер"
++
++msgid "Ethernet Switch"
++msgstr "Ethernet-коммутатор"
++
++msgid "Expand hosts"
++msgstr "РаÑширÑÑ‚ÑŒ имена узлов"
++
++msgid "Expires"
++msgstr "ИÑтекает"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++"ВремÑ, через которое иÑтекает аренда адреÑа, минимум 2 минуты (<code>2m</"
++"code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Сервер ÑиÑтемного журнала"
++
++msgid "External system log server port"
++msgstr "Порт Ñервера ÑиÑтемного журнала"
++
++msgid "Fast Frames"
++msgstr "БыÑтрые кадры"
++
++msgid "File"
++msgstr "Файл"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "Ð˜Ð¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ образа, извещаемого клиентам"
++
++msgid "Filesystem"
++msgstr "Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема"
++
++msgid "Filter"
++msgstr "Фильтр"
++
++msgid "Filter private"
++msgstr "Фильтровать чаÑтные"
++
++msgid "Filter useless"
++msgstr "Фильтровать беÑполезные"
++
++msgid "Find and join network"
++msgstr "Ðайти и приÑоединитьÑÑ Ðº Ñети"
++
++msgid "Find package"
++msgstr "Ðайти пакет"
++
++msgid "Finish"
++msgstr "Завершить"
++
++msgid "Firewall"
++msgstr "МежÑетевой Ñкран"
++
++msgid "Firewall Settings"
++msgstr "ÐаÑтройки межÑетевого Ñкрана"
++
++msgid "Firewall Status"
++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¼ÐµÐ¶Ñетевого Ñкрана"
++
++msgid "Firmware Version"
++msgstr "ВерÑÐ¸Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "ФикÑированный порт Ð´Ð»Ñ Ð¸ÑходÑщих DNS-запроÑов"
++
++msgid "Flags"
++msgstr "Флаги"
++
++msgid "Flash Firmware"
++msgstr "УÑтановить прошивку"
++
++msgid "Flash image..."
++msgstr "УÑтановить..."
++
++msgid "Flash new firmware image"
++msgstr "УÑтановить новый образ прошивки"
++
++msgid "Flash operations"
++msgstr "Операции Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¾Ð¹"
++
++msgid "Flashing..."
++msgstr "Прошивка..."
++
++# Force DHCP on the network
++msgid "Force"
++msgstr "Принудительно"
++
++msgid "Force CCMP (AES)"
++msgstr "Требовать CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr "ИÑпользовать DHCP в Ñтой Ñети, даже еÑли найден другой Ñервер."
++
++msgid "Force TKIP"
++msgstr "Требовать TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "TKIP или CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "ПеренаправлÑÑ‚ÑŒ трафик DHCP"
++
++msgid "Forward broadcast traffic"
++msgstr "ПеренаправлÑÑ‚ÑŒ широковещательный траффик"
++
++msgid "Forwarding mode"
++msgstr "Режим перенаправлениÑ"
++
++msgid "Fragmentation Threshold"
++msgstr "Порог фрагментации"
++
++msgid "Frame Bursting"
++msgstr "ÐŸÐ°ÐºÐµÑ‚Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° кадров"
++
++msgid "Free"
++msgstr "Свободно"
++
++msgid "Free space"
++msgstr "Свободное меÑто"
++
++msgid "GHz"
++msgstr "ГГц"
++
++msgid "GPRS only"
++msgstr "Только GPRS"
++
++msgid "Gateway"
++msgstr "Шлюз"
++
++msgid "Gateway ports"
++msgstr "Порты шлюза"
++
++msgid "General Settings"
++msgstr "ОÑновные наÑтройки"
++
++msgid "General Setup"
++msgstr "ОÑновные наÑтройки"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "Создать архив"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "БеÑпроводной 802.11%s контроллер"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr "Введённые пароли не Ñовпадают, пароль не изменён!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Перейти к наÑтройке паролÑ..."
++
++msgid "Go to relevant configuration page"
++msgstr "Перейти к Ñтранице конфигурации"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "Пароль HE.net"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Обработчик"
++
++# Вообще, SIGHUP означает, что "пользователь отключилÑÑ Ð¾Ñ‚ терминала". Ðо чаще вÑего Ñигнал иÑпользуетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑка, так что переведу именно так.
++msgid "Hang Up"
++msgstr "ПерезапуÑтить"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"ЗдеÑÑŒ вы можете наÑтроить оÑновные параметры вашего уÑтройÑтва такие как Ð¸Ð¼Ñ "
++"хоÑта или чаÑовой поÑÑ."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++"ЗдеÑÑŒ вы можете добавить открытые SSH ключи (один ключ на Ñтроку) Ð´Ð»Ñ SSH "
++"аутентификации."
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "БеÑпроводной 802.11b контроллер Hermes"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "Скрыть <abbr title=\"РаÑширенный идентификатор Ñети\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "ЗапиÑи хоÑтов"
++
++msgid "Host expiry timeout"
++msgstr "Таймаут хоÑта"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "<abbr title=\"ÐÐ´Ñ€ÐµÑ Ð¸Ð½Ñ‚ÐµÑ€Ð½ÐµÑ‚ протокола\">IP</abbr>-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ñеть"
++
++msgid "Hostname"
++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта в DHCP-запроÑах"
++
++msgid "Hostnames"
++msgstr "Имена хоÑтов"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "IP-адреÑ"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "МежÑетевой Ñкран IPv4"
++
++msgid "IPv4 WAN Status"
++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ IPv4 WAN"
++
++msgid "IPv4 address"
++msgstr "IPv4-адреÑ"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 и IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "Широковещательный IPv4-адреÑ"
++
++msgid "IPv4 gateway"
++msgstr "IPv4-Ð°Ð´Ñ€ÐµÑ ÑˆÐ»ÑŽÐ·Ð°"
++
++msgid "IPv4 netmask"
++msgstr "МаÑка Ñети IPv4"
++
++msgid "IPv4 only"
++msgstr "Только IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "Длина префикÑа IPv4"
++
++msgid "IPv4-Address"
++msgstr "IPv4-адреÑ"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "МежÑетевой Ñкран IPv6"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ IPv6 WAN"
++
++msgid "IPv6 address"
++msgstr "IPv6-адреÑ"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "IPv6-Ð°Ð´Ñ€ÐµÑ ÑˆÐ»ÑŽÐ·Ð°"
++
++msgid "IPv6 only"
++msgstr "Только IPv6"
++
++msgid "IPv6 prefix"
++msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ IPv6"
++
++msgid "IPv6 prefix length"
++msgstr "Длина префикÑа IPv6"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "IPv6-адреÑ"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6 в IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6 через IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6 через IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ EAP"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++"ЕÑли выбрано, монтировать уÑтройÑтво, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐµÐ³Ð¾ UUID, вмеÑто "
++"фикÑированного файла уÑтройÑтва"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++"ЕÑли выбрано, монтировать уÑтройÑтво, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ его раздела, вмеÑто "
++"фикÑированного файла уÑтройÑтва"
++
++msgid "If unchecked, no default route is configured"
++msgstr "ЕÑли не выбрано, то маршрут по умолчанию не наÑтраиваетÑÑ"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr "ЕÑли не выбрано, то извещаемые адреÑа DNS-Ñерверов игнорируютÑÑ"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"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>. "
++"Однако, перемещение в файл - Ñто доÑтаточно долгий процеÑÑ, так как "
++"уÑтройÑтво, на котором раÑполагаетÑÑ Ñ€Ð°Ð·Ð´ÐµÐ» подкачки, работает гораздо "
++"медленнее, чем <abbr title=\"Random Access Memory\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Ignore <code>/etc/hosts</code>"
++
++msgid "Ignore interface"
++msgstr "Игнорировать интерфейÑ"
++
++msgid "Ignore resolve file"
++msgstr "Игнорировать файл resolv"
++
++msgid "Image"
++msgstr "Образ"
++
++msgid "In"
++msgstr "Ð’"
++
++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 "Таймаут бездейÑтвиÑ"
++
++msgid "Inbound:"
++msgstr "ВходÑщий:"
++
++msgid "Info"
++msgstr "ИнформациÑ"
++
++msgid "Initscript"
++msgstr "Скрипт инициализации"
++
++msgid "Initscripts"
++msgstr "Скрипты инциализации"
++
++msgid "Install"
++msgstr "УÑтановить"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "УÑтановить пакет %q"
++
++msgid "Install protocol extensions..."
++msgstr "УÑтановить раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð°..."
++
++msgid "Installed packages"
++msgstr "УÑтановленные пакеты"
++
++msgid "Interface"
++msgstr "ИнтерфейÑ"
++
++msgid "Interface Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа"
++
++msgid "Interface Overview"
++msgstr "Обзор интерфейÑа"
++
++msgid "Interface is reconnecting..."
++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ÑÑ..."
++
++msgid "Interface is shutting down..."
++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ÑÑ..."
++
++msgid "Interface not present or not connected yet."
++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð½Ðµ ÑущеÑтвует или пока не подключен."
++
++msgid "Interface reconnected"
++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½"
++
++msgid "Interface shut down"
++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½"
++
++msgid "Interfaces"
++msgstr "ИнтерфейÑÑ‹"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñервера"
++
++msgid "Invalid"
++msgstr "Введённое значение не верно"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++"Указан неверный VLAN ID! ДоÑтупны только идентификаторы в диапазоне от %d до "
++"%d."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "Указан неверный VLAN ID! ДоÑтупны только уникальные ID"
++
++msgid "Invalid username and/or password! Please try again."
++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 ""
++"Ð’Ñ‹ пытаетеÑÑŒ обновить прошивку файлом, который не помещаетÑÑ Ð² памÑÑ‚ÑŒ "
++"уÑтройÑтва! ПожалуйÑта, проверьте файл образа."
++
++msgid "Java Script required!"
++msgstr "ТребуетÑÑ Java Script!"
++
++msgid "Join Network"
++msgstr "Подключение к Ñети"
++
++msgid "Join Network: Settings"
++msgstr "Подключение к Ñети: наÑтройки"
++
++msgid "Join Network: Wireless Scan"
++msgstr "Подключение к Ñети: Ñканирование"
++
++msgid "Keep settings"
++msgstr "Сохранить наÑтройки"
++
++msgid "Kernel Log"
++msgstr "Журнал Ñдра"
++
++msgid "Kernel Version"
++msgstr "ВерÑÐ¸Ñ Ñдра"
++
++msgid "Key"
++msgstr "Ключ"
++
++msgid "Key #%d"
++msgstr "Ключ №%d"
++
++msgid "Kill"
++msgstr "Принудительно завершить"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "L2TP-Ñервер"
++
++msgid "LCP echo failure threshold"
++msgstr "Порог ошибок Ñхо-запроÑов LCP"
++
++msgid "LCP echo interval"
++msgstr "Интервал Ñхо-запроÑов LCP"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Метка"
++
++msgid "Language"
++msgstr "Язык"
++
++msgid "Language and Style"
++msgstr "Язык и тема"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ð°Ñ€ÐµÐ½Ð´Ñ‹"
++
++msgid "Leasefile"
++msgstr "Файл аренд"
++
++msgid "Leasetime"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð°Ñ€ÐµÐ½Ð´Ñ‹"
++
++msgid "Leasetime remaining"
++msgstr "ОÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ Ð°Ñ€ÐµÐ½Ð´Ñ‹"
++
++msgid "Leave empty to autodetect"
++msgstr "ОÑтавьте поле пуÑтым Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "ОÑтавьте пуÑтым Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ адреÑа WAN"
++
++msgid "Legend:"
++msgstr "Легенда:"
++
++msgid "Limit"
++msgstr "Предел"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Подключение"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"СпиÑок <abbr title=\"Domain Name System\">DNS</abbr>-Ñерверов Ð´Ð»Ñ "
++"Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "СпиÑок доменов, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… разрешены ответы RFC1918"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr "СпиÑок хоÑтов, поÑтавлÑющих поддельные результаты домена NX"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr "Слушать только на данном интерфейÑе или, еÑли не определено, на вÑех"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Порт Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих DNS-запроÑов"
++
++msgid "Load"
++msgstr "Загрузка"
++
++msgid "Load Average"
++msgstr "СреднÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°"
++
++msgid "Loading"
++msgstr "Загрузка"
++
++msgid "Local IPv4 address"
++msgstr "Локальный IPv4-адреÑ"
++
++msgid "Local IPv6 address"
++msgstr "Локальный IPv6-адреÑ"
++
++msgid "Local Startup"
++msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°"
++
++msgid "Local Time"
++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 ""
++"Определение локального домена. Имена в Ñтом домене никогда не запрашиваютÑÑ "
++"у DNS-Ñервера, а разрешаютÑÑ Ð½Ð° оÑнове данных DHCP и файлов hosts"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++"Ð¡ÑƒÑ„Ñ„Ð¸ÐºÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ домена, который будет добавлен к DHCP-именам и запиÑÑм из "
++"файлов hosts"
++
++msgid "Local server"
++msgstr "Локальный Ñервер"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++"Локализировать Ð¸Ð¼Ñ Ñ…Ð¾Ñта в завиÑимоÑти от запрашиваемой подÑети, еÑли "
++"доÑтупно неÑколько IP-адреÑов."
++
++msgid "Localise queries"
++msgstr "Локализовывать запроÑÑ‹"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Уровень вывода"
++
++msgid "Log queries"
++msgstr "ЗапиÑывать запроÑÑ‹ в журнал"
++
++msgid "Logging"
++msgstr "Журналирование"
++
++msgid "Login"
++msgstr "Войти"
++
++msgid "Logout"
++msgstr "Выйти"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr "Минимальный Ð°Ð´Ñ€ÐµÑ Ð°Ñ€ÐµÐ½Ð´Ñ‹."
++
++msgid "MAC-Address"
++msgstr "MAC-адреÑ"
++
++msgid "MAC-Address Filter"
++msgstr "Фильтр MAC-адреÑов"
++
++msgid "MAC-Filter"
++msgstr "MAC-фильтр"
++
++msgid "MAC-List"
++msgstr "СпиÑок MAC"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "МБ/Ñ"
++
++msgid "MHz"
++msgstr "МГц"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "МакÑимальное количеÑтво активных арендованных DHCP-адреÑов"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "МакÑимально допуÑтимое количеÑтво одновременных DNS-запроÑов"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "МакÑимально допуÑтимый размер UDP пакетов-EDNS.0"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "МакÑимальное Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ð½Ð¾Ñти модема (Ñекунды)"
++
++msgid "Maximum hold time"
++msgstr "МакÑимальное Ð²Ñ€ÐµÐ¼Ñ ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ"
++
++msgid "Maximum number of leased addresses."
++msgstr "МакÑимальное количеÑтво арендованных адреÑов."
++
++msgid "Mbit/s"
++msgstr "Мбит/Ñ"
++
++msgid "Memory"
++msgstr "ПамÑÑ‚ÑŒ"
++
++msgid "Memory usage (%)"
++msgstr "ИÑпользование памÑти (%)"
++
++msgid "Metric"
++msgstr "Метрика"
++
++msgid "Minimum Rate"
++msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ"
++
++msgid "Minimum hold time"
++msgstr "Минимальное Ð²Ñ€ÐµÐ¼Ñ ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "ОтÑутÑтвует раÑширение протокола %q"
++
++msgid "Mode"
++msgstr "Режим"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Модем"
++
++msgid "Modem init timeout"
++msgstr "Таймаут инициализации модема"
++
++# 802.11 monitor mode
++msgid "Monitor"
++msgstr "Монитор"
++
++msgid "Mount Entry"
++msgstr "Точка монтированиÑ"
++
++msgid "Mount Point"
++msgstr "Точка монтированиÑ"
++
++msgid "Mount Points"
++msgstr "Точки монтированиÑ"
++
++msgid "Mount Points - Mount Entry"
++msgstr "Точки Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ - ЗапиÑÑŒ"
++
++msgid "Mount Points - Swap Entry"
++msgstr "Точки Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ - ЗапиÑÑŒ подкачки"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Точки Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÑÑŽÑ‚, куда в файловой ÑиÑтеме будет прикреплено "
++"запоминающее уÑтройÑтво"
++
++msgid "Mount options"
++msgstr "Опции монтированиÑ"
++
++msgid "Mount point"
++msgstr "Точка монтированиÑ"
++
++msgid "Mounted file systems"
++msgstr "Смонтированные файловые ÑиÑтемы"
++
++msgid "Move down"
++msgstr "ПеремеÑтить вниз"
++
++msgid "Move up"
++msgstr "ПеремеÑтить вверх"
++
++msgid "Multicast Rate"
++msgstr "СкороÑÑ‚ÑŒ групповой передачи"
++
++msgid "Multicast address"
++msgstr "ÐÐ´Ñ€ÐµÑ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð²Ð¾Ð¹ передачи"
++
++msgid "NAS ID"
++msgstr "Идентификатор NAS"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "СпиÑок NTP-Ñерверов"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "ИмÑ"
++
++msgid "Name of the new interface"
++msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ интерфейÑа"
++
++msgid "Name of the new network"
++msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ñети"
++
++msgid "Navigation"
++msgstr "ÐавигациÑ"
++
++msgid "Netmask"
++msgstr "МаÑка Ñети"
++
++msgid "Network"
++msgstr "Сеть"
++
++msgid "Network Utilities"
++msgstr "Сетевые утилиты"
++
++msgid "Network boot image"
++msgstr "Образ ÑиÑтемы Ð´Ð»Ñ Ñетевой загрузки"
++
++msgid "Network without interfaces."
++msgstr "Сеть без интерфейÑов."
++
++msgid "Next »"
++msgstr "Следующий »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "DHCP-Ñервер не наÑтроен Ð´Ð»Ñ Ñтого интерфейÑа"
++
++msgid "No chains in this table"
++msgstr "Ðет цепочек в Ñтой таблице"
++
++msgid "No files found"
++msgstr "Файлы не найдены"
++
++msgid "No information available"
++msgstr "Ðет доÑтупной информации"
++
++msgid "No negative cache"
++msgstr "Отключить кÑш отрицательных ответов"
++
++msgid "No network configured on this device"
++msgstr "Ðе наÑтроена Ñеть на уÑтройÑтве"
++
++msgid "No network name specified"
++msgstr "Ðе задано Ð¸Ð¼Ñ Ñети"
++
++msgid "No package lists available"
++msgstr "СпиÑок пакетов не доÑтупен"
++
++msgid "No password set!"
++msgstr "Пароль не уÑтановлен!"
++
++msgid "No rules in this chain"
++msgstr "Ðет правил в данной цепочке"
++
++msgid "No zone assigned"
++msgstr "Зона не приÑвоена"
++
++msgid "Noise"
++msgstr "Шум"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Шум:"
++
++msgid "None"
++msgstr "Ðет"
++
++msgid "Normal"
++msgstr "Ðормально"
++
++msgid "Not Found"
++msgstr "Ðе найдено"
++
++msgid "Not associated"
++msgstr "Ðе ÑвÑзанный"
++
++msgid "Not connected"
++msgstr "Ðе подключено"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Примечание: конфигурационные файлы будут Ñтёрты."
++
++msgid "Notice"
++msgstr "Заметка"
++
++msgid "Nslookup"
++msgstr "DNS-запроÑ"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "ÐаÑтройка OPKG"
++
++msgid "Off-State Delay"
++msgstr "Задержка выключенного ÑоÑтоÑниÑ"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Ðа Ñтой Ñтранице вы можете наÑтроить Ñетевые интерфейÑÑ‹. Ð’Ñ‹ можете "
++"объединить неÑколько интерфейÑов в моÑÑ‚, выбрав опцию \"Объединить в моÑÑ‚\" "
++"и Ð²Ð²ÐµÐ´Ñ ÑпиÑок интерфейÑов, разделенных пробелами. Ð’Ñ‹ также можете "
++"иÑпользовать <abbr title=\"Виртуальные локальные Ñети\">VLAN</abbr>-"
++"Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð° <samp>ИÐТЕРФЕЙС.ÐОМЕРVLAN</samp> (<abbr title=\"например"
++"\">напр.</abbr>: <samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr "Задержка включенного ÑоÑтоÑниÑ"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "Должен быть указан либо MAC-адреÑ, либо Ð¸Ð¼Ñ Ñ…Ð¾Ñта!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "Одно или неÑколько полей Ñодержат недопуÑтимые значениÑ!"
++
++msgid "One or more required fields have no value!"
++msgstr "Одно или неÑколько обÑзательных полей не заполнены!"
++
++msgid "Open list..."
++msgstr "Открыть ÑпиÑок..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "ÐžÐ¿Ñ†Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð°"
++
++msgid "Option removed"
++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 "Options"
++msgstr "Опции"
++
++msgid "Other:"
++msgstr "Другие:"
++
++msgid "Out"
++msgstr "Вне"
++
++msgid "Outbound:"
++msgstr "ИÑходÑщий:"
++
++msgid "Outdoor Channels"
++msgstr "Внешние каналы"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "Ðазначить MAC-адреÑ"
++
++msgid "Override MTU"
++msgstr "Ðазначить MTU"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "Ðазначить шлюз в ответах DHCP"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++"Переопределите Ñетевую маÑку, отправленную клиентам. Обычно Ñто вычиÑлено от "
++"подÑети, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð´Ð°Ð½Ð°."
++
++msgid "Override the table used for internal routes"
++msgstr "Ðазначить таблицу внутренних маршрутов"
++
++msgid "Overview"
++msgstr "Обзор"
++
++msgid "Owner"
++msgstr "Владелец"
++
++msgid "PAP/CHAP password"
++msgstr "Пароль PAP/CHAP"
++
++msgid "PAP/CHAP username"
++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PAP/CHAP"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "ИнкапÑулÑÑ†Ð¸Ñ PPPoA"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPTP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "ТребуетÑÑ Ð¿Ð°ÐºÐµÑ‚ libiwinfo!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "СпиÑок пакетов обновлÑлÑÑ Ð±Ð¾Ð»ÐµÐµ 24 чаÑов назад"
++
++msgid "Package name"
++msgstr "Ð˜Ð¼Ñ Ð¿Ð°ÐºÐµÑ‚Ð°"
++
++msgid "Packets"
++msgstr "Пакеты"
++
++msgid "Part of zone %q"
++msgstr "ЧаÑÑ‚ÑŒ зоны %q"
++
++msgid "Password"
++msgstr "Пароль"
++
++msgid "Password authentication"
++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ паролÑ"
++
++msgid "Password of Private Key"
++msgstr "Пароль или закрытый ключ"
++
++msgid "Password successfully changed!"
++msgstr "Пароль уÑпешно изменён!"
++
++msgid "Path to CA-Certificate"
++msgstr "Путь к центру Ñертификации"
++
++msgid "Path to Client-Certificate"
++msgstr "Путь к клиентÑкому Ñертификату"
++
++msgid "Path to Private Key"
++msgstr "Путь к личному ключу"
++
++msgid "Path to executable which handles the button event"
++msgstr "Путь к программе, обрабатывающей нажатие кнопки"
++
++msgid "Peak:"
++msgstr "ПиковаÑ:"
++
++msgid "Perform reboot"
++msgstr "Выполнить перезагрузку"
++
++msgid "Perform reset"
++msgstr "Выполнить ÑброÑ"
++
++msgid "Phy Rate:"
++msgstr "СкороÑÑ‚ÑŒ:"
++
++msgid "Physical Settings"
++msgstr "ÐаÑтройки канала"
++
++msgid "Ping"
++msgstr "Эхо-запроÑ"
++
++msgid "Pkts."
++msgstr "Пакетов."
++
++msgid "Please enter your username and password."
++msgstr "ПожалуйÑта, введите логин и пароль."
++
++msgid "Policy"
++msgstr "Политика"
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Port %d"
++msgstr "Порт %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr "Порт %d нетегирован в неÑкольких VLANах!"
++
++msgid "Port status:"
++msgstr "СоÑтоÑние порта:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++"Предполагать, что узел недоÑтупен поÑле указанного количеÑтва ошибок "
++"Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñхо-пакета LCP, введите 0 Ð´Ð»Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº"
++
++msgid "Prevents client-to-client communication"
++msgstr "Ðе позволÑет клиентам обмениватьÑÑ Ð´Ñ€ÑƒÐ³ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼ информацией"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "БеÑпроводной 802.11b контроллер Prism2/2.5/3"
++
++msgid "Proceed"
++msgstr "Продолжить"
++
++msgid "Processes"
++msgstr "ПроцеÑÑÑ‹"
++
++msgid "Prot."
++msgstr "Прот."
++
++msgid "Protocol"
++msgstr "Протокол"
++
++msgid "Protocol family"
++msgstr "СемейÑтво протоколов"
++
++msgid "Protocol of the new interface"
++msgstr "Протокол нового интерфейÑа"
++
++msgid "Protocol support is not installed"
++msgstr "Поддержка протокола не уÑтановлена"
++
++msgid "Provide NTP server"
++msgstr "Включить NTP-Ñервер"
++
++msgid "Provide new network"
++msgstr "ПредоÑтавлÑÑ‚ÑŒ новую Ñеть"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "ПÑевдо Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "КачеÑтво"
++
++msgid "RTS/CTS Threshold"
++msgstr "Порог RTS/CTS"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr "СкороÑÑ‚ÑŒ приёма"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "БеÑпроводной 802.11%s контроллер RaLink"
++
++msgid "Radius-Accounting-Port"
++msgstr "Порт Radius-Accounting"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Секрет Radius-Accounting"
++
++msgid "Radius-Accounting-Server"
++msgstr "Сервер Radius-Accounting"
++
++msgid "Radius-Authentication-Port"
++msgstr "Порт Radius-Authentication"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Секрет Radius-Authentication"
++
++msgid "Radius-Authentication-Server"
++msgstr "Сервер Radius-Authentication"
++
++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=\"Протокол "
++"динамичеÑкой конфигурации узла\">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."
++msgstr ""
++"ДейÑтвительно удалить Ñтот интерфейÑ? Удаление не может быть отменено!\\nÐ’Ñ‹ "
++"можете потерÑÑ‚ÑŒ доÑтуп к Ñтому уÑтройÑтву, еÑли вы подключены через Ñтот "
++"интерфейÑ."
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++"ДейÑтвительно удалить Ñту беÑпроводную Ñеть? Удаление не может быть отменено!"
++"\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к Ñтому уÑтройÑтву, еÑли вы подключены через "
++"Ñту Ñеть."
++
++msgid "Really reset all changes?"
++msgstr "ДейÑтвительно ÑброÑить вÑе изменениÑ?"
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++"ДейÑтвительно отключить Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\" ?\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к "
++"Ñтому уÑтройÑтву, еÑли вы подключены через Ñтот интерфейÑ."
++
++msgid "Really switch protocol?"
++msgstr "Ð’Ñ‹ дейÑтвительно хотите изменить протокол?"
++
++msgid "Realtime Connections"
++msgstr "Ð¡Ð¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² реальном времени"
++
++msgid "Realtime Graphs"
++msgstr "Графики в реальном времени"
++
++msgid "Realtime Load"
++msgstr "Загрузка в реальном времени"
++
++msgid "Realtime Traffic"
++msgstr "Трафик в реальном времени"
++
++msgid "Realtime Wireless"
++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть в реальном времени"
++
++msgid "Rebind protection"
++msgstr "Защита от DNS Rebinding"
++
++msgid "Reboot"
++msgstr "Перезагрузка"
++
++msgid "Rebooting..."
++msgstr "Перезагрузка..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Перезагрузить операционную ÑиÑтему вашего уÑтройÑтва"
++
++msgid "Receive"
++msgstr "Приём"
++
++msgid "Receiver Antenna"
++msgstr "ÐŸÑ€Ð¸Ñ‘Ð¼Ð½Ð°Ñ Ð°Ð½Ñ‚ÐµÐ½Ð½Ð°"
++
++msgid "Reconnect this interface"
++msgstr "Переподключить Ñтот интерфейÑ"
++
++msgid "Reconnecting interface"
++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ÑÑ"
++
++# References to firewall chains
++msgid "References"
++msgstr "СÑылки"
++
++msgid "Regulatory Domain"
++msgstr "ÐÐ¾Ñ€Ð¼Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð·Ð¾Ð½Ð°"
++
++msgid "Relay"
++msgstr "РетранÑлÑтор"
++
++msgid "Relay Bridge"
++msgstr "МоÑÑ‚-ретранÑлÑтор"
++
++msgid "Relay between networks"
++msgstr "РетранÑлÑтор между ÑетÑми"
++
++msgid "Relay bridge"
++msgstr "МоÑÑ‚-ретранÑлÑтор"
++
++msgid "Remote IPv4 address"
++msgstr "Удалённый IPv4-адреÑ"
++
++msgid "Remove"
++msgstr "Удалить"
++
++msgid "Repeat scan"
++msgstr "Повторить Ñканирование"
++
++msgid "Replace entry"
++msgstr "Заменить запиÑÑŒ"
++
++msgid "Replace wireless configuration"
++msgstr "Заменить беÑпроводную конфигурацию"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "ТребуетÑÑ Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… интернет-провайдеров"
++
++msgid "Reset"
++msgstr "СброÑить"
++
++msgid "Reset Counters"
++msgstr "СброÑить Ñчётчики"
++
++msgid "Reset to defaults"
++msgstr "СброÑить на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию"
++
++msgid "Resolv and Hosts Files"
++msgstr "Файлы resolv и hosts"
++
++msgid "Resolve file"
++msgstr "Файл resolv"
++
++msgid "Restart"
++msgstr "ПерезапуÑтить"
++
++msgid "Restart Firewall"
++msgstr "ПерезапуÑтить межÑетевой Ñкран"
++
++msgid "Restore backup"
++msgstr "ВоÑÑтановить резервную копию"
++
++msgid "Reveal/hide password"
++msgstr "Показать/Ñкрыть пароль"
++
++msgid "Revert"
++msgstr "Вернуть"
++
++msgid "Root"
++msgstr "Корень"
++
++msgid "Root directory for files served via TFTP"
++msgstr "ÐšÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ TFTP"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Пароль маршрутизатора"
++
++msgid "Routes"
++msgstr "Маршруты"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñлужит Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· какой Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¸ шлюз можно "
++"доÑтичть определённого хоÑта или Ñети."
++
++msgid "Rule #"
++msgstr "Правило №"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr "ПроверÑÑ‚ÑŒ файловую ÑиÑтему перед монтированием уÑтройÑтва"
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr "ДоÑтуп по SSH"
++
++msgid "SSH-Keys"
++msgstr "SSH-ключи"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Сохранить"
++
++msgid "Save & Apply"
++msgstr "Сохранить и применить"
++
++msgid "Save &#38; Apply"
++msgstr "Сохранить и применить"
++
++msgid "Scan"
++msgstr "Сканировать"
++
++msgid "Scheduled Tasks"
++msgstr "Запланированные заданиÑ"
++
++msgid "Section added"
++msgstr "Ð¡ÐµÐºÑ†Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð°"
++
++msgid "Section removed"
++msgstr "Ð¡ÐµÐºÑ†Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð°"
++
++msgid "See \"mount\" manpage for details"
++msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ð¹ информации обратитеÑÑŒ к Ñправке по \"mount\" (man mount)"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++"ОтправлÑÑ‚ÑŒ Ñхо-пакеты LCP Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ интервалом (Ñекунды), Ñффективно "
++"только в Ñочетании Ñ Ð¿Ð¾Ñ€Ð¾Ð³Ð¾Ð¼ ошибок"
++
++msgid "Separate Clients"
++msgstr "РазделÑÑ‚ÑŒ клиентов"
++
++msgid "Separate WDS"
++msgstr "Отдельный WDS"
++
++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 "Ð˜Ð¼Ñ Ñлужбы"
++
++msgid "Service Type"
++msgstr "Тип Ñлужбы"
++
++msgid "Services"
++msgstr "СервиÑÑ‹"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "ÐаÑтроить Ñинхронизацию времени"
++
++msgid "Setup DHCP Server"
++msgstr "ÐаÑтроить Ñервер DHCP"
++
++msgid "Show current backup file list"
++msgstr "Показать текущий ÑпиÑок файлов резервной копии"
++
++msgid "Shutdown this interface"
++msgstr "Выключить Ñтот интерфейÑ"
++
++msgid "Shutdown this network"
++msgstr "Выключить Ñту Ñеть"
++
++msgid "Signal"
++msgstr "Сигнал"
++
++msgid "Signal:"
++msgstr "Сигнал:"
++
++msgid "Size"
++msgstr "Размер"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "ПропуÑтить"
++
++msgid "Skip to content"
++msgstr "Перейти к Ñодержимому"
++
++msgid "Skip to navigation"
++msgstr "Перейти к навигации"
++
++msgid "Slot time"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñлота"
++
++msgid "Software"
++msgstr "Программное обеÑпечение"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "Ðекоторые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ недопуÑтимы, невозможно Ñохранить информацию!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Извините, запрошенный объект не был найден."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "Извините, Ñервер ÑтолкнулÑÑ Ñ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾Ð¹ ошибкой."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"К Ñожалению, автоматичеÑкое обновление не поддерживаетÑÑ, Ð½Ð¾Ð²Ð°Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ° "
++"должна быть уÑтановлена вручную. ОбратитеÑÑŒ к вики OpenWrt Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ "
++"конкретных инÑтрукций Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ уÑтройÑтва."
++
++msgid "Sort"
++msgstr "Сортировка"
++
++msgid "Source"
++msgstr "ИÑточник"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "СоÑтоÑние кнопки, которое необходимо обработать"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "ДиректориÑ, к которой приÑоединено уÑтройÑтво"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "Порт данного процеÑÑа <em>Dropbear</em>"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++"МакÑимальное количеÑтво неудачных запроÑов ARP, поÑле которого узлы "
++"ÑчитаютÑÑ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼Ð¸"
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++"МакÑимальное количеÑтво Ñекунд, поÑле которого узлы ÑчитаютÑÑ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼Ð¸"
++
++msgid "Specify the secret encryption key here."
++msgstr "Укажите закрытый ключ."
++
++msgid "Start"
++msgstr "ЗапуÑтить"
++
++msgid "Start priority"
++msgstr "Приоритет"
++
++msgid "Startup"
++msgstr "Загрузка"
++
++msgid "Static IPv4 Routes"
++msgstr "СтатичеÑкие маршруты IPv4"
++
++msgid "Static IPv6 Routes"
++msgstr "СтатичеÑкие маршруты IPv6"
++
++msgid "Static Leases"
++msgstr "ПоÑтоÑнные аренды"
++
++msgid "Static Routes"
++msgstr "СтатичеÑкие маршруты"
++
++msgid "Static WDS"
++msgstr "СтатичеÑкий WDS"
++
++msgid "Static address"
++msgstr "СтатичеÑкий адреÑ"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"ПоÑтоÑÐ½Ð½Ð°Ñ Ð°Ñ€ÐµÐ½Ð´Ð° иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ²Ð¾ÐµÐ½Ð¸Ñ Ñ„Ð¸ÐºÑированных IP-адреÑов и "
++"имён DHCP-клиентам. ПоÑтоÑÐ½Ð½Ð°Ñ Ð°Ñ€ÐµÐ½Ð´Ð° также необходима Ð´Ð»Ñ ÑтатичеÑких "
++"интерфейÑов, в которых обÑлуживаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ клиенты Ñ Ð¿Ñ€Ð¸Ñвоенными адреÑами."
++
++msgid "Status"
++msgstr "СтатуÑ"
++
++msgid "Stop"
++msgstr "ОÑтановить"
++
++msgid "Strict order"
++msgstr "Строгий порÑдок"
++
++msgid "Submit"
++msgstr "Применить"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Раздел подкачки"
++
++msgid "Switch"
++msgstr "Коммутатор"
++
++msgid "Switch %q"
++msgstr "Коммутатор %q"
++
++msgid "Switch %q (%s)"
++msgstr "Коммутатор %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Изменить протокол"
++
++msgid "Sync with browser"
++msgstr "Синхронизировать Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð¾Ð¼"
++
++msgid "Synchronizing..."
++msgstr "СинхронизациÑ..."
++
++msgid "System"
++msgstr "СиÑтема"
++
++msgid "System Log"
++msgstr "СиÑтемный журнал"
++
++msgid "System Properties"
++msgstr "СвойÑтва ÑиÑтемы"
++
++msgid "System log buffer size"
++msgstr "Размер ÑиÑтемного журнала"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "ÐаÑтройки TFTP"
++
++msgid "TFTP server root"
++msgstr "Корень TFTP-Ñервера"
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr "СкороÑÑ‚ÑŒ передачи"
++
++msgid "Table"
++msgstr "Таблица"
++
++msgid "Target"
++msgstr "Цель"
++
++msgid "Terminate"
++msgstr "Завершить"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"Раздел <em>ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑƒÑтройÑтва</em> Ñодержит физичеÑкие наÑтройки "
++"беÑпроводного оборудованиÑ, такие как канал, мощноÑÑ‚ÑŒ передатчика или выбор "
++"антенны, которые ÑвлÑÑŽÑ‚ÑÑ Ð¾Ð±Ñ‰Ð¸Ð¼Ð¸ Ð´Ð»Ñ Ð²Ñех определённых беÑпроводных Ñетей "
++"(еÑли оборудование поддерживает неÑколько SSID). ÐаÑтройки отдельных Ñетей, "
++"такие как шифрование или режим работы, Ñгруппированы в разделе "
++"<em>ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа</em>."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"Пакет <em>libiwinfo-lua</em> не уÑтановлен. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек "
++"беÑпроводных Ñетей, вам необходимо уÑтановить Ñтот компонент!"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++"Ðазначенный провайдеру Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ 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>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"УÑтройÑтво или раздел (<abbr title=\"например\">напр.</abbr> <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 ""
++"Формат файловой ÑиÑтемы (<abbr title=\"например\">напр.</abbr> <samp><abbr "
++"title=\"Third Extended Filesystem\">ext3</abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"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 "Данные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ применены"
++
++msgid "The following changes have been reverted"
++msgstr "Данные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ отвергнуты"
++
++msgid "The following rules are currently active on this system."
++msgstr "Ðа данном уÑтройÑтве активны Ñледующие правила."
++
++msgid "The given network name is not unique"
++msgstr "Заданное Ð¸Ð¼Ñ Ñети не ÑвлÑетÑÑ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"Оборудование не поддерживает неÑколько SSID, и, еÑли вы продолжите, "
++"ÑущеÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ заменена."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++"Длина префикÑа IPv4 в битах, оÑтавшееÑÑ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð² IPv6-адреÑах."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "Длина префикÑа IPv6 в битах"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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"
++"\">VLAN</abbr>Ñ‹ чаÑто иÑпользуютÑÑ Ð´Ð»Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½ÐµÑкольких Ñетевых "
++"Ñегментов. Обычно по умолчанию иÑпользуетÑÑ Ð¾Ð´Ð¸Ð½ воÑходÑщий порт Ð´Ð»Ñ "
++"Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº выÑшей рангом Ñети, например к интернету или к другим портам "
++"локальной Ñети."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "Ð”Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ протокола необходимо задать уÑтройÑтво"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++"Идёт удаление раздела конфигурации Ñ Ð¿Ð¾Ñледующей перезагрузкой ÑиÑитемы."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++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."
++msgstr ""
++"Загруженный файл образа не поддерживаетÑÑ. ПожалуйÑта, проверьте, что вы "
++"загрузили правильный образ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ платформы."
++
++msgid "There are no active leases."
++msgstr "Ðет активных арендованных адреÑов."
++
++msgid "There are no pending changes to apply!"
++msgstr "Ðет изменений, которые можно применить!"
++
++msgid "There are no pending changes to revert!"
++msgstr "Ðет изменений, которые можно отменить!"
++
++msgid "There are no pending changes!"
++msgstr "Ðет изменений, которые можно применить!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"УÑтройÑтво не назначено. ПожалуйÑта, назначьте Ñетевое уÑтройÑтво во вкладке "
++"\"ÐаÑтройки канала\""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"Пароль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ root не уÑтановлен. ПожалуйÑта, уÑтановите пароль, чтобы "
++"защитить веб-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¸ включить SSH."
++
++msgid "This IPv4 address of the relay"
++msgstr "IPv4-Ð°Ð´Ñ€ÐµÑ Ñ€ÐµÑ‚Ñ€Ð°Ð½ÑлÑтора"
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"Это ÑпиÑок шаблонов Ð´Ð»Ñ ÑоответÑÑ‚Ð²Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² и директорий Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ "
++"иÑпользовании sysupgrade. Изменённые файлы в /etc/config и некоторые другие "
++"конфигурации автоматичеÑки ÑохранÑÑŽÑ‚ÑÑ."
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"Это Ñодержимое /etc/rc.local. Ð’Ñ‹ можете добавить Ñвои команды (перед 'exit "
++"0'), чтобы выполнить их в конце загрузки."
++
++# Maybe it usually ends with ::2?
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++"Это локальный адреÑ, назначенный туннельным брокером, обычно заканчиваетÑÑ "
++"на <code>:2</code>"
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Это единÑтвенный <abbr title=\"Протокол динамичеÑкой конфигурации узла"
++"\">DHCP</abbr>-Ñервер в локальной Ñети"
++
++msgid "This is the plain username for logging into the account"
++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 ""
++"Это таблица cron (crontab), в которой вы можете определить запланированные "
++"заданиÑ."
++
++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 allows the configuration of custom button actions"
++msgstr "Ð”Ð°Ð½Ð½Ð°Ñ Ñтраница позволÑет наÑтроить обработку кнопок"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++"Ð”Ð°Ð½Ð½Ð°Ñ Ñтраница Ñодержит обзор вÑех активных на данный момент Ñетевых "
++"Ñоединений."
++
++msgid "This section contains no values yet"
++msgstr "Эта ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾ÐºÐ° не Ñодержит значений"
++
++msgid "Time Synchronization"
++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ ещё не наÑтроена."
++
++msgid "Timezone"
++msgstr "ЧаÑовой поÑÑ"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"Чтобы воÑÑтановить файлы конфигурации, вы можете загрузить ранее Ñозданный "
++"архив здеÑÑŒ."
++
++msgid "Total Available"
++msgstr "Ð’Ñего доÑтупно"
++
++msgid "Traceroute"
++msgstr "ТраÑÑировка"
++
++msgid "Traffic"
++msgstr "Трафик"
++
++msgid "Transfer"
++msgstr "Передача"
++
++msgid "Transmission Rate"
++msgstr "СкороÑÑ‚ÑŒ передачи"
++
++msgid "Transmit"
++msgstr "Передача"
++
++msgid "Transmit Power"
++msgstr "МощноÑÑ‚ÑŒ передатчика"
++
++msgid "Transmitter Antenna"
++msgstr "ÐŸÐµÑ€ÐµÐ´Ð°ÑŽÑ‰Ð°Ñ Ð°Ð½Ñ‚ÐµÐ½Ð½Ð°"
++
++msgid "Trigger"
++msgstr "Триггер"
++
++msgid "Trigger Mode"
++msgstr "Режим ÑрабатываниÑ"
++
++msgid "Tunnel ID"
++msgstr "Идентификатор туннелÑ"
++
++msgid "Tunnel Interface"
++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ‚ÑƒÐ½Ð½ÐµÐ»Ñ"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Турбо-режим"
++
++msgid "Tx-Power"
++msgstr "МощноÑÑ‚ÑŒ передатчика"
++
++msgid "Type"
++msgstr "Тип"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "Только UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "USB-уÑтройÑтво"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr "Ðевозможно обработать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ"
++
++msgid "Unknown"
++msgstr "ÐеизвеÑтно"
++
++msgid "Unknown Error, password not changed!"
++msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°, пароль не был изменен!"
++
++msgid "Unmanaged"
++msgstr "ÐеуправлÑемый"
++
++msgid "Unsaved Changes"
++msgstr "ÐепринÑтые изменениÑ"
++
++msgid "Unsupported protocol type."
++msgstr "Ðеподдерживаемый тип протокола."
++
++msgid "Update lists"
++msgstr "Обновить ÑпиÑки"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"Загрузите sysupgrade-ÑовмеÑтимый образ, чтобы заменить текущую прошивку. "
++"УÑтановите флажок \"Сохранить наÑтройки\", чтобы Ñохранить текущую "
++"конфигурацию (требуетÑÑ ÑовмеÑтимый Ñ OpenWrt образ прошивки)."
++
++msgid "Upload archive..."
++msgstr "Загрузить архив..."
++
++msgid "Uploaded File"
++msgstr "Загруженный файл"
++
++msgid "Uptime"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "ИÑпользовать <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr "ИÑпользовать шлюз DHCP"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "ИÑпользовать объÑвлÑемые узлом DNS-Ñерверы"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "ИÑпользовать коды Ñтран ISO/IEC 3166 alpha2."
++
++msgid "Use MTU on tunnel interface"
++msgstr "ИÑпользовать MTU на интерфейÑе туннелÑ"
++
++msgid "Use TTL on tunnel interface"
++msgstr "ИÑпользовать TTL на интерфейÑе туннелÑ"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "ИÑпользовать широковещательный флаг"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "ИÑпользовать ÑобÑтвенные DNS-Ñерверы"
++
++msgid "Use default gateway"
++msgstr "ИÑпользовать шлюз по умолчанию"
++
++msgid "Use gateway metric"
++msgstr "ИÑпользовать метрику шлюза"
++
++msgid "Use routing table"
++msgstr "ИÑпользовать таблицу маршрутизации"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"Ðажмите кнопку <em>Добавить</em>, чтобы добавить новую запиÑÑŒ аренды. "
++"<em>MAC-адреÑ</em> идентифицирует хоÑÑ‚, <em>IPv4-адреÑ</em> указывает "
++"фикÑированный адреÑ, а <em>Ð˜Ð¼Ñ Ñ…Ð¾Ñта</em> приÑваиваетÑÑ Ð² качеÑтве "
++"Ñимвольного имени Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ¸Ð²Ð°ÑŽÑ‰ÐµÐ³Ð¾ хоÑта."
++
++msgid "Used"
++msgstr "ИÑпользовано"
++
++msgid "Used Key Slot"
++msgstr "ИÑпользуемый Ñлот ключа"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ VLAN"
++
++msgid "VLANs on %q"
++msgstr "VLANы на %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLANы на %q (%s)"
++
++msgid "VPN Server"
++msgstr "Сервер VPN"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++"КлаÑÑ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ (Vendor class), который отправлÑÑ‚ÑŒ при DHCP-запроÑах"
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr "Проверить"
++
++msgid "Version"
++msgstr "ВерÑиÑ"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "ÐžÑ‚ÐºÑ€Ñ‹Ñ‚Ð°Ñ ÑиÑтема WEP"
++
++msgid "WEP Shared Key"
++msgstr "Общий ключ WEP"
++
++msgid "WEP passphrase"
++msgstr "Пароль WEP"
++
++msgid "WMM Mode"
++msgstr "Режим WMM"
++
++msgid "WPA passphrase"
++msgstr "Пароль WPA"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++msgstr ""
++"Ðеобходимо уÑтановить wpa_supplicant (режим клиента) или hostapd (режим "
++"точки доÑтупа или ad-hoc) Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ WPA."
++
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "Внимание"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wi-Fi"
++
++msgid "Wireless"
++msgstr "Wi-Fi"
++
++msgid "Wireless Adapter"
++msgstr "БеÑпроводной адаптер"
++
++msgid "Wireless Network"
++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть"
++
++msgid "Wireless Overview"
++msgstr "Обзор беÑпроводных Ñетей"
++
++msgid "Wireless Security"
++msgstr "БезопаÑноÑÑ‚ÑŒ беÑпроводной Ñети"
++
++msgid "Wireless is disabled or not associated"
++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть отключена или не ÑвÑзана "
++
++msgid "Wireless is restarting..."
++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть перезапуÑкаетÑÑ..."
++
++msgid "Wireless network is disabled"
++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть отключена"
++
++msgid "Wireless network is enabled"
++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть включена"
++
++msgid "Wireless restarted"
++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть перезапущена"
++
++msgid "Wireless shut down"
++msgstr "Выключение беÑпроводной Ñети"
++
++msgid "Write received DNS requests to syslog"
++msgstr "ЗапиÑывать полученные DNS-запроÑÑ‹ в ÑиÑтемный журнал"
++
++msgid "XR Support"
++msgstr "Поддержка XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"ЗдеÑÑŒ вы можете включить или выключить уÑтановленные Ñкрипты инициализации. "
++"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑтупÑÑ‚ в Ñилу поÑле перезагрузки уÑтройÑтва.<br /"
++"><strong>Внимание: еÑли вы выключите один из оÑновных Ñкриптов инициализации "
++"(например \"network\"), ваше уÑтройÑтво может оказатьÑÑ Ð½ÐµÐ´Ð¾Ñтупным!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Вам необходимо включить Java Script в вашем браузере Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы "
++"LuCI."
++
++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 ""
++
++msgid "any"
++msgstr "любой"
++
++msgid "auto"
++msgstr "авто"
++
++#, fuzzy
++msgid "automatic"
++msgstr "ÑтатичеÑкий"
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "Ñоед. моÑтом"
++
++msgid "create:"
++msgstr "Ñоздать:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "Ñоздаёт моÑÑ‚ Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… Ñетевых интерфейÑов"
++
++msgid "dB"
++msgstr "дБ"
++
++msgid "dBm"
++msgstr "дБм"
++
++msgid "disable"
++msgstr "выключено"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "иÑтекло"
++
++# убил бы
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"файл, где хранÑÑ‚ÑÑ Ð°Ñ€ÐµÐ½Ð´Ð¾Ð²Ð°Ð½Ð½Ñ‹Ðµ <abbr title=\"Протокол динамичеÑкой "
++"конфигурации узла\">DHCP</abbr>-адреÑа"
++
++msgid "forward"
++msgstr "перенаправить"
++
++msgid "full-duplex"
++msgstr "полный дуплекÑ"
++
++msgid "half-duplex"
++msgstr "полудуплекÑ"
++
++msgid "help"
++msgstr "помощь"
++
++msgid "hidden"
++msgstr "Ñкрытый"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "еÑли Ñеть"
++
++msgid "input"
++msgstr "ввод"
++
++msgid "kB"
++msgstr "кБ"
++
++msgid "kB/s"
++msgstr "кБ/Ñ"
++
++msgid "kbit/s"
++msgstr "кбит/Ñ"
++
++msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
++msgstr "локальный <abbr title=\"Служба доменных имён\">DNS</abbr>-файл"
++
++msgid "minimum 1280, maximum 1480"
++msgstr ""
++
++msgid "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "нет"
++
++msgid "no link"
++msgstr "нет ÑоединениÑ"
++
++msgid "none"
++msgstr "ничего"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "выключено"
++
++msgid "on"
++msgstr "включено"
++
++msgid "open"
++msgstr "открытаÑ"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "маршрутизируемый"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "Ñ Ñ‚ÐµÐ³Ð¾Ð¼"
++
++msgid "unknown"
++msgstr "неизвеÑтный"
++
++msgid "unlimited"
++msgstr "неограниченный"
++
++msgid "unspecified"
++msgstr "не определено"
++
++msgid "unspecified -or- create:"
++msgstr "не определено -или- Ñоздать:"
++
++msgid "untagged"
++msgstr "без тега"
++
++msgid "yes"
++msgstr "да"
++
++msgid "« Back"
++msgstr "« Ðазад"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "Включить IPv6-ÑоглаÑование на PPP-Ñоединении"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "Игнорировать файлы hosts"
++
++#~ msgid "Path"
++#~ msgstr "Путь"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "ПожалуйÑта подождите: уÑтройÑтво перезагружаетÑÑ..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Внимание: еÑÑ‚ÑŒ неÑохранённые изменениÑ, которые потерÑÑŽÑ‚ÑÑ Ð¿Ð¾Ñле "
++#~ "перезагрузки!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Ð’Ñегда иÑпользовать ширину каналов 40 МГц, даже еÑли каналы "
++#~ "перекрываютÑÑ. ИÑпользование Ñтой опции не ÑовмеÑтимо Ñо Ñтандартом IEEE "
++#~ "802.11n-2009!"
++
++#~ msgid "Cached"
++#~ msgstr "КÑшировано"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr ""
++#~ "ИÑпользовать Ñту точку Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве overlay-хранилища Ð´Ð»Ñ "
++#~ "block-extroot"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "Принудительно уÑтановить режим 40 МГц ширины канала"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Ð¡ÐºÐ°Ñ‡ÐºÐ¾Ð¾Ð±Ñ€Ð°Ð·Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÑтройка чаÑтоты"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "ПривÑзка к каналу %d, иÑпользуемому %s"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "ИÑпользовать в качеÑтве корневой файловой ÑиÑтемы"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "Идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ HE.net"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr ""
++#~ "Это 32-байтный шеÑтнадцатиричный идентификатор пользователÑ, не Ð¸Ð¼Ñ Ð²Ñ…Ð¾Ð´Ð°"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "Второй 40МГц канал Ñверху"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "Второй 40МГц канал Ñнизу"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Принимать Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Извещать об IPv6 в Ñети"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "Идентификатор Ñети"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "ДопуÑтимый диапазон от 1 до 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "ВозможноÑти HT"
++
++#~ msgid "HT mode"
++#~ msgstr "Режим HT"
++
++#~ msgid "Router Model"
++#~ msgstr "Модель маршрутизатора"
++
++#~ msgid "Router Name"
++#~ msgstr "Ðазвание маршрутизатора"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "ОтправлÑÑ‚ÑŒ Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr "ÐнонÑируемое предпочитаемое Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ префикÑа (Ñек.)"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr "ÐнонÑируемое дейÑтвительное Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ префикÑа (Ñек.)"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "ИÑпользовать предпочитаемое Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "ИÑпользовать дейÑтвительное Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "Ожидание маршрутизатора..."
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "Включить вÑтроенный NTP-Ñервер"
++
++#~ msgid "Active Leases"
++#~ msgstr "Ðктивные аренды"
++
++#~ msgid "Open"
++#~ msgstr "Открыть"
++
++#~ msgid "KB"
++#~ msgstr "KB"
++
++#~ msgid "Bit Rate"
++#~ msgstr "СкороÑÑ‚ÑŒ передачи в битах"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ / Применить"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ / ИзменениÑ"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ / Обратить изменениÑ"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MAC Address"
++#~ msgstr "MAC ÐдреÑ"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Зашифрованно\">Шифрование</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr ""
++#~ "<abbr title=\"БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñеть\">WLAN</abbr>-Сканирование"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "Укажите Ñеть, которую вы хотите прикрепить к Ñтому беÑпроводному "
++#~ "интерфейÑу. Выберите <em>не определено</em> чтобы не прикреплÑÑ‚ÑŒ Ñеть или "
++#~ "заполните поле <em>Ñоздать</em> чтобы определить новую Ñеть."
++
++#~ msgid "Create Network"
++#~ msgstr "Создать Ñеть"
++
++#~ msgid "Link"
++#~ msgstr "Соединение"
++
++#~ msgid "Networks"
++#~ msgstr "Сети"
++
++#~ msgid "Power"
++#~ msgstr "МощноÑÑ‚ÑŒ"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Обзор ÑущеÑтвующих Wi-Fi Ñетей"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "<abbr title=\"БеcклаÑÑÐ¾Ð²Ð°Ñ Ð°Ð´Ñ€ÐµÑациÑ\">CIDR</abbr>-Обозначение: адреÑ/"
++#~ "префикÑ"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "<abbr title=\"Служба Доменных Имён\">DNS</abbr>-Сервер"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr ""
++#~ "<abbr title=\"Интернет протокол верÑии 4\">IPv4</abbr>-Широковещательный"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "<abbr title=\"Интернет протокол верÑии 6\">IPv6</abbr>-ÐдреÑ"
++
++#~ msgid "IP-Aliases"
++#~ msgstr "IP пÑевдонимы"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "УÑтановки IPv6"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "Заметка: ЕÑли здеÑÑŒ вы выберете интерфейÑ, который ÑвлÑетÑÑ Ñ‡Ð°Ñтью другой "
++#~ "Ñети, то он будет перемещен в Ñту Ñеть."
++
++#~ msgid ""
++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might "
++#~ "lose access to this router if you are connected via this interface."
++#~ msgstr ""
++#~ "Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот интерфейÑ? Удаление невозможно "
++#~ "отменить!\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к Ñтому маршрутизатору, еÑли ваш "
++#~ "компьютер подключен через Ñтот интерфейÑ."
++
++#~ msgid ""
++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou "
++#~ "might lose access to this router if you are connected via this network."
++#~ msgstr ""
++#~ "Ð’Ñ‹ дейÑтвительно хотите удалить Ñту беÑпроводную Ñеть? Удаление "
++#~ "невозможно отменить!\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к Ñтому маршрутизатору, "
++#~ "еÑли ваш компьютер подключен через Ñтот интерфейÑ."
++
++#~ msgid ""
++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router "
++#~ "if you are connected via this interface."
++#~ msgstr ""
++#~ "Ð’Ñ‹ дейÑтвительно хотите выключить Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\" ?\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ "
++#~ "доÑтуп к Ñтому маршрутизатору, еÑли ваш компьютер подключен через Ñтот "
++#~ "интерфейÑ."
++
++#~ msgid ""
++#~ "Really shutdown network ?\\nYou might lose access to this router if you "
++#~ "are connected via this interface."
++#~ msgstr ""
++#~ "Ð’Ñ‹ дейÑтвительно хотите выключить Ñеть?\\nÐ’Ñ‹ можете поторÑÑ‚ÑŒ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ "
++#~ "данным маршрутизатором при иÑпользовании Ñтого интерфейÑа."
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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=\"Виртуальные локальные Ñети\">VLAN</abbr>&#32;ов, в которых "
++#~ "компьютеры могут напрÑмую общатьÑÑ Ð´Ñ€ÑƒÐ³ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼. <abbr title="
++#~ "\"Виртуальные локальные Ñети\">VLAN</abbr>&#32;Ñ‹ чаÑто иÑпользуютÑÑ Ð´Ð»Ñ "
++#~ "Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ñети на разные Ñегменты. Обычно один иÑходÑщий порт "
++#~ "иÑпользуетÑÑ Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñетью, такой например, как интернет, "
++#~ "а оÑтальные порты иÑпользуютÑÑ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð¹ Ñети."
++
++#~ msgid "Enable buffering"
++#~ msgstr "Включить буферизацию"
++
++#~ msgid "IPv6-over-IPv4"
++#~ msgstr "IPv6 через IPv4"
++
++#~ msgid "Custom Files"
++#~ msgstr "ПользовательÑкие файлы"
++
++#~ msgid "Custom files"
++#~ msgstr "ПользовательÑкие файлы"
++
++#~ msgid "Detected Files"
++#~ msgstr "Ðайденные файлы"
++
++#~ msgid "Detected files"
++#~ msgstr "Ðайденные файлы"
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Файлы которые необходимо Ñохранить при обновлении прошивки"
++
++#~ msgid "General"
++#~ msgstr "ОÑновные"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "ЗдеÑÑŒ вы можете изменить наÑтройки и функциональноÑÑ‚ÑŒ <abbr title=\"Lua "
++#~ "Конфигурационный ИнтерфейÑ\">LuCI</abbr>."
++
++#~ msgid "Post-commit actions"
++#~ msgstr "ЗапуÑк команд"
++
++#~ msgid ""
++#~ "The following files are detected by the system and will be kept "
++#~ "automatically during sysupgrade"
++#~ msgstr ""
++#~ "Эти файлы были найдены ÑиÑтемой и будут автоматичеÑки Ñохранены во Ð²Ñ€ÐµÐ¼Ñ "
++#~ "Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Эти команды будут запущенны автоматичеÑки когда Ð´Ð°Ð½Ð½Ð°Ñ <abbr title="
++#~ "\"Единый Конфигурационный ИнтерфейÑ\">UCI</abbr> ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° и "
++#~ "Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ принÑÑ‚Ñ‹."
++
++#~ msgid ""
++#~ "This is a list of shell glob patterns for matching files and directories "
++#~ "to include during sysupgrade"
++#~ msgstr ""
++#~ "Это ÑпиÑок дополнительных файлов и директорий (допуÑтимо иÑпользование "
++#~ "регулÑрных выражений) которые будут Ñохранены во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸"
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Web <abbr title=\"Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ\">UI</abbr>"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "<abbr title=\"Туннельный протокол типа точка-точка\">PPTP</abbr>-Сервер"
++
++#~ msgid "AHCP Settings"
++#~ msgstr "AHCP ÐаÑтройки"
++
++#~ msgid "ARP ping retries"
++#~ msgstr "КоличеÑтво ARP попыток"
++
++#~ msgid "ATM Settings"
++#~ msgstr "ÐаÑтройки ATM"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Точка доÑтупа (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Дополнительные наÑтройки pppd"
++
++#~ msgid "Allowed range is 1 to FFFF"
++#~ msgstr "Разрешен диапазон от 1 до FFFF"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "ÐвтоматичеÑкое разъединение"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "ÐаÑтроить локальный DNS Ñервер таким образом, чтобы он иÑпользовал DNS "
++#~ "Ñерверы полученные от PPP пира"
++
++#~ msgid "Connect script"
++#~ msgstr "Скрипт подключениÑ"
++
++#~ msgid "Create backup"
++#~ msgstr "Создать резервную копию"
++
++#~ msgid "Default"
++#~ msgstr "По умолчанию"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Скрипт разъединениÑ"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Изменить ÑпиÑок пакетов и путей уÑтановки"
++
++#~ msgid "Enable 4K VLANs"
++#~ msgstr "Включить 4K VLANы"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Ðктивировать IPv6 в PPP Ñоединении"
++
++#~ msgid "Firmware image"
++#~ msgstr "Прошивка"
++
++#~ msgid "Forward DHCP"
++#~ msgstr "ПеренаправлÑÑ‚ÑŒ DHCP"
++
++#~ msgid "Forward broadcasts"
++#~ msgstr "ПеренаправлÑÑ‚ÑŒ широковещательные ÑообщениÑ"
++
++#~ msgid "HE.net Tunnel ID"
++#~ msgstr "ID Ð¢ÑƒÐ½Ð½ÐµÐ»Ñ HE.net"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "ЗдеÑÑŒ вы можете Ñделать резервную копию и воÑÑтановить конфигурацию "
++#~ "вашего маршрутизатора, еÑли Ñто возможно, или уÑтановить наÑтройки по "
++#~ "умолчанию."
++
++#~ msgid "Installation targets"
++#~ msgstr "Путь уÑтановки"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Сохранить конфигурационные файлы"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Keep-Alive"
++
++#~ msgid "Kernel"
++#~ msgstr "Ядро"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Позволить pppd поÑле уÑпешного ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ маршрут по умолчанию "
++#~ "Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ PPP интерфейÑа"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr "Позволить pppd запуÑтить Ñкрипт поÑле уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ PPP ÑоединениÑ"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "Позволить pppd запуÑтить Ñкрипт до уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ PPP ÑоединениÑ"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "УдоÑтоверьтеÑÑŒ, что вы ввели корректный пин код, иначе вы можете "
++#~ "заблокировать вашу Ñим карту!"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "БольшинÑтво из них Ñетевые Ñерверы, которые выполнÑÑŽÑ‚ определённые задачи "
++#~ "Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… уÑтройÑтв или Ñетей наподобие shell-доÑтупа, web-Ñтраниц таких "
++#~ "как <abbr title=\"Lua Configuration Interface\">LuCI</abbr>, выполнÑÑŽÑ‚ "
++#~ "mesh-маршрутизацию, отправлÑÑŽÑ‚ пиÑьма , ..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr ""
++#~ "КоличеÑтво неудачных Ñоединений Ð´Ð»Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ переподÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº "
++#~ "Ñерверу"
++
++#~ msgid "Override Gateway"
++#~ msgstr "Переопределение шлюза"
++
++#~ msgid "PIN code"
++#~ msgstr "PIN код"
++
++#~ msgid "PPP Settings"
++#~ msgstr "ÐаÑтройки PPP"
++
++#~ msgid "Package lists"
++#~ msgstr "СпиÑок пакетов"
++
++#~ msgid "Port PVIDs on %q"
++#~ msgstr "PVIDы порта на %q"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr ""
++#~ "Перейти к возврашению вÑех наÑтроек и уÑтановить наÑтройки по умолчанию?"
++
++#~ msgid "Processor"
++#~ msgstr "ПроцеÑÑор"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Radius-Порт"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Radius-Сервер"
++
++#~ msgid "Replace default route"
++#~ msgstr "Заменить маршрут по умолчанию"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "СброÑить маршрутизатор к наÑтройкам по умолчанию"
++
++#~ msgid "Routing table ID"
++#~ msgstr "ID таблицы маршрутизации"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr "Таймаут в Ñекундах перед попыткой ÑоединениÑ"
++
++#~ msgid "Server IPv4-Address"
++#~ msgstr "IPv4-ÐÐ´Ñ€ÐµÑ Ñервера"
++
++#~ msgid "Service type"
++#~ msgstr "Тип Ñлужбы"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr "СервиÑÑ‹ и демоны выполнÑÑŽÑ‚ определённые задачи на вашем уÑтройÑтве."
++
++#~ msgid "Settings"
++#~ msgstr "ÐаÑтройки"
++
++#~ msgid "Setup wait time"
++#~ msgstr "УÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Извините. OpenWrt не поддерживает обновление прошивки на данном "
++#~ "уÑтройÑтве.<br /> Вам необходимо вручную обновить прошивку."
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr "Укажите дополнительные аргументы pppd"
++
++#~ msgid "TTL"
++#~ msgstr "TTL"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "Файл уÑтройÑтва вашего модема, например /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr ""
++#~ "Ð’Ñ€ÐµÐ¼Ñ (в Ñек.) поÑле которого неиÑпользованное Ñоединение будет закрыто"
++
++#~ msgid "Time Server (rdate)"
++#~ msgstr "Серверы Ñинхронизации времени (rdate)"
++
++#~ msgid "Tunnel Settings"
++#~ msgstr "ÐаÑтройки туннелированиÑ"
++
++#~ msgid "Update package lists"
++#~ msgstr "Обновить ÑпиÑок пакетов"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "Загрузите образ OpenWRT чтобы обновить прошивку уÑтройÑтва."
++
++#~ msgid "Upload image"
++#~ msgstr "Загрузить образ"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "ИÑпользовать DNS пиров"
++
++#~ msgid "VLAN %d"
++#~ msgstr "VLAN %d"
++
++#~ msgid ""
++#~ "You can specify multiple DNS servers here, press enter to add a new "
++#~ "entry. Servers entered here will override automatically assigned ones."
++#~ msgstr ""
++#~ "Ð’Ñ‹ можете указать неÑколько DNS Ñерверов, нажмите Enter чтобы добавить "
++#~ "новую запиÑÑŒ. Введенные Ñерверы переопределÑÑ‚ адреÑа, назначенные "
++#~ "автоматичеÑки."
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Вам необходимо уÑтановить \"comgt\" Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ UMTS/GPRS, \"ppp-mod-"
++#~ "pppoe\" Ð´Ð»Ñ PPPoE, \"ppp-mod-pppoa\" Ð´Ð»Ñ PPPoA и \"pptp\" Ð´Ð»Ñ PPtP"
++
++#~ msgid "back"
++#~ msgstr "назад"
++
++#~ msgid "buffered"
++#~ msgstr "буфферизовано"
++
++#~ msgid "cached"
++#~ msgstr "кÑшировано"
++
++#~ msgid "free"
++#~ msgstr "Ñвободно"
++
++#~ msgid "static"
++#~ msgstr "ÑтатичеÑкий"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Конфигурационный ИнтерфейÑ\">LuCI</abbr> Ñто Ñвободное "
++#~ "Lua програмное обеÑпечение Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Вебфреймворк и веб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ñтраиваемый в уÑтройÑтва. "
++#~ "<abbr title=\"Lua Конфигурационный ИнтерфейÑ\">LuCI</abbr> "
++#~ "раÑпроÑтранÑетÑÑ Ð¿Ð¾Ð´ лицензией Apache-License."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "<abbr title=\"Secure Shell\">SSH</abbr>-Ключи"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "ПроÑтой HTTP/1.1 веб-Ñервер Ð´Ð»Ñ LuCI, реализованный на \"Си\" и \"Lua\""
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Маленький веб-Ñервер, Ñлужащий Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++
++#~ msgid "About"
++#~ msgstr "О программе"
++
++#~ msgid "Active IP Connections"
++#~ msgstr "Ðктивные IP ÑоединениÑ"
++
++#~ msgid "Addresses"
++#~ msgstr "ÐдреÑа"
++
++#~ msgid "Admin Password"
++#~ msgstr "Пароль админиÑтратора"
++
++#~ msgid "Alias"
++#~ msgstr "ПÑевдоним"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Порт моÑта"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr ""
++#~ "Изменение Ð¿Ð°Ñ€Ð¾Ð»Ñ ÑиÑтемного админиÑтратора (Пользователь <code>root</"
++#~ "code>)"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Клиент + WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "Файл конфигурации"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Таймаут подключениÑ"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Помогавшие в разработке"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "ПриÑвоенный DHCP"
++
++#~ msgid "Document root"
++#~ msgstr "ÐšÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Включить Keep-Alive"
++
++#~ msgid "Enable device"
++#~ msgstr "Включить уÑтройÑтво"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "Ethernet МоÑÑ‚"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "ЗдеÑÑŒ вы можете указать публичный <abbr title=\"Secure Shell\">SSH</abbr>-"
++#~ "Ключ (один на Ñтроку) Ð´Ð»Ñ <abbr title=\"Secure Shell\">SSH</abbr> "
++#~ "публичной-ключевой аутентификации."
++
++#~ msgid "ID"
++#~ msgstr "ID"
++
++#~ msgid "IP Configuration"
++#~ msgstr "IP КонфигурациÑ"
++
++#~ msgid "Interface Status"
++#~ msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа"
++
++#~ msgid "Lead Development"
++#~ msgstr "Ведущие разработчики"
++
++#~ msgid "No address configured on this interface."
++#~ msgstr "Ðа Ñтом интерфейÑе не Ñконфигурирован адреÑ."
++
++#~ msgid "Not configured"
++#~ msgstr "Ðе наÑтроенный"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Пароль уÑпешно изменён"
++
++#~ msgid "Plugin path"
++#~ msgstr "Путь к плагину"
++
++#~ msgid "Ports"
++#~ msgstr "Порты"
++
++#~ msgid "Primary"
++#~ msgstr "Первичный"
++
++#~ msgid "Project Homepage"
++#~ msgstr "ДомашнÑÑ Ñтраница проекта"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "ПÑевдо Ad-Hoc"
++
++#~ msgid "STP"
++#~ msgstr "STP"
++
++#~ msgid "Thanks To"
++#~ msgstr "БлагодарÑ"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr "Что будет показано при авторизации на защищённых Ñтраницах."
++
++#~ msgid "Unknown Error"
++#~ msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "по умолчанию <code>/etc/httpd.conf</code>"
++
++#~ msgid "Enable this switch"
++#~ msgstr "Включить Ñтот Ñетевой коммутатор"
++
++#~ msgid "OPKG error code %i"
++#~ msgstr "Код ошибки OPKG %i"
++
++#~ msgid "Package lists updated"
++#~ msgstr "СпиÑок пакетов обновлён"
++
++#~ msgid "Reset switch during setup"
++#~ msgstr "СброÑить коммутатор во Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñтройки"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "Заменить уÑтановленные пакеты"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "Ртак же Ñдра или ÑервиÑов, ÑиÑтемный журнал может быть так же проÑмотрен "
++#~ "здеÑÑŒ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ что бы получить полный обзор текущего ÑоÑтоÑÐ½Ð¸Ñ ÑиÑтемы."
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "ЗдеÑÑŒ вы можете найти информацию о текущей ÑтатиÑтики ÑиÑтемы вроде "
++#~ "чаÑтоты процеÑÑора, иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ð¼Ñти или Ñетевого интерфейÑа."
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Конфигурационный ИнтерфейÑ\">LuCI</abbr> Ñвободный, "
++#~ "гибкий и дружелюбный графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ Ð½Ð°Ñтройки OpenWrt Kamikaze."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "Ртеперь повеÑелитеÑÑŒ Ñо Ñвоим роутером!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "Так же мы вÑегда желаем улучшить Ñтот интерфейÑ, мы вÑегда обратим "
++#~ "внимание на ваши вопроÑÑ‹ и предложениÑ."
++
++#~ msgid "Hello!"
++#~ msgstr "Добро пожаловать."
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Внимание: Ð’ <abbr title=\"Lua Конфигурационный ИнтерфейÑ\">LuCI</abbr> "
++#~ "Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°ÑŽÑ‚ÑÑ Ð¿Ð¾Ñле Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ - ПринÑÑ‚ÑŒ."
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "С помощью Ñтих Ñтраниц вы можете изменить оÑновные наÑтройки вашего "
++#~ "роутера."
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr "Команда <abbr title=\"Lua Конфигурационный ИнтерфейÑ\">LuCI</abbr>"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Это зона ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ <abbr title=\"Lua Конфигурационный ИнтерфейÑ\">LuCI</"
++#~ "abbr>."
++
++#~ msgid "User Interface"
++#~ msgstr "ПользовательÑкий интерфейÑ"
++
++#~ msgid "enable"
++#~ msgstr "включено"
++
++#, fuzzy
++#~ msgid "(optional)"
++#~ msgstr " (дополнительно)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "<abbr title=\"Служба доменных имён\">DNS</abbr>-Port"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "<abbr title=\"Служба доменных имён\">DNS</abbr>-Сервер будет обращатьÑÑ Ðº "
++#~ "resolvfile"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Протокол динамичеÑкой "
++#~ "конфигурации узла\">DHCP</abbr>-Leases"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Extension Mechanisms "
++#~ "for Domain Name System\">EDNS0</abbr> paket size"
++#~ msgstr ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"РаÑширенный механизм "
++#~ "Ñлужбы доменных имён\">EDNS0</abbr> размер пакета"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "AP-Isolation"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "Добавить Wifi Ñеть в физичеÑкую Ñеть"
++
++#~ msgid "Aliases"
++#~ msgstr "СÑылка"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Clamp Segment Size"
++
++#~ msgid "Devices"
++#~ msgstr "УÑтройÑтва"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "не форвардить реверÑные-Ð´Ð½Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑÑ‹ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð¹ Ñети"
++
++#~ msgid "Errors"
++#~ msgstr "Ошибок"
++
++#~ msgid "Essentials"
++#~ msgstr "Essentials"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Expand Hosts"
++
++#~ msgid "First leased address"
++#~ msgstr "Первый арендованный адреÑ"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++
++#~ msgid "Hardware Address"
++#~ msgstr "ÐÐ´Ñ€ÐµÑ ÑƒÑтройÑтва"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "ЗдеÑÑŒ вы можете наÑтроить уÑтановленные Wi-Fi уÑтройÑтва."
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "ÐезаыиÑÐ¸Ð¼Ð°Ñ (Ad-Hoc)"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Интернет Ñоединение"
++
++#~ msgid "Join (Client)"
++#~ msgstr "ПриÑоединитьÑÑ (Client)"
++
++#~ msgid "Leases"
++#~ msgstr "Leases"
++
++#~ msgid "Local Domain"
++#~ msgstr "Локальный домен"
++
++#~ msgid "Local Network"
++#~ msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñеть"
++
++#~ msgid "Local Server"
++#~ msgstr "Локальный Ñервер"
++
++#, fuzzy
++#~ msgid "Network Boot Image"
++#~ msgstr "<abbr title=\"Служба доменных имён\">DNS</abbr>-Port"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr ""
++#~ "Ðазвание Ñети (<abbr title=\"РаÑширенный идентификатор Ñети\">ESSID</"
++#~ "abbr>)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "КоличеÑтво арендованных адреÑов"
++
++#~ msgid "Perform Actions"
++#~ msgstr "ПринÑÑ‚ÑŒ изменениÑ"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "Ðе позволÑет клиентам обмениватьÑÑ Ð´Ñ€ÑƒÐ³ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼ информацией"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "ОбеÑпечивает (AP)"
++
++#~ msgid "Resolvfile"
++#~ msgstr "Resolvfile"
++
++#, fuzzy
++#~ msgid "TFTP-Server Root"
++#~ msgstr "<abbr title=\"Служба доменных имён\">DNS</abbr>-Port"
++
++#~ msgid "TX / RX"
++#~ msgstr "Перед. / Получ."
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "Данные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ принÑÑ‚Ñ‹"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "ПоÑле перепрошивки <abbr title=\"Lua Конфигурационный ИнтерфейÑ\">LuCI</"
++#~ "abbr> Ñти файлы будут добавлены в обновлённую ÑиÑтему ."
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "С помощью <abbr title=\"Протокол динамичеÑкой конфигурации узла\">DHCP</"
++#~ "abbr> члены Ñетей могут автоматичеÑки получить такие наÑтройки как (<abbr "
++#~ "title=\"Интернет протокол\">IP</abbr>-ÐдреÑ, Ñетевую маÑку, <abbr title="
++#~ "\"Служба доменных имён\">DNS</abbr>-имÑ, ...)."
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "Ð’Ñ‹ можете наÑтраивать различные wifi Ñети на одном уÑтройÑтве. Помните "
++#~ "что еÑÑ‚ÑŒ определённые програмные и аппаратные ограничениÑ. Ðормально вы "
++#~ "можете иÑпользовать например 1 Ad-Hoc или до 3 Точек и Ñимулированных 1 "
++#~ "Клиента."
++
++#, fuzzy
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr "Ошибок"
++
++#~ msgid "additional hostfile"
++#~ msgstr "дополнительный hostfile"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr "ДобавлÑÑ‚ÑŒ доменные имена в хоÑÑ‚Ñ‹"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "автоматичеÑки переподÑоединÑÑ‚ÑÑ"
++
++#~ msgid "concurrent queries"
++#~ msgstr "concurrent queries"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr ""
++#~ "отключить <abbr title=\"Протокол динамичеÑкой конфигурации узла\">DHCP</"
++#~ "abbr> Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ интерфейÑа"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "отÑоединитьÑÑ ÐºÐ¾Ð³Ð´Ð° проÑтой длÑ"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "Don&#39;t cache unknown"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr ""
++#~ "фильтровать ненужные <abbr title=\"Служба доменных имён\">DNS</abbr>-"
++#~ "запроÑÑ‹ Windows-ÑиÑтем"
++
++#~ msgid "installed"
++#~ msgstr "уÑтановленные"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "локализировать Ð¸Ð¼Ñ Ñ…Ð¾Ñта отноÑÑщегоÑÑ Ðº данной подÑети"
++
++#~ msgid "not installed"
++#~ msgstr "не уÑтановленно"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr ""
++#~ "Запрещать кешировать негативные <abbr title=\"Служба доменных имён\">DNS</"
++#~ "abbr>-ответы"
++
++#~ msgid "query port"
++#~ msgstr "порт запроÑов"
++
++#~ msgid "transmitted / received"
++#~ msgstr "передано / получено"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñеть"
++
++#~ msgid "all"
++#~ msgstr "Ð’Ñе"
++
++#~ msgid "Code"
++#~ msgstr "Код"
++
++#~ msgid "Distance"
++#~ msgstr "РаÑÑтоÑние"
++
++#~ msgid "Legend"
++#~ msgstr "ÐадпиÑÑŒ"
++
++#~ msgid "Library"
++#~ msgstr "Библиотека"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "Ñмотрите &#39;%s&#39; руководÑтво"
++
++#~ msgid "Package Manager"
++#~ msgstr "Менеджер пакетов"
++
++#~ msgid "Service"
++#~ msgstr "СервиÑ"
++
++#~ msgid "Statistics"
++#~ msgstr "СтатиÑтика"
++
++#~ msgid "zone"
++#~ msgstr "Зона"
+diff --git a/feeds/luci/modules/luci-base/po/sk/base.po b/feeds/luci/modules/luci-base/po/sk/base.po
+new file mode 100644
+index 0000000..3f328eb
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/sk/base.po
+@@ -0,0 +1,3117 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr ""
++
++msgid "(%s available)"
++msgstr ""
++
++msgid "(empty)"
++msgstr ""
++
++msgid "(no interfaces attached)"
++msgstr ""
++
++msgid "-- Additional Field --"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr ""
++
++msgid "15 Minute Load:"
++msgstr ""
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr ""
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr ""
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr ""
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr ""
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr ""
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr ""
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr ""
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr ""
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr ""
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr ""
++
++msgid "AR Support"
++msgstr ""
++
++msgid "ARP retry threshold"
++msgstr ""
++
++msgid "ATM Bridges"
++msgstr ""
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr ""
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr ""
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++
++msgid "ATM device number"
++msgstr ""
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr ""
++
++msgid "Access Point"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Actions"
++msgstr ""
++
++msgid "Activate this network"
++msgstr ""
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++
++msgid "Active Connections"
++msgstr ""
++
++msgid "Active DHCP Leases"
++msgstr ""
++
++msgid "Active DHCPv6 Leases"
++msgstr ""
++
++msgid "Ad-Hoc"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++
++msgid "Add new interface..."
++msgstr ""
++
++msgid "Additional Hosts files"
++msgstr ""
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Address to access local relay bridge"
++msgstr ""
++
++msgid "Administration"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Alert"
++msgstr ""
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++
++msgid "Allow all except listed"
++msgstr ""
++
++msgid "Allow listed only"
++msgstr ""
++
++msgid "Allow localhost"
++msgstr ""
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++
++msgid "Allow root logins with password"
++msgstr ""
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr ""
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr ""
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr ""
++
++msgid "Antenna 2"
++msgstr ""
++
++msgid "Antenna Configuration"
++msgstr ""
++
++msgid "Any zone"
++msgstr ""
++
++msgid "Apply"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr ""
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr ""
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr ""
++
++msgid "Authoritative"
++msgstr ""
++
++msgid "Authorization Required"
++msgstr ""
++
++msgid "Auto Refresh"
++msgstr ""
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid "Available packages"
++msgstr ""
++
++msgid "Average:"
++msgstr ""
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Back"
++msgstr ""
++
++msgid "Back to Overview"
++msgstr ""
++
++msgid "Back to configuration"
++msgstr ""
++
++msgid "Back to overview"
++msgstr ""
++
++msgid "Back to scan results"
++msgstr ""
++
++msgid "Background Scan"
++msgstr ""
++
++msgid "Backup / Flash Firmware"
++msgstr ""
++
++msgid "Backup / Restore"
++msgstr ""
++
++msgid "Backup file list"
++msgstr ""
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Bogus NX Domain Override"
++msgstr ""
++
++msgid "Bridge"
++msgstr ""
++
++msgid "Bridge interfaces"
++msgstr ""
++
++msgid "Bridge unit number"
++msgstr ""
++
++msgid "Bring up on boot"
++msgstr ""
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr ""
++
++msgid "Buffered"
++msgstr ""
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr ""
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr ""
++
++msgid "CPU usage (%)"
++msgstr ""
++
++msgid "Cancel"
++msgstr ""
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "Changes"
++msgstr ""
++
++msgid "Changes applied."
++msgstr ""
++
++msgid "Changes the administrator password for accessing the device"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check"
++msgstr ""
++
++msgid "Checksum"
++msgstr ""
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++
++msgid "Cipher"
++msgstr ""
++
++msgid ""
++"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)."
++msgstr ""
++
++msgid "Client"
++msgstr ""
++
++msgid "Client ID to send when requesting DHCP"
++msgstr ""
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++
++msgid "Close list..."
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Common Configuration"
++msgstr ""
++
++msgid "Compression"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Configuration applied."
++msgstr ""
++
++msgid "Configuration files will be kept."
++msgstr ""
++
++msgid "Confirmation"
++msgstr ""
++
++msgid "Connect"
++msgstr ""
++
++msgid "Connected"
++msgstr ""
++
++msgid "Connection Limit"
++msgstr ""
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr ""
++
++msgid "Country"
++msgstr ""
++
++msgid "Country Code"
++msgstr ""
++
++msgid "Cover the following interface"
++msgstr ""
++
++msgid "Cover the following interfaces"
++msgstr ""
++
++msgid "Create / Assign firewall-zone"
++msgstr ""
++
++msgid "Create Interface"
++msgstr ""
++
++msgid "Create a bridge over multiple interfaces"
++msgstr ""
++
++msgid "Critical"
++msgstr ""
++
++msgid "Cron Log Level"
++msgstr ""
++
++msgid "Custom Interface"
++msgstr ""
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++
++msgid "DHCP Leases"
++msgstr ""
++
++msgid "DHCP Server"
++msgstr ""
++
++msgid "DHCP and DNS"
++msgstr ""
++
++msgid "DHCP client"
++msgstr ""
++
++msgid "DHCP-Options"
++msgstr ""
++
++msgid "DHCPv6 Leases"
++msgstr ""
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS forwardings"
++msgstr ""
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Default %d"
++msgstr ""
++
++msgid "Default gateway"
++msgstr ""
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr ""
++
++msgid "Define a name for this network."
++msgstr ""
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++
++msgid "Delete"
++msgstr ""
++
++msgid "Delete this interface"
++msgstr ""
++
++msgid "Delete this network"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Design"
++msgstr ""
++
++msgid "Destination"
++msgstr ""
++
++msgid "Device"
++msgstr ""
++
++msgid "Device Configuration"
++msgstr ""
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++
++msgid "Disable DNS setup"
++msgstr ""
++
++msgid "Disable HW-Beacon timer"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Discard upstream RFC1918 responses"
++msgstr ""
++
++msgid "Displaying only packages containing"
++msgstr ""
++
++msgid "Distance Optimization"
++msgstr ""
++
++msgid "Distance to farthest network member in meters."
++msgstr ""
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr ""
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 ""
++
++msgid "Do not send probe responses"
++msgstr ""
++
++msgid "Domain required"
++msgstr ""
++
++msgid "Domain whitelist"
++msgstr ""
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++
++msgid "Download and install package"
++msgstr ""
++
++msgid "Download backup"
++msgstr ""
++
++msgid "Dropbear Instance"
++msgstr ""
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++
++msgid "Dynamic tunnel"
++msgstr ""
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr ""
++
++msgid "Edit"
++msgstr ""
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr ""
++
++msgid "Edit this network"
++msgstr ""
++
++msgid "Emergency"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr ""
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr ""
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr ""
++
++msgid "Enable NTP client"
++msgstr ""
++
++msgid "Enable TFTP server"
++msgstr ""
++
++msgid "Enable VLAN functionality"
++msgstr ""
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr ""
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr ""
++
++msgid "Enable this swap"
++msgstr ""
++
++msgid "Enable/Disable"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr ""
++
++msgid "Encapsulation mode"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Erasing..."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Ethernet Adapter"
++msgstr ""
++
++msgid "Ethernet Switch"
++msgstr ""
++
++msgid "Expand hosts"
++msgstr ""
++
++msgid "Expires"
++msgstr ""
++
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr ""
++
++msgid "External system log server port"
++msgstr ""
++
++msgid "Fast Frames"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "Filename of the boot image advertised to clients"
++msgstr ""
++
++msgid "Filesystem"
++msgstr ""
++
++msgid "Filter"
++msgstr ""
++
++msgid "Filter private"
++msgstr ""
++
++msgid "Filter useless"
++msgstr ""
++
++msgid "Find and join network"
++msgstr ""
++
++msgid "Find package"
++msgstr ""
++
++msgid "Finish"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Firewall Settings"
++msgstr ""
++
++msgid "Firewall Status"
++msgstr ""
++
++msgid "Firmware Version"
++msgstr ""
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr ""
++
++msgid "Flags"
++msgstr ""
++
++msgid "Flash Firmware"
++msgstr ""
++
++msgid "Flash image..."
++msgstr ""
++
++msgid "Flash new firmware image"
++msgstr ""
++
++msgid "Flash operations"
++msgstr ""
++
++msgid "Flashing..."
++msgstr ""
++
++msgid "Force"
++msgstr ""
++
++msgid "Force CCMP (AES)"
++msgstr ""
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++
++msgid "Force TKIP"
++msgstr ""
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr ""
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr ""
++
++msgid "Forward broadcast traffic"
++msgstr ""
++
++msgid "Forwarding mode"
++msgstr ""
++
++msgid "Fragmentation Threshold"
++msgstr ""
++
++msgid "Frame Bursting"
++msgstr ""
++
++msgid "Free"
++msgstr ""
++
++msgid "Free space"
++msgstr ""
++
++msgid "GHz"
++msgstr ""
++
++msgid "GPRS only"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Gateway ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General Setup"
++msgstr ""
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr ""
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr ""
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr ""
++
++msgid "Hang Up"
++msgstr ""
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++
++msgid "Host entries"
++msgstr ""
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Hostname to send when requesting DHCP"
++msgstr ""
++
++msgid "Hostnames"
++msgstr ""
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 Firewall"
++msgstr ""
++
++msgid "IPv4 WAN Status"
++msgstr ""
++
++msgid "IPv4 address"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid "IPv4 gateway"
++msgstr ""
++
++msgid "IPv4 netmask"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 Firewall"
++msgstr ""
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr ""
++
++msgid "IPv6 address"
++msgstr ""
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "IPv6 prefix"
++msgstr ""
++
++msgid "IPv6 prefix length"
++msgstr ""
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr ""
++
++msgid "Identity"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++
++msgid "If unchecked, no default route is configured"
++msgstr ""
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr ""
++
++msgid "Ignore resolve file"
++msgstr ""
++
++msgid "Image"
++msgstr ""
++
++msgid "In"
++msgstr ""
++
++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 ""
++
++msgid "Inbound:"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Initscript"
++msgstr ""
++
++msgid "Initscripts"
++msgstr ""
++
++msgid "Install"
++msgstr ""
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr ""
++
++msgid "Install protocol extensions..."
++msgstr ""
++
++msgid "Installed packages"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface Overview"
++msgstr ""
++
++msgid "Interface is reconnecting..."
++msgstr ""
++
++msgid "Interface is shutting down..."
++msgstr ""
++
++msgid "Interface not present or not connected yet."
++msgstr ""
++
++msgid "Interface reconnected"
++msgstr ""
++
++msgid "Interface shut down"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++
++msgid "Invalid username and/or password! Please try again."
++msgstr ""
++
++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 ""
++
++msgid "Java Script required!"
++msgstr ""
++
++msgid "Join Network"
++msgstr ""
++
++msgid "Join Network: Settings"
++msgstr ""
++
++msgid "Join Network: Wireless Scan"
++msgstr ""
++
++msgid "Keep settings"
++msgstr ""
++
++msgid "Kernel Log"
++msgstr ""
++
++msgid "Kernel Version"
++msgstr ""
++
++msgid "Key"
++msgstr ""
++
++msgid "Key #%d"
++msgstr ""
++
++msgid "Kill"
++msgstr ""
++
++msgid "L2TP"
++msgstr ""
++
++msgid "L2TP Server"
++msgstr ""
++
++msgid "LCP echo failure threshold"
++msgstr ""
++
++msgid "LCP echo interval"
++msgstr ""
++
++msgid "LLC"
++msgstr ""
++
++msgid "Label"
++msgstr ""
++
++msgid "Language"
++msgstr ""
++
++msgid "Language and Style"
++msgstr ""
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Leasefile"
++msgstr ""
++
++msgid "Leasetime"
++msgstr ""
++
++msgid "Leasetime remaining"
++msgstr ""
++
++msgid "Leave empty to autodetect"
++msgstr ""
++
++msgid "Leave empty to use the current WAN address"
++msgstr ""
++
++msgid "Legend:"
++msgstr ""
++
++msgid "Limit"
++msgstr ""
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr ""
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++
++msgid "Listening port for inbound DNS queries"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Load Average"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Local IPv4 address"
++msgstr ""
++
++msgid "Local IPv6 address"
++msgstr ""
++
++msgid "Local Startup"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Local domain"
++msgstr ""
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr ""
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr ""
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr ""
++
++msgid "Log queries"
++msgstr ""
++
++msgid "Logging"
++msgstr ""
++
++msgid "Login"
++msgstr ""
++
++msgid "Logout"
++msgstr ""
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr ""
++
++msgid "MAC-Address Filter"
++msgstr ""
++
++msgid "MAC-Filter"
++msgstr ""
++
++msgid "MAC-List"
++msgstr ""
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr ""
++
++msgid "MHz"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr ""
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr ""
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr ""
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++
++msgid "Maximum hold time"
++msgstr ""
++
++msgid "Maximum number of leased addresses."
++msgstr ""
++
++msgid "Mbit/s"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory usage (%)"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Minimum Rate"
++msgstr ""
++
++msgid "Minimum hold time"
++msgstr ""
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr ""
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr ""
++
++msgid "Mount Entry"
++msgstr ""
++
++msgid "Mount Point"
++msgstr ""
++
++msgid "Mount Points"
++msgstr ""
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++
++msgid "Mount options"
++msgstr ""
++
++msgid "Mount point"
++msgstr ""
++
++msgid "Mounted file systems"
++msgstr ""
++
++msgid "Move down"
++msgstr ""
++
++msgid "Move up"
++msgstr ""
++
++msgid "Multicast Rate"
++msgstr ""
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "NAS ID"
++msgstr ""
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr ""
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Name of the new interface"
++msgstr ""
++
++msgid "Name of the new network"
++msgstr ""
++
++msgid "Navigation"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Utilities"
++msgstr ""
++
++msgid "Network boot image"
++msgstr ""
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr ""
++
++msgid "No DHCP Server configured for this interface"
++msgstr ""
++
++msgid "No chains in this table"
++msgstr ""
++
++msgid "No files found"
++msgstr ""
++
++msgid "No information available"
++msgstr ""
++
++msgid "No negative cache"
++msgstr ""
++
++msgid "No network configured on this device"
++msgstr ""
++
++msgid "No network name specified"
++msgstr ""
++
++msgid "No package lists available"
++msgstr ""
++
++msgid "No password set!"
++msgstr ""
++
++msgid "No rules in this chain"
++msgstr ""
++
++msgid "No zone assigned"
++msgstr ""
++
++msgid "Noise"
++msgstr ""
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "Normal"
++msgstr ""
++
++msgid "Not Found"
++msgstr ""
++
++msgid "Not associated"
++msgstr ""
++
++msgid "Not connected"
++msgstr ""
++
++msgid "Note: Configuration files will be erased."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Nslookup"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "OPKG-Configuration"
++msgstr ""
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++
++msgid "One or more fields contain invalid values!"
++msgstr ""
++
++msgid "One or more required fields have no value!"
++msgstr ""
++
++msgid "Open list..."
++msgstr ""
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr ""
++
++msgid "Option removed"
++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 "Options"
++msgstr ""
++
++msgid "Other:"
++msgstr ""
++
++msgid "Out"
++msgstr ""
++
++msgid "Outbound:"
++msgstr ""
++
++msgid "Outdoor Channels"
++msgstr ""
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Owner"
++msgstr ""
++
++msgid "PAP/CHAP password"
++msgstr ""
++
++msgid "PAP/CHAP username"
++msgstr ""
++
++msgid "PID"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "PPP"
++msgstr ""
++
++msgid "PPPoA Encapsulation"
++msgstr ""
++
++msgid "PPPoATM"
++msgstr ""
++
++msgid "PPPoE"
++msgstr ""
++
++msgid "PPtP"
++msgstr ""
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Package lists are older than 24 hours"
++msgstr ""
++
++msgid "Package name"
++msgstr ""
++
++msgid "Packets"
++msgstr ""
++
++msgid "Part of zone %q"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Password authentication"
++msgstr ""
++
++msgid "Password of Private Key"
++msgstr ""
++
++msgid "Password successfully changed!"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Path to Client-Certificate"
++msgstr ""
++
++msgid "Path to Private Key"
++msgstr ""
++
++msgid "Path to executable which handles the button event"
++msgstr ""
++
++msgid "Peak:"
++msgstr ""
++
++msgid "Perform reboot"
++msgstr ""
++
++msgid "Perform reset"
++msgstr ""
++
++msgid "Phy Rate:"
++msgstr ""
++
++msgid "Physical Settings"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr ""
++
++msgid "Please enter your username and password."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Port %d"
++msgstr ""
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr ""
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr ""
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Prot."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Protocol of the new interface"
++msgstr ""
++
++msgid "Protocol support is not installed"
++msgstr ""
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr ""
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr ""
++
++msgid "RTS/CTS Threshold"
++msgstr ""
++
++msgid "RX"
++msgstr ""
++
++msgid "RX Rate"
++msgstr ""
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr ""
++
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr ""
++
++msgid "Realtime Connections"
++msgstr ""
++
++msgid "Realtime Graphs"
++msgstr ""
++
++msgid "Realtime Load"
++msgstr ""
++
++msgid "Realtime Traffic"
++msgstr ""
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr ""
++
++msgid "Rebooting..."
++msgstr ""
++
++msgid "Reboots the operating system of your device"
++msgstr ""
++
++msgid "Receive"
++msgstr ""
++
++msgid "Receiver Antenna"
++msgstr ""
++
++msgid "Reconnect this interface"
++msgstr ""
++
++msgid "Reconnecting interface"
++msgstr ""
++
++msgid "References"
++msgstr ""
++
++msgid "Regulatory Domain"
++msgstr ""
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr ""
++
++msgid "Remove"
++msgstr ""
++
++msgid "Repeat scan"
++msgstr ""
++
++msgid "Replace entry"
++msgstr ""
++
++msgid "Replace wireless configuration"
++msgstr ""
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++
++msgid "Reset"
++msgstr ""
++
++msgid "Reset Counters"
++msgstr ""
++
++msgid "Reset to defaults"
++msgstr ""
++
++msgid "Resolv and Hosts Files"
++msgstr ""
++
++msgid "Resolve file"
++msgstr ""
++
++msgid "Restart"
++msgstr ""
++
++msgid "Restart Firewall"
++msgstr ""
++
++msgid "Restore backup"
++msgstr ""
++
++msgid "Reveal/hide password"
++msgstr ""
++
++msgid "Revert"
++msgstr ""
++
++msgid "Root"
++msgstr ""
++
++msgid "Root directory for files served via TFTP"
++msgstr ""
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++
++msgid "Rule #"
++msgstr ""
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr ""
++
++msgid "SSH-Keys"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Save & Apply"
++msgstr ""
++
++msgid "Save &#38; Apply"
++msgstr ""
++
++msgid "Scan"
++msgstr ""
++
++msgid "Scheduled Tasks"
++msgstr ""
++
++msgid "Section added"
++msgstr ""
++
++msgid "Section removed"
++msgstr ""
++
++msgid "See \"mount\" manpage for details"
++msgstr ""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr ""
++
++msgid "Separate WDS"
++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 ""
++
++msgid "Service Type"
++msgstr ""
++
++msgid "Services"
++msgstr ""
++
++msgid "Set up Time Synchronization"
++msgstr ""
++
++msgid "Setup DHCP Server"
++msgstr ""
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr ""
++
++msgid "Shutdown this network"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Signal:"
++msgstr ""
++
++msgid "Size"
++msgstr ""
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr ""
++
++msgid "Skip to content"
++msgstr ""
++
++msgid "Skip to navigation"
++msgstr ""
++
++msgid "Slot time"
++msgstr ""
++
++msgid "Software"
++msgstr ""
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr ""
++
++msgid "Sorry, the object you requested was not found."
++msgstr ""
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr ""
++
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++
++msgid "Sort"
++msgstr ""
++
++msgid "Source"
++msgstr ""
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start priority"
++msgstr ""
++
++msgid "Startup"
++msgstr ""
++
++msgid "Static IPv4 Routes"
++msgstr ""
++
++msgid "Static IPv6 Routes"
++msgstr ""
++
++msgid "Static Leases"
++msgstr ""
++
++msgid "Static Routes"
++msgstr ""
++
++msgid "Static WDS"
++msgstr ""
++
++msgid "Static address"
++msgstr ""
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Stop"
++msgstr ""
++
++msgid "Strict order"
++msgstr ""
++
++msgid "Submit"
++msgstr ""
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr ""
++
++msgid "Switch"
++msgstr ""
++
++msgid "Switch %q"
++msgstr ""
++
++msgid "Switch %q (%s)"
++msgstr ""
++
++msgid "Switch protocol"
++msgstr ""
++
++msgid "Sync with browser"
++msgstr ""
++
++msgid "Synchronizing..."
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "System Log"
++msgstr ""
++
++msgid "System Properties"
++msgstr ""
++
++msgid "System log buffer size"
++msgstr ""
++
++msgid "TCP:"
++msgstr ""
++
++msgid "TFTP Settings"
++msgstr ""
++
++msgid "TFTP server root"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid "TX Rate"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "Target"
++msgstr ""
++
++msgid "Terminate"
++msgstr ""
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++
++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 ""
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++
++msgid "The following changes have been committed"
++msgstr ""
++
++msgid "The following changes have been reverted"
++msgstr ""
++
++msgid "The following rules are currently active on this system."
++msgstr ""
++
++msgid "The given network name is not unique"
++msgstr ""
++
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr ""
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"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."
++msgstr ""
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "There are no pending changes to apply!"
++msgstr ""
++
++msgid "There are no pending changes to revert!"
++msgstr ""
++
++msgid "There are no pending changes!"
++msgstr ""
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++
++msgid "This is the plain username for logging into the account"
++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 ""
++
++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 allows the configuration of custom button actions"
++msgstr ""
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time Synchronization"
++msgstr ""
++
++msgid "Time Synchronization is not configured yet."
++msgstr ""
++
++msgid "Timezone"
++msgstr ""
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++
++msgid "Total Available"
++msgstr ""
++
++msgid "Traceroute"
++msgstr ""
++
++msgid "Traffic"
++msgstr ""
++
++msgid "Transfer"
++msgstr ""
++
++msgid "Transmission Rate"
++msgstr ""
++
++msgid "Transmit"
++msgstr ""
++
++msgid "Transmit Power"
++msgstr ""
++
++msgid "Transmitter Antenna"
++msgstr ""
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr ""
++
++msgid "Tunnel Interface"
++msgstr ""
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr ""
++
++msgid "Tx-Power"
++msgstr ""
++
++msgid "Type"
++msgstr ""
++
++msgid "UDP:"
++msgstr ""
++
++msgid "UMTS only"
++msgstr ""
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr ""
++
++msgid "USB Device"
++msgstr ""
++
++msgid "UUID"
++msgstr ""
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "Unknown Error, password not changed!"
++msgstr ""
++
++msgid "Unmanaged"
++msgstr ""
++
++msgid "Unsaved Changes"
++msgstr ""
++
++msgid "Unsupported protocol type."
++msgstr ""
++
++msgid "Update lists"
++msgstr ""
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr ""
++
++msgid "Uploaded File"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr ""
++
++msgid "Use DHCP gateway"
++msgstr ""
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr ""
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr ""
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr ""
++
++msgid "Use default gateway"
++msgstr ""
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr ""
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr ""
++
++msgid "Used Key Slot"
++msgstr ""
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "VC-Mux"
++msgstr ""
++
++msgid "VLAN Interface"
++msgstr ""
++
++msgid "VLANs on %q"
++msgstr ""
++
++msgid "VLANs on %q (%s)"
++msgstr ""
++
++msgid "VPN Server"
++msgstr ""
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "WDS"
++msgstr ""
++
++msgid "WEP Open System"
++msgstr ""
++
++msgid "WEP Shared Key"
++msgstr ""
++
++msgid "WEP passphrase"
++msgstr ""
++
++msgid "WMM Mode"
++msgstr ""
++
++msgid "WPA passphrase"
++msgstr ""
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless Adapter"
++msgstr ""
++
++msgid "Wireless Network"
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Wireless Security"
++msgstr ""
++
++msgid "Wireless is disabled or not associated"
++msgstr ""
++
++msgid "Wireless is restarting..."
++msgstr ""
++
++msgid "Wireless network is disabled"
++msgstr ""
++
++msgid "Wireless network is enabled"
++msgstr ""
++
++msgid "Wireless restarted"
++msgstr ""
++
++msgid "Wireless shut down"
++msgstr ""
++
++msgid "Write received DNS requests to syslog"
++msgstr ""
++
++msgid "XR Support"
++msgstr ""
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++
++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 ""
++
++msgid "any"
++msgstr ""
++
++msgid "auto"
++msgstr ""
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr ""
++
++msgid "bridged"
++msgstr ""
++
++msgid "create:"
++msgstr ""
++
++msgid "creates a bridge over specified interface(s)"
++msgstr ""
++
++msgid "dB"
++msgstr ""
++
++msgid "dBm"
++msgstr ""
++
++msgid "disable"
++msgstr ""
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++
++msgid "forward"
++msgstr ""
++
++msgid "full-duplex"
++msgstr ""
++
++msgid "half-duplex"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hidden"
++msgstr ""
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr ""
++
++msgid "input"
++msgstr ""
++
++msgid "kB"
++msgstr ""
++
++msgid "kB/s"
++msgstr ""
++
++msgid "kbit/s"
++msgstr ""
++
++msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
++msgstr ""
++
++msgid "minimum 1280, maximum 1480"
++msgstr ""
++
++msgid "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "no link"
++msgstr ""
++
++msgid "none"
++msgstr ""
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr ""
++
++msgid "on"
++msgstr ""
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr ""
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "unlimited"
++msgstr ""
++
++msgid "unspecified"
++msgstr ""
++
++msgid "unspecified -or- create:"
++msgstr ""
++
++msgid "untagged"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++msgid "« Back"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-base/po/sv/base.po b/feeds/luci/modules/luci-base/po/sv/base.po
+new file mode 100644
+index 0000000..4e97068
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/sv/base.po
+@@ -0,0 +1,3129 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-04-28 09:22+0200\n"
++"Last-Translator: EricJ <ericj@acc.umu.se>\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr ""
++
++msgid "(%s available)"
++msgstr "(%s tillgängligt)"
++
++msgid "(empty)"
++msgstr "(tomt)"
++
++msgid "(no interfaces attached)"
++msgstr "(inga gränssnitt har bifogats)"
++
++msgid "-- Additional Field --"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr "-- anpassad --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "Belastning senaste minuten:"
++
++msgid "15 Minute Load:"
++msgstr "Belastning senaste 15 minutrarna:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "Belastning senaste 5 minutrarna:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr ""
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr>server-port"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-adress"
++
++# I don't think "Gateway" is commonly translated.
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-nätmask"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-adress eller nätverk "
++"(CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "<abbr title=\"Lysdiod\">LED</abbr>-konfiguration"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr ""
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr ""
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr ""
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr ""
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr ""
++
++msgid "AR Support"
++msgstr ""
++
++msgid "ARP retry threshold"
++msgstr ""
++
++msgid "ATM Bridges"
++msgstr ""
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr ""
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr ""
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++
++msgid "ATM device number"
++msgstr ""
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr ""
++
++msgid "Access Point"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Actions"
++msgstr ""
++
++msgid "Activate this network"
++msgstr ""
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++
++msgid "Active Connections"
++msgstr ""
++
++msgid "Active DHCP Leases"
++msgstr ""
++
++msgid "Active DHCPv6 Leases"
++msgstr ""
++
++msgid "Ad-Hoc"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++
++msgid "Add new interface..."
++msgstr ""
++
++msgid "Additional Hosts files"
++msgstr ""
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Address to access local relay bridge"
++msgstr ""
++
++msgid "Administration"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Alert"
++msgstr ""
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++
++msgid "Allow all except listed"
++msgstr ""
++
++msgid "Allow listed only"
++msgstr ""
++
++msgid "Allow localhost"
++msgstr ""
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++
++msgid "Allow root logins with password"
++msgstr ""
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr ""
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr ""
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr ""
++
++msgid "Antenna 2"
++msgstr ""
++
++msgid "Antenna Configuration"
++msgstr ""
++
++msgid "Any zone"
++msgstr ""
++
++msgid "Apply"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr ""
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr ""
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr ""
++
++msgid "Authoritative"
++msgstr ""
++
++msgid "Authorization Required"
++msgstr ""
++
++msgid "Auto Refresh"
++msgstr ""
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid "Available packages"
++msgstr ""
++
++msgid "Average:"
++msgstr ""
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Back"
++msgstr ""
++
++msgid "Back to Overview"
++msgstr ""
++
++msgid "Back to configuration"
++msgstr ""
++
++msgid "Back to overview"
++msgstr ""
++
++msgid "Back to scan results"
++msgstr ""
++
++msgid "Background Scan"
++msgstr ""
++
++msgid "Backup / Flash Firmware"
++msgstr ""
++
++msgid "Backup / Restore"
++msgstr ""
++
++msgid "Backup file list"
++msgstr ""
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Bogus NX Domain Override"
++msgstr ""
++
++msgid "Bridge"
++msgstr ""
++
++msgid "Bridge interfaces"
++msgstr ""
++
++msgid "Bridge unit number"
++msgstr ""
++
++msgid "Bring up on boot"
++msgstr ""
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr ""
++
++msgid "Buffered"
++msgstr ""
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr ""
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr ""
++
++msgid "CPU usage (%)"
++msgstr ""
++
++msgid "Cancel"
++msgstr ""
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "Changes"
++msgstr ""
++
++msgid "Changes applied."
++msgstr ""
++
++msgid "Changes the administrator password for accessing the device"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check"
++msgstr ""
++
++msgid "Checksum"
++msgstr ""
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++
++msgid "Cipher"
++msgstr ""
++
++msgid ""
++"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)."
++msgstr ""
++
++msgid "Client"
++msgstr ""
++
++msgid "Client ID to send when requesting DHCP"
++msgstr ""
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++
++msgid "Close list..."
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Common Configuration"
++msgstr ""
++
++msgid "Compression"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Configuration applied."
++msgstr ""
++
++msgid "Configuration files will be kept."
++msgstr ""
++
++msgid "Confirmation"
++msgstr ""
++
++msgid "Connect"
++msgstr ""
++
++msgid "Connected"
++msgstr ""
++
++msgid "Connection Limit"
++msgstr ""
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr ""
++
++msgid "Country"
++msgstr ""
++
++msgid "Country Code"
++msgstr ""
++
++msgid "Cover the following interface"
++msgstr ""
++
++msgid "Cover the following interfaces"
++msgstr ""
++
++msgid "Create / Assign firewall-zone"
++msgstr ""
++
++msgid "Create Interface"
++msgstr ""
++
++msgid "Create a bridge over multiple interfaces"
++msgstr ""
++
++msgid "Critical"
++msgstr ""
++
++msgid "Cron Log Level"
++msgstr ""
++
++msgid "Custom Interface"
++msgstr ""
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++
++msgid "DHCP Leases"
++msgstr ""
++
++msgid "DHCP Server"
++msgstr ""
++
++msgid "DHCP and DNS"
++msgstr ""
++
++msgid "DHCP client"
++msgstr ""
++
++msgid "DHCP-Options"
++msgstr ""
++
++msgid "DHCPv6 Leases"
++msgstr ""
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS forwardings"
++msgstr ""
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Default %d"
++msgstr ""
++
++msgid "Default gateway"
++msgstr ""
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr ""
++
++msgid "Define a name for this network."
++msgstr ""
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++
++msgid "Delete"
++msgstr ""
++
++msgid "Delete this interface"
++msgstr ""
++
++msgid "Delete this network"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Design"
++msgstr ""
++
++msgid "Destination"
++msgstr ""
++
++msgid "Device"
++msgstr ""
++
++msgid "Device Configuration"
++msgstr ""
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++
++msgid "Disable DNS setup"
++msgstr ""
++
++msgid "Disable HW-Beacon timer"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Discard upstream RFC1918 responses"
++msgstr ""
++
++msgid "Displaying only packages containing"
++msgstr ""
++
++msgid "Distance Optimization"
++msgstr ""
++
++msgid "Distance to farthest network member in meters."
++msgstr ""
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr ""
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 ""
++
++msgid "Do not send probe responses"
++msgstr ""
++
++msgid "Domain required"
++msgstr ""
++
++msgid "Domain whitelist"
++msgstr ""
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++
++msgid "Download and install package"
++msgstr ""
++
++msgid "Download backup"
++msgstr ""
++
++msgid "Dropbear Instance"
++msgstr ""
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++
++msgid "Dynamic tunnel"
++msgstr ""
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr ""
++
++msgid "Edit"
++msgstr ""
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr ""
++
++msgid "Edit this network"
++msgstr ""
++
++msgid "Emergency"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr ""
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr ""
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr ""
++
++msgid "Enable NTP client"
++msgstr ""
++
++msgid "Enable TFTP server"
++msgstr ""
++
++msgid "Enable VLAN functionality"
++msgstr ""
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr ""
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr ""
++
++msgid "Enable this swap"
++msgstr ""
++
++msgid "Enable/Disable"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr ""
++
++msgid "Encapsulation mode"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Erasing..."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Ethernet Adapter"
++msgstr ""
++
++msgid "Ethernet Switch"
++msgstr ""
++
++msgid "Expand hosts"
++msgstr ""
++
++msgid "Expires"
++msgstr ""
++
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr ""
++
++msgid "External system log server port"
++msgstr ""
++
++msgid "Fast Frames"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "Filename of the boot image advertised to clients"
++msgstr ""
++
++msgid "Filesystem"
++msgstr ""
++
++msgid "Filter"
++msgstr ""
++
++msgid "Filter private"
++msgstr ""
++
++msgid "Filter useless"
++msgstr ""
++
++msgid "Find and join network"
++msgstr ""
++
++msgid "Find package"
++msgstr ""
++
++msgid "Finish"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Firewall Settings"
++msgstr ""
++
++msgid "Firewall Status"
++msgstr ""
++
++msgid "Firmware Version"
++msgstr ""
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr ""
++
++msgid "Flags"
++msgstr ""
++
++msgid "Flash Firmware"
++msgstr ""
++
++msgid "Flash image..."
++msgstr ""
++
++msgid "Flash new firmware image"
++msgstr ""
++
++msgid "Flash operations"
++msgstr ""
++
++msgid "Flashing..."
++msgstr ""
++
++msgid "Force"
++msgstr ""
++
++msgid "Force CCMP (AES)"
++msgstr ""
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++
++msgid "Force TKIP"
++msgstr ""
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr ""
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr ""
++
++msgid "Forward broadcast traffic"
++msgstr ""
++
++msgid "Forwarding mode"
++msgstr ""
++
++msgid "Fragmentation Threshold"
++msgstr ""
++
++msgid "Frame Bursting"
++msgstr ""
++
++msgid "Free"
++msgstr ""
++
++msgid "Free space"
++msgstr ""
++
++msgid "GHz"
++msgstr ""
++
++msgid "GPRS only"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Gateway ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General Setup"
++msgstr ""
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr ""
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr ""
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr ""
++
++msgid "Hang Up"
++msgstr ""
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++
++msgid "Host entries"
++msgstr ""
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Hostname to send when requesting DHCP"
++msgstr ""
++
++msgid "Hostnames"
++msgstr ""
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 Firewall"
++msgstr ""
++
++msgid "IPv4 WAN Status"
++msgstr ""
++
++msgid "IPv4 address"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid "IPv4 gateway"
++msgstr ""
++
++msgid "IPv4 netmask"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 Firewall"
++msgstr ""
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr ""
++
++msgid "IPv6 address"
++msgstr ""
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "IPv6 prefix"
++msgstr ""
++
++msgid "IPv6 prefix length"
++msgstr ""
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr ""
++
++msgid "Identity"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++
++msgid "If unchecked, no default route is configured"
++msgstr ""
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr ""
++
++msgid "Ignore resolve file"
++msgstr ""
++
++msgid "Image"
++msgstr ""
++
++msgid "In"
++msgstr ""
++
++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 ""
++
++msgid "Inbound:"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Initscript"
++msgstr ""
++
++msgid "Initscripts"
++msgstr ""
++
++msgid "Install"
++msgstr ""
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr ""
++
++msgid "Install protocol extensions..."
++msgstr ""
++
++msgid "Installed packages"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface Overview"
++msgstr ""
++
++msgid "Interface is reconnecting..."
++msgstr ""
++
++msgid "Interface is shutting down..."
++msgstr ""
++
++msgid "Interface not present or not connected yet."
++msgstr ""
++
++msgid "Interface reconnected"
++msgstr ""
++
++msgid "Interface shut down"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++
++msgid "Invalid username and/or password! Please try again."
++msgstr ""
++
++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 ""
++
++msgid "Java Script required!"
++msgstr ""
++
++msgid "Join Network"
++msgstr ""
++
++msgid "Join Network: Settings"
++msgstr ""
++
++msgid "Join Network: Wireless Scan"
++msgstr ""
++
++msgid "Keep settings"
++msgstr ""
++
++msgid "Kernel Log"
++msgstr ""
++
++msgid "Kernel Version"
++msgstr ""
++
++msgid "Key"
++msgstr ""
++
++msgid "Key #%d"
++msgstr ""
++
++msgid "Kill"
++msgstr ""
++
++msgid "L2TP"
++msgstr ""
++
++msgid "L2TP Server"
++msgstr ""
++
++msgid "LCP echo failure threshold"
++msgstr ""
++
++msgid "LCP echo interval"
++msgstr ""
++
++msgid "LLC"
++msgstr ""
++
++msgid "Label"
++msgstr ""
++
++msgid "Language"
++msgstr ""
++
++msgid "Language and Style"
++msgstr ""
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Leasefile"
++msgstr ""
++
++msgid "Leasetime"
++msgstr ""
++
++msgid "Leasetime remaining"
++msgstr ""
++
++msgid "Leave empty to autodetect"
++msgstr ""
++
++msgid "Leave empty to use the current WAN address"
++msgstr ""
++
++msgid "Legend:"
++msgstr ""
++
++msgid "Limit"
++msgstr ""
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr ""
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++
++msgid "Listening port for inbound DNS queries"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Load Average"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Local IPv4 address"
++msgstr ""
++
++msgid "Local IPv6 address"
++msgstr ""
++
++msgid "Local Startup"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Local domain"
++msgstr ""
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr ""
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr ""
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr ""
++
++msgid "Log queries"
++msgstr ""
++
++msgid "Logging"
++msgstr ""
++
++msgid "Login"
++msgstr ""
++
++msgid "Logout"
++msgstr ""
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr ""
++
++msgid "MAC-Address Filter"
++msgstr ""
++
++msgid "MAC-Filter"
++msgstr ""
++
++msgid "MAC-List"
++msgstr ""
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr ""
++
++msgid "MHz"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr ""
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr ""
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr ""
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++
++msgid "Maximum hold time"
++msgstr ""
++
++msgid "Maximum number of leased addresses."
++msgstr ""
++
++msgid "Mbit/s"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory usage (%)"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Minimum Rate"
++msgstr ""
++
++msgid "Minimum hold time"
++msgstr ""
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr ""
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr ""
++
++msgid "Mount Entry"
++msgstr ""
++
++msgid "Mount Point"
++msgstr ""
++
++msgid "Mount Points"
++msgstr ""
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++
++msgid "Mount options"
++msgstr ""
++
++msgid "Mount point"
++msgstr ""
++
++msgid "Mounted file systems"
++msgstr ""
++
++msgid "Move down"
++msgstr ""
++
++msgid "Move up"
++msgstr ""
++
++msgid "Multicast Rate"
++msgstr ""
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "NAS ID"
++msgstr ""
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr ""
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Name of the new interface"
++msgstr ""
++
++msgid "Name of the new network"
++msgstr ""
++
++msgid "Navigation"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Utilities"
++msgstr ""
++
++msgid "Network boot image"
++msgstr ""
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr ""
++
++msgid "No DHCP Server configured for this interface"
++msgstr ""
++
++msgid "No chains in this table"
++msgstr ""
++
++msgid "No files found"
++msgstr ""
++
++msgid "No information available"
++msgstr ""
++
++msgid "No negative cache"
++msgstr ""
++
++msgid "No network configured on this device"
++msgstr ""
++
++msgid "No network name specified"
++msgstr ""
++
++msgid "No package lists available"
++msgstr ""
++
++msgid "No password set!"
++msgstr ""
++
++msgid "No rules in this chain"
++msgstr ""
++
++msgid "No zone assigned"
++msgstr ""
++
++msgid "Noise"
++msgstr ""
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "Normal"
++msgstr ""
++
++msgid "Not Found"
++msgstr ""
++
++msgid "Not associated"
++msgstr ""
++
++msgid "Not connected"
++msgstr ""
++
++msgid "Note: Configuration files will be erased."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Nslookup"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "OPKG-Configuration"
++msgstr ""
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++
++msgid "One or more fields contain invalid values!"
++msgstr ""
++
++msgid "One or more required fields have no value!"
++msgstr ""
++
++msgid "Open list..."
++msgstr ""
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr ""
++
++msgid "Option removed"
++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 "Options"
++msgstr ""
++
++msgid "Other:"
++msgstr ""
++
++msgid "Out"
++msgstr ""
++
++msgid "Outbound:"
++msgstr ""
++
++msgid "Outdoor Channels"
++msgstr ""
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Owner"
++msgstr ""
++
++msgid "PAP/CHAP password"
++msgstr ""
++
++msgid "PAP/CHAP username"
++msgstr ""
++
++msgid "PID"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "PPP"
++msgstr ""
++
++msgid "PPPoA Encapsulation"
++msgstr ""
++
++msgid "PPPoATM"
++msgstr ""
++
++msgid "PPPoE"
++msgstr ""
++
++msgid "PPtP"
++msgstr ""
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Package lists are older than 24 hours"
++msgstr ""
++
++msgid "Package name"
++msgstr ""
++
++msgid "Packets"
++msgstr ""
++
++msgid "Part of zone %q"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Password authentication"
++msgstr ""
++
++msgid "Password of Private Key"
++msgstr ""
++
++msgid "Password successfully changed!"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Path to Client-Certificate"
++msgstr ""
++
++msgid "Path to Private Key"
++msgstr ""
++
++msgid "Path to executable which handles the button event"
++msgstr ""
++
++msgid "Peak:"
++msgstr ""
++
++msgid "Perform reboot"
++msgstr ""
++
++msgid "Perform reset"
++msgstr ""
++
++msgid "Phy Rate:"
++msgstr ""
++
++msgid "Physical Settings"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr ""
++
++msgid "Please enter your username and password."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Port %d"
++msgstr ""
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr ""
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr ""
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Prot."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Protocol of the new interface"
++msgstr ""
++
++msgid "Protocol support is not installed"
++msgstr ""
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr ""
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr ""
++
++msgid "RTS/CTS Threshold"
++msgstr ""
++
++msgid "RX"
++msgstr ""
++
++msgid "RX Rate"
++msgstr ""
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr ""
++
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr ""
++
++msgid "Realtime Connections"
++msgstr ""
++
++msgid "Realtime Graphs"
++msgstr ""
++
++msgid "Realtime Load"
++msgstr ""
++
++msgid "Realtime Traffic"
++msgstr ""
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr ""
++
++msgid "Rebooting..."
++msgstr ""
++
++msgid "Reboots the operating system of your device"
++msgstr ""
++
++msgid "Receive"
++msgstr ""
++
++msgid "Receiver Antenna"
++msgstr ""
++
++msgid "Reconnect this interface"
++msgstr ""
++
++msgid "Reconnecting interface"
++msgstr ""
++
++msgid "References"
++msgstr ""
++
++msgid "Regulatory Domain"
++msgstr ""
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr ""
++
++msgid "Remove"
++msgstr ""
++
++msgid "Repeat scan"
++msgstr ""
++
++msgid "Replace entry"
++msgstr ""
++
++msgid "Replace wireless configuration"
++msgstr ""
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++
++msgid "Reset"
++msgstr ""
++
++msgid "Reset Counters"
++msgstr ""
++
++msgid "Reset to defaults"
++msgstr ""
++
++msgid "Resolv and Hosts Files"
++msgstr ""
++
++msgid "Resolve file"
++msgstr ""
++
++msgid "Restart"
++msgstr ""
++
++msgid "Restart Firewall"
++msgstr ""
++
++msgid "Restore backup"
++msgstr ""
++
++msgid "Reveal/hide password"
++msgstr ""
++
++msgid "Revert"
++msgstr ""
++
++msgid "Root"
++msgstr ""
++
++msgid "Root directory for files served via TFTP"
++msgstr ""
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++
++msgid "Rule #"
++msgstr ""
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr ""
++
++msgid "SSH-Keys"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Save & Apply"
++msgstr ""
++
++msgid "Save &#38; Apply"
++msgstr ""
++
++msgid "Scan"
++msgstr ""
++
++msgid "Scheduled Tasks"
++msgstr ""
++
++msgid "Section added"
++msgstr ""
++
++msgid "Section removed"
++msgstr ""
++
++msgid "See \"mount\" manpage for details"
++msgstr ""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr ""
++
++msgid "Separate WDS"
++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 ""
++
++msgid "Service Type"
++msgstr ""
++
++msgid "Services"
++msgstr ""
++
++msgid "Set up Time Synchronization"
++msgstr ""
++
++msgid "Setup DHCP Server"
++msgstr ""
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr ""
++
++msgid "Shutdown this network"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Signal:"
++msgstr ""
++
++msgid "Size"
++msgstr ""
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr ""
++
++msgid "Skip to content"
++msgstr ""
++
++msgid "Skip to navigation"
++msgstr ""
++
++msgid "Slot time"
++msgstr ""
++
++msgid "Software"
++msgstr ""
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr ""
++
++msgid "Sorry, the object you requested was not found."
++msgstr ""
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr ""
++
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++
++msgid "Sort"
++msgstr ""
++
++msgid "Source"
++msgstr ""
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start priority"
++msgstr ""
++
++msgid "Startup"
++msgstr ""
++
++msgid "Static IPv4 Routes"
++msgstr ""
++
++msgid "Static IPv6 Routes"
++msgstr ""
++
++msgid "Static Leases"
++msgstr ""
++
++msgid "Static Routes"
++msgstr ""
++
++msgid "Static WDS"
++msgstr ""
++
++msgid "Static address"
++msgstr ""
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Stop"
++msgstr ""
++
++msgid "Strict order"
++msgstr ""
++
++msgid "Submit"
++msgstr ""
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr ""
++
++msgid "Switch"
++msgstr ""
++
++msgid "Switch %q"
++msgstr ""
++
++msgid "Switch %q (%s)"
++msgstr ""
++
++msgid "Switch protocol"
++msgstr ""
++
++msgid "Sync with browser"
++msgstr ""
++
++msgid "Synchronizing..."
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "System Log"
++msgstr ""
++
++msgid "System Properties"
++msgstr ""
++
++msgid "System log buffer size"
++msgstr ""
++
++msgid "TCP:"
++msgstr ""
++
++msgid "TFTP Settings"
++msgstr ""
++
++msgid "TFTP server root"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid "TX Rate"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "Target"
++msgstr ""
++
++msgid "Terminate"
++msgstr ""
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++
++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 ""
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++
++msgid "The following changes have been committed"
++msgstr ""
++
++msgid "The following changes have been reverted"
++msgstr ""
++
++msgid "The following rules are currently active on this system."
++msgstr ""
++
++msgid "The given network name is not unique"
++msgstr ""
++
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr ""
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"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."
++msgstr ""
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "There are no pending changes to apply!"
++msgstr ""
++
++msgid "There are no pending changes to revert!"
++msgstr ""
++
++msgid "There are no pending changes!"
++msgstr ""
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++
++msgid "This is the plain username for logging into the account"
++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 ""
++
++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 allows the configuration of custom button actions"
++msgstr ""
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time Synchronization"
++msgstr ""
++
++msgid "Time Synchronization is not configured yet."
++msgstr ""
++
++msgid "Timezone"
++msgstr ""
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++
++msgid "Total Available"
++msgstr ""
++
++msgid "Traceroute"
++msgstr ""
++
++msgid "Traffic"
++msgstr ""
++
++msgid "Transfer"
++msgstr ""
++
++msgid "Transmission Rate"
++msgstr ""
++
++msgid "Transmit"
++msgstr ""
++
++msgid "Transmit Power"
++msgstr ""
++
++msgid "Transmitter Antenna"
++msgstr ""
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr ""
++
++msgid "Tunnel Interface"
++msgstr ""
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr ""
++
++msgid "Tx-Power"
++msgstr ""
++
++msgid "Type"
++msgstr ""
++
++msgid "UDP:"
++msgstr ""
++
++msgid "UMTS only"
++msgstr ""
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr ""
++
++msgid "USB Device"
++msgstr ""
++
++msgid "UUID"
++msgstr ""
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "Unknown Error, password not changed!"
++msgstr ""
++
++msgid "Unmanaged"
++msgstr ""
++
++msgid "Unsaved Changes"
++msgstr ""
++
++msgid "Unsupported protocol type."
++msgstr ""
++
++msgid "Update lists"
++msgstr ""
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr ""
++
++msgid "Uploaded File"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr ""
++
++msgid "Use DHCP gateway"
++msgstr ""
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr ""
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr ""
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr ""
++
++msgid "Use default gateway"
++msgstr ""
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr ""
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr ""
++
++msgid "Used Key Slot"
++msgstr ""
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "VC-Mux"
++msgstr ""
++
++msgid "VLAN Interface"
++msgstr ""
++
++msgid "VLANs on %q"
++msgstr ""
++
++msgid "VLANs on %q (%s)"
++msgstr ""
++
++msgid "VPN Server"
++msgstr ""
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "WDS"
++msgstr ""
++
++msgid "WEP Open System"
++msgstr ""
++
++msgid "WEP Shared Key"
++msgstr ""
++
++msgid "WEP passphrase"
++msgstr ""
++
++msgid "WMM Mode"
++msgstr ""
++
++msgid "WPA passphrase"
++msgstr ""
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless Adapter"
++msgstr ""
++
++msgid "Wireless Network"
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Wireless Security"
++msgstr ""
++
++msgid "Wireless is disabled or not associated"
++msgstr ""
++
++msgid "Wireless is restarting..."
++msgstr ""
++
++msgid "Wireless network is disabled"
++msgstr ""
++
++msgid "Wireless network is enabled"
++msgstr ""
++
++msgid "Wireless restarted"
++msgstr ""
++
++msgid "Wireless shut down"
++msgstr ""
++
++msgid "Write received DNS requests to syslog"
++msgstr ""
++
++msgid "XR Support"
++msgstr ""
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++
++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 ""
++
++msgid "any"
++msgstr ""
++
++msgid "auto"
++msgstr ""
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr ""
++
++msgid "bridged"
++msgstr ""
++
++msgid "create:"
++msgstr ""
++
++msgid "creates a bridge over specified interface(s)"
++msgstr ""
++
++msgid "dB"
++msgstr ""
++
++msgid "dBm"
++msgstr ""
++
++msgid "disable"
++msgstr ""
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++
++msgid "forward"
++msgstr ""
++
++msgid "full-duplex"
++msgstr ""
++
++msgid "half-duplex"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hidden"
++msgstr ""
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr ""
++
++msgid "input"
++msgstr ""
++
++msgid "kB"
++msgstr ""
++
++msgid "kB/s"
++msgstr ""
++
++msgid "kbit/s"
++msgstr ""
++
++msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
++msgstr ""
++
++msgid "minimum 1280, maximum 1480"
++msgstr ""
++
++msgid "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "no link"
++msgstr ""
++
++msgid "none"
++msgstr ""
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr ""
++
++msgid "on"
++msgstr ""
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr ""
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "unlimited"
++msgstr ""
++
++msgid "unspecified"
++msgstr ""
++
++msgid "unspecified -or- create:"
++msgstr ""
++
++msgid "untagged"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++msgid "« Back"
++msgstr ""
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz andra kanalen ovanför"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz andra kanalen nedanför"
+diff --git a/feeds/luci/modules/luci-base/po/templates/base.pot b/feeds/luci/modules/luci-base/po/templates/base.pot
+new file mode 100644
+index 0000000..d0211cc
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/templates/base.pot
+@@ -0,0 +1,3110 @@
++msgid ""
++msgstr "Content-Type: text/plain; charset=UTF-8"
++
++msgid "(%d minute window, %d second interval)"
++msgstr ""
++
++msgid "(%s available)"
++msgstr ""
++
++msgid "(empty)"
++msgstr ""
++
++msgid "(no interfaces attached)"
++msgstr ""
++
++msgid "-- Additional Field --"
++msgstr ""
++
++msgid "-- Please choose --"
++msgstr ""
++
++msgid "-- custom --"
++msgstr ""
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr ""
++
++msgid "15 Minute Load:"
++msgstr ""
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr ""
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr ""
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr ""
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr ""
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr ""
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr ""
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr ""
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr ""
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr ""
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr ""
++
++msgid "AR Support"
++msgstr ""
++
++msgid "ARP retry threshold"
++msgstr ""
++
++msgid "ATM Bridges"
++msgstr ""
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr ""
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr ""
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++
++msgid "ATM device number"
++msgstr ""
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr ""
++
++msgid "Access Point"
++msgstr ""
++
++msgid "Action"
++msgstr ""
++
++msgid "Actions"
++msgstr ""
++
++msgid "Activate this network"
++msgstr ""
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++
++msgid "Active Connections"
++msgstr ""
++
++msgid "Active DHCP Leases"
++msgstr ""
++
++msgid "Active DHCPv6 Leases"
++msgstr ""
++
++msgid "Ad-Hoc"
++msgstr ""
++
++msgid "Add"
++msgstr ""
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++
++msgid "Add new interface..."
++msgstr ""
++
++msgid "Additional Hosts files"
++msgstr ""
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Address to access local relay bridge"
++msgstr ""
++
++msgid "Administration"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Alert"
++msgstr ""
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++
++msgid "Allow all except listed"
++msgstr ""
++
++msgid "Allow listed only"
++msgstr ""
++
++msgid "Allow localhost"
++msgstr ""
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++
++msgid "Allow root logins with password"
++msgstr ""
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr ""
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr ""
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr ""
++
++msgid "Antenna 2"
++msgstr ""
++
++msgid "Antenna Configuration"
++msgstr ""
++
++msgid "Any zone"
++msgstr ""
++
++msgid "Apply"
++msgstr ""
++
++msgid "Applying changes"
++msgstr ""
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr ""
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr ""
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr ""
++
++msgid "Authoritative"
++msgstr ""
++
++msgid "Authorization Required"
++msgstr ""
++
++msgid "Auto Refresh"
++msgstr ""
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr ""
++
++msgid "Available packages"
++msgstr ""
++
++msgid "Average:"
++msgstr ""
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Back"
++msgstr ""
++
++msgid "Back to Overview"
++msgstr ""
++
++msgid "Back to configuration"
++msgstr ""
++
++msgid "Back to overview"
++msgstr ""
++
++msgid "Back to scan results"
++msgstr ""
++
++msgid "Background Scan"
++msgstr ""
++
++msgid "Backup / Flash Firmware"
++msgstr ""
++
++msgid "Backup / Restore"
++msgstr ""
++
++msgid "Backup file list"
++msgstr ""
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Bogus NX Domain Override"
++msgstr ""
++
++msgid "Bridge"
++msgstr ""
++
++msgid "Bridge interfaces"
++msgstr ""
++
++msgid "Bridge unit number"
++msgstr ""
++
++msgid "Bring up on boot"
++msgstr ""
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr ""
++
++msgid "Buffered"
++msgstr ""
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr ""
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr ""
++
++msgid "CPU usage (%)"
++msgstr ""
++
++msgid "Cancel"
++msgstr ""
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "Changes"
++msgstr ""
++
++msgid "Changes applied."
++msgstr ""
++
++msgid "Changes the administrator password for accessing the device"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check"
++msgstr ""
++
++msgid "Checksum"
++msgstr ""
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++
++msgid "Cipher"
++msgstr ""
++
++msgid ""
++"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)."
++msgstr ""
++
++msgid "Client"
++msgstr ""
++
++msgid "Client ID to send when requesting DHCP"
++msgstr ""
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++
++msgid "Close list..."
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Common Configuration"
++msgstr ""
++
++msgid "Compression"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Configuration applied."
++msgstr ""
++
++msgid "Configuration files will be kept."
++msgstr ""
++
++msgid "Confirmation"
++msgstr ""
++
++msgid "Connect"
++msgstr ""
++
++msgid "Connected"
++msgstr ""
++
++msgid "Connection Limit"
++msgstr ""
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr ""
++
++msgid "Country"
++msgstr ""
++
++msgid "Country Code"
++msgstr ""
++
++msgid "Cover the following interface"
++msgstr ""
++
++msgid "Cover the following interfaces"
++msgstr ""
++
++msgid "Create / Assign firewall-zone"
++msgstr ""
++
++msgid "Create Interface"
++msgstr ""
++
++msgid "Create a bridge over multiple interfaces"
++msgstr ""
++
++msgid "Critical"
++msgstr ""
++
++msgid "Cron Log Level"
++msgstr ""
++
++msgid "Custom Interface"
++msgstr ""
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++
++msgid "DHCP Leases"
++msgstr ""
++
++msgid "DHCP Server"
++msgstr ""
++
++msgid "DHCP and DNS"
++msgstr ""
++
++msgid "DHCP client"
++msgstr ""
++
++msgid "DHCP-Options"
++msgstr ""
++
++msgid "DHCPv6 Leases"
++msgstr ""
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS forwardings"
++msgstr ""
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Default %d"
++msgstr ""
++
++msgid "Default gateway"
++msgstr ""
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr ""
++
++msgid "Define a name for this network."
++msgstr ""
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++
++msgid "Delete"
++msgstr ""
++
++msgid "Delete this interface"
++msgstr ""
++
++msgid "Delete this network"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Design"
++msgstr ""
++
++msgid "Destination"
++msgstr ""
++
++msgid "Device"
++msgstr ""
++
++msgid "Device Configuration"
++msgstr ""
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++
++msgid "Disable DNS setup"
++msgstr ""
++
++msgid "Disable HW-Beacon timer"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Discard upstream RFC1918 responses"
++msgstr ""
++
++msgid "Displaying only packages containing"
++msgstr ""
++
++msgid "Distance Optimization"
++msgstr ""
++
++msgid "Distance to farthest network member in meters."
++msgstr ""
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr ""
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 ""
++
++msgid "Do not send probe responses"
++msgstr ""
++
++msgid "Domain required"
++msgstr ""
++
++msgid "Domain whitelist"
++msgstr ""
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++
++msgid "Download and install package"
++msgstr ""
++
++msgid "Download backup"
++msgstr ""
++
++msgid "Dropbear Instance"
++msgstr ""
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++
++msgid "Dynamic tunnel"
++msgstr ""
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr ""
++
++msgid "Edit"
++msgstr ""
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr ""
++
++msgid "Edit this network"
++msgstr ""
++
++msgid "Emergency"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr ""
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr ""
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr ""
++
++msgid "Enable NTP client"
++msgstr ""
++
++msgid "Enable TFTP server"
++msgstr ""
++
++msgid "Enable VLAN functionality"
++msgstr ""
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr ""
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr ""
++
++msgid "Enable this swap"
++msgstr ""
++
++msgid "Enable/Disable"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr ""
++
++msgid "Encapsulation mode"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Erasing..."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Ethernet Adapter"
++msgstr ""
++
++msgid "Ethernet Switch"
++msgstr ""
++
++msgid "Expand hosts"
++msgstr ""
++
++msgid "Expires"
++msgstr ""
++
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr ""
++
++msgid "External system log server port"
++msgstr ""
++
++msgid "Fast Frames"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "Filename of the boot image advertised to clients"
++msgstr ""
++
++msgid "Filesystem"
++msgstr ""
++
++msgid "Filter"
++msgstr ""
++
++msgid "Filter private"
++msgstr ""
++
++msgid "Filter useless"
++msgstr ""
++
++msgid "Find and join network"
++msgstr ""
++
++msgid "Find package"
++msgstr ""
++
++msgid "Finish"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Firewall Settings"
++msgstr ""
++
++msgid "Firewall Status"
++msgstr ""
++
++msgid "Firmware Version"
++msgstr ""
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr ""
++
++msgid "Flags"
++msgstr ""
++
++msgid "Flash Firmware"
++msgstr ""
++
++msgid "Flash image..."
++msgstr ""
++
++msgid "Flash new firmware image"
++msgstr ""
++
++msgid "Flash operations"
++msgstr ""
++
++msgid "Flashing..."
++msgstr ""
++
++msgid "Force"
++msgstr ""
++
++msgid "Force CCMP (AES)"
++msgstr ""
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++
++msgid "Force TKIP"
++msgstr ""
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr ""
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr ""
++
++msgid "Forward broadcast traffic"
++msgstr ""
++
++msgid "Forwarding mode"
++msgstr ""
++
++msgid "Fragmentation Threshold"
++msgstr ""
++
++msgid "Frame Bursting"
++msgstr ""
++
++msgid "Free"
++msgstr ""
++
++msgid "Free space"
++msgstr ""
++
++msgid "GHz"
++msgstr ""
++
++msgid "GPRS only"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Gateway ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General Setup"
++msgstr ""
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr ""
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr ""
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr ""
++
++msgid "Hang Up"
++msgstr ""
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++
++msgid "Host entries"
++msgstr ""
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Hostname to send when requesting DHCP"
++msgstr ""
++
++msgid "Hostnames"
++msgstr ""
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 Firewall"
++msgstr ""
++
++msgid "IPv4 WAN Status"
++msgstr ""
++
++msgid "IPv4 address"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid "IPv4 gateway"
++msgstr ""
++
++msgid "IPv4 netmask"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 Firewall"
++msgstr ""
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr ""
++
++msgid "IPv6 address"
++msgstr ""
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "IPv6 prefix"
++msgstr ""
++
++msgid "IPv6 prefix length"
++msgstr ""
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr ""
++
++msgid "Identity"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++
++msgid "If unchecked, no default route is configured"
++msgstr ""
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr ""
++
++msgid "Ignore resolve file"
++msgstr ""
++
++msgid "Image"
++msgstr ""
++
++msgid "In"
++msgstr ""
++
++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 ""
++
++msgid "Inbound:"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Initscript"
++msgstr ""
++
++msgid "Initscripts"
++msgstr ""
++
++msgid "Install"
++msgstr ""
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr ""
++
++msgid "Install protocol extensions..."
++msgstr ""
++
++msgid "Installed packages"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface Overview"
++msgstr ""
++
++msgid "Interface is reconnecting..."
++msgstr ""
++
++msgid "Interface is shutting down..."
++msgstr ""
++
++msgid "Interface not present or not connected yet."
++msgstr ""
++
++msgid "Interface reconnected"
++msgstr ""
++
++msgid "Interface shut down"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++
++msgid "Invalid username and/or password! Please try again."
++msgstr ""
++
++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 ""
++
++msgid "Java Script required!"
++msgstr ""
++
++msgid "Join Network"
++msgstr ""
++
++msgid "Join Network: Settings"
++msgstr ""
++
++msgid "Join Network: Wireless Scan"
++msgstr ""
++
++msgid "Keep settings"
++msgstr ""
++
++msgid "Kernel Log"
++msgstr ""
++
++msgid "Kernel Version"
++msgstr ""
++
++msgid "Key"
++msgstr ""
++
++msgid "Key #%d"
++msgstr ""
++
++msgid "Kill"
++msgstr ""
++
++msgid "L2TP"
++msgstr ""
++
++msgid "L2TP Server"
++msgstr ""
++
++msgid "LCP echo failure threshold"
++msgstr ""
++
++msgid "LCP echo interval"
++msgstr ""
++
++msgid "LLC"
++msgstr ""
++
++msgid "Label"
++msgstr ""
++
++msgid "Language"
++msgstr ""
++
++msgid "Language and Style"
++msgstr ""
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Leasefile"
++msgstr ""
++
++msgid "Leasetime"
++msgstr ""
++
++msgid "Leasetime remaining"
++msgstr ""
++
++msgid "Leave empty to autodetect"
++msgstr ""
++
++msgid "Leave empty to use the current WAN address"
++msgstr ""
++
++msgid "Legend:"
++msgstr ""
++
++msgid "Limit"
++msgstr ""
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr ""
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++
++msgid "Listening port for inbound DNS queries"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Load Average"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Local IPv4 address"
++msgstr ""
++
++msgid "Local IPv6 address"
++msgstr ""
++
++msgid "Local Startup"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Local domain"
++msgstr ""
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr ""
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr ""
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr ""
++
++msgid "Log queries"
++msgstr ""
++
++msgid "Logging"
++msgstr ""
++
++msgid "Login"
++msgstr ""
++
++msgid "Logout"
++msgstr ""
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr ""
++
++msgid "MAC-Address Filter"
++msgstr ""
++
++msgid "MAC-Filter"
++msgstr ""
++
++msgid "MAC-List"
++msgstr ""
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr ""
++
++msgid "MHz"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr ""
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr ""
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr ""
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++
++msgid "Maximum hold time"
++msgstr ""
++
++msgid "Maximum number of leased addresses."
++msgstr ""
++
++msgid "Mbit/s"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory usage (%)"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Minimum Rate"
++msgstr ""
++
++msgid "Minimum hold time"
++msgstr ""
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr ""
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr ""
++
++msgid "Mount Entry"
++msgstr ""
++
++msgid "Mount Point"
++msgstr ""
++
++msgid "Mount Points"
++msgstr ""
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++
++msgid "Mount options"
++msgstr ""
++
++msgid "Mount point"
++msgstr ""
++
++msgid "Mounted file systems"
++msgstr ""
++
++msgid "Move down"
++msgstr ""
++
++msgid "Move up"
++msgstr ""
++
++msgid "Multicast Rate"
++msgstr ""
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "NAS ID"
++msgstr ""
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr ""
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Name of the new interface"
++msgstr ""
++
++msgid "Name of the new network"
++msgstr ""
++
++msgid "Navigation"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Utilities"
++msgstr ""
++
++msgid "Network boot image"
++msgstr ""
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr ""
++
++msgid "No DHCP Server configured for this interface"
++msgstr ""
++
++msgid "No chains in this table"
++msgstr ""
++
++msgid "No files found"
++msgstr ""
++
++msgid "No information available"
++msgstr ""
++
++msgid "No negative cache"
++msgstr ""
++
++msgid "No network configured on this device"
++msgstr ""
++
++msgid "No network name specified"
++msgstr ""
++
++msgid "No package lists available"
++msgstr ""
++
++msgid "No password set!"
++msgstr ""
++
++msgid "No rules in this chain"
++msgstr ""
++
++msgid "No zone assigned"
++msgstr ""
++
++msgid "Noise"
++msgstr ""
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "Normal"
++msgstr ""
++
++msgid "Not Found"
++msgstr ""
++
++msgid "Not associated"
++msgstr ""
++
++msgid "Not connected"
++msgstr ""
++
++msgid "Note: Configuration files will be erased."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Nslookup"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "OPKG-Configuration"
++msgstr ""
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++
++msgid "One or more fields contain invalid values!"
++msgstr ""
++
++msgid "One or more required fields have no value!"
++msgstr ""
++
++msgid "Open list..."
++msgstr ""
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr ""
++
++msgid "Option removed"
++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 "Options"
++msgstr ""
++
++msgid "Other:"
++msgstr ""
++
++msgid "Out"
++msgstr ""
++
++msgid "Outbound:"
++msgstr ""
++
++msgid "Outdoor Channels"
++msgstr ""
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Owner"
++msgstr ""
++
++msgid "PAP/CHAP password"
++msgstr ""
++
++msgid "PAP/CHAP username"
++msgstr ""
++
++msgid "PID"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "PPP"
++msgstr ""
++
++msgid "PPPoA Encapsulation"
++msgstr ""
++
++msgid "PPPoATM"
++msgstr ""
++
++msgid "PPPoE"
++msgstr ""
++
++msgid "PPtP"
++msgstr ""
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Package lists are older than 24 hours"
++msgstr ""
++
++msgid "Package name"
++msgstr ""
++
++msgid "Packets"
++msgstr ""
++
++msgid "Part of zone %q"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Password authentication"
++msgstr ""
++
++msgid "Password of Private Key"
++msgstr ""
++
++msgid "Password successfully changed!"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Path to Client-Certificate"
++msgstr ""
++
++msgid "Path to Private Key"
++msgstr ""
++
++msgid "Path to executable which handles the button event"
++msgstr ""
++
++msgid "Peak:"
++msgstr ""
++
++msgid "Perform reboot"
++msgstr ""
++
++msgid "Perform reset"
++msgstr ""
++
++msgid "Phy Rate:"
++msgstr ""
++
++msgid "Physical Settings"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr ""
++
++msgid "Please enter your username and password."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Port %d"
++msgstr ""
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr ""
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr ""
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Prot."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Protocol of the new interface"
++msgstr ""
++
++msgid "Protocol support is not installed"
++msgstr ""
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr ""
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr ""
++
++msgid "RTS/CTS Threshold"
++msgstr ""
++
++msgid "RX"
++msgstr ""
++
++msgid "RX Rate"
++msgstr ""
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr ""
++
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr ""
++
++msgid "Realtime Connections"
++msgstr ""
++
++msgid "Realtime Graphs"
++msgstr ""
++
++msgid "Realtime Load"
++msgstr ""
++
++msgid "Realtime Traffic"
++msgstr ""
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr ""
++
++msgid "Rebooting..."
++msgstr ""
++
++msgid "Reboots the operating system of your device"
++msgstr ""
++
++msgid "Receive"
++msgstr ""
++
++msgid "Receiver Antenna"
++msgstr ""
++
++msgid "Reconnect this interface"
++msgstr ""
++
++msgid "Reconnecting interface"
++msgstr ""
++
++msgid "References"
++msgstr ""
++
++msgid "Regulatory Domain"
++msgstr ""
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr ""
++
++msgid "Remove"
++msgstr ""
++
++msgid "Repeat scan"
++msgstr ""
++
++msgid "Replace entry"
++msgstr ""
++
++msgid "Replace wireless configuration"
++msgstr ""
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++
++msgid "Reset"
++msgstr ""
++
++msgid "Reset Counters"
++msgstr ""
++
++msgid "Reset to defaults"
++msgstr ""
++
++msgid "Resolv and Hosts Files"
++msgstr ""
++
++msgid "Resolve file"
++msgstr ""
++
++msgid "Restart"
++msgstr ""
++
++msgid "Restart Firewall"
++msgstr ""
++
++msgid "Restore backup"
++msgstr ""
++
++msgid "Reveal/hide password"
++msgstr ""
++
++msgid "Revert"
++msgstr ""
++
++msgid "Root"
++msgstr ""
++
++msgid "Root directory for files served via TFTP"
++msgstr ""
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++
++msgid "Rule #"
++msgstr ""
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr ""
++
++msgid "SSH-Keys"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Save & Apply"
++msgstr ""
++
++msgid "Save &#38; Apply"
++msgstr ""
++
++msgid "Scan"
++msgstr ""
++
++msgid "Scheduled Tasks"
++msgstr ""
++
++msgid "Section added"
++msgstr ""
++
++msgid "Section removed"
++msgstr ""
++
++msgid "See \"mount\" manpage for details"
++msgstr ""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr ""
++
++msgid "Separate WDS"
++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 ""
++
++msgid "Service Type"
++msgstr ""
++
++msgid "Services"
++msgstr ""
++
++msgid "Set up Time Synchronization"
++msgstr ""
++
++msgid "Setup DHCP Server"
++msgstr ""
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr ""
++
++msgid "Shutdown this network"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Signal:"
++msgstr ""
++
++msgid "Size"
++msgstr ""
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr ""
++
++msgid "Skip to content"
++msgstr ""
++
++msgid "Skip to navigation"
++msgstr ""
++
++msgid "Slot time"
++msgstr ""
++
++msgid "Software"
++msgstr ""
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr ""
++
++msgid "Sorry, the object you requested was not found."
++msgstr ""
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr ""
++
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++
++msgid "Sort"
++msgstr ""
++
++msgid "Source"
++msgstr ""
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start priority"
++msgstr ""
++
++msgid "Startup"
++msgstr ""
++
++msgid "Static IPv4 Routes"
++msgstr ""
++
++msgid "Static IPv6 Routes"
++msgstr ""
++
++msgid "Static Leases"
++msgstr ""
++
++msgid "Static Routes"
++msgstr ""
++
++msgid "Static WDS"
++msgstr ""
++
++msgid "Static address"
++msgstr ""
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Stop"
++msgstr ""
++
++msgid "Strict order"
++msgstr ""
++
++msgid "Submit"
++msgstr ""
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr ""
++
++msgid "Switch"
++msgstr ""
++
++msgid "Switch %q"
++msgstr ""
++
++msgid "Switch %q (%s)"
++msgstr ""
++
++msgid "Switch protocol"
++msgstr ""
++
++msgid "Sync with browser"
++msgstr ""
++
++msgid "Synchronizing..."
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "System Log"
++msgstr ""
++
++msgid "System Properties"
++msgstr ""
++
++msgid "System log buffer size"
++msgstr ""
++
++msgid "TCP:"
++msgstr ""
++
++msgid "TFTP Settings"
++msgstr ""
++
++msgid "TFTP server root"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid "TX Rate"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "Target"
++msgstr ""
++
++msgid "Terminate"
++msgstr ""
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++
++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 ""
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++
++msgid "The following changes have been committed"
++msgstr ""
++
++msgid "The following changes have been reverted"
++msgstr ""
++
++msgid "The following rules are currently active on this system."
++msgstr ""
++
++msgid "The given network name is not unique"
++msgstr ""
++
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr ""
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"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."
++msgstr ""
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "There are no pending changes to apply!"
++msgstr ""
++
++msgid "There are no pending changes to revert!"
++msgstr ""
++
++msgid "There are no pending changes!"
++msgstr ""
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++
++msgid "This is the plain username for logging into the account"
++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 ""
++
++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 allows the configuration of custom button actions"
++msgstr ""
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time Synchronization"
++msgstr ""
++
++msgid "Time Synchronization is not configured yet."
++msgstr ""
++
++msgid "Timezone"
++msgstr ""
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++
++msgid "Total Available"
++msgstr ""
++
++msgid "Traceroute"
++msgstr ""
++
++msgid "Traffic"
++msgstr ""
++
++msgid "Transfer"
++msgstr ""
++
++msgid "Transmission Rate"
++msgstr ""
++
++msgid "Transmit"
++msgstr ""
++
++msgid "Transmit Power"
++msgstr ""
++
++msgid "Transmitter Antenna"
++msgstr ""
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr ""
++
++msgid "Tunnel Interface"
++msgstr ""
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr ""
++
++msgid "Tx-Power"
++msgstr ""
++
++msgid "Type"
++msgstr ""
++
++msgid "UDP:"
++msgstr ""
++
++msgid "UMTS only"
++msgstr ""
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr ""
++
++msgid "USB Device"
++msgstr ""
++
++msgid "UUID"
++msgstr ""
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "Unknown Error, password not changed!"
++msgstr ""
++
++msgid "Unmanaged"
++msgstr ""
++
++msgid "Unsaved Changes"
++msgstr ""
++
++msgid "Unsupported protocol type."
++msgstr ""
++
++msgid "Update lists"
++msgstr ""
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr ""
++
++msgid "Uploaded File"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr ""
++
++msgid "Use DHCP gateway"
++msgstr ""
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr ""
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr ""
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr ""
++
++msgid "Use default gateway"
++msgstr ""
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr ""
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr ""
++
++msgid "Used Key Slot"
++msgstr ""
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "VC-Mux"
++msgstr ""
++
++msgid "VLAN Interface"
++msgstr ""
++
++msgid "VLANs on %q"
++msgstr ""
++
++msgid "VLANs on %q (%s)"
++msgstr ""
++
++msgid "VPN Server"
++msgstr ""
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "WDS"
++msgstr ""
++
++msgid "WEP Open System"
++msgstr ""
++
++msgid "WEP Shared Key"
++msgstr ""
++
++msgid "WEP passphrase"
++msgstr ""
++
++msgid "WMM Mode"
++msgstr ""
++
++msgid "WPA passphrase"
++msgstr ""
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless Adapter"
++msgstr ""
++
++msgid "Wireless Network"
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Wireless Security"
++msgstr ""
++
++msgid "Wireless is disabled or not associated"
++msgstr ""
++
++msgid "Wireless is restarting..."
++msgstr ""
++
++msgid "Wireless network is disabled"
++msgstr ""
++
++msgid "Wireless network is enabled"
++msgstr ""
++
++msgid "Wireless restarted"
++msgstr ""
++
++msgid "Wireless shut down"
++msgstr ""
++
++msgid "Write received DNS requests to syslog"
++msgstr ""
++
++msgid "XR Support"
++msgstr ""
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++
++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 ""
++
++msgid "any"
++msgstr ""
++
++msgid "auto"
++msgstr ""
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr ""
++
++msgid "bridged"
++msgstr ""
++
++msgid "create:"
++msgstr ""
++
++msgid "creates a bridge over specified interface(s)"
++msgstr ""
++
++msgid "dB"
++msgstr ""
++
++msgid "dBm"
++msgstr ""
++
++msgid "disable"
++msgstr ""
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++
++msgid "forward"
++msgstr ""
++
++msgid "full-duplex"
++msgstr ""
++
++msgid "half-duplex"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hidden"
++msgstr ""
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr ""
++
++msgid "input"
++msgstr ""
++
++msgid "kB"
++msgstr ""
++
++msgid "kB/s"
++msgstr ""
++
++msgid "kbit/s"
++msgstr ""
++
++msgid "local <abbr title=\"Domain Name System\">DNS</abbr> file"
++msgstr ""
++
++msgid "minimum 1280, maximum 1480"
++msgstr ""
++
++msgid "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "no link"
++msgstr ""
++
++msgid "none"
++msgstr ""
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr ""
++
++msgid "on"
++msgstr ""
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr ""
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "unlimited"
++msgstr ""
++
++msgid "unspecified"
++msgstr ""
++
++msgid "unspecified -or- create:"
++msgstr ""
++
++msgid "untagged"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++msgid "« Back"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-base/po/tr/base.po b/feeds/luci/modules/luci-base/po/tr/base.po
+new file mode 100644
+index 0000000..3ef9560
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/tr/base.po
+@@ -0,0 +1,3156 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-11-25 14:47+0200\n"
++"Last-Translator: qbilay <qbilay@mynet.com>\n"
++"Language-Team: none\n"
++"Language: tr\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: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d dakika gösteriliyor, %d saniye aralıklı)"
++
++msgid "(%s available)"
++msgstr "(%s uygun)"
++
++msgid "(empty)"
++msgstr "(boÅŸ)"
++
++msgid "(no interfaces attached)"
++msgstr "(arayüz eklenmedi)"
++
++msgid "-- Additional Field --"
++msgstr "-- Ek Alan--"
++
++msgid "-- Please choose --"
++msgstr "-- Lütfen seçiniz --"
++
++msgid "-- custom --"
++msgstr "-- özel --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "1 Dakikalık Yük:"
++
++msgid "15 Minute Load:"
++msgstr "15 Dakikalık Yük:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "5 Dakikalık Yük:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\\\"Temel Servis Ayar Tanımlayıcısı\\\"> BSSID </abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "<abbr title=\"Alan Adı Sistemi\">DNS</abbr> port sorgula"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "<abbr title=\"Alan Adı Sistemi\">DNS</abbr> sunucu port"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Internet Protokolü Sürüm 4\">IPv4</abbr>-Adres"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protokolü Sürüm 4\">IPv4</abbr>-Gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "<abbr title=\"Internet Protokolü Sürüm 4\">IPv4</abbr>-Netmask"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Internet Protokolü Sürüm 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protokolü Sürüm 6\">IPv6</abbr>-Gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Ayarları"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Adı"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-Adresi"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"<abbr title=\"maximal\">Maks.</abbr> <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr> leases"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++"<abbr title=\"maximal\">Maks.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> paket boyutu"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"maximal\">Maks.</abbr> eşzamanlı sorgu"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr ""
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "AR DesteÄŸi"
++
++msgid "ARP retry threshold"
++msgstr "ARP yenileme aralığı"
++
++msgid "ATM Bridges"
++msgstr "ATM Köprüleri"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr ""
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr ""
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++
++msgid "ATM device number"
++msgstr ""
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr ""
++
++msgid "Access Point"
++msgstr "Erişim Noktası"
++
++msgid "Action"
++msgstr "Eylem"
++
++msgid "Actions"
++msgstr "Eylemler"
++
++msgid "Activate this network"
++msgstr "Bu ağı etkinleştir"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr ""
++"Aktif <abbr title=\"İnternet Protokolü Sürüm 4\">IPv4</abbr>-Yönlendiriciler"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr ""
++"Aktif <abbr title=\"İnternet Protokolü Sürüm 4\">IPv6</abbr>-Yönlendiriciler"
++
++msgid "Active Connections"
++msgstr "Aktif Bağlantılar"
++
++msgid "Active DHCP Leases"
++msgstr "Aktif DHCP Kiraları"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Aktif DHCPv6 Kiraları"
++
++msgid "Ad-Hoc"
++msgstr ""
++
++msgid "Add"
++msgstr "Ekle"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++
++msgid "Add new interface..."
++msgstr "Yeni arabirim ekle..."
++
++msgid "Additional Hosts files"
++msgstr ""
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "Adresler"
++
++msgid "Address to access local relay bridge"
++msgstr ""
++
++msgid "Administration"
++msgstr ""
++
++msgid "Advanced Settings"
++msgstr "GeliÅŸmiÅŸ Ayarlar"
++
++msgid "Alert"
++msgstr "Uyarı"
++
++# "Secure Shell" için ne kullanılabilinir bir fikrim yok.
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"<abbr title=\"Secure Shell\">SSH</abbr> parola kimlik doğrulamasına izin ver"
++
++msgid "Allow all except listed"
++msgstr "Listelenenlerin haricindekilere izin ver"
++
++msgid "Allow listed only"
++msgstr "Yanlızca listelenenlere izin ver"
++
++msgid "Allow localhost"
++msgstr ""
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++
++msgid "Allow root logins with password"
++msgstr ""
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr ""
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr ""
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "1. Anten"
++
++msgid "Antenna 2"
++msgstr "2. Anten"
++
++msgid "Antenna Configuration"
++msgstr "Anten Yapılandırması"
++
++msgid "Any zone"
++msgstr ""
++
++msgid "Apply"
++msgstr "Uygula"
++
++msgid "Applying changes"
++msgstr "DeÄŸiÅŸiklikleri uygula"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "Arabirim ata..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr ""
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Atheros 802.11%s Kablosuz Denetleyicisi"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Kimlik doÄŸrulama"
++
++msgid "Authoritative"
++msgstr "Yetkilendirme"
++
++msgid "Authorization Required"
++msgstr "Yetkilendirme Gerekli"
++
++msgid "Auto Refresh"
++msgstr "Otomatik Yenileme"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Kullanılabilir"
++
++msgid "Available packages"
++msgstr "Kullanılabilir Paketler"
++
++msgid "Average:"
++msgstr "Ortalama:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Back"
++msgstr "Geri"
++
++msgid "Back to Overview"
++msgstr "Genel Bakışa dön"
++
++msgid "Back to configuration"
++msgstr "Yapılandırmaya dön"
++
++msgid "Back to overview"
++msgstr "Genel Bakışa dön"
++
++msgid "Back to scan results"
++msgstr "Tarama sonuçlarına dön"
++
++msgid "Background Scan"
++msgstr "Arka Planda Tarama"
++
++msgid "Backup / Flash Firmware"
++msgstr ""
++
++msgid "Backup / Restore"
++msgstr "Yedekleme / Geri Yükleme"
++
++msgid "Backup file list"
++msgstr ""
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Bogus NX Domain Override"
++msgstr ""
++
++msgid "Bridge"
++msgstr ""
++
++msgid "Bridge interfaces"
++msgstr ""
++
++msgid "Bridge unit number"
++msgstr ""
++
++msgid "Bring up on boot"
++msgstr ""
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr ""
++
++msgid "Buffered"
++msgstr ""
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr ""
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr ""
++
++msgid "CPU usage (%)"
++msgstr ""
++
++msgid "Cancel"
++msgstr ""
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr ""
++
++msgid "Changes"
++msgstr ""
++
++msgid "Changes applied."
++msgstr ""
++
++msgid "Changes the administrator password for accessing the device"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check"
++msgstr ""
++
++msgid "Checksum"
++msgstr ""
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++
++msgid "Cipher"
++msgstr ""
++
++msgid ""
++"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)."
++msgstr ""
++
++msgid "Client"
++msgstr ""
++
++msgid "Client ID to send when requesting DHCP"
++msgstr ""
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++
++msgid "Close list..."
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr ""
++
++msgid "Common Configuration"
++msgstr ""
++
++msgid "Compression"
++msgstr ""
++
++msgid "Configuration"
++msgstr ""
++
++msgid "Configuration applied."
++msgstr ""
++
++msgid "Configuration files will be kept."
++msgstr ""
++
++msgid "Confirmation"
++msgstr ""
++
++msgid "Connect"
++msgstr ""
++
++msgid "Connected"
++msgstr ""
++
++msgid "Connection Limit"
++msgstr ""
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr ""
++
++msgid "Country"
++msgstr ""
++
++msgid "Country Code"
++msgstr ""
++
++msgid "Cover the following interface"
++msgstr ""
++
++msgid "Cover the following interfaces"
++msgstr ""
++
++msgid "Create / Assign firewall-zone"
++msgstr ""
++
++msgid "Create Interface"
++msgstr ""
++
++msgid "Create a bridge over multiple interfaces"
++msgstr ""
++
++msgid "Critical"
++msgstr ""
++
++msgid "Cron Log Level"
++msgstr ""
++
++msgid "Custom Interface"
++msgstr ""
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++
++msgid "DHCP Leases"
++msgstr ""
++
++msgid "DHCP Server"
++msgstr ""
++
++msgid "DHCP and DNS"
++msgstr ""
++
++msgid "DHCP client"
++msgstr ""
++
++msgid "DHCP-Options"
++msgstr ""
++
++msgid "DHCPv6 Leases"
++msgstr ""
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS forwardings"
++msgstr ""
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Default %d"
++msgstr ""
++
++msgid "Default gateway"
++msgstr ""
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr ""
++
++msgid "Define a name for this network."
++msgstr ""
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++
++msgid "Delete"
++msgstr ""
++
++msgid "Delete this interface"
++msgstr ""
++
++msgid "Delete this network"
++msgstr ""
++
++msgid "Description"
++msgstr ""
++
++msgid "Design"
++msgstr ""
++
++msgid "Destination"
++msgstr ""
++
++msgid "Device"
++msgstr ""
++
++msgid "Device Configuration"
++msgstr ""
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++
++msgid "Disable DNS setup"
++msgstr ""
++
++msgid "Disable HW-Beacon timer"
++msgstr ""
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Discard upstream RFC1918 responses"
++msgstr ""
++
++msgid "Displaying only packages containing"
++msgstr ""
++
++msgid "Distance Optimization"
++msgstr ""
++
++msgid "Distance to farthest network member in meters."
++msgstr ""
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr ""
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 ""
++
++msgid "Do not send probe responses"
++msgstr ""
++
++msgid "Domain required"
++msgstr ""
++
++msgid "Domain whitelist"
++msgstr ""
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++
++msgid "Download and install package"
++msgstr ""
++
++msgid "Download backup"
++msgstr ""
++
++msgid "Dropbear Instance"
++msgstr ""
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++
++msgid "Dynamic tunnel"
++msgstr ""
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr ""
++
++msgid "Edit"
++msgstr ""
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr ""
++
++msgid "Edit this network"
++msgstr ""
++
++msgid "Emergency"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr ""
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr ""
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr ""
++
++msgid "Enable NTP client"
++msgstr ""
++
++msgid "Enable TFTP server"
++msgstr ""
++
++msgid "Enable VLAN functionality"
++msgstr ""
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr ""
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr ""
++
++msgid "Enable this swap"
++msgstr ""
++
++msgid "Enable/Disable"
++msgstr ""
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr ""
++
++msgid "Encapsulation mode"
++msgstr ""
++
++msgid "Encryption"
++msgstr ""
++
++msgid "Erasing..."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Ethernet Adapter"
++msgstr ""
++
++msgid "Ethernet Switch"
++msgstr ""
++
++msgid "Expand hosts"
++msgstr ""
++
++msgid "Expires"
++msgstr ""
++
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr ""
++
++msgid "External system log server port"
++msgstr ""
++
++msgid "Fast Frames"
++msgstr ""
++
++msgid "File"
++msgstr ""
++
++msgid "Filename of the boot image advertised to clients"
++msgstr ""
++
++msgid "Filesystem"
++msgstr ""
++
++msgid "Filter"
++msgstr ""
++
++msgid "Filter private"
++msgstr ""
++
++msgid "Filter useless"
++msgstr ""
++
++msgid "Find and join network"
++msgstr ""
++
++msgid "Find package"
++msgstr ""
++
++msgid "Finish"
++msgstr ""
++
++msgid "Firewall"
++msgstr ""
++
++msgid "Firewall Settings"
++msgstr ""
++
++msgid "Firewall Status"
++msgstr ""
++
++msgid "Firmware Version"
++msgstr ""
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr ""
++
++msgid "Flags"
++msgstr ""
++
++msgid "Flash Firmware"
++msgstr ""
++
++msgid "Flash image..."
++msgstr ""
++
++msgid "Flash new firmware image"
++msgstr ""
++
++msgid "Flash operations"
++msgstr ""
++
++msgid "Flashing..."
++msgstr ""
++
++msgid "Force"
++msgstr ""
++
++msgid "Force CCMP (AES)"
++msgstr ""
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++
++msgid "Force TKIP"
++msgstr ""
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr ""
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr ""
++
++msgid "Forward broadcast traffic"
++msgstr ""
++
++msgid "Forwarding mode"
++msgstr ""
++
++msgid "Fragmentation Threshold"
++msgstr ""
++
++msgid "Frame Bursting"
++msgstr ""
++
++msgid "Free"
++msgstr ""
++
++msgid "Free space"
++msgstr ""
++
++msgid "GHz"
++msgstr ""
++
++msgid "GPRS only"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Gateway ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General Setup"
++msgstr ""
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr ""
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr ""
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr ""
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr ""
++
++msgid "Hang Up"
++msgstr ""
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++
++msgid "Host entries"
++msgstr ""
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "Hostname to send when requesting DHCP"
++msgstr ""
++
++msgid "Hostnames"
++msgstr ""
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr ""
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 Firewall"
++msgstr ""
++
++msgid "IPv4 WAN Status"
++msgstr ""
++
++msgid "IPv4 address"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid "IPv4 gateway"
++msgstr ""
++
++msgid "IPv4 netmask"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6"
++msgstr ""
++
++msgid "IPv6 Firewall"
++msgstr ""
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr ""
++
++msgid "IPv6 address"
++msgstr ""
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "IPv6 prefix"
++msgstr ""
++
++msgid "IPv6 prefix length"
++msgstr ""
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr ""
++
++msgid "Identity"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++
++msgid "If unchecked, no default route is configured"
++msgstr ""
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr ""
++
++msgid "Ignore resolve file"
++msgstr ""
++
++msgid "Image"
++msgstr ""
++
++msgid "In"
++msgstr ""
++
++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 ""
++
++msgid "Inbound:"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Initscript"
++msgstr ""
++
++msgid "Initscripts"
++msgstr ""
++
++msgid "Install"
++msgstr ""
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr ""
++
++msgid "Install protocol extensions..."
++msgstr ""
++
++msgid "Installed packages"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface Overview"
++msgstr ""
++
++msgid "Interface is reconnecting..."
++msgstr ""
++
++msgid "Interface is shutting down..."
++msgstr ""
++
++msgid "Interface not present or not connected yet."
++msgstr ""
++
++msgid "Interface reconnected"
++msgstr ""
++
++msgid "Interface shut down"
++msgstr ""
++
++msgid "Interfaces"
++msgstr ""
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr ""
++
++msgid "Invalid"
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++
++msgid "Invalid username and/or password! Please try again."
++msgstr ""
++
++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 ""
++
++msgid "Java Script required!"
++msgstr ""
++
++msgid "Join Network"
++msgstr ""
++
++msgid "Join Network: Settings"
++msgstr ""
++
++msgid "Join Network: Wireless Scan"
++msgstr ""
++
++msgid "Keep settings"
++msgstr ""
++
++msgid "Kernel Log"
++msgstr ""
++
++msgid "Kernel Version"
++msgstr ""
++
++msgid "Key"
++msgstr ""
++
++msgid "Key #%d"
++msgstr ""
++
++msgid "Kill"
++msgstr ""
++
++msgid "L2TP"
++msgstr ""
++
++msgid "L2TP Server"
++msgstr ""
++
++msgid "LCP echo failure threshold"
++msgstr ""
++
++msgid "LCP echo interval"
++msgstr ""
++
++msgid "LLC"
++msgstr ""
++
++msgid "Label"
++msgstr ""
++
++msgid "Language"
++msgstr ""
++
++msgid "Language and Style"
++msgstr ""
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Leasefile"
++msgstr ""
++
++msgid "Leasetime"
++msgstr ""
++
++msgid "Leasetime remaining"
++msgstr ""
++
++msgid "Leave empty to autodetect"
++msgstr ""
++
++msgid "Leave empty to use the current WAN address"
++msgstr ""
++
++msgid "Legend:"
++msgstr ""
++
++msgid "Limit"
++msgstr ""
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr ""
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++
++msgid "Listening port for inbound DNS queries"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Load Average"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Local IPv4 address"
++msgstr ""
++
++msgid "Local IPv6 address"
++msgstr ""
++
++msgid "Local Startup"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Local domain"
++msgstr ""
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr ""
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr ""
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr ""
++
++msgid "Log queries"
++msgstr ""
++
++msgid "Logging"
++msgstr ""
++
++msgid "Login"
++msgstr ""
++
++msgid "Logout"
++msgstr ""
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr ""
++
++msgid "MAC-Address Filter"
++msgstr ""
++
++msgid "MAC-Filter"
++msgstr ""
++
++msgid "MAC-List"
++msgstr ""
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr ""
++
++msgid "MHz"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr ""
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr ""
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr ""
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++
++msgid "Maximum hold time"
++msgstr ""
++
++msgid "Maximum number of leased addresses."
++msgstr ""
++
++msgid "Mbit/s"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Memory usage (%)"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Minimum Rate"
++msgstr ""
++
++msgid "Minimum hold time"
++msgstr ""
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr ""
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr ""
++
++msgid "Mount Entry"
++msgstr ""
++
++msgid "Mount Point"
++msgstr ""
++
++msgid "Mount Points"
++msgstr ""
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++
++msgid "Mount options"
++msgstr ""
++
++msgid "Mount point"
++msgstr ""
++
++msgid "Mounted file systems"
++msgstr ""
++
++msgid "Move down"
++msgstr ""
++
++msgid "Move up"
++msgstr ""
++
++msgid "Multicast Rate"
++msgstr ""
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "NAS ID"
++msgstr ""
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr ""
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr ""
++
++msgid "Name of the new interface"
++msgstr ""
++
++msgid "Name of the new network"
++msgstr ""
++
++msgid "Navigation"
++msgstr ""
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network Utilities"
++msgstr ""
++
++msgid "Network boot image"
++msgstr ""
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr ""
++
++msgid "No DHCP Server configured for this interface"
++msgstr ""
++
++msgid "No chains in this table"
++msgstr ""
++
++msgid "No files found"
++msgstr ""
++
++msgid "No information available"
++msgstr ""
++
++msgid "No negative cache"
++msgstr ""
++
++msgid "No network configured on this device"
++msgstr ""
++
++msgid "No network name specified"
++msgstr ""
++
++msgid "No package lists available"
++msgstr ""
++
++msgid "No password set!"
++msgstr ""
++
++msgid "No rules in this chain"
++msgstr ""
++
++msgid "No zone assigned"
++msgstr ""
++
++msgid "Noise"
++msgstr ""
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "Normal"
++msgstr ""
++
++msgid "Not Found"
++msgstr ""
++
++msgid "Not associated"
++msgstr ""
++
++msgid "Not connected"
++msgstr ""
++
++msgid "Note: Configuration files will be erased."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Nslookup"
++msgstr ""
++
++msgid "OK"
++msgstr ""
++
++msgid "OPKG-Configuration"
++msgstr ""
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++
++msgid "One or more fields contain invalid values!"
++msgstr ""
++
++msgid "One or more required fields have no value!"
++msgstr ""
++
++msgid "Open list..."
++msgstr ""
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr ""
++
++msgid "Option removed"
++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 "Options"
++msgstr ""
++
++msgid "Other:"
++msgstr ""
++
++msgid "Out"
++msgstr ""
++
++msgid "Outbound:"
++msgstr ""
++
++msgid "Outdoor Channels"
++msgstr ""
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Owner"
++msgstr ""
++
++msgid "PAP/CHAP password"
++msgstr ""
++
++msgid "PAP/CHAP username"
++msgstr ""
++
++msgid "PID"
++msgstr ""
++
++msgid "PIN"
++msgstr ""
++
++msgid "PPP"
++msgstr ""
++
++msgid "PPPoA Encapsulation"
++msgstr ""
++
++msgid "PPPoATM"
++msgstr ""
++
++msgid "PPPoE"
++msgstr ""
++
++msgid "PPtP"
++msgstr ""
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Package lists are older than 24 hours"
++msgstr ""
++
++msgid "Package name"
++msgstr ""
++
++msgid "Packets"
++msgstr ""
++
++msgid "Part of zone %q"
++msgstr ""
++
++msgid "Password"
++msgstr ""
++
++msgid "Password authentication"
++msgstr ""
++
++msgid "Password of Private Key"
++msgstr ""
++
++msgid "Password successfully changed!"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr ""
++
++msgid "Path to Client-Certificate"
++msgstr ""
++
++msgid "Path to Private Key"
++msgstr ""
++
++msgid "Path to executable which handles the button event"
++msgstr ""
++
++msgid "Peak:"
++msgstr ""
++
++msgid "Perform reboot"
++msgstr ""
++
++msgid "Perform reset"
++msgstr ""
++
++msgid "Phy Rate:"
++msgstr ""
++
++msgid "Physical Settings"
++msgstr ""
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr ""
++
++msgid "Please enter your username and password."
++msgstr ""
++
++msgid "Policy"
++msgstr ""
++
++msgid "Port"
++msgstr ""
++
++msgid "Port %d"
++msgstr ""
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr ""
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr ""
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr ""
++
++msgid "Processes"
++msgstr ""
++
++msgid "Prot."
++msgstr ""
++
++msgid "Protocol"
++msgstr ""
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Protocol of the new interface"
++msgstr ""
++
++msgid "Protocol support is not installed"
++msgstr ""
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr ""
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr ""
++
++msgid "RTS/CTS Threshold"
++msgstr ""
++
++msgid "RX"
++msgstr ""
++
++msgid "RX Rate"
++msgstr ""
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr ""
++
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr ""
++
++msgid "Realtime Connections"
++msgstr ""
++
++msgid "Realtime Graphs"
++msgstr ""
++
++msgid "Realtime Load"
++msgstr ""
++
++msgid "Realtime Traffic"
++msgstr ""
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr ""
++
++msgid "Rebooting..."
++msgstr ""
++
++msgid "Reboots the operating system of your device"
++msgstr ""
++
++msgid "Receive"
++msgstr ""
++
++msgid "Receiver Antenna"
++msgstr ""
++
++msgid "Reconnect this interface"
++msgstr ""
++
++msgid "Reconnecting interface"
++msgstr ""
++
++msgid "References"
++msgstr ""
++
++msgid "Regulatory Domain"
++msgstr ""
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr ""
++
++msgid "Remove"
++msgstr ""
++
++msgid "Repeat scan"
++msgstr ""
++
++msgid "Replace entry"
++msgstr ""
++
++msgid "Replace wireless configuration"
++msgstr ""
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++
++msgid "Reset"
++msgstr ""
++
++msgid "Reset Counters"
++msgstr ""
++
++msgid "Reset to defaults"
++msgstr ""
++
++msgid "Resolv and Hosts Files"
++msgstr ""
++
++msgid "Resolve file"
++msgstr ""
++
++msgid "Restart"
++msgstr ""
++
++msgid "Restart Firewall"
++msgstr ""
++
++msgid "Restore backup"
++msgstr ""
++
++msgid "Reveal/hide password"
++msgstr ""
++
++msgid "Revert"
++msgstr ""
++
++msgid "Root"
++msgstr ""
++
++msgid "Root directory for files served via TFTP"
++msgstr ""
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr ""
++
++msgid "Routes"
++msgstr ""
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++
++msgid "Rule #"
++msgstr ""
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr ""
++
++msgid "SSH-Keys"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid "Save"
++msgstr ""
++
++msgid "Save & Apply"
++msgstr ""
++
++msgid "Save &#38; Apply"
++msgstr ""
++
++msgid "Scan"
++msgstr ""
++
++msgid "Scheduled Tasks"
++msgstr ""
++
++msgid "Section added"
++msgstr ""
++
++msgid "Section removed"
++msgstr ""
++
++msgid "See \"mount\" manpage for details"
++msgstr ""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr ""
++
++msgid "Separate WDS"
++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 ""
++
++msgid "Service Type"
++msgstr ""
++
++msgid "Services"
++msgstr ""
++
++msgid "Set up Time Synchronization"
++msgstr ""
++
++msgid "Setup DHCP Server"
++msgstr ""
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr ""
++
++msgid "Shutdown this network"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Signal:"
++msgstr ""
++
++msgid "Size"
++msgstr ""
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr ""
++
++msgid "Skip to content"
++msgstr ""
++
++msgid "Skip to navigation"
++msgstr ""
++
++msgid "Slot time"
++msgstr ""
++
++msgid "Software"
++msgstr ""
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr ""
++
++msgid "Sorry, the object you requested was not found."
++msgstr ""
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr ""
++
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++
++msgid "Sort"
++msgstr ""
++
++msgid "Source"
++msgstr ""
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr ""
++
++msgid "Start"
++msgstr ""
++
++msgid "Start priority"
++msgstr ""
++
++msgid "Startup"
++msgstr ""
++
++msgid "Static IPv4 Routes"
++msgstr ""
++
++msgid "Static IPv6 Routes"
++msgstr ""
++
++msgid "Static Leases"
++msgstr ""
++
++msgid "Static Routes"
++msgstr ""
++
++msgid "Static WDS"
++msgstr ""
++
++msgid "Static address"
++msgstr ""
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Stop"
++msgstr ""
++
++msgid "Strict order"
++msgstr ""
++
++msgid "Submit"
++msgstr ""
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr ""
++
++msgid "Switch"
++msgstr ""
++
++msgid "Switch %q"
++msgstr ""
++
++msgid "Switch %q (%s)"
++msgstr ""
++
++msgid "Switch protocol"
++msgstr ""
++
++msgid "Sync with browser"
++msgstr ""
++
++msgid "Synchronizing..."
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "System Log"
++msgstr ""
++
++msgid "System Properties"
++msgstr ""
++
++msgid "System log buffer size"
++msgstr ""
++
++msgid "TCP:"
++msgstr ""
++
++msgid "TFTP Settings"
++msgstr ""
++
++msgid "TFTP server root"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid "TX Rate"
++msgstr ""
++
++msgid "Table"
++msgstr ""
++
++msgid "Target"
++msgstr ""
++
++msgid "Terminate"
++msgstr ""
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++
++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 ""
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"Proceed\" below to start the flash procedure."
++msgstr ""
++
++msgid "The following changes have been committed"
++msgstr ""
++
++msgid "The following changes have been reverted"
++msgstr ""
++
++msgid "The following rules are currently active on this system."
++msgstr ""
++
++msgid "The given network name is not unique"
++msgstr ""
++
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr ""
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"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."
++msgstr ""
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "There are no pending changes to apply!"
++msgstr ""
++
++msgid "There are no pending changes to revert!"
++msgstr ""
++
++msgid "There are no pending changes!"
++msgstr ""
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++
++msgid "This is the plain username for logging into the account"
++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 ""
++
++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 allows the configuration of custom button actions"
++msgstr ""
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++
++msgid "This section contains no values yet"
++msgstr ""
++
++msgid "Time Synchronization"
++msgstr ""
++
++msgid "Time Synchronization is not configured yet."
++msgstr ""
++
++msgid "Timezone"
++msgstr ""
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++
++msgid "Total Available"
++msgstr ""
++
++msgid "Traceroute"
++msgstr ""
++
++msgid "Traffic"
++msgstr ""
++
++msgid "Transfer"
++msgstr ""
++
++msgid "Transmission Rate"
++msgstr ""
++
++msgid "Transmit"
++msgstr ""
++
++msgid "Transmit Power"
++msgstr ""
++
++msgid "Transmitter Antenna"
++msgstr ""
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr ""
++
++msgid "Tunnel Interface"
++msgstr ""
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr ""
++
++msgid "Tx-Power"
++msgstr ""
++
++msgid "Type"
++msgstr ""
++
++msgid "UDP:"
++msgstr ""
++
++msgid "UMTS only"
++msgstr ""
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr ""
++
++msgid "USB Device"
++msgstr ""
++
++msgid "UUID"
++msgstr ""
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "Unknown Error, password not changed!"
++msgstr ""
++
++msgid "Unmanaged"
++msgstr ""
++
++msgid "Unsaved Changes"
++msgstr ""
++
++msgid "Unsupported protocol type."
++msgstr ""
++
++msgid "Update lists"
++msgstr ""
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr ""
++
++msgid "Uploaded File"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr ""
++
++msgid "Use DHCP gateway"
++msgstr ""
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr ""
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr ""
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr ""
++
++msgid "Use default gateway"
++msgstr ""
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr ""
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr ""
++
++msgid "Used Key Slot"
++msgstr ""
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr ""
++
++msgid "VC-Mux"
++msgstr ""
++
++msgid "VLAN Interface"
++msgstr ""
++
++msgid "VLANs on %q"
++msgstr ""
++
++msgid "VLANs on %q (%s)"
++msgstr ""
++
++msgid "VPN Server"
++msgstr ""
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr ""
++
++msgid "WDS"
++msgstr ""
++
++msgid "WEP Open System"
++msgstr ""
++
++msgid "WEP Shared Key"
++msgstr ""
++
++msgid "WEP passphrase"
++msgstr ""
++
++msgid "WMM Mode"
++msgstr ""
++
++msgid "WPA passphrase"
++msgstr ""
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr ""
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless Adapter"
++msgstr ""
++
++msgid "Wireless Network"
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Wireless Security"
++msgstr ""
++
++msgid "Wireless is disabled or not associated"
++msgstr ""
++
++msgid "Wireless is restarting..."
++msgstr ""
++
++msgid "Wireless network is disabled"
++msgstr ""
++
++msgid "Wireless network is enabled"
++msgstr ""
++
++msgid "Wireless restarted"
++msgstr ""
++
++msgid "Wireless shut down"
++msgstr ""
++
++msgid "Write received DNS requests to syslog"
++msgstr ""
++
++msgid "XR Support"
++msgstr ""
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"LuCI'nin düzgün çalışması için tarayıcınızda Java Scripti "
++"etkinleÅŸtirmelisiniz."
++
++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 ""
++
++msgid "any"
++msgstr "herhangi"
++
++msgid "auto"
++msgstr "otomatik"
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr ""
++
++msgid "bridged"
++msgstr "köprülü"
++
++msgid "create:"
++msgstr ""
++
++msgid "creates a bridge over specified interface(s)"
++msgstr ""
++
++msgid "dB"
++msgstr ""
++
++msgid "dBm"
++msgstr ""
++
++msgid "disable"
++msgstr "etkin deÄŸil"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "sona ermiÅŸ"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++
++msgid "forward"
++msgstr "ileri"
++
++msgid "full-duplex"
++msgstr ""
++
++msgid "half-duplex"
++msgstr ""
++
++msgid "help"
++msgstr "yardım"
++
++msgid "hidden"
++msgstr ""
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "eÄŸer hedef aÄŸsa"
++
++msgid "input"
++msgstr "giriÅŸ"
++
++msgid "kB"
++msgstr ""
++
++msgid "kB/s"
++msgstr ""
++
++msgid "kbit/s"
++msgstr ""
++
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "hayır"
++
++msgid "no link"
++msgstr ""
++
++msgid "none"
++msgstr "hiçbiri"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "kapalı"
++
++msgid "on"
++msgstr "açık"
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "yönlendirildi"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "etiketlendi"
++
++msgid "unknown"
++msgstr ""
++
++msgid "unlimited"
++msgstr "sınırsız"
++
++msgid "unspecified"
++msgstr "tanımsız"
++
++msgid "unspecified -or- create:"
++msgstr "tanımsız -veya- oluşturun:"
++
++msgid "untagged"
++msgstr "etiketsiz"
++
++msgid "yes"
++msgstr "evet"
++
++msgid "« Back"
++msgstr "« Geri"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz 2. kanal üzerinde"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz 2. kanal altında"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"ÅžifrelenmiÅŸ\">Åžifreli</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Tara"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Not: adres/önek"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "<abbr title=\"Internet Protokolü Sürüm 4\">IPv4</abbr>-Broadcast"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "<abbr title=\"Internet Protokolü Sürüm 6\">IPv6</abbr>-Address"
+diff --git a/feeds/luci/modules/luci-base/po/uk/base.po b/feeds/luci/modules/luci-base/po/uk/base.po
+new file mode 100644
+index 0000000..b5fbe50
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/uk/base.po
+@@ -0,0 +1,3590 @@
++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"
++"Language-Team: none\n"
++"Language: uk\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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 "(%d minute window, %d second interval)"
++msgstr "(%d-хвилинне вікно, %d-Ñекундний інтервал)"
++
++msgid "(%s available)"
++msgstr "(%s доÑтупно)"
++
++msgid "(empty)"
++msgstr "(пуÑто)"
++
++msgid "(no interfaces attached)"
++msgstr "(нема приєднаних інтерфейÑів)"
++
++msgid "-- Additional Field --"
++msgstr "-- Додаткові Ð¿Ð¾Ð»Ñ --"
++
++msgid "-- Please choose --"
++msgstr "-- Виберіть --"
++
++msgid "-- custom --"
++msgstr "-- нетипово --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° 1 хвилину:"
++
++msgid "15 Minute Load:"
++msgstr "ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° 15 хвилин:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° 5 хвилин:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr ""
++"<abbr title=\"Basic Service Set Identifier — ідентифікатор оÑновної Ñлужби "
++"поÑлуг\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr ""
++"Порт <abbr title=\"Domain Name System — ÑиÑтема доменних імен\">DNS</abbr>-"
++"запиту"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr ""
++"Порт <abbr title=\"Domain Name System — ÑиÑтема доменних імен\">DNS</abbr>-"
++"Ñервера"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++"<abbr title=\"Domain Name System — ÑиÑтема доменних імен\">DNS</abbr>-"
++"Ñервери будуть опитані у порÑдку, визначеному файлом resolvfile"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++"<abbr title=\"Extended Service Set Identifier — ідентифікатор розширеної "
++"Ñлужби поÑлуг\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 4\">IPv4</abbr>-адреÑа"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 4\">IPv4</abbr>-шлюз"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 4\">IPv4</abbr>-маÑка"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 6\">IPv6</abbr>-адреÑа або мережа "
++"(CIDR)"
++
++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 ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr ""
++"ÐаÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ <abbr title=\"Light Emitting Diode — Ñвітлодіод\">LED</abbr>"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "Ðазва <abbr title=\"Light Emitting Diode — Ñвітлодіод\">LED</abbr>"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr ""
++"<abbr title=\"Media Access Control — ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð´Ð¾Ñтупом до ноÑÑ–Ñ\">MAC</"
++"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 "
++"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 "
++"Mechanisms for Domain Name System — Механізми розширень Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð½Ð¾Ñ— ÑиÑтеми "
++"імен\">EDNS0</abbr>"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"МакÑимум\">Max.</abbr> одночаÑних запитів"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Парний: %s / Груповий: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr ""
++"<abbr title=\"Access Point Name — Ñимволічна назва точки доÑтупу\">APN</abbr>"
++
++msgid "AR Support"
++msgstr "Підтримка AR"
++
++msgid "ARP retry threshold"
++msgstr "Поріг повтору ARP"
++
++msgid "ATM Bridges"
++msgstr "ATM-моÑти"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr ""
++"Ідентифікатор віртуального каналу ATM (<abbr title=\"Virtual Channel "
++"Identifier\">VCI</abbr>)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr ""
++"Ідентифікатор віртуального шлÑху ATM (<abbr title=\"Virtual Path Identifier"
++"\">VPI</abbr>)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"ATM-моÑти виÑтавлÑÑŽÑ‚ÑŒ інкапÑульований Ethernet у з'єднаннÑÑ… AAL5 Ñк "
++"віртуальні мережеві інтерфейÑи Linux, котрі можуть викориÑтовуватиÑÑ Ð² "
++"поєднанні з DHCP або PPP Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі провайдера."
++
++msgid "ATM device number"
++msgstr "Ðомер ATM-приÑтрою"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "Концентратор доÑтупу"
++
++msgid "Access Point"
++msgstr "Точка доÑтупу"
++
++msgid "Action"
++msgstr "ДіÑ"
++
++msgid "Actions"
++msgstr "Дії"
++
++msgid "Activate this network"
++msgstr "Ðктивувати цю мережу"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 4\">IPv4</abbr>-маршрути"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 4\">IPv6</abbr>-маршрути"
++
++msgid "Active Connections"
++msgstr "Ðктивні підключеннÑ"
++
++msgid "Active DHCP Leases"
++msgstr "Ðктивні оренди DHCP"
++
++msgid "Active DHCPv6 Leases"
++msgstr "Ðктивні оренди DHCPv6"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Додати"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr "Додавати ÑÑƒÑ„Ñ–ÐºÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ домену до імен, отриманих із файлів hosts"
++
++msgid "Add new interface..."
++msgstr "Додати новий інтерфейÑ..."
++
++msgid "Additional Hosts files"
++msgstr "Додаткові файли hosts"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "ÐдреÑа"
++
++msgid "Address to access local relay bridge"
++msgstr "ÐдреÑа Ð´Ð»Ñ Ð´Ð¾Ñтупу до моÑту локального ретранÑлÑтора"
++
++msgid "Administration"
++msgstr "ÐдмініÑтруваннÑ"
++
++msgid "Advanced Settings"
++msgstr "Додаткові параметри"
++
++msgid "Alert"
++msgstr "Тривога"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr ""
++"Дозволити <abbr title=\"Secure Shell — безпечна оболонка\">SSH</abbr>-"
++"перевірку паролÑ"
++
++msgid "Allow all except listed"
++msgstr "Дозволити вÑÑ–, крім зазначених"
++
++msgid "Allow listed only"
++msgstr "Дозволити тільки зазначені"
++
++msgid "Allow localhost"
++msgstr "Дозволити локальний вузол"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++"Дозволити віддаленим вузлам Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ локальних SSH-ÑпрÑмованих портів"
++
++msgid "Allow root logins with password"
++msgstr "Дозволити root-вхід із паролем"
++
++msgid "Allow the <em>root</em> user to login with password"
++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, "
++"наприклад, Ð´Ð»Ñ RBL-поÑлуг"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "Якщо ви залишите це невибраним, буде Ñтворена додаткова мережа."
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "Ðнтена 1"
++
++msgid "Antenna 2"
++msgstr "Ðнтена 2"
++
++msgid "Antenna Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð°Ð½Ñ‚ÐµÐ½Ð¸"
++
++msgid "Any zone"
++msgstr "Будь-Ñка зона"
++
++msgid "Apply"
++msgstr "ЗаÑтоÑувати"
++
++msgid "Applying changes"
++msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñів..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "Приєднані Ñтанції"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Бездротовий 802.11%s контролер Atheros"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "ÐвтентифікаціÑ"
++
++msgid "Authoritative"
++msgstr "Ðадійний"
++
++msgid "Authorization Required"
++msgstr "Потрібна авторизаціÑ"
++
++msgid "Auto Refresh"
++msgstr "Ðвтоматичне оновленнÑ"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "ДоÑтупно"
++
++msgid "Available packages"
++msgstr "ДоÑтупні пакети"
++
++msgid "Average:"
++msgstr "Середнє значеннÑ:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "Ðазад"
++
++msgid "Back to Overview"
++msgstr "ПовернутиÑÑ Ð´Ð¾ переліку"
++
++msgid "Back to configuration"
++msgstr "ПовернутиÑÑ Ð´Ð¾ конфігурації"
++
++msgid "Back to overview"
++msgstr "ПовернутиÑÑ Ð´Ð¾ переліку"
++
++msgid "Back to scan results"
++msgstr "ПовернутиÑÑ Ð´Ð¾ результатів ÑкануваннÑ"
++
++msgid "Background Scan"
++msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ фоновому режимі"
++
++msgid "Backup / Flash Firmware"
++msgstr "Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ / ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸"
++
++msgid "Backup / Restore"
++msgstr "Резервне копіюваннÑ/відновленнÑ"
++
++msgid "Backup file list"
++msgstr "СпиÑок файлів резервних копій"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"Ðижче наведено визначений ÑпиÑок файлів Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копіюваннÑ. Він "
++"ÑкладаєтьÑÑ Ñ–Ð· позначених opkg змінених файлів конфігурації, невідокремних "
++"базових файлів, та файлів за кориÑтувацькими шаблонами резервного копіюваннÑ."
++
++msgid "Bitrate"
++msgstr "ШвидкіÑÑ‚ÑŒ передачі даних"
++
++msgid "Bogus NX Domain Override"
++msgstr "Відкидати підробки NX-домену"
++
++msgid "Bridge"
++msgstr "МіÑÑ‚"
++
++msgid "Bridge interfaces"
++msgstr "Об'єднати інтерфейÑи в міÑÑ‚"
++
++msgid "Bridge unit number"
++msgstr "Ðомер моÑта"
++
++msgid "Bring up on boot"
++msgstr "Піднімати при завантаженні"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Бездротовий 802.11%s контролер Broadcom"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Бездротовий 802.11 контролер Broadcom BCM%04x"
++
++msgid "Buffered"
++msgstr "Буферизовано"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "Кнопки"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "ЦП"
++
++msgid "CPU usage (%)"
++msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¦ÐŸ, %"
++
++msgid "Cancel"
++msgstr "СкаÑувати"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "Ланцюжок"
++
++msgid "Changes"
++msgstr "Зміни"
++
++msgid "Changes applied."
++msgstr "Зміни заÑтоÑовано."
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "Зміна Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратора Ð´Ð»Ñ Ð´Ð¾Ñтупу до приÑтрою"
++
++msgid "Channel"
++msgstr "Канал"
++
++msgid "Check"
++msgstr "Перевірити"
++
++msgid "Checksum"
++msgstr "Контрольна Ñума"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"Оберіть зону брандмауера, Ñку ви хочете призначити на цей інтерфейÑ. "
++"Виберіть <em>не визначено</em>, щоб видалити Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð· відповідних зон, "
++"або заповніть поле <em>Ñтворити</em>, щоб визначити нову зону Ñ– прикріпити "
++"до неї інтерфейÑ."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"Оберіть мережі, Ñкі ви хочете прикріпити до цього бездротового інтерфейÑу "
++"або заповніть поле <em>Ñтворити</em>, щоб визначити нову мережу."
++
++msgid "Cipher"
++msgstr "Шифр"
++
++msgid ""
++"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)."
++msgstr ""
++"ÐатиÑніть кнопку \"Створити архів\", щоб завантажити tar-архів поточних "
++"файлів конфігурації. Ð”Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸ до Ñ—Ñ— початкового Ñтану, "
++"натиÑніть кнопку \"Відновити\" (можливе тільки з образами SquashFS)."
++
++msgid "Client"
++msgstr "Клієнт"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "Ідентифікатор клієнта Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸ при запиті DHCP"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++"Закривати неактивні з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð¿ÐµÐ²Ð½Ð¾Ð³Ð¾ інтервалу чаÑу (Ñекунди). Ð”Ð»Ñ "
++"ÑƒÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ… з'єднань викориÑтовуйте 0"
++
++msgid "Close list..."
++msgstr "Згорнути ÑпиÑок..."
++
++msgid "Collecting data..."
++msgstr "Ð—Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…..."
++
++msgid "Command"
++msgstr "Команда"
++
++msgid "Common Configuration"
++msgstr "Загальна конфігураціÑ"
++
++msgid "Compression"
++msgstr "СтиÑненнÑ"
++
++msgid "Configuration"
++msgstr "КонфігураціÑ"
++
++msgid "Configuration applied."
++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð·Ð°ÑтоÑована."
++
++msgid "Configuration files will be kept."
++msgstr "Конфігураційні файли будуть збережені."
++
++msgid "Confirmation"
++msgstr "ПідтвердженнÑ"
++
++msgid "Connect"
++msgstr "Підключити"
++
++msgid "Connected"
++msgstr "Підключений"
++
++msgid "Connection Limit"
++msgstr "Гранична кількіÑÑ‚ÑŒ підключень"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr "ПідключеннÑ"
++
++msgid "Country"
++msgstr "Країна"
++
++msgid "Country Code"
++msgstr "Код країни"
++
++msgid "Cover the following interface"
++msgstr "Покривати наÑтупний інтерфейÑ"
++
++msgid "Cover the following interfaces"
++msgstr "Покривати наÑтупні інтерфейÑи"
++
++msgid "Create / Assign firewall-zone"
++msgstr "Створити / Визначити зону брандмауера"
++
++msgid "Create Interface"
++msgstr "Створити інтерфейÑ"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "Створити міÑÑ‚ через кілька інтерфейÑів"
++
++msgid "Critical"
++msgstr "Критичний"
++
++msgid "Cron Log Level"
++msgstr "Рівень Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— Cron"
++
++msgid "Custom Interface"
++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"ÐаÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²ÐµÐ´Ñ–Ð½ÐºÐ¸ <abbr title=\"Light Emitting Diode — Ñвітлодіод"
++"\">LED</abbr>, Ñкщо це можливо."
++
++msgid "DHCP Leases"
++msgstr "Оренди DHCP"
++
++msgid "DHCP Server"
++msgstr "Сервер DHCP"
++
++msgid "DHCP and DNS"
++msgstr "DHCP та DNS"
++
++msgid "DHCP client"
++msgstr "Клієнт DHCP"
++
++msgid "DHCP-Options"
++msgstr "Параметри DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr "Оренди DHCPv6"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ DNS-запитів"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID"
++
++msgid "Debug"
++msgstr "ЗневаджуваннÑ"
++
++msgid "Default %d"
++msgstr "Типово %d"
++
++msgid "Default gateway"
++msgstr "Типовий шлюз"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "Типовий Ñтан"
++
++msgid "Define a name for this network."
++msgstr "Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð¼ÐµÐ½Ñ– Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— мережі."
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¸Ñ… опцій DHCP, наприклад "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\", щоб оголошувати різні DNS-"
++"Ñервери Ð´Ð»Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñ–Ð²."
++
++msgid "Delete"
++msgstr "Видалити"
++
++msgid "Delete this interface"
++msgstr "Видалити цей інтерфейÑ"
++
++msgid "Delete this network"
++msgstr "Видалити цю мережу"
++
++msgid "Description"
++msgstr "ОпиÑ"
++
++msgid "Design"
++msgstr "Стиль (тема)"
++
++msgid "Destination"
++msgstr "ПризначеннÑ"
++
++msgid "Device"
++msgstr "ПриÑтрій"
++
++msgid "Device Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ñтрою"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "ДіагноÑтика"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "Каталог"
++
++msgid "Disable"
++msgstr "Вимкнути"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"Вимкнути <abbr title=\"Dynamic Host Configuration Protocol — протокол "
++"динамічної конфігурації вузла\">DHCP</abbr> Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інтерфейÑу."
++
++msgid "Disable DNS setup"
++msgstr "Вимкнути наÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ DNS"
++
++msgid "Disable HW-Beacon timer"
++msgstr "Вимкнути таймер HW-Beacon"
++
++msgid "Disabled"
++msgstr "Вимкнено"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "Відкидати RFC1918-відповіді від клієнта на Ñервер"
++
++msgid "Displaying only packages containing"
++msgstr "Показані тільки непорожні пакети"
++
++msgid "Distance Optimization"
++msgstr "ÐžÐ¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð° відÑтанню"
++
++msgid "Distance to farthest network member in meters."
++msgstr "ВідÑтань до найвіддаленішого вузла мережі в метрах."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "РізновидніÑÑ‚ÑŒ"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq ÑвлÑÑ” Ñобою комбінований <abbr title=\"Dynamic Host Configuration "
++"Protocol — протокол динамічної конфігурації вузла\">DHCP</abbr>-Ñервер Ñ– "
++"<abbr title=\"Domain Name System — ÑиÑтема доменних імен\">DNS</abbr>-"
++"транÑпортер Ð´Ð»Ñ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ñ–Ð² <abbr title=\"Network Address Translation — "
++"Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ (транÑлÑціÑ) мережевих адреÑ\">NAT</abbr>"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 "Ðе ÑпрÑмовувати зворотний переглÑд Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… мереж"
++
++msgid "Do not send probe responses"
++msgstr "Ðе надÑилати відповіді на зондуваннÑ"
++
++msgid "Domain required"
++msgstr "Потрібен домен"
++
++msgid "Domain whitelist"
++msgstr "\"Білий ÑпиÑок\" доменів"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Ðе переÑилати <abbr title=\"Domain Name System — ÑиÑтема доменних імен"
++"\">DNS</abbr>-запити без <abbr title=\"Domain Name System — ÑиÑтема доменних "
++"імен\">DNS</abbr>-імені"
++
++msgid "Download and install package"
++msgstr "Завантажити та інÑталювати пакети"
++
++msgid "Download backup"
++msgstr "Завантажити резервну копію"
++
++msgid "Dropbear Instance"
++msgstr "Ð ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Dropbear"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear — це <abbr title=\"Secure Shell — безпечна оболонка\">SSH</abbr>-"
++"Ñервер із вбудованим <abbr title=\"Secure Copy\">SCP</abbr>"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"Динамічний <abbr title=\"Dynamic Host Configuration Protocol — протокол "
++"динамічної конфігурації вузла\">DHCP</abbr>"
++
++msgid "Dynamic tunnel"
++msgstr "Динамічний тунель"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++"Динамічне Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ DHCP-Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñ–Ð². Якщо вимкнути, будуть "
++"обÑлуговуватиÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ клієнти, Ñкі мають Ñтатичні оренди."
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "EAP-Метод"
++
++msgid "Edit"
++msgstr "Редагувати"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "Редагувати цей інтерфейÑ"
++
++msgid "Edit this network"
++msgstr "Редагувати цю мережу"
++
++msgid "Emergency"
++msgstr "Ðварійний"
++
++msgid "Enable"
++msgstr "Увімкнути"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Увімкнути <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "Увімкнути динамічне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÑ–Ð½Ñ†ÐµÐ²Ð¾Ñ— точки HE.net"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "ПропуÑкати Jumbo-фрейми"
++
++msgid "Enable NTP client"
++msgstr "Увімкнути NTP-клієнт"
++
++msgid "Enable TFTP server"
++msgstr "Увімкнути TFTP-Ñервер"
++
++msgid "Enable VLAN functionality"
++msgstr "Увімкнути підтримку VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "Увімкнути learning та aging"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "Увімкнути це монтуваннÑ"
++
++msgid "Enable this swap"
++msgstr "Увімкнути це довантаженнÑ"
++
++msgid "Enable/Disable"
++msgstr "Увімкнено/Вимкнено"
++
++msgid "Enabled"
++msgstr "Увімкнено"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr ""
++"Увімкнути <abbr title=\"Spanning Tree Protocol\">STP</abbr> на цьому моÑту"
++
++msgid "Encapsulation mode"
++msgstr "Режим інкапÑулÑції"
++
++msgid "Encryption"
++msgstr "ШифруваннÑ"
++
++msgid "Erasing..."
++msgstr "ВидаленнÑ..."
++
++msgid "Error"
++msgstr "Помилка"
++
++msgid "Ethernet Adapter"
++msgstr "Ðдаптер Ethernet"
++
++msgid "Ethernet Switch"
++msgstr "Ethernet-комутатор"
++
++msgid "Expand hosts"
++msgstr "Ð Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ñ–Ð²"
++
++msgid "Expires"
++msgstr "ДійÑний ще"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr "Термін оренди адреÑ, мінімум 2 хвилини (<code>2m</code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "Зовнішній Ñервер ÑиÑтемного журналу"
++
++msgid "External system log server port"
++msgstr "Порт зовнішнього Ñервера ÑиÑтемного журналу"
++
++msgid "Fast Frames"
++msgstr "Швидкі фрейми"
++
++msgid "File"
++msgstr "Файл"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "І'Ð¼Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ образу, що оголошуєтьÑÑ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°Ð¼"
++
++msgid "Filesystem"
++msgstr "Файлова ÑиÑтема"
++
++msgid "Filter"
++msgstr "Фільтр"
++
++msgid "Filter private"
++msgstr "Фільтрувати приватні"
++
++msgid "Filter useless"
++msgstr "Фільтрувати непридатні"
++
++msgid "Find and join network"
++msgstr "Знайти мережу й приєднатиÑÑ"
++
++msgid "Find package"
++msgstr "Знайти пакет"
++
++msgid "Finish"
++msgstr "Готово"
++
++msgid "Firewall"
++msgstr "Брандмауер"
++
++msgid "Firewall Settings"
++msgstr "ÐаÑтройки брандмауера"
++
++msgid "Firewall Status"
++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ð°"
++
++msgid "Firmware Version"
++msgstr "ВерÑÑ–Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "ФікÑований порт Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… DNS-запитів"
++
++msgid "Flags"
++msgstr "Позначки"
++
++msgid "Flash Firmware"
++msgstr "Заливаємо прошивку"
++
++msgid "Flash image..."
++msgstr "Відвантажити образ..."
++
++msgid "Flash new firmware image"
++msgstr "Залити новий образ прошивки"
++
++msgid "Flash operations"
++msgstr "Операції заливаннÑ"
++
++msgid "Flashing..."
++msgstr "Заливаємо..."
++
++msgid "Force"
++msgstr "ПримуÑово"
++
++msgid "Force CCMP (AES)"
++msgstr "ПримуÑово CCMP (AES)"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr "ПримуÑово DHCP у цій мережі, навіть Ñкщо виÑвлено інший Ñервер."
++
++msgid "Force TKIP"
++msgstr "ПримуÑово TKIP"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "ПримуÑово TKIP та CCMP (AES)"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "СпрÑмовувати DHCP-трафік"
++
++msgid "Forward broadcast traffic"
++msgstr "СпрÑмовувати широкомовний трафік"
++
++msgid "Forwarding mode"
++msgstr "Режим ÑпрÑмовуваннÑ"
++
++msgid "Fragmentation Threshold"
++msgstr "Поріг фрагментації"
++
++msgid "Frame Bursting"
++msgstr "Frame Bursting"
++
++msgid "Free"
++msgstr "Вільно"
++
++msgid "Free space"
++msgstr "Вільне міÑце"
++
++msgid "GHz"
++msgstr "ГГц"
++
++msgid "GPRS only"
++msgstr "Тільки GPRS"
++
++msgid "Gateway"
++msgstr "Шлюз"
++
++msgid "Gateway ports"
++msgstr "Порти шлюзу"
++
++msgid "General Settings"
++msgstr "Загальні наÑтройки"
++
++msgid "General Setup"
++msgstr "Загальні наÑтройки"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "Cтворити архів"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Бездротовий 802.11%s контролер"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr "ОÑкільки пароль Ñ– Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ðµ Ñпівпадають, то пароль не змінено!"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "Перейти до конфігурації паролÑ..."
++
++msgid "Go to relevant configuration page"
++msgstr "Перейти до відповідної Ñторінки конфігурації"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr "Пароль HE.net"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "Обробник"
++
++msgid "Hang Up"
++msgstr "Призупинити"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Тут ви можете наÑтроїти оÑновні параметри виглÑду вашого приÑтрою, такі Ñк "
++"назва (ім’Ñ) вузла або чаÑовий поÑÑ."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++"Тут ви можете вÑтавити відкриті SSH-ключі (по одному на Ñ€Ñдок) Ð´Ð»Ñ SSH з "
++"відкритим ключем автентифікації."
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Бездротовий 802.11b контролер Hermes"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr ""
++"Приховати <abbr title=\"Extended Service Set Identifier — ідентифікатор "
++"розширеної Ñлужби поÑлуг\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "ЗапиÑи вузлів"
++
++msgid "Host expiry timeout"
++msgstr "Тайм-аут вузла"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "<abbr title=\"Internet Protocol Address\">IP</abbr> вузла або мережа"
++
++msgid "Hostname"
++msgstr "Ðазва (ім'Ñ) вузла"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "Ім'Ñ Ð²ÑƒÐ·Ð»Ð° Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ запиті DHCP"
++
++msgid "Hostnames"
++msgstr "Імена вузлів"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "IP-адреÑа"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "Брандмауер IPv4"
++
++msgid "IPv4 WAN Status"
++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ IPv4 WAN"
++
++msgid "IPv4 address"
++msgstr "ÐдреÑа IPv4"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4 та IPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "Широкомовний IPv4"
++
++msgid "IPv4 gateway"
++msgstr "Шлюз IPv4"
++
++msgid "IPv4 netmask"
++msgstr "МаÑка мережі IPv4"
++
++msgid "IPv4 only"
++msgstr "Тільки IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "Довжина префікÑа IPv4"
++
++msgid "IPv4-Address"
++msgstr "IPv4-адреÑа"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "Брандмауер IPv6"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ IPv6 WAN"
++
++msgid "IPv6 address"
++msgstr "ÐдреÑа IPv6"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "Шлюз IPv6"
++
++msgid "IPv6 only"
++msgstr "Тільки IPv6"
++
++msgid "IPv6 prefix"
++msgstr "ÐŸÑ€ÐµÑ„Ñ–ÐºÑ IPv6"
++
++msgid "IPv6 prefix length"
++msgstr "Довжина префікÑа IPv6"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "IPv6-адреÑа"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6 у IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6 через IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6 через IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "ІдентичніÑÑ‚ÑŒ"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++"Якщо обрано, монтувати приÑтрій за його UUID заміÑÑ‚ÑŒ фікÑованого вузла "
++"приÑтрою"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++"Якщо обрано, монтувати приÑтрій за назвою його розділу заміÑÑ‚ÑŒ фікÑованого "
++"вузла приÑтрою"
++
++msgid "If unchecked, no default route is configured"
++msgstr "Якщо не позначено, типовий маршрут не наÑтроєно"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr "Якщо не позначено, оголошувані адреÑи DNS-Ñерверів ігноруютьÑÑ"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"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>). Майте на увазі, що Ñвопінг даних Ñ” дуже повільним процеÑом, оÑкільки "
++"Ñвоп-приÑтрої не можуть бути доÑтупні з такою виÑокою швидкіÑÑ‚ÑŽ, Ñк <abbr "
++"title=\"Random Access Memory\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr "Ігнорувати интерфейÑ"
++
++msgid "Ignore resolve file"
++msgstr "Ігнорувати файли resolv"
++
++msgid "Image"
++msgstr "Образ"
++
++msgid "In"
++msgstr "Ð’Ñ…."
++
++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 "Тайм-аут бездіÑльноÑÑ‚Ñ–"
++
++msgid "Inbound:"
++msgstr "Вхідний:"
++
++msgid "Info"
++msgstr "ІнформаціÑ"
++
++msgid "Initscript"
++msgstr "Скрипт ініціалізації"
++
++msgid "Initscripts"
++msgstr "Скрипти ініціалізації"
++
++msgid "Install"
++msgstr "ІнÑталювати"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "ІнÑталÑÑ†Ñ–Ñ Ð¿Ð°ÐºÐµÑ‚Ð° %q"
++
++msgid "Install protocol extensions..."
++msgstr "ІнÑталÑÑ†Ñ–Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½ÑŒ протоколу..."
++
++msgid "Installed packages"
++msgstr "ІнÑтальовані пакети"
++
++msgid "Interface"
++msgstr "ІнтерфейÑ"
++
++msgid "Interface Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу"
++
++msgid "Interface Overview"
++msgstr "ОглÑд інтерфейÑів"
++
++msgid "Interface is reconnecting..."
++msgstr "ÐŸÐµÑ€ÐµÐ¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу..."
++
++msgid "Interface is shutting down..."
++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÑƒÑ” роботу..."
++
++msgid "Interface not present or not connected yet."
++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ñ–Ð´Ñутній або ще не підключений."
++
++msgid "Interface reconnected"
++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾"
++
++msgid "Interface shut down"
++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð² роботу"
++
++msgid "Interfaces"
++msgstr "ІнтерфейÑи"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° Ñервера"
++
++msgid "Invalid"
++msgstr "ÐеприпуÑтимо"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++"Задано невірний VLAN ID! ДоÑтупні тільки ідентифікатори в межах між %d Ñ– %d."
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "Задано невірний VLAN ID! ДоÑтупні тільки унікальні ідентифікатори."
++
++msgid "Invalid username and/or password! Please try again."
++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 ""
++"Схоже, що ви намагаєтеÑÑ Ð·Ð°Ð»Ð¸Ñ‚Ð¸ образ, Ñкий не вміщаєтьÑÑ Ñƒ флеш-пам'ÑÑ‚ÑŒ! "
++"Перевірте файл образу!"
++
++msgid "Java Script required!"
++msgstr "Потрібен Java Script!"
++
++msgid "Join Network"
++msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі"
++
++msgid "Join Network: Settings"
++msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі: ÐаÑтройки"
++
++msgid "Join Network: Wireless Scan"
++msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі: Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð´Ñ€Ð¾Ñ‚Ð¾Ð²Ð¸Ñ… мереж"
++
++msgid "Keep settings"
++msgstr "Зберегти наÑтройки"
++
++msgid "Kernel Log"
++msgstr "Журнал Ñдра"
++
++msgid "Kernel Version"
++msgstr "ВерÑÑ–Ñ Ñдра"
++
++msgid "Key"
++msgstr "Ключ"
++
++msgid "Key #%d"
++msgstr "Ключ #%d"
++
++msgid "Kill"
++msgstr "Знищити"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "Сервер L2TP"
++
++msgid "LCP echo failure threshold"
++msgstr "Поріг помилок ехо-запитів LCP"
++
++msgid "LCP echo interval"
++msgstr "Інтервал ехо-запитів LCP"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "Мітка"
++
++msgid "Language"
++msgstr "Мова"
++
++msgid "Language and Style"
++msgstr "Мова та Ñтиль"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "Ð§Ð°Ñ Ñ‡Ð¸Ð½Ð½Ð¾ÑÑ‚Ñ– оренди"
++
++msgid "Leasefile"
++msgstr "Файл оренд"
++
++msgid "Leasetime"
++msgstr "Ð§Ð°Ñ Ð¾Ñ€ÐµÐ½Ð´Ð¸"
++
++msgid "Leasetime remaining"
++msgstr "Ð§Ð°Ñ Ð¾Ñ€ÐµÐ½Ð´Ð¸, що лишивÑÑ"
++
++msgid "Leave empty to autodetect"
++msgstr "Залиште поле порожнім Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "Залиште порожнім, щоб викориÑтовувати поточну адреÑу WAN"
++
++msgid "Legend:"
++msgstr "Легенда:"
++
++msgid "Limit"
++msgstr "Межа"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Зв'Ñзок вÑтановлено"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++"СпиÑок <abbr title=\"Domain Name System\">DNS</abbr>-Ñерверів, до Ñких "
++"переÑилати запити"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "СпиÑок доменів, Ð´Ð»Ñ Ñких дозволені RFC1918-відповіді"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr "СпиÑок доменів, Ñкі підтримують результати підробки NX-доменів"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++"ПроÑлуховувати тільки на цьому інтерфейÑÑ–, або на вÑÑ–Ñ… (Ñкщо <em>не "
++"визначено</em>)"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "Порт проÑÐ»ÑƒÑ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… DNS-запитів"
++
++msgid "Load"
++msgstr "ÐавантаженнÑ"
++
++msgid "Load Average"
++msgstr "Середнє навантаженнÑ"
++
++msgid "Loading"
++msgstr "ЗавантаженнÑ"
++
++msgid "Local IPv4 address"
++msgstr "Локальна адреÑа IPv4"
++
++msgid "Local IPv6 address"
++msgstr "Локальна адреÑа IPv6"
++
++msgid "Local Startup"
++msgstr "Локальний запуÑк"
++
++msgid "Local Time"
++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"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++"Ð¡ÑƒÑ„Ñ–ÐºÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ домену додаєтьÑÑ Ð´Ð¾ DHCP-імен вузлів та запиÑів з файлу "
++"hosts"
++
++msgid "Local server"
++msgstr "Локальний Ñервер"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++"Локалізувати ім'Ñ Ñ…Ð¾Ñта залежно від запитуючої підмережі, Ñкщо доÑтупні "
++"кілька IP-адреÑ"
++
++msgid "Localise queries"
++msgstr "Локалізувати запити"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "Рівень Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ– до журналу"
++
++msgid "Log queries"
++msgstr "Журнал запитів"
++
++msgid "Logging"
++msgstr "ЖурналюваннÑ"
++
++msgid "Login"
++msgstr "Увійти"
++
++msgid "Logout"
++msgstr "Вийти"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr "Ðайнижча орендована адреÑа"
++
++msgid "MAC-Address"
++msgstr "MAC-адреÑа"
++
++msgid "MAC-Address Filter"
++msgstr "Фільтр MAC-адреÑ"
++
++msgid "MAC-Filter"
++msgstr "MAC-фільтр"
++
++msgid "MAC-List"
++msgstr "MAC-ÑпиÑок"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MБ/Ñ"
++
++msgid "MHz"
++msgstr "МГц"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "МакÑимальна швидкіÑÑ‚ÑŒ"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "МакÑимально допуÑтима кількіÑÑ‚ÑŒ активних оренд DHCP"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "МакÑимально допуÑтима кількіÑÑ‚ÑŒ одночаÑних DNS-запитів"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "МакÑимально допуÑтимий розмір UDP-пакетів EDNS.0"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "МакÑимальний Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ð½Ð¾ÑÑ‚Ñ– модему (Ñекунд)"
++
++msgid "Maximum hold time"
++msgstr "МакÑимальний Ñ‡Ð°Ñ ÑƒÑ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ"
++
++msgid "Maximum number of leased addresses."
++msgstr "МакÑимальна кількіÑÑ‚ÑŒ орендованих адреÑ."
++
++msgid "Mbit/s"
++msgstr "Мбіт/Ñ"
++
++msgid "Memory"
++msgstr "Пам'ÑÑ‚ÑŒ"
++
++msgid "Memory usage (%)"
++msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼'ÑÑ‚Ñ–, %"
++
++msgid "Metric"
++msgstr "Метрика"
++
++msgid "Minimum Rate"
++msgstr "Мінімальна швидкіÑÑ‚ÑŒ"
++
++msgid "Minimum hold time"
++msgstr "Мінімальний Ñ‡Ð°Ñ ÑƒÑ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "ВідÑутні Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ %q"
++
++msgid "Mode"
++msgstr "Режим"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Модем"
++
++msgid "Modem init timeout"
++msgstr "Тайм-аут ініціалізації модему"
++
++msgid "Monitor"
++msgstr "Монітор"
++
++msgid "Mount Entry"
++msgstr "Вхід монтуваннÑ"
++
++msgid "Mount Point"
++msgstr "Точка монтуваннÑ"
++
++msgid "Mount Points"
++msgstr "Точки монтуваннÑ"
++
++msgid "Mount Points - Mount Entry"
++msgstr "Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ - ЗапиÑи монтуваннÑ"
++
++msgid "Mount Points - Swap Entry"
++msgstr "Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ - Вхід довантаженнÑ"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð°ÑŽÑ‚ÑŒ, до Ñкої точки приÑтрою пам'ÑÑ‚Ñ– буде прикріплена "
++"файлова ÑиÑтема"
++
++msgid "Mount options"
++msgstr "Опції монтуваннÑ"
++
++msgid "Mount point"
++msgstr "Точка монтуваннÑ"
++
++msgid "Mounted file systems"
++msgstr "Змонтовані файлові ÑиÑтеми"
++
++msgid "Move down"
++msgstr "Вниз"
++
++msgid "Move up"
++msgstr "Вгору"
++
++msgid "Multicast Rate"
++msgstr "ШвидкіÑÑ‚ÑŒ багатоадреÑного потоку"
++
++msgid "Multicast address"
++msgstr "ÐдреÑа багатоадреÑного потоку"
++
++msgid "NAS ID"
++msgstr "Ідентифікатор NAS"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "Кандидати Ð´Ð»Ñ Ñинхронізації NTP-Ñервера"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Ім'Ñ"
++
++msgid "Name of the new interface"
++msgstr "Ім'Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ інтерфейÑу"
++
++msgid "Name of the new network"
++msgstr "Ðазва (ім'Ñ) нової мережі"
++
++msgid "Navigation"
++msgstr "ÐавігаціÑ"
++
++msgid "Netmask"
++msgstr "МаÑка мережі"
++
++msgid "Network"
++msgstr "Мережа"
++
++msgid "Network Utilities"
++msgstr "Мережеві утиліти"
++
++msgid "Network boot image"
++msgstr "Образ Ð´Ð»Ñ Ð¼ÐµÑ€ÐµÐ¶ÐµÐ²Ð¾Ð³Ð¾ завантаженнÑ"
++
++msgid "Network without interfaces."
++msgstr "Мережа без інтерфейÑів."
++
++msgid "Next »"
++msgstr "ÐаÑтупний »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "Ðемає DHCP-Ñервера, наÑтроєного Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інтерфейÑу"
++
++msgid "No chains in this table"
++msgstr "У цій таблиці нема ланцюжків"
++
++msgid "No files found"
++msgstr "Файли не знайдено"
++
++msgid "No information available"
++msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´ÑутнÑ"
++
++msgid "No negative cache"
++msgstr "ÐÑ–Ñких негативних кешувань"
++
++msgid "No network configured on this device"
++msgstr "Ðа цьому приÑтрої нема наÑтроєної мережі"
++
++msgid "No network name specified"
++msgstr "Ім'Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ– не визначене"
++
++msgid "No package lists available"
++msgstr "Ðемає доÑтупних ÑпиÑків пакетів"
++
++msgid "No password set!"
++msgstr "Пароль не вÑтановлено!"
++
++msgid "No rules in this chain"
++msgstr "У цьму ланцюжку нема правил"
++
++msgid "No zone assigned"
++msgstr "Зона не призначена"
++
++msgid "Noise"
++msgstr "Шум"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "Шум:"
++
++msgid "None"
++msgstr "Жоден"
++
++msgid "Normal"
++msgstr "Ðормальний"
++
++msgid "Not Found"
++msgstr "Ðе знайдено"
++
++msgid "Not associated"
++msgstr "Ðе пов'Ñзаний"
++
++msgid "Not connected"
++msgstr "Ðе підключено"
++
++msgid "Note: Configuration files will be erased."
++msgstr "Примітка: конфігураційні файли будуть видалені."
++
++msgid "Notice"
++msgstr "ПопередженнÑ"
++
++msgid "Nslookup"
++msgstr "DNS-запит"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ OPKG"
++
++msgid "Off-State Delay"
++msgstr "Затримка Off-State"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Ðа цій Ñторінці ви можете наÑтроїти мережеві інтерфейÑи. Ви можете "
++"об'єднатиати кілька інтерфейÑів моÑтом, відзначивши поле \"Об'єднати "
++"інтерфейÑи в міÑÑ‚\" та ввівши імена кількох мережевих інтерфейÑів, розділені "
++"пробілами. Також ви можете викориÑтовувати <abbr title=\"Virtual Local Area "
++"Network — віртуальна локальна комп'ютерна мережа\">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 "Має бути вказане одне з двох - ім'Ñ Ð²ÑƒÐ·Ð»Ð° або ÐœÐС-адреÑа!"
++
++msgid "One or more fields contain invalid values!"
++msgstr "Одне або декілька полів міÑÑ‚ÑÑ‚ÑŒ неприпуÑтимі значеннÑ!"
++
++msgid "One or more required fields have no value!"
++msgstr "Одне або декілька обов'Ñзкових полів не мають значень!"
++
++msgid "Open list..."
++msgstr "Відкрити ÑпиÑок..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "ÐžÐ¿Ñ†Ñ–Ñ Ð·Ð¼Ñ–Ð½ÐµÐ½Ð°"
++
++msgid "Option removed"
++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 "Options"
++msgstr "Опції"
++
++msgid "Other:"
++msgstr "Інше:"
++
++msgid "Out"
++msgstr "Вих."
++
++msgid "Outbound:"
++msgstr "Вихідний:"
++
++msgid "Outdoor Channels"
++msgstr "Зовнішні канали"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "Перевизначити MAC-адреÑу"
++
++msgid "Override MTU"
++msgstr "Перевизначити MTU"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑˆÐ»ÑŽÐ·Ñƒ у відповідÑÑ… DHCP"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++"ÐŸÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶ÐµÐ²Ð¾Ñ— маÑки, Ñка надÑилаєтьÑÑ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°Ð¼. Зазвичай вона "
++"обчиÑлюєтьÑÑ Ð²Ñ–Ð´ підмережі, що обÑлуговуєтьÑÑ."
++
++msgid "Override the table used for internal routes"
++msgstr ""
++"ÐŸÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–, що викориÑтовужтьÑÑ Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ñ… ÑпрÑмовувань"
++
++msgid "Overview"
++msgstr "ОглÑд"
++
++msgid "Owner"
++msgstr "ВлаÑник"
++
++msgid "PAP/CHAP password"
++msgstr "Пароль PAP/CHAP"
++
++msgid "PAP/CHAP username"
++msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача PAP/CHAP"
++
++msgid "PID"
++msgstr "<abbr title=\"Process Identifier — Ідентифікатор процеÑу\">PID</abbr>"
++
++msgid "PIN"
++msgstr ""
++"<abbr title=\"Personal Identification Number — ПерÑональний ідентифікаційний "
++"номер\">>PIN</abbr>"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "ІнкапÑулÑÑ†Ñ–Ñ PPPoA"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "Потрібен пакет libiwinfo!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "Перелік пакетів Ñтворений більше ніж 24 години тому"
++
++msgid "Package name"
++msgstr "Ðазва пакета"
++
++msgid "Packets"
++msgstr "Пакети"
++
++msgid "Part of zone %q"
++msgstr "ЧаÑтина зони %q"
++
++msgid "Password"
++msgstr "Пароль"
++
++msgid "Password authentication"
++msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð·Ð° паролем"
++
++msgid "Password of Private Key"
++msgstr "Пароль закритого ключа"
++
++msgid "Password successfully changed!"
++msgstr "Пароль уÑпішно змінено!"
++
++msgid "Path to CA-Certificate"
++msgstr "ШлÑÑ… до центру Ñертифікції"
++
++msgid "Path to Client-Certificate"
++msgstr "ШлÑÑ… до Ñертифікату клієнта"
++
++msgid "Path to Private Key"
++msgstr "ШлÑÑ… до закритого ключа"
++
++msgid "Path to executable which handles the button event"
++msgstr "ШлÑÑ… до програми, Ñка оброблÑÑ” натиÑÐºÐ°Ð½Ð½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸"
++
++msgid "Peak:"
++msgstr "Пік:"
++
++msgid "Perform reboot"
++msgstr "Виконати перезавантаженнÑ"
++
++msgid "Perform reset"
++msgstr "Відновити"
++
++msgid "Phy Rate:"
++msgstr "Фізична швидкіÑÑ‚ÑŒ:"
++
++msgid "Physical Settings"
++msgstr "Фізичні параметри"
++
++msgid "Ping"
++msgstr "Ехо-запит"
++
++msgid "Pkts."
++msgstr "пакетів"
++
++msgid "Please enter your username and password."
++msgstr "Введіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ñ– пароль"
++
++msgid "Policy"
++msgstr "Політика"
++
++msgid "Port"
++msgstr "Порт"
++
++msgid "Port %d"
++msgstr "Порт %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr "Порт %d нетегований у кількох VLAN-ах!"
++
++msgid "Port status:"
++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ñ€Ñ‚Ñƒ:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++"Вважати вузол недоÑтупним піÑÐ»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¾Ñ— кількоÑÑ‚Ñ– невдач Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐµÑ…Ð¾-"
++"пакета LCP, викориÑтовуйте 0, щоб ігнорувати невдачі"
++
++msgid "Prevents client-to-client communication"
++msgstr "Запобігає зв'Ñзкам клієнт-клієнт"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Бездротовий 802.11b контролер Prism2/2.5/3"
++
++msgid "Proceed"
++msgstr "Продовжити"
++
++msgid "Processes"
++msgstr "ПроцеÑи"
++
++msgid "Prot."
++msgstr "Прот."
++
++msgid "Protocol"
++msgstr "Протокол"
++
++msgid "Protocol family"
++msgstr "СімейÑтво протоколів"
++
++msgid "Protocol of the new interface"
++msgstr "Протокол нового інтерфейÑу"
++
++msgid "Protocol support is not installed"
++msgstr "Підтримка протоколу не інÑтальована"
++
++msgid "Provide NTP server"
++msgstr "Забезпечувати NTP-Ñервер"
++
++msgid "Provide new network"
++msgstr "ПоÑтачити нову мережу"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "ПÑевдо Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "ЯкіÑÑ‚ÑŒ"
++
++msgid "RTS/CTS Threshold"
++msgstr "Поріг RTS/CTS"
++
++msgid "RX"
++msgstr "Одержано"
++
++msgid "RX Rate"
++msgstr "ШвидкіÑÑ‚ÑŒ прийманнÑ"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "Бездротовий 802.11%s контролер RaLink"
++
++msgid "Radius-Accounting-Port"
++msgstr "Порт Radius-Accounting"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Секрет Radius-Accounting"
++
++msgid "Radius-Accounting-Server"
++msgstr "Сервер Radius-Accounting"
++
++msgid "Radius-Authentication-Port"
++msgstr "Порт Radius-Authentication"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Секрет Radius-Authentication"
++
++msgid "Radius-Authentication-Server"
++msgstr "Сервер Radius-Authentication"
++
++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 "
++"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."
++msgstr ""
++"ДійÑно видалити цей інтерфейÑ? СкаÑувати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾!\n"
++"Ви можете втратити доÑтуп до цього приÑтрою, Ñкщо ви підключені через цей "
++"інтерфейÑ."
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++"ДійÑно видалити цю бездротову мережу? СкаÑувати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾!\n"
++"Ви можете втратити доÑтуп до цього приÑтрою, Ñкщо ви підключені через цю "
++"мережу."
++
++msgid "Really reset all changes?"
++msgstr "ДійÑно Ñкинути вÑÑ– зміни?"
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++"ДійÑно вимкнути Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\"?\n"
++"Ви можете втратити доÑтуп до цього приÑтрою, Ñкщо ви підключені через цей "
++"інтерфейÑ."
++
++msgid "Really switch protocol?"
++msgstr "ДійÑно змінити протокол?"
++
++msgid "Realtime Connections"
++msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñƒ реальному чаÑÑ–"
++
++msgid "Realtime Graphs"
++msgstr "Графіки у реальному чаÑÑ–"
++
++msgid "Realtime Load"
++msgstr "ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñƒ реальному чаÑÑ–"
++
++msgid "Realtime Traffic"
++msgstr "Трафік у реальному чаÑÑ–"
++
++msgid "Realtime Wireless"
++msgstr "Бездротові мережі у реальному чаÑÑ–"
++
++msgid "Rebind protection"
++msgstr "ЗахиÑÑ‚ від переприв'Ñзки"
++
++msgid "Reboot"
++msgstr "ПерезавантаженнÑ"
++
++msgid "Rebooting..."
++msgstr "ПерезавантаженнÑ..."
++
++msgid "Reboots the operating system of your device"
++msgstr "Перезавантажити операційну ÑиÑтему вашого приÑтрою"
++
++msgid "Receive"
++msgstr "Прийом"
++
++msgid "Receiver Antenna"
++msgstr "Ðнтена приймача"
++
++msgid "Reconnect this interface"
++msgstr "Перепідключити цей інтерфейÑ"
++
++msgid "Reconnecting interface"
++msgstr "ÐŸÐµÑ€ÐµÐ¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу"
++
++msgid "References"
++msgstr "ПоÑиланнÑ"
++
++msgid "Regulatory Domain"
++msgstr "РегулÑтивний домен"
++
++msgid "Relay"
++msgstr "РетранÑлÑтор"
++
++msgid "Relay Bridge"
++msgstr "МіÑÑ‚-ретранÑлÑтор"
++
++msgid "Relay between networks"
++msgstr "Міжмережевий ретранÑлÑтор"
++
++msgid "Relay bridge"
++msgstr "МіÑÑ‚-ретранÑлÑтор"
++
++msgid "Remote IPv4 address"
++msgstr "Віддалена адреÑа IPv4"
++
++msgid "Remove"
++msgstr "Видалити"
++
++msgid "Repeat scan"
++msgstr "Повторити ÑкануваннÑ"
++
++msgid "Replace entry"
++msgstr "Замінити запиÑ"
++
++msgid "Replace wireless configuration"
++msgstr "Замінити конфігурацію бездротової мережі"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "Потрібно Ð´Ð»Ñ Ð´ÐµÑких провайдерів, наприклад, Charter із DOCSIS 3"
++
++msgid "Reset"
++msgstr "Скинути"
++
++msgid "Reset Counters"
++msgstr "Скинути лічильники"
++
++msgid "Reset to defaults"
++msgstr "Відновити початковий Ñтан"
++
++msgid "Resolv and Hosts Files"
++msgstr "Файли resolv і hosts"
++
++msgid "Resolve file"
++msgstr "Файл resolv"
++
++msgid "Restart"
++msgstr "Перезавантажити"
++
++msgid "Restart Firewall"
++msgstr "Перезавантажити брандмауер"
++
++msgid "Restore backup"
++msgstr "Відновити з резервної копії"
++
++msgid "Reveal/hide password"
++msgstr "Показати/приховати пароль"
++
++msgid "Revert"
++msgstr "СкаÑувати зміни"
++
++msgid "Root"
++msgstr "Корінь"
++
++msgid "Root directory for files served via TFTP"
++msgstr "Кореневий каталог Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² TFTP"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "Пароль маршрутизатора"
++
++msgid "Routes"
++msgstr "Маршрути"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Маршрути визначають через Ñкий Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ– шлюз можна доÑÑгнути певного "
++"вузла або мережі."
++
++msgid "Rule #"
++msgstr "Правило #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr "Виконати перевірку файлової ÑиÑтеми перед монтуваннÑм приÑтрою"
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr "SSH-доÑтуп"
++
++msgid "SSH-Keys"
++msgstr "SSH-ключі"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "Зберегти"
++
++msgid "Save & Apply"
++msgstr "Зберегти Ñ– заÑтоÑувати"
++
++msgid "Save &#38; Apply"
++msgstr "Зберегти Ñ– заÑтоÑувати"
++
++msgid "Scan"
++msgstr "Сканувати"
++
++msgid "Scheduled Tasks"
++msgstr "Заплановані завданнÑ"
++
++msgid "Section added"
++msgstr "Ð¡ÐµÐºÑ†Ñ–Ñ Ð´Ð¾Ð´Ð°Ð½Ð°"
++
++msgid "Section removed"
++msgstr "Ð¡ÐµÐºÑ†Ñ–Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð°"
++
++msgid "See \"mount\" manpage for details"
++msgstr "Подробиці див. на Ñторінці керівництва \"mount\""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++"ÐадÑилати ехо-пакети LCP зі вказаним інтервалом (Ñекунди), ефективно тільки "
++"в поєднанні з порогом помилок"
++
++msgid "Separate Clients"
++msgstr "РозділÑти клієнтів"
++
++msgid "Separate WDS"
++msgstr "РозділÑти WDS"
++
++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 "Ðазва (ім'Ñ) ÑервіÑу"
++
++msgid "Service Type"
++msgstr "Тип ÑервіÑу"
++
++msgid "Services"
++msgstr "СервіÑи"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "ÐаÑтройки Ñинхронізації чаÑу"
++
++msgid "Setup DHCP Server"
++msgstr "ÐаÑтройки DHCP-Ñервера"
++
++msgid "Show current backup file list"
++msgstr "Показати поточний ÑпиÑок файлів резервного копіюваннÑ"
++
++msgid "Shutdown this interface"
++msgstr "Вимкнути цей інтерфейÑ"
++
++msgid "Shutdown this network"
++msgstr "Вимкнути цю мережу"
++
++msgid "Signal"
++msgstr "Сигнал"
++
++msgid "Signal:"
++msgstr "Сигнал:"
++
++msgid "Size"
++msgstr "Розмір"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "ПропуÑтити"
++
++msgid "Skip to content"
++msgstr "Перейти до вміÑту"
++
++msgid "Skip to navigation"
++msgstr "Перейти до навігації"
++
++msgid "Slot time"
++msgstr "Ð§Ð°Ñ Ñлота"
++
++msgid "Software"
++msgstr "Програмне забезпеченнÑ"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "ДеÑкі Ð¿Ð¾Ð»Ñ Ñ” неприпуÑтимими, неможливо зберегти значеннÑ!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "Ðа жаль, об'єкт, Ñкий ви проÑили, не знайдено."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "Ðа жаль, на Ñервері ÑталаÑÑ Ð½ÐµÐ¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð° помилка."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"Ðа жаль, автоматичне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑиÑтеми не підтримуєтьÑÑ. Ðовий образ "
++"прошивки повинен бути залитий вручну. ЗвернітьÑÑ Ð´Ð¾ OpenWrt Wiki за "
++"інÑтрукцією з інÑталÑції Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð³Ð¾ приÑтрою."
++
++msgid "Sort"
++msgstr "СортуваннÑ"
++
++msgid "Source"
++msgstr "Джерело"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "Визначає Ñтан кнопки Ð´Ð»Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "Визначає каталог, до Ñкого приєднаний приÑтрій"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "Визначає порт проÑÐ»ÑƒÑ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— реалізації <em>Dropbear</em>"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++"Визначає макÑимальну кількіÑÑ‚ÑŒ невдалих ARP-запитів до вузлів, піÑÐ»Ñ Ñкого "
++"вважаєтьÑÑ, що вузли \"мертві\""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++"Визначає макÑимальний Ñ‡Ð°Ñ (Ñекунди), піÑÐ»Ñ Ñкого вважаєтьÑÑ, що вузли "
++"\"мертві\""
++
++msgid "Specify the secret encryption key here."
++msgstr "Вкажіть тут Ñекретний ключ шифруваннÑ."
++
++msgid "Start"
++msgstr "ЗапуÑтити"
++
++msgid "Start priority"
++msgstr "Стартовий пріоритет"
++
++msgid "Startup"
++msgstr "ЗапуÑк"
++
++msgid "Static IPv4 Routes"
++msgstr "Статичні маршрути IPv4"
++
++msgid "Static IPv6 Routes"
++msgstr "Статичні маршрути IPv6"
++
++msgid "Static Leases"
++msgstr "Статичні оренди"
++
++msgid "Static Routes"
++msgstr "Статичні маршрути"
++
++msgid "Static WDS"
++msgstr "Статичний WDS"
++
++msgid "Static address"
++msgstr "Статичні адреÑи"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"Статичні оренди викориÑтовуютьÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„Ñ–ÐºÑованих IP-Ð°Ð´Ñ€ÐµÑ Ñ– "
++"Ñимволічних імен вузлів DHCP-клієнтам. Вони також необхідні Ð´Ð»Ñ Ñтатичних "
++"конфігурацій інтерфейÑів, коли обÑлуговуютьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ вузли з відповідною "
++"орендою."
++
++msgid "Status"
++msgstr "СтатуÑ"
++
++msgid "Stop"
++msgstr "Зупинити"
++
++msgid "Strict order"
++msgstr "Строгий порÑдок"
++
++msgid "Submit"
++msgstr "ÐадіÑлати"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Вхід довантаженнÑ"
++
++msgid "Switch"
++msgstr "Комутатор"
++
++msgid "Switch %q"
++msgstr "Комутатор %q"
++
++msgid "Switch %q (%s)"
++msgstr "Комутатор %q (%s)"
++
++msgid "Switch protocol"
++msgstr "Протокол комутатора"
++
++msgid "Sync with browser"
++msgstr "Синхронізувати з браузером"
++
++msgid "Synchronizing..."
++msgstr "СинхронізаціÑ..."
++
++msgid "System"
++msgstr "СиÑтема"
++
++msgid "System Log"
++msgstr "СиÑтемний журнал"
++
++msgid "System Properties"
++msgstr "ВлаÑтивоÑÑ‚Ñ– ÑиÑтеми"
++
++msgid "System log buffer size"
++msgstr "Розмір буфера ÑиÑтемного журналу"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "ÐаÑтройки TFTP"
++
++msgid "TFTP server root"
++msgstr "Корінь TFTP-Ñервера"
++
++msgid "TX"
++msgstr "Передано"
++
++msgid "TX Rate"
++msgstr "ШвидкіÑÑ‚ÑŒ передаваннÑ"
++
++msgid "Table"
++msgstr "ТаблицÑ"
++
++msgid "Target"
++msgstr "Мета"
++
++msgid "Terminate"
++msgstr "Завершити"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"Розділ <em>ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ñтрою</em> охоплює фізичні параметри радіо-"
++"апаратних заÑобів, такі, Ñк канал, потужніÑÑ‚ÑŒ передавача або вибір антени, "
++"Ñкі Ñ” Ñпільними Ð´Ð»Ñ Ð²ÑÑ–Ñ… визначених бездротових мереж (Ñкщо радіо-апаратні "
++"заÑоби здатні підтримувати кілька SSID). Параметри окремих мереж, такі, Ñк "
++"ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ режим роботи, згруповані в розділі <em>ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ "
++"інтерфейÑу</em>."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"Пакет <em>libiwinfo-lua</em> не інÑтальований. Щоб мати можливіÑÑ‚ÑŒ "
++"наÑтроювати безпровідні мережі, Ñлід інÑталювати цей компонент!"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++"Призначений провайдеру 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>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++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>)"
++
++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>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"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 "Ðижче наведені зміни були заÑтоÑовані"
++
++msgid "The following changes have been reverted"
++msgstr "Ðижче наведені зміни були ÑкаÑовані"
++
++msgid "The following rules are currently active on this system."
++msgstr "У даний Ñ‡Ð°Ñ Ñƒ цій ÑиÑтемі активні такі правила."
++
++msgid "The given network name is not unique"
++msgstr "Задане мережеве ім'Ñ Ð½Ðµ Ñ” унікальним"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++"ÐžÐ±Ð»Ð°Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ підтримує мульти-SSID Ñ–, Ñкщо ви продовжите, Ñ–Ñнуюча "
++"ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð±ÑƒÐ´Ðµ замінена."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr "Довжина IPv4-префікÑа в бітах, решта викориÑтовуєтьÑÑ Ð² IPv6-адреÑах."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "Довжина IPv6-префікÑа в бітах"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 — віртуальна локальна комп'ютерна "
++"мережа\">VLAN</abbr> чаÑто викориÑтовуютьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ– на окремі "
++"Ñегменти. Зазвичай один виcхідний порт викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· "
++"більшою мережею, такою наприклад, Ñк Інтернет, а інші порти — Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ñ— "
++"мережі."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "Обраний протокол потребує призначених приÑтроїв"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++"Зараз ÑиÑтема видалÑÑ” розділ конфігурації Ñ– коли закінчить, "
++"перезавантажитьÑÑ."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++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 "
++"you choose the generic image format for your platform."
++msgstr ""
++"Завантажений файл образу не міÑтить підтримуваний формат. ПереконайтеÑÑ, що "
++"ви вибираєте універÑальний формат образу Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— платформи."
++
++msgid "There are no active leases."
++msgstr "Ðктивних оренд немає."
++
++msgid "There are no pending changes to apply!"
++msgstr "Ðемає жодних змін до заÑтоÑуваннÑ!"
++
++msgid "There are no pending changes to revert!"
++msgstr "Ðемає жодних змін до ÑкаÑуваннÑ!"
++
++msgid "There are no pending changes!"
++msgstr "Ðемає жодних очікуючих змін!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++"Ðемає жодного призначеного приÑтрою. Призначте мережевий приÑтрій у вкладці "
++"\"Фізичні параметри\"."
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++"Цей маршрутизатор не має паролÑ. Ð’Ñтановіть пароль, шоб захиÑтити веб-"
++"Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ– увімкнути SSH."
++
++msgid "This IPv4 address of the relay"
++msgstr "Це IPv4-адреÑа ретранÑлÑтора"
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"Це ÑпиÑок шаблонів Ð´Ð»Ñ Ð²Ñ–Ð´Ð±Ð¾Ñ€Ñƒ файлів Ñ– каталогів, Ñкі мають увійти до "
++"резервної копії. Змінені файли у <code>/etc/config/</code> та деÑкі інші "
++"зберігаютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾."
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"Це вміÑÑ‚ файлу <code>/etc/rc.local</code>. Ð’Ñтавте тут ваші влаÑні команди "
++"(перед 'exit 0'), щоб виконати Ñ—Ñ… у кінці процеÑу завантаженнÑ."
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++"Це локальна адреÑа кінцевої точки, приÑвоєна тунельним брокером, зазвичай "
++"закінчуєтьÑÑ Ð½Ð° <code>:2</code>"
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Тільки Ð´Ð»Ñ <abbr title=\"Dynamic Host Configuration Protocol — протокол "
++"динамічної конфігурації вузла\">DHCP</abbr> у локальній мережі"
++
++msgid "This is the plain username for logging into the account"
++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 ""
++"Це ÑиÑтемна Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Cron (crontab), у Ñкій можна визначити заплановані "
++"завданнÑ."
++
++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 allows the configuration of custom button actions"
++msgstr "Ð¦Ñ Ñторінка дозволÑÑ” наÑтроїти нетипові дії кнопки"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "Ð¦Ñ Ñторінка надає оглÑд поточних активних мережних підключень."
++
++msgid "This section contains no values yet"
++msgstr "Ð¦Ñ ÑÐµÐºÑ†Ñ–Ñ Ð¿Ð¾ÐºÐ¸ що не міÑтить значень"
++
++msgid "Time Synchronization"
++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñу"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñу не наÑтроєна."
++
++msgid "Timezone"
++msgstr "ЧаÑовий поÑÑ"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++"Щоб відновити файли конфігурації, ви можете відвантажити раніше Ñтворений "
++"архів резервної копії."
++
++msgid "Total Available"
++msgstr "УÑього доÑтупно"
++
++msgid "Traceroute"
++msgstr "ТраÑуваннÑ"
++
++msgid "Traffic"
++msgstr "Трафік"
++
++msgid "Transfer"
++msgstr "Передано"
++
++msgid "Transmission Rate"
++msgstr "ШвидкіÑÑ‚ÑŒ передаваннÑ"
++
++msgid "Transmit"
++msgstr "Передача"
++
++msgid "Transmit Power"
++msgstr "ПотужніÑÑ‚ÑŒ передавача"
++
++msgid "Transmitter Antenna"
++msgstr "Ðнтена передавача"
++
++msgid "Trigger"
++msgstr "Тригер"
++
++msgid "Trigger Mode"
++msgstr "Режим запуÑку"
++
++msgid "Tunnel ID"
++msgstr "Ідентифікатор тунелю"
++
++msgid "Tunnel Interface"
++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ‚ÑƒÐ½ÐµÐ»ÑŽ"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Режим Turbo"
++
++msgid "Tx-Power"
++msgstr "ПотужніÑÑ‚ÑŒ передавача"
++
++msgid "Type"
++msgstr "Тип"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "Тільки UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "USB-приÑтрій"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr "Ðе вдалоÑÑ Ð¾Ð¿Ñ€Ð°Ñ†ÑŽÐ²Ð°Ñ‚Ð¸ запит"
++
++msgid "Unknown"
++msgstr "Ðевідомо"
++
++msgid "Unknown Error, password not changed!"
++msgstr "Ðевідома помилка, пароль не змінивÑÑ!"
++
++msgid "Unmanaged"
++msgstr "Ðекерований"
++
++msgid "Unsaved Changes"
++msgstr "Ðезбережені зміни"
++
++msgid "Unsupported protocol type."
++msgstr "Ðепідтримуваний тип протоколу."
++
++msgid "Update lists"
++msgstr "Оновити ÑпиÑки..."
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"Відвантажити sysupgrade-ÑуміÑний образ, щоб замінити поточну прошивку. Ð”Ð»Ñ "
++"Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— конфігурації вÑтановіть прапорець \"Зберегти наÑтройки"
++"\" (потрібен OpenWrt-ÑуміÑний образ прошивки)."
++
++msgid "Upload archive..."
++msgstr "Відвантажити архів..."
++
++msgid "Uploaded File"
++msgstr "Відвантажений файл"
++
++msgid "Uptime"
++msgstr "Ð§Ð°Ñ Ð±ÐµÐ·Ð¿ÐµÑ€ÐµÑ€Ð²Ð½Ð¾Ñ— роботи"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "ВикориÑтовувати <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr "ВикориÑтовувати DHCP-шлюз"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "ВикориÑтовувати DNS-Ñервери, оголошувані вузлом"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "ВикориÑтовуйте коди країн згідно ISO/IEC 3166 alpha2."
++
++msgid "Use MTU on tunnel interface"
++msgstr "ВикориÑтовувати на тунельному інтерфейÑÑ– MTU"
++
++msgid "Use TTL on tunnel interface"
++msgstr "ВикориÑтовувати на тунельному інтерфейÑÑ– TTL"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "ВикориÑтовувати прапорець широкомовноÑÑ‚Ñ–"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "ВикориÑтовувати оÑобливі DNS-Ñервери"
++
++msgid "Use default gateway"
++msgstr "ВикориÑтовувати типовий шлюз"
++
++msgid "Use gateway metric"
++msgstr "ВикориÑтовувати метрику шлюзу"
++
++msgid "Use routing table"
++msgstr "ВикориÑтовувати таблицю маршрутизації"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"ВикориÑтовуйте кнопку <em>Додати</em>, щоб додати новий Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ€ÐµÐ½Ð´Ð¸. "
++"<em>MAC-адреÑа</em> ідентифікує вузол, <em>IPv4-адреÑа</em> визначає "
++"фікÑовану адреÑу, Ñка буде викориÑтовуватиÑÑ, а <em>Ðазва (ім'Ñ) вузла</em> "
++"призначає Ñимволічне ім'Ñ Ð²ÑƒÐ·Ð»Ð°."
++
++msgid "Used"
++msgstr "ВикориÑтано"
++
++msgid "Used Key Slot"
++msgstr "ВикориÑтовуєтьÑÑ Ñлот ключа"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "VLAN-інтерфейÑ"
++
++msgid "VLANs on %q"
++msgstr "VLAN на %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLAN на %q (%s)"
++
++msgid "VPN Server"
++msgstr "VPN-Ñервер"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr "ÐšÐ»Ð°Ñ Ð¿Ð¾Ñтачальника Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸ при запиті DHCP"
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr "Перевірте"
++
++msgid "Version"
++msgstr "ВерÑÑ–Ñ"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "Відкрита ÑиÑтема WEP"
++
++msgid "WEP Shared Key"
++msgstr "Спільний ключ WEP"
++
++msgid "WEP passphrase"
++msgstr "Парольна фраза WEP"
++
++msgid "WMM Mode"
++msgstr "Режим WMM"
++
++msgid "WPA passphrase"
++msgstr "Парольна фраза WPA"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "ЗаÑтереженнÑ"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wi-Fi"
++
++msgid "Wireless"
++msgstr "Бездротові мережі"
++
++msgid "Wireless Adapter"
++msgstr "Бездротовий адаптер"
++
++msgid "Wireless Network"
++msgstr "Бездротова мережа"
++
++msgid "Wireless Overview"
++msgstr "ОглÑд бездротових мереж"
++
++msgid "Wireless Security"
++msgstr "Безпека бездротової мережі"
++
++msgid "Wireless is disabled or not associated"
++msgstr "Бездротову мережу вимкнено або не пов'Ñзано"
++
++msgid "Wireless is restarting..."
++msgstr "Бездротова мережа перезапуÑкаєтьÑÑ..."
++
++msgid "Wireless network is disabled"
++msgstr "Бездротова мережа вимкнена"
++
++msgid "Wireless network is enabled"
++msgstr "Бездротова мережа ввімкнена"
++
++msgid "Wireless restarted"
++msgstr "Бездротова мережа перезапущена"
++
++msgid "Wireless shut down"
++msgstr "Бездротова мережа припинила роботу"
++
++msgid "Write received DNS requests to syslog"
++msgstr "ЗапиÑувати отримані DNS-запити до ÑиÑтемного журналу"
++
++msgid "XR Support"
++msgstr "Підтримка XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Тут ви можете увімкнути або вимкнути інÑтальовані Ñкрипти ініціалізації. "
++"Зміни набудуть чинноÑÑ‚Ñ– піÑÐ»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ñтрою.<br /><strong>Увага: "
++"Якщо ви вимкнете оÑновний Ñкрипт ініціалізації (наприклад \"network\"), "
++"приÑтрій може Ñтати недоÑтупним!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++"Ви повинні увімкнути Java Script у вашому браузері, або LuCI не буде "
++"працювати належним чином."
++
++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 ""
++
++msgid "any"
++msgstr "будь-Ñкий"
++
++msgid "auto"
++msgstr "авто"
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "зв'Ñзано"
++
++msgid "create:"
++msgstr "Ñтворити:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "Створити міÑÑ‚ через вказаний інтерфейÑ(и)"
++
++msgid "dB"
++msgstr "дБ"
++
++msgid "dBm"
++msgstr "дБм"
++
++msgid "disable"
++msgstr "вимкнено"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "минув"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"Файл, де зберігаютьÑÑ Ð²Ð¸Ð´Ð°Ð½Ñ– <abbr title=\"Dynamic Host Configuration "
++"Protocol — протокол динамічної конфігурації вузла\">DHCP</abbr>-оренди"
++
++msgid "forward"
++msgstr "переÑлати"
++
++msgid "full-duplex"
++msgstr "повний дуплекÑ"
++
++msgid "half-duplex"
++msgstr "напівдуплекÑ"
++
++msgid "help"
++msgstr "довідка"
++
++msgid "hidden"
++msgstr "прихований"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "Ñкщо мета — мережа"
++
++msgid "input"
++msgstr "вхід"
++
++msgid "kB"
++msgstr "КБ"
++
++msgid "kB/s"
++msgstr "КБ/Ñ"
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "ні"
++
++msgid "no link"
++msgstr "нема з'єднаннÑ"
++
++msgid "none"
++msgstr "нема нічого"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "вимкнено"
++
++msgid "on"
++msgstr "увімкнено"
++
++msgid "open"
++msgstr "відкрита"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "ÑпрÑмовано"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "з позначкою"
++
++msgid "unknown"
++msgstr "невідомий"
++
++msgid "unlimited"
++msgstr "необмежений"
++
++msgid "unspecified"
++msgstr "не визначено"
++
++msgid "unspecified -or- create:"
++msgstr "не визначено -або- Ñтворити"
++
++msgid "untagged"
++msgstr "без позначки"
++
++msgid "yes"
++msgstr "так"
++
++msgid "« Back"
++msgstr "« Ðазад"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "Увімкнути ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ IPv6 Ð´Ð»Ñ PPP-з'єднань"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "Ігнорувати файли hosts"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Зачекайте. ПриÑтрій перезавантажуєтьÑÑ..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr ""
++#~ "Увага: Є незбережені зміни, Ñкі будуть втрачені при перезавантаженні!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "Завжди викориÑтовувати канали 40MHz, навіть Ñкщо вторинний канал "
++#~ "перекриваєтьÑÑ. ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— опції не відповідає Ñтандарту IEEE "
++#~ "802.11n-2009!"
++
++#~ msgid "Cached"
++#~ msgstr "Кешовано"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr "ÐаÑтроїти це монтуваннÑ, Ñк оверлейне Ñховище Ð´Ð»Ñ block-extroot"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "ПримуÑово режим 40MHz"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Frequency Hopping"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "Замкнено на канал %d, викориÑтовуваний %s"
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "ВикориÑтовувати Ñк кореневу файлову ÑиÑтему"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "Ідентифікатор кориÑтувача HE.net"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr ""
++#~ "Це 32-байтний шіÑтнадцÑтковий закодований ідентифікатор кориÑтувача, не "
++#~ "ім'Ñ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz (2-й канал вище)"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz (2-й канал нижче)"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "Отримувати Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "Оголошувати IPv6 у мережі"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "Оголошуваний ідентифікатор мережі"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "ДопуÑтимий діапазон — від 1 до 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "HT-можливоÑÑ‚Ñ–"
++
++#~ msgid "HT mode"
++#~ msgstr "HT-режим"
++
++#~ msgid "Router Model"
++#~ msgstr "Модель маршрутизатора"
++
++#~ msgid "Router Name"
++#~ msgstr "Ðазва (ім'Ñ) маршрутизатора"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "ÐадÑилати ÐºÐ»Ð¾Ð¿Ð¾Ñ‚Ð°Ð½Ð½Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr "Визначає Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð¾Ð³Ð¾ рекомендованого префікÑу в Ñекундах"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr "Визначає Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð¾Ð³Ð¾ чинного префікÑу в Ñекундах"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "ВикориÑтовувати Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "ВикориÑтовувати Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ Ñ‡Ð¸Ð½Ð½Ð¾Ð³Ð¾"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°..."
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "Увімкнути вбудований NTP-Ñервер"
++
++#~ msgid "Active Leases"
++#~ msgstr "Ðктивні оренди"
++
++#~ msgid "Open"
++#~ msgstr "Відкрити"
++
++#~ msgid "Bit Rate"
++#~ msgstr "ШвидкіÑÑ‚ÑŒ передачі даних"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ / ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ / Зміни"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ / СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MAC Address"
++#~ msgstr "MAC-адреÑа"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Зашифровано\">Зашифр.</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr ""
++#~ "<abbr title=\"Wireless Local Area Network — бездротова локальна мережа"
++#~ "\">WLAN</abbr>-ÑкануваннÑ"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "Оберіть мережу, Ñку ви хочете прикріпити до цього бездротового "
++#~ "інтерфейÑу. Виберіть <em>не визначено</em>, щоб не прикріплÑти ніÑкої "
++#~ "мережі, або заповніть поле <em>Ñтворити</em>, щоб визначити нову мережу."
++
++#~ msgid "Create Network"
++#~ msgstr "Створити мережу"
++
++#~ msgid "Link"
++#~ msgstr "З'єднаннÑ"
++
++#~ msgid "Networks"
++#~ msgstr "Мережі"
++
++#~ msgid "Power"
++#~ msgstr "ПотужніÑÑ‚ÑŒ"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Wi-Fi мережі у вашому оточенні"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "<abbr title=\"Classless Inter-Domain Routing — безклаÑова міждоменна "
++#~ "маршрутизаціÑ\">CIDR</abbr>-запиÑ: адреÑа/Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ "
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr ""
++#~ "<abbr title=\"Domain Name System — ÑиÑтема доменних імен\">DNS</abbr>-"
++#~ "Ñервер"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 4\">IPv4</abbr>-широкомовний"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 6\">IPv6</abbr>-адреÑа"
++
++#~ msgid "IP-Aliases"
++#~ msgstr "IP-пÑевдоніми"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "ÐаÑтройки IPv6"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "Примітка: Якщо ви тут оберете інтерфейÑ, Ñкий Ñ” чаÑтиною іншої мережі, "
++#~ "він буде переміщений до цієї мережі."
++
++#~ msgid ""
++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might "
++#~ "lose access to this router if you are connected via this interface."
++#~ msgstr ""
++#~ "ДійÑно видалити цей інтерфейÑ? СкаÑувати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾!\\nВи можете "
++#~ "втратити доÑтуп до цього маршрутизатора, Ñкщо ваш комп'ютер підключений "
++#~ "через цей інтерфейÑ."
++
++#~ msgid ""
++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou "
++#~ "might lose access to this router if you are connected via this network."
++#~ msgstr ""
++#~ "ДійÑно видалити цю бездротову мережу? СкаÑувати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾!\\nВи "
++#~ "можете втратити доÑтуп до цього маршрутизатора, Ñкщо ваш комп'ютер "
++#~ "підключений через цю мережу."
++
++#~ msgid ""
++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router "
++#~ "if you are connected via this interface."
++#~ msgstr ""
++#~ "ДійÑно вимкнути Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\"?\\nВи можете втратити доÑтуп до цього "
++#~ "маршрутизатора, Ñкщо ваш комп'ютер підключений через цей інтерфейÑ."
++
++#~ msgid ""
++#~ "Really shutdown network ?\\nYou might lose access to this router if you "
++#~ "are connected via this interface."
++#~ msgstr ""
++#~ "ДійÑно вимкнути мережу?\\nВи можете втратити доÑтуп до цього "
++#~ "маршрутизатора, Ñкщо ваш комп'ютер підключений через цей інтерфейÑ."
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 — "
++#~ "віртуальна локальна комп'ютерна мережа\">VLAN</abbr> чаÑто "
++#~ "викориÑтовуютьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ– на окремі Ñегменти. Зазвичай один "
++#~ "вихідний порт викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· більшою мережею, такою "
++#~ "наприклад, Ñк Інтернет, а інші порти — Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ñ— мережі."
++
++#~ msgid "Enable buffering"
++#~ msgstr "Увімкнути буферизацію"
++
++#~ msgid "IPv6-over-IPv4"
++#~ msgstr "IPv6 через IPv4"
+diff --git a/feeds/luci/modules/luci-base/po/vi/base.po b/feeds/luci/modules/luci-base/po/vi/base.po
+new file mode 100644
+index 0000000..a9b2ae1
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/vi/base.po
+@@ -0,0 +1,3952 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:59+0200\n"
++"PO-Revision-Date: 2009-08-14 12:23+0200\n"
++"Last-Translator: Hong Phuc Dang <dhppat@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr ""
++
++#, fuzzy
++msgid "(%s available)"
++msgstr "(%s available)"
++
++msgid "(empty)"
++msgstr ""
++
++msgid "(no interfaces attached)"
++msgstr ""
++
++msgid "-- Additional Field --"
++msgstr "---Mục bổ sung---"
++
++msgid "-- Please choose --"
++msgstr "--Hãy chá»n--"
++
++msgid "-- custom --"
++msgstr "--tùy chỉnh--"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr ""
++
++msgid "15 Minute Load:"
++msgstr ""
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr ""
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Dịch vụ căn bản đặt Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr ""
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr ""
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr ""
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Mở rộng dịch vụ đặt Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr ""
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> packet size"
++msgstr ""
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr ""
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr ""
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr ""
++
++msgid "AR Support"
++msgstr "Hỗ trợ AR"
++
++msgid "ARP retry threshold"
++msgstr ""
++
++msgid "ATM Bridges"
++msgstr ""
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr ""
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr ""
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++
++msgid "ATM device number"
++msgstr ""
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr ""
++
++msgid "Access Point"
++msgstr "Äiểm truy cập"
++
++msgid "Action"
++msgstr "Action"
++
++msgid "Actions"
++msgstr "Hành động"
++
++msgid "Activate this network"
++msgstr ""
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++
++msgid "Active Connections"
++msgstr "kết nối đang hoạt động"
++
++msgid "Active DHCP Leases"
++msgstr ""
++
++msgid "Active DHCPv6 Leases"
++msgstr ""
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "Thêm vào"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr ""
++
++msgid "Add new interface..."
++msgstr ""
++
++msgid "Additional Hosts files"
++msgstr ""
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr ""
++
++msgid "Address to access local relay bridge"
++msgstr ""
++
++msgid "Administration"
++msgstr "Quản trị"
++
++msgid "Advanced Settings"
++msgstr ""
++
++msgid "Alert"
++msgstr ""
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr "Cho phép <abbr title=\"Secure Shell\">SSH</abbr> xác thực mật mã"
++
++msgid "Allow all except listed"
++msgstr "Cho phép tất cả trừ danh sách liệt kê"
++
++msgid "Allow listed only"
++msgstr "Chỉ cho phép danh sách liệt kê"
++
++msgid "Allow localhost"
++msgstr ""
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr ""
++
++msgid "Allow root logins with password"
++msgstr ""
++
++msgid "Allow the <em>root</em> user to login with password"
++msgstr ""
++
++msgid ""
++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr ""
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr ""
++
++msgid "Antenna 2"
++msgstr ""
++
++msgid "Antenna Configuration"
++msgstr ""
++
++msgid "Any zone"
++msgstr ""
++
++msgid "Apply"
++msgstr "Ãp dụng"
++
++msgid "Applying changes"
++msgstr "Tiến hành thay đổi"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr ""
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr ""
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "Xác thực"
++
++msgid "Authoritative"
++msgstr "Authoritative"
++
++msgid "Authorization Required"
++msgstr "Yêu cầu ủy quyá»n"
++
++msgid "Auto Refresh"
++msgstr ""
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "Sẵn có"
++
++msgid "Available packages"
++msgstr ""
++
++msgid "Average:"
++msgstr ""
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Back"
++msgstr ""
++
++msgid "Back to Overview"
++msgstr ""
++
++msgid "Back to configuration"
++msgstr ""
++
++msgid "Back to overview"
++msgstr ""
++
++msgid "Back to scan results"
++msgstr ""
++
++msgid "Background Scan"
++msgstr "Background Scan"
++
++msgid "Backup / Flash Firmware"
++msgstr ""
++
++msgid "Backup / Restore"
++msgstr "Backup/ Restore"
++
++msgid "Backup file list"
++msgstr ""
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Bogus NX Domain Override"
++msgstr ""
++
++msgid "Bridge"
++msgstr ""
++
++msgid "Bridge interfaces"
++msgstr "Giao diện cầu nối"
++
++msgid "Bridge unit number"
++msgstr ""
++
++msgid "Bring up on boot"
++msgstr ""
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr ""
++
++msgid "Buffered"
++msgstr ""
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr ""
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr ""
++
++msgid "CPU usage (%)"
++msgstr "CPU usage (%)"
++
++msgid "Cancel"
++msgstr "Bá» qua"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "chuá»—i"
++
++msgid "Changes"
++msgstr "Thay đổi"
++
++msgid "Changes applied."
++msgstr "Thay đổi đã áp dụng"
++
++msgid "Changes the administrator password for accessing the device"
++msgstr ""
++
++msgid "Channel"
++msgstr "Kênh"
++
++msgid "Check"
++msgstr ""
++
++msgid "Checksum"
++msgstr "Checksum"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr "Giao diện này chưa thuộc vỠbất kỳ firewall zone nào."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++
++msgid "Cipher"
++msgstr ""
++
++msgid ""
++"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)."
++msgstr ""
++
++msgid "Client"
++msgstr "Client"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr ""
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr ""
++
++msgid "Close list..."
++msgstr ""
++
++msgid "Collecting data..."
++msgstr ""
++
++msgid "Command"
++msgstr "Lệnh"
++
++msgid "Common Configuration"
++msgstr ""
++
++msgid "Compression"
++msgstr "Sức nén"
++
++msgid "Configuration"
++msgstr "Cấu hình"
++
++msgid "Configuration applied."
++msgstr ""
++
++msgid "Configuration files will be kept."
++msgstr ""
++
++msgid "Confirmation"
++msgstr "Xác nhận"
++
++msgid "Connect"
++msgstr ""
++
++msgid "Connected"
++msgstr ""
++
++msgid "Connection Limit"
++msgstr "Giới hạn kết nối"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr ""
++
++msgid "Country"
++msgstr ""
++
++msgid "Country Code"
++msgstr "Mã quốc gia"
++
++msgid "Cover the following interface"
++msgstr ""
++
++msgid "Cover the following interfaces"
++msgstr ""
++
++msgid "Create / Assign firewall-zone"
++msgstr "Tạo/ gán firewall-zone"
++
++msgid "Create Interface"
++msgstr ""
++
++msgid "Create a bridge over multiple interfaces"
++msgstr ""
++
++msgid "Critical"
++msgstr ""
++
++msgid "Cron Log Level"
++msgstr ""
++
++msgid "Custom Interface"
++msgstr ""
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"Tùy chỉnh chế độ của thiết bị <abbr title=\"Light Emitting Diode\">LED</"
++"abbr>s nếu có thể."
++
++msgid "DHCP Leases"
++msgstr ""
++
++msgid "DHCP Server"
++msgstr ""
++
++msgid "DHCP and DNS"
++msgstr ""
++
++msgid "DHCP client"
++msgstr ""
++
++msgid "DHCP-Options"
++msgstr "Tùy chá»n DHCP"
++
++msgid "DHCPv6 Leases"
++msgstr ""
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr ""
++
++msgid "DNS forwardings"
++msgstr ""
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr ""
++
++msgid "Debug"
++msgstr ""
++
++msgid "Default %d"
++msgstr ""
++
++msgid "Default gateway"
++msgstr ""
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr ""
++
++msgid "Define a name for this network."
++msgstr ""
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++
++msgid "Delete"
++msgstr "Xóa"
++
++msgid "Delete this interface"
++msgstr ""
++
++msgid "Delete this network"
++msgstr ""
++
++msgid "Description"
++msgstr "Mô tả"
++
++msgid "Design"
++msgstr "Thiết kế"
++
++msgid "Destination"
++msgstr "Äiểm đến"
++
++msgid "Device"
++msgstr "Công cụ"
++
++msgid "Device Configuration"
++msgstr ""
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr ""
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr ""
++
++msgid "Disable"
++msgstr ""
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++
++msgid "Disable DNS setup"
++msgstr ""
++
++msgid "Disable HW-Beacon timer"
++msgstr "Vô hiệu hóa bộ chỉnh giỠHW-Beacon"
++
++msgid "Disabled"
++msgstr ""
++
++msgid "Discard upstream RFC1918 responses"
++msgstr ""
++
++msgid "Displaying only packages containing"
++msgstr ""
++
++msgid "Distance Optimization"
++msgstr "Khoảng cách tối ưu"
++
++msgid "Distance to farthest network member in meters."
++msgstr "Khoảng cách tới thành viên xa nhất trong mạng lưới tính bằng mét"
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "Tính đa dạng"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++"Dnsmasq là một phối hợp <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 ""
++
++msgid "Do not send probe responses"
++msgstr "Không gửi nhắc hồi đáp"
++
++msgid "Domain required"
++msgstr "Domain yêu cầu"
++
++msgid "Domain whitelist"
++msgstr ""
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"Don&amp;#39;t chuyển tiếp <abbr title=\"Hệ thống tên miá»n\">DNS</abbr>-Yêu "
++"cầu không cần <abbr title=\"Hệ thống tên miá»n\">DNS</abbr>-Tên"
++
++msgid "Download and install package"
++msgstr "Tải và cài đặt gói"
++
++msgid "Download backup"
++msgstr ""
++
++msgid "Dropbear Instance"
++msgstr ""
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear cung cấp <abbr title=\"Secure Shell\">SSH</abbr> mạng lưới shell "
++"truy cập và một <abbr title=\"Secure Copy\">SCP</abbr> server tích hợp"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr ""
++"Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++
++msgid "Dynamic tunnel"
++msgstr ""
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr ""
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "EAP-Method"
++
++msgid "Edit"
++msgstr "Chỉnh sửa"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr ""
++
++msgid "Edit this network"
++msgstr ""
++
++msgid "Emergency"
++msgstr ""
++
++msgid "Enable"
++msgstr ""
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "Kích hoạt <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr ""
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr ""
++
++msgid "Enable NTP client"
++msgstr ""
++
++msgid "Enable TFTP server"
++msgstr ""
++
++msgid "Enable VLAN functionality"
++msgstr ""
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr ""
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr ""
++
++msgid "Enable this swap"
++msgstr ""
++
++msgid "Enable/Disable"
++msgstr "Cho kích hoạt/ Vô hiệu hóa"
++
++msgid "Enabled"
++msgstr ""
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "Kích hoạt Spanning Tree Protocol trên cầu nối này"
++
++msgid "Encapsulation mode"
++msgstr ""
++
++msgid "Encryption"
++msgstr "Encryption"
++
++msgid "Erasing..."
++msgstr ""
++
++msgid "Error"
++msgstr "Lá»—i"
++
++msgid "Ethernet Adapter"
++msgstr "Bộ tương hợp ethernet"
++
++msgid "Ethernet Switch"
++msgstr "Bộ chuyển đảo ethernet"
++
++msgid "Expand hosts"
++msgstr ""
++
++msgid "Expires"
++msgstr ""
++
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr ""
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr ""
++
++msgid "External system log server port"
++msgstr ""
++
++msgid "Fast Frames"
++msgstr "Khung nhanh"
++
++msgid "File"
++msgstr ""
++
++msgid "Filename of the boot image advertised to clients"
++msgstr ""
++
++msgid "Filesystem"
++msgstr "Tập tin hệ thống"
++
++msgid "Filter"
++msgstr "Lá»c"
++
++msgid "Filter private"
++msgstr "Filter private"
++
++msgid "Filter useless"
++msgstr "Lá»c không hữu dụng"
++
++msgid "Find and join network"
++msgstr ""
++
++msgid "Find package"
++msgstr "Tìm gói"
++
++msgid "Finish"
++msgstr ""
++
++msgid "Firewall"
++msgstr "Firewall"
++
++msgid "Firewall Settings"
++msgstr ""
++
++msgid "Firewall Status"
++msgstr ""
++
++msgid "Firmware Version"
++msgstr ""
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr ""
++
++msgid "Flags"
++msgstr "Cá»"
++
++msgid "Flash Firmware"
++msgstr "Phần cứng flash"
++
++msgid "Flash image..."
++msgstr ""
++
++msgid "Flash new firmware image"
++msgstr ""
++
++msgid "Flash operations"
++msgstr ""
++
++msgid "Flashing..."
++msgstr ""
++
++msgid "Force"
++msgstr "Force"
++
++msgid "Force CCMP (AES)"
++msgstr ""
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr ""
++
++msgid "Force TKIP"
++msgstr ""
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr ""
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr ""
++
++msgid "Forward broadcast traffic"
++msgstr ""
++
++msgid "Forwarding mode"
++msgstr ""
++
++msgid "Fragmentation Threshold"
++msgstr "Ngưỡng cửa Phân đoạn"
++
++msgid "Frame Bursting"
++msgstr "Khung nổ"
++
++msgid "Free"
++msgstr ""
++
++msgid "Free space"
++msgstr ""
++
++msgid "GHz"
++msgstr ""
++
++msgid "GPRS only"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Gateway ports"
++msgstr ""
++
++msgid "General Settings"
++msgstr ""
++
++msgid "General Setup"
++msgstr ""
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr ""
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr ""
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr ""
++
++msgid "Go to relevant configuration page"
++msgstr "Äi tá»›i trang cấu hình thích hợp"
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr ""
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr ""
++
++msgid "Hang Up"
++msgstr "Hang Up"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr ""
++"Ở đây bạn có thể cấu hình những đặc tính cơ bản của thiết bị như tên máy chủ "
++"hoặc múi giá»."
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr ""
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "Giấu <abbr title=\"Chế độ mở rộng đặt Identifier\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "Host entries"
++
++msgid "Host expiry timeout"
++msgstr ""
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++
++msgid "Hostname"
++msgstr "Tên host"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr ""
++
++msgid "Hostnames"
++msgstr "Tên host"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "Äịa chỉ IP"
++
++msgid "IPv4"
++msgstr ""
++
++msgid "IPv4 Firewall"
++msgstr ""
++
++msgid "IPv4 WAN Status"
++msgstr ""
++
++msgid "IPv4 address"
++msgstr ""
++
++msgid "IPv4 and IPv6"
++msgstr ""
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr ""
++
++msgid "IPv4 gateway"
++msgstr ""
++
++msgid "IPv4 netmask"
++msgstr ""
++
++msgid "IPv4 only"
++msgstr ""
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr ""
++
++msgid "IPv4-Address"
++msgstr ""
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr ""
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr ""
++
++msgid "IPv6 address"
++msgstr ""
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr ""
++
++msgid "IPv6 only"
++msgstr ""
++
++msgid "IPv6 prefix"
++msgstr ""
++
++msgid "IPv6 prefix length"
++msgstr ""
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr ""
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr ""
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr ""
++
++msgid "Identity"
++msgstr "Nhận dạng"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr ""
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr ""
++
++msgid "If unchecked, no default route is configured"
++msgstr ""
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr ""
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr ""
++"Nếu bá»™ nhá»› vật lý không đủ dữ liệu không dùng có thể được swap tạm thá»i đến "
++"má»™t thiết bị swap để tạo ra nhiá»u khoảng trống hÆ¡n trong <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Hãy nhận biết rằng swapping dữ liệu là "
++"một quá trình rất chậm vì một thiết bị swap không thể được truy cập với "
++"datarates cao hơn của <abbr title=\"Random Access Memory\">RAM</abbr>."
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "Lá» Ä‘i <code>/etc/hosts</code>"
++
++msgid "Ignore interface"
++msgstr "LỠđi giao diện"
++
++msgid "Ignore resolve file"
++msgstr "LỠđi tập tin resolve"
++
++msgid "Image"
++msgstr ""
++
++msgid "In"
++msgstr "Trong"
++
++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 ""
++
++msgid "Inbound:"
++msgstr ""
++
++msgid "Info"
++msgstr ""
++
++msgid "Initscript"
++msgstr "Initscript"
++
++msgid "Initscripts"
++msgstr "Initscripts"
++
++msgid "Install"
++msgstr "Cài đặt "
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr ""
++
++msgid "Install protocol extensions..."
++msgstr ""
++
++msgid "Installed packages"
++msgstr ""
++
++msgid "Interface"
++msgstr "Giao diện "
++
++msgid "Interface Configuration"
++msgstr ""
++
++msgid "Interface Overview"
++msgstr ""
++
++msgid "Interface is reconnecting..."
++msgstr ""
++
++msgid "Interface is shutting down..."
++msgstr ""
++
++msgid "Interface not present or not connected yet."
++msgstr ""
++
++msgid "Interface reconnected"
++msgstr ""
++
++msgid "Interface shut down"
++msgstr ""
++
++msgid "Interfaces"
++msgstr "Giao diện "
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr ""
++
++msgid "Invalid"
++msgstr "Giá trị nhập vào không hợp lí"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr ""
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr ""
++
++msgid "Invalid username and/or password! Please try again."
++msgstr "Tên và mật mã không đúng. Xin thử lại "
++
++#, 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 ""
++"DÆ°á»ng nhÆ° bạn cố gắng flash má»™t hình ảnh không phù hợp vá»›i bá»™ nhá»› flash, xin "
++"vui lòng xác minh các tập tin hình ảnh!"
++
++msgid "Java Script required!"
++msgstr ""
++
++msgid "Join Network"
++msgstr ""
++
++msgid "Join Network: Settings"
++msgstr ""
++
++msgid "Join Network: Wireless Scan"
++msgstr ""
++
++msgid "Keep settings"
++msgstr ""
++
++msgid "Kernel Log"
++msgstr "Kernel Log"
++
++msgid "Kernel Version"
++msgstr ""
++
++msgid "Key"
++msgstr "Phím "
++
++msgid "Key #%d"
++msgstr ""
++
++msgid "Kill"
++msgstr "Kill"
++
++msgid "L2TP"
++msgstr ""
++
++msgid "L2TP Server"
++msgstr ""
++
++msgid "LCP echo failure threshold"
++msgstr ""
++
++msgid "LCP echo interval"
++msgstr ""
++
++msgid "LLC"
++msgstr ""
++
++msgid "Label"
++msgstr ""
++
++msgid "Language"
++msgstr "Ngôn ngữ"
++
++msgid "Language and Style"
++msgstr ""
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr ""
++
++msgid "Leasefile"
++msgstr "Leasefile"
++
++msgid "Leasetime"
++msgstr "Leasetime"
++
++msgid "Leasetime remaining"
++msgstr "Leasetime còn lại"
++
++msgid "Leave empty to autodetect"
++msgstr ""
++
++msgid "Leave empty to use the current WAN address"
++msgstr ""
++
++msgid "Legend:"
++msgstr ""
++
++msgid "Limit"
++msgstr "Giới hạn "
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "Link On"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr ""
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr ""
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr ""
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr ""
++
++msgid "Listening port for inbound DNS queries"
++msgstr ""
++
++msgid "Load"
++msgstr "Tải "
++
++msgid "Load Average"
++msgstr ""
++
++msgid "Loading"
++msgstr ""
++
++msgid "Local IPv4 address"
++msgstr ""
++
++msgid "Local IPv6 address"
++msgstr ""
++
++msgid "Local Startup"
++msgstr ""
++
++msgid "Local Time"
++msgstr "GiỠđịa phương"
++
++msgid "Local domain"
++msgstr ""
++
++msgid ""
++"Local domain specification. Names matching this domain are never forwarded "
++"and are resolved from DHCP or hosts files only"
++msgstr ""
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr ""
++
++msgid "Local server"
++msgstr ""
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr ""
++
++msgid "Localise queries"
++msgstr "Tra vấn địa phương"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr ""
++
++msgid "Log queries"
++msgstr "Bản ghi tra vấn"
++
++msgid "Logging"
++msgstr ""
++
++msgid "Login"
++msgstr "Äăng nhập "
++
++msgid "Logout"
++msgstr "Thoát ra"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr ""
++
++msgid "MAC-Address"
++msgstr ""
++
++msgid "MAC-Address Filter"
++msgstr "Lá»c địa chỉ MAC"
++
++msgid "MAC-Filter"
++msgstr "Lá»c MAC"
++
++msgid "MAC-List"
++msgstr "Danh sách MAC"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr ""
++
++msgid "MHz"
++msgstr ""
++
++msgid "MTU"
++msgstr ""
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "Mức cao nhất"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr ""
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr ""
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr ""
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr ""
++
++msgid "Maximum hold time"
++msgstr "Mức cao nhất"
++
++msgid "Maximum number of leased addresses."
++msgstr ""
++
++msgid "Mbit/s"
++msgstr ""
++
++msgid "Memory"
++msgstr "Bá»™ nhá»›"
++
++msgid "Memory usage (%)"
++msgstr "Memory usage (%)"
++
++msgid "Metric"
++msgstr "Metric"
++
++msgid "Minimum Rate"
++msgstr "Mức thấp nhất"
++
++msgid "Minimum hold time"
++msgstr "Mức thấp nhất"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr ""
++
++msgid "Mode"
++msgstr "Chế độ"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "Thiết bị modem"
++
++msgid "Modem init timeout"
++msgstr ""
++
++msgid "Monitor"
++msgstr "Monitor"
++
++msgid "Mount Entry"
++msgstr ""
++
++msgid "Mount Point"
++msgstr "Lắp điểm"
++
++msgid "Mount Points"
++msgstr "Lắp điểm"
++
++msgid "Mount Points - Mount Entry"
++msgstr ""
++
++msgid "Mount Points - Swap Entry"
++msgstr ""
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr ""
++"Số điểm lắp xác định tại một điểm mà ở đó bộ nhớ sẽ được gắn vào hệ thống "
++"tập tin"
++
++msgid "Mount options"
++msgstr ""
++
++msgid "Mount point"
++msgstr ""
++
++msgid "Mounted file systems"
++msgstr "Lắp tập tin hệ thống"
++
++msgid "Move down"
++msgstr ""
++
++msgid "Move up"
++msgstr ""
++
++msgid "Multicast Rate"
++msgstr "Multicast Rate"
++
++msgid "Multicast address"
++msgstr ""
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr ""
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "Tên"
++
++msgid "Name of the new interface"
++msgstr ""
++
++msgid "Name of the new network"
++msgstr ""
++
++msgid "Navigation"
++msgstr "Sá»± Ä‘iá»u hÆ°á»›ng"
++
++msgid "Netmask"
++msgstr ""
++
++msgid "Network"
++msgstr "mạng lưới "
++
++msgid "Network Utilities"
++msgstr ""
++
++msgid "Network boot image"
++msgstr ""
++
++msgid "Network without interfaces."
++msgstr ""
++
++msgid "Next »"
++msgstr ""
++
++msgid "No DHCP Server configured for this interface"
++msgstr ""
++
++msgid "No chains in this table"
++msgstr "Không có chuỗi trong bảng này"
++
++msgid "No files found"
++msgstr ""
++
++msgid "No information available"
++msgstr ""
++
++msgid "No negative cache"
++msgstr ""
++
++msgid "No network configured on this device"
++msgstr ""
++
++msgid "No network name specified"
++msgstr ""
++
++msgid "No package lists available"
++msgstr ""
++
++msgid "No password set!"
++msgstr ""
++
++msgid "No rules in this chain"
++msgstr "Không có quy luật trong chuỗi này"
++
++msgid "No zone assigned"
++msgstr ""
++
++msgid "Noise"
++msgstr ""
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr ""
++
++msgid "None"
++msgstr ""
++
++msgid "Normal"
++msgstr ""
++
++msgid "Not Found"
++msgstr ""
++
++msgid "Not associated"
++msgstr ""
++
++msgid "Not connected"
++msgstr ""
++
++msgid "Note: Configuration files will be erased."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "Nslookup"
++msgstr ""
++
++msgid "OK"
++msgstr "OK "
++
++msgid "OPKG-Configuration"
++msgstr "Cấu hình OPKG-"
++
++msgid "Off-State Delay"
++msgstr ""
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"Trên trang này bạn có thể định cấu hình giao diện network. Bạn có thể bắt "
++"cầu nhiá»u giao diện bằng cách đánh dấu &amp;quot;bridge interfaces&amp;quot; "
++"field và nhập tên vào của nhiá»u giao diện network phân tách bởi những khoảng "
++"trống. Bạn có thể cũng dùng <abbr title=\"Virtual Local Area Network\">VLAN</"
++"abbr> notation <samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e."
++"g.</abbr>: <samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr ""
++
++msgid "One of hostname or mac address must be specified!"
++msgstr ""
++
++msgid "One or more fields contain invalid values!"
++msgstr ""
++
++msgid "One or more required fields have no value!"
++msgstr ""
++
++msgid "Open list..."
++msgstr ""
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr ""
++
++msgid "Option removed"
++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 "Options"
++msgstr "Lá»±a chá»n "
++
++msgid "Other:"
++msgstr ""
++
++msgid "Out"
++msgstr "Ra khá»i"
++
++msgid "Outbound:"
++msgstr ""
++
++msgid "Outdoor Channels"
++msgstr "Kênh ngoại mạng"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr ""
++
++msgid "Override MTU"
++msgstr ""
++
++msgid "Override the gateway in DHCP responses"
++msgstr ""
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr ""
++
++msgid "Override the table used for internal routes"
++msgstr ""
++
++msgid "Overview"
++msgstr "Nhìn chung"
++
++msgid "Owner"
++msgstr "Owner"
++
++msgid "PAP/CHAP password"
++msgstr ""
++
++msgid "PAP/CHAP username"
++msgstr ""
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr ""
++
++msgid "PPP"
++msgstr ""
++
++msgid "PPPoA Encapsulation"
++msgstr "PPPoA Encapsulation"
++
++msgid "PPPoATM"
++msgstr ""
++
++msgid "PPPoE"
++msgstr ""
++
++msgid "PPtP"
++msgstr ""
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Package lists are older than 24 hours"
++msgstr ""
++
++msgid "Package name"
++msgstr "Tên gói"
++
++msgid "Packets"
++msgstr "Gói tin"
++
++msgid "Part of zone %q"
++msgstr ""
++
++msgid "Password"
++msgstr "Mật mã"
++
++msgid "Password authentication"
++msgstr "Xác thực mật mã"
++
++msgid "Password of Private Key"
++msgstr "Mật mã của private key"
++
++msgid "Password successfully changed!"
++msgstr ""
++
++msgid "Path to CA-Certificate"
++msgstr "ÄÆ°á»ng dẫn tá»›i CA-Certificate"
++
++msgid "Path to Client-Certificate"
++msgstr ""
++
++msgid "Path to Private Key"
++msgstr "ÄÆ°á»ng dẫn tá»›i private key"
++
++msgid "Path to executable which handles the button event"
++msgstr ""
++
++msgid "Peak:"
++msgstr ""
++
++msgid "Perform reboot"
++msgstr "Tiến hành reboot"
++
++msgid "Perform reset"
++msgstr ""
++
++msgid "Phy Rate:"
++msgstr ""
++
++msgid "Physical Settings"
++msgstr "Cài đặt căn bản"
++
++msgid "Ping"
++msgstr ""
++
++msgid "Pkts."
++msgstr ""
++
++msgid "Please enter your username and password."
++msgstr "Nhập tên và mật mã"
++
++msgid "Policy"
++msgstr "Chính sách"
++
++msgid "Port"
++msgstr "Cá»­a "
++
++msgid "Port %d"
++msgstr ""
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr ""
++
++msgid "Port status:"
++msgstr ""
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr ""
++
++msgid "Prevents client-to-client communication"
++msgstr "Ngăn chặn giao tiếp giữa client-và-client"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr ""
++
++msgid "Proceed"
++msgstr "Proceed"
++
++msgid "Processes"
++msgstr "Processes"
++
++msgid "Prot."
++msgstr "Prot."
++
++msgid "Protocol"
++msgstr "Protocol"
++
++msgid "Protocol family"
++msgstr ""
++
++msgid "Protocol of the new interface"
++msgstr ""
++
++msgid "Protocol support is not installed"
++msgstr ""
++
++msgid "Provide NTP server"
++msgstr ""
++
++msgid "Provide new network"
++msgstr ""
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "Pseudo Ad-Hoc (ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr ""
++
++msgid "RTS/CTS Threshold"
++msgstr "RTS/CTS Threshold"
++
++msgid "RX"
++msgstr "RX"
++
++msgid "RX Rate"
++msgstr ""
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr ""
++
++msgid "Radius-Accounting-Port"
++msgstr ""
++
++msgid "Radius-Accounting-Secret"
++msgstr ""
++
++msgid "Radius-Accounting-Server"
++msgstr ""
++
++msgid "Radius-Authentication-Port"
++msgstr ""
++
++msgid "Radius-Authentication-Secret"
++msgstr ""
++
++msgid "Radius-Authentication-Server"
++msgstr ""
++
++msgid ""
++"Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host "
++"Configuration Protocol\">DHCP</abbr>-Server"
++msgstr ""
++"Äá»c <code>/etc/ethers</code> để định cấu hình <abbr title=\"Dynamic Host "
++"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."
++msgstr ""
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++
++msgid "Really reset all changes?"
++msgstr ""
++
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++
++msgid "Really switch protocol?"
++msgstr ""
++
++msgid "Realtime Connections"
++msgstr ""
++
++msgid "Realtime Graphs"
++msgstr ""
++
++msgid "Realtime Load"
++msgstr ""
++
++msgid "Realtime Traffic"
++msgstr ""
++
++msgid "Realtime Wireless"
++msgstr ""
++
++msgid "Rebind protection"
++msgstr ""
++
++msgid "Reboot"
++msgstr "Reboot"
++
++msgid "Rebooting..."
++msgstr ""
++
++msgid "Reboots the operating system of your device"
++msgstr "Reboots hệ Ä‘iá»u hành của công cụ"
++
++msgid "Receive"
++msgstr "Receive"
++
++msgid "Receiver Antenna"
++msgstr "Máy thu Antenna"
++
++msgid "Reconnect this interface"
++msgstr ""
++
++msgid "Reconnecting interface"
++msgstr ""
++
++msgid "References"
++msgstr "Tham chiếu"
++
++msgid "Regulatory Domain"
++msgstr "Miá»n Ä‘iá»u chỉnh"
++
++msgid "Relay"
++msgstr ""
++
++msgid "Relay Bridge"
++msgstr ""
++
++msgid "Relay between networks"
++msgstr ""
++
++msgid "Relay bridge"
++msgstr ""
++
++msgid "Remote IPv4 address"
++msgstr ""
++
++msgid "Remove"
++msgstr "Loại bá»"
++
++msgid "Repeat scan"
++msgstr ""
++
++msgid "Replace entry"
++msgstr "thay đổi nội dung"
++
++msgid "Replace wireless configuration"
++msgstr ""
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr ""
++
++msgid "Reset"
++msgstr "Reset"
++
++msgid "Reset Counters"
++msgstr "Reset bộ đếm"
++
++msgid "Reset to defaults"
++msgstr ""
++
++msgid "Resolv and Hosts Files"
++msgstr ""
++
++msgid "Resolve file"
++msgstr ""
++
++msgid "Restart"
++msgstr ""
++
++msgid "Restart Firewall"
++msgstr "Khởi động lại Firewall"
++
++msgid "Restore backup"
++msgstr "Phục hồi backup"
++
++msgid "Reveal/hide password"
++msgstr ""
++
++msgid "Revert"
++msgstr "Revert"
++
++msgid "Root"
++msgstr ""
++
++msgid "Root directory for files served via TFTP"
++msgstr ""
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr ""
++
++msgid "Routes"
++msgstr "Routes"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr ""
++"Routes chỉ định trên giao diện và cổng một host nhất định hay network được "
++"tiếp cận."
++
++msgid "Rule #"
++msgstr ""
++
++msgid "Run a filesystem check before mounting the device"
++msgstr ""
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr ""
++
++msgid "SSH-Keys"
++msgstr ""
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "LÆ°u"
++
++msgid "Save & Apply"
++msgstr "Lưu & áp dụng "
++
++msgid "Save &#38; Apply"
++msgstr ""
++
++msgid "Scan"
++msgstr "Scan"
++
++msgid "Scheduled Tasks"
++msgstr "Scheduled Tasks"
++
++msgid "Section added"
++msgstr ""
++
++msgid "Section removed"
++msgstr ""
++
++msgid "See \"mount\" manpage for details"
++msgstr ""
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr ""
++
++msgid "Separate Clients"
++msgstr "Cô lập đối tượng"
++
++msgid "Separate WDS"
++msgstr "Phân tách WDS"
++
++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 ""
++
++msgid "Service Type"
++msgstr ""
++
++msgid "Services"
++msgstr "Dịch vụ "
++
++msgid "Set up Time Synchronization"
++msgstr ""
++
++msgid "Setup DHCP Server"
++msgstr ""
++
++msgid "Show current backup file list"
++msgstr ""
++
++msgid "Shutdown this interface"
++msgstr ""
++
++msgid "Shutdown this network"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Signal:"
++msgstr ""
++
++msgid "Size"
++msgstr "Dung lượng "
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr ""
++
++msgid "Skip to content"
++msgstr "Nhảy tới nội dung"
++
++msgid "Skip to navigation"
++msgstr "Chuyển đến mục định hướng"
++
++msgid "Slot time"
++msgstr ""
++
++msgid "Software"
++msgstr "Phần má»m"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr ""
++
++msgid "Sorry, the object you requested was not found."
++msgstr ""
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr ""
++
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++
++msgid "Sort"
++msgstr ""
++
++msgid "Source"
++msgstr "Nguồn"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr ""
++
++msgid "Specifies the directory the device is attached to"
++msgstr ""
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr ""
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr ""
++
++msgid "Specify the secret encryption key here."
++msgstr ""
++
++msgid "Start"
++msgstr "Bắt đầu "
++
++msgid "Start priority"
++msgstr "Bắt đầu ưu tiên"
++
++msgid "Startup"
++msgstr ""
++
++msgid "Static IPv4 Routes"
++msgstr "Static IPv4 Routes"
++
++msgid "Static IPv6 Routes"
++msgstr "Static IPv6 Routes"
++
++msgid "Static Leases"
++msgstr "Thống kê leases"
++
++msgid "Static Routes"
++msgstr "Static Routes"
++
++msgid "Static WDS"
++msgstr ""
++
++msgid "Static address"
++msgstr ""
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++
++msgid "Status"
++msgstr "Tình trạng"
++
++msgid "Stop"
++msgstr ""
++
++msgid "Strict order"
++msgstr "Yêu cầu nghiêm ngặt"
++
++msgid "Submit"
++msgstr "Trình "
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr ""
++
++msgid "Switch"
++msgstr "chuyển đổi"
++
++msgid "Switch %q"
++msgstr ""
++
++msgid "Switch %q (%s)"
++msgstr ""
++
++msgid "Switch protocol"
++msgstr ""
++
++msgid "Sync with browser"
++msgstr ""
++
++msgid "Synchronizing..."
++msgstr ""
++
++msgid "System"
++msgstr "Hệ thống"
++
++msgid "System Log"
++msgstr "System Log"
++
++msgid "System Properties"
++msgstr ""
++
++msgid "System log buffer size"
++msgstr ""
++
++msgid "TCP:"
++msgstr ""
++
++msgid "TFTP Settings"
++msgstr ""
++
++msgid "TFTP server root"
++msgstr ""
++
++msgid "TX"
++msgstr "TX"
++
++msgid "TX Rate"
++msgstr ""
++
++msgid "Table"
++msgstr "Bảng"
++
++msgid "Target"
++msgstr "Äích"
++
++msgid "Terminate"
++msgstr "Terminate"
++
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr ""
++
++msgid ""
++"The allowed characters are: <code>A-Z</code>, <code>a-z</code>, <code>0-9</"
++"code> and <code>_</code>"
++msgstr ""
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"Tập tin công cụ của bộ nhớ hoặc phân vùng (<abbr title=\"Ví dụ\">e.g.</abbr> "
++"<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 ""
++"Filesystem mà được dùng để format memory (<abbr title=\"for example\">e.g.</"
++"abbr> <samp><abbr title=\"Third Extended Filesystem\">ext3</abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"compare them with the original file to ensure data integrity.<br /> Click "
++"\"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ũ. "
++
++msgid "The following rules are currently active on this system."
++msgstr ""
++
++msgid "The given network name is not unique"
++msgstr ""
++
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr ""
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr ""
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr ""
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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 ""
++
++msgid "The selected protocol needs a device assigned"
++msgstr ""
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr ""
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++msgstr ""
++"Hệ thống bây giỠđang flashing.<br /> DO NOT POWER OFF THE DEVICE!<br /> ChỠ"
++"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."
++msgstr ""
++"Tập tin đang tải hình ảnh không bao gồm một hổ trợ format. Bảo đảm rằng bạn "
++"chá»n má»™t image format tổng quát cho platform."
++
++msgid "There are no active leases."
++msgstr ""
++
++msgid "There are no pending changes to apply!"
++msgstr ""
++
++msgid "There are no pending changes to revert!"
++msgstr ""
++
++msgid "There are no pending changes!"
++msgstr ""
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr ""
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr ""
++
++msgid "This IPv4 address of the relay"
++msgstr ""
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr ""
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"Äây là <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> duy "
++"nhất trong mạng địa phương. "
++
++msgid "This is the plain username for logging into the account"
++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 "Äây là system crontab mà scheduled tasks có thể bị định nghÄ©a."
++
++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 ""
++"List này đưa ra một tầm nhìn tổng quát vỠxử lý hệ thống đang chạy và tình "
++"trạng của chúng."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr ""
++
++msgid "This page gives an overview over currently active network connections."
++msgstr ""
++"Trang này cung cấp một tổng quan vỠđang hoạt động kết nối mạng hiện tại."
++
++msgid "This section contains no values yet"
++msgstr "Phần này chưa có giá trị nào"
++
++msgid "Time Synchronization"
++msgstr ""
++
++msgid "Time Synchronization is not configured yet."
++msgstr ""
++
++msgid "Timezone"
++msgstr "Múi giỠ"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr ""
++
++msgid "Total Available"
++msgstr ""
++
++msgid "Traceroute"
++msgstr ""
++
++msgid "Traffic"
++msgstr ""
++
++msgid "Transfer"
++msgstr "Chuyển giao"
++
++msgid "Transmission Rate"
++msgstr "Truyá»n tải rate"
++
++msgid "Transmit"
++msgstr "Transmit"
++
++msgid "Transmit Power"
++msgstr "Truyá»n tải năng lượng"
++
++msgid "Transmitter Antenna"
++msgstr "Máy phát Antenna"
++
++msgid "Trigger"
++msgstr ""
++
++msgid "Trigger Mode"
++msgstr ""
++
++msgid "Tunnel ID"
++msgstr ""
++
++msgid "Tunnel Interface"
++msgstr ""
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "Turbo Mode"
++
++msgid "Tx-Power"
++msgstr ""
++
++msgid "Type"
++msgstr "Loại "
++
++msgid "UDP:"
++msgstr ""
++
++msgid "UMTS only"
++msgstr ""
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr ""
++
++msgid "USB Device"
++msgstr ""
++
++msgid "UUID"
++msgstr ""
++
++msgid "Unable to dispatch"
++msgstr ""
++
++msgid "Unknown"
++msgstr ""
++
++msgid "Unknown Error, password not changed!"
++msgstr ""
++
++msgid "Unmanaged"
++msgstr ""
++
++msgid "Unsaved Changes"
++msgstr "Thay đổi không lưu"
++
++msgid "Unsupported protocol type."
++msgstr ""
++
++msgid "Update lists"
++msgstr ""
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++
++msgid "Upload archive..."
++msgstr ""
++
++msgid "Uploaded File"
++msgstr "Tập tin đã tải lên"
++
++msgid "Uptime"
++msgstr "Uptime"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "Dùng <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr ""
++
++msgid "Use DNS servers advertised by peer"
++msgstr ""
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr ""
++
++msgid "Use MTU on tunnel interface"
++msgstr ""
++
++msgid "Use TTL on tunnel interface"
++msgstr ""
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr ""
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr ""
++
++msgid "Use default gateway"
++msgstr ""
++
++msgid "Use gateway metric"
++msgstr ""
++
++msgid "Use routing table"
++msgstr ""
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++
++msgid "Used"
++msgstr "Äã sá»­ dụng"
++
++msgid "Used Key Slot"
++msgstr ""
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "Tên ngÆ°á»i dùng "
++
++msgid "VC-Mux"
++msgstr ""
++
++msgid "VLAN Interface"
++msgstr ""
++
++msgid "VLANs on %q"
++msgstr ""
++
++msgid "VLANs on %q (%s)"
++msgstr ""
++
++msgid "VPN Server"
++msgstr ""
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr ""
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr ""
++
++msgid "Version"
++msgstr "Phiên bản"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr ""
++
++msgid "WEP Shared Key"
++msgstr ""
++
++msgid "WEP passphrase"
++msgstr ""
++
++msgid "WMM Mode"
++msgstr "WMM Mode"
++
++msgid "WPA passphrase"
++msgstr ""
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr ""
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "Wifi"
++
++msgid "Wireless"
++msgstr ""
++
++msgid "Wireless Adapter"
++msgstr "Bộ tương hợp không dây"
++
++msgid "Wireless Network"
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Wireless Security"
++msgstr ""
++
++msgid "Wireless is disabled or not associated"
++msgstr ""
++
++msgid "Wireless is restarting..."
++msgstr ""
++
++msgid "Wireless network is disabled"
++msgstr ""
++
++msgid "Wireless network is enabled"
++msgstr ""
++
++msgid "Wireless restarted"
++msgstr ""
++
++msgid "Wireless shut down"
++msgstr ""
++
++msgid "Write received DNS requests to syslog"
++msgstr ""
++
++msgid "XR Support"
++msgstr "Hỗ trợ XR"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"Bạn có thể bật hoặc tắt cài đặt init script tại đây. Thay đổi này sẽ được áp "
++"dụng sau khi một thiết bị khởi động lại.<br /><strong>Cảnh báo: Nếu bạn vô "
++"hiệu hoá init script thiết yếu như &amp;quot;network&amp;quot;, công cụ của "
++"bạn chó thể trở nên không truy cập được</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr ""
++
++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 ""
++
++msgid "any"
++msgstr ""
++
++msgid "auto"
++msgstr "tá»± Ä‘á»™ng"
++
++#, fuzzy
++msgid "automatic"
++msgstr "thống kê"
++
++msgid "baseT"
++msgstr ""
++
++msgid "bridged"
++msgstr ""
++
++msgid "create:"
++msgstr ""
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "tạo một cầu nối trên một giao diện được chỉ định"
++
++msgid "dB"
++msgstr ""
++
++msgid "dBm"
++msgstr ""
++
++msgid "disable"
++msgstr "Vô hiệu hóa"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr ""
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"Tập tin được cho <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases sẽ được lưu trữ"
++
++msgid "forward"
++msgstr ""
++
++msgid "full-duplex"
++msgstr ""
++
++msgid "half-duplex"
++msgstr ""
++
++msgid "help"
++msgstr ""
++
++msgid "hidden"
++msgstr ""
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "Nếu mục tiêu là một network"
++
++msgid "input"
++msgstr ""
++
++msgid "kB"
++msgstr ""
++
++msgid "kB/s"
++msgstr ""
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr ""
++
++msgid "no link"
++msgstr ""
++
++msgid "none"
++msgstr "không "
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr ""
++
++msgid "on"
++msgstr ""
++
++msgid "open"
++msgstr ""
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr ""
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr ""
++
++msgid "unknown"
++msgstr ""
++
++msgid "unlimited"
++msgstr ""
++
++msgid "unspecified"
++msgstr ""
++
++msgid "unspecified -or- create:"
++msgstr ""
++
++msgid "untagged"
++msgstr ""
++
++msgid "yes"
++msgstr ""
++
++msgid "« Back"
++msgstr ""
++
++#~ msgid "Path"
++#~ msgstr "ÄÆ°á»ng dẫn"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "Xin chá»: Công cụ Ä‘ang reboot"
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr "Cảnh báo: Các thay đổi chưa lưu sẽ bị mất trong khi khởi động lại!"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "Tần số Hopping"
++
++#~ msgid "Active Leases"
++#~ msgstr "Leases hoạt động"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Mã hóa\">Encr.</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "<abbr title=\"Mạng lưới không dây địa phương\">WLAN</abbr>-Scan"
++
++#~ msgid "Create Network"
++#~ msgstr "Tạo network"
++
++#~ msgid "Link"
++#~ msgstr "Link"
++
++#~ msgid "Networks"
++#~ msgstr "mạng lưới"
++
++#~ msgid "Power"
++#~ msgstr "Power"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "Mạng lÆ°á»›i wifi ở môi trÆ°á»ng xung quanh bạn"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "<abbr title=\"Hệ thông tên miá»n\">DNS</abbr>-Máy chủ"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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 ""
++#~ "Cổng network trên bá»™ định tuyến có thể phối hợp vá»›i nhiá»u <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s làm máy tính tự giao tiếp "
++#~ "trực tiếp với nhau. <abbr title=\"Virtual Local Area Network\">VLAN</"
++#~ "abbr>s thÆ°á»ng được dùng để phân tách những phân Ä‘oạn network khác nhau. "
++#~ "Thông thÆ°á»ng có má»™t cổng Uplink mặc định cho má»™t kết nối vào mạng lá»›n hÆ¡n "
++#~ "như Internet và các cổng khác cho một mạng lưới địa phương."
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "Tập tin được lÆ°u giữ khi truyá»n tá»›i má»™t phần cứng má»›i"
++
++#~ msgid "General"
++#~ msgstr "Tổng quát"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Ở đây bạn có thể tùy chỉnh các cài đặt và các chức năng của <abbr title="
++#~ "\"Cấu hình giao diện Lua\">LuCI</abbr>."
++
++#~ msgid "Post-commit actions"
++#~ msgstr "Äăng _ cam kết hành Ä‘á»™ng"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "Những lệnh này sẽ được thực hiện tự động khi một <abbr title=\"Cấu hình "
++#~ "giao diện thống nhất \">UCI</abbr> được cam kết cho phép các thay đổi "
++#~ "được áp dụng ngay lập tức. "
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Web <abbr title=\"User Interface\">UI</abbr>"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "Äiểm truy cập (APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "Tùy chá»n pppd bổ sung"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "Tự động ngừng kết nối"
++
++#~ msgid "Backup Archive"
++#~ msgstr "Backup Archive"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr ""
++#~ "Äịnh cấu hình DNS server địa phÆ°Æ¡ng để dùng tên servers adverticed bởi "
++#~ "PPP peer"
++
++#~ msgid "Connect script"
++#~ msgstr "Kết nối script"
++
++#~ msgid "Create backup"
++#~ msgstr "Tạo backup"
++
++#~ msgid "Disconnect script"
++#~ msgstr "Ngừng script"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "Chỉnh sửa danh sách gói và mục tiêu cài đặt"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "Kích hoạt IPv6 on PPP link"
++
++#~ msgid "Firmware image"
++#~ msgstr "HÌnh ảnh firmware"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr ""
++#~ "Ở đây bạn có thể backup và khôi phục lại cấu hình bộ định tuyến và- nếu "
++#~ "có thể - reset bộ định tuyến ở cài đặt mặc định."
++
++#~ msgid "Installation targets"
++#~ msgstr "Mục tiêu cài đặt"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "Giữ tập tin cấu hình"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "Giữ-alive"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr ""
++#~ "Äể pppd thay thế route mặc định hiện tại để dùng giao diện PPP sau khi "
++#~ "kết nối thành công"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr "Äể pppd chạy script này sau khi thành lập PPP link"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "Äể pppd chạy trên script trÆ°á»›c khi phá vỡ PPP link"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr ""
++#~ "Bảo đảm rằng bạn cung cấp pin code chính xác ở đây hoặc sim card của bạn "
++#~ "sẽ bị khóa"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "Äa số các mạng server mà cung cấp má»™t service nhất định cho công cụ của "
++#~ "bạn hoặc mạng như shell access, phục vụ các trang web như <abbr title="
++#~ "\"Giao diện cấu hình Lua\">LuCI</abbr>, làm lưới định tuyến, gửi e-"
++#~ "mail, ..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr "Kiểm tra số lượng kết nối không thành công để tự động kết nối lại. "
++
++#~ msgid "PIN code"
++#~ msgstr "PIN code"
++
++#~ msgid "PPP Settings"
++#~ msgstr "Cài đặt "
++
++#~ msgid "Package lists"
++#~ msgstr "Danh sách đóng gói"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr "Tiến trình này sẽ chuyển má»i thiết lập vá» firmware mặc định"
++
++#~ msgid "Processor"
++#~ msgstr "Bộ xử lý"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Radius-Port"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Radius-Server"
++
++#~ msgid "Replace default route"
++#~ msgstr "Thay thế route mặc định"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "Äặt lại bá»™ định tuyến ở chế Ä‘á»™ mặc định"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr "Giây để chỠcho modem trở nên sẵn sàng trước khi kết nối"
++
++#~ msgid "Service type"
++#~ msgstr "Service type"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr ""
++#~ "Services và daemons tiến hành nhưng công đoạn nhất định trên công cụ của "
++#~ "bạn"
++
++#~ msgid "Settings"
++#~ msgstr "Cài đặt "
++
++#~ msgid "Setup wait time"
++#~ msgstr "Cài đặt thá»i gian chá»"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr ""
++#~ "Xin lỗi. OpenWrt không hỗ trợ nâng cấp hệ thống trên platform này. <br /> "
++#~ "Bạn cần tự flash thiết bị của bạn. "
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr "Chỉ định những dòng lệnh tranh cãi cho pppd ở đây"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "Thiết bị node của modem, e.g. /dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr "Thá»i gian (giây) sau khi má»™t kết nối không sá»­ dụng sẽ bị đóng"
++
++#~ msgid "Update package lists"
++#~ msgstr "Cập nhật danh sách gói"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "Tải một tập tin hình ảnh OpenWrt để reflash thiết bị."
++
++#~ msgid "Upload image"
++#~ msgstr "Tải hình ảnh"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "Dùng peer DNS"
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "Bạn cần cài đặt &amp;quot;comgt&amp;quot; for UMTS/GPRS, &amp;quot;ppp-"
++#~ "mod-pppoe&amp;quot; for PPPoE, &amp;quot;ppp-mod-pppoa&amp;quot; for "
++#~ "PPPoA or &amp;quot;pptp&amp;quot; for PPtP support"
++
++#~ msgid "back"
++#~ msgstr "quay lại"
++
++#~ msgid "buffered"
++#~ msgstr "buffered"
++
++#~ msgid "cached"
++#~ msgstr "cached"
++
++#~ msgid "free"
++#~ msgstr "free"
++
++#~ msgid "static"
++#~ msgstr "thống kê"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Cấu hình giao diện Lua \">LuCI</abbr> là một tập hợp của "
++#~ "phần má»m Lua bao gồm <abbr title=\"Model-View-Controller\">MVC</abbr>-"
++#~ "Công cụ Web và giao diện Web cho thiết bị nhúng. <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr> được lưu hành dưới giấy phép Apache."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "<abbr title=\"VỠbảo mậtl\">SSH</abbr>-Phím"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr ""
++#~ "Một lightưeight HTTP/1.1 webserver viết bằng C và Lúa được thiết kế để "
++#~ "phục vụ LuCI"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Một webserver nhỠcó thể dùng để phục vụ <abbr title=\"Giao diện cấu "
++#~ "hình Lua\">LuCI</abbr>."
++
++#~ msgid "About"
++#~ msgstr "Vá»"
++
++#~ msgid "Addresses"
++#~ msgstr "Äịa chỉ"
++
++#~ msgid "Admin Password"
++#~ msgstr "Mật khẩu quản lí"
++
++#~ msgid "Alias"
++#~ msgstr "Bí danh"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "Realm xác định"
++
++#~ msgid "Bridge Port"
++#~ msgstr "Cổng cầu nối"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr "Thay đổi mật mã của quản lí hệ thống (User <code>root</code>)"
++
++#~ msgid "Client + WDS"
++#~ msgstr "Äối tượng + WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "Tập tin cấu hình"
++
++#~ msgid "Connection timeout"
++#~ msgstr "Kết nối dừng"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "Phát triển viên"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "Gán DHCP"
++
++#~ msgid "Document root"
++#~ msgstr "Gốc tài liệu "
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "Kích hoạt Keep-Alive"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "Cầu nối ethernet"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "ở đây bạn có thể dán công khai <abbr title=\"Secure Shell\"> SSH</abbr>-"
++#~ "Keys (mỗi cái một dòng) for <abbr title=\"Secure Shell\">SSH</abbr> xác "
++#~ "thực khóa công khai"
++
++#~ msgid "ID"
++#~ msgstr "ID"
++
++#~ msgid "IP Configuration"
++#~ msgstr "Cấu hình IP"
++
++#~ msgid "Interface Status"
++#~ msgstr "Tình trạng giao diện"
++
++#~ msgid "Lead Development"
++#~ msgstr "Dẫn đầu phát triển"
++
++#~ msgid "Master"
++#~ msgstr "Chủ"
++
++#~ msgid "Master + WDS"
++#~ msgstr "Chủ + WDS"
++
++#~ msgid "Not configured"
++#~ msgstr "Không định cấu hình"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "Mật mã đã thay đổi thành công"
++
++#~ msgid "Plugin path"
++#~ msgstr "ÄÆ°á»ng dẫn Plugin"
++
++#~ msgid "Ports"
++#~ msgstr "Cá»­a"
++
++#~ msgid "Primary"
++#~ msgstr "Chính"
++
++#~ msgid "Project Homepage"
++#~ msgstr "Trang chủ dự án"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "Pseudo Ad-Hoc"
++
++#~ msgid "STP"
++#~ msgstr "STP"
++
++#~ msgid "Thanks To"
++#~ msgstr "Cám ơn"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr ""
++#~ "Realm đó sẽ được hiển thị tại dấu nhắc xác thực cho các trang web được "
++#~ "bảo vệ."
++
++#~ msgid "Unknown Error"
++#~ msgstr "Không hiểu lỗi"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "Mặc định tới <code>/etc/httpd.conf</code>"
++
++#~ msgid "Package lists updated"
++#~ msgstr "Danh sách gói đã được cập nhật"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "nâng cấp gói cài đặt"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr ""
++#~ "Kernel hoặc service logfiles cũng có thể được view ở đây để lấy tầm nhìn "
++#~ "tổng quát của hình trạng hiện tại. "
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "Ở đây bạn có thể tìm thấy thông tin vỠtình trạng của hệ thống hiện hành "
++#~ "nhÆ° là <abbr title=\"Bá»™ Ä‘iá»u khiển trung tâm\">CPU</abbr> đồng hồ tần số, "
++#~ "bộ nhớ hoặc mạng lưới dữ liệu giao diện."
++
++#~ msgid "Search file..."
++#~ msgstr "Tìm tập tin..."
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "<abbr title=\"Cấu hình giao diện Lua \">LuCI</abbr> thì miễn phí, đa "
++#~ "dạng , và đồ há»a thân thiện vá»›i sá»­ dụng cho các cấu hình OpenWrt Kamikaze."
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "Và bây giỠhãy bắt đầu chơi với bộ định tuyến của bạn!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr ""
++#~ "Vì chúng tôi luôn muốn cải thiện giao diện này, chúng tôi hy vá»ng nhận "
++#~ "được đóng góp và ý kiến của các bạn. "
++
++#~ msgid "Hello!"
++#~ msgstr "Xin chào"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "Ghi chú: Trong <abbr title=\"Cấu hình giao diện Lua \">LuCI</abbr> những "
++#~ "thay đổi phải được xác nhận bằng cách nhấn vào Changes - Save &amp; Ãp "
++#~ "dụng trước khi được áp dụng."
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr ""
++#~ "Ở những trang kế tiếp, bạn có thể thay đổi những cài đặt quan trong của "
++#~ "bộ định tuyến."
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr "Nhóm <abbr title=\"Cấu hình giao diện Lua\">LuCI</abbr> "
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "Äây là vùng quản trị của <abbr title=\"Cấu hình giao diện Lua\">LuCI</"
++#~ "abbr>."
++
++#~ msgid "User Interface"
++#~ msgstr "Giao diện ngÆ°á»i sá»­ dụng"
++
++#~ msgid "enable"
++#~ msgstr "Kích hoạt"
++
++#, fuzzy
++#~ msgid "(optional)"
++#~ msgstr ""
++#~ "<span class=\"translation-space\"> </span>\n"
++#~ "(tùy ý)"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-Cổng"
++
++#~ msgid ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server will be queried in "
++#~ "the order of the resolvfile"
++#~ msgstr ""
++#~ "<abbr title=\"Domain Name System\">DNS</abbr>-Server sẽ bị tra vấn theo "
++#~ "thứ tự của tập tin resolv. "
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++#~ msgstr ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Dynamic Host "
++#~ "Configuration Protocol\">DHCP</abbr>-Leases"
++
++#~ msgid ""
++#~ "<abbr title=\"maximal\">max.</abbr> <abbr title=\"Extension Mechanisms "
++#~ "for Domain Name System\">EDNS0</abbr> packet size"
++#~ msgstr ""
++#~ "<abbr title=\"tối đal\">max.</abbr> <abbr title=\"Mở rộng cơ chế cho hệ "
++#~ "thống tên miá»n\">EDNS0</abbr> dung lượng gói tin"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "AP-Isolation"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "Thêm mạng Wifi vào màng vật lý"
++
++#~ msgid "Aliases"
++#~ msgstr "Aliases"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "Clamp Segment Size"
++
++#, fuzzy
++#~ msgid "Create Or Attach Network"
++#~ msgstr "Tạo network"
++
++#~ msgid "Devices"
++#~ msgstr "Những công cụ"
++
++#~ msgid "Don't forward reverse lookups for local networks"
++#~ msgstr "Don&amp;#39;t chuyển tiếp lookups đảo ngược cho các mạng địa phương"
++
++#~ msgid "Enable TFTP-Server"
++#~ msgstr "Kích hoạt TFTP-Server"
++
++#~ msgid "Errors"
++#~ msgstr "Lá»—i"
++
++#~ msgid "Essentials"
++#~ msgstr "Essentials"
++
++#~ msgid "Expand Hosts"
++#~ msgstr "Mở rộng Hosts"
++
++#~ msgid "First leased address"
++#~ msgstr "Äịa chỉ lease đầu tiên"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr ""
++#~ "Chỉnh sửa vấn đỠvới những website không tiếp cận được, trình form hoặc "
++#~ "những hình thức bất ngỠcho một vài ISP."
++
++#~ msgid "Hardware Address"
++#~ msgstr "Äịa chỉ phần cứng"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "Ở đây bạn có thể định cấu hình của công cụ wifi được cài đặt."
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "Äá»™c lập (Ad-Hoc)"
++
++#~ msgid "Internet Connection"
++#~ msgstr "Kết nối Internet"
++
++#~ msgid "Join (Client)"
++#~ msgstr "Tham gia (client)"
++
++#~ msgid "Leases"
++#~ msgstr "Leases"
++
++#~ msgid "Local Domain"
++#~ msgstr "Domain địa phương"
++
++#~ msgid "Local Network"
++#~ msgstr "Network địa phương"
++
++#~ msgid "Local Server"
++#~ msgstr "Server địa phương"
++
++#~ msgid "Network Boot Image"
++#~ msgstr "Hình ảnh khởi động mạng lưới"
++
++#~ msgid ""
++#~ "Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</"
++#~ "abbr>)"
++#~ msgstr ""
++#~ "Tên mạng (<abbr title=\"Mở rộng dịch vụ đặt Identifier\">ESSID</abbr>)"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "Số của địa chỉ lease"
++
++#~ msgid "Perform Actions"
++#~ msgstr "Trình bày hành động"
++
++#~ msgid "Prevents Client to Client communication"
++#~ msgstr "Ngăn chặn giao tiếp giữa client-và-client"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "Cung cấp (Äiểm truy cập)"
++
++#~ msgid "Resolvfile"
++#~ msgstr "Tập tin Resolv"
++
++#~ msgid "TFTP-Server Root"
++#~ msgstr "Gốc TFTP-Server "
++
++#~ msgid "TX / RX"
++#~ msgstr "TX / RX"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "Những thay đổi sau đây đã được tiến hành"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "Khi truyá»n đến phần cứng vá»›i <abbr title=\"Cấu hình giao diện Lua "
++#~ "\">LuCI</abbr> Những tập tin này sẽ được bổ sung vào cài đặt phần cứng "
++#~ "má»›i."
++
++#, fuzzy
++#~ msgid "Wireless Scan"
++#~ msgstr "Mạng không dây"
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "Với <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> thành "
++#~ "viên network có thể tự động nhận cài đặt mạng (<abbr title=\"Internet "
++#~ "Protocol\">IP</abbr>-address, netmask, <abbr title=\"Domain Name System"
++#~ "\">DNS</abbr>-server, ...)."
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "Bạn có thể chạy nhiá»u mạng wifi vá»›i má»™t công cụ. Hãy chú ý rằng má»™t số "
++#~ "phần cứng và driverspecific bị hạn chế. Thông thÆ°á»ng, bạn có thể vận hành "
++#~ "1 Ad-Hoc hay tối đa là 3-chế độ master và 1-chế độ client mạng lưới cùng "
++#~ "một lúc."
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr ""
++#~ "Bạn cần cài đặt &amp;quot;ppp-mod-pppoe&amp;quot; for PPPoE or &amp;quot;"
++#~ "pptp&amp;quot; cho hỗ trợ PPtP "
++
++#~ msgid "Zone"
++#~ msgstr "Zone"
++
++#~ msgid "additional hostfile"
++#~ msgstr "Tập tin host bổ sung"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr "Thêm tên miá»n vào hostentries trong tập tin resolv "
++
++#~ msgid "automatically reconnect"
++#~ msgstr "Tự động kết nối lại"
++
++#~ msgid "concurrent queries"
++#~ msgstr "Äồng truy vấn"
++
++#~ msgid ""
++#~ "disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "for this interface"
++#~ msgstr ""
++#~ "Vô hiệu hóa <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++#~ "abbr> cho giao diện này"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "Ngừng kết nối khi idle cho"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "don&amp;#39;t cache unknown"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr ""
++#~ "lá»c không hữu dụng <abbr title=\"Hệ thống tên miá»n\">DNS</abbr>-các tra "
++#~ "vấn của hệ thống Windows"
++
++#~ msgid "installed"
++#~ msgstr "Äã cài đặt "
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "Äịa phÆ°Æ¡ng hóa các hostname phụ thuá»™c vào subnet"
++
++#~ msgid "not installed"
++#~ msgstr "không cài đặt "
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr ""
++#~ "Ngăn ngừa tiêu cá»±c trong bá»™ nhá»› đệm <abbr title=\"Hệ thống tên miá»n"
++#~ "\">DNS</abbr>-trả lá»i"
++
++#~ msgid "query port"
++#~ msgstr "cổng truy vấn"
++
++#~ msgid "transmitted / received"
++#~ msgstr "Äã truyá»n/ đã nhận"
++
++#, fuzzy
++#~ msgid "Join network"
++#~ msgstr "contained networks"
++
++#~ msgid "all"
++#~ msgstr "tất cả"
++
++#~ msgid "Code"
++#~ msgstr "Mã"
++
++#~ msgid "Distance"
++#~ msgstr "Khoảng cách "
++
++#~ msgid "Legend"
++#~ msgstr "Legend"
++
++#~ msgid "Library"
++#~ msgstr "thư viện "
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "xem &amp;#39;%s&amp;#39; trang chính"
++
++#~ msgid "Package Manager"
++#~ msgstr "Quản lí gói"
++
++#~ msgid "Service"
++#~ msgstr "Dịch vụ "
++
++#~ msgid "Statistics"
++#~ msgstr "Thống kê"
++
++#~ msgid "zone"
++#~ msgstr "Zone"
+diff --git a/feeds/luci/modules/luci-base/po/zh-cn/base.po b/feeds/luci/modules/luci-base/po/zh-cn/base.po
+new file mode 100644
+index 0000000..493870c
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/zh-cn/base.po
+@@ -0,0 +1,4199 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: \n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-12-21 23:08+0200\n"
++"PO-Revision-Date: 2015-04-23 13:49+0800\n"
++"Last-Translator: GuoGuo <gch981213@gmail.com>\n"
++"Language: zh_CN\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 1.7.5\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d分钟信æ¯ï¼Œ%d秒刷新)"
++
++msgid "(%s available)"
++msgstr "(%s å¯ç”¨)"
++
++msgid "(empty)"
++msgstr "(空)"
++
++msgid "(no interfaces attached)"
++msgstr "(未连接接å£)"
++
++msgid "-- Additional Field --"
++msgstr "-- 更多选项 --"
++
++msgid "-- Please choose --"
++msgstr "-- 请选择 --"
++
++msgid "-- custom --"
++msgstr "-- 自定义 --"
++
++msgid "-- match by device --"
++msgstr "-- æ ¹æ®è®¾å¤‡åŒ¹é… --"
++
++msgid "-- match by label --"
++msgstr "-- æ ¹æ®æ ‡ç­¾åŒ¹é… --"
++
++msgid "1 Minute Load:"
++msgstr "1分钟负载:"
++
++msgid "15 Minute Load:"
++msgstr "15分钟负载:"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "5分钟负载:"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> 查询端å£"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> æœåŠ¡å™¨ç«¯å£"
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr "将会按照指定的顺åºæŸ¥è¯¢<abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-地å€"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-网关"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-å­ç½‘掩ç "
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-地å€æˆ–超网() (<abbr "
++"title=\"无类别域间路由\">CIDR</abbr>)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-网关"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-åŽç¼€ï¼ˆå六进制)"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr>é…ç½®"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr>å称"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-地å€"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"最大<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=\"DNS扩展å\">EDNS0</abbr>æ•°æ®åŒ…大å°"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"maximal\">最大</abbr>并å‘查询数"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr "ADSL"
++
++msgid "ADSL Status"
++msgstr "ADSL状æ€"
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "AR支æŒ"
++
++msgid "ARP retry threshold"
++msgstr "ARPé‡è¯•é˜ˆå€¼"
++
++msgid "ATM Bridges"
++msgstr "ATM桥接"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "ATM虚拟通é“标识(VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "ATM虚拟路径标识(VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"ATM桥是以AAL5åè®®å°è£…以太网的虚拟Linux网桥,用于ååŒDHCP或PPPæ¥æ‹¨å·è¿žæŽ¥åˆ°ç½‘络"
++"è¿è¥å•†ã€‚"
++
++msgid "ATM device number"
++msgstr "ATM设备å·ç "
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "接入集中器"
++
++msgid "Access Point"
++msgstr "接入点AP"
++
++msgid "Action"
++msgstr "动作"
++
++msgid "Actions"
++msgstr "动作"
++
++msgid "Activate this network"
++msgstr "激活此网络"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "活动的<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-链路"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "活动的<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-链路"
++
++msgid "Active Connections"
++msgstr "活动连接"
++
++msgid "Active DHCP Leases"
++msgstr "已分é…çš„DHCP租约"
++
++msgid "Active DHCPv6 Leases"
++msgstr "已分é…çš„DHCPv6租约"
++
++msgid "Ad-Hoc"
++msgstr "点对点Ad-Hoc"
++
++msgid "Add"
++msgstr "添加"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr "添加本地域ååŽç¼€åˆ°HOSTS文件中的域å"
++
++msgid "Add new interface..."
++msgstr "添加新接å£..."
++
++msgid "Additional Hosts files"
++msgstr "é¢å¤–çš„HOSTS文件"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "地å€"
++
++msgid "Address to access local relay bridge"
++msgstr "接入本地中继桥的地å€"
++
++msgid "Administration"
++msgstr "管ç†æƒ"
++
++msgid "Advanced Settings"
++msgstr "高级设置"
++
++msgid "Alert"
++msgstr "警戒"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr "å…许<abbr title=\"Secure Shell\">SSH</abbr>密ç éªŒè¯"
++
++msgid "Allow all except listed"
++msgstr "ä»…å…许列表外"
++
++msgid "Allow listed only"
++msgstr "ä»…å…许列表内"
++
++msgid "Allow localhost"
++msgstr "å…许本机"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr "å…许远程主机连接到本地SSH转å‘端å£"
++
++msgid "Allow root logins with password"
++msgstr "rootæƒé™ç™»å½•"
++
++msgid "Allow the <em>root</em> user to login with password"
++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回环范围内的上行å“应,例如:RBLæœåŠ¡"
++
++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\">Tunneling Comparison</a> "
++
++msgid "Always announce default router"
++msgstr "总是广播默认路由"
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "å–消选中将会å¦å¤–创建一个新网络,而ä¸ä¼šè¦†ç›–当å‰ç½‘络设置"
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr "å³ä½¿æ²¡æœ‰å¯ç”¨çš„公共å‰ç¼€ä¹Ÿå¹¿æ’­é»˜è®¤è·¯ç”±"
++
++msgid "Announced DNS domains"
++msgstr "广播的DNS域å"
++
++msgid "Announced DNS servers"
++msgstr "广播的DNSæœåŠ¡å™¨"
++
++msgid "Antenna 1"
++msgstr "天线 1"
++
++msgid "Antenna 2"
++msgstr "天线 2"
++
++msgid "Antenna Configuration"
++msgstr "天线é…ç½®"
++
++msgid "Any zone"
++msgstr "ä»»æ„区域"
++
++msgid "Apply"
++msgstr "应用"
++
++msgid "Applying changes"
++msgstr "正在应用更改"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr "ç»™æ¯ä¸ªå…¬å…±IPv6å‰ç¼€åˆ†é…指定长度的固定部分"
++
++msgid "Assign interfaces..."
++msgstr "分é…接å£..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "已连接站点"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Qualcomm/Atheros 802.11%s 无线网å¡"
++
++msgid "AuthGroup"
++msgstr "认è¯ç»„"
++
++msgid "Authentication"
++msgstr "认è¯"
++
++msgid "Authoritative"
++msgstr "授æƒçš„唯一DHCPæœåŠ¡å™¨"
++
++msgid "Authorization Required"
++msgstr "需è¦æŽˆæƒ"
++
++msgid "Auto Refresh"
++msgstr "自动刷新"
++
++msgid "Automatic"
++msgstr "自动"
++
++msgid "Automatic Homenet (HNCP)"
++msgstr "自动家庭网络(HNCP)"
++
++msgid "Available"
++msgstr "å¯ç”¨"
++
++msgid "Available packages"
++msgstr "å¯ç”¨è½¯ä»¶åŒ…"
++
++msgid "Average:"
++msgstr "å¹³å‡:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "返回"
++
++msgid "Back to Overview"
++msgstr "返回至概况"
++
++msgid "Back to configuration"
++msgstr "返回至é…ç½®"
++
++msgid "Back to overview"
++msgstr "返回至概况"
++
++msgid "Back to scan results"
++msgstr "返回至扫æ结果"
++
++msgid "Background Scan"
++msgstr "åŽå°æœç´¢"
++
++msgid "Backup / Flash Firmware"
++msgstr "备份/å‡çº§"
++
++msgid "Backup / Restore"
++msgstr "备份/æ¢å¤"
++
++msgid "Backup file list"
++msgstr "文件备份列表"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"下é¢æ˜¯å¾…备份的文件清å•ã€‚包å«äº†æ›´æ”¹çš„é…置文件ã€å¿…è¦çš„基础文件和用户自定义的需"
++"备份文件。"
++
++msgid "Bitrate"
++msgstr "传输速率"
++
++msgid "Bogus NX Domain Override"
++msgstr "忽略虚å‡ç©ºåŸŸå解æž"
++
++msgid "Bridge"
++msgstr "桥接"
++
++msgid "Bridge interfaces"
++msgstr "桥接接å£"
++
++msgid "Bridge unit number"
++msgstr "桥接å·"
++
++msgid "Bring up on boot"
++msgstr "开机自动è¿è¡Œ"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Broadcom 802.11%s 无线网å¡"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Broadcom BCM%04x 802.11 无线网å¡"
++
++msgid "Buffered"
++msgstr "已缓冲"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "按键"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr "CAè¯ä¹¦.如果留空的è¯è¯ä¹¦å°†åœ¨ç¬¬ä¸€æ¬¡è¿žæŽ¥æ—¶è¢«ä¿å­˜."
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "CPU使用率(%)"
++
++msgid "Cancel"
++msgstr "å–消"
++
++msgid "Category"
++msgstr "分类"
++
++msgid "Chain"
++msgstr "链"
++
++msgid "Changes"
++msgstr "修改数"
++
++msgid "Changes applied."
++msgstr "更改已应用"
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "修改访问设备的管ç†å‘˜å¯†ç "
++
++msgid "Channel"
++msgstr "ä¿¡é“"
++
++msgid "Check"
++msgstr "检查"
++
++msgid "Checksum"
++msgstr "校验值"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr "此接å£çš„防ç«å¢™åŒºåŸŸã€‚填写<em>创建</em>æ å¯æ–°å»ºé˜²ç«å¢™åŒºåŸŸã€‚"
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr "选择指派到此无线接å£çš„网络。填写<em>创建</em>æ å¯æ–°å»ºç½‘络。"
++
++msgid "Cipher"
++msgstr "算法"
++
++msgid ""
++"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)."
++msgstr "备份/æ¢å¤å½“å‰ç³»ç»Ÿé…置文件或é‡ç½®OpenWrt(ä»…squashfs固件有效)。"
++
++msgid "Client"
++msgstr "客户端Client"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "请求DHCPæ—¶å‘é€çš„客户ID"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr "定时关闭éžæ´»åŠ¨é“¾æŽ¥(秒),0为æŒç»­è¿žæŽ¥"
++
++msgid "Close list..."
++msgstr "关闭列表..."
++
++msgid "Collecting data..."
++msgstr "正在收集数æ®..."
++
++msgid "Command"
++msgstr "进程命令"
++
++msgid "Common Configuration"
++msgstr "一般设置"
++
++msgid "Compression"
++msgstr "压缩"
++
++msgid "Configuration"
++msgstr "é…ç½®"
++
++msgid "Configuration applied."
++msgstr "é…置已应用"
++
++msgid "Configuration files will be kept."
++msgstr "é…置文件将被ä¿ç•™ã€‚"
++
++msgid "Confirmation"
++msgstr "确认密ç "
++
++msgid "Connect"
++msgstr "连接"
++
++msgid "Connected"
++msgstr "已连接"
++
++msgid "Connection Limit"
++msgstr "连接数é™åˆ¶"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr "当TLSä¸å¯ç”¨æ—¶è¿žæŽ¥åˆ°æœåŠ¡å™¨å¤±è´¥"
++
++msgid "Connections"
++msgstr "链接"
++
++msgid "Country"
++msgstr "国家"
++
++msgid "Country Code"
++msgstr "国家代ç "
++
++msgid "Cover the following interface"
++msgstr "包括以下接å£"
++
++msgid "Cover the following interfaces"
++msgstr "包括以下接å£"
++
++msgid "Create / Assign firewall-zone"
++msgstr "创建/åˆ†é… é˜²ç«å¢™åŒºåŸŸ"
++
++msgid "Create Interface"
++msgstr "创建新接å£"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "在多个接å£ä¸Šåˆ›å»ºæ¡¥æŽ¥"
++
++msgid "Critical"
++msgstr "致命错误"
++
++msgid "Cron Log Level"
++msgstr "Cron日志级别"
++
++msgid "Custom Interface"
++msgstr "自定义接å£"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr "自定义分é…çš„IPv6å‰ç¼€"
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr "自定义<abbr title=\"Light Emitting Diode\">LED</abbr>的活动状æ€ã€‚"
++
++msgid "DHCP Leases"
++msgstr "DHCP分é…"
++
++msgid "DHCP Server"
++msgstr "DHCPæœåŠ¡å™¨"
++
++msgid "DHCP and DNS"
++msgstr "DHCP/DNS"
++
++msgid "DHCP client"
++msgstr "DHCP客户端"
++
++msgid "DHCP-Options"
++msgstr "DHCP-选项"
++
++msgid "DHCPv6 Leases"
++msgstr "DHCPv6分é…"
++
++msgid "DHCPv6 client"
++msgstr "DHCPv6客户端"
++
++msgid "DHCPv6-Mode"
++msgstr "DHCPv6模å¼"
++
++msgid "DHCPv6-Service"
++msgstr "DHCPv6æœåŠ¡"
++
++msgid "DNS"
++msgstr "DNS"
++
++msgid "DNS forwardings"
++msgstr "DNS转å‘"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DUID(DHCP唯一标识符)"
++
++msgid "Debug"
++msgstr "调试"
++
++msgid "Default %d"
++msgstr "默认%d"
++
++msgid "Default gateway"
++msgstr "默认网关"
++
++msgid "Default route"
++msgstr "默认路由"
++
++msgid "Default state"
++msgstr "默认状æ€"
++
++msgid "Define a name for this network."
++msgstr "为网络定义å称"
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"设置DHCP的附加选项,例如设定\"<code>6,192.168.2.1,192.168.2.2</code>\"表示通"
++"å‘Šä¸åŒçš„DNSæœåŠ¡å™¨ç»™å®¢æˆ·ç«¯ã€‚"
++
++msgid "Delete"
++msgstr "删除"
++
++msgid "Delete this interface"
++msgstr "删除此接å£"
++
++msgid "Delete this network"
++msgstr "删除此网络"
++
++msgid "Description"
++msgstr "æè¿°"
++
++msgid "Design"
++msgstr "主题"
++
++msgid "Destination"
++msgstr "目标地å€"
++
++msgid "Device"
++msgstr "设备"
++
++msgid "Device Configuration"
++msgstr "设备é…ç½®"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "网络诊断"
++
++msgid "Dial number"
++msgstr "拨å·å·ç "
++
++msgid "Directory"
++msgstr "目录"
++
++msgid "Disable"
++msgstr "ç¦ç”¨"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++"ç¦ç”¨æœ¬æŽ¥å£çš„<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>。"
++
++msgid "Disable DNS setup"
++msgstr "åœç”¨DNS设定"
++
++msgid "Disable HW-Beacon timer"
++msgstr "åœç”¨ HW-Beacon 计时器"
++
++msgid "Disabled"
++msgstr "ç¦ç”¨"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "丢弃RFC1918上行å“应数æ®"
++
++msgid "Displaying only packages containing"
++msgstr "åªæ˜¾ç¤ºæœ‰å†…容的软件包"
++
++msgid "Distance Optimization"
++msgstr "è·ç¦»ä¼˜åŒ–"
++
++msgid "Distance to farthest network member in meters."
++msgstr "最远客户端的è·ç¦»(ç±³)。"
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "分集"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr "Dnsmasq为NAT防ç«å¢™æ供了一个集æˆçš„DHCPæœåŠ¡å™¨å’ŒDNS转å‘器"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 "ä¸è½¬å‘åå‘查询本地网络的Lookups命令"
++
++msgid "Do not send probe responses"
++msgstr "ä¸å›žé€æŽ¢æµ‹å“应"
++
++msgid "Domain required"
++msgstr "忽略空域å解æž"
++
++msgid "Domain whitelist"
++msgstr "域å白åå•"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr "ä¸è½¬å‘没有DNSå称的解æžè¯·æ±‚"
++
++msgid "Download and install package"
++msgstr "下载并安装软件包"
++
++msgid "Download backup"
++msgstr "下载备份"
++
++msgid "Dropbear Instance"
++msgstr "Dropbear设置"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbearæ供了集æˆçš„<abbr title=\"Secure Copy\">SCP</abbr>æœåŠ¡å™¨å’ŒåŸºäºŽ<abbr "
++"title=\"Secure Shell\">SSH</abbr>的shell访问"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr "动æ€<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++
++msgid "Dynamic tunnel"
++msgstr "动æ€éš§é“"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr "动æ€åˆ†é…DHCP地å€ã€‚如果ç¦ç”¨ï¼Œåˆ™åªèƒ½ä¸ºé™æ€ç§Ÿç”¨è¡¨ä¸­çš„客户端æ供网络æœåŠ¡ã€‚"
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "EAP-Method"
++
++msgid "Edit"
++msgstr "修改"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "修改此接å£"
++
++msgid "Edit this network"
++msgstr "修改此网络"
++
++msgid "Emergency"
++msgstr "紧急"
++
++msgid "Enable"
++msgstr "å¯ç”¨"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "å¼€å¯<abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "å¯ç”¨HE.net动æ€ç»ˆç«¯æ›´æ–°"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "å¯ç”¨å·¨åž‹å¸§é€ä¼ "
++
++msgid "Enable NTP client"
++msgstr "å¯ç”¨NTP客户端"
++
++msgid "Enable TFTP server"
++msgstr "å¯ç”¨TFTPæœåŠ¡å™¨"
++
++msgid "Enable VLAN functionality"
++msgstr "å¯ç”¨VLAN"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr "å¯ç”¨WPS按键é…ç½®.è¦æ±‚使用WPA(2)-PSK"
++
++msgid "Enable learning and aging"
++msgstr "å¯ç”¨æ™ºèƒ½äº¤æ¢å­¦ä¹ "
++
++msgid "Enable mirroring of incoming packets"
++msgstr "å¯ç”¨æµå…¥æ•°æ®åŒ…é•œåƒ"
++
++msgid "Enable mirroring of outgoing packets"
++msgstr "å¯ç”¨æµå‡ºæ•°æ®åŒ…é•œåƒ"
++
++msgid "Enable this mount"
++msgstr "å¯ç”¨æŒ‚载点"
++
++msgid "Enable this swap"
++msgstr "å¯ç”¨äº¤æ¢åŒº"
++
++msgid "Enable/Disable"
++msgstr "å¯ç”¨/ç¦ç”¨"
++
++msgid "Enabled"
++msgstr "å¯ç”¨"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "在此桥接上å¯ç”¨ç”Ÿæˆå议树"
++
++msgid "Encapsulation mode"
++msgstr "å°è£…模å¼"
++
++msgid "Encryption"
++msgstr "加密"
++
++msgid "Erasing..."
++msgstr "擦除中..."
++
++msgid "Error"
++msgstr "错误"
++
++msgid "Ethernet Adapter"
++msgstr "以太网适é…器"
++
++msgid "Ethernet Switch"
++msgstr "以太网交æ¢æœº"
++
++msgid "Expand hosts"
++msgstr "扩展HOSTS文件中的主机åŽç¼€"
++
++msgid "Expires"
++msgstr "到期时间"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr "地å€ç§ŸæœŸï¼Œæœ€å°2分钟(<code>2m</code>)。"
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "远程logæœåŠ¡å™¨"
++
++msgid "External system log server port"
++msgstr "远程logæœåŠ¡å™¨ç«¯å£"
++
++msgid "Fast Frames"
++msgstr "快速帧"
++
++msgid "File"
++msgstr "文件"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "å‘客户端通告的å¯åŠ¨é•œåƒæ–‡ä»¶å"
++
++msgid "Filesystem"
++msgstr "文件系统"
++
++msgid "Filter"
++msgstr "过滤器"
++
++msgid "Filter private"
++msgstr "过滤本地包"
++
++msgid "Filter useless"
++msgstr "过滤无用包"
++
++msgid "Find and join network"
++msgstr "æœç´¢å¹¶åŠ å…¥ç½‘络"
++
++msgid "Find package"
++msgstr "查找软件包"
++
++msgid "Finish"
++msgstr "完æˆ"
++
++msgid "Firewall"
++msgstr "防ç«å¢™"
++
++msgid "Firewall Settings"
++msgstr "防ç«å¢™è®¾ç½®"
++
++msgid "Firewall Status"
++msgstr "防ç«å¢™çŠ¶æ€"
++
++msgid "Firmware Version"
++msgstr "固件版本"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "指定的DNS查询æºç«¯å£"
++
++msgid "Flags"
++msgstr "标识"
++
++msgid "Flash Firmware"
++msgstr "刷新固件"
++
++msgid "Flash image..."
++msgstr "刷写固件..."
++
++msgid "Flash new firmware image"
++msgstr "刷写新的固件"
++
++msgid "Flash operations"
++msgstr "刷新æ“作"
++
++msgid "Flashing..."
++msgstr "刷写中..."
++
++msgid "Force"
++msgstr "强制开å¯DHCP"
++
++msgid "Force CCMP (AES)"
++msgstr "强制使用CCMP(AES)加密"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr "强制开å¯DHCP。"
++
++msgid "Force TKIP"
++msgstr "强制使用TKIP加密"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "TKIPå’ŒCCMP(AES)æ··åˆåŠ å¯†"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "转å‘DHCPæ•°æ®åŒ…"
++
++msgid "Forward broadcast traffic"
++msgstr "转å‘广播数æ®åŒ…"
++
++msgid "Forwarding mode"
++msgstr "转å‘模å¼"
++
++msgid "Fragmentation Threshold"
++msgstr "分片阈值"
++
++msgid "Frame Bursting"
++msgstr "帧çªå‘"
++
++msgid "Free"
++msgstr "空闲数"
++
++msgid "Free space"
++msgstr "空闲空间"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "ä»…GPRS"
++
++msgid "Gateway"
++msgstr "网关"
++
++msgid "Gateway ports"
++msgstr "网关端å£"
++
++msgid "General Settings"
++msgstr "基本设置"
++
++msgid "General Setup"
++msgstr "基本设置"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "生æˆå¤‡ä»½"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "Generic 802.11%s 无线网å¡"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr "由于密ç éªŒè¯ä¸åŒ¹é…,密ç æ²¡æœ‰æ›´æ”¹ï¼"
++
++msgid "Global network options"
++msgstr "全局网络选项"
++
++msgid "Go to password configuration..."
++msgstr "跳转到密ç é…置页..."
++
++msgid "Go to relevant configuration page"
++msgstr "跳转到相关的é…置页é¢"
++
++msgid "Guest"
++msgstr "访客"
++
++msgid "HE.net password"
++msgstr "HE.net密ç "
++
++msgid "HE.net username"
++msgstr "HE.net用户å"
++
++msgid "Handler"
++msgstr "处ç†ç¨‹åº"
++
++msgid "Hang Up"
++msgstr "挂起"
++
++msgid "Heartbeat"
++msgstr "心跳"
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr "é…置路由器的部分基础信æ¯ã€‚"
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr "SSH公共密钥认è¯(æ¯è¡Œä¸€ä¸ªå¯†é’¥)。"
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Hermes 802.11b 无线网å¡"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "éšè—<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "主机目录"
++
++msgid "Host expiry timeout"
++msgstr "主机到期超时"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "主机IP或网络"
++
++msgid "Hostname"
++msgstr "主机å"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "请求DHCPæ—¶å‘é€çš„主机å"
++
++msgid "Hostnames"
++msgstr "主机å"
++
++msgid "Hybrid"
++msgstr "æ··åˆ"
++
++msgid "IP address"
++msgstr "IP地å€"
++
++msgid "IPv4"
++msgstr "IPv4"
++
++msgid "IPv4 Firewall"
++msgstr "IPv4防ç«å¢™"
++
++msgid "IPv4 WAN Status"
++msgstr "IPv4 WAN状æ€"
++
++msgid "IPv4 address"
++msgstr "IPv4地å€"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4å’ŒIPv6"
++
++msgid "IPv4 assignment length"
++msgstr "分é…IPv4长度"
++
++msgid "IPv4 broadcast"
++msgstr "IPv4广播"
++
++msgid "IPv4 gateway"
++msgstr "IPv4网关"
++
++msgid "IPv4 netmask"
++msgstr "IPv4å­ç½‘掩ç "
++
++msgid "IPv4 only"
++msgstr "ä»…IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "IPv4地å€å‰ç¼€é•¿åº¦"
++
++msgid "IPv4-Address"
++msgstr "IPv4-地å€"
++
++msgid "IPv6"
++msgstr "IPv6"
++
++msgid "IPv6 Firewall"
++msgstr "IPv6防ç«å¢™"
++
++msgid "IPv6 Neighbours"
++msgstr "IPv6邻居"
++
++msgid "IPv6 Settings"
++msgstr "IPv6设置"
++
++msgid "IPv6 ULA-Prefix"
++msgstr "IPv6 ULAå‰ç¼€"
++
++msgid "IPv6 WAN Status"
++msgstr "IPv6 WAN状æ€"
++
++msgid "IPv6 address"
++msgstr "IPv6地å€"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr "绑定到本地隧é“终点的IPv6地å€(å¯é€‰)"
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr "IPv6分é…长度"
++
++msgid "IPv6 gateway"
++msgstr "IPv6网关"
++
++msgid "IPv6 only"
++msgstr "ä»…IPv6"
++
++msgid "IPv6 prefix"
++msgstr "IPv6地å€å‰ç¼€"
++
++msgid "IPv6 prefix length"
++msgstr "IPv6地å€å‰ç¼€é•¿åº¦"
++
++msgid "IPv6 routed prefix"
++msgstr "IPv6路由å‰ç¼€"
++
++msgid "IPv6-Address"
++msgstr "IPv6-地å€"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6-in-IPv4 (RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6-over-IPv4 (6rd)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6-over-IPv4 (6to4)"
++
++msgid "Identity"
++msgstr "鉴æƒ"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr "用UUIDæ¥æŒ‚载设备"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr "用å·æ ‡æ¥æŒ‚载设备"
++
++msgid "If unchecked, no default route is configured"
++msgstr "留空则ä¸é…置默认路由"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr "留空则忽略所通告的DNSæœåŠ¡å™¨åœ°å€"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"slow process as the swap-device cannot be accessed with the high datarates "
++"of the <abbr title=\"Random Access Memory\">RAM</abbr>."
++msgstr "如果物ç†å†…å­˜ä¸è¶³ï¼Œé—²ç½®æ•°æ®å¯è‡ªåŠ¨ç§»åˆ°äº¤æ¢åŒºæš‚存,以æ高å¯ç”¨å†…存。"
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr "忽略 <code>/etc/hosts</code>"
++
++msgid "Ignore interface"
++msgstr "关闭DHCP"
++
++msgid "Ignore resolve file"
++msgstr "忽略解æžæ–‡ä»¶"
++
++msgid "Image"
++msgstr "固件文件"
++
++msgid "In"
++msgstr "å…¥å£"
++
++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 "活动超时"
++
++msgid "Inbound:"
++msgstr "入站:"
++
++msgid "Info"
++msgstr "ä¿¡æ¯"
++
++msgid "Initscript"
++msgstr "å¯åŠ¨è„šæœ¬"
++
++msgid "Initscripts"
++msgstr "å¯åŠ¨è„šæœ¬"
++
++msgid "Install"
++msgstr "安装"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr "安装iputils-traceroute6以进行IPv6 traceroute"
++
++msgid "Install package %q"
++msgstr "安装软件包%q"
++
++msgid "Install protocol extensions..."
++msgstr "安装扩展åè®®..."
++
++msgid "Installed packages"
++msgstr "已安装软件包"
++
++msgid "Interface"
++msgstr "接å£"
++
++msgid "Interface Configuration"
++msgstr "接å£é…ç½®"
++
++msgid "Interface Overview"
++msgstr "接å£æ€»è§ˆ"
++
++msgid "Interface is reconnecting..."
++msgstr "正在é‡æ–°è¿žæŽ¥æŽ¥å£..."
++
++msgid "Interface is shutting down..."
++msgstr "正在关闭接å£..."
++
++msgid "Interface not present or not connected yet."
++msgstr "接å£ä¸å­˜åœ¨æˆ–未连接"
++
++msgid "Interface reconnected"
++msgstr "接å£å·²é‡æ–°è¿žæŽ¥"
++
++msgid "Interface shut down"
++msgstr "接å£å·²å…³é—­"
++
++msgid "Interfaces"
++msgstr "接å£"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "内部æœåŠ¡å™¨é”™è¯¯"
++
++msgid "Invalid"
++msgstr "无效"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr "无效的VLAN ID! åªæœ‰ %d å’Œ %d 之间的ID有效。"
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "无效的VLAN ID! åªå…许唯一的ID。"
++
++msgid "Invalid username and/or password! Please try again."
++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 "å°†è¦åˆ·æ–°çš„固件与本路由器ä¸å…¼å®¹ï¼Œè¯·é‡æ–°éªŒè¯å›ºä»¶æ–‡ä»¶ã€‚"
++
++msgid "Java Script required!"
++msgstr "需è¦Java Scriptï¼"
++
++msgid "Join Network"
++msgstr "加入网络"
++
++msgid "Join Network: Settings"
++msgstr "加入网络:设置"
++
++msgid "Join Network: Wireless Scan"
++msgstr "加入网络:æœç´¢æ— çº¿"
++
++msgid "Keep settings"
++msgstr "ä¿ç•™é…ç½®"
++
++msgid "Kernel Log"
++msgstr "内核日志"
++
++msgid "Kernel Version"
++msgstr "内核版本"
++
++msgid "Key"
++msgstr "密ç "
++
++msgid "Key #%d"
++msgstr "å¯†ç  #%d"
++
++msgid "Kill"
++msgstr "强制关闭"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "L2TPæœåŠ¡å™¨"
++
++msgid "LCP echo failure threshold"
++msgstr "LCPå“应故障阈值"
++
++msgid "LCP echo interval"
++msgstr "LCPå“应间隔"
++
++msgid "LLC"
++msgstr "LLC"
++
++msgid "Label"
++msgstr "å·æ ‡"
++
++msgid "Language"
++msgstr "语言"
++
++msgid "Language and Style"
++msgstr "语言和界é¢"
++
++msgid "Leaf"
++msgstr "å¶å­"
++
++msgid "Lease validity time"
++msgstr "有效租期"
++
++msgid "Leasefile"
++msgstr "租约文件"
++
++msgid "Leasetime"
++msgstr "租用时间"
++
++msgid "Leasetime remaining"
++msgstr "剩余租期"
++
++msgid "Leave empty to autodetect"
++msgstr "留空则自动探测"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "留空则使用当å‰WAN地å€"
++
++msgid "Legend:"
++msgstr "图例:"
++
++msgid "Limit"
++msgstr "客户数"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr "线路速率"
++
++msgid "Line State"
++msgstr "线路状æ€"
++
++msgid "Link On"
++msgstr "活动链接"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr "将指定的域åDNS解æžè½¬å‘到指定的DNSæœåŠ¡å™¨ï¼ˆæŒ‰ç…§ç¤ºä¾‹å¡«å†™ï¼‰"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "å…许RFC1918å“应的域å列表"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr "å…许虚å‡ç©ºåŸŸåå“应的æœåŠ¡å™¨åˆ—表"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr "监å¬æŒ‡å®šçš„接å£ï¼›æœªæŒ‡å®šåˆ™ç›‘å¬å…¨éƒ¨"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "入站DNS查询端å£"
++
++msgid "Load"
++msgstr "è´Ÿè½½"
++
++msgid "Load Average"
++msgstr "å¹³å‡è´Ÿè½½"
++
++msgid "Loading"
++msgstr "加载中"
++
++msgid "Local IPv4 address"
++msgstr "本地IPv4地å€"
++
++msgid "Local IPv6 address"
++msgstr "本地IPv6地å€"
++
++msgid "Local Startup"
++msgstr "本地å¯åŠ¨è„šæœ¬"
++
++msgid "Local Time"
++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文件的本地域åæ•°æ®"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr "本地域ååŽç¼€å°†æ·»åŠ åˆ°DHCPå’ŒHOSTS文件æ¡ç›®"
++
++msgid "Local server"
++msgstr "本地æœåŠ¡å™¨"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr "如果有多个IPå¯ç”¨ï¼Œåˆ™æ ¹æ®è¯·æ±‚æ¥æºçš„å­ç½‘æ¥æœ¬åœ°åŒ–主机å"
++
++msgid "Localise queries"
++msgstr "本地化查询"
++
++msgid "Locked to channel %d used by: %s"
++msgstr "ä¿¡é“é“已被é”定为 %d,因为该信é“被 %s 使用"
++
++msgid "Log output level"
++msgstr "日志记录等级"
++
++msgid "Log queries"
++msgstr "日志查询"
++
++msgid "Logging"
++msgstr "日志"
++
++msgid "Login"
++msgstr "登录"
++
++msgid "Logout"
++msgstr "退出"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr "网络地å€çš„起始分é…基å€ã€‚"
++
++msgid "MAC-Address"
++msgstr "MAC-地å€"
++
++msgid "MAC-Address Filter"
++msgstr "MAC-地å€è¿‡æ»¤"
++
++msgid "MAC-Filter"
++msgstr "MAC-过滤"
++
++msgid "MAC-List"
++msgstr "MAC-列表"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr "请确认你已ç»å¤åˆ¶è¿‡æ•´ä¸ªæ ¹æ–‡ä»¶ç³»ç»Ÿ,例如使用以下命令:"
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "最高速率"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "å…许的最大DHCP租用数"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "å…许的最大并å‘DNS查询数"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "å…许的最大EDNS.0 UDP报文大å°"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "调制解调器就绪的最大等待时间(秒)"
++
++msgid "Maximum hold time"
++msgstr "最大æŒç»­æ—¶é—´"
++
++msgid "Maximum number of leased addresses."
++msgstr "最大地å€åˆ†é…æ•°é‡ã€‚"
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "内存"
++
++msgid "Memory usage (%)"
++msgstr "内存使用率(%)"
++
++msgid "Metric"
++msgstr "跃点数"
++
++msgid "Minimum Rate"
++msgstr "最低速率"
++
++msgid "Minimum hold time"
++msgstr "最低æŒç»­æ—¶é—´"
++
++msgid "Mirror monitor port"
++msgstr "æ•°æ®åŒ…é•œåƒç›‘å¬ç«¯å£"
++
++msgid "Mirror source port"
++msgstr "æ•°æ®åŒ…é•œåƒæºç«¯å£"
++
++msgid "Missing protocol extension for proto %q"
++msgstr "缺少åè®®%qçš„å议扩展"
++
++msgid "Mode"
++msgstr "模å¼"
++
++msgid "Model"
++msgstr "主机型å·"
++
++msgid "Modem device"
++msgstr "调制解调器节点"
++
++msgid "Modem init timeout"
++msgstr "调制解调器åˆå§‹åŒ–超时"
++
++msgid "Monitor"
++msgstr "监å¬Monitor"
++
++msgid "Mount Entry"
++msgstr "挂载项目"
++
++msgid "Mount Point"
++msgstr "挂载点"
++
++msgid "Mount Points"
++msgstr "挂载点"
++
++msgid "Mount Points - Mount Entry"
++msgstr "挂载点-存储区"
++
++msgid "Mount Points - Swap Entry"
++msgstr "挂载点-交æ¢åŒº"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr "é…置存储设备挂载到文件系统中的ä½ç½®å’Œå‚数。"
++
++msgid "Mount options"
++msgstr "挂载选项"
++
++msgid "Mount point"
++msgstr "挂载点"
++
++msgid "Mounted file systems"
++msgstr "已挂载的文件系统"
++
++msgid "Move down"
++msgstr "下移"
++
++msgid "Move up"
++msgstr "上移"
++
++msgid "Multicast Rate"
++msgstr "多播速率"
++
++msgid "Multicast address"
++msgstr "多播地å€"
++
++msgid "NAS ID"
++msgstr "NAS ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr "NDP-代ç†"
++
++msgid "NTP server candidates"
++msgstr "候选NTPæœåŠ¡å™¨"
++
++msgid "NTP sync time-out"
++msgstr "NTPåŒæ­¥è¶…æ—¶"
++
++msgid "Name"
++msgstr "å称"
++
++msgid "Name of the new interface"
++msgstr "新接å£çš„å称"
++
++msgid "Name of the new network"
++msgstr "新网络的å称"
++
++msgid "Navigation"
++msgstr "导航"
++
++msgid "Netmask"
++msgstr "å­ç½‘掩ç "
++
++msgid "Network"
++msgstr "网络"
++
++msgid "Network Utilities"
++msgstr "网络工具"
++
++msgid "Network boot image"
++msgstr "网络å¯åŠ¨é•œåƒ"
++
++msgid "Network without interfaces."
++msgstr "无接å£çš„网络。"
++
++msgid "Next »"
++msgstr "下一步 »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "本接å£æœªé…ç½®DHCPæœåŠ¡å™¨"
++
++msgid "No chains in this table"
++msgstr "本表中没有链"
++
++msgid "No files found"
++msgstr "未找到文件"
++
++msgid "No information available"
++msgstr "æ— å¯ç”¨ä¿¡æ¯"
++
++msgid "No negative cache"
++msgstr "ç¦ç”¨æ— æ•ˆä¿¡æ¯ç¼“å­˜"
++
++msgid "No network configured on this device"
++msgstr "本设备未é…置网络"
++
++msgid "No network name specified"
++msgstr "未指定网络å"
++
++msgid "No package lists available"
++msgstr "æ— å¯ç”¨è½¯ä»¶åˆ—表"
++
++msgid "No password set!"
++msgstr "未设置密ç ï¼"
++
++msgid "No rules in this chain"
++msgstr "本链没有规则"
++
++msgid "No zone assigned"
++msgstr "未指定区域"
++
++msgid "Noise"
++msgstr "噪声"
++
++msgid "Noise Margin"
++msgstr "噪声容é™"
++
++msgid "Noise:"
++msgstr "噪声:"
++
++msgid "None"
++msgstr "æ— "
++
++msgid "Normal"
++msgstr "正常"
++
++msgid "Not Found"
++msgstr "未找到"
++
++msgid "Not associated"
++msgstr "未关è”"
++
++msgid "Not connected"
++msgstr "未连接"
++
++msgid "Note: Configuration files will be erased."
++msgstr "注æ„:é…置文件将被删除。"
++
++msgid "Notice"
++msgstr "注æ„"
++
++msgid "Nslookup"
++msgstr "Nslookup"
++
++msgid "OK"
++msgstr "OK"
++
++msgid "OPKG-Configuration"
++msgstr "OPKG-é…ç½®"
++
++msgid "Off-State Delay"
++msgstr "关闭时间"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr "é…置网络接å£ä¿¡æ¯ã€‚"
++
++msgid "On-State Delay"
++msgstr "通电时间"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "请指定主机å或MAC地å€ï¼"
++
++msgid "One or more fields contain invalid values!"
++msgstr "一个或多个选项值有误ï¼"
++
++msgid "One or more required fields have no value!"
++msgstr "一个或多个必选项值为空ï¼"
++
++msgid "Open list..."
++msgstr "打开列表..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr "工作频率"
++
++msgid "Option changed"
++msgstr "修改的选项"
++
++msgid "Option removed"
++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 "Options"
++msgstr "选项"
++
++msgid "Other:"
++msgstr "其余:"
++
++msgid "Out"
++msgstr "出å£"
++
++msgid "Outbound:"
++msgstr "出站:"
++
++msgid "Outdoor Channels"
++msgstr "户外频é“"
++
++msgid "Output Interface"
++msgstr "网络出å£"
++
++msgid "Override MAC address"
++msgstr "克隆MAC地å€"
++
++msgid "Override MTU"
++msgstr "设置MTU"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "更新网关"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr "æ›´æ–°å­ç½‘掩ç ã€‚"
++
++msgid "Override the table used for internal routes"
++msgstr "更新内部路由表"
++
++msgid "Overview"
++msgstr "总览"
++
++msgid "Owner"
++msgstr "用户å"
++
++msgid "PAP/CHAP password"
++msgstr "PAP/CHAP密ç "
++
++msgid "PAP/CHAP username"
++msgstr "PAP/CHAP用户å"
++
++msgid "PID"
++msgstr "PID"
++
++msgid "PIN"
++msgstr "PIN"
++
++msgid "PPP"
++msgstr "PPP"
++
++msgid "PPPoA Encapsulation"
++msgstr "PPPoAå°åŒ…"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "需è¦libiwinfo软件包ï¼"
++
++msgid "Package lists are older than 24 hours"
++msgstr "软件包列表已超过24å°æ—¶æœªæ›´æ–°"
++
++msgid "Package name"
++msgstr "软件包å称"
++
++msgid "Packets"
++msgstr "æ•°æ®åŒ…"
++
++msgid "Part of zone %q"
++msgstr "区域 %q"
++
++msgid "Password"
++msgstr "密ç "
++
++msgid "Password authentication"
++msgstr "密ç éªŒè¯"
++
++msgid "Password of Private Key"
++msgstr "ç§æœ‰å¯†é’¥"
++
++msgid "Password successfully changed!"
++msgstr "密ç ä¿®æ”¹æˆåŠŸï¼"
++
++msgid "Path to CA-Certificate"
++msgstr "CAè¯ä¹¦è·¯å¾„"
++
++msgid "Path to Client-Certificate"
++msgstr "客户端è¯ä¹¦è·¯å¾„"
++
++msgid "Path to Private Key"
++msgstr "ç§é’¥è·¯å¾„"
++
++msgid "Path to executable which handles the button event"
++msgstr "处ç†æŒ‰é”®åŠ¨ä½œçš„å¯æ‰§è¡Œæ–‡ä»¶è·¯å¾„"
++
++msgid "Peak:"
++msgstr "峰值:"
++
++msgid "Perform reboot"
++msgstr "执行é‡å¯"
++
++msgid "Perform reset"
++msgstr "执行å¤ä½"
++
++msgid "Phy Rate:"
++msgstr "物ç†é€ŸçŽ‡:"
++
++msgid "Physical Settings"
++msgstr "物ç†è®¾ç½®"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Pkts."
++msgstr "æ•°æ®åŒ…"
++
++msgid "Please enter your username and password."
++msgstr "请输入用户å和密ç ã€‚"
++
++msgid "Policy"
++msgstr "ç­–ç•¥"
++
++msgid "Port"
++msgstr "端å£"
++
++msgid "Port %d"
++msgstr "ç«¯å£ %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr "ç«¯å£ %d 在多个VLAN中å‡æœªå…³è”ï¼"
++
++msgid "Port status:"
++msgstr "端å£çŠ¶æ€ï¼š"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr "在指定数é‡çš„LCPå“应故障åŽå‡å®šé“¾è·¯å·²æ–­å¼€ï¼Œ0为忽略故障"
++
++msgid "Prevents client-to-client communication"
++msgstr "ç¦æ­¢å®¢æˆ·ç«¯é—´é€šä¿¡"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Prism2/2.5/3 802.11b 无线网å¡"
++
++msgid "Proceed"
++msgstr "执行"
++
++msgid "Processes"
++msgstr "系统进程"
++
++msgid "Prot."
++msgstr "åè®®"
++
++msgid "Protocol"
++msgstr "åè®®"
++
++msgid "Protocol family"
++msgstr "åè®®æ—"
++
++msgid "Protocol of the new interface"
++msgstr "新接å£çš„åè®®"
++
++msgid "Protocol support is not installed"
++msgstr "未安装å议支æŒ"
++
++msgid "Provide NTP server"
++msgstr "NTPæœåŠ¡å™¨"
++
++msgid "Provide new network"
++msgstr "添加新网络"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "伪装Ad-Hoc(ahdemo)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "è´¨é‡"
++
++msgid "RTS/CTS Threshold"
++msgstr "RTS/CTS阈值"
++
++msgid "RX"
++msgstr "接收"
++
++msgid "RX Rate"
++msgstr "接收速率"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "MediaTek/RaLink 802.11%s 无线网å¡"
++
++msgid "Radius-Accounting-Port"
++msgstr "Radius 计费端å£"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Radius 计费密钥"
++
++msgid "Radius-Accounting-Server"
++msgstr "Radius 计费æœåŠ¡å™¨"
++
++msgid "Radius-Authentication-Port"
++msgstr "Radius 认è¯ç«¯å£"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Radius 认è¯å¯†é’¥"
++
++msgid "Radius-Authentication-Server"
++msgstr "Radius 认è¯æœåŠ¡å™¨"
++
++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 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."
++msgstr ""
++"确定è¦åˆ é™¤æ­¤æŽ¥å£ï¼Ÿåˆ é™¤æ“作无法撤销ï¼\\\n"
++"删除此接å£ï¼Œå¯èƒ½å¯¼è‡´æ— æ³•å†è®¿é—®è·¯ç”±å™¨ï¼"
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++"确定è¦åˆ é™¤æ­¤æ— çº¿ç½‘络?删除æ“作无法撤销ï¼\\\n"
++"删除此无线网络,å¯èƒ½å¯¼è‡´æ— æ³•å†è®¿é—®è·¯ç”±å™¨ï¼"
++
++msgid "Really reset all changes?"
++msgstr "确定è¦æ”¾å¼ƒæ‰€æœ‰æ›´æ”¹ï¼Ÿ"
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++"确定è¦å…³é—­æŽ¥å£\"%s\" ?\\\n"
++"删除此网络,å¯èƒ½å¯¼è‡´æ— æ³•å†è®¿é—®è·¯ç”±å™¨ï¼"
++
++msgid "Really switch protocol?"
++msgstr "确定è¦åˆ‡æ¢å议?"
++
++msgid "Realtime Connections"
++msgstr "实时连接"
++
++msgid "Realtime Graphs"
++msgstr "实时信æ¯"
++
++msgid "Realtime Load"
++msgstr "实时负载"
++
++msgid "Realtime Traffic"
++msgstr "实时æµé‡"
++
++msgid "Realtime Wireless"
++msgstr "实时无线"
++
++msgid "Rebind protection"
++msgstr "é‡ç»‘定ä¿æŠ¤"
++
++msgid "Reboot"
++msgstr "é‡å¯"
++
++msgid "Rebooting..."
++msgstr "é‡å¯ä¸­..."
++
++msgid "Reboots the operating system of your device"
++msgstr "é‡å¯OpenWrt"
++
++msgid "Receive"
++msgstr "接收"
++
++msgid "Receiver Antenna"
++msgstr "接收天线"
++
++msgid "Reconnect this interface"
++msgstr "é‡è¿žæ­¤æŽ¥å£"
++
++msgid "Reconnecting interface"
++msgstr "é‡è¿žæŽ¥å£ä¸­..."
++
++msgid "References"
++msgstr "引用"
++
++msgid "Regulatory Domain"
++msgstr "无线网络国家区域"
++
++msgid "Relay"
++msgstr "中继"
++
++msgid "Relay Bridge"
++msgstr "中继桥"
++
++msgid "Relay between networks"
++msgstr "网络间中继"
++
++msgid "Relay bridge"
++msgstr "中继桥"
++
++msgid "Remote IPv4 address"
++msgstr "远程IPv4地å€"
++
++msgid "Remove"
++msgstr "移除"
++
++msgid "Repeat scan"
++msgstr "é‡æ–°æ‰«æ"
++
++msgid "Replace entry"
++msgstr "é‡ç½®æ¡ç›®"
++
++msgid "Replace wireless configuration"
++msgstr "é‡ç½®æ— çº¿é…ç½®"
++
++msgid "Request IPv6-address"
++msgstr "请求IPv6地å€"
++
++msgid "Request IPv6-prefix of length"
++msgstr "请求指定长度的IPv6å‰ç¼€"
++
++msgid "Require TLS"
++msgstr "必须使用TLS"
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "æŸäº›ISP需è¦ï¼Œä¾‹å¦‚:åŒè½´çº¿ç½‘络DOCSIS 3"
++
++msgid "Reset"
++msgstr "å¤ä½"
++
++msgid "Reset Counters"
++msgstr "å¤ä½è®¡æ•°å™¨"
++
++msgid "Reset to defaults"
++msgstr "æ¢å¤åˆ°å‡ºåŽ‚设置"
++
++msgid "Resolv and Hosts Files"
++msgstr "HOSTS和解æžæ–‡ä»¶"
++
++msgid "Resolve file"
++msgstr "解æžæ–‡ä»¶"
++
++msgid "Restart"
++msgstr "é‡å¯"
++
++msgid "Restart Firewall"
++msgstr "é‡å¯é˜²ç«å¢™"
++
++msgid "Restore backup"
++msgstr "æ¢å¤é…ç½®"
++
++msgid "Reveal/hide password"
++msgstr "显示/éšè— 密ç "
++
++msgid "Revert"
++msgstr "放弃"
++
++msgid "Root"
++msgstr "Root"
++
++msgid "Root directory for files served via TFTP"
++msgstr "TFTPæœåŠ¡å™¨çš„根目录"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "主机密ç "
++
++msgid "Routes"
++msgstr "路由表"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr "路由表æ述了数æ®åŒ…çš„å¯è¾¾è·¯å¾„。"
++
++msgid "Rule #"
++msgstr "规则 #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr "挂载设备å‰è¿è¡Œæ–‡ä»¶ç³»ç»Ÿæ£€æŸ¥"
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr "SSH访问"
++
++msgid "SSH-Keys"
++msgstr "SSH-密钥"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid "Save"
++msgstr "ä¿å­˜"
++
++msgid "Save & Apply"
++msgstr "ä¿å­˜&应用"
++
++msgid "Save &#38; Apply"
++msgstr "ä¿å­˜&#38;应用"
++
++msgid "Scan"
++msgstr "æœç´¢"
++
++msgid "Scheduled Tasks"
++msgstr "计划任务"
++
++msgid "Section added"
++msgstr "添加的区域"
++
++msgid "Section removed"
++msgstr "移除的区域"
++
++msgid "See \"mount\" manpage for details"
++msgstr "详å‚\"mount\"è”机帮助"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr "定时å‘é€LCPå“应(秒),仅在结åˆäº†æ•…障阈值时有效"
++
++msgid "Separate Clients"
++msgstr "隔离客户端"
++
++msgid "Separate WDS"
++msgstr "隔离WDS"
++
++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 "æœåŠ¡å"
++
++msgid "Service Type"
++msgstr "æœåŠ¡ç±»åž‹"
++
++msgid "Services"
++msgstr "æœåŠ¡"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "设置时间åŒæ­¥"
++
++msgid "Setup DHCP Server"
++msgstr "é…ç½®DHCPæœåŠ¡å™¨"
++
++msgid "Show current backup file list"
++msgstr "显示当å‰æ–‡ä»¶å¤‡ä»½åˆ—表"
++
++msgid "Shutdown this interface"
++msgstr "关闭此接å£"
++
++msgid "Shutdown this network"
++msgstr "关闭此网络"
++
++msgid "Signal"
++msgstr "ä¿¡å·"
++
++msgid "Signal:"
++msgstr "ä¿¡å·:"
++
++msgid "Size"
++msgstr "大å°"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "跳过"
++
++msgid "Skip to content"
++msgstr "跳到内容"
++
++msgid "Skip to navigation"
++msgstr "跳转到导航"
++
++msgid "Slot time"
++msgstr "时隙"
++
++msgid "Software"
++msgstr "软件包"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "一些项目的值无效,无法ä¿å­˜ï¼"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "对ä¸èµ·ï¼Œè¯·æ±‚的目标未找到。"
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "对ä¸èµ·ï¼ŒæœåŠ¡å™¨é‡åˆ°æœªçŸ¥é”™è¯¯ã€‚"
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"抱歉,当å‰ç³»ç»Ÿä¸æ”¯æŒsysupgradeå‡çº§ï¼Œéœ€æ‰‹åŠ¨åˆ·æ–°å›ºä»¶ã€‚请å‚考OpenWrt Wiki中此设"
++"备特定的安装å‘导。"
++
++msgid "Sort"
++msgstr "排åº"
++
++msgid "Source"
++msgstr "æºåœ°å€"
++
++msgid "Source routing"
++msgstr "æºè·¯ç”±"
++
++msgid "Specifies the button state to handle"
++msgstr "指定è¦å¤„ç†çš„按键状æ€"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "指定设备的挂载目录"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "指定<em>Dropbear</em>的监å¬ç«¯å£"
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr "指定å‡è®¾ä¸»æœºå·²ä¸¢å¤±çš„最大失败ARP请求数"
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr "指定å‡è®¾ä¸»æœºå·²ä¸¢å¤±çš„最大时间(秒)"
++
++msgid "Specify the secret encryption key here."
++msgstr "在此指定密钥。"
++
++# å…³è”了 å¯åŠ¨é¡¹ å’Œ 接å£>LAN>DHCPæœåŠ¡å™¨>网å€åˆ†é…基å€
++msgid "Start"
++msgstr "开始"
++
++msgid "Start priority"
++msgstr "å¯åŠ¨ä¼˜å…ˆçº§"
++
++msgid "Startup"
++msgstr "å¯åŠ¨é¡¹"
++
++msgid "Static IPv4 Routes"
++msgstr "é™æ€IPv4路由"
++
++msgid "Static IPv6 Routes"
++msgstr "é™æ€IPv6路由"
++
++msgid "Static Leases"
++msgstr "é™æ€åœ°å€åˆ†é…"
++
++msgid "Static Routes"
++msgstr "é™æ€è·¯ç”±"
++
++msgid "Static WDS"
++msgstr "é™æ€WDS"
++
++msgid "Static address"
++msgstr "é™æ€åœ°å€"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"é™æ€ç§Ÿçº¦ç”¨äºŽç»™DHCP客户端分é…固定的IP地å€å’Œä¸»æœºæ ‡è¯†ã€‚åªæœ‰æŒ‡å®šçš„主机æ‰èƒ½è¿žæŽ¥ï¼Œ"
++"并且接å£é¡»ä¸ºéžåŠ¨æ€é…置。"
++
++msgid "Status"
++msgstr "状æ€"
++
++msgid "Stop"
++msgstr "关闭"
++
++msgid "Strict order"
++msgstr "严谨查åº"
++
++msgid "Submit"
++msgstr "æ交"
++
++msgid "Swap"
++msgstr "交æ¢åŒº"
++
++msgid "Swap Entry"
++msgstr "交æ¢é¡¹ç›®"
++
++msgid "Switch"
++msgstr "交æ¢æœº"
++
++msgid "Switch %q"
++msgstr "交æ¢æœº %q"
++
++msgid "Switch %q (%s)"
++msgstr "交æ¢æœº%q (%s)"
++
++msgid "Switch protocol"
++msgstr "切æ¢åè®®"
++
++msgid "Sync with browser"
++msgstr "åŒæ­¥æµè§ˆå™¨æ—¶é—´"
++
++msgid "Synchronizing..."
++msgstr "åŒæ­¥ä¸­..."
++
++msgid "System"
++msgstr "系统"
++
++msgid "System Log"
++msgstr "系统日志"
++
++msgid "System Properties"
++msgstr "系统属性"
++
++msgid "System log buffer size"
++msgstr "系统日志缓冲区大å°"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "TFTP设置"
++
++msgid "TFTP server root"
++msgstr "TFTPæœåŠ¡å™¨æ ¹ç›®å½•"
++
++msgid "TX"
++msgstr "å‘é€"
++
++msgid "TX Rate"
++msgstr "å‘é€é€ŸçŽ‡"
++
++msgid "Table"
++msgstr "表"
++
++msgid "Target"
++msgstr "对象"
++
++msgid "Terminate"
++msgstr "关闭"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"<em>设备é…ç½®</em>区域å¯é…置无线的硬件å‚数,比如信é“ã€å‘射功率或å‘射天线(如果"
++"此无线模å—硬件支æŒå¤šSSID,则全部SSID共用此设备é…ç½®)。<em>接å£é…ç½®</em>区域则"
++"å¯é…置此网络的工作模å¼å’ŒåŠ å¯†ç­‰ã€‚"
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr "软件包<em>libiwinfo-lua</em>未安装。必需安装此组件以é…置无线ï¼"
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr "HE.net客户端更新设置已ç»è¢«æ”¹å˜,您现在必须使用用户å代替用户ID/"
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr "è¿è¥å•†ç‰¹å®šçš„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>_</"
++"code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"存储器或分区的设备节点,(<abbr title=\"for example\">例如</abbr> <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 ""
++"用于格å¼åŒ–存储器的文件系统,(<abbr title=\"for example\">例如</abbr> "
++"<samp><abbr title=\"Third Extended Filesystem\">ext4</abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"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 "以下更改已æ交"
++
++msgid "The following changes have been reverted"
++msgstr "以下更改已放弃"
++
++msgid "The following rules are currently active on this system."
++msgstr "系统中的活跃连接。"
++
++msgid "The given network name is not unique"
++msgstr "给定的网络åé‡å¤"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr "本机的硬件ä¸æ”¯æŒå¤šSSID,继续进行将会覆盖现有é…置。"
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr "bitæ ¼å¼çš„IPv4å‰ç¼€é•¿åº¦, 其余的用在IPv6地å€."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "bitæ ¼å¼çš„IPv6å‰ç¼€é•¿åº¦"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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\">VLAN</"
++"abbr>也常用于分割ä¸åŒç½‘段。默认通常是一æ¡ä¸Šè¡Œç«¯å£è¿žæŽ¥ISP,其余端å£ä¸ºæœ¬åœ°å­"
++"网。"
++
++msgid "The selected protocol needs a device assigned"
++msgstr "所选的å议需è¦åˆ†é…设备"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr "系统正在删除é…置分区,完æˆåŽä¼šè‡ªåŠ¨é‡å¯ã€‚"
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++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 ""
++
++msgid ""
++"The uploaded image file does not contain a supported format. Make sure that "
++"you choose the generic image format for your platform."
++msgstr "ä¸æ”¯æŒæ‰€ä¸Šä¼ çš„文件格å¼ã€‚请确认选择的文件无误。"
++
++msgid "There are no active leases."
++msgstr "没有已分é…的租约。"
++
++msgid "There are no pending changes to apply!"
++msgstr "没有待生效的更改ï¼"
++
++msgid "There are no pending changes to revert!"
++msgstr "没有å¯æ”¾å¼ƒçš„更改ï¼"
++
++msgid "There are no pending changes!"
++msgstr "没有待生效的更改ï¼"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr "尚未分é…设备,请在\"物ç†è®¾ç½®\"选项å¡ä¸­é€‰æ‹©ç½‘络设备"
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr "尚未设置密ç ã€‚请为root用户设置密ç ä»¥ä¿æŠ¤ä¸»æœºå¹¶å¼€å¯SSH。"
++
++msgid "This IPv4 address of the relay"
++msgstr "中继的IPv4地å€"
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"系统å‡çº§æ—¶è¦ä¿å­˜çš„é…置文件和目录的清å•ã€‚目录/etc/config/内修改过的文件以åŠéƒ¨"
++"分其他é…置会被自动ä¿å­˜ã€‚"
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr "如果更新密钥没有设置的è¯,隧é“çš„\"更新密钥\"或者账户密ç å¿…须填写."
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr "å¯åŠ¨è„šæœ¬æ’入到'exit 0'之å‰å³å¯éšç³»ç»Ÿå¯åŠ¨è¿è¡Œã€‚"
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr "隧é“代ç†åˆ†é…的本地终端地å€ï¼Œé€šå¸¸ä»¥<code>:2</code>结尾"
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"这是内网中唯一的<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>æœåŠ¡å™¨"
++
++msgid "This is the plain username for logging into the account"
++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 "自定义系统crontab中的计划任务。"
++
++msgid ""
++"This is usually the address of the nearest PoP operated by the tunnel broker"
++msgstr "这通常是隧é“代ç†æ‰€ç®¡ç†çš„最近的PoP的地å€"
++
++msgid ""
++"This list gives an overview over currently running system processes and "
++"their status."
++msgstr "系统中正在è¿è¡Œçš„进程和其状æ€ä¿¡æ¯ã€‚"
++
++msgid "This page allows the configuration of custom button actions"
++msgstr "自定义按键动作。"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "活跃的网络连接概况。"
++
++msgid "This section contains no values yet"
++msgstr "尚无任何é…ç½®"
++
++msgid "Time Synchronization"
++msgstr "时间åŒæ­¥"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "尚未é…置时间åŒæ­¥"
++
++msgid "Timezone"
++msgstr "时区"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr "上传备份存档以æ¢å¤é…置。"
++
++msgid "Total Available"
++msgstr "å¯ç”¨æ•°"
++
++msgid "Traceroute"
++msgstr "Traceroute"
++
++msgid "Traffic"
++msgstr "æµé‡"
++
++msgid "Transfer"
++msgstr "传输"
++
++msgid "Transmission Rate"
++msgstr "ä¼ é€é€ŸçŽ‡"
++
++msgid "Transmit"
++msgstr "ä¼ é€"
++
++msgid "Transmit Power"
++msgstr "无线电功率"
++
++msgid "Transmitter Antenna"
++msgstr "ä¼ é€å¤©çº¿"
++
++msgid "Trigger"
++msgstr "触å‘"
++
++msgid "Trigger Mode"
++msgstr "触å‘模å¼"
++
++msgid "Tunnel ID"
++msgstr "隧é“ID"
++
++msgid "Tunnel Interface"
++msgstr "隧é“接å£"
++
++msgid "Tunnel Link"
++msgstr "隧é“链接"
++
++msgid "Tunnel broker protocol"
++msgstr "隧é“åè®®"
++
++msgid "Tunnel setup server"
++msgstr "隧é“é…ç½®æœåŠ¡å™¨"
++
++msgid "Tunnel type"
++msgstr "隧é“类型"
++
++msgid "Turbo Mode"
++msgstr "Turbo模å¼"
++
++msgid "Tx-Power"
++msgstr "传输功率"
++
++msgid "Type"
++msgstr "类型"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "ä»…UMTS(WCDMA)"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "USB设备"
++
++msgid "UUID"
++msgstr "UUID"
++
++msgid "Unable to dispatch"
++msgstr "无法调度"
++
++msgid "Unknown"
++msgstr "未知"
++
++msgid "Unknown Error, password not changed!"
++msgstr "未知错误,密ç æœªæ›´æ”¹ï¼"
++
++msgid "Unmanaged"
++msgstr "ä¸é…ç½®åè®®"
++
++msgid "Unsaved Changes"
++msgstr "未ä¿å­˜çš„é…ç½®"
++
++msgid "Unsupported protocol type."
++msgstr "ä¸æ”¯æŒçš„å议类型"
++
++msgid "Update lists"
++msgstr "刷新列表"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr "上传兼容的sysupgrade固件以刷新当å‰ç³»ç»Ÿã€‚"
++
++msgid "Upload archive..."
++msgstr "上传备份..."
++
++msgid "Uploaded File"
++msgstr "上传的文件"
++
++msgid "Uptime"
++msgstr "è¿è¡Œæ—¶é—´"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "使用<code>/etc/ethers</code>é…ç½®"
++
++msgid "Use DHCP gateway"
++msgstr "使用DHCP网关"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "使用端局通告的DNSæœåŠ¡å™¨"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "å‚考ISO/IEC 3166 alpha2国家代ç ã€‚"
++
++msgid "Use MTU on tunnel interface"
++msgstr "隧é“接å£çš„MTU"
++
++msgid "Use TTL on tunnel interface"
++msgstr "隧é“接å£çš„TTL"
++
++msgid "Use as external overlay (/overlay)"
++msgstr "作为外部overlay使用(/overlay)"
++
++msgid "Use as root filesystem (/)"
++msgstr "作为跟文件系统使用(/)"
++
++msgid "Use broadcast flag"
++msgstr "使用广播标签"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "使用自定义的DNSæœåŠ¡å™¨"
++
++msgid "Use default gateway"
++msgstr "使用默认网关"
++
++msgid "Use gateway metric"
++msgstr "使用网关跃点"
++
++msgid "Use routing table"
++msgstr "使用路由表"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"使用<em>添加</em>æ¥å¢žåŠ æ–°çš„租约æ¡ç›®ã€‚使用<em>MAC-地å€</em>鉴别主机,<em>IPv4-"
++"地å€</em>分é…地å€ï¼Œ<em>主机å</em>分é…标识。"
++
++msgid "Used"
++msgstr "已用"
++
++msgid "Used Key Slot"
++msgstr "å¯ç”¨å¯†ç ç»„"
++
++msgid "User certificate (PEM encoded)"
++msgstr "客户è¯ä¹¦(PEM加密的)"
++
++msgid "User key (PEM encoded)"
++msgstr "客户Key(PEM加密的)"
++
++msgid "Username"
++msgstr "用户å"
++
++msgid "VC-Mux"
++msgstr "VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "VLAN接å£"
++
++msgid "VLANs on %q"
++msgstr "%q上的VLAN"
++
++msgid "VLANs on %q (%s)"
++msgstr "%q (%s)上的VLAN"
++
++msgid "VPN Server"
++msgstr "VPNæœåŠ¡å™¨"
++
++msgid "VPN Server port"
++msgstr "VPNæœåŠ¡å™¨ç«¯å£"
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr "VPNæœåŠ¡å™¨è¯ä¹¦çš„SHA1哈希值"
++
++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 "验è¯"
++
++msgid "Version"
++msgstr "版本"
++
++msgid "WDS"
++msgstr "WDS"
++
++msgid "WEP Open System"
++msgstr "WEP开放认è¯"
++
++msgid "WEP Shared Key"
++msgstr "WEP共享密钥"
++
++msgid "WEP passphrase"
++msgstr "WEP密钥"
++
++msgid "WMM Mode"
++msgstr "WMM多媒体加速"
++
++msgid "WPA passphrase"
++msgstr "WPA密钥"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "警告"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 "频宽"
++
++msgid "Wifi"
++msgstr "无线"
++
++msgid "Wireless"
++msgstr "无线"
++
++msgid "Wireless Adapter"
++msgstr "无线适é…器"
++
++msgid "Wireless Network"
++msgstr "无线网络"
++
++msgid "Wireless Overview"
++msgstr "无线概况"
++
++msgid "Wireless Security"
++msgstr "无线安全"
++
++msgid "Wireless is disabled or not associated"
++msgstr "未开å¯æˆ–未关è”无线"
++
++msgid "Wireless is restarting..."
++msgstr "é‡å¯æ— çº¿ä¸­..."
++
++msgid "Wireless network is disabled"
++msgstr "无线已ç¦ç”¨"
++
++msgid "Wireless network is enabled"
++msgstr "无线网络开关"
++
++msgid "Wireless restarted"
++msgstr "无线已é‡å¯"
++
++msgid "Wireless shut down"
++msgstr "无线已关闭"
++
++msgid "Write received DNS requests to syslog"
++msgstr "将收到的DNS请求写入系统日志"
++
++msgid "XR Support"
++msgstr "XR支æŒ"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"å¯ç”¨æˆ–ç¦ç”¨å·²å®‰è£…çš„å¯åŠ¨è„šæœ¬ã€‚更改在设备é‡å¯åŽç”Ÿæ•ˆã€‚<br /><strong>警告:如果ç¦"
++"用了必è¦çš„å¯åŠ¨è„šæœ¬ï¼Œæ¯”如\"network\",å¯èƒ½ä¼šå¯¼è‡´è®¾å¤‡æ— æ³•è®¿é—®ï¼</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr "LUCI的正常è¿è¡Œéœ€è¦å¼€å¯æµè§ˆå™¨çš„Java Script支æŒã€‚"
++
++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å·²ç»è€åˆ°æ— æ³•æ­£å¸¸æ˜¾ç¤ºè¿™ä¸ªé¡µé¢äº†!请至少更新到IE7或者使用诸"
++"如Firefox Opera Safari之类的æµè§ˆå™¨."
++
++msgid "any"
++msgstr "ä»»æ„"
++
++msgid "auto"
++msgstr "自动"
++
++msgid "automatic"
++msgstr "自动"
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "桥接的"
++
++msgid "create:"
++msgstr "创建:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "为指定接å£åˆ›å»ºæ¡¥æŽ¥"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "ç¦ç”¨"
++
++msgid "disabled"
++msgstr "å·²ç¦ç”¨"
++
++msgid "expired"
++msgstr "过期时间"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"存放<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>租约的文件"
++
++msgid "forward"
++msgstr "转å‘"
++
++msgid "full-duplex"
++msgstr "å…¨åŒå·¥"
++
++msgid "half-duplex"
++msgstr "åŠåŒå·¥"
++
++msgid "help"
++msgstr "帮助"
++
++msgid "hidden"
++msgstr "éšè—"
++
++msgid "hybrid mode"
++msgstr "æ··åˆæ¨¡å¼"
++
++msgid "if target is a network"
++msgstr "如果对象是一个网络"
++
++msgid "input"
++msgstr "输入"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "no"
++
++msgid "no link"
++msgstr "未连接"
++
++msgid "none"
++msgstr "æ— "
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "å…³"
++
++msgid "on"
++msgstr "å¼€"
++
++msgid "open"
++msgstr "开放å¼"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr "中继模å¼"
++
++msgid "routed"
++msgstr "已路由"
++
++msgid "server mode"
++msgstr "æœåŠ¡å™¨æ¨¡å¼"
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "å…³è”"
++
++msgid "unknown"
++msgstr "未知"
++
++msgid "unlimited"
++msgstr "æ— é™åˆ¶"
++
++msgid "unspecified"
++msgstr "未指定"
++
++msgid "unspecified -or- create:"
++msgstr "未指定 // 创建:"
++
++msgid "untagged"
++msgstr "ä¸å…³è”"
++
++msgid "yes"
++msgstr "是"
++
++msgid "« Back"
++msgstr "« åŽé€€"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "在PPP链路上å¯ç”¨IPv6å商"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "忽略HOSTS文件"
++
++#~ msgid "Path"
++#~ msgstr "路径"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "请ç¨ç­‰ï¼šè®¾å¤‡é‡å¯ä¸­..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr "警告: 有尚未ä¿å­˜çš„更改,é‡å¯å°†ä¸¢å¤±!"
++
++#~ msgid "CPU frequency"
++#~ msgstr "CPU 频率"
++
++#~ msgid "Chip Model"
++#~ msgstr "芯片型å·"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr "强制å¯ç”¨40MHz频宽并忽略辅助信é“é‡å ã€‚此选项ä¸å…¼å®¹IEEE 802.11n-2009!"
++
++#~ msgid "Cached"
++#~ msgstr "已缓存"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr "设置挂载为extroot"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "强制40MHz频宽"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "跳频"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "ä¿¡é“å·²é”定为:%d ï¼›æºäºŽ:%s "
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "设置为根文件系统"
++
++#~ msgid "Ad-hoc mode"
++#~ msgstr "Ad-hoc模å¼"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "HE.net用户ID"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr "这是32 byte hexç¼–ç çš„用户ID,ä¸æ˜¯ç™»å½•å"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz HT40+ (ä»…1-7频é“å¯ç”¨ï¼‰"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz HT40- (ä»…5-13频é“å¯ç”¨ï¼‰"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "接收路由通告"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "在网络上通告IPv6"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "通告的网络ID"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "å…许的范围:1 到 65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "HT功能"
++
++#~ msgid "HT mode"
++#~ msgstr "HT模å¼"
++
++#~ msgid "Router Model"
++#~ msgstr "主机型å·"
++
++#~ msgid "Router Name"
++#~ msgstr "系统å称"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "å‘é€è·¯ç”±è¯·æ±‚"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr "指定通告的首选å‰ç¼€ç”Ÿå­˜æ—¶é—´(秒)"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr "指定通告的有效å‰ç¼€ç”Ÿå­˜æ—¶é—´(秒)"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "使用首选生存时间"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "使用有效生存时间"
++
++#~ msgid "Waiting for router..."
++#~ msgstr "等待路由器..."
++
++#~ msgid "Enable builtin NTP server"
++#~ msgstr "å¼€å¯å†…ç½®NTPæœåŠ¡å™¨"
++
++#~ msgid "Active Leases"
++#~ msgstr "活动的租约"
++
++#~ msgid "Open"
++#~ msgstr "打开"
++
++#~ msgid "KB"
++#~ msgstr "KB"
++
++#~ msgid "Bit Rate"
++#~ msgstr "比特率"
++
++#~ msgid "Configuration / Apply"
++#~ msgstr "设置 /应用"
++
++#~ msgid "Configuration / Changes"
++#~ msgstr "设置 / 修改"
++
++#~ msgid "Configuration / Revert"
++#~ msgstr "设置 / é‡ç½®"
++
++#~ msgid "MAC"
++#~ msgstr "MAC"
++
++#~ msgid "MAC Address"
++#~ msgstr "MAC地å€"
++
++#~ msgid "<abbr title=\"Encrypted\">Encr.</abbr>"
++#~ msgstr "<abbr title=\"Encrypted\">加密</abbr>"
++
++#~ msgid "<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"
++#~ msgstr "æœç´¢<abbr title=\"Wireless Local Area Network\">WLAN</abbr>"
++
++#~ msgid ""
++#~ "Choose the network you want to attach to this wireless interface. Select "
++#~ "<em>unspecified</em> to not attach any network or fill out the "
++#~ "<em>create</em> field to define a new network."
++#~ msgstr ""
++#~ "请选择你需è¦é“¾æŽ¥åˆ°æ— çº¿ç½‘络接å£çš„网络. 如果ä¸é“¾æŽ¥åˆ°ä»»ä½•ç½‘络请选择 <em>未指"
++#~ "定</em>,如果需è¦åˆ›å»ºæ–°ç½‘络请点<em>创建</em>."
++
++#~ msgid "Create Network"
++#~ msgstr "创建一个网络"
++
++#~ msgid "Link"
++#~ msgstr "链接"
++
++#~ msgid "Networks"
++#~ msgstr "网络"
++
++#~ msgid "Power"
++#~ msgstr "Power"
++
++#~ msgid "Wifi networks in your local environment"
++#~ msgstr "扫æ到的无线热点"
++
++#~ msgid ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++#~ msgstr ""
++#~ "<abbr title=\"Classless Inter-Domain Routing\">CIDR</abbr>-Notation: "
++#~ "address/prefix"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Server"
++#~ msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-æœåŠ¡å™¨"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Broadcast"
++#~ msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-广播"
++
++#~ msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address"
++#~ msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-地å€"
++
++#~ msgid "IP-Aliases"
++#~ msgstr "IP-Aliases"
++
++#~ msgid "IPv6 Setup"
++#~ msgstr "IPv6 设置"
++
++#~ msgid ""
++#~ "Note: If you choose an interface here which is part of another network, "
++#~ "it will be moved into this network."
++#~ msgstr ""
++#~ "注æ„:当你选择一个已ç»å­˜åœ¨ä¸Žä¸€ä¸ªç½‘络中的接å£æ—¶ï¼Œå®ƒå°†ä¼šè¢«ç§»é™¤é‚£ä¸ªç½‘络。"
++
++#~ msgid ""
++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might "
++#~ "lose access to this router if you are connected via this interface."
++#~ msgstr ""
++#~ "Really delete this interface? The deletion cannot be undone!\n"
++#~ "You might lose access to this router if you are connected via this "
++#~ "interface."
++
++#~ msgid ""
++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou "
++#~ "might lose access to this router if you are connected via this network."
++#~ msgstr ""
++#~ "Really delete this wireless network? The deletion cannot be undone!\n"
++#~ "You might lose access to this router if you are connected via this "
++#~ "network."
++
++#~ msgid ""
++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router "
++#~ "if you are connected via this interface."
++#~ msgstr ""
++#~ "Really shutdown interface \"%s\" ?\n"
++#~ "You might lose access to this router if you are connected via this "
++#~ "interface."
++
++#~ msgid ""
++#~ "Really shutdown network ?\\nYou might lose access to this router if you "
++#~ "are connected via this interface."
++#~ msgstr ""
++#~ "Really shutdown network ?\n"
++#~ "You might lose access to this router if you are connected via this "
++#~ "interface."
++
++#~ msgid ""
++#~ "The network ports on your router can be combined to several <abbr title="
++#~ "\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++#~ "communicate directly with each other. <abbr title=\"Virtual Local Area "
++#~ "Network\">VLAN</abbr>s are often used to separate different network "
++#~ "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"
++#~ "\">VLAN</abbr>也常用于分割ä¸åŒç½‘段;默认通常是一æ¡ä¸Šä¼ ç«¯å£è¿žæŽ¥ISP,其余端"
++#~ "å£ä¸ºæœ¬åœ°å­ç½‘。"
++
++#~ msgid "Enable buffering"
++#~ msgstr "å¼€å¯ç¼“冲"
++
++#~ msgid "IPv6-over-IPv4"
++#~ msgstr "IPv6-over-IPv4"
++
++#~ msgid "Custom Files"
++#~ msgstr "自定义文件"
++
++#~ msgid "Custom files"
++#~ msgstr "自定义文件"
++
++#~ msgid "Detected Files"
++#~ msgstr "查询到的文件"
++
++#~ msgid "Detected files"
++#~ msgstr "查询到的文件"
++
++#~ msgid "Files to be kept when flashing a new firmware"
++#~ msgstr "更新固件时被ä¿å­˜çš„文件"
++
++#~ msgid "General"
++#~ msgstr "基本信æ¯"
++
++#~ msgid ""
++#~ "Here you can customize the settings and the functionality of <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "这里å¯ä»¥è‡ªå®šä¹‰<abbr title=\"Lua Configuration Interface\">LuCI</abbr>的组"
++#~ "件和功能。"
++
++#~ msgid "Post-commit actions"
++#~ msgstr "Post-commitæ“作"
++
++#~ msgid ""
++#~ "The following files are detected by the system and will be kept "
++#~ "automatically during sysupgrade"
++#~ msgstr "更新固件时è¦ä¿å­˜çš„文件"
++
++#~ msgid ""
++#~ "These commands will be executed automatically when a given <abbr title="
++#~ "\"Unified Configuration Interface\">UCI</abbr> configuration is committed "
++#~ "allowing changes to be applied instantly."
++#~ msgstr ""
++#~ "当<abbr title=\"Unified Configuration Interface\">UCI</abbr>é…ç½®æ交并生效"
++#~ "åŽï¼Œè¿™äº›å‘½ä»¤å°†è¢«è‡ªåŠ¨æ‰§è¡Œã€‚"
++
++#~ msgid ""
++#~ "This is a list of shell glob patterns for matching files and directories "
++#~ "to include during sysupgrade"
++#~ msgstr "系统å‡çº§æ—¶è¦ä¿å­˜çš„é…置文件以åŠç›®å½•çš„串列清å•"
++
++#~ msgid "Web <abbr title=\"User Interface\">UI</abbr>"
++#~ msgstr "Web <abbr title=\"User Interface\">UI</abbr>"
++
++#~ msgid "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"
++#~ msgstr ""
++#~ "<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-æœåŠ¡å™¨"
++
++#~ msgid "AHCP Settings"
++#~ msgstr "AHCP设置"
++
++#~ msgid "ARP ping retries"
++#~ msgstr "é‡è¯•ARP ping"
++
++#~ msgid "ATM Settings"
++#~ msgstr "ATM设置"
++
++#~ msgid "Accept Router Advertisements"
++#~ msgstr "接收路由公告"
++
++#~ msgid "Access point (APN)"
++#~ msgstr "接入点(APN)"
++
++#~ msgid "Additional pppd options"
++#~ msgstr "附加pppd选项"
++
++#~ msgid "Allowed range is 1 to FFFF"
++#~ msgstr "å…许范围:1 ~ FFFF"
++
++#~ msgid "Automatic Disconnect"
++#~ msgstr "自动断开"
++
++#~ msgid "Backup Archive"
++#~ msgstr "备份的存档"
++
++#~ msgid ""
++#~ "Configure the local DNS server to use the name servers adverticed by the "
++#~ "PPP peer"
++#~ msgstr "本地DNSæœåŠ¡å™¨ä½¿ç”¨PPP端局æ供的域åæœåŠ¡å™¨"
++
++#~ msgid "Connect script"
++#~ msgstr "连接脚本"
++
++#~ msgid "Create backup"
++#~ msgstr "创建备份"
++
++#~ msgid "Default"
++#~ msgstr "默认"
++
++#~ msgid "Disconnect script"
++#~ msgstr "断开脚本"
++
++#~ msgid "Edit package lists and installation targets"
++#~ msgstr "修改软件包的åŒæ­¥æºå’Œå®‰è£…地å€"
++
++#~ msgid "Enable 4K VLANs"
++#~ msgstr "å¼€å¯4K VLAN"
++
++#~ msgid "Enable IPv6 on PPP link"
++#~ msgstr "在PPP链路上å¯ç”¨IPv6"
++
++#~ msgid "Firmware image"
++#~ msgstr "固件文件"
++
++#~ msgid "Forward DHCP"
++#~ msgstr "转å‘DHCP"
++
++#~ msgid "Forward broadcasts"
++#~ msgstr "转å‘广播"
++
++#~ msgid "HE.net Tunnel ID"
++#~ msgstr "HE.net隧é“ID"
++
++#~ msgid ""
++#~ "Here you can backup and restore your router configuration and - if "
++#~ "possible - reset the router to the default settings."
++#~ msgstr "这里å¯ä»¥å¤‡ä»½å’Œæ¢å¤è·¯ç”±å™¨çš„é…置,也å¯ä»¥æ¢å¤åˆ°ç³»ç»Ÿå‡ºåŽ‚设置。"
++
++#~ msgid "Installation targets"
++#~ msgstr "安装ä½ç½®"
++
++#~ msgid "Keep configuration files"
++#~ msgstr "ä¿ç•™é…置文件"
++
++#~ msgid "Keep-Alive"
++#~ msgstr "ä¿æŒæ´»åŠ¨"
++
++#~ msgid "Kernel"
++#~ msgstr "内核"
++
++#~ msgid ""
++#~ "Let pppd replace the current default route to use the PPP interface after "
++#~ "successful connect"
++#~ msgstr "PPP连接æˆåŠŸåŽæ›¿æ¢å½“å‰é»˜è®¤è·¯ç”±ä¸ºpppd"
++
++#~ msgid "Let pppd run this script after establishing the PPP link"
++#~ msgstr "PPP连接建立åŽè¿è¡Œæ­¤è„šæœ¬"
++
++#~ msgid "Let pppd run this script before tearing down the PPP link"
++#~ msgstr "PPP连接断开å‰è¿è¡Œæ­¤è„šæœ¬"
++
++#~ msgid ""
++#~ "Make sure that you provide the correct pin code here or you might lock "
++#~ "your sim card!"
++#~ msgstr "请确认pinç æ­£ç¡®ï¼Œå¹¶ä¸”没有é”定simå¡ï¼"
++
++#~ msgid ""
++#~ "Most of them are network servers, that offer a certain service for your "
++#~ "device or network like shell access, serving webpages like <abbr title="
++#~ "\"Lua Configuration Interface\">LuCI</abbr>, doing mesh routing, sending "
++#~ "e-mails, ..."
++#~ msgstr ""
++#~ "这些大部分是为设备或网络æ供特定æœåŠ¡çš„,比如shell访问,<abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr> App,网间漫游,å‘é€E-mailç­‰..."
++
++#~ msgid "Number of failed connection tests to initiate automatic reconnect"
++#~ msgstr "å¯åŠ¨è‡ªåŠ¨é‡è¿žçš„失败连接次数"
++
++#~ msgid "Override Gateway"
++#~ msgstr "更新网关"
++
++#~ msgid "PIN code"
++#~ msgstr "PINç "
++
++#~ msgid "PPP Settings"
++#~ msgstr "PPP设置"
++
++#~ msgid "Package lists"
++#~ msgstr "软件åŒæ­¥æº"
++
++#~ msgid ""
++#~ "Port <abbr title=\"Primary VLAN IDs\">PVIDs</abbr> specify the default "
++#~ "VLAN ID added to received untagged frames."
++#~ msgstr ""
++#~ "端å£çš„<abbr title=\"Primary VLAN IDs\">PVID</abbr>指定了添加到所接收的未标"
++#~ "记桢的默认VLAN ID。"
++
++#~ msgid "Port PVIDs on %q"
++#~ msgstr "分é…%q的端å£PVID"
++
++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?"
++#~ msgstr "放弃所有é…置并将路由å¤ä½åˆ°é»˜è®¤çŠ¶æ€ï¼Ÿ"
++
++#~ msgid "Processor"
++#~ msgstr "处ç†å™¨"
++
++#~ msgid "Radius-Port"
++#~ msgstr "Radius-端å£"
++
++#~ msgid "Radius-Server"
++#~ msgstr "Radius-æœåŠ¡å™¨"
++
++#~ msgid ""
++#~ "Really shutdown network ?\\nYou might loose access to this router if you "
++#~ "are connected via this interface."
++#~ msgstr ""
++#~ "真的è¦å…³é—­æ­¤ç½‘络?\n"
++#~ "如果正由此网络管ç†è·¯ç”±ï¼Œå¯èƒ½å¯¼è‡´æ— æ³•å†ç®¡ç†è·¯ç”±å™¨ï¼"
++
++#~ msgid "Relay Settings"
++#~ msgstr "中继设置"
++
++#~ msgid "Replace default route"
++#~ msgstr "é‡ç½®é»˜è®¤è·¯ç”±"
++
++#~ msgid "Reset router to defaults"
++#~ msgstr "æ¢å¤å‡ºåŽ‚设置"
++
++#~ msgid "Routing table ID"
++#~ msgstr "路由表ID"
++
++#~ msgid ""
++#~ "Seconds to wait for the modem to become ready before attempting to connect"
++#~ msgstr "Modemå°è¯•è¿žæŽ¥çš„就绪准备时间"
++
++#~ msgid "Send Router Solicitiations"
++#~ msgstr "å‘é€è·¯ç”±æŽ¢æµ‹"
++
++#~ msgid "Server IPv4-Address"
++#~ msgstr "æœåŠ¡å™¨IPv4-地å€"
++
++#~ msgid "Service type"
++#~ msgstr "æœåŠ¡ç±»åž‹"
++
++#~ msgid "Services and daemons perform certain tasks on your device."
++#~ msgstr "路由器上è¿è¡Œçš„部分任务和æœåŠ¡ã€‚"
++
++#~ msgid "Settings"
++#~ msgstr "设置"
++
++#~ msgid "Setup wait time"
++#~ msgstr "设置缓冲时间"
++
++#~ msgid ""
++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.<br /> "
++#~ "You need to manually flash your device."
++#~ msgstr "抱歉,OpenWrtä¸æ”¯æŒæœ¬å¹³å°çš„系统å‡çº§ã€‚<br />请手动刷新设备。"
++
++#~ msgid "Specify additional command line arguments for pppd here"
++#~ msgstr "指定附加命令行å‚数到pppd"
++
++#~ msgid "TTL"
++#~ msgstr "TTL"
++
++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0"
++#~ msgstr "modem的设备节点。例如/dev/ttyUSB0"
++
++#~ msgid "Time (in seconds) after which an unused connection will be closed"
++#~ msgstr "自动关闭空闲连接的延迟时间(秒)"
++
++#~ msgid "Time Server (rdate)"
++#~ msgstr "æ ¡æ—¶æœåŠ¡å™¨(rdate)"
++
++#~ msgid "Tunnel Settings"
++#~ msgstr "隧é“设置"
++
++#~ msgid "Update package lists"
++#~ msgstr "更新软件列表"
++
++#~ msgid "Upload an OpenWrt image file to reflash the device."
++#~ msgstr "上传OpenWrt固件以刷新设备。"
++
++#~ msgid "Upload image"
++#~ msgstr "上传固件"
++
++#~ msgid "Use peer DNS"
++#~ msgstr "使用对等DNS"
++
++#~ msgid "VLAN %d"
++#~ msgstr "VLAN %d"
++
++#~ msgid ""
++#~ "You can specify multiple DNS servers here, press enter to add a new "
++#~ "entry. Servers entered here will override automatically assigned ones."
++#~ msgstr "这里å¯ä»¥æŒ‡å®šå¤šè·¯DNSæœåŠ¡å™¨ã€‚输入åŽä¼šè‡ªåŠ¨è¦†ç›–已分é…çš„æ¡ç›®ã€‚"
++
++#~ msgid ""
++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, "
++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support"
++#~ msgstr ""
++#~ "UMTS/GPRS功能需安装\"comgt\",PPPoE需安装\"ppp-mod-pppoe\",PPPoA需安装"
++#~ "\"ppp-mod-pppoa\",PPtP需安装\"pptp\"。"
++
++#~ msgid "back"
++#~ msgstr "åŽé€€"
++
++#~ msgid "buffered"
++#~ msgstr "已缓冲"
++
++#~ msgid "cached"
++#~ msgstr "已缓存"
++
++#~ msgid "free"
++#~ msgstr "空闲"
++
++#~ msgid "static"
++#~ msgstr "é™æ€"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a collection "
++#~ "of free Lua software including an <abbr title=\"Model-View-Controller"
++#~ "\">MVC</abbr>-Webframework and webinterface for embedded devices. <abbr "
++#~ "title=\"Lua Configuration Interface\">LuCI</abbr> is licensed under the "
++#~ "Apache-License."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr>是一款嵌入å¼è®¾å¤‡ä½¿"
++#~ "用的å…è´¹Lua软件,包å«web框架和webç•Œé¢ã€‚<abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>éµå¾ªApache-License."
++
++#~ msgid "<abbr title=\"Secure Shell\">SSH</abbr>-Keys"
++#~ msgstr "<abbr title=\"Secure Shell\">SSH</abbr>-密钥"
++
++#~ msgid ""
++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve "
++#~ "LuCI"
++#~ msgstr "一个用C语言和Lua实现的æœåŠ¡äºŽLuCIçš„è½»é‡çº§ HTTP/1.1 webæœåŠ¡å™¨ã€‚"
++
++#~ msgid ""
++#~ "A small webserver which can be used to serve <abbr title=\"Lua "
++#~ "Configuration Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "一个用于<abbr title=\"Lua Configuration Interface\">LuCI</abbr>çš„å°åž‹webæœ"
++#~ "务器。"
++
++#~ msgid "About"
++#~ msgstr "关于"
++
++#~ msgid "Active IP Connections"
++#~ msgstr "活动IP连接"
++
++#~ msgid "Addresses"
++#~ msgstr "地å€"
++
++#~ msgid "Admin Password"
++#~ msgstr "管ç†å¯†ç "
++
++#~ msgid "Alias"
++#~ msgstr "别å"
++
++#~ msgid "Authentication Realm"
++#~ msgstr "验è¯èŒƒå›´"
++
++#~ msgid "Bridge Port"
++#~ msgstr "桥接端å£"
++
++#~ msgid ""
++#~ "Change the password of the system administrator (User <code>root</code>)"
++#~ msgstr "修改管ç†å‘˜å¯†ç "
++
++#~ msgid "Client + WDS"
++#~ msgstr "客户端+WDS"
++
++#~ msgid "Configuration file"
++#~ msgstr "é…置文件"
++
++#~ msgid "Connection timeout"
++#~ msgstr "连接超时"
++
++#~ msgid "Contributing Developers"
++#~ msgstr "特别致谢"
++
++#~ msgid "DHCP assigned"
++#~ msgstr "DHCP有效分é…"
++
++#~ msgid "Document root"
++#~ msgstr "根文档"
++
++#~ msgid "Enable Keep-Alive"
++#~ msgstr "å¼€å¯ä¿æŒæ´»åŠ¨"
++
++#~ msgid "Enable device"
++#~ msgstr "å¼€å¯è®¾å¤‡"
++
++#~ msgid "Ethernet Bridge"
++#~ msgstr "以太网桥"
++
++#~ msgid ""
++#~ "Here you can paste public <abbr title=\"Secure Shell\">SSH</abbr>-Keys "
++#~ "(one per line) for <abbr title=\"Secure Shell\">SSH</abbr> public-key "
++#~ "authentication."
++#~ msgstr ""
++#~ "这里å¯ä»¥ç²˜è´´å…¬ç”¨<abbr title=\"Secure Shell\">SSH</abbr>密钥以用于<abbr "
++#~ "title=\"Secure Shell\">SSH</abbr>公共密钥认è¯(æ¯è¡Œä¸€ä¸ªå¯†é’¥)。"
++
++#~ msgid "ID"
++#~ msgstr "ID"
++
++#~ msgid "IP Configuration"
++#~ msgstr "IP设置"
++
++#~ msgid "Interface Status"
++#~ msgstr "接å£çŠ¶æ€"
++
++#~ msgid "Lead Development"
++#~ msgstr "å¼€å‘å‘导"
++
++#~ msgid "Master"
++#~ msgstr "Master"
++
++#~ msgid "Master + WDS"
++#~ msgstr "Master + WDS"
++
++#~ msgid "No address configured on this interface."
++#~ msgstr "本接å£æœªè®¾ç½®åœ°å€"
++
++#~ msgid "Not configured"
++#~ msgstr "未设置"
++
++#~ msgid "Password successfully changed"
++#~ msgstr "密ç å·²ä¿®æ”¹"
++
++#~ msgid "Plugin path"
++#~ msgstr "æ’件路径"
++
++#~ msgid "Ports"
++#~ msgstr "端å£"
++
++#~ msgid "Primary"
++#~ msgstr "主è¦çš„"
++
++#~ msgid "Project Homepage"
++#~ msgstr "项目主页"
++
++#~ msgid "Pseudo Ad-Hoc"
++#~ msgstr "伪装Ad-Hoc"
++
++#~ msgid "STP"
++#~ msgstr "STP"
++
++#~ msgid "Thanks To"
++#~ msgstr "æ„Ÿè°¢"
++
++#~ msgid ""
++#~ "The realm which will be displayed at the authentication prompt for "
++#~ "protected pages."
++#~ msgstr "在有æ示验è¯ä¿æŠ¤çš„网页时显示验è¯èŒƒå›´ã€‚"
++
++#~ msgid "Unknown Error"
++#~ msgstr "未知错误"
++
++#~ msgid "VLAN"
++#~ msgstr "VLAN"
++
++#~ msgid "defaults to <code>/etc/httpd.conf</code>"
++#~ msgstr "默认为<code>/etc/httpd.conf</code>"
++
++#~ msgid "Enable this switch"
++#~ msgstr "å¼€å¯äº¤æ¢æœº"
++
++#~ msgid "OPKG error code %i"
++#~ msgstr "OPKG å‡ºé”™ä»£ç  %i"
++
++#~ msgid "Package lists updated"
++#~ msgstr "更新软件包列表"
++
++#~ msgid "Reset switch during setup"
++#~ msgstr "设置时å¤ä½äº¤æ¢æœº"
++
++#~ msgid "Upgrade installed packages"
++#~ msgstr "å‡çº§å·²å®‰è£…软件"
++
++#~ msgid "<abbr title=\"Domain Name System\">DNS</abbr>-Port"
++#~ msgstr "<abbr title=\"Domain Name System\">DNS</abbr>-端å£"
++
++#~ msgid ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr> is a free, "
++#~ "flexible, and user friendly graphical interface for configuring OpenWrt "
++#~ "Kamikaze."
++#~ msgstr ""
++#~ "<abbr title=\"Lua Configuration Interface\">LuCI</abbr>是一个å…费的,çµæ´»"
++#~ "的,å¯è§†åŒ–的用户界é¢ï¼Œå¯ç”¨æ¥é…ç½®OpenWrt。"
++
++#~ msgid "AP-Isolation"
++#~ msgstr "AP隔离"
++
++#~ msgid "Active IPv4-Routes"
++#~ msgstr "活动的IPv4链路"
++
++#~ msgid "adds domain names to hostentries in the resolv file"
++#~ msgstr "添加域åæ¡ç›®åˆ°ä¸»æœºè§£æžæ–‡ä»¶"
++
++#~ msgid "Add the Wifi network to physical network"
++#~ msgstr "添加无线网络到物ç†ç½‘络"
++
++#~ msgid ""
++#~ "Also kernel or service logfiles can be viewed here to get an overview "
++#~ "over their current state."
++#~ msgstr "这里显示了系统日志,å¯ä»¥äº†è§£ç³»ç»Ÿå½“å‰çš„è¿è¡ŒçŠ¶æ€ã€‚"
++
++#~ msgid "And now have fun with your router!"
++#~ msgstr "现在开始体验路由带æ¥çš„ä¹è¶£å§!"
++
++#~ msgid ""
++#~ "As we always want to improve this interface we are looking forward to "
++#~ "your feedback and suggestions."
++#~ msgstr "我们一直在努力æå‡ç•Œé¢æ•ˆæžœï¼Œå¹¶æœŸå¾…ç€æ‚¨çš„æ„è§ä¸Žå»ºè®®ã€‚"
++
++#~ msgid "Attach to existing network"
++#~ msgstr "连接现有网络"
++
++#~ msgid "Clamp Segment Size"
++#~ msgstr "固定段大å°"
++
++#~ msgid "Configuration applied"
++#~ msgstr "设置已应用"
++
++#~ msgid "Create Or Attach Network"
++#~ msgstr "创建/连接 网络"
++
++#~ msgid "Devices"
++#~ msgstr "设备"
++
++#~ msgid "enable"
++#~ msgstr "å¯ç”¨"
++
++#~ msgid "Errors"
++#~ msgstr "错误"
++
++#~ msgid "Essentials"
++#~ msgstr "概è¦"
++
++#~ msgid ""
++#~ "Fixes problems with unreachable websites, submitting forms or other "
++#~ "unexpected behaviour for some ISPs."
++#~ msgstr "ä¿®å¤æŸäº›ISPçš„ä¸å¯è¾¾ç½‘站或其他未知错误"
++
++#~ msgid ""
++#~ "filter useless <abbr title=\"Domain Name System\">DNS</abbr>-queries of "
++#~ "Windows-systems"
++#~ msgstr ""
++#~ "过滤无用的<abbr title=\"Domain Name System\">DNS</abbr>Windows-systems查询"
++
++#~ msgid "Hardware Address"
++#~ msgstr "硬件地å€"
++
++#~ msgid "Hello!"
++#~ msgstr "Hello!"
++
++#~ msgid "Here you can configure installed wifi devices."
++#~ msgstr "这里å¯ä»¥é…置已安装的无线设备。"
++
++#~ msgid ""
++#~ "Here you can find information about the current system status like <abbr "
++#~ "title=\"Central Processing Unit\">CPU</abbr> clock frequency, memory "
++#~ "usage or network interface data."
++#~ msgstr ""
++#~ "这里å¯ä»¥æŸ¥çœ‹ç³»ç»Ÿå½“å‰çš„状æ€ä¿¡æ¯ï¼Œæ¯”如<abbr title=\"Central Processing Unit"
++#~ "\">CPU</abbr>频率ã€å†…存使用率或网络链接数æ®ã€‚"
++
++#~ msgid ""
++#~ "If the interface is attached to an existing network it will be "
++#~ "<em>bridged</em> to the existing interfaces and is covered by the "
++#~ "firewall zone of the choosen network.<br />Uncheck the attach option to "
++#~ "define a new standalone network for this interface."
++#~ msgstr ""
++#~ "如果连接在已有网络,那么它会被<em>桥接</em>到现有接å£ï¼Œå¹¶ä¸”被所选的防ç«å¢™"
++#~ "区域覆盖。å–消附加选项å¯ä»¥é‡å®šä¹‰æ­¤æŽ¥å£ä¸ºæ–°çš„独立网络。"
++
++#~ msgid "Independent (Ad-Hoc)"
++#~ msgstr "独立(点对点Ad-Hoc)"
++
++#~ msgid "Internet Connection"
++#~ msgstr "网络连接"
++
++#~ msgid "Join (Client)"
++#~ msgstr "加入(客户端)"
++
++#~ msgid "Leases"
++#~ msgstr "租约"
++
++#~ msgid "localises the hostname depending on its subnet"
++#~ msgstr "æ ¹æ®å­ç½‘本地化主机å"
++
++#~ msgid "LuCI Components"
++#~ msgstr "LuCI 组件"
++
++#~ msgid ""
++#~ "Notice: In <abbr title=\"Lua Configuration Interface\">LuCI</abbr> "
++#~ "changes have to be confirmed by clicking Changes - Save &amp; Apply "
++#~ "before being applied."
++#~ msgstr ""
++#~ "注æ„:在<abbr title=\"Lua Configuration Interface\">LuCI</abbr>中,点击 ä¿"
++#~ "å­˜&amp;应用 åŽè®¾ç½®æ‰ä¼šç”Ÿæ•ˆã€‚"
++
++#~ msgid ""
++#~ "On the following pages you can adjust all important settings of your "
++#~ "router."
++#~ msgstr "本页å¯ä»¥è®¾ç½®è·¯ç”±å™¨çš„é‡è¦å‚数。"
++
++#~ msgid "Perform Actions"
++#~ msgstr "执行æ“作"
++
++#~ msgid ""
++#~ "prevents caching of negative <abbr title=\"Domain Name System\">DNS</"
++#~ "abbr>-replies"
++#~ msgstr "阻止缓存无效的<abbr title=\"Domain Name System\">DNS</abbr>应答"
++
++#~ msgid "Prevents client to client communication"
++#~ msgstr "ç¦æ­¢å®¢æˆ·ç«¯é—´çš„通信"
++
++#~ msgid "Provide (Access Point)"
++#~ msgstr "添加(接入点)"
++
++#~ msgid "Search file..."
++#~ msgstr "查找文件..."
++
++#~ msgid "Server"
++#~ msgstr "æœåŠ¡å™¨"
++
++#~ msgid "TX / RX"
++#~ msgstr "å‘é€ / 接收"
++
++#~ msgid "The <abbr title=\"Lua Configuration Interface\">LuCI</abbr> Team"
++#~ msgstr "<abbr title=\"Lua Configuration Interface\">LuCI</abbr>å¼€å‘团队"
++
++#~ msgid "The following changes have been comitted"
++#~ msgstr "以下更改已æ交"
++
++#~ msgid "The following changes have been applied"
++#~ msgstr "以下更改已生效"
++
++#~ msgid ""
++#~ "This is the administration area of <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr>."
++#~ msgstr ""
++#~ "这是<abbr title=\"Lua Configuration Interface\">LuCI</abbr>的管ç†é¡µé¢ã€‚"
++
++#~ msgid "transmitted / received"
++#~ msgstr "已传输 / 已接收"
++
++#~ msgid ""
++#~ "When flashing a new firmware with <abbr title=\"Lua Configuration "
++#~ "Interface\">LuCI</abbr> these files will be added to the new firmware "
++#~ "installation."
++#~ msgstr ""
++#~ "当刷写带<abbr title=\"Lua Configuration Interface\">LuCI</abbr>的新固件"
++#~ "时,这些文件将被加入到新的固件中。"
++
++#~ msgid ""
++#~ "With <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> "
++#~ "network members can automatically receive their network settings (<abbr "
++#~ "title=\"Internet Protocol\">IP</abbr>-address, netmask, <abbr title="
++#~ "\"Domain Name System\">DNS</abbr>-server, ...)."
++#~ msgstr ""
++#~ "用户å¯ä»¥é€šè¿‡<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++#~ "abbr>自动接收网络的(<abbr title=\"Internet Protocol\">IP</abbr>地å€ï¼Œå­ç½‘"
++#~ "掩ç ï¼Œ<abbr title=\"Domain Name System\">DNS</abbr>æœåŠ¡å™¨, ...)ç­‰é…置信"
++#~ "æ¯ã€‚"
++
++#~ msgid "Wireless Scan"
++#~ msgstr "æœç´¢æ— çº¿"
++
++#~ msgid ""
++#~ "You are about to join the wireless network <em><strong>%s</strong></em>. "
++#~ "In order to complete the process, you need to provide some additional "
++#~ "details."
++#~ msgstr ""
++#~ "å³å°†åŠ å…¥æ— çº¿ç½‘络<em><strong>%s</strong></em>,这需è¦å¡«å†™ä¸€äº›é¢å¤–ä¿¡æ¯ã€‚"
++
++#~ msgid ""
++#~ "You can run several wifi networks with one device. Be aware that there "
++#~ "are certain hardware and driverspecific restrictions. Normally you can "
++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network "
++#~ "simultaneously."
++#~ msgstr ""
++#~ "一å°è®¾å¤‡å¯ä»¥ç”¨è™šæ‹Ÿæ–¹å¼åŒæ—¶è¿è¡Œå‡ ä¸ªæ— çº¿ç½‘络。但注æ„会有硬件或软件é™åˆ¶ã€‚通常"
++#~ "å¯ä»¥è¿è¡Œä¸€ä¸ªç‚¹å¯¹ç‚¹æ— çº¿ç½‘络,或åŒæ—¶è¿è¡Œä¸‰ä¸ªMaster模å¼å’Œä¸€ä¸ªå®¢æˆ·ç«¯æ¨¡å¼çš„无线"
++#~ "网络。"
++
++#~ msgid ""
++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP "
++#~ "support"
++#~ msgstr "需è¦å®‰è£…\"ppp-mod-pppoe\"以支æŒPPPoe,\"pptp\"以支æŒPPtP"
++
++#~ msgid ""
++#~ "You need to install <a href='%s'><em>wpa-supplicant</em></a> to use WPA!"
++#~ msgstr "需è¦å®‰è£…<a href='%s'><em>wpa-supplicant</em></a>以支æŒWPA加密!"
++
++#~ msgid ""
++#~ "You need to install the <a href='%s'>Broadcom <em>nas</em> supplicant</a> "
++#~ "to use WPA!"
++#~ msgstr ""
++#~ "需è¦å®‰è£…<a href='%s'>Broadcom<em>nas</em> supplicant</a>以支æŒWPA加密!"
++
++#~ msgid "User Interface"
++#~ msgstr "用户界é¢"
++
++#~ msgid "(hidden)"
++#~ msgstr "(éšè—)"
++
++#~ msgid "(optional)"
++#~ msgstr "(ä»»æ„)"
++
++#~ msgid "Aliases"
++#~ msgstr "别å"
++
++#~ msgid "First leased address"
++#~ msgstr "起始分é…地å€"
++
++#~ msgid "Local Network"
++#~ msgstr "本地网络"
++
++#~ msgid "Number of leased addresses"
++#~ msgstr "地å€ç§Ÿç”¨æ•°"
++
++#~ msgid "Resolvfile"
++#~ msgstr "解æžæ–‡ä»¶"
++
++#~ msgid "Zone"
++#~ msgstr "区域"
++
++#~ msgid "additional hostfile"
++#~ msgstr "附加的主机文件"
++
++#~ msgid "automatically reconnect"
++#~ msgstr "自动é‡è¿ž"
++
++#~ msgid "concurrent queries"
++#~ msgstr "并å‘查询"
++
++#~ msgid "disconnect when idle for"
++#~ msgstr "空闲自动断开"
++
++#~ msgid "don't cache unknown"
++#~ msgstr "ä¸ç¼“存未知数æ®"
++
++#~ msgid "installed"
++#~ msgstr "已安装"
++
++#~ msgid "manual"
++#~ msgstr "手册"
++
++#~ msgid "not installed"
++#~ msgstr "未安装"
++
++#~ msgid "query port"
++#~ msgstr "查询端å£"
++
++#~ msgid "all"
++#~ msgstr "全部"
++
++#~ msgid "Code"
++#~ msgstr "代ç "
++
++#~ msgid "Distance"
++#~ msgstr "è·ç¦»"
++
++#~ msgid "Legend"
++#~ msgstr "图例"
++
++#~ msgid "Library"
++#~ msgstr "Library"
++
++#~ msgid "see '%s' manpage"
++#~ msgstr "è¯¦å‚ &#39;%s&#39; è”机帮助"
++
++#~ msgid "Package Manager"
++#~ msgstr "软件包管ç†"
++
++#~ msgid "Service"
++#~ msgstr "æœåŠ¡"
++
++#~ msgid "Statistics"
++#~ msgstr "统计信æ¯"
+diff --git a/feeds/luci/modules/luci-base/po/zh-tw/base.po b/feeds/luci/modules/luci-base/po/zh-tw/base.po
+new file mode 100644
+index 0000000..6efaa7f
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/po/zh-tw/base.po
+@@ -0,0 +1,3304 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-05-21 10:34+0200\n"
++"Last-Translator: omnistack <omnistack@gmail.com>\n"
++"Language-Team: none\n"
++"Language: zh_TW\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: Pootle 2.0.6\n"
++
++msgid "(%d minute window, %d second interval)"
++msgstr "(%d 分é˜è¨Šæ¯, %d 秒更新)"
++
++msgid "(%s available)"
++msgstr "(%s å¯ç”¨)"
++
++msgid "(empty)"
++msgstr "(空白)"
++
++msgid "(no interfaces attached)"
++msgstr "(未連接界é¢)"
++
++msgid "-- Additional Field --"
++msgstr "-- 更多é¸é … --"
++
++msgid "-- Please choose --"
++msgstr "-- è«‹é¸æ“‡ --"
++
++msgid "-- custom --"
++msgstr "-- 自訂 --"
++
++msgid "-- match by device --"
++msgstr ""
++
++msgid "-- match by label --"
++msgstr ""
++
++msgid "1 Minute Load:"
++msgstr "1分é˜è² è¼‰"
++
++msgid "15 Minute Load:"
++msgstr "15分é˜è² è¼‰"
++
++msgid "464XLAT (CLAT)"
++msgstr ""
++
++msgid "5 Minute Load:"
++msgstr "5分é˜è² è¼‰"
++
++msgid "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++msgstr "<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> query port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> 查詢通訊埠"
++
++msgid "<abbr title=\"Domain Name System\">DNS</abbr> server port"
++msgstr "<abbr title=\"Domain Name System\">DNS</abbr> 伺æœå™¨é€šè¨ŠåŸ "
++
++msgid ""
++"<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the "
++"order of the resolvfile"
++msgstr "將會按照指定的順åºæŸ¥è©¢<abbr title=\"Domain Name System\">DNS</abbr>"
++
++msgid "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-ä½ç½®"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-é–˜é“"
++
++msgid "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"
++msgstr "<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-é®ç½©"
++
++msgid ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network "
++"(CIDR)"
++msgstr ""
++"<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-ä½ç½®æˆ–網路(CIDR)"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"
++msgstr "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-é–˜é“"
++
++msgid "<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"
++msgstr ""
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> 設定"
++
++msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> Name"
++msgstr "<abbr title=\"Light Emitting Diode\">LED</abbr> å稱"
++
++msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
++msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-ä½ç½®"
++
++msgid ""
++"<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration "
++"Protocol\">DHCP</abbr> leases"
++msgstr ""
++"<abbr title=\"maximal\">最大</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=\"maximal\">最大</abbr> <abbr title=\"Extension Mechanisms for "
++"Domain Name System\">EDNS0</abbr> å°åŒ…大å°"
++
++msgid "<abbr title=\"maximal\">Max.</abbr> concurrent queries"
++msgstr "<abbr title=\"maximal\">最大</abbr>並發查詢數"
++
++msgid "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++msgstr "<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>"
++
++msgid "ADSL"
++msgstr ""
++
++msgid "ADSL Status"
++msgstr ""
++
++msgid "AICCU (SIXXS)"
++msgstr ""
++
++msgid "APN"
++msgstr "APN"
++
++msgid "AR Support"
++msgstr "AR支æ´"
++
++msgid "ARP retry threshold"
++msgstr "ARPé‡è©¦é–€æª»"
++
++msgid "ATM Bridges"
++msgstr "ATM橋接"
++
++msgid "ATM Virtual Channel Identifier (VCI)"
++msgstr "ATM虛擬通é“識別(VCI)"
++
++msgid "ATM Virtual Path Identifier (VPI)"
++msgstr "ATM虛擬路徑識別(VPI)"
++
++msgid ""
++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual "
++"Linux network interfaces which can be used in conjunction with DHCP or PPP "
++"to dial into the provider network."
++msgstr ""
++"ATM橋接是以AAL5å”定å°è£ä¹™å¤ªç¶²è·¯å¦‚åŒè™›æ“¬Linux網路界é¢å¡ï¼Œç”¨æ–¼é€£æŽ¥DHCP或PPP來撥"
++"號連接到網際網路。"
++
++msgid "ATM device number"
++msgstr "ATMè£ç½®è™Ÿç¢¼"
++
++msgid "AYIYA"
++msgstr ""
++
++msgid "Access Concentrator"
++msgstr "接入集線器"
++
++msgid "Access Point"
++msgstr "å­˜å–點 (AP)"
++
++msgid "Action"
++msgstr "動作"
++
++msgid "Actions"
++msgstr "動作"
++
++msgid "Activate this network"
++msgstr "啟用此網路"
++
++msgid "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
++msgstr "啟用 <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-路由"
++
++msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
++msgstr "啟用 <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-路由"
++
++msgid "Active Connections"
++msgstr "啟用連線"
++
++msgid "Active DHCP Leases"
++msgstr "已分é…çš„DHCP租用"
++
++msgid "Active DHCPv6 Leases"
++msgstr "已分é…çš„DHCPv6租用"
++
++msgid "Ad-Hoc"
++msgstr "Ad-Hoc"
++
++msgid "Add"
++msgstr "增加"
++
++msgid "Add local domain suffix to names served from hosts files"
++msgstr "添加本地網域微碼到HOSTS檔案"
++
++msgid "Add new interface..."
++msgstr "增加新界é¢"
++
++msgid "Additional Hosts files"
++msgstr "é¡å¤–çš„HOST檔案"
++
++msgid "Additional servers file"
++msgstr ""
++
++msgid "Address"
++msgstr "ä½ç½®"
++
++msgid "Address to access local relay bridge"
++msgstr "å­˜å–本地中繼橋接ä½ç½®"
++
++msgid "Administration"
++msgstr "管ç†"
++
++msgid "Advanced Settings"
++msgstr "進階設定"
++
++msgid "Alert"
++msgstr "警示"
++
++msgid "Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"
++msgstr "å…許 <abbr title=\"Secure Shell\">SSH</abbr> 密碼驗證"
++
++msgid "Allow all except listed"
++msgstr "僅å…許列表外"
++
++msgid "Allow listed only"
++msgstr "僅å…許列表內"
++
++msgid "Allow localhost"
++msgstr "å…許本機"
++
++msgid "Allow remote hosts to connect to local SSH forwarded ports"
++msgstr "å…許é ç«¯ä¸»æ©Ÿé€£æŽ¥åˆ°æœ¬æ©ŸSSH轉é€é€šè¨ŠåŸ "
++
++msgid "Allow root logins with password"
++msgstr "å…許root登入"
++
++msgid "Allow the <em>root</em> user to login with password"
++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範åœå…§çš„上游回應,例如:RBLæœå‹™"
++
++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 ""
++
++msgid "An additional network will be created if you leave this unchecked."
++msgstr "å–消é¸å–將會å¦å¤–建立一個新網路,而ä¸æœƒè¦†è“‹ç›®å‰çš„網路設定"
++
++msgid "Announce as default router even if no public prefix is available."
++msgstr ""
++
++msgid "Announced DNS domains"
++msgstr ""
++
++msgid "Announced DNS servers"
++msgstr ""
++
++msgid "Antenna 1"
++msgstr "天線 1"
++
++msgid "Antenna 2"
++msgstr "天線 2"
++
++msgid "Antenna Configuration"
++msgstr "天線設定"
++
++msgid "Any zone"
++msgstr "ä»»æ„å€åŸŸ"
++
++msgid "Apply"
++msgstr "套用"
++
++msgid "Applying changes"
++msgstr "正在套用變更"
++
++msgid ""
++"Assign a part of given length of every public IPv6-prefix to this interface"
++msgstr ""
++
++msgid "Assign interfaces..."
++msgstr "分é…ç•Œé¢..."
++
++msgid ""
++"Assign prefix parts using this hexadecimal subprefix ID for this interface."
++msgstr ""
++
++msgid "Associated Stations"
++msgstr "已連接站點"
++
++msgid "Atheros 802.11%s Wireless Controller"
++msgstr "Atheros 802.11%s 無線控制器"
++
++msgid "AuthGroup"
++msgstr ""
++
++msgid "Authentication"
++msgstr "èªè­‰"
++
++msgid "Authoritative"
++msgstr "授權"
++
++msgid "Authorization Required"
++msgstr "需è¦æŽˆæ¬Š"
++
++msgid "Auto Refresh"
++msgstr "自動更新"
++
++msgid "Automatic"
++msgstr ""
++
++msgid "Automatic Homenet (HNCP)"
++msgstr ""
++
++msgid "Available"
++msgstr "å¯ç”¨"
++
++msgid "Available packages"
++msgstr "å¯ç”¨è»Ÿé«”包"
++
++msgid "Average:"
++msgstr "å¹³å‡:"
++
++msgid "BR / DMR / AFTR"
++msgstr ""
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Back"
++msgstr "返回"
++
++msgid "Back to Overview"
++msgstr "返回至總覽"
++
++msgid "Back to configuration"
++msgstr "返回至設定"
++
++msgid "Back to overview"
++msgstr "返回至總覽"
++
++msgid "Back to scan results"
++msgstr "返回至掃æçµæžœ"
++
++msgid "Background Scan"
++msgstr "背景æœå°‹"
++
++msgid "Backup / Flash Firmware"
++msgstr "備份/å‡ç´šéŸŒé«”"
++
++msgid "Backup / Restore"
++msgstr "備份/還原"
++
++msgid "Backup file list"
++msgstr "備份檔列表"
++
++msgid "Bad address specified!"
++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 "
++"defined backup patterns."
++msgstr ""
++"下é¢æ˜¯å¾…備份的檔案清單。包å«äº†æ›´æ”¹çš„設定檔案ã€å¿…è¦çš„基本檔案和使用者自訂的備"
++"份檔案"
++
++msgid "Bitrate"
++msgstr "傳輸速率"
++
++msgid "Bogus NX Domain Override"
++msgstr "忽略NX網域解æž"
++
++msgid "Bridge"
++msgstr "橋接"
++
++msgid "Bridge interfaces"
++msgstr "橋接介é¢"
++
++msgid "Bridge unit number"
++msgstr "橋接單ä½è™Ÿç¢¼"
++
++msgid "Bring up on boot"
++msgstr "開機自動執行"
++
++msgid "Broadcom 802.11%s Wireless Controller"
++msgstr "Broadcom 802.11%s 無線控制器"
++
++msgid "Broadcom BCM%04x 802.11 Wireless Controller"
++msgstr "Broadcom BCM%04x 802.11 無線控制器"
++
++msgid "Buffered"
++msgstr "已緩è¡"
++
++msgid ""
++"Build/distribution specific feed definitions. This file will NOT be "
++"preserved in any sysupgrade."
++msgstr ""
++
++msgid "Buttons"
++msgstr "按鈕"
++
++msgid "CA certificate; if empty it will be saved after the first connection."
++msgstr ""
++
++msgid "CPU"
++msgstr "CPU"
++
++msgid "CPU usage (%)"
++msgstr "CPU 使用率 (%)"
++
++msgid "Cancel"
++msgstr "å–消"
++
++msgid "Category"
++msgstr ""
++
++msgid "Chain"
++msgstr "éˆ"
++
++msgid "Changes"
++msgstr "待修改"
++
++msgid "Changes applied."
++msgstr "修改已套用"
++
++msgid "Changes the administrator password for accessing the device"
++msgstr "修改管ç†å“¡å¯†ç¢¼"
++
++msgid "Channel"
++msgstr "é »é“"
++
++msgid "Check"
++msgstr "檢查"
++
++msgid "Checksum"
++msgstr "效驗碼"
++
++msgid ""
++"Choose the firewall zone you want to assign to this interface. Select "
++"<em>unspecified</em> to remove the interface from the associated zone or "
++"fill out the <em>create</em> field to define a new zone and attach the "
++"interface to it."
++msgstr ""
++"é¸æ“‡ä½ è¦æŒ‡å®šçµ¦é€™ä»‹é¢çš„防ç«ç‰†å€. æ’¿é¸<em>unspecified</em>以便從指定å€åŸŸé™¤é€™å€‹"
++"介é¢æˆ–者填寫<em>create</em>欄以便定義附加這個介é¢åˆ°ä¸€å€‹æ–°çš„å€åŸŸä¸Š."
++
++msgid ""
++"Choose the network(s) you want to attach to this wireless interface or fill "
++"out the <em>create</em> field to define a new network."
++msgstr ""
++"é¸æ“‡ä½ è¦é™„加到無線網路介é¢çš„多個網路或者填寫<em>create</em> 以便定義一個新的"
++"網路."
++
++msgid "Cipher"
++msgstr "暗號"
++
++msgid ""
++"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)."
++msgstr ""
++"按下\"壓縮檔製作\"就能下載目å‰è¨­å®šæª”çš„taræ ¼å¼çš„壓縮. è¦é‡ç½®å›žå¾©å‡ºå» å€¼,按下"
++"\"執行還原\"(å¯èƒ½åªå°squashfså½±åƒæª”有效)"
++
++msgid "Client"
++msgstr "用戶端"
++
++msgid "Client ID to send when requesting DHCP"
++msgstr "當è¦æ±‚DHCP時è¦å‚³é€çš„用戶識別碼ID"
++
++msgid ""
++"Close inactive connection after the given amount of seconds, use 0 to "
++"persist connection"
++msgstr "幾秒後關閉閒置的連線, 打0代表永é é€£ç·š"
++
++msgid "Close list..."
++msgstr "關閉清單中..."
++
++msgid "Collecting data..."
++msgstr "收集資料中..."
++
++msgid "Command"
++msgstr "指令"
++
++msgid "Common Configuration"
++msgstr "一般設定"
++
++msgid "Compression"
++msgstr "壓縮"
++
++msgid "Configuration"
++msgstr "設定"
++
++msgid "Configuration applied."
++msgstr "啟用設定"
++
++msgid "Configuration files will be kept."
++msgstr "設定檔將被存檔"
++
++msgid "Confirmation"
++msgstr "å†ç¢ºèª"
++
++msgid "Connect"
++msgstr "連線"
++
++msgid "Connected"
++msgstr "已連線"
++
++msgid "Connection Limit"
++msgstr "連線é™åˆ¶"
++
++msgid "Connection to server fails when TLS cannot be used"
++msgstr ""
++
++msgid "Connections"
++msgstr "連線數"
++
++msgid "Country"
++msgstr "國別"
++
++msgid "Country Code"
++msgstr "國別碼"
++
++msgid "Cover the following interface"
++msgstr "覆蓋下列介é¢"
++
++msgid "Cover the following interfaces"
++msgstr "覆蓋下列這些介é¢"
++
++msgid "Create / Assign firewall-zone"
++msgstr "建立/指定防ç«ç‰†ä½œç”¨å€"
++
++msgid "Create Interface"
++msgstr "建立介é¢"
++
++msgid "Create a bridge over multiple interfaces"
++msgstr "在多個介é¢ä¸Šå»ºç«‹æ©‹æŽ¥"
++
++msgid "Critical"
++msgstr "緊急"
++
++msgid "Cron Log Level"
++msgstr "Cron的日誌級別"
++
++msgid "Custom Interface"
++msgstr "自訂介é¢"
++
++msgid "Custom delegated IPv6-prefix"
++msgstr ""
++
++msgid ""
++"Custom feed definitions, e.g. private feeds. This file can be preserved in a "
++"sysupgrade."
++msgstr ""
++
++msgid "Custom feeds"
++msgstr ""
++
++msgid ""
++"Customizes the behaviour of the device <abbr title=\"Light Emitting Diode"
++"\">LED</abbr>s if possible."
++msgstr ""
++"如果å¯ä»¥çš„話,自定這個設備的動作 <abbr title=\"Light Emitting Diode\">LED</"
++"abbr>s ."
++
++msgid "DHCP Leases"
++msgstr "DHCP的釋放週期"
++
++msgid "DHCP Server"
++msgstr "DHCP伺æœå™¨"
++
++msgid "DHCP and DNS"
++msgstr "DHCP 和 DNS"
++
++msgid "DHCP client"
++msgstr "DHCP用戶端"
++
++msgid "DHCP-Options"
++msgstr "DHCPé¸é …"
++
++msgid "DHCPv6 Leases"
++msgstr "DHCPv6版釋放時間週期"
++
++msgid "DHCPv6 client"
++msgstr ""
++
++msgid "DHCPv6-Mode"
++msgstr ""
++
++msgid "DHCPv6-Service"
++msgstr ""
++
++msgid "DNS"
++msgstr "網域å稱伺æœå™¨"
++
++msgid "DNS forwardings"
++msgstr "DNSå°åŒ…轉發"
++
++msgid "DNS-Label / FQDN"
++msgstr ""
++
++msgid "DS-Lite AFTR address"
++msgstr ""
++
++msgid "DUID"
++msgstr "DHCPç¨ç«‹å¼åˆ¥ç¢¼DUID "
++
++msgid "Debug"
++msgstr "除錯"
++
++msgid "Default %d"
++msgstr "é è¨­ %d"
++
++msgid "Default gateway"
++msgstr "é è¨­åŒé“器"
++
++msgid "Default route"
++msgstr ""
++
++msgid "Default state"
++msgstr "é è¨­ç‹€æ…‹"
++
++msgid "Define a name for this network."
++msgstr "自訂這個網路å稱"
++
++msgid ""
++"Define additional DHCP options, for example "
++"\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
++"servers to clients."
++msgstr ""
++"定義é¡å¤–çš„DHCPé¸é …,例如\"<code>6,192.168.2.1,192.168.2.2</code>\"將會通告ä¸åŒ"
++"çš„DNS伺æœå™¨åˆ°å®¢æˆ¶ç«¯."
++
++msgid "Delete"
++msgstr "刪除"
++
++msgid "Delete this interface"
++msgstr "刪除這個介é¢"
++
++msgid "Delete this network"
++msgstr "刪除這個網路"
++
++msgid "Description"
++msgstr "æè¿°"
++
++msgid "Design"
++msgstr "設計è¦åŠƒ"
++
++msgid "Destination"
++msgstr "目的地"
++
++msgid "Device"
++msgstr "設備"
++
++msgid "Device Configuration"
++msgstr "設定設備"
++
++msgid "Device is rebooting..."
++msgstr ""
++
++msgid "Device unreachable"
++msgstr ""
++
++msgid "Diagnostics"
++msgstr "診斷"
++
++msgid "Dial number"
++msgstr ""
++
++msgid "Directory"
++msgstr "目錄"
++
++msgid "Disable"
++msgstr "關閉"
++
++msgid ""
++"Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for "
++"this interface."
++msgstr ""
++" å°é€™ä»‹é¢é—œé–‰ <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++
++msgid "Disable DNS setup"
++msgstr "關閉DNS設置"
++
++msgid "Disable HW-Beacon timer"
++msgstr "關閉硬體燈號計時器"
++
++msgid "Disabled"
++msgstr "關閉"
++
++msgid "Discard upstream RFC1918 responses"
++msgstr "丟棄上游RFC1918 虛擬IP網路的回應"
++
++msgid "Displaying only packages containing"
++msgstr "僅顯示內å«çš„軟體"
++
++msgid "Distance Optimization"
++msgstr "最佳化è·é›¢"
++
++msgid "Distance to farthest network member in meters."
++msgstr "到最é çš„網路è·é›¢ä»¥ç±³è¡¨ç¤º."
++
++msgid "Distribution feeds"
++msgstr ""
++
++msgid "Diversity"
++msgstr "差異"
++
++msgid ""
++"Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-"
++"Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> "
++"firewalls"
++msgstr ""
++" Dnsmasq 是組åˆ<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-伺æœå™¨ å’Œ <abbr title=\"Domain Name System\">DNS</abbr>-轉發給 <abbr "
++"title=\"Network Address Translation\">NAT</abbr> 防ç«ç‰†ç”¨"
++
++msgid "Do not cache negative replies, e.g. for not existing domains"
++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 "å°æœ¬åœ°ç¶²åŸŸä¸è½‰ç™¼å解æžéŽ–定"
++
++msgid "Do not send probe responses"
++msgstr "ä¸å‚³é€æŽ¢æ¸¬å›žæ‡‰"
++
++msgid "Domain required"
++msgstr "網域必è¦çš„"
++
++msgid "Domain whitelist"
++msgstr "網域白åå–®"
++
++msgid ""
++"Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without "
++"<abbr title=\"Domain Name System\">DNS</abbr>-Name"
++msgstr ""
++"若沒 <abbr title=\"Domain Name System\">DNS</abbr>-å稱的話,ä¸è¦è½‰ç™¼ <abbr "
++"title=\"Domain Name System\">DNS</abbr>-請求"
++
++msgid "Download and install package"
++msgstr "下載並安è£è»Ÿé«”包"
++
++msgid "Download backup"
++msgstr "下載備份檔"
++
++msgid "Dropbear Instance"
++msgstr "Dropbear SSH例å­"
++
++msgid ""
++"Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access "
++"and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"
++msgstr ""
++"Dropbear æä¾› <abbr title=\"Secure Shell\">SSH</abbr> 網路shell命令存å–和一個"
++"æ•´åˆçš„ <abbr title=\"Secure Copy\">SCP</abbr> 伺æœå™¨"
++
++msgid "Dual-Stack Lite (RFC6333)"
++msgstr ""
++
++msgid "Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++msgstr "å‹•æ…‹ <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"
++
++msgid "Dynamic tunnel"
++msgstr "動態隧é“"
++
++msgid ""
++"Dynamically allocate DHCP addresses for clients. If disabled, only clients "
++"having static leases will be served."
++msgstr "幫用戶端動態發é…DHCPä½å€. å‡å¦‚關閉的話,僅有有éœæ…‹ä½å€çš„用戶端能被æœå‹™"
++
++msgid "EA-bits length"
++msgstr ""
++
++msgid "EAP-Method"
++msgstr "EAPå”定驗證方å¼"
++
++msgid "Edit"
++msgstr "編輯"
++
++msgid ""
++"Edit the raw configuration data above to fix any error and hit \"Save\" to "
++"reload the page."
++msgstr ""
++
++msgid "Edit this interface"
++msgstr "修改這個介é¢"
++
++msgid "Edit this network"
++msgstr "修改這個網路"
++
++msgid "Emergency"
++msgstr "緊急"
++
++msgid "Enable"
++msgstr "啟用"
++
++msgid "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++msgstr "啟用 <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
++
++msgid "Enable HE.net dynamic endpoint update"
++msgstr "啟用HE.netæœå‹™ä»£ç®¡å‹•æ…‹æ›´æ–°"
++
++msgid "Enable Jumbo Frame passthrough"
++msgstr "啟用超大訊框é€ç©¿"
++
++msgid "Enable NTP client"
++msgstr "起用NTP用戶功能"
++
++msgid "Enable TFTP server"
++msgstr "啟用TFTP伺æœå™¨"
++
++msgid "Enable VLAN functionality"
++msgstr "啟用VLAN功能"
++
++msgid "Enable WPS pushbutton, requires WPA(2)-PSK"
++msgstr ""
++
++msgid "Enable learning and aging"
++msgstr "啟用智慧學習功能"
++
++msgid "Enable mirroring of incoming packets"
++msgstr ""
++
++msgid "Enable mirroring of outgoing packets"
++msgstr ""
++
++msgid "Enable this mount"
++msgstr "啟用掛載點"
++
++msgid "Enable this swap"
++msgstr "啟用swap功能"
++
++msgid "Enable/Disable"
++msgstr "啟用/關閉"
++
++msgid "Enabled"
++msgstr "啟用"
++
++msgid "Enables the Spanning Tree Protocol on this bridge"
++msgstr "在橋接器上啟用802.1d Spanning Treeå”定"
++
++msgid "Encapsulation mode"
++msgstr "å°è£æ¨¡å¼"
++
++msgid "Encryption"
++msgstr "加密"
++
++msgid "Erasing..."
++msgstr "刪除中..."
++
++msgid "Error"
++msgstr "錯誤"
++
++msgid "Ethernet Adapter"
++msgstr "乙太網路å¡"
++
++msgid "Ethernet Switch"
++msgstr "乙太交æ›å™¨"
++
++msgid "Expand hosts"
++msgstr "延伸主機"
++
++msgid "Expires"
++msgstr "éŽæœŸ"
++
++#, fuzzy
++msgid ""
++"Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."
++msgstr "釋放ä½å€çš„éŽæœŸé€±æœŸ,æœ€å°‘å…©åˆ†é˜ (<code>2m</code>)."
++
++msgid "External"
++msgstr ""
++
++msgid "External system log server"
++msgstr "外部系統日誌伺æœå™¨"
++
++msgid "External system log server port"
++msgstr "外部系統日誌伺æœå™¨åŸ è™Ÿ"
++
++msgid "Fast Frames"
++msgstr "快速迅框群"
++
++msgid "File"
++msgstr "檔案"
++
++msgid "Filename of the boot image advertised to clients"
++msgstr "é–‹æ©Ÿå½±åƒæª”通知給用戶端"
++
++msgid "Filesystem"
++msgstr "檔案系統"
++
++msgid "Filter"
++msgstr "éŽæ¿¾å™¨"
++
++msgid "Filter private"
++msgstr "ç§äººéŽæ¿¾å™¨"
++
++msgid "Filter useless"
++msgstr "無用éŽæ¿¾å™¨"
++
++msgid "Find and join network"
++msgstr "æœå°‹ä¸¦åŠ å…¥ç¶²è·¯"
++
++msgid "Find package"
++msgstr "æœå°‹è»Ÿé«”包"
++
++msgid "Finish"
++msgstr "完æˆ"
++
++msgid "Firewall"
++msgstr "防ç«ç‰†"
++
++msgid "Firewall Settings"
++msgstr "防ç«ç‰†è¨­å®š"
++
++msgid "Firewall Status"
++msgstr "防ç«ç‰†ç‹€æ³"
++
++msgid "Firmware Version"
++msgstr "防ç«ç‰†ç‰ˆæœ¬"
++
++msgid "Fixed source port for outbound DNS queries"
++msgstr "外發DNS請求的固定埠號"
++
++msgid "Flags"
++msgstr "旗標"
++
++msgid "Flash Firmware"
++msgstr "韌體更新"
++
++msgid "Flash image..."
++msgstr "更新映åƒæª”中..."
++
++msgid "Flash new firmware image"
++msgstr "更新新版韌體映åƒæª”"
++
++msgid "Flash operations"
++msgstr "執行更新"
++
++msgid "Flashing..."
++msgstr "更新中..."
++
++msgid "Force"
++msgstr "強制"
++
++msgid "Force CCMP (AES)"
++msgstr "強制CCMP (AES)加密"
++
++msgid "Force DHCP on this network even if another server is detected."
++msgstr "在網路上å³ä½¿åµæ¸¬åˆ°å…¶å®ƒä¼ºæœå™¨ä¹Ÿå¼·åˆ¶æŽ¡ç”¨DHCP的設定"
++
++msgid "Force TKIP"
++msgstr "強制TKIP加密"
++
++msgid "Force TKIP and CCMP (AES)"
++msgstr "強制TKIP+CCMP (AES)加密"
++
++msgid "Form token mismatch"
++msgstr ""
++
++msgid "Forward DHCP traffic"
++msgstr "轉發DHCPæµé‡"
++
++msgid "Forward broadcast traffic"
++msgstr "轉發廣播æµé‡"
++
++msgid "Forwarding mode"
++msgstr "轉發模å¼"
++
++msgid "Fragmentation Threshold"
++msgstr "分片閥值"
++
++msgid "Frame Bursting"
++msgstr "訊框爆速"
++
++msgid "Free"
++msgstr "空閒"
++
++msgid "Free space"
++msgstr "剩餘空間"
++
++msgid "GHz"
++msgstr "GHz"
++
++msgid "GPRS only"
++msgstr "僅用GPRS"
++
++msgid "Gateway"
++msgstr "åŒé“器"
++
++msgid "Gateway ports"
++msgstr "åŒé“器埠號"
++
++msgid "General Settings"
++msgstr "一般設定"
++
++msgid "General Setup"
++msgstr "一般設置"
++
++msgid "General options for opkg"
++msgstr ""
++
++msgid "Generate archive"
++msgstr "製作壓縮檔"
++
++msgid "Generic 802.11%s Wireless Controller"
++msgstr "通用 802.11%s 無線控制器"
++
++msgid "Given password confirmation did not match, password not changed!"
++msgstr "éµå…¥çš„密碼ä¸å»åˆ,密碼將ä¸è®Šæ›´"
++
++msgid "Global network options"
++msgstr ""
++
++msgid "Go to password configuration..."
++msgstr "到密碼設定é "
++
++msgid "Go to relevant configuration page"
++msgstr "到相應設定é "
++
++msgid "Guest"
++msgstr ""
++
++msgid "HE.net password"
++msgstr " HE.net密碼"
++
++msgid "HE.net username"
++msgstr ""
++
++msgid "Handler"
++msgstr "多執行緒"
++
++msgid "Hang Up"
++msgstr "æ–·ç·š"
++
++msgid "Heartbeat"
++msgstr ""
++
++msgid ""
++"Here you can configure the basic aspects of your device like its hostname or "
++"the timezone."
++msgstr "在這設置基本樣貌類似åƒä¸»æ©Ÿå稱或者時å€..ç­‰"
++
++msgid ""
++"Here you can paste public SSH-Keys (one per line) for SSH public-key "
++"authentication."
++msgstr "在這裡貼上公用SSH-Keys (æ¯è¡Œä¸€å€‹)以便驗證"
++
++msgid "Hermes 802.11b Wireless Controller"
++msgstr "Hermes 802.11b 無線網路控制器"
++
++msgid "Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++msgstr "éš±è— <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"
++
++msgid "Host entries"
++msgstr "主機項目"
++
++msgid "Host expiry timeout"
++msgstr "éŽæœŸä¸»æ©Ÿ"
++
++msgid "Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"
++msgstr "主機-<abbr title=\"Internet Protocol Address\">IP</abbr> 或網路"
++
++msgid "Hostname"
++msgstr "主機å稱"
++
++msgid "Hostname to send when requesting DHCP"
++msgstr "當請求DHCPæœå‹™æ™‚傳é€çš„主機å稱"
++
++msgid "Hostnames"
++msgstr "主機å稱"
++
++msgid "Hybrid"
++msgstr ""
++
++msgid "IP address"
++msgstr "IPä½å€"
++
++msgid "IPv4"
++msgstr "IPv4版"
++
++msgid "IPv4 Firewall"
++msgstr "IPv4防ç«ç‰†"
++
++msgid "IPv4 WAN Status"
++msgstr "IPv4寬頻連線狀態"
++
++msgid "IPv4 address"
++msgstr "IPv4ä½å€"
++
++msgid "IPv4 and IPv6"
++msgstr "IPv4å’ŒIPv6"
++
++msgid "IPv4 assignment length"
++msgstr ""
++
++msgid "IPv4 broadcast"
++msgstr "IPv4廣播"
++
++msgid "IPv4 gateway"
++msgstr "IPv4åŒé“器"
++
++msgid "IPv4 netmask"
++msgstr "IPv4網路é®ç½©"
++
++msgid "IPv4 only"
++msgstr "僅用IPv4"
++
++msgid "IPv4 prefix"
++msgstr ""
++
++msgid "IPv4 prefix length"
++msgstr "IPv4å‰ç¶´é•·åº¦"
++
++msgid "IPv4-Address"
++msgstr "IPv4-ä½å€"
++
++msgid "IPv6"
++msgstr "IPv6版"
++
++msgid "IPv6 Firewall"
++msgstr "IPv6防ç«ç‰†"
++
++msgid "IPv6 Neighbours"
++msgstr ""
++
++msgid "IPv6 Settings"
++msgstr ""
++
++msgid "IPv6 ULA-Prefix"
++msgstr ""
++
++msgid "IPv6 WAN Status"
++msgstr "IPv6寬頻連線狀態"
++
++msgid "IPv6 address"
++msgstr "IPv6ä½å€"
++
++msgid "IPv6 address delegated to the local tunnel endpoint (optional)"
++msgstr ""
++
++msgid "IPv6 assignment hint"
++msgstr ""
++
++msgid "IPv6 assignment length"
++msgstr ""
++
++msgid "IPv6 gateway"
++msgstr "IPv6åŒé“器"
++
++msgid "IPv6 only"
++msgstr "僅用IPv6"
++
++msgid "IPv6 prefix"
++msgstr "IPv6字首"
++
++msgid "IPv6 prefix length"
++msgstr "IPv6字首長度"
++
++msgid "IPv6 routed prefix"
++msgstr ""
++
++msgid "IPv6-Address"
++msgstr "IPv6-ä½å€"
++
++msgid "IPv6-in-IPv4 (RFC4213)"
++msgstr "IPv6包覆在IPv4內(RFC4213)"
++
++msgid "IPv6-over-IPv4 (6rd)"
++msgstr "IPv6凌駕IPv4外(第6版)"
++
++msgid "IPv6-over-IPv4 (6to4)"
++msgstr "IPv6凌駕IPv4外(6轉4)"
++
++msgid "Identity"
++msgstr "特性"
++
++msgid ""
++"If specified, mount the device by its UUID instead of a fixed device node"
++msgstr "å‡è‹¥æŒ‡å®šçš„話, 掛載設備的UUIDç¨ç«‹è¨­å‚™è­˜åˆ¥ç¢¼å–代固定的設備節點"
++
++msgid ""
++"If specified, mount the device by the partition label instead of a fixed "
++"device node"
++msgstr "å‡è‹¥æŒ‡å®šçš„話, 掛載設備的分割標籤å–代固定的設備節點"
++
++msgid "If unchecked, no default route is configured"
++msgstr "如果沒打勾點é¸, å°‡ä¸æœƒè¨­ç½®é è¨­è·¯ç”±"
++
++msgid "If unchecked, the advertised DNS server addresses are ignored"
++msgstr "如果沒打勾點é¸, 公告的DNS伺æœå™¨ä½å€å°‡è¢«å¿½è¦–"
++
++msgid ""
++"If your physical memory is insufficient unused data can be temporarily "
++"swapped to a swap-device resulting in a higher amount of usable <abbr title="
++"\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very "
++"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>å…§.請注æ„,交æ›æ•¸æ“šæ˜¯ä¸€å€‹éžå¸¸"
++"緩慢的éŽç¨‹,作為交æ›è£ç½®ä¸èƒ½ç”¨é«˜æ•¸æ“šé€ŸçŽ‡è¨ªå•è©²<abbr title=\"Random Access "
++"Memory\">RAM</縮寫>"
++
++msgid "Ignore <code>/etc/hosts</code>"
++msgstr ""
++
++msgid "Ignore interface"
++msgstr "被忽視的介é¢"
++
++msgid "Ignore resolve file"
++msgstr "被忽視的解æžæª”"
++
++msgid "Image"
++msgstr "映åƒæª”"
++
++msgid "In"
++msgstr "輸入"
++
++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 "é–’ç½®éŽæœŸ"
++
++msgid "Inbound:"
++msgstr "輸入"
++
++msgid "Info"
++msgstr "訊æ¯"
++
++msgid "Initscript"
++msgstr "åˆå§‹åŒ–腳本"
++
++msgid "Initscripts"
++msgstr "åˆå§‹åŒ–腳本"
++
++msgid "Install"
++msgstr "安è£"
++
++msgid "Install iputils-traceroute6 for IPv6 traceroute"
++msgstr ""
++
++msgid "Install package %q"
++msgstr "安è£è»Ÿé«”包 %q"
++
++msgid "Install protocol extensions..."
++msgstr "安è£å»¶ä¼¸å”定中..."
++
++msgid "Installed packages"
++msgstr "安è£è»Ÿé«”包"
++
++msgid "Interface"
++msgstr "介é¢"
++
++msgid "Interface Configuration"
++msgstr "介é¢è¨­å®š"
++
++msgid "Interface Overview"
++msgstr "介é¢é è¦½"
++
++msgid "Interface is reconnecting..."
++msgstr "介é¢é‡é€£"
++
++msgid "Interface is shutting down..."
++msgstr "介é¢æ­£åœ¨é—œé–‰ä¸­..."
++
++msgid "Interface not present or not connected yet."
++msgstr "介é¢å°šæœªå‡ºç·šæˆ–者還沒連上"
++
++msgid "Interface reconnected"
++msgstr "介é¢å·²é‡é€£"
++
++msgid "Interface shut down"
++msgstr "介é¢é—œé–‰"
++
++msgid "Interfaces"
++msgstr "介é¢"
++
++msgid "Internal"
++msgstr ""
++
++msgid "Internal Server Error"
++msgstr "內部伺æœå™¨ç™¼ç”ŸéŒ¯èª¤"
++
++msgid "Invalid"
++msgstr "無效"
++
++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed."
++msgstr "輸入的VLAN ID無效僅有介於 %d å’Œ %d的被å…許"
++
++msgid "Invalid VLAN ID given! Only unique IDs are allowed"
++msgstr "打入的是ä¸æ­£ç¢ºçš„VLAN ID!僅有ç¨ä¸€ç„¡äºŒçš„IDs被å…許"
++
++msgid "Invalid username and/or password! Please try again."
++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 "它顯示你正嘗試更新ä¸é©ç”¨æ–¼é€™å€‹flash記憶體的映åƒæª”,請檢查確èªé€™å€‹æ˜ åƒæª”"
++
++msgid "Java Script required!"
++msgstr "需è¦Java腳本"
++
++msgid "Join Network"
++msgstr "加入網路"
++
++msgid "Join Network: Settings"
++msgstr "加入網路的設定"
++
++msgid "Join Network: Wireless Scan"
++msgstr "加入網路:無線網路掃æ"
++
++msgid "Keep settings"
++msgstr "ä¿æŒè¨­å®šå€¼"
++
++msgid "Kernel Log"
++msgstr "核心日誌"
++
++msgid "Kernel Version"
++msgstr "核心版本"
++
++msgid "Key"
++msgstr "鑰匙"
++
++msgid "Key #%d"
++msgstr "鑰匙 #%d"
++
++msgid "Kill"
++msgstr "刪除"
++
++msgid "L2TP"
++msgstr "L2TP"
++
++msgid "L2TP Server"
++msgstr "L2TP伺æœå™¨"
++
++msgid "LCP echo failure threshold"
++msgstr "LCPå”定呼å«å¤±æ•—次數門檻"
++
++msgid "LCP echo interval"
++msgstr "LCPå”定呼å«é–“éš”"
++
++msgid "LLC"
++msgstr "LLCé‚輯éˆçµæŽ§åˆ¶å±¤"
++
++msgid "Label"
++msgstr "標籤"
++
++msgid "Language"
++msgstr "語言"
++
++msgid "Language and Style"
++msgstr "語言和風格"
++
++msgid "Leaf"
++msgstr ""
++
++msgid "Lease validity time"
++msgstr "租賃有效時間"
++
++msgid "Leasefile"
++msgstr "租賃檔案"
++
++msgid "Leasetime"
++msgstr "租賃時間"
++
++msgid "Leasetime remaining"
++msgstr "租賃ä¿ç•™æ™‚é–“"
++
++msgid "Leave empty to autodetect"
++msgstr "ä¿æŒç©ºç™½ä»¥ä¾¿è‡ªå‹•åµæ¸¬"
++
++msgid "Leave empty to use the current WAN address"
++msgstr "ä¿æŒç©ºç™½ä»¥ä¾¿æŽ¡ç”¨ç¾ä»Šçš„寬頻ä½å€"
++
++msgid "Legend:"
++msgstr "圖例:"
++
++msgid "Limit"
++msgstr "é™åˆ¶"
++
++msgid "Line Attenuation"
++msgstr ""
++
++msgid "Line Speed"
++msgstr ""
++
++msgid "Line State"
++msgstr ""
++
++msgid "Link On"
++msgstr "éˆæŽ¥"
++
++msgid ""
++"List of <abbr title=\"Domain Name System\">DNS</abbr> servers to forward "
++"requests to"
++msgstr "列出 <abbr title=\"Domain Name System\">DNS</abbr> 伺æœå™¨ä»¥ä¾¿è½‰ç™¼è«‹æ±‚"
++
++msgid "List of domains to allow RFC1918 responses for"
++msgstr "列出å…許RFC1918文件虛擬IP回應的網域"
++
++msgid "List of hosts that supply bogus NX domain results"
++msgstr "列出供應å½è£NX網域æˆæžœçš„主機群"
++
++msgid "Listen only on the given interface or, if unspecified, on all"
++msgstr "åªè¨±åœ¨çµ¦äºˆçš„介é¢ä¸Šè†è½, 如果未指定, 全都å…許"
++
++msgid "Listening port for inbound DNS queries"
++msgstr "進入的DNS請求è†è½åŸ "
++
++msgid "Load"
++msgstr "掛載"
++
++msgid "Load Average"
++msgstr "å¹³å‡æŽ›è¼‰"
++
++msgid "Loading"
++msgstr "掛載中"
++
++msgid "Local IPv4 address"
++msgstr "本地IPv4ä½å€"
++
++msgid "Local IPv6 address"
++msgstr "本地IPv6ä½å€"
++
++msgid "Local Startup"
++msgstr "本地啟動"
++
++msgid "Local Time"
++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檔轉發和解æžçš„網域"
++
++msgid "Local domain suffix appended to DHCP names and hosts file entries"
++msgstr "本地網域後綴附加倒DHCPå稱和hosts檔項目"
++
++msgid "Local server"
++msgstr "本地伺æœå™¨"
++
++msgid ""
++"Localise hostname depending on the requesting subnet if multiple IPs are "
++"available"
++msgstr "若有多個IPå¯ç”¨, 本地化主機å稱端看請求的å­ç¶²è·¯è€Œè¨€."
++
++msgid "Localise queries"
++msgstr "本地化網路請求"
++
++msgid "Locked to channel %d used by: %s"
++msgstr ""
++
++msgid "Log output level"
++msgstr "日誌輸出層級"
++
++msgid "Log queries"
++msgstr "日誌查詢"
++
++msgid "Logging"
++msgstr "日誌紀錄中"
++
++msgid "Login"
++msgstr "登入"
++
++msgid "Logout"
++msgstr "登出"
++
++msgid "Lowest leased address as offset from the network address."
++msgstr "最低的釋放ä½å€å¾žé€™ç¶²è·¯ä½å€çš„å移計算"
++
++msgid "MAC-Address"
++msgstr "MAC-ä½å€"
++
++msgid "MAC-Address Filter"
++msgstr "MAC-ä½å€éŽæ¿¾"
++
++msgid "MAC-Filter"
++msgstr "MAC-éŽæ¿¾"
++
++msgid "MAC-List"
++msgstr "MAC-清單"
++
++msgid "MAP / LW4over6"
++msgstr ""
++
++msgid "MB/s"
++msgstr "MB/s"
++
++msgid "MHz"
++msgstr "MHz"
++
++msgid "MTU"
++msgstr "最大傳輸單ä½MTU"
++
++msgid ""
++"Make sure to clone the root filesystem using something like the commands "
++"below:"
++msgstr ""
++
++msgid "Manual"
++msgstr ""
++
++msgid "Maximum Rate"
++msgstr "最快速度"
++
++msgid "Maximum allowed number of active DHCP leases"
++msgstr "å…許啟用DHCP釋放的最大數é‡"
++
++msgid "Maximum allowed number of concurrent DNS queries"
++msgstr "å…許åŒæ™‚齊發的DNS請求的最大數é‡"
++
++msgid "Maximum allowed size of EDNS.0 UDP packets"
++msgstr "å…許EDNS.0 å”定的UDPå°åŒ…最大數é‡"
++
++msgid "Maximum amount of seconds to wait for the modem to become ready"
++msgstr "等待數據機待命的最大秒數"
++
++msgid "Maximum hold time"
++msgstr "å¯æŒæœ‰æœ€é•·æ™‚é–“"
++
++msgid "Maximum number of leased addresses."
++msgstr "釋放出的ä½å€ç¾¤æœ€å¤§æ•¸é‡"
++
++msgid "Mbit/s"
++msgstr "Mbit/s"
++
++msgid "Memory"
++msgstr "記憶體"
++
++msgid "Memory usage (%)"
++msgstr "記憶體使用 (%)"
++
++msgid "Metric"
++msgstr "公測單ä½"
++
++msgid "Minimum Rate"
++msgstr "最低速度"
++
++msgid "Minimum hold time"
++msgstr "å¯æŒæœ‰çš„最低時間"
++
++msgid "Mirror monitor port"
++msgstr ""
++
++msgid "Mirror source port"
++msgstr ""
++
++msgid "Missing protocol extension for proto %q"
++msgstr "å”定 %q æ¼å¤±çš„延伸å”定"
++
++msgid "Mode"
++msgstr "模å¼"
++
++msgid "Model"
++msgstr ""
++
++msgid "Modem device"
++msgstr "數據機設備"
++
++msgid "Modem init timeout"
++msgstr "數據機åˆå§‹åŒ–終çµæ™‚é–“"
++
++msgid "Monitor"
++msgstr "監視"
++
++msgid "Mount Entry"
++msgstr "掛載項目"
++
++msgid "Mount Point"
++msgstr "掛載點"
++
++msgid "Mount Points"
++msgstr "掛載å„點"
++
++msgid "Mount Points - Mount Entry"
++msgstr "掛載å„點 - 掛載項目"
++
++msgid "Mount Points - Swap Entry"
++msgstr "掛載å„點 - 交æ›é …ç›®"
++
++msgid ""
++"Mount Points define at which point a memory device will be attached to the "
++"filesystem"
++msgstr "掛載å„點定義所指定到記憶體設備將會被附載到檔案系統上"
++
++msgid "Mount options"
++msgstr "掛載é¸é …"
++
++msgid "Mount point"
++msgstr "掛載點"
++
++msgid "Mounted file systems"
++msgstr "已掛載檔案系統"
++
++msgid "Move down"
++msgstr "往下移"
++
++msgid "Move up"
++msgstr "往上移"
++
++msgid "Multicast Rate"
++msgstr "多點群播速度"
++
++msgid "Multicast address"
++msgstr "多點群播ä½å€"
++
++msgid "NAS ID"
++msgstr " 網路附存伺æœå™¨ID"
++
++msgid "NAT64 Prefix"
++msgstr ""
++
++msgid "NDP-Proxy"
++msgstr ""
++
++msgid "NTP server candidates"
++msgstr "NTP伺æœå™¨å‚™é¸"
++
++msgid "NTP sync time-out"
++msgstr ""
++
++msgid "Name"
++msgstr "å稱"
++
++msgid "Name of the new interface"
++msgstr "新介é¢çš„å稱"
++
++msgid "Name of the new network"
++msgstr "新網路的å稱"
++
++msgid "Navigation"
++msgstr "導覽"
++
++msgid "Netmask"
++msgstr "網路é®ç½©"
++
++msgid "Network"
++msgstr "網路"
++
++msgid "Network Utilities"
++msgstr "網路多項工具"
++
++msgid "Network boot image"
++msgstr "網路開機映åƒæª”"
++
++msgid "Network without interfaces."
++msgstr "尚無任何介é¢çš„網路."
++
++msgid "Next »"
++msgstr "下一個 »"
++
++msgid "No DHCP Server configured for this interface"
++msgstr "在這個介é¢å°šç„¡DHCP伺æœå™¨"
++
++msgid "No chains in this table"
++msgstr "尚未ç¶åœ¨é€™å€‹è¡¨æ ¼ä¸­"
++
++msgid "No files found"
++msgstr "尚未發ç¾ä»»ä½•æª”案"
++
++msgid "No information available"
++msgstr "å°šç„¡å¯é‹ç”¨è³‡è¨Š"
++
++msgid "No negative cache"
++msgstr "尚無拒絕的快å–"
++
++msgid "No network configured on this device"
++msgstr "尚無網路設定在這個介é¢ä¸Š"
++
++msgid "No network name specified"
++msgstr "尚未指定網路å稱"
++
++msgid "No package lists available"
++msgstr "尚無列出的軟體包å¯é‹ç”¨"
++
++msgid "No password set!"
++msgstr "尚未設定密碼!"
++
++msgid "No rules in this chain"
++msgstr "å°šç„¡è¦å‰‡åœ¨é€™å€‹éˆæŽ¥ä¸Š"
++
++msgid "No zone assigned"
++msgstr "尚未指定å€ç¢¼"
++
++msgid "Noise"
++msgstr "噪音比"
++
++msgid "Noise Margin"
++msgstr ""
++
++msgid "Noise:"
++msgstr "噪音比:"
++
++msgid "None"
++msgstr "ç„¡"
++
++msgid "Normal"
++msgstr "正常"
++
++msgid "Not Found"
++msgstr "尚未發ç¾"
++
++msgid "Not associated"
++msgstr "尚未關è¯"
++
++msgid "Not connected"
++msgstr "尚未連線"
++
++msgid "Note: Configuration files will be erased."
++msgstr "注æ„:設定檔將被刪除."
++
++msgid "Notice"
++msgstr "通知"
++
++msgid "Nslookup"
++msgstr "DNSåµéŒ¯Nslookup"
++
++msgid "OK"
++msgstr "行"
++
++msgid "OPKG-Configuration"
++msgstr "OPKG-設定值"
++
++msgid "Off-State Delay"
++msgstr "關閉狀態延é²"
++
++msgid ""
++"On this page you can configure the network interfaces. You can bridge "
++"several interfaces by ticking the \"bridge interfaces\" field and enter the "
++"names of several network interfaces separated by spaces. You can also use "
++"<abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation "
++"<samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: "
++"<samp>eth0.1</samp>)."
++msgstr ""
++"在這個é é¢ä½ å¯ä»¥è¨­å®šç¶²è·¯ä»‹é¢. åªè¦é»žä¸‹é€™å€‹\"介é¢ç¾¤æ©‹æŽ¥\"而且打入數個以空格分"
++"開網路介é¢çš„å稱就å¯ä»¥æ©‹æŽ¥æ•¸å€‹ä»‹é¢ç¾¤. 你也å¯ä»¥ä½¿ç”¨<abbr title=\"Virtual "
++"Local Area Network\">VLAN</abbr> 符號<samp>INTERFACE.VLANNR</samp> (<abbr "
++"title=\"for example\">例.如</abbr>: <samp>eth0.1</samp>)."
++
++msgid "On-State Delay"
++msgstr "啟用狀態延é²"
++
++msgid "One of hostname or mac address must be specified!"
++msgstr "主機å稱或macä½å€ä»»é¸ä¸€å€‹è¢«æŒ‡å®š"
++
++msgid "One or more fields contain invalid values!"
++msgstr "有一個以上的欄ä½åŒ…å«å¤±æ•ˆæ•¸å€¼!"
++
++msgid "One or more required fields have no value!"
++msgstr "有一個以上的欄ä½ç¼ºä¹ä»»ä½•æ•¸å€¼!"
++
++msgid "Open list..."
++msgstr "開啟清單..."
++
++msgid "OpenConnect (CISCO AnyConnect)"
++msgstr ""
++
++msgid "Operating frequency"
++msgstr ""
++
++msgid "Option changed"
++msgstr "é¸é …已變更"
++
++msgid "Option removed"
++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 "Options"
++msgstr "é¸é …"
++
++msgid "Other:"
++msgstr "其它:"
++
++msgid "Out"
++msgstr "出"
++
++msgid "Outbound:"
++msgstr "外連:"
++
++msgid "Outdoor Channels"
++msgstr "室外通é“"
++
++msgid "Output Interface"
++msgstr ""
++
++msgid "Override MAC address"
++msgstr "覆蓋MACä½å€"
++
++msgid "Override MTU"
++msgstr "覆蓋MTU數值"
++
++msgid "Override the gateway in DHCP responses"
++msgstr "在DHCP回應中覆蓋åŒé“器"
++
++msgid ""
++"Override the netmask sent to clients. Normally it is calculated from the "
++"subnet that is served."
++msgstr "覆蓋傳é€åˆ°å®¢æˆ¶ç«¯çš„網路é®ç½©. 正常來說它會計算來自魚已存å­ç¶²è·¯."
++
++msgid "Override the table used for internal routes"
++msgstr "覆蓋之å‰å…§éƒ¨ä½¿ç”¨çš„路由表"
++
++msgid "Overview"
++msgstr "é è¦½"
++
++msgid "Owner"
++msgstr "æŒæœ‰è€…"
++
++msgid "PAP/CHAP password"
++msgstr "PAP/CHAP驗證密碼"
++
++msgid "PAP/CHAP username"
++msgstr "PAP/CHAP驗證用戶å"
++
++msgid "PID"
++msgstr "PID碼"
++
++msgid "PIN"
++msgstr "PIN碼"
++
++msgid "PPP"
++msgstr "PPPå”定"
++
++msgid "PPPoA Encapsulation"
++msgstr "PPPoAé…ç½®"
++
++msgid "PPPoATM"
++msgstr "PPPoATM"
++
++msgid "PPPoE"
++msgstr "PPPoE"
++
++msgid "PPtP"
++msgstr "PPtP點å°é»žVPN虛擬ç§äººéš§é“å”定"
++
++msgid "PSID offset"
++msgstr ""
++
++msgid "PSID-bits length"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr "軟體包必需有libiwinfo!"
++
++msgid "Package lists are older than 24 hours"
++msgstr "軟體包列表éŽæœŸ24å°æ™‚"
++
++msgid "Package name"
++msgstr "軟體包å稱"
++
++msgid "Packets"
++msgstr "å°åŒ…"
++
++msgid "Part of zone %q"
++msgstr "å€åŸŸ %q 的部分 "
++
++msgid "Password"
++msgstr "密碼"
++
++msgid "Password authentication"
++msgstr "密碼驗證"
++
++msgid "Password of Private Key"
++msgstr "ç§äººé‡‘鑰密碼"
++
++msgid "Password successfully changed!"
++msgstr "密碼已變更æˆåŠŸ!"
++
++msgid "Path to CA-Certificate"
++msgstr "CA-證書的路徑"
++
++msgid "Path to Client-Certificate"
++msgstr "用戶端-證書的路徑"
++
++msgid "Path to Private Key"
++msgstr "ç§äººé‡‘鑰的路徑"
++
++msgid "Path to executable which handles the button event"
++msgstr "處ç†æŒ‰éµæ•ˆæžœå¯åŸ·è¡Œæª”路徑"
++
++msgid "Peak:"
++msgstr "峰值:"
++
++msgid "Perform reboot"
++msgstr "執行é‡é–‹"
++
++msgid "Perform reset"
++msgstr "執行é‡ç½®"
++
++msgid "Phy Rate:"
++msgstr "傳輸率:"
++
++msgid "Physical Settings"
++msgstr "實體設置"
++
++msgid "Ping"
++msgstr "Ping"
++
++msgid "Pkts."
++msgstr "å°åŒ…數."
++
++msgid "Please enter your username and password."
++msgstr "請輸入你的用戶å稱和密碼"
++
++msgid "Policy"
++msgstr "ç­–ç•¥"
++
++msgid "Port"
++msgstr "埠"
++
++msgid "Port %d"
++msgstr "埠 %d"
++
++msgid "Port %d is untagged in multiple VLANs!"
++msgstr "埠 %d 尚未標記在多個VLANs中!"
++
++msgid "Port status:"
++msgstr "埠狀態:"
++
++msgid ""
++"Presume peer to be dead after given amount of LCP echo failures, use 0 to "
++"ignore failures"
++msgstr "å‡è‹¥åœ¨çµ¦äºŽå¤šæ¬¡çš„ LCP 呼å«å¤±æ•—後終點將死, 使用0忽略失敗"
++
++msgid "Prevents client-to-client communication"
++msgstr "防止用戶端å°ç”¨æˆ¶ç«¯çš„通訊"
++
++msgid "Prism2/2.5/3 802.11b Wireless Controller"
++msgstr "Prism2/2.5/3 802.11b 無線控制器"
++
++msgid "Proceed"
++msgstr "å‰é€²"
++
++msgid "Processes"
++msgstr "執行緒"
++
++msgid "Prot."
++msgstr "å”定."
++
++msgid "Protocol"
++msgstr "å”定"
++
++msgid "Protocol family"
++msgstr "å”定家æ—"
++
++msgid "Protocol of the new interface"
++msgstr "新介é¢çš„å”定家æ—"
++
++msgid "Protocol support is not installed"
++msgstr "支æ´çš„å”定尚未安è£"
++
++msgid "Provide NTP server"
++msgstr "æä¾›NTP伺æœå™¨"
++
++msgid "Provide new network"
++msgstr "æ供新網路"
++
++msgid "Pseudo Ad-Hoc (ahdemo)"
++msgstr "å½è£Ad-Hoc (ahdemo模å¼)"
++
++msgid "Public prefix routed to this device for distribution to clients."
++msgstr ""
++
++msgid "Quality"
++msgstr "å“質"
++
++msgid "RTS/CTS Threshold"
++msgstr "RTS/CTS門檻"
++
++msgid "RX"
++msgstr "接收"
++
++msgid "RX Rate"
++msgstr "接收速率"
++
++msgid "RaLink 802.11%s Wireless Controller"
++msgstr "RaLink 802.11%s 無線控制器"
++
++msgid "Radius-Accounting-Port"
++msgstr "Radius-驗証帳號-埠"
++
++msgid "Radius-Accounting-Secret"
++msgstr "Radius-åˆæ³•å¸³è™Ÿ-密碼"
++
++msgid "Radius-Accounting-Server"
++msgstr "Radius-åˆæ³•å¸³è™Ÿ-伺æœå™¨"
++
++msgid "Radius-Authentication-Port"
++msgstr "Radius-驗証-埠"
++
++msgid "Radius-Authentication-Secret"
++msgstr "Radius-驗証-密碼"
++
++msgid "Radius-Authentication-Server"
++msgstr "Radius-驗証-伺æœå™¨"
++
++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 "
++"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."
++msgstr ""
++"真的è¦åˆªé™¤é€™ä»‹é¢?無法復元刪除!\n"
++"å‡å¦‚ä½ è¦é€éŽé€™å€‹ä»‹é¢é€£ç·šä½ å¯èƒ½æœƒç„¡æ³•å­˜å–這個設備."
++
++msgid ""
++"Really delete this wireless network? The deletion cannot be undone!\\nYou "
++"might lose access to this device if you are connected via this network."
++msgstr ""
++"真的è¦åˆªé™¤é€™å€‹ç„¡ç·šç¶²è·¯?無法復元的刪除!\n"
++"å‡å¦‚你是é€éŽé€™å€‹ç¶²è·¯é€£ç·šä½ å¯èƒ½æœƒç„¡æ³•å­˜å–這個設備."
++
++msgid "Really reset all changes?"
++msgstr "確定è¦é‡ç½®å›žå¾©åŽŸå» ?"
++
++#, fuzzy
++msgid ""
++"Really shut down network?\\nYou 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 "
++"you are connected via this interface."
++msgstr ""
++"真的è¦é—œé–‰é€™å€‹ä»‹é¢ \"%s\" ?!\n"
++"å‡å¦‚ä½ è¦é€éŽé€™å€‹ä»‹é¢é€£ç·šä½ å¯èƒ½æœƒç„¡æ³•å­˜å–這個設備."
++
++msgid "Really switch protocol?"
++msgstr "確定è¦æ›´æ›å”定?"
++
++msgid "Realtime Connections"
++msgstr "å³æ™‚連線"
++
++msgid "Realtime Graphs"
++msgstr "å³æ™‚圖表"
++
++msgid "Realtime Load"
++msgstr "å³æ™‚負載"
++
++msgid "Realtime Traffic"
++msgstr "å³æ™‚æµé‡"
++
++msgid "Realtime Wireless"
++msgstr "å³æ™‚無線網路"
++
++msgid "Rebind protection"
++msgstr "é‡æ–°ç¶è­·"
++
++msgid "Reboot"
++msgstr "é‡é–‹æ©Ÿ"
++
++msgid "Rebooting..."
++msgstr "é‡é–‹ä¸­..."
++
++msgid "Reboots the operating system of your device"
++msgstr "é‡å•Ÿä½ è¨­å‚™çš„作業系統"
++
++msgid "Receive"
++msgstr "接收"
++
++msgid "Receiver Antenna"
++msgstr "接收天線"
++
++msgid "Reconnect this interface"
++msgstr "é‡æ–°é€£æŽ¥é€™å€‹ä»‹é¢"
++
++msgid "Reconnecting interface"
++msgstr "é‡é€£é€™å€‹ä»‹é¢ä¸­"
++
++msgid "References"
++msgstr "引用"
++
++msgid "Regulatory Domain"
++msgstr "監管網域"
++
++msgid "Relay"
++msgstr "延é²"
++
++msgid "Relay Bridge"
++msgstr "橋接延é²"
++
++msgid "Relay between networks"
++msgstr "網路間的延é²"
++
++msgid "Relay bridge"
++msgstr "橋接延é²"
++
++msgid "Remote IPv4 address"
++msgstr "é ç«¯IPv4ä½å€"
++
++msgid "Remove"
++msgstr "移除"
++
++msgid "Repeat scan"
++msgstr "å†æ¬¡æŽƒæ"
++
++msgid "Replace entry"
++msgstr "替代項目"
++
++msgid "Replace wireless configuration"
++msgstr "替代性無線設定"
++
++msgid "Request IPv6-address"
++msgstr ""
++
++msgid "Request IPv6-prefix of length"
++msgstr ""
++
++msgid "Require TLS"
++msgstr ""
++
++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3"
++msgstr "å°ç‰¹å®šçš„ISP需è¦,例如.DOCSIS 3 加速有線電視寬頻網路"
++
++msgid "Reset"
++msgstr "é‡ç½®"
++
++msgid "Reset Counters"
++msgstr "é‡ç½®è¨ˆæ•¸å™¨"
++
++msgid "Reset to defaults"
++msgstr "回復é è¨­å€¼"
++
++msgid "Resolv and Hosts Files"
++msgstr "解æžå’ŒHosts檔案"
++
++msgid "Resolve file"
++msgstr "解æžæª”"
++
++msgid "Restart"
++msgstr "é‡å•Ÿ"
++
++msgid "Restart Firewall"
++msgstr "é‡å•Ÿé˜²ç«ç‰†"
++
++msgid "Restore backup"
++msgstr "還原之å‰å‚™ä»½è¨­å®š"
++
++msgid "Reveal/hide password"
++msgstr "明示/éš±è— å¯†ç¢¼"
++
++msgid "Revert"
++msgstr "回溯"
++
++msgid "Root"
++msgstr "æ ¹"
++
++msgid "Root directory for files served via TFTP"
++msgstr "é€éŽTFTPå­˜å–根目錄檔案"
++
++msgid "Root preparation"
++msgstr ""
++
++msgid "Routed IPv6 prefix for downstream interfaces"
++msgstr ""
++
++msgid "Router Advertisement-Service"
++msgstr ""
++
++msgid "Router Password"
++msgstr "路由器密碼"
++
++msgid "Routes"
++msgstr "路由"
++
++msgid ""
++"Routes specify over which interface and gateway a certain host or network "
++"can be reached."
++msgstr "路由器指定介é¢å°Žå‡ºåˆ°ç‰¹å®šä¸»æ©Ÿæˆ–者能夠到é”的網路."
++
++msgid "Rule #"
++msgstr "è¦å‰‡ #"
++
++msgid "Run a filesystem check before mounting the device"
++msgstr "掛載這個設備å‰å…ˆè·‘系統檢查"
++
++msgid "Run filesystem check"
++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 "SSH Access"
++msgstr "SSHå­˜å–"
++
++msgid "SSH-Keys"
++msgstr "SSH-金鑰"
++
++msgid "SSID"
++msgstr "基地å°æœå‹™è¨­å®šè­˜åˆ¥ç¢¼SSID"
++
++msgid "Save"
++msgstr "ä¿å­˜"
++
++msgid "Save & Apply"
++msgstr "ä¿å­˜ä¸¦å•Ÿç”¨"
++
++msgid "Save &#38; Apply"
++msgstr "ä¿å­˜ &#38; 啟用"
++
++msgid "Scan"
++msgstr "掃æ"
++
++msgid "Scheduled Tasks"
++msgstr "排程任務"
++
++msgid "Section added"
++msgstr "新增的å€æ®µ"
++
++msgid "Section removed"
++msgstr "å€æ®µç§»é™¤"
++
++msgid "See \"mount\" manpage for details"
++msgstr "查看\"mount\"主é ç²å–進階資訊"
++
++msgid ""
++"Send LCP echo requests at the given interval in seconds, only effective in "
++"conjunction with failure threshold"
++msgstr "傳é€LCP呼å«è«‹æ±‚在這個給予的秒數間隔內, 僅影響關è¯åˆ°å¤±æ•—門檻"
++
++msgid "Separate Clients"
++msgstr "分隔用戶端"
++
++msgid "Separate WDS"
++msgstr "分隔WDS中繼"
++
++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 "æœå‹™å稱"
++
++msgid "Service Type"
++msgstr "æœå‹™åž‹æ…‹"
++
++msgid "Services"
++msgstr "å„æœå‹™"
++
++#, fuzzy
++msgid "Set up Time Synchronization"
++msgstr "安è£æ ¡æ™‚åŒæ­¥"
++
++msgid "Setup DHCP Server"
++msgstr "安è£DHCP伺æœå™¨"
++
++msgid "Show current backup file list"
++msgstr "顯示ç¾ä»Šçš„備份檔清單"
++
++msgid "Shutdown this interface"
++msgstr "關閉這個介é¢"
++
++msgid "Shutdown this network"
++msgstr "關閉這個網路"
++
++msgid "Signal"
++msgstr "信號"
++
++msgid "Signal:"
++msgstr "信號:"
++
++msgid "Size"
++msgstr "大å°"
++
++msgid "Size (.ipk)"
++msgstr ""
++
++msgid "Skip"
++msgstr "è·³éŽ"
++
++msgid "Skip to content"
++msgstr "跳到內容"
++
++msgid "Skip to navigation"
++msgstr "跳到導覽"
++
++msgid "Slot time"
++msgstr "æ’槽時間"
++
++msgid "Software"
++msgstr "軟體"
++
++msgid "Some fields are invalid, cannot save values!"
++msgstr "有些欄ä½å¤±æ•ˆ, 無法儲存數值!"
++
++msgid "Sorry, the object you requested was not found."
++msgstr "抱歉, 你請求的這物件尚無發ç¾."
++
++msgid "Sorry, the server encountered an unexpected error."
++msgstr "抱歉, 伺æœå™¨é­é‡éžé æœŸçš„錯誤."
++
++#, fuzzy
++msgid ""
++"Sorry, there is no sysupgrade support present; a new firmware image must be "
++"flashed manually. Please refer to the OpenWrt wiki for device specific "
++"install instructions."
++msgstr ""
++"抱歉, 沒有sysupgrade支æ´å‡ºç¾, 新版韌體映åƒæª”必須手動更新. 請回歸OpenWrt wiki"
++"找尋特定設備安è£æŒ‡å¼•."
++
++msgid "Sort"
++msgstr "分類"
++
++msgid "Source"
++msgstr "來æº"
++
++msgid "Source routing"
++msgstr ""
++
++msgid "Specifies the button state to handle"
++msgstr "指定這個按鈕狀態以便æ“作"
++
++msgid "Specifies the directory the device is attached to"
++msgstr "指定這個設備被附掛到那個目錄"
++
++msgid "Specifies the listening port of this <em>Dropbear</em> instance"
++msgstr "指定這個 <em>Dropbear</em>真實è†è½åŸ "
++
++msgid ""
++"Specifies the maximum amount of failed ARP requests until hosts are presumed "
++"to be dead"
++msgstr "指定失敗ARPå¯è«‹æ±‚的最大數é‡ç›´åˆ°é§­å®¢ä¸»æ©Ÿæ­»äº¡ç‚ºæ­¢"
++
++msgid ""
++"Specifies the maximum amount of seconds after which hosts are presumed to be "
++"dead"
++msgstr "指定å¯è«‹æ±‚的最大秒數直到駭客主機死亡為止"
++
++msgid "Specify the secret encryption key here."
++msgstr "指定加密金鑰在此."
++
++msgid "Start"
++msgstr "啟用"
++
++msgid "Start priority"
++msgstr "啟用優先權順åº"
++
++msgid "Startup"
++msgstr "å•Ÿå‹•"
++
++msgid "Static IPv4 Routes"
++msgstr "éœæ…‹IPv4路由"
++
++msgid "Static IPv6 Routes"
++msgstr "éœæ…‹IPv6路由"
++
++msgid "Static Leases"
++msgstr "éœæ…‹ç§Ÿç´„"
++
++msgid "Static Routes"
++msgstr "éœæ…‹è·¯ç”±"
++
++msgid "Static WDS"
++msgstr "éœæ…‹WDS"
++
++msgid "Static address"
++msgstr "éœæ…‹ä½å€"
++
++msgid ""
++"Static leases are used to assign fixed IP addresses and symbolic hostnames "
++"to DHCP clients. They are also required for non-dynamic interface "
++"configurations where only hosts with a corresponding lease are served."
++msgstr ""
++"éœæ…‹ç§Ÿç´„是用來指定固定的IPä½å€å’Œè¡¨ç¤ºçš„主機å稱給予DHCP用戶端. 它們也需è¦éžå‹•"
++"態介é¢è¨­å®šå€¼ä»¥ä¾¿ç²å–相應租約的主機æœå‹™."
++
++msgid "Status"
++msgstr "狀態"
++
++msgid "Stop"
++msgstr "åœæ­¢"
++
++msgid "Strict order"
++msgstr "嚴謹順åº"
++
++msgid "Submit"
++msgstr "æ交"
++
++msgid "Swap"
++msgstr ""
++
++msgid "Swap Entry"
++msgstr "Swap交æ›é é …ç›®"
++
++msgid "Switch"
++msgstr "交æ›å™¨"
++
++msgid "Switch %q"
++msgstr "交æ›å™¨ %q"
++
++msgid "Switch %q (%s)"
++msgstr "交æ›å™¨ %q (%s)"
++
++msgid "Switch protocol"
++msgstr "交æ›å™¨å”定"
++
++msgid "Sync with browser"
++msgstr "åŒæ­¥ç€è¦½å™¨"
++
++msgid "Synchronizing..."
++msgstr "åŒæ­¥ä¸­..."
++
++msgid "System"
++msgstr "系統"
++
++msgid "System Log"
++msgstr "系統日誌"
++
++msgid "System Properties"
++msgstr "系統屬性"
++
++msgid "System log buffer size"
++msgstr "系統日誌緩è¡å¤§å°"
++
++msgid "TCP:"
++msgstr "TCP:"
++
++msgid "TFTP Settings"
++msgstr "TFTP設定"
++
++msgid "TFTP server root"
++msgstr "TFTP 伺æœå™¨æ ¹"
++
++msgid "TX"
++msgstr "傳é€"
++
++msgid "TX Rate"
++msgstr "傳é€é€Ÿåº¦"
++
++msgid "Table"
++msgstr "表格"
++
++msgid "Target"
++msgstr "目標"
++
++msgid "Terminate"
++msgstr "中斷"
++
++#, fuzzy
++msgid ""
++"The <em>Device Configuration</em> section covers physical settings of the "
++"radio hardware such as channel, transmit power or antenna selection which "
++"are shared among all defined wireless networks (if the radio hardware is "
++"multi-SSID capable). Per network settings like encryption or operation mode "
++"are grouped in the <em>Interface Configuration</em>."
++msgstr ""
++"這個<em>Device Configuration</em>欄ä½æœƒè¦†è“‹ç„¡ç·šå°„頻硬體的物ç†è¨­å®šå€¼,如通é“ã€"
++"傳é€åŠŸçŽ‡æˆ–者天線分享é“所有定義的無線網路(å‡å¦‚這個無線射頻硬體是多工-SSID能力"
++"çš„). æ¯å€‹ç¶²è·¯è¨­å®šåƒåŠ å¯†æˆ–æ“作模å¼æ˜¯è¢«åˆ†ç¾¤åœ¨<em>Interface Configuration</em>"
++"中."
++
++msgid ""
++"The <em>libiwinfo-lua</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"這 <em>libiwinfo-lua</em> 軟體包尚未安è£. 你必須安è£é€™å€‹å…ƒä»¶ä»¥ä¾¿ç„¡ç·šç¶²è·¯è¨­å®š"
++"有作用."
++
++msgid ""
++"The HE.net endpoint update configuration changed, you must now use the plain "
++"username instead of the user ID!"
++msgstr ""
++
++msgid ""
++"The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"
++msgstr "指定到這供應商的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> and "
++"<code>_</code>"
++
++msgid "The configuration file could not be loaded due to the following error:"
++msgstr ""
++
++msgid ""
++"The device file of the memory or partition (<abbr title=\"for example\">e.g."
++"</abbr> <code>/dev/sda1</code>)"
++msgstr ""
++"è¨˜æ†¶é«”çš„è¨­å‚™æª”æˆ–è€…åˆ†å‰²å€ (<abbr title=\"for example\">e.g.</abbr> <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 ""
++"這檔案系統é©ç”¨ä¾†æ ¼å¼åŒ–記憶體(<abbr title=\"for example\">例.如.</abbr> "
++"<samp><abbr title=\"Third Extended Filesystem\">ext3</abbr></samp>)"
++
++msgid ""
++"The flash image was uploaded. Below is the checksum and file size listed, "
++"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 "接下來的修改已經被承諾"
++
++msgid "The following changes have been reverted"
++msgstr "接下來的修改已經被回復"
++
++msgid "The following rules are currently active on this system."
++msgstr "以下的è¦å‰‡ç¾æ­£ä½œç”¨åœ¨ç³»çµ±ä¸­."
++
++msgid "The given network name is not unique"
++msgstr "輸入的網路å稱éžç¨ä¸€"
++
++#, fuzzy
++msgid ""
++"The hardware is not multi-SSID capable and the existing configuration will "
++"be replaced if you proceed."
++msgstr "如果你繼續的話.這硬體並éžå¤šSSID工能並且已存的設定將會被覆蓋."
++
++msgid ""
++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 "
++"addresses."
++msgstr "這IPv4開頭以ä½å…ƒè¨ˆçš„長度, 剩餘部分將會延用在IPv6ä½å€ä¸­."
++
++msgid "The length of the IPv6 prefix in bits"
++msgstr "這IPv6開頭以ä½å…ƒè¨ˆçš„長度"
++
++msgid ""
++"The network ports on this device can be combined to several <abbr title="
++"\"Virtual Local Area Network\">VLAN</abbr>s in which computers can "
++"communicate directly with each other. <abbr title=\"Virtual Local Area "
++"Network\">VLAN</abbr>s are often used to separate different network "
++"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\">VLAN</abbr>群經常用來分割網路å€æ®µ. é è¨­ç¶“常會有一個上傳"
++"埠來連接到下一個大型網路類似Intenet而其它埠則用來本地å€ç¶²ä½¿ç”¨."
++
++msgid "The selected protocol needs a device assigned"
++msgstr "é¸åˆ°çš„å”定需è¦æŒ‡å®šåˆ°è¨­å‚™ä¸Š"
++
++msgid "The submitted security token is invalid or already expired!"
++msgstr ""
++
++msgid ""
++"The system is erasing the configuration partition now and will reboot itself "
++"when finished."
++msgstr "系統正在刪除設定分割並且當完æˆæ™‚將自行é‡é–‹."
++
++#, fuzzy
++msgid ""
++"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
++"few minutes before you try to reconnect. It might be necessary to renew the "
++"address of your computer to reach the device again, depending on your "
++"settings."
++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."
++msgstr ""
++"以上傳的映åƒæª”ä¸åŒ…å«æ”¯æ´æ ¼å¼. 請確èªä½ é¸æ“‡çš„是é‡å°ä½ çš„å¹³å°æŽ¡ç”¨çš„通用映åƒæª”."
++
++msgid "There are no active leases."
++msgstr "租賃尚未啟動."
++
++msgid "There are no pending changes to apply!"
++msgstr "å°šç„¡è½å€™çš„修改被採用"
++
++msgid "There are no pending changes to revert!"
++msgstr "å°šç„¡è½å€™çš„修改被復元!"
++
++msgid "There are no pending changes!"
++msgstr "ç„¡è½å€™çš„修改!"
++
++msgid ""
++"There is no device assigned yet, please attach a network device in the "
++"\"Physical Settings\" tab"
++msgstr "尚未指定設備, 請接上一個網路設備在這\"實體設置\"標籤內"
++
++msgid ""
++"There is no password set on this router. Please configure a root password to "
++"protect the web interface and enable SSH."
++msgstr "路由器尚未設密碼. 請設定root密碼以便ä¿è­·web介é¢åŠå•Ÿç”¨SSH."
++
++msgid "This IPv4 address of the relay"
++msgstr "IPv4ä½å€çš„轉驛"
++
++msgid ""
++"This file may contain lines like 'server=/domain/1.2.3.4' or "
++"'server=1.2.3.4' fordomain-specific or full upstream <abbr title=\"Domain "
++"Name System\">DNS</abbr> servers."
++msgstr ""
++
++msgid ""
++"This is a list of shell glob patterns for matching files and directories to "
++"include during sysupgrade. Modified files in /etc/config/ and certain other "
++"configurations are automatically preserved."
++msgstr ""
++"這是shell通用模å¼æ¸…單用來在系統更新時匹é…包括的檔案和目錄. 在/etc/config/ ä¿®"
++"改檔案和特定其它設定檔將會被自動ä¿ç•™."
++
++msgid ""
++"This is either the \"Update Key\" configured for the tunnel or the account "
++"password if no update key has been configured"
++msgstr ""
++
++msgid ""
++"This is the content of /etc/rc.local. Insert your own commands here (in "
++"front of 'exit 0') to execute them at the end of the boot process."
++msgstr ""
++"這是 /etc/rc.local 內容. 在這æ’入自己的指令 (在 'exit 0' å‰é¢)以便在開機æµç¨‹"
++"çµå°¾åŸ·è¡Œå®ƒå€‘."
++
++msgid ""
++"This is the local endpoint address assigned by the tunnel broker, it usually "
++"ends with <code>:2</code>"
++msgstr "這是由通é“代ç†äººæŒ‡å®šçš„本地終端ä½å€, 通常用 <code>:2</code>çµå°¾."
++
++msgid ""
++"This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr> in the local network"
++msgstr ""
++"在本地網路中 這是唯一的 <abbr title=\"Dynamic Host Configuration Protocol"
++"\">DHCP</abbr>"
++
++msgid "This is the plain username for logging into the account"
++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 "這是系統é è¨­çš„例行性工作排程."
++
++msgid ""
++"This is usually the address of the nearest PoP operated by the tunnel broker"
++msgstr "這是由通é“代ç†äººæ“作的近端PoP通用ä½å€"
++
++msgid ""
++"This list gives an overview over currently running system processes and "
++"their status."
++msgstr "這清單æ供目å‰æ­£åœ¨åŸ·è¡Œçš„系統的執行緒和狀態的é è¦½."
++
++msgid "This page allows the configuration of custom button actions"
++msgstr "這一é å…許客製化按éµå‹•ä½œçš„設定"
++
++msgid "This page gives an overview over currently active network connections."
++msgstr "這一é æ供目å‰æ­£åœ¨æ´»å‹•ä¸­ç¶²è·¯é€£ç·šçš„é è¦½."
++
++msgid "This section contains no values yet"
++msgstr "這部分尚未有任何數值."
++
++msgid "Time Synchronization"
++msgstr "校時åŒæ­¥"
++
++msgid "Time Synchronization is not configured yet."
++msgstr "校時åŒæ­¥å°šæœªè¨­å®š."
++
++msgid "Timezone"
++msgstr "時å€"
++
++msgid ""
++"To restore configuration files, you can upload a previously generated backup "
++"archive here."
++msgstr "è¦å¾©å…ƒè¨­å®šæª”, å¯ä»¥ä¸Šå‚³ä¹‹å‰è£½ä½œçš„備份壓縮檔放這."
++
++msgid "Total Available"
++msgstr "全部å¯ç”¨"
++
++msgid "Traceroute"
++msgstr "路由追蹤"
++
++msgid "Traffic"
++msgstr "æµé‡"
++
++msgid "Transfer"
++msgstr "傳輸"
++
++msgid "Transmission Rate"
++msgstr "傳輸速率"
++
++msgid "Transmit"
++msgstr "å°„é »"
++
++msgid "Transmit Power"
++msgstr "射頻功率"
++
++msgid "Transmitter Antenna"
++msgstr "射頻天線"
++
++msgid "Trigger"
++msgstr "觸發"
++
++msgid "Trigger Mode"
++msgstr "觸發模å¼"
++
++msgid "Tunnel ID"
++msgstr "通é“ID"
++
++msgid "Tunnel Interface"
++msgstr "通é“介é¢"
++
++msgid "Tunnel Link"
++msgstr ""
++
++msgid "Tunnel broker protocol"
++msgstr ""
++
++msgid "Tunnel setup server"
++msgstr ""
++
++msgid "Tunnel type"
++msgstr ""
++
++msgid "Turbo Mode"
++msgstr "渦輪爆è¡æ¨¡å¼"
++
++msgid "Tx-Power"
++msgstr "傳é€-功率"
++
++msgid "Type"
++msgstr "åž‹æ…‹"
++
++msgid "UDP:"
++msgstr "UDP:"
++
++msgid "UMTS only"
++msgstr "åªç”¨3G UMTS"
++
++msgid "UMTS/GPRS/EV-DO"
++msgstr "UMTS/GPRS/EV-DO"
++
++msgid "USB Device"
++msgstr "USB設備"
++
++msgid "UUID"
++msgstr "設備通用唯一識別碼UUID"
++
++msgid "Unable to dispatch"
++msgstr "無法發é€"
++
++msgid "Unknown"
++msgstr "未知"
++
++msgid "Unknown Error, password not changed!"
++msgstr "未知錯誤, 密碼尚未改變!"
++
++msgid "Unmanaged"
++msgstr "éžè¨—管"
++
++msgid "Unsaved Changes"
++msgstr "尚未存檔的修改"
++
++msgid "Unsupported protocol type."
++msgstr "ä¸æ”¯æ´çš„å”定型態"
++
++msgid "Update lists"
++msgstr "上傳清單"
++
++msgid ""
++"Upload a sysupgrade-compatible image here to replace the running firmware. "
++"Check \"Keep settings\" to retain the current configuration (requires an "
++"OpenWrt compatible firmware image)."
++msgstr ""
++"上傳一個sysupgrade-相容的映åƒæª”在這以便替代正執行中的韌體. 勾é¸\"ä¿æŒè¨­å®š\"以"
++"ä¿ç•™ç›®å‰è¨­å®šå€¼(å¿…é ˆè¦æ˜¯OpenWrt相容性韌體映åƒæª”)."
++
++msgid "Upload archive..."
++msgstr "上傳壓縮檔..."
++
++msgid "Uploaded File"
++msgstr "檔案已上傳"
++
++msgid "Uptime"
++msgstr "上傳花費時間"
++
++msgid "Use <code>/etc/ethers</code>"
++msgstr "採用 <code>/etc/ethers</code>"
++
++msgid "Use DHCP gateway"
++msgstr "使用DHCPçš„åŒé“器"
++
++msgid "Use DNS servers advertised by peer"
++msgstr "使用終端發布的DNS伺æœå™¨"
++
++msgid "Use ISO/IEC 3166 alpha2 country codes."
++msgstr "使用Use ISO/IEC 3166 alpha2 國碼."
++
++msgid "Use MTU on tunnel interface"
++msgstr "在通é“介é¢ä¸Šä½¿ç”¨çš„MTU數值"
++
++msgid "Use TTL on tunnel interface"
++msgstr "在通é“介é¢ä¸Šä½¿ç”¨çš„TTL存活時間"
++
++msgid "Use as external overlay (/overlay)"
++msgstr ""
++
++msgid "Use as root filesystem (/)"
++msgstr ""
++
++msgid "Use broadcast flag"
++msgstr "當作廣播旗標"
++
++msgid "Use builtin IPv6-management"
++msgstr ""
++
++msgid "Use custom DNS servers"
++msgstr "使用自定的DNS伺æœå™¨"
++
++msgid "Use default gateway"
++msgstr "使用é è¨­åŒé“器"
++
++msgid "Use gateway metric"
++msgstr "使用åŒé“器公測數"
++
++msgid "Use routing table"
++msgstr "使用路由表"
++
++msgid ""
++"Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</"
++"em> indentifies the host, the <em>IPv4-Address</em> specifies to the fixed "
++"address to use and the <em>Hostname</em> is assigned as symbolic name to the "
++"requesting host."
++msgstr ""
++"使用 <em>Add</em> éµä»¥ä¾¿æ–°å¢žä¸€å€‹ç§Ÿè³ƒçš„é …ç›®. 這個 <em>MAC-Address</em> 標誌這"
++"個主機, the <em>IPv4-Address</em> 指定固定ä½å€ä»¥ä¾¿ä½¿ç”¨,<em>Hostname</em> 備指"
++"定當作象徵å稱到請求的主機上."
++
++msgid "Used"
++msgstr "已使用"
++
++msgid "Used Key Slot"
++msgstr "已使用的關éµæ’槽"
++
++msgid "User certificate (PEM encoded)"
++msgstr ""
++
++msgid "User key (PEM encoded)"
++msgstr ""
++
++msgid "Username"
++msgstr "用戶å稱"
++
++msgid "VC-Mux"
++msgstr "虛擬電路多工器VC-Mux"
++
++msgid "VLAN Interface"
++msgstr "VLAN介é¢"
++
++msgid "VLANs on %q"
++msgstr "VLAN 在 %q"
++
++msgid "VLANs on %q (%s)"
++msgstr "VLAN 在 %q (%s)"
++
++msgid "VPN Server"
++msgstr "VPN伺æœå™¨"
++
++msgid "VPN Server port"
++msgstr ""
++
++msgid "VPN Server's certificate SHA1 hash"
++msgstr ""
++
++msgid "Vendor Class to send when requesting DHCP"
++msgstr "當請求DHCPå°åŒ…時è¦å‚³é€çš„製造商類別碼"
++
++msgid "Verbose"
++msgstr ""
++
++msgid "Verbose logging by aiccu daemon"
++msgstr ""
++
++msgid "Verify"
++msgstr "確èª"
++
++msgid "Version"
++msgstr "版本"
++
++msgid "WDS"
++msgstr "無線分散系統WDS"
++
++msgid "WEP Open System"
++msgstr "WEP 開放系統"
++
++msgid "WEP Shared Key"
++msgstr "WEP 共享金鑰"
++
++msgid "WEP passphrase"
++msgstr "WEP通關密碼"
++
++msgid "WMM Mode"
++msgstr "無線多媒體機制"
++
++msgid "WPA passphrase"
++msgstr "WPA 密碼"
++
++msgid ""
++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP "
++"and ad-hoc mode) to be installed."
++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 device..."
++msgstr ""
++
++msgid "Warning"
++msgstr "警告"
++
++msgid "Warning: There are unsaved changes that will get lost on reboot!"
++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 ""
++
++msgid "Wifi"
++msgstr "WIFIç„¡ç·š"
++
++msgid "Wireless"
++msgstr "無線網路"
++
++msgid "Wireless Adapter"
++msgstr "無線網å¡"
++
++msgid "Wireless Network"
++msgstr "無線網路"
++
++msgid "Wireless Overview"
++msgstr "ç„¡ç·šé è¦½"
++
++msgid "Wireless Security"
++msgstr "無線安全"
++
++msgid "Wireless is disabled or not associated"
++msgstr "無線被關閉或者尚未關è¯"
++
++msgid "Wireless is restarting..."
++msgstr "ç„¡ç·šé‡å•Ÿä¸­..."
++
++msgid "Wireless network is disabled"
++msgstr "無線網路已經被關閉"
++
++msgid "Wireless network is enabled"
++msgstr "無線網路已啟用"
++
++msgid "Wireless restarted"
++msgstr "無線網路已é‡å•Ÿ"
++
++msgid "Wireless shut down"
++msgstr "無線網路關閉"
++
++msgid "Write received DNS requests to syslog"
++msgstr "寫入已接收的DNS請求到系統日誌中"
++
++msgid "XR Support"
++msgstr "支æ´XR無線陣列"
++
++msgid ""
++"You can enable or disable installed init scripts here. Changes will applied "
++"after a device reboot.<br /><strong>Warning: If you disable essential init "
++"scripts like \"network\", your device might become inaccessible!</strong>"
++msgstr ""
++"ä½ å¯ä»¥é–‹å•Ÿæˆ–關閉åˆå§‹åŒ–指令在這. 修改將會在設備é‡é–‹å¾Œè¢«å•Ÿç”¨. <br /><strong>è­¦"
++"å‘Š: å‡å¦‚你關閉必è¦çš„åˆå§‹åŒ–腳本åƒ\"網路\", 你的設備將å¯èƒ½ç„¡æ³•å­˜å–!</strong>"
++
++msgid ""
++"You must enable Java Script in your browser or LuCI will not work properly."
++msgstr "在ç€è¦½å™¨ä½ å¿…須啟用Java Scriptå¦å‰‡LuCI無法正常é‹ä½œ."
++
++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 ""
++
++msgid "any"
++msgstr "ä»»æ„"
++
++msgid "auto"
++msgstr "自動"
++
++msgid "automatic"
++msgstr ""
++
++msgid "baseT"
++msgstr "baseT"
++
++msgid "bridged"
++msgstr "已橋接"
++
++msgid "create:"
++msgstr "建立:"
++
++msgid "creates a bridge over specified interface(s)"
++msgstr "在指定的介é¢ç¾¤ä¸Šå»ºç«‹æ©‹æŽ¥"
++
++msgid "dB"
++msgstr "dB"
++
++msgid "dBm"
++msgstr "dBm"
++
++msgid "disable"
++msgstr "關閉"
++
++msgid "disabled"
++msgstr ""
++
++msgid "expired"
++msgstr "éŽæœŸ"
++
++msgid ""
++"file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</"
++"abbr>-leases will be stored"
++msgstr ""
++"當給予<abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>-租賃將"
++"會被存檔"
++
++msgid "forward"
++msgstr "轉發"
++
++msgid "full-duplex"
++msgstr "全雙工"
++
++msgid "half-duplex"
++msgstr "åŠé›™å·¥"
++
++msgid "help"
++msgstr "幫助"
++
++msgid "hidden"
++msgstr "éš±è—"
++
++msgid "hybrid mode"
++msgstr ""
++
++msgid "if target is a network"
++msgstr "å‡å¦‚目標是æŸå€‹ç¶²è·¯"
++
++msgid "input"
++msgstr "輸入"
++
++msgid "kB"
++msgstr "kB"
++
++msgid "kB/s"
++msgstr "kB/s"
++
++msgid "kbit/s"
++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 "navigation Navigation"
++msgstr ""
++
++msgid "no"
++msgstr "ç„¡"
++
++msgid "no link"
++msgstr "無連線"
++
++msgid "none"
++msgstr "ç„¡"
++
++msgid "not present"
++msgstr ""
++
++msgid "off"
++msgstr "關閉"
++
++msgid "on"
++msgstr "é–‹å•Ÿ"
++
++msgid "open"
++msgstr "打開"
++
++msgid "overlay"
++msgstr ""
++
++msgid "relay mode"
++msgstr ""
++
++msgid "routed"
++msgstr "路由"
++
++msgid "server mode"
++msgstr ""
++
++msgid "skiplink1 Skip to navigation"
++msgstr ""
++
++msgid "skiplink2 Skip to content"
++msgstr ""
++
++msgid "stateful-only"
++msgstr ""
++
++msgid "stateless"
++msgstr ""
++
++msgid "stateless + stateful"
++msgstr ""
++
++msgid "tagged"
++msgstr "標籤"
++
++msgid "unknown"
++msgstr "未知"
++
++msgid "unlimited"
++msgstr "ç„¡é™"
++
++msgid "unspecified"
++msgstr "尚未指定"
++
++msgid "unspecified -or- create:"
++msgstr "尚未指定 - 或 -建立:"
++
++msgid "untagged"
++msgstr "尚未標籤"
++
++msgid "yes"
++msgstr "是的"
++
++msgid "« Back"
++msgstr "« 倒退"
++
++#~ msgid "Enable IPv6 negotiation on the PPP link"
++#~ msgstr "啟用PPP連çµä¸Šçš„IPv6交涉"
++
++#~ msgid "Ignore Hosts files"
++#~ msgstr "被忽視的主機檔案"
++
++#~ msgid "Please wait: Device rebooting..."
++#~ msgstr "è«‹ç¨ç­‰:設備正é‡é–‹ä¸­..."
++
++#~ msgid ""
++#~ "Warning: There are unsaved changes that will be lost while rebooting!"
++#~ msgstr "警告:é‡é–‹æ©Ÿå¾ŒæŸäº›æœªå­˜æª”的修改將會æ¼å¤±!"
++
++#~ msgid ""
++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using "
++#~ "this option does not comply with IEEE 802.11n-2009!"
++#~ msgstr ""
++#~ "強制啟用40MHz頻寬並忽略輔助通é“é‡ç–Šã€‚æ­¤é¸é …ä¸ç›¸å®¹æ–¼IEEE 802.11n-2009!"
++
++#~ msgid "Cached"
++#~ msgstr "已快å–"
++
++#~ msgid "Configures this mount as overlay storage for block-extroot"
++#~ msgstr "è¦æŽ¡ç”¨block-extroot功能,設定這個掛載點當作覆蓋儲存"
++
++#~ msgid "Force 40MHz mode"
++#~ msgstr "強制40MHz模å¼"
++
++#~ msgid "Frequency Hopping"
++#~ msgstr "跳頻"
++
++#~ msgid "Locked to channel %d used by %s"
++#~ msgstr "éŽ–å®šé€šé“ ç”± %s 使用的 %d "
++
++#~ msgid "Use as root filesystem"
++#~ msgstr "當作root檔案系統"
++
++#~ msgid "HE.net user ID"
++#~ msgstr "HE.net用戶識別碼ID"
++
++#~ msgid "This is the 32 byte hex encoded user ID, not the login name"
++#~ msgstr "這是32å­—å…ƒ16進制用戶ID編碼,並éžç™»å…¥å稱"
++
++#~ msgid "40MHz 2nd channel above"
++#~ msgstr "40MHz的上述第二通é“"
++
++#~ msgid "40MHz 2nd channel below"
++#~ msgstr "40MHz的下述第二通é“"
++
++#~ msgid "Accept router advertisements"
++#~ msgstr "接收路由器通告"
++
++#~ msgid "Advertise IPv6 on network"
++#~ msgstr "在網路上通知IPv6"
++
++#~ msgid "Advertised network ID"
++#~ msgstr "通知網路ID"
++
++#~ msgid "Allowed range is 1 to 65535"
++#~ msgstr "å…許範åœç‚º1到65535"
++
++#~ msgid "HT capabilities"
++#~ msgstr "HT頻寬能力"
++
++#~ msgid "HT mode"
++#~ msgstr "HT頻寬模å¼"
++
++#~ msgid "Router Model"
++#~ msgstr "路由器型號Model"
++
++#~ msgid "Router Name"
++#~ msgstr "路由器å稱"
++
++#~ msgid "Send router solicitations"
++#~ msgstr "傳é€è·¯ç”±å™¨é‚€è«‹å°åŒ…"
++
++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds"
++#~ msgstr "指定這個公告較愛字首的生命週期以秒表示"
++
++#~ msgid "Specifies the advertised valid prefix lifetime in seconds"
++#~ msgstr "指定這個公告有效字首的生命週期以秒表示"
++
++#~ msgid "Use preferred lifetime"
++#~ msgstr "使用首é¸çš„生命週期"
++
++#~ msgid "Use valid lifetime"
++#~ msgstr "使用正確的生命週期"
+diff --git a/feeds/luci/modules/luci-base/root/etc/config/luci b/feeds/luci/modules/luci-base/root/etc/config/luci
+new file mode 100644
+index 0000000..baa3ac5
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/root/etc/config/luci
+@@ -0,0 +1,24 @@
++config core main
++ option lang auto
++ option mediaurlbase /luci-static/bootstrap
++ option resourcebase /luci-static/resources
++
++config extern flash_keep
++ option uci "/etc/config/"
++ option dropbear "/etc/dropbear/"
++ option openvpn "/etc/openvpn/"
++ option passwd "/etc/passwd"
++ option opkg "/etc/opkg.conf"
++ option firewall "/etc/firewall.user"
++ option uploads "/lib/uci/upload/"
++
++config internal languages
++
++config internal sauth
++ option sessionpath "/tmp/luci-sessions"
++ option sessiontime 3600
++
++config internal ccache
++ option enable 1
++
++config internal themes
+diff --git a/feeds/luci/modules/luci-base/root/etc/config/ucitrack b/feeds/luci/modules/luci-base/root/etc/config/ucitrack
+new file mode 100644
+index 0000000..cd3cb85
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/root/etc/config/ucitrack
+@@ -0,0 +1,57 @@
++config network
++ option init network
++ list affects dhcp
++ list affects radvd
++
++config wireless
++ list affects network
++
++config firewall
++ option init firewall
++ list affects luci-splash
++ list affects qos
++ list affects miniupnpd
++
++config olsr
++ option init olsrd
++
++config dhcp
++ option init dnsmasq
++ list affects odhcpd
++
++config odhcpd
++ option init odhcpd
++
++config dropbear
++ option init dropbear
++
++config httpd
++ option init httpd
++
++config fstab
++ option init fstab
++
++config qos
++ option init qos
++
++config system
++ option init led
++ list affects luci_statistics
++
++config luci_splash
++ option init luci_splash
++
++config upnpd
++ option init miniupnpd
++
++config ntpclient
++ option init ntpclient
++
++config samba
++ option init samba
++
++config tinyproxy
++ option init tinyproxy
++
++config 6relayd
++ option init 6relayd
+diff --git a/feeds/luci/modules/luci-base/root/lib/uci/upload/.placeholder b/feeds/luci/modules/luci-base/root/lib/uci/upload/.placeholder
+new file mode 100644
+index 0000000..e69de29
+diff --git a/feeds/luci/modules/luci-base/root/sbin/luci-reload b/feeds/luci/modules/luci-base/root/sbin/luci-reload
+new file mode 100755
+index 0000000..cc41da2
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/root/sbin/luci-reload
+@@ -0,0 +1,45 @@
++#!/bin/sh
++. /lib/functions.sh
++
++apply_config() {
++ config_get init "$1" init
++ config_get exec "$1" exec
++ config_get test "$1" test
++
++ echo "$2" > "/var/run/luci-reload-status"
++
++ [ -n "$init" ] && reload_init "$2" "$init" "$test"
++ [ -n "$exec" ] && reload_exec "$2" "$exec" "$test"
++}
++
++reload_exec() {
++ local service="$1"
++ local ok="$3"
++ set -- $2
++ local cmd="$1"; shift
++
++ [ -x "$cmd" ] && {
++ echo "Reloading $service... "
++ ( $cmd "$@" ) 2>/dev/null 1>&2
++ [ -n "$ok" -a "$?" != "$ok" ] && echo '!!! Failed to reload' $service '!!!'
++ }
++}
++
++reload_init() {
++ [ -x /etc/init.d/$2 ] && /etc/init.d/$2 enabled && {
++ echo "Reloading $1... "
++ /etc/init.d/$2 reload >/dev/null 2>&1
++ [ -n "$3" -a "$?" != "$3" ] && echo '!!! Failed to reload' $1 '!!!'
++ }
++}
++
++lock "/var/run/luci-reload"
++
++config_load ucitrack
++
++for i in $*; do
++ config_foreach apply_config $i $i
++done
++
++rm -f "/var/run/luci-reload-status"
++lock -u "/var/run/luci-reload"
+diff --git a/feeds/luci/modules/luci-base/root/www/index.html b/feeds/luci/modules/luci-base/root/www/index.html
+new file mode 100644
+index 0000000..59b0d84
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/root/www/index.html
+@@ -0,0 +1,11 @@
++<?xml version="1.0" encoding="utf-8"?>
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
++<html xmlns="http://www.w3.org/1999/xhtml">
++<head>
++<meta http-equiv="Cache-Control" content="no-cache" />
++<meta http-equiv="refresh" content="0; URL=/cgi-bin/luci" />
++</head>
++<body style="background-color: white">
++<a style="color: black; font-family: arial, helvetica, sans-serif;" href="/cgi-bin/luci">LuCI - Lua Configuration Interface</a>
++</body>
++</html>
+diff --git a/feeds/luci/modules/luci-base/src/Makefile b/feeds/luci/modules/luci-base/src/Makefile
+new file mode 100644
+index 0000000..7bb7f2e
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/src/Makefile
+@@ -0,0 +1,21 @@
++%.o: %.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(FPIC) -c -o $@ $<
++
++clean:
++ rm -f po2lmo parser.so version.lua *.o
++
++po2lmo: po2lmo.o template_lmo.o
++ $(CC) $(LDFLAGS) -o $@ $^
++
++parser.so: template_parser.o template_utils.o template_lmo.o template_lualib.o
++ $(CC) $(LDFLAGS) -shared -o $@ $^
++
++version.lua:
++ ./mkversion.sh $@ $(LUCI_VERSION)
++
++compile: parser.so version.lua
++
++install: compile
++ mkdir -p $(DESTDIR)/usr/lib/lua/luci/template
++ cp parser.so $(DESTDIR)/usr/lib/lua/luci/template/parser.so
++ cp version.lua $(DESTDIR)/usr/lib/lua/luci/version.lua
+diff --git a/feeds/luci/modules/luci-base/src/mkversion.sh b/feeds/luci/modules/luci-base/src/mkversion.sh
+new file mode 100755
+index 0000000..55b0ebd
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/src/mkversion.sh
+@@ -0,0 +1,41 @@
++#!/bin/sh
++
++if svn info >/dev/null 2>/dev/null; then
++ if [ "${4%%/*}" = "branches" ]; then
++ variant="LuCI ${4##*[-/]} Branch"
++ elif [ "${4%%/*}" = "tags" ]; then
++ variant="LuCI ${4##*[-/]} Release"
++ else
++ variant="LuCI Trunk"
++ fi
++elif git status >/dev/null 2>/dev/null; then
++ tag="$(git describe --tags 2>/dev/null)"
++ branch="$(git symbolic-ref --short -q HEAD 2>/dev/null)"
++
++ if [ -n "$tag" ]; then
++ variant="LuCI $tag Release"
++ elif [ "$branch" != "master" ]; then
++ variant="LuCI ${branch##*-} Branch"
++ else
++ variant="LuCI Master"
++ fi
++else
++ variant="LuCI"
++fi
++
++cat <<EOF > $1
++local pcall, dofile, _G = pcall, dofile, _G
++
++module "luci.version"
++
++if pcall(dofile, "/etc/openwrt_release") and _G.DISTRIB_DESCRIPTION then
++ distname = ""
++ distversion = _G.DISTRIB_DESCRIPTION
++else
++ distname = "OpenWrt"
++ distversion = "Development Snapshot"
++end
++
++luciname = "$variant"
++luciversion = "${2:-Git}"
++EOF
+diff --git a/feeds/luci/modules/luci-base/src/po2lmo.c b/feeds/luci/modules/luci-base/src/po2lmo.c
+new file mode 100644
+index 0000000..fd927cb
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/src/po2lmo.c
+@@ -0,0 +1,247 @@
++/*
++ * lmo - Lua Machine Objects - PO to LMO conversion tool
++ *
++ * Copyright (C) 2009-2012 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "template_lmo.h"
++
++static void die(const char *msg)
++{
++ fprintf(stderr, "Error: %s\n", msg);
++ exit(1);
++}
++
++static void usage(const char *name)
++{
++ fprintf(stderr, "Usage: %s input.po output.lmo\n", name);
++ exit(1);
++}
++
++static void print(const void *ptr, size_t size, size_t nmemb, FILE *stream)
++{
++ if( fwrite(ptr, size, nmemb, stream) == 0 )
++ die("Failed to write stdout");
++}
++
++static int extract_string(const char *src, char *dest, int len)
++{
++ int pos = 0;
++ int esc = 0;
++ int off = -1;
++
++ for( pos = 0; (pos < strlen(src)) && (pos < len); pos++ )
++ {
++ if( (off == -1) && (src[pos] == '"') )
++ {
++ off = pos + 1;
++ }
++ else if( off >= 0 )
++ {
++ if( esc == 1 )
++ {
++ switch (src[pos])
++ {
++ case '"':
++ case '\\':
++ off++;
++ break;
++ }
++ dest[pos-off] = src[pos];
++ esc = 0;
++ }
++ else if( src[pos] == '\\' )
++ {
++ dest[pos-off] = src[pos];
++ esc = 1;
++ }
++ else if( src[pos] != '"' )
++ {
++ dest[pos-off] = src[pos];
++ }
++ else
++ {
++ dest[pos-off] = '\0';
++ break;
++ }
++ }
++ }
++
++ return (off > -1) ? strlen(dest) : -1;
++}
++
++static int cmp_index(const void *a, const void *b)
++{
++ uint32_t x = ((const lmo_entry_t *)a)->key_id;
++ uint32_t y = ((const lmo_entry_t *)b)->key_id;
++
++ if (x < y)
++ return -1;
++ else if (x > y)
++ return 1;
++
++ return 0;
++}
++
++static void print_uint32(uint32_t x, FILE *out)
++{
++ uint32_t y = htonl(x);
++ print(&y, sizeof(uint32_t), 1, out);
++}
++
++static void print_index(void *array, int n, FILE *out)
++{
++ lmo_entry_t *e;
++
++ qsort(array, n, sizeof(*e), cmp_index);
++
++ for (e = array; n > 0; n--, e++)
++ {
++ print_uint32(e->key_id, out);
++ print_uint32(e->val_id, out);
++ print_uint32(e->offset, out);
++ print_uint32(e->length, out);
++ }
++}
++
++int main(int argc, char *argv[])
++{
++ char line[4096];
++ char key[4096];
++ char val[4096];
++ char tmp[4096];
++ int state = 0;
++ int offset = 0;
++ int length = 0;
++ int n_entries = 0;
++ void *array = NULL;
++ lmo_entry_t *entry = NULL;
++ uint32_t key_id, val_id;
++
++ FILE *in;
++ FILE *out;
++
++ if( (argc != 3) || ((in = fopen(argv[1], "r")) == NULL) || ((out = fopen(argv[2], "w")) == NULL) )
++ usage(argv[0]);
++
++ memset(line, 0, sizeof(key));
++ memset(key, 0, sizeof(val));
++ memset(val, 0, sizeof(val));
++
++ while( (NULL != fgets(line, sizeof(line), in)) || (state >= 2 && feof(in)) )
++ {
++ if( state == 0 && strstr(line, "msgid \"") == line )
++ {
++ switch(extract_string(line, key, sizeof(key)))
++ {
++ case -1:
++ die("Syntax error in msgid");
++ case 0:
++ state = 1;
++ break;
++ default:
++ state = 2;
++ }
++ }
++ else if( state == 1 || state == 2 )
++ {
++ if( strstr(line, "msgstr \"") == line || state == 2 )
++ {
++ switch(extract_string(line, val, sizeof(val)))
++ {
++ case -1:
++ state = 4;
++ break;
++ default:
++ state = 3;
++ }
++ }
++ else
++ {
++ switch(extract_string(line, tmp, sizeof(tmp)))
++ {
++ case -1:
++ state = 2;
++ break;
++ default:
++ strcat(key, tmp);
++ }
++ }
++ }
++ else if( state == 3 )
++ {
++ switch(extract_string(line, tmp, sizeof(tmp)))
++ {
++ case -1:
++ state = 4;
++ break;
++ default:
++ strcat(val, tmp);
++ }
++ }
++
++ if( state == 4 )
++ {
++ if( strlen(key) > 0 && strlen(val) > 0 )
++ {
++ key_id = sfh_hash(key, strlen(key));
++ val_id = sfh_hash(val, strlen(val));
++
++ if( key_id != val_id )
++ {
++ n_entries++;
++ array = realloc(array, n_entries * sizeof(lmo_entry_t));
++ entry = (lmo_entry_t *)array + n_entries - 1;
++
++ if (!array)
++ die("Out of memory");
++
++ entry->key_id = key_id;
++ entry->val_id = val_id;
++ entry->offset = offset;
++ entry->length = strlen(val);
++
++ length = strlen(val) + ((4 - (strlen(val) % 4)) % 4);
++
++ print(val, length, 1, out);
++ offset += length;
++ }
++ }
++
++ state = 0;
++ memset(key, 0, sizeof(key));
++ memset(val, 0, sizeof(val));
++ }
++
++ memset(line, 0, sizeof(line));
++ }
++
++ print_index(array, n_entries, out);
++
++ if( offset > 0 )
++ {
++ print_uint32(offset, out);
++ fsync(fileno(out));
++ fclose(out);
++ }
++ else
++ {
++ fclose(out);
++ unlink(argv[2]);
++ }
++
++ fclose(in);
++ return(0);
++}
+diff --git a/feeds/luci/modules/luci-base/src/template_lmo.c b/feeds/luci/modules/luci-base/src/template_lmo.c
+new file mode 100644
+index 0000000..3d1eaf4
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/src/template_lmo.c
+@@ -0,0 +1,328 @@
++/*
++ * lmo - Lua Machine Objects - Base functions
++ *
++ * Copyright (C) 2009-2010 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "template_lmo.h"
++
++/*
++ * Hash function from http://www.azillionmonkeys.com/qed/hash.html
++ * Copyright (C) 2004-2008 by Paul Hsieh
++ */
++
++uint32_t sfh_hash(const char *data, int len)
++{
++ uint32_t hash = len, tmp;
++ int rem;
++
++ if (len <= 0 || data == NULL) return 0;
++
++ rem = len & 3;
++ len >>= 2;
++
++ /* Main loop */
++ for (;len > 0; len--) {
++ hash += sfh_get16(data);
++ tmp = (sfh_get16(data+2) << 11) ^ hash;
++ hash = (hash << 16) ^ tmp;
++ data += 2*sizeof(uint16_t);
++ hash += hash >> 11;
++ }
++
++ /* Handle end cases */
++ switch (rem) {
++ case 3: hash += sfh_get16(data);
++ hash ^= hash << 16;
++ hash ^= data[sizeof(uint16_t)] << 18;
++ hash += hash >> 11;
++ break;
++ case 2: hash += sfh_get16(data);
++ hash ^= hash << 11;
++ hash += hash >> 17;
++ break;
++ case 1: hash += *data;
++ hash ^= hash << 10;
++ hash += hash >> 1;
++ }
++
++ /* Force "avalanching" of final 127 bits */
++ hash ^= hash << 3;
++ hash += hash >> 5;
++ hash ^= hash << 4;
++ hash += hash >> 17;
++ hash ^= hash << 25;
++ hash += hash >> 6;
++
++ return hash;
++}
++
++uint32_t lmo_canon_hash(const char *str, int len)
++{
++ char res[4096];
++ char *ptr, prev;
++ int off;
++
++ if (!str || len >= sizeof(res))
++ return 0;
++
++ for (prev = ' ', ptr = res, off = 0; off < len; prev = *str, off++, str++)
++ {
++ if (isspace(*str))
++ {
++ if (!isspace(prev))
++ *ptr++ = ' ';
++ }
++ else
++ {
++ *ptr++ = *str;
++ }
++ }
++
++ if ((ptr > res) && isspace(*(ptr-1)))
++ ptr--;
++
++ return sfh_hash(res, ptr - res);
++}
++
++lmo_archive_t * lmo_open(const char *file)
++{
++ int in = -1;
++ uint32_t idx_offset = 0;
++ struct stat s;
++
++ lmo_archive_t *ar = NULL;
++
++ if (stat(file, &s) == -1)
++ goto err;
++
++ if ((in = open(file, O_RDONLY)) == -1)
++ goto err;
++
++ if ((ar = (lmo_archive_t *)malloc(sizeof(*ar))) != NULL)
++ {
++ memset(ar, 0, sizeof(*ar));
++
++ ar->fd = in;
++ ar->size = s.st_size;
++
++ fcntl(ar->fd, F_SETFD, fcntl(ar->fd, F_GETFD) | FD_CLOEXEC);
++
++ if ((ar->mmap = mmap(NULL, ar->size, PROT_READ, MAP_SHARED, ar->fd, 0)) == MAP_FAILED)
++ goto err;
++
++ idx_offset = ntohl(*((const uint32_t *)
++ (ar->mmap + ar->size - sizeof(uint32_t))));
++
++ if (idx_offset >= ar->size)
++ goto err;
++
++ ar->index = (lmo_entry_t *)(ar->mmap + idx_offset);
++ ar->length = (ar->size - idx_offset - sizeof(uint32_t)) / sizeof(lmo_entry_t);
++ ar->end = ar->mmap + ar->size;
++
++ return ar;
++ }
++
++err:
++ if (in > -1)
++ close(in);
++
++ if (ar != NULL)
++ {
++ if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
++ munmap(ar->mmap, ar->size);
++
++ free(ar);
++ }
++
++ return NULL;
++}
++
++void lmo_close(lmo_archive_t *ar)
++{
++ if (ar != NULL)
++ {
++ if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
++ munmap(ar->mmap, ar->size);
++
++ close(ar->fd);
++ free(ar);
++
++ ar = NULL;
++ }
++}
++
++
++lmo_catalog_t *_lmo_catalogs = NULL;
++lmo_catalog_t *_lmo_active_catalog = NULL;
++
++int lmo_load_catalog(const char *lang, const char *dir)
++{
++ DIR *dh = NULL;
++ char pattern[16];
++ char path[PATH_MAX];
++ struct dirent *de = NULL;
++
++ lmo_archive_t *ar = NULL;
++ lmo_catalog_t *cat = NULL;
++
++ if (!lmo_change_catalog(lang))
++ return 0;
++
++ if (!dir || !(dh = opendir(dir)))
++ goto err;
++
++ if (!(cat = malloc(sizeof(*cat))))
++ goto err;
++
++ memset(cat, 0, sizeof(*cat));
++
++ snprintf(cat->lang, sizeof(cat->lang), "%s", lang);
++ snprintf(pattern, sizeof(pattern), "*.%s.lmo", lang);
++
++ while ((de = readdir(dh)) != NULL)
++ {
++ if (!fnmatch(pattern, de->d_name, 0))
++ {
++ snprintf(path, sizeof(path), "%s/%s", dir, de->d_name);
++ ar = lmo_open(path);
++
++ if (ar)
++ {
++ ar->next = cat->archives;
++ cat->archives = ar;
++ }
++ }
++ }
++
++ closedir(dh);
++
++ cat->next = _lmo_catalogs;
++ _lmo_catalogs = cat;
++
++ if (!_lmo_active_catalog)
++ _lmo_active_catalog = cat;
++
++ return 0;
++
++err:
++ if (dh) closedir(dh);
++ if (cat) free(cat);
++
++ return -1;
++}
++
++int lmo_change_catalog(const char *lang)
++{
++ lmo_catalog_t *cat;
++
++ for (cat = _lmo_catalogs; cat; cat = cat->next)
++ {
++ if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
++ {
++ _lmo_active_catalog = cat;
++ return 0;
++ }
++ }
++
++ return -1;
++}
++
++static lmo_entry_t * lmo_find_entry(lmo_archive_t *ar, uint32_t hash)
++{
++ unsigned int m, l, r;
++ uint32_t k;
++
++ l = 0;
++ r = ar->length - 1;
++
++ while (1)
++ {
++ m = l + ((r - l) / 2);
++
++ if (r < l)
++ break;
++
++ k = ntohl(ar->index[m].key_id);
++
++ if (k == hash)
++ return &ar->index[m];
++
++ if (k > hash)
++ {
++ if (!m)
++ break;
++
++ r = m - 1;
++ }
++ else
++ {
++ l = m + 1;
++ }
++ }
++
++ return NULL;
++}
++
++int lmo_translate(const char *key, int keylen, char **out, int *outlen)
++{
++ uint32_t hash;
++ lmo_entry_t *e;
++ lmo_archive_t *ar;
++
++ if (!key || !_lmo_active_catalog)
++ return -2;
++
++ hash = lmo_canon_hash(key, keylen);
++
++ for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
++ {
++ if ((e = lmo_find_entry(ar, hash)) != NULL)
++ {
++ *out = ar->mmap + ntohl(e->offset);
++ *outlen = ntohl(e->length);
++ return 0;
++ }
++ }
++
++ return -1;
++}
++
++void lmo_close_catalog(const char *lang)
++{
++ lmo_archive_t *ar, *next;
++ lmo_catalog_t *cat, *prev;
++
++ for (prev = NULL, cat = _lmo_catalogs; cat; prev = cat, cat = cat->next)
++ {
++ if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
++ {
++ if (prev)
++ prev->next = cat->next;
++ else
++ _lmo_catalogs = cat->next;
++
++ for (ar = cat->archives; ar; ar = next)
++ {
++ next = ar->next;
++ lmo_close(ar);
++ }
++
++ free(cat);
++ break;
++ }
++ }
++}
+diff --git a/feeds/luci/modules/luci-base/src/template_lmo.h b/feeds/luci/modules/luci-base/src/template_lmo.h
+new file mode 100644
+index 0000000..f251c63
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/src/template_lmo.h
+@@ -0,0 +1,92 @@
++/*
++ * lmo - Lua Machine Objects - General header
++ *
++ * Copyright (C) 2009-2012 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef _TEMPLATE_LMO_H_
++#define _TEMPLATE_LMO_H_
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <stdint.h>
++#include <string.h>
++#include <fcntl.h>
++#include <sys/stat.h>
++#include <sys/mman.h>
++#include <arpa/inet.h>
++#include <unistd.h>
++#include <errno.h>
++#include <fnmatch.h>
++#include <dirent.h>
++#include <ctype.h>
++#include <limits.h>
++
++#if (defined(__GNUC__) && defined(__i386__))
++#define sfh_get16(d) (*((const uint16_t *) (d)))
++#else
++#define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
++ +(uint32_t)(((const uint8_t *)(d))[0]) )
++#endif
++
++
++struct lmo_entry {
++ uint32_t key_id;
++ uint32_t val_id;
++ uint32_t offset;
++ uint32_t length;
++} __attribute__((packed));
++
++typedef struct lmo_entry lmo_entry_t;
++
++
++struct lmo_archive {
++ int fd;
++ int length;
++ uint32_t size;
++ lmo_entry_t *index;
++ char *mmap;
++ char *end;
++ struct lmo_archive *next;
++};
++
++typedef struct lmo_archive lmo_archive_t;
++
++
++struct lmo_catalog {
++ char lang[6];
++ struct lmo_archive *archives;
++ struct lmo_catalog *next;
++};
++
++typedef struct lmo_catalog lmo_catalog_t;
++
++
++uint32_t sfh_hash(const char *data, int len);
++uint32_t lmo_canon_hash(const char *data, int len);
++
++lmo_archive_t * lmo_open(const char *file);
++void lmo_close(lmo_archive_t *ar);
++
++
++extern lmo_catalog_t *_lmo_catalogs;
++extern lmo_catalog_t *_lmo_active_catalog;
++
++int lmo_load_catalog(const char *lang, const char *dir);
++int lmo_change_catalog(const char *lang);
++int lmo_translate(const char *key, int keylen, char **out, int *outlen);
++void lmo_close_catalog(const char *lang);
++
++#endif
+diff --git a/feeds/luci/modules/luci-base/src/template_lualib.c b/feeds/luci/modules/luci-base/src/template_lualib.c
+new file mode 100644
+index 0000000..d5c8dd6
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/src/template_lualib.c
+@@ -0,0 +1,179 @@
++/*
++ * LuCI Template - Lua binding
++ *
++ * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "template_lualib.h"
++
++static int template_L_do_parse(lua_State *L, struct template_parser *parser, const char *chunkname)
++{
++ int lua_status, rv;
++
++ if (!parser)
++ {
++ lua_pushnil(L);
++ lua_pushinteger(L, errno);
++ lua_pushstring(L, strerror(errno));
++ return 3;
++ }
++
++ lua_status = lua_load(L, template_reader, parser, chunkname);
++
++ if (lua_status == 0)
++ rv = 1;
++ else
++ rv = template_error(L, parser);
++
++ template_close(parser);
++
++ return rv;
++}
++
++int template_L_parse(lua_State *L)
++{
++ const char *file = luaL_checkstring(L, 1);
++ struct template_parser *parser = template_open(file);
++
++ return template_L_do_parse(L, parser, file);
++}
++
++int template_L_parse_string(lua_State *L)
++{
++ size_t len;
++ const char *str = luaL_checklstring(L, 1, &len);
++ struct template_parser *parser = template_string(str, len);
++
++ return template_L_do_parse(L, parser, "[string]");
++}
++
++int template_L_utf8(lua_State *L)
++{
++ size_t len = 0;
++ const char *str = luaL_checklstring(L, 1, &len);
++ char *res = utf8(str, len);
++
++ if (res != NULL)
++ {
++ lua_pushstring(L, res);
++ free(res);
++
++ return 1;
++ }
++
++ return 0;
++}
++
++int template_L_pcdata(lua_State *L)
++{
++ size_t len = 0;
++ const char *str = luaL_checklstring(L, 1, &len);
++ char *res = pcdata(str, len);
++
++ if (res != NULL)
++ {
++ lua_pushstring(L, res);
++ free(res);
++
++ return 1;
++ }
++
++ return 0;
++}
++
++int template_L_striptags(lua_State *L)
++{
++ size_t len = 0;
++ const char *str = luaL_checklstring(L, 1, &len);
++ char *res = striptags(str, len);
++
++ if (res != NULL)
++ {
++ lua_pushstring(L, res);
++ free(res);
++
++ return 1;
++ }
++
++ return 0;
++}
++
++static int template_L_load_catalog(lua_State *L) {
++ const char *lang = luaL_optstring(L, 1, "en");
++ const char *dir = luaL_optstring(L, 2, NULL);
++ lua_pushboolean(L, !lmo_load_catalog(lang, dir));
++ return 1;
++}
++
++static int template_L_close_catalog(lua_State *L) {
++ const char *lang = luaL_optstring(L, 1, "en");
++ lmo_close_catalog(lang);
++ return 0;
++}
++
++static int template_L_change_catalog(lua_State *L) {
++ const char *lang = luaL_optstring(L, 1, "en");
++ lua_pushboolean(L, !lmo_change_catalog(lang));
++ return 1;
++}
++
++static int template_L_translate(lua_State *L) {
++ size_t len;
++ char *tr;
++ int trlen;
++ const char *key = luaL_checklstring(L, 1, &len);
++
++ switch (lmo_translate(key, len, &tr, &trlen))
++ {
++ case 0:
++ lua_pushlstring(L, tr, trlen);
++ return 1;
++
++ case -1:
++ return 0;
++ }
++
++ lua_pushnil(L);
++ lua_pushstring(L, "no catalog loaded");
++ return 2;
++}
++
++static int template_L_hash(lua_State *L) {
++ size_t len;
++ const char *key = luaL_checklstring(L, 1, &len);
++ lua_pushinteger(L, sfh_hash(key, len));
++ return 1;
++}
++
++
++/* module table */
++static const luaL_reg R[] = {
++ { "parse", template_L_parse },
++ { "parse_string", template_L_parse_string },
++ { "utf8", template_L_utf8 },
++ { "pcdata", template_L_pcdata },
++ { "striptags", template_L_striptags },
++ { "load_catalog", template_L_load_catalog },
++ { "close_catalog", template_L_close_catalog },
++ { "change_catalog", template_L_change_catalog },
++ { "translate", template_L_translate },
++ { "hash", template_L_hash },
++ { NULL, NULL }
++};
++
++LUALIB_API int luaopen_luci_template_parser(lua_State *L) {
++ luaL_register(L, TEMPLATE_LUALIB_META, R);
++ return 1;
++}
+diff --git a/feeds/luci/modules/luci-base/src/template_lualib.h b/feeds/luci/modules/luci-base/src/template_lualib.h
+new file mode 100644
+index 0000000..ff7746d
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/src/template_lualib.h
+@@ -0,0 +1,30 @@
++/*
++ * LuCI Template - Lua library header
++ *
++ * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef _TEMPLATE_LUALIB_H_
++#define _TEMPLATE_LUALIB_H_
++
++#include "template_parser.h"
++#include "template_utils.h"
++#include "template_lmo.h"
++
++#define TEMPLATE_LUALIB_META "template.parser"
++
++LUALIB_API int luaopen_luci_template_parser(lua_State *L);
++
++#endif
+diff --git a/feeds/luci/modules/luci-base/src/template_parser.c b/feeds/luci/modules/luci-base/src/template_parser.c
+new file mode 100644
+index 0000000..0ef08c6
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/src/template_parser.c
+@@ -0,0 +1,419 @@
++/*
++ * LuCI Template - Parser implementation
++ *
++ * Copyright (C) 2009-2012 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "template_parser.h"
++#include "template_utils.h"
++#include "template_lmo.h"
++
++
++/* leading and trailing code for different types */
++const char *gen_code[9][2] = {
++ { NULL, NULL },
++ { "write(\"", "\")" },
++ { NULL, NULL },
++ { "write(tostring(", " or \"\"))" },
++ { "include(\"", "\")" },
++ { "write(\"", "\")" },
++ { "write(\"", "\")" },
++ { NULL, " " },
++ { NULL, NULL },
++};
++
++/* Simple strstr() like function that takes len arguments for both haystack and needle. */
++static char *strfind(char *haystack, int hslen, const char *needle, int ndlen)
++{
++ int match = 0;
++ int i, j;
++
++ for( i = 0; i < hslen; i++ )
++ {
++ if( haystack[i] == needle[0] )
++ {
++ match = ((ndlen == 1) || ((i + ndlen) <= hslen));
++
++ for( j = 1; (j < ndlen) && ((i + j) < hslen); j++ )
++ {
++ if( haystack[i+j] != needle[j] )
++ {
++ match = 0;
++ break;
++ }
++ }
++
++ if( match )
++ return &haystack[i];
++ }
++ }
++
++ return NULL;
++}
++
++struct template_parser * template_open(const char *file)
++{
++ struct stat s;
++ struct template_parser *parser;
++
++ if (!(parser = malloc(sizeof(*parser))))
++ goto err;
++
++ memset(parser, 0, sizeof(*parser));
++ parser->fd = -1;
++ parser->file = file;
++
++ if (stat(file, &s))
++ goto err;
++
++ if ((parser->fd = open(file, O_RDONLY)) < 0)
++ goto err;
++
++ parser->size = s.st_size;
++ parser->data = mmap(NULL, parser->size, PROT_READ, MAP_PRIVATE,
++ parser->fd, 0);
++
++ if (parser->data != MAP_FAILED)
++ {
++ parser->off = parser->data;
++ parser->cur_chunk.type = T_TYPE_INIT;
++ parser->cur_chunk.s = parser->data;
++ parser->cur_chunk.e = parser->data;
++
++ return parser;
++ }
++
++err:
++ template_close(parser);
++ return NULL;
++}
++
++struct template_parser * template_string(const char *str, uint32_t len)
++{
++ struct template_parser *parser;
++
++ if (!str) {
++ errno = EINVAL;
++ goto err;
++ }
++
++ if (!(parser = malloc(sizeof(*parser))))
++ goto err;
++
++ memset(parser, 0, sizeof(*parser));
++ parser->fd = -1;
++
++ parser->size = len;
++ parser->data = (char*)str;
++
++ parser->off = parser->data;
++ parser->cur_chunk.type = T_TYPE_INIT;
++ parser->cur_chunk.s = parser->data;
++ parser->cur_chunk.e = parser->data;
++
++ return parser;
++
++err:
++ template_close(parser);
++ return NULL;
++}
++
++void template_close(struct template_parser *parser)
++{
++ if (!parser)
++ return;
++
++ if (parser->gc != NULL)
++ free(parser->gc);
++
++ /* if file is not set, we were parsing a string */
++ if (parser->file) {
++ if ((parser->data != NULL) && (parser->data != MAP_FAILED))
++ munmap(parser->data, parser->size);
++
++ if (parser->fd >= 0)
++ close(parser->fd);
++ }
++
++ free(parser);
++}
++
++void template_text(struct template_parser *parser, const char *e)
++{
++ const char *s = parser->off;
++
++ if (s < (parser->data + parser->size))
++ {
++ if (parser->strip_after)
++ {
++ while ((s <= e) && isspace(*s))
++ s++;
++ }
++
++ parser->cur_chunk.type = T_TYPE_TEXT;
++ }
++ else
++ {
++ parser->cur_chunk.type = T_TYPE_EOF;
++ }
++
++ parser->cur_chunk.line = parser->line;
++ parser->cur_chunk.s = s;
++ parser->cur_chunk.e = e;
++}
++
++void template_code(struct template_parser *parser, const char *e)
++{
++ const char *s = parser->off;
++
++ parser->strip_before = 0;
++ parser->strip_after = 0;
++
++ if (*s == '-')
++ {
++ parser->strip_before = 1;
++ for (s++; (s <= e) && (*s == ' ' || *s == '\t'); s++);
++ }
++
++ if (*(e-1) == '-')
++ {
++ parser->strip_after = 1;
++ for (e--; (e >= s) && (*e == ' ' || *e == '\t'); e--);
++ }
++
++ switch (*s)
++ {
++ /* comment */
++ case '#':
++ s++;
++ parser->cur_chunk.type = T_TYPE_COMMENT;
++ break;
++
++ /* include */
++ case '+':
++ s++;
++ parser->cur_chunk.type = T_TYPE_INCLUDE;
++ break;
++
++ /* translate */
++ case ':':
++ s++;
++ parser->cur_chunk.type = T_TYPE_I18N;
++ break;
++
++ /* translate raw */
++ case '_':
++ s++;
++ parser->cur_chunk.type = T_TYPE_I18N_RAW;
++ break;
++
++ /* expr */
++ case '=':
++ s++;
++ parser->cur_chunk.type = T_TYPE_EXPR;
++ break;
++
++ /* code */
++ default:
++ parser->cur_chunk.type = T_TYPE_CODE;
++ break;
++ }
++
++ parser->cur_chunk.line = parser->line;
++ parser->cur_chunk.s = s;
++ parser->cur_chunk.e = e;
++}
++
++static const char *
++template_format_chunk(struct template_parser *parser, size_t *sz)
++{
++ const char *s, *p;
++ const char *head, *tail;
++ struct template_chunk *c = &parser->prv_chunk;
++ struct template_buffer *buf;
++
++ *sz = 0;
++ s = parser->gc = NULL;
++
++ if (parser->strip_before && c->type == T_TYPE_TEXT)
++ {
++ while ((c->e > c->s) && isspace(*(c->e - 1)))
++ c->e--;
++ }
++
++ /* empty chunk */
++ if (c->s == c->e)
++ {
++ if (c->type == T_TYPE_EOF)
++ {
++ *sz = 0;
++ s = NULL;
++ }
++ else
++ {
++ *sz = 1;
++ s = " ";
++ }
++ }
++
++ /* format chunk */
++ else if ((buf = buf_init(c->e - c->s)) != NULL)
++ {
++ if ((head = gen_code[c->type][0]) != NULL)
++ buf_append(buf, head, strlen(head));
++
++ switch (c->type)
++ {
++ case T_TYPE_TEXT:
++ luastr_escape(buf, c->s, c->e - c->s, 0);
++ break;
++
++ case T_TYPE_EXPR:
++ buf_append(buf, c->s, c->e - c->s);
++ for (p = c->s; p < c->e; p++)
++ parser->line += (*p == '\n');
++ break;
++
++ case T_TYPE_INCLUDE:
++ luastr_escape(buf, c->s, c->e - c->s, 0);
++ break;
++
++ case T_TYPE_I18N:
++ luastr_translate(buf, c->s, c->e - c->s, 1);
++ break;
++
++ case T_TYPE_I18N_RAW:
++ luastr_translate(buf, c->s, c->e - c->s, 0);
++ break;
++
++ case T_TYPE_CODE:
++ buf_append(buf, c->s, c->e - c->s);
++ for (p = c->s; p < c->e; p++)
++ parser->line += (*p == '\n');
++ break;
++ }
++
++ if ((tail = gen_code[c->type][1]) != NULL)
++ buf_append(buf, tail, strlen(tail));
++
++ *sz = buf_length(buf);
++ s = parser->gc = buf_destroy(buf);
++
++ if (!*sz)
++ {
++ *sz = 1;
++ s = " ";
++ }
++ }
++
++ return s;
++}
++
++const char *template_reader(lua_State *L, void *ud, size_t *sz)
++{
++ struct template_parser *parser = ud;
++ int rem = parser->size - (parser->off - parser->data);
++ char *tag;
++
++ parser->prv_chunk = parser->cur_chunk;
++
++ /* free previous string */
++ if (parser->gc)
++ {
++ free(parser->gc);
++ parser->gc = NULL;
++ }
++
++ /* before tag */
++ if (!parser->in_expr)
++ {
++ if ((tag = strfind(parser->off, rem, "<%", 2)) != NULL)
++ {
++ template_text(parser, tag);
++ parser->off = tag + 2;
++ parser->in_expr = 1;
++ }
++ else
++ {
++ template_text(parser, parser->data + parser->size);
++ parser->off = parser->data + parser->size;
++ }
++ }
++
++ /* inside tag */
++ else
++ {
++ if ((tag = strfind(parser->off, rem, "%>", 2)) != NULL)
++ {
++ template_code(parser, tag);
++ parser->off = tag + 2;
++ parser->in_expr = 0;
++ }
++ else
++ {
++ /* unexpected EOF */
++ template_code(parser, parser->data + parser->size);
++
++ *sz = 1;
++ return "\033";
++ }
++ }
++
++ return template_format_chunk(parser, sz);
++}
++
++int template_error(lua_State *L, struct template_parser *parser)
++{
++ const char *err = luaL_checkstring(L, -1);
++ const char *off = parser->prv_chunk.s;
++ const char *ptr;
++ char msg[1024];
++ int line = 0;
++ int chunkline = 0;
++
++ if ((ptr = strfind((char *)err, strlen(err), "]:", 2)) != NULL)
++ {
++ chunkline = atoi(ptr + 2) - parser->prv_chunk.line;
++
++ while (*ptr)
++ {
++ if (*ptr++ == ' ')
++ {
++ err = ptr;
++ break;
++ }
++ }
++ }
++
++ if (strfind((char *)err, strlen(err), "'char(27)'", 10) != NULL)
++ {
++ off = parser->data + parser->size;
++ err = "'%>' expected before end of file";
++ chunkline = 0;
++ }
++
++ for (ptr = parser->data; ptr < off; ptr++)
++ if (*ptr == '\n')
++ line++;
++
++ snprintf(msg, sizeof(msg), "Syntax error in %s:%d: %s",
++ parser->file ? parser->file : "[string]", line + chunkline, err ? err : "(unknown error)");
++
++ lua_pushnil(L);
++ lua_pushinteger(L, line + chunkline);
++ lua_pushstring(L, msg);
++
++ return 3;
++}
+diff --git a/feeds/luci/modules/luci-base/src/template_parser.h b/feeds/luci/modules/luci-base/src/template_parser.h
+new file mode 100644
+index 0000000..2415e87
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/src/template_parser.h
+@@ -0,0 +1,80 @@
++/*
++ * LuCI Template - Parser header
++ *
++ * Copyright (C) 2009 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef _TEMPLATE_PARSER_H_
++#define _TEMPLATE_PARSER_H_
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <stdint.h>
++#include <unistd.h>
++#include <fcntl.h>
++#include <sys/stat.h>
++#include <sys/mman.h>
++#include <string.h>
++#include <ctype.h>
++#include <errno.h>
++
++#include <lua.h>
++#include <lualib.h>
++#include <lauxlib.h>
++
++
++/* code types */
++#define T_TYPE_INIT 0
++#define T_TYPE_TEXT 1
++#define T_TYPE_COMMENT 2
++#define T_TYPE_EXPR 3
++#define T_TYPE_INCLUDE 4
++#define T_TYPE_I18N 5
++#define T_TYPE_I18N_RAW 6
++#define T_TYPE_CODE 7
++#define T_TYPE_EOF 8
++
++
++struct template_chunk {
++ const char *s;
++ const char *e;
++ int type;
++ int line;
++};
++
++/* parser state */
++struct template_parser {
++ int fd;
++ uint32_t size;
++ char *data;
++ char *off;
++ char *gc;
++ int line;
++ int in_expr;
++ int strip_before;
++ int strip_after;
++ struct template_chunk prv_chunk;
++ struct template_chunk cur_chunk;
++ const char *file;
++};
++
++struct template_parser * template_open(const char *file);
++struct template_parser * template_string(const char *str, uint32_t len);
++void template_close(struct template_parser *parser);
++
++const char *template_reader(lua_State *L, void *ud, size_t *sz);
++int template_error(lua_State *L, struct template_parser *parser);
++
++#endif
+diff --git a/feeds/luci/modules/luci-base/src/template_utils.c b/feeds/luci/modules/luci-base/src/template_utils.c
+new file mode 100644
+index 0000000..3979487
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/src/template_utils.c
+@@ -0,0 +1,484 @@
++/*
++ * LuCI Template - Utility functions
++ *
++ * Copyright (C) 2010 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include "template_utils.h"
++#include "template_lmo.h"
++
++/* initialize a buffer object */
++struct template_buffer * buf_init(int size)
++{
++ struct template_buffer *buf;
++
++ if (size <= 0)
++ size = 1024;
++
++ buf = (struct template_buffer *)malloc(sizeof(struct template_buffer));
++
++ if (buf != NULL)
++ {
++ buf->fill = 0;
++ buf->size = size;
++ buf->data = malloc(buf->size);
++
++ if (buf->data != NULL)
++ {
++ buf->dptr = buf->data;
++ buf->data[0] = 0;
++
++ return buf;
++ }
++
++ free(buf);
++ }
++
++ return NULL;
++}
++
++/* grow buffer */
++int buf_grow(struct template_buffer *buf, int size)
++{
++ unsigned int off = (buf->dptr - buf->data);
++ char *data;
++
++ if (size <= 0)
++ size = 1024;
++
++ data = realloc(buf->data, buf->size + size);
++
++ if (data != NULL)
++ {
++ buf->data = data;
++ buf->dptr = data + off;
++ buf->size += size;
++
++ return buf->size;
++ }
++
++ return 0;
++}
++
++/* put one char into buffer object */
++int buf_putchar(struct template_buffer *buf, char c)
++{
++ if( ((buf->fill + 1) >= buf->size) && !buf_grow(buf, 0) )
++ return 0;
++
++ *(buf->dptr++) = c;
++ *(buf->dptr) = 0;
++
++ buf->fill++;
++ return 1;
++}
++
++/* append data to buffer */
++int buf_append(struct template_buffer *buf, const char *s, int len)
++{
++ if ((buf->fill + len + 1) >= buf->size)
++ {
++ if (!buf_grow(buf, len + 1))
++ return 0;
++ }
++
++ memcpy(buf->dptr, s, len);
++ buf->fill += len;
++ buf->dptr += len;
++
++ *(buf->dptr) = 0;
++
++ return len;
++}
++
++/* read buffer length */
++int buf_length(struct template_buffer *buf)
++{
++ return buf->fill;
++}
++
++/* destroy buffer object and return pointer to data */
++char * buf_destroy(struct template_buffer *buf)
++{
++ char *data = buf->data;
++
++ free(buf);
++ return data;
++}
++
++
++/* calculate the number of expected continuation chars */
++static inline int mb_num_chars(unsigned char c)
++{
++ if ((c & 0xE0) == 0xC0)
++ return 2;
++ else if ((c & 0xF0) == 0xE0)
++ return 3;
++ else if ((c & 0xF8) == 0xF0)
++ return 4;
++ else if ((c & 0xFC) == 0xF8)
++ return 5;
++ else if ((c & 0xFE) == 0xFC)
++ return 6;
++
++ return 1;
++}
++
++/* test whether the given byte is a valid continuation char */
++static inline int mb_is_cont(unsigned char c)
++{
++ return ((c >= 0x80) && (c <= 0xBF));
++}
++
++/* test whether the byte sequence at the given pointer with the given
++ * length is the shortest possible representation of the code point */
++static inline int mb_is_shortest(unsigned char *s, int n)
++{
++ switch (n)
++ {
++ case 2:
++ /* 1100000x (10xxxxxx) */
++ return !(((*s >> 1) == 0x60) &&
++ ((*(s+1) >> 6) == 0x02));
++
++ case 3:
++ /* 11100000 100xxxxx (10xxxxxx) */
++ return !((*s == 0xE0) &&
++ ((*(s+1) >> 5) == 0x04) &&
++ ((*(s+2) >> 6) == 0x02));
++
++ case 4:
++ /* 11110000 1000xxxx (10xxxxxx 10xxxxxx) */
++ return !((*s == 0xF0) &&
++ ((*(s+1) >> 4) == 0x08) &&
++ ((*(s+2) >> 6) == 0x02) &&
++ ((*(s+3) >> 6) == 0x02));
++
++ case 5:
++ /* 11111000 10000xxx (10xxxxxx 10xxxxxx 10xxxxxx) */
++ return !((*s == 0xF8) &&
++ ((*(s+1) >> 3) == 0x10) &&
++ ((*(s+2) >> 6) == 0x02) &&
++ ((*(s+3) >> 6) == 0x02) &&
++ ((*(s+4) >> 6) == 0x02));
++
++ case 6:
++ /* 11111100 100000xx (10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx) */
++ return !((*s == 0xF8) &&
++ ((*(s+1) >> 2) == 0x20) &&
++ ((*(s+2) >> 6) == 0x02) &&
++ ((*(s+3) >> 6) == 0x02) &&
++ ((*(s+4) >> 6) == 0x02) &&
++ ((*(s+5) >> 6) == 0x02));
++ }
++
++ return 1;
++}
++
++/* test whether the byte sequence at the given pointer with the given
++ * length is an UTF-16 surrogate */
++static inline int mb_is_surrogate(unsigned char *s, int n)
++{
++ return ((n == 3) && (*s == 0xED) && (*(s+1) >= 0xA0) && (*(s+1) <= 0xBF));
++}
++
++/* test whether the byte sequence at the given pointer with the given
++ * length is an illegal UTF-8 code point */
++static inline int mb_is_illegal(unsigned char *s, int n)
++{
++ return ((n == 3) && (*s == 0xEF) && (*(s+1) == 0xBF) &&
++ (*(s+2) >= 0xBE) && (*(s+2) <= 0xBF));
++}
++
++
++/* scan given source string, validate UTF-8 sequence and store result
++ * in given buffer object */
++static int _validate_utf8(unsigned char **s, int l, struct template_buffer *buf)
++{
++ unsigned char *ptr = *s;
++ unsigned int o = 0, v, n;
++
++ /* ascii byte without null */
++ if ((*(ptr+0) >= 0x01) && (*(ptr+0) <= 0x7F))
++ {
++ if (!buf_putchar(buf, *ptr++))
++ return 0;
++
++ o = 1;
++ }
++
++ /* multi byte sequence */
++ else if ((n = mb_num_chars(*ptr)) > 1)
++ {
++ /* count valid chars */
++ for (v = 1; (v <= n) && ((o+v) < l) && mb_is_cont(*(ptr+v)); v++);
++
++ switch (n)
++ {
++ case 6:
++ case 5:
++ /* five and six byte sequences are always invalid */
++ if (!buf_putchar(buf, '?'))
++ return 0;
++
++ break;
++
++ default:
++ /* if the number of valid continuation bytes matches the
++ * expected number and if the sequence is legal, copy
++ * the bytes to the destination buffer */
++ if ((v == n) && mb_is_shortest(ptr, n) &&
++ !mb_is_surrogate(ptr, n) && !mb_is_illegal(ptr, n))
++ {
++ /* copy sequence */
++ if (!buf_append(buf, (char *)ptr, n))
++ return 0;
++ }
++
++ /* the found sequence is illegal, skip it */
++ else
++ {
++ /* invalid sequence */
++ if (!buf_putchar(buf, '?'))
++ return 0;
++ }
++
++ break;
++ }
++
++ /* advance beyound the last found valid continuation char */
++ o = v;
++ ptr += v;
++ }
++
++ /* invalid byte (0x00) */
++ else
++ {
++ if (!buf_putchar(buf, '?')) /* or 0xEF, 0xBF, 0xBD */
++ return 0;
++
++ o = 1;
++ ptr++;
++ }
++
++ *s = ptr;
++ return o;
++}
++
++/* sanitize given string and replace all invalid UTF-8 sequences with "?" */
++char * utf8(const char *s, unsigned int l)
++{
++ struct template_buffer *buf = buf_init(l);
++ unsigned char *ptr = (unsigned char *)s;
++ unsigned int v, o;
++
++ if (!buf)
++ return NULL;
++
++ for (o = 0; o < l; o++)
++ {
++ /* ascii char */
++ if ((*ptr >= 0x01) && (*ptr <= 0x7F))
++ {
++ if (!buf_putchar(buf, (char)*ptr++))
++ break;
++ }
++
++ /* invalid byte or multi byte sequence */
++ else
++ {
++ if (!(v = _validate_utf8(&ptr, l - o, buf)))
++ break;
++
++ o += (v - 1);
++ }
++ }
++
++ return buf_destroy(buf);
++}
++
++/* Sanitize given string and strip all invalid XML bytes
++ * Validate UTF-8 sequences
++ * Escape XML control chars */
++char * pcdata(const char *s, unsigned int l)
++{
++ struct template_buffer *buf = buf_init(l);
++ unsigned char *ptr = (unsigned char *)s;
++ unsigned int o, v;
++ char esq[8];
++ int esl;
++
++ if (!buf)
++ return NULL;
++
++ for (o = 0; o < l; o++)
++ {
++ /* Invalid XML bytes */
++ if (((*ptr >= 0x00) && (*ptr <= 0x08)) ||
++ ((*ptr >= 0x0B) && (*ptr <= 0x0C)) ||
++ ((*ptr >= 0x0E) && (*ptr <= 0x1F)) ||
++ (*ptr == 0x7F))
++ {
++ ptr++;
++ }
++
++ /* Escapes */
++ else if ((*ptr == 0x26) ||
++ (*ptr == 0x27) ||
++ (*ptr == 0x22) ||
++ (*ptr == 0x3C) ||
++ (*ptr == 0x3E))
++ {
++ esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr);
++
++ if (!buf_append(buf, esq, esl))
++ break;
++
++ ptr++;
++ }
++
++ /* ascii char */
++ else if (*ptr <= 0x7F)
++ {
++ buf_putchar(buf, (char)*ptr++);
++ }
++
++ /* multi byte sequence */
++ else
++ {
++ if (!(v = _validate_utf8(&ptr, l - o, buf)))
++ break;
++
++ o += (v - 1);
++ }
++ }
++
++ return buf_destroy(buf);
++}
++
++char * striptags(const char *s, unsigned int l)
++{
++ struct template_buffer *buf = buf_init(l);
++ unsigned char *ptr = (unsigned char *)s;
++ unsigned char *end = ptr + l;
++ unsigned char *tag;
++ unsigned char prev;
++ char esq[8];
++ int esl;
++
++ for (prev = ' '; ptr < end; ptr++)
++ {
++ if ((*ptr == '<') && ((ptr + 2) < end) &&
++ ((*(ptr + 1) == '/') || isalpha(*(ptr + 1))))
++ {
++ for (tag = ptr; tag < end; tag++)
++ {
++ if (*tag == '>')
++ {
++ if (!isspace(prev))
++ buf_putchar(buf, ' ');
++
++ ptr = tag;
++ prev = ' ';
++ break;
++ }
++ }
++ }
++ else if (isspace(*ptr))
++ {
++ if (!isspace(prev))
++ buf_putchar(buf, *ptr);
++
++ prev = *ptr;
++ }
++ else
++ {
++ switch(*ptr)
++ {
++ case '"':
++ case '\'':
++ case '<':
++ case '>':
++ case '&':
++ esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr);
++ buf_append(buf, esq, esl);
++ break;
++
++ default:
++ buf_putchar(buf, *ptr);
++ break;
++ }
++
++ prev = *ptr;
++ }
++ }
++
++ return buf_destroy(buf);
++}
++
++void luastr_escape(struct template_buffer *out, const char *s, unsigned int l,
++ int escape_xml)
++{
++ int esl;
++ char esq[8];
++ char *ptr;
++
++ for (ptr = (char *)s; ptr < (s + l); ptr++)
++ {
++ switch (*ptr)
++ {
++ case '\\':
++ buf_append(out, "\\\\", 2);
++ break;
++
++ case '"':
++ if (escape_xml)
++ buf_append(out, "&#34;", 5);
++ else
++ buf_append(out, "\\\"", 2);
++ break;
++
++ case '\n':
++ buf_append(out, "\\n", 2);
++ break;
++
++ case '\'':
++ case '&':
++ case '<':
++ case '>':
++ if (escape_xml)
++ {
++ esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr);
++ buf_append(out, esq, esl);
++ break;
++ }
++
++ default:
++ buf_putchar(out, *ptr);
++ }
++ }
++}
++
++void luastr_translate(struct template_buffer *out, const char *s, unsigned int l,
++ int escape_xml)
++{
++ char *tr;
++ int trlen;
++
++ if (!lmo_translate(s, l, &tr, &trlen))
++ luastr_escape(out, tr, trlen, escape_xml);
++ else
++ luastr_escape(out, s, l, escape_xml);
++}
+diff --git a/feeds/luci/modules/luci-base/src/template_utils.h b/feeds/luci/modules/luci-base/src/template_utils.h
+new file mode 100644
+index 0000000..32a79f9
+--- /dev/null
++++ b/feeds/luci/modules/luci-base/src/template_utils.h
+@@ -0,0 +1,49 @@
++/*
++ * LuCI Template - Utility header
++ *
++ * Copyright (C) 2010-2012 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#ifndef _TEMPLATE_UTILS_H_
++#define _TEMPLATE_UTILS_H_
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++
++
++/* buffer object */
++struct template_buffer {
++ char *data;
++ char *dptr;
++ unsigned int size;
++ unsigned int fill;
++};
++
++struct template_buffer * buf_init(int size);
++int buf_grow(struct template_buffer *buf, int size);
++int buf_putchar(struct template_buffer *buf, char c);
++int buf_append(struct template_buffer *buf, const char *s, int len);
++int buf_length(struct template_buffer *buf);
++char * buf_destroy(struct template_buffer *buf);
++
++char * utf8(const char *s, unsigned int l);
++char * pcdata(const char *s, unsigned int l);
++char * striptags(const char *s, unsigned int l);
++
++void luastr_escape(struct template_buffer *out, const char *s, unsigned int l, int escape_xml);
++void luastr_translate(struct template_buffer *out, const char *s, unsigned int l, int escape_xml);
++
++#endif
+diff --git a/feeds/luci/modules/luci-mod-admin-full/Makefile b/feeds/luci/modules/luci-mod-admin-full/Makefile
+new file mode 100644
+index 0000000..5fed279
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/Makefile
+@@ -0,0 +1,17 @@
++#
++# 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_TITLE:=LuCI Administration - full-featured for full control
++LUCI_DEPENDS:=+luci-base
++
++PKG_BUILD_DEPENDS:=iwinfo
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
++
+diff --git a/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/bandwidth.svg b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/bandwidth.svg
+new file mode 100644
+index 0000000..4f91488
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/bandwidth.svg
+@@ -0,0 +1,16 @@
++<?xml version="1.0" standalone="no"?>
++<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
++
++<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
++ <line x1="0" y1="25%" x2="100%" y2="25%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_75" x="20" y="24%" style="fill:#999999; font-size:9pt"> </text>
++
++ <line x1="0" y1="50%" x2="100%" y2="50%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_50" x="20" y="49%" style="fill:#999999; font-size:9pt"> </text>
++
++ <line x1="0" y1="75%" x2="100%" y2="75%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_25" x="20" y="74%" style="fill:#999999; font-size:9pt"> </text>
++
++ <polyline id="rx" points="" style="fill:blue;fill-opacity:0.4;stroke:blue;stroke-width:1" />
++ <polyline id="tx" points="" style="fill:green;fill-opacity:0.4;stroke:green;stroke-width:1" />
++</svg>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/connections.svg b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/connections.svg
+new file mode 100644
+index 0000000..816f7e6
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/connections.svg
+@@ -0,0 +1,17 @@
++<?xml version="1.0" standalone="no"?>
++<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
++
++<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
++ <line x1="0" y1="25%" x2="100%" y2="25%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_75" x="20" y="24%" style="fill:#999999; font-size:9pt"> </text>
++
++ <line x1="0" y1="50%" x2="100%" y2="50%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_50" x="20" y="49%" style="fill:#999999; font-size:9pt"> </text>
++
++ <line x1="0" y1="75%" x2="100%" y2="75%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_25" x="20" y="74%" style="fill:#999999; font-size:9pt"> </text>
++
++ <polyline id="tcp" points="" style="fill:green;fill-opacity:0.4;stroke:green;stroke-width:1" />
++ <polyline id="udp" points="" style="fill:blue;fill-opacity:0.4;stroke:blue;stroke-width:1" />
++ <polyline id="other" points="" style="fill:red;fill-opacity:0.4;stroke:red;stroke-width:1" />
++</svg>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/load.svg b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/load.svg
+new file mode 100644
+index 0000000..d681702
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/load.svg
+@@ -0,0 +1,17 @@
++<?xml version="1.0" standalone="no"?>
++<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
++
++<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
++ <line x1="0" y1="25%" x2="100%" y2="25%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_75" x="20" y="24%" style="fill:#999999; font-size:9pt"> </text>
++
++ <line x1="0" y1="50%" x2="100%" y2="50%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_50" x="20" y="49%" style="fill:#999999; font-size:9pt"> </text>
++
++ <line x1="0" y1="75%" x2="100%" y2="75%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_25" x="20" y="74%" style="fill:#999999; font-size:9pt"> </text>
++
++ <polyline id="load01" points="" style="fill:#ff0000;fill-opacity:0.4;stroke:#ff0000;stroke-width:1" />
++ <polyline id="load05" points="" style="fill:#ff6600;fill-opacity:0.4;stroke:#ff6600;stroke-width:1" />
++ <polyline id="load15" points="" style="fill:#ffaa00;fill-opacity:0.4;stroke:#ffaa00;stroke-width:1" />
++</svg>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wifirate.svg b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wifirate.svg
+new file mode 100644
+index 0000000..d3e848b
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wifirate.svg
+@@ -0,0 +1,15 @@
++<?xml version="1.0" standalone="no"?>
++<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
++
++<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
++ <line x1="0" y1="25%" x2="100%" y2="25%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_75" x="20" y="24%" style="fill:#999999; font-size:9pt"> </text>
++
++ <line x1="0" y1="50%" x2="100%" y2="50%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_50" x="20" y="49%" style="fill:#999999; font-size:9pt"> </text>
++
++ <line x1="0" y1="75%" x2="100%" y2="75%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_25" x="20" y="74%" style="fill:#999999; font-size:9pt"> </text>
++
++ <polyline id="rate" points="" style="fill:green;fill-opacity:0.4;stroke:green;stroke-width:1" />
++</svg>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wireless.svg b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wireless.svg
+new file mode 100644
+index 0000000..99d9840
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wireless.svg
+@@ -0,0 +1,16 @@
++<?xml version="1.0" standalone="no"?>
++<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
++
++<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
++ <line x1="0" y1="25%" x2="100%" y2="25%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_75" x="20" y="24%" style="fill:#999999; font-size:9pt"> </text>
++
++ <line x1="0" y1="50%" x2="100%" y2="50%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_50" x="20" y="49%" style="fill:#999999; font-size:9pt"> </text>
++
++ <line x1="0" y1="75%" x2="100%" y2="75%" style="stroke:black;stroke-width:0.1" />
++ <text id="label_25" x="20" y="74%" style="fill:#999999; font-size:9pt"> </text>
++
++ <polyline id="rssi" points="" style="fill:blue;fill-opacity:0.4;stroke:blue;stroke-width:1" />
++ <polyline id="noise" points="" style="fill:red;fill-opacity:0.4;stroke:red;stroke-width:1" />
++</svg>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/filebrowser.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/filebrowser.lua
+new file mode 100644
+index 0000000..2572615
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/filebrowser.lua
+@@ -0,0 +1,9 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.admin.filebrowser", package.seeall)
++
++function index()
++ entry( {"admin", "filebrowser"}, template("cbi/filebrowser") ).leaf = true
++end
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/index.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/index.lua
+new file mode 100644
+index 0000000..cc8c2e3
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/index.lua
+@@ -0,0 +1,42 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.admin.index", package.seeall)
++
++function index()
++ local root = node()
++ if not root.target then
++ root.target = alias("admin")
++ root.index = true
++ end
++
++ local page = node("admin")
++ page.target = firstchild()
++ page.title = _("Administration")
++ page.order = 10
++ page.sysauth = "root"
++ page.sysauth_authenticator = "htmlauth"
++ page.ucidata = true
++ page.index = true
++
++ -- Empty services menu to be populated by addons
++ entry({"admin", "services"}, firstchild(), _("Services"), 40).index = true
++
++ entry({"admin", "logout"}, call("action_logout"), _("Logout"), 90)
++end
++
++function action_logout()
++ local dsp = require "luci.dispatcher"
++ local utl = require "luci.util"
++ local sid = dsp.context.authsession
++
++ if sid then
++ utl.ubus("session", "destroy", { ubus_rpc_session = sid })
++
++ luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{
++ sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url()
++ })
++ end
++
++ luci.http.redirect(dsp.build_url())
++end
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua
+new file mode 100644
+index 0000000..879e54b
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua
+@@ -0,0 +1,446 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2011-2015 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.admin.network", package.seeall)
++
++function index()
++ local uci = require("luci.model.uci").cursor()
++ local page
++
++ page = node("admin", "network")
++ page.target = firstchild()
++ page.title = _("Network")
++ page.order = 50
++ page.index = true
++
++-- if page.inreq then
++ local has_switch = false
++
++ uci:foreach("network", "switch",
++ function(s)
++ has_switch = true
++ return false
++ end)
++
++ if has_switch then
++ page = node("admin", "network", "vlan")
++ page.target = cbi("admin_network/vlan")
++ page.title = _("Switch")
++ page.order = 20
++
++ page = entry({"admin", "network", "switch_status"}, call("switch_status"), nil)
++ page.leaf = true
++ end
++
++
++ local has_wifi = false
++
++ uci:foreach("wireless", "wifi-device",
++ function(s)
++ has_wifi = true
++ return false
++ end)
++
++ if has_wifi then
++ page = entry({"admin", "network", "wireless_join"}, post("wifi_join"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "wireless_add"}, post("wifi_add"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "wireless_delete"}, post("wifi_delete"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "wireless_status"}, call("wifi_status"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "wireless_reconnect"}, post("wifi_reconnect"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "wireless_shutdown"}, post("wifi_shutdown"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "wireless"}, arcombine(template("admin_network/wifi_overview"), cbi("admin_network/wifi")), _("Wifi"), 15)
++ page.leaf = true
++ page.subindex = true
++
++ if page.inreq then
++ local wdev
++ local net = require "luci.model.network".init(uci)
++ for _, wdev in ipairs(net:get_wifidevs()) do
++ local wnet
++ for _, wnet in ipairs(wdev:get_wifinets()) do
++ entry(
++ {"admin", "network", "wireless", wnet:id()},
++ alias("admin", "network", "wireless"),
++ wdev:name() .. ": " .. wnet:shortname()
++ )
++ end
++ end
++ end
++ end
++
++
++ page = entry({"admin", "network", "iface_add"}, cbi("admin_network/iface_add"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "iface_delete"}, post("iface_delete"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "iface_status"}, call("iface_status"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "iface_reconnect"}, post("iface_reconnect"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "iface_shutdown"}, post("iface_shutdown"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "network"}, arcombine(cbi("admin_network/network"), cbi("admin_network/ifaces")), _("Interfaces"), 10)
++ page.leaf = true
++ page.subindex = true
++
++ if page.inreq then
++ uci:foreach("network", "interface",
++ function (section)
++ local ifc = section[".name"]
++ if ifc ~= "loopback" then
++ entry({"admin", "network", "network", ifc},
++ true, ifc:upper())
++ end
++ end)
++ end
++
++
++ if nixio.fs.access("/etc/config/dhcp") then
++ page = node("admin", "network", "dhcp")
++ page.target = cbi("admin_network/dhcp")
++ page.title = _("DHCP and DNS")
++ page.order = 30
++
++ page = entry({"admin", "network", "dhcplease_status"}, call("lease_status"), nil)
++ page.leaf = true
++
++ page = node("admin", "network", "hosts")
++ page.target = cbi("admin_network/hosts")
++ page.title = _("Hostnames")
++ page.order = 40
++ end
++
++ page = node("admin", "network", "routes")
++ page.target = cbi("admin_network/routes")
++ page.title = _("Static Routes")
++ page.order = 50
++
++ page = node("admin", "network", "diagnostics")
++ page.target = template("admin_network/diagnostics")
++ page.title = _("Diagnostics")
++ page.order = 60
++
++ page = entry({"admin", "network", "diag_ping"}, post("diag_ping"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "diag_nslookup"}, post("diag_nslookup"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "diag_traceroute"}, post("diag_traceroute"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "diag_ping6"}, post("diag_ping6"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "network", "diag_traceroute6"}, post("diag_traceroute6"), nil)
++ page.leaf = true
++-- end
++end
++
++function wifi_join()
++ local tpl = require "luci.template"
++ local http = require "luci.http"
++ local dev = http.formvalue("device")
++ local ssid = http.formvalue("join")
++
++ if dev and ssid then
++ local cancel = (http.formvalue("cancel") or http.formvalue("cbi.cancel"))
++ if not cancel then
++ local cbi = require "luci.cbi"
++ local map = luci.cbi.load("admin_network/wifi_add")[1]
++
++ if map:parse() ~= cbi.FORM_DONE then
++ tpl.render("header")
++ map:render()
++ tpl.render("footer")
++ end
++
++ return
++ end
++ end
++
++ tpl.render("admin_network/wifi_join")
++end
++
++function wifi_add()
++ local dev = luci.http.formvalue("device")
++ local ntm = require "luci.model.network".init()
++
++ dev = dev and ntm:get_wifidev(dev)
++
++ if dev then
++ local net = dev:add_wifinet({
++ mode = "ap",
++ ssid = "OpenWrt",
++ encryption = "none"
++ })
++
++ ntm:save("wireless")
++ luci.http.redirect(net:adminlink())
++ end
++end
++
++function wifi_delete(network)
++ local ntm = require "luci.model.network".init()
++ local wnet = ntm:get_wifinet(network)
++ if wnet then
++ local dev = wnet:get_device()
++ local nets = wnet:get_networks()
++ if dev then
++ ntm:del_wifinet(network)
++ ntm:commit("wireless")
++ local _, net
++ for _, net in ipairs(nets) do
++ if net:is_empty() then
++ ntm:del_network(net:name())
++ ntm:commit("network")
++ end
++ end
++ luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>/dev/null")
++ end
++ end
++
++ luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless"))
++end
++
++function iface_status(ifaces)
++ local netm = require "luci.model.network".init()
++ local rv = { }
++
++ local iface
++ for iface in ifaces:gmatch("[%w%.%-_]+") do
++ local net = netm:get_network(iface)
++ local device = net and net:get_interface()
++ if device then
++ local data = {
++ id = iface,
++ proto = net:proto(),
++ uptime = net:uptime(),
++ gwaddr = net:gwaddr(),
++ dnsaddrs = net:dnsaddrs(),
++ name = device:shortname(),
++ type = device:type(),
++ ifname = device:name(),
++ macaddr = device:mac(),
++ is_up = device:is_up(),
++ rx_bytes = device:rx_bytes(),
++ tx_bytes = device:tx_bytes(),
++ rx_packets = device:rx_packets(),
++ tx_packets = device:tx_packets(),
++
++ ipaddrs = { },
++ ip6addrs = { },
++ subdevices = { }
++ }
++
++ local _, a
++ for _, a in ipairs(device:ipaddrs()) do
++ data.ipaddrs[#data.ipaddrs+1] = {
++ addr = a:host():string(),
++ netmask = a:mask():string(),
++ prefix = a:prefix()
++ }
++ end
++ for _, a in ipairs(device:ip6addrs()) do
++ if not a:is6linklocal() then
++ data.ip6addrs[#data.ip6addrs+1] = {
++ addr = a:host():string(),
++ netmask = a:mask():string(),
++ prefix = a:prefix()
++ }
++ end
++ end
++
++ for _, device in ipairs(net:get_interfaces() or {}) do
++ data.subdevices[#data.subdevices+1] = {
++ name = device:shortname(),
++ type = device:type(),
++ ifname = device:name(),
++ macaddr = device:mac(),
++ macaddr = device:mac(),
++ is_up = device:is_up(),
++ rx_bytes = device:rx_bytes(),
++ tx_bytes = device:tx_bytes(),
++ rx_packets = device:rx_packets(),
++ tx_packets = device:tx_packets(),
++ }
++ end
++
++ rv[#rv+1] = data
++ else
++ rv[#rv+1] = {
++ id = iface,
++ name = iface,
++ type = "ethernet"
++ }
++ end
++ end
++
++ if #rv > 0 then
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++ return
++ end
++
++ luci.http.status(404, "No such device")
++end
++
++function iface_reconnect(iface)
++ local netmd = require "luci.model.network".init()
++ local net = netmd:get_network(iface)
++ if net then
++ luci.sys.call("env -i /sbin/ifup %q >/dev/null 2>/dev/null" % iface)
++ luci.http.status(200, "Reconnected")
++ return
++ end
++
++ luci.http.status(404, "No such interface")
++end
++
++function iface_shutdown(iface)
++ local netmd = require "luci.model.network".init()
++ local net = netmd:get_network(iface)
++ if net then
++ luci.sys.call("env -i /sbin/ifdown %q >/dev/null 2>/dev/null" % iface)
++ luci.http.status(200, "Shutdown")
++ return
++ end
++
++ luci.http.status(404, "No such interface")
++end
++
++function iface_delete(iface)
++ local netmd = require "luci.model.network".init()
++ local net = netmd:del_network(iface)
++ if net then
++ luci.sys.call("env -i /sbin/ifdown %q >/dev/null 2>/dev/null" % iface)
++ luci.http.redirect(luci.dispatcher.build_url("admin/network/network"))
++ netmd:commit("network")
++ netmd:commit("wireless")
++ return
++ end
++
++ luci.http.status(404, "No such interface")
++end
++
++function wifi_status(devs)
++ local s = require "luci.tools.status"
++ local rv = { }
++
++ local dev
++ for dev in devs:gmatch("[%w%.%-]+") do
++ rv[#rv+1] = s.wifi_network(dev)
++ end
++
++ if #rv > 0 then
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++ return
++ end
++
++ luci.http.status(404, "No such device")
++end
++
++local function wifi_reconnect_shutdown(shutdown, wnet)
++ local netmd = require "luci.model.network".init()
++ local net = netmd:get_wifinet(wnet)
++ local dev = net:get_device()
++ if dev and net then
++ dev:set("disabled", nil)
++ net:set("disabled", shutdown and 1 or nil)
++ netmd:commit("wireless")
++
++ luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>/dev/null")
++ luci.http.status(200, shutdown and "Shutdown" or "Reconnected")
++
++ return
++ end
++
++ luci.http.status(404, "No such radio")
++end
++
++function wifi_reconnect(wnet)
++ wifi_reconnect_shutdown(false, wnet)
++end
++
++function wifi_shutdown(wnet)
++ wifi_reconnect_shutdown(true, wnet)
++end
++
++function lease_status()
++ local s = require "luci.tools.status"
++
++ luci.http.prepare_content("application/json")
++ luci.http.write('[')
++ luci.http.write_json(s.dhcp_leases())
++ luci.http.write(',')
++ luci.http.write_json(s.dhcp6_leases())
++ luci.http.write(']')
++end
++
++function switch_status(switches)
++ local s = require "luci.tools.status"
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(s.switch_status(switches))
++end
++
++function diag_command(cmd, addr)
++ if addr and addr:match("^[a-zA-Z0-9%-%.:_]+$") then
++ luci.http.prepare_content("text/plain")
++
++ local util = io.popen(cmd % addr)
++ if util then
++ while true do
++ local ln = util:read("*l")
++ if not ln then break end
++ luci.http.write(ln)
++ luci.http.write("\n")
++ end
++
++ util:close()
++ end
++
++ return
++ end
++
++ luci.http.status(500, "Bad address")
++end
++
++function diag_ping(addr)
++ diag_command("ping -c 5 -W 1 %q 2>&1", addr)
++end
++
++function diag_traceroute(addr)
++ diag_command("traceroute -q 1 -w 1 -n %q 2>&1", addr)
++end
++
++function diag_nslookup(addr)
++ diag_command("nslookup %q 2>&1", addr)
++end
++
++function diag_ping6(addr)
++ diag_command("ping6 -c 5 %q 2>&1", addr)
++end
++
++function diag_traceroute6(addr)
++ diag_command("traceroute6 -q 1 -w 2 -n %q 2>&1", addr)
++end
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua
+new file mode 100644
+index 0000000..24db1e4
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua
+@@ -0,0 +1,150 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.admin.status", package.seeall)
++
++function index()
++ entry({"admin", "status"}, alias("admin", "status", "overview"), _("Status"), 20).index = true
++ entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1)
++
++ entry({"admin", "status", "iptables"}, template("admin_status/iptables"), _("Firewall"), 2).leaf = true
++ entry({"admin", "status", "iptables_action"}, post("action_iptables")).leaf = true
++
++ entry({"admin", "status", "routes"}, template("admin_status/routes"), _("Routes"), 3)
++ entry({"admin", "status", "syslog"}, call("action_syslog"), _("System Log"), 4)
++ entry({"admin", "status", "dmesg"}, call("action_dmesg"), _("Kernel Log"), 5)
++ entry({"admin", "status", "processes"}, cbi("admin_status/processes"), _("Processes"), 6)
++
++ entry({"admin", "status", "realtime"}, alias("admin", "status", "realtime", "load"), _("Realtime Graphs"), 7)
++
++ entry({"admin", "status", "realtime", "load"}, template("admin_status/load"), _("Load"), 1).leaf = true
++ entry({"admin", "status", "realtime", "load_status"}, call("action_load")).leaf = true
++
++ entry({"admin", "status", "realtime", "bandwidth"}, template("admin_status/bandwidth"), _("Traffic"), 2).leaf = true
++ entry({"admin", "status", "realtime", "bandwidth_status"}, call("action_bandwidth")).leaf = true
++
++ entry({"admin", "status", "realtime", "wireless"}, template("admin_status/wireless"), _("Wireless"), 3).leaf = true
++ entry({"admin", "status", "realtime", "wireless_status"}, call("action_wireless")).leaf = true
++
++ entry({"admin", "status", "realtime", "connections"}, template("admin_status/connections"), _("Connections"), 4).leaf = true
++ entry({"admin", "status", "realtime", "connections_status"}, call("action_connections")).leaf = true
++
++ entry({"admin", "status", "nameinfo"}, call("action_nameinfo")).leaf = true
++end
++
++function action_syslog()
++ local syslog = luci.sys.syslog()
++ luci.template.render("admin_status/syslog", {syslog=syslog})
++end
++
++function action_dmesg()
++ local dmesg = luci.sys.dmesg()
++ luci.template.render("admin_status/dmesg", {dmesg=dmesg})
++end
++
++function action_iptables()
++ if luci.http.formvalue("zero") then
++ if luci.http.formvalue("family") == "6" then
++ luci.util.exec("/usr/sbin/ip6tables -Z")
++ else
++ luci.util.exec("/usr/sbin/iptables -Z")
++ end
++ elseif luci.http.formvalue("restart") then
++ luci.util.exec("/etc/init.d/firewall restart")
++ end
++
++ luci.http.redirect(luci.dispatcher.build_url("admin/status/iptables"))
++end
++
++function action_bandwidth(iface)
++ luci.http.prepare_content("application/json")
++
++ local bwc = io.popen("luci-bwc -i %q 2>/dev/null" % iface)
++ if bwc then
++ luci.http.write("[")
++
++ while true do
++ local ln = bwc:read("*l")
++ if not ln then break end
++ luci.http.write(ln)
++ end
++
++ luci.http.write("]")
++ bwc:close()
++ end
++end
++
++function action_wireless(iface)
++ luci.http.prepare_content("application/json")
++
++ local bwc = io.popen("luci-bwc -r %q 2>/dev/null" % iface)
++ if bwc then
++ luci.http.write("[")
++
++ while true do
++ local ln = bwc:read("*l")
++ if not ln then break end
++ luci.http.write(ln)
++ end
++
++ luci.http.write("]")
++ bwc:close()
++ end
++end
++
++function action_load()
++ luci.http.prepare_content("application/json")
++
++ local bwc = io.popen("luci-bwc -l 2>/dev/null")
++ if bwc then
++ luci.http.write("[")
++
++ while true do
++ local ln = bwc:read("*l")
++ if not ln then break end
++ luci.http.write(ln)
++ end
++
++ luci.http.write("]")
++ bwc:close()
++ end
++end
++
++function action_connections()
++ local sys = require "luci.sys"
++
++ luci.http.prepare_content("application/json")
++
++ luci.http.write("{ connections: ")
++ luci.http.write_json(sys.net.conntrack())
++
++ local bwc = io.popen("luci-bwc -c 2>/dev/null")
++ if bwc then
++ luci.http.write(", statistics: [")
++
++ while true do
++ local ln = bwc:read("*l")
++ if not ln then break end
++ luci.http.write(ln)
++ end
++
++ luci.http.write("]")
++ bwc:close()
++ end
++
++ luci.http.write(" }")
++end
++
++function action_nameinfo(...)
++ local i
++ local rv = { }
++ for i = 1, select('#', ...) do
++ local addr = select(i, ...)
++ local fqdn = nixio.getnameinfo(addr)
++ rv[addr] = fqdn or (addr:match(":") and "[%s]" % addr or addr)
++ end
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++end
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua
+new file mode 100644
+index 0000000..cbba48c
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua
+@@ -0,0 +1,433 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.admin.system", package.seeall)
++
++function index()
++ local fs = require "nixio.fs"
++
++ entry({"admin", "system"}, alias("admin", "system", "system"), _("System"), 30).index = true
++ entry({"admin", "system", "system"}, cbi("admin_system/system"), _("System"), 1)
++ entry({"admin", "system", "clock_status"}, post_on({ set = true }, "action_clock_status"))
++
++ entry({"admin", "system", "admin"}, cbi("admin_system/admin"), _("Administration"), 2)
++
++ if fs.access("/bin/opkg") then
++ entry({"admin", "system", "packages"}, post_on({ exec = "1" }, "action_packages"), _("Software"), 10)
++ entry({"admin", "system", "packages", "ipkg"}, form("admin_system/ipkg"))
++ end
++
++ entry({"admin", "system", "startup"}, form("admin_system/startup"), _("Startup"), 45)
++ entry({"admin", "system", "crontab"}, form("admin_system/crontab"), _("Scheduled Tasks"), 46)
++
++ if fs.access("/sbin/block") then
++ entry({"admin", "system", "fstab"}, cbi("admin_system/fstab"), _("Mount Points"), 50)
++ entry({"admin", "system", "fstab", "mount"}, cbi("admin_system/fstab/mount"), nil).leaf = true
++ entry({"admin", "system", "fstab", "swap"}, cbi("admin_system/fstab/swap"), nil).leaf = true
++ end
++
++ if fs.access("/sys/class/leds") then
++ entry({"admin", "system", "leds"}, cbi("admin_system/leds"), _("<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"), 60)
++ end
++
++ entry({"admin", "system", "flashops"}, call("action_flashops"), _("Backup / Flash Firmware"), 70)
++ entry({"admin", "system", "flashops", "reset"}, post("action_reset"))
++ entry({"admin", "system", "flashops", "backup"}, post("action_backup"))
++ entry({"admin", "system", "flashops", "backupfiles"}, form("admin_system/backupfiles"))
++
++ -- call() instead of post() due to upload handling!
++ entry({"admin", "system", "flashops", "restore"}, call("action_restore"))
++ entry({"admin", "system", "flashops", "sysupgrade"}, call("action_sysupgrade"))
++
++ entry({"admin", "system", "reboot"}, template("admin_system/reboot"), _("Reboot"), 90)
++ entry({"admin", "system", "reboot", "call"}, post("action_reboot"))
++end
++
++function action_clock_status()
++ local set = tonumber(luci.http.formvalue("set"))
++ if set ~= nil and set > 0 then
++ local date = os.date("*t", set)
++ if date then
++ luci.sys.call("date -s '%04d-%02d-%02d %02d:%02d:%02d'" %{
++ date.year, date.month, date.day, date.hour, date.min, date.sec
++ })
++ end
++ end
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json({ timestring = os.date("%c") })
++end
++
++function action_packages()
++ local fs = require "nixio.fs"
++ local ipkg = require "luci.model.ipkg"
++ local submit = (luci.http.formvalue("exec") == "1")
++ local update, upgrade
++ local changes = false
++ local install = { }
++ local remove = { }
++ local stdout = { "" }
++ local stderr = { "" }
++ local out, err
++
++ -- Display
++ local display = luci.http.formvalue("display") or "installed"
++
++ -- Letter
++ local letter = string.byte(luci.http.formvalue("letter") or "A", 1)
++ letter = (letter == 35 or (letter >= 65 and letter <= 90)) and letter or 65
++
++ -- Search query
++ local query = luci.http.formvalue("query")
++ query = (query ~= '') and query or nil
++
++
++ -- Modifying actions
++ if submit then
++ -- Packets to be installed
++ local ninst = luci.http.formvalue("install")
++ local uinst = nil
++
++ -- Install from URL
++ local url = luci.http.formvalue("url")
++ if url and url ~= '' then
++ uinst = url
++ end
++
++ -- Do install
++ if ninst then
++ install[ninst], out, err = ipkg.install(ninst)
++ stdout[#stdout+1] = out
++ stderr[#stderr+1] = err
++ changes = true
++ end
++
++ if uinst then
++ local pkg
++ for pkg in luci.util.imatch(uinst) do
++ install[uinst], out, err = ipkg.install(pkg)
++ stdout[#stdout+1] = out
++ stderr[#stderr+1] = err
++ changes = true
++ end
++ end
++
++ -- Remove packets
++ local rem = luci.http.formvalue("remove")
++ if rem then
++ remove[rem], out, err = ipkg.remove(rem)
++ stdout[#stdout+1] = out
++ stderr[#stderr+1] = err
++ changes = true
++ end
++
++
++ -- Update all packets
++ update = luci.http.formvalue("update")
++ if update then
++ update, out, err = ipkg.update()
++ stdout[#stdout+1] = out
++ stderr[#stderr+1] = err
++ end
++
++
++ -- Upgrade all packets
++ upgrade = luci.http.formvalue("upgrade")
++ if upgrade then
++ upgrade, out, err = ipkg.upgrade()
++ stdout[#stdout+1] = out
++ stderr[#stderr+1] = err
++ end
++ end
++
++
++ -- List state
++ local no_lists = true
++ local old_lists = false
++ if fs.access("/var/opkg-lists/") then
++ local list
++ for list in fs.dir("/var/opkg-lists/") do
++ no_lists = false
++ if (fs.stat("/var/opkg-lists/"..list, "mtime") or 0) < (os.time() - (24 * 60 * 60)) then
++ old_lists = true
++ break
++ end
++ end
++ end
++
++
++ luci.template.render("admin_system/packages", {
++ display = display,
++ letter = letter,
++ query = query,
++ install = install,
++ remove = remove,
++ update = update,
++ upgrade = upgrade,
++ no_lists = no_lists,
++ old_lists = old_lists,
++ stdout = table.concat(stdout, ""),
++ stderr = table.concat(stderr, "")
++ })
++
++ -- Remove index cache
++ if changes then
++ fs.unlink("/tmp/luci-indexcache")
++ end
++end
++
++local function image_supported(image)
++ return (os.execute("sysupgrade -T %q >/dev/null" % image) == 0)
++end
++
++local function image_checksum(image)
++ return (luci.sys.exec("md5sum %q" % image):match("^([^%s]+)"))
++end
++
++local function supports_sysupgrade()
++ return nixio.fs.access("/lib/upgrade/platform.sh")
++end
++
++local function supports_reset()
++ return (os.execute([[grep -sq '"rootfs_data"' /proc/mtd]]) == 0)
++end
++
++local function storage_size()
++ local size = 0
++ if nixio.fs.access("/proc/mtd") then
++ for l in io.lines("/proc/mtd") do
++ local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
++ if n == "linux" or n == "firmware" then
++ size = tonumber(s, 16)
++ break
++ end
++ end
++ elseif nixio.fs.access("/proc/partitions") then
++ for l in io.lines("/proc/partitions") do
++ local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
++ if b and n and not n:match('[0-9]') then
++ size = tonumber(b) * 1024
++ break
++ end
++ end
++ end
++ return size
++end
++
++
++function action_flashops()
++ --
++ -- Overview
++ --
++ luci.template.render("admin_system/flashops", {
++ reset_avail = supports_reset(),
++ upgrade_avail = supports_sysupgrade()
++ })
++end
++
++function action_sysupgrade()
++ local fs = require "nixio.fs"
++ local http = require "luci.http"
++ local image_tmp = "/tmp/firmware.img"
++
++ local fp
++ http.setfilehandler(
++ function(meta, chunk, eof)
++ if not fp and meta and meta.name == "image" then
++ fp = io.open(image_tmp, "w")
++ end
++ if fp and chunk then
++ fp:write(chunk)
++ end
++ if fp and eof then
++ fp:close()
++ end
++ end
++ )
++
++ if not luci.dispatcher.test_post_security() then
++ fs.unlink(image_tmp)
++ return
++ end
++
++ --
++ -- Cancel firmware flash
++ --
++ if http.formvalue("cancel") then
++ fs.unlink(image_tmp)
++ http.redirect(luci.dispatcher.build_url('admin/system/flashops'))
++ return
++ end
++
++ --
++ -- Initiate firmware flash
++ --
++ local step = tonumber(http.formvalue("step") or 1)
++ if step == 1 then
++ if image_supported(image_tmp) then
++ luci.template.render("admin_system/upgrade", {
++ checksum = image_checksum(image_tmp),
++ storage = storage_size(),
++ size = (fs.stat(image_tmp, "size") or 0),
++ keep = (not not http.formvalue("keep"))
++ })
++ else
++ fs.unlink(image_tmp)
++ luci.template.render("admin_system/flashops", {
++ reset_avail = supports_reset(),
++ upgrade_avail = supports_sysupgrade(),
++ image_invalid = true
++ })
++ end
++ --
++ -- Start sysupgrade flash
++ --
++ elseif step == 2 then
++ local keep = (http.formvalue("keep") == "1") and "" or "-n"
++ luci.template.render("admin_system/applyreboot", {
++ title = luci.i18n.translate("Flashing..."),
++ msg = luci.i18n.translate("The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
++ addr = (#keep > 0) and "192.168.1.1" or nil
++ })
++ fork_exec("killall dropbear uhttpd; sleep 1; /sbin/sysupgrade %s %q" %{ keep, image_tmp })
++ end
++end
++
++function action_backup()
++ local reader = ltn12_popen("sysupgrade --create-backup - 2>/dev/null")
++
++ luci.http.header(
++ 'Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' %{
++ luci.sys.hostname(),
++ os.date("%Y-%m-%d")
++ })
++
++ luci.http.prepare_content("application/x-targz")
++ luci.ltn12.pump.all(reader, luci.http.write)
++end
++
++function action_restore()
++ local fs = require "nixio.fs"
++ local http = require "luci.http"
++ local archive_tmp = "/tmp/restore.tar.gz"
++
++ local fp
++ http.setfilehandler(
++ function(meta, chunk, eof)
++ if not fp and meta and meta.name == "archive" then
++ fp = io.open(archive_tmp, "w")
++ end
++ if fp and chunk then
++ fp:write(chunk)
++ end
++ if fp and eof then
++ fp:close()
++ end
++ end
++ )
++
++ if not luci.dispatcher.test_post_security() then
++ fs.unlink(archive_tmp)
++ return
++ end
++
++ local upload = http.formvalue("archive")
++ if upload and #upload > 0 then
++ luci.template.render("admin_system/applyreboot")
++ os.execute("tar -C / -xzf %q >/dev/null 2>&1" % archive_tmp)
++ luci.sys.reboot()
++ return
++ end
++
++ http.redirect(luci.dispatcher.build_url('admin/system/flashops'))
++end
++
++function action_reset()
++ if supports_reset() then
++ luci.template.render("admin_system/applyreboot", {
++ title = luci.i18n.translate("Erasing..."),
++ msg = luci.i18n.translate("The system is erasing the configuration partition now and will reboot itself when finished."),
++ addr = "192.168.1.1"
++ })
++
++ fork_exec("killall dropbear uhttpd; sleep 1; mtd -r erase rootfs_data")
++ return
++ end
++
++ http.redirect(luci.dispatcher.build_url('admin/system/flashops'))
++end
++
++function action_passwd()
++ local p1 = luci.http.formvalue("pwd1")
++ local p2 = luci.http.formvalue("pwd2")
++ local stat = nil
++
++ if p1 or p2 then
++ if p1 == p2 then
++ stat = luci.sys.user.setpasswd("root", p1)
++ else
++ stat = 10
++ end
++ end
++
++ luci.template.render("admin_system/passwd", {stat=stat})
++end
++
++function action_reboot()
++ luci.sys.reboot()
++end
++
++function fork_exec(command)
++ local pid = nixio.fork()
++ if pid > 0 then
++ return
++ elseif pid == 0 then
++ -- change to root dir
++ nixio.chdir("/")
++
++ -- patch stdin, out, err to /dev/null
++ local null = nixio.open("/dev/null", "w+")
++ if null then
++ nixio.dup(null, nixio.stderr)
++ nixio.dup(null, nixio.stdout)
++ nixio.dup(null, nixio.stdin)
++ if null:fileno() > 2 then
++ null:close()
++ end
++ end
++
++ -- replace with target command
++ nixio.exec("/bin/sh", "-c", command)
++ end
++end
++
++function ltn12_popen(command)
++
++ local fdi, fdo = nixio.pipe()
++ local pid = nixio.fork()
++
++ if pid > 0 then
++ fdo:close()
++ local close
++ return function()
++ local buffer = fdi:read(2048)
++ local wpid, stat = nixio.waitpid(pid, "nohang")
++ if not close and wpid and stat == "exited" then
++ close = true
++ end
++
++ if buffer and #buffer > 0 then
++ return buffer
++ elseif close then
++ fdi:close()
++ return nil
++ end
++ end
++ elseif pid == 0 then
++ nixio.dup(fdo, nixio.stdout)
++ fdi:close()
++ fdo:close()
++ nixio.exec("/bin/sh", "-c", command)
++ end
++end
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua
+new file mode 100644
+index 0000000..9c33d9c
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua
+@@ -0,0 +1,64 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2010-2015 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.admin.uci", package.seeall)
++
++function index()
++ local redir = luci.http.formvalue("redir", true) or
++ luci.dispatcher.build_url(unpack(luci.dispatcher.context.request))
++
++ entry({"admin", "uci"}, nil, _("Configuration"))
++ entry({"admin", "uci", "changes"}, call("action_changes"), _("Changes"), 40).query = {redir=redir}
++ entry({"admin", "uci", "revert"}, post("action_revert"), _("Revert"), 30).query = {redir=redir}
++ entry({"admin", "uci", "apply"}, post("action_apply"), _("Apply"), 20).query = {redir=redir}
++ entry({"admin", "uci", "saveapply"}, post("action_apply"), _("Save &#38; Apply"), 10).query = {redir=redir}
++end
++
++function action_changes()
++ local uci = luci.model.uci.cursor()
++ local changes = uci:changes()
++
++ luci.template.render("admin_uci/changes", {
++ changes = next(changes) and changes
++ })
++end
++
++function action_apply()
++ local path = luci.dispatcher.context.path
++ local uci = luci.model.uci.cursor()
++ local changes = uci:changes()
++ local reload = {}
++
++ -- Collect files to be applied and commit changes
++ for r, tbl in pairs(changes) do
++ table.insert(reload, r)
++ if path[#path] ~= "apply" then
++ uci:load(r)
++ uci:commit(r)
++ uci:unload(r)
++ end
++ end
++
++ luci.template.render("admin_uci/apply", {
++ changes = next(changes) and changes,
++ configs = reload
++ })
++end
++
++
++function action_revert()
++ local uci = luci.model.uci.cursor()
++ local changes = uci:changes()
++
++ -- Collect files to be reverted
++ for r, tbl in pairs(changes) do
++ uci:load(r)
++ uci:revert(r)
++ uci:unload(r)
++ end
++
++ luci.template.render("admin_uci/revert", {
++ changes = next(changes) and changes
++ })
++end
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/dhcp.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/dhcp.lua
+new file mode 100644
+index 0000000..4dc52ad
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/dhcp.lua
+@@ -0,0 +1,254 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ipc = require "luci.ip"
++
++m = Map("dhcp", translate("DHCP and DNS"),
++ translate("Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol" ..
++ "\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-" ..
++ "Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> " ..
++ "firewalls"))
++
++s = m:section(TypedSection, "dnsmasq", translate("Server Settings"))
++s.anonymous = true
++s.addremove = false
++
++s:tab("general", translate("General Settings"))
++s:tab("files", translate("Resolv and Hosts Files"))
++s:tab("tftp", translate("TFTP Settings"))
++s:tab("advanced", translate("Advanced Settings"))
++
++s:taboption("general", Flag, "domainneeded",
++ translate("Domain required"),
++ translate("Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without " ..
++ "<abbr title=\"Domain Name System\">DNS</abbr>-Name"))
++
++s:taboption("general", Flag, "authoritative",
++ translate("Authoritative"),
++ translate("This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</" ..
++ "abbr> in the local network"))
++
++
++s:taboption("files", Flag, "readethers",
++ translate("Use <code>/etc/ethers</code>"),
++ translate("Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host " ..
++ "Configuration Protocol\">DHCP</abbr>-Server"))
++
++s:taboption("files", Value, "leasefile",
++ translate("Leasefile"),
++ translate("file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</" ..
++ "abbr>-leases will be stored"))
++
++s:taboption("files", Flag, "noresolv",
++ translate("Ignore resolve file")).optional = true
++
++rf = s:taboption("files", Value, "resolvfile",
++ translate("Resolve file"),
++ translate("local <abbr title=\"Domain Name System\">DNS</abbr> file"))
++
++rf:depends("noresolv", "")
++rf.optional = true
++
++
++s:taboption("files", Flag, "nohosts",
++ translate("Ignore <code>/etc/hosts</code>")).optional = true
++
++s:taboption("files", DynamicList, "addnhosts",
++ translate("Additional Hosts files")).optional = true
++
++
++s:taboption("advanced", Flag, "boguspriv",
++ translate("Filter private"),
++ translate("Do not forward reverse lookups for local networks"))
++
++s:taboption("advanced", Flag, "filterwin2k",
++ translate("Filter useless"),
++ translate("Do not forward requests that cannot be answered by public name servers"))
++
++
++s:taboption("advanced", Flag, "localise_queries",
++ translate("Localise queries"),
++ translate("Localise hostname depending on the requesting subnet if multiple IPs are available"))
++
++s:taboption("general", Value, "local",
++ translate("Local server"),
++ translate("Local domain specification. Names matching this domain are never forwarded and are resolved from DHCP or hosts files only"))
++
++s:taboption("general", Value, "domain",
++ translate("Local domain"),
++ translate("Local domain suffix appended to DHCP names and hosts file entries"))
++
++s:taboption("advanced", Flag, "expandhosts",
++ translate("Expand hosts"),
++ translate("Add local domain suffix to names served from hosts files"))
++
++s:taboption("advanced", Flag, "nonegcache",
++ translate("No negative cache"),
++ translate("Do not cache negative replies, e.g. for not existing domains"))
++
++s:taboption("advanced", Value, "serversfile",
++ translate("Additional servers file"),
++ translate("This file may contain lines like 'server=/domain/1.2.3.4' or 'server=1.2.3.4' for"..
++ "domain-specific or full upstream <abbr title=\"Domain Name System\">DNS</abbr> servers."))
++
++s:taboption("advanced", Flag, "strictorder",
++ translate("Strict order"),
++ translate("<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the " ..
++ "order of the resolvfile")).optional = true
++
++
++bn = s:taboption("advanced", DynamicList, "bogusnxdomain", translate("Bogus NX Domain Override"),
++ translate("List of hosts that supply bogus NX domain results"))
++
++bn.optional = true
++bn.placeholder = "67.215.65.132"
++
++
++s:taboption("general", Flag, "logqueries",
++ translate("Log queries"),
++ translate("Write received DNS requests to syslog")).optional = true
++
++df = s:taboption("general", DynamicList, "server", translate("DNS forwardings"),
++ translate("List of <abbr title=\"Domain Name System\">DNS</abbr> " ..
++ "servers to forward requests to"))
++
++df.optional = true
++df.placeholder = "/example.org/10.1.2.3"
++
++
++rp = s:taboption("general", Flag, "rebind_protection",
++ translate("Rebind protection"),
++ translate("Discard upstream RFC1918 responses"))
++
++rp.rmempty = false
++
++
++rl = s:taboption("general", Flag, "rebind_localhost",
++ translate("Allow localhost"),
++ translate("Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"))
++
++rl:depends("rebind_protection", "1")
++
++
++rd = s:taboption("general", DynamicList, "rebind_domain",
++ translate("Domain whitelist"),
++ translate("List of domains to allow RFC1918 responses for"))
++
++rd:depends("rebind_protection", "1")
++rd.datatype = "host"
++rd.placeholder = "ihost.netflix.com"
++
++
++pt = s:taboption("advanced", Value, "port",
++ translate("<abbr title=\"Domain Name System\">DNS</abbr> server port"),
++ translate("Listening port for inbound DNS queries"))
++
++pt.optional = true
++pt.datatype = "port"
++pt.placeholder = 53
++
++
++qp = s:taboption("advanced", Value, "queryport",
++ translate("<abbr title=\"Domain Name System\">DNS</abbr> query port"),
++ translate("Fixed source port for outbound DNS queries"))
++
++qp.optional = true
++qp.datatype = "port"
++qp.placeholder = translate("any")
++
++
++lm = s:taboption("advanced", Value, "dhcpleasemax",
++ translate("<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration " ..
++ "Protocol\">DHCP</abbr> leases"),
++ translate("Maximum allowed number of active DHCP leases"))
++
++lm.optional = true
++lm.datatype = "uinteger"
++lm.placeholder = translate("unlimited")
++
++
++em = s:taboption("advanced", Value, "ednspacket_max",
++ translate("<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for " ..
++ "Domain Name System\">EDNS0</abbr> packet size"),
++ translate("Maximum allowed size of EDNS.0 UDP packets"))
++
++em.optional = true
++em.datatype = "uinteger"
++em.placeholder = 1280
++
++
++cq = s:taboption("advanced", Value, "dnsforwardmax",
++ translate("<abbr title=\"maximal\">Max.</abbr> concurrent queries"),
++ translate("Maximum allowed number of concurrent DNS queries"))
++
++cq.optional = true
++cq.datatype = "uinteger"
++cq.placeholder = 150
++
++
++s:taboption("tftp", Flag, "enable_tftp",
++ translate("Enable TFTP server")).optional = true
++
++tr = s:taboption("tftp", Value, "tftp_root",
++ translate("TFTP server root"),
++ translate("Root directory for files served via TFTP"))
++
++tr.optional = true
++tr:depends("enable_tftp", "1")
++tr.placeholder = "/"
++
++
++db = s:taboption("tftp", Value, "dhcp_boot",
++ translate("Network boot image"),
++ translate("Filename of the boot image advertised to clients"))
++
++db.optional = true
++db:depends("enable_tftp", "1")
++db.placeholder = "pxelinux.0"
++
++
++m:section(SimpleSection).template = "admin_network/lease_status"
++
++s = m:section(TypedSection, "host", translate("Static Leases"),
++ translate("Static leases are used to assign fixed IP addresses and symbolic hostnames to " ..
++ "DHCP clients. They are also required for non-dynamic interface configurations where " ..
++ "only hosts with a corresponding lease are served.") .. "<br />" ..
++ translate("Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</em> " ..
++ "indentifies the host, the <em>IPv4-Address</em> specifies to the fixed address to " ..
++ "use and the <em>Hostname</em> is assigned as symbolic name to the requesting host."))
++
++s.addremove = true
++s.anonymous = true
++s.template = "cbi/tblsection"
++
++name = s:option(Value, "name", translate("Hostname"))
++name.datatype = "hostname"
++name.rmempty = true
++
++mac = s:option(Value, "mac", translate("<abbr title=\"Media Access Control\">MAC</abbr>-Address"))
++mac.datatype = "list(macaddr)"
++mac.rmempty = true
++
++ip = s:option(Value, "ip", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"))
++ip.datatype = "or(ip4addr,'ignore')"
++
++hostid = s:option(Value, "hostid", translate("<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"))
++
++ipc.neighbors({ family = 4 }, function(n)
++ if n.mac and n.dest then
++ ip:value(n.dest:string())
++ mac:value(n.mac, "%s (%s)" %{ n.mac, n.dest:string() })
++ end
++end)
++
++function ip.validate(self, value, section)
++ local m = mac:formvalue(section) or ""
++ local n = name:formvalue(section) or ""
++ if value and #n == 0 and #m == 0 then
++ return nil, translate("One of hostname or mac address must be specified!")
++ end
++ return Value.validate(self, value, section)
++end
++
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/hosts.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/hosts.lua
+new file mode 100644
+index 0000000..fafacf3
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/hosts.lua
+@@ -0,0 +1,28 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2010-2015 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ipc = require "luci.ip"
++
++m = Map("dhcp", translate("Hostnames"))
++
++s = m:section(TypedSection, "domain", translate("Host entries"))
++s.addremove = true
++s.anonymous = true
++s.template = "cbi/tblsection"
++
++hn = s:option(Value, "name", translate("Hostname"))
++hn.datatype = "hostname"
++hn.rmempty = true
++
++ip = s:option(Value, "ip", translate("IP address"))
++ip.datatype = "ipaddr"
++ip.rmempty = true
++
++ipc.neighbors({ }, function(n)
++ if n.mac and n.dest and not n.dest:is6linklocal() then
++ ip:value(n.dest:string(), "%s (%s)" %{ n.dest:string(), n.mac })
++ end
++end)
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/iface_add.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/iface_add.lua
+new file mode 100644
+index 0000000..da1e140
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/iface_add.lua
+@@ -0,0 +1,92 @@
++-- Copyright 2009-2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local nw = require "luci.model.network".init()
++local fw = require "luci.model.firewall".init()
++local utl = require "luci.util"
++local uci = require "luci.model.uci".cursor()
++
++m = SimpleForm("network", translate("Create Interface"))
++m.redirect = luci.dispatcher.build_url("admin/network/network")
++m.reset = false
++
++newnet = m:field(Value, "_netname", translate("Name of the new interface"),
++ translate("The allowed characters are: <code>A-Z</code>, <code>a-z</code>, " ..
++ "<code>0-9</code> and <code>_</code>"
++ ))
++
++newnet:depends("_attach", "")
++newnet.default = arg[1] and "net_" .. arg[1]:gsub("[^%w_]+", "_")
++newnet.datatype = "uciname"
++
++newproto = m:field(ListValue, "_netproto", translate("Protocol of the new interface"))
++
++netbridge = m:field(Flag, "_bridge", translate("Create a bridge over multiple interfaces"))
++
++
++sifname = m:field(Value, "_ifname", translate("Cover the following interface"))
++
++sifname.widget = "radio"
++sifname.template = "cbi/network_ifacelist"
++sifname.nobridges = true
++
++
++mifname = m:field(Value, "_ifnames", translate("Cover the following interfaces"))
++
++mifname.widget = "checkbox"
++mifname.template = "cbi/network_ifacelist"
++mifname.nobridges = true
++
++
++local _, p
++for _, p in ipairs(nw:get_protocols()) do
++ if p:is_installed() then
++ newproto:value(p:proto(), p:get_i18n())
++ if not p:is_virtual() then netbridge:depends("_netproto", p:proto()) end
++ if not p:is_floating() then
++ sifname:depends({ _bridge = "", _netproto = p:proto()})
++ mifname:depends({ _bridge = "1", _netproto = p:proto()})
++ end
++ end
++end
++
++function newproto.validate(self, value, section)
++ local name = newnet:formvalue(section)
++ if not name or #name == 0 then
++ newnet:add_error(section, translate("No network name specified"))
++ elseif m:get(name) then
++ newnet:add_error(section, translate("The given network name is not unique"))
++ end
++
++ local proto = nw:get_protocol(value)
++ if proto and not proto:is_floating() then
++ local br = (netbridge:formvalue(section) == "1")
++ local ifn = br and mifname:formvalue(section) or sifname:formvalue(section)
++ for ifn in utl.imatch(ifn) do
++ return value
++ end
++ return nil, translate("The selected protocol needs a device assigned")
++ end
++ return value
++end
++
++function newproto.write(self, section, value)
++ local name = newnet:formvalue(section)
++ if name and #name > 0 then
++ local br = (netbridge:formvalue(section) == "1") and "bridge" or nil
++ local net = nw:add_network(name, { proto = value, type = br })
++ if net then
++ local ifn
++ for ifn in utl.imatch(
++ br and mifname:formvalue(section) or sifname:formvalue(section)
++ ) do
++ net:add_interface(ifn)
++ end
++ nw:save("network")
++ nw:save("wireless")
++ end
++ luci.http.redirect(luci.dispatcher.build_url("admin/network/network", name))
++ end
++end
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua
+new file mode 100644
+index 0000000..e092be6
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua
+@@ -0,0 +1,517 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local ut = require "luci.util"
++local pt = require "luci.tools.proto"
++local nw = require "luci.model.network"
++local fw = require "luci.model.firewall"
++
++arg[1] = arg[1] or ""
++
++local has_dnsmasq = fs.access("/etc/config/dhcp")
++local has_firewall = fs.access("/etc/config/firewall")
++
++m = Map("network", translate("Interfaces") .. " - " .. arg[1]:upper(), translate("On this page you can configure the network interfaces. You can bridge several interfaces by ticking the \"bridge interfaces\" field and enter the names of several network interfaces separated by spaces. You can also use <abbr title=\"Virtual Local Area Network\">VLAN</abbr> notation <samp>INTERFACE.VLANNR</samp> (<abbr title=\"for example\">e.g.</abbr>: <samp>eth0.1</samp>)."))
++m.redirect = luci.dispatcher.build_url("admin", "network", "network")
++m:chain("wireless")
++
++if has_firewall then
++ m:chain("firewall")
++end
++
++nw.init(m.uci)
++fw.init(m.uci)
++
++
++local net = nw:get_network(arg[1])
++
++local function backup_ifnames(is_bridge)
++ if not net:is_floating() and not m:get(net:name(), "_orig_ifname") then
++ local ifcs = net:get_interfaces() or { net:get_interface() }
++ if ifcs then
++ local _, ifn
++ local ifns = { }
++ for _, ifn in ipairs(ifcs) do
++ ifns[#ifns+1] = ifn:name()
++ end
++ if #ifns > 0 then
++ m:set(net:name(), "_orig_ifname", table.concat(ifns, " "))
++ m:set(net:name(), "_orig_bridge", tostring(net:is_bridge()))
++ end
++ end
++ end
++end
++
++
++-- redirect to overview page if network does not exist anymore (e.g. after a revert)
++if not net then
++ luci.http.redirect(luci.dispatcher.build_url("admin/network/network"))
++ return
++end
++
++-- protocol switch was requested, rebuild interface config and reload page
++if m:formvalue("cbid.network.%s._switch" % net:name()) then
++ -- get new protocol
++ local ptype = m:formvalue("cbid.network.%s.proto" % net:name()) or "-"
++ local proto = nw:get_protocol(ptype, net:name())
++ if proto then
++ -- backup default
++ backup_ifnames()
++
++ -- if current proto is not floating and target proto is not floating,
++ -- then attempt to retain the ifnames
++ --error(net:proto() .. " > " .. proto:proto())
++ if not net:is_floating() and not proto:is_floating() then
++ -- if old proto is a bridge and new proto not, then clip the
++ -- interface list to the first ifname only
++ if net:is_bridge() and proto:is_virtual() then
++ local _, ifn
++ local first = true
++ for _, ifn in ipairs(net:get_interfaces() or { net:get_interface() }) do
++ if first then
++ first = false
++ else
++ net:del_interface(ifn)
++ end
++ end
++ m:del(net:name(), "type")
++ end
++
++ -- if the current proto is floating, the target proto not floating,
++ -- then attempt to restore ifnames from backup
++ elseif net:is_floating() and not proto:is_floating() then
++ -- if we have backup data, then re-add all orphaned interfaces
++ -- from it and restore the bridge choice
++ local br = (m:get(net:name(), "_orig_bridge") == "true")
++ local ifn
++ local ifns = { }
++ for ifn in ut.imatch(m:get(net:name(), "_orig_ifname")) do
++ ifn = nw:get_interface(ifn)
++ if ifn and not ifn:get_network() then
++ proto:add_interface(ifn)
++ if not br then
++ break
++ end
++ end
++ end
++ if br then
++ m:set(net:name(), "type", "bridge")
++ end
++
++ -- in all other cases clear the ifnames
++ else
++ local _, ifc
++ for _, ifc in ipairs(net:get_interfaces() or { net:get_interface() }) do
++ net:del_interface(ifc)
++ end
++ m:del(net:name(), "type")
++ end
++
++ -- clear options
++ local k, v
++ for k, v in pairs(m:get(net:name())) do
++ if k:sub(1,1) ~= "." and
++ k ~= "type" and
++ k ~= "ifname" and
++ k ~= "_orig_ifname" and
++ k ~= "_orig_bridge"
++ then
++ m:del(net:name(), k)
++ end
++ end
++
++ -- set proto
++ m:set(net:name(), "proto", proto:proto())
++ m.uci:save("network")
++ m.uci:save("wireless")
++
++ -- reload page
++ luci.http.redirect(luci.dispatcher.build_url("admin/network/network", arg[1]))
++ return
++ end
++end
++
++-- dhcp setup was requested, create section and reload page
++if m:formvalue("cbid.dhcp._enable._enable") then
++ m.uci:section("dhcp", "dhcp", arg[1], {
++ interface = arg[1],
++ start = "100",
++ limit = "150",
++ leasetime = "12h"
++ })
++
++ m.uci:save("dhcp")
++ luci.http.redirect(luci.dispatcher.build_url("admin/network/network", arg[1]))
++ return
++end
++
++local ifc = net:get_interface()
++
++s = m:section(NamedSection, arg[1], "interface", translate("Common Configuration"))
++s.addremove = false
++
++s:tab("general", translate("General Setup"))
++s:tab("advanced", translate("Advanced Settings"))
++s:tab("physical", translate("Physical Settings"))
++
++if has_firewall then
++ s:tab("firewall", translate("Firewall Settings"))
++end
++
++
++st = s:taboption("general", DummyValue, "__status", translate("Status"))
++
++local function set_status()
++ -- if current network is empty, print a warning
++ if not net:is_floating() and net:is_empty() then
++ st.template = "cbi/dvalue"
++ st.network = nil
++ st.value = translate("There is no device assigned yet, please attach a network device in the \"Physical Settings\" tab")
++ else
++ st.template = "admin_network/iface_status"
++ st.network = arg[1]
++ st.value = nil
++ end
++end
++
++m.on_init = set_status
++m.on_after_save = set_status
++
++
++p = s:taboption("general", ListValue, "proto", translate("Protocol"))
++p.default = net:proto()
++
++
++if not net:is_installed() then
++ p_install = s:taboption("general", Button, "_install")
++ p_install.title = translate("Protocol support is not installed")
++ p_install.inputtitle = translate("Install package %q" % net:opkg_package())
++ p_install.inputstyle = "apply"
++ p_install:depends("proto", net:proto())
++
++ function p_install.write()
++ return luci.http.redirect(
++ luci.dispatcher.build_url("admin/system/packages") ..
++ "?submit=1&install=%s" % net:opkg_package()
++ )
++ end
++end
++
++
++p_switch = s:taboption("general", Button, "_switch")
++p_switch.title = translate("Really switch protocol?")
++p_switch.inputtitle = translate("Switch protocol")
++p_switch.inputstyle = "apply"
++
++local _, pr
++for _, pr in ipairs(nw:get_protocols()) do
++ p:value(pr:proto(), pr:get_i18n())
++ if pr:proto() ~= net:proto() then
++ p_switch:depends("proto", pr:proto())
++ end
++end
++
++
++auto = s:taboption("advanced", Flag, "auto", translate("Bring up on boot"))
++auto.default = (net:proto() == "none") and auto.disabled or auto.enabled
++
++delegate = s:taboption("advanced", Flag, "delegate", translate("Use builtin IPv6-management"))
++delegate.default = delegate.enabled
++
++
++if not net:is_virtual() then
++ br = s:taboption("physical", Flag, "type", translate("Bridge interfaces"), translate("creates a bridge over specified interface(s)"))
++ br.enabled = "bridge"
++ br.rmempty = true
++ br:depends("proto", "static")
++ br:depends("proto", "dhcp")
++ br:depends("proto", "none")
++
++ stp = s:taboption("physical", Flag, "stp", translate("Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"),
++ translate("Enables the Spanning Tree Protocol on this bridge"))
++ stp:depends("type", "bridge")
++ stp.rmempty = true
++end
++
++
++if not net:is_floating() then
++ ifname_single = s:taboption("physical", Value, "ifname_single", translate("Interface"))
++ ifname_single.template = "cbi/network_ifacelist"
++ ifname_single.widget = "radio"
++ ifname_single.nobridges = true
++ ifname_single.rmempty = false
++ ifname_single.network = arg[1]
++ ifname_single:depends("type", "")
++
++ function ifname_single.cfgvalue(self, s)
++ -- let the template figure out the related ifaces through the network model
++ return nil
++ end
++
++ function ifname_single.write(self, s, val)
++ local i
++ local new_ifs = { }
++ local old_ifs = { }
++
++ for _, i in ipairs(net:get_interfaces() or { net:get_interface() }) do
++ old_ifs[#old_ifs+1] = i:name()
++ end
++
++ for i in ut.imatch(val) do
++ new_ifs[#new_ifs+1] = i
++
++ -- if this is not a bridge, only assign first interface
++ if self.option == "ifname_single" then
++ break
++ end
++ end
++
++ table.sort(old_ifs)
++ table.sort(new_ifs)
++
++ for i = 1, math.max(#old_ifs, #new_ifs) do
++ if old_ifs[i] ~= new_ifs[i] then
++ backup_ifnames()
++ for i = 1, #old_ifs do
++ net:del_interface(old_ifs[i])
++ end
++ for i = 1, #new_ifs do
++ net:add_interface(new_ifs[i])
++ end
++ break
++ end
++ end
++ end
++end
++
++
++if not net:is_virtual() then
++ ifname_multi = s:taboption("physical", Value, "ifname_multi", translate("Interface"))
++ ifname_multi.template = "cbi/network_ifacelist"
++ ifname_multi.nobridges = true
++ ifname_multi.rmempty = false
++ ifname_multi.network = arg[1]
++ ifname_multi.widget = "checkbox"
++ ifname_multi:depends("type", "bridge")
++ ifname_multi.cfgvalue = ifname_single.cfgvalue
++ ifname_multi.write = ifname_single.write
++end
++
++
++if has_firewall then
++ fwzone = s:taboption("firewall", Value, "_fwzone",
++ translate("Create / Assign firewall-zone"),
++ translate("Choose the firewall zone you want to assign to this interface. Select <em>unspecified</em> to remove the interface from the associated zone or fill out the <em>create</em> field to define a new zone and attach the interface to it."))
++
++ fwzone.template = "cbi/firewall_zonelist"
++ fwzone.network = arg[1]
++ fwzone.rmempty = false
++
++ function fwzone.cfgvalue(self, section)
++ self.iface = section
++ local z = fw:get_zone_by_network(section)
++ return z and z:name()
++ 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
++
++ if zone then
++ fw:del_network(section)
++ zone:add_network(section)
++ end
++ end
++end
++
++
++function p.write() end
++function p.remove() end
++function p.validate(self, value, section)
++ if value == net:proto() then
++ if not net:is_floating() and net:is_empty() then
++ local ifn = ((br and (br:formvalue(section) == "bridge"))
++ and ifname_multi:formvalue(section)
++ or ifname_single:formvalue(section))
++
++ for ifn in ut.imatch(ifn) do
++ return value
++ end
++ return nil, translate("The selected protocol needs a device assigned")
++ end
++ end
++ return value
++end
++
++
++local form, ferr = loadfile(
++ ut.libpath() .. "/model/cbi/admin_network/proto_%s.lua" % net:proto()
++)
++
++if not form then
++ s:taboption("general", DummyValue, "_error",
++ translate("Missing protocol extension for proto %q" % net:proto())
++ ).value = ferr
++else
++ setfenv(form, getfenv(1))(m, s, net)
++end
++
++
++local _, field
++for _, field in ipairs(s.children) do
++ if field ~= st and field ~= p and field ~= p_install and field ~= p_switch then
++ if next(field.deps) then
++ local _, dep
++ for _, dep in ipairs(field.deps) do
++ dep.deps.proto = net:proto()
++ end
++ else
++ field:depends("proto", net:proto())
++ end
++ end
++end
++
++
++--
++-- Display DNS settings if dnsmasq is available
++--
++
++if has_dnsmasq and net:proto() == "static" then
++ m2 = Map("dhcp", "", "")
++
++ local has_section = false
++
++ m2.uci:foreach("dhcp", "dhcp", function(s)
++ if s.interface == arg[1] then
++ has_section = true
++ return false
++ end
++ end)
++
++ if not has_section and has_dnsmasq then
++
++ s = m2:section(TypedSection, "dhcp", translate("DHCP Server"))
++ s.anonymous = true
++ s.cfgsections = function() return { "_enable" } end
++
++ x = s:option(Button, "_enable")
++ x.title = translate("No DHCP Server configured for this interface")
++ x.inputtitle = translate("Setup DHCP Server")
++ x.inputstyle = "apply"
++
++ elseif has_section then
++
++ s = m2:section(TypedSection, "dhcp", translate("DHCP Server"))
++ s.addremove = false
++ s.anonymous = true
++ s:tab("general", translate("General Setup"))
++ s:tab("advanced", translate("Advanced Settings"))
++ s:tab("ipv6", translate("IPv6 Settings"))
++
++ function s.filter(self, section)
++ return m2.uci:get("dhcp", section, "interface") == arg[1]
++ end
++
++ local ignore = s:taboption("general", Flag, "ignore",
++ translate("Ignore interface"),
++ translate("Disable <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr> for " ..
++ "this interface."))
++
++ local start = s:taboption("general", Value, "start", translate("Start"),
++ translate("Lowest leased address as offset from the network address."))
++ start.optional = true
++ start.datatype = "or(uinteger,ip4addr)"
++ start.default = "100"
++
++ local limit = s:taboption("general", Value, "limit", translate("Limit"),
++ translate("Maximum number of leased addresses."))
++ limit.optional = true
++ limit.datatype = "uinteger"
++ limit.default = "150"
++
++ local ltime = s:taboption("general", Value, "leasetime", translate("Leasetime"),
++ translate("Expiry time of leased addresses, minimum is 2 minutes (<code>2m</code>)."))
++ ltime.rmempty = true
++ ltime.default = "12h"
++
++ local dd = s:taboption("advanced", Flag, "dynamicdhcp",
++ translate("Dynamic <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</abbr>"),
++ translate("Dynamically allocate DHCP addresses for clients. If disabled, only " ..
++ "clients having static leases will be served."))
++ dd.default = dd.enabled
++
++ s:taboption("advanced", Flag, "force", translate("Force"),
++ translate("Force DHCP on this network even if another server is detected."))
++
++ -- XXX: is this actually useful?
++ --s:taboption("advanced", Value, "name", translate("Name"),
++ -- translate("Define a name for this network."))
++
++ mask = s:taboption("advanced", Value, "netmask",
++ translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"),
++ translate("Override the netmask sent to clients. Normally it is calculated " ..
++ "from the subnet that is served."))
++
++ mask.optional = true
++ mask.datatype = "ip4addr"
++
++ s:taboption("advanced", DynamicList, "dhcp_option", translate("DHCP-Options"),
++ translate("Define additional DHCP options, for example \"<code>6,192.168.2.1," ..
++ "192.168.2.2</code>\" which advertises different DNS servers to clients."))
++
++ for i, n in ipairs(s.children) do
++ if n ~= ignore then
++ n:depends("ignore", "")
++ end
++ end
++
++ o = s:taboption("ipv6", ListValue, "ra", translate("Router Advertisement-Service"))
++ o:value("", translate("disabled"))
++ o:value("server", translate("server mode"))
++ o:value("relay", translate("relay mode"))
++ o:value("hybrid", translate("hybrid mode"))
++
++ o = s:taboption("ipv6", ListValue, "dhcpv6", translate("DHCPv6-Service"))
++ o:value("", translate("disabled"))
++ o:value("server", translate("server mode"))
++ o:value("relay", translate("relay mode"))
++ o:value("hybrid", translate("hybrid mode"))
++
++ o = s:taboption("ipv6", ListValue, "ndp", translate("NDP-Proxy"))
++ o:value("", translate("disabled"))
++ o:value("relay", translate("relay mode"))
++ o:value("hybrid", translate("hybrid mode"))
++
++ o = s:taboption("ipv6", ListValue, "ra_management", translate("DHCPv6-Mode"))
++ o:value("", translate("stateless"))
++ o:value("1", translate("stateless + stateful"))
++ o:value("2", translate("stateful-only"))
++ o:depends("dhcpv6", "server")
++ o:depends("dhcpv6", "hybrid")
++ o.default = "1"
++
++ o = s:taboption("ipv6", Flag, "ra_default", translate("Always announce default router"),
++ translate("Announce as default router even if no public prefix is available."))
++ o:depends("ra", "server")
++ o:depends("ra", "hybrid")
++
++ s:taboption("ipv6", DynamicList, "dns", translate("Announced DNS servers"))
++ s:taboption("ipv6", DynamicList, "domain", translate("Announced DNS domains"))
++
++ else
++ m2 = nil
++ end
++end
++
++
++return m, m2
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua
+new file mode 100644
+index 0000000..2be88fc
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua
+@@ -0,0 +1,71 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++
++m = Map("network", translate("Interfaces"))
++m.pageaction = false
++m:section(SimpleSection).template = "admin_network/iface_overview"
++
++-- Show ATM bridge section if we have the capabilities
++if fs.access("/usr/sbin/br2684ctl") then
++ atm = m:section(TypedSection, "atm-bridge", translate("ATM Bridges"),
++ translate("ATM bridges expose encapsulated ethernet in AAL5 " ..
++ "connections as virtual Linux network interfaces which can " ..
++ "be used in conjunction with DHCP or PPP to dial into the " ..
++ "provider network."))
++
++ atm.addremove = true
++ atm.anonymous = true
++
++ atm.create = function(self, section)
++ local sid = TypedSection.create(self, section)
++ local max_unit = -1
++
++ m.uci:foreach("network", "atm-bridge",
++ function(s)
++ local u = tonumber(s.unit)
++ if u ~= nil and u > max_unit then
++ max_unit = u
++ end
++ end)
++
++ m.uci:set("network", sid, "unit", max_unit + 1)
++ m.uci:set("network", sid, "atmdev", 0)
++ m.uci:set("network", sid, "encaps", "llc")
++ m.uci:set("network", sid, "payload", "bridged")
++ m.uci:set("network", sid, "vci", 35)
++ m.uci:set("network", sid, "vpi", 8)
++
++ return sid
++ end
++
++ atm:tab("general", translate("General Setup"))
++ atm:tab("advanced", translate("Advanced Settings"))
++
++ vci = atm:taboption("general", Value, "vci", translate("ATM Virtual Channel Identifier (VCI)"))
++ vpi = atm:taboption("general", Value, "vpi", translate("ATM Virtual Path Identifier (VPI)"))
++ encaps = atm:taboption("general", ListValue, "encaps", translate("Encapsulation mode"))
++ encaps:value("llc", translate("LLC"))
++ encaps:value("vc", translate("VC-Mux"))
++
++ atmdev = atm:taboption("advanced", Value, "atmdev", translate("ATM device number"))
++ unit = atm:taboption("advanced", Value, "unit", translate("Bridge unit number"))
++ payload = atm:taboption("advanced", ListValue, "payload", translate("Forwarding mode"))
++ payload:value("bridged", translate("bridged"))
++ payload:value("routed", translate("routed"))
++ m.pageaction = true
++end
++
++local network = require "luci.model.network"
++if network:has_ipv6() then
++ local s = m:section(NamedSection, "globals", "globals", translate("Global network options"))
++ local o = s:option(Value, "ula_prefix", translate("IPv6 ULA-Prefix"))
++ o.datatype = "ip6addr"
++ o.rmempty = true
++ m.pageaction = true
++end
++
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/proto_ahcp.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/proto_ahcp.lua
+new file mode 100644
+index 0000000..0818199
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/proto_ahcp.lua
+@@ -0,0 +1,67 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local device, apn, service, pincode, username, password
++local ipv6, maxwait, defaultroute, metric, peerdns, dns,
++ keepalive_failure, keepalive_interval, demand
++
++
++mca = s:taboption("ahcp", Value, "multicast_address", translate("Multicast address"))
++mca.optional = true
++mca.placeholder = "ff02::cca6:c0f9:e182:5359"
++mca.datatype = "ip6addr"
++mca:depends("proto", "ahcp")
++
++port = s:taboption("ahcp", Value, "port", translate("Port"))
++port.optional = true
++port.placeholder = 5359
++port.datatype = "port"
++port:depends("proto", "ahcp")
++
++fam = s:taboption("ahcp", ListValue, "_family", translate("Protocol family"))
++fam:value("", translate("IPv4 and IPv6"))
++fam:value("ipv4", translate("IPv4 only"))
++fam:value("ipv6", translate("IPv6 only"))
++fam:depends("proto", "ahcp")
++
++function fam.cfgvalue(self, section)
++ local v4 = m.uci:get_bool("network", section, "ipv4_only")
++ local v6 = m.uci:get_bool("network", section, "ipv6_only")
++ if v4 then
++ return "ipv4"
++ elseif v6 then
++ return "ipv6"
++ end
++ return ""
++end
++
++function fam.write(self, section, value)
++ if value == "ipv4" then
++ m.uci:set("network", section, "ipv4_only", "true")
++ m.uci:delete("network", section, "ipv6_only")
++ elseif value == "ipv6" then
++ m.uci:set("network", section, "ipv6_only", "true")
++ m.uci:delete("network", section, "ipv4_only")
++ end
++end
++
++function fam.remove(self, section)
++ m.uci:delete("network", section, "ipv4_only")
++ m.uci:delete("network", section, "ipv6_only")
++end
++
++nodns = s:taboption("ahcp", Flag, "no_dns", translate("Disable DNS setup"))
++nodns.optional = true
++nodns.enabled = "true"
++nodns.disabled = "false"
++nodns.default = nodns.disabled
++nodns:depends("proto", "ahcp")
++
++ltime = s:taboption("ahcp", Value, "lease_time", translate("Lease validity time"))
++ltime.optional = true
++ltime.placeholder = 3666
++ltime.datatype = "uinteger"
++ltime:depends("proto", "ahcp")
++
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/routes.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/routes.lua
+new file mode 100644
+index 0000000..ac02b15
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/routes.lua
+@@ -0,0 +1,74 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local wa = require "luci.tools.webadmin"
++local fs = require "nixio.fs"
++
++m = Map("network",
++ translate("Routes"),
++ translate("Routes specify over which interface and gateway a certain host or network " ..
++ "can be reached."))
++
++s = m:section(TypedSection, "route", translate("Static IPv4 Routes"))
++s.addremove = true
++s.anonymous = true
++
++s.template = "cbi/tblsection"
++
++iface = s:option(ListValue, "interface", translate("Interface"))
++wa.cbi_add_networks(iface)
++
++t = s:option(Value, "target", translate("Target"), translate("Host-<abbr title=\"Internet Protocol Address\">IP</abbr> or Network"))
++t.datatype = "ip4addr"
++t.rmempty = false
++
++n = s:option(Value, "netmask", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"), translate("if target is a network"))
++n.placeholder = "255.255.255.255"
++n.datatype = "ip4addr"
++n.rmempty = true
++
++g = s:option(Value, "gateway", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"))
++g.datatype = "ip4addr"
++g.rmempty = true
++
++metric = s:option(Value, "metric", translate("Metric"))
++metric.placeholder = 0
++metric.datatype = "range(0,255)"
++metric.rmempty = true
++
++mtu = s:option(Value, "mtu", translate("MTU"))
++mtu.placeholder = 1500
++mtu.datatype = "range(64,9000)"
++mtu.rmempty = true
++
++if fs.access("/proc/net/ipv6_route") then
++ s = m:section(TypedSection, "route6", translate("Static IPv6 Routes"))
++ s.addremove = true
++ s.anonymous = true
++
++ s.template = "cbi/tblsection"
++
++ iface = s:option(ListValue, "interface", translate("Interface"))
++ wa.cbi_add_networks(iface)
++
++ t = s:option(Value, "target", translate("Target"), translate("<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Address or Network (CIDR)"))
++ t.datatype = "ip6addr"
++ t.rmempty = false
++
++ g = s:option(Value, "gateway", translate("<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Gateway"))
++ g.datatype = "ip6addr"
++ g.rmempty = true
++
++ metric = s:option(Value, "metric", translate("Metric"))
++ metric.placeholder = 0
++ metric.datatype = "range(0,65535)" -- XXX: not sure
++ metric.rmempty = true
++
++ mtu = s:option(Value, "mtu", translate("MTU"))
++ mtu.placeholder = 1500
++ mtu.datatype = "range(64,9000)"
++ mtu.rmempty = true
++end
++
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua
+new file mode 100644
+index 0000000..40f8014
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua
+@@ -0,0 +1,305 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2010-2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("network", translate("Switch"), translate("The network ports on this device can be combined to several <abbr title=\"Virtual Local Area Network\">VLAN</abbr>s in which computers can communicate directly with each other. <abbr title=\"Virtual Local Area Network\">VLAN</abbr>s are often used to separate different network 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."))
++
++local fs = require "nixio.fs"
++local switches = { }
++
++m.uci:foreach("network", "switch",
++ function(x)
++ local sid = x['.name']
++ local switch_name = x.name or sid
++ local has_vlan = nil
++ local has_learn = nil
++ local has_vlan4k = nil
++ local has_jumbo3 = nil
++ local has_mirror = nil
++ local min_vid = 0
++ local max_vid = 16
++ local num_vlans = 16
++ local cpu_port = tonumber(fs.readfile("/proc/switch/eth0/cpuport") or 5)
++ local num_ports = cpu_port + 1
++
++ local switch_title
++ local enable_vlan4k = false
++
++ -- Parse some common switch properties from swconfig help output.
++ local swc = io.popen("swconfig dev %q help 2>/dev/null" % switch_name)
++ if swc then
++
++ local is_port_attr = false
++ local is_vlan_attr = false
++
++ while true do
++ local line = swc:read("*l")
++ if not line then break end
++
++ if line:match("^%s+%-%-vlan") then
++ is_vlan_attr = true
++
++ elseif line:match("^%s+%-%-port") then
++ is_vlan_attr = false
++ is_port_attr = true
++
++ elseif line:match("cpu @") then
++ switch_title = line:match("^switch%d: %w+%((.-)%)")
++ num_ports, cpu_port, num_vlans =
++ line:match("ports: (%d+) %(cpu @ (%d+)%), vlans: (%d+)")
++
++ num_ports = tonumber(num_ports) or 6
++ num_vlans = tonumber(num_vlans) or 16
++ cpu_port = tonumber(cpu_port) or 5
++ min_vid = 1
++
++ elseif line:match(": pvid") or line:match(": tag") or line:match(": vid") then
++ if is_vlan_attr then has_vlan4k = line:match(": (%w+)") end
++
++ elseif line:match(": enable_vlan4k") then
++ enable_vlan4k = true
++
++ elseif line:match(": enable_vlan") then
++ has_vlan = "enable_vlan"
++
++ elseif line:match(": enable_learning") then
++ has_learn = "enable_learning"
++
++ elseif line:match(": enable_mirror_rx") then
++ has_mirror = "enable_mirror_rx"
++
++ elseif line:match(": max_length") then
++ has_jumbo3 = "max_length"
++ end
++ end
++
++ swc:close()
++ end
++
++
++ -- Switch properties
++ s = m:section(NamedSection, x['.name'], "switch",
++ switch_title and translatef("Switch %q (%s)", switch_name, switch_title)
++ or translatef("Switch %q", switch_name))
++
++ s.addremove = false
++
++ if has_vlan then
++ s:option(Flag, has_vlan, translate("Enable VLAN functionality"))
++ end
++
++ if has_learn then
++ x = s:option(Flag, has_learn, translate("Enable learning and aging"))
++ x.default = x.enabled
++ end
++
++ if has_jumbo3 then
++ x = s:option(Flag, has_jumbo3, translate("Enable Jumbo Frame passthrough"))
++ x.enabled = "3"
++ x.rmempty = true
++ end
++
++ -- Does this switch support port mirroring?
++ if has_mirror then
++ s:option(Flag, "enable_mirror_rx", translate("Enable mirroring of incoming packets"))
++ s:option(Flag, "enable_mirror_tx", translate("Enable mirroring of outgoing packets"))
++
++ local sp = s:option(ListValue, "mirror_source_port", translate("Mirror source port"))
++ local mp = s:option(ListValue, "mirror_monitor_port", translate("Mirror monitor port"))
++
++ local pt
++ for pt = 0, num_ports - 1 do
++ local name
++
++ name = (pt == cpu_port) and translate("CPU") or translatef("Port %d", pt)
++
++ sp:value(pt, name)
++ mp:value(pt, name)
++ end
++ end
++
++ -- VLAN table
++ s = m:section(TypedSection, "switch_vlan",
++ switch_title and translatef("VLANs on %q (%s)", switch_name, switch_title)
++ or translatef("VLANs on %q", switch_name))
++
++ s.template = "cbi/tblsection"
++ s.addremove = true
++ s.anonymous = true
++
++ -- Filter by switch
++ s.filter = function(self, section)
++ local device = m:get(section, "device")
++ return (device and device == switch_name)
++ end
++
++ -- Override cfgsections callback to enforce row ordering by vlan id.
++ s.cfgsections = function(self)
++ local osections = TypedSection.cfgsections(self)
++ local sections = { }
++ local section
++
++ for _, section in luci.util.spairs(
++ osections,
++ function(a, b)
++ return (tonumber(m:get(osections[a], has_vlan4k or "vlan")) or 9999)
++ < (tonumber(m:get(osections[b], has_vlan4k or "vlan")) or 9999)
++ end
++ ) do
++ sections[#sections+1] = section
++ end
++
++ return sections
++ end
++
++ -- When creating a new vlan, preset it with the highest found vid + 1.
++ s.create = function(self, section, origin)
++ -- Filter by switch
++ if m:get(origin, "device") ~= switch_name then
++ return
++ end
++
++ local sid = TypedSection.create(self, section)
++
++ local max_nr = 0
++ local max_id = 0
++
++ m.uci:foreach("network", "switch_vlan",
++ function(s)
++ if s.device == switch_name then
++ local nr = tonumber(s.vlan)
++ local id = has_vlan4k and tonumber(s[has_vlan4k])
++ if nr ~= nil and nr > max_nr then max_nr = nr end
++ if id ~= nil and id > max_id then max_id = id end
++ end
++ end)
++
++ m:set(sid, "device", switch_name)
++ m:set(sid, "vlan", max_nr + 1)
++
++ if has_vlan4k then
++ m:set(sid, has_vlan4k, max_id + 1)
++ end
++
++ return sid
++ end
++
++
++ local port_opts = { }
++ local untagged = { }
++
++ -- Parse current tagging state from the "ports" option.
++ local portvalue = function(self, section)
++ local pt
++ for pt in (m:get(section, "ports") or ""):gmatch("%w+") do
++ local pc, tu = pt:match("^(%d+)([tu]*)")
++ if pc == self.option then return (#tu > 0) and tu or "u" end
++ end
++ return ""
++ end
++
++ -- Validate port tagging. Ensure that a port is only untagged once,
++ -- bail out if not.
++ local portvalidate = function(self, value, section)
++ -- ensure that the ports appears untagged only once
++ if value == "u" then
++ if not untagged[self.option] then
++ untagged[self.option] = true
++ elseif min_vid > 0 or tonumber(self.option) ~= cpu_port then -- enable multiple untagged cpu ports due to weird broadcom default setup
++ return nil,
++ translatef("Port %d is untagged in multiple VLANs!", tonumber(self.option) + 1)
++ end
++ end
++ return value
++ end
++
++
++ local vid = s:option(Value, has_vlan4k or "vlan", "VLAN ID", "<div id='portstatus-%s'></div>" % switch_name)
++ local mx_vid = has_vlan4k and 4094 or (num_vlans - 1)
++
++ vid.rmempty = false
++ vid.forcewrite = true
++ vid.vlan_used = { }
++ vid.datatype = "and(uinteger,range("..min_vid..","..mx_vid.."))"
++
++ -- Validate user provided VLAN ID, make sure its within the bounds
++ -- allowed by the switch.
++ vid.validate = function(self, value, section)
++ local v = tonumber(value)
++ local m = has_vlan4k and 4094 or (num_vlans - 1)
++ if v ~= nil and v >= min_vid and v <= m then
++ if not self.vlan_used[v] then
++ self.vlan_used[v] = true
++ return value
++ else
++ return nil,
++ translatef("Invalid VLAN ID given! Only unique IDs are allowed")
++ end
++ else
++ return nil,
++ translatef("Invalid VLAN ID given! Only IDs between %d and %d are allowed.", min_vid, m)
++ end
++ end
++
++ -- When writing the "vid" or "vlan" option, serialize the port states
++ -- as well and write them as "ports" option to uci.
++ vid.write = function(self, section, value)
++ local o
++ local p = { }
++
++ for _, o in ipairs(port_opts) do
++ local v = o:formvalue(section)
++ if v == "t" then
++ p[#p+1] = o.option .. v
++ elseif v == "u" then
++ p[#p+1] = o.option
++ end
++ end
++
++ if enable_vlan4k then
++ m:set(sid, "enable_vlan4k", "1")
++ end
++
++ m:set(section, "ports", table.concat(p, " "))
++ return Value.write(self, section, value)
++ end
++
++ -- Fallback to "vlan" option if "vid" option is supported but unset.
++ vid.cfgvalue = function(self, section)
++ return m:get(section, has_vlan4k or "vlan")
++ or m:get(section, "vlan")
++ end
++
++ -- Build per-port off/untagged/tagged choice lists.
++ local pt
++ for pt = 0, num_ports - 1 do
++ local title
++ if pt == cpu_port then
++ title = translate("CPU")
++ else
++ title = translatef("Port %d", pt)
++ end
++
++ local po = s:option(ListValue, tostring(pt), title)
++
++ po:value("", translate("off"))
++ po:value("u", translate("untagged"))
++ po:value("t", translate("tagged"))
++
++ po.cfgvalue = portvalue
++ po.validate = portvalidate
++ po.write = function() end
++
++ port_opts[#port_opts+1] = po
++ end
++
++ switches[#switches+1] = switch_name
++ end
++)
++
++-- Switch status template
++s = m:section(SimpleSection)
++s.template = "admin_network/switch_status"
++s.switches = switches
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua
+new file mode 100644
+index 0000000..9a2bd5d
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua
+@@ -0,0 +1,946 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local wa = require "luci.tools.webadmin"
++local nw = require "luci.model.network"
++local ut = require "luci.util"
++local nt = require "luci.sys".net
++local fs = require "nixio.fs"
++
++arg[1] = arg[1] or ""
++
++m = Map("wireless", "",
++ translate("The <em>Device Configuration</em> section covers physical settings of the radio " ..
++ "hardware such as channel, transmit power or antenna selection which are shared among all " ..
++ "defined wireless networks (if the radio hardware is multi-SSID capable). Per network settings " ..
++ "like encryption or operation mode are grouped in the <em>Interface Configuration</em>."))
++
++m:chain("network")
++m:chain("firewall")
++m.redirect = luci.dispatcher.build_url("admin/network/wireless")
++
++local ifsection
++
++function m.on_commit(map)
++ local wnet = nw:get_wifinet(arg[1])
++ if ifsection and wnet then
++ ifsection.section = wnet.sid
++ m.title = luci.util.pcdata(wnet:get_i18n())
++ end
++end
++
++nw.init(m.uci)
++
++local wnet = nw:get_wifinet(arg[1])
++local wdev = wnet and wnet:get_device()
++
++-- redirect to overview page if network does not exist anymore (e.g. after a revert)
++if not wnet or not wdev then
++ luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless"))
++ return
++end
++
++-- wireless toggle was requested, commit and reload page
++function m.parse(map)
++ if m:formvalue("cbid.wireless.%s.__toggle" % wdev:name()) then
++ if wdev:get("disabled") == "1" or wnet:get("disabled") == "1" then
++ wnet:set("disabled", nil)
++ else
++ wnet:set("disabled", "1")
++ end
++ wdev:set("disabled", nil)
++
++ nw:commit("wireless")
++ luci.sys.call("(env -i /bin/ubus call network reload) >/dev/null 2>/dev/null")
++
++ luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless", arg[1]))
++ return
++ end
++ Map.parse(map)
++end
++
++m.title = luci.util.pcdata(wnet:get_i18n())
++
++
++local function txpower_list(iw)
++ local list = iw.txpwrlist or { }
++ local off = tonumber(iw.txpower_offset) or 0
++ local new = { }
++ local prev = -1
++ local _, val
++ for _, val in ipairs(list) do
++ local dbm = val.dbm + off
++ local mw = math.floor(10 ^ (dbm / 10))
++ if mw ~= prev then
++ prev = mw
++ new[#new+1] = {
++ display_dbm = dbm,
++ display_mw = mw,
++ driver_dbm = val.dbm,
++ driver_mw = val.mw
++ }
++ end
++ end
++ return new
++end
++
++local function txpower_current(pwr, list)
++ pwr = tonumber(pwr)
++ if pwr ~= nil then
++ local _, item
++ for _, item in ipairs(list) do
++ if item.driver_dbm >= pwr then
++ return item.driver_dbm
++ end
++ end
++ end
++ return (list[#list] and list[#list].driver_dbm) or pwr or 0
++end
++
++local iw = luci.sys.wifi.getiwinfo(arg[1])
++local hw_modes = iw.hwmodelist or { }
++local tx_power_list = txpower_list(iw)
++local tx_power_cur = txpower_current(wdev:get("txpower"), tx_power_list)
++
++s = m:section(NamedSection, wdev:name(), "wifi-device", translate("Device Configuration"))
++s.addremove = false
++
++s:tab("general", translate("General Setup"))
++s:tab("macfilter", translate("MAC-Filter"))
++s:tab("advanced", translate("Advanced Settings"))
++
++--[[
++back = s:option(DummyValue, "_overview", translate("Overview"))
++back.value = ""
++back.titleref = luci.dispatcher.build_url("admin", "network", "wireless")
++]]
++
++st = s:taboption("general", DummyValue, "__status", translate("Status"))
++st.template = "admin_network/wifi_status"
++st.ifname = arg[1]
++
++en = s:taboption("general", Button, "__toggle")
++
++if wdev:get("disabled") == "1" or wnet:get("disabled") == "1" then
++ en.title = translate("Wireless network is disabled")
++ en.inputtitle = translate("Enable")
++ en.inputstyle = "apply"
++else
++ en.title = translate("Wireless network is enabled")
++ en.inputtitle = translate("Disable")
++ en.inputstyle = "reset"
++end
++
++
++local hwtype = wdev:get("type")
++
++-- NanoFoo
++local nsantenna = wdev:get("antenna")
++
++-- Check whether there are client interfaces on the same radio,
++-- if yes, lock the channel choice as these stations will dicatate the freq
++local found_sta = nil
++local _, net
++if wnet:mode() ~= "sta" then
++ for _, net in ipairs(wdev:get_wifinets()) do
++ if net:mode() == "sta" and net:get("disabled") ~= "1" then
++ if not found_sta then
++ found_sta = {}
++ found_sta.channel = net:channel()
++ found_sta.names = {}
++ end
++ found_sta.names[#found_sta.names+1] = net:shortname()
++ end
++ end
++end
++
++if found_sta then
++ ch = s:taboption("general", DummyValue, "choice", translate("Channel"))
++ ch.value = translatef("Locked to channel %d used by: %s",
++ found_sta.channel, table.concat(found_sta.names, ", "))
++else
++ ch = s:taboption("general", Value, "_mode_freq", '<br />'..translate("Operating frequency"))
++ ch.hwmodes = iw.hwmodelist
++ ch.freqlist = iw.freqlist
++ ch.template = "cbi/wireless_modefreq"
++
++ function ch.cfgvalue(self, section)
++ return {
++ m:get(section, "hwmode") or "",
++ m:get(section, "channel") or "auto",
++ m:get(section, "htmode") or ""
++ }
++ end
++
++ function ch.formvalue(self, section)
++ return {
++ m:formvalue(self:cbid(section) .. ".band") or (iw.hwmodelist.g and "11g" or "11a"),
++ m:formvalue(self:cbid(section) .. ".channel") or "auto",
++ m:formvalue(self:cbid(section) .. ".htmode") or ""
++ }
++ end
++
++ function ch.write(self, section, value)
++ m:set(section, "hwmode", value[1])
++ m:set(section, "channel", value[2])
++ m:set(section, "htmode", value[3])
++ end
++end
++
++------------------- MAC80211 Device ------------------
++
++if hwtype == "mac80211" then
++ if #tx_power_list > 1 then
++ tp = s:taboption("general", ListValue,
++ "txpower", translate("Transmit Power"), "dBm")
++ tp.rmempty = true
++ tp.default = tx_power_cur
++ function tp.cfgvalue(...)
++ return txpower_current(Value.cfgvalue(...), tx_power_list)
++ end
++
++ for _, p in ipairs(tx_power_list) do
++ tp:value(p.driver_dbm, "%i dBm (%i mW)"
++ %{ p.display_dbm, p.display_mw })
++ end
++ end
++
++ local cl = iw and iw.countrylist
++ if cl and #cl > 0 then
++ cc = s:taboption("advanced", ListValue, "country", translate("Country Code"), translate("Use ISO/IEC 3166 alpha2 country codes."))
++ cc.default = tostring(iw and iw.country or "00")
++ for _, c in ipairs(cl) do
++ cc:value(c.alpha2, "%s - %s" %{ c.alpha2, c.name })
++ end
++ else
++ s:taboption("advanced", Value, "country", translate("Country Code"), translate("Use ISO/IEC 3166 alpha2 country codes."))
++ end
++
++ s:taboption("advanced", Value, "distance", translate("Distance Optimization"),
++ translate("Distance to farthest network member in meters."))
++
++ -- external antenna profiles
++ local eal = iw and iw.extant
++ if eal and #eal > 0 then
++ ea = s:taboption("advanced", ListValue, "extant", translate("Antenna Configuration"))
++ for _, eap in ipairs(eal) do
++ ea:value(eap.id, "%s (%s)" %{ eap.name, eap.description })
++ if eap.selected then
++ ea.default = eap.id
++ end
++ end
++ end
++
++ s:taboption("advanced", Value, "frag", translate("Fragmentation Threshold"))
++ s:taboption("advanced", Value, "rts", translate("RTS/CTS Threshold"))
++end
++
++
++------------------- Madwifi Device ------------------
++
++if hwtype == "atheros" then
++ tp = s:taboption("general",
++ (#tx_power_list > 0) and ListValue or Value,
++ "txpower", translate("Transmit Power"), "dBm")
++
++ tp.rmempty = true
++ tp.default = tx_power_cur
++
++ function tp.cfgvalue(...)
++ return txpower_current(Value.cfgvalue(...), tx_power_list)
++ end
++
++ for _, p in ipairs(tx_power_list) do
++ tp:value(p.driver_dbm, "%i dBm (%i mW)"
++ %{ p.display_dbm, p.display_mw })
++ end
++
++ s:taboption("advanced", Flag, "diversity", translate("Diversity")).rmempty = false
++
++ if not nsantenna then
++ ant1 = s:taboption("advanced", ListValue, "txantenna", translate("Transmitter Antenna"))
++ ant1.widget = "radio"
++ ant1.orientation = "horizontal"
++ ant1:depends("diversity", "")
++ ant1:value("0", translate("auto"))
++ ant1:value("1", translate("Antenna 1"))
++ ant1:value("2", translate("Antenna 2"))
++
++ ant2 = s:taboption("advanced", ListValue, "rxantenna", translate("Receiver Antenna"))
++ ant2.widget = "radio"
++ ant2.orientation = "horizontal"
++ ant2:depends("diversity", "")
++ ant2:value("0", translate("auto"))
++ ant2:value("1", translate("Antenna 1"))
++ ant2:value("2", translate("Antenna 2"))
++
++ else -- NanoFoo
++ local ant = s:taboption("advanced", ListValue, "antenna", translate("Transmitter Antenna"))
++ ant:value("auto")
++ ant:value("vertical")
++ ant:value("horizontal")
++ ant:value("external")
++ end
++
++ s:taboption("advanced", Value, "distance", translate("Distance Optimization"),
++ translate("Distance to farthest network member in meters."))
++ s:taboption("advanced", Value, "regdomain", translate("Regulatory Domain"))
++ s:taboption("advanced", Value, "country", translate("Country Code"))
++ s:taboption("advanced", Flag, "outdoor", translate("Outdoor Channels"))
++
++ --s:option(Flag, "nosbeacon", translate("Disable HW-Beacon timer"))
++end
++
++
++
++------------------- Broadcom Device ------------------
++
++if hwtype == "broadcom" then
++ tp = s:taboption("general",
++ (#tx_power_list > 0) and ListValue or Value,
++ "txpower", translate("Transmit Power"), "dBm")
++
++ tp.rmempty = true
++ tp.default = tx_power_cur
++
++ function tp.cfgvalue(...)
++ return txpower_current(Value.cfgvalue(...), tx_power_list)
++ end
++
++ for _, p in ipairs(tx_power_list) do
++ tp:value(p.driver_dbm, "%i dBm (%i mW)"
++ %{ p.display_dbm, p.display_mw })
++ end
++
++ ant1 = s:taboption("advanced", ListValue, "txantenna", translate("Transmitter Antenna"))
++ ant1.widget = "radio"
++ ant1:depends("diversity", "")
++ ant1:value("3", translate("auto"))
++ ant1:value("0", translate("Antenna 1"))
++ ant1:value("1", translate("Antenna 2"))
++
++ ant2 = s:taboption("advanced", ListValue, "rxantenna", translate("Receiver Antenna"))
++ ant2.widget = "radio"
++ ant2:depends("diversity", "")
++ ant2:value("3", translate("auto"))
++ ant2:value("0", translate("Antenna 1"))
++ ant2:value("1", translate("Antenna 2"))
++
++ s:taboption("advanced", Flag, "frameburst", translate("Frame Bursting"))
++
++ s:taboption("advanced", Value, "distance", translate("Distance Optimization"))
++ --s:option(Value, "slottime", translate("Slot time"))
++
++ s:taboption("advanced", Value, "country", translate("Country Code"))
++ s:taboption("advanced", Value, "maxassoc", translate("Connection Limit"))
++end
++
++
++--------------------- HostAP Device ---------------------
++
++if hwtype == "prism2" then
++ s:taboption("advanced", Value, "txpower", translate("Transmit Power"), "att units").rmempty = true
++
++ s:taboption("advanced", Flag, "diversity", translate("Diversity")).rmempty = false
++
++ s:taboption("advanced", Value, "txantenna", translate("Transmitter Antenna"))
++ s:taboption("advanced", Value, "rxantenna", translate("Receiver Antenna"))
++end
++
++
++----------------------- Interface -----------------------
++
++s = m:section(NamedSection, wnet.sid, "wifi-iface", translate("Interface Configuration"))
++ifsection = s
++s.addremove = false
++s.anonymous = true
++s.defaults.device = wdev:name()
++
++s:tab("general", translate("General Setup"))
++s:tab("encryption", translate("Wireless Security"))
++s:tab("macfilter", translate("MAC-Filter"))
++s:tab("advanced", translate("Advanced Settings"))
++
++s:taboption("general", Value, "ssid", translate("<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
++
++mode = s:taboption("general", ListValue, "mode", translate("Mode"))
++mode.override_values = true
++mode:value("ap", translate("Access Point"))
++mode:value("sta", translate("Client"))
++mode:value("adhoc", translate("Ad-Hoc"))
++
++bssid = s:taboption("general", Value, "bssid", translate("<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"))
++
++network = s:taboption("general", Value, "network", translate("Network"),
++ translate("Choose the network(s) you want to attach to this wireless interface or " ..
++ "fill out the <em>create</em> field to define a new network."))
++
++network.rmempty = true
++network.template = "cbi/network_netlist"
++network.widget = "checkbox"
++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)
++ if n then
++ if not n:is_empty() then
++ n:set("type", "bridge")
++ end
++ n:add_interface(i)
++ end
++ end
++ end
++ end
++end
++
++-------------------- MAC80211 Interface ----------------------
++
++if hwtype == "mac80211" then
++ if fs.access("/usr/sbin/iw") then
++ mode:value("mesh", "802.11s")
++ end
++
++ mode:value("ahdemo", translate("Pseudo Ad-Hoc (ahdemo)"))
++ mode:value("monitor", translate("Monitor"))
++ bssid:depends({mode="adhoc"})
++ bssid:depends({mode="sta"})
++ bssid:depends({mode="sta-wds"})
++
++ mp = s:taboption("macfilter", ListValue, "macfilter", translate("MAC-Address Filter"))
++ mp:depends({mode="ap"})
++ mp:depends({mode="ap-wds"})
++ mp:value("", translate("disable"))
++ mp:value("allow", translate("Allow listed only"))
++ mp:value("deny", translate("Allow all except listed"))
++
++ ml = s:taboption("macfilter", DynamicList, "maclist", translate("MAC-List"))
++ ml.datatype = "macaddr"
++ ml:depends({macfilter="allow"})
++ ml:depends({macfilter="deny"})
++ nt.mac_hints(function(mac, name) ml:value(mac, "%s (%s)" %{ mac, name }) end)
++
++ mode:value("ap-wds", "%s (%s)" % {translate("Access Point"), translate("WDS")})
++ mode:value("sta-wds", "%s (%s)" % {translate("Client"), translate("WDS")})
++
++ function mode.write(self, section, value)
++ if value == "ap-wds" then
++ ListValue.write(self, section, "ap")
++ m.uci:set("wireless", section, "wds", 1)
++ elseif value == "sta-wds" then
++ ListValue.write(self, section, "sta")
++ m.uci:set("wireless", section, "wds", 1)
++ else
++ ListValue.write(self, section, value)
++ m.uci:delete("wireless", section, "wds")
++ end
++ end
++
++ function mode.cfgvalue(self, section)
++ local mode = ListValue.cfgvalue(self, section)
++ local wds = m.uci:get("wireless", section, "wds") == "1"
++
++ if mode == "ap" and wds then
++ return "ap-wds"
++ elseif mode == "sta" and wds then
++ return "sta-wds"
++ else
++ return mode
++ end
++ end
++
++ hidden = s:taboption("general", Flag, "hidden", translate("Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
++ hidden:depends({mode="ap"})
++ hidden:depends({mode="ap-wds"})
++
++ wmm = s:taboption("general", Flag, "wmm", translate("WMM Mode"))
++ wmm:depends({mode="ap"})
++ wmm:depends({mode="ap-wds"})
++ wmm.default = wmm.enabled
++end
++
++
++
++-------------------- Madwifi Interface ----------------------
++
++if hwtype == "atheros" then
++ mode:value("ahdemo", translate("Pseudo Ad-Hoc (ahdemo)"))
++ mode:value("monitor", translate("Monitor"))
++ mode:value("ap-wds", "%s (%s)" % {translate("Access Point"), translate("WDS")})
++ mode:value("sta-wds", "%s (%s)" % {translate("Client"), translate("WDS")})
++ mode:value("wds", translate("Static WDS"))
++
++ function mode.write(self, section, value)
++ if value == "ap-wds" then
++ ListValue.write(self, section, "ap")
++ m.uci:set("wireless", section, "wds", 1)
++ elseif value == "sta-wds" then
++ ListValue.write(self, section, "sta")
++ m.uci:set("wireless", section, "wds", 1)
++ else
++ ListValue.write(self, section, value)
++ m.uci:delete("wireless", section, "wds")
++ end
++ end
++
++ function mode.cfgvalue(self, section)
++ local mode = ListValue.cfgvalue(self, section)
++ local wds = m.uci:get("wireless", section, "wds") == "1"
++
++ if mode == "ap" and wds then
++ return "ap-wds"
++ elseif mode == "sta" and wds then
++ return "sta-wds"
++ else
++ return mode
++ end
++ end
++
++ bssid:depends({mode="adhoc"})
++ bssid:depends({mode="ahdemo"})
++ bssid:depends({mode="wds"})
++
++ wdssep = s:taboption("advanced", Flag, "wdssep", translate("Separate WDS"))
++ wdssep:depends({mode="ap-wds"})
++
++ s:taboption("advanced", Flag, "doth", "802.11h")
++ hidden = s:taboption("general", Flag, "hidden", translate("Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
++ hidden:depends({mode="ap"})
++ hidden:depends({mode="adhoc"})
++ hidden:depends({mode="ap-wds"})
++ hidden:depends({mode="sta-wds"})
++ isolate = s:taboption("advanced", Flag, "isolate", translate("Separate Clients"),
++ translate("Prevents client-to-client communication"))
++ isolate:depends({mode="ap"})
++ s:taboption("advanced", Flag, "bgscan", translate("Background Scan"))
++
++ mp = s:taboption("macfilter", ListValue, "macpolicy", translate("MAC-Address Filter"))
++ mp:value("", translate("disable"))
++ mp:value("allow", translate("Allow listed only"))
++ mp:value("deny", translate("Allow all except listed"))
++
++ ml = s:taboption("macfilter", DynamicList, "maclist", translate("MAC-List"))
++ ml.datatype = "macaddr"
++ ml:depends({macpolicy="allow"})
++ ml:depends({macpolicy="deny"})
++ nt.mac_hints(function(mac, name) ml:value(mac, "%s (%s)" %{ mac, name }) end)
++
++ s:taboption("advanced", Value, "rate", translate("Transmission Rate"))
++ s:taboption("advanced", Value, "mcast_rate", translate("Multicast Rate"))
++ s:taboption("advanced", Value, "frag", translate("Fragmentation Threshold"))
++ s:taboption("advanced", Value, "rts", translate("RTS/CTS Threshold"))
++ s:taboption("advanced", Value, "minrate", translate("Minimum Rate"))
++ s:taboption("advanced", Value, "maxrate", translate("Maximum Rate"))
++ s:taboption("advanced", Flag, "compression", translate("Compression"))
++
++ s:taboption("advanced", Flag, "bursting", translate("Frame Bursting"))
++ s:taboption("advanced", Flag, "turbo", translate("Turbo Mode"))
++ s:taboption("advanced", Flag, "ff", translate("Fast Frames"))
++
++ s:taboption("advanced", Flag, "wmm", translate("WMM Mode"))
++ s:taboption("advanced", Flag, "xr", translate("XR Support"))
++ s:taboption("advanced", Flag, "ar", translate("AR Support"))
++
++ local swm = s:taboption("advanced", Flag, "sw_merge", translate("Disable HW-Beacon timer"))
++ swm:depends({mode="adhoc"})
++
++ local nos = s:taboption("advanced", Flag, "nosbeacon", translate("Disable HW-Beacon timer"))
++ nos:depends({mode="sta"})
++ nos:depends({mode="sta-wds"})
++
++ local probereq = s:taboption("advanced", Flag, "probereq", translate("Do not send probe responses"))
++ probereq.enabled = "0"
++ probereq.disabled = "1"
++end
++
++
++-------------------- Broadcom Interface ----------------------
++
++if hwtype == "broadcom" then
++ mode:value("wds", translate("WDS"))
++ mode:value("monitor", translate("Monitor"))
++
++ hidden = s:taboption("general", Flag, "hidden", translate("Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
++ hidden:depends({mode="ap"})
++ hidden:depends({mode="adhoc"})
++ hidden:depends({mode="wds"})
++
++ isolate = s:taboption("advanced", Flag, "isolate", translate("Separate Clients"),
++ translate("Prevents client-to-client communication"))
++ isolate:depends({mode="ap"})
++
++ s:taboption("advanced", Flag, "doth", "802.11h")
++ s:taboption("advanced", Flag, "wmm", translate("WMM Mode"))
++
++ bssid:depends({mode="wds"})
++ bssid:depends({mode="adhoc"})
++end
++
++
++----------------------- HostAP Interface ---------------------
++
++if hwtype == "prism2" then
++ mode:value("wds", translate("WDS"))
++ mode:value("monitor", translate("Monitor"))
++
++ hidden = s:taboption("general", Flag, "hidden", translate("Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
++ hidden:depends({mode="ap"})
++ hidden:depends({mode="adhoc"})
++ hidden:depends({mode="wds"})
++
++ bssid:depends({mode="sta"})
++
++ mp = s:taboption("macfilter", ListValue, "macpolicy", translate("MAC-Address Filter"))
++ mp:value("", translate("disable"))
++ mp:value("allow", translate("Allow listed only"))
++ mp:value("deny", translate("Allow all except listed"))
++ ml = s:taboption("macfilter", DynamicList, "maclist", translate("MAC-List"))
++ ml:depends({macpolicy="allow"})
++ ml:depends({macpolicy="deny"})
++ nt.mac_hints(function(mac, name) ml:value(mac, "%s (%s)" %{ mac, name }) end)
++
++ s:taboption("advanced", Value, "rate", translate("Transmission Rate"))
++ s:taboption("advanced", Value, "frag", translate("Fragmentation Threshold"))
++ s:taboption("advanced", Value, "rts", translate("RTS/CTS Threshold"))
++end
++
++
++------------------- WiFI-Encryption -------------------
++
++encr = s:taboption("encryption", ListValue, "encryption", translate("Encryption"))
++encr.override_values = true
++encr.override_depends = true
++encr:depends({mode="ap"})
++encr:depends({mode="sta"})
++encr:depends({mode="adhoc"})
++encr:depends({mode="ahdemo"})
++encr:depends({mode="ap-wds"})
++encr:depends({mode="sta-wds"})
++encr:depends({mode="mesh"})
++
++cipher = s:taboption("encryption", ListValue, "cipher", translate("Cipher"))
++cipher:depends({encryption="wpa"})
++cipher:depends({encryption="wpa2"})
++cipher:depends({encryption="psk"})
++cipher:depends({encryption="psk2"})
++cipher:depends({encryption="wpa-mixed"})
++cipher:depends({encryption="psk-mixed"})
++cipher:value("auto", translate("auto"))
++cipher:value("ccmp", translate("Force CCMP (AES)"))
++cipher:value("tkip", translate("Force TKIP"))
++cipher:value("tkip+ccmp", translate("Force TKIP and CCMP (AES)"))
++
++function encr.cfgvalue(self, section)
++ local v = tostring(ListValue.cfgvalue(self, section))
++ if v == "wep" then
++ return "wep-open"
++ elseif v and v:match("%+") then
++ return (v:gsub("%+.+$", ""))
++ end
++ return v
++end
++
++function encr.write(self, section, value)
++ local e = tostring(encr:formvalue(section))
++ local c = tostring(cipher:formvalue(section))
++ if value == "wpa" or value == "wpa2" then
++ self.map.uci:delete("wireless", section, "key")
++ end
++ if e and (c == "tkip" or c == "ccmp" or c == "tkip+ccmp") then
++ e = e .. "+" .. c
++ end
++ self.map:set(section, "encryption", e)
++end
++
++function cipher.cfgvalue(self, section)
++ local v = tostring(ListValue.cfgvalue(encr, section))
++ if v and v:match("%+") then
++ v = v:gsub("^[^%+]+%+", "")
++ if v == "aes" then v = "ccmp"
++ elseif v == "tkip+aes" then v = "tkip+ccmp"
++ elseif v == "aes+tkip" then v = "tkip+ccmp"
++ elseif v == "ccmp+tkip" then v = "tkip+ccmp"
++ end
++ end
++ return v
++end
++
++function cipher.write(self, section)
++ return encr:write(section)
++end
++
++
++encr:value("none", "No Encryption")
++encr:value("wep-open", translate("WEP Open System"), {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"}, {mode="adhoc"}, {mode="ahdemo"}, {mode="wds"})
++encr:value("wep-shared", translate("WEP Shared Key"), {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"}, {mode="adhoc"}, {mode="ahdemo"}, {mode="wds"})
++
++if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then
++ local supplicant = fs.access("/usr/sbin/wpa_supplicant")
++ local hostapd = fs.access("/usr/sbin/hostapd")
++
++ -- Probe EAP support
++ local has_ap_eap = (os.execute("hostapd -veap >/dev/null 2>/dev/null") == 0)
++ local has_sta_eap = (os.execute("wpa_supplicant -veap >/dev/null 2>/dev/null") == 0)
++
++ if hostapd and supplicant then
++ encr:value("psk", "WPA-PSK", {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"})
++ encr:value("psk2", "WPA2-PSK", {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"})
++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"})
++ if has_ap_eap and has_sta_eap then
++ encr:value("wpa", "WPA-EAP", {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"})
++ encr:value("wpa2", "WPA2-EAP", {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"})
++ end
++ elseif hostapd and not supplicant then
++ encr:value("psk", "WPA-PSK", {mode="ap"}, {mode="ap-wds"})
++ encr:value("psk2", "WPA2-PSK", {mode="ap"}, {mode="ap-wds"})
++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="ap"}, {mode="ap-wds"})
++ if has_ap_eap then
++ encr:value("wpa", "WPA-EAP", {mode="ap"}, {mode="ap-wds"})
++ encr:value("wpa2", "WPA2-EAP", {mode="ap"}, {mode="ap-wds"})
++ end
++ encr.description = translate(
++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ..
++ "and ad-hoc mode) to be installed."
++ )
++ elseif not hostapd and supplicant then
++ encr:value("psk", "WPA-PSK", {mode="sta"}, {mode="sta-wds"})
++ encr:value("psk2", "WPA2-PSK", {mode="sta"}, {mode="sta-wds"})
++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="sta"}, {mode="sta-wds"})
++ if has_sta_eap then
++ encr:value("wpa", "WPA-EAP", {mode="sta"}, {mode="sta-wds"})
++ encr:value("wpa2", "WPA2-EAP", {mode="sta"}, {mode="sta-wds"})
++ end
++ encr.description = translate(
++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ..
++ "and ad-hoc mode) to be installed."
++ )
++ else
++ encr.description = translate(
++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ..
++ "and ad-hoc mode) to be installed."
++ )
++ end
++elseif hwtype == "broadcom" then
++ encr:value("psk", "WPA-PSK")
++ encr:value("psk2", "WPA2-PSK")
++ encr:value("psk+psk2", "WPA-PSK/WPA2-PSK Mixed Mode")
++end
++
++auth_server = s:taboption("encryption", Value, "auth_server", translate("Radius-Authentication-Server"))
++auth_server:depends({mode="ap", encryption="wpa"})
++auth_server:depends({mode="ap", encryption="wpa2"})
++auth_server:depends({mode="ap-wds", encryption="wpa"})
++auth_server:depends({mode="ap-wds", encryption="wpa2"})
++auth_server.rmempty = true
++auth_server.datatype = "host"
++
++auth_port = s:taboption("encryption", Value, "auth_port", translate("Radius-Authentication-Port"), translatef("Default %d", 1812))
++auth_port:depends({mode="ap", encryption="wpa"})
++auth_port:depends({mode="ap", encryption="wpa2"})
++auth_port:depends({mode="ap-wds", encryption="wpa"})
++auth_port:depends({mode="ap-wds", encryption="wpa2"})
++auth_port.rmempty = true
++auth_port.datatype = "port"
++
++auth_secret = s:taboption("encryption", Value, "auth_secret", translate("Radius-Authentication-Secret"))
++auth_secret:depends({mode="ap", encryption="wpa"})
++auth_secret:depends({mode="ap", encryption="wpa2"})
++auth_secret:depends({mode="ap-wds", encryption="wpa"})
++auth_secret:depends({mode="ap-wds", encryption="wpa2"})
++auth_secret.rmempty = true
++auth_secret.password = true
++
++acct_server = s:taboption("encryption", Value, "acct_server", translate("Radius-Accounting-Server"))
++acct_server:depends({mode="ap", encryption="wpa"})
++acct_server:depends({mode="ap", encryption="wpa2"})
++acct_server:depends({mode="ap-wds", encryption="wpa"})
++acct_server:depends({mode="ap-wds", encryption="wpa2"})
++acct_server.rmempty = true
++acct_server.datatype = "host"
++
++acct_port = s:taboption("encryption", Value, "acct_port", translate("Radius-Accounting-Port"), translatef("Default %d", 1813))
++acct_port:depends({mode="ap", encryption="wpa"})
++acct_port:depends({mode="ap", encryption="wpa2"})
++acct_port:depends({mode="ap-wds", encryption="wpa"})
++acct_port:depends({mode="ap-wds", encryption="wpa2"})
++acct_port.rmempty = true
++acct_port.datatype = "port"
++
++acct_secret = s:taboption("encryption", Value, "acct_secret", translate("Radius-Accounting-Secret"))
++acct_secret:depends({mode="ap", encryption="wpa"})
++acct_secret:depends({mode="ap", encryption="wpa2"})
++acct_secret:depends({mode="ap-wds", encryption="wpa"})
++acct_secret:depends({mode="ap-wds", encryption="wpa2"})
++acct_secret.rmempty = true
++acct_secret.password = true
++
++wpakey = s:taboption("encryption", Value, "_wpa_key", translate("Key"))
++wpakey:depends("encryption", "psk")
++wpakey:depends("encryption", "psk2")
++wpakey:depends("encryption", "psk+psk2")
++wpakey:depends("encryption", "psk-mixed")
++wpakey.datatype = "wpakey"
++wpakey.rmempty = true
++wpakey.password = true
++
++wpakey.cfgvalue = function(self, section, value)
++ local key = m.uci:get("wireless", section, "key")
++ if key == "1" or key == "2" or key == "3" or key == "4" then
++ return nil
++ end
++ return key
++end
++
++wpakey.write = function(self, section, value)
++ self.map.uci:set("wireless", section, "key", value)
++ self.map.uci:delete("wireless", section, "key1")
++end
++
++
++wepslot = s:taboption("encryption", ListValue, "_wep_key", translate("Used Key Slot"))
++wepslot:depends("encryption", "wep-open")
++wepslot:depends("encryption", "wep-shared")
++wepslot:value("1", translatef("Key #%d", 1))
++wepslot:value("2", translatef("Key #%d", 2))
++wepslot:value("3", translatef("Key #%d", 3))
++wepslot:value("4", translatef("Key #%d", 4))
++
++wepslot.cfgvalue = function(self, section)
++ local slot = tonumber(m.uci:get("wireless", section, "key"))
++ if not slot or slot < 1 or slot > 4 then
++ return 1
++ end
++ return slot
++end
++
++wepslot.write = function(self, section, value)
++ self.map.uci:set("wireless", section, "key", value)
++end
++
++local slot
++for slot=1,4 do
++ wepkey = s:taboption("encryption", Value, "key" .. slot, translatef("Key #%d", slot))
++ wepkey:depends("encryption", "wep-open")
++ wepkey:depends("encryption", "wep-shared")
++ wepkey.datatype = "wepkey"
++ wepkey.rmempty = true
++ wepkey.password = true
++
++ function wepkey.write(self, section, value)
++ if value and (#value == 5 or #value == 13) then
++ value = "s:" .. value
++ end
++ return Value.write(self, section, value)
++ end
++end
++
++
++if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then
++ nasid = s:taboption("encryption", Value, "nasid", translate("NAS ID"))
++ nasid:depends({mode="ap", encryption="wpa"})
++ nasid:depends({mode="ap", encryption="wpa2"})
++ nasid:depends({mode="ap-wds", encryption="wpa"})
++ nasid:depends({mode="ap-wds", encryption="wpa2"})
++ nasid.rmempty = true
++
++ eaptype = s:taboption("encryption", ListValue, "eap_type", translate("EAP-Method"))
++ eaptype:value("tls", "TLS")
++ eaptype:value("ttls", "TTLS")
++ eaptype:value("peap", "PEAP")
++ eaptype:depends({mode="sta", encryption="wpa"})
++ eaptype:depends({mode="sta", encryption="wpa2"})
++ eaptype:depends({mode="sta-wds", encryption="wpa"})
++ eaptype:depends({mode="sta-wds", encryption="wpa2"})
++
++ cacert = s:taboption("encryption", FileUpload, "ca_cert", translate("Path to CA-Certificate"))
++ cacert:depends({mode="sta", encryption="wpa"})
++ cacert:depends({mode="sta", encryption="wpa2"})
++ cacert:depends({mode="sta-wds", encryption="wpa"})
++ cacert:depends({mode="sta-wds", encryption="wpa2"})
++
++ clientcert = s:taboption("encryption", FileUpload, "client_cert", translate("Path to Client-Certificate"))
++ clientcert:depends({mode="sta", encryption="wpa"})
++ clientcert:depends({mode="sta", encryption="wpa2"})
++ clientcert:depends({mode="sta-wds", encryption="wpa"})
++ clientcert:depends({mode="sta-wds", encryption="wpa2"})
++
++ privkey = s:taboption("encryption", FileUpload, "priv_key", translate("Path to Private Key"))
++ privkey:depends({mode="sta", eap_type="tls", encryption="wpa2"})
++ privkey:depends({mode="sta", eap_type="tls", encryption="wpa"})
++ privkey:depends({mode="sta-wds", eap_type="tls", encryption="wpa2"})
++ privkey:depends({mode="sta-wds", eap_type="tls", encryption="wpa"})
++
++ privkeypwd = s:taboption("encryption", Value, "priv_key_pwd", translate("Password of Private Key"))
++ privkeypwd:depends({mode="sta", eap_type="tls", encryption="wpa2"})
++ privkeypwd:depends({mode="sta", eap_type="tls", encryption="wpa"})
++ privkeypwd:depends({mode="sta-wds", eap_type="tls", encryption="wpa2"})
++ privkeypwd:depends({mode="sta-wds", eap_type="tls", encryption="wpa"})
++
++
++ auth = s:taboption("encryption", Value, "auth", translate("Authentication"))
++ auth:value("PAP")
++ auth:value("CHAP")
++ auth:value("MSCHAP")
++ auth:value("MSCHAPV2")
++ auth:depends({mode="sta", eap_type="peap", encryption="wpa2"})
++ auth:depends({mode="sta", eap_type="peap", encryption="wpa"})
++ auth:depends({mode="sta", eap_type="ttls", encryption="wpa2"})
++ auth:depends({mode="sta", eap_type="ttls", encryption="wpa"})
++ auth:depends({mode="sta-wds", eap_type="peap", encryption="wpa2"})
++ auth:depends({mode="sta-wds", eap_type="peap", encryption="wpa"})
++ auth:depends({mode="sta-wds", eap_type="ttls", encryption="wpa2"})
++ auth:depends({mode="sta-wds", eap_type="ttls", encryption="wpa"})
++
++
++ identity = s:taboption("encryption", Value, "identity", translate("Identity"))
++ identity:depends({mode="sta", eap_type="peap", encryption="wpa2"})
++ identity:depends({mode="sta", eap_type="peap", encryption="wpa"})
++ identity:depends({mode="sta", eap_type="ttls", encryption="wpa2"})
++ identity:depends({mode="sta", eap_type="ttls", encryption="wpa"})
++ identity:depends({mode="sta-wds", eap_type="peap", encryption="wpa2"})
++ identity:depends({mode="sta-wds", eap_type="peap", encryption="wpa"})
++ identity:depends({mode="sta-wds", eap_type="ttls", encryption="wpa2"})
++ identity:depends({mode="sta-wds", eap_type="ttls", encryption="wpa"})
++
++ password = s:taboption("encryption", Value, "password", translate("Password"))
++ password:depends({mode="sta", eap_type="peap", encryption="wpa2"})
++ password:depends({mode="sta", eap_type="peap", encryption="wpa"})
++ password:depends({mode="sta", eap_type="ttls", encryption="wpa2"})
++ password:depends({mode="sta", eap_type="ttls", encryption="wpa"})
++ password:depends({mode="sta-wds", eap_type="peap", encryption="wpa2"})
++ password:depends({mode="sta-wds", eap_type="peap", encryption="wpa"})
++ password:depends({mode="sta-wds", eap_type="ttls", encryption="wpa2"})
++ password:depends({mode="sta-wds", eap_type="ttls", encryption="wpa"})
++end
++
++if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then
++ local wpasupplicant = fs.access("/usr/sbin/wpa_supplicant")
++ local hostcli = fs.access("/usr/sbin/hostapd_cli")
++ if hostcli and wpasupplicant then
++ wps = s:taboption("encryption", Flag, "wps_pushbutton", translate("Enable WPS pushbutton, requires WPA(2)-PSK"))
++ wps.enabled = "1"
++ wps.disabled = "0"
++ wps.rmempty = false
++ wps:depends("encryption", "psk")
++ wps:depends("encryption", "psk2")
++ wps:depends("encryption", "psk-mixed")
++ end
++end
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua
+new file mode 100644
+index 0000000..96b8b4d
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua
+@@ -0,0 +1,173 @@
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local nw = require "luci.model.network"
++local fw = require "luci.model.firewall"
++local uci = require "luci.model.uci".cursor()
++local http = require "luci.http"
++
++local iw = luci.sys.wifi.getiwinfo(http.formvalue("device"))
++
++local has_firewall = fs.access("/etc/config/firewall")
++
++if not iw then
++ luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless"))
++ return
++end
++
++m = SimpleForm("network", translate("Join Network: Settings"))
++m.cancel = translate("Back to scan results")
++m.reset = false
++
++function m.on_cancel()
++ local dev = http.formvalue("device")
++ http.redirect(luci.dispatcher.build_url(
++ dev and "admin/network/wireless_join?device=" .. dev
++ or "admin/network/wireless"
++ ))
++end
++
++nw.init(uci)
++fw.init(uci)
++
++m.hidden = {
++ device = http.formvalue("device"),
++ join = http.formvalue("join"),
++ channel = http.formvalue("channel"),
++ mode = http.formvalue("mode"),
++ bssid = http.formvalue("bssid"),
++ wep = http.formvalue("wep"),
++ wpa_suites = http.formvalue("wpa_suites"),
++ wpa_version = http.formvalue("wpa_version")
++}
++
++if iw and iw.mbssid_support then
++ replace = m:field(Flag, "replace", translate("Replace wireless configuration"),
++ translate("An additional network will be created if you leave this unchecked."))
++
++ function replace.cfgvalue() return "1" end
++else
++ replace = m:field(DummyValue, "replace", translate("Replace wireless configuration"))
++ replace.default = translate("The hardware is not multi-SSID capable and the existing " ..
++ "configuration will be replaced if you proceed.")
++
++ function replace.formvalue() return "1" end
++end
++
++if http.formvalue("wep") == "1" then
++ key = m:field(Value, "key", translate("WEP passphrase"),
++ translate("Specify the secret encryption key here."))
++
++ key.password = true
++ key.datatype = "wepkey"
++
++elseif (tonumber(m.hidden.wpa_version) or 0) > 0 and
++ (m.hidden.wpa_suites == "PSK" or m.hidden.wpa_suites == "PSK2")
++then
++ key = m:field(Value, "key", translate("WPA passphrase"),
++ translate("Specify the secret encryption key here."))
++
++ key.password = true
++ key.datatype = "wpakey"
++ --m.hidden.wpa_suite = (tonumber(http.formvalue("wpa_version")) or 0) >= 2 and "psk2" or "psk"
++end
++
++newnet = m:field(Value, "_netname_new", translate("Name of the new network"),
++ translate("The allowed characters are: <code>A-Z</code>, <code>a-z</code>, " ..
++ "<code>0-9</code> and <code>_</code>"
++ ))
++
++newnet.default = m.hidden.mode == "Ad-Hoc" and "mesh" or "wwan"
++newnet.datatype = "uciname"
++
++if has_firewall then
++ fwzone = m:field(Value, "_fwzone",
++ translate("Create / Assign firewall-zone"),
++ translate("Choose the firewall zone you want to assign to this interface. Select <em>unspecified</em> to remove the interface from the associated zone or fill out the <em>create</em> field to define a new zone and attach the interface to it."))
++
++ fwzone.template = "cbi/firewall_zonelist"
++ fwzone.default = m.hidden.mode == "Ad-Hoc" and "mesh" or "wan"
++end
++
++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
++ end
++ end
++
++ local wdev = nw:get_wifidev(m.hidden.device)
++
++ wdev:set("disabled", false)
++ wdev:set("channel", m.hidden.channel)
++
++ if replace:formvalue(section) then
++ local n
++ for _, n in ipairs(wdev:get_wifinets()) do
++ wdev:del_wifinet(n)
++ end
++ end
++
++ local wconf = {
++ device = m.hidden.device,
++ ssid = m.hidden.join,
++ mode = (m.hidden.mode == "Ad-Hoc" and "adhoc" or "sta")
++ }
++
++ if m.hidden.wep == "1" then
++ wconf.encryption = "wep-open"
++ wconf.key = "1"
++ wconf.key1 = key and key:formvalue(section) or ""
++ elseif (tonumber(m.hidden.wpa_version) or 0) > 0 then
++ wconf.encryption = (tonumber(m.hidden.wpa_version) or 0) >= 2 and "psk2" or "psk"
++ wconf.key = key and key:formvalue(section) or ""
++ else
++ wconf.encryption = "none"
++ end
++
++ if wconf.mode == "adhoc" or wconf.mode == "sta" then
++ wconf.bssid = m.hidden.bssid
++ end
++
++ local value = self:formvalue(section)
++ net = nw:add_network(value, { proto = "dhcp" })
++
++ if not net then
++ self.error = { [section] = "missing" }
++ else
++ wconf.network = net:name()
++
++ local wnet = wdev:add_wifinet(wconf)
++ if wnet then
++ if zone then
++ fw:del_network(net:name())
++ zone:add_network(net:name())
++ end
++
++ uci:save("wireless")
++ uci:save("network")
++ uci:save("firewall")
++
++ luci.http.redirect(wnet:adminlink())
++ end
++ end
++end
++
++if has_firewall then
++ function fwzone.cfgvalue(self, section)
++ self.iface = section
++ local z = fw:get_zone_by_network(section)
++ return z and z:name()
++ end
++end
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_status/processes.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_status/processes.lua
+new file mode 100644
+index 0000000..0a6e48f
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_status/processes.lua
+@@ -0,0 +1,34 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++f = SimpleForm("processes", translate("Processes"), translate("This list gives an overview over currently running system processes and their status."))
++f.reset = false
++f.submit = false
++
++t = f:section(Table, luci.sys.process.list())
++t:option(DummyValue, "PID", translate("PID"))
++t:option(DummyValue, "USER", translate("Owner"))
++t:option(DummyValue, "COMMAND", translate("Command"))
++t:option(DummyValue, "%CPU", translate("CPU usage (%)"))
++t:option(DummyValue, "%MEM", translate("Memory usage (%)"))
++
++hup = t:option(Button, "_hup", translate("Hang Up"))
++hup.inputstyle = "reload"
++function hup.write(self, section)
++ null, self.tag_error[section] = luci.sys.process.signal(section, 1)
++end
++
++term = t:option(Button, "_term", translate("Terminate"))
++term.inputstyle = "remove"
++function term.write(self, section)
++ null, self.tag_error[section] = luci.sys.process.signal(section, 15)
++end
++
++kill = t:option(Button, "_kill", translate("Kill"))
++kill.inputstyle = "reset"
++function kill.write(self, section)
++ null, self.tag_error[section] = luci.sys.process.signal(section, 9)
++end
++
++return f
+\ No newline at end of file
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua
+new file mode 100644
+index 0000000..1e47564
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua
+@@ -0,0 +1,119 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++
++m = Map("system", translate("Router Password"),
++ translate("Changes the administrator password for accessing the device"))
++
++s = m:section(TypedSection, "_dummy", "")
++s.addremove = false
++s.anonymous = true
++
++pw1 = s:option(Value, "pw1", translate("Password"))
++pw1.password = true
++
++pw2 = s:option(Value, "pw2", translate("Confirmation"))
++pw2.password = true
++
++function s.cfgsections()
++ return { "_pass" }
++end
++
++function m.on_commit(map)
++ local v1 = pw1:formvalue("_pass")
++ local v2 = pw2:formvalue("_pass")
++
++ if v1 and v2 and #v1 > 0 and #v2 > 0 then
++ if v1 == v2 then
++ if luci.sys.user.setpasswd(luci.dispatcher.context.authuser, v1) == 0 then
++ m.message = translate("Password successfully changed!")
++ else
++ m.message = translate("Unknown Error, password not changed!")
++ end
++ else
++ m.message = translate("Given password confirmation did not match, password not changed!")
++ end
++ end
++end
++
++
++if fs.access("/etc/config/dropbear") then
++
++m2 = Map("dropbear", translate("SSH Access"),
++ translate("Dropbear offers <abbr title=\"Secure Shell\">SSH</abbr> network shell access and an integrated <abbr title=\"Secure Copy\">SCP</abbr> server"))
++
++s = m2:section(TypedSection, "dropbear", translate("Dropbear Instance"))
++s.anonymous = true
++s.addremove = true
++
++
++ni = s:option(Value, "Interface", translate("Interface"),
++ translate("Listen only on the given interface or, if unspecified, on all"))
++
++ni.template = "cbi/network_netlist"
++ni.nocreate = true
++ni.unspecified = true
++
++
++pt = s:option(Value, "Port", translate("Port"),
++ translate("Specifies the listening port of this <em>Dropbear</em> instance"))
++
++pt.datatype = "port"
++pt.default = 22
++
++
++pa = s:option(Flag, "PasswordAuth", translate("Password authentication"),
++ translate("Allow <abbr title=\"Secure Shell\">SSH</abbr> password authentication"))
++
++pa.enabled = "on"
++pa.disabled = "off"
++pa.default = pa.enabled
++pa.rmempty = false
++
++
++ra = s:option(Flag, "RootPasswordAuth", translate("Allow root logins with password"),
++ translate("Allow the <em>root</em> user to login with password"))
++
++ra.enabled = "on"
++ra.disabled = "off"
++ra.default = ra.enabled
++
++
++gp = s:option(Flag, "GatewayPorts", translate("Gateway ports"),
++ translate("Allow remote hosts to connect to local SSH forwarded ports"))
++
++gp.enabled = "on"
++gp.disabled = "off"
++gp.default = gp.disabled
++
++
++s2 = m2:section(TypedSection, "_dummy", translate("SSH-Keys"),
++ translate("Here you can paste public SSH-Keys (one per line) for SSH public-key authentication."))
++s2.addremove = false
++s2.anonymous = true
++s2.template = "cbi/tblsection"
++
++function s2.cfgsections()
++ return { "_keys" }
++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
++end
++
++end
++
++return m, m2
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/backupfiles.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/backupfiles.lua
+new file mode 100644
+index 0000000..ee2401e
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/backupfiles.lua
+@@ -0,0 +1,80 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++if luci.http.formvalue("cbid.luci.1._list") then
++ luci.http.redirect(luci.dispatcher.build_url("admin/system/flashops/backupfiles") .. "?display=list")
++elseif luci.http.formvalue("cbid.luci.1._edit") then
++ luci.http.redirect(luci.dispatcher.build_url("admin/system/flashops/backupfiles") .. "?display=edit")
++ return
++end
++
++m = SimpleForm("luci", translate("Backup file list"))
++m:append(Template("admin_system/backupfiles"))
++
++if luci.http.formvalue("display") ~= "list" then
++ f = m:section(SimpleSection, nil, translate("This is a list of shell glob patterns for matching files and directories to include during sysupgrade. Modified files in /etc/config/ and certain other configurations are automatically preserved."))
++
++ l = f:option(Button, "_list", translate("Show current backup file list"))
++ l.inputtitle = translate("Open list...")
++ l.inputstyle = "apply"
++
++ c = f:option(TextValue, "_custom")
++ c.rmempty = false
++ c.cols = 70
++ c.rows = 30
++
++ c.cfgvalue = function(self, section)
++ return nixio.fs.readfile("/etc/sysupgrade.conf")
++ end
++
++ c.write = function(self, section, value)
++ value = value:gsub("\r\n?", "\n")
++ return nixio.fs.writefile("/etc/sysupgrade.conf", value)
++ end
++else
++ m.submit = false
++ m.reset = false
++
++ f = m:section(SimpleSection, nil, translate("Below is the determined list of files to backup. It consists of changed configuration files marked by opkg, essential base files and the user defined backup patterns."))
++
++ l = f:option(Button, "_edit", translate("Back to configuration"))
++ l.inputtitle = translate("Close list...")
++ l.inputstyle = "link"
++
++
++ d = f:option(DummyValue, "_detected")
++ d.rawhtml = true
++ d.cfgvalue = function(s)
++ local list = io.popen(
++ "( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' /etc/sysupgrade.conf " ..
++ "/lib/upgrade/keep.d/* 2>/dev/null) -type f 2>/dev/null; " ..
++ "opkg list-changed-conffiles ) | sort -u"
++ )
++
++ if list then
++ local files = { "<ul>" }
++
++ while true do
++ local ln = list:read("*l")
++ if not ln then
++ break
++ else
++ files[#files+1] = "<li>"
++ files[#files+1] = luci.util.pcdata(ln)
++ files[#files+1] = "</li>"
++ end
++ end
++
++ list:close()
++ files[#files+1] = "</ul>"
++
++ return table.concat(files, "")
++ end
++
++ return "<em>" .. translate("No files found") .. "</em>"
++ end
++
++end
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/buttons.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/buttons.lua
+new file mode 100644
+index 0000000..6a81d71
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/buttons.lua
+@@ -0,0 +1,27 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("system", translate("Buttons"),
++ translate("This page allows the configuration of custom button actions"))
++
++s = m:section(TypedSection, "button", "")
++s.anonymous = true
++s.addremove = true
++
++s:option(Value, "button", translate("Name"))
++
++act = s:option(ListValue, "action",
++ translate("Action"),
++ translate("Specifies the button state to handle"))
++
++act:value("released")
++
++s:option(Value, "handler",
++ translate("Handler"),
++ translate("Path to executable which handles the button event"))
++
++min = s:option(Value, "min", translate("Minimum hold time"))
++min.rmempty = true
++
++max = s:option(Value, "max", translate("Maximum hold time"))
++max.rmempty = true
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/crontab.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/crontab.lua
+new file mode 100644
+index 0000000..bef9651
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/crontab.lua
+@@ -0,0 +1,27 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008-2013 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local cronfile = "/etc/crontabs/root"
++
++f = SimpleForm("crontab", translate("Scheduled Tasks"), translate("This is the system crontab in which scheduled tasks can be defined."))
++
++t = f:field(TextValue, "crons")
++t.rmempty = true
++t.rows = 10
++function t.cfgvalue()
++ return fs.readfile(cronfile) or ""
++end
++
++function f.handle(self, state, data)
++ if state == FORM_VALID then
++ if data.crons then
++ fs.writefile(cronfile, data.crons:gsub("\r\n", "\n"))
++ luci.sys.call("/usr/bin/crontab %q" % cronfile)
++ end
++ end
++ return true
++end
++
++return f
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua
+new file mode 100644
+index 0000000..d4e834d
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua
+@@ -0,0 +1,201 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.tools.webadmin")
++
++local fs = require "nixio.fs"
++local util = require "nixio.util"
++local tp = require "luci.template.parser"
++
++local block = io.popen("block info", "r")
++local ln, dev, devices = nil, nil, {}
++
++repeat
++ ln = block:read("*l")
++ dev = ln and ln:match("^/dev/(.-):")
++
++ if dev then
++ local e, s, key, val = { }
++
++ for key, val in ln:gmatch([[(%w+)="(.-)"]]) do
++ e[key:lower()] = val
++ devices[val] = e
++ end
++
++ s = tonumber((fs.readfile("/sys/class/block/%s/size" % dev)))
++
++ e.dev = "/dev/%s" % dev
++ e.size = s and math.floor(s / 2048)
++
++ devices[e.dev] = e
++ end
++until not ln
++
++block:close()
++
++
++m = Map("fstab", translate("Mount Points"))
++
++local mounts = luci.sys.mounts()
++
++v = m:section(Table, mounts, translate("Mounted file systems"))
++
++fs = v:option(DummyValue, "fs", translate("Filesystem"))
++
++mp = v:option(DummyValue, "mountpoint", translate("Mount Point"))
++
++avail = v:option(DummyValue, "avail", translate("Available"))
++function avail.cfgvalue(self, section)
++ return luci.tools.webadmin.byte_format(
++ ( tonumber(mounts[section].available) or 0 ) * 1024
++ ) .. " / " .. luci.tools.webadmin.byte_format(
++ ( tonumber(mounts[section].blocks) or 0 ) * 1024
++ )
++end
++
++used = v:option(DummyValue, "used", translate("Used"))
++function used.cfgvalue(self, section)
++ return ( mounts[section].percent or "0%" ) .. " (" ..
++ luci.tools.webadmin.byte_format(
++ ( tonumber(mounts[section].used) or 0 ) * 1024
++ ) .. ")"
++end
++
++
++
++mount = m:section(TypedSection, "mount", translate("Mount Points"), translate("Mount Points define at which point a memory device will be attached to the filesystem"))
++mount.anonymous = true
++mount.addremove = true
++mount.template = "cbi/tblsection"
++mount.extedit = luci.dispatcher.build_url("admin/system/fstab/mount/%s")
++
++mount.create = function(...)
++ local sid = TypedSection.create(...)
++ if sid then
++ luci.http.redirect(mount.extedit % sid)
++ return
++ end
++end
++
++
++mount:option(Flag, "enabled", translate("Enabled")).rmempty = false
++
++dev = mount:option(DummyValue, "device", translate("Device"))
++dev.rawhtml = true
++dev.cfgvalue = function(self, section)
++ local v, e
++
++ v = m.uci:get("fstab", section, "uuid")
++ e = v and devices[v:lower()]
++ if v and e and e.size then
++ return "UUID: %s (%s, %d MB)" %{ tp.pcdata(v), e.dev, e.size }
++ elseif v and e then
++ return "UUID: %s (%s)" %{ tp.pcdata(v), e.dev }
++ elseif v then
++ return "UUID: %s (<em>%s</em>)" %{ tp.pcdata(v), translate("not present") }
++ end
++
++ v = m.uci:get("fstab", section, "label")
++ e = v and devices[v]
++ if v and e and e.size then
++ return "Label: %s (%s, %d MB)" %{ tp.pcdata(v), e.dev, e.size }
++ elseif v and e then
++ return "Label: %s (%s)" %{ tp.pcdata(v), e.dev }
++ elseif v then
++ return "Label: %s (<em>%s</em>)" %{ tp.pcdata(v), translate("not present") }
++ end
++
++ v = Value.cfgvalue(self, section) or "?"
++ e = v and devices[v]
++ if v and e and e.size then
++ return "%s (%d MB)" %{ tp.pcdata(v), e.size }
++ elseif v and e then
++ return tp.pcdata(v)
++ elseif v then
++ return "%s (<em>%s</em>)" %{ tp.pcdata(v), translate("not present") }
++ end
++end
++
++mp = mount:option(DummyValue, "target", translate("Mount Point"))
++mp.cfgvalue = function(self, section)
++ if m.uci:get("fstab", section, "is_rootfs") == "1" then
++ return "/overlay"
++ else
++ return Value.cfgvalue(self, section) or "?"
++ end
++end
++
++fs = mount:option(DummyValue, "fstype", translate("Filesystem"))
++fs.cfgvalue = function(self, section)
++ local v, e
++
++ v = m.uci:get("fstab", section, "uuid")
++ v = v and v:lower() or m.uci:get("fstab", section, "label")
++ v = v or m.uci:get("fstab", section, "device")
++
++ e = v and devices[v]
++
++ return e and e.type or m.uci:get("fstab", section, "fstype") or "?"
++end
++
++op = mount:option(DummyValue, "options", translate("Options"))
++op.cfgvalue = function(self, section)
++ return Value.cfgvalue(self, section) or "defaults"
++end
++
++rf = mount:option(DummyValue, "is_rootfs", translate("Root"))
++rf.cfgvalue = function(self, section)
++ local target = m.uci:get("fstab", section, "target")
++ if target == "/" then
++ return translate("yes")
++ elseif target == "/overlay" then
++ return translate("overlay")
++ else
++ return translate("no")
++ end
++end
++
++ck = mount:option(DummyValue, "enabled_fsck", translate("Check"))
++ck.cfgvalue = function(self, section)
++ return Value.cfgvalue(self, section) == "1"
++ and translate("yes") or translate("no")
++end
++
++
++swap = m:section(TypedSection, "swap", "SWAP", translate("If your physical memory is insufficient unused data can be temporarily swapped to a swap-device resulting in a higher amount of usable <abbr title=\"Random Access Memory\">RAM</abbr>. Be aware that swapping data is a very slow process as the swap-device cannot be accessed with the high datarates of the <abbr title=\"Random Access Memory\">RAM</abbr>."))
++swap.anonymous = true
++swap.addremove = true
++swap.template = "cbi/tblsection"
++swap.extedit = luci.dispatcher.build_url("admin/system/fstab/swap/%s")
++
++swap.create = function(...)
++ local sid = TypedSection.create(...)
++ if sid then
++ luci.http.redirect(swap.extedit % sid)
++ return
++ end
++end
++
++
++swap:option(Flag, "enabled", translate("Enabled")).rmempty = false
++
++dev = swap:option(DummyValue, "device", translate("Device"))
++dev.cfgvalue = function(self, section)
++ local v
++
++ v = m.uci:get("fstab", section, "uuid")
++ if v then return "UUID: %s" % v end
++
++ v = m.uci:get("fstab", section, "label")
++ if v then return "Label: %s" % v end
++
++ v = Value.cfgvalue(self, section) or "?"
++ e = v and devices[v]
++ if v and e and e.size then
++ return "%s (%s MB)" % {v, e.size}
++ else
++ return v
++ end
++end
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua
+new file mode 100644
+index 0000000..2652e00
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua
+@@ -0,0 +1,149 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local util = require "nixio.util"
++
++local has_fscheck = fs.access("/usr/sbin/e2fsck")
++
++local block = io.popen("block info", "r")
++local ln, dev, devices = nil, nil, {}
++
++repeat
++ ln = block:read("*l")
++ dev = ln and ln:match("^/dev/(.-):")
++
++ if dev then
++ local e, s, key, val = { }
++
++ for key, val in ln:gmatch([[(%w+)="(.-)"]]) do
++ e[key:lower()] = val
++ end
++
++ s = tonumber((fs.readfile("/sys/class/block/%s/size" % dev)))
++
++ e.dev = "/dev/%s" % dev
++ e.size = s and math.floor(s / 2048)
++
++ devices[#devices+1] = e
++ end
++until not ln
++
++block:close()
++
++
++m = Map("fstab", translate("Mount Points - Mount Entry"))
++m.redirect = luci.dispatcher.build_url("admin/system/fstab")
++
++if not arg[1] or m.uci:get("fstab", arg[1]) ~= "mount" then
++ luci.http.redirect(m.redirect)
++ return
++end
++
++
++
++mount = m:section(NamedSection, arg[1], "mount", translate("Mount Entry"))
++mount.anonymous = true
++mount.addremove = false
++
++mount:tab("general", translate("General Settings"))
++mount:tab("advanced", translate("Advanced Settings"))
++
++
++mount:taboption("general", Flag, "enabled", translate("Enable this mount")).rmempty = false
++
++
++o = mount:taboption("general", Value, "uuid", translate("UUID"),
++ translate("If specified, mount the device by its UUID instead of a fixed device node"))
++
++for i, d in ipairs(devices) do
++ if d.uuid and d.size then
++ o:value(d.uuid, "%s (%s, %d MB)" %{ d.uuid, d.dev, d.size })
++ elseif d.uuid then
++ o:value(d.uuid, "%s (%s)" %{ d.uuid, d.dev })
++ end
++end
++
++o:value("", translate("-- match by label --"))
++
++
++o = mount:taboption("general", Value, "label", translate("Label"),
++ translate("If specified, mount the device by the partition label instead of a fixed device node"))
++
++o:depends("uuid", "")
++
++for i, d in ipairs(devices) do
++ if d.label and d.size then
++ o:value(d.label, "%s (%s, %d MB)" %{ d.label, d.dev, d.size })
++ elseif d.label then
++ o:value(d.label, "%s (%s)" %{ d.label, d.dev })
++ end
++end
++
++o:value("", translate("-- match by device --"))
++
++
++o = mount:taboption("general", Value, "device", translate("Device"),
++ translate("The device file of the memory or partition (<abbr title=\"for example\">e.g.</abbr> <code>/dev/sda1</code>)"))
++
++o:depends({ uuid = "", label = "" })
++
++for i, d in ipairs(devices) do
++ if d.size then
++ o:value(d.dev, "%s (%d MB)" %{ d.dev, d.size })
++ else
++ o:value(d.dev)
++ end
++end
++
++
++o = mount:taboption("general", Value, "target", translate("Mount point"),
++ translate("Specifies the directory the device is attached to"))
++
++o:value("/", translate("Use as root filesystem (/)"))
++o:value("/overlay", translate("Use as external overlay (/overlay)"))
++
++
++o = mount:taboption("general", DummyValue, "__notice", translate("Root preparation"))
++o:depends("target", "/")
++o.rawhtml = true
++o.default = [[
++<p>%s</p><pre>mkdir -p /tmp/introot
++mkdir -p /tmp/extroot
++mount --bind / /tmp/introot
++mount /dev/sda1 /tmp/extroot
++tar -C /tmp/intproot -cvf - . | tar -C /tmp/extroot -xf -
++umount /tmp/introot
++umount /tmp/extroot</pre>
++]] %{
++ translate("Make sure to clone the root filesystem using something like the commands below:"),
++
++}
++
++
++o = mount:taboption("advanced", Value, "fstype", translate("Filesystem"),
++ translate("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>)"))
++
++o:value("", "auto")
++
++local fs
++for fs in io.lines("/proc/filesystems") do
++ fs = fs:match("%S+")
++ if fs ~= "nodev" then
++ o:value(fs)
++ end
++end
++
++
++o = mount:taboption("advanced", Value, "options", translate("Mount options"),
++ translate("See \"mount\" manpage for details"))
++
++o.placeholder = "defaults"
++
++
++if has_fscheck then
++ o = mount:taboption("advanced", Flag, "enabled_fsck", translate("Run filesystem check"),
++ translate("Run a filesystem check before mounting the device"))
++end
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/swap.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/swap.lua
+new file mode 100644
+index 0000000..82468d5
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/swap.lua
+@@ -0,0 +1,54 @@
++-- Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local util = require "nixio.util"
++
++local devices = {}
++util.consume((fs.glob("/dev/sd*")), devices)
++util.consume((fs.glob("/dev/hd*")), devices)
++util.consume((fs.glob("/dev/scd*")), devices)
++util.consume((fs.glob("/dev/mmc*")), devices)
++
++local size = {}
++for i, dev in ipairs(devices) do
++ local s = tonumber((fs.readfile("/sys/class/block/%s/size" % dev:sub(6))))
++ size[dev] = s and math.floor(s / 2048)
++end
++
++
++m = Map("fstab", translate("Mount Points - Swap Entry"))
++m.redirect = luci.dispatcher.build_url("admin/system/fstab")
++
++if not arg[1] or m.uci:get("fstab", arg[1]) ~= "swap" then
++ luci.http.redirect(m.redirect)
++ return
++end
++
++
++mount = m:section(NamedSection, arg[1], "swap", translate("Swap Entry"))
++mount.anonymous = true
++mount.addremove = false
++
++mount:tab("general", translate("General Settings"))
++mount:tab("advanced", translate("Advanced Settings"))
++
++
++mount:taboption("general", Flag, "enabled", translate("Enable this swap")).rmempty = false
++
++
++o = mount:taboption("general", Value, "device", translate("Device"),
++ translate("The device file of the memory or partition (<abbr title=\"for example\">e.g.</abbr> <code>/dev/sda1</code>)"))
++
++for i, d in ipairs(devices) do
++ o:value(d, size[d] and "%s (%s MB)" % {d, size[d]})
++end
++
++o = mount:taboption("advanced", Value, "uuid", translate("UUID"),
++ translate("If specified, mount the device by its UUID instead of a fixed device node"))
++
++o = mount:taboption("advanced", Value, "label", translate("Label"),
++ translate("If specified, mount the device by the partition label instead of a fixed device node"))
++
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/ipkg.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/ipkg.lua
+new file mode 100644
+index 0000000..7c6d7e1
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/ipkg.lua
+@@ -0,0 +1,64 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local ipkgfile = "/etc/opkg.conf"
++local distfeeds = "/etc/opkg/distfeeds.conf"
++local customfeeds = "/etc/opkg/customfeeds.conf"
++
++f = SimpleForm("ipkgconf", translate("OPKG-Configuration"), translate("General options for opkg"))
++
++f:append(Template("admin_system/ipkg"))
++
++t = f:field(TextValue, "lines")
++t.wrap = "off"
++t.rows = 10
++function t.cfgvalue()
++ return nixio.fs.readfile(ipkgfile) or ""
++end
++
++function t.write(self, section, data)
++ return nixio.fs.writefile(ipkgfile, data:gsub("\r\n", "\n"))
++end
++
++function f.handle(self, state, data)
++ return true
++end
++
++g = SimpleForm("distfeedconf", translate("Distribution feeds"),
++ translate("Build/distribution specific feed definitions. This file will NOT be preserved in any sysupgrade."))
++
++d = g:field(TextValue, "lines2")
++d.wrap = "off"
++d.rows = 10
++function d.cfgvalue()
++ return nixio.fs.readfile(distfeeds) or ""
++end
++
++function d.write(self, section, data)
++ return nixio.fs.writefile(distfeeds, data:gsub("\r\n", "\n"))
++end
++
++function g.handle(self, state, data)
++ return true
++end
++
++h = SimpleForm("customfeedconf", translate("Custom feeds"),
++ translate("Custom feed definitions, e.g. private feeds. This file can be preserved in a sysupgrade."))
++
++c = h:field(TextValue, "lines3")
++c.wrap = "off"
++c.rows = 10
++function c.cfgvalue()
++ return nixio.fs.readfile(customfeeds) or ""
++end
++
++function c.write(self, section, data)
++ return nixio.fs.writefile(customfeeds, data:gsub("\r\n", "\n"))
++end
++
++function h.handle(self, state, data)
++ return true
++end
++
++return f, g, h
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/leds.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/leds.lua
+new file mode 100644
+index 0000000..8d9bcb1
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/leds.lua
+@@ -0,0 +1,119 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("system", translate("<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"), translate("Customizes the behaviour of the device <abbr title=\"Light Emitting Diode\">LED</abbr>s if possible."))
++
++local sysfs_path = "/sys/class/leds/"
++local leds = {}
++
++local fs = require "nixio.fs"
++local util = require "nixio.util"
++
++if fs.access(sysfs_path) then
++ leds = util.consume((fs.dir(sysfs_path)))
++end
++
++if #leds == 0 then
++ return m
++end
++
++
++s = m:section(TypedSection, "led", "")
++s.anonymous = true
++s.addremove = true
++
++function s.parse(self, ...)
++ TypedSection.parse(self, ...)
++ os.execute("/etc/init.d/led enable")
++end
++
++
++s:option(Value, "name", translate("Name"))
++
++
++sysfs = s:option(ListValue, "sysfs", translate("<abbr title=\"Light Emitting Diode\">LED</abbr> Name"))
++for k, v in ipairs(leds) do
++ sysfs:value(v)
++end
++
++s:option(Flag, "default", translate("Default state")).rmempty = false
++
++
++trigger = s:option(ListValue, "trigger", translate("Trigger"))
++
++local triggers = fs.readfile(sysfs_path .. leds[1] .. "/trigger")
++for t in triggers:gmatch("[%w-]+") do
++ trigger:value(t, translate(t:gsub("-", "")))
++end
++
++
++delayon = s:option(Value, "delayon", translate ("On-State Delay"))
++delayon:depends("trigger", "timer")
++
++delayoff = s:option(Value, "delayoff", translate ("Off-State Delay"))
++delayoff:depends("trigger", "timer")
++
++
++dev = s:option(ListValue, "_net_dev", translate("Device"))
++dev.rmempty = true
++dev:value("")
++dev:depends("trigger", "netdev")
++
++function dev.cfgvalue(self, section)
++ return m.uci:get("system", section, "dev")
++end
++
++function dev.write(self, section, value)
++ m.uci:set("system", section, "dev", value)
++end
++
++function dev.remove(self, section)
++ local t = trigger:formvalue(section)
++ if t ~= "netdev" and t ~= "usbdev" then
++ m.uci:delete("system", section, "dev")
++ end
++end
++
++for k, v in pairs(luci.sys.net.devices()) do
++ if v ~= "lo" then
++ dev:value(v)
++ end
++end
++
++
++mode = s:option(MultiValue, "mode", translate("Trigger Mode"))
++mode.rmempty = true
++mode:depends("trigger", "netdev")
++mode:value("link", translate("Link On"))
++mode:value("tx", translate("Transmit"))
++mode:value("rx", translate("Receive"))
++
++
++usbdev = s:option(ListValue, "_usb_dev", translate("USB Device"))
++usbdev:depends("trigger", "usbdev")
++usbdev.rmempty = true
++usbdev:value("")
++
++function usbdev.cfgvalue(self, section)
++ return m.uci:get("system", section, "dev")
++end
++
++function usbdev.write(self, section, value)
++ m.uci:set("system", section, "dev", value)
++end
++
++function usbdev.remove(self, section)
++ local t = trigger:formvalue(section)
++ if t ~= "netdev" and t ~= "usbdev" then
++ m.uci:delete("system", section, "dev")
++ end
++end
++
++for p in nixio.fs.glob("/sys/bus/usb/devices/[0-9]*/manufacturer") do
++ local id = p:match("%d+-%d+")
++ local mf = nixio.fs.readfile("/sys/bus/usb/devices/" .. id .. "/manufacturer") or "?"
++ local pr = nixio.fs.readfile("/sys/bus/usb/devices/" .. id .. "/product") or "?"
++ usbdev:value(id, "%s (%s - %s)" %{ id, mf, pr })
++end
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/startup.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/startup.lua
+new file mode 100644
+index 0000000..9e19ac5
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/startup.lua
+@@ -0,0 +1,97 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2010-2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2010 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local sys = require "luci.sys"
++
++local inits = { }
++
++for _, name in ipairs(sys.init.names()) do
++ local index = sys.init.index(name)
++ local enabled = sys.init.enabled(name)
++
++ if index < 255 then
++ inits["%02i.%s" % { index, name }] = {
++ name = name,
++ index = tostring(index),
++ enabled = enabled
++ }
++ end
++end
++
++
++m = SimpleForm("initmgr", translate("Initscripts"), translate("You can enable or disable installed init scripts here. Changes will applied after a device reboot.<br /><strong>Warning: If you disable essential init scripts like \"network\", your device might become inaccessible!</strong>"))
++m.reset = false
++m.submit = false
++
++
++s = m:section(Table, inits)
++
++i = s:option(DummyValue, "index", translate("Start priority"))
++n = s:option(DummyValue, "name", translate("Initscript"))
++
++
++e = s:option(Button, "endisable", translate("Enable/Disable"))
++
++e.render = function(self, section, scope)
++ if inits[section].enabled then
++ self.title = translate("Enabled")
++ self.inputstyle = "save"
++ else
++ self.title = translate("Disabled")
++ self.inputstyle = "reset"
++ end
++
++ Button.render(self, section, scope)
++end
++
++e.write = function(self, section)
++ if inits[section].enabled then
++ inits[section].enabled = false
++ return sys.init.disable(inits[section].name)
++ else
++ inits[section].enabled = true
++ return sys.init.enable(inits[section].name)
++ end
++end
++
++
++start = s:option(Button, "start", translate("Start"))
++start.inputstyle = "apply"
++start.write = function(self, section)
++ sys.call("/etc/init.d/%s %s >/dev/null" %{ inits[section].name, self.option })
++end
++
++restart = s:option(Button, "restart", translate("Restart"))
++restart.inputstyle = "reload"
++restart.write = start.write
++
++stop = s:option(Button, "stop", translate("Stop"))
++stop.inputstyle = "remove"
++stop.write = start.write
++
++
++
++f = SimpleForm("rc", translate("Local Startup"),
++ translate("This is the content of /etc/rc.local. Insert your own commands here (in front of 'exit 0') to execute them at the end of the boot process."))
++
++t = f:field(TextValue, "rcs")
++t.rmempty = true
++t.rows = 20
++
++function t.cfgvalue()
++ return fs.readfile("/etc/rc.local") or ""
++end
++
++function f.handle(self, state, data)
++ if state == FORM_VALID then
++ if data.rcs then
++ fs.writefile("/etc/rc.local", data.rcs:gsub("\r\n", "\n"))
++ end
++ end
++ return true
++end
++
++return m, f
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/system.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/system.lua
+new file mode 100644
+index 0000000..94ba805
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/system.lua
+@@ -0,0 +1,216 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local sys = require "luci.sys"
++local zones = require "luci.sys.zoneinfo"
++local fs = require "nixio.fs"
++local conf = require "luci.config"
++
++local m, s, o
++local has_ntpd = fs.access("/usr/sbin/ntpd")
++
++m = Map("system", translate("System"), translate("Here you can configure the basic aspects of your device like its hostname or the timezone."))
++m:chain("luci")
++
++
++s = m:section(TypedSection, "system", translate("System Properties"))
++s.anonymous = true
++s.addremove = false
++
++s:tab("general", translate("General Settings"))
++s:tab("logging", translate("Logging"))
++s:tab("language", translate("Language and Style"))
++
++
++--
++-- System Properties
++--
++
++o = s:taboption("general", DummyValue, "_systime", translate("Local Time"))
++o.template = "admin_system/clock_status"
++
++
++o = s:taboption("general", Value, "hostname", translate("Hostname"))
++o.datatype = "hostname"
++
++function o.write(self, section, value)
++ Value.write(self, section, value)
++ sys.hostname(value)
++end
++
++
++o = s:taboption("general", ListValue, "zonename", translate("Timezone"))
++o:value("UTC")
++
++for i, zone in ipairs(zones.TZ) do
++ o:value(zone[1])
++end
++
++function o.write(self, section, value)
++ local function lookup_zone(title)
++ for _, zone in ipairs(zones.TZ) do
++ if zone[1] == title then return zone[2] end
++ end
++ end
++
++ AbstractValue.write(self, section, value)
++ local timezone = lookup_zone(value) or "GMT0"
++ self.map.uci:set("system", section, "timezone", timezone)
++ fs.writefile("/etc/TZ", timezone .. "\n")
++end
++
++
++--
++-- Logging
++--
++
++o = s:taboption("logging", Value, "log_size", translate("System log buffer size"), "kiB")
++o.optional = true
++o.placeholder = 16
++o.datatype = "uinteger"
++
++o = s:taboption("logging", Value, "log_ip", translate("External system log server"))
++o.optional = true
++o.placeholder = "0.0.0.0"
++o.datatype = "ip4addr"
++
++o = s:taboption("logging", Value, "log_port", translate("External system log server port"))
++o.optional = true
++o.placeholder = 514
++o.datatype = "port"
++
++o = s:taboption("logging", ListValue, "conloglevel", translate("Log output level"))
++o:value(8, translate("Debug"))
++o:value(7, translate("Info"))
++o:value(6, translate("Notice"))
++o:value(5, translate("Warning"))
++o:value(4, translate("Error"))
++o:value(3, translate("Critical"))
++o:value(2, translate("Alert"))
++o:value(1, translate("Emergency"))
++
++o = s:taboption("logging", ListValue, "cronloglevel", translate("Cron Log Level"))
++o.default = 8
++o:value(5, translate("Debug"))
++o:value(8, translate("Normal"))
++o:value(9, translate("Warning"))
++
++
++--
++-- Langauge & Style
++--
++
++o = s:taboption("language", ListValue, "_lang", translate("Language"))
++o:value("auto")
++
++local i18ndir = luci.i18n.i18ndir .. "base."
++for k, v in luci.util.kspairs(conf.languages) do
++ local file = i18ndir .. k:gsub("_", "-")
++ if k:sub(1, 1) ~= "." and fs.access(file .. ".lmo") then
++ o:value(k, v)
++ end
++end
++
++function o.cfgvalue(...)
++ return m.uci:get("luci", "main", "lang")
++end
++
++function o.write(self, section, value)
++ m.uci:set("luci", "main", "lang", value)
++end
++
++
++o = s:taboption("language", ListValue, "_mediaurlbase", translate("Design"))
++for k, v in pairs(conf.themes) do
++ if k:sub(1, 1) ~= "." then
++ o:value(v, k)
++ end
++end
++
++function o.cfgvalue(...)
++ return m.uci:get("luci", "main", "mediaurlbase")
++end
++
++function o.write(self, section, value)
++ m.uci:set("luci", "main", "mediaurlbase", value)
++end
++
++
++--
++-- NTP
++--
++
++if has_ntpd then
++
++ -- timeserver setup was requested, create section and reload page
++ if m:formvalue("cbid.system._timeserver._enable") then
++ m.uci:section("system", "timeserver", "ntp",
++ {
++ server = { "0.openwrt.pool.ntp.org", "1.openwrt.pool.ntp.org", "2.openwrt.pool.ntp.org", "3.openwrt.pool.ntp.org" }
++ }
++ )
++
++ m.uci:save("system")
++ luci.http.redirect(luci.dispatcher.build_url("admin/system", arg[1]))
++ return
++ end
++
++ local has_section = false
++ m.uci:foreach("system", "timeserver",
++ function(s)
++ has_section = true
++ return false
++ end)
++
++ if not has_section then
++
++ s = m:section(TypedSection, "timeserver", translate("Time Synchronization"))
++ s.anonymous = true
++ s.cfgsections = function() return { "_timeserver" } end
++
++ x = s:option(Button, "_enable")
++ x.title = translate("Time Synchronization is not configured yet.")
++ x.inputtitle = translate("Set up Time Synchronization")
++ x.inputstyle = "apply"
++
++ else
++
++ s = m:section(TypedSection, "timeserver", translate("Time Synchronization"))
++ s.anonymous = true
++ s.addremove = false
++
++ o = s:option(Flag, "enable", translate("Enable NTP client"))
++ o.rmempty = false
++
++ function o.cfgvalue(self)
++ return sys.init.enabled("sysntpd")
++ and self.enabled or self.disabled
++ end
++
++ function o.write(self, section, value)
++ if value == self.enabled then
++ sys.init.enable("sysntpd")
++ sys.call("env -i /etc/init.d/sysntpd start >/dev/null")
++ else
++ sys.call("env -i /etc/init.d/sysntpd stop >/dev/null")
++ sys.init.disable("sysntpd")
++ end
++ end
++
++
++ o = s:option(Flag, "enable_server", translate("Provide NTP server"))
++ o:depends("enable", "1")
++
++
++ o = s:option(DynamicList, "server", translate("NTP server candidates"))
++ o.datatype = "host"
++ o:depends("enable", "1")
++
++ -- retain server list even if disabled
++ function o.remove() end
++
++ end
++end
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm
+new file mode 100644
+index 0000000..685082a
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm
+@@ -0,0 +1,111 @@
++<%#
++ Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<%
++local fs = require "nixio.fs"
++local has_ping6 = fs.access("/bin/ping6") or fs.access("/usr/bin/ping6")
++local has_traceroute6 = fs.access("/usr/bin/traceroute6")
++%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ var stxhr = new XHR();
++
++ function update_status(field, proto)
++ {
++ var tool = field.name;
++ var addr = field.value;
++ var protocol = proto ? "6" : "";
++
++ var legend = document.getElementById('diag-rc-legend');
++ var output = document.getElementById('diag-rc-output');
++
++ if (legend && output)
++ {
++ output.innerHTML =
++ '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' +
++ '<%:Waiting for command to complete...%>'
++ ;
++
++ legend.parentNode.style.display = 'block';
++ legend.style.display = 'inline';
++
++ stxhr.post('<%=url('admin/network')%>/diag_' + tool + protocol + '/' + addr, { token: '<%=token%>' },
++ function(x)
++ {
++ if (x.responseText)
++ {
++ legend.style.display = 'none';
++ output.innerHTML = String.format('<pre>%h</pre>', x.responseText);
++ }
++ else
++ {
++ legend.style.display = 'none';
++ output.innerHTML = '<span class="error"><%:Bad address specified!%></span>';
++ }
++ }
++ );
++ }
++ }
++//]]></script>
++
++<form method="post" action="<%=url('admin/network/diagnostics')%>">
++ <div class="cbi-map">
++ <h2 name="content"><%:Diagnostics%></h2>
++
++ <fieldset class="cbi-section">
++ <legend><%:Network Utilities%></legend>
++
++ <br />
++
++ <div style="width:30%; float:left">
++ <input style="margin: 5px 0" type="text" value="dev.openwrt.org" 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 style="width:33%; float:left">
++ <input style="margin: 5px 0" type="text" value="dev.openwrt.org" 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="dev.openwrt.org" 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>
++
++ <fieldset class="cbi-section" style="display:none">
++ <legend id="diag-rc-legend"><%:Collecting data...%></legend>
++ <span id="diag-rc-output"></span>
++ </fieldset>
++</form>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm
+new file mode 100644
+index 0000000..9a77f89
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm
+@@ -0,0 +1,261 @@
++<%#
++ Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%-
++ local ntm = require "luci.model.network".init()
++ local fwm = require "luci.model.firewall".init()
++
++ local net
++ local ifaces = { }
++ local netlist = { }
++ for _, net in ipairs(ntm:get_networks()) do
++ if net:name() ~= "loopback" then
++ local z = fwm:get_zone_by_network(net:name())
++ ifaces[#ifaces+1] = net:name()
++ netlist[#netlist+1] = {
++ net:name(), z and z:name() or "-", z
++ }
++ end
++ end
++
++ table.sort(netlist,
++ function(a, b)
++ if a[2] ~= b[2] then
++ return a[2] < b[2]
++ else
++ return a[1] < b[1]
++ end
++ end)
++-%>
++
++<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)))
++ return;
++
++ var d = document.getElementById(id + '-ifc-description');
++ if (d)
++ d.innerHTML = reconnect
++ ? '<em><%:Interface is reconnecting...%></em>'
++ : '<em><%:Interface is shutting down...%></em>';
++
++ var s = document.getElementById('ifc-rc-status');
++ if (s)
++ {
++ s.parentNode.style.display = 'block';
++ s.innerHTML = '<%:Waiting for changes to be applied...%>';
++ }
++
++ (new XHR()).post('<%=url('admin/network')%>/iface_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, { token: '<%=token%>' },
++ function(x)
++ {
++ if (s)
++ {
++ s.innerHTML = reconnect
++ ? '<%:Interface reconnected%>'
++ : '<%:Interface shut down%>';
++
++ window.setTimeout(function() {
++ s.parentNode.style.display = 'none';
++ }, 1000);
++ }
++ }
++ );
++ }
++
++ 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.%>'))
++ return;
++
++ (new XHR()).post('<%=url('admin/network/iface_delete')%>/' + id, { token: '<%=token%>' },
++ function(x) {
++ location.href = '<%=url('admin/network/network')%>';
++ }
++ );
++ }
++
++ var iwxhr = new XHR();
++ var wifidevs = <%=luci.http.write_json(netdevs)%>;
++ var arptable = <%=luci.http.write_json(arpcache)%>;
++
++ XHR.poll(5, '<%=url('admin/network/iface_status', table.concat(ifaces, ","))%>', null,
++ function(x, ifcs)
++ {
++ if (ifcs)
++ {
++ for (var idx = 0; idx < ifcs.length; idx++)
++ {
++ var ifc = ifcs[idx];
++ var html = '';
++
++ var s = document.getElementById(ifc.id + '-ifc-devices');
++ if (s)
++ {
++ var stat = String.format(
++ '<img src="<%=resource%>/icons/%s%s.png" style="width:16px; height:16px; vertical-align:middle" />',
++ ifc.type,
++ ifc.is_up ? '' : '_disabled'
++ );
++
++ if (ifc.subdevices && ifc.subdevices.length)
++ {
++ stat += ' <strong>(';
++
++ for (var j = 0; j < ifc.subdevices.length; j++)
++ {
++ var sif = ifc.subdevices[j];
++
++ stat += String.format(
++ '<img src="<%=resource%>/icons/%s%s.png" style="width:16px; height:16px; vertical-align:middle" title="%h" />',
++ sif.type,
++ sif.is_up ? '' : '_disabled',
++ sif.name
++ );
++ }
++
++ stat += ')</strong>';
++ }
++
++ stat += String.format(
++ '<br /><small>%h</small>',
++ ifc.name
++ );
++
++ s.innerHTML = stat;
++ }
++
++ var d = document.getElementById(ifc.id + '-ifc-description');
++ if (d && ifc.proto && ifc.ifname)
++ {
++ if (ifc.is_up)
++ {
++ html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime);
++ }
++
++ if (ifc.type != 'tunnel')
++ {
++ html += String.format('<strong><%:MAC-Address%>:</strong> %s<br />', ifc.macaddr);
++ }
++
++ html += String.format(
++ '<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
++ );
++
++ if (ifc.ipaddrs && ifc.ipaddrs.length)
++ {
++ html += '<strong><%:IPv4%>: </strong>';
++
++ for (var i = 0; i < ifc.ipaddrs.length; i++)
++ html += String.format(
++ '%s%s/%d',
++ i ? ', ' : '',
++ ifc.ipaddrs[i].addr,
++ ifc.ipaddrs[i].prefix
++ );
++
++ html += '<br />';
++ }
++
++ if (ifc.ip6addrs && ifc.ip6addrs.length)
++ {
++ html += '<strong><%:IPv6%>: </strong>';
++
++ for (var i = 0; i < ifc.ip6addrs.length; i++)
++ html += String.format(
++ '%s%s/%d',
++ i ? ', ' : '',
++ ifc.ip6addrs[i].addr.toUpperCase(),
++ ifc.ip6addrs[i].prefix
++ );
++
++ html += '<br />';
++ }
++
++ d.innerHTML = html;
++ }
++ else if (d && !ifc.proto)
++ {
++ var e = document.getElementById(ifc.id + '-ifc-edit');
++ if (e)
++ e.disabled = true;
++
++ d.innerHTML = String.format(
++ '<em><%:Unsupported protocol type.%></em><br />' +
++ '<a href="%h"><%:Install protocol extensions...%></a>',
++ '<%=url("admin/system/packages")%>?query=luci-proto&display=available'
++ );
++ }
++ else if (d && !ifc.ifname)
++ {
++ d.innerHTML = String.format(
++ '<em><%:Network without interfaces.%></em><br />' +
++ '<a href="<%=url("admin/network/network/%s")%>?tab.network.%s=physical"><%:Assign interfaces...%></a>',
++ ifc.name, ifc.name
++ );
++ }
++ else if (d)
++ {
++ d.innerHTML = '<em><%:Interface not present or not connected yet.%></em>';
++ }
++ }
++ }
++ }
++ );
++//]]></script>
++
++<fieldset class="cbi-section" style="display:none">
++ <legend><%:Reconnecting interface%></legend>
++ <img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
++ <span id="ifc-rc-status"><%:Waiting for changes to be applied...%></span>
++</fieldset>
++
++<div class="cbi-map">
++ <fieldset 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>
++ </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="submit" class="cbi-button cbi-button-remove" style="width:100px" onclick="iface_delete('<%=net[1]%>')" value="<%:Delete%>" />
++ </td>
++ </tr>
++ <% end %>
++ </table>
++
++ <input type="button" class="cbi-button cbi-button-add" value="<%:Add new interface...%>" onclick="location.href='<%=url("admin/network/iface_add")%>'" />
++ </fieldset>
++</div>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm
+new file mode 100644
+index 0000000..1ebdbfc
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm
+@@ -0,0 +1,94 @@
++<%+cbi/valueheader%>
++
++<script type="text/javascript">//<![CDATA[
++ XHR.poll(5, '<%=url('admin/network/iface_status', self.network)%>', null,
++ function(x, ifc)
++ {
++ if (ifc && (ifc = ifc[0]))
++ {
++ var html = '';
++
++ 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.is_up)
++ {
++ html += String.format('<strong><%:Uptime%>:</strong> %t<br />', ifc.uptime);
++ }
++
++ if (ifc.type != 'tunnel')
++ {
++ html += String.format('<strong><%:MAC-Address%>:</strong> %s<br />', ifc.macaddr);
++ }
++
++ html += String.format(
++ '<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
++ );
++
++ if (ifc.ipaddrs && ifc.ipaddrs.length)
++ {
++ html += '<strong><%:IPv4%>: </strong>';
++
++ for (var i = 0; i < ifc.ipaddrs.length; i++)
++ html += String.format(
++ '%s%s/%d',
++ i ? ', ' : '',
++ ifc.ipaddrs[i].addr,
++ ifc.ipaddrs[i].prefix
++ );
++
++ html += '<br />';
++ }
++
++ if (ifc.ip6addrs && ifc.ip6addrs.length)
++ {
++ html += '<strong><%:IPv6%>: </strong>';
++
++ for (var i = 0; i < ifc.ip6addrs.length; i++)
++ html += String.format(
++ '%s%s/%d',
++ i ? ', ' : '',
++ ifc.ip6addrs[i].addr.toUpperCase(),
++ ifc.ip6addrs[i].prefix
++ );
++
++ html += '<br />';
++ }
++
++ d.innerHTML = html;
++ }
++ else if (d)
++ {
++ d.innerHTML = '<em><%:Interface not present or not connected yet.%></em>';
++ }
++ }
++ }
++ );
++//]]></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>
++
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm
+new file mode 100644
+index 0000000..ab8e732
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm
+@@ -0,0 +1,118 @@
++<script type="text/javascript">//<![CDATA[
++ 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);
++
++ for( var i = 0; i < st[0].length; i++ )
++ {
++ var timestr;
++
++ if (st[0][i].expires <= 0)
++ {
++ timestr = '<em><%:expired%></em>';
++ }
++ 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;
++ }
++
++ 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>';
++ }
++ }
++
++ var tb6 = document.getElementById('lease6_status_table');
++ if (st && st[1] && tb6)
++ {
++ tb6.parentNode.style.display = 'block';
++
++ /* clear all rows */
++ while( tb6.rows.length > 1 )
++ tb6.deleteRow(1);
++
++ for( var i = 0; i < st[1].length; i++ )
++ {
++ var timestr;
++
++ if (st[1][i].expires <= 0)
++ {
++ timestr = '<em><%:expired%></em>';
++ }
++ 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);
++
++ tr.insertCell(-1).innerHTML = st[1][i].hostname ? st[1][i].hostname : '?';
++ tr.insertCell(-1).innerHTML = st[1][i].ip6addr;
++ tr.insertCell(-1).innerHTML = st[1][i].duid;
++ tr.insertCell(-1).innerHTML = 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>';
++ }
++ }
++ }
++ );
++//]]></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"><%:Hostname%></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>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm
+new file mode 100644
+index 0000000..53c35ae
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm
+@@ -0,0 +1,41 @@
++<script type="text/javascript">//<![CDATA[
++ var switches = [ '<%=table.concat(self.switches, "', '")%>' ];
++ 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]);
++
++ if (th0 && ports && ports.length)
++ {
++ if (!th0.innerHTML)
++ th0.innerHTML = '<%:Port status:%>';
++
++ for (var j = 0; j < ports.length; j++)
++ {
++ var th = th0.parentNode.parentNode.childNodes[j+1];
++
++ if (ports[j].link)
++ {
++ th.innerHTML = String.format(
++ '<small><img src="<%=resource%>/icons/port_up.png" />' +
++ '<br />%d<%:baseT%><br />%s</small>',
++ ports[j].speed, ports[j].duplex
++ ? '<%:full-duplex%>' : '<%:half-duplex%>'
++ );
++ }
++ else
++ {
++ th.innerHTML = String.format(
++ '<small><img src="<%=resource%>/icons/port_down.png" />' +
++ '<br /><%:no link%></small>'
++ );
++ }
++ }
++ }
++ }
++ }
++ );
++//]]></script>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm
+new file mode 100644
+index 0000000..3533c6f
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm
+@@ -0,0 +1,149 @@
++<%#
++ Copyright 2009-2015 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%-
++
++ local sys = require "luci.sys"
++ local utl = require "luci.util"
++
++ function guess_wifi_signal(info)
++ local scale = (100 / (info.quality_max or 100) * (info.quality or 0))
++ local icon
++
++ if not info.bssid or info.bssid == "00:00:00:00:00:00" then
++ icon = resource .. "/icons/signal-none.png"
++ elseif scale < 15 then
++ icon = resource .. "/icons/signal-0.png"
++ elseif scale < 35 then
++ icon = resource .. "/icons/signal-0-25.png"
++ elseif scale < 55 then
++ icon = resource .. "/icons/signal-25-50.png"
++ elseif scale < 75 then
++ icon = resource .. "/icons/signal-50-75.png"
++ else
++ icon = resource .. "/icons/signal-75-100.png"
++ end
++
++ return icon
++ end
++
++ function percent_wifi_signal(info)
++ local qc = info.quality or 0
++ local qm = info.quality_max or 0
++
++ if info.bssid and qc > 0 and qm > 0 then
++ return math.floor((100 / qm) * qc)
++ else
++ return 0
++ end
++ end
++
++ function format_wifi_encryption(info)
++ if info.wep == true then
++ return "WEP"
++ elseif info.wpa > 0 then
++ return translatef("<abbr title='Pairwise: %s / Group: %s'>%s - %s</abbr>",
++ table.concat(info.pair_ciphers, ", "),
++ table.concat(info.group_ciphers, ", "),
++ (info.wpa == 3) and translate("mixed WPA/WPA2")
++ or (info.wpa == 2 and "WPA2" or "WPA"),
++ table.concat(info.auth_suites, ", ")
++ )
++ elseif info.enabled then
++ return "<em>%s</em>" % translate("unknown")
++ else
++ return "<em>%s</em>" % translate("open")
++ end
++ end
++
++ local dev = luci.http.formvalue("device")
++ local iw = luci.sys.wifi.getiwinfo(dev)
++
++ if not iw then
++ luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless"))
++ return
++ end
++
++
++ function scanlist(times)
++ local i, k, v
++ local l = { }
++ local s = { }
++
++ for i = 1, times do
++ for k, v in ipairs(iw.scanlist or { }) do
++ if not s[v.bssid] then
++ l[#l+1] = v
++ s[v.bssid] = true
++ end
++ end
++ end
++
++ return l
++ end
++-%>
++
++<%+header%>
++
++<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">
++ <!-- 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">
++ <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">
++ <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="join" value="<%=utl.pcdata(net.ssid)%>" />
++ <input type="hidden" name="mode" value="<%=net.mode%>" />
++ <input type="hidden" name="bssid" value="<%=net.bssid%>" />
++ <input type="hidden" name="channel" value="<%=net.channel%>" />
++ <input type="hidden" name="wep" value="<%=net.encryption.wep and 1 or 0%>" />
++ <% if net.encryption.wpa then %>
++ <input type="hidden" name="wpa_version" value="<%=net.encryption.wpa%>" />
++ <% for _, v in ipairs(net.encryption.auth_suites) do %><input type="hidden" name="wpa_suites" value="<%=v%>" />
++ <% end; for _, v in ipairs(net.encryption.group_ciphers) do %><input type="hidden" name="wpa_group" value="<%=v%>" />
++ <% end; for _, v in ipairs(net.encryption.pair_ciphers) do %><input type="hidden" name="wpa_pairwise" value="<%=v%>" />
++ <% end; end %>
++
++ <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%>" />
++ </form>
++ </td>
++ </tr>
++ <% end %>
++ <!-- /scan list -->
++ </table>
++ </fieldset>
++</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%>" />
++ </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%>" />
++ </form>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm
+new file mode 100644
+index 0000000..f82d06d
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm
+@@ -0,0 +1,455 @@
++<%#
++ Copyright 2008-2009 Steven Barth <steven@midlink.org>
++ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%-
++
++ local ip = require "luci.ip"
++ local fs = require "nixio.fs"
++ local utl = require "luci.util"
++ local uci = require "luci.model.uci".cursor()
++ local ntm = require "luci.model.network"
++
++ local has_iwinfo = pcall(require, "iwinfo")
++
++ ntm.init(uci)
++
++ function guess_wifi_hw(dev)
++ local bands = ""
++ local ifname = dev:name()
++ local name, idx = ifname:match("^([a-z]+)(%d+)")
++ idx = tonumber(idx)
++
++ if has_iwinfo then
++ local bl = dev.iwinfo.hwmodelist
++ if bl and next(bl) then
++ if bl.a then bands = bands .. "a" end
++ if bl.b then bands = bands .. "b" end
++ if bl.g then bands = bands .. "g" end
++ if bl.n then bands = bands .. "n" end
++ if bl.ac then bands = bands .. "ac" end
++ end
++
++ local hw = dev.iwinfo.hardware_name
++ if hw then
++ return "%s 802.11%s" %{ hw, bands }
++ end
++ end
++
++ -- wl.o
++ if name == "wl" then
++ local name = translatef("Broadcom 802.11%s Wireless Controller", bands)
++ local nm = 0
++
++ local fd = nixio.open("/proc/bus/pci/devices", "r")
++ if fd then
++ local ln
++ for ln in fd:linesource() do
++ if ln:match("wl$") then
++ if nm == idx then
++ local version = ln:match("^%S+%s+%S%S%S%S([0-9a-f]+)")
++ name = translatef(
++ "Broadcom BCM%04x 802.11 Wireless Controller",
++ tonumber(version, 16)
++ )
++
++ break
++ else
++ nm = nm + 1
++ end
++ end
++ end
++ fd:close()
++ end
++
++ return name
++
++ -- madwifi
++ elseif name == "ath" or name == "wifi" then
++ return translatef("Atheros 802.11%s Wireless Controller", bands)
++
++ -- ralink
++ elseif name == "ra" then
++ return translatef("RaLink 802.11%s Wireless Controller", bands)
++
++ -- hermes
++ elseif name == "eth" then
++ return translate("Hermes 802.11b Wireless Controller")
++
++ -- hostap
++ elseif name == "wlan" and fs.stat("/proc/net/hostap/" .. ifname, "type") == "dir" then
++ return translate("Prism2/2.5/3 802.11b Wireless Controller")
++
++ -- dunno yet
++ else
++ return translatef("Generic 802.11%s Wireless Controller", bands)
++ end
++ end
++
++ local devices = ntm:get_wifidevs()
++ local arpcache = { }
++ ip.neighbors({ family = 4 }, function(n)
++ if n.mac and n.dest then arpcache[n.mac:upper()] = n.dest:string() end
++ end)
++
++ local netlist = { }
++ local netdevs = { }
++
++ local dev
++ for _, dev in ipairs(devices) do
++ local net
++ for _, net in ipairs(dev:get_wifinets()) do
++ netlist[#netlist+1] = net:id()
++ netdevs[net:id()] = dev:name()
++ end
++ end
++-%>
++
++<%+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>
++<% end %>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ var wifidevs = <%=luci.http.write_json(netdevs)%>;
++ var arptable = <%=luci.http.write_json(arpcache)%>;
++
++ var is_reconnecting = false;
++
++ function nowrap(s) {
++ return s.replace(/ /g, '&#160;');
++ }
++
++ 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.%>')))
++ return;
++
++ is_reconnecting = true;
++
++ var s = document.getElementById('iw-rc-status');
++ if (s)
++ {
++ s.parentNode.style.display = 'block';
++ s.innerHTML = '<%:Waiting for changes to be applied...%>';
++ }
++
++ for (var net in wifidevs)
++ {
++ var st = document.getElementById(net + '-iw-status');
++ if (st)
++ st.innerHTML = '<em><%:Wireless is restarting...%></em>';
++ }
++
++ (new XHR()).post('<%=url('admin/network')%>/wireless_' + (reconnect ? 'reconnect' : 'shutdown') + '/' + id, { token: '<%=token%>' },
++ function(x)
++ {
++ if (s)
++ {
++ s.innerHTML = reconnect
++ ? '<%:Wireless restarted%>'
++ : '<%:Wireless shut down%>';
++
++ window.setTimeout(function() {
++ s.parentNode.style.display = 'none';
++ is_reconnecting = false;
++ }, 1000);
++ }
++ }
++ );
++ }
++
++ 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.%>'))
++ return;
++
++ (new XHR()).post('<%=url('admin/network/wireless_delete')%>/' + id, { token: '<%=token%>' },
++ function(x) {
++ location.href = '<%=url('admin/network/wireless')%>';
++ }
++ );
++ }
++
++ XHR.poll(5, '<%=url('admin/network/wireless_status', table.concat(netlist, ","))%>', null,
++ function(x, st)
++ {
++ 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;
++
++ 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 icon;
++ if (q < 0)
++ icon = "<%=resource%>/icons/signal-none.png";
++ else if (q == 0)
++ icon = "<%=resource%>/icons/signal-0.png";
++ else if (q < 25)
++ icon = "<%=resource%>/icons/signal-0-25.png";
++ else if (q < 50)
++ icon = "<%=resource%>/icons/signal-25-50.png";
++ else if (q < 75)
++ icon = "<%=resource%>/icons/signal-50-75.png";
++ 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(
++ '<img src="%s" title="<%:Signal%>: %d <%:dBm%> / <%:Noise%>: %d <%:dBm%>" /><br />' +
++ '<small>%d%%</small>', icon, iw.signal, iw.noise, p
++ );
++
++ var toggle = document.getElementById(iw.id + '-iw-toggle');
++ if (toggle)
++ {
++ if (!iw.disabled)
++ {
++ toggle.className = 'cbi-button cbi-button-reset';
++ toggle.value = '<%:Disable%>';
++ toggle.title = '<%:Shutdown this network%>';
++ }
++ else
++ {
++ toggle.className = 'cbi-button cbi-button-reload';
++ toggle.value = '<%:Enable%>';
++ toggle.title = '<%:Activate this network%>';
++ }
++
++ toggle.setAttribute('active', !iw.disabled);
++ }
++
++ var info = document.getElementById(iw.id + '-iw-status');
++ if (info)
++ {
++ if (is_assoc)
++ info.innerHTML = String.format(
++ '<strong><%:SSID%>:</strong> %h | ' +
++ '<strong><%:Mode%>:</strong> %s<br />' +
++ '<strong><%:BSSID%>:</strong> %s | ' +
++ '<strong><%:Encryption%>:</strong> %s',
++ iw.ssid, iw.mode, iw.bssid,
++ iw.encryption ? iw.encryption : '<%:None%>'
++ );
++ else
++ info.innerHTML = String.format(
++ '<strong><%:SSID%>:</strong> %h | ' +
++ '<strong><%:Mode%>:</strong> %s<br />' +
++ '<em>%s</em>',
++ iw.ssid || '?', iw.mode,
++ is_reconnecting
++ ? '<em><%:Wireless is restarting...%></em>'
++ : '<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(
++ '<img src="%s" title="<%:Signal%>: %d <%:dBm%> / <%:Noise%>: %d <%:dBm%>" />',
++ icon, assoclist[j].signal, assoclist[j].noise
++ );
++
++ tr.insertCell(-1).innerHTML = nowrap(String.format('%h', iw.ssid ? iw.ssid : '?'));
++ tr.insertCell(-1).innerHTML = assoclist[j].bssid;
++
++ tr.insertCell(-1).innerHTML = arptable[assoclist[j].bssid]
++ ? arptable[assoclist[j].bssid] : '?';
++
++ tr.insertCell(-1).innerHTML = nowrap(String.format('%d <%:dBm%>', assoclist[j].signal));
++ tr.insertCell(-1).innerHTML = nowrap(String.format('%d <%:dBm%>', assoclist[j].noise));
++
++ tr.insertCell(-1).innerHTML = nowrap((assoclist[j].rx_mcs > -1)
++ ? String.format('%.1f <%:Mbit/s%>, MCS %d, %d<%:MHz%>', assoclist[j].rx_rate / 1000, assoclist[j].rx_mcs, assoclist[j].rx_40mhz ? 40 : 20)
++ : String.format('%.1f <%:Mbit/s%>', assoclist[j].rx_rate / 1000)
++ );
++
++ tr.insertCell(-1).innerHTML = nowrap((assoclist[j].tx_mcs > -1)
++ ? String.format('%.1f <%:Mbit/s%>, MCS %d, %d<%:MHz%>', assoclist[j].tx_rate / 1000, assoclist[j].tx_mcs, assoclist[j].tx_40mhz ? 40 : 20)
++ : String.format('%.1f <%:Mbit/s%>', assoclist[j].tx_rate / 1000)
++ );
++
++ 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)
++ {
++ var img = document.getElementById(dev + '-iw-upstate');
++ if (img)
++ img.src = '<%=resource%>/icons/wifi_big' + (devup[dev] ? '' : '_disabled') + '.png';
++ }
++ }
++ }
++ );
++//]]></script>
++
++<h2 name="content"><%:Wireless Overview%></h2>
++
++<fieldset 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 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">
++ <!-- 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 />
++ <span id="<%=dev:name()%>-iw-devinfo"></span>
++ </td>
++ <td style="width:310px;text-align:right">
++ <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%>" />
++ </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%>" />
++ </form>
++ </td>
++ </tr>
++ <!-- /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="width:16px; padding:3px" id="<%=net:id()%>-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="<%=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:ifname()%>')" title="<%:Delete this network%>" value="<%:Remove%>" />
++ </td>
++ </tr>
++ <% 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">
++ <em><%:No network configured on this device%></em>
++ </td>
++ </tr>
++ <% end %>
++ <!-- /network list -->
++ </table>
++ </fieldset>
++ <!-- /device <%=dev:name()%> -->
++ <% end %>
++
++
++ <h2><%:Associated Stations%></h2>
++
++ <fieldset class="cbi-section">
++ <table class="cbi-section-table" 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"><%:IPv4-Address%></th>
++ <th class="cbi-section-table-cell"><%:Signal%></th>
++ <th class="cbi-section-table-cell"><%:Noise%></th>
++ <th class="cbi-section-table-cell"><%:RX Rate%></th>
++ <th class="cbi-section-table-cell"><%:TX Rate%></th>
++ </tr>
++ <tr class="cbi-section-table-row cbi-rowstyle-2">
++ <td class="cbi-value-field" colspan="8">
++ <em><%:Collecting data...%></em>
++ </td>
++ </tr>
++ </table>
++ </fieldset>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm
+new file mode 100644
+index 0000000..04687f3
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm
+@@ -0,0 +1,78 @@
++<%+cbi/valueheader%>
++
++<script type="text/javascript">//<![CDATA[
++ XHR.poll(5, '<%=url('admin/network/wireless_status', self.ifname)%>', null,
++ function(x, iw)
++ {
++ if (iw && (iw = iw[0]))
++ {
++ var is_assoc = (iw.bssid && iw.bssid != '00:00:00:00:00:00' && iw.channel && !iw.disabled);
++ var p = iw.quality;
++ var q = is_assoc ? p : -1;
++
++ var icon;
++ if (q < 0)
++ icon = "<%=resource%>/icons/signal-none.png";
++ else if (q == 0)
++ icon = "<%=resource%>/icons/signal-0.png";
++ else if (q < 25)
++ icon = "<%=resource%>/icons/signal-0-25.png";
++ else if (q < 50)
++ icon = "<%=resource%>/icons/signal-25-50.png";
++ else if (q < 75)
++ icon = "<%=resource%>/icons/signal-50-75.png";
++ else
++ icon = "<%=resource%>/icons/signal-75-100.png";
++
++ var s = document.getElementById('<%=self.option%>-iw-signal');
++ if (s)
++ s.innerHTML = String.format(
++ '<img src="%s" title="<%:Signal%>: %d <%:dBm%> / <%:Noise%>: %d <%:dBm%>" /><br />' +
++ '<small>%d%%</small>', icon, iw.signal, iw.noise, p
++ );
++
++ var d = document.getElementById('<%=self.option%>-iw-description');
++ if (d && is_assoc)
++ d.innerHTML = String.format(
++ '<strong><%:Mode%>:</strong> %s | ' +
++ '<strong><%:SSID%>:</strong> %h<br />' +
++ '<strong><%:BSSID%>:</strong> %s | ' +
++ '<strong><%:Encryption%>:</strong> %s<br />' +
++ '<strong><%:Channel%>:</strong> %d (%.3f <%:GHz%>) | ' +
++ '<strong><%:Tx-Power%>:</strong> %d <%:dBm%><br />' +
++ '<strong><%:Signal%>:</strong> %d <%:dBm%> | ' +
++ '<strong><%:Noise%>:</strong> %d <%:dBm%><br />' +
++ '<strong><%:Bitrate%>:</strong> %.1f <%:Mbit/s%> | ' +
++ '<strong><%:Country%>:</strong> %s',
++ iw.mode, iw.ssid, iw.bssid,
++ iw.encryption ? iw.encryption : '<%:None%>',
++ iw.channel, iw.frequency ? iw.frequency : 0,
++ iw.txpower, iw.signal, iw.noise,
++ iw.bitrate ? iw.bitrate : 0, iw.country
++ );
++ else if (d)
++ d.innerHTML = String.format(
++ '<strong><%:SSID%>:</strong> %h | ' +
++ '<strong><%:Mode%>:</strong> %s<br />' +
++ '<em><%:Wireless is disabled or not associated%></em>',
++ iw.ssid || '?', iw.mode
++ );
++ }
++ }
++ );
++//]]></script>
++
++<table>
++ <tr class="cbi-section-table">
++ <td></td>
++ <td class="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">
++ <em><%:Collecting data...%></em>
++ </td>
++ </tr>
++</table>
++
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm
+new file mode 100644
+index 0000000..04da3c1
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm
+@@ -0,0 +1,302 @@
++<%#
++ Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%-
++ local ntm = require "luci.model.network".init()
++
++ local dev
++ local devices = { }
++ for _, dev in luci.util.vspairs(luci.sys.net.devices()) do
++ if dev ~= "lo" and not ntm:ignore_interface(dev) then
++ devices[#devices+1] = dev
++ end
++ end
++
++ local curdev = luci.dispatcher.context.requestpath
++ curdev = curdev[#curdev] ~= "bandwidth" and curdev[#curdev] or devices[1]
++-%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ var bwxhr = new XHR();
++
++ var G;
++ var TIME = 0;
++ var RXB = 1;
++ var RXP = 2;
++ var TXB = 3;
++ var TXP = 4;
++
++ var width = 760;
++ var height = 300;
++ var step = 5;
++
++ var data_wanted = Math.floor(width / step);
++ var data_fill = 0;
++ var data_stamp = 0;
++
++ var data_rx = [ ];
++ var data_tx = [ ];
++
++ var line_rx;
++ var line_tx;
++
++ var label_25;
++ var label_50;
++ var label_75;
++
++ var label_rx_cur;
++ var label_rx_avg;
++ var label_rx_peak;
++
++ var label_tx_cur;
++ var label_tx_avg;
++ var label_tx_peak;
++
++ var label_scale;
++
++
++ function bandwidth_label(bytes, br)
++ {
++ var uby = '<%:kB/s%>';
++ var kby = (bytes / 1024);
++
++ if (kby >= 1024)
++ {
++ uby = '<%:MB/s%>';
++ kby = kby / 1024;
++ }
++
++ var ubi = '<%:kbit/s%>';
++ var kbi = (bytes * 8 / 1024);
++
++ if (kbi >= 1024)
++ {
++ ubi = '<%:Mbit/s%>';
++ kbi = kbi / 1024;
++ }
++
++ return String.format("%f %s%s(%f %s)",
++ kbi.toFixed(2), ubi,
++ br ? '<br />' : ' ',
++ kby.toFixed(2), uby
++ );
++ }
++
++ /* wait for SVG */
++ window.setTimeout(
++ function() {
++ var svg = document.getElementById('bwsvg');
++
++ try {
++ G = svg.getSVGDocument
++ ? svg.getSVGDocument() : svg.contentDocument;
++ }
++ catch(e) {
++ G = document.embeds['bwsvg'].getSVGDocument();
++ }
++
++ if (!G)
++ {
++ window.setTimeout(arguments.callee, 1000);
++ }
++ else
++ {
++ /* find sizes */
++ width = svg.offsetWidth - 2;
++ height = svg.offsetHeight - 2;
++ data_wanted = Math.ceil(width / step);
++
++ /* prefill datasets */
++ for (var i = 0; i < data_wanted; i++)
++ {
++ data_rx[i] = 0;
++ data_tx[i] = 0;
++ }
++
++ /* find svg elements */
++ line_rx = G.getElementById('rx');
++ line_tx = G.getElementById('tx');
++
++ label_25 = G.getElementById('label_25');
++ label_50 = G.getElementById('label_50');
++ label_75 = G.getElementById('label_75');
++
++ label_rx_cur = document.getElementById('rx_bw_cur');
++ label_rx_avg = document.getElementById('rx_bw_avg');
++ label_rx_peak = document.getElementById('rx_bw_peak');
++
++ label_tx_cur = document.getElementById('tx_bw_cur');
++ label_tx_avg = document.getElementById('tx_bw_avg');
++ label_tx_peak = document.getElementById('tx_bw_peak');
++
++ label_scale = document.getElementById('scale');
++
++
++ /* plot horizontal time interval lines */
++ for (var i = width % (step * 60); i < width; i += step * 60)
++ {
++ var line = G.createElementNS('http://www.w3.org/2000/svg', 'line');
++ line.setAttribute('x1', i);
++ line.setAttribute('y1', 0);
++ line.setAttribute('x2', i);
++ line.setAttribute('y2', '100%');
++ line.setAttribute('style', 'stroke:black;stroke-width:0.1');
++
++ var text = G.createElementNS('http://www.w3.org/2000/svg', 'text');
++ text.setAttribute('x', i + 5);
++ text.setAttribute('y', 15);
++ text.setAttribute('style', 'fill:#999999; font-size:9pt');
++ text.appendChild(G.createTextNode(Math.round((width - i) / step / 60) + 'm'));
++
++ label_25.parentNode.appendChild(line);
++ label_25.parentNode.appendChild(text);
++ }
++
++ label_scale.innerHTML = String.format('<%:(%d minute window, %d second interval)%>', data_wanted / 60, 3);
++
++ /* render datasets, start update interval */
++ XHR.poll(3, '<%=build_url("admin/status/realtime/bandwidth_status", curdev)%>', null,
++ function(x, data)
++ {
++ var data_max = 0;
++ var data_scale = 0;
++
++ var data_rx_avg = 0;
++ var data_tx_avg = 0;
++
++ var data_rx_peak = 0;
++ var data_tx_peak = 0;
++
++ for (var i = data_stamp ? 0 : 1; i < data.length; i++)
++ {
++ /* skip overlapping entries */
++ if (data[i][TIME] <= data_stamp)
++ continue;
++
++ /* normalize difference against time interval */
++ if (i > 0)
++ {
++ var time_delta = data[i][TIME] - data[i-1][TIME];
++ if (time_delta)
++ {
++ data_rx.push((data[i][RXB] - data[i-1][RXB]) / time_delta);
++ data_tx.push((data[i][TXB] - data[i-1][TXB]) / time_delta);
++ }
++ }
++ }
++
++ /* cut off outdated entries */
++ data_rx = data_rx.slice(data_rx.length - data_wanted, data_rx.length);
++ data_tx = data_tx.slice(data_tx.length - data_wanted, data_tx.length);
++
++ /* find peak */
++ for (var i = 0; i < data_rx.length; i++)
++ {
++ data_max = Math.max(data_max, data_rx[i]);
++ data_max = Math.max(data_max, data_tx[i]);
++
++ 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];
++ }
++ }
++
++ /* remember current timestamp, calculate horizontal scale */
++ data_stamp = data[data.length-1][TIME];
++ data_scale = height / (data_max * 1.1);
++
++
++ /* plot data */
++ var pt_rx = '0,' + height;
++ var pt_tx = '0,' + height;
++
++ var y_rx = 0;
++ var y_tx = 0;
++
++ for (var i = 0; i < data_rx.length; i++)
++ {
++ var x = i * step;
++
++ y_rx = height - Math.floor(data_rx[i] * data_scale);
++ y_tx = height - Math.floor(data_tx[i] * data_scale);
++
++ pt_rx += ' ' + x + ',' + y_rx;
++ pt_tx += ' ' + x + ',' + y_tx;
++ }
++
++ pt_rx += ' ' + width + ',' + y_rx + ' ' + width + ',' + height;
++ pt_tx += ' ' + width + ',' + y_tx + ' ' + width + ',' + height;
++
++
++ line_rx.setAttribute('points', pt_rx);
++ line_tx.setAttribute('points', pt_tx);
++
++ label_25.firstChild.data = bandwidth_label(1.1 * 0.25 * data_max);
++ label_50.firstChild.data = bandwidth_label(1.1 * 0.50 * data_max);
++ label_75.firstChild.data = bandwidth_label(1.1 * 0.75 * data_max);
++
++ label_rx_cur.innerHTML = bandwidth_label(data_rx[data_rx.length-1], true);
++ label_tx_cur.innerHTML = bandwidth_label(data_tx[data_tx.length-1], true);
++
++ label_rx_avg.innerHTML = bandwidth_label(data_rx_avg, true);
++ label_tx_avg.innerHTML = bandwidth_label(data_tx_avg, true);
++
++ label_rx_peak.innerHTML = bandwidth_label(data_rx_peak, true);
++ label_tx_peak.innerHTML = bandwidth_label(data_tx_peak, true);
++ }
++ );
++ }
++ }, 1000
++ );
++//]]></script>
++
++<h2 name="content"><%:Realtime Traffic%></h2>
++
++<ul class="cbi-tabmenu">
++ <% for _, dev in ipairs(devices) do %>
++ <li class="cbi-tab<%= dev == curdev and "" or "-disabled" %>"><a href="<%=pcdata(dev)%>"><%=pcdata(dev)%></a></li>
++ <% end %>
++</ul>
++
++<embed id="bwsvg" style="width:100%; height:300px; border:1px solid #000000; background-color:#FFFFFF" src="<%=resource%>/bandwidth.svg" />
++<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>
++
++ <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>
++
++ <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>
++
++ <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>
++
++ <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>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm
+new file mode 100644
+index 0000000..0b2e52e
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm
+@@ -0,0 +1,375 @@
++<%#
++ Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ var bwxhr = new XHR();
++
++ var G;
++ var TIME = 0;
++ var UDP = 1;
++ var TCP = 2;
++ var OTHER = 3;
++
++ var width = 760;
++ var height = 300;
++ var step = 5;
++
++ var data_wanted = Math.floor(width / step);
++ var data_fill = 0;
++ var data_stamp = 0;
++
++ var data_udp = [ ];
++ var data_tcp = [ ];
++ var data_otr = [ ];
++
++ var line_udp;
++ var line_tcp;
++
++ var label_25;
++ var label_50;
++ var label_75;
++
++ var label_udp_cur;
++ var label_udp_avg;
++ var label_udp_peak;
++
++ var label_tcp_cur;
++ var label_tcp_avg;
++ var label_tcp_peak;
++
++ var label_otr_cur;
++ var label_otr_avg;
++ var label_otr_peak;
++
++ var label_scale;
++
++ var conn_table;
++
++ var dns_cache = { };
++
++
++ /* wait for SVG */
++ window.setTimeout(
++ function() {
++ var svg = document.getElementById('bwsvg');
++
++ try {
++ G = svg.getSVGDocument
++ ? svg.getSVGDocument() : svg.contentDocument;
++ }
++ catch(e) {
++ G = document.embeds['bwsvg'].getSVGDocument();
++ }
++
++ if (!G)
++ {
++ window.setTimeout(arguments.callee, 1000);
++ }
++ else
++ {
++ /* find sizes */
++ width = svg.offsetWidth - 2;
++ height = svg.offsetHeight - 2;
++ data_wanted = Math.ceil(width / step);
++
++ /* prefill datasets */
++ for (var i = 0; i < data_wanted; i++)
++ {
++ data_udp[i] = 0;
++ data_tcp[i] = 0;
++ data_otr[i] = 0;
++ }
++
++ /* find svg elements */
++ line_udp = G.getElementById('udp');
++ line_tcp = G.getElementById('tcp');
++ line_otr = G.getElementById('other');
++
++ label_25 = G.getElementById('label_25');
++ label_50 = G.getElementById('label_50');
++ label_75 = G.getElementById('label_75');
++
++ label_udp_cur = document.getElementById('lb_udp_cur');
++ label_udp_avg = document.getElementById('lb_udp_avg');
++ label_udp_peak = document.getElementById('lb_udp_peak');
++
++ label_tcp_cur = document.getElementById('lb_tcp_cur');
++ label_tcp_avg = document.getElementById('lb_tcp_avg');
++ label_tcp_peak = document.getElementById('lb_tcp_peak');
++
++ label_otr_cur = document.getElementById('lb_otr_cur');
++ label_otr_avg = document.getElementById('lb_otr_avg');
++ label_otr_peak = document.getElementById('lb_otr_peak');
++
++ label_scale = document.getElementById('scale');
++
++ conn_table = document.getElementById('connections');
++
++
++ /* plot horizontal time interval lines */
++ for (var i = width % (step * 60); i < width; i += step * 60)
++ {
++ var line = G.createElementNS('http://www.w3.org/2000/svg', 'line');
++ line.setAttribute('x1', i);
++ line.setAttribute('y1', 0);
++ line.setAttribute('x2', i);
++ line.setAttribute('y2', '100%');
++ line.setAttribute('style', 'stroke:black;stroke-width:0.1');
++
++ var text = G.createElementNS('http://www.w3.org/2000/svg', 'text');
++ text.setAttribute('x', i + 5);
++ text.setAttribute('y', 15);
++ text.setAttribute('style', 'fill:#999999; font-size:9pt');
++ text.appendChild(G.createTextNode(Math.round((width - i) / step / 60) + 'm'));
++
++ label_25.parentNode.appendChild(line);
++ label_25.parentNode.appendChild(text);
++ }
++
++ label_scale.innerHTML = String.format('<%:(%d minute window, %d second interval)%>', data_wanted / 60, 3);
++
++ /* render datasets, start update interval */
++ XHR.poll(3, '<%=build_url("admin/status/realtime/connections_status")%>', null,
++ function(x, json)
++ {
++ var conn = json.connections;
++
++ while (conn_table.rows.length > 1)
++ conn_table.rows[0].parentNode.deleteRow(-1);
++
++
++ var lookup_queue = [ ];
++
++ conn.sort(function(a, b) {
++ return b.bytes - a.bytes;
++ });
++
++ for (var i = 0; i < conn.length; i++)
++ {
++ var c = conn[i];
++
++ if (c.src == '127.0.0.1' && c.dst == '127.0.0.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);
++
++ if (!dns_cache[c.dst])
++ lookup_queue.push(c.dst);
++
++ 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);
++ }
++
++ if (lookup_queue.length > 0)
++ XHR.get('<%=build_url("admin/status/nameinfo")%>/' + lookup_queue.slice(0, 100).join('/'), null,
++ function(x, json)
++ {
++ for (var addr in json)
++ dns_cache[addr] = json[addr];
++ }
++ );
++
++
++ var data = json.statistics;
++
++ var data_max = 0;
++ var data_scale = 0;
++
++ var data_udp_avg = 0;
++ var data_tcp_avg = 0;
++ var data_otr_avg = 0;
++
++ var data_udp_peak = 0;
++ var data_tcp_peak = 0;
++ var data_otr_peak = 0;
++
++ for (var i = data_stamp ? 0 : 1; i < data.length; i++)
++ {
++ /* skip overlapping entries */
++ if (data[i][TIME] <= data_stamp)
++ continue;
++
++ data_udp.push(data[i][UDP]);
++ data_tcp.push(data[i][TCP]);
++ data_otr.push(data[i][OTHER]);
++ }
++
++ /* cut off outdated entries */
++ data_udp = data_udp.slice(data_udp.length - data_wanted, data_udp.length);
++ data_tcp = data_tcp.slice(data_tcp.length - data_wanted, data_tcp.length);
++ data_otr = data_otr.slice(data_otr.length - data_wanted, data_otr.length);
++
++ /* find peak */
++ for (var i = 0; i < data_udp.length; i++)
++ {
++ data_max = Math.max(data_max, data_udp[i]);
++ data_max = Math.max(data_max, data_tcp[i]);
++ data_max = Math.max(data_max, data_otr[i]);
++
++ data_udp_peak = Math.max(data_udp_peak, data_udp[i]);
++ data_tcp_peak = Math.max(data_tcp_peak, data_tcp[i]);
++ data_otr_peak = Math.max(data_otr_peak, data_otr[i]);
++
++ if (i > 0)
++ {
++ data_udp_avg = (data_udp_avg + data_udp[i]) / 2;
++ data_tcp_avg = (data_tcp_avg + data_tcp[i]) / 2;
++ data_otr_avg = (data_otr_avg + data_otr[i]) / 2;
++ }
++ else
++ {
++ data_udp_avg = data_udp[i];
++ data_tcp_avg = data_tcp[i];
++ data_otr_avg = data_otr[i];
++ }
++ }
++
++ /* remember current timestamp, calculate horizontal scale */
++ data_stamp = data[data.length-1][TIME];
++ data_scale = height / (data_max * 1.1);
++
++
++ /* plot data */
++ var pt_udp = '0,' + height;
++ var pt_tcp = '0,' + height;
++ var pt_otr = '0,' + height;
++
++ var y_udp = 0;
++ var y_tcp = 0;
++ var y_otr = 0;
++
++ for (var i = 0; i < data_udp.length; i++)
++ {
++ var x = i * step;
++
++ y_udp = height - Math.floor(data_udp[i] * data_scale);
++ y_tcp = height - Math.floor(data_tcp[i] * data_scale);
++ y_otr = height - Math.floor(data_otr[i] * data_scale);
++
++ pt_udp += ' ' + x + ',' + y_udp;
++ pt_tcp += ' ' + x + ',' + y_tcp;
++ pt_otr += ' ' + x + ',' + y_otr;
++ }
++
++ pt_udp += ' ' + width + ',' + y_udp + ' ' + width + ',' + height;
++ pt_tcp += ' ' + width + ',' + y_tcp + ' ' + width + ',' + height;
++ pt_otr += ' ' + width + ',' + y_otr + ' ' + width + ',' + height;
++
++
++ var order = [
++ [ line_udp, data_udp[data_udp.length-1] ],
++ [ line_tcp, data_tcp[data_tcp.length-1] ],
++ [ line_otr, data_otr[data_otr.length-1] ]
++ ];
++
++ order.sort(function(a, b) { return b[1] - a[1] });
++
++ for (var i = 0; i < order.length; i++)
++ order[i][0].parentNode.appendChild(order[i][0]);
++
++
++ line_udp.setAttribute('points', pt_udp);
++ line_tcp.setAttribute('points', pt_tcp);
++ line_otr.setAttribute('points', pt_otr);
++
++ label_25.firstChild.data = Math.floor(1.1 * 0.25 * data_max);
++ label_50.firstChild.data = Math.floor(1.1 * 0.50 * data_max);
++ label_75.firstChild.data = Math.floor(1.1 * 0.75 * data_max);
++
++ label_udp_cur.innerHTML = Math.floor(data_udp[data_udp.length-1]);
++ label_tcp_cur.innerHTML = Math.floor(data_tcp[data_tcp.length-1]);
++ label_otr_cur.innerHTML = Math.floor(data_otr[data_otr.length-1]);
++
++ label_udp_avg.innerHTML = Math.floor(data_udp_avg);
++ label_tcp_avg.innerHTML = Math.floor(data_tcp_avg);
++ label_otr_avg.innerHTML = Math.floor(data_otr_avg);
++
++ label_udp_peak.innerHTML = Math.floor(data_udp_peak);
++ label_tcp_peak.innerHTML = Math.floor(data_tcp_peak);
++ label_otr_peak.innerHTML = Math.floor(data_otr_peak);
++ }
++ );
++ }
++ }, 1000
++ );
++//]]></script>
++
++<h2 name="content"><%:Realtime Connections%></h2>
++
++<div class="cbi-map-descr"><%:This page gives an overview over currently active network connections.%></div>
++
++<fieldset class="cbi-section" id="cbi-table-table">
++ <legend><%:Active Connections%></legend>
++
++ <embed id="bwsvg" style="width:100%; height:300px; border:1px solid #000000; background-color:#FFFFFF" src="<%=resource%>/connections.svg" />
++ <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>
++ <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>
++</fieldset>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/dmesg.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/dmesg.htm
+new file mode 100644
+index 0000000..c119b57
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/dmesg.htm
+@@ -0,0 +1,12 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content"><%:Kernel Log%></h2>
++<div id="content_syslog">
++<textarea readonly="readonly" wrap="off" rows="<%=dmesg:cmatch("\n")+2%>" id="syslog"><%=dmesg:pcdata()%></textarea>
++</div>
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm
+new file mode 100644
+index 0000000..62188e4
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm
+@@ -0,0 +1,706 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++ local fs = require "nixio.fs"
++ local util = require "luci.util"
++ local stat = require "luci.tools.status"
++ local ver = require "luci.version"
++
++ local has_ipv6 = fs.access("/proc/net/ipv6_route")
++ local has_dhcp = fs.access("/etc/config/dhcp")
++ local has_wifi = ((fs.stat("/etc/config/wireless", "size") or 0) > 0)
++
++ local sysinfo = luci.util.ubus("system", "info") or { }
++ local boardinfo = luci.util.ubus("system", "board") or { }
++ local unameinfo = nixio.uname() or { }
++
++ local meminfo = sysinfo.memory or {
++ total = 0,
++ free = 0,
++ buffered = 0,
++ shared = 0
++ }
++
++ local swapinfo = sysinfo.swap or {
++ total = 0,
++ free = 0
++ }
++
++ local has_dsl = fs.access("/etc/init.d/dsl_control")
++
++ if luci.http.formvalue("status") == "1" then
++ local ntm = require "luci.model.network".init()
++ local wan = ntm:get_wannet()
++ local wan6 = ntm:get_wan6net()
++
++ local conn_count = tonumber((
++ luci.sys.exec("wc -l /proc/net/nf_conntrack") or
++ luci.sys.exec("wc -l /proc/net/ip_conntrack") or
++ ""):match("%d+")) or 0
++
++ local conn_max = tonumber((
++ luci.sys.exec("sysctl net.nf_conntrack_max") or
++ luci.sys.exec("sysctl net.ipv4.netfilter.ip_conntrack_max") or
++ ""):match("%d+")) or 4096
++
++ local rv = {
++ uptime = sysinfo.uptime or 0,
++ localtime = os.date(),
++ loadavg = sysinfo.load or { 0, 0, 0 },
++ memory = meminfo,
++ swap = swapinfo,
++ connmax = conn_max,
++ conncount = conn_count,
++ leases = stat.dhcp_leases(),
++ leases6 = stat.dhcp6_leases(),
++ wifinets = stat.wifi_networks()
++ }
++
++ if wan then
++ rv.wan = {
++ ipaddr = wan:ipaddr(),
++ gwaddr = wan:gwaddr(),
++ netmask = wan:netmask(),
++ dns = wan:dnsaddrs(),
++ expires = wan:expires(),
++ uptime = wan:uptime(),
++ proto = wan:proto(),
++ ifname = wan:ifname(),
++ link = wan:adminlink()
++ }
++ end
++
++ if wan6 then
++ rv.wan6 = {
++ ip6addr = wan6:ip6addr(),
++ gw6addr = wan6:gw6addr(),
++ dns = wan6:dns6addrs(),
++ uptime = wan6:uptime(),
++ ifname = wan6:ifname(),
++ link = wan6:adminlink()
++ }
++ end
++
++ if has_dsl then
++ local dsl_stat = luci.sys.exec("/etc/init.d/dsl_control lucistat")
++ local dsl_func = loadstring(dsl_stat)
++ if dsl_func then
++ rv.dsl = dsl_func()
++ end
++ end
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++
++ return
++ end
++-%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ function progressbar(v, m)
++ {
++ var vn = parseInt(v) || 0;
++ var mn = parseInt(m) || 100;
++ var pc = Math.floor((100 / mn) * vn);
++
++ return String.format(
++ '<div style="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>' +
++ '</div>' +
++ '</div>' +
++ '</div>', pc, v, m, pc
++ );
++ }
++
++ var wifidevs = <%=luci.http.write_json(netdevs)%>;
++ var arptable = <%=luci.http.write_json(arpcache)%>;
++
++ XHR.poll(5, '<%=REQUEST_URI%>', { status: 1 },
++ function(x, info)
++ {
++ 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>';
++ }
++
++ <% 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><%:Address%>: </strong>%s<br />' +
++ '<strong><%:Gateway%>: </strong>%s<br />',
++ (ifc6.ip6addr) ? ifc6.ip6addr : '::',
++ (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>';
++ }
++ <% end %>
++
++ <% if has_dsl then %>
++ var dsl_i = document.getElementById('dsl_i');
++ var dsl_s = document.getElementById('dsl_s');
++
++ var s = String.format(
++ '<strong><%:Status%>: </strong>%s<br />' +
++ '<strong><%:Line State%>: </strong>%s [0x%x]<br />' +
++ '<strong><%:Line Speed%>: </strong>%s/s / %s/s<br />' +
++ '<strong><%:Line Attenuation%>: </strong>%s dB / %s dB<br />' +
++ '<strong><%:Noise Margin%>: </strong>%s dB / %s dB<br />',
++ info.dsl.line_state, info.dsl.line_state_detail,
++ info.dsl.line_state_num,
++ info.dsl.data_rate_down_s, info.dsl.data_rate_up_s,
++ info.dsl.line_attenuation_down, info.dsl.line_attenuation_up,
++ info.dsl.noise_margin_down, info.dsl.noise_margin_up
++ );
++
++ dsl_s.innerHTML = String.format('<small>%s</small>', s);
++ dsl_i.innerHTML = String.format(
++ '<img src="<%=resource%>/icons/ethernet.png" />' +
++ '<br /><small>ADSL</small>'
++ );
++ <% 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 <= 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 <= 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);
++
++ tr.insertCell(-1).innerHTML = info.leases6[i].hostname ? 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);
++
++ 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 = '';
++
++ for (var nidx = 0; nidx < dev.networks.length; nidx++)
++ {
++ var net = dev.networks[nidx];
++ var is_assoc = (net.bssid != '00:00:00:00:00:00' && net.channel && !net.disabled);
++
++ var icon;
++ if (!is_assoc)
++ icon = "<%=resource%>/icons/signal-none.png";
++ else if (net.quality == 0)
++ icon = "<%=resource%>/icons/signal-0.png";
++ else if (net.quality < 25)
++ icon = "<%=resource%>/icons/signal-0-25.png";
++ else if (net.quality < 50)
++ icon = "<%=resource%>/icons/signal-25-50.png";
++ else if (net.quality < 75)
++ icon = "<%=resource%>/icons/signal-50-75.png";
++ 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)
++ {
++ assoclist.push({
++ bssid: bssid,
++ signal: net.assoclist[bssid].signal,
++ noise: net.assoclist[bssid].noise,
++ rx_rate: net.assoclist[bssid].rx_rate,
++ rx_mcs: net.assoclist[bssid].rx_mcs,
++ rx_40mhz: net.assoclist[bssid].rx_40mhz,
++ tx_rate: net.assoclist[bssid].tx_rate,
++ tx_mcs: net.assoclist[bssid].tx_mcs,
++ tx_40mhz: net.assoclist[bssid].tx_40mhz,
++ link: net.link,
++ name: net.name
++ });
++ }
++ }
++
++ 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(
++ '<img src="%s" title="<%:Signal%>: %d <%:dBm%> / <%:Noise%>: %d <%:dBm%>" />',
++ icon, assoclist[i].signal, assoclist[i].noise
++ );
++
++ tr.insertCell(-1).innerHTML = assoclist[i].bssid;
++
++ tr.insertCell(-1).innerHTML = String.format(
++ '<a href="%s">%s</a>',
++ assoclist[i].link,
++ '%h'.format(assoclist[i].name).nobr()
++ );
++
++ tr.insertCell(-1).innerHTML = String.format('%d <%:dBm%>', assoclist[i].signal).nobr();
++ tr.insertCell(-1).innerHTML = String.format('%d <%:dBm%>', assoclist[i].noise).nobr();
++
++ tr.insertCell(-1).innerHTML = (assoclist[i].rx_mcs > -1)
++ ? String.format('%.1f <%:Mbit/s%>, MCS %d, %d<%:MHz%>', assoclist[i].rx_rate / 1000, assoclist[i].rx_mcs, assoclist[i].rx_40mhz ? 40 : 20).nobr()
++ : String.format('%.1f <%:Mbit/s%>', assoclist[i].rx_rate / 1000).nobr()
++ ;
++
++ tr.insertCell(-1).innerHTML = (assoclist[i].tx_mcs > -1)
++ ? String.format('%.1f <%:Mbit/s%>, MCS %d, %d<%:MHz%>', assoclist[i].tx_rate / 1000, assoclist[i].tx_mcs, assoclist[i].tx_40mhz ? 40 : 20).nobr()
++ : String.format('%.1f <%:Mbit/s%>', assoclist[i].tx_rate / 1000).nobr()
++ ;
++ }
++
++ 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>';
++ }
++ }
++ <% end %>
++
++ var e;
++
++ if (e = document.getElementById('localtime'))
++ e.innerHTML = info.localtime;
++
++ if (e = document.getElementById('uptime'))
++ e.innerHTML = String.format('%t', info.uptime);
++
++ if (e = document.getElementById('loadavg'))
++ e.innerHTML = String.format(
++ '%.02f, %.02f, %.02f',
++ info.loadavg[0] / 65535.0,
++ info.loadavg[1] / 65535.0,
++ info.loadavg[2] / 65535.0
++ );
++
++ if (e = document.getElementById('memtotal'))
++ e.innerHTML = progressbar(
++ ((info.memory.free + info.memory.buffered) / 1024) + " <%:kB%>",
++ (info.memory.total / 1024) + " <%:kB%>"
++ );
++
++ if (e = document.getElementById('memfree'))
++ e.innerHTML = progressbar(
++ (info.memory.free / 1024) + " <%:kB%>",
++ (info.memory.total / 1024) + " <%:kB%>"
++ );
++
++ if (e = document.getElementById('membuff'))
++ e.innerHTML = progressbar(
++ (info.memory.buffered / 1024) + " <%:kB%>",
++ (info.memory.total / 1024) + " <%:kB%>"
++ );
++
++ if (e = document.getElementById('swaptotal'))
++ e.innerHTML = progressbar(
++ (info.swap.free / 1024) + " <%:kB%>",
++ (info.swap.total / 1024) + " <%:kB%>"
++ );
++
++ if (e = document.getElementById('swapfree'))
++ e.innerHTML = progressbar(
++ (info.swap.free / 1024) + " <%:kB%>",
++ (info.swap.total / 1024) + " <%:kB%>"
++ );
++
++ if (e = document.getElementById('conns'))
++ e.innerHTML = progressbar(info.conncount, info.connmax);
++
++ }
++ );
++//]]></script>
++
++<h2 name="content"><%:Status%></h2>
++
++<fieldset class="cbi-section">
++ <legend><%:System%></legend>
++
++ <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>
++ <%=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>
++
++<% 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>
++<% 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"><%:Hostname%></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 %>
++
++<% if has_dsl then %>
++<fieldset class="cbi-section">
++ <legend><%:ADSL%></legend>
++ <table width="100%" cellspacing="10">
++ <tr><td width="33%" style="vertical-align:top"><%:ADSL 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>
++<% 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" id="wifi_assoc_table">
++ <tr class="cbi-section-table-titles">
++ <th class="cbi-section-table-cell">&#160;</th>
++ <th class="cbi-section-table-cell"><%:MAC-Address%></th>
++ <th class="cbi-section-table-cell"><%:Network%></th>
++ <th class="cbi-section-table-cell"><%:Signal%></th>
++ <th class="cbi-section-table-cell"><%:Noise%></th>
++ <th class="cbi-section-table-cell"><%:RX Rate%></th>
++ <th class="cbi-section-table-cell"><%:TX Rate%></th>
++ </tr>
++ <tr class="cbi-section-table-row">
++ <td colspan="7"><em><br /><%:Collecting data...%></em></td>
++ </tr>
++ </table>
++</fieldset>
++<% end %>
++
++<%-
++ local incdir = util.libpath() .. "/view/admin_status/index/"
++ if fs.access(incdir) then
++ local inc
++ for inc in fs.dir(incdir) do
++ if inc:match("%.htm$") then
++ include("admin_status/index/" .. inc:gsub("%.htm$", ""))
++ end
++ end
++ end
++-%>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm
+new file mode 100644
+index 0000000..f49469a
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm
+@@ -0,0 +1,146 @@
++<%#
++ Copyright 2008-2009 Steven Barth <steven@midlink.org>
++ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%-
++
++ require "luci.sys.iptparser"
++ local wba = require "luci.tools.webadmin"
++ local fs = require "nixio.fs"
++
++ local has_ip6tables = fs.access("/usr/sbin/ip6tables")
++ local mode = 4
++
++ if has_ip6tables then
++ mode = luci.dispatcher.context.requestpath
++ mode = tonumber(mode[#mode] ~= "iptables" and mode[#mode]) or 4
++ end
++
++ local ipt = luci.sys.iptparser.IptParser(mode)
++
++ local rowcnt = 1
++ function rowstyle()
++ rowcnt = rowcnt + 1
++ return (rowcnt % 2) + 1
++ end
++
++ function link_target(t,c)
++ if ipt:is_custom_target(c) then
++ return '<a href="#rule_%s_%s">%s</a>' %{ t:lower(), c, c }
++ end
++ return c
++ end
++
++ function link_iface(i)
++ local net = wba.iface_get_network(i)
++ if net and i ~= "lo" then
++ return '<a href="%s">%s</a>' %{
++ url("admin/network/network", net), i
++ }
++
++ end
++ return i
++ end
++
++ local tables = { "Filter", "NAT", "Mangle", "Raw" }
++ if mode == 6 then
++ tables = { "Filter", "Mangle", "Raw" }
++ end
++-%>
++
++<%+header%>
++
++<style type="text/css">
++ span:target {
++ color: blue;
++ text-decoration: underline;
++ }
++</style>
++
++<h2 name="content"><%:Firewall Status%></h2>
++<br />
++
++<% if has_ip6tables then %>
++<ul class="cbi-tabmenu">
++ <li class="cbi-tab<%= mode ~= 4 and "-disabled" %>"><a href="<%=url("admin/status/iptables/4")%>"><%:IPv4 Firewall%></a></li>
++ <li class="cbi-tab<%= mode ~= 6 and "-disabled" %>"><a href="<%=url("admin/status/iptables/6")%>"><%:IPv6 Firewall%></a></li>
++</ul>
++<% end %>
++
++<div class="cbi-map" style="position: relative">
++
++ <form method="post" action="<%=url("admin/status/iptables_action")%>" style="position: absolute; right: 0">
++ <input type="hidden" name="token" value="<%=token%>" />
++ <input type="hidden" name="family" value="<%=mode%>" />
++ <input type="submit" class="cbi-button" name="zero" value="<%:Reset Counters%>" />
++ <input type="submit" class="cbi-button" name="restart" value="<%:Restart Firewall%>" />
++ </form>
++
++ <fieldset 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>
++ <br /><br />
++ <% end %>
++ </fieldset>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm
+new file mode 100644
+index 0000000..97a2f5e
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm
+@@ -0,0 +1,284 @@
++<%#
++ Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ var bwxhr = new XHR();
++
++ var G;
++ var TIME = 0;
++ var L01 = 1;
++ var L05 = 2;
++ var L15 = 3;
++
++ var width = 760;
++ var height = 300;
++ var step = 5;
++
++ var data_wanted = Math.floor(width / step);
++ var data_fill = 0;
++ var data_stamp = 0;
++
++ var data_01 = [ ];
++ var data_05 = [ ];
++ var data_15 = [ ];
++
++ var line_01;
++ var line_05;
++ var line_15;
++
++ var label_25;
++ var label_050;
++ var label_75;
++
++ var label_01_cur;
++ var label_01_avg;
++ var label_01_peak;
++
++ var label_05_cur;
++ var label_05_avg;
++ var label_05_peak;
++
++ var label_15_cur;
++ var label_15_avg;
++ var label_15_peak;
++
++ var label_scale;
++
++
++ /* wait for SVG */
++ window.setTimeout(
++ function() {
++ var svg = document.getElementById('bwsvg');
++
++ try {
++ G = svg.getSVGDocument
++ ? svg.getSVGDocument() : svg.contentDocument;
++ }
++ catch(e) {
++ G = document.embeds['bwsvg'].getSVGDocument();
++ }
++
++ if (!G)
++ {
++ window.setTimeout(arguments.callee, 1000);
++ }
++ else
++ {
++ /* find sizes */
++ width = svg.offsetWidth - 2;
++ height = svg.offsetHeight - 2;
++ data_wanted = Math.ceil(width / step);
++
++ /* prefill datasets */
++ for (var i = 0; i < data_wanted; i++)
++ {
++ data_01[i] = 0;
++ data_05[i] = 0;
++ data_15[i] = 0;
++ }
++
++ /* find svg elements */
++ line_01 = G.getElementById('load01');
++ line_05 = G.getElementById('load05');
++ line_15 = G.getElementById('load15');
++
++ label_25 = G.getElementById('label_25');
++ label_50 = G.getElementById('label_50');
++ label_75 = G.getElementById('label_75');
++
++ label_01_cur = document.getElementById('lb_load01_cur');
++ label_01_avg = document.getElementById('lb_load01_avg');
++ label_01_peak = document.getElementById('lb_load01_peak');
++
++ label_05_cur = document.getElementById('lb_load05_cur');
++ label_05_avg = document.getElementById('lb_load05_avg');
++ label_05_peak = document.getElementById('lb_load05_peak');
++
++ label_15_cur = document.getElementById('lb_load15_cur');
++ label_15_avg = document.getElementById('lb_load15_avg');
++ label_15_peak = document.getElementById('lb_load15_peak');
++
++ label_scale = document.getElementById('scale');
++
++
++ /* plot horizontal time interval lines */
++ for (var i = width % (step * 60); i < width; i += step * 60)
++ {
++ var line = G.createElementNS('http://www.w3.org/2000/svg', 'line');
++ line.setAttribute('x1', i);
++ line.setAttribute('y1', 0);
++ line.setAttribute('x2', i);
++ line.setAttribute('y2', '100%');
++ line.setAttribute('style', 'stroke:black;stroke-width:0.1');
++
++ var text = G.createElementNS('http://www.w3.org/2000/svg', 'text');
++ text.setAttribute('x', i + 5);
++ text.setAttribute('y', 15);
++ text.setAttribute('style', 'fill:#999999; font-size:9pt');
++ text.appendChild(G.createTextNode(Math.round((width - i) / step / 60) + 'm'));
++
++ label_25.parentNode.appendChild(line);
++ label_25.parentNode.appendChild(text);
++ }
++
++ label_scale.innerHTML = String.format('<%:(%d minute window, %d second interval)%>', data_wanted / 60, 3);
++
++ /* render datasets, start update interval */
++ XHR.poll(3, '<%=build_url("admin/status/realtime/load_status")%>', null,
++ function(x, data)
++ {
++ var data_max = 0;
++ var data_scale = 0;
++
++ var data_01_avg = 0;
++ var data_05_avg = 0;
++ var data_15_avg = 0;
++
++ var data_01_peak = 0;
++ var data_05_peak = 0;
++ var data_15_peak = 0;
++
++ for (var i = data_stamp ? 0 : 1; i < data.length; i++)
++ {
++ /* skip overlapping entries */
++ if (data[i][TIME] <= data_stamp)
++ continue;
++
++ data_01.push(data[i][L01]);
++ data_05.push(data[i][L05]);
++ data_15.push(data[i][L15]);
++ }
++
++ /* cut off outdated entries */
++ data_01 = data_01.slice(data_01.length - data_wanted, data_01.length);
++ data_05 = data_05.slice(data_05.length - data_wanted, data_05.length);
++ data_15 = data_15.slice(data_15.length - data_wanted, data_15.length);
++
++ /* find peak */
++ for (var i = 0; i < data_01.length; i++)
++ {
++ data_max = Math.max(data_max, data_01[i]);
++ data_max = Math.max(data_max, data_05[i]);
++ data_max = Math.max(data_max, data_15[i]);
++
++ data_01_peak = Math.max(data_01_peak, data_01[i]);
++ data_05_peak = Math.max(data_05_peak, data_05[i]);
++ data_15_peak = Math.max(data_15_peak, data_15[i]);
++
++ if (i > 0)
++ {
++ data_01_avg = (data_01_avg + data_01[i]) / 2;
++ data_05_avg = (data_05_avg + data_05[i]) / 2;
++ data_15_avg = (data_15_avg + data_15[i]) / 2;
++ }
++ else
++ {
++ data_01_avg = data_01[i];
++ data_05_avg = data_05[i];
++ data_15_avg = data_15[i];
++ }
++ }
++
++ /* remember current timestamp, calculate horizontal scale */
++ data_stamp = data[data.length-1][TIME];
++ data_scale = height / (data_max * 1.1);
++
++
++ /* plot data */
++ var pt_01 = '0,' + height;
++ var pt_05 = '0,' + height;
++ var pt_15 = '0,' + height;
++
++ var y_01 = 0;
++ var y_05 = 0;
++ var y_15 = 0;
++
++ for (var i = 0; i < data_01.length; i++)
++ {
++ var x = i * step;
++
++ y_01 = height - Math.floor(data_01[i] * data_scale);
++ y_05 = height - Math.floor(data_05[i] * data_scale);
++ y_15 = height - Math.floor(data_15[i] * data_scale);
++
++ pt_01 += ' ' + x + ',' + y_01;
++ pt_05 += ' ' + x + ',' + y_05;
++ pt_15 += ' ' + x + ',' + y_15;
++ }
++
++ pt_01 += ' ' + width + ',' + y_01 + ' ' + width + ',' + height;
++ pt_05 += ' ' + width + ',' + y_05 + ' ' + width + ',' + height;
++ pt_15 += ' ' + width + ',' + y_15 + ' ' + width + ',' + height;
++
++
++ line_01.setAttribute('points', pt_01);
++ line_05.setAttribute('points', pt_05);
++ line_15.setAttribute('points', pt_15);
++
++ label_25.firstChild.data = (1.1 * 0.25 * data_max / 100).toFixed(2);
++ label_50.firstChild.data = (1.1 * 0.50 * data_max / 100).toFixed(2);
++ label_75.firstChild.data = (1.1 * 0.75 * data_max / 100).toFixed(2);
++
++ label_01_cur.innerHTML = (data_01[data_01.length-1] / 100).toFixed(2);
++ label_05_cur.innerHTML = (data_05[data_05.length-1] / 100).toFixed(2);
++ label_15_cur.innerHTML = (data_15[data_15.length-1] / 100).toFixed(2);
++
++ label_01_avg.innerHTML = (data_01_avg / 100).toFixed(2);
++ label_05_avg.innerHTML = (data_05_avg / 100).toFixed(2);
++ label_15_avg.innerHTML = (data_15_avg / 100).toFixed(2);
++
++ label_01_peak.innerHTML = (data_01_peak / 100).toFixed(2);
++ label_05_peak.innerHTML = (data_05_peak / 100).toFixed(2);
++ label_15_peak.innerHTML = (data_15_peak / 100).toFixed(2);
++ }
++ );
++ }
++ }, 1000
++ );
++//]]></script>
++
++<h2 name="content"><%:Realtime Load%></h2>
++
++<embed id="bwsvg" style="width:100%; height:300px; border:1px solid #000000; background-color:#FFFFFF" src="<%=resource%>/load.svg" />
++<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>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm
+new file mode 100644
+index 0000000..5f2c074
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm
+@@ -0,0 +1,162 @@
++<%#
++ Copyright 2008-2009 Steven Barth <steven@midlink.org>
++ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%-
++ require "luci.tools.webadmin"
++ require "nixio.fs"
++
++ local ip = require "luci.ip"
++ local style = true
++ local _, v
++
++ local rtn = {
++ [255] = "local",
++ [254] = "main",
++ [253] = "default",
++ [0] = "unspec"
++ }
++
++ if nixio.fs.access("/etc/iproute2/rt_tables") then
++ local ln
++ for ln in io.lines("/etc/iproute2/rt_tables") do
++ local i, n = ln:match("^(%d+)%s+(%S+)")
++ if i and n then
++ rtn[tonumber(i)] = n
++ end
++ end
++ end
++-%>
++
++<%+header%>
++
++<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">
++ <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>
++
++ <%
++ 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"><%=v.dev%></td>
++ </tr>
++ <%
++ style = not style
++ end
++ end
++ %>
++ </table>
++ </div>
++ </fieldset>
++ <br />
++
++ <fieldset 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>
++ <% 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>
++ <% style = not style end %>
++ </table>
++ </div>
++ </fieldset>
++ <br />
++
++ <%
++ if nixio.fs.access("/proc/net/ipv6_route") then
++ style = true
++ %>
++ <fieldset 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>
++ <%
++ 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>
++ <%
++ style = not style
++ end
++ end
++ %>
++ </table>
++ </div>
++ </fieldset>
++ <br />
++
++ <fieldset 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>
++ <%
++ 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>
++ <%
++ style = not style
++ end
++ end
++ %>
++ </table>
++ </div>
++ </fieldset>
++ <br />
++ <% end %>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/syslog.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/syslog.htm
+new file mode 100644
+index 0000000..b87f21d
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/syslog.htm
+@@ -0,0 +1,12 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content"><%:System Log%></h2>
++<div id="content_syslog">
++<textarea readonly="readonly" wrap="off" rows="<%=syslog:cmatch("\n")+2%>" id="syslog"><%=syslog:pcdata()%></textarea>
++</div>
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm
+new file mode 100644
+index 0000000..f185926
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm
+@@ -0,0 +1,371 @@
++<%#
++ Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%-
++ local ntm = require "luci.model.network".init()
++
++ local dev
++ local devices = { }
++ for _, dev in luci.util.vspairs(luci.sys.net.devices()) do
++ if dev:match("^wlan%d") or dev:match("^ath%d") or dev:match("^wl%d") then
++ devices[#devices+1] = dev
++ end
++ end
++
++ local curdev = luci.dispatcher.context.requestpath
++ curdev = curdev[#curdev] ~= "wireless" and curdev[#curdev] or devices[1]
++-%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ var bwxhr = new XHR();
++
++ var G, G2;
++ var TIME = 0;
++ var RATE = 1;
++ var RSSI = 2;
++ var NOISE = 3;
++
++ var width = 760;
++ var height = 300;
++ var step = 5;
++
++ var data_wanted = Math.floor(width / step);
++ var data_fill = 0;
++ var data_stamp = 0;
++
++ var data_rssi = [ ];
++ var data_noise = [ ];
++ var data_rate = [ ];
++
++ var line_rssi;
++ var line_noise;
++ var line_rate;
++
++ var label_25, label_25_2;
++ var label_50, label_50_2;
++ var label_75, label_75_2;
++
++ var label_rssi_cur;
++ var label_rssi_avg;
++ var label_rssi_peak;
++
++ var label_noise_cur;
++ var label_noise_avg;
++ var label_noise_peak;
++
++ var label_rate_cur;
++ var label_rate_avg;
++ var label_rate_peak;
++
++ var label_scale;
++
++
++ /* wait for SVG */
++ window.setTimeout(
++ function() {
++ var svg = document.getElementById('iwsvg');
++ var svg2 = document.getElementById('iwsvg2');
++
++ try {
++ G = svg.getSVGDocument
++ ? svg.getSVGDocument() : svg.contentDocument;
++ G2 = svg2.getSVGDocument
++ ? svg2.getSVGDocument() : svg2.contentDocument;
++ }
++ catch(e) {
++ G = document.embeds['iwsvg'].getSVGDocument();
++ G2 = document.embeds['iwsvg2'].getSVGDocument();
++ }
++
++ if (!G || !G2)
++ {
++ window.setTimeout(arguments.callee, 1000);
++ }
++ else
++ {
++ /* find sizes */
++ width = svg.offsetWidth - 2;
++ height = svg.offsetHeight - 2;
++ data_wanted = Math.ceil(width / step);
++
++ /* prefill datasets */
++ for (var i = 0; i < data_wanted; i++)
++ {
++ data_rssi[i] = 0;
++ data_noise[i] = 0;
++ data_rate[i] = 0;
++ }
++
++ /* find svg elements */
++ line_rssi = G.getElementById('rssi');
++ line_noise = G.getElementById('noise');
++ line_rate = G2.getElementById('rate');
++
++ label_25 = G.getElementById('label_25');
++ label_50 = G.getElementById('label_50');
++ label_75 = G.getElementById('label_75');
++ label_25_2 = G2.getElementById('label_25');
++ label_50_2 = G2.getElementById('label_50');
++ label_75_2 = G2.getElementById('label_75');
++
++ label_rssi_cur = document.getElementById('rssi_bw_cur');
++ label_rssi_avg = document.getElementById('rssi_bw_avg');
++ label_rssi_peak = document.getElementById('rssi_bw_peak');
++
++ label_noise_cur = document.getElementById('noise_bw_cur');
++ label_noise_avg = document.getElementById('noise_bw_avg');
++ label_noise_peak = document.getElementById('noise_bw_peak');
++
++ label_rate_cur = document.getElementById('rate_bw_cur');
++ label_rate_avg = document.getElementById('rate_bw_avg');
++ label_rate_peak = document.getElementById('rate_bw_peak');
++
++ label_scale = document.getElementById('scale');
++ label_scale_2 = document.getElementById('scale2');
++
++
++ /* plot horizontal time interval lines */
++ for (var i = width % (step * 60); i < width; i += step * 60)
++ {
++ var line = G.createElementNS('http://www.w3.org/2000/svg', 'line');
++ line.setAttribute('x1', i);
++ line.setAttribute('y1', 0);
++ line.setAttribute('x2', i);
++ line.setAttribute('y2', '100%');
++ line.setAttribute('style', 'stroke:black;stroke-width:0.1');
++
++ var text = G.createElementNS('http://www.w3.org/2000/svg', 'text');
++ text.setAttribute('x', i + 5);
++ text.setAttribute('y', 15);
++ text.setAttribute('style', 'fill:#999999; font-size:9pt');
++ text.appendChild(G.createTextNode(Math.round((width - i) / step / 60) + 'm'));
++
++ label_25.parentNode.appendChild(line);
++ label_25.parentNode.appendChild(text);
++
++
++ var line2 = G2.createElementNS('http://www.w3.org/2000/svg', 'line');
++ line2.setAttribute('x1', i);
++ line2.setAttribute('y1', 0);
++ line2.setAttribute('x2', i);
++ line2.setAttribute('y2', '100%');
++ line2.setAttribute('style', 'stroke:black;stroke-width:0.1');
++
++ var text2 = G2.createElementNS('http://www.w3.org/2000/svg', 'text');
++ text2.setAttribute('x', i + 5);
++ text2.setAttribute('y', 15);
++ text2.setAttribute('style', 'fill:#999999; font-size:9pt');
++ text2.appendChild(G.createTextNode(Math.round((width - i) / step / 60) + 'm'));
++
++ label_25_2.parentNode.appendChild(line2);
++ label_25_2.parentNode.appendChild(text2);
++ }
++
++ label_scale.innerHTML = String.format('<%:(%d minute window, %d second interval)%>', data_wanted / 60, 3);
++ label_scale_2.innerHTML = String.format('<%:(%d minute window, %d second interval)%>', data_wanted / 60, 3);
++
++ /* render datasets, start update interval */
++ XHR.poll(3, '<%=build_url("admin/status/realtime/wireless_status", curdev)%>', null,
++ function(x, data)
++ {
++ var noise_floor = 255;
++ var rate_floor = 60000;
++
++ for (var i = 0; i < data.length; i++) {
++ noise_floor = Math.min(noise_floor, data[i][NOISE]);
++ rate_floor = Math.min(rate_floor, data[i][RATE]);
++ }
++
++ noise_floor -= 5;
++
++ var data_max = 0;
++ var data_scale = 0;
++ var data_max_2 = 0;
++ var data_scale_2 = 0;
++
++ var data_rssi_avg = 0;
++ var data_noise_avg = 0;
++ var data_rate_avg = 0;
++
++ var data_rssi_peak = 0;
++ var data_noise_peak = 0;
++ var data_rate_peak = 0;
++
++ for (var i = data_stamp ? 0 : 1; i < data.length; i++)
++ {
++ /* skip overlapping entries */
++ if (data[i][TIME] <= data_stamp)
++ continue;
++
++ data_rssi.push(data[i][RSSI] - noise_floor);
++ data_noise.push(data[i][NOISE] - noise_floor);
++ data_rate.push(Math.floor(data[i][RATE] / 1000));
++ }
++
++ /* cut off outdated entries */
++ data_rssi = data_rssi.slice(data_rssi.length - data_wanted, data_rssi.length);
++ data_noise = data_noise.slice(data_noise.length - data_wanted, data_noise.length);
++ data_rate = data_rate.slice(data_rate.length - data_wanted, data_rate.length);
++
++ /* find peak */
++ for (var i = 0; i < data_rssi.length; i++)
++ {
++ data_max = Math.max(data_max, data_rssi[i]);
++ data_max_2 = Math.max(data_max_2, data_rate[i]);
++
++ data_rssi_peak = Math.max(data_rssi_peak, data_rssi[i]);
++ data_noise_peak = Math.max(data_noise_peak, data_noise[i]);
++ data_rate_peak = Math.max(data_rate_peak, data_rate[i]);
++
++ if (i > 0)
++ {
++ data_rssi_avg = (data_rssi_avg + data_rssi[i]) / 2;
++ data_noise_avg = (data_noise_avg + data_noise[i]) / 2;
++ data_rate_avg = (data_rate_avg + data_rate[i]) / 2;
++ }
++ else
++ {
++ data_rssi_avg = data_rssi[i];
++ data_noise_avg = data_noise[i];
++ data_rate_avg = data_rate[i];
++ }
++ }
++
++ /* remember current timestamp, calculate horizontal scale */
++ data_stamp = data[data.length-1][TIME];
++ data_scale = (height / (data_max * 1.1)).toFixed(1);
++ data_scale_2 = (height / (data_max_2 * 1.1)).toFixed(1);
++
++ /* plot data */
++ var pt_rssi = '0,' + height;
++ var pt_noise = '0,' + height;
++ var pt_rate = '0,' + height;
++
++ var y_rssi = 0;
++ var y_noise = 0;
++ var y_rate = 0;
++
++ for (var i = 0; i < data_rssi.length; i++)
++ {
++ var x = i * step;
++
++ y_rssi = height - Math.floor(data_rssi[i] * data_scale);
++ y_noise = height - Math.floor(data_noise[i] * data_scale);
++ y_rate = height - Math.floor(data_rate[i] * data_scale_2);
++
++ y_rssi -= Math.floor(y_rssi % (1/data_scale));
++ y_noise -= Math.floor(y_noise % (1/data_scale));
++
++ pt_rssi += ' ' + x + ',' + y_rssi;
++ pt_noise += ' ' + x + ',' + y_noise;
++ pt_rate += ' ' + x + ',' + y_rate;
++ }
++
++ pt_rssi += ' ' + width + ',' + y_rssi + ' ' + width + ',' + height;
++ pt_noise += ' ' + width + ',' + y_noise + ' ' + width + ',' + height;
++ pt_rate += ' ' + width + ',' + y_rate + ' ' + width + ',' + height;
++
++ line_rssi.setAttribute('points', pt_rssi);
++ line_noise.setAttribute('points', pt_noise);
++ line_rate.setAttribute('points', pt_rate);
++
++ function wireless_label(dbm, noise)
++ {
++ if (noise)
++ return String.format("%d <%:dBm%> (SNR %d <%:dBm%>)", noise_floor + dbm - 255, dbm - noise);
++ else
++ return String.format("%d <%:dBm%>", noise_floor + dbm - 255);
++ }
++
++ function rate_label(mbit)
++ {
++ return String.format("%d <%:Mbit/s%>", mbit);
++ }
++
++ label_25.firstChild.data = wireless_label(1.1 * 0.25 * data_max);
++ label_50.firstChild.data = wireless_label(1.1 * 0.50 * data_max);
++ label_75.firstChild.data = wireless_label(1.1 * 0.75 * data_max);
++
++ label_25_2.firstChild.data = rate_label(1.1 * 0.25 * data_max_2);
++ label_50_2.firstChild.data = rate_label(1.1 * 0.50 * data_max_2);
++ label_75_2.firstChild.data = rate_label(1.1 * 0.75 * data_max_2);
++
++ label_rssi_cur.innerHTML = wireless_label(data_rssi[data_rssi.length-1], data_noise[data_noise.length-1]).nobr();
++ label_noise_cur.innerHTML = wireless_label(data_noise[data_noise.length-1]).nobr();
++
++ label_rssi_avg.innerHTML = wireless_label(data_rssi_avg, data_noise_avg).nobr();
++ label_noise_avg.innerHTML = wireless_label(data_noise_avg).nobr();
++
++ label_rssi_peak.innerHTML = wireless_label(data_rssi_peak, data_noise_peak).nobr();
++ label_noise_peak.innerHTML = wireless_label(data_noise_peak).nobr();
++
++ label_rate_cur.innerHTML = rate_label(data_rate[data_rate.length-1]);
++ label_rate_avg.innerHTML = rate_label(data_rate_avg);
++ label_rate_peak.innerHTML = rate_label(data_rate_peak);
++ }
++ );
++ }
++ }, 1000
++ );
++//]]></script>
++
++<h2 name="content"><%:Realtime Wireless%></h2>
++
++<ul class="cbi-tabmenu">
++ <% for _, dev in ipairs(devices) do %>
++ <li class="cbi-tab<%= dev == curdev and "" or "-disabled" %>"><a href="<%=pcdata(dev)%>"><%=pcdata(dev)%></a></li>
++ <% end %>
++</ul>
++
++<embed id="iwsvg" style="width:100%; height:300px; border:1px solid #000000; background-color:#FFFFFF" src="<%=resource%>/wireless.svg" />
++<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>
++
++ <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
++ <td id="rssi_bw_avg">0 <%:dBm%></td>
++
++ <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>
++
++ <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
++ <td id="noise_bw_avg">0 <%:dBm%></td>
++
++ <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
++ <td id="noise_bw_peak">0 <%:dBm%></td>
++ </tr>
++</table>
++
++<br />
++
++<embed id="iwsvg2" style="width:100%; height:300px; border:1px solid #000000; background-color:#FFFFFF" src="<%=resource%>/wifirate.svg" />
++<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>
++
++ <td style="text-align:right; vertical-align:top"><strong><%:Average:%></strong></td>
++ <td id="rate_bw_avg">0 MBit/s</td>
++
++ <td style="text-align:right; vertical-align:top"><strong><%:Peak:%></strong></td>
++ <td id="rate_bw_peak">0 MBit/s</td>
++ </tr>
++</table>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/applyreboot.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/applyreboot.htm
+new file mode 100644
+index 0000000..e722a48
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/applyreboot.htm
+@@ -0,0 +1,41 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<html>
++ <head>
++ <title><%=luci.sys.hostname()%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></title>
++ <link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
++ <script type="text/javascript" src="<%=resource%>/xhr.js"></script>
++ <script type="text/javascript">//<![CDATA[
++ var interval = window.setInterval(function() {
++ var img = new Image();
++
++ img.onload = function() {
++ window.clearInterval(interval);
++ location.href = ('https:' == document.location.protocol ? 'https://' : 'http://') + '<%=addr or luci.http.getenv("SERVER_NAME")%>/';
++ };
++
++ img.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + '<%=addr or luci.http.getenv("SERVER_NAME")%><%=resource%>/icons/loading.gif?' + Math.random();
++ }, 5000);
++ //]]></script>
++ </head>
++ <body>
++ <div id="maincontainer">
++ <div id="maincontent">
++ <h2 name="content"><%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></h2>
++ <fieldset class="cbi-section">
++ <p>
++ <% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %>
++ </p>
++ <p>
++ <img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
++ <%:Waiting for changes to be applied...%>
++ </p>
++ </fieldset>
++ </div>
++ </div>
++ </body>
++</html>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/backupfiles.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/backupfiles.htm
+new file mode 100644
+index 0000000..c1f3361
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/backupfiles.htm
+@@ -0,0 +1,10 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<ul class="cbi-tabmenu">
++ <li class="cbi-tab-disabled"><a href="<%=url("admin/system/flashops")%>"><%:Actions%></a></li>
++ <li class="cbi-tab"><a href="#"><%:Configuration%></a></li>
++</ul>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/clock_status.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/clock_status.htm
+new file mode 100644
+index 0000000..37d8ae0
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/clock_status.htm
+@@ -0,0 +1,36 @@
++<%+cbi/valueheader%>
++
++<script type="text/javascript">//<![CDATA[
++ XHR.poll(5, '<%=url('admin/system/clock_status')%>', null,
++ function(x, rv)
++ {
++ var s = document.getElementById('<%=self.option%>-clock-status');
++ if (s)
++ {
++ s.innerHTML = rv.timestring || '?';
++ }
++ }
++ );
++
++ function sync_clock(btn)
++ {
++ btn.disabled = true;
++ btn.value = '<%:Synchronizing...%>';
++
++ (new XHR()).post('<%=url('admin/system/clock_status')%>',
++ { token: '<%=token%>', set: Math.floor((new Date()).getTime() / 1000) },
++ function()
++ {
++ btn.disabled = false;
++ btn.value = '<%:Sync with browser%>';
++ }
++ );
++
++ return false;
++ }
++//]]></script>
++
++<span id="<%=self.option%>-clock-status"><em><%:Collecting data...%></em></span>
++<input type="button" class="cbi-button cbi-button-apply" value="<%:Sync with browser%>" onclick="return sync_clock(this)" />
++
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm
+new file mode 100644
+index 0000000..82a1fdb
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm
+@@ -0,0 +1,93 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Flash operations%></h2>
++
++<ul class="cbi-tabmenu">
++ <li class="cbi-tab"><a href="#"><%:Actions%></a></li>
++ <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>
++ </form>
++ </div>
++ </fieldset>
++
++ <br />
++
++ <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 an OpenWrt 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>
++ <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>
++ <% 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 OpenWrt wiki for device specific install instructions.%></div>
++ <% end %>
++ </fieldset>
++
++</fieldset>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/ipkg.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/ipkg.htm
+new file mode 100644
+index 0000000..a7ff4e5
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/ipkg.htm
+@@ -0,0 +1,10 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<ul class="cbi-tabmenu">
++ <li class="cbi-tab-disabled"><a href="<%=url("admin/system/packages")%>"><%:Actions%></a></li>
++ <li class="cbi-tab"><a href="#"><%:Configuration%></a></li>
++</ul>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm
+new file mode 100644
+index 0000000..1bc9cac
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm
+@@ -0,0 +1,212 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2010 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%-
++local opkg = require "luci.model.ipkg"
++local fs = require "nixio.fs"
++local wa = require "luci.tools.webadmin"
++local rowcnt = 1
++
++function rowstyle()
++ rowcnt = rowcnt + 1
++ return (rowcnt % 2) + 1
++end
++
++local fstat = fs.statvfs(opkg.overlay_root())
++local space_total = fstat and fstat.blocks or 0
++local space_free = fstat and fstat.bfree or 0
++local space_used = space_total - space_free
++
++local used_perc = math.floor(0.5 + ((space_total > 0) and ((100 / space_total) * space_used) or 100))
++local free_byte = space_free * fstat.frsize
++
++local filter = { }
++
++
++local opkg_list = luci.model.ipkg.list_all
++local querypat
++if query and #query > 0 then
++ querypat = '*%s*' % query
++ opkg_list = luci.model.ipkg.find
++end
++
++local letterpat
++if letter == 35 then
++ letterpat = "[^a-z]*"
++else
++ letterpat = string.char(letter, 42) -- 'A' '*'
++end
++
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Software%></h2>
++
++<div class="cbi-map">
++
++ <ul class="cbi-tabmenu">
++ <li class="cbi-tab"><a href="#"><%:Actions%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=REQUEST_URI%>/ipkg"><%:Configuration%></a></li>
++ </ul>
++
++ <form method="post" action="<%=REQUEST_URI%>">
++ <input type="hidden" name="exec" value="1" />
++ <input type="hidden" name="token" value="<%=token%>" />
++
++ <fieldset class="cbi-section">
++ <fieldset 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 %>
++ <% if #stderr > 0 then %><pre class="error"><%=pcdata(stderr)%></pre><% end %>
++ </div>
++ <% end %>
++
++ <% if querypat then %>
++ <div class="cbi-value">
++ <%:Displaying only packages containing%> <strong>"<%=pcdata(query)%>"</strong>
++ <input type="button" onclick="location.href='?display=<%=pcdata(display)%>'" href="#" class="cbi-button cbi-button-reset" style="margin-left:1em" value="<%:Reset%>" />
++ <br style="clear:both" />
++ </div>
++ <% end %>
++
++ <% if no_lists or old_lists then %>
++ <div class="cbi-value">
++ <% if old_lists then %>
++ <%:Package lists are older than 24 hours%>
++ <% else %>
++ <%:No package lists available%>
++ <% end %>
++ <input type="submit" name="update" href="#" class="cbi-button cbi-button-apply" style="margin-left:3em" value="<%:Update lists%>" />
++ </div>
++ <% end %>
++
++ <div class="cbi-value cbi-value-last">
++ <%:Free space%>: <strong><%=(100-used_perc)%>%</strong> (<strong><%=wa.byte_format(free_byte)%></strong>)
++ <div style="margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080">
++ <div style="background-color:#F08080; border-right:1px solid #000000; height:100%; width:<%=used_perc%>%">&#160;</div>
++ </div>
++ </div>
++ </fieldset>
++
++ <br />
++
++ <fieldset 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="exec" value="<%:OK%>" />
++ </div>
++ </div>
++
++ <div class="cbi-value cbi-value-last">
++ <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%>" />
++ </div>
++ </div>
++ </fieldset>
++ </fieldset>
++ </form>
++
++
++ <h3><%:Status%></h3>
++
++
++ <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>
++ </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>
++ <% else %>
++ <fieldset class="cbi-section">
++ <% if not querypat then %>
++ <ul class="cbi-tabmenu">
++ <% 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>
++ <% end %>
++ </fieldset>
++ <% end %>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm
+new file mode 100644
+index 0000000..c955180
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm
+@@ -0,0 +1,59 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Reboot%></h2>
++<br />
++
++<p><%:Reboots the operating system of your device%></p>
++
++<%- local c = require("luci.model.uci").cursor():changes(); if c and next(c) then -%>
++ <p class="alert-message warning"><%:Warning: There are unsaved changes that will get lost on reboot!%></p>
++<%- end -%>
++
++<hr />
++
++<script type="text/javascript">//<![CDATA[
++ var tries = 0;
++
++ function ok() {
++ window.location = '<%=controller%>/admin';
++ }
++
++ function check() {
++ if (tries++ < 12)
++ window.setTimeout(ping, 5000);
++ else
++ alert('<%:Device unreachable%>');
++ }
++
++ function ping() {
++ var img = document.createElement('img');
++
++ img.onload = ok;
++ img.onerror = check;
++ img.src = '<%=resource%>/icons/loading.gif?' + Math.random();
++
++ document.getElementById('reboot-message').innerHTML = '<%:Waiting for device...%>';
++ }
++
++ function reboot(button) {
++ button.style.display = 'none';
++ document.getElementById('reboot-message').parentNode.style.display = '';
++
++ (new XHR()).post('<%=controller%>/admin/system/reboot/call', { token: '<%=token%>' }, check);
++ }
++//]]></script>
++
++<input class="cbi-button cbi-button-apply" 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" />
++ <span id="reboot-message"><%:Device is rebooting...%></span>
++</p>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/upgrade.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/upgrade.htm
+new file mode 100644
+index 0000000..5ca0398
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/upgrade.htm
+@@ -0,0 +1,57 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2009 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Flash Firmware%> - <%:Verify%></h2>
++<p>
++ <%_ The flash image was uploaded.
++ Below is the checksum and file size listed,
++ compare them with the original file to ensure data integrity.<br />
++ Click "Proceed" below to start the flash procedure. %>
++
++ <% if storage > 0 and size > storage then %>
++ <br /><br />
++ <div class="error"><%:It appears that you are trying to
++ flash an image that does not fit into the flash memory, please verify
++ the image file! %></div>
++ <% end %>
++
++</p>
++
++<fieldset class="cbi-section">
++ <ul>
++ <li><%:Checksum%>: <code><%=checksum%></code></li>
++ <li><%:Size%>: <%
++ local w = require "luci.tools.webadmin"
++ write(w.byte_format(size))
++
++ if storage > 0 then
++ write(luci.i18n.translatef(
++ " (%s available)",
++ w.byte_format(storage)
++ ))
++ end
++ %></li>
++ <li><% if keep then %>
++ <%:Configuration files will be kept.%>
++ <% else %>
++ <%:Note: Configuration files will be erased.%>
++ <% end %></li>
++ </ul>
++</fieldset>
++
++<div class="cbi-page-actions right">
++ <form class="inline" action="<%=REQUEST_URI%>" method="post">
++ <input type="hidden" name="token" value="<%=token%>" />
++ <input type="hidden" name="step" value="2" />
++ <input type="hidden" name="keep" value="<%=keep and "1" or ""%>" />
++ <input class="cbi-button cbi-button-reset" name="cancel" type="submit" value="<%:Cancel%>" />
++ <input class="cbi-button cbi-button-apply" type="submit" value="<%:Proceed%>" />
++ </form>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/apply.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/apply.htm
+new file mode 100644
+index 0000000..370027e
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/apply.htm
+@@ -0,0 +1,23 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Configuration%> / <%:Apply%></h2>
++
++<% if changes then %>
++ <%+cbi/apply_xhr%>
++ <%+admin_uci/changelog%>
++
++ <%- cbi_apply_xhr('uci-apply', configs) -%>
++
++ <p><strong><%:The following changes have been committed%>:</strong></p>
++ <%- uci_changelog(changes) -%>
++<% else %>
++ <p><strong><%:There are no pending changes to apply!%></strong></p>
++<% end %>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm
+new file mode 100644
+index 0000000..4ed4f0a
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm
+@@ -0,0 +1,79 @@
++<%#
++ Copyright 2010 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<% export("uci_changelog", function(changes) -%>
++<fieldset class="cbi-section">
++ <strong><%:Legend:%></strong>
++ <div class="uci-change-legend">
++ <div class="uci-change-legend-label"><ins>&#160;</ins> <%:Section added%></div>
++ <div class="uci-change-legend-label"><del>&#160;</del> <%:Section removed%></div>
++ <div class="uci-change-legend-label"><var><ins>&#160;</ins></var> <%:Option changed%></div>
++ <div class="uci-change-legend-label"><var><del>&#160;</del></var> <%:Option removed%></div>
++ <br style="clear:both" />
++ </div>
++ <br />
++
++ <div class="uci-change-list"><%
++ local util = luci.util
++ local ret = { }
++
++ for r, tbl in pairs(changes) do
++ for s, os in pairs(tbl) do
++ -- section add
++ if os['.type'] and os['.type'] ~= "" then
++ ret[#ret+1] = "<ins>%s.%s=<strong>%s</strong>" %{ r, s, os['.type'] }
++ for o, v in util.kspairs(os) do
++ if o:sub(1,1) ~= "." then
++ if type(v) == "table" then
++ local i
++ for i = 1, #v do
++ ret[#ret+1] = "<br />%s.%s.%s+=<strong>%s</strong>"
++ %{ r, s, o, util.pcdata(v[i]) }
++ end
++ else
++ ret[#ret+1] = "<br />%s.%s.%s=<strong>%s</strong>"
++ %{ r, s, o, util.pcdata(v) }
++ end
++ end
++ end
++ ret[#ret+1] = "</ins><br />"
++
++ -- section delete
++ elseif os['.type'] and os['.type'] == "" then
++ ret[#ret+1] = "<del>%s.<strong>%s</strong></del><br />" %{ r, s }
++
++ -- modifications
++ else
++ ret[#ret+1] = "<var>%s.%s<br />" %{ r, s }
++ for o, v in util.kspairs(os) do
++ if o:sub(1,1) ~= "." then
++ if v and #v > 0 then
++ ret[#ret+1] = "<ins>"
++ if type(v) == "table" then
++ local i
++ for i = 1, #v do
++ 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) }
++ end
++ ret[#ret+1] = "</ins>"
++ else
++ ret[#ret+1] = "<del>%s.%s.<strong>%s</strong><br /></del>" %{ r, s, o }
++ end
++ end
++ end
++ ret[#ret+1] = "</var><br />"
++ end
++ end
++ end
++
++ write(table.concat(ret))
++ %></div>
++</fieldset>
++<%- end) %>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm
+new file mode 100644
+index 0000000..c337360
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm
+@@ -0,0 +1,46 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Configuration%> / <%:Changes%></h2>
++
++<% if changes then %>
++ <%+admin_uci/changelog%>
++ <%- uci_changelog(changes) -%>
++<% else %>
++ <p><strong><%:There are no pending changes!%></strong></p>
++<% end %>
++
++<div class="cbi-page-actions">
++ <% local r = luci.http.formvalue("redir"); if r and #r > 0 then %>
++ <div style="float:left">
++ <form class="inline" method="get" action="<%=luci.util.pcdata(r)%>">
++ <input class="cbi-button cbi-button-link" style="float:left; margin:0" type="submit" value="<%:Back%>" />
++ </form>
++ </div>
++ <% end %>
++
++ <div style="text-align:right">
++ <form class="inline" method="post" action="<%=controller%>/admin/uci/apply">
++ <input type="hidden" name="token" value="<%=token%>" />
++ <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
++ <input class="cbi-button cbi-button-apply" type="submit" value="<%:Apply%>" />
++ </form>
++ <form class="inline" method="post" action="<%=controller%>/admin/uci/saveapply">
++ <input type="hidden" name="token" value="<%=token%>" />
++ <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
++ <input class="cbi-button cbi-button-save" type="submit" value="<%:Save & Apply%>" />
++ </form>
++ <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>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/revert.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/revert.htm
+new file mode 100644
+index 0000000..5da7281
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/revert.htm
+@@ -0,0 +1,27 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Configuration%> / <%:Revert%></h2>
++
++<% if changes then %>
++ <%+cbi/apply_xhr%>
++ <%+admin_uci/changelog%>
++
++ <p><strong><%:The following changes have been reverted%>:</strong></p>
++ <%- uci_changelog(changes) -%>
++<% else %>
++ <p><strong><%:There are no pending changes to revert!%></strong></p>
++<% end %>
++
++<div class="cbi-page-actions">
++ <form class="inline" method="get" action="<%=luci.util.pcdata(luci.http.formvalue("redir"))%>">
++ <input class="cbi-button cbi-button-link" style="margin:0" type="submit" value="<%:Back%>" />
++ </form>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/cbi/wireless_modefreq.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/cbi/wireless_modefreq.htm
+new file mode 100644
+index 0000000..ac14593
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/cbi/wireless_modefreq.htm
+@@ -0,0 +1,167 @@
++<%+cbi/valueheader%>
++
++<script type="text/javascript">//<![CDATA[
++ var freqlist = <%= luci.http.write_json(self.freqlist) %>;
++ var hwmodes = <%= luci.http.write_json(self.hwmodes) %>;
++
++ var channels = {
++ '11g': [
++ 'auto', 'auto', true
++ ],
++ '11a': [
++ 'auto', 'auto', true
++ ]
++ };
++
++ for (var i = 0; i < freqlist.length; i++)
++ channels[(freqlist[i].mhz > 2484) ? '11a' : '11g'].push(
++ freqlist[i].channel,
++ '%d (%d MHz)'.format(freqlist[i].channel, freqlist[i].mhz),
++ !freqlist[i].restricted
++ );
++
++ var modes = [
++ '', 'Legacy', true,
++ 'n', 'N', hwmodes.n,
++ 'ac', 'AC', hwmodes.ac
++ ];
++
++ var htmodes = {
++ '': [
++ '', '-', true
++ ],
++ 'n': [
++ 'HT20', '20 MHz', true,
++ 'HT40', '40 MHz', true
++ ],
++ 'ac': [
++ 'VHT20', '20 MHz', true,
++ 'VHT40', '40 MHz', true,
++ 'VHT80', '80 MHz', true,
++ 'VHT160', '160 MHz', true
++ ]
++ };
++
++ var bands = {
++ '': [
++ '11g', '2.4 GHz', (channels['11g'].length > 3),
++ '11a', '5 GHz', (channels['11a'].length > 3)
++ ],
++ 'n': [
++ '11g', '2.4 GHz', (channels['11g'].length > 3),
++ '11a', '5 GHz', (channels['11a'].length > 3)
++ ],
++ 'ac': [
++ '11a', '5 GHz', true
++ ]
++ };
++
++ function cbi_set_values(sel, vals)
++ {
++ if (sel.vals)
++ sel.vals.selected = sel.selectedIndex;
++
++ while (sel.options[0])
++ sel.remove(0);
++
++ for (var i = 0; vals && i < vals.length; i += 3)
++ {
++ if (!vals[i+2])
++ continue;
++
++ var opt = document.createElement('option');
++ opt.value = vals[i+0];
++ opt.text = vals[i+1];
++
++ sel.add(opt);
++ }
++
++ if (!isNaN(vals.selected))
++ sel.selectedIndex = vals.selected;
++
++ sel.parentNode.style.display = (sel.options.length <= 1) ? 'none' : '';
++ sel.vals = vals;
++ }
++
++ function cbi_toggle_wifi_mode(id)
++ {
++ cbi_toggle_wifi_htmode(id);
++ cbi_toggle_wifi_band(id);
++ }
++
++ function cbi_toggle_wifi_htmode(id)
++ {
++ var mode = document.getElementById(id + '.mode');
++ var bwdt = document.getElementById(id + '.htmode');
++
++ cbi_set_values(bwdt, htmodes[mode.value]);
++ }
++
++ function cbi_toggle_wifi_band(id)
++ {
++ var mode = document.getElementById(id + '.mode');
++ var band = document.getElementById(id + '.band');
++
++ cbi_set_values(band, bands[mode.value]);
++ cbi_toggle_wifi_channel(id);
++ }
++
++ function cbi_toggle_wifi_channel(id)
++ {
++ var band = document.getElementById(id + '.band');
++ var chan = document.getElementById(id + '.channel');
++
++ cbi_set_values(chan, channels[band.value]);
++ }
++
++ function cbi_init_wifi(id)
++ {
++ var mode = document.getElementById(id + '.mode');
++ var band = document.getElementById(id + '.band');
++ var chan = document.getElementById(id + '.channel');
++ var bwdt = document.getElementById(id + '.htmode');
++
++ cbi_set_values(mode, modes);
++
++ if (/VHT20|VHT40|VHT80|VHT160/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
++ mode.value = 'ac';
++ else if (/HT20|HT40/.test(<%= luci.http.write_json(self.map:get(section, "htmode")) %>))
++ mode.value = 'n';
++ else
++ mode.value = '';
++
++ cbi_toggle_wifi_mode(id);
++
++ if (/a/.test(<%= luci.http.write_json(self.map:get(section, "hwmode")) %>))
++ band.value = '11a';
++ else
++ band.value = '11g';
++
++ cbi_toggle_wifi_band(id);
++
++ bwdt.value = <%= luci.http.write_json(self.map:get(section, "htmode")) %>;
++ chan.value = <%= luci.http.write_json(self.map:get(section, "channel")) %>;
++ }
++//]]></script>
++
++<label style="float:left; margin-right:3px">
++ <%:Mode%><br />
++ <select style="width:auto" id="<%= cbid %>.mode" name="<%= cbid %>.mode" onchange="cbi_toggle_wifi_mode('<%= cbid %>')"></select>
++</label>
++<label style="float:left; margin-right:3px">
++ <%:Band%><br />
++ <select style="width:auto" id="<%= cbid %>.band" name="<%= cbid %>.band" onchange="cbi_toggle_wifi_band('<%= cbid %>')"></select>
++</label>
++<label style="float:left; margin-right:3px">
++ <%:Channel%><br />
++ <select style="width:auto" id="<%= cbid %>.channel" name="<%= cbid %>.channel"></select>
++</label>
++<label style="float:left; margin-right:3px">
++ <%:Width%><br />
++ <select style="width:auto" id="<%= cbid %>.htmode" name="<%= cbid %>.htmode"></select>
++</label>
++<br style="clear:left" />
++
++<script type="text/javascript">cbi_init_wifi('<%= cbid %>');</script>
++
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-mod-admin-full/src/Makefile b/feeds/luci/modules/luci-mod-admin-full/src/Makefile
+new file mode 100644
+index 0000000..d6ed8c6
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/src/Makefile
+@@ -0,0 +1,14 @@
++%.o: %.c
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(FPIC) -c -o $@ $<
++
++clean:
++ rm -f luci-bwc *.o
++
++luci-bwc: luci-bwc.o
++ $(CC) $(LDFLAGS) -o $@ $^ -ldl
++
++compile: luci-bwc
++
++install: compile
++ mkdir -p $(DESTDIR)/usr/bin
++ cp luci-bwc $(DESTDIR)/usr/bin/luci-bwc
+diff --git a/feeds/luci/modules/luci-mod-admin-full/src/luci-bwc.c b/feeds/luci/modules/luci-mod-admin-full/src/luci-bwc.c
+new file mode 100644
+index 0000000..63668d4
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-full/src/luci-bwc.c
+@@ -0,0 +1,778 @@
++/*
++ * luci-bwc - Very simple bandwidth collector cache for LuCI realtime graphs
++ *
++ * Copyright (C) 2010 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Licensed under the Apache License, Version 2.0 (the "License");
++ * you may not use this file except in compliance with the License.
++ * You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing, software
++ * distributed under the License is distributed on an "AS IS" BASIS,
++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++ * See the License for the specific language governing permissions and
++ * limitations under the License.
++ */
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <string.h>
++#include <stdint.h>
++#include <inttypes.h>
++#include <fcntl.h>
++#include <time.h>
++#include <errno.h>
++#include <unistd.h>
++#include <signal.h>
++
++#include <sys/stat.h>
++#include <sys/mman.h>
++#include <arpa/inet.h>
++
++#include <dlfcn.h>
++#include <iwinfo.h>
++
++#define STEP_COUNT 60
++#define STEP_TIME 1
++#define TIMEOUT 10
++
++#define PID_PATH "/var/run/luci-bwc.pid"
++
++#define DB_PATH "/var/lib/luci-bwc"
++#define DB_IF_FILE DB_PATH "/if/%s"
++#define DB_RD_FILE DB_PATH "/radio/%s"
++#define DB_CN_FILE DB_PATH "/connections"
++#define DB_LD_FILE DB_PATH "/load"
++
++#define IF_SCAN_PATTERN \
++ " %[^ :]:%u %u" \
++ " %*d %*d %*d %*d %*d %*d" \
++ " %u %u"
++
++#define LD_SCAN_PATTERN \
++ "%f %f %f"
++
++
++struct file_map {
++ int fd;
++ int size;
++ char *mmap;
++};
++
++struct traffic_entry {
++ uint32_t time;
++ uint32_t rxb;
++ uint32_t rxp;
++ uint32_t txb;
++ uint32_t txp;
++};
++
++struct conn_entry {
++ uint32_t time;
++ uint32_t udp;
++ uint32_t tcp;
++ uint32_t other;
++};
++
++struct load_entry {
++ uint32_t time;
++ uint16_t load1;
++ uint16_t load5;
++ uint16_t load15;
++};
++
++struct radio_entry {
++ uint32_t time;
++ uint16_t rate;
++ uint8_t rssi;
++ uint8_t noise;
++};
++
++static int readpid(void)
++{
++ int fd;
++ int pid = -1;
++ char buf[9] = { 0 };
++
++ if ((fd = open(PID_PATH, O_RDONLY)) > -1)
++ {
++ if (read(fd, buf, sizeof(buf)))
++ {
++ buf[8] = 0;
++ pid = atoi(buf);
++ }
++
++ close(fd);
++ }
++
++ return pid;
++}
++
++static int writepid(void)
++{
++ int fd;
++ int wlen;
++ char buf[9] = { 0 };
++
++ if ((fd = open(PID_PATH, O_WRONLY | O_CREAT | O_TRUNC, 0600)) > -1)
++ {
++ wlen = snprintf(buf, sizeof(buf), "%i", getpid());
++ write(fd, buf, wlen);
++ close(fd);
++
++ return 0;
++ }
++
++ return -1;
++}
++
++static int timeout = TIMEOUT;
++static int countdown = -1;
++
++static void reset_countdown(int sig)
++{
++ countdown = timeout;
++
++}
++
++
++static char *progname;
++static int prognamelen;
++
++static struct iwinfo_ops *backend = NULL;
++
++
++static int init_directory(char *path)
++{
++ char *p = path;
++
++ for (p = &path[1]; *p; p++)
++ {
++ if (*p == '/')
++ {
++ *p = 0;
++
++ if (mkdir(path, 0700) && (errno != EEXIST))
++ return -1;
++
++ *p = '/';
++ }
++ }
++
++ return 0;
++}
++
++static int init_file(char *path, int esize)
++{
++ int i, file;
++ char buf[sizeof(struct traffic_entry)] = { 0 };
++
++ if (init_directory(path))
++ return -1;
++
++ if ((file = open(path, O_WRONLY | O_CREAT, 0600)) >= 0)
++ {
++ for (i = 0; i < STEP_COUNT; i++)
++ {
++ if (write(file, buf, esize) < 0)
++ break;
++ }
++
++ close(file);
++
++ return 0;
++ }
++
++ return -1;
++}
++
++static inline uint32_t timeof(void *entry)
++{
++ return ntohl(((struct traffic_entry *)entry)->time);
++}
++
++static int update_file(const char *path, void *entry, int esize)
++{
++ int rv = -1;
++ int file;
++ char *map;
++
++ if ((file = open(path, O_RDWR)) >= 0)
++ {
++ map = mmap(NULL, esize * STEP_COUNT, PROT_READ | PROT_WRITE,
++ MAP_SHARED | MAP_LOCKED, file, 0);
++
++ if ((map != NULL) && (map != MAP_FAILED))
++ {
++ if (timeof(entry) > timeof(map + esize * (STEP_COUNT-1)))
++ {
++ memmove(map, map + esize, esize * (STEP_COUNT-1));
++ memcpy(map + esize * (STEP_COUNT-1), entry, esize);
++ }
++
++ munmap(map, esize * STEP_COUNT);
++
++ rv = 0;
++ }
++
++ close(file);
++ }
++
++ return rv;
++}
++
++static int mmap_file(const char *path, int esize, struct file_map *m)
++{
++ m->fd = -1;
++ m->size = -1;
++ m->mmap = NULL;
++
++ if ((m->fd = open(path, O_RDONLY)) >= 0)
++ {
++ m->size = STEP_COUNT * esize;
++ m->mmap = mmap(NULL, m->size, PROT_READ,
++ MAP_SHARED | MAP_LOCKED, m->fd, 0);
++
++ if ((m->mmap != NULL) && (m->mmap != MAP_FAILED))
++ return 0;
++ }
++
++ return -1;
++}
++
++static void umap_file(struct file_map *m)
++{
++ if ((m->mmap != NULL) && (m->mmap != MAP_FAILED))
++ munmap(m->mmap, m->size);
++
++ if (m->fd > -1)
++ close(m->fd);
++}
++
++static void * iw_open(void)
++{
++ return dlopen("/usr/lib/libiwinfo.so", RTLD_LAZY);
++}
++
++static int iw_update(
++ void *iw, const char *ifname, uint16_t *rate, uint8_t *rssi, uint8_t *noise
++) {
++ struct iwinfo_ops *(*probe)(const char *);
++ int val;
++
++ if (!backend)
++ {
++ probe = dlsym(iw, "iwinfo_backend");
++
++ if (!probe)
++ return 0;
++
++ backend = probe(ifname);
++
++ if (!backend)
++ return 0;
++ }
++
++ *rate = (backend->bitrate && !backend->bitrate(ifname, &val)) ? val : 0;
++ *rssi = (backend->signal && !backend->signal(ifname, &val)) ? val : 0;
++ *noise = (backend->noise && !backend->noise(ifname, &val)) ? val : 0;
++
++ return 1;
++}
++
++static void iw_close(void *iw)
++{
++ void (*finish)(void);
++
++ finish = dlsym(iw, "iwinfo_finish");
++
++ if (finish)
++ finish();
++
++ dlclose(iw);
++}
++
++
++static int update_ifstat(
++ const char *ifname, uint32_t rxb, uint32_t rxp, uint32_t txb, uint32_t txp
++) {
++ char path[1024];
++
++ struct stat s;
++ struct traffic_entry e;
++
++ snprintf(path, sizeof(path), DB_IF_FILE, ifname);
++
++ if (stat(path, &s))
++ {
++ if (init_file(path, sizeof(struct traffic_entry)))
++ {
++ fprintf(stderr, "Failed to init %s: %s\n",
++ path, strerror(errno));
++
++ return -1;
++ }
++ }
++
++ e.time = htonl(time(NULL));
++ e.rxb = htonl(rxb);
++ e.rxp = htonl(rxp);
++ e.txb = htonl(txb);
++ e.txp = htonl(txp);
++
++ return update_file(path, &e, sizeof(struct traffic_entry));
++}
++
++static int update_radiostat(
++ const char *ifname, uint16_t rate, uint8_t rssi, uint8_t noise
++) {
++ char path[1024];
++
++ struct stat s;
++ struct radio_entry e;
++
++ snprintf(path, sizeof(path), DB_RD_FILE, ifname);
++
++ if (stat(path, &s))
++ {
++ if (init_file(path, sizeof(struct radio_entry)))
++ {
++ fprintf(stderr, "Failed to init %s: %s\n",
++ path, strerror(errno));
++
++ return -1;
++ }
++ }
++
++ e.time = htonl(time(NULL));
++ e.rate = htons(rate);
++ e.rssi = rssi;
++ e.noise = noise;
++
++ return update_file(path, &e, sizeof(struct radio_entry));
++}
++
++static int update_cnstat(uint32_t udp, uint32_t tcp, uint32_t other)
++{
++ char path[1024];
++
++ struct stat s;
++ struct conn_entry e;
++
++ snprintf(path, sizeof(path), DB_CN_FILE);
++
++ if (stat(path, &s))
++ {
++ if (init_file(path, sizeof(struct conn_entry)))
++ {
++ fprintf(stderr, "Failed to init %s: %s\n",
++ path, strerror(errno));
++
++ return -1;
++ }
++ }
++
++ e.time = htonl(time(NULL));
++ e.udp = htonl(udp);
++ e.tcp = htonl(tcp);
++ e.other = htonl(other);
++
++ return update_file(path, &e, sizeof(struct conn_entry));
++}
++
++static int update_ldstat(uint16_t load1, uint16_t load5, uint16_t load15)
++{
++ char path[1024];
++
++ struct stat s;
++ struct load_entry e;
++
++ snprintf(path, sizeof(path), DB_LD_FILE);
++
++ if (stat(path, &s))
++ {
++ if (init_file(path, sizeof(struct load_entry)))
++ {
++ fprintf(stderr, "Failed to init %s: %s\n",
++ path, strerror(errno));
++
++ return -1;
++ }
++ }
++
++ e.time = htonl(time(NULL));
++ e.load1 = htons(load1);
++ e.load5 = htons(load5);
++ e.load15 = htons(load15);
++
++ return update_file(path, &e, sizeof(struct load_entry));
++}
++
++static int run_daemon(void)
++{
++ FILE *info;
++ uint32_t rxb, txb, rxp, txp;
++ uint32_t udp, tcp, other;
++ uint16_t rate;
++ uint8_t rssi, noise;
++ float lf1, lf5, lf15;
++ char line[1024];
++ char ifname[16];
++ int i;
++ void *iw;
++ struct sigaction sa;
++
++ struct stat s;
++ const char *ipc = stat("/proc/net/nf_conntrack", &s)
++ ? "/proc/net/ip_conntrack" : "/proc/net/nf_conntrack";
++
++ switch (fork())
++ {
++ case -1:
++ perror("fork()");
++ return -1;
++
++ case 0:
++ if (chdir("/") < 0)
++ {
++ perror("chdir()");
++ exit(1);
++ }
++
++ close(0);
++ close(1);
++ close(2);
++ break;
++
++ default:
++ return 0;
++ }
++
++ /* setup USR1 signal handler to reset timer */
++ sa.sa_handler = reset_countdown;
++ sa.sa_flags = SA_RESTART;
++ sigemptyset(&sa.sa_mask);
++ sigaction(SIGUSR1, &sa, NULL);
++
++ /* write pid */
++ if (writepid())
++ {
++ fprintf(stderr, "Failed to write pid file: %s\n", strerror(errno));
++ return 1;
++ }
++
++ /* initialize iwinfo */
++ iw = iw_open();
++
++ /* go */
++ for (reset_countdown(0); countdown >= 0; countdown--)
++ {
++ /* alter progname for ps, top */
++ memset(progname, 0, prognamelen);
++ snprintf(progname, prognamelen, "luci-bwc %d", countdown);
++
++ if ((info = fopen("/proc/net/dev", "r")) != NULL)
++ {
++ while (fgets(line, sizeof(line), info))
++ {
++ if (strchr(line, '|'))
++ continue;
++
++ if (sscanf(line, IF_SCAN_PATTERN, ifname, &rxb, &rxp, &txb, &txp))
++ {
++ if (strncmp(ifname, "lo", sizeof(ifname)))
++ update_ifstat(ifname, rxb, rxp, txb, txp);
++ }
++ }
++
++ fclose(info);
++ }
++
++ if (iw)
++ {
++ for (i = 0; i < 5; i++)
++ {
++#define iw_checkif(pattern) \
++ do { \
++ snprintf(ifname, sizeof(ifname), pattern, i); \
++ if (iw_update(iw, ifname, &rate, &rssi, &noise)) \
++ { \
++ update_radiostat(ifname, rate, rssi, noise); \
++ continue; \
++ } \
++ } while(0)
++
++ iw_checkif("wlan%d");
++ iw_checkif("ath%d");
++ iw_checkif("wl%d");
++ }
++ }
++
++ if ((info = fopen(ipc, "r")) != NULL)
++ {
++ udp = 0;
++ tcp = 0;
++ other = 0;
++
++ while (fgets(line, sizeof(line), info))
++ {
++ if (strstr(line, "TIME_WAIT"))
++ continue;
++
++ if (strstr(line, "src=127.0.0.1 ") &&
++ strstr(line, "dst=127.0.0.1 "))
++ continue;
++
++ if (sscanf(line, "%*s %*d %s", ifname) || sscanf(line, "%s %*d", ifname))
++ {
++ if (!strcmp(ifname, "tcp"))
++ tcp++;
++ else if (!strcmp(ifname, "udp"))
++ udp++;
++ else
++ other++;
++ }
++ }
++
++ update_cnstat(udp, tcp, other);
++
++ fclose(info);
++ }
++
++ if ((info = fopen("/proc/loadavg", "r")) != NULL)
++ {
++ if (fscanf(info, LD_SCAN_PATTERN, &lf1, &lf5, &lf15))
++ {
++ update_ldstat((uint16_t)(lf1 * 100),
++ (uint16_t)(lf5 * 100),
++ (uint16_t)(lf15 * 100));
++ }
++
++ fclose(info);
++ }
++
++ sleep(STEP_TIME);
++ }
++
++ unlink(PID_PATH);
++
++ if (iw)
++ iw_close(iw);
++
++ return 0;
++}
++
++static void check_daemon(void)
++{
++ int pid;
++
++ if ((pid = readpid()) < 0 || kill(pid, 0) < 0)
++ {
++ /* daemon ping failed, try to start it up */
++ if (run_daemon())
++ {
++ fprintf(stderr,
++ "Failed to ping daemon and unable to start it up: %s\n",
++ strerror(errno));
++
++ exit(1);
++ }
++ }
++ else if (kill(pid, SIGUSR1))
++ {
++ fprintf(stderr, "Failed to send signal: %s\n", strerror(errno));
++ exit(2);
++ }
++}
++
++static int run_dump_ifname(const char *ifname)
++{
++ int i;
++ char path[1024];
++ struct file_map m;
++ struct traffic_entry *e;
++
++ check_daemon();
++ snprintf(path, sizeof(path), DB_IF_FILE, ifname);
++
++ if (mmap_file(path, sizeof(struct traffic_entry), &m))
++ {
++ fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno));
++ return 1;
++ }
++
++ for (i = 0; i < m.size; i += sizeof(struct traffic_entry))
++ {
++ e = (struct traffic_entry *) &m.mmap[i];
++
++ if (!e->time)
++ continue;
++
++ printf("[ %u, %u, %" PRIu32
++ ", %u, %u ]%s\n",
++ ntohl(e->time),
++ ntohl(e->rxb), ntohl(e->rxp),
++ ntohl(e->txb), ntohl(e->txp),
++ ((i + sizeof(struct traffic_entry)) < m.size) ? "," : "");
++ }
++
++ umap_file(&m);
++
++ return 0;
++}
++
++static int run_dump_radio(const char *ifname)
++{
++ int i;
++ char path[1024];
++ struct file_map m;
++ struct radio_entry *e;
++
++ check_daemon();
++ snprintf(path, sizeof(path), DB_RD_FILE, ifname);
++
++ if (mmap_file(path, sizeof(struct radio_entry), &m))
++ {
++ fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno));
++ return 1;
++ }
++
++ for (i = 0; i < m.size; i += sizeof(struct radio_entry))
++ {
++ e = (struct radio_entry *) &m.mmap[i];
++
++ if (!e->time)
++ continue;
++
++ printf("[ %u, %d, %d, %d ]%s\n",
++ ntohl(e->time),
++ e->rate, e->rssi, e->noise,
++ ((i + sizeof(struct radio_entry)) < m.size) ? "," : "");
++ }
++
++ umap_file(&m);
++
++ return 0;
++}
++
++static int run_dump_conns(void)
++{
++ int i;
++ char path[1024];
++ struct file_map m;
++ struct conn_entry *e;
++
++ check_daemon();
++ snprintf(path, sizeof(path), DB_CN_FILE);
++
++ if (mmap_file(path, sizeof(struct conn_entry), &m))
++ {
++ fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno));
++ return 1;
++ }
++
++ for (i = 0; i < m.size; i += sizeof(struct conn_entry))
++ {
++ e = (struct conn_entry *) &m.mmap[i];
++
++ if (!e->time)
++ continue;
++
++ printf("[ %u, %u, %u, %u ]%s\n",
++ ntohl(e->time), ntohl(e->udp),
++ ntohl(e->tcp), ntohl(e->other),
++ ((i + sizeof(struct conn_entry)) < m.size) ? "," : "");
++ }
++
++ umap_file(&m);
++
++ return 0;
++}
++
++static int run_dump_load(void)
++{
++ int i;
++ char path[1024];
++ struct file_map m;
++ struct load_entry *e;
++
++ check_daemon();
++ snprintf(path, sizeof(path), DB_LD_FILE);
++
++ if (mmap_file(path, sizeof(struct load_entry), &m))
++ {
++ fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno));
++ return 1;
++ }
++
++ for (i = 0; i < m.size; i += sizeof(struct load_entry))
++ {
++ e = (struct load_entry *) &m.mmap[i];
++
++ if (!e->time)
++ continue;
++
++ printf("[ %u, %u, %u, %u ]%s\n",
++ ntohl(e->time),
++ ntohs(e->load1), ntohs(e->load5), ntohs(e->load15),
++ ((i + sizeof(struct load_entry)) < m.size) ? "," : "");
++ }
++
++ umap_file(&m);
++
++ return 0;
++}
++
++
++int main(int argc, char *argv[])
++{
++ int opt;
++
++ progname = argv[0];
++ prognamelen = -1;
++
++ for (opt = 0; opt < argc; opt++)
++ prognamelen += 1 + strlen(argv[opt]);
++
++ while ((opt = getopt(argc, argv, "t:i:r:cl")) > -1)
++ {
++ switch (opt)
++ {
++ case 't':
++ timeout = atoi(optarg);
++ break;
++
++ case 'i':
++ if (optarg)
++ return run_dump_ifname(optarg);
++ break;
++
++ case 'r':
++ if (optarg)
++ return run_dump_radio(optarg);
++ break;
++
++ case 'c':
++ return run_dump_conns();
++
++ case 'l':
++ return run_dump_load();
++
++ default:
++ break;
++ }
++ }
++
++ fprintf(stderr,
++ "Usage:\n"
++ " %s [-t timeout] -i ifname\n"
++ " %s [-t timeout] -r radiodev\n"
++ " %s [-t timeout] -c\n"
++ " %s [-t timeout] -l\n",
++ argv[0], argv[0], argv[0], argv[0]
++ );
++
++ return 1;
++}
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/Makefile b/feeds/luci/modules/luci-mod-admin-mini/Makefile
+new file mode 100644
+index 0000000..5da4caf
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/Makefile
+@@ -0,0 +1,15 @@
++#
++# 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_TITLE:=LuCI Essentials - stripped down and user-friendly
++LUCI_DEPENDS:=+luci-base @BROKEN
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
++
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/index.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/index.lua
+new file mode 100644
+index 0000000..dd25f2c
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/index.lua
+@@ -0,0 +1,39 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.mini.index", package.seeall)
++
++function index()
++ local root = node()
++ if not root.lock then
++ root.target = alias("mini")
++ root.index = true
++ end
++
++ entry({"about"}, template("about"))
++
++ local page = entry({"mini"}, alias("mini", "index"), _("Essentials"), 10)
++ page.sysauth = "root"
++ page.sysauth_authenticator = "htmlauth"
++ page.index = true
++
++ entry({"mini", "index"}, alias("mini", "index", "index"), _("Overview"), 10).index = true
++ entry({"mini", "index", "index"}, form("mini/index"), _("General"), 1).ignoreindex = true
++ entry({"mini", "index", "luci"}, cbi("mini/luci", {autoapply=true}), _("Settings"), 10)
++ entry({"mini", "index", "logout"}, call("action_logout"), _("Logout"))
++end
++
++function action_logout()
++ local dsp = require "luci.dispatcher"
++ local utl = require "luci.util"
++ if dsp.context.authsession then
++ utl.ubus("session", "destroy", {
++ ubus_rpc_session = dsp.context.authsession
++ })
++ dsp.context.urltoken.stok = nil
++ end
++
++ luci.http.header("Set-Cookie", "sysauth=; path=" .. dsp.build_url())
++ luci.http.redirect(luci.dispatcher.build_url())
++end
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/network.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/network.lua
+new file mode 100644
+index 0000000..0b74c41
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/network.lua
+@@ -0,0 +1,12 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.mini.network", package.seeall)
++
++function index()
++ entry({"mini", "network"}, alias("mini", "network", "index"), _("Network"), 20).index = true
++ entry({"mini", "network", "index"}, cbi("mini/network", {autoapply=true}), _("General"), 1)
++ entry({"mini", "network", "wifi"}, cbi("mini/wifi", {autoapply=true}), _("Wifi"), 10)
++ entry({"mini", "network", "dhcp"}, cbi("mini/dhcp", {autoapply=true}), _("DHCP"), 20)
++end
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/system.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/system.lua
+new file mode 100644
+index 0000000..74a5ae4
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/system.lua
+@@ -0,0 +1,235 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.mini.system", package.seeall)
++
++function index()
++ entry({"mini", "system"}, alias("mini", "system", "index"), _("System"), 40).index = true
++ entry({"mini", "system", "index"}, cbi("mini/system", {autoapply=true}), _("General"), 1)
++ entry({"mini", "system", "passwd"}, form("mini/passwd"), _("Admin Password"), 10)
++ entry({"mini", "system", "backup"}, call("action_backup"), _("Backup / Restore"), 80)
++ entry({"mini", "system", "upgrade"}, call("action_upgrade"), _("Flash Firmware"), 90)
++ entry({"mini", "system", "reboot"}, call("action_reboot"), _("Reboot"), 100)
++end
++
++function action_backup()
++ local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0
++ local restore_cmd = "gunzip | tar -xC/ >/dev/null 2>&1"
++ local backup_cmd = "tar -c %s | gzip 2>/dev/null"
++
++ local restore_fpi
++ luci.http.setfilehandler(
++ function(meta, chunk, eof)
++ if not restore_fpi then
++ restore_fpi = io.popen(restore_cmd, "w")
++ end
++ if chunk then
++ restore_fpi:write(chunk)
++ end
++ if eof then
++ restore_fpi:close()
++ end
++ end
++ )
++
++ local upload = luci.http.formvalue("archive")
++ local backup = luci.http.formvalue("backup")
++ local reset = reset_avail and luci.http.formvalue("reset")
++
++ if upload and #upload > 0 then
++ luci.template.render("mini/applyreboot")
++ luci.sys.reboot()
++ elseif backup then
++ local reader = ltn12_popen(backup_cmd:format(_keep_pattern()))
++ luci.http.header('Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' % {
++ luci.sys.hostname(), os.date("%Y-%m-%d")})
++ luci.http.prepare_content("application/x-targz")
++ luci.ltn12.pump.all(reader, luci.http.write)
++ elseif reset then
++ luci.template.render("mini/applyreboot")
++ luci.util.exec("mtd -r erase rootfs_data")
++ else
++ luci.template.render("mini/backup", {reset_avail = reset_avail})
++ end
++end
++
++function action_reboot()
++ local reboot = luci.http.formvalue("reboot")
++ luci.template.render("mini/reboot", {reboot=reboot})
++ if reboot then
++ luci.sys.reboot()
++ end
++end
++
++function action_upgrade()
++ require("luci.model.uci")
++
++ local tmpfile = "/tmp/firmware.img"
++
++ local function image_supported()
++ -- XXX: yay...
++ return ( 0 == os.execute(
++ ". /lib/functions.sh; " ..
++ "include /lib/upgrade; " ..
++ "platform_check_image %q >/dev/null"
++ % tmpfile
++ ) )
++ end
++
++ local function image_checksum()
++ return (luci.sys.exec("md5sum %q" % tmpfile):match("^([^%s]+)"))
++ end
++
++ local function storage_size()
++ local size = 0
++ if nixio.fs.access("/proc/mtd") then
++ for l in io.lines("/proc/mtd") do
++ local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
++ if n == "linux" then
++ size = tonumber(s, 16)
++ break
++ end
++ end
++ elseif nixio.fs.access("/proc/partitions") then
++ for l in io.lines("/proc/partitions") do
++ local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
++ if b and n and not n:match('[0-9]') then
++ size = tonumber(b) * 1024
++ break
++ end
++ end
++ end
++ return size
++ end
++
++
++ -- Install upload handler
++ local file
++ luci.http.setfilehandler(
++ function(meta, chunk, eof)
++ if not nixio.fs.access(tmpfile) and not file and chunk and #chunk > 0 then
++ file = io.open(tmpfile, "w")
++ end
++ if file and chunk then
++ file:write(chunk)
++ end
++ if file and eof then
++ file:close()
++ end
++ end
++ )
++
++
++ -- Determine state
++ local keep_avail = true
++ local step = tonumber(luci.http.formvalue("step") or 1)
++ local has_image = nixio.fs.access(tmpfile)
++ local has_support = image_supported()
++ local has_platform = nixio.fs.access("/lib/upgrade/platform.sh")
++ local has_upload = luci.http.formvalue("image")
++
++ -- This does the actual flashing which is invoked inside an iframe
++ -- so don't produce meaningful errors here because the the
++ -- previous pages should arrange the stuff as required.
++ if step == 4 then
++ if has_platform and has_image and has_support then
++ -- Mimetype text/plain
++ luci.http.prepare_content("text/plain")
++ luci.http.write("Starting luci-flash...\n")
++
++ -- Now invoke sysupgrade
++ local keepcfg = keep_avail and luci.http.formvalue("keepcfg") == "1"
++ local flash = ltn12_popen("/sbin/luci-flash %s %q" %{
++ keepcfg and "-k %q" % _keep_pattern() or "", tmpfile
++ })
++
++ luci.ltn12.pump.all(flash, luci.http.write)
++
++ -- Make sure the device is rebooted
++ luci.sys.reboot()
++ end
++
++
++ --
++ -- This is step 1-3, which does the user interaction and
++ -- image upload.
++ --
++
++ -- Step 1: file upload, error on unsupported image format
++ elseif not has_image or not has_support or step == 1 then
++ -- If there is an image but user has requested step 1
++ -- or type is not supported, then remove it.
++ if has_image then
++ nixio.fs.unlink(tmpfile)
++ end
++
++ luci.template.render("mini/upgrade", {
++ step=1,
++ bad_image=(has_image and not has_support or false),
++ keepavail=keep_avail,
++ supported=has_platform
++ } )
++
++ -- Step 2: present uploaded file, show checksum, confirmation
++ elseif step == 2 then
++ luci.template.render("mini/upgrade", {
++ step=2,
++ checksum=image_checksum(),
++ filesize=nixio.fs.stat(tmpfile).size,
++ flashsize=storage_size(),
++ keepconfig=(keep_avail and luci.http.formvalue("keepcfg") == "1")
++ } )
++
++ -- Step 3: load iframe which calls the actual flash procedure
++ elseif step == 3 then
++ luci.template.render("mini/upgrade", {
++ step=3,
++ keepconfig=(keep_avail and luci.http.formvalue("keepcfg") == "1")
++ } )
++ end
++end
++
++function _keep_pattern()
++ local kpattern = ""
++ local files = luci.model.uci.cursor():get_all("luci", "flash_keep")
++ if files then
++ kpattern = ""
++ for k, v in pairs(files) do
++ if k:sub(1,1) ~= "." and nixio.fs.glob(v)() then
++ kpattern = kpattern .. " " .. v
++ end
++ end
++ end
++ return kpattern
++end
++
++function ltn12_popen(command)
++
++ local fdi, fdo = nixio.pipe()
++ local pid = nixio.fork()
++
++ if pid > 0 then
++ fdo:close()
++ local close
++ return function()
++ local buffer = fdi:read(2048)
++ local wpid, stat = nixio.waitpid(pid, "nohang")
++ if not close and wpid and stat == "exited" then
++ close = true
++ end
++
++ if buffer and #buffer > 0 then
++ return buffer
++ elseif close then
++ fdi:close()
++ return nil
++ end
++ end
++ elseif pid == 0 then
++ nixio.dup(fdo, nixio.stdout)
++ fdi:close()
++ fdo:close()
++ nixio.exec("/bin/sh", "-c", command)
++ end
++end
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/dhcp.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/dhcp.lua
+new file mode 100644
+index 0000000..9a1c1fe
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/dhcp.lua
+@@ -0,0 +1,98 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local uci = require "luci.model.uci".cursor()
++local ipc = require "luci.ip"
++local wa = require "luci.tools.webadmin"
++local fs = require "nixio.fs"
++
++m = Map("dhcp", "DHCP")
++
++s = m:section(TypedSection, "dhcp", "DHCP-Server")
++s.anonymous = true
++s.addremove = false
++s.dynamic = false
++
++s:depends("interface", "lan")
++
++enable = s:option(ListValue, "ignore", translate("enable"), "")
++enable:value(0, translate("enable"))
++enable:value(1, translate("disable"))
++
++start = s:option(Value, "start", translate("First leased address"))
++start.rmempty = true
++start:depends("ignore", "0")
++
++
++limit = s:option(Value, "limit", translate("Number of leased addresses"), "")
++limit:depends("ignore", "0")
++
++function limit.cfgvalue(self, section)
++ local value = Value.cfgvalue(self, section)
++
++ if value then
++ return tonumber(value) + 1
++ end
++end
++
++function limit.write(self, section, value)
++ value = tonumber(value) - 1
++ return Value.write(self, section, value)
++end
++
++limit.rmempty = true
++
++time = s:option(Value, "leasetime")
++time:depends("ignore", "0")
++time.rmempty = true
++
++
++local leasefn, leasefp, leases
++uci:foreach("dhcp", "dnsmasq",
++ function(section)
++ leasefn = section.leasefile
++ end
++)
++local leasefp = leasefn and fs.access(leasefn) and io.lines(leasefn)
++if leasefp then
++ leases = {}
++ for lease in leasefp do
++ table.insert(leases, luci.util.split(lease, " "))
++ end
++end
++
++if leases then
++ v = m:section(Table, leases, translate("Active Leases"))
++ name = v:option(DummyValue, 4, translate("Hostname"))
++ function name.cfgvalue(self, ...)
++ local value = DummyValue.cfgvalue(self, ...)
++ return (value == "*") and "?" or value
++ end
++ ip = v:option(DummyValue, 3, translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"))
++ mac = v:option(DummyValue, 2, translate("<abbr title=\"Media Access Control\">MAC</abbr>-Address"))
++ ltime = v:option(DummyValue, 1, translate("Leasetime remaining"))
++ function ltime.cfgvalue(self, ...)
++ local value = DummyValue.cfgvalue(self, ...)
++ return wa.date_format(os.difftime(tonumber(value), os.time()))
++ end
++end
++
++s2 = m:section(TypedSection, "host", translate("Static Leases"))
++s2.addremove = true
++s2.anonymous = true
++s2.template = "cbi/tblsection"
++
++name = s2:option(Value, "name", translate("Hostname"))
++mac = s2:option(Value, "mac", translate("<abbr title=\"Media Access Control\">MAC</abbr>-Address"))
++ip = s2:option(Value, "ip", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"))
++
++ipc.neighbors({ family = 4 }, function(n)
++ if n.mac and n.dest then
++ ip:value(n.dest:string())
++ mac:value(n.mac, "%s (%s)" %{ n.mac, n.dest:string() })
++ end
++end)
++
++return m
++
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/index.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/index.lua
+new file mode 100644
+index 0000000..9ecee1a
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/index.lua
+@@ -0,0 +1,4 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++return Template("mini/index")
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/luci.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/luci.lua
+new file mode 100644
+index 0000000..a1ef0fe
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/luci.lua
+@@ -0,0 +1,37 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require "luci.config"
++local fs = require "nixio.fs"
++
++m = Map("luci", translate("Web <abbr title=\"User Interface\">UI</abbr>"), translate("Here you can customize the settings and the functionality of <abbr title=\"Lua Configuration Interface\">LuCI</abbr>."))
++
++-- force reload of global luci config namespace to reflect the changes
++function m.commit_handler(self)
++ package.loaded["luci.config"] = nil
++ require "luci.config"
++end
++
++
++c = m:section(NamedSection, "main", "core", translate("General"))
++
++l = c:option(ListValue, "lang", translate("Language"))
++l:value("auto")
++
++local i18ndir = luci.i18n.i18ndir .. "base."
++for k, v in luci.util.kspairs(luci.config.languages) do
++ local file = i18ndir .. k:gsub("_", "-")
++ if k:sub(1, 1) ~= "." and fs.access(file .. ".lmo") then
++ l:value(k, v)
++ end
++end
++
++t = c:option(ListValue, "mediaurlbase", translate("Design"))
++for k, v in pairs(luci.config.themes) do
++ if k:sub(1, 1) ~= "." then
++ t:value(v, k)
++ end
++end
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/network.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/network.lua
+new file mode 100644
+index 0000000..c895430
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/network.lua
+@@ -0,0 +1,194 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local wa = require "luci.tools.webadmin"
++local sys = require "luci.sys"
++local fs = require "nixio.fs"
++
++local has_pptp = fs.access("/usr/sbin/pptp")
++local has_pppoe = fs.glob("/usr/lib/pppd/*/rp-pppoe.so")()
++
++local network = luci.model.uci.cursor_state():get_all("network")
++
++local netstat = sys.net.deviceinfo()
++local ifaces = {}
++
++for k, v in pairs(network) do
++ if v[".type"] == "interface" and k ~= "loopback" then
++ table.insert(ifaces, v)
++ end
++end
++
++m = Map("network", translate("Network"))
++s = m:section(Table, ifaces, translate("Status"))
++s.parse = function() end
++
++s:option(DummyValue, ".name", translate("Network"))
++
++hwaddr = s:option(DummyValue, "_hwaddr",
++ translate("<abbr title=\"Media Access Control\">MAC</abbr>-Address"), translate("Hardware Address"))
++function hwaddr.cfgvalue(self, section)
++ local ix = self.map:get(section, "ifname") or ""
++ local mac = fs.readfile("/sys/class/net/" .. ix .. "/address")
++
++ if not mac then
++ mac = luci.util.exec("ifconfig " .. ix)
++ mac = mac and mac:match(" ([A-F0-9:]+)%s*\n")
++ end
++
++ if mac and #mac > 0 then
++ return mac:upper()
++ end
++
++ return "?"
++end
++
++
++s:option(DummyValue, "ipaddr", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"))
++
++s:option(DummyValue, "netmask", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"))
++
++
++txrx = s:option(DummyValue, "_txrx",
++ translate("Traffic"), translate("transmitted / received"))
++
++function txrx.cfgvalue(self, section)
++ local ix = self.map:get(section, "ifname")
++
++ local rx = netstat and netstat[ix] and netstat[ix][1]
++ rx = rx and wa.byte_format(tonumber(rx)) or "-"
++
++ local tx = netstat and netstat[ix] and netstat[ix][9]
++ tx = tx and wa.byte_format(tonumber(tx)) or "-"
++
++ return string.format("%s / %s", tx, rx)
++end
++
++errors = s:option(DummyValue, "_err",
++ translate("Errors"), translate("TX / RX"))
++
++function errors.cfgvalue(self, section)
++ local ix = self.map:get(section, "ifname")
++
++ local rx = netstat and netstat[ix] and netstat[ix][3]
++ local tx = netstat and netstat[ix] and netstat[ix][11]
++
++ rx = rx and tostring(rx) or "-"
++ tx = tx and tostring(tx) or "-"
++
++ return string.format("%s / %s", tx, rx)
++end
++
++
++
++s = m:section(NamedSection, "lan", "interface", translate("Local Network"))
++s.addremove = false
++s:option(Value, "ipaddr", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"))
++
++nm = s:option(Value, "netmask", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"))
++nm:value("255.255.255.0")
++nm:value("255.255.0.0")
++nm:value("255.0.0.0")
++
++gw = s:option(Value, "gateway", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway") .. translate(" (optional)"))
++gw.rmempty = true
++dns = s:option(Value, "dns", translate("<abbr title=\"Domain Name System\">DNS</abbr>-Server") .. translate(" (optional)"))
++dns.rmempty = true
++
++
++s = m:section(NamedSection, "wan", "interface", translate("Internet Connection"))
++s.addremove = false
++p = s:option(ListValue, "proto", translate("Protocol"))
++p.override_values = true
++p:value("none", "disabled")
++p:value("static", translate("manual"))
++p:value("dhcp", translate("automatic"))
++if has_pppoe then p:value("pppoe", "PPPoE") end
++if has_pptp then p:value("pptp", "PPTP") end
++
++function p.write(self, section, value)
++ -- Always set defaultroute to PPP and use remote dns
++ -- Overwrite a bad variable behaviour in OpenWrt
++ if value == "pptp" or value == "pppoe" then
++ self.map:set(section, "peerdns", "1")
++ self.map:set(section, "defaultroute", "1")
++ end
++ return ListValue.write(self, section, value)
++end
++
++if not ( has_pppoe and has_pptp ) then
++ p.description = translate("You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP support")
++end
++
++
++ip = s:option(Value, "ipaddr", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"))
++ip:depends("proto", "static")
++
++nm = s:option(Value, "netmask", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Netmask"))
++nm:depends("proto", "static")
++
++gw = s:option(Value, "gateway", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Gateway"))
++gw:depends("proto", "static")
++gw.rmempty = true
++
++dns = s:option(Value, "dns", translate("<abbr title=\"Domain Name System\">DNS</abbr>-Server"))
++dns:depends("proto", "static")
++dns.rmempty = true
++
++usr = s:option(Value, "username", translate("Username"))
++usr:depends("proto", "pppoe")
++usr:depends("proto", "pptp")
++
++pwd = s:option(Value, "password", translate("Password"))
++pwd.password = true
++pwd:depends("proto", "pppoe")
++pwd:depends("proto", "pptp")
++
++
++-- Allow user to set MSS correction here if the UCI firewall is installed
++-- This cures some cancer for providers with pre-war routers
++if fs.access("/etc/config/firewall") then
++ mssfix = s:option(Flag, "_mssfix",
++ translate("Clamp Segment Size"), translate("Fixes problems with unreachable websites, submitting forms or other unexpected behaviour for some ISPs."))
++ mssfix.rmempty = false
++
++ function mssfix.cfgvalue(self)
++ local value
++ m.uci:foreach("firewall", "forwarding", function(s)
++ if s.src == "lan" and s.dest == "wan" then
++ value = s.mtu_fix
++ end
++ end)
++ return value
++ end
++
++ function mssfix.write(self, section, value)
++ m.uci:foreach("firewall", "forwarding", function(s)
++ if s.src == "lan" and s.dest == "wan" then
++ m.uci:set("firewall", s[".name"], "mtu_fix", value)
++ m:chain("firewall")
++ end
++ end)
++ end
++end
++
++kea = s:option(Flag, "keepalive", translate("automatically reconnect"))
++kea:depends("proto", "pppoe")
++kea:depends("proto", "pptp")
++kea.rmempty = true
++kea.enabled = "10"
++
++
++cod = s:option(Value, "demand", translate("disconnect when idle for"), "s")
++cod:depends("proto", "pppoe")
++cod:depends("proto", "pptp")
++cod.rmempty = true
++
++srv = s:option(Value, "server", translate("<abbr title=\"Point-to-Point Tunneling Protocol\">PPTP</abbr>-Server"))
++srv:depends("proto", "pptp")
++srv.rmempty = true
++
++
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/passwd.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/passwd.lua
+new file mode 100644
+index 0000000..39123a7
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/passwd.lua
+@@ -0,0 +1,35 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++f = SimpleForm("password", translate("Admin Password"), translate("Change the password of the system administrator (User <code>root</code>)"))
++
++pw1 = f:field(Value, "pw1", translate("Password"))
++pw1.password = true
++pw1.rmempty = false
++
++pw2 = f:field(Value, "pw2", translate("Confirmation"))
++pw2.password = true
++pw2.rmempty = false
++
++function pw2.validate(self, value, section)
++ return pw1:formvalue(section) == value and value
++end
++
++function f.handle(self, state, data)
++ if state == FORM_VALID then
++ local stat = luci.sys.user.setpasswd("root", data.pw1) == 0
++
++ if stat then
++ f.message = translate("Password successfully changed")
++ else
++ f.errmessage = translate("Unknown Error")
++ end
++
++ data.pw1 = nil
++ data.pw2 = nil
++ end
++ return true
++end
++
++return f
+\ No newline at end of file
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/system.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/system.lua
+new file mode 100644
+index 0000000..b621ad0
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/system.lua
+@@ -0,0 +1,76 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++require("luci.sys")
++require("luci.sys.zoneinfo")
++require("luci.tools.webadmin")
++require("luci.util")
++
++
++m = Map("system", translate("System"), translate("Here you can configure the basic aspects of your device like its hostname or the timezone."))
++
++s = m:section(TypedSection, "system", "")
++s.anonymous = true
++s.addremove = false
++
++
++local sysinfo = luci.util.ubus("system", "info") or { }
++local boardinfo = luci.util.ubus("system", "board") or { }
++
++local uptime = sysinfo.uptime or 0
++local loads = sysinfo.load or { 0, 0, 0 }
++local memory = sysinfo.memory or {
++ total = 0,
++ free = 0,
++ buffered = 0,
++ shared = 0
++}
++
++s:option(DummyValue, "_system", translate("Model")).value = boardinfo.model or "?"
++s:option(DummyValue, "_cpu", translate("System")).value = boardinfo.system or "?"
++
++s:option(DummyValue, "_la", translate("Load")).value =
++ string.format("%.2f, %.2f, %.2f", loads[1] / 65535.0, loads[2] / 65535.0, loads[3] / 65535.0)
++
++s:option(DummyValue, "_memtotal", translate("Memory")).value =
++ string.format("%.2f MB (%.0f%% %s, %.0f%% %s)",
++ tonumber(memory.total) / 1024 / 1024,
++ 100 * memory.buffered / memory.total,
++ tostring(translate("buffered")),
++ 100 * memory.free / memory.total,
++ tostring(translate("free"))
++)
++
++s:option(DummyValue, "_systime", translate("Local Time")).value =
++ os.date("%c")
++
++s:option(DummyValue, "_uptime", translate("Uptime")).value =
++ luci.tools.webadmin.date_format(tonumber(uptime))
++
++hn = s:option(Value, "hostname", translate("Hostname"))
++
++function hn.write(self, section, value)
++ Value.write(self, section, value)
++ luci.sys.hostname(value)
++end
++
++
++tz = s:option(ListValue, "zonename", translate("Timezone"))
++tz:value("UTC")
++
++for i, zone in ipairs(luci.sys.zoneinfo.TZ) do
++ tz:value(zone[1])
++end
++
++function tz.write(self, section, value)
++ local function lookup_zone(title)
++ for _, zone in ipairs(luci.sys.zoneinfo.TZ) do
++ if zone[1] == title then return zone[2] end
++ end
++ end
++
++ AbstractValue.write(self, section, value)
++ self.map.uci:set("system", section, "timezone", lookup_zone(value) or "GMT0")
++end
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/wifi.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/wifi.lua
+new file mode 100644
+index 0000000..0729c44
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/wifi.lua
+@@ -0,0 +1,362 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++-- Data init --
++
++local fs = require "nixio.fs"
++local sys = require "luci.sys"
++local uci = require "luci.model.uci".cursor()
++
++if not uci:get("network", "wan") then
++ uci:section("network", "interface", "wan", {proto="none", ifname=" "})
++ uci:save("network")
++ uci:commit("network")
++end
++
++local wlcursor = luci.model.uci.cursor_state()
++local wireless = wlcursor:get_all("wireless")
++local wifidevs = {}
++local ifaces = {}
++
++for k, v in pairs(wireless) do
++ if v[".type"] == "wifi-iface" then
++ table.insert(ifaces, v)
++ end
++end
++
++wlcursor:foreach("wireless", "wifi-device",
++ function(section)
++ table.insert(wifidevs, section[".name"])
++ end)
++
++
++-- Main Map --
++
++m = Map("wireless", translate("Wifi"), translate("Here you can configure installed wifi devices."))
++m:chain("network")
++
++
++-- Status Table --
++s = m:section(Table, ifaces, translate("Networks"))
++
++link = s:option(DummyValue, "_link", translate("Link"))
++function link.cfgvalue(self, section)
++ local ifname = self.map:get(section, "ifname")
++ local iwinfo = sys.wifi.getiwinfo(ifname)
++ return iwinfo and "%d/%d" %{ iwinfo.quality, iwinfo.quality_max } or "-"
++end
++
++essid = s:option(DummyValue, "ssid", "ESSID")
++
++bssid = s:option(DummyValue, "_bsiid", "BSSID")
++function bssid.cfgvalue(self, section)
++ local ifname = self.map:get(section, "ifname")
++ local iwinfo = sys.wifi.getiwinfo(ifname)
++ return iwinfo and iwinfo.bssid or "-"
++end
++
++channel = s:option(DummyValue, "channel", translate("Channel"))
++function channel.cfgvalue(self, section)
++ return wireless[self.map:get(section, "device")].channel
++end
++
++protocol = s:option(DummyValue, "_mode", translate("Protocol"))
++function protocol.cfgvalue(self, section)
++ local mode = wireless[self.map:get(section, "device")].mode
++ return mode and "802." .. mode
++end
++
++mode = s:option(DummyValue, "mode", translate("Mode"))
++encryption = s:option(DummyValue, "encryption", translate("<abbr title=\"Encrypted\">Encr.</abbr>"))
++
++power = s:option(DummyValue, "_power", translate("Power"))
++function power.cfgvalue(self, section)
++ local ifname = self.map:get(section, "ifname")
++ local iwinfo = sys.wifi.getiwinfo(ifname)
++ return iwinfo and "%d dBm" % iwinfo.txpower or "-"
++end
++
++scan = s:option(Button, "_scan", translate("Scan"))
++scan.inputstyle = "find"
++
++function scan.cfgvalue(self, section)
++ return self.map:get(section, "ifname") or false
++end
++
++-- WLAN-Scan-Table --
++
++t2 = m:section(Table, {}, translate("<abbr title=\"Wireless Local Area Network\">WLAN</abbr>-Scan"), translate("Wifi networks in your local environment"))
++
++function scan.write(self, section)
++ m.autoapply = false
++ t2.render = t2._render
++ local ifname = self.map:get(section, "ifname")
++ local iwinfo = sys.wifi.getiwinfo(ifname)
++ if iwinfo then
++ local _, cell
++ for _, cell in ipairs(iwinfo.scanlist) do
++ t2.data[#t2.data+1] = {
++ Quality = "%d/%d" %{ cell.quality, cell.quality_max },
++ ESSID = cell.ssid,
++ Address = cell.bssid,
++ Mode = cell.mode,
++ ["Encryption key"] = cell.encryption.enabled and "On" or "Off",
++ ["Signal level"] = "%d dBm" % cell.signal,
++ ["Noise level"] = "%d dBm" % iwinfo.noise
++ }
++ end
++ end
++end
++
++t2._render = t2.render
++t2.render = function() end
++
++t2:option(DummyValue, "Quality", translate("Link"))
++essid = t2:option(DummyValue, "ESSID", "ESSID")
++function essid.cfgvalue(self, section)
++ return self.map:get(section, "ESSID")
++end
++
++t2:option(DummyValue, "Address", "BSSID")
++t2:option(DummyValue, "Mode", translate("Mode"))
++chan = t2:option(DummyValue, "channel", translate("Channel"))
++function chan.cfgvalue(self, section)
++ return self.map:get(section, "Channel")
++ or self.map:get(section, "Frequency")
++ or "-"
++end
++
++t2:option(DummyValue, "Encryption key", translate("<abbr title=\"Encrypted\">Encr.</abbr>"))
++
++t2:option(DummyValue, "Signal level", translate("Signal"))
++
++t2:option(DummyValue, "Noise level", translate("Noise"))
++
++
++
++if #wifidevs < 1 then
++ return m
++end
++
++-- Config Section --
++
++s = m:section(NamedSection, wifidevs[1], "wifi-device", translate("Devices"))
++s.addremove = false
++
++en = s:option(Flag, "disabled", translate("enable"))
++en.rmempty = false
++en.enabled = "0"
++en.disabled = "1"
++
++function en.cfgvalue(self, section)
++ return Flag.cfgvalue(self, section) or "0"
++end
++
++
++local hwtype = m:get(wifidevs[1], "type")
++
++if hwtype == "atheros" then
++ mode = s:option(ListValue, "hwmode", translate("Mode"))
++ mode.override_values = true
++ mode:value("", "auto")
++ mode:value("11b", "802.11b")
++ mode:value("11g", "802.11g")
++ mode:value("11a", "802.11a")
++ mode:value("11bg", "802.11b+g")
++ mode.rmempty = true
++end
++
++
++ch = s:option(Value, "channel", translate("Channel"))
++for i=1, 14 do
++ ch:value(i, i .. " (2.4 GHz)")
++end
++
++
++s = m:section(TypedSection, "wifi-iface", translate("Local Network"))
++s.anonymous = true
++s.addremove = false
++
++s:option(Value, "ssid", translate("Network Name (<abbr title=\"Extended Service Set Identifier\">ESSID</abbr>)"))
++
++bssid = s:option(Value, "bssid", translate("<abbr title=\"Basic Service Set Identifier\">BSSID</abbr>"))
++
++local devs = {}
++luci.model.uci.cursor():foreach("wireless", "wifi-device",
++ function (section)
++ table.insert(devs, section[".name"])
++ end)
++
++if #devs > 1 then
++ device = s:option(DummyValue, "device", translate("Device"))
++else
++ s.defaults.device = devs[1]
++end
++
++mode = s:option(ListValue, "mode", translate("Mode"))
++mode.override_values = true
++mode:value("ap", translate("Provide (Access Point)"))
++mode:value("adhoc", translate("Independent (Ad-Hoc)"))
++mode:value("sta", translate("Join (Client)"))
++
++function mode.write(self, section, value)
++ if value == "sta" then
++ local oldif = m.uci:get("network", "wan", "ifname")
++ if oldif and oldif ~= " " then
++ m.uci:set("network", "wan", "_ifname", oldif)
++ end
++ m.uci:set("network", "wan", "ifname", " ")
++
++ self.map:set(section, "network", "wan")
++ else
++ if m.uci:get("network", "wan", "_ifname") then
++ m.uci:set("network", "wan", "ifname", m.uci:get("network", "wan", "_ifname"))
++ end
++ self.map:set(section, "network", "lan")
++ end
++
++ return ListValue.write(self, section, value)
++end
++
++encr = s:option(ListValue, "encryption", translate("Encryption"))
++encr.override_values = true
++encr:value("none", "No Encryption")
++encr:value("wep", "WEP")
++
++if hwtype == "atheros" or hwtype == "mac80211" then
++ local supplicant = fs.access("/usr/sbin/wpa_supplicant")
++ local hostapd = fs.access("/usr/sbin/hostapd")
++
++ if hostapd and supplicant then
++ encr:value("psk", "WPA-PSK")
++ encr:value("psk2", "WPA2-PSK")
++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode")
++ encr:value("wpa", "WPA-Radius", {mode="ap"}, {mode="sta"})
++ encr:value("wpa2", "WPA2-Radius", {mode="ap"}, {mode="sta"})
++ elseif hostapd and not supplicant then
++ encr:value("psk", "WPA-PSK", {mode="ap"}, {mode="adhoc"})
++ encr:value("psk2", "WPA2-PSK", {mode="ap"}, {mode="adhoc"})
++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="ap"}, {mode="adhoc"})
++ encr:value("wpa", "WPA-Radius", {mode="ap"})
++ encr:value("wpa2", "WPA2-Radius", {mode="ap"})
++ encr.description = translate(
++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ..
++ "and ad-hoc mode) to be installed."
++ )
++ elseif not hostapd and supplicant then
++ encr:value("psk", "WPA-PSK", {mode="sta"})
++ encr:value("psk2", "WPA2-PSK", {mode="sta"})
++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="sta"})
++ encr:value("wpa", "WPA-EAP", {mode="sta"})
++ encr:value("wpa2", "WPA2-EAP", {mode="sta"})
++ encr.description = translate(
++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ..
++ "and ad-hoc mode) to be installed."
++ )
++ else
++ encr.description = translate(
++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ..
++ "and ad-hoc mode) to be installed."
++ )
++ end
++elseif hwtype == "broadcom" then
++ encr:value("psk", "WPA-PSK")
++ encr:value("psk2", "WPA2-PSK")
++ encr:value("psk+psk2", "WPA-PSK/WPA2-PSK Mixed Mode")
++end
++
++key = s:option(Value, "key", translate("Key"))
++key:depends("encryption", "wep")
++key:depends("encryption", "psk")
++key:depends("encryption", "psk2")
++key:depends("encryption", "psk+psk2")
++key:depends("encryption", "psk-mixed")
++key:depends({mode="ap", encryption="wpa"})
++key:depends({mode="ap", encryption="wpa2"})
++key.rmempty = true
++key.password = true
++
++server = s:option(Value, "server", translate("Radius-Server"))
++server:depends({mode="ap", encryption="wpa"})
++server:depends({mode="ap", encryption="wpa2"})
++server.rmempty = true
++
++port = s:option(Value, "port", translate("Radius-Port"))
++port:depends({mode="ap", encryption="wpa"})
++port:depends({mode="ap", encryption="wpa2"})
++port.rmempty = true
++
++
++if hwtype == "atheros" or hwtype == "mac80211" then
++ nasid = s:option(Value, "nasid", translate("NAS ID"))
++ nasid:depends({mode="ap", encryption="wpa"})
++ nasid:depends({mode="ap", encryption="wpa2"})
++ nasid.rmempty = true
++
++ eaptype = s:option(ListValue, "eap_type", translate("EAP-Method"))
++ eaptype:value("TLS")
++ eaptype:value("TTLS")
++ eaptype:value("PEAP")
++ eaptype:depends({mode="sta", encryption="wpa"})
++ eaptype:depends({mode="sta", encryption="wpa2"})
++
++ cacert = s:option(FileUpload, "ca_cert", translate("Path to CA-Certificate"))
++ cacert:depends({mode="sta", encryption="wpa"})
++ cacert:depends({mode="sta", encryption="wpa2"})
++
++ privkey = s:option(FileUpload, "priv_key", translate("Path to Private Key"))
++ privkey:depends({mode="sta", eap_type="TLS", encryption="wpa2"})
++ privkey:depends({mode="sta", eap_type="TLS", encryption="wpa"})
++
++ privkeypwd = s:option(Value, "priv_key_pwd", translate("Password of Private Key"))
++ privkeypwd:depends({mode="sta", eap_type="TLS", encryption="wpa2"})
++ privkeypwd:depends({mode="sta", eap_type="TLS", encryption="wpa"})
++
++
++ auth = s:option(Value, "auth", translate("Authentication"))
++ auth:value("PAP")
++ auth:value("CHAP")
++ auth:value("MSCHAP")
++ auth:value("MSCHAPV2")
++ auth:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
++ auth:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
++ auth:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
++ auth:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
++
++
++ identity = s:option(Value, "identity", translate("Identity"))
++ identity:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
++ identity:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
++ identity:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
++ identity:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
++
++ password = s:option(Value, "password", translate("Password"))
++ password:depends({mode="sta", eap_type="PEAP", encryption="wpa2"})
++ password:depends({mode="sta", eap_type="PEAP", encryption="wpa"})
++ password:depends({mode="sta", eap_type="TTLS", encryption="wpa2"})
++ password:depends({mode="sta", eap_type="TTLS", encryption="wpa"})
++end
++
++
++if hwtype == "atheros" or hwtype == "broadcom" then
++ iso = s:option(Flag, "isolate", translate("AP-Isolation"), translate("Prevents Client to Client communication"))
++ iso.rmempty = true
++ iso:depends("mode", "ap")
++
++ hide = s:option(Flag, "hidden", translate("Hide <abbr title=\"Extended Service Set Identifier\">ESSID</abbr>"))
++ hide.rmempty = true
++ hide:depends("mode", "ap")
++end
++
++if hwtype == "mac80211" or hwtype == "atheros" then
++ bssid:depends({mode="adhoc"})
++end
++
++if hwtype == "broadcom" then
++ bssid:depends({mode="wds"})
++ bssid:depends({mode="adhoc"})
++end
++
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/applyreboot.htm b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/applyreboot.htm
+new file mode 100644
+index 0000000..d33a2ca
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/applyreboot.htm
+@@ -0,0 +1,13 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content"><%:System%></h2>
++<br />
++<p><% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %></p>
++<p><%:Please wait: Device rebooting...%></p>
++<script type="text/javascript">setTimeout("location='<%=controller%>'", 60000)</script>
++<%+footer%>
+\ No newline at end of file
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/backup.htm b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/backup.htm
+new file mode 100644
+index 0000000..efc6aa7
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/backup.htm
+@@ -0,0 +1,32 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content"><%:System%></h2>
++<h3><%:Backup / Restore%></h3>
++<p><%:Here you can backup and restore your configuration and - if possible - reset this device to the default settings.%></p>
++<br />
++<div>
++ <ul>
++ <li><a href="<%=REQUEST_URI%>?backup=kthxbye"><%:Create backup%></a></li>
++ <% if reset_avail then -%>
++ <li><a href="<%=REQUEST_URI%>?reset=yarly" onclick="return confirm('<%:Proceed reverting all settings and resetting to firmware defaults?%>')"><%:Reset this device to defaults%></a></li>
++ <% end -%>
++ </ul>
++</div>
++
++<br />
++
++<form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
++ <div class="left"><%:Backup Archive%>:</div>
++ <div>
++ <input type="file" size="30" name="archive" />
++ </div>
++ <div>
++ <input type="submit" class="cbi-button cbi-input-apply" value="<%:Restore backup%>" />
++ </div>
++</form>
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/index.htm b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/index.htm
+new file mode 100644
+index 0000000..5818a56
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/index.htm
+@@ -0,0 +1,13 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<h2 name="content"><%:Hello!%></h2>
++<p><%_This is the administration area of <abbr title="Lua Configuration Interface">LuCI</abbr>.%></p>
++<p><%_<abbr title="Lua Configuration Interface">LuCI</abbr> is a free, flexible, and user friendly graphical interface for configuring OpenWrt.%><br />
++<%:On the following pages you can adjust all important settings of this device.%></p>
++<p><%:As we always want to improve this interface we are looking forward to your feedback and suggestions.%></p>
++<p><%:And now have fun with your OpenWrt device!%></p>
++<p><em><strong><a href="<%=controller%>/about"><%_The <abbr title="Lua Configuration Interface">LuCI</abbr> Team%></a></strong></em></p>
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/reboot.htm b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/reboot.htm
+new file mode 100644
+index 0000000..f70e7c9
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/reboot.htm
+@@ -0,0 +1,25 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content"><%:System%></h2>
++<h3><%:Reboot%></h3>
++<p><%:Reboots the operating system of your device%></p>
++<%-
++local c = require("luci.model.uci").cursor():changes()
++if c and next(c) then
++-%>
++ <p class="warning"><%:Warning: There are unsaved changes that will be lost while rebooting!%></p>
++<%-
++end
++if not reboot then
++-%>
++<p><a href="<%=REQUEST_URI%>?reboot=1"><%:Perform reboot%></a></p>
++<%- else -%>
++<p><%:Please wait: Device rebooting...%></p>
++<script type="text/javascript">setTimeout("location='<%=controller%>'", 60000)</script>
++<%- end -%>
++<%+footer%>
+\ No newline at end of file
+diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/upgrade.htm b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/upgrade.htm
+new file mode 100644
+index 0000000..ecd1e8a
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/upgrade.htm
+@@ -0,0 +1,96 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2009 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:System%></h2>
++<h3><%:Flash Firmware%></h3>
++
++<% if step == 1 then %>
++ <% if supported then %>
++ <form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
++ <p>
++ <%:Upload an OpenWrt image file to reflash the device.%>
++ <% if bad_image then %>
++ <br /><br />
++ <div class="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 %>
++ </p>
++ <div>
++ <%:Firmware image%>:<br />
++ <input type="hidden" name="step" value="2" />
++ <input type="file" size="30" name="image" />
++ <br />
++ <br />
++ <% if keepavail then -%>
++ <input type="checkbox" name="keepcfg" value="1" checked="checked" />
++ <span class="bold"><%:Keep configuration files%></span>
++ <% end -%>
++
++ <br />
++ <input class="cbi-button cbi-button-apply" type="submit" value="<%:Upload image%>" />
++ </div>
++ </form>
++ <% else %>
++ <div class="error"><%_ Sorry.
++ OpenWrt does not support a system upgrade on this platform.<br />
++ You need to manually flash your device. %></div>
++ <% end %>
++<% elseif step == 2 then %>
++ <p>
++ <%_ The flash image was uploaded.
++ Below is the checksum and file size listed,
++ compare them with the original file to ensure data integrity.<br />
++ Click "Proceed" below to start the flash procedure. %>
++
++ <% if flashsize > 0 and filesize > flashsize then %>
++ <br /><br />
++ <div class="error"><%:It appears that you are trying to
++ flash an image that does not fit into the flash memory, please verify
++ the image file! %></div>
++ <% end %>
++
++ <br />
++ <ul>
++ <li><%:Checksum%>: <code><%=checksum%></code></li>
++ <li><%:Size%>: <%
++ local w = require "luci.tools.webadmin"
++ write(w.byte_format(filesize))
++
++ if flashsize > 0 then
++ write(luci.i18n.translatef(
++ " (%s available)",
++ w.byte_format(flashsize)
++ ))
++ end
++ %></li>
++ </ul>
++ </p>
++ <div class="cbi-page-actions right">
++ <form style="display:inline">
++ <input type="hidden" name="step" value="3" />
++ <input type="hidden" name="keepcfg" value="<%=keepconfig and "1" or "0"%>" />
++ <input class="cbi-button cbi-button-apply" type="submit" value="<%:Proceed%>" />
++ </form>
++ <form style="display:inline">
++ <input type="hidden" name="step" value="1" />
++ <input type="hidden" name="keepcfg" value="<%=keepconfig and "1" or "0"%>" />
++ <input class="cbi-button cbi-button-reset" type="submit" value="<%:Cancel%>" />
++ </form>
++ </div>
++<% elseif step == 3 then %>
++ <p><%_ The system is flashing now.<br />
++ DO NOT POWER OFF THE DEVICE!<br />
++ Wait a few minutes before you try to reconnect.
++ It might be necessary to renew the address of your computer to reach the device
++ again, depending on your settings. %></p>
++
++ <iframe src="<%=REQUEST_URI%>?step=4&#38;keepcfg=<%=keepconfig and "1" or "0"%>" style="border:1px solid black; width:100%; height:150px"></iframe>
++<% end %>
++<%+footer%>
++
+diff --git a/feeds/luci/modules/luci-mod-failsafe/Makefile b/feeds/luci/modules/luci-mod-failsafe/Makefile
+new file mode 100644
+index 0000000..8afc614
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-failsafe/Makefile
+@@ -0,0 +1,15 @@
++#
++# 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_TITLE:=LuCI Fail-Safe - Fail-Safe sysupgrade module
++LUCI_DEPENDS:=+luci-base
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
++
+diff --git a/feeds/luci/modules/luci-mod-failsafe/luasrc/controller/failsafe/failsafe.lua b/feeds/luci/modules/luci-mod-failsafe/luasrc/controller/failsafe/failsafe.lua
+new file mode 100644
+index 0000000..60caadb
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-failsafe/luasrc/controller/failsafe/failsafe.lua
+@@ -0,0 +1,202 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2012 Daniel Golle <dgolle@allnet.de>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.failsafe.failsafe", package.seeall)
++
++function index()
++ local root = node()
++ if not root.target then
++ root.target = alias("failsafe")
++ root.index = true
++ end
++
++ page = node()
++ page.lock = true
++ page.target = alias("failsafe")
++ page.subindex = true
++ page.index = false
++
++ page = node("failsafe")
++ page.title = _("Fail-safe")
++ page.target = alias("failsafe", "flashops")
++ page.order = 5
++ page.setuser = "root"
++ page.setgroup = "root"
++ page.index = true
++
++ entry({"failsafe", "flashops"}, call("action_flashops"), _("Flash Firmware"), 70).index = true
++ entry({"failsafe", "reboot"}, call("action_reboot"), _("Reboot"), 90)
++end
++
++function action_flashops()
++ local sys = require "luci.sys"
++ local fs = require "nixio.fs"
++
++ local upgrade_avail = fs.access("/lib/upgrade/platform.sh")
++ local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0
++
++ local image_tmp = "/tmp/firmware.img"
++
++ local function image_supported()
++ -- XXX: yay...
++ return ( 0 == os.execute(
++ ". /lib/functions.sh; " ..
++ "include /lib/upgrade; " ..
++ "platform_check_image %q >/dev/null"
++ % image_tmp
++ ) )
++ end
++
++ local function image_checksum()
++ return (luci.sys.exec("md5sum %q" % image_tmp):match("^([^%s]+)"))
++ end
++
++ local function storage_size()
++ local size = 0
++ if fs.access("/proc/mtd") then
++ for l in io.lines("/proc/mtd") do
++ local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"')
++ if n == "linux" or n == "firmware" then
++ size = tonumber(s, 16)
++ break
++ end
++ end
++ elseif fs.access("/proc/partitions") then
++ for l in io.lines("/proc/partitions") do
++ local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)')
++ if b and n and not n:match('[0-9]') then
++ size = tonumber(b) * 1024
++ break
++ end
++ end
++ end
++ return size
++ end
++
++
++ local fp
++ luci.http.setfilehandler(
++ function(meta, chunk, eof)
++ if not fp then
++ if meta and meta.name == "image" then
++ fp = io.open(image_tmp, "w")
++ end
++ end
++ if fp then
++ if chunk then
++ fp:write(chunk)
++ end
++ if eof then
++ fp:close()
++ end
++ end
++ end
++ )
++
++ if luci.http.formvalue("image") or luci.http.formvalue("step") then
++ --
++ -- Initiate firmware flash
++ --
++ local step = tonumber(luci.http.formvalue("step") or 1)
++ if step == 1 then
++ if image_supported() then
++ luci.template.render("failsafe/upgrade", {
++ checksum = image_checksum(),
++ storage = storage_size(),
++ size = (fs.stat(image_tmp, "size") or 0),
++ keep = false
++ })
++ else
++ fs.unlink(image_tmp)
++ luci.template.render("failsafe/flashops", {
++ reset_avail = reset_avail,
++ upgrade_avail = upgrade_avail,
++ image_invalid = true
++ })
++ end
++ --
++ -- Start sysupgrade flash
++ --
++ elseif step == 2 then
++ local keep = (luci.http.formvalue("keep") == "1") and "" or "-n"
++ luci.template.render("failsafe/applyreboot", {
++ title = luci.i18n.translate("Flashing..."),
++ msg = luci.i18n.translate("The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
++ addr = (#keep > 0) and "192.168.1.1" or nil
++ })
++ fork_exec("killall dropbear uhttpd; sleep 1; /sbin/sysupgrade %s %q" %{ keep, image_tmp })
++ end
++ else
++ --
++ -- Overview
++ --
++ luci.template.render("failsafe/flashops", {
++ reset_avail = reset_avail,
++ upgrade_avail = upgrade_avail
++ })
++ end
++end
++
++function action_reboot()
++ local reboot = luci.http.formvalue("reboot")
++ luci.template.render("failsafe/reboot", {reboot=reboot})
++ if reboot then
++ luci.sys.reboot()
++ end
++end
++
++function fork_exec(command)
++ local pid = nixio.fork()
++ if pid > 0 then
++ return
++ elseif pid == 0 then
++ -- change to root dir
++ nixio.chdir("/")
++
++ -- patch stdin, out, err to /dev/null
++ local null = nixio.open("/dev/null", "w+")
++ if null then
++ nixio.dup(null, nixio.stderr)
++ nixio.dup(null, nixio.stdout)
++ nixio.dup(null, nixio.stdin)
++ if null:fileno() > 2 then
++ null:close()
++ end
++ end
++
++ -- replace with target command
++ nixio.exec("/bin/sh", "-c", command)
++ end
++end
++
++function ltn12_popen(command)
++
++ local fdi, fdo = nixio.pipe()
++ local pid = nixio.fork()
++
++ if pid > 0 then
++ fdo:close()
++ local close
++ return function()
++ local buffer = fdi:read(2048)
++ local wpid, stat = nixio.waitpid(pid, "nohang")
++ if not close and wpid and stat == "exited" then
++ close = true
++ end
++
++ if buffer and #buffer > 0 then
++ return buffer
++ elseif close then
++ fdi:close()
++ return nil
++ end
++ end
++ elseif pid == 0 then
++ nixio.dup(fdo, nixio.stdout)
++ fdi:close()
++ fdo:close()
++ nixio.exec("/bin/sh", "-c", command)
++ end
++end
+diff --git a/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/applyreboot.htm b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/applyreboot.htm
+new file mode 100644
+index 0000000..12c138c
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/applyreboot.htm
+@@ -0,0 +1,41 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<html>
++ <head>
++ <title><%=luci.sys.hostname()%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></title>
++ <link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
++ <script type="text/javascript" src="<%=resource%>/xhr.js"></script>
++ <script type="text/javascript">//<![CDATA[
++ var interval = window.setInterval(function() {
++ var img = new Image();
++
++ img.onload = function() {
++ window.clearInterval(interval);
++ location.href = 'http://<%=addr or luci.http.getenv("SERVER_NAME")%>/';
++ };
++
++ img.src = 'http://<%=addr or luci.http.getenv("SERVER_NAME")%><%=resource%>/icons/loading.gif?' + Math.random();
++ }, 5000);
++ //]]></script>
++ </head>
++ <body>
++ <div id="maincontainer">
++ <div id="maincontent">
++ <h2 name="content"><%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %></h2>
++ <fieldset class="cbi-section">
++ <p>
++ <% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %>
++ </p>
++ <p>
++ <img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
++ <%:Waiting for changes to be applied...%>
++ </p>
++ </fieldset>
++ </div>
++ </div>
++ </body>
++</html>
+diff --git a/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/flashops.htm b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/flashops.htm
+new file mode 100644
+index 0000000..3c8d11b
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/flashops.htm
+@@ -0,0 +1,34 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2012 Daniel Golle <dgolle@allnet.de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Flash operations%></h2>
++<fieldset class="cbi-section">
++ <legend><%:Flash new firmware image%></legend>
++ <% if upgrade_avail then %>
++ <form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
++ <div class="cbi-section-descr"><%:Upload a sysupgrade-compatible image. %></div>
++ <div class="cbi-section-node">
++ <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>
++ <% 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 OpenWrt wiki for device specific install instructions.%></div>
++ <% end %>
++</fieldset>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/reboot.htm b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/reboot.htm
+new file mode 100644
+index 0000000..cbbe13b
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/reboot.htm
+@@ -0,0 +1,18 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2012 Daniel Golle <dgolle@allnet.de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<h2 name="content"><%:System%></h2>
++<h3><%:Reboot%></h3>
++<p><%:Reboots the operating system of your device%></p>
++<%- if not reboot then -%>
++<p><a href="<%=controller%>/failsafe/reboot?reboot=1"><%:Perform reboot%></a></p>
++<%- else -%>
++<p><%:Please wait: Device rebooting...%></p>
++<script type="text/javascript">setTimeout("location='<%=controller%>'", 60000)</script>
++<%- end -%>
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/upgrade.htm b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/upgrade.htm
+new file mode 100644
+index 0000000..3be9ae1
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/upgrade.htm
+@@ -0,0 +1,53 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2009 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2012 Daniel Golle <dgolle@allnet.de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2 name="content"><%:Flash Firmware%> - <%:Verify%></h2>
++<p>
++ <%_ The flash image was uploaded.
++ Below is the checksum and file size listed,
++ compare them with the original file to ensure data integrity.<br />
++ Click "Proceed" below to start the flash procedure. %>
++
++ <% if storage > 0 and size > storage then %>
++ <br /><br />
++ <div class="error"><%:It appears that you are trying to
++ flash an image that does not fit into the flash memory, please verify
++ the image file! %></div>
++ <% end %>
++
++</p>
++
++<fieldset class="cbi-section">
++ <ul>
++ <li><%:Checksum%>: <code><%=checksum%></code></li>
++ <li><%:Size%>: <%
++ local w = require "luci.tools.webadmin"
++ write(w.byte_format(size))
++
++ if storage > 0 then
++ write(luci.i18n.translatef(
++ " (%s available)",
++ w.byte_format(storage)
++ ))
++ end
++ %></li>
++ </ul>
++</fieldset>
++
++<div class="cbi-page-actions right">
++ <form style="display:inline" action="<%=REQUEST_URI%>" method="post">
++ <input class="cbi-button cbi-button-reset" type="submit" value="<%:Cancel%>" />
++ </form>
++ <form style="display:inline" action="<%=REQUEST_URI%>" method="post">
++ <input type="hidden" name="step" value="2" />
++ <input class="cbi-button cbi-button-apply" type="submit" value="<%:Proceed%>" />
++ </form>
++</div>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-freifunk-community/Makefile b/feeds/luci/modules/luci-mod-freifunk-community/Makefile
+new file mode 100644
+index 0000000..ad6c4ce
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk-community/Makefile
+@@ -0,0 +1,19 @@
++#
++# 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_TITLE:=Freifunk Community Meta-Package
++LUCI_DEPENDS:= \
++ +iptables-mod-nat-extra +iptables-mod-ipopt +luci-app-splash \
++ +olsrd +olsrd-mod-dyn-gw-plain +olsrd-mod-jsoninfo +olsrd-mod-nameservice \
++ +olsrd-mod-watchdog +kmod-tun +ip +freifunk-watchdog +luci-app-olsr \
++ +luci-app-olsr-services +freifunk-gwcheck +freifunk-mapupdate
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
++
+diff --git a/feeds/luci/modules/luci-mod-freifunk/Makefile b/feeds/luci/modules/luci-mod-freifunk/Makefile
+new file mode 100644
+index 0000000..550db1d
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/Makefile
+@@ -0,0 +1,15 @@
++#
++# 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_TITLE:=LuCI Freifunk module
++LUCI_DEPENDS:=+luci-mod-admin-full +luci-lib-json +freifunk-firewall +freifunk-common
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
++
+diff --git a/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/flashing.html b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/flashing.html
+new file mode 100644
+index 0000000..43e5123
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/flashing.html
+@@ -0,0 +1,84 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
++<head>
++ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
++ <title>LuCI - System Upgrade</title>
++
++ <style type="text/css">
++ body {
++ background-color: #CCCCCC;
++ font-family: sans-serif;
++ font-size: 90%;
++ padding-left: 50%;
++ padding-top: 100px;
++ }
++
++ h2 {
++ font-size: 110%;
++ margin: 5px 5px 0.5em 5px;
++ border-bottom: 1px dotted #0066CC;
++ color: #0066CC;
++ }
++
++ p {
++ font-size: 95%;
++ margin: 15px 15px 0.5em 15px;
++ }
++
++ div {
++ background-color: #F7F7F7;
++ border: 1px dotted #000000;
++ width: 600px;
++ height: 150px;
++ margin-left: -300px;
++ }
++
++ em {
++ color: #555555;
++ }
++ </style>
++
++ <script type="text/javascript"><!--
++ var time_remaining = 60 * 25;
++ var interval = window.setInterval(function() {
++ if( time_remaining <= 0 )
++ {
++ window.clearInterval(interval);
++ location.href = 'http://' + location.hostname + '/';
++ }
++ else
++ {
++ var minutes = Math.floor(time_remaining / 60);
++ var seconds = time_remaining % 60;
++ var label = document.getElementById('time_remaining');
++
++ if( label )
++ {
++ label.innerHTML =
++ ( minutes > 0 ? minutes + 'm ' : '' ) +
++ seconds + 's';
++ }
++ }
++
++ time_remaining = time_remaining - 1;
++ }, 1000);
++ --></script>
++</head>
++
++<body class="lang_en">
++ <div>
++ <h2>Performing Upgrade</h2>
++
++ <p>
++ The System is flashing now. The procedure can take up to 25 minutes,
++ please be patient and wait until this page reloads itself.
++
++ <br /><img src="resources/flashing.gif" style="vertical-align:middle; margin:10px" />
++
++ <em>Remaining time (estimated): <span id="time_remaining">unknown</span></em>
++ </p>
++ </div>
++</body>
++
++</html>
+diff --git a/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/OSMLatLon.htm b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/OSMLatLon.htm
+new file mode 100644
+index 0000000..18be30b
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/OSMLatLon.htm
+@@ -0,0 +1,20 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
++
++<head>
++ <title>OpenStreetMap</title>
++ <script type="text/javascript" src="http://www.openlayers.org/api/OpenLayers.js"></script>
++ <script type="text/javascript" src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script>
++ <script type="text/javascript" src="osm.js"></script>
++</head>
++<body onload="init();drawmap();" style="padding:0px; margin:0px">
++ <div id="map"></div>
++ <div style="position:absolute; bottom:0%; width:100%; background:url('cbi/black_60.png'); font-size:10px; color:#fff;z-index:1000">
++ Map by <a href="http://www.openstreetmap.org" title="www.openstreetmap.org" style="color:#fff;" >openstreetmap.org</a>, License CC-BY-SA
++ &#160;&#160;&#160;&#160;
++ <span id="osm">
++ Latitude: <input id="osmlat" name="osmlat" type="text" size="20" style="font-size:10px;">
++ Longitude: <input id="osmlon" name="osmlon" type="text" size="20" style="font-size:10px;">
++ </span>
++ </div>
++
++</body>
+diff --git a/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/flashing.gif b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/flashing.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..e207fc56a1fcf035eba568f4ba5396f6dcd030fc
+GIT binary patch
+literal 4261
+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
+bTx8G+`G;Z;Xq)kb@V?FJOe04u1XlbHnv55!
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/freifunk-map/hna.gif b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/freifunk-map/hna.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..818780d153abf08cd650ff698e6b595f9b2a9bac
+GIT binary patch
+literal 209
+zcmZ?wbhEHblwgoxn8?KNpCRo(7%(s}DE{a6a}5c0b_{Se(lcOY1PT3Q;Y?v*V$cDy
+zff^(j7?@<H^shYqmVfb_Ew{Qqvob!BOPRBL>a)&euTE|AWyGdI0ZBvV4T}c(n0X8>
+z)7Z;mj%|C#ef-lOF_0!!G+Q(gntnH3Gi&(II<=fZ$yMqZ$CT$!8ei|&d!zUHuXEr3
+J1u-yK0|2#tP22zg
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/freifunk-map/node.gif b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/freifunk-map/node.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..f64ab162a451f8eb04b6b6664694b7b907f511cf
+GIT binary patch
+literal 209
+zcmZ?wbhEHblwgoxn8?JykoF$}7#J87|8x7fh6Fo12DlpO889<~gnqJcrZ6xu=m6P3
+z4H66tOfpmYSDt>$zj)4;Tiu^o8K20d%vnD5S?97>r?&YrV$-02q#^T$MT30IJcgEO
+z>}4^>w!Py%{^^exNE0iXEt&{TzniX^HT-9tTF#*4D)o$G%JV0UuXpUd(fj<@x$pmi
+H7#OSpv*u0Q
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/osm.js b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/osm.js
+new file mode 100644
+index 0000000..cae0cd6
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/osm.js
+@@ -0,0 +1,130 @@
++var map;
++var layer_mapnik;
++var layer_tah;
++var layer_markers;
++var PI = Math.PI;
++var latfield = '';
++var lonfield = '';
++var latfield_id='';
++var lonfield_id='';
++var centerlon = 10;
++var centerlat = 52;
++var zoom = 6;
++
++function lon2merc(lon) {
++ return 20037508.34 * lon / 180;
++}
++
++function lat2merc(lat) {
++ lat = Math.log(Math.tan( (90 + lat) * PI / 360)) / PI;
++ return 20037508.34 * lat;
++}
++
++function merc2lon(lon) {
++ return lon*180/20037508.34;
++};
++
++function merc2lat(lat) {
++ return Math.atan(Math.exp(lat*PI/20037508.34))*360/PI-90;
++};
++
++OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {
++ defaultHandlerOptions: {
++ 'single': true,
++ 'double': false,
++ 'pixelTolerance': 0,
++ 'stopSingle': false,
++ 'stopDouble': false
++ },
++
++ initialize: function(options) {
++ this.handlerOptions = OpenLayers.Util.extend(
++ {}, this.defaultHandlerOptions
++ );
++ OpenLayers.Control.prototype.initialize.apply(
++ this, arguments
++ );
++ this.handler = new OpenLayers.Handler.Click(
++ this, {
++ 'click': this.trigger
++ }, this.handlerOptions
++ );
++ },
++
++ trigger: function(e) {
++ var lonlat = map.getLonLatFromViewPortPx(e.xy);
++ lat=merc2lat(lonlat.lat);
++ lon=merc2lon(lonlat.lon);
++ if(parent.document.getElementById(latfield_id)==null){
++ latfield=document.getElementById('osmlat');
++ }else{
++ latfield=parent.document.getElementById(latfield_id);
++ }
++ if(parent.document.getElementById(lonfield_id)==null){
++ lonfield=document.getElementById('osmlon');
++ }else{
++ lonfield=parent.document.getElementById(lonfield_id);
++ }
++ latfield.value = lat;
++ lonfield.value = lon;
++ }
++});
++
++function init(){
++ var field = window.name.substring(0, window.name.lastIndexOf("."));
++ if(parent.document.getElementById(field+".latfield")!=null){
++ latfield_id = parent.document.getElementById(field+".latfield").value;
++ document.getElementById('osm').style.display="none";
++ }
++ if(parent.document.getElementById(field+".lonfield")!=null){
++ lonfield_id = parent.document.getElementById(field+".lonfield").value;
++ }
++ if(parent.document.getElementById(field+".centerlat")!=null){
++ centerlat =parseFloat(parent.document.getElementById(field+".centerlat").value);
++ }
++ if(parent.document.getElementById(field+".centerlon")!=null){
++ centerlon = parseFloat(parent.document.getElementById(field+".centerlon").value);
++ }
++ if(parent.document.getElementById(field+".zoom")!=null){
++ zoom = parseFloat(parent.document.getElementById(field+".zoom").value);
++ }
++}
++
++function drawmap() {
++ OpenLayers.Lang.setCode('de');
++ mapdiv=document.getElementById('map');
++ mapdiv.style.height=window.innerHeight+"px";
++ mapdiv.style.width=window.innerWidth+"px";
++ map = new OpenLayers.Map('map', {
++ projection: new OpenLayers.Projection("EPSG:900913"),
++ displayProjection: new OpenLayers.Projection("EPSG:4326"),
++ controls: [
++ new OpenLayers.Control.Navigation(),
++ new OpenLayers.Control.PanZoomBar()],
++ maxExtent:
++ new OpenLayers.Bounds(-20037508.34,-20037508.34, 20037508.34, 20037508.34),
++ numZoomLevels: 18,
++ maxResolution: 156543,
++ units: 'meters'
++ });
++
++ layer_mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
++
++ map.addLayers([layer_mapnik]);
++ var y =lat2merc(centerlat);
++ var x =lon2merc(centerlon);
++ map.setCenter(new OpenLayers.LonLat(x, y), zoom);
++
++ // Check for geolocation support
++ if(navigator.geolocation){
++ navigator.geolocation.getCurrentPosition(function(position){
++ var y =lat2merc(position.coords.latitude);
++ var x =lon2merc(position.coords.longitude);
++ map.setCenter(new OpenLayers.LonLat(x, y), '17');
++ });
++ }
++
++ var click = new OpenLayers.Control.Click();
++ map.addControl(click);
++ click.activate();
++}
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/freifunk.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/freifunk.lua
+new file mode 100644
+index 0000000..84669dc
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/freifunk.lua
+@@ -0,0 +1,219 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.freifunk.freifunk", package.seeall)
++
++function index()
++ local uci = require "luci.model.uci".cursor()
++ local page
++
++ -- Frontend
++ page = node()
++ page.lock = true
++ page.target = alias("freifunk")
++ page.subindex = true
++ page.index = false
++
++ page = node("freifunk")
++ page.title = _("Freifunk")
++ page.target = alias("freifunk", "index")
++ page.order = 5
++ page.setuser = "nobody"
++ page.setgroup = "nogroup"
++ page.i18n = "freifunk"
++ page.index = true
++
++ page = node("freifunk", "index")
++ page.target = template("freifunk/index")
++ page.title = _("Overview")
++ page.order = 10
++ page.indexignore = true
++
++ page = node("freifunk", "contact")
++ page.target = template("freifunk/contact")
++ page.title = _("Contact")
++ page.order = 15
++
++ page = node("freifunk", "status")
++ page.target = template("freifunk/public_status")
++ page.title = _("Status")
++ page.order = 20
++ page.i18n = "base"
++ page.setuser = false
++ page.setgroup = false
++
++ entry({"freifunk", "status.json"}, call("jsonstatus"))
++ entry({"freifunk", "status", "zeroes"}, call("zeroes"), "Testdownload")
++
++ if nixio.fs.access("/usr/sbin/luci-splash") then
++ assign({"freifunk", "status", "splash"}, {"splash", "publicstatus"}, _("Splash"), 40)
++ end
++
++ page = assign({"freifunk", "olsr"}, {"admin", "status", "olsr"}, _("OLSR"), 30)
++ page.setuser = false
++ page.setgroup = false
++
++ if nixio.fs.access("/etc/config/luci_statistics") then
++ assign({"freifunk", "graph"}, {"admin", "statistics", "graph"}, _("Statistics"), 40)
++ end
++
++ -- backend
++ assign({"mini", "freifunk"}, {"admin", "freifunk"}, _("Freifunk"), 5)
++ entry({"admin", "freifunk"}, alias("admin", "freifunk", "index"), _("Freifunk"), 5)
++
++ page = node("admin", "freifunk")
++ page.target = template("freifunk/adminindex")
++ page.title = _("Freifunk")
++ page.order = 5
++
++ page = node("admin", "freifunk", "basics")
++ page.target = cbi("freifunk/basics")
++ page.title = _("Basic Settings")
++ page.order = 5
++
++ page = node("admin", "freifunk", "basics", "profile")
++ page.target = cbi("freifunk/profile")
++ page.title = _("Profile")
++ page.order = 10
++
++ page = node("admin", "freifunk", "basics", "profile_expert")
++ page.target = cbi("freifunk/profile_expert")
++ page.title = _("Profile (Expert)")
++ page.order = 20
++
++ page = node("admin", "freifunk", "Index-Page")
++ page.target = cbi("freifunk/user_index")
++ page.title = _("Index Page")
++ page.order = 50
++
++ page = node("admin", "freifunk", "contact")
++ page.target = cbi("freifunk/contact")
++ page.title = _("Contact")
++ page.order = 15
++
++ entry({"freifunk", "map"}, template("freifunk-map/frame"), _("Map"), 50)
++ entry({"freifunk", "map", "content"}, template("freifunk-map/map"), nil, 51)
++ entry({"admin", "freifunk", "profile_error"}, template("freifunk/profile_error"))
++end
++
++function zeroes()
++ local string = require "string"
++ local http = require "luci.http"
++ local zeroes = string.rep(string.char(0), 8192)
++ local cnt = 0
++ local lim = 1024 * 1024 * 1024
++
++ http.prepare_content("application/x-many-zeroes")
++
++ while cnt < lim do
++ http.write(zeroes)
++ cnt = cnt + #zeroes
++ end
++end
++
++function jsonstatus()
++ local root = {}
++ local sys = require "luci.sys"
++ local uci = require "luci.model.uci"
++ local util = require "luci.util"
++ local http = require "luci.http"
++ local json = require "luci.json"
++ local ltn12 = require "luci.ltn12"
++ local version = require "luci.version"
++ local webadmin = require "luci.tools.webadmin"
++
++ local cursor = uci.cursor_state()
++
++ local ffzone = webadmin.firewall_find_zone("freifunk")
++ local ffznet = ffzone and cursor:get("firewall", ffzone, "network")
++ local ffwifs = ffznet and util.split(ffznet, " ") or {}
++
++ local sysinfo = util.ubus("system", "info") or { }
++ local boardinfo = util.ubus("system", "board") or { }
++
++ local loads = sysinfo.load or { 0, 0, 0 }
++
++ local memory = sysinfo.memory or {
++ total = 0,
++ free = 0,
++ shared = 0,
++ buffered = 0
++ }
++
++ local swap = sysinfo.swap or {
++ total = 0,
++ free = 0
++ }
++
++
++ root.protocol = 1
++
++ root.system = {
++ uptime = { sysinfo.uptime or 0 },
++ loadavg = { loads[1] / 65535.0, loads[2] / 65535.0, loads[3] / 65535.0 },
++ sysinfo = {
++ boardinfo.system or "?",
++ boardinfo.model or "?",
++ memory.total,
++ 0, -- former cached memory
++ memory.buffered,
++ memory.free,
++ 0, -- former bogomips
++ swap.total,
++ 0, -- former cached swap
++ swap.free
++ },
++ hostname = boardinfo.hostname
++ }
++
++ root.firmware = {
++ luciname=version.luciname,
++ luciversion=version.luciversion,
++ distname=version.distname,
++ distversion=version.distversion
++ }
++
++ root.freifunk = {}
++ cursor:foreach("freifunk", "public", function(s)
++ root.freifunk[s[".name"]] = s
++ end)
++
++ cursor:foreach("system", "system", function(s)
++ root.geo = {
++ latitude = s.latitude,
++ longitude = s.longitude
++ }
++ end)
++
++ root.network = {}
++ root.wireless = {devices = {}, interfaces = {}, status = {}}
++ local wifs = root.wireless.interfaces
++ local netdata = luci.sys.net.deviceinfo() or {}
++
++ for _, vif in ipairs(ffwifs) do
++ root.network[vif] = cursor:get_all("network", vif)
++ root.wireless.devices[vif] = cursor:get_all("wireless", vif)
++ cursor:foreach("wireless", "wifi-iface", function(s)
++ if s.device == vif and s.network == vif then
++ wifs[#wifs+1] = s
++ if s.ifname then
++ local iwinfo = luci.sys.wifi.getiwinfo(s.ifname)
++ if iwinfo then
++ root.wireless.status[s.ifname] = { }
++
++ local _, f
++ for _, f in ipairs({
++ "channel", "txpower", "bitrate", "signal", "noise",
++ "quality", "quality_max", "mode", "ssid", "bssid", "encryption", "ifname"
++ }) do
++ root.wireless.status[s.ifname][f] = iwinfo[f]
++ end
++ end
++ end
++ end
++ end)
++ end
++
++ http.prepare_content("application/json")
++ ltn12.pump.all(json.Encoder(root):source(), http.write)
++end
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/remote_update.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/remote_update.lua
+new file mode 100644
+index 0000000..b317ab6
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/remote_update.lua
+@@ -0,0 +1,52 @@
++-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.controller.freifunk.remote_update", package.seeall)
++
++function index()
++ if not nixio.fs.access("/usr/sbin/remote-update") then
++ return
++ end
++
++ entry({"admin", "system", "remote_update"}, call("act_remote_update"),
++ _("Freifunk Remote Update"), 90)
++end
++
++function act_remote_update()
++ if luci.http.formvalue("flash") == "1" then
++ if luci.http.formvalue("confirm") == "1" then
++ local nobackup = ( luci.http.formvalue("keepcfg") ~= "1" )
++ local noverify = ( luci.http.formvalue("verify") ~= "1" )
++
++ luci.http.redirect("/luci-static/flashing.html")
++
++ os.execute("start-stop-daemon -S -b -x /usr/sbin/remote-update -- %s%s-s 5 -y" % {
++ noverify and "-v " or "",
++ nobackup and "-n " or ""
++ })
++ else
++ luci.template.render("freifunk/remote_update", {confirm=1})
++ end
++ else
++ local fd = io.popen("remote-update -c")
++ local update = { }
++
++ if fd then
++ while true do
++ local ln=fd:read("*l")
++
++ if not ln then break
++ elseif ln:find("Local: ") then update.locvar = ln:match("Local: (%d+)")
++ elseif ln:find("Remote: ") then update.remver = ln:match("Remote: (%d+)")
++ elseif ln == "--" then update.info = ""
++ elseif update.info ~= nil then
++ update.info = update.info .. ln .. "\n"
++ end
++ end
++
++ fd:close()
++ end
++
++ luci.template.render("freifunk/remote_update", {update=update})
++ end
++end
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/basics.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/basics.lua
+new file mode 100644
+index 0000000..0d3d971
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/basics.lua
+@@ -0,0 +1,92 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2011 Manuel Munz <freifunk at somakoma de>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local util = require "luci.util"
++local uci = require "luci.model.uci".cursor()
++local profiles = "/etc/config/profile_*"
++
++m = Map("freifunk", translate ("Community"))
++c = m:section(NamedSection, "community", "public", nil, translate("These are the basic settings for your local wireless community. These settings define the default values for the wizard and DO NOT affect the actual configuration of the router."))
++
++community = c:option(ListValue, "name", translate ("Community"))
++community.rmempty = false
++
++local profile
++for profile in fs.glob(profiles) do
++ local name = uci:get_first(profile, "community", "name") or "?"
++ community:value(profile, name)
++end
++
++
++n = Map("system", translate("Basic system settings"))
++function n.on_after_commit(self)
++ luci.http.redirect(luci.dispatcher.build_url("admin", "freifunk", "basics"))
++end
++
++b = n:section(TypedSection, "system")
++b.anonymous = true
++
++hn = b:option(Value, "hostname", translate("Hostname"))
++hn.rmempty = false
++hn.datatype = "hostname"
++
++loc = b:option(Value, "location", translate("Location"))
++loc.rmempty = false
++loc.datatype = "minlength(1)"
++
++lat = b:option(Value, "latitude", translate("Latitude"), translate("e.g.") .. " 48.12345")
++lat.datatype = "float"
++lat.rmempty = false
++
++lon = b:option(Value, "longitude", translate("Longitude"), translate("e.g.") .. " 10.12345")
++lon.datatype = "float"
++lon.rmempty = false
++
++--[[
++Opens an OpenStreetMap iframe or popup
++Makes use of resources/OSMLatLon.htm and htdocs/resources/osm.js
++]]--
++
++local class = util.class
++local ff = uci:get("freifunk", "community", "name") or ""
++local co = "profile_" .. ff
++
++local deflat = uci:get_first("system", "system", "latitude") or uci:get_first(co, "community", "latitude") or 52
++local deflon = uci:get_first("system", "system", "longitude") or uci:get_first(co, "community", "longitude") or 10
++local zoom = 12
++if ( deflat == 52 and deflon == 10 ) then
++ zoom = 4
++end
++
++OpenStreetMapLonLat = luci.util.class(AbstractValue)
++
++function OpenStreetMapLonLat.__init__(self, ...)
++ AbstractValue.__init__(self, ...)
++ self.template = "cbi/osmll_value"
++ self.latfield = nil
++ self.lonfield = nil
++ self.centerlat = ""
++ self.centerlon = ""
++ self.zoom = "0"
++ self.width = "100%" --popups will ignore the %-symbol, "100%" is interpreted as "100"
++ self.height = "600"
++ self.popup = false
++ self.displaytext="OpenStreetMap" --text on button, that loads and displays the OSMap
++ self.hidetext="X" -- text on button, that hides OSMap
++end
++
++ osm = b:option(OpenStreetMapLonLat, "latlon", translate("Find your coordinates with OpenStreetMap"), translate("Select your location with a mouse click on the map. The map will only show up if you are connected to the Internet."))
++ osm.latfield = "latitude"
++ osm.lonfield = "longitude"
++ osm.centerlat = uci:get_first("system", "system", "latitude") or deflat
++ osm.centerlon = uci:get_first("system", "system", "longitude") or deflon
++ osm.zoom = zoom
++ osm.width = "100%"
++ osm.height = "600"
++ osm.popup = false
++ osm.displaytext=translate("Show OpenStreetMap")
++ osm.hidetext=translate("Hide OpenStreetMap")
++
++return m, n
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/contact.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/contact.lua
+new file mode 100644
+index 0000000..0a6995b
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/contact.lua
+@@ -0,0 +1,16 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++m = Map("freifunk", translate("Contact"), translate("Please fill in your contact details below."))
++
++c = m:section(NamedSection, "contact", "public", "")
++
++c:option(Value, "nickname", translate("Nickname"))
++c:option(Value, "name", translate("Realname"))
++c:option(DynamicList, "homepage", translate("Homepage"))
++c:option(Value, "mail", translate("E-Mail"))
++c:option(Value, "phone", translate("Phone"))
++c:option(TextValue, "note", translate("Notice")).rows = 10
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile.lua
+new file mode 100644
+index 0000000..de7caf4
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile.lua
+@@ -0,0 +1,74 @@
++-- Copyright 2011-2012 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local uci = require "luci.model.uci".cursor()
++local ipkg = require "luci.model.ipkg"
++local community = uci:get("freifunk", "community", "name")
++
++if community == nil then
++ luci.http.redirect(luci.dispatcher.build_url("admin", "freifunk", "profile_error"))
++ return
++else
++ community = "profile_" .. community
++ m = Map(community, translate("Community settings"), translate("These are the settings of your local community."))
++ c = m:section(NamedSection, "profile", "community")
++
++ local name = c:option(Value, "name", "Name")
++ name.rmempty = false
++
++ local homepage = c:option(Value, "homepage", translate("Homepage"))
++
++ local cc = c:option(Value, "country", translate("Country code"))
++ function cc.cfgvalue(self, section)
++ return uci:get(community, "wifi_device", "country")
++ end
++ function cc.write(self, sec, value)
++ if value then
++ uci:set(community, "wifi_device", "country", value)
++ uci:save(community)
++ end
++ end
++
++ local ssid = c:option(Value, "ssid", translate("ESSID"))
++ ssid.rmempty = false
++
++ local prefix = c:option(Value, "mesh_network", translate("Mesh prefix"))
++ prefix.datatype = "ip4addr"
++ prefix.rmempty = false
++
++ local splash_net = c:option(Value, "splash_network", translate("Network for client DHCP addresses"))
++ splash_net.datatype = "ip4addr"
++ splash_net.rmempty = false
++
++ local splash_prefix = c:option(Value, "splash_prefix", translate("Client network size"))
++ splash_prefix.datatype = "range(0,32)"
++ splash_prefix.rmempty = false
++
++ local ipv6 = c:option(Flag, "ipv6", translate("Enable IPv6"))
++ ipv6.rmempty = true
++
++ local ipv6_config = c:option(ListValue, "ipv6_config", translate("IPv6 Config"))
++ ipv6_config:depends("ipv6", 1)
++ ipv6_config:value("static")
++ if ipkg.installed ("auto-ipv6-ib") then
++ ipv6_config:value("auto-ipv6-random")
++ ipv6_config:value("auto-ipv6-fromv4")
++ end
++ ipv6_config.rmempty = true
++
++ local ipv6_prefix = c:option(Value, "ipv6_prefix", translate("IPv6 Prefix"), translate("IPv6 network in CIDR notation."))
++ ipv6_prefix:depends("ipv6", 1)
++ ipv6_prefix.datatype = "ip6addr"
++ ipv6_prefix.rmempty = true
++
++ local vap = c:option(Flag, "vap", translate("VAP"), translate("Enable a virtual access point (VAP) by default if possible."))
++ vap.rmempty = true
++
++ local lat = c:option(Value, "latitude", translate("Latitude"))
++ lat.datatype = "range(-180, 180)"
++ lat.rmempty = false
++
++ local lon = c:option(Value, "longitude", translate("Longitude"))
++ lon.rmempty = false
++ return m
++end
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile_expert.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile_expert.lua
+new file mode 100644
+index 0000000..22554a6
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile_expert.lua
+@@ -0,0 +1,32 @@
++-- Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++-- Licensed to the public under the Apache License 2.0.
++
++local fs = require "nixio.fs"
++local uci = require "luci.model.uci".cursor()
++local community = uci:get("freifunk", "community", "name")
++
++if community == nil then
++ luci.http.redirect(luci.dispatcher.build_url("admin", "freifunk", "profile_error"))
++ return
++else
++ community = "/etc/config/profile_" .. community
++ f = SimpleForm("community", translate("Community profile"), translate("You can manually edit the selected community profile here."))
++
++ t = f:field(TextValue, "cop")
++ t.rmempty = true
++ t.rows = 30
++ function t.cfgvalue()
++ return fs.readfile(community) or ""
++ end
++
++ function f.handle(self, state, data)
++ if state == FORM_VALID then
++ if data.cop then
++ fs.writefile(community, data.cop:gsub("\r\n", "\n"))
++ end
++ end
++ return true
++ end
++ return f
++end
++
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/user_index.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/user_index.lua
+new file mode 100644
+index 0000000..fe1d8fe
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/user_index.lua
+@@ -0,0 +1,30 @@
++local fs = require "nixio.fs"
++local file = "/www/luci-static/index_user.html"
++
++m = Map("freifunk", translate("Edit index page"), translate("You can display additional content on the public index page by inserting valid XHTML in the form below.<br />Headlines should be enclosed between &lt;h2&gt; and &lt;/h2&gt;."))
++
++s = m:section(NamedSection, "community", "public", "")
++s.anonymous = true
++
++di = s:option(Flag, "DefaultText", translate("Disable default content"), translate("If selected then the default content element is not shown."))
++di.enabled = "disabled"
++di.disabled = "enabled"
++di.rmempty = false
++
++t = s:option(TextValue, "_text")
++t.rmempty = true
++t.rows = 20
++
++function t.cfgvalue()
++ return fs.readfile(file) or ""
++end
++
++function t.write(self, section, value)
++ return fs.writefile(file, value)
++end
++
++function t.remove(self, section)
++ return fs.unlink(file)
++end
++
++return m
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/cbi/osmll_value.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/cbi/osmll_value.htm
+new file mode 100644
+index 0000000..78b4dff
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/cbi/osmll_value.htm
+@@ -0,0 +1,55 @@
++<%#
++cc-by-sa Andreas Pittrich <andreas.pittrich@web.de>
++in behalf of the german pirate party (Piratenpartei)
++www.piratenpartei.de
++
++$Id$
++
++-%>
++<%+cbi/valueheader%>
++
++ <% if self:cfgvalue(section) ~= false then %>
++ <% if self.latfield and self.lonfield then %>
++ <input type="hidden" <%= attr("value", string.format('cbid.%s.%s.%s', self.config, section, self.latfield))..attr("id", cbid..".latfield")..attr("name", cbid..".latfield")%>/>
++ <input type="hidden" <%= attr("value", string.format('cbid.%s.%s.%s', self.config, section, self.lonfield))..attr("id", cbid..".lonfield")..attr("name", cbid..".lonfield")%>/>
++ <% end %>
++ <input type="hidden" <%= attr("value", self.centerlat)..attr("id", cbid..".centerlat")..attr("name", cbid..".centerlat")%>/>
++ <input type="hidden" <%= attr("value", self.centerlon)..attr("id", cbid..".centerlon")..attr("name", cbid..".centerlon")%>/>
++ <input type="hidden" <%= attr("value", self.zoom)..attr("id", cbid..".zoom")..attr("name", cbid..".zoom")%>/>
++ <% end %>
++
++ <% if self.popup then %>
++ <input class="cbi-button cbi-input-button" type="button"<%= attr("name", cbid..".button")..attr("id", cbid..".button")..attr("value", self.displaytext)%>
++ onclick="
++ popup=window.open('/luci-static/resources/OSMLatLon.htm', '<%=cbid%>.window', 'innerWidth=<%=self.width%>, innerHeight=<%=self.height%>, location=no, menubar=no, scrollbars=no, status=no, toolbar=no');
++ popup.focus();
++ "
++ />
++ </div>
++ <div>
++ <% else %>
++ <input class="cbi-button cbi-input-button" type="button"<%= attr("name", cbid..".displayosm")..attr("id", cbid..".displayosm")..attr("value", self.displaytext)%>
++ onclick="
++ document.getElementById('<%=cbid..".hideosm"%>').style.display='inline';
++ document.getElementById('<%=cbid..".displayosm"%>').style.display='none';
++ for(var i = 0; Math.min(i, window.frames.length)!=window.frames.lengths; i++){
++ if(frames[i].name=='<%=cbid..".iframe"%>'){
++ document.getElementById('<%=cbid..".iframediv"%>').style.display='block';
++ frames[i].location.href='/luci-static/resources/OSMLatLon.htm';
++ }
++ }
++ "
++ />
++ <input class="cbi-button cbi-input-button" style="display:none" type="button"<%= attr("name", cbid..".hideosm")..attr("id", cbid..".hideosm")..attr("value", self.hidetext)%>
++ onclick="
++ document.getElementById('<%=cbid..".displayosm"%>').style.display='inline';
++ document.getElementById('<%=cbid..".hideosm"%>').style.display='none';
++ document.getElementById('<%=cbid..".iframediv"%>').style.display='none';
++ "
++ />
++ </div>
++ <div class="cbi-value-osmiframesection" id="<%=cbid..".iframediv"%>" style="display:none">
++ <iframe src="" <%= attr("id", cbid..".iframe")..attr("name", cbid..".iframe")..attr("width", self.width)..attr("height", self.height)%> frameborder="0" scrolling="no"></iframe>
++ <%end%>
++
++<%+cbi/valuefooter%>
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/frame.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/frame.htm
+new file mode 100644
+index 0000000..dbf3820
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/frame.htm
+@@ -0,0 +1,29 @@
++<%+header%>
++
++<%
++ local has_latlon = false
++ local uci = require "luci.model.uci".cursor()
++ uci:foreach("olsrd", "LoadPlugin", function(s)
++ if s.library == "olsrd_nameservice.so.0.3" and s.latlon_file then
++ has_latlon = true
++ end
++ end)
++%>
++
++<% if has_latlon then %>
++ <iframe style="width:100%; height:640px; border:none" src="<%=url("freifunk/map/content")%>"></iframe>
++ <h3><%:Legend%>:</h3>
++ <ul>
++ <li><strong><span style="color:#00cc00"><%:Green%></span></strong>:<%:Very good (ETX < 2)%></li>
++ <li><strong><span style="color:#ffcb05"><%:Yellow%></span></strong>:<%:Good (2 < ETX < 4)%></li>
++ <li><strong><span style="color:#ff6600"><%:Orange%></span></strong>:<%:Still usable (4 < ETX < 10)%></li>
++ <li><strong><span style="color:#bb3333"><%:Red%></span></strong>:<%:Bad (ETX > 10)%></li>
++ </ul>
++
++<% else %>
++ <h2><%:Map Error%></h2>
++ <p><%_The OLSRd service is not configured to capture position data from the network.<br />
++ Please make sure that the nameservice plugin is properly configured and that the <em>latlon_file</em> option is enabled.%></p>
++<% end %>
++<%+footer%>
++
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/map.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/map.htm
+new file mode 100644
+index 0000000..c3951f9
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/map.htm
+@@ -0,0 +1,118 @@
++<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
++<html>
++ <head>
++ <title>Map</title>
++ </head>
++
++ <body style="margin:0">
++ <script src="//dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1&s=1" type="text/javascript"></script>
++ <script type="text/javascript">
++ var alias = new Array;
++ var points = new Array;
++ var unkpos = new Array;
++ var lineid = 0;
++ onload=new Function("if(null!=window.ffmapinit)ffmapinit();");
++
++ function Mid(mainip,aliasip)
++ {
++ alias[aliasip]=mainip;
++ }
++
++ function Node(mainip,lat,lon,ishna,hnaip,name)
++ {
++ points[mainip] = new VELatLong(lat, lon);
++ map.AddPushpin(new VEPushpin(mainip, points[mainip],
++ '<%=luci.config.main.resourcebase%>/freifunk-map/'+(ishna?'hna':'node')+'.gif', 'Node:'+name,
++ '<br><img src="<%=luci.config.main.resourcebase%>/freifunk-map/'+(ishna?'hna':'node')+'.gif">'+
++ '<br>IP:'+mainip+'<br>DefGW:'+hnaip));
++ }
++
++ function Self(mainip,lat,lon,ishna,hnaip,name)
++ {
++ //map.SetDashboardSize(VEDashboardSize.Small);
++ map.LoadMap(new VELatLong(lat, lon), 15, VEMapStyle.Hybrid);
++ map.SetScaleBarDistanceUnit(VEDistanceUnit.Kilometers);
++ map.ShowMiniMap(14, 474);
++ Node(mainip,lat,lon,ishna,hnaip,name);
++ }
++
++ function Link(fromip,toip,lq,nlq,etx)
++ {
++ if (0==lineid && null!=window.ffmapstatic) ffmapstatic();
++ if (null != alias[toip]) toip = alias[toip];
++ if (null != alias[fromip]) fromip = alias[fromip];
++ if (null != points[fromip] && null != points[toip])
++ {
++ var color;
++ var red = 240;
++ var green = 0;
++ var blue = 0;
++ var w = 1
++
++ if (etx < 100) {red=252;green=102;blue=0;w=2};
++ if (etx < 10) {red=255;green=203;blue=5;w=3};
++ if (etx < 4) {red=240;green=255;blue=0;w=4};
++ if (etx < 2) {red=0;green=204;blue=0;w=5};
++ if (etx < 1) {red=80;green=0;blue=0;w=1};
++
++ map.AddPolyline(new VEPolyline('id'+lineid, [points[fromip], points[toip]],
++ new VEColor(red, green, blue, 0.5), w));
++
++
++ }
++ else
++ {
++ if (null == points[toip]) unkpos[toip] = '';
++ if (null == points[fromip]) unkpos[fromip] = '';
++ }
++ lineid++;
++ }
++
++ function PLink(fromip,toip,lq,nlq,etx,lata,lona,ishnaa,latb,lonb,ishnab)
++ {
++ Link(fromip,toip,lq,nlq,etx);
++ }
++
++ function ffmapinit()
++ {
++ if(null!=window.map)map.Dispose();
++
++ var INFINITE = 99.99;
++
++ map = new VEMap('ffmap');
++ <%
++ local fd
++ local uci = require "luci.model.uci".cursor()
++
++ uci:foreach("olsrd", "LoadPlugin", function(s)
++ if s.library == "olsrd_nameservice.so.0.3" and s.latlon_file then
++ fd = io.open(s.latlon_file)
++ end
++ end)
++
++ if fd then
++ local data = fd:read("*a")
++ fd:close()
++
++ if data then
++ local line
++ for line in data:gmatch("[^\n]+") do
++ if line:match(";$") then
++ write(line .. "\n")
++ else
++ break
++ end
++ end
++ end
++ end
++ %>
++ }
++
++ function ffgoto(ip)
++ {
++ map.SetCenter(points[ip]);
++ }
++ </script>
++ <div id="ffmap" style="position:relative; width:100%; height:640px;"></div>
++ </body>
++</html>
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/adminindex.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/adminindex.htm
+new file mode 100644
+index 0000000..e0252ba
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/adminindex.htm
+@@ -0,0 +1,51 @@
++<%+header%>
++<%
++local uci = require "luci.model.uci".cursor()
++local contact = uci:get_all("freifunk", "contact")
++local contacturl = luci.dispatcher.build_url(luci.dispatcher.context.path[1], "freifunk", "contact")
++local hostname = uci:get_first ("system", "system", "hostname")
++local latitude = uci:get_first ("system", "system", "latitude")
++local longitude = uci:get_first ("system", "system", "longitude")
++local location = uci:get_first ("system", "system", "location")
++local basicsurl = luci.dispatcher.build_url(luci.dispatcher.context.path[1], "freifunk", "basics")
++local nickname, name, mail
++if not contact then
++ nickname, name, mail = ""
++else
++ nickname = contact.nickname
++ name = contact.name
++ mail = contact.mail
++end
++
++%>
++
++<h2><%:Freifunk Overview%></h2>
++
++<%:These pages will assist you in setting up your router for Freifunk or similar wireless community networks.%>
++<p />
++
++<% if not (hostname and latitude and longitude and location) then%>
++<div class="error">
++ <%:Basic settings are incomplete. Please go to%> <a href='<%=basicsurl%>'><%:Basic settings%></a> <%:and fill out all required fields.%>
++</div>
++<%end%>
++<p />
++
++<% if not (nickname and name and mail) then%>
++<div class="error">
++ <%:Contact information is incomplete. Please go to%> <a href='<%=contacturl%>'><%:Contact%></a> <%:and fill out all required fields.%>
++ <p />
++</div>
++<%end%>
++
++<% uci:foreach("wireless", "wifi-device", function(section)
++ local device = section[".name"]
++ local url = luci.dispatcher.build_url(luci.dispatcher.context.path[1], "network", "wireless")
++ if section.diversity ~= "0" and section.disabled ~= "1" and section.type ~= "mac80211" then
++ print('<div class="error">' .. translate("Diversity is enabled for device") .. ' <b>' .. section[".name"] .. '</b>. '
++ .. translate("Go to") .. ' <a href="' .. url .. '">' .. translate("wireless settings") .. '</a> ' ..
++ translate("to disable it.") .. '</div><p />')
++ end
++end) %>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm
+new file mode 100644
+index 0000000..1add595
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm
+@@ -0,0 +1,64 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2011 Manuel Munz <freifunk at somakoma dot de>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<%
++local uci = require "luci.model.uci".cursor()
++local contact = uci:get_all("freifunk", "contact")
++local nickname, name, mail, phone, location, note
++local lon = uci:get_first("system", "system", "longitude")
++local lat = uci:get_first("system", "system", "latitude")
++
++if not contact then
++ nickname, name, homepage, mail, phone, location, note = ""
++else
++ nickname = contact.nickname or ""
++ name = contact.name or ""
++ homepage = contact.homepage or {}
++ mail = contact.mail or ""
++ phone = contact.phone or ""
++ location = uci:get_first("system", "system", "location") or contact.location
++ note = contact.note or ""
++end
++%>
++
++<h2 name="content"><%:Contact%></h2>
++
++<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>
++ <% 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>
++</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>
++</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>
++</fieldset>
++<%end%>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/index.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/index.htm
+new file mode 100644
+index 0000000..3134f0b
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/index.htm
+@@ -0,0 +1,84 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++<%
++local uci = require "luci.model.uci".cursor()
++local tpl = require "luci.template"
++local fs = require "nixio.fs"
++local ff = {}
++local ff = uci:get_all("freifunk")
++
++if not ff or not ff.community.name then
++ community = "Freifunk"
++ DefaultText = ""
++ nickname = "No Nickname set"
++else
++ community = ff.community.name
++ DefaultText = ff.community.DefaultText
++ nickname = ff.contact.nickname
++end
++
++local co = "profile_" .. community
++--local community = uci:get_first(co, "community", "name") or "Freifunk"
++local url = uci:get_first(co, "community", "homepage") or "http://www.freifunk.net"
++
++
++local usertext = fs.readfile("/www/luci-static/index_user.html")
++
++if DefaultText ~= "disabled" then
++
++ defaulttext = '<h2><a id="content" name="content">'..
++ (translate("Hello and welcome in the network of"))..
++ ' '..
++ (community or "Freifunk Deutschland")..
++ '!</a></h2><p>'..
++ translate("We are an initiative to establish a free, independent and open wireless mesh network.")..
++ '<br />'..
++ translate("This is the access point")..
++ ' '..
++ luci.sys.hostname()..
++ '. '..
++ translate("It is operated by")..
++ ' <a href="'..
++ luci.dispatcher.build_url("freifunk", "contact")..
++ '">'..
++ (nickname or translate("Please set your contact information"))..
++ '</a>.</p><p>'..
++ translate("You can find further information about the global Freifunk initiative at")..
++ ' <a href="http://freifunk.net">Freifunk.net</a>.<br />'..
++ translate("If you are interested in our project then contact the local community")..
++ ' <a href="'..url..'">'..community..'</a>.</p><p><strong>'..
++ translate("Notice")..
++ '</strong>: '..
++ translate("Internet access depends on technical and organisational conditions and may or may not work for you.")..
++ '</p>'
++end
++%>
++
++<%=defaulttext%>
++<%=usertext%>
++
++<%
++-- add custom widgets from view/freifunk/widgets
++local widgets = {}
++local dir = "/usr/lib/lua/luci/view/freifunk/widgets"
++
++uci:foreach("freifunk-widgets", "widget",
++ function(s)
++ if s.enabled == "1" then
++ table.insert(widgets, s)
++ end
++ end)
++
++for k, v in ipairs(widgets) do
++ if v['template'] and fs.access(dir .. "/" .. v['template'] .. "/main.htm") then
++ tpl.render("freifunk/widgets/" .. v['template'] .. "/main", { data = v })
++ end
++end
++
++%>
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/profile_error.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/profile_error.htm
+new file mode 100644
+index 0000000..984fa0a
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/profile_error.htm
+@@ -0,0 +1,11 @@
++<%+header%>
++
++<%
++local profileurl = luci.dispatcher.build_url(luci.dispatcher.context.path[1], "freifunk", "basics")
++%>
++
++<h2><%:Error%></h2>
++<%:You need to select a profile before you can edit it. To select a profile go to%> <a href='<%=profileurl%>'><%:Basic settings%></a>.
++<p/>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm
+new file mode 100644
+index 0000000..fc3948e
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm
+@@ -0,0 +1,364 @@
++<%
++local utl = require "luci.util"
++local sys = require "luci.sys"
++local twa = require "luci.tools.webadmin"
++local ip = require "luci.ip"
++
++-- System
++
++local sysinfo = utl.ubus("system", "info") or { }
++local boardinfo = utl.ubus("system", "board") or { }
++
++local loads = sysinfo.load or { 0, 0, 0 }
++local meminfo = sysinfo.memory or {
++ total = 0,
++ free = 0,
++ buffered = 0,
++ shared = 0
++}
++
++local uptime = twa.date_format(sysinfo.uptime or 0)
++local time = os.date("%a, %d %b %Y, %H:%M:%S")
++local load = string.format("%.2f, %.2f, %.2f", loads[1] / 65535.0, loads[2] / 65535.0, loads[3] / 65535.0)
++
++local mem = string.format(
++ "%.2f MB (%.2f %s, %.2f %s, %.2f %s)",
++ meminfo.total / 1024 / 1024,
++ (meminfo.total - meminfo.free) / 1024 / 1024,
++ tostring(i18n.translate("used")),
++ meminfo.free / 1024 / 1024,
++ tostring(i18n.translate("free")),
++ meminfo.buffered / 1024 / 1024,
++ tostring(i18n.translate("buffered"))
++)
++
++local interval = 5
++
++-- wireless
++local ntm = require "luci.model.network".init()
++local devices = ntm:get_wifidevs()
++local netlist = { }
++local netdevs = { }
++local dev
++for _, dev in ipairs(devices) do
++ local net
++ for _, net in ipairs(dev:get_wifinets()) do
++ netlist[#netlist+1] = net:ifname()
++ netdevs[net:ifname()] = dev:name()
++ end
++end
++local has_iwinfo = pcall(require, "iwinfo")
++
++
++-- Find default routes
++
++local _, r, def4, def6
++
++for _, r in ipairs(ip.routes({ type = 1, dest_exact = "0.0.0.0/0" })) do
++ def4 = {
++ gateway = r.gw:string(),
++ dest = r.dest:string(),
++ dev = r.dev,
++ metr = r.metric or 0
++ }
++ break
++end
++
++for _, r in ipairs(ip.routes({ type = 1, dest_exact = "::/0" })) do
++ def6 = {
++ gateway = r.gw:string(),
++ dest = r.dest:string(),
++ dev = r.dev,
++ metr = r.metric or 0
++ }
++ break
++end
++
++
++if luci.http.formvalue("status") == "1" then
++ local rv = { }
++ for dev in pairs(netdevs) do
++ local j = { id = dev }
++ local iw = luci.sys.wifi.getiwinfo(dev)
++ if iw then
++ local f
++ for _, f in ipairs({
++ "channel", "txpower", "bitrate", "signal", "noise",
++ "quality", "quality_max", "mode", "ssid", "bssid", "encryption", "ifname"
++ }) do
++ j[f] = iw[f]
++ end
++ end
++ rv[#rv+1] = j
++ end
++
++
++ rv[#rv+1] = {
++ time = time,
++ uptime = uptime,
++ load = load,
++ mem = mem,
++ defroutev4 = def4,
++ defroutev6 = def6
++ }
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(rv)
++ return
++end
++-%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++
++<script type="text/javascript">//<![CDATA[
++ XHR.poll(<%=interval%> , '<%=REQUEST_URI%>', { status: 1 },
++ function(x, st)
++ {
++ if (st)
++ {
++ for( var i = 0; i < st.length; i++ )
++ {
++ var iw = st[i];
++ var is_assoc = (iw.bssid && iw.channel);
++ var p = (100 / iw.quality_max * iw.quality);
++ var q = is_assoc ? p : -1;
++
++ var icon;
++ if (q < 0)
++ icon = "<%=resource%>/icons/signal-none.png";
++ else if (q == 0)
++ icon = "<%=resource%>/icons/signal-0.png";
++ else if (q < 25)
++ icon = "<%=resource%>/icons/signal-0-25.png";
++ else if (q < 50)
++ icon = "<%=resource%>/icons/signal-25-50.png";
++ else if (q < 75)
++ icon = "<%=resource%>/icons/signal-50-75.png";
++ else
++ icon = "<%=resource%>/icons/signal-75-100.png";
++
++ var power = document.getElementById(iw.id + '-txpower');
++ if (power)
++ power.innerHTML = String.format('%s dbm', iw.txpower);
++
++ var signal = document.getElementById(iw.id + '-signal');
++ if (signal)
++ signal.innerHTML = String.format(
++ '<img src="%s" title="Signal: %s db / Noise: %s db" alt="Signal Quality" />',
++ icon, iw.signal, iw.noise
++ );
++
++ var bitrate = document.getElementById(iw.id + '-bitrate');
++ if (bitrate)
++ bitrate.innerHTML = String.format('%s Mb/s', iw.bitrate ? iw.bitrate / 1000 : '?');
++
++ var ssid = document.getElementById(iw.id + '-ssid');
++ if (ssid)
++ ssid.innerHTML = iw.ssid;
++
++ var bssid = document.getElementById(iw.id + '-bssid');
++ if (bssid)
++ bssid.innerHTML = iw.bssid;
++
++ var channel = document.getElementById(iw.id + '-channel');
++ if (channel)
++ channel.innerHTML = iw.channel;
++
++ var mode = document.getElementById(iw.id + '-mode');
++ if (mode)
++ mode.innerHTML = iw.mode;
++ }
++
++ i = st.length - 1
++ var u
++
++ if (u = document.getElementById('dynuptime'))
++ u.innerHTML = st[i].uptime;
++
++ if (u = document.getElementById('dynload'))
++ u.innerHTML = st[i].load;
++
++ if (u = document.getElementById('dynmem'))
++ u.innerHTML = st[i].mem;
++
++ if (u = document.getElementById('dyntime'))
++ u.innerHTML = st[i].time;
++
++ if (st[i].defroutev4)
++ {
++ if (u = document.getElementById('v4dst'))
++ u.innerHTML = st[i].defroutev4.dest;
++
++ if (u = document.getElementById('v4gw'))
++ u.innerHTML = st[i].defroutev4.gateway;
++
++ if (u = document.getElementById('v4dev'))
++ u.innerHTML = st[i].defroutev4.dev;
++
++ if (u = document.getElementById('v4metr'))
++ u.innerHTML = st[i].defroutev4.metr;
++ }
++
++ if (st[i].defroutev6)
++ {
++ if (u = document.getElementById('v6dst'))
++ u.innerHTML = st[i].defroutev6.dest;
++
++ if (u = document.getElementById('v6gw'))
++ u.innerHTML = st[i].defroutev6.gateway;
++
++ if (u = document.getElementById('v6dev'))
++ u.innerHTML = st[i].defroutev6.dev;
++
++ if (u = document.getElementById('v6metr'))
++ u.innerHTML = st[i].defroutev6.metr;
++ }
++ }
++ }
++ );
++//]]></script>
++
++<div class="cbi-map">
++ <h2><%:System%></h2>
++ <div class="cbi-section-node">
++ <div class="cbi-value"><label class="cbi-value-title"><%:System%></label><div class="cbi-value-field"><%=boardinfo.system or "?"%></div></div>
++ <div class="cbi-value"><label class="cbi-value-title"><%:Model%></label><div class="cbi-value-field"><%=boardinfo.model or "?"%></div></div>
++ <div class="cbi-value"><label class="cbi-value-title"><%:Load%></label><div class="cbi-value-field" id="dynload"><%=load%></div></div>
++ <div class="cbi-value"><label class="cbi-value-title"><%:Memory%></label><div class="cbi-value-field" id="dynmem"><%=mem%></div></div>
++ <div class="cbi-value"><label class="cbi-value-title"><%:Local Time%></label><div class="cbi-value-field" id="dyntime"><%=time%></div></div>
++ <div class="cbi-value"><label class="cbi-value-title"><%:Uptime%></label><div class="cbi-value-field" id="dynuptime"><%=uptime%></div></div>
++ </div>
++</div>
++
++<% if devices[1] then %>
++
++<div class="cbi-map">
++ <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>
++ <% 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>
++ <%
++ for _, dev in ipairs(devices) do
++ local net
++ for _, net in ipairs(dev:get_wifinets()) do
++ netlist[#netlist+1] = net:ifname()
++ netdevs[net:ifname()] = dev:name()
++
++ if net.iwdata.device then
++ local signal = net.iwinfo.signal or "N/A"
++ local noise = net.iwinfo.noise or "N/A"
++ local q = net.iwinfo.quality or "0"
++ local qmax = net.iwinfo.quality_max or "100"
++ local qperc = q / qmax * 100
++
++ if qperc == 0 then
++ icon = "signal-none.png"
++ elseif qperc < 26 then
++ icon = "signal-0-25.png"
++ elseif qperc < 51 then
++ icon = "signal-25-50.png"
++ elseif qperc < 76 then
++ icon = "signal-50-75.png"
++ elseif qperc < 100 then
++ icon = "signal-75-100.png"
++ else
++ icon = "signal-0.png"
++ end
++
++ signal_string = "<img src='"..resource.."/icons/"..icon.."' title='Signal: "..signal.." db / Noise: "..noise.." db' alt='Signal Quality'></img>"
++
++ local ssid = net.iwinfo.ssid or "N/A"
++ local bssid = net.iwinfo.bssid or "N/A"
++ local chan = net.iwinfo.channel or "N/A"
++ local mode = net.iwinfo.mode or "N/A"
++ local txpwr = net.iwinfo.txpower or "N/A"
++ if txpwr ~= "N/A" then
++ txpwr = txpwr.." dbm"
++ end
++ local bitrate = net.iwinfo.bitrate or "N/A"
++ if bitrate ~= "N/A" then
++ bitrate = ( bitrate / 1000 ).."Mb/s"
++ 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>
++ <% end
++ end
++ end %>
++ </table>
++ </div>
++ </div>
++</div>
++<% end %>
++
++<div class="cbi-map">
++ <h2><%:Default routes%></h2>
++ <div class="cbi-section">
++ <div class="cbi-section-node">
++
++<% 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>
++
++ <% 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>
++
++ <% 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>
++
++ <% end %>
++
++ </table>
++<% end %>
++ </div>
++ </div>
++</div>
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/remote_update.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/remote_update.htm
+new file mode 100644
+index 0000000..83e1ee5
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/remote_update.htm
+@@ -0,0 +1,51 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%+header%>
++
++<h2><%:Freifunk Remote Update%></h2>
++
++<p><%:Check for new firmware versions and perform automatic updates.%></p>
++
++<% if update then %>
++
++ <% if update.info then %>
++ <strong><%:Update available!%></strong>
++ <br /><br />
++ <pre><%=update.info%></pre><br />
++ <% else %>
++ <strong><%:The installed firmware is the most recent version.%></strong>
++ <br /><br />
++ <% end %>
++
++ <p>
++ <form method="post" action="" class="inline">
++ <input type="hidden" name="flash" value="1" />
++ <input type="submit" class="cbi-button cbi-button-apply" value="<%:Start Upgrade%>" />
++ </form>
++ </p>
++
++<% elseif confirm then %>
++
++ <strong><%:Update Settings%></strong>
++ <br /><br />
++
++ <p><form method="post" action="" class="inline">
++ <input type="hidden" name="flash" value="1" />
++ <input type="hidden" name="confirm" value="1" />
++
++ <input type="checkbox" class="cbi-input-checkbox" name="keepcfg" value="1" checked="checked" id="cb_keepcfg" />
++ <label for="cb_keepcfg"><%:Keep configuration%></label><br />
++
++ <input type="checkbox" class="cbi-input-checkbox" name="verify" value="1" checked="checked" id="cb_verify" />
++ <label for="cb_verify"><%:Verify downloaded images%></label><br /><br />
++
++ <input type="submit" class="cbi-button cbi-button-apply" value="<%:Confirm Upgrade%>" />
++ </form></p>
++
++<% end %>
++
++<%+footer%>
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/ca/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/ca/freifunk.po
+new file mode 100644
+index 0000000..338c688
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/ca/freifunk.po
+@@ -0,0 +1,407 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-07-18 00:15+0200\n"
++"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: ca\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr "Dolent (ETX > 10)"
++
++msgid "Basic Settings"
++msgstr "Ajusts bàsics"
++
++msgid "Basic settings"
++msgstr "Ajusts bàsics"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "Els ajusts bàsics estan incomplets. Si us plau, aneu a"
++
++msgid "Basic system settings"
++msgstr "Ajusts de sistema bàsics"
++
++msgid "Bitrate"
++msgstr "Velocitat de bits"
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++"Busca versions de microprogramari noves i realitza actualitzacions "
++"automàtiques."
++
++msgid "Client network size"
++msgstr "Mida de xarxa client"
++
++msgid "Community"
++msgstr "Comunitat"
++
++msgid "Community profile"
++msgstr "Perfil de comunitat"
++
++msgid "Community settings"
++msgstr "Ajusts de comunitat"
++
++msgid "Confirm Upgrade"
++msgstr "Confirma actualització"
++
++msgid "Contact"
++msgstr "Contacte"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr "La informació de contacte està incompleta. Si us plau, aneu a"
++
++msgid "Coordinates"
++msgstr "Coordenades"
++
++msgid "Country code"
++msgstr "Codi de país"
++
++msgid "Default routes"
++msgstr "Rutes per defecte"
++
++msgid "Disable default content"
++msgstr "Deshabilita el contingut per defecte"
++
++msgid "Diversity is enabled for device"
++msgstr "La diversitat està habilitada en el dispositiu"
++
++msgid "E-Mail"
++msgstr "Adreça electrònica"
++
++msgid "ESSID"
++msgstr "ESSID"
++
++msgid "Edit index page"
++msgstr "Edita la pàgina d'índex"
++
++msgid "Enable IPv6"
++msgstr "Habilita IPv6"
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr "Habilita un punt d'accés virtual (VAP) per defecte si és possible."
++
++msgid "Error"
++msgstr "Error"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr "Troba les vostres coordenades amb l'OpenStreetMap"
++
++msgid "Freifunk"
++msgstr "Freifunk"
++
++msgid "Freifunk Overview"
++msgstr "Visió de conjunt del Freifunk"
++
++msgid "Freifunk Remote Update"
++msgstr "Actualització remota del Freifunk"
++
++msgid "Gateway"
++msgstr "Passarel·la"
++
++msgid "Go to"
++msgstr "Vés a"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "Bo (2 < ETX < 4)"
++
++msgid "Green"
++msgstr "Verd"
++
++msgid "Hello and welcome in the network of"
++msgstr "Hola i benvingut a la xarxa de"
++
++msgid "Hide OpenStreetMap"
++msgstr "Amaga l'OpenStreetMap"
++
++msgid "Homepage"
++msgstr "Pàgina principal"
++
++msgid "Hostname"
++msgstr "Nom de màquina"
++
++msgid "IPv6 Config"
++msgstr "Configuració IPv6"
++
++msgid "IPv6 Prefix"
++msgstr "Prefix IPv6"
++
++msgid "IPv6 network in CIDR notation."
++msgstr "Xarxa IPv6 en notació CIDR."
++
++msgid "If selected then the default content element is not shown."
++msgstr "Si està seleccionat, l'element de contingut per defecte no es mostra."
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++"Si estàs interessat en el nostre projecte, llavors contacta la comunitat "
++"local"
++
++msgid "Index Page"
++msgstr "Pàgina d'índex"
++
++msgid "Interface"
++msgstr "Interfície"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"L'accés a Internet depèn de les condicions tècniques i organitzatives, i pot "
++"funcionar o no per tu."
++
++msgid "It is operated by"
++msgstr "És administrat per"
++
++msgid "Keep configuration"
++msgstr "Manté la configuració"
++
++msgid "Latitude"
++msgstr "Latitud"
++
++msgid "Legend"
++msgstr "Llegenda"
++
++msgid "Load"
++msgstr "Càrrega"
++
++msgid "Local Time"
++msgstr "Hora local"
++
++msgid "Location"
++msgstr "Ubicació"
++
++msgid "Longitude"
++msgstr "Longitud"
++
++msgid "Map"
++msgstr "Mapa"
++
++msgid "Map Error"
++msgstr "Error de mapa"
++
++msgid "Memory"
++msgstr "Memòria"
++
++msgid "Mesh prefix"
++msgstr "Prefix de malla"
++
++msgid "Metric"
++msgstr "Mètric"
++
++msgid "Mode"
++msgstr "Mode"
++
++msgid "Network"
++msgstr "Xarxa"
++
++msgid "Network for client DHCP addresses"
++msgstr "Xarxa de les adreces DHCP dels clients"
++
++msgid "Nickname"
++msgstr "Nickname"
++
++msgid "No default routes known."
++msgstr "No es coneix cap ruta per defecte."
++
++msgid "Notice"
++msgstr "Avís"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "Operator"
++msgstr "Operador"
++
++msgid "Orange"
++msgstr "Taronja"
++
++msgid "Overview"
++msgstr "Visió de conjunt"
++
++msgid "Package libiwinfo required!"
++msgstr "Es requereix el paquet libiwinfo!"
++
++msgid "Phone"
++msgstr "Telèfon"
++
++msgid "Please fill in your contact details below."
++msgstr "Si us plau, empleneu els vostres detalls de contacte a baix."
++
++msgid "Please set your contact information"
++msgstr "Si us plau, establiu la vostra informació de contacte"
++
++msgid "Power"
++msgstr "Potència"
++
++msgid "Processor"
++msgstr "Processador"
++
++msgid "Profile"
++msgstr "Perfil"
++
++msgid "Profile (Expert)"
++msgstr "Perfil (expert)"
++
++msgid "Realname"
++msgstr "Nom real"
++
++msgid "Red"
++msgstr "Xarxa"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++"Seleccioneu la vostra ubicació per un clic del ratolí en el mapa. El mapa es "
++"mostra només si esteu connectat al Internet."
++
++msgid "Show OpenStreetMap"
++msgstr "Mostra OpenStreetMap"
++
++msgid "Show on map"
++msgstr "Mostra en mapa"
++
++msgid "Signal"
++msgstr "Senyal"
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr "Inicia l'actualització"
++
++msgid "Statistics"
++msgstr "Estadístiques"
++
++msgid "Status"
++msgstr "Estat"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr "Encara utilitzable (4 < ETX < 10)"
++
++msgid "System"
++msgstr "Sistema"
++
++msgid "TX"
++msgstr "TX"
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"El paquet <em>libiwinfo</em> no està instal·lat. Heu d'instal·lar aquest "
++"component per a tenir una configuració sense fil funcionant!"
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr "El microprogramari instal·lat és la versió més recent."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr "Aquests són els ajusts de la vostra comunitat local."
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr "Això és el punt d'accés"
++
++msgid "Update Settings"
++msgstr "Actualitza els ajusts"
++
++msgid "Update available!"
++msgstr "Actualització disponible!"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr "Molt bo (ETX < 2)"
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++"Som una iniciativa per establir una xarxa mesh lliure, independent i oberta."
++
++msgid "Wireless Overview"
++msgstr "Visió de conjunt sense fil"
++
++msgid "Yellow"
++msgstr "Groc"
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr "Pots trobar més informació sobre la iniciativa global Freifunk a"
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr "lliure"
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr "utilitzat"
++
++msgid "wireless settings"
++msgstr "ajusts sense fil"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/cs/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/cs/freifunk.po
+new file mode 100644
+index 0000000..cf22c00
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/cs/freifunk.po
+@@ -0,0 +1,404 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-08-08 21:21+0200\n"
++"Last-Translator: koli <lukas.koluch@gmail.com>\n"
++"Language-Team: none\n"
++"Language: cs\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr "Špatné (ETX > 10)"
++
++msgid "Basic Settings"
++msgstr "Základní nastavení"
++
++msgid "Basic settings"
++msgstr "Základní nastavení"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "Základní nastavení není kompletní. Prosím přejděte na"
++
++msgid "Basic system settings"
++msgstr "Základní nastavení systému"
++
++msgid "Bitrate"
++msgstr "Datový tok"
++
++msgid "Channel"
++msgstr "Kanál"
++
++#, fuzzy
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++"Zkontrolovat dostupnost nové verze firmwaru a provést automatické "
++"aktualizace."
++
++msgid "Client network size"
++msgstr "Velikost klientské sítě"
++
++msgid "Community"
++msgstr "Komunita"
++
++msgid "Community profile"
++msgstr "Komunitní profil"
++
++msgid "Community settings"
++msgstr "Nastavení komunity"
++
++msgid "Confirm Upgrade"
++msgstr "PotvrÄte upgrade"
++
++msgid "Contact"
++msgstr "Kontakt"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr "Kontaktní informace není kompletní. Prosím pokraÄujte na"
++
++msgid "Coordinates"
++msgstr "Souřadnice"
++
++msgid "Country code"
++msgstr "Kód země"
++
++msgid "Default routes"
++msgstr "Výchozí trasy"
++
++#, fuzzy
++msgid "Disable default content"
++msgstr "Zakázat výchozí obsah"
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr "E-Mail"
++
++msgid "ESSID"
++msgstr "ESSID"
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr "Povolit IPv6"
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr "Chyba"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr "Najděte své souřadnice pomocí OpenStreetMap"
++
++msgid "Freifunk"
++msgstr "Freifunk"
++
++msgid "Freifunk Overview"
++msgstr "Freifunk - Přehled"
++
++msgid "Freifunk Remote Update"
++msgstr "Freifunk - Vzdálené aktualizace"
++
++msgid "Gateway"
++msgstr "Brána"
++
++msgid "Go to"
++msgstr "Jít na"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "Dobré (2 < ETX < 4)"
++
++msgid "Green"
++msgstr "Zelený"
++
++msgid "Hello and welcome in the network of"
++msgstr "Dobrý den, vítejte v síti"
++
++msgid "Hide OpenStreetMap"
++msgstr "Skrýt OpenStreetMap"
++
++msgid "Homepage"
++msgstr "Domovská stránka"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "IPv6 Config"
++msgstr "Konfigurace IPv6"
++
++msgid "IPv6 Prefix"
++msgstr "IPv6 Prefix"
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr "Pokud se zajímáte o náš projekt, kontaktujte místní komunitu"
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr "Rozhraní"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"Přístup k Internetu závisí na technických a organizaÄních podmínkách. Může "
++"(ale nemusí) vám fungovat."
++
++msgid "It is operated by"
++msgstr ""
++
++msgid "Keep configuration"
++msgstr "Uchovat nastavení"
++
++msgid "Latitude"
++msgstr "Zeměpisná šířka"
++
++msgid "Legend"
++msgstr "Legenda"
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr "Místní Äas"
++
++msgid "Location"
++msgstr "Umístění"
++
++msgid "Longitude"
++msgstr "Zeměpisná délka"
++
++msgid "Map"
++msgstr "Mapa"
++
++msgid "Map Error"
++msgstr "Chyba mapy"
++
++msgid "Memory"
++msgstr "Paměť"
++
++msgid "Mesh prefix"
++msgstr "Mesh prefix"
++
++msgid "Metric"
++msgstr "Metrika"
++
++msgid "Mode"
++msgstr "Režim"
++
++msgid "Network"
++msgstr "Síť"
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr "Přezdívka"
++
++msgid "No default routes known."
++msgstr "Nejsou známy výchozí cesty"
++
++msgid "Notice"
++msgstr "Upozornění"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "Operator"
++msgstr "Operátor"
++
++msgid "Orange"
++msgstr "Oranžový"
++
++msgid "Overview"
++msgstr "Přehled"
++
++msgid "Package libiwinfo required!"
++msgstr "BalíÄek libiwinfo je vyžadován!"
++
++msgid "Phone"
++msgstr "Telefon"
++
++msgid "Please fill in your contact details below."
++msgstr "Prosím níže vyplňte kontaktní detaily."
++
++msgid "Please set your contact information"
++msgstr "Prosím nastavte si vaše kontaktní informace"
++
++msgid "Power"
++msgstr "Výkon"
++
++msgid "Processor"
++msgstr "Procesor"
++
++msgid "Profile"
++msgstr "Profil"
++
++msgid "Profile (Expert)"
++msgstr "Profil (Expert)"
++
++msgid "Realname"
++msgstr "SkuteÄné jméno"
++
++msgid "Red"
++msgstr "Červený"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++"Kliknutím na mapu vyberte vaše umístění. Mapa se zobrazí, pouze pokud jste "
++"připojen do sítě Internet."
++
++msgid "Show OpenStreetMap"
++msgstr "Zobrazit OpenStreetMap"
++
++msgid "Show on map"
++msgstr "Zobrazit na mapÄ›"
++
++msgid "Signal"
++msgstr "Signál"
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr "Spustit aktualizaci"
++
++msgid "Statistics"
++msgstr "Statistiky"
++
++msgid "Status"
++msgstr "Stav"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr "Stále použitelné (4 < ETX < 10)"
++
++msgid "System"
++msgstr "Systém"
++
++msgid "TX"
++msgstr "TX"
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"BalíÄek <em>libiwinfo</em> není nainstalován. Je tÅ™eba ho nainstalovat, aby "
++"byla funkÄní konfigurace bezdrátové sítÄ›!"
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr "Nainstalovaný firmware je aktuální."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr "To je přístupový bod (AP)"
++
++msgid "Update Settings"
++msgstr "Nastavení aktualizace"
++
++msgid "Update available!"
++msgstr "Aktualizace dostupná!"
++
++msgid "Uptime"
++msgstr "Doba provozu"
++
++msgid "VAP"
++msgstr "VAP"
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr "Velmi dobré (ETX < 2)"
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr "Žlutý"
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr "napÅ™."
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr "nastavení bezdrátové sítě"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/de/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/de/freifunk.po
+new file mode 100644
+index 0000000..ff6e6bc
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/de/freifunk.po
+@@ -0,0 +1,447 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2011-05-12 17:58+0200\n"
++"PO-Revision-Date: 2013-01-28 22:17+0200\n"
++"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: de\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr "Schlecht (ETX > 10)"
++
++msgid "Basic Settings"
++msgstr "Grundeinstellungen"
++
++msgid "Basic settings"
++msgstr "Grundeinstellungen"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "Die Grundeinstellungen sind unvollständig. Bitte gehe zur Seite"
++
++msgid "Basic system settings"
++msgstr "Grundlegende Systemeinstellungen"
++
++msgid "Bitrate"
++msgstr "Bitrate"
++
++msgid "Channel"
++msgstr "Kanal"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++"Der Fernupdate-Mechanismus prüft nach neuen Firmware-Versionen und führt "
++"automatisierte Updates durch."
++
++msgid "Client network size"
++msgstr "Größe des DHCP-Netzes"
++
++msgid "Community"
++msgstr "Community"
++
++msgid "Community profile"
++msgstr "Community Profile"
++
++msgid "Community settings"
++msgstr "Community Einstellungen"
++
++msgid "Confirm Upgrade"
++msgstr "Updatevorgang starten"
++
++msgid "Contact"
++msgstr "Kontakt"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr "Die Kontaktinformationen sind unvollständig. Bitte gehe zur Seite"
++
++msgid "Coordinates"
++msgstr "Geokoordinaten"
++
++msgid "Country code"
++msgstr "Ländercode"
++
++msgid "Default routes"
++msgstr "Standardrouten"
++
++msgid "Disable default content"
++msgstr "Standardtext deaktivieren"
++
++msgid "Diversity is enabled for device"
++msgstr "Diversity ist aktiv für das Interface"
++
++msgid "E-Mail"
++msgstr "E-Mail"
++
++msgid "ESSID"
++msgstr "ESSID"
++
++msgid "Edit index page"
++msgstr "Indexseite bearbeiten"
++
++msgid "Enable IPv6"
++msgstr "IPv6 aktivieren"
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr "Fehler"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr "Geokoordinaten mit OpenStreetMap ermitteln"
++
++msgid "Freifunk"
++msgstr "Freifunk"
++
++msgid "Freifunk Overview"
++msgstr "Freifunk Ãœbersicht"
++
++msgid "Freifunk Remote Update"
++msgstr "Freifunk Fernupdate"
++
++msgid "Gateway"
++msgstr "Gateway"
++
++msgid "Go to"
++msgstr "Gehe zu"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "Gut (2 < ETX < 4)"
++
++msgid "Green"
++msgstr "Grün"
++
++msgid "Hello and welcome in the network of"
++msgstr "Hallo und willkommen im Netz von"
++
++msgid "Hide OpenStreetMap"
++msgstr "OpenStreetMap ausblenden"
++
++msgid "Homepage"
++msgstr "Homepage"
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "IPv6 Config"
++msgstr "IPv6 Konfiguration"
++
++msgid "IPv6 Prefix"
++msgstr "IPv6 Prefix"
++
++msgid "IPv6 network in CIDR notation."
++msgstr "IPv6 Subnetz in CIDR-Notation"
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++"Wird diese Option gewählt dann wird das standardmässige Inhaltselement nicht "
++"angezeigt."
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++"Hast du Interesse an diesem Projekt, dann wende dich an deine lokale "
++"Gemeinschaft"
++
++msgid "Index Page"
++msgstr "Index-Seite"
++
++msgid "Interface"
++msgstr "Schnittstelle"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"Der Internetzugang über das experimentelle Freifunknetz ist an technische "
++"und organisatorische Bedingungen geknüpft und deshalb möglicherweise nicht "
++"(immer) gewährleistet."
++
++msgid "It is operated by"
++msgstr "Er wird betrieben von "
++
++msgid "Keep configuration"
++msgstr "Konfigurationsdateien wiederherstellen"
++
++msgid "Latitude"
++msgstr "Breite"
++
++msgid "Legend"
++msgstr "Erklärung"
++
++msgid "Load"
++msgstr "Load"
++
++msgid "Local Time"
++msgstr "Lokale Zeit"
++
++msgid "Location"
++msgstr "Standort"
++
++msgid "Longitude"
++msgstr "Länge"
++
++msgid "Map"
++msgstr "Karte"
++
++msgid "Map Error"
++msgstr "Fehler beim Darstellen der Karte"
++
++msgid "Memory"
++msgstr "Hauptspeicher"
++
++msgid "Mesh prefix"
++msgstr "Prefix des Meshs"
++
++msgid "Metric"
++msgstr "Metrik"
++
++msgid "Mode"
++msgstr "Modus"
++
++msgid "Network"
++msgstr "Netzwerk"
++
++msgid "Network for client DHCP addresses"
++msgstr "Netzwerk aus dem IPs für Clients vergeben werden"
++
++msgid "Nickname"
++msgstr "Pseudonym"
++
++msgid "No default routes known."
++msgstr "Es sind keine Standardrouten bekannt."
++
++msgid "Notice"
++msgstr "Notiz"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "Operator"
++msgstr "Betreiber"
++
++msgid "Orange"
++msgstr "Orange"
++
++msgid "Overview"
++msgstr "Ãœbersicht"
++
++msgid "Package libiwinfo required!"
++msgstr "Das Paket libiwinfo wird benötigt!"
++
++msgid "Phone"
++msgstr "Telefon"
++
++msgid "Please fill in your contact details below."
++msgstr "Bitte gib hier deine Kontaktdaten an."
++
++msgid "Please set your contact information"
++msgstr "Bitte gib deine Kontaktinformationen ein"
++
++msgid "Power"
++msgstr "Power"
++
++msgid "Processor"
++msgstr "Prozessor"
++
++msgid "Profile"
++msgstr "Profil"
++
++msgid "Profile (Expert)"
++msgstr "Profil (Expertenmodus)"
++
++msgid "Realname"
++msgstr "Name"
++
++msgid "Red"
++msgstr "Rot"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++"Wähle hier deinen Standort durch einen Mausklick aus. Die Karte funktioniert "
++"nur, wenn bereits eine Verbindung zum Internet besteht."
++
++msgid "Show OpenStreetMap"
++msgstr "OpenStreetMap anzeigen"
++
++msgid "Show on map"
++msgstr "Karte öffnen"
++
++msgid "Signal"
++msgstr "Signal"
++
++msgid "Splash"
++msgstr "Splash"
++
++msgid "Start Upgrade"
++msgstr "Updatevorgang starten"
++
++msgid "Statistics"
++msgstr "Statistiken"
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr "Noch nutzbar (4 < ETX < 10)"
++
++msgid "System"
++msgstr "System"
++
++msgid "TX"
++msgstr "TX"
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"Das <em>libiwinfo</em>-Paket ist nicht installiert. Dieses Paket muss für "
++"eine funktionierende WLAN-Konfiguration vorhanden sein!"
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++"OLSRd ist nicht dafür konfiguriert worden Geoinformationen zu speichern.<br /"
++"> Bitte sicherstellen dass das OLSRd-Nameservice-Plugin geladen und richtig "
++"konfiguriert wurde (Option latlon_file)."
++
++msgid "The installed firmware is the most recent version."
++msgstr "Die installierte Firmware ist bereits die neueste Version."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++"Dies hier sind die Grundeinstellungen für die Freifunk Community in deiner "
++"Nachbarschaft. Diese Einstellungen legen die Standardwerte für den ffwizard "
++"fest und beeinflussen die aktuelle Konfiguration des Routers NICHT."
++
++msgid "These are the settings of your local community."
++msgstr "Dies sind die Einstellungen für deine Freifunk Community."
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++"Diese Seiten helfen dabei, den Router für Freifunk oder ähnliche Wireless "
++"Community Netzwerke einzurichten."
++
++msgid "This is the access point"
++msgstr "Dies ist der Zugangspunkt "
++
++msgid "Update Settings"
++msgstr "Einstellungen zum Update"
++
++msgid "Update available!"
++msgstr "Update verfügbar!"
++
++msgid "Uptime"
++msgstr "Uptime"
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr "Heruntergeladene Images verifizieren"
++
++msgid "Very good (ETX < 2)"
++msgstr "Sehr gut (ETX < 2) "
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++"Wir sind eine Initiative zur Schaffung eines freien, offenen und "
++"unabhängigen Funknetzwerks auf WLAN-Basis."
++
++msgid "Wireless Overview"
++msgstr "WLAN Ãœbersicht"
++
++msgid "Yellow"
++msgstr "Gelb"
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++"Hier kann der Indexseite weiterer Inhalt hinzugefügt werden. Dazu muss "
++"gültiges XHTML verwendet werden.<br />Überschriften sollten zwischen den "
++"Tags &lt;h2&gt; und &lt;/h2&gt; eingeschlossen werden."
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr "Weitere Informationen zur globalen Freifunkinitiative findest du unter"
++
++msgid "You can manually edit the selected community profile here."
++msgstr "Hier kann das ausgewählte Community-Profil bearbeitet werden."
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++"Es muss ein Profil ausgewählt werden, bevor es editiert werden kann. Gehe "
++"dazu zur Seite"
++
++msgid "and fill out all required fields."
++msgstr "und fülle alle benötigten Felder aus."
++
++msgid "buffered"
++msgstr "gepuffert"
++
++msgid "cached"
++msgstr "gecacht"
++
++msgid "e.g."
++msgstr "z.B."
++
++msgid "free"
++msgstr "ungenutzt"
++
++msgid "to disable it."
++msgstr "um es auszuschalten."
++
++msgid "used"
++msgstr "benutzt"
++
++msgid "wireless settings"
++msgstr "Drahtloseinstellungen"
++
++#~ msgid ""
++#~ "No services can be shown, because olsrd is not running or the olsrd-"
++#~ "nameservice Plugin is not loaded."
++#~ msgstr ""
++#~ "Es kann keine Liste der Dienste angezeigt werden, da olsrd nicht läuft "
++#~ "oder das nameservice plugin nicht geladen oder konfiguriert wurde."
++
++#~ msgid "Services"
++#~ msgstr "Dienste"
++
++#~ msgid "Source"
++#~ msgstr "Quelle"
++
++#~ msgid ""
++#~ "The <em>libiwinfo-lua</em> package is not installed. You must install "
++#~ "this component for working wireless configuration!"
++#~ msgstr ""
++#~ "Das <em>libiwinfo-lua</em>-Paket ist nicht installiert. Das Paket muss "
++#~ "für eine funktionierende WLAN-Konfiguration installiert sein!"
++
++#~ msgid "Url"
++#~ msgstr "Adresse"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/el/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/el/freifunk.po
+new file mode 100644
+index 0000000..95d58ea
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/el/freifunk.po
+@@ -0,0 +1,407 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-28 02:08+0200\n"
++"PO-Revision-Date: 2012-03-18 15:11+0200\n"
++"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: el\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.4\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr "Βασικές Ρυθμίσεις"
++
++msgid "Basic settings"
++msgstr "Βασικές Ïυθμίσεις"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr "Βασικές Ïυθμίσεις συστήματος"
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr "Κανάλι"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr "Κοινότητα"
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr "Επικοινωνία"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr "Συντεταγμένες"
++
++msgid "Country code"
++msgstr "Κωδικός xÏŽÏας"
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr "Ηλ. ΤαχυδÏομείο"
++
++msgid "ESSID"
++msgstr "ESSID"
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr "Σφάλμα"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr "ΠÏλη"
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr "Γεια σας και καλώς ήλθατε στο δίκτυο"
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr "Αν ενδιαφέÏεστε για το έÏγο μας, επικοινωνήστε με την τοπική κοινότητα"
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr "Διεπαφή"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"Η Ï€Ïόσβαση στο διαδίκτυο εξαÏτάται από τις τεχνικές και τις οÏγανωτικές "
++"συνθήκες και μποÏεί να λειτουÏγεί ή όχι για σας."
++
++msgid "It is operated by"
++msgstr "ΔιαχειÏίζεται από"
++
++msgid "Keep configuration"
++msgstr ""
++
++msgid "Latitude"
++msgstr "ΓεωγÏαφικό πλάτος"
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr "Τοπική ÎÏα"
++
++msgid "Location"
++msgstr "Τοποθεσία"
++
++msgid "Longitude"
++msgstr "ΓεωγÏαφικό μήκος"
++
++msgid "Map"
++msgstr "ΧάÏτης"
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr "Μνήμη"
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr "Δίκτυο"
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr "Ψευδώνυμο"
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr "Σημείωση"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr "Τηλέφωνο"
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr "ΕπεξεÏγαστής"
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr "Ονοματεπώνυμο"
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr "Σήμα"
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr "Στατιστικά"
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr "ΣÏστημα"
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr "Αυτές είναι οι Ïυθμίσεις της τοπικής σας κοινότητας."
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++"Αυτές οι σελίδες θα σας βοηθήσουν να Ïυθμίσετε το δÏομολογητή σας για το "
++"Freifunk ή παÏόμοια ασÏÏματα κοινοτικά δίκτυα."
++
++msgid "This is the access point"
++msgstr "Αυτό είναι το access point"
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++"Είμαστε μία Ï€Ïωτοβουλία για την εδÏαίωση ενός ελεÏθεÏου, ανεξάÏτητου και "
++"Î±Î½Î¿Î¹Ï‡Ï„Î¿Ï Î±ÏƒÏÏματου mesh δικτÏου."
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++"ΜποÏείτε να βÏείτε πεÏισσότεÏες πληÏοφοÏίες για την παγκόσμια Ï€Ïωτοβουλία "
++"Freifunk στο"
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr "π.χ."
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
++
++#~ msgid "Source"
++#~ msgstr "Πηγή"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/en/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/en/freifunk.po
+new file mode 100644
+index 0000000..bf99116
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/en/freifunk.po
+@@ -0,0 +1,400 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-30 06:42+0200\n"
++"PO-Revision-Date: 2009-07-06 23:21+0200\n"
++"Last-Translator: Jo-Philipp Wich <jow@openwrt.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr "Check for new firmware versions and perform automatic updates."
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr "Coordinates"
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr "E-Mail"
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr "Freifunk Remote Update"
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr "Hello and welcome in the network of"
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr "If you are interested in our project then contact the local community"
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++
++msgid "It is operated by"
++msgstr "It is operated by"
++
++msgid "Keep configuration"
++msgstr "Keep configuration"
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr "Location"
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr "Memory"
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr "Nickname"
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr "Notice"
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr "Phone"
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr "Realname"
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr "Start Upgrade"
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr "The installed firmware is the most recent version."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr "This is the access point"
++
++msgid "Update Settings"
++msgstr "Update Settings"
++
++msgid "Update available!"
++msgstr "Update available!"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr "Verify downloaded images"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++"You can find further information about the global Freifunk initiative at"
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/es/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/es/freifunk.po
+new file mode 100644
+index 0000000..7242268
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/es/freifunk.po
+@@ -0,0 +1,417 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2014-06-15 13:16+0200\n"
++"Last-Translator: José Vicente <josevteg@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: es\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr "Malo (ETX > 10)"
++
++msgid "Basic Settings"
++msgstr "Configuración básica"
++
++msgid "Basic settings"
++msgstr "Configuración básica"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "Configuración básica incompleta. Por favor, vaya a"
++
++msgid "Basic system settings"
++msgstr "Configuración básica del sistema"
++
++msgid "Bitrate"
++msgstr "Bitrate"
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++"Comprobar nuevas versiones de firmware y realizar actualizaciones "
++"automáticas."
++
++msgid "Client network size"
++msgstr "Tamaño de la red cliente"
++
++msgid "Community"
++msgstr "Comunidad"
++
++msgid "Community profile"
++msgstr "Perfil de la comunidad"
++
++msgid "Community settings"
++msgstr "Configuración de la comunidad"
++
++msgid "Confirm Upgrade"
++msgstr "Confirmar actualización"
++
++msgid "Contact"
++msgstr "Contacto"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr "La información de contacto no está completa. Por favor, vaya a"
++
++msgid "Coordinates"
++msgstr "Coordenadas"
++
++msgid "Country code"
++msgstr "Código de país"
++
++msgid "Default routes"
++msgstr "Rutas por defecto"
++
++msgid "Disable default content"
++msgstr "Desactive contenido por defecto"
++
++msgid "Diversity is enabled for device"
++msgstr "Diversidad activar para el dispositivo"
++
++msgid "E-Mail"
++msgstr "E-Mail"
++
++msgid "ESSID"
++msgstr "ESSID"
++
++msgid "Edit index page"
++msgstr "Editar índice"
++
++msgid "Enable IPv6"
++msgstr "Activar IPv6"
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr "Activa un punto virtual de acceso (VAP) por dehecto si es posible."
++
++msgid "Error"
++msgstr "Error"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr "Busca sus coordenadas con OpenStreetMap"
++
++msgid "Freifunk"
++msgstr "Freifunk"
++
++msgid "Freifunk Overview"
++msgstr "Resumen de Freifunk"
++
++msgid "Freifunk Remote Update"
++msgstr "Actualización remota de Freifunk"
++
++msgid "Gateway"
++msgstr "Pasarela"
++
++msgid "Go to"
++msgstr "Ir a"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "Bueno (2 < ETX < 4)"
++
++msgid "Green"
++msgstr "Verde"
++
++msgid "Hello and welcome in the network of"
++msgstr "Hola y bienvenido a la red de"
++
++msgid "Hide OpenStreetMap"
++msgstr "Ocultar OpenStreetMap"
++
++msgid "Homepage"
++msgstr "Página inicial"
++
++msgid "Hostname"
++msgstr "Nombre de máquina"
++
++msgid "IPv6 Config"
++msgstr "Configuración de IPv6"
++
++msgid "IPv6 Prefix"
++msgstr "Prefijo IPv6"
++
++msgid "IPv6 network in CIDR notation."
++msgstr "Red IPv6 en notación CIDR."
++
++msgid "If selected then the default content element is not shown."
++msgstr "No mostrar el contenido por defecto."
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++"Si se encuentra interesado en nuestro proyecto contacte, por favor, con su "
++"comunidad local mas cercana"
++
++msgid "Index Page"
++msgstr "Ãndice"
++
++msgid "Interface"
++msgstr "Interfaz"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"El acceso a Internet depende de condiciones tanto técnicas como "
++"organizativas por lo que puede no funcionarle."
++
++msgid "It is operated by"
++msgstr "Administrado por"
++
++msgid "Keep configuration"
++msgstr "Mantener configuración"
++
++msgid "Latitude"
++msgstr "Latitud"
++
++msgid "Legend"
++msgstr "Leyenda"
++
++msgid "Load"
++msgstr "Carga"
++
++msgid "Local Time"
++msgstr "Hora local"
++
++msgid "Location"
++msgstr "Lugar"
++
++msgid "Longitude"
++msgstr "Longitud"
++
++msgid "Map"
++msgstr "Mapa"
++
++msgid "Map Error"
++msgstr "Error en el map"
++
++msgid "Memory"
++msgstr "Memoria"
++
++msgid "Mesh prefix"
++msgstr "Prefijo mesh"
++
++msgid "Metric"
++msgstr "Métrica"
++
++msgid "Mode"
++msgstr "Modo"
++
++msgid "Network"
++msgstr "Red"
++
++msgid "Network for client DHCP addresses"
++msgstr "Red para las direcciones DHCP de los clientes"
++
++msgid "Nickname"
++msgstr "Apodo"
++
++msgid "No default routes known."
++msgstr "Sin rutas por defecto."
++
++msgid "Notice"
++msgstr "Aviso"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "Operator"
++msgstr "Administrador"
++
++msgid "Orange"
++msgstr "Naranja"
++
++msgid "Overview"
++msgstr "Repaso"
++
++msgid "Package libiwinfo required!"
++msgstr "¡Es necesario el paquete libiwinfo!"
++
++msgid "Phone"
++msgstr "Teléfono"
++
++msgid "Please fill in your contact details below."
++msgstr "Por favor, introduzca sus datos de contacto."
++
++msgid "Please set your contact information"
++msgstr "Por favor, configure su información de contacto"
++
++msgid "Power"
++msgstr "Potencia"
++
++msgid "Processor"
++msgstr "Procesador"
++
++msgid "Profile"
++msgstr "Perfil"
++
++msgid "Profile (Expert)"
++msgstr "Perfil (experto)"
++
++msgid "Realname"
++msgstr "Nombre real"
++
++msgid "Red"
++msgstr "Rojo"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++"Elija su posición pulsando el ratón sobre el mapa. El mapa solo aparecerá si "
++"está conectado a internet."
++
++msgid "Show OpenStreetMap"
++msgstr "Mostrar OpenStreetMap"
++
++msgid "Show on map"
++msgstr "Mostrar en el mapa"
++
++msgid "Signal"
++msgstr "Señal"
++
++msgid "Splash"
++msgstr "Presentación"
++
++msgid "Start Upgrade"
++msgstr "Iniciar actualización"
++
++msgid "Statistics"
++msgstr "Estadísticas"
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr "Aún utilizable (4 < ETX < 10)"
++
++msgid "System"
++msgstr "Sistema"
++
++msgid "TX"
++msgstr "TX"
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"El paquete <em>libiwinfo</em> no está instalado. ¡Debe instalarlo para que "
++"funcione la red inalámbrica!"
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++"El servicio OLSRd no está configurado para tomar los datos de posición desde "
++"la red.<br />Asegúrese de que el plugin \"nameservice\" está bien "
++"configurado y que la opción <em>latlon_file</em> está marcada."
++
++msgid "The installed firmware is the most recent version."
++msgstr "El firmare instalado está en la versión más reciente."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++"Configuración básica de su comunidad inalámbrica. Aquí puede definir los "
++"valores por defecto para el asistente SIN afectar a la configuración del "
++"router."
++
++msgid "These are the settings of your local community."
++msgstr "Configuración de su comunidad local."
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++"Configuración de su router para Freifunk o redes comunitarias similares."
++
++msgid "This is the access point"
++msgstr "Este es el punto de acceso"
++
++msgid "Update Settings"
++msgstr "Actualizar configuración"
++
++msgid "Update available!"
++msgstr "¡Actualización disponible!"
++
++msgid "Uptime"
++msgstr "Tiempo activo"
++
++msgid "VAP"
++msgstr "VAP"
++
++msgid "Verify downloaded images"
++msgstr "Verificar las descargas"
++
++msgid "Very good (ETX < 2)"
++msgstr "Muy bueno (ETX < 2)"
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++"Somos una iniciativa que pretende crear una red libre, independiente y "
++"abierta utilizando una red mesh inalámbrica."
++
++msgid "Wireless Overview"
++msgstr "Resumen de red inalámbrica"
++
++msgid "Yellow"
++msgstr "Amarillo"
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++"Puede mostrar más contenido en el índice público poniendo XHTML válido en "
++"este formulario.<br />Las cabeceras deben ir entre &lt;h2&gt; y &lt;/h2&gt;."
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr "Puede obtener información acerca de la iniciativa global Freifunk en"
++
++msgid "You can manually edit the selected community profile here."
++msgstr "Edite el perfil comunitario local."
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr "Elija un perfil para editarlo. Para elegir el perfil vaya a"
++
++msgid "and fill out all required fields."
++msgstr "y rellene los campos requeridos."
++
++msgid "buffered"
++msgstr "en búfer"
++
++msgid "cached"
++msgstr "en caché"
++
++msgid "e.g."
++msgstr "ej."
++
++msgid "free"
++msgstr "libre"
++
++msgid "to disable it."
++msgstr "para desactivarlo."
++
++msgid "used"
++msgstr "usado"
++
++msgid "wireless settings"
++msgstr "configuración inalámbrica"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/fr/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/fr/freifunk.po
+new file mode 100644
+index 0000000..028a2ce
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/fr/freifunk.po
+@@ -0,0 +1,395 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr ""
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr ""
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr ""
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++
++msgid "It is operated by"
++msgstr ""
++
++msgid "Keep configuration"
++msgstr ""
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr ""
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr ""
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr ""
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr ""
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/he/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/he/freifunk.po
+new file mode 100644
+index 0000000..3dfdefd
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/he/freifunk.po
+@@ -0,0 +1,394 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2013-01-22 02:48+0200\n"
++"Last-Translator: citizen.amitai <citizen.amitai@gmail.com>\n"
++"Language-Team: none\n"
++"Language: he\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr "חלש"
++
++msgid "Basic Settings"
++msgstr "הגדרות בסיס"
++
++msgid "Basic settings"
++msgstr "הגדרות בסיס"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "×œ× ×¡×™×™×ž×ª להגדיר ×ת הגדרות הבסיס. תחזור ל"
++
++msgid "Basic system settings"
++msgstr "הגדרות מערכת"
++
++msgid "Bitrate"
++msgstr "קצב העברה"
++
++msgid "Channel"
++msgstr "ערוץ"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr "בדוק ×× ×§×™×™× ×’×¨×¡×ª חומרה חדשה ובצע עדכון ×וטומטי"
++
++msgid "Client network size"
++msgstr "גודל הרשת"
++
++msgid "Community"
++msgstr "קהילה"
++
++msgid "Community profile"
++msgstr "פרופיל הקהילה"
++
++msgid "Community settings"
++msgstr "הגדרות קהילה"
++
++msgid "Confirm Upgrade"
++msgstr "×שר שדרוג"
++
++msgid "Contact"
++msgstr "צור קשר"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr ""
++
++msgid "Country code"
++msgstr "קוד מדינה"
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr "×ימייל"
++
++msgid "ESSID"
++msgstr "ESSID"
++
++msgid "Edit index page"
++msgstr "ערוך דף ×ינדקס"
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr "שגי××”"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr "×ž×¦× ×ת ×”×ž×™×§×•× ×©×œ×š ×¢× OpenStreetMap"
++
++msgid "Freifunk"
++msgstr "×ריג"
++
++msgid "Freifunk Overview"
++msgstr "סקירה כללית על ×ריג"
++
++msgid "Freifunk Remote Update"
++msgstr "עדכון מרחוק "
++
++msgid "Gateway"
++msgstr "שער"
++
++msgid "Go to"
++msgstr "עבור ×ל"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "טוב"
++
++msgid "Green"
++msgstr "ירוק"
++
++msgid "Hello and welcome in the network of"
++msgstr "×©×œ×•× ×•×‘×¨×•×š ×”×‘× ×œ×¨×©×ª "
++
++msgid "Hide OpenStreetMap"
++msgstr "הסתר OpenStreetMap"
++
++msgid "Homepage"
++msgstr "דף הבית"
++
++msgid "Hostname"
++msgstr "×©× ×ž×—×©×‘"
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr "×× ×ž×¡×•×ž×Ÿ, תוכן ברירת המחדל ×œ× ×™×•×¤×™×¢"
++
++msgid "If you are interested in our project then contact the local community"
++msgstr "×× ×”× ×›× ×ž×¢×•× ×™×™× ×™× ×‘×¤×¨×•×™×™×§×˜ שלנו ×× × ×¦×¨×• קשר ×¢× ×”×§×”×™×œ×” ב×זורכ×"
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr "ממשק"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++
++msgid "It is operated by"
++msgstr "זה מופעל ע\"י"
++
++msgid "Keep configuration"
++msgstr "שמור הגדרות"
++
++msgid "Latitude"
++msgstr "רוחב"
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr "טען"
++
++msgid "Local Time"
++msgstr "זמן מקומי"
++
++msgid "Location"
++msgstr "מיקו×"
++
++msgid "Longitude"
++msgstr "×ורך"
++
++msgid "Map"
++msgstr "מפה"
++
++msgid "Map Error"
++msgstr "שגי×ת מפה"
++
++msgid "Memory"
++msgstr "זכרון"
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr "מצב"
++
++msgid "Network"
++msgstr "רשת"
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr "כינוי"
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr "סקירה"
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr ""
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr "×× × ×”×–×™× ×• פרטי יצירת קשר"
++
++msgid "Power"
++msgstr "×›×—"
++
++msgid "Processor"
++msgstr "מעבד"
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr "פרופיל (מומחה)"
++
++msgid "Realname"
++msgstr "×©× ×מיתי"
++
++msgid "Red"
++msgstr "×דו×"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr "פתח OpenStreetMap"
++
++msgid "Show on map"
++msgstr "הצג על גבי מפה"
++
++msgid "Signal"
++msgstr "×ות"
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr "התחל שדרוג"
++
++msgid "Statistics"
++msgstr "סטטיסטיקה"
++
++msgid "Status"
++msgstr "סטטוס"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr "מתפקד"
++
++msgid "System"
++msgstr "מערכת"
++
++msgid "TX"
++msgstr "TX"
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr ""
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr "יוזמה לביסוס רשת ×ריג ×ל-חוטית שתהיה חינמית, נגישה, ועצמ×ית"
++
++msgid "Wireless Overview"
++msgstr "סקירת הרשת ×”×לחוטית"
++
++msgid "Yellow"
++msgstr "צהוב"
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/hu/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/hu/freifunk.po
+new file mode 100644
+index 0000000..71829ef
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/hu/freifunk.po
+@@ -0,0 +1,392 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr ""
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr ""
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr ""
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++
++msgid "It is operated by"
++msgstr ""
++
++msgid "Keep configuration"
++msgstr ""
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr ""
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr ""
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr ""
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr ""
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/it/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/it/freifunk.po
+new file mode 100644
+index 0000000..26610f7
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/it/freifunk.po
+@@ -0,0 +1,422 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-07-19 16:27+0200\n"
++"Last-Translator: clagir <cgirlanda@girtech.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: it\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr "Difettoso (ETX > 10)"
++
++msgid "Basic Settings"
++msgstr "Impostazioni Base"
++
++msgid "Basic settings"
++msgstr "Impostazioni Base"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "Le impostazioni base sono incomplete. Si prega di andare a"
++
++msgid "Basic system settings"
++msgstr "Impostazioni Base del Sistema"
++
++msgid "Bitrate"
++msgstr "Bitrate"
++
++msgid "Channel"
++msgstr "Canale"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++"Verificare la presenza di nuove versioni del firmware ed eseguire gli "
++"aggiornamenti automatici."
++
++msgid "Client network size"
++msgstr "Dimensione Rete Client"
++
++msgid "Community"
++msgstr "Comunità"
++
++msgid "Community profile"
++msgstr "Profilo Comunità"
++
++msgid "Community settings"
++msgstr "Impostazioni Comunità"
++
++msgid "Confirm Upgrade"
++msgstr "Conferma Aggiornamento"
++
++msgid "Contact"
++msgstr "Contatto"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr "Le informazioni di contatto sono incomplete. Si prega di andare a"
++
++msgid "Coordinates"
++msgstr "Coordinate"
++
++msgid "Country code"
++msgstr "Codice Nazione"
++
++msgid "Default routes"
++msgstr "Instradamenti Predefiniti"
++
++msgid "Disable default content"
++msgstr "Disattivare contenuto predefinito"
++
++msgid "Diversity is enabled for device"
++msgstr "La diversità è abilitata per il dispositivo"
++
++msgid "E-Mail"
++msgstr "E-Mail"
++
++msgid "ESSID"
++msgstr "ESSID"
++
++msgid "Edit index page"
++msgstr "Modifica indice pagina"
++
++msgid "Enable IPv6"
++msgstr "Attiva IPv6"
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr "Attiva un access point virtuale (VAP) di default se possibile"
++
++msgid "Error"
++msgstr "Errore"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr "Trova le coordinate con OpenStreetMap"
++
++msgid "Freifunk"
++msgstr "Freifunk"
++
++msgid "Freifunk Overview"
++msgstr "Panoramica Freifunk"
++
++msgid "Freifunk Remote Update"
++msgstr "Aggiornamento Remoto Freifunk"
++
++msgid "Gateway"
++msgstr "Gateway"
++
++msgid "Go to"
++msgstr "Vai a"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "Buono (2 < ETX < 4)"
++
++msgid "Green"
++msgstr "Verde"
++
++msgid "Hello and welcome in the network of"
++msgstr "Ciao e benvenuto nella rete di"
++
++msgid "Hide OpenStreetMap"
++msgstr "Nascondi OpenStreetMap"
++
++msgid "Homepage"
++msgstr "Homepage"
++
++msgid "Hostname"
++msgstr "Nome Host"
++
++msgid "IPv6 Config"
++msgstr "Configura IPv6"
++
++msgid "IPv6 Prefix"
++msgstr "Prefisso IPv6"
++
++msgid "IPv6 network in CIDR notation."
++msgstr "Rete IPv6 in notazione CIDR."
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++"Se selezionata, l'elemento di contenuto predefinito non viene visualizzato."
++
++msgid "If you are interested in our project then contact the local community"
++msgstr "Se siete interessati al nostro progetto, contattare la comunità locale"
++
++msgid "Index Page"
++msgstr "Indice Pagina"
++
++msgid "Interface"
++msgstr "Interfaccia"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"L'accesso a Internet dipende dalle condizioni tecniche e organizzative e può "
++"o non può funzionare per voi."
++
++msgid "It is operated by"
++msgstr "E' gestito da"
++
++msgid "Keep configuration"
++msgstr "Mantieni configurazione"
++
++msgid "Latitude"
++msgstr "Latitudine"
++
++msgid "Legend"
++msgstr "Legenda"
++
++msgid "Load"
++msgstr "Carica"
++
++msgid "Local Time"
++msgstr "Ora Locale"
++
++msgid "Location"
++msgstr "Posizione"
++
++msgid "Longitude"
++msgstr "Longitudine"
++
++msgid "Map"
++msgstr "Mappa"
++
++msgid "Map Error"
++msgstr "Errore Mappa"
++
++msgid "Memory"
++msgstr "Memoria"
++
++msgid "Mesh prefix"
++msgstr "Prefisso Rete"
++
++msgid "Metric"
++msgstr "Metrica"
++
++msgid "Mode"
++msgstr "Modalità"
++
++msgid "Network"
++msgstr "Rete"
++
++msgid "Network for client DHCP addresses"
++msgstr "Rete per indirizzi Client DHCP"
++
++msgid "Nickname"
++msgstr "Nome Nick"
++
++msgid "No default routes known."
++msgstr "Nessun instradamento predefinito conosciuto."
++
++msgid "Notice"
++msgstr "Avviso"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "Operator"
++msgstr "Operatore"
++
++msgid "Orange"
++msgstr "Arancio"
++
++msgid "Overview"
++msgstr "Panoramica"
++
++msgid "Package libiwinfo required!"
++msgstr "Il pacchetto libiwinfo è richiesto!"
++
++msgid "Phone"
++msgstr "Telefono"
++
++msgid "Please fill in your contact details below."
++msgstr "Inserisci i tuoi dati di contatto qui sotto."
++
++msgid "Please set your contact information"
++msgstr "Vi preghiamo di impostare le informazioni di contatto"
++
++msgid "Power"
++msgstr "Potenza"
++
++msgid "Processor"
++msgstr "Processore"
++
++msgid "Profile"
++msgstr "Profilo"
++
++msgid "Profile (Expert)"
++msgstr "Profilo (Esperto)"
++
++msgid "Realname"
++msgstr "Nome Reale"
++
++msgid "Red"
++msgstr "Rosso"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++"Selezionare la propria posizione con un clic del mouse sulla mappa. La mappa "
++"viene visualizzata solo se si è connessi a Internet."
++
++msgid "Show OpenStreetMap"
++msgstr "Mostra OpenStreetMap"
++
++msgid "Show on map"
++msgstr "Mostra sulla mappa"
++
++msgid "Signal"
++msgstr "Segnale"
++
++msgid "Splash"
++msgstr "Splash"
++
++msgid "Start Upgrade"
++msgstr "Avvia Aggiornamento"
++
++msgid "Statistics"
++msgstr "Statistiche"
++
++msgid "Status"
++msgstr "Stato"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr "Ancora utilizzabile (4 < ETX < 10)"
++
++msgid "System"
++msgstr "Sistema"
++
++msgid "TX"
++msgstr "TX"
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"Il pacchetto <em>libiwinfo</em> non è installato. Si deve installare questo "
++"componente per usare di configurazione wireless!"
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++"Il servizio OLSRd non è configurato per acquisire i dati di posizione della "
++"rete. <br/> Assicurarsi che il plugin nameservice sia configurato "
++"correttamente e che l'opzione <em>latlon_file</em> è abilitata."
++
++msgid "The installed firmware is the most recent version."
++msgstr "Il firmware installato è la versione più recente."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++"Queste sono le impostazioni di base per la vostra comunità locale wireless. "
++"Queste impostazioni definiscono i valori predefiniti per la procedura "
++"guidata e non influenzano la configurazione attuale del router."
++
++msgid "These are the settings of your local community."
++msgstr "Queste sono le impostazioni della vostra comunità locale."
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++"Queste pagine vi aiuteranno a configurare il router per Freifunk o reti "
++"wireless della comunità simile."
++
++msgid "This is the access point"
++msgstr "Questo è il punto di accesso"
++
++msgid "Update Settings"
++msgstr "Aggiorna impostazioni"
++
++msgid "Update available!"
++msgstr "Aggiornamento disponibile!"
++
++msgid "Uptime"
++msgstr "Tempo di attività"
++
++msgid "VAP"
++msgstr "VAP"
++
++msgid "Verify downloaded images"
++msgstr "Verifica delle immagini scaricate"
++
++msgid "Very good (ETX < 2)"
++msgstr "Molto buono (ETX < 2)"
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++"Siamo un'iniziativa per creare una rete libera, indipendente e aperto "
++"wireless mesh."
++
++msgid "Wireless Overview"
++msgstr "Panoramica Wireless"
++
++msgid "Yellow"
++msgstr "Giallo"
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++"È possibile visualizzare contenuti aggiuntivi nella pagina indice pubblica "
++"inserendo XHTML valida nel modulo sottostante. <br/> I titoli dovrebbero "
++"essere racchiusi tra &lt;h2&gt; e &lt;/h2&gt;."
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++"È possibile trovare ulteriori informazioni sull'iniziativa Freifunk globale a"
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++"È possibile modificare manualmente il profilo selezionato della comunità qui"
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++"È necessario selezionare un profilo prima di poterlo modificare. Per "
++"selezionare un profilo andare a"
++
++msgid "and fill out all required fields."
++msgstr "e compilare tutti i campi richiesti."
++
++msgid "buffered"
++msgstr "buffered"
++
++msgid "cached"
++msgstr "in memoria cache"
++
++msgid "e.g."
++msgstr "es."
++
++msgid "free"
++msgstr "libero"
++
++msgid "to disable it."
++msgstr "per disattivarlo."
++
++msgid "used"
++msgstr "usato"
++
++msgid "wireless settings"
++msgstr "Impostazioni Wireless"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/ja/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/ja/freifunk.po
+new file mode 100644
+index 0000000..028a2ce
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/ja/freifunk.po
+@@ -0,0 +1,395 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
++"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Translate Toolkit 1.1.1\n"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr ""
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr ""
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr ""
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++
++msgid "It is operated by"
++msgstr ""
++
++msgid "Keep configuration"
++msgstr ""
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr ""
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr ""
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr ""
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr ""
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/ms/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/ms/freifunk.po
+new file mode 100644
+index 0000000..262991d
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/ms/freifunk.po
+@@ -0,0 +1,391 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr ""
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr ""
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr ""
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++
++msgid "It is operated by"
++msgstr ""
++
++msgid "Keep configuration"
++msgstr ""
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr ""
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr ""
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr ""
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr ""
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/no/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/no/freifunk.po
+new file mode 100644
+index 0000000..62df8b9
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/no/freifunk.po
+@@ -0,0 +1,430 @@
++msgid ""
++msgstr ""
++"Last-Translator: Lars Hardy <lars.hardy@gmail.com>\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr "Grunnleggende Innstillinger"
++
++msgid "Basic settings"
++msgstr "Grunnleggende innstillinger"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "Grunnleggende innstillinger er mangelfull. GÃ¥ til"
++
++msgid "Basic system settings"
++msgstr "Grunnleggende system innstillinger"
++
++msgid "Bitrate"
++msgstr "Bithastighet"
++
++msgid "Channel"
++msgstr "Kanal"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr "Se etter nye firmware-versjoner og utfør automatiske oppdatering."
++
++msgid "Client network size"
++msgstr "Klient nettverk størrelse"
++
++msgid "Community"
++msgstr "Sted"
++
++msgid "Community profile"
++msgstr "Sted profil"
++
++msgid "Community settings"
++msgstr "Sted innstillinger"
++
++msgid "Confirm Upgrade"
++msgstr "Bekreft Oppgradering"
++
++msgid "Contact"
++msgstr "Kontakt"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr "Kontaktinformasjonen er mangelfull. GÃ¥ til"
++
++msgid "Coordinates"
++msgstr "Koordinater"
++
++msgid "Country code"
++msgstr "Landskode"
++
++msgid "Default routes"
++msgstr "Standard ruter"
++
++msgid "Disable default content"
++msgstr "Deaktiver standard innhold"
++
++msgid "Diversity is enabled for device"
++msgstr "Antennevariasjon er aktivert på enhet"
++
++msgid "E-Mail"
++msgstr "E-Post"
++
++msgid "ESSID"
++msgstr "ESSID"
++
++msgid "Edit index page"
++msgstr "Rediger indeks side"
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr "Feil"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr "Finn koordinatene dine med OpenStreetMap"
++
++msgid "Freifunk"
++msgstr "Freifunk"
++
++msgid "Freifunk Overview"
++msgstr "Freifunk Oversikt"
++
++msgid "Freifunk Remote Update"
++msgstr "Freifunk Fjernkontrollert Oppgradering"
++
++msgid "Gateway"
++msgstr "Gateway"
++
++msgid "Go to"
++msgstr "GÃ¥ til"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr "Hei og velkommen til nettverket av"
++
++msgid "Hide OpenStreetMap"
++msgstr "Skjul OpenStreetMap"
++
++msgid "Homepage"
++msgstr "Hjemmeside"
++
++msgid "Hostname"
++msgstr "Vertsnavn"
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr "Om valgt vises ikke det vanlige innholdselementet"
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++"Hvis du er interessert i prosjektet vårt så ta kontakt med en lokale gruppe "
++"på"
++
++msgid "Index Page"
++msgstr "Indeks Side"
++
++msgid "Interface"
++msgstr "Grensesnitt"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"Internett tilgang er avhengig av tekniske og organisatoriske forhold, defor "
++"er det ikke sikkert det fungerer for deg."
++
++msgid "It is operated by"
++msgstr "Det drives av"
++
++msgid "Keep configuration"
++msgstr "Behold konfigurasjonen"
++
++msgid "Latitude"
++msgstr "Breddegrad"
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr "Last"
++
++msgid "Local Time"
++msgstr "Lokal Tid"
++
++msgid "Location"
++msgstr "Sted"
++
++msgid "Longitude"
++msgstr "Lengdegrad"
++
++msgid "Map"
++msgstr "Kart"
++
++msgid "Map Error"
++msgstr "Kart Feil"
++
++msgid "Memory"
++msgstr "Minne"
++
++msgid "Mesh prefix"
++msgstr "Mesh prefiks"
++
++msgid "Metric"
++msgstr "Metrisk"
++
++msgid "Mode"
++msgstr "Modus"
++
++msgid "Network"
++msgstr "Nettverk"
++
++msgid "Network for client DHCP addresses"
++msgstr "Nettverk for klient DHCP adresser"
++
++msgid "Nickname"
++msgstr "Kallenavn"
++
++msgid "No default routes known."
++msgstr "Ingen standard rute er kjent"
++
++msgid "Notice"
++msgstr "Merknad"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr "Oversikt"
++
++msgid "Package libiwinfo required!"
++msgstr "Pakken libiwinfo er nødvendig!"
++
++msgid "Phone"
++msgstr "Telefon"
++
++msgid "Please fill in your contact details below."
++msgstr "Vennligst fyll ut skjema nedenfor."
++
++msgid "Please set your contact information"
++msgstr "Vennligst oppgi din kontaktinformasjon"
++
++msgid "Power"
++msgstr "Styrke"
++
++msgid "Processor"
++msgstr "Prosessor"
++
++msgid "Profile"
++msgstr "Profil"
++
++msgid "Profile (Expert)"
++msgstr "Profil (Ekspert)"
++
++msgid "Realname"
++msgstr "Virkelig Navn"
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++"Velg din posisjon med et museklikk på kartet. Kartet vises bare om du er "
++"koblet til internett."
++
++msgid "Show OpenStreetMap"
++msgstr "Vis OpenStreetMap"
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr "Signal"
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr "Start Oppgradering"
++
++msgid "Statistics"
++msgstr "Statistikk"
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr "System"
++
++msgid "TX"
++msgstr "TX"
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++"OLSRd tjenesten er ikke konfigurert til å hente posisjons data fra "
++"nettverket.<br/>Kontroller at navnetjener pluginen er riktig konfigurert og "
++"at <em>latlon_file</em> alternativet er aktivert."
++
++msgid "The installed firmware is the most recent version."
++msgstr "Den installerte firmware er den nyeste versjonen."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++"Dette er de grunnleggende innstillinger for det lokale trådløse stedet. "
++"Disse innstillingene definerer standard verdiene for veiviseren og vil "
++"derfor IKKE gjøre noen endringer på ruteren."
++
++msgid "These are the settings of your local community."
++msgstr "Dette er innstillingene for det lokale stedet"
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++"Disse sidene vil hjelpe deg med å sette opp ruteren til for Freifunk og "
++"lignende trådløse nettverk."
++
++msgid "This is the access point"
++msgstr "Dette er aksess punktet"
++
++msgid "Update Settings"
++msgstr "Oppdater Innstillingene"
++
++msgid "Update available!"
++msgstr "Oppdatering tilgjengelig!"
++
++msgid "Uptime"
++msgstr "Oppetid"
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr "Verifiser nedlastede filer"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++"Vi er et initiativ for å etablere fri, uavhengig og åpne trådløse mesh-"
++"nettverk."
++
++msgid "Wireless Overview"
++msgstr "Trådløs Oversikt"
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++"Du kan vise ytterligere innhold på den offentlige side ved å legge til "
++"gyldig XHTML med form som vist under.<br />Overskrifter bør legges mellom "
++"&lt;h2&gt; og &lt;/h2&gt;."
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr "Du kan finne mere informasjon om den globale Freifunk initiativ på"
++
++msgid "You can manually edit the selected community profile here."
++msgstr "Du kan manuelt endre den valgte stedsprofilen here"
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++"Du må velge en profil før du kan endre den. For å velge en profil går du til"
++
++msgid "and fill out all required fields."
++msgstr "og fylle ut alle nødvendige felt"
++
++msgid "buffered"
++msgstr "bufret"
++
++msgid "cached"
++msgstr "hurtigbufret"
++
++msgid "e.g."
++msgstr "f.eks."
++
++msgid "free"
++msgstr "tilgjengelig"
++
++msgid "to disable it."
++msgstr "Ã¥ deaktivere det"
++
++msgid "used"
++msgstr "brukt"
++
++msgid "wireless settings"
++msgstr "trådløse innstillinger"
++
++#~ msgid ""
++#~ "No services can be shown, because olsrd is not running or the olsrd-"
++#~ "nameservice Plugin is not loaded."
++#~ msgstr ""
++#~ "Ingen tjenester kan vises her, dette kan være pga. at olsrd ikke kjører "
++#~ "eller fordi olsrd-navnetjener plugin ikke er lastet."
++
++#~ msgid "Services"
++#~ msgstr "Tjenester"
++
++#~ msgid "Source"
++#~ msgstr "Kilde"
++
++#~ msgid ""
++#~ "The <em>libiwinfo-lua</em> package is not installed. You must install "
++#~ "this component for working wireless configuration!"
++#~ msgstr ""
++#~ "Pakken <em>libiwinfo-lua</em> er ikke installert. Du må installere denne "
++#~ "pakken for å kunne konfigurerer trådløse enheter!"
++
++#~ msgid "Url"
++#~ msgstr "Url"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/pl/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/pl/freifunk.po
+new file mode 100644
+index 0000000..ac46e1f
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/pl/freifunk.po
+@@ -0,0 +1,422 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-04-23 19:16+0200\n"
++"Last-Translator: goodgod261 <goodgod261@wp.pl>\n"
++"Language-Team: none\n"
++"Language: pl\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
++"|| n%100>=20) ? 1 : 2);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr "BÅ‚Ä…d (Etx > 10)"
++
++msgid "Basic Settings"
++msgstr "Ustawienia Podstawowe"
++
++msgid "Basic settings"
++msgstr "Ustawienia podstawowe"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "Niekompletne ustawienia podstawowe. Proszę uzupełnić"
++
++msgid "Basic system settings"
++msgstr "Podstawowe ustawienia systemu"
++
++msgid "Bitrate"
++msgstr "Bitrate"
++
++msgid "Channel"
++msgstr "Kanał"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr "Automatycznie sprawdź i uaktualnij wersję firmware`u"
++
++msgid "Client network size"
++msgstr "Rozmiar sieci klientów"
++
++msgid "Community"
++msgstr "Społeczność"
++
++msgid "Community profile"
++msgstr "Profil w społeczności"
++
++msgid "Community settings"
++msgstr "Ustawienia społeczności"
++
++msgid "Confirm Upgrade"
++msgstr "Potwierdź uaktualnienie"
++
++msgid "Contact"
++msgstr "Dane kontaktowe"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr "Dane kontaktowe są niekompletne. Proszę uzupełnij je"
++
++msgid "Coordinates"
++msgstr "Współrzędne"
++
++msgid "Country code"
++msgstr "Prefiks kraju"
++
++msgid "Default routes"
++msgstr "Domyślne trasy (routes)"
++
++msgid "Disable default content"
++msgstr "Wyłącz domyślną zawartość"
++
++# Nie przetłumaczymy tego lepiej.
++msgid "Diversity is enabled for device"
++msgstr "Różnorodność jest włączona dla urządzenia"
++
++msgid "E-Mail"
++msgstr "E-Mail"
++
++msgid "ESSID"
++msgstr "Nazwa sieci (ESSID)"
++
++msgid "Edit index page"
++msgstr "Edytuj stronę główną"
++
++msgid "Enable IPv6"
++msgstr "WÅ‚Ä…cz IPv6"
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr "BÅ‚Ä…d"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr "Znajdź swoje współrzędne w OpenStreetMap"
++
++msgid "Freifunk"
++msgstr "Freifunk"
++
++msgid "Freifunk Overview"
++msgstr "PrzeglÄ…d sieci Freifunk"
++
++msgid "Freifunk Remote Update"
++msgstr "Zdalna aktualizacja Freifunk"
++
++msgid "Gateway"
++msgstr "Brama"
++
++msgid "Go to"
++msgstr "Przejdź do"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "Dobrze (2 < ETX < 4)"
++
++msgid "Green"
++msgstr "Zielone"
++
++msgid "Hello and welcome in the network of"
++msgstr "Cześć! Witamy w sieci"
++
++msgid "Hide OpenStreetMap"
++msgstr "Ukryj OpenStreetMap"
++
++msgid "Homepage"
++msgstr "Strona domowa"
++
++msgid "Hostname"
++msgstr "Nazwa hosta"
++
++msgid "IPv6 Config"
++msgstr "Konfiguracja IPv6"
++
++msgid "IPv6 Prefix"
++msgstr "Prefiks IPv6"
++
++msgid "IPv6 network in CIDR notation."
++msgstr "Sieć IPv6 w notacji CIDR"
++
++msgid "If selected then the default content element is not shown."
++msgstr "Jeśli zaznaczone domyślna zawartość nie jest widoczna"
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++"Jeśli jesteś zainteresowany projektem kontaktuj się z lokalna społecznością "
++"Freifunk"
++
++msgid "Index Page"
++msgstr "Strona poczÄ…tkowa"
++
++msgid "Interface"
++msgstr "Interfejs"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"Dostęp do internetu zależy od warunków technicznych i organizacyjnych, i "
++"dlatego może nie działać."
++
++msgid "It is operated by"
++msgstr "Jest zarzÄ…dzany przez"
++
++msgid "Keep configuration"
++msgstr "Zachowaj konfiguracjÄ™"
++
++msgid "Latitude"
++msgstr "Szerokość"
++
++msgid "Legend"
++msgstr "Legenda"
++
++msgid "Load"
++msgstr "Obciążenie"
++
++msgid "Local Time"
++msgstr "Czas Lokalny"
++
++# Może ktoś ma lepsze słowo?
++msgid "Location"
++msgstr "Lokacja"
++
++msgid "Longitude"
++msgstr "Długość"
++
++msgid "Map"
++msgstr "Mapa"
++
++msgid "Map Error"
++msgstr "BÅ‚Ä…d Mapy"
++
++msgid "Memory"
++msgstr "Pamięć"
++
++# Dosłownie prefiks kraty
++msgid "Mesh prefix"
++msgstr "Prefiks komórki"
++
++msgid "Metric"
++msgstr "Metryka"
++
++msgid "Mode"
++msgstr "Tryb"
++
++msgid "Network"
++msgstr "Sieć"
++
++msgid "Network for client DHCP addresses"
++msgstr "Sieć dla adresów klienta DHCP"
++
++msgid "Nickname"
++msgstr "Twoja ksywka"
++
++msgid "No default routes known."
++msgstr "Nie są znane żadne domyślne ścieżki routingu."
++
++msgid "Notice"
++msgstr "Uwaga"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "Operator"
++msgstr "ZarzÄ…dca"
++
++msgid "Orange"
++msgstr "Pomarańczowe"
++
++msgid "Overview"
++msgstr "PrzeglÄ…d"
++
++msgid "Package libiwinfo required!"
++msgstr "Wymagany pakiet libiwinfo !"
++
++msgid "Phone"
++msgstr "Telefon"
++
++msgid "Please fill in your contact details below."
++msgstr "Proszę uzupełnij dane kontaktowe poniżej."
++
++msgid "Please set your contact information"
++msgstr "Proszę uzupełnić swoje dane kontaktowe"
++
++msgid "Power"
++msgstr "Moc"
++
++msgid "Processor"
++msgstr "Procesor"
++
++msgid "Profile"
++msgstr "Profil"
++
++msgid "Profile (Expert)"
++msgstr "Profil (tryb eksperta)"
++
++msgid "Realname"
++msgstr "ImiÄ™ i Nazwisko (prawdziwe)"
++
++msgid "Red"
++msgstr "Czerwone"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++"Proszę zaznaczyć swoją lokację na mapie. Mapa jest pokazywana tylko jeśli "
++"masz dostęp do internetu."
++
++msgid "Show OpenStreetMap"
++msgstr "Pokaż OpenStreetMap"
++
++msgid "Show on map"
++msgstr "Pokaż na mapie"
++
++msgid "Signal"
++msgstr "Sygnał"
++
++msgid "Splash"
++msgstr "Splash"
++
++msgid "Start Upgrade"
++msgstr "Zacznij aktualizacjÄ™"
++
++msgid "Statistics"
++msgstr "Statystyki"
++
++msgid "Status"
++msgstr "Status"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr "Cały Czas do użycia (4 < ETX < 10)"
++
++msgid "System"
++msgstr "System"
++
++msgid "TX"
++msgstr "TX"
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"Pakiet <em>libiwinfo</em> nie jest zainstalowany. Musisz go zainstalować, "
++"aby konfiguracja sieci bezprzewodowej mogła być uaktywniona!"
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++"Usługa OLSRd nie jest skonfigurowana do pozyskiwania nazwy z sieci.<br /> "
++"Proszę się upewnić, że plugin nameservice jest poprawnie skonfigurowany, "
++"oraz opcja użycia pliku <em>latlon_file</em> jest zaznaczona."
++
++msgid "The installed firmware is the most recent version."
++msgstr "Zainstalowany firmware jest aktualny."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++"Są to podstawowe ustawienia dla twojej lokalnej bezprzewodowej społeczności. "
++"Te ustawienia określają domyślne wartości dla kreatora i NIE MAJĄ wpływu na "
++"aktualnÄ… konfiguracjÄ™ routera."
++
++msgid "These are the settings of your local community."
++msgstr "To są ustawienia twojej lokalnej społeczności (community)."
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++"Te strony pomogą ci skonfigurować twój router do sieci Freifunk, lub innej "
++"sieci społecznościowej ."
++
++msgid "This is the access point"
++msgstr "To jest punk dostępowy (AP)"
++
++msgid "Update Settings"
++msgstr "Uaktualnij ustawienia"
++
++msgid "Update available!"
++msgstr "Aktualizacja dostępna!!!"
++
++msgid "Uptime"
++msgstr "Aktualizacja"
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr "Sprawdź pobrane obrazy"
++
++msgid "Very good (ETX < 2)"
++msgstr "Bardzo Dobrze (ETX < 2)"
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++"Jesteśmy inicjatywą na rzecz ustanowienia wolnej, niezależnej i otwartej "
++"bezprzewodowej siatki kratowej."
++
++msgid "Wireless Overview"
++msgstr "Przegląd Ustawień WiFi"
++
++msgid "Yellow"
++msgstr "Żółty"
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++"Można wyświetlić dodatkową zawartość na publicznej stronie indeksu "
++"wstawiając poprawny XHTML do formularza poniżej.<br />Nagłówki powinny być "
++"zamknięte tagami &lt;h2&gt; i &lt;/h2&gt;."
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++"Możesz znaleźć więcej informacji o naszej globalnej inicjatywie Freifunk na"
++
++msgid "You can manually edit the selected community profile here."
++msgstr "Możesz ręcznie edytować wybrany profil społeczności tutaj"
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++"Aby edytować profil musisz go najpierw zaznaczyć. Zaznacz profil aby "
++"kontynuować"
++
++msgid "and fill out all required fields."
++msgstr "i wypełnij wszystkie wymagane pola."
++
++msgid "buffered"
++msgstr "buforowany"
++
++msgid "cached"
++msgstr "cachowany"
++
++msgid "e.g."
++msgstr "np."
++
++msgid "free"
++msgstr "darmowy"
++
++msgid "to disable it."
++msgstr "aby wyłączyć"
++
++msgid "used"
++msgstr "używany"
++
++msgid "wireless settings"
++msgstr "ustawienia sieci bezprzewodowej"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/pt-br/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/pt-br/freifunk.po
+new file mode 100644
+index 0000000..a906a93
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/pt-br/freifunk.po
+@@ -0,0 +1,447 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:41+0200\n"
++"PO-Revision-Date: 2014-06-21 19:00+0200\n"
++"Last-Translator: Éder <eder.grigorio@openmailbox.org>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: pt_BR\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n > 1);\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr "Mal (ETX > 10)"
++
++msgid "Basic Settings"
++msgstr "Configurações Básicas"
++
++msgid "Basic settings"
++msgstr "Configurações básicas"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "As configurações básicas estão incompletas. Por favor vá para"
++
++msgid "Basic system settings"
++msgstr "Configurações básicas do sistema"
++
++msgid "Bitrate"
++msgstr "Taxa de bit"
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++"Verifique a existência de novas versões e realize a atualização "
++"automaticamente."
++
++msgid "Client network size"
++msgstr "Tamanho da rede dos clientes"
++
++msgid "Community"
++msgstr "Comunidade"
++
++msgid "Community profile"
++msgstr "Perfil da comunidade"
++
++msgid "Community settings"
++msgstr "Configurações da comunidade"
++
++msgid "Confirm Upgrade"
++msgstr "Confirmar a atualização"
++
++msgid "Contact"
++msgstr "Contato"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr "A informação de contato está incompleta. Por favor, vá para"
++
++msgid "Coordinates"
++msgstr "Coordenadas"
++
++msgid "Country code"
++msgstr "Código do país"
++
++msgid "Default routes"
++msgstr "Rotas padrão"
++
++msgid "Disable default content"
++msgstr "Desabilitar o conteúdo padrão"
++
++msgid "Diversity is enabled for device"
++msgstr "A diversidade está habilitada neste dispositivo"
++
++msgid "E-Mail"
++msgstr "E-mail"
++
++msgid "ESSID"
++msgstr "ESSID"
++
++msgid "Edit index page"
++msgstr "Edita a página índice"
++
++msgid "Enable IPv6"
++msgstr "Habilitar IPv6"
++
++# 20140621: edersg: tradução
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr "Habilitar um ponto de acesso virtual (VAP) por padrão, se possível"
++
++msgid "Error"
++msgstr "Erro"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr "Encontre sua coordenada com o OpenStreetMap"
++
++msgid "Freifunk"
++msgstr "Freifunk"
++
++msgid "Freifunk Overview"
++msgstr "Visão Geral do Freifunk"
++
++msgid "Freifunk Remote Update"
++msgstr "Atualização Remota do Freifunk"
++
++msgid "Gateway"
++msgstr "Roteador"
++
++msgid "Go to"
++msgstr "Vá para"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "Bom (2 < ETX < 4)"
++
++msgid "Green"
++msgstr "Verde"
++
++msgid "Hello and welcome in the network of"
++msgstr "Olá e seja bem-vindo à rede do"
++
++msgid "Hide OpenStreetMap"
++msgstr "Esconder o OpenStreetMap"
++
++msgid "Homepage"
++msgstr "Página"
++
++msgid "Hostname"
++msgstr "Nome do equipamento"
++
++msgid "IPv6 Config"
++msgstr "Configuração IPv6"
++
++msgid "IPv6 Prefix"
++msgstr "Prefixo IPv6"
++
++msgid "IPv6 network in CIDR notation."
++msgstr "Rede IPv6 em notação CIDR."
++
++msgid "If selected then the default content element is not shown."
++msgstr "Se selecionado, o conteúdo padrão não é mostrado."
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++"Se estiver interessado no nosso projeto, entre em contacto com a comunidade "
++"local"
++
++msgid "Index Page"
++msgstr "Página Ãndice"
++
++msgid "Interface"
++msgstr "Interface"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"O acesso à Internet depende de fatores técnicos e organizacionais, e pode "
++"funcionar ou não no seu caso."
++
++msgid "It is operated by"
++msgstr "É operado por"
++
++msgid "Keep configuration"
++msgstr "Manter a configuração"
++
++msgid "Latitude"
++msgstr "Latitude"
++
++msgid "Legend"
++msgstr "Legenda"
++
++msgid "Load"
++msgstr "Carregar"
++
++msgid "Local Time"
++msgstr "Horário Local"
++
++msgid "Location"
++msgstr "Localização"
++
++msgid "Longitude"
++msgstr "Longitude"
++
++msgid "Map"
++msgstr "Mapa"
++
++msgid "Map Error"
++msgstr "Erro do Mapa"
++
++msgid "Memory"
++msgstr "Memória"
++
++msgid "Mesh prefix"
++msgstr "Prefixo da rede em malha"
++
++msgid "Metric"
++msgstr "Métrica"
++
++msgid "Mode"
++msgstr "Modo"
++
++msgid "Network"
++msgstr "Rede"
++
++msgid "Network for client DHCP addresses"
++msgstr "Rede para os endereços dos clientes DHCP"
++
++msgid "Nickname"
++msgstr "Apelido"
++
++msgid "No default routes known."
++msgstr "Nenhuma rota padrão conhecida."
++
++msgid "Notice"
++msgstr "Aviso"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "Operator"
++msgstr "Operador"
++
++msgid "Orange"
++msgstr "Laranja"
++
++msgid "Overview"
++msgstr "Visão Geral"
++
++msgid "Package libiwinfo required!"
++msgstr "O pacote libiwinfo é necessário!"
++
++msgid "Phone"
++msgstr "Telefone"
++
++msgid "Please fill in your contact details below."
++msgstr "Por favor, preencha seus detalhes de contato abaixo."
++
++msgid "Please set your contact information"
++msgstr "Por favor, defina a informação de contato"
++
++msgid "Power"
++msgstr "Potência"
++
++msgid "Processor"
++msgstr "Processador"
++
++msgid "Profile"
++msgstr "Perfil"
++
++msgid "Profile (Expert)"
++msgstr "Perfil (Especialista)"
++
++msgid "Realname"
++msgstr "Nome Real"
++
++msgid "Red"
++msgstr "Vermelho"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++"Selecione a sua localização com o mouse clicando no mapa. O mapa irá mostrar "
++"se você está conectado na internet."
++
++msgid "Show OpenStreetMap"
++msgstr "Mostrar o OpenStreetMap"
++
++msgid "Show on map"
++msgstr "Mostrar no mapa"
++
++msgid "Signal"
++msgstr "Sinal"
++
++msgid "Splash"
++msgstr "Splash"
++
++msgid "Start Upgrade"
++msgstr "Iniciar a Atualização"
++
++msgid "Statistics"
++msgstr "Estatística"
++
++msgid "Status"
++msgstr "Estado"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr "Ainda usável (4 < ETX < 10)"
++
++msgid "System"
++msgstr "Sistema"
++
++msgid "TX"
++msgstr "TX"
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"O pacote <em>libiwinfo</em> não está instalado. Você precisa instalar este "
++"componente para ter uma configuração sem fio funcional!"
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++"O serviço OLSRd não está configurado para capturar os dados de posição da "
++"rede.<br /> Por favor, garnta que o plugin nameservice está corretametne "
++"configurado e que a opção <em>latlon_file</em> está habilitada."
++
++msgid "The installed firmware is the most recent version."
++msgstr "O firmware instalado é a última versão."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++"Estas são as configurações básicas para a comunidade sem fio local. Estas "
++"configurações definem os valores padrão para o assistente e NÃO afetam a "
++"configuração atual do roteador."
++
++msgid "These are the settings of your local community."
++msgstr "Estas são as configurações da sua comunidade local."
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++"Esta página ajudará você na configuração do seu roteador Freifunk ou de "
++"redes comunitárias sem fio similares."
++
++msgid "This is the access point"
++msgstr "Este é o ponto de acesso "
++
++msgid "Update Settings"
++msgstr "Configurações da Atualização"
++
++msgid "Update available!"
++msgstr "Existe uma atualização disponível!"
++
++msgid "Uptime"
++msgstr "Tempo de atividade"
++
++# 20140621: edersg: tradução
++msgid "VAP"
++msgstr "VAP"
++
++msgid "Verify downloaded images"
++msgstr "Verifique as imagens baixadas"
++
++msgid "Very good (ETX < 2)"
++msgstr "Muito bom (ETX < 2)"
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++"Somos uma iniciativa para implementação de uma rede sem fio em malha livre, "
++"independente e não-comercial."
++
++msgid "Wireless Overview"
++msgstr "Visão Geral da Rede Sem Fio"
++
++msgid "Yellow"
++msgstr "Amarelo"
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++"Você pode mostrar conteúdo adicional na página índice pública inserindo "
++"XHTML válido no formulário abaixo.<br />As manchetes devem ficam entre &lt;"
++"h2&gt; e &lt;/h2&gt;."
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++"Você pode encontrar mais informações sobre a iniciativa global Freifunk em"
++
++msgid "You can manually edit the selected community profile here."
++msgstr "Você pode editar manualmente o perfil da comunidade selecionada aqui."
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++"Você precisa selecionar um perfil antes de poder editá-lo. Para selecionar "
++"um perfil, vá para"
++
++msgid "and fill out all required fields."
++msgstr "e preencher todos os campos obrigatórios."
++
++msgid "buffered"
++msgstr "no Buffer"
++
++msgid "cached"
++msgstr "no Cache"
++
++msgid "e.g."
++msgstr "ex:"
++
++msgid "free"
++msgstr "livre"
++
++msgid "to disable it."
++msgstr "para desabilitá-lo."
++
++msgid "used"
++msgstr "usado"
++
++msgid "wireless settings"
++msgstr "configurações da rede sem fio"
++
++#~ msgid ""
++#~ "No services can be shown, because olsrd is not running or the olsrd-"
++#~ "nameservice Plugin is not loaded."
++#~ msgstr ""
++#~ "Nenhum serviço pode ser mostrado porque o olsrd não está rodando ou o "
++#~ "plugin do olsrd-nameservice não está carregado."
++
++#~ msgid "Services"
++#~ msgstr "Serviços"
++
++#~ msgid "Source"
++#~ msgstr "Origem"
++
++#~ msgid ""
++#~ "The <em>libiwinfo-lua</em> package is not installed. You must install "
++#~ "this component for working wireless configuration!"
++#~ msgstr ""
++#~ "O pacote <em>libiwinfo-lua</em> não está instalado. Você deve instalar "
++#~ "este componente para ter uma configuração sem fio funcional!"
++
++#~ msgid "Url"
++#~ msgstr "URL"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/pt/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/pt/freifunk.po
+new file mode 100644
+index 0000000..b5b822b
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/pt/freifunk.po
+@@ -0,0 +1,401 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-26 19:03+0200\n"
++"PO-Revision-Date: 2009-05-19 17:33+0200\n"
++"Last-Translator: Jose Monteiro <jm@unimos.net>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr "Coordenadas"
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr "email"
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr "Olá e benvindo à rede "
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++"Se estiver interessado no nosso projecto, entre em contacto com a sua "
++"comunidade local"
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"O acesso à Internet depende de factores técnicos e organizacionais, e pode "
++"funcionar ou não no seu caso."
++
++msgid "It is operated by"
++msgstr "É operado por "
++
++msgid "Keep configuration"
++msgstr ""
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr "Localização"
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr "Memória"
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr "Nome curto (nick)"
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr "Notas"
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr "Telefone"
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr "Nome"
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr "Este é o ponto de acesso "
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++"Somos uma iniciativa para implementação de uma rede livre, independente e "
++"não-comercial."
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr "Pode encontrar mais informações sobre a iniciativa global Freifunk em "
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/ro/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/ro/freifunk.po
+new file mode 100644
+index 0000000..408abd8
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/ro/freifunk.po
+@@ -0,0 +1,395 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"PO-Revision-Date: 2014-06-29 19:53+0200\n"
++"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
++"Language-Team: none\n"
++"Language: ro\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
++"20)) ? 1 : 2);;\n"
++"X-Generator: Pootle 2.0.6\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr "Setări de bază"
++
++msgid "Basic settings"
++msgstr "Setări de bază"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "Setările de bază sunt incomplete. Mergi la"
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr "Canal"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr "Comunitate"
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr "Contact"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr "Coordonate"
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr ""
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr "Activează IPv6"
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr "Eroare"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr "Du-te la"
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr "Verde"
++
++msgid "Hello and welcome in the network of"
++msgstr ""
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr "Interfaţă"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++
++msgid "It is operated by"
++msgstr ""
++
++msgid "Keep configuration"
++msgstr "Păstrează configuraţia"
++
++msgid "Latitude"
++msgstr "Latitudine"
++
++msgid "Legend"
++msgstr "Legendă"
++
++msgid "Load"
++msgstr "Încarcă"
++
++msgid "Local Time"
++msgstr "Oră locală"
++
++msgid "Location"
++msgstr "Locaţie"
++
++msgid "Longitude"
++msgstr "Longitudine"
++
++msgid "Map"
++msgstr "Hartă"
++
++msgid "Map Error"
++msgstr "Eroare hartă"
++
++msgid "Memory"
++msgstr "Memorie"
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr "Mod"
++
++msgid "Network"
++msgstr "Reţea"
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr "Poreclă"
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr "Portocaliu"
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr "Telefon"
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr "Putere"
++
++msgid "Processor"
++msgstr "Procesor"
++
++msgid "Profile"
++msgstr "Profil"
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr "Nume real"
++
++msgid "Red"
++msgstr "RoÅŸu"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr "Arată pe hartă"
++
++msgid "Signal"
++msgstr "Semnal"
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr "Statistici"
++
++msgid "Status"
++msgstr "Stare"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr "Firmware-ul instalat este cea mai recentă versiune."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr ""
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr "Galben"
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr "şi completaţi toate câmpurile"
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr "ex."
++
++msgid "free"
++msgstr "liber"
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr "folosit"
++
++msgid "wireless settings"
++msgstr "setări wireless"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/ru/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/ru/freifunk.po
+new file mode 100644
+index 0000000..0943a3b
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/ru/freifunk.po
+@@ -0,0 +1,451 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: LuCI: freifunk\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-05-19 19:36+0200\n"
++"PO-Revision-Date: 2013-09-06 09:41+0200\n"
++"Last-Translator: datasheet <michael.gritsaenko@gmail.com>\n"
++"Language-Team: Russian <x12ozmouse@ya.ru>\n"
++"Language: ru\n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++"X-Poedit-SourceCharset: UTF-8\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr "Плохой (ETX > 10)"
++
++msgid "Basic Settings"
++msgstr "Базовые наÑтройки"
++
++msgid "Basic settings"
++msgstr "Базовые наÑтройки"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "Базовые наÑтройки не верны. ПожалуйÑта, перейдите в"
++
++msgid "Basic system settings"
++msgstr "ОÑновные наÑтройки ÑиÑтемы"
++
++msgid "Bitrate"
++msgstr "СкороÑÑ‚ÑŒ"
++
++msgid "Channel"
++msgstr "Канал"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++"Проверить наличие новой верÑии прошивки и выполнить автоматичеÑкое "
++"обновление."
++
++msgid "Client network size"
++msgstr "Размер клиентÑкой Ñети"
++
++msgid "Community"
++msgstr "СообщеÑтво"
++
++msgid "Community profile"
++msgstr "Профиль ÑообщеÑтва"
++
++msgid "Community settings"
++msgstr "ÐаÑтройки ÑообщеÑтва"
++
++msgid "Confirm Upgrade"
++msgstr "Подтвердить обновление"
++
++msgid "Contact"
++msgstr "ÐšÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr "ÐšÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ верна. ПожалуйÑта, перейдите в"
++
++msgid "Coordinates"
++msgstr "Координаты"
++
++msgid "Country code"
++msgstr "Код Ñтраны"
++
++msgid "Default routes"
++msgstr "Маршруты по умолчанию"
++
++msgid "Disable default content"
++msgstr "Запретить контент по умолчанию"
++
++msgid "Diversity is enabled for device"
++msgstr "ÐеопределенноÑÑ‚ÑŒ пути включена"
++
++msgid "E-Mail"
++msgstr "Эл. почта"
++
++msgid "ESSID"
++msgstr "ESSID"
++
++msgid "Edit index page"
++msgstr "Редактировать главную Ñтраницу"
++
++msgid "Enable IPv6"
++msgstr "Включить IPv6"
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr "Ошибка"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr "Ðайдите Ñвои координаты Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ OpenStreetMap"
++
++msgid "Freifunk"
++msgstr "Freifunk"
++
++msgid "Freifunk Overview"
++msgstr "Обзор Freifunk"
++
++msgid "Freifunk Remote Update"
++msgstr "Удалённое обновление Freifunk"
++
++msgid "Gateway"
++msgstr "Шлюз"
++
++msgid "Go to"
++msgstr "Перейти"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "Хороший (2 < ETX < 4)"
++
++#, fuzzy
++msgid "Green"
++msgstr "Зелёный"
++
++msgid "Hello and welcome in the network of"
++msgstr "ЗдравÑтвуйте и добро пожаловать в Ñеть"
++
++msgid "Hide OpenStreetMap"
++msgstr "Скрыть OpenStreetMap"
++
++msgid "Homepage"
++msgstr "ДомашнÑÑ Ñтраница"
++
++msgid "Hostname"
++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта"
++
++#, fuzzy
++msgid "IPv6 Config"
++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ IPv6"
++
++msgid "IPv6 Prefix"
++msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ IPv6"
++
++msgid "IPv6 network in CIDR notation."
++msgstr "Сеть IPv6 в CIDR-нотации"
++
++msgid "If selected then the default content element is not shown."
++msgstr "ЕÑли выбрано, Ñодержимое по умолчанию не будет показано."
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++"ЕÑли вы заинтереÑованы в нашем проекте, ÑвÑжитеÑÑŒ Ñ Ð¼ÐµÑтным ÑообщеÑтвом"
++
++msgid "Index Page"
++msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница"
++
++msgid "Interface"
++msgstr "ИнтерфейÑ"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"ДоÑтуп в интернет завиÑит от техничеÑких и организационных уÑловий и может "
++"быть не доÑтупен Ð´Ð»Ñ Ð²Ð°Ñ."
++
++# It - access point
++msgid "It is operated by"
++msgstr "Она управлÑетÑÑ"
++
++msgid "Keep configuration"
++msgstr "Сохранить конфигурацию"
++
++msgid "Latitude"
++msgstr "Широта"
++
++msgid "Legend"
++msgstr "ÐадпиÑÑŒ"
++
++msgid "Load"
++msgstr "Загрузка"
++
++msgid "Local Time"
++msgstr "МеÑтное времÑ"
++
++msgid "Location"
++msgstr "МеÑтоположение"
++
++msgid "Longitude"
++msgstr "Долгота"
++
++msgid "Map"
++msgstr "Карта"
++
++msgid "Map Error"
++msgstr "Ошибка карты"
++
++msgid "Memory"
++msgstr "ПамÑÑ‚ÑŒ"
++
++msgid "Mesh prefix"
++msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ñчейки"
++
++msgid "Metric"
++msgstr "Метрика"
++
++msgid "Mode"
++msgstr "Режим"
++
++msgid "Network"
++msgstr "Сеть"
++
++msgid "Network for client DHCP addresses"
++msgstr "Сеть Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ñких DHCP-адреÑов"
++
++msgid "Nickname"
++msgstr "ПÑевдоним"
++
++msgid "No default routes known."
++msgstr "Маршруты по умолчанию не извеÑтны."
++
++msgid "Notice"
++msgstr "Внимание"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "Operator"
++msgstr "Оператор"
++
++#, fuzzy
++msgid "Orange"
++msgstr "Оранжевый"
++
++msgid "Overview"
++msgstr "Обзор"
++
++msgid "Package libiwinfo required!"
++msgstr "ТребуетÑÑ libiwinfo!"
++
++msgid "Phone"
++msgstr "Телефон"
++
++msgid "Please fill in your contact details below."
++msgstr "ПожалуйÑта, введите вашу контактную информацию."
++
++msgid "Please set your contact information"
++msgstr "ПожалуйÑта, введите вашу контактную информацию"
++
++msgid "Power"
++msgstr "Питание"
++
++msgid "Processor"
++msgstr "ПроцеÑÑор"
++
++msgid "Profile"
++msgstr "Профиль"
++
++msgid "Profile (Expert)"
++msgstr "Профиль (ÑкÑперт)"
++
++msgid "Realname"
++msgstr "ИмÑ"
++
++#, fuzzy
++msgid "Red"
++msgstr "КраÑный"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++"Укажите ваше меÑтоположение на карте Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ щелчка мыши. Карта будет "
++"показана только еÑли вы подключены к интернету."
++
++msgid "Show OpenStreetMap"
++msgstr "Показать карту OpenStreetMap"
++
++msgid "Show on map"
++msgstr "Показать на карте"
++
++msgid "Signal"
++msgstr "Сигнал"
++
++msgid "Splash"
++msgstr "Splash-Ñкран"
++
++msgid "Start Upgrade"
++msgstr "Ðачать обновление"
++
++msgid "Statistics"
++msgstr "СтатиÑтика"
++
++msgid "Status"
++msgstr "СтатуÑ"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr "СиÑтема"
++
++msgid "TX"
++msgstr "TX"
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++"Пакет <em>libiwinfo-lua</em> не уÑтановлен. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек "
++"беÑпроводных Ñетей, вам необходимо уÑтановить Ñтот компонент!"
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++"Ð¡ÐµÑ€Ð²Ð¸Ñ OLSRd не Ñконфигурирован на получение данных о меÑтоположении из Ñети."
++"<br /> ПожалуйÑта, удоÑтоверьтеÑÑŒ, что модуль проÑтранÑтва имён наÑтроен "
++"правильно и что Ð¾Ð¿Ñ†Ð¸Ñ <em>latlon_file</em> включена."
++
++msgid "The installed firmware is the most recent version."
++msgstr "УÑтановлена прошивка Ñамой поÑледней верÑии."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++"Это базовые наÑтройки вашего ÑообщеÑтва. Они определÑÑŽÑ‚ Ñтандартные "
++"наÑтройки Ð´Ð»Ñ Ð¼Ð°Ñтера уÑтановки и ÐЕ влиÑÑŽÑ‚ на конечную конфигурацию "
++"маршрутизатора."
++
++msgid "These are the settings of your local community."
++msgstr "Это наÑтройки Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÑообщеÑтва."
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++"Эти Ñтраницы помогут наÑтроить ваш маршрутизатор Ð´Ð»Ñ Freifunk или подобной "
++"беÑпроводной Ñети."
++
++msgid "This is the access point"
++msgstr "Это - точка доÑтупа"
++
++msgid "Update Settings"
++msgstr "ÐаÑтройки обновлениÑ"
++
++msgid "Update available!"
++msgstr "ДоÑтупно обновление!"
++
++msgid "Uptime"
++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹"
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr "ПроверÑÑ‚ÑŒ загруженные образы"
++
++msgid "Very good (ETX < 2)"
++msgstr "Очень хороший (ETX < 2)"
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++"Мы - Ñто ÑообщеÑтво, цель которого Ñоздать беÑплатную, незавиÑимую и "
++"открытую беÑпроводную ÑчеиÑтую Ñеть."
++
++msgid "Wireless Overview"
++msgstr "Обзор беÑпроводных Ñетей"
++
++#, fuzzy
++msgid "Yellow"
++msgstr "Жёлтый"
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++"У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ возможноÑÑ‚ÑŒ уÑтановить дополнительное Ñодержимое публичной "
++"Ñтраницы, вÑтавив ÑоответÑтвующий XHTML-код в форму.<br /> Заголовки должны "
++"быть заключены между &lt;h2&gt; и &lt;/h2&gt;."
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr "Ð’Ñ‹ можете найти дополнительную информацию о Freifunk по адреÑу"
++
++msgid "You can manually edit the selected community profile here."
++msgstr "ЗдеÑÑŒ вы можете редактировать выбранный профиль ÑообщеÑтва."
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++"Ðеобходимо выбрать профиль перед его редактированием. Чтобы выбрать профиль, "
++"перейдите в"
++
++msgid "and fill out all required fields."
++msgstr "и заполните вÑе необходимые полÑ."
++
++msgid "buffered"
++msgstr "буферизировано"
++
++msgid "cached"
++msgstr "кÑшировано"
++
++msgid "e.g."
++msgstr "напр."
++
++msgid "free"
++msgstr "Ñвободно"
++
++msgid "to disable it."
++msgstr "чтобы выключить."
++
++msgid "used"
++msgstr "иÑпользовано"
++
++msgid "wireless settings"
++msgstr "наÑтройки беÑпроводной Ñети"
++
++#~ msgid ""
++#~ "No services can be shown, because olsrd is not running or the olsrd-"
++#~ "nameservice Plugin is not loaded."
++#~ msgstr ""
++#~ "Ð¡ÐµÑ€Ð²Ð¸Ñ Ð½Ðµ может быть показан, так как oslrd не запущен или модуль olsrd-"
++#~ "nameservice не загружен."
++
++#~ msgid "Services"
++#~ msgstr "Службы"
++
++#~ msgid "Source"
++#~ msgstr "ИÑточник"
++
++#~ msgid ""
++#~ "The <em>libiwinfo-lua</em> package is not installed. You must install "
++#~ "this component for working wireless configuration!"
++#~ msgstr ""
++#~ "Пакет <em>libiwinfo-lua</em> не уÑтановлен. Вам необходимо уÑтановить "
++#~ "Ñтот компонент Ð´Ð»Ñ Ð½Ð°Ñтройки беÑпроводной Ñети!"
++
++#~ msgid "Url"
++#~ msgstr "Url"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/sk/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/sk/freifunk.po
+new file mode 100644
+index 0000000..343f022
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/sk/freifunk.po
+@@ -0,0 +1,391 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr ""
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr ""
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr ""
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++
++msgid "It is operated by"
++msgstr ""
++
++msgid "Keep configuration"
++msgstr ""
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr ""
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr ""
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr ""
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr ""
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/sv/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/sv/freifunk.po
+new file mode 100644
+index 0000000..cf42fa1
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/sv/freifunk.po
+@@ -0,0 +1,392 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: sv\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++"Plural-Forms: nplurals=2; plural=(n != 1);\n"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr ""
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr ""
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr ""
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++
++msgid "It is operated by"
++msgstr ""
++
++msgid "Keep configuration"
++msgstr ""
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr ""
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr ""
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr ""
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr ""
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/tr/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/tr/freifunk.po
+new file mode 100644
+index 0000000..f485e01
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/tr/freifunk.po
+@@ -0,0 +1,392 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \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"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr ""
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr ""
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr ""
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++
++msgid "It is operated by"
++msgstr ""
++
++msgid "Keep configuration"
++msgstr ""
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr ""
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr ""
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr ""
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr ""
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/uk/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/uk/freifunk.po
+new file mode 100644
+index 0000000..5abfa11
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/uk/freifunk.po
+@@ -0,0 +1,393 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"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"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr ""
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr ""
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr ""
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++
++msgid "It is operated by"
++msgstr ""
++
++msgid "Keep configuration"
++msgstr ""
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr ""
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr ""
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr ""
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr ""
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/vi/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/vi/freifunk.po
+new file mode 100644
+index 0000000..8076d61
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/vi/freifunk.po
+@@ -0,0 +1,398 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-08-16 06:58+0200\n"
++"PO-Revision-Date: 2009-08-15 11:56+0200\n"
++"Last-Translator: Stefan Pirwitz <i18n@freifunk-bno.de>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: \n"
++"MIME-Version: 1.0\n"
++"Content-Type: text/plain; charset=UTF-8\n"
++"Content-Transfer-Encoding: 8bit\n"
++"X-Generator: Pootle 1.1.0\n"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr "Kiểm tra các phiên bản phần cứng mới và thực hiện tự động cập nhật."
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr "Tá»a Ä‘á»™"
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr "E-mail"
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr "Freifunk cập nhật từ xa"
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr "Xin chào và chào mừng gia nhập mạng lưới của"
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr "Hostname"
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++"Nếu bạn quan tâm đến đỠán của chúng tôi, hãy liên hệ cộng đồng địa phương"
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"Truy cập Internet phù thuá»™c vào kỹ thật và Ä‘iá»u kiện tổ chức và có thể hoạt "
++"động hoặc không hoạt động cho bạn"
++
++msgid "It is operated by"
++msgstr "Nó hoạt động bởi "
++
++msgid "Keep configuration"
++msgstr "Giữ cấu hình"
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr "Äịa chỉ"
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr "Bá»™ nhá»›"
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr "Tên"
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr "Chú ý"
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr "Äiện thoại"
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr "Tên thật "
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr "Bắt đầu cập nhật "
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr "Phần cứng được cài đặt là phiên bản mới nhất."
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr "Äây là Ä‘iểm truy cập "
++
++msgid "Update Settings"
++msgstr "Cập nhật cài đặt"
++
++msgid "Update available!"
++msgstr "Cập nhật sẵn có!"
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr "Xác minh hình ảnh đã tải"
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr "Chúng tôi là phát triển mạng lưới nguồn mở không dây đầu tiên"
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr "Bạn có thể tìm thấy thông tin vỠFreifunk toàn cầu tại "
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/zh-cn/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/zh-cn/freifunk.po
+new file mode 100644
+index 0000000..2d58b16
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/zh-cn/freifunk.po
+@@ -0,0 +1,403 @@
++msgid ""
++msgstr ""
++"Project-Id-Version: PACKAGE VERSION\n"
++"Report-Msgid-Bugs-To: \n"
++"POT-Creation-Date: 2009-06-10 03:40+0200\n"
++"PO-Revision-Date: 2014-06-22 14:33+0200\n"
++"Last-Translator: phantasm131 <phantasm131@gmail.com>\n"
++"Language-Team: LANGUAGE <LL@li.org>\n"
++"Language: zh_CN\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: Pootle 2.0.6\n"
++
++msgid "BSSID"
++msgstr "BSSID"
++
++msgid "Bad (ETX > 10)"
++msgstr "错误(ETX>10)"
++
++msgid "Basic Settings"
++msgstr "基础设置"
++
++msgid "Basic settings"
++msgstr "基础设置"
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr "基础设置ä¸å®Œæ•´ï¼Œè¯·è½¬åˆ°"
++
++msgid "Basic system settings"
++msgstr "基础系统设置"
++
++msgid "Bitrate"
++msgstr "速率"
++
++msgid "Channel"
++msgstr "频é“"
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr "检查新的固件版本并自动å‡çº§ã€‚"
++
++msgid "Client network size"
++msgstr "客户端网络容é‡"
++
++msgid "Community"
++msgstr "群组"
++
++msgid "Community profile"
++msgstr "群组é…置文件"
++
++msgid "Community settings"
++msgstr "群组设置"
++
++msgid "Confirm Upgrade"
++msgstr "确认å‡çº§"
++
++msgid "Contact"
++msgstr "è”系人"
++
++msgid "Contact information is incomplete. Please go to"
++msgstr "è”系人信æ¯ä¸å…¨ã€‚请继续填写"
++
++msgid "Coordinates"
++msgstr "ä½ç½®"
++
++msgid "Country code"
++msgstr "国家代ç "
++
++msgid "Default routes"
++msgstr "缺çœè·¯ç”±"
++
++msgid "Disable default content"
++msgstr "ç¦ç”¨é»˜è®¤å†…容"
++
++msgid "Diversity is enabled for device"
++msgstr "å¯ç”¨å¤šé‡è®¾å¤‡"
++
++msgid "E-Mail"
++msgstr "电å­é‚®ä»¶"
++
++msgid "ESSID"
++msgstr "ESSID"
++
++msgid "Edit index page"
++msgstr "编辑索引页"
++
++msgid "Enable IPv6"
++msgstr "å¯ç”¨IPv6"
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr "å¯ç”¨ä¸€ä¸ªè™šæ‹ŸæŽ¥å…¥ç‚¹ï¼ˆå¦‚æžœå¯ä»¥çš„è¯ï¼‰"
++
++msgid "Error"
++msgstr "错误"
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr "使用OpenStreetMap查找ä½ç½®åæ ‡"
++
++msgid "Freifunk"
++msgstr "Freifunk"
++
++msgid "Freifunk Overview"
++msgstr "Freifunk简介"
++
++msgid "Freifunk Remote Update"
++msgstr "Freifunk远程更新"
++
++msgid "Gateway"
++msgstr "网关"
++
++msgid "Go to"
++msgstr "去"
++
++msgid "Good (2 < ETX < 4)"
++msgstr "好(2<ETX<4)"
++
++msgid "Green"
++msgstr "绿色"
++
++msgid "Hello and welcome in the network of"
++msgstr "您好,欢迎加入网络"
++
++msgid "Hide OpenStreetMap"
++msgstr "éšè—OpenStreetMap"
++
++msgid "Homepage"
++msgstr "主页"
++
++msgid "Hostname"
++msgstr "主机å"
++
++msgid "IPv6 Config"
++msgstr "IPv6设置"
++
++msgid "IPv6 Prefix"
++msgstr "IPv6å‰ç¼€"
++
++msgid "IPv6 network in CIDR notation."
++msgstr "CIDR表示法的IPv6网络。"
++
++msgid "If selected then the default content element is not shown."
++msgstr "如果选中,那么默认内容元素将ä¸æ˜¾ç¤ºã€‚"
++
++msgid "If you are interested in our project then contact the local community"
++msgstr "如果你对我们的项目感兴趣,请è”系当地的社区"
++
++msgid "Index Page"
++msgstr "索引页"
++
++msgid "Interface"
++msgstr "接å£"
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++"访问因特网å–决于技术和机构的å‰æ,å¯èƒ½ä¼šã€ä¹Ÿå¯èƒ½ä¸ä¼šåƒä½ è®¾æƒ³çš„那样è¿ä½œã€‚"
++
++msgid "It is operated by"
++msgstr "它是由"
++
++msgid "Keep configuration"
++msgstr "ä¿ç•™é…ç½®"
++
++msgid "Latitude"
++msgstr "纬度"
++
++msgid "Legend"
++msgstr "é“­æ–‡"
++
++msgid "Load"
++msgstr "加载"
++
++msgid "Local Time"
++msgstr "本地时间"
++
++msgid "Location"
++msgstr "所在ä½ç½®"
++
++msgid "Longitude"
++msgstr "ç»åº¦"
++
++msgid "Map"
++msgstr "地图定ä½"
++
++msgid "Map Error"
++msgstr "定ä½å‡ºé”™"
++
++msgid "Memory"
++msgstr "内存"
++
++msgid "Mesh prefix"
++msgstr "Meshå‰ç¼€"
++
++msgid "Metric"
++msgstr "度é‡å•ä½"
++
++msgid "Mode"
++msgstr "模å¼"
++
++msgid "Network"
++msgstr "网络"
++
++msgid "Network for client DHCP addresses"
++msgstr "客户端DHCP地å€"
++
++msgid "Nickname"
++msgstr "昵称"
++
++msgid "No default routes known."
++msgstr "没有缺çœè·¯ç”±"
++
++msgid "Notice"
++msgstr "注æ„"
++
++msgid "OLSR"
++msgstr "OLSR"
++
++msgid "Operator"
++msgstr "æ“作者"
++
++msgid "Orange"
++msgstr "橙色"
++
++msgid "Overview"
++msgstr "概è¦"
++
++msgid "Package libiwinfo required!"
++msgstr "需è¦libiwinfo包ï¼"
++
++msgid "Phone"
++msgstr "电è¯"
++
++msgid "Please fill in your contact details below."
++msgstr "请填写下列è”系信æ¯"
++
++msgid "Please set your contact information"
++msgstr "请æä¾›è”系信æ¯"
++
++msgid "Power"
++msgstr "电æº"
++
++msgid "Processor"
++msgstr "处ç†å™¨"
++
++msgid "Profile"
++msgstr "概è¦"
++
++msgid "Profile (Expert)"
++msgstr "概è¦ï¼ˆä¸“家)"
++
++msgid "Realname"
++msgstr "真实姓å"
++
++msgid "Red"
++msgstr "红色"
++
++msgid "SSID"
++msgstr "SSID"
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr "在地图上用鼠标点出您的ä½ç½®ã€‚需è¦è¿žæŽ¥åˆ°äº’è”网地图。"
++
++msgid "Show OpenStreetMap"
++msgstr "显示OpenStreetMap"
++
++msgid "Show on map"
++msgstr "地图上显示"
++
++msgid "Signal"
++msgstr "ä¿¡å·"
++
++msgid "Splash"
++msgstr "公示"
++
++msgid "Start Upgrade"
++msgstr "开始å‡çº§"
++
++msgid "Statistics"
++msgstr "统计"
++
++msgid "Status"
++msgstr "状æ€"
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr "一直å¯ç”¨ï¼ˆ4<ETX<10)"
++
++msgid "System"
++msgstr "系统"
++
++msgid "TX"
++msgstr "TX"
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr "<em> libiwinfo </em>包没有安装。进行无线é…置您必须安装此组件ï¼"
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++"没有é…ç½®OLSRd从网络获å–ä½ç½®æ•°æ®ã€‚<br />请确ä¿æ­£ç¡®é…置域åæœåŠ¡æ’件,且<em> "
++"latlon_file </em>选项被å¯ç”¨ã€‚"
++
++msgid "The installed firmware is the most recent version."
++msgstr "所安装固件为最新版本。"
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++"这些基本设置为您本地的无线社区。这些设置定义为å‘导默认值并ä¸ä¼šå½±å“路由器的实"
++"é™…é…置。"
++
++msgid "These are the settings of your local community."
++msgstr "当地社区设置。"
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr "这些页é¢å°†å¸®åŠ©ä½ è®¾ç½®è·¯ç”±å™¨Freifunk或类似的无线社区网络。"
++
++msgid "This is the access point"
++msgstr "AP"
++
++msgid "Update Settings"
++msgstr "å‡çº§è®¾ç½®"
++
++msgid "Update available!"
++msgstr "å¯ç”¨æ›´æ–°ï¼"
++
++msgid "Uptime"
++msgstr "正常è¿è¡Œæ—¶é—´"
++
++msgid "VAP"
++msgstr "VAP"
++
++msgid "Verify downloaded images"
++msgstr "校验下载的镜åƒåŒ…"
++
++msgid "Very good (ETX < 2)"
++msgstr "éžå¸¸å¥½ï¼ˆETX<2)"
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr "我们倡议建立一个自由,独立和开放的无线mesh网络。"
++
++msgid "Wireless Overview"
++msgstr "无线概è¦"
++
++msgid "Yellow"
++msgstr "黄色"
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++"å¯ä»¥æ˜¾ç¤ºæ›´å¤šçš„内容,对公众的索引页下é¢çš„表格中æ’入有效的XHTML。<br />标题应放"
++"在&lt;H2&gt;和&lt;/ H2&gt;中"
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr "ä½ å¯ä»¥æ‰¾åˆ°æ›´å¤šæœ‰å…³å…¨çƒFreifunk活动的信æ¯"
++
++msgid "You can manually edit the selected community profile here."
++msgstr "您å¯ä»¥åœ¨è¿™é‡Œæ‰‹åŠ¨ç¼–辑所选社区é…置文件。"
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr "编辑它之å‰ï¼Œä½ éœ€è¦é€‰æ‹©ä¸€ä¸ªé…置文件。选择é…置文件"
++
++msgid "and fill out all required fields."
++msgstr "填写所有必填字段。"
++
++msgid "buffered"
++msgstr "已缓存"
++
++msgid "cached"
++msgstr "已暂存"
++
++msgid "e.g."
++msgstr "例如:"
++
++msgid "free"
++msgstr "空闲"
++
++msgid "to disable it."
++msgstr "ç¦ç”¨å®ƒã€‚"
++
++msgid "used"
++msgstr "å ç”¨"
++
++msgid "wireless settings"
++msgstr "无线设置"
+diff --git a/feeds/luci/modules/luci-mod-freifunk/po/zh-tw/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/zh-tw/freifunk.po
+new file mode 100644
+index 0000000..51432e2
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-freifunk/po/zh-tw/freifunk.po
+@@ -0,0 +1,390 @@
++msgid ""
++msgstr ""
++"Content-Type: text/plain; charset=UTF-8\n"
++"Project-Id-Version: PACKAGE VERSION\n"
++"Last-Translator: Automatically generated\n"
++"Language-Team: none\n"
++"MIME-Version: 1.0\n"
++"Content-Transfer-Encoding: 8bit\n"
++
++msgid "BSSID"
++msgstr ""
++
++msgid "Bad (ETX > 10)"
++msgstr ""
++
++msgid "Basic Settings"
++msgstr ""
++
++msgid "Basic settings"
++msgstr ""
++
++msgid "Basic settings are incomplete. Please go to"
++msgstr ""
++
++msgid "Basic system settings"
++msgstr ""
++
++msgid "Bitrate"
++msgstr ""
++
++msgid "Channel"
++msgstr ""
++
++msgid "Check for new firmware versions and perform automatic updates."
++msgstr ""
++
++msgid "Client network size"
++msgstr ""
++
++msgid "Community"
++msgstr ""
++
++msgid "Community profile"
++msgstr ""
++
++msgid "Community settings"
++msgstr ""
++
++msgid "Confirm Upgrade"
++msgstr ""
++
++msgid "Contact"
++msgstr ""
++
++msgid "Contact information is incomplete. Please go to"
++msgstr ""
++
++msgid "Coordinates"
++msgstr ""
++
++msgid "Country code"
++msgstr ""
++
++msgid "Default routes"
++msgstr ""
++
++msgid "Disable default content"
++msgstr ""
++
++msgid "Diversity is enabled for device"
++msgstr ""
++
++msgid "E-Mail"
++msgstr ""
++
++msgid "ESSID"
++msgstr ""
++
++msgid "Edit index page"
++msgstr ""
++
++msgid "Enable IPv6"
++msgstr ""
++
++msgid "Enable a virtual access point (VAP) by default if possible."
++msgstr ""
++
++msgid "Error"
++msgstr ""
++
++msgid "Find your coordinates with OpenStreetMap"
++msgstr ""
++
++msgid "Freifunk"
++msgstr ""
++
++msgid "Freifunk Overview"
++msgstr ""
++
++msgid "Freifunk Remote Update"
++msgstr ""
++
++msgid "Gateway"
++msgstr ""
++
++msgid "Go to"
++msgstr ""
++
++msgid "Good (2 < ETX < 4)"
++msgstr ""
++
++msgid "Green"
++msgstr ""
++
++msgid "Hello and welcome in the network of"
++msgstr ""
++
++msgid "Hide OpenStreetMap"
++msgstr ""
++
++msgid "Homepage"
++msgstr ""
++
++msgid "Hostname"
++msgstr ""
++
++msgid "IPv6 Config"
++msgstr ""
++
++msgid "IPv6 Prefix"
++msgstr ""
++
++msgid "IPv6 network in CIDR notation."
++msgstr ""
++
++msgid "If selected then the default content element is not shown."
++msgstr ""
++
++msgid "If you are interested in our project then contact the local community"
++msgstr ""
++
++msgid "Index Page"
++msgstr ""
++
++msgid "Interface"
++msgstr ""
++
++msgid ""
++"Internet access depends on technical and organisational conditions and may "
++"or may not work for you."
++msgstr ""
++
++msgid "It is operated by"
++msgstr ""
++
++msgid "Keep configuration"
++msgstr ""
++
++msgid "Latitude"
++msgstr ""
++
++msgid "Legend"
++msgstr ""
++
++msgid "Load"
++msgstr ""
++
++msgid "Local Time"
++msgstr ""
++
++msgid "Location"
++msgstr ""
++
++msgid "Longitude"
++msgstr ""
++
++msgid "Map"
++msgstr ""
++
++msgid "Map Error"
++msgstr ""
++
++msgid "Memory"
++msgstr ""
++
++msgid "Mesh prefix"
++msgstr ""
++
++msgid "Metric"
++msgstr ""
++
++msgid "Mode"
++msgstr ""
++
++msgid "Network"
++msgstr ""
++
++msgid "Network for client DHCP addresses"
++msgstr ""
++
++msgid "Nickname"
++msgstr ""
++
++msgid "No default routes known."
++msgstr ""
++
++msgid "Notice"
++msgstr ""
++
++msgid "OLSR"
++msgstr ""
++
++msgid "Operator"
++msgstr ""
++
++msgid "Orange"
++msgstr ""
++
++msgid "Overview"
++msgstr ""
++
++msgid "Package libiwinfo required!"
++msgstr ""
++
++msgid "Phone"
++msgstr ""
++
++msgid "Please fill in your contact details below."
++msgstr ""
++
++msgid "Please set your contact information"
++msgstr ""
++
++msgid "Power"
++msgstr ""
++
++msgid "Processor"
++msgstr ""
++
++msgid "Profile"
++msgstr ""
++
++msgid "Profile (Expert)"
++msgstr ""
++
++msgid "Realname"
++msgstr ""
++
++msgid "Red"
++msgstr ""
++
++msgid "SSID"
++msgstr ""
++
++msgid ""
++"Select your location with a mouse click on the map. The map will only show "
++"up if you are connected to the Internet."
++msgstr ""
++
++msgid "Show OpenStreetMap"
++msgstr ""
++
++msgid "Show on map"
++msgstr ""
++
++msgid "Signal"
++msgstr ""
++
++msgid "Splash"
++msgstr ""
++
++msgid "Start Upgrade"
++msgstr ""
++
++msgid "Statistics"
++msgstr ""
++
++msgid "Status"
++msgstr ""
++
++msgid "Still usable (4 < ETX < 10)"
++msgstr ""
++
++msgid "System"
++msgstr ""
++
++msgid "TX"
++msgstr ""
++
++msgid ""
++"The <em>libiwinfo</em> package is not installed. You must install this "
++"component for working wireless configuration!"
++msgstr ""
++
++msgid ""
++"The OLSRd service is not configured to capture position data from the "
++"network.<br /> Please make sure that the nameservice plugin is properly "
++"configured and that the <em>latlon_file</em> option is enabled."
++msgstr ""
++
++msgid "The installed firmware is the most recent version."
++msgstr ""
++
++msgid ""
++"These are the basic settings for your local wireless community. These "
++"settings define the default values for the wizard and DO NOT affect the "
++"actual configuration of the router."
++msgstr ""
++
++msgid "These are the settings of your local community."
++msgstr ""
++
++msgid ""
++"These pages will assist you in setting up your router for Freifunk or "
++"similar wireless community networks."
++msgstr ""
++
++msgid "This is the access point"
++msgstr ""
++
++msgid "Update Settings"
++msgstr ""
++
++msgid "Update available!"
++msgstr ""
++
++msgid "Uptime"
++msgstr ""
++
++msgid "VAP"
++msgstr ""
++
++msgid "Verify downloaded images"
++msgstr ""
++
++msgid "Very good (ETX < 2)"
++msgstr ""
++
++msgid ""
++"We are an initiative to establish a free, independent and open wireless mesh "
++"network."
++msgstr ""
++
++msgid "Wireless Overview"
++msgstr ""
++
++msgid "Yellow"
++msgstr ""
++
++msgid ""
++"You can display additional content on the public index page by inserting "
++"valid XHTML in the form below.<br />Headlines should be enclosed between &lt;"
++"h2&gt; and &lt;/h2&gt;."
++msgstr ""
++
++msgid ""
++"You can find further information about the global Freifunk initiative at"
++msgstr ""
++
++msgid "You can manually edit the selected community profile here."
++msgstr ""
++
++msgid ""
++"You need to select a profile before you can edit it. To select a profile go "
++"to"
++msgstr ""
++
++msgid "and fill out all required fields."
++msgstr ""
++
++msgid "buffered"
++msgstr ""
++
++msgid "cached"
++msgstr ""
++
++msgid "e.g."
++msgstr ""
++
++msgid "free"
++msgstr ""
++
++msgid "to disable it."
++msgstr ""
++
++msgid "used"
++msgstr ""
++
++msgid "wireless settings"
++msgstr ""
+diff --git a/feeds/luci/modules/luci-mod-rpc/Makefile b/feeds/luci/modules/luci-mod-rpc/Makefile
+new file mode 100644
+index 0000000..e64c86c
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-rpc/Makefile
+@@ -0,0 +1,15 @@
++#
++# 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_TITLE:=LuCI RPC - JSON-RPC API
++LUCI_DEPENDS:=+luci-lib-json
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
++
+diff --git a/feeds/luci/modules/luci-mod-rpc/luasrc/controller/rpc.lua b/feeds/luci/modules/luci-mod-rpc/luasrc/controller/rpc.lua
+new file mode 100644
+index 0000000..759bb74
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-rpc/luasrc/controller/rpc.lua
+@@ -0,0 +1,161 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local require = require
++local pairs = pairs
++local print = print
++local pcall = pcall
++local table = table
++
++module "luci.controller.rpc"
++
++function index()
++ local function authenticator(validator, accs)
++ local auth = luci.http.formvalue("auth", true)
++ if auth then -- if authentication token was given
++ local sdat = (luci.util.ubus("session", "get", { ubus_rpc_session = auth }) or { }).values
++ if sdat then -- if given token is valid
++ if sdat.user and luci.util.contains(accs, sdat.user) then
++ return sdat.user, auth
++ end
++ end
++ end
++ luci.http.status(403, "Forbidden")
++ end
++
++ local rpc = node("rpc")
++ rpc.sysauth = "root"
++ rpc.sysauth_authenticator = authenticator
++ rpc.notemplate = true
++
++ entry({"rpc", "uci"}, call("rpc_uci"))
++ entry({"rpc", "fs"}, call("rpc_fs"))
++ entry({"rpc", "sys"}, call("rpc_sys"))
++ entry({"rpc", "ipkg"}, call("rpc_ipkg"))
++ entry({"rpc", "auth"}, call("rpc_auth")).sysauth = false
++end
++
++function rpc_auth()
++ local jsonrpc = require "luci.jsonrpc"
++ local http = require "luci.http"
++ local sys = require "luci.sys"
++ local ltn12 = require "luci.ltn12"
++ local util = require "luci.util"
++
++ local loginstat
++
++ local server = {}
++ server.challenge = function(user, pass)
++ local sid, token, secret
++
++ local config = require "luci.config"
++
++ if sys.user.checkpasswd(user, pass) then
++ local sdat = util.ubus("session", "create", { timeout = config.sauth.sessiontime })
++ if sdat then
++ sid = sdat.ubus_rpc_session
++ token = sys.uniqueid(16)
++ secret = sys.uniqueid(16)
++
++ http.header("Set-Cookie", "sysauth="..sid.."; path=/")
++ util.ubus("session", "set", {
++ ubus_rpc_session = sid,
++ values = {
++ user = user,
++ token = token,
++ secret = secret
++ }
++ })
++ end
++ end
++
++ return sid and {sid=sid, token=token, secret=secret}
++ end
++
++ server.login = function(...)
++ local challenge = server.challenge(...)
++ return challenge and challenge.sid
++ end
++
++ http.prepare_content("application/json")
++ ltn12.pump.all(jsonrpc.handle(server, http.source()), http.write)
++end
++
++function rpc_uci()
++ if not pcall(require, "luci.model.uci") then
++ luci.http.status(404, "Not Found")
++ return nil
++ end
++ local uci = require "luci.jsonrpcbind.uci"
++ local jsonrpc = require "luci.jsonrpc"
++ local http = require "luci.http"
++ local ltn12 = require "luci.ltn12"
++
++ http.prepare_content("application/json")
++ ltn12.pump.all(jsonrpc.handle(uci, http.source()), http.write)
++end
++
++function rpc_fs()
++ local util = require "luci.util"
++ local io = require "io"
++ local fs2 = util.clone(require "nixio.fs")
++ local jsonrpc = require "luci.jsonrpc"
++ local http = require "luci.http"
++ local ltn12 = require "luci.ltn12"
++
++ function fs2.readfile(filename)
++ local stat, mime = pcall(require, "mime")
++ if not stat then
++ error("Base64 support not available. Please install LuaSocket.")
++ end
++
++ local fp = io.open(filename)
++ if not fp then
++ return nil
++ end
++
++ local output = {}
++ local sink = ltn12.sink.table(output)
++ local source = ltn12.source.chain(ltn12.source.file(fp), mime.encode("base64"))
++ return ltn12.pump.all(source, sink) and table.concat(output)
++ end
++
++ function fs2.writefile(filename, data)
++ local stat, mime = pcall(require, "mime")
++ if not stat then
++ error("Base64 support not available. Please install LuaSocket.")
++ end
++
++ local file = io.open(filename, "w")
++ local sink = file and ltn12.sink.chain(mime.decode("base64"), ltn12.sink.file(file))
++ return sink and ltn12.pump.all(ltn12.source.string(data), sink) or false
++ end
++
++ http.prepare_content("application/json")
++ ltn12.pump.all(jsonrpc.handle(fs2, http.source()), http.write)
++end
++
++function rpc_sys()
++ local sys = require "luci.sys"
++ local jsonrpc = require "luci.jsonrpc"
++ local http = require "luci.http"
++ local ltn12 = require "luci.ltn12"
++
++ http.prepare_content("application/json")
++ ltn12.pump.all(jsonrpc.handle(sys, http.source()), http.write)
++end
++
++function rpc_ipkg()
++ if not pcall(require, "luci.model.ipkg") then
++ luci.http.status(404, "Not Found")
++ return nil
++ end
++ local ipkg = require "luci.model.ipkg"
++ local jsonrpc = require "luci.jsonrpc"
++ local http = require "luci.http"
++ local ltn12 = require "luci.ltn12"
++
++ http.prepare_content("application/json")
++ ltn12.pump.all(jsonrpc.handle(ipkg, http.source()), http.write)
++end
+diff --git a/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpc.lua b/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpc.lua
+new file mode 100644
+index 0000000..c7f0254
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpc.lua
+@@ -0,0 +1,83 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++module("luci.jsonrpc", package.seeall)
++require "luci.json"
++
++function resolve(mod, method)
++ local path = luci.util.split(method, ".")
++
++ for j=1, #path-1 do
++ if not type(mod) == "table" then
++ break
++ end
++ mod = rawget(mod, path[j])
++ if not mod then
++ break
++ end
++ end
++ mod = type(mod) == "table" and rawget(mod, path[#path]) or nil
++ if type(mod) == "function" then
++ return mod
++ end
++end
++
++function handle(tbl, rawsource, ...)
++ local decoder = luci.json.Decoder()
++ local stat = luci.ltn12.pump.all(rawsource, decoder:sink())
++ local json = decoder:get()
++ local response
++ local success = false
++
++ if stat then
++ if type(json.method) == "string"
++ and (not json.params or type(json.params) == "table") then
++ local method = resolve(tbl, json.method)
++ if method then
++ response = reply(json.jsonrpc, json.id,
++ proxy(method, unpack(json.params or {})))
++ else
++ response = reply(json.jsonrpc, json.id,
++ nil, {code=-32601, message="Method not found."})
++ end
++ else
++ response = reply(json.jsonrpc, json.id,
++ nil, {code=-32600, message="Invalid request."})
++ end
++ else
++ response = reply("2.0", nil,
++ nil, {code=-32700, message="Parse error."})
++ end
++
++ return luci.json.Encoder(response, ...):source()
++end
++
++function reply(jsonrpc, id, res, err)
++ require "luci.json"
++ id = id or luci.json.null
++
++ -- 1.0 compatibility
++ if jsonrpc ~= "2.0" then
++ jsonrpc = nil
++ res = res or luci.json.null
++ err = err or luci.json.null
++ end
++
++ return {id=id, result=res, error=err, jsonrpc=jsonrpc}
++end
++
++function proxy(method, ...)
++ local res = {luci.util.copcall(method, ...)}
++ local stat = table.remove(res, 1)
++
++ if not stat then
++ return nil, {code=-32602, message="Invalid params.", data=table.remove(res, 1)}
++ else
++ if #res <= 1 then
++ return res[1] or luci.json.null
++ else
++ return res
++ end
++ end
++end
+diff --git a/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpcbind/uci.lua b/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpcbind/uci.lua
+new file mode 100644
+index 0000000..284801e
+--- /dev/null
++++ b/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpcbind/uci.lua
+@@ -0,0 +1,83 @@
++-- Copyright 2008 Steven Barth <steven@midlink.org>
++-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local uci = require "luci.model.uci".cursor()
++local ucis = require "luci.model.uci".cursor_state()
++local table = require "table"
++
++
++module "luci.jsonrpcbind.uci"
++_M, _PACKAGE, _NAME = nil, nil, nil
++
++function add(config, ...)
++ uci:load(config)
++ local stat = uci:add(config, ...)
++ return uci:save(config) and stat
++end
++
++function apply(config)
++ return uci:apply(config)
++end
++
++function changes(...)
++ return uci:changes(...)
++end
++
++function commit(config)
++ return uci:load(config) and uci:commit(config)
++end
++
++function delete(config, ...)
++ uci:load(config)
++ return uci:delete(config, ...) and uci:save(config)
++end
++
++function delete_all(config, ...)
++ uci:load(config)
++ return uci:delete_all(config, ...) and uci:save(config)
++end
++
++function foreach(config, stype)
++ uci:load(config)
++ local sections = {}
++
++ return uci:foreach(config, stype, function(section)
++ table.insert(sections, section)
++ end) and sections
++end
++
++function get(config, ...)
++ uci:load(config)
++ return uci:get(config, ...)
++end
++
++function get_all(config, ...)
++ uci:load(config)
++ return uci:get_all(config, ...)
++end
++
++function get_state(config, ...)
++ ucis:load(config)
++ return ucis:get(config, ...)
++end
++
++function revert(config)
++ return uci:load(config) and uci:revert(config)
++end
++
++function section(config, ...)
++ uci:load(config)
++ return uci:section(config, ...) and uci:save(config)
++end
++
++function set(config, ...)
++ uci:load(config)
++ return uci:set(config, ...) and uci:save(config)
++end
++
++function tset(config, ...)
++ uci:load(config)
++ return uci:tset(config, ...) and uci:save(config)
++end
++
+diff --git a/feeds/luci/protocols/luci-proto-3g/Makefile b/feeds/luci/protocols/luci-proto-3g/Makefile
+new file mode 100644
+index 0000000..d1d5455
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-3g/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Support for 3G
++LUCI_DEPENDS:=+comgt
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua b/feeds/luci/protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua
+new file mode 100644
+index 0000000..1b2e23c
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua
+@@ -0,0 +1,147 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local device, apn, service, pincode, username, password, dialnumber
++local ipv6, maxwait, defaultroute, metric, peerdns, dns,
++ keepalive_failure, keepalive_interval, demand
++
++
++device = section:taboption("general", Value, "device", translate("Modem device"))
++device.rmempty = false
++
++local device_suggestions = nixio.fs.glob("/dev/tty[A-Z]*")
++ or nixio.fs.glob("/dev/tts/*")
++
++if device_suggestions then
++ local node
++ for node in device_suggestions do
++ device:value(node)
++ end
++end
++
++
++service = section:taboption("general", Value, "service", translate("Service Type"))
++service:value("", translate("-- Please choose --"))
++service:value("umts", "UMTS/GPRS")
++service:value("umts_only", translate("UMTS only"))
++service:value("gprs_only", translate("GPRS only"))
++service:value("evdo", "CDMA/EV-DO")
++
++
++apn = section:taboption("general", Value, "apn", translate("APN"))
++
++
++pincode = section:taboption("general", Value, "pincode", translate("PIN"))
++
++
++username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))
++
++
++password = section:taboption("general", Value, "password", translate("PAP/CHAP password"))
++password.password = true
++
++dialnumber = section:taboption("general", Value, "dialnumber", translate("Dial number"))
++dialnumber.placeholder = "*99***1#"
++
++if luci.model.network:has_ipv6() then
++
++ ipv6 = section:taboption("advanced", ListValue, "ipv6")
++ ipv6:value("auto", translate("Automatic"))
++ ipv6:value("0", translate("Disabled"))
++ ipv6:value("1", translate("Manual"))
++ ipv6.default = "auto"
++
++end
++
++
++maxwait = section:taboption("advanced", Value, "maxwait",
++ translate("Modem init timeout"),
++ translate("Maximum amount of seconds to wait for the modem to become ready"))
++
++maxwait.placeholder = "20"
++maxwait.datatype = "min(1)"
++
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Use default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++peerdns = section:taboption("advanced", Flag, "peerdns",
++ translate("Use DNS servers advertised by peer"),
++ translate("If unchecked, the advertised DNS server addresses are ignored"))
++
++peerdns.default = peerdns.enabled
++
++
++dns = section:taboption("advanced", DynamicList, "dns",
++ translate("Use custom DNS servers"))
++
++dns:depends("peerdns", "")
++dns.datatype = "ipaddr"
++dns.cast = "string"
++
++
++keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure",
++ translate("LCP echo failure threshold"),
++ translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures"))
++
++function keepalive_failure.cfgvalue(self, section)
++ local v = m:get(section, "keepalive")
++ if v and #v > 0 then
++ return tonumber(v:match("^(%d+)[ ,]+%d+") or v)
++ end
++end
++
++function keepalive_failure.write() end
++function keepalive_failure.remove() end
++
++keepalive_failure.placeholder = "0"
++keepalive_failure.datatype = "uinteger"
++
++
++keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval",
++ translate("LCP echo interval"),
++ translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold"))
++
++function keepalive_interval.cfgvalue(self, section)
++ local v = m:get(section, "keepalive")
++ if v and #v > 0 then
++ return tonumber(v:match("^%d+[ ,]+(%d+)"))
++ end
++end
++
++function keepalive_interval.write(self, section, value)
++ local f = tonumber(keepalive_failure:formvalue(section)) or 0
++ local i = tonumber(value) or 5
++ if i < 1 then i = 1 end
++ if f > 0 then
++ m:set(section, "keepalive", "%d %d" %{ f, i })
++ else
++ m:del(section, "keepalive")
++ end
++end
++
++keepalive_interval.remove = keepalive_interval.write
++keepalive_interval.placeholder = "5"
++keepalive_interval.datatype = "min(1)"
++
++
++demand = section:taboption("advanced", Value, "demand",
++ translate("Inactivity timeout"),
++ translate("Close inactive connection after the given amount of seconds, use 0 to persist connection"))
++
++demand.placeholder = "0"
++demand.datatype = "uinteger"
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/Makefile b/feeds/luci/protocols/luci-proto-ipv6/Makefile
+new file mode 100644
+index 0000000..e749bc9
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Support for DHCPv6/6in4/6to4/6rd/DS-Lite/aiccu
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_464xlat.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_464xlat.lua
+new file mode 100644
+index 0000000..5a37582
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_464xlat.lua
+@@ -0,0 +1,33 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2013 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++local tunlink, defaultroute, metric, mtu
++
++section:taboption("general", Value, "ip6prefix",
++ translate("NAT64 Prefix"), translate("Leave empty to autodetect"))
++
++tunlink = section:taboption("advanced", DynamicList, "tunlink", translate("Tunnel Link"))
++tunlink.template = "cbi/network_netlist"
++tunlink.nocreate = true
++
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface"))
++mtu.placeholder = "1280"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6in4.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6in4.lua
+new file mode 100644
+index 0000000..88dfe09
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6in4.lua
+@@ -0,0 +1,102 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local ipaddr, peeraddr, ip6addr, tunnelid, username, password
++local defaultroute, metric, ttl, mtu
++
++
++ipaddr = s:taboption("general", Value, "ipaddr",
++ translate("Local IPv4 address"),
++ translate("Leave empty to use the current WAN address"))
++
++ipaddr.datatype = "ip4addr"
++
++
++peeraddr = s:taboption("general", Value, "peeraddr",
++ translate("Remote IPv4 address"),
++ translate("This is usually the address of the nearest PoP operated by the tunnel broker"))
++
++peeraddr.rmempty = false
++peeraddr.datatype = "ip4addr"
++
++
++ip6addr = s:taboption("general", Value, "ip6addr",
++ translate("Local IPv6 address"),
++ translate("This is the local endpoint address assigned by the tunnel broker, it usually ends with <code>:2</code>"))
++
++ip6addr.datatype = "ip6addr"
++
++
++local ip6prefix = s:taboption("general", Value, "ip6prefix",
++ translate("IPv6 routed prefix"),
++ translate("This is the prefix routed to you by the tunnel broker for use by clients"))
++
++ip6prefix.datatype = "ip6addr"
++
++
++local update = section:taboption("general", Flag, "_update",
++ translate("Dynamic tunnel"),
++ translate("Enable HE.net dynamic endpoint update"))
++
++update.enabled = "1"
++update.disabled = "0"
++
++function update.write() end
++function update.remove() end
++function update.cfgvalue(self, section)
++ return (tonumber(m:get(section, "tunnelid")) ~= nil)
++ and self.enabled or self.disabled
++end
++
++
++tunnelid = section:taboption("general", Value, "tunnelid", translate("Tunnel ID"))
++tunnelid.datatype = "uinteger"
++tunnelid:depends("_update", update.enabled)
++
++
++username = section:taboption("general", Value, "username",
++ translate("HE.net username"),
++ translate("This is the plain username for logging into the account"))
++
++username:depends("_update", update.enabled)
++username.validate = function(self, val, sid)
++ if type(val) == "string" and #val == 32 and val:match("^[a-fA-F0-9]+$") then
++ return nil, translate("The HE.net endpoint update configuration changed, you must now use the plain username instead of the user ID!")
++ end
++ return val
++end
++
++
++password = section:taboption("general", Value, "password",
++ translate("HE.net password"),
++ translate("This is either the \"Update Key\" configured for the tunnel or the account password if no update key has been configured"))
++
++password.password = true
++password:depends("_update", update.enabled)
++
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++ttl = section:taboption("advanced", Value, "ttl", translate("Use TTL on tunnel interface"))
++ttl.placeholder = "64"
++ttl.datatype = "range(1,255)"
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface"))
++mtu.placeholder = "1280"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6rd.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6rd.lua
+new file mode 100644
+index 0000000..708a9c5
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6rd.lua
+@@ -0,0 +1,72 @@
++-- Copyright 2011-2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local ipaddr, peeraddr, ip6addr, tunnelid, username, password
++local defaultroute, metric, ttl, mtu
++
++
++ipaddr = s:taboption("general", Value, "ipaddr",
++ translate("Local IPv4 address"),
++ translate("Leave empty to use the current WAN address"))
++
++ipaddr.datatype = "ip4addr"
++
++
++peeraddr = s:taboption("general", Value, "peeraddr",
++ translate("Remote IPv4 address"),
++ translate("This IPv4 address of the relay"))
++
++peeraddr.rmempty = false
++peeraddr.datatype = "ip4addr"
++
++
++ip6addr = s:taboption("general", Value, "ip6prefix",
++ translate("IPv6 prefix"),
++ translate("The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"))
++
++ip6addr.rmempty = false
++ip6addr.datatype = "ip6addr"
++
++
++ip6prefixlen = s:taboption("general", Value, "ip6prefixlen",
++ translate("IPv6 prefix length"),
++ translate("The length of the IPv6 prefix in bits"))
++
++ip6prefixlen.placeholder = "16"
++ip6prefixlen.datatype = "range(0,128)"
++
++
++ip6prefixlen = s:taboption("general", Value, "ip4prefixlen",
++ translate("IPv4 prefix length"),
++ translate("The length of the IPv4 prefix in bits, the remainder is used in the IPv6 addresses."))
++
++ip6prefixlen.placeholder = "0"
++ip6prefixlen.datatype = "range(0,32)"
++
++
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++ttl = section:taboption("advanced", Value, "ttl", translate("Use TTL on tunnel interface"))
++ttl.placeholder = "64"
++ttl.datatype = "range(1,255)"
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface"))
++mtu.placeholder = "1280"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua
+new file mode 100644
+index 0000000..50a7069
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua
+@@ -0,0 +1,37 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local ipaddr, defaultroute, metric, ttl, mtu
++
++
++ipaddr = section:taboption("general", Value, "ipaddr",
++ translate("Local IPv4 address"),
++ translate("Leave empty to use the current WAN address"))
++
++ipaddr.datatype = "ip4addr"
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Use default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++ttl = section:taboption("advanced", Value, "ttl", translate("Use TTL on tunnel interface"))
++ttl.placeholder = "64"
++ttl.datatype = "range(1,255)"
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface"))
++mtu.placeholder = "1280"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua
+new file mode 100644
+index 0000000..9315dc2
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua
+@@ -0,0 +1,136 @@
++-- 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"
++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/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua
+new file mode 100644
+index 0000000..c843161
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua
+@@ -0,0 +1,58 @@
++-- Copyright 2013 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++
++local o = section:taboption("general", ListValue, "reqaddress",
++ translate("Request IPv6-address"))
++o:value("try")
++o:value("force")
++o:value("none", "disabled")
++o.default = "try"
++
++
++o = section:taboption("general", Value, "reqprefix",
++ translate("Request IPv6-prefix of length"))
++o:value("auto", translate("automatic"))
++o:value("no", translate("disabled"))
++o:value("48")
++o:value("52")
++o:value("56")
++o:value("60")
++o:value("64")
++o.default = "auto"
++
++
++o = section:taboption("advanced", Flag, "defaultroute",
++ translate("Use default gateway"),
++ translate("If unchecked, no default route is configured"))
++o.default = o.enabled
++
++
++o = section:taboption("advanced", Flag, "peerdns",
++ translate("Use DNS servers advertised by peer"),
++ translate("If unchecked, the advertised DNS server addresses are ignored"))
++o.default = o.enabled
++
++
++o = section:taboption("advanced", Value, "ip6prefix",
++ translate("Custom delegated IPv6-prefix"))
++o.dataype = "ip6addr"
++
++
++o = section:taboption("advanced", DynamicList, "dns",
++ translate("Use custom DNS servers"))
++o:depends("peerdns", "")
++o.datatype = "list(ip6addr)"
++o.cast = "string"
++
++
++o = section:taboption("advanced", Value, "clientid",
++ translate("Client ID to send when requesting DHCP"))
++
++luci.tools.proto.opt_macaddr(section, ifc, translate("Override MAC address"))
++
++o = section:taboption("advanced", Value, "mtu", translate("Override MTU"))
++o.placeholder = "1500"
++o.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua
+new file mode 100644
+index 0000000..9069ff0
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua
+@@ -0,0 +1,53 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2013 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local peeraddr, ip6addr
++local tunlink, defaultroute, metric, ttl, mtu
++
++
++
++
++peeraddr = section:taboption("general", Value, "peeraddr",
++ translate("DS-Lite AFTR address"))
++
++peeraddr.rmempty = false
++peeraddr.datatype = "ip6addr"
++
++ip6addr = section:taboption("general", Value, "ip6addr",
++ translate("Local IPv6 address"),
++ translate("Leave empty to use the current WAN address"))
++
++ip6addr.datatype = "ip6addr"
++
++
++tunlink = section:taboption("advanced", DynamicList, "tunlink", translate("Tunnel Link"))
++tunlink.template = "cbi/network_netlist"
++tunlink.nocreate = true
++
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++ttl = section:taboption("advanced", Value, "ttl", translate("Use TTL on tunnel interface"))
++ttl.placeholder = "64"
++ttl.datatype = "range(1,255)"
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface"))
++mtu.placeholder = "1280"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_hnet.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_hnet.lua
+new file mode 100644
+index 0000000..2ed34fa
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_hnet.lua
+@@ -0,0 +1,37 @@
++-- Copyright 2013 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local mode = section:taboption("general", ListValue, "mode", translate("Category"))
++mode:value("auto", translate("Automatic"))
++mode:value("external", translate("External"))
++mode:value("internal", translate("Internal"))
++mode:value("leaf", translate("Leaf"))
++mode:value("guest", translate("Guest"))
++mode:value("adhoc", translate("Ad-Hoc"))
++mode:value("hybrid", translate("Hybrid"))
++mode.default = "auto"
++
++
++
++local plen = section:taboption("advanced", Value, "ip6assign", translate("IPv6 assignment length"),
++ translate("Assign a part of given length of every public IPv6-prefix to this interface"))
++plen.datatype = "max(128)"
++plen.default = "64"
++
++section:taboption("advanced", Value, "link_id", translate("IPv6 assignment hint"),
++ translate("Assign prefix parts using this hexadecimal subprefix ID for this interface."))
++
++plen = section:taboption("advanced", Value, "ip4assign", translate("IPv4 assignment length"))
++plen.datatype = "max(32)"
++plen.default = "24"
++
++local o = section:taboption("advanced", Value, "dnsname", translate("DNS-Label / FQDN"))
++o.default = map.name
++
++luci.tools.proto.opt_macaddr(section, ifc, translate("Override MAC address"))
++
++o = section:taboption("advanced", Value, "mtu", translate("Override MTU"))
++o.placeholder = "1500"
++o.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua
+new file mode 100644
+index 0000000..37d4ec9
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua
+@@ -0,0 +1,88 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2013 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local peeraddr, ip6addr
++local tunlink, defaultroute, metric, ttl, mtu
++
++
++maptype = section:taboption("general", ListValue, "type", translate("Type"))
++maptype:value("map-e", "MAP-E")
++maptype:value("map-t", "MAP-T")
++maptype:value("lw4o6", "LW4over6")
++
++
++peeraddr = section:taboption("general", Value, "peeraddr",
++ translate("BR / DMR / AFTR"))
++
++peeraddr.rmempty = false
++peeraddr.datatype = "ip6addr"
++
++
++ipaddr = section:taboption("general", Value, "ipaddr",
++ translate("IPv4 prefix"))
++ipaddr.datatype = "ip4addr"
++
++
++ip4prefixlen = s:taboption("general", Value, "ip4prefixlen",
++ translate("IPv4 prefix length"),
++ translate("The length of the IPv4 prefix in bits, the remainder is used in the IPv6 addresses."))
++
++ip4prefixlen.placeholder = "32"
++ip4prefixlen.datatype = "range(0,32)"
++
++ip6addr = s:taboption("general", Value, "ip6prefix",
++ translate("IPv6 prefix"),
++ translate("The IPv6 prefix assigned to the provider, usually ends with <code>::</code>"))
++
++ip6addr.rmempty = false
++ip6addr.datatype = "ip6addr"
++
++
++ip6prefixlen = s:taboption("general", Value, "ip6prefixlen",
++ translate("IPv6 prefix length"),
++ translate("The length of the IPv6 prefix in bits"))
++
++ip6prefixlen.placeholder = "16"
++ip6prefixlen.datatype = "range(0,64)"
++
++
++s:taboption("general", Value, "ealen",
++ translate("EA-bits length")).datatype = "range(0,48)"
++
++s:taboption("general", Value, "psidlen",
++ translate("PSID-bits length")).datatype = "range(0,16)"
++
++s:taboption("general", Value, "offset",
++ translate("PSID offset")).datatype = "range(0,16)"
++
++tunlink = section:taboption("advanced", DynamicList, "tunlink", translate("Tunnel Link"))
++tunlink.template = "cbi/network_netlist"
++tunlink.nocreate = true
++
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++ttl = section:taboption("advanced", Value, "ttl", translate("Use TTL on tunnel interface"))
++ttl.placeholder = "64"
++ttl.datatype = "range(1,255)"
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface"))
++mtu.placeholder = "1280"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_4x6.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_4x6.lua
+new file mode 100644
+index 0000000..d876d69
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_4x6.lua
+@@ -0,0 +1,63 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Copyright 2013 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local netmod = luci.model.network
++
++local _, p
++for _, p in ipairs({"dslite", "map", "464xlat"}) do
++
++ local proto = netmod:register_protocol(p)
++
++ function proto.get_i18n(self)
++ if p == "dslite" then
++ return luci.i18n.translate("Dual-Stack Lite (RFC6333)")
++ elseif p == "map" then
++ return luci.i18n.translate("MAP / LW4over6")
++ elseif p == "464xlat" then
++ return luci.i18n.translate("464XLAT (CLAT)")
++ end
++ end
++
++ function proto.ifname(self)
++ return p .. "-" .. self.sid
++ end
++
++ function proto.opkg_package(self)
++ if p == "dslite" then
++ return "ds-lite"
++ elseif p == "map" then
++ return "map-t"
++ elseif p == "464xlat" then
++ return "464xlat"
++ end
++ end
++
++ function proto.is_installed(self)
++ return nixio.fs.access("/lib/netifd/proto/" .. p .. ".sh")
++ 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)
++ return (netmod:ifnameof(ifc) == self:ifname())
++ end
++
++ if p == "dslite" then
++ netmod:register_pattern_virtual("^ds-%w")
++ elseif p == "map" then
++ netmod:register_pattern_virtual("^map-%w")
++ elseif p == "464xlat" then
++ netmod:register_pattern_virtual("^464-%w")
++ end
++end
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_6x4.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_6x4.lua
+new file mode 100644
+index 0000000..d267ce9
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_6x4.lua
+@@ -0,0 +1,50 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local netmod = luci.model.network
++
++local _, p
++for _, p in ipairs({"6in4", "6to4", "6rd"}) do
++
++ local proto = netmod:register_protocol(p)
++
++ function proto.get_i18n(self)
++ if p == "6in4" then
++ return luci.i18n.translate("IPv6-in-IPv4 (RFC4213)")
++ elseif p == "6to4" then
++ return luci.i18n.translate("IPv6-over-IPv4 (6to4)")
++ elseif p == "6rd" then
++ return luci.i18n.translate("IPv6-over-IPv4 (6rd)")
++ end
++ end
++
++ function proto.ifname(self)
++ return p .. "-" .. self.sid
++ end
++
++ function proto.opkg_package(self)
++ return p
++ end
++
++ function proto.is_installed(self)
++ return nixio.fs.access("/lib/netifd/proto/" .. p .. ".sh")
++ 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)
++ return (netmod:ifnameof(ifc) == self:ifname())
++ end
++
++ netmod:register_pattern_virtual("^%s-%%w" % p)
++end
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua
+new file mode 100644
+index 0000000..5896a27
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua
+@@ -0,0 +1,49 @@
++-- 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")
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_dhcpv6.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_dhcpv6.lua
+new file mode 100644
+index 0000000..0b45dad
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_dhcpv6.lua
+@@ -0,0 +1,16 @@
++-- Copyright 2013 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local proto = luci.model.network:register_protocol("dhcpv6")
++
++function proto.get_i18n(self)
++ return luci.i18n.translate("DHCPv6 client")
++end
++
++function proto.is_installed(self)
++ return nixio.fs.access("/lib/netifd/proto/dhcpv6.sh")
++end
++
++function proto.opkg_package(self)
++ return "odhcp6c"
++end
+diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_hnet.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_hnet.lua
+new file mode 100644
+index 0000000..f525061
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_hnet.lua
+@@ -0,0 +1,16 @@
++-- Copyright 2014 Steven Barth <steven@midlink.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local proto = luci.model.network:register_protocol("hnet")
++
++function proto.get_i18n(self)
++ return luci.i18n.translate("Automatic Homenet (HNCP)")
++end
++
++function proto.is_installed(self)
++ return nixio.fs.access("/lib/netifd/proto/hnet.sh")
++end
++
++function proto.opkg_package(self)
++ return "hnet-full"
++end
+diff --git a/feeds/luci/protocols/luci-proto-openconnect/Makefile b/feeds/luci/protocols/luci-proto-openconnect/Makefile
+new file mode 100644
+index 0000000..31f5274
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-openconnect/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Support for OpenConnect VPN
++LUCI_DEPENDS:=+openconnect
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua b/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua
+new file mode 100644
+index 0000000..4ed34ae
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua
+@@ -0,0 +1,86 @@
++-- Copyright 2014 Nikos Mavrogiannopoulos <nmav@gnutls.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local server, username, password, cert, ca
++local oc_cert_file, oc_key_file, oc_ca_file
++
++local ifc = net:get_interface():name()
++
++oc_cert_file = "/etc/openconnect/user-cert-" .. ifc .. ".pem"
++oc_key_file = "/etc/openconnect/user-key-" .. ifc .. ".pem"
++oc_ca_file = "/etc/openconnect/ca-" .. ifc .. ".pem"
++
++server = section:taboption("general", Value, "server", translate("VPN Server"))
++server.datatype = "host"
++
++port = section:taboption("general", Value, "port", translate("VPN Server port"))
++port.placeholder = "443"
++port.datatype = "port"
++
++ifname = section:taboption("general", Value, "interface", translate("Output Interface"))
++ifname.template = "cbi/network_netlist"
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Use default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++section:taboption("general", Value, "serverhash", translate("VPN Server's certificate SHA1 hash"))
++
++section:taboption("general", Value, "authgroup", translate("AuthGroup"))
++
++username = section:taboption("general", Value, "username", translate("Username"))
++password = section:taboption("general", Value, "password", translate("Password"))
++password.password = true
++
++
++cert = section:taboption("advanced", Value, "usercert", translate("User certificate (PEM encoded)"))
++cert.template = "cbi/tvalue"
++cert.rows = 10
++
++function cert.cfgvalue(self, section)
++ return nixio.fs.readfile(oc_cert_file)
++end
++
++function cert.write(self, section, value)
++ value = value:gsub("\r\n?", "\n")
++ nixio.fs.writefile(oc_cert_file, value)
++end
++
++cert = section:taboption("advanced", Value, "userkey", translate("User key (PEM encoded)"))
++cert.template = "cbi/tvalue"
++cert.rows = 10
++
++function cert.cfgvalue(self, section)
++ return nixio.fs.readfile(oc_key_file)
++end
++
++function cert.write(self, section, value)
++ value = value:gsub("\r\n?", "\n")
++ nixio.fs.writefile(oc_key_file, value)
++end
++
++
++ca = section:taboption("advanced", Value, "ca", translate("CA certificate; if empty it will be saved after the first connection."))
++ca.template = "cbi/tvalue"
++ca.rows = 10
++
++function ca.cfgvalue(self, section)
++ return nixio.fs.readfile(oc_ca_file)
++end
++
++function ca.write(self, section, value)
++ value = value:gsub("\r\n?", "\n")
++ nixio.fs.writefile(oc_ca_file, value)
++end
+diff --git a/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/network/proto_openconnect.lua b/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/network/proto_openconnect.lua
+new file mode 100644
+index 0000000..0af77d0
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/network/proto_openconnect.lua
+@@ -0,0 +1,45 @@
++-- Copyright 2012 David Woodhouse
++-- 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("openconnect")
++
++function proto.get_i18n(self)
++ return luci.i18n.translate("OpenConnect (CISCO AnyConnect)")
++end
++
++function proto.ifname(self)
++ return "vpn-" .. self.sid
++end
++
++function proto.get_interface(self)
++ return interface(self:ifname(), self)
++end
++
++function proto.opkg_package(self)
++ return "openconnect"
++end
++
++function proto.is_installed(self)
++ return nixio.fs.access("/lib/netifd/proto/openconnect.sh")
++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, ifc)
++ return (netmod:ifnameof(ifc) == self:ifname())
++
++end
++
++netmod:register_pattern_virtual("^vpn-%w")
+diff --git a/feeds/luci/protocols/luci-proto-ppp/Makefile b/feeds/luci/protocols/luci-proto-ppp/Makefile
+new file mode 100644
+index 0000000..70db744
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ppp/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Support for PPP/PPPoE/PPPoA/PPtP
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua
+new file mode 100644
+index 0000000..523ef1b
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua
+@@ -0,0 +1,61 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local server, username, password
++local ipv6, defaultroute, metric, peerdns, dns, mtu
++
++
++server = section:taboption("general", Value, "server", translate("L2TP Server"))
++server.datatype = "host"
++
++
++username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))
++
++
++password = section:taboption("general", Value, "password", translate("PAP/CHAP password"))
++password.password = true
++
++if luci.model.network:has_ipv6() then
++
++ ipv6 = section:taboption("advanced", ListValue, "ipv6")
++ ipv6:value("auto", translate("Automatic"))
++ ipv6:value("0", translate("Disabled"))
++ ipv6:value("1", translate("Manual"))
++ ipv6.default = "auto"
++
++end
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Use default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++peerdns = section:taboption("advanced", Flag, "peerdns",
++ translate("Use DNS servers advertised by peer"),
++ translate("If unchecked, the advertised DNS server addresses are ignored"))
++
++peerdns.default = peerdns.enabled
++
++
++dns = section:taboption("advanced", DynamicList, "dns",
++ translate("Use custom DNS servers"))
++
++dns:depends("peerdns", "")
++dns.datatype = "ipaddr"
++dns.cast = "string"
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU"))
++mtu.placeholder = "1500"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua
+new file mode 100644
+index 0000000..b14db59
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua
+@@ -0,0 +1,127 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local device, username, password
++local ipv6, defaultroute, metric, peerdns, dns,
++ keepalive_failure, keepalive_interval, demand, mtu
++
++
++device = section:taboption("general", Value, "device", translate("Modem device"))
++device.rmempty = false
++
++local device_suggestions = nixio.fs.glob("/dev/tty*S*")
++ or nixio.fs.glob("/dev/tts/*")
++
++if device_suggestions then
++ local node
++ for node in device_suggestions do
++ device:value(node)
++ end
++end
++
++
++username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))
++
++
++password = section:taboption("general", Value, "password", translate("PAP/CHAP password"))
++password.password = true
++
++
++if luci.model.network:has_ipv6() then
++
++ ipv6 = section:taboption("advanced", ListValue, "ipv6")
++ ipv6:value("auto", translate("Automatic"))
++ ipv6:value("0", translate("Disabled"))
++ ipv6:value("1", translate("Manual"))
++ ipv6.default = "auto"
++
++end
++
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Use default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++peerdns = section:taboption("advanced", Flag, "peerdns",
++ translate("Use DNS servers advertised by peer"),
++ translate("If unchecked, the advertised DNS server addresses are ignored"))
++
++peerdns.default = peerdns.enabled
++
++
++dns = section:taboption("advanced", DynamicList, "dns",
++ translate("Use custom DNS servers"))
++
++dns:depends("peerdns", "")
++dns.datatype = "ipaddr"
++dns.cast = "string"
++
++
++keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure",
++ translate("LCP echo failure threshold"),
++ translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures"))
++
++function keepalive_failure.cfgvalue(self, section)
++ local v = m:get(section, "keepalive")
++ if v and #v > 0 then
++ return tonumber(v:match("^(%d+)[ ,]+%d+") or v)
++ end
++end
++
++keepalive_failure.placeholder = "0"
++keepalive_failure.datatype = "uinteger"
++
++
++keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval",
++ translate("LCP echo interval"),
++ translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold"))
++
++function keepalive_interval.cfgvalue(self, section)
++ local v = m:get(section, "keepalive")
++ if v and #v > 0 then
++ return tonumber(v:match("^%d+[ ,]+(%d+)"))
++ end
++end
++
++function keepalive_interval.write(self, section, value)
++ local f = tonumber(keepalive_failure:formvalue(section)) or 0
++ local i = tonumber(value) or 5
++ if i < 1 then i = 1 end
++ if f > 0 then
++ m:set(section, "keepalive", "%d %d" %{ f, i })
++ else
++ m:del(section, "keepalive")
++ end
++end
++
++keepalive_interval.remove = keepalive_interval.write
++keepalive_failure.write = keepalive_interval.write
++keepalive_failure.remove = keepalive_interval.write
++keepalive_interval.placeholder = "5"
++keepalive_interval.datatype = "min(1)"
++
++
++demand = section:taboption("advanced", Value, "demand",
++ translate("Inactivity timeout"),
++ translate("Close inactive connection after the given amount of seconds, use 0 to persist connection"))
++
++demand.placeholder = "0"
++demand.datatype = "uinteger"
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU"))
++mtu.placeholder = "1500"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua
+new file mode 100644
+index 0000000..8f463e5
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua
+@@ -0,0 +1,133 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local encaps, atmdev, vci, vpi, username, password
++local ipv6, defaultroute, metric, peerdns, dns,
++ keepalive_failure, keepalive_interval, demand, mtu
++
++
++encaps = section:taboption("general", ListValue, "encaps", translate("PPPoA Encapsulation"))
++encaps:value("vc", "VC-Mux")
++encaps:value("llc", "LLC")
++
++
++atmdev = section:taboption("general", Value, "atmdev", translate("ATM device number"))
++atmdev.default = "0"
++atmdev.datatype = "uinteger"
++
++
++vci = section:taboption("general", Value, "vci", translate("ATM Virtual Channel Identifier (VCI)"))
++vci.default = "35"
++vci.datatype = "uinteger"
++
++
++vpi = section:taboption("general", Value, "vpi", translate("ATM Virtual Path Identifier (VPI)"))
++vpi.default = "8"
++vpi.datatype = "uinteger"
++
++
++username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))
++
++
++password = section:taboption("general", Value, "password", translate("PAP/CHAP password"))
++password.password = true
++
++
++if luci.model.network:has_ipv6() then
++
++ ipv6 = section:taboption("advanced", ListValue, "ipv6")
++ ipv6:value("auto", translate("Automatic"))
++ ipv6:value("0", translate("Disabled"))
++ ipv6:value("1", translate("Manual"))
++ ipv6.default = "auto"
++
++end
++
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Use default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++peerdns = section:taboption("advanced", Flag, "peerdns",
++ translate("Use DNS servers advertised by peer"),
++ translate("If unchecked, the advertised DNS server addresses are ignored"))
++
++peerdns.default = peerdns.enabled
++
++
++dns = section:taboption("advanced", DynamicList, "dns",
++ translate("Use custom DNS servers"))
++
++dns:depends("peerdns", "")
++dns.datatype = "ipaddr"
++dns.cast = "string"
++
++
++keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure",
++ translate("LCP echo failure threshold"),
++ translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures"))
++
++function keepalive_failure.cfgvalue(self, section)
++ local v = m:get(section, "keepalive")
++ if v and #v > 0 then
++ return tonumber(v:match("^(%d+)[ ,]+%d+") or v)
++ end
++end
++
++keepalive_failure.placeholder = "0"
++keepalive_failure.datatype = "uinteger"
++
++
++keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval",
++ translate("LCP echo interval"),
++ translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold"))
++
++function keepalive_interval.cfgvalue(self, section)
++ local v = m:get(section, "keepalive")
++ if v and #v > 0 then
++ return tonumber(v:match("^%d+[ ,]+(%d+)"))
++ end
++end
++
++function keepalive_interval.write(self, section, value)
++ local f = tonumber(keepalive_failure:formvalue(section)) or 0
++ local i = tonumber(value) or 5
++ if i < 1 then i = 1 end
++ if f > 0 then
++ m:set(section, "keepalive", "%d %d" %{ f, i })
++ else
++ m:del(section, "keepalive")
++ end
++end
++
++keepalive_interval.remove = keepalive_interval.write
++keepalive_failure.write = keepalive_interval.write
++keepalive_failure.remove = keepalive_interval.write
++keepalive_interval.placeholder = "5"
++keepalive_interval.datatype = "min(1)"
++
++
++demand = section:taboption("advanced", Value, "demand",
++ translate("Inactivity timeout"),
++ translate("Close inactive connection after the given amount of seconds, use 0 to persist connection"))
++
++demand.placeholder = "0"
++demand.datatype = "uinteger"
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU"))
++mtu.placeholder = "1500"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua
+new file mode 100644
+index 0000000..5a05cd2
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua
+@@ -0,0 +1,127 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local username, password, ac, service
++local ipv6, defaultroute, metric, peerdns, dns,
++ keepalive_failure, keepalive_interval, demand, mtu
++
++
++username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))
++
++
++password = section:taboption("general", Value, "password", translate("PAP/CHAP password"))
++password.password = true
++
++
++ac = section:taboption("general", Value, "ac",
++ translate("Access Concentrator"),
++ translate("Leave empty to autodetect"))
++
++ac.placeholder = translate("auto")
++
++
++service = section:taboption("general", Value, "service",
++ translate("Service Name"),
++ translate("Leave empty to autodetect"))
++
++service.placeholder = translate("auto")
++
++
++if luci.model.network:has_ipv6() then
++
++ ipv6 = section:taboption("advanced", ListValue, "ipv6")
++ ipv6:value("auto", translate("Automatic"))
++ ipv6:value("0", translate("Disabled"))
++ ipv6:value("1", translate("Manual"))
++ ipv6.default = "auto"
++
++end
++
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Use default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++peerdns = section:taboption("advanced", Flag, "peerdns",
++ translate("Use DNS servers advertised by peer"),
++ translate("If unchecked, the advertised DNS server addresses are ignored"))
++
++peerdns.default = peerdns.enabled
++
++
++dns = section:taboption("advanced", DynamicList, "dns",
++ translate("Use custom DNS servers"))
++
++dns:depends("peerdns", "")
++dns.datatype = "ipaddr"
++dns.cast = "string"
++
++
++keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure",
++ translate("LCP echo failure threshold"),
++ translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures"))
++
++function keepalive_failure.cfgvalue(self, section)
++ local v = m:get(section, "keepalive")
++ if v and #v > 0 then
++ return tonumber(v:match("^(%d+)[ ,]+%d+") or v)
++ end
++end
++
++keepalive_failure.placeholder = "0"
++keepalive_failure.datatype = "uinteger"
++
++
++keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval",
++ translate("LCP echo interval"),
++ translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold"))
++
++function keepalive_interval.cfgvalue(self, section)
++ local v = m:get(section, "keepalive")
++ if v and #v > 0 then
++ return tonumber(v:match("^%d+[ ,]+(%d+)"))
++ end
++end
++
++function keepalive_interval.write(self, section, value)
++ local f = tonumber(keepalive_failure:formvalue(section)) or 0
++ local i = tonumber(value) or 5
++ if i < 1 then i = 1 end
++ if f > 0 then
++ m:set(section, "keepalive", "%d %d" %{ f, i })
++ else
++ m:del(section, "keepalive")
++ end
++end
++
++keepalive_interval.remove = keepalive_interval.write
++keepalive_failure.write = keepalive_interval.write
++keepalive_failure.remove = keepalive_interval.write
++keepalive_interval.placeholder = "5"
++keepalive_interval.datatype = "min(1)"
++
++
++demand = section:taboption("advanced", Value, "demand",
++ translate("Inactivity timeout"),
++ translate("Close inactive connection after the given amount of seconds, use 0 to persist connection"))
++
++demand.placeholder = "0"
++demand.datatype = "uinteger"
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU"))
++mtu.placeholder = "1500"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua
+new file mode 100644
+index 0000000..d81db1f
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua
+@@ -0,0 +1,106 @@
++-- Copyright 2011-2012 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local server, username, password
++local defaultroute, metric, peerdns, dns,
++ keepalive_failure, keepalive_interval, demand, mtu
++
++
++server = section:taboption("general", Value, "server", translate("VPN Server"))
++server.datatype = "host"
++
++
++username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))
++
++
++password = section:taboption("general", Value, "password", translate("PAP/CHAP password"))
++password.password = true
++
++
++defaultroute = section:taboption("advanced", Flag, "defaultroute",
++ translate("Use default gateway"),
++ translate("If unchecked, no default route is configured"))
++
++defaultroute.default = defaultroute.enabled
++
++
++metric = section:taboption("advanced", Value, "metric",
++ translate("Use gateway metric"))
++
++metric.placeholder = "0"
++metric.datatype = "uinteger"
++metric:depends("defaultroute", defaultroute.enabled)
++
++
++peerdns = section:taboption("advanced", Flag, "peerdns",
++ translate("Use DNS servers advertised by peer"),
++ translate("If unchecked, the advertised DNS server addresses are ignored"))
++
++peerdns.default = peerdns.enabled
++
++
++dns = section:taboption("advanced", DynamicList, "dns",
++ translate("Use custom DNS servers"))
++
++dns:depends("peerdns", "")
++dns.datatype = "ipaddr"
++dns.cast = "string"
++
++
++keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure",
++ translate("LCP echo failure threshold"),
++ translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures"))
++
++function keepalive_failure.cfgvalue(self, section)
++ local v = m:get(section, "keepalive")
++ if v and #v > 0 then
++ return tonumber(v:match("^(%d+)[ ,]+%d+") or v)
++ end
++end
++
++keepalive_failure.placeholder = "0"
++keepalive_failure.datatype = "uinteger"
++
++
++keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval",
++ translate("LCP echo interval"),
++ translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold"))
++
++function keepalive_interval.cfgvalue(self, section)
++ local v = m:get(section, "keepalive")
++ if v and #v > 0 then
++ return tonumber(v:match("^%d+[ ,]+(%d+)"))
++ end
++end
++
++function keepalive_interval.write(self, section, value)
++ local f = tonumber(keepalive_failure:formvalue(section)) or 0
++ local i = tonumber(value) or 5
++ if i < 1 then i = 1 end
++ if f > 0 then
++ m:set(section, "keepalive", "%d %d" %{ f, i })
++ else
++ m:del(section, "keepalive")
++ end
++end
++
++keepalive_interval.remove = keepalive_interval.write
++keepalive_failure.write = keepalive_interval.write
++keepalive_failure.remove = keepalive_interval.write
++keepalive_interval.placeholder = "5"
++keepalive_interval.datatype = "min(1)"
++
++
++demand = section:taboption("advanced", Value, "demand",
++ translate("Inactivity timeout"),
++ translate("Close inactive connection after the given amount of seconds, use 0 to persist connection"))
++
++demand.placeholder = "0"
++demand.datatype = "uinteger"
++
++
++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU"))
++mtu.placeholder = "1500"
++mtu.datatype = "max(9200)"
+diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua
+new file mode 100644
+index 0000000..e84658c
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua
+@@ -0,0 +1,88 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local netmod = luci.model.network
++
++local _, p
++for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp"}) do
++
++ local proto = netmod:register_protocol(p)
++
++ function proto.get_i18n(self)
++ if p == "ppp" then
++ 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
++ return luci.i18n.translate("PPPoATM")
++ elseif p == "l2tp" then
++ return luci.i18n.translate("L2TP")
++ end
++ end
++
++ function proto.ifname(self)
++ return p .. "-" .. self.sid
++ end
++
++ 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
++ return "ppp-mod-pppoe"
++ elseif p == "pppoa" then
++ return "ppp-mod-pppoa"
++ elseif p == "l2tp" then
++ return "xl2tpd"
++ end
++ end
++
++ function proto.is_installed(self)
++ if p == "pppoa" then
++ return (nixio.fs.glob("/usr/lib/pppd/*/pppoatm.so")() ~= nil)
++ elseif p == "pppoe" then
++ 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")
++ else
++ return nixio.fs.access("/lib/netifd/proto/ppp.sh")
++ end
++ end
++
++ function proto.is_floating(self)
++ return (p ~= "pppoe")
++ end
++
++ function proto.is_virtual(self)
++ return true
++ end
++
++ function proto.get_interfaces(self)
++ if self:is_floating() then
++ return nil
++ else
++ return netmod.protocol.get_interfaces(self)
++ end
++ end
++
++ function proto.contains_interface(self, ifc)
++ 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("^%s-%%w" % p)
++end
+diff --git a/feeds/luci/protocols/luci-proto-relay/Makefile b/feeds/luci/protocols/luci-proto-relay/Makefile
+new file mode 100644
+index 0000000..d9c04f7
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-relay/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Support for relayd pseudo bridges
++LUCI_DEPENDS:=+relayd
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/protocols/luci-proto-relay/luasrc/model/cbi/admin_network/proto_relay.lua b/feeds/luci/protocols/luci-proto-relay/luasrc/model/cbi/admin_network/proto_relay.lua
+new file mode 100644
+index 0000000..3381d85
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-relay/luasrc/model/cbi/admin_network/proto_relay.lua
+@@ -0,0 +1,68 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local map, section, net = ...
++
++local ipaddr, network
++local forward_bcast, forward_dhcp, gateway, expiry, retry, table
++
++
++ipaddr = section:taboption("general", Value, "ipaddr",
++ translate("Local IPv4 address"),
++ translate("Address to access local relay bridge"))
++
++ipaddr.datatype = "ip4addr"
++
++
++network = s:taboption("general", DynamicList, "network", translate("Relay between networks"))
++network.widget = "checkbox"
++network.exclude = arg[1]
++network.template = "cbi/network_netlist"
++network.nocreate = true
++network.nobridges = true
++network.novirtual = true
++network:depends("proto", "relay")
++
++
++forward_bcast = section:taboption("advanced", Flag, "forward_bcast",
++ translate("Forward broadcast traffic"))
++
++forward_bcast.default = forward_bcast.enabled
++
++
++forward_dhcp = section:taboption("advanced", Flag, "forward_dhcp",
++ translate("Forward DHCP traffic"))
++
++forward_dhcp.default = forward_dhcp.enabled
++
++
++gateway = section:taboption("advanced", Value, "gateway",
++ translate("Use DHCP gateway"),
++ translate("Override the gateway in DHCP responses"))
++
++gateway.datatype = "ip4addr"
++gateway:depends("forward_dhcp", forward_dhcp.enabled)
++
++
++expiry = section:taboption("advanced", Value, "expiry",
++ translate("Host expiry timeout"),
++ translate("Specifies the maximum amount of seconds after which hosts are presumed to be dead"))
++
++expiry.placeholder = "30"
++expiry.datatype = "min(1)"
++
++
++retry = section:taboption("advanced", Value, "retry",
++ translate("ARP retry threshold"),
++ translate("Specifies the maximum amount of failed ARP requests until hosts are presumed to be dead"))
++
++retry.placeholder = "5"
++retry.datatype = "min(1)"
++
++
++table = section:taboption("advanced", Value, "table",
++ translate("Use routing table"),
++ translate("Override the table used for internal routes"))
++
++table.placeholder = "16800"
++table.datatype = "range(0,65535)"
+diff --git a/feeds/luci/protocols/luci-proto-relay/luasrc/model/network/proto_relay.lua b/feeds/luci/protocols/luci-proto-relay/luasrc/model/network/proto_relay.lua
+new file mode 100644
+index 0000000..5d40fc7
+--- /dev/null
++++ b/feeds/luci/protocols/luci-proto-relay/luasrc/model/network/proto_relay.lua
+@@ -0,0 +1,149 @@
++-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
++-- Licensed to the public under the Apache License 2.0.
++
++local netmod = luci.model.network
++local device = luci.util.class(netmod.interface)
++
++netmod:register_pattern_virtual("^relay-%w")
++
++local proto = netmod:register_protocol("relay")
++
++function proto.get_i18n(self)
++ return luci.i18n.translate("Relay bridge")
++end
++
++function proto.ifname(self)
++ return "relay-" .. self.sid
++end
++
++function proto.opkg_package(self)
++ return "relayd"
++end
++
++function proto.is_installed(self)
++ return nixio.fs.access("/etc/init.d/relayd")
++end
++
++function proto.is_floating(self)
++ return true
++end
++
++function proto.is_virtual(self)
++ return true
++end
++
++function proto.get_interface(self)
++ return device(self.sid, self)
++end
++
++function proto.get_interfaces(self)
++ if not self.ifaces then
++ local ifs = { }
++ local _, net, dev
++
++ for net in luci.util.imatch(self:_get("network")) do
++ net = netmod:get_network(net)
++ if net then
++ dev = net:get_interface()
++ if dev then
++ ifs[dev:name()] = dev
++ end
++ end
++ end
++
++ for dev in luci.util.imatch(self:_get("ifname")) do
++ dev = netmod:get_interface(dev)
++ if dev then
++ ifs[dev:name()] = dev
++ end
++ end
++
++ self.ifaces = { }
++
++ for _, dev in luci.util.kspairs(ifs) do
++ self.ifaces[#self.ifaces+1] = dev
++ end
++ end
++
++ return self.ifaces
++end
++
++function proto.uptime(self)
++ local net
++ local upt = 0
++ for net in luci.util.imatch(self:_get("network")) do
++ net = netmod:get_network(net)
++ if net then
++ upt = math.max(upt, net:uptime())
++ end
++ end
++ return upt
++end
++
++
++function device.__init__(self, ifname, network)
++ self.ifname = ifname
++ self.network = network
++end
++
++function device.type(self)
++ return "tunnel"
++end
++
++function device.is_up(self)
++ if self.network then
++ local _, dev
++ for _, dev in ipairs(self.network:get_interfaces()) do
++ if not dev:is_up() then
++ return false
++ end
++ end
++ return true
++ end
++ return false
++end
++
++function device._stat(self, what)
++ local v = 0
++ if self.network then
++ local _, dev
++ for _, dev in ipairs(self.network:get_interfaces()) do
++ v = v + dev[what](dev)
++ end
++ end
++ return v
++end
++
++function device.rx_bytes(self) return self:_stat("rx_bytes") end
++function device.tx_bytes(self) return self:_stat("tx_bytes") end
++function device.rx_packets(self) return self:_stat("rx_packets") end
++function device.tx_packets(self) return self:_stat("tx_packets") end
++
++function device.mac(self)
++ if self.network then
++ local _, dev
++ for _, dev in ipairs(self.network:get_interfaces()) do
++ return dev:mac()
++ end
++ end
++end
++
++function device.ipaddrs(self)
++ local addrs = { }
++ if self.network then
++ addrs[1] = luci.ip.IPv4(self.network:_get("ipaddr"))
++ end
++ return addrs
++end
++
++function device.ip6addrs(self)
++ return { }
++end
++
++function device.shortname(self)
++ return "%s %q" % { luci.i18n.translate("Relay"), self.ifname }
++end
++
++function device.get_type_i18n(self)
++ return luci.i18n.translate("Relay Bridge")
++end
+diff --git a/feeds/luci/themes/luci-theme-bootstrap/Makefile b/feeds/luci/themes/luci-theme-bootstrap/Makefile
+new file mode 100644
+index 0000000..c4e684e
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-bootstrap/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Bootstrap Theme (default)
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css
+new file mode 100644
+index 0000000..b19a6a0
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css
+@@ -0,0 +1,1950 @@
++/*!
++ * LuCI Bootstrap Theme
++ * Copyright 2012 Nut & Bolt
++ * By David Menting <david@nut-bolt.nl>
++ * Based on Bootstrap v1.4.0
++ *
++ * Copyright 2011 Twitter, Inc
++ * Licensed under the Apache License v2.0
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Designed and built with all the love in the world @twitter by @mdo and @fat.
++ */
++/* Reset.less
++ * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc).
++ * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */
++html {
++ margin: 0;
++ padding: 0;
++}
++
++body {
++ margin: 0;
++ padding: 5px;
++}
++
++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 {
++ margin: 0;
++ padding: 0;
++ border: 0;
++ font-weight: normal;
++ font-style: normal;
++ font-size: 100%;
++ line-height: 1;
++ font-family: inherit;
++}
++
++abbr[title], acronym[title] {
++ border-bottom: 1px dotted;
++ cursor: help;
++}
++
++table {
++ border-collapse: collapse;
++ border-spacing: 0;
++}
++
++ol, ul {
++ list-style: none;
++}
++
++q:before,
++q:after,
++blockquote:before,
++blockquote:after {
++ content: "";
++}
++
++html {
++ overflow-y: scroll;
++ font-size: 100%;
++ -webkit-text-size-adjust: 100%;
++ -ms-text-size-adjust: 100%;
++}
++
++a:focus {
++ outline: thin dotted;
++}
++
++a:hover, a:active {
++ outline: 0;
++}
++
++article,
++aside,
++details,
++figcaption,
++figure,
++footer,
++header,
++hgroup,
++nav,
++section {
++ display: block;
++}
++
++sub, sup {
++ font-size: 75%;
++ line-height: 0;
++ position: relative;
++ vertical-align: baseline;
++}
++
++sup {
++ top: -0.5em;
++}
++
++sub {
++ bottom: -0.25em;
++}
++
++img {
++ border: 0;
++ -ms-interpolation-mode: bicubic;
++}
++
++button,
++input,
++select,
++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;
++}
++
++button, input {
++ line-height: normal;
++ *overflow: visible;
++}
++
++button::-moz-focus-inner, input::-moz-focus-inner {
++ border: 0;
++ padding: 0;
++}
++
++button,
++input[type="button"],
++input[type="reset"],
++input[type="submit"] {
++ cursor: pointer;
++ -webkit-appearance: button;
++}
++
++input[type="search"] {
++ -webkit-appearance: textfield;
++ -webkit-box-sizing: content-box;
++ -moz-box-sizing: content-box;
++ box-sizing: content-box;
++}
++
++input[type="search"]::-webkit-search-decoration {
++ -webkit-appearance: none;
++}
++
++textarea {
++ overflow: auto;
++ vertical-align: top;
++}
++
++/*
++ * Scaffolding
++ * Basic and global styles for generating a grid system, structural layout, and page templates
++ * ------------------------------------------------------------------------------------------- */
++body {
++ background-color: #ffffff;
++ margin: 0;
++ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
++ font-size: 13px;
++ font-weight: normal;
++ line-height: 18px;
++ color: #404040;
++ padding-top: 58px;
++}
++
++.container {
++ width: 100%;
++ max-width: 940px;
++ margin-left: auto;
++ margin-right: auto;
++ zoom: 1;
++}
++
++.container:before, .container:after {
++ display: table;
++ content: "";
++ zoom: 1;
++}
++
++.container:after {
++ clear: both;
++}
++
++a {
++ color: #0069d6;
++ text-decoration: none;
++ line-height: inherit;
++ font-weight: inherit;
++}
++
++a:hover {
++ color: #00438a;
++ text-decoration: underline;
++}
++
++.pull-right {
++ float: right;
++}
++
++.pull-left {
++ float: left;
++}
++
++/* Typography.less
++ * Headings, body text, lists, code, and more for a versatile and durable typography system
++ * ---------------------------------------------------------------------------------------- */
++p,
++.cbi-map-descr,
++.cbi-section-descr {
++ font-size: 13px;
++ font-weight: normal;
++ line-height: 18px;
++ margin-bottom: 9px;
++}
++
++p small {
++ font-size: 11px;
++ color: #bfbfbf;
++}
++
++h1,
++h2,
++h3,
++h4,
++h5,
++h6 {
++ font-weight: bold;
++ color: #404040;
++}
++
++h1 small,
++h2 small,
++h3 small,
++h4 small,
++h5 small,
++h6 small {
++ color: #bfbfbf;
++}
++
++h1 {
++ margin-bottom: 18px;
++ font-size: 30px;
++ line-height: 36px;
++}
++
++h1 small {
++ font-size: 18px;
++}
++
++h2 {
++ font-size: 24px;
++ line-height: 36px;
++}
++
++h2 small {
++ font-size: 14px;
++}
++
++h3,
++h4,
++h5,
++h6 {
++ line-height: 36px;
++}
++
++h3 {
++ font-size: 18px;
++}
++
++h3 small {
++ font-size: 14px;
++}
++
++h4 {
++ font-size: 16px;
++}
++
++h4 small {
++ font-size: 12px;
++}
++
++h5 {
++ font-size: 14px;
++}
++
++h6 {
++ font-size: 13px;
++ color: #bfbfbf;
++ text-transform: uppercase;
++}
++
++ul, ol {
++ margin: 0 0 18px 25px;
++}
++
++ul ul,
++ul ol,
++ol ol,
++ol ul {
++ margin-bottom: 0;
++}
++
++ul {
++ list-style: disc;
++}
++
++ol {
++ list-style: decimal;
++}
++
++li {
++ line-height: 18px;
++ color: #808080;
++}
++
++ul.unstyled {
++ list-style: none;
++ margin-left: 0;
++}
++
++dl {
++ margin-bottom: 18px;
++}
++
++dl dt, dl dd {
++ line-height: 18px;
++}
++
++dl dt {
++ font-weight: bold;
++}
++
++dl dd {
++ margin-left: 9px;
++}
++
++hr {
++ margin: 20px 0 19px;
++ border: 0;
++ border-bottom: 1px solid #eee;
++}
++
++strong {
++ font-style: inherit;
++ font-weight: bold;
++}
++
++em {
++ font-style: italic;
++ font-weight: inherit;
++ line-height: inherit;
++}
++
++small { font-size: 0.9em }
++
++address {
++ display: block;
++ line-height: 18px;
++ margin-bottom: 18px;
++}
++
++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;
++}
++
++code {
++ background-color: #fee9cc;
++ color: rgba(0, 0, 0, 0.75);
++ padding: 1px 3px;
++}
++
++pre {
++ background-color: #f5f5f5;
++ display: block;
++ padding: 8.5px;
++ margin: 0 0 18px;
++ line-height: 18px;
++ 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;
++ word-wrap: break-word;
++}
++
++/* Forms.less
++ * Base styles for various input types, form layouts, and states
++ * ------------------------------------------------------------- */
++form {
++ margin-bottom: 18px;
++}
++
++fieldset {
++ margin-bottom: 9px;
++ padding-top: 9px;
++}
++
++fieldset legend {
++ display: block;
++ font-size: 19.5px;
++ line-height: 1;
++ color: #404040;
++ padding-top: 20px;
++ *padding: 0 0 5px 0px;
++ /* IE6-7 */
++
++ *line-height: 1.5;
++ /* IE6-7 */
++
++}
++form .cbi-tab-descr {
++ line-height: 18px;
++ margin-bottom: 18px;
++}
++
++form .clearfix,
++form .cbi-value {
++ margin-bottom: 18px;
++ zoom: 1;
++ overflow: hidden;
++}
++
++form .clearfix:before, form .clearfix:after,
++form .cbi-value:before, form .cbi-value:after {
++ display: table;
++ content: "";
++ zoom: 1;
++}
++
++form .clearfix:after
++form .cbi-value:after {
++ clear: both;
++}
++
++label,
++input,
++select,
++textarea {
++ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
++ font-size: 13px;
++ font-weight: normal;
++ line-height: normal;
++}
++
++form .input,
++form .cbi-value-field {
++ margin-left: 200px;
++}
++
++form .cbi-value label.cbi-value-title {
++ padding-top: 6px;
++ font-size: 13px;
++ line-height: 18px;
++ float: left;
++ width: 180px;
++ text-align: right;
++ color: #404040;
++}
++
++input[type=checkbox], input[type=radio] {
++ cursor: pointer;
++}
++
++input,
++textarea,
++select,
++.uneditable-input {
++ display: inline-block;
++ width: 210px;
++ height: 30px;
++ padding: 4px;
++ font-size: 13px;
++ line-height: 18px;
++ color: #808080;
++ border: 1px solid #ccc;
++ -webkit-border-radius: 3px;
++ -moz-border-radius: 3px;
++ border-radius: 3px;
++}
++
++select {
++ padding: initial;
++}
++
++input[type=checkbox], input[type=radio] {
++ width: auto;
++ height: auto;
++ padding: 0;
++ margin: 3px 0;
++ *margin-top: 0;
++ /* IE6-7 */
++
++ line-height: normal;
++ border: none;
++}
++
++input[type=file] {
++ background-color: #ffffff;
++ padding: initial;
++ border: initial;
++ line-height: initial;
++ -webkit-box-shadow: none;
++ -moz-box-shadow: none;
++ box-shadow: none;
++ width: auto !important;
++}
++
++input[type=button], input[type=reset], input[type=submit] {
++ width: auto;
++ height: auto;
++}
++
++select, input[type=file] {
++ *height: auto;
++ *margin-top: 4px;
++ /* For IE7, add top margin to align select with labels */
++}
++
++select[multiple] {
++ height: inherit;
++ background-color: #ffffff;
++}
++
++textarea {
++ height: auto;
++}
++
++.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;
++}
++
++::-moz-placeholder {
++ color: #bfbfbf;
++}
++
++::-webkit-input-placeholder {
++ color: #bfbfbf;
++}
++
++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;
++}
++
++form .clearfix.error > label, form .clearfix.error .help-block, form .clearfix.error .help-inline {
++ color: #b94a48;
++}
++
++form .clearfix.error input, form .clearfix.error textarea {
++ color: #b94a48;
++ border-color: #ee5f5b;
++}
++
++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;
++}
++
++form .clearfix.error .input-prepend .add-on, form .clearfix.error .input-append .add-on {
++ color: #b94a48;
++ background-color: #fce6e6;
++ border-color: #b94a48;
++}
++
++form .clearfix.warning > label, form .clearfix.warning .help-block, form .clearfix.warning .help-inline {
++ color: #c09853;
++}
++
++form .clearfix.warning input, form .clearfix.warning textarea {
++ color: #c09853;
++ border-color: #ccae64;
++}
++
++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;
++}
++
++form .clearfix.warning .input-prepend .add-on, form .clearfix.warning .input-append .add-on {
++ color: #c09853;
++ background-color: #d2b877;
++ border-color: #c09853;
++}
++
++form .clearfix.success > label, form .clearfix.success .help-block, form .clearfix.success .help-inline {
++ color: #468847;
++}
++
++form .clearfix.success input, form .clearfix.success textarea {
++ color: #468847;
++ border-color: #57a957;
++}
++
++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;
++}
++
++form .clearfix.success .input-prepend .add-on, form .clearfix.success .input-append .add-on {
++ color: #468847;
++ background-color: #bcddbc;
++ border-color: #468847;
++}
++
++input[disabled],
++select[disabled],
++textarea[disabled],
++input[readonly],
++select[readonly],
++textarea[readonly] {
++ background-color: #f5f5f5;
++ border-color: #ddd;
++}
++
++.actions,
++.cbi-page-actions {
++ background: #f5f5f5;
++ margin-bottom: 18px;
++ padding: 17px 20px 18px 150px;
++ 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;
++}
++
++.actions .secondary-action,
++.cbi-page-actions .secondary-action{
++ float: right;
++}
++
++.actions .secondary-action a,
++.cbi-page-actions .secondary-action a {
++ line-height: 30px;
++}
++
++.actions .secondary-action a:hover,
++.cbi-page-actions .secondary-action a:hover {
++ text-decoration: underline;
++}
++
++.help-inline, .help-block {
++ font-size: 13px;
++ line-height: 18px;
++ color: #bfbfbf;
++}
++
++.help-inline {
++ padding-left: 5px;
++ *position: relative;
++ /* IE6-7 */
++
++ *top: -5px;
++ /* IE6-7 */
++
++}
++
++.help-block {
++ display: block;
++ max-width: 600px;
++}
++
++/*
++ * Tables.less
++ * Tables for, you guessed it, tabular data
++ * ---------------------------------------- */
++table {
++ width: 100%;
++ margin-bottom: 18px;
++ padding: 0;
++ font-size: 13px;
++ border-collapse: collapse;
++}
++
++table th, table td {
++ padding: 10px 10px 9px;
++ line-height: 18px;
++ text-align: left;
++}
++
++table th {
++ padding-top: 9px;
++ font-weight: bold;
++ vertical-align: middle;
++}
++
++table td {
++ vertical-align: top;
++ border-top: 1px solid #ddd;
++}
++
++table tbody th {
++ border-top: 1px solid #ddd;
++ vertical-align: top;
++}
++
++/* Patterns.less
++ * Repeatable UI elements outside the base styles provided from the scaffolding
++ * ---------------------------------------------------------------------------- */
++header {
++ height: 40px;
++ position: fixed;
++ top: 0;
++ left: 0;
++ right: 0;
++ z-index: 10000;
++ overflow: visible;
++ color: #BFBFBF;
++}
++
++header a {
++ color: #bfbfbf;
++ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
++}
++
++header h3 a:hover, header .brand:hover, header ul .active > a {
++ background-color: #333;
++ background-color: rgba(255, 255, 255, 0.05);
++ color: #ffffff;
++ text-decoration: none;
++}
++
++header h3 {
++ position: relative;
++}
++
++header h3 a, header .brand {
++ float: left;
++ display: block;
++ padding: 8px 20px 12px;
++ margin-left: -20px;
++ color: #ffffff;
++ font-size: 20px;
++ font-weight: 200;
++ line-height: 1;
++}
++
++header p {
++ margin: 0;
++ line-height: 40px;
++}
++
++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(top, #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;
++}
++
++header div > ul, .nav {
++ display: block;
++ float: left;
++ margin: 0 10px 0 0;
++ position: relative;
++ left: 0;
++}
++
++header div > ul > li, .nav > li {
++ display: block;
++ float: left;
++}
++
++header div > ul a, .nav a {
++ display: block;
++ float: none;
++ padding: 10px 10px 11px;
++ line-height: 19px;
++ text-decoration: none;
++}
++
++header div > ul a:hover, .nav a:hover {
++ color: #ffffff;
++ text-decoration: none;
++}
++
++header div > ul .active > a, .nav .active > a {
++ background-color: #222;
++ background-color: rgba(0, 0, 0, 0.5);
++}
++
++header div > ul.secondary-nav, .nav.secondary-nav {
++ float: right;
++ margin-left: 10px;
++ margin-right: 0;
++}
++
++header div > ul.secondary-nav .menu-dropdown,
++.nav.secondary-nav .menu-dropdown,
++header div > ul.secondary-nav .dropdown-menu,
++.nav.secondary-nav .dropdown-menu {
++ right: 0;
++ border: 0;
++}
++
++header div > ul a.menu:hover,
++.nav a.menu:hover,
++header div > ul li.open .menu,
++.nav li.open .menu,
++header div > ul .dropdown-toggle:hover,
++.nav .dropdown-toggle:hover,
++header div > ul .dropdown.open .dropdown-toggle,
++.nav .dropdown.open .dropdown-toggle {
++ background: #444;
++ background: rgba(255, 255, 255, 0.05);
++}
++
++header div > ul .menu-dropdown,
++.nav .menu-dropdown,
++header div > ul .dropdown-menu,
++.nav .dropdown-menu {
++ background-color: #333;
++}
++
++header div > ul .menu-dropdown a.menu,
++.nav .menu-dropdown a.menu,
++header div > ul .dropdown-menu a.menu,
++.nav .dropdown-menu a.menu,
++header div > ul .menu-dropdown .dropdown-toggle,
++.nav .menu-dropdown .dropdown-toggle,
++header div > ul .dropdown-menu .dropdown-toggle,
++.nav .dropdown-menu .dropdown-toggle {
++ color: #ffffff;
++}
++
++header div > ul .menu-dropdown a.menu.open,
++.nav .menu-dropdown a.menu.open,
++header div > ul .dropdown-menu a.menu.open,
++.nav .dropdown-menu a.menu.open,
++header div > ul .menu-dropdown .dropdown-toggle.open,
++.nav .menu-dropdown .dropdown-toggle.open,
++header div > ul .dropdown-menu .dropdown-toggle.open,
++.nav .dropdown-menu .dropdown-toggle.open {
++ background: #444;
++ background: rgba(255, 255, 255, 0.05);
++}
++
++header div > ul .menu-dropdown li a,
++.nav .menu-dropdown li a,
++header div > ul .dropdown-menu li a,
++.nav .dropdown-menu li a {
++ color: #999;
++ text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
++}
++
++header div > ul .menu-dropdown li a:hover,
++.nav .menu-dropdown li a:hover,
++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(top, #292929, #191919);
++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);
++ color: #ffffff;
++}
++
++header div > ul .menu-dropdown .active a,
++.nav .menu-dropdown .active a,
++header div > ul .dropdown-menu .active a,
++.nav .dropdown-menu .active a {
++ color: #ffffff;
++}
++
++header div > ul .menu-dropdown .divider,
++.nav .menu-dropdown .divider,
++header div > ul .dropdown-menu .divider,
++.nav .dropdown-menu .divider {
++ background-color: #222;
++ border-color: #444;
++}
++
++header ul .menu-dropdown li a, header ul .dropdown-menu li a {
++ padding: 4px 15px;
++}
++
++li.menu, .dropdown {
++ position: relative;
++}
++
++a.menu:after, .dropdown-toggle:after {
++ width: 0;
++ height: 0;
++ display: inline-block;
++ content: "&darr;";
++ text-indent: -99999px;
++ vertical-align: top;
++ margin-top: 8px;
++ margin-left: 4px;
++ 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;
++}
++
++.menu-dropdown, .dropdown-menu {
++ background-color: #ffffff;
++ float: left;
++ position: absolute;
++ top: 40px;
++ left: -9999px;
++ z-index: 900;
++ min-width: 160px;
++ max-width: 220px;
++ _width: 160px;
++ margin-left: 0;
++ margin-right: 0;
++ padding: 6px 0;
++ zoom: 1;
++ border-color: #999;
++ 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;
++}
++
++.menu-dropdown li, .dropdown-menu li {
++ float: none;
++ display: block;
++ background-color: none;
++}
++
++.menu-dropdown .divider, .dropdown-menu .divider {
++ height: 1px;
++ margin: 5px 0;
++ overflow: hidden;
++ background-color: #eee;
++ border-bottom: 1px solid #ffffff;
++}
++
++header .dropdown-menu a, .dropdown-menu a {
++ display: block;
++ padding: 4px 15px;
++ clear: both;
++ font-weight: normal;
++ line-height: 18px;
++ color: #808080;
++ text-shadow: 0 1px 0 #ffffff;
++}
++
++header .dropdown-menu a:hover,
++.dropdown-menu a:hover,
++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(top, #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);
++}
++
++.open .menu,
++.dropdown.open .menu,
++.open .dropdown-toggle,
++.dropdown.open .dropdown-toggle {
++ color: #ffffff;
++ background: #ccc;
++ background: rgba(0, 0, 0, 0.3);
++}
++
++.open .menu-dropdown,
++.dropdown.open .menu-dropdown,
++.open .dropdown-menu,
++.dropdown.open .dropdown-menu {
++ left: 0;
++}
++
++.dropdown:hover ul.dropdown-menu {
++ left: 0;
++}
++
++.dropdown-menu .dropdown-menu {
++ position: absolute;
++ left: 159px;
++}
++
++.dropdown-menu li {
++ position: relative;
++}
++
++.tabs, .cbi-tabmenu {
++ margin: 0 0 18px;
++ padding: 0;
++ list-style: none;
++ zoom: 1;
++}
++
++.tabs:before,
++.cbi-tabmenu:before,
++.tabs:after,
++.cbi-tabmenu:after {
++ display: table;
++ content: "";
++ zoom: 1;
++}
++
++.tabs:after, .cbi-tabmenu:after {
++ clear: both;
++}
++
++.tabs > li, .cbi-tabmenu > li {
++ float: left;
++}
++
++.tabs > li > a, .cbi-tabmenu > li > a {
++ display: block;
++}
++
++.tabs,
++.cbi-tabmenu {
++ border-color: #ddd;
++ border-style: solid;
++ border-width: 0 0 1px;
++}
++
++.tabs > li,
++.cbi-tabmenu > li {
++ position: relative;
++ margin-bottom: -1px;
++}
++
++.tabs > li > a,
++.cbi-tabmenu > li > a {
++ padding: 0 15px;
++ 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;
++}
++
++.tabs > li > a:hover,
++.cbi-tabmenu > li > a:hover {
++ text-decoration: none;
++ background-color: #eee;
++ border-color: #eee #eee #ddd;
++}
++
++.tabs .active > a, .tabs .active > a:hover,
++.cbi-tabmenu .active > a, .cbi-tabmenu .active > a:hover,
++.cbi-tab > a:link, .cbi-tab > a:hover {
++ color: #808080;
++ background-color: #ffffff;
++ border: 1px solid #ddd;
++ border-bottom-color: transparent;
++ cursor: default;
++}
++
++.tabs .menu-dropdown, .tabs .dropdown-menu,
++.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;
++}
++
++.tabs a.menu:after, .tabs .dropdown-toggle:after,
++.cbi-tabmenu a.menu:after, .cbi-tabmenu .dropdown-toggle:after {
++ border-top-color: #999;
++ margin-top: 15px;
++ margin-left: 5px;
++}
++
++.tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle,
++.cbi-tabmenu li.open.menu .menu, .cbi-tabmenu .open.dropdown .dropdown-toggle {
++ border-color: #999;
++}
++
++.tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after,
++.cbi-tabmenu li.open a.menu:after, .cbi-tabmenu .dropdown.open .dropdown-toggle:after {
++ border-top-color: #555;
++}
++
++.tab-content > .tab-pane,
++.tab-content > div {
++ display: none;
++}
++
++.tab-content > .active {
++ display: block;
++}
++
++.breadcrumb {
++ padding: 7px 14px;
++ 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(top, #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;
++}
++
++.breadcrumb li {
++ display: inline;
++ text-shadow: 0 1px 0 #ffffff;
++}
++
++.breadcrumb .divider {
++ padding: 0 5px;
++ color: #bfbfbf;
++}
++
++.breadcrumb .active a {
++ color: #404040;
++}
++
++footer {
++ margin-top: 17px;
++ padding-top: 17px;
++ border-top: 1px solid #eee;
++}
++
++.btn.danger,
++.alert-message.danger,
++.btn.danger:hover,
++.alert-message.danger:hover,
++.btn.error,
++.alert-message.error,
++.btn.error:hover,
++.alert-message.error:hover,
++.btn.success,
++.alert-message.success,
++.btn.success:hover,
++.alert-message.success:hover,
++.btn.info,
++.alert-message.info,
++.btn.info:hover,
++.alert-message.info:hover {
++ color: #ffffff;
++}
++
++.btn .close, .alert-message .close {
++ font-family: Arial, sans-serif;
++ line-height: 18px;
++}
++
++.btn.danger,
++.alert-message.danger,
++.btn.error,
++.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(top, #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);
++}
++
++.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(top, #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);
++}
++
++.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(top, #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);
++}
++
++.btn,
++.cbi-button {
++ cursor: pointer;
++ 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;
++ font-size: 13px;
++ 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);
++}
++
++.btn:hover,
++.cbi-button:hover {
++ color: #333;
++ text-decoration: none;
++}
++
++.btn:focus,
++.cbi-button:focus {
++ 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(top, #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-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-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-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-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);
++}
++
++.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-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);
++}
++
++.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;
++}
++
++.btn.large {
++ font-size: 15px;
++ line-height: normal;
++ padding: 9px 14px 9px;
++ -webkit-border-radius: 6px;
++ -moz-border-radius: 6px;
++ border-radius: 6px;
++}
++
++.btn.small {
++ padding: 7px 9px 7px;
++ 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;
++}
++
++.close {
++ float: right;
++ color: #000000;
++ font-size: 20px;
++ 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 {
++ 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(top, #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);
++}
++
++.alert-message .close {
++ margin-top: 1px;
++ *margin-top: 0;
++}
++
++.alert-message a {
++ font-weight: bold;
++ color: #404040;
++}
++
++.alert-message.danger p a,
++.alert-message.error p a,
++.alert-message.success p a,
++.alert-message.info p a {
++ color: #ffffff;
++}
++
++.alert-message h5 {
++ line-height: 18px;
++}
++
++.alert-message p {
++ margin-bottom: 0;
++}
++
++.alert-message div {
++ margin-top: 5px;
++ margin-bottom: 2px;
++ line-height: 28px;
++}
++
++.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);
++}
++
++.label {
++ padding: 1px 3px 2px;
++ font-size: 9.75px;
++ font-weight: bold;
++ color: #ffffff !important;
++ text-transform: uppercase;
++ white-space: nowrap;
++ background-color: #bfbfbf;
++ -webkit-border-radius: 3px;
++ -moz-border-radius: 3px;
++ border-radius: 3px;
++ text-shadow: none;
++}
++
++a.label:link,
++a.label:visited {
++ color: #ffffff;
++}
++
++a.label:hover {
++ text-decoration: none;
++}
++
++.label.important {
++ background-color: #c43c35;
++}
++
++.label.warning {
++ background-color: #f89406;
++}
++
++.label.success {
++ background-color: #46a546;
++}
++
++.label.notice {
++ background-color: #62cffc;
++}
++
++/* LuCI specific items */
++.hidden { display: none }
++
++#memtotal > div,
++#memfree > div,
++#memcache > div,
++#membuff > div,
++#conns > div {
++ border: 1px solid #CCCCCC;
++ border-radius: 3px 3px 3px 3px;
++ color: #808080;
++ display: inline-block;
++ font-size: 13px;
++ height: 22 dpx;
++ line-height: 18px;
++}
++
++#xhr_poll_status {
++ cursor: pointer;
++}
++
++form.inline { display: inline }
++
++header .pull-right { padding-top: 8px; }
++
++#modemenu li:last-child span.divider { display: none }
++
++#syslog { width: 100%; }
++
++.cbi-section-table tbody tr:nth-child(odd) td, .cbi-section-table tbody tr:nth-child(odd) th {
++ background-color: #f9f9f9;
++}
++
++.cbi-section-table tbody tr:hover td, .cbi-section-table tbody tr:hover th {
++ background-color: #f5f5f5;
++}
++
++.cbi-section-table tr.cbi-section-table-descr th {
++ font-weight: normal;
++}
++
++.left { text-align: left !important; }
++
++.right { text-align: right !important; }
++
++.cbi-value-field { line-height: 1.5em; }
++
++.cbi-value-field input[type=checkbox],
++.cbi-value-field input[type=radio] {
++ margin-top: 8px;
++ margin-right: 6px;
++}
++
++table table td,
++.cbi-value-field table td {
++ border: none;
++}
++
++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 {
++ white-space: nowrap;
++ text-align: right;
++}
++
++table.cbi-section-table td.cbi-section-table-cell select {
++ width: inherit;
++}
++
++.cbi-value-description { display: inline; }
++
++.cbi-value-description img { vertical-align: middle; }
++
++.cbi-section-error {
++ border: 1px solid #FF0000;
++ border-radius: 3px;
++ background-color: #FCE6E6;
++ padding: 5px;
++}
++
++.cbi-section-error ul { margin: 0 0 0 20px; }
++
++.cbi-section-error ul li {
++ color: #FF0000;
++ font-weight: bold;
++}
++
++.ifacebox {
++ background-color: #FFFFFF;
++ border: 1px solid #CCCCCC;
++ 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);
++}
++
++.ifacebox .ifacebox-head {
++ border-bottom: 1px solid #CCCCCC;
++ padding: 2px;
++}
++
++.ifacebox .ifacebox-body {
++ padding: 6px;
++}
++
++.ifacebadge {
++ display: inline-block;
++ 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);
++}
++
++.ifacebadge-active {
++ border-color: #000000;
++ font-weight: bold;
++}
++
++.zonebadge {
++ padding: 2px;
++ border-radius: 4px;
++ display: inline-block;
++ white-space: nowrap;
++ color: #666666;
++ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
++ cursor: pointer;
++}
++
++.zonebadge > em,
++.zonebadge > strong {
++ margin: 5px;
++ display: inline-block;
++}
++
++.zonebadge input {
++ width: 6em;
++}
++
++.zonebadge-empty {
++ border: 1px dashed #AAAAAA;
++ color: #AAAAAA;
++ font-style: italic;
++ font-size: smaller;
++}
++
++div.cbi-value var,
++td.cbi-value-field var {
++ font-style: italic;
++ color: #0069D6;
++}
++
++.uci-change-list {
++ font-family: monospace;
++}
++
++.uci-change-list ins,
++.uci-change-legend-label ins {
++ text-decoration: none;
++ border: 1px solid #00FF00;
++ background-color: #CCFFCC;
++ display: block;
++ padding: 2px;
++}
++
++.uci-change-list del,
++.uci-change-legend-label del {
++ text-decoration: none;
++ border: 1px solid #FF0000;
++ background-color: #FFCCCC;
++ display: block;
++ font-style: normal;
++ padding: 2px;
++}
++
++.uci-change-list var,
++.uci-change-legend-label var {
++ text-decoration: none;
++ border: 1px solid #CCCCCC;
++ background-color: #EEEEEE;
++ display: block;
++ font-style: normal;
++ padding: 2px;
++}
++
++.uci-change-list var ins,
++.uci-change-list var del {
++ /*display: inline;*/
++ border: none;
++ white-space: pre;
++ font-style: normal;
++ padding: 0px;
++}
++
++.uci-change-legend {
++ padding: 5px;
++}
++
++.uci-change-legend-label {
++ width: 150px;
++ float: left;
++}
++
++.uci-change-legend-label > ins,
++.uci-change-legend-label > del,
++.uci-change-legend-label > var {
++ float: left;
++ margin-right: 4px;
++ width: 10px;
++ height: 10px;
++ display: block;
++}
++
++.uci-change-legend-label var ins,
++.uci-change-legend-label var del {
++ line-height: 6px;
++ border: none;
++}
+diff --git a/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.ico b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.ico
+new file mode 100644
+index 0000000000000000000000000000000000000000..77a138ba0c53da3f891857646887710d4b472fdd
+GIT binary patch
+literal 1150
+zcmZQzU<5(|0R}M0U}0bo1F|%L7$l?s#Ef7P$N<U_1L9+2I99J%{vR0w#UhB&i>wD5
+zyD&e$2Aer)Damoz)Z-BQhHeH9btry7R<n4){BD>T$l_@13qXDgni$+neEMN>FdArv
+z0lGQBFs%lPtwI-v>Tv?n|DhPfW<Xbmiw{x@1TeiY8l>M1mmXwsh<2>{OOVxp*g!w@
+zqKiTG6Xkx8S{(YJ#vmwkbwIoQ(e*=B!~Bd+gY5bTGY4TZ#0^ONRX{enUXU0V0QLV(
+zPE1sV@sVhl9&mgiiG!HP;ejTF!iAZEi$+n5hl8yD3NCej>=_t7@G~$xU}j)Az{tSR
+l0L0A?85r0SfW?IY1cTV^K(P)%28J8b3=GeoL-c_30szk#m9qc<
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js
+new file mode 100644
+index 0000000..1ec510f
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js
+@@ -0,0 +1,3 @@
++// 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
+diff --git a/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/mobile.css b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/mobile.css
+new file mode 100644
+index 0000000..b74f209
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/mobile.css
+@@ -0,0 +1,21 @@
++header h3 a, header .brand {
++ display:none !important;
++}
++
++@media screen and (max-device-width: 600px) {
++ #maincontent.container {
++ margin-top: 30px;
++ }
++}
++
++@media screen and (max-device-width: 360px) {
++ #maincontent.container {
++ margin-top: 60px;
++ }
++}
++
++@media screen and (max-device-width: 200px) {
++ #maincontent.container {
++ margin-top: 230px;
++ }
++}
+\ No newline at end of file
+diff --git a/feeds/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/footer.htm b/feeds/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/footer.htm
+new file mode 100644
+index 0000000..52188bf
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/footer.htm
+@@ -0,0 +1,30 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2012 David Menting <david@nut-bolt.nl>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++ local ver = require "luci.version"
++ local disp = require "luci.dispatcher"
++ local request = disp.context.path
++ local category = request[1]
++ local tree = disp.node()
++ local categories = disp.node_childs(tree)
++%>
++ <footer>
++ <a href="http://luci.subsignal.org/">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a> / <%= ver.distversion %>
++ <% if #categories > 1 then %>
++ <ul class="breadcrumb pull-right" id="modemenu">
++ <% for i, r in ipairs(categories) do %>
++ <li<% if request[1] == r then %> class="active"<%end%>><a href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a> <span class="divider">|</span></li>
++ <% end %>
++ </ul>
++ <% end %>
++ </footer>
++ </div>
++ </div>
++ </body>
++</html>
++
+diff --git a/feeds/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm b/feeds/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm
+new file mode 100644
+index 0000000..3b40ad4
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm
+@@ -0,0 +1,204 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2012 David Menting <david@nut-bolt.nl>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++ local sys = require "luci.sys"
++ local util = require "luci.util"
++ local http = require "luci.http"
++ local disp = require "luci.dispatcher"
++
++ local boardinfo = util.ubus("system", "board")
++
++ local request = disp.context.path
++ local request2 = disp.context.request
++
++ local category = request[1]
++ local cattree = category and disp.node(category)
++
++ local leaf = request2[#request2]
++
++ local tree = disp.node()
++ local node = disp.context.dispatched
++
++ local categories = disp.node_childs(tree)
++
++ local c = tree
++ local i, r
++
++ -- tag all nodes leading to this page
++ for i, r in ipairs(request) do
++ if c.nodes and c.nodes[r] then
++ c = c.nodes[r]
++ c._menu_selected = true
++ end
++ end
++
++ -- send as HTML5
++ http.prepare_content("text/html")
++
++ local function nodeurl(prefix, name, query)
++ local url = controller .. prefix .. name .. "/"
++ if query then
++ url = url .. http.build_querystring(query)
++ end
++ return pcdata(url)
++ end
++
++ local function subtree(prefix, node, level)
++ if not level then
++ level = 1
++ end
++
++ local childs = disp.node_childs(node)
++ if #childs > 0 then
++
++ if level > 2 then
++%>
++ <ul class="tabs">
++ <%
++ end
++
++ local selected_node
++ local selected_name
++ local i, v
++
++ for i, v in ipairs(childs) do
++ local nnode = node.nodes[v]
++ if nnode._menu_selected then
++ selected_node = nnode
++ selected_name = v
++ end
++ if level > 2 then
++ %>
++ <li class="tabmenu-item-<%=v%><%- if nnode._menu_selected or (node.leaf and v == leaf) then %> active<% end %>">
++ <a href="<%=nodeurl(prefix, v, nnode.query)%>"><%=striptags(translate(nnode.title))%></a>
++ </li>
++ <% end
++ end
++
++ if level > 2 then
++ %>
++ </ul>
++<% end
++
++ if selected_node then
++ subtree(prefix .. selected_name .. "/", selected_node, level + 1)
++ end
++ end
++ end
++-%>
++<!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>
++ <!--[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" />
++ <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 %>">
++ <header>
++ <div class="fill">
++ <div class="container">
++ <a class="brand" href="#"><%=boardinfo.hostname or "?"%></a>
++ <ul class="nav">
++ <%-
++ local function submenu(prefix, node)
++ local childs = disp.node_childs(node)
++ if #childs > 0 then
++ %>
++ <ul class="dropdown-menu">
++ <%-
++ for i, r in ipairs(childs) do
++ local nnode = node.nodes[r]
++ local href = controller .. prefix .. r ..
++ (nnode.query and http.build_querystring(nnode.query) or "")
++ %>
++ <li><a href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(nnode.title)))%></a></li>
++ <%-
++ end
++ %>
++ </ul>
++ <%-
++ end
++ end
++
++ childs = disp.node_childs(cattree)
++
++ if #childs > 0 then
++ for i, r in ipairs(childs) do
++ local nnode = cattree.nodes[r]
++ local href = controller .. "/" .. category .. "/" .. r ..
++ (nnode.query and http.build_querystring(k.query) or "")
++ local grandchildren = disp.node_childs(nnode)
++
++ if #grandchildren > 0 then
++ %>
++ <li class="dropdown">
++ <a class="menu" href="#"><%=pcdata(striptags(translate(nnode.title)))%></a>
++ <%- submenu("/" .. category .. "/" .. r .. "/", nnode) %>
++ </li>
++ <% else %>
++ <li>
++ <a href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(nnode.title)))%></a>
++ </li>
++ <%
++ end
++ end
++ end
++ %>
++ </ul>
++
++ <%
++ -- calculate the number of unsaved changes
++ if tree.nodes[category] and tree.nodes[category].ucidata then
++ local ucichanges = 0
++
++ for i, j in pairs(require("luci.model.uci").cursor():changes()) do
++ for k, l in pairs(j) do
++ for m, n in pairs(l) do
++ ucichanges = ucichanges + 1;
++ end
++ end
++ end
++ %>
++ <div class="pull-right">
++ <% if ucichanges > 0 then %>
++ <a class="label notice" href="<%=controller%>/<%=category%>/uci/changes?redir=<%=http.urlencode(http.formvalue("redir") or REQUEST_URI)%>"><%:Unsaved Changes%>: <%=ucichanges%></a>
++ <% end %>
++ <span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
++ <span class="label success" id="xhr_poll_status_on"><%:Auto Refresh%> <%:on%></span>
++ <span class="label" id="xhr_poll_status_off" style="display:none"><%:Auto Refresh%> <%:off%></span>
++ </span>
++ </div>
++ <% end %>
++ </div>
++ </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 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>
++</div>
++<%- end -%>
++
++<div id="maincontent" class="container">
++<% if category then subtree("/" .. category .. "/", cattree) end %>
+diff --git a/feeds/luci/themes/luci-theme-bootstrap/root/etc/uci-defaults/luci-theme-bootstrap b/feeds/luci/themes/luci-theme-bootstrap/root/etc/uci-defaults/luci-theme-bootstrap
+new file mode 100755
+index 0000000..09299e0
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-bootstrap/root/etc/uci-defaults/luci-theme-bootstrap
+@@ -0,0 +1,7 @@
++#!/bin/sh
++uci batch <<-EOF
++ set luci.themes.Bootstrap=/luci-static/bootstrap
++ set luci.main.mediaurlbase=/luci-static/bootstrap
++ commit luci
++EOF
++exit 0
+diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/Makefile b/feeds/luci/themes/luci-theme-freifunk-generic/Makefile
+new file mode 100644
+index 0000000..2fc62fd
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-freifunk-generic/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Freifunk Generic Theme
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpg b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpg
+new file mode 100644
+index 0000000000000000000000000000000000000000..822527ead873a1e8e33f55fb22df23314a8a8ddb
+GIT binary patch
+literal 354
+zcmb7;J8l9o5QhKRhrL)R*uwI{l4y|-#EU@U23SH`B~%m?9DuV>=SV4Xh&-CqT*BC-
+zNko+yY4q!#Zyx^Le?xBD=N3eSr;zYp*nnj@%QMDu#yKm56r$4+`mWcNr5+4QZA|qr
+zt*g=G-k9-XJefT<^JZ8tS4+E^+Q!Bu#5os*=nK)em8tB%!@oim$pMs-LZT>D<lj)n
+zR|&s^k|H#;{OblHxaNiiC6QLQ^e4J0g-fZz8t0d=zyZpI!W<+Bw8QW!kh>^i=j5_0
+RhvV_b31jVEYGkPW#|2ttEi3>4
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css
+new file mode 100644
+index 0000000..ed97427
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css
+@@ -0,0 +1,1072 @@
++@charset "utf-8";
++
++@media all {
++
++html {
++ min-height: 100%;
++ height: auto;
++}
++
++body {
++ color: #ccc;
++ background:#e5eef5 url(bg.jpg) repeat-x top left;
++ font-family: Verdana, Arial, sans-serif;
++ font-size: 100%;
++ line-height: 100%;
++ padding-bottom: 1.5em;
++}
++
++html, body {
++ height: 99%;
++}
++
++* {
++ margin: 0;
++ padding: 0;
++}
++
++abbr,
++acronym {
++ font-style: normal;
++ font-variant: normal;
++}
++
++abbr[title],
++acronym[title] {
++ border-bottom: 1px dotted;
++ cursor: help;
++}
++
++a:link abbr[title],
++a:visited abbr[title],
++a:link acronym[title],
++a:visited acronym[title] {
++ cursor: pointer;
++}
++
++code {
++ font-family: monospace;
++ white-space: pre;
++}
++
++#maincontent ul {
++ margin-left: 2em;
++}
++
++.warning {
++ color: red;
++ background-color: white;
++ font-weight: bold;
++ text-decoration: blink;
++}
++
++.clear {
++ clear: both;
++}
++
++a img {
++ border: 0;
++}
++
++.skiplink,
++.navigation,
++.hidden {
++ position: absolute;
++ left: -1000px;
++ top: -1000px;
++ width: 0px;
++ height: 0px;
++ overflow: hidden;
++ display: inline;
++}
++
++.error {
++ color: #f00;
++ background-color: white;
++}
++
++.errorbox {
++ border: 1px solid #F00;
++ background-color: #FCC;
++ padding: 5px;
++}
++
++
++.ifacebox {
++ background-color: #FFFFFF;
++ border: 1px solid #CCCCCC;
++ margin: 0 10px;
++ text-align: center;
++ white-space: nowrap;
++}
++
++.ifacebox .ifacebox-head {
++ border-bottom: 1px solid #CCCCCC;
++ padding: 2px;
++}
++
++.ifacebox .ifacebox-body {
++ padding: 2px;
++}
++
++
++.ifacebadge {
++ background-color: #FFFFFF;
++ border: 1px solid #CCCCCC;
++ padding: 2px;
++ margin-left: 2px;
++ display: inline-block;
++}
++
++.ifacebadge-active {
++ border-color: #000000;
++ font-weight: bold;
++}
++
++
++.zonebadge {
++ padding: 2px;
++ display: inline-block;
++ white-space: nowrap;
++ cursor: pointer;
++}
++
++.zonebadge em,
++.zonebadge strong {
++ margin: 3px;
++ display: inline-block;
++}
++
++.zonebadge input {
++ width: 6em;
++ height: 1.5em;
++}
++
++.zonebadge-empty {
++ border: 1px dashed #AAAAAA;
++ color: #AAAAAA;
++ font-style: italic;
++ font-size: smaller;
++}
++
++
++#header {
++ height: auto;
++ background: #FFF url(header.jpg) repeat-x left bottom;
++ color: #ccc;
++ font-weight: bold;
++ text-align:right;
++}
++
++.header_left img {
++ padding: 10px 10px 0px 10px;
++ margin-bottom: 10px;
++}
++
++.header_banner {
++ overflow:hidden;
++ padding-bottom: 6px;
++ text-align:left;
++}
++
++.header_banner img{
++ padding: 0px;
++}
++
++.header_left{
++ text-align:left;
++ max-width: 50%;
++ float:left;
++}
++
++.header_left a{
++ color: #dc0067;
++ font: bold 36px Helvetica;
++ text-decoration: none;
++}
++
++#header h1,
++.header_right {
++ max-width: 45%;
++ text-align: right;
++ font-size: 70%;
++ font-weight: normal;
++ line-height: 160%;
++ float:right;
++ padding: 10px 10px 0 0;
++}
++
++ul.dropdowns {
++ float: left;
++ margin: 0;
++ padding: 0;
++ width: auto;
++ list-style: none;
++}
++
++html>body ul.dropdowns {
++ position: relative;
++}
++
++ul.dropdowns li,
++ul.dropdowns ul {
++ margin: 0;
++ padding: 0;
++ list-style: none;
++}
++
++ul.dropdowns li {
++ float: left;
++ position: relative;
++ white-space: nowrap;
++}
++
++ul.dropdowns li ul {
++ position: absolute;
++ z-index: 1000;
++ top: auto;
++ min-width: 10em;
++}
++
++ul.dropdowns li li {
++ float: none;
++ position: relative;
++}
++
++ul.dropdowns li a {
++ display: block;
++}
++
++ul.dropdowns ul li ul {
++ top: 0;
++}
++
++ul.dropdowns li ul,
++ul.dropdowns li.over ul ul,
++ul.dropdowns li.focus ul ul,
++ul.dropdowns li:hover ul ul,
++ul.dropdowns li.over ul ul ul,
++ul.dropdowns li.focus ul ul ul,
++ul.dropdowns li:hover ul ul ul,
++ul.dropdowns li.over ul ul ul ul,
++ul.dropdowns li.focus ul ul ul ul,
++ul.dropdowns li:hover ul ul ul ul {
++ left: -3000px;
++}
++
++ul.dropdowns li.over ul,
++ul.dropdowns li.focus ul,
++ul.dropdowns li:hover ul {
++ left: 0;
++}
++
++ul.dropdowns ul li.over ul,
++ul.dropdowns ul li.focus ul,
++ul.dropdowns ul li:hover ul,
++ul.dropdowns ul ul li.over ul,
++ul.dropdowns ul ul li.focus ul,
++ul.dropdowns ul ul li:hover ul,
++ul.dropdowns ul ul ul li.over ul,
++ul.dropdowns ul ul ul li.focus ul,
++ul.dropdowns ul ul ul li:hover ul {
++ left: 100%;
++}
++
++#xhr_poll_status {
++ cursor: pointer;
++}
++
++#xhr_poll_status #xhr_poll_status_off {
++ font-weight: bold;
++ color: #FF0000;
++}
++
++#xhr_poll_status #xhr_poll_status_on {
++ font-weight: bold;
++ color: #00FF00;
++}
++
++#menubar {
++ position: relative;
++ width: 100%;
++ background: #FFF;
++ color: #004a9c;
++ border-bottom: 1px dotted #5A5A5A;
++}
++#menubar .warning {
++ color: red;
++ background-color: #FFF;
++}
++
++#menubar ul.dropdowns {
++ min-height: 1.8em;
++ background: #FFF;
++ color: #004a9c;
++}
++
++#menubar ul.dropdowns li ul {
++ background: #FFF;
++ color: #004a9c;
++ border-width: 0 1px 1px 1px;
++ border-style: dotted;
++ border-color: #5a5a5a;
++}
++
++#menubar ul.dropdowns ul li ul {
++ border-width: 1px;
++}
++
++html #menubar a:link,
++html #menubar a:visited {
++ position: relative;
++ display: block;
++ padding: 0.5em;
++ background: #FFF;
++ color: #004a9c;
++ text-decoration: none;
++ font-size: 80%;
++ font-weight: normal;
++}
++
++html #menubar a:link:hover,
++html #menubar a:visited:hover,
++html #menubar a:link:active,
++html #menubar a:visited:active,
++#menubar a:link:focus,
++#menubar a:visited:focus {
++ background: #F2F2F2;
++ color: #e60076;
++}
++
++html #menubar a:link.active,
++html #menubar a:visited.active,
++html #menubar a:link.preactive,
++html #menubar a:visited.preactive {
++ background: #FFF;
++ color: #e60076;
++}
++
++html #menubar a:link.warning,
++html #menubar a:visited.warning {
++ background: #FFF;
++ color: red;
++ font-weight: bold;
++ text-decoration: blink;
++}
++
++#menubar ul.dropdowns li.over>a,
++#menubar ul.dropdowns li.focus>a,
++#menubar ul.dropdowns li:hover>a {
++}
++
++.lang_de #submenu_mini_system { min-width: 13.3em; }
++* html .lang_de #submenu_mini_system { width: 13.3em; }
++
++.lang_pt-br #submenu_mini_network { min-width: 14em; }
++* html .lang_pt-br #submenu_mini_network { width: 14em; }
++
++.lang_pt-br #submenu_mini_system { min-width: 11.5em; }
++* html .lang_pt-br #submenu_mini_system { width: 11.5em; }
++
++.lang_ru #submenu_mini_system { min-width: 18em; }
++* html .lang_ru #submenu_mini_system { width: 18em; }
++
++.lang_pt-br #submenu_admin_index { min-width: 11em; }
++* html .lang_pt-br #submenu_admin_index { width: 11em; }
++
++.lang_ru #submenu_admin_index { min-width: 15.5em; }
++* html .lang_ru #submenu_admin_index { width: 15.5em; }
++
++.lang_ru #submenu_admin_status { min-width: 10.5em; }
++* html .lang_ru #submenu_admin_status { width: 10.5em; }
++
++.lang_de #submenu_admin_system { min-width: 13.3em; }
++* html .lang_de #submenu_admin_system { width: 13.3em; }
++
++.lang_fr #submenu_admin_system { min-width: 14.5em; }
++* html .lang_fr #submenu_admin_system { width: 14.5em; }
++
++.lang_pt-br #submenu_admin_system { min-width: 11.5em; }
++* html .lang_pt-br #submenu_admin_system { width: 11.5em; }
++
++.lang_ru #submenu_admin_system { min-width: 18em; }
++* html .lang_ru #submenu_admin_system { width: 18em; }
++
++#submenu_admin_services_chillispot { min-width: 15.5em; }
++* html #submenu_admin_services_chillispot { width: 15.5em; }
++
++#submenu_admin_services_coovachilli { min-width: 15em; }
++* html #submenu_admin_services_coovachilli { width: 15em; }
++
++.lang_ru #submenu_admin_network_routes { min-width: 15.3em; }
++* html .lang_ru #submenu_admin_network_routes { width: 15.3em; }
++
++#submenu_admin_network_firewall { min-width: 14em; }
++* html #submenu_admin_network_firewall { width: 14em; }
++
++.lang_de #submenu_admin_network_firewall { min-width: 16.5em; }
++* html .lang_de #submenu_admin_network_firewall { width: 16.5em; }
++
++.lang_pt-br #submenu_admin_network_firewall { min-width: 15em; }
++* html .lang_pt-br #submenu_admin_network_firewall { width: 15em; }
++
++#modemenu {
++/* width: auto;*/
++ background: #000;
++ color: #fff;
++ list-style: none;
++ margin-right: 1px;
++}
++
++#modemenu li {
++ float: right;
++ list-style: none;
++}
++
++#savemenu {
++ float: right;
++ margin-right: 2em;
++}
++
++.lang_de #submenu_admin_uci {
++ width: 12em;
++}
++
++.lang_ru #submenu_admin_uci {
++ width: 11.5em;
++}
++
++textarea#syslog {
++ width: 98%;
++ min-height: 500px;
++ border: 3px solid #ccc;
++ padding: 5px;
++ font-family: monospace;
++}
++
++
++#maincontent {
++ clear: both;
++ width: 90%;
++ margin: 0 auto;
++ padding: 0.5em;
++ color: #000;
++ 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;
++ 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%;
++}
++
++.cbi-title-ref {
++ color: inherit;
++ text-decoration: none;
++ padding-right: 18px;
++ background: url('../resources/cbi/link.gif') no-repeat scroll right center;
++ background-color: inherit;
++}
++
++ul.cbi-apply {
++ font-size: 90%;
++}
++
++ul.cbi-tabmenu {
++ padding: 3px 0;
++ margin-left: 0 !important;
++ margin-bottom: -1px;
++ list-style-type: none;
++}
++
++ul.cbi-tabmenu li.cbi-tab,
++ul.cbi-tabmenu li.cbi-tab-disabled {
++ display: inline;
++ margin: 0;
++}
++
++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 dotted #bbb;
++ border-bottom: none;
++ background-color: #eee;
++ color: #bbb;
++}
++
++ul.cbi-tabmenu li.cbi-tab-highlighted a {
++ color: #000;
++ background-color: #FFEEAA;
++}
++
++ul.cbi-tabmenu li a:hover {
++ color: #000;
++}
++
++ul.cbi-tabmenu li.cbi-tab a {
++ position: relative;
++ top: 1px;
++ padding-top: 4px;
++ color: #000;
++ background-color: #fff;
++}
++
++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 #ccc;
++ margin: 0.25em 0.25em 2em;
++ padding: 0.5em 0.5em 0.5em 2em;
++}
++
++input[type=submit],
++input[type=reset],
++input[type=image],
++input[type=button] {
++ cursor: pointer;
++}
++
++select,
++input,
++textarea {
++ background: #fff;
++ color: #000;
++ border: 1px solid #cccccc;
++}
++
++input[type=image] {
++ border: none;
++}
++
++input:focus,
++input:hover,
++select:focus,
++select:hover,
++textarea:focus,
++textarea:hover {
++ background-color: #fff;
++ color: #000;
++}
++
++select,
++input[type=text],
++input[type=password] {
++ width: 20em;
++}
++
++td select,
++td input[type=text],
++td input[type=password] {
++ width: 99%;
++}
++
++img.cbi-image-button {
++ cursor: pointer;
++ margin: 0 2px;
++ 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;
++}
++
++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;
++}
++
++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;
++}
++
++input.cbi-input-reset,
++input.cbi-button-reset {
++ background: url('../resources/cbi/reset.gif') no-repeat scroll 1px center;
++ background-color: inherit;
++ color: #000;
++ padding: 0 1px 0 17px;
++}
++
++
++}
++
++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;
++}
++
++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;
++}
++
++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;
++}
++
++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;
++}
++
++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;
++}
++
++input.cbi-button-up {
++ background-image: url('../resources/cbi/up.gif');
++ padding: 0 1px 0 11px;
++}
++
++input.cbi-button-down {
++ background-image: url('../resources/cbi/down.gif');
++ padding: 0 1px 0 11px;
++}
++
++input.cbi-button-edit {
++ background: url('../resources/cbi/edit.gif') no-repeat scroll 1px center;
++ color: #000000;
++ padding: 0 1px 0 17px;
++}
++
++input.cbi-button-reload {
++ background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center;
++ color: #000000;
++ padding: 0 1px 0 17px;
++}
++
++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;
++}
++
++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: #000;
++}
++
++table.smalltext {
++ background: #f5f5f5;
++ color: #000;
++ border: 1px solid #666;
++ font-size: 90%;
++ width: 80%;
++ margin-left: auto;
++ margin-right: auto;
++ border-collapse: collapse;
++}
++
++table.smalltext tr:hover td {
++ background-color: #bbddee;
++ color: #000;
++}
++
++table.smalltext tr th {
++ padding: 0 0.25em;
++ border-left: 1px dotted #666;
++ text-align: left;
++}
++
++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;
++}
++
++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: #f1f6fa;
++ color: #555;
++}
++
++.cbi-rowstyle-2 {
++ color: #000;
++}
++
++div.cbi-value {
++ clear: left;
++ vertical-align: middle;
++ padding-left: 0.25em;
++ border-bottom: 1px dotted #bbb;
++}
++
++div.cbi-value:hover {
++ background: #f8f8f8;
++ color: #000;
++}
++
++.cbi-value-title {
++ float: left;
++ width: 40%;
++ line-height: 1.8em;
++}
++
++div.cbi-value-field {
++ width: 58%;
++ margin-left: 40%;
++ padding: 0.25em 0;
++}
++
++div.cbi-value-description {
++ font-size: 90%;
++ display: inline;
++}
++
++div.cbi-section-create {
++ clear: left;
++ white-space: nowrap;
++ vertical-align: top;
++}
++
++div.cbi-tblsection-create {
++ border-bottom: 1px dotted #bbb;
++}
++
++div.cbi-section-create .cbi-button {
++ margin: 0.25em;
++}
++
++input.cbi-section-create-name {
++ margin-right: -0.25em;
++ border: 1px solid #999;
++}
++
++div.cbi-map-descr {
++ margin-bottom: 1em;
++}
++
++div.cbi-optionals {
++ padding: 0.25em;
++ 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;
++}
++
++.cbi-section-node table div {
++ padding-bottom: 0;
++ border-bottom: none;
++}
++
++.cbi-section-node div.cbi-section-table-row {
++ margin: 0.25em;
++}
++
++table.cbi-section-table {
++ width: 100%;
++ font-size: 95%;
++}
++
++table.cbi-section-table th,
++table.cbi-section-table td {
++ text-align: center;
++}
++
++tr.cbi-section-table-descr th {
++ font-weight: bold;
++ font-size: 90%;
++}
++
++td.cbi-section-table-optionals {
++ text-align: left !important;
++ padding-top: 1em;
++}
++
++.cbi-value-helpicon img {
++ vertical-align: bottom;
++}
++
++div.cbi-error {
++ font-size: 95%;
++ font-weight: bold;
++ color: #f00;
++ background-color: #fff;
++}
++
++td.cbi-value-error {
++ border-color: red;
++}
++
++.cbi-value-error input,
++.cbi-value-error select {
++ color: red;
++ background-color: #fcc;
++}
++
++.cbi-section-error {
++ color: red;
++ background-color: white;
++ font-size: 95%;
++ border: 1px dotted red;
++ margin: 3px;
++ padding: 3px;
++}
++
++.left {
++ text-align: left !important;
++}
++
++.right {
++ text-align: right !important;
++}
++
++.footer, .push {
++ height: 2em;
++}
++
++.footer {
++ width: 99%;
++ padding: 0.3em;
++}
++
++
++.wrapper {
++ min-height: 100%;
++ height: auto !important;
++ height: 100%;
++ margin: 0 auto -2em;
++}
++
++.luci a:link,
++.luci a:visited,
++.exectime {
++ color: #666;
++ text-decoration: none;
++ font-size: 70%;
++}
++
++.inline {
++ display: inline;
++}
++
++.error500 {
++ white-space: normal;
++ border: 1px dotted #f00;
++ background-color: #fff;
++ color: #000;
++ padding: 0.5em;
++}
++
++.uci-change-list {
++ font-family: monospace;
++}
++
++.uci-change-list ins,
++.uci-change-legend-label ins {
++ text-decoration: none;
++ border: 1px solid #00FF00;
++ background-color: #CCFFCC;
++ display: block;
++ padding: 2px;
++}
++
++.uci-change-list del,
++.uci-change-legend-label del {
++ text-decoration: none;
++ border: 1px solid #FF0000;
++ background-color: #FFCCCC;
++ display: block;
++ font-style: normal;
++ padding: 2px;
++}
++
++.uci-change-list var,
++.uci-change-legend-label var {
++ text-decoration: none;
++ border: 1px solid #CCCCCC;
++ background-color: #EEEEEE;
++ display: block;
++ font-style: normal;
++ padding: 2px;
++}
++
++.uci-change-list var ins,
++.uci-change-list var del {
++ /*display: inline;*/
++ border: none;
++ white-space: pre;
++ font-style: normal;
++ padding: 0px;
++}
++
++.uci-change-legend {
++ padding: 5px;
++}
++
++.uci-change-legend-label {
++ width: 150px;
++ float: left;
++ font-size: 80%;
++}
++
++.uci-change-legend-label>ins,
++.uci-change-legend-label>del,
++.uci-change-legend-label>var {
++ float: left;
++ margin-right: 4px;
++ width: 10px;
++ height: 10px;
++ display: block;
++}
++
++.uci-change-legend-label var ins,
++.uci-change-legend-label var del {
++ line-height: 6px;
++ border: none;
++}
++
++}
+diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/header.jpg b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/header.jpg
+new file mode 100644
+index 0000000000000000000000000000000000000000..2fde5a21254674636804e41c7e655640ed869184
+GIT binary patch
+literal 316
+zcmex=<NpH&0WUXCHwH#VMg|WcWcYuZ!I^=TnT3UgnH5N|va+(V^Kh^O0Y5i4CyyY%
+zkdPq1prEjrjJU9fl&GMfgrbC$tgO7eys)^Eijtg)jGVk2$Ph-LR(3XaJ`N5(IT1k-
+zIg-Ku0}O&33`q=(%#4BzOoEKef{g!<Fo-iSGB7is05*0GpoFXdBTy+TvJ4|LyP!y5
+z*py2^X%V0Y(EvzP5L5IP0}nGJ&_ZTG2788^2~bU3pWO?7s+49_uxvNp)BOJ?0M?-_
+AqW}N^
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/ie7.css b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/ie7.css
+new file mode 100644
+index 0000000..67ed9fb
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/ie7.css
+@@ -0,0 +1,20 @@
++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;
++}
+diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/logo.jpg b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/logo.jpg
+new file mode 100644
+index 0000000000000000000000000000000000000000..ea06ce77f44ba6a310b338f7b2532c5958830937
+GIT binary patch
+literal 4722
+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
+R>hKb&{rUg?$LPHN`5&dNoc;g+
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/mobile.css b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/mobile.css
+new file mode 100644
+index 0000000..37d77b4
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/mobile.css
+@@ -0,0 +1,59 @@
++#header{
++ padding-left:0px !important;
++ padding-bottom:24px;
++}
++
++.header_left{
++ max-width: 100%;
++}
++
++#mainlogo {
++ max-width: 90%;
++}
++
++#content {
++ margin-left:0px !important;
++}
++
++#maincontent{
++ font-size:1.2em;
++ line-height:1.5em;
++}
++
++input[type=submit],
++.cbi-button,
++.cbi-button-reset,
++.cbi-button-save{
++ display:inline !important;
++ float:none !important;
++ padding:10px 30px !important;
++ margin: 10px 10px 10px 0 !important;
++}
++
++.cbi-input-text,
++.cbi-input-select,
++.cbi-input-user,
++.cbi-input-password{
++ display:block !important;
++ margin: 0 !important;
++ padding:0 !important;
++}
++
++.cbi-value-field{
++ margin:0 !important;
++ margin-bottom: 1em !important;
++ width:100% !important;
++}
++
++.cbi-section legend{
++ white-space:normal !important;
++}
++
++.cbi-value-title{
++ font-weight:bold;
++ float:none !important;
++}
++
++img {
++ max-width:100%;
++}
+diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/smallscreen.css b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/smallscreen.css
+new file mode 100644
+index 0000000..660cd8d
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/smallscreen.css
+@@ -0,0 +1,3 @@
++.header_right {
++ display:none;
++}
+diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/footer.htm b/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/footer.htm
+new file mode 100644
+index 0000000..540df71
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/footer.htm
+@@ -0,0 +1,30 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++ local ver = require "luci.version"
++
++ local xtime
++ if exectime then
++ xtime = (string.format("%.2fs", os.clock() - exectime))
++ end
++%>
++
++</div>
++<div class="clear"></div>
++<div class="push"></div>
++</div>
++
++<div class="footer">
++<p class="luci"><a href="http://luci.subsignal.org">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a></p>
++<% if xtime then %>
++<p class="exectime">Script execution time: <%=xtime%></p>
++<% end %>
++</div>
++
++</body>
++</html>
++
+diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm b/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm
+new file mode 100644
+index 0000000..20a41be
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm
+@@ -0,0 +1,223 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++ local fs = require "nixio.fs"
++ local sys = require "luci.sys"
++ local util = require "luci.util"
++ local http = require "luci.http"
++ local disp = require "luci.dispatcher"
++ local version = require "luci.version"
++
++ local sysinfo = util.ubus("system", "info") or { }
++ local loadinfo = sysinfo.load or { 0, 0, 0 }
++ local boardinfo = util.ubus("system", "board") or { }
++
++ local request = disp.context.path
++ local category = request[1]
++ local cattree = category and disp.node(category)
++
++ local tree = disp.node()
++ local node = disp.context.dispatched
++
++ local categories = disp.node_childs(tree)
++
++ local c = tree
++ local i, r
++
++ -- tag all nodes leading to this page
++ for i, r in ipairs(request) do
++ if c.nodes and c.nodes[r] then
++ c = c.nodes[r]
++ c._menu_selected = true
++ end
++ end
++
++ local uci = require "luci.model.uci".cursor()
++ local ff = uci:get("freifunk", "community", "name") or ""
++ local co = "profile_" .. ff
++ local community = uci:get_first(co, "community", "name") or "Freifunk"
++ local hp = uci:get_first(co, "community", "homepage") or "http://www.freifunk.net"
++ local logo = "/luci-static/freifunk-generic/logo.jpg"
++ local banner = false
++ local show_comm = true
++
++ local file
++ for file in fs.glob("/www/luci-static/resources/custom_logo.*") do
++ logo = string.gsub(file, "/www", "")
++ break
++ end
++
++ for file in fs.glob("/www/luci-static/resources/custom_logo_only.*") do
++ logo = string.gsub(file, "/www", "")
++ show_comm = false
++ break
++ end
++
++ for file in fs.glob("/www/luci-static/resources/custom_header.*") do
++ logo = string.gsub(file, "/www", "")
++ show_comm = false
++ banner = true
++ end
++-%>
++
++<?xml version="1.0" encoding="utf-8"?>
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<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 http-equiv="Content-Script-Type" content="text/javascript" />
++<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
++<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">
++<%= css %>
++</style>
++<% end -%>
++<meta name="viewport" content="initial-scale=1.0" />
++<script type="text/javascript" src="<%=resource%>/xhr.js"></script>
++
++<title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(tostring(node.title)) or '')) %> - LuCI</title>
++</head>
++
++<body class="lang_<%=luci.i18n.context.lang%>">
++
++<div class="wrapper">
++
++<!--[if lt IE 7]>
++<div class="warning"><div style="background-color: #cccccc;padding: 2px 10px 2px 10px">
++<%: 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.%>
++</div></div>
++<![endif]-->
++
++<%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
++ <div class="warning">
++ <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.%>
++ </div>
++<%- end -%>
++
++<p class="skiplink">
++<span id="skiplink1"><a href="#navigation"><%:skiplink1 Skip to navigation%></a></span>
++<span id="skiplink2"><a href="#content"><%:skiplink2 Skip to content%></a></span>
++</p>
++
++<div id="header">
++ <%if banner then%>
++ <div class="header_banner">
++ <a href="<%=hp%>"><img src="<%=logo%>" alt="Header" /></a>
++ </div>
++ <%else%>
++ <div class="header_left">
++ <a href="<%=hp%>"><img src="<%=logo%>" id="mainlogo" alt="Logo" /></a>
++ <%if show_comm then%>
++ <a href="<%=hp%>"><%=community%></a>
++ <br/>
++ <%end%>
++ </div>
++ <div class="header_right">
++ <%=version.distversion%><br />
++ <%:Load%>: <%="%.2f" % (loadinfo[1] / 65535.0)%> <%="%.2f" % (loadinfo[2] / 65535.0)%> <%="%.2f" % (loadinfo[3] / 65535.0)%><br />
++ <%:Hostname%>: <%=boardinfo.hostname or "?"%><br />
++ <span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
++ <%:Auto Refresh%>:
++ <span id="xhr_poll_status_on"><%:on%></span>
++ <span id="xhr_poll_status_off" style="display:none"><%:off%></span>
++ </span>
++ </div>
++ <div class="clear"></div>
++
++ <%end%>
++</div>
++
++<%-
++ local function submenu(prefix, node)
++ local childs = disp.node_childs(node)
++ if #childs > 0 then
++%>
++ <ul id="submenu_<%=string.gsub(string.gsub(prefix, "/", "_"), "^_(.-)_$", "%1")%>">
++ <%-
++ for i, r in ipairs(childs) do
++ local nnode = node.nodes[r]
++ local href = controller .. prefix .. r .. "/" ..
++ (nnode.query and http.build_querystring(nnode.query) or "")
++ %>
++ <li>
++ <a<%=ifattr(nnode._menu_selected, "class", "active")%> href="<%=luci.util.pcdata(href)%>"><%=translate(nnode.title)%></a>
++ <%- submenu(prefix .. r .. "/", nnode) %>
++ </li>
++ <%-
++ end
++ %>
++ </ul>
++<%
++ end
++ end
++%>
++
++<div id="menubar">
++<h2 class="navigation"><a id="navigation" name="navigation"><%:navigation Navigation%></a></h2>
++<ul id="mainmenu" class="dropdowns">
++ <%
++ local childs = disp.node_childs(cattree)
++ if #childs > 0 then
++ for i, r in ipairs(childs) do
++ local nnode = cattree.nodes[r]
++ local href = controller .. "/" .. category .. "/" .. r ..
++ (nnode.query and http.build_querystring(k.query) or "")
++ %>
++ <li>
++ <a<%=ifattr(nnode._menu_selected, "class", "preactive")%> href="<%=href%>"><%=translate(nnode.title)%></a>
++ <%- submenu("/" .. category .. "/" .. r .. "/", nnode) %>
++ </li>
++ <%
++ end
++ end
++ %>
++ <li></li>
++</ul>
++
++<% if #categories > 1 then %>
++ <ul id="modemenu">
++ <% for i, r in ipairs(categories) do %>
++ <li><a<%=ifattr(request[1] == r, "class", "active")%> href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a></li>
++ <% end %>
++ </ul>
++<% end %>
++
++<%
++if tree.nodes[category] and tree.nodes[category].ucidata then
++ local ucic = 0
++ for i, j in pairs(require("luci.model.uci").cursor():changes()) do
++ for k, l in pairs(j) do
++ for m, n in pairs(l) do
++ ucic = ucic + 1;
++ end
++ end
++ end
++-%>
++ <div id="savemenu">
++ <% if ucic > 0 then %>
++ <a class="warning" href="<%=controller%>/<%=category%>/uci/changes/?redir=<%=http.urlencode(http.formvalue("redir") or REQUEST_URI)%>"><%:Unsaved Changes%>: <%=ucic%></a>
++ <% end -%>
++ </div>
++<% end %>
++
++<div class="clear"></div>
++</div>
++<div id="maincontent">
++<% if category ~= "freifunk" and category ~= "splash" then %>
++<noscript>
++ <div class="errorbox">
++ <strong><%:Java Script required!%></strong><br />
++ <%:You must enable Java Script in your browser or LuCI will not work properly.%>
++ </div>
++</noscript>
++<% end %>
+diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/root/etc/uci-defaults/luci-theme-freifunk-generic b/feeds/luci/themes/luci-theme-freifunk-generic/root/etc/uci-defaults/luci-theme-freifunk-generic
+new file mode 100644
+index 0000000..017e7f7
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-freifunk-generic/root/etc/uci-defaults/luci-theme-freifunk-generic
+@@ -0,0 +1,5 @@
++uci batch <<-EOF
++ set luci.themes.Freifunk_Generic=/luci-static/freifunk-generic
++ set luci.main.mediaurlbase=/luci-static/freifunk-generic
++ commit luci
++EOF
+diff --git a/feeds/luci/themes/luci-theme-material/Makefile b/feeds/luci/themes/luci-theme-material/Makefile
+new file mode 100755
+index 0000000..5bc16eb
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-material/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=Material Theme
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/css/style.css b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/css/style.css
+new file mode 100755
+index 0000000..d4feb36
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/css/style.css
+@@ -0,0 +1,1504 @@
++/**
++ * Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
++ *
++ * luci-theme-material
++ * Copyright 2015 Lutty Yang <lutty@wcan.in>
++ *
++ * Have a bug? Please create an issue here on GitHub!
++ * https://github.com/LuttyYang/luci-theme-material/issues
++ *
++ * luci-theme-bootstrap:
++ * Copyright 2008 Steven Barth <steven@midlink.org>
++ * Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ * Copyright 2012 David Menting <david@nut-bolt.nl>
++ *
++ * MUI:
++ * https://github.com/muicss/mui
++ *
++ * Licensed to the public under the Apache License 2.0
++ */
++
++/*
++ * Font generate by Icomoon<icomoon.io>
++ */
++@font-face {
++ font-family: 'icomoon';
++ src: url('../fonts/font.eot');
++ src: url('../fonts/font.eot') format('embedded-opentype'),
++ url('../fonts/font.ttf') format('truetype'),
++ url('../fonts/font.woff') format('woff'),
++ url('../fonts/font.svg') format('svg');
++ font-weight: normal;
++ font-style: normal;
++}
++
++.cbi-button-up,
++.cbi-button-down,
++.cbi-value-helpicon,
++.showSide,
++.main > .loading > span {
++ font-family: 'icomoon' !important;
++ speak: none;
++ font-style: normal !important;
++ font-weight: normal !important;
++ font-variant: normal !important;
++ text-transform: none !important;
++ line-height: 1;
++
++ -webkit-font-smoothing: antialiased;
++ -moz-osx-font-smoothing: grayscale;
++}
++
++* {
++ margin: 0;
++ padding: 0;
++ box-sizing: border-box;
++}
++
++.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {
++ font-family: inherit;
++ font-weight: 500;
++ line-height: 1.1;
++ color: inherit;
++}
++
++html {
++ -webkit-text-size-adjust: 100%;
++ -ms-text-size-adjust: 100%;
++}
++
++html, body {
++ margin: 0px;
++ padding: 0px;
++ height: 100%;
++ font-family: "Helvetica Neue", Helvetica, Microsoft Yahei, Hiragino Sans GB, WenQuanYi Micro Hei, sans-serif;
++}
++
++select {
++ padding: 0.36rem 0.8rem;
++ color: #555;
++ background-color: #fff;
++ background-image: none;
++ border: 1px solid #ccc;
++}
++
++select,
++input {
++ background-color: transparent;
++ color: rgba(0, 0, 0, .87);
++ border: none;
++ border-bottom: 1px solid rgba(0, 0, 0, .26);
++ outline: 0;
++ padding: 0;
++ box-shadow: none;
++ border-radius: 0;
++ background-image: none;
++ height: 2rem;
++ font-size: 1.1rem;
++}
++
++select:not([multiple="multiple"]):focus,
++input:focus {
++ height: 2rem;
++ height: calc(2rem + 1px);
++ margin-bottom: -1px;
++ border-color: #0099CC;
++ border-width: 2px;
++}
++
++select[multiple="multiple"] {
++ height: auto;
++}
++
++code {
++ color: #0099CC;
++}
++
++abbr {
++ color: #005470;
++ text-decoration: underline;
++ cursor: help;
++}
++
++hr{
++ margin: 1rem 0;
++ border-color: #EEE;
++ opacity: 0.1;
++}
++
++header, .main {
++ width: 100%;
++ position: absolute;
++}
++
++header {
++ height: 4rem;
++ box-shadow: 0 2px 5px rgba(0, 0, 0, .26);
++ transition: box-shadow .2s;
++ float: left;
++ position: fixed;
++ z-index: 101;
++}
++
++footer {
++ text-align: right;
++ padding: 1rem;
++ color: #aaa;
++ font-size: 0.8rem;
++ text-shadow: 0px 0px 2px #BBB;
++}
++
++footer > a {
++ color: #aaa;
++ text-decoration: none;
++}
++
++.main {
++ top: 4rem;
++ bottom: 0rem;
++ position: relative;
++ height: 100%;
++ height: calc(100% - 4rem);
++}
++
++.main > .loading {
++ position: fixed;
++ width: 100%;
++ height: 100%;
++ z-index: 1000;
++ display: block;
++ background-color: rgb(240, 240, 240);
++ top: 0;
++}
++
++.main > .loading > span {
++ display: block;
++ text-align: center;
++ margin-top: 2rem;
++ color: #888;
++ font-size: 1.3rem;
++}
++
++.main > .loading > span > .loading-img:before {
++ content: "\e603";
++}
++
++.main > .loading > span > .loading-img {
++ animation: anim-rotate 2s infinite linear;
++ margin-right: 0.2rem;
++ display: inline-block;
++}
++
++@keyframes anim-rotate {
++ 0% {
++ -webkit-transform: rotate(0);
++ -ms-transform: rotate(0);
++ transform: rotate(0);
++ }
++ 100% {
++ -webkit-transform: rotate(360deg);
++ -ms-transform: rotate(360deg);
++ transform: rotate(360deg)
++ }
++}
++
++.main-left {
++ float: left;
++ top: 4rem;
++ width: 15%;
++ width: calc(0% + 17rem);
++ height: 100%;
++ height: calc(100% - 4rem);
++ background-color: white;
++
++ overflow-x: auto;
++ position: fixed;
++}
++
++.main-right {
++ width: 85%;
++ width: calc(100% - 17rem);
++ float: right;
++ height: 100%;
++ background-color: #EEE;
++}
++
++.main-right > #maincontent {
++ background-color: #EEE;
++}
++
++.pull-right {
++ float: right;
++}
++
++.pull-left {
++ float: left;
++}
++
++header {
++ background: #0099CC;
++ color: white;
++}
++
++header > .container {
++ margin-top: 0.5rem;
++ padding: 0.5rem 1rem 0 1rem;
++}
++
++header > .container > .brand {
++ font-size: 1.5rem;
++ color: white;
++ text-decoration: none;
++ cursor: default;
++ vertical-align: text-bottom;
++}
++
++.warning {
++ background-color: #FF7D60 !important;
++ color: #FFF;
++}
++
++.errorbox,
++.alert-message {
++ margin: 2rem 0 0 0;
++ padding: 2rem;
++ border: 0;
++ font-weight: normal;
++ font-style: normal;
++ line-height: 1;
++ font-family: inherit;
++ min-width: inherit;
++ overflow: auto;
++ 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);
++}
++
++.errorbox {
++ color: #fff;
++ background-color: #f0ad4e;
++ border-color: #eea236;
++}
++
++.error {
++ color: red;
++}
++
++#maincontent > .container > div:nth-child(1).alert-message.warning > a {
++ font: inherit;
++ overflow: visible;
++ text-transform: none;
++ display: inline-block;
++ margin-bottom: 0;
++ font-weight: 400;
++ text-align: center;
++ white-space: nowrap;
++ vertical-align: middle;
++ touch-action: manipulation;
++ cursor: pointer;
++ -webkit-user-select: none;
++ -moz-user-select: none;
++ -ms-user-select: none;
++ user-select: none;
++ background-image: none;
++ min-width: 6rem;
++ padding: 0.5rem 1rem;
++ font-size: 1.1rem;
++ line-height: 1.42857143;
++ color: #fff;
++ background-color: #5bc0de;
++ border-color: #46b8da;
++ margin-top: 2rem;
++ text-decoration: inherit;
++}
++
++.main > .main-left > .nav {
++ margin-top: 0.5rem;
++}
++
++.main > .main-left > .nav > li a {
++ color: #404040;
++ display: block;
++}
++
++.main > .main-left > .nav > li:nth-last-child(1) {
++ margin-top: 2rem;
++ font-size: 1.2rem;
++}
++
++.main > .main-left > .nav > li {
++ padding: 0.5rem 1rem;
++ cursor: pointer;
++}
++
++.main > .main-left > .nav > .slide {
++ padding: 0;
++}
++
++.main > .main-left > .nav > .slide > ul {
++ display: none;
++}
++
++.main > .main-left > .nav > .slide > .menu {
++ display: block;
++ padding: 0.5rem 1rem;
++ text-decoration: none;
++ cursor: default;
++ font-size: 1.2rem;
++}
++
++.main > .main-left > .nav > li:hover,
++.main > .main-left > .nav > .slide > .menu:hover {
++ background: #D4D4D4;
++}
++
++.main > .main-left > .nav > .slide:hover {
++ background: none;
++}
++
++.main > .main-left > .nav > .slide > .slide-menu > li {
++ padding: 0.4rem 2rem;
++}
++
++.main > .main-left > .nav > .slide > .slide-menu > .active {
++ background-color: #0099CC;
++}
++
++.main > .main-left > .nav > .slide > .slide-menu > li > a {
++ text-decoration: none;
++ white-space: nowrap;
++}
++
++.main > .main-left > .nav > .slide > .slide-menu > .active > a {
++ color: white;
++}
++
++.main > .main-left > .nav > .slide > .slide-menu > li:hover {
++ background: #D4D4D4;
++}
++
++.main > .main-left > .nav > .slide > .slide-menu > .active:hover {
++ background-color: #0099CC;
++ cursor: hand;
++}
++
++li {
++ list-style-type: none;
++}
++
++#maincontent > .container {
++ margin: 0 2rem 1rem 2rem;
++}
++
++h1 {
++ font-size: 4rem;
++ padding-bottom: 10px;
++ border-bottom: 1px solid #eee;
++}
++
++h2 {
++ margin: 2rem 0 0 0;
++ font-size: 2.5rem;
++ padding-bottom: 10px;
++ border-bottom: 1px solid #eee;
++}
++
++h3 {
++ margin: 2rem 0 0 0;
++ font-size: 2rem;
++ padding-bottom: 10px;
++}
++
++h4 {
++
++}
++
++fieldset {
++ margin: 2rem 0 0 0;
++ padding: 2rem;
++ border: 0;
++ font-weight: normal;
++ 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);
++
++ -webkit-overflow-scrolling: touch;
++}
++
++fieldset > legend {
++ display: none !important;
++}
++
++fieldset > fieldset {
++ margin: 0;
++ padding: 0;
++ border: none;
++ box-shadow: none;
++}
++
++.panel-title {
++ width: 100%;
++ display: block;
++ line-height: 1;
++ color: #404040;
++ font-size: 1.9rem;
++ padding-bottom: 2rem;
++ border-bottom: 1px solid #eee;
++}
++
++table {
++ border-spacing: 0;
++ border-collapse: collapse;
++ 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 {
++ padding: 8px;
++ line-height: 1.42857143;
++ border-top: 1px solid #ddd;
++
++ white-space: nowrap;
++}
++
++.cbi-section-table-cell {
++ text-align: center;
++}
++
++.cbi-section-table-row {
++ text-align: center;
++}
++
++fieldset > table > tbody > tr:nth-of-type(odd) {
++ background-color: #f9f9f9;
++}
++
++/* fix progress bar */
++#swaptotal > div,
++#swapfree > div,
++#memfree > div,
++#membuff > div,
++#conns > div,
++#memtotal > div {
++ width: 100% !important;
++ height: 1.4rem !important;
++}
++
++#swaptotal > div > div,
++#swapfree > div > div,
++#memfree > div > div,
++#membuff > div > div,
++#conns > div > div,
++#memtotal > div > div {
++ height: 1.4rem !important;
++ background-color: #0099CC !important;
++}
++
++/* fix multiple table */
++
++table table {
++ border: none;
++}
++
++.cbi-value-field table {
++ border: none;
++}
++
++td > table > tbody > tr > td {
++ border: none;
++}
++
++.cbi-value-field > table > tbody > tr > td {
++ border: none;
++}
++
++/* button style */
++
++.cbi-button {
++ -webkit-appearance: none;
++ text-transform: uppercase;
++ color: rgba(0, 0, 0, 0.87);
++ background-color: #F0F0F0;
++ transition: all 0.2s ease-in-out;
++ display: inline-block;
++ padding: 0.5rem 1rem;
++ border: none;
++ border-radius: 0.2rem;
++ cursor: pointer;
++ -ms-touch-action: manipulation;
++ touch-action: manipulation;
++ background-image: none;
++ text-align: center;
++ vertical-align: middle;
++ white-space: nowrap;
++ -webkit-user-select: none;
++ -moz-user-select: none;
++ -ms-user-select: none;
++ user-select: none;
++ font-size: 1rem;
++ width: auto !important;
++}
++
++.cbi-button:hover,
++.cbi-button:focus,
++.cbi-button:active {
++ color: rgba(0, 0, 0, 0.87);
++ outline: 0;
++ text-decoration: none;
++ color: rgba(0, 0, 0, 0.87);
++}
++
++.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);
++}
++
++.cbi-button:active {
++ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);
++}
++
++.cbi-button:disabled {
++ cursor: not-allowed;
++ pointer-events: none;
++ opacity: 0.60;
++ box-shadow: none;
++}
++
++form.inline + form.inline,
++.cbi-button + .cbi-button {
++ margin-left: 0.6rem;
++}
++
++.cbi-button-reset,
++.cbi-input-remove {
++ color: #fff !important;
++ background-color: #f0ad4e !important;
++ border-color: #eea236 !important;
++}
++
++.cbi-input-find,
++.cbi-input-save,
++.cbi-button-add,
++.cbi-button-save,
++.cbi-button-find,
++.cbi-input-reload,
++.cbi-button-reload {
++ color: #fff !important;
++ background-color: #337ab7 !important;
++ border-color: #2e6da4 !important;
++}
++
++.cbi-input-apply,
++.cbi-button-apply,
++.cbi-button-edit {
++ color: #fff !important;
++ background-color: #5bc0de !important;
++ border-color: #46b8da !important;
++}
++
++.cbi-input-reset,
++.cbi-button-remove {
++ color: #fff !important;
++ background-color: #d9534f !important;
++ border-color: #d43f3a !important;
++}
++
++.a-to-btn {
++ text-decoration: none;
++}
++
++/* table */
++
++.tabs {
++ margin: 0 -2rem;
++ padding-left: 0.5rem;
++ background-color: #FFFFFF;
++}
++
++.cbi-tabmenu > li,
++.tabs > li {
++ display: inline-block;
++ padding: 0.9rem 0rem;
++}
++
++.cbi-tabmenu > li > a,
++.tabs > li > a {
++ text-decoration: none;
++ color: #404040;
++ padding: 0.9rem 1.5rem;
++}
++
++.tabs > li[class~="active"],
++.tabs > li:hover {
++ cursor: pointer;
++ border-bottom: 0.2rem solid #0099CC;
++ color: #0099CC;
++ margin-bottom: -0.18751rem;
++}
++
++.tabs > li[class~="active"] > a {
++ color: #0099cc;
++}
++
++.tabs > li:hover {
++ border-bottom: 0.18751rem solid #C9C9C9;
++}
++
++.cbi-tabmenu {
++ border-top: 1px solid #D4D4D4;
++ border-left: 1px solid #D4D4D4;
++ border-right: 1px solid #D4D4D4;
++}
++
++.cbi-tabmenu > li:hover {
++ background-color: #F1F1F1;
++}
++
++.cbi-tabmenu > li[class~="cbi-tab"] {
++ background-color: white;
++}
++
++.cbi-tabmenu {
++ background-color: #D4D4D4;
++}
++
++.cbi-section-node-tabbed {
++ padding: 0;
++ margin-top: 0;
++ border-bottom: 1px solid #D4D4D4;
++ border-left: 1px solid #D4D4D4;
++ border-right: 1px solid #D4D4D4;
++}
++
++.cbi-tabcontainer > .cbi-value:nth-of-type(2n) {
++ background-color: #f9f9f9;
++}
++
++.cbi-value-field,
++.cbi-value-description {
++ display: table-cell;
++}
++
++.cbi-value-helpicon > img {
++ display: none;
++}
++
++.cbi-value-helpicon:before {
++ content: "\f059";
++}
++
++.cbi-value-description {
++ font-size: small;
++ opacity: 0.5;
++ padding: 0.5rem 0 0 0;
++}
++
++.cbi-value-title {
++ word-wrap: break-word;
++ padding-top: 0.6rem;
++ width: 23rem;
++ float: left;
++ text-align: right;
++ padding-right: 2rem;
++ display: table-cell;
++}
++
++.cbi-value {
++ padding: 1rem;
++ display: inline-block;
++ width: 100%;
++}
++
++.cbi-section-table-descr > .cbi-section-table-cell,
++.cbi-section-table-titles > .cbi-section-table-cell {
++ border: none;
++}
++
++.cbi-rowstyle-2 {
++ background-color: #eee;
++}
++
++.cbi-rowstyle-2 .cbi-button-up,
++.cbi-rowstyle-2 .cbi-button-down{
++ background-color: #FFF !important;
++}
++
++.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell {
++ width: auto !important;
++}
++
++/* desc */
++.cbi-section-descr,
++.cbi-map-descr {
++ padding: 0.5rem;
++ color: #999;
++ font-size: small;
++}
++
++/* luci */
++
++.hidden {
++ display: none
++}
++
++.left {
++ text-align: left !important;
++}
++
++.right {
++ text-align: right !important;
++}
++
++.inline {
++ display: inline;
++}
++
++.cbi-page-actions {
++ border-top: 1px solid #eee;
++ padding-top: 2rem;
++ text-align: right;
++}
++
++/* input */
++.cbi-value input[type="password"],
++.cbi-value input[type="text"] {
++ min-width: 15rem;
++}
++
++/* select */
++.cbi-value-field .cbi-input-select {
++ min-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);
++}
++
++.ifacebadge > img {
++ float: right;
++ margin-left: 0.3rem;
++}
++
++/*textarea*/
++
++.cbi-input-textarea {
++ width: 100%;
++ min-height: 16rem;
++ padding: 1rem;
++ font-size: 0.9rem;
++ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
++ color: black;
++}
++
++#syslog {
++ width: 100%;
++ min-height: 15rem;
++ padding: 1rem;
++ font-size: small;
++ color: #5F5F5F;
++
++ margin-bottom: 20px;
++ 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);
++ border: none;
++}
++
++/* change */
++
++.uci-change-list {
++ font-family: monospace;
++}
++
++.uci-change-list ins,
++.uci-change-legend-label ins {
++ text-decoration: none;
++ border: 1px solid #00FF00;
++ background-color: #CCFFCC;
++ display: block;
++ padding: 2px;
++}
++
++.uci-change-list del,
++.uci-change-legend-label del {
++ text-decoration: none;
++ border: 1px solid #FF0000;
++ background-color: #FFCCCC;
++ display: block;
++ font-style: normal;
++ padding: 2px;
++}
++
++.uci-change-list var,
++.uci-change-legend-label var {
++ text-decoration: none;
++ border: 1px solid #CCCCCC;
++ background-color: #EEEEEE;
++ display: block;
++ font-style: normal;
++ padding: 2px;
++}
++
++.uci-change-list var ins,
++.uci-change-list var del {
++ border: none;
++ white-space: pre;
++ font-style: normal;
++ padding: 0px;
++}
++
++.uci-change-legend {
++ padding: 5px;
++}
++
++.uci-change-legend-label {
++ width: 150px;
++ float: left;
++}
++
++.uci-change-legend-label > ins,
++.uci-change-legend-label > del,
++.uci-change-legend-label > var {
++ float: left;
++ margin-right: 4px;
++ width: 10px;
++ height: 10px;
++ display: block;
++}
++
++.uci-change-legend-label var ins,
++.uci-change-legend-label var del {
++ line-height: 6px;
++ border: none;
++}
++
++.uci-change-list var,
++.uci-change-list del,
++.uci-change-list ins {
++ padding: 0.5rem;
++}
++
++/* other fix */
++#iwsvg,
++#iwsvg2,
++#bwsvg {
++ border: 1px solid #D4D4D4 !important;
++ border-top: none !important;
++}
++
++.ifacebox {
++ border: 1px solid #999;
++ background-color: #f9f9f9;
++}
++
++.cbi-image-button {
++ margin-left: 0.5rem;
++}
++
++.zonebadge {
++ padding: 0.2rem 0.5rem;
++ display: inline-block;
++ cursor: pointer;
++}
++
++.zonebadge > .ifacebadge {
++ padding: 0.2rem 1rem;
++ margin: 0.3rem;
++ border: 1px solid #6C6C6C;
++}
++
++.zonebadge > input[type="text"] {
++ padding: 0.16rem 1rem;
++ min-width: 10rem;
++ margin-top: 0.3rem;
++}
++
++.cbi-value-field .cbi-input-checkbox,
++.cbi-value-field .cbi-input-radio {
++ margin-top: 0.3rem;
++}
++
++.cbi-section-table-row > .cbi-value-field .cbi-input-select {
++ min-width: 7rem;
++}
++
++.cbi-section-create > .cbi-button-add {
++ margin: 0.5rem;
++}
++
++div.cbi-value var, td.cbi-value-field var {
++ font-style: italic;
++ color: #0069D6;
++}
++
++small {
++ font-size: small;
++ white-space: normal;
++}
++
++.cbi-button-up,
++.cbi-button-down {
++ display: inline-block;
++ min-width: 0;
++ padding: 0.2rem 0.3rem;
++ font-size: 1.3rem;
++}
++
++.cbi-optionals {
++ padding: 1rem 1rem 0 1rem;
++ border-top: 1px solid #CCC;
++}
++
++#diag-rc-output > pre {
++ background-color: #f5f5f5;
++ display: block;
++ padding: 8.5px;
++ margin: 0 0 18px;
++ line-height: 1.5rem;
++ -moz-border-radius: 3px;
++ white-space: pre-wrap;
++ word-wrap: break-word;
++ font-size: 1.5rem;
++ color: #404040;
++}
++
++input[name="ping"],
++input[name="traceroute"],
++input[name="nslookup"] {
++ width: 80%;
++}
++
++header > .container > .pull-right > * {
++ position: relative;
++ top: 0.45rem;
++ cursor: pointer;
++}
++
++#xhr_poll_status > .label.success {
++ background-color: #14CE14;
++}
++
++.label {
++ padding: 0.3rem 0.8rem;
++ font-size: 1rem;
++ font-weight: bold;
++ color: #ffffff !important;
++ text-transform: uppercase;
++ white-space: nowrap;
++ background-color: #bfbfbf;
++ -webkit-border-radius: 3px;
++ -moz-border-radius: 3px;
++ border-radius: 3px;
++ text-shadow: none;
++ text-decoration: none;
++}
++
++.notice {
++ background-color: #5BC0DE;
++}
++
++.showSide {
++ display: none;
++}
++
++.darkMask {
++ width: 100%;
++ height: 100%;
++ position: fixed;
++ background-color: rgba(0, 0, 0, 0.56);
++ content: "";
++ z-index: 99;
++ display: none;
++}
++
++/* fix Main Login*/
++.node-main-login > .main > .main-left {
++ display: none;
++}
++
++.node-main-login > .main > .main-right {
++ width: 100%;
++}
++
++.node-main-login > .main fieldset {
++ padding: 0.5rem;
++ margin-bottom: 1rem;
++ display: inline;
++ background: none;
++ border: none;
++ box-shadow: none;
++ overflow: hidden;
++}
++
++.node-main-login > .main .cbi-value-title {
++ width: 7rem;
++}
++
++.node-main-login > .main #maincontent {
++
++ text-align: center;
++}
++
++.node-main-login > .main .container {
++ display: inline-block;
++ padding: 2rem 4rem;
++ margin-top: 2rem !important;
++ background-color: #FFF;
++ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
++ text-align: left;
++}
++
++.node-main-login > .main form > div:nth-last-child(1) {
++ float: right;
++}
++
++.node-main-login > .main .cbi-value {
++ display: block;
++}
++
++.node-main-login > .main .cbi-value > * {
++ display: inline-block !important;
++}
++
++.node-main-login > .main .cbi-input-user,
++.node-main-login > .main .cbi-input-password {
++ min-width: 15rem;
++}
++
++.node-main-login footer {
++ bottom: 0;
++ position: absolute;
++ width: 100%;
++}
++
++/* fix status overview */
++
++.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) {
++ white-space: normal;
++}
++
++.node-status-iptables > .main div > .cbi-map > form {
++ margin: 2rem 2rem 0 0;
++}
++
++/* fix system reboot */
++
++.node-system-reboot > .main > .main-right p,
++.node-system-reboot > .main > .main-right h3 {
++ padding-left: 2rem;
++}
++
++/* fix Services Network Shares*/
++.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-title {
++ margin-bottom: 1rem;
++}
++
++.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-field {
++ display: list-item;
++}
++
++.node-services-samba > .main .cbi-tabcontainer:nth-child(3) .cbi-value-description {
++ padding-top: 1rem;
++}
++
++/* fix System Software*/
++.node-system-packages > .main table tr td:nth-child(1) {
++ width: auto !important;
++}
++
++.node-system-packages > .main table tr td:nth-last-child(1) {
++ white-space: normal;
++ font-size: small;
++ color: #404040;
++}
++
++.node-system-packages > .main .cbi-tabmenu > li > a, .tabs > li > a {
++ padding: 0.5rem 1rem;
++}
++
++.node-system-packages > .main .cbi-value > pre {
++ background-color: #eee;
++ padding: 0.5rem;
++ overflow: auto;
++}
++
++.cbi-tabmenu + .cbi-section {
++ 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 {
++ margin-top: 0;
++}
++
++.node-status-iptables .cbi-tabmenu,
++.node-system-packages .cbi-tabmenu,
++.node-system-flashops .cbi-tabmenu {
++ border: none;
++ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12);
++}
++
++#cbi-firewall-redirect table *,
++#cbi-network-switch_vlan table *,
++#cbi-firewall-zone table *{
++ font-size: small;
++}
++
++#cbi-firewall-redirect table input[type="text"],
++#cbi-network-switch_vlan table input[type="text"],
++#cbi-firewall-zone table input[type="text"]{
++ width: 5rem;
++}
++
++#cbi-firewall-redirect table select,
++#cbi-network-switch_vlan table select,
++#cbi-firewall-zone table select{
++ min-width: 3.5rem;
++}
++
++
++/* language fix */
++body.lang_pl.node-main-login .cbi-value-title {
++ width: 12rem;
++}
++
++@media screen and (max-width: 1600px) {
++ .main-left {
++ width: calc(0% + 15rem);
++ }
++
++ .main-right {
++ width: calc(100% - 15rem);
++ }
++
++ .cbi-button {
++ padding: 0.3rem 0.6rem;
++ font-size: 1rem;
++ line-height: 1.5;
++ }
++
++ header > .container > .pull-right > * {
++ top: 0.35rem;
++ }
++
++ .label {
++ padding: 0.2rem 0.6rem;
++ }
++
++ .cbi-value-title {
++ width: 15rem;
++ padding-right: 0.6rem;
++ }
++
++ fieldset {
++ padding: 1rem;
++ }
++
++ .cbi-input-textarea {
++ font-size: small;
++ }
++
++ .node-status-iptables > .main fieldset li > a {
++ padding: 0.3rem 0.6rem;
++ }
++}
++
++@media screen and (max-width: 1280px) {
++ header {
++ height: 3.5rem;
++ }
++
++ header > .container {
++ margin-top: 0.25rem;
++ }
++
++ .main {
++ top: 3.5rem;
++ height: calc(100% - 3.5rem);
++ }
++
++ .main-left {
++ width: calc(0% + 13rem);
++ top: 3.5rem;
++ height: calc(100% - 3.5rem);
++ }
++
++ .main-right {
++ width: calc(100% - 13rem);
++ }
++
++ .cbi-tabmenu > li > a, .tabs > li > a {
++ padding: 0.2rem 0.5rem;
++ }
++
++ .panel-title {
++ font-size: 1.3rem;
++ padding-bottom: 1rem;
++ }
++
++ table {
++ font-size: 0.8rem !important;
++ width: 100% !important;
++ }
++
++ .main > .main-left > .nav > li,
++ .main > .main-left > .nav > li a,
++ .main > .main-left > .nav > .slide > .menu {
++ font-size: 1.1rem;
++ }
++
++ .main > .main-left > .nav > .slide > .slide-menu > li > a {
++ font-size: 0.9rem;
++ }
++}
++
++@media screen and (max-width: 992px) {
++ .main-left {
++ width: 0;
++ position: fixed;
++ z-index: 100;
++ }
++
++ .main-right {
++ width: 100%;
++ }
++
++ .showSide {
++ padding: 0.1rem;
++ margin-right: 0.5rem;
++ display: inline-block;
++ }
++
++ .showSide:before {
++ content: "\e20e";
++ font-size: 1.7rem;
++ }
++
++ .node-main-login .showSide {
++ display: none !important;
++ }
++
++ .cbi-value-title {
++ width: 9rem;
++ padding-right: 1rem;
++ }
++
++ .node-network-diagnostics > .main .cbi-map fieldset > div * {
++ width: 100% !important;
++ }
++
++ .node-network-diagnostics > .main .cbi-map fieldset > div input[type="text"] {
++ margin: 3rem 0 0 0 !important;
++ }
++
++ .node-network-diagnostics > .main .cbi-map fieldset > div:nth-child(4) input[type="text"] {
++ margin: 0 !important;
++ }
++
++ .node-network-diagnostics > .main .cbi-map fieldset > div select,
++ .node-network-diagnostics > .main .cbi-map fieldset > div input[type="button"] {
++ margin: 1rem 0 0 0;
++ }
++
++ .node-network-diagnostics > .main .cbi-map fieldset > div {
++ width: 100% !important;
++ }
++
++ #diag-rc-output > pre {
++ font-size: 1.2rem;
++ }
++
++ .node-main-login > .main .cbi-value-title {
++ text-align: left;
++ }
++}
++
++@media screen and (max-width: 480px) {
++ fieldset {
++ padding: 1rem;
++ margin: 1rem 0 0 0;
++ }
++
++ .tabs {
++ margin: 0 -1rem;
++ }
++
++ #maincontent > .container {
++ margin: 0 1rem 1.5rem 1rem;
++ }
++
++ .main > .main-left > .nav > .slide > .menu {
++ font-size: 1.3rem;
++ }
++
++ .main > .main-left > .nav > .slide > .slide-menu > li > a {
++ font-size: 1.1rem;
++ }
++
++ .cbi-value-title {
++ width: 100%;
++ min-width: 0rem !important;
++ display: block;
++ margin-top: 1rem;
++ margin-bottom: 0.5rem;
++ text-align: left;
++ }
++
++ .cbi-value-field, .cbi-value-description {
++ width: 100%;
++ }
++
++ .cbi-value > .cbi-value-field {
++ display: inline-block;
++ }
++
++ .cbi-tabmenu > li, .tabs > li {
++ padding: 0.6rem 0rem;
++ }
++
++ .cbi-tabmenu > li > a, .tabs > li > a {
++ padding: 0.2rem 0.3rem;
++ font-size: 0.9rem;
++ }
++
++ .cbi-page-actions > div > input {
++ display: none;
++ }
++
++ .node-main-login > .main .container {
++ padding: 0.5rem 1rem 2rem 1rem;
++ }
++
++ .node-main-login > .main .cbi-value {
++ padding: 0;
++ }
++
++ .node-main-login > .main form > div:nth-last-child(1) {
++ margin-top: 2rem;
++ }
++
++ .node-main-login > .main .cbi-value-title {
++ width: 100% !important;
++ font-size: 1.2rem;
++ }
++
++ .node-main-login > .main fieldset {
++ margin: 0;
++ padding: 0.5rem;
++ }
++
++ h2 {
++ font-size: 2rem;
++ }
++
++ .tabs > li > a {
++ font-size: 0.9rem;
++ }
++
++ select,
++ input {
++ font-size: 0.9rem;
++ }
++
++ .mobile-hide {
++ display: none;
++ }
++
++ .panel-title {
++ font-size: 1.4rem;
++ padding-bottom: 1rem;
++ }
++
++ .node-system-packages > .main .cbi-value.cbi-value-last > div {
++ width: 100% !important;
++ }
++
++ .node-system-packages > .main .cbi-value .cbi-value-field input {
++ width: 100%;
++ }
++
++ .node-status-iptables > .main div > .cbi-map > form {
++ position: static !important;
++ margin: 0 0 2rem 0;
++ padding: 2rem;
++ border: 0;
++ font-weight: normal;
++ 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);
++ -webkit-overflow-scrolling: touch;
++ }
++
++ .node-status-iptables > .main div > .cbi-map > form input[type="submit"]{
++ width: 100% !important;
++ margin: 0;
++ }
++
++ .node-status-iptables > .main div > .cbi-map > form input[type="submit"] + input[type="submit"]{
++ margin-top: 1rem;
++ }
++}
++
++@media screen and (min-width: 992px) {
++ .cbi-value input[type="password"],
++ .cbi-value input[type="text"] {
++ min-width: 20rem;
++ }
++
++ .cbi-value-field .cbi-input-select {
++ min-width: 20rem;
++ }
++}
++
++@media screen and (min-width: 1280px) {
++ .cbi-value input[type="password"],
++ .cbi-value input[type="text"] {
++ min-width: 22rem;
++ }
++
++ .cbi-value-field .cbi-input-select {
++ min-width: 22rem;
++ }
++}
++
++@media screen and (min-width: 1600px) {
++ .cbi-value input[type="password"],
++ .cbi-value input[type="text"] {
++ min-width: 25rem;
++ }
++
++ .cbi-value-field .cbi-input-select {
++ min-width: 25rem;
++ }
++}
+\ No newline at end of file
+diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/favicon.ico b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/favicon.ico
+new file mode 100755
+index 0000000000000000000000000000000000000000..b407d18455773a185059628e632e60c06d6eb858
+GIT binary patch
+literal 2462
+zcmcJR&yEaH6o*e6F|iOUG9fZOLP&@Rv5;U2&*0w!;0>@EGb?OJyuet^Lm<@5WC)%>
+zkg%GqrA0^izRtZ-om6$ws{JP4+;h*l=U2CGb=OQpkDs}@;CDYB?~d3X5yyd4oCfnl
+zQEO2_{uO*pd}Hi_UInNEw%|dE&oM3}4l_=IeJ4P#cTj-Wx)0ajZQ?p(S9uM+zd!+R
+z;6|ck+y`BBl4j4l?(e>39j4{~8n1hh&!;5zKDx>?*ZVTOhx+rKXD<Cjp8NbH&vU&#
+z=I5)Y-s(K8!8(*_G|u?>`V97nvAJBYkDKK6(zC8zOb&vd$Aubw;!E%;jrG`CeXYHE
+z=rxJ-*noU4#^$Cay}a-2Z#-@P|G9s^3nko27<c`CU@@Yb%)AFNp0;`zx@R%&svQ`#
+zztR7?yT-MX>HrO^a0Qz7YtEW$Tsx_D(r^bpz%#fCM-#^8thvUu|04Hz3ZB4A*hm<g
+zv(|KPq#JdH?6HQ59(&+W!nn!TUOn1$n}XlXMQG}8>vOF=_Uh3l-%EGlBRqt87<V0O
+zeOLy2?A2qO>^TcB!2LW2|K51tM-tY}S#!-Qm>ahj$|IU(b`hS!7WmH3|G(t-zctsm
+zwo%LJk~7t>=v9Lu#>!e5Gf}NnqiiyV!O~(3E&xaWo8#PG*^VF8qxilw8$V<3F#iYk
+Cvy_7X
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.eot b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.eot
+new file mode 100644
+index 0000000000000000000000000000000000000000..9e6ffc9b826cb39a58e56359d6b8b922a4b07364
+GIT binary patch
+literal 1912
+zcmah~Ur1Y582`?_x%Vc~T>r!*OpT4P8o`m;m_K$==`c84Z6{8{+A(HKZlhvuY>cgr
+zKFA)%(1*FfM*FnUZZIZ{J&ZBvpfZF#Y)@lIVSRG2hwi1Y4#u`F`<;8QXe6-ja?bgE
+zzw<lyJNG;1p0lP9{Uj4H5~$i3Z8OeHOjh$;Yuf$Nqw$k{L@F&%mWotBDUuF>N>ij!
+zo>pmzGE@TNr8Jlltw75)0Xj=z>Nm6}M}y=6>u7^S>VN6wGm(a7S2vh%P-e4*%<|74
+z-T45bcKGFdW@Q;|Bm8Z&_WaWN)fd`ZeusaHNO&->WpYaP$#+CHu8YruP`(wvhyN-3
+z)ANP$nqL?8;r{@?cd3}o2=nYs_)p+_3z@ZLe9%0RR1ZI(XA0Ww7af1Ye-<&`S}v}X
+zF;AHMCGRIuyn~rYh<#h&Z+ypW*>5z!99(zI7^Yoq=ZPL)7I!PVbY4V3=V9`>F2E}z
+z8jskHKC=}KRXf?}74Xf-hKS{56ga3mP!HbyReXH8^0ZRngTXngI9B<^|Cj$y|Mga>
+z;R}pA9?uwniV?%;hGTu$Jc)CL^hp0d9A5GarZvNJ<6ufi3Gpco?d=T-GZmvH1`UH|
+zm}{8N!4f`UZ>U1NTNno5ddx?}-q;a0gdKdb1FJ*sPETj7DTdm^s|}H!LSz<UC!PLx
+ze|ma9o#x-euoeB{XJQ|<5p{=p%qJF2#0MfiUc8<bMaCo0$YOtgGU@e>j^@e}6Xo3K
+zXf!%Jyy+jD4Tn>yMB=%*RO-r=RBG<h^z_KcO)NQ4W!FYnxmJoHR8SR^5pf{WA$VH6
+z1Ce+v8Wy^mA|paV6}y6AAr|fF3d)|A4q-r`g|9cKL}B#W`!nfV*Pb8j?H!!ly0=)H
+z6?ZSa{nh-dA6`$5y>a)o-oe4%#d}+m|4=Q~$QQ44QKuG~z>i4Xv1q8Lj|COk&su!m
+zB#R{CF*mpnCZx!x7-pM@8!0(V$8jZ+b@ar1M!vd&d^FFaIShFeNRsTjU4j|Sd#3{Z
+zXChnUcGm@);*d_c-5qUSPhEZ6>5dLdQtxVZJDg384u_&VOeQt$##&BG!nEAl4Grj%
+zf?bkj$zHI_k|f*NMx?LL=UZ2u=WI$ybv3ANugm3X><spJ%)oWcO?6ILR#nyI@wDnE
+zUT1_j+}GoeO7~xH82W?iY<#ECkHH7sN3FH8IAi!a8-~4a{Hxf8+)y9=4F*F_v&VG!
+zFdHOhp$+t<c|X?0G$+=l1IJ>D=4hK9vL(>`jZV6X?ab{kvf)^jN}pSC8R2xdumC)3
+zVG%fPVH@zOg(aM_9t+FhFId=#{kw^X%;o^2qQ}GnaNfcq@UVq#z&9-{;jj-_SO!03
+zVJAiD<ArRoP%P@zH%3}3tt=Gvz}awr?Q5dusG8)ImS0`Ul&bHan#!@FUJm3nT`OhE
+zS}riR9vIISFJf+C8Z)k_GQJ{@e?>Pgt_+pY=D^L-I_h!b%DZS?d0}MTT%Y6XQicBm
+D*A6pu
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.svg b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.svg
+new file mode 100644
+index 0000000..d38d057
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.svg
+@@ -0,0 +1,16 @@
++<?xml version="1.0" standalone="no"?>
++<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
++<svg xmlns="http://www.w3.org/2000/svg">
++<metadata>Generated by IcoMoon</metadata>
++<defs>
++<font id="icomoon" horiz-adv-x="1024">
++<font-face units-per-em="1024" ascent="960" descent="-64" />
++<missing-glyph horiz-adv-x="1024" />
++<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
++<glyph unicode="&#xe20a;" glyph-name="expand_less" d="M512 596.667l256-256-60-60-196 196-196-196-60 60z" />
++<glyph unicode="&#xe20b;" glyph-name="expand_more" d="M708 572.667l60-60-256-256-256 256 60 60 196-196z" />
++<glyph unicode="&#xe20e;" glyph-name="menu" d="M128 682.667h768v-86h-768v86zM128 384.667v84h768v-84h-768zM128 170.667v86h768v-86h-768z" />
++<glyph unicode="&#xe291;" glyph-name="favorite" d="M512 28.667l-62 56q-106 96-154 142t-107 114-81 123-22 113q0 98 67 166t167 68q116 0 192-90 76 90 192 90 100 0 167-68t67-166q0-78-52-162t-113-146-199-186z" />
++<glyph unicode="&#xe603;" glyph-name="spinner9" d="M512 960c-278.748 0-505.458-222.762-511.848-499.974 5.92 241.864 189.832 435.974 415.848 435.974 229.75 0 416-200.576 416-448 0-53.020 42.98-96 96-96s96 42.98 96 96c0 282.77-229.23 512-512 512zM512-64c278.748 0 505.458 222.762 511.848 499.974-5.92-241.864-189.832-435.974-415.848-435.974-229.75 0-416 200.576-416 448 0 53.020-42.98 96-96 96s-96-42.98-96-96c0-282.77 229.23-512 512-512z" />
++<glyph unicode="&#xf059;" glyph-name="question-circle" horiz-adv-x="878" d="M512 164.571v109.714q0 8-5.143 13.143t-13.143 5.143h-109.714q-8 0-13.143-5.143t-5.143-13.143v-109.714q0-8 5.143-13.143t13.143-5.143h109.714q8 0 13.143 5.143t5.143 13.143zM658.286 548.571q0 50.286-31.714 93.143t-79.143 66.286-97.143 23.429q-138.857 0-212-121.714-8.571-13.714 4.571-24l75.429-57.143q4-3.429 10.857-3.429 9.143 0 14.286 6.857 30.286 38.857 49.143 52.571 19.429 13.714 49.143 13.714 27.429 0 48.857-14.857t21.429-33.714q0-21.714-11.429-34.857t-38.857-25.714q-36-16-66-49.429t-30-71.714v-20.571q0-8 5.143-13.143t13.143-5.143h109.714q8 0 13.143 5.143t5.143 13.143q0 10.857 12.286 28.286t31.143 28.286q18.286 10.286 28 16.286t26.286 20 25.429 27.429 16 34.571 7.143 46.286zM877.714 438.857q0-119.429-58.857-220.286t-159.714-159.714-220.286-58.857-220.286 58.857-159.714 159.714-58.857 220.286 58.857 220.286 159.714 159.714 220.286 58.857 220.286-58.857 159.714-159.714 58.857-220.286z" />
++</font></defs></svg>
+\ No newline at end of file
+diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.ttf b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.ttf
+new file mode 100644
+index 0000000000000000000000000000000000000000..84669323e9ddfdca80c91416b6d4fe31ea1829ab
+GIT binary patch
+literal 1748
+zcmah}U1%d!6h3n&Gn1cY`jbCwn>0<gO`(#_rupfbwyZQ%>i)RYHn=Nd(_}VjX(rt?
+z-ECzbiVq^~gR7wIJ}Ik$SP&mXgcU4O@Ijw^C=2dW1t0Wf!4*VZ<9BDKw5tWraPR%j
+zch0@%%sF?41R`?L28k4Z?)j66)(&?+m@hHriq*pM5AWT1he+s#-Y6GVma(=$zlqge
+zURuBMOt<$}=(mX2y^2;SDaD815ZSn2x&lJ^TKpFJN6=4Hs*Sav&i0^x2Yqm<RxGfJ
+z@GA6&(EZiI+A^tBA(C34hxI~LyZx-=Pv}n~#%s&9l?L*J$e(dLiQ*k(A|du|#!r01
+zT!mj~Sa5K^BO)N}$K?#sgG=I0bBE4|7%=i$97xyzJQ^R}u$il9cy*JFUI5>LYKX+Z
+zh4)?i>i(NQi4QI{A2plC?(n|zF-~ay82lsnd+=JP)cPs*9gSyfz$B1>-K|G#j3{&3
+za6R<@9}b5+fwX3MZ5)CURiZq_(cRrqHrq5-65u1iXN>y@0f&$Yu-(xnaWfkO;Qq)*
+z#NF5yH`q4b*n#elr`Ok;YENPI@o7V(M{qI++s^0z-kX`(%jfy~2$ZLw_^~)dT}1uS
+z0rN>EGwI<(fDgaVtH^j5jW5RI*{t6`F;QxqJJ%>pOeB+IW1GQ|xmYZh%VeIK&*d&(
+z&gJGW%*>3B-$2WWnmaZ^=Q=5cP!W|W<Kl24#C%@=a3Y;b##mo_Vw`1Eu`d#1spLRk
+zMD}?@Y?#r)7n{=}o4ES+Z2s2Or$+_{M=oyNT|Ax@cP_mCdF91-ujM9RdH<!sk&(g0
+zyIU9kqT^VjUVPF;oxF68G`x2z866lBB8nUoya9h!NMzC}54b22Qsf>1*=Ev4Ne;?!
+z)Dy)zd{P0UUVRb1o7d6YhB`8mB)e{xAja}mPdI)uu{C9PpS39tsmJ39b@_d+maY?_
+zkmb_i?(jIA?QIT+qTJ7BHSPLZNy|dC(%N+m=)<aAl4Z$Wwabzu+l7t9&`=<-t~yWK
+zl&I=%RXu*U+uhb18St5bT^;Q%r!1?g>h}3M^?w~_ggCg@Q$N?gdbxG<H*(qdO`-22
+z_xcZ4tF!pW@ID)YyKj7}xQ1LXAASu6Lr&9TDtwy_F6N*O*z(+tzL?@fe?k<e9L>{B
+zx-Tq&<|jJo3a&GkgUE(rO)7n2#T7^aXXe0w=PWD&r!8y)UbV1<zpT%~GWfF=cH;hS
+zBBEe(fKg#FF#|4JSOgxkunqWzg(dP+*upaSX$w0kNgpf}Yt>p!rv)lfjj9+m((_t<
+zWuc~rPsQT+HZ`i#3LId-Ij1N_@nd%#OHOO$)ulomK{X`0N=sCr`mvsqHN6ooYr0l1
+zG_+E9emy)@ter=0F`6`DHxRvyV{{{<0yVIfz|GS-<|*R^&YLfQ9MQz1E%`702g#=)
+A_5c6?
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.woff b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.woff
+new file mode 100644
+index 0000000000000000000000000000000000000000..00cf84ea037c9748eba8fced0acff7dd29c12b2f
+GIT binary patch
+literal 1824
+zcmah~U1%d!6h3z*Gn1dq^e2DXHffq}n?fO*P4m+=ZK*U=>UMvqZE#n_rpav5(j>cS
+zx@~12iVq^~gR7vpPs*;oSP-8?SivF%AM{D2EZC<iKIqGWD~P(r@6JqV)qp3QbHDSQ
+zbMHBG@14oorO8QR1W|(I;G_I4x6S0zb7x{i%!=4N*Oqo?U%s5X4z2{h&h@+Z?!H~j
+zt#IxDKF{UaT3p_^2JQzU;Q`lYy4=5%v|NG6@)_buu1fyVmnD$k9>G7&Rrx~vs#LD8
+z6G>0NAK>b*2>Z*`Jo2P*_+G9;iM>+Jt)s5=Jp7=pDwQg^vIY+G*{fXdJZt;odUXZ8
+zDo8Q&L?BVT%Wji|-tGur!++fv+0Qh@Y&`XZu+|ff4#$ZeUJ-X2yEHCB!7-gTOi&;6
+zDnMO`aoh#Vv%1Jayytdm1tWk99y$)y!#92uA6{uZZZr@haQ1(2tnt17cmHqxn;lZi
+z$L30U;t9iuVRnmN#h?YE)H%Ji<Np4K!y-?jtvS9oHl~D?FmG{WZ*N4HYv>~}<S^un
+z@*L)~v6N5P8)*;^3!?x$9}S4KNju`Eu!ASIkxJz1@$@9x60ja_Hbr`jBtwOrZ1%7H
+z+1dSUmiNvmOMdY~agaKR`ojIjFA+~AhhjdiUXNRm@e^olDH=_uz21q5LVbF=UYMAO
+z$45uE{KNB+NG6j?J++X@T)mpfEL@zO9UHraBPVL?S_miCK?#%!se&>l4#fh3$L$@8
+zB@^+8(AyRp6H=<!8;S^tcz<t5_P7JWkU)!{Zq10o#ErM+vhUn@dU#-9`11DsrRJ=-
+zd-1hTN-w;7Gc)<}y%z_DhX<DKZ(shCnz8zRaZ?d1<fduT@Z5=bxPOp^6xq+*K5v@E
+zQpto1To?^0ayLV_sieLoN852S6PtDXOZfEt>J9PPd>@Tz*hhgR$y%{W5Pf*FI~Y9^
+z+n%yI&s!9m)a`NwI=vppsm{}ZfSGd2+3vF0+gfclML9^PHEnIZprs*NVSP;l`k-u;
+zWLdJ7t+FJ^R<;=%9Q64%RQoxL5>}lps>|ziI$L`}{T`#RqrJ^xmt|E|ogPm|<zLI`
+zC64a()K9g~Uuqfol^hm+Q|Oz}gTCX@JX!u7!a3`LyRW~ixQ1L{kKYEJA-fSV96rs0
+z6hmnfu`G|{Tnw?}d;%1u3@y-YI$+D7`HFVBhU?7bsIu;uMx~F;x=jBV89fNV^Cm9>
+zCrxYtUNy0VFSW<SGWhc*w&VV8p(3-`z^I5ASO6}XSOgw5u?6^+i6wkTgC>^2&zRUw
+zae99-UoBUw6<VY`RjCZEQYEX^Ru-$3;MqtN@1{mIT0sH=Sm!K7DB5&ZQ*uTtt}f?l
+zD5{~+Ra&MT)tY8bRx9;jQLAXRTwN;!7dC=Z`RWDq7NJSKb{*A=Sf-+Pl*7N0Mg?#S
+Wv;jM%Kfnd!0nj53@#K;G7yk{JSS9lS
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js
+new file mode 100755
+index 0000000..f364443
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/js/jquery.min.js
+@@ -0,0 +1,6 @@
++/*! 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
+diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/js/script.js b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/js/script.js
+new file mode 100755
+index 0000000..03e5739
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/js/script.js
+@@ -0,0 +1,228 @@
++/**
++ * Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
++ *
++ * luci-theme-material
++ * Copyright 2015 Lutty Yang <lutty@wcan.in>
++ *
++ * Have a bug? Please create an issue here on GitHub!
++ * https://github.com/LuttyYang/luci-theme-material/issues
++ *
++ * luci-theme-bootstrap:
++ * Copyright 2008 Steven Barth <steven@midlink.org>
++ * Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ * Copyright 2012 David Menting <david@nut-bolt.nl>
++ *
++ * MUI:
++ * https://github.com/muicss/mui
++ *
++ * Licensed to the public under the Apache License 2.0
++ */
++(function ($) {
++ $(".main > .loading").fadeOut();
++
++ /**
++ * trim text, Remove spaces, wrap
++ * @param text
++ * @returns {string}
++ */
++ function trimText(text) {
++ return text.replace(/[ \t\n\r]+/g, " ");
++ }
++
++
++ var lastNode = undefined;
++ var mainNodeName = undefined;
++
++ var nodeUrl = "";
++ (function(node){
++ if (node[0] == "admin"){
++ luciLocation = [node[1], node[2]];
++ }else{
++ luciLocation = node;
++ }
++
++ for(var i in luciLocation){
++ nodeUrl += luciLocation[i];
++ if (i != luciLocation.length - 1){
++ nodeUrl += "/";
++ }
++ }
++ })(luciLocation);
++
++ /**
++ * get the current node by Burl (primary)
++ * @returns {boolean} success?
++ */
++ function getCurrentNodeByUrl() {
++ var ret = false;
++ if (!$('body').hasClass('logged-in')) {
++ luciLocation = ["Main", "Login"];
++ return true;
++ }
++
++ $(".main > .main-left > .nav > .slide > .menu").each(function () {
++ var ulNode = $(this);
++ ulNode.next().find("a").each(function () {
++ var that = $(this);
++ var href = that.attr("href");
++
++ if (href.indexOf(nodeUrl) != -1) {
++ ulNode.click();
++ ulNode.next(".slide-menu").stop(true, true);
++ lastNode = that.parent();
++ lastNode.addClass("active");
++ ret = true;
++ return true;
++ }
++ });
++ });
++ return ret;
++ }
++
++ /**
++ * menu click
++ */
++ $(".main > .main-left > .nav > .slide > .menu").click(function () {
++ var ul = $(this).next(".slide-menu");
++ var menu = $(this);
++ if (!ul.is(":visible")) {
++ menu.addClass("active");
++ ul.addClass("active");
++ ul.stop(true).slideDown("fast");
++ } else {
++ ul.stop(true).slideUp("fast", function () {
++ menu.removeClass("active");
++ ul.removeClass("active");
++ });
++ }
++ });
++
++ /**
++ * hook menu click and add the hash
++ */
++ $(".main > .main-left > .nav > .slide > .slide-menu > li > a").click(function () {
++ if (lastNode != undefined) lastNode.removeClass("active");
++ $(this).parent().addClass("active");
++ $(".main > .loading").fadeIn("fast");
++ return true;
++ });
++
++ /**
++ * fix menu click
++ */
++ $(".main > .main-left > .nav > .slide > .slide-menu > li").click(function () {
++ if (lastNode != undefined) lastNode.removeClass("active");
++ $(this).addClass("active");
++ $(".main > .loading").fadeIn("fast");
++ window.location = $($(this).find("a")[0]).attr("href");
++ return;
++ });
++
++ /**
++ * get current node and open it
++ */
++ if (getCurrentNodeByUrl()) {
++ mainNodeName = "node-" + luciLocation[0] + "-" + luciLocation[1];
++ mainNodeName = mainNodeName.replace(/[ \t\n\r\/]+/g, "_").toLowerCase();
++ $("body").addClass(mainNodeName);
++ }
++ $(".cbi-button-up").val("");
++ $(".cbi-button-down").val("");
++
++
++ /**
++ * hook other "A Label" and add hash to it.
++ */
++ $("#maincontent > .container").find("a").each(function () {
++ var that = $(this);
++ var onclick = that.attr("onclick");
++ if (onclick == undefined || onclick == "") {
++ that.click(function () {
++ var href = that.attr("href");
++ if (href.indexOf("#") == -1) {
++ $(".main > .loading").fadeIn("fast");
++ return true;
++ }
++ });
++ }
++ });
++
++ /**
++ * Sidebar expand
++ */
++ var showSide = false;
++ $(".showSide").click(function () {
++ if (showSide) {
++ $(".darkMask").stop(true).fadeOut("fast");
++ $(".main-left").stop(true).animate({
++ width: "0"
++ }, "fast");
++ $(".main-right").css("overflow-y", "auto");
++ showSide = false;
++ } else {
++ $(".darkMask").stop(true).fadeIn("fast");
++ $(".main-left").stop(true).animate({
++ width: "15rem"
++ }, "fast");
++ $(".main-right").css("overflow-y", "hidden");
++ showSide = true;
++ }
++ });
++
++
++ $(".darkMask").click(function () {
++ if (showSide) {
++ showSide = false;
++ $(".darkMask").stop(true).fadeOut("fast");
++ $(".main-left").stop(true).animate({
++ width: "0"
++ }, "fast");
++ $(".main-right").css("overflow-y", "auto");
++ }
++ });
++
++ $(window).resize(function () {
++ if ($(window).width() > 921) {
++ $(".main-left").css("width", "");
++ $(".darkMask").stop(true);
++ $(".darkMask").css("display", "none");
++ showSide = false;
++ }
++ });
++
++ /**
++ * fix legend position
++ */
++ $("legend").each(function () {
++ var that = $(this);
++ that.after("<span class='panel-title'>" + that.text() + "</span>");
++ });
++
++
++ $(".main-right").focus();
++ $(".main-right").blur();
++ $("input").attr("size", "0");
++
++ if (mainNodeName != undefined) {
++ console.log(mainNodeName);
++ switch (mainNodeName) {
++ case "node-status-system_log":
++ case "node-status-kernel_log":
++ $("#syslog").focus(function () {
++ $("#syslog").blur();
++ $(".main-right").focus();
++ $(".main-right").blur();
++ });
++ break;
++ case "node-status-firewall":
++ var button = $(".node-status-firewall > .main fieldset li > a");
++ button.addClass("cbi-button cbi-button-reset a-to-btn");
++ break;
++ case "node-system-reboot":
++ var button = $(".node-system-reboot > .main > .main-right p > a");
++ button.addClass("cbi-button cbi-input-reset a-to-btn");
++ break;
++ }
++ }
++
++})(jQuery);
+diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/logo.png b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/logo.png
+new file mode 100755
+index 0000000000000000000000000000000000000000..459148c6b63b5eb12b858859dfaa22d88b91db90
+GIT binary patch
+literal 2224
+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
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/themes/luci-theme-material/luasrc/view/themes/material/footer.htm b/feeds/luci/themes/luci-theme-material/luasrc/view/themes/material/footer.htm
+new file mode 100755
+index 0000000..edf85dc
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-material/luasrc/view/themes/material/footer.htm
+@@ -0,0 +1,51 @@
++<%#
++ Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
++
++ luci-theme-material
++ Copyright 2015 Lutty Yang <lutty@wcan.in>
++
++ Have a bug? Please create an issue here on GitHub!
++ https://github.com/LuttyYang/luci-theme-material/issues
++
++ luci-theme-bootstrap:
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2012 David Menting <david@nut-bolt.nl>
++
++ MUI:
++ https://github.com/muicss/mui
++
++ Licensed to the public under the Apache License 2.0
++-%>
++
++<%
++ local ver = require "luci.version"
++ local disp = require "luci.dispatcher"
++ local request = disp.context.path
++ local category = request[1]
++ local tree = disp.node()
++ local categories = disp.node_childs(tree)
++%>
++ </div>
++ <footer class="mobile-hide">
++ <a href="https://github.com/openwrt/luci">Powered by <%= ver.luciname %> (<%= ver.luciversion %>)</a> /
++ <a href="https://openwrt.org/"><%= ver.distversion %></a>
++ <% if #categories > 1 then %>
++ <ul class="breadcrumb pull-right" id="modemenu">
++ <% for i, r in ipairs(categories) do %>
++ <li<% if request[1] == r then %> class="active"<%end%>><a href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a> <span class="divider">|</span></li>
++ <% end %>
++ </ul>
++ <% end %>
++ </footer>
++ </div>
++ </div>
++
++ <script>
++ // thanks for Jo-Philipp Wich <jow@openwrt.org>
++ var luciLocation = <%= luci.http.write_json(luci.dispatcher.context.path) %>;
++ </script>
++ <script src="<%=media%>/js/jquery.min.js"></script>
++ <script src="<%=media%>/js/script.js"></script>
++</body>
++</html>
+diff --git a/feeds/luci/themes/luci-theme-material/luasrc/view/themes/material/header.htm b/feeds/luci/themes/luci-theme-material/luasrc/view/themes/material/header.htm
+new file mode 100755
+index 0000000..46e008d
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-material/luasrc/view/themes/material/header.htm
+@@ -0,0 +1,232 @@
++<%#
++ Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI
++
++ luci-theme-material
++ Copyright 2015 Lutty Yang <lutty@wcan.in>
++
++ Have a bug? Please create an issue here on GitHub!
++ https://github.com/LuttyYang/luci-theme-material/issues
++
++ luci-theme-bootstrap:
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Copyright 2012 David Menting <david@nut-bolt.nl>
++
++ MUI:
++ https://github.com/muicss/mui
++
++ Licensed to the public under the Apache License 2.0
++-%>
++
++<%
++ local ver = require "luci.version"
++ local sys = require "luci.sys"
++ local util = require "luci.util"
++ local http = require "luci.http"
++ local disp = require "luci.dispatcher"
++
++ local boardinfo = util.ubus("system", "board")
++
++ local request = disp.context.path
++ local request2 = disp.context.request
++
++ local category = request[1]
++ local cattree = category and disp.node(category)
++
++ local leaf = request2[#request2]
++
++ local tree = disp.node()
++ local node = disp.context.dispatched
++
++ local categories = disp.node_childs(tree)
++
++ local c = tree
++ local i, r
++
++ -- tag all nodes leading to this page
++ for i, r in ipairs(request) do
++ if c.nodes and c.nodes[r] then
++ c = c.nodes[r]
++ c._menu_selected = true
++ end
++ end
++
++ -- send as HTML5
++ http.prepare_content("text/html")
++
++ local function nodeurl(prefix, name, query)
++ local url = controller .. prefix .. name .. "/"
++ if query then
++ url = url .. http.build_querystring(query)
++ end
++ return pcdata(url)
++ end
++
++ local function subtree(prefix, node, level)
++ if not level then
++ level = 1
++ end
++
++ local childs = disp.node_childs(node)
++ if #childs > 0 then
++
++ if level > 2 then
++%>
++ <ul class="tabs">
++ <%
++ end
++
++ local selected_node
++ local selected_name
++ local i, v
++
++ for i, v in ipairs(childs) do
++ local nnode = node.nodes[v]
++ if nnode._menu_selected then
++ selected_node = nnode
++ selected_name = v
++ end
++ if level > 2 then
++ %>
++ <li class="tabmenu-item-<%=v%><%- if nnode._menu_selected or (node.leaf and v == leaf) then %> active<% end %>">
++ <a href="<%=nodeurl(prefix, v, nnode.query)%>"><%=striptags(translate(nnode.title))%></a>
++ </li>
++ <% end
++ end
++
++ if level > 2 then
++ %>
++ </ul>
++<% end
++
++ if selected_node then
++ subtree(prefix .. selected_name .. "/", selected_node, level + 1)
++ end
++ end
++ end
++-%>
++<!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="msapplication-TileImage" content="<%=media%>/logo.png"/>
++ <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 class="container">
++ <span class="showSide"></span>
++ <a class="brand" href="#"><%=boardinfo.hostname or "?"%></a>
++ <div class="pull-right">
++ <%
++ -- calculate the number of unsaved changes
++ if tree.nodes[category] and tree.nodes[category].ucidata then
++ local ucichanges = 0
++ for i, j in pairs(require("luci.model.uci").cursor():changes()) do
++ for k, l in pairs(j) do
++ for m, n in pairs(l) do
++ ucichanges = ucichanges + 1;
++ end
++ end
++ end
++ %>
++ <% if ucichanges > 0 then %>
++ <a class="label notice" href="<%=controller%>/<%=category%>/uci/changes?redir=<%=http.urlencode(http.formvalue("redir") or REQUEST_URI)%>"><span class="mobile-hide"><%:Unsaved Changes%>: </span><%=ucichanges%></a>
++ <% end %>
++ <span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
++ <span class="label success" id="xhr_poll_status_on"><span class="mobile-hide"><%:Auto Refresh%> </span><%:on%></span>
++ <span class="label" id="xhr_poll_status_off" style="display:none"><span class="mobile-hide"><%:Auto Refresh%> </span><%:off%></span>
++ </span>
++ <% end %>
++ </div>
++ </div>
++</header>
++
++ <div class="main">
++ <div style="" class="loading"><span><div class="loading-img"></div>Loading...</span></div>
++ <div class="main-left">
++ <ul class="nav">
++ <%-
++ local function submenu(prefix, node)
++ local childs = disp.node_childs(node)
++ if #childs > 0 then
++ %>
++ <ul class="slide-menu">
++ <%-
++ for i, r in ipairs(childs) do
++ local nnode = node.nodes[r]
++ local href = controller .. prefix .. r ..
++ (nnode.query and http.build_querystring(nnode.query) or "")
++ %>
++ <li><a data-title="<%=pcdata(striptags(nnode.title))%>" href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(nnode.title)))%></a></li>
++ <%-
++ end
++ %>
++ </ul>
++ <%-
++ end
++ end
++
++ childs = disp.node_childs(cattree)
++
++ if #childs > 0 then
++ for i, r in ipairs(childs) do
++ local nnode = cattree.nodes[r]
++ local href = controller .. "/" .. category .. "/" .. r ..
++ (nnode.query and http.build_querystring(k.query) or "")
++ local grandchildren = disp.node_childs(nnode)
++
++ if #grandchildren > 0 then
++ %>
++ <li class="slide">
++ <a class="menu" data-title="<%=pcdata(striptags(nnode.title))%>" href="#"><%=pcdata(striptags(translate(nnode.title)))%></a>
++ <%- submenu("/" .. category .. "/" .. r .. "/", nnode) %>
++ </li>
++ <% else %>
++ <li>
++ <a data-title="<%=pcdata(striptags(nnode.title))%>" href="<%=pcdata(href)%>"><%=pcdata(striptags(translate(nnode.title)))%></a>
++ </li>
++ <%
++ end
++ end
++ end
++ %>
++ </ul>
++ </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 subtree("/" .. category .. "/", cattree) end %>
++
+diff --git a/feeds/luci/themes/luci-theme-material/root/etc/uci-defaults/luci-theme-material b/feeds/luci/themes/luci-theme-material/root/etc/uci-defaults/luci-theme-material
+new file mode 100755
+index 0000000..b013378
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-material/root/etc/uci-defaults/luci-theme-material
+@@ -0,0 +1,7 @@
++#!/bin/sh
++uci batch <<-EOF
++ set luci.themes.Material=/luci-static/material
++ set luci.main.mediaurlbase=/luci-static/material
++ commit luci
++EOF
++exit 0
+diff --git a/feeds/luci/themes/luci-theme-openwrt/Makefile b/feeds/luci/themes/luci-theme-openwrt/Makefile
+new file mode 100644
+index 0000000..b873d80
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-openwrt/Makefile
+@@ -0,0 +1,14 @@
++#
++# 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_TITLE:=LuCI OpenWrt.org theme
++LUCI_DEPENDS:=
++
++include ../../luci.mk
++
++# call BuildPackage - OpenWrt buildroot signature
+diff --git a/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css b/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css
+new file mode 100644
+index 0000000..4a6877f
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/cascade.css
+@@ -0,0 +1,1034 @@
++@charset "utf-8";
++
++.lang_he {
++ direction: RTL;
++ unicode-bidi: embed;
++}
++
++@media all {
++
++html {
++ min-height: 100%;
++ height: auto;
++ position:relative;
++}
++
++body {
++ color: #ffffff;
++ background-color: #4a6b7c;
++ background-position: bottom center;
++ background-repeat: repeat-x;
++ font-family: Verdana, Arial, sans-serif;
++ font-size: 11pt;
++ line-height: 100%;
++ padding-bottom: 1.5em;
++}
++
++* {
++ margin: 0;
++ padding: 0;
++}
++
++a img {
++ border: none;
++ text-decoration: none;
++}
++
++ul.tabmenu {
++ margin: 0;
++ clear: both;
++ display: block;
++ vertical-align: bottom;
++ font-size: 10pt;
++ padding: 5px 0 0 5px;
++}
++
++div.tabmenu2 {
++ background-color: #AAAAAA;
++ background-image: url(tabbg.png);
++ background-repeat: repeat-x;
++ margin-top: -1px;
++ border: 1px solid #444444;
++ border-bottom: none;
++}
++
++div.tabmenu3,
++div.tabmenu4,
++div.tabmenu5 {
++ background-color: #AAAAAA;
++ background-image: url(tabbg.png);
++ background-repeat: repeat-x;
++ border: none;
++}
++
++ul.tabmenu li {
++ float: left;
++ display: block;
++ overflow: hidden;
++}
++
++.lang_he ul.tabmenu li {
++ float: right;
++}
++
++ul.tabmenu li a {
++ text-decoration: none;
++ color: #444444;
++ display: block;
++ padding: 3px 8px;
++ margin: 0 2px;
++ line-height: 1.3em;
++ border: 1px solid transparent;
++ border-bottom: none;
++ font-size: 85%;
++}
++
++ul.tabmenu li.active a {
++ font-weight: bold;
++ color: #000000;
++ background: #f5f5f5;
++ border: 1px solid #AAAAAA;
++ border-bottom: none;
++}
++
++ul.tabmenu li a:hover {
++ color: #444444;
++ border-color: #444444;
++}
++
++ul.l1 li a {
++ background-color: #AAAAAA;
++ background-image: url(tabbg.png);
++ background-repeat: repeat-x;
++ border-color: #444444;
++}
++
++ul.l1 li.tabmenu-item-logout a {
++ margin-left: 30px;
++}
++
++.lang_he ul.l1 li.tabmenu-item-logout a {
++ margin-right: 30px;
++}
++
++abbr,
++acronym {
++ font-style: normal;
++ font-variant: normal;
++}
++
++abbr[title],
++acronym[title] {
++ border-bottom: 1px dotted;
++ cursor: help;
++}
++
++a:link abbr[title],
++a:visited abbr[title],
++a:link acronym[title],
++a:visited acronym[title] {
++ cursor: pointer;
++}
++
++code {
++ font-family: monospace;
++ white-space: pre;
++}
++
++#maincontent ul {
++ margin-left: 2em;
++}
++
++.warning {
++ color: red;
++ background-color: white;
++ font-weight: bold;
++}
++
++.clear {
++ clear: both;
++}
++
++.skiplink,
++.navigation,
++.hidden {
++ position: absolute;
++ left: -1000px;
++ top: -1000px;
++ width: 0px;
++ height: 0px;
++ overflow: hidden;
++ display: inline;
++}
++
++.error {
++ color: #ff0000;
++ background-color: white;
++}
++
++div.hostinfo {
++ float: left;
++ margin: 0;
++ padding: 0;
++ width: auto;
++ font-size: 80%;
++ padding: 0.5em;
++}
++
++.lang_he div.hostinfo {
++ float: right;
++}
++
++#xhr_poll_status {
++ cursor: pointer;
++}
++
++#xhr_poll_status #xhr_poll_status_off {
++ font-weight: bold;
++ color: #FF0000;
++}
++
++#xhr_poll_status #xhr_poll_status_on {
++ font-weight: bold;
++ color: #00FF00;
++}
++
++#menubar {
++ position: relative;
++ width: 100%;
++ background: #000000;
++ color: #ffffff;
++}
++
++#menubar .warning {
++ color: red;
++ background-color: #557788;
++}
++
++html #menubar a:link,
++html #menubar a:visited {
++ position: relative;
++ display: block;
++ padding: 0.5em;
++ background: #000000;
++ color: #ffffff;
++ text-decoration: none;
++ font-size: 80%;
++ font-weight: normal;
++}
++
++
++html #menubar a:link:hover,
++html #menubar a:visited:hover,
++html #menubar a:link:active,
++html #menubar a:visited:active,
++#menubar a:link:focus,
++#menubar a:visited:focus {
++ background: #000000;
++ color: #ffff00;
++ font-weight: bold;
++}
++
++html #menubar a:link.active,
++html #menubar a:visited.active,
++html #menubar a:link.preactive,
++html #menubar a:visited.preactive {
++ background: #000000;
++ color: #ffff00;
++ font-weight: bold;
++}
++
++html #menubar a:link.warning,
++html #menubar a:visited.warning {
++ background: #000000;
++ color: red;
++ font-weight: bold;
++}
++
++#modemenu {
++ width: auto;
++ background: #000000;
++ color: #ffffff;
++ list-style: none;
++ margin-right: 1px;
++ margin-left: 2em;
++ float: right;
++}
++
++#modemenu li {
++ float: right;
++ list-style: none;
++}
++
++#savemenu {
++ float: right;
++}
++
++.lang_he #savemenu {
++ float: left;
++}
++
++.lang_de #submenu_admin_uci {
++ width: 12em;
++}
++
++.lang_ru #submenu_admin_uci {
++ width: 11.5em;
++}
++
++textarea#syslog {
++ width: 98%;
++ min-height: 500px;
++ border: 3px solid #cccccc;
++ padding: 5px;
++ font-family: monospace;
++}
++
++#maincontainer {
++ clear: both;
++ width: 96%;
++ margin: 0 auto;
++ height:100%;
++}
++
++#maincontent {
++ padding: 0.5em;
++ background: #f5f5f5;
++ color: #000000;
++ font-size: 80%;
++ border-width: 0 1px 1px 1px;
++ border-style: solid;
++ border-color: #444444;
++}
++
++.lang_he #maincontent {
++ direction: rtl;
++}
++
++#maincontent h2 {
++ font-size: 150%;
++ font-family: Trebuchet MS, Verdana, sans-serif;
++ font-weight: bold;
++ margin: 0.25em 0 0.7em 0;
++ border-bottom: 1px solid;
++ padding-top: 10px;
++ padding-bottom: 4px;
++}
++
++#maincontent h3 {
++ margin: 0.5em 0 1.1em 0;
++ 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;
++}
++
++.cbi-section legend {
++ font-size: 110%;
++ font-weight: bold;
++ height: 1em;
++ padding: 0 0.25em;
++ background-color: transparent;
++ color: #555555;
++}
++
++.cbi-section h2 {
++ margin: 0em 0 0.5em -0.5em !important;
++}
++
++.cbi-section h3 {
++ text-decoration: none !important;
++ font-weight: bold !important;
++ color: #555555 !important;
++ margin: 0.25em !important;
++ font-size: 100% !important;
++}
++
++.cbi-section-descr {
++ margin-bottom: 0.5em;
++ font-size: 95%;
++}
++
++.cbi-title-ref {
++ color: inherit;
++ text-decoration: none;
++ padding-right: 18px;
++ background: url('../resources/cbi/link.gif') no-repeat scroll right center;
++ background-color: inherit;
++}
++
++ul.cbi-apply {
++ font-size: 90%;
++}
++
++input:-webkit-input-placeholder {
++ color: #AAAAAA;
++}
++
++input:-moz-placeholder {
++ color: #AAAAAA;
++}
++
++input:-ms-input-placeholder {
++ color: #AAAAAA;
++}
++
++input[type=submit],
++input[type=reset],
++input[type=image],
++input[type=button] {
++ cursor: pointer;
++}
++
++select,
++input,
++textarea {
++ background: #eeeeee;
++ color: #000000;
++ border-width: 1px;
++ border-color: #000000;
++}
++
++input[type=image] {
++ border: none;
++}
++
++input:focus,
++input:hover,
++select:focus,
++select:hover {
++ background-color: #ffffff;
++ color: #000000;
++}
++
++select,
++input[type=text],
++input[type=password] {
++ width: 20em;
++}
++
++td select,
++td input[type=text],
++td input[type=password] {
++ width: 99%;
++}
++
++img.cbi-image-button {
++ cursor: pointer;
++ margin: 0 2px;
++ 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;
++}
++
++input.cbi-input-reset,
++input.cbi-button-reset {
++ background-image: url('../resources/cbi/reset.gif');
++ color: #000000;
++ padding-left: 17px;
++ padding-right: 1px;
++}
++
++input.cbi-input-save,
++input.cbi-button-save {
++ background-image: url('../resources/cbi/save.gif');
++ color: #000000;
++ padding-left: 17px;
++ padding-right: 1px;
++}
++
++input.cbi-input-apply,
++input.cbi-button-apply {
++ background-image: url('../resources/cbi/apply.gif');
++ color: #000000;
++ padding-left: 17px;
++ padding-right: 1px;
++}
++
++input.cbi-input-link,
++input.cbi-button-link {
++ background-image: url('../resources/cbi/link.gif');
++ color: #000000;
++ padding-left: 17px;
++ padding-right: 1px;
++}
++
++input.cbi-input-download,
++input.cbi-button-download {
++ background-image: url('../resources/cbi/download.gif');
++ color: #000000;
++ padding-left: 17px;
++ padding-right: 1px;
++}
++
++input.cbi-input-remove,
++div.cbi-section-remove input {
++ background-image: url('../resources/cbi/remove.gif');
++ color: #000000;
++ padding-left: 17px;
++ padding-right: 1px;
++}
++
++input.cbi-button-up {
++ background-image: url('../resources/cbi/up.gif');
++ padding-left: 11px;
++ padding-right: 1px;
++}
++
++input.cbi-button-down {
++ background-image: url('../resources/cbi/down.gif');
++ padding-left: 11px;
++ padding-right: 1px;
++}
++
++input.cbi-button-edit {
++ background-image: url('../resources/cbi/edit.gif');
++ color: #000000;
++ padding-left: 17px;
++ padding-right: 1px;
++}
++
++input.cbi-button-reload {
++ background-image: url('../resources/cbi/reload.gif');
++ color: #000000;
++ padding-left: 17px;
++ padding-right: 1px;
++}
++
++input.cbi-button-reset {
++ background-image: url('../resources/cbi/reset.gif');
++ color: #000000;
++ padding-left: 17px;
++ padding-right: 1px;
++}
++
++input.cbi-button-remove {
++ background-image: url('../resources/cbi/remove.gif');
++ color: #000000;
++ padding-left: 17px;
++ padding-right: 1px;
++}
++
++.cbi-input-invalid {
++ background-image: url('../resources/cbi/reset.gif');
++ background-repeat: no-repeat;
++ background-position: right;
++ color: #FF0000 !important;
++ 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.smalltext {
++ background: #f5f5f5;
++ color: #000000;
++ border-top: 1px solid #666666;
++ border-right: 1px solid #666666;
++ border-bottom: 1px solid #666666;
++ font-size: 90%;
++ width: 80%;
++ margin-left: auto;
++ margin-right: auto;
++ border-collapse: collapse;
++}
++
++table.smalltext tr:hover td {
++ background-color: #bbddee;
++ color: #000000;
++}
++
++table.smalltext tr th {
++ padding: 0 0.25em;
++ border-left: 1px solid #666666;
++ text-align: left;
++}
++
++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 {
++ 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 {
++ clear: left;
++ vertical-align: middle;
++ padding: 0.25em 0.6em;
++ border-bottom: 1px dotted #bbbbbb;
++}
++
++div.cbi-value:hover {
++ background: #f8f8f8;
++ color: #000000;
++}
++
++.cbi-value-title {
++ float: left;
++ width: 40%;
++ line-height: 1.8em;
++}
++
++div.cbi-value-field {
++ width: 58%;
++ margin-left: 40%;
++ padding: 0.25em 0;
++}
++
++div.cbi-value-description {
++ font-size: 90%;
++ display: inline;
++}
++
++div.cbi-section-create {
++ clear: left;
++ white-space: nowrap;
++ vertical-align: top;
++}
++
++div.cbi-section-create .cbi-button {
++ margin: 0.25em;
++}
++
++input.cbi-section-create-name {
++ margin-right: -0.25em;
++}
++
++div.cbi-map-descr {
++ margin-bottom: 1em;
++}
++
++div.cbi-optionals {
++ padding: 0.25em;
++ 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;
++}
++
++.cbi-section-node-tabbed {
++ border-top-left-radius: 0;
++}
++
++.cbi-section-node .cbi-value-last {
++ border-bottom: none;
++}
++
++.cbi-section-node table div {
++ padding-bottom: 0;
++ border-bottom: none;
++}
++
++.cbi-section-node div.cbi-section-table-row {
++ margin: 0.25em;
++}
++
++table.cbi-section-table {
++ width: 100%;
++ font-size: 95%;
++}
++
++table.cbi-section-table th,
++table.cbi-section-table td {
++ text-align: center;
++}
++
++tr.cbi-section-table-descr th {
++ font-weight: normal;
++ font-size: 90%;
++ vertical-align: top;
++}
++
++td.cbi-section-table-optionals {
++ text-align: left !important;
++ padding-top: 1em;
++}
++
++.cbi-value-helpicon img {
++ vertical-align: bottom;
++}
++
++div.cbi-error {
++ font-size: 95%;
++ font-weight: bold;
++ color: #ff0000;
++ background-color: #ffffff;
++}
++
++td.cbi-value-error {
++ border-color: red;
++}
++
++.cbi-value-error input,
++.cbi-value-error select {
++ color: red;
++ background-color: #ffcccc;
++}
++
++.cbi-section-error {
++ color: red;
++ background-color: white;
++ font-size: 95%;
++ border: 1px dotted red;
++ margin: 3px;
++ padding: 3px;
++}
++
++.cbi-value-field var {
++ color: #2222FF;
++}
++
++ul.cbi-tabmenu {
++ padding: 3px 0;
++ margin-left: 0 !important;
++ list-style-type: none;
++ position: relative;
++ z-index: 10;
++ top: 4px;
++ line-height: 20px;
++}
++
++ul.cbi-tabmenu li.cbi-tab,
++ul.cbi-tabmenu li.cbi-tab-disabled {
++ display: inline;
++ margin: 0;
++}
++
++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;
++ 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;
++}
++
++ul.cbi-tabmenu li a:hover {
++ color: #000000;
++}
++
++ul.cbi-tabmenu li.cbi-tab a {
++ padding-top: 4px;
++ color: #000000;
++ background-color: #FFFFFF;
++}
++
++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;
++}
++
++.left {
++ text-align: left !important;
++}
++
++.right {
++ text-align: right !important;
++}
++
++.luci {
++ position: absolute;
++ bottom: 0;
++ left: 1em;
++ height: 1.5em;
++ font-size: 80%;
++}
++
++.luci a:link,
++.luci a:visited {
++ background-color: transparent;
++ color: #666666;
++ text-decoration: none;
++ font-size: 70%;
++}
++
++.inline {
++ display: inline;
++}
++
++.error500 {
++ white-space: normal;
++ border: 1px dotted #ff0000;
++ background-color: #ffffff;
++ color: #000000;
++ padding: 0.5em;
++}
++
++.errorbox {
++ border: 1px solid #FF0000;
++ background-color: #FFCCCC;
++ padding: 5px;
++ margin-bottom: 5px;
++}
++
++.errorbox a {
++ color: #000000 !important;
++}
++
++
++.ifacebox {
++ background-color: #FFFFFF;
++ border: 1px solid #CCCCCC;
++ margin: 0 10px;
++ text-align: center;
++ white-space: nowrap;
++}
++
++.ifacebox .ifacebox-head {
++ border-bottom: 1px solid #CCCCCC;
++ padding: 2px;
++}
++
++.ifacebox .ifacebox-body {
++ padding: 2px;
++}
++
++
++.ifacebadge {
++ background-color: #FFFFFF;
++ border: 1px solid #CCCCCC;
++ padding: 2px;
++ margin-left: 2px;
++ display: inline-block;
++}
++
++.ifacebadge-active {
++ border-color: #000000;
++ font-weight: bold;
++}
++
++
++.zonebadge {
++ padding: 2px;
++ display: inline-block;
++ white-space: nowrap;
++ cursor: pointer;
++}
++
++.zonebadge em,
++.zonebadge strong {
++ margin: 3px;
++ display: inline-block;
++}
++
++.zonebadge input {
++ width: 6em;
++ height: 1.5em;
++}
++
++.zonebadge-empty {
++ border: 1px dashed #AAAAAA;
++ color: #AAAAAA;
++ font-style: italic;
++ font-size: smaller;
++}
++
++
++.uci-change-list {
++ font-family: monospace;
++}
++
++.uci-change-list ins,
++.uci-change-legend-label ins {
++ text-decoration: none;
++ border: 1px solid #00FF00;
++ background-color: #CCFFCC;
++ display: block;
++ padding: 2px;
++}
++
++.uci-change-list del,
++.uci-change-legend-label del {
++ text-decoration: none;
++ border: 1px solid #FF0000;
++ background-color: #FFCCCC;
++ display: block;
++ font-style: normal;
++ padding: 2px;
++}
++
++.uci-change-list var,
++.uci-change-legend-label var {
++ text-decoration: none;
++ border: 1px solid #CCCCCC;
++ background-color: #EEEEEE;
++ display: block;
++ font-style: normal;
++ padding: 2px;
++}
++
++.uci-change-list var ins,
++.uci-change-list var del {
++ /*display: inline;*/
++ border: none;
++ white-space: pre;
++ font-style: normal;
++ padding: 0px;
++}
++
++.uci-change-legend {
++ padding: 5px;
++}
++
++.uci-change-legend-label {
++ width: 150px;
++ float: left;
++ font-size: 80%;
++}
++
++.uci-change-legend-label>ins,
++.uci-change-legend-label>del,
++.uci-change-legend-label>var {
++ float: left;
++ margin-right: 4px;
++ width: 10px;
++ height: 10px;
++ display: block;
++}
++
++.uci-change-legend-label var ins,
++.uci-change-legend-label var del {
++ line-height: 6px;
++ border: none;
++}
++
++
++}
+diff --git a/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie6.css b/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie6.css
+new file mode 100644
+index 0000000..14db3f8
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie6.css
+@@ -0,0 +1,77 @@
++/* 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/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie7.css b/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie7.css
+new file mode 100644
+index 0000000..9e569b2
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie7.css
+@@ -0,0 +1,59 @@
++#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/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie8.css b/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie8.css
+new file mode 100644
+index 0000000..890988c
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/ie8.css
+@@ -0,0 +1,12 @@
++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;
++}
+diff --git a/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/tabbg.png b/feeds/luci/themes/luci-theme-openwrt/htdocs/luci-static/openwrt.org/tabbg.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..c84c437cda41c321b58c331d91291d5ee78b4660
+GIT binary patch
+literal 152
+zcmeAS@N?(olHy`uVBq!ia0vp^j6f{O0VEi%{+3=05-1LGcVbv~PUa<$!<6Lh?!xdj
+zJxX;UkjGiz5n0T@z%2~Ij105pNB{-dOFVsD*>7<(i3%vGKaYzA3dwl7IEHXsPyTW0
+si#YqA!(aG2|4x6Yf7yQ7exG`VTp5YG2iPA^1gc~3boFyt=akR{04u90xBvhE
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm b/feeds/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm
+new file mode 100644
+index 0000000..a056dd8
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/footer.htm
+@@ -0,0 +1,16 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<div class="clear"></div>
++</div>
++</div>
++
++<p class="luci">
++ <% local ver = require "luci.version" -%>
++ Powered by <%= ver.luciname %> (<%= ver.luciversion %>)
++</p>
++</body>
++</html>
+diff --git a/feeds/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm b/feeds/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm
+new file mode 100644
+index 0000000..d43cc9c
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-openwrt/luasrc/view/themes/openwrt.org/header.htm
+@@ -0,0 +1,181 @@
++<%#
++ Copyright 2008 Steven Barth <steven@midlink.org>
++ Copyright 2008-2010 Jo-Philipp Wich <jow@openwrt.org>
++ Licensed to the public under the Apache License 2.0.
++-%>
++
++<%
++ local sys = require "luci.sys"
++ local util = require "luci.util"
++ local http = require "luci.http"
++ local disp = require "luci.dispatcher"
++ local ver = require "luci.version"
++
++ local sysinfo = util.ubus("system", "info") or { }
++ local loadinfo = sysinfo.load or { 0, 0, 0 }
++ local boardinfo = util.ubus("system", "board") or { }
++
++ local request = disp.context.path
++ local request2 = disp.context.request
++
++ local category = request[1]
++ local cattree = category and disp.node(category)
++
++ local leaf = request2[#request2]
++
++ local tree = disp.node()
++ local node = disp.context.dispatched
++
++ local categories = disp.node_childs(tree)
++
++ local c = tree
++ local i, r
++
++ -- tag all nodes leading to this page
++ for i, r in ipairs(request) do
++ if c.nodes and c.nodes[r] then
++ c = c.nodes[r]
++ c._menu_selected = true
++ end
++ end
++
++ http.prepare_content("application/xhtml+xml")
++
++ local function nodeurl(prefix, name, query)
++ local url = controller .. prefix .. name .. "/"
++ if query then
++ url = url .. http.build_querystring(query)
++ end
++ return pcdata(url)
++ end
++
++ local function subtree(prefix, node, level)
++ if not level then
++ level = 1
++ end
++
++ local childs = disp.node_childs(node)
++ if #childs > 0 then
++%>
++ <div class="tabmenu<%=level%>">
++ <ul class="tabmenu l<%=level%>">
++ <%
++ local selected_node
++ local selected_name
++ local i, v
++
++ for i, v in ipairs(childs) do
++ local nnode = node.nodes[v]
++ if nnode._menu_selected then
++ selected_node = nnode
++ selected_name = v
++ end
++ %>
++ <li class="tabmenu-item-<%=v%><% if nnode._menu_selected or (node.leaf and v == leaf) then %> active<% end %>">
++ <a href="<%=nodeurl(prefix, v, nnode.query)%>"><%=striptags(translate(nnode.title))%></a>
++ </li>
++ <%
++ end
++ %>
++ </ul>
++ <br style="clear:both" />
++<%
++ if selected_node then
++ subtree(prefix .. selected_name .. "/", selected_node, level + 1)
++ end
++%>
++ </div>
++<%
++ end
++ end
++-%>
++
++<?xml version="1.0" encoding="utf-8"?>
++<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
++<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 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">
++<%= css %>
++</style>
++<% end -%>
++<script type="text/javascript" src="<%=resource%>/xhr.js"></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%>">
++
++<p class="skiplink">
++<span id="skiplink1"><a href="#navigation"><%:Skip to navigation%></a></span>
++<span id="skiplink2"><a href="#content"><%:Skip to content%></a></span>
++</p>
++
++<div id="menubar">
++<h2 class="navigation"><a id="navigation" name="navigation"><%:Navigation%></a></h2>
++
++<div class="hostinfo">
++ <%=(boardinfo.hostname or "?")%> | <%=ver.distversion%> |
++ <%:Load%>: <%="%.2f" % (loadinfo[1] / 65535.0)%> <%="%.2f" % (loadinfo[2] / 65535.0)%> <%="%.2f" % (loadinfo[3] / 65535.0)%>
++ <span id="xhr_poll_status" style="display:none" onclick="XHR.running() ? XHR.halt() : XHR.run()">
++ | <%:Auto Refresh%>:
++ <span id="xhr_poll_status_on"><%:on%></span>
++ <span id="xhr_poll_status_off" style="display:none"><%:off%></span>
++ </span>
++</div>
++
++<% if #categories > 1 then %>
++ <ul id="modemenu">
++ <% for i, r in ipairs(categories) do %>
++ <li><a<% if request[1] == r then %> class="active"<%end%> href="<%=controller%>/<%=r%>/"><%=striptags(translate(tree.nodes[r].title))%></a></li>
++ <% end %>
++ </ul>
++<% end %>
++
++<%
++if tree.nodes[category] and tree.nodes[category].ucidata then
++ local ucic = 0
++ for i, j in pairs(require("luci.model.uci").cursor():changes()) do
++ for k, l in pairs(j) do
++ for m, n in pairs(l) do
++ ucic = ucic + 1;
++ end
++ end
++ end
++-%>
++<div id="savemenu">
++ <% if ucic > 0 then %>
++ <a class="warning" href="<%=controller%>/<%=category%>/uci/changes/?redir=<%=luci.http.urlencode(luci.http.formvalue("redir") or REQUEST_URI)%>"><%:Unsaved Changes%>: <%=ucic%></a>
++ <%- else -%>
++ <a href="#"><%:Changes%>: 0</a>
++ <% end -%>
++</div><% end %>
++
++<div class="clear"></div>
++</div>
++
++<div id="maincontainer">
++ <div id="tabmenu">
++ <% if category then subtree("/" .. category .. "/", cattree) end %>
++ </div>
++
++ <div id="maincontent">
++ <noscript>
++ <div class="errorbox">
++ <strong><%:Java Script required!%></strong><br />
++ <%:You must enable Java Script in your browser or LuCI will not work properly.%>
++ </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>
++ <%- end -%>
+diff --git a/feeds/luci/themes/luci-theme-openwrt/root/etc/uci-defaults/luci-theme-openwrt b/feeds/luci/themes/luci-theme-openwrt/root/etc/uci-defaults/luci-theme-openwrt
+new file mode 100755
+index 0000000..aa0ba0c
+--- /dev/null
++++ b/feeds/luci/themes/luci-theme-openwrt/root/etc/uci-defaults/luci-theme-openwrt
+@@ -0,0 +1,6 @@
++#!/bin/sh
++uci batch <<-EOF
++ set luci.themes.OpenWrt=/luci-static/openwrt.org
++ set luci.main.mediaurlbase=/luci-static/openwrt.org
++ commit luci
++EOF
+diff --git a/feeds/management/freecwmp/Makefile b/feeds/management/freecwmp/Makefile
+new file mode 100644
+index 0000000..05915b8
+--- /dev/null
++++ b/feeds/management/freecwmp/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freecwmp
++PKG_VERSION:=2014-06-12
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://dev.freecwmp.org/freecwmp
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=8f3c163fc85337e63bfa64da3c02f10d1fe3b169
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_LICENSE:=GPL-2.0+
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++CMAKE_OPTIONS += \
++ -DACS:STRING=multi \
++ -DDEBUG=ON \
++ -DDEVEL=ON
++
++define Package/freecwmp
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=CWMP client
++ DEPENDS:=+libcurl +libfreecwmp +libuci +libubox +libubus +libmicroxml +shflags
++ MAINTAINER:=Luka Perkov <luka@openwrt.org>
++endef
++
++define Package/freecwmp/description
++ A free client implementation of CWMP (TR-069) protocol
++endef
++
++define Package/freecwmp/conffiles
++/etc/config/freecwmp
++/usr/share/freecwmp/defaults
++endef
++
++define Package/freecwmp/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_BUILD_DIR)/bin/freecwmpd $(1)/usr/sbin
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/ext/openwrt/config/freecwmp $(1)/etc/config
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/freecwmpd.init $(1)/etc/init.d/freecwmpd
++ $(INSTALL_DIR) $(1)/usr/share/freecwmp
++ $(CP) $(PKG_BUILD_DIR)/ext/openwrt/scripts/defaults $(1)/usr/share/freecwmp
++ $(CP) $(PKG_BUILD_DIR)/ext/openwrt/scripts/functions $(1)/usr/share/freecwmp
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ext/openwrt/scripts/freecwmp.sh $(1)/usr/sbin/freecwmp
++endef
++
++$(eval $(call BuildPackage,freecwmp))
+diff --git a/feeds/management/freecwmp/files/freecwmpd.init b/feeds/management/freecwmp/files/freecwmpd.init
+new file mode 100644
+index 0000000..b9b7a0c
+--- /dev/null
++++ b/feeds/management/freecwmp/files/freecwmpd.init
+@@ -0,0 +1,12 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2012-2013 OpenWrt.org
++
++START=90
++
++start() {
++ service_start /usr/sbin/freecwmpd
++}
++
++stop() {
++ service_stop /usr/sbin/freecwmpd
++}
+diff --git a/feeds/management/freenetconfd-plugin-examples/Makefile b/feeds/management/freenetconfd-plugin-examples/Makefile
+new file mode 100644
+index 0000000..b07b3eb
+--- /dev/null
++++ b/feeds/management/freenetconfd-plugin-examples/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freenetconfd-plugin-examples
++PKG_VERSION:=2015-06-28
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_LICENSE:=GPL-2.0+
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/freenetconf/freenetconfd-plugins.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=4a5dd9be91aae502b3f6a930558159d4ee6a775a
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/freenetconfd-plugin-examples
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=freenetconfd example plugins
++ URL:=http://www.freenetconf.org/
++ DEPENDS:=+freenetconfd
++endef
++
++CMAKE_OPTIONS += \
++ -DEXAMPLE_PLUGINS=ON
++
++define Package/freenetconfd-plugin-examples/install
++ $(INSTALL_DIR) $(1)/usr/lib/freenetconfd
++ $(CP) \
++ $(PKG_BUILD_DIR)/lib/freenetconfd/*.so \
++ $(1)/usr/lib/freenetconfd/
++
++ $(INSTALL_DIR) $(1)/etc/yang
++ $(INSTALL_CONF) \
++ $(PKG_BUILD_DIR)/examples/yang/*.yang \
++ $(1)/etc/yang/
++endef
++
++$(eval $(call BuildPackage,freenetconfd-plugin-examples))
+diff --git a/feeds/management/freenetconfd/Makefile b/feeds/management/freenetconfd/Makefile
+new file mode 100644
+index 0000000..a91616e
+--- /dev/null
++++ b/feeds/management/freenetconfd/Makefile
+@@ -0,0 +1,70 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freenetconfd
++PKG_VERSION:=2015-10-29
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_LICENSE:=GPL-2.0+
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/freenetconf/freenetconfd.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=669709eee95c55b6190f5949ef1b56a535ad9ec1
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/freenetconfd
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=netconf server
++ URL:=http://www.freenetconf.org/
++ DEPENDS:=+libuci +libubox +libubus +libroxml
++endef
++
++CMAKE_OPTIONS = \
++ -DCMAKE_INSTALL_PREFIX=/ \
++
++define Package/freenetconfd/conffiles
++/etc/config/freenetconfd
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/freenetconfd
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/freenetconfd \
++ $(1)/usr/include
++endef
++
++define Package/freenetconfd/install
++ $(INSTALL_DIR) $(1)/sbin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/freenetconfd \
++ $(1)/sbin/
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) \
++ $(PKG_BUILD_DIR)/config/freenetconfd \
++ $(1)/etc/config/
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) \
++ ./files/freenetconfd.init \
++ $(1)/etc/init.d/freenetconfd
++
++ $(INSTALL_DIR) $(1)/usr/lib/freenetconfd/
++endef
++
++$(eval $(call BuildPackage,freenetconfd))
+diff --git a/feeds/management/freenetconfd/files/freenetconfd.init b/feeds/management/freenetconfd/files/freenetconfd.init
+new file mode 100644
+index 0000000..f0d738c
+--- /dev/null
++++ b/feeds/management/freenetconfd/files/freenetconfd.init
+@@ -0,0 +1,23 @@
++#!/bin/sh /etc/rc.common
++
++START=90
++STOP=10
++
++USE_PROCD=1
++PROG=/sbin/freenetconfd
++
++start_service() {
++
++ if [ ! -d "/etc/netconf" ]; then
++ mkdir -p /etc/netconf
++ fi
++
++ procd_open_instance
++ procd_set_param command "$PROG"
++ procd_close_instance
++}
++
++service_triggers()
++{
++ procd_add_reload_trigger "freenetconfd"
++}
+diff --git a/feeds/management/freesub/Makefile b/feeds/management/freesub/Makefile
+new file mode 100644
+index 0000000..c4c8ff3
+--- /dev/null
++++ b/feeds/management/freesub/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freesub
++PKG_VERSION:=2014-12-03
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/freenetconf/freesub.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=a1a38e80c6642af723d6aa65f64910dcf27cb3da
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_LICENSE:=GPL-2.0+
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/freesub
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=SSH subsystem helper
++ URL:=http://www.freenetconf.org/
++ DEPENDS:=+libubox
++ MAINTAINER:=Luka Perkov <luka@openwrt.org>
++endef
++
++CMAKE_OPTIONS = \
++ -DCMAKE_INSTALL_PREFIX=/usr \
++
++define Package/freesub/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/freesub \
++ $(1)/usr/bin/
++
++ ln -s /usr/bin/freesub $(1)/usr/bin/netconf
++endef
++
++$(eval $(call BuildPackage,freesub))
+diff --git a/feeds/management/libfreecwmp/Makefile b/feeds/management/libfreecwmp/Makefile
+new file mode 100644
+index 0000000..32af814
+--- /dev/null
++++ b/feeds/management/libfreecwmp/Makefile
+@@ -0,0 +1,44 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libfreecwmp
++PKG_VERSION:=2014-06-12
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://dev.libfreecwmp.org/libfreecwmp
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=d2fdd97d66fde14859c06228a922066d9e8b669b
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_LICENSE:=GPL-2.0+
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/libfreecwmp
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=CWMP library
++ URL:=http://libfreecwmp.org/
++ MAINTAINER:=Luka Perkov <luka@openwrt.org>
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libfreecwmp.h $(1)/usr/include
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfreecwmp.{a,so} $(1)/usr/lib
++endef
++
++define Package/libfreecwmp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfreecwmp.so $(1)/usr/lib
++endef
++
++$(eval $(call BuildPackage,libfreecwmp))
+diff --git a/feeds/management/libmicroxml/Makefile b/feeds/management/libmicroxml/Makefile
+new file mode 100644
+index 0000000..3716fc4
+--- /dev/null
++++ b/feeds/management/libmicroxml/Makefile
+@@ -0,0 +1,54 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libmicroxml
++PKG_VERSION:=2012-06-11
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://dev.freecwmp.org/microxml
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=72965423184f24cc0b963d91c2d1863cdb01b6aa
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libmicroxml
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=XML library
++ MAINTAINER:=Luka Perkov <luka@openwrt.org>
++endef
++
++define Package/libmicroxml/description
++ A micro sized XML library
++endef
++
++CONFIGURE_ARGS += \
++ --disable-threads \
++ --enable-static \
++ --enable-shared
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_BUILD_DIR)/microxml.h $(1)/usr/include
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/libmicroxml.so* $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_BUILD_DIR)/microxml.pc $(1)/usr/lib/pkgconfig
++endef
++
++define Package/libmicroxml/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/libmicroxml.so* $(1)/usr/lib
++endef
++
++$(eval $(call BuildPackage,libmicroxml))
+diff --git a/feeds/management/libnetconf/Config.in b/feeds/management/libnetconf/Config.in
+new file mode 100644
+index 0000000..151c268
+--- /dev/null
++++ b/feeds/management/libnetconf/Config.in
+@@ -0,0 +1,39 @@
++menu "Configuration"
++ depends on PACKAGE_libnetconf
++
++ config LIBNETCONF_ENABLE_NOTIFICATIONS
++ bool "Enable support of NETCONF Notifications (RFC 5277)"
++ default y
++
++ config LIBNETCONF_ENABLE_TLS
++ bool "Enable support for NETCONF over TLS using OpenSSL"
++ default y
++
++ config LIBNETCONF_ENABLE_URL
++ bool "Enable support of NETCONF URL Capability (RFC 6241)"
++ default y
++
++ config LIBNETCONF_ENABLE_VALIDATION
++ bool "Enable support for configuration data validation (RFC 6241)"
++ default y
++
++ config LIBNETCONF_ENABLE_YANG_SCHEMAS
++ bool "Enable support for YANG format in <get-schema> operation"
++ default y
++
++ config LIBNETCONF_USE_LIBSSH2
++ bool "Use libssh2 library for SSH transport"
++ default y
++ help
++ If this config is selected, the libssh2 library is
++ used for SSH transport. Otherwise the system SSH
++ client is used.
++
++ config LIBNETCONF_WORKING_DIR
++ string "NETCONF working directory"
++ default '/usr/share/libnetconf/'
++ help
++ Path to a working directory of libnetconf, where all
++ the system files are stored, the default value is
++ /usr/share/libnetconf/
++endmenu
+diff --git a/feeds/management/libnetconf/Makefile b/feeds/management/libnetconf/Makefile
+new file mode 100644
+index 0000000..a1cc64f
+--- /dev/null
++++ b/feeds/management/libnetconf/Makefile
+@@ -0,0 +1,90 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libnetconf
++PKG_VERSION:=0.9.1
++PKG_RELEASE:=1
++PKG_REV:=6558573a8f0b
++PKG_INSTALL:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://code.google.com/p/libnetconf/
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)
++PKG_LICENSE:=BSD-3-Clause
++
++PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/libnetconf
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=NETCONF library
++ URL:=$(PKG_SOURCE_URL)
++ DEPENDS:= \
++ +libxml2 \
++ +zlib \
++ +LIBNETCONF_ENABLE_VALIDATION:libxslt \
++ +LIBNETCONF_ENABLE_URL:libcurl \
++ +LIBNETCONF_USE_LIBSSH2:libssh2
++ MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++endef
++
++define Package/libnetconf/description
++ libnetconf is the NETCONF library in C intended for building NETCONF clients and servers.
++
++ libnetconf provides basic functions to connect NETCONF client and server to each other via
++ SSH, to send and receive NETCONF messages and to store and work with the configuration data
++ in a datastore.
++endef
++
++define Package/libnetconf/config
++ source "$(SOURCE)/Config.in"
++endef
++
++CONFIGURE_ARGS+=\
++ --prefix=/usr/ \
++ --exec-prefix=/usr/ \
++ --without-dnssec \
++ $(call autoconf_bool,CONFIG_LIBNETCONF_USE_LIBSSH2,libssh2) \
++ $(call autoconf_bool,CONFIG_LIBNETCONF_ENABLE_NOTIFICATIONS,notifications) \
++ $(call autoconf_bool,CONFIG_LIBNETCONF_ENABLE_TLS,tls) \
++ $(call autoconf_bool,CONFIG_LIBNETCONF_ENABLE_URL,url) \
++ $(call autoconf_bool,CONFIG_LIBNETCONF_ENABLE_VALIDATION,validation) \
++ $(call autoconf_bool,CONFIG_LIBNETCONF_ENABLE_YANG_SCHEMAS,yang-schemas) \
++ --with-workingdir=$(CONFIG_LIBNETCONF_WORKING_DIR)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libnetconf{,_ssh,_xml}*.h $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/include/libnetconf
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libnetconf/*.h $(1)/usr/include/libnetconf/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnetconf* $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libnetconf.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libnetconf/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnetconf.so* $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)$(CONFIG_LIBNETCONF_WORKING_DIR)
++
++ $(INSTALL_DIR) $(1)/usr/share/libnetconf
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/libnetconf/rnglib $(1)/usr/share/libnetconf/
++endef
++
++$(eval $(call BuildPackage,libnetconf))
+diff --git a/feeds/management/libssh/Makefile b/feeds/management/libssh/Makefile
+new file mode 100644
+index 0000000..9be80a2
+--- /dev/null
++++ b/feeds/management/libssh/Makefile
+@@ -0,0 +1,89 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libssh
++PKG_VERSION:=2014-07-10
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://git.libssh.org/projects/libssh.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=59a179950150d0305d6189ce9c126a9a0c5f6ab4
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_LICENSE:=LGPL-2.1+ BSD-2-Clause
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/libssh
++ SECTION:=lib
++ CATEGORY:=Libraries
++ TITLE:=SSH library
++ DEPENDS:=+libpthread +librt +zlib +libopenssl
++ URL:=http://www.libssh.org/
++ MAINTAINER:=Luka Perkov <luka@openwrt.org>
++endef
++
++define Package/libssh/description
++ libssh is a mulitplatform C library implementing the SSHv2 and SSHv1 protocol
++ for client and server implementations.
++endef
++
++CMAKE_OPTIONS = \
++ -DCMAKE_INSTALL_PREFIX=/usr \
++ -DCMAKE_BUILD_TYPE:STRING=Release \
++ -DHAVE_STRTOULL=1 \
++ -DHAVE_GETADDRINFO=1 \
++ -DHAVE_TERMIOS_H=1 \
++ -DWITH_EXAMPLES=OFF \
++ -DWITH_GCRYPT=OFF \
++ -DWITH_GSSAPI=OFF \
++ -DWITH_LIBZ=ON \
++ -DWITH_NACL=OFF \
++ -DWITH_PCAP=OFF \
++ -DWITH_SERVER=ON \
++ -DWITH_SFTP=ON \
++ -DWITH_SSH1=OFF \
++ -DWITH_TESTING=OFF \
++
++ifeq ($(CONFIG_BIG_ENDIAN),y)
++CMAKE_OPTIONS += -DWITH_BIG_ENDIAN=ON
++else
++CMAKE_OPTIONS += -DWITH_BIG_ENDIAN=OFF
++endif
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/libssh/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/libssh/* \
++ $(1)/usr/include/libssh/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libssh* \
++ $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libssh/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libssh* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libssh))
+diff --git a/feeds/management/libssh/patches/001-compile.patch b/feeds/management/libssh/patches/001-compile.patch
+new file mode 100644
+index 0000000..bd1146b
+--- /dev/null
++++ b/feeds/management/libssh/patches/001-compile.patch
+@@ -0,0 +1,35 @@
++--- a/CMakeLists.txt
+++++ b/CMakeLists.txt
++@@ -35,10 +35,6 @@ include(DefineInstallationPaths)
++ include(DefineOptions.cmake)
++ include(CPackConfig.cmake)
++
++-# disallow in-source build
++-include(MacroEnsureOutOfSourceBuild)
++-macro_ensure_out_of_source_build("${PROJECT_NAME} requires an out of source build. Please create a separate build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there.")
++-
++ # search for libraries
++ if (WITH_ZLIB)
++ find_package(ZLIB REQUIRED)
++--- a/ConfigureChecks.cmake
+++++ b/ConfigureChecks.cmake
++@@ -4,7 +4,6 @@ include(CheckFunctionExists)
++ include(CheckLibraryExists)
++ include(CheckTypeSize)
++ include(CheckCXXSourceCompiles)
++-include(TestBigEndian)
++
++ set(PACKAGE ${APPLICATION_NAME})
++ set(VERSION ${APPLICATION_VERSION})
++@@ -215,6 +214,8 @@ if (WITH_GSSAPI AND NOT GSSAPI_FOUND)
++ endif (WITH_GSSAPI AND NOT GSSAPI_FOUND)
++
++ # ENDIAN
++-if (NOT WIN32)
++- test_big_endian(WORDS_BIGENDIAN)
++-endif (NOT WIN32)
+++if (WITH_BIG_ENDIAN)
+++ set(WORDS_BIGENDIAN 1)
+++else (WITH_BIG_ENDIAN)
+++ set(WORDS_BIGENDIAN 0)
+++endif (WITH_BIG_ENDIAN)
+diff --git a/feeds/management/libssh/patches/002-disable-libssp.patch b/feeds/management/libssh/patches/002-disable-libssp.patch
+new file mode 100644
+index 0000000..a4d9221
+--- /dev/null
++++ b/feeds/management/libssh/patches/002-disable-libssp.patch
+@@ -0,0 +1,22 @@
++--- a/cmake/Modules/DefineCompilerFlags.cmake
+++++ b/cmake/Modules/DefineCompilerFlags.cmake
++@@ -1,7 +1,6 @@
++ # define system dependent compiler flags
++
++ include(CheckCCompilerFlag)
++-include(CheckCCompilerFlagSSP)
++
++ if (UNIX AND NOT WIN32)
++ #
++@@ -21,11 +20,6 @@ if (UNIX AND NOT WIN32)
++ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
++ endif (WITH_FPIC)
++
++- check_c_compiler_flag_ssp("-fstack-protector" WITH_STACK_PROTECTOR)
++- if (WITH_STACK_PROTECTOR)
++- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector")
++- endif (WITH_STACK_PROTECTOR)
++-
++ if (CMAKE_BUILD_TYPE)
++ string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
++ if (CMAKE_BUILD_TYPE_LOWER MATCHES (release|relwithdebinfo|minsizerel))
+diff --git a/feeds/management/libyang/Makefile b/feeds/management/libyang/Makefile
+new file mode 100644
+index 0000000..95e3991
+--- /dev/null
++++ b/feeds/management/libyang/Makefile
+@@ -0,0 +1,75 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libyang
++PKG_VERSION:=0.3.4
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_LICENSE:=GPL-2.0+
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/CESNET/libyang.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=952489bbc94c83e23afdd4a396114996efdc5c9a
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/libyang
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=YANG data modeling language library
++ URL:=https://github.com/CESNET/libyang
++ DEPENDS:=+libpcre
++endef
++
++define Package/yanglint
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=YANG data modeling language utility
++ URL:=https://github.com/CESNET/libyang
++ DEPENDS:=+libyang
++endef
++
++CMAKE_OPTIONS = \
++ -DCMAKE_INSTALL_PREFIX=/
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/lib/libyang.so* \
++ $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/include/libyang
++ $(CP) \
++ $(PKG_INSTALL_DIR)/include/libyang/* \
++ $(1)/usr/include/libyang/
++endef
++
++define Package/libyang/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/lib/libyang.so* \
++ $(1)/usr/lib/
++endef
++
++define Package/yanglint/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) \
++ $(PKG_BUILD_DIR)/yanglint \
++ $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libyang))
++$(eval $(call BuildPackage,yanglint))
+diff --git a/feeds/management/shflags/Makefile b/feeds/management/shflags/Makefile
+new file mode 100644
+index 0000000..d27d535
+--- /dev/null
++++ b/feeds/management/shflags/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=shflags
++PKG_VERSION:=2012-06-11
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/kward/shflags.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=c12b30cebb92b49c5edb6df255c0952c65b4ddc6
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_LICENSE:=LGPL-2.1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/shflags
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=shflags
++ DEPENDS:=+getopt
++ URL:=http://code.google.com/p/shflags/
++ MAINTAINER:=Luka Perkov <luka@openwrt.org>
++endef
++
++define Package/shflags/description
++ command-line flags module for Unix shell scripts
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Build/Install
++endef
++
++define Package/shflags/install
++ $(INSTALL_DIR) $(1)/usr/share/shflags
++ $(CP) $(PKG_BUILD_DIR)/source/1.0/src/shflags $(1)/usr/share/shflags/shflags.sh
++endef
++
++$(eval $(call BuildPackage,shflags))
+diff --git a/feeds/management/shflags/patches/000-strip.patch b/feeds/management/shflags/patches/000-strip.patch
+new file mode 100644
+index 0000000..bc05948
+--- /dev/null
++++ b/feeds/management/shflags/patches/000-strip.patch
+@@ -0,0 +1,763 @@
++--- a/source/1.0/src/shflags
+++++ b/source/1.0/src/shflags
++@@ -1,91 +1,10 @@
++-# $Id$
++-# vim:et:ft=sh:sts=2:sw=2
++-#
++-# Copyright 2008 Kate Ward. All Rights Reserved.
++-# Released under the LGPL (GNU Lesser General Public License)
++-#
++-# shFlags -- Advanced command-line flag library for Unix shell scripts.
++-# http://code.google.com/p/shflags/
++-#
++-# Author: kate.ward@forestent.com (Kate Ward)
++-#
++-# This module implements something like the google-gflags library available
++-# from http://code.google.com/p/google-gflags/.
++-#
++-# FLAG TYPES: This is a list of the DEFINE_*'s that you can do. All flags take
++-# a name, default value, help-string, and optional 'short' name (one-letter
++-# name). Some flags have other arguments, which are described with the flag.
++-#
++-# DEFINE_string: takes any input, and intreprets it as a string.
++-#
++-# DEFINE_boolean: typically does not take any argument: say --myflag to set
++-# FLAGS_myflag to true, or --nomyflag to set FLAGS_myflag to false.
++-# Alternately, you can say
++-# --myflag=true or --myflag=t or --myflag=0 or
++-# --myflag=false or --myflag=f or --myflag=1
++-# Passing an option has the same affect as passing the option once.
++-#
++-# DEFINE_float: takes an input and intreprets it as a floating point number. As
++-# shell does not support floats per-se, the input is merely validated as
++-# being a valid floating point value.
++-#
++-# DEFINE_integer: takes an input and intreprets it as an integer.
++-#
++-# SPECIAL FLAGS: There are a few flags that have special meaning:
++-# --help (or -?) prints a list of all the flags in a human-readable fashion
++-# --flagfile=foo read flags from foo. (not implemented yet)
++-# -- as in getopt(), terminates flag-processing
++-#
++-# EXAMPLE USAGE:
++-#
++-# -- begin hello.sh --
++-# #! /bin/sh
++-# . ./shflags
++-# DEFINE_string name 'world' "somebody's name" n
++-# FLAGS "$@" || exit $?
++-# eval set -- "${FLAGS_ARGV}"
++-# echo "Hello, ${FLAGS_name}."
++-# -- end hello.sh --
++-#
++-# $ ./hello.sh -n Kate
++-# Hello, Kate.
++-#
++-# NOTE: Not all systems include a getopt version that supports long flags. On
++-# these systems, only short flags are recognized.
++-
++-#==============================================================================
++-# shFlags
++-#
++-# Shared attributes:
++-# flags_error: last error message
++-# flags_return: last return value
++-#
++-# __flags_longNames: list of long names for all flags
++-# __flags_shortNames: list of short names for all flags
++-# __flags_boolNames: list of boolean flag names
++-#
++-# __flags_opts: options parsed by getopt
++-#
++-# Per-flag attributes:
++-# FLAGS_<flag_name>: contains value of flag named 'flag_name'
++-# __flags_<flag_name>_default: the default flag value
++-# __flags_<flag_name>_help: the flag help string
++-# __flags_<flag_name>_short: the flag short name
++-# __flags_<flag_name>_type: the flag type
++-#
++-# Notes:
++-# - lists of strings are space separated, and a null value is the '~' char.
++-
++-# return if FLAGS already loaded
++ [ -n "${FLAGS_VERSION:-}" ] && return 0
++ FLAGS_VERSION='1.0.3'
++
++-# return values
++ FLAGS_TRUE=0
++ FLAGS_FALSE=1
++ FLAGS_ERROR=2
++
++-# reserved flag names
++ FLAGS_RESERVED='ARGC ARGV ERROR FALSE HELP PARENT RESERVED TRUE VERSION'
++
++ _flags_debug() { echo "flags:DEBUG $@" >&2; }
++@@ -93,7 +12,6 @@ _flags_warn() { echo "flags:WARN $@" >&2
++ _flags_error() { echo "flags:ERROR $@" >&2; }
++ _flags_fatal() { echo "flags:FATAL $@" >&2; }
++
++-# specific shell checks
++ if [ -n "${ZSH_VERSION:-}" ]; then
++ setopt |grep "^shwordsplit$" >/dev/null
++ if [ $? -ne ${FLAGS_TRUE} ]; then
++@@ -107,20 +25,15 @@ if [ -n "${ZSH_VERSION:-}" ]; then
++ fi
++ fi
++
++-#
++-# constants
++-#
++
++-# getopt version
++ __FLAGS_GETOPT_VERS_STD=0
++ __FLAGS_GETOPT_VERS_ENH=1
++ __FLAGS_GETOPT_VERS_BSD=2
++
++ getopt >/dev/null 2>&1
++ case $? in
++- 0) __FLAGS_GETOPT_VERS=${__FLAGS_GETOPT_VERS_STD} ;; # bsd getopt
+++ 0) __FLAGS_GETOPT_VERS=${__FLAGS_GETOPT_VERS_STD} ;;
++ 2)
++- # TODO(kward): look into '-T' option to test the internal getopt() version
++ if [ "`getopt --version`" = '-- ' ]; then
++ __FLAGS_GETOPT_VERS=${__FLAGS_GETOPT_VERS_STD}
++ else
++@@ -133,82 +46,49 @@ case $? in
++ ;;
++ esac
++
++-# getopt optstring lengths
++ __FLAGS_OPTSTR_SHORT=0
++ __FLAGS_OPTSTR_LONG=1
++
++ __FLAGS_NULL='~'
++
++-# flag info strings
++ __FLAGS_INFO_DEFAULT='default'
++ __FLAGS_INFO_HELP='help'
++ __FLAGS_INFO_SHORT='short'
++ __FLAGS_INFO_TYPE='type'
++
++-# flag lengths
++ __FLAGS_LEN_SHORT=0
++ __FLAGS_LEN_LONG=1
++
++-# flag types
++ __FLAGS_TYPE_NONE=0
++ __FLAGS_TYPE_BOOLEAN=1
++ __FLAGS_TYPE_FLOAT=2
++ __FLAGS_TYPE_INTEGER=3
++ __FLAGS_TYPE_STRING=4
++
++-# set the constants readonly
++ __flags_constants=`set |awk -F= '/^FLAGS_/ || /^__FLAGS_/ {print $1}'`
++ for __flags_const in ${__flags_constants}; do
++- # skip certain flags
++ case ${__flags_const} in
++ FLAGS_HELP) continue ;;
++ FLAGS_PARENT) continue ;;
++ esac
++- # set flag readonly
++ if [ -z "${ZSH_VERSION:-}" ]; then
++ readonly ${__flags_const}
++- else # handle zsh
+++ else
++ case ${ZSH_VERSION} in
++ [123].*) readonly ${__flags_const} ;;
++- *) readonly -g ${__flags_const} ;; # declare readonly constants globally
+++ *) readonly -g ${__flags_const} ;;
++ esac
++ fi
++ done
++ unset __flags_const __flags_constants
++
++-#
++-# internal variables
++-#
++-
++-__flags_boolNames=' ' # space separated list of boolean flag names
++-__flags_longNames=' ' # space separated list of long flag names
++-__flags_shortNames=' ' # space separated list of short flag names
++-
++-__flags_columns='' # screen width in columns
++-__flags_opts='' # temporary storage for parsed getopt flags
++-
++-#------------------------------------------------------------------------------
++-# private functions
++-#
++-
++-# Define a flag.
++-#
++-# Calling this function will define the following info variables for the
++-# specified flag:
++-# FLAGS_flagname - the name for this flag (based upon the long flag name)
++-# __flags_<flag_name>_default - the default value
++-# __flags_flagname_help - the help string
++-# __flags_flagname_short - the single letter alias
++-# __flags_flagname_type - the type of flag (one of __FLAGS_TYPE_*)
++-#
++-# Args:
++-# _flags__type: integer: internal type of flag (__FLAGS_TYPE_*)
++-# _flags__name: string: long flag name
++-# _flags__default: default flag value
++-# _flags__help: string: help string
++-# _flags__short: string: (optional) short flag name
++-# Returns:
++-# integer: success of operation, or error
+++
+++__flags_boolNames=' '
+++__flags_longNames=' '
+++__flags_shortNames=' '
+++__flags_columns=''
+++__flags_opts=''
+++
++ _flags_define()
++ {
++ if [ $# -lt 4 ]; then
++@@ -226,16 +106,13 @@ _flags_define()
++
++ _flags_return_=${FLAGS_TRUE}
++
++- # TODO(kward): check for validity of the flag name (e.g. dashes)
++
++- # check whether the flag name is reserved
++ echo " ${FLAGS_RESERVED} " |grep " ${_flags_name_} " >/dev/null
++ if [ $? -eq 0 ]; then
++ flags_error="flag name (${_flags_name_}) is reserved"
++ _flags_return_=${FLAGS_ERROR}
++ fi
++
++- # require short option for getopt that don't support long options
++ if [ ${_flags_return_} -eq ${FLAGS_TRUE} \
++ -a ${__FLAGS_GETOPT_VERS} -ne ${__FLAGS_GETOPT_VERS_ENH} \
++ -a "${_flags_short_}" = "${__FLAGS_NULL}" ]
++@@ -244,7 +121,6 @@ _flags_define()
++ _flags_return_=${FLAGS_ERROR}
++ fi
++
++- # check for existing long name definition
++ if [ ${_flags_return_} -eq ${FLAGS_TRUE} ]; then
++ if _flags_itemInList "${_flags_name_}" \
++ ${__flags_longNames} ${__flags_boolNames}
++@@ -255,7 +131,6 @@ _flags_define()
++ fi
++ fi
++
++- # check for existing short name definition
++ if [ ${_flags_return_} -eq ${FLAGS_TRUE} \
++ -a "${_flags_short_}" != "${__FLAGS_NULL}" ]
++ then
++@@ -266,9 +141,6 @@ _flags_define()
++ fi
++ fi
++
++- # handle default value. note, on several occasions the 'if' portion of an
++- # if/then/else contains just a ':' which does nothing. a binary reversal via
++- # '!' is not done because it does not work on all shells.
++ if [ ${_flags_return_} -eq ${FLAGS_TRUE} ]; then
++ case ${_flags_type_} in
++ ${__FLAGS_TYPE_BOOLEAN})
++@@ -301,7 +173,7 @@ _flags_define()
++ fi
++ ;;
++
++- ${__FLAGS_TYPE_STRING}) ;; # everything in shell is a valid string
+++ ${__FLAGS_TYPE_STRING}) ;;
++
++ *)
++ flags_error="unrecognized flag type '${_flags_type_}'"
++@@ -311,7 +183,6 @@ _flags_define()
++ fi
++
++ if [ ${_flags_return_} -eq ${FLAGS_TRUE} ]; then
++- # store flag information
++ eval "FLAGS_${_flags_name_}='${_flags_default_}'"
++ eval "__flags_${_flags_name_}_${__FLAGS_INFO_TYPE}=${_flags_type_}"
++ eval "__flags_${_flags_name_}_${__FLAGS_INFO_DEFAULT}=\
++@@ -319,7 +190,6 @@ _flags_define()
++ eval "__flags_${_flags_name_}_${__FLAGS_INFO_HELP}=\"${_flags_help_}\""
++ eval "__flags_${_flags_name_}_${__FLAGS_INFO_SHORT}='${_flags_short_}'"
++
++- # append flag name(s) to list of names
++ __flags_longNames="${__flags_longNames}${_flags_name_} "
++ __flags_shortNames="${__flags_shortNames}${_flags_short_} "
++ [ ${_flags_type_} -eq ${__FLAGS_TYPE_BOOLEAN} ] && \
++@@ -333,17 +203,6 @@ _flags_define()
++ return ${flags_return}
++ }
++
++-# Return valid getopt options using currently defined list of long options.
++-#
++-# This function builds a proper getopt option string for short (and long)
++-# options, using the current list of long options for reference.
++-#
++-# Args:
++-# _flags_optStr: integer: option string type (__FLAGS_OPTSTR_*)
++-# Output:
++-# string: generated option string for getopt
++-# Returns:
++-# boolean: success of operation (always returns True)
++ _flags_genOptStr()
++ {
++ _flags_optStrType_=$1
++@@ -358,7 +217,6 @@ _flags_genOptStr()
++ ${_flags_flag_} ${__FLAGS_INFO_SHORT}`
++ if [ "${_flags_shortName_}" != "${__FLAGS_NULL}" ]; then
++ _flags_opts_="${_flags_opts_}${_flags_shortName_}"
++- # getopt needs a trailing ':' to indicate a required argument
++ [ ${_flags_type_} -ne ${__FLAGS_TYPE_BOOLEAN} ] && \
++ _flags_opts_="${_flags_opts_}:"
++ fi
++@@ -366,7 +224,6 @@ _flags_genOptStr()
++
++ ${__FLAGS_OPTSTR_LONG})
++ _flags_opts_="${_flags_opts_:+${_flags_opts_},}${_flags_flag_}"
++- # getopt needs a trailing ':' to indicate a required argument
++ [ ${_flags_type_} -ne ${__FLAGS_TYPE_BOOLEAN} ] && \
++ _flags_opts_="${_flags_opts_}:"
++ ;;
++@@ -379,15 +236,6 @@ _flags_genOptStr()
++ return ${FLAGS_TRUE}
++ }
++
++-# Returns flag details based on a flag name and flag info.
++-#
++-# Args:
++-# string: long flag name
++-# string: flag info (see the _flags_define function for valid info types)
++-# Output:
++-# string: value of dereferenced flag variable
++-# Returns:
++-# integer: one of FLAGS_{TRUE|FALSE|ERROR}
++ _flags_getFlagInfo()
++ {
++ _flags_name_=$1
++@@ -399,13 +247,6 @@ _flags_getFlagInfo()
++ if [ -n "${_flags_value_}" ]; then
++ flags_return=${FLAGS_TRUE}
++ else
++- # see if the _flags_name_ variable is a string as strings can be empty...
++- # note: the DRY principle would say to have this function call itself for
++- # the next three lines, but doing so results in an infinite loop as an
++- # invalid _flags_name_ will also not have the associated _type variable.
++- # Because it doesn't (it will evaluate to an empty string) the logic will
++- # try to find the _type variable of the _type variable, and so on. Not so
++- # good ;-)
++ _flags_typeVar_="__flags_${_flags_name_}_${__FLAGS_INFO_TYPE}"
++ _flags_strToEval_="_flags_type_=\"\${${_flags_typeVar_}:-}\""
++ eval "${_flags_strToEval_}"
++@@ -424,15 +265,6 @@ _flags_getFlagInfo()
++ return ${flags_return}
++ }
++
++-# check for presense of item in a list. passed a string (e.g. 'abc'), this
++-# function will determine if the string is present in the list of strings (e.g.
++-# ' foo bar abc ').
++-#
++-# Args:
++-# _flags__str: string: string to search for in a list of strings
++-# unnamed: list: list of strings
++-# Returns:
++-# boolean: true if item is in the list
++ _flags_itemInList()
++ {
++ _flags_str_=$1
++@@ -449,34 +281,22 @@ _flags_itemInList()
++ return ${flags_return}
++ }
++
++-# Returns the width of the current screen.
++-#
++-# Output:
++-# integer: width in columns of the current screen.
++ _flags_columns()
++ {
++ if [ -z "${__flags_columns}" ]; then
++- # determine the value and store it
++ if eval stty size >/dev/null 2>&1; then
++- # stty size worked :-)
++ set -- `stty size`
++ __flags_columns=$2
++ elif eval tput cols >/dev/null 2>&1; then
++ set -- `tput cols`
++ __flags_columns=$1
++ else
++- __flags_columns=80 # default terminal width
+++ __flags_columns=80
++ fi
++ fi
++ echo ${__flags_columns}
++ }
++
++-# Validate a boolean.
++-#
++-# Args:
++-# _flags__bool: boolean: value to validate
++-# Returns:
++-# bool: true if the value is a valid boolean
++ _flags_validateBoolean()
++ {
++ _flags_bool_=$1
++@@ -492,12 +312,6 @@ _flags_validateBoolean()
++ return ${flags_return}
++ }
++
++-# Validate a float.
++-#
++-# Args:
++-# _flags__float: float: value to validate
++-# Returns:
++-# bool: true if the value is a valid float
++ _flags_validateFloat()
++ {
++ _flags_float_=$1
++@@ -507,10 +321,10 @@ _flags_validateFloat()
++ else
++ flags_return=${FLAGS_TRUE}
++ case ${_flags_float_} in
++- -*) # negative floats
+++ -*)
++ _flags_test_=`expr "${_flags_float_}" : '\(-[0-9][0-9]*\.[0-9][0-9]*\)'`
++ ;;
++- *) # positive floats
+++ *)
++ _flags_test_=`expr "${_flags_float_}" : '\([0-9][0-9]*\.[0-9][0-9]*\)'`
++ ;;
++ esac
++@@ -521,22 +335,16 @@ _flags_validateFloat()
++ return ${flags_return}
++ }
++
++-# Validate an integer.
++-#
++-# Args:
++-# _flags__integer: interger: value to validate
++-# Returns:
++-# bool: true if the value is a valid integer
++ _flags_validateInteger()
++ {
++ _flags_int_=$1
++
++ flags_return=${FLAGS_TRUE}
++ case ${_flags_int_} in
++- -*) # negative ints
+++ -*)
++ _flags_test_=`expr "${_flags_int_}" : '\(-[0-9][0-9]*\)'`
++ ;;
++- *) # positive ints
+++ *)
++ _flags_test_=`expr "${_flags_int_}" : '\([0-9][0-9]*\)'`
++ ;;
++ esac
++@@ -546,23 +354,12 @@ _flags_validateInteger()
++ return ${flags_return}
++ }
++
++-# Parse command-line options using the standard getopt.
++-#
++-# Note: the flag options are passed around in the global __flags_opts so that
++-# the formatting is not lost due to shell parsing and such.
++-#
++-# Args:
++-# @: varies: command-line options to parse
++-# Returns:
++-# integer: a FLAGS success condition
++ _flags_getoptStandard()
++ {
++ flags_return=${FLAGS_TRUE}
++ _flags_shortOpts_=`_flags_genOptStr ${__FLAGS_OPTSTR_SHORT}`
++
++- # check for spaces in passed options
++ for _flags_opt_ in "$@"; do
++- # note: the silliness with the x's is purely for ksh93 on Ubuntu 6.06
++ _flags_match_=`echo "x${_flags_opt_}x" |sed 's/ //g'`
++ if [ "${_flags_match_}" != "x${_flags_opt_}x" ]; then
++ flags_error='the available getopt does not support spaces in options'
++@@ -585,15 +382,6 @@ _flags_getoptStandard()
++ return ${flags_return}
++ }
++
++-# Parse command-line options using the enhanced getopt.
++-#
++-# Note: the flag options are passed around in the global __flags_opts so that
++-# the formatting is not lost due to shell parsing and such.
++-#
++-# Args:
++-# @: varies: command-line options to parse
++-# Returns:
++-# integer: a FLAGS success condition
++ _flags_getoptEnhanced()
++ {
++ flags_return=${FLAGS_TRUE}
++@@ -617,17 +405,6 @@ _flags_getoptEnhanced()
++ return ${flags_return}
++ }
++
++-# Dynamically parse a getopt result and set appropriate variables.
++-#
++-# This function does the actual conversion of getopt output and runs it through
++-# the standard case structure for parsing. The case structure is actually quite
++-# dynamic to support any number of flags.
++-#
++-# Args:
++-# argc: int: original command-line argument count
++-# @: varies: output from getopt parsing
++-# Returns:
++-# integer: a FLAGS success condition
++ _flags_parseGetopt()
++ {
++ _flags_argc_=$1
++@@ -638,35 +415,26 @@ _flags_parseGetopt()
++ if [ ${__FLAGS_GETOPT_VERS} -ne ${__FLAGS_GETOPT_VERS_ENH} ]; then
++ set -- $@
++ else
++- # note the quotes around the `$@' -- they are essential!
++ eval set -- "$@"
++ fi
++
++- # provide user with number of arguments to shift by later
++- # NOTE: the FLAGS_ARGC variable is obsolete as of 1.0.3 because it does not
++- # properly give user access to non-flag arguments mixed in between flag
++- # arguments. Its usage was replaced by FLAGS_ARGV, and it is being kept only
++- # for backwards compatibility reasons.
++ FLAGS_ARGC=`expr $# - 1 - ${_flags_argc_}`
++
++- # handle options. note options with values must do an additional shift
++ while true; do
++ _flags_opt_=$1
++ _flags_arg_=${2:-}
++ _flags_type_=${__FLAGS_TYPE_NONE}
++ _flags_name_=''
++
++- # determine long flag name
++ case "${_flags_opt_}" in
++- --) shift; break ;; # discontinue option parsing
+++ --) shift; break ;;
++
++- --*) # long option
+++ --*)
++ _flags_opt_=`expr "${_flags_opt_}" : '--\(.*\)'`
++ _flags_len_=${__FLAGS_LEN_LONG}
++ if _flags_itemInList "${_flags_opt_}" ${__flags_longNames}; then
++ _flags_name_=${_flags_opt_}
++ else
++- # check for negated long boolean version
++ if _flags_itemInList "${_flags_opt_}" ${__flags_boolNames}; then
++ _flags_name_=`expr "${_flags_opt_}" : 'no\(.*\)'`
++ _flags_type_=${__FLAGS_TYPE_BOOLEAN}
++@@ -675,12 +443,10 @@ _flags_parseGetopt()
++ fi
++ ;;
++
++- -*) # short option
+++ -*)
++ _flags_opt_=`expr "${_flags_opt_}" : '-\(.*\)'`
++ _flags_len_=${__FLAGS_LEN_SHORT}
++ if _flags_itemInList "${_flags_opt_}" ${__flags_shortNames}; then
++- # yes. match short name to long name. note purposeful off-by-one
++- # (too high) with awk calculations.
++ _flags_pos_=`echo "${__flags_shortNames}" \
++ |awk 'BEGIN{RS=" ";rn=0}$0==e{rn=NR}END{print rn}' \
++ e=${_flags_opt_}`
++@@ -690,14 +456,12 @@ _flags_parseGetopt()
++ ;;
++ esac
++
++- # die if the flag was unrecognized
++ if [ -z "${_flags_name_}" ]; then
++ flags_error="unrecognized option (${_flags_opt_})"
++ flags_return=${FLAGS_ERROR}
++ break
++ fi
++
++- # set new flag value
++ [ ${_flags_type_} -eq ${__FLAGS_TYPE_NONE} ] && \
++ _flags_type_=`_flags_getFlagInfo \
++ "${_flags_name_}" ${__FLAGS_INFO_TYPE}`
++@@ -746,7 +510,6 @@ _flags_parseGetopt()
++ ;;
++ esac
++
++- # handle special case help flag
++ if [ "${_flags_name_}" = 'help' ]; then
++ if [ ${FLAGS_help} -eq ${FLAGS_TRUE} ]; then
++ flags_help
++@@ -756,12 +519,10 @@ _flags_parseGetopt()
++ fi
++ fi
++
++- # shift the option and non-boolean arguements out.
++ shift
++ [ ${_flags_type_} != ${__FLAGS_TYPE_BOOLEAN} ] && shift
++ done
++
++- # give user back non-flag arguments
++ FLAGS_ARGV=''
++ while [ $# -gt 0 ]; do
++ FLAGS_ARGV="${FLAGS_ARGV:+${FLAGS_ARGV} }'$1'"
++@@ -773,43 +534,18 @@ _flags_parseGetopt()
++ return ${flags_return}
++ }
++
++-#------------------------------------------------------------------------------
++-# public functions
++-#
++-
++-# A basic boolean flag. Boolean flags do not take any arguments, and their
++-# value is either 1 (false) or 0 (true). For long flags, the false value is
++-# specified on the command line by prepending the word 'no'. With short flags,
++-# the presense of the flag toggles the current value between true and false.
++-# Specifying a short boolean flag twice on the command results in returning the
++-# value back to the default value.
++-#
++-# A default value is required for boolean flags.
++-#
++-# For example, lets say a Boolean flag was created whose long name was 'update'
++-# and whose short name was 'x', and the default value was 'false'. This flag
++-# could be explicitly set to 'true' with '--update' or by '-x', and it could be
++-# explicitly set to 'false' with '--noupdate'.
+++
++ DEFINE_boolean() { _flags_define ${__FLAGS_TYPE_BOOLEAN} "$@"; }
++
++-# Other basic flags.
++ DEFINE_float() { _flags_define ${__FLAGS_TYPE_FLOAT} "$@"; }
++ DEFINE_integer() { _flags_define ${__FLAGS_TYPE_INTEGER} "$@"; }
++ DEFINE_string() { _flags_define ${__FLAGS_TYPE_STRING} "$@"; }
++
++-# Parse the flags.
++-#
++-# Args:
++-# unnamed: list: command-line flags to parse
++-# Returns:
++-# integer: success of operation, or error
++ FLAGS()
++ {
++- # define a standard 'help' flag if one isn't already defined
++ [ -z "${__flags_help_type:-}" ] && \
++ DEFINE_boolean 'help' false 'show this help' 'h'
++
++- # parse options
++ if [ $# -gt 0 ]; then
++ if [ ${__FLAGS_GETOPT_VERS} -ne ${__FLAGS_GETOPT_VERS_ENH} ]; then
++ _flags_getoptStandard "$@"
++@@ -818,7 +554,6 @@ FLAGS()
++ fi
++ flags_return=$?
++ else
++- # nothing passed; won't bother running getopt
++ __flags_opts='--'
++ flags_return=${FLAGS_TRUE}
++ fi
++@@ -832,23 +567,11 @@ FLAGS()
++ return ${flags_return}
++ }
++
++-# This is a helper function for determining the `getopt` version for platforms
++-# where the detection isn't working. It simply outputs debug information that
++-# can be included in a bug report.
++-#
++-# Args:
++-# none
++-# Output:
++-# debug info that can be included in a bug report
++-# Returns:
++-# nothing
++ flags_getoptInfo()
++ {
++- # platform info
++ _flags_debug "uname -a: `uname -a`"
++ _flags_debug "PATH: ${PATH}"
++
++- # shell info
++ if [ -n "${BASH_VERSION:-}" ]; then
++ _flags_debug 'shell: bash'
++ _flags_debug "BASH_VERSION: ${BASH_VERSION}"
++@@ -857,7 +580,6 @@ flags_getoptInfo()
++ _flags_debug "ZSH_VERSION: ${ZSH_VERSION}"
++ fi
++
++- # getopt info
++ getopt >/dev/null
++ _flags_getoptReturn=$?
++ _flags_debug "getopt return: ${_flags_getoptReturn}"
++@@ -866,39 +588,16 @@ flags_getoptInfo()
++ unset _flags_getoptReturn
++ }
++
++-# Returns whether the detected getopt version is the enhanced version.
++-#
++-# Args:
++-# none
++-# Output:
++-# none
++-# Returns:
++-# bool: true if getopt is the enhanced version
++ flags_getoptIsEnh()
++ {
++ test ${__FLAGS_GETOPT_VERS} -eq ${__FLAGS_GETOPT_VERS_ENH}
++ }
++
++-# Returns whether the detected getopt version is the standard version.
++-#
++-# Args:
++-# none
++-# Returns:
++-# bool: true if getopt is the standard version
++ flags_getoptIsStd()
++ {
++ test ${__FLAGS_GETOPT_VERS} -eq ${__FLAGS_GETOPT_VERS_STD}
++ }
++
++-# This is effectively a 'usage()' function. It prints usage information and
++-# exits the program with ${FLAGS_FALSE} if it is ever found in the command line
++-# arguments. Note this function can be overridden so other apps can define
++-# their own --help flag, replacing this one, if they want.
++-#
++-# Args:
++-# none
++-# Returns:
++-# integer: success of operation (always returns true)
++ flags_help()
++ {
++ if [ -n "${FLAGS_HELP:-}" ]; then
++@@ -953,19 +652,14 @@ flags_help()
++ echo "${flags_helpStr_}" >&2
++ else
++ echo " ${flags_flagStr_} ${flags_help_}" >&2
++- # note: the silliness with the x's is purely for ksh93 on Ubuntu 6.06
++- # because it doesn't like empty strings when used in this manner.
++ flags_emptyStr_="`echo \"x${flags_flagStr_}x\" \
++ |awk '{printf "%"length($0)-2"s", ""}'`"
++ flags_helpStr_=" ${flags_emptyStr_} ${flags_defaultStr_}"
++ flags_helpStrLen_=`expr "${flags_helpStr_}" : '.*'`
++ if [ ${__FLAGS_GETOPT_VERS} -eq ${__FLAGS_GETOPT_VERS_STD} \
++ -o ${flags_helpStrLen_} -lt ${flags_columns_} ]; then
++- # indented to match help string
++ echo "${flags_helpStr_}" >&2
++ else
++- # indented four from left to allow for longer defaults as long flag
++- # names might be used too, making things too long
++ echo " ${flags_defaultStr_}" >&2
++ fi
++ fi
++@@ -978,12 +672,6 @@ flags_help()
++ return ${FLAGS_TRUE}
++ }
++
++-# Reset shflags back to an uninitialized state.
++-#
++-# Args:
++-# none
++-# Returns:
++-# nothing
++ flags_reset()
++ {
++ for flags_name_ in ${__flags_longNames}; do
++@@ -1000,7 +688,6 @@ flags_reset()
++ eval ${flags_strToEval_}
++ done
++
++- # reset internal variables
++ __flags_boolNames=' '
++ __flags_longNames=' '
++ __flags_shortNames=' '
+diff --git a/feeds/management/shtool/Makefile b/feeds/management/shtool/Makefile
+new file mode 100644
+index 0000000..165c161
+--- /dev/null
++++ b/feeds/management/shtool/Makefile
+@@ -0,0 +1,40 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=shtool
++PKG_VERSION:=2.0.8
++PKG_RELEASE:=1
++
++PKG_SOURCE:=${PKG_NAME}-${PKG_VERSION}.tar.gz
++PKG_SOURCE_URL:=@GNU/$(PKG_NAME)
++PKG_MD5SUM:=c5f7c6836882d48bc79049846a5f9c5b
++PKG_LICENSE:=GPL-2.0+
++
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/shtool
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=The GNU Portable Shell Tool
++endef
++
++define Package/shtool/description
++ GNU shtool is a compilation of small but very stable and portable shell
++ scripts into a single shell tool.
++endef
++
++define Package/shtool/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/shtool $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/shtoolize $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,shtool))
+diff --git a/feeds/packages/CONTRIBUTING.md b/feeds/packages/CONTRIBUTING.md
+new file mode 100644
+index 0000000..03f965f
+--- /dev/null
++++ b/feeds/packages/CONTRIBUTING.md
+@@ -0,0 +1,94 @@
++# Contributing Guidelines
++(See <http://wiki.openwrt.org/doc/devel/packages> for overall format and construction)
++
++
++All packages you commit or submit by pull-request should follow these simple guidelines:
++
++* Package a version which is still maintained by the upstream author.
++* Will be updated regularly to maintained and supported versions.
++* Have no dependencies outside the OpenWrt core packages or this repository feed.
++* Have been tested to compile with the correct includes and dependencies. Please also test with "Compile with full language support" found under "General Build Settings" set if language support is relevant to your package.
++* Do NOT use a rolling source file (e.g. foo-latest.tar.gz) or the head of a branch as source for the package since that would create unpredictable builds which change over time.
++* Best of all -- it works as expected!
++
++Makefile contents should contain:
++
++* An up-to-date copyright notice. Use OpenWrt if no other present or supply your own.
++* A (PKG_)MAINTAINER definition listing either yourself or another person in the field.
++ (E.g.: PKG_MAINTAINER:= Joe D. Hacker `<jdh@jdhs-email-provider.org`>)
++* A PKG_LICENSE tag declaring the main license of the package.
++ (E.g.: PKG_LICENSE:=GPL-2.0+) Please use SPDX identifiers if possible (see list at the bottom).
++* An optional PKG_LICENSE_FILES tag including the filenames of the license-files in the source-package.
++ (E.g.: PKG_LICENSE_FILES:=COPYING)
++* PKG_RELEASE should be initially set to 1 or reset to 1 if the software version is changed. You should increment it if the package itself has changed. For example, modifying a support script, changing configure options like --disable* or --enable* switches, or if you changed something in the package which causes the resulting binaries to be different. Changes like correcting md5sums, changing mirror URLs, adding a maintainer field or updating a comment or copyright year in a Makefile do not require a change to PKG_RELEASE.
++
++Commits in your pull-requests should:
++
++* Have a useful description prefixed with the package name
++ (E.g.: "foopkg: Add libzot dependency")
++* Include Signed-off-by in the comment
++ (See <https://dev.openwrt.org/wiki/SubmittingPatches#a10.Signyourwork>)
++
++If you have commit access:
++
++* Do NOT use git push --force.
++* Do NOT commit to other maintainer's packages without their consent.
++* Use Pull Requests if you are unsure and to suggest changes to other maintainers.
++
++Gaining commit access:
++
++* We will gladly grant commit access to responsible contributors who have made
++ useful pull requests and / or feedback or patches to this repository or
++ OpenWrt in general. Please include your request for commit access in your
++ next pull request or ticket.
++
++Release Branches:
++
++* Branches named "for-XX.YY" (e.g. for-14.07) are release branches.
++* These branches are built with the respective OpenWrt release and are created
++ during the release stabilisation phase.
++* Please ONLY cherry-pick or commit security and bug-fixes to these branches.
++* Do NOT add new packages and do NOT do major upgrades of packages here.
++* If you are unsure if your change is suitable, please use a pull request.
++
++####Common LICENSE tags (short list)
++(Complete list can be found at: <http://spdx.org/licenses>)
++####
++
++| Full Name | Identifier |
++|---|:---|
++|Apache License 1.0|Apache-1.0|
++|Apache License 1.1|Apache-1.1|
++|Apache License 2.0|Apache-2.0|
++|Artistic License 1.0|Artistic-1.0|
++|Artistic License 1.0 (Perl)|Artistic-1.0-Perl|
++|Artistic License 1.0 w/clause 8|Artistic-1.0-cl8|
++|Artistic License 2.0|Artistic-2.0|
++|BSD 2-clause "Simplified" License|BSD-2-Clause|
++|BSD 2-clause FreeBSD License|BSD-2-Clause-FreeBSD|
++|BSD 2-clause NetBSD License|BSD-2-Clause-NetBSD|
++|BSD 3-clause "New" or "Revised" License|BSD-3-Clause|
++|BSD 3-clause Clear License|BSD-3-Clause-Clear|
++|BSD 4-clause "Original" or "Old" License|BSD-4-Clause|
++|BSD Protection License|BSD-Protection|
++|BSD with attribution|BSD-3-Clause-Attribution|
++|BSD-4-Clause (University of California-Specific)|BSD-4-Clause-UC|
++|GNU General Public License v1.0 only|GPL-1.0|
++|GNU General Public License v1.0 or later|GPL-1.0+|
++|GNU General Public License v2.0 only|GPL-2.0|
++|GNU General Public License v2.0 or later|GPL-2.0+|
++|GNU General Public License v3.0 only|GPL-3.0|
++|GNU General Public License v3.0 or later|GPL-3.0+|
++|GNU Lesser General Public License v2.1 only|LGPL-2.1|
++|GNU Lesser General Public License v2.1 or later|LGPL-2.1+|
++|GNU Lesser General Public License v3.0 only|LGPL-3.0|
++|GNU Lesser General Public License v3.0 or later|LGPL-3.0+|
++|GNU Library General Public License v2 only|LGPL-2.0|
++|GNU Library General Public License v2 or later|LGPL-2.0+|
++|Fair License|Fair|
++|ISC License|ISC|
++|MIT License|MIT|
++|No Limit Public License|NLPL|
++|OpenSSL License|OpenSSL|
++|X11 License|X11|
++|zlib License|Zlib|
+diff --git a/feeds/packages/LICENSE b/feeds/packages/LICENSE
+new file mode 100644
+index 0000000..d60c31a
+--- /dev/null
++++ b/feeds/packages/LICENSE
+@@ -0,0 +1,340 @@
++ GNU GENERAL PUBLIC LICENSE
++ Version 2, June 1991
++
++ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
++ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ Everyone is permitted to copy and distribute verbatim copies
++ of this license document, but changing it is not allowed.
++
++ Preamble
++
++ The licenses for most software are designed to take away your
++freedom to share and change it. By contrast, the GNU General Public
++License is intended to guarantee your freedom to share and change free
++software--to make sure the software is free for all its users. This
++General Public License applies to most of the Free Software
++Foundation's software and to any other program whose authors commit to
++using it. (Some other Free Software Foundation software is covered by
++the GNU Library General Public License instead.) You can apply it to
++your programs, too.
++
++ When we speak of free software, we are referring to freedom, not
++price. Our General Public Licenses are designed to make sure that you
++have the freedom to distribute copies of free software (and charge for
++this service if you wish), that you receive source code or can get it
++if you want it, that you can change the software or use pieces of it
++in new free programs; and that you know you can do these things.
++
++ To protect your rights, we need to make restrictions that forbid
++anyone to deny you these rights or to ask you to surrender the rights.
++These restrictions translate to certain responsibilities for you if you
++distribute copies of the software, or if you modify it.
++
++ For example, if you distribute copies of such a program, whether
++gratis or for a fee, you must give the recipients all the rights that
++you have. You must make sure that they, too, receive or can get the
++source code. And you must show them these terms so they know their
++rights.
++
++ We protect your rights with two steps: (1) copyright the software, and
++(2) offer you this license which gives you legal permission to copy,
++distribute and/or modify the software.
++
++ Also, for each author's protection and ours, we want to make certain
++that everyone understands that there is no warranty for this free
++software. If the software is modified by someone else and passed on, we
++want its recipients to know that what they have is not the original, so
++that any problems introduced by others will not reflect on the original
++authors' reputations.
++
++ Finally, any free program is threatened constantly by software
++patents. We wish to avoid the danger that redistributors of a free
++program will individually obtain patent licenses, in effect making the
++program proprietary. To prevent this, we have made it clear that any
++patent must be licensed for everyone's free use or not licensed at all.
++
++ The precise terms and conditions for copying, distribution and
++modification follow.
++
++ GNU GENERAL PUBLIC LICENSE
++ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
++
++ 0. This License applies to any program or other work which contains
++a notice placed by the copyright holder saying it may be distributed
++under the terms of this General Public License. The "Program", below,
++refers to any such program or work, and a "work based on the Program"
++means either the Program or any derivative work under copyright law:
++that is to say, a work containing the Program or a portion of it,
++either verbatim or with modifications and/or translated into another
++language. (Hereinafter, translation is included without limitation in
++the term "modification".) Each licensee is addressed as "you".
++
++Activities other than copying, distribution and modification are not
++covered by this License; they are outside its scope. The act of
++running the Program is not restricted, and the output from the Program
++is covered only if its contents constitute a work based on the
++Program (independent of having been made by running the Program).
++Whether that is true depends on what the Program does.
++
++ 1. You may copy and distribute verbatim copies of the Program's
++source code as you receive it, in any medium, provided that you
++conspicuously and appropriately publish on each copy an appropriate
++copyright notice and disclaimer of warranty; keep intact all the
++notices that refer to this License and to the absence of any warranty;
++and give any other recipients of the Program a copy of this License
++along with the Program.
++
++You may charge a fee for the physical act of transferring a copy, and
++you may at your option offer warranty protection in exchange for a fee.
++
++ 2. You may modify your copy or copies of the Program or any portion
++of it, thus forming a work based on the Program, and copy and
++distribute such modifications or work under the terms of Section 1
++above, provided that you also meet all of these conditions:
++
++ a) You must cause the modified files to carry prominent notices
++ stating that you changed the files and the date of any change.
++
++ b) You must cause any work that you distribute or publish, that in
++ whole or in part contains or is derived from the Program or any
++ part thereof, to be licensed as a whole at no charge to all third
++ parties under the terms of this License.
++
++ c) If the modified program normally reads commands interactively
++ when run, you must cause it, when started running for such
++ interactive use in the most ordinary way, to print or display an
++ announcement including an appropriate copyright notice and a
++ notice that there is no warranty (or else, saying that you provide
++ a warranty) and that users may redistribute the program under
++ these conditions, and telling the user how to view a copy of this
++ License. (Exception: if the Program itself is interactive but
++ does not normally print such an announcement, your work based on
++ the Program is not required to print an announcement.)
++
++These requirements apply to the modified work as a whole. If
++identifiable sections of that work are not derived from the Program,
++and can be reasonably considered independent and separate works in
++themselves, then this License, and its terms, do not apply to those
++sections when you distribute them as separate works. But when you
++distribute the same sections as part of a whole which is a work based
++on the Program, the distribution of the whole must be on the terms of
++this License, whose permissions for other licensees extend to the
++entire whole, and thus to each and every part regardless of who wrote it.
++
++Thus, it is not the intent of this section to claim rights or contest
++your rights to work written entirely by you; rather, the intent is to
++exercise the right to control the distribution of derivative or
++collective works based on the Program.
++
++In addition, mere aggregation of another work not based on the Program
++with the Program (or with a work based on the Program) on a volume of
++a storage or distribution medium does not bring the other work under
++the scope of this License.
++
++ 3. You may copy and distribute the Program (or a work based on it,
++under Section 2) in object code or executable form under the terms of
++Sections 1 and 2 above provided that you also do one of the following:
++
++ a) Accompany it with the complete corresponding machine-readable
++ source code, which must be distributed under the terms of Sections
++ 1 and 2 above on a medium customarily used for software interchange; or,
++
++ b) Accompany it with a written offer, valid for at least three
++ years, to give any third party, for a charge no more than your
++ cost of physically performing source distribution, a complete
++ machine-readable copy of the corresponding source code, to be
++ distributed under the terms of Sections 1 and 2 above on a medium
++ customarily used for software interchange; or,
++
++ c) Accompany it with the information you received as to the offer
++ to distribute corresponding source code. (This alternative is
++ allowed only for noncommercial distribution and only if you
++ received the program in object code or executable form with such
++ an offer, in accord with Subsection b above.)
++
++The source code for a work means the preferred form of the work for
++making modifications to it. For an executable work, complete source
++code means all the source code for all modules it contains, plus any
++associated interface definition files, plus the scripts used to
++control compilation and installation of the executable. However, as a
++special exception, the source code distributed need not include
++anything that is normally distributed (in either source or binary
++form) with the major components (compiler, kernel, and so on) of the
++operating system on which the executable runs, unless that component
++itself accompanies the executable.
++
++If distribution of executable or object code is made by offering
++access to copy from a designated place, then offering equivalent
++access to copy the source code from the same place counts as
++distribution of the source code, even though third parties are not
++compelled to copy the source along with the object code.
++
++ 4. You may not copy, modify, sublicense, or distribute the Program
++except as expressly provided under this License. Any attempt
++otherwise to copy, modify, sublicense or distribute the Program is
++void, and will automatically terminate your rights under this License.
++However, parties who have received copies, or rights, from you under
++this License will not have their licenses terminated so long as such
++parties remain in full compliance.
++
++ 5. You are not required to accept this License, since you have not
++signed it. However, nothing else grants you permission to modify or
++distribute the Program or its derivative works. These actions are
++prohibited by law if you do not accept this License. Therefore, by
++modifying or distributing the Program (or any work based on the
++Program), you indicate your acceptance of this License to do so, and
++all its terms and conditions for copying, distributing or modifying
++the Program or works based on it.
++
++ 6. Each time you redistribute the Program (or any work based on the
++Program), the recipient automatically receives a license from the
++original licensor to copy, distribute or modify the Program subject to
++these terms and conditions. You may not impose any further
++restrictions on the recipients' exercise of the rights granted herein.
++You are not responsible for enforcing compliance by third parties to
++this License.
++
++ 7. If, as a consequence of a court judgment or allegation of patent
++infringement or for any other reason (not limited to patent issues),
++conditions are imposed on you (whether by court order, agreement or
++otherwise) that contradict the conditions of this License, they do not
++excuse you from the conditions of this License. If you cannot
++distribute so as to satisfy simultaneously your obligations under this
++License and any other pertinent obligations, then as a consequence you
++may not distribute the Program at all. For example, if a patent
++license would not permit royalty-free redistribution of the Program by
++all those who receive copies directly or indirectly through you, then
++the only way you could satisfy both it and this License would be to
++refrain entirely from distribution of the Program.
++
++If any portion of this section is held invalid or unenforceable under
++any particular circumstance, the balance of the section is intended to
++apply and the section as a whole is intended to apply in other
++circumstances.
++
++It is not the purpose of this section to induce you to infringe any
++patents or other property right claims or to contest validity of any
++such claims; this section has the sole purpose of protecting the
++integrity of the free software distribution system, which is
++implemented by public license practices. Many people have made
++generous contributions to the wide range of software distributed
++through that system in reliance on consistent application of that
++system; it is up to the author/donor to decide if he or she is willing
++to distribute software through any other system and a licensee cannot
++impose that choice.
++
++This section is intended to make thoroughly clear what is believed to
++be a consequence of the rest of this License.
++
++ 8. If the distribution and/or use of the Program is restricted in
++certain countries either by patents or by copyrighted interfaces, the
++original copyright holder who places the Program under this License
++may add an explicit geographical distribution limitation excluding
++those countries, so that distribution is permitted only in or among
++countries not thus excluded. In such case, this License incorporates
++the limitation as if written in the body of this License.
++
++ 9. The Free Software Foundation may publish revised and/or new versions
++of the General Public License from time to time. Such new versions will
++be similar in spirit to the present version, but may differ in detail to
++address new problems or concerns.
++
++Each version is given a distinguishing version number. If the Program
++specifies a version number of this License which applies to it and "any
++later version", you have the option of following the terms and conditions
++either of that version or of any later version published by the Free
++Software Foundation. If the Program does not specify a version number of
++this License, you may choose any version ever published by the Free Software
++Foundation.
++
++ 10. If you wish to incorporate parts of the Program into other free
++programs whose distribution conditions are different, write to the author
++to ask for permission. For software which is copyrighted by the Free
++Software Foundation, write to the Free Software Foundation; we sometimes
++make exceptions for this. Our decision will be guided by the two goals
++of preserving the free status of all derivatives of our free software and
++of promoting the sharing and reuse of software generally.
++
++ NO WARRANTY
++
++ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
++FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
++OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
++PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
++OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
++TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
++PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
++REPAIR OR CORRECTION.
++
++ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
++REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
++INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
++OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
++TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
++YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
++PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
++POSSIBILITY OF SUCH DAMAGES.
++
++ END OF TERMS AND CONDITIONS
++
++ How to Apply These Terms to Your New Programs
++
++ If you develop a new program, and you want it to be of the greatest
++possible use to the public, the best way to achieve this is to make it
++free software which everyone can redistribute and change under these terms.
++
++ To do so, attach the following notices to the program. It is safest
++to attach them to the start of each source file to most effectively
++convey the exclusion of warranty; and each file should have at least
++the "copyright" line and a pointer to where the full notice is found.
++
++ <one line to give the program's name and a brief idea of what it does.>
++ Copyright (C) <year> <name of author>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++
++
++Also add information on how to contact you by electronic and paper mail.
++
++If the program is interactive, make it output a short notice like this
++when it starts in an interactive mode:
++
++ Gnomovision version 69, Copyright (C) year name of author
++ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
++ This is free software, and you are welcome to redistribute it
++ under certain conditions; type `show c' for details.
++
++The hypothetical commands `show w' and `show c' should show the appropriate
++parts of the General Public License. Of course, the commands you use may
++be called something other than `show w' and `show c'; they could even be
++mouse-clicks or menu items--whatever suits your program.
++
++You should also get your employer (if you work as a programmer) or your
++school, if any, to sign a "copyright disclaimer" for the program, if
++necessary. Here is a sample; alter the names:
++
++ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
++ `Gnomovision' (which makes passes at compilers) written by James Hacker.
++
++ <signature of Ty Coon>, 1 April 1989
++ Ty Coon, President of Vice
++
++This General Public License does not permit incorporating your program into
++proprietary programs. If your program is a subroutine library, you may
++consider it more useful to permit linking proprietary applications with the
++library. If this is what you want to do, use the GNU Library General
++Public License instead of this License.
+diff --git a/feeds/packages/README.md b/feeds/packages/README.md
+new file mode 100644
+index 0000000..d908a86
+--- /dev/null
++++ b/feeds/packages/README.md
+@@ -0,0 +1,26 @@
++# OpenWrt packages feed
++
++## Description
++
++This is the OpenWrt "packages"-feed containing community-maintained build scripts, options and patches for applications, modules and libraries used within OpenWrt.
++
++Installation of pre-built packages is handled directly by the **opkg** utility within your running OpenWrt system or by using the [OpenWrt SDK](http://wiki.openwrt.org/doc/howto/obtain.firmware.sdk) on a build system.
++
++## Usage
++
++This repository is intended to be layered on-top of an OpenWrt buildroot. If you do not have an OpenWrt buildroot installed, see the documentation at: [OpenWrt Buildroot – Installation](http://wiki.openwrt.org/doc/howto/buildroot.exigence) on the OpenWrt support site.
++
++This feed is enabled by default. To install all its package definitions, run:
++```
++./scripts/feeds update packages
++./scripts/feeds install -a -p packages
++```
++
++## License
++
++See [LICENSE](LICENSE) file.
++
++## Package Guidelines
++
++See [CONTRIBUTING.md](CONTRIBUTING.md) file.
++
+diff --git a/feeds/packages/admin/debootstrap/Makefile b/feeds/packages/admin/debootstrap/Makefile
+new file mode 100644
+index 0000000..8190d2a
+--- /dev/null
++++ b/feeds/packages/admin/debootstrap/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2010 Gianluigi Tiesi <sherpya@netfarm.it>
++# Copyright (C) 2011-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=debootstrap
++PKG_VERSION:=1.0.72
++PKG_RELEASE:=1
++PKG_MAINTAINER=Daniel Golle <daniel@makrotopia.org>
++
++PKG_SOURCE:=$(PKG_NAME)-udeb_$(PKG_VERSION)_all.udeb
++PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/main/d/debootstrap
++PKG_MD5SUM:=49f24e3299352aa5453f725ec0d55566
++PKG_LICENSE:=Unique
++PKG_LICENSE_FILES:=debian/copyright
++
++UNPACK_CMD=ar -p "$(DL_DIR)/$(PKG_SOURCE)" data.tar.xz | xzcat | tar -C $(1) -xf -
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/debootstrap
++ SECTION:=admin
++ CATEGORY:=Administration
++ TITLE:=Bootstrap a basic Debian system
++ URL:=http://wiki.debian.org/Debootstrap
++ DEPENDS:= +coreutils +coreutils-chroot +coreutils-sha1sum +ar
++endef
++
++define Package/debootstrap/description
++ debootstrap is used to create a Debian base system from scratch, without
++ requiring the availability of dpkg or apt. It does this by downloading .deb
++ files from a mirror site, and carefully unpacking them into a directory which
++ can eventually be chrooted into.
++endef
++
++define Build/Compile
++# file pkgdetails.c was imported from debian package base-installer version 1.130
++ $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS) ./files/pkgdetails.c -o $(PKG_BUILD_DIR)/usr/share/debootstrap/pkgdetails
++endef
++
++define Package/debootstrap/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/usr/sbin/$(PKG_NAME) $(1)/usr/sbin
++ $(INSTALL_DIR) $(1)/usr/share/debootstrap
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/usr/share/debootstrap/pkgdetails $(1)/usr/share/debootstrap
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/usr/share/debootstrap/functions $(1)/usr/share/debootstrap
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/usr/share/debootstrap/devices.tar.gz $(1)/usr/share/debootstrap
++ $(INSTALL_DIR) $(1)/usr/share/debootstrap/scripts
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/usr/share/debootstrap/scripts/* $(1)/usr/share/debootstrap/scripts
++endef
++
++$(eval $(call BuildPackage,debootstrap))
+diff --git a/feeds/packages/admin/debootstrap/files/pkgdetails.c b/feeds/packages/admin/debootstrap/files/pkgdetails.c
+new file mode 100644
+index 0000000..99ee190
+--- /dev/null
++++ b/feeds/packages/admin/debootstrap/files/pkgdetails.c
+@@ -0,0 +1,347 @@
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <ctype.h>
++#include <stdarg.h>
++#include <errno.h>
++
++#define MAX_LINE 1000
++#define MAX_PKGS 100
++
++char *checksum_field=NULL;
++
++static void oom_die(void)
++{
++ fputs("Out of memory!\n", stderr);
++ exit(1);
++}
++
++static char *xvasprintf(const char *fmt, va_list ap) {
++ char *ret;
++
++ if (vasprintf (&ret, fmt, ap) < 0) {
++ if (errno == ENOMEM)
++ oom_die();
++ return NULL;
++ }
++ return ret;
++}
++
++static char *xasprintf(const char *fmt, ...) {
++ va_list ap;
++ char *ret;
++
++ va_start(ap, fmt);
++ ret = xvasprintf(fmt, ap);
++ va_end(ap);
++ return ret;
++}
++
++static char *fieldcpy(char *dst, char *fld) {
++ while (*fld && *fld != ':')
++ fld++;
++ if (!*(fld++))
++ return NULL;
++ while (isspace(*fld)) fld++;
++ return strcpy(dst, fld);
++}
++
++static void outputdeps(char *deps) {
++ char *pch = deps;
++
++ while (1) {
++ while (isspace(*pch)) pch++;
++ if (!*pch) break;
++
++ while (*pch && *pch != '(' && *pch != '|' && *pch != ','
++ && !isspace(*pch))
++ {
++ fputc(*pch++, stdout);
++ }
++ fputc('\n', stdout);
++ while (*pch && *pch++ != ',') (void)NULL;
++ }
++}
++
++static void dogetdeps(char *pkgsfile, char **in_pkgs, int pkgc) {
++ char buf[MAX_LINE];
++ char cur_pkg[MAX_LINE];
++ char cur_deps[MAX_LINE];
++ char cur_predeps[MAX_LINE];
++ char prev_pkg[MAX_LINE];
++ char *pkgs[MAX_PKGS];
++ int i;
++ int skip;
++ FILE *f;
++ int output_pkg = -1;
++
++ cur_pkg[0] = cur_deps[0] = cur_predeps[0] = prev_pkg[0] = '\0';
++
++ for (i = 0; i < pkgc; i++) pkgs[i] = in_pkgs[i];
++
++ f = fopen(pkgsfile, "r");
++ if (f == NULL) {
++ perror(pkgsfile);
++ exit(1);
++ }
++
++ skip = 1;
++ while (fgets(buf, sizeof(buf), f)) {
++ if (*buf && buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0';
++ if (strncasecmp(buf, "Package:", 8) == 0) {
++ int any = 0;
++ skip = 1;
++ fieldcpy(cur_pkg, buf);
++ if (strcmp(cur_pkg, prev_pkg) != 0) {
++ if (output_pkg != -1)
++ pkgs[output_pkg] = NULL;
++ if (cur_deps[0])
++ outputdeps(cur_deps);
++ if (cur_predeps[0])
++ outputdeps(cur_predeps);
++ strcpy(prev_pkg, cur_pkg);
++ }
++ cur_deps[0] = cur_predeps[0] = '\0';
++ output_pkg = -1;
++ for (i = 0; i < pkgc; i++) {
++ if (!pkgs[i]) continue;
++ any = 1;
++ if (strcmp(cur_pkg, pkgs[i]) == 0) {
++ skip = 0;
++ output_pkg = i;
++ break;
++ }
++ }
++ if (!any) break;
++ } else if (!skip && strncasecmp(buf, "Depends:", 8) == 0)
++ fieldcpy(cur_deps, buf);
++ else if (!skip && strncasecmp(buf, "Pre-Depends:", 12) == 0)
++ fieldcpy(cur_predeps, buf);
++ }
++ if (cur_deps[0])
++ outputdeps(cur_deps);
++ if (cur_predeps[0])
++ outputdeps(cur_predeps);
++ fclose(f);
++}
++
++static void dopkgmirrorpkgs(int uniq, char *mirror, char *pkgsfile,
++ char *fieldname, char **in_pkgs, int pkgc)
++{
++ char buf[MAX_LINE];
++ char cur_field[MAX_LINE];
++ char cur_pkg[MAX_LINE];
++ char cur_ver[MAX_LINE];
++ char cur_arch[MAX_LINE];
++ char cur_size[MAX_LINE];
++ char cur_checksum[MAX_LINE];
++ char cur_filename[MAX_LINE];
++ char prev_pkg[MAX_LINE];
++ char *pkgs[MAX_PKGS];
++ int i;
++ FILE *f;
++ char *output = NULL;
++ int output_pkg = -1;
++
++ cur_field[0] = cur_pkg[0] = cur_ver[0] = cur_arch[0] = cur_filename[0] = prev_pkg[0] = '\0';
++
++ for (i = 0; i < pkgc; i++) pkgs[i] = in_pkgs[i];
++
++ f = fopen(pkgsfile, "r");
++ if (f == NULL) {
++ perror(pkgsfile);
++ exit(1);
++ }
++ while (fgets(buf, sizeof(buf), f)) {
++ if (*buf && buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0';
++ if (strncasecmp(buf, fieldname, strlen(fieldname)) == 0) {
++ fieldcpy(cur_field, buf);
++ }
++ if (strncasecmp(buf, "Package:", 8) == 0) {
++ fieldcpy(cur_pkg, buf);
++ if (strcmp(cur_pkg, prev_pkg) != 0) {
++ if (output)
++ fputs(output, stdout);
++ if (uniq && output_pkg != -1)
++ pkgs[output_pkg] = NULL;
++ strcpy(prev_pkg, cur_pkg);
++ }
++ free(output);
++ output = NULL;
++ output_pkg = -1;
++ } else if (strncasecmp(buf, "Version:", 8) == 0) {
++ fieldcpy(cur_ver, buf);
++ } else if (strncasecmp(buf, "Architecture:", 13) == 0) {
++ fieldcpy(cur_arch, buf);
++ } else if (strncasecmp(buf, "Size:", 5) == 0) {
++ fieldcpy(cur_size, buf);
++ } else if (strncasecmp(buf, checksum_field, strlen(checksum_field)) == 0
++ && buf[strlen(checksum_field)] == ':') {
++ fieldcpy(cur_checksum, buf);
++ } else if (strncasecmp(buf, "Filename:", 9) == 0) {
++ fieldcpy(cur_filename, buf);
++ } else if (!*buf) {
++ int any = 0;
++ for (i = 0; i < pkgc; i++) {
++ if (!pkgs[i]) continue;
++ any = 1;
++ if (strcmp(cur_field, pkgs[i]) == 0) {
++ free(output);
++ output = xasprintf("%s %s %s %s %s %s %s\n", cur_pkg, cur_ver, cur_arch, mirror, cur_filename, cur_checksum, cur_size);
++ output_pkg = i;
++ break;
++ }
++ }
++ if (!any) break;
++ cur_field[0] = '\0';
++ }
++ }
++ if (output)
++ fputs(output, stdout);
++ if (uniq && output_pkg != -1)
++ pkgs[output_pkg] = NULL;
++ fclose(f);
++
++ /* any that weren't found are returned as "pkg -" */
++ if (uniq) {
++ for (i = 0; i < pkgc; i++) {
++ if (pkgs[i]) {
++ printf("%s -\n", pkgs[i]);
++ }
++ }
++ }
++}
++
++static void dopkgstanzas(char *pkgsfile, char **pkgs, int pkgc)
++{
++ char buf[MAX_LINE];
++ char *accum;
++ size_t accum_size = 0, accum_alloc = MAX_LINE * 2;
++ char cur_pkg[MAX_LINE];
++ FILE *f;
++
++ accum = malloc(accum_alloc);
++ if (!accum)
++ oom_die();
++
++ f = fopen(pkgsfile, "r");
++ if (f == NULL) {
++ perror(pkgsfile);
++ free(accum);
++ exit(1);
++ }
++ while (fgets(buf, sizeof(buf), f)) {
++ if (*buf) {
++ size_t len = strlen(buf);
++ if (accum_size + len + 1 > accum_alloc) {
++ accum_alloc = (accum_size + len + 1) * 2;
++ accum = realloc(accum, accum_alloc);
++ if (!accum)
++ oom_die();
++ }
++ strcpy(accum + accum_size, buf);
++ accum_size += len;
++ }
++ if (*buf && buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0';
++ if (strncasecmp(buf, "Package:", 8) == 0) {
++ fieldcpy(cur_pkg, buf);
++ } else if (!*buf) {
++ int i;
++ for (i = 0; i < pkgc; i++) {
++ if (!pkgs[i]) continue;
++ if (strcmp(cur_pkg, pkgs[i]) == 0) {
++ fputs(accum, stdout);
++ if (accum[accum_size - 1] != '\n')
++ fputs("\n\n", stdout);
++ else if (accum[accum_size - 2] != '\n')
++ fputc('\n', stdout);
++ break;
++ }
++ }
++ *accum = '\0';
++ accum_size = 0;
++ }
++ }
++ fclose(f);
++
++ free(accum);
++}
++
++static int dotranslatewgetpercent(int low, int high, int end, char *str) {
++ int ch;
++ int val, lastval;
++
++ /* print out anything that looks like a % on its own line, appropriately
++ * scaled */
++
++ lastval = val = 0;
++ while ( (ch = getchar()) != EOF ) {
++ if (isdigit(ch)) {
++ val *= 10; val += ch - '0';
++ } else if (ch == '%') {
++ float f = (float) val / 100.0 * (high - low) + low;
++ if (str) {
++ printf("P: %d %d %s\n", (int) f, end, str);
++ } else {
++ printf("P: %d %d\n", (int) f, end);
++ }
++ lastval = val;
++ } else {
++ val = 0;
++ }
++ }
++ return lastval == 100;
++}
++
++int main(int argc, char *argv[]) {
++ checksum_field=getenv("DEBOOTSTRAP_CHECKSUM_FIELD");
++ if (checksum_field == NULL) {
++ checksum_field="MD5sum";
++ }
++
++ if ((argc == 6 || argc == 5) && strcmp(argv[1], "WGET%") == 0) {
++ if (dotranslatewgetpercent(atoi(argv[2]), atoi(argv[3]),
++ atoi(argv[4]), argc == 6 ? argv[5] : NULL))
++ {
++ exit(0);
++ } else {
++ exit(1);
++ }
++ } else if (argc >= 4 && strcmp(argv[1], "GETDEPS") == 0) {
++ int i;
++ for (i = 3; argc - i > MAX_PKGS; i += MAX_PKGS) {
++ dogetdeps(argv[2], argv+i, MAX_PKGS);
++ }
++ dogetdeps(argv[2], argv+i, argc-i);
++ exit(0);
++ } else if (argc >= 5 && strcmp(argv[1], "PKGS") == 0) {
++ int i;
++ for (i = 4; argc - i > MAX_PKGS; i += MAX_PKGS) {
++ dopkgmirrorpkgs(1, argv[2], argv[3], "Package:", argv+i, MAX_PKGS);
++ }
++ dopkgmirrorpkgs(1, argv[2], argv[3], "Package:", argv+i, argc-i);
++ exit(0);
++ } else if (argc >= 6 && strcmp(argv[1], "FIELD") == 0) {
++ int i;
++ for (i = 5; argc - i > MAX_PKGS; i += MAX_PKGS) {
++ dopkgmirrorpkgs(0, argv[3], argv[4], argv[2], argv+i, MAX_PKGS);
++ }
++ dopkgmirrorpkgs(0, argv[3], argv[4], argv[2], argv+i, argc-i);
++ exit(0);
++ } else if (argc >= 4 && strcmp(argv[1], "STANZAS") == 0) {
++ int i;
++ for (i = 3; argc - i > MAX_PKGS; i += MAX_PKGS) {
++ dopkgstanzas(argv[2], argv+i, MAX_PKGS);
++ }
++ dopkgstanzas(argv[2], argv+i, argc-i);
++ exit(0);
++ } else {
++ fprintf(stderr, "usage: %s PKGS mirror packagesfile pkgs..\n", argv[0]);
++ fprintf(stderr, " or: %s FIELD field mirror packagesfile pkgs..\n",
++ argv[0]);
++ fprintf(stderr, " or: %s GETDEPS packagesfile pkgs..\n", argv[0]);
++ fprintf(stderr, " or: %s STANZAS packagesfile pkgs..\n", argv[0]);
++ fprintf(stderr, " or: %s WGET%% low high end reason\n", argv[0]);
++ exit(1);
++ }
++}
+diff --git a/feeds/packages/admin/debootstrap/patches/100-busybox_fix.patch b/feeds/packages/admin/debootstrap/patches/100-busybox_fix.patch
+new file mode 100644
+index 0000000..5e8db05
+--- /dev/null
++++ b/feeds/packages/admin/debootstrap/patches/100-busybox_fix.patch
+@@ -0,0 +1,11 @@
++--- a/usr/share/debootstrap/functions
+++++ b/usr/share/debootstrap/functions
++@@ -859,8 +859,6 @@ choose_extractor () {
++
++ if [ -n "$EXTRACTOR_OVERRIDE" ]; then
++ extractor="$EXTRACTOR_OVERRIDE"
++- elif type dpkg-deb >/dev/null 2>&1; then
++- extractor="dpkg-deb"
++ else
++ extractor="ar"
++ fi
+diff --git a/feeds/packages/admin/htop/Makefile b/feeds/packages/admin/htop/Makefile
+new file mode 100644
+index 0000000..7cb4706
+--- /dev/null
++++ b/feeds/packages/admin/htop/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=htop
++PKG_VERSION:=1.0.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://hisham.hm/htop/releases/$(PKG_VERSION)/
++PKG_MD5SUM:=e768b9b55c033d9c1dffda72db3a6ac7
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/htop
++ SECTION:=admin
++ CATEGORY:=Administration
++ TITLE:=Interactive processes viewer
++ DEPENDS:=+libncurses
++ URL:=http://htop.sourceforge.net/
++ MAINTAINER:=Etienne CHAMPETIER <champetier.etienne@gmail.com>
++endef
++
++define Package/htop/description
++ Htop is an ncursed-based process viewer similar to top, but
++ it allows to scroll the list vertically and horizontally to
++ see all processes and their full command lines.
++endef
++
++CONFIGURE_ARGS += \
++ --disable-native-affinity \
++ --disable-unicode \
++ --enable-hwloc
++
++CONFIGURE_VARS += \
++ ac_cv_file__proc_stat=yes \
++ ac_cv_file__proc_meminfo=yes \
++ ac_cv_func_malloc_0_nonnull=yes \
++ ac_cv_func_realloc_0_nonnull=yes
++
++define Package/htop/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(PKG_NAME) $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,htop))
+diff --git a/feeds/packages/admin/monit/Makefile b/feeds/packages/admin/monit/Makefile
+new file mode 100644
+index 0000000..b172de4
+--- /dev/null
++++ b/feeds/packages/admin/monit/Makefile
+@@ -0,0 +1,95 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=monit
++PKG_VERSION:=5.14
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://mmonit.com/monit/dist
++PKG_MD5SUM:=1b3ae1eb08a0914402a8764e5689c1c5
++
++PKG_LICENSE:=AGPL-3.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/monit/Default
++ SECTION:=admin
++ CATEGORY:=Administration
++ DEPENDS:= +libpthread
++ TITLE:=System services monitoring utility
++ URL:=http://mmonit.com/monit/
++ MAINTAINER:=Etienne CHAMPETIER <champetier.etienne@gmail.com>
++endef
++
++define Package/monit/Default/description
++ An utility for monitoring services on a Unix system
++endef
++
++define Package/monit
++$(call Package/monit/Default)
++ DEPENDS+= +libopenssl
++ TITLE+= (with SSL support)
++ VARIANT:=ssl
++endef
++
++define Package/monit/description
++$(call Package/monit/Default/description)
++ This package is built with SSL support.
++endef
++
++define Package/monit-nossl
++$(call Package/monit/Default)
++ TITLE+= (without SSL support)
++ VARIANT:=nossl
++endef
++
++define Package/monit-nossl/description
++$(call Package/monit/Default/description)
++ This package is built without SSL support.
++endef
++
++CONFIGURE_ARGS += \
++ --without-pam \
++ libmonit_cv_setjmp_available=yes \
++ libmonit_cv_vsnprintf_c99_conformant=yes
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS += \
++ --with-ssl \
++ --with-ssl-dir="$(STAGING_DIR)/usr"
++endif
++
++ifeq ($(BUILD_VARIANT),nossl)
++ CONFIGURE_ARGS += \
++ --without-ssl
++endif
++
++define Package/monit/conffiles
++/etc/monitrc
++endef
++
++define Package/monit/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/monitrc $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/monit.init $(1)/etc/init.d/monit
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/monit $(1)/usr/bin/
++endef
++
++Package/monit-nossl/conffiles = $(Package/monit/conffiles)
++Package/monit-nossl/install = $(Package/monit/install)
++
++$(eval $(call BuildPackage,monit))
++$(eval $(call BuildPackage,monit-nossl))
+diff --git a/feeds/packages/admin/monit/files/monit.init b/feeds/packages/admin/monit/files/monit.init
+new file mode 100644
+index 0000000..2bb3609
+--- /dev/null
++++ b/feeds/packages/admin/monit/files/monit.init
+@@ -0,0 +1,15 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=60
++USE_PROCD=1
++PROG=/usr/bin/monit
++
++start_service() {
++ [ -f /etc/monitrc ] || { echo "monit: /etc/monitrc is missing"; return 1; }
++ chmod 0600 /etc/monitrc
++ procd_open_instance
++ # -I runs in foreground, as procd requires
++ procd_set_param command "$PROG" -I
++ procd_close_instance
++}
+diff --git a/feeds/packages/admin/monit/patches/001-fix-default-piddir.patch b/feeds/packages/admin/monit/patches/001-fix-default-piddir.patch
+new file mode 100644
+index 0000000..7af871f
+--- /dev/null
++++ b/feeds/packages/admin/monit/patches/001-fix-default-piddir.patch
+@@ -0,0 +1,18 @@
++--- a/configure
+++++ b/configure
++@@ -13849,14 +13849,7 @@ fi
++ # Find the right directory to put the root-mode PID file in
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pid file location" >&5
++ $as_echo_n "checking pid file location... " >&6; }
++-if test -d "/run"
++-then
++- piddir="/run"
++-elif test -d "/var/run"; then
++- piddir="/var/run"
++-elif test -d "/etc"; then
++- piddir="/etc"
++-fi
+++piddir="/var/run"
++
++
++ cat >>confdefs.h <<_ACEOF
+diff --git a/feeds/packages/admin/muninlite/Makefile b/feeds/packages/admin/muninlite/Makefile
+new file mode 100644
+index 0000000..46fc8c4
+--- /dev/null
++++ b/feeds/packages/admin/muninlite/Makefile
+@@ -0,0 +1,54 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=muninlite
++PKG_VERSION:=1.0.4
++PKG_RELEASE:=6
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/$(PKG_NAME)
++PKG_MD5SUM:=a8cc86f0cc536a6c22dc298f4ed55339
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=LICENSE
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/muninlite
++ SECTION:=admin
++ CATEGORY:=Administration
++ DEPENDS:=+xinetd
++ TITLE:=Munin node implemented in shell
++ URL:=http://sourceforge.net/projects/muninlite/
++ PKG_MAINTAINER:=Jonathan McCrohan <jmccrohan@gmail.com>
++endef
++
++define Package/muninlite/Default/description
++ Munin node implemented in shell.
++ Munin is a monitoring system for Unix networks.
++endef
++
++define Package/muninlite/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/munin-node $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/xinetd.d
++ $(INSTALL_DATA) ./files/etc/xinetd.d/munin $(1)/etc/xinetd.d/
++endef
++
++define Package/muninlite/conffiles
++/etc/xinetd.d/munin
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)
++endef
++
++$(eval $(call BuildPackage,muninlite))
+diff --git a/feeds/packages/admin/muninlite/files/etc/xinetd.d/munin b/feeds/packages/admin/muninlite/files/etc/xinetd.d/munin
+new file mode 100644
+index 0000000..012d71b
+--- /dev/null
++++ b/feeds/packages/admin/muninlite/files/etc/xinetd.d/munin
+@@ -0,0 +1,10 @@
++service munin
++{
++ socket_type = stream
++ protocol = tcp
++ wait = no
++ user = root
++ group = root
++ server = /usr/sbin/munin-node
++ disable = no
++}
+diff --git a/feeds/packages/admin/muninlite/patches/001-no_disks.patch b/feeds/packages/admin/muninlite/patches/001-no_disks.patch
+new file mode 100644
+index 0000000..bf9b2b1
+--- /dev/null
++++ b/feeds/packages/admin/muninlite/patches/001-no_disks.patch
+@@ -0,0 +1,12 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -1,7 +1,7 @@
++
++
++-PLUGINS=df cpu if_ if_err_ load memory processes swap netstat uptime interrupts irqstats ntpdate plugindir_
++-#PLUGINS=cpu if_ if_err_ load memory processes netstat uptime interrupts irqstats
+++#PLUGINS=df cpu if_ if_err_ load memory processes swap netstat uptime interrupts irqstats ntpdate plugindir_
+++PLUGINS=cpu if_ if_err_ load memory processes netstat uptime interrupts irqstats
++
++ munin-node: plugins/* munin-node.conf
++ @VERSION=$$(cat VERSION); \
+diff --git a/feeds/packages/admin/muninlite/patches/002-hostname.patch b/feeds/packages/admin/muninlite/patches/002-hostname.patch
+new file mode 100644
+index 0000000..5d87168
+--- /dev/null
++++ b/feeds/packages/admin/muninlite/patches/002-hostname.patch
+@@ -0,0 +1,11 @@
++--- a/munin-node.in
+++++ b/munin-node.in
++@@ -113,7 +113,7 @@ PLUGINS=$RES
++
++ # ===== MAIN LOOP =====
++ FUNCTIONS="list nodes config fetch version quit"
++-HOSTNAME=$(hostname -f 2>/dev/null || hostname)
+++HOSTNAME=$(/sbin/uci get "system.@system[0].hostname" 2>/dev/null || cat /proc/sys/kernel/hostname)
++ echo "# munin node at $HOSTNAME"
++ while read arg0 arg1
++ do
+diff --git a/feeds/packages/admin/muninlite/patches/100-fix-no-ethtool.patch b/feeds/packages/admin/muninlite/patches/100-fix-no-ethtool.patch
+new file mode 100644
+index 0000000..88f7e30
+--- /dev/null
++++ b/feeds/packages/admin/muninlite/patches/100-fix-no-ethtool.patch
+@@ -0,0 +1,21 @@
++--- a/plugins/if_
+++++ b/plugins/if_
++@@ -15,10 +15,14 @@ config_if() {
++ echo "up.min 0"
++ echo "up.negative down"
++ echo "up.cdef up,8,*"
++- if ethtool $1 | grep -q Speed; then
++- MAX=$(($(ethtool $1 | grep Speed | sed -e 's/[[:space:]]\{1,\}/ /g' -e 's/^ //' -e 's/M.*//' | cut -d\ -f2) * 1000000))
++- echo "up.max $MAX"
++- echo "down.max $MAX"
+++ if [ -n "$(which ethtool)" ]; then
+++ if [ -x "$(which ethtool)" ]; then
+++ if ethtool $1 | grep -q Speed; then
+++ MAX=$(($(ethtool $1 | grep Speed | sed -e 's/[[:space:]]\{1,\}/ /g' -e 's/^ //' -e 's/M.*//' | cut -d\ -f2) * 1000000))
+++ echo "up.max $MAX"
+++ echo "down.max $MAX"
+++ fi
+++ fi
++ fi
++ }
++ fetch_if() {
+diff --git a/feeds/packages/admin/muninlite/patches/110-fix-uptime-days.patch b/feeds/packages/admin/muninlite/patches/110-fix-uptime-days.patch
+new file mode 100644
+index 0000000..d9aa43f
+--- /dev/null
++++ b/feeds/packages/admin/muninlite/patches/110-fix-uptime-days.patch
+@@ -0,0 +1,12 @@
++--- a/plugins/uptime
+++++ b/plugins/uptime
++@@ -4,8 +4,7 @@ config_uptime() {
++ echo "graph_vlabel uptime in days"
++ echo "uptime.label uptime"
++ echo "uptime.draw AREA"
++- echo "uptime.cdef uptime,86400,/"
++ }
++ fetch_uptime() {
++- echo "uptime.value" $(cut -d\ -f1 /proc/uptime)
+++ awk '{printf "uptime.value %.2f",$1/86400; print ""}' /proc/uptime
++ }
+diff --git a/feeds/packages/admin/muninlite/patches/200-add-tap-dev.patch b/feeds/packages/admin/muninlite/patches/200-add-tap-dev.patch
+new file mode 100644
+index 0000000..fa46ce6
+--- /dev/null
++++ b/feeds/packages/admin/muninlite/patches/200-add-tap-dev.patch
+@@ -0,0 +1,20 @@
++--- a/munin-node.in
+++++ b/munin-node.in
++@@ -72,7 +72,7 @@ RES=""
++ for PLUG in $PLUGINS
++ do
++ if [ "$PLUG" = "if_" ]; then
++- for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
+++ for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
++ do
++ INTERRES=$(echo $INTER | sed 's/\./VLAN/')
++ RES="$RES if_$INTERRES"
++@@ -80,7 +80,7 @@ do
++ eval "config_if_${INTERRES}() { config_if $INTER $@; };"
++ done
++ elif [ "$PLUG" = "if_err_" ]; then
++- for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
+++ for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
++ do
++ INTERRES=$(echo $INTER | sed 's/\./VLAN/')
++ RES="$RES if_err_$INTERRES"
+diff --git a/feeds/packages/admin/muninlite/patches/210-add-bridge-devs.patch b/feeds/packages/admin/muninlite/patches/210-add-bridge-devs.patch
+new file mode 100644
+index 0000000..1a76e97
+--- /dev/null
++++ b/feeds/packages/admin/muninlite/patches/210-add-bridge-devs.patch
+@@ -0,0 +1,24 @@
++--- a/munin-node.in
+++++ b/munin-node.in
++@@ -72,17 +72,17 @@ RES=""
++ for PLUG in $PLUGINS
++ do
++ if [ "$PLUG" = "if_" ]; then
++- for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
+++ for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\|br-\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
++ do
++- INTERRES=$(echo $INTER | sed 's/\./VLAN/')
+++ INTERRES=$(echo $INTER | sed -e 's/\./VLAN/' -e 's/\-/_/')
++ RES="$RES if_$INTERRES"
++ eval "fetch_if_${INTERRES}() { fetch_if $INTER $@; };"
++ eval "config_if_${INTERRES}() { config_if $INTER $@; };"
++ done
++ elif [ "$PLUG" = "if_err_" ]; then
++- for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
+++ for INTER in $(grep '^ *\(ppp\|eth\|wlan\|ath\|ra\|ipsec\|tap\|br-\)\([^:]\)\{1,\}:' /proc/net/dev | cut -f1 -d: | sed 's/ //g');
++ do
++- INTERRES=$(echo $INTER | sed 's/\./VLAN/')
+++ INTERRES=$(echo $INTER | sed -e 's/\./VLAN/' -e 's/\-/_/')
++ RES="$RES if_err_$INTERRES"
++ eval "fetch_if_err_${INTERRES}() { fetch_if_err $INTER $@; };"
++ eval "config_if_err_${INTERRES}() { config_if_err $INTER $@; };"
+diff --git a/feeds/packages/admin/muninlite/patches/220-modify-ifname-parser.patch b/feeds/packages/admin/muninlite/patches/220-modify-ifname-parser.patch
+new file mode 100644
+index 0000000..95655cf
+--- /dev/null
++++ b/feeds/packages/admin/muninlite/patches/220-modify-ifname-parser.patch
+@@ -0,0 +1,22 @@
++--- a/plugins/if_
+++++ b/plugins/if_
++@@ -26,7 +26,7 @@ config_if() {
++ fi
++ }
++ fetch_if() {
++- IINFO=$(grep "$1:" /proc/net/dev | cut -d: -f2 | sed -e 's/ / /g')
+++ IINFO=$(cat /proc/net/dev | sed -e 's/-/_/g' | grep "$1:" | cut -d: -f2 | sed -e 's/ */ /g' -e 's/^[ \t]*//')
++ echo "down.value" $(echo $IINFO | cut -d\ -f1)
++ echo "up.value" $(echo $IINFO | cut -d\ -f9)
++ }
++--- a/plugins/if_err_
+++++ b/plugins/if_err_
++@@ -15,7 +15,7 @@ config_if_err() {
++ echo "trans.warning 1"
++ }
++ fetch_if_err() {
++- IINFO=$(grep "$1:" /proc/net/dev | cut -d: -f2 | sed -e 's/ / /g')
+++ IINFO=$(cat /proc/net/dev | sed -e 's/-/_/g' | grep "$1:" | cut -d: -f2 | sed -e 's/ */ /g' -e 's/^[ \t]*//')
++ echo "rcvd.value" $(echo $IINFO | cut -d\ -f3)
++ echo "trans.value" $(echo $IINFO | cut -d\ -f11)
++ }
+diff --git a/feeds/packages/admin/sudo/Makefile b/feeds/packages/admin/sudo/Makefile
+new file mode 100644
+index 0000000..3f2d6f8
+--- /dev/null
++++ b/feeds/packages/admin/sudo/Makefile
+@@ -0,0 +1,98 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sudo
++PKG_VERSION:=1.8.14p3
++PKG_RELEASE:=1
++PKG_LICENSE:=ISC
++PKG_LICENSE_FILES:=doc/LICENSE
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.sudo.ws/dist
++PKG_MD5SUM:=93dbd1e47c136179ff1b01494c1c0e75
++
++PKG_INSTALL:=1
++
++PKG_BUILD_DEPENDS:=sudo/host
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/sudo
++ SECTION:=admin
++ CATEGORY:=Administration
++ TITLE:=Delegate authority to run commands
++ URL:=http://www.sudo.ws/
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++endef
++
++define Package/sudo/description
++ Sudo (su "do") allows a system administrator to delegate authority to
++ give certain users (or groups of users) the ability to run some (or
++ all) commands as root or another user while providing an audit trail of
++ the commands and their arguments.
++endef
++
++define Package/sudo/conffiles
++/etc/sudoers
++/etc/sudoers.d/
++endef
++
++CONFIGURE_ARGS+= \
++ --without-pam \
++ --disable-pam-session \
++ --with-editor=/bin/vi \
++ --without-lecture \
++ --disable-zlib \
++ --with-rundir=/var/lib/sudo \
++ --with-vardir=/var/lib/sudo
++
++CONFIGURE_VARS+= \
++ sudo_cv_uid_t_len=10 \
++ sudo_cv_func_unsetenv_void=no
++
++include $(INCLUDE_DIR)/host-build.mk
++
++define Host/Compile
++ cd $(HOST_BUILD_DIR)/lib/util; \
++ $(MAKE) mksiglist; $(MAKE) mksigname
++endef
++
++define Host/Install
++ $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin
++ $(CP) $(HOST_BUILD_DIR)/lib/util/mksig{list,name} $(STAGING_DIR_HOST)/bin/
++endef
++
++$(eval $(call HostBuild))
++
++define Package/sudo/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/sudo $(1)/usr/bin/
++ chmod 4755 $(1)/usr/bin/sudo
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/visudo $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_INSTALL_DIR)/etc/sudoers $(1)/etc/
++ chmod 0440 $(1)/etc/sudoers
++ $(INSTALL_DIR) $(1)/etc/sudoers.d
++ $(INSTALL_DIR) $(1)/usr/lib/sudo
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/sudo/*.so* $(1)/usr/lib/sudo/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/sudo.init $(1)/etc/init.d/sudo
++endef
++
++define Package/sudo/postinst
++#!/bin/sh
++
++[ -n "$$IPKG_INSTROOT" ] || {
++ /etc/init.d/sudo enable
++ /etc/init.d/sudo start
++}
++endef
++
++$(eval $(call BuildPackage,sudo))
+diff --git a/feeds/packages/admin/sudo/files/sudo.init b/feeds/packages/admin/sudo/files/sudo.init
+new file mode 100755
+index 0000000..705fe84
+--- /dev/null
++++ b/feeds/packages/admin/sudo/files/sudo.init
+@@ -0,0 +1,11 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=99
++
++start() {
++ [ -d /var/lib/sudo ] || {
++ mkdir -m 0755 -p /var/lib/sudo
++ chmod 0700 /var/lib/sudo
++ }
++}
+diff --git a/feeds/packages/admin/sudo/patches/010-cross-compile-fixes.patch b/feeds/packages/admin/sudo/patches/010-cross-compile-fixes.patch
+new file mode 100644
+index 0000000..4e80d4d
+--- /dev/null
++++ b/feeds/packages/admin/sudo/patches/010-cross-compile-fixes.patch
+@@ -0,0 +1,25 @@
++diff -rupN sudo-1.8.11p2.orig/lib/util/Makefile.in sudo-1.8.11p2/lib/util/Makefile.in
++--- sudo-1.8.11p2.orig/lib/util/Makefile.in 2014-10-07 22:26:20.000000000 +0200
+++++ sudo-1.8.11p2/lib/util/Makefile.in 2014-12-09 21:44:35.610041162 +0100
++@@ -17,6 +17,8 @@
++ # @configure_input@
++ #
++
+++include $(TOPDIR)/rules.mk
+++
++ #### Start of system configuration section. ####
++
++ srcdir = @srcdir@
++@@ -142,10 +144,10 @@ libsudo_util.la: $(LTOBJS) @LT_LDDEP@
++ esac
++
++ siglist.c: mksiglist
++- ./mksiglist > $@
+++ $(STAGING_DIR_HOST)/bin/mksiglist > $@
++
++ signame.c: mksigname
++- ./mksigname > $@
+++ $(STAGING_DIR_HOST)/bin/mksigname > $@
++
++ mksiglist: $(srcdir)/mksiglist.c $(srcdir)/mksiglist.h $(incdir)/sudo_compat.h $(top_builddir)/config.h
++ $(CC) $(CPPFLAGS) $(CFLAGS) $(DEFS) $(srcdir)/mksiglist.c -o $@
+diff --git a/feeds/packages/admin/sudo/patches/020-no-owner-change.patch b/feeds/packages/admin/sudo/patches/020-no-owner-change.patch
+new file mode 100644
+index 0000000..417e95d
+--- /dev/null
++++ b/feeds/packages/admin/sudo/patches/020-no-owner-change.patch
+@@ -0,0 +1,12 @@
++diff -rupN sudo-1.8.11p2.orig/Makefile.in sudo-1.8.11p2/Makefile.in
++--- sudo-1.8.11p2.orig/Makefile.in 2014-10-07 22:26:20.000000000 +0200
+++++ sudo-1.8.11p2/Makefile.in 2014-12-09 22:00:27.256934143 +0100
++@@ -62,7 +62,7 @@ SHELL = @SHELL@
++ SED = @SED@
++
++ INSTALL = $(SHELL) $(top_srcdir)/install-sh -c
++-INSTALL_OWNER = -o $(install_uid) -g $(install_gid)
+++INSTALL_OWNER =
++
++ ECHO_N = @ECHO_N@
++ ECHO_C = @ECHO_C@
+diff --git a/feeds/packages/admin/sudo/patches/030-musl-fix-missing-header.patch b/feeds/packages/admin/sudo/patches/030-musl-fix-missing-header.patch
+new file mode 100644
+index 0000000..efb7d87
+--- /dev/null
++++ b/feeds/packages/admin/sudo/patches/030-musl-fix-missing-header.patch
+@@ -0,0 +1,12 @@
++diff -rupN sudo-1.8.14p3.orig/include/sudo_util.h sudo-1.8.14p3/include/sudo_util.h
++--- sudo-1.8.14p3.orig/include/sudo_util.h 2015-07-22 14:22:49.000000000 +0200
+++++ sudo-1.8.14p3/include/sudo_util.h 2015-08-30 18:41:24.509814946 +0200
++@@ -23,6 +23,8 @@
++ # include "compat/stdbool.h"
++ #endif /* HAVE_STDBOOL_H */
++
+++#include <sys/types.h>
+++
++ /*
++ * Macros for operating on struct timeval.
++ */
+diff --git a/feeds/packages/admin/zabbix/Makefile b/feeds/packages/admin/zabbix/Makefile
+new file mode 100644
+index 0000000..424779e
+--- /dev/null
++++ b/feeds/packages/admin/zabbix/Makefile
+@@ -0,0 +1,248 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=zabbix
++PKG_VERSION:=2.4.6
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/zabbix
++PKG_MD5SUM:=06ad8d5808a0eddf2b9f0a256b6a5fde
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/zabbix/Default
++ SECTION:=admin
++ CATEGORY:=Administration
++ TITLE:=Zabbix
++ URL:=http://www.zabbix.com/
++ SUBMENU:=zabbix
++ MAINTAINER:=Etienne CHAMPETIER <champetier.etienne@gmail.com>
++ USERID:=zabbix=53:zabbix=53
++endef
++
++define Package/zabbix-agent
++ $(call Package/zabbix/Default)
++ TITLE+= agent
++endef
++
++define Package/zabbix-agentd
++ $(call Package/zabbix/Default)
++ TITLE+= agentd
++endef
++
++define Package/zabbix-extra-mac80211
++ $(call Package/zabbix/Default)
++ TITLE+= discovery/userparameters for mac80211
++ DEPENDS += +zabbix-agentd @PACKAGE_MAC80211_DEBUGFS @KERNEL_DEBUG_FS
++endef
++
++define Package/zabbix-extra-network
++ $(call Package/zabbix/Default)
++ TITLE+= discovery/userparameters for network
++ DEPENDS += +zabbix-agentd +libuci-lua +lua
++endef
++
++define Package/zabbix-extra-wifi
++ $(call Package/zabbix/Default)
++ TITLE+= discovery/userparameters for wifi
++ DEPENDS += +zabbix-agentd +libiwinfo-lua +libuci-lua +lua
++endef
++
++define Package/zabbix-sender
++ $(call Package/zabbix/Default)
++ TITLE+= sender
++endef
++
++define Package/zabbix-get
++ $(call Package/zabbix/Default)
++ TITLE+= get
++endef
++
++define Package/zabbix-server
++ $(call Package/zabbix/Default)
++ TITLE+= server
++ DEPENDS += +libsqlite3
++endef
++
++define Package/zabbix-proxy
++ $(call Package/zabbix/Default)
++ TITLE+= proxy
++ DEPENDS += +libsqlite3
++endef
++
++define Package/zabbix-extra-mac80211/description
++An extra package for zabbix-agentd that adds a discovery rule for mac80211 wifi phy and many userparameters.
++It contains an suid helper to allow zabbix-agentd to still run as zabbix user and not as root.
++See http://wiki.openwrt.org/doc/howto/zabbix for ready to use zabbix templates.
++endef
++
++define Package/zabbix-extra-network/description
++An extra package for zabbix-agentd that adds a discovery rule for openwrt network interfaces.
++The idea here is to discover only interfaces listed in /etc/config/network (discover br-lan and not eth0.1 and wlan0)
++See http://wiki.openwrt.org/doc/howto/zabbix for ready to use zabbix templates.
++endef
++
++define Package/zabbix-extra-wifi/description
++An extra package for zabbix-agentd that adds a discovery rule for wifi interfaces and many userparameters.
++As it uses libiwinfo, it works with all wifi devices supported by openwrt.
++See http://wiki.openwrt.org/doc/howto/zabbix for ready to use zabbix templates.
++endef
++
++CONFIGURE_ARGS+= \
++ --enable-agent \
++ --enable-server \
++ --enable-proxy \
++ $(call autoconf_bool,CONFIG_IPV6,ipv6) \
++ --disable-java \
++ --with-sqlite3="$(STAGING_DIR)/usr"
++
++MAKE_FLAGS += ARCH="linux"
++
++define Package/zabbix/install/sbin
++ $(INSTALL_DIR) \
++ $(1)/usr/sbin
++
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/sbin/zabbix_$(2) \
++ $(1)/usr/sbin/
++endef
++
++define Package/zabbix/install/bin
++ $(INSTALL_DIR) \
++ $(1)/usr/bin
++
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/zabbix_$(2) \
++ $(1)/usr/bin/
++endef
++
++define Package/zabbix/install/etc
++ $(INSTALL_DIR) \
++ $(1)/etc
++
++ $(INSTALL_CONF) \
++ $(PKG_INSTALL_DIR)/etc/zabbix_$(2).conf \
++ $(1)/etc/
++endef
++
++define Package/zabbix/install/init.d
++ $(INSTALL_DIR) \
++ $(1)/etc/init.d
++
++ $(INSTALL_BIN) \
++ ./files/zabbix_$(2).init \
++ $(1)/etc/init.d/zabbix_$(2)
++endef
++
++define Package/zabbix/install/zabbix.conf.d
++ $(INSTALL_DIR) \
++ $(1)/etc/zabbix_agentd.conf.d
++
++ $(INSTALL_BIN) \
++ ./files/$(2) \
++ $(1)/etc/zabbix_agentd.conf.d/$(2)
++endef
++
++define Package/zabbix-agent/conffiles
++/etc/zabbix_agent.conf
++endef
++define Package/zabbix-agentd/conffiles
++/etc/zabbix_agentd.conf
++endef
++define Package/zabbix-server/conffiles
++/etc/zabbix_server.conf
++endef
++define Package/zabbix-proxy/conffiles
++/etc/zabbix_proxy.conf
++endef
++
++ifdef CONFIG_PACKAGE_zabbix-extra-mac80211
++define Build/Prepare/zabbix-extra-mac80211
++ mkdir -p $(PKG_BUILD_DIR)/zabbix-extra-mac80211
++ $(CP) ./files/zabbix_helper_mac80211.c $(PKG_BUILD_DIR)/zabbix-extra-mac80211/
++endef
++
++define Build/Compile/zabbix-extra-mac80211
++ $(TARGET_CC) $(TARGET_CFLAGS) $(PKG_BUILD_DIR)/zabbix-extra-mac80211/zabbix_helper_mac80211.c -o $(PKG_BUILD_DIR)/zabbix-extra-mac80211/zabbix_helper_mac80211
++endef
++endif
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ $(call Build/Prepare/zabbix-extra-mac80211)
++endef
++
++define Build/Compile
++ $(call Build/Compile/Default)
++ $(call Build/Compile/zabbix-extra-mac80211)
++endef
++
++define Package/zabbix-agent/install
++ $(call Package/zabbix/install/sbin,$(1),agent)
++ $(call Package/zabbix/install/etc,$(1),agent)
++endef
++
++define Package/zabbix-agentd/install
++ $(INSTALL_DIR) $(1)/etc/zabbix_agentd.conf.d
++ $(call Package/zabbix/install/sbin,$(1),agentd)
++ $(call Package/zabbix/install/etc,$(1),agentd)
++ $(call Package/zabbix/install/init.d,$(1),agentd)
++endef
++
++define Package/zabbix-extra-mac80211/install
++ $(call Package/zabbix/install/zabbix.conf.d,$(1),mac80211)
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/zabbix-extra-mac80211/zabbix_helper_mac80211 $(1)/usr/bin/
++ chmod 4755 $(1)/usr/bin/zabbix_helper_mac80211
++endef
++
++define Package/zabbix-extra-network/install
++ $(call Package/zabbix/install/zabbix.conf.d,$(1),network)
++endef
++
++define Package/zabbix-extra-wifi/install
++ $(call Package/zabbix/install/zabbix.conf.d,$(1),wifi)
++endef
++
++define Package/zabbix-sender/install
++ $(call Package/zabbix/install/bin,$(1),sender)
++endef
++
++define Package/zabbix-get/install
++ $(call Package/zabbix/install/bin,$(1),get)
++endef
++
++define Package/zabbix-server/install
++ $(call Package/zabbix/install/sbin,$(1),server)
++ $(call Package/zabbix/install/etc,$(1),server)
++endef
++
++define Package/zabbix-proxy/install
++ $(call Package/zabbix/install/sbin,$(1),proxy)
++ $(call Package/zabbix/install/etc,$(1),proxy)
++endef
++
++$(eval $(call BuildPackage,zabbix-agent))
++$(eval $(call BuildPackage,zabbix-agentd))
++$(eval $(call BuildPackage,zabbix-extra-mac80211))
++$(eval $(call BuildPackage,zabbix-extra-network))
++$(eval $(call BuildPackage,zabbix-extra-wifi))
++$(eval $(call BuildPackage,zabbix-sender))
++$(eval $(call BuildPackage,zabbix-server))
++$(eval $(call BuildPackage,zabbix-proxy))
++$(eval $(call BuildPackage,zabbix-get))
+diff --git a/feeds/packages/admin/zabbix/files/mac80211 b/feeds/packages/admin/zabbix/files/mac80211
+new file mode 100644
+index 0000000..93d8351
+--- /dev/null
++++ b/feeds/packages/admin/zabbix/files/mac80211
+@@ -0,0 +1,27 @@
++#see http://wiki.openwrt.org/doc/howto/zabbix for ready to use templates
++
++# If you want to know the exact meaning of an UserParameter, you can search in the ieee80211 standard:
++# http://standards.ieee.org/getieee802/download/802.11-2012.pdf
++# exemple: for mac80211.ACKFailureCount search for dot11ACKFailureCount (page 2145)
++
++# mac80211 phy discovery (like 'phy0')
++# exemple: {"data":[{"{#PHY}":"phy0"}]}
++#
++UserParameter=mac80211.phydiscovery,zabbix_helper_mac80211 discovery
++
++#phy statistics (you need {#PHY} as parameter)
++#
++UserParameter=mac80211.ACKFailureCount[*],zabbix_helper_mac80211 $1 dot11ACKFailureCount
++UserParameter=mac80211.FCSErrorCount[*],zabbix_helper_mac80211 $1 dot11FCSErrorCount
++UserParameter=mac80211.RTSFailureCount[*],zabbix_helper_mac80211 $1 dot11RTSFailureCount
++UserParameter=mac80211.RTSSuccessCount[*],zabbix_helper_mac80211 $1 dot11RTSSuccessCount
++UserParameter=mac80211.FailedCount[*],zabbix_helper_mac80211 $1 failed_count
++UserParameter=mac80211.FrameDuplicateCount[*],zabbix_helper_mac80211 $1 frame_duplicate_count
++UserParameter=mac80211.MulticastReceivedFrameCount[*],zabbix_helper_mac80211 $1 multicast_received_frame_count
++UserParameter=mac80211.MulticastTransmittedFrameCount[*],zabbix_helper_mac80211 $1 multicast_transmitted_frame_count
++UserParameter=mac80211.MultipleRetryCount[*],zabbix_helper_mac80211 $1 multiple_retry_count
++UserParameter=mac80211.ReceivedFragmentCount[*],zabbix_helper_mac80211 $1 received_fragment_count
++UserParameter=mac80211.RetryCount[*],zabbix_helper_mac80211 $1 retry_count
++UserParameter=mac80211.TransmittedFragmentCount[*],zabbix_helper_mac80211 $1 transmitted_fragment_count
++UserParameter=mac80211.TransmittedFrameCount[*],zabbix_helper_mac80211 $1 transmitted_frame_count
++
+diff --git a/feeds/packages/admin/zabbix/files/network b/feeds/packages/admin/zabbix/files/network
+new file mode 100644
+index 0000000..51cb1cb
+--- /dev/null
++++ b/feeds/packages/admin/zabbix/files/network
+@@ -0,0 +1,9 @@
++#see http://wiki.openwrt.org/doc/howto/zabbix for ready to use templates
++
++# network interface discovery
++# exemple: {"data":[{"{#IF}":"lo", "{#NET}":"loopback"},{"{#IF}":"br-lan", "{#NET}":"lan"},{"{#IF}":"eth0.1", "{#NET}":"wan"}]}
++#
++UserParameter=netowrt.discovery,lua -l uci -e 'x = uci.cursor(nil, "/var/state");list = "{\"data\":[";x:foreach("network", "interface", function(s) list=list.."{\"{#IF}\":\""..s.ifname.."\", \"{#NET}\":\""..s[".name"].."\"}," end); list=string.gsub(list,",$",""); print(list.."]}")'
++
++
++
+diff --git a/feeds/packages/admin/zabbix/files/wifi b/feeds/packages/admin/zabbix/files/wifi
+new file mode 100644
+index 0000000..6315ea9
+--- /dev/null
++++ b/feeds/packages/admin/zabbix/files/wifi
+@@ -0,0 +1,25 @@
++#see http://wiki.openwrt.org/doc/howto/zabbix for ready to use templates
++
++# wifi interface discovery
++# exemple: {"data":[{"{#IF}":"wlan0", "{#MODE}":"ap", "{#SSID}":"Openwrt", "{#NET}":"lan", "{#DEV}":"radio0", "{#ENC}":"psk2+ccmp", "{#TYPE}":"mac80211", "{#HWMODE}":"11ng", "{#CHANNEL}":"11", "{#BSSID}":"xx:xx:xx:xx:xx:xx"}]}
++# ubus call only work as root so you need to run zabbix as root to use wifi.ifdiscovery
++UserParameter=wifi.ifdiscovery, lua -l ubus -l iwinfo -e 'u=ubus.connect();list="{\"data\":[";stat=u:call("network.wireless", "status", {});for dev, dev_table in pairs(stat) do for i, iface in pairs(dev_table["interfaces"]) do c=iface["config"];i=iface["ifname"];t=iwinfo.type(i);iw=iwinfo[t];e = iw.encryption(i);e = e and e.description or "None";n = table.concat(c["network"]," ");list=list.."{\"{#IF}\":\""..i.."\", \"{#MODE}\":\""..iw.mode(i).."\", \"{#SSID}\":\""..c["ssid"].."\", \"{#NET}\":\""..n.."\", \"{#DEV}\":\""..dev.."\", \"{#ENC}\":\""..e.."\", \"{#TYPE}\":\""..t.."\", \"{#HWMODE}\":\"".."?".."\", \"{#CHANNEL}\":\""..iw.channel(i).."\", \"{#BSSID}\":\""..iw.bssid(i).."\"},";end;end;list=string.gsub(list,",$","");print(list.."]}")'
++
++
++#iwinfo info (you need {#IF} as parameter, like 'wlan0')
++UserParameter=wifi.iwinfo.channel[*],lua -l iwinfo -e "print(iwinfo[iwinfo.type('$1')].channel('$1'))"
++UserParameter=wifi.iwinfo.frequency[*],lua -l iwinfo -e "print(iwinfo[iwinfo.type('$1')].frequency('$1'))"
++UserParameter=wifi.iwinfo.txpower[*],lua -l iwinfo -e "print(iwinfo[iwinfo.type('$1')].txpower('$1'))"
++UserParameter=wifi.iwinfo.bitrate[*],lua -l iwinfo -e "b = iwinfo[iwinfo.type('$1')].bitrate('$1'); print(b or '0')"
++UserParameter=wifi.iwinfo.signal[*],lua -l iwinfo -e "s = iwinfo[iwinfo.type('$1')].signal('$1'); print(s or '-255')"
++UserParameter=wifi.iwinfo.noise[*],lua -l iwinfo -e "print(iwinfo[iwinfo.type('$1')].noise('$1'))"
++UserParameter=wifi.iwinfo.quality[*],lua -l iwinfo -e "print(iwinfo[iwinfo.type('$1')].quality('$1'))"
++UserParameter=wifi.iwinfo.quality_max[*],lua -l iwinfo -e "print(iwinfo[iwinfo.type('$1')].quality_max('$1'))"
++UserParameter=wifi.iwinfo.mode[*],lua -l iwinfo -e "print(iwinfo[iwinfo.type('$1')].mode('$1'))"
++UserParameter=wifi.iwinfo.ssid[*],lua -l iwinfo -e "print(iwinfo[iwinfo.type('$1')].ssid('$1'))"
++UserParameter=wifi.iwinfo.bssid[*],lua -l iwinfo -e "print(iwinfo[iwinfo.type('$1')].bssid('$1'))"
++UserParameter=wifi.iwinfo.country[*],lua -l iwinfo -e "print(iwinfo[iwinfo.type('$1')].country('$1'))"
++UserParameter=wifi.iwinfo.nbusers[*],lua -l iwinfo -e "n = 0; for _,_ in pairs(iwinfo[iwinfo.type('$1')].assoclist('$1')) do n = n + 1 end; print(n)"
++UserParameter=wifi.iwinfo.encryption[*],lua -l iwinfo -e "e = iwinfo[iwinfo.type('$1')].encryption('$1'); print(e and e.description or 'None')"
++UserParameter=wifi.iwinfo.hwmode[*],lua -l iwinfo -e "x=iwinfo[iwinfo.type('$1')].hwmodelist('$1'); print((x.a and 'a' or '')..(x.b and 'b' or '')..(x.g and 'g' or '')..(x.n and 'n' or ''))"
++
+diff --git a/feeds/packages/admin/zabbix/files/zabbix_agentd.init b/feeds/packages/admin/zabbix/files/zabbix_agentd.init
+new file mode 100755
+index 0000000..86f1ced
+--- /dev/null
++++ b/feeds/packages/admin/zabbix/files/zabbix_agentd.init
+@@ -0,0 +1,21 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008-2011 OpenWrt.org
++
++START=60
++
++USE_PROCD=1
++PROG=/usr/sbin/zabbix_agentd
++CONFIG=/etc/zabbix_agentd.conf
++
++start_service() {
++ # Sometimes the agentd config was installed in /etc/zabbix/zabbix_agentd.conf
++ [ -f /etc/zabbix/zabbix_agentd.conf ] && mv /etc/zabbix/zabbix_agentd.conf ${CONFIG}
++
++ [ -f ${CONFIG} ] || return 1
++
++ procd_open_instance
++ procd_set_param command ${PROG} -c ${CONFIG} -f
++ procd_set_param respawn
++ procd_close_instance
++}
++
+diff --git a/feeds/packages/admin/zabbix/files/zabbix_helper_mac80211.c b/feeds/packages/admin/zabbix/files/zabbix_helper_mac80211.c
+new file mode 100644
+index 0000000..1442d27
+--- /dev/null
++++ b/feeds/packages/admin/zabbix/files/zabbix_helper_mac80211.c
+@@ -0,0 +1,77 @@
++#define _GNU_SOURCE
++#include <stdio.h>
++#include <string.h>
++#include <stdlib.h>
++#include <sys/types.h>
++#include <dirent.h>
++#include <stdbool.h>
++
++int discovery()
++{
++ DIR *dir;
++ struct dirent *ent;
++ bool comma = false;
++ if ((dir = opendir ("/sys/kernel/debug/ieee80211/")) != NULL) {
++ printf("{\"data\":[");
++ while ((ent = readdir (dir)) != NULL) {
++ if (strcmp(".", ent->d_name) && strcmp("..", ent->d_name)) {
++ if (comma)
++ printf(",");
++ printf("{\"{#PHY}\":\"%s\"}", ent->d_name);
++ comma = true;
++ }
++ }
++ printf("]}\n");
++ closedir(dir);
++ } else {
++ perror("");
++ return EXIT_FAILURE;
++ }
++ return EXIT_SUCCESS;
++}
++
++int get_param(char *phy, char *stat)
++{
++ char *filename = NULL;
++ FILE *f = NULL;
++ phy = basename(phy);
++ stat = basename(stat);
++ if (asprintf(&filename, "/sys/kernel/debug/ieee80211/%s/statistics/%s", phy, stat) > 0)
++ f = fopen(filename, "r");
++
++ if (f != NULL) {
++ char temp[256];
++ while (fgets(temp, 256, f) != NULL)
++ printf("%s",temp);
++
++ fclose(f);
++ } else {
++ perror("");
++ return EXIT_FAILURE;
++ }
++ free(filename);
++ return EXIT_SUCCESS;
++}
++
++int usage(char *name)
++{
++ fprintf(stderr, "Usage:\n");
++ fprintf(stderr, " %s discovery\n", name);
++ fprintf(stderr, " => print mac80211.phydiscovery discovery rule\n");
++ fprintf(stderr, " %s PHY STAT\n", name);
++ fprintf(stderr, " => cat /sys/kernel/debug/ieee80211/PHY/statistics/STAT as root\n");
++ return EXIT_FAILURE;
++}
++
++int main(int argc, char *argv[])
++{
++
++ switch (argc) {
++ case 2:
++ return discovery();
++ case 3:
++ return get_param(argv[1], argv[2]);
++ default:
++ return usage(argv[0]);
++ }
++}
+diff --git a/feeds/packages/admin/zabbix/patches/002-fix-res_send-on-uclibc.patch b/feeds/packages/admin/zabbix/patches/002-fix-res_send-on-uclibc.patch
+new file mode 100644
+index 0000000..cedad90
+--- /dev/null
++++ b/feeds/packages/admin/zabbix/patches/002-fix-res_send-on-uclibc.patch
+@@ -0,0 +1,35 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -152,6 +152,10 @@ if test "x$found_resolv" != "xyes"; then
++ AC_MSG_ERROR([Unable to do DNS lookups (libresolv check failed)])
++ fi
++ LIBS="${LIBS} ${RESOLV_LIBS}"
+++AC_SEARCH_LIBS([res_mkquery], [], [AC_DEFINE([HAVE_RES_MKQUERY], 1, [Define if res_mkquery exists])])
+++AC_SEARCH_LIBS([__res_mkquery], [], [AC_DEFINE([HAVE_RES_MKQUERY], 1, [Define if res_mkquery exists])])
+++AC_SEARCH_LIBS([res_send], [], [AC_DEFINE([HAVE_RES_SEND], 1, [Define if res_send exists])])
+++AC_SEARCH_LIBS([__res_send], [], [AC_DEFINE([HAVE_RES_SEND], 1, [Define if res_send exists])])
++
++ dnl *****************************************************************
++ dnl * *
++--- a/src/libs/zbxsysinfo/common/net.c
+++++ b/src/libs/zbxsysinfo/common/net.c
++@@ -450,6 +450,7 @@ static int dns_query(AGENT_REQUEST *requ
++ return SYSINFO_RET_FAIL;
++ }
++
+++#if defined(HAVE_RES_MKQUERY) && defined(HAVE_RES_SEND)
++ if (-1 == (res = res_mkquery(QUERY, zone, C_IN, type, NULL, 0, NULL, buf, sizeof(buf))))
++ {
++ SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot create DNS query: %s", zbx_strerror(errno)));
++@@ -480,6 +481,11 @@ static int dns_query(AGENT_REQUEST *requ
++ _res.retry = retry;
++
++ res = res_send(buf, res, answer.buffer, sizeof(answer.buffer));
+++#else /* defined(HAVE_RES_QUERY) && defined(HAVE_RES_SEND) */
+++ /* retrand and retry are ignored */
+++ if (-1 == (res = res_query(zone, C_IN, type, answer.buffer, sizeof(answer.buffer))))
+++ return SYSINFO_RET_FAIL;
+++#endif
++
++ _res.retrans = saved_retrans;
++ _res.retry = saved_retry;
+diff --git a/feeds/packages/admin/zabbix/patches/002-uclibc_loadavg.patch b/feeds/packages/admin/zabbix/patches/002-uclibc_loadavg.patch
+new file mode 100644
+index 0000000..191f1a1
+--- /dev/null
++++ b/feeds/packages/admin/zabbix/patches/002-uclibc_loadavg.patch
+@@ -0,0 +1,48 @@
++--- a/src/libs/zbxsysinfo/linux/cpu.c
+++++ b/src/libs/zbxsysinfo/linux/cpu.c
++@@ -62,6 +62,45 @@ int SYSTEM_CPU_DISCOVERY(AGENT_REQUEST *
++ return SYSINFO_RET_OK;
++ }
++
+++
+++/* uclibc and dietlibc do not have this junk -ReneR */
+++#if defined (__UCLIBC__) || defined (__dietlibc__)
+++static int getloadavg (double loadavg[], int nelem)
+++{
+++ int fd;
+++
+++ fd = open ("/proc/loadavg", O_RDONLY);
+++ if (fd < 0)
+++ return -1;
+++ else
+++ {
+++ char buf[65], *p;
+++ ssize_t nread;
+++ int i;
+++
+++ nread = read (fd, buf, sizeof buf - 1);
+++ close (fd);
+++ if (nread <= 0)
+++ return -1;
+++ buf[nread - 1] = '\0';
+++
+++ if (nelem > 3)
+++ nelem = 3;
+++ p = buf;
+++ for (i = 0; i < nelem; ++i)
+++ {
+++ char *endp;
+++ loadavg[i] = strtod (p, &endp);
+++ if (endp == p)
+++ return -1;
+++ p = endp;
+++ }
+++
+++ return i;
+++ }
+++}
+++#endif
+++
++ int SYSTEM_CPU_NUM(AGENT_REQUEST *request, AGENT_RESULT *result)
++ {
++ char *type;
+diff --git a/feeds/packages/admin/zabbix/patches/010-change-agentd-config.patch b/feeds/packages/admin/zabbix/patches/010-change-agentd-config.patch
+new file mode 100644
+index 0000000..e4812f6
+--- /dev/null
++++ b/feeds/packages/admin/zabbix/patches/010-change-agentd-config.patch
+@@ -0,0 +1,62 @@
++--- a/conf/zabbix_agentd.conf
+++++ b/conf/zabbix_agentd.conf
++@@ -3,12 +3,8 @@
++
++ ############ GENERAL PARAMETERS #################
++
++-### Option: PidFile
++-# Name of PID file.
++-#
++-# Mandatory: no
++-# Default:
++-# PidFile=/tmp/zabbix_agentd.pid
+++# We do not need PidFile with procd
+++# PidFile=/var/run/zabbix_agentd.pid
++
++ ### Option: LogFile
++ # Name of log file.
++@@ -18,8 +14,6 @@
++ # Default:
++ # LogFile=
++
++-LogFile=/tmp/zabbix_agentd.log
++-
++ ### Option: LogFileSize
++ # Maximum size of log file in MB.
++ # 0 - disable automatic log rotation.
++@@ -104,6 +98,7 @@ Server=127.0.0.1
++ # Range: 0-100
++ # Default:
++ # StartAgents=3
+++StartAgents=1
++
++ ##### Active checks related
++
++@@ -119,8 +114,6 @@ Server=127.0.0.1
++ # Default:
++ # ServerActive=
++
++-ServerActive=127.0.0.1
++-
++ ### Option: Hostname
++ # Unique, case sensitive hostname.
++ # Required for active checks and must match hostname as configured on the server.
++@@ -130,8 +123,6 @@ ServerActive=127.0.0.1
++ # Default:
++ # Hostname=
++
++-Hostname=Zabbix server
++-
++ ### Option: HostnameItem
++ # Item used for generating Hostname if it is undefined. Ignored if Hostname is defined.
++ # Does not support UserParameters or aliases.
++@@ -249,8 +240,8 @@ Hostname=Zabbix server
++ # Include=
++
++ # Include=/usr/local/etc/zabbix_agentd.userparams.conf
++-# Include=/usr/local/etc/zabbix_agentd.conf.d/
++ # Include=/usr/local/etc/zabbix_agentd.conf.d/*.conf
+++Include=/etc/zabbix_agentd.conf.d/
++
++ ####### USER-DEFINED MONITORED PARAMETERS #######
++
+diff --git a/feeds/packages/admin/zabbix/patches/015-daemon-foreground.patch b/feeds/packages/admin/zabbix/patches/015-daemon-foreground.patch
+new file mode 100644
+index 0000000..364e703
+--- /dev/null
++++ b/feeds/packages/admin/zabbix/patches/015-daemon-foreground.patch
+@@ -0,0 +1,243 @@
++--- a/include/common.h
+++++ b/include/common.h
++@@ -1083,4 +1083,7 @@ int parse_serveractive_element(char *str
++
++ char *zbx_dyn_escape_shell_single_quote(const char *text);
++
+++#define ZBX_RUN_BACKGROUND 0
+++#define ZBX_RUN_FOREGROUND 1
+++
++ #endif
++--- a/include/daemon.h
+++++ b/include/daemon.h
++@@ -28,7 +28,7 @@ extern char *CONFIG_PID_FILE;
++
++ #include "threads.h"
++
++-int daemon_start(int allow_root, const char *user);
+++int daemon_start(int allow_root, const char *user, int run_foreground);
++ void daemon_stop();
++
++ int zbx_sigusr_send(int flags);
++@@ -36,6 +36,6 @@ int zbx_sigusr_send(int flags);
++ #define ZBX_IS_RUNNING() 1
++ #define ZBX_DO_EXIT()
++
++-#define START_MAIN_ZABBIX_ENTRY(a, u) daemon_start(a, u)
+++#define START_MAIN_ZABBIX_ENTRY(a, u, f) daemon_start(a, u, f)
++
++ #endif /* ZABBIX_DAEMON_H */
++--- a/src/libs/zbxnix/daemon.c
+++++ b/src/libs/zbxnix/daemon.c
++@@ -272,16 +272,17 @@ static void set_daemon_signal_handlers()
++ * *
++ * Purpose: init process as daemon *
++ * *
++- * Parameters: allow_root - allow root permission for application *
++- * user - user on the system to which to drop the *
++- * privileges *
+++ * Parameters: allow_root - allow root permission for application *
+++ * user - user on the system to which to drop the *
+++ * privileges *
+++ * run_foreground - should it close its controling tty *
++ * *
++ * Author: Alexei Vladishev *
++ * *
++ * Comments: it doesn't allow running under 'root' if allow_root is zero *
++ * *
++ ******************************************************************************/
++-int daemon_start(int allow_root, const char *user)
+++int daemon_start(int allow_root, const char *user, int run_foreground)
++ {
++ pid_t pid;
++ struct passwd *pwd;
++@@ -336,15 +337,22 @@ int daemon_start(int allow_root, const c
++ #endif
++ }
++
++- if (0 != (pid = zbx_fork()))
++- exit(EXIT_SUCCESS);
+++ if ( ZBX_RUN_FOREGROUND != run_foreground)
+++ if (0 != (pid = zbx_fork()))
+++ exit(EXIT_SUCCESS);
++
++ setsid();
++
++ signal(SIGHUP, SIG_IGN);
++
++- if (0 != (pid = zbx_fork()))
++- exit(EXIT_SUCCESS);
+++ if ( ZBX_RUN_FOREGROUND == run_foreground) {
+++ zabbix_log(LOG_LEVEL_INFORMATION, "Running in foreground...");
+++ } else {
+++ if (0 != (pid = zbx_fork()))
+++ exit(EXIT_SUCCESS);
+++ }
+++
+++
++
++ if (-1 == chdir("/")) /* this is to eliminate warning: ignoring return value of chdir */
++ assert(0);
++--- a/src/zabbix_agent/zabbix_agentd.c
+++++ b/src/zabbix_agent/zabbix_agentd.c
++@@ -62,6 +62,8 @@ const char *progname = NULL;
++ static char DEFAULT_CONFIG_FILE[] = SYSCONFDIR "/zabbix_agentd.conf";
++ #endif
++
+++int CONFIG_FOREGROUND = ZBX_RUN_BACKGROUND;
+++
++ /* application TITLE */
++ const char title_message[] = APPLICATION_NAME
++ #if defined(_WIN64)
++@@ -93,6 +95,7 @@ const char usage_message[] =
++ const char *help_message[] = {
++ "Options:",
++ " -c --config <config-file> Absolute path to the configuration file",
+++ " -f --foreground Run in foreground don't fork",
++ " -p --print Print known items and exit",
++ " -t --test <item key> Test specified item and exit",
++ " -h --help Display help information",
++@@ -127,6 +130,7 @@ const char *help_message[] = {
++ /* COMMAND LINE OPTIONS */
++ static struct zbx_option longopts[] =
++ {
+++ {"foreground", 0, NULL, 'f'},
++ {"config", 1, NULL, 'c'},
++ {"help", 0, NULL, 'h'},
++ {"version", 0, NULL, 'V'},
++@@ -147,7 +151,7 @@ static struct zbx_option longopts[] =
++ };
++
++ static char shortopts[] =
++- "c:hVpt:"
+++ "c:hfVpt:"
++ #ifndef _WINDOWS
++ "R:"
++ #else
++@@ -241,6 +245,9 @@ static void parse_commandline(int argc,
++ {
++ switch (ch)
++ {
+++ case 'f':
+++ CONFIG_FOREGROUND = ZBX_RUN_FOREGROUND;
+++ break;
++ case 'c':
++ CONFIG_FILE = strdup(zbx_optarg);
++ break;
++@@ -944,7 +951,7 @@ int main(int argc, char **argv)
++ break;
++ }
++
++- START_MAIN_ZABBIX_ENTRY(CONFIG_ALLOW_ROOT, CONFIG_USER);
+++ START_MAIN_ZABBIX_ENTRY(CONFIG_ALLOW_ROOT, CONFIG_USER, CONFIG_FOREGROUND);
++
++ exit(EXIT_SUCCESS);
++ }
++--- a/src/zabbix_proxy/proxy.c
+++++ b/src/zabbix_proxy/proxy.c
++@@ -60,6 +60,7 @@ const char usage_message[] = "[-hV] [-c
++
++ const char *help_message[] = {
++ "Options:",
+++ " -f --foreground Run in foreground don't fork",
++ " -c --config <file> Absolute path to the configuration file",
++ " -R --runtime-control <option> Perform administrative functions",
++ "",
++@@ -84,6 +85,7 @@ const char *help_message[] = {
++ /* long options */
++ static struct zbx_option longopts[] =
++ {
+++ {"foreground", 0, NULL, 'f'},
++ {"config", 1, NULL, 'c'},
++ {"runtime-control", 1, NULL, 'R'},
++ {"help", 0, NULL, 'h'},
++@@ -92,7 +94,7 @@ static struct zbx_option longopts[] =
++ };
++
++ /* short options */
++-static char shortopts[] = "c:n:hVR:";
+++static char shortopts[] = "c:n:fhVR:";
++
++ /* end of COMMAND LINE OPTIONS */
++
++@@ -202,6 +204,7 @@ char *CONFIG_LOAD_MODULE_PATH = NULL;
++ char **CONFIG_LOAD_MODULE = NULL;
++
++ char *CONFIG_USER = NULL;
+++int CONFIG_FOREGROUND = ZBX_RUN_BACKGROUND;
++
++ /* web monitoring */
++ #ifdef HAVE_LIBCURL
++@@ -666,6 +669,9 @@ int main(int argc, char **argv)
++ {
++ switch (ch)
++ {
+++ case 'f':
+++ CONFIG_FOREGROUND = ZBX_RUN_FOREGROUND;
+++ break;
++ case 'c':
++ CONFIG_FILE = zbx_strdup(CONFIG_FILE, zbx_optarg);
++ break;
++@@ -705,7 +711,7 @@ int main(int argc, char **argv)
++ init_ipmi_handler();
++ #endif
++
++- return daemon_start(CONFIG_ALLOW_ROOT, CONFIG_USER);
+++ return daemon_start(CONFIG_ALLOW_ROOT, CONFIG_USER, CONFIG_FOREGROUND);
++ }
++
++ int MAIN_ZABBIX_ENTRY()
++--- a/src/zabbix_server/server.c
+++++ b/src/zabbix_server/server.c
++@@ -64,6 +64,7 @@ const char usage_message[] = "[-hV] [-c
++
++ const char *help_message[] = {
++ "Options:",
+++ " -f --foreground Run in foreground don't fork",
++ " -c --config <file> Absolute path to the configuration file",
++ " -R --runtime-control <option> Perform administrative functions",
++ "",
++@@ -88,6 +89,7 @@ const char *help_message[] = {
++ /* long options */
++ static struct zbx_option longopts[] =
++ {
+++ {"foreground", 0, NULL, 'f'},
++ {"config", 1, NULL, 'c'},
++ {"runtime-control", 1, NULL, 'R'},
++ {"help", 0, NULL, 'h'},
++@@ -96,7 +98,7 @@ static struct zbx_option longopts[] =
++ };
++
++ /* short options */
++-static char shortopts[] = "c:n:hVR:";
+++static char shortopts[] = "c:n:fhVR:";
++
++ /* end of COMMAND LINE OPTIONS */
++
++@@ -197,6 +199,7 @@ char *CONFIG_LOAD_MODULE_PATH = NULL;
++ char **CONFIG_LOAD_MODULE = NULL;
++
++ char *CONFIG_USER = NULL;
+++int CONFIG_FOREGROUND = ZBX_RUN_BACKGROUND;
++
++ /* web monitoring */
++ #ifdef HAVE_LIBCURL
++@@ -631,6 +634,9 @@ int main(int argc, char **argv)
++ {
++ switch (ch)
++ {
+++ case 'f':
+++ CONFIG_FOREGROUND = ZBX_RUN_FOREGROUND;
+++ break;
++ case 'c':
++ CONFIG_FILE = zbx_strdup(CONFIG_FILE, zbx_optarg);
++ break;
++@@ -670,7 +676,7 @@ int main(int argc, char **argv)
++ init_ipmi_handler();
++ #endif
++
++- return daemon_start(CONFIG_ALLOW_ROOT, CONFIG_USER);
+++ return daemon_start(CONFIG_ALLOW_ROOT, CONFIG_USER, CONFIG_FOREGROUND);
++ }
++
++ int MAIN_ZABBIX_ENTRY()
+diff --git a/feeds/packages/admin/zabbix/patches/100-musl-compat.patch b/feeds/packages/admin/zabbix/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..2b6fee6
+--- /dev/null
++++ b/feeds/packages/admin/zabbix/patches/100-musl-compat.patch
+@@ -0,0 +1,23 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -51,7 +51,7 @@ AC_CHECK_HEADERS(stdio.h stdlib.h string
++ syslog.h time.h errno.h sys/types.h sys/stat.h netinet/in.h \
++ math.h sys/socket.h dirent.h ctype.h \
++ mtent.h fcntl.h sys/param.h arpa/inet.h \
++- sys/vfs.h sys/pstat.h sys/sysinfo.h sys/statvfs.h sys/statfs.h \
+++ sys/vfs.h sys/pstat.h sys/statvfs.h sys/statfs.h \
++ sys/socket.h sys/loadavg.h arpa/inet.h \
++ sys/vmmeter.h strings.h vm/vm_param.h \
++ sys/time.h kstat.h sys/syscall.h sys/sysmacros.h \
++@@ -63,6 +63,11 @@ AC_CHECK_HEADERS(stdio.h stdlib.h string
++ sys/timeb.h Winber.h lber.h ws2tcpip.h inttypes.h sys/file.h grp.h \
++ execinfo.h libperfstat.h sys/systemcfg.h sys/mnttab.h mntent.h sys/times.h \
++ dlfcn.h sys/utsname.h)
+++AC_CHECK_HEADERS(sys/sysinfo.h, [], [], [
+++#ifdef HAVE_LINUX_KERNEL_H
+++# include <linux/kernel.h>
+++#endif
+++])
++ AC_CHECK_HEADERS(resolv.h, [], [], [
++ #ifdef HAVE_SYS_TYPES_H
++ # include <sys/types.h>
+diff --git a/feeds/packages/devel/diffutils/Makefile b/feeds/packages/devel/diffutils/Makefile
+new file mode 100644
+index 0000000..fb00a42
+--- /dev/null
++++ b/feeds/packages/devel/diffutils/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=diffutils
++PKG_VERSION:=3.3
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@GNU/diffutils
++PKG_MD5SUM:=99180208ec2a82ce71f55b0d7389f1b3
++PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
++PKG_LICENSE:=GPL-3.0
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/diffutils
++ SECTION:=devel
++ CATEGORY:=Development
++ DEPENDS:=+USE_GLIBC:librt
++ TITLE:=diffutils
++ URL:=http://www.gnu.org/software/diffutils/
++endef
++
++define Package/diffutils/description
++ The Diffutils package contains programs that show the differences between
++ files or directories.
++endef
++
++CONFIGURE_VARS += \
++ ac_cv_func_mempcpy=n
++TARGET_CFLAGS += --std=gnu99
++
++define Package/diffutils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/{sdiff,diff3,diff,cmp} $(1)/usr/bin/
++endef
++
++define Package/diffutils/preinst
++#!/bin/sh
++for x in sdiff diff3 diff cmp; do
++ [ -L "$${IPKG_INSTROOT}/usr/bin/$$x" ] && rm -f "$${IPKG_INSTROOT}/usr/bin/$$x"
++done
++exit 0
++endef
++
++define Package/diffutils/postrm
++#!/bin/sh
++for x in sdiff diff3 diff cmp; do
++ /bin/busybox $$x -h 2>&1 | grep -q BusyBox && ln -sf ../../bin/busybox /usr/bin/$$x
++done
++exit 0
++endef
++
++$(eval $(call BuildPackage,diffutils))
+diff --git a/feeds/packages/devel/gcc/Makefile b/feeds/packages/devel/gcc/Makefile
+new file mode 100644
+index 0000000..1f3f0e3
+--- /dev/null
++++ b/feeds/packages/devel/gcc/Makefile
+@@ -0,0 +1,120 @@
++#
++# Copyright (C) 2008 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gcc
++PKG_VERSION:=4.8.3
++PKG_RELEASE:=1
++PKG_SOURCE_URL:=ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-$(PKG_VERSION) \
++ http://mirrors.rcn.net/pub/sourceware/gcc/releases/gcc-$(PKG_VERSION) \
++ ftp://ftp.gnu.org/gnu/gcc/releases/gcc-$(PKG_VERSION)
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_MD5SUM:=7c60f24fab389f77af203d2516ee110f
++PKG_INSTALL:=1
++PKG_FIXUP:=libtool
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_LANGUAGES:="c,c++"
++BUGURL=https://dev.openwrt.org/
++PKGVERSION=OpenWrt GCC $(PKG_VERSION)
++
++# not using sstrip here as this fucks up the .so's somehow
++STRIP:=$(TOOLCHAIN_DIR)/bin/$(TARGET_CROSS)strip
++RSTRIP:= \
++ NM="$(TOOLCHAIN_DIR)/bin/$(TARGET_CROSS)nm" \
++ STRIP="$(STRIP)" \
++ STRIP_KMOD="$(STRIP) --strip-debug" \
++ $(SCRIPT_DIR)/rstrip.sh
++
++
++define Package/gcc
++ SECTION:=devel
++ CATEGORY:=Development
++ TITLE:=gcc
++ MAINTAINER:=Christian Beier <cb@shoutrlabs.com>
++ DEPENDS:= +binutils +libstdcpp
++endef
++
++define Package/gcc/description
++ build a native toolchain for compiling on target
++endef
++
++
++define Build/Prepare
++ $(PKG_UNPACK)
++# we have to download additional stuff before patching
++ (cd $(PKG_BUILD_DIR) && ./contrib/download_prerequisites)
++ $(Build/Patch)
++# poor man's fix for `none-openwrt-linux' not recognized when building with musl
++ cp $(PKG_BUILD_DIR)/config.sub $(PKG_BUILD_DIR)/mpfr/
++ cp $(PKG_BUILD_DIR)/config.sub $(PKG_BUILD_DIR)/gmp/
++ cp $(PKG_BUILD_DIR)/config.sub $(PKG_BUILD_DIR)/mpc/
++endef
++
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); rm -f config.cache; \
++ SHELL="$(BASH)" \
++ $(TARGET_CONFIGURE_OPTS) \
++ $(PKG_BUILD_DIR)/configure \
++ $(CONFIGURE_ARGS) \
++ --build=$(GNU_HOST_NAME) \
++ --host=$(REAL_GNU_TARGET_NAME) \
++ --target=$(REAL_GNU_TARGET_NAME) \
++ --enable-languages=$(TARGET_LANGUAGES) \
++ --with-bugurl=$(BUGURL) \
++ --with-pkgversion="$(PKGVERSION)" \
++ --enable-shared \
++ --disable-__cxa_atexit \
++ --enable-target-optspace \
++ --with-gnu-ld \
++ --disable-nls \
++ --disable-libmudflap \
++ --disable-multilib \
++ --disable-libgomp \
++ --disable-libquadmath \
++ --disable-libssp \
++ --disable-decimal-float \
++ --disable-libstdcxx-pch \
++ --with-host-libstdcxx=-lstdc++ \
++ --prefix=/usr \
++ --libexecdir=/usr/lib \
++ $(SOFT_FLOAT_CONFIG_OPTION) \
++ $(call qstrip,$(CONFIG_EXTRA_GCC_CONFIG_OPTIONS)) \
++ $(if $(CONFIG_mips64)$(CONFIG_mips64el),--with-arch=mips64 \
++ --with-abi=$(subst ",,$(CONFIG_MIPS64_ABI))) \
++ );
++endef
++
++define Build/Compile
++ export SHELL="$(BASH)"; $(MAKE_VARS) $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" $(MAKE_ARGS) all install
++endef
++
++define Package/gcc/install
++ $(INSTALL_DIR) $(1)/usr/bin $(1)/usr/lib $(1)/usr/lib/$(PKG_NAME)/$(REAL_GNU_TARGET_NAME)/$(PKG_VERSION)
++ cp -ar $(PKG_INSTALL_DIR)/usr/include $(1)/usr
++ cp -a $(PKG_INSTALL_DIR)/usr/bin/{$(REAL_GNU_TARGET_NAME)-{g++,gcc},cpp,gcov} $(1)/usr/bin
++ ln -s $(REAL_GNU_TARGET_NAME)-g++ $(1)/usr/bin/c++
++ ln -s $(REAL_GNU_TARGET_NAME)-g++ $(1)/usr/bin/g++
++ ln -s $(REAL_GNU_TARGET_NAME)-g++ $(1)/usr/bin/$(REAL_GNU_TARGET_NAME)-c++
++ ln -s $(REAL_GNU_TARGET_NAME)-gcc $(1)/usr/bin/gcc
++ ln -s $(REAL_GNU_TARGET_NAME)-gcc $(1)/usr/bin/$(REAL_GNU_TARGET_NAME)-gcc-$(PKG_VERSION)
++ cp -ar $(PKG_INSTALL_DIR)/usr/lib/gcc $(1)/usr/lib
++ $(RM) $(1)/usr/lib/$(PKG_NAME)/$(REAL_GNU_TARGET_NAME)/$(PKG_VERSION)/*.a
++ cp -ar $(TOOLCHAIN_DIR)/include $(1)/usr/lib/$(PKG_NAME)/$(REAL_GNU_TARGET_NAME)/$(PKG_VERSION)
++ cp -a $(TOOLCHAIN_DIR)/lib/*.{o,so*} $(1)/usr/lib/$(PKG_NAME)/$(REAL_GNU_TARGET_NAME)/$(PKG_VERSION)
++ cp -a $(TOOLCHAIN_DIR)/lib/*nonshared*.a $(1)/usr/lib/$(PKG_NAME)/$(REAL_GNU_TARGET_NAME)/$(PKG_VERSION)
++ grep "GROUP.*-lgcc" $(1)/usr/lib/$(PKG_NAME)/$(REAL_GNU_TARGET_NAME)/$(PKG_VERSION)/libgcc_s.so && cp -a $(PKG_INSTALL_DIR)/usr/lib/gcc/$(REAL_GNU_TARGET_NAME)/$(PKG_VERSION)/libgcc.a $(1)/usr/lib/$(PKG_NAME)/$(REAL_GNU_TARGET_NAME)/$(PKG_VERSION)/ ; true
++endef
++
++$(eval $(call BuildPackage,gcc))
+diff --git a/feeds/packages/devel/gcc/README b/feeds/packages/devel/gcc/README
+new file mode 100644
+index 0000000..58db474
+--- /dev/null
++++ b/feeds/packages/devel/gcc/README
+@@ -0,0 +1,10 @@
++Native GCC that runs on target.
++
++To save disk space, this GCC only supports dynamic linking on the target box,
++there are no static libraries shipped except libgcc.a on those architectures
++that need it.
++
++For now, this was only tested on arm (EABI) and mips targets. Others to be
++done...
++
++ Christian Beier <cb@shoutrlabs.com>
+diff --git a/feeds/packages/devel/gcc/patches/002-dont-choke-when-building-32bit-on-64bit.patch b/feeds/packages/devel/gcc/patches/002-dont-choke-when-building-32bit-on-64bit.patch
+new file mode 100644
+index 0000000..8472960
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/002-dont-choke-when-building-32bit-on-64bit.patch
+@@ -0,0 +1,15 @@
++diff --git a/gcc/real.h b/gcc/real.h
++index 2ff84f6..fbb4b0e 100644
++--- a/gcc/real.h
+++++ b/gcc/real.h
++@@ -72,8 +72,10 @@ struct GTY(()) real_value {
++ + (REAL_VALUE_TYPE_SIZE%HOST_BITS_PER_WIDE_INT ? 1 : 0)) /* round up */
++
++ /* Verify the guess. */
+++#ifndef __LP64__
++ extern char test_real_width
++ [sizeof(REAL_VALUE_TYPE) <= REAL_WIDTH*sizeof(HOST_WIDE_INT) ? 1 : -1];
+++#endif
++
++ /* Calculate the format for CONST_DOUBLE. We need as many slots as
++ are necessary to overlay a REAL_VALUE_TYPE on them. This could be
+diff --git a/feeds/packages/devel/gcc/patches/003-mpfr-longlong-mips.patch b/feeds/packages/devel/gcc/patches/003-mpfr-longlong-mips.patch
+new file mode 100644
+index 0000000..0ab9fe5
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/003-mpfr-longlong-mips.patch
+@@ -0,0 +1,38 @@
++diff -Naurd mpfr-2.4.2-a/mpfr-longlong.h mpfr-2.4.2-b/mpfr-longlong.h
++--- -a/mpfr-2.4.2/mpfr-longlong.h 2009-11-30 02:43:08.000000000 +0000
+++++ -b/mpfr-2.4.2/mpfr-longlong.h 2009-12-18 12:04:29.000000000 +0000
++@@ -1011,7 +1011,15 @@
++ #endif /* __m88000__ */
++
++ #if defined (__mips) && W_TYPE_SIZE == 32
++-#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
+++#if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
+++#define umul_ppmm(w1, w0, u, v) \
+++ do { \
+++ UDItype _r; \
+++ _r = (UDItype) u * v; \
+++ (w1) = _r >> 32; \
+++ (w0) = (USItype) _r; \
+++ } while (0)
+++#elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7
++ #define umul_ppmm(w1, w0, u, v) \
++ __asm__ ("multu %2,%3" : "=l" (w0), "=h" (w1) : "d" (u), "d" (v))
++ #else
++@@ -1024,7 +1032,16 @@
++ #endif /* __mips */
++
++ #if (defined (__mips) && __mips >= 3) && W_TYPE_SIZE == 64
++-#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
+++#if (__GNUC__ >= 5) || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 4)
+++typedef unsigned int UTItype __attribute__ ((mode (TI)));
+++#define umul_ppmm(w1, w0, u, v) \
+++ do { \
+++ UTItype _r; \
+++ _r = (UTItype) u * v; \
+++ (w1) = _r >> 64; \
+++ (w0) = (UDItype) _r; \
+++ } while (0)
+++#elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7
++ #define umul_ppmm(w1, w0, u, v) \
++ __asm__ ("dmultu %2,%3" : "=l" (w0), "=h" (w1) : "d" (u), "d" (v))
++ #else
+diff --git a/feeds/packages/devel/gcc/patches/010-documentation.patch b/feeds/packages/devel/gcc/patches/010-documentation.patch
+new file mode 100644
+index 0000000..3f604ee
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/010-documentation.patch
+@@ -0,0 +1,23 @@
++--- a/gcc/Makefile.in
+++++ b/gcc/Makefile.in
++@@ -4326,18 +4326,10 @@ doc/gcc.info: $(TEXI_GCC_FILES)
++ doc/gccint.info: $(TEXI_GCCINT_FILES)
++ doc/cppinternals.info: $(TEXI_CPPINT_FILES)
++
++-doc/%.info: %.texi
++- if [ x$(BUILD_INFO) = xinfo ]; then \
++- $(MAKEINFO) $(MAKEINFOFLAGS) -I . -I $(gcc_docdir) \
++- -I $(gcc_docdir)/include -o $@ $<; \
++- fi
+++doc/%.info:
++
++ # Duplicate entry to handle renaming of gccinstall.info
++-doc/gccinstall.info: $(TEXI_GCCINSTALL_FILES)
++- if [ x$(BUILD_INFO) = xinfo ]; then \
++- $(MAKEINFO) $(MAKEINFOFLAGS) -I $(gcc_docdir) \
++- -I $(gcc_docdir)/include -o $@ $<; \
++- fi
+++doc/gccinstall.info:
++
++ doc/cpp.dvi: $(TEXI_CPP_FILES)
++ doc/gcc.dvi: $(TEXI_GCC_FILES)
+diff --git a/feeds/packages/devel/gcc/patches/020-disable-check-for-sys-sdt-h.patch b/feeds/packages/devel/gcc/patches/020-disable-check-for-sys-sdt-h.patch
+new file mode 100644
+index 0000000..afc5cfd
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/020-disable-check-for-sys-sdt-h.patch
+@@ -0,0 +1,45 @@
++diff --git a/gcc/configure b/gcc/configure
++index 3793681..bcda752 100755
++--- a/gcc/configure
+++++ b/gcc/configure
++@@ -26876,19 +26876,6 @@ $as_echo "#define TARGET_LIBC_PROVIDES_SSP 1" >>confdefs.h
++
++ fi
++
++-# Test for <sys/sdt.h> on the target.
++-
++-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sys/sdt.h in the target C library" >&5
++-$as_echo_n "checking sys/sdt.h in the target C library... " >&6; }
++-have_sys_sdt_h=no
++-if test -f $target_header_dir/sys/sdt.h; then
++- have_sys_sdt_h=yes
++-
++-$as_echo "#define HAVE_SYS_SDT_H 1" >>confdefs.h
++-
++-fi
++-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_sys_sdt_h" >&5
++-$as_echo "$have_sys_sdt_h" >&6; }
++
++ # Check if TFmode long double should be used by default or not.
++ # Some glibc targets used DFmode long double, but with glibc 2.4
++diff --git a/gcc/configure.ac b/gcc/configure.ac
++index 3ee1d67..e321218 100644
++--- a/gcc/configure.ac
+++++ b/gcc/configure.ac
++@@ -4796,16 +4796,6 @@ if test x$gcc_cv_libc_provides_ssp = xyes; then
++ [Define if your target C library provides stack protector support])
++ fi
++
++-# Test for <sys/sdt.h> on the target.
++-GCC_TARGET_TEMPLATE([HAVE_SYS_SDT_H])
++-AC_MSG_CHECKING(sys/sdt.h in the target C library)
++-have_sys_sdt_h=no
++-if test -f $target_header_dir/sys/sdt.h; then
++- have_sys_sdt_h=yes
++- AC_DEFINE(HAVE_SYS_SDT_H, 1,
++- [Define if your target C library provides sys/sdt.h])
++-fi
++-AC_MSG_RESULT($have_sys_sdt_h)
++
++ # Check if TFmode long double should be used by default or not.
++ # Some glibc targets used DFmode long double, but with glibc 2.4
+diff --git a/feeds/packages/devel/gcc/patches/100-uclibc-conf.patch b/feeds/packages/devel/gcc/patches/100-uclibc-conf.patch
+new file mode 100644
+index 0000000..ff9ad94
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/100-uclibc-conf.patch
+@@ -0,0 +1,33 @@
++--- a/contrib/regression/objs-gcc.sh
+++++ b/contrib/regression/objs-gcc.sh
++@@ -106,6 +106,10 @@ if [ $H_REAL_TARGET = $H_REAL_HOST -a $H
++ then
++ make all-gdb all-dejagnu all-ld || exit 1
++ make install-gdb install-dejagnu install-ld || exit 1
+++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ]
+++ then
+++ make all-gdb all-dejagnu all-ld || exit 1
+++ make install-gdb install-dejagnu install-ld || exit 1
++ elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then
++ make bootstrap || exit 1
++ make install || exit 1
++--- a/libjava/classpath/ltconfig
+++++ b/libjava/classpath/ltconfig
++@@ -603,7 +603,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-
++
++ # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
++ case $host_os in
++-linux-gnu*) ;;
+++linux-gnu*|linux-uclibc*) ;;
++ linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
++ esac
++
++@@ -1247,7 +1247,7 @@ linux-gnuoldld* | linux-gnuaout* | linux
++ ;;
++
++ # This must be Linux ELF.
++-linux-gnu*)
+++linux*)
++ version_type=linux
++ need_lib_prefix=no
++ need_version=no
+diff --git a/feeds/packages/devel/gcc/patches/200-musl.patch b/feeds/packages/devel/gcc/patches/200-musl.patch
+new file mode 100644
+index 0000000..2e6df47
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/200-musl.patch
+@@ -0,0 +1,321 @@
++--- a/gcc/config.gcc
+++++ b/gcc/config.gcc
++@@ -549,7 +549,7 @@ case ${target} in
++ esac
++
++ # Common C libraries.
++-tm_defines="$tm_defines LIBC_GLIBC=1 LIBC_UCLIBC=2 LIBC_BIONIC=3"
+++tm_defines="$tm_defines LIBC_GLIBC=1 LIBC_UCLIBC=2 LIBC_BIONIC=3 LIBC_MUSL=4"
++
++ # Common parts for widely ported systems.
++ case ${target} in
++@@ -652,6 +652,9 @@ case ${target} in
++ *-*-*uclibc*)
++ tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC"
++ ;;
+++ *-*-*musl*)
+++ tm_defines="$tm_defines DEFAULT_LIBC=LIBC_MUSL"
+++ ;;
++ *)
++ tm_defines="$tm_defines DEFAULT_LIBC=LIBC_GLIBC"
++ ;;
++--- a/gcc/config/arm/linux-eabi.h
+++++ b/gcc/config/arm/linux-eabi.h
++@@ -77,6 +77,10 @@
++ %{mfloat-abi=soft*:" GLIBC_DYNAMIC_LINKER_SOFT_FLOAT "} \
++ %{!mfloat-abi=*:" GLIBC_DYNAMIC_LINKER_DEFAULT "}"
++
+++/* musl has no "classic" (i.e. broken) mode */
+++#undef MUSL_DYNAMIC_LINKER
+++#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-arm.so.1"
+++
++ /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to
++ use the GNU/Linux version, not the generic BPABI version. */
++ #undef LINK_SPEC
++--- a/gcc/config/i386/linux.h
+++++ b/gcc/config/i386/linux.h
++@@ -21,3 +21,4 @@ along with GCC; see the file COPYING3.
++
++ #define GNU_USER_LINK_EMULATION "elf_i386"
++ #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
+++#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-i386.so.1"
++--- a/gcc/config/i386/linux64.h
+++++ b/gcc/config/i386/linux64.h
++@@ -30,3 +30,7 @@ see the files COPYING3 and COPYING.RUNTI
++ #define GLIBC_DYNAMIC_LINKER32 "/lib/ld-linux.so.2"
++ #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld-linux-x86-64.so.2"
++ #define GLIBC_DYNAMIC_LINKERX32 "/libx32/ld-linux-x32.so.2"
+++
+++#define MUSL_DYNAMIC_LINKER32 "/lib/ld-musl-i386.so.1"
+++#define MUSL_DYNAMIC_LINKER64 "/lib/ld-musl-x86_64.so.1"
+++#define MUSL_DYNAMIC_LINKERX32 "/lib/ld-musl-x32.so.1"
++--- a/gcc/config/linux.h
+++++ b/gcc/config/linux.h
++@@ -32,10 +32,12 @@ see the files COPYING3 and COPYING.RUNTI
++ #define OPTION_GLIBC (DEFAULT_LIBC == LIBC_GLIBC)
++ #define OPTION_UCLIBC (DEFAULT_LIBC == LIBC_UCLIBC)
++ #define OPTION_BIONIC (DEFAULT_LIBC == LIBC_BIONIC)
+++#define OPTION_MUSL (DEFAULT_LIBC == LIBC_MUSL)
++ #else
++ #define OPTION_GLIBC (linux_libc == LIBC_GLIBC)
++ #define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC)
++ #define OPTION_BIONIC (linux_libc == LIBC_BIONIC)
+++#define OPTION_MUSL (linux_libc == LIBC_MUSL)
++ #endif
++
++ #define GNU_USER_TARGET_OS_CPP_BUILTINS() \
++@@ -53,18 +55,21 @@ see the files COPYING3 and COPYING.RUNTI
++ uClibc or Bionic is the default C library and whether
++ -muclibc or -mglibc or -mbionic has been passed to change the default. */
++
++-#define CHOOSE_DYNAMIC_LINKER1(LIBC1, LIBC2, LIBC3, LD1, LD2, LD3) \
++- "%{" LIBC2 ":" LD2 ";:%{" LIBC3 ":" LD3 ";:" LD1 "}}"
+++#define CHOOSE_DYNAMIC_LINKER1(LIBC1, LIBC2, LIBC3, LIBC4, LD1, LD2, LD3, LD4) \
+++ "%{" LIBC2 ":" LD2 ";:%{" LIBC3 ":" LD3 ";:%{" LIBC4 ":" LD4 ";:" LD1 "}}}"
++
++ #if DEFAULT_LIBC == LIBC_GLIBC
++-#define CHOOSE_DYNAMIC_LINKER(G, U, B) \
++- CHOOSE_DYNAMIC_LINKER1 ("mglibc", "muclibc", "mbionic", G, U, B)
+++#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
+++ CHOOSE_DYNAMIC_LINKER1 ("mglibc", "muclibc", "mbionic", "mmusl", G, U, B, M)
++ #elif DEFAULT_LIBC == LIBC_UCLIBC
++-#define CHOOSE_DYNAMIC_LINKER(G, U, B) \
++- CHOOSE_DYNAMIC_LINKER1 ("muclibc", "mglibc", "mbionic", U, G, B)
+++#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
+++ CHOOSE_DYNAMIC_LINKER1 ("muclibc", "mglibc", "mbionic", "mmusl", U, G, B, M)
++ #elif DEFAULT_LIBC == LIBC_BIONIC
++-#define CHOOSE_DYNAMIC_LINKER(G, U, B) \
++- CHOOSE_DYNAMIC_LINKER1 ("mbionic", "mglibc", "muclibc", B, G, U)
+++#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
+++ CHOOSE_DYNAMIC_LINKER1 ("mbionic", "mglibc", "muclibc", "mmusl", B, G, U, M)
+++#elif DEFAULT_LIBC == LIBC_MUSL
+++#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \
+++ CHOOSE_DYNAMIC_LINKER1 ("mmusl", "mglibc", "muclibc", "mbionic", M, G, U, B)
++ #else
++ #error "Unsupported DEFAULT_LIBC"
++ #endif /* DEFAULT_LIBC */
++@@ -84,16 +89,16 @@ see the files COPYING3 and COPYING.RUNTI
++
++ #define GNU_USER_DYNAMIC_LINKER \
++ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER, \
++- BIONIC_DYNAMIC_LINKER)
+++ BIONIC_DYNAMIC_LINKER, MUSL_DYNAMIC_LINKER)
++ #define GNU_USER_DYNAMIC_LINKER32 \
++ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32, \
++- BIONIC_DYNAMIC_LINKER32)
+++ BIONIC_DYNAMIC_LINKER32, MUSL_DYNAMIC_LINKER32)
++ #define GNU_USER_DYNAMIC_LINKER64 \
++ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, \
++- BIONIC_DYNAMIC_LINKER64)
+++ BIONIC_DYNAMIC_LINKER64, MUSL_DYNAMIC_LINKER64)
++ #define GNU_USER_DYNAMIC_LINKERX32 \
++ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERX32, UCLIBC_DYNAMIC_LINKERX32, \
++- BIONIC_DYNAMIC_LINKERX32)
+++ BIONIC_DYNAMIC_LINKERX32, MUSL_DYNAMIC_LINKERX32)
++
++ /* Determine whether the entire c99 runtime
++ is present in the runtime library. */
++--- a/gcc/config/linux.opt
+++++ b/gcc/config/linux.opt
++@@ -30,3 +30,7 @@ Use GNU C library
++ muclibc
++ Target Report RejectNegative Var(linux_libc,LIBC_UCLIBC) Negative(mbionic)
++ Use uClibc C library
+++
+++mmusl
+++Target Report RejectNegative Var(linux_libc,LIBC_MUSL) Negative(mglibc)
+++Use musl C library
++--- a/gcc/config/mips/linux.h
+++++ b/gcc/config/mips/linux.h
++@@ -18,3 +18,5 @@ along with GCC; see the file COPYING3.
++ <http://www.gnu.org/licenses/>. */
++
++ #define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1"
+++
+++#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-mips.so.1"
++--- a/gcc/config/rs6000/linux64.h
+++++ b/gcc/config/rs6000/linux64.h
++@@ -364,17 +364,21 @@ extern int dot_symbols;
++ #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld64.so.1"
++ #define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0"
++ #define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0"
+++#define MUSL_DYNAMIC_LINKER32 "/lib/ld-musl-powerpc.so.1"
+++#define MUSL_DYNAMIC_LINKER64 "/lib/ld-musl-powerpc64.so.1"
++ #if DEFAULT_LIBC == LIBC_UCLIBC
++-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:" G ";:" U "}"
+++#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{mglibc:" G ";:%{mmusl:" M ";:" U "}}"
++ #elif DEFAULT_LIBC == LIBC_GLIBC
++-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:" U ";:" G "}"
+++#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{muclibc:" U ";:%{mmusl:" M ";:" G "}}"
+++#elif DEFAULT_LIBC == LIBC_MUSL
+++#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{mglibc:" G ";:%{muclibc:" U ";:" M "}}"
++ #else
++ #error "Unsupported DEFAULT_LIBC"
++ #endif
++ #define GNU_USER_DYNAMIC_LINKER32 \
++- CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32)
+++ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32, MUSL_DYNAMIC_LINKER32)
++ #define GNU_USER_DYNAMIC_LINKER64 \
++- CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64)
+++ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, MUSL_DYNAMIC_LINKER64)
++
++
++ #define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux %{!shared: %{!static: \
++--- a/gcc/config/rs6000/sysv4.h
+++++ b/gcc/config/rs6000/sysv4.h
++@@ -789,15 +789,18 @@ extern int fixuplabelno;
++
++ #define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1"
++ #define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
+++#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-powerpc.so.1"
++ #if DEFAULT_LIBC == LIBC_UCLIBC
++-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:" G ";:" U "}"
+++#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{mglibc:" G ";:%{mmusl:" M ";:" U "}}"
+++#elif DEFAULT_LIBC == LIBC_MUSL
+++#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{mglibc:" G ";:%{muclibc:" U ";:" M "}}"
++ #elif !defined (DEFAULT_LIBC) || DEFAULT_LIBC == LIBC_GLIBC
++-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:" U ";:" G "}"
+++#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{muclibc:" U ";:%{mmusl:" M ";:" G "}}"
++ #else
++ #error "Unsupported DEFAULT_LIBC"
++ #endif
++ #define GNU_USER_DYNAMIC_LINKER \
++- CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER)
+++ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER, MUSL_DYNAMIC_LINKER)
++
++ #define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
++ %{rdynamic:-export-dynamic} \
++--- a/gcc/ginclude/stddef.h
+++++ b/gcc/ginclude/stddef.h
++@@ -181,6 +181,7 @@ typedef __PTRDIFF_TYPE__ ptrdiff_t;
++ #ifndef _GCC_SIZE_T
++ #ifndef _SIZET_
++ #ifndef __size_t
+++#ifndef __DEFINED_size_t /* musl */
++ #define __size_t__ /* BeOS */
++ #define __SIZE_T__ /* Cray Unicos/Mk */
++ #define _SIZE_T
++@@ -197,6 +198,7 @@ typedef __PTRDIFF_TYPE__ ptrdiff_t;
++ #define ___int_size_t_h
++ #define _GCC_SIZE_T
++ #define _SIZET_
+++#define __DEFINED_size_t /* musl */
++ #if (defined (__FreeBSD__) && (__FreeBSD__ >= 5)) \
++ || defined(__FreeBSD_kernel__)
++ /* __size_t is a typedef on FreeBSD 5, must not trash it. */
++@@ -214,6 +216,7 @@ typedef __SIZE_TYPE__ size_t;
++ typedef long ssize_t;
++ #endif /* __BEOS__ */
++ #endif /* !(defined (__GNUG__) && defined (size_t)) */
+++#endif /* __DEFINED_size_t */
++ #endif /* __size_t */
++ #endif /* _SIZET_ */
++ #endif /* _GCC_SIZE_T */
++--- a/libgomp/config/posix/time.c
+++++ b/libgomp/config/posix/time.c
++@@ -28,6 +28,8 @@
++ The following implementation uses the most simple POSIX routines.
++ If present, POSIX 4 clocks should be used instead. */
++
+++#define _POSIX_C_SOURCE 199309L /* for clocks */
+++
++ #include "libgomp.h"
++ #include <unistd.h>
++ #if TIME_WITH_SYS_TIME
++--- a/libitm/config/arm/hwcap.cc
+++++ b/libitm/config/arm/hwcap.cc
++@@ -40,7 +40,11 @@ int GTM_hwcap HIDDEN = 0
++
++ #ifdef __linux__
++ #include <unistd.h>
+++#ifdef __GLIBC__
++ #include <sys/fcntl.h>
+++#else
+++#include <fcntl.h>
+++#endif
++ #include <elf.h>
++
++ static void __attribute__((constructor))
++--- a/libitm/config/linux/x86/tls.h
+++++ b/libitm/config/linux/x86/tls.h
++@@ -25,16 +25,19 @@
++ #ifndef LIBITM_X86_TLS_H
++ #define LIBITM_X86_TLS_H 1
++
++-#if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 10)
+++#if defined(__GLIBC_PREREQ)
+++#if __GLIBC_PREREQ(2, 10)
++ /* Use slots in the TCB head rather than __thread lookups.
++ GLIBC has reserved words 10 through 13 for TM. */
++ #define HAVE_ARCH_GTM_THREAD 1
++ #define HAVE_ARCH_GTM_THREAD_DISP 1
++ #endif
+++#endif
++
++ #include "config/generic/tls.h"
++
++-#if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 10)
+++#if defined(__GLIBC_PREREQ)
+++#if __GLIBC_PREREQ(2, 10)
++ namespace GTM HIDDEN {
++
++ #ifdef __x86_64__
++@@ -101,5 +104,6 @@ static inline void set_abi_disp(struct a
++
++ } // namespace GTM
++ #endif /* >= GLIBC 2.10 */
+++#endif
++
++ #endif // LIBITM_X86_TLS_H
++--- a/libstdc++-v3/configure.host
+++++ b/libstdc++-v3/configure.host
++@@ -264,6 +264,13 @@ case "${host_os}" in
++ os_include_dir="os/bsd/freebsd"
++ ;;
++ gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
+++ # check for musl by target
+++ case "${host_os}" in
+++ *-musl*)
+++ os_include_dir="os/generic"
+++ ;;
+++ *)
+++
++ if [ "$uclibc" = "yes" ]; then
++ os_include_dir="os/uclibc"
++ elif [ "$bionic" = "yes" ]; then
++@@ -272,6 +279,9 @@ case "${host_os}" in
++ os_include_dir="os/gnu-linux"
++ fi
++ ;;
+++
+++ esac
+++ ;;
++ hpux*)
++ os_include_dir="os/hpux"
++ ;;
++--- a/gcc/config/mips/linux64.h
+++++ b/gcc/config/mips/linux64.h
++@@ -27,6 +27,9 @@ along with GCC; see the file COPYING3.
++ #define GLIBC_DYNAMIC_LINKERN32 "/lib32/ld.so.1"
++ #define UCLIBC_DYNAMIC_LINKERN32 "/lib32/ld-uClibc.so.0"
++ #define BIONIC_DYNAMIC_LINKERN32 "/system/bin/linker32"
+++#define MUSL_DYNAMIC_LINKERN32 "/lib/ld-musl-mips.so.1"
+++#define MUSL_DYNAMIC_LINKER32 "/lib/ld-musl-mips.so.1"
+++#define MUSL_DYNAMIC_LINKER64 "/lib/ld-musl-mips.so.1"
++ #define GNU_USER_DYNAMIC_LINKERN32 \
++ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERN32, UCLIBC_DYNAMIC_LINKERN32, \
++- BIONIC_DYNAMIC_LINKERN32)
+++ BIONIC_DYNAMIC_LINKERN32, MUSL_DYNAMIC_LINKERN32)
++--- a/gcc/config/sparc/linux64.h 2013-09-10 10:02:45.663973856 +0100
+++++ b/gcc/config/sparc/linux64.h 2013-09-10 10:03:17.871972435 +0100
++@@ -104,6 +104,9 @@
++ #define GLIBC_DYNAMIC_LINKER32 "/lib/ld-linux.so.2"
++ #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld-linux.so.2"
++
+++#define MUSL_DYNAMIC_LINKER32 "/lib/ld-musl-sparc.so.1"
+++#define MUSL_DYNAMIC_LINKER64 "/lib/ld-musl-sparc.so.1"
+++
++ #ifdef SPARC_BI_ARCH
++
++ #undef SUBTARGET_EXTRA_SPECS
++
+diff --git a/feeds/packages/devel/gcc/patches/800-arm_v5te_no_ldrd_strd.patch b/feeds/packages/devel/gcc/patches/800-arm_v5te_no_ldrd_strd.patch
+new file mode 100644
+index 0000000..ae4f651
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/800-arm_v5te_no_ldrd_strd.patch
+@@ -0,0 +1,11 @@
++--- a/gcc/config/arm/arm.h
+++++ b/gcc/config/arm/arm.h
++@@ -271,7 +271,7 @@ extern void (*arm_lang_output_object_att
++ /* Thumb-1 only. */
++ #define TARGET_THUMB1_ONLY (TARGET_THUMB1 && !arm_arch_notm)
++
++-#define TARGET_LDRD (arm_arch5e && ARM_DOUBLEWORD_ALIGN \
+++#define TARGET_LDRD (arm_arch6 && ARM_DOUBLEWORD_ALIGN \
++ && !TARGET_THUMB1)
++
++ /* The following two macros concern the ability to execute coprocessor
+diff --git a/feeds/packages/devel/gcc/patches/810-arm-softfloat-libgcc.patch b/feeds/packages/devel/gcc/patches/810-arm-softfloat-libgcc.patch
+new file mode 100644
+index 0000000..33cf8ad
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/810-arm-softfloat-libgcc.patch
+@@ -0,0 +1,25 @@
++--- a/libgcc/config/arm/t-linux
+++++ b/libgcc/config/arm/t-linux
++@@ -1,6 +1,10 @@
++ LIB1ASMSRC = arm/lib1funcs.S
++ LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx _clzsi2 _clzdi2 \
++- _ctzsi2 _arm_addsubdf3 _arm_addsubsf3
+++ _ctzsi2 _arm_addsubdf3 _arm_addsubsf3 \
+++ _arm_negdf2 _arm_muldivdf3 _arm_cmpdf2 _arm_unorddf2 \
+++ _arm_fixdfsi _arm_fixunsdfsi _arm_truncdfsf2 \
+++ _arm_negsf2 _arm_muldivsf3 _arm_cmpsf2 _arm_unordsf2 \
+++ _arm_fixsfsi _arm_fixunssfsi
++
++ # Just for these, we omit the frame pointer since it makes such a big
++ # difference.
++--- a/gcc/config/arm/linux-elf.h
+++++ b/gcc/config/arm/linux-elf.h
++@@ -55,8 +55,6 @@
++ %{shared:-lc} \
++ %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
++
++-#define LIBGCC_SPEC "%{mfloat-abi=soft*:-lfloat} -lgcc"
++-
++ #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
++
++ #define LINUX_TARGET_LINK_SPEC "%{h*} \
+diff --git a/feeds/packages/devel/gcc/patches/820-libgcc_pic.patch b/feeds/packages/devel/gcc/patches/820-libgcc_pic.patch
+new file mode 100644
+index 0000000..7a0ac73
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/820-libgcc_pic.patch
+@@ -0,0 +1,36 @@
++--- a/libgcc/Makefile.in
+++++ b/libgcc/Makefile.in
++@@ -865,11 +865,12 @@ $(libgcov-objects): %$(objext): $(srcdir
++
++ # Static libraries.
++ libgcc.a: $(libgcc-objects)
+++libgcc_pic.a: $(libgcc-s-objects)
++ libgcov.a: $(libgcov-objects)
++ libunwind.a: $(libunwind-objects)
++ libgcc_eh.a: $(libgcc-eh-objects)
++
++-libgcc.a libgcov.a libunwind.a libgcc_eh.a:
+++libgcc.a libgcov.a libunwind.a libgcc_eh.a libgcc_pic.a:
++ -rm -f $@
++
++ objects="$(objects)"; \
++@@ -891,7 +892,7 @@ libgcc_s$(SHLIB_EXT): libunwind$(SHLIB_E
++ endif
++
++ ifeq ($(enable_shared),yes)
++-all: libgcc_eh.a libgcc_s$(SHLIB_EXT)
+++all: libgcc_eh.a libgcc_pic.a libgcc_s$(SHLIB_EXT)
++ ifneq ($(LIBUNWIND),)
++ all: libunwind$(SHLIB_EXT)
++ endif
++@@ -1058,6 +1059,10 @@ install-shared:
++ chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_eh.a
++ $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_eh.a
++
+++ $(INSTALL_DATA) libgcc_pic.a $(mapfile) $(DESTDIR)$(inst_libdir)/
+++ chmod 644 $(DESTDIR)$(inst_libdir)/libgcc_pic.a
+++ $(RANLIB) $(DESTDIR)$(inst_libdir)/libgcc_pic.a
+++
++ $(subst @multilib_dir@,$(MULTIDIR),$(subst \
++ @shlib_base_name@,libgcc_s,$(subst \
++ @shlib_slibdir_qual@,$(MULTIOSSUBDIR),$(SHLIB_INSTALL))))
+diff --git a/feeds/packages/devel/gcc/patches/830-arm_unbreak_armv4t.patch b/feeds/packages/devel/gcc/patches/830-arm_unbreak_armv4t.patch
+new file mode 100644
+index 0000000..37f8f2a
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/830-arm_unbreak_armv4t.patch
+@@ -0,0 +1,13 @@
++http://sourceware.org/ml/crossgcc/2008-05/msg00009.html
++
++--- a/gcc/config/arm/linux-eabi.h
+++++ b/gcc/config/arm/linux-eabi.h
++@@ -45,7 +45,7 @@
++ The ARM10TDMI core is the default for armv5t, so set
++ SUBTARGET_CPU_DEFAULT to achieve this. */
++ #undef SUBTARGET_CPU_DEFAULT
++-#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm10tdmi
+++#define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm9tdmi
++
++ /* TARGET_BIG_ENDIAN_DEFAULT is set in
++ config.gcc for big endian configurations. */
+diff --git a/feeds/packages/devel/gcc/patches/840-armv4_pass_fix-v4bx_to_ld.patch b/feeds/packages/devel/gcc/patches/840-armv4_pass_fix-v4bx_to_ld.patch
+new file mode 100644
+index 0000000..e938905
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/840-armv4_pass_fix-v4bx_to_ld.patch
+@@ -0,0 +1,19 @@
++--- a/gcc/config/arm/linux-eabi.h
+++++ b/gcc/config/arm/linux-eabi.h
++@@ -81,10 +81,15 @@
++ #undef MUSL_DYNAMIC_LINKER
++ #define MUSL_DYNAMIC_LINKER "/lib/ld-musl-arm.so.1"
++
+++/* For armv4 we pass --fix-v4bx to linker to support EABI */
+++#undef TARGET_FIX_V4BX_SPEC
+++#define TARGET_FIX_V4BX_SPEC " %{mcpu=arm8|mcpu=arm810|mcpu=strongarm*"\
+++ "|march=armv4|mcpu=fa526|mcpu=fa626:--fix-v4bx}"
+++
++ /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to
++ use the GNU/Linux version, not the generic BPABI version. */
++ #undef LINK_SPEC
++-#define LINK_SPEC BE8_LINK_SPEC \
+++#define LINK_SPEC BE8_LINK_SPEC TARGET_FIX_V4BX_SPEC \
++ LINUX_OR_ANDROID_LD (LINUX_TARGET_LINK_SPEC, \
++ LINUX_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC)
++
+diff --git a/feeds/packages/devel/gcc/patches/850-use_shared_libgcc.patch b/feeds/packages/devel/gcc/patches/850-use_shared_libgcc.patch
+new file mode 100644
+index 0000000..2c7369f
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/850-use_shared_libgcc.patch
+@@ -0,0 +1,47 @@
++--- a/gcc/config/arm/linux-eabi.h
+++++ b/gcc/config/arm/linux-eabi.h
++@@ -114,10 +114,6 @@
++ #define ENDFILE_SPEC \
++ LINUX_OR_ANDROID_LD (GNU_USER_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC)
++
++-/* Use the default LIBGCC_SPEC, not the version in linux-elf.h, as we
++- do not use -lfloat. */
++-#undef LIBGCC_SPEC
++-
++ /* Clear the instruction cache from `beg' to `end'. This is
++ implemented in lib1funcs.S, so ensure an error if this definition
++ is used. */
++--- a/gcc/config/linux.h
+++++ b/gcc/config/linux.h
++@@ -51,6 +51,10 @@ see the files COPYING3 and COPYING.RUNTI
++ builtin_assert ("system=posix"); \
++ } while (0)
++
+++#ifndef LIBGCC_SPEC
+++#define LIBGCC_SPEC "%{static|static-libgcc:-lgcc}%{!static:%{!static-libgcc:-lgcc_s}}"
+++#endif
+++
++ /* Determine which dynamic linker to use depending on whether GLIBC or
++ uClibc or Bionic is the default C library and whether
++ -muclibc or -mglibc or -mbionic has been passed to change the default. */
++--- a/libgcc/mkmap-symver.awk
+++++ b/libgcc/mkmap-symver.awk
++@@ -132,5 +132,5 @@ function output(lib) {
++ else if (inherit[lib])
++ printf("} %s;\n", inherit[lib]);
++ else
++- printf ("\n local:\n\t*;\n};\n");
+++ printf ("\n\t*;\n};\n");
++ }
++--- a/gcc/config/rs6000/linux.h
+++++ b/gcc/config/rs6000/linux.h
++@@ -61,6 +61,9 @@
++ #undef CPLUSPLUS_CPP_SPEC
++ #define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
++
+++#undef LIBGCC_SPEC
+++#define LIBGCC_SPEC "%{!static:%{!static-libgcc:-lgcc_s}} -lgcc"
+++
++ #undef LINK_SHLIB_SPEC
++ #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
++
+diff --git a/feeds/packages/devel/gcc/patches/860-uclibc_use_eh_frame.patch b/feeds/packages/devel/gcc/patches/860-uclibc_use_eh_frame.patch
+new file mode 100644
+index 0000000..0464bd7
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/860-uclibc_use_eh_frame.patch
+@@ -0,0 +1,29 @@
++--- a/libgcc/crtstuff.c
+++++ b/libgcc/crtstuff.c
++@@ -100,15 +100,20 @@ call_ ## FUNC (void) \
++ #if defined(OBJECT_FORMAT_ELF) \
++ && !defined(OBJECT_FORMAT_FLAT) \
++ && defined(HAVE_LD_EH_FRAME_HDR) \
++- && !defined(inhibit_libc) && !defined(CRTSTUFFT_O) \
++- && defined(__GLIBC__) && __GLIBC__ >= 2
+++ && !defined(inhibit_libc) && !defined(CRTSTUFFT_O)
++ #include <link.h>
++ /* uClibc pretends to be glibc 2.2 and DT_CONFIG is defined in its link.h.
++ But it doesn't use PT_GNU_EH_FRAME ELF segment currently. */
++-# if !defined(__UCLIBC__) \
++- && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
++- || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG)))
++-# define USE_PT_GNU_EH_FRAME
+++# if defined(__UCLIBC__)
+++# if (__UCLIBC_MAJOR__ > 0 || __UCLIBC_MINOR__ > 9 || \
+++ (__UCLIBC_MINOR__ == 9 && __UCLIBC_SUBLEVEL__ >= 33))
+++# define USE_PT_GNU_EH_FRAME
+++# endif
+++# elif defined(__GLIBC__)
+++# if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) \
+++ || (__GLIBC__ == 2 && __GLIBC_MINOR__ == 2 && defined(DT_CONFIG)))
+++# define USE_PT_GNU_EH_FRAME
+++# endif
++ # endif
++ #endif
++
+diff --git a/feeds/packages/devel/gcc/patches/870-ppc_no_crtsavres.patch b/feeds/packages/devel/gcc/patches/870-ppc_no_crtsavres.patch
+new file mode 100644
+index 0000000..d8c460a
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/870-ppc_no_crtsavres.patch
+@@ -0,0 +1,11 @@
++--- a/gcc/config/rs6000/rs6000.c
+++++ b/gcc/config/rs6000/rs6000.c
++@@ -17653,7 +17653,7 @@ rs6000_savres_strategy (rs6000_stack_t *
++ /* Define cutoff for using out-of-line functions to save registers. */
++ if (DEFAULT_ABI == ABI_V4 || TARGET_ELF)
++ {
++- if (!optimize_size)
+++ if (1)
++ {
++ strategy |= SAVE_INLINE_FPRS | REST_INLINE_FPRS;
++ strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
+diff --git a/feeds/packages/devel/gcc/patches/880-no_java_section.patch b/feeds/packages/devel/gcc/patches/880-no_java_section.patch
+new file mode 100644
+index 0000000..def6c9f
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/880-no_java_section.patch
+@@ -0,0 +1,11 @@
++--- a/gcc/defaults.h
+++++ b/gcc/defaults.h
++@@ -380,7 +380,7 @@ see the files COPYING3 and COPYING.RUNTI
++ /* If we have named section and we support weak symbols, then use the
++ .jcr section for recording java classes which need to be registered
++ at program start-up time. */
++-#if defined (TARGET_ASM_NAMED_SECTION) && SUPPORTS_WEAK
+++#if 0 && defined (TARGET_ASM_NAMED_SECTION) && SUPPORTS_WEAK
++ #ifndef JCR_SECTION_NAME
++ #define JCR_SECTION_NAME ".jcr"
++ #endif
+diff --git a/feeds/packages/devel/gcc/patches/900-bad-mips16-crt.patch b/feeds/packages/devel/gcc/patches/900-bad-mips16-crt.patch
+new file mode 100644
+index 0000000..dd6e9dc
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/900-bad-mips16-crt.patch
+@@ -0,0 +1,9 @@
++--- a/libgcc/config/mips/t-mips16
+++++ b/libgcc/config/mips/t-mips16
++@@ -43,3 +43,6 @@ SYNC_CFLAGS = -mno-mips16
++
++ # Version these symbols if building libgcc.so.
++ SHLIB_MAPFILES += $(srcdir)/config/mips/libgcc-mips16.ver
+++
+++CRTSTUFF_T_CFLAGS += -mno-mips16
+++CRTSTUFF_T_CFLAGS_S += -mno-mips16
+diff --git a/feeds/packages/devel/gcc/patches/910-mbsd_multi.patch b/feeds/packages/devel/gcc/patches/910-mbsd_multi.patch
+new file mode 100644
+index 0000000..d04dc7d
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/910-mbsd_multi.patch
+@@ -0,0 +1,253 @@
++
++ This patch brings over a few features from MirBSD:
++ * -fhonour-copts
++ If this option is not given, it's warned (depending
++ on environment variables). This is to catch errors
++ of misbuilt packages which override CFLAGS themselves.
++ * -Werror-maybe-reset
++ Has the effect of -Wno-error if GCC_NO_WERROR is
++ set and not '0', a no-operation otherwise. This is
++ to be able to use -Werror in "make" but prevent
++ GNU autoconf generated configure scripts from
++ freaking out.
++ * Make -fno-strict-aliasing and -fno-delete-null-pointer-checks
++ the default for -O2/-Os, because they trigger gcc bugs
++ and can delete code with security implications.
++
++ This patch was authored by Thorsten Glaser <tg at mirbsd.de>
++ with copyright assignment to the FSF in effect.
++
++--- a/gcc/c-family/c-opts.c
+++++ b/gcc/c-family/c-opts.c
++@@ -104,6 +104,9 @@ static size_t include_cursor;
++ /* Whether any standard preincluded header has been preincluded. */
++ static bool done_preinclude;
++
+++/* Check if a port honours COPTS. */
+++static int honour_copts = 0;
+++
++ static void handle_OPT_d (const char *);
++ static void set_std_cxx98 (int);
++ static void set_std_cxx11 (int);
++@@ -383,6 +386,9 @@ c_common_handle_option (size_t scode, co
++ cpp_opts->warn_endif_labels = value;
++ break;
++
+++ case OPT_Werror_maybe_reset:
+++ break;
+++
++ case OPT_Winvalid_pch:
++ cpp_opts->warn_invalid_pch = value;
++ break;
++@@ -491,6 +497,12 @@ c_common_handle_option (size_t scode, co
++ flag_no_builtin = !value;
++ break;
++
+++ case OPT_fhonour_copts:
+++ if (c_language == clk_c) {
+++ honour_copts++;
+++ }
+++ break;
+++
++ case OPT_fconstant_string_class_:
++ constant_string_class_name = arg;
++ break;
++@@ -1027,6 +1039,47 @@ c_common_init (void)
++ return false;
++ }
++
+++ if (c_language == clk_c) {
+++ char *ev = getenv ("GCC_HONOUR_COPTS");
+++ int evv;
+++ if (ev == NULL)
+++ evv = -1;
+++ else if ((*ev == '0') || (*ev == '\0'))
+++ evv = 0;
+++ else if (*ev == '1')
+++ evv = 1;
+++ else if (*ev == '2')
+++ evv = 2;
+++ else if (*ev == 's')
+++ evv = -1;
+++ else {
+++ warning (0, "unknown GCC_HONOUR_COPTS value, assuming 1");
+++ evv = 1; /* maybe depend this on something like MIRBSD_NATIVE? */
+++ }
+++ if (evv == 1) {
+++ if (honour_copts == 0) {
+++ error ("someone does not honour COPTS at all in lenient mode");
+++ return false;
+++ } else if (honour_copts != 1) {
+++ warning (0, "someone does not honour COPTS correctly, passed %d times",
+++ honour_copts);
+++ }
+++ } else if (evv == 2) {
+++ if (honour_copts == 0) {
+++ error ("someone does not honour COPTS at all in strict mode");
+++ return false;
+++ } else if (honour_copts != 1) {
+++ error ("someone does not honour COPTS correctly, passed %d times",
+++ honour_copts);
+++ return false;
+++ }
+++ } else if (evv == 0) {
+++ if (honour_copts != 1)
+++ inform (0, "someone does not honour COPTS correctly, passed %d times",
+++ honour_copts);
+++ }
+++ }
+++
++ return true;
++ }
++
++--- a/gcc/c-family/c.opt
+++++ b/gcc/c-family/c.opt
++@@ -379,6 +379,10 @@ Werror-implicit-function-declaration
++ C ObjC RejectNegative Warning Alias(Werror=, implicit-function-declaration)
++ This switch is deprecated; use -Werror=implicit-function-declaration instead
++
+++Werror-maybe-reset
+++C ObjC C++ ObjC++
+++; Documented in common.opt
+++
++ Wfloat-equal
++ C ObjC C++ ObjC++ Var(warn_float_equal) Warning
++ Warn if testing floating point numbers for equality
++@@ -949,6 +953,9 @@ C++ ObjC++ Optimization Alias(fexception
++ fhonor-std
++ C++ ObjC++ Ignore Warn(switch %qs is no longer supported)
++
+++fhonour-copts
+++C ObjC C++ ObjC++ RejectNegative
+++
++ fhosted
++ C ObjC
++ Assume normal C execution environment
++--- a/gcc/common.opt
+++++ b/gcc/common.opt
++@@ -541,6 +541,10 @@ Werror=
++ Common Joined
++ Treat specified warning as error
++
+++Werror-maybe-reset
+++Common
+++If environment variable GCC_NO_WERROR is set, act as -Wno-error
+++
++ Wextra
++ Common Var(extra_warnings) Warning
++ Print extra (possibly unwanted) warnings
++@@ -1242,6 +1246,9 @@ fguess-branch-probability
++ Common Report Var(flag_guess_branch_prob) Optimization
++ Enable guessing of branch probabilities
++
+++fhonour-copts
+++Common RejectNegative
+++
++ ; Nonzero means ignore `#ident' directives. 0 means handle them.
++ ; Generate position-independent code for executables if possible
++ ; On SVR4 targets, it also controls whether or not to emit a
++--- a/gcc/opts.c
+++++ b/gcc/opts.c
++@@ -468,8 +468,6 @@ static const struct default_options defa
++ { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 },
++ #endif
++ { OPT_LEVELS_2_PLUS, OPT_fregmove, NULL, 1 },
++- { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 },
++- { OPT_LEVELS_2_PLUS, OPT_fstrict_overflow, NULL, 1 },
++ { OPT_LEVELS_2_PLUS, OPT_freorder_blocks, NULL, 1 },
++ { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 },
++ { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 },
++@@ -488,6 +486,8 @@ static const struct default_options defa
++ { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 },
++
++ /* -O3 optimizations. */
+++ { OPT_LEVELS_3_PLUS, OPT_fstrict_aliasing, NULL, 1 },
+++ { OPT_LEVELS_3_PLUS, OPT_fstrict_overflow, NULL, 1 },
++ { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
++ { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
++ /* Inlining of functions reducing size is a good idea with -Os
++@@ -1423,6 +1423,17 @@ common_handle_option (struct gcc_options
++ opts, opts_set, loc, dc);
++ break;
++
+++ case OPT_Werror_maybe_reset:
+++ {
+++ char *ev = getenv ("GCC_NO_WERROR");
+++ if ((ev != NULL) && (*ev != '0'))
+++ warnings_are_errors = 0;
+++ }
+++ break;
+++
+++ case OPT_fhonour_copts:
+++ break;
+++
++ case OPT_Wlarger_than_:
++ opts->x_larger_than_size = value;
++ opts->x_warn_larger_than = value != -1;
++--- a/gcc/doc/cppopts.texi
+++++ b/gcc/doc/cppopts.texi
++@@ -163,6 +163,11 @@ in older programs. This warning is on b
++ Make all warnings into hard errors. Source code which triggers warnings
++ will be rejected.
++
+++ at item -Werror-maybe-reset
+++ at opindex Werror-maybe-reset
+++Act like @samp{-Wno-error} if the @env{GCC_NO_WERROR} environment
+++variable is set to anything other than 0 or empty.
+++
++ @item -Wsystem-headers
++ @opindex Wsystem-headers
++ Issue warnings for code in system headers. These are normally unhelpful
++--- a/gcc/doc/invoke.texi
+++++ b/gcc/doc/invoke.texi
++@@ -240,7 +240,7 @@ Objective-C and Objective-C++ Dialects}.
++ -Wconversion -Wcoverage-mismatch -Wno-cpp -Wno-deprecated @gol
++ -Wno-deprecated-declarations -Wdisabled-optimization @gol
++ -Wno-div-by-zero -Wdouble-promotion -Wempty-body -Wenum-compare @gol
++--Wno-endif-labels -Werror -Werror=* @gol
+++-Wno-endif-labels -Werror -Werror=* -Werror-maybe-reset @gol
++ -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 @gol
++ -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral @gol
++ -Wformat-security -Wformat-y2k @gol
++@@ -4808,6 +4808,22 @@ This option is only supported for C and
++ @option{-Wall} and by @option{-Wpedantic}, which can be disabled with
++ @option{-Wno-pointer-sign}.
++
+++ at item -Werror-maybe-reset
+++ at opindex Werror-maybe-reset
+++Act like @samp{-Wno-error} if the @env{GCC_NO_WERROR} environment
+++variable is set to anything other than 0 or empty.
+++
+++ at item -fhonour-copts
+++ at opindex fhonour-copts
+++If @env{GCC_HONOUR_COPTS} is set to 1, abort if this option is not
+++given at least once, and warn if it is given more than once.
+++If @env{GCC_HONOUR_COPTS} is set to 2, abort if this option is not
+++given exactly once.
+++If @env{GCC_HONOUR_COPTS} is set to 0 or unset, warn if this option
+++is not given exactly once.
+++The warning is quelled if @env{GCC_HONOUR_COPTS} is set to @samp{s}.
+++This flag and environment variable only affect the C language.
+++
++ @item -Wstack-protector
++ @opindex Wstack-protector
++ @opindex Wno-stack-protector
++@@ -6919,7 +6935,7 @@ so, the first branch is redirected to ei
++ second branch or a point immediately following it, depending on whether
++ the condition is known to be true or false.
++
++-Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
+++Enabled at levels @option{-O3}.
++
++ @item -fsplit-wide-types
++ @opindex fsplit-wide-types
++--- a/gcc/java/jvspec.c
+++++ b/gcc/java/jvspec.c
++@@ -626,6 +626,7 @@ lang_specific_pre_link (void)
++ class name. Append dummy `.c' that can be stripped by set_input so %b
++ is correct. */
++ set_input (concat (main_class_name, "main.c", NULL));
+++ putenv ("GCC_HONOUR_COPTS=s"); /* XXX hack! */
++ err = do_spec (jvgenmain_spec);
++ if (err == 0)
++ {
+diff --git a/feeds/packages/devel/gcc/patches/920-specs_nonfatal_getenv.patch b/feeds/packages/devel/gcc/patches/920-specs_nonfatal_getenv.patch
+new file mode 100644
+index 0000000..4baa966
+--- /dev/null
++++ b/feeds/packages/devel/gcc/patches/920-specs_nonfatal_getenv.patch
+@@ -0,0 +1,14 @@
++--- a/gcc/gcc.c
+++++ b/gcc/gcc.c
++@@ -8003,7 +8003,10 @@ getenv_spec_function (int argc, const ch
++
++ value = getenv (argv[0]);
++ if (!value)
++- fatal_error ("environment variable %qs not defined", argv[0]);
+++ {
+++ warning (0, "environment variable %qs not defined", argv[0]);
+++ value = "";
+++ }
++
++ /* We have to escape every character of the environment variable so
++ they are not interpreted as active spec characters. A
+diff --git a/feeds/packages/devel/lttng-modules/Makefile b/feeds/packages/devel/lttng-modules/Makefile
+new file mode 100644
+index 0000000..99510a0
+--- /dev/null
++++ b/feeds/packages/devel/lttng-modules/Makefile
+@@ -0,0 +1,45 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lttng-modules
++PKG_VERSION:=2.6.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://lttng.org/files/$(PKG_NAME)/
++PKG_MD5SUM:=ccfb50ad922cdaf54a809e2d9de23da4
++
++PKG_LICENSE:=LGPL-2.1 GPL-2.0 MIT
++PKG_LICENSE_FILES:=LICENSE
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++include $(INCLUDE_DIR)/kernel.mk
++include $(INCLUDE_DIR)/package.mk
++
++define KernelPackage/lttng
++ SUBMENU:=Other modules
++ TITLE:=Linux Trace Toolkit: next generation (kernel modules)
++ URL:=https://lttng.org/
++ DEPENDS:= @!TARGET_uml @KERNEL_FTRACE_SYSCALLS
++ FILES:= \
++ $(PKG_BUILD_DIR)/lttng-*.$(LINUX_KMOD_SUFFIX) \
++ $(PKG_BUILD_DIR)/lib/lttng-*.$(LINUX_KMOD_SUFFIX) \
++ $(PKG_BUILD_DIR)/probes/lttng-*.$(LINUX_KMOD_SUFFIX)
++endef
++
++define Build/Compile
++ $(MAKE) -C "$(LINUX_DIR)" \
++ ARCH="$(LINUX_KARCH)" \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ SUBDIRS="$(PKG_BUILD_DIR)" \
++ V="$(V)" \
++ modules
++endef
++
++$(eval $(call KernelPackage,lttng))
+diff --git a/feeds/packages/devel/lttng-modules/patches/001-mm_page_alloc_extfrag.patch b/feeds/packages/devel/lttng-modules/patches/001-mm_page_alloc_extfrag.patch
+new file mode 100644
+index 0000000..d8a0c62
+--- /dev/null
++++ b/feeds/packages/devel/lttng-modules/patches/001-mm_page_alloc_extfrag.patch
+@@ -0,0 +1,10 @@
++--- a/instrumentation/events/lttng-module/kmem.h
+++++ b/instrumentation/events/lttng-module/kmem.h
++@@ -287,6 +287,7 @@ LTTNG_TRACEPOINT_EVENT_INSTANCE_PRINT(mm
++ )
++
++ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,2) \
+++ || LTTNG_KERNEL_RANGE(3,18,10, 3,19,0) \
++ || LTTNG_KERNEL_RANGE(3,14,36, 3,15,0) \
++ || LTTNG_DEBIAN_KERNEL_RANGE(3,16,7,9,0,0, 3,17,0,0,0,0))
++
+diff --git a/feeds/packages/devel/lttng-tools/Makefile b/feeds/packages/devel/lttng-tools/Makefile
+new file mode 100644
+index 0000000..6c902df
+--- /dev/null
++++ b/feeds/packages/devel/lttng-tools/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lttng-tools
++PKG_VERSION:=2.6.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://lttng.org/files/$(PKG_NAME)/
++PKG_MD5SUM:=0478f60395f9564b4a19f45ce7b7f3df
++
++PKG_LICENSE:=LGPL-2.1 GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_USE_MIPS16:=0
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lttng-tools
++ SECTION:=devel
++ CATEGORY:=Development
++ TITLE:=Linux Trace Toolkit: next generation (tools)
++ URL:=https://lttng.org/
++ DEPENDS:= +lttng-ust +libpopt +libxml2
++endef
++
++CONFIGURE_ARGS += --disable-kmod
++
++TARGET_LDFLAGS += -lurcu-bp
++
++MAKE_FLAGS += V="$(V)"
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/lttng $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblttng-ctl*.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/lttng-ctl.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/lttng-tools/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblttng-ctl*.so.* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lttng $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/lttng* $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,lttng-tools))
+diff --git a/feeds/packages/devel/patch/Makefile b/feeds/packages/devel/patch/Makefile
+new file mode 100644
+index 0000000..d705a30
+--- /dev/null
++++ b/feeds/packages/devel/patch/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=patch
++PKG_VERSION:=2.7.5
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@GNU/patch
++PKG_MD5SUM:=e3da7940431633fb65a01b91d3b7a27a
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/patch
++ SECTION:=devel
++ CATEGORY:=Development
++ TITLE:=patch
++ URL:=http://www.gnu.org/
++ MAINTAINER:=Russell Senior <russell@personaltelco.net>
++endef
++
++define Package/patch/description
++ The Patch package contains a program for modifying or creating files
++ by applying a "patch" file typically created by the diff program.
++endef
++
++CONFIGURE_ARGS+= --disable-xattr
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install
++endef
++
++define Package/patch/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/patch $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,patch))
+diff --git a/feeds/packages/ipv6/aiccu/Makefile b/feeds/packages/ipv6/aiccu/Makefile
+new file mode 100644
+index 0000000..4b81e10
+--- /dev/null
++++ b/feeds/packages/ipv6/aiccu/Makefile
+@@ -0,0 +1,70 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=aiccu
++PKG_VERSION:=20070115
++PKG_RELEASE:=16
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.sixxs.net/archive/sixxs/aiccu/unix
++PKG_MD5SUM:=c9bcc83644ed788e22a7c3f3d4021350
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=doc/LICENSE
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/aiccu/Default
++ TITLE:=SixXS IPv6 Connectivity Client ($(1))
++ SECTION:=net
++ CATEGORY:=Network
++ VARIANT:=$(2)
++ DEPENDS:=+libpthread +ip +kmod-sit +kmod-tun $(3)
++ URL:=http://www.sixxs.net/tools/aiccu/
++ MAINTAINER:=Ondrej Caletka <ondrej@caletka.cz>
++endef
++
++Package/aiccu=$(call Package/aiccu/Default,without GNUTLS support,default)
++Package/aiccu-gnutls=$(call Package/aiccu/Default,with GNUTLS support,gnutls,+libgnutls)
++
++define Build/Configure
++ $(SED) "s,strip,/bin/true," $(PKG_BUILD_DIR)/unix-console/Makefile
++endef
++
++ifeq ($(BUILD_VARIANT),gnutls)
++CONFIG_AICCU_GNUTLS:=y
++endif
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ CC="$(TARGET_CC)" OS_NAME="Linux" OS_VERSION="$(LINUX_VERSION)" \
++ EXTRA_CFLAGS="$(TARGET_CFLAGS)" \
++ EXTRA_LDFLAGS="$(TARGET_LDFLAGS) -pthread" \
++ $(if $(CONFIG_AICCU_GNUTLS),HAVE_GNUTLS=1) \
++ DEBUG=0
++endef
++
++define Package/aiccu/conffiles
++/etc/config/aiccu
++endef
++
++Package/aiccu-gnutls/conffiles=$(call Package/aiccu/conffiles)
++
++define Package/aiccu/install
++ $(INSTALL_DIR) $(1)/usr/sbin $(1)/lib/netifd/proto $(1)/etc/hotplug.d/ntp
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/unix-console/$(PKG_NAME) $(1)/usr/sbin/
++ $(INSTALL_BIN) ./files/aiccu.sh $(1)/lib/netifd/proto/aiccu.sh
++ $(INSTALL_DATA) ./files/aiccu.hotplug $(1)/etc/hotplug.d/ntp/10-aiccu
++endef
++
++Package/aiccu-gnutls/install=$(call Package/aiccu/install,$(1))
++
++$(eval $(call BuildPackage,aiccu))
++$(eval $(call BuildPackage,aiccu-gnutls))
+diff --git a/feeds/packages/ipv6/aiccu/files/aiccu.hotplug b/feeds/packages/ipv6/aiccu/files/aiccu.hotplug
+new file mode 100644
+index 0000000..b521371
+--- /dev/null
++++ b/feeds/packages/ipv6/aiccu/files/aiccu.hotplug
+@@ -0,0 +1,3 @@
++#!/bin/sh
++NTPSTRATUMFILE="/var/run/aiccu_ntp_stratum"
++echo $stratum > "$NTPSTRATUMFILE"
+diff --git a/feeds/packages/ipv6/aiccu/files/aiccu.sh b/feeds/packages/ipv6/aiccu/files/aiccu.sh
+new file mode 100755
+index 0000000..584574b
+--- /dev/null
++++ b/feeds/packages/ipv6/aiccu/files/aiccu.sh
+@@ -0,0 +1,121 @@
++#!/bin/sh
++# aiccu.sh - AICCU proto
++# Copyright (c) 2014 OpenWrt.org
++
++[ -n "$INCLUDE_ONLY" ] || {
++ . /lib/functions.sh
++ . /lib/functions/network.sh
++ . ../netifd-proto.sh
++ init_proto "$@"
++}
++
++proto_aiccu_setup() {
++ local cfg="$1"
++ local iface="$2"
++ local link="aiccu-$cfg"
++
++ local username password protocol server ip6prefix tunnelid requiretls defaultroute nat heartbeat verbose sourcerouting ip6addr ntpsynctimeout
++ json_get_vars username password protocol server ip6prefix tunnelid requiretls defaultroute nat heartbeat verbose sourcerouting ip6addr ntpsynctimeout
++
++ [ -z "$username" -o -z "$password" ] && {
++ proto_notify_error "$cfg" "MISSING_USERNAME_OR_PASSWORD"
++ proto_block_restart "$cfg"
++ return
++ }
++
++ ( proto_add_host_dependency "$cfg" 0.0.0.0 )
++
++ CFGFILE="/var/etc/${link}.conf"
++ PIDFILE="/var/run/${link}.pid"
++ NTPSTRATUMFILE="/var/run/aiccu_ntp_stratum"
++ mkdir -p /var/run /var/etc
++
++ echo "username $username" > "$CFGFILE"
++ echo "password $password" >> "$CFGFILE"
++ echo "ipv6_interface $link" >> "$CFGFILE"
++ [ -n "$server" ] && echo "server $server" >> "$CFGFILE"
++ [ -n "$protocol" ] && echo "protocol $protocol" >> "$CFGFILE"
++ [ -n "$tunnelid" ] && echo "tunnel_id $tunnelid" >> "$CFGFILE"
++ [ "$requiretls" == 1 ] && echo "requiretls true" >> "$CFGFILE"
++ [ "$nat" == 1 ] && echo "behindnat true" >> "$CFGFILE"
++ [ "$heartbeat" == 1 ] && echo "makebeats true" >> "$CFGFILE"
++ [ "$verbose" == 1 ] && echo "verbose true" >> "$CFGFILE"
++ echo "defaultroute false" >> "$CFGFILE"
++ echo "daemonize true" >> "$CFGFILE"
++ echo "pidfile $PIDFILE" >> "$CFGFILE"
++
++ # By default, wait at most 90 seconds for NTP sync
++ [ -z "$ntpsynctimeout" ] && ntpsynctimeout=90
++ for i in $(seq 1 $ntpsynctimeout); do
++ [ -f "$NTPSTRATUMFILE" ] && \
++ [ "$(cat $NTPSTRATUMFILE)" -lt 16 ] && \
++ echo "NTP synced, stratum $(cat $NTPSTRATUMFILE)" && break
++ [ "$(( $i % 10 ))" -eq 0 ] && echo "Waiting ${i} secs for NTP sync..."
++ sleep 1
++ done
++
++ aiccu start "$CFGFILE"
++
++ [ "$?" -ne 0 ] && {
++ proto_notify_error "$cfg" "AICCU_FAILED_SEE_LOG"
++ proto_block_restart "$cfg"
++ return
++ }
++
++ proto_init_update "$link" 1
++
++ local source=""
++ [ "$sourcerouting" != "0" ] && source="::/128"
++ [ "$defaultroute" != "0" ] && proto_add_ipv6_route "::" 0 "" "" "" "$source"
++
++ [ -n "$ip6addr" ] && {
++ local local6="${ip6addr%%/*}"
++ local mask6="${ip6addr##*/}"
++ [[ "$local6" = "$mask6" ]] && mask6=
++ proto_add_ipv6_address "$local6" "$mask6"
++ [ "$defaultroute" != "0" -a "$sourcerouting" != "0" ] && proto_add_ipv6_route "::" 0 "" "" "" "$local6/$mask6"
++ }
++
++ [ -n "$ip6prefix" ] && {
++ proto_add_ipv6_prefix "$ip6prefix"
++ [ "$defaultroute" != "0" -a "$sourcerouting" != "0" ] && proto_add_ipv6_route "::" 0 "" "" "" "$ip6prefix"
++ }
++
++ proto_send_update "$cfg"
++
++}
++
++proto_aiccu_teardown() {
++ local cfg="$1"
++ local link="aiccu-$cfg"
++ CFGFILE="/var/etc/${link}.conf"
++ PIDFILE="/var/run/${link}.pid"
++ [ -f "$CFGFILE" -a -f "$PIDFILE" ] && {
++ local pid="$(cat "$PIDFILE")"
++ [ -d /proc/$pid -a $(cat /proc/$pid/comm) = "aiccu" ] && \
++ aiccu stop "$CFGFILE"
++ }
++}
++
++proto_aiccu_init_config() {
++ no_device=1
++ available=1
++ proto_config_add_string "username"
++ proto_config_add_string "password"
++ proto_config_add_string "protocol"
++ proto_config_add_string "server"
++ proto_config_add_string "ip6addr:ip6addr"
++ proto_config_add_string "ip6prefix:ip6addr"
++ proto_config_add_string "tunnelid"
++ proto_config_add_boolean "requiretls"
++ proto_config_add_boolean "defaultroute"
++ proto_config_add_boolean "sourcerouting"
++ proto_config_add_boolean "nat"
++ proto_config_add_boolean "heartbeat"
++ proto_config_add_boolean "verbose"
++ proto_config_add_int "ntpsynctimeout"
++}
++
++[ -n "$INCLUDE_ONLY" ] || {
++ add_protocol aiccu
++}
+diff --git a/feeds/packages/ipv6/aiccu/patches/100-cross_compile.patch b/feeds/packages/ipv6/aiccu/patches/100-cross_compile.patch
+new file mode 100644
+index 0000000..6ef8ad5
+--- /dev/null
++++ b/feeds/packages/ipv6/aiccu/patches/100-cross_compile.patch
+@@ -0,0 +1,101 @@
++--- a/unix-console/Makefile
+++++ b/unix-console/Makefile
++@@ -25,7 +25,8 @@ CWARNS += -W -Wall -Wshadow -Wpointer-ar
++ # CWARNS += -Wpacked
++
++ #CFLAGS += $(CWARNS) -D_GNU_SOURCE -D_DEBUG -g3 -O0
++-CFLAGS += $(CWARNS) -D_GNU_SOURCE
+++CFLAGS += $(CWARNS) $(EXTRA_CFLAGS) -D_GNU_SOURCE
+++LDFLAGS += $(EXTRA_LDFLAGS)
++ CC = @gcc
++ RM = rm
++
++@@ -40,25 +41,25 @@ CFLAGS += -D AICCU_CONSOLE
++ # GnuTLS Support ?
++ # Used by TIC to secure that communication
++ # Currently defaultly builds only on Linux, but other platforms might easily also support it
++-ifeq ($(shell uname | grep -c "Linux"),1)
+++ifneq ($(HAVE_GNUTLS),)
++ CFLAGS += -D AICCU_GNUTLS
++ LDFLAGS += -lgnutls
++ endif
++
++ # Linux
++-ifeq ($(shell uname | grep -c "Linux"),1)
+++ifeq ($(OS_NAME),Linux)
++ CFLAGS += -D_LINUX -D HAS_IFHEAD -D AICCU_TYPE="\"linux\""
++ SRCS += ../common/aiccu_linux.c
++ OBJS += ../common/aiccu_linux.o
++-LDFLAGS += -lpthread -lresolv
+++LDFLAGS += -pthread -lresolv
++ endif
++
++ # FreeBSD
++-ifeq ($(shell uname | grep -c "FreeBSD"),1)
+++ifeq ($(OS_NAME),FreeBSD)
++ CFLAGS += -D_FREEBSD
++
++ # FreeBSD 4.x
++-ifeq ($(shell uname -r | cut -c 1),4)
+++ifeq ($(shell echo $(OS_VERSION) | cut -c 1),4)
++ CFLAGS += -D AICCU_TYPE="\"freebsd4\""
++ SRCS += ../common/aiccu_freebsd4.c
++ OBJS += ../common/aiccu_freebsd4.o
++@@ -71,7 +72,7 @@ endif
++ endif
++
++ # DragonFlyBSD
++-ifeq ($(shell uname | grep -c "DragonFly"),1)
+++ifeq ($(OS_NAME),DragonFly)
++ CFLAGS += -D_DFBSD -D NEED_IFHEAD -D AICCU_TYPE="\"dragonfly\""
++ SRCS += ../common/aiccu_freebsd4.c
++ OBJS += ../common/aiccu_freebsd4.o
++@@ -79,7 +80,7 @@ CFLAGS += -pthread
++ endif
++
++ # NetBSD
++-ifeq ($(shell uname | grep -c "NetBSD"),1)
+++ifeq ($(OS_NAME),NetBSD)
++ CFLAGS += -D_NETBSD -D AICCU_TYPE="\"kame\""
++
++ # Check if net/if_tun.h has TUNSIFHEAD and enable support for it
++@@ -97,10 +98,10 @@ CFLAGS += -pthread -D_NETBSD_SOURCE
++ endif
++
++ # OpenBSD
++-ifeq ($(shell uname | grep -c "OpenBSD"),1)
+++ifeq ($(OS_NAME),OpenBSD)
++ CFLAGS += -D_OPENBSD -D HAS_IFHEAD
++ # 2.7-2.9
++-ifeq ($(shell uname -r | cut -c 1),2)
+++ifeq ($(shell echo $(OS_VERSION) | cut -c 1),2)
++ CFLAGS += -D AICCU_TYPE="\"openbsd2\""
++ SRCS += ../common/aiccu_openbsd2.c
++ OBJS += ../common/aiccu_openbsd2.o
++@@ -114,7 +115,7 @@ CFLAGS += -pthread
++ endif
++
++ # Darwin
++-ifeq ($(shell uname | grep -c "Darwin"),1)
+++ifeq ($(OS_NAME),Darwin)
++ CFLAGS += -D_DARWIN -D NEED_IFHEAD -D AICCU_TYPE="\"darwin\""
++ SRCS += ../common/aiccu_darwin.c
++ OBJS += ../common/aiccu_darwin.o
++@@ -122,7 +123,7 @@ LDFLAGS += -lresolv
++ endif
++
++ # SunOS / Solaris
++-ifeq ($(shell uname | grep -c "SunOS"),1)
+++ifeq ($(OS_NAME),SunOS)
++ CFLAGS += -D_SUNOS -D AICCU_TYPE="\"sunos\""
++ SRCS += ../common/aiccu_sunos.c
++ OBJS += ../common/aiccu_sunos.o
++@@ -130,7 +131,7 @@ LDFLAGS += -lsocket -lnsl -lresolv
++ endif
++
++ # AIX
++-ifeq ($(shell uname | grep -c "AIX"),1)
+++ifeq ($(OS_NAME),AIX)
++ CC = @/usr/vac/bin/xlc_r
++ CFLAGS = -qthreaded -q64 -qlanglvl=stdc99 -bmaxdata:0xD0000000 -D_64BIT -g -qdbxextra -qfullpath -qheapdebug -qformat=all -qcheck=all
++ CFLAGS += -D AICCU_CONSOLE
+diff --git a/feeds/packages/ipv6/aiccu/patches/200-add_dn_skipname.patch b/feeds/packages/ipv6/aiccu/patches/200-add_dn_skipname.patch
+new file mode 100644
+index 0000000..3ce1e92
+--- /dev/null
++++ b/feeds/packages/ipv6/aiccu/patches/200-add_dn_skipname.patch
+@@ -0,0 +1,68 @@
++--- /dev/null
+++++ b/common/dn_skipname.c
++@@ -0,0 +1,51 @@
+++#include <errno.h>
+++#include <resolv.h>
+++
+++/* Ripped from glibc 2.4 sources. */
+++
+++/*
+++ * ns_name_skip(ptrptr, eom)
+++ * Advance *ptrptr to skip over the compressed name it points at.
+++ * return:
+++ * 0 on success, -1 (with errno set) on failure.
+++ */
+++int ns_name_skip(const u_char **ptrptr, const u_char *eom)
+++{
+++ const u_char *cp;
+++ u_int n;
+++
+++ cp = *ptrptr;
+++ while (cp < eom && (n = *cp++) != 0)
+++ {
+++ /* Check for indirection. */
+++ switch (n & NS_CMPRSFLGS) {
+++ case 0: /* normal case, n == len */
+++ cp += n;
+++ continue;
+++ case NS_CMPRSFLGS: /* indirection */
+++ cp++;
+++ break;
+++ default: /* illegal type */
+++ errno = EMSGSIZE;
+++ return (-1);
+++ }
+++ break;
+++ }
+++ if (cp > eom)
+++ {
+++ errno = EMSGSIZE;
+++ return (-1);
+++ }
+++ *ptrptr = cp;
+++ return (0);
+++}
+++
+++int dn_skipname(const u_char *ptr, const u_char *eom)
+++{
+++ const u_char *saveptr = ptr;
+++
+++ if(ns_name_skip(&ptr, eom) == -1)
+++ return (-1);
+++ return (ptr - saveptr);
+++}
+++
++--- a/unix-console/Makefile
+++++ b/unix-console/Makefile
++@@ -10,9 +10,9 @@
++ # $Date: 2007-01-15 11:04:27 $
++ # **********************************************************/
++
++-SRCS = main.c ../common/tun.c ../common/aiccu.c ../common/hash_md5.c ../common/hash_sha1.c ../common/common.c ../common/heartbeat.c ../common/tic.c ../common/ayiya.c ../common/aiccu_test.c ../common/resolver.c
+++SRCS = main.c ../common/tun.c ../common/aiccu.c ../common/hash_md5.c ../common/hash_sha1.c ../common/common.c ../common/heartbeat.c ../common/tic.c ../common/ayiya.c ../common/aiccu_test.c ../common/resolver.c ../common/dn_skipname.c
++ INCS = ../common/tun.h ../common/aiccu.h ../common/hash_md5.h ../common/hash_sha1.h ../common/common.h ../common/heartbeat.h ../common/tic.h ../common/ayiya.h ../common/resolver.h
++-OBJS = main.o ../common/tun.o ../common/aiccu.o ../common/hash_md5.o ../common/hash_sha1.o ../common/common.o ../common/heartbeat.o ../common/tic.o ../common/ayiya.o ../common/aiccu_test.o ../common/resolver.o
+++OBJS = main.o ../common/tun.o ../common/aiccu.o ../common/hash_md5.o ../common/hash_sha1.o ../common/common.o ../common/heartbeat.o ../common/tic.o ../common/ayiya.o ../common/aiccu_test.o ../common/resolver.o ../common/dn_skipname.o
++
++ # New features not fully implemented and thus disabled for now
++ #CFLAGS += -D NEWSTUFF_TSP -D NEWSTUFF_TEEPEE
+diff --git a/feeds/packages/ipv6/aiccu/patches/300-resolver-uclibc.patch b/feeds/packages/ipv6/aiccu/patches/300-resolver-uclibc.patch
+new file mode 100644
+index 0000000..b88ef5c
+--- /dev/null
++++ b/feeds/packages/ipv6/aiccu/patches/300-resolver-uclibc.patch
+@@ -0,0 +1,29 @@
++--- a/common/resolver.c
+++++ b/common/resolver.c
++@@ -26,7 +26,7 @@
++
++ int getrrs(const char *label, int rrtype, void gotrec(unsigned int num, int type, const char *record))
++ {
++-#ifdef _LINUX
+++#if defined(_LINUX) && defined(__GLIBC__) && !defined(__UCLIBC__)
++ struct __res_state res;
++ #endif
++ unsigned char answer[8192];
++@@ -38,7 +38,7 @@ int getrrs(const char *label, int rrtype
++ uint16_t type = 0, class = 0;
++ uint32_t ttl = 0;
++
++-#ifdef _LINUX
+++#if defined(_LINUX) && defined(__GLIBC__) && !defined(__UCLIBC__)
++ memset(&res, 0, sizeof(res));
++ res.options = RES_DEBUG;
++ res_ninit(&res);
++@@ -47,7 +47,7 @@ int getrrs(const char *label, int rrtype
++ #endif
++
++ memset(answer, 0, sizeof(answer));
++-#ifdef _LINUX
+++#if defined(_LINUX) && defined(__GLIBC__) && !defined(__UCLIBC__)
++ ret = res_nquery(&res, label, C_IN, rrtype, answer, sizeof(answer));
++ #else
++ ret = res_query(label, C_IN, rrtype, answer, sizeof(answer));
+diff --git a/feeds/packages/ipv6/aiccu/patches/400-musl-compat.patch b/feeds/packages/ipv6/aiccu/patches/400-musl-compat.patch
+new file mode 100644
+index 0000000..b6e0c32
+--- /dev/null
++++ b/feeds/packages/ipv6/aiccu/patches/400-musl-compat.patch
+@@ -0,0 +1,31 @@
++--- a/common/common.h
+++++ b/common/common.h
++@@ -50,6 +50,7 @@
++ #include <signal.h>
++ #include <sys/types.h>
++ #include <sys/stat.h>
+++#include <sys/uio.h>
++ #include <fcntl.h>
++
++ #if defined(_SUNOS) || defined(_AIX) || defined(_DARWIN)
++@@ -91,7 +92,9 @@
++ #include <sys/select.h>
++
++ #include <net/if.h>
+++#if defined(__GLIBC__) || defined(__UCLIBC__)
++ #include <netinet/if_ether.h>
+++#endif
++ #ifdef linux
++ #include <netpacket/packet.h>
++ #include <linux/if_tun.h>
++--- a/common/dn_skipname.c
+++++ b/common/dn_skipname.c
++@@ -1,6 +1,8 @@
++ #include <errno.h>
++ #include <resolv.h>
++
+++#include <sys/types.h>
+++
++ /* Ripped from glibc 2.4 sources. */
++
++ /*
+diff --git a/feeds/packages/ipv6/aiccu/patches/500-gnutls_3.4.patch b/feeds/packages/ipv6/aiccu/patches/500-gnutls_3.4.patch
+new file mode 100644
+index 0000000..a314784
+--- /dev/null
++++ b/feeds/packages/ipv6/aiccu/patches/500-gnutls_3.4.patch
+@@ -0,0 +1,22 @@
++--- aiccu/common/common.c
+++++ aiccu/common/common.c
++@@ -271,8 +271,6 @@
++ TLSSOCKET sock_alloc(void)
++ {
++ #ifdef AICCU_GNUTLS
++- /* Allow connections to servers that have OpenPGP keys as well */
++- const int cert_type_priority[3] = { GNUTLS_CRT_X509, GNUTLS_CRT_OPENPGP, 0 };
++ int ret;
++ #endif /* AICCU_GNUTLS*/
++
++@@ -300,7 +298,8 @@
++ gnutls_set_default_priority(sock->session);
++ /* XXX: Return value is not documented in GNUTLS documentation! */
++
++- gnutls_certificate_type_set_priority(sock->session, cert_type_priority);
+++ /* Allow connections to servers that have OpenPGP keys as well */
+++ gnutls_priority_set_direct(sock->session, "NORMAL:+CTYPE-OPENPGP", NULL);
++ /* XXX: Return value is not documented in GNUTLS documentation! */
++
++ /* Configure the x509 credentials for the current session */
++
+diff --git a/feeds/packages/ipv6/tayga/Makefile b/feeds/packages/ipv6/tayga/Makefile
+new file mode 100644
+index 0000000..d68a271
+--- /dev/null
++++ b/feeds/packages/ipv6/tayga/Makefile
+@@ -0,0 +1,49 @@
++# $Id: Makefile 5624 2006-11-23 00:29:07Z nbd $
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tayga
++PKG_VERSION:=0.9.2
++PKG_RELEASE:=2
++
++PKG_SOURCE:=tayga-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.litech.org/tayga/
++PKG_MD5SUM:=7a7b24165ce008df772f398d86fa280e
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tayga
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+ip @IPV6 +kmod-tun
++ TITLE:=Out-of-kernel stateless NAT64 implementation for Linux
++ URL:=http://www.litech.org/tayga/
++ MAINTAINER:=Ondrej Caletka <ondrej@caletka.cz>
++endef
++
++define Package/tayga/description
++ TAYGA is an out-of-kernel stateless NAT64 implementation for
++ Linux. It uses the TUN driver to exchange packets with the
++ kernel, which is the same driver used by OpenVPN and QEMU/KVM.
++endef
++
++ifdef CONFIG_PACKAGE_netifd
++ define Package/tayga/install
++ $(INSTALL_DIR) $(1)/usr/sbin $(1)/lib/netifd/proto
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/tayga $(1)/usr/sbin/
++ $(INSTALL_BIN) ./files/tayga-proto.sh $(1)/lib/netifd/proto/tayga.sh
++ endef
++else
++ define Package/tayga/install
++ $(INSTALL_DIR) $(1)/usr/sbin $(1)/lib/network $(1)/etc/hotplug.d/iface
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/tayga $(1)/usr/sbin/
++ $(INSTALL_DATA) ./files/tayga.sh $(1)/lib/network/tayga.sh
++ $(INSTALL_DATA) ./files/tayga.hotplug $(1)/etc/hotplug.d/iface/95-tayga
++ endef
++endif
++
++$(eval $(call BuildPackage,tayga))
+diff --git a/feeds/packages/ipv6/tayga/files/tayga-proto.sh b/feeds/packages/ipv6/tayga/files/tayga-proto.sh
+new file mode 100755
+index 0000000..b92c2a6
+--- /dev/null
++++ b/feeds/packages/ipv6/tayga/files/tayga-proto.sh
+@@ -0,0 +1,96 @@
++#!/bin/sh
++# tayga.sh - TAYGA proto
++# Copyright (c) 2014 OpenWrt.org
++
++[ -n "$INCLUDE_ONLY" ] || {
++ . /lib/functions.sh
++ . /lib/functions/network.sh
++ . ../netifd-proto.sh
++ init_proto "$@"
++}
++
++proto_tayga_setup() {
++ local cfg="$1"
++ local iface="$2"
++ local link="tayga-$cfg"
++
++ local ipv4_addr ipv6_addr prefix dynamic_pool ipaddr ip6addr noroutes
++ json_get_vars ipv4_addr ipv6_addr prefix dynamic_pool ipaddr ip6addr noroutes
++ [ -z "$ipv4_addr" -o -z "$prefix" ] && {
++ proto_notify_error "$cfg" "REQUIRED_PARAMETERS_MISSING"
++ proto_block_restart "$cfg"
++ return
++ }
++
++ local tmpconf="/var/etc/tayga-$cfg.conf"
++ mkdir -p /var/etc
++ mkdir -p /var/run/tayga/$cfg
++
++ echo "tun-device $link" >$tmpconf
++ echo "ipv4-addr $ipv4_addr" >>$tmpconf
++ [ -n "$ipv6_addr" ] &&
++ echo "ipv6-addr $ipv6_addr" >>$tmpconf
++ [ -n "$prefix" ] &&
++ echo "prefix $prefix" >>$tmpconf
++ [ -n "$dynamic_pool" ] &&
++ echo "dynamic-pool $dynamic_pool" >>$tmpconf
++ echo "data-dir /var/run/tayga/$cfg" >>$tmpconf
++ #TODO: Support static mapping of IPv4 <-> IPv6
++
++ # here we create TUN device and check configuration
++ tayga -c $tmpconf --mktun
++ [ "$?" -ne 0 ] && {
++ proto_notify_error "$cfg" "TAYGA_FAILED"
++ proto_block_restart "$cfg"
++ return
++ }
++
++ proto_init_update "$link" 1
++
++ [ -n "$ipaddr" ] && proto_add_ipv4_address "$ipaddr" "255.255.255.255"
++ [ -n "$ip6addr" ] && proto_add_ipv6_address "$ip6addr" "128"
++
++ [ "$noroutes" != 1 ] && {
++ [ -n "$ipv6_addr" ] && proto_add_ipv6_route "$ipv6_addr" "128"
++ [ -n "$dynamic_pool" ] && {
++ local pool="${dynamic_pool%%/*}"
++ local mask="${dynamic_pool##*/}"
++ proto_add_ipv4_route "$pool" "$mask"
++ }
++ [ -n "$prefix" ] && {
++ local prefix6="${prefix%%/*}"
++ local mask6="${prefix##*/}"
++ proto_add_ipv6_route "$prefix6" "$mask6"
++ }
++ }
++
++ proto_send_update "$cfg"
++
++ proto_run_command "$cfg" tayga -n -c $tmpconf \
++ -p /var/run/$link.pid
++
++}
++
++proto_tayga_teardown() {
++ local cfg="$1"
++ local tmpconf="/var/etc/tayga-$cfg.conf"
++ proto_kill_command "$cfg"
++ sleep 1
++ tayga -c $tmpconf --rmtun
++}
++
++proto_tayga_init_config() {
++ no_device=1
++ available=1
++ proto_config_add_string "ipv4_addr"
++ proto_config_add_string "ipv6_addr"
++ proto_config_add_string "prefix"
++ proto_config_add_string "dynamic_pool"
++ proto_config_add_string "ipaddr"
++ proto_config_add_string "ip6addr:ip6addr"
++ proto_config_add_boolean "noroutes"
++}
++
++[ -n "$INCLUDE_ONLY" ] || {
++ add_protocol tayga
++}
+diff --git a/feeds/packages/ipv6/tayga/files/tayga.hotplug b/feeds/packages/ipv6/tayga/files/tayga.hotplug
+new file mode 100644
+index 0000000..fb989bd
+--- /dev/null
++++ b/feeds/packages/ipv6/tayga/files/tayga.hotplug
+@@ -0,0 +1,37 @@
++#!/bin/sh
++
++if [ "$ACTION" = ifup ]; then
++ . /lib/functions.sh
++
++ include /lib/network
++ scan_interfaces
++
++ update_tunnel() {
++ local cfg="$1"
++
++ local proto
++ config_get proto "$cfg" proto
++ [ "$proto" = tayga ] || return 0
++
++ local wandev4
++ config_get wandev4 "$cfg" wan4_device "$(find_tayga_wanif4)"
++
++ local wandev6
++ config_get wandev6 "$cfg" wan6_device "$(find_tayga_wanif6)"
++
++ [ "$wandev4" = "$DEVICE" ] || [ "$wandev6" = "$DEVICE" ] || return 0
++
++ local wanip4=$(find_tayga_wanip4 "$wandev4")
++ local wanip6=$(find_tayga_wanip6 "$wandev6")
++
++ [ -n "$wanip4" ] && [ -n "$wanip6" ] && {
++ uci_set_state network "$cfg" ipv4addr "$wanip4"
++ uci_set_state network "$cfg" ipv6addr "$wanip6"
++
++ logger -t tayga-update "Re-establishing tayga NAT64 due to change on $INTERFACE ($DEVICE)"
++ ifup "$cfg" &
++ }
++ }
++
++ config_foreach update_tunnel interface
++fi
+diff --git a/feeds/packages/ipv6/tayga/files/tayga.sh b/feeds/packages/ipv6/tayga/files/tayga.sh
+new file mode 100644
+index 0000000..a9edb6d
+--- /dev/null
++++ b/feeds/packages/ipv6/tayga/files/tayga.sh
+@@ -0,0 +1,152 @@
++# tayga.sh - NAT64 backend
++
++find_tayga_wanif4() {
++ local if=$(ip -4 r l e 0.0.0.0/0); if="${if#default* dev }"; if="${if%% *}"
++ [ -n "$if" ] && grep -qs "^ *$if:" /proc/net/dev && echo "$if"
++}
++
++find_tayga_wanip4() {
++ local ip=$(ip -4 a s dev "$1"); ip="${ip#*inet }"
++ echo "${ip%%[^0-9.]*}"
++}
++
++find_tayga_wanif6() {
++ local if=$(ip -6 r l e ::/0); if="${if#default* dev }"; if="${if%% *}"
++ [ -n "$if" ] && grep -qs "^ *$if:" /proc/net/dev && echo "$if"
++}
++
++find_tayga_wanip6() {
++ local ip=$(ip -6 a s dev "$1"); ip="${ip#*inet6 }"
++ echo "${ip%%[^0-9A-Fa-f:]*}"
++}
++
++# Hook into scan_interfaces() to synthesize a .device option
++# This is needed for /sbin/ifup to properly dispatch control
++# to setup_interface_tayga() even if no .ifname is set in
++# the configuration.
++scan_tayga() {
++ config_set "$1" device "tayga-$1"
++}
++
++coldplug_interface_tayga() {
++ setup_interface_tayga "tayga-$1" "$1"
++}
++
++tayga_add_static_mappings() {
++ local tmpconf="$1"
++
++ (
++ . /lib/functions.sh
++ config_load firewall
++
++ tayga_map_rule_add() {
++ local cfg="$1"
++ local tmpconf="$2"
++ local ipv4_addr ipv6_addr
++ config_get ipv4_addr "$cfg" ipv4_addr ""
++ config_get ipv6_addr "$cfg" ipv6_addr ""
++ [ -n "$ipv4_addr" ] && [ -n "$ipv6_addr" ] &&
++ echo "map $ipv4_addr $ipv6_addr" >>$tmpconf
++ }
++
++ config_foreach tayga_map_rule_add nat64 "$tmpconf"
++ )
++}
++
++setup_interface_tayga() {
++ local iface="$1"
++ local cfg="$2"
++ local link="tayga-$cfg"
++
++ local ipv4_addr ipv6_addr prefix dynamic_pool
++
++ config_get ipv4_addr "$cfg" ipv4_addr
++ config_get ipv6_addr "$cfg" ipv6_addr
++ config_get prefix "$cfg" prefix
++ config_get dynamic_pool "$cfg" dynamic_pool
++
++ local args
++
++ include /lib/network
++ scan_interfaces
++
++ local wanip4=$(uci_get network "$cfg" ipv4addr)
++ local wanip6=$(uci_get network "$cfg" ipv6addr)
++
++ local wanif4=$(find_tayga_wanif4)
++ local wanif6=$(find_tayga_wanif6)
++
++ [ -z "$wanip4" ] && {
++ [ -n "$wanif4" ] && {
++ wanip4=$(find_tayga_wanip4 "$wanif4")
++ uci_set_state network "$cfg" wan4_device "$wanif4"
++ }
++ }
++
++ [ -z "$wanip6" ] && {
++ [ -n "$wanif6" ] && {
++ wanip6=$(find_tayga_wanip6 "$wanif6")
++ uci_set_state network "$cfg" wan6_device "$wanif6"
++ }
++ }
++
++ [ -n "$wanip4" ] && [ -n "$wanip6" ] || {
++ echo "Cannot determine local IPv4 and IPv6 addressed for tayga NAT64 $cfg - skipping"
++ return 1
++ }
++
++ local tmpconf="/var/etc/tayga-$cfg.conf"
++ args="-c $tmpconf"
++ mkdir -p /var/etc
++ mkdir -p /var/run/tayga/$cfg
++
++ echo "tun-device $link" >$tmpconf
++ echo "ipv4-addr $ipv4_addr" >>$tmpconf
++ [ -n "$ipv6_addr" ] &&
++ echo "ipv6-addr $ipv6_addr" >>$tmpconf
++ [ -n "$prefix" ] &&
++ echo "prefix $prefix" >>$tmpconf
++
++ tayga_add_static_mappings "$tmpconf"
++
++ [ -n "$dynamic_pool" ] &&
++ echo "dynamic-pool $dynamic_pool" >>$tmpconf
++ echo "data-dir /var/run/tayga/$cfg" >>$tmpconf
++
++ # creating the tunnel below will trigger a net subsystem event
++ # prevent it from touching or iface by disabling .auto here
++ uci_set_state network "$cfg" ifname $link
++ uci_set_state network "$cfg" auto 0
++
++ # here we create TUN device and check configuration
++ tayga $args --mktun || return 1
++
++ ip link set "$link" up
++
++ ip addr add "$wanip4" dev "$link"
++ ip addr add "$wanip6" dev "$link"
++
++ [ -n "$dynamic_pool" ] &&
++ ip -4 route add "$dynamic_pool" dev "$link"
++ [ -n "$prefix" ] &&
++ ip -6 route add "$prefix" dev "$link"
++
++ start-stop-daemon -S -x tayga -- $args -p /var/run/$link.pid
++
++ env -i ACTION="ifup" DEVICE="$link" INTERFACE="$cfg" PROTO="tayga" \
++ /sbin/hotplug-call iface
++}
++
++stop_interface_tayga() {
++ local cfg="$1"
++ local link="tayga-$cfg"
++
++ env -i ACTION="ifdown" DEVICE="$link" INTERFACE="$cfg" PROTO="tayga" \
++ /sbin/hotplug-call iface
++
++ service_kill tayga "/var/run/$link.pid"
++
++ ip link set "$link" down
++ ip addr flush dev "$link"
++ ip route flush dev "$link"
++}
+diff --git a/feeds/packages/ipv6/tayga/patches/001-configure_unset_CFLAGS.patch b/feeds/packages/ipv6/tayga/patches/001-configure_unset_CFLAGS.patch
+new file mode 100644
+index 0000000..c56b5f2
+--- /dev/null
++++ b/feeds/packages/ipv6/tayga/patches/001-configure_unset_CFLAGS.patch
+@@ -0,0 +1,11 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -5,8 +5,6 @@ AC_CONFIG_HEADERS(config.h)
++
++ AC_PROG_CC
++
++-CFLAGS='-g -Wall'
++-
++ tayga_conf_path=${sysconfdir}/tayga.conf
++
++ AC_SUBST(tayga_conf_path)
+diff --git a/feeds/packages/ipv6/tayga/patches/002-bigendian_wrong_checksum.patch b/feeds/packages/ipv6/tayga/patches/002-bigendian_wrong_checksum.patch
+new file mode 100644
+index 0000000..d8deac3
+--- /dev/null
++++ b/feeds/packages/ipv6/tayga/patches/002-bigendian_wrong_checksum.patch
+@@ -0,0 +1,53 @@
++--- a/nat64.c
+++++ b/nat64.c
++@@ -19,6 +19,11 @@
++
++ extern struct config *gcfg;
++
+++static uint16_t checksum_extend_byte(uint8_t b)
+++{
+++ return htons(b << 8);
+++}
+++
++ static uint16_t ip_checksum(void *d, int c)
++ {
++ uint32_t sum = 0xffff;
++@@ -30,7 +35,7 @@ static uint16_t ip_checksum(void *d, int
++ }
++
++ if (c)
++- sum += htons(*((uint8_t *)p) << 8);
+++ sum += checksum_extend_byte(*((uint8_t *)p));
++
++ while (sum > 0xffff)
++ sum = (sum & 0xffff) + (sum >> 16);
++@@ -180,10 +185,12 @@ static int xlate_payload_4to6(struct pkt
++ cksum = ones_add(p->icmp->cksum, cksum);
++ if (p->icmp->type == 8) {
++ p->icmp->type = 128;
++- p->icmp->cksum = ones_add(cksum, ~(128 - 8));
+++ p->icmp->cksum = ones_add(cksum,
+++ ~checksum_extend_byte(128 - 8));
++ } else {
++ p->icmp->type = 129;
++- p->icmp->cksum = ones_add(cksum, ~(129 - 0));
+++ p->icmp->cksum = ones_add(cksum,
+++ ~checksum_extend_byte(129 - 0));
++ }
++ return 0;
++ case 17:
++@@ -668,10 +675,12 @@ static int xlate_payload_6to4(struct pkt
++ cksum = ones_add(p->icmp->cksum, cksum);
++ if (p->icmp->type == 128) {
++ p->icmp->type = 8;
++- p->icmp->cksum = ones_add(cksum, 128 - 8);
+++ p->icmp->cksum = ones_add(cksum,
+++ checksum_extend_byte(128 - 8));
++ } else {
++ p->icmp->type = 0;
++- p->icmp->cksum = ones_add(cksum, 129 - 0);
+++ p->icmp->cksum = ones_add(cksum,
+++ checksum_extend_byte(129 - 0));
++ }
++ return 0;
++ case 17:
+diff --git a/feeds/packages/kernel/exfat-nofuse/Makefile b/feeds/packages/kernel/exfat-nofuse/Makefile
+new file mode 100644
+index 0000000..bae5153
+--- /dev/null
++++ b/feeds/packages/kernel/exfat-nofuse/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2014 Bruno Randolf <br1@einfach.org>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=exfat-nofuse
++PKG_VERSION:=git-20150828
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://github.com/dorimanx/exfat-nofuse.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=0ead00404360b944652335331a2e1a50948f4cb9
++
++PKG_MAINTAINER:=Bruno Randolf <br1@einfach.org>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE
++
++include $(INCLUDE_DIR)/package.mk
++
++define KernelPackage/fs-exfat
++ SUBMENU:=Filesystems
++ TITLE:=ExFAT Kernel driver
++ FILES:=$(PKG_BUILD_DIR)/exfat.ko
++ AUTOLOAD:=$(call AutoLoad,30,exfat,1)
++ DEPENDS:=+kmod-nls-base @BUILD_PATENTED
++endef
++
++define KernelPackage/fs-exfat/description
++ Kernel module for ExFAT Filesytems
++endef
++
++MAKE_OPTS:= \
++ ARCH="$(LINUX_KARCH)" \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ M="$(PKG_BUILD_DIR)"
++
++define Build/Compile
++ $(MAKE) -C "$(LINUX_DIR)" \
++ $(MAKE_OPTS) \
++ CONFIG_EXFAT_FS=m \
++ modules
++endef
++
++$(eval $(call KernelPackage,fs-exfat))
+diff --git a/feeds/packages/lang/dkjson/Makefile b/feeds/packages/lang/dkjson/Makefile
+new file mode 100644
+index 0000000..efb0012
+--- /dev/null
++++ b/feeds/packages/lang/dkjson/Makefile
+@@ -0,0 +1,49 @@
++#
++# Copyright (C) 20013-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dkjson
++PKG_VERSION:=2.5
++PKG_RELEASE:=3
++
++PKG_SOURCE_URL:=https://github.com/LuaDist/dkjson.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=e72ba0c9f5d8b8746fc306f6189a819dbb5cd0be
++PKG_LICENSE:=MIT
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION)
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/dkjson
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=DKJSON
++ URL:=http://dkolf.de/src/dkjson-lua.fsl/home
++ MAINTAINER:=Lars Gierth <larsg@systemli.org>
++ DEPENDS:=+lua
++endef
++
++define Package/dkjson/description
++ Lua JSON parser/serializer with UTF-8 support
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/dkjson/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/dkjson.lua $(1)/usr/lib/lua/
++endef
++
++$(eval $(call BuildPackage,dkjson))
+diff --git a/feeds/packages/lang/erlang/Makefile b/feeds/packages/lang/erlang/Makefile
+new file mode 100644
+index 0000000..47c8b11
+--- /dev/null
++++ b/feeds/packages/lang/erlang/Makefile
+@@ -0,0 +1,338 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=erlang
++PKG_VERSION:=17.5
++PKG_RELEASE:=2
++
++PKG_SOURCE:=otp_src_$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:= http://www.erlang.org/download/ \
++ http://erlang.mirror.su.se/
++PKG_MD5SUM:=346dd0136bf1cc28cebc140e505206bb
++
++PKG_LICENSE:=ErlPL-1.1
++PKG_LICENSE_FILES:=EPLICENCE
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_BUILD_DEPENDS:=erlang/host openssl
++
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/otp_src_$(PKG_VERSION)
++PKG_BUILD_DIR:=$(BUILD_DIR)/otp_src_$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/erlang/Default
++ SUBMENU:=Erlang
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Erlang/OTP programming language
++ URL:=http://www.erlang.org/
++endef
++
++define Package/erlang/Default/description
++ Erlang/OTP is a general-purpose programming language and runtime
++ environment. Erlang has built-in support for concurrency, distribution
++ and fault tolerance.
++endef
++
++define Package/erlang
++$(call Package/erlang/Default)
++ DEPENDS+= +libncurses +librt +zlib
++ PROVIDES:= erlang-erts=6.4 erlang-kernel=3.2 erlang-sasl=2.4.1 erlang-stdlib=2.4
++endef
++
++define Package/erlang/description
++$(call Package/erlang/Default/description)
++ .
++ This package contains the runtime implementation and a minimal set of
++ modules (erts, kernel, sasl & stdlib).
++endef
++
++
++define Package/erlang-asn1
++$(call Package/erlang/Default)
++ TITLE:=Abstract Syntax Notation One (ASN.1) support
++ VERSION:=3.0.4
++ DEPENDS+= +erlang +erlang-syntax-tools
++endef
++
++define Package/erlang-asn1/description
++$(call Package/erlang/Default/description)
++ .
++ This Erlang/OTP package provides Abstract Syntax Notation One (ASN.1)
++ support.
++endef
++
++
++define Package/erlang-compiler
++$(call Package/erlang/Default)
++ TITLE:=Byte code compiler
++ VERSION:=5.0.4
++ DEPENDS+= +erlang +erlang-hipe
++endef
++
++define Package/erlang-compiler/description
++$(call Package/erlang/Default/description)
++ .
++ This Erlang/OTP package provides a byte code compiler for Erlang which
++ produces highly compact code.
++endef
++
++
++define Package/erlang-crypto
++$(call Package/erlang/Default)
++ TITLE:=Cryptography support
++ VERSION:=3.5
++ DEPENDS+= +erlang +libopenssl
++endef
++
++define Package/erlang-crypto/description
++$(call Package/erlang/Default/description)
++ .
++ This Erlang/OTP package provides functions for computation of message
++ digests, and encryption and decryption functions.
++endef
++
++
++define Package/erlang-hipe
++$(call Package/erlang/Default)
++ TITLE:=High Performance Erlang
++ VERSION:=3.11.3
++ DEPENDS+= +erlang
++endef
++
++define Package/erlang-hipe/description
++$(call Package/erlang/Default/description)
++ .
++ This Erlang/OTP package provides HiPE (High Performance Erlang)
++ support.
++endef
++
++
++define Package/erlang-inets
++$(call Package/erlang/Default)
++ TITLE:=Internet clients and servers
++ VERSION:=5.10.6
++ DEPENDS+= +erlang
++endef
++
++define Package/erlang-inets/description
++$(call Package/erlang/Default/description)
++ .
++ This Erlang/OTP package provides a container for Internet clients and
++ servers. Currently a FTP client, a HTTP client and server, and a tftp
++ client and server have been incorporated in Inets.
++endef
++
++
++define Package/erlang-mnesia
++$(call Package/erlang/Default)
++ TITLE:=Distributed database
++ VERSION:=4.12.5
++ DEPENDS+= +erlang
++endef
++
++define Package/erlang-mnesia/description
++$(call Package/erlang/Default/description)
++ .
++ This Erlang/OTP package provides a distributed DataBase Management
++ System (DBMS), appropriate for telecommunications applications and
++ other Erlang applications which require continuous operation and
++ exhibit soft real-time properties.
++endef
++
++
++define Package/erlang-runtime-tools
++$(call Package/erlang/Default)
++ TITLE:=Low-profile debugging/tracing tools
++ VERSION:=1.8.16
++ DEPENDS+= +erlang
++endef
++
++define Package/erlang-runtime-tools/description
++$(call Package/erlang/Default/description)
++ .
++ This Erlang/OTP package provides low footprint tracing/debugging tools
++ suitable for inclusion in a production system.
++endef
++
++
++define Package/erlang-snmp
++$(call Package/erlang/Default)
++ TITLE:=Simple Network Management Protocol (SNMP) support
++ VERSION:=5.1.1
++ DEPENDS+= +erlang +erlang-asn1
++endef
++
++define Package/erlang-snmp/description
++$(call Package/erlang/Default/description)
++ .
++ This Erlang/OTP package provides Simple Network Management Protocol
++ (SNMP) support including a MIB compiler and tools for creating SNMP
++ agents.
++endef
++
++
++define Package/erlang-ssh
++$(call Package/erlang/Default)
++ TITLE:=Secure Shell (SSH) support
++ VERSION:=3.2
++ DEPENDS+= +erlang +erlang-crypto
++endef
++
++define Package/erlang-ssh/description
++$(call Package/erlang/Default/description)
++ .
++ This Erlang/OTP package provides an implementation of the Secure Shell
++ protocol, with SSH & SFTP support.
++endef
++
++
++define Package/erlang-ssl
++$(call Package/erlang/Default)
++ TITLE:=Secure Sockets Layer (SSL) support
++ VERSION:=6.0
++ DEPENDS+= +erlang +erlang-crypto
++endef
++
++define Package/erlang-ssl/description
++$(call Package/erlang/Default/description)
++ .
++ This Erlang/OTP package provides support for secure communication over
++ sockets.
++endef
++
++
++define Package/erlang-syntax-tools
++$(call Package/erlang/Default)
++ TITLE:=Abstract Erlang syntax trees handling support
++ VERSION:=1.6.18
++ DEPENDS+= +erlang
++endef
++
++define Package/erlang-syntax-tools/description
++$(call Package/erlang/Default/description)
++ .
++ This Erlang/OTP package provides support for handling abstract Erlang
++ syntax trees.
++endef
++
++
++# Host
++
++HOST_CONFIGURE_ARGS += \
++ --disable-hipe \
++ --disable-smp-support \
++ --without-javac
++
++HOST_CFLAGS += -D_GNU_SOURCE
++
++define Host/Compile
++ $(MAKE) -C $(HOST_BUILD_DIR) all
++endef
++
++define Host/Install
++ $(MAKE) -C $(HOST_BUILD_DIR) install
++endef
++
++
++# Target
++
++CONFIGURE_ARGS += \
++ --disable-hipe \
++ --disable-smp-support \
++ --without-javac \
++ --enable-dynamic-ssl-lib
++
++CONFIGURE_VARS += \
++ SHLIB_LD="$(TARGET_CC)" \
++ TARGET_ARCH="$(TARGET_ARCH)" \
++ ac_cv_func_mmap_fixed_mapped=yes \
++ ac_cv_path_WX_CONFIG_PATH=no \
++ erl_xcomp_getaddrinfo=no \
++ erl_xcomp_sysroot="$(STAGING_DIR)"
++
++EXTRA_CFLAGS+=-D_GNU_SOURCE
++EXTRA_LDFLAGS+=-lz
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ noboot
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
++ install
++endef
++
++define Package/erlang/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ for f in epmd erl erlc escript run_erl; do \
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/$$$$f $(1)/usr/bin/ ; \
++ done
++ $(INSTALL_DIR) $(1)/usr/lib/erlang/bin
++ for f in erl erlc escript run_erl start start.boot start.script start_clean.boot start_erl start_sasl.boot to_erl; do \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/erlang/bin/$$$$f $(1)/usr/lib/erlang/bin/ ; \
++ done
++ $(INSTALL_DIR) $(1)/usr/lib/erlang/lib
++ for m in erts kernel sasl stdlib; do \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/erlang/lib/$$$$m-* $(1)/usr/lib/erlang/lib/ ; \
++ rm -rf $(1)/usr/lib/erlang/lib/$$$$m-*/examples ; \
++ rm -rf $(1)/usr/lib/erlang/lib/$$$$m-*/src ; \
++ done
++ $(INSTALL_DIR) $(1)/usr/lib/erlang
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/erlang/erts-* $(1)/usr/lib/erlang/
++ rm -rf $(1)/usr/lib/erlang/erts-*/{doc,include,lib,man,src}
++ rm -rf $(1)/usr/lib/erlang/erts-*/bin/*.src
++ $(INSTALL_DIR) $(1)/usr/lib/erlang/releases
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/erlang/releases/* $(1)/usr/lib/erlang/releases/
++ $(SED) 's,%ERL_ROOT%,/usr/lib/erlang,g' \
++ $(1)/usr/lib/erlang/releases/RELEASES.src
++ mv -f $(1)/usr/lib/erlang/releases/RELEASES.src \
++ $(1)/usr/lib/erlang/releases/RELEASES
++ for f in bin/erl bin/start erts-*/bin/erl erts-*/bin/start; do \
++ $(SED) 's,^\(ROOTDIR\)=.*,\1=/usr/lib/erlang,g' \
++ $(1)/usr/lib/erlang/$$$$f ; \
++ done
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/lib/erl_interface/obj/*/*.a $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_BUILD_DIR)/lib/erl_interface/include/*.h $(1)/usr/include/
++endef
++
++define BuildModule
++
++ define Package/erlang-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/erlang/lib
++ for m in $(2); do \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/erlang/lib/$$$$$$$$m-* $$(1)/usr/lib/erlang/lib/ ; \
++ rm -rf $$(1)/usr/lib/erlang/lib/$$$$$$$$m-*/{examples,priv/obj,src} ; \
++ done
++ endef
++
++ $$(eval $$(call BuildPackage,erlang-$(1)))
++
++endef
++
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,erlang))
++$(eval $(call BuildModule,asn1,asn1))
++$(eval $(call BuildModule,compiler,compiler))
++$(eval $(call BuildModule,crypto,crypto))
++$(eval $(call BuildModule,hipe,hipe))
++$(eval $(call BuildModule,inets,inets))
++$(eval $(call BuildModule,mnesia,mnesia))
++$(eval $(call BuildModule,runtime-tools,runtime_tools))
++$(eval $(call BuildModule,snmp,snmp))
++$(eval $(call BuildModule,ssh,ssh))
++$(eval $(call BuildModule,ssl,ssl))
++$(eval $(call BuildModule,syntax-tools,syntax_tools))
+diff --git a/feeds/packages/lang/erlang/patches/101-emulator_includes.patch b/feeds/packages/lang/erlang/patches/101-emulator_includes.patch
+new file mode 100644
+index 0000000..5a413af
+--- /dev/null
++++ b/feeds/packages/lang/erlang/patches/101-emulator_includes.patch
+@@ -0,0 +1,11 @@
++--- a/erts/emulator/Makefile.in
+++++ b/erts/emulator/Makefile.in
++@@ -682,7 +682,7 @@ $(OBJDIR)/beam_emu.o: beam/beam_emu.c
++ endif
++
++ $(OBJDIR)/%.o: beam/%.c
++- $(V_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
+++ $(V_CC) $(INCLUDES) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) -c $< -o $@
++
++ $(OBJDIR)/%.o: $(TARGET)/%.c
++ $(V_CC) $(CFLAGS) $(INCLUDES) -Idrivers/common -c $< -o $@
+diff --git a/feeds/packages/lang/erlang/patches/102-musl_compat.patch b/feeds/packages/lang/erlang/patches/102-musl_compat.patch
+new file mode 100644
+index 0000000..d23900e
+--- /dev/null
++++ b/feeds/packages/lang/erlang/patches/102-musl_compat.patch
+@@ -0,0 +1,11 @@
++--- a/lib/erl_interface/src/connect/ei_resolve.c
+++++ b/lib/erl_interface/src/connect/ei_resolve.c
++@@ -642,7 +642,7 @@ struct hostent *ei_gethostbyname_r(const
++ #ifndef HAVE_GETHOSTBYNAME_R
++ return my_gethostbyname_r(name,hostp,buffer,buflen,h_errnop);
++ #else
++-#if (defined(__GLIBC__) || (__FreeBSD_version >= 602000) || defined(__DragonFly__) || defined(__ANDROID__))
+++#if (defined(_GNU_SOURCE) || (__FreeBSD_version >= 602000) || defined(__DragonFly__) || defined(__ANDROID__))
++ struct hostent *result;
++
++ gethostbyname_r(name, hostp, buffer, buflen, &result, h_errnop);
+diff --git a/feeds/packages/lang/erlang/patches/103-disable_emacs.patch b/feeds/packages/lang/erlang/patches/103-disable_emacs.patch
+new file mode 100644
+index 0000000..9412195
+--- /dev/null
++++ b/feeds/packages/lang/erlang/patches/103-disable_emacs.patch
+@@ -0,0 +1,11 @@
++--- a/lib/tools/Makefile
+++++ b/lib/tools/Makefile
++@@ -23,7 +23,7 @@ include $(ERL_TOP)/make/$(TARGET)/otp.mk
++ # Macros
++ # ----------------------------------------------------
++
++-SUB_DIRECTORIES = c_src src doc/src examples priv emacs
+++SUB_DIRECTORIES = c_src src doc/src examples priv
++
++ include vsn.mk
++ VSN = $(TOOLS_VSN)
+diff --git a/feeds/packages/lang/jamvm/Makefile b/feeds/packages/lang/jamvm/Makefile
+new file mode 100644
+index 0000000..996dfa0
+--- /dev/null
++++ b/feeds/packages/lang/jamvm/Makefile
+@@ -0,0 +1,67 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=jamvm
++PKG_VERSION:=2.0.0
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0+
++PKG_MAINTAINER:=Dana H. Myers <k6jq@comcast.net>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/$(PKG_NAME)
++PKG_MD5SUM:=a6e3321ef4b3cfb4afc20bd75452e11e
++
++PKG_USE_MIPS16:=0
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/jamvm
++ SUBMENU:=Java
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=A compact Java Virtual Machine
++ URL:=http://sourceforge.net/projects/jamvm
++ DEPENDS:=+zlib +libpthread +librt +classpath @!avr32
++endef
++
++define Package/jamvm/description
++ JamVM is a new Java Virtual Machine which conforms to the JVM
++ specification version (blue book). In comparison to most other VM's (free
++ and commercial) it is extremely small.However, unlike other small VMs
++ (e.g. KVM) it is designed to support the full specification, and includes
++ support for object finalisation, Soft/Weak/Phantom References, the Java
++ Native Interface (JNI) and the Reflection API.
++endef
++
++CONFIGURE_ARGS += \
++ --with-java-runtime-library=gnuclasspath \
++ --with-classpath-install-dir=/usr \
++ --disable-int-inlining \
++ --disable-shared \
++ --without-pic
++
++MAKE_FLAGS += \
++ GLIBJ_ZIP=$(STAGING_DIR)/usr/share/classpath/glibj.zip
++
++define Package/jamvm/install
++ $(INSTALL_DIR) $(1)/usr
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/bin \
++ $(PKG_INSTALL_DIR)/usr/share \
++ $(1)/usr/
++endef
++
++define Build/InstallDev
++ $(CP) $(PKG_INSTALL_DIR)/* $(1)/
++endef
++
++$(eval $(call BuildPackage,jamvm))
+diff --git a/feeds/packages/lang/json4lua/Makefile b/feeds/packages/lang/json4lua/Makefile
+new file mode 100644
+index 0000000..0e0c9c5
+--- /dev/null
++++ b/feeds/packages/lang/json4lua/Makefile
+@@ -0,0 +1,52 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=json4lua
++PKG_VERSION:=0.9.53
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://github.com/amrhassan/json4lua.git
++PKG_SOURCE_VERSION:=$(PKG_VERSION)
++
++PKG_MAINTAINER:=Amr Hassan <amr.hassan@gmail.com>
++PKG_LICENSE=MIT
++
++LUA_MODULE_PATH:=/usr/lib/lua
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/json4lua
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=json4lua
++ URL:=https://github.com/amrhassan/json4lua
++ DEPENDS:=+lua +luasocket
++endef
++
++define Package/json4lua/description
++ JSON and JSONRPC for Lua
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/json4lua/install
++ $(INSTALL_DIR) $(1)/$(LUA_MODULE_PATH)/json
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/json/json.lua $(1)/$(LUA_MODULE_PATH)/json.lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/json/rpc.lua $(1)/$(LUA_MODULE_PATH)/json/rpc.lua
++endef
++
++$(eval $(call BuildPackage,json4lua))
+diff --git a/feeds/packages/lang/lpeg/Makefile b/feeds/packages/lang/lpeg/Makefile
+new file mode 100644
+index 0000000..ee8a4ef
+--- /dev/null
++++ b/feeds/packages/lang/lpeg/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lpeg
++PKG_VERSION:=0.12.2
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.inf.puc-rio.br/~roberto/lpeg/
++PKG_MD5SUM:=fabb614eb46e370d4f6b8fd82d17ca7e
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lpeg
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=LPeg
++ URL:=http://www.inf.puc-rio.br/~roberto/lpeg/
++ DEPENDS:=+lua
++endef
++
++define Package/lpeg/description
++ LPeg is a new pattern-matching library for Lua, based on Parsing Expression Grammars (PEGs)
++endef
++
++define Build/Configure
++endef
++
++# add make variable overrides here
++MAKE_FLAGS +=
++
++define Package/lpeg/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lpeg.so $(1)/usr/lib/lua
++endef
++
++$(eval $(call BuildPackage,lpeg))
+diff --git a/feeds/packages/lang/lua-bencode/Makefile b/feeds/packages/lang/lua-bencode/Makefile
+new file mode 100644
+index 0000000..0b32056
+--- /dev/null
++++ b/feeds/packages/lang/lua-bencode/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 20013-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-bencode
++PKG_VERSION:=2.1.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://bitbucket.org/wilhelmy/lua-bencode
++PKG_SOURCE_PROTO:=hg
++PKG_SOURCE_VERSION:=500243383cb6acbddd3cf12aee6e4667aab53324
++PKG_LICENSE:=MIT
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lua-bencode
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=lua-bencode
++ URL:=https://bitbucket.org/wilhelmy/lua-bencode
++ MAINTAINER:=Lars Gierth <larsg@systemli.org>
++ DEPENDS:=+lua
++endef
++
++define Package/lua-bencode/description
++ This is a module for the lua programming language for decoding and encoding
++ bencoded data which can be used to read and write torrent files for bittorrent.
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++
++define Package/lua-bencode/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/bencode.lua $(1)/usr/lib/lua
++endef
++
++$(eval $(call BuildPackage,lua-bencode))
+diff --git a/feeds/packages/lang/lua-cjson/Makefile b/feeds/packages/lang/lua-cjson/Makefile
+new file mode 100644
+index 0000000..fbdcf17
+--- /dev/null
++++ b/feeds/packages/lang/lua-cjson/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-cjson
++PKG_VERSION:=2.1.0
++PKG_RELEASE:=2
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.kyne.com.au/~mark/software/download/
++PKG_MD5SUM:=24f270663e9f6ca8ba2a02cef19f7963
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/lua-cjson
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua CJSON parser
++ URL:=https://github.com/mpx/lua-cjson
++ DEPENDS:= +lua
++endef
++
++define Package/lua-cjson/description
++ Lua CJSON is a fast JSON encoding/parsing module for Lua.
++endef
++
++CMAKE_OPTIONS += \
++ -DUSE_LUA=ON
++
++define Package/lua-cjson/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/cjson.so $(1)/usr/lib/lua/
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/cjson
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/lua/cjson/util.lua $(1)/usr/lib/lua/cjson
++endef
++
++$(eval $(call BuildPackage,lua-cjson))
+diff --git a/feeds/packages/lang/lua-copas/Makefile b/feeds/packages/lang/lua-copas/Makefile
+new file mode 100644
+index 0000000..4f073e2
+--- /dev/null
++++ b/feeds/packages/lang/lua-copas/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2009-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-copas
++PKG_VERSION:=2.0.0
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/keplerproject/copas.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=f39a80add9f7c010ac979297652bbaaea0360a27
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lua-copas
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua-Copas
++ URL:=https://github.com/keplerproject/copas
++ DEPENDS:=+lua
++endef
++
++define Package/lua-copas/description
++ Copas is a dispatcher based on coroutines that can be used by TCP/IP servers.
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ T="$(BUILD_VARIANT)" \
++ PREFIX="$(PKG_INSTALL_DIR)/usr" \
++ install
++endef
++
++# add make variable overrides here
++MAKE_FLAGS +=
++
++define Package/lua-copas/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_DIR) $(1)/usr/lib/lua/copas
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/copas.lua $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/copas/ftp.lua $(1)/usr/lib/lua/copas
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/copas/smtp.lua $(1)/usr/lib/lua/copas
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/copas/http.lua $(1)/usr/lib/lua/copas
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/copas/limit.lua $(1)/usr/lib/lua/copas
++endef
++
++$(eval $(call BuildPackage,lua-copas))
+diff --git a/feeds/packages/lang/lua-copas/patches/makefile.patch b/feeds/packages/lang/lua-copas/patches/makefile.patch
+new file mode 100644
+index 0000000..10e4734
+--- /dev/null
++++ b/feeds/packages/lang/lua-copas/patches/makefile.patch
+@@ -0,0 +1,15 @@
++--- lua-copas-1.2.1_org/Makefile 2014-06-04 16:39:17.451563827 +0800
+++++ lua-copas-1.2.1/Makefile 2014-06-04 16:39:41.115563309 +0800
++@@ -1,10 +1,10 @@
++ # $Id: Makefile,v 1.3 2007/10/29 22:50:16 carregal Exp $
++
++ # Default prefix
++-PREFIX = /usr/local
+++PREFIX ?= $(DESTDIR)/usr
++
++ # System's lua directory (where Lua libraries are installed)
++-LUA_DIR= $(PREFIX)/share/lua/5.1
+++LUA_DIR= $(PREFIX)/lib/lua
++
++ install:
++ mkdir -p $(LUA_DIR)/copas
+diff --git a/feeds/packages/lang/lua-coxpcall/Makefile b/feeds/packages/lang/lua-coxpcall/Makefile
+new file mode 100644
+index 0000000..6ca3ff8
+--- /dev/null
++++ b/feeds/packages/lang/lua-coxpcall/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2009-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-coxpcall
++PKG_VERSION:=1.15.0
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/keplerproject/coxpcall.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=979257892884816c97391dfd7b0a7b30dcc8f479
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lua-coxpcall
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua-Coxpcall
++ URL:=https://github.com/keplerproject/coxpcall
++ DEPENDS:=+lua
++endef
++
++define Package/lua-coxpcall/description
++ Coxpcall encapsulates the protected calls with a coroutine based loop,
++ so errors can be dealed without the usual pcall/xpcall issues with coroutines.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++# add make variable overrides here
++MAKE_FLAGS +=
++
++define Build/Configure
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ T="$(BUILD_VARIANT)" \
++ LUA_DIR="$(PKG_INSTALL_DIR)/usr/lib/lua" \
++ install
++endef
++
++define Package/lua-coxpcall/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/coxpcall.lua $(1)/usr/lib/lua
++endef
++
++$(eval $(call BuildPackage,lua-coxpcall))
+diff --git a/feeds/packages/lang/lua-coxpcall/patches/config.patch b/feeds/packages/lang/lua-coxpcall/patches/config.patch
+new file mode 100644
+index 0000000..2a1dbfd
+--- /dev/null
++++ b/feeds/packages/lang/lua-coxpcall/patches/config.patch
+@@ -0,0 +1,4 @@
++--- lua-coxpcall-1.15.0_org/config 1970-01-01 08:00:00.000000000 +0800
+++++ lua-coxpcall-1.15.0/config 2014-06-04 16:51:55.487547258 +0800
++@@ -0,0 +1 @@
+++LUA_DIR ?=$(DESTDIR)/usr/lib/lua
+diff --git a/feeds/packages/lang/lua-lzlib/Makefile b/feeds/packages/lang/lua-lzlib/Makefile
+new file mode 100644
+index 0000000..e4094f5
+--- /dev/null
++++ b/feeds/packages/lang/lua-lzlib/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-lzlib
++PKG_VERSION:=0.4.3
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/LuaDist/lzlib.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=79329a07d8f79c19eadd7ea2752b4c4e1574b015
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lua-lzlib
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua zlib binding
++ URL:=http://github.com/LuaDist/lzlib
++ DEPENDS:= +lua +zlib
++endef
++
++define Package/lua-lzlib/description
++ A library to access zlib library functions and also to read/write gzip files using an interface similar to the base io package.
++endef
++
++MAKE_FLAGS += \
++ LUA="$(STAGING_DIR)/usr" \
++ OFLAGS="$(TARGET_CFLAGS)" \
++
++define Package/lua-lzlib/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/zlib.so $(1)/usr/lib/lua/
++
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/gzip.lua $(1)/usr/lib/lua/
++endef
++
++$(eval $(call BuildPackage,lua-lzlib))
+diff --git a/feeds/packages/lang/lua-lzlib/patches/001-allow_optim_flags.patch b/feeds/packages/lang/lua-lzlib/patches/001-allow_optim_flags.patch
+new file mode 100644
+index 0000000..78f981d
+--- /dev/null
++++ b/feeds/packages/lang/lua-lzlib/patches/001-allow_optim_flags.patch
+@@ -0,0 +1,12 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -14,7 +14,8 @@ LUABIN= $(LUA)/bin
++ ZLIB=../zlib-1.2.3
++
++ # no need to change anything below here
++-CFLAGS= $(INCS) $(DEFS) $(WARN) -O0 -fPIC
+++CFLAGS= $(INCS) $(DEFS) $(WARN) $(OFLAGS) -fPIC
+++OFLAGS= -O0
++ WARN= -g -Werror -Wall -pedantic #-ansi
++ INCS= -I$(LUAINC) -I$(ZLIB)
++ LIBS= -L$(ZLIB) -lz -L$(LUALIB) -L$(LUABIN) #-llua51
+diff --git a/feeds/packages/lang/lua-md5/Makefile b/feeds/packages/lang/lua-md5/Makefile
+new file mode 100644
+index 0000000..36e0d9d
+--- /dev/null
++++ b/feeds/packages/lang/lua-md5/Makefile
+@@ -0,0 +1,75 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-md5
++PKG_VERSION:=1.2
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/keplerproject/md5.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=024b65738b4434860777fc43d7cacaefea29ec60
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lua-md5
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua-MD5
++ URL:=https://github.com/keplerproject/md5
++ DEPENDS:=+lua
++endef
++
++define Package/lua-md5/description
++ MD5 offers basic cryptographic facilities for Lua
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++# add make variable overrides here
++MAKE_FLAGS +=
++
++define Build/Configure
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ PREFIX="$(STAGING_DIR)/usr" \
++ LUA_LIBDIR="$(STAGING_DIR)/usr/lib/lua" \
++ clean
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ PREFIX="$(STAGING_DIR)/usr" \
++ LUA_LIBDIR="$(STAGING_DIR)/usr/lib/lua" \
++ LIB_OPTION="-shared" \
++ CC="$(TARGET_CROSS)gcc" \
++ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
++ all
++endef
++
++define Build/Install
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ LUA_LIBDIR="$(PKG_INSTALL_DIR)/usr/lib/lua" \
++ LUA_DIR="$(PKG_INSTALL_DIR)/usr/lib/lua" \
++ install
++endef
++
++define Package/lua-md5/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/md5.lua $(1)/usr/lib/lua
++ $(INSTALL_DIR) $(1)/usr/lib/lua/md5
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/core.so $(1)/usr/lib/lua/md5/core.so
++endef
++
++$(eval $(call BuildPackage,lua-md5))
+diff --git a/feeds/packages/lang/lua-md5/patches/config.patch b/feeds/packages/lang/lua-md5/patches/config.patch
+new file mode 100644
+index 0000000..abea3a8
+--- /dev/null
++++ b/feeds/packages/lang/lua-md5/patches/config.patch
+@@ -0,0 +1,19 @@
++--- lua-md5-1.2/config 2014-06-04 16:55:50.000000000 +0800
+++++ lua-md5-1.2_new/config 2014-06-04 16:57:54.223539416 +0800
++@@ -1,13 +1,13 @@
++ # Installation directories
++
++ # Default prefix
++-PREFIX = /usr/local
+++PREFIX = /usr
++
++ # System's libraries directory (where binary libraries are installed)
++-LUA_LIBDIR= $(PREFIX)/lib/lua/5.1
+++LUA_LIBDIR= $(PREFIX)/lib/lua
++
++ # System's lua directory (where Lua libraries are installed)
++-LUA_DIR= $(PREFIX)/share/lua/5.1
+++LUA_DIR= $(PREFIX)/lib/lua
++
++ # Lua includes directory
++ LUA_INC= $(PREFIX)/include
+diff --git a/feeds/packages/lang/lua-md5/patches/makefile.patch b/feeds/packages/lang/lua-md5/patches/makefile.patch
+new file mode 100644
+index 0000000..89a2e33
+--- /dev/null
++++ b/feeds/packages/lang/lua-md5/patches/makefile.patch
+@@ -0,0 +1,10 @@
++--- a/Makefile.orig 2014-06-04 17:16:40.083514808 +0800
+++++ b/Makefile 2014-06-04 17:17:27.111513780 +0800
++@@ -1,6 +1,6 @@
++ # $Id: Makefile,v 1.7 2007/10/11 00:02:56 carregal Exp $
++
++-CONFIG= ./config
+++CFLAGS+= -fPIC
++
++ include $(CONFIG)
++
+diff --git a/feeds/packages/lang/lua-mobdebug/Makefile b/feeds/packages/lang/lua-mobdebug/Makefile
+new file mode 100644
+index 0000000..3d11539
+--- /dev/null
++++ b/feeds/packages/lang/lua-mobdebug/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-mobdebug
++PKG_VERSION:=0.61
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/pkulchenko/MobDebug.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=9a03aa59696647ba3b7f9ae2f29a9f28532a4feb
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lua-mobdebug
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua-MobDebug
++ URL:=https://github.com/pkulchenko/MobDebug
++ DEPENDS:=+lua
++endef
++
++define Package/lua-mobdebug/description
++ MobDebug is a remote debugger for Lua (including Lua 5.1, Lua 5.2, Lua 5.3, and LuaJIT 2.x).
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Build/Install
++endef
++
++# add make variable overrides here
++MAKE_FLAGS +=
++
++define Package/lua-mobdebug/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/mobdebug.lua $(1)/usr/lib/lua
++endef
++
++$(eval $(call BuildPackage,lua-mobdebug))
+diff --git a/feeds/packages/lang/lua-mosquitto/Makefile b/feeds/packages/lang/lua-mosquitto/Makefile
+new file mode 100644
+index 0000000..680df4b
+--- /dev/null
++++ b/feeds/packages/lang/lua-mosquitto/Makefile
+@@ -0,0 +1,42 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-mosquitto
++PKG_VERSION:=0.1
++PKG_RELEASE:=1
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://github.com/flukso/lua-mosquitto.git
++PKG_SOURCE_VERSION:=v$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/$(PKG_NAME)
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua-mosquitto
++ DEPENDS:=+libmosquitto +lua
++ MAINTAINER:=Karl Palsson <karlp@remake.is>
++endef
++
++define Package/$(PKG_NAME)/description
++ Lua bindings to libmosquitto
++endef
++
++define Package/$(PKG_NAME)/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/mosquitto.so $(1)/usr/lib/lua
++endef
++
++$(eval $(call BuildPackage,$(PKG_NAME)))
+diff --git a/feeds/packages/lang/lua-penlight/Makefile b/feeds/packages/lang/lua-penlight/Makefile
+new file mode 100644
+index 0000000..89192e2
+--- /dev/null
++++ b/feeds/packages/lang/lua-penlight/Makefile
+@@ -0,0 +1,46 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-penlight
++PKG_VERSION:=1.3.2
++PKG_RELEASE:=1
++PKG_BUILD_DIR:=$(BUILD_DIR)/Penlight-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/stevedonovan/Penlight/archive/
++PKG_MD5SUM:=0315a39834bb6fab07741ec04ede1bf4
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILE:=LICENSE.md
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/$(PKG_NAME)
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Penlight
++ URL:=http://stevedonovan.github.io/Penlight/api/manual/01-introduction.md.html
++ DEPENDS:=+luafilesystem
++ MAINTAINER:= Karl Palsson <karlp@remake.is>
++endef
++
++define Package/$(PKG_NAME)/description
++ It is often said of Lua that it does not include batteries.
++ Penlight is the batteries.
++endef
++
++define Build/Compile
++ echo "Nothing to compile, pure lua package"
++endef
++
++define Package/$(PKG_NAME)/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(CP) $(PKG_BUILD_DIR)/lua/pl $(1)/usr/lib/lua
++endef
++
++$(eval $(call BuildPackage,$(PKG_NAME)))
+diff --git a/feeds/packages/lang/lua-rings/Makefile b/feeds/packages/lang/lua-rings/Makefile
+new file mode 100644
+index 0000000..9b39c96
+--- /dev/null
++++ b/feeds/packages/lang/lua-rings/Makefile
+@@ -0,0 +1,54 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-rings
++PKG_VERSION:=1.3.0
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/keplerproject/rings.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=2b8a900f8b9dbde304859a3ac9d437795c3fdde3
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_FIXUP:=autoreconf
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lua-rings
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua-Rings
++ URL:=http://www.inf.puc-rio.br/~roberto/lua-rings/
++ DEPENDS:=+lua
++endef
++
++define Package/lua-rings/description
++ Rings is a library which provides a way to create new Lua states from within Lua.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++# add make variable overrides here
++MAKE_FLAGS +=
++
++define Build/Configure
++endef
++
++define Package/lua-rings/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/rings.so $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/stable.lua $(1)/usr/lib/lua
++endef
++
++$(eval $(call BuildPackage,lua-rings))
+diff --git a/feeds/packages/lang/lua-rings/patches/config.patch b/feeds/packages/lang/lua-rings/patches/config.patch
+new file mode 100644
+index 0000000..5740fae
+--- /dev/null
++++ b/feeds/packages/lang/lua-rings/patches/config.patch
+@@ -0,0 +1,28 @@
++--- lua-rings-1.3.0_org/config 2014-06-04 15:24:24.223662038 +0800
+++++ lua-rings-1.3.0/config 2014-06-04 16:16:15.183594040 +0800
++@@ -1,15 +1,15 @@
++ # Installation directories
++
++ # Default prefix
++-PREFIX ?= /usr/local
+++PREFIX ?= /usr
++
++ DESTDIR ?= /
++
++ # System's libraries directory (where binary libraries are installed)
++-LUA_LIBDIR ?= $(PREFIX)/lib/lua/5.1
+++LUA_LIBDIR ?= $(PREFIX)/lib/lua
++
++ # System's lua directory (where Lua libraries are installed)
++-LUA_DIR ?= $(PREFIX)/share/lua/5.1
+++LUA_DIR ?= $(PREFIX)/lib/lua
++
++ # Lua includes directory
++ LUA_INC ?= $(PREFIX)/include
++@@ -24,6 +24,5 @@
++ WARN ?= -O2 -Wall -fPIC -W -Waggregate-return -Wcast-align -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings -Wpointer-arith -pedantic
++ INCS ?= -I$(LUA_INC)
++ CFLAGS ?= $(WARN) $(INCS)
++-CC ?= gcc
++
++ # $Id: config,v 1.7 2007/10/29 22:51:39 carregal Exp $
+diff --git a/feeds/packages/lang/lua-rings/patches/makefile.patch b/feeds/packages/lang/lua-rings/patches/makefile.patch
+new file mode 100644
+index 0000000..8bb0551
+--- /dev/null
++++ b/feeds/packages/lang/lua-rings/patches/makefile.patch
+@@ -0,0 +1,11 @@
++--- lua-rings-1.3.0_org/Makefile 2014-06-04 15:24:37.583661746 +0800
+++++ lua-rings-1.3.0/Makefile 2014-06-04 15:23:41.611662970 +0800
++@@ -3,6 +3,8 @@
++ T= rings
++ CONFIG= ./config
++
+++CFLAGS+= -fPIC
+++
++ include $(CONFIG)
++
++ SRCS= src/rings.c
+diff --git a/feeds/packages/lang/lua-rs232/Makefile b/feeds/packages/lang/lua-rs232/Makefile
+new file mode 100644
+index 0000000..7ef5ac7
+--- /dev/null
++++ b/feeds/packages/lang/lua-rs232/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-rs232
++PKG_VERSION:=1.0.3
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/srdgame/librs232.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=a9d463181e7f7034fe6a55bc38e845fb04fa93ba
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lua-rs232
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua Serial Library
++ URL:=https://github.com/srdgame/librs232
++ DEPENDS:= +lua
++endef
++
++define Package/lua-rs232/description
++ multiplatform library for serial communications over RS-232
++endef
++
++CONFIGURE_ARGS += \
++ --with-lua-inc=$(STAGING_DIR)/usr/include \
++ --with-lua-lib=$(STAGING_DIR)/usr/lib
++
++#define Build/Configure
++# ( cd "$(PKG_BUILD_DIR)"; ./autogen.sh )
++# $(call Build/Configure/Default)
++#endef
++define Build/Configure
++endef
++
++define Build/Compile
++ (cd "$(PKG_BUILD_DIR)"; $(TARGET_CC) src/rs232.c src/rs232_posix.c bindings/lua/luars232.c -DLUAROCKS_HACK -std=gnu99 -I./include -I$(STAGING_DIR)/usr/include -L$(STAGING_DIR)/usr/lib -fPIC -shared -o luars232.so)
++endef
++
++define Build/Install
++endef
++
++define Package/lua-rs232/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/luars232.so $(1)/usr/lib/lua/
++endef
++
++$(eval $(call BuildPackage,lua-rs232))
+diff --git a/feeds/packages/lang/lua-sha2/Makefile b/feeds/packages/lang/lua-sha2/Makefile
+new file mode 100644
+index 0000000..6a82334
+--- /dev/null
++++ b/feeds/packages/lang/lua-sha2/Makefile
+@@ -0,0 +1,52 @@
++#
++# Copyright (C) 20013-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-sha2
++PKG_VERSION:=0.2.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://code.google.com/p/sha2/
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=02bd4bfdc806
++PKG_LICENSE:=MIT
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lua-sha2
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua binding for Aaron Gifford's SHA-2 implementation
++ URL:=https://code.google.com/p/sha2/
++ MAINTAINER:=Lars Gierth <larsg@systemli.org>
++ DEPENDS:=+lua
++endef
++
++define Package/lua-sha2/description
++ Lua Binding for the SHA-2 (SHA-256/384/512) BSD-licensed C implementation by Aaron Gifford.
++ Also contains a HMAC implementation in Lua.
++endef
++
++TARGET_CFLAGS += -fPIC -DSHA2_USE_INTTYPES_H -DBYTE_ORDER -DLITTLE_ENDIAN
++TARGET_LDFLAGS += -fPIC -DSHA2_USE_INTTYPES_H -DBYTE_ORDER -DLITTLE_ENDIAN
++
++define Build/Configure
++endef
++
++define Package/lua-sha2/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua/hmac
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/sha2.so $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/hmac.lua $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/hmac/sha2.lua $(1)/usr/lib/lua/hmac
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/hmac/md5.lua $(1)/usr/lib/lua/hmac
++endef
++
++$(eval $(call BuildPackage,lua-sha2))
+diff --git a/feeds/packages/lang/lua-sha2/patches/001-makefile.patch b/feeds/packages/lang/lua-sha2/patches/001-makefile.patch
+new file mode 100644
+index 0000000..e395044
+--- /dev/null
++++ b/feeds/packages/lang/lua-sha2/patches/001-makefile.patch
+@@ -0,0 +1,14 @@
++From: Lars Gierth <larsg@systemli.org>
++Date: Tue, 2 Sep 2014 00:05:39 +0200
++
++ Add rump Makefile
++
++new file mode 100644
++index 0000000..f081d38
++--- /dev/null
+++++ b/Makefile
++@@ -0,0 +1,4 @@
+++all: sha2.o sha2lib.o
+++ $(CC) -shared -o sha2.so sha2.o sha2lib.o
+++
+++.PHONY: all
+diff --git a/feeds/packages/lang/lua-wsapi/Makefile b/feeds/packages/lang/lua-wsapi/Makefile
+new file mode 100644
+index 0000000..b382ad6
+--- /dev/null
++++ b/feeds/packages/lang/lua-wsapi/Makefile
+@@ -0,0 +1,95 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-wsapi
++PKG_VERSION:=1.6.1
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/keplerproject/wsapi.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=eed8338401196cc155e59280adbe58d78933ead0
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lua-wsapi/Default
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua WSAPI
++ URL:=http://www.keplerproject.org/wsapi
++ DEPENDS:= +lua
++endef
++
++define Package/lua-wsapi/Default/description
++ WSAPI is an API that abstracts the web server from Lua web applications
++endef
++
++
++define Package/lua-wsapi-base
++$(call Package/lua-wsapi/Default)
++ TITLE+= base
++ DEPENDS+= +luafilesystem
++ VARIANT:=base
++endef
++
++define Package/lua-wsapi-base/description
++$(call Package/lua-wsapi/Default/description)
++ .
++ This package contains the basic stuff.
++endef
++
++define Package/lua-wsapi-xavante
++$(call Package/lua-wsapi/Default)
++ TITLE+= xavante
++ DEPENDS+= +lua-wsapi-base +lua-xavante
++ VARIANT:=xavante
++endef
++
++define Package/lua-wsapi-xavante/description
++$(call Package/lua-wsapi/Default/description)
++ .
++ This package contains the Xavante stuff.
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Build/Install
++endef
++
++define Package/lua-wsapi-base/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/wsapi.lua $(1)/usr/lib/lua
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/launcher/wsapi.cgi $(1)/usr/bin
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/wsapi
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/wsapi/{common,request,response,util,cgi,sapi,ringer,mock}.lua $(1)/usr/lib/lua/wsapi
++endef
++
++define Package/lua-wsapi-xavante/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/launcher/wsapi $(1)/usr/bin
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/wsapi
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/wsapi/xavante.lua $(1)/usr/lib/lua/wsapi
++endef
++
++
++$(eval $(call BuildPackage,lua-wsapi-base))
++$(eval $(call BuildPackage,lua-wsapi-xavante))
+diff --git a/feeds/packages/lang/lua-xavante/Makefile b/feeds/packages/lang/lua-xavante/Makefile
+new file mode 100644
+index 0000000..13b66ee
+--- /dev/null
++++ b/feeds/packages/lang/lua-xavante/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lua-xavante
++PKG_VERSION:=2.3.0
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/keplerproject/xavante.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=9825b905133e14d37a4c179f2d02367ab93f1ef6
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lua-xavante
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Xavante Web Server
++ URL:=http://www.keplerproject.org/xavante
++ DEPENDS:= +lua
++endef
++
++define Package/lua-xavante/description
++ Xavante is a Lua HTTP 1.1 Web server that uses a modular architecture based on URI mapped handlers.
++endef
++
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Build/Install
++endef
++
++define Package/lua-xavante/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/sajax/sajax.lua $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/xavante/xavante.lua $(1)/usr/lib/lua
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/xavante
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/xavante/{cgiluahandler,encoding,filehandler,httpd,mime,patternhandler,redirecthandler,vhostshandler,indexhandler,urlhandler,ruleshandler}.lua $(1)/usr/lib/lua/xavante
++endef
++
++$(eval $(call BuildPackage,lua-xavante))
+diff --git a/feeds/packages/lang/luabitop/Makefile b/feeds/packages/lang/luabitop/Makefile
+new file mode 100644
+index 0000000..eda6f9b
+--- /dev/null
++++ b/feeds/packages/lang/luabitop/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luabitop
++PKG_VERSION:=1.0.2
++PKG_RELEASE:=1
++
++_BASENAME:=LuaBitOp
++
++PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
++PKG_SOURCE:=$(_BASENAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://bitop.luajit.org/download/
++PKG_MD5SUM:=d0c1080fe0c844e8477279668e2d0d06
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(_BASENAME)-$(PKG_VERSION)
++PKG_LICENSE:=MIT
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luabitop
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=luabitop
++ URL:=http://bitop.luajit.org/
++ DEPENDS:=+lua
++endef
++
++define Package/luabitop/description
++Lua BitOp is a C extension module for Lua 5.1/5.2 which adds bitwise operations on numbers.
++endef
++
++define Build/Configure
++endef
++
++
++TARGET_CFLAGS += $(FPIC) -DLUA_USE_LINUX -DLUA_NUMBER_DOUBLE
++
++define Build/Compile
++ $(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_CPPFLAGS) $(TARGET_CPPFLAGS) -std=gnu99 $(FPIC) -DLUA_USE_LINUX -shared -o $(PKG_BUILD_DIR)/bit.so $(PKG_BUILD_DIR)/bit.c
++endef
++
++define Package/luabitop/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bit.so $(1)/usr/lib/lua
++endef
++
++$(eval $(call BuildPackage,luabitop))
+diff --git a/feeds/packages/lang/luaexpat/Makefile b/feeds/packages/lang/luaexpat/Makefile
+new file mode 100644
+index 0000000..3c2f231
+--- /dev/null
++++ b/feeds/packages/lang/luaexpat/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2009 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luaexpat
++PKG_VERSION:=1.3.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://matthewwild.co.uk/projects/luaexpat
++PKG_MD5SUM:=3c20b5795e7107f847f8da844fbfe2da
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luaexpat
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=LuaExpat
++ URL:=http://www.keplerproject.org/luaexpat/
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++ DEPENDS:=+lua +libexpat
++endef
++
++define Package/luaexpat/description
++ LuaExpat is a SAX XML parser based on the Expat library.
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++ $(CP) files/compat-5.1r5 $(PKG_BUILD_DIR)/compat-5.1r5
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ EXPAT_INC="-I$(STAGING_DIR)/usr/include/" \
++ LUA_INC="-I$(STAGING_DIR)/usr/include/" \
++ LUA_LIBDIR="$(STAGING_DIR)/usr/lib/" \
++ COMPAT_DIR="$(PKG_BUILD_DIR)/compat-5.1r5" \
++ LDFLAGS="-shared $(TARGET_LDFLAGS)" \
++ CC="$(TARGET_CC) $(TARGET_CFLAGS) $(FPIC) -std=c99" \
++ LD="$(TARGET_CROSS)ld -shared"
++endef
++
++define Package/luaexpat/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/lxp.so $(1)/usr/lib/lua/lxp.so
++ $(INSTALL_DIR) $(1)/usr/lib/lua/lxp
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/lxp/lom.lua $(1)/usr/lib/lua/lxp
++endef
++
++$(eval $(call BuildPackage,luaexpat))
+diff --git a/feeds/packages/lang/luaexpat/files/compat-5.1r5/compat-5.1.c b/feeds/packages/lang/luaexpat/files/compat-5.1r5/compat-5.1.c
+new file mode 100644
+index 0000000..6fdb8b7
+--- /dev/null
++++ b/feeds/packages/lang/luaexpat/files/compat-5.1r5/compat-5.1.c
+@@ -0,0 +1,97 @@
++/*
++** Compat-5.1
++** Copyright Kepler Project 2004-2006 (http://www.keplerproject.org/compat)
++** $Id: compat-5.1.c,v 1.13 2006/02/20 21:12:47 carregal Exp $
++*/
++
++#include <stdio.h>
++#include <string.h>
++#include "lua.h"
++#include "lauxlib.h"
++#include "compat-5.1.h"
++
++static void getfield(lua_State *L, int idx, const char *name) {
++ const char *end = strchr(name, '.');
++ lua_pushvalue(L, idx);
++ while (end) {
++ lua_pushlstring(L, name, end - name);
++ lua_gettable(L, -2);
++ lua_remove(L, -2);
++ if (lua_isnil(L, -1)) return;
++ name = end+1;
++ end = strchr(name, '.');
++ }
++ lua_pushstring(L, name);
++ lua_gettable(L, -2);
++ lua_remove(L, -2);
++}
++
++static void setfield(lua_State *L, int idx, const char *name) {
++ const char *end = strchr(name, '.');
++ lua_pushvalue(L, idx);
++ while (end) {
++ lua_pushlstring(L, name, end - name);
++ lua_gettable(L, -2);
++ /* create table if not found */
++ if (lua_isnil(L, -1)) {
++ lua_pop(L, 1);
++ lua_newtable(L);
++ lua_pushlstring(L, name, end - name);
++ lua_pushvalue(L, -2);
++ lua_settable(L, -4);
++ }
++ lua_remove(L, -2);
++ name = end+1;
++ end = strchr(name, '.');
++ }
++ lua_pushstring(L, name);
++ lua_pushvalue(L, -3);
++ lua_settable(L, -3);
++ lua_pop(L, 2);
++}
++
++LUALIB_API void luaL_module(lua_State *L, const char *libname,
++ const luaL_reg *l, int nup) {
++ if (libname) {
++ getfield(L, LUA_GLOBALSINDEX, libname); /* check whether lib already exists */
++ if (lua_isnil(L, -1)) {
++ int env, ns;
++ lua_pop(L, 1); /* get rid of nil */
++ lua_pushliteral(L, "require");
++ lua_gettable(L, LUA_GLOBALSINDEX); /* look for require */
++ lua_getfenv(L, -1); /* getfenv(require) */
++ lua_remove(L, -2); /* remove function require */
++ env = lua_gettop(L);
++
++ lua_newtable(L); /* create namespace for lib */
++ ns = lua_gettop(L);
++ getfield(L, env, "package.loaded"); /* get package.loaded table */
++ if (lua_isnil(L, -1)) { /* create package.loaded table */
++ lua_pop(L, 1); /* remove previous result */
++ lua_newtable(L);
++ lua_pushvalue(L, -1);
++ setfield(L, env, "package.loaded");
++ }
++ else if (!lua_istable(L, -1))
++ luaL_error(L, "name conflict for library `%s'", libname);
++ lua_pushstring(L, libname);
++ lua_pushvalue(L, ns);
++ lua_settable(L, -3); /* package.loaded[libname] = ns */
++ lua_pop(L, 1); /* get rid of package.loaded table */
++ lua_pushvalue(L, ns); /* copy namespace */
++ setfield(L, LUA_GLOBALSINDEX, libname);
++ lua_remove (L, env); /* remove env */
++ }
++ lua_insert(L, -(nup+1)); /* move library table to below upvalues */
++ }
++ for (; l->name; l++) {
++ int i;
++ lua_pushstring(L, l->name);
++ for (i=0; i<nup; i++) /* copy upvalues to the top */
++ lua_pushvalue(L, -(nup+1));
++ lua_pushcclosure(L, l->func, nup);
++ lua_settable(L, -(nup+3));
++ }
++ lua_pop(L, nup); /* remove upvalues */
++}
++
+diff --git a/feeds/packages/lang/luaexpat/files/compat-5.1r5/compat-5.1.h b/feeds/packages/lang/luaexpat/files/compat-5.1r5/compat-5.1.h
+new file mode 100644
+index 0000000..97570d9
+--- /dev/null
++++ b/feeds/packages/lang/luaexpat/files/compat-5.1r5/compat-5.1.h
+@@ -0,0 +1,13 @@
++/*
++** Compat-5.1
++** Copyright Kepler Project 2004-2006 (http://www.keplerproject.org/compat/)
++** $Id: compat-5.1.h,v 1.8 2006/02/20 21:12:47 carregal Exp $
++*/
++
++#ifndef COMPAT_H
++
++LUALIB_API void luaL_module(lua_State *L, const char *libname,
++ const luaL_reg *l, int nup);
++#define luaL_openlib luaL_module
++
++#endif
+diff --git a/feeds/packages/lang/luaexpat/files/compat-5.1r5/compat-5.1.lua b/feeds/packages/lang/luaexpat/files/compat-5.1r5/compat-5.1.lua
+new file mode 100644
+index 0000000..0938d56
+--- /dev/null
++++ b/feeds/packages/lang/luaexpat/files/compat-5.1r5/compat-5.1.lua
+@@ -0,0 +1,267 @@
++--
++-- Compat-5.1
++-- Copyright Kepler Project 2004-2006 (http://www.keplerproject.org/compat)
++-- According to Lua 5.1
++-- $Id: compat-5.1.lua,v 1.22 2006/02/20 21:12:47 carregal Exp $
++--
++
++_COMPAT51 = "Compat-5.1 R5"
++
++local LUA_DIRSEP = '/'
++local LUA_OFSEP = '_'
++local OLD_LUA_OFSEP = ''
++local POF = 'luaopen_'
++local LUA_PATH_MARK = '?'
++local LUA_IGMARK = ':'
++
++local assert, error, getfenv, ipairs, loadfile, loadlib, pairs, setfenv, setmetatable, type = assert, error, getfenv, ipairs, loadfile, loadlib, pairs, setfenv, setmetatable, type
++local find, format, gfind, gsub, sub = string.find, string.format, string.gfind, string.gsub, string.sub
++
++--
++-- avoid overwriting the package table if it's already there
++--
++package = package or {}
++local _PACKAGE = package
++
++package.path = LUA_PATH or os.getenv("LUA_PATH") or
++ ("./?.lua;" ..
++ "/usr/local/share/lua/5.0/?.lua;" ..
++ "/usr/local/share/lua/5.0/?/?.lua;" ..
++ "/usr/local/share/lua/5.0/?/init.lua" )
++
++package.cpath = LUA_CPATH or os.getenv("LUA_CPATH") or
++ "./?.so;" ..
++ "./l?.so;" ..
++ "/usr/local/lib/lua/5.0/?.so;" ..
++ "/usr/local/lib/lua/5.0/l?.so"
++
++--
++-- make sure require works with standard libraries
++--
++package.loaded = package.loaded or {}
++package.loaded.debug = debug
++package.loaded.string = string
++package.loaded.math = math
++package.loaded.io = io
++package.loaded.os = os
++package.loaded.table = table
++package.loaded.base = _G
++package.loaded.coroutine = coroutine
++local _LOADED = package.loaded
++
++--
++-- avoid overwriting the package.preload table if it's already there
++--
++package.preload = package.preload or {}
++local _PRELOAD = package.preload
++
++
++--
++-- looks for a file `name' in given path
++--
++local function findfile (name, pname)
++ name = gsub (name, "%.", LUA_DIRSEP)
++ local path = _PACKAGE[pname]
++ assert (type(path) == "string", format ("package.%s must be a string", pname))
++ for c in gfind (path, "[^;]+") do
++ c = gsub (c, "%"..LUA_PATH_MARK, name)
++ local f = io.open (c)
++ if f then
++ f:close ()
++ return c
++ end
++ end
++ return nil -- not found
++end
++
++
++--
++-- check whether library is already loaded
++--
++local function loader_preload (name)
++ assert (type(name) == "string", format (
++ "bad argument #1 to `require' (string expected, got %s)", type(name)))
++ assert (type(_PRELOAD) == "table", "`package.preload' must be a table")
++ return _PRELOAD[name]
++end
++
++
++--
++-- Lua library loader
++--
++local function loader_Lua (name)
++ assert (type(name) == "string", format (
++ "bad argument #1 to `require' (string expected, got %s)", type(name)))
++ local filename = findfile (name, "path")
++ if not filename then
++ return false
++ end
++ local f, err = loadfile (filename)
++ if not f then
++ error (format ("error loading module `%s' (%s)", name, err))
++ end
++ return f
++end
++
++
++local function mkfuncname (name)
++ name = gsub (name, "^.*%"..LUA_IGMARK, "")
++ name = gsub (name, "%.", LUA_OFSEP)
++ return POF..name
++end
++
++local function old_mkfuncname (name)
++ --name = gsub (name, "^.*%"..LUA_IGMARK, "")
++ name = gsub (name, "%.", OLD_LUA_OFSEP)
++ return POF..name
++end
++
++--
++-- C library loader
++--
++local function loader_C (name)
++ assert (type(name) == "string", format (
++ "bad argument #1 to `require' (string expected, got %s)", type(name)))
++ local filename = findfile (name, "cpath")
++ if not filename then
++ return false
++ end
++ local funcname = mkfuncname (name)
++ local f, err = loadlib (filename, funcname)
++ if not f then
++ funcname = old_mkfuncname (name)
++ f, err = loadlib (filename, funcname)
++ if not f then
++ error (format ("error loading module `%s' (%s)", name, err))
++ end
++ end
++ return f
++end
++
++
++local function loader_Croot (name)
++ local p = gsub (name, "^([^.]*).-$", "%1")
++ if p == "" then
++ return
++ end
++ local filename = findfile (p, "cpath")
++ if not filename then
++ return
++ end
++ local funcname = mkfuncname (name)
++ local f, err, where = loadlib (filename, funcname)
++ if f then
++ return f
++ elseif where ~= "init" then
++ error (format ("error loading module `%s' (%s)", name, err))
++ end
++end
++
++-- create `loaders' table
++package.loaders = package.loaders or { loader_preload, loader_Lua, loader_C, loader_Croot, }
++local _LOADERS = package.loaders
++
++
++--
++-- iterate over available loaders
++--
++local function load (name, loaders)
++ -- iterate over available loaders
++ assert (type (loaders) == "table", "`package.loaders' must be a table")
++ for i, loader in ipairs (loaders) do
++ local f = loader (name)
++ if f then
++ return f
++ end
++ end
++ error (format ("module `%s' not found", name))
++end
++
++-- sentinel
++local sentinel = function () end
++
++--
++-- new require
++--
++function _G.require (modname)
++ assert (type(modname) == "string", format (
++ "bad argument #1 to `require' (string expected, got %s)", type(name)))
++ local p = _LOADED[modname]
++ if p then -- is it there?
++ if p == sentinel then
++ error (format ("loop or previous error loading module '%s'", modname))
++ end
++ return p -- package is already loaded
++ end
++ local init = load (modname, _LOADERS)
++ _LOADED[modname] = sentinel
++ local actual_arg = _G.arg
++ _G.arg = { modname }
++ local res = init (modname)
++ if res then
++ _LOADED[modname] = res
++ end
++ _G.arg = actual_arg
++ if _LOADED[modname] == sentinel then
++ _LOADED[modname] = true
++ end
++ return _LOADED[modname]
++end
++
++
++-- findtable
++local function findtable (t, f)
++ assert (type(f)=="string", "not a valid field name ("..tostring(f)..")")
++ local ff = f.."."
++ local ok, e, w = find (ff, '(.-)%.', 1)
++ while ok do
++ local nt = rawget (t, w)
++ if not nt then
++ nt = {}
++ t[w] = nt
++ elseif type(t) ~= "table" then
++ return sub (f, e+1)
++ end
++ t = nt
++ ok, e, w = find (ff, '(.-)%.', e+1)
++ end
++ return t
++end
++
++--
++-- new package.seeall function
++--
++function _PACKAGE.seeall (module)
++ local t = type(module)
++ assert (t == "table", "bad argument #1 to package.seeall (table expected, got "..t..")")
++ local meta = getmetatable (module)
++ if not meta then
++ meta = {}
++ setmetatable (module, meta)
++ end
++ meta.__index = _G
++end
++
++
++--
++-- new module function
++--
++function _G.module (modname, ...)
++ local ns = _LOADED[modname]
++ if type(ns) ~= "table" then
++ ns = findtable (_G, modname)
++ if not ns then
++ error (string.format ("name conflict for module '%s'", modname))
++ end
++ _LOADED[modname] = ns
++ end
++ if not ns._NAME then
++ ns._NAME = modname
++ ns._M = ns
++ ns._PACKAGE = gsub (modname, "[^.]*$", "")
++ end
++ setfenv (2, ns)
++ for i, f in ipairs (arg) do
++ f (ns)
++ end
++end
+diff --git a/feeds/packages/lang/luafilesystem/Makefile b/feeds/packages/lang/luafilesystem/Makefile
+new file mode 100644
+index 0000000..13abef6
+--- /dev/null
++++ b/feeds/packages/lang/luafilesystem/Makefile
+@@ -0,0 +1,66 @@
++#
++# Copyright (C) 2008-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luafilesystem
++PKG_VERSION:=1.6.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/keplerproject/luafilesystem.git
++PKG_SOURCE_VERSION:=2fd989cd6c777583be1c93616018c55b2cbb1bcf
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luafilesystem
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=LuaFileSystem
++ URL:=http://keplerproject.github.com/luafilesystem/
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++ DEPENDS:=+liblua
++endef
++
++define Package/luafilesystem/description
++ This package contains the LuaFileSystem library, a set of portable
++ functions for directory creation, listing and deletion and for file
++ locking.
++endef
++
++define Build/Configure
++endef
++
++TARGET_CFLAGS += $(FPIC) $(TARGET_CPPFLAGS)
++
++TARGET_LDFLAGS += -llua
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ CFLAGS="$(TARGET_CFLAGS) -std=gnu99" \
++ LDFLAGS="$(TARGET_LDFLAGS)"
++ $(TARGET_CROSS)ar r $(PKG_BUILD_DIR)/src/luafilesystem.a $(PKG_BUILD_DIR)/src/lfs.o
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/include
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/lfs.h $(STAGING_DIR)/usr/include
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/lfs.so $(STAGING_DIR)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/luafilesystem.a $(STAGING_DIR)/usr/lib/lua
++endef
++
++define Package/luafilesystem/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/lfs.so $(1)/usr/lib/lua/lfs.so
++endef
++
++$(eval $(call BuildPackage,luafilesystem))
+diff --git a/feeds/packages/lang/luai2c/Makefile b/feeds/packages/lang/luai2c/Makefile
+new file mode 100755
+index 0000000..2a7dbbf
+--- /dev/null
++++ b/feeds/packages/lang/luai2c/Makefile
+@@ -0,0 +1,46 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luai2c
++PKG_VERSION:=1.0.0
++PKG_RELEASE:=2
++PKG_MAINTAINER:=Frank Edelhaeuser <fedel@users.sourceforge.net>
++
++PKG_SOURCE_NAME:=i2c-lua
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_NAME)-$(PKG_VERSION)
++
++PKG_SOURCE:=$(PKG_SOURCE_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/$(PKG_SOURCE_NAME)
++PKG_MD5SUM:=7098577f101410b201cd43a7467e408d
++
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luai2c
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua I2C binding
++ URL:=http://sourceforge.net/projects/i2c-lua/
++ DEPENDS:=+liblua +kmod-i2c-core
++ MAINTAINER:=Frank Edelhaeuser <fedel@users.sourceforge.net>
++endef
++
++define Package/luai2c/description
++ This is the Lua binding for I2C. It provides access to I2C slaves supported by the kernel.
++endef
++
++define Package/luai2c/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/i2c.so $(1)/usr/lib/lua
++ $(INSTALL_DIR) $(1)/usr/lib/lua/i2c
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/examples/* $(1)/usr/lib/lua/i2c
++endef
++
++$(eval $(call BuildPackage,luai2c))
+diff --git a/feeds/packages/lang/lualanes/Makefile b/feeds/packages/lang/lualanes/Makefile
+new file mode 100644
+index 0000000..06bc1e2
+--- /dev/null
++++ b/feeds/packages/lang/lualanes/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lualanes
++PKG_REV:=aa9bfcf2dd49f55f11b27e7c21d5b75d81ccfc7e
++PKG_VERSION:=3.9.4
++PKG_RELEASE=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_REV).tar.gz
++PKG_SOURCE_URL:=https://github.com/LuaLanes/lanes.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++PKG_BUILD_DEPENDS:=lua/host luac/host
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lualanes
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=LuaLanes
++ URL:=http://luaforge.net/projects/lanes/
++ DEPENDS:=+lua +luac +liblua +libpthread
++ MAINTAINER:=Vladimir Malyutin <first-leon@yandex.ru>
++endef
++
++define Package/lualanes/description
++ Lanes is a lightweight, native, lazy evaluating multithreading library for Lua 5.1 and 5.2.
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) all \
++ CC="$(TARGET_CC)" \
++ LUA="$(STAGING_DIR_HOST)/bin/lua" \
++ LUAC="$(STAGING_DIR_HOST)/bin/luac" \
++ OPT_FLAGS="$(TARGET_CFLAGS) --std=c99 -Dpthread_yield=sched_yield"
++endef
++
++define Package/lualanes/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/lanes.lua $(1)/usr/lib/lua/
++ $(INSTALL_DIR) $(1)/usr/lib/lua/lanes
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/lanes/core.so $(1)/usr/lib/lua/lanes/core.so
++endef
++
++$(eval $(call BuildPackage,lualanes))
+diff --git a/feeds/packages/lang/lualanes/patches/100-musl-compat.patch b/feeds/packages/lang/lualanes/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..ba3f49f
+--- /dev/null
++++ b/feeds/packages/lang/lualanes/patches/100-musl-compat.patch
+@@ -0,0 +1,13 @@
++diff --git a/src/threading.h b/src/threading.h
++index bfa9ab8..7b3d6a1 100644
++--- a/src/threading.h
+++++ b/src/threading.h
++@@ -128,7 +128,7 @@ enum e_status { PENDING, RUNNING, WAITING, DONE, ERROR_ST, CANCELLED };
++ #endif // PLATFORM_WIN32
++ #include <pthread.h>
++
++- #ifdef PLATFORM_LINUX
+++ #if defined(PLATFORM_LINUX) && defined(__UCLIBC__)
++ # define _MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP
++ #else
++ /* OS X, ... */
+diff --git a/feeds/packages/lang/luaposix/Makefile b/feeds/packages/lang/luaposix/Makefile
+new file mode 100644
+index 0000000..a189e66
+--- /dev/null
++++ b/feeds/packages/lang/luaposix/Makefile
+@@ -0,0 +1,61 @@
++#
++# Copyright (C) 2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luaposix
++PKG_VERSION:=v33.2.1
++PKG_RELEASE:=5
++
++PKG_SOURCE:=release-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/luaposix/luaposix/archive/
++PKG_MD5SUM:=aa68b5c07ab1ecea81bb466c81e88056
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-release-$(PKG_VERSION)
++PKG_REMOVE_FILES:=aclocal.m4
++PKG_FIXUP:=autoreconf
++PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luaposix
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=luaposix
++ URL:=http://luaforge.net/projects/luaposix/
++ DEPENDS:=+lua +librt
++ PKG_BUILD_DEPENDS:=+lua/host
++endef
++
++define Package/luaposix/description
++ luaposix is a general POSIX library for Lua providing access
++ to various low level libc functions.
++endef
++
++CONFIGURE_VARS += ac_cv_path_LDOC=""
++
++TARGET_CFLAGS += -DLUA_USE_LINUX $(FPIC) -std=gnu99
++ifeq ($(CONFIG_USE_MUSL),y)
++ TARGET_CFLAGS += -D_POSIX_PRIORITY_SCHEDULING
++endif
++
++ifneq ($(CONFIG_USE_GLIBC),)
++ ifeq ($(CONFIG_EGLIBC_OPTION_EGLIBC_UTMP),)
++ TARGET_CFLAGS += -DNO_GETLOGIN
++ endif
++endif
++
++
++define Package/luaposix/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua/posix
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ext/posix/.libs/posix.so $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/posix.lua $(1)/usr/lib/lua
++endef
++
++$(eval $(call BuildPackage,luaposix))
+diff --git a/feeds/packages/lang/luaposix/patches/100-eglibc-compat.patch b/feeds/packages/lang/luaposix/patches/100-eglibc-compat.patch
+new file mode 100644
+index 0000000..e4df63b
+--- /dev/null
++++ b/feeds/packages/lang/luaposix/patches/100-eglibc-compat.patch
+@@ -0,0 +1,30 @@
++diff --git a/ext/posix/unistd.c b/ext/posix/unistd.c
++index 9276640..69c8cef 100644
++--- a/ext/posix/unistd.c
+++++ b/ext/posix/unistd.c
++@@ -525,6 +525,7 @@ Pgetgroups(lua_State *L)
++ #endif
++
++
+++#ifndef NO_GETLOGIN
++ /***
++ Current logged-in user.
++ @treturn[1] string username, if successful
++@@ -537,6 +538,7 @@ Pgetlogin(lua_State *L)
++ checknargs(L, 0);
++ return pushstringresult(getlogin());
++ }
+++#endif
++
++
++ /***
++@@ -1044,7 +1046,9 @@ static const luaL_Reg posix_unistd_fns[] =
++ LPOSIX_FUNC( Pgetegid ),
++ LPOSIX_FUNC( Pgeteuid ),
++ LPOSIX_FUNC( Pgetgid ),
+++#ifndef NO_GETLOGIN
++ LPOSIX_FUNC( Pgetlogin ),
+++#endif
++ LPOSIX_FUNC( Pgetpgrp ),
++ LPOSIX_FUNC( Pgetpid ),
++ LPOSIX_FUNC( Pgetppid ),
+diff --git a/feeds/packages/lang/luaposix/patches/101-disable-curses.patch b/feeds/packages/lang/luaposix/patches/101-disable-curses.patch
+new file mode 100644
+index 0000000..6412799
+--- /dev/null
++++ b/feeds/packages/lang/luaposix/patches/101-disable-curses.patch
+@@ -0,0 +1,32 @@
++diff --git a/configure.ac b/configure.ac
++index dfd4199..19924d0 100644
++--- a/configure.ac
+++++ b/configure.ac
++@@ -153,15 +153,6 @@ AC_CHECK_LIB([rt], [clock_gettime])
++ AC_SUBST([LIBRT], [$LIBS])
++ LIBS=$save_LIBS
++
++-## Curses
++-AX_WITH_CURSES
++-AC_ARG_VAR(CURSES_LIB, [linker flags for curses library])
++-
++-save_LIBS=$LIBS
++-LIBS="$CURSES_LIB $LIBS"
++-AC_CHECK_FUNCS([resizeterm])
++-LIBS=$save_LIBS
++-
++ ## Use system implementation, or bundled replacement?
++ AC_CHECK_FUNCS([strlcpy])
++
++diff --git a/ext/posix/posix.c b/ext/posix/posix.c
++index 6019df0..2d75487 100644
++--- a/ext/posix/posix.c
+++++ b/ext/posix/posix.c
++@@ -12,7 +12,6 @@
++
++ #include "bit32.c"
++ #include "ctype.c"
++-#include "curses.c"
++ #include "dirent.c"
++ #include "errno.c"
++ #include "fcntl.c"
+diff --git a/feeds/packages/lang/luaposix/patches/102-disable-compat-deprecated.diff b/feeds/packages/lang/luaposix/patches/102-disable-compat-deprecated.diff
+new file mode 100644
+index 0000000..7c58be4
+--- /dev/null
++++ b/feeds/packages/lang/luaposix/patches/102-disable-compat-deprecated.diff
+@@ -0,0 +1,20 @@
++diff --git a/lib/posix.lua.in b/lib/posix.lua.in
++index 17ef39a..a248d9b 100644
++--- a/lib/posix.lua.in
+++++ b/lib/posix.lua.in
++@@ -35,15 +35,6 @@ for _, sub in ipairs {
++ end
++ end
++
++-
++--- Inject deprecated APIs (overwriting submodules) for backwards compatibility.
++-for k, v in pairs (require "posix.deprecated") do
++- M[k] = v
++-end
++-for k, v in pairs (require "posix.compat") do
++- M[k] = v
++-end
++-
++ M.version = "posix for " .. _VERSION .. " / @PACKAGE_STRING@"
++
++
+diff --git a/feeds/packages/lang/luarocks/Makefile b/feeds/packages/lang/luarocks/Makefile
+new file mode 100644
+index 0000000..e0a0f57
+--- /dev/null
++++ b/feeds/packages/lang/luarocks/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luarocks
++PKG_VERSION:=2.2.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://github.com/keplerproject/luarocks.git
++PKG_SOURCE_VERSION:=v$(PKG_VERSION)
++
++PKG_MAINTAINER:=Amr Hassan <amr.hassan@gmail.com>
++PKG_INSTALL=1
++PKG_BUILD_DEPENDS:=lua/host luac/host
++PKG_LICENSE=GPL
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luarocks
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=luarocks
++ URL:=https://github.com/keplerproject/luarocks
++ DEPENDS:=+lua +luac +liblua +luasocket +unzip +curl +luasec
++endef
++
++define Package/luarocks/description
++ LuaRocks is a deployment and management system for Lua modules.
++endef
++
++# My custom args, copied and modified from SDK_ROOT/include/package-defaults.mk
++CONFIGURE_ARGS = \
++ --prefix=$(CONFIGURE_PREFIX) \
++ --sysconfdir=/etc \
++ --with-lua=$(STAGING_DIR_HOST)
++
++define Build/Compile
++ $(call Build/Compile/Default,build)
++endef
++
++define Package/luarocks/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/luarocks-5.1 $(1)/usr/bin/luarocks
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/luarocks-admin-5.1 $(1)/usr/bin/luarocks-admin
++ $(CP) $(PKG_INSTALL_DIR)/usr/share $(1)/usr/share
++ $(CP) $(PKG_INSTALL_DIR)/etc $(1)/etc
++endef
++
++$(eval $(call BuildPackage,luarocks))
+diff --git a/feeds/packages/lang/luarocks/patches/01_dont_modify_bin_shebang.diff b/feeds/packages/lang/luarocks/patches/01_dont_modify_bin_shebang.diff
+new file mode 100644
+index 0000000..a1bad21
+--- /dev/null
++++ b/feeds/packages/lang/luarocks/patches/01_dont_modify_bin_shebang.diff
+@@ -0,0 +1,13 @@
++diff -rupN luarocks/Makefile luarocks.new/Makefile
++--- luarocks/Makefile 2015-02-19 13:24:07.027310956 +0200
+++++ luarocks.new/Makefile 2015-02-22 13:28:24.497353543 +0200
++@@ -104,7 +104,7 @@ build_bins: cleanup_bins
++ for f in $(BIN_FILES) ;\
++ do \
++ sed "1d" src/bin/$$f > src/bin/$$f.bak ;\
++- echo "#!$(LUA_BINDIR)/lua$(LUA_SUFFIX)" > src/bin/$$f ;\
+++ echo "#!/usr/bin/env lua" > src/bin/$$f ;\
++ echo "package.path = [[$(LUADIR)/?.lua;]]..package.path" | sed "s,//,/,g" >> src/bin/$$f ;\
++ cat src/bin/$$f.bak >> src/bin/$$f ;\
++ chmod +x src/bin/$$f ;\
++Binary files luarocks/src/bin/.luarocks.swp and luarocks.new/src/bin/.luarocks.swp differ
+diff --git a/feeds/packages/lang/luasec/Makefile b/feeds/packages/lang/luasec/Makefile
+new file mode 100644
+index 0000000..9ed69d2
+--- /dev/null
++++ b/feeds/packages/lang/luasec/Makefile
+@@ -0,0 +1,61 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luasec
++PKG_VERSION:=0.5
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/brunoos/luasec/archive/
++PKG_MD5SUM:=0518f4524f399f33424c6f450e1d06db
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_NAME)-$(PKG_VERSION)
++
++MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luasec
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=LuaSec
++ URL:=https://github.com/brunoos/luasec
++ DEPENDS:=+lua +libopenssl +luasocket
++endef
++
++define Package/luasec/description
++ LuaSec is a binding for OpenSSL library to provide TLS/SSL communication.
++endef
++
++define Build/Configure
++endef
++
++MAKE_FLAGS += \
++ INCDIR="$(TARGET_CPPFLAGS) -I." \
++ LIBDIR="$(TARGET_LDFLAGS) -L./luasocket" \
++ LUACPATH="/usr/lib/lua" \
++ LUAPATH="/usr/lib/lua"
++
++define Build/Compile
++$(call Build/Compile/Default,linux)
++endef
++
++define Package/luasec/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/lua/ssl.so $(1)/usr/lib/lua/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/lua/ssl.lua $(1)/usr/lib/lua/
++ $(INSTALL_DIR) $(1)/usr/lib/lua/ssl
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/lua/ssl/https.lua $(1)/usr/lib/lua/ssl/
++endef
++
++$(eval $(call BuildPackage,luasec))
+diff --git a/feeds/packages/lang/luasec/patches/100-luasocket-Makefile.patch b/feeds/packages/lang/luasec/patches/100-luasocket-Makefile.patch
+new file mode 100644
+index 0000000..24de7fc
+--- /dev/null
++++ b/feeds/packages/lang/luasec/patches/100-luasocket-Makefile.patch
+@@ -0,0 +1,20 @@
++--- luasec-luasec-0.5-old/src/luasocket/Makefile 2014-01-29 21:43:33.000000000 +0100
+++++ luasec-luasec-0.5/src/luasocket/Makefile 2014-11-30 13:07:44.850051000 +0100
++@@ -6,7 +6,7 @@
++
++ CC ?= cc
++ CFLAGS += $(MYCFLAGS) -DLUASOCKET_DEBUG
++-AR := ar rcu
+++AR ?= ar
++ RANLIB ?= ranlib
++
++ .PHONY: all clean
++@@ -14,7 +14,7 @@
++ all: libluasocket.a
++
++ libluasocket.a: $(OBJS)
++- $(AR) $@ $(OBJS)
+++ $(AR) rcu $@ $(OBJS)
++ $(RANLIB) $@
++
++ clean:
+diff --git a/feeds/packages/lang/luasoap/Makefile b/feeds/packages/lang/luasoap/Makefile
+new file mode 100644
+index 0000000..6ebf03b
+--- /dev/null
++++ b/feeds/packages/lang/luasoap/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luasoap
++PKG_VERSION:=2014-08-21
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/tomasguisasola/luasoap.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=af1e100281cee4b972df10121e37e51d53367a98
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_MIRROR_MD5SUM:=
++
++PKG_MAINTAINER:=Liu Peng <pengliu@credosemi.com>
++PKG_LICENSE:=MIT
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luasoap
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=LuaSOAP
++ URL:=https://github.com/tomasguisasola/luasoap
++ DEPENDS:=+lua +luaexpat +luasec +luasocket
++endef
++
++define Package/luasoap/description
++ LuaSOAP is a library of functions to deal with SOAP.
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/luasoap/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/soap.lua $(1)/usr/lib/lua/
++ $(INSTALL_DIR) $(1)/usr/lib/lua/soap
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/{client,server}.lua $(1)/usr/lib/lua/soap/
++ $(INSTALL_DIR) $(1)/usr/lib/lua/soap/client
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/client/https.lua $(1)/usr/lib/lua/soap/client/
++ $(INSTALL_DIR) $(1)/usr/lib/lua/soap/tests
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/tests/test{,-http,-server}.lua $(1)/usr/lib/lua/soap/tests/
++endef
++
++$(eval $(call BuildPackage,luasoap))
+diff --git a/feeds/packages/lang/luasocket/Makefile b/feeds/packages/lang/luasocket/Makefile
+new file mode 100644
+index 0000000..5e7c983
+--- /dev/null
++++ b/feeds/packages/lang/luasocket/Makefile
+@@ -0,0 +1,63 @@
++#
++# Copyright (C) 2009-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luasocket
++PKG_SOURCE_VERSION:=6d5e40c324c84d9c1453ae88e0ad5bdd0a631448
++PKG_VERSION:=3.0-rc1-20130909
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://github.com/diegonehab/luasocket.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luasocket
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=LuaSocket
++ URL:=http://luasocket.luaforge.net/
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++ DEPENDS:=+lua
++endef
++
++define Package/luasocket/description
++ LuaSocket is the most comprehensive networking support
++ library for the Lua language. It provides easy access to
++ TCP, UDP, DNS, SMTP, FTP, HTTP, MIME and much more.
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)/ \
++ LIBDIR="$(TARGET_LDFLAGS)" \
++ CC="$(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_CPPFLAGS) -std=gnu99" \
++ LD="$(TARGET_CROSS)ld -shared" \
++ all
++endef
++
++
++define Package/luasocket/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/{ltn12,mime,socket}.lua $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/mime.so.1.0.3 $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/socket.so.3.0-rc1 $(1)/usr/lib/lua
++ $(INSTALL_DIR) $(1)/usr/lib/lua/mime
++ ln -sf ../mime.so.1.0.3 $(1)/usr/lib/lua/mime/core.so
++ $(INSTALL_DIR) $(1)/usr/lib/lua/socket
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/{ftp,http,smtp,tp,url,headers}.lua $(1)/usr/lib/lua/socket
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/unix.so $(1)/usr/lib/lua/socket
++ ln -sf ../socket.so.3.0-rc1 $(1)/usr/lib/lua/socket/core.so
++endef
++
++$(eval $(call BuildPackage,luasocket))
+diff --git a/feeds/packages/lang/luasocket/patches/0001-Add-interface-support.patch b/feeds/packages/lang/luasocket/patches/0001-Add-interface-support.patch
+new file mode 100644
+index 0000000..3be42ed
+--- /dev/null
++++ b/feeds/packages/lang/luasocket/patches/0001-Add-interface-support.patch
+@@ -0,0 +1,237 @@
++From 96fdf07acf78ecfc9be76a8b0591f38fe6f1a875 Mon Sep 17 00:00:00 2001
++From: Steven Barth <steven@midlink.org>
++Date: Sat, 9 Nov 2013 12:01:42 +0100
++Subject: [PATCH] Add interface resolving
++
++---
++ src/if.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ src/if.h | 27 ++++++++++++++
++ src/luasocket.c | 2 +
++ src/makefile | 2 +
++ src/options.c | 9 +++++
++ 5 files changed, 153 insertions(+)
++ create mode 100644 src/if.c
++ create mode 100644 src/if.h
++
++diff --git a/src/if.c b/src/if.c
++new file mode 100644
++index 0000000..db231aa
++--- /dev/null
+++++ b/src/if.c
++@@ -0,0 +1,113 @@
+++/*
+++ * $Id: if.c $
+++ *
+++ * Author: Markus Stenberg <fingon@iki.fi>
+++ *
+++ * Copyright (c) 2012 cisco Systems, Inc.
+++ *
+++ * Created: Tue Dec 4 14:50:34 2012 mstenber
+++ * Last modified: Wed Dec 5 18:51:08 2012 mstenber
+++ * Edit time: 24 min
+++ *
+++ */
+++
+++#include <sys/types.h>
+++#include <sys/socket.h>
+++#include <net/if.h>
+++
+++#include "if.h"
+++
+++#include "lauxlib.h"
+++
+++static int if_global_indextoname(lua_State *L);
+++static int if_global_nametoindex(lua_State *L);
+++static int if_global_nameindex(lua_State *L);
+++
+++static luaL_Reg func[] = {
+++ { "indextoname", if_global_indextoname},
+++ { "nametoindex", if_global_nametoindex},
+++ { "nameindex", if_global_nameindex},
+++ { NULL, NULL}
+++};
+++
+++int if_open(lua_State *L)
+++{
+++ lua_pushstring(L, "iface");
+++ lua_newtable(L);
+++ luaL_openlib(L, NULL, func, 0);
+++ lua_settable(L, -3);
+++ return 0;
+++}
+++
+++int if_global_indextoname(lua_State *L)
+++{
+++ unsigned int ifnumber;
+++ const char *name;
+++ char buf[IF_NAMESIZE+1];
+++
+++ if (!lua_isnumber(L, 1))
+++ {
+++ lua_pushnil(L);
+++ lua_pushstring(L, "indextoname expects only number argument");
+++ return 2;
+++ }
+++ ifnumber = lua_tonumber(L, 1);
+++ if (!(name = if_indextoname(ifnumber, buf)))
+++ {
+++ lua_pushnil(L);
+++ lua_pushstring(L, "nonexistent interface");
+++ return 2;
+++ }
+++ lua_pushstring(L, name);
+++ return 1;
+++}
+++
+++int if_global_nametoindex(lua_State *L)
+++{
+++ unsigned int ifnumber;
+++ if (!lua_isstring(L, 1))
+++ {
+++ lua_pushnil(L);
+++ lua_pushstring(L, "nametoindex expects only string argument");
+++ return 2;
+++ }
+++ if (!(ifnumber = if_nametoindex(lua_tostring(L, 1))))
+++ {
+++ lua_pushnil(L);
+++ lua_pushstring(L, "nonexistent interface");
+++ return 2;
+++ }
+++ lua_pushnumber(L, ifnumber);
+++ return 1;
+++}
+++
+++int if_global_nameindex(lua_State *L)
+++{
+++ struct if_nameindex *ni, *oni;
+++ int i = 1;
+++ oni = ni = if_nameindex();
+++ lua_newtable(L);
+++ while (ni && ni->if_index && *(ni->if_name))
+++ {
+++ /* at result[i], we store.. */
+++ lua_pushnumber(L, i);
+++
+++ /* new table with two items - index, name*/
+++ lua_newtable(L);
+++ lua_pushstring(L, "index");
+++ lua_pushnumber(L, ni->if_index);
+++ lua_settable(L, -3);
+++
+++ lua_pushstring(L, "name");
+++ lua_pushstring(L, ni->if_name);
+++ lua_settable(L, -3);
+++
+++ /* Then, actually store it */
+++ lua_settable(L, -3);
+++
+++ i++;
+++ ni++;
+++ }
+++ if_freenameindex(oni);
+++ return 1;
+++}
++diff --git a/src/if.h b/src/if.h
++new file mode 100644
++index 0000000..dc7faf8
++--- /dev/null
+++++ b/src/if.h
++@@ -0,0 +1,27 @@
+++/*
+++ * $Id: if.h $
+++ *
+++ * Author: Markus Stenberg <fingon@iki.fi>
+++ *
+++ * Copyright (c) 2012 cisco Systems, Inc.
+++ *
+++ * Created: Tue Dec 4 14:37:24 2012 mstenber
+++ * Last modified: Tue Dec 4 14:51:43 2012 mstenber
+++ * Edit time: 7 min
+++ *
+++ */
+++
+++/* This module provides Lua wrapping for the advanced socket API
+++ * defined in RFC3542, or mainly, the access to the system's interface
+++ * list. It is necessary for use of recvmsg/sendmsg.
+++ *
+++ * TODO - Do something clever with Windows?
+++ */
+++#ifndef IF_H
+++#define IF_H
+++
+++#include "lua.h"
+++
+++int if_open(lua_State *L);
+++
+++#endif /* IF_H */
++diff --git a/src/luasocket.c b/src/luasocket.c
++index e6ee747..85d41a6 100644
++--- a/src/luasocket.c
+++++ b/src/luasocket.c
++@@ -31,6 +31,7 @@
++ #include "tcp.h"
++ #include "udp.h"
++ #include "select.h"
+++#include "if.h"
++
++ /*-------------------------------------------------------------------------*\
++ * Internal function prototypes
++@@ -51,6 +52,7 @@ static const luaL_Reg mod[] = {
++ {"tcp", tcp_open},
++ {"udp", udp_open},
++ {"select", select_open},
+++ {"iface", if_open},
++ {NULL, NULL}
++ };
++
++diff --git a/src/makefile b/src/makefile
++index 8d3521e..09d4882 100644
++--- a/src/makefile
+++++ b/src/makefile
++@@ -262,6 +262,7 @@ SOCKET_OBJS= \
++ auxiliar.$(O) \
++ options.$(O) \
++ inet.$(O) \
+++ if.$(O) \
++ $(SOCKET) \
++ except.$(O) \
++ select.$(O) \
++@@ -387,6 +388,7 @@ auxiliar.$(O): auxiliar.c auxiliar.h
++ buffer.$(O): buffer.c buffer.h io.h timeout.h
++ except.$(O): except.c except.h
++ inet.$(O): inet.c inet.h socket.h io.h timeout.h usocket.h
+++if.$(O): if.c if.h
++ io.$(O): io.c io.h timeout.h
++ luasocket.$(O): luasocket.c luasocket.h auxiliar.h except.h \
++ timeout.h buffer.h io.h inet.h socket.h usocket.h tcp.h \
++diff --git a/src/options.c b/src/options.c
++index 8ac2a14..1c73e6f 100644
++--- a/src/options.c
+++++ b/src/options.c
++@@ -3,6 +3,9 @@
++ * LuaSocket toolkit
++ \*=========================================================================*/
++ #include <string.h>
+++#include <sys/types.h>
+++#include <sys/socket.h>
+++#include <net/if.h>
++
++ #include "lauxlib.h"
++
++@@ -285,6 +288,12 @@ static int opt_ip6_setmembership(lua_State *L, p_socket ps, int level, int name)
++ if (!lua_isnil(L, -1)) {
++ if (lua_isnumber(L, -1)) {
++ val.ipv6mr_interface = (unsigned int) lua_tonumber(L, -1);
+++ } else if (lua_isstring(L, -1)) {
+++ if (!(val.ipv6mr_interface = if_nametoindex(lua_tostring(L, -1)))) {
+++ lua_pushnil(L);
+++ lua_pushstring(L, "nonexistent interface");
+++ return 2;
+++ }
++ } else
++ luaL_argerror(L, -1, "number 'interface' field expected");
++ }
++--
++1.8.4.rc3
++
+diff --git a/feeds/packages/lang/luasql/Makefile b/feeds/packages/lang/luasql/Makefile
+new file mode 100644
+index 0000000..204d6cc
+--- /dev/null
++++ b/feeds/packages/lang/luasql/Makefile
+@@ -0,0 +1,118 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luasql
++PKG_VERSION:=2.3.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://github.com/keplerproject/luasql.git
++PKG_SOURCE_VERSION:=v$(PKG_VERSION)
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=docs/us/license.html
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luasql/Default
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua SQL binding
++ URL:=http://www.keplerproject.org/luasql/
++ DEPENDS:= +lua
++endef
++
++define Package/luasql/Default/description
++ LuaSQL is a simple interface from Lua to a DBMS.
++endef
++
++
++define Package/luasql-mysql
++$(call Package/luasql/Default)
++ TITLE+= for MySQL
++ DEPENDS+= +libmysqlclient
++ VARIANT:=mysql
++endef
++
++define Package/luasql-mysql/description
++$(call Package/luasql/Default/description)
++ .
++ This package contains the MySQL binding.
++endef
++
++
++define Package/luasql-pgsql
++$(call Package/luasql/Default)
++ TITLE+= for PostgreSQL
++ DEPENDS+= +libpq
++ VARIANT:=postgres
++endef
++
++define Package/luasql-pgsql/description
++$(call Package/luasql/Default/description)
++ .
++ This package contains the PostgreSQL binding.
++endef
++
++
++define Package/luasql-sqlite3
++$(call Package/luasql/Default)
++ TITLE+= for SQLite 3
++ DEPENDS+= +libsqlite3
++ VARIANT:=sqlite3
++endef
++
++define Package/luasql-sqlite3/description
++$(call Package/luasql/Default/description)
++ .
++ This package contains the SQLite 3 binding.
++endef
++
++
++TARGET_CFLAGS += $(FPIC) -std=gnu99
++TARGET_CPPFLAGS += -DLUA_USE_LINUX
++
++ifeq ($(BUILD_VARIANT),mysql)
++ TARGET_CPPFLAGS += -I$(STAGING_DIR)/usr/include/mysql
++ TARGET_LDFLAGS += -L$(STAGING_DIR)/usr/lib/mysql -lmysqlclient -lz
++endif
++
++ifeq ($(BUILD_VARIANT),postgres)
++ TARGET_LDFLAGS += -lpq
++endif
++
++ifeq ($(BUILD_VARIANT),sqlite3)
++ TARGET_LDFLAGS += -lsqlite3 -lpthread
++endif
++
++MAKE_FLAGS += \
++ T="$(BUILD_VARIANT)" \
++ DRIVER_INCS="$(TARGET_CPPFLAGS)" \
++ DRIVER_LIBS="$(TARGET_LDFLAGS)" \
++ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
++ lib
++
++define Package/Install/Default
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luasql
++ $(CP) $(PKG_BUILD_DIR)/src/*.so $(1)/usr/lib/lua/luasql/
++endef
++
++Package/luasql-mysql/install = $(Package/Install/Default)
++Package/luasql-pgsql/install = $(Package/Install/Default)
++Package/luasql-sqlite3/install = $(Package/Install/Default)
++
++$(eval $(call BuildPackage,luasql-mysql))
++$(eval $(call BuildPackage,luasql-pgsql))
++$(eval $(call BuildPackage,luasql-sqlite3))
+diff --git a/feeds/packages/lang/lzmq/Makefile b/feeds/packages/lang/lzmq/Makefile
+new file mode 100644
+index 0000000..b17b945
+--- /dev/null
++++ b/feeds/packages/lang/lzmq/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lzmq
++PKG_VERSION:=0.4.3
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://codeload.github.com/zeromq/lzmq/tar.gz/v$(PKG_VERSION)?
++PKG_MD5SUM:=c4e51a60a5a26987bdce59e45d674a9e
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/lzmq
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lua ZeroMQ binding
++ URL:=https://github.com/moteus/lzmq/
++ DEPENDS:= +lua +libzmq
++endef
++
++define Package/lzmq/description
++ LZMQ is a Lua binding to ZeroMQ.
++endef
++
++CMAKE_OPTIONS += \
++ -DUSE_LUA=ON
++
++define Package/lzmq/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lzmq.so $(1)/usr/lib/lua/
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/lzmq
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lzmq/timer.so $(1)/usr/lib/lua/lzmq
++ $(CP) -R $(PKG_BUILD_DIR)/src/lua/lzmq/* $(1)/usr/lib/lua/lzmq
++endef
++
++$(eval $(call BuildPackage,lzmq))
+diff --git a/feeds/packages/lang/micropython-lib/Makefile b/feeds/packages/lang/micropython-lib/Makefile
+new file mode 100644
+index 0000000..b8af737
+--- /dev/null
++++ b/feeds/packages/lang/micropython-lib/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=micropython-lib
++PKG_VERSION=0.5-20150827-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
++PKG_LICENSE:=MIT, PSFL
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/micropython/micropython-lib.git
++PKG_SOURCE_VERSION:=bfbbf85a181d84e2494ea6f15be311734666bf67
++
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION)
++PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/micropython-lib
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=micropython-lib
++ URL:=https://github.com/micropython/micropython-lib
++ DEPENDS:=+micropython
++endef
++
++define Package/micropython-lib/description
++ This package contains micropython-lib, a project to develop a non-monolothic
++ standard library for Micro Python. Note that this is a work in progress and
++ several libraries may be missing, incomplete or buggy.
++endef
++
++MAKE_FLAGS:=\
++ -C $(PKG_BUILD_DIR) \
++ PREFIX=$(PKG_BUILD_DIR)/_install_tmp \
++ install
++
++define Package/micropython-lib/install
++ $(INSTALL_DIR) $(1)/usr/lib/micropython
++ $(CP) $(PKG_BUILD_DIR)/_install_tmp/* $(1)/usr/lib/micropython
++endef
++
++$(eval $(call BuildPackage,micropython-lib))
++
+diff --git a/feeds/packages/lang/micropython/Makefile b/feeds/packages/lang/micropython/Makefile
+new file mode 100644
+index 0000000..b83a500
+--- /dev/null
++++ b/feeds/packages/lang/micropython/Makefile
+@@ -0,0 +1,52 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=micropython
++PKG_VERSION=1.4.5-20150827-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/micropython/micropython.git
++PKG_SOURCE_VERSION:=936e25b164d837fc91e4bafd76580e747b235dff
++
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/micropython
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Micro Python
++ URL:=http://micropython.org
++ DEPENDS:=+libffi
++endef
++
++define Package/micropython/description
++ This package contains Micro Python, a lean and fast implementation of the Python 3.4 programming language
++ that is optimised to run on a microcontroller (and low power computers).
++endef
++
++MAKE_FLAGS += \
++ -C $(PKG_BUILD_DIR)/unix \
++ MICROPY_USE_READLINE=0
++
++define Package/micropython/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/unix/micropython $(1)/usr/bin/micropython
++endef
++
++$(eval $(call BuildPackage,micropython))
+diff --git a/feeds/packages/lang/node-arduino-firmata/Makefile b/feeds/packages/lang/node-arduino-firmata/Makefile
+new file mode 100644
+index 0000000..aced070
+--- /dev/null
++++ b/feeds/packages/lang/node-arduino-firmata/Makefile
+@@ -0,0 +1,67 @@
++#
++# Copyright (C) 2014 Arduino LLC
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NPM_NAME:=arduino-firmata
++PKG_NAME:=node-$(PKG_NPM_NAME)
++PKG_VERSION:=0.3.3
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/shokai/node-arduino-firmata.git
++PKG_SOURCE_VERSION:=16e76007edf218d72df590adbd711ac6b7432845
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_BUILD_DEPENDS:=node
++PKG_NODE_VERSION:=0.12.7
++
++PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILE:=LICENSE.txt
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/node-arduino-firmata
++ DEPENDS:=+node
++ SUBMENU:=Node.js
++ SECTION:=lang
++ CATEGORY:=Languages
++ DEPENDS:=+node +node-serialport
++ TITLE:=Node.js package to access serial ports for reading and writing
++ URL:=https://www.npmjs.org/package/serialport
++endef
++
++define Package/node-arduino-firmata/description
++ Node.js package to access serial ports for reading and writing OR Welcome your robotic JavaScript overlords. Better yet, program them!
++endef
++
++define Build/Prepare
++ /bin/tar xzf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_BUILD_DIR) --strip-components 1
++ $(Build/Patch)
++endef
++
++EXTRA_LDFLAGS="-L$(TOOLCHAIN_DIR)/lib/ -Wl,-rpath-link $(TOOLCHAIN_DIR)/lib/" \
++
++define Build/Compile
++ $(MAKE_FLAGS) \
++ npm_config_arch=$(CONFIG_ARCH) \
++ npm_config_nodedir=$(BUILD_DIR)/node-v$(PKG_NODE_VERSION)/ \
++ PREFIX="$(PKG_INSTALL_DIR)/usr/" \
++ $(STAGING_DIR_HOST)/bin/npm install -g $(PKG_BUILD_DIR)
++endef
++
++define Package/node-arduino-firmata/install
++ mkdir -p $(1)/usr/lib/node
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/* $(1)/usr/lib/node
++ rm -rf $(1)/usr/lib/node/arduino-firmata/node_modules/serialport/
++ $(CP) -r ./files/* $(1)/
++endef
++
++$(eval $(call BuildPackage,node-arduino-firmata))
++
+diff --git a/feeds/packages/lang/node-arduino-firmata/files/usr/lib/node/arduino-firmata/lib/arduino-firmata.js b/feeds/packages/lang/node-arduino-firmata/files/usr/lib/node/arduino-firmata/lib/arduino-firmata.js
+new file mode 100644
+index 0000000..578bd40
+--- /dev/null
++++ b/feeds/packages/lang/node-arduino-firmata/files/usr/lib/node/arduino-firmata/lib/arduino-firmata.js
+@@ -0,0 +1,306 @@
++(function() {
++ 'use strict';
++ var ArduinoFirmata, SerialPort, debug, events, exports, serialport,
++ extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
++ hasProp = {}.hasOwnProperty;
++
++ events = require('eventemitter2');
++
++ SerialPort = (serialport = require('serialport')).SerialPort;
++
++ debug = require('debug')('arduino-firmata');
++
++ exports = module.exports = ArduinoFirmata = (function(superClass) {
++ extend(ArduinoFirmata, superClass);
++
++ ArduinoFirmata.Status = {
++ CLOSE: 0,
++ OPEN: 1
++ };
++
++ ArduinoFirmata.INPUT = 0;
++
++ ArduinoFirmata.OUTPUT = 1;
++
++ ArduinoFirmata.ANALOG = 2;
++
++ ArduinoFirmata.PWM = 3;
++
++ ArduinoFirmata.SERVO = 4;
++
++ ArduinoFirmata.SHIFT = 5;
++
++ ArduinoFirmata.I2C = 6;
++
++ ArduinoFirmata.LOW = 0;
++
++ ArduinoFirmata.HIGH = 1;
++
++ ArduinoFirmata.MAX_DATA_BYTES = 32;
++
++ ArduinoFirmata.DIGITAL_MESSAGE = 0x90;
++
++ ArduinoFirmata.ANALOG_MESSAGE = 0xE0;
++
++ ArduinoFirmata.REPORT_ANALOG = 0xC0;
++
++ ArduinoFirmata.REPORT_DIGITAL = 0xD0;
++
++ ArduinoFirmata.SET_PIN_MODE = 0xF4;
++
++ ArduinoFirmata.REPORT_VERSION = 0xF9;
++
++ ArduinoFirmata.SYSTEM_RESET = 0xFF;
++
++ ArduinoFirmata.START_SYSEX = 0xF0;
++
++ ArduinoFirmata.END_SYSEX = 0xF7;
++
++ ArduinoFirmata.list = function(callback) {
++ return serialport.list(function(err, ports) {
++ var devices, j, len, port;
++ if (err) {
++ return callback(err);
++ }
++ devices = [];
++ for (j = 0, len = ports.length; j < len; j++) {
++ port = ports[j];
++ if (/usb|acm|com\d+/i.test(port.comName)) {
++ devices.push(port.comName);
++ }
++ }
++ return callback(null, devices);
++ });
++ };
++
++ function ArduinoFirmata() {
++ this.status = ArduinoFirmata.Status.CLOSE;
++ this.wait_for_data = 0;
++ this.execute_multi_byte_command = 0;
++ this.multi_byte_channel = 0;
++ this.stored_input_data = [];
++ this.parsing_sysex = false;
++ this.sysex_bytes_read = 0;
++ this.digital_output_data = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
++ this.digital_input_data = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
++ this.analog_input_data = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
++ this.boardVersion = null;
++ }
++
++ ArduinoFirmata.prototype.isOldArduinoDevice = function() {
++ return /usbserial|USB/.test(this.serialport_name);
++ };
++
++ ArduinoFirmata.prototype.connect = function(serialport_name, opts) {
++ this.serialport_name = serialport_name;
++ if (opts == null) {
++ opts = {
++ baudrate: 57600
++ };
++ }
++ opts.parser = serialport.parsers.raw;
++ if (!this.serialport_name) {
++ ArduinoFirmata.list((function(_this) {
++ return function(err, devices) {
++ return _this.connect(devices[0], opts);
++ };
++ })(this));
++ return this;
++ }
++ this.once('boardReady', function() {
++ var io_init_wait;
++ debug('boardReady');
++ io_init_wait = this.isOldArduinoDevice() ? (debug("old arduino device found " + this.serialport_name), 3000) : (debug("new arduino device found " + this.serialport_name), 100);
++ debug("wait " + io_init_wait + "(msec)");
++ return setTimeout((function(_this) {
++ return function() {
++ var i, j, k;
++ for (i = j = 0; j < 6; i = ++j) {
++ _this.write([ArduinoFirmata.REPORT_ANALOG | i, 1]);
++ }
++ for (i = k = 0; k < 2; i = ++k) {
++ _this.write([ArduinoFirmata.REPORT_DIGITAL | i, 1]);
++ }
++ debug('init IO ports');
++ return _this.emit('connect');
++ };
++ })(this), io_init_wait);
++ });
++ this.serialport = new SerialPort(this.serialport_name, opts);
++ this.serialport.once('open', (function(_this) {
++ return function() {
++ var cid;
++ cid = setInterval(function() {
++ debug('request REPORT_VERSION');
++ return _this.write([ArduinoFirmata.REPORT_VERSION]);
++ }, 500);
++ _this.once('boardVersion', function(version) {
++ clearInterval(cid);
++ _this.status = ArduinoFirmata.Status.OPEN;
++ return _this.emit('boardReady');
++ });
++ return _this.serialport.on('data', function(data) {
++ var byte, j, len, results;
++ results = [];
++ for (j = 0, len = data.length; j < len; j++) {
++ byte = data[j];
++ results.push(_this.process_input(byte));
++ }
++ return results;
++ });
++ };
++ })(this));
++ return this;
++ };
++
++ ArduinoFirmata.prototype.isOpen = function() {
++ return this.status === ArduinoFirmata.Status.OPEN;
++ };
++
++ ArduinoFirmata.prototype.close = function(callback) {
++ this.status = ArduinoFirmata.Status.CLOSE;
++ return this.serialport.close(callback);
++ };
++
++ ArduinoFirmata.prototype.reset = function(callback) {
++ return this.write([ArduinoFirmata.SYSTEM_RESET], callback);
++ };
++
++ ArduinoFirmata.prototype.write = function(bytes, callback) {
++ return this.serialport.write(bytes, callback);
++ };
++
++ ArduinoFirmata.prototype.sysex = function(command, data, callback) {
++ var write_data;
++ if (data == null) {
++ data = [];
++ }
++ data = data.map(function(i) {
++ return i & 0x7f;
++ });
++ write_data = [ArduinoFirmata.START_SYSEX, command].concat(data, [ArduinoFirmata.END_SYSEX]);
++ return this.write(write_data, callback);
++ };
++
++ ArduinoFirmata.prototype.pinMode = function(pin, mode, callback) {
++ switch (mode) {
++ case true:
++ mode = ArduinoFirmata.OUTPUT;
++ break;
++ case false:
++ mode = ArduinoFirmata.INPUT;
++ }
++ return this.write([ArduinoFirmata.SET_PIN_MODE, pin, mode], callback);
++ };
++
++ ArduinoFirmata.prototype.digitalWrite = function(pin, value, callback) {
++ var port_num;
++ this.pinMode(pin, ArduinoFirmata.OUTPUT);
++ port_num = (pin >>> 3) & 0x0F;
++ if (value === 0 || value === false) {
++ this.digital_output_data[port_num] &= ~(1 << (pin & 0x07));
++ } else {
++ this.digital_output_data[port_num] |= 1 << (pin & 0x07);
++ }
++ return this.write([ArduinoFirmata.DIGITAL_MESSAGE | port_num, this.digital_output_data[port_num] & 0x7F, this.digital_output_data[port_num] >>> 7], callback);
++ };
++
++ ArduinoFirmata.prototype.analogWrite = function(pin, value, callback) {
++ value = Math.floor(value);
++ this.pinMode(pin, ArduinoFirmata.PWM);
++ return this.write([ArduinoFirmata.ANALOG_MESSAGE | (pin & 0x0F), value & 0x7F, value >>> 7], callback);
++ };
++
++ ArduinoFirmata.prototype.servoWrite = function(pin, angle, callback) {
++ this.pinMode(pin, ArduinoFirmata.SERVO);
++ return this.write([ArduinoFirmata.ANALOG_MESSAGE | (pin & 0x0F), angle & 0x7F, angle >>> 7], callback);
++ };
++
++ ArduinoFirmata.prototype.digitalRead = function(pin) {
++ return ((this.digital_input_data[pin >>> 3] >>> (pin & 0x07)) & 0x01) > 0;
++ };
++
++ ArduinoFirmata.prototype.analogRead = function(pin) {
++ return this.analog_input_data[pin];
++ };
++
++ ArduinoFirmata.prototype.process_input = function(input_data) {
++ var analog_value, command, diff, i, j, old_analog_value, results, stat, sysex_command, sysex_data;
++ if (this.parsing_sysex) {
++ if (input_data === ArduinoFirmata.END_SYSEX) {
++ this.parsing_sysex = false;
++ sysex_command = this.stored_input_data[0];
++ sysex_data = this.stored_input_data.slice(1, this.sysex_bytes_read);
++ return this.emit('sysex', {
++ command: sysex_command,
++ data: sysex_data
++ });
++ } else {
++ this.stored_input_data[this.sysex_bytes_read] = input_data;
++ return this.sysex_bytes_read += 1;
++ }
++ } else if (this.wait_for_data > 0 && input_data < 128) {
++ this.wait_for_data -= 1;
++ this.stored_input_data[this.wait_for_data] = input_data;
++ if (this.execute_multi_byte_command !== 0 && this.wait_for_data === 0) {
++ switch (this.execute_multi_byte_command) {
++ case ArduinoFirmata.DIGITAL_MESSAGE:
++ input_data = (this.stored_input_data[0] << 7) + this.stored_input_data[1];
++ diff = this.digital_input_data[this.multi_byte_channel] ^ input_data;
++ this.digital_input_data[this.multi_byte_channel] = input_data;
++ if (this.listeners('digitalChange').length > 0) {
++ results = [];
++ for (i = j = 0; j <= 13; i = ++j) {
++ if (((0x01 << i) & diff) > 0) {
++ stat = (input_data & diff) > 0;
++ results.push(this.emit('digitalChange', {
++ pin: i + this.multi_byte_channel * 8,
++ value: stat,
++ old_value: !stat
++ }));
++ } else {
++ results.push(void 0);
++ }
++ }
++ return results;
++ }
++ break;
++ case ArduinoFirmata.ANALOG_MESSAGE:
++ analog_value = (this.stored_input_data[0] << 7) + this.stored_input_data[1];
++ old_analog_value = this.analogRead(this.multi_byte_channel);
++ this.analog_input_data[this.multi_byte_channel] = analog_value;
++ if (old_analog_value !== analog_value) {
++ return this.emit('analogChange', {
++ pin: this.multi_byte_channel,
++ value: analog_value,
++ old_value: old_analog_value
++ });
++ }
++ break;
++ case ArduinoFirmata.REPORT_VERSION:
++ this.boardVersion = this.stored_input_data[1] + "." + this.stored_input_data[0];
++ return this.emit('boardVersion', this.boardVersion);
++ }
++ }
++ } else {
++ if (input_data < 0xF0) {
++ command = input_data & 0xF0;
++ this.multi_byte_channel = input_data & 0x0F;
++ } else {
++ command = input_data;
++ }
++ if (command === ArduinoFirmata.START_SYSEX) {
++ this.parsing_sysex = true;
++ return this.sysex_bytes_read = 0;
++ } else if (command === ArduinoFirmata.DIGITAL_MESSAGE || command === ArduinoFirmata.ANALOG_MESSAGE || command === ArduinoFirmata.REPORT_VERSION) {
++ this.wait_for_data = 2;
++ return this.execute_multi_byte_command = command;
++ }
++ }
++ };
++
++ return ArduinoFirmata;
++
++ })(events.EventEmitter2);
++
++}).call(this);
+diff --git a/feeds/packages/lang/node-arduino-firmata/patches/000-new-serialport.patch b/feeds/packages/lang/node-arduino-firmata/patches/000-new-serialport.patch
+new file mode 100644
+index 0000000..10eab64
+--- /dev/null
++++ b/feeds/packages/lang/node-arduino-firmata/patches/000-new-serialport.patch
+@@ -0,0 +1,10 @@
++--- a/package.json
+++++ b/package.json
++@@ -30,7 +30,6 @@
++ "author": "Sho Hashimoto <hashimoto@shokai.org>",
++ "license": "MIT",
++ "dependencies": {
++- "serialport": "*",
++ "eventemitter2": "*",
++ "debug": "*"
++ },
+diff --git a/feeds/packages/lang/node-cylon/Makefile b/feeds/packages/lang/node-cylon/Makefile
+new file mode 100644
+index 0000000..753ae23
+--- /dev/null
++++ b/feeds/packages/lang/node-cylon/Makefile
+@@ -0,0 +1,98 @@
++#
++# Copyright (C) 2014 Arduino LLC
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NPM_NAME:=cylon
++PKG_NAME:=node-$(PKG_NPM_NAME)
++PKG_VERSION:=0.22.0
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/hybridgroup/cylon-firmata.git
++PKG_SOURCE_VERSION:=0c37da77e48b3e2cc3a8d566822a17689de91b40
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_BUILD_DEPENDS:=node
++PKG_NODE_VERSION:=0.12.7
++
++PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
++PKG_LICENSE:=Apache-2.0
++PKG_LICENSE_FILE:=LICENSE
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/node-cylon/default
++ DEPENDS:=+node $(2)
++ SUBMENU:=Node.js
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=CylonJS - $(1)
++ URL:=https://www.npmjs.org/package/cylon
++endef
++
++define Package/node-cylon
++ $(call Package/node-cylon/default,Core)
++endef
++
++define Package/node-cylon-i2c
++ $(call Package/node-cylon/default,I2C,+node-cylon)
++endef
++
++define Package/node-cylon-gpio
++ $(call Package/node-cylon/default,GPIO,+node-cylon)
++endef
++
++define Package/node-cylon-firmata
++ $(call Package/node-cylon/default,Firmata,+node-cylon-gpio +node-cylon-i2c +node-arduino-firmata)
++endef
++
++define Package/node-cylon/description
++ JavaScript Robotics, By Your Command Next generation robotics framework with support for 36 different platforms Get Started
++endef
++
++define Build/Prepare
++ /bin/tar xzf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_BUILD_DIR) --strip-components 1
++ $(Build/Patch)
++endef
++
++EXTRA_LDFLAGS="-L$(TOOLCHAIN_DIR)/lib/ -Wl,-rpath-link $(TOOLCHAIN_DIR)/lib/" \
++
++define Build/Compile
++ $(MAKE_FLAGS) \
++ npm_config_arch=$(CONFIG_ARCH) \
++ npm_config_nodedir=$(BUILD_DIR)/node-v$(PKG_NODE_VERSION)/ \
++ PREFIX="$(PKG_INSTALL_DIR)/usr/" \
++ $(STAGING_DIR_HOST)/bin/npm install -g $(PKG_BUILD_DIR)
++endef
++
++define Package/node-cylon/install
++ mkdir -p $(1)/usr/lib/node/cylon
++ $(CP) -r $(PKG_INSTALL_DIR)/usr/lib/node_modules/cylon-firmata/node_modules/cylon/* $(1)/usr/lib/node/cylon/
++endef
++
++define Package/node-cylon-i2c/install
++ mkdir -p $(1)/usr/lib/node/cylon-i2c
++ $(CP) -r $(PKG_INSTALL_DIR)/usr/lib/node_modules/cylon-firmata/node_modules/cylon-i2c/* $(1)/usr/lib/node/cylon-i2c/
++endef
++
++define Package/node-cylon-gpio/install
++ mkdir -p $(1)/usr/lib/node/cylon-gpio
++ $(CP) -r $(PKG_INSTALL_DIR)/usr/lib/node_modules/cylon-firmata/node_modules/cylon-gpio/* $(1)/usr/lib/node/cylon-gpio/
++endef
++
++define Package/node-cylon-firmata/install
++ mkdir -p $(1)/usr/lib/node/cylon-firmata
++ $(CP) -r $(PKG_INSTALL_DIR)/usr/lib/node_modules/cylon-firmata/{index.js,lib,LICENSE,package.json,README.md,RELEASES.md,spec} $(1)/usr/lib/node/cylon-firmata/
++endef
++
++$(eval $(call BuildPackage,node-cylon))
++$(eval $(call BuildPackage,node-cylon-i2c))
++$(eval $(call BuildPackage,node-cylon-gpio))
++$(eval $(call BuildPackage,node-cylon-firmata))
++
+diff --git a/feeds/packages/lang/node-cylon/patches/0001-serialport.patch b/feeds/packages/lang/node-cylon/patches/0001-serialport.patch
+new file mode 100644
+index 0000000..08d579c
+--- /dev/null
++++ b/feeds/packages/lang/node-cylon/patches/0001-serialport.patch
+@@ -0,0 +1,12 @@
++Index: node-cylon-0.22.0/package.json
++===================================================================
++--- node-cylon-0.22.0.orig/package.json 2015-10-20 20:32:48.000000000 +0200
+++++ node-cylon-0.22.0/package.json 2015-10-21 10:42:20.616109122 +0200
++@@ -38,7 +38,6 @@
++ },
++
++ "dependencies": {
++- "firmata": ">= 0.3.2",
++ "cylon": "1.1.0",
++ "cylon-gpio": "0.26.0",
++ "cylon-i2c": "0.22.0"
+diff --git a/feeds/packages/lang/node-hid/Makefile b/feeds/packages/lang/node-hid/Makefile
+new file mode 100644
+index 0000000..911e2a4
+--- /dev/null
++++ b/feeds/packages/lang/node-hid/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NPM_NAME:=hid
++PKG_NAME:=node-$(PKG_NPM_NAME)
++PKG_VERSION:=0.4.0
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/node-hid/node-hid.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=c56c8aa5d113c6f2574d1f7e64d41745702965bb
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_BUILD_DEPENDS:=node
++PKG_NODE_VERSION:=0.12.7
++
++PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
++PKG_LICENSE:=Custom
++PKG_LICENSE_FILE:=
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/node-hid
++ DEPENDS:=+node
++ SUBMENU:=Node.js
++ SECTION:=lang
++ CATEGORY:=Languages
++ DEPENDS:=+libusb-1.0 +hidapi +libstdcpp
++ TITLE:=Node.js package to access HID devices
++ URL:=https://github.com/node-hid/node-hid
++endef
++
++define Package/node-hid/description
++ Node.js package to access HID devices
++endef
++
++EXTRA_LDFLAGS+="-lhidapi-libusb"
++EXTRA_CFLAGS+="-I$(STAGING_DIR)/usr/include/hidapi/"
++
++define Build/Compile
++ $(MAKE_VARS) \
++ $(MAKE_FLAGS) \
++ npm_config_arch=$(CONFIG_ARCH) \
++ npm_config_nodedir=$(BUILD_DIR)/node-v$(PKG_NODE_VERSION)/ \
++ PREFIX="$(PKG_INSTALL_DIR)/usr/" \
++ $(STAGING_DIR_HOST)/bin/npm install -g $(PKG_BUILD_DIR)
++endef
++
++define Package/node-hid/install
++ mkdir -p $(1)/usr/lib/node/node-hid/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/node-hid/{index.js,package.json,build,node_modules} $(1)/usr/lib/node/node-hid/
++endef
++
++$(eval $(call BuildPackage,node-hid))
++
+diff --git a/feeds/packages/lang/node-hid/patches/000-compile.patch b/feeds/packages/lang/node-hid/patches/000-compile.patch
+new file mode 100644
+index 0000000..d44e9b3
+--- /dev/null
++++ b/feeds/packages/lang/node-hid/patches/000-compile.patch
+@@ -0,0 +1,2457 @@
++--- a/package.json
+++++ b/package.json
++@@ -14,9 +14,6 @@
++ "type": "git",
++ "url": "git://github.com/hanshuebner/node-hid.git"
++ },
++- "scripts": {
++- "prepublish": "git submodule update --init"
++- },
++ "main": "./index.js",
++ "engines": {
++ "node": ">=0.8.0"
++--- a/src/wscript
+++++ b/src/wscript
++@@ -3,10 +3,8 @@
++ import sys;
++ import os;
++
++-hidapi_home='../hidapi'
++
++ cflags=["-g", "-D_FILE_OFFSET_BITS=64", "-D_LARGEFILE_SOURCE", "-Wall", "-fPIC" ]
++-includes=[ hidapi_home + "/hidapi" ]
++
++ def set_options(opt):
++ opt.tool_options("compiler_cxx")
++@@ -16,24 +14,10 @@
++ conf.check_tool("compiler_cxx")
++ conf.check_tool("node_addon")
++ conf.check_tool("compiler_cc")
++- if sys.platform == 'darwin':
++- conf.env.append_value('LINKFLAGS', ['Release/libhidapi.a', '-framework', 'IOKit', '-framework', 'CoreFoundation'])
++- else:
++- conf.env.append_value('LINKFLAGS', ['Release/libhidapi.a', '-ludev' ])
++-
++-def build(bld):
++- bld.add_group("hidapi")
++- hidapi = bld.new_task_gen("cc", "staticlib")
++- hidapi.includes = includes
++- hidapi.cflags = cflags
++- if sys.platform == 'darwin':
++- hidapi.source = "../hidapi/mac/hid.c"
++- else:
++- hidapi.source = "../hidapi/linux/hid.c"
++- hidapi.target = "hidapi"
++
+++def build(bld):
++ bld.add_group("adapter")
++- adapter = bld.new_task_gen("cxx", "shlib", "node_addon", use = ['hidapi'])
+++ adapter = bld.new_task_gen("cxx", "shlib", "node_addon")
++ adapter.includes = includes
++ adapter.cxxflags = cflags
++ adapter.target = "HID"
++--- a/binding.gyp
+++++ b/binding.gyp
++@@ -4,61 +4,8 @@
++ },
++ 'targets': [
++ {
++- 'target_name': 'hidapi',
++- 'type': 'static_library',
++- 'conditions': [
++- [ 'OS=="mac"', {
++- 'sources': [ 'hidapi/mac/hid.c' ],
++- 'include_dirs+': [
++- '/usr/include/libusb-1.0/'
++- ]
++- }],
++- [ 'OS=="linux"', {
++- 'conditions': [
++- [ 'driver=="libusb"', {
++- 'sources': [ 'hidapi/libusb/hid.c' ],
++- 'include_dirs+': [
++- '/usr/include/libusb-1.0/'
++- ]
++- }],
++- [ 'driver=="hidraw"', {
++- 'sources': [ 'hidapi/linux/hid.c' ]
++- }]
++- ]
++- }],
++- [ 'OS=="win"', {
++- 'sources': [ 'hidapi/windows/hid.c' ],
++- 'msvs_settings': {
++- 'VCLinkerTool': {
++- 'AdditionalDependencies': [
++- 'setupapi.lib',
++- ]
++- }
++- }
++- }]
++- ],
++- 'direct_dependent_settings': {
++- 'include_dirs': [
++- 'hidapi/hidapi',
++- "<!(node -e \"require('nan')\")"
++- ]
++- },
++- 'include_dirs': [
++- 'hidapi/hidapi'
++- ],
++- 'defines': [
++- '_LARGEFILE_SOURCE',
++- '_FILE_OFFSET_BITS=64',
++- ],
++- 'cflags': ['-g'],
++- 'cflags!': [
++- '-ansi'
++- ]
++- },
++- {
++ 'target_name': 'HID',
++ 'sources': [ 'src/HID.cc' ],
++- 'dependencies': ['hidapi'],
++ 'defines': [
++ '_LARGEFILE_SOURCE',
++ '_FILE_OFFSET_BITS=64',
++@@ -108,4 +55,4 @@
++ 'cflags_cc': ['-g', '-exceptions']
++ }
++ ]
++-}
++\ No newline at end of file
+++}
++--- /dev/null
+++++ b/src/nan.h
++@@ -0,0 +1,2331 @@
+++/**********************************************************************************
+++ * NAN - Native Abstractions for Node.js
+++ *
+++ * Copyright (c) 2014 NAN contributors:
+++ * - Rod Vagg <https://github.com/rvagg>
+++ * - Benjamin Byholm <https://github.com/kkoopa>
+++ * - Trevor Norris <https://github.com/trevnorris>
+++ * - Nathan Rajlich <https://github.com/TooTallNate>
+++ * - Brett Lawson <https://github.com/brett19>
+++ * - Ben Noordhuis <https://github.com/bnoordhuis>
+++ *
+++ * MIT +no-false-attribs License <https://github.com/rvagg/nan/blob/master/LICENSE>
+++ *
+++ * Version 1.3.0: current Node unstable: 0.11.13, Node stable: 0.10.30
+++ *
+++ * See https://github.com/rvagg/nan for the latest update to this file
+++ **********************************************************************************/
+++
+++#ifndef NAN_H_
+++#define NAN_H_
+++
+++#include <uv.h>
+++#include <node.h>
+++#include <node_buffer.h>
+++#include <node_version.h>
+++#include <node_object_wrap.h>
+++#include <string.h>
+++#include <limits.h>
+++#include <string>
+++
+++#if defined(__GNUC__) && !defined(DEBUG)
+++# define NAN_INLINE inline __attribute__((always_inline))
+++#elif defined(_MSC_VER) && !defined(DEBUG)
+++# define NAN_INLINE __forceinline
+++#else
+++# define NAN_INLINE inline
+++#endif
+++
+++#if defined(__GNUC__) && !V8_DISABLE_DEPRECATIONS
+++# define NAN_DEPRECATED __attribute__((deprecated))
+++#elif defined(_MSC_VER) && !V8_DISABLE_DEPRECATIONS
+++# define NAN_DEPRECATED __declspec(deprecated)
+++#else
+++# define NAN_DEPRECATED
+++#endif
+++
+++// some generic helpers
+++
+++template<typename T> NAN_INLINE bool NanSetPointerSafe(
+++ T *var
+++ , T val
+++) {
+++ if (var) {
+++ *var = val;
+++ return true;
+++ } else {
+++ return false;
+++ }
+++}
+++
+++template<typename T> NAN_INLINE T NanGetPointerSafe(
+++ T *var
+++ , T fallback = reinterpret_cast<T>(0)
+++) {
+++ if (var) {
+++ return *var;
+++ } else {
+++ return fallback;
+++ }
+++}
+++
+++NAN_INLINE bool NanBooleanOptionValue(
+++ v8::Local<v8::Object> optionsObj
+++ , v8::Handle<v8::String> opt, bool def
+++) {
+++ if (def) {
+++ return optionsObj.IsEmpty()
+++ || !optionsObj->Has(opt)
+++ || optionsObj->Get(opt)->BooleanValue();
+++ } else {
+++ return !optionsObj.IsEmpty()
+++ && optionsObj->Has(opt)
+++ && optionsObj->Get(opt)->BooleanValue();
+++ }
+++}
+++
+++NAN_INLINE bool NanBooleanOptionValue(
+++ v8::Local<v8::Object> optionsObj
+++ , v8::Handle<v8::String> opt
+++) {
+++ return NanBooleanOptionValue(optionsObj, opt, false);
+++}
+++
+++NAN_INLINE uint32_t NanUInt32OptionValue(
+++ v8::Local<v8::Object> optionsObj
+++ , v8::Handle<v8::String> opt
+++ , uint32_t def
+++) {
+++ return !optionsObj.IsEmpty()
+++ && optionsObj->Has(opt)
+++ && optionsObj->Get(opt)->IsNumber()
+++ ? optionsObj->Get(opt)->Uint32Value()
+++ : def;
+++}
+++
+++#if (NODE_MODULE_VERSION > 0x000B)
+++// Node 0.11+ (0.11.3 and below won't compile with these)
+++
+++# define _NAN_METHOD_ARGS_TYPE const v8::FunctionCallbackInfo<v8::Value>&
+++# define _NAN_METHOD_ARGS _NAN_METHOD_ARGS_TYPE args
+++# define _NAN_METHOD_RETURN_TYPE void
+++
+++# define _NAN_GETTER_ARGS_TYPE const v8::PropertyCallbackInfo<v8::Value>&
+++# define _NAN_GETTER_ARGS _NAN_GETTER_ARGS_TYPE args
+++# define _NAN_GETTER_RETURN_TYPE void
+++
+++# define _NAN_SETTER_ARGS_TYPE const v8::PropertyCallbackInfo<void>&
+++# define _NAN_SETTER_ARGS _NAN_SETTER_ARGS_TYPE args
+++# define _NAN_SETTER_RETURN_TYPE void
+++
+++# define _NAN_PROPERTY_GETTER_ARGS_TYPE \
+++ const v8::PropertyCallbackInfo<v8::Value>&
+++# define _NAN_PROPERTY_GETTER_ARGS _NAN_PROPERTY_GETTER_ARGS_TYPE args
+++# define _NAN_PROPERTY_GETTER_RETURN_TYPE void
+++
+++# define _NAN_PROPERTY_SETTER_ARGS_TYPE \
+++ const v8::PropertyCallbackInfo<v8::Value>&
+++# define _NAN_PROPERTY_SETTER_ARGS _NAN_PROPERTY_SETTER_ARGS_TYPE args
+++# define _NAN_PROPERTY_SETTER_RETURN_TYPE void
+++
+++# define _NAN_PROPERTY_ENUMERATOR_ARGS_TYPE \
+++ const v8::PropertyCallbackInfo<v8::Array>&
+++# define _NAN_PROPERTY_ENUMERATOR_ARGS _NAN_PROPERTY_ENUMERATOR_ARGS_TYPE args
+++# define _NAN_PROPERTY_ENUMERATOR_RETURN_TYPE void
+++
+++# define _NAN_PROPERTY_DELETER_ARGS_TYPE \
+++ const v8::PropertyCallbackInfo<v8::Boolean>&
+++# define _NAN_PROPERTY_DELETER_ARGS \
+++ _NAN_PROPERTY_DELETER_ARGS_TYPE args
+++# define _NAN_PROPERTY_DELETER_RETURN_TYPE void
+++
+++# define _NAN_PROPERTY_QUERY_ARGS_TYPE \
+++ const v8::PropertyCallbackInfo<v8::Integer>&
+++# define _NAN_PROPERTY_QUERY_ARGS _NAN_PROPERTY_QUERY_ARGS_TYPE args
+++# define _NAN_PROPERTY_QUERY_RETURN_TYPE void
+++
+++# define _NAN_INDEX_GETTER_ARGS_TYPE \
+++ const v8::PropertyCallbackInfo<v8::Value>&
+++# define _NAN_INDEX_GETTER_ARGS _NAN_INDEX_GETTER_ARGS_TYPE args
+++# define _NAN_INDEX_GETTER_RETURN_TYPE void
+++
+++# define _NAN_INDEX_SETTER_ARGS_TYPE \
+++ const v8::PropertyCallbackInfo<v8::Value>&
+++# define _NAN_INDEX_SETTER_ARGS _NAN_INDEX_SETTER_ARGS_TYPE args
+++# define _NAN_INDEX_SETTER_RETURN_TYPE void
+++
+++# define _NAN_INDEX_ENUMERATOR_ARGS_TYPE \
+++ const v8::PropertyCallbackInfo<v8::Array>&
+++# define _NAN_INDEX_ENUMERATOR_ARGS _NAN_INDEX_ENUMERATOR_ARGS_TYPE args
+++# define _NAN_INDEX_ENUMERATOR_RETURN_TYPE void
+++
+++# define _NAN_INDEX_DELETER_ARGS_TYPE \
+++ const v8::PropertyCallbackInfo<v8::Boolean>&
+++# define _NAN_INDEX_DELETER_ARGS _NAN_INDEX_DELETER_ARGS_TYPE args
+++# define _NAN_INDEX_DELETER_RETURN_TYPE void
+++
+++# define _NAN_INDEX_QUERY_ARGS_TYPE \
+++ const v8::PropertyCallbackInfo<v8::Integer>&
+++# define _NAN_INDEX_QUERY_ARGS _NAN_INDEX_QUERY_ARGS_TYPE args
+++# define _NAN_INDEX_QUERY_RETURN_TYPE void
+++
+++ typedef v8::FunctionCallback NanFunctionCallback;
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<T> NanNew() {
+++ return T::New(v8::Isolate::GetCurrent());
+++ }
+++
+++ template<typename T, typename P>
+++ NAN_INLINE v8::Local<T> NanNew(P arg1) {
+++ return T::New(v8::Isolate::GetCurrent(), arg1);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<v8::Signature> NanNew(
+++ v8::Handle<v8::FunctionTemplate> receiver
+++ , int argc
+++ , v8::Handle<v8::FunctionTemplate> argv[] = 0) {
+++ return v8::Signature::New(v8::Isolate::GetCurrent(), receiver, argc, argv);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<v8::FunctionTemplate> NanNew(
+++ NanFunctionCallback callback
+++ , v8::Handle<v8::Value> data = v8::Handle<v8::Value>()
+++ , v8::Handle<v8::Signature> signature = v8::Handle<v8::Signature>()) {
+++ return T::New(v8::Isolate::GetCurrent(), callback, data, signature);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<T> NanNew(v8::Handle<T> arg1) {
+++ return v8::Local<T>::New(v8::Isolate::GetCurrent(), arg1);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<T> NanNew(const v8::Persistent<T> &arg1) {
+++ return v8::Local<T>::New(v8::Isolate::GetCurrent(), arg1);
+++ }
+++
+++ template<typename T, typename P>
+++ NAN_INLINE v8::Local<T> NanNew(P arg1, int arg2) {
+++ return T::New(v8::Isolate::GetCurrent(), arg1, arg2);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Array> NanNew<v8::Array>() {
+++ return v8::Array::New(v8::Isolate::GetCurrent());
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Array> NanNew<v8::Array>(int length) {
+++ return v8::Array::New(v8::Isolate::GetCurrent(), length);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Date> NanNew<v8::Date>(double time) {
+++ return v8::Date::New(v8::Isolate::GetCurrent(), time).As<v8::Date>();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Date> NanNew<v8::Date>(int time) {
+++ return v8::Date::New(v8::Isolate::GetCurrent(), time).As<v8::Date>();
+++ }
+++
+++ typedef v8::UnboundScript NanUnboundScript;
+++ typedef v8::Script NanBoundScript;
+++
+++ template<typename T, typename P>
+++ NAN_INLINE v8::Local<T> NanNew(
+++ P s
+++ , const v8::ScriptOrigin& origin
+++ ) {
+++ v8::ScriptCompiler::Source source(s, origin);
+++ return v8::ScriptCompiler::CompileUnbound(
+++ v8::Isolate::GetCurrent(), &source);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<NanUnboundScript> NanNew<NanUnboundScript>(
+++ v8::Local<v8::String> s
+++ ) {
+++ v8::ScriptCompiler::Source source(s);
+++ return v8::ScriptCompiler::CompileUnbound(
+++ v8::Isolate::GetCurrent(), &source);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::BooleanObject> NanNew(bool value) {
+++ return v8::BooleanObject::New(value).As<v8::BooleanObject>();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::StringObject>
+++ NanNew<v8::StringObject, v8::Local<v8::String> >(
+++ v8::Local<v8::String> value) {
+++ return v8::StringObject::New(value).As<v8::StringObject>();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::StringObject>
+++ NanNew<v8::StringObject, v8::Handle<v8::String> >(
+++ v8::Handle<v8::String> value) {
+++ return v8::StringObject::New(value).As<v8::StringObject>();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::NumberObject> NanNew<v8::NumberObject>(double val) {
+++ return v8::NumberObject::New(
+++ v8::Isolate::GetCurrent(), val).As<v8::NumberObject>();
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<v8::RegExp> NanNew(
+++ v8::Handle<v8::String> pattern, v8::RegExp::Flags flags) {
+++ return v8::RegExp::New(pattern, flags);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<v8::RegExp> NanNew(
+++ v8::Local<v8::String> pattern, v8::RegExp::Flags flags) {
+++ return v8::RegExp::New(pattern, flags);
+++ }
+++
+++ template<typename T, typename P>
+++ NAN_INLINE v8::Local<v8::RegExp> NanNew(
+++ v8::Handle<v8::String> pattern, v8::RegExp::Flags flags) {
+++ return v8::RegExp::New(pattern, flags);
+++ }
+++
+++ template<typename T, typename P>
+++ NAN_INLINE v8::Local<v8::RegExp> NanNew(
+++ v8::Local<v8::String> pattern, v8::RegExp::Flags flags) {
+++ return v8::RegExp::New(pattern, flags);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Uint32> NanNew<v8::Uint32, int32_t>(int32_t val) {
+++ return v8::Uint32::NewFromUnsigned(
+++ v8::Isolate::GetCurrent(), val)->ToUint32();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Uint32> NanNew<v8::Uint32, uint32_t>(uint32_t val) {
+++ return v8::Uint32::NewFromUnsigned(
+++ v8::Isolate::GetCurrent(), val)->ToUint32();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Int32> NanNew<v8::Int32, int32_t>(int32_t val) {
+++ return v8::Int32::New(v8::Isolate::GetCurrent(), val)->ToInt32();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Int32> NanNew<v8::Int32, uint32_t>(uint32_t val) {
+++ return v8::Int32::New(v8::Isolate::GetCurrent(), val)->ToInt32();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, char *>(
+++ char *arg
+++ , int length) {
+++ return v8::String::NewFromUtf8(
+++ v8::Isolate::GetCurrent()
+++ , arg
+++ , v8::String::kNormalString
+++ , length);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, const char *>(
+++ const char *arg
+++ , int length) {
+++ return v8::String::NewFromUtf8(
+++ v8::Isolate::GetCurrent()
+++ , arg
+++ , v8::String::kNormalString
+++ , length);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, char *>(char *arg) {
+++ return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), arg);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, const char *>(
+++ const char *arg) {
+++ return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), arg);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, uint8_t *>(
+++ uint8_t *arg
+++ , int length) {
+++ return v8::String::NewFromOneByte(
+++ v8::Isolate::GetCurrent()
+++ , arg
+++ , v8::String::kNormalString
+++ , length);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, const uint8_t *>(
+++ const uint8_t *arg
+++ , int length) {
+++ return v8::String::NewFromOneByte(
+++ v8::Isolate::GetCurrent()
+++ , arg
+++ , v8::String::kNormalString
+++ , length);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, uint8_t *>(uint8_t *arg) {
+++ return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), arg);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, const uint8_t *>(
+++ const uint8_t *arg) {
+++ return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), arg);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, uint16_t *>(
+++ uint16_t *arg
+++ , int length) {
+++ return v8::String::NewFromTwoByte(
+++ v8::Isolate::GetCurrent()
+++ , arg
+++ , v8::String::kNormalString
+++ , length);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, const uint16_t *>(
+++ const uint16_t *arg
+++ , int length) {
+++ return v8::String::NewFromTwoByte(
+++ v8::Isolate::GetCurrent()
+++ , arg
+++ , v8::String::kNormalString
+++ , length);
+++ }
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, uint16_t *>(
+++ uint16_t *arg) {
+++ return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), arg);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, const uint16_t *>(
+++ const uint16_t *arg) {
+++ return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), arg);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, std::string>(
+++ std::string arg) {
+++ return NanNew<v8::String>(arg.c_str(), arg.size());
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String>() {
+++ return v8::String::Empty(v8::Isolate::GetCurrent());
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(const char* arg, int length = -1) {
+++ return NanNew<v8::String>(arg, length);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(
+++ const uint8_t* arg
+++ , int length = -1) {
+++ return NanNew<v8::String>(arg, length);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(
+++ const uint16_t* arg
+++ , int length = -1) {
+++ return NanNew<v8::String>(arg, length);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(
+++ const std::string& arg) {
+++ return NanNew<v8::String>(arg.c_str(), arg.size());
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Number> NanNew(double val) {
+++ return NanNew<v8::Number>(val);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Integer> NanNew(int val) {
+++ return NanNew<v8::Integer>(val);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Uint32> NanNew(unsigned int val) {
+++ return NanNew<v8::Uint32>(val);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Boolean> NanNew(bool val) {
+++ return NanNew<v8::Boolean>(val);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(
+++ v8::String::ExternalStringResource *resource) {
+++ return v8::String::NewExternal(v8::Isolate::GetCurrent(), resource);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(
+++ v8::String::ExternalAsciiStringResource *resource) {
+++ return v8::String::NewExternal(v8::Isolate::GetCurrent(), resource);
+++ }
+++
+++# define NanScope() v8::HandleScope scope(v8::Isolate::GetCurrent())
+++# define NanEscapableScope() \
+++ v8::EscapableHandleScope scope(v8::Isolate::GetCurrent())
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<T> _NanEscapeScopeHelper(v8::Handle<T> val) {
+++ return NanNew(val);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<T> _NanEscapeScopeHelper(v8::Local<T> val) {
+++ return val;
+++ }
+++
+++# define NanEscapeScope(val) scope.Escape(_NanEscapeScopeHelper(val))
+++# define NanLocker() v8::Locker locker(v8::Isolate::GetCurrent())
+++# define NanUnlocker() v8::Unlocker unlocker(v8::Isolate::GetCurrent())
+++# define NanReturnValue(value) return args.GetReturnValue().Set(value)
+++# define NanReturnUndefined() return
+++# define NanReturnNull() return args.GetReturnValue().SetNull()
+++# define NanReturnEmptyString() return args.GetReturnValue().SetEmptyString()
+++
+++# define NanObjectWrapHandle(obj) obj->handle()
+++
+++ NAN_INLINE v8::Local<v8::Primitive> NanUndefined() {
+++ NanEscapableScope();
+++ return NanEscapeScope(NanNew(v8::Undefined(v8::Isolate::GetCurrent())));
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Primitive> NanNull() {
+++ NanEscapableScope();
+++ return NanEscapeScope(NanNew(v8::Null(v8::Isolate::GetCurrent())));
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Boolean> NanTrue() {
+++ NanEscapableScope();
+++ return NanEscapeScope(NanNew(v8::True(v8::Isolate::GetCurrent())));
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Boolean> NanFalse() {
+++ NanEscapableScope();
+++ return NanEscapeScope(NanNew(v8::False(v8::Isolate::GetCurrent())));
+++ }
+++
+++ NAN_INLINE int NanAdjustExternalMemory(int bc) {
+++ return static_cast<int>(
+++ v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(bc));
+++ }
+++
+++ NAN_INLINE void NanSetTemplate(
+++ v8::Handle<v8::Template> templ
+++ , const char *name
+++ , v8::Handle<v8::Data> value) {
+++ templ->Set(v8::Isolate::GetCurrent(), name, value);
+++ }
+++
+++ NAN_INLINE void NanSetTemplate(
+++ v8::Handle<v8::Template> templ
+++ , v8::Handle<v8::String> name
+++ , v8::Handle<v8::Data> value
+++ , v8::PropertyAttribute attributes) {
+++ templ->Set(name, value, attributes);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Context> NanGetCurrentContext() {
+++ return v8::Isolate::GetCurrent()->GetCurrentContext();
+++ }
+++
+++ NAN_INLINE void* NanGetInternalFieldPointer(
+++ v8::Handle<v8::Object> object
+++ , int index) {
+++ return object->GetAlignedPointerFromInternalField(index);
+++ }
+++
+++ NAN_INLINE void NanSetInternalFieldPointer(
+++ v8::Handle<v8::Object> object
+++ , int index
+++ , void* value) {
+++ object->SetAlignedPointerInInternalField(index, value);
+++ }
+++
+++ NAN_INLINE void NanAddGCEpilogueCallback(
+++ v8::Isolate::GCEpilogueCallback callback
+++ , v8::GCType gc_type_filter = v8::kGCTypeAll) {
+++ v8::Isolate::GetCurrent()->AddGCEpilogueCallback(callback, gc_type_filter);
+++ }
+++
+++ NAN_INLINE void NanRemoveGCEpilogueCallback(
+++ v8::Isolate::GCEpilogueCallback callback) {
+++ v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(callback);
+++ }
+++
+++ NAN_INLINE void NanAddGCPrologueCallback(
+++ v8::Isolate::GCPrologueCallback callback
+++ , v8::GCType gc_type_filter = v8::kGCTypeAll) {
+++ v8::Isolate::GetCurrent()->AddGCPrologueCallback(callback, gc_type_filter);
+++ }
+++
+++ NAN_INLINE void NanRemoveGCPrologueCallback(
+++ v8::Isolate::GCPrologueCallback callback) {
+++ v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(callback);
+++ }
+++
+++ NAN_INLINE void NanGetHeapStatistics(
+++ v8::HeapStatistics *heap_statistics) {
+++ v8::Isolate::GetCurrent()->GetHeapStatistics(heap_statistics);
+++ }
+++
+++ NAN_DEPRECATED NAN_INLINE v8::Local<v8::String> NanSymbol(
+++ const char* data, int length = -1) {
+++ return NanNew<v8::String>(data, length);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE void NanAssignPersistent(
+++ v8::Persistent<T>& handle
+++ , v8::Handle<T> obj) {
+++ handle.Reset(v8::Isolate::GetCurrent(), obj);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE void NanAssignPersistent(
+++ v8::Persistent<T>& handle
+++ , const v8::Persistent<T>& obj) {
+++ handle.Reset(v8::Isolate::GetCurrent(), obj);
+++ }
+++
+++ template<typename T, typename P>
+++ class _NanWeakCallbackData;
+++
+++ template<typename T, typename P>
+++ struct _NanWeakCallbackInfo {
+++ typedef void (*Callback)(const _NanWeakCallbackData<T, P>& data);
+++ NAN_INLINE _NanWeakCallbackInfo(v8::Handle<T> handle, P* param, Callback cb)
+++ : parameter(param), callback(cb) {
+++ NanAssignPersistent(persistent, handle);
+++ }
+++
+++ NAN_INLINE ~_NanWeakCallbackInfo() {
+++ persistent.Reset();
+++ }
+++
+++ P* const parameter;
+++ Callback const callback;
+++ v8::Persistent<T> persistent;
+++ };
+++
+++ template<typename T, typename P>
+++ class _NanWeakCallbackData {
+++ public:
+++ NAN_INLINE _NanWeakCallbackData(_NanWeakCallbackInfo<T, P> *info)
+++ : info_(info) { }
+++
+++ NAN_INLINE v8::Local<T> GetValue() const {
+++ return NanNew(info_->persistent);
+++ }
+++
+++ NAN_INLINE P* GetParameter() const { return info_->parameter; }
+++
+++ NAN_INLINE bool IsNearDeath() const {
+++ return info_->persistent.IsNearDeath();
+++ }
+++
+++ NAN_INLINE void Revive() const;
+++
+++ NAN_INLINE _NanWeakCallbackInfo<T, P>* GetCallbackInfo() const {
+++ return info_;
+++ }
+++
+++ NAN_DEPRECATED NAN_INLINE void Dispose() const {
+++ }
+++
+++ private:
+++ _NanWeakCallbackInfo<T, P>* info_;
+++ };
+++
+++ template<typename T, typename P>
+++ static void _NanWeakCallbackDispatcher(
+++ const v8::WeakCallbackData<T, _NanWeakCallbackInfo<T, P> > &data) {
+++ _NanWeakCallbackInfo<T, P> *info = data.GetParameter();
+++ _NanWeakCallbackData<T, P> wcbd(info);
+++ info->callback(wcbd);
+++ if (wcbd.IsNearDeath()) {
+++ delete wcbd.GetCallbackInfo();
+++ }
+++ }
+++
+++ template<typename T, typename P>
+++ NAN_INLINE void _NanWeakCallbackData<T, P>::Revive() const {
+++ info_->persistent.SetWeak(info_, &_NanWeakCallbackDispatcher<T, P>);
+++ }
+++
+++template<typename T, typename P>
+++NAN_INLINE _NanWeakCallbackInfo<T, P>* NanMakeWeakPersistent(
+++ v8::Handle<T> handle
+++ , P* parameter
+++ , typename _NanWeakCallbackInfo<T, P>::Callback callback) {
+++ _NanWeakCallbackInfo<T, P> *cbinfo =
+++ new _NanWeakCallbackInfo<T, P>(handle, parameter, callback);
+++ cbinfo->persistent.SetWeak(cbinfo, &_NanWeakCallbackDispatcher<T, P>);
+++ return cbinfo;
+++}
+++
+++# define NAN_WEAK_CALLBACK(name) \
+++ template<typename T, typename P> \
+++ static void name(const _NanWeakCallbackData<T, P> &data)
+++
+++# define _NAN_ERROR(fun, errmsg) fun(NanNew<v8::String>(errmsg))
+++
+++# define _NAN_THROW_ERROR(fun, errmsg) \
+++ do { \
+++ NanScope(); \
+++ v8::Isolate::GetCurrent()->ThrowException(_NAN_ERROR(fun, errmsg)); \
+++ } while (0);
+++
+++ NAN_INLINE v8::Local<v8::Value> NanError(const char* errmsg) {
+++ return _NAN_ERROR(v8::Exception::Error, errmsg);
+++ }
+++
+++ NAN_INLINE void NanThrowError(const char* errmsg) {
+++ _NAN_THROW_ERROR(v8::Exception::Error, errmsg);
+++ }
+++
+++ NAN_INLINE void NanThrowError(v8::Handle<v8::Value> error) {
+++ NanScope();
+++ v8::Isolate::GetCurrent()->ThrowException(error);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanError(
+++ const char *msg
+++ , const int errorNumber
+++ ) {
+++ v8::Local<v8::Value> err = v8::Exception::Error(NanNew<v8::String>(msg));
+++ v8::Local<v8::Object> obj = err.As<v8::Object>();
+++ obj->Set(NanNew<v8::String>("code"), NanNew<v8::Integer>(errorNumber));
+++ return err;
+++ }
+++
+++ NAN_INLINE void NanThrowError(
+++ const char *msg
+++ , const int errorNumber
+++ ) {
+++ NanThrowError(NanError(msg, errorNumber));
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanTypeError(const char* errmsg) {
+++ return _NAN_ERROR(v8::Exception::TypeError, errmsg);
+++ }
+++
+++ NAN_INLINE void NanThrowTypeError(const char* errmsg) {
+++ _NAN_THROW_ERROR(v8::Exception::TypeError, errmsg);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanRangeError(const char* errmsg) {
+++ return _NAN_ERROR(v8::Exception::RangeError, errmsg);
+++ }
+++
+++ NAN_INLINE void NanThrowRangeError(const char* errmsg) {
+++ _NAN_THROW_ERROR(v8::Exception::RangeError, errmsg);
+++ }
+++
+++ template<typename T> NAN_INLINE void NanDisposePersistent(
+++ v8::Persistent<T> &handle
+++ ) {
+++ handle.Reset();
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Object> NanNewBufferHandle (
+++ char *data
+++ , size_t length
+++ , node::smalloc::FreeCallback callback
+++ , void *hint
+++ ) {
+++ return node::Buffer::New(
+++ v8::Isolate::GetCurrent(), data, length, callback, hint);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Object> NanNewBufferHandle (
+++ const char *data
+++ , uint32_t size
+++ ) {
+++ return node::Buffer::New(v8::Isolate::GetCurrent(), data, size);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Object> NanNewBufferHandle (uint32_t size) {
+++ return node::Buffer::New(v8::Isolate::GetCurrent(), size);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Object> NanBufferUse(
+++ char* data
+++ , uint32_t size
+++ ) {
+++ return node::Buffer::Use(v8::Isolate::GetCurrent(), data, size);
+++ }
+++
+++ NAN_INLINE bool NanHasInstance(
+++ v8::Persistent<v8::FunctionTemplate>& function_template
+++ , v8::Handle<v8::Value> value
+++ ) {
+++ return NanNew(function_template)->HasInstance(value);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Context> NanNewContextHandle(
+++ v8::ExtensionConfiguration* extensions = NULL
+++ , v8::Handle<v8::ObjectTemplate> tmpl = v8::Handle<v8::ObjectTemplate>()
+++ , v8::Handle<v8::Value> obj = v8::Handle<v8::Value>()
+++ ) {
+++ v8::Isolate* isolate = v8::Isolate::GetCurrent();
+++ return v8::Local<v8::Context>::New(
+++ isolate
+++ , v8::Context::New(isolate, extensions, tmpl, obj)
+++ );
+++ }
+++
+++ NAN_INLINE v8::Local<NanBoundScript> NanCompileScript(
+++ v8::Local<v8::String> s
+++ , const v8::ScriptOrigin& origin
+++ ) {
+++ v8::ScriptCompiler::Source source(s, origin);
+++ return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source);
+++ }
+++
+++ NAN_INLINE v8::Local<NanBoundScript> NanCompileScript(
+++ v8::Local<v8::String> s
+++ ) {
+++ v8::ScriptCompiler::Source source(s);
+++ return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanRunScript(
+++ v8::Handle<NanUnboundScript> script
+++ ) {
+++ return script->BindToCurrentContext()->Run();
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanRunScript(
+++ v8::Handle<NanBoundScript> script
+++ ) {
+++ return script->Run();
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanMakeCallback(
+++ v8::Handle<v8::Object> target
+++ , v8::Handle<v8::Function> func
+++ , int argc
+++ , v8::Handle<v8::Value>* argv) {
+++ return NanNew(node::MakeCallback(
+++ v8::Isolate::GetCurrent(), target, func, argc, argv));
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanMakeCallback(
+++ v8::Handle<v8::Object> target
+++ , v8::Handle<v8::String> symbol
+++ , int argc
+++ , v8::Handle<v8::Value>* argv) {
+++ return NanNew(node::MakeCallback(
+++ v8::Isolate::GetCurrent(), target, symbol, argc, argv));
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanMakeCallback(
+++ v8::Handle<v8::Object> target
+++ , const char* method
+++ , int argc
+++ , v8::Handle<v8::Value>* argv) {
+++ return NanNew(node::MakeCallback(
+++ v8::Isolate::GetCurrent(), target, method, argc, argv));
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE void NanSetIsolateData(
+++ v8::Isolate *isolate
+++ , T *data
+++ ) {
+++ isolate->SetData(0, data);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE T *NanGetIsolateData(
+++ v8::Isolate *isolate
+++ ) {
+++ return static_cast<T*>(isolate->GetData(0));
+++ }
+++
+++ class NanAsciiString {
+++ public:
+++ NAN_INLINE explicit NanAsciiString(v8::Handle<v8::Value> from) {
+++ v8::Local<v8::String> toStr = from->ToString();
+++ int buf_size = toStr->Length() + 1;
+++ buf = new char[buf_size];
+++ size = toStr->WriteOneByte(
+++ reinterpret_cast<unsigned char*>(buf), 0, buf_size);
+++ }
+++
+++ NAN_INLINE int Size() const {
+++ return size;
+++ }
+++
+++ NAN_INLINE char* operator*() { return buf; }
+++
+++ NAN_INLINE ~NanAsciiString() {
+++ delete[] buf;
+++ }
+++
+++ private:
+++ char *buf;
+++ int size;
+++ };
+++
+++ class NanUtf8String {
+++ public:
+++ NAN_INLINE explicit NanUtf8String(v8::Handle<v8::Value> from) {
+++ v8::Local<v8::String> toStr = from->ToString();
+++ int buf_size = toStr->Utf8Length() + 1;
+++ buf = new char[buf_size];
+++ size = toStr->WriteUtf8(buf, buf_size);
+++ }
+++
+++ NAN_INLINE int Size() const {
+++ return size;
+++ }
+++
+++ NAN_INLINE char* operator*() { return buf; }
+++
+++ NAN_INLINE ~NanUtf8String() {
+++ delete[] buf;
+++ }
+++
+++ private:
+++ char *buf;
+++ int size;
+++ };
+++
+++ class NanUcs2String {
+++ public:
+++ NAN_INLINE explicit NanUcs2String(v8::Handle<v8::Value> from) {
+++ v8::Local<v8::String> toStr = from->ToString();
+++ int buf_size = toStr->Length() + 1;
+++ buf = new uint16_t[buf_size];
+++ size = toStr->Write(buf, 0, buf_size);
+++ }
+++
+++ NAN_INLINE int Size() const {
+++ return size;
+++ }
+++
+++ NAN_INLINE uint16_t* operator*() { return buf; }
+++
+++ NAN_INLINE ~NanUcs2String() {
+++ delete[] buf;
+++ }
+++
+++ private:
+++ uint16_t *buf;
+++ int size;
+++ };
+++
+++#else
+++// Node 0.8 and 0.10
+++
+++# define _NAN_METHOD_ARGS_TYPE const v8::Arguments&
+++# define _NAN_METHOD_ARGS _NAN_METHOD_ARGS_TYPE args
+++# define _NAN_METHOD_RETURN_TYPE v8::Handle<v8::Value>
+++
+++# define _NAN_GETTER_ARGS_TYPE const v8::AccessorInfo &
+++# define _NAN_GETTER_ARGS _NAN_GETTER_ARGS_TYPE args
+++# define _NAN_GETTER_RETURN_TYPE v8::Handle<v8::Value>
+++
+++# define _NAN_SETTER_ARGS_TYPE const v8::AccessorInfo &
+++# define _NAN_SETTER_ARGS _NAN_SETTER_ARGS_TYPE args
+++# define _NAN_SETTER_RETURN_TYPE void
+++
+++# define _NAN_PROPERTY_GETTER_ARGS_TYPE const v8::AccessorInfo&
+++# define _NAN_PROPERTY_GETTER_ARGS _NAN_PROPERTY_GETTER_ARGS_TYPE args
+++# define _NAN_PROPERTY_GETTER_RETURN_TYPE v8::Handle<v8::Value>
+++
+++# define _NAN_PROPERTY_SETTER_ARGS_TYPE const v8::AccessorInfo&
+++# define _NAN_PROPERTY_SETTER_ARGS _NAN_PROPERTY_SETTER_ARGS_TYPE args
+++# define _NAN_PROPERTY_SETTER_RETURN_TYPE v8::Handle<v8::Value>
+++
+++# define _NAN_PROPERTY_ENUMERATOR_ARGS_TYPE const v8::AccessorInfo&
+++# define _NAN_PROPERTY_ENUMERATOR_ARGS _NAN_PROPERTY_ENUMERATOR_ARGS_TYPE args
+++# define _NAN_PROPERTY_ENUMERATOR_RETURN_TYPE v8::Handle<v8::Array>
+++
+++# define _NAN_PROPERTY_DELETER_ARGS_TYPE const v8::AccessorInfo&
+++# define _NAN_PROPERTY_DELETER_ARGS _NAN_PROPERTY_DELETER_ARGS_TYPE args
+++# define _NAN_PROPERTY_DELETER_RETURN_TYPE v8::Handle<v8::Boolean>
+++
+++# define _NAN_PROPERTY_QUERY_ARGS_TYPE const v8::AccessorInfo&
+++# define _NAN_PROPERTY_QUERY_ARGS _NAN_PROPERTY_QUERY_ARGS_TYPE args
+++# define _NAN_PROPERTY_QUERY_RETURN_TYPE v8::Handle<v8::Integer>
+++
+++# define _NAN_INDEX_GETTER_ARGS_TYPE const v8::AccessorInfo&
+++# define _NAN_INDEX_GETTER_ARGS _NAN_INDEX_GETTER_ARGS_TYPE args
+++# define _NAN_INDEX_GETTER_RETURN_TYPE v8::Handle<v8::Value>
+++
+++# define _NAN_INDEX_SETTER_ARGS_TYPE const v8::AccessorInfo&
+++# define _NAN_INDEX_SETTER_ARGS _NAN_INDEX_SETTER_ARGS_TYPE args
+++# define _NAN_INDEX_SETTER_RETURN_TYPE v8::Handle<v8::Value>
+++
+++# define _NAN_INDEX_ENUMERATOR_ARGS_TYPE const v8::AccessorInfo&
+++# define _NAN_INDEX_ENUMERATOR_ARGS _NAN_INDEX_ENUMERATOR_ARGS_TYPE args
+++# define _NAN_INDEX_ENUMERATOR_RETURN_TYPE v8::Handle<v8::Array>
+++
+++# define _NAN_INDEX_DELETER_ARGS_TYPE const v8::AccessorInfo&
+++# define _NAN_INDEX_DELETER_ARGS _NAN_INDEX_DELETER_ARGS_TYPE args
+++# define _NAN_INDEX_DELETER_RETURN_TYPE v8::Handle<v8::Boolean>
+++
+++# define _NAN_INDEX_QUERY_ARGS_TYPE const v8::AccessorInfo&
+++# define _NAN_INDEX_QUERY_ARGS _NAN_INDEX_QUERY_ARGS_TYPE args
+++# define _NAN_INDEX_QUERY_RETURN_TYPE v8::Handle<v8::Integer>
+++
+++ typedef v8::InvocationCallback NanFunctionCallback;
+++
+++ NAN_DEPRECATED NAN_INLINE v8::Local<v8::String> NanSymbol(
+++ const char* data, int length = -1) {
+++ return v8::String::NewSymbol(data, length);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<T> NanNew() {
+++ return v8::Local<T>::New(T::New());
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<T> NanNew(v8::Handle<T> arg) {
+++ return v8::Local<T>::New(arg);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<v8::Signature> NanNew(
+++ v8::Handle<v8::FunctionTemplate> receiver
+++ , int argc
+++ , v8::Handle<v8::FunctionTemplate> argv[] = 0) {
+++ return v8::Signature::New(receiver, argc, argv);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<v8::FunctionTemplate> NanNew(
+++ NanFunctionCallback callback
+++ , v8::Handle<v8::Value> data = v8::Handle<v8::Value>()
+++ , v8::Handle<v8::Signature> signature = v8::Handle<v8::Signature>()) {
+++ return T::New(callback, data, signature);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<T> NanNew(const v8::Persistent<T> &arg) {
+++ return v8::Local<T>::New(arg);
+++ }
+++
+++ template<typename T, typename P>
+++ NAN_INLINE v8::Local<T> NanNew(P arg) {
+++ return v8::Local<T>::New(T::New(arg));
+++ }
+++
+++ template<typename T, typename P>
+++ NAN_INLINE v8::Local<T> NanNew(P arg, int length) {
+++ return v8::Local<T>::New(T::New(arg, length));
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<v8::RegExp> NanNew(
+++ v8::Handle<v8::String> pattern, v8::RegExp::Flags flags) {
+++ return v8::RegExp::New(pattern, flags);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE v8::Local<v8::RegExp> NanNew(
+++ v8::Local<v8::String> pattern, v8::RegExp::Flags flags) {
+++ return v8::RegExp::New(pattern, flags);
+++ }
+++
+++ template<typename T, typename P>
+++ NAN_INLINE v8::Local<v8::RegExp> NanNew(
+++ v8::Handle<v8::String> pattern, v8::RegExp::Flags flags) {
+++ return v8::RegExp::New(pattern, flags);
+++ }
+++
+++ template<typename T, typename P>
+++ NAN_INLINE v8::Local<v8::RegExp> NanNew(
+++ v8::Local<v8::String> pattern, v8::RegExp::Flags flags) {
+++ return v8::RegExp::New(pattern, flags);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Array> NanNew<v8::Array>() {
+++ return v8::Array::New();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Array> NanNew<v8::Array>(int length) {
+++ return v8::Array::New(length);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Date> NanNew<v8::Date>(double time) {
+++ return v8::Date::New(time).As<v8::Date>();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Date> NanNew<v8::Date>(int time) {
+++ return v8::Date::New(time).As<v8::Date>();
+++ }
+++
+++ typedef v8::Script NanUnboundScript;
+++ typedef v8::Script NanBoundScript;
+++
+++ template<typename T, typename P>
+++ NAN_INLINE v8::Local<T> NanNew(
+++ P s
+++ , const v8::ScriptOrigin& origin
+++ ) {
+++ return v8::Script::New(s, const_cast<v8::ScriptOrigin *>(&origin));
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<NanUnboundScript> NanNew<NanUnboundScript>(
+++ v8::Local<v8::String> s
+++ ) {
+++ return v8::Script::New(s);
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::BooleanObject> NanNew(bool value) {
+++ return v8::BooleanObject::New(value).As<v8::BooleanObject>();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::StringObject>
+++ NanNew<v8::StringObject, v8::Local<v8::String> >(
+++ v8::Local<v8::String> value) {
+++ return v8::StringObject::New(value).As<v8::StringObject>();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::StringObject>
+++ NanNew<v8::StringObject, v8::Handle<v8::String> >(
+++ v8::Handle<v8::String> value) {
+++ return v8::StringObject::New(value).As<v8::StringObject>();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::NumberObject> NanNew<v8::NumberObject>(double val) {
+++ return v8::NumberObject::New(val).As<v8::NumberObject>();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Uint32> NanNew<v8::Uint32, int32_t>(int32_t val) {
+++ return v8::Uint32::NewFromUnsigned(val)->ToUint32();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Uint32> NanNew<v8::Uint32, uint32_t>(uint32_t val) {
+++ return v8::Uint32::NewFromUnsigned(val)->ToUint32();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Int32> NanNew<v8::Int32, int32_t>(int32_t val) {
+++ return v8::Int32::New(val)->ToInt32();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::Int32> NanNew<v8::Int32, uint32_t>(uint32_t val) {
+++ return v8::Int32::New(val)->ToInt32();
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, uint8_t *>(
+++ uint8_t *arg
+++ , int length) {
+++ int len = length;
+++ if (len < 0) {
+++ size_t temp = strlen(reinterpret_cast<const char *>(arg));
+++ assert(temp <= INT_MAX && "too long string");
+++ len = static_cast<int>(temp);
+++ }
+++ uint16_t *warg = new uint16_t[len];
+++ for (int i = 0; i < len; i++) {
+++ warg[i] = arg[i];
+++ }
+++ v8::Local<v8::String> retval = v8::String::New(warg, len);
+++ delete[] warg;
+++ return retval;
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, const uint8_t *>(
+++ const uint8_t *arg
+++ , int length) {
+++ int len = length;
+++ if (len < 0) {
+++ size_t temp = strlen(reinterpret_cast<const char *>(arg));
+++ assert(temp <= INT_MAX && "too long string");
+++ len = static_cast<int>(temp);
+++ }
+++ uint16_t *warg = new uint16_t[len];
+++ for (int i = 0; i < len; i++) {
+++ warg[i] = arg[i];
+++ }
+++ v8::Local<v8::String> retval = v8::String::New(warg, len);
+++ delete[] warg;
+++ return retval;
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, uint8_t *>(uint8_t *arg) {
+++ size_t temp = strlen(reinterpret_cast<char *>(arg));
+++ assert(temp <= INT_MAX && "too long string");
+++ int length = static_cast<int>(temp);
+++ uint16_t *warg = new uint16_t[length];
+++ for (int i = 0; i < length; i++) {
+++ warg[i] = arg[i];
+++ }
+++
+++ v8::Local<v8::String> retval = v8::String::New(warg, length);
+++ delete[] warg;
+++ return retval;
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, const uint8_t *>(
+++ const uint8_t *arg) {
+++ size_t temp = strlen(reinterpret_cast<const char *>(arg));
+++ assert(temp <= INT_MAX && "too long string");
+++ int length = static_cast<int>(temp);
+++ uint16_t *warg = new uint16_t[length];
+++ for (int i = 0; i < length; i++) {
+++ warg[i] = arg[i];
+++ }
+++ v8::Local<v8::String> retval = v8::String::New(warg, length);
+++ delete[] warg;
+++ return retval;
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String, std::string>(
+++ std::string arg) {
+++ return NanNew<v8::String>(arg.c_str(), arg.size());
+++ }
+++
+++ template<>
+++ NAN_INLINE v8::Local<v8::String> NanNew<v8::String>() {
+++ return v8::String::Empty();
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(const char* arg, int length = -1) {
+++ return NanNew<v8::String>(arg, length);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(
+++ const uint8_t* arg
+++ , int length = -1) {
+++ return NanNew<v8::String>(arg, length);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(
+++ const uint16_t* arg
+++ , int length = -1) {
+++ return NanNew<v8::String>(arg, length);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(
+++ std::string& arg) {
+++ return NanNew<v8::String>(arg.c_str(), arg.size());
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Number> NanNew(double val) {
+++ return NanNew<v8::Number>(val);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Integer> NanNew(int val) {
+++ return NanNew<v8::Integer>(val);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Uint32> NanNew(unsigned int val) {
+++ return NanNew<v8::Uint32>(val);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Boolean> NanNew(bool val) {
+++ return NanNew<v8::Boolean>(val);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(
+++ v8::String::ExternalStringResource *resource) {
+++ return v8::String::NewExternal(resource);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::String> NanNew(
+++ v8::String::ExternalAsciiStringResource *resource) {
+++ return v8::String::NewExternal(resource);
+++ }
+++
+++# define NanScope() v8::HandleScope scope
+++# define NanEscapableScope() v8::HandleScope scope
+++# define NanEscapeScope(val) scope.Close(val)
+++# define NanLocker() v8::Locker locker
+++# define NanUnlocker() v8::Unlocker unlocker
+++# define NanReturnValue(value) return scope.Close(value)
+++# define NanReturnUndefined() return v8::Undefined()
+++# define NanReturnNull() return v8::Null()
+++# define NanReturnEmptyString() return v8::String::Empty()
+++# define NanObjectWrapHandle(obj) v8::Local<v8::Object>::New(obj->handle_)
+++
+++ NAN_INLINE v8::Local<v8::Primitive> NanUndefined() {
+++ NanEscapableScope();
+++ return NanEscapeScope(NanNew(v8::Undefined()));
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Primitive> NanNull() {
+++ NanEscapableScope();
+++ return NanEscapeScope(NanNew(v8::Null()));
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Boolean> NanTrue() {
+++ NanEscapableScope();
+++ return NanEscapeScope(NanNew(v8::True()));
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Boolean> NanFalse() {
+++ NanEscapableScope();
+++ return NanEscapeScope(NanNew(v8::False()));
+++ }
+++
+++ NAN_INLINE int NanAdjustExternalMemory(int bc) {
+++ return static_cast<int>(v8::V8::AdjustAmountOfExternalAllocatedMemory(bc));
+++ }
+++
+++ NAN_INLINE void NanSetTemplate(
+++ v8::Handle<v8::Template> templ
+++ , const char *name
+++ , v8::Handle<v8::Data> value) {
+++ templ->Set(name, value);
+++ }
+++
+++ NAN_INLINE void NanSetTemplate(
+++ v8::Handle<v8::Template> templ
+++ , v8::Handle<v8::String> name
+++ , v8::Handle<v8::Data> value
+++ , v8::PropertyAttribute attributes) {
+++ templ->Set(name, value, attributes);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Context> NanGetCurrentContext() {
+++ return v8::Context::GetCurrent();
+++ }
+++
+++ NAN_INLINE void* NanGetInternalFieldPointer(
+++ v8::Handle<v8::Object> object
+++ , int index) {
+++ return object->GetPointerFromInternalField(index);
+++ }
+++
+++ NAN_INLINE void NanSetInternalFieldPointer(
+++ v8::Handle<v8::Object> object
+++ , int index
+++ , void* value) {
+++ object->SetPointerInInternalField(index, value);
+++ }
+++
+++ NAN_INLINE void NanAddGCEpilogueCallback(
+++ v8::GCEpilogueCallback callback
+++ , v8::GCType gc_type_filter = v8::kGCTypeAll) {
+++ v8::V8::AddGCEpilogueCallback(callback, gc_type_filter);
+++ }
+++ NAN_INLINE void NanRemoveGCEpilogueCallback(
+++ v8::GCEpilogueCallback callback) {
+++ v8::V8::RemoveGCEpilogueCallback(callback);
+++ }
+++ NAN_INLINE void NanAddGCPrologueCallback(
+++ v8::GCPrologueCallback callback
+++ , v8::GCType gc_type_filter = v8::kGCTypeAll) {
+++ v8::V8::AddGCPrologueCallback(callback, gc_type_filter);
+++ }
+++ NAN_INLINE void NanRemoveGCPrologueCallback(
+++ v8::GCPrologueCallback callback) {
+++ v8::V8::RemoveGCPrologueCallback(callback);
+++ }
+++ NAN_INLINE void NanGetHeapStatistics(
+++ v8::HeapStatistics *heap_statistics) {
+++ v8::V8::GetHeapStatistics(heap_statistics);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE void NanAssignPersistent(
+++ v8::Persistent<T>& handle
+++ , v8::Handle<T> obj) {
+++ handle.Dispose();
+++ handle = v8::Persistent<T>::New(obj);
+++ }
+++
+++ template<typename T, typename P>
+++ class _NanWeakCallbackData;
+++
+++ template<typename T, typename P>
+++ struct _NanWeakCallbackInfo {
+++ typedef void (*Callback)(const _NanWeakCallbackData<T, P> &data);
+++ NAN_INLINE _NanWeakCallbackInfo(v8::Handle<T> handle, P* param, Callback cb)
+++ : parameter(param)
+++ , callback(cb)
+++ , persistent(v8::Persistent<T>::New(handle)) { }
+++
+++ NAN_INLINE ~_NanWeakCallbackInfo() {
+++ persistent.Dispose();
+++ persistent.Clear();
+++ }
+++
+++ P* const parameter;
+++ Callback const callback;
+++ v8::Persistent<T> persistent;
+++ };
+++
+++ template<typename T, typename P>
+++ class _NanWeakCallbackData {
+++ public:
+++ NAN_INLINE _NanWeakCallbackData(_NanWeakCallbackInfo<T, P> *info)
+++ : info_(info) { }
+++
+++ NAN_INLINE v8::Local<T> GetValue() const {
+++ return NanNew(info_->persistent);
+++ }
+++
+++ NAN_INLINE P* GetParameter() const { return info_->parameter; }
+++
+++ NAN_INLINE bool IsNearDeath() const {
+++ return info_->persistent.IsNearDeath();
+++ }
+++
+++ NAN_INLINE void Revive() const;
+++
+++ NAN_INLINE _NanWeakCallbackInfo<T, P>* GetCallbackInfo() const {
+++ return info_;
+++ }
+++
+++ NAN_DEPRECATED NAN_INLINE void Dispose() const {
+++ }
+++
+++ private:
+++ _NanWeakCallbackInfo<T, P>* info_;
+++ };
+++
+++ template<typename T, typename P>
+++ static void _NanWeakPersistentDispatcher(
+++ v8::Persistent<v8::Value> object, void *data) {
+++ _NanWeakCallbackInfo<T, P>* info =
+++ static_cast<_NanWeakCallbackInfo<T, P>*>(data);
+++ _NanWeakCallbackData<T, P> wcbd(info);
+++ info->callback(wcbd);
+++ if (wcbd.IsNearDeath()) {
+++ delete wcbd.GetCallbackInfo();
+++ }
+++ }
+++
+++ template<typename T, typename P>
+++ NAN_INLINE void _NanWeakCallbackData<T, P>::Revive() const {
+++ info_->persistent.MakeWeak(
+++ info_
+++ , &_NanWeakPersistentDispatcher<T, P>);
+++ }
+++
+++ template<typename T, typename P>
+++ NAN_INLINE _NanWeakCallbackInfo<T, P>* NanMakeWeakPersistent(
+++ v8::Handle<T> handle
+++ , P* parameter
+++ , typename _NanWeakCallbackInfo<T, P>::Callback callback) {
+++ _NanWeakCallbackInfo<T, P> *cbinfo =
+++ new _NanWeakCallbackInfo<T, P>(handle, parameter, callback);
+++ cbinfo->persistent.MakeWeak(
+++ cbinfo
+++ , &_NanWeakPersistentDispatcher<T, P>);
+++ return cbinfo;
+++ }
+++
+++# define NAN_WEAK_CALLBACK(name) \
+++ template<typename T, typename P> \
+++ static void name(const _NanWeakCallbackData<T, P> &data)
+++
+++# define _NAN_ERROR(fun, errmsg) \
+++ fun(v8::String::New(errmsg))
+++
+++# define _NAN_THROW_ERROR(fun, errmsg) \
+++ do { \
+++ NanScope(); \
+++ return v8::Local<v8::Value>::New( \
+++ v8::ThrowException(_NAN_ERROR(fun, errmsg))); \
+++ } while (0);
+++
+++ NAN_INLINE v8::Local<v8::Value> NanError(const char* errmsg) {
+++ return _NAN_ERROR(v8::Exception::Error, errmsg);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanThrowError(const char* errmsg) {
+++ _NAN_THROW_ERROR(v8::Exception::Error, errmsg);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanThrowError(
+++ v8::Handle<v8::Value> error
+++ ) {
+++ NanScope();
+++ return v8::Local<v8::Value>::New(v8::ThrowException(error));
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanError(
+++ const char *msg
+++ , const int errorNumber
+++ ) {
+++ v8::Local<v8::Value> err = v8::Exception::Error(v8::String::New(msg));
+++ v8::Local<v8::Object> obj = err.As<v8::Object>();
+++ obj->Set(v8::String::New("code"), v8::Int32::New(errorNumber));
+++ return err;
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanThrowError(
+++ const char *msg
+++ , const int errorNumber
+++ ) {
+++ return NanThrowError(NanError(msg, errorNumber));
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanTypeError(const char* errmsg) {
+++ return _NAN_ERROR(v8::Exception::TypeError, errmsg);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanThrowTypeError(
+++ const char* errmsg
+++ ) {
+++ _NAN_THROW_ERROR(v8::Exception::TypeError, errmsg);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanRangeError(
+++ const char* errmsg
+++ ) {
+++ return _NAN_ERROR(v8::Exception::RangeError, errmsg);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanThrowRangeError(
+++ const char* errmsg
+++ ) {
+++ _NAN_THROW_ERROR(v8::Exception::RangeError, errmsg);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE void NanDisposePersistent(
+++ v8::Persistent<T> &handle) { // NOLINT(runtime/references)
+++ handle.Dispose();
+++ handle.Clear();
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Object> NanNewBufferHandle (
+++ char *data
+++ , size_t length
+++ , node::Buffer::free_callback callback
+++ , void *hint
+++ ) {
+++ return NanNew(
+++ node::Buffer::New(data, length, callback, hint)->handle_);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Object> NanNewBufferHandle (
+++ const char *data
+++ , uint32_t size
+++ ) {
+++#if NODE_MODULE_VERSION >= 0x000B
+++ return NanNew(node::Buffer::New(data, size)->handle_);
+++#else
+++ return NanNew(
+++ node::Buffer::New(const_cast<char*>(data), size)->handle_);
+++#endif
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Object> NanNewBufferHandle (uint32_t size) {
+++ return NanNew(node::Buffer::New(size)->handle_);
+++ }
+++
+++ NAN_INLINE void FreeData(char *data, void *hint) {
+++ delete[] data;
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Object> NanBufferUse(
+++ char* data
+++ , uint32_t size
+++ ) {
+++ return NanNew(
+++ node::Buffer::New(data, size, FreeData, NULL)->handle_);
+++ }
+++
+++ NAN_INLINE bool NanHasInstance(
+++ v8::Persistent<v8::FunctionTemplate>& function_template
+++ , v8::Handle<v8::Value> value
+++ ) {
+++ return function_template->HasInstance(value);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Context> NanNewContextHandle(
+++ v8::ExtensionConfiguration* extensions = NULL
+++ , v8::Handle<v8::ObjectTemplate> tmpl = v8::Handle<v8::ObjectTemplate>()
+++ , v8::Handle<v8::Value> obj = v8::Handle<v8::Value>()
+++ ) {
+++ v8::Persistent<v8::Context> ctx = v8::Context::New(extensions, tmpl, obj);
+++ v8::Local<v8::Context> lctx = NanNew(ctx);
+++ ctx.Dispose();
+++ return lctx;
+++ }
+++
+++ NAN_INLINE v8::Local<NanBoundScript> NanCompileScript(
+++ v8::Local<v8::String> s
+++ , const v8::ScriptOrigin& origin
+++ ) {
+++ return v8::Script::Compile(s, const_cast<v8::ScriptOrigin *>(&origin));
+++ }
+++
+++ NAN_INLINE v8::Local<NanBoundScript> NanCompileScript(
+++ v8::Local<v8::String> s
+++ ) {
+++ return v8::Script::Compile(s);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanRunScript(v8::Handle<v8::Script> script) {
+++ return script->Run();
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanMakeCallback(
+++ v8::Handle<v8::Object> target
+++ , v8::Handle<v8::Function> func
+++ , int argc
+++ , v8::Handle<v8::Value>* argv) {
+++# if NODE_VERSION_AT_LEAST(0, 8, 0)
+++ return NanNew(node::MakeCallback(target, func, argc, argv));
+++# else
+++ v8::TryCatch try_catch;
+++ v8::Local<v8::Value> result = NanNew(func->Call(target, argc, argv));
+++ if (try_catch.HasCaught()) {
+++ node::FatalException(try_catch);
+++ }
+++ return result;
+++# endif
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanMakeCallback(
+++ v8::Handle<v8::Object> target
+++ , v8::Handle<v8::String> symbol
+++ , int argc
+++ , v8::Handle<v8::Value>* argv) {
+++# if NODE_VERSION_AT_LEAST(0, 8, 0)
+++ return NanNew(node::MakeCallback(target, symbol, argc, argv));
+++# else
+++ v8::Local<v8::Function> callback = target->Get(symbol).As<v8::Function>();
+++ return NanMakeCallback(target, callback, argc, argv);
+++# endif
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Value> NanMakeCallback(
+++ v8::Handle<v8::Object> target
+++ , const char* method
+++ , int argc
+++ , v8::Handle<v8::Value>* argv) {
+++# if NODE_VERSION_AT_LEAST(0, 8, 0)
+++ return NanNew(node::MakeCallback(target, method, argc, argv));
+++# else
+++ return NanMakeCallback(target, NanNew(method), argc, argv);
+++# endif
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE void NanSetIsolateData(
+++ v8::Isolate *isolate
+++ , T *data
+++ ) {
+++ isolate->SetData(data);
+++ }
+++
+++ template<typename T>
+++ NAN_INLINE T *NanGetIsolateData(
+++ v8::Isolate *isolate
+++ ) {
+++ return static_cast<T*>(isolate->GetData());
+++ }
+++
+++ class NanAsciiString {
+++ public:
+++ NAN_INLINE explicit NanAsciiString(v8::Handle<v8::Value> from) {
+++ v8::Local<v8::String> toStr = from->ToString();
+++ int buf_size = toStr->Length() + 1;
+++ buf = new char[buf_size];
+++ size = toStr->WriteAscii(buf, 0, buf_size);
+++ }
+++
+++ NAN_INLINE int Size() const {
+++ return size;
+++ }
+++
+++ NAN_INLINE char* operator*() { return buf; }
+++
+++ NAN_INLINE ~NanAsciiString() {
+++ delete[] buf;
+++ }
+++
+++ private:
+++ char *buf;
+++ int size;
+++ };
+++
+++ class NanUtf8String {
+++ public:
+++ NAN_INLINE explicit NanUtf8String(v8::Handle<v8::Value> from) {
+++ v8::Local<v8::String> toStr = from->ToString();
+++ int buf_size = toStr->Utf8Length() + 1;
+++ buf = new char[buf_size];
+++ size = toStr->WriteUtf8(buf, buf_size);
+++ }
+++
+++ NAN_INLINE int Size() const {
+++ return size;
+++ }
+++
+++ NAN_INLINE char* operator*() { return buf; }
+++
+++ NAN_INLINE ~NanUtf8String() {
+++ delete[] buf;
+++ }
+++
+++ private:
+++ char *buf;
+++ int size;
+++ };
+++
+++ class NanUcs2String {
+++ public:
+++ NAN_INLINE explicit NanUcs2String(v8::Handle<v8::Value> from) {
+++ v8::Local<v8::String> toStr = from->ToString();
+++ int buf_size = toStr->Length() + 1;
+++ buf = new uint16_t[buf_size];
+++ size = toStr->Write(buf, 0, buf_size);
+++ }
+++
+++ NAN_INLINE int Size() const {
+++ return size;
+++ }
+++
+++ NAN_INLINE uint16_t* operator*() { return buf; }
+++
+++ NAN_INLINE ~NanUcs2String() {
+++ delete[] buf;
+++ }
+++
+++ private:
+++ uint16_t *buf;
+++ int size;
+++ };
+++
+++#endif // NODE_MODULE_VERSION
+++
+++typedef void (*NanFreeCallback)(char *data, void *hint);
+++
+++#define NAN_METHOD(name) _NAN_METHOD_RETURN_TYPE name(_NAN_METHOD_ARGS)
+++#define NAN_GETTER(name) \
+++ _NAN_GETTER_RETURN_TYPE name( \
+++ v8::Local<v8::String> property \
+++ , _NAN_GETTER_ARGS)
+++#define NAN_SETTER(name) \
+++ _NAN_SETTER_RETURN_TYPE name( \
+++ v8::Local<v8::String> property \
+++ , v8::Local<v8::Value> value \
+++ , _NAN_SETTER_ARGS)
+++#define NAN_PROPERTY_GETTER(name) \
+++ _NAN_PROPERTY_GETTER_RETURN_TYPE name( \
+++ v8::Local<v8::String> property \
+++ , _NAN_PROPERTY_GETTER_ARGS)
+++#define NAN_PROPERTY_SETTER(name) \
+++ _NAN_PROPERTY_SETTER_RETURN_TYPE name( \
+++ v8::Local<v8::String> property \
+++ , v8::Local<v8::Value> value \
+++ , _NAN_PROPERTY_SETTER_ARGS)
+++#define NAN_PROPERTY_ENUMERATOR(name) \
+++ _NAN_PROPERTY_ENUMERATOR_RETURN_TYPE name(_NAN_PROPERTY_ENUMERATOR_ARGS)
+++#define NAN_PROPERTY_DELETER(name) \
+++ _NAN_PROPERTY_DELETER_RETURN_TYPE name( \
+++ v8::Local<v8::String> property \
+++ , _NAN_PROPERTY_DELETER_ARGS)
+++#define NAN_PROPERTY_QUERY(name) \
+++ _NAN_PROPERTY_QUERY_RETURN_TYPE name( \
+++ v8::Local<v8::String> property \
+++ , _NAN_PROPERTY_QUERY_ARGS)
+++# define NAN_INDEX_GETTER(name) \
+++ _NAN_INDEX_GETTER_RETURN_TYPE name(uint32_t index, _NAN_INDEX_GETTER_ARGS)
+++#define NAN_INDEX_SETTER(name) \
+++ _NAN_INDEX_SETTER_RETURN_TYPE name( \
+++ uint32_t index \
+++ , v8::Local<v8::Value> value \
+++ , _NAN_INDEX_SETTER_ARGS)
+++#define NAN_INDEX_ENUMERATOR(name) \
+++ _NAN_INDEX_ENUMERATOR_RETURN_TYPE name(_NAN_INDEX_ENUMERATOR_ARGS)
+++#define NAN_INDEX_DELETER(name) \
+++ _NAN_INDEX_DELETER_RETURN_TYPE name( \
+++ uint32_t index \
+++ , _NAN_INDEX_DELETER_ARGS)
+++#define NAN_INDEX_QUERY(name) \
+++ _NAN_INDEX_QUERY_RETURN_TYPE name(uint32_t index, _NAN_INDEX_QUERY_ARGS)
+++
+++class NanCallback {
+++ public:
+++ NanCallback() {
+++ NanScope();
+++ v8::Local<v8::Object> obj = NanNew<v8::Object>();
+++ NanAssignPersistent(handle, obj);
+++ }
+++
+++ explicit NanCallback(const v8::Handle<v8::Function> &fn) {
+++ NanScope();
+++ v8::Local<v8::Object> obj = NanNew<v8::Object>();
+++ NanAssignPersistent(handle, obj);
+++ SetFunction(fn);
+++ }
+++
+++ ~NanCallback() {
+++ if (handle.IsEmpty()) return;
+++ NanDisposePersistent(handle);
+++ }
+++
+++ NAN_INLINE void SetFunction(const v8::Handle<v8::Function> &fn) {
+++ NanScope();
+++ NanNew(handle)->Set(kCallbackIndex, fn);
+++ }
+++
+++ NAN_INLINE v8::Local<v8::Function> GetFunction() const {
+++ NanEscapableScope();
+++ return NanEscapeScope(NanNew(handle)->Get(kCallbackIndex)
+++ .As<v8::Function>());
+++ }
+++
+++ NAN_INLINE bool IsEmpty() const {
+++ NanScope();
+++ return NanNew(handle)->Get(kCallbackIndex)->IsUndefined();
+++ }
+++
+++ v8::Handle<v8::Value> Call(int argc, v8::Handle<v8::Value> argv[]) const {
+++ NanEscapableScope();
+++#if (NODE_MODULE_VERSION > 0x000B) // 0.11.12+
+++ v8::Isolate* isolate = v8::Isolate::GetCurrent();
+++ v8::Local<v8::Function> callback = NanNew(handle)->
+++ Get(kCallbackIndex).As<v8::Function>();
+++ return NanEscapeScope(node::MakeCallback(
+++ isolate
+++ , isolate->GetCurrentContext()->Global()
+++ , callback
+++ , argc
+++ , argv
+++ ));
+++#else
+++#if NODE_VERSION_AT_LEAST(0, 8, 0)
+++ v8::Local<v8::Function> callback = handle->
+++ Get(kCallbackIndex).As<v8::Function>();
+++ return NanEscapeScope(node::MakeCallback(
+++ v8::Context::GetCurrent()->Global()
+++ , callback
+++ , argc
+++ , argv
+++ ));
+++#else
+++ v8::Local<v8::Function> callback = handle->
+++ Get(kCallbackIndex).As<v8::Function>();
+++ return NanEscapeScope(NanMakeCallback(
+++ v8::Context::GetCurrent()->Global(), callback, argc, argv));
+++#endif
+++#endif
+++ }
+++
+++ private:
+++ v8::Persistent<v8::Object> handle;
+++ static const uint32_t kCallbackIndex = 0;
+++};
+++
+++/* abstract */ class NanAsyncWorker {
+++ public:
+++ explicit NanAsyncWorker(NanCallback *callback)
+++ : callback(callback), errmsg_(NULL) {
+++ request.data = this;
+++
+++ NanScope();
+++ v8::Local<v8::Object> obj = NanNew<v8::Object>();
+++ NanAssignPersistent(persistentHandle, obj);
+++ }
+++
+++ virtual ~NanAsyncWorker() {
+++ NanScope();
+++
+++ if (!persistentHandle.IsEmpty())
+++ NanDisposePersistent(persistentHandle);
+++ if (callback)
+++ delete callback;
+++ if (errmsg_)
+++ delete[] errmsg_;
+++ }
+++
+++ virtual void WorkComplete() {
+++ NanScope();
+++
+++ if (errmsg_ == NULL)
+++ HandleOKCallback();
+++ else
+++ HandleErrorCallback();
+++ delete callback;
+++ callback = NULL;
+++ }
+++
+++ NAN_INLINE void SaveToPersistent(
+++ const char *key, const v8::Local<v8::Object> &obj) {
+++ v8::Local<v8::Object> handle = NanNew(persistentHandle);
+++ handle->Set(NanNew<v8::String>(key), obj);
+++ }
+++
+++ v8::Local<v8::Object> GetFromPersistent(const char *key) const {
+++ NanEscapableScope();
+++ v8::Local<v8::Object> handle = NanNew(persistentHandle);
+++ return NanEscapeScope(handle->Get(NanNew(key)).As<v8::Object>());
+++ }
+++
+++ virtual void Execute() = 0;
+++
+++ uv_work_t request;
+++
+++ protected:
+++ v8::Persistent<v8::Object> persistentHandle;
+++ NanCallback *callback;
+++
+++ virtual void HandleOKCallback() {
+++ NanScope();
+++
+++ callback->Call(0, NULL);
+++ }
+++
+++ virtual void HandleErrorCallback() {
+++ NanScope();
+++
+++ v8::Local<v8::Value> argv[] = {
+++ v8::Exception::Error(NanNew<v8::String>(ErrorMessage()))
+++ };
+++ callback->Call(1, argv);
+++ }
+++
+++ void SetErrorMessage(const char *msg) {
+++ if (errmsg_) {
+++ delete[] errmsg_;
+++ }
+++
+++ size_t size = strlen(msg) + 1;
+++ errmsg_ = new char[size];
+++ memcpy(errmsg_, msg, size);
+++ }
+++
+++ const char* ErrorMessage() const {
+++ return errmsg_;
+++ }
+++
+++ private:
+++ char *errmsg_;
+++};
+++
+++NAN_INLINE void NanAsyncExecute (uv_work_t* req) {
+++ NanAsyncWorker *worker = static_cast<NanAsyncWorker*>(req->data);
+++ worker->Execute();
+++}
+++
+++NAN_INLINE void NanAsyncExecuteComplete (uv_work_t* req) {
+++ NanAsyncWorker* worker = static_cast<NanAsyncWorker*>(req->data);
+++ worker->WorkComplete();
+++ delete worker;
+++}
+++
+++NAN_INLINE void NanAsyncQueueWorker (NanAsyncWorker* worker) {
+++ uv_queue_work(
+++ uv_default_loop()
+++ , &worker->request
+++ , NanAsyncExecute
+++ , (uv_after_work_cb)NanAsyncExecuteComplete
+++ );
+++}
+++
+++//// Base 64 ////
+++
+++#define _nan_base64_encoded_size(size) ((size + 2 - ((size + 2) % 3)) / 3 * 4)
+++
+++// Doesn't check for padding at the end. Can be 1-2 bytes over.
+++NAN_INLINE size_t _nan_base64_decoded_size_fast(size_t size) {
+++ size_t remainder = size % 4;
+++
+++ size = (size / 4) * 3;
+++ if (remainder) {
+++ if (size == 0 && remainder == 1) {
+++ // special case: 1-byte input cannot be decoded
+++ size = 0;
+++ } else {
+++ // non-padded input, add 1 or 2 extra bytes
+++ size += 1 + (remainder == 3);
+++ }
+++ }
+++
+++ return size;
+++}
+++
+++template<typename T>
+++NAN_INLINE size_t _nan_base64_decoded_size(
+++ const T* src
+++ , size_t size
+++) {
+++ if (size == 0)
+++ return 0;
+++
+++ if (src[size - 1] == '=')
+++ size--;
+++ if (size > 0 && src[size - 1] == '=')
+++ size--;
+++
+++ return _nan_base64_decoded_size_fast(size);
+++}
+++
+++// supports regular and URL-safe base64
+++static const int _nan_unbase64_table[] = {
+++ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, -2, -1, -1
+++ , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+++ , -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63
+++ , 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1
+++ , -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
+++ , 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63
+++ , -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40
+++ , 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
+++ , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+++ , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+++ , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+++ , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+++ , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+++ , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+++ , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+++ , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+++};
+++
+++#define _nan_unbase64(x) _nan_unbase64_table[(uint8_t)(x)]
+++
+++template<typename T> static size_t _nan_base64_decode(
+++ char* buf
+++ , size_t len
+++ , const T* src
+++ , const size_t srcLen
+++) {
+++ char* dst = buf;
+++ char* dstEnd = buf + len;
+++ const T* srcEnd = src + srcLen;
+++
+++ while (src < srcEnd && dst < dstEnd) {
+++ ptrdiff_t remaining = srcEnd - src;
+++ char a, b, c, d;
+++
+++ while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--;
+++ if (remaining == 0 || *src == '=') break;
+++ a = _nan_unbase64(*src++);
+++
+++ while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--;
+++ if (remaining <= 1 || *src == '=') break;
+++ b = _nan_unbase64(*src++);
+++
+++ *dst++ = (a << 2) | ((b & 0x30) >> 4);
+++ if (dst == dstEnd) break;
+++
+++ while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--;
+++ if (remaining <= 2 || *src == '=') break;
+++ c = _nan_unbase64(*src++);
+++
+++ *dst++ = ((b & 0x0F) << 4) | ((c & 0x3C) >> 2);
+++ if (dst == dstEnd) break;
+++
+++ while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--;
+++ if (remaining <= 3 || *src == '=') break;
+++ d = _nan_unbase64(*src++);
+++
+++ *dst++ = ((c & 0x03) << 6) | (d & 0x3F);
+++ }
+++
+++ return dst - buf;
+++}
+++
+++//// HEX ////
+++
+++template<typename T> unsigned _nan_hex2bin(T c) {
+++ if (c >= '0' && c <= '9') return c - '0';
+++ if (c >= 'A' && c <= 'F') return 10 + (c - 'A');
+++ if (c >= 'a' && c <= 'f') return 10 + (c - 'a');
+++ return static_cast<unsigned>(-1);
+++}
+++
+++template<typename T> static size_t _nan_hex_decode(
+++ char* buf
+++ , size_t len
+++ , const T* src
+++ , const size_t srcLen
+++) {
+++ size_t i;
+++ for (i = 0; i < len && i * 2 + 1 < srcLen; ++i) {
+++ unsigned a = _nan_hex2bin(src[i * 2 + 0]);
+++ unsigned b = _nan_hex2bin(src[i * 2 + 1]);
+++ if (!~a || !~b) return i;
+++ buf[i] = a * 16 + b;
+++ }
+++
+++ return i;
+++}
+++
+++static bool _NanGetExternalParts(
+++ v8::Handle<v8::Value> val
+++ , const char** data
+++ , size_t* len
+++) {
+++ if (node::Buffer::HasInstance(val)) {
+++ *data = node::Buffer::Data(val.As<v8::Object>());
+++ *len = node::Buffer::Length(val.As<v8::Object>());
+++ return true;
+++ }
+++
+++ assert(val->IsString());
+++ v8::Local<v8::String> str = NanNew(val.As<v8::String>());
+++
+++ if (str->IsExternalAscii()) {
+++ const v8::String::ExternalAsciiStringResource* ext;
+++ ext = str->GetExternalAsciiStringResource();
+++ *data = ext->data();
+++ *len = ext->length();
+++ return true;
+++
+++ } else if (str->IsExternal()) {
+++ const v8::String::ExternalStringResource* ext;
+++ ext = str->GetExternalStringResource();
+++ *data = reinterpret_cast<const char*>(ext->data());
+++ *len = ext->length();
+++ return true;
+++ }
+++
+++ return false;
+++}
+++
+++namespace Nan {
+++ enum Encoding {ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER};
+++}
+++
+++/* NAN_DEPRECATED */ NAN_INLINE void* _NanRawString(
+++ v8::Handle<v8::Value> from
+++ , enum Nan::Encoding encoding
+++ , size_t *datalen
+++ , void *buf
+++ , size_t buflen
+++ , int flags
+++) {
+++ NanScope();
+++
+++ size_t sz_;
+++ size_t term_len = !(flags & v8::String::NO_NULL_TERMINATION);
+++ char *data = NULL;
+++ size_t len;
+++ bool is_extern = _NanGetExternalParts(
+++ from
+++ , const_cast<const char**>(&data)
+++ , &len);
+++
+++ if (is_extern && !term_len) {
+++ NanSetPointerSafe(datalen, len);
+++ return data;
+++ }
+++
+++ v8::Local<v8::String> toStr = from->ToString();
+++
+++ char *to = static_cast<char *>(buf);
+++
+++ switch (encoding) {
+++ case Nan::ASCII:
+++#if NODE_MODULE_VERSION < 0x000C
+++ sz_ = toStr->Length();
+++ if (to == NULL) {
+++ to = new char[sz_ + term_len];
+++ } else {
+++ assert(buflen >= sz_ + term_len && "too small buffer");
+++ }
+++ NanSetPointerSafe<size_t>(
+++ datalen
+++ , toStr->WriteAscii(to, 0, static_cast<int>(sz_ + term_len), flags));
+++ return to;
+++#endif
+++ case Nan::BINARY:
+++ case Nan::BUFFER:
+++ sz_ = toStr->Length();
+++ if (to == NULL) {
+++ to = new char[sz_ + term_len];
+++ } else {
+++ assert(buflen >= sz_ + term_len && "too small buffer");
+++ }
+++#if NODE_MODULE_VERSION < 0x000C
+++ {
+++ uint16_t* twobytebuf = new uint16_t[sz_ + term_len];
+++
+++ size_t len = toStr->Write(twobytebuf, 0,
+++ static_cast<int>(sz_ + term_len), flags);
+++
+++ for (size_t i = 0; i < sz_ + term_len && i < len + term_len; i++) {
+++ unsigned char *b = reinterpret_cast<unsigned char*>(&twobytebuf[i]);
+++ to[i] = *b;
+++ }
+++
+++ NanSetPointerSafe<size_t>(datalen, len);
+++
+++ delete[] twobytebuf;
+++ return to;
+++ }
+++#else
+++ NanSetPointerSafe<size_t>(
+++ datalen,
+++ toStr->WriteOneByte(
+++ reinterpret_cast<uint8_t *>(to)
+++ , 0
+++ , static_cast<int>(sz_ + term_len)
+++ , flags));
+++ return to;
+++#endif
+++ case Nan::UTF8:
+++ sz_ = toStr->Utf8Length();
+++ if (to == NULL) {
+++ to = new char[sz_ + term_len];
+++ } else {
+++ assert(buflen >= sz_ + term_len && "too small buffer");
+++ }
+++ NanSetPointerSafe<size_t>(
+++ datalen
+++ , toStr->WriteUtf8(to, static_cast<int>(sz_ + term_len)
+++ , NULL, flags)
+++ - term_len);
+++ return to;
+++ case Nan::BASE64:
+++ {
+++ v8::String::Value value(toStr);
+++ sz_ = _nan_base64_decoded_size(*value, value.length());
+++ if (to == NULL) {
+++ to = new char[sz_ + term_len];
+++ } else {
+++ assert(buflen >= sz_ + term_len);
+++ }
+++ NanSetPointerSafe<size_t>(
+++ datalen
+++ , _nan_base64_decode(to, sz_, *value, value.length()));
+++ if (term_len) {
+++ to[sz_] = '\0';
+++ }
+++ return to;
+++ }
+++ case Nan::UCS2:
+++ {
+++ sz_ = toStr->Length();
+++ if (to == NULL) {
+++ to = new char[(sz_ + term_len) * 2];
+++ } else {
+++ assert(buflen >= (sz_ + term_len) * 2 && "too small buffer");
+++ }
+++
+++ int bc = 2 * toStr->Write(
+++ reinterpret_cast<uint16_t *>(to)
+++ , 0
+++ , static_cast<int>(sz_ + term_len)
+++ , flags);
+++ NanSetPointerSafe<size_t>(datalen, bc);
+++ return to;
+++ }
+++ case Nan::HEX:
+++ {
+++ v8::String::Value value(toStr);
+++ sz_ = value.length();
+++ assert(!(sz_ & 1) && "bad hex data");
+++ if (to == NULL) {
+++ to = new char[sz_ / 2 + term_len];
+++ } else {
+++ assert(buflen >= sz_ / 2 + term_len && "too small buffer");
+++ }
+++ NanSetPointerSafe<size_t>(
+++ datalen
+++ , _nan_hex_decode(to, sz_ / 2, *value, value.length()));
+++ }
+++ if (term_len) {
+++ to[sz_ / 2] = '\0';
+++ }
+++ return to;
+++ default:
+++ assert(0 && "unknown encoding");
+++ }
+++ return to;
+++}
+++
+++NAN_DEPRECATED NAN_INLINE void* NanRawString(
+++ v8::Handle<v8::Value> from
+++ , enum Nan::Encoding encoding
+++ , size_t *datalen
+++ , void *buf
+++ , size_t buflen
+++ , int flags
+++) {
+++ return _NanRawString(from, encoding, datalen, buf, buflen, flags);
+++}
+++
+++
+++NAN_DEPRECATED NAN_INLINE char* NanCString(
+++ v8::Handle<v8::Value> from
+++ , size_t *datalen
+++ , char *buf = NULL
+++ , size_t buflen = 0
+++ , int flags = v8::String::NO_OPTIONS
+++) {
+++ return static_cast<char *>(
+++ _NanRawString(from, Nan::UTF8, datalen, buf, buflen, flags)
+++ );
+++}
+++
+++NAN_INLINE void NanSetPrototypeTemplate(
+++ v8::Local<v8::FunctionTemplate> templ
+++ , const char *name
+++ , v8::Handle<v8::Data> value
+++) {
+++ NanSetTemplate(templ->PrototypeTemplate(), name, value);
+++}
+++
+++NAN_INLINE void NanSetPrototypeTemplate(
+++ v8::Local<v8::FunctionTemplate> templ
+++ , v8::Handle<v8::String> name
+++ , v8::Handle<v8::Data> value
+++ , v8::PropertyAttribute attributes
+++) {
+++ NanSetTemplate(templ->PrototypeTemplate(), name, value, attributes);
+++}
+++
+++NAN_INLINE void NanSetInstanceTemplate(
+++ v8::Local<v8::FunctionTemplate> templ
+++ , const char *name
+++ , v8::Handle<v8::Data> value
+++) {
+++ NanSetTemplate(templ->InstanceTemplate(), name, value);
+++}
+++
+++NAN_INLINE void NanSetInstanceTemplate(
+++ v8::Local<v8::FunctionTemplate> templ
+++ , v8::Handle<v8::String> name
+++ , v8::Handle<v8::Data> value
+++ , v8::PropertyAttribute attributes
+++) {
+++ NanSetTemplate(templ->InstanceTemplate(), name, value, attributes);
+++}
+++
+++#endif // NAN_H_
+diff --git a/feeds/packages/lang/node-serialport/Makefile b/feeds/packages/lang/node-serialport/Makefile
+new file mode 100644
+index 0000000..ad4b7af
+--- /dev/null
++++ b/feeds/packages/lang/node-serialport/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2014 Arduino LLC
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NPM_NAME:=serialport
++PKG_NAME:=node-$(PKG_NPM_NAME)
++PKG_VERSION:=1.4.6
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NPM_NAME)-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=http://registry.npmjs.org/$(PKG_NPM_NAME)/-/
++PKG_MD5SUM:=1eb21082e0aa676b8350182a60230808
++
++PKG_BUILD_DEPENDS:=node
++PKG_NODE_VERSION:=0.12.7
++
++PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
++PKG_LICENSE:=Custom
++PKG_LICENSE_FILE:=LICENSE
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/node-serialport
++ DEPENDS:=+node
++ SUBMENU:=Node.js
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Node.js package to access serial ports for reading and writing
++ URL:=https://www.npmjs.org/package/serialport
++endef
++
++define Package/node-serialport/description
++ Node.js package to access serial ports for reading and writing OR Welcome your robotic JavaScript overlords. Better yet, program them!
++endef
++
++define Build/Prepare
++ /bin/tar xzf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_BUILD_DIR) --strip-components 1
++ $(Build/Patch)
++endef
++
++EXTRA_LDFLAGS="-L$(TOOLCHAIN_DIR)/lib/ -Wl,-rpath-link $(TOOLCHAIN_DIR)/lib/" \
++
++define Build/Compile
++ $(MAKE_FLAGS) \
++ npm_config_arch=$(CONFIG_ARCH) \
++ npm_config_nodedir=$(BUILD_DIR)/node-v$(PKG_NODE_VERSION)/ \
++ PREFIX="$(PKG_INSTALL_DIR)/usr/" \
++ $(STAGING_DIR_HOST)/bin/npm install -g $(PKG_BUILD_DIR)
++endef
++
++define Package/node-serialport/install
++ mkdir -p $(1)/usr/lib/node/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/* $(1)/usr/lib/node/
++endef
++
++$(eval $(call BuildPackage,node-serialport))
++
+diff --git a/feeds/packages/lang/node-serialport/patches/package.json.patch b/feeds/packages/lang/node-serialport/patches/package.json.patch
+new file mode 100644
+index 0000000..a20c6a5
+--- /dev/null
++++ b/feeds/packages/lang/node-serialport/patches/package.json.patch
+@@ -0,0 +1,11 @@
++--- a/package.json 2014-05-02 12:02:02.940515727 +0200
+++++ b/package.json 2014-05-02 12:03:08.488512762 +0200
++@@ -69,7 +71,7 @@
++ "serialportterm": "./bin/serialportTerminal.js"
++ },
++ "scripts": {
++- "install": "node-pre-gyp install --fallback-to-build",
+++ "install": "node-pre-gyp reinstall --build-from-source --target_arch=${npm_config_arch}",
++ "test": "grunt --verbose"
++ }
++ }
+diff --git a/feeds/packages/lang/node/Makefile b/feeds/packages/lang/node/Makefile
+new file mode 100644
+index 0000000..65a5390
+--- /dev/null
++++ b/feeds/packages/lang/node/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2006-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=node
++PKG_VERSION:=v0.12.7
++PKG_RELEASE:=1
++
++PKG_SOURCE:=node-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://nodejs.org/dist/${PKG_VERSION}
++
++PKG_BUILD_DEPENDS:=python/host
++PKG_INSTALL:=1
++PKG_USE_MIPS16:=0
++
++PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
++PKG_LICENSE:=
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/node
++ SECTION:=lang
++ CATEGORY:=Languages
++ SUBMENU:=Node.js
++ TITLE:=Node.js is a platform built on Chrome's JavaScript runtime
++ URL:=http://nodejs.org/
++ DEPENDS:=+libpthread +librt +libstdcpp +libopenssl +libuv
++endef
++
++define Package/node/description
++ Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses
++ an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js'
++ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
++endef
++
++CONFIGURE_ARGS= \
++ --dest-cpu=$(CONFIG_ARCH) \
++ --dest-os=linux \
++ --without-snapshot \
++ --shared-zlib \
++ --shared-openssl \
++ --prefix=/usr
++
++HOST_CONFIGURE_VARS:=
++HOST_CONFIGURE_ARGS:= \
++ --dest-os=linux \
++ --without-snapshot \
++ --prefix=$(STAGING_DIR_HOST)/
++
++HOST_CONFIGURE_CMD:=python ./configure
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++endef
++
++define Package/node/install
++ mkdir -p $(1)/usr/bin $(1)/usr/lib/node_modules/npm/{bin,lib,node_modules}
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/{node,npm} $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/npm/{package.json,LICENSE,cli.js} $(1)/usr/lib/node_modules/npm
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/npm/bin/npm-cli.js $(1)/usr/lib/node_modules/npm/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/npm/lib/* $(1)/usr/lib/node_modules/npm/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/npm/node_modules/* $(1)/usr/lib/node_modules/npm/node_modules/
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,node))
+diff --git a/feeds/packages/lang/node/patches/001-mips-no-fpu.patch b/feeds/packages/lang/node/patches/001-mips-no-fpu.patch
+new file mode 100644
+index 0000000..5bf8142
+--- /dev/null
++++ b/feeds/packages/lang/node/patches/001-mips-no-fpu.patch
+@@ -0,0 +1,15 @@
++--- a/deps/v8/build/toolchain.gypi
+++++ b/deps/v8/build/toolchain.gypi
++@@ -50,10 +50,10 @@
++ 'arm_test_noprobe%': 'off',
++
++ # Similar to vfp but on MIPS.
++- 'v8_can_use_fpu_instructions%': 'true',
+++ 'v8_can_use_fpu_instructions%': 'false',
++
++ # Similar to the ARM hard float ABI but on MIPS.
++- 'v8_use_mips_abi_hardfloat%': 'true',
+++ 'v8_use_mips_abi_hardfloat%': 'false',
++
++ # Default arch variant for MIPS.
++ 'mips_arch_variant%': 'r2',
+diff --git a/feeds/packages/lang/node/patches/002-addr_info.patch b/feeds/packages/lang/node/patches/002-addr_info.patch
+new file mode 100644
+index 0000000..78225db
+--- /dev/null
++++ b/feeds/packages/lang/node/patches/002-addr_info.patch
+@@ -0,0 +1,10 @@
++--- a/deps/uv/src/unix/getaddrinfo.c
+++++ b/deps/uv/src/unix/getaddrinfo.c
++@@ -99,6 +99,7 @@
++ int err;
++
++ req = container_of(w, uv_getaddrinfo_t, work_req);
+++ req->hints->ai_flags &= ~AI_V4MAPPED;
++ err = getaddrinfo(req->hostname, req->service, req->hints, &req->addrinfo);
++ req->retcode = uv__getaddrinfo_translate_error(err);
++ }
+diff --git a/feeds/packages/lang/node/patches/003-path.patch b/feeds/packages/lang/node/patches/003-path.patch
+new file mode 100644
+index 0000000..723fe9d
+--- /dev/null
++++ b/feeds/packages/lang/node/patches/003-path.patch
+@@ -0,0 +1,12 @@
++--- a/lib/module.js
+++++ b/lib/module.js
++@@ -512,7 +512,8 @@
++ var homeDir = process.env.HOME;
++ }
++
++- var paths = [path.resolve(process.execPath, '..', '..', 'lib', 'node')];
+++ var paths = [path.resolve(process.execPath, '..', '..', 'lib', 'node'),
+++ path.resolve(process.execPath, '..', '..', 'lib', 'node_modules')];
++
++ if (homeDir) {
++ paths.unshift(path.resolve(homeDir, '.node_libraries'));
+diff --git a/feeds/packages/lang/perl-cgi/Makefile b/feeds/packages/lang/perl-cgi/Makefile
+new file mode 100644
+index 0000000..51af315
+--- /dev/null
++++ b/feeds/packages/lang/perl-cgi/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-cgi
++PKG_VERSION:=4.22
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/L/LE/LEEJO
++PKG_SOURCE:=CGI-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=8289aa6f2cba9589134d517f4a25da9e
++
++PKG_LICENSE:=GPL Artistic-2.0
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/CGI-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-cgi
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Handle Common Gateway Interface requests and responses
++ URL:=http://search.cpan.org/dist/CGI/
++ DEPENDS:=perl +perl-html-parser +perlbase-base +perlbase-config +perlbase-encode +perlbase-essential +perlbase-file +perlbase-if +perlbase-utf8
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-cgi/install
++ $(call perlmod/Install,$(1),CGI auto/CGI)
++endef
++
++
++$(eval $(call BuildPackage,perl-cgi))
+diff --git a/feeds/packages/lang/perl-compress-bzip2/Makefile b/feeds/packages/lang/perl-compress-bzip2/Makefile
+new file mode 100644
+index 0000000..e6c7c8f
+--- /dev/null
++++ b/feeds/packages/lang/perl-compress-bzip2/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2014, 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-compress-bzip2
++PKG_VERSION:=2.22
++PKG_RELEASE:=4
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/R/RU/RURBAN/
++PKG_SOURCE:=Compress-Bzip2-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=0d01b86c3efa74e29bb975aea46b666f
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Compress-Bzip2-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-compress-bzip2
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Perl interface to bzip2 compression library
++ URL:=http://search.cpan.org/dist/Compress-Bzip2/
++ DEPENDS:=perl +libbz2 +perlbase-autoloader +perlbase-config +perlbase-essential +perlbase-fcntl +perlbase-file +perlbase-getopt +perlbase-test +perlbase-xsloader
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,BUILD_BZLIB=0)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-compress-bzip2/install
++ $(call perlmod/Install,$(1),Compress auto/Compress)
++endef
++
++
++$(eval $(call BuildPackage,perl-compress-bzip2))
+diff --git a/feeds/packages/lang/perl-dbi/Makefile b/feeds/packages/lang/perl-dbi/Makefile
+new file mode 100644
+index 0000000..3c594d1
+--- /dev/null
++++ b/feeds/packages/lang/perl-dbi/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2014, 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-dbi
++PKG_VERSION:=1.634
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/T/TI/TIMB/
++PKG_SOURCE:=DBI-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=4ad15a9c2cc9b68e3fe1f5cadf9cdb30
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/DBI-$(PKG_VERSION)
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/perl/DBI-$(PKG_VERSION)
++
++HOST_BUILD_DEPENDS:=perl/host
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/host-build.mk
++include ../perl/perlmod.mk
++
++define Package/perl-dbi
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Database independent interface for Perl
++ URL:=http://search.cpan.org/dist/DBI/
++ DEPENDS:=perl +perlbase-base +perlbase-config +perlbase-cwd +perlbase-data +perlbase-dynaloader +perlbase-errno +perlbase-essential +perlbase-fcntl +perlbase-file +perlbase-io +perlbase-ipc +perlbase-scalar +perlbase-storable +perlbase-symbol +perlbase-tie +perlbase-universal +perlbase-utf8
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Host/Configure
++ $(call perlmod/host/Configure,,)
++endef
++
++define Host/Compile
++ $(call perlmod/host/Compile,,)
++endef
++
++define Host/Install
++ $(call perlmod/host/Install,$(1),)
++endef
++
++define Package/perl-dbi/install
++ $(call perlmod/Install,$(1),DB* auto/DBI,DBI/W32ODBC.pm auto/DBI/*.h)
++endef
++
++
++$(eval $(call BuildPackage,perl-dbi))
++$(eval $(call HostBuild))
+diff --git a/feeds/packages/lang/perl-device-serialport/Makefile b/feeds/packages/lang/perl-device-serialport/Makefile
+new file mode 100644
+index 0000000..2069bed
+--- /dev/null
++++ b/feeds/packages/lang/perl-device-serialport/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2014, 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-device-serialport
++PKG_VERSION:=1.04
++PKG_RELEASE:=3
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/C/CO/COOK/
++PKG_SOURCE:=Device-SerialPort-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=82c698151f934eb28c65d1838cee7d9e
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Paul Oranje <por@xs4all.nl>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Device-SerialPort-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-device-serialport
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=A POSIX-based version of the Win32::SerialPort module
++ URL:=http://search.cpan.org/dist/Device-SerialPort/
++ DEPENDS:=perl +perlbase-essential +perlbase-io +perlbase-posix +perlbase-test +perlbase-xsloader
++endef
++
++define Package/perl-device-serialport/description
++ A POSIX-based version of the Win32::SerialPort module
++ that provides modem support to Perl applications
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-device-serialport/install
++ $(call perlmod/Install,$(1),Device auto/Device)
++endef
++
++
++$(eval $(call BuildPackage,perl-device-serialport))
+diff --git a/feeds/packages/lang/perl-device-usb/Makefile b/feeds/packages/lang/perl-device-usb/Makefile
+new file mode 100644
+index 0000000..0a2c737
+--- /dev/null
++++ b/feeds/packages/lang/perl-device-usb/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-device-usb
++PKG_VERSION:=0.36
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GW/GWADEJ/
++PKG_SOURCE:=Device-USB-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=aa91bee777f7ed7a18225a84f8795344
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Device-USB-$(PKG_VERSION)
++PKG_BUILD_DEPENDS:=perl-inline-c/host
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-device-usb
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=libusb library wrapper
++ URL:=http://search.cpan.org/dist/Device-USB/
++ DEPENDS:=perl +libusb-compat +perl-inline +perl-inline-c +perlbase-essential +perlbase-test
++endef
++
++# Device::USB will generate a second Makefile.PL to build it's native code
++# using Inline::C under _Inline/. The goal here is to prevent Inline::C from
++# running that one automatically, as we need to supply a bunch of overrides via
++# perlmod/Configure.
++# _INLINE_C_NO_COMPILE_ is an OpenWRT-specific environment variable to Inline::C
++# that does just that.
++define Build/Configure
++ $(call perlmod/Configure,,)
++
++ # Prepare a library directory where we can link againt lusb-0.1(as
++ # opposed to -lusb) to avoid confusion at runtime
++ mkdir $(PKG_BUILD_DIR)/syslib
++ $(LN) $(STAGING_DIR)/usr/lib/libusb.so $(PKG_BUILD_DIR)/syslib/libusb-0.1.so
++
++ # Generate _Inline
++ $(call perlmod/Compile,config,LIBUSB_LIBDIR=$(PKG_BUILD_DIR)/syslib \
++ _INLINE_C_NO_COMPILE_=1 \
++ _INLINE_C_SYSTEM_TYPEMAP_=$(STAGING_DIR)/usr/lib/perl5/$(PERL_VERSION)/ExtUtils/typemap)
++ $(call perlmod/Compile,dynamic,_INLINE_C_NO_COMPILE_=1)
++
++ # Configure _Inline
++ $(call perlmod/Configure,,,$(PKG_BUILD_DIR)/_Inline/build/Device/USB)
++
++ # Prevent re-configuring Inline code
++ sed 's/^dynamic :: D.*$$$$//' -i $(PKG_BUILD_DIR)/Makefile
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,,$(PKG_BUILD_DIR)/_Inline/build/Device/USB)
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-device-usb/install
++ $(call perlmod/Install,$(1),Device auto/Device)
++endef
++
++
++$(eval $(call BuildPackage,perl-device-usb))
+diff --git a/feeds/packages/lang/perl-device-usb/README.patches b/feeds/packages/lang/perl-device-usb/README.patches
+new file mode 100644
+index 0000000..66ece00
+--- /dev/null
++++ b/feeds/packages/lang/perl-device-usb/README.patches
+@@ -0,0 +1,8 @@
++This package contains some patches taken directly from Debian Jessie(stable at
++the time of writing).
++Namely, these are:
++- 100-fix_buildsystem.patch
++- 110-just_assume_libusb_is_there.diff
++
++The other patches are specific to OpenWRT, fixing bugs and resolving conflicts
++where necessary.
+\ No newline at end of file
+diff --git a/feeds/packages/lang/perl-device-usb/patches/100-fix_buildsystem.patch b/feeds/packages/lang/perl-device-usb/patches/100-fix_buildsystem.patch
+new file mode 100644
+index 0000000..5201894
+--- /dev/null
++++ b/feeds/packages/lang/perl-device-usb/patches/100-fix_buildsystem.patch
+@@ -0,0 +1,20 @@
++Description: Ignore files we do not want installed.
++Forwarded: not-needed
++Author: Tim Retout <diocles@debian.org>
++Reviewed-by: gregor herrmann <gregoa@debian.org>
++Last-Update: 2013-10-28
++
++--- a/Makefile.PL
+++++ b/Makefile.PL
++@@ -2,6 +2,11 @@
++ use warnings;
++ use Inline::MakeMaker;
++
+++sub MY::libscan {
+++ return if ($_[1] eq 'USB.pm' or $_[1] eq 'dump_usb.pl');
+++ return $_[1];
+++}
+++
++ if($^O eq 'MSWin32')
++ {
++ if(!$ENV{LIBUSB_LIBDIR} or !$ENV{LIBUSB_INCDIR})
+diff --git a/feeds/packages/lang/perl-device-usb/patches/110-just_assume_libusb_is_there.diff b/feeds/packages/lang/perl-device-usb/patches/110-just_assume_libusb_is_there.diff
+new file mode 100644
+index 0000000..9365eb4
+--- /dev/null
++++ b/feeds/packages/lang/perl-device-usb/patches/110-just_assume_libusb_is_there.diff
+@@ -0,0 +1,30 @@
++Subject: Just assume libusb is out there
++ Makefile.PL should not try to check for libusb in a given list of directories
++ as the compiler might look in other places as well.
++Origin: vendor
++Bug-Debian: http://bugs.debian.org/639677
++Forwarded: not-needed
++From: Ansgar Burchardt <ansgar@debian.org>
++Reviewed-by: gregor herrmann <gregoa@debian.org>
++Last-Update: 2013-10-28
++
++--- libdevice-usb-perl.orig/Makefile.PL
+++++ libdevice-usb-perl/Makefile.PL
++@@ -21,7 +21,7 @@
++ }
++ }
++
++-unless(header_found())
+++unless(1 || header_found())
++ {
++ die <<"END";
++ ERROR: Can't find usb.h header.
++@@ -36,7 +36,7 @@
++ END
++ }
++
++-unless(lib_found())
+++unless(1 || lib_found())
++ {
++ die <<"END";
++ ERROR: Can't find libusb library.
+diff --git a/feeds/packages/lang/perl-device-usb/patches/120-use_libusb_0_1.patch b/feeds/packages/lang/perl-device-usb/patches/120-use_libusb_0_1.patch
+new file mode 100644
+index 0000000..7d43e73
+--- /dev/null
++++ b/feeds/packages/lang/perl-device-usb/patches/120-use_libusb_0_1.patch
+@@ -0,0 +1,13 @@
++--- a/lib/Device/USB.pm
+++++ b/lib/Device/USB.pm
++@@ -9,8 +9,8 @@ use Inline (
++ C => "DATA",
++ ($ENV{LIBUSB_LIBDIR}
++ ? ( LIBS => "-L\"$ENV{LIBUSB_LIBDIR}\" " .
++- ($^O eq 'MSWin32' ? ' -llibusb -L\"$ENV{WINDDK}\\lib\\crt\\i386\" -lmsvcrt ' : '-lusb') )
++- : ( LIBS => '-lusb', )
+++ ($^O eq 'MSWin32' ? ' -llibusb -L\"$ENV{WINDDK}\\lib\\crt\\i386\" -lmsvcrt ' : '-lusb-0.1') )
+++ : ( LIBS => '-lusb-0.1', )
++ ),
++ ($ENV{LIBUSB_INCDIR} ? ( INC => "-I\"$ENV{LIBUSB_INCDIR}\"" ) : () ),
++ NAME => 'Device::USB',
+diff --git a/feeds/packages/lang/perl-device-usb/patches/130-provide-proper-library-paths.patch b/feeds/packages/lang/perl-device-usb/patches/130-provide-proper-library-paths.patch
+new file mode 100644
+index 0000000..3fce75a
+--- /dev/null
++++ b/feeds/packages/lang/perl-device-usb/patches/130-provide-proper-library-paths.patch
+@@ -0,0 +1,13 @@
++--- a/lib/Device/USB.pm
+++++ b/lib/Device/USB.pm
++@@ -8,8 +8,8 @@ use Carp;
++ use Inline (
++ C => "DATA",
++ ($ENV{LIBUSB_LIBDIR}
++- ? ( LIBS => "-L\"$ENV{LIBUSB_LIBDIR}\" " .
++- ($^O eq 'MSWin32' ? ' -llibusb -L\"$ENV{WINDDK}\\lib\\crt\\i386\" -lmsvcrt ' : '-lusb-0.1') )
+++ ? ( LIBS => "-L$ENV{LIBUSB_LIBDIR} " .
+++ ($^O eq 'MSWin32' ? ' -llibusb -L$ENV{WINDDK}\\lib\\crt\\i386 -lmsvcrt ' : '-lusb-0.1') )
++ : ( LIBS => '-lusb-0.1', )
++ ),
++ ($ENV{LIBUSB_INCDIR} ? ( INC => "-I\"$ENV{LIBUSB_INCDIR}\"" ) : () ),
+diff --git a/feeds/packages/lang/perl-device-usb/patches/140-avoid-libusb-name-conflicts.patch b/feeds/packages/lang/perl-device-usb/patches/140-avoid-libusb-name-conflicts.patch
+new file mode 100644
+index 0000000..55e5cc3
+--- /dev/null
++++ b/feeds/packages/lang/perl-device-usb/patches/140-avoid-libusb-name-conflicts.patch
+@@ -0,0 +1,219 @@
++--- a/lib/Device/USB.pm
+++++ b/lib/Device/USB.pm
++@@ -15,6 +15,7 @@ use Inline (
++ ($ENV{LIBUSB_INCDIR} ? ( INC => "-I\"$ENV{LIBUSB_INCDIR}\"" ) : () ),
++ NAME => 'Device::USB',
++ VERSION => '0.36',
+++ PREFIX => 'deviceusb_',
++ );
++
++ Inline->init();
++@@ -540,74 +541,74 @@ unsigned DeviceUSBDebugLevel()
++ return debugLevel;
++ }
++
++-void libusb_init()
+++void deviceusb_libusb_init()
++ {
++ usb_init();
++ }
++
++-int libusb_find_busses()
+++int deviceusb_libusb_find_busses()
++ {
++ return usb_find_busses();
++ }
++
++-int libusb_find_devices()
+++int deviceusb_libusb_find_devices()
++ {
++ return usb_find_devices();
++ }
++
++-void *libusb_get_busses()
+++void *deviceusb_libusb_get_busses()
++ {
++ return usb_get_busses();
++ }
++
++-void *libusb_open(void *dev)
+++void *deviceusb_libusb_open(void *dev)
++ {
++ return usb_open( (struct usb_device*)dev );
++ }
++
++-int libusb_close(void *dev)
+++int deviceusb_libusb_close(void *dev)
++ {
++ return usb_close((usb_dev_handle *)dev);
++ }
++
++-int libusb_set_configuration(void *dev, int configuration)
+++int deviceusb_libusb_set_configuration(void *dev, int configuration)
++ {
++ if(DeviceUSBDebugLevel())
++ {
++- printf( "libusb_set_configuration( %d )\n", configuration );
+++ printf( "deviceusb_libusb_set_configuration( %d )\n", configuration );
++ }
++ return usb_set_configuration((usb_dev_handle *)dev, configuration);
++ }
++
++-int libusb_set_altinterface(void *dev, int alternate)
+++int deviceusb_libusb_set_altinterface(void *dev, int alternate)
++ {
++ if(DeviceUSBDebugLevel())
++ {
++- printf( "libusb_set_altinterface( %d )\n", alternate );
+++ printf( "deviceusb_libusb_set_altinterface( %d )\n", alternate );
++ }
++ return usb_set_altinterface((usb_dev_handle *)dev, alternate);
++ }
++
++-int libusb_clear_halt(void *dev, unsigned int ep)
+++int deviceusb_libusb_clear_halt(void *dev, unsigned int ep)
++ {
++ if(DeviceUSBDebugLevel())
++ {
++- printf( "libusb_clear_halt( %d )\n", ep );
+++ printf( "deviceusb_libusb_clear_halt( %d )\n", ep );
++ }
++ return usb_clear_halt((usb_dev_handle *)dev, ep);
++ }
++
++-int libusb_reset(void *dev)
+++int deviceusb_libusb_reset(void *dev)
++ {
++ return usb_reset((usb_dev_handle *)dev);
++ }
++
++-int libusb_get_driver_np(void *dev, int interface, char *name, unsigned int namelen)
+++int deviceusb_libusb_get_driver_np(void *dev, int interface, char *name, unsigned int namelen)
++ {
++ int ret = 0;
++ if(DeviceUSBDebugLevel())
++ {
++- printf( "libusb_get_driver_np( %d )\n", interface );
+++ printf( "deviceusb_libusb_get_driver_np( %d )\n", interface );
++ }
++ #if LIBUSB_HAS_GET_DRIVER_NP
++ ret = usb_get_driver_np((usb_dev_handle *)dev, interface, name, namelen);
++@@ -618,11 +619,11 @@ int libusb_get_driver_np(void *dev, int
++ #endif
++ }
++
++-int libusb_detach_kernel_driver_np(void *dev, int interface)
+++int deviceusb_libusb_detach_kernel_driver_np(void *dev, int interface)
++ {
++ if(DeviceUSBDebugLevel())
++ {
++- printf( "libusb_detach_kernel_driver_np( %d )\n", interface );
+++ printf( "deviceusb_libusb_detach_kernel_driver_np( %d )\n", interface );
++ }
++ #if LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP
++ return usb_detach_kernel_driver_np((usb_dev_handle *)dev, interface);
++@@ -631,25 +632,25 @@ int libusb_detach_kernel_driver_np(void
++ #endif
++ }
++
++-int libusb_claim_interface(void *dev, int interface)
+++int deviceusb_libusb_claim_interface(void *dev, int interface)
++ {
++ if(DeviceUSBDebugLevel())
++ {
++- printf( "libusb_claim_interface( %d )\n", interface );
+++ printf( "deviceusb_libusb_claim_interface( %d )\n", interface );
++ }
++ return usb_claim_interface((usb_dev_handle *)dev, interface);
++ }
++
++-int libusb_release_interface(void *dev, int interface)
+++int deviceusb_libusb_release_interface(void *dev, int interface)
++ {
++ if(DeviceUSBDebugLevel())
++ {
++- printf( "libusb_release_interface( %d )\n", interface );
+++ printf( "deviceusb_libusb_release_interface( %d )\n", interface );
++ }
++ return usb_release_interface((usb_dev_handle *)dev, interface);
++ }
++
++-void libusb_control_msg(void *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout)
+++void deviceusb_libusb_control_msg(void *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout)
++ {
++ int i = 0;
++ int retval = 0;
++@@ -658,7 +659,7 @@ void libusb_control_msg(void *dev, int r
++
++ if(DeviceUSBDebugLevel())
++ {
++- printf( "libusb_control_msg( %#04x, %#04x, %#04x, %#04x, %p, %d, %d )\n",
+++ printf( "deviceusb_libusb_control_msg( %#04x, %#04x, %#04x, %#04x, %p, %d, %d )\n",
++ requesttype, request, value, index, bytes, size, timeout
++ );
++ /* maybe need to add support for printing the bytes string. */
++@@ -691,54 +692,54 @@ void libusb_control_msg(void *dev, int r
++ Inline_Stack_Done;
++ }
++
++-int libusb_get_string(void *dev, int index, int langid, char *buf, size_t buflen)
+++int deviceusb_libusb_get_string(void *dev, int index, int langid, char *buf, size_t buflen)
++ {
++ if(DeviceUSBDebugLevel())
++ {
++- printf( "libusb_get_string( %d, %d, %p, %lu )\n",
+++ printf( "deviceusb_libusb_get_string( %d, %d, %p, %lu )\n",
++ index, langid, buf, (unsigned long)buflen
++ );
++ }
++ return usb_get_string((usb_dev_handle *)dev, index, langid, buf, buflen);
++ }
++
++-int libusb_get_string_simple(void *dev, int index, char *buf, size_t buflen)
+++int deviceusb_libusb_get_string_simple(void *dev, int index, char *buf, size_t buflen)
++ {
++ if(DeviceUSBDebugLevel())
++ {
++- printf( "libusb_get_string_simple( %d, %p, %lu )\n",
+++ printf( "deviceusb_libusb_get_string_simple( %d, %p, %lu )\n",
++ index, buf, (unsigned long)buflen
++ );
++ }
++ return usb_get_string_simple((usb_dev_handle *)dev, index, buf, buflen);
++ }
++
++-int libusb_get_descriptor(void *dev, unsigned char type, unsigned char index, char *buf, int size)
+++int deviceusb_libusb_get_descriptor(void *dev, unsigned char type, unsigned char index, char *buf, int size)
++ {
++ return usb_get_descriptor((usb_dev_handle *)dev, type, index, buf, size);
++ }
++
++-int libusb_get_descriptor_by_endpoint(void *dev, int ep, unsigned char type, unsigned char index, char *buf, int size)
+++int deviceusb_libusb_get_descriptor_by_endpoint(void *dev, int ep, unsigned char type, unsigned char index, char *buf, int size)
++ {
++ return usb_get_descriptor_by_endpoint((usb_dev_handle *)dev, ep, type, index, buf, size);
++ }
++
++-int libusb_bulk_write(void *dev, int ep, char *bytes, int size, int timeout)
+++int deviceusb_libusb_bulk_write(void *dev, int ep, char *bytes, int size, int timeout)
++ {
++ return usb_bulk_write((usb_dev_handle *)dev, ep, bytes, size, timeout);
++ }
++
++-int libusb_bulk_read(void *dev, int ep, char *bytes, int size, int timeout)
+++int deviceusb_libusb_bulk_read(void *dev, int ep, char *bytes, int size, int timeout)
++ {
++ return usb_bulk_read((usb_dev_handle *)dev, ep, bytes, size, timeout);
++ }
++
++-int libusb_interrupt_write(void *dev, int ep, char *bytes, int size, int timeout)
+++int deviceusb_libusb_interrupt_write(void *dev, int ep, char *bytes, int size, int timeout)
++ {
++ return usb_interrupt_write((usb_dev_handle *)dev, ep, bytes, size, timeout);
++ }
++
++-int libusb_interrupt_read(void *dev, int ep, char *bytes, int size, int timeout)
+++int deviceusb_libusb_interrupt_read(void *dev, int ep, char *bytes, int size, int timeout)
++ {
++ return usb_interrupt_read((usb_dev_handle *)dev, ep, bytes, size, timeout);
++ }
+diff --git a/feeds/packages/lang/perl-encode-locale/Makefile b/feeds/packages/lang/perl-encode-locale/Makefile
+new file mode 100644
+index 0000000..54071dc
+--- /dev/null
++++ b/feeds/packages/lang/perl-encode-locale/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-encode-locale
++PKG_VERSION:=1.05
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
++PKG_SOURCE:=Encode-Locale-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=fcfdb8e4ee34bcf62aed429b4a23db27
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Encode-Locale-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-encode-locale
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Determine the locale encoding
++ URL:=http://search.cpan.org/dist/Encode-Locale/
++ DEPENDS:=perl +perlbase-base +perlbase-encode +perlbase-essential
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-encode-locale/install
++ $(call perlmod/Install,$(1),Encode auto/Encode)
++endef
++
++
++$(eval $(call BuildPackage,perl-encode-locale))
+diff --git a/feeds/packages/lang/perl-file-listing/Makefile b/feeds/packages/lang/perl-file-listing/Makefile
+new file mode 100644
+index 0000000..19a6938
+--- /dev/null
++++ b/feeds/packages/lang/perl-file-listing/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-file-listing
++PKG_VERSION:=6.04
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
++PKG_SOURCE:=File-Listing-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=83f636b477741f3a014585bb9cc079a6
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/File-Listing-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-file-listing
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Parse directory listing
++ URL:=http://search.cpan.org/dist/File-Listing/
++ DEPENDS:=perl +perl-http-date +perlbase-essential
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-file-listing/install
++ $(call perlmod/Install,$(1),File auto/File)
++endef
++
++
++$(eval $(call BuildPackage,perl-file-listing))
+diff --git a/feeds/packages/lang/perl-file-sharedir-install/Makefile b/feeds/packages/lang/perl-file-sharedir-install/Makefile
+new file mode 100644
+index 0000000..d107d70
+--- /dev/null
++++ b/feeds/packages/lang/perl-file-sharedir-install/Makefile
+@@ -0,0 +1,64 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-file-sharedir-install
++PKG_VERSION:=0.10
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GW/GWYN
++PKG_SOURCE:=File-ShareDir-Install-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=37fb7fa72ce7184516dd022aba62f524
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/perl/File-ShareDir-Install-$(PKG_VERSION)
++HOST_BUILD_DEPENDS:=perl/host
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/File-ShareDir-Install-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/host-build.mk
++include ../perl/perlmod.mk
++
++define Package/perl-file-sharedir-install
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Install read-only data files
++ URL:=http://search.cpan.org/dist/File-ShareDir-Install/
++ DEPENDS:=perl +perlbase-essential +perlbase-extutils +perlbase-file +perlbase-io
++endef
++
++define Host/Configure
++ $(call perlmod/host/Configure,,,)
++endef
++
++define Host/Compile
++ $(call perlmod/host/Compile,,)
++endef
++
++define Host/Install
++ $(call perlmod/host/Install,$(1),)
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-file-sharedir-install/install
++ $(call perlmod/Install,$(1),File auto/File)
++endef
++
++
++$(eval $(call BuildPackage,perl-file-sharedir-install))
++$(eval $(call HostBuild))
+diff --git a/feeds/packages/lang/perl-html-form/Makefile b/feeds/packages/lang/perl-html-form/Makefile
+new file mode 100644
+index 0000000..d412a1f
+--- /dev/null
++++ b/feeds/packages/lang/perl-html-form/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-html-form
++PKG_VERSION:=6.03
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
++PKG_SOURCE:=HTML-Form-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=fa6c2680207ed4fef5ea2ef09c210614
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTML-Form-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-html-form
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Class that represents an HTML form element
++ URL:=http://search.cpan.org/dist/HTML-Form/
++ DEPENDS:=perl +perl-html-parser +perl-http-message +perl-uri +perlbase-encode +perlbase-essential
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-html-form/install
++ $(call perlmod/Install,$(1),HTML auto/HTML)
++endef
++
++
++$(eval $(call BuildPackage,perl-html-form))
+diff --git a/feeds/packages/lang/perl-html-parser/Makefile b/feeds/packages/lang/perl-html-parser/Makefile
+new file mode 100644
+index 0000000..c248a61
+--- /dev/null
++++ b/feeds/packages/lang/perl-html-parser/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-html-parser
++PKG_VERSION:=3.71
++PKG_RELEASE:=4
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS/
++PKG_SOURCE:=HTML-Parser-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=9128a45893097dfa3bf03301b19c5efe
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTML-Parser-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-html-parser
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=A collection of modules that parse HTML text documents
++ URL:=http://search.cpan.org/dist/HTML-Parser/
++ DEPENDS:=perl +perl-html-tagset +perlbase-essential +perlbase-xsloader
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-html-parser/install
++ $(call perlmod/Install,$(1),HTML auto/HTML)
++endef
++
++
++$(eval $(call BuildPackage,perl-html-parser))
+diff --git a/feeds/packages/lang/perl-html-tagset/Makefile b/feeds/packages/lang/perl-html-tagset/Makefile
+new file mode 100644
+index 0000000..4bcd10c
+--- /dev/null
++++ b/feeds/packages/lang/perl-html-tagset/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-html-tagset
++PKG_VERSION:=3.20
++PKG_RELEASE:=3
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/P/PE/PETDANCE/
++PKG_SOURCE:=HTML-Tagset-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=d2bfa18fe1904df7f683e96611e87437
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTML-Tagset-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-html-tagset
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Data tables pertaining to HTML
++ URL:=http://search.cpan.org/dist/HTML-Tagset/
++ DEPENDS:=perl +perlbase-essential
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-html-tagset/install
++ $(call perlmod/Install,$(1),HTML)
++endef
++
++
++$(eval $(call BuildPackage,perl-html-tagset))
+diff --git a/feeds/packages/lang/perl-html-tree/Makefile b/feeds/packages/lang/perl-html-tree/Makefile
+new file mode 100644
+index 0000000..d1b4ac9
+--- /dev/null
++++ b/feeds/packages/lang/perl-html-tree/Makefile
+@@ -0,0 +1,49 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-html-tree
++PKG_VERSION:=3.23
++PKG_RELEASE:=4
++PKG_MD5SUM:=6352f50be402301f79b580dd235d7762
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/P/PE/PETEK/
++PKG_SOURCE:=HTML-Tree-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=6352f50be402301f79b580dd235d7762
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTML-Tree-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-html-tree
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Represent and create HTML syntax trees
++ URL:=http://search.cpan.org/dist/HTML-Tree/
++ DEPENDS:=perl +perl-html-parser +perl-html-tagset +perlbase-essential +perlbase-integer
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-html-tree/install
++ $(call perlmod/Install,$(1),HTML)
++endef
++
++
++$(eval $(call BuildPackage,perl-html-tree))
+diff --git a/feeds/packages/lang/perl-http-cookies/Makefile b/feeds/packages/lang/perl-http-cookies/Makefile
+new file mode 100644
+index 0000000..329767a
+--- /dev/null
++++ b/feeds/packages/lang/perl-http-cookies/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-http-cookies
++PKG_VERSION:=6.01
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
++PKG_SOURCE:=HTTP-Cookies-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=ecfd0eeb88512033352c2f13c9580f03
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Cookies-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-http-cookies
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=HTTP cookie jars
++ URL:=http://search.cpan.org/dist/HTTP-Cookies/
++ DEPENDS:=perl +perl-http-date +perl-http-message +perlbase-essential +perlbase-time
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-http-cookies/install
++ $(call perlmod/Install,$(1),HTTP auto/HTTP)
++endef
++
++
++$(eval $(call BuildPackage,perl-http-cookies))
+diff --git a/feeds/packages/lang/perl-http-daemon/Makefile b/feeds/packages/lang/perl-http-daemon/Makefile
+new file mode 100644
+index 0000000..178573d
+--- /dev/null
++++ b/feeds/packages/lang/perl-http-daemon/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-http-daemon
++PKG_VERSION:=6.01
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
++PKG_SOURCE:=HTTP-Daemon-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=ed0ae02d25d7f1e89456d4d69732adc2
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Daemon-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-http-daemon
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=A simple http server class
++ URL:=http://search.cpan.org/dist/HTTP-Daemon/
++ DEPENDS:=perl +perl-http-date +perl-http-message +perl-lwp-mediatypes +perlbase-essential +perlbase-io +perlbase-sys
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-http-daemon/install
++ $(call perlmod/Install,$(1),HTTP auto/HTTP)
++endef
++
++
++$(eval $(call BuildPackage,perl-http-daemon))
+diff --git a/feeds/packages/lang/perl-http-date/Makefile b/feeds/packages/lang/perl-http-date/Makefile
+new file mode 100644
+index 0000000..bf0bd40
+--- /dev/null
++++ b/feeds/packages/lang/perl-http-date/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-http-date
++PKG_VERSION:=6.02
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
++PKG_SOURCE:=HTTP-Date-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=52b7a0d5982d61be1edb217751d7daba
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Date-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-http-date
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Date conversion routines
++ URL:=http://search.cpan.org/dist/HTTP-Date/
++ DEPENDS:=perl +perlbase-essential +perlbase-time
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-http-date/install
++ $(call perlmod/Install,$(1),HTTP auto/HTTP)
++endef
++
++
++$(eval $(call BuildPackage,perl-http-date))
+diff --git a/feeds/packages/lang/perl-http-message/Makefile b/feeds/packages/lang/perl-http-message/Makefile
+new file mode 100644
+index 0000000..2b90e2a
+--- /dev/null
++++ b/feeds/packages/lang/perl-http-message/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-http-message
++PKG_VERSION:=6.11
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/E/ET/ETHER
++PKG_SOURCE:=HTTP-Message-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=4ed7add10daea3ab30abfeab6d03872f
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Message-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-http-message
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=HTTP style messages
++ URL:=http://search.cpan.org/dist/HTTP-Message/
++ DEPENDS:=perl +perl-encode-locale +perl-http-date +perl-io-html +perl-lwp-mediatypes +perl-uri +perlbase-base +perlbase-compress +perlbase-encode +perlbase-essential +perlbase-io +perlbase-mime
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-http-message/install
++ $(call perlmod/Install,$(1),HTTP auto/HTTP)
++endef
++
++
++$(eval $(call BuildPackage,perl-http-message))
+diff --git a/feeds/packages/lang/perl-http-negotiate/Makefile b/feeds/packages/lang/perl-http-negotiate/Makefile
+new file mode 100644
+index 0000000..a72893a
+--- /dev/null
++++ b/feeds/packages/lang/perl-http-negotiate/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-http-negotiate
++PKG_VERSION:=6.01
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
++PKG_SOURCE:=HTTP-Negotiate-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=1236195250e264d7436e7bb02031671b
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Negotiate-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-http-negotiate
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Choose a variant to serve
++ URL:=http://search.cpan.org/dist/HTTP-Negotiate/
++ DEPENDS:=perl +perl-http-message +perlbase-essential
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-http-negotiate/install
++ $(call perlmod/Install,$(1),HTTP auto/HTTP)
++endef
++
++
++$(eval $(call BuildPackage,perl-http-negotiate))
+diff --git a/feeds/packages/lang/perl-http-server-simple/Makefile b/feeds/packages/lang/perl-http-server-simple/Makefile
+new file mode 100644
+index 0000000..9a41da6
+--- /dev/null
++++ b/feeds/packages/lang/perl-http-server-simple/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-http-server-simple
++PKG_VERSION:=0.51
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/B/BP/BPS
++PKG_SOURCE:=HTTP-Server-Simple-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=ef736daddc7a32a29207fa4ed5f5d62e
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/HTTP-Server-Simple-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-http-server-simple
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Lightweight HTTP server
++ URL:=http://search.cpan.org/dist/HTTP-Server-Simple/
++ DEPENDS:=perl +perl-cgi +perlbase-base +perlbase-essential +perlbase-filehandle +perlbase-socket +perlbase-test
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-http-server-simple/install
++ $(call perlmod/Install,$(1),HTTP auto/HTTP)
++endef
++
++
++$(eval $(call BuildPackage,perl-http-server-simple))
+diff --git a/feeds/packages/lang/perl-inline-c/Makefile b/feeds/packages/lang/perl-inline-c/Makefile
+new file mode 100644
+index 0000000..52826d2
+--- /dev/null
++++ b/feeds/packages/lang/perl-inline-c/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-inline-c
++PKG_VERSION:=0.76
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/I/IN/INGY
++PKG_SOURCE:=Inline-C-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=c0fbfdd058075c9271a1384c822c9a87
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/perl/Inline-C-$(PKG_VERSION)
++HOST_BUILD_DEPENDS:=perl/host perl-inline/host perl-parse-recdescent/host perl-file-sharedir-install/host
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Inline-C-$(PKG_VERSION)
++PKG_BUILD_DEPENDS:=perl-inline/host perl-parse-recdescent/host perl-file-sharedir-install/host
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/host-build.mk
++include ../perl/perlmod.mk
++
++define Package/perl-inline-c
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=C Language Support for Inline
++ URL:=http://search.cpan.org/dist/Inline-C/
++ DEPENDS:=perl +perl-inline +perl-parse-recdescent +perlbase-config +perlbase-cwd +perlbase-data +perlbase-essential +perlbase-extutils +perlbase-file +perlbase-if
++endef
++
++define Host/Configure
++ $(call perlmod/host/Configure,,,)
++endef
++
++define Host/Compile
++ $(call perlmod/host/Compile,,)
++endef
++
++define Host/Install
++ $(call perlmod/host/Install,$(1),)
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-inline-c/install
++ $(call perlmod/Install,$(1),Inline auto/Inline)
++endef
++
++
++$(eval $(call BuildPackage,perl-inline-c))
++$(eval $(call HostBuild))
+diff --git a/feeds/packages/lang/perl-inline-c/patches/100-inline_c-no_compile_hack.patch b/feeds/packages/lang/perl-inline-c/patches/100-inline_c-no_compile_hack.patch
+new file mode 100644
+index 0000000..dcfe2bb
+--- /dev/null
++++ b/feeds/packages/lang/perl-inline-c/patches/100-inline_c-no_compile_hack.patch
+@@ -0,0 +1,11 @@
++--- a/lib/Inline/C.pm
+++++ b/lib/Inline/C.pm
++@@ -361,7 +361,7 @@ sub build {
++ $o->call('write_XS', 'Build Glue 1');
++ $o->call('write_Inline_headers', 'Build Glue 2');
++ $o->call('write_Makefile_PL', 'Build Glue 3');
++- $o->call('compile', 'Build Compile');
+++ $o->call('compile', 'Build Compile') unless $ENV{'_INLINE_C_NO_COMPILE_'};
++ if (IS_WIN32) {
++ $lockfh->release or die "releasemutex $file: $^E";
++ }
+diff --git a/feeds/packages/lang/perl-inline-c/patches/110-inline_c-make_system_typemap_overridable.patch b/feeds/packages/lang/perl-inline-c/patches/110-inline_c-make_system_typemap_overridable.patch
+new file mode 100644
+index 0000000..b2ae09e
+--- /dev/null
++++ b/feeds/packages/lang/perl-inline-c/patches/110-inline_c-make_system_typemap_overridable.patch
+@@ -0,0 +1,46 @@
++--- a/lib/Inline/C.pm
+++++ b/lib/Inline/C.pm
++@@ -438,22 +438,28 @@ sub get_maps {
++ print STDERR "get_maps Stage\n" if $o->{CONFIG}{BUILD_NOISY};
++ my $typemap = '';
++ my $file;
++- $file = File::Spec->catfile(
++- $Config::Config{installprivlib},
++- "ExtUtils",
++- "typemap",
++- );
++- $typemap = $file if -f $file;
++- $file = File::Spec->catfile(
++- $Config::Config{privlibexp}
++- ,"ExtUtils","typemap"
++- );
++- $typemap = $file
++- if (not $typemap and -f $file);
++- warn "Can't find the default system typemap file"
++- if (not $typemap and $^W);
+++
+++ unless ($ENV{'_INLINE_C_SYSTEM_TYPEMAP_'}) {
+++ $file = File::Spec->catfile(
+++ $Config::Config{installprivlib},
+++ "ExtUtils",
+++ "typemap",
+++ );
+++ $typemap = $file if -f $file;
+++ $file = File::Spec->catfile(
+++ $Config::Config{privlibexp}
+++ ,"ExtUtils","typemap"
+++ );
+++ $typemap = $file
+++ if (not $typemap and -f $file);
+++ warn "Can't find the default system typemap file"
+++ if (not $typemap and $^W);
++
++- unshift(@{$o->{ILSM}{MAKEFILE}{TYPEMAPS}}, $typemap) if $typemap;
+++ unshift(@{$o->{ILSM}{MAKEFILE}{TYPEMAPS}}, $typemap) if $typemap;
+++ }
+++ else {
+++ unshift(@{$o->{ILSM}{MAKEFILE}{TYPEMAPS}}, $ENV{'_INLINE_C_SYSTEM_TYPEMAP_'});
+++ }
++
++ if (not $o->UNTAINT) {
++ require FindBin;
+diff --git a/feeds/packages/lang/perl-inline/Makefile b/feeds/packages/lang/perl-inline/Makefile
+new file mode 100644
+index 0000000..a120705
+--- /dev/null
++++ b/feeds/packages/lang/perl-inline/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-inline
++PKG_VERSION:=0.80
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/I/IN/INGY
++PKG_SOURCE:=Inline-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=510bbac46e727bcaf240b7feac2646c9
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Inline-$(PKG_VERSION)
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/perl/Inline-$(PKG_VERSION)
++
++HOST_BUILD_DEPENDS:=perl/host
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/host-build.mk
++include ../perl/perlmod.mk
++
++define Package/perl-inline
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Write subroutines in other languages
++ URL:=http://search.cpan.org/dist/Inline/
++ DEPENDS:=perl +perlbase-base +perlbase-config +perlbase-cwd +perlbase-digest +perlbase-essential +perlbase-fcntl +perlbase-file
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-inline/install
++ $(call perlmod/Install,$(1),Inline.pm Inline auto/Inline)
++endef
++
++define Host/Configure
++ $(call perlmod/host/Configure,,,)
++endef
++
++define Host/Compile
++ $(call perlmod/host/Compile,,)
++endef
++
++define Host/Install
++ $(call perlmod/host/Install,$(1),)
++endef
++
++
++$(eval $(call BuildPackage,perl-inline))
++$(eval $(call HostBuild))
+diff --git a/feeds/packages/lang/perl-io-html/Makefile b/feeds/packages/lang/perl-io-html/Makefile
+new file mode 100644
+index 0000000..9390c36
+--- /dev/null
++++ b/feeds/packages/lang/perl-io-html/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-io-html
++PKG_VERSION:=1.001
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/C/CJ/CJM
++PKG_SOURCE:=IO-HTML-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=3f8958718844dc96b9f6946f21d70d22
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/IO-HTML-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-io-html
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Open an HTML file with automatic charset detection
++ URL:=http://search.cpan.org/dist/IO-HTML/
++ DEPENDS:=perl +perlbase-encode +perlbase-essential
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-io-html/install
++ $(call perlmod/Install,$(1),IO auto/IO)
++endef
++
++
++$(eval $(call BuildPackage,perl-io-html))
+diff --git a/feeds/packages/lang/perl-lockfile-simple/Makefile b/feeds/packages/lang/perl-lockfile-simple/Makefile
+new file mode 100644
+index 0000000..b81e678
+--- /dev/null
++++ b/feeds/packages/lang/perl-lockfile-simple/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-lockfile-simple
++PKG_VERSION:=0.208
++PKG_RELEASE:=3
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/S/SC/SCHWIGON/lockfile-simple/
++PKG_SOURCE:=LockFile-Simple-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=4421283b4f32549e5299963734170044
++
++PKG_LICENSE:=GPL-2.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/LockFile-Simple-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-lockfile-simple
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Simple advisory file locking
++ URL:=http://search.cpan.org/dist/LockFile-Simple/
++ DEPENDS:=perl +perlbase-essential +perlbase-sys
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-lockfile-simple/install
++ $(call perlmod/Install,$(1),LockFile auto/LockFile)
++endef
++
++
++$(eval $(call BuildPackage,perl-lockfile-simple))
+diff --git a/feeds/packages/lang/perl-lwp-mediatypes/Makefile b/feeds/packages/lang/perl-lwp-mediatypes/Makefile
+new file mode 100644
+index 0000000..6985431
+--- /dev/null
++++ b/feeds/packages/lang/perl-lwp-mediatypes/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-lwp-mediatypes
++PKG_VERSION:=6.02
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
++PKG_SOURCE:=LWP-MediaTypes-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=8c5f25fb64b974d22aff424476ba13c9
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/LWP-MediaTypes-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-lwp-mediatypes
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Guess media type for a file or a URL
++ URL:=http://search.cpan.org/dist/LWP-MediaTypes/
++ DEPENDS:=perl +perlbase-essential
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-lwp-mediatypes/install
++ $(call perlmod/Install,$(1),LWP auto/LWP)
++endef
++
++
++$(eval $(call BuildPackage,perl-lwp-mediatypes))
+diff --git a/feeds/packages/lang/perl-net-http/Makefile b/feeds/packages/lang/perl-net-http/Makefile
+new file mode 100644
+index 0000000..058ac16
+--- /dev/null
++++ b/feeds/packages/lang/perl-net-http/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-net-http
++PKG_VERSION:=6.09
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/E/ET/ETHER
++PKG_SOURCE:=Net-HTTP-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=3d84d17f64c7316d69e7eb7b4e292b9a
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Net-HTTP-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-net-http
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Low-level HTTP connection (client)
++ URL:=http://search.cpan.org/dist/Net-HTTP/
++ DEPENDS:=perl +perl-uri +perlbase-compress +perlbase-essential +perlbase-io
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-net-http/install
++ $(call perlmod/Install,$(1),Net auto/Net)
++endef
++
++
++$(eval $(call BuildPackage,perl-net-http))
+diff --git a/feeds/packages/lang/perl-net-telnet/Makefile b/feeds/packages/lang/perl-net-telnet/Makefile
+new file mode 100644
+index 0000000..c915064
+--- /dev/null
++++ b/feeds/packages/lang/perl-net-telnet/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2011-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-net-telnet
++PKG_VERSION:=3.04
++PKG_RELEASE:=3
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/J/JR/JROGERS/
++PKG_SOURCE:=Net-Telnet-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=d2514080116c1b0fa5f96295c84538e3
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Net-Telnet-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-net-telnet
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Telnet client
++ URL:=http://search.cpan.org/dist/Net-Telnet/
++ DEPENDS:=perl +perlbase-essential +perlbase-socket +perlbase-symbol
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-net-telnet/install
++ $(call perlmod/Install,$(1),Net auto/Net)
++endef
++
++
++$(eval $(call BuildPackage,perl-net-telnet))
+diff --git a/feeds/packages/lang/perl-parse-recdescent/Makefile b/feeds/packages/lang/perl-parse-recdescent/Makefile
+new file mode 100644
+index 0000000..bbeff7b
+--- /dev/null
++++ b/feeds/packages/lang/perl-parse-recdescent/Makefile
+@@ -0,0 +1,64 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-parse-recdescent
++PKG_VERSION:=1.967013
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/J/JT/JTBRAUN
++PKG_SOURCE:=Parse-RecDescent-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=98f582240556a4a92e5d57e480f9d39d
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/perl/Parse-RecDescent-$(PKG_VERSION)
++HOST_BUILD_DEPENDS:=perl/host
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Parse-RecDescent-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/host-build.mk
++include ../perl/perlmod.mk
++
++define Package/perl-parse-recdescent
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Generate Recursive-Descent Parsers
++ URL:=http://search.cpan.org/dist/Parse-RecDescent/
++ DEPENDS:=perl +perlbase-essential +perlbase-test +perlbase-text
++endef
++
++define Host/Configure
++ $(call perlmod/host/Configure,,,)
++endef
++
++define Host/Compile
++ $(call perlmod/host/Compile,,)
++endef
++
++define Host/Install
++ $(call perlmod/host/Install,$(1),)
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-parse-recdescent/install
++ $(call perlmod/Install,$(1),Parse auto/Parse)
++endef
++
++
++$(eval $(call BuildPackage,perl-parse-recdescent))
++$(eval $(call HostBuild))
+diff --git a/feeds/packages/lang/perl-sub-uplevel/Makefile b/feeds/packages/lang/perl-sub-uplevel/Makefile
+new file mode 100644
+index 0000000..266bce4
+--- /dev/null
++++ b/feeds/packages/lang/perl-sub-uplevel/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-sub-uplevel
++PKG_VERSION:=0.25
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/D/DA/DAGOLDEN
++PKG_SOURCE:=Sub-Uplevel-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=5d0752dbfa94d0c91b25a264f47f5675
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Sub-Uplevel-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-sub-uplevel
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Apparently run a function in a higher stack frame
++ URL:=http://search.cpan.org/dist/Sub-Uplevel/
++ DEPENDS:=perl +perlbase-essential
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-sub-uplevel/install
++ $(call perlmod/Install,$(1),Sub auto/Sub)
++endef
++
++
++$(eval $(call BuildPackage,perl-sub-uplevel))
+diff --git a/feeds/packages/lang/perl-test-harness/Makefile b/feeds/packages/lang/perl-test-harness/Makefile
+new file mode 100644
+index 0000000..fd2b4f6
+--- /dev/null
++++ b/feeds/packages/lang/perl-test-harness/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2014, 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-test-harness
++PKG_VERSION:=3.35
++PKG_RELEASE:=3
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/L/LE/LEONT/
++PKG_SOURCE:=Test-Harness-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=2a6010bca2ad78e094d629eea6afd7d9
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Test-Harness-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-test-harness
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Perl Test Harness
++ URL:=http://search.cpan.org/dist/Test-Harness/
++ DEPENDS:=perl +perlbase-base +perlbase-benchmark +perlbase-config +perlbase-essential +perlbase-file +perlbase-getopt +perlbase-io +perlbase-posix +perlbase-text
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-test-harness/install
++ $(call perlmod/Install,$(1),App auto/Test TAP Test)
++endef
++
++
++$(eval $(call BuildPackage,perl-test-harness))
+diff --git a/feeds/packages/lang/perl-test-warn/Makefile b/feeds/packages/lang/perl-test-warn/Makefile
+new file mode 100644
+index 0000000..995e1ba
+--- /dev/null
++++ b/feeds/packages/lang/perl-test-warn/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-test-warn
++PKG_VERSION:=0.30
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/C/CH/CHORNY
++PKG_SOURCE:=Test-Warn-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=8306b998a96d2cc69266b5248d550472
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/Test-Warn-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-test-warn
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Perl extension to test methods for warnings
++ URL:=http://search.cpan.org/dist/Test-Warn/
++ DEPENDS:=perl +perl-sub-uplevel +perlbase-essential +perlbase-test
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-test-warn/install
++ $(call perlmod/Install,$(1),Test auto/Test)
++endef
++
++
++$(eval $(call BuildPackage,perl-test-warn))
+diff --git a/feeds/packages/lang/perl-uri/Makefile b/feeds/packages/lang/perl-uri/Makefile
+new file mode 100644
+index 0000000..e3f566e
+--- /dev/null
++++ b/feeds/packages/lang/perl-uri/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-uri
++PKG_VERSION:=1.69
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/E/ET/ETHER/
++PKG_SOURCE:=URI-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=3c56aee0300bce5a440ccbd558277ea0
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/URI-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-uri
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Manipulates and accesses URI strings
++ URL:=http://search.cpan.org/dist/URI/
++ DEPENDS:=perl +perlbase-essential +perlbase-integer +perlbase-mime +perlbase-scalar +perlbase-utf8
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-uri/install
++ $(call perlmod/Install,$(1),URI URI.pm)
++endef
++
++
++$(eval $(call BuildPackage,perl-uri))
+diff --git a/feeds/packages/lang/perl-www-curl/Makefile b/feeds/packages/lang/perl-www-curl/Makefile
+new file mode 100644
+index 0000000..1e424cb
+--- /dev/null
++++ b/feeds/packages/lang/perl-www-curl/Makefile
+@@ -0,0 +1,49 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-www-curl
++PKG_VERSION:=4.17
++PKG_RELEASE:=4
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/S/SZ/SZBALINT/
++PKG_SOURCE:=WWW-Curl-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=997ac81cd6b03b30b36f7cd930474845
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_LICENSE_FILES:=LICENSE
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/WWW-Curl-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-www-curl
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Perl bindings to libcurl
++ URL:=http://search.cpan.org/dist/WWW-Curl/
++ DEPENDS:=perl +libcurl +perlbase-essential +perlbase-xsloader
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,$(STAGING_DIR)/usr/include,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-www-curl/install
++ $(call perlmod/Install,$(1),WWW/Curl WWW/Curl.pm auto/WWW/Curl)
++endef
++
++
++$(eval $(call BuildPackage,perl-www-curl))
+diff --git a/feeds/packages/lang/perl-www-curl/patches/100-perl-www-curl_disable_curl-config_hack.patch b/feeds/packages/lang/perl-www-curl/patches/100-perl-www-curl_disable_curl-config_hack.patch
+new file mode 100644
+index 0000000..568b65c
+--- /dev/null
++++ b/feeds/packages/lang/perl-www-curl/patches/100-perl-www-curl_disable_curl-config_hack.patch
+@@ -0,0 +1,74 @@
++--- a/Makefile.PL
+++++ b/Makefile.PL
++@@ -12,31 +12,31 @@ no_index directory => 'template';
++ repository 'http://github.com/szbalint/WWW--Curl';
++ # This is a hack. If you have libcurl installed, just specify curl.h below
++ # and comment out this line.
++-if ($^O ne 'MSWin32') {
++- if (!$ENV{CURL_CONFIG}) {
++- requires_external_bin 'curl-config';
++- }
++-} else {
++- print "Sorry, no automated install is available on Windows,\n".
++- "please see the README.Win32 file on instructions for a manual install.\n";
++- exit(0);
++-}
++-
++-my $curl_config = $ENV{CURL_CONFIG} || 'curl-config';
++-
++-my $vernum = `${curl_config} --vernum`; chomp $vernum;
++-my $version = `${curl_config} --version`; chomp $version;
++-
++-my $minimum_ver = hex("070a08");
++-
++-if ($vernum && hex($vernum) <= $minimum_ver) {
++- print "Your currently installed libcurl version - $version - is too old.\n".
++- "This module doesn't seek compatibility with versions older than 7.10.8\n".
++- "Proceed manually if you know what you're doing.\n";
++- exit(0);
++-}
++-
++-print "The version is $version\n";
+++#if ($^O ne 'MSWin32') {
+++# if (!$ENV{CURL_CONFIG}) {
+++# requires_external_bin 'curl-config';
+++# }
+++#} else {
+++# print "Sorry, no automated install is available on Windows,\n".
+++# "please see the README.Win32 file on instructions for a manual install.\n";
+++# exit(0);
+++#}
+++#
+++#my $curl_config = $ENV{CURL_CONFIG} || 'curl-config';
+++#
+++#my $vernum = `${curl_config} --vernum`; chomp $vernum;
+++#my $version = `${curl_config} --version`; chomp $version;
+++#
+++#my $minimum_ver = hex("070a08");
+++#
+++#if ($vernum && hex($vernum) <= $minimum_ver) {
+++# print "Your currently installed libcurl version - $version - is too old.\n".
+++# "This module doesn't seek compatibility with versions older than 7.10.8\n".
+++# "Proceed manually if you know what you're doing.\n";
+++# exit(0);
+++#}
+++#
+++#print "The version is $version\n";
++
++ my @includes = qw();
++ my ($cflags,$lflags, $ldflags) = ('','','');
++@@ -58,10 +58,10 @@ if ($^O ne 'MSWin32') {
++ # Get curl to tell us where it is, if we can.
++ #
++
++-if ($^O ne 'MSWin32') {
++- $cflags = `${curl_config} --cflags`;
++- $lflags = `${curl_config} --libs`;
++-}
+++#if ($^O ne 'MSWin32') {
+++# $cflags = `${curl_config} --cflags`;
+++# $lflags = `${curl_config} --libs`;
+++#}
++
++ # can't find link flags, make some guesses
++ if (!defined($lflags)) {
+diff --git a/feeds/packages/lang/perl-www-curl/patches/200-fix_default_lflags.patch b/feeds/packages/lang/perl-www-curl/patches/200-fix_default_lflags.patch
+new file mode 100644
+index 0000000..f51eaf5
+--- /dev/null
++++ b/feeds/packages/lang/perl-www-curl/patches/200-fix_default_lflags.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile.PL
+++++ b/Makefile.PL
++@@ -39,7 +39,7 @@ repository 'http://github.com/szbalint/
++ #print "The version is $version\n";
++
++ my @includes = qw();
++-my ($cflags,$lflags, $ldflags) = ('','','');
+++my ($cflags,$lflags, $ldflags) = ('','-lcurl','');
++
++ # You may need to specify where to find curl.h on your platform
++ # These are guesses only, in case curl-config is not telling us.
+diff --git a/feeds/packages/lang/perl-www-mechanize/Makefile b/feeds/packages/lang/perl-www-mechanize/Makefile
+new file mode 100644
+index 0000000..93d6be2
+--- /dev/null
++++ b/feeds/packages/lang/perl-www-mechanize/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2010-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-www-mechanize
++PKG_VERSION:=1.75
++PKG_RELEASE:=1
++
++PKG_SOURCE:=WWW-Mechanize-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/E/ET/ETHER/
++PKG_MD5SUM:=9a4b9c8827f519908ef0a0d2b8ae96fa
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/WWW-Mechanize-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-www-mechanize
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Perl WWW Mechanize
++ URL:=http://search.cpan.org/dist/WWW-Mechanize/
++ DEPENDS:=perl +perl-cgi +perl-html-form +perl-html-parser +perl-html-tree +perl-http-daemon +perl-http-message +perl-http-server-simple +perl-test-warn +perl-uri +perl-www +perlbase-base +perlbase-essential +perlbase-file +perlbase-findbin +perlbase-getopt +perlbase-pod +perlbase-test
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,$(STAGING_DIR)/usr/include,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-www-mechanize/install
++ $(call perlmod/Install,$(1),WWW/Mechanize WWW/Mechanize.pm)
++endef
++
++
++$(eval $(call BuildPackage,perl-www-mechanize))
+diff --git a/feeds/packages/lang/perl-www-robotrules/Makefile b/feeds/packages/lang/perl-www-robotrules/Makefile
+new file mode 100644
+index 0000000..c28b8c2
+--- /dev/null
++++ b/feeds/packages/lang/perl-www-robotrules/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-www-robotrules
++PKG_VERSION:=6.02
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/G/GA/GAAS
++PKG_SOURCE:=WWW-RobotRules-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=b7186e8b8b3701e70c22abf430742403
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/WWW-RobotRules-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-www-robotrules
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=database of robots.txt-derived permissions
++ URL:=http://search.cpan.org/dist/WWW-RobotRules/
++ DEPENDS:=perl +perl-uri +perlbase-anydbm-file +perlbase-essential +perlbase-fcntl
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-www-robotrules/install
++ $(call perlmod/Install,$(1),WWW auto/WWW)
++endef
++
++
++$(eval $(call BuildPackage,perl-www-robotrules))
+diff --git a/feeds/packages/lang/perl-www/Makefile b/feeds/packages/lang/perl-www/Makefile
+new file mode 100644
+index 0000000..6bb7c65
+--- /dev/null
++++ b/feeds/packages/lang/perl-www/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-www
++PKG_VERSION:=6.13
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/E/ET/ETHER/
++PKG_SOURCE:=libwww-perl-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=85b36bcd2fd2450718ee14f894f0d3d1
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/libwww-perl-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include ../perl/perlmod.mk
++
++define Package/perl-www
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=WWW client/server library for Perl (aka LWP)
++ URL:=http://search.cpan.org/dist/libwww-perl/
++ DEPENDS:=perl +perl-encode-locale +perl-file-listing +perl-html-parser +perl-http-cookies +perl-http-daemon +perl-http-date +perl-http-message +perl-http-negotiate +perl-lwp-mediatypes +perl-net-http +perl-uri +perl-www-robotrules +perlbase-base +perlbase-digest +perlbase-encode +perlbase-essential +perlbase-io +perlbase-mime +perlbase-net
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,,)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++endef
++
++define Package/perl-www/install
++ $(call perlmod/Install,$(1),LWP.pm auto/LWP LWP)
++endef
++
++
++$(eval $(call BuildPackage,perl-www))
+diff --git a/feeds/packages/lang/perl-xml-parser/Makefile b/feeds/packages/lang/perl-xml-parser/Makefile
+new file mode 100644
+index 0000000..08acb23
+--- /dev/null
++++ b/feeds/packages/lang/perl-xml-parser/Makefile
+@@ -0,0 +1,86 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl-xml-parser
++PKG_VERSION:=2.44
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://www.cpan.org/authors/id/T/TO/TODDR/
++PKG_SOURCE:=XML-Parser-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=af4813fe3952362451201ced6fbce379
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/XML-Parser-$(PKG_VERSION)
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/perl/XML-Parser-$(PKG_VERSION)
++
++HOST_BUILD_DEPENDS:=perl/host expat/host
++
++EXPAT_LIBPATH:=$(STAGING_DIR)/usr/lib
++EXPAT_INCPATH=$(STAGING_DIR)/usr/include
++HOST_EXPAT_LIBPATH:=$(STAGING_DIR_HOST)/lib
++HOST_EXPAT_INCPATH=$(STAGING_DIR_HOST)/include
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/host-build.mk
++include ../perl/perlmod.mk
++
++define Package/perl-xml-parser
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Perl XML Parser
++ URL:=http://search.cpan.org/dist/XML-Parser/
++ DEPENDS:=perl +libexpat +perlbase-dynaloader +perlbase-essential
++endef
++
++define FixupExpat
++ # Manually reconfigure XML::Parser::Expat, as some overrides we provide will not have any effect otherwise
++ # Force usage of OpenWRT's expat
++ sed \
++ -e 's!%%EXPAT_LIBPATH%%!$(2)!g' \
++ -e 's!%%EXPAT_INCPATH%%!$(3)!g' \
++ -i $(1)/Expat/Makefile.PL
++endef
++
++define Build/Configure
++ $(call perlmod/Configure,EXPATLIBPATH=$(EXPAT_LIBPATH) EXPATINCPATH=$(EXPAT_INCPATH),,)
++
++ $(call FixupExpat,$(PKG_BUILD_DIR),$(EXPAT_LIBPATH),$(EXPAT_INCPATH))
++ $(call perlmod/Configure,,,$(PKG_BUILD_DIR)/Expat)
++endef
++
++define Build/Compile
++ $(call perlmod/Compile,,)
++ $(call perlmod/Compile,,,$(PKG_BUILD_DIR)/Expat)
++endef
++
++define Host/Configure
++ $(call perlmod/host/Configure,EXPATLIBPATH=$(HOST_EXPAT_LIBPATH) EXPATINCPATH=$(HOST_EXPAT_INCPATH),,)
++ $(call FixupExpat,$(HOST_BUILD_DIR),$(HOST_EXPAT_LIBPATH),$(HOST_EXPAT_INCPATH))
++ $(call perlmod/host/Configure,,,$(HOST_BUILD_DIR)/Expat)
++endef
++
++define Host/Compile
++ $(call perlmod/host/Compile,,)
++ $(call perlmod/host/Compile,,,$(HOST_BUILD_DIR)/Expat)
++endef
++
++define Host/Install
++ $(call perlmod/host/Install,$(1),)
++endef
++
++define Package/perl-xml-parser/install
++ $(call perlmod/Install,$(1),auto/XML XML)
++endef
++
++
++$(eval $(call BuildPackage,perl-xml-parser))
++$(eval $(call HostBuild))
+diff --git a/feeds/packages/lang/perl-xml-parser/patches/010-xml-parser-expat-use-ppport.h b/feeds/packages/lang/perl-xml-parser/patches/010-xml-parser-expat-use-ppport.h
+new file mode 100644
+index 0000000..e2aad83
+--- /dev/null
++++ b/feeds/packages/lang/perl-xml-parser/patches/010-xml-parser-expat-use-ppport.h
+@@ -0,0 +1,7476 @@
++--- a/Expat/Expat.xs
+++++ b/Expat/Expat.xs
++@@ -20,17 +20,7 @@
++ #include "patchlevel.h"
++ #include "encoding.h"
++
++-
++-/* Version 5.005_5x (Development version for 5.006) doesn't like sv_...
++- anymore, but 5.004 doesn't know about PL_sv..
++- Don't want to push up required version just for this. */
++-
++-#if PATCHLEVEL < 5
++-#define PL_sv_undef sv_undef
++-#define PL_sv_no sv_no
++-#define PL_sv_yes sv_yes
++-#define PL_na na
++-#endif
+++#include "ppport.h"
++
++ #define BUFSIZE 32768
++
++--- /dev/null
+++++ b/Expat/ppport.h
++@@ -0,0 +1,7452 @@
+++#if 0
+++<<'SKIP';
+++#endif
+++/*
+++----------------------------------------------------------------------
+++
+++ ppport.h -- Perl/Pollution/Portability Version 3.21
+++
+++ Automatically created by Devel::PPPort running under perl 5.020002.
+++
+++ Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
+++ includes in parts/inc/ instead.
+++
+++ Use 'perldoc ppport.h' to view the documentation below.
+++
+++----------------------------------------------------------------------
+++
+++SKIP
+++
+++=pod
+++
+++=head1 NAME
+++
+++ppport.h - Perl/Pollution/Portability version 3.21
+++
+++=head1 SYNOPSIS
+++
+++ perl ppport.h [options] [source files]
+++
+++ Searches current directory for files if no [source files] are given
+++
+++ --help show short help
+++
+++ --version show version
+++
+++ --patch=file write one patch file with changes
+++ --copy=suffix write changed copies with suffix
+++ --diff=program use diff program and options
+++
+++ --compat-version=version provide compatibility with Perl version
+++ --cplusplus accept C++ comments
+++
+++ --quiet don't output anything except fatal errors
+++ --nodiag don't show diagnostics
+++ --nohints don't show hints
+++ --nochanges don't suggest changes
+++ --nofilter don't filter input files
+++
+++ --strip strip all script and doc functionality from
+++ ppport.h
+++
+++ --list-provided list provided API
+++ --list-unsupported list unsupported API
+++ --api-info=name show Perl API portability information
+++
+++=head1 COMPATIBILITY
+++
+++This version of F<ppport.h> is designed to support operation with Perl
+++installations back to 5.003, and has been tested up to 5.11.5.
+++
+++=head1 OPTIONS
+++
+++=head2 --help
+++
+++Display a brief usage summary.
+++
+++=head2 --version
+++
+++Display the version of F<ppport.h>.
+++
+++=head2 --patch=I<file>
+++
+++If this option is given, a single patch file will be created if
+++any changes are suggested. This requires a working diff program
+++to be installed on your system.
+++
+++=head2 --copy=I<suffix>
+++
+++If this option is given, a copy of each file will be saved with
+++the given suffix that contains the suggested changes. This does
+++not require any external programs. Note that this does not
+++automagially add a dot between the original filename and the
+++suffix. If you want the dot, you have to include it in the option
+++argument.
+++
+++If neither C<--patch> or C<--copy> are given, the default is to
+++simply print the diffs for each file. This requires either
+++C<Text::Diff> or a C<diff> program to be installed.
+++
+++=head2 --diff=I<program>
+++
+++Manually set the diff program and options to use. The default
+++is to use C<Text::Diff>, when installed, and output unified
+++context diffs.
+++
+++=head2 --compat-version=I<version>
+++
+++Tell F<ppport.h> to check for compatibility with the given
+++Perl version. The default is to check for compatibility with Perl
+++version 5.003. You can use this option to reduce the output
+++of F<ppport.h> if you intend to be backward compatible only
+++down to a certain Perl version.
+++
+++=head2 --cplusplus
+++
+++Usually, F<ppport.h> will detect C++ style comments and
+++replace them with C style comments for portability reasons.
+++Using this option instructs F<ppport.h> to leave C++
+++comments untouched.
+++
+++=head2 --quiet
+++
+++Be quiet. Don't print anything except fatal errors.
+++
+++=head2 --nodiag
+++
+++Don't output any diagnostic messages. Only portability
+++alerts will be printed.
+++
+++=head2 --nohints
+++
+++Don't output any hints. Hints often contain useful portability
+++notes. Warnings will still be displayed.
+++
+++=head2 --nochanges
+++
+++Don't suggest any changes. Only give diagnostic output and hints
+++unless these are also deactivated.
+++
+++=head2 --nofilter
+++
+++Don't filter the list of input files. By default, files not looking
+++like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
+++
+++=head2 --strip
+++
+++Strip all script and documentation functionality from F<ppport.h>.
+++This reduces the size of F<ppport.h> dramatically and may be useful
+++if you want to include F<ppport.h> in smaller modules without
+++increasing their distribution size too much.
+++
+++The stripped F<ppport.h> will have a C<--unstrip> option that allows
+++you to undo the stripping, but only if an appropriate C<Devel::PPPort>
+++module is installed.
+++
+++=head2 --list-provided
+++
+++Lists the API elements for which compatibility is provided by
+++F<ppport.h>. Also lists if it must be explicitly requested,
+++if it has dependencies, and if there are hints or warnings for it.
+++
+++=head2 --list-unsupported
+++
+++Lists the API elements that are known not to be supported by
+++F<ppport.h> and below which version of Perl they probably
+++won't be available or work.
+++
+++=head2 --api-info=I<name>
+++
+++Show portability information for API elements matching I<name>.
+++If I<name> is surrounded by slashes, it is interpreted as a regular
+++expression.
+++
+++=head1 DESCRIPTION
+++
+++In order for a Perl extension (XS) module to be as portable as possible
+++across differing versions of Perl itself, certain steps need to be taken.
+++
+++=over 4
+++
+++=item *
+++
+++Including this header is the first major one. This alone will give you
+++access to a large part of the Perl API that hasn't been available in
+++earlier Perl releases. Use
+++
+++ perl ppport.h --list-provided
+++
+++to see which API elements are provided by ppport.h.
+++
+++=item *
+++
+++You should avoid using deprecated parts of the API. For example, using
+++global Perl variables without the C<PL_> prefix is deprecated. Also,
+++some API functions used to have a C<perl_> prefix. Using this form is
+++also deprecated. You can safely use the supported API, as F<ppport.h>
+++will provide wrappers for older Perl versions.
+++
+++=item *
+++
+++If you use one of a few functions or variables that were not present in
+++earlier versions of Perl, and that can't be provided using a macro, you
+++have to explicitly request support for these functions by adding one or
+++more C<#define>s in your source code before the inclusion of F<ppport.h>.
+++
+++These functions or variables will be marked C<explicit> in the list shown
+++by C<--list-provided>.
+++
+++Depending on whether you module has a single or multiple files that
+++use such functions or variables, you want either C<static> or global
+++variants.
+++
+++For a C<static> function or variable (used only in a single source
+++file), use:
+++
+++ #define NEED_function
+++ #define NEED_variable
+++
+++For a global function or variable (used in multiple source files),
+++use:
+++
+++ #define NEED_function_GLOBAL
+++ #define NEED_variable_GLOBAL
+++
+++Note that you mustn't have more than one global request for the
+++same function or variable in your project.
+++
+++ Function / Variable Static Request Global Request
+++ -----------------------------------------------------------------------------------------
+++ PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL
+++ PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL
+++ eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL
+++ grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL
+++ grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL
+++ grok_number() NEED_grok_number NEED_grok_number_GLOBAL
+++ grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL
+++ grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL
+++ load_module() NEED_load_module NEED_load_module_GLOBAL
+++ my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL
+++ my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL
+++ my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL
+++ my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL
+++ newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL
+++ newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL
+++ newSV_type() NEED_newSV_type NEED_newSV_type_GLOBAL
+++ newSVpvn_flags() NEED_newSVpvn_flags NEED_newSVpvn_flags_GLOBAL
+++ newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL
+++ pv_display() NEED_pv_display NEED_pv_display_GLOBAL
+++ pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL
+++ pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL
+++ sv_2pv_flags() NEED_sv_2pv_flags NEED_sv_2pv_flags_GLOBAL
+++ sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL
+++ sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL
+++ sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL
+++ sv_pvn_force_flags() NEED_sv_pvn_force_flags NEED_sv_pvn_force_flags_GLOBAL
+++ sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL
+++ sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL
+++ vload_module() NEED_vload_module NEED_vload_module_GLOBAL
+++ vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL
+++ warner() NEED_warner NEED_warner_GLOBAL
+++
+++To avoid namespace conflicts, you can change the namespace of the
+++explicitly exported functions / variables using the C<DPPP_NAMESPACE>
+++macro. Just C<#define> the macro before including C<ppport.h>:
+++
+++ #define DPPP_NAMESPACE MyOwnNamespace_
+++ #include "ppport.h"
+++
+++The default namespace is C<DPPP_>.
+++
+++=back
+++
+++The good thing is that most of the above can be checked by running
+++F<ppport.h> on your source code. See the next section for
+++details.
+++
+++=head1 EXAMPLES
+++
+++To verify whether F<ppport.h> is needed for your module, whether you
+++should make any changes to your code, and whether any special defines
+++should be used, F<ppport.h> can be run as a Perl script to check your
+++source code. Simply say:
+++
+++ perl ppport.h
+++
+++The result will usually be a list of patches suggesting changes
+++that should at least be acceptable, if not necessarily the most
+++efficient solution, or a fix for all possible problems.
+++
+++If you know that your XS module uses features only available in
+++newer Perl releases, if you're aware that it uses C++ comments,
+++and if you want all suggestions as a single patch file, you could
+++use something like this:
+++
+++ perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
+++
+++If you only want your code to be scanned without any suggestions
+++for changes, use:
+++
+++ perl ppport.h --nochanges
+++
+++You can specify a different C<diff> program or options, using
+++the C<--diff> option:
+++
+++ perl ppport.h --diff='diff -C 10'
+++
+++This would output context diffs with 10 lines of context.
+++
+++If you want to create patched copies of your files instead, use:
+++
+++ perl ppport.h --copy=.new
+++
+++To display portability information for the C<newSVpvn> function,
+++use:
+++
+++ perl ppport.h --api-info=newSVpvn
+++
+++Since the argument to C<--api-info> can be a regular expression,
+++you can use
+++
+++ perl ppport.h --api-info=/_nomg$/
+++
+++to display portability information for all C<_nomg> functions or
+++
+++ perl ppport.h --api-info=/./
+++
+++to display information for all known API elements.
+++
+++=head1 BUGS
+++
+++If this version of F<ppport.h> is causing failure during
+++the compilation of this module, please check if newer versions
+++of either this module or C<Devel::PPPort> are available on CPAN
+++before sending a bug report.
+++
+++If F<ppport.h> was generated using the latest version of
+++C<Devel::PPPort> and is causing failure of this module, please
+++file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
+++
+++Please include the following information:
+++
+++=over 4
+++
+++=item 1.
+++
+++The complete output from running "perl -V"
+++
+++=item 2.
+++
+++This file.
+++
+++=item 3.
+++
+++The name and version of the module you were trying to build.
+++
+++=item 4.
+++
+++A full log of the build that failed.
+++
+++=item 5.
+++
+++Any other information that you think could be relevant.
+++
+++=back
+++
+++For the latest version of this code, please get the C<Devel::PPPort>
+++module from CPAN.
+++
+++=head1 COPYRIGHT
+++
+++Version 3.x, Copyright (c) 2004-2013, Marcus Holland-Moritz.
+++
+++Version 2.x, Copyright (C) 2001, Paul Marquess.
+++
+++Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+++
+++This program is free software; you can redistribute it and/or
+++modify it under the same terms as Perl itself.
+++
+++=head1 SEE ALSO
+++
+++See L<Devel::PPPort>.
+++
+++=cut
+++
+++use strict;
+++
+++# Disable broken TRIE-optimization
+++BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 }
+++
+++my $VERSION = 3.21;
+++
+++my %opt = (
+++ quiet => 0,
+++ diag => 1,
+++ hints => 1,
+++ changes => 1,
+++ cplusplus => 0,
+++ filter => 1,
+++ strip => 0,
+++ version => 0,
+++);
+++
+++my($ppport) = $0 =~ /([\w.]+)$/;
+++my $LF = '(?:\r\n|[\r\n])'; # line feed
+++my $HS = "[ \t]"; # horizontal whitespace
+++
+++# Never use C comments in this file!
+++my $ccs = '/'.'*';
+++my $cce = '*'.'/';
+++my $rccs = quotemeta $ccs;
+++my $rcce = quotemeta $cce;
+++
+++eval {
+++ require Getopt::Long;
+++ Getopt::Long::GetOptions(\%opt, qw(
+++ help quiet diag! filter! hints! changes! cplusplus strip version
+++ patch=s copy=s diff=s compat-version=s
+++ list-provided list-unsupported api-info=s
+++ )) or usage();
+++};
+++
+++if ($@ and grep /^-/, @ARGV) {
+++ usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
+++ die "Getopt::Long not found. Please don't use any options.\n";
+++}
+++
+++if ($opt{version}) {
+++ print "This is $0 $VERSION.\n";
+++ exit 0;
+++}
+++
+++usage() if $opt{help};
+++strip() if $opt{strip};
+++
+++if (exists $opt{'compat-version'}) {
+++ my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
+++ if ($@) {
+++ die "Invalid version number format: '$opt{'compat-version'}'\n";
+++ }
+++ die "Only Perl 5 is supported\n" if $r != 5;
+++ die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
+++ $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
+++}
+++else {
+++ $opt{'compat-version'} = 5;
+++}
+++
+++my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
+++ ? ( $1 => {
+++ ($2 ? ( base => $2 ) : ()),
+++ ($3 ? ( todo => $3 ) : ()),
+++ (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()),
+++ (index($4, 'p') >= 0 ? ( provided => 1 ) : ()),
+++ (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()),
+++ } )
+++ : die "invalid spec: $_" } qw(
+++AvFILLp|5.004050||p
+++AvFILL|||
+++BhkDISABLE||5.019003|
+++BhkENABLE||5.019003|
+++BhkENTRY_set||5.019003|
+++BhkENTRY|||
+++BhkFLAGS|||
+++CALL_BLOCK_HOOKS|||
+++CLASS|||n
+++CPERLscope|5.005000||p
+++CX_CURPAD_SAVE|||
+++CX_CURPAD_SV|||
+++CopFILEAV|5.006000||p
+++CopFILEGV_set|5.006000||p
+++CopFILEGV|5.006000||p
+++CopFILESV|5.006000||p
+++CopFILE_set|5.006000||p
+++CopFILE|5.006000||p
+++CopSTASHPV_set|5.006000||p
+++CopSTASHPV|5.006000||p
+++CopSTASH_eq|5.006000||p
+++CopSTASH_set|5.006000||p
+++CopSTASH|5.006000||p
+++CopyD|5.009002|5.004050|p
+++Copy||5.004050|
+++CvPADLIST||5.008001|
+++CvSTASH|||
+++CvWEAKOUTSIDE|||
+++DEFSV_set|5.010001||p
+++DEFSV|5.004050||p
+++END_EXTERN_C|5.005000||p
+++ENTER|||
+++ERRSV|5.004050||p
+++EXTEND|||
+++EXTERN_C|5.005000||p
+++F0convert|||n
+++FREETMPS|||
+++GIMME_V||5.004000|n
+++GIMME|||n
+++GROK_NUMERIC_RADIX|5.007002||p
+++G_ARRAY|||
+++G_DISCARD|||
+++G_EVAL|||
+++G_METHOD|5.006001||p
+++G_NOARGS|||
+++G_SCALAR|||
+++G_VOID||5.004000|
+++GetVars|||
+++GvAV|||
+++GvCV|||
+++GvHV|||
+++GvSVn|5.009003||p
+++GvSV|||
+++Gv_AMupdate||5.011000|
+++HEf_SVKEY||5.004000|
+++HeHASH||5.004000|
+++HeKEY||5.004000|
+++HeKLEN||5.004000|
+++HePV||5.004000|
+++HeSVKEY_force||5.004000|
+++HeSVKEY_set||5.004000|
+++HeSVKEY||5.004000|
+++HeUTF8||5.010001|
+++HeVAL||5.004000|
+++HvENAMELEN||5.015004|
+++HvENAMEUTF8||5.015004|
+++HvENAME||5.013007|
+++HvNAMELEN_get|5.009003||p
+++HvNAMELEN||5.015004|
+++HvNAMEUTF8||5.015004|
+++HvNAME_get|5.009003||p
+++HvNAME|||
+++INT2PTR|5.006000||p
+++IN_LOCALE_COMPILETIME|5.007002||p
+++IN_LOCALE_RUNTIME|5.007002||p
+++IN_LOCALE|5.007002||p
+++IN_PERL_COMPILETIME|5.008001||p
+++IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p
+++IS_NUMBER_INFINITY|5.007002||p
+++IS_NUMBER_IN_UV|5.007002||p
+++IS_NUMBER_NAN|5.007003||p
+++IS_NUMBER_NEG|5.007002||p
+++IS_NUMBER_NOT_INT|5.007002||p
+++IVSIZE|5.006000||p
+++IVTYPE|5.006000||p
+++IVdf|5.006000||p
+++LEAVE|||
+++LINKLIST||5.013006|
+++LVRET|||
+++MARK|||
+++MULTICALL||5.019003|
+++MY_CXT_CLONE|5.009002||p
+++MY_CXT_INIT|5.007003||p
+++MY_CXT|5.007003||p
+++MoveD|5.009002|5.004050|p
+++Move||5.004050|
+++NOOP|5.005000||p
+++NUM2PTR|5.006000||p
+++NVTYPE|5.006000||p
+++NVef|5.006001||p
+++NVff|5.006001||p
+++NVgf|5.006001||p
+++Newxc|5.009003||p
+++Newxz|5.009003||p
+++Newx|5.009003||p
+++Nullav|||
+++Nullch|||
+++Nullcv|||
+++Nullhv|||
+++Nullsv|||
+++OP_CLASS||5.013007|
+++OP_DESC||5.007003|
+++OP_NAME||5.007003|
+++ORIGMARK|||
+++PAD_BASE_SV|||
+++PAD_CLONE_VARS|||
+++PAD_COMPNAME_FLAGS|||
+++PAD_COMPNAME_GEN_set|||
+++PAD_COMPNAME_GEN|||
+++PAD_COMPNAME_OURSTASH|||
+++PAD_COMPNAME_PV|||
+++PAD_COMPNAME_TYPE|||
+++PAD_RESTORE_LOCAL|||
+++PAD_SAVE_LOCAL|||
+++PAD_SAVE_SETNULLPAD|||
+++PAD_SETSV|||
+++PAD_SET_CUR_NOSAVE|||
+++PAD_SET_CUR|||
+++PAD_SVl|||
+++PAD_SV|||
+++PERLIO_FUNCS_CAST|5.009003||p
+++PERLIO_FUNCS_DECL|5.009003||p
+++PERL_ABS|5.008001||p
+++PERL_BCDVERSION|5.019002||p
+++PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
+++PERL_HASH|5.004000||p
+++PERL_INT_MAX|5.004000||p
+++PERL_INT_MIN|5.004000||p
+++PERL_LONG_MAX|5.004000||p
+++PERL_LONG_MIN|5.004000||p
+++PERL_MAGIC_arylen|5.007002||p
+++PERL_MAGIC_backref|5.007002||p
+++PERL_MAGIC_bm|5.007002||p
+++PERL_MAGIC_collxfrm|5.007002||p
+++PERL_MAGIC_dbfile|5.007002||p
+++PERL_MAGIC_dbline|5.007002||p
+++PERL_MAGIC_defelem|5.007002||p
+++PERL_MAGIC_envelem|5.007002||p
+++PERL_MAGIC_env|5.007002||p
+++PERL_MAGIC_ext|5.007002||p
+++PERL_MAGIC_fm|5.007002||p
+++PERL_MAGIC_glob|5.019002||p
+++PERL_MAGIC_isaelem|5.007002||p
+++PERL_MAGIC_isa|5.007002||p
+++PERL_MAGIC_mutex|5.019002||p
+++PERL_MAGIC_nkeys|5.007002||p
+++PERL_MAGIC_overload_elem|5.019002||p
+++PERL_MAGIC_overload_table|5.007002||p
+++PERL_MAGIC_overload|5.019002||p
+++PERL_MAGIC_pos|5.007002||p
+++PERL_MAGIC_qr|5.007002||p
+++PERL_MAGIC_regdata|5.007002||p
+++PERL_MAGIC_regdatum|5.007002||p
+++PERL_MAGIC_regex_global|5.007002||p
+++PERL_MAGIC_shared_scalar|5.007003||p
+++PERL_MAGIC_shared|5.007003||p
+++PERL_MAGIC_sigelem|5.007002||p
+++PERL_MAGIC_sig|5.007002||p
+++PERL_MAGIC_substr|5.007002||p
+++PERL_MAGIC_sv|5.007002||p
+++PERL_MAGIC_taint|5.007002||p
+++PERL_MAGIC_tiedelem|5.007002||p
+++PERL_MAGIC_tiedscalar|5.007002||p
+++PERL_MAGIC_tied|5.007002||p
+++PERL_MAGIC_utf8|5.008001||p
+++PERL_MAGIC_uvar_elem|5.007003||p
+++PERL_MAGIC_uvar|5.007002||p
+++PERL_MAGIC_vec|5.007002||p
+++PERL_MAGIC_vstring|5.008001||p
+++PERL_PV_ESCAPE_ALL|5.009004||p
+++PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p
+++PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p
+++PERL_PV_ESCAPE_NOCLEAR|5.009004||p
+++PERL_PV_ESCAPE_QUOTE|5.009004||p
+++PERL_PV_ESCAPE_RE|5.009005||p
+++PERL_PV_ESCAPE_UNI_DETECT|5.009004||p
+++PERL_PV_ESCAPE_UNI|5.009004||p
+++PERL_PV_PRETTY_DUMP|5.009004||p
+++PERL_PV_PRETTY_ELLIPSES|5.010000||p
+++PERL_PV_PRETTY_LTGT|5.009004||p
+++PERL_PV_PRETTY_NOCLEAR|5.010000||p
+++PERL_PV_PRETTY_QUOTE|5.009004||p
+++PERL_PV_PRETTY_REGPROP|5.009004||p
+++PERL_QUAD_MAX|5.004000||p
+++PERL_QUAD_MIN|5.004000||p
+++PERL_REVISION|5.006000||p
+++PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p
+++PERL_SCAN_DISALLOW_PREFIX|5.007003||p
+++PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
+++PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
+++PERL_SHORT_MAX|5.004000||p
+++PERL_SHORT_MIN|5.004000||p
+++PERL_SIGNALS_UNSAFE_FLAG|5.008001||p
+++PERL_SUBVERSION|5.006000||p
+++PERL_SYS_INIT3||5.010000|
+++PERL_SYS_INIT||5.010000|
+++PERL_SYS_TERM||5.019003|
+++PERL_UCHAR_MAX|5.004000||p
+++PERL_UCHAR_MIN|5.004000||p
+++PERL_UINT_MAX|5.004000||p
+++PERL_UINT_MIN|5.004000||p
+++PERL_ULONG_MAX|5.004000||p
+++PERL_ULONG_MIN|5.004000||p
+++PERL_UNUSED_ARG|5.009003||p
+++PERL_UNUSED_CONTEXT|5.009004||p
+++PERL_UNUSED_DECL|5.007002||p
+++PERL_UNUSED_VAR|5.007002||p
+++PERL_UQUAD_MAX|5.004000||p
+++PERL_UQUAD_MIN|5.004000||p
+++PERL_USE_GCC_BRACE_GROUPS|5.009004||p
+++PERL_USHORT_MAX|5.004000||p
+++PERL_USHORT_MIN|5.004000||p
+++PERL_VERSION|5.006000||p
+++PL_DBsignal|5.005000||p
+++PL_DBsingle|||pn
+++PL_DBsub|||pn
+++PL_DBtrace|||pn
+++PL_Sv|5.005000||p
+++PL_bufend|5.019002||p
+++PL_bufptr|5.019002||p
+++PL_check||5.006000|
+++PL_compiling|5.004050||p
+++PL_comppad_name||5.017004|
+++PL_comppad||5.008001|
+++PL_copline|5.019002||p
+++PL_curcop|5.004050||p
+++PL_curpad||5.005000|
+++PL_curstash|5.004050||p
+++PL_debstash|5.004050||p
+++PL_defgv|5.004050||p
+++PL_diehook|5.004050||p
+++PL_dirty|5.004050||p
+++PL_dowarn|||pn
+++PL_errgv|5.004050||p
+++PL_error_count|5.019002||p
+++PL_expect|5.019002||p
+++PL_hexdigit|5.005000||p
+++PL_hints|5.005000||p
+++PL_in_my_stash|5.019002||p
+++PL_in_my|5.019002||p
+++PL_keyword_plugin||5.011002|
+++PL_last_in_gv|||n
+++PL_laststatval|5.005000||p
+++PL_lex_state|5.019002||p
+++PL_lex_stuff|5.019002||p
+++PL_linestr|5.019002||p
+++PL_modglobal||5.005000|n
+++PL_na|5.004050||pn
+++PL_no_modify|5.006000||p
+++PL_ofsgv|||n
+++PL_opfreehook||5.011000|n
+++PL_parser|5.009005|5.009005|p
+++PL_peepp||5.007003|n
+++PL_perl_destruct_level|5.004050||p
+++PL_perldb|5.004050||p
+++PL_ppaddr|5.006000||p
+++PL_rpeepp||5.013005|n
+++PL_rsfp_filters|5.019002||p
+++PL_rsfp|5.019002||p
+++PL_rs|||n
+++PL_signals|5.008001||p
+++PL_stack_base|5.004050||p
+++PL_stack_sp|5.004050||p
+++PL_statcache|5.005000||p
+++PL_stdingv|5.004050||p
+++PL_sv_arenaroot|5.004050||p
+++PL_sv_no|5.004050||pn
+++PL_sv_undef|5.004050||pn
+++PL_sv_yes|5.004050||pn
+++PL_tainted|5.004050||p
+++PL_tainting|5.004050||p
+++PL_tokenbuf|5.019002||p
+++POP_MULTICALL||5.019003|
+++POPi|||n
+++POPl|||n
+++POPn|||n
+++POPpbytex||5.007001|n
+++POPpx||5.005030|n
+++POPp|||n
+++POPs|||n
+++PTR2IV|5.006000||p
+++PTR2NV|5.006000||p
+++PTR2UV|5.006000||p
+++PTR2nat|5.009003||p
+++PTR2ul|5.007001||p
+++PTRV|5.006000||p
+++PUSHMARK|||
+++PUSH_MULTICALL||5.019003|
+++PUSHi|||
+++PUSHmortal|5.009002||p
+++PUSHn|||
+++PUSHp|||
+++PUSHs|||
+++PUSHu|5.004000||p
+++PUTBACK|||
+++PadARRAY||5.019003|
+++PadMAX||5.019003|
+++PadlistARRAY||5.019003|
+++PadlistMAX||5.019003|
+++PadlistNAMESARRAY||5.019003|
+++PadlistNAMESMAX||5.019003|
+++PadlistNAMES||5.019003|
+++PadlistREFCNT||5.017004|
+++PadnameIsOUR|||
+++PadnameIsSTATE|||
+++PadnameLEN||5.019003|
+++PadnameOURSTASH|||
+++PadnameOUTER|||
+++PadnamePV||5.019003|
+++PadnameSV||5.019003|
+++PadnameTYPE|||
+++PadnameUTF8||5.019003|
+++PadnamelistARRAY||5.019003|
+++PadnamelistMAX||5.019003|
+++PerlIO_clearerr||5.007003|
+++PerlIO_close||5.007003|
+++PerlIO_context_layers||5.009004|
+++PerlIO_eof||5.007003|
+++PerlIO_error||5.007003|
+++PerlIO_fileno||5.007003|
+++PerlIO_fill||5.007003|
+++PerlIO_flush||5.007003|
+++PerlIO_get_base||5.007003|
+++PerlIO_get_bufsiz||5.007003|
+++PerlIO_get_cnt||5.007003|
+++PerlIO_get_ptr||5.007003|
+++PerlIO_read||5.007003|
+++PerlIO_seek||5.007003|
+++PerlIO_set_cnt||5.007003|
+++PerlIO_set_ptrcnt||5.007003|
+++PerlIO_setlinebuf||5.007003|
+++PerlIO_stderr||5.007003|
+++PerlIO_stdin||5.007003|
+++PerlIO_stdout||5.007003|
+++PerlIO_tell||5.007003|
+++PerlIO_unread||5.007003|
+++PerlIO_write||5.007003|
+++Perl_signbit||5.009005|n
+++PoisonFree|5.009004||p
+++PoisonNew|5.009004||p
+++PoisonWith|5.009004||p
+++Poison|5.008000||p
+++READ_XDIGIT||5.017006|
+++RETVAL|||n
+++Renewc|||
+++Renew|||
+++SAVECLEARSV|||
+++SAVECOMPPAD|||
+++SAVEPADSV|||
+++SAVETMPS|||
+++SAVE_DEFSV|5.004050||p
+++SPAGAIN|||
+++SP|||
+++START_EXTERN_C|5.005000||p
+++START_MY_CXT|5.007003||p
+++STMT_END|||p
+++STMT_START|||p
+++STR_WITH_LEN|5.009003||p
+++ST|||
+++SV_CONST_RETURN|5.009003||p
+++SV_COW_DROP_PV|5.008001||p
+++SV_COW_SHARED_HASH_KEYS|5.009005||p
+++SV_GMAGIC|5.007002||p
+++SV_HAS_TRAILING_NUL|5.009004||p
+++SV_IMMEDIATE_UNREF|5.007001||p
+++SV_MUTABLE_RETURN|5.009003||p
+++SV_NOSTEAL|5.009002||p
+++SV_SMAGIC|5.009003||p
+++SV_UTF8_NO_ENCODING|5.008001||p
+++SVfARG|5.009005||p
+++SVf_UTF8|5.006000||p
+++SVf|5.006000||p
+++SVt_INVLIST||5.019002|
+++SVt_IV|||
+++SVt_NULL|||
+++SVt_NV|||
+++SVt_PVAV|||
+++SVt_PVCV|||
+++SVt_PVFM|||
+++SVt_PVGV|||
+++SVt_PVHV|||
+++SVt_PVIO|||
+++SVt_PVIV|||
+++SVt_PVLV|||
+++SVt_PVMG|||
+++SVt_PVNV|||
+++SVt_PV|||
+++SVt_REGEXP||5.011000|
+++Safefree|||
+++Slab_Alloc|||
+++Slab_Free|||
+++Slab_to_ro|||
+++Slab_to_rw|||
+++StructCopy|||
+++SvCUR_set|||
+++SvCUR|||
+++SvEND|||
+++SvGAMAGIC||5.006001|
+++SvGETMAGIC|5.004050||p
+++SvGROW|||
+++SvIOK_UV||5.006000|
+++SvIOK_notUV||5.006000|
+++SvIOK_off|||
+++SvIOK_only_UV||5.006000|
+++SvIOK_only|||
+++SvIOK_on|||
+++SvIOKp|||
+++SvIOK|||
+++SvIVX|||
+++SvIV_nomg|5.009001||p
+++SvIV_set|||
+++SvIVx|||
+++SvIV|||
+++SvIsCOW_shared_hash||5.008003|
+++SvIsCOW||5.008003|
+++SvLEN_set|||
+++SvLEN|||
+++SvLOCK||5.007003|
+++SvMAGIC_set|5.009003||p
+++SvNIOK_off|||
+++SvNIOKp|||
+++SvNIOK|||
+++SvNOK_off|||
+++SvNOK_only|||
+++SvNOK_on|||
+++SvNOKp|||
+++SvNOK|||
+++SvNVX|||
+++SvNV_nomg||5.013002|
+++SvNV_set|||
+++SvNVx|||
+++SvNV|||
+++SvOK|||
+++SvOOK_offset||5.011000|
+++SvOOK|||
+++SvPOK_off|||
+++SvPOK_only_UTF8||5.006000|
+++SvPOK_only|||
+++SvPOK_on|||
+++SvPOKp|||
+++SvPOK|||
+++SvPVX_const|5.009003||p
+++SvPVX_mutable|5.009003||p
+++SvPVX|||
+++SvPV_const|5.009003||p
+++SvPV_flags_const_nolen|5.009003||p
+++SvPV_flags_const|5.009003||p
+++SvPV_flags_mutable|5.009003||p
+++SvPV_flags|5.007002||p
+++SvPV_force_flags_mutable|5.009003||p
+++SvPV_force_flags_nolen|5.009003||p
+++SvPV_force_flags|5.007002||p
+++SvPV_force_mutable|5.009003||p
+++SvPV_force_nolen|5.009003||p
+++SvPV_force_nomg_nolen|5.009003||p
+++SvPV_force_nomg|5.007002||p
+++SvPV_force|||p
+++SvPV_mutable|5.009003||p
+++SvPV_nolen_const|5.009003||p
+++SvPV_nolen|5.006000||p
+++SvPV_nomg_const_nolen|5.009003||p
+++SvPV_nomg_const|5.009003||p
+++SvPV_nomg_nolen|5.013007||p
+++SvPV_nomg|5.007002||p
+++SvPV_renew|5.009003||p
+++SvPV_set|||
+++SvPVbyte_force||5.009002|
+++SvPVbyte_nolen||5.006000|
+++SvPVbytex_force||5.006000|
+++SvPVbytex||5.006000|
+++SvPVbyte|5.006000||p
+++SvPVutf8_force||5.006000|
+++SvPVutf8_nolen||5.006000|
+++SvPVutf8x_force||5.006000|
+++SvPVutf8x||5.006000|
+++SvPVutf8||5.006000|
+++SvPVx|||
+++SvPV|||
+++SvREFCNT_dec_NN||5.017007|
+++SvREFCNT_dec|||
+++SvREFCNT_inc_NN|5.009004||p
+++SvREFCNT_inc_simple_NN|5.009004||p
+++SvREFCNT_inc_simple_void_NN|5.009004||p
+++SvREFCNT_inc_simple_void|5.009004||p
+++SvREFCNT_inc_simple|5.009004||p
+++SvREFCNT_inc_void_NN|5.009004||p
+++SvREFCNT_inc_void|5.009004||p
+++SvREFCNT_inc|||p
+++SvREFCNT|||
+++SvROK_off|||
+++SvROK_on|||
+++SvROK|||
+++SvRV_set|5.009003||p
+++SvRV|||
+++SvRXOK||5.009005|
+++SvRX||5.009005|
+++SvSETMAGIC|||
+++SvSHARED_HASH|5.009003||p
+++SvSHARE||5.007003|
+++SvSTASH_set|5.009003||p
+++SvSTASH|||
+++SvSetMagicSV_nosteal||5.004000|
+++SvSetMagicSV||5.004000|
+++SvSetSV_nosteal||5.004000|
+++SvSetSV|||
+++SvTAINTED_off||5.004000|
+++SvTAINTED_on||5.004000|
+++SvTAINTED||5.004000|
+++SvTAINT|||
+++SvTHINKFIRST|||
+++SvTRUE_nomg||5.013006|
+++SvTRUE|||
+++SvTYPE|||
+++SvUNLOCK||5.007003|
+++SvUOK|5.007001|5.006000|p
+++SvUPGRADE|||
+++SvUTF8_off||5.006000|
+++SvUTF8_on||5.006000|
+++SvUTF8||5.006000|
+++SvUVXx|5.004000||p
+++SvUVX|5.004000||p
+++SvUV_nomg|5.009001||p
+++SvUV_set|5.009003||p
+++SvUVx|5.004000||p
+++SvUV|5.004000||p
+++SvVOK||5.008001|
+++SvVSTRING_mg|5.009004||p
+++THIS|||n
+++UNDERBAR|5.009002||p
+++UTF8_MAXBYTES|5.009002||p
+++UVSIZE|5.006000||p
+++UVTYPE|5.006000||p
+++UVXf|5.007001||p
+++UVof|5.006000||p
+++UVuf|5.006000||p
+++UVxf|5.006000||p
+++WARN_ALL|5.006000||p
+++WARN_AMBIGUOUS|5.006000||p
+++WARN_ASSERTIONS|5.019002||p
+++WARN_BAREWORD|5.006000||p
+++WARN_CLOSED|5.006000||p
+++WARN_CLOSURE|5.006000||p
+++WARN_DEBUGGING|5.006000||p
+++WARN_DEPRECATED|5.006000||p
+++WARN_DIGIT|5.006000||p
+++WARN_EXEC|5.006000||p
+++WARN_EXITING|5.006000||p
+++WARN_GLOB|5.006000||p
+++WARN_INPLACE|5.006000||p
+++WARN_INTERNAL|5.006000||p
+++WARN_IO|5.006000||p
+++WARN_LAYER|5.008000||p
+++WARN_MALLOC|5.006000||p
+++WARN_MISC|5.006000||p
+++WARN_NEWLINE|5.006000||p
+++WARN_NUMERIC|5.006000||p
+++WARN_ONCE|5.006000||p
+++WARN_OVERFLOW|5.006000||p
+++WARN_PACK|5.006000||p
+++WARN_PARENTHESIS|5.006000||p
+++WARN_PIPE|5.006000||p
+++WARN_PORTABLE|5.006000||p
+++WARN_PRECEDENCE|5.006000||p
+++WARN_PRINTF|5.006000||p
+++WARN_PROTOTYPE|5.006000||p
+++WARN_QW|5.006000||p
+++WARN_RECURSION|5.006000||p
+++WARN_REDEFINE|5.006000||p
+++WARN_REGEXP|5.006000||p
+++WARN_RESERVED|5.006000||p
+++WARN_SEMICOLON|5.006000||p
+++WARN_SEVERE|5.006000||p
+++WARN_SIGNAL|5.006000||p
+++WARN_SUBSTR|5.006000||p
+++WARN_SYNTAX|5.006000||p
+++WARN_TAINT|5.006000||p
+++WARN_THREADS|5.008000||p
+++WARN_UNINITIALIZED|5.006000||p
+++WARN_UNOPENED|5.006000||p
+++WARN_UNPACK|5.006000||p
+++WARN_UNTIE|5.006000||p
+++WARN_UTF8|5.006000||p
+++WARN_VOID|5.006000||p
+++WIDEST_UTYPE|5.015004||p
+++XCPT_CATCH|5.009002||p
+++XCPT_RETHROW|5.009002|5.007001|p
+++XCPT_TRY_END|5.009002|5.004000|p
+++XCPT_TRY_START|5.009002|5.004000|p
+++XPUSHi|||
+++XPUSHmortal|5.009002||p
+++XPUSHn|||
+++XPUSHp|||
+++XPUSHs|||
+++XPUSHu|5.004000||p
+++XSPROTO|5.010000||p
+++XSRETURN_EMPTY|||
+++XSRETURN_IV|||
+++XSRETURN_NO|||
+++XSRETURN_NV|||
+++XSRETURN_PV|||
+++XSRETURN_UNDEF|||
+++XSRETURN_UV|5.008001||p
+++XSRETURN_YES|||
+++XSRETURN|||p
+++XST_mIV|||
+++XST_mNO|||
+++XST_mNV|||
+++XST_mPV|||
+++XST_mUNDEF|||
+++XST_mUV|5.008001||p
+++XST_mYES|||
+++XS_APIVERSION_BOOTCHECK||5.013004|
+++XS_EXTERNAL||5.019003|
+++XS_INTERNAL||5.019003|
+++XS_VERSION_BOOTCHECK|||
+++XS_VERSION|||
+++XSprePUSH|5.006000||p
+++XS|||
+++XopDISABLE||5.019003|
+++XopENABLE||5.019003|
+++XopENTRY_set||5.019003|
+++XopENTRY||5.019003|
+++XopFLAGS||5.013007|
+++ZeroD|5.009002||p
+++Zero|||
+++_aMY_CXT|5.007003||p
+++_add_range_to_invlist|||
+++_append_range_to_invlist|||
+++_core_swash_init|||
+++_get_swash_invlist|||
+++_invlist_array_init|||
+++_invlist_contains_cp|||
+++_invlist_contents|||
+++_invlist_dump|||
+++_invlist_intersection_maybe_complement_2nd|||
+++_invlist_intersection|||
+++_invlist_invert_prop|||
+++_invlist_invert|||
+++_invlist_len|||
+++_invlist_populate_swatch|||
+++_invlist_search|||
+++_invlist_subtract|||
+++_invlist_union_maybe_complement_2nd|||
+++_invlist_union|||
+++_is_uni_FOO||5.017008|
+++_is_uni_perl_idcont||5.017008|
+++_is_uni_perl_idstart||5.017007|
+++_is_utf8_FOO||5.017008|
+++_is_utf8_mark||5.017008|
+++_is_utf8_perl_idcont||5.017008|
+++_is_utf8_perl_idstart||5.017007|
+++_new_invlist_C_array|||
+++_new_invlist|||
+++_pMY_CXT|5.007003||p
+++_swash_inversion_hash|||
+++_swash_to_invlist|||
+++_to_fold_latin1|||
+++_to_uni_fold_flags||5.013011|
+++_to_upper_title_latin1|||
+++_to_utf8_fold_flags||5.015006|
+++_to_utf8_lower_flags||5.015006|
+++_to_utf8_title_flags||5.015006|
+++_to_utf8_upper_flags||5.015006|
+++aMY_CXT_|5.007003||p
+++aMY_CXT|5.007003||p
+++aTHXR_|5.019002||p
+++aTHXR|5.019002||p
+++aTHX_|5.006000||p
+++aTHX|5.006000||p
+++aassign_common_vars|||
+++add_cp_to_invlist|||
+++add_data|||n
+++add_utf16_textfilter|||
+++addmad|||
+++adjust_size_and_find_bucket|||n
+++adjust_stack_on_leave|||
+++alloc_maybe_populate_EXACT|||
+++alloccopstash|||
+++allocmy|||
+++amagic_call|||
+++amagic_cmp_locale|||
+++amagic_cmp|||
+++amagic_deref_call||5.013007|
+++amagic_i_ncmp|||
+++amagic_is_enabled|||
+++amagic_ncmp|||
+++anonymise_cv_maybe|||
+++any_dup|||
+++ao|||
+++append_madprops|||
+++apply_attrs_my|||
+++apply_attrs_string||5.006001|
+++apply_attrs|||
+++apply|||
+++assert_uft8_cache_coherent|||
+++atfork_lock||5.007003|n
+++atfork_unlock||5.007003|n
+++av_arylen_p||5.009003|
+++av_clear|||
+++av_create_and_push||5.009005|
+++av_create_and_unshift_one||5.009005|
+++av_delete||5.006000|
+++av_exists||5.006000|
+++av_extend_guts|||
+++av_extend|||
+++av_fetch|||
+++av_fill|||
+++av_iter_p||5.011000|
+++av_len|||
+++av_make|||
+++av_pop|||
+++av_push|||
+++av_reify|||
+++av_shift|||
+++av_store|||
+++av_tindex||5.017009|
+++av_top_index||5.017009|
+++av_undef|||
+++av_unshift|||
+++ax|||n
+++bad_type_gv|||
+++bad_type_pv|||
+++bind_match|||
+++block_end|||
+++block_gimme||5.004000|
+++block_start|||
+++blockhook_register||5.013003|
+++boolSV|5.004000||p
+++boot_core_PerlIO|||
+++boot_core_UNIVERSAL|||
+++boot_core_mro|||
+++bytes_cmp_utf8||5.013007|
+++bytes_from_utf8||5.007001|
+++bytes_to_uni|||n
+++bytes_to_utf8||5.006001|
+++call_argv|5.006000||p
+++call_atexit||5.006000|
+++call_list||5.004000|
+++call_method|5.006000||p
+++call_pv|5.006000||p
+++call_sv|5.006000||p
+++caller_cx||5.013005|
+++calloc||5.007002|n
+++cando|||
+++cast_i32||5.006000|
+++cast_iv||5.006000|
+++cast_ulong||5.006000|
+++cast_uv||5.006000|
+++check_locale_boundary_crossing|||
+++check_type_and_open|||
+++check_uni|||
+++check_utf8_print|||
+++checkcomma|||
+++ckWARN|5.006000||p
+++ck_entersub_args_core|||
+++ck_entersub_args_list||5.013006|
+++ck_entersub_args_proto_or_list||5.013006|
+++ck_entersub_args_proto||5.013006|
+++ck_warner_d||5.011001|v
+++ck_warner||5.011001|v
+++ckwarn_common|||
+++ckwarn_d||5.009003|
+++ckwarn||5.009003|
+++cl_and|||n
+++cl_anything|||n
+++cl_init|||n
+++cl_is_anything|||n
+++cl_or|||n
+++clear_placeholders|||
+++clone_params_del|||n
+++clone_params_new|||n
+++closest_cop|||
+++compute_EXACTish|||
+++convert|||
+++cop_fetch_label||5.015001|
+++cop_free|||
+++cop_hints_2hv||5.013007|
+++cop_hints_fetch_pvn||5.013007|
+++cop_hints_fetch_pvs||5.013007|
+++cop_hints_fetch_pv||5.013007|
+++cop_hints_fetch_sv||5.013007|
+++cop_store_label||5.015001|
+++cophh_2hv||5.013007|
+++cophh_copy||5.013007|
+++cophh_delete_pvn||5.013007|
+++cophh_delete_pvs||5.013007|
+++cophh_delete_pv||5.013007|
+++cophh_delete_sv||5.013007|
+++cophh_fetch_pvn||5.013007|
+++cophh_fetch_pvs||5.013007|
+++cophh_fetch_pv||5.013007|
+++cophh_fetch_sv||5.013007|
+++cophh_free||5.013007|
+++cophh_new_empty||5.019003|
+++cophh_store_pvn||5.013007|
+++cophh_store_pvs||5.013007|
+++cophh_store_pv||5.013007|
+++cophh_store_sv||5.013007|
+++core_prototype|||
+++core_regclass_swash|||
+++coresub_op|||
+++could_it_be_a_POSIX_class|||
+++cr_textfilter|||
+++create_eval_scope|||
+++croak_memory_wrap||5.019003|n
+++croak_no_mem|||n
+++croak_no_modify||5.013003|n
+++croak_nocontext|||vn
+++croak_popstack|||n
+++croak_sv||5.013001|
+++croak_xs_usage||5.010001|n
+++croak|||v
+++csighandler||5.009003|n
+++curmad|||
+++current_re_engine|||
+++curse|||
+++custom_op_desc||5.007003|
+++custom_op_name||5.007003|
+++custom_op_register||5.013007|
+++custom_op_xop||5.013007|
+++cv_ckproto_len_flags|||
+++cv_clone_into|||
+++cv_clone|||
+++cv_const_sv_or_av|||
+++cv_const_sv||5.004000|
+++cv_dump|||
+++cv_forget_slab|||
+++cv_get_call_checker||5.013006|
+++cv_set_call_checker||5.013006|
+++cv_undef|||
+++cvgv_set|||
+++cvstash_set|||
+++cx_dump||5.005000|
+++cx_dup|||
+++cxinc|||
+++dAXMARK|5.009003||p
+++dAX|5.007002||p
+++dITEMS|5.007002||p
+++dMARK|||
+++dMULTICALL||5.009003|
+++dMY_CXT_SV|5.007003||p
+++dMY_CXT|5.007003||p
+++dNOOP|5.006000||p
+++dORIGMARK|||
+++dSP|||
+++dTHR|5.004050||p
+++dTHXR|5.019002||p
+++dTHXa|5.006000||p
+++dTHXoa|5.006000||p
+++dTHX|5.006000||p
+++dUNDERBAR|5.009002||p
+++dVAR|5.009003||p
+++dXCPT|5.009002||p
+++dXSARGS|||
+++dXSI32|||
+++dXSTARG|5.006000||p
+++deb_curcv|||
+++deb_nocontext|||vn
+++deb_stack_all|||
+++deb_stack_n|||
+++debop||5.005000|
+++debprofdump||5.005000|
+++debprof|||
+++debstackptrs||5.007003|
+++debstack||5.007003|
+++debug_start_match|||
+++deb||5.007003|v
+++defelem_target|||
+++del_sv|||
+++delete_eval_scope|||
+++delimcpy||5.004000|n
+++deprecate_commaless_var_list|||
+++despatch_signals||5.007001|
+++destroy_matcher|||
+++die_nocontext|||vn
+++die_sv||5.013001|
+++die_unwind|||
+++die|||v
+++dirp_dup|||
+++div128|||
+++djSP|||
+++do_aexec5|||
+++do_aexec|||
+++do_aspawn|||
+++do_binmode||5.004050|
+++do_chomp|||
+++do_close|||
+++do_delete_local|||
+++do_dump_pad|||
+++do_eof|||
+++do_exec3|||
+++do_execfree|||
+++do_exec|||
+++do_gv_dump||5.006000|
+++do_gvgv_dump||5.006000|
+++do_hv_dump||5.006000|
+++do_ipcctl|||
+++do_ipcget|||
+++do_join|||
+++do_magic_dump||5.006000|
+++do_msgrcv|||
+++do_msgsnd|||
+++do_ncmp|||
+++do_oddball|||
+++do_op_dump||5.006000|
+++do_op_xmldump|||
+++do_open9||5.006000|
+++do_openn||5.007001|
+++do_open||5.004000|
+++do_pmop_dump||5.006000|
+++do_pmop_xmldump|||
+++do_print|||
+++do_readline|||
+++do_seek|||
+++do_semop|||
+++do_shmio|||
+++do_smartmatch|||
+++do_spawn_nowait|||
+++do_spawn|||
+++do_sprintf|||
+++do_sv_dump||5.006000|
+++do_sysseek|||
+++do_tell|||
+++do_trans_complex_utf8|||
+++do_trans_complex|||
+++do_trans_count_utf8|||
+++do_trans_count|||
+++do_trans_simple_utf8|||
+++do_trans_simple|||
+++do_trans|||
+++do_vecget|||
+++do_vecset|||
+++do_vop|||
+++docatch|||
+++doeval|||
+++dofile|||
+++dofindlabel|||
+++doform|||
+++doing_taint||5.008001|n
+++dooneliner|||
+++doopen_pm|||
+++doparseform|||
+++dopoptoeval|||
+++dopoptogiven|||
+++dopoptolabel|||
+++dopoptoloop|||
+++dopoptosub_at|||
+++dopoptowhen|||
+++doref||5.009003|
+++dounwind|||
+++dowantarray|||
+++dump_all_perl|||
+++dump_all||5.006000|
+++dump_eval||5.006000|
+++dump_exec_pos|||
+++dump_fds|||
+++dump_form||5.006000|
+++dump_indent||5.006000|v
+++dump_mstats|||
+++dump_packsubs_perl|||
+++dump_packsubs||5.006000|
+++dump_sub_perl|||
+++dump_sub||5.006000|
+++dump_sv_child|||
+++dump_trie_interim_list|||
+++dump_trie_interim_table|||
+++dump_trie|||
+++dump_vindent||5.006000|
+++dumpuntil|||
+++dup_attrlist|||
+++emulate_cop_io|||
+++eval_pv|5.006000||p
+++eval_sv|5.006000||p
+++exec_failed|||
+++expect_number|||
+++fbm_compile||5.005000|
+++fbm_instr||5.005000|
+++feature_is_enabled|||
+++filter_add|||
+++filter_del|||
+++filter_gets|||
+++filter_read|||
+++finalize_optree|||
+++finalize_op|||
+++find_and_forget_pmops|||
+++find_array_subscript|||
+++find_beginning|||
+++find_byclass|||
+++find_hash_subscript|||
+++find_in_my_stash|||
+++find_lexical_cv|||
+++find_runcv_where|||
+++find_runcv||5.008001|
+++find_rundefsv2|||
+++find_rundefsvoffset||5.009002|
+++find_rundefsv||5.013002|
+++find_script|||
+++find_uninit_var|||
+++first_symbol|||n
+++foldEQ_latin1||5.013008|n
+++foldEQ_locale||5.013002|n
+++foldEQ_utf8_flags||5.013010|
+++foldEQ_utf8||5.013002|
+++foldEQ||5.013002|n
+++fold_constants|||
+++forbid_setid|||
+++force_ident_maybe_lex|||
+++force_ident|||
+++force_list|||
+++force_next|||
+++force_strict_version|||
+++force_version|||
+++force_word|||
+++forget_pmop|||
+++form_nocontext|||vn
+++form_short_octal_warning|||
+++form||5.004000|v
+++fp_dup|||
+++fprintf_nocontext|||vn
+++free_global_struct|||
+++free_tied_hv_pool|||
+++free_tmps|||
+++gen_constant_list|||
+++get_and_check_backslash_N_name|||
+++get_aux_mg|||
+++get_av|5.006000||p
+++get_context||5.006000|n
+++get_cvn_flags|5.009005||p
+++get_cvs|5.011000||p
+++get_cv|5.006000||p
+++get_db_sub|||
+++get_debug_opts|||
+++get_hash_seed|||
+++get_hv|5.006000||p
+++get_invlist_iter_addr|||
+++get_invlist_offset_addr|||
+++get_invlist_previous_index_addr|||
+++get_mstats|||
+++get_no_modify|||
+++get_num|||
+++get_op_descs||5.005000|
+++get_op_names||5.005000|
+++get_opargs|||
+++get_ppaddr||5.006000|
+++get_re_arg|||
+++get_sv|5.006000||p
+++get_vtbl||5.005030|
+++getcwd_sv||5.007002|
+++getenv_len|||
+++glob_2number|||
+++glob_assign_glob|||
+++glob_assign_ref|||
+++gp_dup|||
+++gp_free|||
+++gp_ref|||
+++grok_bin|5.007003||p
+++grok_bslash_N|||
+++grok_bslash_c|||
+++grok_bslash_o|||
+++grok_bslash_x|||
+++grok_hex|5.007003||p
+++grok_number|5.007002||p
+++grok_numeric_radix|5.007002||p
+++grok_oct|5.007003||p
+++group_end|||
+++gv_AVadd|||
+++gv_HVadd|||
+++gv_IOadd|||
+++gv_SVadd|||
+++gv_add_by_type||5.011000|
+++gv_autoload4||5.004000|
+++gv_autoload_pvn||5.015004|
+++gv_autoload_pv||5.015004|
+++gv_autoload_sv||5.015004|
+++gv_check|||
+++gv_const_sv||5.009003|
+++gv_dump||5.006000|
+++gv_efullname3||5.004000|
+++gv_efullname4||5.006001|
+++gv_efullname|||
+++gv_ename|||
+++gv_fetchfile_flags||5.009005|
+++gv_fetchfile|||
+++gv_fetchmeth_autoload||5.007003|
+++gv_fetchmeth_pv_autoload||5.015004|
+++gv_fetchmeth_pvn_autoload||5.015004|
+++gv_fetchmeth_pvn||5.015004|
+++gv_fetchmeth_pv||5.015004|
+++gv_fetchmeth_sv_autoload||5.015004|
+++gv_fetchmeth_sv||5.015004|
+++gv_fetchmethod_autoload||5.004000|
+++gv_fetchmethod_pv_flags||5.015004|
+++gv_fetchmethod_pvn_flags||5.015004|
+++gv_fetchmethod_sv_flags||5.015004|
+++gv_fetchmethod|||
+++gv_fetchmeth|||
+++gv_fetchpvn_flags|5.009002||p
+++gv_fetchpvs|5.009004||p
+++gv_fetchpv|||
+++gv_fetchsv|5.009002||p
+++gv_fullname3||5.004000|
+++gv_fullname4||5.006001|
+++gv_fullname|||
+++gv_handler||5.007001|
+++gv_init_pvn||5.015004|
+++gv_init_pv||5.015004|
+++gv_init_svtype|||
+++gv_init_sv||5.015004|
+++gv_init|||
+++gv_magicalize_isa|||
+++gv_name_set||5.009004|
+++gv_stashpvn|5.004000||p
+++gv_stashpvs|5.009003||p
+++gv_stashpv|||
+++gv_stashsv|||
+++gv_try_downgrade|||
+++handle_regex_sets|||
+++he_dup|||
+++hek_dup|||
+++hfree_next_entry|||
+++hfreeentries|||
+++hsplit|||
+++hv_assert|||
+++hv_auxinit|||
+++hv_backreferences_p|||
+++hv_clear_placeholders||5.009001|
+++hv_clear|||
+++hv_common_key_len||5.010000|
+++hv_common||5.010000|
+++hv_copy_hints_hv||5.009004|
+++hv_delayfree_ent||5.004000|
+++hv_delete_common|||
+++hv_delete_ent||5.004000|
+++hv_delete|||
+++hv_eiter_p||5.009003|
+++hv_eiter_set||5.009003|
+++hv_ename_add|||
+++hv_ename_delete|||
+++hv_exists_ent||5.004000|
+++hv_exists|||
+++hv_fetch_ent||5.004000|
+++hv_fetchs|5.009003||p
+++hv_fetch|||
+++hv_fill||5.013002|
+++hv_free_ent_ret|||
+++hv_free_ent||5.004000|
+++hv_iterinit|||
+++hv_iterkeysv||5.004000|
+++hv_iterkey|||
+++hv_iternext_flags||5.008000|
+++hv_iternextsv|||
+++hv_iternext|||
+++hv_iterval|||
+++hv_kill_backrefs|||
+++hv_ksplit||5.004000|
+++hv_magic_check|||n
+++hv_magic|||
+++hv_name_set||5.009003|
+++hv_notallowed|||
+++hv_placeholders_get||5.009003|
+++hv_placeholders_p|||
+++hv_placeholders_set||5.009003|
+++hv_rand_set||5.017011|
+++hv_riter_p||5.009003|
+++hv_riter_set||5.009003|
+++hv_scalar||5.009001|
+++hv_store_ent||5.004000|
+++hv_store_flags||5.008000|
+++hv_stores|5.009004||p
+++hv_store|||
+++hv_undef_flags|||
+++hv_undef|||
+++ibcmp_locale||5.004000|
+++ibcmp_utf8||5.007003|
+++ibcmp|||
+++incline|||
+++incpush_if_exists|||
+++incpush_use_sep|||
+++incpush|||
+++ingroup|||
+++init_argv_symbols|||
+++init_constants|||
+++init_dbargs|||
+++init_debugger|||
+++init_global_struct|||
+++init_i18nl10n||5.006000|
+++init_i18nl14n||5.006000|
+++init_ids|||
+++init_interp|||
+++init_main_stash|||
+++init_perllib|||
+++init_postdump_symbols|||
+++init_predump_symbols|||
+++init_stacks||5.005000|
+++init_tm||5.007002|
+++inplace_aassign|||
+++instr|||n
+++intro_my|||
+++intuit_method|||
+++intuit_more|||
+++invert|||
+++invlist_array|||
+++invlist_clone|||
+++invlist_extend|||
+++invlist_highest|||
+++invlist_is_iterating|||
+++invlist_iterfinish|||
+++invlist_iterinit|||
+++invlist_iternext|||
+++invlist_max|||
+++invlist_previous_index|||
+++invlist_set_len|||
+++invlist_set_previous_index|||
+++invlist_trim|||
+++invoke_exception_hook|||
+++io_close|||
+++isALNUMC|5.006000||p
+++isALNUM_lazy|||
+++isALPHANUMERIC||5.017008|
+++isALPHA|||
+++isASCII|5.006000|5.006000|p
+++isBLANK|5.006001||p
+++isCNTRL|5.006000|5.006000|p
+++isDIGIT|||
+++isFOO_lc|||
+++isFOO_utf8_lc|||
+++isGRAPH|5.006000||p
+++isGV_with_GP|5.009004||p
+++isIDCONT||5.017008|
+++isIDFIRST_lazy|||
+++isIDFIRST|||
+++isLOWER|||
+++isOCTAL||5.013005|
+++isPRINT|5.004000||p
+++isPSXSPC|5.006001||p
+++isPUNCT|5.006000||p
+++isSPACE|||
+++isUPPER|||
+++isWORDCHAR||5.013006|
+++isXDIGIT|5.006000||p
+++is_an_int|||
+++is_ascii_string||5.011000|n
+++is_cur_LC_category_utf8|||
+++is_handle_constructor|||n
+++is_list_assignment|||
+++is_lvalue_sub||5.007001|
+++is_uni_alnum_lc||5.006000|
+++is_uni_alnumc_lc||5.017007|
+++is_uni_alnumc||5.017007|
+++is_uni_alnum||5.006000|
+++is_uni_alpha_lc||5.006000|
+++is_uni_alpha||5.006000|
+++is_uni_ascii_lc||5.006000|
+++is_uni_ascii||5.006000|
+++is_uni_blank_lc||5.017002|
+++is_uni_blank||5.017002|
+++is_uni_cntrl_lc||5.006000|
+++is_uni_cntrl||5.006000|
+++is_uni_digit_lc||5.006000|
+++is_uni_digit||5.006000|
+++is_uni_graph_lc||5.006000|
+++is_uni_graph||5.006000|
+++is_uni_idfirst_lc||5.006000|
+++is_uni_idfirst||5.006000|
+++is_uni_lower_lc||5.006000|
+++is_uni_lower||5.006000|
+++is_uni_print_lc||5.006000|
+++is_uni_print||5.006000|
+++is_uni_punct_lc||5.006000|
+++is_uni_punct||5.006000|
+++is_uni_space_lc||5.006000|
+++is_uni_space||5.006000|
+++is_uni_upper_lc||5.006000|
+++is_uni_upper||5.006000|
+++is_uni_xdigit_lc||5.006000|
+++is_uni_xdigit||5.006000|
+++is_utf8_alnumc||5.017007|
+++is_utf8_alnum||5.006000|
+++is_utf8_alpha||5.006000|
+++is_utf8_ascii||5.006000|
+++is_utf8_blank||5.017002|
+++is_utf8_char_buf||5.015008|n
+++is_utf8_char_slow|||n
+++is_utf8_char||5.006000|n
+++is_utf8_cntrl||5.006000|
+++is_utf8_common|||
+++is_utf8_digit||5.006000|
+++is_utf8_graph||5.006000|
+++is_utf8_idcont||5.008000|
+++is_utf8_idfirst||5.006000|
+++is_utf8_lower||5.006000|
+++is_utf8_mark||5.006000|
+++is_utf8_perl_space||5.011001|
+++is_utf8_perl_word||5.011001|
+++is_utf8_posix_digit||5.011001|
+++is_utf8_print||5.006000|
+++is_utf8_punct||5.006000|
+++is_utf8_space||5.006000|
+++is_utf8_string_loclen||5.009003|n
+++is_utf8_string_loc||5.008001|n
+++is_utf8_string||5.006001|n
+++is_utf8_upper||5.006000|
+++is_utf8_xdigit||5.006000|
+++is_utf8_xidcont||5.013010|
+++is_utf8_xidfirst||5.013010|
+++isa_lookup|||
+++items|||n
+++ix|||n
+++jmaybe|||
+++join_exact|||
+++keyword_plugin_standard|||
+++keyword|||
+++leave_scope|||
+++lex_bufutf8||5.011002|
+++lex_discard_to||5.011002|
+++lex_grow_linestr||5.011002|
+++lex_next_chunk||5.011002|
+++lex_peek_unichar||5.011002|
+++lex_read_space||5.011002|
+++lex_read_to||5.011002|
+++lex_read_unichar||5.011002|
+++lex_start||5.009005|
+++lex_stuff_pvn||5.011002|
+++lex_stuff_pvs||5.013005|
+++lex_stuff_pv||5.013006|
+++lex_stuff_sv||5.011002|
+++lex_unstuff||5.011002|
+++listkids|||
+++list|||
+++load_module_nocontext|||vn
+++load_module|5.006000||pv
+++localize|||
+++looks_like_bool|||
+++looks_like_number|||
+++lop|||
+++mPUSHi|5.009002||p
+++mPUSHn|5.009002||p
+++mPUSHp|5.009002||p
+++mPUSHs|5.010001||p
+++mPUSHu|5.009002||p
+++mXPUSHi|5.009002||p
+++mXPUSHn|5.009002||p
+++mXPUSHp|5.009002||p
+++mXPUSHs|5.010001||p
+++mXPUSHu|5.009002||p
+++mad_free|||
+++madlex|||
+++madparse|||
+++magic_clear_all_env|||
+++magic_cleararylen_p|||
+++magic_clearenv|||
+++magic_clearhints|||
+++magic_clearhint|||
+++magic_clearisa|||
+++magic_clearpack|||
+++magic_clearsig|||
+++magic_copycallchecker|||
+++magic_dump||5.006000|
+++magic_existspack|||
+++magic_freearylen_p|||
+++magic_freeovrld|||
+++magic_getarylen|||
+++magic_getdefelem|||
+++magic_getnkeys|||
+++magic_getpack|||
+++magic_getpos|||
+++magic_getsig|||
+++magic_getsubstr|||
+++magic_gettaint|||
+++magic_getuvar|||
+++magic_getvec|||
+++magic_get|||
+++magic_killbackrefs|||
+++magic_methcall1|||
+++magic_methcall|||v
+++magic_methpack|||
+++magic_nextpack|||
+++magic_regdata_cnt|||
+++magic_regdatum_get|||
+++magic_regdatum_set|||
+++magic_scalarpack|||
+++magic_set_all_env|||
+++magic_setarylen|||
+++magic_setcollxfrm|||
+++magic_setdbline|||
+++magic_setdefelem|||
+++magic_setenv|||
+++magic_sethint|||
+++magic_setisa|||
+++magic_setmglob|||
+++magic_setnkeys|||
+++magic_setpack|||
+++magic_setpos|||
+++magic_setregexp|||
+++magic_setsig|||
+++magic_setsubstr|||
+++magic_settaint|||
+++magic_setutf8|||
+++magic_setuvar|||
+++magic_setvec|||
+++magic_set|||
+++magic_sizepack|||
+++magic_wipepack|||
+++make_matcher|||
+++make_trie_failtable|||
+++make_trie|||
+++malloc_good_size|||n
+++malloced_size|||n
+++malloc||5.007002|n
+++markstack_grow|||
+++matcher_matches_sv|||
+++mayberelocate|||
+++measure_struct|||
+++memEQs|5.009005||p
+++memEQ|5.004000||p
+++memNEs|5.009005||p
+++memNE|5.004000||p
+++mem_collxfrm|||
+++mem_log_common|||n
+++mess_alloc|||
+++mess_nocontext|||vn
+++mess_sv||5.013001|
+++mess||5.006000|v
+++method_common|||
+++mfree||5.007002|n
+++mg_clear|||
+++mg_copy|||
+++mg_dup|||
+++mg_find_mglob|||
+++mg_findext||5.013008|
+++mg_find|||
+++mg_free_type||5.013006|
+++mg_free|||
+++mg_get|||
+++mg_length||5.005000|
+++mg_localize|||
+++mg_magical|||
+++mg_set|||
+++mg_size||5.005000|
+++mini_mktime||5.007002|
+++minus_v|||
+++missingterm|||
+++mode_from_discipline|||
+++modkids|||
+++more_bodies|||
+++more_sv|||
+++moreswitches|||
+++mro_clean_isarev|||
+++mro_gather_and_rename|||
+++mro_get_from_name||5.010001|
+++mro_get_linear_isa_dfs|||
+++mro_get_linear_isa||5.009005|
+++mro_get_private_data||5.010001|
+++mro_isa_changed_in|||
+++mro_meta_dup|||
+++mro_meta_init|||
+++mro_method_changed_in||5.009005|
+++mro_package_moved|||
+++mro_register||5.010001|
+++mro_set_mro||5.010001|
+++mro_set_private_data||5.010001|
+++mul128|||
+++mulexp10|||n
+++my_atof2||5.007002|
+++my_atof||5.006000|
+++my_attrs|||
+++my_bcopy|||n
+++my_bzero|||n
+++my_chsize|||
+++my_clearenv|||
+++my_cxt_index|||
+++my_cxt_init|||
+++my_dirfd||5.009005|
+++my_exit_jump|||
+++my_exit|||
+++my_failure_exit||5.004000|
+++my_fflush_all||5.006000|
+++my_fork||5.007003|n
+++my_kid|||
+++my_lstat_flags|||
+++my_lstat||5.019003|
+++my_memcmp|||n
+++my_memset||5.004000|n
+++my_pclose||5.004000|
+++my_popen_list||5.007001|
+++my_popen||5.004000|
+++my_setenv|||
+++my_snprintf|5.009004||pvn
+++my_socketpair||5.007003|n
+++my_sprintf|5.009003||pvn
+++my_stat_flags|||
+++my_stat||5.019003|
+++my_strftime||5.007002|
+++my_strlcat|5.009004||pn
+++my_strlcpy|5.009004||pn
+++my_unexec|||
+++my_vsnprintf||5.009004|n
+++need_utf8|||n
+++newANONATTRSUB||5.006000|
+++newANONHASH|||
+++newANONLIST|||
+++newANONSUB|||
+++newASSIGNOP|||
+++newATTRSUB_flags|||
+++newATTRSUB||5.006000|
+++newAVREF|||
+++newAV|||
+++newBINOP|||
+++newCONDOP|||
+++newCONSTSUB_flags||5.015006|
+++newCONSTSUB|5.004050||p
+++newCVREF|||
+++newDEFSVOP|||
+++newFORM|||
+++newFOROP||5.013007|
+++newGIVENOP||5.009003|
+++newGIVWHENOP|||
+++newGP|||
+++newGVOP|||
+++newGVREF|||
+++newGVgen_flags||5.015004|
+++newGVgen|||
+++newHVREF|||
+++newHVhv||5.005000|
+++newHV|||
+++newIO|||
+++newLISTOP|||
+++newLOGOP|||
+++newLOOPEX|||
+++newLOOPOP|||
+++newMADPROP|||
+++newMADsv|||
+++newMYSUB||5.017004|
+++newNULLLIST|||
+++newOP|||
+++newPADOP|||
+++newPMOP|||
+++newPROG|||
+++newPVOP|||
+++newRANGE|||
+++newRV_inc|5.004000||p
+++newRV_noinc|5.004000||p
+++newRV|||
+++newSLICEOP|||
+++newSTATEOP|||
+++newSTUB|||
+++newSUB|||
+++newSVOP|||
+++newSVREF|||
+++newSV_type|5.009005||p
+++newSVhek||5.009003|
+++newSViv|||
+++newSVnv|||
+++newSVpadname||5.017004|
+++newSVpv_share||5.013006|
+++newSVpvf_nocontext|||vn
+++newSVpvf||5.004000|v
+++newSVpvn_flags|5.010001||p
+++newSVpvn_share|5.007001||p
+++newSVpvn_utf8|5.010001||p
+++newSVpvn|5.004050||p
+++newSVpvs_flags|5.010001||p
+++newSVpvs_share|5.009003||p
+++newSVpvs|5.009003||p
+++newSVpv|||
+++newSVrv|||
+++newSVsv|||
+++newSVuv|5.006000||p
+++newSV|||
+++newTOKEN|||
+++newUNOP|||
+++newWHENOP||5.009003|
+++newWHILEOP||5.013007|
+++newXS_flags||5.009004|
+++newXS_len_flags|||
+++newXSproto||5.006000|
+++newXS||5.006000|
+++new_collate||5.006000|
+++new_constant|||
+++new_ctype||5.006000|
+++new_he|||
+++new_logop|||
+++new_numeric||5.006000|
+++new_stackinfo||5.005000|
+++new_version||5.009000|
+++new_warnings_bitfield|||
+++next_symbol|||
+++nextargv|||
+++nextchar|||
+++ninstr|||n
+++no_bareword_allowed|||
+++no_fh_allowed|||
+++no_op|||
+++not_a_number|||
+++not_incrementable|||
+++nothreadhook||5.008000|
+++nuke_stacks|||
+++num_overflow|||n
+++oopsAV|||
+++oopsHV|||
+++op_append_elem||5.013006|
+++op_append_list||5.013006|
+++op_clear|||
+++op_const_sv|||
+++op_contextualize||5.013006|
+++op_dump||5.006000|
+++op_free|||
+++op_getmad_weak|||
+++op_getmad|||
+++op_integerize|||
+++op_linklist||5.013006|
+++op_lvalue_flags|||
+++op_lvalue||5.013007|
+++op_null||5.007002|
+++op_prepend_elem||5.013006|
+++op_refcnt_dec|||
+++op_refcnt_inc|||
+++op_refcnt_lock||5.009002|
+++op_refcnt_unlock||5.009002|
+++op_scope||5.013007|
+++op_std_init|||
+++op_unscope|||
+++op_xmldump|||
+++open_script|||
+++opslab_force_free|||
+++opslab_free_nopad|||
+++opslab_free|||
+++pMY_CXT_|5.007003||p
+++pMY_CXT|5.007003||p
+++pTHX_|5.006000||p
+++pTHX|5.006000||p
+++packWARN|5.007003||p
+++pack_cat||5.007003|
+++pack_rec|||
+++package_version|||
+++package|||
+++packlist||5.008001|
+++pad_add_anon||5.008001|
+++pad_add_name_pvn||5.015001|
+++pad_add_name_pvs||5.015001|
+++pad_add_name_pv||5.015001|
+++pad_add_name_sv||5.015001|
+++pad_alloc_name|||
+++pad_alloc|||
+++pad_block_start|||
+++pad_check_dup|||
+++pad_compname_type||5.009003|
+++pad_findlex|||
+++pad_findmy_pvn||5.015001|
+++pad_findmy_pvs||5.015001|
+++pad_findmy_pv||5.015001|
+++pad_findmy_sv||5.015001|
+++pad_fixup_inner_anons|||
+++pad_free|||
+++pad_leavemy|||
+++pad_new||5.008001|
+++pad_peg|||n
+++pad_push|||
+++pad_reset|||
+++pad_setsv|||
+++pad_sv|||
+++pad_swipe|||
+++pad_tidy||5.008001|
+++padlist_dup|||
+++padlist_store|||
+++parse_arithexpr||5.013008|
+++parse_barestmt||5.013007|
+++parse_block||5.013007|
+++parse_body|||
+++parse_fullexpr||5.013008|
+++parse_fullstmt||5.013005|
+++parse_ident|||
+++parse_label||5.013007|
+++parse_listexpr||5.013008|
+++parse_lparen_question_flags|||
+++parse_stmtseq||5.013006|
+++parse_termexpr||5.013008|
+++parse_unicode_opts|||
+++parser_dup|||
+++parser_free_nexttoke_ops|||
+++parser_free|||
+++path_is_searchable|||n
+++peep|||
+++pending_ident|||
+++perl_alloc_using|||n
+++perl_alloc|||n
+++perl_clone_using|||n
+++perl_clone|||n
+++perl_construct|||n
+++perl_destruct||5.007003|n
+++perl_free|||n
+++perl_parse||5.006000|n
+++perl_run|||n
+++pidgone|||
+++pm_description|||
+++pmop_dump||5.006000|
+++pmop_xmldump|||
+++pmruntime|||
+++pmtrans|||
+++pop_scope|||
+++populate_isa|||v
+++pregcomp||5.009005|
+++pregexec|||
+++pregfree2||5.011000|
+++pregfree|||
+++prepend_madprops|||
+++prescan_version||5.011004|
+++printbuf|||
+++printf_nocontext|||vn
+++process_special_blocks|||
+++ptr_hash|||n
+++ptr_table_clear||5.009005|
+++ptr_table_fetch||5.009005|
+++ptr_table_find|||n
+++ptr_table_free||5.009005|
+++ptr_table_new||5.009005|
+++ptr_table_split||5.009005|
+++ptr_table_store||5.009005|
+++push_scope|||
+++put_byte|||
+++put_latin1_charclass_innards|||
+++pv_display|5.006000||p
+++pv_escape|5.009004||p
+++pv_pretty|5.009004||p
+++pv_uni_display||5.007003|
+++qerror|||
+++qsortsvu|||
+++re_compile||5.009005|
+++re_croak2|||
+++re_dup_guts|||
+++re_intuit_start||5.019001|
+++re_intuit_string||5.006000|
+++re_op_compile|||
+++readpipe_override|||
+++realloc||5.007002|n
+++reentrant_free||5.019003|
+++reentrant_init||5.019003|
+++reentrant_retry||5.019003|vn
+++reentrant_size||5.019003|
+++ref_array_or_hash|||
+++refcounted_he_chain_2hv|||
+++refcounted_he_fetch_pvn|||
+++refcounted_he_fetch_pvs|||
+++refcounted_he_fetch_pv|||
+++refcounted_he_fetch_sv|||
+++refcounted_he_free|||
+++refcounted_he_inc|||
+++refcounted_he_new_pvn|||
+++refcounted_he_new_pvs|||
+++refcounted_he_new_pv|||
+++refcounted_he_new_sv|||
+++refcounted_he_value|||
+++refkids|||
+++refto|||
+++ref||5.019003|
+++reg_check_named_buff_matched|||
+++reg_named_buff_all||5.009005|
+++reg_named_buff_exists||5.009005|
+++reg_named_buff_fetch||5.009005|
+++reg_named_buff_firstkey||5.009005|
+++reg_named_buff_iter|||
+++reg_named_buff_nextkey||5.009005|
+++reg_named_buff_scalar||5.009005|
+++reg_named_buff|||
+++reg_node|||
+++reg_numbered_buff_fetch|||
+++reg_numbered_buff_length|||
+++reg_numbered_buff_store|||
+++reg_qr_package|||
+++reg_recode|||
+++reg_scan_name|||
+++reg_skipcomment|||
+++reg_temp_copy|||
+++reganode|||
+++regatom|||
+++regbranch|||
+++regclass_swash||5.009004|
+++regclass|||
+++regcppop|||
+++regcppush|||
+++regcurly|||
+++regdump_extflags|||
+++regdump_intflags|||
+++regdump||5.005000|
+++regdupe_internal|||
+++regexec_flags||5.005000|
+++regfree_internal||5.009005|
+++reghop3|||n
+++reghop4|||n
+++reghopmaybe3|||n
+++reginclass|||
+++reginitcolors||5.006000|
+++reginsert|||
+++regmatch|||
+++regnext||5.005000|
+++regpatws|||n
+++regpiece|||
+++regpposixcc|||
+++regprop|||
+++regrepeat|||
+++regtail_study|||
+++regtail|||
+++regtry|||
+++reguni|||
+++regwhite|||n
+++reg|||
+++repeatcpy|||n
+++report_evil_fh|||
+++report_redefined_cv|||
+++report_uninit|||
+++report_wrongway_fh|||
+++require_pv||5.006000|
+++require_tie_mod|||
+++restore_magic|||
+++rninstr|||n
+++rpeep|||
+++rsignal_restore|||
+++rsignal_save|||
+++rsignal_state||5.004000|
+++rsignal||5.004000|
+++run_body|||
+++run_user_filter|||
+++runops_debug||5.005000|
+++runops_standard||5.005000|
+++rv2cv_op_cv||5.013006|
+++rvpv_dup|||
+++rxres_free|||
+++rxres_restore|||
+++rxres_save|||
+++safesyscalloc||5.006000|n
+++safesysfree||5.006000|n
+++safesysmalloc||5.006000|n
+++safesysrealloc||5.006000|n
+++same_dirent|||
+++save_I16||5.004000|
+++save_I32|||
+++save_I8||5.006000|
+++save_adelete||5.011000|
+++save_aelem_flags||5.011000|
+++save_aelem||5.004050|
+++save_alloc||5.006000|
+++save_aptr|||
+++save_ary|||
+++save_bool||5.008001|
+++save_clearsv|||
+++save_delete|||
+++save_destructor_x||5.006000|
+++save_destructor||5.006000|
+++save_freeop|||
+++save_freepv|||
+++save_freesv|||
+++save_generic_pvref||5.006001|
+++save_generic_svref||5.005030|
+++save_gp||5.004000|
+++save_hash|||
+++save_hdelete||5.011000|
+++save_hek_flags|||n
+++save_helem_flags||5.011000|
+++save_helem||5.004050|
+++save_hints||5.010001|
+++save_hptr|||
+++save_int|||
+++save_item|||
+++save_iv||5.005000|
+++save_lines|||
+++save_list|||
+++save_long|||
+++save_magic_flags|||
+++save_mortalizesv||5.007001|
+++save_nogv|||
+++save_op||5.005000|
+++save_padsv_and_mortalize||5.010001|
+++save_pptr|||
+++save_pushi32ptr||5.010001|
+++save_pushptri32ptr|||
+++save_pushptrptr||5.010001|
+++save_pushptr||5.010001|
+++save_re_context||5.006000|
+++save_scalar_at|||
+++save_scalar|||
+++save_set_svflags||5.009000|
+++save_shared_pvref||5.007003|
+++save_sptr|||
+++save_svref|||
+++save_vptr||5.006000|
+++savepvn|||
+++savepvs||5.009003|
+++savepv|||
+++savesharedpvn||5.009005|
+++savesharedpvs||5.013006|
+++savesharedpv||5.007003|
+++savesharedsvpv||5.013006|
+++savestack_grow_cnt||5.008001|
+++savestack_grow|||
+++savesvpv||5.009002|
+++sawparens|||
+++scalar_mod_type|||n
+++scalarboolean|||
+++scalarkids|||
+++scalarseq|||
+++scalarvoid|||
+++scalar|||
+++scan_bin||5.006000|
+++scan_commit|||
+++scan_const|||
+++scan_formline|||
+++scan_heredoc|||
+++scan_hex|||
+++scan_ident|||
+++scan_inputsymbol|||
+++scan_num||5.007001|
+++scan_oct|||
+++scan_pat|||
+++scan_str|||
+++scan_subst|||
+++scan_trans|||
+++scan_version||5.009001|
+++scan_vstring||5.009005|
+++scan_word|||
+++screaminstr||5.005000|
+++search_const|||
+++seed||5.008001|
+++sequence_num|||
+++set_context||5.006000|n
+++set_numeric_local||5.006000|
+++set_numeric_radix||5.006000|
+++set_numeric_standard||5.006000|
+++setdefout|||
+++share_hek_flags|||
+++share_hek||5.004000|
+++si_dup|||
+++sighandler|||n
+++simplify_sort|||
+++skipspace0|||
+++skipspace1|||
+++skipspace2|||
+++skipspace_flags|||
+++softref2xv|||
+++sortcv_stacked|||
+++sortcv_xsub|||
+++sortcv|||
+++sortsv_flags||5.009003|
+++sortsv||5.007003|
+++space_join_names_mortal|||
+++ss_dup|||
+++stack_grow|||
+++start_force|||
+++start_glob|||
+++start_subparse||5.004000|
+++stdize_locale|||
+++strEQ|||
+++strGE|||
+++strGT|||
+++strLE|||
+++strLT|||
+++strNE|||
+++str_to_version||5.006000|
+++strip_return|||
+++strnEQ|||
+++strnNE|||
+++study_chunk|||
+++sub_crush_depth|||
+++sublex_done|||
+++sublex_push|||
+++sublex_start|||
+++sv_2bool_flags||5.013006|
+++sv_2bool|||
+++sv_2cv|||
+++sv_2io|||
+++sv_2iuv_common|||
+++sv_2iuv_non_preserve|||
+++sv_2iv_flags||5.009001|
+++sv_2iv|||
+++sv_2mortal|||
+++sv_2num|||
+++sv_2nv_flags||5.013001|
+++sv_2pv_flags|5.007002||p
+++sv_2pv_nolen|5.006000||p
+++sv_2pvbyte_nolen|5.006000||p
+++sv_2pvbyte|5.006000||p
+++sv_2pvutf8_nolen||5.006000|
+++sv_2pvutf8||5.006000|
+++sv_2pv|||
+++sv_2uv_flags||5.009001|
+++sv_2uv|5.004000||p
+++sv_add_arena|||
+++sv_add_backref|||
+++sv_backoff|||
+++sv_bless|||
+++sv_cat_decode||5.008001|
+++sv_catpv_flags||5.013006|
+++sv_catpv_mg|5.004050||p
+++sv_catpv_nomg||5.013006|
+++sv_catpvf_mg_nocontext|||pvn
+++sv_catpvf_mg|5.006000|5.004000|pv
+++sv_catpvf_nocontext|||vn
+++sv_catpvf||5.004000|v
+++sv_catpvn_flags||5.007002|
+++sv_catpvn_mg|5.004050||p
+++sv_catpvn_nomg|5.007002||p
+++sv_catpvn|||
+++sv_catpvs_flags||5.013006|
+++sv_catpvs_mg||5.013006|
+++sv_catpvs_nomg||5.013006|
+++sv_catpvs|5.009003||p
+++sv_catpv|||
+++sv_catsv_flags||5.007002|
+++sv_catsv_mg|5.004050||p
+++sv_catsv_nomg|5.007002||p
+++sv_catsv|||
+++sv_catxmlpvn|||
+++sv_catxmlpv|||
+++sv_catxmlsv|||
+++sv_chop|||
+++sv_clean_all|||
+++sv_clean_objs|||
+++sv_clear|||
+++sv_cmp_flags||5.013006|
+++sv_cmp_locale_flags||5.013006|
+++sv_cmp_locale||5.004000|
+++sv_cmp|||
+++sv_collxfrm_flags||5.013006|
+++sv_collxfrm|||
+++sv_copypv_flags||5.017002|
+++sv_copypv_nomg||5.017002|
+++sv_copypv|||
+++sv_dec_nomg||5.013002|
+++sv_dec|||
+++sv_del_backref|||
+++sv_derived_from_pvn||5.015004|
+++sv_derived_from_pv||5.015004|
+++sv_derived_from_sv||5.015004|
+++sv_derived_from||5.004000|
+++sv_destroyable||5.010000|
+++sv_display|||
+++sv_does_pvn||5.015004|
+++sv_does_pv||5.015004|
+++sv_does_sv||5.015004|
+++sv_does||5.009004|
+++sv_dump|||
+++sv_dup_common|||
+++sv_dup_inc_multiple|||
+++sv_dup_inc|||
+++sv_dup|||
+++sv_eq_flags||5.013006|
+++sv_eq|||
+++sv_exp_grow|||
+++sv_force_normal_flags||5.007001|
+++sv_force_normal||5.006000|
+++sv_free2|||
+++sv_free_arenas|||
+++sv_free|||
+++sv_gets||5.004000|
+++sv_grow|||
+++sv_i_ncmp|||
+++sv_inc_nomg||5.013002|
+++sv_inc|||
+++sv_insert_flags||5.010001|
+++sv_insert|||
+++sv_isa|||
+++sv_isobject|||
+++sv_iv||5.005000|
+++sv_kill_backrefs|||
+++sv_len_utf8_nomg|||
+++sv_len_utf8||5.006000|
+++sv_len|||
+++sv_magic_portable|5.019003|5.004000|p
+++sv_magicext_mglob|||
+++sv_magicext||5.007003|
+++sv_magic|||
+++sv_mortalcopy_flags|||
+++sv_mortalcopy|||
+++sv_ncmp|||
+++sv_newmortal|||
+++sv_newref|||
+++sv_nolocking||5.007003|
+++sv_nosharing||5.007003|
+++sv_nounlocking|||
+++sv_nv||5.005000|
+++sv_peek||5.005000|
+++sv_pos_b2u_flags||5.019003|
+++sv_pos_b2u_midway|||
+++sv_pos_b2u||5.006000|
+++sv_pos_u2b_cached|||
+++sv_pos_u2b_flags||5.011005|
+++sv_pos_u2b_forwards|||n
+++sv_pos_u2b_midway|||n
+++sv_pos_u2b||5.006000|
+++sv_pvbyten_force||5.006000|
+++sv_pvbyten||5.006000|
+++sv_pvbyte||5.006000|
+++sv_pvn_force_flags|5.007002||p
+++sv_pvn_force|||
+++sv_pvn_nomg|5.007003|5.005000|p
+++sv_pvn||5.005000|
+++sv_pvutf8n_force||5.006000|
+++sv_pvutf8n||5.006000|
+++sv_pvutf8||5.006000|
+++sv_pv||5.006000|
+++sv_recode_to_utf8||5.007003|
+++sv_reftype|||
+++sv_ref|||
+++sv_release_COW|||
+++sv_replace|||
+++sv_report_used|||
+++sv_resetpvn|||
+++sv_reset|||
+++sv_rvweaken||5.006000|
+++sv_sethek|||
+++sv_setiv_mg|5.004050||p
+++sv_setiv|||
+++sv_setnv_mg|5.006000||p
+++sv_setnv|||
+++sv_setpv_mg|5.004050||p
+++sv_setpvf_mg_nocontext|||pvn
+++sv_setpvf_mg|5.006000|5.004000|pv
+++sv_setpvf_nocontext|||vn
+++sv_setpvf||5.004000|v
+++sv_setpviv_mg||5.008001|
+++sv_setpviv||5.008001|
+++sv_setpvn_mg|5.004050||p
+++sv_setpvn|||
+++sv_setpvs_mg||5.013006|
+++sv_setpvs|5.009004||p
+++sv_setpv|||
+++sv_setref_iv|||
+++sv_setref_nv|||
+++sv_setref_pvn|||
+++sv_setref_pvs||5.019003|
+++sv_setref_pv|||
+++sv_setref_uv||5.007001|
+++sv_setsv_cow|||
+++sv_setsv_flags||5.007002|
+++sv_setsv_mg|5.004050||p
+++sv_setsv_nomg|5.007002||p
+++sv_setsv|||
+++sv_setuv_mg|5.004050||p
+++sv_setuv|5.004000||p
+++sv_tainted||5.004000|
+++sv_taint||5.004000|
+++sv_true||5.005000|
+++sv_unglob|||
+++sv_uni_display||5.007003|
+++sv_unmagicext||5.013008|
+++sv_unmagic|||
+++sv_unref_flags||5.007001|
+++sv_unref|||
+++sv_untaint||5.004000|
+++sv_upgrade|||
+++sv_usepvn_flags||5.009004|
+++sv_usepvn_mg|5.004050||p
+++sv_usepvn|||
+++sv_utf8_decode||5.006000|
+++sv_utf8_downgrade||5.006000|
+++sv_utf8_encode||5.006000|
+++sv_utf8_upgrade_flags_grow||5.011000|
+++sv_utf8_upgrade_flags||5.007002|
+++sv_utf8_upgrade_nomg||5.007002|
+++sv_utf8_upgrade||5.007001|
+++sv_uv|5.005000||p
+++sv_vcatpvf_mg|5.006000|5.004000|p
+++sv_vcatpvfn_flags||5.017002|
+++sv_vcatpvfn||5.004000|
+++sv_vcatpvf|5.006000|5.004000|p
+++sv_vsetpvf_mg|5.006000|5.004000|p
+++sv_vsetpvfn||5.004000|
+++sv_vsetpvf|5.006000|5.004000|p
+++sv_xmlpeek|||
+++svtype|||
+++swallow_bom|||
+++swash_fetch||5.007002|
+++swash_init||5.006000|
+++swatch_get|||
+++sys_init3||5.010000|n
+++sys_init||5.010000|n
+++sys_intern_clear|||
+++sys_intern_dup|||
+++sys_intern_init|||
+++sys_term||5.010000|n
+++taint_env|||
+++taint_proper|||
+++tied_method|||v
+++tmps_grow||5.006000|
+++toFOLD_uni||5.007003|
+++toFOLD_utf8||5.019001|
+++toFOLD||5.019001|
+++toLOWER_L1||5.019001|
+++toLOWER_LC||5.004000|
+++toLOWER_uni||5.007003|
+++toLOWER_utf8||5.015007|
+++toLOWER|||
+++toTITLE_uni||5.007003|
+++toTITLE_utf8||5.015007|
+++toTITLE||5.019001|
+++toUPPER_uni||5.007003|
+++toUPPER_utf8||5.015007|
+++toUPPER||5.004000|
+++to_byte_substr|||
+++to_lower_latin1|||
+++to_uni_fold||5.007003|
+++to_uni_lower_lc||5.006000|
+++to_uni_lower||5.007003|
+++to_uni_title_lc||5.006000|
+++to_uni_title||5.007003|
+++to_uni_upper_lc||5.006000|
+++to_uni_upper||5.007003|
+++to_utf8_case||5.007003|
+++to_utf8_fold||5.015007|
+++to_utf8_lower||5.015007|
+++to_utf8_substr|||
+++to_utf8_title||5.015007|
+++to_utf8_upper||5.015007|
+++token_free|||
+++token_getmad|||
+++tokenize_use|||
+++tokeq|||
+++tokereport|||
+++too_few_arguments_pv|||
+++too_few_arguments_sv|||
+++too_many_arguments_pv|||
+++too_many_arguments_sv|||
+++translate_substr_offsets|||
+++try_amagic_bin|||
+++try_amagic_un|||
+++uiv_2buf|||n
+++unlnk|||
+++unpack_rec|||
+++unpack_str||5.007003|
+++unpackstring||5.008001|
+++unreferenced_to_tmp_stack|||
+++unshare_hek_or_pvn|||
+++unshare_hek|||
+++unsharepvn||5.004000|
+++unwind_handler_stack|||
+++update_debugger_info|||
+++upg_version||5.009005|
+++usage|||
+++utf16_textfilter|||
+++utf16_to_utf8_reversed||5.006001|
+++utf16_to_utf8||5.006001|
+++utf8_distance||5.006000|
+++utf8_hop||5.006000|
+++utf8_length||5.007001|
+++utf8_mg_len_cache_update|||
+++utf8_mg_pos_cache_update|||
+++utf8_to_bytes||5.006001|
+++utf8_to_uvchr_buf||5.015009|
+++utf8_to_uvchr||5.007001|
+++utf8_to_uvuni_buf||5.015009|
+++utf8_to_uvuni||5.007001|
+++utf8n_to_uvchr|||
+++utf8n_to_uvuni||5.007001|
+++utilize|||
+++uvchr_to_utf8_flags||5.007003|
+++uvchr_to_utf8|||
+++uvuni_to_utf8_flags||5.007003|
+++uvuni_to_utf8||5.007001|
+++valid_utf8_to_uvchr|||
+++valid_utf8_to_uvuni||5.015009|
+++validate_proto|||
+++validate_suid|||
+++varname|||
+++vcmp||5.009000|
+++vcroak||5.006000|
+++vdeb||5.007003|
+++vform||5.006000|
+++visit|||
+++vivify_defelem|||
+++vivify_ref|||
+++vload_module|5.006000||p
+++vmess||5.006000|
+++vnewSVpvf|5.006000|5.004000|p
+++vnormal||5.009002|
+++vnumify||5.009000|
+++vstringify||5.009000|
+++vverify||5.009003|
+++vwarner||5.006000|
+++vwarn||5.006000|
+++wait4pid|||
+++warn_nocontext|||vn
+++warn_sv||5.013001|
+++warner_nocontext|||vn
+++warner|5.006000|5.004000|pv
+++warn|||v
+++was_lvalue_sub|||
+++watch|||
+++whichsig_pvn||5.015004|
+++whichsig_pv||5.015004|
+++whichsig_sv||5.015004|
+++whichsig|||
+++win32_croak_not_implemented|||n
+++with_queued_errors|||
+++wrap_op_checker||5.015008|
+++write_to_stderr|||
+++xmldump_all_perl|||
+++xmldump_all|||
+++xmldump_attr|||
+++xmldump_eval|||
+++xmldump_form|||
+++xmldump_indent|||v
+++xmldump_packsubs_perl|||
+++xmldump_packsubs|||
+++xmldump_sub_perl|||
+++xmldump_sub|||
+++xmldump_vindent|||
+++xs_apiversion_bootcheck|||
+++xs_version_bootcheck|||
+++yyerror_pvn|||
+++yyerror_pv|||
+++yyerror|||
+++yylex|||
+++yyparse|||
+++yyunlex|||
+++yywarn|||
+++);
+++
+++if (exists $opt{'list-unsupported'}) {
+++ my $f;
+++ for $f (sort { lc $a cmp lc $b } keys %API) {
+++ next unless $API{$f}{todo};
+++ print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
+++ }
+++ exit 0;
+++}
+++
+++# Scan for possible replacement candidates
+++
+++my(%replace, %need, %hints, %warnings, %depends);
+++my $replace = 0;
+++my($hint, $define, $function);
+++
+++sub find_api
+++{
+++ my $code = shift;
+++ $code =~ s{
+++ / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
+++ | "[^"\\]*(?:\\.[^"\\]*)*"
+++ | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx;
+++ grep { exists $API{$_} } $code =~ /(\w+)/mg;
+++}
+++
+++while (<DATA>) {
+++ if ($hint) {
+++ my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings;
+++ if (m{^\s*\*\s(.*?)\s*$}) {
+++ for (@{$hint->[1]}) {
+++ $h->{$_} ||= ''; # suppress warning with older perls
+++ $h->{$_} .= "$1\n";
+++ }
+++ }
+++ else { undef $hint }
+++ }
+++
+++ $hint = [$1, [split /,?\s+/, $2]]
+++ if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$};
+++
+++ if ($define) {
+++ if ($define->[1] =~ /\\$/) {
+++ $define->[1] .= $_;
+++ }
+++ else {
+++ if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) {
+++ my @n = find_api($define->[1]);
+++ push @{$depends{$define->[0]}}, @n if @n
+++ }
+++ undef $define;
+++ }
+++ }
+++
+++ $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)};
+++
+++ if ($function) {
+++ if (/^}/) {
+++ if (exists $API{$function->[0]}) {
+++ my @n = find_api($function->[1]);
+++ push @{$depends{$function->[0]}}, @n if @n
+++ }
+++ undef $function;
+++ }
+++ else {
+++ $function->[1] .= $_;
+++ }
+++ }
+++
+++ $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)};
+++
+++ $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
+++ $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
+++ $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
+++ $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
+++
+++ if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
+++ my @deps = map { s/\s+//g; $_ } split /,/, $3;
+++ my $d;
+++ for $d (map { s/\s+//g; $_ } split /,/, $1) {
+++ push @{$depends{$d}}, @deps;
+++ }
+++ }
+++
+++ $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
+++}
+++
+++for (values %depends) {
+++ my %s;
+++ $_ = [sort grep !$s{$_}++, @$_];
+++}
+++
+++if (exists $opt{'api-info'}) {
+++ my $f;
+++ my $count = 0;
+++ my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
+++ for $f (sort { lc $a cmp lc $b } keys %API) {
+++ next unless $f =~ /$match/;
+++ print "\n=== $f ===\n\n";
+++ my $info = 0;
+++ if ($API{$f}{base} || $API{$f}{todo}) {
+++ my $base = format_version($API{$f}{base} || $API{$f}{todo});
+++ print "Supported at least starting from perl-$base.\n";
+++ $info++;
+++ }
+++ if ($API{$f}{provided}) {
+++ my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003";
+++ print "Support by $ppport provided back to perl-$todo.\n";
+++ print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
+++ print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
+++ print "\n$hints{$f}" if exists $hints{$f};
+++ print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f};
+++ $info++;
+++ }
+++ print "No portability information available.\n" unless $info;
+++ $count++;
+++ }
+++ $count or print "Found no API matching '$opt{'api-info'}'.";
+++ print "\n";
+++ exit 0;
+++}
+++
+++if (exists $opt{'list-provided'}) {
+++ my $f;
+++ for $f (sort { lc $a cmp lc $b } keys %API) {
+++ next unless $API{$f}{provided};
+++ my @flags;
+++ push @flags, 'explicit' if exists $need{$f};
+++ push @flags, 'depend' if exists $depends{$f};
+++ push @flags, 'hint' if exists $hints{$f};
+++ push @flags, 'warning' if exists $warnings{$f};
+++ my $flags = @flags ? ' ['.join(', ', @flags).']' : '';
+++ print "$f$flags\n";
+++ }
+++ exit 0;
+++}
+++
+++my @files;
+++my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc );
+++my $srcext = join '|', map { quotemeta $_ } @srcext;
+++
+++if (@ARGV) {
+++ my %seen;
+++ for (@ARGV) {
+++ if (-e) {
+++ if (-f) {
+++ push @files, $_ unless $seen{$_}++;
+++ }
+++ else { warn "'$_' is not a file.\n" }
+++ }
+++ else {
+++ my @new = grep { -f } glob $_
+++ or warn "'$_' does not exist.\n";
+++ push @files, grep { !$seen{$_}++ } @new;
+++ }
+++ }
+++}
+++else {
+++ eval {
+++ require File::Find;
+++ File::Find::find(sub {
+++ $File::Find::name =~ /($srcext)$/i
+++ and push @files, $File::Find::name;
+++ }, '.');
+++ };
+++ if ($@) {
+++ @files = map { glob "*$_" } @srcext;
+++ }
+++}
+++
+++if (!@ARGV || $opt{filter}) {
+++ my(@in, @out);
+++ my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
+++ for (@files) {
+++ my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i;
+++ push @{ $out ? \@out : \@in }, $_;
+++ }
+++ if (@ARGV && @out) {
+++ warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
+++ }
+++ @files = @in;
+++}
+++
+++die "No input files given!\n" unless @files;
+++
+++my(%files, %global, %revreplace);
+++%revreplace = reverse %replace;
+++my $filename;
+++my $patch_opened = 0;
+++
+++for $filename (@files) {
+++ unless (open IN, "<$filename") {
+++ warn "Unable to read from $filename: $!\n";
+++ next;
+++ }
+++
+++ info("Scanning $filename ...");
+++
+++ my $c = do { local $/; <IN> };
+++ close IN;
+++
+++ my %file = (orig => $c, changes => 0);
+++
+++ # Temporarily remove C/XS comments and strings from the code
+++ my @ccom;
+++
+++ $c =~ s{
+++ ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]*
+++ | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* )
+++ | ( ^$HS*\#[^\r\n]*
+++ | "[^"\\]*(?:\\.[^"\\]*)*"
+++ | '[^'\\]*(?:\\.[^'\\]*)*'
+++ | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) )
+++ }{ defined $2 and push @ccom, $2;
+++ defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex;
+++
+++ $file{ccom} = \@ccom;
+++ $file{code} = $c;
+++ $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m;
+++
+++ my $func;
+++
+++ for $func (keys %API) {
+++ my $match = $func;
+++ $match .= "|$revreplace{$func}" if exists $revreplace{$func};
+++ if ($c =~ /\b(?:Perl_)?($match)\b/) {
+++ $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
+++ $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
+++ if (exists $API{$func}{provided}) {
+++ $file{uses_provided}{$func}++;
+++ if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
+++ $file{uses}{$func}++;
+++ my @deps = rec_depend($func);
+++ if (@deps) {
+++ $file{uses_deps}{$func} = \@deps;
+++ for (@deps) {
+++ $file{uses}{$_} = 0 unless exists $file{uses}{$_};
+++ }
+++ }
+++ for ($func, @deps) {
+++ $file{needs}{$_} = 'static' if exists $need{$_};
+++ }
+++ }
+++ }
+++ if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
+++ if ($c =~ /\b$func\b/) {
+++ $file{uses_todo}{$func}++;
+++ }
+++ }
+++ }
+++ }
+++
+++ while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
+++ if (exists $need{$2}) {
+++ $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
+++ }
+++ else { warning("Possibly wrong #define $1 in $filename") }
+++ }
+++
+++ for (qw(uses needs uses_todo needed_global needed_static)) {
+++ for $func (keys %{$file{$_}}) {
+++ push @{$global{$_}{$func}}, $filename;
+++ }
+++ }
+++
+++ $files{$filename} = \%file;
+++}
+++
+++# Globally resolve NEED_'s
+++my $need;
+++for $need (keys %{$global{needs}}) {
+++ if (@{$global{needs}{$need}} > 1) {
+++ my @targets = @{$global{needs}{$need}};
+++ my @t = grep $files{$_}{needed_global}{$need}, @targets;
+++ @targets = @t if @t;
+++ @t = grep /\.xs$/i, @targets;
+++ @targets = @t if @t;
+++ my $target = shift @targets;
+++ $files{$target}{needs}{$need} = 'global';
+++ for (@{$global{needs}{$need}}) {
+++ $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
+++ }
+++ }
+++}
+++
+++for $filename (@files) {
+++ exists $files{$filename} or next;
+++
+++ info("=== Analyzing $filename ===");
+++
+++ my %file = %{$files{$filename}};
+++ my $func;
+++ my $c = $file{code};
+++ my $warnings = 0;
+++
+++ for $func (sort keys %{$file{uses_Perl}}) {
+++ if ($API{$func}{varargs}) {
+++ unless ($API{$func}{nothxarg}) {
+++ my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
+++ { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
+++ if ($changes) {
+++ warning("Doesn't pass interpreter argument aTHX to Perl_$func");
+++ $file{changes} += $changes;
+++ }
+++ }
+++ }
+++ else {
+++ warning("Uses Perl_$func instead of $func");
+++ $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
+++ {$func$1(}g);
+++ }
+++ }
+++
+++ for $func (sort keys %{$file{uses_replace}}) {
+++ warning("Uses $func instead of $replace{$func}");
+++ $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
+++ }
+++
+++ for $func (sort keys %{$file{uses_provided}}) {
+++ if ($file{uses}{$func}) {
+++ if (exists $file{uses_deps}{$func}) {
+++ diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
+++ }
+++ else {
+++ diag("Uses $func");
+++ }
+++ }
+++ $warnings += hint($func);
+++ }
+++
+++ unless ($opt{quiet}) {
+++ for $func (sort keys %{$file{uses_todo}}) {
+++ print "*** WARNING: Uses $func, which may not be portable below perl ",
+++ format_version($API{$func}{todo}), ", even with '$ppport'\n";
+++ $warnings++;
+++ }
+++ }
+++
+++ for $func (sort keys %{$file{needed_static}}) {
+++ my $message = '';
+++ if (not exists $file{uses}{$func}) {
+++ $message = "No need to define NEED_$func if $func is never used";
+++ }
+++ elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
+++ $message = "No need to define NEED_$func when already needed globally";
+++ }
+++ if ($message) {
+++ diag($message);
+++ $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
+++ }
+++ }
+++
+++ for $func (sort keys %{$file{needed_global}}) {
+++ my $message = '';
+++ if (not exists $global{uses}{$func}) {
+++ $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
+++ }
+++ elsif (exists $file{needs}{$func}) {
+++ if ($file{needs}{$func} eq 'extern') {
+++ $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
+++ }
+++ elsif ($file{needs}{$func} eq 'static') {
+++ $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
+++ }
+++ }
+++ if ($message) {
+++ diag($message);
+++ $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
+++ }
+++ }
+++
+++ $file{needs_inc_ppport} = keys %{$file{uses}};
+++
+++ if ($file{needs_inc_ppport}) {
+++ my $pp = '';
+++
+++ for $func (sort keys %{$file{needs}}) {
+++ my $type = $file{needs}{$func};
+++ next if $type eq 'extern';
+++ my $suffix = $type eq 'global' ? '_GLOBAL' : '';
+++ unless (exists $file{"needed_$type"}{$func}) {
+++ if ($type eq 'global') {
+++ diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
+++ }
+++ else {
+++ diag("File needs $func, adding static request");
+++ }
+++ $pp .= "#define NEED_$func$suffix\n";
+++ }
+++ }
+++
+++ if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
+++ $pp = '';
+++ $file{changes}++;
+++ }
+++
+++ unless ($file{has_inc_ppport}) {
+++ diag("Needs to include '$ppport'");
+++ $pp .= qq(#include "$ppport"\n)
+++ }
+++
+++ if ($pp) {
+++ $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
+++ || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
+++ || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
+++ || ($c =~ s/^/$pp/);
+++ }
+++ }
+++ else {
+++ if ($file{has_inc_ppport}) {
+++ diag("No need to include '$ppport'");
+++ $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
+++ }
+++ }
+++
+++ # put back in our C comments
+++ my $ix;
+++ my $cppc = 0;
+++ my @ccom = @{$file{ccom}};
+++ for $ix (0 .. $#ccom) {
+++ if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
+++ $cppc++;
+++ $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
+++ }
+++ else {
+++ $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
+++ }
+++ }
+++
+++ if ($cppc) {
+++ my $s = $cppc != 1 ? 's' : '';
+++ warning("Uses $cppc C++ style comment$s, which is not portable");
+++ }
+++
+++ my $s = $warnings != 1 ? 's' : '';
+++ my $warn = $warnings ? " ($warnings warning$s)" : '';
+++ info("Analysis completed$warn");
+++
+++ if ($file{changes}) {
+++ if (exists $opt{copy}) {
+++ my $newfile = "$filename$opt{copy}";
+++ if (-e $newfile) {
+++ error("'$newfile' already exists, refusing to write copy of '$filename'");
+++ }
+++ else {
+++ local *F;
+++ if (open F, ">$newfile") {
+++ info("Writing copy of '$filename' with changes to '$newfile'");
+++ print F $c;
+++ close F;
+++ }
+++ else {
+++ error("Cannot open '$newfile' for writing: $!");
+++ }
+++ }
+++ }
+++ elsif (exists $opt{patch} || $opt{changes}) {
+++ if (exists $opt{patch}) {
+++ unless ($patch_opened) {
+++ if (open PATCH, ">$opt{patch}") {
+++ $patch_opened = 1;
+++ }
+++ else {
+++ error("Cannot open '$opt{patch}' for writing: $!");
+++ delete $opt{patch};
+++ $opt{changes} = 1;
+++ goto fallback;
+++ }
+++ }
+++ mydiff(\*PATCH, $filename, $c);
+++ }
+++ else {
+++fallback:
+++ info("Suggested changes:");
+++ mydiff(\*STDOUT, $filename, $c);
+++ }
+++ }
+++ else {
+++ my $s = $file{changes} == 1 ? '' : 's';
+++ info("$file{changes} potentially required change$s detected");
+++ }
+++ }
+++ else {
+++ info("Looks good");
+++ }
+++}
+++
+++close PATCH if $patch_opened;
+++
+++exit 0;
+++
+++
+++sub try_use { eval "use @_;"; return $@ eq '' }
+++
+++sub mydiff
+++{
+++ local *F = shift;
+++ my($file, $str) = @_;
+++ my $diff;
+++
+++ if (exists $opt{diff}) {
+++ $diff = run_diff($opt{diff}, $file, $str);
+++ }
+++
+++ if (!defined $diff and try_use('Text::Diff')) {
+++ $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
+++ $diff = <<HEADER . $diff;
+++--- $file
++++++ $file.patched
+++HEADER
+++ }
+++
+++ if (!defined $diff) {
+++ $diff = run_diff('diff -u', $file, $str);
+++ }
+++
+++ if (!defined $diff) {
+++ $diff = run_diff('diff', $file, $str);
+++ }
+++
+++ if (!defined $diff) {
+++ error("Cannot generate a diff. Please install Text::Diff or use --copy.");
+++ return;
+++ }
+++
+++ print F $diff;
+++}
+++
+++sub run_diff
+++{
+++ my($prog, $file, $str) = @_;
+++ my $tmp = 'dppptemp';
+++ my $suf = 'aaa';
+++ my $diff = '';
+++ local *F;
+++
+++ while (-e "$tmp.$suf") { $suf++ }
+++ $tmp = "$tmp.$suf";
+++
+++ if (open F, ">$tmp") {
+++ print F $str;
+++ close F;
+++
+++ if (open F, "$prog $file $tmp |") {
+++ while (<F>) {
+++ s/\Q$tmp\E/$file.patched/;
+++ $diff .= $_;
+++ }
+++ close F;
+++ unlink $tmp;
+++ return $diff;
+++ }
+++
+++ unlink $tmp;
+++ }
+++ else {
+++ error("Cannot open '$tmp' for writing: $!");
+++ }
+++
+++ return undef;
+++}
+++
+++sub rec_depend
+++{
+++ my($func, $seen) = @_;
+++ return () unless exists $depends{$func};
+++ $seen = {%{$seen||{}}};
+++ return () if $seen->{$func}++;
+++ my %s;
+++ grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}};
+++}
+++
+++sub parse_version
+++{
+++ my $ver = shift;
+++
+++ if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
+++ return ($1, $2, $3);
+++ }
+++ elsif ($ver !~ /^\d+\.[\d_]+$/) {
+++ die "cannot parse version '$ver'\n";
+++ }
+++
+++ $ver =~ s/_//g;
+++ $ver =~ s/$/000000/;
+++
+++ my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+++
+++ $v = int $v;
+++ $s = int $s;
+++
+++ if ($r < 5 || ($r == 5 && $v < 6)) {
+++ if ($s % 10) {
+++ die "cannot parse version '$ver'\n";
+++ }
+++ }
+++
+++ return ($r, $v, $s);
+++}
+++
+++sub format_version
+++{
+++ my $ver = shift;
+++
+++ $ver =~ s/$/000000/;
+++ my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+++
+++ $v = int $v;
+++ $s = int $s;
+++
+++ if ($r < 5 || ($r == 5 && $v < 6)) {
+++ if ($s % 10) {
+++ die "invalid version '$ver'\n";
+++ }
+++ $s /= 10;
+++
+++ $ver = sprintf "%d.%03d", $r, $v;
+++ $s > 0 and $ver .= sprintf "_%02d", $s;
+++
+++ return $ver;
+++ }
+++
+++ return sprintf "%d.%d.%d", $r, $v, $s;
+++}
+++
+++sub info
+++{
+++ $opt{quiet} and return;
+++ print @_, "\n";
+++}
+++
+++sub diag
+++{
+++ $opt{quiet} and return;
+++ $opt{diag} and print @_, "\n";
+++}
+++
+++sub warning
+++{
+++ $opt{quiet} and return;
+++ print "*** ", @_, "\n";
+++}
+++
+++sub error
+++{
+++ print "*** ERROR: ", @_, "\n";
+++}
+++
+++my %given_hints;
+++my %given_warnings;
+++sub hint
+++{
+++ $opt{quiet} and return;
+++ my $func = shift;
+++ my $rv = 0;
+++ if (exists $warnings{$func} && !$given_warnings{$func}++) {
+++ my $warn = $warnings{$func};
+++ $warn =~ s!^!*** !mg;
+++ print "*** WARNING: $func\n", $warn;
+++ $rv++;
+++ }
+++ if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) {
+++ my $hint = $hints{$func};
+++ $hint =~ s/^/ /mg;
+++ print " --- hint for $func ---\n", $hint;
+++ }
+++ $rv;
+++}
+++
+++sub usage
+++{
+++ my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
+++ my %M = ( 'I' => '*' );
+++ $usage =~ s/^\s*perl\s+\S+/$^X $0/;
+++ $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
+++
+++ print <<ENDUSAGE;
+++
+++Usage: $usage
+++
+++See perldoc $0 for details.
+++
+++ENDUSAGE
+++
+++ exit 2;
+++}
+++
+++sub strip
+++{
+++ my $self = do { local(@ARGV,$/)=($0); <> };
+++ my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms;
+++ $copy =~ s/^(?=\S+)/ /gms;
+++ $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms;
+++ $self =~ s/^SKIP.*(?=^__DATA__)/SKIP
+++if (\@ARGV && \$ARGV[0] eq '--unstrip') {
+++ eval { require Devel::PPPort };
+++ \$@ and die "Cannot require Devel::PPPort, please install.\\n";
+++ if (eval \$Devel::PPPort::VERSION < $VERSION) {
+++ die "$0 was originally generated with Devel::PPPort $VERSION.\\n"
+++ . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n"
+++ . "Please install a newer version, or --unstrip will not work.\\n";
+++ }
+++ Devel::PPPort::WriteFile(\$0);
+++ exit 0;
+++}
+++print <<END;
+++
+++Sorry, but this is a stripped version of \$0.
+++
+++To be able to use its original script and doc functionality,
+++please try to regenerate this file using:
+++
+++ \$^X \$0 --unstrip
+++
+++END
+++/ms;
+++ my($pl, $c) = $self =~ /(.*^__DATA__)(.*)/ms;
+++ $c =~ s{
+++ / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*)
+++ | ( "[^"\\]*(?:\\.[^"\\]*)*"
+++ | '[^'\\]*(?:\\.[^'\\]*)*' )
+++ | ($HS+) }{ defined $2 ? ' ' : ($1 || '') }gsex;
+++ $c =~ s!\s+$!!mg;
+++ $c =~ s!^$LF!!mg;
+++ $c =~ s!^\s*#\s*!#!mg;
+++ $c =~ s!^\s+!!mg;
+++
+++ open OUT, ">$0" or die "cannot strip $0: $!\n";
+++ print OUT "$pl$c\n";
+++
+++ exit 0;
+++}
+++
+++__DATA__
+++*/
+++
+++#ifndef _P_P_PORTABILITY_H_
+++#define _P_P_PORTABILITY_H_
+++
+++#ifndef DPPP_NAMESPACE
+++# define DPPP_NAMESPACE DPPP_
+++#endif
+++
+++#define DPPP_CAT2(x,y) CAT2(x,y)
+++#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
+++
+++#ifndef PERL_REVISION
+++# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
+++# define PERL_PATCHLEVEL_H_IMPLICIT
+++# include <patchlevel.h>
+++# endif
+++# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
+++# include <could_not_find_Perl_patchlevel.h>
+++# endif
+++# ifndef PERL_REVISION
+++# define PERL_REVISION (5)
+++ /* Replace: 1 */
+++# define PERL_VERSION PATCHLEVEL
+++# define PERL_SUBVERSION SUBVERSION
+++ /* Replace PERL_PATCHLEVEL with PERL_VERSION */
+++ /* Replace: 0 */
+++# endif
+++#endif
+++
+++#define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10))
+++#define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION))
+++
+++/* It is very unlikely that anyone will try to use this with Perl 6
+++ (or greater), but who knows.
+++ */
+++#if PERL_REVISION != 5
+++# error ppport.h only works with Perl version 5
+++#endif /* PERL_REVISION != 5 */
+++#ifndef dTHR
+++# define dTHR dNOOP
+++#endif
+++#ifndef dTHX
+++# define dTHX dNOOP
+++#endif
+++
+++#ifndef dTHXa
+++# define dTHXa(x) dNOOP
+++#endif
+++#ifndef pTHX
+++# define pTHX void
+++#endif
+++
+++#ifndef pTHX_
+++# define pTHX_
+++#endif
+++
+++#ifndef aTHX
+++# define aTHX
+++#endif
+++
+++#ifndef aTHX_
+++# define aTHX_
+++#endif
+++
+++#if (PERL_BCDVERSION < 0x5006000)
+++# ifdef USE_THREADS
+++# define aTHXR thr
+++# define aTHXR_ thr,
+++# else
+++# define aTHXR
+++# define aTHXR_
+++# endif
+++# define dTHXR dTHR
+++#else
+++# define aTHXR aTHX
+++# define aTHXR_ aTHX_
+++# define dTHXR dTHX
+++#endif
+++#ifndef dTHXoa
+++# define dTHXoa(x) dTHXa(x)
+++#endif
+++
+++#ifdef I_LIMITS
+++# include <limits.h>
+++#endif
+++
+++#ifndef PERL_UCHAR_MIN
+++# define PERL_UCHAR_MIN ((unsigned char)0)
+++#endif
+++
+++#ifndef PERL_UCHAR_MAX
+++# ifdef UCHAR_MAX
+++# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
+++# else
+++# ifdef MAXUCHAR
+++# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
+++# else
+++# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
+++# endif
+++# endif
+++#endif
+++
+++#ifndef PERL_USHORT_MIN
+++# define PERL_USHORT_MIN ((unsigned short)0)
+++#endif
+++
+++#ifndef PERL_USHORT_MAX
+++# ifdef USHORT_MAX
+++# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
+++# else
+++# ifdef MAXUSHORT
+++# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
+++# else
+++# ifdef USHRT_MAX
+++# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
+++# else
+++# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
+++# endif
+++# endif
+++# endif
+++#endif
+++
+++#ifndef PERL_SHORT_MAX
+++# ifdef SHORT_MAX
+++# define PERL_SHORT_MAX ((short)SHORT_MAX)
+++# else
+++# ifdef MAXSHORT /* Often used in <values.h> */
+++# define PERL_SHORT_MAX ((short)MAXSHORT)
+++# else
+++# ifdef SHRT_MAX
+++# define PERL_SHORT_MAX ((short)SHRT_MAX)
+++# else
+++# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
+++# endif
+++# endif
+++# endif
+++#endif
+++
+++#ifndef PERL_SHORT_MIN
+++# ifdef SHORT_MIN
+++# define PERL_SHORT_MIN ((short)SHORT_MIN)
+++# else
+++# ifdef MINSHORT
+++# define PERL_SHORT_MIN ((short)MINSHORT)
+++# else
+++# ifdef SHRT_MIN
+++# define PERL_SHORT_MIN ((short)SHRT_MIN)
+++# else
+++# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
+++# endif
+++# endif
+++# endif
+++#endif
+++
+++#ifndef PERL_UINT_MAX
+++# ifdef UINT_MAX
+++# define PERL_UINT_MAX ((unsigned int)UINT_MAX)
+++# else
+++# ifdef MAXUINT
+++# define PERL_UINT_MAX ((unsigned int)MAXUINT)
+++# else
+++# define PERL_UINT_MAX (~(unsigned int)0)
+++# endif
+++# endif
+++#endif
+++
+++#ifndef PERL_UINT_MIN
+++# define PERL_UINT_MIN ((unsigned int)0)
+++#endif
+++
+++#ifndef PERL_INT_MAX
+++# ifdef INT_MAX
+++# define PERL_INT_MAX ((int)INT_MAX)
+++# else
+++# ifdef MAXINT /* Often used in <values.h> */
+++# define PERL_INT_MAX ((int)MAXINT)
+++# else
+++# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
+++# endif
+++# endif
+++#endif
+++
+++#ifndef PERL_INT_MIN
+++# ifdef INT_MIN
+++# define PERL_INT_MIN ((int)INT_MIN)
+++# else
+++# ifdef MININT
+++# define PERL_INT_MIN ((int)MININT)
+++# else
+++# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
+++# endif
+++# endif
+++#endif
+++
+++#ifndef PERL_ULONG_MAX
+++# ifdef ULONG_MAX
+++# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
+++# else
+++# ifdef MAXULONG
+++# define PERL_ULONG_MAX ((unsigned long)MAXULONG)
+++# else
+++# define PERL_ULONG_MAX (~(unsigned long)0)
+++# endif
+++# endif
+++#endif
+++
+++#ifndef PERL_ULONG_MIN
+++# define PERL_ULONG_MIN ((unsigned long)0L)
+++#endif
+++
+++#ifndef PERL_LONG_MAX
+++# ifdef LONG_MAX
+++# define PERL_LONG_MAX ((long)LONG_MAX)
+++# else
+++# ifdef MAXLONG
+++# define PERL_LONG_MAX ((long)MAXLONG)
+++# else
+++# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
+++# endif
+++# endif
+++#endif
+++
+++#ifndef PERL_LONG_MIN
+++# ifdef LONG_MIN
+++# define PERL_LONG_MIN ((long)LONG_MIN)
+++# else
+++# ifdef MINLONG
+++# define PERL_LONG_MIN ((long)MINLONG)
+++# else
+++# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
+++# endif
+++# endif
+++#endif
+++
+++#if defined(HAS_QUAD) && (defined(convex) || defined(uts))
+++# ifndef PERL_UQUAD_MAX
+++# ifdef ULONGLONG_MAX
+++# define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
+++# else
+++# ifdef MAXULONGLONG
+++# define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
+++# else
+++# define PERL_UQUAD_MAX (~(unsigned long long)0)
+++# endif
+++# endif
+++# endif
+++
+++# ifndef PERL_UQUAD_MIN
+++# define PERL_UQUAD_MIN ((unsigned long long)0L)
+++# endif
+++
+++# ifndef PERL_QUAD_MAX
+++# ifdef LONGLONG_MAX
+++# define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
+++# else
+++# ifdef MAXLONGLONG
+++# define PERL_QUAD_MAX ((long long)MAXLONGLONG)
+++# else
+++# define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
+++# endif
+++# endif
+++# endif
+++
+++# ifndef PERL_QUAD_MIN
+++# ifdef LONGLONG_MIN
+++# define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
+++# else
+++# ifdef MINLONGLONG
+++# define PERL_QUAD_MIN ((long long)MINLONGLONG)
+++# else
+++# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
+++# endif
+++# endif
+++# endif
+++#endif
+++
+++/* This is based on code from 5.003 perl.h */
+++#ifdef HAS_QUAD
+++# ifdef cray
+++#ifndef IVTYPE
+++# define IVTYPE int
+++#endif
+++
+++#ifndef IV_MIN
+++# define IV_MIN PERL_INT_MIN
+++#endif
+++
+++#ifndef IV_MAX
+++# define IV_MAX PERL_INT_MAX
+++#endif
+++
+++#ifndef UV_MIN
+++# define UV_MIN PERL_UINT_MIN
+++#endif
+++
+++#ifndef UV_MAX
+++# define UV_MAX PERL_UINT_MAX
+++#endif
+++
+++# ifdef INTSIZE
+++#ifndef IVSIZE
+++# define IVSIZE INTSIZE
+++#endif
+++
+++# endif
+++# else
+++# if defined(convex) || defined(uts)
+++#ifndef IVTYPE
+++# define IVTYPE long long
+++#endif
+++
+++#ifndef IV_MIN
+++# define IV_MIN PERL_QUAD_MIN
+++#endif
+++
+++#ifndef IV_MAX
+++# define IV_MAX PERL_QUAD_MAX
+++#endif
+++
+++#ifndef UV_MIN
+++# define UV_MIN PERL_UQUAD_MIN
+++#endif
+++
+++#ifndef UV_MAX
+++# define UV_MAX PERL_UQUAD_MAX
+++#endif
+++
+++# ifdef LONGLONGSIZE
+++#ifndef IVSIZE
+++# define IVSIZE LONGLONGSIZE
+++#endif
+++
+++# endif
+++# else
+++#ifndef IVTYPE
+++# define IVTYPE long
+++#endif
+++
+++#ifndef IV_MIN
+++# define IV_MIN PERL_LONG_MIN
+++#endif
+++
+++#ifndef IV_MAX
+++# define IV_MAX PERL_LONG_MAX
+++#endif
+++
+++#ifndef UV_MIN
+++# define UV_MIN PERL_ULONG_MIN
+++#endif
+++
+++#ifndef UV_MAX
+++# define UV_MAX PERL_ULONG_MAX
+++#endif
+++
+++# ifdef LONGSIZE
+++#ifndef IVSIZE
+++# define IVSIZE LONGSIZE
+++#endif
+++
+++# endif
+++# endif
+++# endif
+++#ifndef IVSIZE
+++# define IVSIZE 8
+++#endif
+++
+++#ifndef LONGSIZE
+++# define LONGSIZE 8
+++#endif
+++
+++#ifndef PERL_QUAD_MIN
+++# define PERL_QUAD_MIN IV_MIN
+++#endif
+++
+++#ifndef PERL_QUAD_MAX
+++# define PERL_QUAD_MAX IV_MAX
+++#endif
+++
+++#ifndef PERL_UQUAD_MIN
+++# define PERL_UQUAD_MIN UV_MIN
+++#endif
+++
+++#ifndef PERL_UQUAD_MAX
+++# define PERL_UQUAD_MAX UV_MAX
+++#endif
+++
+++#else
+++#ifndef IVTYPE
+++# define IVTYPE long
+++#endif
+++
+++#ifndef LONGSIZE
+++# define LONGSIZE 4
+++#endif
+++
+++#ifndef IV_MIN
+++# define IV_MIN PERL_LONG_MIN
+++#endif
+++
+++#ifndef IV_MAX
+++# define IV_MAX PERL_LONG_MAX
+++#endif
+++
+++#ifndef UV_MIN
+++# define UV_MIN PERL_ULONG_MIN
+++#endif
+++
+++#ifndef UV_MAX
+++# define UV_MAX PERL_ULONG_MAX
+++#endif
+++
+++#endif
+++
+++#ifndef IVSIZE
+++# ifdef LONGSIZE
+++# define IVSIZE LONGSIZE
+++# else
+++# define IVSIZE 4 /* A bold guess, but the best we can make. */
+++# endif
+++#endif
+++#ifndef UVTYPE
+++# define UVTYPE unsigned IVTYPE
+++#endif
+++
+++#ifndef UVSIZE
+++# define UVSIZE IVSIZE
+++#endif
+++#ifndef sv_setuv
+++# define sv_setuv(sv, uv) \
+++ STMT_START { \
+++ UV TeMpUv = uv; \
+++ if (TeMpUv <= IV_MAX) \
+++ sv_setiv(sv, TeMpUv); \
+++ else \
+++ sv_setnv(sv, (double)TeMpUv); \
+++ } STMT_END
+++#endif
+++#ifndef newSVuv
+++# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
+++#endif
+++#ifndef sv_2uv
+++# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
+++#endif
+++
+++#ifndef SvUVX
+++# define SvUVX(sv) ((UV)SvIVX(sv))
+++#endif
+++
+++#ifndef SvUVXx
+++# define SvUVXx(sv) SvUVX(sv)
+++#endif
+++
+++#ifndef SvUV
+++# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+++#endif
+++
+++#ifndef SvUVx
+++# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv))
+++#endif
+++
+++/* Hint: sv_uv
+++ * Always use the SvUVx() macro instead of sv_uv().
+++ */
+++#ifndef sv_uv
+++# define sv_uv(sv) SvUVx(sv)
+++#endif
+++
+++#if !defined(SvUOK) && defined(SvIOK_UV)
+++# define SvUOK(sv) SvIOK_UV(sv)
+++#endif
+++#ifndef XST_mUV
+++# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) )
+++#endif
+++
+++#ifndef XSRETURN_UV
+++# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END
+++#endif
+++#ifndef PUSHu
+++# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END
+++#endif
+++
+++#ifndef XPUSHu
+++# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
+++#endif
+++
+++#ifdef HAS_MEMCMP
+++#ifndef memNE
+++# define memNE(s1,s2,l) (memcmp(s1,s2,l))
+++#endif
+++
+++#ifndef memEQ
+++# define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
+++#endif
+++
+++#else
+++#ifndef memNE
+++# define memNE(s1,s2,l) (bcmp(s1,s2,l))
+++#endif
+++
+++#ifndef memEQ
+++# define memEQ(s1,s2,l) (!bcmp(s1,s2,l))
+++#endif
+++
+++#endif
+++#ifndef memEQs
+++# define memEQs(s1, l, s2) \
+++ (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1)))
+++#endif
+++
+++#ifndef memNEs
+++# define memNEs(s1, l, s2) !memEQs(s1, l, s2)
+++#endif
+++#ifndef MoveD
+++# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t))
+++#endif
+++
+++#ifndef CopyD
+++# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
+++#endif
+++
+++#ifdef HAS_MEMSET
+++#ifndef ZeroD
+++# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t))
+++#endif
+++
+++#else
+++#ifndef ZeroD
+++# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d)
+++#endif
+++
+++#endif
+++#ifndef PoisonWith
+++# define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))
+++#endif
+++
+++#ifndef PoisonNew
+++# define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB)
+++#endif
+++
+++#ifndef PoisonFree
+++# define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF)
+++#endif
+++
+++#ifndef Poison
+++# define Poison(d,n,t) PoisonFree(d,n,t)
+++#endif
+++#ifndef Newx
+++# define Newx(v,n,t) New(0,v,n,t)
+++#endif
+++
+++#ifndef Newxc
+++# define Newxc(v,n,t,c) Newc(0,v,n,t,c)
+++#endif
+++
+++#ifndef Newxz
+++# define Newxz(v,n,t) Newz(0,v,n,t)
+++#endif
+++
+++#ifndef PERL_UNUSED_DECL
+++# ifdef HASATTRIBUTE
+++# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
+++# define PERL_UNUSED_DECL
+++# else
+++# define PERL_UNUSED_DECL __attribute__((unused))
+++# endif
+++# else
+++# define PERL_UNUSED_DECL
+++# endif
+++#endif
+++
+++#ifndef PERL_UNUSED_ARG
+++# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
+++# include <note.h>
+++# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
+++# else
+++# define PERL_UNUSED_ARG(x) ((void)x)
+++# endif
+++#endif
+++
+++#ifndef PERL_UNUSED_VAR
+++# define PERL_UNUSED_VAR(x) ((void)x)
+++#endif
+++
+++#ifndef PERL_UNUSED_CONTEXT
+++# ifdef USE_ITHREADS
+++# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
+++# else
+++# define PERL_UNUSED_CONTEXT
+++# endif
+++#endif
+++#ifndef NOOP
+++# define NOOP /*EMPTY*/(void)0
+++#endif
+++
+++#ifndef dNOOP
+++# define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
+++#endif
+++
+++#ifndef NVTYPE
+++# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+++# define NVTYPE long double
+++# else
+++# define NVTYPE double
+++# endif
+++typedef NVTYPE NV;
+++#endif
+++
+++#ifndef INT2PTR
+++# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
+++# define PTRV UV
+++# define INT2PTR(any,d) (any)(d)
+++# else
+++# if PTRSIZE == LONGSIZE
+++# define PTRV unsigned long
+++# else
+++# define PTRV unsigned
+++# endif
+++# define INT2PTR(any,d) (any)(PTRV)(d)
+++# endif
+++#endif
+++
+++#ifndef PTR2ul
+++# if PTRSIZE == LONGSIZE
+++# define PTR2ul(p) (unsigned long)(p)
+++# else
+++# define PTR2ul(p) INT2PTR(unsigned long,p)
+++# endif
+++#endif
+++#ifndef PTR2nat
+++# define PTR2nat(p) (PTRV)(p)
+++#endif
+++
+++#ifndef NUM2PTR
+++# define NUM2PTR(any,d) (any)PTR2nat(d)
+++#endif
+++
+++#ifndef PTR2IV
+++# define PTR2IV(p) INT2PTR(IV,p)
+++#endif
+++
+++#ifndef PTR2UV
+++# define PTR2UV(p) INT2PTR(UV,p)
+++#endif
+++
+++#ifndef PTR2NV
+++# define PTR2NV(p) NUM2PTR(NV,p)
+++#endif
+++
+++#undef START_EXTERN_C
+++#undef END_EXTERN_C
+++#undef EXTERN_C
+++#ifdef __cplusplus
+++# define START_EXTERN_C extern "C" {
+++# define END_EXTERN_C }
+++# define EXTERN_C extern "C"
+++#else
+++# define START_EXTERN_C
+++# define END_EXTERN_C
+++# define EXTERN_C extern
+++#endif
+++
+++#if defined(PERL_GCC_PEDANTIC)
+++# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
+++# define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+++# endif
+++#endif
+++
+++#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
+++# ifndef PERL_USE_GCC_BRACE_GROUPS
+++# define PERL_USE_GCC_BRACE_GROUPS
+++# endif
+++#endif
+++
+++#undef STMT_START
+++#undef STMT_END
+++#ifdef PERL_USE_GCC_BRACE_GROUPS
+++# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */
+++# define STMT_END )
+++#else
+++# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
+++# define STMT_START if (1)
+++# define STMT_END else (void)0
+++# else
+++# define STMT_START do
+++# define STMT_END while (0)
+++# endif
+++#endif
+++#ifndef boolSV
+++# define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no)
+++#endif
+++
+++/* DEFSV appears first in 5.004_56 */
+++#ifndef DEFSV
+++# define DEFSV GvSV(PL_defgv)
+++#endif
+++
+++#ifndef SAVE_DEFSV
+++# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv))
+++#endif
+++
+++#ifndef DEFSV_set
+++# define DEFSV_set(sv) (DEFSV = (sv))
+++#endif
+++
+++/* Older perls (<=5.003) lack AvFILLp */
+++#ifndef AvFILLp
+++# define AvFILLp AvFILL
+++#endif
+++#ifndef ERRSV
+++# define ERRSV get_sv("@",FALSE)
+++#endif
+++
+++/* Hint: gv_stashpvn
+++ * This function's backport doesn't support the length parameter, but
+++ * rather ignores it. Portability can only be ensured if the length
+++ * parameter is used for speed reasons, but the length can always be
+++ * correctly computed from the string argument.
+++ */
+++#ifndef gv_stashpvn
+++# define gv_stashpvn(str,len,create) gv_stashpv(str,create)
+++#endif
+++
+++/* Replace: 1 */
+++#ifndef get_cv
+++# define get_cv perl_get_cv
+++#endif
+++
+++#ifndef get_sv
+++# define get_sv perl_get_sv
+++#endif
+++
+++#ifndef get_av
+++# define get_av perl_get_av
+++#endif
+++
+++#ifndef get_hv
+++# define get_hv perl_get_hv
+++#endif
+++
+++/* Replace: 0 */
+++#ifndef dUNDERBAR
+++# define dUNDERBAR dNOOP
+++#endif
+++
+++#ifndef UNDERBAR
+++# define UNDERBAR DEFSV
+++#endif
+++#ifndef dAX
+++# define dAX I32 ax = MARK - PL_stack_base + 1
+++#endif
+++
+++#ifndef dITEMS
+++# define dITEMS I32 items = SP - MARK
+++#endif
+++#ifndef dXSTARG
+++# define dXSTARG SV * targ = sv_newmortal()
+++#endif
+++#ifndef dAXMARK
+++# define dAXMARK I32 ax = POPMARK; \
+++ register SV ** const mark = PL_stack_base + ax++
+++#endif
+++#ifndef XSprePUSH
+++# define XSprePUSH (sp = PL_stack_base + ax - 1)
+++#endif
+++
+++#if (PERL_BCDVERSION < 0x5005000)
+++# undef XSRETURN
+++# define XSRETURN(off) \
+++ STMT_START { \
+++ PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
+++ return; \
+++ } STMT_END
+++#endif
+++#ifndef XSPROTO
+++# define XSPROTO(name) void name(pTHX_ CV* cv)
+++#endif
+++
+++#ifndef SVfARG
+++# define SVfARG(p) ((void*)(p))
+++#endif
+++#ifndef PERL_ABS
+++# define PERL_ABS(x) ((x) < 0 ? -(x) : (x))
+++#endif
+++#ifndef dVAR
+++# define dVAR dNOOP
+++#endif
+++#ifndef SVf
+++# define SVf "_"
+++#endif
+++#ifndef UTF8_MAXBYTES
+++# define UTF8_MAXBYTES UTF8_MAXLEN
+++#endif
+++#ifndef CPERLscope
+++# define CPERLscope(x) x
+++#endif
+++#ifndef PERL_HASH
+++# define PERL_HASH(hash,str,len) \
+++ STMT_START { \
+++ const char *s_PeRlHaSh = str; \
+++ I32 i_PeRlHaSh = len; \
+++ U32 hash_PeRlHaSh = 0; \
+++ while (i_PeRlHaSh--) \
+++ hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \
+++ (hash) = hash_PeRlHaSh; \
+++ } STMT_END
+++#endif
+++
+++#ifndef PERLIO_FUNCS_DECL
+++# ifdef PERLIO_FUNCS_CONST
+++# define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs
+++# define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs)
+++# else
+++# define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs
+++# define PERLIO_FUNCS_CAST(funcs) (funcs)
+++# endif
+++#endif
+++
+++/* provide these typedefs for older perls */
+++#if (PERL_BCDVERSION < 0x5009003)
+++
+++# ifdef ARGSproto
+++typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto);
+++# else
+++typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX);
+++# endif
+++
+++typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*);
+++
+++#endif
+++#ifndef isPSXSPC
+++# define isPSXSPC(c) (isSPACE(c) || (c) == '\v')
+++#endif
+++
+++#ifndef isBLANK
+++# define isBLANK(c) ((c) == ' ' || (c) == '\t')
+++#endif
+++
+++#ifdef EBCDIC
+++#ifndef isALNUMC
+++# define isALNUMC(c) isalnum(c)
+++#endif
+++
+++#ifndef isASCII
+++# define isASCII(c) isascii(c)
+++#endif
+++
+++#ifndef isCNTRL
+++# define isCNTRL(c) iscntrl(c)
+++#endif
+++
+++#ifndef isGRAPH
+++# define isGRAPH(c) isgraph(c)
+++#endif
+++
+++#ifndef isPRINT
+++# define isPRINT(c) isprint(c)
+++#endif
+++
+++#ifndef isPUNCT
+++# define isPUNCT(c) ispunct(c)
+++#endif
+++
+++#ifndef isXDIGIT
+++# define isXDIGIT(c) isxdigit(c)
+++#endif
+++
+++#else
+++# if (PERL_BCDVERSION < 0x5010000)
+++/* Hint: isPRINT
+++ * The implementation in older perl versions includes all of the
+++ * isSPACE() characters, which is wrong. The version provided by
+++ * Devel::PPPort always overrides a present buggy version.
+++ */
+++# undef isPRINT
+++# endif
+++
+++#ifdef HAS_QUAD
+++# define WIDEST_UTYPE U64TYPE
+++#else
+++# define WIDEST_UTYPE U32
+++#endif
+++#ifndef isALNUMC
+++# define isALNUMC(c) (isALPHA(c) || isDIGIT(c))
+++#endif
+++
+++#ifndef isASCII
+++# define isASCII(c) ((WIDEST_UTYPE) (c) <= 127)
+++#endif
+++
+++#ifndef isCNTRL
+++# define isCNTRL(c) ((WIDEST_UTYPE) (c) < ' ' || (c) == 127)
+++#endif
+++
+++#ifndef isGRAPH
+++# define isGRAPH(c) (isALNUM(c) || isPUNCT(c))
+++#endif
+++
+++#ifndef isPRINT
+++# define isPRINT(c) (((c) >= 32 && (c) < 127))
+++#endif
+++
+++#ifndef isPUNCT
+++# define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126))
+++#endif
+++
+++#ifndef isXDIGIT
+++# define isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F'))
+++#endif
+++
+++#endif
+++
+++#ifndef PERL_SIGNALS_UNSAFE_FLAG
+++
+++#define PERL_SIGNALS_UNSAFE_FLAG 0x0001
+++
+++#if (PERL_BCDVERSION < 0x5008000)
+++# define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG
+++#else
+++# define D_PPP_PERL_SIGNALS_INIT 0
+++#endif
+++
+++#if defined(NEED_PL_signals)
+++static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
+++#elif defined(NEED_PL_signals_GLOBAL)
+++U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT;
+++#else
+++extern U32 DPPP_(my_PL_signals);
+++#endif
+++#define PL_signals DPPP_(my_PL_signals)
+++
+++#endif
+++
+++/* Hint: PL_ppaddr
+++ * Calling an op via PL_ppaddr requires passing a context argument
+++ * for threaded builds. Since the context argument is different for
+++ * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will
+++ * automatically be defined as the correct argument.
+++ */
+++
+++#if (PERL_BCDVERSION <= 0x5005005)
+++/* Replace: 1 */
+++# define PL_ppaddr ppaddr
+++# define PL_no_modify no_modify
+++/* Replace: 0 */
+++#endif
+++
+++#if (PERL_BCDVERSION <= 0x5004005)
+++/* Replace: 1 */
+++# define PL_DBsignal DBsignal
+++# define PL_DBsingle DBsingle
+++# define PL_DBsub DBsub
+++# define PL_DBtrace DBtrace
+++# define PL_Sv Sv
+++# define PL_bufend bufend
+++# define PL_bufptr bufptr
+++# define PL_compiling compiling
+++# define PL_copline copline
+++# define PL_curcop curcop
+++# define PL_curstash curstash
+++# define PL_debstash debstash
+++# define PL_defgv defgv
+++# define PL_diehook diehook
+++# define PL_dirty dirty
+++# define PL_dowarn dowarn
+++# define PL_errgv errgv
+++# define PL_error_count error_count
+++# define PL_expect expect
+++# define PL_hexdigit hexdigit
+++# define PL_hints hints
+++# define PL_in_my in_my
+++# define PL_laststatval laststatval
+++# define PL_lex_state lex_state
+++# define PL_lex_stuff lex_stuff
+++# define PL_linestr linestr
+++# define PL_na na
+++# define PL_perl_destruct_level perl_destruct_level
+++# define PL_perldb perldb
+++# define PL_rsfp_filters rsfp_filters
+++# define PL_rsfp rsfp
+++# define PL_stack_base stack_base
+++# define PL_stack_sp stack_sp
+++# define PL_statcache statcache
+++# define PL_stdingv stdingv
+++# define PL_sv_arenaroot sv_arenaroot
+++# define PL_sv_no sv_no
+++# define PL_sv_undef sv_undef
+++# define PL_sv_yes sv_yes
+++# define PL_tainted tainted
+++# define PL_tainting tainting
+++# define PL_tokenbuf tokenbuf
+++/* Replace: 0 */
+++#endif
+++
+++/* Warning: PL_parser
+++ * For perl versions earlier than 5.9.5, this is an always
+++ * non-NULL dummy. Also, it cannot be dereferenced. Don't
+++ * use it if you can avoid is and unless you absolutely know
+++ * what you're doing.
+++ * If you always check that PL_parser is non-NULL, you can
+++ * define DPPP_PL_parser_NO_DUMMY to avoid the creation of
+++ * a dummy parser structure.
+++ */
+++
+++#if (PERL_BCDVERSION >= 0x5009005)
+++# ifdef DPPP_PL_parser_NO_DUMMY
+++# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
+++ (croak("panic: PL_parser == NULL in %s:%d", \
+++ __FILE__, __LINE__), (yy_parser *) NULL))->var)
+++# else
+++# ifdef DPPP_PL_parser_NO_DUMMY_WARNING
+++# define D_PPP_parser_dummy_warning(var)
+++# else
+++# define D_PPP_parser_dummy_warning(var) \
+++ warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__),
+++# endif
+++# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \
+++ (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var)
+++#if defined(NEED_PL_parser)
+++static yy_parser DPPP_(dummy_PL_parser);
+++#elif defined(NEED_PL_parser_GLOBAL)
+++yy_parser DPPP_(dummy_PL_parser);
+++#else
+++extern yy_parser DPPP_(dummy_PL_parser);
+++#endif
+++
+++# endif
+++
+++/* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */
+++/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf
+++ * Do not use this variable unless you know exactly what you're
+++ * doint. It is internal to the perl parser and may change or even
+++ * be removed in the future. As of perl 5.9.5, you have to check
+++ * for (PL_parser != NULL) for this variable to have any effect.
+++ * An always non-NULL PL_parser dummy is provided for earlier
+++ * perl versions.
+++ * If PL_parser is NULL when you try to access this variable, a
+++ * dummy is being accessed instead and a warning is issued unless
+++ * you define DPPP_PL_parser_NO_DUMMY_WARNING.
+++ * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access
+++ * this variable will croak with a panic message.
+++ */
+++
+++# define PL_expect D_PPP_my_PL_parser_var(expect)
+++# define PL_copline D_PPP_my_PL_parser_var(copline)
+++# define PL_rsfp D_PPP_my_PL_parser_var(rsfp)
+++# define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters)
+++# define PL_linestr D_PPP_my_PL_parser_var(linestr)
+++# define PL_bufptr D_PPP_my_PL_parser_var(bufptr)
+++# define PL_bufend D_PPP_my_PL_parser_var(bufend)
+++# define PL_lex_state D_PPP_my_PL_parser_var(lex_state)
+++# define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff)
+++# define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf)
+++# define PL_in_my D_PPP_my_PL_parser_var(in_my)
+++# define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash)
+++# define PL_error_count D_PPP_my_PL_parser_var(error_count)
+++
+++
+++#else
+++
+++/* ensure that PL_parser != NULL and cannot be dereferenced */
+++# define PL_parser ((void *) 1)
+++
+++#endif
+++#ifndef mPUSHs
+++# define mPUSHs(s) PUSHs(sv_2mortal(s))
+++#endif
+++
+++#ifndef PUSHmortal
+++# define PUSHmortal PUSHs(sv_newmortal())
+++#endif
+++
+++#ifndef mPUSHp
+++# define mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l))
+++#endif
+++
+++#ifndef mPUSHn
+++# define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n))
+++#endif
+++
+++#ifndef mPUSHi
+++# define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i))
+++#endif
+++
+++#ifndef mPUSHu
+++# define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u))
+++#endif
+++#ifndef mXPUSHs
+++# define mXPUSHs(s) XPUSHs(sv_2mortal(s))
+++#endif
+++
+++#ifndef XPUSHmortal
+++# define XPUSHmortal XPUSHs(sv_newmortal())
+++#endif
+++
+++#ifndef mXPUSHp
+++# define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END
+++#endif
+++
+++#ifndef mXPUSHn
+++# define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END
+++#endif
+++
+++#ifndef mXPUSHi
+++# define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END
+++#endif
+++
+++#ifndef mXPUSHu
+++# define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END
+++#endif
+++
+++/* Replace: 1 */
+++#ifndef call_sv
+++# define call_sv perl_call_sv
+++#endif
+++
+++#ifndef call_pv
+++# define call_pv perl_call_pv
+++#endif
+++
+++#ifndef call_argv
+++# define call_argv perl_call_argv
+++#endif
+++
+++#ifndef call_method
+++# define call_method perl_call_method
+++#endif
+++#ifndef eval_sv
+++# define eval_sv perl_eval_sv
+++#endif
+++
+++/* Replace: 0 */
+++#ifndef PERL_LOADMOD_DENY
+++# define PERL_LOADMOD_DENY 0x1
+++#endif
+++
+++#ifndef PERL_LOADMOD_NOIMPORT
+++# define PERL_LOADMOD_NOIMPORT 0x2
+++#endif
+++
+++#ifndef PERL_LOADMOD_IMPORT_OPS
+++# define PERL_LOADMOD_IMPORT_OPS 0x4
+++#endif
+++
+++#ifndef G_METHOD
+++# define G_METHOD 64
+++# ifdef call_sv
+++# undef call_sv
+++# endif
+++# if (PERL_BCDVERSION < 0x5006000)
+++# define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \
+++ (flags) & ~G_METHOD) : perl_call_sv(sv, flags))
+++# else
+++# define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \
+++ (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags))
+++# endif
+++#endif
+++
+++/* Replace perl_eval_pv with eval_pv */
+++
+++#ifndef eval_pv
+++#if defined(NEED_eval_pv)
+++static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+++static
+++#else
+++extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+++#endif
+++
+++#ifdef eval_pv
+++# undef eval_pv
+++#endif
+++#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b)
+++#define Perl_eval_pv DPPP_(my_eval_pv)
+++
+++#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL)
+++
+++SV*
+++DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
+++{
+++ dSP;
+++ SV* sv = newSVpv(p, 0);
+++
+++ PUSHMARK(sp);
+++ eval_sv(sv, G_SCALAR);
+++ SvREFCNT_dec(sv);
+++
+++ SPAGAIN;
+++ sv = POPs;
+++ PUTBACK;
+++
+++ if (croak_on_error && SvTRUE(GvSV(errgv)))
+++ croak(SvPVx(GvSV(errgv), na));
+++
+++ return sv;
+++}
+++
+++#endif
+++#endif
+++
+++#ifndef vload_module
+++#if defined(NEED_vload_module)
+++static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
+++static
+++#else
+++extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args);
+++#endif
+++
+++#ifdef vload_module
+++# undef vload_module
+++#endif
+++#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d)
+++#define Perl_vload_module DPPP_(my_vload_module)
+++
+++#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL)
+++
+++void
+++DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args)
+++{
+++ dTHR;
+++ dVAR;
+++ OP *veop, *imop;
+++
+++ OP * const modname = newSVOP(OP_CONST, 0, name);
+++ /* 5.005 has a somewhat hacky force_normal that doesn't croak on
+++ SvREADONLY() if PL_compling is true. Current perls take care in
+++ ck_require() to correctly turn off SvREADONLY before calling
+++ force_normal_flags(). This seems a better fix than fudging PL_compling
+++ */
+++ SvREADONLY_off(((SVOP*)modname)->op_sv);
+++ modname->op_private |= OPpCONST_BARE;
+++ if (ver) {
+++ veop = newSVOP(OP_CONST, 0, ver);
+++ }
+++ else
+++ veop = NULL;
+++ if (flags & PERL_LOADMOD_NOIMPORT) {
+++ imop = sawparens(newNULLLIST());
+++ }
+++ else if (flags & PERL_LOADMOD_IMPORT_OPS) {
+++ imop = va_arg(*args, OP*);
+++ }
+++ else {
+++ SV *sv;
+++ imop = NULL;
+++ sv = va_arg(*args, SV*);
+++ while (sv) {
+++ imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
+++ sv = va_arg(*args, SV*);
+++ }
+++ }
+++ {
+++ const line_t ocopline = PL_copline;
+++ COP * const ocurcop = PL_curcop;
+++ const int oexpect = PL_expect;
+++
+++#if (PERL_BCDVERSION >= 0x5004000)
+++ utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
+++ veop, modname, imop);
+++#else
+++ utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(),
+++ modname, imop);
+++#endif
+++ PL_expect = oexpect;
+++ PL_copline = ocopline;
+++ PL_curcop = ocurcop;
+++ }
+++}
+++
+++#endif
+++#endif
+++
+++#ifndef load_module
+++#if defined(NEED_load_module)
+++static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
+++static
+++#else
+++extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...);
+++#endif
+++
+++#ifdef load_module
+++# undef load_module
+++#endif
+++#define load_module DPPP_(my_load_module)
+++#define Perl_load_module DPPP_(my_load_module)
+++
+++#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL)
+++
+++void
+++DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...)
+++{
+++ va_list args;
+++ va_start(args, ver);
+++ vload_module(flags, name, ver, &args);
+++ va_end(args);
+++}
+++
+++#endif
+++#endif
+++#ifndef newRV_inc
+++# define newRV_inc(sv) newRV(sv) /* Replace */
+++#endif
+++
+++#ifndef newRV_noinc
+++#if defined(NEED_newRV_noinc)
+++static SV * DPPP_(my_newRV_noinc)(SV *sv);
+++static
+++#else
+++extern SV * DPPP_(my_newRV_noinc)(SV *sv);
+++#endif
+++
+++#ifdef newRV_noinc
+++# undef newRV_noinc
+++#endif
+++#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a)
+++#define Perl_newRV_noinc DPPP_(my_newRV_noinc)
+++
+++#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL)
+++SV *
+++DPPP_(my_newRV_noinc)(SV *sv)
+++{
+++ SV *rv = (SV *)newRV(sv);
+++ SvREFCNT_dec(sv);
+++ return rv;
+++}
+++#endif
+++#endif
+++
+++/* Hint: newCONSTSUB
+++ * Returns a CV* as of perl-5.7.1. This return value is not supported
+++ * by Devel::PPPort.
+++ */
+++
+++/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
+++#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005)
+++#if defined(NEED_newCONSTSUB)
+++static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
+++static
+++#else
+++extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv);
+++#endif
+++
+++#ifdef newCONSTSUB
+++# undef newCONSTSUB
+++#endif
+++#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c)
+++#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB)
+++
+++#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
+++
+++/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */
+++/* (There's no PL_parser in perl < 5.005, so this is completely safe) */
+++#define D_PPP_PL_copline PL_copline
+++
+++void
+++DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv)
+++{
+++ U32 oldhints = PL_hints;
+++ HV *old_cop_stash = PL_curcop->cop_stash;
+++ HV *old_curstash = PL_curstash;
+++ line_t oldline = PL_curcop->cop_line;
+++ PL_curcop->cop_line = D_PPP_PL_copline;
+++
+++ PL_hints &= ~HINT_BLOCK_SCOPE;
+++ if (stash)
+++ PL_curstash = PL_curcop->cop_stash = stash;
+++
+++ newSUB(
+++
+++#if (PERL_BCDVERSION < 0x5003022)
+++ start_subparse(),
+++#elif (PERL_BCDVERSION == 0x5003022)
+++ start_subparse(0),
+++#else /* 5.003_23 onwards */
+++ start_subparse(FALSE, 0),
+++#endif
+++
+++ newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)),
+++ newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */
+++ newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
+++ );
+++
+++ PL_hints = oldhints;
+++ PL_curcop->cop_stash = old_cop_stash;
+++ PL_curstash = old_curstash;
+++ PL_curcop->cop_line = oldline;
+++}
+++#endif
+++#endif
+++
+++/*
+++ * Boilerplate macros for initializing and accessing interpreter-local
+++ * data from C. All statics in extensions should be reworked to use
+++ * this, if you want to make the extension thread-safe. See ext/re/re.xs
+++ * for an example of the use of these macros.
+++ *
+++ * Code that uses these macros is responsible for the following:
+++ * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
+++ * 2. Declare a typedef named my_cxt_t that is a structure that contains
+++ * all the data that needs to be interpreter-local.
+++ * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
+++ * 4. Use the MY_CXT_INIT macro such that it is called exactly once
+++ * (typically put in the BOOT: section).
+++ * 5. Use the members of the my_cxt_t structure everywhere as
+++ * MY_CXT.member.
+++ * 6. Use the dMY_CXT macro (a declaration) in all the functions that
+++ * access MY_CXT.
+++ */
+++
+++#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
+++ defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT)
+++
+++#ifndef START_MY_CXT
+++
+++/* This must appear in all extensions that define a my_cxt_t structure,
+++ * right after the definition (i.e. at file scope). The non-threads
+++ * case below uses it to declare the data as static. */
+++#define START_MY_CXT
+++
+++#if (PERL_BCDVERSION < 0x5004068)
+++/* Fetches the SV that keeps the per-interpreter data. */
+++#define dMY_CXT_SV \
+++ SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
+++#else /* >= perl5.004_68 */
+++#define dMY_CXT_SV \
+++ SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \
+++ sizeof(MY_CXT_KEY)-1, TRUE)
+++#endif /* < perl5.004_68 */
+++
+++/* This declaration should be used within all functions that use the
+++ * interpreter-local data. */
+++#define dMY_CXT \
+++ dMY_CXT_SV; \
+++ my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
+++
+++/* Creates and zeroes the per-interpreter data.
+++ * (We allocate my_cxtp in a Perl SV so that it will be released when
+++ * the interpreter goes away.) */
+++#define MY_CXT_INIT \
+++ dMY_CXT_SV; \
+++ /* newSV() allocates one more than needed */ \
+++ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+++ Zero(my_cxtp, 1, my_cxt_t); \
+++ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+++
+++/* This macro must be used to access members of the my_cxt_t structure.
+++ * e.g. MYCXT.some_data */
+++#define MY_CXT (*my_cxtp)
+++
+++/* Judicious use of these macros can reduce the number of times dMY_CXT
+++ * is used. Use is similar to pTHX, aTHX etc. */
+++#define pMY_CXT my_cxt_t *my_cxtp
+++#define pMY_CXT_ pMY_CXT,
+++#define _pMY_CXT ,pMY_CXT
+++#define aMY_CXT my_cxtp
+++#define aMY_CXT_ aMY_CXT,
+++#define _aMY_CXT ,aMY_CXT
+++
+++#endif /* START_MY_CXT */
+++
+++#ifndef MY_CXT_CLONE
+++/* Clones the per-interpreter data. */
+++#define MY_CXT_CLONE \
+++ dMY_CXT_SV; \
+++ my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+++ Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
+++ sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+++#endif
+++
+++#else /* single interpreter */
+++
+++#ifndef START_MY_CXT
+++
+++#define START_MY_CXT static my_cxt_t my_cxt;
+++#define dMY_CXT_SV dNOOP
+++#define dMY_CXT dNOOP
+++#define MY_CXT_INIT NOOP
+++#define MY_CXT my_cxt
+++
+++#define pMY_CXT void
+++#define pMY_CXT_
+++#define _pMY_CXT
+++#define aMY_CXT
+++#define aMY_CXT_
+++#define _aMY_CXT
+++
+++#endif /* START_MY_CXT */
+++
+++#ifndef MY_CXT_CLONE
+++#define MY_CXT_CLONE NOOP
+++#endif
+++
+++#endif
+++
+++#ifndef IVdf
+++# if IVSIZE == LONGSIZE
+++# define IVdf "ld"
+++# define UVuf "lu"
+++# define UVof "lo"
+++# define UVxf "lx"
+++# define UVXf "lX"
+++# elif IVSIZE == INTSIZE
+++# define IVdf "d"
+++# define UVuf "u"
+++# define UVof "o"
+++# define UVxf "x"
+++# define UVXf "X"
+++# else
+++# error "cannot define IV/UV formats"
+++# endif
+++#endif
+++
+++#ifndef NVef
+++# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
+++ defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000)
+++ /* Not very likely, but let's try anyway. */
+++# define NVef PERL_PRIeldbl
+++# define NVff PERL_PRIfldbl
+++# define NVgf PERL_PRIgldbl
+++# else
+++# define NVef "e"
+++# define NVff "f"
+++# define NVgf "g"
+++# endif
+++#endif
+++
+++#ifndef SvREFCNT_inc
+++# ifdef PERL_USE_GCC_BRACE_GROUPS
+++# define SvREFCNT_inc(sv) \
+++ ({ \
+++ SV * const _sv = (SV*)(sv); \
+++ if (_sv) \
+++ (SvREFCNT(_sv))++; \
+++ _sv; \
+++ })
+++# else
+++# define SvREFCNT_inc(sv) \
+++ ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
+++# endif
+++#endif
+++
+++#ifndef SvREFCNT_inc_simple
+++# ifdef PERL_USE_GCC_BRACE_GROUPS
+++# define SvREFCNT_inc_simple(sv) \
+++ ({ \
+++ if (sv) \
+++ (SvREFCNT(sv))++; \
+++ (SV *)(sv); \
+++ })
+++# else
+++# define SvREFCNT_inc_simple(sv) \
+++ ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL)
+++# endif
+++#endif
+++
+++#ifndef SvREFCNT_inc_NN
+++# ifdef PERL_USE_GCC_BRACE_GROUPS
+++# define SvREFCNT_inc_NN(sv) \
+++ ({ \
+++ SV * const _sv = (SV*)(sv); \
+++ SvREFCNT(_sv)++; \
+++ _sv; \
+++ })
+++# else
+++# define SvREFCNT_inc_NN(sv) \
+++ (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
+++# endif
+++#endif
+++
+++#ifndef SvREFCNT_inc_void
+++# ifdef PERL_USE_GCC_BRACE_GROUPS
+++# define SvREFCNT_inc_void(sv) \
+++ ({ \
+++ SV * const _sv = (SV*)(sv); \
+++ if (_sv) \
+++ (void)(SvREFCNT(_sv)++); \
+++ })
+++# else
+++# define SvREFCNT_inc_void(sv) \
+++ (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
+++# endif
+++#endif
+++#ifndef SvREFCNT_inc_simple_void
+++# define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
+++#endif
+++
+++#ifndef SvREFCNT_inc_simple_NN
+++# define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv))
+++#endif
+++
+++#ifndef SvREFCNT_inc_void_NN
+++# define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
+++#endif
+++
+++#ifndef SvREFCNT_inc_simple_void_NN
+++# define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
+++#endif
+++
+++#ifndef newSV_type
+++
+++#if defined(NEED_newSV_type)
+++static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t);
+++static
+++#else
+++extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t);
+++#endif
+++
+++#ifdef newSV_type
+++# undef newSV_type
+++#endif
+++#define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a)
+++#define Perl_newSV_type DPPP_(my_newSV_type)
+++
+++#if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL)
+++
+++SV*
+++DPPP_(my_newSV_type)(pTHX_ svtype const t)
+++{
+++ SV* const sv = newSV(0);
+++ sv_upgrade(sv, t);
+++ return sv;
+++}
+++
+++#endif
+++
+++#endif
+++
+++#if (PERL_BCDVERSION < 0x5006000)
+++# define D_PPP_CONSTPV_ARG(x) ((char *) (x))
+++#else
+++# define D_PPP_CONSTPV_ARG(x) (x)
+++#endif
+++#ifndef newSVpvn
+++# define newSVpvn(data,len) ((data) \
+++ ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
+++ : newSV(0))
+++#endif
+++#ifndef newSVpvn_utf8
+++# define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
+++#endif
+++#ifndef SVf_UTF8
+++# define SVf_UTF8 0
+++#endif
+++
+++#ifndef newSVpvn_flags
+++
+++#if defined(NEED_newSVpvn_flags)
+++static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
+++static
+++#else
+++extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags);
+++#endif
+++
+++#ifdef newSVpvn_flags
+++# undef newSVpvn_flags
+++#endif
+++#define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c)
+++#define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags)
+++
+++#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL)
+++
+++SV *
+++DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags)
+++{
+++ SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len);
+++ SvFLAGS(sv) |= (flags & SVf_UTF8);
+++ return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
+++}
+++
+++#endif
+++
+++#endif
+++
+++/* Backwards compatibility stuff... :-( */
+++#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen)
+++# define NEED_sv_2pv_flags
+++#endif
+++#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL)
+++# define NEED_sv_2pv_flags_GLOBAL
+++#endif
+++
+++/* Hint: sv_2pv_nolen
+++ * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen().
+++ */
+++#ifndef sv_2pv_nolen
+++# define sv_2pv_nolen(sv) SvPV_nolen(sv)
+++#endif
+++
+++#ifdef SvPVbyte
+++
+++/* Hint: SvPVbyte
+++ * Does not work in perl-5.6.1, ppport.h implements a version
+++ * borrowed from perl-5.7.3.
+++ */
+++
+++#if (PERL_BCDVERSION < 0x5007000)
+++
+++#if defined(NEED_sv_2pvbyte)
+++static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
+++static
+++#else
+++extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp);
+++#endif
+++
+++#ifdef sv_2pvbyte
+++# undef sv_2pvbyte
+++#endif
+++#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b)
+++#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte)
+++
+++#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
+++
+++char *
+++DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp)
+++{
+++ sv_utf8_downgrade(sv,0);
+++ return SvPV(sv,*lp);
+++}
+++
+++#endif
+++
+++/* Hint: sv_2pvbyte
+++ * Use the SvPVbyte() macro instead of sv_2pvbyte().
+++ */
+++
+++#undef SvPVbyte
+++
+++#define SvPVbyte(sv, lp) \
+++ ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \
+++ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
+++
+++#endif
+++
+++#else
+++
+++# define SvPVbyte SvPV
+++# define sv_2pvbyte sv_2pv
+++
+++#endif
+++#ifndef sv_2pvbyte_nolen
+++# define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv)
+++#endif
+++
+++/* Hint: sv_pvn
+++ * Always use the SvPV() macro instead of sv_pvn().
+++ */
+++
+++/* Hint: sv_pvn_force
+++ * Always use the SvPV_force() macro instead of sv_pvn_force().
+++ */
+++
+++/* If these are undefined, they're not handled by the core anyway */
+++#ifndef SV_IMMEDIATE_UNREF
+++# define SV_IMMEDIATE_UNREF 0
+++#endif
+++
+++#ifndef SV_GMAGIC
+++# define SV_GMAGIC 0
+++#endif
+++
+++#ifndef SV_COW_DROP_PV
+++# define SV_COW_DROP_PV 0
+++#endif
+++
+++#ifndef SV_UTF8_NO_ENCODING
+++# define SV_UTF8_NO_ENCODING 0
+++#endif
+++
+++#ifndef SV_NOSTEAL
+++# define SV_NOSTEAL 0
+++#endif
+++
+++#ifndef SV_CONST_RETURN
+++# define SV_CONST_RETURN 0
+++#endif
+++
+++#ifndef SV_MUTABLE_RETURN
+++# define SV_MUTABLE_RETURN 0
+++#endif
+++
+++#ifndef SV_SMAGIC
+++# define SV_SMAGIC 0
+++#endif
+++
+++#ifndef SV_HAS_TRAILING_NUL
+++# define SV_HAS_TRAILING_NUL 0
+++#endif
+++
+++#ifndef SV_COW_SHARED_HASH_KEYS
+++# define SV_COW_SHARED_HASH_KEYS 0
+++#endif
+++
+++#if (PERL_BCDVERSION < 0x5007002)
+++
+++#if defined(NEED_sv_2pv_flags)
+++static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+++static
+++#else
+++extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+++#endif
+++
+++#ifdef sv_2pv_flags
+++# undef sv_2pv_flags
+++#endif
+++#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c)
+++#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags)
+++
+++#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL)
+++
+++char *
+++DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+++{
+++ STRLEN n_a = (STRLEN) flags;
+++ return sv_2pv(sv, lp ? lp : &n_a);
+++}
+++
+++#endif
+++
+++#if defined(NEED_sv_pvn_force_flags)
+++static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+++static
+++#else
+++extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags);
+++#endif
+++
+++#ifdef sv_pvn_force_flags
+++# undef sv_pvn_force_flags
+++#endif
+++#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c)
+++#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags)
+++
+++#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL)
+++
+++char *
+++DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags)
+++{
+++ STRLEN n_a = (STRLEN) flags;
+++ return sv_pvn_force(sv, lp ? lp : &n_a);
+++}
+++
+++#endif
+++
+++#endif
+++
+++#if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) )
+++# define DPPP_SVPV_NOLEN_LP_ARG &PL_na
+++#else
+++# define DPPP_SVPV_NOLEN_LP_ARG 0
+++#endif
+++#ifndef SvPV_const
+++# define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC)
+++#endif
+++
+++#ifndef SvPV_mutable
+++# define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC)
+++#endif
+++#ifndef SvPV_flags
+++# define SvPV_flags(sv, lp, flags) \
+++ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+++ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags))
+++#endif
+++#ifndef SvPV_flags_const
+++# define SvPV_flags_const(sv, lp, flags) \
+++ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+++ ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \
+++ (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN))
+++#endif
+++#ifndef SvPV_flags_const_nolen
+++# define SvPV_flags_const_nolen(sv, flags) \
+++ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+++ ? SvPVX_const(sv) : \
+++ (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN))
+++#endif
+++#ifndef SvPV_flags_mutable
+++# define SvPV_flags_mutable(sv, lp, flags) \
+++ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+++ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \
+++ sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+++#endif
+++#ifndef SvPV_force
+++# define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC)
+++#endif
+++
+++#ifndef SvPV_force_nolen
+++# define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC)
+++#endif
+++
+++#ifndef SvPV_force_mutable
+++# define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC)
+++#endif
+++
+++#ifndef SvPV_force_nomg
+++# define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0)
+++#endif
+++
+++#ifndef SvPV_force_nomg_nolen
+++# define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0)
+++#endif
+++#ifndef SvPV_force_flags
+++# define SvPV_force_flags(sv, lp, flags) \
+++ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+++ ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags))
+++#endif
+++#ifndef SvPV_force_flags_nolen
+++# define SvPV_force_flags_nolen(sv, flags) \
+++ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+++ ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags))
+++#endif
+++#ifndef SvPV_force_flags_mutable
+++# define SvPV_force_flags_mutable(sv, lp, flags) \
+++ ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \
+++ ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \
+++ : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN))
+++#endif
+++#ifndef SvPV_nolen
+++# define SvPV_nolen(sv) \
+++ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+++ ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC))
+++#endif
+++#ifndef SvPV_nolen_const
+++# define SvPV_nolen_const(sv) \
+++ ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+++ ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN))
+++#endif
+++#ifndef SvPV_nomg
+++# define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0)
+++#endif
+++
+++#ifndef SvPV_nomg_const
+++# define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0)
+++#endif
+++
+++#ifndef SvPV_nomg_const_nolen
+++# define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0)
+++#endif
+++
+++#ifndef SvPV_nomg_nolen
+++# define SvPV_nomg_nolen(sv) ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+++ ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, 0))
+++#endif
+++#ifndef SvPV_renew
+++# define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \
+++ SvPV_set((sv), (char *) saferealloc( \
+++ (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \
+++ } STMT_END
+++#endif
+++#ifndef SvMAGIC_set
+++# define SvMAGIC_set(sv, val) \
+++ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+++ (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
+++#endif
+++
+++#if (PERL_BCDVERSION < 0x5009003)
+++#ifndef SvPVX_const
+++# define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv)))
+++#endif
+++
+++#ifndef SvPVX_mutable
+++# define SvPVX_mutable(sv) (0 + SvPVX(sv))
+++#endif
+++#ifndef SvRV_set
+++# define SvRV_set(sv, val) \
+++ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \
+++ (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END
+++#endif
+++
+++#else
+++#ifndef SvPVX_const
+++# define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv))
+++#endif
+++
+++#ifndef SvPVX_mutable
+++# define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv)
+++#endif
+++#ifndef SvRV_set
+++# define SvRV_set(sv, val) \
+++ STMT_START { assert(SvTYPE(sv) >= SVt_RV); \
+++ ((sv)->sv_u.svu_rv = (val)); } STMT_END
+++#endif
+++
+++#endif
+++#ifndef SvSTASH_set
+++# define SvSTASH_set(sv, val) \
+++ STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+++ (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
+++#endif
+++
+++#if (PERL_BCDVERSION < 0x5004000)
+++#ifndef SvUV_set
+++# define SvUV_set(sv, val) \
+++ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+++ (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END
+++#endif
+++
+++#else
+++#ifndef SvUV_set
+++# define SvUV_set(sv, val) \
+++ STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+++ (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END
+++#endif
+++
+++#endif
+++
+++#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf)
+++#if defined(NEED_vnewSVpvf)
+++static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
+++static
+++#else
+++extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args);
+++#endif
+++
+++#ifdef vnewSVpvf
+++# undef vnewSVpvf
+++#endif
+++#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b)
+++#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf)
+++
+++#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL)
+++
+++SV *
+++DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args)
+++{
+++ register SV *sv = newSV(0);
+++ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+++ return sv;
+++}
+++
+++#endif
+++#endif
+++
+++#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf)
+++# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+++#endif
+++
+++#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf)
+++# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+++#endif
+++
+++#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg)
+++#if defined(NEED_sv_catpvf_mg)
+++static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+++static
+++#else
+++extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+++#endif
+++
+++#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg)
+++
+++#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL)
+++
+++void
+++DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+++{
+++ va_list args;
+++ va_start(args, pat);
+++ sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+++ SvSETMAGIC(sv);
+++ va_end(args);
+++}
+++
+++#endif
+++#endif
+++
+++#ifdef PERL_IMPLICIT_CONTEXT
+++#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext)
+++#if defined(NEED_sv_catpvf_mg_nocontext)
+++static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+++static
+++#else
+++extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+++#endif
+++
+++#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+++#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+++
+++#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL)
+++
+++void
+++DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+++{
+++ dTHX;
+++ va_list args;
+++ va_start(args, pat);
+++ sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+++ SvSETMAGIC(sv);
+++ va_end(args);
+++}
+++
+++#endif
+++#endif
+++#endif
+++
+++/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */
+++#ifndef sv_catpvf_mg
+++# ifdef PERL_IMPLICIT_CONTEXT
+++# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext
+++# else
+++# define sv_catpvf_mg Perl_sv_catpvf_mg
+++# endif
+++#endif
+++
+++#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg)
+++# define sv_vcatpvf_mg(sv, pat, args) \
+++ STMT_START { \
+++ sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \
+++ SvSETMAGIC(sv); \
+++ } STMT_END
+++#endif
+++
+++#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg)
+++#if defined(NEED_sv_setpvf_mg)
+++static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+++static
+++#else
+++extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...);
+++#endif
+++
+++#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg)
+++
+++#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL)
+++
+++void
+++DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+++{
+++ va_list args;
+++ va_start(args, pat);
+++ sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+++ SvSETMAGIC(sv);
+++ va_end(args);
+++}
+++
+++#endif
+++#endif
+++
+++#ifdef PERL_IMPLICIT_CONTEXT
+++#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext)
+++#if defined(NEED_sv_setpvf_mg_nocontext)
+++static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+++static
+++#else
+++extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...);
+++#endif
+++
+++#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+++#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+++
+++#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL)
+++
+++void
+++DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+++{
+++ dTHX;
+++ va_list args;
+++ va_start(args, pat);
+++ sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+++ SvSETMAGIC(sv);
+++ va_end(args);
+++}
+++
+++#endif
+++#endif
+++#endif
+++
+++/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */
+++#ifndef sv_setpvf_mg
+++# ifdef PERL_IMPLICIT_CONTEXT
+++# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext
+++# else
+++# define sv_setpvf_mg Perl_sv_setpvf_mg
+++# endif
+++#endif
+++
+++#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg)
+++# define sv_vsetpvf_mg(sv, pat, args) \
+++ STMT_START { \
+++ sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \
+++ SvSETMAGIC(sv); \
+++ } STMT_END
+++#endif
+++
+++/* Hint: newSVpvn_share
+++ * The SVs created by this function only mimic the behaviour of
+++ * shared PVs without really being shared. Only use if you know
+++ * what you're doing.
+++ */
+++
+++#ifndef newSVpvn_share
+++
+++#if defined(NEED_newSVpvn_share)
+++static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
+++static
+++#else
+++extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash);
+++#endif
+++
+++#ifdef newSVpvn_share
+++# undef newSVpvn_share
+++#endif
+++#define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c)
+++#define Perl_newSVpvn_share DPPP_(my_newSVpvn_share)
+++
+++#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL)
+++
+++SV *
+++DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash)
+++{
+++ SV *sv;
+++ if (len < 0)
+++ len = -len;
+++ if (!hash)
+++ PERL_HASH(hash, (char*) src, len);
+++ sv = newSVpvn((char *) src, len);
+++ sv_upgrade(sv, SVt_PVIV);
+++ SvIVX(sv) = hash;
+++ SvREADONLY_on(sv);
+++ SvPOK_on(sv);
+++ return sv;
+++}
+++
+++#endif
+++
+++#endif
+++#ifndef SvSHARED_HASH
+++# define SvSHARED_HASH(sv) (0 + SvUVX(sv))
+++#endif
+++#ifndef HvNAME_get
+++# define HvNAME_get(hv) HvNAME(hv)
+++#endif
+++#ifndef HvNAMELEN_get
+++# define HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0)
+++#endif
+++#ifndef GvSVn
+++# define GvSVn(gv) GvSV(gv)
+++#endif
+++
+++#ifndef isGV_with_GP
+++# define isGV_with_GP(gv) isGV(gv)
+++#endif
+++
+++#ifndef gv_fetchpvn_flags
+++# define gv_fetchpvn_flags(name, len, flags, svt) gv_fetchpv(name, flags, svt)
+++#endif
+++
+++#ifndef gv_fetchsv
+++# define gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt)
+++#endif
+++#ifndef get_cvn_flags
+++# define get_cvn_flags(name, namelen, flags) get_cv(name, flags)
+++#endif
+++#ifndef WARN_ALL
+++# define WARN_ALL 0
+++#endif
+++
+++#ifndef WARN_CLOSURE
+++# define WARN_CLOSURE 1
+++#endif
+++
+++#ifndef WARN_DEPRECATED
+++# define WARN_DEPRECATED 2
+++#endif
+++
+++#ifndef WARN_EXITING
+++# define WARN_EXITING 3
+++#endif
+++
+++#ifndef WARN_GLOB
+++# define WARN_GLOB 4
+++#endif
+++
+++#ifndef WARN_IO
+++# define WARN_IO 5
+++#endif
+++
+++#ifndef WARN_CLOSED
+++# define WARN_CLOSED 6
+++#endif
+++
+++#ifndef WARN_EXEC
+++# define WARN_EXEC 7
+++#endif
+++
+++#ifndef WARN_LAYER
+++# define WARN_LAYER 8
+++#endif
+++
+++#ifndef WARN_NEWLINE
+++# define WARN_NEWLINE 9
+++#endif
+++
+++#ifndef WARN_PIPE
+++# define WARN_PIPE 10
+++#endif
+++
+++#ifndef WARN_UNOPENED
+++# define WARN_UNOPENED 11
+++#endif
+++
+++#ifndef WARN_MISC
+++# define WARN_MISC 12
+++#endif
+++
+++#ifndef WARN_NUMERIC
+++# define WARN_NUMERIC 13
+++#endif
+++
+++#ifndef WARN_ONCE
+++# define WARN_ONCE 14
+++#endif
+++
+++#ifndef WARN_OVERFLOW
+++# define WARN_OVERFLOW 15
+++#endif
+++
+++#ifndef WARN_PACK
+++# define WARN_PACK 16
+++#endif
+++
+++#ifndef WARN_PORTABLE
+++# define WARN_PORTABLE 17
+++#endif
+++
+++#ifndef WARN_RECURSION
+++# define WARN_RECURSION 18
+++#endif
+++
+++#ifndef WARN_REDEFINE
+++# define WARN_REDEFINE 19
+++#endif
+++
+++#ifndef WARN_REGEXP
+++# define WARN_REGEXP 20
+++#endif
+++
+++#ifndef WARN_SEVERE
+++# define WARN_SEVERE 21
+++#endif
+++
+++#ifndef WARN_DEBUGGING
+++# define WARN_DEBUGGING 22
+++#endif
+++
+++#ifndef WARN_INPLACE
+++# define WARN_INPLACE 23
+++#endif
+++
+++#ifndef WARN_INTERNAL
+++# define WARN_INTERNAL 24
+++#endif
+++
+++#ifndef WARN_MALLOC
+++# define WARN_MALLOC 25
+++#endif
+++
+++#ifndef WARN_SIGNAL
+++# define WARN_SIGNAL 26
+++#endif
+++
+++#ifndef WARN_SUBSTR
+++# define WARN_SUBSTR 27
+++#endif
+++
+++#ifndef WARN_SYNTAX
+++# define WARN_SYNTAX 28
+++#endif
+++
+++#ifndef WARN_AMBIGUOUS
+++# define WARN_AMBIGUOUS 29
+++#endif
+++
+++#ifndef WARN_BAREWORD
+++# define WARN_BAREWORD 30
+++#endif
+++
+++#ifndef WARN_DIGIT
+++# define WARN_DIGIT 31
+++#endif
+++
+++#ifndef WARN_PARENTHESIS
+++# define WARN_PARENTHESIS 32
+++#endif
+++
+++#ifndef WARN_PRECEDENCE
+++# define WARN_PRECEDENCE 33
+++#endif
+++
+++#ifndef WARN_PRINTF
+++# define WARN_PRINTF 34
+++#endif
+++
+++#ifndef WARN_PROTOTYPE
+++# define WARN_PROTOTYPE 35
+++#endif
+++
+++#ifndef WARN_QW
+++# define WARN_QW 36
+++#endif
+++
+++#ifndef WARN_RESERVED
+++# define WARN_RESERVED 37
+++#endif
+++
+++#ifndef WARN_SEMICOLON
+++# define WARN_SEMICOLON 38
+++#endif
+++
+++#ifndef WARN_TAINT
+++# define WARN_TAINT 39
+++#endif
+++
+++#ifndef WARN_THREADS
+++# define WARN_THREADS 40
+++#endif
+++
+++#ifndef WARN_UNINITIALIZED
+++# define WARN_UNINITIALIZED 41
+++#endif
+++
+++#ifndef WARN_UNPACK
+++# define WARN_UNPACK 42
+++#endif
+++
+++#ifndef WARN_UNTIE
+++# define WARN_UNTIE 43
+++#endif
+++
+++#ifndef WARN_UTF8
+++# define WARN_UTF8 44
+++#endif
+++
+++#ifndef WARN_VOID
+++# define WARN_VOID 45
+++#endif
+++
+++#ifndef WARN_ASSERTIONS
+++# define WARN_ASSERTIONS 46
+++#endif
+++#ifndef packWARN
+++# define packWARN(a) (a)
+++#endif
+++
+++#ifndef ckWARN
+++# ifdef G_WARN_ON
+++# define ckWARN(a) (PL_dowarn & G_WARN_ON)
+++# else
+++# define ckWARN(a) PL_dowarn
+++# endif
+++#endif
+++
+++#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner)
+++#if defined(NEED_warner)
+++static void DPPP_(my_warner)(U32 err, const char *pat, ...);
+++static
+++#else
+++extern void DPPP_(my_warner)(U32 err, const char *pat, ...);
+++#endif
+++
+++#define Perl_warner DPPP_(my_warner)
+++
+++#if defined(NEED_warner) || defined(NEED_warner_GLOBAL)
+++
+++void
+++DPPP_(my_warner)(U32 err, const char *pat, ...)
+++{
+++ SV *sv;
+++ va_list args;
+++
+++ PERL_UNUSED_ARG(err);
+++
+++ va_start(args, pat);
+++ sv = vnewSVpvf(pat, &args);
+++ va_end(args);
+++ sv_2mortal(sv);
+++ warn("%s", SvPV_nolen(sv));
+++}
+++
+++#define warner Perl_warner
+++
+++#define Perl_warner_nocontext Perl_warner
+++
+++#endif
+++#endif
+++
+++/* concatenating with "" ensures that only literal strings are accepted as argument
+++ * note that STR_WITH_LEN() can't be used as argument to macros or functions that
+++ * under some configurations might be macros
+++ */
+++#ifndef STR_WITH_LEN
+++# define STR_WITH_LEN(s) (s ""), (sizeof(s)-1)
+++#endif
+++#ifndef newSVpvs
+++# define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1)
+++#endif
+++
+++#ifndef newSVpvs_flags
+++# define newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags)
+++#endif
+++
+++#ifndef newSVpvs_share
+++# define newSVpvs_share(str) newSVpvn_share(str "", sizeof(str) - 1, 0)
+++#endif
+++
+++#ifndef sv_catpvs
+++# define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1)
+++#endif
+++
+++#ifndef sv_setpvs
+++# define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1)
+++#endif
+++
+++#ifndef hv_fetchs
+++# define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval)
+++#endif
+++
+++#ifndef hv_stores
+++# define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0)
+++#endif
+++#ifndef gv_fetchpvs
+++# define gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt)
+++#endif
+++
+++#ifndef gv_stashpvs
+++# define gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags)
+++#endif
+++#ifndef get_cvs
+++# define get_cvs(name, flags) get_cvn_flags(name "", sizeof(name)-1, flags)
+++#endif
+++#ifndef SvGETMAGIC
+++# define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
+++#endif
+++#ifndef PERL_MAGIC_sv
+++# define PERL_MAGIC_sv '\0'
+++#endif
+++
+++#ifndef PERL_MAGIC_overload
+++# define PERL_MAGIC_overload 'A'
+++#endif
+++
+++#ifndef PERL_MAGIC_overload_elem
+++# define PERL_MAGIC_overload_elem 'a'
+++#endif
+++
+++#ifndef PERL_MAGIC_overload_table
+++# define PERL_MAGIC_overload_table 'c'
+++#endif
+++
+++#ifndef PERL_MAGIC_bm
+++# define PERL_MAGIC_bm 'B'
+++#endif
+++
+++#ifndef PERL_MAGIC_regdata
+++# define PERL_MAGIC_regdata 'D'
+++#endif
+++
+++#ifndef PERL_MAGIC_regdatum
+++# define PERL_MAGIC_regdatum 'd'
+++#endif
+++
+++#ifndef PERL_MAGIC_env
+++# define PERL_MAGIC_env 'E'
+++#endif
+++
+++#ifndef PERL_MAGIC_envelem
+++# define PERL_MAGIC_envelem 'e'
+++#endif
+++
+++#ifndef PERL_MAGIC_fm
+++# define PERL_MAGIC_fm 'f'
+++#endif
+++
+++#ifndef PERL_MAGIC_regex_global
+++# define PERL_MAGIC_regex_global 'g'
+++#endif
+++
+++#ifndef PERL_MAGIC_isa
+++# define PERL_MAGIC_isa 'I'
+++#endif
+++
+++#ifndef PERL_MAGIC_isaelem
+++# define PERL_MAGIC_isaelem 'i'
+++#endif
+++
+++#ifndef PERL_MAGIC_nkeys
+++# define PERL_MAGIC_nkeys 'k'
+++#endif
+++
+++#ifndef PERL_MAGIC_dbfile
+++# define PERL_MAGIC_dbfile 'L'
+++#endif
+++
+++#ifndef PERL_MAGIC_dbline
+++# define PERL_MAGIC_dbline 'l'
+++#endif
+++
+++#ifndef PERL_MAGIC_mutex
+++# define PERL_MAGIC_mutex 'm'
+++#endif
+++
+++#ifndef PERL_MAGIC_shared
+++# define PERL_MAGIC_shared 'N'
+++#endif
+++
+++#ifndef PERL_MAGIC_shared_scalar
+++# define PERL_MAGIC_shared_scalar 'n'
+++#endif
+++
+++#ifndef PERL_MAGIC_collxfrm
+++# define PERL_MAGIC_collxfrm 'o'
+++#endif
+++
+++#ifndef PERL_MAGIC_tied
+++# define PERL_MAGIC_tied 'P'
+++#endif
+++
+++#ifndef PERL_MAGIC_tiedelem
+++# define PERL_MAGIC_tiedelem 'p'
+++#endif
+++
+++#ifndef PERL_MAGIC_tiedscalar
+++# define PERL_MAGIC_tiedscalar 'q'
+++#endif
+++
+++#ifndef PERL_MAGIC_qr
+++# define PERL_MAGIC_qr 'r'
+++#endif
+++
+++#ifndef PERL_MAGIC_sig
+++# define PERL_MAGIC_sig 'S'
+++#endif
+++
+++#ifndef PERL_MAGIC_sigelem
+++# define PERL_MAGIC_sigelem 's'
+++#endif
+++
+++#ifndef PERL_MAGIC_taint
+++# define PERL_MAGIC_taint 't'
+++#endif
+++
+++#ifndef PERL_MAGIC_uvar
+++# define PERL_MAGIC_uvar 'U'
+++#endif
+++
+++#ifndef PERL_MAGIC_uvar_elem
+++# define PERL_MAGIC_uvar_elem 'u'
+++#endif
+++
+++#ifndef PERL_MAGIC_vstring
+++# define PERL_MAGIC_vstring 'V'
+++#endif
+++
+++#ifndef PERL_MAGIC_vec
+++# define PERL_MAGIC_vec 'v'
+++#endif
+++
+++#ifndef PERL_MAGIC_utf8
+++# define PERL_MAGIC_utf8 'w'
+++#endif
+++
+++#ifndef PERL_MAGIC_substr
+++# define PERL_MAGIC_substr 'x'
+++#endif
+++
+++#ifndef PERL_MAGIC_defelem
+++# define PERL_MAGIC_defelem 'y'
+++#endif
+++
+++#ifndef PERL_MAGIC_glob
+++# define PERL_MAGIC_glob '*'
+++#endif
+++
+++#ifndef PERL_MAGIC_arylen
+++# define PERL_MAGIC_arylen '#'
+++#endif
+++
+++#ifndef PERL_MAGIC_pos
+++# define PERL_MAGIC_pos '.'
+++#endif
+++
+++#ifndef PERL_MAGIC_backref
+++# define PERL_MAGIC_backref '<'
+++#endif
+++
+++#ifndef PERL_MAGIC_ext
+++# define PERL_MAGIC_ext '~'
+++#endif
+++
+++/* That's the best we can do... */
+++#ifndef sv_catpvn_nomg
+++# define sv_catpvn_nomg sv_catpvn
+++#endif
+++
+++#ifndef sv_catsv_nomg
+++# define sv_catsv_nomg sv_catsv
+++#endif
+++
+++#ifndef sv_setsv_nomg
+++# define sv_setsv_nomg sv_setsv
+++#endif
+++
+++#ifndef sv_pvn_nomg
+++# define sv_pvn_nomg sv_pvn
+++#endif
+++
+++#ifndef SvIV_nomg
+++# define SvIV_nomg SvIV
+++#endif
+++
+++#ifndef SvUV_nomg
+++# define SvUV_nomg SvUV
+++#endif
+++
+++#ifndef sv_catpv_mg
+++# define sv_catpv_mg(sv, ptr) \
+++ STMT_START { \
+++ SV *TeMpSv = sv; \
+++ sv_catpv(TeMpSv,ptr); \
+++ SvSETMAGIC(TeMpSv); \
+++ } STMT_END
+++#endif
+++
+++#ifndef sv_catpvn_mg
+++# define sv_catpvn_mg(sv, ptr, len) \
+++ STMT_START { \
+++ SV *TeMpSv = sv; \
+++ sv_catpvn(TeMpSv,ptr,len); \
+++ SvSETMAGIC(TeMpSv); \
+++ } STMT_END
+++#endif
+++
+++#ifndef sv_catsv_mg
+++# define sv_catsv_mg(dsv, ssv) \
+++ STMT_START { \
+++ SV *TeMpSv = dsv; \
+++ sv_catsv(TeMpSv,ssv); \
+++ SvSETMAGIC(TeMpSv); \
+++ } STMT_END
+++#endif
+++
+++#ifndef sv_setiv_mg
+++# define sv_setiv_mg(sv, i) \
+++ STMT_START { \
+++ SV *TeMpSv = sv; \
+++ sv_setiv(TeMpSv,i); \
+++ SvSETMAGIC(TeMpSv); \
+++ } STMT_END
+++#endif
+++
+++#ifndef sv_setnv_mg
+++# define sv_setnv_mg(sv, num) \
+++ STMT_START { \
+++ SV *TeMpSv = sv; \
+++ sv_setnv(TeMpSv,num); \
+++ SvSETMAGIC(TeMpSv); \
+++ } STMT_END
+++#endif
+++
+++#ifndef sv_setpv_mg
+++# define sv_setpv_mg(sv, ptr) \
+++ STMT_START { \
+++ SV *TeMpSv = sv; \
+++ sv_setpv(TeMpSv,ptr); \
+++ SvSETMAGIC(TeMpSv); \
+++ } STMT_END
+++#endif
+++
+++#ifndef sv_setpvn_mg
+++# define sv_setpvn_mg(sv, ptr, len) \
+++ STMT_START { \
+++ SV *TeMpSv = sv; \
+++ sv_setpvn(TeMpSv,ptr,len); \
+++ SvSETMAGIC(TeMpSv); \
+++ } STMT_END
+++#endif
+++
+++#ifndef sv_setsv_mg
+++# define sv_setsv_mg(dsv, ssv) \
+++ STMT_START { \
+++ SV *TeMpSv = dsv; \
+++ sv_setsv(TeMpSv,ssv); \
+++ SvSETMAGIC(TeMpSv); \
+++ } STMT_END
+++#endif
+++
+++#ifndef sv_setuv_mg
+++# define sv_setuv_mg(sv, i) \
+++ STMT_START { \
+++ SV *TeMpSv = sv; \
+++ sv_setuv(TeMpSv,i); \
+++ SvSETMAGIC(TeMpSv); \
+++ } STMT_END
+++#endif
+++
+++#ifndef sv_usepvn_mg
+++# define sv_usepvn_mg(sv, ptr, len) \
+++ STMT_START { \
+++ SV *TeMpSv = sv; \
+++ sv_usepvn(TeMpSv,ptr,len); \
+++ SvSETMAGIC(TeMpSv); \
+++ } STMT_END
+++#endif
+++#ifndef SvVSTRING_mg
+++# define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL)
+++#endif
+++
+++/* Hint: sv_magic_portable
+++ * This is a compatibility function that is only available with
+++ * Devel::PPPort. It is NOT in the perl core.
+++ * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when
+++ * it is being passed a name pointer with namlen == 0. In that
+++ * case, perl 5.8.0 and later store the pointer, not a copy of it.
+++ * The compatibility can be provided back to perl 5.004. With
+++ * earlier versions, the code will not compile.
+++ */
+++
+++#if (PERL_BCDVERSION < 0x5004000)
+++
+++ /* code that uses sv_magic_portable will not compile */
+++
+++#elif (PERL_BCDVERSION < 0x5008000)
+++
+++# define sv_magic_portable(sv, obj, how, name, namlen) \
+++ STMT_START { \
+++ SV *SvMp_sv = (sv); \
+++ char *SvMp_name = (char *) (name); \
+++ I32 SvMp_namlen = (namlen); \
+++ if (SvMp_name && SvMp_namlen == 0) \
+++ { \
+++ MAGIC *mg; \
+++ sv_magic(SvMp_sv, obj, how, 0, 0); \
+++ mg = SvMAGIC(SvMp_sv); \
+++ mg->mg_len = -42; /* XXX: this is the tricky part */ \
+++ mg->mg_ptr = SvMp_name; \
+++ } \
+++ else \
+++ { \
+++ sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \
+++ } \
+++ } STMT_END
+++
+++#else
+++
+++# define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e)
+++
+++#endif
+++
+++#ifdef USE_ITHREADS
+++#ifndef CopFILE
+++# define CopFILE(c) ((c)->cop_file)
+++#endif
+++
+++#ifndef CopFILEGV
+++# define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
+++#endif
+++
+++#ifndef CopFILE_set
+++# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv))
+++#endif
+++
+++#ifndef CopFILESV
+++# define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
+++#endif
+++
+++#ifndef CopFILEAV
+++# define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
+++#endif
+++
+++#ifndef CopSTASHPV
+++# define CopSTASHPV(c) ((c)->cop_stashpv)
+++#endif
+++
+++#ifndef CopSTASHPV_set
+++# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
+++#endif
+++
+++#ifndef CopSTASH
+++# define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
+++#endif
+++
+++#ifndef CopSTASH_set
+++# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
+++#endif
+++
+++#ifndef CopSTASH_eq
+++# define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
+++ || (CopSTASHPV(c) && HvNAME(hv) \
+++ && strEQ(CopSTASHPV(c), HvNAME(hv)))))
+++#endif
+++
+++#else
+++#ifndef CopFILEGV
+++# define CopFILEGV(c) ((c)->cop_filegv)
+++#endif
+++
+++#ifndef CopFILEGV_set
+++# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
+++#endif
+++
+++#ifndef CopFILE_set
+++# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv))
+++#endif
+++
+++#ifndef CopFILESV
+++# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
+++#endif
+++
+++#ifndef CopFILEAV
+++# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
+++#endif
+++
+++#ifndef CopFILE
+++# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
+++#endif
+++
+++#ifndef CopSTASH
+++# define CopSTASH(c) ((c)->cop_stash)
+++#endif
+++
+++#ifndef CopSTASH_set
+++# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv))
+++#endif
+++
+++#ifndef CopSTASHPV
+++# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
+++#endif
+++
+++#ifndef CopSTASHPV_set
+++# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
+++#endif
+++
+++#ifndef CopSTASH_eq
+++# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv))
+++#endif
+++
+++#endif /* USE_ITHREADS */
+++#ifndef IN_PERL_COMPILETIME
+++# define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling)
+++#endif
+++
+++#ifndef IN_LOCALE_RUNTIME
+++# define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE)
+++#endif
+++
+++#ifndef IN_LOCALE_COMPILETIME
+++# define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE)
+++#endif
+++
+++#ifndef IN_LOCALE
+++# define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
+++#endif
+++#ifndef IS_NUMBER_IN_UV
+++# define IS_NUMBER_IN_UV 0x01
+++#endif
+++
+++#ifndef IS_NUMBER_GREATER_THAN_UV_MAX
+++# define IS_NUMBER_GREATER_THAN_UV_MAX 0x02
+++#endif
+++
+++#ifndef IS_NUMBER_NOT_INT
+++# define IS_NUMBER_NOT_INT 0x04
+++#endif
+++
+++#ifndef IS_NUMBER_NEG
+++# define IS_NUMBER_NEG 0x08
+++#endif
+++
+++#ifndef IS_NUMBER_INFINITY
+++# define IS_NUMBER_INFINITY 0x10
+++#endif
+++
+++#ifndef IS_NUMBER_NAN
+++# define IS_NUMBER_NAN 0x20
+++#endif
+++#ifndef GROK_NUMERIC_RADIX
+++# define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send)
+++#endif
+++#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
+++# define PERL_SCAN_GREATER_THAN_UV_MAX 0x02
+++#endif
+++
+++#ifndef PERL_SCAN_SILENT_ILLDIGIT
+++# define PERL_SCAN_SILENT_ILLDIGIT 0x04
+++#endif
+++
+++#ifndef PERL_SCAN_ALLOW_UNDERSCORES
+++# define PERL_SCAN_ALLOW_UNDERSCORES 0x01
+++#endif
+++
+++#ifndef PERL_SCAN_DISALLOW_PREFIX
+++# define PERL_SCAN_DISALLOW_PREFIX 0x02
+++#endif
+++
+++#ifndef grok_numeric_radix
+++#if defined(NEED_grok_numeric_radix)
+++static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+++static
+++#else
+++extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+++#endif
+++
+++#ifdef grok_numeric_radix
+++# undef grok_numeric_radix
+++#endif
+++#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b)
+++#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix)
+++
+++#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL)
+++bool
+++DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
+++{
+++#ifdef USE_LOCALE_NUMERIC
+++#ifdef PL_numeric_radix_sv
+++ if (PL_numeric_radix_sv && IN_LOCALE) {
+++ STRLEN len;
+++ char* radix = SvPV(PL_numeric_radix_sv, len);
+++ if (*sp + len <= send && memEQ(*sp, radix, len)) {
+++ *sp += len;
+++ return TRUE;
+++ }
+++ }
+++#else
+++ /* older perls don't have PL_numeric_radix_sv so the radix
+++ * must manually be requested from locale.h
+++ */
+++#include <locale.h>
+++ dTHR; /* needed for older threaded perls */
+++ struct lconv *lc = localeconv();
+++ char *radix = lc->decimal_point;
+++ if (radix && IN_LOCALE) {
+++ STRLEN len = strlen(radix);
+++ if (*sp + len <= send && memEQ(*sp, radix, len)) {
+++ *sp += len;
+++ return TRUE;
+++ }
+++ }
+++#endif
+++#endif /* USE_LOCALE_NUMERIC */
+++ /* always try "." if numeric radix didn't match because
+++ * we may have data from different locales mixed */
+++ if (*sp < send && **sp == '.') {
+++ ++*sp;
+++ return TRUE;
+++ }
+++ return FALSE;
+++}
+++#endif
+++#endif
+++
+++#ifndef grok_number
+++#if defined(NEED_grok_number)
+++static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+++static
+++#else
+++extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+++#endif
+++
+++#ifdef grok_number
+++# undef grok_number
+++#endif
+++#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c)
+++#define Perl_grok_number DPPP_(my_grok_number)
+++
+++#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL)
+++int
+++DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
+++{
+++ const char *s = pv;
+++ const char *send = pv + len;
+++ const UV max_div_10 = UV_MAX / 10;
+++ const char max_mod_10 = UV_MAX % 10;
+++ int numtype = 0;
+++ int sawinf = 0;
+++ int sawnan = 0;
+++
+++ while (s < send && isSPACE(*s))
+++ s++;
+++ if (s == send) {
+++ return 0;
+++ } else if (*s == '-') {
+++ s++;
+++ numtype = IS_NUMBER_NEG;
+++ }
+++ else if (*s == '+')
+++ s++;
+++
+++ if (s == send)
+++ return 0;
+++
+++ /* next must be digit or the radix separator or beginning of infinity */
+++ if (isDIGIT(*s)) {
+++ /* UVs are at least 32 bits, so the first 9 decimal digits cannot
+++ overflow. */
+++ UV value = *s - '0';
+++ /* This construction seems to be more optimiser friendly.
+++ (without it gcc does the isDIGIT test and the *s - '0' separately)
+++ With it gcc on arm is managing 6 instructions (6 cycles) per digit.
+++ In theory the optimiser could deduce how far to unroll the loop
+++ before checking for overflow. */
+++ if (++s < send) {
+++ int digit = *s - '0';
+++ if (digit >= 0 && digit <= 9) {
+++ value = value * 10 + digit;
+++ if (++s < send) {
+++ digit = *s - '0';
+++ if (digit >= 0 && digit <= 9) {
+++ value = value * 10 + digit;
+++ if (++s < send) {
+++ digit = *s - '0';
+++ if (digit >= 0 && digit <= 9) {
+++ value = value * 10 + digit;
+++ if (++s < send) {
+++ digit = *s - '0';
+++ if (digit >= 0 && digit <= 9) {
+++ value = value * 10 + digit;
+++ if (++s < send) {
+++ digit = *s - '0';
+++ if (digit >= 0 && digit <= 9) {
+++ value = value * 10 + digit;
+++ if (++s < send) {
+++ digit = *s - '0';
+++ if (digit >= 0 && digit <= 9) {
+++ value = value * 10 + digit;
+++ if (++s < send) {
+++ digit = *s - '0';
+++ if (digit >= 0 && digit <= 9) {
+++ value = value * 10 + digit;
+++ if (++s < send) {
+++ digit = *s - '0';
+++ if (digit >= 0 && digit <= 9) {
+++ value = value * 10 + digit;
+++ if (++s < send) {
+++ /* Now got 9 digits, so need to check
+++ each time for overflow. */
+++ digit = *s - '0';
+++ while (digit >= 0 && digit <= 9
+++ && (value < max_div_10
+++ || (value == max_div_10
+++ && digit <= max_mod_10))) {
+++ value = value * 10 + digit;
+++ if (++s < send)
+++ digit = *s - '0';
+++ else
+++ break;
+++ }
+++ if (digit >= 0 && digit <= 9
+++ && (s < send)) {
+++ /* value overflowed.
+++ skip the remaining digits, don't
+++ worry about setting *valuep. */
+++ do {
+++ s++;
+++ } while (s < send && isDIGIT(*s));
+++ numtype |=
+++ IS_NUMBER_GREATER_THAN_UV_MAX;
+++ goto skip_value;
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ }
+++ numtype |= IS_NUMBER_IN_UV;
+++ if (valuep)
+++ *valuep = value;
+++
+++ skip_value:
+++ if (GROK_NUMERIC_RADIX(&s, send)) {
+++ numtype |= IS_NUMBER_NOT_INT;
+++ while (s < send && isDIGIT(*s)) /* optional digits after the radix */
+++ s++;
+++ }
+++ }
+++ else if (GROK_NUMERIC_RADIX(&s, send)) {
+++ numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
+++ /* no digits before the radix means we need digits after it */
+++ if (s < send && isDIGIT(*s)) {
+++ do {
+++ s++;
+++ } while (s < send && isDIGIT(*s));
+++ if (valuep) {
+++ /* integer approximation is valid - it's 0. */
+++ *valuep = 0;
+++ }
+++ }
+++ else
+++ return 0;
+++ } else if (*s == 'I' || *s == 'i') {
+++ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+++ s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
+++ s++; if (s < send && (*s == 'I' || *s == 'i')) {
+++ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+++ s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
+++ s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
+++ s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
+++ s++;
+++ }
+++ sawinf = 1;
+++ } else if (*s == 'N' || *s == 'n') {
+++ /* XXX TODO: There are signaling NaNs and quiet NaNs. */
+++ s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
+++ s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+++ s++;
+++ sawnan = 1;
+++ } else
+++ return 0;
+++
+++ if (sawinf) {
+++ numtype &= IS_NUMBER_NEG; /* Keep track of sign */
+++ numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
+++ } else if (sawnan) {
+++ numtype &= IS_NUMBER_NEG; /* Keep track of sign */
+++ numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
+++ } else if (s < send) {
+++ /* we can have an optional exponent part */
+++ if (*s == 'e' || *s == 'E') {
+++ /* The only flag we keep is sign. Blow away any "it's UV" */
+++ numtype &= IS_NUMBER_NEG;
+++ numtype |= IS_NUMBER_NOT_INT;
+++ s++;
+++ if (s < send && (*s == '-' || *s == '+'))
+++ s++;
+++ if (s < send && isDIGIT(*s)) {
+++ do {
+++ s++;
+++ } while (s < send && isDIGIT(*s));
+++ }
+++ else
+++ return 0;
+++ }
+++ }
+++ while (s < send && isSPACE(*s))
+++ s++;
+++ if (s >= send)
+++ return numtype;
+++ if (len == 10 && memEQ(pv, "0 but true", 10)) {
+++ if (valuep)
+++ *valuep = 0;
+++ return IS_NUMBER_IN_UV;
+++ }
+++ return 0;
+++}
+++#endif
+++#endif
+++
+++/*
+++ * The grok_* routines have been modified to use warn() instead of
+++ * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
+++ * which is why the stack variable has been renamed to 'xdigit'.
+++ */
+++
+++#ifndef grok_bin
+++#if defined(NEED_grok_bin)
+++static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+++static
+++#else
+++extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+++#endif
+++
+++#ifdef grok_bin
+++# undef grok_bin
+++#endif
+++#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d)
+++#define Perl_grok_bin DPPP_(my_grok_bin)
+++
+++#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
+++UV
+++DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+++{
+++ const char *s = start;
+++ STRLEN len = *len_p;
+++ UV value = 0;
+++ NV value_nv = 0;
+++
+++ const UV max_div_2 = UV_MAX / 2;
+++ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+++ bool overflowed = FALSE;
+++
+++ if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+++ /* strip off leading b or 0b.
+++ for compatibility silently suffer "b" and "0b" as valid binary
+++ numbers. */
+++ if (len >= 1) {
+++ if (s[0] == 'b') {
+++ s++;
+++ len--;
+++ }
+++ else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
+++ s+=2;
+++ len-=2;
+++ }
+++ }
+++ }
+++
+++ for (; len-- && *s; s++) {
+++ char bit = *s;
+++ if (bit == '0' || bit == '1') {
+++ /* Write it in this wonky order with a goto to attempt to get the
+++ compiler to make the common case integer-only loop pretty tight.
+++ With gcc seems to be much straighter code than old scan_bin. */
+++ redo:
+++ if (!overflowed) {
+++ if (value <= max_div_2) {
+++ value = (value << 1) | (bit - '0');
+++ continue;
+++ }
+++ /* Bah. We're just overflowed. */
+++ warn("Integer overflow in binary number");
+++ overflowed = TRUE;
+++ value_nv = (NV) value;
+++ }
+++ value_nv *= 2.0;
+++ /* If an NV has not enough bits in its mantissa to
+++ * represent a UV this summing of small low-order numbers
+++ * is a waste of time (because the NV cannot preserve
+++ * the low-order bits anyway): we could just remember when
+++ * did we overflow and in the end just multiply value_nv by the
+++ * right amount. */
+++ value_nv += (NV)(bit - '0');
+++ continue;
+++ }
+++ if (bit == '_' && len && allow_underscores && (bit = s[1])
+++ && (bit == '0' || bit == '1'))
+++ {
+++ --len;
+++ ++s;
+++ goto redo;
+++ }
+++ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+++ warn("Illegal binary digit '%c' ignored", *s);
+++ break;
+++ }
+++
+++ if ( ( overflowed && value_nv > 4294967295.0)
+++#if UVSIZE > 4
+++ || (!overflowed && value > 0xffffffff )
+++#endif
+++ ) {
+++ warn("Binary number > 0b11111111111111111111111111111111 non-portable");
+++ }
+++ *len_p = s - start;
+++ if (!overflowed) {
+++ *flags = 0;
+++ return value;
+++ }
+++ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+++ if (result)
+++ *result = value_nv;
+++ return UV_MAX;
+++}
+++#endif
+++#endif
+++
+++#ifndef grok_hex
+++#if defined(NEED_grok_hex)
+++static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+++static
+++#else
+++extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+++#endif
+++
+++#ifdef grok_hex
+++# undef grok_hex
+++#endif
+++#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d)
+++#define Perl_grok_hex DPPP_(my_grok_hex)
+++
+++#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
+++UV
+++DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+++{
+++ const char *s = start;
+++ STRLEN len = *len_p;
+++ UV value = 0;
+++ NV value_nv = 0;
+++
+++ const UV max_div_16 = UV_MAX / 16;
+++ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+++ bool overflowed = FALSE;
+++ const char *xdigit;
+++
+++ if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+++ /* strip off leading x or 0x.
+++ for compatibility silently suffer "x" and "0x" as valid hex numbers.
+++ */
+++ if (len >= 1) {
+++ if (s[0] == 'x') {
+++ s++;
+++ len--;
+++ }
+++ else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
+++ s+=2;
+++ len-=2;
+++ }
+++ }
+++ }
+++
+++ for (; len-- && *s; s++) {
+++ xdigit = strchr((char *) PL_hexdigit, *s);
+++ if (xdigit) {
+++ /* Write it in this wonky order with a goto to attempt to get the
+++ compiler to make the common case integer-only loop pretty tight.
+++ With gcc seems to be much straighter code than old scan_hex. */
+++ redo:
+++ if (!overflowed) {
+++ if (value <= max_div_16) {
+++ value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
+++ continue;
+++ }
+++ warn("Integer overflow in hexadecimal number");
+++ overflowed = TRUE;
+++ value_nv = (NV) value;
+++ }
+++ value_nv *= 16.0;
+++ /* If an NV has not enough bits in its mantissa to
+++ * represent a UV this summing of small low-order numbers
+++ * is a waste of time (because the NV cannot preserve
+++ * the low-order bits anyway): we could just remember when
+++ * did we overflow and in the end just multiply value_nv by the
+++ * right amount of 16-tuples. */
+++ value_nv += (NV)((xdigit - PL_hexdigit) & 15);
+++ continue;
+++ }
+++ if (*s == '_' && len && allow_underscores && s[1]
+++ && (xdigit = strchr((char *) PL_hexdigit, s[1])))
+++ {
+++ --len;
+++ ++s;
+++ goto redo;
+++ }
+++ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+++ warn("Illegal hexadecimal digit '%c' ignored", *s);
+++ break;
+++ }
+++
+++ if ( ( overflowed && value_nv > 4294967295.0)
+++#if UVSIZE > 4
+++ || (!overflowed && value > 0xffffffff )
+++#endif
+++ ) {
+++ warn("Hexadecimal number > 0xffffffff non-portable");
+++ }
+++ *len_p = s - start;
+++ if (!overflowed) {
+++ *flags = 0;
+++ return value;
+++ }
+++ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+++ if (result)
+++ *result = value_nv;
+++ return UV_MAX;
+++}
+++#endif
+++#endif
+++
+++#ifndef grok_oct
+++#if defined(NEED_grok_oct)
+++static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+++static
+++#else
+++extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result);
+++#endif
+++
+++#ifdef grok_oct
+++# undef grok_oct
+++#endif
+++#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d)
+++#define Perl_grok_oct DPPP_(my_grok_oct)
+++
+++#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
+++UV
+++DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result)
+++{
+++ const char *s = start;
+++ STRLEN len = *len_p;
+++ UV value = 0;
+++ NV value_nv = 0;
+++
+++ const UV max_div_8 = UV_MAX / 8;
+++ bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+++ bool overflowed = FALSE;
+++
+++ for (; len-- && *s; s++) {
+++ /* gcc 2.95 optimiser not smart enough to figure that this subtraction
+++ out front allows slicker code. */
+++ int digit = *s - '0';
+++ if (digit >= 0 && digit <= 7) {
+++ /* Write it in this wonky order with a goto to attempt to get the
+++ compiler to make the common case integer-only loop pretty tight.
+++ */
+++ redo:
+++ if (!overflowed) {
+++ if (value <= max_div_8) {
+++ value = (value << 3) | digit;
+++ continue;
+++ }
+++ /* Bah. We're just overflowed. */
+++ warn("Integer overflow in octal number");
+++ overflowed = TRUE;
+++ value_nv = (NV) value;
+++ }
+++ value_nv *= 8.0;
+++ /* If an NV has not enough bits in its mantissa to
+++ * represent a UV this summing of small low-order numbers
+++ * is a waste of time (because the NV cannot preserve
+++ * the low-order bits anyway): we could just remember when
+++ * did we overflow and in the end just multiply value_nv by the
+++ * right amount of 8-tuples. */
+++ value_nv += (NV)digit;
+++ continue;
+++ }
+++ if (digit == ('_' - '0') && len && allow_underscores
+++ && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
+++ {
+++ --len;
+++ ++s;
+++ goto redo;
+++ }
+++ /* Allow \octal to work the DWIM way (that is, stop scanning
+++ * as soon as non-octal characters are seen, complain only iff
+++ * someone seems to want to use the digits eight and nine). */
+++ if (digit == 8 || digit == 9) {
+++ if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+++ warn("Illegal octal digit '%c' ignored", *s);
+++ }
+++ break;
+++ }
+++
+++ if ( ( overflowed && value_nv > 4294967295.0)
+++#if UVSIZE > 4
+++ || (!overflowed && value > 0xffffffff )
+++#endif
+++ ) {
+++ warn("Octal number > 037777777777 non-portable");
+++ }
+++ *len_p = s - start;
+++ if (!overflowed) {
+++ *flags = 0;
+++ return value;
+++ }
+++ *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+++ if (result)
+++ *result = value_nv;
+++ return UV_MAX;
+++}
+++#endif
+++#endif
+++
+++#if !defined(my_snprintf)
+++#if defined(NEED_my_snprintf)
+++static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+++static
+++#else
+++extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+++#endif
+++
+++#define my_snprintf DPPP_(my_my_snprintf)
+++#define Perl_my_snprintf DPPP_(my_my_snprintf)
+++
+++#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL)
+++
+++int
+++DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...)
+++{
+++ dTHX;
+++ int retval;
+++ va_list ap;
+++ va_start(ap, format);
+++#ifdef HAS_VSNPRINTF
+++ retval = vsnprintf(buffer, len, format, ap);
+++#else
+++ retval = vsprintf(buffer, format, ap);
+++#endif
+++ va_end(ap);
+++ if (retval < 0 || (len > 0 && (Size_t)retval >= len))
+++ Perl_croak(aTHX_ "panic: my_snprintf buffer overflow");
+++ return retval;
+++}
+++
+++#endif
+++#endif
+++
+++#if !defined(my_sprintf)
+++#if defined(NEED_my_sprintf)
+++static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
+++static
+++#else
+++extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...);
+++#endif
+++
+++#define my_sprintf DPPP_(my_my_sprintf)
+++#define Perl_my_sprintf DPPP_(my_my_sprintf)
+++
+++#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL)
+++
+++int
+++DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...)
+++{
+++ va_list args;
+++ va_start(args, pat);
+++ vsprintf(buffer, pat, args);
+++ va_end(args);
+++ return strlen(buffer);
+++}
+++
+++#endif
+++#endif
+++
+++#ifdef NO_XSLOCKS
+++# ifdef dJMPENV
+++# define dXCPT dJMPENV; int rEtV = 0
+++# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0)
+++# define XCPT_TRY_END JMPENV_POP;
+++# define XCPT_CATCH if (rEtV != 0)
+++# define XCPT_RETHROW JMPENV_JUMP(rEtV)
+++# else
+++# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0
+++# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
+++# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf);
+++# define XCPT_CATCH if (rEtV != 0)
+++# define XCPT_RETHROW Siglongjmp(top_env, rEtV)
+++# endif
+++#endif
+++
+++#if !defined(my_strlcat)
+++#if defined(NEED_my_strlcat)
+++static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+++static
+++#else
+++extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+++#endif
+++
+++#define my_strlcat DPPP_(my_my_strlcat)
+++#define Perl_my_strlcat DPPP_(my_my_strlcat)
+++
+++#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL)
+++
+++Size_t
+++DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size)
+++{
+++ Size_t used, length, copy;
+++
+++ used = strlen(dst);
+++ length = strlen(src);
+++ if (size > 0 && used < size - 1) {
+++ copy = (length >= size - used) ? size - used - 1 : length;
+++ memcpy(dst + used, src, copy);
+++ dst[used + copy] = '\0';
+++ }
+++ return used + length;
+++}
+++#endif
+++#endif
+++
+++#if !defined(my_strlcpy)
+++#if defined(NEED_my_strlcpy)
+++static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+++static
+++#else
+++extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+++#endif
+++
+++#define my_strlcpy DPPP_(my_my_strlcpy)
+++#define Perl_my_strlcpy DPPP_(my_my_strlcpy)
+++
+++#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL)
+++
+++Size_t
+++DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size)
+++{
+++ Size_t length, copy;
+++
+++ length = strlen(src);
+++ if (size > 0) {
+++ copy = (length >= size) ? size - 1 : length;
+++ memcpy(dst, src, copy);
+++ dst[copy] = '\0';
+++ }
+++ return length;
+++}
+++
+++#endif
+++#endif
+++#ifndef PERL_PV_ESCAPE_QUOTE
+++# define PERL_PV_ESCAPE_QUOTE 0x0001
+++#endif
+++
+++#ifndef PERL_PV_PRETTY_QUOTE
+++# define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE
+++#endif
+++
+++#ifndef PERL_PV_PRETTY_ELLIPSES
+++# define PERL_PV_PRETTY_ELLIPSES 0x0002
+++#endif
+++
+++#ifndef PERL_PV_PRETTY_LTGT
+++# define PERL_PV_PRETTY_LTGT 0x0004
+++#endif
+++
+++#ifndef PERL_PV_ESCAPE_FIRSTCHAR
+++# define PERL_PV_ESCAPE_FIRSTCHAR 0x0008
+++#endif
+++
+++#ifndef PERL_PV_ESCAPE_UNI
+++# define PERL_PV_ESCAPE_UNI 0x0100
+++#endif
+++
+++#ifndef PERL_PV_ESCAPE_UNI_DETECT
+++# define PERL_PV_ESCAPE_UNI_DETECT 0x0200
+++#endif
+++
+++#ifndef PERL_PV_ESCAPE_ALL
+++# define PERL_PV_ESCAPE_ALL 0x1000
+++#endif
+++
+++#ifndef PERL_PV_ESCAPE_NOBACKSLASH
+++# define PERL_PV_ESCAPE_NOBACKSLASH 0x2000
+++#endif
+++
+++#ifndef PERL_PV_ESCAPE_NOCLEAR
+++# define PERL_PV_ESCAPE_NOCLEAR 0x4000
+++#endif
+++
+++#ifndef PERL_PV_ESCAPE_RE
+++# define PERL_PV_ESCAPE_RE 0x8000
+++#endif
+++
+++#ifndef PERL_PV_PRETTY_NOCLEAR
+++# define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR
+++#endif
+++#ifndef PERL_PV_PRETTY_DUMP
+++# define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE
+++#endif
+++
+++#ifndef PERL_PV_PRETTY_REGPROP
+++# define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE
+++#endif
+++
+++/* Hint: pv_escape
+++ * Note that unicode functionality is only backported to
+++ * those perl versions that support it. For older perl
+++ * versions, the implementation will fall back to bytes.
+++ */
+++
+++#ifndef pv_escape
+++#if defined(NEED_pv_escape)
+++static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
+++static
+++#else
+++extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags);
+++#endif
+++
+++#ifdef pv_escape
+++# undef pv_escape
+++#endif
+++#define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f)
+++#define Perl_pv_escape DPPP_(my_pv_escape)
+++
+++#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL)
+++
+++char *
+++DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str,
+++ const STRLEN count, const STRLEN max,
+++ STRLEN * const escaped, const U32 flags)
+++{
+++ const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\';
+++ const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc;
+++ char octbuf[32] = "%123456789ABCDF";
+++ STRLEN wrote = 0;
+++ STRLEN chsize = 0;
+++ STRLEN readsize = 1;
+++#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+++ bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0;
+++#endif
+++ const char *pv = str;
+++ const char * const end = pv + count;
+++ octbuf[0] = esc;
+++
+++ if (!(flags & PERL_PV_ESCAPE_NOCLEAR))
+++ sv_setpvs(dsv, "");
+++
+++#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+++ if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count))
+++ isuni = 1;
+++#endif
+++
+++ for (; pv < end && (!max || wrote < max) ; pv += readsize) {
+++ const UV u =
+++#if defined(is_utf8_string) && defined(utf8_to_uvchr)
+++ isuni ? utf8_to_uvchr((U8*)pv, &readsize) :
+++#endif
+++ (U8)*pv;
+++ const U8 c = (U8)u & 0xFF;
+++
+++ if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) {
+++ if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
+++ chsize = my_snprintf(octbuf, sizeof octbuf,
+++ "%"UVxf, u);
+++ else
+++ chsize = my_snprintf(octbuf, sizeof octbuf,
+++ "%cx{%"UVxf"}", esc, u);
+++ } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) {
+++ chsize = 1;
+++ } else {
+++ if (c == dq || c == esc || !isPRINT(c)) {
+++ chsize = 2;
+++ switch (c) {
+++ case '\\' : /* fallthrough */
+++ case '%' : if (c == esc)
+++ octbuf[1] = esc;
+++ else
+++ chsize = 1;
+++ break;
+++ case '\v' : octbuf[1] = 'v'; break;
+++ case '\t' : octbuf[1] = 't'; break;
+++ case '\r' : octbuf[1] = 'r'; break;
+++ case '\n' : octbuf[1] = 'n'; break;
+++ case '\f' : octbuf[1] = 'f'; break;
+++ case '"' : if (dq == '"')
+++ octbuf[1] = '"';
+++ else
+++ chsize = 1;
+++ break;
+++ default: chsize = my_snprintf(octbuf, sizeof octbuf,
+++ pv < end && isDIGIT((U8)*(pv+readsize))
+++ ? "%c%03o" : "%c%o", esc, c);
+++ }
+++ } else {
+++ chsize = 1;
+++ }
+++ }
+++ if (max && wrote + chsize > max) {
+++ break;
+++ } else if (chsize > 1) {
+++ sv_catpvn(dsv, octbuf, chsize);
+++ wrote += chsize;
+++ } else {
+++ char tmp[2];
+++ my_snprintf(tmp, sizeof tmp, "%c", c);
+++ sv_catpvn(dsv, tmp, 1);
+++ wrote++;
+++ }
+++ if (flags & PERL_PV_ESCAPE_FIRSTCHAR)
+++ break;
+++ }
+++ if (escaped != NULL)
+++ *escaped= pv - str;
+++ return SvPVX(dsv);
+++}
+++
+++#endif
+++#endif
+++
+++#ifndef pv_pretty
+++#if defined(NEED_pv_pretty)
+++static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
+++static
+++#else
+++extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags);
+++#endif
+++
+++#ifdef pv_pretty
+++# undef pv_pretty
+++#endif
+++#define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g)
+++#define Perl_pv_pretty DPPP_(my_pv_pretty)
+++
+++#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL)
+++
+++char *
+++DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count,
+++ const STRLEN max, char const * const start_color, char const * const end_color,
+++ const U32 flags)
+++{
+++ const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%';
+++ STRLEN escaped;
+++
+++ if (!(flags & PERL_PV_PRETTY_NOCLEAR))
+++ sv_setpvs(dsv, "");
+++
+++ if (dq == '"')
+++ sv_catpvs(dsv, "\"");
+++ else if (flags & PERL_PV_PRETTY_LTGT)
+++ sv_catpvs(dsv, "<");
+++
+++ if (start_color != NULL)
+++ sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color));
+++
+++ pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR);
+++
+++ if (end_color != NULL)
+++ sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color));
+++
+++ if (dq == '"')
+++ sv_catpvs(dsv, "\"");
+++ else if (flags & PERL_PV_PRETTY_LTGT)
+++ sv_catpvs(dsv, ">");
+++
+++ if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count)
+++ sv_catpvs(dsv, "...");
+++
+++ return SvPVX(dsv);
+++}
+++
+++#endif
+++#endif
+++
+++#ifndef pv_display
+++#if defined(NEED_pv_display)
+++static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
+++static
+++#else
+++extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim);
+++#endif
+++
+++#ifdef pv_display
+++# undef pv_display
+++#endif
+++#define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e)
+++#define Perl_pv_display DPPP_(my_pv_display)
+++
+++#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL)
+++
+++char *
+++DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
+++{
+++ pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP);
+++ if (len > cur && pv[cur] == '\0')
+++ sv_catpvs(dsv, "\\0");
+++ return SvPVX(dsv);
+++}
+++
+++#endif
+++#endif
+++
+++#endif /* _P_P_PORTABILITY_H_ */
+++
+++/* End of File ppport.h */
+diff --git a/feeds/packages/lang/perl-xml-parser/patches/020-xml-parser-expat-lib-inc-path-anchor.patch b/feeds/packages/lang/perl-xml-parser/patches/020-xml-parser-expat-lib-inc-path-anchor.patch
+new file mode 100644
+index 0000000..4e17daa
+--- /dev/null
++++ b/feeds/packages/lang/perl-xml-parser/patches/020-xml-parser-expat-lib-inc-path-anchor.patch
+@@ -0,0 +1,12 @@
++--- a/Expat/Makefile.PL
+++++ b/Expat/Makefile.PL
++@@ -2,6 +2,9 @@ use ExtUtils::MakeMaker;
++ use Config;
++ use English;
++
+++$expat_libpath = '%%EXPAT_LIBPATH%%';
+++$expat_incpath = '%%EXPAT_INCPATH%%';
+++
++ my $libs = "-lexpat";
++ my @extras = ();
++
+diff --git a/feeds/packages/lang/perl/Config.in b/feeds/packages/lang/perl/Config.in
+new file mode 100644
+index 0000000..14aedc2
+--- /dev/null
++++ b/feeds/packages/lang/perl/Config.in
+@@ -0,0 +1,20 @@
++menu "Configuration"
++ depends on PACKAGE_perl
++
++config PERL_THREADS
++ bool "Enable threading support"
++ default y if (mips || mipsel || i386 || i686 || x86_64 || armeb || arm)
++ default n
++
++config PERL_TESTS
++ bool "Include perl tests"
++ default n
++ help
++ Include test suites for all perl packages.
++
++ This will increase the size of perl and related packages
++ considerably.
++ Test support is still in development. Some tests will fail,
++ others are just missing completely.
++
++endmenu
+diff --git a/feeds/packages/lang/perl/Makefile b/feeds/packages/lang/perl/Makefile
+new file mode 100644
+index 0000000..fd20bc8
+--- /dev/null
++++ b/feeds/packages/lang/perl/Makefile
+@@ -0,0 +1,183 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=perl
++PKG_VERSION:=5.22.0
++PKG_RELEASE:=3
++
++PKG_SOURCE_URL:=ftp://ftp.cpan.org/pub/CPAN/src/5.0 \
++ http://www.cpan.org/src/5.0 \
++ ftp://ftp.mpi-sb.mpg.de/pub/perl/CPAN/src/5.0 \
++ http://ftp.mpi-sb.mpg.de/pub/perl/CPAN/src/5.0 \
++ ftp://ftp.gmd.de/mirrors/CPAN/src/5.0 \
++ http://ftp5.gwdg.de/pub/languages/perl/CPAN/src/ \
++ ftp://ftp.funet.fi/pub/languages/perl/CPAN/src/5.0 \
++ http://ftp.funet.fi/pub/languages/perl/CPAN/src/5.0
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=e32cb6a8dda0084f2a43dac76318d68d
++
++PKG_LICENSE:=GPL-1.0+ Artistic-1.0-Perl
++PKG_LICENSE_FILES:=Copying Artistic README
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++# Build settings
++PKG_BUILD_DIR:=$(BUILD_DIR)/perl/$(PKG_NAME)-$(PKG_VERSION)
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/perl/$(PKG_NAME)-$(PKG_VERSION)
++PKG_INSTALL:=1
++PKG_BUILD_DEPENDS:=perl/host
++PKG_BUILD_PARALLEL:=1
++HOST_BUILD_PARALLEL:=1
++
++# Variables used during configuration/build
++HOST_PERL_PREFIX:=$(STAGING_DIR_HOST)/usr
++
++# Filter -g3, it will break Compress-Raw-Zlib
++TARGET_CFLAGS_PERL:=$(patsubst -g3,-g,$(TARGET_CFLAGS))
++TARGET_CPPFLAGS_PERL:=$(patsubst -g3,-g,$(TARGET_CPPFLAGS))
++
++# A list of disabled tests
++# ExtUtils tests are disabled for now as we don't support building
++# native extensions on the target machine at the moment
++PERL_DISABLEDTESTS:=cpan/ExtUtils-Constant cpan/ExtUtils-MakeMaker
++# We're on Linux, so don't even package them
++PERL_DISABLEDTESTS+=cpan/Win32API-File cpan/Win32 ext/VMS-DCLsym ext/VMS-Filespec ext/VMS-Stdio ext/Win32CORE os2/
++# NDBM and ODBM not supported
++PERL_DISABLEDTESTS+=ext/NDBM_File ext/ODBM_File
++
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/host-build.mk
++include perlmod.mk
++
++define Package/perl
++ SUBMENU:=Perl
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=The Perl intepreter
++ URL:=http://www.perl.com/
++ DEPENDS:=+USE_GLIBC:libbsd +PERL_THREADS:libpthread
++endef
++
++define Package/perl/description
++ Perl is a stable, cross platform programming language.
++ It is used for mission critical projects in the public and private sectors
++ and is widely used to program web applications of all needs.
++endef
++
++define Package/perl/config
++ source "$(SOURCE)/Config.in"
++endef
++
++# Static host perl
++define Host/Configure
++ ( cd $(HOST_BUILD_DIR); ./Configure -der -Uusedl -Duserelocatableinc -Dprefix=$(HOST_PERL_PREFIX) $(if $(CONFIG_PERL_THREADS),-Dusethreads,))
++endef
++
++define Host/Install
++ ( cd $(HOST_BUILD_DIR); ./miniperl installperl )
++ $(INSTALL_DIR) $(HOST_PERL_PREFIX)/bin/
++ $(CP) $(HOST_BUILD_DIR)/generate_uudmap $(HOST_PERL_PREFIX)/bin/
++
++ # Link any possibly installed static extension in
++ $(MAKE) -C $(HOST_BUILD_DIR)/relink clean || true
++ ( cd $(HOST_BUILD_DIR)/relink && $(HOST_PERL_PREFIX)/bin/perl Makefile.PL )
++ $(call perlmod/host/relink,$(HOST_BUILD_DIR)/relink)
++endef
++
++# Target perl
++define Build/Configure
++ $(PERL_CMD) files/perlconfig.pl -Dowrt:target_cc='$(TARGET_CC)' \
++ -Dowrt:target_cross='$(TARGET_CROSS)' \
++ -Dowrt:cflags='$(TARGET_CFLAGS_PERL) $(TARGET_CPPFLAGS_PERL)' \
++ -Dowrt:ldflags='-rdynamic $(TARGET_LDFLAGS)' \
++ -Dowrt:libc=$(CONFIG_LIBC) \
++ -Dowrt:ipv6=$(if $($(CONFIG_IPV6)),define,undef) \
++ -Dowrt:threads=$(if $(CONFIG_PERL_THREADS),yes,no) \
++ -Dowrt:staging_dir='$(STAGING_DIR)' \
++ -Dowrt:host_perl_prefix='$(HOST_PERL_PREFIX)' \
++ files/version.config \
++ files/base.config \
++ files/$(patsubst i386,i486,$(ARCH)).config \
++ files/architecture.config \
++ files/signal.config \
++ files/threads.config \
++ files/libc.config \
++ files/misc.config \
++ > $(PKG_BUILD_DIR)/config.sh
++ (cd $(PKG_BUILD_DIR) && ./Configure -S)
++ install -m 0644 $(PKG_BUILD_DIR)/config.h $(PKG_BUILD_DIR)/xconfig.h
++endef
++
++define Build/Compile
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/lib/perl5/$(PERL_VERSION)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/perl5/$(PERL_VERSION) $(1)/usr/lib/perl5/
++endef
++
++define Package/perl/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/perl$(PKG_VERSION) $(1)/usr/bin
++ ln -nsf perl$(PKG_VERSION) $(1)/usr/bin/perl
++
++ $(INSTALL_DIR) $(1)/usr/lib/perl5/$(PERL_VERSION)/CORE
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/perl5/$(PERL_VERSION)/CORE/libperl.so $(1)/usr/lib/perl5/$(PERL_VERSION)/CORE/
++endef
++
++
++$(eval $(call RequireCommand,rsync, \
++ $(PKG_NAME) requires rsync installed on the host-system. \
++))
++
++$(eval $(call BuildPackage,perl))
++$(eval $(call HostBuild))
++
++-include perlbase.mk
++
++# A helper package that includes all sort of supplementary files for tests
++define Package/perl-tests-common
++$(call Package/perlbase-template)
++TITLE:=Common test support files
++DEPENDS:=@PERL_TESTS
++endef
++
++define Package/perl-tests-common/install
++ $(INSTALL_DIR) $(1)/$(PERL_TESTSDIR)
++ $(INSTALL_DIR) $(1)/$(PERL_TESTSDIR)/Porting
++ $(INSTALL_DIR) $(1)/$(PERL_TESTSDIR)/regen
++ $(INSTALL_DIR) $(1)/$(PERL_TESTSDIR)/lib
++ $(INSTALL_DIR) $(1)/usr/lib/perl5/$(PERL_VERSION)/XS
++ $(INSTALL_DIR) $(1)/usr/lib/perl5/$(PERL_VERSION)/auto/XS
++ $(INSTALL_DIR) $(1)/usr/lib/perl5/$(PERL_VERSION)/unicore
++
++ $(CP) $(PKG_BUILD_DIR)/t $(1)/$(PERL_TESTSDIR)
++ $(CP) $(PKG_BUILD_DIR)/Porting $(1)/$(PERL_TESTSDIR)
++ $(CP) $(PKG_BUILD_DIR)/regen $(1)/$(PERL_TESTSDIR)
++ $(CP) $(PKG_BUILD_DIR)/MANIFEST $(1)/$(PERL_TESTSDIR)
++ $(CP) $(PKG_BUILD_DIR)/TestInit.pm $(1)/$(PERL_TESTSDIR)
++ $(CP) $(PKG_BUILD_DIR)/vutil.c $(1)/$(PERL_TESTSDIR)
++ $(CP) $(PKG_BUILD_DIR)/vxs.inc $(1)/$(PERL_TESTSDIR)
++ $(CP) $(PKG_BUILD_DIR)/lib/XS $(1)/usr/lib/perl5/$(PERL_VERSION)/
++ $(CP) $(PKG_BUILD_DIR)/lib/auto/XS $(1)/usr/lib/perl5/$(PERL_VERSION)/auto
++ $(CP) $(PKG_BUILD_DIR)/lib/vmsish.pm $(1)/usr/lib/perl5/$(PERL_VERSION)/
++ $(CP) $(PKG_BUILD_DIR)/lib/vmsish.t $(1)/$(PERL_TESTSDIR)/lib
++ $(CP) $(PKG_BUILD_DIR)/lib/Internals.t $(1)/$(PERL_TESTSDIR)/lib
++ $(CP) $(PKG_BUILD_DIR)/lib/unicore/TestProp.pl $(1)/usr/lib/perl5/$(PERL_VERSION)/unicore
++ $(CP) files/perl-run_tests.sh $(1)/$(PERL_TESTSDIR)/run_tests.sh
++ sed \
++ -e 's!%%PERL_DISABLEDTESTS%%!$(PERL_DISABLEDTESTS)!' \
++ -e 's!%%PERL_VERSION%%!$(PERL_VERSION)!' \
++ -i $(1)/$(PERL_TESTSDIR)/run_tests.sh
++ $(CP) $(PKG_BUILD_DIR)/config_h.SH $(1)/$(PERL_TESTSDIR)
++ $(CP) $(PKG_BUILD_DIR)/perl.h $(1)/$(PERL_TESTSDIR)
++endef
++
++$(eval $(call BuildPackage,perl-tests-common))
+diff --git a/feeds/packages/lang/perl/README.patches b/feeds/packages/lang/perl/README.patches
+new file mode 100644
+index 0000000..5f3b595
+--- /dev/null
++++ b/feeds/packages/lang/perl/README.patches
+@@ -0,0 +1,9 @@
++The patches in this package are loosely sorted into the following categories:
++
++0xx - Bugfixes
++1xx - Cross-compile fixes
++3xx - Workarounds
++7xx - Testsuite fixes
++
++Feel free to add another one if your new patch doesn't seem to fit into an
++existing category.
+\ No newline at end of file
+diff --git a/feeds/packages/lang/perl/files/README.config b/feeds/packages/lang/perl/files/README.config
+new file mode 100644
+index 0000000..a7d14a7
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/README.config
+@@ -0,0 +1,58 @@
++-- Perl configuration --
++
++Perl uses a huge configuration file, normally generated via the Configure script
++at build-time. This fails when cross-compiling though, so we need to supply our
++own.
++
++We're using perlconfig.pl to piece together the final configuration from a bunch
++of configuration files(all ending in .config). Please refer to perlconfig.pl's
++POD for information on usage and syntax.
++
++Throughout the files, you will see a bunch of references to private symbols with
++the prefix "owrt". These are used to control output in an effort to both
++simplify writing configuration files, as well as to provide switchable options
++to select the feature set of the resulting perl installation.
++
++The following will be a summary/quick reference of all private symbols we're
++currently using:
++
++Passed via architecture configuration file(mipsel.config, i486.config, ...)
++---------------------------------------------------------------------------
++Symbol Values Description
++owrt:bits 32/64 Target's native word length.
++owrt:endian little/big Target's endianness.
++owrt:arch mipsel, i486, ... Target's architecture name.
++owrt:sig_count 64/128 Number of signals the target
++ provides(NSIG - 1).
++owrt:sigs * Symbolic names of the first 32 signals
++ this architecture provides, in numeric
++ order. Seperated by whitespaces.
++owrt:sig_name_extra * Symbolic names of any additional signals
++ this architecture provides after
++ owrt:sig_count. Seperated by
++ whitespaces.
++owrt:sig_num_extra * Numeric values associated with the
++ signal names provided in
++ owrt:sig_name_extra. Seperated by
++ whitespaces.
++
++Passed via command line
++-----------------------
++Symbol Values Description
++owrt:libc glibc/uclibc/musl Which C library implementation is in
++ use.
++owrt:threads yes/no Whether to enable threading support.
++owrt:ipv6 define/undef Whether to enable IPv6 support.
++owrt:target_cross * Target architecture's host triplet.
++owrt:target_cc * C compiler to use.
++owrt:cflags * Additional C compiler flags.
++owrt:ldflags * Additional linker flags.
++owrt:staging_dir * Same as OpenWRT buildroot's
++ $(STAGING_DIR).
++owrt:host_perl_prefix * host-perl installation prefix.
++
++Passed via version.config
++-------------------------
++Symbol Values Description
++owrt:perllibpath * Path to perl library files, from the
++ target's point of view.
+diff --git a/feeds/packages/lang/perl/files/architecture.config b/feeds/packages/lang/perl/files/architecture.config
+new file mode 100644
+index 0000000..cc97281
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/architecture.config
+@@ -0,0 +1,121 @@
++alignbytes='8'
++
++($owrt:bits eq '32') {
++ ($owrt:endian eq 'little') {
++ byteorder='1234'
++ }
++ ($owrt:endian eq 'big') {
++ byteorder='4321'
++ }
++
++ # Types
++ ivsize='4'
++ uvsize='4'
++ longsize='4'
++ longdblsize='8'
++ ptrsize='4'
++
++ #quadkind='3'
++ #doublekind='3'
++ #longdblkind='0'
++
++ i8type='signed char'
++ i16type='signed short'
++ i32type='signed long'
++ i64type='signed long long'
++ u32type='unsigned long'
++ u64type='unsigned long long'
++ quadtype='long long'
++ uquadtype='unsigned long long'
++
++ sizesize='4'
++
++ use64bitall='undef'
++ use64bitint='undef'
++
++ uidformat='"lu"'
++ gidformat='"lu"'
++
++ selectminbits='32'
++
++ sGMTIME_max='2147483647'
++ sGMTIME_min='-2147483648'
++ sLOCALTIME_max='2147483647'
++ sLOCALTIME_min='-2147483648'
++
++ sPRIi64='"Li"'
++ sPRIo64='"Lo"'
++ sPRIu64='"Lu"'
++ sPRIx64='"Lx"'
++ sPRId64='"Ld"'
++
++ netdb_host_type='const void *'
++ nv_preserves_uv_bits='32'
++ d_nv_preserves_uv='define'
++ d_printf_format_null='define'
++ d_u32align='undef'
++}
++($owrt:bits eq '64') {
++ ($owrt:endian eq 'little') {
++ byteorder='12345678'
++ }
++ ($owrt:endian eq 'big') {
++ byteorder='87654321'
++ }
++
++ # Types
++ ivsize='8'
++ uvsize='8'
++ longsize='8'
++ longdblsize='16'
++ ptrsize='8'
++
++ quadtype='long'
++
++ i16type='signed short'
++ i32type='signed int'
++ i64type='signed long'
++ i8type='signed char'
++
++ u32type='unsigned int'
++ u64type='unsigned long'
++ uquadtype='unsigned long'
++
++ sizesize='8'
++
++ uidformat='"u"'
++ gidformat='"u"'
++
++ selectminbits='64'
++
++ sGMTIME_max='67768036191676799'
++ sGMTIME_min='-62167219200'
++ sLOCALTIME_max='67768036191673199'
++ sLOCALTIME_min='-62167222408'
++
++ sPRIi64='"li"'
++ sPRIo64='"lo"'
++ sPRIu64='"lu"'
++ sPRIx64='"lx"'
++ sPRId64='"ld"'
++
++ netdb_host_type='char *'
++ nv_preserves_uv_bits='53'
++ d_nv_preserves_uv='undef'
++ d_printf_format_null='undef'
++ d_u32align='define'
++ use64bitall='define'
++ use64bitint='define'
++}
++
++# Only defined by i486 and x86_64. Provide defaults for all others
++(!defined($sPRIEUldbl)) {
++ sPRIEUldbl='"E"'
++ sPRIFUldbl='"F"'
++ sPRIGUldbl='"G"'
++ sPRIXU64='"LX"'
++ sPRIeldbl='"e"'
++ sPRIfldbl='"f"'
++ sPRIgldbl='"g"'
++ sSCNfldbl='"f"'
++}
+diff --git a/feeds/packages/lang/perl/files/arm.config b/feeds/packages/lang/perl/files/arm.config
+new file mode 100644
+index 0000000..75fe254
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/arm.config
+@@ -0,0 +1,19 @@
++owrt:arch=arm
++owrt:bits=32
++owrt:endian=little
++
++ccsymbols='__ARM_ARCH_3__=1'
++cppccsymbols=''
++cppsymbols='__ELF__=1 _FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=2 __GNUC__=3 __GNUC_MINOR__=4 __GNU_LIBRARY__=6 _LARGEFILE_SOURCE=1 _POSIX_C_SOURCE=199506L _POSIX_SOURCE=1 __STDC__=1 __USE_BSD=1 __USE_FILE_OFFSET64=1 __USE_LARGEFILE=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_SVID=1 linux=1 __linux=1 __linux__=1 unix=1 __unix=1 __unix__=1'
++d_casti32='define'
++d_modflproto='undef'
++doublekind='3'
++fpossize='20'
++longdblkind='0'
++need_va_copy='undef'
++quadkind='3'
++
++owrt:sig_count='64'
++owrt:sigs='ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS'
++owrt:sig_name_extra='IOT CLD POLL UNUSED'
++owrt:sig_num_extra='6 17 29 31'
+diff --git a/feeds/packages/lang/perl/files/armeb.config b/feeds/packages/lang/perl/files/armeb.config
+new file mode 100644
+index 0000000..081300c
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/armeb.config
+@@ -0,0 +1,19 @@
++owrt:arch=armeb
++owrt:bits=32
++owrt:endian=big
++
++ccsymbols='__ARM_ARCH_3__=1'
++cppccsymbols=''
++cppsymbols='__ELF__=1 _FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=2 __GNUC__=3 __GNUC_MINOR__=4 __GNU_LIBRARY__=6 _LARGEFILE_SOURCE=1 _POSIX_C_SOURCE=199506L _POSIX_SOURCE=1 __STDC__=1 __USE_BSD=1 __USE_FILE_OFFSET64=1 __USE_LARGEFILE=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_SVID=1 linux=1 __linux=1 __linux__=1 unix=1 __unix=1 __unix__=1'
++d_casti32='define'
++d_modflproto='undef'
++doublekind='4'
++fpossize='20'
++longdblkind='0'
++need_va_copy='undef'
++quadkind='3'
++
++owrt:sig_count='64'
++owrt:sigs='ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS'
++owrt:sig_name_extra='IOT CLD POLL UNUSED'
++owrt:sig_num_extra='6 17 29 31'
+diff --git a/feeds/packages/lang/perl/files/base.config b/feeds/packages/lang/perl/files/base.config
+new file mode 100644
+index 0000000..edc3bd4
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/base.config
+@@ -0,0 +1,1005 @@
++Author=''
++Date=''
++Header=''
++Id=''
++Locker=''
++Log=''
++PERL_CONFIG_SH=true
++PERL_PATCHLEVEL=
++RCSfile=''
++Revision=''
++Source=''
++State=''
++_a='.a'
++_exe=''
++_o='.o'
++afs='false'
++afsroot='/afs'
++ansi2knr=''
++aphostname='/bin/hostname'
++ar='ar'
++archname64=''
++archobjs=''
++awk='awk'
++baserev='5.0'
++bash=''
++bin='/usr/bin'
++bin_ELF='define'
++binexp='/usr/bin'
++bison='bison'
++byacc='byacc'
++c=''
++castflags='0'
++cat='cat'
++ccname='gcc'
++ccversion=''
++cf_by='root'
++charbits='8'
++charsize='1'
++chgrp=''
++chmod='chmod'
++chown=''
++clocktype='clock_t'
++comm='comm'
++compress=''
++config_arg0='./Configure'
++config_arg1='-der'
++contains='grep'
++cp='cp'
++cpio=''
++cpp='cpp'
++cpp_stuff='42'
++cpplast='-'
++cppminus='-'
++cryptlib=''
++csh='csh'
++ctermid_r_proto='0'
++d_Gconvert='sprintf((b),"%.*g",(n),(x))'
++d_PRIEUldbl='define'
++d_PRIFUldbl='define'
++d_PRIGUldbl='define'
++d_PRIXU64='define'
++d_PRId64='define'
++d_PRIeldbl='define'
++d_PRIfldbl='define'
++d_PRIgldbl='define'
++d_PRIi64='define'
++d_PRIo64='define'
++d_PRIu64='define'
++d_PRIx64='define'
++d_SCNfldbl='define'
++d__fwalk='undef'
++d_access='define'
++d_accessx='undef'
++d_acosh='define'
++d_aintl='undef'
++d_alarm='define'
++d_archlib='undef'
++d_asctime64='undef'
++d_asinh='define'
++d_atanh='define'
++d_atolf='undef'
++d_atoll='define'
++d_attribute_deprecated='define'
++d_attribute_format='define'
++d_attribute_malloc='define'
++d_attribute_nonnull='define'
++d_attribute_noreturn='define'
++d_attribute_pure='define'
++d_attribute_unused='define'
++d_attribute_warn_unused_result='define'
++d_backtrace='define'
++d_bcmp='define'
++d_bcopy='define'
++d_bsd='undef'
++d_bsdgetpgrp='undef'
++d_bsdsetpgrp='undef'
++d_builtin_choose_expr='define'
++d_builtin_expect='undef'
++d_bzero='define'
++d_c99_variadic_macros='define'
++d_castneg='define'
++d_cbrt='define'
++d_charvspr='undef'
++d_chown='define'
++d_chroot='define'
++d_chsize='undef'
++d_class='undef'
++d_clearenv='define'
++d_clock='define'
++d_clock_getres='define'
++d_clock_gettime='define'
++d_clock_nanosleep='define'
++d_closedir='define'
++d_cmsghdr_s='define'
++d_const='define'
++d_copysign='define'
++d_copysignl='undef'
++d_cplusplus='undef'
++d_csh='undef'
++d_ctermid='define'
++d_ctermid_r='undef'
++d_ctime64='undef'
++d_cuserid='define'
++d_dbl_dig='define'
++d_dbminitproto='undef'
++d_difftime='define'
++d_difftime64='undef'
++d_dir_dd_fd='undef'
++d_dirfd='define'
++d_dirnamlen='undef'
++d_dladdr='define'
++d_dlerror='define'
++d_dlopen='define'
++d_dlsymun='undef'
++d_dosuid='undef'
++d_drand48proto='define'
++d_dup2='define'
++d_eaccess='undef'
++d_endgrent='define'
++d_endgrent_r='undef'
++d_endhent='define'
++d_endhostent_r='undef'
++d_endnent='define'
++d_endnetent_r='undef'
++d_endpent='define'
++d_endprotoent_r='undef'
++d_endpwent='define'
++d_endpwent_r='undef'
++d_endsent='define'
++d_endservent_r='undef'
++d_eofnblk='define'
++d_erf='define'
++d_erfc='define'
++d_eunice='undef'
++d_exp2='define'
++d_expm1='define'
++d_faststdio='undef'
++d_fchdir='define'
++d_fchmod='define'
++d_fchown='define'
++d_fcntl='define'
++d_fcntl_can_lock='define'
++d_fd_macros='define'
++d_fd_set='define'
++d_fdim='define'
++d_fgetpos='define'
++d_finite='define'
++d_finitel='undef'
++d_flexfnam='define'
++d_flock='define'
++d_flockproto='define'
++d_fma='define'
++d_fmax='define'
++d_fmin='define'
++d_fork='define'
++d_fp_class='undef'
++d_fp_classify='undef'
++d_fp_classl='undef'
++d_fpathconf='define'
++d_fpclass='undef'
++d_fpclassify='define'
++d_fpclassl='undef'
++d_fpgetround='undef'
++d_fpos64_t='undef'
++d_frexpl='undef'
++d_fs_data_s='undef'
++d_fseeko='define'
++d_fsetpos='define'
++d_fstatfs='define'
++d_fstatvfs='define'
++d_fsync='define'
++d_ftello='define'
++d_ftime='undef'
++d_futimes='undef'
++d_gdbm_ndbm_h_uses_prototypes='undef'
++d_gdbmndbm_h_uses_prototypes='undef'
++d_getaddrinfo='define'
++d_getcwd='define'
++d_getespwnam='undef'
++d_getfsstat='undef'
++d_getgrent='define'
++d_getgrps='define'
++d_gethbyaddr='define'
++d_gethbyname='define'
++d_gethent='define'
++d_gethname='define'
++d_gethostprotos='define'
++d_getitimer='define'
++d_getlogin='define'
++d_getmnt='undef'
++d_getmntent='define'
++d_getnameinfo='define'
++d_getnbyaddr='define'
++d_getnbyname='define'
++d_getnent='define'
++d_getnetprotos='define'
++d_getpagsz='define'
++d_getpbyname='define'
++d_getpbynumber='define'
++d_getpent='define'
++d_getpgid='define'
++d_getpgrp='define'
++d_getpgrp2='undef'
++d_getppid='define'
++d_getprior='define'
++d_getprotoprotos='define'
++d_getprpwnam='undef'
++d_getpwent='define'
++d_getsbyname='define'
++d_getsbyport='define'
++d_getsent='define'
++d_getservprotos='define'
++d_getspnam='define'
++d_gettimeod='define'
++d_gmtime64='undef'
++d_gnulibc='undef'
++d_grpasswd='define'
++d_hasmntopt='define'
++d_htonl='define'
++d_hypot='define'
++d_ilogb='define'
++d_ilogbl='undef'
++d_inc_version_list='undef'
++d_index='undef'
++d_inetaton='define'
++d_inetntop='define'
++d_inetpton='define'
++d_int64_t='define'
++d_ip_mreq='define'
++d_ip_mreq_source='define'
++d_ipv6_mreq="$owrt:ipv6"
++d_ipv6_mreq_source='undef'
++d_isascii='define'
++d_isblank='define'
++d_isfinite='define'
++d_isfinitel='undef'
++d_isinf='define'
++d_isinfl='define'
++d_isless='undef'
++d_isnan='define'
++d_isnanl='undef'
++d_isnormal='define'
++d_killpg='define'
++d_lc_monetary_2008='define'
++d_lchown='define'
++d_ldbl_dig='define'
++d_ldexpl='define'
++d_lgamma='define'
++d_lgamma_r='define'
++d_libm_lib_version='define'
++d_libname_unique='undef'
++d_link='define'
++d_llrint='define'
++d_llrintl='define'
++d_llround='define'
++d_llroundl='define'
++d_localtime64='undef'
++d_locconv='define'
++d_lockf='define'
++d_log1p='define'
++d_log2='define'
++d_logb='define'
++d_longdbl='define'
++d_longlong='define'
++d_lrint='define'
++d_lrintl='define'
++d_lround='define'
++d_lroundl='define'
++d_lseekproto='define'
++d_lstat='define'
++d_madvise='define'
++d_malloc_good_size='undef'
++d_malloc_size='undef'
++d_mblen='define'
++d_mbstowcs='define'
++d_mbtowc='define'
++d_memchr='define'
++d_memcmp='define'
++d_memcpy='define'
++d_memmove='define'
++d_memset='define'
++d_mkdir='define'
++d_mkdtemp='define'
++d_mkfifo='define'
++d_mkstemp='define'
++d_mkstemps='undef'
++d_mktime='define'
++d_mktime64='undef'
++d_mmap='define'
++d_modfl='undef'
++d_modfl_pow32_bug='undef'
++d_mprotect='define'
++d_msg='define'
++d_msg_ctrunc='define'
++d_msg_dontroute='define'
++d_msg_oob='define'
++d_msg_peek='define'
++d_msg_proxy='define'
++d_msgctl='define'
++d_msgget='define'
++d_msghdr_s='define'
++d_msgrcv='define'
++d_msgsnd='define'
++d_msync='define'
++d_munmap='define'
++d_mymalloc='undef'
++d_nan='define'
++d_nanosleep='define'
++d_ndbm='undef'
++d_ndbm_h_uses_prototypes='undef'
++d_nearbyint='define'
++d_nextafter='define'
++d_nice='define'
++d_nl_langinfo='define'
++d_nv_zero_is_allbits_zero='define'
++d_old_pthread_create_joinable='undef'
++d_oldpthreads='undef'
++d_oldsock='undef'
++d_open3='define'
++d_pathconf='define'
++d_pause='define'
++d_perl_otherlibdirs='undef'
++d_phostname='undef'
++d_pipe='define'
++d_poll='define'
++d_portable='define'
++d_prctl='define'
++d_prctl_set_name='define'
++d_procselfexe='define'
++d_pseudofork='undef'
++d_pthread_attr_setscope='define'
++d_ptrdiff_t='define'
++d_pwage='undef'
++d_pwchange='undef'
++d_pwclass='undef'
++d_pwcomment='undef'
++d_pwexpire='undef'
++d_pwgecos='define'
++d_pwpasswd='define'
++d_pwquota='undef'
++d_qgcvt='undef'
++d_quad='define'
++d_re_comp='undef'
++d_readdir='define'
++d_readlink='define'
++d_readv='define'
++d_recvmsg='define'
++d_regcmp='undef'
++d_regcomp='define'
++d_remainder='define'
++d_remquo='define'
++d_rename='define'
++d_rewinddir='define'
++d_rint='define'
++d_rmdir='define'
++d_round='define'
++d_safebcpy='undef'
++d_safemcpy='undef'
++d_sanemcmp='define'
++d_sbrkproto='define'
++d_scalbn='define'
++d_scalbnl='undef'
++d_sched_yield='define'
++d_scm_rights='define'
++d_seekdir='define'
++d_select='define'
++d_sem='define'
++d_semctl='define'
++d_semctl_semid_ds='define'
++d_semctl_semun='define'
++d_semget='define'
++d_semop='define'
++d_sendmsg='define'
++d_setegid='define'
++d_seteuid='define'
++d_setgrent='define'
++d_setgrent_r='undef'
++d_setgrps='define'
++d_sethent='define'
++d_sethostent_r='undef'
++d_setitimer='define'
++d_setlinebuf='define'
++d_setlocale='define'
++d_setlocale_r='undef'
++d_setnent='define'
++d_setnetent_r='undef'
++d_setpent='define'
++d_setpgid='define'
++d_setpgrp='define'
++d_setpgrp2='undef'
++d_setprior='define'
++d_setproctitle='undef'
++d_setprotoent_r='undef'
++d_setpwent='define'
++d_setpwent_r='undef'
++d_setregid='define'
++d_setresgid='define'
++d_setresuid='define'
++d_setreuid='define'
++d_setrgid='undef'
++d_setruid='undef'
++d_setsent='define'
++d_setservent_r='undef'
++d_setsid='define'
++d_setvbuf='define'
++d_sfio='undef'
++d_shm='define'
++d_shmat='define'
++d_shmatprototype='define'
++d_shmctl='define'
++d_shmdt='define'
++d_shmget='define'
++d_sigaction='define'
++d_signbit='undef'
++d_sigprocmask='define'
++d_sigsetjmp='define'
++d_sin6_scope_id="$owrt:ipv6"
++d_sitearch='define'
++d_snprintf='define'
++d_sockaddr_in6="$owrt:ipv6"
++d_sockaddr_sa_len='undef'
++d_sockatmark='undef'
++d_sockatmarkproto='undef'
++d_socket='define'
++d_socklen_t='define'
++d_sockpair='define'
++d_socks5_init='undef'
++d_sprintf_returns_strlen='define'
++d_sqrtl='undef'
++d_stat='define'
++d_statblks='define'
++d_statfs_f_flags='undef'
++d_statfs_s='define'
++d_static_inline='define'
++d_statvfs='define'
++d_stdio_cnt_lval='undef'
++d_stdio_ptr_lval='undef'
++d_stdio_ptr_lval_nochange_cnt='undef'
++d_stdio_ptr_lval_sets_cnt='undef'
++d_stdio_stream_array='undef'
++d_stdiobase='undef'
++d_stdstdio='undef'
++d_strchr='define'
++d_strcoll='define'
++d_strctcpy='define'
++d_strerrm='strerror(e)'
++d_strerror='define'
++d_strftime='define'
++d_strlcat='define'
++d_strlcpy='define'
++d_strtod='define'
++d_strtol='define'
++d_strtold='define'
++d_strtoll='define'
++d_strtoq='define'
++d_strtoul='define'
++d_strtoull='define'
++d_strtouq='define'
++d_strxfrm='define'
++d_suidsafe='undef'
++d_symlink='define'
++d_syscall='define'
++d_syscallproto='define'
++d_sysconf='define'
++d_sysernlst=''
++d_syserrlst='undef'
++d_system='define'
++d_tcgetpgrp='define'
++d_tcsetpgrp='define'
++d_telldir='define'
++d_telldirproto='define'
++d_tgamma='define'
++d_time='define'
++d_timegm='define'
++d_times='define'
++d_tm_tm_gmtoff='define'
++d_tm_tm_zone='define'
++d_trunc='define'
++d_truncate='define'
++d_truncl='define'
++d_tzname='define'
++d_ualarm='define'
++d_umask='define'
++d_uname='define'
++d_union_semun='undef'
++d_unordered='undef'
++d_unsetenv='define'
++d_usleep='define'
++d_usleepproto='define'
++d_ustat='define'
++d_vendorarch='undef'
++d_vendorbin='undef'
++d_vendorlib='undef'
++d_vendorscript='undef'
++d_vfork='undef'
++d_void_closedir='undef'
++d_voidsig='define'
++d_voidtty=''
++d_volatile='define'
++d_vprintf='define'
++d_vsnprintf='define'
++d_wait4='define'
++d_waitpid='define'
++d_wcscmp='define'
++d_wcstombs='define'
++d_wcsxfrm='define'
++d_wctomb='define'
++d_writev='define'
++d_xenix='undef'
++date='date'
++db_hashtype='u_int32_t'
++db_prefixtype='size_t'
++db_version_major=''
++db_version_minor=''
++db_version_patch=''
++defvoidused='15'
++direntrytype='struct dirent'
++dlext='so'
++dlsrc='dl_dlopen.xs'
++doublesize='8'
++drand01='drand48()'
++dtrace=''
++eagain='EAGAIN'
++ebcdic='undef'
++echo='echo'
++egrep='egrep'
++emacs=''
++endgrent_r_proto='0'
++endhostent_r_proto='0'
++endnetent_r_proto='0'
++endprotoent_r_proto='0'
++endpwent_r_proto='0'
++endservent_r_proto='0'
++eunicefix=':'
++exe_ext=''
++expr='expr'
++extern_C='extern'
++extras=''
++fflushNULL='define'
++fflushall='undef'
++find=''
++firstmakefile='makefile'
++flex=''
++fpostype='fpos_t'
++freetype='void'
++from=':'
++full_csh='csh'
++full_sed='sed'
++gccansipedantic=''
++gccosandvers=''
++gidsign='1'
++gidsize='4'
++gidtype='gid_t'
++glibpth='/usr/shlib /lib /usr/lib /usr/lib/386 /lib/386 /usr/ccs/lib /usr/ucblib /usr/local/lib '
++gmake='gmake'
++gnulibc_version=''
++grep='grep'
++groupcat='cat /etc/group'
++groupstype='gid_t'
++gzip='gzip'
++h_fcntl='false'
++h_sysfile='true'
++hint='recommended'
++hostcat='cat /etc/hosts'
++hostgenerate="$owrt:host_perl_prefix/bin/generate_uudmap"
++hostosname=''
++hostperl="$owrt:host_perl_prefix/bin/perl"
++html1dir=' '
++html1direxp=''
++html3dir=' '
++html3direxp=''
++i16size='2'
++i32size='4'
++i64size='8'
++i8size='1'
++i_arpainet='define'
++i_assert='define'
++i_bfd='undef'
++i_bsdioctl=''
++i_db='define'
++i_dbm='undef'
++i_dirent='define'
++i_dld='undef'
++i_dlfcn='define'
++i_execinfo='define'
++i_fcntl='undef'
++i_fenv='undef'
++i_float='define'
++i_fp='undef'
++i_fp_class='undef'
++i_gdbm='define'
++i_gdbm_ndbm='undef'
++i_gdbmndbm='undef'
++i_grp='define'
++i_ieeefp='undef'
++i_inttypes='define'
++i_langinfo='define'
++i_libutil='undef'
++i_limits='define'
++i_locale='define'
++i_machcthr='undef'
++i_malloc='define'
++i_mallocmalloc='undef'
++i_math='define'
++i_memory='undef'
++i_mntent='define'
++i_ndbm='undef'
++i_netdb='define'
++i_neterrno='undef'
++i_netinettcp='define'
++i_niin='define'
++i_poll='define'
++i_prot='undef'
++i_pthread='define'
++i_pwd='define'
++i_quadmath='define'
++i_rpcsvcdbm='undef'
++i_sfio='undef'
++i_sgtty='undef'
++i_shadow='define'
++i_socks='undef'
++i_stdarg='define'
++i_stdbool='define'
++i_stddef='define'
++i_stdint='define'
++i_stdlib='define'
++i_string='define'
++i_sunmath='undef'
++i_sysaccess='undef'
++i_sysdir='define'
++i_sysfile='define'
++i_sysfilio='undef'
++i_sysin='undef'
++i_sysioctl='define'
++i_syslog='define'
++i_sysmman='define'
++i_sysmode='undef'
++i_sysmount='define'
++i_sysndir='undef'
++i_sysparam='define'
++i_syspoll='define'
++i_sysresrc='define'
++i_syssecrt='undef'
++i_sysselct='define'
++i_syssockio='undef'
++i_sysstat='define'
++i_sysstatfs='define'
++i_sysstatvfs='define'
++i_systime='define'
++i_systimek='undef'
++i_systimes='define'
++i_systypes='define'
++i_sysuio='define'
++i_sysun='define'
++i_sysutsname='define'
++i_sysvfs='define'
++i_syswait='define'
++i_termio='undef'
++i_termios='define'
++i_time='define'
++i_unistd='define'
++i_ustat='define'
++i_utime='define'
++i_values='define'
++i_varargs='undef'
++i_varhdr='stdarg.h'
++i_vfork='undef'
++ignore_versioned_solibs='y'
++inc_version_list=' '
++inc_version_list_init='0'
++incpath=''
++inews=''
++initialinstalllocation='/usr/bin'
++installbin='/usr/bin'
++installhtml1dir=''
++installhtml3dir=''
++installman1dir=''
++installman3dir=''
++installprefix='/usr'
++installprefixexp='/usr'
++installscript='/usr/bin'
++installsitebin='/usr/bin'
++installsitehtml1dir=''
++installsitehtml3dir=''
++installsiteman1dir=''
++installsiteman3dir=''
++installsitescript='/usr/bin'
++installstyle='lib/perl5'
++installusrbinperl='define'
++installvendorarch=''
++installvendorbin=''
++installvendorhtml1dir=''
++installvendorhtml3dir=''
++installvendorlib=''
++installvendorman1dir=''
++installvendorman3dir=''
++installvendorscript=''
++intsize='4'
++issymlink='test -h'
++ivdformat='"ld"'
++ivtype='long'
++ksh=''
++ld_can_script='define'
++ldlibpthname='LD_LIBRARY_PATH'
++less='less'
++lib_ext='.a'
++libc=''
++libdb_needs_pthread='N'
++libperl='libperl.so'
++libpth="$owrt:staging_dir/lib $owrt:staging_dir/usr/lib"
++libsdirs="$owrt:staging_dir/lib $owrt:staging_dir/usr/lib"
++libspath="$owrt:staging_dir/lib $owrt:staging_dir/usr/lib"
++libswanted_uselargefiles=''
++line=''
++lint=''
++lkflags=''
++ln='ln'
++lns='/bin/ln -s'
++locincpth=' '
++loclibpth=' '
++longlongsize='8'
++lp=''
++lpr=''
++ls='ls'
++lseeksize='8'
++lseektype='off_t'
++mail=''
++mailx=''
++make='make'
++make_set_make='#'
++mallocobj=''
++mallocsrc=''
++malloctype='void *'
++man1dir=' '
++man1direxp=''
++man1ext='0'
++man3dir=' '
++man3direxp=''
++man3ext='0'
++mips_type=''
++mistrustnm=''
++mkdir='mkdir'
++mmaptype='void *'
++modetype='mode_t'
++more='more'
++multiarch='undef'
++mv=''
++mydomain='.dev.null'
++n='-n'
++netdb_hlen_type='size_t'
++netdb_name_type='const char *'
++netdb_net_type='in_addr_t'
++nm='nm'
++nm_opt=''
++nm_so_opt='--dynamic'
++nroff='nroff'
++nvEUformat='"E"'
++nvFUformat='"F"'
++nvGUformat='"G"'
++nv_overflows_integers_at='256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0'
++nveformat='"e"'
++nvfformat='"f"'
++nvgformat='"g"'
++nvsize='8'
++nvtype='double'
++o_nonblock='O_NONBLOCK'
++obj_ext='.o'
++old_pthread_create_joinable=''
++optimize='-O2'
++orderlib='false'
++osname='linux'
++otherlibdirs=' '
++package='perl5'
++pager='/usr/bin/less'
++passcat='cat /etc/passwd'
++path_sep=':'
++perl=''
++perl5=''
++perl_patchlevel=''
++perl_static_inline='static __inline__'
++perlpath='/usr/bin/perl'
++pg='pg'
++phostname='hostname'
++pidtype='pid_t'
++plibpth=''
++pmake=''
++pr=''
++prefix='/usr'
++prefixexp='/usr'
++procselfexe='"/proc/self/exe"'
++prototype='define'
++randbits='48'
++randfunc='drand48'
++randseedtype='long'
++ranlib=':'
++rd_nodata='-1'
++rm='rm'
++rm_try='/bin/rm -f try try a.out .out try.[cho] try..o core core.try* try.core*'
++rmail=''
++run=''
++runnm='false'
++sched_yield='sched_yield()'
++scriptdir='/usr/bin'
++scriptdirexp='/usr/bin'
++sed='sed'
++seedfunc='srand48'
++selecttype='fd_set *'
++sendmail=''
++setgrent_r_proto='0'
++sethostent_r_proto='0'
++setlocale_r_proto='0'
++setnetent_r_proto='0'
++setprotoent_r_proto='0'
++setpwent_r_proto='0'
++setservent_r_proto='0'
++sh='/bin/sh'
++shar=''
++sharpbang='#!'
++shmattype='void *'
++shortsize='2'
++shrpenv=''
++shsharp='true'
++signal_t='void'
++sitearch=''
++sitearchexp=''
++sitebin='/usr/bin'
++sitebinexp='/usr/bin'
++sitehtml1dir=''
++sitehtml1direxp=''
++sitehtml3dir=''
++sitehtml3direxp=''
++sitelib=''
++sitelibexp=''
++siteman1dir=''
++siteman1direxp=''
++siteman3dir=''
++siteman3direxp=''
++siteprefix='/usr'
++siteprefixexp='/usr'
++sitescript='/usr/bin'
++sitescriptexp='/usr/bin'
++sizetype='size_t'
++sleep=''
++smail=''
++so='so'
++sockethdr=''
++socketlib=''
++socksizetype='socklen_t'
++sort='sort'
++spackage='Perl5'
++spitshell='cat'
++src='.'
++ssizetype='ssize_t'
++st_ino_sign='1'
++st_ino_size='8'
++startperl='#!/usr/bin/perl'
++startsh='#!/bin/sh'
++static_ext=' '
++stdchar='char'
++stdio_base='((fp)->_base)'
++stdio_bufsiz='((fp)->_cnt + (fp)->_ptr - (fp)->_base)'
++stdio_cnt='((fp)->_cnt)'
++stdio_filbuf=''
++stdio_ptr='((fp)->_ptr)'
++stdio_stream_array=''
++submit=''
++sysman='/usr/share/man/man1'
++sysroot=''
++tail=''
++tar=''
++targetdir=''
++targetenv=''
++targethost=''
++targetmkdir=''
++targetport=''
++targetsh='/bin/sh'
++tbl=''
++tee=''
++test='test'
++timetype='time_t'
++to=':'
++touch='touch'
++tr='tr'
++trnl='\n'
++troff=''
++u16size='2'
++u16type='unsigned short'
++u32size='4'
++u64size='8'
++u8size='1'
++u8type='unsigned char'
++uidsign='1'
++uidsize='4'
++uidtype='uid_t'
++uname='uname'
++uniq='uniq'
++use5005threads='undef'
++usecbacktrace='undef'
++usecrosscompile='define'
++usedevel='undef'
++usedl='define'
++usedtrace='undef'
++usefaststdio='undef'
++usekernprocpathname='undef'
++uselargefiles='define'
++uselongdouble='undef'
++usemallocwrap='define'
++usemorebits='undef'
++usemymalloc='n'
++usenm='true'
++usensgetexecutablepath='undef'
++useopcode='true'
++useperlio='define'
++useposix='true'
++usequadmath='undef'
++usereentrant='undef'
++userelocatableinc='undef'
++usesfio='false'
++useshrplib='true'
++usesitecustomize='undef'
++usesocks='undef'
++usevendorprefix='undef'
++useversionedarchname='undef'
++usevfork='false'
++usrinc="$owrt:staging_dir/include $owrt:staging_dir/usr/include"
++uuname=''
++uvXUformat='"lX"'
++uvoformat='"lo"'
++uvtype='unsigned long'
++uvuformat='"lu"'
++uvxformat='"lx"'
++vaproto='define'
++vendorarch=''
++vendorarchexp=''
++vendorbin=''
++vendorbinexp=''
++vendorhtml1dir=' '
++vendorhtml1direxp=''
++vendorhtml3dir=' '
++vendorhtml3direxp=''
++vendorlib=''
++vendorlib_stem=''
++vendorlibexp=''
++vendorman1dir=' '
++vendorman1direxp=''
++vendorman3dir=' '
++vendorman3direxp=''
++vendorprefix=''
++vendorprefixexp=''
++vendorscript=''
++vendorscriptexp=''
++versiononly='undef'
++vi=''
++voidflags='15'
++xlibpth='/usr/lib/386 /lib/386'
++yacc='yacc'
++yaccflags=''
++zcat=''
++zip='zip'
++
++config_argc=1
++config_args='-der'
++
++# Tools
++cpprun="$owrt:target_cc -E"
++cppstdin="$owrt:target_cc -E"
++cc="$owrt:target_cc"
++ld="$cc"
++full_ar="${owrt:target_cross}ar"
++
++# Tool flags
++cppflags="$owrt:cflags"
++ccflags="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $owrt:cflags"
++ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
++ccdlflags="-fPIC -Wl,-rpath,$owrt:perllibpath/CORE"
++cccdlflags='-fPIC'
++ldflags=''
++ldflags_uselargefiles=''
++lddlflags="-shared $owrt:ldflags"
++
++# Libraries
++perllibs='-ldl -lm -lcrypt -lutil -lc'
++libs='-lgdbm -ldb -ldl -lm -lcrypt -lutil -lc'
++libsfiles='libdl.so libm.so libcrypt.so libutil.so libc.so'
++libswanted='sfio socket inet nm ndbm gdbm dbm db malloc dl dld ld sun m crypt sec util c cposix posix ucb BSD'
+diff --git a/feeds/packages/lang/perl/files/i486.config b/feeds/packages/lang/perl/files/i486.config
+new file mode 100644
+index 0000000..b44c64e
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/i486.config
+@@ -0,0 +1,28 @@
++owrt:arch=i486
++owrt:bits=32
++owrt:endian=little
++
++ccsymbols=''
++cppccsymbols=''
++cppsymbols='__ELF__=1 _FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=2 __GNUC__=3 __GNUC_MINOR__=4 __GNU_LIBRARY__=6 _LARGEFILE_SOURCE=1 _POSIX_C_SOURCE=199506L _POSIX_SOURCE=1 __STDC__=1 __USE_BSD=1 __USE_FILE_OFFSET64=1 __USE_LARGEFILE=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_SVID=1 i386=1 __i386=1 __i386__=1 linux=1 __linux=1 __linux__=1 unix=1 __unix=1 __unix__=1'
++d_casti32='undef'
++d_modflproto='define'
++doublekind='3'
++fpossize='20'
++longdblkind='3'
++need_va_copy='undef'
++quadkind='3'
++
++sPRIEUldbl='"LE"'
++sPRIFUldbl='"LF"'
++sPRIGUldbl='"LG"'
++sPRIXU64='"LX"'
++sPRIeldbl='"Le"'
++sPRIfldbl='"Lf"'
++sPRIgldbl='"Lg"'
++sSCNfldbl='"Lf"'
++
++owrt:sig_count='64'
++owrt:sigs='ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS'
++owrt:sig_name_extra='IOT CLD POLL UNUSED'
++owrt:sig_num_extra='6 17 29 31'
+diff --git a/feeds/packages/lang/perl/files/libc.config b/feeds/packages/lang/perl/files/libc.config
+new file mode 100644
+index 0000000..2c355a3
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/libc.config
+@@ -0,0 +1,49 @@
++($owrt:libc eq 'glibc') {
++ perllibs="$perllibs -lbsd"
++ ldflags="$ldflags -L$owrt:staging_dir/lib"
++}
++
++# uclibc does not provide crypt_r(). Enable crypt() usage for glibc builds only
++($owrt:libc ne 'glibc') {
++ crypt_r_proto='0'
++ i_crypt='undef'
++ d_crypt='undef'
++ d_crypt_r='undef'
++}
++
++($owrt:libc eq 'musl') {
++ # musl does not provide a working setlocale(). It accepts arbitrary locales
++ # and makes them act as if they were C.UTF-8.
++ d_setlocale='undef'
++
++ d_stdio_ptr_lval='undef'
++ d_stdio_ptr_lval_sets_cnt='undef'
++ d_stdiobase='undef'
++ d_stdstdio='undef'
++
++ d_getnetbyname_r='undef'
++
++ d_getprotobyname_r='undef'
++ d_getpwent_r='undef'
++ d_getservent_r='undef'
++ d_gethostent_r='undef'
++ d_getnetent_r='undef'
++ d_getnetbyaddr_r='undef'
++ d_getprotoent_r='undef'
++ d_getprotobynumber_r='undef'
++ d_getgrent_r='undef'
++
++ getprotobyname_r='undef'
++ getpwent_r='undef'
++ getservent_r='undef'
++ gethostent_r='undef'
++ getnetent_r='undef'
++ getnetbyaddr_r='undef'
++ getprotoent_r='undef'
++ getprotobynumber_r='undef'
++ getgrent_r='undef'
++
++ i_fcntl='define'
++ h_fcntl='true'
++ d_strerror_r='undef'
++}
+diff --git a/feeds/packages/lang/perl/files/mips.config b/feeds/packages/lang/perl/files/mips.config
+new file mode 100644
+index 0000000..05e807b
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/mips.config
+@@ -0,0 +1,19 @@
++owrt:arch=mips
++owrt:bits=32
++owrt:endian=big
++
++ccsymbols=''
++cppccsymbols=''
++cppsymbols='__ELF__=1 _FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=2 __GNUC__=3 __GNUC_MINOR__=4 __GNU_LIBRARY__=6 LANGUAGE_C=1 _LANGUAGE_C=1 __LANGUAGE_C=1 __LANGUAGE_C__=1 _LARGEFILE_SOURCE=1 MIPSEL=1 _MIPSEL=1 __MIPSEL=1 __MIPSEL__=1 _MIPS_FPSET=16 _MIPS_ISA=_MIPS_ISA_MIPS1 _MIPS_SIM=1 _MIPS_SZINT=32 _MIPS_SZLONG=32 _MIPS_SZPTR=32 __PIC__=1 _POSIX_C_SOURCE=199506L _POSIX_SOURCE=1 R3000=1 _R3000=1 __R3000=1 __R3000__=1 __STDC__=1 __USE_BSD=1 __USE_FILE_OFFSET64=1 __USE_LARGEFILE=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_SVID=1 linux=1 __linux=1 __linux__=1 mips=1 _mips=1 __mips=1 __mips__=1 __pic__=1 unix=1 __unix=1 __unix__=1'
++d_casti32='define'
++d_modflproto='undef'
++doublekind='4'
++fpossize='24'
++longdblkind='0'
++need_va_copy='undef'
++quadkind='3'
++
++owrt:sig_count=128
++owrt:sigs='ZERO HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM USR1 USR2 CHLD PWR WINCH URG IO STOP TSTP CONT TTIN TTOU VTALRM PROF XCPU XFSZ'
++owrt:sig_name_extra='IOT CLD POLL'
++owrt:sig_num_extra='6 18 22'
+diff --git a/feeds/packages/lang/perl/files/mips64.config b/feeds/packages/lang/perl/files/mips64.config
+new file mode 100644
+index 0000000..89875f7
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/mips64.config
+@@ -0,0 +1,19 @@
++owrt:arch=mips64
++owrt:bits=64
++owrt:endian=big
++
++ccsymbols=''
++cppccsymbols=''
++cppsymbols=''
++d_casti32='define'
++d_modflproto='undef'
++doublekind='4'
++fpossize='24'
++longdblkind='6'
++need_va_copy='define'
++quadkind='2'
++
++owrt:sig_count=128
++owrt:sigs='ZERO HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM USR1 USR2 CHLD PWR WINCH URG IO STOP TSTP CONT TTIN TTOU VTALRM PROF XCPU XFSZ'
++owrt:sig_name_extra='IOT CLD POLL'
++owrt:sig_num_extra='6 18 22'
+diff --git a/feeds/packages/lang/perl/files/mipsel.config b/feeds/packages/lang/perl/files/mipsel.config
+new file mode 100644
+index 0000000..d209a0d
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/mipsel.config
+@@ -0,0 +1,19 @@
++owrt:arch=mipsel
++owrt:bits=32
++owrt:endian=little
++
++ccsymbols=''
++cppccsymbols=''
++cppsymbols='__ELF__=1 _FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=2 __GNUC__=3 __GNUC_MINOR__=4 __GNU_LIBRARY__=6 LANGUAGE_C=1 _LANGUAGE_C=1 __LANGUAGE_C=1 __LANGUAGE_C__=1 _LARGEFILE_SOURCE=1 MIPSEL=1 _MIPSEL=1 __MIPSEL=1 __MIPSEL__=1 _MIPS_FPSET=16 _MIPS_ISA=_MIPS_ISA_MIPS1 _MIPS_SIM=1 _MIPS_SZINT=32 _MIPS_SZLONG=32 _MIPS_SZPTR=32 __PIC__=1 _POSIX_C_SOURCE=199506L _POSIX_SOURCE=1 R3000=1 _R3000=1 __R3000=1 __R3000__=1 __STDC__=1 __USE_BSD=1 __USE_FILE_OFFSET64=1 __USE_LARGEFILE=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_SVID=1 linux=1 __linux=1 __linux__=1 mips=1 _mips=1 __mips=1 __mips__=1 __pic__=1 unix=1 __unix=1 __unix__=1'
++d_casti32='define'
++d_modflproto='undef'
++doublekind='3'
++fpossize='24'
++longdblkind='0'
++need_va_copy='undef'
++quadkind='3'
++
++owrt:sig_count=128
++owrt:sigs='ZERO HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM USR1 USR2 CHLD PWR WINCH URG IO STOP TSTP CONT TTIN TTOU VTALRM PROF XCPU XFSZ'
++owrt:sig_name_extra='IOT CLD POLL'
++owrt:sig_num_extra='6 18 22'
+diff --git a/feeds/packages/lang/perl/files/misc.config b/feeds/packages/lang/perl/files/misc.config
+new file mode 100644
+index 0000000..a1d93d3
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/misc.config
+@@ -0,0 +1,11 @@
++cf_email='naoir@gmx.net'
++osvers='3.18.19'
++gccversion='4.8.0'
++myhostname='OpenWrt'
++cf_time='Thu Jan 1 12:00:00 CEST 2015'
++
++perladmin="$cf_email"
++archname="$owrt:arch-linux-$owrt:libc"
++targetarch="$archname"
++myarchname="$archname"
++myuname="Linux $myhostname $osvers #1 SMP $cf_time @{[$owrt:arch =~ s/(el|eb)$//r]} GNU/Linux"
+diff --git a/feeds/packages/lang/perl/files/perl-run_tests.sh b/feeds/packages/lang/perl/files/perl-run_tests.sh
+new file mode 100755
+index 0000000..bf83c0a
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/perl-run_tests.sh
+@@ -0,0 +1,81 @@
++#!/bin/sh
++
++PERL_TESTSDIR="/usr/share/perl/perl-tests"
++PERL_LIBDIR="/usr/lib/perl5/%%PERL_VERSION%%/"
++PERL_DISABLEDTESTS="%%PERL_DISABLEDTESTS%%"
++
++no_run=""
++manual_run=""
++manual_run_no_base=""
++
++while [ ! -z "$1" ]; do
++ case $1 in
++ -n)
++ no_run="yes"
++ ;;
++ -m)
++ manual_run="yes"
++ ;;
++ -mb)
++ manual_run="yes"
++ manual_run_no_base="yes"
++ ;;
++ --help)
++ echo "run_tests.sh [-n|-m|-mb|--help]"
++ echo ""
++ echo "Options:"
++ echo " -n Just prepare the environment. Don't actually run any tests"
++ echo " -m Run tests manually according to MANIFEST, instead of whatever t/TEST chooses"
++ echo " -mb Don't run base tests. Implies -m"
++ echo " --help Print this help ;)"
++ echo ""
++ exit 0
++ ;;
++ *)
++ echo "Invalid argument: $1"
++ ;;
++ esac
++ shift
++done
++
++if [ ! -f "$PERL_TESTSDIR/__prepared" ]; then
++ # Many tests insist on having PERL5LIB in $PERL_TESTSDIR/lib. However,
++ # that directory may also contain tests. Some of them(FindBin.t in particular)
++ # also demand being located in a directory ending with "lib". So we can't do symlink
++ # trickery here.
++ # Our solution is to just copy PERL5LIB over.
++ if [ -d "$PERL_TESTSDIR/lib" ]; then
++ cp -a "$PERL_LIBDIR/"* "$PERL_TESTSDIR/lib/"
++ else
++ ln -s "$PERL_LIBDIR" "$PERL_TESTSDIR/lib"
++ fi
++
++ ln -s /usr/bin/perl "$PERL_TESTSDIR/perl"
++ ln -s /usr/bin/perl "$PERL_TESTSDIR/t/perl"
++ touch "$PERL_TESTSDIR/__prepared"
++
++ for i in $PERL_DISABLEDTESTS; do
++ echo "Disabling $i tests"
++ sed 's!^'$i'.*$!!' -i $PERL_TESTSDIR/MANIFEST
++ done
++
++ cat $PERL_TESTSDIR/MANIFEST | grep -v '^$' > $PERL_TESTSDIR/MANIFEST_NEW
++ rm $PERL_TESTSDIR/MANIFEST
++ mv $PERL_TESTSDIR/MANIFEST_NEW $PERL_TESTSDIR/MANIFEST
++fi
++
++if [ -z "$no_run" ]; then
++ cd "$PERL_TESTSDIR/t"
++ if [ ! -z "$manual_run" ]; then
++ for i in $(cat ../MANIFEST | sed 's/\t.*$//g' | grep '\.t$'); do
++ if [ ! -z "$manual_run_no_base" ] && [ ! -z "$(echo $i | grep '^t/')" ]; then
++ continue;
++ fi
++ echo "Running $i"
++ ./TEST ../$i
++ echo ""
++ done
++ else
++ ./perl TEST
++ fi
++fi
+diff --git a/feeds/packages/lang/perl/files/perlconfig.pl b/feeds/packages/lang/perl/files/perlconfig.pl
+new file mode 100644
+index 0000000..17378cd
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/perlconfig.pl
+@@ -0,0 +1,313 @@
++#!/usr/bin/perl
++
++# This program is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++#
++# Copyright 2015 Marcel Denia
++
++=head1 NAME
++
++perlconfig.pl
++
++=head1 SYNOPSIS
++
++B<perlconfig.pl> [B<-Dsymbol>=I<value>, ...] [B<-dsymbol>=I<value>, ...] I<[files]>
++
++Generate a configuration file suitable for (cross-)compiling perl 5.
++
++=head1 OPTIONS
++
++=over
++
++=item B<-Dsymbol=value>
++
++The symbol identified by I<name> will have the literal value I<value>.
++When generating the configuration file, it's value will be printed enclosed by
++single quotation marks(').
++
++=item B<-dsymbol=value>
++
++The symbol identified by I<name> will have the literal value I<value>.
++
++=back
++
++=head1 DESCRIPTION
++
++B<perlconfig.pl> is a program to compile and generate configuration files ready
++to be used as a "config.sh" file for compiling perl 5. It does so by processing
++specially-made configuration files(usually called *.config), typically augmented
++by command-line definitions.
++
++B<perlconfig.pl>'s intent is to be used in place of perl 5's own Configure
++script in situations where it can not be run, like cross-compiling.
++
++=head2 File syntax
++
++B<perlconfig.pl>'s configuration files a consist of symbol definitions in
++different variations, each one assigning a specific symbol identified by a name
++some value, as well as conditional blocks in order to allow for some
++flexibility.
++
++=head3 Symbol names
++
++A symbol name has to consist entirely of alphanumeric characters as well as
++the underscore(_) character. In addition, symbol names may be prefixed with an
++all-lowercase string, seperated by a colon(:):
++
++ my:name=value
++
++Having a zero-length prefix string is also valid:
++
++ :name=value
++
++Symbols prefixed that way are called private symbols. They act exactly like
++regular symbols, with the only difference being that they will B<not> be written
++to the final configuration file.
++
++=head3 Symbol definitions
++
++A symbol definition is in the form of a simple name/value pair, seperated by
++an equals sign(=):
++
++ name=value
++
++I<value> can be anything really. However, there are 3 notations, with
++differences in quoting and interpolation:
++
++=over
++
++=item name=foo
++
++The symbol identified by I<name> will have the literal value I<foo>.
++
++=item name='foo'
++
++The symbol identified by I<name> will have the literal value I<foo>.
++When generating the configuration file, it's value will be printed enclosed by
++single quotation marks(').
++
++=item name="foo"
++
++The symbol identified by I<name> will have the value of I<foo>
++S<B<after interpolation>>(as described in L</Interpolation>).
++When generating the configuration file, it's value will be printed enclosed by
++single quotation marks(').
++
++=back
++
++=head3 Conditional blocks
++
++A conditional block is of the form
++
++ (condition) {
++ ...
++ }
++
++B<perlconfig.pl> will execute everything enclosed in the curly braces({ and }),
++or inside the BLOCK in Perl 5 terms, if I<condition> evaluates to any true
++value. I<condition> will go through interpolation as described in
++L</Interpolation>. It may contain any valid Perl 5 expression. Some common
++examples are:
++
++=over
++
++=item $name eq 'foo'
++
++Evaluates to true if configuration symbol I<name> is literally equal to I<foo>.
++
++=item $name ne 'foo'
++
++Evaluates to true if configuration symbol I<name> is B<not> literally equal to
++I<foo>.
++
++=item defined($name)
++
++Evaluates to true if configuration symbol I<name> is defined(has any usable
++value, see L<perlfunc/defined>).
++
++=back
++
++Conditional blocks may be nested inside conditional blocks. Note that the
++opening curl brace({) has to be on the same line as your condition.
++
++=head3 Comments
++
++All lines starting with nothing or any number of whitespaces, followed by a
++hash sign(#), are considered comments and will be completely ignored by
++B<perlconfig.pl>.
++
++=head3 Interpolation
++
++In certain situations(see above), B<perlconfig.pl> will interpolate strings or
++constructs in order to allow you to refer to configuration symbols or embed
++code.
++
++Interpolated strings are subject to the following rules:
++
++=over
++
++=item You may not include any single(') or double(") quotation marks.
++
++You can use \qq in order to include double quotation marks(") in your string.
++
++=item $name and ${name} reference configuration symbols
++
++You can easily refer to existing configuration symbols using the commmon $name
++or ${name} syntax. In case you want to refer to the perl variable named $name,
++write \$name. This is useful for embedding code.
++
++=item Perl 5 interpolation rules apply
++
++Aside from the above, you may include anything that is also valid for an
++interpolated(qq//) string in Perl 5. For instance, it's perfectly valid to
++execute code using the @{[]} construct.
++
++=back
++
++=head1 EXAMPLES
++
++As a simple example, consider the following configuration file, named
++"example.config":
++
++ recommendation='The Perl you want is'
++ ($:maturity eq 'stable') {
++ recommendation="$recommendation Perl 5"
++ }
++ ($:maturity eq 'experimental') {
++ recommendation="$recommendation Perl 6(try Rakudo!)"
++ }
++
++Executing it using these command-lines will yield the following results:
++
++=over
++
++=item $ perlconfig.pl -D:maturity=stable example.config
++
++ recommendation='The Perl you want is Perl 5'
++
++=item $ perlconfig.pl -D:maturity=experimental example.config
++
++ recommendation='The Perl you want is Perl 6(try Rakudo!)'
++
++=back
++
++=head1 AUTHOR
++
++Marcel Denia <naoir@gmx.net>
++
++=head1 COPYRIGHT AND LICENSE
++
++Copyright 2015 Marcel Denia
++
++This program is free software: you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation, either version 3 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++=cut
++
++use strict;
++use warnings;
++use List::Util qw/all/;
++my $symbol_name_prefix_regex = '(?:[a-z]*:)';
++my $symbol_name_regex = "($symbol_name_prefix_regex?(?:[a-zA-Z0-9_]+))";
++
++my %config;
++
++sub interpolate {
++ my $string = shift;
++ my %options = @_;
++
++ # First, convert $foo into ${foo}
++ $string =~ s/(?<!\\)\$$symbol_name_regex/\${$1}/gs;
++
++ # Make ${foo} into $config{'foo'}->{value}
++ $string =~ s/\$\{$symbol_name_regex\}/\$config{\'$1\'}->{value}/g;
++
++ # Un-escape \$foo
++ $string =~ s/\\\$/\$/g;
++
++ # Turn \qq into "
++ $string =~ s/\\qq/\\"/g;
++
++ return $string;
++}
++
++# Parse command-line symbol definitions
++while ($ARGV[0]) {
++ if ($ARGV[0] =~ /^-([D|d])$symbol_name_regex=(.*)$/) {
++ $config{$2} = { value => $3, quoted => $1 eq 'D' };
++ shift(@ARGV);
++ }
++ else {
++ last;
++ }
++}
++
++# Process configuration files
++my @condition_stack = ( 1 );
++for my $file (@ARGV) {
++ open(my $fh, '<', $file) or die "Can't open $file: $!\n";
++ while (my $line = <$fh>) {
++ chomp($line);
++
++ if ($line =~ /^\s*$symbol_name_regex=(.*)$/) { # A symbol definition
++ if (all {$_ == 1} @condition_stack) {
++ my $symbol = $1;
++ (my $quote_begin, my $value, my $quote_end) = $2 =~ /^(['|"])?([^'"]*)(['|"])?$/;
++
++ $quote_begin = '' unless defined $quote_begin;
++ $quote_end = '' unless defined $quote_end;
++ die "$file:$.: Unmatched quotes in \"$line\"\n" unless $quote_begin eq $quote_end;
++
++ if ($quote_begin eq '"') {
++ $config{$symbol} = { value => eval('"' . interpolate($2) . '"'), quoted => 1 };
++ }
++ else {
++ $config{$symbol} = { value => $2, quoted => $quote_begin eq '\'' };
++ }
++ }
++ }
++ elsif ($line =~ /^\s*\((.*)\)\s?{$/) { # A conditional block
++ if (eval(interpolate($1))) {
++ push(@condition_stack, 1);
++ }
++ else {
++ push(@condition_stack, 0);
++ }
++ }
++ elsif ($line =~ /^\s*}$/) { # Closing a conditional block
++ pop(@condition_stack);
++ die "$file:$.: Closing non-existent block\n" unless @condition_stack;
++ }
++ elsif ($line =~ (/^\s*$/) || ($line =~ /^\s*#/)) { # An empty line or comment
++ }
++ else {
++ die "$file:$.: Malformed line: \"$line\"\n";
++ }
++ }
++}
++
++# Output
++for (sort(keys(%config))) {
++ my $quote = $config{$_}->{quoted} ? '\'' : '';
++ print("$_=$quote$config{$_}->{value}$quote\n") unless $_ =~ /^$symbol_name_prefix_regex/;
++}
+\ No newline at end of file
+diff --git a/feeds/packages/lang/perl/files/powerpc.config b/feeds/packages/lang/perl/files/powerpc.config
+new file mode 100644
+index 0000000..33af767
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/powerpc.config
+@@ -0,0 +1,19 @@
++owrt:arch=powerpc
++owrt:bits=32
++owrt:endian=big
++
++ccsymbols='__gnu_linux__=1 __linux=1 __linux__=1 __unix=1 __unix__=1 system=linux system=posix system=unix'
++cppccsymbols='linux=1 unix=1'
++cppsymbols='_BIG_ENDIAN=1 __BIG_ENDIAN__=1 __ELF__=1 _FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=2 __GNUC__=3 __GNUC_MINOR__=4 __GNU_LIBRARY__=6 _LARGEFILE_SOURCE=1 _POSIX_C_SOURCE=199506L _POSIX_SOURCE=1 __STDC__=1 __USE_BSD=1 __USE_FILE_OFFSET64=1 __USE_LARGEFILE=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_SVID=1 __linux=1 __linux__=1 __unix=1 __unix__=1'
++d_casti32='undef'
++d_modflproto='undef'
++doublekind='4'
++fpossize='24'
++longdblkind='0'
++need_va_copy='define'
++quadkind='3'
++
++owrt:sig_count='64'
++owrt:sigs='ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS'
++owrt:sig_name_extra='IOT CLD POLL UNUSED'
++owrt:sig_num_extra='6 17 29 31'
+diff --git a/feeds/packages/lang/perl/files/signal.config b/feeds/packages/lang/perl/files/signal.config
+new file mode 100644
+index 0000000..183d3b9
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/signal.config
+@@ -0,0 +1,18 @@
++# Signal table helper
++
++(defined($owrt:sigs)) {
++ sig_name="$owrt:sigs"
++ (($owrt:libc eq 'glibc') || ($owrt:libc eq 'uclibc')) {
++ sig_name="$sig_name NUM32 NUM33 RTMIN NUM35 NUM36"
++ }
++ ($owrt:libc eq 'musl') {
++ sig_name="$sig_name NUM32 NUM33 NUM34 RTMIN NUM36"
++ }
++
++ sig_name="$sig_name @{[map({qq/NUM\$_/} 37..$owrt:sig_count - 2)]} RTMAX $owrt:sig_name_extra"
++ sig_num="@{[0..$owrt:sig_count - 1]} $owrt:sig_num_extra "
++ sig_count="$owrt:sig_count"
++ sig_size="@{[scalar(split(q/ /, $sig_name))]}"
++ sig_name_init="@{[join(q/, /, map({qq/\qq\$_\qq/} split(q/ /, $sig_name)))]}, 0"
++ sig_num_init="@{[join(q/, /, split(q/ /, $sig_num))]}, 0"
++}
+diff --git a/feeds/packages/lang/perl/files/threads.config b/feeds/packages/lang/perl/files/threads.config
+new file mode 100644
+index 0000000..e0a2f82
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/threads.config
+@@ -0,0 +1,197 @@
++($owrt:threads eq 'yes') {
++ # Configure arguments
++ config_args="$config_args -Dusethreads"
++ config_arg2='-Dusethreads'
++ config_argc=2
++
++ # Options
++ useithreads='define'
++ usemultiplicity='define'
++ usethreads='define'
++
++ # Flags and related
++ ccflags="-D_REENTRANT -D_GNU_SOURCE $ccflags"
++ cppflags="-D_REENTRANT -D_GNU_SOURCE $cppflags"
++ perllibs="-lpthread $perllibs"
++ libs="-lpthread $libs"
++ libsfiles="libpthread.so $libsfiles"
++ libswanted="pthread $libswanted"
++
++
++ crypt_r_proto='REENTRANT_PROTO_B_CCS'
++ i_crypt='define'
++ d_crypt='define'
++ d_crypt_r='define'
++
++ # Prototypes
++ asctime_r_proto='REENTRANT_PROTO_B_SB'
++ ctime_r_proto='REENTRANT_PROTO_B_SB'
++ drand48_r_proto='REENTRANT_PROTO_I_ST'
++ getgrent_r_proto='REENTRANT_PROTO_I_SBWR'
++ getgrgid_r_proto='REENTRANT_PROTO_I_TSBWR'
++ getgrnam_r_proto='REENTRANT_PROTO_I_CSBWR'
++ gethostbyaddr_r_proto='REENTRANT_PROTO_I_TsISBWRE'
++ gethostbyname_r_proto='REENTRANT_PROTO_I_CSBWRE'
++ gethostent_r_proto='REENTRANT_PROTO_I_SBWRE'
++ getlogin_r_proto='REENTRANT_PROTO_I_BW'
++ getnetbyaddr_r_proto='REENTRANT_PROTO_I_uISBWRE'
++ getnetbyname_r_proto='REENTRANT_PROTO_I_CSBWRE'
++ getnetent_r_proto='REENTRANT_PROTO_I_SBWRE'
++ getprotobyname_r_proto='REENTRANT_PROTO_I_CSBWR'
++ getprotobynumber_r_proto='REENTRANT_PROTO_I_ISBWR'
++ getprotoent_r_proto='REENTRANT_PROTO_I_SBWR'
++ getpwent_r_proto='REENTRANT_PROTO_I_SBWR'
++ getpwnam_r_proto='REENTRANT_PROTO_I_CSBWR'
++ getpwuid_r_proto='REENTRANT_PROTO_I_TSBWR'
++ getservbyname_r_proto='REENTRANT_PROTO_I_CCSBWR'
++ getservbyport_r_proto='REENTRANT_PROTO_I_ICSBWR'
++ getservent_r_proto='REENTRANT_PROTO_I_SBWR'
++ getspnam_r_proto='REENTRANT_PROTO_I_CSBWR'
++ gmtime_r_proto='REENTRANT_PROTO_S_TS'
++ localtime_r_proto='REENTRANT_PROTO_S_TS'
++ random_r_proto='REENTRANT_PROTO_I_St'
++ readdir64_r_proto='REENTRANT_PROTO_I_TSR'
++ readdir_r_proto='REENTRANT_PROTO_I_TSR'
++ srand48_r_proto='REENTRANT_PROTO_I_LS'
++ srandom_r_proto='REENTRANT_PROTO_I_TS'
++ strerror_r_proto='REENTRANT_PROTO_B_IBW'
++ tmpnam_r_proto='REENTRANT_PROTO_B_B'
++ ttyname_r_proto='REENTRANT_PROTO_I_IBW'
++
++ # Defines
++ d_asctime_r='define'
++ d_ctime_r='define'
++ d_drand48_r='define'
++ d_fds_bits='define'
++ d_fegetround='undef'
++ d_getgrent_r='define'
++ d_getgrgid_r='define'
++ d_getgrnam_r='define'
++ d_gethostbyaddr_r='define'
++ d_gethostbyname_r='define'
++ d_gethostent_r='define'
++ d_getlogin_r='define'
++ d_getnetbyaddr_r='define'
++ d_getnetbyname_r='define'
++ d_getnetent_r='define'
++ d_getprotobyname_r='define'
++ d_getprotobynumber_r='define'
++ d_getprotoent_r='define'
++ d_getpwent_r='define'
++ d_getpwnam_r='define'
++ d_getpwuid_r='define'
++ d_getservbyname_r='define'
++ d_getservbyport_r='define'
++ d_getservent_r='define'
++ d_getspnam_r='define'
++ d_gmtime_r='define'
++ d_j0='undef'
++ d_j0l='undef'
++ d_localtime_r='define'
++ d_localtime_r_needs_tzset='define'
++ d_nexttoward='undef'
++ d_off64_t='define'
++ d_pthread_atfork='define'
++ d_pthread_yield='define'
++ d_random_r='define'
++ d_readdir64_r='define'
++ d_readdir_r='define'
++ d_srand48_r='define'
++ d_srandom_r='define'
++ d_sresgproto='define'
++ d_sresuproto='define'
++ d_strerror_r='define'
++ d_tmpnam_r='define'
++ d_ttyname_r='define'
++}
++($owrt:threads eq 'no') {
++ # Options
++ useithreads='undef'
++ usemultiplicity='undef'
++ usethreads='undef'
++
++ # Prototyypes
++ asctime_r_proto='0'
++ crypt_r_proto='0'
++ ctime_r_proto='0'
++ drand48_r_proto='0'
++ getgrent_r_proto='0'
++ getgrgid_r_proto='0'
++ getgrnam_r_proto='0'
++ gethostbyaddr_r_proto='0'
++ gethostbyname_r_proto='0'
++ gethostent_r_proto='0'
++ getlogin_r_proto='0'
++ getnetbyaddr_r_proto='0'
++ getnetbyname_r_proto='0'
++ getnetent_r_proto='0'
++ getprotobyname_r_proto='0'
++ getprotobynumber_r_proto='0'
++ getprotoent_r_proto='0'
++ getpwent_r_proto='0'
++ getpwnam_r_proto='0'
++ getpwuid_r_proto='0'
++ getservbyname_r_proto='0'
++ getservbyport_r_proto='0'
++ getservent_r_proto='0'
++ getspnam_r_proto='0'
++ gmtime_r_proto='0'
++
++ # Defines
++ d_asctime_r='undef'
++ d_crypt='define'
++ d_crypt_r='undef'
++ d_ctime_r='undef'
++ d_drand48_r='undef'
++ d_fds_bits='undef'
++ d_fegetround='define'
++ d_getgrent_r='undef'
++ d_getgrgid_r='undef'
++ d_getgrnam_r='undef'
++ d_gethostbyaddr_r='undef'
++ d_gethostbyname_r='undef'
++ d_gethostent_r='undef'
++ d_getlogin_r='undef'
++ d_getnetbyaddr_r='undef'
++ d_getnetbyname_r='undef'
++ d_getnetent_r='undef'
++ d_getprotobyname_r='undef'
++ d_getprotobynumber_r='undef'
++ d_getprotoent_r='undef'
++ d_getpwent_r='undef'
++ d_getpwnam_r='undef'
++ d_getpwuid_r='undef'
++ d_getservbyname_r='undef'
++ d_getservbyport_r='undef'
++ d_getservent_r='undef'
++ d_getspnam_r='undef'
++ d_gmtime_r='undef'
++ d_j0='define'
++ d_j0l='define'
++ d_localtime_r='undef'
++ d_localtime_r_needs_tzset='undef'
++ d_nexttoward='define'
++ d_off64_t='undef'
++ d_pthread_atfork='undef'
++ d_pthread_yield='undef'
++ d_random_r='undef'
++ d_readdir64_r='undef'
++ d_readdir_r='undef'
++ d_srand48_r='undef'
++ d_srandom_r='undef'
++ d_sresgproto='undef'
++ d_sresuproto='undef'
++ d_strerror_r='undef'
++ d_tmpnam_r='undef'
++ d_ttyname_r='undef'
++ i_crypt='define'
++ localtime_r_proto='0'
++ random_r_proto='0'
++ readdir64_r_proto='0'
++ readdir_r_proto='0'
++ srand48_r_proto='0'
++ srandom_r_proto='0'
++ strerror_r_proto='0'
++ tmpnam_r_proto='0'
++ ttyname_r_proto='0'
++}
+diff --git a/feeds/packages/lang/perl/files/version.config b/feeds/packages/lang/perl/files/version.config
+new file mode 100644
+index 0000000..7ffe904
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/version.config
+@@ -0,0 +1,38 @@
++# Set the version here
++PERL_REVISION=5
++PERL_VERSION=22
++PERL_SUBVERSION=0
++
++# (api_revison, api_version, api_subversion) = (revision, version, 0) usually
++PERL_API_REVISION=5
++PERL_API_VERSION=22
++PERL_API_SUBVERSION=0
++
++known_extensions='B Compress/Raw/Zlib Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Digest/SHA Encode Fcntl File/Glob Filter/Util/Call GDBM_File Hash/Util I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Math/BigInt/FastCalc NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Text/Soundex Time/HiRes Time/Piece Unicode/Normalize Win32 Win32API/File Win32CORE XS/APItest XS/Typemap attrs re threads threads/shared Hash/Util/FieldHash'
++extensions='B Compress/Raw/Bzip2 Compress/Raw/Zlib Cwd DB_File Data/Dumper Devel/PPPort Devel/Peek Digest/MD5 Digest/SHA Encode Fcntl File/DosGlob File/Glob Filter/Util/Call GDBM_File Hash/Util Hash/Util/FieldHash I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Math/BigInt/FastCalc Opcode POSIX PerlIO/encoding PerlIO/mmap PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Tie/Hash/NamedCapture Time/HiRes Time/Piece Unicode/Collate XS/APItest XS/Typemap arybase attributes mro re threads threads/shared Archive/Tar Attribute/Handlers AutoLoader B/Debug CPAN CPAN/Meta CPAN/Meta/Requirements CPAN/Meta/YAML Carp Config/Perl/V Devel/SelfStubber Digest Dumpvalue Env Errno Exporter ExtUtils/CBuilder ExtUtils/Command ExtUtils/Constant ExtUtils/Install ExtUtils/MakeMaker ExtUtils/Manifest ExtUtils/Miniperl ExtUtils/ParseXS File/Fetch File/Find File/Path File/Temp FileCache Filter/Simple Getopt/Long HTTP/Tiny I18N/Collate I18N/LangTags IO/Compress IO/Socket/IP IO/Zlib IPC/Cmd IPC/Open3 JSON/PP Locale/Codes Locale/Maketext Locale/Maketext/Simple Math/BigInt Math/BigRat Math/Complex Memoize Module/CoreList Module/Load Module/Load/Conditional Module/Loaded Module/Metadata NEXT Net/Ping Params/Check Parse/CPAN/Meta Perl/OSType PerlIO/via/QuotedPrint Pod/Checker Pod/Escapes Pod/Functions Pod/Html Pod/Parser Pod/Perldoc Pod/Simple Pod/Usage Safe Search/Dict SelfLoader Term/ANSIColor Term/Cap Term/Complete Term/ReadLine Test Test/Harness Test/Simple Text/Abbrev Text/Balanced Text/ParseWords Text/Tabs Thread/Queue Thread/Semaphore Tie/File Tie/Memoize Tie/RefHash Time/Local XSLoader autodie autouse base bignum constant encoding/warnings experimental if lib libnet parent perlfaq podlators Unicode/Normalize version'
++nonxs_ext='Archive/Tar Attribute/Handlers AutoLoader B/Debug CPAN CPAN/Meta CPAN/Meta/Requirements CPAN/Meta/YAML Carp Config/Perl/V Devel/SelfStubber Digest Dumpvalue Env Errno Exporter ExtUtils/CBuilder ExtUtils/Command ExtUtils/Constant ExtUtils/Install ExtUtils/MakeMaker ExtUtils/Manifest ExtUtils/Miniperl ExtUtils/ParseXS File/Fetch File/Find File/Path File/Temp FileCache Filter/Simple Getopt/Long HTTP/Tiny I18N/Collate I18N/LangTags IO/Compress IO/Socket/IP IO/Zlib IPC/Cmd IPC/Open3 JSON/PP Locale/Codes Locale/Maketext Locale/Maketext/Simple Math/BigInt Math/BigRat Math/Complex Memoize Module/CoreList Module/Load Module/Load/Conditional Module/Loaded Module/Metadata NEXT Net/Ping Params/Check Parse/CPAN/Meta Perl/OSType PerlIO/via/QuotedPrint Pod/Checker Pod/Escapes Pod/Functions Pod/Html Pod/Parser Pod/Perldoc Pod/Simple Pod/Usage Safe Search/Dict SelfLoader Term/ANSIColor Term/Cap Term/Complete Term/ReadLine Test Test/Harness Test/Simple Text/Abbrev Text/Balanced Text/ParseWords Text/Tabs Thread/Queue Thread/Semaphore Tie/File Tie/Memoize Tie/RefHash Time/Local XSLoader autodie autouse base bignum constant encoding/warnings experimental if lib libnet parent perlfaq podlators Unicode/Normalize version'
++dynamic_ext='B Compress/Raw/Bzip2 Compress/Raw/Zlib Cwd DB_File Data/Dumper Devel/PPPort Devel/Peek Digest/MD5 Digest/SHA Encode Fcntl File/DosGlob File/Glob Filter/Util/Call GDBM_File Hash/Util Hash/Util/FieldHash I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Math/BigInt/FastCalc Opcode POSIX PerlIO/encoding PerlIO/mmap PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Tie/Hash/NamedCapture Time/HiRes Time/Piece Unicode/Collate XS/APItest XS/Typemap arybase attributes mro re threads threads/shared'
++
++# No need to change anything from here on
++owrt:perllibpath="/usr/lib/perl5/$PERL_REVISION.$PERL_VERSION"
++
++revision="$PERL_REVISION"
++patchlevel="$PERL_VERSION"
++subversion="$PERL_SUBVERSION"
++version_patchlevel_string="version $PERL_VERSION subversion $PERL_SUBVERSION"
++version="$PERL_REVISION.$PERL_VERSION.$PERL_SUBVERSION"
++
++api_revision="$PERL_API_REVISION"
++api_version="$PERL_API_VERSION"
++api_subversion="$PERL_API_SUBVERSION"
++api_versionstring="$PERL_API_REVISION.$PERL_API_VERSION.$PERL_API_SUBVERSION"
++
++privlib="$owrt:perllibpath"
++privlibexp="$privlib"
++archlib="$owrt:perllibpath"
++archlibexp="$archlib"
++
++installarchlib="$owrt:perllibpath"
++installprivlib="$owrt:perllibpath"
++installsitearch="$owrt:perllibpath"
++installsitelib="$owrt:perllibpath"
+diff --git a/feeds/packages/lang/perl/files/x86_64.config b/feeds/packages/lang/perl/files/x86_64.config
+new file mode 100644
+index 0000000..a9cb581
+--- /dev/null
++++ b/feeds/packages/lang/perl/files/x86_64.config
+@@ -0,0 +1,28 @@
++owrt:arch=x86_64
++owrt:bits=64
++owrt:endian=little
++
++ccsymbols=''
++cppccsymbols=''
++cppsymbols='__ELF__=1 _LP64=1 __FLT_EVAL_METHOD__=0 __FXSR__=1 __GCC_ATOMIC_LLONG_LOCK_FREE=2 __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8=1 __INT64_MAX__=9223372036854775807L __INT64_TYPE__=long\ int __INTMAX_MAX__=9223372036854775807L __INTMAX_TYPE__=long\ int __INTPTR_MAX__=9223372036854775807L __INTPTR_TYPE__=long\ int __INT_FAST16_MAX__=9223372036854775807L __INT_FAST16_TYPE__=long\ int __INT_FAST32_MAX__=9223372036854775807L __INT_FAST32_TYPE__=long\ int __INT_FAST64_MAX__=9223372036854775807L __INT_FAST64_TYPE__=long\ int __INT_LEAST64_MAX__=9223372036854775807L __INT_LEAST64_TYPE__=long\ int __LONG_MAX__=9223372036854775807L __LP64__=1 __MMX__=1 __PTRDIFF_MAX__=9223372036854775807L __PTRDIFF_TYPE__=long\ int __SIZEOF_INT128__=16 __SIZEOF_LONG_DOUBLE__=16 __SIZEOF_LONG__=8 __SIZEOF_POINTER__=8 __SIZEOF_PTRDIFF_T__=8 __SIZEOF_SIZE_T__=8 __SIZE_MAX__=18446744073709551615UL __SIZE_TYPE__=long\ unsigned\ int __SSE2_MATH__=1 __SSE2__=1 __SSE_MATH__=1 __SSE__=1 __UINT64_MAX__=18446744073709551615UL __UINT64_TYPE__=long\ unsigned\ int __UINTMAX_MAX__=18446744073709551615UL __UINTMAX_TYPE__=long\ unsigned\ int __UINTPTR_MAX__=18446744073709551615UL __UINTPTR_TYPE__=long\ unsigned\ int __UINT_FAST16_MAX__=18446744073709551615UL __UINT_FAST16_TYPE__=long\ unsigned\ int __UINT_FAST32_MAX__=18446744073709551615UL __UINT_FAST32_TYPE__=long\ unsigned\ int __UINT_FAST64_MAX__=18446744073709551615UL __UINT_FAST64_TYPE__=long\ unsigned\ int __UINT_LEAST64_MAX__=18446744073709551615UL __UINT_LEAST64_TYPE__=long\ unsigned\ int __WCHAR_MAX__=2147483647 __WCHAR_MIN__=(-2147483647\ -\ 1) __WCHAR_TYPE__=int __amd64=1 __amd64__=1 __code_model_small__=1 __k8=1 __k8__=1 __x86_64=1 __x86_64__=1 _FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=2 __GNUC__=3 __GNUC_MINOR__=4 __GNU_LIBRARY__=6 _LARGEFILE_SOURCE=1 _POSIX_C_SOURCE=199506L _POSIX_SOURCE=1 __STDC__=1 __USE_BSD=1 __USE_FILE_OFFSET64=1 __USE_LARGEFILE=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_SVID=1 linux=1 __linux=1 __linux__=1 unix=1 __unix=1 __unix__=1'
++d_casti32='undef'
++d_modflproto='define'
++doublekind='3'
++fpossize='16'
++longdblkind='3'
++need_va_copy='define'
++quadkind='2'
++
++sPRIEUldbl='"LE"'
++sPRIFUldbl='"LF"'
++sPRIGUldbl='"LG"'
++sPRIXU64='"lX"'
++sPRIeldbl='"Le"'
++sPRIfldbl='"Lf"'
++sPRIgldbl='"Lg"'
++sSCNfldbl='"Lf"'
++
++owrt:sig_count='64'
++owrt:sigs='ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS'
++owrt:sig_name_extra='IOT CLD POLL UNUSED'
++owrt:sig_num_extra='6 17 29 31'
+diff --git a/feeds/packages/lang/perl/patches/010-musl-compat.patch b/feeds/packages/lang/perl/patches/010-musl-compat.patch
+new file mode 100644
+index 0000000..8dbad78
+--- /dev/null
++++ b/feeds/packages/lang/perl/patches/010-musl-compat.patch
+@@ -0,0 +1,11 @@
++--- a/pp.c
+++++ b/pp.c
++@@ -43,7 +43,7 @@ extern Pid_t getpid (void);
++ * Some BSDs and Cygwin default to POSIX math instead of IEEE.
++ * This switches them over to IEEE.
++ */
++-#if defined(LIBM_LIB_VERSION)
+++#if defined(LIBM_LIB_VERSION) && (defined(__GLIBC__) || defined(__UCLIBC__))
++ _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
++ #endif
++
+diff --git a/feeds/packages/lang/perl/patches/020-host-libc-dir-moved-debian+derivatives.patch b/feeds/packages/lang/perl/patches/020-host-libc-dir-moved-debian+derivatives.patch
+new file mode 100644
+index 0000000..761f8b9
+--- /dev/null
++++ b/feeds/packages/lang/perl/patches/020-host-libc-dir-moved-debian+derivatives.patch
+@@ -0,0 +1,27 @@
++--- a/hints/linux.sh
+++++ b/hints/linux.sh
++@@ -204,6 +204,24 @@ case "$libc" in
++ ;;
++ esac
++
+++# Ubuntu 11.04 (and later, presumably) doesn't keep most libraries
+++# (such as -lm) in /lib or /usr/lib. So we have to ask gcc to tell us
+++# where to look. We don't want gcc's own libraries, however, so we
+++# filter those out.
+++# This could be conditional on Unbuntu, but other distributions may
+++# follow suit, and this scheme seems to work even on rather old gcc's.
+++# This unconditionally uses gcc because even if the user is using another
+++# compiler, we still need to find the math library and friends, and I don't
+++# know how other compilers will cope with that situation.
+++# Still, as an escape hatch, allow Configure command line overrides to
+++# plibpth to bypass this check.
+++case "$plibpth" in
+++'') plibpth=`gcc -print-search-dirs | grep libraries |
+++ cut -f2- -d= | tr ':' $trnl | grep -v 'gcc'`
+++ plibpth="$plibpth" # Collapse all entries on one line
+++ ;;
+++esac
+++
++ # Are we using ELF? Thanks to Kenneth Albanowski <kjahds@kjahds.com>
++ # for this test.
++ cat >try.c <<'EOM'
+diff --git a/feeds/packages/lang/perl/patches/100-fix-cross-compile-endianness-detection.patch b/feeds/packages/lang/perl/patches/100-fix-cross-compile-endianness-detection.patch
+new file mode 100644
+index 0000000..e187941
+--- /dev/null
++++ b/feeds/packages/lang/perl/patches/100-fix-cross-compile-endianness-detection.patch
+@@ -0,0 +1,22 @@
++--- a/config_h.SH
+++++ b/config_h.SH
++@@ -52,6 +52,19 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#und
++ #ifndef _config_h_
++ #define _config_h_
++
+++#if defined(USE_CROSS_COMPILE) && !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
+++# include <endian.h>
+++# if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
+++# if (__BYTE_ORDER == __LITTLE_ENDIAN)
+++# define __LITTLE_ENDIAN__
+++# elif (__BYTE_ORDER == __BIG_ENDIAN)
+++# define __BIG_ENDIAN__
+++# else
+++# error Unknown endianness
+++# endif
+++# endif
+++#endif
+++
++ /* LOC_SED:
++ * This symbol holds the complete pathname to the sed program.
++ */
+diff --git a/feeds/packages/lang/perl/patches/110-always_use_miniperl.patch b/feeds/packages/lang/perl/patches/110-always_use_miniperl.patch
+new file mode 100644
+index 0000000..f8f8a65
+--- /dev/null
++++ b/feeds/packages/lang/perl/patches/110-always_use_miniperl.patch
+@@ -0,0 +1,27 @@
++--- a/Makefile.SH
+++++ b/Makefile.SH
++@@ -315,22 +315,11 @@ MINIPERL = \$(LDLIBPTH) ./miniperl\$(EXE
++
++ !GROK!THIS!
++
++-case "$usecrosscompile$perl" in
++-define?*)
++- $spitshell >>$Makefile <<!GROK!THIS!
++-# Macros to invoke a copy of our fully operational perl during the build.
++-PERL_EXE = perl\$(EXE_EXT)
++-RUN_PERL = \$(LDLIBPTH) \$(RUN) $perl\$(EXE_EXT)
++-!GROK!THIS!
++- ;;
++-*)
++- $spitshell >>$Makefile <<!GROK!THIS!
+++$spitshell >>$Makefile <<!GROK!THIS!
++ # Macros to invoke a copy of our fully operational perl during the build.
++ PERL_EXE = perl\$(EXE_EXT)
++-RUN_PERL = \$(LDLIBPTH) \$(RUN) ./perl\$(EXE_EXT) -Ilib
+++RUN_PERL = \$(LDLIBPTH) \$(RUN) ./miniperl\$(EXE_EXT) -Ilib
++ !GROK!THIS!
++- ;;
++-esac
++
++ $spitshell >>$Makefile <<!GROK!THIS!
++ # Macros to run our tests
+diff --git a/feeds/packages/lang/perl/patches/300-add-relink-hack.patch b/feeds/packages/lang/perl/patches/300-add-relink-hack.patch
+new file mode 100644
+index 0000000..fd3d386
+--- /dev/null
++++ b/feeds/packages/lang/perl/patches/300-add-relink-hack.patch
+@@ -0,0 +1,6 @@
++--- /dev/null
+++++ b/relink/Makefile.PL
++@@ -0,0 +1,3 @@
+++use ExtUtils::MakeMaker;
+++
+++WriteMakefile(NAME => "relink");
+diff --git a/feeds/packages/lang/perl/patches/700-tie_fetch_count_t-handle_missing_crypt.patch b/feeds/packages/lang/perl/patches/700-tie_fetch_count_t-handle_missing_crypt.patch
+new file mode 100644
+index 0000000..32914dd
+--- /dev/null
++++ b/feeds/packages/lang/perl/patches/700-tie_fetch_count_t-handle_missing_crypt.patch
+@@ -0,0 +1,28 @@
++Index: perl-5.22.0/t/op/tie_fetch_count.t
++===================================================================
++--- perl-5.22.0.orig/t/op/tie_fetch_count.t
+++++ perl-5.22.0/t/op/tie_fetch_count.t
++@@ -250,12 +250,17 @@ for ([chdir=>''],[chmod=>'0,'],[chown=>'
++ check_count "$op $args\\\$tied_glob$postargs";
++ }
++
++-$dummy = crypt $var,0; check_count 'crypt $tied, ...';
++-$dummy = crypt 0,$var; check_count 'crypt ..., $tied';
++-$var = substr(chr 256,0,0);
++-$dummy = crypt $var,0; check_count 'crypt $tied_utf8, ...';
++-$var = substr(chr 256,0,0);
++-$dummy = crypt 0,$var; check_count 'crypt ..., $tied_utf8';
+++SKIP: {
+++ use Config;
+++ skip "crypt() is unavailable", 4, unless defined $Config{'d_crypt'};
+++
+++ $dummy = crypt $var,0; check_count 'crypt $tied, ...';
+++ $dummy = crypt 0,$var; check_count 'crypt ..., $tied';
+++ $var = substr(chr 256,0,0);
+++ $dummy = crypt $var,0; check_count 'crypt $tied_utf8, ...';
+++ $var = substr(chr 256,0,0);
+++ $dummy = crypt 0,$var; check_count 'crypt ..., $tied_utf8';
+++}
++
++ SKIP:
++ {
+diff --git a/feeds/packages/lang/perl/patches/710-threads_join-skip_ps_on_busybox.patch b/feeds/packages/lang/perl/patches/710-threads_join-skip_ps_on_busybox.patch
+new file mode 100644
+index 0000000..27ee757
+--- /dev/null
++++ b/feeds/packages/lang/perl/patches/710-threads_join-skip_ps_on_busybox.patch
+@@ -0,0 +1,83 @@
++perl: Skip $0 test on busybox
++
++This test requires a ps which provides the -f option, as well as suitable output.
++We can't provide either with busybox. Just skip it for now.
++
++Signed-off-by: Marcel Denia <naoir@gmx.net>
++
++Index: perl-5.22.0/dist/threads/t/join.t
++===================================================================
++--- perl-5.22.0.orig/dist/threads/t/join.t
+++++ perl-5.22.0/dist/threads/t/join.t
++@@ -110,36 +110,41 @@ sub skip {
++
++ # We parse ps output so this is OS-dependent.
++ if ($^O eq 'linux') {
++- # First modify $0 in a subthread.
++- #print "# mainthread: \$0 = $0\n";
++- threads->create(sub{ #print "# subthread: \$0 = $0\n";
++- $0 = "foobar";
++- #print "# subthread: \$0 = $0\n"
++- })->join;
++- #print "# mainthread: \$0 = $0\n";
++- #print "# pid = $$\n";
++- if (open PS, "ps -f |") { # Note: must work in (all) systems.
++- my ($sawpid, $sawexe);
++- while (<PS>) {
++- chomp;
++- #print "# [$_]\n";
++- if (/^\s*\S+\s+$$\s/) {
++- $sawpid++;
++- if (/\sfoobar\s*$/) { # Linux 2.2 leaves extra trailing spaces.
++- $sawexe++;
++- }
++- last;
++- }
++- }
++- close PS or die;
++- if ($sawpid) {
++- ok($sawpid && $sawexe, 'altering $0 is effective');
++- } else {
++- skip("\$0 check: did not see pid $$ in 'ps -f |'");
++- }
++- } else {
++- skip("\$0 check: opening 'ps -f |' failed: $!");
++- }
+++ if (readlink('/bin/ps') ne 'busybox') {
+++ # First modify $0 in a subthread.
+++ #print "# mainthread: \$0 = $0\n";
+++ threads->create(sub{ #print "# subthread: \$0 = $0\n";
+++ $0 = "foobar";
+++ #print "# subthread: \$0 = $0\n"
+++ })->join;
+++ #print "# mainthread: \$0 = $0\n";
+++ #print "# pid = $$\n";
+++ if (open PS, "ps -f |") { # Note: must work in (all) systems.
+++ my ($sawpid, $sawexe);
+++ while (<PS>) {
+++ chomp;
+++ #print "# [$_]\n";
+++ if (/^\s*\S+\s+$$\s/) {
+++ $sawpid++;
+++ if (/\sfoobar\s*$/) { # Linux 2.2 leaves extra trailing spaces.
+++ $sawexe++;
+++ }
+++ last;
+++ }
+++ }
+++ close PS or die;
+++ if ($sawpid) {
+++ ok($sawpid && $sawexe, 'altering $0 is effective');
+++ } else {
+++ skip("\$0 check: did not see pid $$ in 'ps -f |'");
+++ }
+++ } else {
+++ skip("\$0 check: opening 'ps -f |' failed: $!");
+++ }
+++ }
+++ else {
+++ skip("\$0 check: incompatible with busybox");
+++ }
++ } else {
++ skip("\$0 check: only on Linux");
++ }
+diff --git a/feeds/packages/lang/perl/perlbase.mk b/feeds/packages/lang/perl/perlbase.mk
+new file mode 100644
+index 0000000..41af50a
+--- /dev/null
++++ b/feeds/packages/lang/perl/perlbase.mk
+@@ -0,0 +1,1559 @@
++define Package/perlbase-template
++SUBMENU:=Perl
++SECTION:=lang
++CATEGORY:=Languages
++URL:=http://www.cpan.org/
++DEPENDS:=perl
++endef
++
++define Package/perlbase-anydbm-file
++$(call Package/perlbase-template)
++TITLE:=AnyDBM_File perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-anydbm-file/install
++$(call perlmod/Install,$(1),AnyDBM_File.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/AnyDBM_File.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-anydbm-file))
++
++
++define Package/perlbase-app
++$(call Package/perlbase-template)
++TITLE:=app perl module
++DEPENDS+=+perlbase-autouse +perlbase-base +perlbase-config +perlbase-cpan +perlbase-essential +perlbase-file +perlbase-getopt +perlbase-if +perlbase-tap +perlbase-text
++endef
++
++define Package/perlbase-app/install
++$(call perlmod/Install,$(1),App,)
++endef
++
++$(eval $(call BuildPackage,perlbase-app))
++
++
++define Package/perlbase-archive
++$(call Package/perlbase-template)
++TITLE:=Archive perl module
++DEPENDS+=+perlbase-cwd +perlbase-essential +perlbase-file +perlbase-io
++endef
++
++define Package/perlbase-archive/install
++$(call perlmod/Install,$(1),Archive,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Archive-Tar/bin cpan/Archive-Tar/t)
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/ptar $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/ptardiff $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/ptargrep $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,perlbase-archive))
++
++
++define Package/perlbase-arybase
++$(call Package/perlbase-template)
++TITLE:=arybase perl module
++DEPENDS+=+perlbase-xsloader
++endef
++
++define Package/perlbase-arybase/install
++$(call perlmod/Install,$(1),arybase.pm auto/arybase,)
++$(call perlmod/InstallBaseTests,$(1),ext/arybase/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-arybase))
++
++
++define Package/perlbase-attribute
++$(call Package/perlbase-template)
++TITLE:=Attribute perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-attribute/install
++$(call perlmod/Install,$(1),Attribute,)
++$(call perlmod/InstallBaseTests,$(1),dist/Attribute-Handlers/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-attribute))
++
++
++define Package/perlbase-attributes
++$(call Package/perlbase-template)
++TITLE:=attributes perl module
++DEPENDS+=+perlbase-essential +perlbase-xsloader
++endef
++
++define Package/perlbase-attributes/install
++$(call perlmod/Install,$(1),attributes.pm auto/attributes,)
++endef
++
++$(eval $(call BuildPackage,perlbase-attributes))
++
++
++define Package/perlbase-autodie
++$(call Package/perlbase-template)
++TITLE:=autodie perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-autodie/install
++$(call perlmod/Install,$(1),autodie autodie.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/autodie/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-autodie))
++
++
++define Package/perlbase-autoloader
++$(call Package/perlbase-template)
++TITLE:=AutoLoader perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-autoloader/install
++$(call perlmod/Install,$(1),AutoLoader.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/AutoLoader/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-autoloader))
++
++
++define Package/perlbase-autosplit
++$(call Package/perlbase-template)
++TITLE:=AutoSplit perl module
++DEPENDS+=+perlbase-config +perlbase-essential +perlbase-file
++endef
++
++define Package/perlbase-autosplit/install
++$(call perlmod/Install/NoStrip,$(1),AutoSplit.pm,)
++endef
++
++$(eval $(call BuildPackage,perlbase-autosplit))
++
++
++define Package/perlbase-autouse
++$(call Package/perlbase-template)
++TITLE:=autouse perl module
++endef
++
++define Package/perlbase-autouse/install
++$(call perlmod/Install,$(1),autouse.pm,)
++$(call perlmod/InstallBaseTests,$(1),dist/autouse/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-autouse))
++
++
++define Package/perlbase-b
++$(call Package/perlbase-template)
++TITLE:=B perl module
++DEPENDS+=+perlbase-config +perlbase-essential +perlbase-feature
++endef
++
++define Package/perlbase-b/install
++$(call perlmod/Install,$(1),B B.pm auto/B,)
++$(call perlmod/InstallBaseTests,$(1),cpan/B-Debug/t ext/B/t lib/B/Deparse-core.t lib/B/Deparse-subclass.t lib/B/Deparse.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-b))
++
++
++define Package/perlbase-base
++$(call Package/perlbase-template)
++TITLE:=base perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-base/install
++$(call perlmod/Install,$(1),base.pm,)
++$(call perlmod/InstallBaseTests,$(1),dist/base/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-base))
++
++
++define Package/perlbase-benchmark
++$(call Package/perlbase-template)
++TITLE:=Benchmark perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-benchmark/install
++$(call perlmod/Install,$(1),Benchmark.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/Benchmark.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-benchmark))
++
++
++define Package/perlbase-bigint
++$(call Package/perlbase-template)
++TITLE:=bigint perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-bigint/install
++$(call perlmod/Install,$(1),bigint.pm,)
++endef
++
++$(eval $(call BuildPackage,perlbase-bigint))
++
++
++define Package/perlbase-bignum
++$(call Package/perlbase-template)
++TITLE:=bignum perl module
++DEPENDS+=+perlbase-bigint +perlbase-essential
++endef
++
++define Package/perlbase-bignum/install
++$(call perlmod/Install,$(1),bignum.pm bigrat.pm,)
++$(call perlmod/InstallBaseTests,$(1),dist/bignum/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-bignum))
++
++
++define Package/perlbase-blib
++$(call Package/perlbase-template)
++TITLE:=blib perl module
++DEPENDS+=+perlbase-cwd +perlbase-essential +perlbase-file
++endef
++
++define Package/perlbase-blib/install
++$(call perlmod/Install,$(1),blib.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/blib.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-blib))
++
++
++define Package/perlbase-bytes
++$(call Package/perlbase-template)
++TITLE:=bytes perl module
++endef
++
++define Package/perlbase-bytes/install
++$(call perlmod/Install,$(1),bytes.pm bytes_heavy.pl,)
++$(call perlmod/InstallBaseTests,$(1),lib/bytes.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-bytes))
++
++
++define Package/perlbase-charnames
++$(call Package/perlbase-template)
++TITLE:=charnames perl module
++DEPENDS+=+perlbase-bytes +perlbase-essential +perlbase-re +perlbase-unicore
++endef
++
++define Package/perlbase-charnames/install
++$(call perlmod/Install,$(1),_charnames.pm charnames.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/charnames.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-charnames))
++
++
++define Package/perlbase-class
++$(call Package/perlbase-template)
++TITLE:=Class perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-class/install
++$(call perlmod/Install,$(1),Class,)
++$(call perlmod/InstallBaseTests,$(1),lib/Class/Struct.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-class))
++
++
++define Package/perlbase-compress
++$(call Package/perlbase-template)
++TITLE:=Compress perl module
++DEPENDS+=+perlbase-bytes +perlbase-essential +perlbase-io +perlbase-scalar
++endef
++
++define Package/perlbase-compress/install
++$(call perlmod/Install,$(1),Compress auto/Compress,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Compress-Raw-Bzip2/t cpan/Compress-Raw-Zlib/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-compress))
++
++
++define Package/perlbase-config
++$(call Package/perlbase-template)
++TITLE:=Config perl module
++endef
++
++define Package/perlbase-config/install
++$(call perlmod/Install,$(1),Config Config.pm Config_git.pl Config_heavy.pl,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Config-Perl-V/t lib/Config.t lib/Config/Extensions.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-config))
++
++
++define Package/perlbase-cpan
++$(call Package/perlbase-template)
++TITLE:=CPAN perl module
++DEPENDS+=+perlbase-b +perlbase-config +perlbase-cwd +perlbase-dirhandle +perlbase-essential +perlbase-extutils +perlbase-fcntl +perlbase-file +perlbase-filehandle +perlbase-http-tiny +perlbase-net +perlbase-safe +perlbase-scalar +perlbase-sys +perlbase-text
++endef
++
++define Package/perlbase-cpan/install
++$(call perlmod/Install,$(1),CPAN CPAN.pm Parse/CPAN/Meta.pm,CPAN/FirstTime.pm)
++$(call perlmod/Install/NoStrip,$(1),CPAN/FirstTime.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/CPAN-Meta-Requirements/t cpan/CPAN-Meta-YAML/t cpan/CPAN-Meta/t cpan/CPAN/t cpan/Parse-CPAN-Meta/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-cpan))
++
++
++define Package/perlbase-cwd
++$(call Package/perlbase-template)
++TITLE:=Cwd perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-cwd/install
++$(call perlmod/Install,$(1),Cwd.pm auto/Cwd,)
++endef
++
++$(eval $(call BuildPackage,perlbase-cwd))
++
++
++define Package/perlbase-data
++$(call Package/perlbase-template)
++TITLE:=Data perl module
++DEPENDS+=+perlbase-bytes +perlbase-essential
++endef
++
++define Package/perlbase-data/install
++$(call perlmod/Install,$(1),Data auto/Data,)
++$(call perlmod/InstallBaseTests,$(1),dist/Data-Dumper/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-data))
++
++
++define Package/perlbase-db
++$(call Package/perlbase-template)
++TITLE:=DB perl module
++DEPENDS+=+libdb47 +perlbase-essential +perlbase-meta-notation
++endef
++
++define Package/perlbase-db/install
++$(call perlmod/Install,$(1),DB.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/DB.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-db))
++
++
++define Package/perlbase-db-file
++$(call Package/perlbase-template)
++TITLE:=DB_File perl module
++DEPENDS+=+libdb47 +perlbase-essential +perlbase-tie
++endef
++
++define Package/perlbase-db-file/install
++$(call perlmod/Install,$(1),DB_File.pm auto/DB_File,)
++$(call perlmod/InstallBaseTests,$(1),cpan/DB_File/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-db-file))
++
++
++define Package/perlbase-dbm-filter
++$(call Package/perlbase-template)
++TITLE:=DBM_Filter perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-dbm-filter/install
++$(call perlmod/Install,$(1),DBM_Filter DBM_Filter.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/DBM_Filter/t lib/dbm_filter_util.pl)
++endef
++
++$(eval $(call BuildPackage,perlbase-dbm-filter))
++
++
++define Package/perlbase-devel
++$(call Package/perlbase-template)
++TITLE:=Devel perl module
++DEPENDS+=+perlbase-essential +perlbase-file +perlbase-selfloader +perlbase-xsloader
++endef
++
++define Package/perlbase-devel/install
++$(call perlmod/Install,$(1),Devel auto/Devel,Devel/PPPort.pm)
++$(call perlmod/Install/NoStrip,$(1),Devel/PPPort.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Devel-PPPort/t dist/Devel-SelfStubber/t ext/Devel-Peek/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-devel))
++
++
++define Package/perlbase-diagnostics
++$(call Package/perlbase-template)
++TITLE:=diagnostics perl module
++DEPENDS+=+perlbase-config +perlbase-essential +perlbase-text
++endef
++
++define Package/perlbase-diagnostics/install
++$(call perlmod/Install,$(1),diagnostics.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/diagnostics.t pod/perldiag.pod)
++endef
++
++$(eval $(call BuildPackage,perlbase-diagnostics))
++
++
++define Package/perlbase-digest
++$(call Package/perlbase-template)
++TITLE:=Digest perl module
++DEPENDS+=+perlbase-dynaloader +perlbase-essential +perlbase-fcntl +perlbase-integer
++endef
++
++define Package/perlbase-digest/install
++$(call perlmod/Install,$(1),Digest Digest.pm auto/Digest,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Digest-MD5/MD5.xs cpan/Digest-MD5/t cpan/Digest-SHA/t cpan/Digest/t)
++ $(INSTALL_DIR) $(1)/$(PERL_TESTSDIR)/cpan/Digest-SHA/src
++endef
++
++$(eval $(call BuildPackage,perlbase-digest))
++
++
++define Package/perlbase-dirhandle
++$(call Package/perlbase-template)
++TITLE:=DirHandle perl module
++DEPENDS+=+perlbase-essential +perlbase-symbol
++endef
++
++define Package/perlbase-dirhandle/install
++$(call perlmod/Install,$(1),DirHandle.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/DirHandle.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-dirhandle))
++
++
++define Package/perlbase-dumpvalue
++$(call Package/perlbase-template)
++TITLE:=Dumpvalue perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-dumpvalue/install
++$(call perlmod/Install,$(1),Dumpvalue.pm,)
++$(call perlmod/InstallBaseTests,$(1),dist/Dumpvalue/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-dumpvalue))
++
++
++define Package/perlbase-dumpvar
++$(call Package/perlbase-template)
++TITLE:=dumpvar perl module
++endef
++
++define Package/perlbase-dumpvar/install
++$(call perlmod/Install,$(1),dumpvar.pl,)
++$(call perlmod/InstallBaseTests,$(1),lib/dumpvar.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-dumpvar))
++
++
++define Package/perlbase-dynaloader
++$(call Package/perlbase-template)
++TITLE:=DynaLoader perl module
++DEPENDS+=+perlbase-config
++endef
++
++define Package/perlbase-dynaloader/install
++$(call perlmod/Install,$(1),DynaLoader.pm,)
++$(call perlmod/InstallBaseTests,$(1),ext/DynaLoader/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-dynaloader))
++
++
++define Package/perlbase-encode
++$(call Package/perlbase-template)
++TITLE:=Encode perl module
++DEPENDS+=+perlbase-essential +perlbase-mime +perlbase-utf8 +perlbase-xsloader
++endef
++
++define Package/perlbase-encode/install
++$(call perlmod/Install,$(1),Encode Encode.pm auto/Encode,Encode/PerlIO.pod Encode/Supported.pod)
++$(call perlmod/InstallBaseTests,$(1),cpan/Encode/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-encode))
++
++
++define Package/perlbase-encoding
++$(call Package/perlbase-template)
++TITLE:=encoding perl module
++DEPENDS+=+perlbase-encode +perlbase-essential
++endef
++
++define Package/perlbase-encoding/install
++$(call perlmod/Install,$(1),encoding encoding.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/encoding-warnings/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-encoding))
++
++
++define Package/perlbase-english
++$(call Package/perlbase-template)
++TITLE:=English perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-english/install
++$(call perlmod/Install,$(1),English.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/English.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-english))
++
++
++define Package/perlbase-env
++$(call Package/perlbase-template)
++TITLE:=Env perl module
++DEPENDS+=+perlbase-config +perlbase-tie
++endef
++
++define Package/perlbase-env/install
++$(call perlmod/Install,$(1),Env.pm,)
++$(call perlmod/InstallBaseTests,$(1),dist/Env/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-env))
++
++
++define Package/perlbase-errno
++$(call Package/perlbase-template)
++TITLE:=Errno perl module
++DEPENDS+=+perlbase-config +perlbase-essential
++endef
++
++define Package/perlbase-errno/install
++$(call perlmod/Install,$(1),Errno.pm,)
++$(call perlmod/InstallBaseTests,$(1),ext/Errno/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-errno))
++
++
++define Package/perlbase-essential
++$(call Package/perlbase-template)
++TITLE:=essential perl module
++DEPENDS+=+perlbase-config
++endef
++
++define Package/perlbase-essential/install
++$(call perlmod/Install,$(1),Carp Carp.pm Exporter Exporter.pm constant.pm deprecate.pm lib.pm locale.pm overload.pm overloading.pm parent.pm strict.pm subs.pm vars.pm warnings warnings.pm,)
++$(call perlmod/Install/NoStrip,$(1),overload/numbers.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/parent/t dist/Carp/t dist/Exporter/t dist/constant/t dist/lib/t lib/locale.t lib/overload.t lib/overload64.t lib/overloading.t lib/strict.t lib/subs.t lib/vars.t lib/vars_carp.t lib/warnings.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-essential))
++
++
++define Package/perlbase-experimental
++$(call Package/perlbase-template)
++TITLE:=experimental perl module
++DEPENDS+=+perlbase-essential +perlbase-feature +perlbase-version
++endef
++
++define Package/perlbase-experimental/install
++$(call perlmod/Install,$(1),experimental.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/experimental/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-experimental))
++
++
++define Package/perlbase-extutils
++$(call Package/perlbase-template)
++TITLE:=ExtUtils perl module
++DEPENDS+=+perlbase-autosplit +perlbase-base +perlbase-config +perlbase-cwd +perlbase-dirhandle +perlbase-encode +perlbase-essential +perlbase-file +perlbase-io +perlbase-ipc +perlbase-ostype +perlbase-symbol +perlbase-text
++endef
++
++define Package/perlbase-extutils/install
++$(call perlmod/Install,$(1),ExtUtils,ExtUtils/MakeMaker/FAQ.pod ExtUtils/MakeMaker/Tutorial.pod ExtUtils/ParseXS.pm ExtUtils/ParseXS/Utilities.pm)
++$(call perlmod/Install/NoStrip,$(1),ExtUtils/ParseXS.pm ExtUtils/ParseXS/Utilities.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/ExtUtils-Command/t cpan/ExtUtils-Constant/t cpan/ExtUtils-Install/t cpan/ExtUtils-MakeMaker/t cpan/ExtUtils-Manifest/t dist/ExtUtils-CBuilder/t dist/ExtUtils-ParseXS/t lib/ExtUtils/t lib/h2ph.t lib/h2xs.t utils/h2ph utils/h2xs)
++endef
++
++$(eval $(call BuildPackage,perlbase-extutils))
++
++
++define Package/perlbase-fatal
++$(call Package/perlbase-template)
++TITLE:=Fatal perl module
++DEPENDS+=+perlbase-autodie +perlbase-config +perlbase-essential +perlbase-scalar +perlbase-tie
++endef
++
++define Package/perlbase-fatal/install
++$(call perlmod/Install,$(1),Fatal.pm,)
++endef
++
++$(eval $(call BuildPackage,perlbase-fatal))
++
++
++define Package/perlbase-fcntl
++$(call Package/perlbase-template)
++TITLE:=Fcntl perl module
++DEPENDS+=+perlbase-essential +perlbase-xsloader
++endef
++
++define Package/perlbase-fcntl/install
++$(call perlmod/Install,$(1),Fcntl.pm auto/Fcntl,)
++$(call perlmod/InstallBaseTests,$(1),ext/Fcntl/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-fcntl))
++
++
++define Package/perlbase-feature
++$(call Package/perlbase-template)
++TITLE:=feature perl module
++endef
++
++define Package/perlbase-feature/install
++$(call perlmod/Install,$(1),feature.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/feature.t lib/feature/unicode_strings.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-feature))
++
++
++define Package/perlbase-fields
++$(call Package/perlbase-template)
++TITLE:=fields perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-fields/install
++$(call perlmod/Install,$(1),fields.pm,)
++endef
++
++$(eval $(call BuildPackage,perlbase-fields))
++
++
++define Package/perlbase-file
++$(call Package/perlbase-template)
++TITLE:=File perl module
++DEPENDS+=+perlbase-class +perlbase-config +perlbase-cwd +perlbase-errno +perlbase-essential +perlbase-fcntl +perlbase-filehandle +perlbase-io +perlbase-locale +perlbase-params +perlbase-scalar +perlbase-symbol +perlbase-xsloader
++endef
++
++define Package/perlbase-file/install
++$(call perlmod/Install,$(1),File auto/File,File/Find.pm)
++$(call perlmod/Install/NoStrip,$(1),File/Find.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/File-Fetch/t cpan/File-Path/t cpan/File-Temp/t dist/PathTools/t ext/File-DosGlob/t ext/File-Find/t ext/File-Glob/t lib/File/Basename.t lib/File/Compare.t lib/File/Copy.t lib/File/stat-7896.t lib/File/stat.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-file))
++
++
++define Package/perlbase-filecache
++$(call Package/perlbase-template)
++TITLE:=FileCache perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-filecache/install
++$(call perlmod/Install,$(1),FileCache.pm,)
++$(call perlmod/InstallBaseTests,$(1),ext/FileCache/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-filecache))
++
++
++define Package/perlbase-filehandle
++$(call Package/perlbase-template)
++TITLE:=FileHandle perl module
++DEPENDS+=+perlbase-essential +perlbase-io
++endef
++
++define Package/perlbase-filehandle/install
++$(call perlmod/Install,$(1),FileHandle.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/FileHandle.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-filehandle))
++
++
++define Package/perlbase-filetest
++$(call Package/perlbase-template)
++TITLE:=filetest perl module
++endef
++
++define Package/perlbase-filetest/install
++$(call perlmod/Install,$(1),filetest.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/filetest.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-filetest))
++
++
++define Package/perlbase-filter
++$(call Package/perlbase-template)
++TITLE:=Filter perl module
++DEPENDS+=+perlbase-dynaloader +perlbase-essential +perlbase-text
++endef
++
++define Package/perlbase-filter/install
++$(call perlmod/Install,$(1),Filter auto/Filter,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Filter-Util-Call/filter-util.pl cpan/Filter-Util-Call/t dist/Filter-Simple/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-filter))
++
++
++define Package/perlbase-findbin
++$(call Package/perlbase-template)
++TITLE:=FindBin perl module
++DEPENDS+=+perlbase-cwd +perlbase-essential +perlbase-file
++endef
++
++define Package/perlbase-findbin/install
++$(call perlmod/Install,$(1),FindBin.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/FindBin.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-findbin))
++
++
++define Package/perlbase-gdbm-file
++$(call Package/perlbase-template)
++TITLE:=GDBM_File perl module
++DEPENDS+=+libgdbm +perlbase-essential +perlbase-tie +perlbase-xsloader
++endef
++
++define Package/perlbase-gdbm-file/install
++$(call perlmod/Install,$(1),GDBM_File.pm auto/GDBM_File,)
++$(call perlmod/InstallBaseTests,$(1),ext/GDBM_File/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-gdbm-file))
++
++
++define Package/perlbase-getopt
++$(call Package/perlbase-template)
++TITLE:=Getopt perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-getopt/install
++$(call perlmod/Install,$(1),Getopt,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Getopt-Long/t lib/Getopt/Std.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-getopt))
++
++
++define Package/perlbase-hash
++$(call Package/perlbase-template)
++TITLE:=Hash perl module
++DEPENDS+=+perlbase-essential +perlbase-scalar +perlbase-xsloader
++endef
++
++define Package/perlbase-hash/install
++$(call perlmod/Install,$(1),Hash auto/Hash,)
++$(call perlmod/InstallBaseTests,$(1),ext/Hash-Util-FieldHash/t ext/Hash-Util/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-hash))
++
++
++define Package/perlbase-http-tiny
++$(call Package/perlbase-template)
++TITLE:=http-tiny perl module
++DEPENDS+=+perlbase-errno +perlbase-essential +perlbase-io
++endef
++
++define Package/perlbase-http-tiny/install
++$(call perlmod/Install,$(1),HTTP/Tiny.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/HTTP-Tiny/corpus cpan/HTTP-Tiny/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-http-tiny))
++
++
++define Package/perlbase-i18n
++$(call Package/perlbase-template)
++TITLE:=I18N perl module
++DEPENDS+=+perlbase-essential +perlbase-posix +perlbase-xsloader
++endef
++
++define Package/perlbase-i18n/install
++$(call perlmod/Install,$(1),I18N auto/I18N,I18N/LangTags/List.pm)
++$(call perlmod/InstallBaseTests,$(1),dist/I18N-Collate/t dist/I18N-LangTags/t ext/I18N-Langinfo/t)
++$(call perlmod/Install/NoStrip,$(1),I18N/LangTags/List.pm)
++endef
++
++$(eval $(call BuildPackage,perlbase-i18n))
++
++
++define Package/perlbase-if
++$(call Package/perlbase-template)
++TITLE:=if perl module
++endef
++
++define Package/perlbase-if/install
++$(call perlmod/Install,$(1),if.pm,)
++$(call perlmod/InstallBaseTests,$(1),dist/if/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-if))
++
++
++define Package/perlbase-integer
++$(call Package/perlbase-template)
++TITLE:=integer perl module
++endef
++
++define Package/perlbase-integer/install
++$(call perlmod/Install,$(1),integer.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/integer.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-integer))
++
++
++define Package/perlbase-io
++$(call Package/perlbase-template)
++TITLE:=IO perl module
++DEPENDS+=+perlbase-base +perlbase-bytes +perlbase-config +perlbase-errno +perlbase-essential +perlbase-fcntl +perlbase-list +perlbase-posix +perlbase-scalar +perlbase-selectsaver +perlbase-socket +perlbase-symbol +perlbase-tie +perlbase-xsloader
++endef
++
++define Package/perlbase-io/install
++$(call perlmod/Install,$(1),IO IO.pm auto/IO,)
++$(call perlmod/InstallBaseTests,$(1),cpan/IO-Compress/t cpan/IO-Socket-IP/t cpan/IO-Zlib/t dist/IO/Makefile.PL dist/IO/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-io))
++
++
++define Package/perlbase-ipc
++$(call Package/perlbase-template)
++TITLE:=IPC perl module
++DEPENDS+=+perlbase-config +perlbase-essential +perlbase-file +perlbase-locale +perlbase-params +perlbase-symbol +perlbase-text
++endef
++
++define Package/perlbase-ipc/install
++$(call perlmod/Install,$(1),IPC auto/IPC,)
++$(call perlmod/InstallBaseTests,$(1),cpan/IPC-Cmd/t cpan/IPC-SysV/t ext/IPC-Open3/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-ipc))
++
++
++define Package/perlbase-json-pp
++$(call Package/perlbase-template)
++TITLE:=json-pp perl module
++DEPENDS+=+perlbase-b +perlbase-base +perlbase-essential
++endef
++
++define Package/perlbase-json-pp/install
++$(call perlmod/Install,$(1),JSON/PP JSON/PP.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/JSON-PP/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-json-pp))
++
++
++define Package/perlbase-less
++$(call Package/perlbase-template)
++TITLE:=less perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-less/install
++$(call perlmod/Install,$(1),less.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/less.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-less))
++
++
++define Package/perlbase-list
++$(call Package/perlbase-template)
++TITLE:=List perl module
++DEPENDS+=+perlbase-essential +perlbase-xsloader
++endef
++
++define Package/perlbase-list/install
++$(call perlmod/Install,$(1),List auto/List,)
++endef
++
++$(eval $(call BuildPackage,perlbase-list))
++
++
++define Package/perlbase-locale
++$(call Package/perlbase-template)
++TITLE:=Locale perl module
++DEPENDS+=+perlbase-essential +perlbase-i18n +perlbase-integer +perlbase-utf8
++endef
++
++define Package/perlbase-locale/install
++$(call perlmod/Install,$(1),Locale,Locale/Constants.pod Locale/Country.pod Locale/Currency.pod Locale/Language.pod Locale/Maketext.pod Locale/Maketext/TPJ13.pod Locale/Script.pod)
++$(call perlmod/InstallBaseTests,$(1),cpan/Locale-Codes/t cpan/Locale-Maketext-Simple/t dist/Locale-Maketext/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-locale))
++
++
++define Package/perlbase-math
++$(call Package/perlbase-template)
++TITLE:=Math perl module
++DEPENDS+=+perlbase-config +perlbase-essential +perlbase-scalar +perlbase-xsloader
++endef
++
++define Package/perlbase-math/install
++$(call perlmod/Install,$(1),Math auto/Math,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Math-Complex/t dist/Math-BigInt-FastCalc/t dist/Math-BigInt/t dist/Math-BigRat/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-math))
++
++
++define Package/perlbase-memoize
++$(call Package/perlbase-template)
++TITLE:=Memoize perl module
++DEPENDS+=+perlbase-config +perlbase-essential +perlbase-storable
++endef
++
++define Package/perlbase-memoize/install
++$(call perlmod/Install,$(1),Memoize Memoize.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Memoize/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-memoize))
++
++
++define Package/perlbase-meta-notation
++$(call Package/perlbase-template)
++TITLE:=meta_notation module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-meta-notation/install
++$(call perlmod/Install,$(1),meta_notation.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/meta_notation.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-meta-notation))
++
++
++define Package/perlbase-mime
++$(call Package/perlbase-template)
++TITLE:=MIME perl module
++DEPENDS+=+perlbase-essential +perlbase-xsloader
++endef
++
++define Package/perlbase-mime/install
++$(call perlmod/Install,$(1),MIME auto/MIME,)
++$(call perlmod/InstallBaseTests,$(1),cpan/MIME-Base64/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-mime))
++
++
++define Package/perlbase-module
++$(call Package/perlbase-template)
++TITLE:=Module perl module
++DEPENDS+=+perlbase-essential +perlbase-file +perlbase-filehandle +perlbase-locale +perlbase-params +perlbase-version
++endef
++
++define Package/perlbase-module/install
++$(call perlmod/Install,$(1),Module,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Module-Load-Conditional/t cpan/Module-Load/t cpan/Module-Loaded/t cpan/Module-Metadata/corpus cpan/Module-Metadata/lib cpan/Module-Metadata/t dist/Module-CoreList/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-module))
++
++
++define Package/perlbase-mro
++$(call Package/perlbase-template)
++TITLE:=mro perl module
++DEPENDS+=+perlbase-essential +perlbase-xsloader
++endef
++
++define Package/perlbase-mro/install
++$(call perlmod/Install,$(1),auto/mro mro.pm,)
++endef
++
++$(eval $(call BuildPackage,perlbase-mro))
++
++
++define Package/perlbase-net
++$(call Package/perlbase-template)
++TITLE:=Net perl module
++DEPENDS+=+perlbase-class +perlbase-errno +perlbase-essential +perlbase-fcntl +perlbase-filehandle +perlbase-io +perlbase-posix +perlbase-socket +perlbase-symbol +perlbase-time
++endef
++
++define Package/perlbase-net/install
++$(call perlmod/Install,$(1),Net,Net/libnetFAQ.pod)
++$(call perlmod/InstallBaseTests,$(1),cpan/libnet/t dist/Net-Ping/t lib/Net/hostent.t lib/Net/netent.t lib/Net/protoent.t lib/Net/servent.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-net))
++
++
++define Package/perlbase-next
++$(call Package/perlbase-template)
++TITLE:=NEXT perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-next/install
++$(call perlmod/Install,$(1),NEXT.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/NEXT/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-next))
++
++
++define Package/perlbase-o
++$(call Package/perlbase-template)
++TITLE:=O perl module
++DEPENDS+=+perlbase-b +perlbase-essential
++endef
++
++define Package/perlbase-o/install
++$(call perlmod/Install,$(1),O.pm,)
++endef
++
++$(eval $(call BuildPackage,perlbase-o))
++
++
++define Package/perlbase-opcode
++$(call Package/perlbase-template)
++TITLE:=Opcode perl module
++DEPENDS+=+perlbase-essential +perlbase-xsloader
++endef
++
++define Package/perlbase-opcode/install
++$(call perlmod/Install,$(1),auto/Opcode,)
++$(call perlmod/Install/NoStrip,$(1),Opcode.pm,)
++$(call perlmod/InstallBaseTests,$(1),ext/Opcode/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-opcode))
++
++
++define Package/perlbase-open
++$(call Package/perlbase-template)
++TITLE:=open perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-open/install
++$(call perlmod/Install,$(1),open.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/open.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-open))
++
++
++define Package/perlbase-ops
++$(call Package/perlbase-template)
++TITLE:=ops perl module
++DEPENDS+=+perlbase-opcode
++endef
++
++define Package/perlbase-ops/install
++$(call perlmod/Install,$(1),ops.pm,)
++endef
++
++$(eval $(call BuildPackage,perlbase-ops))
++
++
++define Package/perlbase-ostype
++$(call Package/perlbase-template)
++TITLE:=OSType perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-ostype/install
++$(call perlmod/Install,$(1),Perl/OSType.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Perl-OSType/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-ostype))
++
++
++define Package/perlbase-params
++$(call Package/perlbase-template)
++TITLE:=Params perl module
++DEPENDS+=+perlbase-essential +perlbase-locale
++endef
++
++define Package/perlbase-params/install
++$(call perlmod/Install,$(1),Params,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Params-Check/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-params))
++
++
++define Package/perlbase-perl5db
++$(call Package/perlbase-template)
++TITLE:=perl5db perl module
++DEPENDS+=+perlbase-cwd +perlbase-essential
++endef
++
++define Package/perlbase-perl5db/install
++$(call perlmod/Install,$(1),perl5db.pl,)
++$(call perlmod/InstallBaseTests,$(1),lib/perl5db.t lib/perl5db/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-perl5db))
++
++
++define Package/perlbase-perlio
++$(call Package/perlbase-template)
++TITLE:=PerlIO perl module
++DEPENDS+=+perlbase-essential +perlbase-mime +perlbase-xsloader
++endef
++
++define Package/perlbase-perlio/install
++$(call perlmod/Install,$(1),PerlIO PerlIO.pm auto/PerlIO,)
++$(call perlmod/InstallBaseTests,$(1),cpan/PerlIO-via-QuotedPrint/t ext/PerlIO-encoding/t ext/PerlIO-scalar/t ext/PerlIO-via/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-perlio))
++
++
++define Package/perlbase-pod
++$(call Package/perlbase-template)
++TITLE:=Pod perl module
++DEPENDS+=+perlbase-config +perlbase-cwd +perlbase-encode +perlbase-essential +perlbase-fcntl +perlbase-file +perlbase-getopt +perlbase-integer +perlbase-posix +perlbase-symbol +perlbase-term +perlbase-text
++endef
++
++define Package/perlbase-pod/install
++$(call perlmod/Install,$(1),Pod,Pod/Usage.pm)
++$(call perlmod/Install/NoStrip,$(1),Pod/Usage.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Pod-Checker/t cpan/Pod-Escapes/t cpan/Pod-Parser/lib cpan/Pod-Parser/scripts cpan/Pod-Parser/t cpan/Pod-Perldoc/t cpan/Pod-Simple/t cpan/Pod-Usage/scripts cpan/Pod-Usage/t cpan/podlators/t ext/Pod-Functions/Functions.pm ext/Pod-Functions/t ext/Pod-Html/t lib/Pod/t)
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/pod2man $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/pod2text $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,perlbase-pod))
++
++
++define Package/perlbase-posix
++$(call Package/perlbase-template)
++TITLE:=POSIX perl module
++DEPENDS+=+perlbase-essential +perlbase-fcntl +perlbase-tie +perlbase-xsloader
++endef
++
++define Package/perlbase-posix/install
++$(call perlmod/Install,$(1),POSIX.pm auto/POSIX,)
++$(call perlmod/InstallBaseTests,$(1),ext/POSIX/Makefile.PL ext/POSIX/POSIX.xs ext/POSIX/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-posix))
++
++
++define Package/perlbase-re
++$(call Package/perlbase-template)
++TITLE:=re perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-re/install
++$(call perlmod/Install,$(1),auto/re re.pm,)
++$(call perlmod/InstallBaseTests,$(1),ext/re/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-re))
++
++
++define Package/perlbase-safe
++$(call Package/perlbase-template)
++TITLE:=Safe perl module
++DEPENDS+=+perlbase-b +perlbase-essential +perlbase-opcode +perlbase-scalar +perlbase-utf8
++endef
++
++define Package/perlbase-safe/install
++$(call perlmod/Install,$(1),Safe.pm,)
++$(call perlmod/InstallBaseTests,$(1),dist/Safe/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-safe))
++
++
++define Package/perlbase-scalar
++$(call Package/perlbase-template)
++TITLE:=Scalar perl module
++DEPENDS+=+perlbase-essential +perlbase-list
++endef
++
++define Package/perlbase-scalar/install
++$(call perlmod/Install,$(1),Scalar Sub,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Scalar-List-Utils/t)
++ $(INSTALL_DIR) $(1)/$(PERL_TESTSDIR)/cpan/Scalar-List-Utils/blib
++endef
++
++$(eval $(call BuildPackage,perlbase-scalar))
++
++
++define Package/perlbase-sdbm-file
++$(call Package/perlbase-template)
++TITLE:=SDBM_File perl module
++DEPENDS+=+perlbase-essential +perlbase-tie +perlbase-xsloader
++endef
++
++define Package/perlbase-sdbm-file/install
++$(call perlmod/Install,$(1),SDBM_File.pm auto/SDBM_File,)
++$(call perlmod/InstallBaseTests,$(1),ext/SDBM_File/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-sdbm-file))
++
++
++define Package/perlbase-search
++$(call Package/perlbase-template)
++TITLE:=Search perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-search/install
++$(call perlmod/Install,$(1),Search,)
++$(call perlmod/InstallBaseTests,$(1),dist/Search-Dict/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-search))
++
++
++define Package/perlbase-selectsaver
++$(call Package/perlbase-template)
++TITLE:=SelectSaver perl module
++DEPENDS+=+perlbase-essential +perlbase-symbol
++endef
++
++define Package/perlbase-selectsaver/install
++$(call perlmod/Install,$(1),SelectSaver.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/SelectSaver.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-selectsaver))
++
++
++define Package/perlbase-selfloader
++$(call Package/perlbase-template)
++TITLE:=SelfLoader perl module
++DEPENDS+=+perlbase-essential +perlbase-io
++endef
++
++define Package/perlbase-selfloader/install
++$(call perlmod/Install,$(1),SelfLoader.pm,)
++$(call perlmod/InstallBaseTests,$(1),dist/SelfLoader/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-selfloader))
++
++
++define Package/perlbase-sigtrap
++$(call Package/perlbase-template)
++TITLE:=sigtrap perl module
++DEPENDS+=+perlbase-essential +perlbase-meta-notation
++endef
++
++define Package/perlbase-sigtrap/install
++$(call perlmod/Install,$(1),sigtrap.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/sigtrap.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-sigtrap))
++
++
++define Package/perlbase-socket
++$(call Package/perlbase-template)
++TITLE:=Socket perl module
++DEPENDS+=+perlbase-essential +perlbase-xsloader
++endef
++
++define Package/perlbase-socket/install
++$(call perlmod/Install,$(1),Socket.pm auto/Socket,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Socket/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-socket))
++
++
++define Package/perlbase-sort
++$(call Package/perlbase-template)
++TITLE:=sort perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-sort/install
++$(call perlmod/Install,$(1),sort.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/sort.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-sort))
++
++
++define Package/perlbase-storable
++$(call Package/perlbase-template)
++TITLE:=Storable perl module
++DEPENDS+=+perlbase-essential +perlbase-xsloader
++endef
++
++define Package/perlbase-storable/install
++$(call perlmod/Install,$(1),Storable.pm auto/Storable,)
++$(call perlmod/InstallBaseTests,$(1),dist/Storable/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-storable))
++
++
++define Package/perlbase-symbol
++$(call Package/perlbase-template)
++TITLE:=Symbol perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-symbol/install
++$(call perlmod/Install,$(1),Symbol.pm,)
++$(call perlmod/InstallBaseTests,$(1),lib/Symbol.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-symbol))
++
++
++define Package/perlbase-sys
++$(call Package/perlbase-template)
++TITLE:=Sys perl module
++DEPENDS+=+perlbase-essential +perlbase-file +perlbase-posix +perlbase-socket
++endef
++
++define Package/perlbase-sys/install
++$(call perlmod/Install,$(1),Sys auto/Sys,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Sys-Syslog/t ext/Sys-Hostname/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-sys))
++
++
++define Package/perlbase-tap
++$(call Package/perlbase-template)
++TITLE:=TAP perl module
++DEPENDS+=+perlbase-base +perlbase-benchmark +perlbase-config +perlbase-essential +perlbase-file +perlbase-io +perlbase-posix +perlbase-text
++endef
++
++define Package/perlbase-tap/install
++$(call perlmod/Install,$(1),TAP,)
++endef
++
++$(eval $(call BuildPackage,perlbase-tap))
++
++
++define Package/perlbase-term
++$(call Package/perlbase-template)
++TITLE:=Term perl module
++DEPENDS+=+perlbase-essential
++endef
++
++define Package/perlbase-term/install
++$(call perlmod/Install,$(1),Term,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Term-ANSIColor/t cpan/Term-Cap/test.pl dist/Term-Complete/t dist/Term-ReadLine/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-term))
++
++
++define Package/perlbase-test
++$(call Package/perlbase-template)
++TITLE:=Test perl module
++DEPENDS+=+perlbase-base +perlbase-config +perlbase-essential +perlbase-io +perlbase-symbol +perlbase-tap +perlbase-text
++endef
++
++define Package/perlbase-test/install
++$(call perlmod/Install,$(1),Test Test.pm ok.pm,Test/Builder.pm Test/Harness/TAP.pod Test/More.pm Test/Tutorial.pod)
++$(call perlmod/Install/NoStrip,$(1),Test/Builder.pm Test/More.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Test-Harness/t cpan/Test-Simple/t cpan/Test/t)
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/prove $(1)/usr/bin
++endef
++
++$(eval $(call BuildPackage,perlbase-test))
++
++
++define Package/perlbase-text
++$(call Package/perlbase-template)
++TITLE:=Text perl module
++DEPENDS+=+perlbase-essential +perlbase-selfloader
++endef
++
++define Package/perlbase-text/install
++$(call perlmod/Install,$(1),Text,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Text-Balanced/t cpan/Text-ParseWords/t cpan/Text-Tabs/t dist/Text-Abbrev/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-text))
++
++
++define Package/perlbase-thread
++$(call Package/perlbase-template)
++TITLE:=Thread perl module
++DEPENDS+=+perlbase-essential +perlbase-scalar +perlbase-threads
++endef
++
++define Package/perlbase-thread/install
++$(call perlmod/Install,$(1),Thread Thread.pm,)
++$(call perlmod/InstallBaseTests,$(1),dist/Thread-Queue/t dist/Thread-Semaphore/t lib/Thread.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-thread))
++
++
++define Package/perlbase-threads
++$(call Package/perlbase-template)
++TITLE:=threads perl module
++DEPENDS+=+perlbase-config +perlbase-essential +perlbase-scalar +perlbase-xsloader
++endef
++
++define Package/perlbase-threads/install
++$(call perlmod/Install,$(1),auto/threads threads threads.pm,)
++$(call perlmod/InstallBaseTests,$(1),dist/threads-shared/t dist/threads/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-threads))
++
++
++define Package/perlbase-tie
++$(call Package/perlbase-template)
++TITLE:=Tie perl module
++DEPENDS+=+perlbase-essential +perlbase-fcntl +perlbase-xsloader
++endef
++
++define Package/perlbase-tie/install
++$(call perlmod/Install,$(1),Tie auto/Tie,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Tie-RefHash/t dist/Tie-File/t ext/Tie-Hash-NamedCapture/t ext/Tie-Memoize/lib/Tie/Memoize.pm ext/Tie-Memoize/t lib/Tie/Array/push.t lib/Tie/Array/splice.t lib/Tie/Array/std.t lib/Tie/Array/stdpush.t lib/Tie/ExtraHash.t lib/Tie/Handle/stdhandle.t lib/Tie/Handle/stdhandle_from_handle.t lib/Tie/Hash.t lib/Tie/Scalar.t lib/Tie/SubstrHash.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-tie))
++
++
++define Package/perlbase-time
++$(call Package/perlbase-template)
++TITLE:=Time perl module
++DEPENDS+=+perlbase-class +perlbase-config +perlbase-dynaloader +perlbase-essential
++endef
++
++define Package/perlbase-time/install
++$(call perlmod/Install,$(1),Time auto/Time,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Time-HiRes/t cpan/Time-Local/t cpan/Time-Piece/t lib/Time/gmtime.t lib/Time/localtime.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-time))
++
++
++define Package/perlbase-unicode
++$(call Package/perlbase-template)
++TITLE:=Unicode perl module
++DEPENDS+=+perlbase-base +perlbase-charnames +perlbase-dynaloader +perlbase-essential +perlbase-file
++endef
++
++define Package/perlbase-unicode/install
++$(call perlmod/Install,$(1),Unicode auto/Unicode,)
++$(call perlmod/InstallBaseTests,$(1),cpan/Unicode-Collate/t cpan/Unicode-Normalize/t lib/Unicode/UCD.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-unicode))
++
++
++define Package/perlbase-unicore
++$(call Package/perlbase-template)
++TITLE:=unicore perl module
++endef
++
++define Package/perlbase-unicore/install
++$(call perlmod/Install,$(1),unicore,)
++$(call perlmod/InstallBaseTests,$(1),lib/unicore/NameAliases.txt lib/unicore/PropValueAliases.txt lib/unicore/PropertyAliases.txt lib/unicore/UnicodeData.txt)
++endef
++
++$(eval $(call BuildPackage,perlbase-unicore))
++
++
++define Package/perlbase-universal
++$(call Package/perlbase-template)
++TITLE:=UNIVERSAL perl module
++endef
++
++define Package/perlbase-universal/install
++$(call perlmod/Install,$(1),UNIVERSAL.pm,)
++endef
++
++$(eval $(call BuildPackage,perlbase-universal))
++
++
++define Package/perlbase-user
++$(call Package/perlbase-template)
++TITLE:=User perl module
++DEPENDS+=+perlbase-class +perlbase-config +perlbase-essential
++endef
++
++define Package/perlbase-user/install
++$(call perlmod/Install,$(1),User,)
++$(call perlmod/InstallBaseTests,$(1),lib/User/grent.t lib/User/pwent.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-user))
++
++
++define Package/perlbase-utf8
++$(call Package/perlbase-template)
++TITLE:=utf8 perl module
++DEPENDS+=+perlbase-essential +perlbase-re
++endef
++
++define Package/perlbase-utf8/install
++$(call perlmod/Install,$(1),utf8.pm utf8_heavy.pl,)
++$(call perlmod/InstallBaseTests,$(1),lib/utf8.t)
++endef
++
++$(eval $(call BuildPackage,perlbase-utf8))
++
++
++define Package/perlbase-version
++$(call Package/perlbase-template)
++TITLE:=version perl module
++DEPENDS+=+perlbase-config +perlbase-essential
++endef
++
++define Package/perlbase-version/install
++$(call perlmod/Install,$(1),version version.pm,)
++$(call perlmod/InstallBaseTests,$(1),cpan/version/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-version))
++
++
++define Package/perlbase-xsloader
++$(call Package/perlbase-template)
++TITLE:=XSLoader perl module
++endef
++
++define Package/perlbase-xsloader/install
++$(call perlmod/Install,$(1),XSLoader.pm,)
++$(call perlmod/InstallBaseTests,$(1),dist/XSLoader/t ext/XS-APItest/t ext/XS-Typemap/t)
++endef
++
++$(eval $(call BuildPackage,perlbase-xsloader))
++
++
++# Generated Fri Sep 25 07:47:59 2015
+diff --git a/feeds/packages/lang/perl/perlmod.mk b/feeds/packages/lang/perl/perlmod.mk
+new file mode 100644
+index 0000000..a6f4eaa
+--- /dev/null
++++ b/feeds/packages/lang/perl/perlmod.mk
+@@ -0,0 +1,162 @@
++# This makefile simplifies perl module builds.
++#
++
++PERL_VERSION:=5.22
++
++# Build environment
++HOST_PERL_PREFIX:=$(STAGING_DIR_HOST)/usr
++ifneq ($(CONFIG_USE_GLIBC),)
++ EXTRA_LIBS:=bsd
++ EXTRA_LIBDIRS:=$(STAGING_DIR)/lib
++endif
++PERL_CMD:=$(STAGING_DIR_HOST)/usr/bin/perl$(PERL_VERSION).0
++
++MOD_CFLAGS_PERL:=-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $(TARGET_CFLAGS) $(TARGET_CPPFLAGS)
++ifdef CONFIG_PERL_THREADS
++ MOD_CFLAGS_PERL+= -D_REENTRANT -D_GNU_SOURCE
++endif
++
++# Module install prefix
++PERL_SITELIB:=/usr/lib/perl5/$(PERL_VERSION)
++PERL_TESTSDIR:=/usr/share/perl/perl-tests
++PERLBASE_TESTSDIR:=/usr/share/perl/perlbase-tests
++PERLMOD_TESTSDIR:=/usr/share/perl/perlmod-tests
++
++define perlmod/host/relink
++ rm -f $(1)/Makefile.aperl
++ $(MAKE) -C $(1) perl
++ $(CP) $(1)/perl $(PERL_CMD)
++ $(CP) $(1)/perl $(STAGING_DIR_HOST)/usr/bin/perl
++endef
++
++define perlmod/host/Configure
++ (cd $(HOST_BUILD_DIR); \
++ PERL_MM_USE_DEFAULT=1 \
++ $(2) \
++ $(PERL_CMD) Makefile.PL \
++ $(1) \
++ );
++endef
++
++define perlmod/host/Compile
++ $(2) \
++ $(MAKE) -C $(HOST_BUILD_DIR) \
++ $(1) \
++ install
++endef
++
++define perlmod/host/Install
++ $(2) \
++ $(MAKE) -C $(HOST_BUILD_DIR) \
++ $(1) \
++ install
++ $(call perlmod/host/relink,$(HOST_BUILD_DIR))
++endef
++
++define perlmod/Configure
++ (cd $(if $(3),$(3),$(PKG_BUILD_DIR)); \
++ PERL_MM_USE_DEFAULT=1 \
++ $(2) \
++ $(PERL_CMD) -MConfig -e '$$$${tied %Config::Config}{cpprun}="$(GNU_TARGET_NAME)-cpp -E"; do "Makefile.PL"' \
++ $(1) \
++ AR=ar \
++ CC=$(GNU_TARGET_NAME)-gcc \
++ CCFLAGS="$(MOD_CFLAGS_PERL)" \
++ CCCDLFLAGS=-fPIC \
++ CCDLFLAGS=-Wl,-E \
++ DLEXT=so \
++ DLSRC=dl_dlopen.xs \
++ EXE_EXT=" " \
++ FULL_AR=$(GNU_TARGET_NAME)-ar \
++ LD=$(GNU_TARGET_NAME)-gcc \
++ LDDLFLAGS="-shared -rdynamic $(TARGET_LDFLAGS)" \
++ LDFLAGS="$(EXTRA_LIBDIRS:%=-L%) $(EXTRA_LIBS:%=-l%) " \
++ LIBC=" " \
++ LIB_EXT=.a \
++ OBJ_EXT=.o \
++ OSNAME=linux \
++ OSVERS=2.4.30 \
++ RANLIB=: \
++ SITELIBEXP=" " \
++ SITEARCHEXP=" " \
++ SO=so \
++ VENDORARCHEXP=" " \
++ VENDORLIBEXP=" " \
++ SITEPREFIX=/usr \
++ INSTALLPRIVLIB=$(PERL_SITELIB) \
++ INSTALLSITELIB=$(PERL_SITELIB) \
++ INSTALLVENDORLIB=" " \
++ INSTALLARCHLIB=$(PERL_SITELIB) \
++ INSTALLSITEARCH=$(PERL_SITELIB) \
++ INSTALLVENDORARCH=" " \
++ INSTALLBIN=/usr/bin \
++ INSTALLSITEBIN=/usr/bin \
++ INSTALLVENDORBIN=" " \
++ INSTALLSCRIPT=/usr/bin \
++ INSTALLSITESCRIPT=/usr/bin \
++ INSTALLVENDORSCRIPT=" " \
++ INSTALLMAN1DIR=/usr/man/man1 \
++ INSTALLSITEMAN1DIR=/usr/man/man1 \
++ INSTALLVENDORMAN1DIR=" " \
++ INSTALLMAN3DIR=/usr/man/man3 \
++ INSTALLSITEMAN3DIR=/usr/man/man3 \
++ INSTALLVENDORMAN3DIR=" " \
++ LINKTYPE=dynamic \
++ DESTDIR=$(PKG_INSTALL_DIR) \
++ );
++ sed 's!^PERL_INC = .*!PERL_INC = $(STAGING_DIR)/usr/lib/perl5/$(PERL_VERSION)/CORE/!' -i $(if $(3),$(3),$(PKG_BUILD_DIR))/Makefile
++endef
++
++define perlmod/Compile
++ PERL5LIB=$(PERL_LIB) \
++ $(2) \
++ $(MAKE) -C $(if $(3),$(3),$(PKG_BUILD_DIR)) \
++ $(1) \
++ install
++endef
++
++define perlmod/Install/NoStrip
++ $(INSTALL_DIR) $(strip $(1))$(PERL_SITELIB)
++ (cd $(PKG_INSTALL_DIR)$(PERL_SITELIB) && \
++ rsync --relative -rlHp --itemize-changes \
++ --exclude=\*.pod \
++ --exclude=.packlist \
++ $(addprefix --exclude=/,$(strip $(3))) \
++ --prune-empty-dirs \
++ $(strip $(2)) $(strip $(1))$(PERL_SITELIB))
++
++ chmod -R u+w $(strip $(1))$(PERL_SITELIB)
++endef
++
++
++define perlmod/Install
++ $(call perlmod/Install/NoStrip,$(1),$(2),$(3))
++
++ @echo "---> Stripping modules in: $(strip $(1))$(PERL_SITELIB)"
++ find $(strip $(1))$(PERL_SITELIB) -name \*.pm -or -name \*.pl | \
++ xargs -r sed -i \
++ -e '/^=\(head\|pod\|item\|over\|back\|encoding\|begin\|end\|for\)/,/^=cut/d' \
++ -e '/^=\(head\|pod\|item\|over\|back\|encoding\|begin\|end\|for\)/,$$$$d' \
++ -e '/^#$$$$/d' \
++ -e '/^#[^!"'"'"']/d'
++endef
++
++# You probably don't want to use this directly. Look at perlmod/InstallTests
++define perlmod/_InstallTests
++ $(INSTALL_DIR) $(strip $(1))
++ (cd $(PKG_BUILD_DIR)/$(2) && \
++ rsync --relative -rlHp --itemize-changes \
++ --exclude=.packlist \
++ --prune-empty-dirs \
++ $(strip $(3)) $(strip $(1)))
++
++ chmod -R u+w $(strip $(1))
++endef
++
++define perlmod/InstallBaseTests
++ $(if $(CONFIG_PERL_TESTS),$(call perlmod/_InstallTests,$(1)$(PERL_TESTSDIR),,$(2)))
++endef
++
++define perlmod/InstallTests
++ $(if $(CONFIG_PERL_TESTS),$(call perlmod/_InstallTests,$(1)$(PERL_TESTSDIR),$(2),$(3)))
++endef
+diff --git a/feeds/packages/lang/php5-pecl-dio/Makefile b/feeds/packages/lang/php5-pecl-dio/Makefile
+new file mode 100644
+index 0000000..9f7367b
+--- /dev/null
++++ b/feeds/packages/lang/php5-pecl-dio/Makefile
+@@ -0,0 +1,36 @@
++#
++# Copyright (C) 2012-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PECL_NAME:=dio
++PECL_LONGNAME:=Direct I/O functions
++
++PKG_VERSION:=0.0.7
++PKG_RELEASE:=1
++PKG_MD5SUM:=a1a4df428a17dbe1ab4277b492dfa052
++
++PKG_NAME:=php5-pecl-$(PECL_NAME)
++PKG_SOURCE:=$(PECL_NAME)-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=http://pecl.php.net/get/
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PECL_NAME)-$(PKG_VERSION)
++PKG_BUILD_PARALLEL:=1
++
++PKG_MAINTAINER:=Michael Heimpold <mhei@heimpold.de>
++
++PKG_LICENSE:=PHPv3.01
++PKG_LICENSE_FILES:=
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++include ../php5/pecl.mk
++
++$(eval $(call PECLPackage,$(PECL_NAME),$(PECL_LONGNAME)))
++$(eval $(call BuildPackage,$(PKG_NAME)))
+diff --git a/feeds/packages/lang/php5-pecl-dio/patches/010-additional-baudrates.patch b/feeds/packages/lang/php5-pecl-dio/patches/010-additional-baudrates.patch
+new file mode 100644
+index 0000000..5032e6e
+--- /dev/null
++++ b/feeds/packages/lang/php5-pecl-dio/patches/010-additional-baudrates.patch
+@@ -0,0 +1,29 @@
++--- a/dio.c
+++++ b/dio.c
++@@ -442,6 +442,26 @@ PHP_FUNCTION(dio_tcsetattr)
++
++ /* assign to correct values... */
++ switch (Baud_Rate) {
+++#ifdef B460800
+++ case 460800:
+++ BAUD = B460800;
+++ break;
+++#endif
+++#ifdef B230400
+++ case 230400:
+++ BAUD = B230400;
+++ break;
+++#endif
+++#ifdef B115200
+++ case 115200:
+++ BAUD = B115200;
+++ break;
+++#endif
+++#ifdef B57600
+++ case 57600:
+++ BAUD = B57600;
+++ break;
+++#endif
++ case 38400:
++ BAUD = B38400;
++ break;
+diff --git a/feeds/packages/lang/php5-pecl-libevent/Makefile b/feeds/packages/lang/php5-pecl-libevent/Makefile
+new file mode 100644
+index 0000000..feca20d
+--- /dev/null
++++ b/feeds/packages/lang/php5-pecl-libevent/Makefile
+@@ -0,0 +1,38 @@
++#
++# Copyright (C) 2012-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PECL_NAME:=libevent
++PECL_LONGNAME:=Libevent - event notification
++
++PKG_VERSION:=0.1.0
++PKG_RELEASE:=2
++PKG_MD5SUM:=e091371a9e714098a4c04a6e3daeb56a
++
++PKG_NAME:=php5-pecl-$(PECL_NAME)
++PKG_SOURCE:=$(PECL_NAME)-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=http://pecl.php.net/get/
++
++PKG_MAINTAINER:=Michael Heimpold <mhei@heimpold.de>
++
++PKG_LICENSE:=PHPv3.01
++PKG_LICENSE_FILES:=
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PECL_NAME)-$(PKG_VERSION)
++PKG_BUILD_PARALLEL:=1
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++include ../php5/pecl.mk
++
++CONFIGURE_ARGS+= --with-libevent=shared,"$(STAGING_DIR)/usr"
++
++$(eval $(call PECLPackage,$(PECL_NAME),$(PECL_LONGNAME),+libevent2 +php5-mod-sockets))
++$(eval $(call BuildPackage,$(PKG_NAME)))
+diff --git a/feeds/packages/lang/php5-pecl-libevent/patches/010-libevent2.patch b/feeds/packages/lang/php5-pecl-libevent/patches/010-libevent2.patch
+new file mode 100644
+index 0000000..961fb36
+--- /dev/null
++++ b/feeds/packages/lang/php5-pecl-libevent/patches/010-libevent2.patch
+@@ -0,0 +1,16 @@
++--- a/libevent.c
+++++ b/libevent.c
++@@ -42,10 +42,12 @@
++ (rsrc = (rsrc_type) zend_fetch_resource(passed_id TSRMLS_CC, default_id, resource_type_name, NULL, 1, resource_type))
++ #endif
++
++-#ifdef PHP_WIN32
+++//#ifdef PHP_WIN32
++ /* XXX compiling with 2.x on Windows. Luckily the ext code works thanks to the
++ compat exports from the libevent. However it might need to be adapted to the
++ never version, so this ifdefs would go away. */
+++#if 1
+++/* force use of libevent2 on OpenWrt and by-pass compat event.h */
++ # include <event2/event.h>
++ # include <event2/event_compat.h>
++ # include <event2/event_struct.h>
+diff --git a/feeds/packages/lang/php5-pecl-propro/Makefile b/feeds/packages/lang/php5-pecl-propro/Makefile
+new file mode 100644
+index 0000000..14f39fd
+--- /dev/null
++++ b/feeds/packages/lang/php5-pecl-propro/Makefile
+@@ -0,0 +1,39 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PECL_NAME:=propro
++PECL_LONGNAME:=Property proxy
++
++PKG_VERSION:=1.0.0
++PKG_RELEASE:=1
++PKG_MD5SUM:=9c775035fd17c65f0162b7eb1b4f8564
++
++PKG_NAME:=php5-pecl-propro
++PKG_SOURCE:=$(PECL_NAME)-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=http://pecl.php.net/get/
++
++PKG_MAINTAINER:=Michael Heimpold <mhei@heimpold.de>
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PECL_NAME)-$(PKG_VERSION)
++PKG_BUILD_PARALLEL:=1
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++include ../php5/pecl.mk
++
++CONFIGURE_ARGS+= \
++ --enable-propro
++
++$(eval $(call PECLPackage,$(PECL_NAME),$(PECL_LONGNAME)))
++$(eval $(call BuildPackage,$(PKG_NAME)))
+diff --git a/feeds/packages/lang/php5-pecl-raphf/Makefile b/feeds/packages/lang/php5-pecl-raphf/Makefile
+new file mode 100644
+index 0000000..3a87566
+--- /dev/null
++++ b/feeds/packages/lang/php5-pecl-raphf/Makefile
+@@ -0,0 +1,39 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PECL_NAME:=raphf
++PECL_LONGNAME:=Resource and persistent handles factory
++
++PKG_VERSION:=1.1.0
++PKG_RELEASE:=1
++PKG_MD5SUM:=4d95c44dc28be089ce59bceb647b8db2
++
++PKG_NAME:=php5-pecl-raphf
++PKG_SOURCE:=$(PECL_NAME)-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=http://pecl.php.net/get/
++
++PKG_MAINTAINER:=Michael Heimpold <mhei@heimpold.de>
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PECL_NAME)-$(PKG_VERSION)
++PKG_BUILD_PARALLEL:=1
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++include ../php5/pecl.mk
++
++CONFIGURE_ARGS+= \
++ --enable-raphf
++
++$(eval $(call PECLPackage,$(PECL_NAME),$(PECL_LONGNAME)))
++$(eval $(call BuildPackage,$(PKG_NAME)))
+diff --git a/feeds/packages/lang/php5/Makefile b/feeds/packages/lang/php5/Makefile
+new file mode 100644
+index 0000000..cd6989a
+--- /dev/null
++++ b/feeds/packages/lang/php5/Makefile
+@@ -0,0 +1,573 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=php
++PKG_VERSION:=5.6.14
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>, Michael Heimpold <mhei@heimpold.de>
++
++PKG_LICENSE:=PHPv3.01
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.php.net/distributions/
++PKG_MD5SUM:=2e1332123a7e19d15ed2af2d1d6bd6fd
++
++PKG_FIXUP:=libtool autoreconf
++PKG_BUILD_PARALLEL:=1
++PKG_USE_MIPS16:=0
++
++PHP5_MODULES = \
++ calendar ctype curl \
++ fileinfo \
++ dom \
++ exif \
++ ftp \
++ gettext gd gmp \
++ hash \
++ iconv \
++ json \
++ ldap \
++ mbstring mcrypt mysql mysqli \
++ opcache openssl \
++ pcntl pdo pdo-mysql pdo-pgsql pdo-sqlite pgsql \
++ session shmop simplexml soap sockets sqlite3 sysvmsg sysvsem sysvshm \
++ tokenizer \
++ xml xmlreader xmlwriter zip \
++
++PKG_CONFIG_DEPENDS:= \
++ $(patsubst %,CONFIG_PACKAGE_php5-mod-%,$(PHP5_MODULES)) \
++ CONFIG_PHP5_FILTER CONFIG_PHP5_LIBXML CONFIG_PHP5_SYSTEMTZDATA
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/php5/Default
++ SUBMENU:=PHP
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=PHP5 Hypertext preprocessor
++ URL:=http://www.php.net/
++ DEPENDS:=php5
++endef
++
++define Package/php5/Default/description
++ PHP is a widely-used general-purpose scripting language that is especially
++ suited for Web development and can be embedded into HTML.
++endef
++
++define Package/php5/config
++ config PHP5_FILTER
++ bool "PHP5 Filter support"
++ depends on PACKAGE_php5-cli || PACKAGE_php5-cgi
++
++ config PHP5_LIBXML
++ bool "PHP5 LIBXML support"
++ depends on PACKAGE_php5-cli || PACKAGE_php5-cgi
++
++ config PHP5_SYSTEMTZDATA
++ bool "Use system timezone data instead of php's built-in database"
++ depends on PACKAGE_php5-cli || PACKAGE_php5-cgi
++ select PACKAGE_zoneinfo-core
++ default y
++ help
++ Enabling this feature automatically selects the zoneinfo-core package
++ which contains data for UTC timezone. To use other timezones you have
++ to install the corresponding zoneinfo-... package(s).
++endef
++
++define Package/php5
++ $(call Package/php5/Default)
++
++ DEPENDS:=+libpcre +zlib \
++ +PHP5_LIBXML:libxml2
++endef
++
++define Package/php5/description
++ $(call Package/php5/Default/description)
++ This package contains only the PHP config file. You must actually choose
++ your PHP flavour (cli, cgi or fastcgi).
++endef
++
++define Package/php5-cli
++ $(call Package/php5/Default)
++ TITLE+= (CLI)
++endef
++
++define Package/php5-cli/description
++ $(call Package/php5/Default/description)
++ This package contains the CLI version of the PHP5 interpreter.
++endef
++
++define Package/php5-cgi
++ $(call Package/php5/Default)
++ TITLE+= (CGI & FastCGI)
++endef
++
++define Package/php5-cgi/description
++ $(call Package/php5/Default/description)
++ This package contains the CGI version of the PHP5 interpreter.
++endef
++
++define Package/php5-fastcgi
++ $(call Package/php5/Default)
++ DEPENDS+= +php5-cgi
++ TITLE:=FastCGI startup script
++endef
++
++define Package/php5-fastcgi/description
++ As FastCGI support is now a core feature the php5-fastcgi package now depends
++ on the php5-cgi package, containing just the startup script.
++endef
++
++define Package/php5-fpm
++ $(call Package/php5/Default)
++ DEPENDS+= +php5-cgi
++ TITLE+= (FPM)
++endef
++
++define Package/php5-fpm/description
++ $(call Package/php5/Default/description)
++ This package contains the FastCGI Process Manager of the PHP5 interpreter.
++endef
++
++CONFIGURE_ARGS+= \
++ --enable-cli \
++ --enable-cgi \
++ --enable-fpm \
++ --enable-shared \
++ --disable-static \
++ --disable-rpath \
++ --disable-debug \
++ --without-pear \
++ \
++ --with-config-file-path=/etc \
++ --with-config-file-scan-dir=/etc/php5 \
++ --disable-short-tags \
++ \
++ --with-zlib="$(STAGING_DIR)/usr" \
++ --with-zlib-dir="$(STAGING_DIR)/usr" \
++ --with-pcre-regex="$(STAGING_DIR)/usr" \
++ --disable-phar
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-calendar),)
++ CONFIGURE_ARGS+= --enable-calendar=shared
++else
++ CONFIGURE_ARGS+= --disable-calendar
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-ctype),)
++ CONFIGURE_ARGS+= --enable-ctype=shared
++else
++ CONFIGURE_ARGS+= --disable-ctype
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-curl),)
++ CONFIGURE_ARGS+= --with-curl=shared,"$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= --without-curl
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-fileinfo),)
++ CONFIGURE_ARGS+= --enable-fileinfo=shared
++else
++ CONFIGURE_ARGS+= --disable-fileinfo
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-gettext),)
++ CONFIGURE_ARGS+= --with-gettext=shared,"$(STAGING_DIR)/usr/lib/libintl-full"
++else
++ CONFIGURE_ARGS+= --without-gettext
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-dom),)
++ CONFIGURE_ARGS+= --enable-dom=shared
++else
++ CONFIGURE_ARGS+= --disable-dom
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-exif),)
++ CONFIGURE_ARGS+= --enable-exif=shared
++else
++ CONFIGURE_ARGS+= --disable-exif
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-ftp),)
++ CONFIGURE_ARGS+= --enable-ftp=shared
++else
++ CONFIGURE_ARGS+= --disable-ftp
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-gd),)
++ CONFIGURE_ARGS+= \
++ --with-gd=shared \
++ --without-freetype-dir \
++ --with-jpeg-dir="$(STAGING_DIR)/usr" \
++ --with-png-dir="$(STAGING_DIR)/usr" \
++ --without-xpm-dir \
++ --without-t1lib \
++ --enable-gd-native-ttf \
++ --disable-gd-jis-conv
++else
++ CONFIGURE_ARGS+= --without-gd
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-gmp),)
++ CONFIGURE_ARGS+= --with-gmp=shared,"$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= --without-gmp
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-hash),)
++ CONFIGURE_ARGS+= --enable-hash=shared
++else
++ CONFIGURE_ARGS+= --disable-hash
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-iconv),)
++ CONFIGURE_ARGS+= --with-iconv=shared,"$(ICONV_PREFIX)"
++else
++ CONFIGURE_ARGS+= --without-iconv
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-json),)
++ CONFIGURE_ARGS+= --enable-json=shared
++else
++ CONFIGURE_ARGS+= --disable-json
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-ldap),)
++ CONFIGURE_ARGS+= \
++ --with-ldap=shared,"$(STAGING_DIR)/usr" \
++ --with-ldap-sasl="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= --without-ldap
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-mbstring),)
++ CONFIGURE_ARGS+= --enable-mbstring=shared --enable-mbregex
++else
++ CONFIGURE_ARGS+= --disable-mbstring
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-mcrypt),)
++ CONFIGURE_ARGS+= --with-mcrypt=shared,"$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= --without-mcrypt
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-mysql),)
++ CONFIGURE_ARGS+= --with-mysql=shared,"$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= --without-mysql
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-mysqli),)
++ CONFIGURE_ARGS+= --with-mysqli=shared,"$(STAGING_DIR)/usr/bin/mysql_config"
++else
++ CONFIGURE_ARGS+= --without-mysqli
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-opcache),)
++ CONFIGURE_ARGS+= --enable-opcache=shared
++else
++ CONFIGURE_ARGS+= --disable-opcache
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-openssl),)
++ CONFIGURE_ARGS+= \
++ --with-openssl=shared,"$(STAGING_DIR)/usr" \
++ --with-kerberos=no \
++ --with-openssl-dir="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= --without-openssl
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-pcntl),)
++ CONFIGURE_ARGS+= --enable-pcntl=shared
++else
++ CONFIGURE_ARGS+= --disable-pcntl
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-pdo),)
++ CONFIGURE_ARGS+= --enable-pdo=shared
++ ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-pdo-mysql),)
++ CONFIGURE_ARGS+= --with-pdo-mysql=shared,"$(STAGING_DIR)/usr"
++ else
++ CONFIGURE_ARGS+= --without-pdo-mysql
++ endif
++ ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-pdo-pgsql),)
++ CONFIGURE_ARGS+= --with-pdo-pgsql=shared,"$(STAGING_DIR)/usr"
++ else
++ CONFIGURE_ARGS+= --without-pdo-pgsql
++ endif
++ ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-pdo-sqlite),)
++ CONFIGURE_ARGS+= --with-pdo-sqlite=shared,"$(STAGING_DIR)/usr"
++ else
++ CONFIGURE_ARGS+= --without-pdo-sqlite
++ endif
++else
++ CONFIGURE_ARGS+= --disable-pdo
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-pgsql),)
++ CONFIGURE_ARGS+= --with-pgsql=shared,"$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= --without-pgsql
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-session),)
++ CONFIGURE_ARGS+= --enable-session=shared
++else
++ CONFIGURE_ARGS+= --disable-session
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-shmop),)
++ CONFIGURE_ARGS+= --enable-shmop=shared
++else
++ CONFIGURE_ARGS+= --disable-shmop
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-simplexml),)
++ CONFIGURE_ARGS+= --enable-simplexml=shared
++else
++ CONFIGURE_ARGS+= --disable-simplexml
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-soap),)
++ CONFIGURE_ARGS+= --enable-soap=shared
++else
++ CONFIGURE_ARGS+= --disable-soap
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-sockets),)
++ CONFIGURE_ARGS+= --enable-sockets=shared
++else
++ CONFIGURE_ARGS+= --disable-sockets
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-sqlite3),)
++ CONFIGURE_ARGS+= --with-sqlite3=shared,"$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= --without-sqlite3
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-sysvmsg),)
++ CONFIGURE_ARGS+= --enable-sysvmsg=shared
++else
++ CONFIGURE_ARGS+= --disable-sysvmsg
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-sysvsem),)
++ CONFIGURE_ARGS+= --enable-sysvsem=shared
++else
++ CONFIGURE_ARGS+= --disable-sysvsem
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-sysvshm),)
++ CONFIGURE_ARGS+= --enable-sysvshm=shared
++else
++ CONFIGURE_ARGS+= --disable-sysvshm
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-tokenizer),)
++ CONFIGURE_ARGS+= --enable-tokenizer=shared
++else
++ CONFIGURE_ARGS+= --disable-tokenizer
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-xml),)
++ CONFIGURE_ARGS+= --enable-xml=shared,"$(STAGING_DIR)/usr"
++ ifneq ($(CONFIG_PHP5_LIBXML),)
++ CONFIGURE_ARGS+= --with-libxml-dir="$(STAGING_DIR)/usr/include/libxml2"
++ else
++ CONFIGURE_ARGS+= --with-libexpat-dir="$(STAGING_DIR)/usr"
++ endif
++else
++ CONFIGURE_ARGS+= --disable-xml
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-xmlreader),)
++ CONFIGURE_ARGS+= --enable-xmlreader=shared,"$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= --disable-xmlreader
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_php5-mod-xmlwriter),)
++ CONFIGURE_ARGS+= --enable-xmlwriter=shared,"$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= --disable-xmlwriter
++endif
++
++ifneq ($(CONFIG_PACKAGE_php5-mod-zip),)
++ CONFIGURE_ARGS+= --enable-zip=shared
++else
++ CONFIGURE_ARGS+= --disable-zip
++endif
++
++ifneq ($(SDK)$(CONFIG_PHP5_FILTER),)
++ CONFIGURE_ARGS+= --enable-filter
++else
++ CONFIGURE_ARGS+= --disable-filter
++endif
++
++ifneq ($(SDK)$(CONFIG_PHP5_LIBXML),)
++ CONFIGURE_ARGS+= --enable-libxml
++ CONFIGURE_ARGS+= --with-libxml-dir="$(STAGING_DIR)/usr/include/libxml2"
++else
++ CONFIGURE_ARGS+= --disable-libxml
++endif
++
++ifneq ($(CONFIG_PHP5_SYSTEMTZDATA),)
++ CONFIGURE_ARGS+= --with-system-tzdata
++else
++ CONFIGURE_ARGS+= --without-system-tzdata
++endif
++
++CONFIGURE_VARS+= \
++ ac_cv_c_bigendian_php=$(if $(CONFIG_BIG_ENDIAN),yes,no) \
++ php_cv_cc_rpath="no" \
++ iconv_impl_name="gnu_libiconv" \
++ ac_cv_php_xml2_config_path="$(STAGING_DIR)/host/bin/xml2-config" \
++
++define Package/php5/conffiles
++/etc/php.ini
++endef
++
++define Package/php5/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) ./files/php.ini $(1)/etc/
++endef
++
++define Package/php5-cli/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_BUILD_DIR)/sapi/cli/php $(1)/usr/bin/php-cli
++endef
++
++define Package/php5-cgi/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_BUILD_DIR)/sapi/cgi/php-cgi $(1)/usr/bin/php-cgi
++ ln -sf php-cgi $(1)/usr/bin/php-fcgi
++endef
++
++define Package/php5-fastcgi/install
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/php5-fastcgi.config $(1)/etc/config/php5-fastcgi
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/php5-fastcgi.init $(1)/etc/init.d/php5-fastcgi
++endef
++
++define Package/php5-fpm/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/sapi/fpm/php-fpm $(1)/usr/bin/php-fpm
++
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) ./files/php5-fpm.conf $(1)/etc/php5-fpm.conf
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/php5-fpm.config $(1)/etc/config/php5-fpm
++
++ $(INSTALL_DIR) $(1)/etc/php5-fpm.d
++ $(INSTALL_DATA) ./files/php5-fpm-www.conf $(1)/etc/php5-fpm.d/www.conf
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/php5-fpm.init $(1)/etc/init.d/php5-fpm
++endef
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ ( cd $(PKG_BUILD_DIR); touch configure.in; ./buildconf --force )
++endef
++
++define Build/InstallDev
++ mkdir -p $(PKG_BUILD_DIR)/staging/usr/bin
++ make -C $(PKG_BUILD_DIR) install INSTALL_ROOT=$(PKG_BUILD_DIR)/staging
++ rm -f $(PKG_BUILD_DIR)/staging/usr/bin/php
++ $(CP) $(PKG_BUILD_DIR)/staging/* $(STAGING_DIR_HOST)
++ sed -i -e "s#prefix='/usr'#prefix='$(STAGING_DIR_HOST)/usr'#" $(STAGING_DIR_HOST)/usr/bin/phpize
++ sed -i -e "s#exec_prefix=\"\`eval echo /usr\`\"#exec_prefix='$(STAGING_DIR_HOST)/usr'#" $(STAGING_DIR_HOST)/usr/bin/phpize
++ sed -i -e "s#prefix=\"/usr\"#prefix=\"$(STAGING_DIR_HOST)/usr\"#" $(STAGING_DIR_HOST)/usr/bin/php-config
++endef
++
++define BuildModule
++
++ define Package/php5-mod-$(1)
++ $(call Package/php5/Default)
++
++ ifneq ($(3),)
++ DEPENDS+=$(3)
++ endif
++
++ TITLE:=$(2) shared module
++ endef
++
++ define Package/php5-mod-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/php
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/modules/$(subst -,_,$(1)).so $$(1)/usr/lib/php/
++ $(INSTALL_DIR) $$(1)/etc/php5
++ ifeq ($(4),zend)
++ echo "zend_extension=/usr/lib/php/$(subst -,_,$(1)).so" > $$(1)/etc/php5/$(subst -,_,$(1)).ini
++ else
++ echo "extension=$(subst -,_,$(1)).so" > $$(1)/etc/php5/$(subst -,_,$(1)).ini
++ endif
++ endef
++
++ $$(eval $$(call BuildPackage,php5-mod-$(1)))
++
++endef
++
++$(eval $(call BuildPackage,php5))
++$(eval $(call BuildPackage,php5-cgi))
++$(eval $(call BuildPackage,php5-cli))
++$(eval $(call BuildPackage,php5-fastcgi))
++$(eval $(call BuildPackage,php5-fpm))
++
++#$(eval $(call BuildModule,NAME,TITLE[,PKG DEPENDS]))
++$(eval $(call BuildModule,calendar,Calendar))
++$(eval $(call BuildModule,ctype,Ctype))
++$(eval $(call BuildModule,curl,cURL,+PACKAGE_php5-mod-curl:libcurl))
++$(eval $(call BuildModule,dom,DOM,+@PHP5_LIBXML +PACKAGE_php5-mod-dom:libxml2))
++$(eval $(call BuildModule,exif,EXIF))
++$(eval $(call BuildModule,fileinfo,Fileinfo))
++$(eval $(call BuildModule,ftp,FTP,+PACKAGE_php5-mod-ftp:libopenssl))
++$(eval $(call BuildModule,gd,GD graphics,+PACKAGE_php5-mod-gd:libjpeg +PACKAGE_php5-mod-gd:libpng))
++$(eval $(call BuildModule,gettext,Gettext,+PACKAGE_php5-mod-gettext:libintl-full))
++$(eval $(call BuildModule,gmp,GMP,+PACKAGE_php5-mod-gmp:libgmp))
++$(eval $(call BuildModule,hash,Hash))
++$(eval $(call BuildModule,iconv,iConv,$(ICONV_DEPENDS)))
++$(eval $(call BuildModule,json,JSON))
++$(eval $(call BuildModule,ldap,LDAP,+PACKAGE_php5-mod-ldap:libopenldap +PACKAGE_php5-mod-ldap:libsasl2))
++$(eval $(call BuildModule,mbstring,MBString))
++$(eval $(call BuildModule,mcrypt,Mcrypt,+PACKAGE_php5-mod-mcrypt:libmcrypt +PACKAGE_php5-mod-mcrypt:libltdl))
++$(eval $(call BuildModule,mysql,MySQL,+PACKAGE_php5-mod-mysql:libmysqlclient))
++$(eval $(call BuildModule,mysqli,MySQL Improved Extension,+PACKAGE_php5-mod-mysqli:libmysqlclient))
++$(eval $(call BuildModule,opcache,OPcache,,zend))
++$(eval $(call BuildModule,openssl,OpenSSL,+PACKAGE_php5-mod-openssl:libopenssl))
++$(eval $(call BuildModule,pcntl,PCNTL))
++$(eval $(call BuildModule,pdo,PHP Data Objects))
++$(eval $(call BuildModule,pdo-mysql,PDO driver for MySQL,+php5-mod-pdo +PACKAGE_php5-mod-pdo-mysql:libmysqlclient))
++$(eval $(call BuildModule,pdo-pgsql,PDO driver for PostgreSQL,+php5-mod-pdo +PACKAGE_php5-mod-pdo-pgsql:libpq))
++$(eval $(call BuildModule,pdo-sqlite,PDO driver for SQLite 3.x,+php5-mod-pdo +PACKAGE_php5-mod-pdo-sqlite:libsqlite3 +PACKAGE_php5-mod-pdo-sqlite:librt))
++$(eval $(call BuildModule,pgsql,PostgreSQL,+PACKAGE_php5-mod-pgsql:libpq))
++$(eval $(call BuildModule,session,Session))
++$(eval $(call BuildModule,shmop,Shared Memory))
++$(eval $(call BuildModule,simplexml,SimpleXML,+@PHP5_LIBXML +PACKAGE_php5-mod-simplexml:libxml2))
++$(eval $(call BuildModule,soap,SOAP,+@PHP5_LIBXML +PACKAGE_php5-mod-soap:libxml2))
++$(eval $(call BuildModule,sockets,Sockets))
++$(eval $(call BuildModule,sqlite3,SQLite3,+PACKAGE_php5-mod-sqlite3:libsqlite3))
++$(eval $(call BuildModule,sysvmsg,System V messages))
++$(eval $(call BuildModule,sysvsem,System V shared memory))
++$(eval $(call BuildModule,sysvshm,System V semaphore))
++$(eval $(call BuildModule,tokenizer,Tokenizer))
++$(eval $(call BuildModule,xml,XML,+PHP5_LIBXML:libxml2 +!PHP5_LIBXML:libexpat))
++$(eval $(call BuildModule,xmlreader,XMLReader,+@PHP5_LIBXML +PACKAGE_php5-mod-xmlreader:libxml2))
++$(eval $(call BuildModule,xmlwriter,XMLWriter,+@PHP5_LIBXML +PACKAGE_php5-mod-xmlwriter:libxml2))
++$(eval $(call BuildModule,zip,ZIP,+PACKAGE_php5-mod-zip:zlib))
+diff --git a/feeds/packages/lang/php5/files/php.ini b/feeds/packages/lang/php5/files/php.ini
+new file mode 100644
+index 0000000..23a8bb9
+--- /dev/null
++++ b/feeds/packages/lang/php5/files/php.ini
+@@ -0,0 +1,321 @@
++[PHP]
++
++zend.ze1_compatibility_mode = Off
++
++; Language Options
++
++engine = On
++;short_open_tag = Off
++precision = 12
++y2k_compliance = On
++output_buffering = Off
++;output_handler =
++zlib.output_compression = Off
++;zlib.output_compression_level = -1
++;zlib.output_handler =
++implicit_flush = Off
++unserialize_callback_func =
++serialize_precision = 100
++
++;open_basedir =
++disable_functions =
++disable_classes =
++
++; Colors for Syntax Highlighting mode. Anything that's acceptable in
++; <span style="color: ???????"> would work.
++;highlight.string = #DD0000
++;highlight.comment = #FF9900
++;highlight.keyword = #007700
++;highlight.bg = #FFFFFF
++;highlight.default = #0000BB
++;highlight.html = #000000
++
++;ignore_user_abort = On
++;realpath_cache_size = 16k
++;realpath_cache_ttl = 120
++
++; Miscellaneous
++
++expose_php = On
++
++; Resource Limits
++
++max_execution_time = 30 ; Maximum execution time of each script, in seconds.
++max_input_time = 60 ; Maximum amount of time each script may spend parsing request data.
++;max_input_nesting_level = 64
++memory_limit = 8M ; Maximum amount of memory a script may consume.
++
++; Error handling and logging
++
++; Error Level Constants:
++; E_ALL - All errors and warnings (includes E_STRICT as of PHP 6.0.0)
++; E_ERROR - fatal run-time errors
++; E_RECOVERABLE_ERROR - almost fatal run-time errors
++; E_WARNING - run-time warnings (non-fatal errors)
++; E_PARSE - compile-time parse errors
++; E_NOTICE - run-time notices (these are warnings which often result
++; from a bug in your code, but it's possible that it was
++; intentional (e.g., using an uninitialized variable and
++; relying on the fact it's automatically initialized to an
++; empty string)
++; E_STRICT - run-time notices, enable to have PHP suggest changes
++; to your code which will ensure the best interoperability
++; and forward compatibility of your code
++; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
++; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
++; initial startup
++; E_COMPILE_ERROR - fatal compile-time errors
++; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
++; E_USER_ERROR - user-generated error message
++; E_USER_WARNING - user-generated warning message
++; E_USER_NOTICE - user-generated notice message
++; E_DEPRECATED - warn about code that will not work in future versions
++; of PHP
++; E_USER_DEPRECATED - user-generated deprecation warnings
++;
++; Common Values:
++; E_ALL & ~E_NOTICE (Show all errors, except for notices and coding standards warnings.)
++; E_ALL & ~E_NOTICE | E_STRICT (Show all errors, except for notices)
++; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
++; E_ALL | E_STRICT (Show all errors, warnings and notices including coding standards.)
++; Default Value: E_ALL & ~E_NOTICE
++error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT
++
++display_errors = On
++display_startup_errors = Off
++log_errors = Off
++log_errors_max_len = 1024
++ignore_repeated_errors = Off
++ignore_repeated_source = Off
++report_memleaks = On
++;report_zend_debug = 0
++track_errors = Off
++;html_errors = Off
++;docref_root = "/phpmanual/"
++;docref_ext = .html
++;error_prepend_string = "<font color=#ff0000>"
++;error_append_string = "</font>"
++; Log errors to specified file.
++;error_log = /var/log/php_errors.log
++; Log errors to syslog.
++;error_log = syslog
++
++; Data Handling
++
++;arg_separator.output = "&amp;"
++;arg_separator.input = ";&"
++variables_order = "EGPCS"
++request_order = "GP"
++register_globals = Off
++register_long_arrays = Off
++register_argc_argv = On
++auto_globals_jit = On
++post_max_size = 8M
++;magic_quotes_gpc = Off
++magic_quotes_runtime = Off
++magic_quotes_sybase = Off
++auto_prepend_file =
++auto_append_file =
++default_mimetype = "text/html"
++;default_charset = "iso-8859-1"
++;always_populate_raw_post_data = On
++
++; Paths and Directories
++
++; UNIX: "/path1:/path2"
++;include_path = ".:/php/includes"
++doc_root = "/www"
++user_dir =
++extension_dir = "/usr/lib/php"
++enable_dl = On
++;cgi.force_redirect = 1
++;cgi.nph = 1
++;cgi.redirect_status_env = ;
++cgi.fix_pathinfo=1
++;fastcgi.impersonate = 1;
++;fastcgi.logging = 0
++;cgi.rfc2616_headers = 0
++
++; File Uploads
++
++file_uploads = On
++upload_tmp_dir = "/tmp"
++upload_max_filesize = 2M
++max_file_uploads = 20
++
++; Fopen wrappers
++
++allow_url_fopen = On
++allow_url_include = Off
++;from="john@doe.com"
++;user_agent="PHP"
++default_socket_timeout = 60
++;auto_detect_line_endings = Off
++
++; Dynamic Extensions
++
++;extension=ctype.so
++;extension=curl.so
++;extension=dom.so
++;extension=exif.so
++;extension=ftp.so
++;extension=gd.so
++;extension=gmp.so
++;extension=hash.so
++;extension=iconv.so
++;extension=json.so
++;extension=ldap.so
++;extension=mbstring.so
++;extension=mcrypt.so
++;extension=mysql.so
++;extension=openssl.so
++;extension=pcre.so
++;extension=pdo.so
++;extension=pdo-mysql.so
++;extension=pdo-pgsql.so
++;extension=pdo_sqlite.so
++;extension=pgsql.so
++;extension=session.so
++;extension=soap.so
++;extension=sockets.so
++;extension=sqlite.so
++;extension=sqlite3.so
++;extension=tokenizer.so
++;extension=xml.so
++;extension=xmlreader.so
++;extension=xmlwriter.so
++
++; Module Settings
++
++[APC]
++apc.enabled = 1
++apc.shm_segments = 1 ;The number of shared memory segments to allocate for the compiler cache.
++apc.shm_size = 4M ;The size of each shared memory segment.
++
++[Date]
++;date.timezone =
++;date.default_latitude = 31.7667
++;date.default_longitude = 35.2333
++;date.sunrise_zenith = 90.583333
++;date.sunset_zenith = 90.583333
++
++[filter]
++;filter.default = unsafe_raw
++;filter.default_flags =
++
++[iconv]
++;iconv.input_encoding = ISO-8859-1
++;iconv.internal_encoding = ISO-8859-1
++;iconv.output_encoding = ISO-8859-1
++
++[sqlite]
++;sqlite.assoc_case = 0
++
++[sqlite3]
++;sqlite3.extension_dir =
++
++[Pdo_mysql]
++pdo_mysql.cache_size = 2000
++pdo_mysql.default_socket=
++
++[MySQL]
++mysql.allow_local_infile = On
++mysql.allow_persistent = On
++mysql.cache_size = 2000
++mysql.max_persistent = -1
++mysql.max_links = -1
++mysql.default_port =
++mysql.default_socket =
++mysql.default_host =
++mysql.default_user =
++mysql.default_password =
++mysql.connect_timeout = 60
++mysql.trace_mode = Off
++
++[PostgresSQL]
++pgsql.allow_persistent = On
++pgsql.auto_reset_persistent = Off
++pgsql.max_persistent = -1
++pgsql.max_links = -1
++pgsql.ignore_notice = 0
++pgsql.log_notice = 0
++
++[Session]
++session.save_handler = files
++session.save_path = "/tmp"
++session.use_cookies = 1
++;session.cookie_secure =
++session.use_only_cookies = 1
++session.name = PHPSESSID
++session.auto_start = 0
++session.cookie_lifetime = 0
++session.cookie_path = /
++session.cookie_domain =
++session.cookie_httponly =
++session.serialize_handler = php
++session.gc_probability = 1
++session.gc_divisor = 100
++session.gc_maxlifetime = 1440
++session.bug_compat_42 = On
++session.bug_compat_warn = On
++session.referer_check =
++session.entropy_length = 0
++;session.entropy_file = /dev/urandom
++session.entropy_file =
++;session.entropy_length = 16
++session.cache_limiter = nocache
++session.cache_expire = 180
++session.use_trans_sid = 0
++session.hash_function = 0
++session.hash_bits_per_character = 4
++url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="
++
++[mbstring]
++;mbstring.language = Japanese
++;mbstring.internal_encoding = EUC-JP
++;mbstring.http_input = auto
++;mbstring.http_output = SJIS
++;mbstring.encoding_translation = Off
++;mbstring.detect_order = auto
++;mbstring.substitute_character = none;
++;mbstring.func_overload = 0
++;mbstring.strict_detection = Off
++;mbstring.http_output_conv_mimetype=
++;mbstring.script_encoding=
++
++[gd]
++;gd.jpeg_ignore_warning = 0
++
++[exif]
++;exif.encode_unicode = ISO-8859-15
++;exif.decode_unicode_motorola = UCS-2BE
++;exif.decode_unicode_intel = UCS-2LE
++;exif.encode_jis =
++;exif.decode_jis_motorola = JIS
++;exif.decode_jis_intel = JIS
++
++[soap]
++soap.wsdl_cache_enabled=1
++soap.wsdl_cache_dir="/tmp"
++soap.wsdl_cache_ttl=86400
++soap.wsdl_cache_limit = 5
++
++[sysvshm]
++;sysvshm.init_mem = 10000
++
++[ldap]
++ldap.max_links = -1
++
++[mcrypt]
++;mcrypt.algorithms_dir=
++;mcrypt.modes_dir=
++
++[opcache]
++;opcache.memory_consumption=8 ; 8M is the allowed minimum
++;opcache.interned_strings_buffer=1
++opcache.max_accelerated_files=200 ; 200 is the allowed minimum
++;opcache.revalidate_freq=60
++;opcache.fast_shutdown=1
++opcache.enable_cli=1
++opcache.enable=1
++;opcache.log_verbosity_level=4
+diff --git a/feeds/packages/lang/php5/files/php5-fastcgi.config b/feeds/packages/lang/php5/files/php5-fastcgi.config
+new file mode 100644
+index 0000000..039d3bb
+--- /dev/null
++++ b/feeds/packages/lang/php5/files/php5-fastcgi.config
+@@ -0,0 +1,3 @@
++config php5-fastcgi
++ option enabled 1
++ option port '1026'
+diff --git a/feeds/packages/lang/php5/files/php5-fastcgi.init b/feeds/packages/lang/php5/files/php5-fastcgi.init
+new file mode 100644
+index 0000000..0c452ad
+--- /dev/null
++++ b/feeds/packages/lang/php5/files/php5-fastcgi.init
+@@ -0,0 +1,30 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2010-2011 OpenWrt.org
++
++START=50
++
++SERVICE_DAEMONIZE=1
++SERVICE_WRITE_PID=1
++
++start_instance() {
++ local section="$1"
++ local enabled
++ local port
++
++ config_get_bool enabled "$section" 'enabled' 0
++ config_get port "$section" 'port' 1026
++
++ [ $enabled -gt 0 ] || return 1
++
++ PHP_FCGI_CHILDREN='' \
++ service_start /usr/bin/php-fcgi -b $port
++}
++
++start() {
++ config_load 'php5-fastcgi'
++ config_foreach start_instance 'php5-fastcgi'
++}
++
++stop() {
++ service_stop /usr/bin/php-fcgi
++}
+diff --git a/feeds/packages/lang/php5/files/php5-fpm-www.conf b/feeds/packages/lang/php5/files/php5-fpm-www.conf
+new file mode 100644
+index 0000000..4776bba
+--- /dev/null
++++ b/feeds/packages/lang/php5/files/php5-fpm-www.conf
+@@ -0,0 +1,392 @@
++; Start a new pool named 'www'.
++; the variable $pool can we used in any directive and will be replaced by the
++; pool name ('www' here)
++[www]
++
++; Per pool prefix
++; It only applies on the following directives:
++; - 'slowlog'
++; - 'listen' (unixsocket)
++; - 'chroot'
++; - 'chdir'
++; - 'php_values'
++; - 'php_admin_values'
++; When not set, the global prefix (or /usr) applies instead.
++; Note: This directive can also be relative to the global prefix.
++; Default Value: none
++;prefix = /path/to/pools/$pool
++
++; Unix user/group of processes
++; Note: The user is mandatory. If the group is not set, the default user's group
++; will be used.
++user = nobody
++;group =
++
++; The address on which to accept FastCGI requests.
++; Valid syntaxes are:
++; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on
++; a specific port;
++; 'port' - to listen on a TCP socket to all addresses on a
++; specific port;
++; '/path/to/unix/socket' - to listen on a unix socket.
++; Note: This value is mandatory.
++listen = /var/run/php5-fpm.sock
++
++; Set listen(2) backlog.
++; Default Value: 128 (-1 on FreeBSD and OpenBSD)
++;listen.backlog = 128
++
++; Set permissions for unix socket, if one is used. In Linux, read/write
++; permissions must be set in order to allow connections from a web server. Many
++; BSD-derived systems allow connections regardless of permissions.
++; Default Values: user and group are set as the running user
++; mode is set to 0666
++;listen.owner = www-data
++;listen.group = www-data
++;listen.mode = 0666
++
++; List of ipv4 addresses of FastCGI clients which are allowed to connect.
++; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
++; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
++; must be separated by a comma. If this value is left blank, connections will be
++; accepted from any ip address.
++; Default Value: any
++;listen.allowed_clients = 127.0.0.1
++
++; Specify the nice(2) priority to apply to the pool processes (only if set)
++; The value can vary from -19 (highest priority) to 20 (lower priority)
++; Note: - It will only work if the FPM master process is launched as root
++; - The pool processes will inherit the master process priority
++; unless it specified otherwise
++; Default Value: no set
++; priority = -19
++
++; Choose how the process manager will control the number of child processes.
++; Possible Values:
++; static - a fixed number (pm.max_children) of child processes;
++; dynamic - the number of child processes are set dynamically based on the
++; following directives. With this process management, there will be
++; always at least 1 children.
++; pm.max_children - the maximum number of children that can
++; be alive at the same time.
++; pm.start_servers - the number of children created on startup.
++; pm.min_spare_servers - the minimum number of children in 'idle'
++; state (waiting to process). If the number
++; of 'idle' processes is less than this
++; number then some children will be created.
++; pm.max_spare_servers - the maximum number of children in 'idle'
++; state (waiting to process). If the number
++; of 'idle' processes is greater than this
++; number then some children will be killed.
++; ondemand - no children are created at startup. Children will be forked when
++; new requests will connect. The following parameter are used:
++; pm.max_children - the maximum number of children that
++; can be alive at the same time.
++; pm.process_idle_timeout - The number of seconds after which
++; an idle process will be killed.
++; Note: This value is mandatory.
++pm = dynamic
++
++; The number of child processes to be created when pm is set to 'static' and the
++; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
++; This value sets the limit on the number of simultaneous requests that will be
++; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
++; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
++; CGI. The below defaults are based on a server without much resources. Don't
++; forget to tweak pm.* to fit your needs.
++; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
++; Note: This value is mandatory.
++pm.max_children = 5
++
++; The number of child processes created on startup.
++; Note: Used only when pm is set to 'dynamic'
++; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
++pm.start_servers = 2
++
++; The desired minimum number of idle server processes.
++; Note: Used only when pm is set to 'dynamic'
++; Note: Mandatory when pm is set to 'dynamic'
++pm.min_spare_servers = 1
++
++; The desired maximum number of idle server processes.
++; Note: Used only when pm is set to 'dynamic'
++; Note: Mandatory when pm is set to 'dynamic'
++pm.max_spare_servers = 3
++
++; The number of seconds after which an idle process will be killed.
++; Note: Used only when pm is set to 'ondemand'
++; Default Value: 10s
++;pm.process_idle_timeout = 10s;
++
++; The number of requests each child process should execute before respawning.
++; This can be useful to work around memory leaks in 3rd party libraries. For
++; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
++; Default Value: 0
++;pm.max_requests = 500
++
++; The URI to view the FPM status page. If this value is not set, no URI will be
++; recognized as a status page. It shows the following informations:
++; pool - the name of the pool;
++; process manager - static, dynamic or ondemand;
++; start time - the date and time FPM has started;
++; start since - number of seconds since FPM has started;
++; accepted conn - the number of request accepted by the pool;
++; listen queue - the number of request in the queue of pending
++; connections (see backlog in listen(2));
++; max listen queue - the maximum number of requests in the queue
++; of pending connections since FPM has started;
++; listen queue len - the size of the socket queue of pending connections;
++; idle processes - the number of idle processes;
++; active processes - the number of active processes;
++; total processes - the number of idle + active processes;
++; max active processes - the maximum number of active processes since FPM
++; has started;
++; max children reached - number of times, the process limit has been reached,
++; when pm tries to start more children (works only for
++; pm 'dynamic' and 'ondemand');
++; Value are updated in real time.
++; Example output:
++; pool: www
++; process manager: static
++; start time: 01/Jul/2011:17:53:49 +0200
++; start since: 62636
++; accepted conn: 190460
++; listen queue: 0
++; max listen queue: 1
++; listen queue len: 42
++; idle processes: 4
++; active processes: 11
++; total processes: 15
++; max active processes: 12
++; max children reached: 0
++;
++; By default the status page output is formatted as text/plain. Passing either
++; 'html', 'xml' or 'json' in the query string will return the corresponding
++; output syntax. Example:
++; http://www.foo.bar/status
++; http://www.foo.bar/status?json
++; http://www.foo.bar/status?html
++; http://www.foo.bar/status?xml
++;
++; By default the status page only outputs short status. Passing 'full' in the
++; query string will also return status for each pool process.
++; Example:
++; http://www.foo.bar/status?full
++; http://www.foo.bar/status?json&full
++; http://www.foo.bar/status?html&full
++; http://www.foo.bar/status?xml&full
++; The Full status returns for each process:
++; pid - the PID of the process;
++; state - the state of the process (Idle, Running, ...);
++; start time - the date and time the process has started;
++; start since - the number of seconds since the process has started;
++; requests - the number of requests the process has served;
++; request duration - the duration in µs of the requests;
++; request method - the request method (GET, POST, ...);
++; request URI - the request URI with the query string;
++; content length - the content length of the request (only with POST);
++; user - the user (PHP_AUTH_USER) (or '-' if not set);
++; script - the main script called (or '-' if not set);
++; last request cpu - the %cpu the last request consumed
++; it's always 0 if the process is not in Idle state
++; because CPU calculation is done when the request
++; processing has terminated;
++; last request memory - the max amount of memory the last request consumed
++; it's always 0 if the process is not in Idle state
++; because memory calculation is done when the request
++; processing has terminated;
++; If the process is in Idle state, then informations are related to the
++; last request the process has served. Otherwise informations are related to
++; the current request being served.
++; Example output:
++; ************************
++; pid: 31330
++; state: Running
++; start time: 01/Jul/2011:17:53:49 +0200
++; start since: 63087
++; requests: 12808
++; request duration: 1250261
++; request method: GET
++; request URI: /test_mem.php?N=10000
++; content length: 0
++; user: -
++; script: /home/fat/web/docs/php/test_mem.php
++; last request cpu: 0.00
++; last request memory: 0
++;
++; Note: There is a real-time FPM status monitoring sample web page available
++; It's available in: ${prefix}/share/fpm/status.html
++;
++; Note: The value must start with a leading slash (/). The value can be
++; anything, but it may not be a good idea to use the .php extension or it
++; may conflict with a real PHP file.
++; Default Value: not set
++;pm.status_path = /status
++
++; The ping URI to call the monitoring page of FPM. If this value is not set, no
++; URI will be recognized as a ping page. This could be used to test from outside
++; that FPM is alive and responding, or to
++; - create a graph of FPM availability (rrd or such);
++; - remove a server from a group if it is not responding (load balancing);
++; - trigger alerts for the operating team (24/7).
++; Note: The value must start with a leading slash (/). The value can be
++; anything, but it may not be a good idea to use the .php extension or it
++; may conflict with a real PHP file.
++; Default Value: not set
++;ping.path = /ping
++
++; This directive may be used to customize the response of a ping request. The
++; response is formatted as text/plain with a 200 response code.
++; Default Value: pong
++;ping.response = pong
++
++; The access log file
++; Default: not set
++;access.log = log/$pool.access.log
++
++; The access log format.
++; The following syntax is allowed
++; %%: the '%' character
++; %C: %CPU used by the request
++; it can accept the following format:
++; - %{user}C for user CPU only
++; - %{system}C for system CPU only
++; - %{total}C for user + system CPU (default)
++; %d: time taken to serve the request
++; it can accept the following format:
++; - %{seconds}d (default)
++; - %{miliseconds}d
++; - %{mili}d
++; - %{microseconds}d
++; - %{micro}d
++; %e: an environment variable (same as $_ENV or $_SERVER)
++; it must be associated with embraces to specify the name of the env
++; variable. Some exemples:
++; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
++; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e
++; %f: script filename
++; %l: content-length of the request (for POST request only)
++; %m: request method
++; %M: peak of memory allocated by PHP
++; it can accept the following format:
++; - %{bytes}M (default)
++; - %{kilobytes}M
++; - %{kilo}M
++; - %{megabytes}M
++; - %{mega}M
++; %n: pool name
++; %o: ouput header
++; it must be associated with embraces to specify the name of the header:
++; - %{Content-Type}o
++; - %{X-Powered-By}o
++; - %{Transfert-Encoding}o
++; - ....
++; %p: PID of the child that serviced the request
++; %P: PID of the parent of the child that serviced the request
++; %q: the query string
++; %Q: the '?' character if query string exists
++; %r: the request URI (without the query string, see %q and %Q)
++; %R: remote IP address
++; %s: status (response code)
++; %t: server time the request was received
++; it can accept a strftime(3) format:
++; %d/%b/%Y:%H:%M:%S %z (default)
++; %T: time the log has been written (the request has finished)
++; it can accept a strftime(3) format:
++; %d/%b/%Y:%H:%M:%S %z (default)
++; %u: remote user
++;
++; Default: "%R - %u %t \"%m %r\" %s"
++;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
++
++; The log file for slow requests
++; Default Value: not set
++; Note: slowlog is mandatory if request_slowlog_timeout is set
++;slowlog = log/$pool.log.slow
++
++; The timeout for serving a single request after which a PHP backtrace will be
++; dumped to the 'slowlog' file. A value of '0s' means 'off'.
++; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
++; Default Value: 0
++;request_slowlog_timeout = 0
++
++; The timeout for serving a single request after which the worker process will
++; be killed. This option should be used when the 'max_execution_time' ini option
++; does not stop script execution for some reason. A value of '0' means 'off'.
++; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
++; Default Value: 0
++;request_terminate_timeout = 0
++
++; Set open file descriptor rlimit.
++; Default Value: system defined value
++;rlimit_files = 1024
++
++; Set max core size rlimit.
++; Possible Values: 'unlimited' or an integer greater or equal to 0
++; Default Value: system defined value
++;rlimit_core = 0
++
++; Chroot to this directory at the start. This value must be defined as an
++; absolute path. When this value is not set, chroot is not used.
++; Note: you can prefix with '$prefix' to chroot to the pool prefix or one
++; of its subdirectories. If the pool prefix is not set, the global prefix
++; will be used instead.
++; Note: chrooting is a great security feature and should be used whenever
++; possible. However, all PHP paths will be relative to the chroot
++; (error_log, sessions.save_path, ...).
++; Default Value: not set
++;chroot =
++
++; Chdir to this directory at the start.
++; Note: relative path can be used.
++; Default Value: current directory or / when chroot
++chdir = /
++
++; Redirect worker stdout and stderr into main error log. If not set, stdout and
++; stderr will be redirected to /dev/null according to FastCGI specs.
++; Note: on highloaded environement, this can cause some delay in the page
++; process time (several ms).
++; Default Value: no
++;catch_workers_output = yes
++
++; Limits the extensions of the main script FPM will allow to parse. This can
++; prevent configuration mistakes on the web server side. You should only limit
++; FPM to .php extensions to prevent malicious users to use other extensions to
++; exectute php code.
++; Note: set an empty value to allow all extensions.
++; Default Value: .php
++;security.limit_extensions = .php .php3 .php4 .php5
++
++; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
++; the current environment.
++; Default Value: clean env
++;env[HOSTNAME] = $HOSTNAME
++;env[PATH] = /usr/local/bin:/usr/bin:/bin
++;env[TMP] = /tmp
++;env[TMPDIR] = /tmp
++;env[TEMP] = /tmp
++
++; Additional php.ini defines, specific to this pool of workers. These settings
++; overwrite the values previously defined in the php.ini. The directives are the
++; same as the PHP SAPI:
++; php_value/php_flag - you can set classic ini defines which can
++; be overwritten from PHP call 'ini_set'.
++; php_admin_value/php_admin_flag - these directives won't be overwritten by
++; PHP call 'ini_set'
++; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no.
++
++; Defining 'extension' will load the corresponding shared extension from
++; extension_dir. Defining 'disable_functions' or 'disable_classes' will not
++; overwrite previously defined php.ini values, but will append the new value
++; instead.
++
++; Note: path INI options can be relative and will be expanded with the prefix
++; (pool, global or /usr)
++
++; Default Value: nothing is defined by default except the values in php.ini and
++; specified at startup with the -d argument
++;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
++;php_flag[display_errors] = off
++;php_admin_value[error_log] = /var/log/fpm-php.www.log
++;php_admin_flag[log_errors] = on
++;php_admin_value[memory_limit] = 32M
+diff --git a/feeds/packages/lang/php5/files/php5-fpm.conf b/feeds/packages/lang/php5/files/php5-fpm.conf
+new file mode 100644
+index 0000000..00c8e4f
+--- /dev/null
++++ b/feeds/packages/lang/php5/files/php5-fpm.conf
+@@ -0,0 +1,121 @@
++;;;;;;;;;;;;;;;;;;;;;
++; FPM Configuration ;
++;;;;;;;;;;;;;;;;;;;;;
++
++; All relative paths in this configuration file are relative to PHP's install
++; prefix (/usr). This prefix can be dynamically changed by using the
++; '-p' argument from the command line.
++
++; Include one or more files. If glob(3) exists, it is used to include a bunch of
++; files from a glob(3) pattern. This directive can be used everywhere in the
++; file.
++; Relative path can also be used. They will be prefixed by:
++; - the global prefix if it's been set (-p argument)
++; - /usr otherwise
++;include=/etc/php5/fpm/*.conf
++
++;;;;;;;;;;;;;;;;;;
++; Global Options ;
++;;;;;;;;;;;;;;;;;;
++
++[global]
++; Pid file
++; Note: the default prefix is /var
++; Default Value: none
++pid = /var/run/php5-fpm.pid
++
++; Error log file
++; If it's set to "syslog", log is sent to syslogd instead of being written
++; in a local file.
++; Note: the default prefix is /var
++; Default Value: log/php-fpm.log
++error_log = /var/log/php5-fpm.log
++
++; syslog_facility is used to specify what type of program is logging the
++; message. This lets syslogd specify that messages from different facilities
++; will be handled differently.
++; See syslog(3) for possible values (ex daemon equiv LOG_DAEMON)
++; Default Value: daemon
++;syslog.facility = daemon
++
++; syslog_ident is prepended to every message. If you have multiple FPM
++; instances running on the same server, you can change the default value
++; which must suit common needs.
++; Default Value: php-fpm
++;syslog.ident = php-fpm
++
++; Log level
++; Possible Values: alert, error, warning, notice, debug
++; Default Value: notice
++;log_level = notice
++
++; If this number of child processes exit with SIGSEGV or SIGBUS within the time
++; interval set by emergency_restart_interval then FPM will restart. A value
++; of '0' means 'Off'.
++; Default Value: 0
++;emergency_restart_threshold = 0
++
++; Interval of time used by emergency_restart_interval to determine when
++; a graceful restart will be initiated. This can be useful to work around
++; accidental corruptions in an accelerator's shared memory.
++; Available Units: s(econds), m(inutes), h(ours), or d(ays)
++; Default Unit: seconds
++; Default Value: 0
++;emergency_restart_interval = 0
++
++; Time limit for child processes to wait for a reaction on signals from master.
++; Available units: s(econds), m(inutes), h(ours), or d(ays)
++; Default Unit: seconds
++; Default Value: 0
++;process_control_timeout = 0
++
++; The maximum number of processes FPM will fork. This has been design to control
++; the global number of processes when using dynamic PM within a lot of pools.
++; Use it with caution.
++; Note: A value of 0 indicates no limit
++; Default Value: 0
++; process.max = 128
++
++; Specify the nice(2) priority to apply to the master process (only if set)
++; The value can vary from -19 (highest priority) to 20 (lower priority)
++; Note: - It will only work if the FPM master process is launched as root
++; - The pool process will inherit the master process priority
++; unless it specified otherwise
++; Default Value: no set
++; process.priority = -19
++
++; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
++; Default Value: yes
++;daemonize = yes
++
++; Set open file descriptor rlimit for the master process.
++; Default Value: system defined value
++;rlimit_files = 1024
++
++; Set max core size rlimit for the master process.
++; Possible Values: 'unlimited' or an integer greater or equal to 0
++; Default Value: system defined value
++;rlimit_core = 0
++
++; Specify the event mechanism FPM will use. The following is available:
++; - select (any POSIX os)
++; - poll (any POSIX os)
++; - epoll (linux >= 2.5.44)
++; - kqueue (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
++; - /dev/poll (Solaris >= 7)
++; - port (Solaris >= 10)
++; Default Value: not set (auto detection)
++; events.mechanism = epoll
++
++;;;;;;;;;;;;;;;;;;;;
++; Pool Definitions ;
++;;;;;;;;;;;;;;;;;;;;
++
++; Multiple pools of child processes may be started with different listening
++; ports and different management options. The name of the pool will be
++; used in logs and stats. There is no limitation on the number of pools which
++; FPM can handle. Your system will tell you anyway :)
++
++; To configure the pools it is recommended to have one .conf file per
++; pool in the following directory:
++include=/etc/php5-fpm.d/*.conf
+diff --git a/feeds/packages/lang/php5/files/php5-fpm.config b/feeds/packages/lang/php5/files/php5-fpm.config
+new file mode 100644
+index 0000000..4f40c92
+--- /dev/null
++++ b/feeds/packages/lang/php5/files/php5-fpm.config
+@@ -0,0 +1,2 @@
++config php5-fpm
++ option enabled 1
+diff --git a/feeds/packages/lang/php5/files/php5-fpm.init b/feeds/packages/lang/php5/files/php5-fpm.init
+new file mode 100644
+index 0000000..aa5397a
+--- /dev/null
++++ b/feeds/packages/lang/php5/files/php5-fpm.init
+@@ -0,0 +1,29 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=50
++
++PROG=/usr/bin/php-fpm
++CONFIG=/etc/php5-fpm.conf
++
++SERVICE_PID_FILE=/var/run/php5-fpm.pid
++
++start_instance() {
++ local section="$1"
++ local enabled
++
++ config_get_bool enabled "$section" 'enabled' 0
++
++ [ $enabled -gt 0 ] || return 1
++
++ service_start $PROG -y $CONFIG -g $SERVICE_PID_FILE
++}
++
++start() {
++ config_load 'php5-fpm'
++ config_foreach start_instance 'php5-fpm'
++}
++
++stop() {
++ service_stop $PROG
++}
+diff --git a/feeds/packages/lang/php5/patches/101-fix_membar_producer_link_error_gcc3x.patch b/feeds/packages/lang/php5/patches/101-fix_membar_producer_link_error_gcc3x.patch
+new file mode 100644
+index 0000000..3e81dd6
+--- /dev/null
++++ b/feeds/packages/lang/php5/patches/101-fix_membar_producer_link_error_gcc3x.patch
+@@ -0,0 +1,11 @@
++--- a/ext/standard/php_crypt_r.c
+++++ b/ext/standard/php_crypt_r.c
++@@ -96,6 +96,8 @@ void _crypt_extended_init_r(void)
++ InterlockedIncrement(&initialized);
++ #elif defined(HAVE_SYNC_FETCH_AND_ADD)
++ __sync_fetch_and_add(&initialized, 1);
+++#elif (defined(__GNUC__) && (__GNUC__ == 3))
+++ initialized = 1;
++ #elif defined(HAVE_ATOMIC_H) /* Solaris 10 defines atomic API within */
++ membar_producer();
++ atomic_add_int(&initialized, 1);
+diff --git a/feeds/packages/lang/php5/patches/102-debian_patches_use_embedded_timezonedb.patch b/feeds/packages/lang/php5/patches/102-debian_patches_use_embedded_timezonedb.patch
+new file mode 100644
+index 0000000..bfbed43
+--- /dev/null
++++ b/feeds/packages/lang/php5/patches/102-debian_patches_use_embedded_timezonedb.patch
+@@ -0,0 +1,640 @@
++Add support for use of the system timezone database, rather
++than embedding a copy. Discussed upstream but was not desired.
++
++History:
++r11: adopted to php 5.6.9
++r10: make timezone case insensitive
++r9: fix another compile error without --with-system-tzdata configured (Michael Heimpold)
++r8: fix compile error without --with-system-tzdata configured
++r7: improve check for valid timezone id to exclude directories
++r6: fix fd leak in r5, fix country code/BC flag use in.
++ timezone_identifiers_list() using system db,
++ fix use of PECL timezonedb to override system db,
++r5: reverts addition of "System/Localtime" fake tzname.
++ updated for 5.3.0, parses zone.tab to pick up mapping between
++ timezone name, country code and long/lat coords
++r4: added "System/Localtime" tzname which uses /etc/localtime
++r3: fix a crash if /usr/share/zoneinfo doesn't exist (Raphael Geissert)
++r2: add filesystem trawl to set up name alias index
++r1: initial revision
++
++--- a/ext/date/lib/parse_tz.c
+++++ b/ext/date/lib/parse_tz.c
++@@ -18,8 +18,22 @@
++
++ /* $Id$ */
++
+++#ifndef PATH_MAX
+++#define PATH_MAX 4096
+++#endif
+++
++ #include "timelib.h"
++
+++#ifdef HAVE_SYSTEM_TZDATA
+++#include <sys/mman.h>
+++#include <sys/stat.h>
+++#include <limits.h>
+++#include <fcntl.h>
+++#include <unistd.h>
+++
+++#include "php_scandir.h"
+++#endif
+++
++ #include <stdio.h>
++
++ #ifdef HAVE_LOCALE_H
++@@ -32,8 +46,12 @@
++ #include <strings.h>
++ #endif
++
+++#ifndef HAVE_SYSTEM_TZDATA
++ #define TIMELIB_SUPPORTS_V2DATA
++ #include "timezonedb.h"
+++#endif
+++
+++#include <ctype.h>
++
++ #if (defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__BIG_ENDIAN__) || defined(__LITTLE_ENDIAN__))
++ # if defined(__LITTLE_ENDIAN__)
++@@ -55,6 +73,11 @@ static int read_preamble(const unsigned
++ {
++ uint32_t version;
++
+++ if (memcmp(tzf, "TZif", 4) == 0) {
+++ *tzf += 20;
+++ return -1;
+++ }
+++
++ /* read ID */
++ version = (*tzf)[3] - '0';
++ *tzf += 4;
++@@ -298,7 +321,406 @@ void timelib_dump_tzinfo(timelib_tzinfo
++ }
++ }
++
++-static int seek_to_tz_position(const unsigned char **tzf, char *timezone, const timelib_tzdb *tzdb)
+++#ifdef HAVE_SYSTEM_TZDATA
+++
+++#ifdef HAVE_SYSTEM_TZDATA_PREFIX
+++#define ZONEINFO_PREFIX HAVE_SYSTEM_TZDATA_PREFIX
+++#else
+++#define ZONEINFO_PREFIX "/usr/share/zoneinfo"
+++#endif
+++
+++/* System timezone database pointer. */
+++static const timelib_tzdb *timezonedb_system;
+++
+++/* Hash table entry for the cache of the zone.tab mapping table. */
+++struct location_info {
+++ char code[2];
+++ double latitude, longitude;
+++ char name[64];
+++ char *comment;
+++ struct location_info *next;
+++};
+++
+++/* Cache of zone.tab. */
+++static struct location_info **system_location_table;
+++
+++/* Size of the zone.tab hash table; a random-ish prime big enough to
+++ * prevent too many collisions. */
+++#define LOCINFO_HASH_SIZE (1021)
+++
+++/* Compute a case insensitive hash of str */
+++static uint32_t tz_hash(const char *str)
+++{
+++ const unsigned char *p = (const unsigned char *)str;
+++ uint32_t hash = 5381;
+++ int c;
+++
+++ while ((c = tolower(*p++)) != '\0') {
+++ hash = (hash << 5) ^ hash ^ c;
+++ }
+++
+++ return hash % LOCINFO_HASH_SIZE;
+++}
+++
+++/* Parse an ISO-6709 date as used in zone.tab. Returns end of the
+++ * parsed string on success, or NULL on parse error. On success,
+++ * writes the parsed number to *result. */
+++static char *parse_iso6709(char *p, double *result)
+++{
+++ double v, sign;
+++ char *pend;
+++ size_t len;
+++
+++ if (*p == '+')
+++ sign = 1.0;
+++ else if (*p == '-')
+++ sign = -1.0;
+++ else
+++ return NULL;
+++
+++ p++;
+++ for (pend = p; *pend >= '0' && *pend <= '9'; pend++)
+++ ;;
+++
+++ /* Annoying encoding used by zone.tab has no decimal point, so use
+++ * the length to determine the format:
+++ *
+++ * 4 = DDMM
+++ * 5 = DDDMM
+++ * 6 = DDMMSS
+++ * 7 = DDDMMSS
+++ */
+++ len = pend - p;
+++ if (len < 4 || len > 7) {
+++ return NULL;
+++ }
+++
+++ /* p => [D]DD */
+++ v = (p[0] - '0') * 10.0 + (p[1] - '0');
+++ p += 2;
+++ if (len == 5 || len == 7)
+++ v = v * 10.0 + (*p++ - '0');
+++ /* p => MM[SS] */
+++ v += (10.0 * (p[0] - '0')
+++ + p[1] - '0') / 60.0;
+++ p += 2;
+++ /* p => [SS] */
+++ if (len > 5) {
+++ v += (10.0 * (p[0] - '0')
+++ + p[1] - '0') / 3600.0;
+++ p += 2;
+++ }
+++
+++ /* Round to five decimal place, not because it's a good idea,
+++ * but, because the builtin data uses rounded data, so, match
+++ * that. */
+++ *result = round(v * sign * 100000.0) / 100000.0;
+++
+++ return p;
+++}
+++
+++/* This function parses the zone.tab file to build up the mapping of
+++ * timezone to country code and geographic location, and returns a
+++ * hash table. The hash table is indexed by the function:
+++ *
+++ * tz_hash(timezone-name)
+++ */
+++static struct location_info **create_location_table(void)
+++{
+++ struct location_info **li, *i;
+++ char zone_tab[PATH_MAX];
+++ char line[512];
+++ FILE *fp;
+++
+++ strncpy(zone_tab, ZONEINFO_PREFIX "/zone.tab", sizeof zone_tab);
+++
+++ fp = fopen(zone_tab, "r");
+++ if (!fp) {
+++ return NULL;
+++ }
+++
+++ li = calloc(LOCINFO_HASH_SIZE, sizeof *li);
+++
+++ while (fgets(line, sizeof line, fp)) {
+++ char *p = line, *code, *name, *comment;
+++ uint32_t hash;
+++ double latitude, longitude;
+++
+++ while (isspace(*p))
+++ p++;
+++
+++ if (*p == '#' || *p == '\0' || *p == '\n')
+++ continue;
+++
+++ if (!isalpha(p[0]) || !isalpha(p[1]) || p[2] != '\t')
+++ continue;
+++
+++ /* code => AA */
+++ code = p;
+++ p[2] = 0;
+++ p += 3;
+++
+++ /* coords => [+-][D]DDMM[SS][+-][D]DDMM[SS] */
+++ p = parse_iso6709(p, &latitude);
+++ if (!p) {
+++ continue;
+++ }
+++ p = parse_iso6709(p, &longitude);
+++ if (!p) {
+++ continue;
+++ }
+++
+++ if (!p || *p != '\t') {
+++ continue;
+++ }
+++
+++ /* name = string */
+++ name = ++p;
+++ while (*p != '\t' && *p && *p != '\n')
+++ p++;
+++
+++ *p++ = '\0';
+++
+++ /* comment = string */
+++ comment = p;
+++ while (*p != '\t' && *p && *p != '\n')
+++ p++;
+++
+++ if (*p == '\n' || *p == '\t')
+++ *p = '\0';
+++
+++ hash = tz_hash(name);
+++ i = malloc(sizeof *i);
+++ memcpy(i->code, code, 2);
+++ strncpy(i->name, name, sizeof i->name);
+++ i->comment = strdup(comment);
+++ i->longitude = longitude;
+++ i->latitude = latitude;
+++ i->next = li[hash];
+++ li[hash] = i;
+++ /* printf("%s [%u, %f, %f]\n", name, hash, latitude, longitude); */
+++ }
+++
+++ fclose(fp);
+++
+++ return li;
+++}
+++
+++/* Return location info from hash table, using given timezone name.
+++ * Returns NULL if the name could not be found. */
+++const struct location_info *find_zone_info(struct location_info **li,
+++ const char *name)
+++{
+++ uint32_t hash = tz_hash(name);
+++ const struct location_info *l;
+++
+++ if (!li) {
+++ return NULL;
+++ }
+++
+++ for (l = li[hash]; l; l = l->next) {
+++ if (strcasecmp(l->name, name) == 0)
+++ return l;
+++ }
+++
+++ return NULL;
+++}
+++
+++/* Filter out some non-tzdata files and the posix/right databases, if
+++ * present. */
+++static int index_filter(const struct dirent *ent)
+++{
+++ return strcmp(ent->d_name, ".") != 0
+++ && strcmp(ent->d_name, "..") != 0
+++ && strcmp(ent->d_name, "posix") != 0
+++ && strcmp(ent->d_name, "posixrules") != 0
+++ && strcmp(ent->d_name, "right") != 0
+++ && strstr(ent->d_name, ".tab") == NULL;
+++}
+++
+++static int sysdbcmp(const void *first, const void *second)
+++{
+++ const timelib_tzdb_index_entry *alpha = first, *beta = second;
+++
+++ return strcmp(alpha->id, beta->id);
+++}
+++
+++
+++/* Create the zone identifier index by trawling the filesystem. */
+++static void create_zone_index(timelib_tzdb *db)
+++{
+++ size_t dirstack_size, dirstack_top;
+++ size_t index_size, index_next;
+++ timelib_tzdb_index_entry *db_index;
+++ char **dirstack;
+++
+++ /* LIFO stack to hold directory entries to scan; each slot is a
+++ * directory name relative to the zoneinfo prefix. */
+++ dirstack_size = 32;
+++ dirstack = malloc(dirstack_size * sizeof *dirstack);
+++ dirstack_top = 1;
+++ dirstack[0] = strdup("");
+++
+++ /* Index array. */
+++ index_size = 64;
+++ db_index = malloc(index_size * sizeof *db_index);
+++ index_next = 0;
+++
+++ do {
+++ struct dirent **ents;
+++ char name[PATH_MAX], *top;
+++ int count;
+++
+++ /* Pop the top stack entry, and iterate through its contents. */
+++ top = dirstack[--dirstack_top];
+++ snprintf(name, sizeof name, ZONEINFO_PREFIX "/%s", top);
+++
+++ count = php_scandir(name, &ents, index_filter, php_alphasort);
+++
+++ while (count > 0) {
+++ struct stat st;
+++ const char *leaf = ents[count - 1]->d_name;
+++
+++ snprintf(name, sizeof name, ZONEINFO_PREFIX "/%s/%s",
+++ top, leaf);
+++
+++ if (strlen(name) && stat(name, &st) == 0) {
+++ /* Name, relative to the zoneinfo prefix. */
+++ const char *root = top;
+++
+++ if (root[0] == '/') root++;
+++
+++ snprintf(name, sizeof name, "%s%s%s", root,
+++ *root ? "/": "", leaf);
+++
+++ if (S_ISDIR(st.st_mode)) {
+++ if (dirstack_top == dirstack_size) {
+++ dirstack_size *= 2;
+++ dirstack = realloc(dirstack,
+++ dirstack_size * sizeof *dirstack);
+++ }
+++ dirstack[dirstack_top++] = strdup(name);
+++ }
+++ else {
+++ if (index_next == index_size) {
+++ index_size *= 2;
+++ db_index = realloc(db_index,
+++ index_size * sizeof *db_index);
+++ }
+++
+++ db_index[index_next++].id = strdup(name);
+++ }
+++ }
+++
+++ free(ents[--count]);
+++ }
+++
+++ if (count != -1) free(ents);
+++ free(top);
+++ } while (dirstack_top);
+++
+++ qsort(db_index, index_next, sizeof *db_index, sysdbcmp);
+++
+++ db->index = db_index;
+++ db->index_size = index_next;
+++
+++ free(dirstack);
+++}
+++
+++#define FAKE_HEADER "1234\0??\1??"
+++#define FAKE_UTC_POS (7 - 4)
+++
+++/* Create a fake data segment for database 'sysdb'. */
+++static void fake_data_segment(timelib_tzdb *sysdb,
+++ struct location_info **info)
+++{
+++ size_t n;
+++ char *data, *p;
+++
+++ data = malloc(3 * sysdb->index_size + 7);
+++
+++ p = mempcpy(data, FAKE_HEADER, sizeof(FAKE_HEADER) - 1);
+++
+++ for (n = 0; n < sysdb->index_size; n++) {
+++ const struct location_info *li;
+++ timelib_tzdb_index_entry *ent;
+++
+++ ent = (timelib_tzdb_index_entry *)&sysdb->index[n];
+++
+++ /* Lookup the timezone name in the hash table. */
+++ if (strcmp(ent->id, "UTC") == 0) {
+++ ent->pos = FAKE_UTC_POS;
+++ continue;
+++ }
+++
+++ li = find_zone_info(info, ent->id);
+++ if (li) {
+++ /* If found, append the BC byte and the
+++ * country code; set the position for this
+++ * section of timezone data. */
+++ ent->pos = (p - data) - 4;
+++ *p++ = '\1';
+++ *p++ = li->code[0];
+++ *p++ = li->code[1];
+++ }
+++ else {
+++ /* If not found, the timezone data can
+++ * point at the header. */
+++ ent->pos = 0;
+++ }
+++ }
+++
+++ sysdb->data = (unsigned char *)data;
+++}
+++
+++/* Returns true if the passed-in stat structure describes a
+++ * probably-valid timezone file. */
+++static int is_valid_tzfile(const struct stat *st)
+++{
+++ return S_ISREG(st->st_mode) && st->st_size > 20;
+++}
+++
+++/* Return the mmap()ed tzfile if found, else NULL. On success, the
+++ * length of the mapped data is placed in *length. */
+++static char *map_tzfile(const char *timezone, size_t *length)
+++{
+++ char fname[PATH_MAX];
+++ struct stat st;
+++ char *p;
+++ int fd;
+++
+++ if (timezone[0] == '\0' || strstr(timezone, "..") != NULL) {
+++ return NULL;
+++ }
+++
+++ if (system_location_table) {
+++ const struct location_info *li;
+++ if ((li = find_zone_info(system_location_table, timezone)) != NULL) {
+++ /* Use the stored name to avoid case issue */
+++ timezone = li->name;
+++ }
+++ }
+++
+++ snprintf(fname, sizeof fname, ZONEINFO_PREFIX "/%s", timezone);
+++
+++ fd = open(fname, O_RDONLY);
+++ if (fd == -1) {
+++ return NULL;
+++ } else if (fstat(fd, &st) != 0 || !is_valid_tzfile(&st)) {
+++ close(fd);
+++ return NULL;
+++ }
+++
+++ *length = st.st_size;
+++ p = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
+++ close(fd);
+++
+++ return p != MAP_FAILED ? p : NULL;
+++}
+++
+++#endif
+++
+++static int inmem_seek_to_tz_position(const unsigned char **tzf, char *timezone, const timelib_tzdb *tzdb)
++ {
++ int left = 0, right = tzdb->index_size - 1;
++ #ifdef HAVE_SETLOCALE
++@@ -337,21 +759,90 @@ static int seek_to_tz_position(const uns
++ return 0;
++ }
++
+++static int seek_to_tz_position(const unsigned char **tzf, char *timezone,
+++ char **map, size_t *maplen,
+++ const timelib_tzdb *tzdb)
+++{
+++#ifdef HAVE_SYSTEM_TZDATA
+++ if (tzdb == timezonedb_system) {
+++ char *orig;
+++
+++ orig = map_tzfile(timezone, maplen);
+++ if (orig == NULL) {
+++ return 0;
+++ }
+++
+++ (*tzf) = (unsigned char *)orig;
+++ *map = orig;
+++
+++ return 1;
+++ }
+++ else
+++#endif
+++ {
+++ return inmem_seek_to_tz_position(tzf, timezone, tzdb);
+++ }
+++}
+++
++ const timelib_tzdb *timelib_builtin_db(void)
++ {
+++#ifdef HAVE_SYSTEM_TZDATA
+++ if (timezonedb_system == NULL) {
+++ timelib_tzdb *tmp = malloc(sizeof *tmp);
+++
+++ tmp->version = "0.system";
+++ tmp->data = NULL;
+++ create_zone_index(tmp);
+++ system_location_table = create_location_table();
+++ fake_data_segment(tmp, system_location_table);
+++ timezonedb_system = tmp;
+++ }
+++
+++
+++ return timezonedb_system;
+++#else
++ return &timezonedb_builtin;
+++#endif
++ }
++
++ const timelib_tzdb_index_entry *timelib_timezone_builtin_identifiers_list(int *count)
++ {
+++#ifdef HAVE_SYSTEM_TZDATA
+++ *count = timezonedb_system->index_size;
+++ return timezonedb_system->index;
+++#else
++ *count = sizeof(timezonedb_idx_builtin) / sizeof(*timezonedb_idx_builtin);
++ return timezonedb_idx_builtin;
+++#endif
++ }
++
++ int timelib_timezone_id_is_valid(char *timezone, const timelib_tzdb *tzdb)
++ {
++ const unsigned char *tzf;
++- return (seek_to_tz_position(&tzf, timezone, tzdb));
+++
+++#ifdef HAVE_SYSTEM_TZDATA
+++ if (tzdb == timezonedb_system) {
+++ char fname[PATH_MAX];
+++ struct stat st;
+++
+++ if (timezone[0] == '\0' || strstr(timezone, "..") != NULL) {
+++ return 0;
+++ }
+++
+++ if (system_location_table) {
+++ if (find_zone_info(system_location_table, timezone) != NULL) {
+++ /* found in cache */
+++ return 1;
+++ }
+++ }
+++
+++ snprintf(fname, sizeof fname, ZONEINFO_PREFIX "/%s", timezone);
+++
+++ return stat(fname, &st) == 0 && is_valid_tzfile(&st);
+++ }
+++#endif
+++
+++ return (inmem_seek_to_tz_position(&tzf, timezone, tzdb));
++ }
++
++ static void skip_64bit_preamble(const unsigned char **tzf, timelib_tzinfo *tz)
++@@ -376,10 +867,12 @@ static void read_64bit_header(const unsi
++ timelib_tzinfo *timelib_parse_tzfile(char *timezone, const timelib_tzdb *tzdb)
++ {
++ const unsigned char *tzf;
+++ char *memmap = NULL;
+++ size_t maplen;
++ timelib_tzinfo *tmp;
++ int version;
++
++- if (seek_to_tz_position(&tzf, timezone, tzdb)) {
+++ if (seek_to_tz_position(&tzf, timezone, &memmap, &maplen, tzdb)) {
++ tmp = timelib_tzinfo_ctor(timezone);
++
++ version = read_preamble(&tzf, tmp);
++@@ -393,7 +886,34 @@ timelib_tzinfo *timelib_parse_tzfile(cha
++ skip_64bit_types(&tzf, tmp);
++ skip_posix_string(&tzf, tmp);
++ }
++- read_location(&tzf, tmp);
+++
+++#ifdef HAVE_SYSTEM_TZDATA
+++ if (memmap) {
+++ const struct location_info *li;
+++
+++ /* TZif-style - grok the location info from the system database,
+++ * if possible. */
+++
+++ if ((li = find_zone_info(system_location_table, timezone)) != NULL) {
+++ tmp->location.comments = strdup(li->comment);
+++ strncpy(tmp->location.country_code, li->code, 2);
+++ tmp->location.longitude = li->longitude;
+++ tmp->location.latitude = li->latitude;
+++ tmp->bc = 1;
+++ } else {
+++ strcpy(tmp->location.country_code, "??");
+++ tmp->bc = 0;
+++ tmp->location.comments = strdup("");
+++ }
+++
+++ /* Now done with the mmap segment - discard it. */
+++ munmap(memmap, maplen);
+++ } else
+++#endif
+++ {
+++ /* PHP-style - use the embedded info. */
+++ read_location(&tzf, tmp);
+++ }
++ } else {
++ tmp = NULL;
++ }
++--- a/ext/date/lib/timelib.m4
+++++ b/ext/date/lib/timelib.m4
++@@ -78,3 +78,17 @@ stdlib.h
++
++ dnl Check for strtoll, atoll
++ AC_CHECK_FUNCS(strtoll atoll strftime)
+++
+++PHP_ARG_WITH(system-tzdata, for use of system timezone data,
+++[ --with-system-tzdata[=DIR] to specify use of system timezone data],
+++no, no)
+++
+++if test "$PHP_SYSTEM_TZDATA" != "no"; then
+++ AC_DEFINE(HAVE_SYSTEM_TZDATA, 1, [Define if system timezone data is used])
+++
+++ if test "$PHP_SYSTEM_TZDATA" != "yes"; then
+++ AC_DEFINE_UNQUOTED(HAVE_SYSTEM_TZDATA_PREFIX, "$PHP_SYSTEM_TZDATA",
+++ [Define for location of system timezone data])
+++ fi
+++fi
+++
+diff --git a/feeds/packages/lang/php5/patches/103-debian_patches_use_embedded_timezonedb.patch b/feeds/packages/lang/php5/patches/103-debian_patches_use_embedded_timezonedb.patch
+new file mode 100644
+index 0000000..ae8d182
+--- /dev/null
++++ b/feeds/packages/lang/php5/patches/103-debian_patches_use_embedded_timezonedb.patch
+@@ -0,0 +1,19 @@
++Author: Sean Finney <seanius@debian.org>
++Forwarded: no (upstream doesn't want it)
++Description: Silence warnings about using the default system timezone info
++ In vanilla upstream php, this is considered an error (i.e. the user must
++ set the timezone explicitly), though with our use of the system timezonedb
++ patch, we actually feel quite comfortable using the default timezone info.
++Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=571762
++--- a/ext/date/tests/date_default_timezone_set-1.phpt
+++++ b/ext/date/tests/date_default_timezone_set-1.phpt
++@@ -22,9 +22,6 @@ date.timezone=
++ echo date(DATE_ISO8601, $date4), "\n";
++ ?>
++ --EXPECTF--
++-Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in %sdate_default_timezone_set-1.php on line 3
++-
++-Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in %sdate_default_timezone_set-1.php on line 4
++ America/Indiana/Knox
++ 2005-01-12T03:00:00-0500
++ 2005-07-12T03:00:00-0500
+diff --git a/feeds/packages/lang/php5/patches/200-ext-opcache-fix-detection-of-shm-mmap.patch b/feeds/packages/lang/php5/patches/200-ext-opcache-fix-detection-of-shm-mmap.patch
+new file mode 100644
+index 0000000..d2a1e91
+--- /dev/null
++++ b/feeds/packages/lang/php5/patches/200-ext-opcache-fix-detection-of-shm-mmap.patch
+@@ -0,0 +1,159 @@
++From dc8bb6a53bfdfe42d9ae81d4e78c6155ad4bfd6e Mon Sep 17 00:00:00 2001
++From: Michael Heimpold <mhei@heimpold.de>
++Date: Sun, 17 May 2015 16:50:50 +0200
++Subject: [PATCH] ext/opcache: fix detection of shm/mmap
++
++The detection of sysvipc and mmap doesn't work well when cross-compiling,
++so I decided to only check for the availability of the functions involved.
++This is not a clean solution, but works for now(tm) :-)
++
++It should be discussed with upstream to find a better solution.
++
++This solves the issue reported at
++https://github.com/openwrt/packages/issues/1010
++and makes opcache usable on OpenWrt.
++
++Signed-off-by: Michael Heimpold <mhei@heimpold.de>
++---
++ ext/opcache/config.m4 | 122 ++-----------------------------------------------
++ 1 file changed, 4 insertions(+), 118 deletions(-)
++
++diff --git a/ext/opcache/config.m4 b/ext/opcache/config.m4
++index b7e4835..7b6c0aa 100644
++--- a/ext/opcache/config.m4
+++++ b/ext/opcache/config.m4
++@@ -11,127 +11,13 @@ if test "$PHP_OPCACHE" != "no"; then
++ AC_DEFINE(HAVE_MPROTECT, 1, [Define if you have mprotect() function])
++ ])
++
++- AC_MSG_CHECKING(for sysvipc shared memory support)
++- AC_TRY_RUN([
++-#include <sys/types.h>
++-#include <sys/wait.h>
++-#include <sys/ipc.h>
++-#include <sys/shm.h>
++-#include <unistd.h>
++-#include <string.h>
++-
++-int main() {
++- pid_t pid;
++- int status;
++- int ipc_id;
++- char *shm;
++- struct shmid_ds shmbuf;
++-
++- ipc_id = shmget(IPC_PRIVATE, 4096, (IPC_CREAT | SHM_R | SHM_W));
++- if (ipc_id == -1) {
++- return 1;
++- }
++-
++- shm = shmat(ipc_id, NULL, 0);
++- if (shm == (void *)-1) {
++- shmctl(ipc_id, IPC_RMID, NULL);
++- return 2;
++- }
++-
++- if (shmctl(ipc_id, IPC_STAT, &shmbuf) != 0) {
++- shmdt(shm);
++- shmctl(ipc_id, IPC_RMID, NULL);
++- return 3;
++- }
++-
++- shmbuf.shm_perm.uid = getuid();
++- shmbuf.shm_perm.gid = getgid();
++- shmbuf.shm_perm.mode = 0600;
++-
++- if (shmctl(ipc_id, IPC_SET, &shmbuf) != 0) {
++- shmdt(shm);
++- shmctl(ipc_id, IPC_RMID, NULL);
++- return 4;
++- }
++-
++- shmctl(ipc_id, IPC_RMID, NULL);
++-
++- strcpy(shm, "hello");
++-
++- pid = fork();
++- if (pid < 0) {
++- return 5;
++- } else if (pid == 0) {
++- strcpy(shm, "bye");
++- return 6;
++- }
++- if (wait(&status) != pid) {
++- return 7;
++- }
++- if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) {
++- return 8;
++- }
++- if (strcmp(shm, "bye") != 0) {
++- return 9;
++- }
++- return 0;
++-}
++-],dnl
+++ AC_CHECK_FUNC(shmget,[
++ AC_DEFINE(HAVE_SHM_IPC, 1, [Define if you have SysV IPC SHM support])
++- msg=yes,msg=no,msg=no)
++- AC_MSG_RESULT([$msg])
++-
++- AC_MSG_CHECKING(for mmap() using MAP_ANON shared memory support)
++- AC_TRY_RUN([
++-#include <sys/types.h>
++-#include <sys/wait.h>
++-#include <sys/mman.h>
++-#include <unistd.h>
++-#include <string.h>
++-
++-#ifndef MAP_ANON
++-# ifdef MAP_ANONYMOUS
++-# define MAP_ANON MAP_ANONYMOUS
++-# endif
++-#endif
++-#ifndef MAP_FAILED
++-# define MAP_FAILED ((void*)-1)
++-#endif
++-
++-int main() {
++- pid_t pid;
++- int status;
++- char *shm;
++-
++- shm = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
++- if (shm == MAP_FAILED) {
++- return 1;
++- }
++-
++- strcpy(shm, "hello");
+++ ])
++
++- pid = fork();
++- if (pid < 0) {
++- return 5;
++- } else if (pid == 0) {
++- strcpy(shm, "bye");
++- return 6;
++- }
++- if (wait(&status) != pid) {
++- return 7;
++- }
++- if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) {
++- return 8;
++- }
++- if (strcmp(shm, "bye") != 0) {
++- return 9;
++- }
++- return 0;
++-}
++-],dnl
+++ AC_CHECK_FUNC(mmap,[
++ AC_DEFINE(HAVE_SHM_MMAP_ANON, 1, [Define if you have mmap(MAP_ANON) SHM support])
++- msg=yes,msg=no,msg=no)
++- AC_MSG_RESULT([$msg])
+++ ])
++
++ AC_MSG_CHECKING(for mmap() using /dev/zero shared memory support)
++ AC_TRY_RUN([
++--
++1.7.10.4
++
+diff --git a/feeds/packages/lang/php5/patches/800-gd-iconv.patch b/feeds/packages/lang/php5/patches/800-gd-iconv.patch
+new file mode 100644
+index 0000000..1418c27
+--- /dev/null
++++ b/feeds/packages/lang/php5/patches/800-gd-iconv.patch
+@@ -0,0 +1,14 @@
++--- a/ext/gd/libgd/gdkanji.c
+++++ b/ext/gd/libgd/gdkanji.c
++@@ -9,6 +9,11 @@
++ #include "gdhelpers.h"
++
++ #include <stdarg.h>
+++
+++/* force usage of internal conversation routine */
+++#undef HAVE_ICONV_H
+++#undef HAVE_ICONV
+++
++ #if defined(HAVE_ICONV_H) || defined(HAVE_ICONV)
++ #include <iconv.h>
++ #ifdef HAVE_ERRNO_H
+diff --git a/feeds/packages/lang/php5/patches/950-Fix-dl-cross-compiling-issue.patch b/feeds/packages/lang/php5/patches/950-Fix-dl-cross-compiling-issue.patch
+new file mode 100644
+index 0000000..22122ec
+--- /dev/null
++++ b/feeds/packages/lang/php5/patches/950-Fix-dl-cross-compiling-issue.patch
+@@ -0,0 +1,59 @@
++--- a/configure.in
+++++ b/configure.in
++@@ -453,7 +453,10 @@ PHP_CHECK_FUNC(gethostname, nsl)
++ PHP_CHECK_FUNC(gethostbyaddr, nsl)
++ PHP_CHECK_FUNC(yp_get_default_domain, nsl)
++
++-PHP_CHECK_FUNC(dlopen, dl)
+++PHP_ADD_LIBRARY(dl)
+++PHP_DEF_HAVE(dlopen)
+++PHP_DEF_HAVE(libdl)
+++ac_cv_func_dlopen=yes
++ if test "$ac_cv_func_dlopen" = "yes"; then
++ AC_DEFINE(HAVE_LIBDL, 1, [ ])
++ fi
++--- a/ext/fileinfo/config.m4
+++++ b/ext/fileinfo/config.m4
++@@ -46,6 +46,10 @@ int main(void)
++ AC_MSG_RESULT(no)
++ AC_MSG_NOTICE(using libmagic strcasestr implementation)
++ libmagic_sources="$libmagic_sources libmagic/strcasestr.c"
+++ ],[
+++ dnl cross-compiling; assume not present
+++ AC_MSG_NOTICE(using libmagic strcasestr implementation)
+++ libmagic_sources="$libmagic_sources libmagic/strcasestr.c"
++ ])
++
++ PHP_NEW_EXTENSION(fileinfo, fileinfo.c $libmagic_sources, $ext_shared,,-I@ext_srcdir@/libmagic)
++--- a/ext/opcache/config.m4
+++++ b/ext/opcache/config.m4
++@@ -227,7 +227,14 @@ AC_TRY_RUN([
++ flock_type=linux
++ AC_DEFINE([HAVE_FLOCK_LINUX], [], [Struct flock is Linux-type])
++ AC_MSG_RESULT("yes")
++-], AC_MSG_RESULT("no") )
+++], [
+++ AC_MSG_RESULT("no")
+++], [
+++ dnl cross-compiling; assume Linux
+++ flock_type=linux
+++ AC_DEFINE([HAVE_FLOCK_LINUX], [], [Struct flock is Linux-type])
+++ AC_MSG_RESULT("yes")
+++])
++
++ AC_MSG_CHECKING("whether flock struct is BSD ordered")
++ AC_TRY_RUN([
++@@ -243,7 +250,12 @@ AC_TRY_RUN([
++ flock_type=bsd
++ AC_DEFINE([HAVE_FLOCK_BSD], [], [Struct flock is BSD-type])
++ AC_MSG_RESULT("yes")
++-], AC_MSG_RESULT("no") )
+++], [
+++ AC_MSG_RESULT("no")
+++], [
+++ dnl cross-compiling; assume Linux
+++ AC_MSG_RESULT("no")
+++])
++
++ if test "$flock_type" == "unknown"; then
++ AC_MSG_ERROR([Don't know how to define struct flock on this system[,] set --enable-opcache=no])
+diff --git a/feeds/packages/lang/php5/pecl.mk b/feeds/packages/lang/php5/pecl.mk
+new file mode 100644
+index 0000000..ee2a5ce
+--- /dev/null
++++ b/feeds/packages/lang/php5/pecl.mk
+@@ -0,0 +1,46 @@
++#
++# Copyright (C) 2011-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/php5-pecl/Default
++ SUBMENU:=PHP
++ SECTION:=lang
++ CATEGORY:=Languages
++ URL:=http://pecl.php.net/
++ DEPENDS:=php5
++endef
++
++define Build/Prepare
++ $(Build/Prepare/Default)
++ ( cd $(PKG_BUILD_DIR); $(STAGING_DIR_HOST)/usr/bin/phpize )
++endef
++
++CONFIGURE_ARGS+= \
++ --with-php-config=$(STAGING_DIR_HOST)/usr/bin/php-config
++
++define PECLPackage
++
++ define Package/php5-pecl-$(1)
++ $(call Package/php5-pecl/Default)
++ TITLE:=$(2)
++
++ ifneq ($(3),)
++ DEPENDS+=$(3)
++ endif
++ endef
++
++ define Package/php5-pecl-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/php
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/modules/$(subst -,_,$(1)).so $$(1)/usr/lib/php/
++ $(INSTALL_DIR) $$(1)/etc/php5
++ ifeq ($(4),zend)
++ echo "zend_extension=/usr/lib/php/$(subst -,_,$(1)).so" > $$(1)/etc/php5/$(subst -,_,$(1)).ini
++ else
++ echo "extension=$(subst -,_,$(1)).so" > $$(1)/etc/php5/$(subst -,_,$(1)).ini
++ endif
++ endef
++
++endef
+diff --git a/feeds/packages/lang/python-crcmod/Makefile b/feeds/packages/lang/python-crcmod/Makefile
+new file mode 100644
+index 0000000..03b9d6a
+--- /dev/null
++++ b/feeds/packages/lang/python-crcmod/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=python-crcmod
++PKG_VERSION:=1.7
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Micke Prag <micke.prag@telldus.se>
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=crcmod-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://pypi.python.org/packages/source/c/crcmod/
++PKG_MD5SUM:=2d5b92117d958dcead94f9e17f54cd32
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/crcmod-$(PKG_VERSION)
++PKG_BUILD_DEPENDS:=python
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-crcmod
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=python-crcmod
++ URL:=http://crcmod.sourceforge.net/
++ DEPENDS:=+python-light
++endef
++
++define Package/python-crcmod/description
++ The software in this package is a Python module for generating objects that compute the Cyclic Redundancy Check (CRC). There is no attempt in this package to explain how the CRC works. There are a number of resources on the web that give a good explanation of the algorithms. Just do a Google search for "crc calculation" and browse till you find what you need. Another resource can be found in chapter 20 of the book "Numerical Recipes in C" by Press et. al.
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,,install --prefix="$(PKG_INSTALL_DIR)/usr")
++endef
++
++define Package/python-crcmod/install
++ $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)
++ $(CP) \
++ $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
++ $(1)$(PYTHON_PKG_DIR)
++endef
++
++$(eval $(call BuildPackage,python-crcmod))
+diff --git a/feeds/packages/lang/python-crypto/Makefile b/feeds/packages/lang/python-crypto/Makefile
+new file mode 100644
+index 0000000..e0a3b7b
+--- /dev/null
++++ b/feeds/packages/lang/python-crypto/Makefile
+@@ -0,0 +1,54 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pycrypto
++PKG_VERSION:=2.6.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/
++PKG_MD5SUM:=55a61a054aa66812daf5161a0d5d7eda
++
++PKG_LICENSE:=Public Domain
++PKG_LICENSE_FILES:=COPYRIGHT
++PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-crypto
++ SECTION:=lang-python
++ CATEGORY:=Languages
++ SUBMENU:=Python
++ TITLE:=python-crypto
++ URL:=http://www.pycrypto.org/
++ DEPENDS:=+python +libgmp
++endef
++
++define Package/python-crypto/description
++A collection of both secure hash functions (such as MD5 and SHA),
++and various encryption algorithms (AES, DES, IDEA, RSA, ElGamal, etc.).
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,,\
++ install --prefix=/usr --root=$(PKG_INSTALL_DIR),\
++ CONFIG_BIG_ENDIAN="$(CONFIG_BIG_ENDIAN)" \
++ )
++endef
++
++define Package/python-crypto/install
++ $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)/
++ $(CP) \
++ $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
++ $(1)$(PYTHON_PKG_DIR)/
++endef
++
++$(eval $(call PyPackage,python-crypto))
++$(eval $(call BuildPackage,python-crypto))
+diff --git a/feeds/packages/lang/python-crypto/patches/001-no-host-paths.patch b/feeds/packages/lang/python-crypto/patches/001-no-host-paths.patch
+new file mode 100644
+index 0000000..d481627
+--- /dev/null
++++ b/feeds/packages/lang/python-crypto/patches/001-no-host-paths.patch
+@@ -0,0 +1,11 @@
++--- a/setup.py
+++++ b/setup.py
++@@ -370,7 +370,7 @@ kw = {'name':"pycrypto",
++ 'ext_modules': plat_ext + [
++ # _fastmath (uses GNU mp library)
++ Extension("Crypto.PublicKey._fastmath",
++- include_dirs=['src/','/usr/include/'],
+++ include_dirs=['src/'],
++ libraries=['gmp'],
++ sources=["src/_fastmath.c"]),
++
+diff --git a/feeds/packages/lang/python-crypto/patches/002-fix-endianness-detect.patch b/feeds/packages/lang/python-crypto/patches/002-fix-endianness-detect.patch
+new file mode 100644
+index 0000000..baed012
+--- /dev/null
++++ b/feeds/packages/lang/python-crypto/patches/002-fix-endianness-detect.patch
+@@ -0,0 +1,13 @@
++--- a/setup.py
+++++ b/setup.py
++@@ -100,6 +100,10 @@
++ w(kwd.get("end", "\n"))
++
++ def endianness_macro():
+++ if os.environ["CONFIG_BIG_ENDIAN"] == "y":
+++ return ('PCT_BIG_ENDIAN', 1)
+++ else:
+++ return ('PCT_LITTLE_ENDIAN', 1)
++ s = struct.pack("@I", 0x33221100)
++ if s == "\x00\x11\x22\x33".encode(): # little endian
++ return ('PCT_LITTLE_ENDIAN', 1)
+diff --git a/feeds/packages/lang/python-dns/Makefile b/feeds/packages/lang/python-dns/Makefile
+new file mode 100644
+index 0000000..8dd7106
+--- /dev/null
++++ b/feeds/packages/lang/python-dns/Makefile
+@@ -0,0 +1,44 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=python-dns
++PKG_RELEASE:=1
++PKG_VERSION:=1.12.0
++PKG_SOURCE_URL:=http://www.dnspython.org/kits/$(PKG_VERSION)
++PKG_MD5SUM:=3f2601ef3c8b77fc6d21a9c77a81efeb
++PKG_SOURCE:=dnspython-$(PKG_VERSION).tar.gz
++PKG_MAINTAINER:=Denis Shulyaka <Shulyaka@gmail.com>
++PKG_LICENSE:=ISC
++PKG_LICENSE_FILES:=LICENSE
++PKG_BUILD_DIR:=$(BUILD_DIR)/dnspython-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-dns
++ SECTION:=language-python
++ CATEGORY:=Languages
++ SUBMENU:=Python
++ TITLE:=dnspython
++ URL:=http://www.dnspython.org/
++ DEPENDS:=+python
++endef
++
++define Package/python-dns/description
++ dnspython is a DNS toolkit for Python. It supports almost all record types. It can be used for queries, zone transfers, and dynamic updates. It supports TSIG authenticated messages and EDNS0.
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,,\
++ install --prefix="$(PKG_INSTALL_DIR)/usr" \
++ )
++endef
++
++$(eval $(call PyPackage,python-dns))
++$(eval $(call BuildPackage,python-dns))
+diff --git a/feeds/packages/lang/python-egenix-mx-base/Makefile b/feeds/packages/lang/python-egenix-mx-base/Makefile
+new file mode 100644
+index 0000000..7fd7c82
+--- /dev/null
++++ b/feeds/packages/lang/python-egenix-mx-base/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=python-egenix-mx-base
++PKG_VERSION:=3.2.8
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dmitry Trefilov <the-alien@live.ru>
++PKG_LICENSE:=eGenix.com Public License 1.1.0
++PKG_LICENSE_FILES:=LICENSE COPYRIGHT
++
++PKG_SOURCE:=egenix-mx-base-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://downloads.egenix.com/python/
++PKG_MD5SUM:=9d9d3a25f9dc051a15e97f452413423b
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/egenix-mx-base-$(PKG_VERSION)
++PKG_BUILD_DEPENDS:=python
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-egenix-mx-base
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ DEPENDS:=+USE_EGLIBC:librt +USE_UCLIBC:librt +python
++ TITLE:=Egenix mxBase
++ URL:=http://www.egenix.com/products/python/mxBase/
++endef
++
++define Package/python-egenix-mx-base/description
++ The eGenix.com mx Base Distribution for Python is a collection
++ of professional quality software tools which enhance Python's
++ usability in many important areas such as fast text searching,
++ date/time processing and high speed data types.
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,,install --prefix="$(PKG_INSTALL_DIR)/usr")
++endef
++
++define PyPackage/python-egenix-mx-base/install
++ $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)
++ $(CP) \
++ $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
++ $(1)$(PYTHON_PKG_DIR)
++endef
++
++$(eval $(call PyPackage,python-egenix-mx-base))
++$(eval $(call BuildPackage,python-egenix-mx-base))
+diff --git a/feeds/packages/lang/python-imglib/Makefile b/feeds/packages/lang/python-imglib/Makefile
+new file mode 100644
+index 0000000..1d12004
+--- /dev/null
++++ b/feeds/packages/lang/python-imglib/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (c) 1997-2009 by Secret Labs AB
++# Copyright (c) 1995-2009 by Fredrik Lundh
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=python-imglib
++PKG_VERSION:=1.1.7
++PKG_RELEASE:=1
++PKG_LICENSE:=CUSTOM
++PKG_LICENSE_FILES:=README
++
++PKG_SOURCE:=Imaging-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://effbot.org/downloads
++PKG_MD5SUM:=fc14a54e1ce02a0225be8854bfba478e
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/Imaging-$(PKG_VERSION)
++PKG_BUILD_DEPENDS:=python python-setuptools
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-imglib
++ SECTION:=language-python
++ CATEGORY:=Languages
++ SUBMENU:=Python
++ TITLE:=Python Imaging Library (PIL)
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++ URL:=http://www.pythonware.com/products/pil/
++ DEPENDS:=+python +libfreetype +libjpeg +zlib
++endef
++
++define Package/python-imglib/description
++ The Python Imaging Library adds image processing capabilities to your
++ Python interpreter.
++
++ This library provides extensive file format support, an efficient
++ internal representation, and fairly powerful image processing
++ capabilities.
++
++ The core image library is designed for fast access to data stored in a
++ few basic pixel formats. It should provide a solid foundation for a
++ general image processing tool.
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,., \
++ install --prefix="/usr" --root="$(PKG_INSTALL_DIR)", \
++ )
++endef
++
++define Package/python-imglib/install
++ $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) \
++ $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
++ $(1)$(PYTHON_PKG_DIR)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin
++endef
++
++$(eval $(call BuildPackage,python-imglib))
+diff --git a/feeds/packages/lang/python-imglib/patches/010-cross-compile.patch b/feeds/packages/lang/python-imglib/patches/010-cross-compile.patch
+new file mode 100644
+index 0000000..0aca43b
+--- /dev/null
++++ b/feeds/packages/lang/python-imglib/patches/010-cross-compile.patch
+@@ -0,0 +1,48 @@
++diff -rupN Imaging-1.1.7.orig/setup.py Imaging-1.1.7/setup.py
++--- Imaging-1.1.7.orig/setup.py 2009-11-15 17:06:10.000000000 +0100
+++++ Imaging-1.1.7/setup.py 2014-12-11 01:01:10.857100877 +0100
++@@ -34,10 +34,10 @@ def libinclude(root):
++ # TIFF_ROOT = libinclude("/opt/tiff")
++
++ TCL_ROOT = None
++-JPEG_ROOT = None
++-ZLIB_ROOT = None
+++JPEG_ROOT = os.environ['STAGING_DIR'] + "/usr/lib", os.environ['STAGING_DIR'] + "/usr/include"
+++ZLIB_ROOT = os.environ['STAGING_DIR'] + "/usr/lib", os.environ['STAGING_DIR'] + "/usr/include"
++ TIFF_ROOT = None
++-FREETYPE_ROOT = None
+++FREETYPE_ROOT = os.environ['STAGING_DIR'] + "/usr/lib", os.environ['STAGING_DIR'] + "/usr/include"
++ LCMS_ROOT = None
++
++ # FIXME: add mechanism to explicitly *disable* the use of a library
++@@ -147,7 +147,6 @@ class pil_build_ext(build_ext):
++ add_directory(library_dirs, "/opt/local/lib")
++ add_directory(include_dirs, "/opt/local/include")
++
++- add_directory(library_dirs, "/usr/local/lib")
++ # FIXME: check /opt/stuff directories here?
++
++ prefix = sysconfig.get_config_var("prefix")
++@@ -199,22 +198,6 @@ class pil_build_ext(build_ext):
++ add_directory(include_dirs, include_root)
++
++ #
++- # add standard directories
++-
++- # look for tcl specific subdirectory (e.g debian)
++- if _tkinter:
++- tcl_dir = "/usr/include/tcl" + TCL_VERSION
++- if os.path.isfile(os.path.join(tcl_dir, "tk.h")):
++- add_directory(include_dirs, tcl_dir)
++-
++- # standard locations
++- add_directory(library_dirs, "/usr/local/lib")
++- add_directory(include_dirs, "/usr/local/include")
++-
++- add_directory(library_dirs, "/usr/lib")
++- add_directory(include_dirs, "/usr/include")
++-
++- #
++ # insert new dirs *before* default libs, to avoid conflicts
++ # between Python PYD stub libs and real libraries
++
+diff --git a/feeds/packages/lang/python-imglib/patches/020-freetype-header-include.patch b/feeds/packages/lang/python-imglib/patches/020-freetype-header-include.patch
+new file mode 100644
+index 0000000..bf131aa
+--- /dev/null
++++ b/feeds/packages/lang/python-imglib/patches/020-freetype-header-include.patch
+@@ -0,0 +1,21 @@
++diff -rupN Imaging-1.1.7.orig/_imagingft.c Imaging-1.1.7/_imagingft.c
++--- Imaging-1.1.7.orig/_imagingft.c 2009-11-01 01:44:12.000000000 +0100
+++++ Imaging-1.1.7/_imagingft.c 2014-12-11 01:05:21.290135484 +0100
++@@ -32,7 +32,7 @@
++ #include FT_FREETYPE_H
++ #else
++ /* freetype 2.0 */
++-#include <freetype/freetype.h>
+++#include <freetype2/freetype.h>
++ #endif
++
++ #if PY_VERSION_HEX < 0x01060000
++@@ -70,7 +70,7 @@ struct {
++ const char* message;
++ } ft_errors[] =
++
++-#include <freetype/fterrors.h>
+++#include <freetype2/fterrors.h>
++
++ /* -------------------------------------------------------------------- */
++ /* font objects */
+diff --git a/feeds/packages/lang/python-ldap/Makefile b/feeds/packages/lang/python-ldap/Makefile
+new file mode 100644
+index 0000000..7b57557
+--- /dev/null
++++ b/feeds/packages/lang/python-ldap/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=python-ldap
++PKG_VERSION:=2.4.20
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dmitry Trefilov <the-alien@live.ru>
++PKG_LICENSE:=Python-style
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://pypi.python.org/packages/source/p/$(PKG_NAME)
++PKG_MD5SUM:=f98ecd0581766a43954ba0f218053032
++
++PKG_BUILD_DEPENDS:=python libopenldap
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-ldap
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ DEPENDS:=+libopenldap +python
++ TITLE:=Python modules for implementing LDAP clients
++ URL:=http://python-ldap.org/
++endef
++
++define Package/python-ldap/description
++ python-ldap provides an object-oriented API to access LDAP directory
++ servers from Python programs. Mainly it wraps the OpenLDAP 2.x libs
++ for that purpose. Additionally the package contains modules for
++ other LDAP-related stuff (e.g. processing LDIF, LDAPURLs, LDAPv3
++ schema, LDAPv3 extended operations and controls, etc.).
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,,build_ext \
++ --include-dirs="$(STAGING_DIR)/usr/include:$(STAGING_DIR)/usr/include/sasl" \
++ --library-dirs="$(STAGING_DIR)/usr/lib:$(STAGING_DIR)/usr/lib/sasl2" \
++ build_py \
++ install --prefix="$(PKG_INSTALL_DIR)/usr")
++endef
++
++define PyPackage/python-ldap/install
++ $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)
++ $(CP) \
++ $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
++ $(1)$(PYTHON_PKG_DIR)
++endef
++
++$(eval $(call PyPackage,python-ldap))
++$(eval $(call BuildPackage,python-ldap))
+diff --git a/feeds/packages/lang/python-ldap/patches/010-setup_cfg.patch b/feeds/packages/lang/python-ldap/patches/010-setup_cfg.patch
+new file mode 100644
+index 0000000..372e9d2
+--- /dev/null
++++ b/feeds/packages/lang/python-ldap/patches/010-setup_cfg.patch
+@@ -0,0 +1,16 @@
++From: Dmitrij Trefilov <the-alien@live.ru>
++
++Subject: [PATCH] lang: removed hardcoded include and library directories from setup.cfg
++Signed-off-by: Dmitrij Trefilov <the-alien@live.ru>
++---
++--- a/setup.cfg
+++++ b/setup.cfg
++@@ -1,6 +1,6 @@
++ [_ldap]
++-library_dirs = /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64
++-include_dirs = /usr/include /usr/include/sasl /usr/local/include /usr/local/include/sasl
+++library_dirs =
+++include_dirs =
++ defines = HAVE_SASL HAVE_TLS HAVE_LIBLDAP_R
++ extra_compile_args =
++ extra_objects =
+diff --git a/feeds/packages/lang/python-mysql/Makefile b/feeds/packages/lang/python-mysql/Makefile
+new file mode 100644
+index 0000000..04ebe5b
+--- /dev/null
++++ b/feeds/packages/lang/python-mysql/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=MySQL-python
++PKG_VERSION:=1.2.5
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).zip
++PKG_SOURCE_URL:=https://pypi.python.org/packages/source/M/MySQL-python/
++PKG_MD5SUM:=654f75b302db6ed8dc5a898c625e030c
++
++PKG_BUILD_DEPENDS:=python python-setuptools libmysqlclient
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-mysql
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=MySQL database adapter for Python
++ URL:=https://pypi.python.org/pypi/MySQL-python
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++ DEPENDS:=+python +libmysqlclient
++endef
++
++define Package/python-mysql/description
++ MySQLdb is an thread-compatible interface to the popular MySQL database
++ server that provides the Python database API.
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,,install --prefix=/usr --root=$(PKG_INSTALL_DIR))
++endef
++
++define Package/python-mysql/install
++ $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)
++ $(CP) \
++ $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
++ $(1)$(PYTHON_PKG_DIR)
++endef
++
++$(eval $(call BuildPackage,python-mysql))
+diff --git a/feeds/packages/lang/python-mysql/patches/010-threadsafe.patch b/feeds/packages/lang/python-mysql/patches/010-threadsafe.patch
+new file mode 100644
+index 0000000..bcd9af8
+--- /dev/null
++++ b/feeds/packages/lang/python-mysql/patches/010-threadsafe.patch
+@@ -0,0 +1,11 @@
++--- MySQL-python-1.2.2/site_orig.cfg 2007-08-15 12:58:40.000000000 +0200
+++++ MySQL-python-1.2.2/site.cfg 2007-08-15 12:58:49.000000000 +0200
++@@ -4,7 +4,7 @@
++ # static: link against a static library (probably required for embedded)
++
++ embedded = False
++-threadsafe = True
+++threadsafe = False
++ static = False
++
++ # The path to mysql_config.
+diff --git a/feeds/packages/lang/python-pip/Makefile b/feeds/packages/lang/python-pip/Makefile
+new file mode 100644
+index 0000000..1d20ca9
+--- /dev/null
++++ b/feeds/packages/lang/python-pip/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=python-pip
++PKG_VERSION:=7.1.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=pip-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://pypi.python.org/packages/source/p/pip/
++PKG_MD5SUM:=3823d2343d9f3aaab21cf9c917710196
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/pip-$(PKG_VERSION)
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-pip
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Tool for installing Python packages.
++ URL:=https://pip.pypa.io
++ DEPENDS:=+python +python-setuptools
++ MAINTAINER:=Alexandru Ardelean <ardeleanalex@gmail.com>
++endef
++
++define Package/python-pip/description
++ A tool for installing and managing Python packages.
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,,\
++ install --root="$(PKG_INSTALL_DIR)" --prefix="/usr" \
++ --single-version-externally-managed \
++ )
++endef
++
++define PyPackage/python-pip/filespec
+++|$(PYTHON_PKG_DIR)
++-|$(PYTHON_PKG_DIR)/pip/_vendor/distlib/*.exe
++endef
++
++define PyPackage/python-pip/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin
++endef
++
++$(eval $(call PyPackage,python-pip))
++$(eval $(call BuildPackage,python-pip))
++
+diff --git a/feeds/packages/lang/python-psycopg2/Makefile b/feeds/packages/lang/python-psycopg2/Makefile
+new file mode 100644
+index 0000000..b55eb00
+--- /dev/null
++++ b/feeds/packages/lang/python-psycopg2/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=python-psycopg2
++PKG_VERSION:=2.6.1
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dmitry Trefilov <the-alien@live.ru>
++PKG_LICENSE:=LGPL-3.0+
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_SOURCE:=psycopg2-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://initd.org/psycopg/tarballs/PSYCOPG-2-6/
++PKG_MD5SUM:=842b44f8c95517ed5b792081a2370da1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/psycopg2-$(PKG_VERSION)
++PKG_BUILD_DEPENDS:=python libpq python-setuptools
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-psycopg2
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=PostgreSQL database adapter for Python
++ URL:=http://www.initd.org/
++ DEPENDS:=+python +libpq +python-egenix-mx-base
++endef
++
++define Package/python-psycopg2/description
++ This package contains is a PostgreSQL database adapter for the Python
++ programming language.
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,.,build_py)
++ $(call Build/Compile/PyMod,,build_ext --pg-config="$(STAGING_DIR)/usr/bin/pg_config")
++ $(call Build/Compile/PyMod,.,install --prefix=/usr --root=$(PKG_INSTALL_DIR))
++endef
++
++define Package/python-psycopg2/install
++ $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)
++ $(CP) \
++ $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
++ $(1)$(PYTHON_PKG_DIR)
++endef
++
++$(eval $(call PyPackage,python-psycopg2))
++$(eval $(call BuildPackage,python-psycopg2))
+diff --git a/feeds/packages/lang/python-pyserial/Makefile b/feeds/packages/lang/python-pyserial/Makefile
+new file mode 100644
+index 0000000..ba28e10
+--- /dev/null
++++ b/feeds/packages/lang/python-pyserial/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=python-pyserial
++PKG_VERSION:=2.7
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Micke Prag <micke.prag@telldus.se>
++PKG_LICENSE:=Python-2.0
++
++PKG_SOURCE:=pyserial-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://pypi.python.org/packages/source/p/pyserial/
++PKG_MD5SUM:=794506184df83ef2290de0d18803dd11
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/pyserial-$(PKG_VERSION)
++PKG_BUILD_DEPENDS:=python
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-pyserial
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=python-pyserial
++ URL:=http://pyserial.sourceforge.net
++ DEPENDS:=+python-light
++endef
++
++define Package/python-pyserial/description
++ serial port python bindings
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,,install --prefix="$(PKG_INSTALL_DIR)/usr")
++endef
++
++define Package/python-pyserial/install
++ $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)
++ $(CP) \
++ $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
++ $(1)$(PYTHON_PKG_DIR)
++endef
++
++$(eval $(call BuildPackage,python-pyserial))
+diff --git a/feeds/packages/lang/python-setuptools/Makefile b/feeds/packages/lang/python-setuptools/Makefile
+new file mode 100644
+index 0000000..a81eff4
+--- /dev/null
++++ b/feeds/packages/lang/python-setuptools/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=python-setuptools
++PKG_VERSION:=18.3.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=setuptools-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://pypi.python.org/packages/source/s/setuptools/
++PKG_MD5SUM:=748187b93152fa60287dfb896837fd7c
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/setuptools-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-setuptools
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Tool for installing Python packages.
++ URL:=https://bitbucket.org/pypa/setuptools
++ DEPENDS:=+python
++ MAINTAINER:=Alexandru Ardelean <ardeleanalex@gmail.com>
++endef
++
++define Package/python-setuptools/description
++ Easily download, build, install, upgrade, and uninstall Python packages
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,,\
++ install --root="$(PKG_INSTALL_DIR)" --prefix="/usr" \
++ --single-version-externally-managed \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(PYTHON_LIB_DIR)
++ $(CP) \
++ $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
++ $(PYTHON_LIB_DIR)
++endef
++
++define PyPackage/python-setuptools/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++$(eval $(call PyPackage,python-setuptools))
++$(eval $(call BuildPackage,python-setuptools))
++
+diff --git a/feeds/packages/lang/python-setuptools/patches/0001-remove-windows-support.patch b/feeds/packages/lang/python-setuptools/patches/0001-remove-windows-support.patch
+new file mode 100644
+index 0000000..0a2d50b
+--- /dev/null
++++ b/feeds/packages/lang/python-setuptools/patches/0001-remove-windows-support.patch
+@@ -0,0 +1,20 @@
++diff --git a/setuptools/dist.py b/setuptools/dist.py
++index 6b9d350..1350e8a 100644
++--- a/setuptools/dist.py
+++++ b/setuptools/dist.py
++@@ -15,7 +15,6 @@ from distutils.errors import (DistutilsOptionError, DistutilsPlatformError,
++
++ from setuptools.depends import Require
++ from setuptools.compat import basestring, PY2
++-from setuptools import windows_support
++ import pkg_resources
++
++ def _get_unpatched(cls):
++@@ -310,7 +309,6 @@ class Distribution(_Distribution):
++ egg_cache_dir = os.path.join(os.curdir, '.eggs')
++ if not os.path.exists(egg_cache_dir):
++ os.mkdir(egg_cache_dir)
++- windows_support.hide_file(egg_cache_dir)
++ readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt')
++ with open(readme_txt_filename, 'w') as f:
++ f.write('This directory contains eggs that were downloaded '
+diff --git a/feeds/packages/lang/python-setuptools/patches/0002-fix-pyvenv-environment-get.patch b/feeds/packages/lang/python-setuptools/patches/0002-fix-pyvenv-environment-get.patch
+new file mode 100644
+index 0000000..c46a5f3
+--- /dev/null
++++ b/feeds/packages/lang/python-setuptools/patches/0002-fix-pyvenv-environment-get.patch
+@@ -0,0 +1,13 @@
++diff --git a/setuptools/command/easy_install.py b/setuptools/command/easy_install.py
++index df1655b..24c34e5 100755
++--- a/setuptools/command/easy_install.py
+++++ b/setuptools/command/easy_install.py
++@@ -1885,7 +1885,7 @@ class CommandSpec(list):
++ return param
++ if isinstance(param, list):
++ return cls(param)
++- if param is None:
+++ if param is None or os.environ.get('__PYVENV_LAUNCHER__'):
++ return cls.from_environment()
++ # otherwise, assume it's a string.
++ return cls.from_string(param)
+diff --git a/feeds/packages/lang/python-yaml/Makefile b/feeds/packages/lang/python-yaml/Makefile
+new file mode 100644
+index 0000000..3af2f0e
+--- /dev/null
++++ b/feeds/packages/lang/python-yaml/Makefile
+@@ -0,0 +1,43 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=PyYAML
++PKG_VERSION:=3.11
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://pyyaml.org/download/pyyaml/
++PKG_MD5SUM:=f50e08ef0fe55178479d3a618efe21db
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_BUILD_DEPENDS:=python
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/python-yaml
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=YAML parser and emitter for Python
++ URL:=http://pyyaml.org/wiki/PyYAML
++ DEPENDS:=+python +libyaml
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,,\
++ --with-libyaml install --prefix="$(PKG_INSTALL_DIR)/usr" \
++ )
++endef
++
++$(eval $(call PyPackage,python-yaml))
++$(eval $(call BuildPackage,python-yaml))
+diff --git a/feeds/packages/lang/python/Makefile b/feeds/packages/lang/python/Makefile
+new file mode 100644
+index 0000000..698f4be
+--- /dev/null
++++ b/feeds/packages/lang/python/Makefile
+@@ -0,0 +1,250 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++# The file included below defines PYTHON_VERSION
++include ./files/python-package.mk
++
++PKG_NAME:=python
++PKG_VERSION:=$(PYTHON_VERSION).$(PYTHON_VERSION_MICRO)
++PKG_RELEASE:=6
++
++PKG_SOURCE:=Python-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.python.org/ftp/python/$(PKG_VERSION)
++PKG_MD5SUM:=c685ef0b8e9f27b5e3db5db12b268ac6
++
++PKG_LICENSE:=PSF
++PKG_LICENSE_FILES:=LICENSE Modules/_ctypes/libffi_msvc/LICENSE Modules/_ctypes/darwin/LICENSE Modules/_ctypes/libffi/LICENSE Modules/_ctypes/libffi_osx/LICENSE Tools/pybench/LICENSE
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++HOST_BUILD_PARALLEL:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/Python-$(PKG_VERSION)
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/Python-$(PKG_VERSION)
++
++PKG_BUILD_DEPENDS:=python/host
++HOST_BUILD_DEPENDS:=bzip2/host
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/python/Default
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Python $(PYTHON_VERSION) programming language
++ URL:=http://www.python.org/
++ MAINTAINER:=Alexandru Ardelean <ardeleanalex@gmail.com>
++endef
++
++define Package/python/Default/description
++ Python is a dynamic object-oriented programming language that can be used
++ for many kinds of software development. It offers strong support for
++ integration with other languages and tools, comes with extensive standard
++ libraries, and can be learned in a few days. Many Python programmers
++ report substantial productivity gains and feel the language encourages
++ the development of higher quality, more maintainable code.
++endef
++
++define Package/python-base
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) interpreter
++ DEPENDS:=+libpthread +zlib
++endef
++
++define Package/python-base/description
++ This package contains only the interpreter and the bare minimum
++ for the interpreter to start.
++endef
++
++define Package/python-light
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) light installation
++ DEPENDS:=+python-base +libffi +libbz2
++endef
++
++define Package/python-light/description
++ This package is essentially the python-base package plus
++ a few of the rarely used (and big) libraries stripped out
++ into separate packages.
++endef
++
++# Define newline here, since it's not defined in OpenWRT
++define newline
++
++
++endef
++
++PYTHON_LIB_FILES_DEL:=
++PYTHON_PACKAGES:=
++define PyBasePackage
++ PYTHON_PACKAGES+=$(1)
++ PYTHON_LIB_FILES_DEL+=$(2)
++ define PyPackage/$(1)/filespec
++ $(subst $(space),$(newline),$(foreach lib_file,$(2),+|$(lib_file)))
++ endef
++endef
++
++include ./files/python-package-*.mk
++
++define Package/python
++$(call Package/python/Default)
++ DEPENDS:=+python-light $(foreach package,$(PYTHON_PACKAGES),+$(package))
++endef
++
++define Package/python/description
++ This package contains the (almost) full Python install.
++ It's python-light + all other packages.
++endef
++
++MAKE_FLAGS+=\
++ CROSS_COMPILE=yes \
++ LD="$(TARGET_CC)" \
++ PGEN=pgen2
++
++EXTRA_CFLAGS+= \
++ -DNDEBUG -fno-inline
++EXTRA_LDFLAGS+= \
++ -L$(PKG_BUILD_DIR)
++
++ENABLE_IPV6:=
++ifeq ($(CONFIG_IPV6),y)
++ ENABLE_IPV6 += --enable-ipv6
++endif
++
++CONFIGURE_ARGS+= \
++ --sysconfdir=/etc \
++ --enable-shared \
++ --without-cxx-main \
++ --with-threads \
++ --with-system-ffi="$(STAGING_DIR)/usr" \
++ --without-pymalloc \
++ $(ENABLE_IPV6) \
++ CONFIG_SITE="$(PKG_BUILD_DIR)/config.site" \
++ OPT="$(TARGET_CFLAGS)"
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ $(CP) ./files/config.site $(PKG_BUILD_DIR)/config.site
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(STAGING_DIR)/mk/
++ $(INSTALL_DIR) $(1)/usr/include/ $(1)/usr/lib/ $(1)/usr/lib/pkgconfig
++ $(INSTALL_DIR) $(1)/usr/lib/python$(PYTHON_VERSION)/
++ $(INSTALL_DATA) ./files/python-package.mk $(STAGING_DIR)/mk/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/python$(PYTHON_VERSION) \
++ $(1)/usr/include/
++ $(CP) \
++ $(STAGING_DIR_HOST)/lib/python$(PYTHON_VERSION) \
++ $(PKG_INSTALL_DIR)/usr/lib/libpython$(PYTHON_VERSION).so* \
++ $(1)/usr/lib/
++ $(CP) \
++ $(STAGING_DIR_HOST)/lib/pkgconfig/python.pc \
++ $(STAGING_DIR_HOST)/lib/pkgconfig/python2.pc \
++ $(STAGING_DIR_HOST)/lib/pkgconfig/python-$(PYTHON_VERSION).pc \
++ $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/python$(PYTHON_VERSION)/config \
++ $(1)/usr/lib/python$(PYTHON_VERSION)/
++endef
++
++PYTHON_BASE_LIB_FILES:= \
++ /usr/lib/python$(PYTHON_VERSION)/_abcoll.py \
++ /usr/lib/python$(PYTHON_VERSION)/_sysconfigdata.py \
++ /usr/lib/python$(PYTHON_VERSION)/_weakrefset.py \
++ /usr/lib/python$(PYTHON_VERSION)/abc.py \
++ /usr/lib/python$(PYTHON_VERSION)/copy_reg.py \
++ /usr/lib/python$(PYTHON_VERSION)/genericpath.py \
++ /usr/lib/python$(PYTHON_VERSION)/linecache.py \
++ /usr/lib/python$(PYTHON_VERSION)/posixpath.py \
++ /usr/lib/python$(PYTHON_VERSION)/os.py \
++ /usr/lib/python$(PYTHON_VERSION)/re.py \
++ /usr/lib/python$(PYTHON_VERSION)/site.py \
++ /usr/lib/python$(PYTHON_VERSION)/sre_compile.py \
++ /usr/lib/python$(PYTHON_VERSION)/sre_constants.py \
++ /usr/lib/python$(PYTHON_VERSION)/sre_parse.py \
++ /usr/lib/python$(PYTHON_VERSION)/sysconfig.py \
++ /usr/lib/python$(PYTHON_VERSION)/stat.py \
++ /usr/lib/python$(PYTHON_VERSION)/traceback.py \
++ /usr/lib/python$(PYTHON_VERSION)/types.py \
++ /usr/lib/python$(PYTHON_VERSION)/UserDict.py \
++ /usr/lib/python$(PYTHON_VERSION)/warnings.py
++
++PYTHON_LIB_FILES_DEL+=$(PYTHON_BASE_LIB_FILES)
++
++define PyPackage/python-base/filespec
+++|/usr/bin/python$(PYTHON_VERSION)
++$(subst $(space),$(newline),$(foreach lib_file,$(PYTHON_BASE_LIB_FILES),+|$(lib_file)))
++endef
++
++define PyPackage/python-light/filespec
+++|/usr/lib/python$(PYTHON_VERSION)
++-|/usr/lib/python$(PYTHON_VERSION)/config
++-|/usr/lib/python$(PYTHON_VERSION)/distutils/cygwinccompiler.py
++-|/usr/lib/python$(PYTHON_VERSION)/distutils/command/wininst*
++-|/usr/lib/python$(PYTHON_VERSION)/ensurepip
++-|/usr/lib/python$(PYTHON_VERSION)/idlelib
++-|/usr/lib/python$(PYTHON_VERSION)/lib2to3
++-|/usr/lib/python$(PYTHON_VERSION)/lib-tk
++-|/usr/lib/python$(PYTHON_VERSION)/lib-dynload/_testcapi.so
++-|/usr/lib/python$(PYTHON_VERSION)/pdb.doc
++-|/usr/lib/python$(PYTHON_VERSION)/test
++-|/usr/lib/python$(PYTHON_VERSION)/webbrowser.py
++-|/usr/lib/python$(PYTHON_VERSION)/*/test
++-|/usr/lib/python$(PYTHON_VERSION)/*/tests
++-|/usr/lib/python$(PYTHON_VERSION)/lib-dynload/readline.so
++$(subst $(space),$(newline),$(foreach lib_file,$(PYTHON_LIB_FILES_DEL),-|$(lib_file)))
++endef
++
++define PyPackage/python-base/install
++ $(LN) python$(PYTHON_VERSION) $(1)/usr/bin/python
++ $(LN) python$(PYTHON_VERSION) $(1)/usr/bin/python2
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpython$(PYTHON_VERSION).so* $(1)/usr/lib/
++endef
++
++define PyPackage/python/filespec
++-|$(PYTHON_PKG_DIR)
++endef
++
++HOST_CFLAGS+= \
++ -I/usr/include/ncursesw \
++ -I/usr/include/ncurses
++
++HOST_CONFIGURE_ARGS+= \
++ --without-cxx-main \
++ --without-pymalloc \
++ --with-threads \
++ --with-system-expat=$(STAGING_DIR_HOST) \
++ --prefix=$(STAGING_DIR_HOST) \
++ --with-ensurepip=upgrade \
++ CONFIG_SITE= \
++ CFLAGS="$(HOST_CFLAGS)"
++
++define Host/Install
++ $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin/
++ $(MAKE) -C $(HOST_BUILD_DIR) install
++ $(INSTALL_BIN) $(HOST_BUILD_DIR)/Parser/pgen $(STAGING_DIR_HOST)/bin/pgen2
++endef
++
++$(eval $(call HostBuild))
++
++$(foreach package, $(PYTHON_PACKAGES), \
++ $(eval $(call PyPackage,$(package))) \
++ $(eval $(call BuildPackage,$(package))) \
++)
++
++$(eval $(call PyPackage,python-base))
++$(eval $(call PyPackage,python-light))
++$(eval $(call PyPackage,python))
++
++$(eval $(call BuildPackage,python-base))
++$(eval $(call BuildPackage,python-light))
++$(eval $(call BuildPackage,python))
+diff --git a/feeds/packages/lang/python/files/config.site b/feeds/packages/lang/python/files/config.site
+new file mode 100644
+index 0000000..cfa56b8
+--- /dev/null
++++ b/feeds/packages/lang/python/files/config.site
+@@ -0,0 +1,12 @@
++#! /bin/sh
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++ac_cv_file__dev_ptmx=yes
++ac_cv_file__dev_ptc=no
++ac_cv_buggy_getaddrinfo=no
++
+diff --git a/feeds/packages/lang/python/files/python-package-codecs.mk b/feeds/packages/lang/python/files/python-package-codecs.mk
+new file mode 100644
+index 0000000..d6e1835
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-codecs.mk
+@@ -0,0 +1,23 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-codecs
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) codecs + unicode support
++ DEPENDS:=+python-light
++endef
++
++$(eval $(call PyBasePackage,python-codecs, \
++ /usr/lib/python$(PYTHON_VERSION)/encodings \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_codecs_cn.so \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_codecs_hk.so \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_codecs_iso2022.so \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_codecs_jp.so \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_codecs_kr.so \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_codecs_tw.so \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/unicodedata.so \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-compiler.mk b/feeds/packages/lang/python/files/python-package-compiler.mk
+new file mode 100644
+index 0000000..fbe8bf2
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-compiler.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-compiler
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) compiler module
++ DEPENDS:=+python-light
++endef
++
++$(eval $(call PyBasePackage,python-compiler, \
++ /usr/lib/python$(PYTHON_VERSION)/compiler \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-ctypes.mk b/feeds/packages/lang/python/files/python-package-ctypes.mk
+new file mode 100644
+index 0000000..66b3033
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-ctypes.mk
+@@ -0,0 +1,18 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-ctypes
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) ctypes module
++ DEPENDS:=+python-light
++endef
++
++$(eval $(call PyBasePackage,python-ctypes, \
++ /usr/lib/python$(PYTHON_VERSION)/ctypes \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_ctypes.so \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_ctypes_test.so \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-db.mk b/feeds/packages/lang/python/files/python-package-db.mk
+new file mode 100644
+index 0000000..26f35d8
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-db.mk
+@@ -0,0 +1,18 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-db
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) db module
++ DEPENDS:=+python-light +libdb47
++endef
++
++$(eval $(call PyBasePackage,python-db, \
++ /usr/lib/python$(PYTHON_VERSION)/bsddb \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_bsddb.so \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/dbm.so \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-decimal.mk b/feeds/packages/lang/python/files/python-package-decimal.mk
+new file mode 100644
+index 0000000..33e3a21
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-decimal.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-decimal
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) decimal module
++ DEPENDS:=+python-light
++endef
++
++$(eval $(call PyBasePackage,python-decimal, \
++ /usr/lib/python$(PYTHON_VERSION)/decimal.py \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-distutils.mk b/feeds/packages/lang/python/files/python-package-distutils.mk
+new file mode 100644
+index 0000000..f5119fa
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-distutils.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-distutils
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) distutils
++ DEPENDS:=+python-light
++endef
++
++$(eval $(call PyBasePackage,python-distutils, \
++ /usr/lib/python$(PYTHON_VERSION)/distutils \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-email.mk b/feeds/packages/lang/python/files/python-package-email.mk
+new file mode 100644
+index 0000000..51fa8d1
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-email.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-email
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) email module
++ DEPENDS:=+python-light
++endef
++
++$(eval $(call PyBasePackage,python-email, \
++ /usr/lib/python$(PYTHON_VERSION)/email \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-gdbm.mk b/feeds/packages/lang/python/files/python-package-gdbm.mk
+new file mode 100644
+index 0000000..8e0b16f
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-gdbm.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-gdbm
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) gdbm module
++ DEPENDS:=+python-light +libgdbm
++endef
++
++$(eval $(call PyBasePackage,python-gdbm, \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/gdbm.so \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-logging.mk b/feeds/packages/lang/python/files/python-package-logging.mk
+new file mode 100644
+index 0000000..f45de35
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-logging.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-logging
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) logging module
++ DEPENDS:=+python-light
++endef
++
++$(eval $(call PyBasePackage,python-logging, \
++ /usr/lib/python$(PYTHON_VERSION)/logging \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-multiprocessing.mk b/feeds/packages/lang/python/files/python-package-multiprocessing.mk
+new file mode 100644
+index 0000000..2a9f5b1
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-multiprocessing.mk
+@@ -0,0 +1,17 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-multiprocessing
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) multiprocessing
++ DEPENDS:=+python-light
++endef
++
++$(eval $(call PyBasePackage,python-multiprocessing, \
++ /usr/lib/python$(PYTHON_VERSION)/multiprocessing \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_multiprocessing.so \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-ncurses.mk b/feeds/packages/lang/python/files/python-package-ncurses.mk
+new file mode 100644
+index 0000000..bab9415
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-ncurses.mk
+@@ -0,0 +1,18 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-ncurses
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) ncurses module
++ DEPENDS:=+python-light +libncurses
++endef
++
++$(eval $(call PyBasePackage,python-ncurses, \
++ /usr/lib/python$(PYTHON_VERSION)/curses \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_curses.so \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_curses_panel.so \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-openssl.mk b/feeds/packages/lang/python/files/python-package-openssl.mk
+new file mode 100644
+index 0000000..4d897eb
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-openssl.mk
+@@ -0,0 +1,17 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-openssl
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) SSL module
++ DEPENDS:=+python-light +libopenssl
++endef
++
++$(eval $(call PyBasePackage,python-openssl, \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_hashlib.so \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_ssl.so \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-pydoc.mk b/feeds/packages/lang/python/files/python-package-pydoc.mk
+new file mode 100644
+index 0000000..ca27f9b
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-pydoc.mk
+@@ -0,0 +1,18 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-pydoc
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) pydoc module
++ DEPENDS:=+python-light
++endef
++
++$(eval $(call PyBasePackage,python-pydoc, \
++ /usr/lib/python$(PYTHON_VERSION)/doctest.py \
++ /usr/lib/python$(PYTHON_VERSION)/pydoc.py \
++ /usr/lib/python$(PYTHON_VERSION)/pydoc_data \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-sqlite3.mk b/feeds/packages/lang/python/files/python-package-sqlite3.mk
+new file mode 100644
+index 0000000..c5abb12
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-sqlite3.mk
+@@ -0,0 +1,17 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-sqlite3
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) sqlite3 module
++ DEPENDS:=+python-light +libsqlite3
++endef
++
++$(eval $(call PyBasePackage,python-sqlite3, \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_sqlite3.so \
++ /usr/lib/python$(PYTHON_VERSION)/sqlite3 \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-unittest.mk b/feeds/packages/lang/python/files/python-package-unittest.mk
+new file mode 100644
+index 0000000..6e1ab55
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-unittest.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-unittest
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) unittest module
++ DEPENDS:=+python-light
++endef
++
++$(eval $(call PyBasePackage,python-unittest, \
++ /usr/lib/python$(PYTHON_VERSION)/unittest \
++))
+diff --git a/feeds/packages/lang/python/files/python-package-xml.mk b/feeds/packages/lang/python/files/python-package-xml.mk
+new file mode 100644
+index 0000000..69074cc
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package-xml.mk
+@@ -0,0 +1,20 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python-xml
++$(call Package/python/Default)
++ TITLE:=Python $(PYTHON_VERSION) xml libs
++ DEPENDS:=+python-light
++endef
++
++$(eval $(call PyBasePackage,python-xml, \
++ /usr/lib/python$(PYTHON_VERSION)/xml \
++ /usr/lib/python$(PYTHON_VERSION)/xmllib.py \
++ /usr/lib/python$(PYTHON_VERSION)/xmlrpclib.py \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/_elementtree.so \
++ /usr/lib/python$(PYTHON_VERSION)/lib-dynload/pyexpat.so \
++))
+diff --git a/feeds/packages/lang/python/files/python-package.mk b/feeds/packages/lang/python/files/python-package.mk
+new file mode 100644
+index 0000000..b4be3a8
+--- /dev/null
++++ b/feeds/packages/lang/python/files/python-package.mk
+@@ -0,0 +1,120 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++PYTHON_VERSION:=2.7
++PYTHON_VERSION_MICRO:=10
++
++PYTHON_DIR:=$(STAGING_DIR)/usr
++PYTHON_BIN_DIR:=$(PYTHON_DIR)/bin
++PYTHON_INC_DIR:=$(PYTHON_DIR)/include/python$(PYTHON_VERSION)
++PYTHON_LIB_DIR:=$(PYTHON_DIR)/lib/python$(PYTHON_VERSION)
++
++PYTHON_PKG_DIR:=/usr/lib/python$(PYTHON_VERSION)/site-packages
++
++PYTHON:=python$(PYTHON_VERSION)
++
++HOST_PYTHON_LIB_DIR:=$(STAGING_DIR_HOST)/lib/python$(PYTHON_VERSION)
++HOST_PYTHON_BIN:=$(STAGING_DIR_HOST)/bin/python2
++
++PYTHONPATH:=$(PYTHON_LIB_DIR):$(STAGING_DIR)/$(PYTHON_PKG_DIR):$(PKG_INSTALL_DIR)/$(PYTHON_PKG_DIR)
++define HostPython
++ ( export PYTHONPATH="$(PYTHONPATH)"; \
++ export PYTHONOPTIMIZE=""; \
++ export PYTHONDONTWRITEBYTECODE=1; \
++ export _python_sysroot="$(STAGING_DIR)"; \
++ export _python_prefix="/usr"; \
++ export _python_exec_prefix="/usr"; \
++ $(1) \
++ $(HOST_PYTHON_BIN) $(2); \
++ )
++endef
++
++# These configure args are needed in detection of path to Python header files
++# using autotools.
++CONFIGURE_ARGS += \
++ _python_sysroot="$(STAGING_DIR)" \
++ _python_prefix="/usr" \
++ _python_exec_prefix="/usr"
++
++PKG_USE_MIPS16:=0
++# This is required in addition to PKG_USE_MIPS16:=0 because otherwise MIPS16
++# flags are inherited from the Python base package (via sysconfig module)
++ifdef CONFIG_USE_MIPS16
++ TARGET_CFLAGS += -mno-mips16 -mno-interlink-mips16
++endif
++
++define PyPackage
++
++ # Add default PyPackage filespec none defined
++ ifndef PyPackage/$(1)/filespec
++ define PyPackage/$(1)/filespec
++ +|$(PYTHON_PKG_DIR)
++ endef
++ endif
++
++ $(call shexport,PyPackage/$(1)/filespec)
++
++ define Package/$(1)/install
++ find $(PKG_INSTALL_DIR) -name "*\.pyc" -o -name "*\.pyo" | xargs rm -f
++ @echo "$$$$$$$$$$(call shvar,PyPackage/$(1)/filespec)" | ( \
++ IFS='|'; \
++ while read fop fspec fperm; do \
++ fop=`echo "$$$$$$$$fop" | tr -d ' \t\n'`; \
++ if [ "$$$$$$$$fop" = "+" ]; then \
++ if [ ! -e "$(PKG_INSTALL_DIR)$$$$$$$$fspec" ]; then \
++ echo "File not found '$(PKG_INSTALL_DIR)$$$$$$$$fspec'"; \
++ exit 1; \
++ fi; \
++ dpath=`dirname "$$$$$$$$fspec"`; \
++ if [ -n "$$$$$$$$fperm" ]; then \
++ dperm="-m$$$$$$$$fperm"; \
++ else \
++ dperm=`stat -c "%a" $(PKG_INSTALL_DIR)$$$$$$$$dpath`; \
++ fi; \
++ mkdir -p $$$$$$$$$dperm $$(1)$$$$$$$$dpath; \
++ echo "copying: '$$$$$$$$fspec'"; \
++ cp -fpR $(PKG_INSTALL_DIR)$$$$$$$$fspec $$(1)$$$$$$$$dpath/; \
++ if [ -n "$$$$$$$$fperm" ]; then \
++ chmod -R $$$$$$$$fperm $$(1)$$$$$$$$fspec; \
++ fi; \
++ elif [ "$$$$$$$$fop" = "-" ]; then \
++ echo "removing: '$$$$$$$$fspec'"; \
++ rm -fR $$(1)$$$$$$$$fspec; \
++ elif [ "$$$$$$$$fop" = "=" ]; then \
++ echo "setting permissions: '$$$$$$$$fperm' on '$$$$$$$$fspec'"; \
++ chmod -R $$$$$$$$fperm $$(1)$$$$$$$$fspec; \
++ fi; \
++ done; \
++ )
++ $(call PyPackage/$(1)/install,$$(1))
++ endef
++endef
++
++# $(1) => build subdir
++# $(2) => additional arguments to setup.py
++# $(3) => additional variables
++define Build/Compile/PyMod
++ $(INSTALL_DIR) $(PKG_INSTALL_DIR)/$(PYTHON_PKG_DIR)
++ $(call HostPython, \
++ cd $(PKG_BUILD_DIR)/$(strip $(1)); \
++ CC="$(TARGET_CC)" \
++ CCSHARED="$(TARGET_CC) $(FPIC)" \
++ CXX="$(TARGET_CXX)" \
++ LD="$(TARGET_CC)" \
++ LDSHARED="$(TARGET_CC) -shared" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ CPPFLAGS="$(TARGET_CPPFLAGS) -I$(PYTHON_INC_DIR)" \
++ LDFLAGS="$(TARGET_LDFLAGS) -lpython$(PYTHON_VERSION)" \
++ _PYTHON_HOST_PLATFORM=linux2 \
++ __PYVENV_LAUNCHER__="/usr/bin/$(PYTHON)" \
++ $(3) \
++ , \
++ ./setup.py $(2) \
++ )
++ find $(PKG_INSTALL_DIR) -name "*\.pyc" -o -name "*\.pyo" | xargs rm -f
++endef
++
+diff --git a/feeds/packages/lang/python/patches/001-enable-zlib.patch b/feeds/packages/lang/python/patches/001-enable-zlib.patch
+new file mode 100644
+index 0000000..780831e
+--- /dev/null
++++ b/feeds/packages/lang/python/patches/001-enable-zlib.patch
+@@ -0,0 +1,25 @@
++From 6eeab87bc852481e599325549c854b701bf2e39f Mon Sep 17 00:00:00 2001
++From: Alexandru Ardelean <aa@ocedo.com>
++Date: Thu, 25 Sep 2014 18:18:29 +0300
++Subject: [PATCH] enable zlib
++
++---
++ Modules/Setup.dist | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/Modules/Setup.dist b/Modules/Setup.dist
++index 01fb85f..01ac492 100644
++--- a/Modules/Setup.dist
+++++ b/Modules/Setup.dist
++@@ -358,7 +358,7 @@ _symtable symtablemodule.c
++ # Andrew Kuchling's zlib module.
++ # This require zlib 1.1.3 (or later).
++ # See http://www.gzip.org/zlib/
++-#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
+++zlib zlibmodule.c -lz
++
++ # Interface to the Expat XML parser
++ #
++--
++1.8.4.5
++
+diff --git a/feeds/packages/lang/python/patches/002-do-not-add-include-dirs-when-cross-compiling.patch b/feeds/packages/lang/python/patches/002-do-not-add-include-dirs-when-cross-compiling.patch
+new file mode 100644
+index 0000000..fb2fe8a
+--- /dev/null
++++ b/feeds/packages/lang/python/patches/002-do-not-add-include-dirs-when-cross-compiling.patch
+@@ -0,0 +1,14 @@
++diff --git a/setup.py b/setup.py
++index cbdeaf3..5154412 100644
++--- a/setup.py
+++++ b/setup.py
++@@ -480,7 +480,8 @@ class PyBuildExt(build_ext):
++ add_dir_to_list(dir_list, directory)
++
++ if os.path.normpath(sys.prefix) != '/usr' \
++- and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
+++ and not sysconfig.get_config_var('PYTHONFRAMEWORK') \
+++ and not cross_compiling:
++ # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
++ # (PYTHONFRAMEWORK is set) to avoid # linking problems when
++ # building a framework with different architectures than
+diff --git a/feeds/packages/lang/python/patches/003-do-not-compile-tests-at-build.patch b/feeds/packages/lang/python/patches/003-do-not-compile-tests-at-build.patch
+new file mode 100644
+index 0000000..a6774e1
+--- /dev/null
++++ b/feeds/packages/lang/python/patches/003-do-not-compile-tests-at-build.patch
+@@ -0,0 +1,20 @@
++diff --git a/Makefile.pre.in b/Makefile.pre.in
++index 7f4ec2f..e270bf2 100644
++--- a/Makefile.pre.in
+++++ b/Makefile.pre.in
++@@ -1038,6 +1038,7 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c
++ done; \
++ done
++ $(INSTALL_DATA) $(srcdir)/LICENSE $(DESTDIR)$(LIBDEST)/LICENSE.txt
+++ifeq (@COMPILE_ALL_TESTS@,yes)
++ if test -d $(DESTDIR)$(LIBDEST)/distutils/tests; then \
++ $(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \
++ $(DESTDIR)$(LIBDEST)/distutils/tests ; \
++@@ -1064,6 +1065,7 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c
++ $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
++ -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++ $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
+++endif
++
++ # Create the PLATDIR source directory, if one wasn't distributed..
++ $(srcdir)/Lib/$(PLATDIR):
+diff --git a/feeds/packages/lang/python/patches/004-do-not-write-bytes-codes.patch b/feeds/packages/lang/python/patches/004-do-not-write-bytes-codes.patch
+new file mode 100644
+index 0000000..f67e7dc
+--- /dev/null
++++ b/feeds/packages/lang/python/patches/004-do-not-write-bytes-codes.patch
+@@ -0,0 +1,22 @@
++diff --git a/Python/pythonrun.c b/Python/pythonrun.c
++index 748a63b..cb6e291 100644
++--- a/Python/pythonrun.c
+++++ b/Python/pythonrun.c
++@@ -79,7 +79,7 @@ int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
++ int Py_InspectFlag; /* Needed to determine whether to exit at SystemExit */
++ int Py_NoSiteFlag; /* Suppress 'import site' */
++ int Py_BytesWarningFlag; /* Warn on str(bytes) and str(buffer) */
++-int Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.py[co]) */
+++int Py_DontWriteBytecodeFlag = 1; /* Suppress writing bytecode files (*.py[co]) */
++ int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
++ int Py_FrozenFlag; /* Needed by getpath.c */
++ int Py_UnicodeFlag = 0; /* Needed by compile.c */
++@@ -174,7 +174,7 @@ Py_InitializeEx(int install_sigs)
++ if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
++ Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
++ if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0')
++- Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p);
+++ Py_DontWriteBytecodeFlag = atoi(p);
++ /* The variable is only tested for existence here; _PyRandom_Init will
++ check its value further. */
++ if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0')
+diff --git a/feeds/packages/lang/python/patches/005-fix-libffi-x86-64-configure.patch b/feeds/packages/lang/python/patches/005-fix-libffi-x86-64-configure.patch
+new file mode 100644
+index 0000000..ea062a3
+--- /dev/null
++++ b/feeds/packages/lang/python/patches/005-fix-libffi-x86-64-configure.patch
+@@ -0,0 +1,31 @@
++diff --git a/Modules/_ctypes/libffi/configure b/Modules/_ctypes/libffi/configure
++index 75f62a7..4d6c9f2 100755
++--- a/Modules/_ctypes/libffi/configure
+++++ b/Modules/_ctypes/libffi/configure
++@@ -17257,20 +17257,12 @@ case "$host" in
++ fi
++ ;;
++
++- i?86-*-* | x86_64-*-*)
++- TARGETDIR=x86
++- if test $ac_cv_sizeof_size_t = 4; then
++- case "$host" in
++- *-gnux32)
++- TARGET=X86_64
++- ;;
++- *)
++- TARGET=X86
++- ;;
++- esac
++- else
++- TARGET=X86_64;
++- fi
+++ i?86-*-*)
+++ TARGET=X86; TARGETDIR=x86
+++ ;;
+++
+++ x86_64-*-*)
+++ TARGET=X86_64; TARGETDIR=x86
++ ;;
++
++ ia64*-*-*)
+diff --git a/feeds/packages/lang/python/patches/006-remove-debian-multiarch-support.patch b/feeds/packages/lang/python/patches/006-remove-debian-multiarch-support.patch
+new file mode 100644
+index 0000000..01aa924
+--- /dev/null
++++ b/feeds/packages/lang/python/patches/006-remove-debian-multiarch-support.patch
+@@ -0,0 +1,14 @@
++diff --git a/setup.py b/setup.py
++index 1d1ae72..511aed5 100644
++--- a/setup.py
+++++ b/setup.py
++@@ -444,7 +444,8 @@ class PyBuildExt(build_ext):
++ add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
++ if cross_compiling:
++ self.add_gcc_paths()
++- self.add_multiarch_paths()
+++ else:
+++ self.add_multiarch_paths()
++
++ # Add paths specified in the environment variables LDFLAGS and
++ # CPPFLAGS for header and library files.
+diff --git a/feeds/packages/lang/python/patches/007-distutils-do-not-adjust-path.patch b/feeds/packages/lang/python/patches/007-distutils-do-not-adjust-path.patch
+new file mode 100644
+index 0000000..49fe926
+--- /dev/null
++++ b/feeds/packages/lang/python/patches/007-distutils-do-not-adjust-path.patch
+@@ -0,0 +1,10 @@
++--- a/Lib/distutils/command/build_scripts.py
+++++ b/Lib/distutils/command/build_scripts.py
++@@ -89,6 +89,7 @@ class build_scripts (Command):
++ adjust = 1
++ post_interp = match.group(1) or ''
++
+++ adjust = 0
++ if adjust:
++ log.info("copying and adjusting %s -> %s", script,
++ self.build_dir)
+diff --git a/feeds/packages/lang/python/patches/008-distutils-use-python-sysroot.patch b/feeds/packages/lang/python/patches/008-distutils-use-python-sysroot.patch
+new file mode 100644
+index 0000000..7cd7487
+--- /dev/null
++++ b/feeds/packages/lang/python/patches/008-distutils-use-python-sysroot.patch
+@@ -0,0 +1,54 @@
++Adjust library/header paths for cross-compilation
++
++When cross-compiling third-party extensions, the get_python_inc() or
++get_python_lib() can be called, to return the path to headers or
++libraries. However, they use the sys.prefix of the host Python, which
++returns incorrect paths when cross-compiling (paths pointing to host
++headers and libraries).
++
++In order to fix this, we introduce the _python_sysroot, _python_prefix
++and _python_exec_prefix variables, that allow to override these
++values, and get correct header/library paths when cross-compiling
++third-party Python modules.
++
++The _python_sysroot variable is also used to prefix the LIBDIR value
++taken from the sysconfigdata module.
++
++Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
++
++Index: b/Lib/distutils/sysconfig.py
++===================================================================
++--- a/Lib/distutils/sysconfig.py
+++++ b/Lib/distutils/sysconfig.py
++@@ -19,8 +19,13 @@
++ from distutils.errors import DistutilsPlatformError
++
++ # These are needed in a couple of spots, so just compute them once.
++-PREFIX = os.path.normpath(sys.prefix)
++-EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
+++if "_python_sysroot" in os.environ:
+++ _sysroot=os.environ.get('_python_sysroot')
+++ PREFIX = os.path.normpath(_sysroot + os.environ.get('_python_prefix'))
+++ EXEC_PREFIX = os.path.normpath(_sysroot + os.environ.get('_python_exec_prefix'))
+++else:
+++ PREFIX = os.path.normpath(sys.prefix)
+++ EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
++
++ # Path to the base directory of the project. On Windows the binary may
++ # live in project/PCBuild9. If we're dealing with an x64 Windows build,
++Index: b/Lib/distutils/command/build_ext.py
++===================================================================
++--- a/Lib/distutils/command/build_ext.py
+++++ b/Lib/distutils/command/build_ext.py
++@@ -237,7 +237,10 @@
++ if (sysconfig.get_config_var('Py_ENABLE_SHARED')):
++ if not sysconfig.python_build:
++ # building third party extensions
++- self.library_dirs.append(sysconfig.get_config_var('LIBDIR'))
+++ libdir = sysconfig.get_config_var('LIBDIR')
+++ if "_python_sysroot" in os.environ:
+++ libdir = os.environ.get("_python_sysroot") + libdir
+++ self.library_dirs.append(libdir)
++ else:
++ # building python standard extensions
++ self.library_dirs.append('.')
+diff --git a/feeds/packages/lang/python/patches/009-do-not-use-dblib_dir-when-cross-compiling.patch b/feeds/packages/lang/python/patches/009-do-not-use-dblib_dir-when-cross-compiling.patch
+new file mode 100644
+index 0000000..b598097
+--- /dev/null
++++ b/feeds/packages/lang/python/patches/009-do-not-use-dblib_dir-when-cross-compiling.patch
+@@ -0,0 +1,34 @@
++diff --git a/setup.py b/setup.py
++index 7868b7b..10ec68f 100644
++--- a/setup.py
+++++ b/setup.py
++@@ -1067,6 +1067,7 @@ class PyBuildExt(build_ext):
++ if db_setup_debug: print "db lib: ", dblib, "not found"
++
++ except db_found:
+++ rt_dblib_dir = None if cross_compiling else dblib_dir
++ if db_setup_debug:
++ print "bsddb using BerkeleyDB lib:", db_ver, dblib
++ print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
++@@ -1081,7 +1082,7 @@ class PyBuildExt(build_ext):
++ exts.append(Extension('_bsddb', ['_bsddb.c'],
++ depends = ['bsddb.h'],
++ library_dirs=dblib_dir,
++- runtime_library_dirs=dblib_dir,
+++ runtime_library_dirs=rt_dblib_dir,
++ include_dirs=db_incs,
++ libraries=dblibs))
++ else:
++@@ -1292,10 +1293,11 @@ class PyBuildExt(build_ext):
++ break
++ elif cand == "bdb":
++ if db_incs is not None:
+++ rt_dblib_dir = None if cross_compiling else dblib_dir
++ print "building dbm using bdb"
++ dbmext = Extension('dbm', ['dbmmodule.c'],
++ library_dirs=dblib_dir,
++- runtime_library_dirs=dblib_dir,
+++ runtime_library_dirs=rt_dblib_dir,
++ include_dirs=db_incs,
++ define_macros=[
++ ('HAVE_BERKDB_H', None),
+diff --git a/feeds/packages/lang/python/patches/010-do-not-add-rt-lib-dirs-when-cross-compiling.patch b/feeds/packages/lang/python/patches/010-do-not-add-rt-lib-dirs-when-cross-compiling.patch
+new file mode 100644
+index 0000000..5a106d4
+--- /dev/null
++++ b/feeds/packages/lang/python/patches/010-do-not-add-rt-lib-dirs-when-cross-compiling.patch
+@@ -0,0 +1,15 @@
++diff --git a/setup.py b/setup.py
++index 7868b7b..544fa7e 100644
++--- a/setup.py
+++++ b/setup.py
++@@ -452,8 +452,9 @@ class PyBuildExt(build_ext):
++ # directly since an inconsistently reproducible issue comes up where
++ # the environment variable is not set even though the value were passed
++ # into configure and stored in the Makefile (issue found on OS X 10.3).
+++ rt_lib_dirs = [] if cross_compiling else self.compiler.runtime_library_dirs
++ for env_var, arg_name, dir_list in (
++- ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
+++ ('LDFLAGS', '-R', rt_lib_dirs),
++ ('LDFLAGS', '-L', self.compiler.library_dirs),
++ ('CPPFLAGS', '-I', self.compiler.include_dirs)):
++ env_val = sysconfig.get_config_var(env_var)
+diff --git a/feeds/packages/lang/python/patches/011-do-not-prefer-ncursesw.patch b/feeds/packages/lang/python/patches/011-do-not-prefer-ncursesw.patch
+new file mode 100644
+index 0000000..c5f323c
+--- /dev/null
++++ b/feeds/packages/lang/python/patches/011-do-not-prefer-ncursesw.patch
+@@ -0,0 +1,15 @@
++diff --git a/setup.py b/setup.py
++index 7868b7b..86b0119 100644
++--- a/setup.py
+++++ b/setup.py
++@@ -725,8 +725,8 @@ class PyBuildExt(build_ext):
++ # use the same library for the readline and curses modules.
++ if 'curses' in readline_termcap_library:
++ curses_library = readline_termcap_library
++- elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
++- curses_library = 'ncursesw'
+++ #elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
+++ # curses_library = 'ncursesw'
++ elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
++ curses_library = 'ncurses'
++ elif self.compiler.find_library_file(lib_dirs, 'curses'):
+diff --git a/feeds/packages/lang/python3-bottle/Makefile b/feeds/packages/lang/python3-bottle/Makefile
+new file mode 100644
+index 0000000..b69d851
+--- /dev/null
++++ b/feeds/packages/lang/python3-bottle/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=python3-bottle
++PKG_VERSION:=0.12.8
++PKG_RELEASE:=1
++
++PKG_LICENSE:=MIT
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_SOURCE:=$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/bottlepy/bottle/archive
++PKG_MD5SUM:=50a6ebada59391e8d01b2bd2ec52f05b
++PKG_BUILD_DIR:=$(BUILD_DIR)/bottle-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python3-package.mk)
++
++define Package/python3-bottle
++ SECTION:=lang
++ CATEGORY:=Languages
++ SUBMENU:=Python
++ TITLE:=Bottle is a fast, simple and lightweight WSGI micro web-framework for Python
++ URL:=http://bottlepy.org
++ DEPENDS:=+python3
++endef
++
++define Package/python3-bottle/description
++ Bottle is a fast, simple and lightweight WSGI micro web-framework for Python.
++ It is distributed as a single file module and has no dependencies other than the
++ Python Standard Library.
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/python3-bottle/install
++ $(INSTALL_DIR) $(1)$(PYTHON3_PKG_DIR)
++ $(CP) $(PKG_BUILD_DIR)/bottle.py $(1)$(PYTHON3_PKG_DIR)
++endef
++
++$(eval $(call BuildPackage,python3-bottle))
+diff --git a/feeds/packages/lang/python3/Makefile b/feeds/packages/lang/python3/Makefile
+new file mode 100644
+index 0000000..fa3d6e6
+--- /dev/null
++++ b/feeds/packages/lang/python3/Makefile
+@@ -0,0 +1,252 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++# The file included below defines PYTHON_VERSION
++include ./files/python3-package.mk
++
++PYTHON_VERSION:=$(PYTHON3_VERSION)
++PYTHON_VERSION_MICRO:=$(PYTHON3_VERSION_MICRO)
++
++PKG_NAME:=python3
++PKG_RELEASE:=1
++PKG_VERSION:=$(PYTHON_VERSION).$(PYTHON_VERSION_MICRO)
++
++PKG_SOURCE:=Python-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.python.org/ftp/python/$(PKG_VERSION)
++PKG_MD5SUM:=d149d2812f10cbe04c042232e7964171
++
++PKG_LICENSE:=PSF
++PKG_LICENSE_FILES:=LICENSE Modules/_ctypes/libffi_msvc/LICENSE Modules/_ctypes/darwin/LICENSE Modules/_ctypes/libffi/LICENSE Modules/_ctypes/libffi_osx/LICENSE Tools/pybench/LICENSE
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++HOST_BUILD_PARALLEL:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/Python-$(PKG_VERSION)
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/Python-$(PKG_VERSION)
++
++PKG_BUILD_DEPENDS:=libbz2/host expat/host python3/host
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/python3/Default
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Python $(PYTHON_VERSION) programming language
++ URL:=http://www.python.org/
++ MAINTAINER:=Alexandru Ardelean <ardeleanalex@gmail.com>
++endef
++
++define Package/python3/Default/description
++ Python is a dynamic object-oriented programming language that can be used
++ for many kinds of software development. It offers strong support for
++ integration with other languages and tools, comes with extensive standard
++ libraries, and can be learned in a few days. Many Python programmers
++ report substantial productivity gains and feel the language encourages
++ the development of higher quality, more maintainable code.
++endef
++
++define Package/python3-base
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON_VERSION) interpreter
++ DEPENDS:=+libpthread +zlib
++endef
++
++define Package/python3-base/description
++ This package contains only the interpreter and the bare minimum
++ for the interpreter to start.
++endef
++
++define Package/python3-light
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON_VERSION) light installation
++ DEPENDS:=+python3-base +libffi +libbz2
++endef
++
++define Package/python3-light/description
++ This package is essentially the python3-base package plus
++ a few of the rarely used (and big) libraries stripped out
++ into separate packages.
++endef
++
++PYTHON3_LIB_FILES_DEL:=
++PYTHON3_PACKAGES:=
++PYTHON3_SO_SUFFIX:=cpython-$(PYTHON3_VERSION_MAJOR)$(PYTHON3_VERSION_MINOR).so
++define Py3BasePackage
++ PYTHON3_PACKAGES+=$(1)
++ PYTHON3_LIB_FILES_DEL+=$(2)
++ define Py3Package/$(1)/filespec
++ $(subst $(space),$(newline),$(foreach lib_file,$(2),+|$(lib_file)))
++ endef
++endef
++
++include ./files/python3-package-*.mk
++
++define Package/python3
++$(call Package/python3/Default)
++ DEPENDS:=+python3-light $(foreach package,$(PYTHON3_PACKAGES),+$(package))
++endef
++
++define Package/python3/description
++ This package contains the (almost) full Python install.
++ It's python3-light + all other packages.
++endef
++
++MAKE_FLAGS+=\
++ CROSS_COMPILE=yes \
++ LD="$(TARGET_CC)" \
++ FREEZE_IMPORTLIB=_freeze_importlib \
++ PGEN=pgen3
++
++ifeq ($(ARCH),i386)
++MAKE_FLAGS+=PYTHON_DECIMAL_WITH_MACHINE=ansi32
++endif
++
++EXTRA_CFLAGS+= \
++ -DNDEBUG -fno-inline
++EXTRA_LDFLAGS+= \
++ -L$(PKG_BUILD_DIR)
++
++ENABLE_IPV6:=
++ifeq ($(CONFIG_IPV6),y)
++ ENABLE_IPV6 += --enable-ipv6
++endif
++
++CONFIGURE_ARGS+= \
++ --sysconfdir=/etc \
++ --enable-shared \
++ --without-cxx-main \
++ --with-threads \
++ --with-system-ffi="$(STAGING_DIR)/usr" \
++ --without-pymalloc \
++ --without-ensurepip \
++ $(ENABLE_IPV6) \
++ CONFIG_SITE="$(PKG_BUILD_DIR)/config.site" \
++ OPT="$(TARGET_CFLAGS)"
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ $(CP) ./files/config.site $(PKG_BUILD_DIR)/config.site
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(STAGING_DIR)/mk/
++ $(INSTALL_DIR) $(1)/usr/include/ $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/python$(PYTHON_VERSION)/
++ $(INSTALL_DATA) ./files/python3-package.mk $(STAGING_DIR)/mk/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/python$(PYTHON_VERSION) \
++ $(1)/usr/include/
++ $(CP) \
++ $(STAGING_DIR_HOST)/lib/python$(PYTHON_VERSION) \
++ $(PKG_INSTALL_DIR)/usr/lib/libpython$(PYTHON_VERSION).so* \
++ $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/python$(PYTHON_VERSION)/config-$(PYTHON_VERSION) \
++ $(1)/usr/lib/python$(PYTHON_VERSION)/
++endef
++
++PYTHON3_BASE_LIB_FILES:= \
++ /usr/lib/python$(PYTHON_VERSION)/encodings \
++ /usr/lib/python$(PYTHON_VERSION)/_collections_abc.py \
++ /usr/lib/python$(PYTHON_VERSION)/_sitebuiltins.py \
++ /usr/lib/python$(PYTHON_VERSION)/_sysconfigdata.py \
++ /usr/lib/python$(PYTHON_VERSION)/_weakrefset.py \
++ /usr/lib/python$(PYTHON_VERSION)/abc.py \
++ /usr/lib/python$(PYTHON_VERSION)/codecs.py \
++ /usr/lib/python$(PYTHON_VERSION)/genericpath.py \
++ /usr/lib/python$(PYTHON_VERSION)/io.py \
++ /usr/lib/python$(PYTHON_VERSION)/os.py \
++ /usr/lib/python$(PYTHON_VERSION)/posixpath.py \
++ /usr/lib/python$(PYTHON_VERSION)/site.py \
++ /usr/lib/python$(PYTHON_VERSION)/sysconfig.py \
++ /usr/lib/python$(PYTHON_VERSION)/stat.py
++
++PYTHON3_LIB_FILES_DEL+=$(PYTHON3_BASE_LIB_FILES)
++
++define Py3Package/python3-base/filespec
+++|/usr/bin/python$(PYTHON_VERSION)
++$(subst $(space),$(newline),$(foreach lib_file,$(PYTHON3_BASE_LIB_FILES),+|$(lib_file)))
++endef
++
++define Py3Package/python3-light/filespec
+++|/usr/lib/python$(PYTHON_VERSION)
++-|/usr/lib/python$(PYTHON_VERSION)/config-$(PYTHON_VERSION)
++-|/usr/lib/python$(PYTHON_VERSION)/distutils/cygwinccompiler.py
++-|/usr/lib/python$(PYTHON_VERSION)/distutils/command/wininst*
++-|/usr/lib/python$(PYTHON_VERSION)/ensurepip
++-|/usr/lib/python$(PYTHON_VERSION)/idlelib
++-|/usr/lib/python$(PYTHON_VERSION)/lib2to3
++-|/usr/lib/python$(PYTHON_VERSION)/tkinter
++-|/usr/lib/python$(PYTHON_VERSION)/turtledemo
++-|/usr/lib/python$(PYTHON_VERSION)/lib-dynload/_test*.so
++-|/usr/lib/python$(PYTHON_VERSION)/lib-dynload/readline*.so
++-|/usr/lib/python$(PYTHON_VERSION)/pdb.doc
++-|/usr/lib/python$(PYTHON_VERSION)/test
++-|/usr/lib/python$(PYTHON_VERSION)/webbrowser.py
++-|/usr/lib/python$(PYTHON_VERSION)/*/test
++-|/usr/lib/python$(PYTHON_VERSION)/*/tests
++-|/usr/lib/python$(PYTHON_VERSION)/_osx_support.py
++$(subst $(space),$(newline),$(foreach lib_file,$(PYTHON3_LIB_FILES_DEL),-|$(lib_file)))
++endef
++
++define Py3Package/python3-base/install
++ # Adding the lib-dynload folder (even just empty) suppresses 2 warnings when starting Python
++ $(INSTALL_DIR) $(1)/usr/lib/python$(PYTHON_VERSION)/lib-dynload/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(LN) python$(PYTHON_VERSION) $(1)/usr/bin/python3
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpython$(PYTHON_VERSION).so* $(1)/usr/lib/
++endef
++
++define Py3Package/python3/filespec
++-|$(PYTHON3_PKG_DIR)
++endef
++
++HOST_CFLAGS+= \
++ -I/usr/include/ncursesw \
++ -I/usr/include/ncurses
++
++HOST_CONFIGURE_ARGS+= \
++ --without-cxx-main \
++ --without-pymalloc \
++ --with-threads \
++ --prefix=$(STAGING_DIR_HOST) \
++ --with-system-expat=$(STAGING_DIR_HOST) \
++ --with-ensurepip=upgrade \
++ CONFIG_SITE= \
++ CFLAGS="$(HOST_CFLAGS)"
++
++define Host/Compile
++ +$(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR) python Parser/pgen
++ +$(MAKE) $(HOST_JOBS) -C $(HOST_BUILD_DIR) sharedmods
++endef
++
++define Host/Install
++ $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin/
++ $(MAKE) -C $(HOST_BUILD_DIR) install
++ $(INSTALL_BIN) $(HOST_BUILD_DIR)/Parser/pgen $(STAGING_DIR_HOST)/bin/pgen3
++ $(INSTALL_BIN) $(HOST_BUILD_DIR)/Programs/_freeze_importlib $(STAGING_DIR_HOST)/bin/_freeze_importlib
++endef
++
++$(eval $(call HostBuild))
++
++$(foreach package, $(PYTHON3_PACKAGES), \
++ $(eval $(call Py3Package,$(package))) \
++ $(eval $(call BuildPackage,$(package))) \
++)
++
++$(eval $(call Py3Package,python3-base))
++$(eval $(call Py3Package,python3-light))
++$(eval $(call Py3Package,python3))
++
++$(eval $(call BuildPackage,python3-base))
++$(eval $(call BuildPackage,python3-light))
++$(eval $(call BuildPackage,python3))
+diff --git a/feeds/packages/lang/python3/files/config.site b/feeds/packages/lang/python3/files/config.site
+new file mode 100644
+index 0000000..cfa56b8
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/config.site
+@@ -0,0 +1,12 @@
++#! /bin/sh
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++ac_cv_file__dev_ptmx=yes
++ac_cv_file__dev_ptc=no
++ac_cv_buggy_getaddrinfo=no
++
+diff --git a/feeds/packages/lang/python3/files/python3-package-asyncio.mk b/feeds/packages/lang/python3/files/python3-package-asyncio.mk
+new file mode 100644
+index 0000000..1d2faab
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-asyncio.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-asyncio
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) asyncio module
++ DEPENDS:=+python3-light
++endef
++
++$(eval $(call Py3BasePackage,python3-asyncio, \
++ /usr/lib/python$(PYTHON3_VERSION)/asyncio \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-codecs.mk b/feeds/packages/lang/python3/files/python3-package-codecs.mk
+new file mode 100644
+index 0000000..66101e1
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-codecs.mk
+@@ -0,0 +1,22 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-codecs
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) codecs + unicode support
++ DEPENDS:=+python3-light
++endef
++
++$(eval $(call Py3BasePackage,python3-codecs, \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_codecs_cn.$(PYTHON3_SO_SUFFIX) \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_codecs_hk.$(PYTHON3_SO_SUFFIX) \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_codecs_iso2022.$(PYTHON3_SO_SUFFIX) \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_codecs_jp.$(PYTHON3_SO_SUFFIX) \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_codecs_kr.$(PYTHON3_SO_SUFFIX) \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_codecs_tw.$(PYTHON3_SO_SUFFIX) \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/unicodedata.$(PYTHON3_SO_SUFFIX) \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-ctypes.mk b/feeds/packages/lang/python3/files/python3-package-ctypes.mk
+new file mode 100644
+index 0000000..97c2c76
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-ctypes.mk
+@@ -0,0 +1,18 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-ctypes
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) ctypes module
++ DEPENDS:=+python3-light
++endef
++
++$(eval $(call Py3BasePackage,python3-ctypes, \
++ /usr/lib/python$(PYTHON3_VERSION)/ctypes \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_ctypes.$(PYTHON3_SO_SUFFIX) \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_ctypes_test.$(PYTHON3_SO_SUFFIX) \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-dbm.mk b/feeds/packages/lang/python3/files/python3-package-dbm.mk
+new file mode 100644
+index 0000000..ed343d8
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-dbm.mk
+@@ -0,0 +1,17 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-dbm
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) dbm module
++ DEPENDS:=+python3-light +libdb47
++endef
++
++$(eval $(call Py3BasePackage,python3-dbm, \
++ /usr/lib/python$(PYTHON3_VERSION)/dbm \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_dbm.$(PYTHON3_SO_SUFFIX) \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-decimal.mk b/feeds/packages/lang/python3/files/python3-package-decimal.mk
+new file mode 100644
+index 0000000..81ecbb0
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-decimal.mk
+@@ -0,0 +1,17 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-decimal
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) decimal module
++ DEPENDS:=+python3-light
++endef
++
++$(eval $(call Py3BasePackage,python3-decimal, \
++ /usr/lib/python$(PYTHON3_VERSION)/decimal.py \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_decimal.$(PYTHON3_SO_SUFFIX) \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-distutils.mk b/feeds/packages/lang/python3/files/python3-package-distutils.mk
+new file mode 100644
+index 0000000..65f4b5a
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-distutils.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-distutils
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) distutils module
++ DEPENDS:=+python3-light
++endef
++
++$(eval $(call Py3BasePackage,python3-distutils, \
++ /usr/lib/python$(PYTHON3_VERSION)/distutils \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-email.mk b/feeds/packages/lang/python3/files/python3-package-email.mk
+new file mode 100644
+index 0000000..dae3519
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-email.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-email
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) email module
++ DEPENDS:=+python3-light
++endef
++
++$(eval $(call Py3BasePackage,python3-email, \
++ /usr/lib/python$(PYTHON3_VERSION)/email \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-gdbm.mk b/feeds/packages/lang/python3/files/python3-package-gdbm.mk
+new file mode 100644
+index 0000000..cc92913
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-gdbm.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-gdbm
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) gdbm module
++ DEPENDS:=+python3-light +libgdbm
++endef
++
++$(eval $(call Py3BasePackage,python3-gdbm, \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_gdbm.$(PYTHON3_SO_SUFFIX) \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-logging.mk b/feeds/packages/lang/python3/files/python3-package-logging.mk
+new file mode 100644
+index 0000000..4cd6ea9
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-logging.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-logging
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) logging module
++ DEPENDS:=+python3-light
++endef
++
++$(eval $(call Py3BasePackage,python3-logging, \
++ /usr/lib/python$(PYTHON3_VERSION)/logging \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-lzma.mk b/feeds/packages/lang/python3/files/python3-package-lzma.mk
+new file mode 100644
+index 0000000..b04f072
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-lzma.mk
+@@ -0,0 +1,17 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-lzma
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) lzma module
++ DEPENDS:=+python3-light +liblzma
++endef
++
++$(eval $(call Py3BasePackage,python3-lzma, \
++ /usr/lib/python$(PYTHON3_VERSION)/lzma.py \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_lzma.$(PYTHON3_SO_SUFFIX) \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-multiprocessing.mk b/feeds/packages/lang/python3/files/python3-package-multiprocessing.mk
+new file mode 100644
+index 0000000..784aabb
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-multiprocessing.mk
+@@ -0,0 +1,17 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-multiprocessing
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) multiprocessing
++ DEPENDS:=+python3-light
++endef
++
++$(eval $(call Py3BasePackage,python3-multiprocessing, \
++ /usr/lib/python$(PYTHON3_VERSION)/multiprocessing \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_multiprocessing.$(PYTHON3_SO_SUFFIX) \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-ncurses.mk b/feeds/packages/lang/python3/files/python3-package-ncurses.mk
+new file mode 100644
+index 0000000..7e703b3
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-ncurses.mk
+@@ -0,0 +1,18 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-ncurses
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) ncurses module
++ DEPENDS:=+python3-light +libncurses
++endef
++
++$(eval $(call Py3BasePackage,python3-ncurses, \
++ /usr/lib/python$(PYTHON3_VERSION)/curses \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_curses.$(PYTHON3_SO_SUFFIX) \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_curses_panel.$(PYTHON3_SO_SUFFIX) \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-openssl.mk b/feeds/packages/lang/python3/files/python3-package-openssl.mk
+new file mode 100644
+index 0000000..255d580
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-openssl.mk
+@@ -0,0 +1,17 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-openssl
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) SSL module
++ DEPENDS:=+python3-light +libopenssl
++endef
++
++$(eval $(call Py3BasePackage,python3-openssl, \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_hashlib.$(PYTHON3_SO_SUFFIX) \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_ssl.$(PYTHON3_SO_SUFFIX) \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-pydoc.mk b/feeds/packages/lang/python3/files/python3-package-pydoc.mk
+new file mode 100644
+index 0000000..7ed8c21
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-pydoc.mk
+@@ -0,0 +1,18 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-pydoc
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) pydoc module
++ DEPENDS:=+python3-light
++endef
++
++$(eval $(call Py3BasePackage,python3-pydoc, \
++ /usr/lib/python$(PYTHON3_VERSION)/doctest.py \
++ /usr/lib/python$(PYTHON3_VERSION)/pydoc.py \
++ /usr/lib/python$(PYTHON3_VERSION)/pydoc_data \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-sqlite3.mk b/feeds/packages/lang/python3/files/python3-package-sqlite3.mk
+new file mode 100644
+index 0000000..4b097a3
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-sqlite3.mk
+@@ -0,0 +1,17 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-sqlite3
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) sqlite3 module
++ DEPENDS:=+python3-light +libsqlite3
++endef
++
++$(eval $(call Py3BasePackage,python3-sqlite3, \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_sqlite3.$(PYTHON3_SO_SUFFIX) \
++ /usr/lib/python$(PYTHON3_VERSION)/sqlite3 \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-unittest.mk b/feeds/packages/lang/python3/files/python3-package-unittest.mk
+new file mode 100644
+index 0000000..6d3643a
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-unittest.mk
+@@ -0,0 +1,16 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-unittest
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) unittest module
++ DEPENDS:=+python3-light
++endef
++
++$(eval $(call Py3BasePackage,python3-unittest, \
++ /usr/lib/python$(PYTHON3_VERSION)/unittest \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package-xml.mk b/feeds/packages/lang/python3/files/python3-package-xml.mk
+new file mode 100644
+index 0000000..e734f0c
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package-xml.mk
+@@ -0,0 +1,19 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Package/python3-xml
++$(call Package/python3/Default)
++ TITLE:=Python $(PYTHON3_VERSION) xml libs
++ DEPENDS:=+python3-light
++endef
++
++$(eval $(call Py3BasePackage,python3-xml, \
++ /usr/lib/python$(PYTHON3_VERSION)/xml \
++ /usr/lib/python$(PYTHON3_VERSION)/xmlrpc \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_elementtree.$(PYTHON3_SO_SUFFIX) \
++ /usr/lib/python$(PYTHON3_VERSION)/lib-dynload/pyexpat.$(PYTHON3_SO_SUFFIX) \
++))
+diff --git a/feeds/packages/lang/python3/files/python3-package.mk b/feeds/packages/lang/python3/files/python3-package.mk
+new file mode 100644
+index 0000000..37a023e
+--- /dev/null
++++ b/feeds/packages/lang/python3/files/python3-package.mk
+@@ -0,0 +1,112 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++PYTHON3_VERSION_MAJOR:=3
++PYTHON3_VERSION_MINOR:=5
++PYTHON3_VERSION_MICRO:=0
++
++PYTHON3_VERSION:=$(PYTHON3_VERSION_MAJOR).$(PYTHON3_VERSION_MINOR)
++
++PYTHON3_DIR:=$(STAGING_DIR)/usr
++PYTHON3_BIN_DIR:=$(PYTHON3_DIR)/bin
++PYTHON3_INC_DIR:=$(PYTHON3_DIR)/include/python$(PYTHON3_VERSION)
++PYTHON3_LIB_DIR:=$(PYTHON3_DIR)/lib/python$(PYTHON3_VERSION)
++
++PYTHON3_PKG_DIR:=/usr/lib/python$(PYTHON3_VERSION)/site-packages
++
++PYTHON3:=python$(PYTHON3_VERSION)
++
++HOST_PYTHON3_LIB_DIR:=$(STAGING_DIR_HOST)/lib/python$(PYTHON3_VERSION)
++HOST_PYTHON3_BIN:=$(STAGING_DIR_HOST)/bin/python3
++
++PYTHON3PATH:=$(PYTHON3_LIB_DIR):$(STAGING_DIR)/$(PYTHON3_PKG_DIR):$(PKG_INSTALL_DIR)/$(PYTHON3_PKG_DIR)
++define HostPython3
++ ( export PYTHONPATH="$(PYTHON3PATH)"; \
++ export PYTHONOPTIMIZE=""; \
++ export PYTHONDONTWRITEBYTECODE=1; \
++ $(1) \
++ $(HOST_PYTHON3_BIN) $(2); \
++ )
++endef
++
++PKG_USE_MIPS16:=0
++# This is required in addition to PKG_USE_MIPS16:=0 because otherwise MIPS16
++# flags are inherited from the Python base package (via sysconfig module)
++ifdef CONFIG_USE_MIPS16
++ TARGET_CFLAGS += -mno-mips16 -mno-interlink-mips16
++endif
++
++define Py3Package
++
++ # Add default PyPackage filespec none defined
++ ifndef Py3Package/$(1)/filespec
++ define Py3Package/$(1)/filespec
++ +|$(PYTHON3_PKG_DIR)
++ endef
++ endif
++
++ $(call shexport,Py3Package/$(1)/filespec)
++
++ define Package/$(1)/install
++ find $(PKG_INSTALL_DIR) -name "*\.pyc" -o -name "*\.pyo" | xargs rm -f
++ @echo "$$$$$$$$$$(call shvar,Py3Package/$(1)/filespec)" | ( \
++ IFS='|'; \
++ while read fop fspec fperm; do \
++ fop=`echo "$$$$$$$$fop" | tr -d ' \t\n'`; \
++ if [ "$$$$$$$$fop" = "+" ]; then \
++ if [ ! -e "$(PKG_INSTALL_DIR)$$$$$$$$fspec" ]; then \
++ echo "File not found '$(PKG_INSTALL_DIR)$$$$$$$$fspec'"; \
++ exit 1; \
++ fi; \
++ dpath=`dirname "$$$$$$$$fspec"`; \
++ if [ -n "$$$$$$$$fperm" ]; then \
++ dperm="-m$$$$$$$$fperm"; \
++ else \
++ dperm=`stat -c "%a" $(PKG_INSTALL_DIR)$$$$$$$$dpath`; \
++ fi; \
++ mkdir -p $$$$$$$$$dperm $$(1)$$$$$$$$dpath; \
++ echo "copying: '$$$$$$$$fspec'"; \
++ cp -fpR $(PKG_INSTALL_DIR)$$$$$$$$fspec $$(1)$$$$$$$$dpath/; \
++ if [ -n "$$$$$$$$fperm" ]; then \
++ chmod -R $$$$$$$$fperm $$(1)$$$$$$$$fspec; \
++ fi; \
++ elif [ "$$$$$$$$fop" = "-" ]; then \
++ echo "removing: '$$$$$$$$fspec'"; \
++ rm -fR $$(1)$$$$$$$$fspec; \
++ elif [ "$$$$$$$$fop" = "=" ]; then \
++ echo "setting permissions: '$$$$$$$$fperm' on '$$$$$$$$fspec'"; \
++ chmod -R $$$$$$$$fperm $$(1)$$$$$$$$fspec; \
++ fi; \
++ done; \
++ )
++ $(call Py3Package/$(1)/install,$$(1))
++ endef
++endef
++
++# $(1) => build subdir
++# $(2) => additional arguments to setup.py
++# $(3) => additional variables
++define Build/Compile/Py3Mod
++ $(INSTALL_DIR) $(PKG_INSTALL_DIR)/$(PYTHON3_PKG_DIR)
++ $(call HostPython3, \
++ cd $(PKG_BUILD_DIR)/$(strip $(1)); \
++ CC="$(TARGET_CC)" \
++ CCSHARED="$(TARGET_CC) $(FPIC)" \
++ LD="$(TARGET_CC)" \
++ LDSHARED="$(TARGET_CC) -shared" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ CPPFLAGS="$(TARGET_CPPFLAGS) -I$(PYTHON3_INC_DIR)" \
++ LDFLAGS="$(TARGET_LDFLAGS) -lpython$(PYTHON3_VERSION)" \
++ _PYTHON_HOST_PLATFORM=linux2 \
++ __PYVENV_LAUNCHER__="/usr/bin/$(PYTHON3)" \
++ $(3) \
++ , \
++ ./setup.py $(2) \
++ )
++ find $(PKG_INSTALL_DIR) -name "*\.pyc" -o -name "*\.pyo" | xargs rm -f
++endef
++
+diff --git a/feeds/packages/lang/python3/patches/001-enable-zlib.patch b/feeds/packages/lang/python3/patches/001-enable-zlib.patch
+new file mode 100644
+index 0000000..780831e
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/001-enable-zlib.patch
+@@ -0,0 +1,25 @@
++From 6eeab87bc852481e599325549c854b701bf2e39f Mon Sep 17 00:00:00 2001
++From: Alexandru Ardelean <aa@ocedo.com>
++Date: Thu, 25 Sep 2014 18:18:29 +0300
++Subject: [PATCH] enable zlib
++
++---
++ Modules/Setup.dist | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/Modules/Setup.dist b/Modules/Setup.dist
++index 01fb85f..01ac492 100644
++--- a/Modules/Setup.dist
+++++ b/Modules/Setup.dist
++@@ -358,7 +358,7 @@ _symtable symtablemodule.c
++ # Andrew Kuchling's zlib module.
++ # This require zlib 1.1.3 (or later).
++ # See http://www.gzip.org/zlib/
++-#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
+++zlib zlibmodule.c -lz
++
++ # Interface to the Expat XML parser
++ #
++--
++1.8.4.5
++
+diff --git a/feeds/packages/lang/python3/patches/002-do-not-add-include-dirs-when-cross-compiling.patch b/feeds/packages/lang/python3/patches/002-do-not-add-include-dirs-when-cross-compiling.patch
+new file mode 100644
+index 0000000..44be1c8
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/002-do-not-add-include-dirs-when-cross-compiling.patch
+@@ -0,0 +1,14 @@
++diff --git a/setup.py b/setup.py
++index 93f390f..ace1494 100644
++--- a/setup.py
+++++ b/setup.py
++@@ -461,7 +461,8 @@ class PyBuildExt(build_ext):
++ add_dir_to_list(dir_list, directory)
++
++ if os.path.normpath(sys.base_prefix) != '/usr' \
++- and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
+++ and not sysconfig.get_config_var('PYTHONFRAMEWORK') \
+++ and not cross_compiling:
++ # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
++ # (PYTHONFRAMEWORK is set) to avoid # linking problems when
++ # building a framework with different architectures than
+diff --git a/feeds/packages/lang/python3/patches/003-do-not-run-distutils-tests.patch b/feeds/packages/lang/python3/patches/003-do-not-run-distutils-tests.patch
+new file mode 100644
+index 0000000..77c089f
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/003-do-not-run-distutils-tests.patch
+@@ -0,0 +1,46 @@
++diff --git a/Makefile.pre.in b/Makefile.pre.in
++index ce2c0aa..b0c8322 100644
++--- a/Makefile.pre.in
+++++ b/Makefile.pre.in
++@@ -1256,41 +1256,6 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c
++ done; \
++ done
++ $(INSTALL_DATA) $(srcdir)/LICENSE $(DESTDIR)$(LIBDEST)/LICENSE.txt
++- if test -d $(DESTDIR)$(LIBDEST)/distutils/tests; then \
++- $(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \
++- $(DESTDIR)$(LIBDEST)/distutils/tests ; \
++- fi
++- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++- $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
++- -d $(LIBDEST) -f \
++- -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
++- $(DESTDIR)$(LIBDEST)
++- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++- $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
++- -d $(LIBDEST) -f \
++- -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
++- $(DESTDIR)$(LIBDEST)
++- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++- $(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \
++- -d $(LIBDEST) -f \
++- -x 'bad_coding|badsyntax|site-packages|lib2to3/tests/data' \
++- $(DESTDIR)$(LIBDEST)
++- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++- $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
++- -d $(LIBDEST)/site-packages -f \
++- -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
++- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++- $(PYTHON_FOR_BUILD) -Wi -O $(DESTDIR)$(LIBDEST)/compileall.py \
++- -d $(LIBDEST)/site-packages -f \
++- -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
++- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++- $(PYTHON_FOR_BUILD) -Wi -OO $(DESTDIR)$(LIBDEST)/compileall.py \
++- -d $(LIBDEST)/site-packages -f \
++- -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages
++- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++- $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/Grammar.txt
++- -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
++- $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt
++
++ # Create the PLATDIR source directory, if one wasn't distributed..
++ $(srcdir)/Lib/$(PLATDIR):
+diff --git a/feeds/packages/lang/python3/patches/004-do-not-write-bytes-codes.patch b/feeds/packages/lang/python3/patches/004-do-not-write-bytes-codes.patch
+new file mode 100644
+index 0000000..1da7b8b
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/004-do-not-write-bytes-codes.patch
+@@ -0,0 +1,22 @@
++diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
++index a17adf7..415b3f6 100644
++--- a/Python/pylifecycle.c
+++++ b/Python/pylifecycle.c
++@@ -86,7 +86,7 @@ int Py_BytesWarningFlag; /* Warn on str(bytes) and str(buffer) */
++ int Py_UseClassExceptionsFlag = 1; /* Needed by bltinmodule.c: deprecated */
++ int Py_FrozenFlag; /* Needed by getpath.c */
++ int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */
++-int Py_DontWriteBytecodeFlag; /* Suppress writing bytecode files (*.py[co]) */
+++int Py_DontWriteBytecodeFlag = 1; /* Suppress writing bytecode files (*.py[co]) */
++ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */
++ int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */
++ int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */
++@@ -309,7 +309,7 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
++ if ((p = Py_GETENV("PYTHONOPTIMIZE")) && *p != '\0')
++ Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
++ if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0')
++- Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p);
+++ Py_DontWriteBytecodeFlag = atoi(p);
++ /* The variable is only tested for existence here; _PyRandom_Init will
++ check its value further. */
++ if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0')
+diff --git a/feeds/packages/lang/python3/patches/005-fix-libffi-x86-64-configure.patch b/feeds/packages/lang/python3/patches/005-fix-libffi-x86-64-configure.patch
+new file mode 100644
+index 0000000..ea062a3
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/005-fix-libffi-x86-64-configure.patch
+@@ -0,0 +1,31 @@
++diff --git a/Modules/_ctypes/libffi/configure b/Modules/_ctypes/libffi/configure
++index 75f62a7..4d6c9f2 100755
++--- a/Modules/_ctypes/libffi/configure
+++++ b/Modules/_ctypes/libffi/configure
++@@ -17257,20 +17257,12 @@ case "$host" in
++ fi
++ ;;
++
++- i?86-*-* | x86_64-*-*)
++- TARGETDIR=x86
++- if test $ac_cv_sizeof_size_t = 4; then
++- case "$host" in
++- *-gnux32)
++- TARGET=X86_64
++- ;;
++- *)
++- TARGET=X86
++- ;;
++- esac
++- else
++- TARGET=X86_64;
++- fi
+++ i?86-*-*)
+++ TARGET=X86; TARGETDIR=x86
+++ ;;
+++
+++ x86_64-*-*)
+++ TARGET=X86_64; TARGETDIR=x86
++ ;;
++
++ ia64*-*-*)
+diff --git a/feeds/packages/lang/python3/patches/006-remove-debian-multiarch-support.patch b/feeds/packages/lang/python3/patches/006-remove-debian-multiarch-support.patch
+new file mode 100644
+index 0000000..52d52b9
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/006-remove-debian-multiarch-support.patch
+@@ -0,0 +1,12 @@
++diff --git a/setup.py b/setup.py
++index 7868b7b..9ae0ef2 100644
++--- a/setup.py
+++++ b/setup.py
++@@ -444,7 +444,6 @@ class PyBuildExt(build_ext):
++ add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
++ if cross_compiling:
++ self.add_gcc_paths()
++- self.add_multiarch_paths()
++
++ # Add paths specified in the environment variables LDFLAGS and
++ # CPPFLAGS for header and library files.
+diff --git a/feeds/packages/lang/python3/patches/007-distutils-do-not-adjust-path.patch b/feeds/packages/lang/python3/patches/007-distutils-do-not-adjust-path.patch
+new file mode 100644
+index 0000000..49fe926
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/007-distutils-do-not-adjust-path.patch
+@@ -0,0 +1,10 @@
++--- a/Lib/distutils/command/build_scripts.py
+++++ b/Lib/distutils/command/build_scripts.py
++@@ -89,6 +89,7 @@ class build_scripts (Command):
++ adjust = 1
++ post_interp = match.group(1) or ''
++
+++ adjust = 0
++ if adjust:
++ log.info("copying and adjusting %s -> %s", script,
++ self.build_dir)
+diff --git a/feeds/packages/lang/python3/patches/010-do-not-add-rt-lib-dirs-when-cross-compiling.patch b/feeds/packages/lang/python3/patches/010-do-not-add-rt-lib-dirs-when-cross-compiling.patch
+new file mode 100644
+index 0000000..5a106d4
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/010-do-not-add-rt-lib-dirs-when-cross-compiling.patch
+@@ -0,0 +1,15 @@
++diff --git a/setup.py b/setup.py
++index 7868b7b..544fa7e 100644
++--- a/setup.py
+++++ b/setup.py
++@@ -452,8 +452,9 @@ class PyBuildExt(build_ext):
++ # directly since an inconsistently reproducible issue comes up where
++ # the environment variable is not set even though the value were passed
++ # into configure and stored in the Makefile (issue found on OS X 10.3).
+++ rt_lib_dirs = [] if cross_compiling else self.compiler.runtime_library_dirs
++ for env_var, arg_name, dir_list in (
++- ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
+++ ('LDFLAGS', '-R', rt_lib_dirs),
++ ('LDFLAGS', '-L', self.compiler.library_dirs),
++ ('CPPFLAGS', '-I', self.compiler.include_dirs)):
++ env_val = sysconfig.get_config_var(env_var)
+diff --git a/feeds/packages/lang/python3/patches/011-do-not-prefer-ncursesw.patch b/feeds/packages/lang/python3/patches/011-do-not-prefer-ncursesw.patch
+new file mode 100644
+index 0000000..c023225
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/011-do-not-prefer-ncursesw.patch
+@@ -0,0 +1,15 @@
++diff --git a/setup.py b/setup.py
++index 2779658..b6d3d61 100644
++--- a/setup.py
+++++ b/setup.py
++@@ -693,8 +693,8 @@ class PyBuildExt(build_ext):
++ # use the same library for the readline and curses modules.
++ if 'curses' in readline_termcap_library:
++ curses_library = readline_termcap_library
++- elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
++- curses_library = 'ncursesw'
+++ #elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
+++ # curses_library = 'ncursesw'
++ elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
++ curses_library = 'ncurses'
++ elif self.compiler.find_library_file(lib_dirs, 'curses'):
+diff --git a/feeds/packages/lang/python3/patches/012-disable-wcsftime-detection.patch b/feeds/packages/lang/python3/patches/012-disable-wcsftime-detection.patch
+new file mode 100644
+index 0000000..55a383c
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/012-disable-wcsftime-detection.patch
+@@ -0,0 +1,13 @@
++diff --git a/configure b/configure
++index 274af7e..85bbf0e 100755
++--- a/configure
+++++ b/configure
++@@ -10555,7 +10555,7 @@ for ac_func in alarm accept4 setitimer getitimer bind_textdomain_codeset chown \
++ sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \
++ sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \
++ truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \
++- wcscoll wcsftime wcsxfrm wmemcmp writev _getpty
+++ wcscoll wcsxfrm wmemcmp writev _getpty
++ do :
++ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
++ ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+diff --git a/feeds/packages/lang/python3/patches/013-make-freeze-import-lib-into-an-override-able-var.patch b/feeds/packages/lang/python3/patches/013-make-freeze-import-lib-into-an-override-able-var.patch
+new file mode 100644
+index 0000000..be17d34
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/013-make-freeze-import-lib-into-an-override-able-var.patch
+@@ -0,0 +1,26 @@
++diff --git a/Makefile.pre.in b/Makefile.pre.in
++index ce2c0aa..7df56bf 100644
++--- a/Makefile.pre.in
+++++ b/Makefile.pre.in
++@@ -691,17 +691,19 @@ Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
++ ############################################################################
++ # Importlib
++
+++FREEZE_IMPORTLIB ?= ./Programs/_freeze_importlib
+++
++ Programs/_freeze_importlib.o: Programs/_freeze_importlib.c Makefile
++
++ Programs/_freeze_importlib: Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN)
++ $(LINKCC) $(PY_LDFLAGS) -o $@ Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
++
++ Python/importlib_external.h: $(srcdir)/Lib/importlib/_bootstrap_external.py Programs/_freeze_importlib
++- ./Programs/_freeze_importlib \
+++ $(FREEZE_IMPORTLIB) \
++ $(srcdir)/Lib/importlib/_bootstrap_external.py Python/importlib_external.h
++
++ Python/importlib.h: $(srcdir)/Lib/importlib/_bootstrap.py Programs/_freeze_importlib
++- ./Programs/_freeze_importlib \
+++ $(FREEZE_IMPORTLIB) \
++ $(srcdir)/Lib/importlib/_bootstrap.py Python/importlib.h
++
++
+diff --git a/feeds/packages/lang/python3/patches/014-remove-platform-so-suffix.patch b/feeds/packages/lang/python3/patches/014-remove-platform-so-suffix.patch
+new file mode 100644
+index 0000000..cbc32d5
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/014-remove-platform-so-suffix.patch
+@@ -0,0 +1,26 @@
++diff --git a/configure b/configure
++index e823a08..84c525f 100755
++--- a/configure
+++++ b/configure
++@@ -14365,7 +14365,7 @@ $as_echo_n "checking ABIFLAGS... " >&6; }
++ $as_echo "$ABIFLAGS" >&6; }
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking SOABI" >&5
++ $as_echo_n "checking SOABI... " >&6; }
++-SOABI='cpython-'`echo $VERSION | tr -d .`${ABIFLAGS}${PLATFORM_TRIPLET:+-$PLATFORM_TRIPLET}
+++SOABI='cpython-'`echo $VERSION | tr -d .`
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SOABI" >&5
++ $as_echo "$SOABI" >&6; }
++
++diff --git a/configure.ac b/configure.ac
++index 56a73df..1855af5 100644
++--- a/configure.ac
+++++ b/configure.ac
++@@ -4314,7 +4314,7 @@ AC_SUBST(SOABI)
++ AC_MSG_CHECKING(ABIFLAGS)
++ AC_MSG_RESULT($ABIFLAGS)
++ AC_MSG_CHECKING(SOABI)
++-SOABI='cpython-'`echo $VERSION | tr -d .`${ABIFLAGS}${PLATFORM_TRIPLET:+-$PLATFORM_TRIPLET}
+++SOABI='cpython-'`echo $VERSION | tr -d .`
++ AC_MSG_RESULT($SOABI)
++
++ AC_SUBST(EXT_SUFFIX)
+diff --git a/feeds/packages/lang/python3/patches/015-abort-on-failed-modules.patch b/feeds/packages/lang/python3/patches/015-abort-on-failed-modules.patch
+new file mode 100644
+index 0000000..eec488f
+--- /dev/null
++++ b/feeds/packages/lang/python3/patches/015-abort-on-failed-modules.patch
+@@ -0,0 +1,12 @@
++diff --git a/setup.py b/setup.py
++index da67731..928e0de 100644
++--- a/setup.py
+++++ b/setup.py
++@@ -293,6 +293,7 @@ class PyBuildExt(build_ext):
++ print("Failed to build these modules:")
++ print_three_column(failed)
++ print()
+++ if cross_compiling: sys.exit(1)
++
++ if self.failed_on_import:
++ failed = self.failed_on_import[:]
+diff --git a/feeds/packages/lang/ruby/Makefile b/feeds/packages/lang/ruby/Makefile
+new file mode 100644
+index 0000000..210d633
+--- /dev/null
++++ b/feeds/packages/lang/ruby/Makefile
+@@ -0,0 +1,1380 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++# To Do:
++# - dirs not removed when uninstalling!
++#
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ruby
++PKG_VERSION:=2.2.3
++PKG_RELEASE:=1
++
++PKG_LIBVER:=2.2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://cache.ruby-lang.org/pub/ruby/$(PKG_LIBVER)/
++PKG_MD5SUM:=f49a734729a71774d4a94a9a603114b2
++PKG_MAINTAINER:=Luiz Angelo Daros de Luca <luizluca@gmail.com>
++PKG_LICENSE:=BSD-2-Clause
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_DEPENDS:=ruby/host
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/ruby/Default
++ SUBMENU:=Ruby
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Ruby scripting language
++ URL:=http://www.ruby-lang.org/
++endef
++
++define Package/ruby/Default/description
++ Ruby is the interpreted scripting language for quick and easy
++ object-oriented programming. It has many features to process text files
++ and to do system management tasks (as in perl). It is simple,
++ straight-forward, and extensible.
++
++endef
++
++define Package/ruby
++$(call Package/ruby/Default)
++ TITLE+= (interpreter)
++ DEPENDS:=+libruby
++endef
++
++define Package/ruby/description
++$(call Package/ruby/Default/description)
++endef
++
++define Package/libruby
++$(call Package/ruby/Default)
++ SUBMENU:=
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= (shared library)
++ DEPENDS+= +libpthread +librt +libgmp
++endef
++
++define Package/ruby-stdlib
++$(call Package/ruby/Default)
++ TITLE:=Ruby standard libraries (metadata for all stdlib subsets)
++ DEPENDS:=ruby +ruby-misc +ruby-bigdecimal +ruby-cgi +ruby-csv +ruby-datetime +ruby-dbm +ruby-debuglib\
++ +ruby-digest +ruby-drb +ruby-enc +ruby-enc-extra +ruby-erb +ruby-gdbm +ruby-gems \
++ +ruby-json +ruby-io-console +ruby-irb +ruby-fiddle +ruby-filelib +ruby-logger +ruby-math \
++ +ruby-minitest +ruby-mkmf +ruby-multithread +ruby-nkf +ruby-net +ruby-openssl +ruby-optparse \
++ +ruby-patterns +ruby-powerassert +ruby-prettyprint +ruby-pstore +ruby-psych +ruby-racc +ruby-rake \
++ +ruby-rbconfig +ruby-rdoc +ruby-readline +ruby-rexml +ruby-rinda +ruby-ripper +ruby-rss +ruby-sdbm \
++ +ruby-shell +ruby-socket +ruby-testunit +ruby-unicodenormalize +ruby-uri +ruby-webrick +ruby-xmlrpc \
++ +ruby-yaml +ruby-zlib
++endef
++
++define Package/ruby-stdlib/description
++ This metapackage currently install all ruby-* packages,
++ providing a complete Ruby Standard Library.
++
++endef
++
++define Package/ruby-bigdecimal
++$(call Package/ruby/Default)
++ TITLE:=Arbitrary-precision decimal floating-point lib for Ruby
++ DEPENDS:=ruby
++endef
++
++define Package/ruby-bigdecimal/description
++ Provides bigdecimal* files
++endef
++
++define Package/ruby-cgi
++$(call Package/ruby/Default)
++ TITLE:=Ruby CGI support toolkit
++ DEPENDS:=ruby +ruby-filelib +ruby-pstore
++endef
++
++define Package/ruby-bigdecimal/description
++ Provides bigdecimal* files
++
++endef
++
++define Package/ruby-csv
++$(call Package/ruby/Default)
++ TITLE+=CSV library
++ DEPENDS:=ruby +ruby-patterns +ruby-datetime +ruby-enc
++endef
++
++define Package/ruby-csv/description
++ Provides csv.rb file
++
++endef
++
++define Package/ruby-datetime
++$(call Package/ruby/Default)
++ TITLE+= date library
++ DEPENDS:=ruby
++endef
++
++define Package/ruby-datetime/description
++ Provides date.rb and time.rb
++
++endef
++
++define Package/ruby-dbm
++$(call Package/ruby/Default)
++ TITLE:=Ruby support for dbm
++ DEPENDS:=ruby +libdb47
++endef
++
++define Package/ruby-dbm/description
++ The DBM class provides a wrapper to a Unix-style dbm or Database Manager library.
++ This package provides dbm.so file.
++
++endef
++
++define Package/ruby-debuglib
++$(call Package/ruby/Default)
++ TITLE+= debug library
++ DEPENDS:=ruby +ruby-multithread +ruby-prettyprint
++endef
++
++define Package/ruby-debuglib/description
++ Provides files for debugging:
++ - benchmark.rb
++ - debug.rb
++ - objspace.so
++ - profile.rb
++ - profiler.rb
++ - tracer.rb
++
++endef
++
++define Package/ruby-digest
++$(call Package/ruby/Default)
++ TITLE:=Ruby Digest Library
++ DEPENDS:=ruby +RUBY_DIGEST_USE_OPENSSL:libopenssl
++endef
++
++define Package/ruby-digest/description
++ Provides digest* files. Can be configured to use OpenSSL or
++ bundled hash functions.
++
++endef
++
++define Package/ruby-digest/config
++
++ config RUBY_DIGEST_USE_OPENSSL
++ bool "Use OpenSSL functions for ruby digest hash functions"
++ depends on PACKAGE_ruby-digest
++ help
++ Ruby can use OpenSSL hash functions or compile alternative implementations. Using
++ OpenSSL saves about 30KBytes (less when compressed) but requires OpenSSL (that
++ is way bigger than that). However, if OpenSSL is already needed by another usage,
++ as ruby-openssl or any other non ruby package, it is better to mark this option.
++ default n
++
++endef
++
++define Package/ruby-drb
++$(call Package/ruby/Default)
++ TITLE:=Ruby distributed object system
++ DEPENDS:=ruby +ruby-filelib +ruby-patterns +ruby-socket
++endef
++
++define Package/ruby-drb/description
++ Provides drb* files
++
++endef
++
++define Package/ruby-enc
++$(call Package/ruby/Default)
++ TITLE:=Ruby character re-coding library charset (small subset)
++ DEPENDS:=ruby
++endef
++
++define Package/ruby-enc/description
++ Provides ruby encoding library for encodings used directly by
++ libraries in Ruby Standard Library:
++ - enc/encdb.so
++ - enc/euc_jp.so
++ - enc/iso_8859_1.so
++ - enc/utf_16be.so
++ - enc/utf_16le.so
++ - enc/utf_32be.so
++ - enc/utf_32le.so
++ FYI: ASCII-8BIT, UTF-7, UTF-8 and US-ASCII are already in Core.
++
++endef
++
++define Package/ruby-enc-extra
++$(call Package/ruby/Default)
++ TITLE:=Ruby character re-coding library charset (extra subset)
++ DEPENDS:=ruby +ruby-enc
++endef
++
++define Package/ruby-enc-extra/description
++ Provides extra encodings not provided by ruby-enc:
++ - enc/big5.so
++ - enc/cp949.so
++ - enc/emacs_mule.so
++ - enc/euc_kr.so
++ - enc/euc_tw.so
++ - enc/gb18030.so
++ - enc/gb2312.so
++ - enc/gbk.so
++ - enc/iso_8859_10.so
++ - enc/iso_8859_11.so
++ - enc/iso_8859_13.so
++ - enc/iso_8859_14.so
++ - enc/iso_8859_15.so
++ - enc/iso_8859_16.so
++ - enc/iso_8859_2.so
++ - enc/iso_8859_3.so
++ - enc/iso_8859_4.so
++ - enc/iso_8859_5.so
++ - enc/iso_8859_6.so
++ - enc/iso_8859_7.so
++ - enc/iso_8859_8.so
++ - enc/iso_8859_9.so
++ - enc/koi8_r.so
++ - enc/koi8_u.so
++ - enc/shift_jis.so
++ - enc/trans/big5.so
++ - enc/trans/chinese.so
++ - enc/trans/emoji.so
++ - enc/trans/emoji_iso2022_kddi.so
++ - enc/trans/emoji_sjis_docomo.so
++ - enc/trans/emoji_sjis_kddi.so
++ - enc/trans/emoji_sjis_softbank.so
++ - enc/trans/escape.so
++ - enc/trans/gb18030.so
++ - enc/trans/gbk.so
++ - enc/trans/iso2022.so
++ - enc/trans/japanese.so
++ - enc/trans/japanese_euc.so
++ - enc/trans/japanese_sjis.so
++ - enc/trans/korean.so
++ - enc/trans/single_byte.so
++ - enc/trans/transdb.so
++ - enc/trans/utf8_mac.so
++ - enc/trans/utf_16_32.so
++ - enc/windows_1251.so
++ - enc/windows_31j.so
++
++endef
++
++define Package/ruby-erb
++$(call Package/ruby/Default)
++ TITLE+= (embedded interpreter)
++ DEPENDS:=ruby +ruby-cgi
++endef
++
++define Package/ruby-erb/description
++ Provides erb* files
++
++endef
++
++define Package/ruby-fiddle
++$(call Package/ruby/Default)
++ TITLE:=A libffi wrapper for Ruby
++ DEPENDS:=ruby +libffi
++endef
++
++define Package/ruby-fiddle/description
++ Provides fiddle* files
++
++endef
++
++define Package/ruby-filelib
++$(call Package/ruby/Default)
++ TITLE+= File utils library
++ DEPENDS:=ruby +ruby-enc +ruby-misc
++endef
++
++define Package/ruby-filelib/description
++ Provides filesystem interaction files, including
++ path and temp:
++ - fileutils.rb
++ - find.rb
++ - pathname.rb
++ - pathname.so
++ - tempfile.rb
++ - tmpdir.rb
++
++endef
++
++define Package/ruby-gdbm
++$(call Package/ruby/Default)
++ TITLE:=Ruby support for gdbm
++ DEPENDS:=ruby +libgdbm
++endef
++
++define Package/ruby-gdbm/description
++ Provides gdbm* files
++
++endef
++
++define Package/ruby-gems
++$(call Package/ruby/Default)
++ TITLE:=Ruby gems packet management
++ DEPENDS:=ruby +ruby-net +ruby-rdoc
++endef
++
++define Package/ruby-gems/description
++ Provides rubygems for gems usage, download and installation
++
++endef
++
++define Package/ruby-io-console
++$(call Package/ruby/Default)
++ TITLE+= Console interface
++ DEPENDS:=ruby
++endef
++
++define Package/ruby-io-console/description
++ Provides io-console* files
++
++endef
++
++define Package/ruby-irb
++$(call Package/ruby/Default)
++ TITLE+= (interactive shell)
++ DEPENDS:=ruby +ruby-debuglib +ruby-filelib +ruby-math
++endef
++
++define Package/ruby-irb/description
++ Provides irb* files
++
++endef
++
++define Package/ruby-json
++$(call Package/ruby/Default)
++ TITLE:=Ruby support for JSON
++ DEPENDS:=ruby +ruby-datetime +ruby-misc
++endef
++
++define Package/ruby-json/description
++ Provides json* files
++
++endef
++
++define Package/ruby-logger
++$(call Package/ruby/Default)
++ TITLE+= logger and syslog library
++ DEPENDS:=ruby +ruby-multithread
++endef
++
++define Package/ruby-logger/description
++ Provides log library, including syslog:
++ - logger.rb
++ - syslog.so
++ - syslog/logger.rb
++
++endef
++
++define Package/ruby-math
++$(call Package/ruby/Default)
++ TITLE+= math library
++ DEPENDS:=ruby +ruby-patterns
++endef
++
++define Package/ruby-math/description
++ Provides math related files:
++ - cmath.rb
++ - complex.rb
++ - mathn.rb
++ - mathn/complex.so
++ - mathn/rational.so
++ - matrix.rb
++ - matrix/eigenvalue_decomposition.rb
++ - matrix/lup_decomposition.rb
++ - prime.rb
++ - rational.rb
++
++endef
++
++define Package/ruby-minitest
++$(call Package/ruby/Default)
++ TITLE:=Gem minitest shipped with Ruby
++ DEPENDS:=ruby +ruby-gems
++endef
++
++define Package/ruby-minitest/description
++ Provides minitest gem
++
++endef
++
++define Package/ruby-misc
++$(call Package/ruby/Default)
++ TITLE:=Ruby standard libraries subset (miscelaneous files)
++ DEPENDS:=ruby
++endef
++
++define Package/ruby-misc/description
++ This package contains miscellaneous files from stdlib
++ not splitted in other ruby packages like stringio:
++ - English.rb
++ - abbrev.rb
++ - base64.rb
++ - continuation.so
++ - coverage.so
++ - delegate.rb
++ - e2mmap.rb
++ - etc.so
++ - expect.rb
++ - fcntl.so
++ - fiber.so
++ - getoptlong.rb
++ - open3.rb
++ - ostruct.rb
++ - pty.so
++ - scanf.rb
++ - securerandom.rb
++ - set.rb
++ - shellwords.rb
++ - stringio.so
++ - strscan.so
++ - tsort.rb
++ - weakref.rb
++
++endef
++
++define Package/ruby-mkmf
++$(call Package/ruby/Default)
++ TITLE+= makefile library
++ DEPENDS:=ruby +ruby-filelib +ruby-optparse +ruby-rbconfig
++endef
++
++define Package/ruby-mkmf/description
++ Provides mkmf* files
++
++endef
++
++define Package/ruby-multithread
++$(call Package/ruby/Default)
++ TITLE+= multithread library
++ DEPENDS:=ruby +ruby-misc
++endef
++
++define Package/ruby-multithread/description
++ Provides files for multithread usage:
++ - io/nonblock.so
++ - io/wait.so
++ - thread.so (FYI, Thread is a core class)
++ - monitor.rb
++ - mutex_m.rb
++ - sync.rb
++ - thwait.rb
++ - timeout.rb
++
++endef
++
++define Package/ruby-net
++$(call Package/ruby/Default)
++ TITLE:=Ruby Network Protocols Library
++ DEPENDS:=ruby +ruby-datetime +ruby-digest +ruby-filelib +ruby-uri
++endef
++
++define Package/ruby-net/description
++ Provides net* files
++
++endef
++
++define Package/ruby-nkf
++$(call Package/ruby/Default)
++ TITLE:=Ruby Network Kanji Filter
++ DEPENDS:=ruby +ruby-enc
++endef
++
++define Package/ruby-nkf/description
++ Provides nkf* files
++
++endef
++
++define Package/ruby-openssl
++$(call Package/ruby/Default)
++ TITLE:=Ruby support for openssl
++ DEPENDS:=ruby +ruby-enc +libopenssl +ruby-misc
++endef
++
++define Package/ruby-openssl/description
++ Provides openssl* files
++
++endef
++
++define Package/ruby-optparse
++$(call Package/ruby/Default)
++ TITLE:=Ruby command-line option analysis
++ DEPENDS:=ruby +ruby-misc
++endef
++
++define Package/ruby-optparse/description
++ Provides optparse* files
++
++endef
++
++define Package/ruby-patterns
++$(call Package/ruby/Default)
++ TITLE:=Ruby design patterns implementation
++ DEPENDS:=ruby +ruby-multithread
++endef
++
++define Package/ruby-patterns/description
++ Provides design patterns helpers files:
++ - forwardable.rb
++ - observer.rb
++ - singleton.rb
++
++endef
++
++define Package/ruby-powerassert
++$(call Package/ruby/Default)
++ TITLE:=Gem power_assert shipped with Ruby
++ DEPENDS:=ruby +ruby-ripper
++endef
++
++define Package/ruby-powerassert/description
++ Power Assert gem for Ruby. Power Assert shows each value of variables
++ and method calls in the expression. It is useful for testing, providing
++ which value wasn't correct when the condition is not satisfied
++
++endef
++
++define Package/ruby-prettyprint
++$(call Package/ruby/Default)
++ TITLE:=Ruby PrettyPrint librart
++ DEPENDS:=ruby +ruby-misc
++endef
++
++define Package/ruby-prettyprint/description
++ Provides Pretty Print library:
++ - pp.rb
++ - prettyprint.rb
++
++endef
++
++define Package/ruby-pstore
++$(call Package/ruby/Default)
++ TITLE+=file based persistence
++ DEPENDS:=ruby +ruby-digest +ruby-enc
++endef
++
++define Package/ruby-pstore/description
++ Provides pstore.rb file
++
++endef
++
++define Package/ruby-psych
++$(call Package/ruby/Default)
++ TITLE+=YAML parser and emitter
++ DEPENDS:=ruby +ruby-bigdecimal +ruby-datetime +ruby-misc +ruby-enc +libyaml
++endef
++
++define Package/ruby-psych/description
++ Provides psych* files
++
++endef
++
++define Package/ruby-racc
++$(call Package/ruby/Default)
++ TITLE:=LALR parser generator in Ruby
++ DEPENDS:=ruby
++endef
++
++define Package/ruby-racc/description
++ Provides racc* files
++
++endef
++
++define Package/ruby-rake
++$(call Package/ruby/Default)
++ TITLE+=Ruby Rake (make replacement)
++ DEPENDS:=ruby +ruby-datetime +ruby-filelib +ruby-optparse +ruby-patterns +ruby-rbconfig
++endef
++
++define Package/ruby-rake/description
++ Provides rake* files
++
++endef
++
++define Package/ruby-rbconfig
++$(call Package/ruby/Default)
++ TITLE+=Ruby RbConfig
++ DEPENDS:=ruby
++endef
++
++define Package/ruby-rbconfig/description
++ Provides rbconfig file
++
++endef
++
++define Package/ruby-rdoc
++$(call Package/ruby/Default)
++ TITLE+= (documentation generator)
++ DEPENDS:=ruby +ruby-erb +ruby-irb +ruby-json +ruby-racc +ruby-rake +ruby-yaml +ruby-zlib
++endef
++
++define Package/ruby-rdoc/description
++ Provides rdoc* and ri files
++
++endef
++
++define Package/ruby-readline
++$(call Package/ruby/Default)
++ TITLE:=Ruby support for readline
++ DEPENDS:=ruby +libncurses +libreadline
++endef
++
++define Package/ruby-readline/description
++ Provides readline* files
++
++endef
++
++define Package/ruby-rexml
++$(call Package/ruby/Default)
++ TITLE:=Ruby XML toolkit
++ DEPENDS:=ruby +ruby-patterns +ruby-enc
++endef
++
++define Package/ruby-rexml/description
++ Provides rexml* files
++
++endef
++
++define Package/ruby-rinda
++$(call Package/ruby/Default)
++ TITLE:=Ruby Linda paradigm implementation
++ DEPENDS:=ruby +ruby-drb
++endef
++
++define Package/ruby-rinda/description
++ Provides rinda* files
++
++endef
++
++define Package/ruby-ripper
++$(call Package/ruby/Default)
++ TITLE:=Ruby script parser
++ DEPENDS:=ruby
++endef
++
++define Package/ruby-ripper/description
++ Provides ripper* files
++
++endef
++
++define Package/ruby-rss
++$(call Package/ruby/Default)
++ TITLE:=Ruby RSS toolkit
++ DEPENDS:=ruby +ruby-net +ruby-nkf +ruby-rexml
++endef
++
++define Package/ruby-rss/description
++ Provides rss* files
++
++endef
++
++define Package/ruby-sdbm
++$(call Package/ruby/Default)
++ TITLE:=Ruby simple file-based key-value dbm implementation
++ DEPENDS:=ruby
++endef
++
++define Package/ruby-sdbm/description
++ Provides sdbm* files
++
++endef
++
++define Package/ruby-shell
++$(call Package/ruby/Default)
++ TITLE:=Ruby idiomatic Ruby interface
++ DEPENDS:=ruby +ruby-patterns
++endef
++
++define Package/ruby-shell/description
++ Provides shell* files
++
++endef
++
++define Package/ruby-socket
++$(call Package/ruby/Default)
++ TITLE+= socket support
++ DEPENDS:=ruby +ruby-multithread
++endef
++
++define Package/ruby-socket/description
++ Provides socket-related files:
++ - gserver.rb
++ - ipaddr.rb
++ - resolv-replace.rb
++ - resolv.rb
++ - socket.rb
++ - socket.so
++
++endef
++
++define Package/ruby-testunit
++$(call Package/ruby/Default)
++ TITLE:=Gem test-unit shipped with Ruby
++ DEPENDS:=ruby +ruby-csv +ruby-erb +ruby-optparse +ruby-powerassert +ruby-prettyprint +ruby-rexml +ruby-yaml
++endef
++
++define Package/ruby-testunit/description
++ Provides test/unit* files
++
++endef
++
++define Package/ruby-unicodenormalize
++$(call Package/ruby/Default)
++ TITLE:=Ruby String additions for Unicode normalization
++ DEPENDS:=ruby +ruby-enc +ruby-enc-extra
++endef
++
++define Package/ruby-unicodenormalize/description
++ Additions to class String for Unicode normalization
++
++endef
++
++define Package/ruby-uri
++$(call Package/ruby/Default)
++ TITLE:=Ruby library to handle URI
++ DEPENDS:=ruby +ruby-socket +ruby-enc
++endef
++
++define Package/ruby-uri/description
++ Provides uri* files
++
++endef
++
++define Package/ruby-webrick
++$(call Package/ruby/Default)
++ TITLE:=Ruby Web server toolkit
++ DEPENDS:=ruby +ruby-erb +ruby-net +ruby-patterns +ruby-rbconfig
++endef
++
++define Package/ruby-webrick/description
++ Provides webrick* files
++
++endef
++
++define Package/ruby-xmlrpc
++$(call Package/ruby/Default)
++ TITLE:=Ruby XML-RPC toolkit
++ DEPENDS:=ruby +ruby-rexml +ruby-webrick
++endef
++
++define Package/ruby-xmlrpc/description
++ Provides xmlrpc* files
++
++endef
++
++define Package/ruby-yaml
++$(call Package/ruby/Default)
++ TITLE:=Ruby YAML toolkit
++ DEPENDS:=ruby +ruby-dbm +ruby-pstore +ruby-psych
++endef
++
++define Package/ruby-yaml/description
++ Provides yaml* files
++
++endef
++
++define Package/ruby-zlib
++$(call Package/ruby/Default)
++ TITLE:=Ruby support for zlib
++ DEPENDS:=ruby +zlib
++endef
++
++define Package/ruby-zlib/description
++ Provides zlib* files
++
++endef
++
++HOST_CONFIGURE_ARGS += \
++ --disable-install-doc \
++ --disable-install-rdoc \
++ --disable-install-capi \
++ --with-static-linked-ext \
++ --with-out-ext=tk,tk/tkutil,win32,win32ole,dbm,gdbm,readline \
++
++# even not used, host build with restricted exts results in gems not being
++# compiling for target (probably some cross compiling problem like checking
++# host for selecting target features)
++# --with-out-ext \
++# --with-ext=thread,stringio \
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-rpath \
++ $(call autoconf_bool,CONFIG_IPV6,ipv6) \
++ --disable-install-doc \
++ --disable-install-capi \
++ --with-ruby-version=minor \
++ --with-iconv-dir=$(ICONV_PREFIX) \
++ --with-out-ext=tk,tk/tkutil,win32,win32ole
++
++ifndef CONFIG_RUBY_DIGEST_USE_OPENSSL
++CONFIGURE_ARGS += \
++ --with-bundled-sha1\
++ --with-bundled-md5\
++ --with-bundled-rmd160\
++ --with-bundled-sha2 \
++
++endif
++
++TARGET_LDFLAGS += -L$(PKG_BUILD_DIR)
++
++MAKE_FLAGS += \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ SHELL="/bin/bash"
++
++define Package/ruby/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/vendor_ruby/$(PKG_LIBVER)
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/site_ruby/$(PKG_LIBVER)
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ruby $(1)/usr/lib/ruby/ruby$(PKG_LIBVER)-bin
++ $(INSTALL_BIN) ./files/ruby $(1)/usr/bin/ruby
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/vendor_ruby/$(PKG_LIBVER)/* $(1)/usr/lib/ruby/vendor_ruby/$(PKG_LIBVER)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/site_ruby/$(PKG_LIBVER)/* $(1)/usr/lib/ruby/site_ruby/$(PKG_LIBVER)/
++ sed -i -e "s%@RUBY_LIBPATH@%/usr/lib/ruby/$(PKG_LIBVER)%" $(1)/usr/bin/ruby
++ sed -i -e "s%@RUBY_BINPATH@%/usr/lib/ruby/ruby$(PKG_LIBVER)-bin%" $(1)/usr/bin/ruby
++endef
++
++define Package/libruby/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libruby.so.* $(1)/usr/lib/
++endef
++
++define Package/ruby-stdlib/install
++ # nothing to do
++endef
++
++define Package/ruby-bigdecimal/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/*/bigdecimal.so \
++ usr/lib/ruby/$(PKG_LIBVER)/bigdecimal/ \
++ usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/default/bigdecimal-*.gemspec \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-cgi/install
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/cgi $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/cgi.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++endef
++
++define Package/ruby-csv/install
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/csv.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++endef
++
++define Package/ruby-datetime/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/time.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/date.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/date_core.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-dbm/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/*/dbm.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-debuglib/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/profile.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/profiler.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/debug.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/tracer.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/benchmark.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/objspace.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-digest/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/digest \
++ usr/lib/ruby/$(PKG_LIBVER)/digest.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/digest.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/digest/* \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-drb/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/drb.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/drb \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-enc/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/*/enc/encdb.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/enc/iso_8859_1.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/enc/utf_* \
++ usr/lib/ruby/$(PKG_LIBVER)/*/enc/euc_jp.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-enc-extra/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) \
++ --exclude=usr/lib/ruby/$(PKG_LIBVER)/*/enc/encdb.so \
++ --exclude=usr/lib/ruby/$(PKG_LIBVER)/*/enc/iso_8859_1.so \
++ --exclude=usr/lib/ruby/$(PKG_LIBVER)/*/enc/utf_* \
++ --exclude=usr/lib/ruby/$(PKG_LIBVER)/*/enc/euc_jp.so \
++ -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/*/enc \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-erb/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/erb $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/erb.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++endef
++
++define Package/ruby-fiddle/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/fiddle.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/fiddle/ \
++ usr/lib/ruby/$(PKG_LIBVER)/*/fiddle.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-filelib/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/tmpdir.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/tempfile.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/pathname.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/pathname.so \
++ usr/lib/ruby/$(PKG_LIBVER)/find.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/fileutils.rb \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-gdbm/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/*/gdbm.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-gems/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/gem $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/ubygems.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rubygems.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ # Remove tests (avoids extra deps)
++ $(RM) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rubygems/test_case.rb
++ $(RM) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rubygems/package/tar_test_case.rb
++ $(RM) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rubygems/installer_test_case.rb
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rubygems $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/default
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/doc
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/cache
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/extensions
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/build_info
++endef
++
++define Package/ruby-io-console/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/*/io/console.so \
++ usr/lib/ruby/$(PKG_LIBVER)/io/console/ \
++ usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/default/io-console-*.gemspec \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-irb/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/irb $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/irb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/irb.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++endef
++
++define Package/ruby-json/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/json.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/json \
++ usr/lib/ruby/$(PKG_LIBVER)/*/json \
++ usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/default/json-*.gemspec \
++ ) | ( cd $(1); $(TAR) -xf - )
++ rm -rf \
++ $(1)/usr/lib/ruby/$(PKG_LIBVER)/psych/json
++endef
++
++define Package/ruby-logger/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/logger.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/syslog/logger.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/syslog.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-math/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/prime.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/mathn.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/cmath.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/mathn \
++ usr/lib/ruby/$(PKG_LIBVER)/matrix.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/matrix \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-minitest/install
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/minitest-*.gemspec $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/
++ # Remove tests (avoids extra deps)
++ $(RM) -rf $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/minitest-*/test
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/minitest-* $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/
++endef
++
++define Package/ruby-misc/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/English.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/abbrev.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/base64.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/delegate.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/e2mmap.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/expect.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/getoptlong.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/open3.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/ostruct.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/scanf.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/securerandom.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/set.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/shellwords.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/tsort.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/weakref.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/continuation.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/coverage.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/etc.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/fcntl.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/fiber.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/pty.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/stringio.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/strscan.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++
++
++define Package/ruby-mkmf/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/mkmf.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/un.rb \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-multithread/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/monitor.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/timeout.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/thwait.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/mutex_m.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/sync.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/thread.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/io/wait.so \
++ usr/lib/ruby/$(PKG_LIBVER)/*/io/nonblock.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-net/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/open-uri.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/net/* \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-nkf/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/kconv.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/nkf.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-openssl/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/openssl \
++ usr/lib/ruby/$(PKG_LIBVER)/openssl.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/openssl.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-optparse/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/optparse.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/optionparser.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/optparse \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-patterns/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/observer.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/singleton.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/forwardable.rb \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-powerassert/install
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/power_assert-*.gemspec $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/
++ # Remove tests (avoids extra deps)
++ $(RM) -rf $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/power_assert-*/test
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/power_assert-* $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/
++endef
++
++define Package/ruby-prettyprint/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/pp.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/prettyprint.rb \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-pstore/install
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/pstore.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++endef
++
++define Package/ruby-psych/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/psych \
++ usr/lib/ruby/$(PKG_LIBVER)/psych.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/psych.so \
++ usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/default/psych-*.gemspec \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-racc/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/racc \
++ usr/lib/ruby/$(PKG_LIBVER)/*/racc/*.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-rake/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/rake $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rake.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ # Remove tests (avoids extra deps)
++ $(RM) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rake/runtest.rb
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rake $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/default
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/default/rake-*.gemspec \
++ $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/default/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/rake-* $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/
++endef
++
++define Package/ruby-rbconfig/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/*/rbconfig.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/rbconfig/* \
++ usr/lib/ruby/$(PKG_LIBVER)/*/rbconfig/*.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-rdoc/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/rdoc $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ri $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ # Remove tests (avoids extra deps)
++ $(RM) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rdoc/test_case.rb
++ $(RM) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rdoc/markup/formatter_test_case.rb
++ $(RM) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rdoc/markup/text_formatter_test_case.rb
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rdoc.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rdoc $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/default
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/default/rdoc-*.gemspec \
++ $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/default/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/rdoc-* \
++ $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/
++endef
++
++define Package/ruby-readline/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/*/readline.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-rexml/install
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rexml $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++endef
++
++define Package/ruby-rinda/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/rinda \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-ripper/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/ripper.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/ripper \
++ usr/lib/ruby/$(PKG_LIBVER)/*/ripper.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-rss/install
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rss $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/rss.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++endef
++
++define Package/ruby-sdbm/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/*/sdbm.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-shell/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/shell.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/shell \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-socket/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/ipaddr.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/resolv-replace.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/resolv.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/socket.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/*/socket.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-testunit/install
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/test-unit-*.gemspec $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/specifications/
++ # Remove tests (avoids extra deps)
++ $(RM) -rf $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/test-unit-*/test
++ $(RM) -rf $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/test-unit-*/sample
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/test-unit-* $(1)/usr/lib/ruby/gems/$(PKG_LIBVER)/gems/
++endef
++
++define Package/ruby-unicodenormalize/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/unicode_normalize.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/unicode_normalize \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-uri/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/uri.rb \
++ usr/lib/ruby/$(PKG_LIBVER)/uri \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-webrick/install
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/webrick $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/webrick.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++endef
++
++define Package/ruby-xmlrpc/install
++ $(INSTALL_DIR) $(1)/usr/lib/ruby/$(PKG_LIBVER)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/xmlrpc $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ruby/$(PKG_LIBVER)/xmlrpc.rb $(1)/usr/lib/ruby/$(PKG_LIBVER)/
++endef
++
++define Package/ruby-yaml/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/yaml \
++ usr/lib/ruby/$(PKG_LIBVER)/yaml.rb \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/ruby-zlib/install
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ usr/lib/ruby/$(PKG_LIBVER)/*/zlib.so \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Build/InstallDev
++ ( cd $(PKG_INSTALL_DIR); $(TAR) -cf - \
++ . \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++$(eval $(call BuildPackage,ruby))
++$(eval $(call BuildPackage,libruby))
++$(eval $(call BuildPackage,ruby-stdlib))
++$(eval $(call BuildPackage,ruby-bigdecimal))
++$(eval $(call BuildPackage,ruby-cgi))
++$(eval $(call BuildPackage,ruby-csv))
++$(eval $(call BuildPackage,ruby-datetime))
++$(eval $(call BuildPackage,ruby-dbm))
++$(eval $(call BuildPackage,ruby-debuglib))
++$(eval $(call BuildPackage,ruby-digest))
++$(eval $(call BuildPackage,ruby-drb))
++$(eval $(call BuildPackage,ruby-enc))
++$(eval $(call BuildPackage,ruby-enc-extra))
++$(eval $(call BuildPackage,ruby-erb))
++$(eval $(call BuildPackage,ruby-fiddle))
++$(eval $(call BuildPackage,ruby-filelib))
++$(eval $(call BuildPackage,ruby-gdbm))
++$(eval $(call BuildPackage,ruby-gems))
++$(eval $(call BuildPackage,ruby-io-console))
++$(eval $(call BuildPackage,ruby-irb))
++$(eval $(call BuildPackage,ruby-json))
++$(eval $(call BuildPackage,ruby-logger))
++$(eval $(call BuildPackage,ruby-math))
++$(eval $(call BuildPackage,ruby-minitest))
++$(eval $(call BuildPackage,ruby-misc))
++$(eval $(call BuildPackage,ruby-mkmf))
++$(eval $(call BuildPackage,ruby-multithread))
++$(eval $(call BuildPackage,ruby-net))
++$(eval $(call BuildPackage,ruby-nkf))
++$(eval $(call BuildPackage,ruby-openssl))
++$(eval $(call BuildPackage,ruby-optparse))
++$(eval $(call BuildPackage,ruby-patterns))
++$(eval $(call BuildPackage,ruby-powerassert))
++$(eval $(call BuildPackage,ruby-prettyprint))
++$(eval $(call BuildPackage,ruby-pstore))
++$(eval $(call BuildPackage,ruby-psych))
++$(eval $(call BuildPackage,ruby-racc))
++$(eval $(call BuildPackage,ruby-rake))
++$(eval $(call BuildPackage,ruby-rbconfig))
++$(eval $(call BuildPackage,ruby-rdoc))
++$(eval $(call BuildPackage,ruby-readline))
++$(eval $(call BuildPackage,ruby-rexml))
++$(eval $(call BuildPackage,ruby-rinda))
++$(eval $(call BuildPackage,ruby-ripper))
++$(eval $(call BuildPackage,ruby-rss))
++$(eval $(call BuildPackage,ruby-sdbm))
++$(eval $(call BuildPackage,ruby-shell))
++$(eval $(call BuildPackage,ruby-socket))
++$(eval $(call BuildPackage,ruby-testunit))
++$(eval $(call BuildPackage,ruby-unicodenormalize))
++$(eval $(call BuildPackage,ruby-uri))
++$(eval $(call BuildPackage,ruby-webrick))
++$(eval $(call BuildPackage,ruby-xmlrpc))
++$(eval $(call BuildPackage,ruby-yaml))
++$(eval $(call BuildPackage,ruby-zlib))
++$(eval $(call HostBuild))
+diff --git a/feeds/packages/lang/ruby/files/ruby b/feeds/packages/lang/ruby/files/ruby
+new file mode 100644
+index 0000000..e4904fc
+--- /dev/null
++++ b/feeds/packages/lang/ruby/files/ruby
+@@ -0,0 +1,5 @@
++#!/bin/sh
++if ! [ -r "@RUBY_LIBPATH@/rubygems.rb" ]; then
++ exec @RUBY_BINPATH@ --disable-gems "$@"
++fi
++exec @RUBY_BINPATH@ "$@"
+diff --git a/feeds/packages/lang/ruby/patches/001-rdoc-remove_gems_dep.patch b/feeds/packages/lang/ruby/patches/001-rdoc-remove_gems_dep.patch
+new file mode 100644
+index 0000000..9630de5
+--- /dev/null
++++ b/feeds/packages/lang/ruby/patches/001-rdoc-remove_gems_dep.patch
+@@ -0,0 +1,36 @@
++References:
++
++https://github.com/rdoc/rdoc/pull/340
++
++--- ruby-2.1.2.orig/lib/rdoc.rb 2014-09-02 17:14:28.719224215 -0300
+++++ ruby-2.1.2/lib/rdoc.rb 2014-09-02 17:14:28.762223911 -0300
++@@ -109,6 +109,8 @@
++ def self.load_yaml
++ begin
++ gem 'psych'
+++ rescue NameError => e # --disable-gems
+++ raise unless e.name == :gem
++ rescue Gem::LoadError
++ end
++
++--- ruby-2.1.2.orig/lib/rdoc/markdown.rb 2014-09-02 17:14:28.761223918 -0300
+++++ ruby-2.1.2/lib/rdoc/markdown.rb 2014-09-02 17:14:28.805223607 -0300
++@@ -525,7 +525,6 @@
++
++
++
++- require 'rubygems'
++ require 'rdoc'
++ require 'rdoc/markup/to_joined_paragraph'
++ require 'rdoc/markdown/entities'
++--- ruby-2.1.2.orig/lib/rdoc/text.rb 2014-09-02 17:14:28.721224201 -0300
+++++ ruby-2.1.2/lib/rdoc/text.rb 2014-09-02 17:14:28.764223897 -0300
++@@ -10,6 +10,8 @@
++
++ begin
++ gem 'json'
+++rescue NameError => e # --disable-gems
+++ raise unless e.name == :gem
++ rescue Gem::LoadError
++ end
++
+diff --git a/feeds/packages/lang/ruby/ruby_find_pkgsdeps b/feeds/packages/lang/ruby/ruby_find_pkgsdeps
+new file mode 100644
+index 0000000..946ec1f
+--- /dev/null
++++ b/feeds/packages/lang/ruby/ruby_find_pkgsdeps
+@@ -0,0 +1,270 @@
++#!/usr/bin/ruby -Eutf-8
++# encoding: utf-8
++#
++# Find dependencies between ruby packages
++#
++# Must run inside a openwrt with all *ruby* packages installed
++#
++
++failed = false
++
++puts "Looking for installed ruby packages..."
++packages=`opkg list-installed '*ruby*' | cut -d' ' -f 1`.split("\n")
++
++puts "Looking for packages files..."
++package_files=Hash.new([])
++packages.each do
++ |pkg|
++ files=`opkg files "#{pkg}" | sed -e 1d`.split("\n")
++ package_files[pkg]=files if files
++end
++
++require_regex=/^require ["']([^"']+)["'].*/
++require_regex_ignore=/^require ([a-zA-Z\$]|["']$|.*\/$)/
++require_ignore=%w{drb/invokemethod16 foo rubygems/defaults/operating_system win32console java Win32API
++ builder/xchar json/pure simplecov win32/sspi rdoc/markdown/literals_1_8 enumerator win32/resolv rbtree
++ nqxml/streamingparser nqxml/treeparser xmlscan/parser xmlscan/scanner xmltreebuilder xml/parser xmlparser xml/encoding-ja xmlencoding-ja
++ iconv uconv win32ole gettext/po_parser gettext/mo libxml}
++
++builtin_enc=[
++ Encoding.find("ASCII-8BIT"),
++ Encoding.find("UTF-8"),
++ Encoding.find("UTF-7"),
++ Encoding.find("US-ASCII"),
++]
++
++puts "Looking for requires in files..."
++files_requires=Hash.new([])
++packages.each do
++ |pkg|
++ package_files[pkg].each do
++ |file|
++ next if not File.file?(file)
++
++ if not file =~ /.rb$/
++ if File.executable?(file)
++ magic=`head -c50 '#{file}' | head -1`
++ begin
++ if not magic =~ /ruby/
++ next
++ end
++ rescue
++ next
++ end
++ else
++ next
++ end
++ end
++ #puts "Checking #{file}..."
++ File.open(file, "r") do
++ |f|
++ lineno=0
++ while line=f.gets() do
++ lineno+=1; encs=[]; requires=[]; need_encdb=false
++
++ line=line.chomp.gsub!(/^[[:blank:]]*/,"")
++
++ case line
++ when /^#.*coding *:/
++ if lineno <= 2
++ enc=line.sub(/.*coding *: */,"").sub(/ .*/,"")
++ encs << Encoding.find(enc)
++ end
++ end
++ line.gsub!(/#.*/,"")
++ case line
++ when "__END__"
++ break
++ when /^require /
++ #puts "#{file}:#{line}"
++ if require_regex_ignore =~ line
++ #puts "Ignoring #{line} at #{file}:#{lineno} (REGEX)..."
++ next
++ end
++ if not require_regex =~ line
++ $stderr.puts "Unknown require: '#{line}' at file #{file}:#{lineno}"
++ failed=true
++ end
++ require=line.gsub(require_regex,"\\1")
++ require.gsub!(/\.(so|rb)$/,"")
++
++ if require_ignore.include?(require)
++ #puts "Ignoring #{line} at #{file}:#{lineno} (STR)..."
++ next
++ end
++
++ files_requires[file]=files_requires[file] + [require]
++
++ when /Encoding::/
++ encs=line.scan(/Encoding::[[:alnum:]_]+/).collect {|enc| eval(enc) }.select {|enc| enc.kind_of? Encoding }
++ need_encdb=true
++ end
++
++ next if encs.empty?
++ required_encs = (encs - builtin_enc).collect {|enc| "enc/#{enc.name.downcase.gsub("-","_")}" }
++ required_encs << "enc/encdb" if need_encdb
++
++ files_requires[file] = files_requires[file] + required_encs
++ end
++ end
++ end
++end
++exit(1) if failed
++
++# Add deps from .so
++package_files.each do |(pkg,files)| files.each do |file|
++ case file
++ when /\/nkf\.so$/
++ files_requires[file]= files_requires[file] + ["enc/encdb"]
++ end
++end; end
++
++puts "Merging requirements into packages..."
++package_requires = Hash[packages.collect { |pkg| [pkg, package_files[pkg].collect {|file| files_requires[file] }.inject([],:+).uniq] }]
++
++weak_dependency=Hash.new([])
++weak_dependency.merge!({
++"ruby-misc"=>["ruby-openssl","ruby-fiddle"], #securerandom.rb
++"ruby-debuglib"=>["ruby-readline"], #debug.rb
++"ruby-drb"=>["ruby-openssl"], #drb/ssl.rb
++"ruby-irb"=>["ruby-rdoc", "ruby-readline"], #irb/cmd/help.rb
++"ruby-gems"=>["ruby-openssl","ruby-io-console","ruby-webrick"], #rubygems/commands/cert_command.rb rubygems/user_interaction.rb rubygems/server.rb
++"ruby-mkmf"=>["ruby-webrick"], #un.rb
++"ruby-net"=>["ruby-openssl","ruby-io-console","ruby-zlib"], #net/*.rb
++"ruby-optparse"=>["ruby-uri","ruby-datetime"], #optparse/date.rb optparse/uri.rb
++"ruby-rake"=>["ruby-net","ruby-gems"], #rake/contrib/ftptools.rb /usr/bin/rake
++"ruby-rdoc"=>["ruby-gems","ruby-readline","ruby-webrick", #/usr/bin/rdoc and others
++ "ruby-io-console"], #rdoc/stats/normal.rb
++"ruby-webrick"=>["ruby-openssl"], #webrick/ssl.rb
++})
++
++puts "Preloading gems..."
++Gem::Specification.all.each{ |x| gem x.name }
++
++puts "Looking for package dependencies..."
++package_provides = {}
++package_dependencies = Hash.new([])
++package_requires.each do
++ |(pkg,requires)|
++
++ requires.each do
++ |require|
++ if package_provides.include?(require)
++ found = package_provides[require]
++ else
++ found = package_files.detect {|(pkg,files)| files.detect {|file| $:.detect {|path| "#{path}/#{require}" == file.gsub(/\.(so|rb)$/,"") } } }
++ if not found
++ $stderr.puts "#{pkg}: Nothing provides #{require}"
++ failed = true
++ next
++ end
++ found = found.first
++ package_provides[require]=found
++ end
++ if weak_dependency[pkg].include?(found)
++ puts "#{pkg}: #{found} provides #{require} (ignored WEAK dep)"
++ else
++ puts "#{pkg}: #{found} provides #{require}"
++ package_dependencies[pkg]=package_dependencies[pkg] + [found]
++ end
++ end
++end
++if failed
++ puts "There is some missing requirements not mapped to files in packages."
++ puts "Please, fix the missing files or ignore them on require_ignore var"
++ exit(1)
++end
++
++package_dependencies.each do
++ |(pkg,deps)|
++ package_dependencies[pkg]=deps.uniq.sort - [pkg]
++end
++
++puts "Expanding dependencies..."
++begin
++ changed=false
++ package_dependencies.each do
++ |(pkg,deps)|
++
++ next if deps.empty?
++
++ deps_new = deps.collect {|dep| [dep] + package_dependencies[dep] }.inject([],:+).uniq.sort
++ if not deps == deps_new
++ puts "#{pkg}: #{deps.join(",")}"
++ puts "#{pkg}: #{deps_new.join(",")}"
++ package_dependencies[pkg]=deps_new
++ changed=true
++ end
++ end
++end if not changed
++
++puts "Checking for mutual dependencies..."
++package_dependencies.each do
++ |(pkg,deps)|
++ if deps.include? pkg
++ $stderr.puts "#{pkg}: Cycle dependency detected! "
++ failed = true
++ end
++end
++exit(1) if failed
++
++puts "Removing redundant dependencies..."
++package_dependencies.each do
++ |(pkg,deps)|
++ package_dependencies[pkg]=deps.uniq - [pkg]
++end
++
++package_dependencies2=package_dependencies.dup
++package_dependencies.each do
++ |(pkg,deps)|
++
++ # Ignore dependencies that are aready required by another dependency
++ deps_clean = deps.reject {|dep_suspect| deps.detect {|dep_provider|
++ if package_dependencies[dep_provider].include?(dep_suspect)
++ puts "#{pkg}: #{dep_suspect} is already required by #{dep_provider}"
++ true
++ end
++ } }
++
++ if not deps==deps_clean
++ puts "before: #{deps.join(",")}"
++ puts "after: #{deps_clean.join(",")}"
++ package_dependencies2[pkg]=deps_clean
++ end
++end
++package_dependencies=package_dependencies2
++
++puts "Checking current packages dependencies..."
++ok=true
++package_dependencies.each do
++ |(pkg,deps)|
++ current_deps=`opkg depends #{pkg} | sed -r -e '1d;s/^[[:blank:]]*//'`.split("\n")
++ current_deps.reject!{|dep| dep =~ /^lib/ }
++ current_deps -= ["ruby"]
++
++ extra_dep = current_deps - deps
++ $stderr.puts "Package #{pkg} does not need to depend on #{extra_dep.join(" ")} " if not extra_dep.empty?
++ missing_dep = deps - current_deps
++ $stderr.puts "Package #{pkg} needs to depend on #{missing_dep.join(" ")} " if not missing_dep.empty?
++
++ if not extra_dep.empty? or not missing_dep.empty?
++ $stderr.puts "define Package/#{pkg}"
++ $stderr.puts " DEPENDS:=ruby#{([""] +deps).join(" +")}"
++ ok=false
++ end
++end
++
++puts "All dependencies are OK." if ok
++
++
++__END__
++
++puts RUBY_VERSION, RUBY_PLATFORM
++puts 123
++
++puts Object.contants
++
++#RUBY_VER=2.1
++#RUBY_ARCH=i486-linux-gnu
++#RUBYLIB=/usr/lib/ruby/$RUBY_VER/
++#RUBYLIB_A=/usr/lib/ruby/$RUBY_ARCH/$RUBY_VER/
+diff --git a/feeds/packages/lang/ruby/ruby_missingfiles b/feeds/packages/lang/ruby/ruby_missingfiles
+new file mode 100644
+index 0000000..f05e9fe
+--- /dev/null
++++ b/feeds/packages/lang/ruby/ruby_missingfiles
+@@ -0,0 +1,20 @@
++#!/bin/bash
++#
++
++function list_staging_files {
++ cd staging_dir/target-*/; find \
++ \( \( -name "root-x86" -or -name "packages" -or -name "stamp" -or -name "pkginfo" \) -prune \) -or -true \
++ \( -path "*ruby*" -or -name "erb" -or -name "gem" -or -name "irb" -or -name "rake" -or -name "rdoc" -or -name "ri" -or -name "testrb" \) \
++ -print | sort
++}
++
++function list_ipkg_files {
++ for OPKG in bin/*/packages/packages/*ruby*; do
++ tar --to-stdout -xzf "$OPKG" ./data.tar.gz | tar tz | sed -e 's%/$%%'
++ done | sort -u
++}
++
++
++echo " Staging Packages"
++diff -y <(list_staging_files) <(list_ipkg_files)
++
+diff --git a/feeds/packages/lang/simplejson/Makefile b/feeds/packages/lang/simplejson/Makefile
+new file mode 100644
+index 0000000..89da1b2
+--- /dev/null
++++ b/feeds/packages/lang/simplejson/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=simplejson
++PKG_VERSION:=3.6.5
++PKG_RELEASE:=1
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://pypi.python.org/packages/source/s/simplejson/
++PKG_MD5SUM:=b65dc21c7aaad14c6b4ad0d9179e437d
++PKG_BUILD_DEPENDS:=python python-setuptools
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/simplejson
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++ TITLE:=Simple, fast, extensible JSON encoder/decoder for Python
++ URL:=http://simplejson.readthedocs.org/
++ DEPENDS:=+python
++endef
++
++define Package/simplejson/description
++ Simple, fast, extensible JSON encoder/decoder for Python
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,,install --prefix=/usr --root=$(PKG_INSTALL_DIR))
++endef
++
++define Package/simplejson/install
++ $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)
++ $(CP) \
++ $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
++ $(1)$(PYTHON_PKG_DIR)
++endef
++
++$(eval $(call BuildPackage,simplejson))
+diff --git a/feeds/packages/lang/uuid/Makefile b/feeds/packages/lang/uuid/Makefile
+new file mode 100644
+index 0000000..a093e66
+--- /dev/null
++++ b/feeds/packages/lang/uuid/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=uuid
++PKG_VERSION:=0.2.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://github.com/Tieske/uuid.git
++PKG_SOURCE_VERSION:=version_$(PKG_VERSION)
++
++PKG_MAINTAINER:=Amr Hassan <amr.hassan@gmail.com>
++PKG_LICENSE=Apache-2.0
++
++LUA_MODULE_PATH:=/usr/lib/lua
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/uuid
++ SUBMENU:=Lua
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=uuid
++ URL:=https://github.com/Tieske/uuid
++ DEPENDS:=+lua +luasocket
++endef
++
++define Package/uuid/description
++ A pure Lua uuid generator
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/uuid/install
++ $(INSTALL_DIR) $(1)/$(LUA_MODULE_PATH)
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/uuid.lua $(1)/$(LUA_MODULE_PATH)/uuid.lua
++endef
++
++$(eval $(call BuildPackage,uuid))
+diff --git a/feeds/packages/lang/vala/Makefile b/feeds/packages/lang/vala/Makefile
+new file mode 100644
+index 0000000..0dc64b7
+--- /dev/null
++++ b/feeds/packages/lang/vala/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=vala
++PKG_VERSION:=0.29.3
++PKG_RELEASE:=1
++PKG_LICENSE:=LGPL-2.1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@GNOME/vala/0.29/
++PKG_MD5SUM:=939a2a9c20974db9badbc3f910fcae63
++
++PKG_BUILD_DEPENDS:=glib2 glib2/host vala/host
++HOST_BUILD_DEPENDS:=glib2/host
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++TARGET_LDFLAGS+=\
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib
++
++define Package/vala
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=C-sharp like language for the GObject system
++ URL:=https://wiki.gnome.org/Projects/Vala
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++endef
++
++define Package/vala/description
++Vala is a C-sharp like language for the GObject system. This package contains
++the Vala-to-C compiler.
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) \
++ $(1)/usr/share/vala-0.30/vapi \
++ $(1)/usr/lib \
++ $(1)/usr/share/pkgconfig \
++ $(1)/usr/bin
++
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/share/vala-0.30/vapi/* \
++ $(1)/usr/share/vala-0.30/vapi
++
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/libvala-0.30.{so*,la} \
++ $(1)/usr/lib
++
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/{vala,vala-0.30,valac,valac-0.30,vapicheck,vapicheck-0.30,vapigen,vapigen-0.30,vala-gen-introspect,vala-gen-introspect-0.30} \
++ $(1)/usr/bin
++
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/share/pkgconfig/*.pc \
++ $(1)/usr/share/pkgconfig
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,vala))
+diff --git a/feeds/packages/libs/alsa-lib/Makefile b/feeds/packages/libs/alsa-lib/Makefile
+new file mode 100644
+index 0000000..c4d036e
+--- /dev/null
++++ b/feeds/packages/libs/alsa-lib/Makefile
+@@ -0,0 +1,94 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=alsa-lib
++PKG_VERSION:=1.0.29
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=ftp://ftp.alsa-project.org/pub/lib/ \
++ http://alsa.cybermirror.org/lib/
++PKG_MD5SUM:=de67e0eca72474d6b1121037dafe1024
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>, \
++ Peter Wagner <tripolar@gmx.at>
++
++PKG_LICENSE:=LGPLv2.1 GPLv2
++PKG_LICENSE_FILES:=COPYING aserver/COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_USE_MIPS16:=0
++PKG_CHECK_FORMAT_SECURITY:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/alsa-lib
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=ALSA (Advanced Linux Sound Architecture) library
++ URL:=http://www.alsa-project.org/
++ DEPENDS:=@AUDIO_SUPPORT +kmod-sound-core +libpthread +librt
++endef
++
++define Package/alsa-lib/description
++ This is the library package for alsa, needed by some userspace programs.
++ You must have enabled the ALSA support in the kernel.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --disable-python \
++ --disable-debug \
++ --without-debug \
++ $(SOFT_FLOAT_CONFIG_OPTION) \
++ --with-versioned=no \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/alsa \
++ $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libasound.{la,so*} \
++ $(1)/usr/lib/
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/alsa.pc \
++ $(1)/usr/lib/pkgconfig/
++
++ $(INSTALL_DIR) $(1)/usr/share/aclocal
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/share/aclocal/alsa.m4 \
++ $(1)/usr/share/aclocal/
++endef
++
++define Package/alsa-lib/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libasound.so.* \
++ $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/share/alsa/{cards,pcm}
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/share/alsa/alsa.conf \
++ $(1)/usr/share/alsa/
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/share/alsa/pcm/* \
++ $(1)/usr/share/alsa/pcm/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/share/alsa/cards/* \
++ $(1)/usr/share/alsa/cards/
++endef
++
++$(eval $(call BuildPackage,alsa-lib))
+diff --git a/feeds/packages/libs/alsa-lib/patches/001-link_fix.patch b/feeds/packages/libs/alsa-lib/patches/001-link_fix.patch
+new file mode 100644
+index 0000000..001a8bc
+--- /dev/null
++++ b/feeds/packages/libs/alsa-lib/patches/001-link_fix.patch
+@@ -0,0 +1,22 @@
++--- a/src/Makefile.in
+++++ b/src/Makefile.in
++@@ -418,7 +418,7 @@ clean-libLTLIBRARIES:
++ rm -f $${locs}; \
++ }
++ libasound.la: $(libasound_la_OBJECTS) $(libasound_la_DEPENDENCIES) $(EXTRA_libasound_la_DEPENDENCIES)
++- $(AM_V_CCLD)$(libasound_la_LINK) -rpath $(libdir) $(libasound_la_OBJECTS) $(libasound_la_LIBADD) $(LIBS)
+++ $(AM_V_CCLD)$(libasound_la_LINK) -rpath $(DESTDIR)$(libdir) $(libasound_la_OBJECTS) $(libasound_la_LIBADD) $(LIBS)
++
++ mostlyclean-compile:
++ -rm -f *.$(OBJEXT)
++--- a/src/pcm/scopes/Makefile.in
+++++ b/src/pcm/scopes/Makefile.in
++@@ -348,7 +348,7 @@ clean-pkglibLTLIBRARIES:
++ rm -f $${locs}; \
++ }
++ scope-level.la: $(scope_level_la_OBJECTS) $(scope_level_la_DEPENDENCIES) $(EXTRA_scope_level_la_DEPENDENCIES)
++- $(AM_V_CCLD)$(scope_level_la_LINK) -rpath $(pkglibdir) $(scope_level_la_OBJECTS) $(scope_level_la_LIBADD) $(LIBS)
+++ $(AM_V_CCLD)$(scope_level_la_LINK) -rpath $(DESTDIR)$(pkglibdir) $(scope_level_la_OBJECTS) $(scope_level_la_LIBADD) $(LIBS)
++
++ mostlyclean-compile:
++ -rm -f *.$(OBJEXT)
+diff --git a/feeds/packages/libs/alsa-lib/patches/002-remove_cross_compile_guess.patch b/feeds/packages/libs/alsa-lib/patches/002-remove_cross_compile_guess.patch
+new file mode 100644
+index 0000000..d8f9f12
+--- /dev/null
++++ b/feeds/packages/libs/alsa-lib/patches/002-remove_cross_compile_guess.patch
+@@ -0,0 +1,23 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -27,20 +27,6 @@ AC_PREFIX_DEFAULT(/usr)
++
++ dnl Checks for programs.
++
++-dnl try to gues cross-compiler if not set
++-if test "x$host" != "x$build" -a -z "`echo $CC | grep -e '-gcc'`";
++-then
++- AC_MSG_CHECKING(for cross-compiler)
++-
++- which ${program_prefix}gcc >/dev/null 2>&1 && CC=${program_prefix}gcc
++- which ${host_cpu}-${host_os}-gcc >/dev/null 2>&1 \
++- && CC=${host_cpu}-${host_os}-gcc
++- which ${host_cpu}-${host_vendor}-${host_os}-gcc >/dev/null 2>&1 \
++- && CC=${host_cpu}-${host_vendor}-${host_os}-gcc
++-
++- AC_MSG_RESULT($CC)
++-fi
++-
++ CFLAGS="$CFLAGS -D_GNU_SOURCE"
++
++
+diff --git a/feeds/packages/libs/alsa-lib/patches/005-fix_include_file_redirect_warnings.patch b/feeds/packages/libs/alsa-lib/patches/005-fix_include_file_redirect_warnings.patch
+new file mode 100644
+index 0000000..8230c02
+--- /dev/null
++++ b/feeds/packages/libs/alsa-lib/patches/005-fix_include_file_redirect_warnings.patch
+@@ -0,0 +1,142 @@
++--- a/src/seq/seq.c
+++++ b/src/seq/seq.c
++@@ -777,7 +777,7 @@ void event_filter(snd_seq_t *seq, snd_se
++
++ */
++
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include "seq_local.h"
++
++ /****************************************************************************
++--- a/aserver/aserver.c
+++++ b/aserver/aserver.c
++@@ -20,7 +20,7 @@
++
++ #include <sys/shm.h>
++ #include <sys/socket.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include <sys/un.h>
++ #include <sys/uio.h>
++ #include <stdio.h>
++--- a/include/asoundlib-head.h
+++++ b/include/asoundlib-head.h
++@@ -35,6 +35,6 @@
++ #include <string.h>
++ #include <fcntl.h>
++ #include <assert.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include <errno.h>
++ #include <stdarg.h>
++--- a/include/asoundlib.h
+++++ b/include/asoundlib.h
++@@ -35,7 +35,7 @@
++ #include <string.h>
++ #include <fcntl.h>
++ #include <assert.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include <errno.h>
++ #include <stdarg.h>
++ #include <endian.h>
++--- a/include/local.h
+++++ b/include/local.h
++@@ -47,7 +47,7 @@
++ #error Header defining endianness not defined
++ #endif
++ #include <stdarg.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include <sys/types.h>
++ #include <errno.h>
++ #include <linux/types.h>
++--- a/src/control/control.c
+++++ b/src/control/control.c
++@@ -48,7 +48,7 @@ and IEC958 structure.
++ #include <string.h>
++ #include <fcntl.h>
++ #include <signal.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include "control_local.h"
++
++ /**
++--- a/src/control/control_shm.c
+++++ b/src/control/control_shm.c
++@@ -27,7 +27,7 @@
++ #include <fcntl.h>
++ #include <sys/shm.h>
++ #include <sys/socket.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include <sys/un.h>
++ #include <sys/uio.h>
++ #include <sys/mman.h>
++--- a/src/pcm/pcm.c
+++++ b/src/pcm/pcm.c
++@@ -634,7 +634,7 @@ playback devices.
++ #include <stdarg.h>
++ #include <signal.h>
++ #include <ctype.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include <sys/shm.h>
++ #include <sys/mman.h>
++ #include <limits.h>
++--- a/src/pcm/pcm_direct.c
+++++ b/src/pcm/pcm_direct.c
++@@ -30,7 +30,7 @@
++ #include <grp.h>
++ #include <sys/ioctl.h>
++ #include <sys/mman.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include <sys/shm.h>
++ #include <sys/sem.h>
++ #include <sys/wait.h>
++--- a/src/pcm/pcm_mmap.c
+++++ b/src/pcm/pcm_mmap.c
++@@ -21,7 +21,7 @@
++ #include <stdio.h>
++ #include <malloc.h>
++ #include <string.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include <sys/mman.h>
++ #include <sys/shm.h>
++ #include "pcm_local.h"
++--- a/src/pcm/pcm_share.c
+++++ b/src/pcm/pcm_share.c
++@@ -34,7 +34,7 @@
++ #include <signal.h>
++ #include <math.h>
++ #include <sys/socket.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include <sys/shm.h>
++ #include <pthread.h>
++ #include "pcm_local.h"
++--- a/src/pcm/pcm_shm.c
+++++ b/src/pcm/pcm_shm.c
++@@ -36,7 +36,7 @@
++ #include <sys/ioctl.h>
++ #include <sys/shm.h>
++ #include <sys/socket.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include <sys/un.h>
++ #include <sys/mman.h>
++ #include <netinet/in.h>
++--- a/src/shmarea.c
+++++ b/src/shmarea.c
++@@ -22,7 +22,7 @@
++ #include <malloc.h>
++ #include <string.h>
++ #include <errno.h>
++-#include <sys/poll.h>
+++#include <poll.h>
++ #include <sys/mman.h>
++ #include <sys/shm.h>
++ #include "list.h"
+diff --git a/feeds/packages/libs/apr-util/Makefile b/feeds/packages/libs/apr-util/Makefile
+new file mode 100644
+index 0000000..d5178d5
+--- /dev/null
++++ b/feeds/packages/libs/apr-util/Makefile
+@@ -0,0 +1,77 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=apr-util
++PKG_VERSION:=1.5.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://archive.apache.org/dist/apr/
++PKG_MD5SUM:=2202b18f269ad606d70e1864857ed93c
++PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
++PKG_LICENSE:=Apache License
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=aclocal.m4 build/ltmain.sh
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/libaprutil
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libapr +libexpat +libsqlite3 +libuuid $(ICONV_DEPENDS)
++ TITLE:=Apache Portable Runtime Utility Library
++ URL:=http://apr.apache.org/
++endef
++
++TARGET_CFLAGS += $(FPIC)
++TARGET_CPPFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
++
++CONFIGURE_ARGS += \
++ --with-pgsql=no \
++ --with-apr="$(STAGING_DIR)/usr/bin/apr-1-config" \
++ --with-expat="$(STAGING_DIR)/usr" \
++ --without-sqlite2 \
++ --with-sqlite3="$(STAGING_DIR)/usr" \
++ --with-iconv="$(ICONV_PREFIX)" \
++
++CONFIGURE_VARS += \
++ ac_cv_file_dbd_apr_dbd_mysql_c=no \
++ ac_cv_path_ODBC_CONFIG= \
++ APR_BUILD_DIR="$(STAGING_DIR)/usr/share/build-1" \
++
++MAKE_FLAGS += \
++ APRUTIL_LIBS="-lsqlite3 $(TARGET_LDFLAGS) -lexpat $(if $(ICONV_FULL),-liconv) -lapr-1 -luuid -lm -lcrypt" \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin $(1)/usr/include/apr-1/ $(1)/usr/lib $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/apu-1-config \
++ $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/apr-1/* \
++ $(1)/usr/include/apr-1/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libaprutil-1.{la,a,so*} \
++ $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/apr-util-1.pc \
++ $(1)/usr/lib/pkgconfig/
++ $(SED) 's, -e \"s -I$$$$prefix/lib g\",,g' $(1)/usr/bin/apu-1-config
++ $(SED) 's,^libdir=\"$$$${exec_prefix}/lib,libdir=\"$(STAGING_DIR)/usr/lib,g' $(1)/usr/bin/apu-1-config
++ $(SED) 's,^includedir=\"$$$${prefix}/include/,includedir=\"$(STAGING_DIR)/usr/include/,g' $(1)/usr/bin/apu-1-config
++ $(SED) 's,-L$$$$libdir,,g' $(1)/usr/bin/apu-1-config
++ $(SED) 's,-R$$$$libdir,,g' $(1)/usr/bin/apu-1-config
++endef
++
++define Package/libaprutil/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libaprutil-1.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libaprutil))
+diff --git a/feeds/packages/libs/apr-util/patches/001-automake-compat.patch b/feeds/packages/libs/apr-util/patches/001-automake-compat.patch
+new file mode 100644
+index 0000000..20c4cf2
+--- /dev/null
++++ b/feeds/packages/libs/apr-util/patches/001-automake-compat.patch
+@@ -0,0 +1,21 @@
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -8,6 +8,7 @@ APRUTIL_MAJOR_VERSION=@APRUTIL_MAJOR_VER
++ APRUTIL_DOTTED_VERSION=@APRUTIL_DOTTED_VERSION@
++
++ srcdir = @srcdir@
+++top_builddir = @top_builddir@
++ VPATH = @srcdir@
++
++ INCLUDES = @APRUTIL_PRIV_INCLUDES@ @APR_INCLUDES@ @APRUTIL_INCLUDES@
++--- a/configure.in
+++++ b/configure.in
++@@ -41,6 +41,8 @@ AC_SUBST(APU_CONFIG_LOCATION)
++ AC_CANONICAL_SYSTEM
++
++ AC_PROG_INSTALL
+++AC_PROG_LIBTOOL
+++LT_INIT
++
++ # Use -no-install or -no-fast-install to link the test
++ # programs on all platforms but Darwin, where it would cause
+diff --git a/feeds/packages/libs/apr/Makefile b/feeds/packages/libs/apr/Makefile
+new file mode 100644
+index 0000000..d61d31f
+--- /dev/null
++++ b/feeds/packages/libs/apr/Makefile
+@@ -0,0 +1,79 @@
++#
++# Copyright (C) 2007-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=apr
++PKG_VERSION:=1.5.2
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://mirrors.ibiblio.org/apache/apr/
++PKG_MD5SUM:=4e9769f3349fe11fc0a5e1b224c236aa
++PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
++PKG_LICENSE:=Apache License
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=aclocal.m4 build/ltmain.sh
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libapr
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libpthread +librt +libuuid
++ TITLE:=Apache Portable Runtime Library
++ URL:=http://apr.apache.org/
++endef
++
++TARGET_CFLAGS += $(FPIC)
++TARGET_CPPFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
++
++CONFIGURE_ARGS += \
++ --with-devrandom=/dev/urandom \
++ --disable-dso \
++ $(call autoconf_bool,CONFIG_IPV6,ipv6)
++
++# XXX: ac_cv_sizeof_struct_iovec=1 is just to trick configure
++CONFIGURE_VARS += \
++ ac_cv_sizeof_struct_iovec=1 \
++ ac_cv_struct_rlimit=yes \
++ apr_cv_process_shared_works=no \
++ apr_cv_mutex_robust_shared=no \
++ apr_cv_tcp_nodelay_with_cork=yes \
++ apr_cv_use_lfs64=yes \
++ LDFLAGS="$$$$LDFLAGS -lpthread" \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin $(1)/usr/include/apr-1 $(1)/usr/lib $(1)/usr/lib/pkgconfig $(1)/usr/share/build-1
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/apr-1-config \
++ $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/apr-1/* \
++ $(1)/usr/include/apr-1/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libapr-1.{la,a,so*} \
++ $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/apr-1.pc \
++ $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/build-1/* \
++ $(1)/usr/share/build-1/
++ $(SED) 's,^datadir=\"/usr/share\",datadir=\"$(STAGING_DIR)/usr/share\",g' $(1)/usr/bin/apr-1-config
++ $(SED) 's,^installbuilddir=\"/usr/share/build-1\",installbuilddir=\"$(STAGING_DIR)/usr/share/build-1\",g' $(1)/usr/bin/apr-1-config
++ $(SED) 's,^libdir=\"$$$${exec_prefix}/lib,libdir=\"$(STAGING_DIR)/usr/lib,g' $(1)/usr/bin/apr-1-config
++ $(SED) 's,^includedir=\"$$$${prefix}/include/,includedir=\"$(STAGING_DIR)/usr/include/,g' $(1)/usr/bin/apr-1-config
++ $(SED) 's,-L$$$$libdir,,g' $(1)/usr/bin/apr-1-config
++ $(SED) 's,-R$$$$libdir,,g' $(1)/usr/bin/apr-1-config
++ $(SED) 's,/usr/share/build-1,$(STAGING_DIR)/usr/share/build-1,g' $(1)/usr/share/build-1/apr_rules.mk
++endef
++
++define Package/libapr/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libapr-1.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libapr))
+diff --git a/feeds/packages/libs/apr/patches/001-autoconf-compat.patch b/feeds/packages/libs/apr/patches/001-autoconf-compat.patch
+new file mode 100644
+index 0000000..acc94fc
+--- /dev/null
++++ b/feeds/packages/libs/apr/patches/001-autoconf-compat.patch
+@@ -0,0 +1,26 @@
++Index: apr-1.5.2/Makefile.in
++===================================================================
++--- apr-1.5.2.orig/Makefile.in
+++++ apr-1.5.2/Makefile.in
++@@ -3,6 +3,7 @@ srcdir=@srcdir@
++ VPATH=@srcdir@
++ top_srcdir=@apr_srcdir@
++ top_blddir=@apr_builddir@
+++top_builddir=@top_builddir@
++
++ #
++ # APR (Apache Portable Runtime) library Makefile.
++Index: apr-1.5.2/configure.in
++===================================================================
++--- apr-1.5.2.orig/configure.in
+++++ apr-1.5.2/configure.in
++@@ -245,9 +245,6 @@ case $host in
++ gcc $CFLAGS $CPPFLAGS -o $LIBTOOL.exe $LIBTOOL.c
++ ;;
++ *)
++- if test "x$LTFLAGS" = "x"; then
++- LTFLAGS='--silent'
++- fi
++ if test "$experimental_libtool" = "yes"; then
++ # Use a custom-made libtool replacement
++ echo "using jlibtool"
+diff --git a/feeds/packages/libs/apr/patches/101-fix_apr_time_now.patch b/feeds/packages/libs/apr/patches/101-fix_apr_time_now.patch
+new file mode 100644
+index 0000000..6ad14a3
+--- /dev/null
++++ b/feeds/packages/libs/apr/patches/101-fix_apr_time_now.patch
+@@ -0,0 +1,13 @@
++https://dev.openwrt.org/ticket/9287
++
++--- a/time/unix/time.c
+++++ b/time/unix/time.c
++@@ -75,7 +75,7 @@ APR_DECLARE(apr_time_t) apr_time_now(voi
++ {
++ struct timeval tv;
++ gettimeofday(&tv, NULL);
++- return tv.tv_sec * APR_USEC_PER_SEC + tv.tv_usec;
+++ return tv.tv_sec * (apr_time_t)APR_USEC_PER_SEC + (apr_time_t)tv.tv_usec;
++ }
++
++ static void explode_time(apr_time_exp_t *xt, apr_time_t t,
+diff --git a/feeds/packages/libs/apr/patches/201-upgrade-and-fix-1.5.1.patch b/feeds/packages/libs/apr/patches/201-upgrade-and-fix-1.5.1.patch
+new file mode 100644
+index 0000000..87cd546
+--- /dev/null
++++ b/feeds/packages/libs/apr/patches/201-upgrade-and-fix-1.5.1.patch
+@@ -0,0 +1,51 @@
++Makefile.in: fix cross compiling failed
++
++The tools/gen_test_char was invoked at build time,
++and it didn't work for the cross compiling, so we
++compile it with $BUILDCC.
++
++Remove the 'tools' dir creation, it always existed.
++And it caused gen_test_char unexpected rebuilt at
++do_install time.
++
++Upstream-Status: inappropriate [oe specific]
++
++Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
++---
++ Makefile.in | 10 ++--------
++ 1 file changed, 2 insertions(+), 8 deletions(-)
++
++Index: apr-1.5.2/Makefile.in
++===================================================================
++--- apr-1.5.2.orig/Makefile.in
+++++ apr-1.5.2/Makefile.in
++@@ -20,7 +20,7 @@ INCDIR=./include
++ OSDIR=$(top_srcdir)/include/arch/@OSDIR@
++ DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@
++ INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) -I$(top_srcdir)/include/arch/@DEFAULT_OSDIR@ -I$(top_srcdir)/include -I$(top_srcdir)/include/private -I$(top_blddir)/include/private
++-
+++BUILDCC=gcc
++ #
++ # Macros for target determination
++ #
++@@ -47,7 +47,6 @@ LT_VERSION = @LT_VERSION@
++
++ CLEAN_TARGETS = apr-config.out apr.exp exports.c export_vars.c .make.dirs \
++ build/apr_rules.out tools/gen_test_char@EXEEXT@ \
++- tools/gen_test_char.o tools/gen_test_char.lo \
++ include/private/apr_escape_test_char.h
++ DISTCLEAN_TARGETS = config.cache config.log config.status \
++ include/apr.h include/arch/unix/apr_private.h \
++@@ -135,9 +134,9 @@ tools/gen_test_char.lo: tools/gen_test_c
++ $(APR_MKDIR) tools
++ $(LT_COMPILE)
++
++-tools/gen_test_char@EXEEXT@: $(OBJECTS_gen_test_char)
++- $(LINK_PROG) $(OBJECTS_gen_test_char) $(ALL_LIBS)
++-
+++tools/gen_test_char@EXEEXT@: tools/gen_test_char.c
+++ $(BUILDCC) $(CFLAGS_FOR_BUILD) $< -o $@
+++
++ include/private/apr_escape_test_char.h: tools/gen_test_char@EXEEXT@
++ $(APR_MKDIR) include/private
++ tools/gen_test_char@EXEEXT@ > $@
+diff --git a/feeds/packages/libs/avahi/Makefile b/feeds/packages/libs/avahi/Makefile
+new file mode 100644
+index 0000000..2d1a64b
+--- /dev/null
++++ b/feeds/packages/libs/avahi/Makefile
+@@ -0,0 +1,404 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=avahi
++PKG_VERSION:=0.6.31
++PKG_RELEASE:=12
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://avahi.org/download/
++PKG_MD5SUM:=2f22745b8f7368ad5a0a3fddac343f2d
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_BUILD_DEPENDS:=libexpat libdaemon libgdbm intltool/host libpthread dbus
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=autogen.sh
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++ifeq ($(BUILD_VARIANT),dbus)
++PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)/dbus/$(PKG_NAME)-$(PKG_VERSION)
++else
++PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)/nodbus/$(PKG_NAME)-$(PKG_VERSION)
++endif
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/avahi/Default
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=An mDNS/DNS-SD implementation
++ URL:=http://www.avahi.org/
++endef
++
++define Package/avahi/Default/description
++ Avahi is an mDNS/DNS-SD (aka RendezVous/Bonjour/ZeroConf)
++ implementation (library). It facilitates
++ service discovery on a local network -- this means that
++ you can plug your laptop or computer into a network and
++ instantly be able to view other people who you can chat with,
++ find printers to print to or find files being shared.
++ This kind of technology is already found in MacOS X
++ (branded 'Rendezvous', 'Bonjour' and sometimes 'ZeroConf')
++ and is very convenient.
++endef
++
++define Package/libavahi/Default
++ $(call Package/avahi/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ PROVIDES:=libavahi
++ DEPENDS:=+libpthread
++endef
++
++define Package/libavahi/description
++$(call Package/avahi/Default/description)
++ .
++ The libavahi package contains the mDNS/DNS-SD shared libraries,
++ used by other programs. Specifically, it provides
++ libavahi-core and libavahi-common libraries.
++endef
++
++define Package/avahi-autoipd
++ $(call Package/avahi/Default)
++ SUBMENU:=IP Addresses and Names
++ DEPENDS:=+libdaemon
++ TITLE:=IPv4LL network address configuration daemon
++endef
++
++define Package/avahi-autoipd/description
++$(call Package/avahi/Default/description)
++ .
++ This package implements IPv4LL, "Dynamic Configuration of IPv4 Link-Local
++ Addresses" (IETF RFC3927), a protocol for automatic IP address configuration
++ from the link-local 169.254.0.0/16 range without the need for a central
++ server. It is primarily intended to be used in ad-hoc networks which lack a
++ DHCP server.
++endef
++
++define Package/avahi-dbus-daemon
++ $(call Package/avahi/Default)
++ PROVIDES:=avahi-daemon
++ VARIANT:=dbus
++ SUBMENU:=IP Addresses and Names
++ DEPENDS:=+libavahi-dbus-support +libexpat +librt +libdaemon
++ TITLE+= (daemon)
++endef
++
++define Package/avahi-nodbus-daemon
++ $(call Package/avahi/Default)
++ PROVIDES:=avahi-daemon
++ VARIANT:=nodbus
++ SUBMENU:=IP Addresses and Names
++ DEPENDS:=+libavahi-nodbus-support +libexpat +librt +libdaemon
++ TITLE+= (daemon)
++ USERID:=avahi=105:avahi=105
++endef
++
++define Package/avahi-daemon/description
++$(call Package/avahi/Default/description)
++ .
++ This package contains an mDNS/DNS-SD daemon.
++endef
++
++Package/avahi-dbus-daemon/description=$(Package/avahi-daemon/description)
++Package/avahi-nodbus-daemon/description=$(Package/avahi-daemon/description)
++
++define Package/avahi-daemon/conffiles
++/etc/avahi/avahi-daemon.conf
++endef
++
++Package/avahi-dbus-daemon/conffiles=$(Package/avahi-daemon/conffiles)
++Package/avahi-nodbus-daemon/conffiles=$(Package/avahi-daemon/conffiles)
++
++define Package/avahi-daemon-service-http
++ $(call Package/avahi/Default)
++ SUBMENU:=IP Addresses and Names
++ DEPENDS:=+avahi-daemon
++ TITLE:=Announce HTTP service
++endef
++
++define Package/avahi-daemon-service-http/description
++$(call Package/avahi/Default/description)
++ .
++ This package contains the service definition for announcing HTTP service.
++endef
++
++define Package/avahi-daemon-service-http/conffiles
++/etc/avahi/services/http.service
++endef
++
++define Package/avahi-daemon-service-ssh
++ $(call Package/avahi/Default)
++ SUBMENU:=IP Addresses and Names
++ DEPENDS:=+avahi-daemon
++ TITLE:=Announce SSH service
++endef
++
++define Package/avahi-daemon-service-ssh/description
++$(call Package/avahi/Default/description)
++ .
++ This package contains the service definition for announcing SSH service.
++endef
++
++define Package/avahi-daemon-service-ssh/conffiles
++/etc/avahi/services/ssh.service
++endef
++
++define Package/avahi-dnsconfd
++ $(call Package/avahi/Default)
++ SUBMENU:=IP Addresses and Names
++ DEPENDS:=+libavahi +libdaemon +libpthread
++ TITLE:=A Unicast DNS server using avahi-daemon
++endef
++
++define Package/avahi-dnsconfd/description
++$(call Package/avahi/Default/description)
++ .
++ This package contains a Unicast DNS server from mDNS/DNS-SD configuration
++ daemon, which may be used to configure conventional DNS servers using mDNS
++ in a DHCP-like fashion. Especially useful on IPv6.
++endef
++
++define Package/libavahi-dbus-support
++ $(call Package/libavahi/Default)
++ VARIANT:=dbus
++ DEPENDS:=+dbus
++ TITLE+= (D-Bus support)
++endef
++
++define Package/libavahi-nodbus-support
++ $(call Package/libavahi/Default)
++ VARIANT:=nodbus
++ TITLE+= (No D-Bus)
++endef
++
++define Package/libavahi-dbus-support/description
++$(call Package/libavahi/description)
++ .
++ The libavahi-dbus-support package enables
++ D-Bus support in avahi, needed to support
++ the libavahi-client library and avahi-utils.
++ .
++ Selecting this package modifies the build configuration
++ so that avahi packages are built with support for D-BUS enabled;
++ it does not generate a separate binary of its own.
++ It also automatically adds the D-Bus package to the build.
++ libavahi-dbus-support is selected automatically if you select
++ libavahi-client or avahi-utils.
++endef
++
++define Package/libavahi-nodbus-support/description
++$(call Package/libavahi/description)
++ .
++ Selecting this package modifies the build configuration
++ so that avahi packages are built without support for D-BUS enabled;
++ it does not generate a separate binary of its own.
++endef
++
++define Package/libavahi-client
++ $(call Package/avahi/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ VARIANT:=dbus
++ DEPENDS:=+avahi-dbus-daemon
++ TITLE+= (libavahi-client library)
++endef
++
++define Package/libavahi-client/description
++$(call Package/avahi/Default/description)
++ .
++ This packages adds the libavahi-client library.
++ It also automatically adds the required
++ libavahi-dbus-support and the avahi-dbus-daemon packages.
++ For more information please see the avahi documentation.
++endef
++
++define Package/libavahi-compat-libdnssd
++ $(call Package/avahi/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ VARIANT:=dbus
++ DEPENDS:=+libavahi-client
++ TITLE+= (libdnssd)
++endef
++
++define Package/libavahi-compat-libdnssd/description
++$(call Package/avahi/Default/description)
++ .
++ This packages adds the libavahi-compat-libdnssd library.
++ It also automatically adds the required libavahi-client package.
++ For more information please see the avahi documentation.
++endef
++
++define Package/avahi-utils
++ $(call Package/avahi/Default)
++ SUBMENU:=IP Addresses and Names
++ VARIANT:=dbus
++ DEPENDS:=libavahi-client +libgdbm
++ TITLE+= (utilities)
++endef
++
++define Package/avahi-utils/description
++$(call Package/avahi/Default/description)
++ .
++ This packages installs the following avahi utility programs:
++ avahi-browse, avahi-publish, avahi-resolve, avahi-set-host-name.
++ It also automatically adds the required libavahi-client package.
++ For more information please see the avahi documentation.
++endef
++
++TARGET_CFLAGS += $(FPIC) -DGETTEXT_PACKAGE
++
++CONFIGURE_ARGS+= \
++ --enable-shared \
++ --enable-static \
++ --disable-glib \
++ --disable-gobject \
++ --disable-qt3 \
++ --disable-qt4 \
++ --disable-gtk \
++ --disable-gtk3 \
++ --with-xml=expat \
++ --disable-dbm \
++ --enable-gdbm \
++ --enable-libdaemon \
++ $(and $(CONFIG_PACKAGE_libavahi-compat-libdnssd),ifeq ($(BUILD_VARIANT),dbus),\
++ --enable-compat-libdns_sd) \
++ --disable-python \
++ --disable-pygtk \
++ --disable-python-dbus \
++ --disable-mono \
++ --disable-monodoc \
++ --disable-doxygen-doc \
++ --disable-doxygen-dot \
++ --disable-doxygen-man \
++ --disable-doxygen-rtf \
++ --disable-doxygen-xml \
++ --disable-doxygen-chm \
++ --disable-doxygen-chi \
++ --disable-doxygen-html \
++ --disable-doxygen-ps \
++ --disable-doxygen-pdf \
++ --disable-xmltoman \
++ --with-distro=none \
++ --with-avahi-user=nobody \
++ --with-avahi-group=nogroup \
++ --with-autoipd-user=nobody \
++ --with-autoipd-group=nogroup
++
++ifneq ($(CONFIG_SSP_SUPPORT),y)
++CONFIGURE_ARGS+= \
++ --disable-stack-protector
++endif
++
++ifeq ($(BUILD_VARIANT),dbus)
++CONFIGURE_ARGS += \
++ --enable-dbus
++else
++CONFIGURE_ARGS += \
++ --disable-dbus
++endif
++
++CONFIGURE_VARS+= \
++ CFLAGS="$$$$CFLAGS -DNDEBUG -DDISABLE_SYSTEMD" \
++ ac_cv_header_sys_capability_h=no \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libavahi-* $(1)/usr/lib/
++ifeq ($(CONFIG_PACKAGE_libavahi-compat-libdnssd)-$(BUILD_VARIANT),y-dbus)
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdns_sd* $(1)/usr/lib/
++endif
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libavahi/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libavahi-{common,core}.so.* $(1)/usr/lib/
++endef
++
++define Package/libavahi-dbus-support/install
++ $(call Package/libavahi/install,$(1))
++ $(INSTALL_DIR) $(1)/etc/dbus-1/system.d
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/dbus-1/system.d/* $(1)/etc/dbus-1/system.d
++endef
++
++Package/libavahi-nodbus-support/install=$(Package/libavahi/install)
++
++define Package/libavahi-client/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libavahi-client.so.* $(1)/usr/lib/
++endef
++
++define Package/libavahi-compat-libdnssd/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdns_sd.so.* $(1)/usr/lib/
++endef
++
++define Package/avahi-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++define Package/avahi-autoipd/install
++ $(INSTALL_DIR) $(1)/etc/avahi
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/etc/avahi/avahi-autoipd.action $(1)/etc/avahi/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/avahi-autoipd $(1)/usr/sbin/
++endef
++
++define Package/avahi-daemon/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/avahi-daemon $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/avahi
++ $(INSTALL_DATA) ./files/avahi-daemon.conf $(1)/etc/avahi/
++ # install empty service directory so that user knows where
++ # to place custom service files
++ $(INSTALL_DIR) $(1)/etc/avahi/services
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/avahi-daemon.init $(1)/etc/init.d/avahi-daemon
++endef
++
++Package/avahi-dbus-daemon/install=$(Package/avahi-daemon/install)
++Package/avahi-nodbus-daemon/install=$(Package/avahi-daemon/install)
++
++define Package/avahi-daemon-service-http/install
++ $(INSTALL_DIR) $(1)/etc/avahi/services
++ $(INSTALL_DATA) ./files/service-http $(1)/etc/avahi/services/http.service
++endef
++
++define Package/avahi-daemon-service-ssh/install
++ $(INSTALL_DIR) $(1)/etc/avahi/services
++ $(INSTALL_DATA) ./files/service-ssh $(1)/etc/avahi/services/ssh.service
++endef
++
++define Package/avahi-dnsconfd/install
++ $(INSTALL_DIR) $(1)/etc/avahi
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/etc/avahi/avahi-dnsconfd.action $(1)/etc/avahi/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/avahi-dnsconfd $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,libavahi-client))
++$(eval $(call BuildPackage,libavahi-compat-libdnssd))
++$(eval $(call BuildPackage,avahi-utils))
++$(eval $(call BuildPackage,libavahi-dbus-support))
++$(eval $(call BuildPackage,libavahi-nodbus-support))
++$(eval $(call BuildPackage,avahi-autoipd))
++$(eval $(call BuildPackage,avahi-dbus-daemon))
++$(eval $(call BuildPackage,avahi-nodbus-daemon))
++$(eval $(call BuildPackage,avahi-daemon-service-http))
++$(eval $(call BuildPackage,avahi-daemon-service-ssh))
++$(eval $(call BuildPackage,avahi-dnsconfd))
+diff --git a/feeds/packages/libs/avahi/files/avahi-daemon.conf b/feeds/packages/libs/avahi/files/avahi-daemon.conf
+new file mode 100644
+index 0000000..3ef0788
+--- /dev/null
++++ b/feeds/packages/libs/avahi/files/avahi-daemon.conf
+@@ -0,0 +1,28 @@
++[server]
++#host-name=foo
++#domain-name=local
++use-ipv4=yes
++use-ipv6=yes
++check-response-ttl=no
++use-iff-running=no
++
++[publish]
++publish-addresses=yes
++publish-hinfo=yes
++publish-workstation=no
++publish-domain=yes
++#publish-dns-servers=192.168.1.1
++#publish-resolv-conf-dns-servers=yes
++
++[reflector]
++enable-reflector=no
++reflect-ipv=no
++
++[rlimits]
++#rlimit-as=
++rlimit-core=0
++rlimit-data=4194304
++rlimit-fsize=0
++rlimit-nofile=30
++rlimit-stack=4194304
++rlimit-nproc=3
+diff --git a/feeds/packages/libs/avahi/files/avahi-daemon.init b/feeds/packages/libs/avahi/files/avahi-daemon.init
+new file mode 100644
+index 0000000..b2ae458
+--- /dev/null
++++ b/feeds/packages/libs/avahi/files/avahi-daemon.init
+@@ -0,0 +1,23 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006 OpenWrt.org
++START=61
++
++BIN=avahi-daemon
++DEFAULT=/etc/default/$BIN
++OPTIONS="-D"
++RUN_D=/var/run/$BIN
++
++start() {
++ [ -f $DEFAULT ] && . $DEFAULT
++ mkdir -p $RUN_D
++ $BIN $OPTIONS
++}
++
++stop() {
++ $BIN -k
++}
++
++reload() {
++ $BIN -r
++}
++
+diff --git a/feeds/packages/libs/avahi/files/service-http b/feeds/packages/libs/avahi/files/service-http
+new file mode 100644
+index 0000000..3262037
+--- /dev/null
++++ b/feeds/packages/libs/avahi/files/service-http
+@@ -0,0 +1,10 @@
++<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
++<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
++<service-group>
++ <name replace-wildcards="yes">%h</name>
++ <service>
++ <type>_http._tcp</type>
++ <port>80</port>
++ <txt-record>path=/</txt-record>
++ </service>
++</service-group>
+diff --git a/feeds/packages/libs/avahi/files/service-ssh b/feeds/packages/libs/avahi/files/service-ssh
+new file mode 100644
+index 0000000..b445851
+--- /dev/null
++++ b/feeds/packages/libs/avahi/files/service-ssh
+@@ -0,0 +1,9 @@
++<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
++<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
++<service-group>
++ <name replace-wildcards="yes">%h</name>
++ <service>
++ <type>_ssh._tcp</type>
++ <port>22</port>
++ </service>
++</service-group>
+diff --git a/feeds/packages/libs/avahi/patches/010-step_back_autotools-no-gettext.patch b/feeds/packages/libs/avahi/patches/010-step_back_autotools-no-gettext.patch
+new file mode 100644
+index 0000000..fab87aa
+--- /dev/null
++++ b/feeds/packages/libs/avahi/patches/010-step_back_autotools-no-gettext.patch
+@@ -0,0 +1,80 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -75,8 +75,7 @@ SUBDIRS = \
++ avahi-compat-howl \
++ avahi-autoipd \
++ avahi-ui \
++- avahi-ui-sharp \
++- po
+++ avahi-ui-sharp
++
++ DX_INPUT = \
++ $(srcdir)/avahi-common/address.h \
++--- a/avahi-python/avahi-discover/Makefile.am
+++++ b/avahi-python/avahi-discover/Makefile.am
++@@ -38,7 +38,6 @@ if HAVE_GDBM
++ pythonscripts += \
++ avahi-discover
++ desktop_DATA += avahi-discover.desktop
++-@INTLTOOL_DESKTOP_RULE@
++ avahi_discover_PYTHON += __init__.py
++ endif
++
++@@ -46,7 +45,6 @@ if HAVE_DBM
++ pythonscripts += \
++ avahi-discover
++ desktop_DATA += avahi-discover.desktop
++-@INTLTOOL_DESKTOP_RULE@
++ avahi_discover_PYTHON += __init__.py
++ endif
++
++--- a/avahi-ui/Makefile.am
+++++ b/avahi-ui/Makefile.am
++@@ -78,7 +78,6 @@ endif
++
++ bin_PROGRAMS = bssh
++ desktop_DATA += bssh.desktop bvnc.desktop
++-@INTLTOOL_DESKTOP_RULE@
++
++ bssh_SOURCES = bssh.c
++
++@@ -106,6 +105,4 @@ endif # HAVE_GLIB
++ endif
++ endif
++
++-@INTLTOOL_DESKTOP_RULE@
++-
++ CLEANFILES = $(desktop_DATA) $(desktop_DATA_in)
++--- a/configure.ac
+++++ b/configure.ac
++@@ -23,7 +23,7 @@ AC_INIT([avahi],[0.6.29],[avahi (at) lis
++ AC_CONFIG_SRCDIR([avahi-core/server.c])
++ AC_CONFIG_MACRO_DIR([common])
++ AC_CONFIG_HEADERS([config.h])
++-AM_INIT_AUTOMAKE([foreign 1.11 -Wall -Wno-portability silent-rules tar-pax])
+++AM_INIT_AUTOMAKE([foreign 1.11 -Wall -Wno-portability tar-pax])
++
++ AC_SUBST(PACKAGE_URL, [http://avahi.org/])
++
++@@ -43,8 +43,6 @@ AC_SUBST(HOWL_COMPAT_VERSION, [0.9.8])
++
++ AC_CANONICAL_HOST
++
++-AM_SILENT_RULES([yes])
++-
++ AC_CHECK_PROG([STOW], [stow], [yes], [no])
++
++ AS_IF([test "x$STOW" = "xyes" && test -d /usr/local/stow], [
++@@ -412,12 +410,6 @@ if test "x$have_kqueue" = "xyes" ; then
++ AC_DEFINE([HAVE_KQUEUE], 1, [Enable BSD kqueue() usage])
++ fi
++
++-IT_PROG_INTLTOOL([0.35.0])
++-GETTEXT_PACKAGE=avahi
++-AC_SUBST([GETTEXT_PACKAGE])
++-AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE],["$GETTEXT_PACKAGE"],[Gettext package])
++-AM_GLIB_GNU_GETTEXT
++-
++ avahilocaledir='${prefix}/${DATADIRNAME}/locale'
++ AC_SUBST(avahilocaledir)
++
+diff --git a/feeds/packages/libs/boost/Makefile b/feeds/packages/libs/boost/Makefile
+new file mode 100644
+index 0000000..92fb68b
+--- /dev/null
++++ b/feeds/packages/libs/boost/Makefile
+@@ -0,0 +1,282 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++#
++# Original Boost 1.51 Makefile by Mirko Vogt <mirko@openwrt.org>
++# Dude, this "boost" is really one of the most crude stuff I ported yet.
++#
++
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/nls.mk
++include $(INCLUDE_DIR)/target.mk
++
++PKG_NAME:=boost
++PKG_VERSION:=1_59_0
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/boost
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)_$(PKG_VERSION)
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)_$(PKG_VERSION)
++PKG_MD5SUM:=51528a0e3b33d9e10aaa311d9eb451e3
++PKG_LICENSE:=Boost Software License <http://www.boost.org/users/license.html>
++PKG_MAINTAINER:=Carlos M. Ferreira <carlosmf.pt@gmail.com>
++
++PKG_BUILD_DEPENDS += boost/host
++PKG_BUILD_PARALLEL:=0
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/host-build.mk
++
++# For now, the combination TARGET_mpc85xx&&USE_UCLIBC disables boost due to incompatibility
++define Package/boost/Default
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Boost C++ source library
++ URL:=http://www.boost.org
++ DEPENDS:=@(!(TARGET_mpc85xx&&USE_UCLIBC)) +libstdcpp +libpthread +librt
++endef
++
++define Package/boost/description/Default
++ Boost provides free peer-reviewed portable C++ source libraries
++endef
++
++BOOST_LIBS =
++
++define Package/boost-libs
++$(call Package/boost/Default)
++ TITLE+= (all libs)
++ DEPENDS+= $(BOOST_DEPENDS)
++ HIDDEN:=1
++endef
++
++define Package/boost-libs/description
++$(call Package/boost/description/Default)
++ .
++ This meta package contains only dependencies to the other libraries from
++ the boost libraries collection.
++endef
++
++# Create a meta-package of dependent libraries (for ALL)
++define Package/boost-libs/install
++ true
++endef
++
++define Package/boost/install
++ true
++endef
++
++# For now, the combination TARGET_mpc85xx&&USE_UCLIBC disables boost due to incompatibility
++define Package/boost
++ $(call Package/boost/Default)
++ TITLE+= packages
++ DEPENDS:=@(!(TARGET_mpc85xx&&USE_UCLIBC)) +ALL:boost-libs +ALL:boost-test
++endef
++
++define Package/boost/config
++ menu "Select Boost libraries"
++ depends on PACKAGE_boost
++
++ config boost-libs-all
++ bool "Include all Boost libraries"
++ select PACKAGE_boost-libs
++
++ config boost-test-pkg
++ bool "Boost test package"
++ select PACKAGE_boost-test
++
++ comment "Libraries"
++
++ $(foreach lib,$(BOOST_LIBS), \
++ config PACKAGE_boost-$(lib)
++ prompt "Boost $(lib) library"
++
++ )
++
++ endmenu
++
++endef
++
++PKG_CONFIG_DEPENDS:= CONFIG_PACKAGE_boost-test
++
++define Package/boost-test
++ $(call Package/boost/Default)
++ TITLE+= (test)
++ HIDDEN:=1
++ DEPENDS+=+boost-system +boost-timer
++endef
++
++define Build/Configure
++endef
++
++# 1: short name
++# 2: dependencies on other boost libraries (short name)
++# 3: dependencies on other packages
++define DefineBoostLibrary
++
++ BOOST_DEPENDS+= +boost-$(1)
++ BOOST_LIBS+= $(1)
++
++ PKG_CONFIG_DEPENDS+= CONFIG_PACKAGE_boost-$(1)
++
++ define Package/boost-$(1)
++ $(call Package/boost/Default)
++ TITLE+= ($(1))
++ DEPENDS+= $$(foreach lib,$(2),+boost-$$(lib)) $(3)
++ HIDDEN:=1
++ endef
++
++ define Package/boost-$(1)/description
++ $(call Package/boost/description/Default)
++ .
++ This package contains the Boost $(1) library.
++ endef
++endef
++
++$(eval $(call DefineBoostLibrary,atomic,system,))
++$(eval $(call DefineBoostLibrary,chrono,system,))
++$(eval $(call DefineBoostLibrary,container,,))
++$(eval $(call DefineBoostLibrary,context,chrono system thread,))
++$(eval $(call DefineBoostLibrary,coroutine,system chrono context thread,))
++$(eval $(call DefineBoostLibrary,date_time,,))
++#$(eval $(call DefineBoostLibrary,exception,,))
++$(eval $(call DefineBoostLibrary,filesystem,system,))
++$(eval $(call DefineBoostLibrary,graph,regex,))
++#$(eval $(call DefineBoostLibrary,graph_parallel,,))
++$(eval $(call DefineBoostLibrary,iostreams,,+zlib))
++$(eval $(call DefineBoostLibrary,locale,system,$(ICONV_DEPENDS) +@BUILD_NLS))
++$(eval $(call DefineBoostLibrary,log,system chrono date_time thread filesystem regex,))
++$(eval $(call DefineBoostLibrary,math,,))
++#$(eval $(call DefineBoostLibrary,mpi,,))
++$(eval $(call DefineBoostLibrary,program_options,,))
++$(eval $(call DefineBoostLibrary,random,system,))
++
++# We need a beter way to provide this package, information regarding the Python packages
++# such as Python version and directories locations.
++# Python 2.7 version is for now hard-coded. Python 3 is (until this date) broken in the trunk tree.
++$(eval $(call DefineBoostLibrary,python,,+PACKAGE_boost-python:python))
++$(eval $(call DefineBoostLibrary,regex,,))
++$(eval $(call DefineBoostLibrary,serialization,,))
++$(eval $(call DefineBoostLibrary,signals,,))
++$(eval $(call DefineBoostLibrary,system,,))
++$(eval $(call DefineBoostLibrary,thread,system chrono atomic,))
++$(eval $(call DefineBoostLibrary,timer,chrono))
++$(eval $(call DefineBoostLibrary,wave,date_time thread filesystem,))
++
++define Host/Compile
++ # bjam does not provide a configure-script nor a Makefile
++ ( cd $(HOST_BUILD_DIR)/tools/build/src/engine ; ./build.sh gcc )
++endef
++
++CONFIGURE_PREFIX:=$(PKG_INSTALL_DIR)
++TARGET_LDFLAGS += -pthread -lrt
++
++TARGET_CFLAGS += $(if $(CONFIG_SOFT_FLOAT),-DBOOST_NO_FENV_H)
++
++ifneq ($(findstring mips,$(ARCH)),)
++ BOOST_ABI = o32
++ ifneq ($(findstring 64,$(ARCH)),)
++ BOOST_ABI = o64
++ endif
++else ifneq ($(findstring arm,$(ARCH)),)
++ BOOST_ABI = aapcs
++else ifeq ($(ARCH),aarch64)
++ BOOST_ABI = aapcs
++else
++ BOOST_ABI = sysv
++endif
++
++
++define Build/Compile
++ $(info Selected Boost API $(BOOST_ABI) for architecture $(ARCH) and cpu $(CPU_TYPE) $(CPU_SUBTYPE))
++ ( cd $(PKG_BUILD_DIR) ; \
++ echo "using gcc : $(ARCH) : $(GNU_TARGET_NAME)-gcc : <compileflags>\"$(TARGET_CFLAGS)\" <cxxflags>\"$(TARGET_CXXFLAGS)\" <linkflags>\"$(TARGET_LDFLAGS)\" ;" > tools/build/src/user-config.jam ; \
++ $(if $(CONFIG_PACKAGE_boost-python), \
++ echo "using python : : $(STAGING_DIR_ROOT)/usr/bin/python : $(STAGING_DIR)/usr/include/python2.7/ ;" >> \
++ tools/build/src/user-config.jam; \
++ ) \
++ bjam \
++ '-sBUILD=release <optimization>space <inlining>on <debug-symbols>off' \
++ --toolset=gcc-$(ARCH) --build-type=minimal --layout=system abi=$(BOOST_ABI) \
++ --disable-long-double \
++ $(CONFIGURE_ARGS) \
++ --without-mpi \
++ $(if $(CONFIG_PACKAGE_boost-test),,--without-test) \
++ $(foreach lib,$(BOOST_LIBS), \
++ $(if $(CONFIG_PACKAGE_boost-$(lib)),,--without-$(lib)) \
++ ) \
++ $(if $(CONFIG_PACKAGE_boost-locale),boost.locale.iconv=on -sICONV_PATH=$(ICONV_PREFIX) boost.locale.posix=$(if $(USE_UCLIBC),on,off), \
++ boost.locale.iconv=off) \
++ \
++ $(if $(CONFIG_PACKAGE_boost-iostreams),-sNO_BZIP2=1 -sZLIB_INCLUDE=$(STAGING_DIR)/usr/include \
++ -sZLIB_LIBPATH=$(STAGING_DIR)/usr/lib) \
++ install \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) \
++ $(1)/usr/include/boost/
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/include/boost/* \
++ $(1)/usr/include/boost/ \
++ # copies _all_ header files - independent of <--with-library>-argument above
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ -$(CP) $(PKG_INSTALL_DIR)/lib/*.a $(1)/usr/lib/
++ -$(CP) $(PKG_INSTALL_DIR)/lib/*.so* $(1)/usr/lib/
++endef
++
++define Host/Install
++ $(INSTALL_DIR) \
++ $(STAGING_DIR_HOST)/bin
++
++ $(CP) \
++ $(HOST_BUILD_DIR)/tools/build/src/engine/bin.*/bjam \
++ $(STAGING_DIR_HOST)/bin/
++endef
++
++define Package/boost/Default/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/lib/libboost_$(2)*.so* \
++ $(1)/usr/lib/
++endef
++
++define Package/boost-test/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/lib/libboost_unit_test_framework*.so* \
++ $(1)/usr/lib/
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/lib/libboost_prg_exec_monitor*.so* \
++ $(1)/usr/lib/
++endef
++
++define BuildBoostLibrary
++ define Package/boost-$(1)/install
++ $(call Package/boost/Default/install,$$(1),$(1))
++ endef
++
++ $$(eval $$(call BuildPackage,boost-$(1)))
++endef
++
++$(eval $(call HostBuild))
++
++$(foreach lib,$(BOOST_LIBS),$(eval $(call BuildBoostLibrary,$(lib))))
++$(eval $(call BuildPackage,boost-test))
++
++$(eval $(call BuildPackage,boost-libs))
++$(eval $(call BuildPackage,boost))
+diff --git a/feeds/packages/libs/c-ares/Makefile b/feeds/packages/libs/c-ares/Makefile
+new file mode 100644
+index 0000000..c5b2269
+--- /dev/null
++++ b/feeds/packages/libs/c-ares/Makefile
+@@ -0,0 +1,54 @@
++#
++# Copyright (C) 2009-2010 OpenWrt.org
++# Copyright (C) 2009 Jakob Pfeiffer
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=c-ares
++PKG_VERSION:=1.10.0
++PKG_RELEASE:=1
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://c-ares.haxx.se/download
++PKG_MD5SUM:=1196067641411a75d3cbebe074fd36d8
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CPPFLAGS += $(filter -D%,$(TARGET_CFLAGS))
++TARGET_CFLAGS := $(filter-out -D%,$(TARGET_CFLAGS))
++
++define Package/libcares
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Library for asyncronous DNS Requests (including name resolves)
++ URL:=http://c-ares.haxx.se/
++ MAINTAINER:=Karl Palsson <karlp@remake.is>
++endef
++
++define Package/libcares/description
++ c-ares is a C library for asynchronous DNS requests (including name resolves)
++
++C89 compatibility, MIT licensed, builds for and runs on POSIX, Windows,
++Netware, Android and many more operating systems.
++
++endef
++
++define Package/libcares/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so.* $(1)/usr/lib/
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)
++ $(CP) $(PKG_INSTALL_DIR)/* $(1)/
++endef
++
++$(eval $(call BuildPackage,libcares))
+diff --git a/feeds/packages/libs/check/Makefile b/feeds/packages/libs/check/Makefile
+new file mode 100644
+index 0000000..eb735ee
+--- /dev/null
++++ b/feeds/packages/libs/check/Makefile
+@@ -0,0 +1,61 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=check
++PKG_VERSION:=0.9.14
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/check
++PKG_MD5SUM:=38263d115d784c17aa3b959ce94be8b8
++
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING.LESSER
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/check
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Unit testing framework for C
++ URL:=http://check.sourceforge.net/
++ DEPENDS:= +libpthread +librt
++endef
++
++define Package/check/description
++ Check features a simple interface for defining unit tests, putting little in
++ the way of the developer. Tests are run in a separate address space, so Check
++ can catch both assertion failures and code errors that cause segmentation
++ faults or other signals. The output from unit tests can be used within source
++ code editors and IDEs.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++CONFIGURE_VARS += \
++ hw_cv_func_snprintf_c99=yes \
++ hw_cv_func_vsnprintf_c99=yes \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/check*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcheck.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/check.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/check/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcheck.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,check))
+diff --git a/feeds/packages/libs/classpath/Makefile b/feeds/packages/libs/classpath/Makefile
+new file mode 100644
+index 0000000..273678e
+--- /dev/null
++++ b/feeds/packages/libs/classpath/Makefile
+@@ -0,0 +1,90 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=classpath
++PKG_VERSION:=0.99
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0
++PKG_MAINTAINER:=Dana H. Myers <k6jq@comcast.net>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@GNU/classpath
++PKG_MD5SUM:=0ae1571249172acd82488724a3b8acb4
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/classpath
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GNU Classpath
++ URL:=http://www.gnu.org/software/classpath/
++ DEPENDS:=+alsa-lib +libgmp +libmagic
++endef
++
++define Package/classpath/Description
++ GNU Classpath, Essential Libraries for Java, is a GNU project
++ to create free core class libraries for use with virtual
++ machines and compilers for the java programming language.
++endef
++
++define Package/classpath-tools
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GNU Classpath tools
++ URL:=http://www.gnu.org/software/classpath/
++endef
++
++define Download/antlr
++ URL:=http://www.antlr.org/download
++ FILE:=antlr-3.4-complete.jar
++ MD5SUM:=1b91dea1c7d480b3223f7c8a9aa0e172
++endef
++$(eval $(call Download,antlr))
++
++CONFIGURE_ARGS += \
++ --with-gmp="$(STAGING_DIR)/usr" \
++ --without-x \
++ --disable-gtk-peer \
++ --disable-qt-peer \
++ --disable-dssi \
++ --disable-plugin \
++ --disable-gconf-peer \
++ --disable-gjdoc \
++ --disable-examples \
++ --with-antlr-jar=$(DL_DIR)/antlr-3.4-complete.jar
++
++define Package/classpath/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib/classpath \
++ $(1)/usr/share/classpath
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/security \
++ $(PKG_INSTALL_DIR)/usr/lib/logging.properties \
++ $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/classpath/*.so* $(1)/usr/lib/classpath/
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/classpath/glibj.zip $(1)/usr/share/classpath/
++endef
++
++define Package/classpath-tools/install
++ $(INSTALL_DIR) \
++ $(1)/usr/bin \
++ $(1)/usr/share/classpath
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/classpath/tools.zip $(1)/usr/share/classpath/
++endef
++
++define Build/InstallDev
++ $(CP) $(PKG_INSTALL_DIR)/* $(1)/
++endef
++
++$(eval $(call BuildPackage,classpath))
++$(eval $(call BuildPackage,classpath-tools))
+diff --git a/feeds/packages/libs/classpath/patches/010-double-memleak.patch b/feeds/packages/libs/classpath/patches/010-double-memleak.patch
+new file mode 100644
+index 0000000..02ec5ad
+--- /dev/null
++++ b/feeds/packages/libs/classpath/patches/010-double-memleak.patch
+@@ -0,0 +1,91 @@
++--- classpath-0.99.orig/native/fdlibm/dtoa.c 2007-09-27 05:33:38.000000000 -0700
+++++ classpath-0.99/native/fdlibm/dtoa.c 2014-12-21 14:22:42.451713851 -0800
++@@ -883,6 +883,16 @@ ret1:
++ return s0;
++ }
++
+++void free_Bigints(struct _Jv_Bigint *p)
+++{
+++ struct _Jv_Bigint *l = p;
+++ while (l)
+++ {
+++ struct _Jv_Bigint *next = l->_next;
+++ free (l);
+++ l = next;
+++ }
+++}
++
++ _VOID
++ _DEFUN (_dtoa,
++@@ -905,16 +915,15 @@ _DEFUN (_dtoa,
++ p = _dtoa_r (&reent, _d, mode, ndigits, decpt, sign, rve, float_type);
++ strcpy (buf, p);
++
++- for (i = 0; i < reent._result_k; ++i)
+++ for (i = 0; i < reent._max_k; ++i)
++ {
++- struct _Jv_Bigint *l = reent._freelist[i];
++- while (l)
++- {
++- struct _Jv_Bigint *next = l->_next;
++- free (l);
++- l = next;
++- }
+++ free_Bigints(reent._freelist[i]);
++ }
++ if (reent._freelist)
++ free (reent._freelist);
+++
+++ if (reent._result)
+++ free(reent._result);
+++
+++ free_Bigints(reent._p5s);
++ }
++--- classpath-0.99.orig/native/jni/java-lang/java_lang_VMDouble.c 2008-02-08 09:42:57.000000000 -0800
+++++ classpath-0.99/native/jni/java-lang/java_lang_VMDouble.c 2014-12-21 14:35:50.733800626 -0800
++@@ -158,6 +158,17 @@ Java_java_lang_VMDouble_longBitsToDouble
++ return val.d;
++ }
++
+++static void free_Bigints(struct _Jv_Bigint *p)
+++{
+++ struct _Jv_Bigint *l = p;
+++ while (l)
+++ {
+++ struct _Jv_Bigint *next = l->_next;
+++ free (l);
+++ l = next;
+++ }
+++}
+++
++ /**
++ * Parse a double from a char array.
++ */
++@@ -167,7 +178,7 @@ parseDoubleFromChars(JNIEnv * env, const
++ char *endptr;
++ jdouble val = 0.0;
++ const char *p = buf, *end, *last_non_ws, *temp;
++- int ok = 1;
+++ int i, ok = 1;
++
++ #ifdef DEBUG
++ fprintf (stderr, "java.lang.VMDouble.parseDouble (%s)\n", buf);
++@@ -224,6 +235,18 @@ parseDoubleFromChars(JNIEnv * env, const
++
++ val = _strtod_r (&reent, p, &endptr);
++
+++ for (i = 0; i < reent._max_k; ++i)
+++ {
+++ free_Bigints(reent._freelist[i]);
+++ }
+++ if (reent._freelist)
+++ free (reent._freelist);
+++
+++ if (reent._result)
+++ free (reent._result);
+++
+++ free_Bigints(reent._p5s);
+++
++ #ifdef DEBUG
++ fprintf (stderr, "java.lang.VMDouble.parseDouble val = %g\n", val);
++ fprintf (stderr, "java.lang.VMDouble.parseDouble %p != %p ???\n",
+diff --git a/feeds/packages/libs/confuse/Makefile b/feeds/packages/libs/confuse/Makefile
+new file mode 100644
+index 0000000..5b236d5
+--- /dev/null
++++ b/feeds/packages/libs/confuse/Makefile
+@@ -0,0 +1,79 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=confuse
++PKG_VERSION:=2.7
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://savannah.nongnu.org/download/confuse/
++PKG_MD5SUM:=45932fdeeccbb9ef4228f1c1a25e9c8f
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=ISC
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/confuse
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libConfuse is a configuration file parser library
++ URL:=http://www.nongnu.org/confuse/
++endef
++
++define Package/confuse/description
++ libConfuse is a configuration file parser library, licensed under the
++ terms of the ISC license, and written in C. It supports sections and
++ (lists of) values (strings, integers, floats, booleans or other
++ sections), as well as some other features (such as single/double-quoted
++ strings, environment variable expansion, functions and nested include
++ statements). It makes it very easy to add configuration file capability
++ to a program using a simple API.
++
++ The goal of libConfuse is not to be the configuration file parser
++ library with a gazillion of features. Instead, it aims to be easy to use
++ and quick to integrate with your code. libConfuse was called libcfg
++ before, but was changed to not confuse with other similar libraries.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-rpath \
++ --without-libiconv-prefix \
++ --without-libintl-prefix \
++
++MAKE_FLAGS += \
++ -C $(PKG_BUILD_DIR)/src \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/confuse.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libconfuse.{a,so*} $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/*.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Build/UninstallDev
++ rm -rf \
++ $(STAGING_DIR)/usr/include/confuse.h \
++ $(STAGING_DIR)/usr/lib/libconfuse.{a,so*}
++endef
++
++define Package/confuse/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libconfuse.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,confuse))
+diff --git a/feeds/packages/libs/cyrus-sasl/Makefile b/feeds/packages/libs/cyrus-sasl/Makefile
+new file mode 100644
+index 0000000..dfc21d2
+--- /dev/null
++++ b/feeds/packages/libs/cyrus-sasl/Makefile
+@@ -0,0 +1,112 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=cyrus-sasl
++PKG_VERSION:=2.1.26
++PKG_RELEASE:=3
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=ftp://ftp.cyrusimap.org/cyrus-sasl/
++PKG_MD5SUM:=a7f4e5e559a0e37b3ffc438c9456e425
++
++PKG_LICENSE:=BSD-4c BSD
++PKG_LICENSE_FILES:=COPYING cmulocal/COPYING saslauthd/COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_MACRO_PATHS:=cmulocal config ../cmulocal ../config
++PKG_AUTOMAKE_PATHS:=. saslauthd sasldb
++PKG_REMOVE_FILES:=aclocal.m4 saslauthd/aclocal.m4 config/libtool.m4
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libsasl2
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A general purpose authentication library
++ URL:=http://asg.web.cmu.edu/sasl/
++ DEPENDS:=+libopenssl
++endef
++
++TARGET_CFLAGS += $(FPIC)
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-sample \
++ --enable-staticdlopen \
++ --disable-java \
++ --disable-alwaystrue \
++ --disable-checkapop \
++ --enable-cram \
++ --enable-digest \
++ --without-auth-sasldb \
++ --disable-otp \
++ --disable-srp \
++ --disable-srp-setpass \
++ --disable-krb4 \
++ --disable-gssapi \
++ --disable-gss_mutexes \
++ --enable-plain \
++ --enable-anon \
++ --disable-login \
++ --disable-ntlm \
++ --disable-sql \
++ --disable-ldapdb \
++ --without-dblib \
++ --without-gdbm \
++ --with-devrandom="/dev/urandom" \
++ --without-pam \
++ --without-saslauthd \
++ --without-authdaemond \
++ --without-pwcheck \
++ --with-ipctype=unix \
++ --with-openssl="$(STAGING_DIR)/usr" \
++ --without-des \
++ --without-opie \
++ --without-ldap \
++ --without-mysql \
++ --without-pgsql \
++ --without-sqlite \
++ --without-rc4 \
++ --without-dmalloc \
++ --without-sfio \
++ --disable-sample
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)/include \
++ CC="$(HOSTCC)" \
++ LINK="$(HOSTCC) -o makemd5 -lc" \
++ CFLAGS="" \
++ CPPFLAGS="" \
++ makemd5
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/sasl $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsasl2.{a,so*} $(1)/usr/lib/
++ ln -sf libsasl2.a $(1)/usr/lib/libsasl.a
++ ln -sf libsasl2.so $(1)/usr/lib/libsasl.so
++ $(INSTALL_DIR) $(1)/usr/lib/sasl2
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/sasl2/lib*.{a,so*} $(1)/usr/lib/sasl2/
++endef
++
++define Package/libsasl2/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsasl2.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/sasl2
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/sasl2/lib*.so* $(1)/usr/lib/sasl2/
++endef
++
++$(eval $(call BuildPackage,libsasl2))
+diff --git a/feeds/packages/libs/db47/Makefile b/feeds/packages/libs/db47/Makefile
+new file mode 100644
+index 0000000..bf0f0b7
+--- /dev/null
++++ b/feeds/packages/libs/db47/Makefile
+@@ -0,0 +1,100 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/uclibc++.mk
++
++BASE_VERSION:=4.7.25
++
++PKG_NAME:=db47
++PKG_VERSION:=$(BASE_VERSION).4.NC
++PKG_RELEASE:=5
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/db-$(BASE_VERSION).NC
++PKG_SOURCE:=db-$(BASE_VERSION).NC.tar.gz
++PKG_SOURCE_URL:=http://download.oracle.com/berkeley-db/
++PKG_MD5SUM:=073ab7f20d24b3872a51ca762f5090e7
++
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++PKG_LICENSE:=Sleepycat
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_FIXUP:=autoreconf
++PKG_LIBTOOL_PATHS:=. build_unix
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libdb47
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libxml2
++ TITLE:=Berkeley DB library (4.7)
++ URL:=http://www.oracle.com/us/products/database/berkeley-db
++ PROVIDES:=libdb47-full
++endef
++
++define Package/libdb47/description
++ Berkeley DB library (4.7).
++endef
++
++define Package/libdb47xx
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libdb47 $(CXX_DEPENDS)
++ TITLE:=Berkeley DB library (4.7) for C++
++ URL:=http://www.oracle.com/us/products/database/berkeley-db
++ PROVIDES:=libdb47xx-full
++endef
++
++define Package/libdb47xx/description
++ Berkeley DB library (4.7). C++ wrapper.
++endef
++
++CONFIGURE_PATH = build_unix
++CONFIGURE_CMD = ../dist/configure
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-java \
++ --with-mutex=POSIX/pthreads/library \
++ --disable-tcl \
++ --disable-rpc \
++ --enable-compat185 \
++ --disable-debug \
++ $(if $(CONFIG_PACKAGE_libdb47xx),--enable-cxx,--disable-cxx)
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/Compile
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/build_unix \
++ DESTDIR="$(PKG_INSTALL_DIR)" all
++ $(MAKE) -C $(PKG_BUILD_DIR)/build_unix \
++ DESTDIR="$(PKG_INSTALL_DIR)" install
++endef
++
++define Package/libdb47/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdb-*.so $(1)/usr/lib/
++endef
++
++define Package/libdb47xx/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdb_cxx-*.so $(1)/usr/lib/
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/db.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/db_cxx.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdb*.{a,so} $(1)/usr/lib
++endef
++
++$(eval $(call BuildPackage,libdb47))
++$(eval $(call BuildPackage,libdb47xx))
+diff --git a/feeds/packages/libs/db47/patches/010-patch.4.7.25.1.patch b/feeds/packages/libs/db47/patches/010-patch.4.7.25.1.patch
+new file mode 100644
+index 0000000..f1fd472
+--- /dev/null
++++ b/feeds/packages/libs/db47/patches/010-patch.4.7.25.1.patch
+@@ -0,0 +1,55 @@
++--- a/sequence/sequence.c
+++++ b/sequence/sequence.c
++@@ -187,7 +187,11 @@ __seq_open_pp(seq, txn, keyp, flags)
++ if ((ret = __db_get_flags(dbp, &tflags)) != 0)
++ goto err;
++
++- if (DB_IS_READONLY(dbp)) {
+++ /*
+++ * We can let replication clients open sequences, but must
+++ * check later that they do not update them.
+++ */
+++ if (F_ISSET(dbp, DB_AM_RDONLY)) {
++ ret = __db_rdonly(dbp->env, "DB_SEQUENCE->open");
++ goto err;
++ }
++@@ -244,6 +248,11 @@ retry: if ((ret = __db_get(dbp, ip,
++ if ((ret != DB_NOTFOUND && ret != DB_KEYEMPTY) ||
++ !LF_ISSET(DB_CREATE))
++ goto err;
+++ if (IS_REP_CLIENT(env) &&
+++ !F_ISSET(dbp, DB_AM_NOT_DURABLE)) {
+++ ret = __db_rdonly(env, "DB_SEQUENCE->open");
+++ goto err;
+++ }
++ ret = 0;
++
++ rp = &seq->seq_record;
++@@ -296,7 +305,12 @@ retry: if ((ret = __db_get(dbp, ip,
++ */
++ rp = seq->seq_data.data;
++ if (rp->seq_version == DB_SEQUENCE_OLDVER) {
++-oldver: rp->seq_version = DB_SEQUENCE_VERSION;
+++oldver: if (IS_REP_CLIENT(env) &&
+++ !F_ISSET(dbp, DB_AM_NOT_DURABLE)) {
+++ ret = __db_rdonly(env, "DB_SEQUENCE->open");
+++ goto err;
+++ }
+++ rp->seq_version = DB_SEQUENCE_VERSION;
++ if (!F_ISSET(env, ENV_LITTLEENDIAN)) {
++ if (IS_DB_AUTO_COMMIT(dbp, txn)) {
++ if ((ret =
++@@ -707,6 +721,13 @@ __seq_get(seq, txn, delta, retp, flags)
++
++ MUTEX_LOCK(env, seq->mtx_seq);
++
+++ if (handle_check && IS_REP_CLIENT(env) &&
+++ !F_ISSET(dbp, DB_AM_NOT_DURABLE)) {
+++ ret = __db_rdonly(env, "DB_SEQUENCE->get");
+++ goto err;
+++ }
+++
+++
++ if (rp->seq_min + delta > rp->seq_max) {
++ __db_errx(env, "Sequence overflow");
++ ret = EINVAL;
+diff --git a/feeds/packages/libs/db47/patches/020-patch.4.7.25.2.patch b/feeds/packages/libs/db47/patches/020-patch.4.7.25.2.patch
+new file mode 100644
+index 0000000..ddf830a
+--- /dev/null
++++ b/feeds/packages/libs/db47/patches/020-patch.4.7.25.2.patch
+@@ -0,0 +1,42 @@
++--- a/lock/lock.c
+++++ b/lock/lock.c
++@@ -1274,10 +1274,12 @@ __lock_put_internal(lt, lockp, obj_ndx,
++ SH_TAILQ_REMOVE(
++ &lt->obj_tab[obj_ndx], sh_obj, links, __db_lockobj);
++ if (sh_obj->lockobj.size > sizeof(sh_obj->objdata)) {
++- LOCK_REGION_LOCK(env);
+++ if (region->part_t_size != 1)
+++ LOCK_REGION_LOCK(env);
++ __env_alloc_free(&lt->reginfo,
++ SH_DBT_PTR(&sh_obj->lockobj));
++- LOCK_REGION_UNLOCK(env);
+++ if (region->part_t_size != 1)
+++ LOCK_REGION_UNLOCK(env);
++ }
++ SH_TAILQ_INSERT_HEAD(
++ &FREE_OBJS(lt, part_id), sh_obj, links, __db_lockobj);
++@@ -1467,15 +1469,21 @@ retry: SH_TAILQ_FOREACH(sh_obj, &lt->obj
++ if (obj->size <= sizeof(sh_obj->objdata))
++ p = sh_obj->objdata;
++ else {
++- LOCK_REGION_LOCK(env);
+++ /*
+++ * If we have only one partition, the region is locked.
+++ */
+++ if (region->part_t_size != 1)
+++ LOCK_REGION_LOCK(env);
++ if ((ret =
++ __env_alloc(&lt->reginfo, obj->size, &p)) != 0) {
++ __db_errx(env,
++ "No space for lock object storage");
++- LOCK_REGION_UNLOCK(env);
+++ if (region->part_t_size != 1)
+++ LOCK_REGION_UNLOCK(env);
++ goto err;
++ }
++- LOCK_REGION_UNLOCK(env);
+++ if (region->part_t_size != 1)
+++ LOCK_REGION_UNLOCK(env);
++ }
++
++ memcpy(p, obj->data, obj->size);
+diff --git a/feeds/packages/libs/db47/patches/030-patch.4.7.25.3.patch b/feeds/packages/libs/db47/patches/030-patch.4.7.25.3.patch
+new file mode 100644
+index 0000000..59b00e6
+--- /dev/null
++++ b/feeds/packages/libs/db47/patches/030-patch.4.7.25.3.patch
+@@ -0,0 +1,211 @@
++--- a/lock/lock_deadlock.c
+++++ b/lock/lock_deadlock.c
++@@ -121,7 +121,7 @@ __lock_detect(env, atype, rejectp)
++ DB_LOCKTAB *lt;
++ db_timespec now;
++ locker_info *idmap;
++- u_int32_t *bitmap, *copymap, **deadp, **free_me, *tmpmap;
+++ u_int32_t *bitmap, *copymap, **deadp, **deadlist, *tmpmap;
++ u_int32_t i, cid, keeper, killid, limit, nalloc, nlockers;
++ u_int32_t lock_max, txn_max;
++ int ret, status;
++@@ -133,7 +133,8 @@ __lock_detect(env, atype, rejectp)
++ if (IS_REP_CLIENT(env))
++ atype = DB_LOCK_MINWRITE;
++
++- free_me = NULL;
+++ copymap = tmpmap = NULL;
+++ deadlist = NULL;
++
++ lt = env->lk_handle;
++ if (rejectp != NULL)
++@@ -179,11 +180,11 @@ __lock_detect(env, atype, rejectp)
++ memcpy(copymap, bitmap, nlockers * sizeof(u_int32_t) * nalloc);
++
++ if ((ret = __os_calloc(env, sizeof(u_int32_t), nalloc, &tmpmap)) != 0)
++- goto err1;
+++ goto err;
++
++ /* Find a deadlock. */
++ if ((ret =
++- __dd_find(env, bitmap, idmap, nlockers, nalloc, &deadp)) != 0)
+++ __dd_find(env, bitmap, idmap, nlockers, nalloc, &deadlist)) != 0)
++ return (ret);
++
++ /*
++@@ -204,8 +205,7 @@ __lock_detect(env, atype, rejectp)
++ txn_max = TXN_MAXIMUM;
++
++ killid = BAD_KILLID;
++- free_me = deadp;
++- for (; *deadp != NULL; deadp++) {
+++ for (deadp = deadlist; *deadp != NULL; deadp++) {
++ if (rejectp != NULL)
++ ++*rejectp;
++ killid = (u_int32_t)(*deadp - bitmap) / nalloc;
++@@ -342,11 +342,12 @@ dokill: if (killid == BAD_KILLID) {
++ __db_msg(env,
++ "Aborting locker %lx", (u_long)idmap[killid].id);
++ }
++- __os_free(env, tmpmap);
++-err1: __os_free(env, copymap);
++-
++-err: if (free_me != NULL)
++- __os_free(env, free_me);
+++err: if(copymap != NULL)
+++ __os_free(env, copymap);
+++ if (deadlist != NULL)
+++ __os_free(env, deadlist);
+++ if(tmpmap != NULL)
+++ __os_free(env, tmpmap);
++ __os_free(env, bitmap);
++ __os_free(env, idmap);
++
++@@ -360,6 +361,17 @@ err: if (free_me != NULL)
++
++ #define DD_INVALID_ID ((u_int32_t) -1)
++
+++/*
+++ * __dd_build --
+++ * Build the lock dependency bit maps.
+++ * Notes on syncronization:
+++ * LOCK_SYSTEM_LOCK is used to hold objects locked when we have
+++ * a single partition.
+++ * LOCK_LOCKERS is held while we are walking the lockers list and
+++ * to single thread the use of lockerp->dd_id.
+++ * LOCK_DD protects the DD list of objects.
+++ */
+++
++ static int
++ __dd_build(env, atype, bmp, nlockers, allocp, idmap, rejectp)
++ ENV *env;
++@@ -393,6 +405,7 @@ __dd_build(env, atype, bmp, nlockers, al
++ * In particular we do not build the conflict array and our caller
++ * needs to expect this.
++ */
+++ LOCK_SYSTEM_LOCK(lt, region);
++ if (atype == DB_LOCK_EXPIRE) {
++ skip: LOCK_DD(env, region);
++ op = SH_TAILQ_FIRST(&region->dd_objs, __db_lockobj);
++@@ -430,17 +443,18 @@ skip: LOCK_DD(env, region);
++ OBJECT_UNLOCK(lt, region, indx);
++ }
++ UNLOCK_DD(env, region);
+++ LOCK_SYSTEM_UNLOCK(lt, region);
++ goto done;
++ }
++
++ /*
++- * We'll check how many lockers there are, add a few more in for
++- * good measure and then allocate all the structures. Then we'll
++- * verify that we have enough room when we go back in and get the
++- * mutex the second time.
+++ * Allocate after locking the region
+++ * to make sure the structures are large enough.
++ */
++-retry: count = region->stat.st_nlockers;
+++ LOCK_LOCKERS(env, region);
+++ count = region->stat.st_nlockers;
++ if (count == 0) {
+++ UNLOCK_LOCKERS(env, region);
++ *nlockers = 0;
++ return (0);
++ }
++@@ -448,50 +462,37 @@ retry: count = region->stat.st_nlockers;
++ if (FLD_ISSET(env->dbenv->verbose, DB_VERB_DEADLOCK))
++ __db_msg(env, "%lu lockers", (u_long)count);
++
++- count += 20;
++ nentries = (u_int32_t)DB_ALIGN(count, 32) / 32;
++
++- /*
++- * Allocate enough space for a count by count bitmap matrix.
++- *
++- * XXX
++- * We can probably save the malloc's between iterations just
++- * reallocing if necessary because count grew by too much.
++- */
+++ /* Allocate enough space for a count by count bitmap matrix. */
++ if ((ret = __os_calloc(env, (size_t)count,
++- sizeof(u_int32_t) * nentries, &bitmap)) != 0)
+++ sizeof(u_int32_t) * nentries, &bitmap)) != 0) {
+++ UNLOCK_LOCKERS(env, region);
++ return (ret);
+++ }
++
++ if ((ret = __os_calloc(env,
++ sizeof(u_int32_t), nentries, &tmpmap)) != 0) {
+++ UNLOCK_LOCKERS(env, region);
++ __os_free(env, bitmap);
++ return (ret);
++ }
++
++ if ((ret = __os_calloc(env,
++ (size_t)count, sizeof(locker_info), &id_array)) != 0) {
+++ UNLOCK_LOCKERS(env, region);
++ __os_free(env, bitmap);
++ __os_free(env, tmpmap);
++ return (ret);
++ }
++
++ /*
++- * Now go back in and actually fill in the matrix.
++- */
++- if (region->stat.st_nlockers > count) {
++- __os_free(env, bitmap);
++- __os_free(env, tmpmap);
++- __os_free(env, id_array);
++- goto retry;
++- }
++-
++- /*
++ * First we go through and assign each locker a deadlock detector id.
++ */
++ id = 0;
++- LOCK_LOCKERS(env, region);
++ SH_TAILQ_FOREACH(lip, &region->lockers, ulinks, __db_locker) {
++ if (lip->master_locker == INVALID_ROFF) {
+++ DB_ASSERT(env, id < count);
++ lip->dd_id = id++;
++ id_array[lip->dd_id].id = lip->id;
++ switch (atype) {
++@@ -510,7 +511,6 @@ retry: count = region->stat.st_nlockers;
++ lip->dd_id = DD_INVALID_ID;
++
++ }
++- UNLOCK_LOCKERS(env, region);
++
++ /*
++ * We only need consider objects that have waiters, so we use
++@@ -669,7 +669,6 @@ again: memset(bitmap, 0, count * sizeof
++ * status after building the bit maps so that we will not detect
++ * a blocked transaction without noting that it is already aborting.
++ */
++- LOCK_LOCKERS(env, region);
++ for (id = 0; id < count; id++) {
++ if (!id_array[id].valid)
++ continue;
++@@ -738,6 +737,7 @@ get_lock: id_array[id].last_lock = R_OF
++ id_array[id].in_abort = 1;
++ }
++ UNLOCK_LOCKERS(env, region);
+++ LOCK_SYSTEM_UNLOCK(lt, region);
++
++ /*
++ * Now we can release everything except the bitmap matrix that we
++@@ -839,6 +839,7 @@ __dd_abort(env, info, statusp)
++ ret = 0;
++
++ /* We must lock so this locker cannot go away while we abort it. */
+++ LOCK_SYSTEM_LOCK(lt, region);
++ LOCK_LOCKERS(env, region);
++
++ /*
++@@ -895,6 +896,7 @@ __dd_abort(env, info, statusp)
++ done: OBJECT_UNLOCK(lt, region, info->last_ndx);
++ err:
++ out: UNLOCK_LOCKERS(env, region);
+++ LOCK_SYSTEM_UNLOCK(lt, region);
++ return (ret);
++ }
++
+diff --git a/feeds/packages/libs/db47/patches/040-patch.4.7.25.4.patch b/feeds/packages/libs/db47/patches/040-patch.4.7.25.4.patch
+new file mode 100644
+index 0000000..7db4061
+--- /dev/null
++++ b/feeds/packages/libs/db47/patches/040-patch.4.7.25.4.patch
+@@ -0,0 +1,118 @@
++--- a/dbinc/repmgr.h
+++++ b/dbinc/repmgr.h
++@@ -374,6 +374,7 @@ typedef struct {
++ #define SITE_FROM_EID(eid) (&db_rep->sites[eid])
++ #define EID_FROM_SITE(s) ((int)((s) - (&db_rep->sites[0])))
++ #define IS_VALID_EID(e) ((e) >= 0)
+++#define IS_KNOWN_REMOTE_SITE(e) ((e) >= 0 && ((u_int)(e)) < db_rep->site_cnt)
++ #define SELF_EID INT_MAX
++
++ #define IS_PEER_POLICY(p) ((p) == DB_REPMGR_ACKS_ALL_PEERS || \
++--- a/rep/rep_elect.c
+++++ b/rep/rep_elect.c
++@@ -33,7 +33,7 @@ static int __rep_elect_init
++ static int __rep_fire_elected __P((ENV *, REP *, u_int32_t));
++ static void __rep_elect_master __P((ENV *, REP *));
++ static int __rep_tally __P((ENV *, REP *, int, u_int32_t *, u_int32_t, roff_t));
++-static int __rep_wait __P((ENV *, db_timeout_t *, int *, int, u_int32_t));
+++static int __rep_wait __P((ENV *, db_timeout_t *, int, u_int32_t));
++
++ /*
++ * __rep_elect --
++@@ -55,7 +55,7 @@ __rep_elect(dbenv, given_nsites, nvotes,
++ ENV *env;
++ LOG *lp;
++ REP *rep;
++- int done, eid, elected, full_elect, locked, in_progress, need_req;
+++ int done, elected, full_elect, locked, in_progress, need_req;
++ int ret, send_vote, t_ret;
++ u_int32_t ack, ctlflags, egen, nsites, orig_tally, priority, realpri;
++ u_int32_t tiebreaker;
++@@ -181,8 +181,7 @@ __rep_elect(dbenv, given_nsites, nvotes,
++ REP_SYSTEM_UNLOCK(env);
++ (void)__rep_send_message(env, DB_EID_BROADCAST,
++ REP_MASTER_REQ, NULL, NULL, 0, 0);
++- ret = __rep_wait(env, &to, &eid,
++- 0, REP_F_EPHASE0);
+++ ret = __rep_wait(env, &to, 0, REP_F_EPHASE0);
++ REP_SYSTEM_LOCK(env);
++ F_CLR(rep, REP_F_EPHASE0);
++ switch (ret) {
++@@ -286,11 +285,11 @@ restart:
++ REP_SYSTEM_LOCK(env);
++ goto vote;
++ }
++- ret = __rep_wait(env, &to, &eid, full_elect, REP_F_EPHASE1);
+++ ret = __rep_wait(env, &to, full_elect, REP_F_EPHASE1);
++ switch (ret) {
++ case 0:
++ /* Check if election complete or phase complete. */
++- if (eid != DB_EID_INVALID && !IN_ELECTION(rep)) {
+++ if (!IN_ELECTION(rep)) {
++ RPRINT(env, DB_VERB_REP_ELECT,
++ (env, "Ended election phase 1"));
++ goto edone;
++@@ -398,15 +397,12 @@ phase2:
++ REP_SYSTEM_LOCK(env);
++ goto i_won;
++ }
++- ret = __rep_wait(env, &to, &eid, full_elect, REP_F_EPHASE2);
+++ ret = __rep_wait(env, &to, full_elect, REP_F_EPHASE2);
++ RPRINT(env, DB_VERB_REP_ELECT,
++ (env, "Ended election phase 2 %d", ret));
++ switch (ret) {
++ case 0:
++- if (eid != DB_EID_INVALID)
++- goto edone;
++- ret = DB_REP_UNAVAIL;
++- break;
+++ goto edone;
++ case DB_REP_EGENCHG:
++ if (to > timeout)
++ to = timeout;
++@@ -1050,13 +1046,6 @@ __rep_elect_master(env, rep)
++ ENV *env;
++ REP *rep;
++ {
++- /*
++- * We often come through here twice, sometimes even more. We mustn't
++- * let the redundant calls affect stats counting. But rep_elect relies
++- * on this first part for setting eidp.
++- */
++- rep->master_id = rep->eid;
++-
++ if (F_ISSET(rep, REP_F_MASTERELECT | REP_F_MASTER)) {
++ /* We've been through here already; avoid double counting. */
++ return;
++@@ -1093,10 +1082,10 @@ __rep_fire_elected(env, rep, egen)
++ (timeout > 5000000) ? 500000 : ((timeout >= 10) ? timeout / 10 : 1);
++
++ static int
++-__rep_wait(env, timeoutp, eidp, full_elect, flags)
+++__rep_wait(env, timeoutp, full_elect, flags)
++ ENV *env;
++ db_timeout_t *timeoutp;
++- int *eidp, full_elect;
+++ int full_elect;
++ u_int32_t flags;
++ {
++ DB_REP *db_rep;
++@@ -1174,7 +1163,6 @@ __rep_wait(env, timeoutp, eidp, full_ele
++ F_CLR(rep, REP_F_EGENUPDATE);
++ ret = DB_REP_EGENCHG;
++ } else if (phase_over) {
++- *eidp = rep->master_id;
++ done = 1;
++ ret = 0;
++ }
++--- a/repmgr/repmgr_net.c
+++++ b/repmgr/repmgr_net.c
++@@ -100,6 +100,8 @@ __repmgr_send(dbenv, control, rec, lsnp,
++ control, rec, &nsites_sent, &npeers_sent)) != 0)
++ goto out;
++ } else {
+++ DB_ASSERT(env, IS_KNOWN_REMOTE_SITE(eid));
+++
++ /*
++ * If this is a request that can be sent anywhere, then see if
++ * we can send it to our peer (to save load on the master), but
+diff --git a/feeds/packages/libs/db47/patches/100-repmgr-format-security.patch b/feeds/packages/libs/db47/patches/100-repmgr-format-security.patch
+new file mode 100644
+index 0000000..58cfafd
+--- /dev/null
++++ b/feeds/packages/libs/db47/patches/100-repmgr-format-security.patch
+@@ -0,0 +1,11 @@
++--- a/repmgr/repmgr_net.c
+++++ b/repmgr/repmgr_net.c
++@@ -1136,7 +1136,7 @@ __repmgr_listen(env)
++ }
++
++ ret = net_errno;
++- __db_err(env, ret, why);
+++ __db_err(env, ret, "%s", why);
++ clean: if (s != INVALID_SOCKET)
++ (void)closesocket(s);
++ return (ret);
+diff --git a/feeds/packages/libs/dmx_usb_module/Makefile b/feeds/packages/libs/dmx_usb_module/Makefile
+new file mode 100644
+index 0000000..d9e458f
+--- /dev/null
++++ b/feeds/packages/libs/dmx_usb_module/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=dmx_usb_module
++PKG_VERSION:=0.1.20130818
++PKG_RELEASE:=0.1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=git://github.com/lowlander/dmx_usb_module.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=ee99ca7edbd9e093480ad63341ac007394047bde
++PKG_MAINTAINER:=Martijn Zilverschoon <martijn@friedzombie.com>
++PKG_LICENSE:=GPL-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define KernelPackage/usb-serial-dmx_usb_module
++ SECTION:=kernel
++ CATEGORY:=Kernel modules
++ SUBMENU:=USB Support
++ TITLE:=Support for FTDI RS485 based DMX modules
++ URL:=http://www.erwinrol.com/open-dmx-usb-linux-driver/
++ FILES:=$(PKG_BUILD_DIR)/dmx_usb.$(LINUX_KMOD_SUFFIX)
++ AUTOLOAD:=$(call AutoProbe,dmx_usb)
++ DEPENDS+=kmod-usb-serial
++endef
++
++define KernelPackage/usb-serial-dmx_usb_module/description
++ Open DMX USB is an open USB to DMX dongle hardware design developed by Enttec.
++ The Open in Open DMX USB refers to the fact that everybody is free to use the
++ design and produce its own USB DMX Dongle without paying any licenses.
++endef
++
++DMX_MAKE_OPTS:= -C $(PKG_BUILD_DIR) \
++ PATH="$(TARGET_PATH)" \
++ ARCH="$(LINUX_KARCH)" \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ TARGET="$(HAL_TARGET)" \
++ TOOLPREFIX="$(KERNEL_CROSS)" \
++ TOOLPATH="$(KERNEL_CROSS)" \
++ KERNELPATH="$(LINUX_DIR)" \
++ LDOPTS=" "
++
++define Build/Compile
++ $(MAKE) $(DMX_MAKE_OPTS) M=$(PKG_BUILD_DIR)
++endef
++
++$(eval $(call KernelPackage,usb-serial-dmx_usb_module))
+diff --git a/feeds/packages/libs/dmx_usb_module/patches/001-dmx_usb_Makefile.patch b/feeds/packages/libs/dmx_usb_module/patches/001-dmx_usb_Makefile.patch
+new file mode 100644
+index 0000000..2a03d94
+--- /dev/null
++++ b/feeds/packages/libs/dmx_usb_module/patches/001-dmx_usb_Makefile.patch
+@@ -0,0 +1,13 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -12,8 +12,7 @@ KDIR := /lib/modules/$(shell uname -r)/build
++ PWD := $(shell pwd)
++
++ default:
++- $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
++- gcc -O2 -pipe -Wall dmx_usb_test.c -o dmx_usb_test
+++ $(MAKE) -C $(KERNELPATH) SUBDIRS=$(PWD) modules
++
++ endif
++
++
+diff --git a/feeds/packages/libs/dtndht/Makefile b/feeds/packages/libs/dtndht/Makefile
+new file mode 100644
+index 0000000..be4385c
+--- /dev/null
++++ b/feeds/packages/libs/dtndht/Makefile
+@@ -0,0 +1,46 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dtndht
++PKG_VERSION:=0.2.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.ibr.cs.tu-bs.de/projects/ibr-dtn/releases
++PKG_MD5SUM:=37c33910ac7e760aad4db81724aeb4fb
++PKG_MAINTAINER:=Johannes Morgenroth <morgenroth@ibr.cs.tu-bs.de>
++PKG_LICENSE:=Apache-2.0
++
++PKG_INSTALL:=1
++PKG_FIXUP:=libtool
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/dtndht
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libopenssl
++ TITLE:=Library for DHT lookups for DTNs
++endef
++
++define Package/dtndht/description
++ A library with DHT functions for DTN name lookups.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)
++ $(CP) $(PKG_INSTALL_DIR)/* $(1)/
++endef
++
++define Package/dtndht/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,dtndht))
+diff --git a/feeds/packages/libs/dtndht/patches/001-musl_header.patch b/feeds/packages/libs/dtndht/patches/001-musl_header.patch
+new file mode 100644
+index 0000000..32eeb6a
+--- /dev/null
++++ b/feeds/packages/libs/dtndht/patches/001-musl_header.patch
+@@ -0,0 +1,30 @@
++--- a/dtndht/dtndht.h
+++++ b/dtndht/dtndht.h
++@@ -7,6 +7,7 @@ extern "C" {
++
++ #include <stdio.h>
++ #include <sys/socket.h>
+++#include <time.h>
++
++ enum dtn_dht_bind_type {
++ BINDNONE = 0, IPV4ONLY = 1, IPV6ONLY = 2, BINDBOTH = 3
++--- a/dtndht/blacklist.c
+++++ b/dtndht/blacklist.c
++@@ -6,6 +6,7 @@
++ #include <string.h>
++ #include <stdio.h>
++ #include <arpa/inet.h>
+++#include <sys/types.h>
++ #ifdef HAVE_OPENSSL_SHA_H
++ #include <openssl/sha.h>
++ #else
++--- a/dtndht/rating.h
+++++ b/dtndht/rating.h
++@@ -12,6 +12,7 @@
++ #include <sys/socket.h>
++ #include <arpa/inet.h>
++ #include <string.h>
+++#include <time.h>
++ #ifdef HAVE_OPENSSL_SHA_H
++ #include <openssl/sha.h>
++ #else
+diff --git a/feeds/packages/libs/engine_pkcs11/Makefile b/feeds/packages/libs/engine_pkcs11/Makefile
+new file mode 100644
+index 0000000..c7449ed
+--- /dev/null
++++ b/feeds/packages/libs/engine_pkcs11/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2011-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=engine_pkcs11
++PKG_VERSION:=20150429
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=LGPL-2.1+
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/OpenSC/engine_pkcs11.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=0cc9d88eb291f5c545e5bc91d56866a2e0e95d48
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_FIXUP:=libtool
++
++PKG_CONFIG_DEPENDS:=CONFIG_OPENSSL_ENGINE
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/engine_pkcs11
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=PKCS#11 OpenSSL engine
++ URL:=https://www.opensc-project.org/opensc/wiki/
++ DEPENDS:=+libopenssl +libp11
++endef
++
++define Package/engine_pkcs11/description
++ engine_pkcs11 is an implementation of OpenSSL engine interface.
++endef
++
++define Package/engine_pkcs11/install
++ $(INSTALL_DIR) $(1)/usr/lib/engines
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/engines/engine_pkcs11.so $(1)/usr/lib/engines/
++endef
++
++$(eval $(call BuildPackage,engine_pkcs11))
+diff --git a/feeds/packages/libs/expat/Makefile b/feeds/packages/libs/expat/Makefile
+new file mode 100644
+index 0000000..db599d9
+--- /dev/null
++++ b/feeds/packages/libs/expat/Makefile
+@@ -0,0 +1,69 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=expat
++PKG_VERSION:=2.1.0
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=dd7dab7a5fea97d2a6a43f511449b7cd
++PKG_SOURCE_URL:=@SF/expat
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=conftools/libtool.m4
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libexpat
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=An XML parsing library
++ URL:=http://expat.sourceforge.net/
++endef
++
++define Package/libexpat/description
++ A fast, non-validating, stream-oriented XML parsing library.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static
++
++define Host/Install
++ $(MAKE) -C $(HOST_BUILD_DIR) install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/expat{,_external}.h $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/expat.pc $(1)/usr/lib/pkgconfig/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libexpat.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/libexpat/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libexpat.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,libexpat))
+diff --git a/feeds/packages/libs/faad2/Config.in b/feeds/packages/libs/faad2/Config.in
+new file mode 100644
+index 0000000..0033676
+--- /dev/null
++++ b/feeds/packages/libs/faad2/Config.in
+@@ -0,0 +1,12 @@
++config FAAD2_ALWAYS_USE_FLOATING_POINT
++ depends on PACKAGE_libfaad2
++ bool "Build FAAD2 to use floating-point math even if using soft floats."
++ default n
++ help
++ By default, libfaad2 will be built to use fixed point rather
++ than floating point math if emulated floating point operations
++ are being used. (See the CONFIG_SOFT_FLOAT option.) Set this
++ option if you would like to use floating point math regardless
++ of whether floating point emulation is in use.
++
++ For the best real-time decoding ability, leave this option off.
+diff --git a/feeds/packages/libs/faad2/Makefile b/feeds/packages/libs/faad2/Makefile
+new file mode 100644
+index 0000000..0d1310b
+--- /dev/null
++++ b/feeds/packages/libs/faad2/Makefile
+@@ -0,0 +1,114 @@
++#
++# Copyright (C) 2008-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=faad2
++PKG_VERSION:=2.7
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/faac
++PKG_MD5SUM:=4c332fa23febc0e4648064685a3d4332
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_CONFIG_DEPENDS := \
++ CONFIG_SOFT_FLOAT \
++ CONFIG_FAAD2_ALWAYS_USE_FLOATING_POINT
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS += $(FPIC)
++
++# Use fixed point math, if we're using soft floats, and the user didn't
++# specifically ask to use floats anyways.
++ifeq ($(CONFIG_SOFT_FLOAT)-$(CONFIG_FAAD2_ALWAYS_USE_FLOATING_POINT),y-)
++TARGET_CFLAGS+= -DFIXED_POINT
++FAAD2_CONFIG_OPTS= --without-fp -nfp
++endif
++
++define Package/faad2/Default
++ URL:=http://www.audiocoding.com/faad2.html
++ TITLE:=Freeware Advanced Audio Decoder
++endef
++
++define Package/faad2/Default/description
++ FAAD2 is the fastest ISO AAC audio decoder available.
++ FAAD2 correctly decodes all MPEG-4 and MPEG-2 MAIN,
++ LOW, LTP, LD and ER object type AAC files.
++endef
++
++define Package/faad2
++$(call Package/faad2/Default)
++ SECTION:=sound
++ CATEGORY:=Sound
++ TITLE+=player
++ DEPENDS:=+libfaad2
++endef
++
++define Package/faad2/description
++$(call Package/faad2/Default/description)
++ This package contains a binary to play AAC or MP4 files.
++endef
++
++define Package/libfaad2
++$(call Package/faad2/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+=library
++ DEPENDS:=@BUILD_PATENTED
++ MENU:=1
++endef
++
++define Package/libfaad2/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/libfaad2/description
++$(call Package/faad2/Default/description)
++ This package contains the library.
++endef
++
++define Build/Configure
++ # This replacement were do according to many comments on the web because of gcc 3.4.5 version (.6 included).-
++ # wich doesn't recognices the -iquote parameter to AM_CFLAGS
++ ($(SED) 's,-iquote $$$$(top_srcdir),-I$$$$(top_srcdir),g' $(PKG_BUILD_DIR)/libfaad/Makefile.am; \
++ $(SED) 's,-iquote $$$$(top_srcdir),-I$$$$(top_srcdir),g' $(PKG_BUILD_DIR)/libfaad/Makefile.in);
++ (cd $(PKG_BUILD_DIR); rm -rf config.{cache,status}; \
++ autoreconf -vif \
++ );
++ $(call Build/Configure/Default, \
++ --with-mp4v2 \
++ $(FAAD2_CONFIG_OPTS) \
++ --without-xmms \
++ , \
++ FAAD2_CPPFLAGS="-fno-builtin-cos -fno-builtin-sin -fno-builtin-log" \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfaad.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/faad2/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/faad $(1)/usr/bin/
++endef
++
++define Package/libfaad2/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfaad.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,faad2))
++$(eval $(call BuildPackage,libfaad2))
+diff --git a/feeds/packages/libs/fcgi/Makefile b/feeds/packages/libs/fcgi/Makefile
+new file mode 100644
+index 0000000..d1d404f
+--- /dev/null
++++ b/feeds/packages/libs/fcgi/Makefile
+@@ -0,0 +1,82 @@
++#
++# Copyright (C) 2007-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=fcgi
++PKG_VERSION:=2.4.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.fastcgi.com/dist/
++PKG_MD5SUM:=d15060a813b91383a9f3c66faf84867e
++
++PKG_FIXUP:=libtool-ucxx
++
++PKG_MAINTAINER:=Jacob Siverskog <jacob@teenageengineering.com>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/fcgi/Default
++ SECTION:=libs
++ CATEGORY:=Libraries
++ URL:=http://www.fastcgi.com/
++endef
++
++define Package/fcgi
++ $(call Package/fcgi/Default)
++ MENU:=1
++ DEPENDS:= +libpthread
++ TITLE:=Shared library of FastCGI
++endef
++
++define Package/fcgixx
++ $(call Package/fcgi/Default)
++ DEPENDS:=fcgi $(CXX_DEPENDS)
++ TITLE:=Shared library of FastCGI++
++endef
++
++define Package/fcgi/description
++ FastCGI is a language independent, scalable, open extension to
++ CGI that provides high performance without the limitations of
++ server specific APIs.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++CONFIGURE_VARS += \
++ LIBS="-lm" \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/fastcgi.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/fcgi{app,_config,misc,o,os,_stdio}.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfcgi{,++}.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/fcgi/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/cgi-fcgi $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfcgi.so.* $(1)/usr/lib/
++endef
++
++define Package/fcgixx/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfcgi++.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,fcgi))
++$(eval $(call BuildPackage,fcgixx))
+diff --git a/feeds/packages/libs/fcgi/patches/100-fcgio-int-type-fix.patch b/feeds/packages/libs/fcgi/patches/100-fcgio-int-type-fix.patch
+new file mode 100644
+index 0000000..0fbfbfd
+--- /dev/null
++++ b/feeds/packages/libs/fcgi/patches/100-fcgio-int-type-fix.patch
+@@ -0,0 +1,38 @@
++Index: fcgi-2.4.0/include/fcgio.h
++===================================================================
++--- fcgi-2.4.0.orig/include/fcgio.h 2007-07-17 13:30:28.000000000 +0200
+++++ fcgi-2.4.0/include/fcgio.h 2007-07-17 13:30:28.000000000 +0200
++@@ -77,10 +77,10 @@
++ virtual int sync();
++
++ // Remove and return the current character.
++- virtual int uflow();
+++ virtual int_type uflow();
++
++ // Fill the get area (if buffered) and return the current character.
++- virtual int underflow();
+++ virtual int_type underflow();
++
++ // Use a buffer. The only reasons that a buffer would be useful is
++ // to support the use of the unget()/putback() or seek() methods. Using
++diff -urN fcgi-2.4.0/libfcgi/fcgio.cpp fcgi-2.4.0.new/libfcgi/fcgio.cpp
++--- fcgi-2.4.0/libfcgi/fcgio.cpp 2002-02-24 21:12:22.000000000 +0100
+++++ fcgi-2.4.0.new/libfcgi/fcgio.cpp 2007-08-28 11:22:22.000000000 +0200
++@@ -89,7 +89,7 @@
++ }
++
++ // uflow() removes the char, underflow() doesn't
++-int fcgi_streambuf::uflow()
+++std::basic_streambuf<char>::int_type fcgi_streambuf::uflow()
++ {
++ int rv = underflow();
++ if (this->bufsize) gbump(1);
++@@ -97,7 +97,7 @@
++ }
++
++ // Note that the expected behaviour when there is no buffer varies
++-int fcgi_streambuf::underflow()
+++std::basic_streambuf<char>::int_type fcgi_streambuf::underflow()
++ {
++ if (this->bufsize)
++ {
+diff --git a/feeds/packages/libs/fcgi/patches/110-no_examples.patch b/feeds/packages/libs/fcgi/patches/110-no_examples.patch
+new file mode 100644
+index 0000000..8c14e8a
+--- /dev/null
++++ b/feeds/packages/libs/fcgi/patches/110-no_examples.patch
+@@ -0,0 +1,24 @@
++diff -urN fcgi-2.4.0/Makefile.am fcgi-2.4.0.new/Makefile.am
++--- fcgi-2.4.0/Makefile.am 2001-12-22 14:05:39.000000000 +0100
+++++ fcgi-2.4.0.new/Makefile.am 2007-08-28 11:05:10.000000000 +0200
++@@ -4,7 +4,7 @@
++ # $Id: Makefile.am,v 1.7 2001/12/22 13:05:39 robs Exp $
++ #
++
++-SUBDIRS = libfcgi cgi-fcgi examples include
+++SUBDIRS = libfcgi cgi-fcgi include
++
++ include_HEADERS = fcgi_config.h
++
++diff -urN fcgi-2.4.0/Makefile.in fcgi-2.4.0.new/Makefile.in
++--- fcgi-2.4.0/Makefile.in 2003-01-19 18:21:15.000000000 +0100
+++++ fcgi-2.4.0.new/Makefile.in 2007-08-28 11:04:55.000000000 +0200
++@@ -93,7 +93,7 @@
++ am__quote = @am__quote@
++ install_sh = @install_sh@
++
++-SUBDIRS = libfcgi cgi-fcgi examples include
+++SUBDIRS = libfcgi cgi-fcgi include
++
++ include_HEADERS = fcgi_config.h
++
+diff --git a/feeds/packages/libs/fcgi/patches/120-stdio.patch b/feeds/packages/libs/fcgi/patches/120-stdio.patch
+new file mode 100644
+index 0000000..94c7894
+--- /dev/null
++++ b/feeds/packages/libs/fcgi/patches/120-stdio.patch
+@@ -0,0 +1,12 @@
++Index: fcgi-2.4.0/libfcgi/fcgio.cpp
++===================================================================
++--- fcgi-2.4.0.orig/libfcgi/fcgio.cpp 2014-05-15 10:43:15.153971782 +0200
+++++ fcgi-2.4.0/libfcgi/fcgio.cpp 2014-05-15 10:44:44.037974020 +0200
++@@ -23,6 +23,7 @@
++ #endif
++
++ #include <limits.h>
+++#include <stdio.h>
++ #include "fcgio.h"
++
++ using std::streambuf;
+diff --git a/feeds/packages/libs/fftw3/Makefile b/feeds/packages/libs/fftw3/Makefile
+new file mode 100644
+index 0000000..7d31b73
+--- /dev/null
++++ b/feeds/packages/libs/fftw3/Makefile
+@@ -0,0 +1,119 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=fftw3
++PKG_VERSION:=3.3.4
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0+
++
++PKG_SOURCE:=fftw-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.fftw.org
++PKG_MD5SUM:=2edab8c06b24feeb3b82bbb3ebf3e7b3
++
++PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/fftw-$(PKG_VERSION)
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/fftw3
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=@!avr32 +libpthread
++ VARIANT:=double
++ TITLE:=Fast Fourier transform library
++ URL:=http://www.fftw.org/
++ MAINTAINER:=Vladimir Ulrich <admin@evl.su>
++endef
++
++define Package/fftw3f
++ $(call Package/fftw3)
++ VARIANT:=single
++ TITLE+= (single precision)
++endef
++
++define Package/fftw3l
++ $(call Package/fftw3)
++ DEPENDS:=@BROKEN
++ VARIANT:=long-double
++ TITLE+= (long-double precision)
++endef
++
++define Package/fftw3/description
++ FFTW is a collection of fast C routines for computing the
++ Discrete Fourier Transform in one or more dimensions. It
++ includes complex, real, and parallel transforms, and can
++ handle arbitrary array sizes efficiently.
++endef
++
++define Package/fftw3f/description
++ $(call Package/fftw3/description)
++
++ This package contains the single precision library.
++endef
++
++define Package/fftw3l/description
++ $(call Package/fftw3/description)
++
++ This package contains the long-double precision library.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --prefix=/usr \
++ --without-libiconv-prefix \
++ --without-libintl-prefix \
++ --enable-shared \
++ --enable-threads \
++ --enable-type-prefix \
++ --disable-debug \
++ --disable-fortran
++
++ifeq ($(BUILD_VARIANT), single)
++CONFIGURE_ARGS += \
++ --enable-single
++endif
++
++ifeq ($(BUILD_VARIANT), long-double)
++CONFIGURE_ARGS += \
++ --enable-long-double
++endif
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) DESTDIR="$(PKG_INSTALL_DIR)" install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/fftw3.h $(1)/usr/include
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfftw3*.{a,la} $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfftw3*.so* $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/fftw3/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfftw3.so* $(1)/usr/lib/
++endef
++
++define Package/fftw3f/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfftw3f.so* $(1)/usr/lib/
++endef
++
++define Package/fftw3l/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfftw3l.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,fftw3))
++$(eval $(call BuildPackage,fftw3f))
++$(eval $(call BuildPackage,fftw3l))
+diff --git a/feeds/packages/libs/fftw3/patches/001-makefile.patch b/feeds/packages/libs/fftw3/patches/001-makefile.patch
+new file mode 100644
+index 0000000..c5dd857
+--- /dev/null
++++ b/feeds/packages/libs/fftw3/patches/001-makefile.patch
+@@ -0,0 +1,20 @@
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -232,7 +232,7 @@
++ CTAGS = ctags
++ CSCOPE = cscope
++ DIST_SUBDIRS = support genfft kernel simd-support dft rdft reodft api \
++- libbench2 . threads tests mpi doc tools m4
+++ libbench2 . threads mpi doc tools m4
++ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
++ distdir = $(PACKAGE)-$(VERSION)
++ top_distdir = $(distdir)
++@@ -444,7 +444,7 @@
++ #
++ @COMBINED_THREADS_TRUE@CHICKEN_EGG = threads .
++ SUBDIRS = support $(GENFFT) kernel simd-support dft rdft reodft api \
++-libbench2 $(CHICKEN_EGG) tests mpi doc tools m4
+++libbench2 $(CHICKEN_EGG) mpi m4
++
++ EXTRA_DIST = COPYRIGHT bootstrap.sh CONVENTIONS fftw.pc.in
++ SIMD_LIBS = \
+diff --git a/feeds/packages/libs/file/Makefile b/feeds/packages/libs/file/Makefile
+new file mode 100644
+index 0000000..90ab6f4
+--- /dev/null
++++ b/feeds/packages/libs/file/Makefile
+@@ -0,0 +1,97 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=file
++PKG_VERSION:=5.25
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=ftp://ftp.astron.com/pub/file/
++PKG_MD5SUM:=e6a972d4e10d9e76407a432f4a63cd4c
++
++PKG_LICENSE:=BSD-2c
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/file/Default
++ TITLE:=File type determination
++ URL:=ftp://ftp.astron.com/pub/file/
++ MAINTAINER:=Luka Perkov <luka@openwrt.org>
++endef
++
++define Package/file
++$(call package/file/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= utility
++ DEPENDS:=+libmagic
++endef
++
++define Package/libmagic
++$(call package/file/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= library
++ DEPENDS:=+zlib
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++MAKE_PATH := src
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/Compile/magic
++ ( cd $(PKG_BUILD_DIR)/magic/Magdir; \
++ for f in `ls`; do \
++ cat $$$${f}; \
++ done \
++ ) > $(PKG_BUILD_DIR)/magic/magic
++endef
++Hooks/Compile/Post += Build/Compile/magic
++
++define Build/Install/magic
++ $(INSTALL_DIR) $(PKG_INSTALL_DIR)/usr/share/file
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/magic/magic $(PKG_INSTALL_DIR)/usr/share/file/
++endef
++Hooks/Install/Post += Build/Install/magic
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/magic.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libmagic.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/file/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/file $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/share/misc
++ $(SED) "/^#/d" $(PKG_INSTALL_DIR)/usr/share/file/magic
++ $(SED) "/^$$$$/d" $(PKG_INSTALL_DIR)/usr/share/file/magic
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/file/magic $(1)/usr/share/misc/
++
++ # For some reason both "magic" and "magic.mgc" MUST exist
++ ln -sf magic $(1)/usr/share/misc/magic.mgc
++endef
++
++define Package/libmagic/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libmagic.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,file))
++$(eval $(call BuildPackage,libmagic))
+diff --git a/feeds/packages/libs/flac/Makefile b/feeds/packages/libs/flac/Makefile
+new file mode 100644
+index 0000000..7d94cb6
+--- /dev/null
++++ b/feeds/packages/libs/flac/Makefile
+@@ -0,0 +1,75 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=flac
++PKG_VERSION:=1.3.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://downloads.xiph.org/releases/flac/
++PKG_MD5SUM:=b9922c9a0378c88d3e901b234f852698
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_INSTALL:=1
++
++PKG_LICENSE:=GFDL-1.2 GPL-2 LGPL-2.1 BSD-3-Clause
++PKG_LICENSE_FILES:=README COPYING.FDL COPYING.GPL COPYING.LGPL COPYING.Xiph
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=autogen.sh aclocal.m4
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libflac
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Free Lossless Audio Codec library
++ URL:=https://xiph.org/flac
++endef
++
++CONFIGURE_ARGS += \
++ --disable-cpplibs \
++ --disable-sse \
++ --disable-3dnow \
++ --disable-altivec \
++ --disable-doxgen-docs \
++ --disable-local-xmms-plugin \
++ --disable-xmms-plugin \
++ --disable-ogg \
++ --disable-oggtest \
++ --disable-debug \
++ --enable-static \
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/FLAC \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libFLAC.{a,so*,la} \
++ $(1)/usr/lib/
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* \
++ $(1)/usr/lib/pkgconfig/
++
++ $(INSTALL_DIR) $(1)/usr/share/aclocal/
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/share/aclocal/* \
++ $(1)/usr/share/aclocal/
++endef
++
++define Package/libflac/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libFLAC.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libflac))
+diff --git a/feeds/packages/libs/flac/patches/001-no-docs-and-examples.patch b/feeds/packages/libs/flac/patches/001-no-docs-and-examples.patch
+new file mode 100644
+index 0000000..72b2631
+--- /dev/null
++++ b/feeds/packages/libs/flac/patches/001-no-docs-and-examples.patch
+@@ -0,0 +1,25 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -31,7 +31,7 @@
++
++ ACLOCAL_AMFLAGS = -I m4
++
++-SUBDIRS = doc include m4 man src examples test build objs
+++SUBDIRS = include m4 src build objs
++
++ EXTRA_DIST = \
++ COPYING.FDL \
++--- a/src/Makefile.am
+++++ b/src/Makefile.am
++@@ -30,11 +30,6 @@ SUBDIRS = \
++ flac \
++ metaflac \
++ $(XMMS_DIRS) \
++- test_grabbag \
++- test_libs_common \
++- test_libFLAC \
++- test_seeking \
++- test_streams \
++ utils \
++ $(CPPLIBS_DIRS)
++
+diff --git a/feeds/packages/libs/flac/patches/002-no-utility.patch b/feeds/packages/libs/flac/patches/002-no-utility.patch
+new file mode 100644
+index 0000000..f744602
+--- /dev/null
++++ b/feeds/packages/libs/flac/patches/002-no-utility.patch
+@@ -0,0 +1,13 @@
++--- a/src/Makefile.am
+++++ b/src/Makefile.am
++@@ -27,10 +27,7 @@ endif
++ SUBDIRS = \
++ share \
++ libFLAC \
++- flac \
++- metaflac \
++ $(XMMS_DIRS) \
++- utils \
++ $(CPPLIBS_DIRS)
++
++ EXTRA_DIST = \
+diff --git a/feeds/packages/libs/flac/patches/010-automake-compat.patch b/feeds/packages/libs/flac/patches/010-automake-compat.patch
+new file mode 100644
+index 0000000..8318048
+--- /dev/null
++++ b/feeds/packages/libs/flac/patches/010-automake-compat.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -33,6 +33,8 @@ ACLOCAL_AMFLAGS = -I m4
++
++ SUBDIRS = include m4 src build objs
++
+++ACLOCAL_AMFLAGS = -I m4
+++
++ EXTRA_DIST = \
++ COPYING.FDL \
++ COPYING.GPL \
+diff --git a/feeds/packages/libs/freetype/Makefile b/feeds/packages/libs/freetype/Makefile
+new file mode 100644
+index 0000000..da9d45f
+--- /dev/null
++++ b/feeds/packages/libs/freetype/Makefile
+@@ -0,0 +1,84 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freetype
++PKG_VERSION:=2.5.5
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/freetype
++PKG_MD5SUM:=2a7a314927011d5030903179cf183be0
++
++PKG_LICENSE:=FTL GPL-2.0 MIT ZLIB
++PKG_LICENSE_FILES:=docs/LICENSE.TXT docs/FTL.TXT docs/GPLv2.TXT src/bdf/README src/pcf/README src/gzip/zlib.h
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_LIBTOOL_PATHS:=builds/unix
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libfreetype
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A free, high-quality and portable font engine
++ URL:=http://www.freetype.org/
++ DEPENDS:=+zlib +libbz2
++endef
++
++define Package/libfreetype/description
++ The FreeType project is a team of volunteers who develop free,
++ portable and high-quality software solutions for digital typography.
++ They specifically target embedded systems and focus on bringing small,
++ efficient and ubiquitous products.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --with-bzip2=yes \
++ --with-zlib=yes \
++ --with-png=no \
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) DESTDIR="$(PKG_INSTALL_DIR)" all install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(2)/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/freetype-config $(2)/bin/
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/freetype2 $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfreetype.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/freetype2.pc $(1)/usr/lib/pkgconfig/
++
++ $(SED) \
++ 's,^\(prefix\|exec_prefix\)=.*,\1="$(STAGING_DIR)/usr",; \
++ s,^\(includedir\)=.*,\1="$(STAGING_DIR)/usr/include",; \
++ s,^\(libdir\)=.*,\1="$(STAGING_DIR)/usr/lib",' \
++ $(2)/bin/freetype-config
++ $(SED) \
++ 's,/usr/include,$$$${prefix}/include,g; \
++ s,/usr/lib,$$$${exec_prefix}/lib,g' \
++ $(1)/usr/lib/pkgconfig/freetype2.pc
++endef
++
++
++define Package/libfreetype/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfreetype.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,libfreetype))
+diff --git a/feeds/packages/libs/gdbm/Makefile b/feeds/packages/libs/gdbm/Makefile
+new file mode 100644
+index 0000000..21ecfb2
+--- /dev/null
++++ b/feeds/packages/libs/gdbm/Makefile
+@@ -0,0 +1,67 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gdbm
++PKG_VERSION:=1.11
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@GNU/gdbm
++PKG_MD5SUM:=72c832680cf0999caedbe5b265c8c1bd
++
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_FIXUP:=autoreconf gettext-version
++PKG_REMOVE_FILES:=Makefile compat/Makefile doc/Makefile export/Makefile src/Makefile tests/Makefile
++PKG_BUILD_PARALLEL:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libgdbm
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GNU database manager
++ URL:=http://www.gnu.org/software/gdbm/
++endef
++
++define Package/libgdbm/description
++ GNU database manager library
++ GNU dbm is a set of database routines that use extendible hashing and
++ works similar to the standard UNIX dbm routines.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++define Build/Compile
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
++ BINOWN=`id -u` \
++ BINGRP=`id -g` \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/gdbm.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgdbm.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/libgdbm/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgdbm.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libgdbm))
+diff --git a/feeds/packages/libs/giflib/Makefile b/feeds/packages/libs/giflib/Makefile
+new file mode 100644
+index 0000000..efeabee
+--- /dev/null
++++ b/feeds/packages/libs/giflib/Makefile
+@@ -0,0 +1,61 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=giflib
++PKG_VERSION:=5.1.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/giflib
++PKG_MD5SUM:=1c39333192712788c6568c78a949f13e
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=autogen.sh aclocal.m4
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/giflib
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GIF libraries
++ URL:=http://sourceforge.net/projects/giflib
++endef
++
++define Package/giflib/description
++ giflib is a library for reading and writing gif images.
++ It is API and ABI compatible with libungif which was in wide use while
++ the LZW compression algorithm was patented.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++CONFIGURE_ARGS += --enable-x11=no
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/{lib,include}
++ $(CP) $(PKG_BUILD_DIR)/lib/.libs/lib*so* $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/lib/.libs/libgif.a $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/lib/libgif.la $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/lib/*.h $(1)/usr/include/
++endef
++
++define Package/giflib/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/lib/.libs/lib*so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,giflib))
+diff --git a/feeds/packages/libs/glib2/Makefile b/feeds/packages/libs/glib2/Makefile
+new file mode 100644
+index 0000000..d8500e6
+--- /dev/null
++++ b/feeds/packages/libs/glib2/Makefile
+@@ -0,0 +1,106 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=glib2
++PKG_VERSION:=2.44.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=glib-$(PKG_VERSION).tar.xz
++PKG_BUILD_DIR:=$(BUILD_DIR)/glib-$(PKG_VERSION)
++PKG_SOURCE_URL:=@GNOME/glib/2.44
++PKG_MD5SUM:=83efba4722a9674b97437d1d99af79db
++
++PKG_BUILD_PARALLEL:=1
++HOST_BUILD_PARALLEL:=1
++PKG_BUILD_DEPENDS:=glib2/host libpthread zlib libintl libffi
++HOST_BUILD_DEPENDS:=libintl/host libiconv/host libffi/host
++PKG_INSTALL:=1
++PKG_USE_MIPS16:=0
++
++PKG_FIXUP:=autoreconf
++
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/glib-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/glib2
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=$(ICONV_DEPENDS) $(INTL_DEPENDS) +zlib +libpthread +libffi +libattr
++ TITLE:=glib 2.0
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++ URL:=http://www.gtk.org/
++endef
++
++define Package/glib2/description
++ The GLib library of C routines
++endef
++
++HOST_CONFIGURE_ARGS += \
++ --disable-selinux
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --enable-debug=no \
++ --disable-selinux \
++ --disable-fam \
++ $(if $(ICONV_FULL),--with-libiconv=gnu)
++
++CONFIGURE_VARS += \
++ glib_cv_stack_grows=no \
++ glib_cv_uscore=no \
++ ac_cv_path_GLIB_GENMARSHAL=$(STAGING_DIR_HOST)/bin/glib-genmarshal \
++ ac_cv_func_mmap_fixed_mapped=yes \
++ ac_cv_func_posix_getpwuid_r=yes \
++ ac_cv_func_posix_getgrgid_r=yes
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/glib-2.0 \
++ $(1)/usr/include/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/glib-2.0/include/*.h \
++ $(1)/usr/include/glib-2.0/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/gio-unix-2.0 \
++ $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/glib-2.0 \
++ $(1)/usr/lib/
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.{so*,a,la} \
++ $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/*.pc \
++ $(1)/usr/lib/pkgconfig
++
++ $(INSTALL_DIR) $(2)/share/aclocal/
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/share/aclocal/*.m4 \
++ $(2)/share/aclocal/
++endef
++
++define Package/glib2/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.so* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,glib2))
+diff --git a/feeds/packages/libs/glib2/patches/001-automake-compat.patch b/feeds/packages/libs/glib2/patches/001-automake-compat.patch
+new file mode 100644
+index 0000000..602d3f1
+--- /dev/null
++++ b/feeds/packages/libs/glib2/patches/001-automake-compat.patch
+@@ -0,0 +1,11 @@
++--- a/gtk-doc.make
+++++ b/gtk-doc.make
++@@ -271,7 +271,7 @@ uninstall-local:
++ #
++ # Require gtk-doc when making dist
++ #
++-if HAVE_GTK_DOC
+++if ENABLE_GTK_DOC
++ dist-check-gtkdoc: docs
++ else
++ dist-check-gtkdoc:
+diff --git a/feeds/packages/libs/glib2/patches/100-fix-gio-linking.patch b/feeds/packages/libs/glib2/patches/100-fix-gio-linking.patch
+new file mode 100644
+index 0000000..3ce57fc
+--- /dev/null
++++ b/feeds/packages/libs/glib2/patches/100-fix-gio-linking.patch
+@@ -0,0 +1,10 @@
++--- a/gio/Makefile.am
+++++ b/gio/Makefile.am
++@@ -707,6 +707,7 @@ bin_PROGRAMS = gio-querymodules glib-com
++
++ glib_compile_resources_LDADD = libgio-2.0.la \
++ $(top_builddir)/gobject/libgobject-2.0.la \
+++ $(top_builddir)/gmodule/libgmodule-2.0.la \
++ $(top_builddir)/glib/libglib-2.0.la \
++ $(NULL)
++
+diff --git a/feeds/packages/libs/glpk/Makefile b/feeds/packages/libs/glpk/Makefile
+new file mode 100644
+index 0000000..e8ef539
+--- /dev/null
++++ b/feeds/packages/libs/glpk/Makefile
+@@ -0,0 +1,66 @@
++#
++# Copyright (C) 2010-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=glpk
++PKG_VERSION:=4.55
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@GNU/$(PKG_NAME)
++PKG_MD5SUM:=c632a7a631b8aed02e28eafcd99477f
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libglpk
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=The GNU Linear Programming Kit
++ URL:=http://www.gnu.org/software/glpk/
++endef
++
++define Package/libglpk/description
++ The GLPK (GNU Linear Programming Kit) package is intended for solving
++ large-scale linear programming (LP), mixed integer programming (MIP),
++ and other related problems. It is a set of routines written in ANSI C
++ and organized in the form of a callable library.
++endef
++
++define Package/glpsol
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=The GNU Linear Programming Kit (glpsol)
++ URL:=http://www.gnu.org/software/glpk/
++ DEPENDS:=libglpk
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{so*,a,la} $(1)/usr/lib/
++endef
++
++define Package/libglpk/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
++endef
++
++define Package/glpsol/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/glpsol $(1)/usr/bin
++endef
++
++$(eval $(call BuildPackage,libglpk))
++$(eval $(call BuildPackage,glpsol))
+diff --git a/feeds/packages/libs/gnutls/Config.in b/feeds/packages/libs/gnutls/Config.in
+new file mode 100644
+index 0000000..59ca00f
+--- /dev/null
++++ b/feeds/packages/libs/gnutls/Config.in
+@@ -0,0 +1,52 @@
++# gnutls avanced configuration
++
++menu "Configuration"
++ depends on PACKAGE_libgnutls
++
++config GNUTLS_DTLS_SRTP
++ bool "enable DTLS SRTP support"
++ default y
++
++config GNUTLS_ALPN
++ bool "enable ALPN support"
++ default y
++
++config GNUTLS_OCSP
++ bool "enable ocsp support"
++ default y
++
++config GNUTLS_CRYPTODEV
++ bool "enable /dev/crypto support"
++ select PACKAGE_kmod-cryptodev
++ default n
++
++config GNUTLS_HEARTBEAT
++ bool "enable DTLS heartbeat support"
++ default y
++
++config GNUTLS_OPENPGP
++ bool "enable OPENPGP authentication support"
++ default n
++
++config GNUTLS_SRP
++ bool "enable SRP authentication support"
++ default n
++
++config GNUTLS_PSK
++ bool "enable PSK authentication support"
++ default y
++
++config GNUTLS_ANON
++ bool "enable anonymous authentication support"
++ default y
++
++config GNUTLS_PKCS11
++ bool "enable smart card (PKCS11) support"
++ select GNUTLS_EXT_LIBTASN1
++ default n
++
++config GNUTLS_EXT_LIBTASN1
++ bool "use external libtasn1"
++ default n
++
++endmenu
+diff --git a/feeds/packages/libs/gnutls/Makefile b/feeds/packages/libs/gnutls/Makefile
+new file mode 100644
+index 0000000..8dbf721
+--- /dev/null
++++ b/feeds/packages/libs/gnutls/Makefile
+@@ -0,0 +1,234 @@
++#
++# Copyright (C) 2005-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gnutls
++PKG_VERSION:=3.4.6
++PKG_RELEASE:=1
++PKG_USE_MIPS16:=0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=ftp://ftp.gnutls.org/gcrypt/gnutls/v3.4
++PKG_MD5SUM:=4f2c4b4483da65de7edfeb050911fafb
++#PKG_FIXUP:=autoreconf gettext-version
++PKG_MAINTAINER:=Nikos Mavrogiannopoulos <nmav@gnutls.org>
++PKG_LICENSE:=LGPLv2.1+
++
++PKG_INSTALL:=1
++PKG_LIBTOOL_PATHS:=. lib
++PKG_CHECK_FORMAT_SECURITY:=0
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_GNUTLS_ALPN \
++ CONFIG_GNUTLS_ANON \
++ CONFIG_GNUTLS_CRYPTODEV \
++ CONFIG_GNUTLS_DTLS_SRTP \
++ CONFIG_GNUTLS_EXT_LIBTASN1 \
++ CONFIG_GNUTLS_HEARTBEAT \
++ CONFIG_GNUTLS_OCSP \
++ CONFIG_GNUTLS_OPENPGP \
++ CONFIG_GNUTLS_PKCS11 \
++ CONFIG_GNUTLS_PSK \
++ CONFIG_GNUTLS_SRP \
++ CONFIG_LIBNETTLE_MINI \
++
++include $(INCLUDE_DIR)/package.mk
++
++
++define Package/gnutls/Default
++ SUBMENU:=SSL
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GNU TLS
++ URL:=http://www.gnutls.org/
++endef
++
++define Package/gnutls/Default/description
++ GnuTLS is a secure communications library implementing the SSL, TLS
++ and DTLS protocols and technologies around them. It provides a simple
++ C language application programming interface (API) to access the secure
++ communications protocols as well as APIs to parse and write X.509, PKCS12,
++ OpenPGP and other required structures. It is aimed to be portable and
++ efficient with focus on security and interoperability.
++endef
++
++
++define Package/certtool
++$(call Package/gnutls/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= (certool utility)
++ DEPENDS+= +libgnutls
++endef
++
++define Package/certtool/description
++$(call Package/gnutls/Default/description)
++ This package contains the GnuTLS certtool utility.
++endef
++
++
++define Package/gnutls-utils
++$(call Package/gnutls/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= (utilities)
++ DEPENDS+= +libgnutls
++endef
++
++define Package/gnutls-utils/description
++$(call Package/gnutls/Default/description)
++ This package contains the GnuTLS gnutls-cli, gnutls-serv, psktool,
++ and srptool utilities.
++endef
++
++define Package/libgnutls/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/libgnutls
++$(call Package/gnutls/Default)
++ TITLE+= (library)
++ DEPENDS+= +libnettle +!LIBNETTLE_MINI:libgmp +GNUTLS_EXT_LIBTASN1:libtasn1 +GNUTLS_PKCS11:p11-kit
++endef
++
++define Package/libgnutls/description
++$(call Package/gnutls/Default/description)
++ This package contains the GnuTLS shared library, needed by other programs.
++endef
++
++
++CONFIGURE_ARGS+= \
++ --enable-shared \
++ --enable-static \
++ --disable-rpath \
++ --disable-libdane \
++ --disable-guile \
++ --disable-nls \
++ --without-zlib \
++ --enable-local-libopts \
++ --disable-doc \
++ --disable-tests \
++ --with-default-trust-store-dir=/etc/ssl/certs/ \
++ --disable-crywrap \
++ --with-librt-prefix="$(LIBRT_ROOT_DIR)/"
++
++ifneq ($(CONFIG_GNUTLS_EXT_LIBTASN1),y)
++CONFIGURE_ARGS += --with-included-libtasn1
++endif
++
++ifneq ($(CONFIG_GNUTLS_PKCS11),y)
++CONFIGURE_ARGS += --without-p11-kit
++endif
++
++ifeq ($(CONFIG_LIBNETTLE_MINI),y)
++CONFIGURE_ARGS += --with-nettle-mini
++endif
++
++ifneq ($(CONFIG_GNUTLS_DTLS_SRTP),y)
++CONFIGURE_ARGS += --disable-dtls-srtp-support
++endif
++
++ifneq ($(CONFIG_GNUTLS_ALPN),y)
++CONFIGURE_ARGS += --disable-alpn-support
++endif
++
++ifneq ($(CONFIG_GNUTLS_HEARTBEAT),y)
++CONFIGURE_ARGS += --disable-heartbeat-support
++endif
++
++ifneq ($(CONFIG_GNUTLS_SRP),y)
++CONFIGURE_ARGS += --disable-srp-authentication
++endif
++
++ifneq ($(CONFIG_GNUTLS_PSK),y)
++CONFIGURE_ARGS += --disable-psk-authentication
++endif
++
++ifneq ($(CONFIG_GNUTLS_OPENPGP),y)
++CONFIGURE_ARGS += --disable-openpgp-authentication
++endif
++
++ifneq ($(CONFIG_GNUTLS_ANON),y)
++CONFIGURE_ARGS += --disable-anon-authentication
++endif
++
++ifneq ($(CONFIG_GNUTLS_OCSP),y)
++CONFIGURE_ARGS += --disable-ocsp
++endif
++
++ifeq ($(CONFIG_GNUTLS_CRYPTODEV),y)
++CONFIGURE_ARGS += --enable-cryptodev
++endif
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libgnutls.so* \
++ $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/gnutls \
++ $(1)/usr/include/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/gnutls.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++
++define Package/certtool/conffiles
++/etc/gnutls/certtool.cfg
++endef
++
++define Package/certtool/install
++ $(INSTALL_DIR) $(1)/etc/gnutls
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/doc/certtool.cfg $(1)/etc/gnutls/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/certtool $(1)/usr/bin/
++endef
++
++
++define Package/gnutls-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ifeq ($(CONFIG_GNUTLS_OCSP),y)
++ifeq ($(CONFIG_GNUTLS_ANON),y)
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/bin/gnutls-{cli,serv} \
++ $(1)/usr/bin/
++endif
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/bin/ocsptool \
++ $(1)/usr/bin/
++endif
++ifeq ($(CONFIG_GNUTLS_SRP),y)
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/bin/srptool \
++ $(1)/usr/bin/
++endif
++ifeq ($(CONFIG_GNUTLS_PSK),y)
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/bin/psktool \
++ $(1)/usr/bin/
++endif
++ifeq ($(CONFIG_GNUTLS_PKCS11),y)
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/bin/p11tool \
++ $(1)/usr/bin/
++endif
++endef
++
++
++define Package/libgnutls/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgnutls.so.* $(1)/usr/lib/
++endef
++
++
++$(eval $(call BuildPackage,certtool))
++$(eval $(call BuildPackage,gnutls-utils))
++$(eval $(call BuildPackage,libgnutls))
+diff --git a/feeds/packages/libs/gperf/Makefile b/feeds/packages/libs/gperf/Makefile
+new file mode 100644
+index 0000000..4cdd470
+--- /dev/null
++++ b/feeds/packages/libs/gperf/Makefile
+@@ -0,0 +1,47 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gperf
++PKG_VERSION:=3.0.4
++PKG_RELEASE:=1
++PKG_MD5SUM:=c1f1db32fb6598d6a93e6e88796a8632
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@GNU/gperf
++PKG_HOST_ONLY=1
++
++PKG_MAINTAINER:=Espen Jürgensen <espenjurgensen+openwrt@gmail.com>
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/gperf
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GNU gperf
++ BUILDONLY:=1
++ URL:=http://www.gnu.org/software/gperf
++endef
++
++define Package/gperf/description
++ GNU gperf is a perfect hash function generator. For a given list of strings, it
++ produces a hash function and hash table, in form of C or C++ code, for looking
++ up a value depending on the input string. The hash function is perfect, which
++ means that the hash table has no collisions, and the hash table lookup needs a
++ single string comparison only.
++endef
++
++define Host/Install
++ $(MAKE) -C $(HOST_BUILD_DIR) install
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,gperf))
+diff --git a/feeds/packages/libs/hidapi/Makefile b/feeds/packages/libs/hidapi/Makefile
+new file mode 100644
+index 0000000..e8ef733
+--- /dev/null
++++ b/feeds/packages/libs/hidapi/Makefile
+@@ -0,0 +1,77 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=hidapi
++PKG_VERSION:=0.8.0-rc1
++PKG_RELEASE:=2
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/signal11/hidapi.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=hidapi-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_SOURCE_VERSION).tar.gz
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENSE-bsd.txt
++
++PKG_MAINTAINER:=Paul Fertser <fercerpav@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/hidapi
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libusb-1.0 +librt $(ICONV_DEPENDS)
++ TITLE:=Library to talk to HID devices
++ URL:=http://www.signal11.us/oss/hidapi/
++endef
++
++define Package/hidapi/description
++HIDAPI is a multi-platform library which allows an application to interface
++with USB and Bluetooth HID-Class devices on Windows, Linux, FreeBSD, and Mac
++OS X. HIDAPI can be either built as a shared library (.so or .dll) or
++can be embedded directly into a target application by adding a single source
++file (per platform) and a single header.
++endef
++
++define Build/Configure
++endef
++
++MAKE_PATH=libusb
++MAKE_FLAGS+=-f Makefile.linux
++TARGET_CFLAGS+=$(FPIC)
++
++define Build/Compile
++ $(call Build/Compile/Default, libhidapi-libusb.so)
++ mv $(PKG_BUILD_DIR)/libusb/libhidapi-libusb.so \
++ $(PKG_BUILD_DIR)/libusb/libhidapi-libusb.so.0
++ ln -s libhidapi-libusb.so.0 $(PKG_BUILD_DIR)/libusb/libhidapi-libusb.so
++ sed 's^@prefix@^/usr^; \
++ s^@exec_prefix@^/usr^; \
++ s^@libdir@^$$$${exec_prefix}/lib^; \
++ s^@includedir@^$$$${prefix}/include^' \
++ < $(PKG_BUILD_DIR)/pc/hidapi-libusb.pc.in \
++ > $(PKG_BUILD_DIR)/pc/hidapi-libusb.pc
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/hidapi
++ $(CP) $(PKG_BUILD_DIR)/hidapi/hidapi.h $(1)/usr/include/hidapi/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/libusb/libhidapi-libusb.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_BUILD_DIR)/pc/hidapi-libusb.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/hidapi/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/libusb/libhidapi-libusb.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,hidapi))
+diff --git a/feeds/packages/libs/hidapi/patches/010-add-iconv-linkage.patch b/feeds/packages/libs/hidapi/patches/010-add-iconv-linkage.patch
+new file mode 100644
+index 0000000..d942d50
+--- /dev/null
++++ b/feeds/packages/libs/hidapi/patches/010-add-iconv-linkage.patch
+@@ -0,0 +1,22 @@
++Index: hidapi-0.8.0-rc1/libusb/Makefile.linux
++===================================================================
++--- hidapi-0.8.0-rc1.orig/libusb/Makefile.linux
+++++ hidapi-0.8.0-rc1/libusb/Makefile.linux
++@@ -22,7 +22,7 @@ COBJS_LIBUSB = hid.o
++ COBJS = $(COBJS_LIBUSB)
++ CPPOBJS = ../hidtest/hidtest.o
++ OBJS = $(COBJS) $(CPPOBJS)
++-LIBS_USB = `pkg-config libusb-1.0 --libs` -lrt -lpthread
+++LIBS_USB = `pkg-config libusb-1.0 --libs` -lrt -lpthread -liconv
++ LIBS = $(LIBS_USB)
++ INCLUDES ?= -I../hidapi `pkg-config libusb-1.0 --cflags`
++
++@@ -33,7 +33,7 @@ hidtest-libusb: $(COBJS_LIBUSB) $(CPPOBJ
++
++ # Shared Libs
++ libhidapi-libusb.so: $(COBJS_LIBUSB)
++- $(CC) $(LDFLAGS) $(LIBS_USB) -shared -fpic -Wl,-soname,$@.0 $^ -o $@
+++ $(CC) $(LDFLAGS) $^ $(LIBS_USB) -shared -fpic -Wl,-soname,$@.0 -o $@
++
++ # Objects
++ $(COBJS): %.o: %.c
+diff --git a/feeds/packages/libs/hiredis/Makefile b/feeds/packages/libs/hiredis/Makefile
+new file mode 100644
+index 0000000..31971b9
+--- /dev/null
++++ b/feeds/packages/libs/hiredis/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2010-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=hiredis
++PKG_VERSION:=0.13.1
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/redis/hiredis.git
++PKG_SOURCE_VERSION:=f58dd249d6ed47a7e835463c3b04722972281dbb
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libhiredis
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Minimalistic C client for Redis
++ URL:=https://github.com/redis/hiredis
++endef
++
++define Package/libhiredis/description
++ Hiredis is a minimalistic C client library for the Redis database.
++endef
++
++MAKE_FLAGS += ARCH="" DEBUG="" PREFIX="/usr"
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/hiredis/adapters
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/hiredis/adapters/* $(1)/usr/include/hiredis/adapters
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/hiredis/*.h $(1)/usr/include/hiredis/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libhiredis.{so*,a} $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/hiredis.pc $(1)/usr/lib/pkgconfig
++endef
++
++define Package/libhiredis/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libhiredis.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libhiredis))
+diff --git a/feeds/packages/libs/ibrcommon/Makefile b/feeds/packages/libs/ibrcommon/Makefile
+new file mode 100644
+index 0000000..579ded3
+--- /dev/null
++++ b/feeds/packages/libs/ibrcommon/Makefile
+@@ -0,0 +1,49 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ibrcommon
++PKG_VERSION:=1.0.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.ibr.cs.tu-bs.de/projects/ibr-dtn/releases
++PKG_MD5SUM:=0104763ede969c470f32244d76c234b8
++PKG_MAINTAINER:=Johannes Morgenroth <jm@m-network.de>
++PKG_LICENSE:=Apache-2.0
++
++PKG_INSTALL:=1
++PKG_FIXUP:=libtool
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ibrcommon
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libstdcpp +libpthread +librt +libnl +libopenssl
++ TITLE:=IBR Common C++ Library
++endef
++
++CONFIGURE_ARGS += \
++ --with-openssl
++
++define Package/ibrcommon/description
++ A library with common functions for C++.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)
++ $(CP) $(PKG_INSTALL_DIR)/* $(1)/
++endef
++
++define Package/ibrcommon/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,ibrcommon))
+diff --git a/feeds/packages/libs/ibrdtn/Makefile b/feeds/packages/libs/ibrdtn/Makefile
+new file mode 100644
+index 0000000..45051ad
+--- /dev/null
++++ b/feeds/packages/libs/ibrdtn/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ibrdtn
++PKG_VERSION:=1.0.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.ibr.cs.tu-bs.de/projects/ibr-dtn/releases
++PKG_MD5SUM:=37208be202f199f1790983ff78b2fa8f
++PKG_MAINTAINER:=Johannes Morgenroth <jm@m-network.de>
++PKG_LICENSE:=Apache-2.0
++
++PKG_INSTALL:=1
++PKG_FIXUP:=libtool
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ibrdtn
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+ibrcommon +zlib
++ TITLE:=IBR-DTN Library
++endef
++
++define Package/ibrdtn/description
++ Base library for IBR-DTN daemon and tools.
++endef
++
++CONFIGURE_ARGS += \
++ --with-compression \
++ --without-glib
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)
++ $(CP) $(PKG_INSTALL_DIR)/* $(1)/
++endef
++
++define Package/ibrdtn/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,ibrdtn))
+diff --git a/feeds/packages/libs/intltool/Makefile b/feeds/packages/libs/intltool/Makefile
+new file mode 100644
+index 0000000..7c24469
+--- /dev/null
++++ b/feeds/packages/libs/intltool/Makefile
+@@ -0,0 +1,47 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=intltool
++PKG_LIBVER:=0.40
++PKG_VERSION:=$(PKG_LIBVER).6
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@GNOME/intltool/$(PKG_LIBVER)
++PKG_MD5SUM:=69bc0353323112f42ad4f9cf351bc3e5
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_HOST_ONLY:=1
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/intltool
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=set of tools to centralize translation using GNU gettext
++ URL:=http://www.freedesktop.org/wiki/Software/intltool
++ BUILDONLY:=1
++endef
++
++define Package/intltool/description
++ intltool is a set of tools to centralize translation of many different
++ file formats using GNU gettext-compatible PO files.
++endef
++
++define Require/perl-xml-parser
++ perl -e 'use XML::Parser;'
++endef
++
++$(eval $(call Require,perl-xml-parser, \
++ Please install Perl XML::Parser \
++))
++
++$(eval $(call BuildPackage,intltool))
++$(eval $(call HostBuild))
+diff --git a/feeds/packages/libs/jansson/Makefile b/feeds/packages/libs/jansson/Makefile
+new file mode 100644
+index 0000000..3d18d42
+--- /dev/null
++++ b/feeds/packages/libs/jansson/Makefile
+@@ -0,0 +1,52 @@
++#
++# Copyright (C) 2011-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=jansson
++PKG_VERSION:=2.7
++PKG_RELEASE:=1
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.digip.org/jansson/releases/
++PKG_MD5SUM:=3a106a465bbb77637550b422f5b262ef
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/jansson
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Jansson library
++ URL:=http://www.digip.org/jansson/
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++endef
++
++define Package/jansson/description
++ Jansson is a C library for encoding, decoding and manipulating JSON data
++endef
++
++TARGET_CFLAGS += $(FPIC)
++TARGET_LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib -lm
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/{lib,include}
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libjansson* $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++endef
++
++define Package/jansson/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libjansson*so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,jansson))
+diff --git a/feeds/packages/libs/ldns/Makefile b/feeds/packages/libs/ldns/Makefile
+new file mode 100644
+index 0000000..9a0b4e1
+--- /dev/null
++++ b/feeds/packages/libs/ldns/Makefile
+@@ -0,0 +1,84 @@
++#
++# Copyright (C) 2011-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ldns
++PKG_VERSION:=1.6.17
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.nlnetlabs.nl/downloads/ldns
++PKG_MD5SUM:=a79423bcc4129e6d59b616b1cae11e5e
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENSE
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libldns/Default
++ URL:=http://www.nlnetlabs.nl/projects/ldns/
++ DEPENDS:=+libopenssl
++endef
++
++define Package/libldns
++ $(call Package/libldns/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A library to simplify DNS programming
++endef
++
++define Package/libldns/description
++ The goal of ldns is to simplify DNS programming, it supports recent RFCs like
++ the DNSSEC documents, and allows developers to easily create software
++ conforming to current RFCs, and experimental software for current Internet
++ Drafts.
++endef
++
++define Package/drill
++ $(call Package/libldns/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ TITLE:=DNS(SEC) information tool
++ DEPENDS+= +libldns
++endef
++
++define Package/drill/description
++ drill is a tool to designed to get all sorts of information out of the DNS. It
++ is specificly designed to be used with DNSSEC.
++endef
++
++CONFIGURE_ARGS += \
++ --disable-ecdsa \
++ --disable-gost \
++ --with-drill \
++ --with-ssl="$(STAGING_DIR)/usr"
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/ldns $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libldns.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/libldns/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libldns.so.* $(1)/usr/lib/
++endef
++
++define Package/drill/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/drill $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libldns))
++$(eval $(call BuildPackage,drill))
+diff --git a/feeds/packages/libs/libaio/Makefile b/feeds/packages/libs/libaio/Makefile
+new file mode 100644
+index 0000000..dbcb59f
+--- /dev/null
++++ b/feeds/packages/libs/libaio/Makefile
+@@ -0,0 +1,63 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libaio
++PKG_VERSION:=0.3.110
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).orig.tar.gz
++PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/main/liba/libaio/
++PKG_MD5SUM:=2a35602e43778383e2f4907a4ca39ab8
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=LGPL-2.1
++
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libaio
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Linux kernel AIO interface access library
++ URL:=http://lse.sourceforge.net/io/aio.html
++endef
++
++define Build/Configure
++endef
++
++LIBAIO_CFLAGS:=-nostdlib -nostartfiles -I. $(TARGET_CFLAGS) $(TARGET_CPPFLAGS) $(FPIC)
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ ARCH="$(ARCH)" \
++ CC="$(TARGET_CROSS)gcc" \
++ LD="$(TARGET_CROSS)ld" \
++ CFLAGS="$(LIBAIO_CFLAGS)" \
++ all
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ prefix="$(PKG_INSTALL_DIR)/usr" \
++ install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libaio.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libaio.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/libaio/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libaio.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libaio))
+diff --git a/feeds/packages/libs/libaio/patches/001_arches.patch b/feeds/packages/libs/libaio/patches/001_arches.patch
+new file mode 100644
+index 0000000..4130af3
+--- /dev/null
++++ b/feeds/packages/libs/libaio/patches/001_arches.patch
+@@ -0,0 +1,566 @@
++---
++ harness/main.c | 10 ++
++ src/libaio.h | 1
++ src/syscall-m68k.h | 78 +++++++++++++++++
++ src/syscall-mips.h | 223 +++++++++++++++++++++++++++++++++++++++++++++++++++
++ src/syscall-parisc.h | 146 +++++++++++++++++++++++++++++++++
++ src/syscall-sparc.h | 20 +++-
++ src/syscall.h | 6 +
++ 7 files changed, 479 insertions(+), 5 deletions(-)
++
++--- /dev/null
+++++ b/src/syscall-m68k.h
++@@ -0,0 +1,78 @@
+++#define __NR_io_setup 241
+++#define __NR_io_destroy 242
+++#define __NR_io_getevents 243
+++#define __NR_io_submit 244
+++#define __NR_io_cancel 245
+++
+++#define io_syscall1(type,fname,sname,atype,a) \
+++type fname(atype a) \
+++{ \
+++register long __res __asm__ ("%d0") = __NR_##sname; \
+++register long __a __asm__ ("%d1") = (long)(a); \
+++__asm__ __volatile__ ("trap #0" \
+++ : "+d" (__res) \
+++ : "d" (__a) ); \
+++return (type) __res; \
+++}
+++
+++#define io_syscall2(type,fname,sname,atype,a,btype,b) \
+++type fname(atype a,btype b) \
+++{ \
+++register long __res __asm__ ("%d0") = __NR_##sname; \
+++register long __a __asm__ ("%d1") = (long)(a); \
+++register long __b __asm__ ("%d2") = (long)(b); \
+++__asm__ __volatile__ ("trap #0" \
+++ : "+d" (__res) \
+++ : "d" (__a), "d" (__b) \
+++ ); \
+++return (type) __res; \
+++}
+++
+++#define io_syscall3(type,fname,sname,atype,a,btype,b,ctype,c) \
+++type fname(atype a,btype b,ctype c) \
+++{ \
+++register long __res __asm__ ("%d0") = __NR_##sname; \
+++register long __a __asm__ ("%d1") = (long)(a); \
+++register long __b __asm__ ("%d2") = (long)(b); \
+++register long __c __asm__ ("%d3") = (long)(c); \
+++__asm__ __volatile__ ("trap #0" \
+++ : "+d" (__res) \
+++ : "d" (__a), "d" (__b), \
+++ "d" (__c) \
+++ ); \
+++return (type) __res; \
+++}
+++
+++#define io_syscall4(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d) \
+++type fname (atype a, btype b, ctype c, dtype d) \
+++{ \
+++register long __res __asm__ ("%d0") = __NR_##sname; \
+++register long __a __asm__ ("%d1") = (long)(a); \
+++register long __b __asm__ ("%d2") = (long)(b); \
+++register long __c __asm__ ("%d3") = (long)(c); \
+++register long __d __asm__ ("%d4") = (long)(d); \
+++__asm__ __volatile__ ("trap #0" \
+++ : "+d" (__res) \
+++ : "d" (__a), "d" (__b), \
+++ "d" (__c), "d" (__d) \
+++ ); \
+++return (type) __res; \
+++}
+++
+++#define io_syscall5(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
+++type fname (atype a,btype b,ctype c,dtype d,etype e) \
+++{ \
+++register long __res __asm__ ("%d0") = __NR_##sname; \
+++register long __a __asm__ ("%d1") = (long)(a); \
+++register long __b __asm__ ("%d2") = (long)(b); \
+++register long __c __asm__ ("%d3") = (long)(c); \
+++register long __d __asm__ ("%d4") = (long)(d); \
+++register long __e __asm__ ("%d5") = (long)(e); \
+++__asm__ __volatile__ ("trap #0" \
+++ : "+d" (__res) \
+++ : "d" (__a), "d" (__b), \
+++ "d" (__c), "d" (__d), "d" (__e) \
+++ ); \
+++return (type) __res; \
+++}
+++
++--- a/src/syscall.h
+++++ b/src/syscall.h
++@@ -28,6 +28,12 @@
++ #include "syscall-sparc.h"
++ #elif defined(__aarch64__)
++ #include "syscall-arm64.h"
+++#elif defined(__m68k__)
+++#include "syscall-m68k.h"
+++#elif defined(__hppa__)
+++#include "syscall-parisc.h"
+++#elif defined(__mips__)
+++#include "syscall-mips.h"
++ #else
++ #warning "using generic syscall method"
++ #include "syscall-generic.h"
++--- /dev/null
+++++ b/src/syscall-mips.h
++@@ -0,0 +1,223 @@
+++/*
+++ * This file is subject to the terms and conditions of the GNU General Public
+++ * License. See the file "COPYING" in the main directory of this archive
+++ * for more details.
+++ *
+++ * Copyright (C) 1995, 96, 97, 98, 99, 2000 by Ralf Baechle
+++ * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
+++ *
+++ * Changed system calls macros _syscall5 - _syscall7 to push args 5 to 7 onto
+++ * the stack. Robin Farine for ACN S.A, Copyright (C) 1996 by ACN S.A
+++ */
+++
+++#ifndef _MIPS_SIM_ABI32
+++#define _MIPS_SIM_ABI32 1
+++#define _MIPS_SIM_NABI32 2
+++#define _MIPS_SIM_ABI64 3
+++#endif
+++
+++#if _MIPS_SIM == _MIPS_SIM_ABI32
+++
+++/*
+++ * Linux o32 style syscalls are in the range from 4000 to 4999.
+++ */
+++#define __NR_Linux 4000
+++#define __NR_io_setup (__NR_Linux + 241)
+++#define __NR_io_destroy (__NR_Linux + 242)
+++#define __NR_io_getevents (__NR_Linux + 243)
+++#define __NR_io_submit (__NR_Linux + 244)
+++#define __NR_io_cancel (__NR_Linux + 245)
+++
+++#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
+++
+++#if _MIPS_SIM == _MIPS_SIM_ABI64
+++
+++/*
+++ * Linux 64-bit syscalls are in the range from 5000 to 5999.
+++ */
+++#define __NR_Linux 5000
+++#define __NR_io_setup (__NR_Linux + 200)
+++#define __NR_io_destroy (__NR_Linux + 201)
+++#define __NR_io_getevents (__NR_Linux + 202)
+++#define __NR_io_submit (__NR_Linux + 203)
+++#define __NR_io_cancel (__NR_Linux + 204)
+++#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
+++
+++#if _MIPS_SIM == _MIPS_SIM_NABI32
+++
+++/*
+++ * Linux N32 syscalls are in the range from 6000 to 6999.
+++ */
+++#define __NR_Linux 6000
+++#define __NR_io_setup (__NR_Linux + 200)
+++#define __NR_io_destroy (__NR_Linux + 201)
+++#define __NR_io_getevents (__NR_Linux + 202)
+++#define __NR_io_submit (__NR_Linux + 203)
+++#define __NR_io_cancel (__NR_Linux + 204)
+++#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
+++
+++#define io_syscall1(type,fname,sname,atype,a) \
+++type fname(atype a) \
+++{ \
+++ register unsigned long __a0 asm("$4") = (unsigned long) a; \
+++ register unsigned long __a3 asm("$7"); \
+++ unsigned long __v0; \
+++ \
+++ __asm__ volatile ( \
+++ ".set\tnoreorder\n\t" \
+++ "li\t$2, %3\t\t\t# " #fname "\n\t" \
+++ "syscall\n\t" \
+++ "move\t%0, $2\n\t" \
+++ ".set\treorder" \
+++ : "=&r" (__v0), "=r" (__a3) \
+++ : "r" (__a0), "i" (__NR_##sname) \
+++ : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
+++ "memory"); \
+++ \
+++ if (__a3 == 0) \
+++ return (type) __v0; \
+++ return (type) -1; \
+++}
+++
+++#define io_syscall2(type,fname,sname,atype,a,btype,b) \
+++type fname(atype a, btype b) \
+++{ \
+++ register unsigned long __a0 asm("$4") = (unsigned long) a; \
+++ register unsigned long __a1 asm("$5") = (unsigned long) b; \
+++ register unsigned long __a3 asm("$7"); \
+++ unsigned long __v0; \
+++ \
+++ __asm__ volatile ( \
+++ ".set\tnoreorder\n\t" \
+++ "li\t$2, %4\t\t\t# " #fname "\n\t" \
+++ "syscall\n\t" \
+++ "move\t%0, $2\n\t" \
+++ ".set\treorder" \
+++ : "=&r" (__v0), "=r" (__a3) \
+++ : "r" (__a0), "r" (__a1), "i" (__NR_##sname) \
+++ : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
+++ "memory"); \
+++ \
+++ if (__a3 == 0) \
+++ return (type) __v0; \
+++ return (type) -1; \
+++}
+++
+++#define io_syscall3(type,fname,sname,atype,a,btype,b,ctype,c) \
+++type fname(atype a, btype b, ctype c) \
+++{ \
+++ register unsigned long __a0 asm("$4") = (unsigned long) a; \
+++ register unsigned long __a1 asm("$5") = (unsigned long) b; \
+++ register unsigned long __a2 asm("$6") = (unsigned long) c; \
+++ register unsigned long __a3 asm("$7"); \
+++ unsigned long __v0; \
+++ \
+++ __asm__ volatile ( \
+++ ".set\tnoreorder\n\t" \
+++ "li\t$2, %5\t\t\t# " #fname "\n\t" \
+++ "syscall\n\t" \
+++ "move\t%0, $2\n\t" \
+++ ".set\treorder" \
+++ : "=&r" (__v0), "=r" (__a3) \
+++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##sname) \
+++ : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
+++ "memory"); \
+++ \
+++ if (__a3 == 0) \
+++ return (type) __v0; \
+++ return (type) -1; \
+++}
+++
+++#define io_syscall4(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d) \
+++type fname(atype a, btype b, ctype c, dtype d) \
+++{ \
+++ register unsigned long __a0 asm("$4") = (unsigned long) a; \
+++ register unsigned long __a1 asm("$5") = (unsigned long) b; \
+++ register unsigned long __a2 asm("$6") = (unsigned long) c; \
+++ register unsigned long __a3 asm("$7") = (unsigned long) d; \
+++ unsigned long __v0; \
+++ \
+++ __asm__ volatile ( \
+++ ".set\tnoreorder\n\t" \
+++ "li\t$2, %5\t\t\t# " #fname "\n\t" \
+++ "syscall\n\t" \
+++ "move\t%0, $2\n\t" \
+++ ".set\treorder" \
+++ : "=&r" (__v0), "+r" (__a3) \
+++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##sname) \
+++ : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
+++ "memory"); \
+++ \
+++ if (__a3 == 0) \
+++ return (type) __v0; \
+++ return (type) -1; \
+++}
+++
+++#if (_MIPS_SIM == _MIPS_SIM_ABI32)
+++
+++/*
+++ * Using those means your brain needs more than an oil change ;-)
+++ */
+++
+++#define io_syscall5(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
+++type fname(atype a, btype b, ctype c, dtype d, etype e) \
+++{ \
+++ register unsigned long __a0 asm("$4") = (unsigned long) a; \
+++ register unsigned long __a1 asm("$5") = (unsigned long) b; \
+++ register unsigned long __a2 asm("$6") = (unsigned long) c; \
+++ register unsigned long __a3 asm("$7") = (unsigned long) d; \
+++ unsigned long __v0; \
+++ \
+++ __asm__ volatile ( \
+++ ".set\tnoreorder\n\t" \
+++ "lw\t$2, %6\n\t" \
+++ "subu\t$29, 32\n\t" \
+++ "sw\t$2, 16($29)\n\t" \
+++ "li\t$2, %5\t\t\t# " #fname "\n\t" \
+++ "syscall\n\t" \
+++ "move\t%0, $2\n\t" \
+++ "addiu\t$29, 32\n\t" \
+++ ".set\treorder" \
+++ : "=&r" (__v0), "+r" (__a3) \
+++ : "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##sname), \
+++ "m" ((unsigned long)e) \
+++ : "$2", "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
+++ "memory"); \
+++ \
+++ if (__a3 == 0) \
+++ return (type) __v0; \
+++ return (type) -1; \
+++}
+++
+++#endif /* (_MIPS_SIM == _MIPS_SIM_ABI32) */
+++
+++#if (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64)
+++
+++#define io_syscall5(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
+++type fname (atype a,btype b,ctype c,dtype d,etype e) \
+++{ \
+++ register unsigned long __a0 asm("$4") = (unsigned long) a; \
+++ register unsigned long __a1 asm("$5") = (unsigned long) b; \
+++ register unsigned long __a2 asm("$6") = (unsigned long) c; \
+++ register unsigned long __a3 asm("$7") = (unsigned long) d; \
+++ register unsigned long __a4 asm("$8") = (unsigned long) e; \
+++ unsigned long __v0; \
+++ \
+++ __asm__ volatile ( \
+++ ".set\tnoreorder\n\t" \
+++ "li\t$2, %6\t\t\t# " #fname "\n\t" \
+++ "syscall\n\t" \
+++ "move\t%0, $2\n\t" \
+++ ".set\treorder" \
+++ : "=&r" (__v0), "+r" (__a3) \
+++ : "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), "i" (__NR_##sname) \
+++ : "$2", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24", \
+++ "memory"); \
+++ \
+++ if (__a3 == 0) \
+++ return (type) __v0; \
+++ return (type) -1; \
+++}
+++
+++#endif /* (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64) */
+++
++--- a/src/libaio.h
+++++ b/src/libaio.h
++@@ -66,6 +66,7 @@ typedef enum io_iocb_cmd {
++
++ /* big endian, 64 bits */
++ #elif defined(__powerpc64__) || defined(__s390x__) || \
+++ (defined(__hppa__) && defined(__arch64__)) || \
++ (defined(__sparc__) && defined(__arch64__)) || \
++ (defined(__aarch64__) && defined(__AARCH64EB__))
++ #define PADDED(x, y) unsigned y; x
++--- /dev/null
+++++ b/src/syscall-parisc.h
++@@ -0,0 +1,146 @@
+++/*
+++ * Linux system call numbers.
+++ *
+++ * Cary Coutant says that we should just use another syscall gateway
+++ * page to avoid clashing with the HPUX space, and I think he's right:
+++ * it will would keep a branch out of our syscall entry path, at the
+++ * very least. If we decide to change it later, we can ``just'' tweak
+++ * the LINUX_GATEWAY_ADDR define at the bottom and make __NR_Linux be
+++ * 1024 or something. Oh, and recompile libc. =)
+++ *
+++ * 64-bit HPUX binaries get the syscall gateway address passed in a register
+++ * from the kernel at startup, which seems a sane strategy.
+++ */
+++
+++#define __NR_Linux 0
+++#define __NR_io_setup (__NR_Linux + 215)
+++#define __NR_io_destroy (__NR_Linux + 216)
+++#define __NR_io_getevents (__NR_Linux + 217)
+++#define __NR_io_submit (__NR_Linux + 218)
+++#define __NR_io_cancel (__NR_Linux + 219)
+++
+++#define SYS_ify(syscall_name) __NR_##syscall_name
+++
+++/* Assume all syscalls are done from PIC code just to be
+++ * safe. The worst case scenario is that you lose a register
+++ * and save/restore r19 across the syscall. */
+++#define PIC
+++
+++/* Definition taken from glibc 2.3.3
+++ * sysdeps/unix/sysv/linux/hppa/sysdep.h
+++ */
+++
+++#ifdef PIC
+++/* WARNING: CANNOT BE USED IN A NOP! */
+++# define K_STW_ASM_PIC " copy %%r19, %%r4\n"
+++# define K_LDW_ASM_PIC " copy %%r4, %%r19\n"
+++# define K_USING_GR4 "%r4",
+++#else
+++# define K_STW_ASM_PIC " \n"
+++# define K_LDW_ASM_PIC " \n"
+++# define K_USING_GR4
+++#endif
+++
+++/* GCC has to be warned that a syscall may clobber all the ABI
+++ registers listed as "caller-saves", see page 8, Table 2
+++ in section 2.2.6 of the PA-RISC RUN-TIME architecture
+++ document. However! r28 is the result and will conflict with
+++ the clobber list so it is left out. Also the input arguments
+++ registers r20 -> r26 will conflict with the list so they
+++ are treated specially. Although r19 is clobbered by the syscall
+++ we cannot say this because it would violate ABI, thus we say
+++ r4 is clobbered and use that register to save/restore r19
+++ across the syscall. */
+++
+++#define K_CALL_CLOB_REGS "%r1", "%r2", K_USING_GR4 \
+++ "%r20", "%r29", "%r31"
+++
+++#undef K_INLINE_SYSCALL
+++#define K_INLINE_SYSCALL(name, nr, args...) ({ \
+++ long __sys_res; \
+++ { \
+++ register unsigned long __res __asm__("r28"); \
+++ K_LOAD_ARGS_##nr(args) \
+++ /* FIXME: HACK stw/ldw r19 around syscall */ \
+++ __asm__ volatile( \
+++ K_STW_ASM_PIC \
+++ " ble 0x100(%%sr2, %%r0)\n" \
+++ " ldi %1, %%r20\n" \
+++ K_LDW_ASM_PIC \
+++ : "=r" (__res) \
+++ : "i" (SYS_ify(name)) K_ASM_ARGS_##nr \
+++ : "memory", K_CALL_CLOB_REGS K_CLOB_ARGS_##nr \
+++ ); \
+++ __sys_res = (long)__res; \
+++ } \
+++ __sys_res; \
+++})
+++
+++#define K_LOAD_ARGS_0()
+++#define K_LOAD_ARGS_1(r26) \
+++ register unsigned long __r26 __asm__("r26") = (unsigned long)(r26); \
+++ K_LOAD_ARGS_0()
+++#define K_LOAD_ARGS_2(r26,r25) \
+++ register unsigned long __r25 __asm__("r25") = (unsigned long)(r25); \
+++ K_LOAD_ARGS_1(r26)
+++#define K_LOAD_ARGS_3(r26,r25,r24) \
+++ register unsigned long __r24 __asm__("r24") = (unsigned long)(r24); \
+++ K_LOAD_ARGS_2(r26,r25)
+++#define K_LOAD_ARGS_4(r26,r25,r24,r23) \
+++ register unsigned long __r23 __asm__("r23") = (unsigned long)(r23); \
+++ K_LOAD_ARGS_3(r26,r25,r24)
+++#define K_LOAD_ARGS_5(r26,r25,r24,r23,r22) \
+++ register unsigned long __r22 __asm__("r22") = (unsigned long)(r22); \
+++ K_LOAD_ARGS_4(r26,r25,r24,r23)
+++#define K_LOAD_ARGS_6(r26,r25,r24,r23,r22,r21) \
+++ register unsigned long __r21 __asm__("r21") = (unsigned long)(r21); \
+++ K_LOAD_ARGS_5(r26,r25,r24,r23,r22)
+++
+++/* Even with zero args we use r20 for the syscall number */
+++#define K_ASM_ARGS_0
+++#define K_ASM_ARGS_1 K_ASM_ARGS_0, "r" (__r26)
+++#define K_ASM_ARGS_2 K_ASM_ARGS_1, "r" (__r25)
+++#define K_ASM_ARGS_3 K_ASM_ARGS_2, "r" (__r24)
+++#define K_ASM_ARGS_4 K_ASM_ARGS_3, "r" (__r23)
+++#define K_ASM_ARGS_5 K_ASM_ARGS_4, "r" (__r22)
+++#define K_ASM_ARGS_6 K_ASM_ARGS_5, "r" (__r21)
+++
+++/* The registers not listed as inputs but clobbered */
+++#define K_CLOB_ARGS_6
+++#define K_CLOB_ARGS_5 K_CLOB_ARGS_6, "%r21"
+++#define K_CLOB_ARGS_4 K_CLOB_ARGS_5, "%r22"
+++#define K_CLOB_ARGS_3 K_CLOB_ARGS_4, "%r23"
+++#define K_CLOB_ARGS_2 K_CLOB_ARGS_3, "%r24"
+++#define K_CLOB_ARGS_1 K_CLOB_ARGS_2, "%r25"
+++#define K_CLOB_ARGS_0 K_CLOB_ARGS_1, "%r26"
+++
+++#define io_syscall1(type,fname,sname,type1,arg1) \
+++type fname(type1 arg1) \
+++{ \
+++ return K_INLINE_SYSCALL(sname, 1, arg1); \
+++}
+++
+++#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
+++type fname(type1 arg1, type2 arg2) \
+++{ \
+++ return K_INLINE_SYSCALL(sname, 2, arg1, arg2); \
+++}
+++
+++#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
+++type fname(type1 arg1, type2 arg2, type3 arg3) \
+++{ \
+++ return K_INLINE_SYSCALL(sname, 3, arg1, arg2, arg3); \
+++}
+++
+++#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
+++type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
+++{ \
+++ return K_INLINE_SYSCALL(sname, 4, arg1, arg2, arg3, arg4); \
+++}
+++
+++#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
+++type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
+++{ \
+++ return K_INLINE_SYSCALL(sname, 5, arg1, arg2, arg3, arg4, arg5); \
+++}
+++
++--- a/harness/main.c
+++++ b/harness/main.c
++@@ -12,7 +12,17 @@
++ #include <libaio.h>
++
++ #if __LP64__ == 0
+++#if defined(__i386__) || defined(__powerpc__) || defined(__mips__)
++ #define KERNEL_RW_POINTER ((void *)0xc0010000)
+++#elif defined(__arm__) || defined(__m68k__) || defined(__s390__)
+++#define KERNEL_RW_POINTER ((void *)0x00010000)
+++#elif defined(__hppa__)
+++#define KERNEL_RW_POINTER ((void *)0x10100000)
+++#elif defined(__sparc__)
+++#define KERNEL_RW_POINTER ((void *)0xf0010000)
+++#else
+++#error Unknown kernel memory address.
+++#endif
++ #else
++ //#warning Not really sure where kernel memory is. Guessing.
++ #define KERNEL_RW_POINTER ((void *)0xffffffff81000000)
++--- a/src/syscall-sparc.h
+++++ b/src/syscall-sparc.h
++@@ -20,7 +20,9 @@ __asm__ __volatile__ ("t 0x10\n\t" \
++ : "=r" (__res), "=&r" (__o0) \
++ : "1" (__o0), "r" (__g1) \
++ : "cc"); \
++-return (type) __res; \
+++if (__res < -255 || __res >= 0) \
+++ return (type) __res; \
+++return -1; \
++ }
++
++ #define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
++@@ -38,7 +40,9 @@ __asm__ __volatile__ ("t 0x10\n\t" \
++ : "=r" (__res), "=&r" (__o0) \
++ : "1" (__o0), "r" (__o1), "r" (__g1) \
++ : "cc"); \
++-return (type) __res; \
+++if (__res < -255 || __res >= 0) \
+++ return (type) __res; \
+++return -1; \
++ }
++
++ #define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
++@@ -57,7 +61,9 @@ __asm__ __volatile__ ("t 0x10\n\t" \
++ : "=r" (__res), "=&r" (__o0) \
++ : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1) \
++ : "cc"); \
++-return (type) __res; \
+++if (__res < -255 || __res >= 0) \
+++ return (type) __res; \
+++return -1; \
++ }
++
++ #define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
++@@ -77,7 +83,9 @@ __asm__ __volatile__ ("t 0x10\n\t" \
++ : "=r" (__res), "=&r" (__o0) \
++ : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__g1) \
++ : "cc"); \
++-return (type) __res; \
+++if (__res < -255 || __res >= 0) \
+++ return (type) __res; \
+++return -1; \
++ }
++
++ #define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
++@@ -99,5 +107,7 @@ __asm__ __volatile__ ("t 0x10\n\t" \
++ : "=r" (__res), "=&r" (__o0) \
++ : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__o3), "r" (__o4), "r" (__g1) \
++ : "cc"); \
++-return (type) __res; \
+++if (__res < -255 || __res >= 0) \
+++ return (type) __res; \
+++return -1; \
++ }
+diff --git a/feeds/packages/libs/libaio/patches/002_arches_sh.patch b/feeds/packages/libs/libaio/patches/002_arches_sh.patch
+new file mode 100644
+index 0000000..ddf9a11
+--- /dev/null
++++ b/feeds/packages/libs/libaio/patches/002_arches_sh.patch
+@@ -0,0 +1,139 @@
++From: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
++Subject: Add SH supprt
++
++The test-suite logs can be found at:
++
++ <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=535288>
++
++
++---
++ harness/main.c | 2 -
++ src/libaio.h | 4 ++
++ src/syscall-sh.h | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ src/syscall.h | 2 +
++ 4 files changed, 84 insertions(+), 2 deletions(-)
++
++
++--- a/harness/main.c
+++++ b/harness/main.c
++@@ -14,7 +14,7 @@
++ #if __LP64__ == 0
++ #if defined(__i386__) || defined(__powerpc__) || defined(__mips__)
++ #define KERNEL_RW_POINTER ((void *)0xc0010000)
++-#elif defined(__arm__) || defined(__m68k__) || defined(__s390__)
+++#elif defined(__arm__) || defined(__m68k__) || defined(__s390__) || defined(__sh__)
++ #define KERNEL_RW_POINTER ((void *)0x00010000)
++ #elif defined(__hppa__)
++ #define KERNEL_RW_POINTER ((void *)0x10100000)
++--- a/src/libaio.h
+++++ b/src/libaio.h
++@@ -51,7 +51,8 @@ typedef enum io_iocb_cmd {
++
++ /* little endian, 32 bits */
++ #if defined(__i386__) || (defined(__arm__) && !defined(__ARMEB__)) || \
++- defined(__sh__) || defined(__bfin__) || defined(__MIPSEL__) || \
+++ (defined(__sh__) && defined(__LITTLE_ENDIAN__)) || \
+++ defined(__bfin__) || defined(__MIPSEL__) || \
++ defined(__cris__)
++ #define PADDED(x, y) x; unsigned y
++ #define PADDEDptr(x, y) x; unsigned y
++@@ -76,6 +77,7 @@ typedef enum io_iocb_cmd {
++ /* big endian, 32 bits */
++ #elif defined(__PPC__) || defined(__s390__) || \
++ (defined(__arm__) && defined(__ARMEB__)) || \
+++ (defined(__sh__) && defined (__BIG_ENDIAN__)) || \
++ defined(__sparc__) || defined(__MIPSEB__) || defined(__m68k__) || \
++ defined(__hppa__) || defined(__frv__) || defined(__avr32__)
++ #define PADDED(x, y) unsigned y; x
++--- /dev/null
+++++ b/src/syscall-sh.h
++@@ -0,0 +1,78 @@
+++/* Copy from ./arch/sh/include/asm/unistd_32.h */
+++#define __NR_io_setup 245
+++#define __NR_io_destroy 246
+++#define __NR_io_getevents 247
+++#define __NR_io_submit 248
+++#define __NR_io_cancel 249
+++
+++#define io_syscall1(type,fname,sname,type1,arg1) \
+++type fname(type1 arg1) \
+++{ \
+++register long __sc0 __asm__ ("r3") = __NR_##sname; \
+++register long __sc4 __asm__ ("r4") = (long) arg1; \
+++__asm__ __volatile__ ("trapa #0x11" \
+++ : "=z" (__sc0) \
+++ : "0" (__sc0), "r" (__sc4) \
+++ : "memory"); \
+++ return (type) __sc0;\
+++}
+++
+++#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
+++type fname(type1 arg1,type2 arg2) \
+++{ \
+++register long __sc0 __asm__ ("r3") = __NR_##sname; \
+++register long __sc4 __asm__ ("r4") = (long) arg1; \
+++register long __sc5 __asm__ ("r5") = (long) arg2; \
+++ __asm__ __volatile__ ("trapa #0x12" \
+++ : "=z" (__sc0) \
+++ : "0" (__sc0), "r" (__sc4), "r" (__sc5) \
+++ : "memory"); \
+++ return (type) __sc0;\
+++}
+++
+++#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
+++type fname(type1 arg1,type2 arg2,type3 arg3) \
+++{ \
+++register long __sc0 __asm__ ("r3") = __NR_##sname; \
+++register long __sc4 __asm__ ("r4") = (long) arg1; \
+++register long __sc5 __asm__ ("r5") = (long) arg2; \
+++register long __sc6 __asm__ ("r6") = (long) arg3; \
+++ __asm__ __volatile__ ("trapa #0x13" \
+++ : "=z" (__sc0) \
+++ : "0" (__sc0), "r" (__sc4), "r" (__sc5), "r" (__sc6) \
+++ : "memory"); \
+++ return (type) __sc0;\
+++}
+++
+++#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
+++type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
+++{ \
+++register long __sc0 __asm__ ("r3") = __NR_##sname; \
+++register long __sc4 __asm__ ("r4") = (long) arg1; \
+++register long __sc5 __asm__ ("r5") = (long) arg2; \
+++register long __sc6 __asm__ ("r6") = (long) arg3; \
+++register long __sc7 __asm__ ("r7") = (long) arg4; \
+++__asm__ __volatile__ ("trapa #0x14" \
+++ : "=z" (__sc0) \
+++ : "0" (__sc0), "r" (__sc4), "r" (__sc5), "r" (__sc6), \
+++ "r" (__sc7) \
+++ : "memory" ); \
+++ return (type) __sc0;\
+++}
+++
+++#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
+++type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
+++{ \
+++register long __sc3 __asm__ ("r3") = __NR_##sname; \
+++register long __sc4 __asm__ ("r4") = (long) arg1; \
+++register long __sc5 __asm__ ("r5") = (long) arg2; \
+++register long __sc6 __asm__ ("r6") = (long) arg3; \
+++register long __sc7 __asm__ ("r7") = (long) arg4; \
+++register long __sc0 __asm__ ("r0") = (long) arg5; \
+++__asm__ __volatile__ ("trapa #0x15" \
+++ : "=z" (__sc0) \
+++ : "0" (__sc0), "r" (__sc4), "r" (__sc5), "r" (__sc6), "r" (__sc7), \
+++ "r" (__sc3) \
+++ : "memory" ); \
+++ return (type) __sc0;\
+++}
++--- a/src/syscall.h
+++++ b/src/syscall.h
++@@ -34,6 +34,8 @@
++ #include "syscall-parisc.h"
++ #elif defined(__mips__)
++ #include "syscall-mips.h"
+++#elif defined(__sh__)
+++#include "syscall-sh.h"
++ #else
++ #warning "using generic syscall method"
++ #include "syscall-generic.h"
+diff --git a/feeds/packages/libs/libaio/patches/003_arches_sparc64.patch b/feeds/packages/libs/libaio/patches/003_arches_sparc64.patch
+new file mode 100644
+index 0000000..c685f5e
+--- /dev/null
++++ b/feeds/packages/libs/libaio/patches/003_arches_sparc64.patch
+@@ -0,0 +1,117 @@
++---
++ src/syscall-sparc64.h | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++
++ src/syscall.h | 2 +
++ 2 files changed, 100 insertions(+)
++
++--- a/src/syscall.h
+++++ b/src/syscall.h
++@@ -24,6 +24,8 @@
++ #include "syscall-alpha.h"
++ #elif defined(__arm__)
++ #include "syscall-arm.h"
+++#elif defined(__sparc__) && defined(__arch64__)
+++#include "syscall-sparc64.h"
++ #elif defined(__sparc__)
++ #include "syscall-sparc.h"
++ #elif defined(__aarch64__)
++--- /dev/null
+++++ b/src/syscall-sparc64.h
++@@ -0,0 +1,98 @@
+++#define __NR_io_setup 268
+++#define __NR_io_destroy 269
+++#define __NR_io_submit 270
+++#define __NR_io_cancel 271
+++#define __NR_io_getevents 272
+++
+++#define io_syscall1(type,fname,sname,type1,arg1) \
+++type fname(type1 arg1) \
+++{ \
+++ unsigned long __res; \
+++ register unsigned long __g1 __asm__("g1") = __NR_##sname; \
+++ register unsigned long __o0 __asm__("o0") = (unsigned long) arg1; \
+++ __asm__ __volatile__("t 0x6d\n\t" \
+++ "sub %%g0, %%o0, %0\n\t" \
+++ "movcc %%xcc, %%o0, %0\n" \
+++ "1:" \
+++ : "=r" (__res), "=&r" (__o0) \
+++ : "1" (__o0), "r" (__g1) \
+++ : "cc"); \
+++ return (type) __res; \
+++}
+++
+++#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2) \
+++type fname(type1 arg1, type2 arg2) \
+++{ \
+++ unsigned long __res; \
+++ register unsigned long __g1 __asm__("g1") = __NR_##sname; \
+++ register unsigned long __o0 __asm__("o0") = (unsigned long) arg1; \
+++ register unsigned long __o1 __asm__("o1") = (unsigned long) arg2; \
+++ __asm__ __volatile__("t 0x6d\n\t" \
+++ "sub %%g0, %%o0, %0\n\t" \
+++ "movcc %%xcc, %%o0, %0\n" \
+++ "1:" \
+++ : "=r" (__res), "=&r" (__o0) \
+++ : "1" (__o0), "r" (__o1), "r" (__g1) \
+++ : "cc"); \
+++ return (type) __res; \
+++}
+++
+++#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3) \
+++type fname(type1 arg1, type2 arg2, type3 arg3) \
+++{ \
+++ unsigned long __res; \
+++ register unsigned long __g1 __asm__("g1") = __NR_##sname; \
+++ register unsigned long __o0 __asm__("o0") = (unsigned long) arg1; \
+++ register unsigned long __o1 __asm__("o1") = (unsigned long) arg2; \
+++ register unsigned long __o2 __asm__("o2") = (unsigned long) arg3; \
+++ __asm__ __volatile__("t 0x6d\n\t" \
+++ "sub %%g0, %%o0, %0\n\t" \
+++ "movcc %%xcc, %%o0, %0\n" \
+++ "1:" \
+++ : "=r" (__res), "=&r" (__o0) \
+++ : "1" (__o0), "r" (__o1), "r" (__o2), \
+++ "r" (__g1) \
+++ : "cc"); \
+++ return (type) __res; \
+++}
+++
+++#define io_syscall4(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
+++type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
+++{ \
+++ unsigned long __res; \
+++ register unsigned long __g1 __asm__("g1") = __NR_##sname; \
+++ register unsigned long __o0 __asm__("o0") = (unsigned long) arg1; \
+++ register unsigned long __o1 __asm__("o1") = (unsigned long) arg2; \
+++ register unsigned long __o2 __asm__("o2") = (unsigned long) arg3; \
+++ register unsigned long __o3 __asm__("o3") = (unsigned long) arg4; \
+++ __asm__ __volatile__("t 0x6d\n\t" \
+++ "sub %%g0, %%o0, %0\n\t" \
+++ "movcc %%xcc, %%o0, %0\n" \
+++ "1:" \
+++ : "=r" (__res), "=&r" (__o0) \
+++ : "1" (__o0), "r" (__o1), "r" (__o2), \
+++ "r" (__o3), "r" (__g1) \
+++ : "cc"); \
+++ return (type) __res; \
+++}
+++
+++#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
+++type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \
+++{ \
+++ unsigned long __res; \
+++ register unsigned long __g1 __asm__("g1") = __NR_##sname; \
+++ register unsigned long __o0 __asm__("o0") = (unsigned long) arg1; \
+++ register unsigned long __o1 __asm__("o1") = (unsigned long) arg2; \
+++ register unsigned long __o2 __asm__("o2") = (unsigned long) arg3; \
+++ register unsigned long __o3 __asm__("o3") = (unsigned long) arg4; \
+++ register unsigned long __o4 __asm__("o4") = (unsigned long) arg5; \
+++ __asm__ __volatile__("t 0x6d\n\t" \
+++ "sub %%g0, %%o0, %0\n\t" \
+++ "movcc %%xcc, %%o0, %0\n" \
+++ "1:" \
+++ : "=r" (__res), "=&r" (__o0) \
+++ : "1" (__o0), "r" (__o1), "r" (__o2), \
+++ "r" (__o3), "r" (__o4), "r" (__g1) \
+++ : "cc"); \
+++ return (type) __res; \
+++}
+diff --git a/feeds/packages/libs/libaio/patches/004_arches_x32.patch b/feeds/packages/libs/libaio/patches/004_arches_x32.patch
+new file mode 100644
+index 0000000..8d315f2
+--- /dev/null
++++ b/feeds/packages/libs/libaio/patches/004_arches_x32.patch
+@@ -0,0 +1,65 @@
++Index: libaio-0.3.109/src/syscall-x86_64.h
++===================================================================
++--- libaio-0.3.109.orig/src/syscall-x86_64.h 2009-10-09 11:17:02.000000000 -0700
+++++ libaio-0.3.109/src/syscall-x86_64.h 2013-03-03 07:15:13.000000000 -0800
++@@ -1,8 +1,18 @@
+++#ifndef __NR_io_setup
++ #define __NR_io_setup 206
+++#endif
+++#ifndef __NR_io_destroy
++ #define __NR_io_destroy 207
+++#endif
+++#ifndef __NR_io_getevents
++ #define __NR_io_getevents 208
+++#endif
+++#ifndef __NR_io_submit
++ #define __NR_io_submit 209
+++#endif
+++#ifndef __NR_io_cancel
++ #define __NR_io_cancel 210
+++#endif
++
++ #define __syscall_clobber "r11","rcx","memory"
++ #define __syscall "syscall"
++@@ -42,10 +52,11 @@
++ type fname (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
++ { \
++ long __res; \
++-__asm__ volatile ("movq %5,%%r10 ;" __syscall \
+++register long __a4 asm ("r10") = (long) arg4; \
+++__asm__ volatile (__syscall \
++ : "=a" (__res) \
++ : "0" (__NR_##sname),"D" ((long)(arg1)),"S" ((long)(arg2)), \
++- "d" ((long)(arg3)),"g" ((long)(arg4)) : __syscall_clobber,"r10" ); \
+++ "d" ((long)(arg3)),"r" (__a4)); \
++ return __res; \
++ }
++
++@@ -54,10 +65,11 @@
++ type fname (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
++ { \
++ long __res; \
++-__asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; " __syscall \
+++register long __a4 asm ("r10") = (long) arg4; \
+++register long __a5 asm ("r8") = (long) arg5; \
+++__asm__ volatile (__syscall \
++ : "=a" (__res) \
++ : "0" (__NR_##sname),"D" ((long)(arg1)),"S" ((long)(arg2)), \
++- "d" ((long)(arg3)),"g" ((long)(arg4)),"g" ((long)(arg5)) : \
++- __syscall_clobber,"r8","r10" ); \
+++ "d" ((long)(arg3)),"r" (__a4),"r" (__a5)); \
++ return __res; \
++ }
++Index: libaio-0.3.109/harness/main.c
++===================================================================
++--- libaio-0.3.109.orig/harness/main.c 2013-03-03 06:58:51.000000000 -0800
+++++ libaio-0.3.109/harness/main.c 2013-03-03 07:23:40.000000000 -0800
++@@ -14,7 +14,7 @@
++ #if __LP64__ == 0
++ #if defined(__i386__) || defined(__powerpc__) || defined(__mips__)
++ #define KERNEL_RW_POINTER ((void *)0xc0010000)
++-#elif defined(__arm__) || defined(__m68k__) || defined(__s390__) || defined(__sh__)
+++#elif defined(__arm__) || defined(__m68k__) || defined(__s390__) || defined(__sh__) || defined(__x86_64__)
++ #define KERNEL_RW_POINTER ((void *)0x00010000)
++ #elif defined(__hppa__)
++ #define KERNEL_RW_POINTER ((void *)0x10100000)
+diff --git a/feeds/packages/libs/libaio/patches/005_arches_mips.patch b/feeds/packages/libs/libaio/patches/005_arches_mips.patch
+new file mode 100644
+index 0000000..1bd0971
+--- /dev/null
++++ b/feeds/packages/libs/libaio/patches/005_arches_mips.patch
+@@ -0,0 +1,63 @@
++Description: Fix mips/mipsel syscall wrappers to return correct error values.
++Author: Jurica Stanojkovic <Jurica.Stanojkovic@rt-rk.com>
++Forwarded: no
++Last-Update: 2012-09-24
++
++
++diff -upNr a/src/syscall-mips.h b/src/syscall-mips.h
++--- a/src/syscall-mips.h 2012-09-13 11:46:35.652286733 +0200
+++++ b/src/syscall-mips.h 2012-09-13 16:09:17.964407909 +0200
++@@ -76,7 +76,7 @@ type fname(atype a) \
++ \
++ if (__a3 == 0) \
++ return (type) __v0; \
++- return (type) -1; \
+++ return (type) 0 - __v0; \
++ }
++
++ #define io_syscall2(type,fname,sname,atype,a,btype,b) \
++@@ -100,7 +100,7 @@ type fname(atype a, btype b) \
++ \
++ if (__a3 == 0) \
++ return (type) __v0; \
++- return (type) -1; \
+++ return (type) 0 - __v0; \
++ }
++
++ #define io_syscall3(type,fname,sname,atype,a,btype,b,ctype,c) \
++@@ -125,7 +125,7 @@ type fname(atype a, btype b, ctype c) \
++ \
++ if (__a3 == 0) \
++ return (type) __v0; \
++- return (type) -1; \
+++ return (type) 0 - __v0; \
++ }
++
++ #define io_syscall4(type,fname,sname,atype,a,btype,b,ctype,c,dtype,d) \
++@@ -150,7 +150,7 @@ type fname(atype a, btype b, ctype c, dt
++ \
++ if (__a3 == 0) \
++ return (type) __v0; \
++- return (type) -1; \
+++ return (type) 0 - __v0; \
++ }
++
++ #if (_MIPS_SIM == _MIPS_SIM_ABI32)
++@@ -186,7 +186,7 @@ type fname(atype a, btype b, ctype c, dt
++ \
++ if (__a3 == 0) \
++ return (type) __v0; \
++- return (type) -1; \
+++ return (type) 0 - __v0; \
++ }
++
++ #endif /* (_MIPS_SIM == _MIPS_SIM_ABI32) */
++@@ -216,7 +216,7 @@ type fname (atype a,btype b,ctype c,dtyp
++ \
++ if (__a3 == 0) \
++ return (type) __v0; \
++- return (type) -1; \
+++ return (type) 0 - __v0; \
++ }
++
++ #endif /* (_MIPS_SIM == _MIPS_SIM_NABI32) || (_MIPS_SIM == _MIPS_SIM_ABI64) */
+diff --git a/feeds/packages/libs/libaio/patches/006_arches_mips_fix_padding.patch b/feeds/packages/libs/libaio/patches/006_arches_mips_fix_padding.patch
+new file mode 100644
+index 0000000..06bd00f
+--- /dev/null
++++ b/feeds/packages/libs/libaio/patches/006_arches_mips_fix_padding.patch
+@@ -0,0 +1,37 @@
++Description: Fix structure padding for mips64
++Author: Guillem Jover <guillem@debian.org>
++Forwarded: no
++Last-Update: 2014-07-23
++
++---
++ src/libaio.h | 5 ++++-
++ 1 file changed, 4 insertions(+), 1 deletion(-)
++
++--- a/src/libaio.h
+++++ b/src/libaio.h
++@@ -52,7 +52,8 @@ typedef enum io_iocb_cmd {
++ /* little endian, 32 bits */
++ #if defined(__i386__) || (defined(__arm__) && !defined(__ARMEB__)) || \
++ (defined(__sh__) && defined(__LITTLE_ENDIAN__)) || \
++- defined(__bfin__) || defined(__MIPSEL__) || \
+++ defined(__bfin__) || \
+++ (defined(__MIPSEL__) && !defined(__mips64)) || \
++ defined(__cris__)
++ #define PADDED(x, y) x; unsigned y
++ #define PADDEDptr(x, y) x; unsigned y
++@@ -60,6 +61,7 @@ typedef enum io_iocb_cmd {
++
++ /* little endian, 64 bits */
++ #elif defined(__ia64__) || defined(__x86_64__) || defined(__alpha__) || \
+++ (defined(__mips64) && defined(__MIPSEL__)) || \
++ (defined(__aarch64__) && defined(__AARCH64EL__))
++ #define PADDED(x, y) x, y
++ #define PADDEDptr(x, y) x
++@@ -69,6 +71,7 @@ typedef enum io_iocb_cmd {
++ #elif defined(__powerpc64__) || defined(__s390x__) || \
++ (defined(__hppa__) && defined(__arch64__)) || \
++ (defined(__sparc__) && defined(__arch64__)) || \
+++ (defined(__mips64) && defined(__MIPSEB__)) || \
++ (defined(__aarch64__) && defined(__AARCH64EB__))
++ #define PADDED(x, y) unsigned y; x
++ #define PADDEDptr(x,y) x
+diff --git a/feeds/packages/libs/libantlr3c/Makefile b/feeds/packages/libs/libantlr3c/Makefile
+new file mode 100644
+index 0000000..bd1e51e
+--- /dev/null
++++ b/feeds/packages/libs/libantlr3c/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libantlr3c
++PKG_VERSION:=3.2
++PKG_RELEASE:=1
++PKG_MD5SUM:=674646e1d1bf5c6015435480cead725a
++
++PKG_SOURCE_URL:=http://www.antlr3.org/download/C
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_INSTALL:=1
++
++PKG_MAINTAINER:=Espen Jürgensen <espenjurgensen+openwrt@gmail.com>
++PKG_LICENSE:=BSD-2-Clause
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libantlr3c
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libantlr3c
++ URL:=http://www.antlr3.org/
++endef
++
++define Package/libantlr3c/description
++ ANother Tool for Language Recognition, is a language tool that provides a framework for constructing recognizers,
++ interpreters, compilers, and translators from grammatical descriptions containing actions in a variety of target languages.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libantlr3c.{a,so} $(1)/usr/lib/
++endef
++
++define Package/libantlr3c/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libantlr3c.so $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libantlr3c))
+diff --git a/feeds/packages/libs/libao/Makefile b/feeds/packages/libs/libao/Makefile
+new file mode 100644
+index 0000000..690af47
+--- /dev/null
++++ b/feeds/packages/libs/libao/Makefile
+@@ -0,0 +1,67 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libao
++PKG_VERSION:=1.2.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.xiph.org/releases/ao/
++PKG_MD5SUM:=9f5dd20d7e95fd0dd72df5353829f097
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libao
++ SECTION:=libs
++ DEPENDS:=+alsa-lib
++ CATEGORY:=Libraries
++ TITLE:=A cross platform audio library
++ URL:=http://www.xiph.org/ao/
++endef
++
++define Package/libao/description
++ Libao is a cross-platform audio library that allows programs to
++ output audio using a simple API on a wide variety of platforms.
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-esd \
++ --disable-arts \
++ --disable-nas \
++ --disable-pulse
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/ao $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libao.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/ao.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libao/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libao.so.* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/ao/plugins-4
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ao/plugins-4/lib*.so $(1)/usr/lib/ao/plugins-4/
++endef
++
++$(eval $(call BuildPackage,libao))
+diff --git a/feeds/packages/libs/libarchive/Makefile b/feeds/packages/libs/libarchive/Makefile
+new file mode 100644
+index 0000000..9c42aad
+--- /dev/null
++++ b/feeds/packages/libs/libarchive/Makefile
+@@ -0,0 +1,77 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libarchive
++PKG_VERSION:=3.1.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.libarchive.org/downloads
++PKG_MD5SUM:=efad5a503f66329bb9d2f4308b5de98a
++PKG_MAINTAINER:=Johannes Morgenroth <morgenroth@ibr.cs.tu-bs.de>
++PKG_LICENSE:=BSD-2-Clause
++
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/$(PKG_NAME)/Default
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+zlib
++ TITLE:=Multi-format archive and compression library
++ URL:=http://www.libarchive.org/
++endef
++
++define Package/$(PKG_NAME)
++ $(call Package/$(PKG_NAME)/Default)
++ DEPENDS += +libopenssl
++endef
++
++define Package/$(PKG_NAME)-noopenssl
++ $(call Package/$(PKG_NAME)/Default)
++ TITLE += (without OpenSSL dependency)
++ VARIANT:=noopenssl
++endef
++
++CONFIGURE_ARGS += \
++ --disable-bsdcpio \
++ --disable-bsdtar \
++ --disable-acl \
++ --disable-xattr \
++ --without-bz2lib \
++ --without-lzma \
++ --without-lzmadec \
++ --without-lzo2 \
++ --without-nettle \
++ --without-expat \
++ --without-xml2
++
++ifeq ($(BUILD_VARIANT),noopenssl)
++ CONFIGURE_ARGS += --without-openssl
++else
++ CONFIGURE_ARGS += --with-openssl
++endif
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/
++endef
++
++define Package/libarchive/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so.* $(1)/usr/lib/
++endef
++Package/$(PKG_NAME)-noopenssl/install = $(Package/$(PKG_NAME)/install)
++
++$(eval $(call BuildPackage,libarchive))
++$(eval $(call BuildPackage,libarchive-noopenssl))
+diff --git a/feeds/packages/libs/libartnet/Makefile b/feeds/packages/libs/libartnet/Makefile
+new file mode 100644
+index 0000000..c5b003e
+--- /dev/null
++++ b/feeds/packages/libs/libartnet/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libartnet
++PKG_VERSION:=1.1.2
++PKG_RELEASE:=1.1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/OpenLightingProject/libartnet/releases/download/1.1.2
++PKG_MD5SUM:=dcceab3efe3dae4c18fa549dbd198e71
++
++PKG_MAINTAINER:=Martijn Zilverschoon <martijn@friedzombie.com>
++
++PKG_LICENSE:=GPL-2.1
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libartnet
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Libartnet is an implementation of the ArtNet protocol.
++ URL:=http://www.openlighting.org/libartnet-main/
++endef
++
++define Package/libartnet/description
++ Libartnet is an implementation of the ArtNet protocol. ArtNet allows the
++ transmission of DMX and related data over IP networks.
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default)
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install
++endef
++
++define Build/InstallDev
++ mkdir -p $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/artnet $(1)/usr/include/
++ mkdir -p $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libartnet.{so,so.1,so.1.0.0} $(1)/usr/lib/
++endef
++
++
++define Package/libartnet/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libartnet.{so,so.1,so.1.0.0} $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libartnet))
+diff --git a/feeds/packages/libs/libartnet/patches/001-bswap_16.patch b/feeds/packages/libs/libartnet/patches/001-bswap_16.patch
+new file mode 100644
+index 0000000..9c9be5f
+--- /dev/null
++++ b/feeds/packages/libs/libartnet/patches/001-bswap_16.patch
+@@ -0,0 +1,12 @@
++--- a/artnet/private.h
+++++ b/artnet/private.h
++@@ -100,7 +100,9 @@ extern uint16_t HIGH_BYTE;
++ #endif
++
++ // byte ordering macros
+++#ifndef bswap_16
++ #define bswap_16(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
+++#endif
++
++ // htols : convert short from host to little endian order
++ #ifdef WIN32
+diff --git a/feeds/packages/libs/libaudiofile/Makefile b/feeds/packages/libs/libaudiofile/Makefile
+new file mode 100644
+index 0000000..d3a7a4a
+--- /dev/null
++++ b/feeds/packages/libs/libaudiofile/Makefile
+@@ -0,0 +1,72 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=audiofile
++PKG_VERSION:=0.3.6
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:= \
++ http://github.com/downloads/mpruett/audiofile/ \
++ http://www.68k.org/~michael/audiofile/
++PKG_MD5SUM:=2731d79bec0acef3d30d2fc86b0b72fd
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libaudiofile
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Audio File library
++ URL:=http://www.68k.org/~michael/audiofile/
++ DEPENDS:=+libflac +libstdcpp
++endef
++
++define Package/libaudiofile/description
++ The audiofile library allows the processing of audio data to and from audio
++ files of many common formats (currently AIFF, AIFF-C, WAVE, NeXT/Sun, BICS,
++ FLAC, ALAC, and raw data).
++endef
++
++CONFIGURE_ARGS+= \
++ --enable-shared \
++ --enable-static \
++ --disable-examples \
++ --with-build-cc="$(HOSTCC)" \
++
++TARGET_CFLAGS+= $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/{af_vfs,audiofile,aupvlist}.h \
++ $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libaudiofile.{la,a,so*} \
++ $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/audiofile.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libaudiofile/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libaudiofile.so.* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libaudiofile))
+diff --git a/feeds/packages/libs/libavl/Makefile b/feeds/packages/libs/libavl/Makefile
+new file mode 100644
+index 0000000..0ff2385
+--- /dev/null
++++ b/feeds/packages/libs/libavl/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libavl
++PKG_VERSION:=0.3.5
++PKG_RELEASE:=1
++PKG_MD5SUM:=882c68ea7f71876ca110f3b84d7ab12d
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).orig.tar.gz
++PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/main/liba/libavl
++PKG_BUILD_DIR:=$(BUILD_DIR)/avl-$(PKG_VERSION)
++PKG_INSTALL:=1
++
++PKG_MAINTAINER:=Espen Jürgensen <espenjurgensen+openwrt@gmail.com>
++PKG_LICENSE:=LGPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libavl
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=AVLTree (this is not GNU libavl)
++ URL:=https://packages.debian.org/wheezy/libavl1
++endef
++
++define Package/libavl/description
++ AVLTree is a small implementation of AVL trees for the C programming language.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/avl.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libavl.so* $(1)/usr/lib/
++endef
++
++define Package/libavl/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libavl.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libavl))
+diff --git a/feeds/packages/libs/libavl/patches/010-update_GNUmakefile.patch b/feeds/packages/libs/libavl/patches/010-update_GNUmakefile.patch
+new file mode 100644
+index 0000000..3013949
+--- /dev/null
++++ b/feeds/packages/libs/libavl/patches/010-update_GNUmakefile.patch
+@@ -0,0 +1,45 @@
++--- a/GNUmakefile 2002-11-15 19:57:48.000000000 +0100
+++++ a/GNUmakefile 2014-10-02 16:03:02.864803002 +0200
++@@ -6,7 +6,7 @@
++ LDCONFIG ?= /sbin/ldconfig
++
++ # Some suggestions: (-mcpu= generates i386 compatible code)
++-CFLAGS ?= -O2 -fomit-frame-pointer -pipe -mcpu=i686 -w
+++CFLAGS ?= -O2 -pipe -Wall -Werror
++ #CFLAGS = -O2 -fomit-frame-pointer -pipe -march=i586 -Wall -g
++ #CFLAGS = -O6 -fomit-frame-pointer -pipe -march=i586 -Wall -ansi -pedantic
++ #CFLAGS = -O6 -fomit-frame-pointer -pipe -march=i686 -Wall -ansi -pedantic
++@@ -15,10 +15,9 @@
++ #CFLAGS = -g -pg -a -pipe -march=i686 -Wall
++ #LDFLAGS = -s
++
++-prefix ?= /usr/local
+++prefix ?= /usr
++ libdir ?= $(prefix)/lib
++ includedir ?= $(prefix)/include
++-includedir ?= /usr/include
++
++ PROGRAMS = avlsort setdiff
++ LIBRARY = libavl.so.1.5
++@@ -34,16 +33,17 @@
++ $(CC) $(LDFLAGS) $^ -o $@ $(LIBS)
++
++ $(LIBRARY): avl.o
++- $(CC) -nostdlib -shared -Wl,-soname,libavl.so.1 $^ -o $@ -lc
+++ $(CC) -shared -Wl,-soname,libavl.so.1 $^ -o $@ -lc
++
++ clean:
++ $(RM) *.o $(PROGRAMS) libavl.*
++
++ install: all
++ $(INSTALL) -d $(DESTDIR)$(libdir)
++- $(INSTALL) avl.h $(DESTDIR)$(includedir)
++- $(INSTALL) $(LIBRARIES) $(DESTDIR)$(libdir)
++- for i in $(LIBRARIES); do\
+++ $(INSTALL) -d $(DESTDIR)$(includedir)
+++ $(INSTALL) -m 644 avl.h $(DESTDIR)$(includedir)
+++ $(INSTALL) -m 644 $(LIBRARY) $(DESTDIR)$(libdir)
+++ for i in $(LIBRARY); do\
++ $(LN) -sf $$i $(DESTDIR)$(libdir)/$${i%.*};\
++ $(LN) -sf $${i%.*} $(DESTDIR)$(libdir)/$${i%.*.*};\
++ done
+diff --git a/feeds/packages/libs/libcanfestival/Makefile b/feeds/packages/libs/libcanfestival/Makefile
+new file mode 100644
+index 0000000..6d9ce49
+--- /dev/null
++++ b/feeds/packages/libs/libcanfestival/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libcanfestival
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=hg
++PKG_SOURCE_URL:=http://dev.automforge.net/CanFestival-3
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)
++PKG_SOURCE_VERSION:=8bfe0ac00cdb
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.bz2
++
++PKG_MAINTAINER:=Anton Glukhov <anton.a.glukhov@gmail.com>
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILE:=LICENCE
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libcanfestival
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Free software CANopen library
++ URL:=http://canfestival.org
++ DEPENDS:=+libpthread +librt
++endef
++
++define Package/libcanfestival/description
++ CanFestival library
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS := \
++ --cc=$(TARGET_CC) \
++ --cxx=$(TARGET_CXX) \
++ --ld=$(TARGET_CC) \
++ --arch=$(ARCH) \
++ --os=Linux \
++ --kerneldir=$(LINUX_DIR) \
++ --prefix=/usr \
++ --target=unix \
++ --can=socket \
++ --timers=unix \
++ --debug=ERR \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/
++endef
++
++define Package/libcanfestival/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcanfestival_can_socket.so $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libcanfestival))
+diff --git a/feeds/packages/libs/libcanfestival/patches/001-sigval-ref-fix.patch b/feeds/packages/libs/libcanfestival/patches/001-sigval-ref-fix.patch
+new file mode 100644
+index 0000000..7e15ff1
+--- /dev/null
++++ b/feeds/packages/libs/libcanfestival/patches/001-sigval-ref-fix.patch
+@@ -0,0 +1,11 @@
++--- a/drivers/timers_unix/timers_unix.c
+++++ b/drivers/timers_unix/timers_unix.c
++@@ -33,7 +33,7 @@
++ }
++ }
++
++-void timer_notify(sigval_t val)
+++void timer_notify(void)
++ {
++ if(gettimeofday(&last_sig,NULL)) {
++ perror("gettimeofday()");
+diff --git a/feeds/packages/libs/libcanfestival/patches/002-makefile-gcc-linker.patch b/feeds/packages/libs/libcanfestival/patches/002-makefile-gcc-linker.patch
+new file mode 100644
+index 0000000..129743f
+--- /dev/null
++++ b/feeds/packages/libs/libcanfestival/patches/002-makefile-gcc-linker.patch
+@@ -0,0 +1,33 @@
++--- a/examples/TestMasterMicroMod/Makefile.in
+++++ b/examples/TestMasterMicroMod/Makefile.in
++@@ -56,7 +56,7 @@
++
++
++ $(TESTMASTERMICROMOD): $(OBJS)
++- $(LD) $(CFLAGS) $(PROG_CFLAGS) ${PROGDEFINES} $(INCLUDES) -o $@ $(OBJS) $(EXE_CFLAGS)
+++ $(CC) $(CFLAGS) $(PROG_CFLAGS) ${PROGDEFINES} $(INCLUDES) -o $@ $(OBJS) $(EXE_CFLAGS)
++
++
++ TestMaster.c: TestMaster.od
++--- a/examples/TestMasterSlave/Makefile.in
+++++ b/examples/TestMasterSlave/Makefile.in
++@@ -65,7 +65,7 @@
++
++
++ $(TESTMASTERSLAVE): $(OBJS)
++- $(LD) $(CFLAGS) $(PROG_CFLAGS) ${PROGDEFINES} $(INCLUDES) -o $@ $(OBJS) $(EXE_CFLAGS)
+++ $(CC) $(CFLAGS) $(PROG_CFLAGS) ${PROGDEFINES} $(INCLUDES) -o $@ $(OBJS) $(EXE_CFLAGS)
++
++ TestSlave.c: TestSlave.od
++ $(MAKE) -C ../../objdictgen gnosis
++--- a/examples/CANOpenShell/Makefile.in
+++++ b/examples/CANOpenShell/Makefile.in
++@@ -64,7 +64,7 @@
++ $(MAKE) -C ../../drivers/$(TARGET) libcanfestival_$(TARGET).a
++
++ $(CANOPENSHELL): $(OBJS)
++- $(LD) $(CFLAGS) $(PROG_CFLAGS) ${PROGDEFINES} $(INCLUDES) -o $@ $(OBJS) $(EXE_CFLAGS)
+++ $(CC) $(CFLAGS) $(PROG_CFLAGS) ${PROGDEFINES} $(INCLUDES) -o $@ $(OBJS) $(EXE_CFLAGS)
++ mkdir -p Debug; cp $(CANOPENSHELL) Debug
++
++ CANOpenShellMasterOD.c: CANOpenShellMasterOD.od
+diff --git a/feeds/packages/libs/libcap/Makefile b/feeds/packages/libs/libcap/Makefile
+new file mode 100644
+index 0000000..418033d
+--- /dev/null
++++ b/feeds/packages/libs/libcap/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libcap
++PKG_VERSION:=2.24
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/
++PKG_MD5SUM:=d43ab9f680435a7fff35b4ace8d45b80
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++define Package/libcap
++ TITLE:=Linux capabilities library
++ SECTION:=libs
++ CATEGORY:=Libraries
++ URL:=http://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/
++endef
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ BUILD_CC="$(CC)" \
++ BUILD_CFLAGS="$(FPIC) -I$(PKG_BUILD_DIR)/libcap/include" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LD="$(TARGET_CC)" \
++ LDFLAGS="$(TARGET_LDFLAGS) -shared" \
++ INDENT="| true" \
++ PAM_CAP="no" \
++ LIBATTR="no" \
++ DYNAMIC="yes" \
++ lib="lib"
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/sys
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/lib/* $(1)/usr/lib/
++endef
++
++define Package/libcap/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/lib/libcap.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libcap))
+diff --git a/feeds/packages/libs/libcap/patches/100-portability.patch b/feeds/packages/libs/libcap/patches/100-portability.patch
+new file mode 100644
+index 0000000..735a973
+--- /dev/null
++++ b/feeds/packages/libs/libcap/patches/100-portability.patch
+@@ -0,0 +1,19 @@
++--- a/libcap/_makenames.c
+++++ b/libcap/_makenames.c
++@@ -7,7 +7,6 @@
++
++ #include <stdio.h>
++ #include <stdlib.h>
++-#include <sys/capability.h>
++
++ /*
++ * #include 'sed' generated array
++@@ -22,7 +21,7 @@ struct {
++ };
++
++ /* this should be more than big enough (factor of three at least) */
++-const char *pointers[8*sizeof(struct __user_cap_data_struct)];
+++const char *pointers[8*12];
++
++ int main(void)
++ {
+diff --git a/feeds/packages/libs/libcoap/Makefile b/feeds/packages/libs/libcoap/Makefile
+new file mode 100644
+index 0000000..8e6ef5d
+--- /dev/null
++++ b/feeds/packages/libs/libcoap/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libcoap
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/obgm/libcoap
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)
++PKG_SOURCE_VERSION:=2da31de732c0e51a9bc9e1d4aea21e25da89cf87
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.bz2
++
++PKG_MAINTAINER:=Anton Glukhov <anton.a.glukhov@gmail.com>
++PKG_LICENSE:=GPL-2.0+ BSD-2-Clause
++PKG_LICENSE_FILE:=COPYING LICENSE.GPL LICENSE.BSD
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libcoap
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=CoAP (RFC 7252) library
++ URL:=http://libcoap.net/
++endef
++
++define Package/libcoap/description
++ Constrained Application Protocol (RFC 7252) library
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --disable-examples \
++ --disable-documentation
++
++ifeq ($(CONFIG_BIG_ENDIAN),y)
++TARGET_CFLAGS += -DWORDS_BIGENDIAN
++endif
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/
++endef
++
++define Package/libcoap/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libcoap-1.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libcoap))
+diff --git a/feeds/packages/libs/libdaemon/Makefile b/feeds/packages/libs/libdaemon/Makefile
+new file mode 100644
+index 0000000..958a37d
+--- /dev/null
++++ b/feeds/packages/libs/libdaemon/Makefile
+@@ -0,0 +1,72 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libdaemon
++PKG_VERSION:=0.14
++PKG_RELEASE:=5
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://0pointer.de/lennart/projects/libdaemon/
++PKG_MD5SUM:=509dc27107c21bcd9fbf2f95f5669563
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libdaemon
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A lightweight C library that eases the writing of UNIX daemons
++ URL:=http://0pointer.de/lennart/projects/libdaemon/
++endef
++
++define Package/libdaemon/description
++ libdaemon is a lightweight C library that eases the writing of UNIX daemons.
++ It consists of the following parts:
++ - A wrapper around fork() which does the correct daemonization procedure of a process
++ - A wrapper around syslog() for simpler and compatible log output to Syslog or STDERR
++ - An API for writing PID files
++ - An API for serializing UNIX signals into a pipe for usage with select() or poll()
++ - An API for running subprocesses with STDOUT and STDERR redirected to syslog
++
++ APIs like these are used in most daemon software available. It is not that
++ simple to get it done right and code duplication is not a goal.
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --enable-shared \
++ --enable-static \
++ --disable-lynx \
++ --disable-examples \
++ , \
++ ac_cv_func_setpgrp_void=yes \
++ )
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libdaemon $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdaemon.a $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdaemon.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libdaemon.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libdaemon/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdaemon.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libdaemon))
+diff --git a/feeds/packages/libs/libdaemon/patches/001-daemon_set_verbosity.patch b/feeds/packages/libs/libdaemon/patches/001-daemon_set_verbosity.patch
+new file mode 100644
+index 0000000..d0c66c7
+--- /dev/null
++++ b/feeds/packages/libs/libdaemon/patches/001-daemon_set_verbosity.patch
+@@ -0,0 +1,30 @@
++From 013963ba35e8fe8897211c0acf5ee98f9a871fc1 Mon Sep 17 00:00:00 2001
++From: Michael Heimpold <mhei@heimpold.de>
++Date: Fri, 10 Jan 2014 19:38:51 +0100
++Subject: [PATCH] daemon_set_verbosity: fix erroneous error message
++
++When calling this function with a value other than LOG_DEBUG
++the error message was triggered erroneously.
++
++Signed-off-by: Michael Heimpold <mhei@heimpold.de>
++---
++
++ libdaemon/dlog.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/libdaemon/dlog.c b/libdaemon/dlog.c
++index 1cc0566..cc2b918 100644
++--- a/libdaemon/dlog.c
+++++ b/libdaemon/dlog.c
++@@ -42,7 +42,7 @@ static int daemon_verbosity_level = LOG_INFO;
++ void daemon_set_verbosity(int verbosity_prio) {
++
++ /* Allow using negative verbosity levels to hide _all_ messages */
++- if (verbosity_prio > 0 && (verbosity_prio & LOG_PRIMASK) != LOG_PRIMASK)
+++ if (verbosity_prio > 0 && (verbosity_prio & LOG_PRIMASK) != verbosity_prio)
++ daemon_log(LOG_ERR, "The value %d is not a valid priority value", verbosity_prio);
++
++ daemon_verbosity_level = verbosity_prio & LOG_PRIMASK;
++--
++1.7.10.4
++
+diff --git a/feeds/packages/libs/libdaq/Makefile b/feeds/packages/libs/libdaq/Makefile
+new file mode 100644
+index 0000000..3b269f1
+--- /dev/null
++++ b/feeds/packages/libs/libdaq/Makefile
+@@ -0,0 +1,74 @@
++#
++# Copyright (C) 2012-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libdaq
++PKG_VERSION:=2.0.4
++PKG_RELEASE:=2
++
++PKG_SOURCE_URL:=https://www.snort.org/downloads/snort/ \
++ @SF/snort
++PKG_SOURCE:=daq-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=65e51d72e9d5d8b397e192e4e5857eff
++PKG_BUILD_DIR:=$(BUILD_DIR)/daq-$(PKG_VERSION)
++
++PKG_LICENSE:=GPL-2.0
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/libdaq
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=DAQ library
++ URL:=$(PKG_SOURCE_URL)
++ DEPENDS:=+libdnet +libpcap
++endef
++
++define Package/libdaq/description
++ Data Acquisition library for packet I/O.
++endef
++
++CONFIGURE_ARGS+= \
++ --disable-static \
++ --disable-nfq-module \
++ --with-dnet-includes="$(STAGING_DIR)/usr/include" \
++ --with-dnet-libraries="$(STAGING_DIR)/usr/lib" \
++ --with-libpcap-includes="$(STAGING_DIR)/usr/include" \
++ --with-libpcap-libraries="$(STAGING_DIR)/usr/lib" \
++
++define Build/Compile
++ $(MAKE) $(MAKE_FLAGS) -C $(PKG_BUILD_DIR)
++endef
++
++define Build/Install
++ $(MAKE) $(MAKE_FLAGS) -C $(PKG_BUILD_DIR) install DESTDIR=$(PKG_INSTALL_DIR)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(STAGING_DIR)/usr/include/
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib* $(STAGING_DIR)/usr/lib/
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/lib/daq
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/daq/* $(STAGING_DIR)/usr/lib/daq/
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/daq-modules-config $(STAGING_DIR)/usr/bin/
++endef
++
++define Package/libdaq/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/daq
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/daq/*.so* $(1)/usr/lib/daq/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/daq-modules-config $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libdaq))
+diff --git a/feeds/packages/libs/libdaq/patches/001-compile.patch b/feeds/packages/libs/libdaq/patches/001-compile.patch
+new file mode 100644
+index 0000000..b8dd942
+--- /dev/null
++++ b/feeds/packages/libs/libdaq/patches/001-compile.patch
+@@ -0,0 +1,18 @@
++--- a/configure
+++++ b/configure
++@@ -12967,10 +12967,11 @@ if ${daq_cv_libpcap_version_1x+:} false;
++ else
++
++ if test "$cross_compiling" = yes; then :
++- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
++-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++-as_fn_error $? "cannot run test program while cross compiling
++-See \`config.log' for more details" "$LINENO" 5; }
+++# { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+++#$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+++#as_fn_error $? "cannot run test program while cross compiling
+++#See \`config.log' for more details" "$LINENO" 5; }
+++ echo " No cross compiling test."
++ else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++ /* end confdefs.h. */
+diff --git a/feeds/packages/libs/libdaq/patches/100-musl-compat.patch b/feeds/packages/libs/libdaq/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..c510564
+--- /dev/null
++++ b/feeds/packages/libs/libdaq/patches/100-musl-compat.patch
+@@ -0,0 +1,42 @@
++--- a/os-daq-modules/daq_ipfw.c
+++++ b/os-daq-modules/daq_ipfw.c
++@@ -23,10 +23,10 @@
++ #include <stdlib.h>
++ #include <string.h>
++ #include <stdio.h>
+++#include <unistd.h>
++
++ #include <sys/types.h>
++ #include <sys/time.h>
++-#include <sys/unistd.h>
++
++ #include <netinet/in.h>
++ #include <sys/socket.h>
++--- a/os-daq-modules/daq_ipq.c
+++++ b/os-daq-modules/daq_ipq.c
++@@ -24,10 +24,10 @@
++ #include <stdio.h>
++ #include <stdlib.h>
++ #include <string.h>
+++#include <unistd.h>
++
++ #include <sys/types.h>
++ #include <sys/time.h>
++-#include <sys/unistd.h>
++
++ #include <netinet/ip.h>
++
++--- a/os-daq-modules/daq_nfq.c
+++++ b/os-daq-modules/daq_nfq.c
++@@ -24,10 +24,10 @@
++ #include <stdio.h>
++ #include <stdlib.h>
++ #include <string.h>
+++#include <unistd.h>
++
++ #include <sys/types.h>
++ #include <sys/time.h>
++-#include <sys/unistd.h>
++
++ #include <netinet/ip.h>
++
+diff --git a/feeds/packages/libs/libdbi-drivers/Makefile b/feeds/packages/libs/libdbi-drivers/Makefile
+new file mode 100644
+index 0000000..e5a2da7
+--- /dev/null
++++ b/feeds/packages/libs/libdbi-drivers/Makefile
+@@ -0,0 +1,105 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libdbi-drivers
++PKG_VERSION:=0.9.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/libdbi-drivers
++PKG_MD5SUM:=9f47b960e225eede2cdeaabf7d22f59f
++
++PKG_LICENSE:=LGPL-2.1
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libdbi-drivers/default
++ SECTION:=libs
++ CATEGORY:=Libraries
++ URL:=http://libdbi-drivers.sourceforge.net/
++endef
++
++define Package/libdbi-drivers
++$(call Package/libdbi-drivers/default)
++ DEPENDS:=libdbi +libdbd-mysql +libdbd-pgsql +libdbd-sqlite3
++ TITLE:=Database drivers for libdbi
++endef
++
++define Package/libdbd-mysql
++$(call Package/libdbi-drivers/default)
++ DEPENDS:=libdbi +libmysqlclient
++ TITLE:=MySQL database server driver for libdbi
++endef
++
++define Package/libdbd-pgsql
++$(call Package/libdbi-drivers/default)
++ DEPENDS:=libdbi +libpq
++ TITLE:=PostgreSQL database server driver for libdbi
++endef
++
++define Package/libdbd-sqlite3
++$(call Package/libdbi-drivers/default)
++ DEPENDS:=libdbi +libsqlite3
++ TITLE:=SQLite3 database driver for libdbi
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --disable-static \
++ --disable-rpath \
++ --disable-docs \
++ --with-dbi-incdir=$(STAGING_DIR)/usr/include \
++ --with-dbi-libdir=$(STAGING_DIR)/usr/lib
++
++ifneq ($(CONFIG_PACKAGE_libdbd-mysql),)
++ CONFIGURE_ARGS += \
++ --with-mysql \
++ --with-mysql-incdir=$(STAGING_DIR)/usr/include/mysql \
++ --with-mysql-libdir=$(STAGING_DIR)/usr/lib/mysql
++ TARGET_LDFLAGS += \
++ -L$(STAGING_DIR)/usr/lib/mysql/
++else
++ CONFIGURE_ARGS += --without-mysql
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_libdbd-pgsql),)
++ CONFIGURE_ARGS += \
++ --with-pgsql \
++ --with-pgsql-incdir=$(STAGING_DIR)/usr/include \
++ --with-pgsql-libdir=$(STAGING_DIR)/usr/lib
++else
++ CONFIGURE_ARGS += --without-pgsql
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_libdbd-sqlite3),)
++ CONFIGURE_ARGS += \
++ --with-sqlite3 \
++ --with-sqlite3-incdir=$(STAGING_DIR)/usr/include \
++ --with-sqlite3-libdir=$(STAGING_DIR)/usr/lib
++else
++ CONFIGURE_ARGS += --without-sqlite3
++endif
++
++define BuildPlugin
++ define Package/libdbd-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/dbd
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/dbd/libdbd$(1).so $$(1)/usr/lib/dbd/
++ endef
++ $$(eval $$(call BuildPackage,libdbd-$(1)))
++endef
++
++#$(eval $(call BuildPackage,libdbi-drivers))
++$(eval $(call BuildPlugin,mysql))
++$(eval $(call BuildPlugin,pgsql))
++$(eval $(call BuildPlugin,sqlite3))
+diff --git a/feeds/packages/libs/libdbi-drivers/patches/001_libsqlite3_fix.patch b/feeds/packages/libs/libdbi-drivers/patches/001_libsqlite3_fix.patch
+new file mode 100644
+index 0000000..5ded953
+--- /dev/null
++++ b/feeds/packages/libs/libdbi-drivers/patches/001_libsqlite3_fix.patch
+@@ -0,0 +1,11 @@
++--- a/acinclude.m4
+++++ b/acinclude.m4
++@@ -310,7 +310,7 @@ if test "$ac_sqlite3" = "yes"; then
++ AC_SEARCH_LIBS_VAR([sqlite3_exec], sqlite3, , , , SQLITE3_LIBS)
++ SQLITE3_LDFLAGS=""
++ else
++- SQLITE3_LIBS=-lsqlite
+++ SQLITE3_LIBS=-lsqlite3
++ SQLITE3_LDFLAGS=-L$ac_sqlite3_libdir
++ fi
++
+diff --git a/feeds/packages/libs/libdbi/Makefile b/feeds/packages/libs/libdbi/Makefile
+new file mode 100644
+index 0000000..a1079fe
+--- /dev/null
++++ b/feeds/packages/libs/libdbi/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libdbi
++PKG_VERSION:=0.9.0
++PKG_RELEASE:=4
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/libdbi
++PKG_MD5SUM:=05e2ceeac4bc85fbe40de8b4b22d9ab3
++
++PKG_LICENSE:=LGPL-2.1
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libdbi
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Database Independent Abstraction Layer library
++ URL:=http://libdbi.sourceforge.net/
++endef
++
++define Package/libdbi/description
++ This package provides a database-independent abstraction layer library in C.
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-docs
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/dbi $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdbi.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/dbi.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libdbi/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdbi.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libdbi))
+diff --git a/feeds/packages/libs/libdmapsharing/Makefile b/feeds/packages/libs/libdmapsharing/Makefile
+new file mode 100644
+index 0000000..522eb06
+--- /dev/null
++++ b/feeds/packages/libs/libdmapsharing/Makefile
+@@ -0,0 +1,72 @@
++#
++# Copyright (C) 2009-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++# This Makefile is a skeleton
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libdmapsharing
++PKG_VERSION:=2.9.32
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=LGPLv2.1
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=libdmapsharing-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.flyn.org/projects/libdmapsharing/
++PKG_MD5SUM:=b0bb27525c92233bd76e5f7b7b6cfe6d
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++TARGET_LDFLAGS+= \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib
++
++define Package/libdmapsharing
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libsoup +mdnsresponder +gstreamer1 +gst1-plugins-base +libgst1app
++ TITLE:=libdmapsharing
++ URL:=http://www.flyn.org/projects/libdmapsharing/
++endef
++
++define Package/libdmapsharing/decription
++ Libdmapsharing is a DMAP library implementation in C
++endef
++
++CONFIGURE_ARGS += \
++ --disable-introspection \
++ --disable-gtk-doc
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/libdmapsharing-3.0/ \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.so* \
++ $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/*.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libdmapsharing/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.so* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libdmapsharing))
+diff --git a/feeds/packages/libs/libdmapsharing/patches/001-disable_pixbuf.patch b/feeds/packages/libs/libdmapsharing/patches/001-disable_pixbuf.patch
+new file mode 100644
+index 0000000..fcc8453
+--- /dev/null
++++ b/feeds/packages/libs/libdmapsharing/patches/001-disable_pixbuf.patch
+@@ -0,0 +1,22 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -117,18 +117,7 @@ dnl make GOBJECT_CFLAGS and GOBJECT_LIBS
++ AC_SUBST(GOBJECT_CFLAGS)
++ AC_SUBST(GOBJECT_LIBS)
++
++-dnl Check for gdk-pixbuf, needed for DACP Now Playing Artwork
++-PKG_CHECK_MODULES(GDKPIXBUF, gdk-pixbuf-2.0,
++- HAVE_GDKPIXBUF=yes,
++- HAVE_GDKPIXBUF=no)
++-
++-if test x"$HAVE_GDKPIXBUF" = "xyes"; then
++- AC_DEFINE(HAVE_GDKPIXBUF, 1, [Define if gdk-pixbuf support is enabled])
++-else
++- AC_WARN(Gdk-pixbuf library not present, Now Playing artwork might be affected.)
++-fi
++-
++-AM_CONDITIONAL(USE_GDKPIXBUF, test x"$HAVE_GDKPIXBUF" = "xyes")
+++HAVE_GDKPIXBUF=no
++
++ AC_SUBST(GDKPIXBUF_CFLAGS)
++ AC_SUBST(GDKPIXBUF_LIBS)
+diff --git a/feeds/packages/libs/libdmapsharing/patches/002-disable_tests.patch b/feeds/packages/libs/libdmapsharing/patches/002-disable_tests.patch
+new file mode 100644
+index 0000000..bafc52f
+--- /dev/null
++++ b/feeds/packages/libs/libdmapsharing/patches/002-disable_tests.patch
+@@ -0,0 +1,8 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -1,4 +1,4 @@
++-SUBDIRS = libdmapsharing vala tests doc
+++SUBDIRS = libdmapsharing vala doc
++ DIST_SUBDIRS = $(SUBDIRS) m4 media
++
++ # pcfiles = libdmapsharing-@LIBDMAPSHARING_MAJORMINOR@.pc
+diff --git a/feeds/packages/libs/libdmapsharing/patches/003-make_unit_test_optional.patch b/feeds/packages/libs/libdmapsharing/patches/003-make_unit_test_optional.patch
+new file mode 100644
+index 0000000..14d020f
+--- /dev/null
++++ b/feeds/packages/libs/libdmapsharing/patches/003-make_unit_test_optional.patch
+@@ -0,0 +1,17 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -357,7 +357,13 @@ if test -n "$BUILD_DPAPVIEW" ; then
++ AC_WARN([will not build dpapview])
++ fi
++
++-PKG_CHECK_MODULES([CHECK], [check >= 0.9.4],have_check=yes,have_check=no)
+++dnl Test if --enable-unit-test given
+++AC_ARG_ENABLE(unit-test, [AC_HELP_STRING([--enable-unit-test],[enable unit test])])
+++if test "x$enable_unit_test" = "xyes" ; then
+++ PKG_CHECK_MODULES([CHECK], [check >= 0.9.4],have_check=yes,have_check=no)
+++else
+++ have_check=no
+++fi
++ AM_CONDITIONAL(HAVE_CHECK, test x"$have_check" = "xyes")
++ if test "x$have_check" = "xyes"; then
++ AC_DEFINE(HAVE_CHECK, 1, [Define if check support is enabled])
+diff --git a/feeds/packages/libs/libdnet/Makefile b/feeds/packages/libs/libdnet/Makefile
+new file mode 100644
+index 0000000..08d3e20
+--- /dev/null
++++ b/feeds/packages/libs/libdnet/Makefile
+@@ -0,0 +1,87 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libdnet
++PKG_VERSION:=1.12
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=http://libdnet.googlecode.com/files/
++PKG_MD5SUM:=9253ef6de1b5e28e9c9a62b882e44cc9
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_LICENSE:=BSD
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libdnet
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Low-level network library
++ URL:=http://sourceforge.net/projects/libdnet/
++endef
++
++define Package/libdnet/description
++ libdnet is a library of simplified, portable interface to several low-level
++ networking routines.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --without-check \
++ --without-python
++
++CONFIGURE_VARS += \
++ ac_cv_dnet_bsd_bpf=no
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) -D_GNU_SOURCE"
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(2)/bin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/dnet-config \
++ $(2)/bin/
++ $(SED) \
++ 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' \
++ $(2)/bin/dnet-config
++
++ $(INSTALL_DIR) $(1)/usr/include
++ $(INSTALL_DATA)\
++ $(PKG_INSTALL_DIR)/usr/include/dnet.h \
++ $(1)/usr/include/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/dnet \
++ $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libdnet.{la,a,so*} \
++ $(1)/usr/lib/
++endef
++
++define Package/libdnet/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libdnet.so.* \
++ $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/sbin/dnet \
++ $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,libdnet))
+diff --git a/feeds/packages/libs/libdnet/patches/001-compile.patch b/feeds/packages/libs/libdnet/patches/001-compile.patch
+new file mode 100644
+index 0000000..54223c9
+--- /dev/null
++++ b/feeds/packages/libs/libdnet/patches/001-compile.patch
+@@ -0,0 +1,20 @@
++--- a/config/config.sub
+++++ b/config/config.sub
++@@ -228,7 +228,7 @@ case $basic_machine in
++ | a29k \
++ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
++ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
++- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+++ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
++ | c4x | clipper \
++ | d10v | d30v | dlx | dsp16xx \
++ | fr30 | frv \
++@@ -290,7 +290,7 @@ case $basic_machine in
++ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
++ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
++ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
++- | avr-* \
+++ | avr-* | avr32-* \
++ | bs2000-* \
++ | c[123]* | c30-* | [cjt]90-* | c54x-* \
++ | clipper-* | cydra-* \
+diff --git a/feeds/packages/libs/libdnet/patches/002-config.patch b/feeds/packages/libs/libdnet/patches/002-config.patch
+new file mode 100644
+index 0000000..cde376a
+--- /dev/null
++++ b/feeds/packages/libs/libdnet/patches/002-config.patch
+@@ -0,0 +1,23 @@
++--- a/dnet-config.in
+++++ b/dnet-config.in
++@@ -45,10 +45,18 @@ while test $# -gt 0; do
++ done
++
++ if test "$echo_cflags" = "yes"; then
++- echo -I@includedir@
+++ includes=
+++ if test "@includedir@" != "/usr/include" ; then
+++ includes=-I@includedir@
+++ fi
+++ echo $includes
++ fi
++
++ if test "$echo_libs" = "yes"; then
++- echo -L@libdir@ -ldnet @LIBS@
+++ libs=
+++ if test "@libdir@" != "/usr/lib" ; then
+++ libs=-I@libdir@
+++ fi
+++ echo $libs -ldnet @LIBS@
++ fi
++
+diff --git a/feeds/packages/libs/libesmtp/Makefile b/feeds/packages/libs/libesmtp/Makefile
+new file mode 100644
+index 0000000..fa402c6
+--- /dev/null
++++ b/feeds/packages/libs/libesmtp/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libesmtp
++PKG_VERSION:=1.0.6
++PKG_RELEASE:=2
++PKG_MD5SUM:=c4fedc999b6c3820296b0eb92cc2e252
++
++PKG_MAINTAINER:=Othmar Truniger <github@truniger.ch>
++PKG_LICENSE:=LGPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE_URL:=http://www.stafford.uklinux.net/libesmtp
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libesmtp
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A Library for Posting Electronic Mail
++ URL:=http://www.stafford.uklinux.net/libesmtp/
++ DEPENDS:=+libpthread
++endef
++
++CONFIGURE_ARGS += \
++ --without-openssl
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/libesmtp-config $(1)/usr/bin/
++ $(SED) 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' $(1)/usr/bin/libesmtp-config
++
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libesmtp.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(2)/bin
++ $(LN) ../../usr/bin/libesmtp-config $(2)/bin/
++endef
++
++define Package/libesmtp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libesmtp.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libesmtp))
+diff --git a/feeds/packages/libs/libev/Makefile b/feeds/packages/libs/libev/Makefile
+new file mode 100644
+index 0000000..9f0dc5c
+--- /dev/null
++++ b/feeds/packages/libs/libev/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libev
++PKG_VERSION:=4.20
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://dist.schmorp.de/libev/Attic/
++PKG_MD5SUM:=1cac539cfc560f381a490c9fba940de9
++PKG_LICENSE:=BSD-2-Clause
++PKG_MAINTAINER:=Karl Palsson <karlp@tweak.net.au>
++
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libev
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=High-performance event loop
++ URL:=http://software.schmorp.de/pkg/libev.html
++endef
++
++define Package/libev/description
++ A full-featured and high-performance event loop that is loosely modelled after
++ libevent, but without its limitations and bugs.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libev.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/libev/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libev.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libev))
+diff --git a/feeds/packages/libs/libevdev/Makefile b/feeds/packages/libs/libevdev/Makefile
+new file mode 100644
+index 0000000..f437494
+--- /dev/null
++++ b/feeds/packages/libs/libevdev/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libevdev
++PKG_VERSION:=1.4.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.freedesktop.org/software/libevdev/
++PKG_MD5SUM:=b66443bb664cfaf2ba7b3f8c238ea951
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libevdev
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=a wrapper library for evdev devices
++ URL:=http://www.freedesktop.org/wiki/Software/libevdev/
++endef
++
++define Package/libevdev/description
++ libevdev is a wrapper library for evdev devices. it moves the common
++ tasks when dealing with evdev devices into a library and provides a
++ library interface to the callers, thus avoiding erroneous ioctls, etc.
++
++ The eventual goal is that libevdev wraps all ioctls available to
++ evdev devices, thus making direct access unnecessary.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libevdev/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libevdev))
+diff --git a/feeds/packages/libs/libevdev/patches/010-no-clock-monotonic-raw-in-uclibc.patch b/feeds/packages/libs/libevdev/patches/010-no-clock-monotonic-raw-in-uclibc.patch
+new file mode 100644
+index 0000000..a11ac1e
+--- /dev/null
++++ b/feeds/packages/libs/libevdev/patches/010-no-clock-monotonic-raw-in-uclibc.patch
+@@ -0,0 +1,14 @@
++--- a/test/test-libevdev-init.c
+++++ b/test/test-libevdev-init.c
++@@ -32,6 +32,11 @@
++ #include <libevdev/libevdev-uinput.h>
++ #include "test-common.h"
++
+++/* work-around CLOCK_MONOTONIC_RAW definition missing in uClibc */
+++#ifndef CLOCK_MONOTONIC_RAW
+++#define CLOCK_MONOTONIC_RAW 4
+++#endif
+++
++ START_TEST(test_new_device)
++ {
++ struct libevdev *dev;
+diff --git a/feeds/packages/libs/libevent/Makefile b/feeds/packages/libs/libevent/Makefile
+new file mode 100644
+index 0000000..3dea702
+--- /dev/null
++++ b/feeds/packages/libs/libevent/Makefile
+@@ -0,0 +1,67 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libevent
++PKG_VERSION:=1.4.15
++PKG_RELEASE:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-release-$(PKG_VERSION)-stable
++PKG_SOURCE:=release-$(PKG_VERSION)-stable.tar.gz
++PKG_SOURCE_URL:=https://github.com/libevent/libevent/archive/
++PKG_MD5SUM:=6dce6fe39f133c09ffe63de895805f7f
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libevent
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Event notification library (legacy)
++ DEPENDS:=+librt
++ URL:=http://www.libevent.org
++endef
++
++define Package/libevent/description
++ The libevent API provides a mechanism to execute a callback function
++ when a specific event occurs on a file descriptor or after a timeout
++ has been reached. Furthermore, libevent also support callbacks due
++ to signals or regular timeouts.
++
++ libevent is meant to replace the event loop found in event driven
++ network servers. An application just needs to call event_dispatch()
++ and then add or remove events dynamically without having to change
++ the event loop.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS)" \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/libevent
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/libevent/
++ $(INSTALL_DIR) $(1)/usr/lib/libevent
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{a,so} $(1)/usr/lib/libevent/
++endef
++
++define Package/libevent/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libevent))
+diff --git a/feeds/packages/libs/libevhtp-1.1/Makefile b/feeds/packages/libs/libevhtp-1.1/Makefile
+new file mode 100644
+index 0000000..9d3cdbc
+--- /dev/null
++++ b/feeds/packages/libs/libevhtp-1.1/Makefile
+@@ -0,0 +1,47 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libevhtp-1.1
++PKG_VERSION:=1.1.7
++PKG_RELEASE:=1
++PKG_LICENSE:=BSD-3-Clause
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/ellzey/libevhtp.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=f70c920d4d8d4146ff662867f47c4b5854045b3c
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libevhtp-1.1
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A more flexible replacement for libevent's httpd API - compatibility package
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++ URL:=https://github.com/ellzey/libevhtp
++ DEPENDS:=+libevent2 +libevent2-pthreads +libpthread
++endef
++
++define Package/libevhtp-1.1/description
++ Libevhtp was created as a replacement API for Libevent's current HTTP API.
++
++ NOTE: This is an older version required for compatibility reasons. The latest version has its own package named "libevhtp".
++endef
++
++include $(INCLUDE_DIR)/cmake.mk
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/libevhtp-1.1/
++ $(INSTALL_DIR) $(1)/usr/lib/libevhtp-1.1/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libevhtp-1.1))
+diff --git a/feeds/packages/libs/libevhtp-1.1/patches/010-CMakeLists-fixes.patch b/feeds/packages/libs/libevhtp-1.1/patches/010-CMakeLists-fixes.patch
+new file mode 100644
+index 0000000..970bb76
+--- /dev/null
++++ b/feeds/packages/libs/libevhtp-1.1/patches/010-CMakeLists-fixes.patch
+@@ -0,0 +1,29 @@
++diff -rupN libevhtp-1.1-1.1.7-orig/CMakeLists.txt libevhtp-1.1-1.1.7/CMakeLists.txt
++--- libevhtp-1.1-1.1.7-orig/CMakeLists.txt 2015-06-14 00:15:28.000000000 +0200
+++++ libevhtp-1.1-1.1.7/CMakeLists.txt 2015-06-14 00:21:17.441299942 +0200
++@@ -54,7 +54,7 @@ if (NOT HAVE_SYS_UN)
++ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_SYS_UN")
++ endif(NOT HAVE_SYS_UN)
++
++-OPTION(EVHTP_DISABLE_SSL "Disable ssl support" OFF)
+++OPTION(EVHTP_DISABLE_SSL "Disable ssl support" ON)
++ OPTION(EVHTP_DISABLE_EVTHR "Disable evthread support" OFF)
++ OPTION(EVHTP_DIABLE_REGEX "Disable regex support" OFF)
++
++@@ -182,11 +182,11 @@ endif()
++ add_library(libevhtp STATIC ${LIBEVHTP_SOURCES} ${ONIG_SOURCES})
++ set_target_properties(libevhtp PROPERTIES OUTPUT_NAME "evhtp")
++
++-install (TARGETS libevhtp DESTINATION lib)
++-install (FILES evhtp.h DESTINATION include)
++-install (FILES htparse/htparse.h DESTINATION include)
++-install (FILES evthr/evthr.h DESTINATION include)
++-install (FILES oniguruma/onigposix.h DESTINATION include)
+++install (TARGETS libevhtp DESTINATION lib/libevhtp-1.1)
+++install (FILES evhtp.h DESTINATION include/libevhtp-1.1)
+++install (FILES htparse/htparse.h DESTINATION include/libevhtp-1.1)
+++install (FILES evthr/evthr.h DESTINATION include/libevhtp-1.1)
+++install (FILES oniguruma/onigposix.h DESTINATION include/libevhtp-1.1)
++
++ find_library (LIB_DL dl)
++ set (SYS_LIBS ${LIB_DL})
+diff --git a/feeds/packages/libs/libevhtp/Makefile b/feeds/packages/libs/libevhtp/Makefile
+new file mode 100644
+index 0000000..8be811e
+--- /dev/null
++++ b/feeds/packages/libs/libevhtp/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libevhtp
++PKG_VERSION:=1.2.10
++PKG_RELEASE:=1
++PKG_LICENSE:=BSD-3-Clause
++
++PKG_SOURCE:=$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/ellzey/libevhtp/archive/
++PKG_MD5SUM:=e7261c7e34654f78047431d169b88806
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libevhtp
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A more flexible replacement for libevent's httpd API
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++ URL:=https://github.com/ellzey/libevhtp
++ DEPENDS:=+libevent2 +libevent2-openssl +libevent2-pthreads +libopenssl +libpthread
++endef
++
++define Package/libevhtp/description
++ Libevhtp was created as a replacement API for Libevent's current HTTP API.
++ The reality of libevent's http interface is that it was created as a JIT server,
++ meaning the developer never thought of it being used for creating a full-fledged HTTP service.
++endef
++
++include $(INCLUDE_DIR)/cmake.mk
++
++Hooks/Prepare/Post += delete_source_package
++
++define delete_source_package
++ # deleting source package as its filename is ambiguous
++ rm -f $(DL_DIR)/$(PKG_SOURCE)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/{include,lib}
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libevhtp.so* $(1)/usr/lib/
++
++endef
++
++define Package/libevhtp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libevhtp.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libevhtp))
+diff --git a/feeds/packages/libs/libevhtp/patches/010-enable-shared-object-building.patch b/feeds/packages/libs/libevhtp/patches/010-enable-shared-object-building.patch
+new file mode 100644
+index 0000000..fa6aa4b
+--- /dev/null
++++ b/feeds/packages/libs/libevhtp/patches/010-enable-shared-object-building.patch
+@@ -0,0 +1,12 @@
++diff -rupN libevhtp-1.2.9.orig/CMakeLists.txt libevhtp-1.2.9/CMakeLists.txt
++--- libevhtp-1.2.9.orig/CMakeLists.txt 2014-03-23 12:50:50.000000000 +0100
+++++ libevhtp-1.2.9/CMakeLists.txt 2014-11-21 11:46:58.644575813 +0100
++@@ -64,7 +64,7 @@ OPTION(EVHTP_DISABLE_EVTHR "Disable
++ OPTION(EVHTP_DISABLE_REGEX "Disable regex support" OFF)
++
++ # -DEVHTP_BUILD_SHARED:STRING=ON
++-OPTION(EVHTP_BUILD_SHARED "Build shared library too" OFF)
+++OPTION(EVHTP_BUILD_SHARED "Build shared library too" ON)
++
++ # -DEVHTP_USE_DEFER_ACCEPT:STRING=ON
++ OPTION(EVHTP_USE_DEFER_ACCEPT "Enable TCP_DEFER_ACCEPT" OFF)
+diff --git a/feeds/packages/libs/libexif/Makefile b/feeds/packages/libs/libexif/Makefile
+new file mode 100644
+index 0000000..c290bdd
+--- /dev/null
++++ b/feeds/packages/libs/libexif/Makefile
+@@ -0,0 +1,63 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libexif
++PKG_VERSION:=0.6.21
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/libexif
++PKG_MD5SUM:=27339b89850f28c8f1c237f233e05b27
++
++PKG_LICENSE:=LGPL-2.1
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libexif
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=library for jpeg files with exif tags
++ URL:=http://libexif.sourceforge.net/
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++endef
++
++define Package/libexif/description
++ libexif is a library for parsing, editing, and saving EXIF data. It is
++ intended to replace lots of redundant implementations in command-line
++ utilities and programs with GUIs.
++endef
++
++CONFIGURE_ARGS+= \
++ --enable-shared \
++ --enable-static \
++ --disable-rpath \
++ --without-libiconv-prefix \
++ --without-libintl-prefix \
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libexif $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libexif*.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libexif.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libexif/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libexif*.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libexif))
+diff --git a/feeds/packages/libs/libexif/patches/100-no_doc.patch b/feeds/packages/libs/libexif/patches/100-no_doc.patch
+new file mode 100644
+index 0000000..ae5bf27
+--- /dev/null
++++ b/feeds/packages/libs/libexif/patches/100-no_doc.patch
+@@ -0,0 +1,12 @@
++diff -u --recursive libexif-0.6.21-vanilla/Makefile.in libexif-0.6.21/Makefile.in
++--- libexif-0.6.21-vanilla/Makefile.in 2014-07-17 22:17:52.439423287 -0400
+++++ libexif-0.6.21/Makefile.in 2014-07-17 22:18:28.125359945 -0400
++@@ -289,7 +289,7 @@
++ top_build_prefix = @top_build_prefix@
++ top_builddir = @top_builddir@
++ top_srcdir = @top_srcdir@
++-SUBDIRS = m4m po libexif test doc binary contrib
+++SUBDIRS = m4m po libexif test binary contrib
++ EXTRA_DIST = @PACKAGE_TARNAME@.spec README-Win32.txt libexif.pc.in \
++ libexif-uninstalled.pc.in
++ pkgconfigdir = $(libdir)/pkgconfig
+diff --git a/feeds/packages/libs/libextractor/Makefile b/feeds/packages/libs/libextractor/Makefile
+new file mode 100644
+index 0000000..ddccc88
+--- /dev/null
++++ b/feeds/packages/libs/libextractor/Makefile
+@@ -0,0 +1,140 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libextractor
++PKG_VERSION:=1.3
++PKG_RELEASE:=3
++
++# ToDo:
++# - package missing optional dependencies: libexiv2, gsf, librpm, smf, tidy
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@GNU/$(PKG_NAME)
++PKG_MD5SUM:=35b8913dbebafe583a2781bf71509c48
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++PLUGINS:= \
++ archive:+libarchive-noopenssl \
++ deb \
++ dvi \
++ flac:+libflac \
++ gif:+giflib \
++ gstreamer:+libgstreamer1:+libgst1app:+libgst1pbutils:+libgst1tag \
++ it \
++ jpeg:+libjpeg \
++ man \
++ mime:+libmagic \
++ mpeg:+libmpeg2 \
++ nsf \
++ nsfe \
++ odf \
++ ogg:+libvorbis \
++ png \
++ ps \
++ riff \
++ s3m \
++ sid \
++ thumbnailffmpeg:+libffmpeg-full:+libmagic \
++ tiff:+libtiff \
++ wav \
++ xm \
++ zip
++
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++CONFIGURE_ARGS += \
++ --enable-ffmpeg \
++ --with-gstreamer \
++ --disable-gsf \
++ --disable-rpath
++
++define Package/libextractor
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GNU Libextractor
++ URL:=https://www.gnu.org/software/libextractor/
++ DEPENDS:=+libbz2 +libltdl +librt +zlib $(ICONV_DEPENDS) $(INTL_DEPENDS)
++ MENU:=1
++endef
++
++define Package/libextractor/description
++ GNU Libextractor is a library used to extract meta data from files.
++ The goal is to provide developers of file-sharing networks, browsers or
++ WWW-indexing bots with a universal library to obtain simple keywords and meta
++ data to match against queries and to show to users instead of only relying on
++ filenames.
++endef
++
++define PluginGen
++define Package/libextractor-plugin-$(subst _,-,$(firstword $(subst :, ,$(1))))
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GNU Libextractor ($(firstword $(subst :, ,$(1))) plugin)
++ URL:=https://www.gnu.org/software/libextractor/
++ DEPENDS:=libextractor $(wordlist 2,$(words $(subst :, ,$(1))),$(subst :, ,$(1)))
++endef
++endef
++
++$(foreach file,$(PLUGINS),$(eval $(call PluginGen,$(file))))
++
++define Package/extract
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=extract util from GNU Libextractor
++ URL:=https://www.gnu.org/software/libextractor/
++ DEPENDS:=+libextractor
++endef
++
++define Package/extract/description
++ libextractor contains the shell command extract that, similar to the
++ well-known file command, can extract meta data from a file an print the results
++ to stdout.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{so*,a,la} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libextractor/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
++endef
++
++define PluginInstall
++define Package/libextractor-plugin-$(subst _,-,$(firstword $(subst :, ,$(1))))/install
++ $(INSTALL_DIR) $$(1)/usr/lib/libextractor
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/lib/libextractor/libextractor_$(firstword $(subst :, ,$(1))).so \
++ $$(1)/usr/lib/libextractor
++endef
++endef
++
++define Package/extract/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++$(foreach file,$(PLUGINS),$(eval $(call PluginInstall,$(file))))
++
++$(eval $(call BuildPackage,libextractor))
++$(foreach file,$(PLUGINS),$(eval $(call BuildPackage,libextractor-plugin-$(subst _,-,$(firstword $(subst :, ,$(file)))))))
++$(eval $(call BuildPackage,extract))
+diff --git a/feeds/packages/libs/libextractor/patches/001-backport-support-for-giflib-5-1.patch b/feeds/packages/libs/libextractor/patches/001-backport-support-for-giflib-5-1.patch
+new file mode 100644
+index 0000000..7b7a2df
+--- /dev/null
++++ b/feeds/packages/libs/libextractor/patches/001-backport-support-for-giflib-5-1.patch
+@@ -0,0 +1,26 @@
++--- a/src/plugins/gif_extractor.c
+++++ b/src/plugins/gif_extractor.c
++@@ -78,7 +78,11 @@ EXTRACTOR_gif_extract_method (struct EXT
++ if (gif_file == NULL || gif_error != 0)
++ {
++ if (gif_file != NULL)
+++#if GIFLIB_MAJOR < 5 || GIFLIB_MINOR < 1
++ EGifCloseFile (gif_file);
+++#else
+++ EGifCloseFile (gif_file, NULL);
+++#endif
++ return; /* not a GIF */
++ }
++ #endif
++@@ -133,7 +137,11 @@ EXTRACTOR_gif_extract_method (struct EXT
++ DGifGetExtensionNext(gif_file, &ext)) &&
++ (NULL != ext) ) ; /* keep going */
++ }
+++#if defined (GIF_LIB_VERSION) || GIFLIB_MAJOR < 5 || GIFLIB_MINOR < 1
++ DGifCloseFile (gif_file);
+++#else
+++ DGifCloseFile (gif_file, NULL);
+++#endif
++ }
++
++ /* end of gif_extractor.c */
+diff --git a/feeds/packages/libs/libffi/Makefile b/feeds/packages/libs/libffi/Makefile
+new file mode 100644
+index 0000000..1eea6f7
+--- /dev/null
++++ b/feeds/packages/libs/libffi/Makefile
+@@ -0,0 +1,81 @@
++#
++# Copyright (C) 2009-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libffi
++PKG_VERSION:=3.0.13
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=ftp://sourceware.org/pub/libffi/
++PKG_MD5SUM:=45f3b6dbc9ee7c7dfbbbc5feba571529
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/host-build.mk
++
++define Package/libffi
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Foreign Function Interface (FFI) library
++ URL:=http://sourceware.org/libffi/
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++endef
++
++define Package/libffi/description
++The libffi library provides a portable, high level programming interface to
++various calling conventions. This allows a programmer to call any function
++specified by a call interface description at run-time.
++
++FFI stands for Foreign Function Interface. A foreign function interface is the
++popular name for the interface that allows code written in one language to call
++code written in another language. The libffi library really only provides the
++lowest, machine dependent layer of a fully featured foreign function interface.
++A layer must exist above libffi that handles type conversions for values passed
++between the two languages.
++endef
++
++CONFIGURE_PATH = build
++CONFIGURE_CMD = ../configure
++MAKE_PATH = build
++
++define Build/Configure
++ mkdir -p $(PKG_BUILD_DIR)/build
++ $(Build/Configure/Default)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libffi.{so*,a,la} \
++ $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* \
++ $(1)/usr/lib/pkgconfig/
++
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libffi-$(PKG_VERSION)/include/*.h \
++ $(1)/usr/include/
++endef
++
++define Package/libffi/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libffi.so.* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,libffi))
+diff --git a/feeds/packages/libs/libftdi/Makefile b/feeds/packages/libs/libftdi/Makefile
+new file mode 100644
+index 0000000..058fd50
+--- /dev/null
++++ b/feeds/packages/libs/libftdi/Makefile
+@@ -0,0 +1,64 @@
++#
++# Copyright (C) 2011-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libftdi
++PKG_VERSION:=0.20
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.intra2net.com/en/developer/libftdi/download/
++PKG_MD5SUM:=355d4474e3faa81b485d6a604b06951f
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=LGPL-2.0
++PKG_LICENSE_FILES:=COPYING.LIB
++
++PKG_INSTALL:=1
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/libftdi
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libusb-compat
++ TITLE:=Library to talk to FTDI chips
++ URL:=http://www.intra2net.com/en/developer/libftdi/
++endef
++
++define Package/libftdi/description
++ libFTDI - FTDI USB driver with bitbang mode
++ libFTDI is an open source library to talk to FTDI chips: FT232BM, FT245BM, FT2232C, FT2232H, FT4232H, FT2232D and FT245R, including the popular bitbang mode.
++ The library is linked with your program in userspace, no kernel driver required.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/ftdi.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libftdi.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libftdi.pc $(1)/usr/lib/pkgconfig/libftdi.pc
++ $(SED) \
++ 's,/usr/include,$$$${prefix}/include,g' \
++ $(1)/usr/lib/pkgconfig/libftdi.pc
++ $(SED) \
++ 's,/usr/lib,$$$${prefix}/lib,g' \
++ $(1)/usr/lib/pkgconfig/libftdi.pc
++endef
++
++define Package/libftdi/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/libftdi-config $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libftdi.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libftdi))
+diff --git a/feeds/packages/libs/libftdi/patches/100-fix-x86_64-build.patch b/feeds/packages/libs/libftdi/patches/100-fix-x86_64-build.patch
+new file mode 100644
+index 0000000..2460cb1
+--- /dev/null
++++ b/feeds/packages/libs/libftdi/patches/100-fix-x86_64-build.patch
+@@ -0,0 +1,11 @@
++--- a/CMakeLists.txt
+++++ b/CMakeLists.txt
++@@ -44,7 +44,7 @@ IF(CMAKE_SIZEOF_VOID_P EQUAL 4)
++ SET(LIB_SUFFIX "")
++ SET(PACK_ARCH "")
++ ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8)
++- SET(LIB_SUFFIX 64)
+++ SET(LIB_SUFFIX "")
++ SET(PACK_ARCH .x86_64)
++ endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
++
+diff --git a/feeds/packages/libs/libftdi/patches/101-fix-cmake-version-packagekit.patch b/feeds/packages/libs/libftdi/patches/101-fix-cmake-version-packagekit.patch
+new file mode 100644
+index 0000000..e6861dc
+--- /dev/null
++++ b/feeds/packages/libs/libftdi/patches/101-fix-cmake-version-packagekit.patch
+@@ -0,0 +1,29 @@
++--- a/CMakeLists.txt
+++++ b/CMakeLists.txt
++@@ -1,9 +1,12 @@
++ # Project
++ project(libftdi)
+++set(PACKAGE libftdi)
++ set(MAJOR_VERSION 0)
++ set(MINOR_VERSION 20)
+++set(VERSION ${VERSION_STRING})
++ set(VERSION_STRING ${MAJOR_VERSION}.${MINOR_VERSION})
++-SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}")
+++set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}")
+++set(top_srcdir ${CMAKE_SOURCE_DIR})
++
++ # CMake
++ if("${CMAKE_BUILD_TYPE}" STREQUAL "")
++@@ -98,12 +101,6 @@ option(DOCUMENTATION "Generate API docum
++
++ find_package(Doxygen)
++ if(DOCUMENTATION AND DOXYGEN_FOUND)
++-
++- # Set variables
++- set(PACKAGE libftdi)
++- set(VERSION ${VERSION_STRING})
++- set(top_srcdir ${CMAKE_SOURCE_DIR})
++-
++ # Find doxy config
++ message(STATUS "Doxygen found.")
++ set(DOXY_DIR "${CMAKE_SOURCE_DIR}/doc")
+diff --git a/feeds/packages/libs/libftdi1/Makefile b/feeds/packages/libs/libftdi1/Makefile
+new file mode 100644
+index 0000000..ed7ff2d
+--- /dev/null
++++ b/feeds/packages/libs/libftdi1/Makefile
+@@ -0,0 +1,91 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libftdi1
++PKG_VERSION:=1.2
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.intra2net.com/en/developer/libftdi/download/
++PKG_MD5SUM:=89dff802d89c4c0d55d8b4665fd52d0b
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=LGPL-2.0
++PKG_LICENSE_FILES:=COPYING.LIB
++
++PKG_INSTALL:=1
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/libftdi1
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libusb-1.0
++ TITLE:=Library to talk to FTDI chips
++ URL:=http://www.intra2net.com/en/developer/libftdi/
++endef
++
++define Package/libftdi1/description
++ libFTDI - FTDI USB driver with bitbang mode
++ libFTDI is an open source library to talk to FTDI chips: FT232BM, FT245BM, FT2232C, FT2232H, FT4232H, FT2232D and FT245R, including the popular bitbang mode.
++ The library is linked with your program in userspace, no kernel driver required.
++endef
++
++define Package/ftdi_eeprom
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+confuse +libftdi1
++ TITLE:=Tool for reading/erasing/flashing FTDI USB chip eeproms
++ URL:=http://www.intra2net.com/en/developer/libftdi/
++endef
++
++define Package/ftdi_eeprom/description
++ ftdi_eeprom is a small tool for reading/erasing/flashing FTDI USB chip
++ eeproms. It uses libftdi to access the chip, so you will need to have
++ the required permissions on the device.
++
++ The ftdi_sio module should not be loaded.
++
++ You have to unplug and replug your device to get the new values to be
++ read. Otherwise, you will still get the old values.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/libftdi1/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libftdi1/ftdi.h $(1)/usr/include/libftdi1/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libftdi1.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/cmake/libftdi1
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/cmake/libftdi1/* $(1)/usr/lib/cmake/libftdi1/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libftdi1.pc $(1)/usr/lib/pkgconfig/libftdi1.pc
++ $(SED) \
++ 's,/usr/include,$$$${prefix}/include,g' \
++ $(1)/usr/lib/pkgconfig/libftdi1.pc
++ $(SED) \
++ 's,/usr/lib,$$$${prefix}/lib,g' \
++ $(1)/usr/lib/pkgconfig/libftdi1.pc
++endef
++
++define Package/libftdi1/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/libftdi1-config $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libftdi1.so.* $(1)/usr/lib/
++endef
++
++define Package/ftdi_eeprom/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ftdi_eeprom $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libftdi1))
++$(eval $(call BuildPackage,ftdi_eeprom))
+diff --git a/feeds/packages/libs/libftdi1/patches/100-fix-x86_64-build.patch b/feeds/packages/libs/libftdi1/patches/100-fix-x86_64-build.patch
+new file mode 100644
+index 0000000..495db17
+--- /dev/null
++++ b/feeds/packages/libs/libftdi1/patches/100-fix-x86_64-build.patch
+@@ -0,0 +1,11 @@
++--- a/CMakeLists.txt
+++++ b/CMakeLists.txt
++@@ -55,7 +55,7 @@ if ( NOT DEFINED LIB_SUFFIX )
++ AND NOT EXISTS "/etc/debian_version"
++ AND NOT EXISTS "/etc/arch-release" )
++ if ( "${CMAKE_SIZEOF_VOID_P}" EQUAL "8" )
++- set ( LIB_SUFFIX 64 )
+++ set ( LIB_SUFFIX "" )
++ endif ()
++ endif ()
++ endif ()
+diff --git a/feeds/packages/libs/libgcrypt/Makefile b/feeds/packages/libs/libgcrypt/Makefile
+new file mode 100644
+index 0000000..afa4096
+--- /dev/null
++++ b/feeds/packages/libs/libgcrypt/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2005-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libgcrypt
++PKG_VERSION:=1.6.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=ftp://ftp.gnupg.org/gcrypt/libgcrypt
++PKG_MD5SUM:=a5a5060dc2f80bcac700ab0236ea47dc
++
++PKG_FIXUP:=patch-libtool
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libgcrypt
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libgpg-error
++ TITLE:=GNU crypto library
++ URL:=http://directory.fsf.org/security/libgcrypt.html
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++endef
++
++define Package/libgcrypt/description
++ This is a general purpose cryptographic library based on the code from
++ GnuPG. It provides functions for all cryptograhic building blocks:
++ symmetric ciphers (AES, DES, Arcfour, CAST5), hash algorithms (MD5, SHA-1,
++ RIPE-MD160, SHA-224/256, SHA-384/512), MACs (HMAC for all hash
++ algorithms), public key algorithms (RSA, DSA), large integer functions,
++ random numbers and a lot of supporting functions. Some algorithms have
++ been disabled to reduce size (Blowfish, Twofish, Serpent,
++ RC2, SEED, Camellia, CRC, MD4, TIGER-192, Whirlpool, ElGamal, ECC).
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-asm \
++ --with-gpg-error-prefix="$(STAGING_DIR)/usr"
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin $(2)/bin $(1)/usr/include $(1)/usr/lib $(1)/usr/share/aclocal
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/libgcrypt-config $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/gcrypt*.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgcrypt.{la,a,so*} $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/aclocal/libgcrypt.m4 $(1)/usr/share/aclocal/
++ $(SED) 's,^libdir=\"$$$${exec_prefix}/lib,libdir=\"$(STAGING_DIR)/usr/lib,g' $(1)/usr/bin/libgcrypt-config
++ $(SED) 's,^includedir=\"$$$${prefix}/include/,includedir=\"$(STAGING_DIR)/usr/include/,g' $(1)/usr/bin/libgcrypt-config
++ ln -sf $(STAGING_DIR)/usr/bin/libgcrypt-config $(2)/bin/
++endef
++
++define Package/libgcrypt/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgcrypt.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libgcrypt))
+diff --git a/feeds/packages/libs/libgcrypt/patches/001-no_docs_tests.patch b/feeds/packages/libs/libgcrypt/patches/001-no_docs_tests.patch
+new file mode 100644
+index 0000000..b5aeacc
+--- /dev/null
++++ b/feeds/packages/libs/libgcrypt/patches/001-no_docs_tests.patch
+@@ -0,0 +1,28 @@
++diff -u --recursive libgcrypt-1.6.1-vanilla/Makefile.am libgcrypt-1.6.1/Makefile.am
++--- libgcrypt-1.6.1-vanilla/Makefile.am 2014-07-18 00:31:21.020329371 -0400
+++++ libgcrypt-1.6.1/Makefile.am 2014-07-18 00:31:49.076314616 -0400
++@@ -25,8 +25,8 @@
++ # (A suitable gitlog-to-changelog script can be found in GnuPG master.)
++ GITLOG_TO_CHANGELOG=gitlog-to-changelog
++
++-DIST_SUBDIRS = m4 compat mpi cipher random src doc tests
++-SUBDIRS = compat mpi cipher random src doc tests
+++DIST_SUBDIRS = m4 compat mpi cipher random src
+++SUBDIRS = compat mpi cipher random src
++
++ EXTRA_DIST = autogen.sh autogen.rc README.GIT LICENSES \
++ ChangeLog-2011 build-aux/ChangeLog-2011 doc/ChangeLog-2011 \
++diff -u --recursive libgcrypt-1.6.1-vanilla/Makefile.in libgcrypt-1.6.1/Makefile.in
++--- libgcrypt-1.6.1-vanilla/Makefile.in 2014-07-18 00:31:21.020329371 -0400
+++++ libgcrypt-1.6.1/Makefile.in 2014-07-18 00:31:54.974311498 -0400
++@@ -331,8 +331,8 @@
++
++ # (A suitable gitlog-to-changelog script can be found in GnuPG master.)
++ GITLOG_TO_CHANGELOG = gitlog-to-changelog
++-DIST_SUBDIRS = m4 compat mpi cipher random src doc tests
++-SUBDIRS = compat mpi cipher random src doc tests
+++DIST_SUBDIRS = m4 compat mpi cipher random src
+++SUBDIRS = compat mpi cipher random src
++ EXTRA_DIST = autogen.sh autogen.rc README.GIT LICENSES \
++ ChangeLog-2011 build-aux/ChangeLog-2011 doc/ChangeLog-2011 \
++ m4/ChangeLog-2011 cipher/ChangeLog-2011 src/ChangeLog-2011 \
+diff --git a/feeds/packages/libs/libgd/Makefile b/feeds/packages/libs/libgd/Makefile
+new file mode 100644
+index 0000000..33d1dc0
+--- /dev/null
++++ b/feeds/packages/libs/libgd/Makefile
+@@ -0,0 +1,81 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libgd
++PKG_VERSION:=2.1.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=gd-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/libgd/libgd/archive
++PKG_MD5SUM:=e91a1a99903e460e7ba00a794e72cc1e
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++PKG_LICENSE:=MIT
++
++PKG_FIXUP:=autoreconf
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++PKG_BUILD_DIR:=$(BUILD_DIR)/libgd-gd-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libgd
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libjpeg +libpng
++ TITLE:=The GD graphics library
++ URL:=http://www.libgd.org/
++endef
++
++define Package/libgd/description
++ GD is an open source code library for the dynamic creation of images by
++ programmers. GD creates PNG, JPEG and GIF images, among other formats.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-rpath \
++ --without-x \
++ --without-fontconfig \
++ --without-freetype \
++ --with-jpeg=$(STAGING_DIR)/usr \
++ --with-png=$(STAGING_DIR)/usr \
++ --with-vpx=no \
++ --without-xpm \
++ --without-iconv
++
++CONFIGURE_VARS += \
++ LIBPNG12_CONFIG="$(STAGING_DIR)/host/bin/libpng12-config" \
++ ac_cv_header_iconv_h=no
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/gdlib-config $(1)/usr/bin/
++ $(SED) \
++ 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' \
++ $(1)/usr/bin/gdlib-config
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/entities.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/gd{,_io,cache,fontg,fontl,fontmb,fonts,fontt,fx}.h \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgd.{a,la,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(2)/bin
++ $(LN) ../../usr/bin/gdlib-config $(2)/bin/
++endef
++
++define Package/libgd/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgd.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libgd))
+diff --git a/feeds/packages/libs/libgd/patches/101-gdlib-config.patch b/feeds/packages/libs/libgd/patches/101-gdlib-config.patch
+new file mode 100644
+index 0000000..e51502c
+--- /dev/null
++++ b/feeds/packages/libs/libgd/patches/101-gdlib-config.patch
+@@ -0,0 +1,20 @@
++--- a/config/gdlib-config.in
+++++ b/config/gdlib-config.in
++@@ -71,7 +71,7 @@ while test $# -gt 0; do
++ echo @LDFLAGS@
++ ;;
++ --libs)
++- echo -lgd @LIBS@ @LIBICONV@
+++ echo -lgd @LIBS@
++ ;;
++ --cflags|--includes)
++ echo -I@includedir@
++@@ -84,7 +84,7 @@ while test $# -gt 0; do
++ echo "includedir: $includedir"
++ echo "cflags: -I@includedir@"
++ echo "ldflags: @LDFLAGS@"
++- echo "libs: @LIBS@ @LIBICONV@"
+++ echo "libs: @LIBS@"
++ echo "libdir: $libdir"
++ echo "features: @FEATURES@"
++ ;;
+diff --git a/feeds/packages/libs/libgd/patches/200-uclibc-ceill.patch b/feeds/packages/libs/libgd/patches/200-uclibc-ceill.patch
+new file mode 100644
+index 0000000..8d2aa12
+--- /dev/null
++++ b/feeds/packages/libs/libgd/patches/200-uclibc-ceill.patch
+@@ -0,0 +1,24 @@
++--- a/src/gd_bmp.c
+++++ b/src/gd_bmp.c
++@@ -21,6 +21,7 @@
++ #include <math.h>
++ #include <string.h>
++ #include <stdlib.h>
+++#include <features.h>
++ #include "gd.h"
++ #include "gdhelpers.h"
++ #include "bmp.h"
++@@ -42,6 +43,13 @@ static int bmp_read_rle(gdImagePtr im, g
++
++ #define BMP_DEBUG(s)
++
+++#if defined(__UCLIBC__) && !defined(__UCLIBC_HAS_LONG_DOUBLE_MATH__)
+++long double ceill(long double x)
+++{
+++ return (long double)ceil((double)x);
+++}
+++#endif
+++
++ static int gdBMPPutWord(gdIOCtx *out, int w)
++ {
++ /* Byte order is little-endian */
+diff --git a/feeds/packages/libs/libgee/Makefile b/feeds/packages/libs/libgee/Makefile
+new file mode 100644
+index 0000000..87705e3
+--- /dev/null
++++ b/feeds/packages/libs/libgee/Makefile
+@@ -0,0 +1,69 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libgee
++PKG_VERSION:=0.18.0
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=LGPL-2.1
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=https://download.gnome.org/sources/libgee/0.18/
++PKG_MD5SUM:=29ea6125e653d7e60b49a9a9544abc96
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++TARGET_LDFLAGS+= \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib
++
++define Package/libgee
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+glib2
++ TITLE:=libgee
++ URL:=https://wiki.gnome.org/Libgee
++endef
++
++define Package/libgee/decription
++ Libgee is an utility library providing GObject-based interfaces and classes
++endef
++
++CONFIGURE_ARGS += \
++ --disable-doc
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/gee-0.8/ \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.so* \
++ $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/*.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libgee/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.so* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libgee))
+diff --git a/feeds/packages/libs/libgee/patches/libgee-0.18.0-no-introspection.patch b/feeds/packages/libs/libgee/patches/libgee-0.18.0-no-introspection.patch
+new file mode 100644
+index 0000000..caa6e16
+--- /dev/null
++++ b/feeds/packages/libs/libgee/patches/libgee-0.18.0-no-introspection.patch
+@@ -0,0 +1,101 @@
++diff -u --recursive libgee-0.18.0-vanilla/configure.ac libgee-0.18.0/configure.ac
++--- libgee-0.18.0-vanilla/configure.ac 2015-03-23 23:24:39.000000000 -0400
+++++ libgee-0.18.0/configure.ac 2015-10-18 07:25:39.474698663 -0400
++@@ -64,10 +64,6 @@
++ enable_consistency_check=$enableval, enable_consistency_check=no)
++ AS_IF([test "x$enable_consistency_check" != xno], [VALA_ADD_VALAFLAGS(-D CONSISTENCY_CHECKS)])
++
++-GOBJECT_INTROSPECTION_CHECK([0.9.0])
++-
++-VALA_CHECK([0.25.1])
++-
++ AC_OUTPUT([Makefile
++ gee-0.8.pc
++ benchmark/Makefile
++diff -u --recursive libgee-0.18.0-vanilla/gee/Makefile.am libgee-0.18.0/gee/Makefile.am
++--- libgee-0.18.0-vanilla/gee/Makefile.am 2015-03-16 11:23:57.000000000 -0400
+++++ libgee-0.18.0/gee/Makefile.am 2015-10-18 10:41:49.759314756 -0400
++@@ -146,29 +146,6 @@
++ gee-0.8.vapi \
++ $(NULL)
++
++-if HAVE_INTROSPECTION
++-girdir = @INTROSPECTION_GIRDIR@
++-
++-dist_gir_DATA = \
++- Gee-0.8.gir \
++- $(NULL)
++-
++-typelibdir = @INTROSPECTION_TYPELIBDIR@
++-typelib_DATA = \
++- Gee-0.8.typelib \
++- $(NULL)
++-
++-# Extract dlname from libfolks.la; see bug #658002.
++-# This is what g-ir-scanner does.
++-libgee_dlname = \
++- `$(SED) -nE "s/^dlname='([A-Za-z0-9.+-]+)'/\1/p" libgee-0.8.la`
++-INTROSPECTION_COMPILER_ARGS= \
++- -l $(libgee_dlname)
++-Gee-0.8.gir: libgee_0_8_la_vala.stamp
++-Gee-0.8.typelib: Gee-0.8.gir libgee-0.8.la
++- @INTROSPECTION_COMPILER@ $(INTROSPECTION_COMPILER_ARGS) -o $@ $^
++-endif
++-
++ MOSTLYCLEANFILES = \
++ $(libgee_0_8_la_VALASOURCES:.vala=.c) \
++ libgee_0_8_la_vala.stamp \
++diff -u --recursive libgee-0.18.0-vanilla/gee/Makefile.in libgee-0.18.0/gee/Makefile.in
++--- libgee-0.18.0-vanilla/gee/Makefile.in 2015-03-23 23:25:03.000000000 -0400
+++++ libgee-0.18.0/gee/Makefile.in 2015-10-18 11:02:34.888709559 -0400
++@@ -285,14 +285,6 @@
++ INSTALL_PROGRAM = @INSTALL_PROGRAM@
++ INSTALL_SCRIPT = @INSTALL_SCRIPT@
++ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
++-INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
++-INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
++-INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
++-INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
++-INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
++-INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
++-INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
++-INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
++ LCOV = @LCOV@
++ LD = @LD@
++ LDFLAGS = @LDFLAGS@
++@@ -531,25 +523,6 @@
++ gee-0.8.vapi \
++ $(NULL)
++
++-@HAVE_INTROSPECTION_TRUE@girdir = @INTROSPECTION_GIRDIR@
++-@HAVE_INTROSPECTION_TRUE@dist_gir_DATA = \
++-@HAVE_INTROSPECTION_TRUE@ Gee-0.8.gir \
++-@HAVE_INTROSPECTION_TRUE@ $(NULL)
++-
++-@HAVE_INTROSPECTION_TRUE@typelibdir = @INTROSPECTION_TYPELIBDIR@
++-@HAVE_INTROSPECTION_TRUE@typelib_DATA = \
++-@HAVE_INTROSPECTION_TRUE@ Gee-0.8.typelib \
++-@HAVE_INTROSPECTION_TRUE@ $(NULL)
++-
++-
++-# Extract dlname from libfolks.la; see bug #658002.
++-# This is what g-ir-scanner does.
++-@HAVE_INTROSPECTION_TRUE@libgee_dlname = \
++-@HAVE_INTROSPECTION_TRUE@ `$(SED) -nE "s/^dlname='([A-Za-z0-9.+-]+)'/\1/p" libgee-0.8.la`
++-
++-@HAVE_INTROSPECTION_TRUE@INTROSPECTION_COMPILER_ARGS = \
++-@HAVE_INTROSPECTION_TRUE@ -l $(libgee_dlname)
++-
++ MOSTLYCLEANFILES = \
++ $(libgee_0_8_la_VALASOURCES:.vala=.c) \
++ libgee_0_8_la_vala.stamp \
++@@ -1607,9 +1580,6 @@
++
++ $(libgee_0_8_la_VALASOURCES:.vala=.c): libgee_0_8_la_vala.stamp
++ gee-0.8.vapi gee-internals-0.8.vapi gee.h gee-internals.h: libgee_0_8_la_vala.stamp
++-@HAVE_INTROSPECTION_TRUE@Gee-0.8.gir: libgee_0_8_la_vala.stamp
++-@HAVE_INTROSPECTION_TRUE@Gee-0.8.typelib: Gee-0.8.gir libgee-0.8.la
++-@HAVE_INTROSPECTION_TRUE@ @INTROSPECTION_COMPILER@ $(INTROSPECTION_COMPILER_ARGS) -o $@ $^
++
++ # Tell versions [3.59,3.63) of GNU make to not export all variables.
++ # Otherwise a system limit (for SysV at least) may be exceeded.
+diff --git a/feeds/packages/libs/libgpg-error/Makefile b/feeds/packages/libs/libgpg-error/Makefile
+new file mode 100644
+index 0000000..27e5e09
+--- /dev/null
++++ b/feeds/packages/libs/libgpg-error/Makefile
+@@ -0,0 +1,79 @@
++#
++# Copyright (C) 2005-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libgpg-error
++PKG_VERSION:=1.12
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=ftp://ftp.gnupg.org/gcrypt/libgpg-error
++PKG_MD5SUM:=8f0eb41a344d19ac2aa9bd101dfb9ce6
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libgpg-error
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GnuPG error handling helper library
++ URL:=http://www.gnupg.org/related_software/libgpg-error/
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++endef
++
++define Package/libgpg-error/description
++ An helper library for common error codes and descriptions.
++ This is a library that defines common error values for all GnuPG
++ components. Among these are GPG, GPGSM, GPGME, GPG-Agent, libgcrypt,
++ Libksba, DirMngr, Pinentry, SmartCard Daemon and possibly more in the
++ future.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-rpath
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(2)/bin $(1)/usr/bin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/gpg-error-config \
++ $(2)/bin/
++ $(SED) \
++ 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' \
++ $(2)/bin/gpg-error-config
++ ln -sf $(STAGING_DIR)/host/bin/gpg-error-config $(1)/usr/bin/gpg-error-config
++
++ $(INSTALL_DIR) $(1)/usr/include
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/include/gpg-error.h \
++ $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libgpg-error.{la,a,so*} \
++ $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/share/aclocal
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/share/aclocal/gpg-error.m4 \
++ $(1)/usr/share/aclocal/
++endef
++
++define Package/libgpg-error/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libgpg-error.so.* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libgpg-error))
+diff --git a/feeds/packages/libs/libhttp-parser/Makefile b/feeds/packages/libs/libhttp-parser/Makefile
+new file mode 100644
+index 0000000..fe28b4c
+--- /dev/null
++++ b/feeds/packages/libs/libhttp-parser/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libhttp-parser
++PKG_VERSION:=2.3.0
++PKG_RELEASE=1
++PKG_MAINTAINER:=Ramanathan Sivagurunathan <ramzthecoder@gmail.com>
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=LICENSE-MIT
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=git://github.com/joyent/http-parser.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=56f7ad0e2e5a80f79d214015c91e1f17d11d109f
++
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libhttp-parser
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A library to parse http request and response
++ URL:=https://github.com/joyent/http-parser
++endef
++
++define Package/libhttp-parser/description
++ A parser for HTTP messages written in C. It parses both requests and responses.
++ The parser is designed to be used in performance HTTP applications.
++ It does not make any syscalls nor allocations, it does not buffer data,
++ it can be interrupted at anytime. Depending on your architecture,
++ it only requires about 40 bytes of data per message stream
++ (in a web server that is per connection).
++endef
++
++define Build/Compile
++ $(call Build/Compile/Default, library)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/http_parser.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/libhttp_parser.so.* $(1)/usr/lib/
++ ( cd $(1)/usr/lib ; ln -s libhttp_parser.so.* libhttp_parser.so )
++endef
++
++define Package/libhttp-parser/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/libhttp_parser.so.* $(1)/usr/lib/
++ ( cd $(1)/usr/lib ; ln -s libhttp_parser.so.* libhttp_parser.so )
++endef
++
++$(eval $(call BuildPackage,libhttp-parser))
+diff --git a/feeds/packages/libs/libical/Makefile b/feeds/packages/libs/libical/Makefile
+new file mode 100644
+index 0000000..4af4c85
+--- /dev/null
++++ b/feeds/packages/libs/libical/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libical
++PKG_VERSION:=1.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/freeassociation
++PKG_MD5SUM:=
++
++PKG_LICENSE:=LGPL-2.1 MPL-1.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=libtool
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libical
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=iCal (RFC 2445) library
++ URL:=http://www.nabber.org/projects/ical/
++ DEPENDS:=+libpthread
++endef
++
++define Package/libical/description
++ This package provides a a read/write library of classes for object oriented
++ languages (Initial goals of PHP and Python) that implement and enforce the iCal
++ standard (RFC 2445).
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-cxx \
++ --disable-java \
++ --disable-python \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/{ical.h,libical} $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libical{,ss,vcal}.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libical.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libical/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libical{,ss,vcal}.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libical))
+diff --git a/feeds/packages/libs/libid3tag/Makefile b/feeds/packages/libs/libid3tag/Makefile
+new file mode 100644
+index 0000000..127bc17
+--- /dev/null
++++ b/feeds/packages/libs/libid3tag/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libid3tag
++PKG_VERSION:=0.15.1b
++PKG_RELEASE:=4
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/mad
++PKG_MD5SUM:=e5808ad997ba32c498803822078748c3
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=GPL-2
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libid3tag
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+zlib
++ TITLE:=An ID3 tag manipulation library
++ URL:=http://mad.sourceforge.net/
++endef
++
++define Package/libid3tag/description
++ libid3tag is a library for reading and (eventually) writing ID3 tags, both
++ ID3v1 and the various versions of ID3v2.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_VARS += CC="$(TARGET_CC) $(TARGET_CFLAGS)"
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --enable-shared \
++ --enable-static \
++ --disable-debugging \
++ --disable-profiling \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/id3tag.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libid3tag.so* $(1)/usr/lib/
++endef
++
++define Package/libid3tag/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libid3tag.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libid3tag))
+diff --git a/feeds/packages/libs/libidn/Makefile b/feeds/packages/libs/libidn/Makefile
+new file mode 100644
+index 0000000..8bfe2a8
+--- /dev/null
++++ b/feeds/packages/libs/libidn/Makefile
+@@ -0,0 +1,95 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libidn
++PKG_VERSION:=1.32
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@GNU/libidn
++PKG_MD5SUM:=4dd8356ba577287ea7076bfa1554b534
++
++PKG_LICENSE:=GPL-2.0+ GPL-3.0+ LGPL-2.1+ LGPL-3.0+ Apache-2.0
++PKG_LICENSE_FILES:=COPYING COPYINGv2 COPYINGv3 COPYING.LESSERv2 COPYING.LESSERv3 java/LICENSE-2.0.txt
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=GNUmakefile aclocal.m4
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/idn/Default
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://www.gnu.org/software/libidn/
++ MAINTAINER:=Marcel Denia <naoir@gmx.net>
++endef
++
++define Package/idn/Default/description
++ GNU Libidn is a fully documented implementation of the Stringprep,
++ Punycode and IDNA specifications. Libidn's purpose is to encode and
++ decode internationalized domain names.
++endef
++
++define Package/idn
++ $(call Package/idn/Default)
++ SUBMENU:=IP Addresses and Names
++ TITLE:=GNU IDN (Internationalized Domain Name) tool
++ DEPENDS:=+libidn
++endef
++
++define Package/idn/description
++$(call Package/idn/Default/description)
++
++ Command line tool using libidn
++
++endef
++
++define Package/libidn
++ $(call Package/idn/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Stringprep, Punycode and IDNA implementation
++endef
++
++define Package/libidn/description
++$(call Package/idn/Default/description)
++
++ Library only package
++
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++MAKE_FLAGS += \
++ CC="$(TARGET_CC)" \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libidn.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/idn/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++define Package/libidn/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libidn.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,idn))
++$(eval $(call BuildPackage,libidn))
+diff --git a/feeds/packages/libs/libidn/patches/002-disable-po-docs-examples.patch b/feeds/packages/libs/libidn/patches/002-disable-po-docs-examples.patch
+new file mode 100644
+index 0000000..e99f2a1
+--- /dev/null
++++ b/feeds/packages/libs/libidn/patches/002-disable-po-docs-examples.patch
+@@ -0,0 +1,22 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -16,7 +16,7 @@
++ # You should have received a copy of the GNU General Public License
++ # along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++-SUBDIRS = gl lib/gl lib po src doc gltests lib/gltests tests examples \
+++SUBDIRS = gl lib/gl lib src \
++ java csharp
++
++ EXTRA_DIST = cfg.mk maint.mk .clcopying
++--- a/configure.ac
+++++ b/configure.ac
++@@ -48,8 +48,6 @@ AC_PROG_LIBTOOL
++ # Checks for programs.
++ AM_MISSING_PROG(PERL, perl, $missing_dir)
++ AM_MISSING_PROG(HELP2MAN, help2man, $missing_dir)
++-AM_GNU_GETTEXT(external)
++-AM_GNU_GETTEXT_VERSION(0.19.3)
++ AM_ICONV
++ AM_PATH_LISPDIR
++
+diff --git a/feeds/packages/libs/libidn/patches/010-fix-idn-error-usage.patch b/feeds/packages/libs/libidn/patches/010-fix-idn-error-usage.patch
+new file mode 100644
+index 0000000..9b7ab2c
+--- /dev/null
++++ b/feeds/packages/libs/libidn/patches/010-fix-idn-error-usage.patch
+@@ -0,0 +1,119 @@
++--- a/src/idn.c
+++++ b/src/idn.c
++@@ -169,7 +169,7 @@ main (int argc, char *argv[])
++ (args_info.idna_to_unicode_given ? 1 : 0) +
++ (args_info.nfkc_given ? 1 : 0) != 1)
++ {
++- error (0, 0, _("only one of -s, -e, -d, -a, -u or -n can be specified"));
+++ error (0, 0, "%s", _("only one of -s, -e, -d, -a, -u or -n can be specified"));
++ usage (EXIT_FAILURE);
++ }
++
++@@ -184,7 +184,7 @@ main (int argc, char *argv[])
++ if (!args_info.quiet_given
++ && args_info.inputs_num == 0
++ && isatty (fileno (stdin)))
++- fprintf (stderr, _("Type each input string on a line by itself, "
+++ fprintf (stderr, "%s", _("Type each input string on a line by itself, "
++ "terminated by a newline character.\n"));
++
++ do
++@@ -199,7 +199,7 @@ main (int argc, char *argv[])
++ if (feof (stdin))
++ break;
++
++- error (EXIT_FAILURE, errno, _("input error"));
+++ error (EXIT_FAILURE, errno, "%s", _("input error"));
++ }
++
++ if (readbuf[strlen (readbuf) - 1] == '\n')
++@@ -216,7 +216,7 @@ main (int argc, char *argv[])
++ if (!q)
++ {
++ free (p);
++- error (EXIT_FAILURE, 0,
+++ error (EXIT_FAILURE, 0, "%s",
++ _("could not convert from UTF-8 to UCS-4"));
++ }
++
++@@ -241,7 +241,7 @@ main (int argc, char *argv[])
++ if (!q)
++ {
++ free (r);
++- error (EXIT_FAILURE, 0,
+++ error (EXIT_FAILURE, 0, "%s",
++ _("could not convert from UTF-8 to UCS-4"));
++ }
++
++@@ -277,7 +277,7 @@ main (int argc, char *argv[])
++ q = stringprep_utf8_to_ucs4 (p, -1, &len);
++ free (p);
++ if (!q)
++- error (EXIT_FAILURE, 0,
+++ error (EXIT_FAILURE, 0, "%s",
++ _("could not convert from UTF-8 to UCS-4"));
++
++ if (args_info.debug_given)
++@@ -336,7 +336,7 @@ main (int argc, char *argv[])
++ r = stringprep_ucs4_to_utf8 (q, -1, NULL, NULL);
++ free (q);
++ if (!r)
++- error (EXIT_FAILURE, 0,
+++ error (EXIT_FAILURE, 0, "%s",
++ _("could not convert from UCS-4 to UTF-8"));
++
++ p = stringprep_utf8_to_locale (r);
++@@ -360,7 +360,7 @@ main (int argc, char *argv[])
++ q = stringprep_utf8_to_ucs4 (p, -1, NULL);
++ free (p);
++ if (!q)
++- error (EXIT_FAILURE, 0,
+++ error (EXIT_FAILURE, 0, "%s",
++ _("could not convert from UCS-4 to UTF-8"));
++
++ if (args_info.debug_given)
++@@ -438,7 +438,7 @@ main (int argc, char *argv[])
++ if (!q)
++ {
++ free (p);
++- error (EXIT_FAILURE, 0,
+++ error (EXIT_FAILURE, 0, "%s",
++ _("could not convert from UCS-4 to UTF-8"));
++ }
++
++@@ -494,7 +494,7 @@ main (int argc, char *argv[])
++ r = stringprep_ucs4_to_utf8 (q, -1, NULL, NULL);
++ free (q);
++ if (!r)
++- error (EXIT_FAILURE, 0,
+++ error (EXIT_FAILURE, 0, "%s",
++ _("could not convert from UTF-8 to UCS-4"));
++
++ p = stringprep_utf8_to_locale (r);
++@@ -523,7 +523,7 @@ main (int argc, char *argv[])
++ if (!q)
++ {
++ free (p);
++- error (EXIT_FAILURE, 0,
+++ error (EXIT_FAILURE, 0, "%s",
++ _("could not convert from UTF-8 to UCS-4"));
++ }
++
++@@ -537,7 +537,7 @@ main (int argc, char *argv[])
++ r = stringprep_utf8_nfkc_normalize (p, -1);
++ free (p);
++ if (!r)
++- error (EXIT_FAILURE, 0, _("could not do NFKC normalization"));
+++ error (EXIT_FAILURE, 0, "%s", _("could not do NFKC normalization"));
++
++ if (args_info.debug_given)
++ {
++@@ -547,7 +547,7 @@ main (int argc, char *argv[])
++ if (!q)
++ {
++ free (r);
++- error (EXIT_FAILURE, 0,
+++ error (EXIT_FAILURE, 0, "%s",
++ _("could not convert from UTF-8 to UCS-4"));
++ }
++
+diff --git a/feeds/packages/libs/libimobiledevice/Makefile b/feeds/packages/libs/libimobiledevice/Makefile
+new file mode 100644
+index 0000000..304cf27
+--- /dev/null
++++ b/feeds/packages/libs/libimobiledevice/Makefile
+@@ -0,0 +1,96 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libimobiledevice
++PKG_VERSION:=1.2.0
++PKG_RELEASE:=2
++
++PKG_MAINTAINER:=Lukasz Baj <l.baj@radytek.com>
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING.LESSER
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/libimobiledevice/libimobiledevice.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=53eb963f8e6d607cca6b50381c10820a5e8357f4
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++$(call include_mk, python-package.mk)
++
++define Package/libimobiledevice/Default
++ TITLE:=A library that talks to Apple devices.
++ URL:=http://www.libimobiledevice.org/
++endef
++
++define Package/libimobiledevice/Default/description
++ libimobiledevice is a software library that talks the protocols to support
++ iPhone®, iPod Touch®, iPad® and Apple TV® devices.
++endef
++
++define Package/libimobiledevice
++ $(call Package/libimobiledevice/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=$(ICONV_DEPENDS) +libplist +libusbmuxd +libopenssl
++endef
++
++define Package/libimobiledevice/description
++ $(call Package/libimobiledevice/Default/description)
++endef
++
++define Package/libimobiledevice-utils
++ $(call Package/libimobiledevice/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libimobiledevice
++endef
++
++define Package/libimobiledevice-utils/description
++ $(call Package/libimobiledevice/Default/description)
++ This package contains the libimobiledevice utilities.
++endef
++
++CONFIGURE_VARS += \
++ libusbmuxd_CFLAGS="-I$(STAGING_DIR)/usr/include" \
++ libusbmuxd_LIBS="-L$(STAGING_DIR)/usr/lib -lusbmuxd" \
++ openssl_CFLAGS=" " \
++ openssl_LIBS="-L$(STAGING_DIR)/usr/lib -lssl -lcrypto"
++
++CONFIGURE_ARGS += \
++ --without-cython \
++ --disable-largefile
++
++TARGET_LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libimobiledevice $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libimobiledevice.{a,la,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libimobiledevice-*.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libimobiledevice/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libimobiledevice.so.* $(1)/usr/lib/
++endef
++
++define Package/libimobiledevice-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/idevice* $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libimobiledevice))
++$(eval $(call BuildPackage,libimobiledevice-utils))
+diff --git a/feeds/packages/libs/libinput/Makefile b/feeds/packages/libs/libinput/Makefile
+new file mode 100644
+index 0000000..6d9adec
+--- /dev/null
++++ b/feeds/packages/libs/libinput/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libinput
++PKG_VERSION:=1.0.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.freedesktop.org/software/libinput/
++PKG_MD5SUM:=f390e592aa09f77dabceabeb2ddd4419
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS+= -std=gnu99
++
++define Package/libinput
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=a library to handle input devices
++ URL:=http://freedesktop.org/wiki/Software/libinput/
++ DEPENDS:=+libevdev +mtdev +udev
++endef
++
++define Package/libinput/description
++ libinput is a library to handle input devices in Wayland compositors
++ and to provide a generic X.Org input driver. It provides device
++ detection, device handling, input device event processing and
++ abstraction so minimize the amount of custom input code compositors
++ need to provide the common set of functionality that users expect.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{la,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libinput/install
++ $(INSTALL_DIR) $(1)/usr/lib/udev
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/udev/* $(1)/usr/lib/udev
++endef
++
++$(eval $(call BuildPackage,libinput))
+diff --git a/feeds/packages/libs/libinput/patches/001-no-locale.patch b/feeds/packages/libs/libinput/patches/001-no-locale.patch
+new file mode 100644
+index 0000000..8f5c5a1
+--- /dev/null
++++ b/feeds/packages/libs/libinput/patches/001-no-locale.patch
+@@ -0,0 +1,22 @@
++--- a/src/libinput-util.c
+++++ b/src/libinput-util.c
++@@ -216,18 +216,10 @@ parse_mouse_wheel_click_angle_property(c
++ double
++ parse_trackpoint_accel_property(const char *prop)
++ {
++- locale_t c_locale;
++ double accel;
++ char *endp;
++
++- /* Create a "C" locale to force strtod to use '.' as separator */
++- c_locale = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0);
++- if (c_locale == (locale_t)0)
++- return 0.0;
++-
++- accel = strtod_l(prop, &endp, c_locale);
++-
++- freelocale(c_locale);
+++ accel = strtod(prop, &endp);
++
++ if (*endp != '\0')
++ return 0.0;
+diff --git a/feeds/packages/libs/libjpeg/Makefile b/feeds/packages/libs/libjpeg/Makefile
+new file mode 100644
+index 0000000..8aebfdd
+--- /dev/null
++++ b/feeds/packages/libs/libjpeg/Makefile
+@@ -0,0 +1,90 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=jpeg
++PKG_VERSION:=9a
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)src.v$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.ijg.org/files
++PKG_MD5SUM:=3353992aecaee1805ef4109aadd433e7
++
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++PKG_LICENSE:=IJG
++PKG_LICENSE_FILES:=README
++
++PKG_BUILD_PARALLEL:=1
++PKG_BUILD_DEPENDS:=libltdl
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/jpeg/Default
++ TITLE:=The Independent JPEG Group's JPEG
++ URL:=http://www.ijg.org/
++endef
++
++define Package/libjpeg
++ $(call Package/jpeg/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= runtime library
++endef
++
++define Package/jpeg-tools
++ $(call Package/jpeg/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libjpeg
++ TITLE+= manipulation tools
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++HOST_CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++define Build/Compile
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
++ LIBTOOL="./libtool --tag=CC" \
++ prefix="$(PKG_INSTALL_DIR)/usr" \
++ exec_prefix="$(PKG_INSTALL_DIR)/usr" \
++ all
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/jpeglib.h $(1)/usr/include/
++ $(CP) $(PKG_BUILD_DIR)/jpegint.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/j{config,error,morecfg}.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libjpeg.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/libjpeg/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libjpeg.so.* $(1)/usr/lib/
++endef
++
++define Package/jpeg-tools/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/*jpeg* $(1)/usr/bin/
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,libjpeg))
++$(eval $(call BuildPackage,jpeg-tools))
+diff --git a/feeds/packages/libs/liblo/Makefile b/feeds/packages/libs/liblo/Makefile
+new file mode 100644
+index 0000000..4e8fa20
+--- /dev/null
++++ b/feeds/packages/libs/liblo/Makefile
+@@ -0,0 +1,71 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=liblo
++PKG_VERSION:=0.28
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/liblo
++PKG_MD5SUM:=e2a4391a08b49bb316c03e2034e06fa2
++
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/liblo/Default
++ SUBMENU:=Sound
++ TITLE:=Lightweight Open Sound Control (OSC)
++ URL:=http://liblo.sourceforge.net/
++endef
++
++define Package/liblo
++$(call Package/liblo/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= library
++ DEPENDS:= +libpthread
++endef
++
++define Package/liblo-utils
++$(call Package/liblo/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= utilities
++ DEPENDS:= +liblo
++endef
++
++TARGET_CFLAGS += \
++ -Wno-error=maybe-uninitialized \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/lo $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblo.* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/liblo.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/liblo/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblo.so.* $(1)/usr/lib/
++endef
++
++define Package/liblo-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/osc{dump,send} $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,liblo))
++$(eval $(call BuildPackage,liblo-utils))
+diff --git a/feeds/packages/libs/liblo/patches/001-fix-musl-include.patch b/feeds/packages/libs/liblo/patches/001-fix-musl-include.patch
+new file mode 100644
+index 0000000..f974bd3
+--- /dev/null
++++ b/feeds/packages/libs/liblo/patches/001-fix-musl-include.patch
+@@ -0,0 +1,11 @@
++--- a/src/server.c
+++++ b/src/server.c
++@@ -48,7 +48,7 @@
++ #include <netdb.h>
++ #include <sys/socket.h>
++ #ifdef HAVE_POLL
++-#include <sys/poll.h>
+++#include <poll.h>
++ #endif
++ #include <sys/un.h>
++ #include <arpa/inet.h>
+diff --git a/feeds/packages/libs/liblz4/Makefile b/feeds/packages/libs/liblz4/Makefile
+new file mode 100644
+index 0000000..fd173e5
+--- /dev/null
++++ b/feeds/packages/libs/liblz4/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++# Although liblz4 exports a major.minor.patch version, it isn't always
++# incremented for new releases, so use the release tag instead.
++PKG_NAME:=liblz4
++PKG_VERSION:=r131
++PKG_RELEASE:=1
++
++PKG_LICENSE:=BSD-2-Clause
++PKG_MAINTAINER:=Darik Horn <dajhorn@vanadac.com>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://github.com/Cyan4973/lz4.git
++PKG_SOURCE_VERSION:=$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/liblz4
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Extremely fast compression
++ URL:=http://www.lz4.org/
++endef
++
++define Package/liblz4/description
++ LZ4 is a compression codec that features a very fast encoder and an
++ even faster decoder. This package provides the liblz4 shared library.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/Compile
++ $(MAKE) -C "$(PKG_BUILD_DIR)/lib" $(MAKE_INSTALL_FLAGS) \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ PREFIX="$(CONFIGURE_PREFIX)" \
++ install
++endef
++
++define Build/InstallDev
++ $(CP) $(PKG_INSTALL_DIR)/* $(1)/
++endef
++
++define Package/liblz4/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblz4.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,liblz4))
+diff --git a/feeds/packages/libs/libmad/Makefile b/feeds/packages/libs/libmad/Makefile
+new file mode 100644
+index 0000000..e5289ce
+--- /dev/null
++++ b/feeds/packages/libs/libmad/Makefile
+@@ -0,0 +1,79 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libmad
++PKG_VERSION:=0.15.1b
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/mad \
++ ftp://ftp.mars.org/pub/mpeg/
++PKG_MD5SUM:=1be543bc30c56fb6bea1d7bf6a64e66c
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++FPM:=default
++ifeq ($(ARCH),armeb)
++ FPM:=arm
++endif
++ifeq ($(ARCH),i386)
++ FPM:=intel
++endif
++ifeq ($(ARCH),mipsel)
++ FPM:=mips
++endif
++
++define Package/libmad
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=An high-quality MPEG audio decoding library
++ URL:=http://www.underbit.com/products/mad/
++ DEPENDS:=@BUILD_PATENTED
++endef
++
++define Package/libmad/description
++ MAD is a high-quality MPEG audio decoder. It currently supports
++ MPEG-1 and the MPEG-2 extension to lower sampling frequencies,
++ as well as the de facto MPEG 2.5 format. All three audio layers -
++ Layer I, Layer II, and Layer III (i.e. MP3) - are fully implemented.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS+= \
++ --enable-shared \
++ --enable-static \
++ --enable-fpm="$(FPM)" \
++ --disable-debugging \
++ --enable-speed \
++
++MAKE_FLAGS+= \
++ CFLAGS="$(TARGET_CFLAGS)" \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/mad.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmad.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/libmad/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmad.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libmad))
+diff --git a/feeds/packages/libs/libmad/patches/001-mips_removal_h_constraint.patch b/feeds/packages/libs/libmad/patches/001-mips_removal_h_constraint.patch
+new file mode 100644
+index 0000000..b65555e
+--- /dev/null
++++ b/feeds/packages/libs/libmad/patches/001-mips_removal_h_constraint.patch
+@@ -0,0 +1,70 @@
++diff -ur libmad-0.15.1b-orig/fixed.h libmad-0.15.1b/fixed.h
++--- libmad-0.15.1b-orig/fixed.h 2004-02-17 12:32:03.000000000 +1030
+++++ libmad-0.15.1b/fixed.h 2009-08-05 10:46:30.000000000 +0930
++@@ -299,6 +299,23 @@
++
++ # elif defined(FPM_MIPS)
++
+++/* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */
+++#if defined (__GNUC__) && defined (__GNUC_MINOR__)
+++#define __GNUC_PREREQ(maj, min) \
+++ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+++#else
+++#define __GNUC_PREREQ(maj, min) 0
+++#endif
+++
+++#if __GNUC_PREREQ(4,4)
+++ typedef unsigned int u64_di_t __attribute__ ((mode (DI)));
+++# define MAD_F_MLX(hi, lo, x, y) \
+++ do { \
+++ u64_di_t __ll = (u64_di_t) (x) * (y); \
+++ hi = __ll >> 32; \
+++ lo = __ll; \
+++ } while (0)
+++#else
++ /*
++ * This MIPS version is fast and accurate; the disposition of the least
++ * significant bit depends on OPT_ACCURACY via mad_f_scale64().
++@@ -328,6 +345,7 @@
++ : "%r" ((x) >> 12), "r" ((y) >> 16))
++ # define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo))
++ # endif
+++#endif /* __GNU_PREREQ(4,4) */
++
++ # if defined(OPT_SPEED)
++ # define mad_f_scale64(hi, lo) \
++diff -ur libmad-0.15.1b-orig/mad.h libmad-0.15.1b/mad.h
++--- libmad-0.15.1b-orig/mad.h 2004-02-17 13:25:44.000000000 +1030
+++++ libmad-0.15.1b/mad.h 2009-08-05 10:42:40.000000000 +0930
++@@ -344,6 +344,23 @@
++
++ # elif defined(FPM_MIPS)
++
+++/* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */
+++#if defined (__GNUC__) && defined (__GNUC_MINOR__)
+++#define __GNUC_PREREQ(maj, min) \
+++ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+++#else
+++#define __GNUC_PREREQ(maj, min) 0
+++#endif
+++
+++#if __GNUC_PREREQ(4,4)
+++ typedef unsigned int u64_di_t __attribute__ ((mode (DI)));
+++# define MAD_F_MLX(hi, lo, x, y) \
+++ do { \
+++ u64_di_t __ll = (u64_di_t) (x) * (y); \
+++ hi = __ll >> 32; \
+++ lo = __ll; \
+++ } while (0)
+++#else
++ /*
++ * This MIPS version is fast and accurate; the disposition of the least
++ * significant bit depends on OPT_ACCURACY via mad_f_scale64().
++@@ -373,6 +390,7 @@
++ : "%r" ((x) >> 12), "r" ((y) >> 16))
++ # define MAD_F_MLZ(hi, lo) ((mad_fixed_t) (lo))
++ # endif
+++#endif /* __GNU_PREREQ(4,4) */
++
++ # if defined(OPT_SPEED)
++ # define mad_f_scale64(hi, lo) \
+diff --git a/feeds/packages/libs/libmcrypt/Makefile b/feeds/packages/libs/libmcrypt/Makefile
+new file mode 100644
+index 0000000..f7f3827
+--- /dev/null
++++ b/feeds/packages/libs/libmcrypt/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2006-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libmcrypt
++PKG_VERSION:=2.5.8
++PKG_RELEASE:=2
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=LGPLv2.1
++PKG_LICENSE_FILES:=COPYING.LIB
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/mcrypt
++PKG_MD5SUM:=c4f491dd411a09e9de3b8702ea6f73eb
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS += $(FPIC)
++
++define Package/libmcrypt
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Cryptographic library
++ URL:=http://mcrypt.sourceforge.net/
++endef
++
++define Package/libmcrypt/description
++ libmcrypt is a cryptographic library that conveniently brings
++ together a variety of ciphers for convenient use.
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --enable-shared \
++ --enable-static \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmcrypt.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/libmcrypt-config $(1)/usr/bin/
++ $(SED) 's,-I$$$${prefix}/include,,g' $(1)/usr/bin/libmcrypt-config
++ $(SED) 's,-L$$$${exec_prefix}/lib,,g' $(1)/usr/bin/libmcrypt-config
++endef
++
++define Package/libmcrypt/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmcrypt.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libmcrypt))
+diff --git a/feeds/packages/libs/libmicrohttpd/Makefile b/feeds/packages/libs/libmicrohttpd/Makefile
+new file mode 100644
+index 0000000..9c9dcba
+--- /dev/null
++++ b/feeds/packages/libs/libmicrohttpd/Makefile
+@@ -0,0 +1,61 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libmicrohttpd
++PKG_VERSION:=0.9.42
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@GNU/libmicrohttpd
++PKG_MD5SUM:=3b9cf0b67fc8ebc9e69f53c6bc84a88d
++
++PKG_MAINTAINER:=Martijn Zilverschoon <martijn@friedzombie.com>
++
++PKG_LICENSE:=LGPL-2.1
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libmicrohttpd
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GNU libmicrohttpd is a library that runs an HTTP server.
++ URL:=http://www.gnu.org/software/libmicrohttpd/
++ DEPENDS:=+libpthread +libgcrypt +libgnutls +libgpg-error
++endef
++
++define Package/libmicrohttpd/description
++ GNU libmicrohttpd is a small C library that is supposed to make it easy
++ to run an HTTP server as part of another application.
++endef
++
++CONFIGURE_ARGS += \
++ --enable-https \
++ --with-gnutls \
++ --disable-curl \
++ --disable-spdy \
++ --without-openssl
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{so*,a,la} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libmicrohttpd/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libmicrohttpd))
+diff --git a/feeds/packages/libs/libmicrohttpd/patches/001-bump-to-r35864.patch b/feeds/packages/libs/libmicrohttpd/patches/001-bump-to-r35864.patch
+new file mode 100644
+index 0000000..6558a96
+--- /dev/null
++++ b/feeds/packages/libs/libmicrohttpd/patches/001-bump-to-r35864.patch
+@@ -0,0 +1,754 @@
++--- a/ChangeLog
+++++ b/ChangeLog
++@@ -1,3 +1,14 @@
+++Thu Jun 4 13:37:05 CEST 2015
+++ Fixing memory leak in digest authentication. -AW
+++
+++Wed Jun 03 21:23:47 CEST 2015
+++ Add deprecation compiler messages for deprecated functions
+++ and macros. -EG
+++
+++Fri May 29 12:23:01 CEST 2015
+++ Fixing digest authentication when used in combination
+++ with escaped characters in URLs. -CG/AW
+++
++ Wed May 13 11:49:09 CEST 2015
++ Releasing libmicrohttpd 0.9.42. -CG
++
++--- a/src/microhttpd/response.c
+++++ b/src/microhttpd/response.c
++@@ -24,6 +24,8 @@
++ * @author Christian Grothoff
++ */
++
+++#define MHD_NO_DEPRECATION 1
+++
++ #include "internal.h"
++ #include "response.h"
++
++--- a/src/microhttpd/digestauth.c
+++++ b/src/microhttpd/digestauth.c
++@@ -1,6 +1,6 @@
++ /*
++ This file is part of libmicrohttpd
++- Copyright (C) 2010, 2011, 2012 Daniel Pittman and Christian Grothoff
+++ Copyright (C) 2010, 2011, 2012, 2015 Daniel Pittman and Christian Grothoff
++
++ This library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++@@ -472,8 +472,8 @@ test_header (struct MHD_Connection *conn
++ *
++ * @param connection connections with headers to compare against
++ * @param args argument URI string (after "?" in URI)
++- * @return MHD_YES if the arguments match,
++- * MHD_NO if not
+++ * @return #MHD_YES if the arguments match,
+++ * #MHD_NO if not
++ */
++ static int
++ check_argument_match (struct MHD_Connection *connection,
++@@ -508,7 +508,10 @@ check_argument_match (struct MHD_Connect
++ connection,
++ argp);
++ if (MHD_YES != test_header (connection, argp, NULL))
++- return MHD_NO;
+++ {
+++ free(argb);
+++ return MHD_NO;
+++ }
++ num_headers++;
++ break;
++ }
++@@ -527,10 +530,16 @@ check_argument_match (struct MHD_Connect
++ connection,
++ equals);
++ if (! test_header (connection, argp, equals))
++- return MHD_NO;
+++ {
+++ free(argb);
+++ return MHD_NO;
+++ }
+++
++ num_headers++;
++ argp = amper;
++ }
+++
+++ free(argb);
++
++ /* also check that the number of headers matches */
++ for (pos = connection->headers_received; NULL != pos; pos = pos->next)
++@@ -632,10 +641,83 @@ MHD_digest_auth_check (struct MHD_Connec
++ header value. */
++ return MHD_NO;
++ }
+++ /* 8 = 4 hexadecimal numbers for the timestamp */
+++ nonce_time = strtoul (nonce + len - 8, (char **)NULL, 16);
+++ t = (uint32_t) MHD_monotonic_time();
+++ /*
+++ * First level vetting for the nonce validity: if the timestamp
+++ * attached to the nonce exceeds `nonce_timeout', then the nonce is
+++ * invalid.
+++ */
+++ if ( (t > nonce_time + nonce_timeout) ||
+++ (nonce_time + nonce_timeout < nonce_time) )
+++ {
+++ /* too old */
+++ return MHD_INVALID_NONCE;
+++ }
+++
+++ calculate_nonce (nonce_time,
+++ connection->method,
+++ connection->daemon->digest_auth_random,
+++ connection->daemon->digest_auth_rand_size,
+++ connection->url,
+++ realm,
+++ noncehashexp);
+++ /*
+++ * Second level vetting for the nonce validity
+++ * if the timestamp attached to the nonce is valid
+++ * and possibly fabricated (in case of an attack)
+++ * the attacker must also know the random seed to be
+++ * able to generate a "sane" nonce, which if he does
+++ * not, the nonce fabrication process going to be
+++ * very hard to achieve.
+++ */
+++
+++ if (0 != strcmp (nonce, noncehashexp))
+++ {
+++ return MHD_INVALID_NONCE;
+++ }
+++ if ( (0 == lookup_sub_value (cnonce,
+++ sizeof (cnonce),
+++ header, "cnonce")) ||
+++ (0 == lookup_sub_value (qop, sizeof (qop), header, "qop")) ||
+++ ( (0 != strcmp (qop, "auth")) &&
+++ (0 != strcmp (qop, "")) ) ||
+++ (0 == lookup_sub_value (nc, sizeof (nc), header, "nc")) ||
+++ (0 == lookup_sub_value (response, sizeof (response), header, "response")) )
+++ {
+++#if HAVE_MESSAGES
+++ MHD_DLOG (connection->daemon,
+++ "Authentication failed, invalid format.\n");
+++#endif
+++ return MHD_NO;
+++ }
+++ nci = strtoul (nc, &end, 16);
+++ if ( ('\0' != *end) ||
+++ ( (LONG_MAX == nci) &&
+++ (ERANGE == errno) ) )
+++ {
+++#if HAVE_MESSAGES
+++ MHD_DLOG (connection->daemon,
+++ "Authentication failed, invalid format.\n");
+++#endif
+++ return MHD_NO; /* invalid nonce format */
+++ }
+++ /*
+++ * Checking if that combination of nonce and nc is sound
+++ * and not a replay attack attempt. Also adds the nonce
+++ * to the nonce-nc map if it does not exist there.
+++ */
+++
+++ if (MHD_YES != check_nonce_nc (connection, nonce, nci))
+++ {
+++ return MHD_NO;
+++ }
+++
++ {
++ char *uri;
++-
++- uri = malloc(left + 1);
+++
+++ uri = malloc (left + 1);
++ if (NULL == uri)
++ {
++ #if HAVE_MESSAGES
++@@ -648,24 +730,31 @@ MHD_digest_auth_check (struct MHD_Connec
++ left + 1,
++ header, "uri"))
++ {
++- free(uri);
+++ free (uri);
++ return MHD_NO;
++ }
++
++- /* 8 = 4 hexadecimal numbers for the timestamp */
++- nonce_time = strtoul (nonce + len - 8, (char **)NULL, 16);
++- t = (uint32_t) MHD_monotonic_time();
++- /*
++- * First level vetting for the nonce validity: if the timestamp
++- * attached to the nonce exceeds `nonce_timeout', then the nonce is
++- * invalid.
++- */
++- if ( (t > nonce_time + nonce_timeout) ||
++- (nonce_time + nonce_timeout < nonce_time) )
++- {
++- free(uri);
++- return MHD_INVALID_NONCE;
++- }
+++ digest_calc_ha1("md5",
+++ username,
+++ realm,
+++ password,
+++ nonce,
+++ cnonce,
+++ ha1);
+++ digest_calc_response (ha1,
+++ nonce,
+++ nc,
+++ cnonce,
+++ qop,
+++ connection->method,
+++ uri,
+++ hentity,
+++ respexp);
+++
+++ /* Need to unescape URI before comparing with connection->url */
+++ connection->daemon->unescape_callback (connection->daemon->unescape_callback_cls,
+++ connection,
+++ uri);
++ if (0 != strncmp (uri,
++ connection->url,
++ strlen (connection->url)))
++@@ -674,9 +763,10 @@ MHD_digest_auth_check (struct MHD_Connec
++ MHD_DLOG (connection->daemon,
++ "Authentication failed, URI does not match.\n");
++ #endif
++- free(uri);
+++ free (uri);
++ return MHD_NO;
++ }
+++
++ {
++ const char *args = strchr (uri, '?');
++
++@@ -692,89 +782,11 @@ MHD_digest_auth_check (struct MHD_Connec
++ MHD_DLOG (connection->daemon,
++ "Authentication failed, arguments do not match.\n");
++ #endif
++- free(uri);
+++ free (uri);
++ return MHD_NO;
++ }
++ }
++- calculate_nonce (nonce_time,
++- connection->method,
++- connection->daemon->digest_auth_random,
++- connection->daemon->digest_auth_rand_size,
++- connection->url,
++- realm,
++- noncehashexp);
++- /*
++- * Second level vetting for the nonce validity
++- * if the timestamp attached to the nonce is valid
++- * and possibly fabricated (in case of an attack)
++- * the attacker must also know the random seed to be
++- * able to generate a "sane" nonce, which if he does
++- * not, the nonce fabrication process going to be
++- * very hard to achieve.
++- */
++-
++- if (0 != strcmp (nonce, noncehashexp))
++- {
++- free(uri);
++- return MHD_INVALID_NONCE;
++- }
++- if ( (0 == lookup_sub_value (cnonce,
++- sizeof (cnonce),
++- header, "cnonce")) ||
++- (0 == lookup_sub_value (qop, sizeof (qop), header, "qop")) ||
++- ( (0 != strcmp (qop, "auth")) &&
++- (0 != strcmp (qop, "")) ) ||
++- (0 == lookup_sub_value (nc, sizeof (nc), header, "nc")) ||
++- (0 == lookup_sub_value (response, sizeof (response), header, "response")) )
++- {
++-#if HAVE_MESSAGES
++- MHD_DLOG (connection->daemon,
++- "Authentication failed, invalid format.\n");
++-#endif
++- free(uri);
++- return MHD_NO;
++- }
++- nci = strtoul (nc, &end, 16);
++- if ( ('\0' != *end) ||
++- ( (LONG_MAX == nci) &&
++- (ERANGE == errno) ) )
++- {
++-#if HAVE_MESSAGES
++- MHD_DLOG (connection->daemon,
++- "Authentication failed, invalid format.\n");
++-#endif
++- free(uri);
++- return MHD_NO; /* invalid nonce format */
++- }
++- /*
++- * Checking if that combination of nonce and nc is sound
++- * and not a replay attack attempt. Also adds the nonce
++- * to the nonce-nc map if it does not exist there.
++- */
++-
++- if (MHD_YES != check_nonce_nc (connection, nonce, nci))
++- {
++- free(uri);
++- return MHD_NO;
++- }
++-
++- digest_calc_ha1("md5",
++- username,
++- realm,
++- password,
++- nonce,
++- cnonce,
++- ha1);
++- digest_calc_response (ha1,
++- nonce,
++- nc,
++- cnonce,
++- qop,
++- connection->method,
++- uri,
++- hentity,
++- respexp);
++- free(uri);
+++ free (uri);
++ return (0 == strcmp(response, respexp))
++ ? MHD_YES
++ : MHD_NO;
++@@ -835,7 +847,7 @@ MHD_queue_auth_fail_response (struct MHD
++ : "");
++ {
++ char *header;
++-
+++
++ header = malloc(hlen + 1);
++ if (NULL == header)
++ {
++--- a/src/microhttpd/daemon.c
+++++ b/src/microhttpd/daemon.c
++@@ -73,7 +73,7 @@
++ /**
++ * Default connection limit.
++ */
++-#ifndef WINDOWS
+++#ifndef MHD_WINSOCK_SOCKETS
++ #define MHD_MAX_CONNECTIONS_DEFAULT FD_SETSIZE - 4
++ #else
++ #define MHD_MAX_CONNECTIONS_DEFAULT FD_SETSIZE
++@@ -1271,7 +1271,7 @@ internal_add_connection (struct MHD_Daem
++ return MHD_NO;
++ }
++
++-#ifndef WINDOWS
+++#ifndef MHD_WINSOCK_SOCKETS
++ if ( (client_socket >= FD_SETSIZE) &&
++ (0 == (daemon->options & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) )
++ {
++@@ -1418,7 +1418,7 @@ internal_add_connection (struct MHD_Daem
++ #endif
++ {
++ /* make socket non-blocking */
++-#if !defined(WINDOWS) || defined(CYGWIN)
+++#if !defined(MHD_WINSOCK_SOCKETS)
++ int flags = fcntl (connection->socket_fd, F_GETFL);
++ if ( (-1 == flags) ||
++ (0 != fcntl (connection->socket_fd, F_SETFL, flags | O_NONBLOCK)) )
++@@ -1797,7 +1797,7 @@ static void
++ make_nonblocking_noninheritable (struct MHD_Daemon *daemon,
++ MHD_socket sock)
++ {
++-#ifdef WINDOWS
+++#ifdef MHD_WINSOCK_SOCKETS
++ DWORD dwFlags;
++ unsigned long flags = 1;
++
++@@ -3611,7 +3611,7 @@ MHD_start_daemon_va (unsigned int flags,
++ daemon->socket_fd = MHD_INVALID_SOCKET;
++ daemon->listening_address_reuse = 0;
++ daemon->options = flags;
++-#if WINDOWS
+++#if defined(MHD_WINSOCK_SOCKETS) || defined(CYGWIN)
++ /* Winsock is broken with respect to 'shutdown';
++ this disables us calling 'shutdown' on W32. */
++ daemon->options |= MHD_USE_EPOLL_TURBO;
++@@ -3650,7 +3650,7 @@ MHD_start_daemon_va (unsigned int flags,
++ free (daemon);
++ return NULL;
++ }
++-#ifndef WINDOWS
+++#ifndef MHD_WINSOCK_SOCKETS
++ if ( (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) &&
++ (1 == use_pipe) &&
++ (daemon->wpipe[0] >= FD_SETSIZE) )
++@@ -3934,7 +3934,7 @@ MHD_start_daemon_va (unsigned int flags,
++ (http://msdn.microsoft.com/en-us/library/ms738574%28v=VS.85%29.aspx);
++ and may also be missing on older POSIX systems; good luck if you have any of those,
++ your IPv6 socket may then also bind against IPv4 anyway... */
++-#ifndef WINDOWS
+++#ifndef MHD_WINSOCK_SOCKETS
++ const int
++ #else
++ const char
++@@ -4016,7 +4016,7 @@ MHD_start_daemon_va (unsigned int flags,
++ {
++ socket_fd = daemon->socket_fd;
++ }
++-#ifndef WINDOWS
+++#ifndef MHD_WINSOCK_SOCKETS
++ if ( (socket_fd >= FD_SETSIZE) &&
++ (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY)) ) )
++ {
++@@ -4121,7 +4121,7 @@ MHD_start_daemon_va (unsigned int flags,
++ if ( (daemon->worker_pool_size > 0) &&
++ (0 == (daemon->options & MHD_USE_NO_LISTEN_SOCKET)) )
++ {
++-#if !defined(WINDOWS) || defined(CYGWIN)
+++#if !defined(MHD_WINSOCK_SOCKETS)
++ int sk_flags;
++ #else
++ unsigned long sk_flags;
++@@ -4140,7 +4140,7 @@ MHD_start_daemon_va (unsigned int flags,
++ /* Accept must be non-blocking. Multiple children may wake up
++ * to handle a new connection, but only one will win the race.
++ * The others must immediately return. */
++-#if !defined(WINDOWS) || defined(CYGWIN)
+++#if !defined(MHD_WINSOCK_SOCKETS)
++ sk_flags = fcntl (socket_fd, F_GETFL);
++ if (sk_flags < 0)
++ goto thread_failed;
++@@ -4150,7 +4150,7 @@ MHD_start_daemon_va (unsigned int flags,
++ sk_flags = 1;
++ if (SOCKET_ERROR == ioctlsocket (socket_fd, FIONBIO, &sk_flags))
++ goto thread_failed;
++-#endif /* WINDOWS && !CYGWIN */
+++#endif /* MHD_WINSOCK_SOCKETS */
++
++ /* Allocate memory for pooled objects */
++ daemon->worker_pool = malloc (sizeof (struct MHD_Daemon)
++@@ -4182,7 +4182,7 @@ MHD_start_daemon_va (unsigned int flags,
++ #endif
++ goto thread_failed;
++ }
++-#ifndef WINDOWS
+++#ifndef MHD_WINSOCK_SOCKETS
++ if ( (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL_LINUX_ONLY))) &&
++ (MHD_USE_SUSPEND_RESUME == (flags & MHD_USE_SUSPEND_RESUME)) &&
++ (d->wpipe[0] >= FD_SETSIZE) )
++@@ -4343,7 +4343,7 @@ close_all_connections (struct MHD_Daemon
++ {
++ shutdown (pos->socket_fd,
++ (pos->read_closed == MHD_YES) ? SHUT_WR : SHUT_RDWR);
++-#if WINDOWS
+++#if MHD_WINSOCK_SOCKETS
++ if ( (0 != (daemon->options & MHD_USE_THREAD_PER_CONNECTION)) &&
++ (MHD_INVALID_PIPE_ != daemon->wpipe[1]) &&
++ (1 != MHD_pipe_write_ (daemon->wpipe[1], "e", 1)) )
++--- a/src/include/microhttpd.h
+++++ b/src/include/microhttpd.h
++@@ -130,7 +130,7 @@ typedef intptr_t ssize_t;
++ * Current version of the library.
++ * 0x01093001 = 1.9.30-1.
++ */
++-#define MHD_VERSION 0x00094200
+++#define MHD_VERSION 0x00094202
++
++ /**
++ * MHD-internal return code for "YES".
++@@ -194,6 +194,53 @@ typedef SOCKET MHD_socket;
++ #endif /* MHD_SOCKET_DEFINED */
++
++ /**
+++ * Define MHD_NO_DEPRECATION before including "microhttpd.h" to disable deprecation messages
+++ */
+++#ifdef MHD_NO_DEPRECATION
+++#define _MHD_DEPR_MACRO(msg)
+++#define _MHD_DEPR_FUNC(msg)
+++#endif /* MHD_NO_DEPRECATION */
+++
+++#ifndef _MHD_DEPR_MACRO
+++#if defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1500
+++/* Stringify macros */
+++#define _MHD_INSTRMACRO(a) #a
+++#define _MHD_STRMACRO(a) _MHD_INSTRMACRO(a)
+++#define _MHD_DEPR_MACRO(msg) __pragma(message(__FILE__ "(" _MHD_STRMACRO(__LINE__)"): warning: " msg))
+++#elif defined(__clang__) || defined (__GNUC_PATCHLEVEL__)
+++#define _MHD_GCC_PRAG(x) _Pragma (#x)
+++#if __clang_major__+0 >= 5 || \
+++ (!defined(__apple_build_version__) && (__clang_major__+0 > 3 || (__clang_major__+0 == 3 && __clang_minor__ >= 3))) || \
+++ __GNUC__+0 > 4 || (__GNUC__+0 == 4 && __GNUC_MINOR__+0 >= 8)
+++#define _MHD_DEPR_MACRO(msg) _MHD_GCC_PRAG(GCC warning msg)
+++#else /* older clang or GCC */
+++#define _MHD_DEPR_MACRO(msg) _MHD_GCC_PRAG(message msg)
+++#endif
+++/* #elif defined(SOMEMACRO) */ /* add compiler-specific macros here if required */
+++#else /* other compilers */
+++#define _MHD_DEPR_MACRO(msg)
+++#endif
+++#endif /* _MHD_DEPR_MACRO */
+++
+++#ifndef _MHD_DEPR_FUNC
+++#if defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1400
+++#define _MHD_DEPR_FUNC(msg) __declspec(deprecated(msg))
+++#elif defined(_MSC_FULL_VER) && _MSC_VER+0 >= 1310
+++/* VS .NET 2003 deprecation do not support custom messages */
+++#define _MHD_DEPR_FUNC(msg) __declspec(deprecated)
+++#elif defined (__clang__) && \
+++ (__clang_major__+0 >= 4 || (!defined(__apple_build_version__) && __clang_major__+0 >= 3))
+++#define _MHD_DEPR_FUNC(msg) __attribute__((deprecated(msg)))
+++#elif defined (__clang__) || __GNUC__+0 > 3 || (__GNUC__+0 == 3 && __GNUC_MINOR__+0 >= 1)
+++/* GCC-style deprecation do not support custom messages */
+++#define _MHD_DEPR_FUNC(msg) __attribute__((__deprecated__))
+++/* #elif defined(SOMEMACRO) */ /* add compiler-specific macros here if required */
+++#else /* other compilers */
+++#define _MHD_DEPR_FUNC(msg)
+++#endif
+++#endif /* _MHD_DEPR_FUNC */
+++
+++/**
++ * Not all architectures and `printf()`'s support the `long long` type.
++ * This gives the ability to replace `long long` with just a `long`,
++ * standard `int` or a `short`.
++@@ -204,6 +251,8 @@ typedef SOCKET MHD_socket;
++ */
++ #define MHD_LONG_LONG long long
++ #define MHD_UNSIGNED_LONG_LONG unsigned long long
+++#else /* MHD_LONG_LONG */
+++_MHD_DEPR_MACRO("Macro MHD_LONG_LONG is deprecated, use MHD_UNSIGNED_LONG_LONG")
++ #endif
++ /**
++ * Format string for printing a variable of type #MHD_LONG_LONG.
++@@ -215,6 +264,8 @@ typedef SOCKET MHD_socket;
++ */
++ #define MHD_LONG_LONG_PRINTF "ll"
++ #define MHD_UNSIGNED_LONG_LONG_PRINTF "%llu"
+++#else /* MHD_LONG_LONG_PRINTF */
+++_MHD_DEPR_MACRO("Macro MHD_LONG_LONG_PRINTF is deprecated, use MHD_UNSIGNED_LONG_LONG_PRINTF")
++ #endif
++
++
++@@ -253,7 +304,8 @@ typedef SOCKET MHD_socket;
++ #define MHD_HTTP_METHOD_NOT_ALLOWED 405
++ #define MHD_HTTP_NOT_ACCEPTABLE 406
++ /** @deprecated */
++-#define MHD_HTTP_METHOD_NOT_ACCEPTABLE 406
+++#define MHD_HTTP_METHOD_NOT_ACCEPTABLE \
+++ _MHD_DEPR_MACRO("Value MHD_HTTP_METHOD_NOT_ACCEPTABLE is deprecated, use MHD_HTTP_NOT_ACCEPTABLE") 406
++ #define MHD_HTTP_PROXY_AUTHENTICATION_REQUIRED 407
++ #define MHD_HTTP_REQUEST_TIMEOUT 408
++ #define MHD_HTTP_CONFLICT 409
++@@ -1953,6 +2005,7 @@ MHD_create_response_from_callback (uint6
++ * @deprecated use #MHD_create_response_from_buffer instead
++ * @ingroup response
++ */
+++_MHD_DEPR_FUNC("MHD_create_response_from_data() is deprecated, use MHD_create_response_from_buffer()") \
++ _MHD_EXTERN struct MHD_Response *
++ MHD_create_response_from_data (size_t size,
++ void *data,
++@@ -2023,6 +2076,8 @@ MHD_create_response_from_buffer (size_t
++ * @return NULL on error (i.e. invalid arguments, out of memory)
++ * @ingroup response
++ */
+++/* NOTE: this should be 'uint64_t' instead of 'size_t', but changing
+++ this would break API compatibility. */
++ _MHD_EXTERN struct MHD_Response *
++ MHD_create_response_from_fd (size_t size,
++ int fd);
++@@ -2044,6 +2099,8 @@ MHD_create_response_from_fd (size_t size
++ * @return NULL on error (i.e. invalid arguments, out of memory)
++ * @ingroup response
++ */
+++/* NOTE: this should be 'uint64_t' instead of 'size_t', but changing
+++ this would break API compatibility. */
++ _MHD_EXTERN struct MHD_Response *
++ MHD_create_response_from_fd_at_offset (size_t size,
++ int fd,
++--- a/src/include/platform_interface.h
+++++ b/src/include/platform_interface.h
++@@ -82,14 +82,14 @@
++
++
++ /* MHD_socket_close_(fd) close any FDs (non-W32) / close only socket FDs (W32) */
++-#if !defined(_WIN32) || defined(__CYGWIN__)
+++#if !defined(MHD_WINSOCK_SOCKETS)
++ #define MHD_socket_close_(fd) close((fd))
++ #else
++ #define MHD_socket_close_(fd) closesocket((fd))
++ #endif
++
++ /* MHD_socket_errno_ is errno of last function (non-W32) / errno of last socket function (W32) */
++-#if !defined(_WIN32) || defined(__CYGWIN__)
+++#if !defined(MHD_WINSOCK_SOCKETS)
++ #define MHD_socket_errno_ errno
++ #else
++ #define MHD_socket_errno_ MHD_W32_errno_from_winsock_()
++@@ -97,21 +97,21 @@
++
++ /* MHD_socket_last_strerr_ is description string of last errno (non-W32) /
++ * description string of last socket error (W32) */
++-#if !defined(_WIN32) || defined(__CYGWIN__)
+++#if !defined(MHD_WINSOCK_SOCKETS)
++ #define MHD_socket_last_strerr_() strerror(errno)
++ #else
++ #define MHD_socket_last_strerr_() MHD_W32_strerror_last_winsock_()
++ #endif
++
++ /* MHD_strerror_ is strerror (both non-W32/W32) */
++-#if !defined(_WIN32) || defined(__CYGWIN__)
+++#if !defined(MHD_WINSOCK_SOCKETS)
++ #define MHD_strerror_(errnum) strerror((errnum))
++ #else
++ #define MHD_strerror_(errnum) MHD_W32_strerror_((errnum))
++ #endif
++
++ /* MHD_set_socket_errno_ set errno to errnum (non-W32) / set socket last error to errnum (W32) */
++-#if !defined(_WIN32) || defined(__CYGWIN__)
+++#if !defined(MHD_WINSOCK_SOCKETS)
++ #define MHD_set_socket_errno_(errnum) errno=(errnum)
++ #else
++ #define MHD_set_socket_errno_(errnum) MHD_W32_set_last_winsock_error_((errnum))
++--- a/src/testcurl/test_digestauth.c
+++++ b/src/testcurl/test_digestauth.c
++@@ -73,7 +73,8 @@ ahc_echo (void *cls,
++ const char *url,
++ const char *method,
++ const char *version,
++- const char *upload_data, size_t *upload_data_size,
+++ const char *upload_data,
+++ size_t *upload_data_size,
++ void **unused)
++ {
++ struct MHD_Response *response;
++@@ -82,44 +83,47 @@ ahc_echo (void *cls,
++ const char *realm = "test@example.com";
++ int ret;
++
++- username = MHD_digest_auth_get_username(connection);
+++ username = MHD_digest_auth_get_username (connection);
++ if ( (username == NULL) ||
++ (0 != strcmp (username, "testuser")) )
++ {
++- response = MHD_create_response_from_buffer(strlen (DENIED),
++- DENIED,
++- MHD_RESPMEM_PERSISTENT);
+++ response = MHD_create_response_from_buffer (strlen (DENIED),
+++ DENIED,
+++ MHD_RESPMEM_PERSISTENT);
++ ret = MHD_queue_auth_fail_response(connection, realm,
++ MY_OPAQUE,
++ response,
++- MHD_NO);
++- MHD_destroy_response(response);
+++ MHD_NO);
+++ MHD_destroy_response(response);
++ return ret;
++ }
++ ret = MHD_digest_auth_check(connection, realm,
++- username,
++- password,
+++ username,
+++ password,
++ 300);
++ free(username);
++ if ( (ret == MHD_INVALID_NONCE) ||
++ (ret == MHD_NO) )
++ {
++- response = MHD_create_response_from_buffer(strlen (DENIED),
+++ response = MHD_create_response_from_buffer(strlen (DENIED),
++ DENIED,
++- MHD_RESPMEM_PERSISTENT);
++- if (NULL == response)
+++ MHD_RESPMEM_PERSISTENT);
+++ if (NULL == response)
++ return MHD_NO;
++ ret = MHD_queue_auth_fail_response(connection, realm,
++ MY_OPAQUE,
++ response,
++- (ret == MHD_INVALID_NONCE) ? MHD_YES : MHD_NO);
++- MHD_destroy_response(response);
+++ (ret == MHD_INVALID_NONCE) ? MHD_YES : MHD_NO);
+++ MHD_destroy_response(response);
++ return ret;
++ }
++- response = MHD_create_response_from_buffer(strlen(PAGE), PAGE,
++- MHD_RESPMEM_PERSISTENT);
++- ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
++- MHD_destroy_response(response);
+++ response = MHD_create_response_from_buffer (strlen(PAGE),
+++ PAGE,
+++ MHD_RESPMEM_PERSISTENT);
+++ ret = MHD_queue_response (connection,
+++ MHD_HTTP_OK,
+++ response);
+++ MHD_destroy_response (response);
++ return ret;
++ }
++
++@@ -144,24 +148,24 @@ testDigestAuth ()
++ fd = open("/dev/urandom", O_RDONLY);
++ if (-1 == fd)
++ {
++- fprintf(stderr, "Failed to open `%s': %s\n",
++- "/dev/urandom",
++- strerror(errno));
++- return 1;
++- }
+++ fprintf(stderr, "Failed to open `%s': %s\n",
+++ "/dev/urandom",
+++ strerror(errno));
+++ return 1;
+++ }
++ while (off < 8)
++- {
++- len = read(fd, rnd, 8);
++- if (len == -1)
++- {
++- fprintf(stderr, "Failed to read `%s': %s\n",
++- "/dev/urandom",
++- strerror(errno));
++- (void) close(fd);
++- return 1;
++- }
++- off += len;
++- }
+++ {
+++ len = read(fd, rnd, 8);
+++ if (len == -1)
+++ {
+++ fprintf(stderr, "Failed to read `%s': %s\n",
+++ "/dev/urandom",
+++ strerror(errno));
+++ (void) close(fd);
+++ return 1;
+++ }
+++ off += len;
+++ }
++ (void) close(fd);
++ #else
++ {
++@@ -193,7 +197,7 @@ testDigestAuth ()
++ if (d == NULL)
++ return 1;
++ c = curl_easy_init ();
++- curl_easy_setopt (c, CURLOPT_URL, "http://127.0.0.1:1337/");
+++ curl_easy_setopt (c, CURLOPT_URL, "http://127.0.0.1:1337/bar%20 foo?a=bü%20");
++ curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer);
++ curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc);
++ curl_easy_setopt (c, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
++@@ -225,7 +229,6 @@ testDigestAuth ()
++ }
++
++
++-
++ int
++ main (int argc, char *const *argv)
++ {
++--- a/src/testcurl/https/test_https_time_out.c
+++++ b/src/testcurl/https/test_https_time_out.c
++@@ -64,7 +64,7 @@ test_tls_session_time_out (gnutls_sessio
++
++ gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) (intptr_t) sd);
++
++- ret = connect (sd, &sa, sizeof (struct sockaddr_in));
+++ ret = connect (sd, (struct sockaddr *) &sa, sizeof (struct sockaddr_in));
++
++ if (ret < 0)
++ {
+diff --git a/feeds/packages/libs/libmms/Makefile b/feeds/packages/libs/libmms/Makefile
+new file mode 100644
+index 0000000..239c64f
+--- /dev/null
++++ b/feeds/packages/libs/libmms/Makefile
+@@ -0,0 +1,63 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libmms
++PKG_VERSION:=0.6.4
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/libmms
++PKG_MD5SUM:=d6b665b335a6360e000976e770da7691
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=LGPLv2.1
++PKG_LICENSE_FILES:=COPYING.LIB
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/libmms
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+glib2
++ TITLE:=MMS stream protocol library
++ URL:=http://libmms.sourceforge.net
++ DEPENDS:=$(ICONV_DEPENDS)
++endef
++
++define Package/libmms/description
++ LibMMS is a common library for parsing mms:// and mmsh:// type network streams.
++ These are commonly used to stream Windows Media Video content over the web.
++ LibMMS itself is only for receiving MMS stream,
++ it doesn't handle sending at all.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++TARGET_LDFLAGS += $(if $(ICONV_FULL),-liconv)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libmms $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmms.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/*.pc \
++ $(1)/usr/lib/pkgconfig
++endef
++
++define Package/libmms/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmms.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libmms))
+diff --git a/feeds/packages/libs/libmodbus/Makefile b/feeds/packages/libs/libmodbus/Makefile
+new file mode 100644
+index 0000000..65fb00e
+--- /dev/null
++++ b/feeds/packages/libs/libmodbus/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libmodbus
++PKG_VERSION:=3.1.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://libmodbus.org/releases
++PKG_MD5SUM:=dd4262f87ed835c4d1e560f8321a222c
++
++PKG_MAINTAINER:=Michael Heimpold <mhei@heimpold.de>
++
++PKG_LICENSE:=GPL-3.0+ LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING COPYING.LESSER
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libmodbus
++ SECTION:=libs
++ CATEGORY:=Libraries
++ URL:=http://www.libmodbus.org
++ TITLE:=libmodbus
++endef
++
++define Package/libmodbus/description
++ A Modbus library for Linux, Mac OS X, FreeBSD, QNX and Win32.
++endef
++
++CONFIGURE_ARGS += --without-documentation
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/modbus $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmodbus.{so*,la} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libmodbus.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libmodbus/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libmodbus.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libmodbus))
+diff --git a/feeds/packages/libs/libmpdclient/Makefile b/feeds/packages/libs/libmpdclient/Makefile
+new file mode 100644
+index 0000000..0666114
+--- /dev/null
++++ b/feeds/packages/libs/libmpdclient/Makefile
+@@ -0,0 +1,69 @@
++#
++# Copyright (C) 2011-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libmpdclient
++PKG_VERSION:=2.10
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.musicpd.org/download/libmpdclient/2/
++PGK_MD5SUM:=00606c630b905aa6196330373b366c29
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libmpdclient
++ TITLE:=libmpdclient
++ SECTION:=libs
++ CATEGORY:=Libraries
++ URL:=http://mpd.wikia.com/wiki/ClientLib:libmpdclient
++endef
++
++define Package/libmpdclient/description
++ A stable, documented, asynchronous API library for interfacing MPD in the C, C++ & Objective C languages.
++endef
++
++TARGET_CFLAGS+="-std=gnu99"
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --disable-documentation \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) \
++ $(1)/usr/include \
++ $(1)/usr/lib \
++ $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/* \
++ $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/* \
++ $(1)/usr/include/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig \
++ $(1)/usr/lib/
++endef
++
++define Package/libmpdclient/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libmpdclient.so* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libmpdclient))
+diff --git a/feeds/packages/libs/libmpeg2/Makefile b/feeds/packages/libs/libmpeg2/Makefile
+new file mode 100644
+index 0000000..9d3c052
+--- /dev/null
++++ b/feeds/packages/libs/libmpeg2/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libmpeg2
++PKG_VERSION:=0.5.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=libmpeg2-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://libmpeg2.sourceforge.net/files/
++PKG_MD5SUM:=0f92c7454e58379b4a5a378485bbd8ef
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libmpeg2
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=MPEG-1 & -2 decoding library
++ URL:=http://libmpeg2.sourceforge.net/
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++endef
++
++define Package/libmpeg2/decription
++ Libmpeg2 is a library for decoding MPEG-1 and MPEG-2 video streams
++endef
++
++CONFIGURE_ARGS += \
++ --disable-sdl \
++ --without-x \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/mpeg2dec \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libmpeg2{,convert}.{a,so*} \
++ $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libmpeg2{,convert}.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libmpeg2/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libmpeg2{,convert}.so.* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libmpeg2))
+diff --git a/feeds/packages/libs/libmpeg2/patches/101-ppc_no_altivec.patch b/feeds/packages/libs/libmpeg2/patches/101-ppc_no_altivec.patch
+new file mode 100644
+index 0000000..49251a0
+--- /dev/null
++++ b/feeds/packages/libs/libmpeg2/patches/101-ppc_no_altivec.patch
+@@ -0,0 +1,66 @@
++--- a/libmpeg2/motion_comp_altivec.c
+++++ b/libmpeg2/motion_comp_altivec.c
++@@ -25,6 +25,8 @@
++
++ #ifdef ARCH_PPC
++
+++#ifdef __I_WANT_ALTIVEC__
+++
++ #ifdef HAVE_ALTIVEC_H
++ #include <altivec.h>
++ #endif
++@@ -1007,4 +1009,6 @@ static void MC_avg_xy_8_altivec (uint8_t
++
++ MPEG2_MC_EXTERN (altivec)
++
+++#endif /* __I_WANT_ALTIVEC__ */
+++
++ #endif
++--- a/libmpeg2/idct_altivec.c
+++++ b/libmpeg2/idct_altivec.c
++@@ -25,6 +25,8 @@
++
++ #ifdef ARCH_PPC
++
+++#ifdef __I_WANT_ALTIVEC__
+++
++ #ifdef HAVE_ALTIVEC_H
++ #include <altivec.h>
++ #endif
++@@ -283,4 +285,6 @@ void mpeg2_idct_altivec_init (void)
++ }
++ }
++
+++#endif /* __I_WANT_ALTIVEC__ */
+++
++ #endif
++--- a/libmpeg2/idct.c
+++++ b/libmpeg2/idct.c
++@@ -251,11 +251,13 @@ void mpeg2_idct_init (uint32_t accel)
++ } else
++ #endif
++ #ifdef ARCH_PPC
+++#ifdef __I_WANT_ALTIVEC__
++ if (accel & MPEG2_ACCEL_PPC_ALTIVEC) {
++ mpeg2_idct_copy = mpeg2_idct_copy_altivec;
++ mpeg2_idct_add = mpeg2_idct_add_altivec;
++ mpeg2_idct_altivec_init ();
++ } else
+++#endif /* __I_WANT_ALTIVEC__ */
++ #endif
++ #ifdef ARCH_ALPHA
++ if (accel & MPEG2_ACCEL_ALPHA_MVI) {
++--- a/libmpeg2/motion_comp.c
+++++ b/libmpeg2/motion_comp.c
++@@ -43,9 +43,11 @@ void mpeg2_mc_init (uint32_t accel)
++ else
++ #endif
++ #ifdef ARCH_PPC
+++#ifdef __I_WANT_ALTIVEC__
++ if (accel & MPEG2_ACCEL_PPC_ALTIVEC)
++ mpeg2_mc = mpeg2_mc_altivec;
++ else
+++#endif /* __I_WANT_ALTIVEC__ */
++ #endif
++ #ifdef ARCH_ALPHA
++ if (accel & MPEG2_ACCEL_ALPHA)
+diff --git a/feeds/packages/libs/libmpeg2/patches/102-arm_data_preload_check.patch b/feeds/packages/libs/libmpeg2/patches/102-arm_data_preload_check.patch
+new file mode 100644
+index 0000000..86793fc
+--- /dev/null
++++ b/feeds/packages/libs/libmpeg2/patches/102-arm_data_preload_check.patch
+@@ -0,0 +1,19 @@
++diff -urN libmpeg2-0.5.1/libmpeg2/motion_comp_arm_s.S libmpeg2-0.5.1.new/libmpeg2/motion_comp_arm_s.S
++--- libmpeg2-0.5.1/libmpeg2/motion_comp_arm_s.S 2008-07-09 21:16:05.000000000 +0200
+++++ libmpeg2-0.5.1.new/libmpeg2/motion_comp_arm_s.S 2012-07-30 15:22:58.664964215 +0200
++@@ -19,6 +19,15 @@
++ @ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++
++
+++@ Data preload is supported only by ARM V5TE and above
+++
+++#if (defined (__ARM_ARCH_2__) || defined (__ARM_ARCH_3__) \
+++ || defined (__ARM_ARCH_3M__) || defined (__ARM_ARCH_4__) \
+++ || defined (__ARM_ARCH_4T__) || defined (__ARM_ARCH_5__) \
+++ || defined (__ARM_ARCH_5T__))
+++.macro pld reg
+++.endm
+++#endif
++ .text
++
++ @ ----------------------------------------------------------------
+diff --git a/feeds/packages/libs/libmraa/Makefile b/feeds/packages/libs/libmraa/Makefile
+new file mode 100644
+index 0000000..3e3202a
+--- /dev/null
++++ b/feeds/packages/libs/libmraa/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libmraa
++PKG_VERSION:=0.8.0
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/intel-iot-devkit/mraa.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=70600dece4138b0c0dbaff42f57828f1559cd840
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_BUILD_DEPENDS:=node python/host swig/host node/host
++CMAKE_INSTALL:=1
++
++PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
++PKG_LICENSE:=LGPL-2.1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++CMAKE_OPTIONS=-DBUILDARCH=$(CONFIG_ARCH) \
++ -DENABLEEXAMPLES=0 \
++ -DNODE_EXECUTABLE=$(STAGING_DIR_HOST)/bin/node \
++ -DSWIG_DIR=$(STAGING_DIR_HOST)/bin
++
++TARGET_CFLAGS+=-I$(STAGING_DIR)/usr/include/node
++
++define Package/libmraa
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+python +libstdcpp
++ TITLE:=Intel IoT lowlevel IO library
++endef
++
++define Package/libmraa/install
++ $(INSTALL_DIR) $(1)/usr/lib/{node/mraa,python2.7/site-packages} $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/libmraa.so* $(1)/usr/lib/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/node_modules/mraa/* $(1)/usr/lib/node/mraa/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/python2.7/site-packages/* $(1)/usr/lib/python2.7/site-packages/
++# $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/share/mraa/examples/python/blink-io8.py $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libmraa))
+diff --git a/feeds/packages/libs/libmraa/patches/0001-base.patch b/feeds/packages/libs/libmraa/patches/0001-base.patch
+new file mode 100644
+index 0000000..5094389
+--- /dev/null
++++ b/feeds/packages/libs/libmraa/patches/0001-base.patch
+@@ -0,0 +1,118 @@
++From 6fecad819376442d057bdd35a0909cfac9df02f5 Mon Sep 17 00:00:00 2001
++From: John Crispin <blogic@openwrt.org>
++Date: Thu, 23 Jul 2015 12:18:39 +0200
++Subject: [PATCH 1/4] base
++
++---
++ CMakeLists.txt | 10 ++++------
++ api/mraa/types.h | 1 +
++ include/mraa_internal.h | 7 +++++++
++ src/CMakeLists.txt | 5 +++++
++ src/i2c/i2c.c | 2 +-
++ src/mraa.c | 3 +++
++ src/uart/uart.c | 1 +
++ 7 files changed, 22 insertions(+), 7 deletions(-)
++
++--- a/CMakeLists.txt
+++++ b/CMakeLists.txt
++@@ -14,12 +14,7 @@
++ set (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
++
++ # Make a version file containing the current version from git.
++-include (GetGitRevisionDescription)
++-git_describe (VERSION "--tags")
++-if ("x_${VERSION}" STREQUAL "x_GIT-NOTFOUND" OR "x_${VERSION}" STREQUAL "x_HEAD-HASH-NOTFOUND")
++- message (WARNING " - Install git to compile a production libmraa!")
++- set (VERSION "v0.8.0-dirty")
++-endif ()
+++set (VERSION "v0.8.0")
++
++ message (INFO " - libmraa Version ${VERSION}")
++
++@@ -84,8 +79,10 @@
++ set (X86PLAT ON)
++ elseif (DETECTED_ARCH MATCHES "arm.*")
++ set (ARMPLAT ON)
+++elseif (DETECTED_ARCH MATCHES "mips")
+++ set (MIPSPLAT ON)
++ else ()
++- message(FATAL_ERROR "Only x86 and arm platforms currently supported")
+++ message(FATAL_ERROR "Only x86, arm and mips platforms currently supported")
++ endif()
++
++ if (BUILDSWIGPYTHON)
++--- a/api/mraa/types.h
+++++ b/api/mraa/types.h
++@@ -46,6 +46,7 @@
++ MRAA_BEAGLEBONE = 6, /**< The different BeagleBone Black Modes B/C */
++ MRAA_BANANA = 7, /**< Allwinner A20 based Banana Pi and Banana Pro */
++ MRAA_INTEL_NUC5 = 8, /**< The Intel 5th generations Broadwell NUCs */
+++ MRAA_MTK_LINKIT = 9, /**< Mediatek MT7688 based Linkit (Air) */
++
++ // USB platform extenders start at 256
++ MRAA_FTDI_FT4222 = 256, /**< FTDI FT4222 USB to i2c bridge */
++--- a/include/mraa_internal.h
+++++ b/include/mraa_internal.h
++@@ -66,6 +66,13 @@
++ mraa_platform_t mraa_usb_platform_extender(mraa_board_t* board);
++
++ /**
+++ * runtime detect running arm platforms
+++ *
+++ * @return mraa_platform_t of the init'ed platform
+++ */
+++mraa_platform_t mraa_mips_platform();
+++
+++/**
++ * helper function to check if file exists
++ *
++ * @param filename to check
++--- a/src/CMakeLists.txt
+++++ b/src/CMakeLists.txt
++@@ -71,6 +71,11 @@
++ add_subdirectory(usb)
++ endif ()
++
+++if (MIPSPLAT)
+++ add_subdirectory(mips)
+++ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMIPSPLAT=1")
+++endif()
+++
++ set (mraa_LIB_SRCS
++ ${mraa_LIB_PLAT_SRCS_NOAUTO}
++ # autogenerated version file
++--- a/src/i2c/i2c.c
+++++ b/src/i2c/i2c.c
++@@ -31,9 +31,9 @@
++ #include <stdlib.h>
++ #include <unistd.h>
++ #include <fcntl.h>
+++#include <errno.h>
++ #include <inttypes.h>
++ #include <sys/types.h>
++-#include <sys/errno.h>
++ #include <sys/ioctl.h>
++ #include "linux/i2c-dev.h"
++
++--- a/src/mraa.c
+++++ b/src/mraa.c
++@@ -111,6 +111,9 @@
++ #elif defined(ARMPLAT)
++ // Use runtime ARM platform detection
++ platform_type = mraa_arm_platform();
+++#elif MIPSPLAT
+++ // Use runtime ARM platform detection
+++ platform_type = mraa_mips_platform();
++ #else
++ #error mraa_ARCH NOTHING
++ #endif
++--- a/src/uart/uart.c
+++++ b/src/uart/uart.c
++@@ -26,6 +26,7 @@
++
++ #include <stdlib.h>
++ #include <sys/stat.h>
+++#include <sys/time.h>
++ #include <unistd.h>
++ #include <string.h>
++ #include <termios.h>
+diff --git a/feeds/packages/libs/libmraa/patches/0002-add-mips-support.patch b/feeds/packages/libs/libmraa/patches/0002-add-mips-support.patch
+new file mode 100644
+index 0000000..66219b9
+--- /dev/null
++++ b/feeds/packages/libs/libmraa/patches/0002-add-mips-support.patch
+@@ -0,0 +1,483 @@
++From 2c67c6f51ce5bab18c79f4304ccf42716f59f13c Mon Sep 17 00:00:00 2001
++From: John Crispin <blogic@openwrt.org>
++Date: Thu, 23 Jul 2015 13:21:25 +0200
++Subject: [PATCH 2/4] add mips support
++
++Signed-off-by: John Crispin <blogic@openwrt.org>
++---
++ include/mips/mediatek.h | 39 ++++++
++ src/mips/CMakeLists.txt | 6 +
++ src/mips/mediatek.c | 349 +++++++++++++++++++++++++++++++++++++++++++++++
++ src/mips/mips.c | 60 ++++++++
++ 4 files changed, 454 insertions(+)
++ create mode 100644 include/mips/mediatek.h
++ create mode 100644 src/mips/CMakeLists.txt
++ create mode 100644 src/mips/mediatek.c
++ create mode 100644 src/mips/mips.c
++
++--- /dev/null
+++++ b/include/mips/mediatek.h
++@@ -0,0 +1,39 @@
+++/*
+++ * Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
+++ * Author: Michael Ring <mail@michael-ring.org>
+++ * Copyright (c) 2014 Intel Corporation.
+++ *
+++ * 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:
+++ *
+++ * The above copyright notice and this permission notice shall be
+++ * included in all copies or substantial portions of the Software.
+++ *
+++ * 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.
+++ */
+++
+++#pragma once
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++#include "mraa_internal.h"
+++
+++mraa_board_t *
+++ mraa_mtk_linkit();
+++
+++#ifdef __cplusplus
+++}
+++#endif
++--- /dev/null
+++++ b/src/mips/CMakeLists.txt
++@@ -0,0 +1,6 @@
+++message (INFO " - Adding MIPS platforms")
+++set (mraa_LIB_PLAT_SRCS_NOAUTO ${mraa_LIB_SRCS_NOAUTO}
+++ ${PROJECT_SOURCE_DIR}/src/mips/mips.c
+++ ${PROJECT_SOURCE_DIR}/src/mips/mediatek.c
+++ PARENT_SCOPE
+++)
++--- /dev/null
+++++ b/src/mips/mediatek.c
++@@ -0,0 +1,349 @@
+++/*
+++ * Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
+++ * Author: Michael Ring <mail@michael-ring.org>
+++ * Copyright (c) 2014 Intel Corporation.
+++ *
+++ * 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:
+++ *
+++ * The above copyright notice and this permission notice shall be
+++ * included in all copies or substantial portions of the Software.
+++ *
+++ * 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.
+++ */
+++
+++#include <stdio.h>
+++#include <stdint.h>
+++#include <stdlib.h>
+++#include <string.h>
+++#include <sys/mman.h>
+++#include <mraa/common.h>
+++
+++#include "mraa_internal.h"
+++
+++#include "common.h"
+++
+++#define PLATFORM_MEDIATEK_LINKIT 1
+++#define PLATFORM_MEDIATEK_LINKIT_AIR 2
+++#define MMAP_PATH "/dev/mem"
+++#define MT7628_GPIO_BASE 0x100
+++#define MT7628_BLOCK_SIZE (4 * 1024)
+++#define MT7628_GPIO_CTRL 0x00
+++#define MT7628_GPIO_DATA 0x20
+++#define MT7628_GPIO_SET 0x30
+++#define MT7628_GPIO_CLEAR 0x40
+++
+++#define MAX_SIZE 64
+++
+++// MMAP
+++static uint8_t* mmap_reg = NULL;
+++static int mmap_fd = 0;
+++static int mmap_size;
+++static unsigned int mmap_count = 0;
+++static int platform_detected = 0;
+++
+++mraa_result_t
+++mraa_mtk_linkit_mmap_write(mraa_gpio_context dev, int value)
+++{
+++ volatile uint32_t* addr;
+++ if (value) {
+++ *(volatile uint32_t*) (mmap_reg + MT7628_GPIO_SET + (dev->pin / 32) * 4) =
+++ (uint32_t)(1 << (dev->pin % 32));
+++ } else {
+++ *(volatile uint32_t*) (mmap_reg + MT7628_GPIO_CLEAR + (dev->pin / 32) * 4) =
+++ (uint32_t)(1 << (dev->pin % 32));
+++ }
+++ return MRAA_SUCCESS;
+++}
+++
+++static mraa_result_t
+++mraa_mtk_linkit_mmap_unsetup()
+++{
+++ if (mmap_reg == NULL) {
+++ syslog(LOG_ERR, "linkit mmap: null register cant unsetup");
+++ return MRAA_ERROR_INVALID_RESOURCE;
+++ }
+++ munmap(mmap_reg, mmap_size);
+++ mmap_reg = NULL;
+++ if (close(mmap_fd) != 0) {
+++ return MRAA_ERROR_INVALID_RESOURCE;
+++ }
+++ return MRAA_SUCCESS;
+++}
+++
+++int
+++mraa_mtk_linkit_mmap_read(mraa_gpio_context dev)
+++{
+++ uint32_t value = *(volatile uint32_t*) (mmap_reg + MT7628_GPIO_DATA + (dev->pin / 32) * 4);
+++ if (value & (uint32_t)(1 << (dev->pin % 32))) {
+++ return 1;
+++ }
+++ return 0;
+++}
+++
+++mraa_result_t
+++mraa_mtk_linkit_mmap_setup(mraa_gpio_context dev, mraa_boolean_t en)
+++{
+++ if (dev == NULL) {
+++ syslog(LOG_ERR, "linkit mmap: context not valid");
+++ return MRAA_ERROR_INVALID_HANDLE;
+++ }
+++
+++ if (en == 0) {
+++ if (dev->mmap_write == NULL && dev->mmap_read == NULL) {
+++ syslog(LOG_ERR, "linkit mmap: can't disable disabled mmap gpio");
+++ return MRAA_ERROR_INVALID_PARAMETER;
+++ }
+++ dev->mmap_write = NULL;
+++ dev->mmap_read = NULL;
+++ mmap_count--;
+++ if (mmap_count == 0) {
+++ return mraa_mtk_linkit_mmap_unsetup();
+++ }
+++ return MRAA_SUCCESS;
+++ }
+++
+++ if (dev->mmap_write != NULL && dev->mmap_read != NULL) {
+++ syslog(LOG_ERR, "linkit mmap: can't enable enabled mmap gpio");
+++ return MRAA_ERROR_INVALID_PARAMETER;
+++ }
+++
+++ // Might need to make some elements of this thread safe.
+++ // For example only allow one thread to enter the following block
+++ // to prevent mmap'ing twice.
+++ if (mmap_reg == NULL) {
+++ if ((mmap_fd = open(MMAP_PATH, O_RDWR)) < 0) {
+++ syslog(LOG_ERR, "linkit map: unable to open resource0 file");
+++ return MRAA_ERROR_INVALID_HANDLE;
+++ }
+++
+++ mmap_reg = (uint8_t*) mmap(NULL, MT7628_BLOCK_SIZE, PROT_READ | PROT_WRITE,
+++ MAP_FILE | MAP_SHARED, mmap_fd, MT7628_GPIO_BASE);
+++ if (mmap_reg == MAP_FAILED) {
+++ syslog(LOG_ERR, "linkit mmap: failed to mmap");
+++ mmap_reg = NULL;
+++ close(mmap_fd);
+++ return MRAA_ERROR_NO_RESOURCES;
+++ }
+++ }
+++ dev->mmap_write = &mraa_mtk_linkit_mmap_write;
+++ dev->mmap_read = &mraa_mtk_linkit_mmap_read;
+++ mmap_count++;
+++
+++ return MRAA_SUCCESS;
+++}
+++
+++mraa_board_t*
+++mraa_mtk_linkit()
+++{
+++ mraa_board_t* b = (mraa_board_t*) malloc(sizeof(mraa_board_t));
+++ if (b == NULL) {
+++ return NULL;
+++ }
+++
+++ b->platform_name = "LINKIT";
+++ platform_detected = PLATFORM_MEDIATEK_LINKIT;
+++ b->phy_pin_count = 31;
+++
+++ b->aio_count = 0;
+++ b->adc_raw = 0;
+++ b->adc_supported = 0;
+++ b->pwm_default_period = 500;
+++ b->pwm_max_period = 2147483;
+++ b->pwm_min_period = 1;
+++
+++ b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * b->phy_pin_count);
+++
+++ advance_func->gpio_mmap_setup = &mraa_mtk_linkit_mmap_setup;
+++
+++ strncpy(b->pins[0].name, "P0", MRAA_PIN_NAME_SIZE);
+++ b->pins[0].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
+++
+++ strncpy(b->pins[1].name, "P1", MRAA_PIN_NAME_SIZE);
+++ b->pins[1].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
+++
+++ strncpy(b->pins[2].name, "P2", MRAA_PIN_NAME_SIZE);
+++ b->pins[2].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
+++
+++ strncpy(b->pins[3].name, "P3", MRAA_PIN_NAME_SIZE);
+++ b->pins[3].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
+++
+++ strncpy(b->pins[4].name, "P4", MRAA_PIN_NAME_SIZE);
+++ b->pins[4].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
+++
+++ strncpy(b->pins[5].name, "P5", MRAA_PIN_NAME_SIZE);
+++ b->pins[5].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
+++
+++ strncpy(b->pins[6].name, "P6", MRAA_PIN_NAME_SIZE);
+++ b->pins[6].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
+++
+++ strncpy(b->pins[7].name, "P7", MRAA_PIN_NAME_SIZE);
+++ b->pins[7].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
+++
+++ strncpy(b->pins[8].name, "P8", MRAA_PIN_NAME_SIZE);
+++ b->pins[8].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
+++ b->pins[8].gpio.pinmap = 21;
+++ b->pins[8].uart.parent_id = 2;
+++ b->pins[8].uart.mux_total = 0;
+++
+++ strncpy(b->pins[9].name, "P9", MRAA_PIN_NAME_SIZE);
+++ b->pins[9].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
+++ b->pins[9].gpio.pinmap = 20;
+++ b->pins[9].uart.parent_id = 2;
+++ b->pins[9].uart.mux_total = 0;
+++
+++ strncpy(b->pins[10].name, "P10", MRAA_PIN_NAME_SIZE);
+++ b->pins[10].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[10].gpio.pinmap = 2;
+++
+++ strncpy(b->pins[11].name, "P11", MRAA_PIN_NAME_SIZE);
+++ b->pins[11].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[11].gpio.pinmap = 3;
+++
+++ strncpy(b->pins[12].name, "P12", MRAA_PIN_NAME_SIZE);
+++ b->pins[12].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[12].gpio.pinmap = 0;
+++
+++ strncpy(b->pins[13].name, "P13", MRAA_PIN_NAME_SIZE);
+++ b->pins[13].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[13].gpio.pinmap = 1;
+++
+++ strncpy(b->pins[14].name, "P14", MRAA_PIN_NAME_SIZE);
+++ b->pins[14].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
+++
+++ strncpy(b->pins[15].name, "P15", MRAA_PIN_NAME_SIZE);
+++ b->pins[15].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[15].gpio.pinmap = 44;
+++
+++ strncpy(b->pins[16].name, "P16", MRAA_PIN_NAME_SIZE);
+++ b->pins[16].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
+++ b->pins[16].gpio.pinmap = 46;
+++ b->pins[16].uart.parent_id = 1;
+++ b->pins[16].uart.mux_total = 0;
+++
+++ strncpy(b->pins[17].name, "P17", MRAA_PIN_NAME_SIZE);
+++ b->pins[17].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
+++ b->pins[17].gpio.pinmap = 45;
+++ b->pins[17].uart.parent_id = 1;
+++ b->pins[17].uart.mux_total = 0;
+++
+++ strncpy(b->pins[18].name, "P18", MRAA_PIN_NAME_SIZE);
+++ b->pins[18].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
+++ b->pins[18].gpio.pinmap = 13;
+++ b->pins[18].uart.parent_id = 1;
+++ b->pins[18].uart.mux_total = 0;
+++
+++ strncpy(b->pins[19].name, "P19", MRAA_PIN_NAME_SIZE);
+++ b->pins[19].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
+++ b->pins[19].gpio.pinmap = 12;
+++ b->pins[19].uart.parent_id = 0;
+++ b->pins[19].uart.mux_total = 0;
+++
+++ strncpy(b->pins[20].name, "P20", MRAA_PIN_NAME_SIZE);
+++ b->pins[20].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
+++ b->pins[20].gpio.pinmap = 5;
+++ b->pins[20].i2c.pinmap = 0;
+++ b->pins[20].i2c.mux_total = 0;
+++
+++ strncpy(b->pins[21].name, "P21", MRAA_PIN_NAME_SIZE);
+++ b->pins[21].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
+++ b->pins[21].gpio.pinmap = 4;
+++ b->pins[21].i2c.pinmap = 0;
+++ b->pins[21].i2c.mux_total = 0;
+++
+++ strncpy(b->pins[22].name, "P22", MRAA_PIN_NAME_SIZE);
+++ b->pins[22].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
+++ b->pins[22].gpio.pinmap = 8;
+++ b->pins[22].spi.pinmap = 0;
+++ b->pins[22].spi.mux_total = 0;
+++
+++ strncpy(b->pins[23].name, "P23", MRAA_PIN_NAME_SIZE);
+++ b->pins[23].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
+++ b->pins[23].gpio.pinmap = 9;
+++ b->pins[23].spi.pinmap = 0;
+++ b->pins[23].spi.mux_total = 0;
+++
+++ strncpy(b->pins[24].name, "P24", MRAA_PIN_NAME_SIZE);
+++ b->pins[24].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
+++ b->pins[24].gpio.pinmap = 7;
+++ b->pins[24].spi.pinmap = 0;
+++ b->pins[24].spi.mux_total = 0;
+++
+++ strncpy(b->pins[25].name, "P25", MRAA_PIN_NAME_SIZE);
+++ b->pins[25].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
+++ b->pins[25].gpio.pinmap = 6;
+++ b->pins[25].spi.pinmap = 0;
+++ b->pins[25].spi.mux_total = 0;
+++
+++ strncpy(b->pins[26].name, "P26", MRAA_PIN_NAME_SIZE);
+++ b->pins[26].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
+++ b->pins[26].gpio.pinmap = 18;
+++
+++ strncpy(b->pins[27].name, "P27", MRAA_PIN_NAME_SIZE);
+++ b->pins[27].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
+++ b->pins[27].gpio.pinmap = 19;
+++
+++ strncpy(b->pins[28].name, "P28", MRAA_PIN_NAME_SIZE);
+++ b->pins[28].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[28].gpio.pinmap = 16;
+++
+++ strncpy(b->pins[29].name, "P29", MRAA_PIN_NAME_SIZE);
+++ b->pins[29].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[29].gpio.pinmap = 17;
+++
+++ strncpy(b->pins[30].name, "P30", MRAA_PIN_NAME_SIZE);
+++ b->pins[30].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[30].gpio.pinmap = 14;
+++
+++ strncpy(b->pins[31].name, "P31", MRAA_PIN_NAME_SIZE);
+++ b->pins[31].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[31].gpio.pinmap = 15;
+++
+++ // BUS DEFINITIONS
+++ b->i2c_bus_count = 1;
+++ b->def_i2c_bus = 0;
+++ b->i2c_bus[0].bus_id = 0;
+++ b->i2c_bus[0].sda = 20;
+++ b->i2c_bus[0].scl = 21;
+++
+++ b->spi_bus_count = 1;
+++ b->def_spi_bus = 0;
+++ b->spi_bus[0].bus_id = 0;
+++ b->spi_bus[0].slave_s = 0;
+++ b->spi_bus[0].cs = 25;
+++ b->spi_bus[0].mosi = 22;
+++ b->spi_bus[0].miso = 23;
+++ b->spi_bus[0].sclk = 21;
+++
+++ b->uart_dev_count = 3;
+++ b->def_uart_dev = 0;
+++ b->uart_dev[0].rx = 18;
+++ b->uart_dev[0].tx = 19;
+++
+++ b->uart_dev[1].rx = 16;
+++ b->uart_dev[1].tx = 17;
+++
+++ b->uart_dev[2].rx = 9;
+++ b->uart_dev[2].tx = 8;
+++
+++ b->gpio_count = 0;
+++ int i;
+++ for (i = 0; i < b->phy_pin_count; i++) {
+++ if (b->pins[i].capabilites.gpio) {
+++ b->gpio_count++;
+++ }
+++ }
+++
+++ return b;
+++}
++--- /dev/null
+++++ b/src/mips/mips.c
++@@ -0,0 +1,60 @@
+++/*
+++ * Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
+++ * Author: Michael Ring <mail@michael-ring.org>
+++ * Copyright (c) 2014 Intel Corporation.
+++ *
+++ * 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:
+++ *
+++ * The above copyright notice and this permission notice shall be
+++ * included in all copies or substantial portions of the Software.
+++ *
+++ * 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.
+++ */
+++
+++#include <stdlib.h>
+++#include <string.h>
+++
+++#include "mraa_internal.h"
+++#include "mips/mediatek.h"
+++
+++mraa_platform_t
+++mraa_mips_platform()
+++{
+++ mraa_platform_t platform_type = MRAA_UNKNOWN_PLATFORM;
+++ size_t len = 100;
+++ char* line = malloc(len);
+++ FILE* fh = fopen("/proc/cpuinfo", "r");
+++ if (fh != NULL) {
+++ while (getline(&line, &len, fh) != -1) {
+++ if (strncmp(line, "machine", 7) == 0) {
+++ if (strstr(line, "MediaTek LinkIt Smart7688")) {
+++ platform_type = MRAA_MTK_LINKIT;
+++ }
+++ }
+++ }
+++ fclose(fh);
+++ }
+++ free(line);
+++
+++ switch (platform_type) {
+++ case MRAA_MTK_LINKIT:
+++ plat = mraa_mtk_linkit();
+++ break;
+++ default:
+++ plat = NULL;
+++ syslog(LOG_ERR, "Unknown Platform, currently not supported by MRAA");
+++ }
+++ return platform_type;
+++}
+diff --git a/feeds/packages/libs/libmraa/patches/0003-uart.patch b/feeds/packages/libs/libmraa/patches/0003-uart.patch
+new file mode 100644
+index 0000000..647abc5
+--- /dev/null
++++ b/feeds/packages/libs/libmraa/patches/0003-uart.patch
+@@ -0,0 +1,26 @@
++From 9540f9b93704e8e80ab2048954ca88d8e6eddf86 Mon Sep 17 00:00:00 2001
++From: John Crispin <blogic@openwrt.org>
++Date: Thu, 23 Jul 2015 16:43:42 +0200
++Subject: [PATCH 3/4] uart
++
++---
++ src/uart/uart.c | 3 +++
++ 1 file changed, 3 insertions(+)
++
++diff --git a/src/uart/uart.c b/src/uart/uart.c
++index 3ef55a4..5102f81 100644
++--- a/src/uart/uart.c
+++++ b/src/uart/uart.c
++@@ -34,6 +34,9 @@
++ #include "uart.h"
++ #include "mraa_internal.h"
++
+++#ifndef CMSPAR
+++#define CMSPAR 010000000000
+++#endif
++ // This function takes an unsigned int and converts it to a B* speed_t
++ // that can be used with linux/posix termios
++ static speed_t
++--
++1.7.10.4
++
+diff --git a/feeds/packages/libs/libmraa/patches/0004-fixes.patch b/feeds/packages/libs/libmraa/patches/0004-fixes.patch
+new file mode 100644
+index 0000000..40e5930
+--- /dev/null
++++ b/feeds/packages/libs/libmraa/patches/0004-fixes.patch
+@@ -0,0 +1,666 @@
++From 3c34e5f87a741ec2fc7809fc8c169a832275d32c Mon Sep 17 00:00:00 2001
++From: John Crispin <blogic@openwrt.org>
++Date: Thu, 23 Jul 2015 18:19:32 +0200
++Subject: [PATCH 4/4] fixes
++
++---
++ src/mips/mediatek.c | 6 +++++-
++ 1 file changed, 5 insertions(+), 1 deletion(-)
++
++--- a/src/mips/mediatek.c
+++++ b/src/mips/mediatek.c
++@@ -37,12 +37,12 @@
++ #define PLATFORM_MEDIATEK_LINKIT 1
++ #define PLATFORM_MEDIATEK_LINKIT_AIR 2
++ #define MMAP_PATH "/dev/mem"
++-#define MT7628_GPIO_BASE 0x100
++-#define MT7628_BLOCK_SIZE (4 * 1024)
++-#define MT7628_GPIO_CTRL 0x00
++-#define MT7628_GPIO_DATA 0x20
++-#define MT7628_GPIO_SET 0x30
++-#define MT7628_GPIO_CLEAR 0x40
+++#define MT7628_GPIOMODE_BASE 0x10000000
+++#define MT7628_BLOCK_SIZE 0x1000
+++#define MT7628_GPIO_CTRL 0x600
+++#define MT7628_GPIO_DATA 0x620
+++#define MT7628_GPIO_SET 0x630
+++#define MT7628_GPIO_CLEAR 0x640
++
++ #define MAX_SIZE 64
++
++@@ -50,6 +50,9 @@
++ static uint8_t* mmap_reg = NULL;
++ static int mmap_fd = 0;
++ static int mmap_size;
+++static uint8_t* gpio_mmap_reg = NULL;
+++static int gpio_mmap_fd = 0;
+++static int gpio_mmap_size;
++ static unsigned int mmap_count = 0;
++ static int platform_detected = 0;
++
++@@ -129,9 +132,10 @@
++ }
++
++ mmap_reg = (uint8_t*) mmap(NULL, MT7628_BLOCK_SIZE, PROT_READ | PROT_WRITE,
++- MAP_FILE | MAP_SHARED, mmap_fd, MT7628_GPIO_BASE);
+++ MAP_FILE | MAP_SHARED, mmap_fd, 0x10000000);
++ if (mmap_reg == MAP_FAILED) {
++- syslog(LOG_ERR, "linkit mmap: failed to mmap");
+++ perror("foo");
+++ syslog(LOG_ERR, "linkit mmap: failed to mmap");
++ mmap_reg = NULL;
++ close(mmap_fd);
++ return MRAA_ERROR_NO_RESOURCES;
++@@ -144,201 +148,442 @@
++ return MRAA_SUCCESS;
++ }
++
+++static int mmap_gpiomode(void)
+++{
+++ if ((gpio_mmap_fd = open(MMAP_PATH, O_RDWR)) < 0) {
+++ syslog(LOG_ERR, "linkit map: unable to open resource0 file");
+++ return MRAA_ERROR_INVALID_HANDLE;
+++ }
+++
+++ gpio_mmap_reg = (uint8_t*) mmap(NULL, MT7628_BLOCK_SIZE, PROT_READ | PROT_WRITE,
+++ MAP_FILE | MAP_SHARED, gpio_mmap_fd, MT7628_GPIOMODE_BASE);
+++ if (gpio_mmap_reg == MAP_FAILED) {
+++ syslog(LOG_ERR, "linkit gpio_mmap: failed to mmap");
+++ gpio_mmap_reg = NULL;
+++ close(gpio_mmap_fd);
+++ return MRAA_ERROR_NO_RESOURCES;
+++ }
+++ return 0;
+++}
+++
+++static void set_gpiomode(unsigned int mask, unsigned int shift, unsigned int val)
+++{
+++ unsigned int reg;
+++ unsigned int offset = 0x60;
+++
+++ if (shift >= 32) {
+++ shift -= 32;
+++ offset += 4;
+++ }
+++
+++ reg = *(volatile uint32_t*) (gpio_mmap_reg + offset);
+++
+++ reg &= ~(mask << shift);
+++ reg |= (val << shift);
+++ *(volatile uint32_t*) (gpio_mmap_reg + offset) = reg;
+++}
+++
+++enum {
+++ MUX_GPIO = 0,
+++ MUX_SPI_S,
+++ MUX_SPI_CS1,
+++ MUX_I2S,
+++ MUX_UART0,
+++ MUX_I2C,
+++ MUX_UART1,
+++ MUX_UART2,
+++ MUX_PWM0,
+++ MUX_PWM1,
+++ MUX_EPHY,
+++ MUX_WLED,
+++ __MUX_MAX,
+++};
+++
+++static unsigned char gpio_mux_groups[64];
+++static struct pinmux {
+++ char *name;
+++ char *func[4];
+++ unsigned int shift;
+++ unsigned int mask;
+++} mt7688_mux[] = {
+++ {
+++ .name = "refclk",
+++ .func = { "refclk", "gpio", NULL, NULL },
+++ .shift = 18,
+++ .mask = 0x1,
+++ }, {
+++ .name = "spi_s",
+++ .func = { "spi_s", "gpio", "utif", "pwm" },
+++ .shift = 2,
+++ .mask = 0x3,
+++ }, {
+++ .name = "spi_cs1",
+++ .func = { "spi_cs1", "gpio", NULL, "refclk" },
+++ .shift = 4,
+++ .mask = 0x3,
+++ }, {
+++ .name = "i2s",
+++ .func = { "i2s", "gpio", "pcm", NULL },
+++ .shift = 6,
+++ .mask = 0x3,
+++ }, {
+++ .name = "uart0",
+++ .func = { "uart", "gpio", NULL, NULL },
+++ .shift = 8,
+++ .mask = 0x3,
+++ }, {
+++ .name = "i2c",
+++ .func = { "i2c", "gpio", NULL, NULL },
+++ .shift = 20,
+++ .mask = 0x3,
+++ }, {
+++ .name = "uart1",
+++ .func = { "uart", "gpio", NULL, NULL },
+++ .shift = 24,
+++ .mask = 0x3,
+++ }, {
+++ .name = "uart2",
+++ .func = { "uart", "gpio", "pwm", NULL },
+++ .shift = 26,
+++ .mask = 0x3,
+++ }, {
+++ .name = "pwm0",
+++ .func = { "pwm", "gpio", NULL, NULL },
+++ .shift = 28,
+++ .mask = 0x3,
+++ }, {
+++ .name = "pwm1",
+++ .func = { "pwm", "gpio", NULL, NULL },
+++ .shift = 30,
+++ .mask = 0x3,
+++ }, {
+++ .name = "ephy",
+++ .func = { "ephy", "gpio", NULL, NULL },
+++ .shift = 34,
+++ .mask = 0x3,
+++ }, {
+++ .name = "wled",
+++ .func = { "wled", "gpio", NULL, NULL },
+++ .shift = 32,
+++ .mask = 0x3,
+++ },
+++};
+++
+++mraa_result_t gpio_init_pre(int pin)
+++{
+++ struct pinmux *m = &mt7688_mux[gpio_mux_groups[pin]];
+++
+++ set_gpiomode(m->mask, m->shift, 1);
+++
+++ return 0;
+++}
+++
+++static void gpiomode_set(unsigned int id, char *name)
+++{
+++ int i;
+++
+++ if (id >= __MUX_MAX)
+++ return;
+++
+++ for (i = 0; i < 4; i++) {
+++ if (!mt7688_mux[id].func[i] || strcmp(mt7688_mux[id].func[i], name))
+++ continue;
+++ set_gpiomode(mt7688_mux[id].mask, mt7688_mux[id].shift, i);
+++ syslog(0, "mraa: set pinmux %s -> %s\n", mt7688_mux[id].name, name);
+++ return;
+++ }
+++}
+++
+++mraa_result_t i2c_init_pre(unsigned int bus)
+++{
+++ gpiomode_set(MUX_I2C, "i2c");
+++ return 0;
+++}
+++
+++mraa_result_t
+++pwm_init_post(mraa_pwm_context pwm)
+++{
+++ switch(pwm->pin) {
+++ case 0:
+++ gpiomode_set(MUX_PWM0, "pwm");
+++ break;
+++ case 1:
+++ gpiomode_set(MUX_PWM1, "pwm");
+++ break;
+++ case 2:
+++ case 3:
+++ gpiomode_set(MUX_UART2, "pwm");
+++ break;
+++ }
+++ return 0;
+++}
+++
+++mraa_result_t spi_init_pre(int bus)
+++{
+++ gpiomode_set(MUX_SPI_CS1, "spi_cs1");
+++ return 0;
+++}
+++
+++mraa_result_t uart_init_pre(int index)
+++{
+++ switch(index) {
+++ case 0:
+++ gpiomode_set(MUX_UART0, "uart");
+++ break;
+++ case 1:
+++ gpiomode_set(MUX_UART1, "uart");
+++ break;
+++ case 2:
+++ gpiomode_set(MUX_UART2, "uart");
+++ break;
+++ }
+++ return 0;
+++}
+++
+++mraa_result_t
+++i2c_freq(mraa_i2c_context dev, mraa_i2c_mode_t mode)
+++{
+++ switch (mode) {
+++ case MRAA_I2C_STD:
+++ break;
+++ default:
+++ syslog(LOG_ERR, "Invalid i2c frequency");
+++ break;
+++ }
+++ return MRAA_SUCCESS;
+++}
+++
+++
++ mraa_board_t*
++ mraa_mtk_linkit()
++ {
+++ int i;
+++
+++ if (mmap_gpiomode())
+++ return NULL;
+++
++ mraa_board_t* b = (mraa_board_t*) malloc(sizeof(mraa_board_t));
++ if (b == NULL) {
++ return NULL;
++ }
++
++- b->platform_name = "LINKIT";
+++ memset(b, 0, sizeof(mraa_board_t));
+++
+++ b->platform_name = "LinkIt Smart 7688";
++ platform_detected = PLATFORM_MEDIATEK_LINKIT;
++- b->phy_pin_count = 31;
+++ b->phy_pin_count = 64;
++
++ b->aio_count = 0;
++ b->adc_raw = 0;
++ b->adc_supported = 0;
++ b->pwm_default_period = 500;
++- b->pwm_max_period = 2147483;
+++ b->pwm_max_period = 1000000;
++ b->pwm_min_period = 1;
++
++- b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * b->phy_pin_count);
++-
++- advance_func->gpio_mmap_setup = &mraa_mtk_linkit_mmap_setup;
++-
++- strncpy(b->pins[0].name, "P0", MRAA_PIN_NAME_SIZE);
++- b->pins[0].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
++-
++- strncpy(b->pins[1].name, "P1", MRAA_PIN_NAME_SIZE);
++- b->pins[1].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
++-
++- strncpy(b->pins[2].name, "P2", MRAA_PIN_NAME_SIZE);
++- b->pins[2].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
++-
++- strncpy(b->pins[3].name, "P3", MRAA_PIN_NAME_SIZE);
++- b->pins[3].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
++-
++- strncpy(b->pins[4].name, "P4", MRAA_PIN_NAME_SIZE);
++- b->pins[4].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
++-
++- strncpy(b->pins[5].name, "P5", MRAA_PIN_NAME_SIZE);
++- b->pins[5].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
++-
++- strncpy(b->pins[6].name, "P6", MRAA_PIN_NAME_SIZE);
++- b->pins[6].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
++-
++- strncpy(b->pins[7].name, "P7", MRAA_PIN_NAME_SIZE);
++- b->pins[7].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
++-
++- strncpy(b->pins[8].name, "P8", MRAA_PIN_NAME_SIZE);
++- b->pins[8].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
++- b->pins[8].gpio.pinmap = 21;
++- b->pins[8].uart.parent_id = 2;
++- b->pins[8].uart.mux_total = 0;
+++ b->adv_func = (mraa_adv_func_t*) calloc(1, sizeof(mraa_adv_func_t));
+++ if (b->adv_func == NULL) {
+++ return NULL;
+++ }
++
++- strncpy(b->pins[9].name, "P9", MRAA_PIN_NAME_SIZE);
++- b->pins[9].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
++- b->pins[9].gpio.pinmap = 20;
++- b->pins[9].uart.parent_id = 2;
++- b->pins[9].uart.mux_total = 0;
+++ b->adv_func->i2c_init_pre = i2c_init_pre;
+++ b->adv_func->pwm_init_post = pwm_init_post;
+++ b->adv_func->spi_init_pre = spi_init_pre;
+++ b->adv_func->uart_init_pre = uart_init_pre;
+++ b->adv_func->gpio_init_pre = gpio_init_pre;
+++ b->adv_func->i2c_set_frequency_replace = &i2c_freq;
++
++- strncpy(b->pins[10].name, "P10", MRAA_PIN_NAME_SIZE);
++- b->pins[10].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
++- b->pins[10].gpio.pinmap = 2;
+++ b->pins = (mraa_pininfo_t*) malloc(sizeof(mraa_pininfo_t) * b->phy_pin_count);
++
++- strncpy(b->pins[11].name, "P11", MRAA_PIN_NAME_SIZE);
++- b->pins[11].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
++- b->pins[11].gpio.pinmap = 3;
+++ memset(b->pins, 0, sizeof(mraa_pininfo_t) * b->phy_pin_count);
+++ memset(gpio_mux_groups, -1, sizeof(gpio_mux_groups));
++
++- strncpy(b->pins[12].name, "P12", MRAA_PIN_NAME_SIZE);
++- b->pins[12].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
++- b->pins[12].gpio.pinmap = 0;
+++ b->adv_func->gpio_mmap_setup = &mraa_mtk_linkit_mmap_setup;
++
++- strncpy(b->pins[13].name, "P13", MRAA_PIN_NAME_SIZE);
++- b->pins[13].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
++- b->pins[13].gpio.pinmap = 1;
+++ for (i = 0; i < b->phy_pin_count; i++) {
+++ snprintf(b->pins[i].name, MRAA_PIN_NAME_SIZE, "GPIO%d", i);
+++ b->pins[i].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
+++ }
++
++- strncpy(b->pins[14].name, "P14", MRAA_PIN_NAME_SIZE);
++- b->pins[14].capabilites = (mraa_pincapabilities_t){ 0, 0, 0, 0, 0, 0, 0, 0 };
+++ strncpy(b->pins[43].name, "GPIO43", MRAA_PIN_NAME_SIZE);
+++ b->pins[43].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[43].gpio.pinmap = 43;
+++ gpio_mux_groups[43] = MUX_EPHY;
+++
+++ strncpy(b->pins[20].name, "GPIO20", MRAA_PIN_NAME_SIZE);
+++ b->pins[20].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 1 };
+++ b->pins[20].gpio.pinmap = 20;
+++ b->pins[20].uart.parent_id = 2;
+++ b->pins[20].uart.mux_total = 0;
+++ b->pins[20].pwm.parent_id = 0;
+++ b->pins[20].pwm.pinmap = 2;
+++ gpio_mux_groups[20] = MUX_UART2;
+++
+++ strncpy(b->pins[21].name, "GPIO21", MRAA_PIN_NAME_SIZE);
+++ b->pins[21].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 1 };
+++ b->pins[21].gpio.pinmap = 21;
+++ b->pins[21].uart.parent_id = 2;
+++ b->pins[21].uart.mux_total = 0;
+++ b->pins[21].pwm.parent_id = 0;
+++ b->pins[21].pwm.pinmap = 3;
+++ gpio_mux_groups[21] = MUX_UART2;
+++
+++ strncpy(b->pins[2].name, "GPIO2", MRAA_PIN_NAME_SIZE);
+++ b->pins[2].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[2].gpio.pinmap = 2;
+++ gpio_mux_groups[2] = MUX_I2S;
+++
+++ strncpy(b->pins[3].name, "GPIO3", MRAA_PIN_NAME_SIZE);
+++ b->pins[3].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[3].gpio.pinmap = 3;
+++ gpio_mux_groups[3] = MUX_I2S;
+++
+++ strncpy(b->pins[0].name, "GPIO0", MRAA_PIN_NAME_SIZE);
+++ b->pins[0].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[0].gpio.pinmap = 0;
+++ gpio_mux_groups[0] = MUX_I2S;
+++
+++ strncpy(b->pins[1].name, "GPIO1", MRAA_PIN_NAME_SIZE);
+++ b->pins[1].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[1].gpio.pinmap = 1;
+++ gpio_mux_groups[1] = MUX_I2S;
+++
+++ strncpy(b->pins[37].name, "GPIO37", MRAA_PIN_NAME_SIZE);
+++ b->pins[37].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[37].gpio.pinmap = 37;
+++ gpio_mux_groups[37] = MUX_GPIO;
+++
+++ strncpy(b->pins[44].name, "GPIO44", MRAA_PIN_NAME_SIZE);
+++ b->pins[44].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[44].gpio.pinmap = 44;
+++ gpio_mux_groups[44] = MUX_WLED;
+++
+++ strncpy(b->pins[46].name, "GPIO46", MRAA_PIN_NAME_SIZE);
+++ b->pins[46].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
+++ b->pins[46].gpio.pinmap = 46;
+++ b->pins[46].uart.parent_id = 1;
+++ b->pins[46].uart.mux_total = 0;
+++ gpio_mux_groups[46] = MUX_UART1;
+++
+++ strncpy(b->pins[45].name, "GPIO45", MRAA_PIN_NAME_SIZE);
+++ b->pins[45].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
+++ b->pins[45].gpio.pinmap = 45;
+++ b->pins[45].uart.parent_id = 1;
+++ b->pins[45].uart.mux_total = 0;
+++ gpio_mux_groups[45] = MUX_UART1;
+++
+++ strncpy(b->pins[13].name, "GPIO13", MRAA_PIN_NAME_SIZE);
+++ b->pins[13].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
+++ b->pins[13].gpio.pinmap = 13;
+++ b->pins[13].uart.parent_id = 1;
+++ b->pins[13].uart.mux_total = 0;
+++ gpio_mux_groups[13] = MUX_UART0;
+++
+++ strncpy(b->pins[12].name, "GPIO12", MRAA_PIN_NAME_SIZE);
+++ b->pins[12].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
+++ b->pins[12].gpio.pinmap = 12;
+++ b->pins[12].uart.parent_id = 0;
+++ b->pins[12].uart.mux_total = 0;
+++ gpio_mux_groups[12] = MUX_UART0;
+++
+++ strncpy(b->pins[5].name, "GPIO5", MRAA_PIN_NAME_SIZE);
+++ b->pins[5].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
+++ b->pins[5].gpio.pinmap = 5;
+++ b->pins[5].i2c.pinmap = 0;
+++ b->pins[5].i2c.mux_total = 0;
+++ gpio_mux_groups[5] = MUX_I2C;
+++
+++ strncpy(b->pins[4].name, "GPIO4", MRAA_PIN_NAME_SIZE);
+++ b->pins[4].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
+++ b->pins[4].gpio.pinmap = 4;
+++ b->pins[4].i2c.pinmap = 0;
+++ b->pins[4].i2c.mux_total = 0;
+++ gpio_mux_groups[4] = MUX_I2C;
+++
+++ strncpy(b->pins[6].name, "GPIO6", MRAA_PIN_NAME_SIZE);
+++ b->pins[6].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
+++ b->pins[6].gpio.pinmap = 6;
+++ b->pins[6].spi.pinmap = 0;
+++ b->pins[6].spi.mux_total = 0;
+++ gpio_mux_groups[6] = MUX_SPI_CS1;
+++
+++ strncpy(b->pins[7].name, "GPIO7", MRAA_PIN_NAME_SIZE);
+++ b->pins[7].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
+++ b->pins[7].spi.pinmap = 0;
+++ b->pins[7].spi.mux_total = 0;
+++
+++ strncpy(b->pins[8].name, "GPIO8", MRAA_PIN_NAME_SIZE);
+++ b->pins[8].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
+++ b->pins[8].spi.pinmap = 0;
+++ b->pins[8].spi.mux_total = 0;
+++
+++ strncpy(b->pins[9].name, "GPIO9", MRAA_PIN_NAME_SIZE);
+++ b->pins[9].capabilites = (mraa_pincapabilities_t){ 1, 0, 0, 0, 1, 0, 0, 0 };
+++ b->pins[9].spi.pinmap = 0;
+++ b->pins[9].spi.mux_total = 0;
+++
+++ strncpy(b->pins[18].name, "GPIO18", MRAA_PIN_NAME_SIZE);
+++ b->pins[18].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
+++ b->pins[18].gpio.pinmap = 18;
+++ b->pins[18].pwm.parent_id = 0;
+++ b->pins[18].pwm.pinmap = 0;
+++ gpio_mux_groups[18] = MUX_PWM0;
+++
+++ strncpy(b->pins[19].name, "GPIO19", MRAA_PIN_NAME_SIZE);
+++ b->pins[19].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
+++ b->pins[19].gpio.pinmap = 19;
+++ b->pins[19].pwm.parent_id = 0;
+++ b->pins[19].pwm.pinmap = 1;
+++ gpio_mux_groups[19] = MUX_PWM1;
+++
+++ strncpy(b->pins[16].name, "GPIO16", MRAA_PIN_NAME_SIZE);
+++ b->pins[16].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[16].gpio.pinmap = 16;
+++ gpio_mux_groups[16] = MUX_SPI_S;
+++
+++ strncpy(b->pins[17].name, "GPIO17", MRAA_PIN_NAME_SIZE);
+++ b->pins[17].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[17].gpio.pinmap = 17;
+++ gpio_mux_groups[17] = MUX_SPI_S;
+++
+++ strncpy(b->pins[14].name, "GPIO14", MRAA_PIN_NAME_SIZE);
+++ b->pins[14].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
+++ b->pins[14].gpio.pinmap = 14;
+++ gpio_mux_groups[14] = MUX_SPI_S;
++
++- strncpy(b->pins[15].name, "P15", MRAA_PIN_NAME_SIZE);
+++ strncpy(b->pins[15].name, "GPIO15", MRAA_PIN_NAME_SIZE);
++ b->pins[15].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
++- b->pins[15].gpio.pinmap = 44;
++-
++- strncpy(b->pins[16].name, "P16", MRAA_PIN_NAME_SIZE);
++- b->pins[16].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
++- b->pins[16].gpio.pinmap = 46;
++- b->pins[16].uart.parent_id = 1;
++- b->pins[16].uart.mux_total = 0;
++-
++- strncpy(b->pins[17].name, "P17", MRAA_PIN_NAME_SIZE);
++- b->pins[17].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
++- b->pins[17].gpio.pinmap = 45;
++- b->pins[17].uart.parent_id = 1;
++- b->pins[17].uart.mux_total = 0;
++-
++- strncpy(b->pins[18].name, "P18", MRAA_PIN_NAME_SIZE);
++- b->pins[18].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
++- b->pins[18].gpio.pinmap = 13;
++- b->pins[18].uart.parent_id = 1;
++- b->pins[18].uart.mux_total = 0;
++-
++- strncpy(b->pins[19].name, "P19", MRAA_PIN_NAME_SIZE);
++- b->pins[19].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 1 };
++- b->pins[19].gpio.pinmap = 12;
++- b->pins[19].uart.parent_id = 0;
++- b->pins[19].uart.mux_total = 0;
++-
++- strncpy(b->pins[20].name, "P20", MRAA_PIN_NAME_SIZE);
++- b->pins[20].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
++- b->pins[20].gpio.pinmap = 5;
++- b->pins[20].i2c.pinmap = 0;
++- b->pins[20].i2c.mux_total = 0;
++-
++- strncpy(b->pins[21].name, "P21", MRAA_PIN_NAME_SIZE);
++- b->pins[21].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 1, 0, 0 };
++- b->pins[21].gpio.pinmap = 4;
++- b->pins[21].i2c.pinmap = 0;
++- b->pins[21].i2c.mux_total = 0;
++-
++- strncpy(b->pins[22].name, "P22", MRAA_PIN_NAME_SIZE);
++- b->pins[22].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
++- b->pins[22].gpio.pinmap = 8;
++- b->pins[22].spi.pinmap = 0;
++- b->pins[22].spi.mux_total = 0;
++-
++- strncpy(b->pins[23].name, "P23", MRAA_PIN_NAME_SIZE);
++- b->pins[23].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
++- b->pins[23].gpio.pinmap = 9;
++- b->pins[23].spi.pinmap = 0;
++- b->pins[23].spi.mux_total = 0;
++-
++- strncpy(b->pins[24].name, "P24", MRAA_PIN_NAME_SIZE);
++- b->pins[24].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
++- b->pins[24].gpio.pinmap = 7;
++- b->pins[24].spi.pinmap = 0;
++- b->pins[24].spi.mux_total = 0;
++-
++- strncpy(b->pins[25].name, "P25", MRAA_PIN_NAME_SIZE);
++- b->pins[25].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 1, 0, 0, 0 };
++- b->pins[25].gpio.pinmap = 6;
++- b->pins[25].spi.pinmap = 0;
++- b->pins[25].spi.mux_total = 0;
++-
++- strncpy(b->pins[26].name, "P26", MRAA_PIN_NAME_SIZE);
++- b->pins[26].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
++- b->pins[26].gpio.pinmap = 18;
++-
++- strncpy(b->pins[27].name, "P27", MRAA_PIN_NAME_SIZE);
++- b->pins[27].capabilites = (mraa_pincapabilities_t){ 1, 1, 1, 0, 0, 0, 0, 0 };
++- b->pins[27].gpio.pinmap = 19;
++-
++- strncpy(b->pins[28].name, "P28", MRAA_PIN_NAME_SIZE);
++- b->pins[28].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
++- b->pins[28].gpio.pinmap = 16;
++-
++- strncpy(b->pins[29].name, "P29", MRAA_PIN_NAME_SIZE);
++- b->pins[29].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
++- b->pins[29].gpio.pinmap = 17;
++-
++- strncpy(b->pins[30].name, "P30", MRAA_PIN_NAME_SIZE);
++- b->pins[30].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
++- b->pins[30].gpio.pinmap = 14;
++-
++- strncpy(b->pins[31].name, "P31", MRAA_PIN_NAME_SIZE);
++- b->pins[31].capabilites = (mraa_pincapabilities_t){ 1, 1, 0, 0, 0, 0, 0, 0 };
++- b->pins[31].gpio.pinmap = 15;
+++ b->pins[15].gpio.pinmap = 15;
+++ gpio_mux_groups[15] = MUX_SPI_S;
++
++ // BUS DEFINITIONS
++ b->i2c_bus_count = 1;
++ b->def_i2c_bus = 0;
++- b->i2c_bus[0].bus_id = 0;
++- b->i2c_bus[0].sda = 20;
++- b->i2c_bus[0].scl = 21;
+++ b->i2c_bus[0].bus_id = 0;
+++ b->i2c_bus[0].sda = 5;
+++ b->i2c_bus[0].scl = 4;
++
++ b->spi_bus_count = 1;
++ b->def_spi_bus = 0;
++- b->spi_bus[0].bus_id = 0;
++- b->spi_bus[0].slave_s = 0;
++- b->spi_bus[0].cs = 25;
++- b->spi_bus[0].mosi = 22;
++- b->spi_bus[0].miso = 23;
++- b->spi_bus[0].sclk = 21;
+++ b->spi_bus[0].bus_id = 32766;
+++ b->spi_bus[0].slave_s = 1;
+++ b->spi_bus[0].cs = 6;
+++ b->spi_bus[0].mosi = 8;
+++ b->spi_bus[0].miso = 9;
+++ b->spi_bus[0].sclk = 7;
++
++ b->uart_dev_count = 3;
++ b->def_uart_dev = 0;
++- b->uart_dev[0].rx = 18;
++- b->uart_dev[0].tx = 19;
++-
++- b->uart_dev[1].rx = 16;
++- b->uart_dev[1].tx = 17;
++-
++- b->uart_dev[2].rx = 9;
++- b->uart_dev[2].tx = 8;
+++ b->uart_dev[0].rx = 13;
+++ b->uart_dev[0].tx = 12;
+++ b->uart_dev[0].device_path = "/dev/ttyS0";
+++ b->uart_dev[1].rx = 46;
+++ b->uart_dev[1].tx = 45;
+++ b->uart_dev[1].device_path = "/dev/ttyS1";
+++ b->uart_dev[2].rx = 21;
+++ b->uart_dev[2].tx = 20;
+++ b->uart_dev[2].device_path = "/dev/ttyS2";
++
++ b->gpio_count = 0;
++- int i;
++ for (i = 0; i < b->phy_pin_count; i++) {
++ if (b->pins[i].capabilites.gpio) {
++ b->gpio_count++;
++--- a/src/gpio/gpio.c
+++++ b/src/gpio/gpio.c
++@@ -113,6 +113,8 @@
++ close(export);
++ }
++
+++ mraa_gpio_use_mmaped(dev, 1);
+++
++ init_internal_cleanup:
++ if (status != MRAA_SUCCESS) {
++ if (dev != NULL)
+diff --git a/feeds/packages/libs/libnatpmp/Makefile b/feeds/packages/libs/libnatpmp/Makefile
+new file mode 100644
+index 0000000..f90d9bc
+--- /dev/null
++++ b/feeds/packages/libs/libnatpmp/Makefile
+@@ -0,0 +1,87 @@
++#
++# Copyright (C) 2011-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libnatpmp
++PKG_VERSION:=20140401
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://miniupnp.free.fr/files
++PKG_MD5SUM:=7c9a7c76e200ead4e6447fe4b105f676
++PKG_MAINTAINER:=Hauke Mehrtens <hauke@hauke-m.de>
++PKG_LICENSE:=BSD-3c
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libnatpmp/Default
++ TITLE:=NAT Port Mapping Protocol (NAT-PMP)
++ URL:=http://miniupnp.free.fr/libnatpmp.html
++endef
++
++define Package/libnatpmp/Default/description
++ libnatpmp is an attempt to make a portable and fully compliant implementation
++ of the protocol for the client side. It is based on non blocking sockets and
++ all calls of the API are asynchronous. It is therefore very easy to integrate
++ the NAT-PMP code to any event driven code.
++endef
++
++define Package/libnatpmp
++ $(call Package/libnatpmp/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= library
++endef
++
++define Package/libnatpmp/description
++ $(call Package/libnatpmp/Default/description)
++ This package contains the shared library.
++endef
++
++define Package/natpmpc
++ $(call Package/libnatpmp/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Firewall
++ TITLE+= client
++ DEPENDS:=+libnatpmp
++endef
++
++define Package/natpmpc/description
++ $(call Package/libnatpmp/Default/description)
++ This package contains the natpmp client.
++endef
++
++MAKE_FLAGS += \
++ COPTS="$(TARGET_CFLAGS)" \
++ PREFIX="$(PKG_INSTALL_DIR)" \
++ OS="Linux"
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/declspec.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/natpmp.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnatpmp*.{so*,a} $(1)/usr/lib/
++endef
++
++define Package/libnatpmp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/libnatpmp.so.* $(1)/usr/lib/
++endef
++
++define Package/natpmpc/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/natpmpc $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libnatpmp))
++$(eval $(call BuildPackage,natpmpc))
+diff --git a/feeds/packages/libs/libnatpmp/patches/001-install_declspec.patch b/feeds/packages/libs/libnatpmp/patches/001-install_declspec.patch
+new file mode 100644
+index 0000000..d79dd3f
+--- /dev/null
++++ b/feeds/packages/libs/libnatpmp/patches/001-install_declspec.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -56,7 +56,7 @@ else
++ endif
++ endif
++
++-HEADERS = natpmp.h
+++HEADERS = natpmp.h declspec.h
++
++ EXECUTABLES = testgetgateway natpmpc-shared natpmpc-static
++
+diff --git a/feeds/packages/libs/libnet-1.2.x/Makefile b/feeds/packages/libs/libnet-1.2.x/Makefile
+new file mode 100644
+index 0000000..a791163
+--- /dev/null
++++ b/feeds/packages/libs/libnet-1.2.x/Makefile
+@@ -0,0 +1,71 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libnet
++PKG_VERSION:=1.2-rc3
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://sourceforge.net/projects/libnet-dev/files/
++PKG_MD5SUM:=f051e6e5bdecddb90f77c701c2ca1804
++PKG_MAINTAINER:=Mislav Novakovic <mislav.novakovic@sartura.hr>
++PKG_LICENSE:=GPL-2.0
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS += $(FPIC)
++
++define Package/libnet-1.2.x
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libpcap
++ TITLE:=Low-level packet creation library
++endef
++
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static
++
++CONFIGURE_VARS += \
++ ac_cv_libnet_endianess=$(ENDIANESS) \
++ ac_libnet_have_pf_packet=yes \
++ LL_INT_TYPE=libnet_link_linux
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); touch \
++ configure.in \
++ include.m4 \
++ aclocal.m4 \
++ Makefile.in \
++ );
++ $(call Build/Configure/Default)
++endef
++
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/lib/libnet-1.2.x/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libnet.h $(STAGING_DIR)/usr/lib/libnet-1.2.x/include
++
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/lib/libnet-1.2.x/include/libnet
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libnet/libnet-*.h $(STAGING_DIR)/usr/lib/libnet-1.2.x/include/libnet
++
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/lib/libnet-1.2.x/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnet.{a,la,so*} $(STAGING_DIR)/usr/lib/libnet-1.2.x/lib
++endef
++
++define Package/libnet-1.2.x/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnet.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libnet-1.2.x))
+diff --git a/feeds/packages/libs/libnet-1.2.x/patches/100-musl-compat.patch b/feeds/packages/libs/libnet-1.2.x/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..b95366a
+--- /dev/null
++++ b/feeds/packages/libs/libnet-1.2.x/patches/100-musl-compat.patch
+@@ -0,0 +1,16 @@
++--- a/src/libnet_link_linux.c
+++++ b/src/libnet_link_linux.c
++@@ -30,13 +30,8 @@
++ #include <sys/time.h>
++
++ #include <net/if.h>
++-#if (__GLIBC__)
++ #include <netinet/if_ether.h>
++ #include <net/if_arp.h>
++-#else
++-#include <linux/if_arp.h>
++-#include <linux/if_ether.h>
++-#endif
++
++ #if (HAVE_PACKET_SOCKET)
++ #ifndef SOL_PACKET
+diff --git a/feeds/packages/libs/libnetfilter-acct/Makefile b/feeds/packages/libs/libnetfilter-acct/Makefile
+new file mode 100644
+index 0000000..8926607
+--- /dev/null
++++ b/feeds/packages/libs/libnetfilter-acct/Makefile
+@@ -0,0 +1,70 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libnetfilter_acct
++PKG_VERSION:=1.0.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:= \
++ http://www.netfilter.org/projects/libnetfilter_acct/files/ \
++ ftp://ftp.netfilter.org/pub/libnetfilter_acct/ \
++ http://mirrors.evolva.ro/netfilter.org/libnetfilter_acct/
++PKG_MD5SUM:=2118d9514c079839ebd9cb3144ad2ad7
++
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libnetfilter-acct
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=API to extended accounting infrastructure
++ URL:=http://www.netfilter.org/projects/libnetfilter_acct/
++ DEPENDS:=+libmnl
++endef
++
++define Package/libnetfilter-acct/description
++ libnetfilter_acct is a userspace library providing a programming interface
++ (API) to the extended accounting infrastructure.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-static \
++ --enable-shared \
++
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/libnetfilter_acct \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libnetfilter_acct*.{so*,a,la} \
++ $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libnetfilter_acct.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libnetfilter-acct/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnetfilter_acct.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libnetfilter-acct))
+diff --git a/feeds/packages/libs/libnfc/Makefile b/feeds/packages/libs/libnfc/Makefile
+new file mode 100644
+index 0000000..9a144d2
+--- /dev/null
++++ b/feeds/packages/libs/libnfc/Makefile
+@@ -0,0 +1,98 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libnfc
++PKG_VERSION:=1.7.1
++PKG_RELEASE:=1
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://code.google.com/p/libnfc/
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_LICENSE:=LGPL-2.1
++PKG_MAINTAINER:=Sebastian Wendel <packages@sourceindex.de>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libnfc/Default
++ TITLE:=A open source library for Near Field Communication (NFC)
++ URL:=http://nfc-tools.org/
++endef
++
++define Package/libnfc
++ $(call Package/libnfc/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libusb-compat +pcscd +ccid
++endef
++
++define Package/libnfc/description
++ libnfc is the first libre, platform-independent, low level NFC SDK and Programmers API
++
++ * manipulate Jewel Topaz tags using libnfc
++ * manipulate MIFARE Classic and Ultralight tags using libnfc
++
++endef
++
++define Package/nfc-utils
++ $(call Package/libnfc/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libnfc
++endef
++
++define Package/nfc-utils/description
++ Provide some examples shared functions like print, parity calculation, options parsing
++
++ * Emulates a NFC Forum Tag Type 4 v2.0 (or v1.0)
++ * Jewel dump/restore tool
++ * Lists the first target present of each founded device
++ * MIFARE Classic manipulation example
++ * MIFARE Ultralight dump/restore tool
++ * Extract NDEF Message from a NFC Forum Tag Type 3
++ * Relay example using two PN532 devices
++ * Lists each available NFC device
++
++endef
++
++TARGET_CFLAGS+=$(FPIC)
++CONFIGURE_ARGS+=--without-readline
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/nfc $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnfc.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libnfc.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libnfc/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnfc.so.* $(1)/usr/lib/
++endef
++
++define Package/nfc-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/nfc-emulate-forum-tag4 $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/nfc-jewel $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/nfc-list $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/nfc-mfclassic $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/nfc-mfultralight $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/nfc-read-forum-tag3 $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/nfc-relay-picc $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/nfc-scan-device $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libnfc))
++$(eval $(call BuildPackage,nfc-utils))
+diff --git a/feeds/packages/libs/libogg/Makefile b/feeds/packages/libs/libogg/Makefile
+new file mode 100644
+index 0000000..e5be952
+--- /dev/null
++++ b/feeds/packages/libs/libogg/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2008-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libogg
++PKG_VERSION:=1.3.2
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://downloads.xiph.org/releases/ogg/
++PKG_MD5SUM:=5c3a34309d8b98640827e5d0991a4015
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libogg
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libogg
++ URL:=http://xiph.org/ogg/
++endef
++
++define Package/libogg/description
++Ogg project codecs use the Ogg bitstream format to arrange the raw,
++compressed bitstream into a more robust, useful form. For example,
++the Ogg bitstream makes seeking, time stamping and error recovery
++possible, as well as mixing several sepearate, concurrent media
++streams into a single physical bitstream.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/ogg/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/ogg/* $(1)/usr/include/ogg/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{so*,a,la} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DIR) $(1)/usr/share/aclocal/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/aclocal/* $(1)/usr/share/aclocal/
++endef
++
++define Package/libogg/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libogg))
+diff --git a/feeds/packages/libs/liboil/Makefile b/feeds/packages/libs/liboil/Makefile
+new file mode 100644
+index 0000000..8850c74
+--- /dev/null
++++ b/feeds/packages/libs/liboil/Makefile
+@@ -0,0 +1,70 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=liboil
++PKG_VERSION:=0.3.17
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://liboil.freedesktop.org/download/
++PKG_MD5SUM:=47dc734f82faeb2964d97771cfd2e701
++
++PKG_LICENSE:=FREE
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/liboil
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=simple functions optimized for various CPUs
++ URL:=http://liboil.freedesktop.org/wiki/
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++ DEPENDS:=+librt $(ICONV_DEPENDS) $(INTL_DEPENDS)
++endef
++
++define Package/liboil/description
++ Liboil is a library of simple functions that are optimized for various CPUs.
++ These functions are generally loops implementing simple algorithms, such as
++ converting an array of N integers to floating-point numbers or multiplying
++ and summing an array of N numbers. Such functions are candidates for significant
++ optimization using various techniques, especially by using extended instructions
++ provided by modern CPUs (Altivec, MMX, SSE, etc.).
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++TARGET_CFLAGS += $(FPIC) $(if $(ICONV_FULL),-liconv) $(if $(INTL_FULL),-lintl)
++
++# XXX: VFP_CFLAGS is set to '-mfpu=vfp' on arm by configure, but that breaks
++# final linking stages, so override it until we find why
++MAKE_FLAGS += \
++ VFP_CFLAGS="" \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/liboil-0.3/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liboil-0.3.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/liboil-0.3.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/liboil/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liboil-0.3.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,liboil))
+diff --git a/feeds/packages/libs/liboping/Makefile b/feeds/packages/libs/liboping/Makefile
+new file mode 100644
+index 0000000..54b4547
+--- /dev/null
++++ b/feeds/packages/libs/liboping/Makefile
+@@ -0,0 +1,84 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=liboping
++PKG_VERSION:=1.6.2
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++PKG_LICENSE:=GPL-2.0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://verplant.org/liboping/files
++PKG_MD5SUM:=64a6f31310093d2517cfe7f05aa011e0
++
++PKG_FIXUP:=autoreconf
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/liboping/Default
++ URL:=http://verplant.org/liboping/
++endef
++
++define Package/liboping
++$(call Package/liboping/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=C library to generate ICMP echo requests.
++endef
++
++define Package/oping
++$(call Package/liboping/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Send ICMP echo request to network hosts
++ DEPENDS+= +liboping
++endef
++
++define Package/noping
++$(call Package/liboping/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Ncurses application to send ICMP echo request to network hosts
++ DEPENDS+= +liboping +libncurses
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --without-perl-bindings \
++ --enable-shared \
++ --enable-static
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/oping.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liboping.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/liboping/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liboping.so.* $(1)/usr/lib/
++endef
++
++define Package/oping/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/oping $(1)/usr/bin/
++endef
++
++define Package/noping/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/noping $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,liboping))
++$(eval $(call BuildPackage,oping))
++$(eval $(call BuildPackage,noping))
+diff --git a/feeds/packages/libs/liboping/patches/01-no-werror.patch b/feeds/packages/libs/liboping/patches/01-no-werror.patch
+new file mode 100644
+index 0000000..8589284
+--- /dev/null
++++ b/feeds/packages/libs/liboping/patches/01-no-werror.patch
+@@ -0,0 +1,11 @@
++--- a/src/Makefile.am
+++++ b/src/Makefile.am
++@@ -3,7 +3,7 @@ AUTOMAKE_OPTIONS = foreign no-dependenci
++ SUBDIRS = mans
++
++ if COMPILER_IS_GCC
++-AM_CFLAGS = -Wall -Werror
+++AM_CFLAGS = -Wall
++ endif
++
++ include_HEADERS = oping.h
+diff --git a/feeds/packages/libs/libowfat/Makefile b/feeds/packages/libs/libowfat/Makefile
+new file mode 100644
+index 0000000..01bd25a
+--- /dev/null
++++ b/feeds/packages/libs/libowfat/Makefile
+@@ -0,0 +1,61 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++LOWFAT_VERSION=0.30
++
++PKG_NAME:=libowfat
++PKG_VERSION:=$(LOWFAT_VERSION)
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.fefe.de/libowfat
++PKG_MD5SUM:=f0119532ea834ce9e80afe49d7d85512
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++# set to 1 to enable debugging
++DEBUG=
++
++define Package/libowfat
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=reimplemented libdjb under GPL
++ URL:=http://www.fefe.de/libowfat/
++endef
++
++define Build/Configure
++endef
++
++TARGET_CFLAGS += $(FPIC)
++LOWFAT_MAKEOPTS = $(TARGET_CONFIGURE_OPTS) \
++ CFLAGS="$(TARGET_CFLAGS) -I$(PKG_BUILD_DIR) -I$(STAGING_DIR)/usr/include" \
++ DEBUG="$(DEBUG)" \
++ VERSION="$(LOWFAT_VERSION)" \
++ OS="Linux"
++
++# work around a nasty gcc bug
++ifneq ($(CONFIG_GCC_VERSION_4_2_4),)
++ LOWFAT_MAKEOPTS += WOPTS=""
++endif
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) $(LOWFAT_MAKEOPTS)
++endef
++
++define Build/InstallDev
++ mkdir -p $(1)/usr/include/libowfat
++ $(CP) $(PKG_BUILD_DIR)/*.h $(1)/usr/include/libowfat
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/*.a $(1)/usr/lib
++endef
++
++$(eval $(call BuildPackage,libowfat))
+diff --git a/feeds/packages/libs/libowfat/patches/001-fixbuild.patch b/feeds/packages/libs/libowfat/patches/001-fixbuild.patch
+new file mode 100644
+index 0000000..a21fcd0
+--- /dev/null
++++ b/feeds/packages/libs/libowfat/patches/001-fixbuild.patch
+@@ -0,0 +1,11 @@
++--- a/GNUmakefile
+++++ b/GNUmakefile
++@@ -278,6 +278,8 @@ socket_accept4.o socket_accept6.o socket
++ socket_local6.o socket_recv4.o socket_recv6.o socket_remote4.o \
++ socket_remote6.o: havesl.h
++
+++socket_remote4.o: havescope.h
+++
++ dns_nd6.o fmt_xlong.o scan_xlong.o fmt_ip6_flat.o $(TEXTCODE_OBJS): haveinline.h
++
++ iob_send.o scan_ip6if.o: havealloca.h
+diff --git a/feeds/packages/libs/libp11/Makefile b/feeds/packages/libs/libp11/Makefile
+new file mode 100644
+index 0000000..c64f79c
+--- /dev/null
++++ b/feeds/packages/libs/libp11/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2011-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libp11
++PKG_VERSION:=20141217
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/OpenSC/libp11.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=9f433022a039bbdf31f6c334f442ac3494ac4a07
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_FIXUP:=libtool
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libp11
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=PKCS#11 wrapper library
++ URL:=https://www.opensc-project.org/opensc/wiki/libp11
++ DEPENDS:=+libopenssl
++endef
++
++define Package/libp11/description
++ Libp11 is a library implementing a small layer on top of PKCS#11 API
++ to make using PKCS#11 implementations easier.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libp11.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libp11.{a,so} $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libp11.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libp11.pc $(1)/usr/lib/pkgconfig/libp11.pc
++endef
++
++define Package/libp11/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libp11.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libp11))
+diff --git a/feeds/packages/libs/libpam/Makefile b/feeds/packages/libs/libpam/Makefile
+new file mode 100644
+index 0000000..ee9ecc6
+--- /dev/null
++++ b/feeds/packages/libs/libpam/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libpam
++PKG_VERSION:=1.2.0
++PKG_RELEASE:=2
++
++PKG_SOURCE:=Linux-PAM-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.linux-pam.org/library/
++PKG_MD5SUM:=ee4a480d77b341c99e8b1375f8f180c0
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++PKG_MAINTAINER:=Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/Linux-PAM-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libpam
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=the Linux-PAM libraries and modules.
++ URL:=http://www.kernel.org/pub/linux/libs/pam
++endef
++
++define Package/libpam/description
++ The Linux-PAM Pluggable Authentication Modules.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --enable-shared \
++ --enable-static \
++ --enable-pamlocking \
++ --disable-prelude \
++ --disable-lckpwdf \
++ --disable-selinux \
++ --disable-nls \
++ --disable-rpath \
++ --disable-nis \
++ --disable-regenerate-docu \
++ --enable-db=no \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/lib
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/lib/* $(1)/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include
++endef
++
++define Package/libpam/install
++ $(INSTALL_DIR) $(1)/lib $(1)/lib/security $(1)/lib/security/pam_filter
++ $(INSTALL_DIR) $(1)/etc $(1)/etc/pam.d
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/lib/*.so* $(1)/lib/
++ $(CP) $(PKG_INSTALL_DIR)/lib/security/*.so* $(1)/lib/security/
++ $(CP) $(PKG_INSTALL_DIR)/lib/security/pam_filter/* $(1)/lib/security/pam_filter/
++ $(CP) $(PKG_INSTALL_DIR)/etc/* $(1)/etc/
++ $(CP) ./files/* $(1)/etc/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/* $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,libpam))
+diff --git a/feeds/packages/libs/libpam/files/pam.conf b/feeds/packages/libs/libpam/files/pam.conf
+new file mode 100644
+index 0000000..3eeb72d
+--- /dev/null
++++ b/feeds/packages/libs/libpam/files/pam.conf
+@@ -0,0 +1,15 @@
++# ---------------------------------------------------------------------------#
++# /etc/pam.conf #
++# ---------------------------------------------------------------------------#
++#
++# NOTE
++# ----
++#
++# NOTE: Most program use a file under the /etc/pam.d/ directory to setup their
++# PAM service modules. This file is used only if that directory does not exist.
++# ---------------------------------------------------------------------------#
++
++# Format:
++# serv. module ctrl module [path] ...[args..] #
++# name type flag #
++
+diff --git a/feeds/packages/libs/libpam/files/pam.d/common-account b/feeds/packages/libs/libpam/files/pam.d/common-account
+new file mode 100644
+index 0000000..7162548
+--- /dev/null
++++ b/feeds/packages/libs/libpam/files/pam.d/common-account
+@@ -0,0 +1,20 @@
++#
++# /etc/pam.d/common-account - authorization settings common to all services
++#
++# This file is included from other service-specific PAM config files,
++# and should contain a list of the authorization modules that define
++# the central access policy for use on the system. The default is to
++# only deny service to users whose accounts are expired in /etc/shadow.
++#
++
++# here are the per-package modules (the "Primary" block)
++account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
++# here's the fallback if no module succeeds
++account requisite pam_deny.so
++# prime the stack with a positive return value if there isn't one already;
++# this avoids us returning an error just because nothing sets a success code
++# since the modules above will each just jump around
++account required pam_permit.so
++# and here are more per-package modules (the "Additional" block)
++
++# end of pam-auth-update config
+diff --git a/feeds/packages/libs/libpam/files/pam.d/common-auth b/feeds/packages/libs/libpam/files/pam.d/common-auth
+new file mode 100644
+index 0000000..8fc529d
+--- /dev/null
++++ b/feeds/packages/libs/libpam/files/pam.d/common-auth
+@@ -0,0 +1,21 @@
++#
++# /etc/pam.d/common-auth - authentication settings common to all services
++#
++# This file is included from other service-specific PAM config files,
++# and should contain a list of the authentication modules that define
++# the central authentication scheme for use on the system
++# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the
++# traditional Unix authentication mechanisms.
++#
++
++# here are the per-package modules (the "Primary" block)
++auth [success=1 default=ignore] pam_unix.so nullok_secure
++# here's the fallback if no module succeeds
++auth requisite pam_deny.so
++# prime the stack with a positive return value if there isn't one already;
++# this avoids us returning an error just because nothing sets a success code
++# since the modules above will each just jump around
++auth required pam_permit.so
++# and here are more per-package modules (the "Additional" block)
++
++# end of pam-auth-update config
+diff --git a/feeds/packages/libs/libpam/files/pam.d/common-password b/feeds/packages/libs/libpam/files/pam.d/common-password
+new file mode 100644
+index 0000000..5d0dee0
+--- /dev/null
++++ b/feeds/packages/libs/libpam/files/pam.d/common-password
+@@ -0,0 +1,28 @@
++#
++# /etc/pam.d/common-password - password-related modules common to all services
++#
++# This file is included from other service-specific PAM config files,
++# and should contain a list of modules that define the services to be
++# used to change user passwords. The default is pam_unix.
++
++# Explanation of pam_unix options:
++#
++# The "sha512" option enables salted SHA512 passwords. Without this option,
++# the default is Unix crypt. Prior releases used the option "md5".
++#
++# The "obscure" option replaces the old `OBSCURE_CHECKS_ENAB' option in
++# login.defs.
++#
++# See the pam_unix manpage for other options.
++
++# here are the per-package modules (the "Primary" block)
++password [success=1 default=ignore] pam_unix.so obscure sha512
++# here's the fallback if no module succeeds
++password requisite pam_deny.so
++# prime the stack with a positive return value if there isn't one already;
++# this avoids us returning an error just because nothing sets a success code
++# since the modules above will each just jump around
++password required pam_permit.so
++# and here are more per-package modules (the "Additional" block)
++
++# end of pam-auth-update config
+diff --git a/feeds/packages/libs/libpam/files/pam.d/common-session b/feeds/packages/libs/libpam/files/pam.d/common-session
+new file mode 100644
+index 0000000..f0d41cc
+--- /dev/null
++++ b/feeds/packages/libs/libpam/files/pam.d/common-session
+@@ -0,0 +1,25 @@
++#
++# /etc/pam.d/common-session - session-related modules common to all services
++#
++# This file is included from other service-specific PAM config files,
++# and should contain a list of modules that define tasks to be performed
++# at the start and end of sessions of *any* kind (both interactive and
++# non-interactive).
++#
++
++# here are the per-package modules (the "Primary" block)
++session [default=1] pam_permit.so
++# here's the fallback if no module succeeds
++session requisite pam_deny.so
++# prime the stack with a positive return value if there isn't one already;
++# this avoids us returning an error just because nothing sets a success code
++# since the modules above will each just jump around
++session required pam_permit.so
++# The pam_umask module will set the umask according to the system default in
++# /etc/login.defs and user settings, solving the problem of different
++# umask settings with different shells, display managers, remote sessions etc.
++# See "man pam_umask".
++session optional pam_umask.so
++# and here are more per-package modules (the "Additional" block)
++session required pam_unix.so
++# end of pam-auth-update config
+diff --git a/feeds/packages/libs/libpam/files/pam.d/common-session-noninteractive b/feeds/packages/libs/libpam/files/pam.d/common-session-noninteractive
+new file mode 100644
+index 0000000..f4943e1
+--- /dev/null
++++ b/feeds/packages/libs/libpam/files/pam.d/common-session-noninteractive
+@@ -0,0 +1,25 @@
++#
++# /etc/pam.d/common-session-noninteractive - session-related modules
++# common to all non-interactive services
++#
++# This file is included from other service-specific PAM config files,
++# and should contain a list of modules that define tasks to be performed
++# at the start and end of all non-interactive sessions.
++#
++
++# here are the per-package modules (the "Primary" block)
++session [default=1] pam_permit.so
++# here's the fallback if no module succeeds
++session requisite pam_deny.so
++# prime the stack with a positive return value if there isn't one already;
++# this avoids us returning an error just because nothing sets a success code
++# since the modules above will each just jump around
++session required pam_permit.so
++# The pam_umask module will set the umask according to the system default in
++# /etc/login.defs and user settings, solving the problem of different
++# umask settings with different shells, display managers, remote sessions etc.
++# See "man pam_umask".
++session optional pam_umask.so
++# and here are more per-package modules (the "Additional" block)
++session required pam_unix.so
++# end of pam-auth-update config
+diff --git a/feeds/packages/libs/libpam/files/pam.d/other b/feeds/packages/libs/libpam/files/pam.d/other
+new file mode 100644
+index 0000000..6679e4f
+--- /dev/null
++++ b/feeds/packages/libs/libpam/files/pam.d/other
+@@ -0,0 +1,16 @@
++#
++# /etc/pam.d/other - specify the PAM fallback behaviour
++#
++# Note that this file is used for any unspecified service; for example
++#if /etc/pam.d/cron specifies no session modules but cron calls
++#pam_open_session, the session module out of /etc/pam.d/other is
++#used. If you really want nothing to happen then use pam_permit.so or
++#pam_deny.so as appropriate.
++
++# We fall back to the system default in /etc/pam.d/common-*
++#
++
++auth include common-auth
++account include common-account
++password include common-password
++session include common-session
+diff --git a/feeds/packages/libs/libpam/patches/0001-build-always-use-lib-instead-of-lib64.patch b/feeds/packages/libs/libpam/patches/0001-build-always-use-lib-instead-of-lib64.patch
+new file mode 100644
+index 0000000..25d9a4a
+--- /dev/null
++++ b/feeds/packages/libs/libpam/patches/0001-build-always-use-lib-instead-of-lib64.patch
+@@ -0,0 +1,36 @@
++From 1948dd03d69c1a50e92d7e8868b7d6eabd4873c1 Mon Sep 17 00:00:00 2001
++From: Yousong Zhou <yszhou4tech@gmail.com>
++Date: Wed, 17 Jun 2015 16:11:31 +0800
++Subject: [PATCH 1/7] build: always use /lib instead of /lib64.
++
++* configure.ac: OpenWrt does not use /lib64.
++
++Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
++---
++ configure.ac | 10 +---------
++ 1 file changed, 1 insertion(+), 9 deletions(-)
++
++diff --git a/configure.ac b/configure.ac
++index fd0e310..306b6e2 100644
++--- a/configure.ac
+++++ b/configure.ac
++@@ -25,15 +25,7 @@ dnl If we use /usr as prefix, use /etc for config files
++ then
++ sysconfdir="/etc"
++ fi
++- if test ${libdir} = '${exec_prefix}/lib'
++- then
++- case "`uname -m`" in
++- x86_64|ppc64|s390x|sparc64)
++- libdir="/lib64" ;;
++- *)
++- libdir="/lib" ;;
++- esac
++- fi
+++ libdir="/lib"
++ if test ${sbindir} = '${exec_prefix}/sbin'
++ then
++ sbindir="/sbin"
++--
++1.7.10.4
++
+diff --git a/feeds/packages/libs/libpam/patches/0002-build-ignore-pam_rhosts-if-neither-ruserok-nor-ruser.patch b/feeds/packages/libs/libpam/patches/0002-build-ignore-pam_rhosts-if-neither-ruserok-nor-ruser.patch
+new file mode 100644
+index 0000000..abafcbb
+--- /dev/null
++++ b/feeds/packages/libs/libpam/patches/0002-build-ignore-pam_rhosts-if-neither-ruserok-nor-ruser.patch
+@@ -0,0 +1,77 @@
++From 1a2e6c979118dce5e79604e88c008c7879d1e4e6 Mon Sep 17 00:00:00 2001
++From: Yousong Zhou <yszhou4tech@gmail.com>
++Date: Wed, 17 Jun 2015 18:19:23 +0800
++Subject: [PATCH 2/7] build: ignore pam_rhosts if neither ruserok nor
++ ruserok_af is available.
++
++* configure.ac: check for ruserok and ruserok_af
++* modules/Makefile.am: ignore pam_rhosts/ if it's disabled
++* modules/pam_rhosts/pam_rhosts.c: include stdlib.h for malloc and free
++
++Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
++---
++ configure.ac | 5 ++++-
++ modules/Makefile.am | 11 ++++++++---
++ modules/pam_rhosts/pam_rhosts.c | 1 +
++ 3 files changed, 13 insertions(+), 4 deletions(-)
++
++diff --git a/configure.ac b/configure.ac
++index 306b6e2..084071a 100644
++--- a/configure.ac
+++++ b/configure.ac
++@@ -534,7 +534,10 @@ AC_CHECK_FUNCS(fseeko getdomainname gethostname gettimeofday lckpwdf mkdir selec
++ AC_CHECK_FUNCS(strcspn strdup strspn strstr strtol uname)
++ AC_CHECK_FUNCS(getutent_r getpwnam_r getpwuid_r getgrnam_r getgrgid_r getspnam_r)
++ AC_CHECK_FUNCS(getgrouplist getline getdelim)
++-AC_CHECK_FUNCS(inet_ntop inet_pton innetgr ruserok_af)
+++AC_CHECK_FUNCS(inet_ntop inet_pton innetgr)
+++AC_CHECK_FUNCS([ruserok_af ruserok], [break])
+++
+++AM_CONDITIONAL([COND_BUILD_PAM_RHOSTS], [test "$ac_cv_func_ruserok_af" = yes -o "$ac_cv_func_ruserok" = yes])
++
++ AC_CHECK_FUNCS(unshare, [UNSHARE=yes], [UNSHARE=no])
++ AM_CONDITIONAL([HAVE_UNSHARE], [test "$UNSHARE" = yes])
++diff --git a/modules/Makefile.am b/modules/Makefile.am
++index 0c80cea..9ad26a9 100644
++--- a/modules/Makefile.am
+++++ b/modules/Makefile.am
++@@ -2,16 +2,21 @@
++ # Copyright (c) 2005, 2006, 2008 Thorsten Kukuk <kukuk@thkukuk.de>
++ #
++
++-SUBDIRS = pam_access pam_cracklib pam_debug pam_deny pam_echo \
+++if COND_BUILD_PAM_RHOSTS
+++ MAYBE_PAM_RHOSTS = pam_rhosts
+++endif
+++
+++SUBDIRS := pam_access pam_cracklib pam_debug pam_deny pam_echo \
++ pam_env pam_exec pam_faildelay pam_filter pam_ftp \
++ pam_group pam_issue pam_keyinit pam_lastlog pam_limits \
++ pam_listfile pam_localuser pam_loginuid pam_mail \
++ pam_mkhomedir pam_motd pam_namespace pam_nologin \
++- pam_permit pam_pwhistory pam_rhosts pam_rootok pam_securetty \
+++ pam_permit pam_pwhistory pam_rootok pam_securetty \
++ pam_selinux pam_sepermit pam_shells pam_stress \
++ pam_succeed_if pam_tally pam_tally2 pam_time pam_timestamp \
++ pam_tty_audit pam_umask \
++- pam_unix pam_userdb pam_warn pam_wheel pam_xauth
+++ pam_unix pam_userdb pam_warn pam_wheel pam_xauth \
+++ $(MAYBE_PAM_RHOSTS)
++
++ CLEANFILES = *~
++
++diff --git a/modules/pam_rhosts/pam_rhosts.c b/modules/pam_rhosts/pam_rhosts.c
++index bc9e76f..51ef13e 100644
++--- a/modules/pam_rhosts/pam_rhosts.c
+++++ b/modules/pam_rhosts/pam_rhosts.c
++@@ -35,6 +35,7 @@
++ #include <pwd.h>
++ #include <netdb.h>
++ #include <string.h>
+++#include <stdlib.h>
++ #include <syslog.h>
++
++ #define PAM_SM_AUTH /* only defines this management group */
++--
++1.7.10.4
++
+diff --git a/feeds/packages/libs/libpam/patches/0003-build-ignore-pam_lastlog-when-logwtmp-is-not-availab.patch b/feeds/packages/libs/libpam/patches/0003-build-ignore-pam_lastlog-when-logwtmp-is-not-availab.patch
+new file mode 100644
+index 0000000..2f3f19c
+--- /dev/null
++++ b/feeds/packages/libs/libpam/patches/0003-build-ignore-pam_lastlog-when-logwtmp-is-not-availab.patch
+@@ -0,0 +1,60 @@
++From bac1ee3033cf22e31730fe3e77ca82bd5ebba692 Mon Sep 17 00:00:00 2001
++From: Yousong Zhou <yszhou4tech@gmail.com>
++Date: Wed, 17 Jun 2015 21:18:05 +0800
++Subject: [PATCH 3/7] build: ignore pam_lastlog when logwtmp is not available.
++
++* configure.ac: check logwtmp and set COND_BUILD_PAM_LASTLOG
++* modules/pam_lastlog/Makefile.am: check COND_BUILD_PAM_LASTLOG
++
++Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
++---
++ configure.ac | 2 ++
++ modules/Makefile.am | 8 ++++++--
++ 2 files changed, 8 insertions(+), 2 deletions(-)
++
++diff --git a/configure.ac b/configure.ac
++index 084071a..ca4bf5b 100644
++--- a/configure.ac
+++++ b/configure.ac
++@@ -536,8 +536,10 @@ AC_CHECK_FUNCS(getutent_r getpwnam_r getpwuid_r getgrnam_r getgrgid_r getspnam_r
++ AC_CHECK_FUNCS(getgrouplist getline getdelim)
++ AC_CHECK_FUNCS(inet_ntop inet_pton innetgr)
++ AC_CHECK_FUNCS([ruserok_af ruserok], [break])
+++AC_CHECK_FUNCS([logwtmp])
++
++ AM_CONDITIONAL([COND_BUILD_PAM_RHOSTS], [test "$ac_cv_func_ruserok_af" = yes -o "$ac_cv_func_ruserok" = yes])
+++AM_CONDITIONAL([COND_BUILD_PAM_LASTLOG], [test "$ac_cv_func_logwtmp" = yes])
++
++ AC_CHECK_FUNCS(unshare, [UNSHARE=yes], [UNSHARE=no])
++ AM_CONDITIONAL([HAVE_UNSHARE], [test "$UNSHARE" = yes])
++diff --git a/modules/Makefile.am b/modules/Makefile.am
++index 9ad26a9..b98dc5c 100644
++--- a/modules/Makefile.am
+++++ b/modules/Makefile.am
++@@ -6,9 +6,13 @@ if COND_BUILD_PAM_RHOSTS
++ MAYBE_PAM_RHOSTS = pam_rhosts
++ endif
++
+++if COND_BUILD_PAM_LASTLOG
+++ MAYBE_PAM_LASTLOG = pam_lastlog
+++endif
+++
++ SUBDIRS := pam_access pam_cracklib pam_debug pam_deny pam_echo \
++ pam_env pam_exec pam_faildelay pam_filter pam_ftp \
++- pam_group pam_issue pam_keyinit pam_lastlog pam_limits \
+++ pam_group pam_issue pam_keyinit pam_limits \
++ pam_listfile pam_localuser pam_loginuid pam_mail \
++ pam_mkhomedir pam_motd pam_namespace pam_nologin \
++ pam_permit pam_pwhistory pam_rootok pam_securetty \
++@@ -16,7 +20,7 @@ SUBDIRS := pam_access pam_cracklib pam_debug pam_deny pam_echo \
++ pam_succeed_if pam_tally pam_tally2 pam_time pam_timestamp \
++ pam_tty_audit pam_umask \
++ pam_unix pam_userdb pam_warn pam_wheel pam_xauth \
++- $(MAYBE_PAM_RHOSTS)
+++ $(MAYBE_PAM_RHOSTS) $(MAYBE_PAM_LASTLOG)
++
++ CLEANFILES = *~
++
++--
++1.7.10.4
++
+diff --git a/feeds/packages/libs/libpam/patches/0004-build-fix-build-when-crypt-is-not-part-of-crypt_libs.patch b/feeds/packages/libs/libpam/patches/0004-build-fix-build-when-crypt-is-not-part-of-crypt_libs.patch
+new file mode 100644
+index 0000000..04e6173
+--- /dev/null
++++ b/feeds/packages/libs/libpam/patches/0004-build-fix-build-when-crypt-is-not-part-of-crypt_libs.patch
+@@ -0,0 +1,28 @@
++From a35daea1b8be768d1b0be6eae157fbf3e5380f92 Mon Sep 17 00:00:00 2001
++From: Yousong Zhou <yszhou4tech@gmail.com>
++Date: Wed, 17 Jun 2015 18:22:31 +0800
++Subject: [PATCH 4/7] build: fix build when crypt() is not part of crypt_libs.
++
++* configure.ac: ditto.
++
++Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
++---
++ configure.ac | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/configure.ac b/configure.ac
++index ca4bf5b..6553c78 100644
++--- a/configure.ac
+++++ b/configure.ac
++@@ -408,7 +408,7 @@ AS_IF([test "x$ac_cv_header_xcrypt_h" = "xyes"],
++ [crypt_libs="crypt"])
++
++ BACKUP_LIBS=$LIBS
++-AC_SEARCH_LIBS([crypt],[$crypt_libs], LIBCRYPT="-l$ac_lib", LIBCRYPT="")
+++AC_SEARCH_LIBS([crypt],[$crypt_libs], LIBCRYPT="${ac_lib:+-l$ac_lib}", LIBCRYPT="")
++ AC_CHECK_FUNCS(crypt_r crypt_gensalt_r)
++ LIBS=$BACKUP_LIBS
++ AC_SUBST(LIBCRYPT)
++--
++1.7.10.4
++
+diff --git a/feeds/packages/libs/libpam/patches/0005-build-fix-doc-build.patch b/feeds/packages/libs/libpam/patches/0005-build-fix-doc-build.patch
+new file mode 100644
+index 0000000..cd9b0a8
+--- /dev/null
++++ b/feeds/packages/libs/libpam/patches/0005-build-fix-doc-build.patch
+@@ -0,0 +1,133 @@
++From 1563e57ea8ab9d123f765129a6840929ef58ff7a Mon Sep 17 00:00:00 2001
++From: Yousong Zhou <yszhou4tech@gmail.com>
++Date: Wed, 17 Jun 2015 20:38:41 +0800
++Subject: [PATCH 5/7] build: fix doc build.
++
++* Makefile.am: ignore doc/ directory if not ENABLE_REGENERATE_MAN
++* doc/adg/Makefile.am: remove check on ENABLE_REGENERATE_MAN
++* doc/man/Makefile.am: ditto
++* doc/mwg/Makefile.am: ditto
++* doc/sag/Makefile.am: ditto
++* doc/specs/Makefile.am: ignore CC from command line
++
++Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
++---
++ Makefile.am | 5 ++++-
++ doc/adg/Makefile.am | 3 ---
++ doc/man/Makefile.am | 2 --
++ doc/mwg/Makefile.am | 3 ---
++ doc/sag/Makefile.am | 2 --
++ doc/specs/Makefile.am | 2 +-
++ 6 files changed, 5 insertions(+), 12 deletions(-)
++
++diff --git a/Makefile.am b/Makefile.am
++index 3db4e37..5e6592a 100644
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -4,7 +4,10 @@
++
++ AUTOMAKE_OPTIONS = 1.9 gnu dist-bzip2 check-news
++
++-SUBDIRS = libpam tests libpamc libpam_misc modules po conf doc examples xtests
+++if ENABLE_REGENERATE_MAN
+++ MAYBE_DOC = doc
+++endif
+++SUBDIRS = libpam tests libpamc libpam_misc modules po conf examples xtests $(MAYBE_DOC)
++
++ CLEANFILES = *~
++
++diff --git a/doc/adg/Makefile.am b/doc/adg/Makefile.am
++index 77bd7a9..bec5edc 100644
++--- a/doc/adg/Makefile.am
+++++ b/doc/adg/Makefile.am
++@@ -9,7 +9,6 @@ EXTRA_DIST = $(XMLS)
++ XMLS = Linux-PAM_ADG.xml $(shell ls $(srcdir)/pam_*.xml)
++ DEP_XMLS = $(shell ls $(top_srcdir)/doc/man/pam_*.xml)
++
++-if ENABLE_REGENERATE_MAN
++ MAINTAINERCLEANFILES = Linux-PAM_ADG.txt Linux-PAM_ADG.pdf html/*.html
++
++ all: Linux-PAM_ADG.txt html/Linux-PAM_ADG.html Linux-PAM_ADG.pdf
++@@ -51,8 +50,6 @@ html/Linux-PAM_ADG.html: $(XMLS) $(DEP_XMLS)
++ distclean-local:
++ -rm -rf html Linux-PAM_ADG.txt Linux-PAM_ADG.pdf
++
++-endif
++-
++ install-data-local:
++ $(mkinstalldirs) $(DESTDIR)$(docdir)
++ $(mkinstalldirs) $(DESTDIR)$(pdfdir)
++diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am
++index 78c891d..b1dc421 100644
++--- a/doc/man/Makefile.am
+++++ b/doc/man/Makefile.am
++@@ -45,7 +45,6 @@ XMLS = pam.3.xml pam.8.xml \
++ misc_conv.3.xml pam_misc_paste_env.3.xml pam_misc_drop_env.3.xml \
++ pam_misc_setenv.3.xml
++
++-if ENABLE_REGENERATE_MAN
++ PAM.8: pam.8
++ pam_get_authtok_noverify.3: pam_get_authtok.3
++ pam_get_authtok_verify.3: pam_get_authtok.3
++@@ -60,4 +59,3 @@ pam_get_item.3: pam_item_types_std.inc.xml pam_item_types_ext.inc.xml
++ pam_set_data.3: pam_item_types_std.inc.xml pam_item_types_ext.inc.xml
++ pam.conf.5: pam.conf-desc.xml pam.conf-dir.xml pam.conf-syntax.xml
++ -include $(top_srcdir)/Make.xml.rules
++-endif
++diff --git a/doc/mwg/Makefile.am b/doc/mwg/Makefile.am
++index 2bbb2d0..f57e297 100644
++--- a/doc/mwg/Makefile.am
+++++ b/doc/mwg/Makefile.am
++@@ -9,7 +9,6 @@ EXTRA_DIST = $(XMLS)
++ XMLS = Linux-PAM_MWG.xml $(shell ls $(srcdir)/pam_*.xml)
++ DEP_XMLS = $(shell ls $(top_srcdir)/doc/man/pam_*.xml)
++
++-if ENABLE_REGENERATE_MAN
++ MAINTAINERCLEANFILES = Linux-PAM_MWG.txt Linux-PAM_MWG.pdf html/*.html
++
++ all: Linux-PAM_MWG.txt html/Linux-PAM_MWG.html Linux-PAM_MWG.pdf
++@@ -51,8 +50,6 @@ html/Linux-PAM_MWG.html: $(XMLS) $(DEP_XMLS)
++ distclean-local:
++ -rm -rf html Linux-PAM_MWG.txt Linux-PAM_MWG.pdf
++
++-endif
++-
++ install-data-local:
++ $(mkinstalldirs) $(DESTDIR)$(docdir)
++ $(mkinstalldirs) $(DESTDIR)$(pdfdir)
++diff --git a/doc/sag/Makefile.am b/doc/sag/Makefile.am
++index 31816aa..a8b655f 100644
++--- a/doc/sag/Makefile.am
+++++ b/doc/sag/Makefile.am
++@@ -10,7 +10,6 @@ XMLS = Linux-PAM_SAG.xml $(shell ls $(srcdir)/pam_*.xml)
++
++ DEP_XMLS = $(shell ls $(top_srcdir)/modules/pam_*/pam_*.xml)
++
++-if ENABLE_REGENERATE_MAN
++ MAINTAINERCLEANFILES = Linux-PAM_SAG.txt Linux-PAM_SAG.pdf html/*.html
++
++ all: Linux-PAM_SAG.txt html/Linux-PAM_SAG.html Linux-PAM_SAG.pdf
++@@ -51,7 +50,6 @@ html/Linux-PAM_SAG.html: $(XMLS) $(DEP_XMLS)
++
++ distclean-local:
++ -rm -rf html Linux-PAM_SAG.txt Linux-PAM_SAG.pdf
++-endif
++
++ install-data-local:
++ $(mkinstalldirs) $(DESTDIR)$(docdir)
++diff --git a/doc/specs/Makefile.am b/doc/specs/Makefile.am
++index 99ecc70..39c850f 100644
++--- a/doc/specs/Makefile.am
+++++ b/doc/specs/Makefile.am
++@@ -11,7 +11,7 @@ draft-morgan-pam-current.txt: padout draft-morgan-pam.raw
++
++ AM_YFLAGS = -d
++
++-CC = @CC_FOR_BUILD@
+++override CC = @CC_FOR_BUILD@
++ CPPFLAGS = @BUILD_CPPFLAGS@
++ CFLAGS = @BUILD_CFLAGS@
++ LDFLAGS = @BUILD_LDFLAGS@
++--
++1.7.10.4
++
+diff --git a/feeds/packages/libs/libpam/patches/0006-pam_unix-fix-compilation-in-case-rpc-rpc.h-is-missin.patch b/feeds/packages/libs/libpam/patches/0006-pam_unix-fix-compilation-in-case-rpc-rpc.h-is-missin.patch
+new file mode 100644
+index 0000000..014684f
+--- /dev/null
++++ b/feeds/packages/libs/libpam/patches/0006-pam_unix-fix-compilation-in-case-rpc-rpc.h-is-missin.patch
+@@ -0,0 +1,29 @@
++From 2e3ed4c6fb09f84fede589047d37d11783202d34 Mon Sep 17 00:00:00 2001
++From: Yousong Zhou <yszhou4tech@gmail.com>
++Date: Wed, 17 Jun 2015 18:16:18 +0800
++Subject: [PATCH 6/7] pam_unix: fix compilation in case rpc/rpc.h is missing.
++
++* modules/pam_unix/pam_unix_passwd.c: conditional compile on the
++ availability of rpc/rpc.h
++
++Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
++---
++ modules/pam_unix/pam_unix_passwd.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/modules/pam_unix/pam_unix_passwd.c b/modules/pam_unix/pam_unix_passwd.c
++index 2d330e5..970724a 100644
++--- a/modules/pam_unix/pam_unix_passwd.c
+++++ b/modules/pam_unix/pam_unix_passwd.c
++@@ -336,7 +336,7 @@ static int _do_setpass(pam_handle_t* pamh, const char *forwho,
++ }
++
++ if (on(UNIX_NIS, ctrl) && _unix_comesfromsource(pamh, forwho, 0, 1)) {
++-#ifdef HAVE_NIS
+++#if defined(HAVE_NIS) && defined(HAVE_RPC_RPC_H)
++ if ((master=getNISserver(pamh, ctrl)) != NULL) {
++ struct timeval timeout;
++ struct yppasswd yppwd;
++--
++1.7.10.4
++
+diff --git a/feeds/packages/libs/libpam/patches/0007-Check-if-innetgr-is-available-at-compile-time.patch b/feeds/packages/libs/libpam/patches/0007-Check-if-innetgr-is-available-at-compile-time.patch
+new file mode 100644
+index 0000000..f79b01a
+--- /dev/null
++++ b/feeds/packages/libs/libpam/patches/0007-Check-if-innetgr-is-available-at-compile-time.patch
+@@ -0,0 +1,106 @@
++From c681bd104627139eac2f40fe303e1f67676233e8 Mon Sep 17 00:00:00 2001
++From: Yousong Zhou <yszhou4tech@gmail.com>
++Date: Wed, 17 Jun 2015 15:33:43 +0800
++Subject: [PATCH 7/7] Check if innetgr is available at compile time.
++
++innetgr may not be there so make sure that when innetgr is not present
++then we inform about it and not use it.
++
++* modules/pam_group/pam_group.c: ditto
++* modules/pam_succeed_if/pam_succeed_if.c: ditto
++* modules/pam_time/pam_time.c: ditto
++
++Signed-off-by: Khem Raj <raj.khem at gmail.com>
++Signed-off-by: Yousong Zhou <yszhou4tech at gmail.com>
++---
++ modules/pam_group/pam_group.c | 4 ++++
++ modules/pam_succeed_if/pam_succeed_if.c | 17 +++++++++++++----
++ modules/pam_time/pam_time.c | 4 ++++
++ 3 files changed, 21 insertions(+), 4 deletions(-)
++
++diff --git a/modules/pam_group/pam_group.c b/modules/pam_group/pam_group.c
++index be5f20f..6a065ca 100644
++--- a/modules/pam_group/pam_group.c
+++++ b/modules/pam_group/pam_group.c
++@@ -656,7 +656,11 @@ static int check_account(pam_handle_t *pamh, const char *service,
++ }
++ /* If buffer starts with @, we are using netgroups */
++ if (buffer[0] == '@')
+++#ifdef HAVE_INNETGR
++ good &= innetgr (&buffer[1], NULL, user, NULL);
+++#else
+++ pam_syslog (pamh, LOG_ERR, "pam_group does not have netgroup support");
+++#endif
++ /* otherwise, if the buffer starts with %, it's a UNIX group */
++ else if (buffer[0] == '%')
++ good &= pam_modutil_user_in_group_nam_nam(pamh, user, &buffer[1]);
++diff --git a/modules/pam_succeed_if/pam_succeed_if.c b/modules/pam_succeed_if/pam_succeed_if.c
++index aa828fc..c0c68a0 100644
++--- a/modules/pam_succeed_if/pam_succeed_if.c
+++++ b/modules/pam_succeed_if/pam_succeed_if.c
++@@ -231,18 +231,27 @@ evaluate_notingroup(pam_handle_t *pamh, const char *user, const char *group)
++ }
++ /* Return PAM_SUCCESS if the (host,user) is in the netgroup. */
++ static int
++-evaluate_innetgr(const char *host, const char *user, const char *group)
+++evaluate_innetgr(const pam_handle_t* pamh, const char *host, const char *user, const char *group)
++ {
+++#ifdef HAVE_INNETGR
++ if (innetgr(group, host, user, NULL) == 1)
++ return PAM_SUCCESS;
+++#else
+++ pam_syslog (pamh, LOG_ERR, "pam_succeed_if does not have netgroup support");
+++#endif
+++
++ return PAM_AUTH_ERR;
++ }
++ /* Return PAM_SUCCESS if the (host,user) is NOT in the netgroup. */
++ static int
++-evaluate_notinnetgr(const char *host, const char *user, const char *group)
+++evaluate_notinnetgr(const pam_handle_t* pamh, const char *host, const char *user, const char *group)
++ {
+++#ifdef HAVE_INNETGR
++ if (innetgr(group, host, user, NULL) == 0)
++ return PAM_SUCCESS;
+++#else
+++ pam_syslog (pamh, LOG_ERR, "pam_succeed_if does not have netgroup support");
+++#endif
++ return PAM_AUTH_ERR;
++ }
++
++@@ -387,14 +396,14 @@ evaluate(pam_handle_t *pamh, int debug,
++ const void *rhost;
++ if (pam_get_item(pamh, PAM_RHOST, &rhost) != PAM_SUCCESS)
++ rhost = NULL;
++- return evaluate_innetgr(rhost, user, right);
+++ return evaluate_innetgr(pamh, rhost, user, right);
++ }
++ /* (Rhost, user) is not in this group. */
++ if (strcasecmp(qual, "notinnetgr") == 0) {
++ const void *rhost;
++ if (pam_get_item(pamh, PAM_RHOST, &rhost) != PAM_SUCCESS)
++ rhost = NULL;
++- return evaluate_notinnetgr(rhost, user, right);
+++ return evaluate_notinnetgr(pamh, rhost, user, right);
++ }
++ /* Fail closed. */
++ return PAM_SERVICE_ERR;
++diff --git a/modules/pam_time/pam_time.c b/modules/pam_time/pam_time.c
++index c94737c..0b34a14 100644
++--- a/modules/pam_time/pam_time.c
+++++ b/modules/pam_time/pam_time.c
++@@ -555,7 +555,11 @@ check_account(pam_handle_t *pamh, const char *service,
++ }
++ /* If buffer starts with @, we are using netgroups */
++ if (buffer[0] == '@')
+++#ifdef HAVE_INNETGR
++ good &= innetgr (&buffer[1], NULL, user, NULL);
+++#else
+++ pam_syslog (pamh, LOG_ERR, "pam_time does not have netgroup support");
+++#endif
++ else
++ good &= logic_field(pamh, user, buffer, count, is_same);
++ D(("with user: %s", good ? "passes":"fails" ));
++--
++1.7.10.4
++
+diff --git a/feeds/packages/libs/libplist/Makefile b/feeds/packages/libs/libplist/Makefile
+new file mode 100644
+index 0000000..4d7cb9c
+--- /dev/null
++++ b/feeds/packages/libs/libplist/Makefile
+@@ -0,0 +1,105 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libplist
++PKG_VERSION:=1.13
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=Lukasz Baj <l.baj@radytek.com>
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING.LESSER
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/libimobiledevice/libplist.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=cc907c0f162ee84e5698b9c27ac6fb0be8bb9bc0
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libplist/Default
++ TITLE:=Apple property list
++ URL:=http://www.libimobiledevice.org/
++endef
++
++define Package/libplist/Default/description
++ A library to handle Apple Property List format whereas it's binary or XML
++endef
++
++define Package/libplist
++ $(call Package/libplist/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libxml2
++ TITLE+= library
++endef
++
++define Package/libplist/description
++ $(call Package/libplist/Default/description)
++endef
++
++define Package/libplistcxx
++ $(call Package/libplist/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libplist +libstdcpp
++ TITLE+= C++ library
++endef
++
++define Package/libplistcxx/description
++ $(call Package/libplist/Default/description)
++ This package contains the libplist C++ shared library.
++endef
++
++define Package/libplist-utils
++ $(call Package/libplist/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libplist
++ TITLE+= converter
++endef
++
++define Package/libplist-utils/description
++ $(call Package/libplist/Default/description)
++ This package contains the libplist utilities.
++endef
++
++CONFIGURE_ARGS += \
++ --without-cython
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/plist $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libplist*.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libplist*.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libplist/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libplist.so.* $(1)/usr/lib/
++endef
++
++define Package/libplistcxx/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libplist++.so.* $(1)/usr/lib/
++endef
++
++define Package/libplist-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/plistutil $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libplist))
++$(eval $(call BuildPackage,libplistcxx))
++$(eval $(call BuildPackage,libplist-utils))
+diff --git a/feeds/packages/libs/libpng/Makefile b/feeds/packages/libs/libpng/Makefile
+new file mode 100644
+index 0000000..4040458
+--- /dev/null
++++ b/feeds/packages/libs/libpng/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libpng
++PKG_VERSION:=1.2.52
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@SF/libpng
++PKG_MD5SUM:=49d5c71929bf69a172147c47b9309fbe
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++
++PKG_LICENSE:=Libpng GPL-2.0+ BSD-3-Clause
++PKC_LICENSE_FILES:=LICENSE contrib/gregbook/COPYING contrib/gregbook/LICENSE
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libpng
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+zlib
++ TITLE:=A PNG format files handling library
++ URL:=http://www.libpng.org/pub/png/libpng.html
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/libpng{,12}-config $(1)/usr/bin/
++ $(SED) \
++ 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' \
++ $(1)/usr/bin/libpng{,12}-config
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/png{,conf}.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libpng12 $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpng{,12}.{a,la,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libpng{,12}.pc $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DIR) $(2)/bin
++ for f in libpng{,12}-config; do \
++ $(LN) ../../usr/bin/$$$$f $(2)/bin/ ; \
++ done
++endef
++
++define Package/libpng/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpng{,12}.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,libpng))
+diff --git a/feeds/packages/libs/libpng/patches/100-config_fix.patch b/feeds/packages/libs/libpng/patches/100-config_fix.patch
+new file mode 100644
+index 0000000..3cb6d8a
+--- /dev/null
++++ b/feeds/packages/libs/libpng/patches/100-config_fix.patch
+@@ -0,0 +1,10 @@
++--- a/scripts/libpng-config-body.in
+++++ b/scripts/libpng-config-body.in
++@@ -83,6 +83,7 @@ while test $# -gt 0; do
++
++ --static)
++ R_opts=""
+++ libs=${all_libs}
++ ;;
++
++ *)
+diff --git a/feeds/packages/libs/libradcli/Config.in b/feeds/packages/libs/libradcli/Config.in
+new file mode 100644
+index 0000000..35c3a22
+--- /dev/null
++++ b/feeds/packages/libs/libradcli/Config.in
+@@ -0,0 +1,10 @@
++# radcli avanced configuration
++
++menu "Configuration"
++ depends on PACKAGE_libradcli
++
++config RADCLI_TLS
++ bool "enable TLS support"
++ default y
++
++endmenu
+diff --git a/feeds/packages/libs/libradcli/Makefile b/feeds/packages/libs/libradcli/Makefile
+new file mode 100644
+index 0000000..e124bf8
+--- /dev/null
++++ b/feeds/packages/libs/libradcli/Makefile
+@@ -0,0 +1,75 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libradcli
++PKG_VERSION:=1.2.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=radcli-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/radcli/radcli/releases/download/radcli_1_2_3/
++PKG_MD5SUM:=e283db7db2248cd6499aff69813cb1ed
++PKG_BUILD_DIR:=$(BUILD_DIR)/radcli-$(PKG_VERSION)
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libradcli
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A library for radius clients
++ URL:=http://radcli.github.io/radcli/
++ MAINTAINER:=Nikos Mavrogiannopoulos <nmav@gnutls.org>
++ DEPENDS:= +RADCLI_TLS:libgnutls +libnettle
++endef
++
++define Package/libradcli/decription
++ The radcli library is a library for writing RADIUS Clients. The library's
++ approach is to allow writing RADIUS-aware application in less than 50 lines
++ of C code. It was based originally on freeradius-client and is source
++ compatible with it.
++endef
++
++CONFIGURE_ARGS+= \
++ --enable-legacy-compat
++
++ifneq ($(CONFIG_RADCLI_TLS),y)
++CONFIGURE_ARGS += --without-tls
++endif
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/radcli
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/radcli/radcli.h \
++ $(PKG_INSTALL_DIR)/usr/include/radcli/version.h \
++ $(1)/usr/include/radcli
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/freeradius-client.h \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libradcli.so* \
++ $(PKG_INSTALL_DIR)/usr/lib/libfreeradius-client.so \
++ $(1)/usr/lib/
++endef
++
++define Package/libradcli/conffiles
++/etc/radcli/radiusclient.conf
++endef
++
++define Package/libradcli/install
++ $(INSTALL_DIR) $(1)/etc/radcli
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/etc/radiusclient.conf $(1)/etc/radcli/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libradcli.so.* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libradcli))
+diff --git a/feeds/packages/libs/libsamplerate/Makefile b/feeds/packages/libs/libsamplerate/Makefile
+new file mode 100644
+index 0000000..a761914
+--- /dev/null
++++ b/feeds/packages/libs/libsamplerate/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libsamplerate
++PKG_VERSION:=0.1.8
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.mega-nerd.com/SRC/
++PKG_MD5SUM:=1c7fb25191b4e6e3628d198a66a84f47
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libsamplerate
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libsndfile
++ TITLE:=Sample Rate Converter
++ URL:=http://www.mega-nerd.com/SRC/index.html
++endef
++
++define Package/libsamplerate/description
++ Secret Rabbit Code (aka libsamplerate) is a Sample Rate
++ Converter for audio.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --disable-fftw \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)
++ $(CP) $(PKG_INSTALL_DIR)/* $(1)/
++endef
++
++define Package/libsamplerate/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsamplerate.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libsamplerate))
+diff --git a/feeds/packages/libs/libsearpc/Makefile b/feeds/packages/libs/libsearpc/Makefile
+new file mode 100644
+index 0000000..4ec9e93
+--- /dev/null
++++ b/feeds/packages/libs/libsearpc/Makefile
+@@ -0,0 +1,77 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libsearpc
++PKG_VERSION:=3.1.7
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++PKG_LICENSE:=GPL-3.0
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/haiwen/libsearpc.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=8998e7b2c5587f0b94c48db24e2952d08def5add
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/libsearpc
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Seafile RPC Library
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++ URL:=http://seafile.com/
++ DEPENDS:=+glib2 +jansson +python $(ICONV_DEPENDS)
++endef
++
++define Package/libsearpc/description
++ Searpc is a simple C language RPC framework based on GObject system.
++ Searpc handles the serialization/deserialization part of RPC,
++ the transport part is left to users.
++endef
++
++CONFIGURE_ARGS += --enable-compile-demo=no \
++ --disable-server-pkg
++
++TARGET_LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib -liconv
++
++include $(INCLUDE_DIR)/host-build.mk
++
++define Host/Configure
++endef
++
++define Host/Compile
++endef
++
++define Host/Install
++ $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin
++ $(INSTALL_BIN) $(HOST_BUILD_DIR)/lib/searpc-codegen.py $(STAGING_DIR_HOST)/bin/
++endef
++
++$(eval $(call HostBuild))
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/{bin,include}
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsearpc.so* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/searpc* $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libsearpc.pc $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/searpc-codegen.py $(1)/usr/bin/
++endef
++
++define Package/libsearpc/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/lib/python2.7/site-packages
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsearpc.so* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/python2.7/site-packages/pysearpc $(1)/usr/lib/python2.7/site-packages/
++endef
++
++$(eval $(call BuildPackage,libsearpc))
+diff --git a/feeds/packages/libs/libseccomp/Makefile b/feeds/packages/libs/libseccomp/Makefile
+new file mode 100644
+index 0000000..1ad5d2b
+--- /dev/null
++++ b/feeds/packages/libs/libseccomp/Makefile
+@@ -0,0 +1,74 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libseccomp
++PKG_VERSION:=2.2.1
++PKG_RELEASE:=1
++PKG_USE_MIPS16:=0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/seccomp/libseccomp/releases/download/v$(PKG_VERSION)/
++PKG_MD5SUM:=068af8e1bc36fcd4b326ee83875ab4fd
++PKG_MAINTAINER:=Nikos Mavrogiannopoulos <nmav@gnutls.org>
++
++PKG_INSTALL:=1
++PKG_LIBTOOL_PATHS:=. lib
++PKG_CHECK_FORMAT_SECURITY:=0
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_KERNEL_SECCOMP
++
++include $(INCLUDE_DIR)/package.mk
++
++
++define Package/libseccomp/Default
++ SUBMENU:=
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=seccomp
++ URL:=https://github.com/seccomp/libseccomp/wiki
++endef
++
++define Package/libseccomp/Default/description
++ The libseccomp library provides an easy to use, platform independent, interface
++ to the Linux Kernel's syscall filtering mechanism. The libseccomp API is
++ designed to abstract away the underlying BPF based syscall filter language and
++ present a more conventional function-call based filtering interface that should
++ be familiar to, and easily adopted by, application developers.
++endef
++
++define Package/libseccomp
++$(call Package/libseccomp/Default)
++ TITLE+= (library)
++ DEPENDS+=
++endef
++
++define Package/libseccomp/description
++ This package contains the seccomp library.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/seccomp.h \
++ $(1)/usr/include/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libseccomp.{a,so*} \
++ $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libseccomp.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libseccomp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libseccomp.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libseccomp))
+diff --git a/feeds/packages/libs/libseccomp/patches/100-dont-use-linux-prctl.h-with-musl.patch b/feeds/packages/libs/libseccomp/patches/100-dont-use-linux-prctl.h-with-musl.patch
+new file mode 100644
+index 0000000..4093ca3
+--- /dev/null
++++ b/feeds/packages/libs/libseccomp/patches/100-dont-use-linux-prctl.h-with-musl.patch
+@@ -0,0 +1,14 @@
++Index: libseccomp-2.2.1/src/system.h
++===================================================================
++--- libseccomp-2.2.1.orig/src/system.h
+++++ libseccomp-2.2.1/src/system.h
++@@ -23,7 +23,9 @@
++ #define _SYSTEM_H
++
++ #include <linux/filter.h>
+++#ifdef __GLIBC__
++ #include <linux/prctl.h>
+++#endif
++
++ #include "configure.h"
++
+diff --git a/feeds/packages/libs/libshout/Makefile b/feeds/packages/libs/libshout/Makefile
+new file mode 100644
+index 0000000..ee96b17
+--- /dev/null
++++ b/feeds/packages/libs/libshout/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libshout
++PKG_VERSION:=2.3.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.us.xiph.org/releases/libshout/
++PKG_MD5SUM:=11765b2592e7ea623ccd93d3f8df172c
++
++PKG_LICENSE:=LGPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libshout
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Library which can be used to write a source client like ices
++ URL:=http://www.icecast.org/download.php
++ DEPENDS:= +libspeex +libtheora +libvorbis +libvorbisidec +libpthread
++endef
++
++define Package/libshout/description
++ libshout allows applications to easily communicate and broadcast
++ to an Icecast streaming media server. It handles the socket connections,
++ metadata communication, and data streaming for the calling application,
++ and lets developers focus on feature sets instead of implementation
++ details.
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++CONFIGURE_VARS += \
++ VORBIS_CFLAGS="-I$(STAGING_DIR)/usr/include/tremor/" \
++ VORBIS_LIBS="$(TARGET_LDFLAGS) -lvorbis -lvorbisidec" \
++
++TARGET_CFLAGS += $(FPIC) -Wl,-rpath-link="$(STAGING_DIR)/usr/lib"
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/shout $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libshout.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/shout.pc $(1)/usr/lib/pkgconfig/
++ $(SED) 's| -I/usr/include||' $(1)/usr/lib/pkgconfig/shout.pc
++endef
++
++define Package/libshout/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libshout.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libshout))
+diff --git a/feeds/packages/libs/libshout/patches/120-vorbis-c.patch b/feeds/packages/libs/libshout/patches/120-vorbis-c.patch
+new file mode 100644
+index 0000000..a9e41f9
+--- /dev/null
++++ b/feeds/packages/libs/libshout/patches/120-vorbis-c.patch
+@@ -0,0 +1,11 @@
++--- a/src/vorbis.c
+++++ b/src/vorbis.c
++@@ -28,7 +28,7 @@
++ #endif
++ #include <stdlib.h>
++
++-#include <vorbis/codec.h>
+++#include <tremor/ivorbiscodec.h>
++
++ #include "shout_private.h"
++ #include "shout_ogg.h"
+diff --git a/feeds/packages/libs/libshout/patches/140-no_example_doc_win32.patch b/feeds/packages/libs/libshout/patches/140-no_example_doc_win32.patch
+new file mode 100644
+index 0000000..9e8b5a3
+--- /dev/null
++++ b/feeds/packages/libs/libshout/patches/140-no_example_doc_win32.patch
+@@ -0,0 +1,17 @@
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -288,12 +288,12 @@ top_builddir = @top_builddir@
++ top_srcdir = @top_srcdir@
++ AUTOMAKE_OPTIONS = 1.6 foreign
++ ACLOCAL_AMFLAGS = -I m4
++-SUBDIRS = include src examples debian doc win32
+++SUBDIRS = include src debian
++ EXTRA_DIST = INSTALL m4/shout.m4 m4/acx_pthread.m4 \
++ m4/ogg.m4 m4/vorbis.m4 m4/xiph_compiler.m4 m4/xiph_net.m4 \
++ m4/xiph_types.m4
++
++-doc_DATA = COPYING NEWS README examples/example.c examples/nonblocking.c
+++doc_DATA = COPYING NEWS README
++ m4datadir = $(datadir)/aclocal
++ m4data_DATA = m4/shout.m4
++ @HAVE_PKGCONFIG_TRUE@pkgconfigdir = $(libdir)/pkgconfig
+diff --git a/feeds/packages/libs/libsigc++/Makefile b/feeds/packages/libs/libsigc++/Makefile
+new file mode 100644
+index 0000000..524bb6f
+--- /dev/null
++++ b/feeds/packages/libs/libsigc++/Makefile
+@@ -0,0 +1,63 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libsigc++
++PKG_VERSION:=2.5.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@GNOME/libsigc++/2.5
++PKG_MD5SUM:=0b74492da5f640ab69888a984c6520d7
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=LGPL-2.1
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libsigcxx
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=typesafe callback system for standard C++
++ URL:=http://libsigc.sourceforge.net/
++ DEPENDS:=+libstdcpp
++endef
++
++define Package/libsigcxx/description
++ It allows you to define signals and to connect those signals to any
++ callback function, either global or a member function, regardless of
++ whether it is static or virtual.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++TARGET_CPPFLAGS += \
++ -fno-strict-aliasing -fno-inline \
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/sigc++-2.0 $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsigc-2.0.{a,so*} $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/sigc++-2.0 $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/sigc++-2.0.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libsigcxx/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsigc-2.0.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libsigcxx))
+diff --git a/feeds/packages/libs/libsigc++/patches/001-no_doc_tests_examples.patch b/feeds/packages/libs/libsigc++/patches/001-no_doc_tests_examples.patch
+new file mode 100644
+index 0000000..f2c22c3
+--- /dev/null
++++ b/feeds/packages/libs/libsigc++/patches/001-no_doc_tests_examples.patch
+@@ -0,0 +1,22 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -22,7 +22,7 @@ doc_subdirs = docs
++ else
++ doc_subdirs =
++ endif
++-SUBDIRS = sigc++ tests examples $(doc_subdirs)
+++SUBDIRS = sigc++
++
++ sigc_configdir = $(libdir)/$(SIGCXX_MODULE_NAME)/include
++ nodist_sigc_config_HEADERS = sigc++config.h
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -204,7 +204,7 @@ am__define_uniq_tagged_files = \
++ ETAGS = etags
++ CTAGS = ctags
++ CSCOPE = cscope
++-DIST_SUBDIRS = sigc++ tests examples docs
+++DIST_SUBDIRS = sigc++
++ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
++ distdir = $(PACKAGE)-$(VERSION)
++ top_distdir = $(distdir)
+diff --git a/feeds/packages/libs/libsndfile/Makefile b/feeds/packages/libs/libsndfile/Makefile
+new file mode 100644
+index 0000000..9e9809d
+--- /dev/null
++++ b/feeds/packages/libs/libsndfile/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2007-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libsndfile
++PKG_VERSION:=1.0.25
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.mega-nerd.com/libsndfile/files/
++PKG_MD5SUM:=e2b7bb637e01022c7d20f95f9c3990a2
++
++PKG_LICENSE:=LGPLv2.1
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libsndfile
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Library for reading/writing audio files
++ URL:=http://www.mega-nerd.com/libsndfile/
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++ DEPENDS:=@!avr32
++endef
++
++define Package/libsndfile/description
++ libsndfile is a library of C routines for reading and writing files
++ containing sampled audio data.
++endef
++
++CONFIGURE_ARGS+= \
++ --disable-alsa \
++ --disable-external-libs \
++ --disable-sqlite
++
++CONFIGURE_VARS += \
++ ac_cv_sys_file_offset_bits=64 \
++ ac_cv_sys_large_files=yes \
++ ac_cv_sys_largefile_CFLAGS=-D_LARGFILE_SOURCE \
++ ac_cv_sys_largefile_LDFLAGS= \
++ ac_cv_sys_largefile_LIBS= \
++ ac_cv_sys_largefile_source=yes
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)
++ $(CP) $(PKG_INSTALL_DIR)/* $(1)/
++endef
++
++define Package/libsndfile/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsndfile.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libsndfile))
+diff --git a/feeds/packages/libs/libsndfile/patches/001-automake-compat.patch b/feeds/packages/libs/libsndfile/patches/001-automake-compat.patch
+new file mode 100644
+index 0000000..2df32ae
+--- /dev/null
++++ b/feeds/packages/libs/libsndfile/patches/001-automake-compat.patch
+@@ -0,0 +1,10 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -1,5 +1,7 @@
++ ## Process this file with automake to produce Makefile.in
++
+++ACLOCAL_AMFLAGS = -I M4
+++
++ DISTCHECK_CONFIGURE_FLAGS = --enable-gcc-werror
++
++ if BUILD_OCTAVE_MOD
+diff --git a/feeds/packages/libs/libsodium/Makefile b/feeds/packages/libs/libsodium/Makefile
+new file mode 100644
+index 0000000..5dbe07c
+--- /dev/null
++++ b/feeds/packages/libs/libsodium/Makefile
+@@ -0,0 +1,72 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libsodium
++PKG_VERSION:=1.0.5
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://download.libsodium.org/libsodium/releases
++PKG_MD5SUM:=69f0c5975d9f4b8e136616df34a43ff5
++
++PKG_FIXUP:=libtool autoreconf
++PKG_USE_MIPS16:=0
++PKG_INSTALL:=1
++
++PKG_MAINTAINER:=Damiano Renfer <damiano.renfer@gmail.com>
++PKG_LICENSE:=ISC
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libsodium
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=P(ortable|ackageable) NaCl-based crypto library
++ URL:=https://github.com/jedisct1/libsodium
++ MAINTAINER:=Damiano Renfer <damiano.renfer@gmail.com>
++endef
++
++define Package/libsodium/description
++ NaCl (pronounced "salt") is a new easy-to-use high-speed software library for network communication, encryption, decryption, signatures, etc.
++ NaCl's goal is to provide all of the core operations needed to build higher-level cryptographic tools.
++ Sodium is a portable, cross-compilable, installable, packageable fork of NaCl (based on the latest released upstream version nacl-20110221), with a compatible API.
++ The design choices, particularly in regard to the Curve25519 Diffie-Hellman function, emphasize security (whereas NIST curves emphasize "performance" at the cost of security), and "magic constants" in NaCl/Sodium have clear rationales.
++ The same cannot be said of NIST curves, where the specific origins of certain constants are not described by the standards.
++ And despite the emphasis on higher security, primitives are faster across-the-board than most implementations of the NIST standards.
++endef
++
++define Package/libsodium/config
++menu "Configuration"
++ depends on PACKAGE_libsodium
++ config LIBSODIUM_MINIMAL
++ bool "Compile only what is required for the high-level API (no aes128ctr), should be fine in most cases."
++ default y
++endmenu
++endef
++
++CONFIGURE_ARGS+= \
++ --disable-ssp \
++ $(if $(CONFIG_LIBSODIUM_MINIMAL),--enable-minimal=yes,--enable-minimal=no)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/sodium
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/sodium.h $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/sodium/*.h $(1)/usr/include/sodium
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsodium.{a,so*} $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libsodium.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libsodium/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsodium.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libsodium))
+diff --git a/feeds/packages/libs/libsoup/Makefile b/feeds/packages/libs/libsoup/Makefile
+new file mode 100644
+index 0000000..a482b5e
+--- /dev/null
++++ b/feeds/packages/libs/libsoup/Makefile
+@@ -0,0 +1,75 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libsoup
++PKG_VERSION:=2.44.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@GNOME/$(PKG_NAME)/2.44
++PKG_MD5SUM:=92aa3667357157e8f3489bcca287f2fa
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++TARGET_LDFLAGS+=\
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib $(if $(ICONV_FULL),-liconv)
++
++define Package/libsoup
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libsoup
++ URL:=http://live.gnome.org/LibSoup
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++ DEPENDS:=+glib2 +libxml2 +libgnutls +libsqlite3 $(ICONV_DEPENDS) $(INTL_DEPENDS)
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --enable-ssl \
++ --disable-glibtest \
++ --without-apache-httpd \
++ --without-gnome \
++ )
++endef
++
++define package/libsoup/decription
++Libsoup is an HTTP library implementation in C
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/{lib/pkgconfig,include/libsoup-2.4/libsoup}
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libsoup-2.4.{so*,la,a} \
++ $(1)/usr/lib/
++
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* \
++ $(1)/usr/lib/pkgconfig/
++
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/include/libsoup-2.4/libsoup/*.h \
++ $(1)/usr/include/libsoup-2.4/libsoup/
++endef
++
++define Package/libsoup/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libsoup-2.4.so* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libsoup))
+diff --git a/feeds/packages/libs/libsoxr/Makefile b/feeds/packages/libs/libsoxr/Makefile
+new file mode 100644
+index 0000000..8f69803
+--- /dev/null
++++ b/feeds/packages/libs/libsoxr/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++# updated to work with latest source from abrasive
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libsoxr
++PKG_VERSION:=0.1.1
++PKG_RELEASE:=2
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://git.code.sf.net/p/soxr/code
++PKG_SOURCE_VERSION:=$(PKG_VERSION)
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_LICENSE:=LGPL-2.1
++PKG_LICENSE_FILES:=LICENCE
++
++PKG_FIXUP:=libtool
++PKG_REMOVE_FILES:=autogen.sh
++
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/libsoxr
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=The SoX Resampler library
++ URL:=http://sourceforge.net/projects/soxr/
++ MAINTAINER:=Mike Brady <mikebrady@eircom.net>
++ DEPENDS:= +libpthread
++endef
++
++define Package/libsoxr/description
++ The SoX Resampler library
++ High quality, one-dimensional sample-rate conversion library
++endef
++
++CMAKE_OPTIONS:= -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTS=0 -DBUILD_EXAMPLES=0
++CMAKE_OPTIONS+= -DHAVE_WORDS_BIGENDIAN_EXITCODE=$(if $(CONFIG_BIG_ENDIAN),0,1)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_BUILD_DIR)/src/soxr.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/src/*.a $(1)/usr/lib/
++endef
++
++define Package/libsoxr/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/src/*.a $(1)/usr/lib/
++endef
++
++
++$(eval $(call BuildPackage,libsoxr))
+diff --git a/feeds/packages/libs/libssh2/Makefile b/feeds/packages/libs/libssh2/Makefile
+new file mode 100644
+index 0000000..7951f63
+--- /dev/null
++++ b/feeds/packages/libs/libssh2/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libssh2
++PKG_VERSION:=1.6.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.libssh2.org/download
++PKG_MD5SUM:=00aabd6e714a5f42a4fb82ace20db1dd
++
++PKG_INSTALL:=1
++
++PKG_LICENSE:=BSD
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libssh2
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=SSH2 library
++ URL:=http://www.libssh2.org/
++ DEPENDS:=+libopenssl +zlib
++ MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++endef
++
++define Package/libssh2/description
++ libssh2 is a client-side C library implementing the SSH2 protocol.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --disable-examples-build \
++ --with-libssl-prefix=$(STAGING_DIR)/usr
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libssh2.so* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libssh2.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libssh2/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libssh2.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libssh2))
+diff --git a/feeds/packages/libs/libstrophe/Config.in b/feeds/packages/libs/libstrophe/Config.in
+new file mode 100644
+index 0000000..ec45f75
+--- /dev/null
++++ b/feeds/packages/libs/libstrophe/Config.in
+@@ -0,0 +1,14 @@
++choice
++ depends on PACKAGE_libstrophe
++ prompt "Select XML library"
++ default libstrophe-expat
++
++config libstrophe-expat
++ bool "expat"
++ select PACKAGE_libexpat
++
++config libstrophe-libxml2
++ bool "libxml2"
++ select PACKAGE_libxml2
++
++endchoice
+diff --git a/feeds/packages/libs/libstrophe/Makefile b/feeds/packages/libs/libstrophe/Makefile
+new file mode 100644
+index 0000000..9905763
+--- /dev/null
++++ b/feeds/packages/libs/libstrophe/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libstrophe
++PKG_VERSION:=0.8.8
++PKG_RELEASE=1
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Chih-Wei Chen <changeway@gmail.com>
++
++PKG_SOURCE_URL:=https://github.com/strophe/libstrophe/archive/
++PKG_SOURCE:=$(PKG_VERSION).tar.gz
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_libstrophe-libxml2 \
++ CONFIG_libstrophe-expat
++
++include $(INCLUDE_DIR)/package.mk
++
++ifeq ($(CONFIG_libstrophe-libxml2),y)
++CONFIGURE_ARGS += \
++ --with-libxml2
++endif
++
++define Package/libstrophe
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=XMPP client library
++ URL:=http://strophe.im/libstrophe
++ DEPENDS:= +libopenssl +libstrophe-libxml2:libxml2 +libstrophe-expat:libexpat
++ MENU:=1
++endef
++
++define Package/libstrophe/description
++ A simple, lightweight C library for writing XMPP clients
++endef
++
++define Package/libstrophe/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/ $(1)/usr/
++
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libstrophe.{la,a,so*} $(1)/usr/lib/
++endef
++
++define Package/libstrophe/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libstrophe.so.* $(1)/usr/lib
++endef
++
++$(eval $(call BuildPackage,libstrophe))
+diff --git a/feeds/packages/libs/libtasn1/Makefile b/feeds/packages/libs/libtasn1/Makefile
+new file mode 100644
+index 0000000..8190add
+--- /dev/null
++++ b/feeds/packages/libs/libtasn1/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2005-2008 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libtasn1
++PKG_VERSION:=4.7
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=ftp://ftp.gnu.org/gnu/libtasn1
++PKG_MD5SUM:=12d10ca4ae0a3b95f7aa06a076da39ec
++
++#PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libtasn1
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=An ASN.1 and DER structures manipulation library
++ MAINTAINER:=Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
++ URL:=ftp://ftp.gnu.org/gnu/libtasn1/
++endef
++
++define Package/libtasn1/description
++ This is a library for Abstract Syntax Notation One (ASN.1) and
++ Distinguish Encoding Rules (DER) manipulation.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libtasn1.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libtasn1.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libtasn1*.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libtasn1/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libtasn1.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libtasn1))
+diff --git a/feeds/packages/libs/libtheora/Makefile b/feeds/packages/libs/libtheora/Makefile
+new file mode 100644
+index 0000000..d5db86c
+--- /dev/null
++++ b/feeds/packages/libs/libtheora/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2008-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libtheora
++PKG_VERSION:=1.1.1
++PKG_RELEASE:=1
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://downloads.xiph.org/releases/theora/
++PKG_MD5SUM:=292ab65cedd5021d6b7ddd117e07cd8e
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=COPYING LICENSE
++
++PKG_FIXUP:=autoreconf
++PKG_BUILD_DEPENDS:=libvorbis
++
++include $(INCLUDE_DIR)/package.mk
++
++PKG_INSTALL=1
++
++define Package/libtheora
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libtheora
++ URL:=http://xiph.org/theora/
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++ DEPENDS:=+libogg
++endef
++
++define Package/libtheora/description
++Theora is Xiph.Org's first publicly released video codec, intended
++for use within the Foundation's Ogg multimedia streaming system.
++Theora is derived directly from On2's VP3 codec; Currently the
++encoders are nearly identical, but Theora will make use of new
++features supported by the decoder to improve over what is
++is possible with VP3.
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --disable-examples \
++ --disable-oggtest \
++ --disable-vorbistest \
++ --disable-sdltest \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/theora/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/theora/* $(1)/usr/include/theora/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{so*,a,la} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libtheora/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libtheora))
+diff --git a/feeds/packages/libs/libtheora/patches/001-no_docs_tests.patch b/feeds/packages/libs/libtheora/patches/001-no_docs_tests.patch
+new file mode 100644
+index 0000000..4a45b8b
+--- /dev/null
++++ b/feeds/packages/libs/libtheora/patches/001-no_docs_tests.patch
+@@ -0,0 +1,33 @@
++diff -urN libtheora-1.1.1/Makefile.am libtheora-1.1.1.new/Makefile.am
++--- libtheora-1.1.1/Makefile.am 2009-07-14 01:55:02.000000000 +0200
+++++ libtheora-1.1.1.new/Makefile.am 2012-12-05 14:21:06.103521554 +0100
++@@ -8,7 +8,7 @@
++ EXAMPLES_DIR =
++ endif
++
++-SUBDIRS = lib include doc tests m4 $(EXAMPLES_DIR)
+++SUBDIRS = lib include m4 $(EXAMPLES_DIR)
++
++
++ # we include the whole debian/ dir in EXTRA_DIST because there's a problem
++diff -urN libtheora-1.1.1/Makefile.in libtheora-1.1.1.new/Makefile.in
++--- libtheora-1.1.1/Makefile.in 2009-10-01 20:04:07.000000000 +0200
+++++ libtheora-1.1.1.new/Makefile.in 2012-12-05 14:21:18.239521864 +0100
++@@ -164,7 +164,7 @@
++ @THEORA_ENABLE_EXAMPLES_TRUE@EXAMPLES_DIR = examples
++ @THEORA_ENABLE_EXAMPLES_FALSE@EXAMPLES_DIR =
++
++-SUBDIRS = lib include doc tests m4 $(EXAMPLES_DIR)
+++SUBDIRS = lib include m4 $(EXAMPLES_DIR)
++
++ # we include the whole debian/ dir in EXTRA_DIST because there's a problem
++ # with autotools and HFS+ MacOSX file systems that caused debian/Makefile.am
++@@ -200,7 +200,7 @@
++ missing mkinstalldirs theora-uninstalled.pc.in theora.pc.in \
++ theoradec-uninstalled.pc.in theoradec.pc.in \
++ theoraenc-uninstalled.pc.in theoraenc.pc.in
++-DIST_SUBDIRS = lib include doc tests m4 examples
+++DIST_SUBDIRS = lib include m4 examples
++ all: config.h
++ $(MAKE) $(AM_MAKEFLAGS) all-recursive
++
+diff --git a/feeds/packages/libs/libtheora/patches/002-no_sdl_check.patch b/feeds/packages/libs/libtheora/patches/002-no_sdl_check.patch
+new file mode 100644
+index 0000000..a1e7256
+--- /dev/null
++++ b/feeds/packages/libs/libtheora/patches/002-no_sdl_check.patch
+@@ -0,0 +1,14 @@
++--- libtheora-1.1.1/configure.ac 2009-10-01 20:00:33.000000000 +0200
+++++ libtheora-1.1.1.new/configure.ac 2012-12-05 14:22:26.319523608 +0100
++@@ -313,11 +313,6 @@
++ dnl check for SDL
++ HAVE_SDL=no
++
++-AM_PATH_SDL(,[
++- HAVE_SDL=yes
++- SDL_LIBS=`$SDL_CONFIG --libs`
++-],AC_MSG_WARN([*** Unable to find SDL -- Not compiling example players ***]))
++-
++ dnl check for OSS
++ HAVE_OSS=no
++ AC_CHECK_HEADERS([sys/soundcard.h soundcard.h machine/soundcard.h],[
+diff --git a/feeds/packages/libs/libtorrent/Makefile b/feeds/packages/libs/libtorrent/Makefile
+new file mode 100644
+index 0000000..2001235
+--- /dev/null
++++ b/feeds/packages/libs/libtorrent/Makefile
+@@ -0,0 +1,69 @@
++#
++# Copyright (C) 2007-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libtorrent
++PKG_VERSION:=0.13.4-git-1
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/rakshasa/libtorrent.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=72e908707f01ee01a9b4918436c64348878b63f7
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_FIXUP:=autoreconf
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libtorrent
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Rakshasa's BitTorrent library
++ URL:=http://libtorrent.rakshasa.no/
++ DEPENDS:=+libopenssl +libsigcxx
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++endef
++
++define Package/libtorrent/description
++ LibTorrent is a BitTorrent library written in C++ for *nix, with a focus on
++ high performance and good code. The library differentiates itself from other
++ implementations by transfering directly from file pages to the network stack.
++ On high-bandwidth connections it is able to seed at 3 times the speed of the
++ official client.
++endef
++
++TARGET_LDFLAGS += $(LIBGCC_S)
++
++CONFIGURE_ARGS+= \
++ --enable-shared \
++ --enable-static \
++ --enable-aligned \
++ --disable-debug \
++ --enable-openssl \
++ --disable-instrumentation \
++ --with-zlib=$(STAGING_DIR)/usr \
++ $(call autoconf_bool,CONFIG_IPV6,ipv6)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/torrent $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libtorrent.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libtorrent.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libtorrent/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libtorrent.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libtorrent))
+diff --git a/feeds/packages/libs/libtorrent/patches/100-fix_cross_compile.patch b/feeds/packages/libs/libtorrent/patches/100-fix_cross_compile.patch
+new file mode 100644
+index 0000000..a096946
+--- /dev/null
++++ b/feeds/packages/libs/libtorrent/patches/100-fix_cross_compile.patch
+@@ -0,0 +1,41 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -19,7 +19,6 @@ AC_SUBST(LIBTORRENT_INTERFACE_VERSION_NO
++
++ AM_INIT_AUTOMAKE
++ AC_CONFIG_HEADERS(config.h)
++-AM_PATH_CPPUNIT(1.9.6)
++
++ AC_PROG_CXX
++
++--- a/scripts/checks.m4
+++++ b/scripts/checks.m4
++@@ -96,7 +96,7 @@ AC_DEFUN([TORRENT_CHECK_KQUEUE], [
++ AC_DEFUN([TORRENT_CHECK_KQUEUE_SOCKET_ONLY], [
++ AC_MSG_CHECKING(whether kqueue supports pipes and ptys)
++
++- AC_RUN_IFELSE([AC_LANG_SOURCE([
+++ AC_LINK_IFELSE([AC_LANG_SOURCE([
++ #include <fcntl.h>
++ #include <stdlib.h>
++ #include <unistd.h>
++--- a/scripts/common.m4
+++++ b/scripts/common.m4
++@@ -153,7 +153,7 @@ dnl Need to fix this so that it uses t
++ AC_DEFUN([TORRENT_CHECK_EXECINFO], [
++ AC_MSG_CHECKING(for execinfo.h)
++
++- AC_RUN_IFELSE([AC_LANG_SOURCE([
+++ AC_LINK_IFELSE([AC_LANG_SOURCE([
++ #include <execinfo.h>
++ int main() { backtrace((void**)0, 0); backtrace_symbols((char**)0, 0); return 0;}
++ ])],
++@@ -168,7 +168,7 @@ AC_DEFUN([TORRENT_CHECK_EXECINFO], [
++ AC_DEFUN([TORRENT_CHECK_ALIGNED], [
++ AC_MSG_CHECKING(the byte alignment)
++
++- AC_RUN_IFELSE([AC_LANG_SOURCE([
+++ AC_LINK_IFELSE([AC_LANG_SOURCE([
++ #include <inttypes.h>
++ int main() {
++ char buf@<:@8@:>@ = { 0, 0, 0, 0, 1, 0, 0, 0 };
+diff --git a/feeds/packages/libs/libtorrent/patches/120-fix-ipv6_socket_datagram.patch b/feeds/packages/libs/libtorrent/patches/120-fix-ipv6_socket_datagram.patch
+new file mode 100644
+index 0000000..1a46627
+--- /dev/null
++++ b/feeds/packages/libs/libtorrent/patches/120-fix-ipv6_socket_datagram.patch
+@@ -0,0 +1,26 @@
++--- a/src/net/socket_datagram.cc
+++++ b/src/net/socket_datagram.cc
++@@ -73,6 +73,23 @@ SocketDatagram::write_datagram(const voi
++ int r;
++
++ if (sa != NULL) {
+++#ifdef RAK_USE_INET6
+++ if (m_ipv6_socket && sa->family() == rak::socket_address::pf_inet) {
+++ uint32_t addr32[4];
+++ sockaddr_in6 mapped_addr;
+++ memset(&mapped_addr, 0, sizeof(mapped_addr));
+++ mapped_addr.sin6_family = AF_INET6;
+++ addr32[0] = 0;
+++ addr32[1] = 0;
+++ addr32[2] = htonl(0xffff);
+++ addr32[3] = sa->sa_inet()->address_n();
+++ memcpy(mapped_addr.sin6_addr.s6_addr, addr32, sizeof(uint32_t) * 4);
+++ mapped_addr.sin6_port = sa->sa_inet()->port_n();
+++ r = ::sendto(m_fileDesc, buffer, length, 0, (sockaddr*)&mapped_addr, sizeof(mapped_addr));
+++ } else if (m_ipv6_socket && sa->family() == rak::socket_address::pf_inet6) {
+++ r = ::sendto(m_fileDesc, buffer, length, 0, sa->sa_inet6()->c_sockaddr(), sizeof(rak::socket_address_inet6));
+++ } else
+++#endif
++ r = ::sendto(m_fileDesc, buffer, length, 0, sa->sa_inet()->c_sockaddr(), sizeof(rak::socket_address_inet));
++ } else {
++ r = ::send(m_fileDesc, buffer, length, 0);
+diff --git a/feeds/packages/libs/libuecc/Makefile b/feeds/packages/libs/libuecc/Makefile
+new file mode 100644
+index 0000000..fb26933
+--- /dev/null
++++ b/feeds/packages/libs/libuecc/Makefile
+@@ -0,0 +1,47 @@
++#
++# Copyright (C) 2012-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libuecc
++PKG_VERSION:=6
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=Matthias Schiffer <mschiffer@universe-factory.net>
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=https://projects.universe-factory.net/attachments/download/83
++PKG_MD5SUM:=cba68339ff46482ec4090303de18fff4
++
++PKG_LICENSE:=BSD-2-Clause
++PKG_LICENSE_FILES:=COPYRIGHT
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/libuecc
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Very small Elliptic Curve Cryptography library
++ URL:=http://git.universe-factory.net/libuecc/
++endef
++
++TARGET_CFLAGS += -ffunction-sections -fdata-sections
++
++CMAKE_OPTIONS += \
++ -DCMAKE_BUILD_TYPE:String="MINSIZEREL"
++
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libuecc-$(PKG_VERSION) $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libuecc.a $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libuecc.pc $(1)/usr/lib/pkgconfig/
++endef
++
++$(eval $(call BuildPackage,libuecc))
+diff --git a/feeds/packages/libs/libugpio/Makefile b/feeds/packages/libs/libugpio/Makefile
+new file mode 100644
+index 0000000..66168c1
+--- /dev/null
++++ b/feeds/packages/libs/libugpio/Makefile
+@@ -0,0 +1,72 @@
++#
++# Copyright (C) 2012-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libugpio
++PKG_VERSION:=0.0.6
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://github.com/mhei/libugpio/releases/download/v$(PKG_VERSION)
++PKG_MD5SUM:=09c35abbc25f7ebff125bc43ff21ac35
++
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING.LESSER
++
++PKG_MAINTAINER:=Michael Heimpold <mhei@heimpold.de>
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libugpio
++ SECTION:=libs
++ CATEGORY:=Libraries
++ URL:=https://github.com/mhei/libugpio
++ TITLE:=Library for using sysfs gpio interface from C programs
++ DEPENDS:=@GPIO_SUPPORT
++endef
++
++define Package/libugpio/description
++ libugpio is a library to ease the use of linux kernel's sysfs
++ gpio interface from C programs and/or other libraries.
++endef
++
++define Package/gpioctl-sysfs
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Tool for controlling gpio pins
++ DEPENDS:=+libugpio
++endef
++
++define Package/gpioctl-sysfs/description
++ Tool for controlling gpio pins using the sysfs api provided by the kernel.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/ugpio $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libugpio.{so*,a} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libugpio.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libugpio/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libugpio.so* $(1)/usr/lib/
++endef
++
++define Package/gpioctl-sysfs/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/gpioctl $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libugpio))
++$(eval $(call BuildPackage,gpioctl-sysfs))
+diff --git a/feeds/packages/libs/libunistring/Makefile b/feeds/packages/libs/libunistring/Makefile
+new file mode 100644
+index 0000000..98ebb34
+--- /dev/null
++++ b/feeds/packages/libs/libunistring/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libunistring
++PKG_VERSION:=0.9.6
++PKG_RELEASE:=1
++PKG_MD5SUM:=dfae4ff5583649ed24d8f368f1d0543b
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://ftp.gnu.org/gnu/libunistring
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++PKG_MAINTAINER:=Espen Jürgensen <espenjurgensen+openwrt@gmail.com>
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libunistring
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libunistring
++ URL:=http://www.gnu.org/software/libunistring/
++endef
++
++define Package/libunistring/description
++ This library provides functions for manipulating Unicode strings and for manipulating C strings according to the Unicode standard.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --without-libiconv-prefix \
++ --without-libpth-prefix
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/include/unistring
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/unistring/*.h $(1)/usr/include/unistring/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libunistring.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/libunistring/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libunistring.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libunistring))
+diff --git a/feeds/packages/libs/libupm/Makefile b/feeds/packages/libs/libupm/Makefile
+new file mode 100644
+index 0000000..93287c5
+--- /dev/null
++++ b/feeds/packages/libs/libupm/Makefile
+@@ -0,0 +1,82 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libupm
++PKG_VERSION:=0.4.0
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/intel-iot-devkit/upm.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=04dc6df4297a7766d6f1a8fef9699d586e7e0d92
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++CMAKE_INSTALL:=1
++
++PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
++PKG_LICENSE:=LGPL-2.1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++UPM_MODULES:= \
++ a110x ad8232 adafruitss adc121c021 adis16448 adxl335 adxl345 am2315 apds9002 at42qt1070 biss0001 bmpx8x buzzer \
++ cjq4435 ds1307 ecs1030 enc03r flex gas gp2y0a grovecircularled grovecollision groveehr groveeldriver groveelectromagnet \
++ groveemg grovegprs grovegsr grovelinefinder grovemd grovemoisture groveo2 grovescam grove grovespeaker grovevdiv grovewater \
++ grovewfs guvas12d h3lis331dl hcsr04 hm11 hmc5883l hmtrp hp20x ht9170 htu21d hx711 i2clcd ina132 isd1820 itg3200 joystick12 \
++ l298 ldt0028 lm35 lol loudness lpd8806 lsm303 lsm9ds0 m24lr64e max31723 max31855 max44000 max5487 maxds3231m maxsonarez \
++ mg811 mhz16 mic mlx90614 mma7455 mma7660 mpl3115a2 mpr121 mpu9150 mq303a my9221 nrf24l01 nrf8001 nunchuck otp538u \
++ pn532 ppd42ns pulsensor rfr359f rgbringcoder rotaryencoder rpr220 servo si114x sm130 st7735 stepmotor sx6119 ta12200 tcs3414cs \
++ th02 tm1637 tsl2561 ttp223 ublox6 uln200xa waterlevel wheelencoder wt5001 yg1006 zfm20
++
++CMAKE_OPTIONS=-DBUILDARCH=$(CONFIG_ARCH) \
++ -DNODE_EXECUTABLE=$(STAGING_DIR_HOST)/bin/node \
++ -DSWIG_DIR=$(STAGING_DIR_HOST)/bin
++
++define Package/libupm/Default
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libmraa +librt
++ SUBMENU:=IoT
++endef
++
++define Package/libupm
++ $(call Package/libupm/Default)
++ TITLE:=Intel IoT sensor library - Full
++endef
++
++define Package/libupm/install/Default
++ $(INSTALL_DIR) $(1)/usr/lib/{node/,python2.7/site-packages}; \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libupm-$(2).so* $(1)/usr/lib/; \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/node_modules/jsupm_$(2) $(1)/usr/lib/node/; \
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/python2.7/site-packages/{pyupm_$(2).py,_pyupm_$(2).so} \
++ $(1)/usr/lib/python2.7/site-packages/ ;
++endef
++
++define Package/libupm/install
++ $(foreach module, $(UPM_MODULES), \
++ $(call Package/libupm/install/Default,$(1),$(module)))
++endef
++
++define UpmPackage
++define Package/libupm-$(1)
++ $(call Package/libupm/Default)
++ TITLE:=Intel IoT sensor library - $(1)
++endef
++
++define Package/libupm-$(1)/install
++ $(call Package/libupm/install/Default,$$(1),$(1))
++endef
++endef
++
++$(eval $(call BuildPackage,libupm))
++$(foreach package, $(UPM_MODULES), \
++ $(eval $(call UpmPackage,$(package))) \
++ $(eval $(call BuildPackage,libupm-$(package))) \
++)
+diff --git a/feeds/packages/libs/libupm/patches/001-version.patch b/feeds/packages/libs/libupm/patches/001-version.patch
+new file mode 100644
+index 0000000..3d4fd6c
+--- /dev/null
++++ b/feeds/packages/libs/libupm/patches/001-version.patch
+@@ -0,0 +1,16 @@
++--- a/CMakeLists.txt
+++++ b/CMakeLists.txt
++@@ -26,12 +26,7 @@
++ include(GNUInstallDirs)
++
++ # Make a version file containing the current version from git.
++-include (GetGitRevisionDescription)
++-git_describe (VERSION "--tags")
++-if ("x_${VERSION}" STREQUAL "x_GIT-NOTFOUND")
++- message (WARNING " - Install git to compile a production UPM!")
++- set (VERSION "v0.4.0-dirty")
++-endif ()
+++set (VERSION "v0.4.0")
++
++ message (INFO " - UPM Version ${VERSION}")
++
+diff --git a/feeds/packages/libs/libupm/patches/002-at42qt1070-id.patch b/feeds/packages/libs/libupm/patches/002-at42qt1070-id.patch
+new file mode 100644
+index 0000000..85544c9
+--- /dev/null
++++ b/feeds/packages/libs/libupm/patches/002-at42qt1070-id.patch
+@@ -0,0 +1,11 @@
++--- a/src/at42qt1070/at42qt1070.cxx
+++++ b/src/at42qt1070/at42qt1070.cxx
++@@ -53,7 +53,7 @@
++ return;
++ }
++
++- if (readChipID() != 0x2E) {
+++ if (readChipID() != 0x1b && readChipID() != 0x2E) {
++ throw std::runtime_error("Chip ID does not match the expected value (2Eh)");
++ }
++
+diff --git a/feeds/packages/libs/libupm/patches/003-lsm303-args.patch b/feeds/packages/libs/libupm/patches/003-lsm303-args.patch
+new file mode 100644
+index 0000000..d2b2d0e
+--- /dev/null
++++ b/feeds/packages/libs/libupm/patches/003-lsm303-args.patch
+@@ -0,0 +1,11 @@
++--- a/src/lsm303/lsm303.h
+++++ b/src/lsm303/lsm303.h
++@@ -34,7 +34,7 @@
++
++ /* LSM303 Address definitions */
++ #define LSM303_MAG 0x1E // assuming SA0 grounded
++-#define LSM303_ACC 0x18 // assuming SA0 grounded
+++#define LSM303_ACC 0x1E // assuming SA0 grounded
++
++ /* LSM303 Register definitions */
++ #define CTRL_REG1_A 0x20
+diff --git a/feeds/packages/libs/libupnp/Makefile b/feeds/packages/libs/libupnp/Makefile
+new file mode 100644
+index 0000000..ad49703
+--- /dev/null
++++ b/feeds/packages/libs/libupnp/Makefile
+@@ -0,0 +1,76 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libupnp
++PKG_VERSION:=1.6.19
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/pupnp
++PKG_MD5SUM:=ee16e5d33a3ea7506f38d71facc057dd
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libupnp/Default
++ SECTION:=libs
++ CATEGORY:=Libraries
++ URL:=http://pupnp.sourceforge.net/
++endef
++
++define Package/libupnp
++ $(call Package/libupnp/Default)
++ DEPENDS:=+libpthread
++ TITLE:=UPnP SDK library
++ MENU:=1
++endef
++
++define Package/libupnp/description
++The portable SDK for UPnP Devices (libupnp) provides developers with an API and
++open source code for building control points, devices, and bridges that are
++compliant with Version 1.0 of the Universal Plug and Play Device Architecture
++Specification.
++endef
++
++define Package/libupnp-sample
++ $(call Package/libupnp/Default)
++ DEPENDS:=libupnp
++ TITLE:=UPnP sample applications
++endef
++
++define Package/libupnp-sample/description
++TVcontrolpoint & tvdevice sample applications run inside /etc/upnp-tvdevice/
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/upnp $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib{ixml,threadutil,upnp}.{a,so*,la} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libupnp.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libupnp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib{ixml,threadutil,upnp}.so.* $(1)/usr/lib/
++endef
++
++define Package/libupnp-sample/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/upnp/sample/.libs/* $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/etc/upnp-tvdevice/web
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/upnp/sample/web/* $(1)/etc/upnp-tvdevice
++endef
++
++$(eval $(call BuildPackage,libupnp))
++$(eval $(call BuildPackage,libupnp-sample))
+diff --git a/feeds/packages/libs/libupnpp/Makefile b/feeds/packages/libs/libupnpp/Makefile
+new file mode 100644
+index 0000000..9231874
+--- /dev/null
++++ b/feeds/packages/libs/libupnpp/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libupnpp
++PKG_VERSION:=0.11.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.lesbonscomptes.com/upmpdcli/downloads
++PKG_MD5SUM:=faefaef9e7dbfe57d9224cf49aab6e2e
++PKG_MAINTAINER:=Petko Bordjukov <bordjukov@gmail.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libupnpp
++ SECTION:=libs
++ CATEGORY:=Libraries
++ URL:=http://www.lesbonscomptes.com/upmpdcli
++ DEPENDS+= +libstdcpp +libexpat +librt +libcurl +libupnp
++ TITLE:=The libupnpp C++ library wraps libupnp for easier use by upmpdcli and upplay
++endef
++
++define Package/libupnpp/description
++libupnpp defines useful objects over libupnp and can be used to create both devices
++and control points. It is shared by upmpdcli and upplay.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libupnpp $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libupnpp.so* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libupnpp.la $(1)/usr/lib/
++endef
++
++define Package/libupnpp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libupnpp.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libupnpp))
+diff --git a/feeds/packages/libs/liburcu/Makefile b/feeds/packages/libs/liburcu/Makefile
+new file mode 100644
+index 0000000..aaf869a
+--- /dev/null
++++ b/feeds/packages/libs/liburcu/Makefile
+@@ -0,0 +1,52 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++# Copyright (C) 2014 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=liburcu
++PKG_VERSION:=0.8.7
++PKG_RELEASE:=1
++
++PKG_SOURCE:=userspace-rcu-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=userspace-rcu-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://lttng.org/files/urcu/
++PKG_MD5SUM:=7a6ee17871d31226db3f618e28351d22
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/userspace-rcu-$(PKG_VERSION)
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/liburcu
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=User-space Read-Copy-Update library
++ URL:=https://lttng.org/
++ MAINTAINER:=daniel.salzman@nic.cz
++ DEPENDS:=+libpthread
++endef
++
++define Package/liburcu/description
++ Userspace Read-Copy-Update library.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/urcu* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liburcu*.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/liburcu/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liburcu*.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,liburcu))
+diff --git a/feeds/packages/libs/libusbmuxd/Makefile b/feeds/packages/libs/libusbmuxd/Makefile
+new file mode 100644
+index 0000000..ec15bc2
+--- /dev/null
++++ b/feeds/packages/libs/libusbmuxd/Makefile
+@@ -0,0 +1,90 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libusbmuxd
++PKG_VERSION:=1.1.0
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=Lukasz Baj <l.baj@radytek.com>
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING.LGPLv2.1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/libimobiledevice/libusbmuxd.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=f347085157006523622b0a7160be68d14f037c00
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libusbmuxd/Default
++ TITLE:=USB multiplexing daemon
++ URL:=http://www.libimobiledevice.org/
++endef
++
++define Package/libusbmuxd/Default/description
++ This daemon is in charge of multiplexing connections over USB to an iPhone or
++ iPod touch. To users, it means you can sync your music, contacts, photos, etc.
++ over USB. To developers, it means you can connect to any listening localhost
++ socket on the device. usbmuxd is not used for tethering data transfer, which
++ uses a dedicated USB interface as a virtual network device.
++endef
++
++define Package/libusbmuxd
++ $(call Package/libusbmuxd/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= library
++ DEPENDS:=+libplist +libpthread +libxml2 +zlib
++endef
++
++define Package/libusbmuxd/description
++ $(call Package/libusbmuxd/Default/description)
++ This package contains the libusbmuxd shared library.
++endef
++
++define Package/libusbmuxd-utils
++ $(call Package/libusbmuxd/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= utilies
++ DEPENDS:=+libusbmuxd
++endef
++
++define Package/libusbmuxd-utils/description
++ $(call Package/libusbmuxd/Default/description)
++ This package contains the libusbmuxd utilities.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libusbmuxd.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libusbmuxd.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libusbmuxd/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libusbmuxd.so.* $(1)/usr/lib/
++endef
++
++define Package/libusbmuxd-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/iproxy $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libusbmuxd))
++$(eval $(call BuildPackage,libusbmuxd-utils))
+diff --git a/feeds/packages/libs/libuv/Makefile b/feeds/packages/libs/libuv/Makefile
+new file mode 100644
+index 0000000..336c3ee
+--- /dev/null
++++ b/feeds/packages/libs/libuv/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libuv
++PKG_VERSION:=1.6.1
++PKG_RELEASE:=1
++
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://dist.libuv.org/dist/v$(PKG_VERSION)/
++PKG_MD5SUM:=51cfa3d8adc05852982e3c742ec3c039
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-v$(PKG_VERSION)
++PKG_BUILD_PARALLEL:=1
++
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libuv
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Cross-platform asychronous I/O library
++ URL:=https://github.com/libuv/libuv
++ DEPENDS:=+libpthread +librt
++endef
++
++define Package/libuv/description
++ libuv is a multi-platform support library with a focus on asynchronous I/O. It
++ was primarily developed for use by Node.js, but it's also used by Luvit, Julia,
++ pyuv, and others.
++endef
++
++define Build/Configure
++ ( cd $(PKG_BUILD_DIR); ./autogen.sh )
++ $(call Build/Configure/Default)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/* \
++ $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libuv.so* \
++ $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libuv.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libuv/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libuv.so* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libuv))
+diff --git a/feeds/packages/libs/libuvc/Makefile b/feeds/packages/libs/libuvc/Makefile
+new file mode 100644
+index 0000000..3c9b8b9
+--- /dev/null
++++ b/feeds/packages/libs/libuvc/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libuvc
++
++PKG_VERSION=0.0.5-20140812-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/ktossell/libuvc.git
++PKG_SOURCE_VERSION:=2c6403405872aa865999b95ba15944295adf6c38
++
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_LICENSE:=BSD
++
++PKG_INSTALL:=1
++CMAKE_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/libuvc
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libuvc
++ DEPENDS:=+libusb-1.0 +libjpeg
++ URL:=https://int80k.com/libuvc
++endef
++
++define Package/libuvc/description
++ This package contains libuvc is a cross-platform library for USB video devices,
++ built atop libusb.
++endef
++
++define Package/libuvc/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libuvc.so* $(1)/usr/lib/
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/{include,lib}
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libuvc.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libuvc))
+diff --git a/feeds/packages/libs/libv4l/Makefile b/feeds/packages/libs/libv4l/Makefile
+new file mode 100644
+index 0000000..841ffa5
+--- /dev/null
++++ b/feeds/packages/libs/libv4l/Makefile
+@@ -0,0 +1,116 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++# Copyright (C) 2009 David Cooper <dave@kupesoft.com>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=v4l-utils
++PKG_VERSION:=1.6.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.linuxtv.org/downloads/v4l-utils
++PKG_MD5SUM:=307858616be6374f63bf946307f15a7f
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=GPL-2.0 LGPL-2.1
++PKG_LICENSE_FILES:=COPYING COPYING.libv4l
++
++PKG_USE_MIPS16:=0
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_BUILD_DEPENDS:=argp-standalone
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/libv4l/Default
++ TITLE:=Video 4 Linux
++ URL:=http://www.linuxtv.org/
++endef
++
++define Package/libv4l/Default/description
++ libv4l is a collection of libraries which adds a thin abstraction layer on
++ top of video4linux2 devices. The purpose of this (thin) layer is to make it
++ easy for application writers to support a wide variety of devices without
++ having to write separate code for different devices in the same class. libv4l
++ consists of 3 different libraries: libv4lconvert, libv4l1 and libv4l2.
++
++ libv4l1 offers the (deprecated) v4l1 API on top of v4l2 devices, independent
++ of the drivers for those devices supporting v4l1 compatibility (which many
++ v4l2 drivers do not).
++
++ libv4l2 offers the v4l2 API on top of v4l2 devices, while adding for the
++ application transparent libv4lconvert conversion where necessary.
++endef
++
++define Package/libv4l
++ $(call Package/libv4l/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= wrapper libraries
++ DEPENDS := +libpthread +librt $(ICONV_DEPENDS)
++endef
++
++define Package/libv4l/description
++ $(call Package/libv4l/Default/description)
++endef
++
++define Package/v4l-utils
++ $(call Package/libv4l/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= utilities
++ DEPENDS := +libv4l $(CXX_DEPENDS) $(ICONV_DEPENDS)
++endef
++
++define Package/v4l-utils/description
++ $(call Package/libv4l/Default/description)
++ This package contains the video4linux utilities.
++endef
++
++TARGET_CFLAGS += $(FPIC) -std=gnu99
++TARGET_LDFLAGS += -largp
++
++CONFIGURE_ARGS+= \
++ --disable-doxygen-doc \
++ --disable-libdvbv5 \
++ --disable-qv4l2 \
++ --without-jpeg \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libv4l{1,2,convert}.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libv4l{1,2,convert}.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libv4l/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libv4l{1,2,convert}.so.* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/libv4l
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libv4l/v4l{1compat,2convert}.so $(1)/usr/lib/libv4l/
++endef
++
++define Package/v4l-utils/install
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_INSTALL_DIR)/etc/rc_maps.cfg $(1)/etc/
++ $(CP) $(PKG_INSTALL_DIR)/etc/rc_keymaps $(1)/etc/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/{cx18,ivtv}-ctl $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/decode_tm6000 $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/ir-keytable $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/v4l2-{compliance,ctl,sysfs-path} $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libv4l))
++$(eval $(call BuildPackage,v4l-utils))
+diff --git a/feeds/packages/libs/libv4l/patches/001-no-shm_open-fix.patch b/feeds/packages/libs/libv4l/patches/001-no-shm_open-fix.patch
+new file mode 100644
+index 0000000..382f5c7
+--- /dev/null
++++ b/feeds/packages/libs/libv4l/patches/001-no-shm_open-fix.patch
+@@ -0,0 +1,57 @@
++--- a/lib/libv4lconvert/control/libv4lcontrol.c
+++++ b/lib/libv4lconvert/control/libv4lcontrol.c
++@@ -570,7 +570,7 @@ static void v4lcontrol_get_flags_from_db
++ struct v4lcontrol_data *v4lcontrol_create(int fd, void *dev_ops_priv,
++ const struct libv4l_dev_ops *dev_ops, int always_needs_conversion)
++ {
++- int shm_fd;
+++ int shm_fd, fdflags;
++ int i, rc, got_usb_info, speed, init = 0;
++ char *s, shm_name[256], pwd_buf[1024];
++ struct v4l2_capability cap;
++@@ -695,33 +695,38 @@ struct v4lcontrol_data *v4lcontrol_creat
++
++ if (getpwuid_r(geteuid(), &pwd, pwd_buf, sizeof(pwd_buf), &pwd_p) == 0) {
++ if (got_usb_info)
++- snprintf(shm_name, 256, "/libv4l-%s:%s:%04x:%04x:%s", pwd.pw_name,
+++ snprintf(shm_name, 256, "/dev/shm/libv4l-%s:%s:%04x:%04x:%s", pwd.pw_name,
++ cap.bus_info, (int)vendor_id, (int)product_id, cap.card);
++ else
++- snprintf(shm_name, 256, "/libv4l-%s:%s:%s", pwd.pw_name,
+++ snprintf(shm_name, 256, "/dev/shm/libv4l-%s:%s:%s", pwd.pw_name,
++ cap.bus_info, cap.card);
++ } else {
++ perror("libv4lcontrol: error getting username using uid instead");
++ if (got_usb_info)
++- snprintf(shm_name, 256, "/libv4l-%lu:%s:%04x:%04x:%s",
+++ snprintf(shm_name, 256, "/dev/shm/libv4l-%lu:%s:%04x:%04x:%s",
++ (unsigned long)geteuid(), cap.bus_info,
++ (int)vendor_id, (int)product_id, cap.card);
++ else
++- snprintf(shm_name, 256, "/libv4l-%lu:%s:%s", (unsigned long)geteuid(),
+++ snprintf(shm_name, 256, "/dev/shm/libv4l-%lu:%s:%s", (unsigned long)geteuid(),
++ cap.bus_info, cap.card);
++ }
++
++ /* / is not allowed inside shm names */
++- for (i = 1; shm_name[i]; i++)
+++ for (i = 9; shm_name[i]; i++) /* start after "/dev/shm", i = 9 */
++ if (shm_name[i] == '/')
++ shm_name[i] = '-';
++
++ /* Open the shared memory object identified by shm_name */
++- shm_fd = shm_open(shm_name, (O_CREAT | O_EXCL | O_RDWR), (S_IREAD | S_IWRITE));
+++ shm_fd = open(shm_name, (O_CREAT | O_EXCL | O_RDWR), (S_IREAD | S_IWRITE));
++ if (shm_fd >= 0)
++ init = 1;
++ else
++- shm_fd = shm_open(shm_name, O_RDWR, (S_IREAD | S_IWRITE));
+++ shm_fd = open(shm_name, O_RDWR, (S_IREAD | S_IWRITE));
+++
+++ /* This is all uClibc > 0.9.30 seems to do for shm_open() in librt/shm.c */
+++ fdflags = fcntl(shm_fd, F_GETFD, 0);
+++ if (fdflags >= 0)
+++ fdflags = fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC);
++
++ if (shm_fd >= 0) {
++ /* Set the shared memory size */
+diff --git a/feeds/packages/libs/libv4l/patches/005-test_for_posix_ioctl.patch b/feeds/packages/libs/libv4l/patches/005-test_for_posix_ioctl.patch
+new file mode 100644
+index 0000000..e945bbf
+--- /dev/null
++++ b/feeds/packages/libs/libv4l/patches/005-test_for_posix_ioctl.patch
+@@ -0,0 +1,23 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -80,6 +80,20 @@ gl_VISIBILITY
++ AC_CHECK_HEADERS([sys/klog.h])
++ AC_CHECK_FUNCS([klogctl])
++
+++AC_CACHE_CHECK([for ioctl with POSIX signature],
+++ [gl_cv_func_ioctl_posix_signature],
+++ [AC_COMPILE_IFELSE(
+++ [AC_LANG_PROGRAM(
+++ [[#include <sys/ioctl.h>]],
+++ [[int ioctl (int, int, ...);]])
+++ ],
+++ [gl_cv_func_ioctl_posix_signature=yes],
+++ [gl_cv_func_ioctl_posix_signature=no])
+++ ])
+++if test "x$gl_cv_func_ioctl_posix_signature" = xyes; then
+++ AC_DEFINE([HAVE_POSIX_IOCTL], [1], [Have ioctl with POSIX signature])
+++fi
+++
++ # Check host os
++ case "$host_os" in
++ linux*)
+diff --git a/feeds/packages/libs/libv4l/patches/020-add-missing-includes.patch b/feeds/packages/libs/libv4l/patches/020-add-missing-includes.patch
+new file mode 100644
+index 0000000..34e0511
+--- /dev/null
++++ b/feeds/packages/libs/libv4l/patches/020-add-missing-includes.patch
+@@ -0,0 +1,28 @@
++--- a/utils/rds-ctl/rds-ctl.cpp
+++++ b/utils/rds-ctl/rds-ctl.cpp
++@@ -29,6 +29,7 @@
++ #include <inttypes.h>
++ #include <getopt.h>
++ #include <sys/types.h>
+++#include <ctype.h>
++ #include <fcntl.h>
++ #include <errno.h>
++ #include <sys/ioctl.h>
++@@ -36,6 +37,7 @@
++ #include <dirent.h>
++ #include <config.h>
++ #include <signal.h>
+++#include <time.h>
++
++ #include <linux/videodev2.h>
++ #include <libv4l2.h>
++--- a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
+++++ b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
++@@ -14,6 +14,7 @@
++ #include <sys/mman.h>
++ #include <dirent.h>
++ #include <math.h>
+++#include <time.h>
++
++ #include "v4l2-ctl.h"
++
+diff --git a/feeds/packages/libs/libv4l/patches/030-musl_compatibility.patch b/feeds/packages/libs/libv4l/patches/030-musl_compatibility.patch
+new file mode 100644
+index 0000000..758be2b
+--- /dev/null
++++ b/feeds/packages/libs/libv4l/patches/030-musl_compatibility.patch
+@@ -0,0 +1,96 @@
++--- a/lib/libv4lconvert/libv4lsyscall-priv.h
+++++ b/lib/libv4lconvert/libv4lsyscall-priv.h
++@@ -35,18 +35,23 @@
++ which is broken on some systems and doesn't include them itself :( */
++
++ #ifdef linux
+++#define __NEED_off_t
++ #include <sys/time.h>
++ #include <syscall.h>
++ #include <linux/types.h>
++ #include <linux/ioctl.h>
++ /* On 32 bits archs we always use mmap2, on 64 bits archs there is no mmap2 */
++ #ifdef __NR_mmap2
+++#undef SYS_mmap2
++ #define SYS_mmap2 __NR_mmap2
++ #define MMAP2_PAGE_SHIFT 12
++ #else
++ #define SYS_mmap2 SYS_mmap
++ #define MMAP2_PAGE_SHIFT 0
++ #endif
+++#if !(defined(__UCLIBC__) || defined(__GLIBC__))
+++typedef off_t __off_t;
+++#endif
++ #endif
++
++ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
++--- a/lib/libv4l1/v4l1compat.c
+++++ b/lib/libv4l1/v4l1compat.c
++@@ -62,7 +62,7 @@ LIBV4L_PUBLIC int open(const char *file,
++ return fd;
++ }
++
++-#ifdef linux
+++#if defined(linux) && (defined(__GLIBC__) || defined(__UCLIBC__))
++ LIBV4L_PUBLIC int open64(const char *file, int oflag, ...)
++ {
++ int fd;
++@@ -94,7 +94,11 @@ LIBV4L_PUBLIC int dup(int fd)
++ return v4l1_dup(fd);
++ }
++
+++#ifdef HAVE_POSIX_IOCTL
+++LIBV4L_PUBLIC int ioctl(int fd, int request, ...)
+++#else
++ LIBV4L_PUBLIC int ioctl(int fd, unsigned long int request, ...)
+++#endif
++ {
++ void *arg;
++ va_list ap;
++@@ -112,12 +116,12 @@ LIBV4L_PUBLIC ssize_t read(int fd, void
++ }
++
++ LIBV4L_PUBLIC void *mmap(void *start, size_t length, int prot, int flags, int fd,
++- __off_t offset)
+++ off_t offset)
++ {
++ return v4l1_mmap(start, length, prot, flags, fd, offset);
++ }
++
++-#ifdef linux
+++#if defined(linux) && (defined(__GLIBC__) || defined(__UCLIBC__))
++ LIBV4L_PUBLIC void *mmap64(void *start, size_t length, int prot, int flags, int fd,
++ __off64_t offset)
++ {
++--- a/lib/libv4l2/v4l2convert.c
+++++ b/lib/libv4l2/v4l2convert.c
++@@ -86,7 +86,7 @@ LIBV4L_PUBLIC int open(const char *file,
++ return fd;
++ }
++
++-#ifdef linux
+++#if defined(linux) && (defined(__GLIBC__) || defined(__UCLIBC__))
++ LIBV4L_PUBLIC int open64(const char *file, int oflag, ...)
++ {
++ int fd;
++@@ -121,7 +121,11 @@ LIBV4L_PUBLIC int dup(int fd)
++ return v4l2_dup(fd);
++ }
++
+++#ifdef HAVE_POSIX_IOCTL
+++LIBV4L_PUBLIC int ioctl(int fd, int request, ...)
+++#else
++ LIBV4L_PUBLIC int ioctl(int fd, unsigned long int request, ...)
+++#endif
++ {
++ void *arg;
++ va_list ap;
++@@ -144,7 +148,7 @@ LIBV4L_PUBLIC void *mmap(void *start, si
++ return v4l2_mmap(start, length, prot, flags, fd, offset);
++ }
++
++-#ifdef linux
+++#if defined(linux) && (defined(__GLIBC__) || defined(__UCLIBC__))
++ LIBV4L_PUBLIC void *mmap64(void *start, size_t length, int prot, int flags, int fd,
++ __off64_t offset)
++ {
+diff --git a/feeds/packages/libs/libvorbis/Makefile b/feeds/packages/libs/libvorbis/Makefile
+new file mode 100644
+index 0000000..aa1c929
+--- /dev/null
++++ b/feeds/packages/libs/libvorbis/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libvorbis
++PKG_VERSION:=1.3.5
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://downloads.xiph.org/releases/vorbis/
++PKG_MD5SUM:=28cb28097c07a735d6af56e598e1c90f
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libvorbis
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libvorbis
++ URL:=http://xiph.org/vorbis/
++ DEPENDS:=+libogg
++endef
++
++define Package/libvorbis/description
++Vorbis is a general purpose audio and music encoding format
++contemporary to MPEG-4's AAC and TwinVQ, the next generation beyond
++MPEG audio layer 3. Unlike the MPEG sponsored formats (and other
++proprietary formats such as RealAudio G2 and Windows' flavor of the
++month), the Vorbis CODEC specification belongs to the public domain.
++All the technical details are published and documented, and any
++software entity may make full use of the format without license
++fee, royalty or patent concerns.
++endef
++
++CONFIGURE_ARGS+= \
++ --disable-oggtest \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/vorbis/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/vorbis/* $(1)/usr/include/vorbis/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{so*,a,la} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DIR) $(1)/usr/share/aclocal/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/aclocal/* $(1)/usr/share/aclocal/
++endef
++
++define Package/libvorbis/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libvorbis))
+diff --git a/feeds/packages/libs/libvorbisidec/Makefile b/feeds/packages/libs/libvorbisidec/Makefile
+new file mode 100644
+index 0000000..dce1090
+--- /dev/null
++++ b/feeds/packages/libs/libvorbisidec/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libvorbisidec
++PKG_REV:=20150104
++PKG_VERSION:=1.0.3-$(PKG_REV)
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://git.xiph.org/tremor.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=b56ffce0c0773ec5ca04c466bc00b1bbcaf65aef
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libvorbisidec
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A fixed-point Ogg/Vorbis decoder library
++ DEPENDS:= +libogg
++ URL:=http://wiki.xiph.org/index.php/Tremor
++endef
++
++define Package/libvorbisidec/description
++ libvorbisidec is "tremor", a fixed-point implementation of libvorbis.
++ It also has libogg built-in. It is suitable as a replacement for
++ libvorbis and libogg in tremor-aware applications.
++ Tremor is a decoder only.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++CONFIGURE_ARGS += --enable-shared --enable-static
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/tremor $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libvorbisidec.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/libvorbisidec/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libvorbisidec.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libvorbisidec))
+diff --git a/feeds/packages/libs/libvpx/Makefile b/feeds/packages/libs/libvpx/Makefile
+new file mode 100644
+index 0000000..ae25bdd
+--- /dev/null
++++ b/feeds/packages/libs/libvpx/Makefile
+@@ -0,0 +1,80 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libvpx
++PKG_VERSION:=1.4.0
++PKG_RELEASE:=1
++
++PKG_REV:=v$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_REV).tar.gz
++PKG_SOURCE_URL:=https://chromium.googlesource.com/webm/libvpx
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_MAINTAINER:=Luiz Angelo Daros de Luca <luizluca@gmail.com>
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libvpx
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libvpx
++ URL:=http://www.webmproject.org/
++ DEPENDS:=+libpthread
++endef
++
++define Package/libvpx/description
++ libvpx is a VP8/VP9 Codec SDK.
++endef
++
++CONFIGURE_ARGS = \
++ --target=generic-gnu \
++ --prefix=$(CONFIGURE_PREFIX) \
++ --libdir=/usr/lib \
++ --enable-static \
++ --enable-shared \
++ --disable-examples \
++ --disable-docs \
++ --disable-unit-tests \
++
++# Add --enable-small as openwrt gcc flags are overwritten
++ifneq ($(findstring -Os,$(TARGET_CFLAGS)),)
++CONFIGURE_ARGS += --enable-small
++endif
++
++# libvpx expects gcc as linker but uses $LD if provided
++# However, OpenWRT defines LD as *-uclibc-ld and not *-gcc
++CONFIGURE_VARS += \
++ CROSS=$(GNU_TARGET_NAME) \
++ LD="$(TARGET_CC)" \
++
++MAKE_FLAGS += \
++ LD="$(TARGET_CC)" \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/vpx/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/vpx/* $(1)/usr/include/vpx/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{so*,a} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libvpx/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libvpx))
+diff --git a/feeds/packages/libs/libwebsockets/Makefile b/feeds/packages/libs/libwebsockets/Makefile
+new file mode 100644
+index 0000000..9e827d7
+--- /dev/null
++++ b/feeds/packages/libs/libwebsockets/Makefile
+@@ -0,0 +1,90 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libwebsockets
++PKG_VERSION:=1.4-chrome43-firefox-36
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://github.com/warmcat/libwebsockets.git
++PKG_SOURCE_VERSION:=v$(PKG_VERSION)
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_SOURCE_SUBDIR)
++
++PKG_LICENSE:=LGPL-2.1+exception
++PKG_LICENSE_FILES:=LICENSE
++
++CMAKE_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++CMAKE_OPTIONS += $(if $(CONFIG_IPV6),,-DLWS_IPV6=)
++
++CMAKE_OPTIONS += -DLWS_WITHOUT_TESTAPPS=ON
++
++# other options worth noting
++# CMAKE_OPTIONS += -DLWS_WITHOUT_EXTENSIONS=ON
++# CMAKE_OPTIONS += -DLWS_WITHOUT_DAEMONIZE=ON
++# CMAKE_OPTIONS += -DLWS_WITHOUT_SERVER=ON
++# CMAKE_OPTIONS += -DLWS_WITHOUT_DEBUG=ON
++
++
++define Package/$(PKG_NAME)/Default
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libwebsockets
++ DEPENDS:=+zlib
++ URL:=https://libwebsockets.org
++ MAINTAINER:=Karl Palsson <karlp@remake.is>
++endef
++
++define Package/libwebsockets-openssl
++ $(call Package/$(PKG_NAME)/Default)
++ TITLE += (OpenSSL)
++ DEPENDS += +libopenssl
++ VARIANT:=openssl
++endef
++
++define Package/libwebsockets-cyassl
++ $(call Package/$(PKG_NAME)/Default)
++ TITLE += (CyaSSL)
++ DEPENDS += +libcyassl
++ VARIANT:=cyassl
++endef
++
++ifeq ($(BUILD_VARIANT),openssl)
++ CMAKE_OPTIONS += -DLWS_OPENSSL_CLIENT_CERTS=/etc/ssl/certs
++ CMAKE_OPTIONS += -DLWS_OPENSSL_SUPPORT=ON
++ CMAKE_OPTIONS += -DLWS_WITH_SSL=ON
++endif
++
++ifeq ($(BUILD_VARIANT),cyassl)
++ CMAKE_OPTIONS += -DLWS_OPENSSL_CLIENT_CERTS=/etc/ssl/certs
++ CMAKE_OPTIONS += -DLWS_OPENSSL_SUPPORT=ON
++ CMAKE_OPTIONS += -DLWS_WITH_SSL=ON
++# for cyassl, edit package/libs/cyassl/Makefile to include --enable-opensslextra
++# NOTE: it will compile without it, untested whether it it's needed?!
++ CMAKE_OPTIONS += -DLWS_USE_CYASSL=ON
++ CMAKE_OPTIONS += -DLWS_CYASSL_LIB=$(STAGING_DIR)/usr/lib/libcyassl.so
++ CMAKE_OPTIONS += -DLWS_CYASSL_INCLUDE_DIRS=$(STAGING_DIR)/usr/include
++endif
++
++define Package/libwebsockets/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libwebsockets.so* $(1)/usr/lib/
++endef
++
++Package/$(PKG_NAME)-cyassl/install = $(Package/$(PKG_NAME)/install)
++Package/$(PKG_NAME)-openssl/install = $(Package/$(PKG_NAME)/install)
++
++$(eval $(call BuildPackage,libwebsockets-openssl))
++$(eval $(call BuildPackage,libwebsockets-cyassl))
+diff --git a/feeds/packages/libs/libxerces-c/Makefile b/feeds/packages/libs/libxerces-c/Makefile
+new file mode 100644
+index 0000000..e892084
+--- /dev/null
++++ b/feeds/packages/libs/libxerces-c/Makefile
+@@ -0,0 +1,93 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libxerces-c
++PKG_VERSION:=3.1.2
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://git.apache.org/xerces-c.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=Xerces-C_3_1_2
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=Apache-2.0
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/nls.mk
++include $(INCLUDE_DIR)/package.mk
++
++CONFIGURE_ARGS += \
++ --disable-pretty-make \
++ --enable-transcoder-iconv \
++ --enable-netaccessor-socket \
++ --enable-msgloader-inmemory
++
++TARGET_LDFLAGS += \
++ -lm
++
++define Package/libxerces-c
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Validating XML parser library for C++
++ URL:=http://xerces.apache.org/
++ DEPENDS:=$(CXX_DEPENDS) $(ICONV_DEPENDS) +libc +libpthread
++endef
++
++define Package/libxerces-c-samples
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Validating XML parser library for C++ (samples)
++ URL:=http://xerces.apache.org/
++ DEPENDS:=+libxerces-c
++endef
++
++define Package/libxerces-c/description
++ Xerces-C++ is a validating XML parser written in a portable subset of
++ C++. Xerces-C++ makes it easy to give your application the ability
++ to read and write XML data. A shared library is provided for parsing,
++ generating, manipulating, and validating XML documents. Xerces-C++ is
++ faithful to the XML 1.0 recommendation and associated standards (DOM
++ 1.0, DOM 2.0, SAX 1.0, SAX 2.0, Namespaces, XML Schema Part 1 and
++ Part 2). It also provides experimental implementations of XML 1.1
++ and DOM Level 3.0. The parser provides high performance, modularity,
++ and scalability.
++endef
++
++define Package/libxerces-c-samples/description
++ Validating XML parser library for C++ (samples)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/xercesc/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/xercesc/* $(1)/usr/include/xercesc/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/{libxerces-c.a,libxerces-c-3.1.so,libxerces-c.so} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/xerces-c.pc $(1)/usr/lib/pkgconfig/xerces-c.pc
++endef
++
++define Package/libxerces-c/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/{libxerces-c-3.1.so,libxerces-c.so} $(1)/usr/lib/
++endef
++
++define Package/libxerces-c-samples/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libxerces-c))
++$(eval $(call BuildPackage,libxerces-c-samples))
+diff --git a/feeds/packages/libs/libxml2/Makefile b/feeds/packages/libs/libxml2/Makefile
+new file mode 100644
+index 0000000..8680e9c
+--- /dev/null
++++ b/feeds/packages/libs/libxml2/Makefile
+@@ -0,0 +1,134 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libxml2
++PKG_VERSION:=2.9.2
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://gd.tuwien.ac.at/languages/libxml/ \
++ http://xmlsoft.org/sources/ \
++ ftp://fr.rpmfind.net/pub/libxml/
++PKG_MD5SUM:=9e6a9aca9d155737868b3dc5fd82f788
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++
++PKG_MAINTAINER:=Michael Heimpold <mhei@heimpold.de>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=0
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libxml2
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Gnome XML library
++ URL:=http://xmlsoft.org/
++ DEPENDS:=+libpthread +zlib
++endef
++
++define Package/libxml2/description
++ A library for manipulating XML and HTML resources.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --with-c14n \
++ --without-catalog \
++ --with-debug \
++ --without-docbook \
++ --with-html \
++ --without-ftp \
++ --without-http \
++ --without-iconv \
++ --without-iso8859x \
++ --without-legacy \
++ --with-output \
++ --without-pattern \
++ --without-push \
++ --without-python \
++ --with-reader \
++ --without-readline \
++ --without-regexps \
++ --with-sax1 \
++ --with-schemas \
++ --with-threads \
++ --with-tree \
++ --with-valid \
++ --with-writer \
++ --with-xinclude \
++ --with-xpath \
++ --with-xptr \
++ --with-zlib=$(STAGING_DIR)/usr \
++ --without-lzma
++
++HOST_CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --with-c14n \
++ --without-catalog \
++ --with-debug \
++ --without-docbook \
++ --with-html \
++ --without-ftp \
++ --without-http \
++ --without-iconv \
++ --without-iso8859x \
++ --without-legacy \
++ --with-output \
++ --without-pattern \
++ --without-push \
++ --without-python \
++ --with-reader \
++ --without-readline \
++ --without-regexps \
++ --with-sax1 \
++ --with-schemas \
++ --with-threads \
++ --with-tree \
++ --with-valid \
++ --with-writer \
++ --with-xinclude \
++ --with-xpath \
++ --with-xptr \
++ --with-zlib \
++ --without-lzma
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(2)/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/xml2-config $(2)/bin/
++ $(SED) 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' $(2)/bin/xml2-config
++
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libxml2 $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libxml2.{la,a,so*} $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libxml-2.0.pc $(1)/usr/lib/pkgconfig/
++
++ $(INSTALL_DIR) $(2)/share/aclocal/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/aclocal/* $(2)/share/aclocal
++endef
++
++define Package/libxml2/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libxml2.so* $(1)/usr/lib/
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,libxml2))
+diff --git a/feeds/packages/libs/libxml2/patches/0001-threads-use-forward-declarations-only-for-glibc-fixe.patch b/feeds/packages/libs/libxml2/patches/0001-threads-use-forward-declarations-only-for-glibc-fixe.patch
+new file mode 100644
+index 0000000..e6c3fbe
+--- /dev/null
++++ b/feeds/packages/libs/libxml2/patches/0001-threads-use-forward-declarations-only-for-glibc-fixe.patch
+@@ -0,0 +1,42 @@
++From e3e04d254fb6bac49a285775b729e28b0500476c Mon Sep 17 00:00:00 2001
++From: Michael Heimpold <mhei@heimpold.de>
++Date: Sun, 21 Dec 2014 01:03:49 +0100
++Subject: [PATCH] threads: use forward declarations only for glibc (fixes
++ #704908)
++
++The declarations of pthread functions, used to generate weak references
++to them, fail to suppress macros. Thus, if any pthread function has
++been provided as a macro, compiling threads.c will fail.
++This breaks on musl libc, which defines pthread_equal as a macro (in
++addition to providing the function, as required).
++
++Prevent the declarations for e.g. musl libc by refining the condition.
++
++The idea for this solution was borrowed from the alpine linux guys, see
++http://git.alpinelinux.org/cgit/aports/tree/main/libxml2/libxml2-pthread.patch
++
++Signed-off-by: Michael Heimpold <mhei@heimpold.de>
++---
++ threads.c | 4 ++--
++ 1 file changed, 2 insertions(+), 2 deletions(-)
++
++--- a/threads.c
+++++ b/threads.c
++@@ -47,7 +47,7 @@
++ #ifdef HAVE_PTHREAD_H
++
++ static int libxml_is_threaded = -1;
++-#ifdef __GNUC__
+++#if defined(__GNUC__) && defined(__GLIBC__)
++ #ifdef linux
++ #if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || (__GNUC__ > 3)
++ extern int pthread_once (pthread_once_t *__once_control,
++@@ -89,7 +89,7 @@ extern int pthread_cond_signal ()
++ __attribute((weak));
++ #endif
++ #endif /* linux */
++-#endif /* __GNUC__ */
+++#endif /* defined(__GNUC__) && defined(__GLIBC__) */
++ #endif /* HAVE_PTHREAD_H */
++
++ /*
+diff --git a/feeds/packages/libs/libxslt/Makefile b/feeds/packages/libs/libxslt/Makefile
+new file mode 100644
+index 0000000..df80b65
+--- /dev/null
++++ b/feeds/packages/libs/libxslt/Makefile
+@@ -0,0 +1,152 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libxslt
++PKG_VERSION:=1.1.28
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:= \
++ http://xmlsoft.org/sources/ \
++ ftp://fr.rpmfind.net/pub/libxml/
++PKG_MD5SUM:=9667bf6f9310b957254fdcf6596600b7
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libxslt
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libxml2
++ TITLE:=Gnome XSLT library
++ URL:=http://xmlsoft.org/XSLT/
++endef
++
++define Package/libxslt/description
++ A library for XML transformation using XSLT.
++endef
++
++define Package/libexslt
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libxslt
++ TITLE:=Gnome XSLT library Extention
++ URL:=http://xmlsoft.org/XSLT/EXSLT/
++endef
++
++define Package/libexslt/description
++ An extension for XSLT.
++endef
++
++define Package/xsltproc
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libxml2 +libxslt +libexslt
++ TITLE:=Gnome XSLT xsltproc Utility
++ URL:=http://xmlsoft.org/XSLT/
++endef
++
++define Package/xsltproc/description
++ XSLT XML transformation utility.
++endef
++
++CONFIGURE_ARGS+= \
++ --enable-shared \
++ --enable-static \
++ --without-python \
++ --without-crypto \
++ --without-debug \
++ --without-mem-debug \
++ --without-debugger \
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev/Xslt
++ $(INSTALL_DIR) $(1)/usr/bin $(2)/bin $(1)/usr/include/libxslt \
++ $(1)/usr/include/libexslt $(1)/usr/lib \
++ $(1)/usr/lib/pkgconfig $(2)/share/aclocal
++
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/xslt-config \
++ $(2)/bin/
++
++ ln -sf $(STAGING_DIR)/host/bin/xslt-config $(1)/usr/bin/xslt-config
++
++ $(SED) \
++ 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' \
++ $(2)/bin/xslt-config
++
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/include/libxslt/* \
++ $(1)/usr/include/libxslt/
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxslt.{la,a,so*} \
++ $(1)/usr/lib/
++
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libxslt.pc \
++ $(1)/usr/lib/pkgconfig/
++
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/share/aclocal/* \
++ $(2)/share/aclocal
++endef
++
++define Build/InstallDev/Exslt
++ $(INSTALL_DIR) $(1)/usr/include/libexslt $(1)/usr/lib/pkgconfig
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/include/libexslt/* \
++ $(1)/usr/include/libexslt/
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libexslt.{la,a,so*} \
++ $(1)/usr/lib/
++
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libexslt.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Build/InstallDev
++ $(if $(CONFIG_PACKAGE_libxslt),$(call Build/InstallDev/Xslt,$(1),$(2)))
++ $(if $(CONFIG_PACKAGE_libexslt),$(call Build/InstallDev/Exslt,$(1),$(2)))
++endef
++
++define Package/libxslt/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxslt.so.* \
++ $(1)/usr/lib/
++endef
++
++define Package/libexslt/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libexslt.so.* \
++ $(1)/usr/lib/
++endef
++
++define Package/xsltproc/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/xsltproc \
++ $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libxslt))
++$(eval $(call BuildPackage,libexslt))
++$(eval $(call BuildPackage,xsltproc))
+diff --git a/feeds/packages/libs/libzdb/Makefile b/feeds/packages/libs/libzdb/Makefile
+new file mode 100644
+index 0000000..f3fc66e
+--- /dev/null
++++ b/feeds/packages/libs/libzdb/Makefile
+@@ -0,0 +1,93 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libzdb
++PKG_VERSION:=3.0
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-3.0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.tildeslash.com/libzdb/dist/
++PKG_MD5SUM:=3bb9efff10a1f3ebc5b76c1055c48635
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_BUILD_DEPENDS:=libzdb/host
++
++include $(INCLUDE_DIR)/package.mk
++
++ifeq ($(CONFIG_USE_MUSL),n)
++ LDFLAGS += -lnsl
++endif
++
++define Package/libzdb
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A thread-safe multi database connection pool library
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++ URL:=http://www.tildeslash.com/libzdb/
++ DEPENDS:=+libsqlite3 +libpq +libmysqlclient +zlib +libpthread +libopenssl
++endef
++
++define Package/libzdb/description
++ zdb is a database library with thread-safe connection pooling. The library can connect
++ transparently to multiple database systems. It has zero runtime configuration and connections
++ are specified via a URL scheme. A modern object-oriented API is provided.
++ zdb supports MySQL, PostgreSQL, SQLite, and Oracle.
++ NOTE: This package does not include Oracle support.
++endef
++
++CONFIGURE_ARGS += --disable-profiling \
++ --enable-optimized \
++ --with-mysql \
++ --with-postgresql \
++ --with-sqlite \
++ --enable-sqliteunlock \
++ --enable-openssl
++
++TARGET_CPPFLAGS += -std=c99
++
++include $(INCLUDE_DIR)/host-build.mk
++
++define Hooks/HostConfigure/Pre
++endef
++
++define Host/Configure
++endef
++
++define Host/Compile
++ $(HOSTCC) $(HOST_BUILD_DIR)/tools/filterh/lex.yy.c -o $(HOST_BUILD_DIR)/tools/bin/filterh
++endef
++
++define Host/Install
++ $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin
++ $(CP) $(HOST_BUILD_DIR)/tools/bin/filterh $(STAGING_DIR_HOST)/bin/
++endef
++
++$(eval $(call HostBuild))
++
++define Build/Compile
++ $(call Build/Compile/Default)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/zdb
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/zdb/ $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libzdb* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/zdb.pc $(1)/usr/lib/pkgconfig
++endef
++
++define Package/libzdb/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libzdb.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libzdb))
+diff --git a/feeds/packages/libs/libzdb/patches/010-cross-compile-fixes.patch b/feeds/packages/libs/libzdb/patches/010-cross-compile-fixes.patch
+new file mode 100644
+index 0000000..489b18c
+--- /dev/null
++++ b/feeds/packages/libs/libzdb/patches/010-cross-compile-fixes.patch
+@@ -0,0 +1,186 @@
++diff -rupN libzdb-3.0.orig/configure.ac libzdb-3.0/configure.ac
++--- libzdb-3.0.orig/configure.ac 2014-01-06 22:17:57.000000000 +0100
+++++ libzdb-3.0/configure.ac 2014-11-20 13:59:27.456957651 +0100
++@@ -196,15 +196,6 @@ AC_SEARCH_LIBS([pthread_create], [pthrea
++ # Database Libraries
++
++ mysql="yes"
++-check_mysql_config()
++-{
++- AC_PATH_PROG([MYSQLCONFIG], [mysql_config], [no], [$PATH:/usr/local/bin:/usr/local/mysql/bin])
++- if test "x$MYSQLCONFIG" = "xno"
++- then
++- AC_MSG_WARN([mysql_config is required to build libzdb with mysql])
++- mysql="no"
++- fi
++-}
++ AC_MSG_CHECKING(for mysql)
++ AC_ARG_WITH([mysql],
++ AS_HELP_STRING([--with-mysql(=<path>)],
++@@ -216,22 +207,20 @@ AC_ARG_WITH([mysql],
++ mysql="no"
++ else
++ AC_MSG_RESULT([yes])
++- AC_CHECK_FILE([$with_mysql], [MYSQLCONFIG=$with_mysql], [check_mysql_config])
++ fi
++ ],
++ [
++ AC_MSG_RESULT([yes])
++- check_mysql_config
++ ])
++ if test "xyes" = "x$mysql"; then
++ svd_CPPFLAGS=$CPPFLAGS
++ svd_LDFLAGS=$LDFLAGS
++- CPPFLAGS="`$MYSQLCONFIG --include` $CPPFLAGS"
++- LDFLAGS="`$MYSQLCONFIG --libs` $LDFLAGS"
+++ CPPFLAGS="-I$STAGING_DIR/usr/include/mysql $CPPFLAGS"
+++ LDFLAGS="-L$STAGING_DIR/usr/lib/mysql -L$STAGING_DIR/usr/lib $LDFLAGS"
++ AC_CHECK_HEADERS([mysql.h], [], [mysql="no"])
++ if test "xyes" = "x$mysql"; then
++- DBCPPFLAGS="$DBCPPFLAGS `$MYSQLCONFIG --include`"
++- DBLDFLAGS="$DBLDFLAGS `$MYSQLCONFIG --libs`"
+++ DBCPPFLAGS="$DBCPPFLAGS -I$STAGING_DIR/usr/include/mysql"
+++ DBLDFLAGS="$DBLDFLAGS -L$STAGING_DIR/usr/lib/mysql -L$STAGING_DIR/usr/lib -lmysqlclient -lz -lcrypt -lm $LDFLAGS"
++ AC_DEFINE([HAVE_LIBMYSQLCLIENT], 1, [Define to 1 to enable mysql])
++ else
++ CPPFLAGS=$svd_CPPFLAGS
++@@ -241,15 +230,6 @@ fi
++ AM_CONDITIONAL([WITH_MYSQL], test "xyes" = "x$mysql")
++
++ postgresql="yes"
++-check_postgres_config()
++-{
++- AC_PATH_PROG([PGCONFIG], [pg_config], [no], [$PATH:/usr/local/bin:/usr/local/pgsql/bin])
++- if test "x$PGCONFIG" = "xno"
++- then
++- AC_MSG_WARN([pg_config is required to build libzdb with postgresql])
++- postgresql="no"
++- fi
++-}
++ AC_MSG_CHECKING(for postgresql)
++ AC_ARG_WITH([postgresql],
++ AS_HELP_STRING([--with-postgresql(=<path>)],
++@@ -261,22 +241,20 @@ AC_ARG_WITH([postgresql],
++ postgresql="no"
++ else
++ AC_MSG_RESULT([yes])
++- AC_CHECK_FILE([$with_postgresql], [PGCONFIG=$with_postgresql],[check_postgres_config])
++ fi
++ ],
++ [
++ AC_MSG_RESULT([yes])
++- check_postgres_config
++ ])
++ if test "xyes" = "x$postgresql"; then
++ svd_CPPFLAGS=$CPPFLAGS
++ svd_LDFLAGS=$LDFLAGS
++- CPPFLAGS="-I`$PGCONFIG --includedir` $CPPFLAGS"
++- LDFLAGS="-L`$PGCONFIG --libdir` $LDFLAGS"
+++ CPPFLAGS="-I$STAGING_DIR/usr/include/postgresql -I$STAGING_DIR/usr/include $CPPFLAGS"
+++ LDFLAGS="-L$STAGING_DIR/usr/lib $LDFLAGS"
++ AC_CHECK_HEADERS([libpq-fe.h], [], [postgresql="no"])
++ if test "xyes" = "x$postgresql"; then
++- DBCPPFLAGS="$DBCPPFLAGS -I`$PGCONFIG --includedir`"
++- DBLDFLAGS="$DBLDFLAGS -L`$PGCONFIG --libdir` -lpq"
+++ DBCPPFLAGS="$DBCPPFLAGS -I$STAGING_DIR/usr/include/postgresql -I$STAGING_DIR/usr/include"
+++ DBLDFLAGS="$DBLDFLAGS -L$STAGING_DIR/usr/lib -lpq"
++ AC_DEFINE([HAVE_LIBPQ], 1, [Define to 1 to enable postgresql])
++ else
++ CPPFLAGS=$svd_CPPFLAGS
++@@ -298,22 +276,7 @@ AC_ARG_WITH([sqlite],
++ sqlite="no"
++ else
++ AC_MSG_RESULT([yes])
++- AC_CHECK_FILE([$with_sqlite],
++- [
++- svd_LDFLAGS=$LDFLAGS
++- svd_CPPFLAGS=$CPPFLAGS
++- LDFLAGS="-L$with_sqlite/lib $LDFLAGS -lsqlite3"
++- CPPFLAGS="-I$with_sqlite/include $CPPFLAGS"
++- AC_SEARCH_LIBS([sqlite3_open], [sqlite3],
++- [
++- DBCPPFLAGS="$DBCPPFLAGS -I$with_sqlite/include"
++- DBLDFLAGS="$DBLDFLAGS -L$with_sqlite/lib/ -lsqlite3"
++- ],[sqlite="no"])
++- LDFLAGS=$svd_LDFLAGS
++- CPPFLAGS=$svd_CPPFLAGS
++-
++- ],
++- AC_SEARCH_LIBS([sqlite3_open], [sqlite3], [], [sqlite="no"]))
+++ AC_SEARCH_LIBS([sqlite3_open], [sqlite3], [], [sqlite="no"])
++ fi
++ ],
++ [
++@@ -328,20 +291,8 @@ if test "xyes" = "x$sqlite"; then
++ fi
++ AM_CONDITIONAL([WITH_SQLITE], test "xyes" = "x$sqlite")
++
++-oracle="yes"
++-AC_MSG_CHECKING(for oracle)
++-AX_LIB_ORACLE_OCI
++-if test -n "$ORACLE_OCI_CFLAGS" -a -n "$ORACLE_OCI_LDFLAGS"; then
++- DBCPPFLAGS="$DBCPPFLAGS $ORACLE_OCI_CFLAGS"
++- DBLDFLAGS="$DBLDFLAGS $ORACLE_OCI_LDFLAGS"
++- AC_DEFINE([HAVE_ORACLE], 1, [Define to 1 to enable oracle])
++-else
++- oracle="no"
++-fi
++-AM_CONDITIONAL([WITH_ORACLE], test "xyes" = "x$oracle")
++-
++ # Test if any database system was found
++-if test "xno" = "x$postgresql" -a "xno" = "x$mysql" -a "xno" = "x$sqlite" -a "xno" = "x$oracle"; then
+++if test "xno" = "x$postgresql" -a "xno" = "x$mysql" -a "xno" = "x$sqlite"; then
++ AC_MSG_ERROR([No available database found or selected. Try configure --help])
++ fi
++
++@@ -358,23 +309,6 @@ AC_HEADER_STDC
++ # Functions
++ # ------------------------------------------------------------------------
++
++-# Require a working setjmp
++-AC_RUN_IFELSE([AC_LANG_PROGRAM([[
++- #include <setjmp.h>
++- ]],
++- [[jmp_buf env; setjmp(env);]])],
++- [], [AC_MSG_FAILURE([setjmp is required])]
++-)
++-
++-# Require that we have vsnprintf that conforms to c99. I.e. does bounds check
++-AC_RUN_IFELSE([AC_LANG_PROGRAM([[
++- #include <stdarg.h>
++- #include <stdio.h>
++- ]],
++- [[char t[1]; va_list ap; int n = vsnprintf(t, 1, "hello", ap); if(n == 5) return 0;return 1;]])],
++- [], [AC_MSG_FAILURE([vsnprintf does not conform to c99])]
++-)
++-
++ AC_CHECK_FUNCS([timegm])
++
++
++@@ -487,11 +421,6 @@ echo "| PostgreSQL:
++ else
++ echo "| PostgreSQL: DISABLED |"
++ fi
++-if test "xyes" = "x$oracle"; then
++-echo "| Oracle: ENABLED |"
++-else
++-echo "| Oracle: DISABLED |"
++-fi
++ echo "+------------------------------------------------------------+"
++
++
++diff -rupN libzdb-3.0.orig/Makefile.am libzdb-3.0/Makefile.am
++--- libzdb-3.0.orig/Makefile.am 2014-01-06 22:34:08.000000000 +0100
+++++ libzdb-3.0/Makefile.am 2014-11-20 13:51:22.508204689 +0100
++@@ -45,11 +45,6 @@ libzdb_la_SOURCES += src/db/sqlite/SQLit
++ src/db/sqlite/SQLiteResultSet.c \
++ src/db/sqlite/SQLitePreparedStatement.c
++ endif
++-if WITH_ORACLE
++-libzdb_la_SOURCES += src/db/oracle/OracleConnection.c \
++- src/db/oracle/OracleResultSet.c \
++- src/db/oracle/OraclePreparedStatement.c
++-endif
++
++ API_INTERFACES = src/zdb.h src/db/ConnectionPool.h src/db/Connection.h \
++ src/db/ResultSet.h src/net/URL.h src/db/PreparedStatement.h \
+diff --git a/feeds/packages/libs/libzdb/patches/020-filterh-use-host-built-version.patch b/feeds/packages/libs/libzdb/patches/020-filterh-use-host-built-version.patch
+new file mode 100644
+index 0000000..74c166a
+--- /dev/null
++++ b/feeds/packages/libs/libzdb/patches/020-filterh-use-host-built-version.patch
+@@ -0,0 +1,20 @@
++diff -rupN libzdb-3.0.orig/Makefile.am libzdb-3.0/Makefile.am
++--- libzdb-3.0.orig/Makefile.am 2014-01-06 22:34:08.000000000 +0100
+++++ libzdb-3.0/Makefile.am 2014-11-19 20:26:20.588547729 +0100
++@@ -1,5 +1,7 @@
++ # Copyright (C) Tildeslash Ltd. All rights reserved.
++
+++include $(TOPDIR)/rules.mk
+++
++ AUTOMAKE_OPTIONS = foreign no-dependencies subdir-objects
++ ACLOCAL_AMFLAGS = -I m4
++
++@@ -12,7 +14,7 @@ LIBRARY_NAME = zdb
++
++ RE2C = @RE2C@
++ RE2CFLAGS = -b
++-FILTERH = ./tools/bin/filterh
+++FILTERH = $(STAGING_DIR_HOST)/bin/filterh
++
++ AM_CPPFLAGS = $(CPPFLAGS) $(DBCPPFLAGS)
++ AM_CPPFLAGS += -Isrc -Isrc/util -Isrc/net -Isrc/db -Isrc/exceptions
+diff --git a/feeds/packages/libs/lttng-ust/Makefile b/feeds/packages/libs/lttng-ust/Makefile
+new file mode 100644
+index 0000000..872c5be
+--- /dev/null
++++ b/feeds/packages/libs/lttng-ust/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lttng-ust
++PKG_VERSION:=2.6.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://lttng.org/files/$(PKG_NAME)/
++PKG_MD5SUM:=5c7de27a9968e01ac0b08c7c9cf554d0
++
++PKG_LICENSE:=LGPL-2.1 GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_USE_MIPS16:=0
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lttng-ust
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Linux Trace Toolkit: next generation (library)
++ URL:=https://lttng.org/
++ DEPENDS:= +liburcu +libuuid +librt
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/lttng $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblttng-ust*.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/lttng-ust.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/lttng-ust/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblttng*.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,lttng-ust))
+diff --git a/feeds/packages/libs/lttng-ust/patches/001-no_docs_tests.patch b/feeds/packages/libs/lttng-ust/patches/001-no_docs_tests.patch
+new file mode 100644
+index 0000000..e1c20c6
+--- /dev/null
++++ b/feeds/packages/libs/lttng-ust/patches/001-no_docs_tests.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -20,8 +20,6 @@ if BUILD_JAVA_AGENT
++ SUBDIRS += liblttng-ust-java-agent
++ endif
++
++-SUBDIRS += tests doc
++-
++ #temporarily disabled
++ # liblttng-ust-malloc
++
+diff --git a/feeds/packages/libs/lttng-ust/patches/002-examples.patch b/feeds/packages/libs/lttng-ust/patches/002-examples.patch
+new file mode 100644
+index 0000000..46449b7
+--- /dev/null
++++ b/feeds/packages/libs/lttng-ust/patches/002-examples.patch
+@@ -0,0 +1,18 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -350,7 +350,14 @@ AC_ARG_WITH([lttng-system-rundir],
++ AC_DEFINE_UNQUOTED([LTTNG_SYSTEM_RUNDIR], ["$lttng_system_rundir"],
++ [LTTng system runtime directory])
++
++-AM_PATH_PYTHON([2.7],BUILD_GEN_TP_EXAMPLES=1,[:])
+++AC_ARG_ENABLE([examples],
+++ [AS_HELP_STRING([--enable-examples],[build examples [default=no]])],
+++ [enable_examples=$enableval],
+++ [enable_examples=no]
+++)
+++if test "x$enable_examples" = "xyes"; then
+++ AM_PATH_PYTHON([2.7],BUILD_GEN_TP_EXAMPLES=1,[:])
+++fi
++ AM_CONDITIONAL([BUILD_GEN_TP_EXAMPLES], [test $BUILD_GEN_TP_EXAMPLES], [Build examples requiring lttng-gen-tp])
++
++ AC_CONFIG_FILES([
+diff --git a/feeds/packages/libs/mtdev/Makefile b/feeds/packages/libs/mtdev/Makefile
+new file mode 100644
+index 0000000..6f1e0b7
+--- /dev/null
++++ b/feeds/packages/libs/mtdev/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mtdev
++PKG_VERSION:=1.1.5
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://bitmath.org/code/mtdev/
++PKG_MD5SUM:=52c9610b6002f71d1642dc1a1cca5ec1
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mtdev
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Multitouch Protocol Translation Library
++ URL:=http://bitmath.org/code/mtdev/
++endef
++
++define Package/mtdev/description
++ The mtdev is a stand-alone library which transforms all variants of
++ kernel MT events to the slotted type B protocol. The events put into
++ mtdev may be from any MT device, specifically type A without contact
++ tracking, type A with contact tracking, or type B with contact
++ tracking. See the kernel documentation for further details.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/mtdev/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,mtdev))
+diff --git a/feeds/packages/libs/mxml/Makefile b/feeds/packages/libs/mxml/Makefile
+new file mode 100644
+index 0000000..9c5a4e2
+--- /dev/null
++++ b/feeds/packages/libs/mxml/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mxml
++PKG_VERSION:=2.9
++PKG_RELEASE:=1
++PKG_MD5SUM:=e21cad0f7aacd18f942aa0568a8dee19
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.msweet.org/files/project3/
++PKG_FIXUP:=autoreconf
++
++PKG_MAINTAINER:=Espen Jürgensen <espenjurgensen+openwrt@gmail.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mxml
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Mini-XML
++ URL:=http://www.minixml.org/
++endef
++
++define Package/mxml/description
++ A small xml library.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static
++
++define Build/InstallDev
++ mkdir -p $(1)/usr/include
++ $(CP) $(PKG_BUILD_DIR)/mxml.h $(1)/usr/include/
++ mkdir -p $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/libmxml.so* $(1)/usr/lib/
++ mkdir -p $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_BUILD_DIR)/mxml.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/mxml/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/libmxml.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,mxml))
+diff --git a/feeds/packages/libs/mxml/patches/001-targets.patch b/feeds/packages/libs/mxml/patches/001-targets.patch
+new file mode 100644
+index 0000000..86379f0
+--- /dev/null
++++ b/feeds/packages/libs/mxml/patches/001-targets.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -88,7 +88,7 @@ PUBLIBOBJS = mxml-attr.o mxml-entity.o m
++ mxml-index.o mxml-node.o mxml-search.o mxml-set.o
++ LIBOBJS = $(PUBLIBOBJS) mxml-private.o mxml-string.o
++ OBJS = mxmldoc.o testmxml.o $(LIBOBJS)
++-TARGETS = $(LIBMXML) mxmldoc testmxml mxml.xml doc/mxml.man
+++TARGETS = $(LIBMXML)
++
++
++ #
+diff --git a/feeds/packages/libs/nacl/Makefile b/feeds/packages/libs/nacl/Makefile
+new file mode 100644
+index 0000000..d91a223
+--- /dev/null
++++ b/feeds/packages/libs/nacl/Makefile
+@@ -0,0 +1,49 @@
++#
++# Copyright (C) 2011-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=nacl
++PKG_VERSION:=20110221
++PKG_RELEASE:=2
++
++PKG_MAINTAINER:=Matthias Schiffer <mschiffer@universe-factory.net>
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://hyperelliptic.org/nacl
++PKG_MD5SUM:=7efb5715561c3d10dafd3fa97b4f2d20
++
++PKG_LICENSE:=PublicDomain
++
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/nacl
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=NaCl Networking and Cryptography library
++ URL:=http://nacl.cace-project.eu/
++endef
++
++define Build/Compile
++ (cd $(PKG_BUILD_DIR) && \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
++ AR="$(TARGET_CROSS)ar" \
++ RANLIB="$(TARGET_CROSS)ranlib" \
++ $(CURDIR)/do-openwrt \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/nacl
++ $(CP) $(PKG_BUILD_DIR)/build/include/*.h $(1)/usr/include/nacl/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/build/lib/libnacl.a $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,nacl))
+diff --git a/feeds/packages/libs/nacl/do-openwrt b/feeds/packages/libs/nacl/do-openwrt
+new file mode 100755
+index 0000000..ba4fde3
+--- /dev/null
++++ b/feeds/packages/libs/nacl/do-openwrt
+@@ -0,0 +1,206 @@
++#!/bin/sh
++set -e
++
++# nacl/do
++# D. J. Bernstein
++# Public domain.
++
++version=`cat version`
++project=nacl
++
++top="`pwd`/build"
++bin="$top/bin"
++lib="$top/lib"
++include="$top/include"
++work="$top/work"
++
++
++# and work around bug in GNU sort
++LANG=C
++export LANG
++
++rm -rf "$top"
++mkdir -p "$top"
++mkdir -p "$bin"
++mkdir -p "$lib"
++mkdir -p "$include"
++
++exec >"$top/log"
++exec 2>&1
++exec 5>"$top/data"
++exec </dev/null
++
++echo "=== `date` === starting"
++
++echo "=== `date` === building inttypes"
++for target in int8 int16 int32 int64 uint8 uint16 uint32 uint64; do
++ (
++ echo "#ifndef crypto_${target}_h"
++ echo "#define crypto_${target}_h"
++ echo ""
++ echo "#include <stdint.h>"
++ echo ""
++ echo "typedef ${target}_t crypto_${target};"
++ echo ""
++ echo "#endif"
++ ) > "$include/crypto_$target.h"
++done
++
++echo "=== `date` === building randombytes"
++rm -rf "$work"
++mkdir -p "$work"
++cp -pr randombytes/* "$work"
++(
++ cd "$work"
++
++ cp devurandom.c randombytes-impl.c
++ cp devurandom.h randombytes-impl.h
++ $CC $CFLAGS -c randombytes-impl.c
++ mkdir -p lib
++ mv randombytes-impl.o lib/randombytes.o
++ mkdir -p include
++ mv randombytes-impl.h include/randombytes.h
++)
++cp -pr "$work"/lib/* "$lib"
++cp -pr "$work"/include/* "$include"
++
++rm -rf "$work"
++mkdir -p "$work"
++echo 'void crypto_'"$project"'_base(void) { ; }' > "$work/${project}_base.c"
++( cd "$work" && $CC $CFLAGS -c ${project}_base.c )
++$AR cr "$lib/lib${project}.a" "$work/${project}_base.o"
++( $RANLIB "$lib/lib${project}.a" || exit 0 )
++
++# loop over operations
++cat OPERATIONS \
++| while read o
++do
++ [ -d "$o" ] || continue
++
++ # for each operation, loop over primitives
++ ls "$o" \
++ | sort \
++ | while read p
++ do
++ [ -d "$o/$p" ] || continue
++ op="${o}_${p}"
++
++ startdate=`date +%Y%m%d`
++
++ echo "=== `date` === $o/$p"
++
++ rm -rf "$work"
++ mkdir -p "$work"
++
++ if [ -d "$o/$p/ref" ]; then
++ implementationdir="$o/$p/ref"
++ else
++ implementationdir="$o/$p/portable"
++ fi
++
++ opi=`echo "$implementationdir" | tr ./- ___`
++
++ echo "=== `date` === $implementationdir"
++
++ cfiles=`ls "$implementationdir" | grep '\.c$' || :`
++ sfiles=`ls "$implementationdir" | grep '\.[sS]$' || :`
++
++ cp -p "$o"/*.c "$work"
++
++ cp -pr "$implementationdir"/* "$work"
++
++ cp -p MACROS "$work/MACROS"
++ cp -p PROTOTYPES.c "$work/PROTOTYPES.c"
++
++ (
++ cd "$work"
++ (
++ echo "#ifndef ${o}_H"
++ echo "#define ${o}_H"
++ echo ""
++ echo "#include \"${op}.h\""
++ echo ""
++ egrep "${o}"'$|'"${o}"'\(|'"${o}"'_' < MACROS \
++ | sed "s/$o/$op/" | while read mop
++ do
++ echo "#define ${mop} ${mop}" | sed "s/$op/$o/"
++ done
++ echo "#define ${o}_PRIMITIVE \"${p}\""
++ echo "#define ${o}_IMPLEMENTATION ${op}_IMPLEMENTATION"
++ echo "#define ${o}_VERSION ${op}_VERSION"
++ echo ""
++ echo "#endif"
++ ) > "$o.h"
++ (
++ echo "#ifndef ${op}_H"
++ echo "#define ${op}_H"
++ echo ""
++ sed 's/[ ]CRYPTO_/ '"${opi}"'_/g' < api.h
++ echo '#ifdef __cplusplus'
++ #echo '#include <string>'
++ #egrep "${o}"'$|'"${o}"'\(|'"${o}"'_' < PROTOTYPES.cpp \
++ # | sed "s/$o/$opi/"
++ echo 'extern "C" {'
++ echo '#endif'
++ egrep "${o}"'$|'"${o}"'\(|'"${o}"'_' < PROTOTYPES.c \
++ | sed "s/$o/$opi/"
++ echo '#ifdef __cplusplus'
++ echo '}'
++ echo '#endif'
++ echo ""
++ egrep "${o}"'$|'"${o}"'\(|'"${o}"'_' < MACROS \
++ | sed "s/$o/$opi/" | while read mopi
++ do
++ echo "#define ${mopi} ${mopi}" | sed "s/$opi/$op/"
++ done
++ echo "#define ${op}_IMPLEMENTATION \"${implementationdir}\""
++ echo "#ifndef ${opi}_VERSION"
++ echo "#define ${opi}_VERSION \"-\""
++ echo "#endif"
++ echo "#define ${op}_VERSION ${opi}_VERSION"
++ echo ""
++ echo "#endif"
++ ) > "$op.h"
++
++ echo "=== `date` === $implementationdir $CC $CFLAGS"
++ for f in $cfiles $sfiles
++ do
++ ok=1
++ $CC $CFLAGS \
++ -I. -I"$include" \
++ -c "$f" >errors 2>&1 || ok=0
++ ( if [ `wc -l < errors` -lt 25 ]
++ then
++ cat errors
++ else
++ head errors
++ echo ...
++ tail errors
++ fi
++ ) \
++ | while read err
++ do
++ echo "$version $startdate $o $p fromcompiler $implementationdir $f $err" >&5
++ done
++
++ [ "$ok" = 1 ]
++ done
++
++ for f in *.o
++ do
++ mv "$f" "${opi}-$f"
++ done
++ )
++
++ echo "=== `date` === $implementationdir $CC $CFLAGS finishing"
++
++ $AR cr "$lib/lib${project}.a" "$work"/*.o \
++ && ( $RANLIB "$lib/lib${project}.a" || exit 0 ) \
++ && cp -p "$work/$op.h" "$include/$op.h" \
++ && [ -f "$o/$p/selected" ] \
++ && cp -p "$work/$o.h" "$include/$o.h" \
++ || :
++ done
++done
++
++echo "=== `date` === finishing"
+diff --git a/feeds/packages/libs/neon/Makefile b/feeds/packages/libs/neon/Makefile
+new file mode 100644
+index 0000000..4d3bf8c
+--- /dev/null
++++ b/feeds/packages/libs/neon/Makefile
+@@ -0,0 +1,78 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=neon
++PKG_VERSION:=0.30.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.webdav.org/neon
++PKG_MD5SUM:=fb60b3a124eeec441937a812c456fd94
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libneon
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=HTTP and WebDAV client library
++ URL:=http://www.webdav.org/neon/
++ DEPENDS:=+libopenssl +libexpat
++ MAINTAINER:=Federico Di Marco <fededim@gmail.com>
++endef
++
++define Package/libneon/description
++ neon is an HTTP and WebDAV client library, with a C interface. Features:
++
++ - High-level wrappers for common HTTP and WebDAV operations (GET, MOVE, DELETE, etc)
++ - Low-level interface to the HTTP request/response engine, allowing the use of arbitrary HTTP methods, headers, etc.
++ - Authentication support including Basic and Digest support, along with GSSAPI-based Negotiate on Unix, and
++ SSPI-based Negotiate/NTLM on Win32
++ - SSL/TLS support using OpenSSL or GnuTLS; exposing an abstraction layer for verifying server certificates, handling client
++ certificates, and examining certificate properties. Smartcard-based client certificates are also supported via a
++ PKCS11 wrapper interface.
++ - Abstract interface to parsing XML using libxml2 or expat, and wrappers for simplifying handling XML HTTP response bodies
++ - WebDAV metadata support; wrappers for PROPFIND and PROPPATCH to simplify property manipulation.
++endef
++
++
++TARGET_CFLAGS += $(FPIC)
++TARGET_CPPFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --with-expat \
++ --with-ssl="openssl" \
++ --without-egd \
++ --without-libproxy
++
++CONFIGURE_VARS += \
++ LDFLAGS="$$$$LDFLAGS -lcrypto -lssl"
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/neon-config $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/neon $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libneon.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/neon.pc $(1)/usr/lib/pkgconfig/
++ $(SED) 's,-I$$$${includedir}/,-I$(STAGING_DIR)/usr/include/,g' $(1)/usr/bin/neon-config
++ $(SED) 's,-L$$$${libdir},,g' $(1)/usr/bin/neon-config
++endef
++
++define Package/libneon/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libneon.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libneon))
+diff --git a/feeds/packages/libs/opencv/Makefile b/feeds/packages/libs/opencv/Makefile
+new file mode 100644
+index 0000000..c77f14e
+--- /dev/null
++++ b/feeds/packages/libs/opencv/Makefile
+@@ -0,0 +1,71 @@
++#
++# Copyright (C) 2013-2014 wrtnode.com
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=opencv
++PKG_VERSION:=3.0.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).zip
++PKG_SOURCE_URL:=http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/$(PKG_VERSION)/
++PKG_MD5SUM:=09004c275d8092cbdf5b61675cecd399
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENSE
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/opencv/Default/description
++ OpenCV (Open Source Computer Vision Library) is an open source computer
++ vision and machine learning software library. OpenCV was built to provide
++ a common infrastructure for computer vision applications and to accelerate
++ the use of machine perception in the commercial products. Being a
++ BSD-licensed product, OpenCV makes it easy for businesses to utilize
++ and modify the code.
++endef
++
++define Package/opencv
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=OpenCV
++ URL:=http://opencv.org/
++ MAINTAINER:=WRTnode Team <pub@wrtnode.com>
++ DEPENDS:=+libpthread +librt +libstdcpp +zlib +libjpeg
++endef
++
++PKG_INSTALL:=1
++
++CMAKE_OPTIONS += -DBUILD_opencv_gpu:BOOL=OFF \
++ -DWITH_1394:BOOL=OFF -DBUILD_opencv_stitching:BOOL=OFF \
++ -DBUILD_opencv_superres:BOOL=OFF -DBUILD_opencv_ts:BOOL=OFF \
++ -DBUILD_opencv_highgui:BOOL=OFF \
++ -DBUILD_opencv_videostab:BOOL=OFF \
++ -DWITH_FFMPEG:BOOL=OFF \
++ -DWITH_GSTREAMER:BOOL=OFF \
++ -DWITH_LIBV4L:BOOL=OFF \
++ -DWITH_PNG:BOOL=OFF \
++ -DWITH_TIFF:BOOL=OFF \
++ -DCMAKE_VERBOSE:BOOL=OFF \
++ -DENABLE_PRECOMPILED_HEADERS=OFF
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/opencv $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/opencv2 $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libopencv* $(1)/usr/lib/
++endef
++
++define Package/opencv/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libopencv* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,opencv))
+diff --git a/feeds/packages/libs/opencv/README.md b/feeds/packages/libs/opencv/README.md
+new file mode 100644
+index 0000000..a5cdcdd
+--- /dev/null
++++ b/feeds/packages/libs/opencv/README.md
+@@ -0,0 +1,23 @@
++Introduction
++===
++
++#### OpenCV: Open Source Computer Vision Library.OpenCV is based on (open source) issued cross-platform computer vision library, you can run on Linux, Windows and Mac OS operating systems.
++
++#### Resources
++
++* Homepage: <http://opencv.org>
++* Docs: <http://docs.opencv.org>
++* Q&A forum: <http://answers.opencv.org>
++* Issue tracking: <http://code.opencv.org>
++
++#### Contributing
++
++Please read before starting work on a pull request: <http://code.opencv.org/projects/opencv/wiki/How_to_contribute>
++
++Summary of guidelines:
++
++* One pull request per issue;
++* Choose the right base branch;
++* Include tests and documentation;
++* Clean up "oops" commits before submitting;
++* Follow the coding style guide.
+diff --git a/feeds/packages/libs/openldap/Makefile b/feeds/packages/libs/openldap/Makefile
+new file mode 100644
+index 0000000..a2423d2
+--- /dev/null
++++ b/feeds/packages/libs/openldap/Makefile
+@@ -0,0 +1,148 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=openldap
++PKG_VERSION:=2.4.41
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/ \
++ ftp://sunsite.cnlab-switch.ch/mirror/OpenLDAP/openldap-release/ \
++ ftp://ftp.nl.uu.net/pub/unix/db/openldap/openldap-release/ \
++ ftp://ftp.plig.org/pub/OpenLDAP/openldap-release/
++PKG_MD5SUM:=3f1a4cea52827e18feaedfdc1634b5d0
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/openldap/Default
++ TITLE:=LDAP implementation
++ URL:=http://www.openldap.org/
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++endef
++
++define Package/openldap/Default/description
++ OpenLDAP Software is an open source implementation of the
++ Lightweight Directory Access Protocol (LDAP).
++endef
++
++define Package/libopenldap
++ $(call Package/openldap/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libopenssl +libsasl2 +libpthread
++ TITLE+= (libraries)
++endef
++
++define Package/libopenldap/description
++ $(call Package/openldap/Default/description)
++ This package contains the shared LDAP client libraries, needed by other programs.
++endef
++
++define Package/libopenldap/conffiles
++/etc/openldap/ldap.conf
++endef
++
++define Package/openldap-utils
++ $(call Package/openldap/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libopenldap
++ TITLE+= (utilities)
++endef
++
++define Package/openldap-utils/description
++ $(call Package/openldap/Default/description)
++ This package contains client programs required to access LDAP servers.
++endef
++
++define Package/openldap-server
++ $(call Package/openldap/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libopenldap +libuuid
++ TITLE+= (server)
++endef
++
++define Package/openldap-server/description
++ $(call Package/openldap/Default/description)
++ This package contains server programs required to provide LDAP services.
++endef
++
++define Package/openldap-server/conffiles
++/etc/openldap/slapd.conf
++endef
++
++TARGET_CFLAGS += $(FPIC) -lpthread
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-debug \
++ --enable-dynamic \
++ --enable-syslog \
++ --disable-local \
++ --disable-slurpd \
++ --with-cyrus-sasl \
++ --without-fetch \
++ --with-threads \
++ --with-tls \
++ --with-yielding_select="yes" \
++ --without-threads \
++ --enable-null \
++ --disable-bdb \
++ --disable-hdb \
++ --disable-monitor \
++ --disable-relay
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ HOSTCC="$(HOSTCC)" \
++ depend all install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/{lber,ldap}*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib{lber,ldap}*.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/libopenldap/install
++ $(INSTALL_DIR) $(1)/etc/openldap
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/openldap/ldap.conf $(1)/etc/openldap/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib{lber,ldap}*.so.* $(1)/usr/lib/
++endef
++
++define Package/openldap-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/ldap* $(1)/usr/bin/
++endef
++
++define Package/openldap-server/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/ldap.init $(1)/etc/init.d/ldap
++ $(INSTALL_DIR) $(1)/etc/openldap/schema
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/openldap/schema/* $(1)/etc/openldap/schema/
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/openldap/slapd.conf $(1)/etc/openldap/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ # XXX: OpenLDAP installs slapd into libexecdir, not sbindir:
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/slapd $(1)/usr/sbin/
++ # XXX: switch default backend to ldif, since bdb is disabled
++ $(SED) 's|^\(database\)\([ \t]\+\)bdb|\1\2ldif|g' \
++ -e 's|^\(index\)|#\1|g' \
++ $(1)/etc/openldap/slapd.conf
++endef
++
++$(eval $(call BuildPackage,libopenldap))
++$(eval $(call BuildPackage,openldap-utils))
++$(eval $(call BuildPackage,openldap-server))
+diff --git a/feeds/packages/libs/openldap/files/ldap.init b/feeds/packages/libs/openldap/files/ldap.init
+new file mode 100644
+index 0000000..2209e76
+--- /dev/null
++++ b/feeds/packages/libs/openldap/files/ldap.init
+@@ -0,0 +1,19 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2011 OpenWrt.org
++
++START=60
++
++SERVICE_USE_PID=1
++
++start() {
++ mkdir -m 0755 -p /var/openldap-data
++ service_start /usr/sbin/slapd -h "ldap://localhost/ ldaps:///"
++}
++
++stop() {
++ service_stop /usr/sbin/slapd
++}
++
++reload() {
++ service_reload /usr/sbin/slapd
++}
+diff --git a/feeds/packages/libs/openldap/patches/001-automake-compat.patch b/feeds/packages/libs/openldap/patches/001-automake-compat.patch
+new file mode 100644
+index 0000000..71cdebe
+--- /dev/null
++++ b/feeds/packages/libs/openldap/patches/001-automake-compat.patch
+@@ -0,0 +1,323 @@
++--- /dev/null
+++++ b/Makefile.am
++@@ -0,0 +1 @@
+++SUBDIRS = include libraries clients servers tests doc
++--- a/libraries/Makefile.in
+++++ b/libraries/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SUBDIRS= \
++ liblutil \
++ liblber \
++--- a/libraries/liblber/Makefile.in
+++++ b/libraries/liblber/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ LIBRARY = liblber.la
++
++ NT_SRCS = nt_err.c
++--- a/libraries/libldap/Makefile.in
+++++ b/libraries/libldap/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ LIBRARY = libldap.la
++
++ PROGRAMS = apitest dntest ftest ltest urltest
++--- a/libraries/libldap_r/Makefile.in
+++++ b/libraries/libldap_r/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ LIBRARY = libldap_r.la
++
++ PROGRAMS = apitest ltest
++--- a/libraries/liblunicode/Makefile.in
+++++ b/libraries/liblunicode/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ LIBRARY = liblunicode.a
++
++ XXDIR = $(srcdir)/ucdata/
++--- a/libraries/liblutil/Makefile.in
+++++ b/libraries/liblutil/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ LIBRARY = liblutil.a
++ PROGRAM = testavl
++
++--- a/libraries/librewrite/Makefile.in
+++++ b/libraries/librewrite/Makefile.in
++@@ -16,6 +16,8 @@
++ ## Copyright 2000-2001 Pierangelo Masarati <ando@sys-net.it>
++ ##
++
+++SHELL = @SHELL@
+++
++ SRCS = config.c context.c info.c ldapmap.c map.c params.c rule.c \
++ session.c subst.c var.c xmap.c \
++ parse.c rewrite.c
++--- a/clients/tools/Makefile.in
+++++ b/clients/tools/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = ldapsearch.c ldapmodify.c ldapdelete.c ldapmodrdn.c \
++ ldappasswd.c ldapwhoami.c ldapcompare.c \
++ ldapexop.c ldapurl.c common.c
++--- a/servers/slapd/Makefile.in
+++++ b/servers/slapd/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SLAPTOOLS=slapadd slapcat slapdn slapindex slappasswd slaptest slapauth slapacl slapschema
++ PROGRAMS=slapd $(SLAPTOOLS)
++ XPROGRAMS=sslapd libbackends.a .backend liboverlays.a
++--- a/servers/slapd/overlays/Makefile.in
+++++ b/servers/slapd/overlays/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = overlays.c \
++ accesslog.c \
++ auditlog.c \
++--- a/tests/progs/Makefile.in
+++++ b/tests/progs/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ PROGRAMS = slapd-tester slapd-search slapd-read slapd-addel slapd-modrdn \
++ slapd-modify slapd-bind slapd-mtread ldif-filter
++
++--- a/servers/slapd/back-bdb/Makefile.in
+++++ b/servers/slapd/back-bdb/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = init.c tools.c config.c \
++ add.c bind.c compare.c delete.c modify.c modrdn.c search.c \
++ extended.c referral.c operational.c \
++--- a/servers/slapd/back-dnssrv/Makefile.in
+++++ b/servers/slapd/back-dnssrv/Makefile.in
++@@ -18,6 +18,8 @@
++ # The DNSSRV backend was written by Kurt D. Zeilenga.
++ #
++
+++SHELL = @SHELL@
+++
++ SRCS = init.c bind.c search.c config.c referral.c
++ OBJS = init.lo bind.lo search.lo config.lo referral.lo
++
++--- a/servers/slapd/back-hdb/Makefile.in
+++++ b/servers/slapd/back-hdb/Makefile.in
++@@ -15,6 +15,8 @@
++ #
++ ## Copyright 2003 Howard Chu @ Symas Corp. See master COPYRIGHT file for terms.
++
+++SHELL = @SHELL@
+++
++ XXDIR = $(srcdir)/../back-bdb
++
++ XXSRCS = init.c tools.c config.c \
++--- a/servers/slapd/back-ldap/Makefile.in
+++++ b/servers/slapd/back-ldap/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = init.c config.c search.c bind.c unbind.c add.c compare.c \
++ delete.c modify.c modrdn.c extended.c chain.c \
++ distproc.c monitor.c pbind.c
++--- a/servers/slapd/back-ldif/Makefile.in
+++++ b/servers/slapd/back-ldif/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = ldif.c
++ OBJS = ldif.lo
++
++--- a/servers/slapd/back-mdb/Makefile.in
+++++ b/servers/slapd/back-mdb/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = init.c tools.c config.c \
++ add.c bind.c compare.c delete.c modify.c modrdn.c search.c \
++ extended.c operational.c \
++--- a/servers/slapd/back-meta/Makefile.in
+++++ b/servers/slapd/back-meta/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = init.c config.c search.c bind.c unbind.c add.c compare.c \
++ delete.c modify.c modrdn.c suffixmassage.c map.c \
++ conn.c candidates.c dncache.c
++--- a/servers/slapd/back-monitor/Makefile.in
+++++ b/servers/slapd/back-monitor/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = init.c search.c compare.c modify.c bind.c \
++ operational.c \
++ cache.c entry.c \
++--- a/servers/slapd/back-ndb/Makefile.in
+++++ b/servers/slapd/back-ndb/Makefile.in
++@@ -17,6 +17,8 @@
++ ## This work was initially developed by Howard Chu for inclusion
++ ## in OpenLDAP Software. This work was sponsored by MySQL.
++
+++SHELL = @SHELL@
+++
++ SRCS = init.cpp tools.cpp config.cpp ndbio.cpp \
++ add.cpp bind.cpp compare.cpp delete.cpp modify.cpp modrdn.cpp search.cpp
++
++--- a/servers/slapd/back-null/Makefile.in
+++++ b/servers/slapd/back-null/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = null.c
++ OBJS = null.lo
++
++--- a/servers/slapd/back-passwd/Makefile.in
+++++ b/servers/slapd/back-passwd/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = search.c config.c init.c
++ OBJS = search.lo config.lo init.lo
++
++--- a/servers/slapd/back-perl/Makefile.in
+++++ b/servers/slapd/back-perl/Makefile.in
++@@ -14,6 +14,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = init.c search.c close.c config.c bind.c compare.c \
++ modify.c add.c modrdn.c delete.c
++ OBJS = init.lo search.lo close.lo config.lo bind.lo compare.lo \
++--- a/servers/slapd/back-relay/Makefile.in
+++++ b/servers/slapd/back-relay/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = init.c op.c
++ OBJS = init.lo op.lo
++
++--- a/servers/slapd/back-shell/Makefile.in
+++++ b/servers/slapd/back-shell/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = init.c config.c fork.c search.c bind.c unbind.c add.c \
++ delete.c modify.c modrdn.c compare.c result.c
++ OBJS = init.lo config.lo fork.lo search.lo bind.lo unbind.lo add.lo \
++--- a/servers/slapd/back-sock/Makefile.in
+++++ b/servers/slapd/back-sock/Makefile.in
++@@ -17,6 +17,8 @@
++ ## This work was initially developed by Brian Candler for inclusion
++ ## in OpenLDAP Software.
++
+++SHELL = @SHELL@
+++
++ SRCS = init.c config.c opensock.c search.c bind.c unbind.c add.c \
++ delete.c modify.c modrdn.c compare.c result.c
++ OBJS = init.lo config.lo opensock.lo search.lo bind.lo unbind.lo add.lo \
++--- a/servers/slapd/back-sql/Makefile.in
+++++ b/servers/slapd/back-sql/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ SRCS = init.c config.c search.c bind.c compare.c operational.c \
++ entry-id.c schema-map.c sql-wrap.c modify.c util.c \
++ add.c delete.c modrdn.c api.c
++--- a/servers/slapd/shell-backends/Makefile.in
+++++ b/servers/slapd/shell-backends/Makefile.in
++@@ -13,6 +13,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ PROGRAMS = passwd-shell
++
++ SRCS = passwd-shell.c shellutil.c
++--- a/servers/slapd/slapi/Makefile.in
+++++ b/servers/slapd/slapi/Makefile.in
++@@ -14,6 +14,8 @@
++ ## top-level directory of the distribution or, alternatively, at
++ ## <http://www.OpenLDAP.org/license.html>.
++
+++SHELL = @SHELL@
+++
++ LIBRARY = libslapi.la
++
++ #all-common: $(LIBRARY) $(PROGRAMS)
+diff --git a/feeds/packages/libs/openldap/patches/020-autofs-schema.patch b/feeds/packages/libs/openldap/patches/020-autofs-schema.patch
+new file mode 100644
+index 0000000..11c73f5
+--- /dev/null
++++ b/feeds/packages/libs/openldap/patches/020-autofs-schema.patch
+@@ -0,0 +1,26 @@
++--- /dev/null
+++++ b/servers/slapd/schema/autofs.schema
++@@ -0,0 +1,23 @@
+++attributetype ( 1.3.6.1.1.1.1.31 NAME 'automountMapName'
+++ DESC 'Automount map name'
+++ EQUALITY caseExactMatch
+++ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
+++
+++attributetype ( 1.3.6.1.1.1.1.32 NAME 'automountKey'
+++ DESC 'Automount key value'
+++ EQUALITY caseExactMatch
+++ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
+++
+++attributetype ( 1.3.6.1.1.1.1.33 NAME 'automountInformation'
+++ DESC 'Automount information'
+++ EQUALITY caseExactMatch
+++ SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
+++
+++objectclass ( 1.3.6.1.1.1.2.16 NAME 'automountMap' SUP top STRUCTURAL
+++ MUST ( automountMapName )
+++ MAY ( description ) )
+++
+++objectclass ( 1.3.6.1.1.1.2.17 NAME 'automount' SUP top STRUCTURAL
+++ DESC 'Automount'
+++ MUST ( automountKey $ automountInformation )
+++ MAY description )
+diff --git a/feeds/packages/libs/openldap/patches/750-no-strip.patch b/feeds/packages/libs/openldap/patches/750-no-strip.patch
+new file mode 100644
+index 0000000..a70aacc
+--- /dev/null
++++ b/feeds/packages/libs/openldap/patches/750-no-strip.patch
+@@ -0,0 +1,22 @@
++--- a/clients/tools/Makefile.in
+++++ b/clients/tools/Makefile.in
++@@ -122,7 +122,7 @@ install-local: FORCE
++ -$(MKDIR) $(DESTDIR)$(bindir)
++ @( \
++ for prg in $(PROGRAMS); do \
++- $(LTINSTALL) $(INSTALLFLAGS) $(STRIP) -m 755 $$prg$(EXEEXT) \
+++ $(LTINSTALL) $(INSTALLFLAGS) -m 755 $$prg$(EXEEXT) \
++ $(DESTDIR)$(bindir); \
++ done \
++ )
++--- a/servers/slapd/Makefile.in
+++++ b/servers/slapd/Makefile.in
++@@ -380,7 +380,7 @@ install-local-srv: install-slapd install
++ install-slapd: FORCE
++ -$(MKDIR) $(DESTDIR)$(libexecdir)
++ -$(MKDIR) $(DESTDIR)$(localstatedir)/run
++- $(LTINSTALL) $(INSTALLFLAGS) $(STRIP) -m 755 \
+++ $(LTINSTALL) $(INSTALLFLAGS) -m 755 \
++ slapd$(EXEEXT) $(DESTDIR)$(libexecdir)
++ @for i in $(SUBDIRS); do \
++ if test -d $$i && test -f $$i/Makefile ; then \
+diff --git a/feeds/packages/libs/opus/Makefile b/feeds/packages/libs/opus/Makefile
+new file mode 100644
+index 0000000..ed64c3e
+--- /dev/null
++++ b/feeds/packages/libs/opus/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=opus
++PKG_VERSION:=1.1
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.xiph.org/releases/opus/
++PKG_MD5SUM:=c5a8cf7c0b066759542bc4ca46817ac6
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libopus
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=OPUS Codec
++ URL:=http://opus-codec.org/
++endef
++
++define Package/libopus/description
++ Opus is a totally open, royalty-free, highly versatile audio codec. Opus is
++ unmatched for interactive speech and music transmission over the Internet, but
++ is also intended for storage and streaming applications.
++endef
++
++CONFIGURE_ARGS+= \
++ --disable-doc \
++ --disable-extra-programs
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/opus $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libopus.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/opus.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libopus/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libopus.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libopus))
+diff --git a/feeds/packages/libs/p11-kit/Makefile b/feeds/packages/libs/p11-kit/Makefile
+new file mode 100644
+index 0000000..853287a
+--- /dev/null
++++ b/feeds/packages/libs/p11-kit/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2011-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=p11-kit
++PKG_VERSION:=0.20.7
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=6648cad01a3080b685b8b3bf7372c91a
++PKG_SOURCE_URL:=http://p11-glue.freedesktop.org/releases/
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/p11-kit
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A library that provides a way to load and enumerate PKCS11 modules.
++ URL:=http://p11-glue.freedesktop.org/p11-kit.html
++ DEPENDS:=+libtasn1 +libpthread
++endef
++
++define Package/p11-kit/description
++ Provides a way to load and enumerate PKCS11 modules. Provides a
++ standard configuration setup for installing PKCS11 modules in such a
++ way that they are discoverable.
++endef
++
++CONFIGURE_ARGS+= \
++ --without-libffi
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/p11-kit-1/p11-kit/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/p11-kit-1/p11-kit/* $(1)/usr/include/p11-kit-1/p11-kit/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libp11-kit.so $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libp11-kit.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/p11-kit-1.pc $(1)/usr/lib/pkgconfig/p11-kit-1.pc
++endef
++
++define Package/p11-kit/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libp11-kit.so.* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/etc/p11-kit/modules/
++ifneq ($(CONFIG_PACKAGE_libopensc),)
++ $(CP) ./files/opensc.module $(1)/etc/p11-kit/modules/
++endif
++endef
++
++$(eval $(call BuildPackage,p11-kit))
+diff --git a/feeds/packages/libs/p11-kit/files/opensc.module b/feeds/packages/libs/p11-kit/files/opensc.module
+new file mode 100644
+index 0000000..5f59814
+--- /dev/null
++++ b/feeds/packages/libs/p11-kit/files/opensc.module
+@@ -0,0 +1 @@
++module: /usr/lib/opensc-pkcs11.so
+diff --git a/feeds/packages/libs/pcre/Makefile b/feeds/packages/libs/pcre/Makefile
+new file mode 100644
+index 0000000..6a9c414
+--- /dev/null
++++ b/feeds/packages/libs/pcre/Makefile
+@@ -0,0 +1,101 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pcre
++PKG_VERSION:=8.37
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/pcre
++PKG_MD5SUM:=ed91be292cb01d21bc7e526816c26981
++PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENCE
++
++PKG_FIXUP:=autoreconf
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libpcre/default
++ SECTION:=libs
++ CATEGORY:=Libraries
++ URL:=http://www.pcre.org/
++endef
++
++define Package/libpcre
++ $(call Package/libpcre/default)
++ TITLE:=A Perl Compatible Regular Expression library
++endef
++
++define Package/libpcre16
++ $(call Package/libpcre/default)
++ TITLE:=A Perl Compatible Regular Expression library (16bit support)
++endef
++
++define Package/libpcrecpp
++ $(call Package/libpcre/default)
++ TITLE:=C++ wrapper for Perl Compatible Regular Expression library
++ DEPENDS:=+libpcre +libstdcpp
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-utf8 \
++ --enable-unicode-properties \
++ --enable-pcre16 \
++
++ifneq ($(CONFIG_PACKAGE_libpcrecpp),)
++ CONFIGURE_ARGS+= --enable-cpp
++else
++ CONFIGURE_ARGS+= --disable-cpp
++endif
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS)"
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/pcre-config $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(2)/bin
++ $(LN) $(STAGING_DIR)/usr/bin/pcre-config $(2)/bin
++
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/pcre*.h $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre*.{a,so*} $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libpcre*.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libpcre/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre{,posix}.so.* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre.so $(1)/usr/lib/
++endef
++
++define Package/libpcre16/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcre16.so* $(1)/usr/lib/
++endef
++
++define Package/libpcrecpp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcrecpp.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libpcre))
++$(eval $(call BuildPackage,libpcre16))
++$(eval $(call BuildPackage,libpcrecpp))
+diff --git a/feeds/packages/libs/pcre/patches/100-pcre-cve-2015-3210.patch b/feeds/packages/libs/pcre/patches/100-pcre-cve-2015-3210.patch
+new file mode 100644
+index 0000000..276d09e
+--- /dev/null
++++ b/feeds/packages/libs/pcre/patches/100-pcre-cve-2015-3210.patch
+@@ -0,0 +1,32 @@
++Index: pcre-8.37/pcre_compile.c
++===================================================================
++--- a/pcre_compile.c
+++++ b/pcre_compile.c
++@@ -7177,14 +7177,26 @@
++ number. If the name is not found, set the value to 0 for a forward
++ reference. */
++
+++ recno = 0;
++ ng = cd->named_groups;
++ for (i = 0; i < cd->names_found; i++, ng++)
++ {
++ if (namelen == ng->length &&
++ STRNCMP_UC_UC(name, ng->name, namelen) == 0)
++- break;
+++ {
+++ open_capitem *oc;
+++ recno = ng->number;
+++ if (is_recurse) break;
+++ for (oc = cd->open_caps; oc != NULL; oc = oc->next)
+++ {
+++ if (oc->number == recno)
+++ {
+++ oc->flag = TRUE;
+++ break;
+++ }
+++ }
+++ }
++ }
++- recno = (i < cd->names_found)? ng->number : 0;
++
++ /* Count named back references. */
+diff --git a/feeds/packages/libs/postgresql/Makefile b/feeds/packages/libs/postgresql/Makefile
+new file mode 100644
+index 0000000..5ab9a58
+--- /dev/null
++++ b/feeds/packages/libs/postgresql/Makefile
+@@ -0,0 +1,243 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=postgresql
++PKG_VERSION:=9.4.4
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++PKG_LICENSE:=PostgreSQL
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=\
++ http://ftp9.us.postgresql.org/pub/mirrors/postgresql/source/v$(PKG_VERSION) \
++ http://ftp.be.postgresql.org/postgresql/source/v$(PKG_VERSION) \
++ ftp://ftp-archives.postgresql.org/pub/source/v$(PKG_VERSION)
++PKG_MD5SUM:=1fe952c44ed26d7e6a335cf991a9c1c6
++PKG_BUILD_PARALLEL:=1
++PKG_USE_MIPS16:=0
++PKG_FIXUP:=autoreconf
++PKG_MACRO_PATHS:=config
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libpq
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+zlib +libreadline +libpthread +libncurses +shadow-utils +shadow-su
++ TITLE:=PostgreSQL client library
++ URL:=http://www.postgresql.org/
++ SUBMENU:=database
++endef
++
++define Package/libpq/description
++PostgreSQL client library.
++endef
++
++define Package/pgsql-cli
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libpq @USE_UCLIBC:+librt
++ TITLE:=Command Line Interface (CLI) to PostgreSQL databases
++ URL:=http://www.postgresql.org/
++ SUBMENU:=database
++endef
++
++define Package/pgsql-cli/description
++Command Line Interface (CLI) to PostgreSQL databases.
++endef
++
++define Package/pgsql-server
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libpq @USE_UCLIBC:+librt
++ TITLE:=PostgreSQL databases Server
++ URL:=http://www.postgresql.org/
++ SUBMENU:=database
++ USERID:=postgres=5432:postgres=5432
++endef
++
++define Package/pgsql-server/description
++PostgreSQL databases Server.
++endef
++
++PGSQL_CONFIG_VARS:= \
++ pgac_cv_snprintf_long_long_int_format="%lld" \
++ pgac_cv_snprintf_size_t_support=yes
++
++ifeq ($(CONFIG_USE_UCLIBC),y)
++# PostgreSQL does not build against uClibc with locales
++# enabled, due to an uClibc bug, see
++# http://lists.uclibc.org/pipermail/uclibc/2014-April/048326.html
++# so overwrite automatic detection and disable locale support
++PGSQL_CONFIG_VARS+= \
++ pgac_cv_type_locale_t=no
++endif
++
++TARGET_CONFIGURE_OPTS+=$(PGSQL_CONFIG_VARS)
++
++# Need a native ecpg ,pg_config, and zic for build
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); rm -f config.cache; \
++ $(PGSQL_CONFIG_VARS) \
++ ./configure \
++ --prefix=/usr \
++ --exec-prefix=/usr \
++ --bindir=/usr/bin \
++ --datadir=/usr/share \
++ --includedir=/usr/include \
++ --infodir=/usr/share/info \
++ --libdir=/usr/lib \
++ --libexecdir=/usr/lib \
++ --localstatedir=/var \
++ --mandir=/usr/share/man \
++ --sbindir=/usr/sbin \
++ --sysconfdir=/etc \
++ $(DISABLE_NLS) \
++ --enable-shared \
++ --enable-static \
++ --disable-integer-datetimes \
++ --disable-rpath \
++ --without-bonjour \
++ --without-gssapi \
++ --without-ldap \
++ --without-openssl \
++ --without-pam \
++ --without-perl \
++ --without-python \
++ --without-readline \
++ --without-tcl \
++ --with-zlib="yes" \
++ --enable-depend \
++ --with-system-timezone=/tmp \
++ );
++ $(MAKE) -C $(PKG_BUILD_DIR)/src/interfaces/ecpg/preproc CC="$(HOSTCC)" CFLAGS+="-I../../libpq"
++ mv $(PKG_BUILD_DIR)/src/interfaces/ecpg/preproc/ecpg \
++ $(PKG_BUILD_DIR)/src/interfaces/ecpg/preproc/ecpg.host
++ $(MAKE) -C $(PKG_BUILD_DIR)/src/timezone CC="$(HOSTCC)"
++ mv $(PKG_BUILD_DIR)/src/timezone/zic $(PKG_BUILD_DIR)/host-zic
++ $(INSTALL_DIR) $(STAGING_DIR)/host/bin/
++ $(CP) $(PKG_BUILD_DIR)/host-zic $(STAGING_DIR)/host/bin/zic
++ $(MAKE) -C $(PKG_BUILD_DIR)/src/bin/pg_config CC="$(HOSTCC)"
++ mv $(PKG_BUILD_DIR)/src/bin/pg_config/pg_config \
++ $(PKG_BUILD_DIR)/src/bin/pg_config/pg_config.host
++ $(MAKE) -C $(PKG_BUILD_DIR) distclean
++
++ (cd $(PKG_BUILD_DIR); rm -f config.cache; \
++ $(TARGET_CONFIGURE_OPTS) \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ CPPFLAGS="$$$$CPPFLAGS $(TARGET_CPPFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ ./configure \
++ --target=$(GNU_TARGET_NAME) \
++ --host=$(GNU_TARGET_NAME) \
++ --build=$(GNU_HOST_NAME) \
++ --program-prefix="" \
++ --program-suffix="" \
++ --prefix=/usr \
++ --exec-prefix=/usr \
++ --bindir=/usr/bin \
++ --datadir=/usr/share \
++ --includedir=/usr/include \
++ --infodir=/usr/share/info \
++ --libdir=/usr/lib \
++ --libexecdir=/usr/lib \
++ --localstatedir=/var \
++ --mandir=/usr/share/man \
++ --sbindir=/usr/sbin \
++ --sysconfdir=/etc \
++ $(DISABLE_NLS) \
++ $(DISABLE_LARGEFILE) \
++ --enable-shared \
++ --enable-static \
++ --disable-integer-datetimes \
++ --disable-rpath \
++ --without-bonjour \
++ --without-gssapi \
++ --without-ldap \
++ --without-openssl \
++ --without-pam \
++ --without-perl \
++ --without-python \
++ --without-tcl \
++ --with-zlib="yes" \
++ --enable-depend \
++ $(if $(CONFIG_TARGET_avr32),--disable-spinlocks) \
++ );
++ $(SED) 's@ECPG = ../../preproc/ecpg@ECPG = ../../preproc/ecpg.host@' $(PKG_BUILD_DIR)/src/interfaces/ecpg/test/Makefile.regress
++endef
++
++TARGET_CFLAGS += $(FPIC) -lpthread
++
++# because PROFILE means something else in the project Makefile
++unexport PROFILE
++
++define Build/Compile
++ +$(MAKE) $(PKG_JOBS) -C "$(PKG_BUILD_DIR)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all
++ +$(MAKE) $(PKG_JOBS) -C "$(PKG_BUILD_DIR)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ install
++endef
++
++define Package/libpq/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpq.so.* $(1)/usr/lib/
++endef
++
++define Package/pgsql-cli/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/psql $(1)/usr/bin/
++endef
++
++define Package/pgsql-server/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/share/postgresql
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin
++ ln -sf postgres $(1)/usr/bin/postmaster
++
++ $(INSTALL_BIN) ./files/postgresql.init $(1)/etc/init.d/postgresql
++
++ $(CP) -r $(PKG_INSTALL_DIR)/usr/share/postgresql/* \
++ $(1)/usr/share/postgresql
++
++ $(INSTALL_DATA) ./files/postgresql.config $(1)/etc/config/postgresql
++
++ $(CP) -r \
++ $(PKG_INSTALL_DIR)/usr/lib/postgresql \
++ $(1)/usr/lib
++endef
++
++define Package/pgsql-server/conffiles
++/etc/config/postgresql
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/bin/pg_config/pg_config.host $(1)/usr/bin/pg_config
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libpq $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/libpq-fe.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/pg_config.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/pg_config_manual.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/postgres_ext.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/pg_config_ext.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/postgresql $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpq.{a,so*} $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/src/interfaces/ecpg/preproc/ecpg.host $(1)/usr/bin/ecpg
++ $(CP) $(PKG_BUILD_DIR)/host-zic $(1)/usr/bin/zic
++endef
++
++$(eval $(call BuildPackage,libpq))
++$(eval $(call BuildPackage,pgsql-cli))
++$(eval $(call BuildPackage,pgsql-server))
+diff --git a/feeds/packages/libs/postgresql/files/postgresql.config b/feeds/packages/libs/postgresql/files/postgresql.config
+new file mode 100644
+index 0000000..df17c12
+--- /dev/null
++++ b/feeds/packages/libs/postgresql/files/postgresql.config
+@@ -0,0 +1,5 @@
++config postgresql config
++ option PGUSER postgres
++ option PGDATA /var/postgresql/data
++ option PGLOG /var/postgresql/data/postgresql.log
++ option PG_CTL /usr/bin/pg_ctl
+diff --git a/feeds/packages/libs/postgresql/files/postgresql.init b/feeds/packages/libs/postgresql/files/postgresql.init
+new file mode 100644
+index 0000000..458e8c0
+--- /dev/null
++++ b/feeds/packages/libs/postgresql/files/postgresql.init
+@@ -0,0 +1,73 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2015 OpenWrt.org
++START=50
++
++PROG=/usr/bin/postmaster
++
++USE_PROCD=1
++
++EXTRA_COMMANDS="status"
++EXTRA_HELP=" status Show current status of the PostgreSQL server"
++
++fix_hosts() {
++ # make sure localhost (without a dot) is in /etc/hosts
++ grep -q 'localhost$' /etc/hosts || echo '127.0.0.1 localhost' >> /etc/hosts
++}
++
++fix_perms() {
++ # for whatever reason, /dev/null gets wrong perms
++ chmod a+w /dev/null
++}
++
++cleanup() {
++ if [ -f "$1/postmaster.pid" ]; then
++ rm "$1/postmaster.pid"
++ fi
++}
++
++start_service() {
++ config_load "postgresql"
++ config_get pgdata config PGDATA
++ config_get pguser config PGUSER
++ config_get pgctl config PG_CTL
++ config_get pgopts config PGOPTS
++
++ user_exists postgres 5432 || user_add postgres 5432
++ group_exists postgres 5432 || group_add postgres 5432
++
++ if [ ! -d "${pgdata}" ]; then
++ echo "Create the data directory (${pgdata}) and try again"
++ return 1
++ fi
++
++ fix_perms
++ fix_hosts
++
++ procd_open_instance
++
++ procd_set_param user ${pguser}
++ procd_set_param command $PROG
++ procd_append_param command -D "${pgdata}"
++ [ -n "${pgopts}" ] && procd_append_param command -o "${pgopts}"
++
++ procd_set_param respawn retry=60
++ procd_close_instance
++}
++
++reload_service() {
++ config_load "postgresql"
++ config_get pgdata config PGDATA
++ config_get pguser config PGUSER
++ config_get pgctl config PG_CTL
++ ${pgctl} reload -U ${pguser} -D '${pgdata}' -s
++}
++
++status() {
++ config_load "postgresql"
++ config_get pgdata config PGDATA
++ config_get pguser config PGUSER
++ config_get pgctl config PG_CTL
++ echo "status postgres..."
++ ${pgctl} status -U ${pguser} -D '${pgdata}'
++ echo "ok"
++}
+diff --git a/feeds/packages/libs/postgresql/patches/001-configure_fixes.patch b/feeds/packages/libs/postgresql/patches/001-configure_fixes.patch
+new file mode 100644
+index 0000000..2edaba6
+--- /dev/null
++++ b/feeds/packages/libs/postgresql/patches/001-configure_fixes.patch
+@@ -0,0 +1,11 @@
++--- a/configure.in
+++++ b/configure.in
++@@ -25,7 +25,7 @@ recommended. You can remove the check f
++ your responsibility whether the result works or not.])])
++ AC_COPYRIGHT([Copyright (c) 1996-2014, PostgreSQL Global Development Group])
++ AC_CONFIG_SRCDIR([src/backend/access/common/heaptuple.c])
++-AC_CONFIG_AUX_DIR(config)
+++AC_CONFIG_AUX_DIR([config])
++ AC_PREFIX_DEFAULT(/usr/local/pgsql)
++ AC_SUBST(configure_args, [$ac_configure_args])
++
+diff --git a/feeds/packages/libs/postgresql/patches/200-ranlib.patch b/feeds/packages/libs/postgresql/patches/200-ranlib.patch
+new file mode 100644
+index 0000000..5fc6d3d
+--- /dev/null
++++ b/feeds/packages/libs/postgresql/patches/200-ranlib.patch
+@@ -0,0 +1,10 @@
++--- a/src/port/Makefile
+++++ b/src/port/Makefile
++@@ -52,6 +52,7 @@ uninstall:
++
++ libpgport.a: $(OBJS)
++ $(AR) $(AROPT) $@ $^
+++ $(RANLIB) libpgport.a
++
++ # thread.o needs PTHREAD_CFLAGS (but thread_srv.o does not)
++ thread.o: CFLAGS+=$(PTHREAD_CFLAGS)
+diff --git a/feeds/packages/libs/postgresql/patches/800-busybox-default-pager.patch b/feeds/packages/libs/postgresql/patches/800-busybox-default-pager.patch
+new file mode 100644
+index 0000000..1be1969
+--- /dev/null
++++ b/feeds/packages/libs/postgresql/patches/800-busybox-default-pager.patch
+@@ -0,0 +1,13 @@
++--- a/src/bin/psql/print.h
+++++ b/src/bin/psql/print.h
++@@ -179,10 +179,6 @@ extern void printQuery(const PGresult *r
++ extern void setDecimalLocale(void);
++ extern const printTextFormat *get_line_style(const printTableOpt *opt);
++
++-#ifndef __CYGWIN__
++-#define DEFAULT_PAGER "more"
++-#else
++ #define DEFAULT_PAGER "less"
++-#endif
++
++ #endif /* PRINT_H */
+diff --git a/feeds/packages/libs/protobuf-c/Makefile b/feeds/packages/libs/protobuf-c/Makefile
+new file mode 100644
+index 0000000..f4af211
+--- /dev/null
++++ b/feeds/packages/libs/protobuf-c/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libprotobuf-c
++PKG_VERSION:=v1.0.1
++PKG_RELEASE:=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=git://github.com/protobuf-c/protobuf-c.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=$(PKG_VERSION)
++
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++PKG_LICENSE:=BSD-2c
++
++PKG_MAINTAINER:=Jacob Siverskog <jacob@teenageengineering.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libprotobuf-c
++ TITLE:=Protocol Buffers library
++ SECTION:=libs
++ CATEGORY:=Libraries
++ URL:=http://code.google.com/p/protobuf-c/
++endef
++
++define Package/libprotobuf-c/description
++ Runtime library to use Google Protocol Buffers from C applications.
++ Protocol Buffers are a way of encoding structured data in an efficient yet
++ extensible format. Google uses Protocol Buffers for almost all of its
++ internal RPC protocols and file formats.
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-protoc
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libprotobuf-c.{a,la,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libprotobuf-c/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libprotobuf-c.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libprotobuf-c))
+diff --git a/feeds/packages/libs/protobuf/Makefile b/feeds/packages/libs/protobuf/Makefile
+new file mode 100644
+index 0000000..72133be
+--- /dev/null
++++ b/feeds/packages/libs/protobuf/Makefile
+@@ -0,0 +1,78 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=protobuf
++PKG_VERSION:=2.6.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://github.com/google/protobuf/releases/download/v$(PKG_VERSION)
++PKG_MD5SUM:=11aaac2d704eef8efd1867a807865d85
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_DEPENDS:=protobuf/host
++PKG_USE_MIPS16:=0# MIPS16 prevents protobuf's usage of the 'sync' asm-opcode
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/host-build.mk
++
++define Package/protobuf
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=A structured data encoding library
++ URL:=http://code.google.com/p/protobuf/
++ DEPENDS:=+zlib +libpthread +libstdcpp
++ MAINTAINER:=Jacob Siverskog <jacob@teenageengineering.com>
++endef
++
++define Package/protobuf/description
++ Protocol Buffers are a way of encoding structured data in an efficient
++ yet extensible format. Google uses Protocol Buffers for almost all
++ of its internal RPC protocols and file formats.
++endef
++
++CONFIGURE_ARGS += --with-protoc=$(STAGING_DIR_HOST)/bin/protoc
++
++define Build/InstallDev
++ $(INSTALL_DIR) \
++ $(1)/usr/lib \
++ $(1)/usr/include
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/* \
++ $(1)/usr/include/
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/* \
++ $(1)/usr/lib/
++endef
++
++define Package/protobuf/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libprotoc.so* \
++ $(1)/usr/lib/
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libprotobuf-lite.so* \
++ $(1)/usr/lib/
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libprotobuf.so* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,protobuf))
++$(eval $(call HostBuild))
+diff --git a/feeds/packages/libs/protobuf/patches/001-mipseb-compile.patch b/feeds/packages/libs/protobuf/patches/001-mipseb-compile.patch
+new file mode 100644
+index 0000000..f576833
+--- /dev/null
++++ b/feeds/packages/libs/protobuf/patches/001-mipseb-compile.patch
+@@ -0,0 +1,11 @@
++--- - 2015-05-19 16:27:29.770936016 +0200
+++++ protobuf-2.6.1/src/google/protobuf/stubs/platform_macros.h 2015-05-19 13:49:52.115444643 +0200
++@@ -55,7 +55,7 @@
++ #elif defined(__aarch64__)
++ #define GOOGLE_PROTOBUF_ARCH_AARCH64 1
++ #define GOOGLE_PROTOBUF_ARCH_64_BIT 1
++-#elif defined(__MIPSEL__)
+++#elif defined(__MIPSEL__) || defined(__MIPSEB__)
++ #if defined(__LP64__)
++ #define GOOGLE_PROTOBUF_ARCH_MIPS64 1
++ #define GOOGLE_PROTOBUF_ARCH_64_BIT 1
+diff --git a/feeds/packages/libs/protobuf/patches/003-mips2andHigher-compile.patch b/feeds/packages/libs/protobuf/patches/003-mips2andHigher-compile.patch
+new file mode 100644
+index 0000000..df97928
+--- /dev/null
++++ b/feeds/packages/libs/protobuf/patches/003-mips2andHigher-compile.patch
+@@ -0,0 +1,11 @@
++--- - 2015-05-19 16:29:09.614344473 +0200
+++++ protobuf-2.6.1/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h 2015-05-19 13:49:52.127442746 +0200
++@@ -150,7 +150,7 @@
++ }
++
++ inline void MemoryBarrier() {
++- __asm__ __volatile__("sync" : : : "memory");
+++ __asm__ __volatile__(".set mips2; sync; .set mips0" : : : "memory");
++ }
++
++ inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
+diff --git a/feeds/packages/libs/pthsem/Makefile b/feeds/packages/libs/pthsem/Makefile
+new file mode 100644
+index 0000000..5d3effb
+--- /dev/null
++++ b/feeds/packages/libs/pthsem/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pthsem
++PKG_VERSION:=2.0.8
++PKG_RELEASE:=5
++
++PKG_MAINTAINER:=Othmar Truniger <github@truniger.ch>
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.auto.tuwien.ac.at/~mkoegler/pth/
++PKG_MD5SUM:=9144b26dcc27e67498d63dd5456f934c
++
++PKG_FIXUP:=autoreconf
++PKG_BUILD_PARALLEL:=1
++PKG_FORTIFY_SOURCE:=0
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/pthsem
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GNU pth extended with semaphore support
++ URL:=http://www.auto.tuwien.ac.at/~mkoegler/index.php/pth
++endef
++
++define Package/pthsem/description
++ GNU pth is a user mode multi threading library.
++ pthsem is an extend version, with support for semaphores added. It can be installed parallel to a normal pth.
++endef
++
++# The musl libc provides a proper implementation of sigaltstack() so
++# prevent configure from wrongly assuming a broken Linux platform
++ifeq ($(CONFIG_USE_MUSL),y)
++ CONFIGURE_VARS += \
++ ac_cv_check_sjlj=ssjlj
++endif
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/pthsem-config $(1)/usr/bin/
++ $(SED) 's,^\(prefix\|exec_prefix\)=.*,\1=$(STAGING_DIR)/usr,g' $(1)/usr/bin/pthsem-config
++
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpthsem.{a,la,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/pthsem.pc $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DIR) $(2)/bin
++ $(LN) ../../usr/bin/pthsem-config $(2)/bin/
++endef
++
++define Package/pthsem/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpthsem.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,pthsem))
+diff --git a/feeds/packages/libs/pthsem/patches/001-linux3x-fix.patch b/feeds/packages/libs/pthsem/patches/001-linux3x-fix.patch
+new file mode 100644
+index 0000000..3b968f7
+--- /dev/null
++++ b/feeds/packages/libs/pthsem/patches/001-linux3x-fix.patch
+@@ -0,0 +1,12 @@
++--- pthsem-2.0.8/acinclude.m4
+++++ pthsem-2.0.8/acinclude.m4
++@@ -892,6 +892,8 @@
++ case "x`uname -r`" in
++ changequote(, )dnl
++ x2.[23456789]* ) ;;
+++changequote(, )dnl
+++ x3.* ) ;;
++ changequote([, ])
++ * ) braindead=yes ;;
++ esac
++
+diff --git a/feeds/packages/libs/pthsem/patches/002-fix-signal.h b/feeds/packages/libs/pthsem/patches/002-fix-signal.h
+new file mode 100644
+index 0000000..0e4fdfc
+--- /dev/null
++++ b/feeds/packages/libs/pthsem/patches/002-fix-signal.h
+@@ -0,0 +1,22 @@
++--- a/pth.h.in 2015-07-16 21:14:48.786970549 +0200
+++++ b/pth.h.in 2015-07-16 21:15:22.439416462 +0200
++@@ -43,7 +43,7 @@
++ #include <time.h> /* for struct timespec */
++ #include <sys/time.h> /* for struct timeval */
++ #include <sys/socket.h> /* for sockaddr */
++-#include <sys/signal.h> /* for sigset_t */
+++#include <signal.h> /* for sigset_t */
++ @EXTRA_INCLUDE_SYS_SELECT_H@
++
++ /* fallbacks for essential typedefs */
++--- a/pthread.h.in 2015-07-16 21:14:58.948310639 +0200
+++++ b/pthread.h.in 2015-07-16 21:15:40.989869061 +0200
++@@ -111,7 +111,7 @@
++ #include <sys/types.h> /* for ssize_t */
++ #include <sys/time.h> /* for struct timeval */
++ #include <sys/socket.h> /* for sockaddr */
++-#include <sys/signal.h> /* for sigset_t */
+++#include <signal.h> /* for sigset_t */
++ #include <time.h> /* for struct timespec */
++ #include <unistd.h> /* for off_t */
++ @EXTRA_INCLUDE_SYS_SELECT_H@
+diff --git a/feeds/packages/libs/qrencode/Makefile b/feeds/packages/libs/qrencode/Makefile
+new file mode 100644
+index 0000000..37d39aa
+--- /dev/null
++++ b/feeds/packages/libs/qrencode/Makefile
+@@ -0,0 +1,90 @@
++#
++# Copyright (C) 2006-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=qrencode
++PKG_VERSION:=3.4.4
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://fukuchi.org/works/qrencode/
++PKG_MD5SUM:=be545f3ce36ea8fbb58612d72c4222de
++PKG_MAINTAINER:=Jonathan Bennett <JBennett@incomsystems.biz>
++PKG_LICENSE:=LGPL-2.1+
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libqrencode
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Library for encoding data in a QR Code symbol
++ URL:=http://fukuchi.org/works/qrencode/
++endef
++
++define Package/libqrencode/description
++Libqrencode is a C library for encoding data in a QR Code symbol,
++a kind of 2D symbology that can be scanned by handy terminals such
++as a mobile phone with CCD. The capacity of QR Code is up to 7000
++digits or 4000 characters, and is highly robust.
++endef
++
++define Package/qrencode
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=qrencode binary for producing qr codes
++ URL:=http://fukuchi.org/works/qrencode/
++ DEPENDS:=+libqrencode
++endef
++
++define Package/qrencode/description
++Qrencode is a C program for encoding data in a QR Code symbol,
++a kind of 2D symbology that can be scanned by handy terminals such
++as a mobile phone with CCD. The capacity of QR Code is up to 7000
++digits or 4000 characters, and is highly robust.
++endef
++
++
++CONFIGURE_ARGS+= \
++ --enable-shared \
++ --enable-static \
++ --disable-rpath \
++ --disable-sdltest \
++ --without-tests
++
++TARGET_LDFLAGS+= -s
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/qrencode.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libqrencode.{a,so*} $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/libqrencode.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libqrencode/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libqrencode.so* $(1)/usr/lib/
++endef
++
++define Package/qrencode/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/qrencode $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libqrencode))
++$(eval $(call BuildPackage,qrencode))
+diff --git a/feeds/packages/libs/qrencode/patches/001-disable-png.patch b/feeds/packages/libs/qrencode/patches/001-disable-png.patch
+new file mode 100644
+index 0000000..345bb60
+--- /dev/null
++++ b/feeds/packages/libs/qrencode/patches/001-disable-png.patch
+@@ -0,0 +1,306 @@
++--- a/qrenc.c
+++++ b/qrenc.c
++@@ -25,7 +25,6 @@
++ #include <stdio.h>
++ #include <stdlib.h>
++ #include <string.h>
++-#include <png.h>
++ #include <getopt.h>
++
++ #include "qrencode.h"
++@@ -49,7 +48,6 @@
++ static int verbose = 0;
++
++ enum imageType {
++- PNG_TYPE,
++ EPS_TYPE,
++ SVG_TYPE,
++ ANSI_TYPE,
++@@ -60,7 +58,7 @@
++ ANSIUTF8_TYPE
++ };
++
++-static enum imageType image_type = PNG_TYPE;
+++static enum imageType image_type = SVG_TYPE;
++
++ static const struct option options[] = {
++ {"help" , no_argument , NULL, 'h'},
++@@ -96,13 +94,13 @@
++ if(longopt) {
++ fprintf(stderr,
++ "Usage: qrencode [OPTION]... [STRING]\n"
++-"Encode input data in a QR Code and save as a PNG or EPS image.\n\n"
+++"Encode input data in a QR Code and save as a SVG or EPS image.\n\n"
++ " -h, --help display the help message. -h displays only the help of short\n"
++ " options.\n\n"
++ " -o FILENAME, --output=FILENAME\n"
++ " write image to FILENAME. If '-' is specified, the result\n"
++ " will be output to standard output. If -S is given, structured\n"
++-" symbols are written to FILENAME-01.png, FILENAME-02.png, ...\n"
+++" symbols are written to FILENAME-01.svg, FILENAME-02.svg, ...\n"
++ " (suffix is removed from FILENAME, if specified)\n"
++ " -s NUMBER, --size=NUMBER\n"
++ " specify module size in dots (pixels). (default=3)\n\n"
++@@ -116,9 +114,9 @@
++ " specify the width of the margins. (default=4 (2 for Micro QR)))\n\n"
++ " -d NUMBER, --dpi=NUMBER\n"
++ " specify the DPI of the generated PNG. (default=72)\n\n"
++-" -t {PNG,EPS,SVG,ANSI,ANSI256,ASCII,ASCIIi,UTF8,ANSIUTF8}, --type={PNG,EPS,\n"
+++" -t {EPS,SVG,ANSI,ANSI256,ASCII,ASCIIi,UTF8,ANSIUTF8}, --type={EPS,\n"
++ " SVG,ANSI,ANSI256,ASCII,ASCIIi,UTF8,ANSIUTF8}\n"
++-" specify the type of the generated image. (default=PNG)\n\n"
+++" specify the type of the generated image. (default=SVG)\n\n"
++ " -S, --structured\n"
++ " make structured symbols. Version must be specified.\n\n"
++ " -k, --kanji assume that the input text contains kanji (shift-jis).\n\n"
++@@ -133,7 +131,7 @@
++ " --background=RRGGBB[AA]\n"
++ " specify foreground/background color in hexadecimal notation.\n"
++ " 6-digit (RGB) or 8-digit (RGBA) form are supported.\n"
++-" Color output support available only in PNG and SVG.\n"
+++" Color output support available only in SVG.\n"
++ " -V, --version\n"
++ " display the version number and copyrights of the qrencode.\n\n"
++ " --verbose\n"
++@@ -153,12 +151,12 @@
++ } else {
++ fprintf(stderr,
++ "Usage: qrencode [OPTION]... [STRING]\n"
++-"Encode input data in a QR Code and save as a PNG or EPS image.\n\n"
+++"Encode input data in a QR Code and save as a SVG or EPS image.\n\n"
++ " -h display this message.\n"
++ " --help display the usage of long options.\n"
++ " -o FILENAME write image to FILENAME. If '-' is specified, the result\n"
++ " will be output to standard output. If -S is given, structured\n"
++-" symbols are written to FILENAME-01.png, FILENAME-02.png, ...\n"
+++" symbols are written to FILENAME-01.svg, FILENAME-02.svg, ...\n"
++ " (suffix is removed from FILENAME, if specified)\n"
++ " -s NUMBER specify module size in dots (pixels). (default=3)\n"
++ " -l {LMQH} specify error correction level from L (lowest) to H (highest).\n"
++@@ -166,8 +164,8 @@
++ " -v NUMBER specify the version of the symbol. (default=auto)\n"
++ " -m NUMBER specify the width of the margins. (default=4 (2 for Micro))\n"
++ " -d NUMBER specify the DPI of the generated PNG. (default=72)\n"
++-" -t {PNG,EPS,SVG,ANSI,ANSI256,ASCII,ASCIIi,UTF8,ANSIUTF8}\n"
++-" specify the type of the generated image. (default=PNG)\n"
+++" -t {EPS,SVG,ANSI,ANSI256,ASCII,ASCIIi,UTF8,ANSIUTF8}\n"
+++" specify the type of the generated image. (default=SVG)\n"
++ " -S make structured symbols. Version must be specified.\n"
++ " -k assume that the input text contains kanji (shift-jis).\n"
++ " -c encode lower-case alphabet characters in 8-bit mode. (default)\n"
++@@ -178,7 +176,7 @@
++ " --background=RRGGBB[AA]\n"
++ " specify foreground/background color in hexadecimal notation.\n"
++ " 6-digit (RGB) or 8-digit (RGBA) form are supported.\n"
++-" Color output support available only in PNG and SVG.\n"
+++" Color output support available only in SVG.\n"
++ " -V display the version number and copyrights of the qrencode.\n"
++ " [STRING] input data. If it is not specified, data will be taken from\n"
++ " standard input.\n"
++@@ -253,128 +251,6 @@
++ return fp;
++ }
++
++-static int writePNG(QRcode *qrcode, const char *outfile)
++-{
++- static FILE *fp; // avoid clobbering by setjmp.
++- png_structp png_ptr;
++- png_infop info_ptr;
++- png_colorp palette;
++- png_byte alpha_values[2];
++- unsigned char *row, *p, *q;
++- int x, y, xx, yy, bit;
++- int realwidth;
++-
++- realwidth = (qrcode->width + margin * 2) * size;
++- row = (unsigned char *)malloc((realwidth + 7) / 8);
++- if(row == NULL) {
++- fprintf(stderr, "Failed to allocate memory.\n");
++- exit(EXIT_FAILURE);
++- }
++-
++- if(outfile[0] == '-' && outfile[1] == '\0') {
++- fp = stdout;
++- } else {
++- fp = fopen(outfile, "wb");
++- if(fp == NULL) {
++- fprintf(stderr, "Failed to create file: %s\n", outfile);
++- perror(NULL);
++- exit(EXIT_FAILURE);
++- }
++- }
++-
++- png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
++- if(png_ptr == NULL) {
++- fprintf(stderr, "Failed to initialize PNG writer.\n");
++- exit(EXIT_FAILURE);
++- }
++-
++- info_ptr = png_create_info_struct(png_ptr);
++- if(info_ptr == NULL) {
++- fprintf(stderr, "Failed to initialize PNG write.\n");
++- exit(EXIT_FAILURE);
++- }
++-
++- if(setjmp(png_jmpbuf(png_ptr))) {
++- png_destroy_write_struct(&png_ptr, &info_ptr);
++- fprintf(stderr, "Failed to write PNG image.\n");
++- exit(EXIT_FAILURE);
++- }
++-
++- palette = (png_colorp) malloc(sizeof(png_color) * 2);
++- if(palette == NULL) {
++- fprintf(stderr, "Failed to allocate memory.\n");
++- exit(EXIT_FAILURE);
++- }
++- palette[0].red = fg_color[0];
++- palette[0].green = fg_color[1];
++- palette[0].blue = fg_color[2];
++- palette[1].red = bg_color[0];
++- palette[1].green = bg_color[1];
++- palette[1].blue = bg_color[2];
++- alpha_values[0] = fg_color[3];
++- alpha_values[1] = bg_color[3];
++- png_set_PLTE(png_ptr, info_ptr, palette, 2);
++- png_set_tRNS(png_ptr, info_ptr, alpha_values, 2, NULL);
++-
++- png_init_io(png_ptr, fp);
++- png_set_IHDR(png_ptr, info_ptr,
++- realwidth, realwidth,
++- 1,
++- PNG_COLOR_TYPE_PALETTE,
++- PNG_INTERLACE_NONE,
++- PNG_COMPRESSION_TYPE_DEFAULT,
++- PNG_FILTER_TYPE_DEFAULT);
++- png_set_pHYs(png_ptr, info_ptr,
++- dpi * INCHES_PER_METER,
++- dpi * INCHES_PER_METER,
++- PNG_RESOLUTION_METER);
++- png_write_info(png_ptr, info_ptr);
++-
++- /* top margin */
++- memset(row, 0xff, (realwidth + 7) / 8);
++- for(y=0; y<margin * size; y++) {
++- png_write_row(png_ptr, row);
++- }
++-
++- /* data */
++- p = qrcode->data;
++- for(y=0; y<qrcode->width; y++) {
++- bit = 7;
++- memset(row, 0xff, (realwidth + 7) / 8);
++- q = row;
++- q += margin * size / 8;
++- bit = 7 - (margin * size % 8);
++- for(x=0; x<qrcode->width; x++) {
++- for(xx=0; xx<size; xx++) {
++- *q ^= (*p & 1) << bit;
++- bit--;
++- if(bit < 0) {
++- q++;
++- bit = 7;
++- }
++- }
++- p++;
++- }
++- for(yy=0; yy<size; yy++) {
++- png_write_row(png_ptr, row);
++- }
++- }
++- /* bottom margin */
++- memset(row, 0xff, (realwidth + 7) / 8);
++- for(y=0; y<margin * size; y++) {
++- png_write_row(png_ptr, row);
++- }
++-
++- png_write_end(png_ptr, info_ptr);
++- png_destroy_write_struct(&png_ptr, &info_ptr);
++-
++- fclose(fp);
++- free(row);
++- free(palette);
++-
++- return 0;
++-}
++-
++ static int writeEPS(QRcode *qrcode, const char *outfile)
++ {
++ FILE *fp;
++@@ -831,9 +707,6 @@
++ }
++
++ switch(image_type) {
++- case PNG_TYPE:
++- writePNG(qrcode, outfile);
++- break;
++ case EPS_TYPE:
++ writeEPS(qrcode, outfile);
++ break;
++@@ -887,9 +760,6 @@
++ size_t suffix_size;
++
++ switch(image_type) {
++- case PNG_TYPE:
++- type_suffix = ".png";
++- break;
++ case EPS_TYPE:
++ type_suffix = ".eps";
++ break;
++@@ -948,9 +818,6 @@
++ }
++
++ switch(image_type) {
++- case PNG_TYPE:
++- writePNG(p->code, filename);
++- break;
++ case EPS_TYPE:
++ writeEPS(p->code, filename);
++ break;
++@@ -1062,9 +929,7 @@
++ }
++ break;
++ case 't':
++- if(strcasecmp(optarg, "png") == 0) {
++- image_type = PNG_TYPE;
++- } else if(strcasecmp(optarg, "eps") == 0) {
+++ if(strcasecmp(optarg, "eps") == 0) {
++ image_type = EPS_TYPE;
++ } else if(strcasecmp(optarg, "svg") == 0) {
++ image_type = SVG_TYPE;
++@@ -1133,11 +998,6 @@
++ exit(EXIT_SUCCESS);
++ }
++
++- if(outfile == NULL && image_type == PNG_TYPE) {
++- fprintf(stderr, "No output filename is given.\n");
++- exit(EXIT_FAILURE);
++- }
++-
++ if(optind < argc) {
++ intext = (unsigned char *)argv[optind];
++ length = strlen((char *)intext);
++--- a/configure.ac
+++++ b/configure.ac
++@@ -58,9 +58,6 @@
++ [build_tools=$withval], [build_tools=yes])
++
++ AM_CONDITIONAL(BUILD_TOOLS, [test "x$build_tools" = "xyes" ])
++-if test x$build_tools = xyes ; then
++- PKG_CHECK_MODULES(png, "libpng")
++-fi
++
++ dnl --with-tests
++ AC_ARG_WITH([tests], [AS_HELP_STRING([--with-tests], [build tests [default=no]])],
++@@ -80,12 +77,6 @@
++ echo "/* #undef WITH_TESTS */" >>confdefs.h
++ fi
++
++-if test x$build_tests = xyes ; then
++- SDL_REQUIRED_VERSION=1.2.0
++- AM_PATH_SDL($SDL_REQUIRED_VERSION,,AC_MSG_WARN([*** SDL $SDL_REQUIRED_VERSION or better is required.]))
++- AC_MSG_NOTICE([SDL check done.])
++- AM_ICONV_LINK
++-fi
++ AM_CONDITIONAL(HAVE_SDL, [test "x$SDL_CFLAGS" != "x" ])
++
++
+diff --git a/feeds/packages/libs/sbc/Makefile b/feeds/packages/libs/sbc/Makefile
+new file mode 100644
+index 0000000..cca5472
+--- /dev/null
++++ b/feeds/packages/libs/sbc/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sbc
++PKG_VERSION:=1.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=https://www.kernel.org/pub/linux/bluetooth/
++PKG_MD5SUM:=2d8b7841f2c11ab287718d562f2b981c
++
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING.LIB
++PKG_MAINTAINER:=Dirk Neukirchen <dirkneukirchen@web.de>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/sbc
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=sbc encoding library
++ DEPENDS:=+libsndfile
++ URL:=http://www.bluez.org
++endef
++
++define Package/sbc/description
++ Low Complexity Subband Coding for bluetooth audio profiles encoding and decoding.
++ Needed for A2DP support.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/sbc
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/sbc/sbc.h $(1)/usr/include/sbc/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsbc* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/sbc.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/sbc/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sbc* $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsbc.so* $(1)/usr/lib/
++endef
++
++
++$(eval $(call BuildPackage,sbc))
+diff --git a/feeds/packages/libs/speex/Makefile b/feeds/packages/libs/speex/Makefile
+new file mode 100644
+index 0000000..48522a5
+--- /dev/null
++++ b/feeds/packages/libs/speex/Makefile
+@@ -0,0 +1,105 @@
++#
++# Copyright (C) 2006-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=speex
++PKG_VERSION:=1.2rc1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.us.xiph.org/releases/speex/
++PKG_MD5SUM:=c4438b22c08e5811ff10e2b06ee9b9ae
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libspeex
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Open source speech compression codec library
++ URL:=http://www.speex.org/
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++endef
++
++define Package/libspeexdsp
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Open source speech compression codec library output to DSP
++ URL:=http://www.speex.org/
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++endef
++
++define Package/libspeex/description
++ Open source patent-free speech compression codec library.
++ Speex is an Open Source/Free Software patent-free audio compression
++ format designed for speech. The Speex Project aims to lower the
++ barrier of entry for voice applications by providing a free
++ alternative to expensive proprietary speech codecs. Moreover, Speex
++ is well-adapted to Internet applications and provides useful features
++ that are not present in most other codecs.
++
++ This package contains the shared codec library, needed by other programs.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Package/libspeexdsp/description
++ Open source patent-free speech compression codec library.
++ Speex is an Open Source/Free Software patent-free audio compression
++ format designed for speech. The Speex Project aims to lower the
++ barrier of entry for voice applications by providing a free
++ alternative to expensive proprietary speech codecs. Moreover, Speex
++ is well-adapted to Internet applications and provides useful features
++ that are not present in most other codecs.
++
++ This package contains the shared dsp library, needed by other programs.
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --enable-shared \
++ --enable-static \
++ --enable-fixed-point \
++ --disable-oggtest \
++ --disable-float-api \
++ --disable-vbr \
++ --with-ogg=$(STAGING_DIR)/usr \
++ )
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ bin_PROGRAMS="" \
++ all install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/speex $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libspeex.{a,so*} $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libspeexdsp.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/speex.pc $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/speexdsp.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libspeex/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libspeex.so.* $(1)/usr/lib/
++endef
++
++define Package/libspeexdsp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libspeexdsp.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libspeex))
++$(eval $(call BuildPackage,libspeexdsp))
+diff --git a/feeds/packages/libs/sqlite3/Makefile b/feeds/packages/libs/sqlite3/Makefile
+new file mode 100644
+index 0000000..0fdbedf
+--- /dev/null
++++ b/feeds/packages/libs/sqlite3/Makefile
+@@ -0,0 +1,106 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sqlite
++PKG_VERSION:=3081101
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-autoconf-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.sqlite.org/2015/
++PKG_MD5SUM:=298c8d6af7ca314f68de92bc7a356cbe
++
++PKG_LICENSE:=PUBLICDOMAIN
++PKG_LICENSE_FILES:=
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-autoconf-$(PKG_VERSION)
++PKG_BUILD_DEPENDS:=libncurses libreadline
++
++PKG_FIXUP:=autoreconf
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/sqlite3/Default
++ SUBMENU:=database
++ TITLE:=SQLite (v3.x) database engine
++ URL:=http://www.sqlite.org/
++ MAINTAINER:=Etienne CHAMPETIER <champetier.etienne@gmail.com>
++endef
++
++define Package/sqlite3/Default/description
++ SQLite is a small C library that implements a self-contained, embeddable,
++ zero-configuration SQL database engine.
++endef
++
++define Package/libsqlite3
++ $(call Package/sqlite3/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libpthread
++ TITLE+= (library)
++endef
++
++define Package/libsqlite3/description
++$(call Package/sqlite3/Default/description)
++ This package contains the SQLite (v3.x) shared library, used by other
++ programs.
++endef
++
++define Package/sqlite3-cli
++ $(call Package/sqlite3/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libsqlite3 +libncurses +libreadline
++ TITLE+= (cli)
++endef
++
++define Package/sqlite3-cli/description
++$(call Package/sqlite3/Default/description)
++ This package contains a terminal-based front-end to the SQLite (v3.x) library
++ that can evaluate queries interactively and display the results in multiple
++ formats.
++endef
++
++TARGET_CFLAGS += $(FPIC) \
++ -DSQLITE_ENABLE_UNLOCK_NOTIFY \
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++
++CONFIGURE_VARS += \
++ config_BUILD_CC="$(HOSTCC)" \
++ config_BUILD_CFLAGS="-O2" \
++ config_TARGET_CC="$(TARGET_CC)" \
++ config_TARGET_CFLAGS="$(TARGET_CFLAGS)" \
++ config_TARGET_READLINE_INC="$(TARGET_CPPFLAGS)" \
++ config_TARGET_READLINE_LIBS="$(TARGET_LDFLAGS) -lreadline -lncurses" \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/sqlite3{,ext}.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsqlite3.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/sqlite3.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libsqlite3/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsqlite3.so.* $(1)/usr/lib/
++endef
++
++define Package/sqlite3-cli/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sqlite3 $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libsqlite3))
++$(eval $(call BuildPackage,sqlite3-cli))
+diff --git a/feeds/packages/libs/tcp_wrappers/Makefile b/feeds/packages/libs/tcp_wrappers/Makefile
+new file mode 100644
+index 0000000..d453031
+--- /dev/null
++++ b/feeds/packages/libs/tcp_wrappers/Makefile
+@@ -0,0 +1,69 @@
++#
++# Copyright (C) 2006 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tcp_wrappers
++PKG_VERSION:=7.6
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=ftp://ftp.porcupine.org/pub/security
++PKG_MD5SUM:=e6fa25f71226d090f34de3f6b122fb5a
++
++PKG_LICENSE:=BSD
++PKG_LICENE_FILES:=DISCLAIMER
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)_$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libwrap
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Security wrapper library for TCP services
++ URL:=ftp://ftp.porcupine.org/pub/security/index.html
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++ifeq ($(CONFIG_USE_MUSL),)
++TARGET_EXTRA_LIBS:=LIBS=-lnsl
++endif
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ OPT_CFLAGS="$(TARGET_CFLAGS)" \
++ $(TARGET_EXTRA_LIBS) \
++ NETGROUP= \
++ VSYSLOG= \
++ BUGS= \
++ EXTRA_CFLAGS="-DSYS_ERRLIST_DEFINED -DHAVE_STRERROR -DHAVE_WEAKSYMS -D_REENTRANT -DINET6=1 \
++ -Dss_family=__ss_family -Dss_len=__ss_len" \
++ FACILITY=LOG_DAEMON \
++ SEVERITY=LOG_INFO \
++ REAL_DAEMON_DIR=/usr/sbin \
++ STYLE="-DPROCESS_OPTIONS" \
++ tidy all
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_BUILD_DIR)/tcpd.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/libwrap.a $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/shared/libwrap.so* $(1)/usr/lib/
++endef
++
++define Package/libwrap/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/shared/libwrap.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libwrap))
+diff --git a/feeds/packages/libs/tcp_wrappers/patches/001-debian_subset.patch b/feeds/packages/libs/tcp_wrappers/patches/001-debian_subset.patch
+new file mode 100644
+index 0000000..0b3ad2c
+--- /dev/null
++++ b/feeds/packages/libs/tcp_wrappers/patches/001-debian_subset.patch
+@@ -0,0 +1,936 @@
++--- a/hosts_access.c
+++++ b/hosts_access.c
++@@ -240,6 +240,26 @@ struct request_info *request;
++ }
++ }
++
+++/* hostfile_match - look up host patterns from file */
+++
+++static int hostfile_match(path, host)
+++char *path;
+++struct hosts_info *host;
+++{
+++ char tok[BUFSIZ];
+++ int match = NO;
+++ FILE *fp;
+++
+++ if ((fp = fopen(path, "r")) != 0) {
+++ while (fscanf(fp, "%s", tok) == 1 && !(match = host_match(tok, host)))
+++ /* void */ ;
+++ fclose(fp);
+++ } else if (errno != ENOENT) {
+++ tcpd_warn("open %s: %m", path);
+++ }
+++ return (match);
+++}
+++
++ /* host_match - match host name and/or address against pattern */
++
++ static int host_match(tok, host)
++@@ -267,6 +287,8 @@ struct host_info *host;
++ tcpd_warn("netgroup support is disabled"); /* not tcpd_jump() */
++ return (NO);
++ #endif
+++ } else if (tok[0] == '/') { /* /file hack */
+++ return (hostfile_match(tok, host));
++ } else if (STR_EQ(tok, "KNOWN")) { /* check address and name */
++ char *name = eval_hostname(host);
++ return (STR_NE(eval_hostaddr(host), unknown) && HOSTNAME_KNOWN(name));
++--- a/tcpd.h
+++++ b/tcpd.h
++@@ -4,6 +4,25 @@
++ * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
++ */
++
+++#ifndef _TCPWRAPPERS_TCPD_H
+++#define _TCPWRAPPERS_TCPD_H
+++
+++/* someone else may have defined this */
+++#undef __P
+++
+++/* use prototypes if we have an ANSI C compiler or are using C++ */
+++#if defined(__STDC__) || defined(__cplusplus)
+++#define __P(args) args
+++#else
+++#define __P(args) ()
+++#endif
+++
+++/* Need definitions of struct sockaddr_in and FILE. */
+++#include <netinet/in.h>
+++#include <stdio.h>
+++
+++__BEGIN_DECLS
+++
++ /* Structure to describe one communications endpoint. */
++
++ #define STRING_LENGTH 128 /* hosts, users, processes */
++@@ -25,10 +44,10 @@ struct request_info {
++ char pid[10]; /* access via eval_pid(request) */
++ struct host_info client[1]; /* client endpoint info */
++ struct host_info server[1]; /* server endpoint info */
++- void (*sink) (); /* datagram sink function or 0 */
++- void (*hostname) (); /* address to printable hostname */
++- void (*hostaddr) (); /* address to printable address */
++- void (*cleanup) (); /* cleanup function or 0 */
+++ void (*sink) __P((int)); /* datagram sink function or 0 */
+++ void (*hostname) __P((struct host_info *)); /* address to printable hostname */
+++ void (*hostaddr) __P((struct host_info *)); /* address to printable address */
+++ void (*cleanup) __P((struct request_info *)); /* cleanup function or 0 */
++ struct netconfig *config; /* netdir handle */
++ };
++
++@@ -61,25 +80,30 @@ extern char paranoid[];
++ /* Global functions. */
++
++ #if defined(TLI) || defined(PTX) || defined(TLI_SEQUENT)
++-extern void fromhost(); /* get/validate client host info */
+++extern void fromhost __P((struct request_info *)); /* get/validate client host info */
++ #else
++ #define fromhost sock_host /* no TLI support needed */
++ #endif
++
++-extern int hosts_access(); /* access control */
++-extern void shell_cmd(); /* execute shell command */
++-extern char *percent_x(); /* do %<char> expansion */
++-extern void rfc931(); /* client name from RFC 931 daemon */
++-extern void clean_exit(); /* clean up and exit */
++-extern void refuse(); /* clean up and exit */
++-extern char *xgets(); /* fgets() on steroids */
++-extern char *split_at(); /* strchr() and split */
++-extern unsigned long dot_quad_addr(); /* restricted inet_addr() */
+++extern void shell_cmd __P((char *)); /* execute shell command */
+++extern char *percent_x __P((char *, int, char *, struct request_info *)); /* do %<char> expansion */
+++extern void rfc931 __P((struct sockaddr_in *, struct sockaddr_in *, char *)); /* client name from RFC 931 daemon */
+++extern void clean_exit __P((struct request_info *)); /* clean up and exit */
+++extern void refuse __P((struct request_info *)); /* clean up and exit */
+++extern char *xgets __P((char *, int, FILE *)); /* fgets() on steroids */
+++extern char *split_at __P((char *, int)); /* strchr() and split */
+++extern unsigned long dot_quad_addr __P((char *)); /* restricted inet_addr() */
++
++ /* Global variables. */
++
+++#ifdef HAVE_WEAKSYMS
+++extern int allow_severity __attribute__ ((weak)); /* for connection logging */
+++extern int deny_severity __attribute__ ((weak)); /* for connection logging */
+++#else
++ extern int allow_severity; /* for connection logging */
++ extern int deny_severity; /* for connection logging */
+++#endif
+++
++ extern char *hosts_allow_table; /* for verification mode redirection */
++ extern char *hosts_deny_table; /* for verification mode redirection */
++ extern int hosts_access_verbose; /* for verbose matching mode */
++@@ -92,9 +116,14 @@ extern int resident; /* > 0 if residen
++ */
++
++ #ifdef __STDC__
+++extern int hosts_access(struct request_info *request);
+++extern int hosts_ctl(char *daemon, char *client_name, char *client_addr,
+++ char *client_user);
++ extern struct request_info *request_init(struct request_info *,...);
++ extern struct request_info *request_set(struct request_info *,...);
++ #else
+++extern int hosts_access();
+++extern int hosts_ctl();
++ extern struct request_info *request_init(); /* initialize request */
++ extern struct request_info *request_set(); /* update request structure */
++ #endif
++@@ -117,27 +146,31 @@ extern struct request_info *request_set(
++ * host_info structures serve as caches for the lookup results.
++ */
++
++-extern char *eval_user(); /* client user */
++-extern char *eval_hostname(); /* printable hostname */
++-extern char *eval_hostaddr(); /* printable host address */
++-extern char *eval_hostinfo(); /* host name or address */
++-extern char *eval_client(); /* whatever is available */
++-extern char *eval_server(); /* whatever is available */
+++extern char *eval_user __P((struct request_info *)); /* client user */
+++extern char *eval_hostname __P((struct host_info *)); /* printable hostname */
+++extern char *eval_hostaddr __P((struct host_info *)); /* printable host address */
+++extern char *eval_hostinfo __P((struct host_info *)); /* host name or address */
+++extern char *eval_client __P((struct request_info *)); /* whatever is available */
+++extern char *eval_server __P((struct request_info *)); /* whatever is available */
++ #define eval_daemon(r) ((r)->daemon) /* daemon process name */
++ #define eval_pid(r) ((r)->pid) /* process id */
++
++ /* Socket-specific methods, including DNS hostname lookups. */
++
++-extern void sock_host(); /* look up endpoint addresses */
++-extern void sock_hostname(); /* translate address to hostname */
++-extern void sock_hostaddr(); /* address to printable address */
+++/* look up endpoint addresses */
+++extern void sock_host __P((struct request_info *));
+++/* translate address to hostname */
+++extern void sock_hostname __P((struct host_info *));
+++/* address to printable address */
+++extern void sock_hostaddr __P((struct host_info *));
+++
++ #define sock_methods(r) \
++ { (r)->hostname = sock_hostname; (r)->hostaddr = sock_hostaddr; }
++
++ /* The System V Transport-Level Interface (TLI) interface. */
++
++ #if defined(TLI) || defined(PTX) || defined(TLI_SEQUENT)
++-extern void tli_host(); /* look up endpoint addresses etc. */
+++extern void tli_host __P((struct request_info *)); /* look up endpoint addresses etc. */
++ #endif
++
++ /*
++@@ -178,7 +211,7 @@ extern struct tcpd_context tcpd_context;
++ * behavior.
++ */
++
++-extern void process_options(); /* execute options */
+++extern void process_options __P((char *, struct request_info *)); /* execute options */
++ extern int dry_run; /* verification flag */
++
++ /* Bug workarounds. */
++@@ -217,3 +250,7 @@ extern char *fix_strtok();
++ #define strtok my_strtok
++ extern char *my_strtok();
++ #endif
+++
+++__END_DECLS
+++
+++#endif /* tcpd.h */
++--- a/Makefile
+++++ b/Makefile
++@@ -1,5 +1,10 @@
+++GLIBC=$(shell grep -s -c __GLIBC__ /usr/include/features.h)
+++
++ # @(#) Makefile 1.23 97/03/21 19:27:20
++
+++# unset the HOSTNAME environment variable
+++HOSTNAME =
+++
++ what:
++ @echo
++ @echo "Usage: edit the REAL_DAEMON_DIR definition in the Makefile then:"
++@@ -19,7 +24,7 @@ what:
++ @echo " generic (most bsd-ish systems with sys5 compatibility)"
++ @echo " 386bsd aix alpha apollo bsdos convex-ultranet dell-gcc dgux dgux543"
++ @echo " dynix epix esix freebsd hpux irix4 irix5 irix6 isc iunix"
++- @echo " linux machten mips(untested) ncrsvr4 netbsd next osf power_unix_211"
+++ @echo " linux gnu machten mips(untested) ncrsvr4 netbsd next osf power_unix_211"
++ @echo " ptx-2.x ptx-generic pyramid sco sco-nis sco-od2 sco-os5 sinix sunos4"
++ @echo " sunos40 sunos5 sysv4 tandem ultrix unicos7 unicos8 unixware1 unixware2"
++ @echo " uts215 uxp"
++@@ -43,8 +48,8 @@ what:
++ # Ultrix 4.x SunOS 4.x ConvexOS 10.x Dynix/ptx
++ #REAL_DAEMON_DIR=/usr/etc
++ #
++-# SysV.4 Solaris 2.x OSF AIX
++-#REAL_DAEMON_DIR=/usr/sbin
+++# SysV.4 Solaris 2.x OSF AIX Linux
+++REAL_DAEMON_DIR=/usr/sbin
++ #
++ # BSD 4.4
++ #REAL_DAEMON_DIR=/usr/libexec
++@@ -141,10 +146,21 @@ freebsd:
++ LIBS= RANLIB=ranlib ARFLAGS=rv AUX_OBJ= NETGROUP= TLI= \
++ EXTRA_CFLAGS=-DSYS_ERRLIST_DEFINED VSYSLOG= all
++
+++ifneq ($(GLIBC),0)
+++MYLIB=-lnsl
+++endif
+++
++ linux:
++ @make REAL_DAEMON_DIR=$(REAL_DAEMON_DIR) STYLE=$(STYLE) \
++- LIBS= RANLIB=ranlib ARFLAGS=rv AUX_OBJ=setenv.o \
++- NETGROUP= TLI= EXTRA_CFLAGS="-DBROKEN_SO_LINGER" all
+++ LIBS=$(MYLIB) RANLIB=ranlib ARFLAGS=rv AUX_OBJ=weak_symbols.o \
+++ NETGROUP=-DNETGROUP TLI= VSYSLOG= BUGS= all \
+++ EXTRA_CFLAGS="-DSYS_ERRLIST_DEFINED -DHAVE_WEAKSYMS -D_REENTRANT"
+++
+++gnu:
+++ @make REAL_DAEMON_DIR=$(REAL_DAEMON_DIR) STYLE=$(STYLE) \
+++ LIBS=$(MYLIB) RANLIB=ranlib ARFLAGS=rv AUX_OBJ=weak_symbols.o \
+++ NETGROUP=-DNETGROUP TLI= VSYSLOG= BUGS= all \
+++ EXTRA_CFLAGS="-DHAVE_STRERROR -DHAVE_WEAKSYMS -D_REENTRANT"
++
++ # This is good for many SYSV+BSD hybrids with NIS, probably also for HP-UX 7.x.
++ hpux hpux8 hpux9 hpux10:
++@@ -391,7 +407,7 @@ AR = ar
++ # the ones provided with this source distribution. The environ.c module
++ # implements setenv(), getenv(), and putenv().
++
++-AUX_OBJ= setenv.o
+++#AUX_OBJ= setenv.o
++ #AUX_OBJ= environ.o
++ #AUX_OBJ= environ.o strcasecmp.o
++
++@@ -454,7 +470,8 @@ AUX_OBJ= setenv.o
++ # host name aliases. Compile with -DSOLARIS_24_GETHOSTBYNAME_BUG to work
++ # around this. The workaround does no harm on other Solaris versions.
++
++-BUGS = -DGETPEERNAME_BUG -DBROKEN_FGETS -DLIBC_CALLS_STRTOK
+++BUGS =
+++#BUGS = -DGETPEERNAME_BUG -DBROKEN_FGETS -DLIBC_CALLS_STRTOK
++ #BUGS = -DGETPEERNAME_BUG -DBROKEN_FGETS -DINET_ADDR_BUG
++ #BUGS = -DGETPEERNAME_BUG -DBROKEN_FGETS -DSOLARIS_24_GETHOSTBYNAME_BUG
++
++@@ -464,7 +481,7 @@ BUGS = -DGETPEERNAME_BUG -DBROKEN_FGETS
++ # If your system supports NIS or YP-style netgroups, enable the following
++ # macro definition. Netgroups are used only for host access control.
++ #
++-#NETGROUP= -DNETGROUP
+++NETGROUP= -DNETGROUP
++
++ ###############################################################
++ # System dependencies: whether or not your system has vsyslog()
++@@ -491,7 +508,7 @@ VSYSLOG = -Dvsyslog=myvsyslog
++ # Uncomment the next definition to turn on the language extensions
++ # (examples: allow, deny, banners, twist and spawn).
++ #
++-#STYLE = -DPROCESS_OPTIONS # Enable language extensions.
+++STYLE = -DPROCESS_OPTIONS # Enable language extensions.
++
++ ################################################################
++ # Optional: Changing the default disposition of logfile records
++@@ -514,7 +531,7 @@ VSYSLOG = -Dvsyslog=myvsyslog
++ #
++ # The LOG_XXX names below are taken from the /usr/include/syslog.h file.
++
++-FACILITY= LOG_MAIL # LOG_MAIL is what most sendmail daemons use
+++FACILITY= LOG_DAEMON # LOG_MAIL is what most sendmail daemons use
++
++ # The syslog priority at which successful connections are logged.
++
++@@ -610,7 +627,7 @@ TABLES = -DHOSTS_DENY=\"/etc/hosts.deny\
++ # Paranoid mode implies hostname lookup. In order to disable hostname
++ # lookups altogether, see the next section.
++
++-PARANOID= -DPARANOID
+++#PARANOID= -DPARANOID
++
++ ########################################
++ # Optional: turning off hostname lookups
++@@ -623,7 +640,7 @@ PARANOID= -DPARANOID
++ # In order to perform selective hostname lookups, disable paranoid
++ # mode (see previous section) and comment out the following definition.
++
++-HOSTNAME= -DALWAYS_HOSTNAME
+++#HOSTNAME= -DALWAYS_HOSTNAME
++
++ #############################################
++ # Optional: Turning on host ADDRESS checking
++@@ -649,28 +666,46 @@ HOSTNAME= -DALWAYS_HOSTNAME
++ # source-routed traffic in the kernel. Examples: 4.4BSD derivatives,
++ # Solaris 2.x, and Linux. See your system documentation for details.
++ #
++-# KILL_OPT= -DKILL_IP_OPTIONS
+++KILL_OPT= -DKILL_IP_OPTIONS
++
++ ## End configuration options
++ ############################
++
++ # Protection against weird shells or weird make programs.
++
+++CC = gcc
++ SHELL = /bin/sh
++-.c.o:; $(CC) $(CFLAGS) -c $*.c
+++.c.o:; $(CC) $(CFLAGS) -o $*.o -c $*.c
+++
+++SOMAJOR = 0
+++SOMINOR = 7.6
+++
+++LIB = libwrap.a
+++SHLIB = shared/libwrap.so.$(SOMAJOR).$(SOMINOR)
+++SHLIBSOMAJ= shared/libwrap.so.$(SOMAJOR)
+++SHLIBSO = shared/libwrap.so
+++SHLIBFLAGS = -Lshared -lwrap
++
++-CFLAGS = -O -DFACILITY=$(FACILITY) $(ACCESS) $(PARANOID) $(NETGROUP) \
+++shared/%.o: %.c
+++ $(CC) $(CFLAGS) $(SHCFLAGS) -c $< -o $@
+++
+++CFLAGS = -O2 -g -DFACILITY=$(FACILITY) $(ACCESS) $(PARANOID) $(NETGROUP) \
++ $(BUGS) $(SYSTYPE) $(AUTH) $(UMASK) \
++ -DREAL_DAEMON_DIR=\"$(REAL_DAEMON_DIR)\" $(STYLE) $(KILL_OPT) \
++ -DSEVERITY=$(SEVERITY) -DRFC931_TIMEOUT=$(RFC931_TIMEOUT) \
++ $(UCHAR) $(TABLES) $(STRINGS) $(TLI) $(EXTRA_CFLAGS) $(DOT) \
++ $(VSYSLOG) $(HOSTNAME)
++
+++SHLINKFLAGS = -shared -Xlinker -soname -Xlinker libwrap.so.$(SOMAJOR) -lc $(LIBS)
+++SHCFLAGS = -fPIC -shared -D_REENTRANT
+++
++ LIB_OBJ= hosts_access.o options.o shell_cmd.o rfc931.o eval.o \
++ hosts_ctl.o refuse.o percent_x.o clean_exit.o $(AUX_OBJ) \
++ $(FROM_OBJ) fix_options.o socket.o tli.o workarounds.o \
++ update.o misc.o diag.o percent_m.o myvsyslog.o
++
+++SHLIB_OBJ= $(addprefix shared/, $(LIB_OBJ));
+++
++ FROM_OBJ= fromhost.o
++
++ KIT = README miscd.c tcpd.c fromhost.c hosts_access.c shell_cmd.c \
++@@ -684,46 +719,78 @@ KIT = README miscd.c tcpd.c fromhost.c h
++ refuse.c tcpdchk.8 setenv.c inetcf.c inetcf.h scaffold.c \
++ scaffold.h tcpdmatch.8 README.NIS
++
++-LIB = libwrap.a
++-
++-all other: config-check tcpd tcpdmatch try-from safe_finger tcpdchk
+++all other: config-check tcpd tcpdmatch try-from safe_finger tcpdchk $(LIB)
++
++ # Invalidate all object files when the compiler options (CFLAGS) have changed.
++
++ config-check:
++ @set +e; test -n "$(REAL_DAEMON_DIR)" || { make; exit 1; }
++- @set +e; echo $(CFLAGS) >/tmp/cflags.$$$$ ; \
++- if cmp cflags /tmp/cflags.$$$$ ; \
++- then rm /tmp/cflags.$$$$ ; \
++- else mv /tmp/cflags.$$$$ cflags ; \
+++ @set +e; echo $(CFLAGS) >cflags.new ; \
+++ if cmp cflags cflags.new ; \
+++ then rm cflags.new ; \
+++ else mv cflags.new cflags ; \
++ fi >/dev/null 2>/dev/null
+++ @if [ ! -d shared ]; then mkdir shared; fi
++
++ $(LIB): $(LIB_OBJ)
++ rm -f $(LIB)
++ $(AR) $(ARFLAGS) $(LIB) $(LIB_OBJ)
++ -$(RANLIB) $(LIB)
++
++-tcpd: tcpd.o $(LIB)
++- $(CC) $(CFLAGS) -o $@ tcpd.o $(LIB) $(LIBS)
+++$(SHLIB): $(SHLIB_OBJ)
+++ rm -f $(SHLIB)
+++ $(CC) -o $(SHLIB) $(SHLINKFLAGS) $(SHLIB_OBJ)
+++ ln -s $(notdir $(SHLIB)) $(SHLIBSOMAJ)
+++ ln -s $(notdir $(SHLIBSOMAJ)) $(SHLIBSO)
+++
+++tcpd: tcpd.o $(SHLIB)
+++ $(CC) $(CFLAGS) -o $@ tcpd.o $(SHLIBFLAGS)
++
++-miscd: miscd.o $(LIB)
++- $(CC) $(CFLAGS) -o $@ miscd.o $(LIB) $(LIBS)
+++miscd: miscd.o $(SHLIB)
+++ $(CC) $(CFLAGS) -o $@ miscd.o $(SHLIBFLAGS)
++
++-safe_finger: safe_finger.o $(LIB)
++- $(CC) $(CFLAGS) -o $@ safe_finger.o $(LIB) $(LIBS)
+++safe_finger: safe_finger.o $(SHLIB)
+++ $(CC) $(CFLAGS) -o $@ safe_finger.o $(SHLIBFLAGS)
++
++ TCPDMATCH_OBJ = tcpdmatch.o fakelog.o inetcf.o scaffold.o
++
++-tcpdmatch: $(TCPDMATCH_OBJ) $(LIB)
++- $(CC) $(CFLAGS) -o $@ $(TCPDMATCH_OBJ) $(LIB) $(LIBS)
+++tcpdmatch: $(TCPDMATCH_OBJ) $(SHLIB)
+++ $(CC) $(CFLAGS) -o $@ $(TCPDMATCH_OBJ) $(SHLIBFLAGS)
++
++-try-from: try-from.o fakelog.o $(LIB)
++- $(CC) $(CFLAGS) -o $@ try-from.o fakelog.o $(LIB) $(LIBS)
+++try-from: try-from.o fakelog.o $(SHLIB)
+++ $(CC) $(CFLAGS) -o $@ try-from.o fakelog.o $(SHLIBFLAGS)
++
++ TCPDCHK_OBJ = tcpdchk.o fakelog.o inetcf.o scaffold.o
++
++-tcpdchk: $(TCPDCHK_OBJ) $(LIB)
++- $(CC) $(CFLAGS) -o $@ $(TCPDCHK_OBJ) $(LIB) $(LIBS)
+++tcpdchk: $(TCPDCHK_OBJ) $(SHLIB)
+++ $(CC) $(CFLAGS) -o $@ $(TCPDCHK_OBJ) $(SHLIBFLAGS)
+++
+++install: install-lib install-bin install-dev
+++
+++install-lib:
+++ install -o root -g root -m 0644 $(SHLIB) ${DESTDIR}/lib/
+++ ln -s $(notdir $(SHLIB)) ${DESTDIR}/lib/$(notdir $(SHLIBSOMAJ))
+++
+++install-bin:
+++ install -o root -g root -m 0755 tcpd ${DESTDIR}/usr/sbin/
+++ install -o root -g root -m 0755 tcpdchk ${DESTDIR}/usr/sbin/
+++ install -o root -g root -m 0755 tcpdmatch ${DESTDIR}/usr/sbin/
+++ install -o root -g root -m 0755 try-from ${DESTDIR}/usr/sbin/
+++ install -o root -g root -m 0755 safe_finger ${DESTDIR}/usr/sbin/
+++ install -o root -g root -m 0644 tcpd.8 ${DESTDIR}/usr/share/man/man8/
+++ install -o root -g root -m 0644 tcpdchk.8 ${DESTDIR}/usr/share/man/man8/
+++ install -o root -g root -m 0644 tcpdmatch.8 ${DESTDIR}/usr/share/man/man8/
+++ install -o root -g root -m 0644 hosts_access.5 ${DESTDIR}/usr/share/man/man5/
+++ install -o root -g root -m 0644 hosts_options.5 ${DESTDIR}/usr/share/man/man5/
+++
+++install-dev:
+++ ln -s /lib/$(notdir $(SHLIBSOMAJ)) ${DESTDIR}/usr/lib/$(notdir $(SHLIBSO))
+++ install -o root -g root -m 0644 hosts_access.3 ${DESTDIR}/usr/share/man/man3/
+++ install -o root -g root -m 0644 tcpd.h ${DESTDIR}/usr/include/
+++ install -o root -g root -m 0644 $(LIB) ${DESTDIR}/usr/lib/
+++ ln -s hosts_access.3 ${DESTDIR}/usr/share/man/man3/hosts_ctl.3
+++ ln -s hosts_access.3 ${DESTDIR}/usr/share/man/man3/request_init.3
+++ ln -s hosts_access.3 ${DESTDIR}/usr/share/man/man3/request_set.3
++
++ shar: $(KIT)
++ @shar $(KIT)
++@@ -739,7 +806,8 @@ archive:
++
++ clean:
++ rm -f tcpd miscd safe_finger tcpdmatch tcpdchk try-from *.[oa] core \
++- cflags
+++ cflags libwrap*.so*
+++ rm -rf shared
++
++ tidy: clean
++ chmod -R a+r .
++@@ -885,5 +953,6 @@ update.o: cflags
++ update.o: mystdarg.h
++ update.o: tcpd.h
++ vfprintf.o: cflags
+++weak_symbols.o: tcpd.h
++ workarounds.o: cflags
++ workarounds.o: tcpd.h
++--- a/hosts_access.5
+++++ b/hosts_access.5
++@@ -8,9 +8,9 @@ name, host name/address) patterns. Exam
++ impatient reader is encouraged to skip to the EXAMPLES section for a
++ quick introduction.
++ .PP
++-An extended version of the access control language is described in the
++-\fIhosts_options\fR(5) document. The extensions are turned on at
++-program build time by building with -DPROCESS_OPTIONS.
+++The extended version of the access control language is described in the
+++\fIhosts_options\fR(5) document. \fBNote that this language supersedes
+++the meaning of \fIshell_command\fB as documented below.\fR
++ .PP
++ In the following text, \fIdaemon\fR is the the process name of a
++ network daemon process, and \fIclient\fR is the name and/or address of
++@@ -40,7 +40,7 @@ A newline character is ignored when it i
++ character. This permits you to break up long lines so that they are
++ easier to edit.
++ .IP \(bu
++-Blank lines or lines that begin with a `#\' character are ignored.
+++Blank lines or lines that begin with a `#' character are ignored.
++ This permits you to insert comments and whitespace so that the tables
++ are easier to read.
++ .IP \(bu
++@@ -69,26 +69,33 @@ checks are case insensitive.
++ .SH PATTERNS
++ The access control language implements the following patterns:
++ .IP \(bu
++-A string that begins with a `.\' character. A host name is matched if
+++A string that begins with a `.' character. A host name is matched if
++ the last components of its name match the specified pattern. For
++-example, the pattern `.tue.nl\' matches the host name
++-`wzv.win.tue.nl\'.
+++example, the pattern `.tue.nl' matches the host name
+++`wzv.win.tue.nl'.
++ .IP \(bu
++-A string that ends with a `.\' character. A host address is matched if
+++A string that ends with a `.' character. A host address is matched if
++ its first numeric fields match the given string. For example, the
++-pattern `131.155.\' matches the address of (almost) every host on the
+++pattern `131.155.' matches the address of (almost) every host on the
++ Eind\%hoven University network (131.155.x.x).
++ .IP \(bu
++-A string that begins with an `@\' character is treated as an NIS
+++A string that begins with an `@' character is treated as an NIS
++ (formerly YP) netgroup name. A host name is matched if it is a host
++ member of the specified netgroup. Netgroup matches are not supported
++ for daemon process names or for client user names.
++ .IP \(bu
++-An expression of the form `n.n.n.n/m.m.m.m\' is interpreted as a
++-`net/mask\' pair. A host address is matched if `net\' is equal to the
++-bitwise AND of the address and the `mask\'. For example, the net/mask
++-pattern `131.155.72.0/255.255.254.0\' matches every address in the
++-range `131.155.72.0\' through `131.155.73.255\'.
+++An expression of the form `n.n.n.n/m.m.m.m' is interpreted as a
+++`net/mask' pair. A host address is matched if `net' is equal to the
+++bitwise AND of the address and the `mask'. For example, the net/mask
+++pattern `131.155.72.0/255.255.254.0' matches every address in the
+++range `131.155.72.0' through `131.155.73.255'.
+++.IP \(bu
+++A string that begins with a `/' character is treated as a file
+++name. A host name or address is matched if it matches any host name
+++or address pattern listed in the named file. The file format is
+++zero or more lines with zero or more host name or address patterns
+++separated by whitespace. A file name pattern can be used anywhere
+++a host name or address pattern can be used.
++ .SH WILDCARDS
++ The access control language supports explicit wildcards:
++ .IP ALL
++@@ -115,19 +122,19 @@ without -DPARANOID when you want more co
++ .ne 6
++ .SH OPERATORS
++ .IP EXCEPT
++-Intended use is of the form: `list_1 EXCEPT list_2\'; this construct
+++Intended use is of the form: `list_1 EXCEPT list_2'; this construct
++ matches anything that matches \fIlist_1\fR unless it matches
++ \fIlist_2\fR. The EXCEPT operator can be used in daemon_lists and in
++ client_lists. The EXCEPT operator can be nested: if the control
++-language would permit the use of parentheses, `a EXCEPT b EXCEPT c\'
++-would parse as `(a EXCEPT (b EXCEPT c))\'.
+++language would permit the use of parentheses, `a EXCEPT b EXCEPT c'
+++would parse as `(a EXCEPT (b EXCEPT c))'.
++ .br
++ .ne 6
++ .SH SHELL COMMANDS
++ If the first-matched access control rule contains a shell command, that
++ command is subjected to %<letter> substitutions (see next section).
++ The result is executed by a \fI/bin/sh\fR child process with standard
++-input, output and error connected to \fI/dev/null\fR. Specify an `&\'
+++input, output and error connected to \fI/dev/null\fR. Specify an `&'
++ at the end of the command if you do not want to wait until it has
++ completed.
++ .PP
++@@ -159,7 +166,7 @@ depending on how much information is ava
++ .IP %u
++ The client user name (or "unknown").
++ .IP %%
++-Expands to a single `%\' character.
+++Expands to a single `%' character.
++ .PP
++ Characters in % expansions that may confuse the shell are replaced by
++ underscores.
++@@ -243,9 +250,9 @@ A positive IDENT lookup result (the clie
++ less trustworthy. It is possible for an intruder to spoof both the
++ client connection and the IDENT lookup, although doing so is much
++ harder than spoofing just a client connection. It may also be that
++-the client\'s IDENT server is lying.
+++the client's IDENT server is lying.
++ .PP
++-Note: IDENT lookups don\'t work with UDP services.
+++Note: IDENT lookups don't work with UDP services.
++ .SH EXAMPLES
++ The language is flexible enough that different types of access control
++ policy can be expressed with a minimum of fuss. Although the language
++@@ -285,7 +292,7 @@ ALL: LOCAL @some_netgroup
++ .br
++ ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
++ .PP
++-The first rule permits access from hosts in the local domain (no `.\'
+++The first rule permits access from hosts in the local domain (no `.'
++ in the host name) and from members of the \fIsome_netgroup\fP
++ netgroup. The second rule permits access from all hosts in the
++ \fIfoobar.edu\fP domain (notice the leading dot), with the exception of
++@@ -322,8 +329,8 @@ in.tftpd: LOCAL, .my.domain
++ /etc/hosts.deny:
++ .in +3
++ .nf
++-in.tftpd: ALL: (/some/where/safe_finger -l @%h | \\
++- /usr/ucb/mail -s %d-%h root) &
+++in.tftpd: ALL: (/usr/sbin/safe_finger -l @%h | \\
+++ /usr/bin/mail -s %d-%h root) &
++ .fi
++ .PP
++ The safe_finger command comes with the tcpd wrapper and should be
++@@ -349,7 +356,7 @@ control rule; when the length of an acce
++ capacity of an internal buffer; when an access control rule is not
++ terminated by a newline character; when the result of %<letter>
++ expansion would overflow an internal buffer; when a system call fails
++-that shouldn\'t. All problems are reported via the syslog daemon.
+++that shouldn't. All problems are reported via the syslog daemon.
++ .SH FILES
++ .na
++ .nf
++--- a/rfc931.c
+++++ b/rfc931.c
++@@ -33,7 +33,7 @@ static char sccsid[] = "@(#) rfc931.c 1.
++
++ int rfc931_timeout = RFC931_TIMEOUT;/* Global so it can be changed */
++
++-static jmp_buf timebuf;
+++static sigjmp_buf timebuf;
++
++ /* fsocket - open stdio stream on top of socket */
++
++@@ -62,7 +62,7 @@ int protocol;
++ static void timeout(sig)
++ int sig;
++ {
++- longjmp(timebuf, sig);
+++ siglongjmp(timebuf, sig);
++ }
++
++ /* rfc931 - return remote user name, given socket structures */
++@@ -99,7 +99,7 @@ char *dest;
++ * Set up a timer so we won't get stuck while waiting for the server.
++ */
++
++- if (setjmp(timebuf) == 0) {
+++ if (sigsetjmp(timebuf,1) == 0) {
++ signal(SIGALRM, timeout);
++ alarm(rfc931_timeout);
++
++--- a/tcpd.8
+++++ b/tcpd.8
++@@ -94,7 +94,7 @@ configuration files.
++ .PP
++ The example assumes that the network daemons live in /usr/etc. On some
++ systems, network daemons live in /usr/sbin or in /usr/libexec, or have
++-no `in.\' prefix to their name.
+++no `in.' prefix to their name.
++ .SH EXAMPLE 2
++ This example applies when \fItcpd\fR expects that the network daemons
++ are left in their original place.
++@@ -110,26 +110,26 @@ finger stream tcp nowait nobody /us
++ becomes:
++ .sp
++ .ti +5
++-finger stream tcp nowait nobody /some/where/tcpd in.fingerd
+++finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd
++ .sp
++ .fi
++ .PP
++ The example assumes that the network daemons live in /usr/etc. On some
++ systems, network daemons live in /usr/sbin or in /usr/libexec, the
++-daemons have no `in.\' prefix to their name, or there is no userid
+++daemons have no `in.' prefix to their name, or there is no userid
++ field in the inetd configuration file.
++ .PP
++ Similar changes will be needed for the other services that are to be
++-covered by \fItcpd\fR. Send a `kill -HUP\' to the \fIinetd\fR(8)
+++covered by \fItcpd\fR. Send a `kill -HUP' to the \fIinetd\fR(8)
++ process to make the changes effective. AIX users may also have to
++-execute the `inetimp\' command.
+++execute the `inetimp' command.
++ .SH EXAMPLE 3
++ In the case of daemons that do not live in a common directory ("secret"
++ or otherwise), edit the \fIinetd\fR configuration file so that it
++ specifies an absolute path name for the process name field. For example:
++ .nf
++ .sp
++- ntalk dgram udp wait root /some/where/tcpd /usr/local/lib/ntalkd
+++ ntalk dgram udp wait root /usr/sbin/tcpd /usr/sbin/in.ntalkd
++ .sp
++ .fi
++ .PP
++--- a/hosts_access.3
+++++ b/hosts_access.3
++@@ -3,7 +3,7 @@
++ hosts_access, hosts_ctl, request_init, request_set \- access control library
++ .SH SYNOPSIS
++ .nf
++-#include "tcpd.h"
+++#include <tcpd.h>
++
++ extern int allow_severity;
++ extern int deny_severity;
++--- a/options.c
+++++ b/options.c
++@@ -473,6 +473,9 @@ static struct syslog_names log_fac[] = {
++ #ifdef LOG_CRON
++ "cron", LOG_CRON,
++ #endif
+++#ifdef LOG_FTP
+++ "ftp", LOG_FTP,
+++#endif
++ #ifdef LOG_LOCAL0
++ "local0", LOG_LOCAL0,
++ #endif
++--- a/fix_options.c
+++++ b/fix_options.c
++@@ -35,7 +35,12 @@ struct request_info *request;
++ #ifdef IP_OPTIONS
++ unsigned char optbuf[BUFFER_SIZE / 3], *cp;
++ char lbuf[BUFFER_SIZE], *lp;
+++#if !defined(__GLIBC__)
++ int optsize = sizeof(optbuf), ipproto;
+++#else /* __GLIBC__ */
+++ size_t optsize = sizeof(optbuf);
+++ int ipproto;
+++#endif /* __GLIBC__ */
++ struct protoent *ip;
++ int fd = request->fd;
++ unsigned int opt;
++--- a/workarounds.c
+++++ b/workarounds.c
++@@ -163,7 +163,11 @@ int *fromlen;
++ int fix_getpeername(sock, sa, len)
++ int sock;
++ struct sockaddr *sa;
+++#if !defined(__GLIBC__)
++ int *len;
+++#else /* __GLIBC__ */
+++size_t *len;
+++#endif /* __GLIBC__ */
++ {
++ int ret;
++ struct sockaddr_in *sin = (struct sockaddr_in *) sa;
++--- a/socket.c
+++++ b/socket.c
++@@ -76,7 +76,11 @@ struct request_info *request;
++ {
++ static struct sockaddr_in client;
++ static struct sockaddr_in server;
+++#if !defined (__GLIBC__)
++ int len;
+++#else /* __GLIBC__ */
+++ size_t len;
+++#endif /* __GLIBC__ */
++ char buf[BUFSIZ];
++ int fd = request->fd;
++
++@@ -224,7 +228,11 @@ int fd;
++ {
++ char buf[BUFSIZ];
++ struct sockaddr_in sin;
+++#if !defined(__GLIBC__)
++ int size = sizeof(sin);
+++#else /* __GLIBC__ */
+++ size_t size = sizeof(sin);
+++#endif /* __GLIBC__ */
++
++ /*
++ * Eat up the not-yet received datagram. Some systems insist on a
++--- a/safe_finger.c
+++++ b/safe_finger.c
++@@ -26,21 +26,24 @@ static char sccsid[] = "@(#) safe_finger
++ #include <stdio.h>
++ #include <ctype.h>
++ #include <pwd.h>
+++#include <syslog.h>
++
++ extern void exit();
++
++ /* Local stuff */
++
++-char path[] = "PATH=/bin:/usr/bin:/usr/ucb:/usr/bsd:/etc:/usr/etc:/usr/sbin";
+++char path[] = "PATH=/bin:/usr/bin:/sbin:/usr/sbin";
++
++ #define TIME_LIMIT 60 /* Do not keep listinging forever */
++ #define INPUT_LENGTH 100000 /* Do not keep listinging forever */
++ #define LINE_LENGTH 128 /* Editors can choke on long lines */
++ #define FINGER_PROGRAM "finger" /* Most, if not all, UNIX systems */
++ #define UNPRIV_NAME "nobody" /* Preferred privilege level */
++-#define UNPRIV_UGID 32767 /* Default uid and gid */
+++#define UNPRIV_UGID 65534 /* Default uid and gid */
++
++ int finger_pid;
+++int allow_severity = SEVERITY;
+++int deny_severity = LOG_WARNING;
++
++ void cleanup(sig)
++ int sig;
++--- a/hosts_options.5
+++++ b/hosts_options.5
++@@ -58,12 +58,12 @@ Notice the leading dot on the domain nam
++ Execute, in a child process, the specified shell command, after
++ performing the %<letter> expansions described in the hosts_access(5)
++ manual page. The command is executed with stdin, stdout and stderr
++-connected to the null device, so that it won\'t mess up the
+++connected to the null device, so that it won't mess up the
++ conversation with the client host. Example:
++ .sp
++ .nf
++ .ti +3
++-spawn (/some/where/safe_finger -l @%h | /usr/ucb/mail root) &
+++spawn (/usr/sbin/safe_finger -l @%h | /usr/bin/mail root) &
++ .fi
++ .sp
++ executes, in a background child process, the shell command "safe_finger
++--- a/tcpdchk.c
+++++ b/tcpdchk.c
++@@ -350,6 +350,8 @@ char *pat;
++ {
++ if (pat[0] == '@') {
++ tcpd_warn("%s: daemon name begins with \"@\"", pat);
+++ } else if (pat[0] == '/') {
+++ tcpd_warn("%s: daemon name begins with \"/\"", pat);
++ } else if (pat[0] == '.') {
++ tcpd_warn("%s: daemon name begins with dot", pat);
++ } else if (pat[strlen(pat) - 1] == '.') {
++@@ -382,6 +384,8 @@ char *pat;
++ {
++ if (pat[0] == '@') { /* @netgroup */
++ tcpd_warn("%s: user name begins with \"@\"", pat);
+++ } else if (pat[0] == '/') {
+++ tcpd_warn("%s: user name begins with \"/\"", pat);
++ } else if (pat[0] == '.') {
++ tcpd_warn("%s: user name begins with dot", pat);
++ } else if (pat[strlen(pat) - 1] == '.') {
++@@ -402,8 +406,13 @@ char *pat;
++ static int check_host(pat)
++ char *pat;
++ {
+++ char buf[BUFSIZ];
++ char *mask;
++ int addr_count = 1;
+++ FILE *fp;
+++ struct tcpd_context saved_context;
+++ char *cp;
+++ char *wsp = " \t\r\n";
++
++ if (pat[0] == '@') { /* @netgroup */
++ #ifdef NO_NETGRENT
++@@ -422,6 +431,21 @@ char *pat;
++ tcpd_warn("netgroup support disabled");
++ #endif
++ #endif
+++ } else if (pat[0] == '/') { /* /path/name */
+++ if ((fp = fopen(pat, "r")) != 0) {
+++ saved_context = tcpd_context;
+++ tcpd_context.file = pat;
+++ tcpd_context.line = 0;
+++ while (fgets(buf, sizeof(buf), fp)) {
+++ tcpd_context.line++;
+++ for (cp = strtok(buf, wsp); cp; cp = strtok((char *) 0, wsp))
+++ check_host(cp);
+++ }
+++ tcpd_context = saved_context;
+++ fclose(fp);
+++ } else if (errno != ENOENT) {
+++ tcpd_warn("open %s: %m", pat);
+++ }
++ } else if (mask = split_at(pat, '/')) { /* network/netmask */
++ if (dot_quad_addr(pat) == INADDR_NONE
++ || dot_quad_addr(mask) == INADDR_NONE)
++--- a/percent_m.c
+++++ b/percent_m.c
++@@ -13,7 +13,7 @@ static char sccsid[] = "@(#) percent_m.c
++ #include <string.h>
++
++ extern int errno;
++-#ifndef SYS_ERRLIST_DEFINED
+++#if !defined(SYS_ERRLIST_DEFINED) && !defined(HAVE_STRERROR)
++ extern char *sys_errlist[];
++ extern int sys_nerr;
++ #endif
++@@ -29,11 +29,15 @@ char *ibuf;
++
++ while (*bp = *cp)
++ if (*cp == '%' && cp[1] == 'm') {
+++#ifdef HAVE_STRERROR
+++ strcpy(bp, strerror(errno));
+++#else
++ if (errno < sys_nerr && errno > 0) {
++ strcpy(bp, sys_errlist[errno]);
++ } else {
++ sprintf(bp, "Unknown error %d", errno);
++ }
+++#endif
++ bp += strlen(bp);
++ cp += 2;
++ } else {
++--- a/scaffold.c
+++++ b/scaffold.c
++@@ -180,10 +180,12 @@ struct request_info *request;
++
++ /* ARGSUSED */
++
++-void rfc931(request)
++-struct request_info *request;
+++void rfc931(rmt_sin, our_sin, dest)
+++struct sockaddr_in *rmt_sin;
+++struct sockaddr_in *our_sin;
+++char *dest;
++ {
++- strcpy(request->user, unknown);
+++ strcpy(dest, unknown);
++ }
++
++ /* check_path - examine accessibility */
++--- /dev/null
+++++ b/weak_symbols.c
++@@ -0,0 +1,11 @@
+++ /*
+++ * @(#) weak_symbols.h 1.5 99/12/29 23:50
+++ *
+++ * Author: Anthony Towns <ajt@debian.org>
+++ */
+++
+++#ifdef HAVE_WEAKSYMS
+++#include <syslog.h>
+++int deny_severity = LOG_WARNING;
+++int allow_severity = SEVERITY;
+++#endif
+diff --git a/feeds/packages/libs/tcp_wrappers/patches/002-opt_cflags.patch b/feeds/packages/libs/tcp_wrappers/patches/002-opt_cflags.patch
+new file mode 100644
+index 0000000..1f38eb3
+--- /dev/null
++++ b/feeds/packages/libs/tcp_wrappers/patches/002-opt_cflags.patch
+@@ -0,0 +1,12 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -689,7 +689,8 @@ SHLIBFLAGS = -Lshared -lwrap
++ shared/%.o: %.c
++ $(CC) $(CFLAGS) $(SHCFLAGS) -c $< -o $@
++
++-CFLAGS = -O2 -g -DFACILITY=$(FACILITY) $(ACCESS) $(PARANOID) $(NETGROUP) \
+++OPT_CFLAGS = -O2 -g
+++CFLAGS = $(OPT_CFLAGS) -DFACILITY=$(FACILITY) $(ACCESS) $(PARANOID) $(NETGROUP) \
++ $(BUGS) $(SYSTYPE) $(AUTH) $(UMASK) \
++ -DREAL_DAEMON_DIR=\"$(REAL_DAEMON_DIR)\" $(STYLE) $(KILL_OPT) \
++ -DSEVERITY=$(SEVERITY) -DRFC931_TIMEOUT=$(RFC931_TIMEOUT) \
+diff --git a/feeds/packages/libs/tcp_wrappers/patches/003-scaffold_malloc.patch b/feeds/packages/libs/tcp_wrappers/patches/003-scaffold_malloc.patch
+new file mode 100644
+index 0000000..ecda5ae
+--- /dev/null
++++ b/feeds/packages/libs/tcp_wrappers/patches/003-scaffold_malloc.patch
+@@ -0,0 +1,17 @@
++--- a/scaffold.c
+++++ b/scaffold.c
++@@ -20,13 +20,12 @@ static char sccs_id[] = "@(#) scaffold.c
++ #include <syslog.h>
++ #include <setjmp.h>
++ #include <string.h>
+++#include <stdlib.h>
++
++ #ifndef INADDR_NONE
++ #define INADDR_NONE (-1) /* XXX should be 0xffffffff */
++ #endif
++
++-extern char *malloc();
++-
++ /* Application-specific. */
++
++ #include "tcpd.h"
+diff --git a/feeds/packages/libs/tcp_wrappers/patches/004-ipv4_prefix.patch b/feeds/packages/libs/tcp_wrappers/patches/004-ipv4_prefix.patch
+new file mode 100644
+index 0000000..29c9cef
+--- /dev/null
++++ b/feeds/packages/libs/tcp_wrappers/patches/004-ipv4_prefix.patch
+@@ -0,0 +1,72 @@
++--- a/hosts_access.5
+++++ b/hosts_access.5
++@@ -90,6 +90,9 @@ bitwise AND of the address and the `mask
++ pattern `131.155.72.0/255.255.254.0' matches every address in the
++ range `131.155.72.0' through `131.155.73.255'.
++ .IP \(bu
+++An expression of the form `n.n.n.n/m\' is interpreted as a
+++`net/prefixlen\' pair, as below, for IPv4 addresses.
+++.IP \(bu
++ A string that begins with a `/' character is treated as a file
++ name. A host name or address is matched if it matches any host name
++ or address pattern listed in the named file. The file format is
++--- a/tcpd.h
+++++ b/tcpd.h
++@@ -93,6 +93,7 @@ extern void refuse __P((struct request_i
++ extern char *xgets __P((char *, int, FILE *)); /* fgets() on steroids */
++ extern char *split_at __P((char *, int)); /* strchr() and split */
++ extern unsigned long dot_quad_addr __P((char *)); /* restricted inet_addr() */
+++extern unsigned long prefix_to_netmask __P((char *)); /* 0-32 prefix length */
++
++ /* Global variables. */
++
++--- a/misc.c
+++++ b/misc.c
++@@ -14,6 +14,8 @@ static char sccsic[] = "@(#) misc.c 1.2
++ #include <arpa/inet.h>
++ #include <stdio.h>
++ #include <string.h>
+++#include <ctype.h>
+++#include <stdlib.h>
++
++ #include "tcpd.h"
++
++@@ -85,3 +87,22 @@ char *str;
++ }
++ return (runs == 4 ? inet_addr(str) : INADDR_NONE);
++ }
+++
+++/* prefix_to_netmask - convert prefix (0-32) to netmask */
+++
+++unsigned long prefix_to_netmask(str)
+++char *str;
+++{
+++ unsigned long prefix;
+++ char *endptr;
+++
+++ if (!isdigit(str[0]))
+++ return INADDR_NONE;
+++
+++ prefix = strtoul(str, &endptr, 10);
+++ if ((endptr == str) || (*endptr != '\0') || (prefix > 32))
+++ return INADDR_NONE;
+++
+++ return htonl(~0UL << (32 - prefix));
+++}
+++
++--- a/hosts_access.c
+++++ b/hosts_access.c
++@@ -345,7 +345,12 @@ char *string;
++ if ((addr = dot_quad_addr(string)) == INADDR_NONE)
++ return (NO);
++ if ((net = dot_quad_addr(net_tok)) == INADDR_NONE
++- || (mask = dot_quad_addr(mask_tok)) == INADDR_NONE) {
+++ || ((mask = dot_quad_addr(mask_tok)) == INADDR_NONE
+++ && strcmp(mask_tok, "255.255.255.255")
+++ && (mask = prefix_to_netmask(mask_tok)) == INADDR_NONE
+++ && strcmp(mask_tok, "32"))) {
+++ /* 255.255.255.255 == INADDR_NONE, separate check needed. TJ. */
+++ /* 32 == INADDR_NONE, separate check needed. philipp */
++ tcpd_warn("bad net/mask expression: %s/%s", net_tok, mask_tok);
++ return (NO); /* not tcpd_jump() */
++ }
+diff --git a/feeds/packages/libs/tcp_wrappers/patches/005-no--lnsl-on-musl.patch b/feeds/packages/libs/tcp_wrappers/patches/005-no--lnsl-on-musl.patch
+new file mode 100644
+index 0000000..5e7b968
+--- /dev/null
++++ b/feeds/packages/libs/tcp_wrappers/patches/005-no--lnsl-on-musl.patch
+@@ -0,0 +1,22 @@
++Index: tcp_wrappers_7.6/Makefile
++===================================================================
++--- tcp_wrappers_7.6.orig/Makefile
+++++ tcp_wrappers_7.6/Makefile
++@@ -1,4 +1,4 @@
++-GLIBC=$(shell grep -s -c __GLIBC__ /usr/include/features.h)
+++GLIBC=$(shell grep -s -c __GLIBC__ ${STAGING_DIR}/usr/include/features.h)
++
++ # @(#) Makefile 1.23 97/03/21 19:27:20
++
++@@ -146,9 +146,11 @@ freebsd:
++ LIBS= RANLIB=ranlib ARFLAGS=rv AUX_OBJ= NETGROUP= TLI= \
++ EXTRA_CFLAGS=-DSYS_ERRLIST_DEFINED VSYSLOG= all
++
+++ifneq ($(GLIBC),)
++ ifneq ($(GLIBC),0)
++ MYLIB=-lnsl
++ endif
+++endif
++
++ linux:
++ @make REAL_DAEMON_DIR=$(REAL_DAEMON_DIR) STYLE=$(STYLE) \
+diff --git a/feeds/packages/libs/tdb/Makefile b/feeds/packages/libs/tdb/Makefile
+new file mode 100644
+index 0000000..2fce3dc
+--- /dev/null
++++ b/feeds/packages/libs/tdb/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tdb
++PKG_VERSION:=1.0.6
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/tdb
++PKG_MD5SUM:=6b643fdeb48304010dcd5f675e458b58
++
++PKG_INSTALL:=1
++PKG_BUILD_DEPENDS:=+libgdbm
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tdb
++ SUBMENU:=database
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Trivial Database
++ URL:=http://sourceforge.net/projects/tdb/
++ MAINTAINER:=Dmitry V. Zimin <pfzim@mail.ru>
++# DEPENDS:=+libgdbm
++endef
++
++define Package/tdb/description
++ TDB is a Trivial Database. In concept, it is very much like GDBM,
++ and BSD's DB except that it allows multiple simultaneous writers
++ and uses locking internally to keep writers from trampling on
++ each other. TDB is also extremely small.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/tdb.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/
++endef
++
++define Package/tdb/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,tdb))
++
+diff --git a/feeds/packages/libs/tdb/patches/001-printf-fix.patch b/feeds/packages/libs/tdb/patches/001-printf-fix.patch
+new file mode 100644
+index 0000000..f88d942
+--- /dev/null
++++ b/feeds/packages/libs/tdb/patches/001-printf-fix.patch
+@@ -0,0 +1,41 @@
++--- a/tdbtool.c 2001-12-11 06:45:47.000000000 +0300
+++++ b/tdbtool.c 2014-11-14 15:14:00.401164300 +0300
++@@ -169,23 +169,21 @@ static void print_data(unsigned char *bu
++
++ static void help(void)
++ {
++- printf("
++-tdbtool:
++- create dbname : create a database
++- open dbname : open an existing database
++- erase : erase the database
++- dump dumpname : dump the database as strings
++- insert key data : insert a record
++- store key data : store a record (replace)
++- show key : show a record by key
++- delete key : delete a record by key
++- list : print the database hash table and freelist
++- free : print the database freelist
++- 1 | first : print the first record
++- n | next : print the next record
++- q | quit : terminate
++- \\n : repeat 'next' command
++-");
+++ printf("tdbtool:\n");
+++ printf(" create dbname : create a database\n");
+++ printf(" open dbname : open an existing database\n");
+++ printf(" erase : erase the database\n");
+++ printf(" dump dumpname : dump the database as strings\n");
+++ printf(" insert key data : insert a record\n");
+++ printf(" store key data : store a record (replace)\n");
+++ printf(" show key : show a record by key\n");
+++ printf(" delete key : delete a record by key\n");
+++ printf(" list : print the database hash table and freelist\n");
+++ printf(" free : print the database freelist\n");
+++ printf(" 1 | first : print the first record\n");
+++ printf(" n | next : print the next record\n");
+++ printf(" q | quit : terminate\n");
+++ printf(" \\n : repeat 'next' command\n\n");
++ }
++
++ static void terror(char *why)
+diff --git a/feeds/packages/libs/tiff/Makefile b/feeds/packages/libs/tiff/Makefile
+new file mode 100644
+index 0000000..bccab8b
+--- /dev/null
++++ b/feeds/packages/libs/tiff/Makefile
+@@ -0,0 +1,108 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tiff
++PKG_VERSION:=4.0.3
++PKG_RELEASE:=4
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://download.osgeo.org/libtiff
++PKG_MD5SUM:=051c1068e6a0627f461948c365290410
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=autogen.sh aclocal.m4
++
++PKG_LICENSE:=BSD
++PKG_LICENSE_FILES:=COPYRIGHT
++
++PKG_INSTALL:=1
++
++PKG_CONFIG_DEPENDS:=CONFIG_PACKAGE_libtiffxx
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tiff/Default
++ TITLE:=TIFF
++ URL:=http://www.remotesensing.org/libtiff/
++ MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++endef
++
++define Package/libtiff
++$(call Package/tiff/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= library
++ DEPENDS:=+zlib +libjpeg
++endef
++
++define Package/libtiffxx
++$(call Package/tiff/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= library(c++ bindings)
++ DEPENDS:=+libtiff $(CXX_DEPENDS)
++endef
++
++define Package/tiff-utils
++$(call Package/tiff/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= utilities
++ DEPENDS:=+libtiff
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ $(if $(CONFIG_PACKAGE_libtiffxx), \
++ --enable-cxx, \
++ --disable-cxx \
++ ) \
++ --disable-lzma \
++ --enable-ccitt \
++ --enable-packbits \
++ --enable-lzw \
++ --enable-thunder \
++ --enable-next \
++ --enable-logluv \
++ --enable-mdi \
++ --enable-zlib \
++ --enable-jpeg \
++ --disable-old-jpeg \
++ --disable-jbig \
++ --without-x \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/{lib,include}
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++endef
++
++define Package/libtiff/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libtiff.so.* $(1)/usr/lib/
++endef
++
++define Package/libtiffxx/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libtiffxx.so.* $(1)/usr/lib/
++endef
++
++define Package/tiff-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libtiff))
++$(eval $(call BuildPackage,libtiffxx))
++$(eval $(call BuildPackage,tiff-utils))
+diff --git a/feeds/packages/libs/tiff/patches/001-autoconf-compat.patch b/feeds/packages/libs/tiff/patches/001-autoconf-compat.patch
+new file mode 100644
+index 0000000..c7c0dfc
+--- /dev/null
++++ b/feeds/packages/libs/tiff/patches/001-autoconf-compat.patch
+@@ -0,0 +1,31 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -25,7 +25,7 @@
++
++ docdir = $(LIBTIFF_DOCDIR)
++
++-AUTOMAKE_OPTIONS = 1.12 dist-zip foreign
+++AUTOMAKE_OPTIONS = dist-zip foreign
++ ACLOCAL_AMFLAGS = -I m4
++
++ docfiles = \
++@@ -48,7 +48,7 @@ EXTRA_DIST = \
++
++ dist_doc_DATA = $(docfiles)
++
++-SUBDIRS = port libtiff tools build contrib test man html
+++SUBDIRS = port libtiff tools build contrib
++
++ release:
++ (rm -f $(top_srcdir)/RELEASE-DATE && echo $(LIBTIFF_RELEASE_DATE) > $(top_srcdir)/RELEASE-DATE)
++--- a/test/Makefile.am
+++++ b/test/Makefile.am
++@@ -23,7 +23,7 @@
++
++ # Process this file with automake to produce Makefile.in.
++
++-AUTOMAKE_OPTIONS = 1.12 color-tests parallel-tests foreign
+++AUTOMAKE_OPTIONS = color-tests parallel-tests foreign
++
++ LIBTIFF = $(top_builddir)/libtiff/libtiff.la
++
+diff --git a/feeds/packages/libs/tiff/patches/010-CVE-2012-4564.patch b/feeds/packages/libs/tiff/patches/010-CVE-2012-4564.patch
+new file mode 100644
+index 0000000..7783353
+--- /dev/null
++++ b/feeds/packages/libs/tiff/patches/010-CVE-2012-4564.patch
+@@ -0,0 +1,31 @@
++Index: tiff-4.0.3/tools/ppm2tiff.c
++===================================================================
++--- tiff-4.0.3.orig/tools/ppm2tiff.c 2013-06-23 10:36:50.779629492 -0400
+++++ tiff-4.0.3/tools/ppm2tiff.c 2013-06-23 10:36:50.775629494 -0400
++@@ -89,6 +89,7 @@
++ int c;
++ extern int optind;
++ extern char* optarg;
+++ tmsize_t scanline_size;
++
++ if (argc < 2) {
++ fprintf(stderr, "%s: Too few arguments\n", argv[0]);
++@@ -237,8 +238,16 @@
++ }
++ if (TIFFScanlineSize(out) > linebytes)
++ buf = (unsigned char *)_TIFFmalloc(linebytes);
++- else
++- buf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(out));
+++ else {
+++ scanline_size = TIFFScanlineSize(out);
+++ if (scanline_size != 0)
+++ buf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(out));
+++ else {
+++ fprintf(stderr, "%s: scanline size overflow\n",infile);
+++ (void) TIFFClose(out);
+++ exit(-2);
+++ }
+++ }
++ if (resolution > 0) {
++ TIFFSetField(out, TIFFTAG_XRESOLUTION, resolution);
++ TIFFSetField(out, TIFFTAG_YRESOLUTION, resolution);
+diff --git a/feeds/packages/libs/tiff/patches/011-CVE-2013-1960.patch b/feeds/packages/libs/tiff/patches/011-CVE-2013-1960.patch
+new file mode 100644
+index 0000000..3bf15f1
+--- /dev/null
++++ b/feeds/packages/libs/tiff/patches/011-CVE-2013-1960.patch
+@@ -0,0 +1,146 @@
++Index: tiff-4.0.3/tools/tiff2pdf.c
++===================================================================
++--- tiff-4.0.3.orig/tools/tiff2pdf.c 2013-06-23 10:36:50.979629486 -0400
+++++ tiff-4.0.3/tools/tiff2pdf.c 2013-06-23 10:36:50.975629486 -0400
++@@ -3341,33 +3341,56 @@
++ uint32 height){
++
++ tsize_t i=0;
++- uint16 ri =0;
++- uint16 v_samp=1;
++- uint16 h_samp=1;
++- int j=0;
++-
++- i++;
++-
++- while(i<(*striplength)){
+++
+++ while (i < *striplength) {
+++ tsize_t datalen;
+++ uint16 ri;
+++ uint16 v_samp;
+++ uint16 h_samp;
+++ int j;
+++ int ncomp;
+++
+++ /* marker header: one or more FFs */
+++ if (strip[i] != 0xff)
+++ return(0);
+++ i++;
+++ while (i < *striplength && strip[i] == 0xff)
+++ i++;
+++ if (i >= *striplength)
+++ return(0);
+++ /* SOI is the only pre-SOS marker without a length word */
+++ if (strip[i] == 0xd8)
+++ datalen = 0;
+++ else {
+++ if ((*striplength - i) <= 2)
+++ return(0);
+++ datalen = (strip[i+1] << 8) | strip[i+2];
+++ if (datalen < 2 || datalen >= (*striplength - i))
+++ return(0);
+++ }
++ switch( strip[i] ){
++- case 0xd8:
++- /* SOI - start of image */
+++ case 0xd8: /* SOI - start of image */
++ _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), 2);
++ *bufferoffset+=2;
++- i+=2;
++ break;
++- case 0xc0:
++- case 0xc1:
++- case 0xc3:
++- case 0xc9:
++- case 0xca:
+++ case 0xc0: /* SOF0 */
+++ case 0xc1: /* SOF1 */
+++ case 0xc3: /* SOF3 */
+++ case 0xc9: /* SOF9 */
+++ case 0xca: /* SOF10 */
++ if(no==0){
++- _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
++- for(j=0;j<buffer[*bufferoffset+9];j++){
++- if( (buffer[*bufferoffset+11+(2*j)]>>4) > h_samp)
++- h_samp = (buffer[*bufferoffset+11+(2*j)]>>4);
++- if( (buffer[*bufferoffset+11+(2*j)] & 0x0f) > v_samp)
++- v_samp = (buffer[*bufferoffset+11+(2*j)] & 0x0f);
+++ _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), datalen+2);
+++ ncomp = buffer[*bufferoffset+9];
+++ if (ncomp < 1 || ncomp > 4)
+++ return(0);
+++ v_samp=1;
+++ h_samp=1;
+++ for(j=0;j<ncomp;j++){
+++ uint16 samp = buffer[*bufferoffset+11+(3*j)];
+++ if( (samp>>4) > h_samp)
+++ h_samp = (samp>>4);
+++ if( (samp & 0x0f) > v_samp)
+++ v_samp = (samp & 0x0f);
++ }
++ v_samp*=8;
++ h_samp*=8;
++@@ -3381,45 +3404,43 @@
++ (unsigned char) ((height>>8) & 0xff);
++ buffer[*bufferoffset+6]=
++ (unsigned char) (height & 0xff);
++- *bufferoffset+=strip[i+2]+2;
++- i+=strip[i+2]+2;
++-
+++ *bufferoffset+=datalen+2;
+++ /* insert a DRI marker */
++ buffer[(*bufferoffset)++]=0xff;
++ buffer[(*bufferoffset)++]=0xdd;
++ buffer[(*bufferoffset)++]=0x00;
++ buffer[(*bufferoffset)++]=0x04;
++ buffer[(*bufferoffset)++]=(ri >> 8) & 0xff;
++ buffer[(*bufferoffset)++]= ri & 0xff;
++- } else {
++- i+=strip[i+2]+2;
++ }
++ break;
++- case 0xc4:
++- case 0xdb:
++- _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
++- *bufferoffset+=strip[i+2]+2;
++- i+=strip[i+2]+2;
+++ case 0xc4: /* DHT */
+++ case 0xdb: /* DQT */
+++ _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), datalen+2);
+++ *bufferoffset+=datalen+2;
++ break;
++- case 0xda:
+++ case 0xda: /* SOS */
++ if(no==0){
++- _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
++- *bufferoffset+=strip[i+2]+2;
++- i+=strip[i+2]+2;
+++ _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), datalen+2);
+++ *bufferoffset+=datalen+2;
++ } else {
++ buffer[(*bufferoffset)++]=0xff;
++ buffer[(*bufferoffset)++]=
++ (unsigned char)(0xd0 | ((no-1)%8));
++- i+=strip[i+2]+2;
++ }
++- _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), (*striplength)-i-1);
++- *bufferoffset+=(*striplength)-i-1;
+++ i += datalen + 1;
+++ /* copy remainder of strip */
+++ _TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i]), *striplength - i);
+++ *bufferoffset+= *striplength - i;
++ return(1);
++ default:
++- i+=strip[i+2]+2;
+++ /* ignore any other marker */
+++ break;
++ }
+++ i += datalen + 1;
++ }
++-
++
+++ /* failed to find SOS marker */
++ return(0);
++ }
++ #endif
+diff --git a/feeds/packages/libs/tiff/patches/012-CVE-2013-1961.patch b/feeds/packages/libs/tiff/patches/012-CVE-2013-1961.patch
+new file mode 100644
+index 0000000..2d1268e
+--- /dev/null
++++ b/feeds/packages/libs/tiff/patches/012-CVE-2013-1961.patch
+@@ -0,0 +1,768 @@
++Index: tiff-4.0.3/contrib/dbs/xtiff/xtiff.c
++===================================================================
++--- tiff-4.0.3.orig/contrib/dbs/xtiff/xtiff.c 2013-06-23 10:36:51.163629483 -0400
+++++ tiff-4.0.3/contrib/dbs/xtiff/xtiff.c 2013-06-23 10:36:51.147629484 -0400
++@@ -512,9 +512,9 @@
++ Arg args[1];
++
++ if (tfMultiPage)
++- sprintf(buffer, "%s - page %d", fileName, tfDirectory);
+++ snprintf(buffer, sizeof(buffer), "%s - page %d", fileName, tfDirectory);
++ else
++- strcpy(buffer, fileName);
+++ snprintf(buffer, sizeof(buffer), "%s", fileName);
++ XtSetArg(args[0], XtNlabel, buffer);
++ XtSetValues(labelWidget, args, 1);
++ }
++Index: tiff-4.0.3/libtiff/tif_dirinfo.c
++===================================================================
++--- tiff-4.0.3.orig/libtiff/tif_dirinfo.c 2013-06-23 10:36:51.163629483 -0400
+++++ tiff-4.0.3/libtiff/tif_dirinfo.c 2013-06-23 10:36:51.147629484 -0400
++@@ -711,7 +711,7 @@
++ * note that this name is a special sign to TIFFClose() and
++ * _TIFFSetupFields() to free the field
++ */
++- sprintf(fld->field_name, "Tag %d", (int) tag);
+++ snprintf(fld->field_name, 32, "Tag %d", (int) tag);
++
++ return fld;
++ }
++Index: tiff-4.0.3/libtiff/tif_codec.c
++===================================================================
++--- tiff-4.0.3.orig/libtiff/tif_codec.c 2013-06-23 10:36:51.163629483 -0400
+++++ tiff-4.0.3/libtiff/tif_codec.c 2013-06-23 10:36:51.151629482 -0400
++@@ -108,7 +108,8 @@
++ const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
++ char compression_code[20];
++
++- sprintf( compression_code, "%d", tif->tif_dir.td_compression );
+++ snprintf(compression_code, sizeof(compression_code), "%d",
+++ tif->tif_dir.td_compression );
++ TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
++ "%s compression support is not configured",
++ c ? c->name : compression_code );
++Index: tiff-4.0.3/tools/tiffdither.c
++===================================================================
++--- tiff-4.0.3.orig/tools/tiffdither.c 2013-06-23 10:36:51.163629483 -0400
+++++ tiff-4.0.3/tools/tiffdither.c 2013-06-23 10:36:51.151629482 -0400
++@@ -260,7 +260,7 @@
++ TIFFSetField(out, TIFFTAG_FILLORDER, fillorder);
++ else
++ CopyField(TIFFTAG_FILLORDER, shortv);
++- sprintf(thing, "Dithered B&W version of %s", argv[optind]);
+++ snprintf(thing, sizeof(thing), "Dithered B&W version of %s", argv[optind]);
++ TIFFSetField(out, TIFFTAG_IMAGEDESCRIPTION, thing);
++ CopyField(TIFFTAG_PHOTOMETRIC, shortv);
++ CopyField(TIFFTAG_ORIENTATION, shortv);
++Index: tiff-4.0.3/tools/rgb2ycbcr.c
++===================================================================
++--- tiff-4.0.3.orig/tools/rgb2ycbcr.c 2013-06-23 10:36:51.163629483 -0400
+++++ tiff-4.0.3/tools/rgb2ycbcr.c 2013-06-23 10:36:51.151629482 -0400
++@@ -332,7 +332,8 @@
++ TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
++ { char buf[2048];
++ char *cp = strrchr(TIFFFileName(in), '/');
++- sprintf(buf, "YCbCr conversion of %s", cp ? cp+1 : TIFFFileName(in));
+++ snprintf(buf, sizeof(buf), "YCbCr conversion of %s",
+++ cp ? cp+1 : TIFFFileName(in));
++ TIFFSetField(out, TIFFTAG_IMAGEDESCRIPTION, buf);
++ }
++ TIFFSetField(out, TIFFTAG_SOFTWARE, TIFFGetVersion());
++Index: tiff-4.0.3/tools/tiff2pdf.c
++===================================================================
++--- tiff-4.0.3.orig/tools/tiff2pdf.c 2013-06-23 10:36:51.163629483 -0400
+++++ tiff-4.0.3/tools/tiff2pdf.c 2013-06-23 10:36:51.151629482 -0400
++@@ -3630,7 +3630,9 @@
++ char buffer[16];
++ int buflen=0;
++
++- buflen=sprintf(buffer, "%%PDF-%u.%u ", t2p->pdf_majorversion&0xff, t2p->pdf_minorversion&0xff);
+++ buflen = snprintf(buffer, sizeof(buffer), "%%PDF-%u.%u ",
+++ t2p->pdf_majorversion&0xff,
+++ t2p->pdf_minorversion&0xff);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t)"\n%\342\343\317\323\n", 7);
++
++@@ -3644,10 +3646,10 @@
++ tsize_t t2p_write_pdf_obj_start(uint32 number, TIFF* output){
++
++ tsize_t written=0;
++- char buffer[16];
+++ char buffer[32];
++ int buflen=0;
++
++- buflen=sprintf(buffer, "%lu", (unsigned long)number);
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)number);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen );
++ written += t2pWriteFile(output, (tdata_t) " 0 obj\n", 7);
++
++@@ -3686,13 +3688,13 @@
++ written += t2pWriteFile(output, (tdata_t) "/", 1);
++ for (i=0;i<namelen;i++){
++ if ( ((unsigned char)name[i]) < 0x21){
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ nextchar=1;
++ }
++ if ( ((unsigned char)name[i]) > 0x7E){
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ nextchar=1;
++@@ -3700,57 +3702,57 @@
++ if (nextchar==0){
++ switch (name[i]){
++ case 0x23:
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ break;
++ case 0x25:
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ break;
++ case 0x28:
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ break;
++ case 0x29:
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ break;
++ case 0x2F:
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ break;
++ case 0x3C:
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ break;
++ case 0x3E:
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ break;
++ case 0x5B:
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ break;
++ case 0x5D:
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ break;
++ case 0x7B:
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ break;
++ case 0x7D:
++- sprintf(buffer, "#%.2X", name[i]);
+++ snprintf(buffer, sizeof(buffer), "#%.2X", name[i]);
++ buffer[sizeof(buffer) - 1] = '\0';
++ written += t2pWriteFile(output, (tdata_t) buffer, 3);
++ break;
++@@ -3865,14 +3867,14 @@
++ tsize_t t2p_write_pdf_stream_dict(tsize_t len, uint32 number, TIFF* output){
++
++ tsize_t written=0;
++- char buffer[16];
+++ char buffer[32];
++ int buflen=0;
++
++ written += t2pWriteFile(output, (tdata_t) "/Length ", 8);
++ if(len!=0){
++ written += t2p_write_pdf_stream_length(len, output);
++ } else {
++- buflen=sprintf(buffer, "%lu", (unsigned long)number);
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)number);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
++ }
++@@ -3913,10 +3915,10 @@
++ tsize_t t2p_write_pdf_stream_length(tsize_t len, TIFF* output){
++
++ tsize_t written=0;
++- char buffer[16];
+++ char buffer[32];
++ int buflen=0;
++
++- buflen=sprintf(buffer, "%lu", (unsigned long)len);
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)len);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) "\n", 1);
++
++@@ -3930,7 +3932,7 @@
++ tsize_t t2p_write_pdf_catalog(T2P* t2p, TIFF* output)
++ {
++ tsize_t written = 0;
++- char buffer[16];
+++ char buffer[32];
++ int buflen = 0;
++
++ written += t2pWriteFile(output,
++@@ -3969,7 +3971,6 @@
++ written += t2p_write_pdf_string(t2p->pdf_datetime, output);
++ }
++ written += t2pWriteFile(output, (tdata_t) "\n/Producer ", 11);
++- _TIFFmemset((tdata_t)buffer, 0x00, sizeof(buffer));
++ snprintf(buffer, sizeof(buffer), "libtiff / tiff2pdf - %d", TIFFLIB_VERSION);
++ written += t2p_write_pdf_string(buffer, output);
++ written += t2pWriteFile(output, (tdata_t) "\n", 1);
++@@ -4110,7 +4111,7 @@
++ {
++ tsize_t written=0;
++ tdir_t i=0;
++- char buffer[16];
+++ char buffer[32];
++ int buflen=0;
++
++ int page=0;
++@@ -4118,7 +4119,7 @@
++ (tdata_t) "<< \n/Type /Pages \n/Kids [ ", 26);
++ page = t2p->pdf_pages+1;
++ for (i=0;i<t2p->tiff_pagecount;i++){
++- buflen=sprintf(buffer, "%d", page);
+++ buflen=snprintf(buffer, sizeof(buffer), "%d", page);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
++ if ( ((i+1)%8)==0 ) {
++@@ -4133,8 +4134,7 @@
++ }
++ }
++ written += t2pWriteFile(output, (tdata_t) "] \n/Count ", 10);
++- _TIFFmemset(buffer, 0x00, 16);
++- buflen=sprintf(buffer, "%d", t2p->tiff_pagecount);
+++ buflen=snprintf(buffer, sizeof(buffer), "%d", t2p->tiff_pagecount);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " \n>> \n", 6);
++
++@@ -4149,28 +4149,28 @@
++
++ unsigned int i=0;
++ tsize_t written=0;
++- char buffer[16];
+++ char buffer[256];
++ int buflen=0;
++
++ written += t2pWriteFile(output, (tdata_t) "<<\n/Type /Page \n/Parent ", 24);
++- buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_pages);
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_pages);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
++ written += t2pWriteFile(output, (tdata_t) "/MediaBox [", 11);
++- buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.x1);
+++ buflen=snprintf(buffer, sizeof(buffer), "%.4f",t2p->pdf_mediabox.x1);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " ", 1);
++- buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.y1);
+++ buflen=snprintf(buffer, sizeof(buffer), "%.4f",t2p->pdf_mediabox.y1);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " ", 1);
++- buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.x2);
+++ buflen=snprintf(buffer, sizeof(buffer), "%.4f",t2p->pdf_mediabox.x2);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " ", 1);
++- buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.y2);
+++ buflen=snprintf(buffer, sizeof(buffer), "%.4f",t2p->pdf_mediabox.y2);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) "] \n", 3);
++ written += t2pWriteFile(output, (tdata_t) "/Contents ", 10);
++- buflen=sprintf(buffer, "%lu", (unsigned long)(object + 1));
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)(object + 1));
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
++ written += t2pWriteFile(output, (tdata_t) "/Resources << \n", 15);
++@@ -4178,15 +4178,13 @@
++ written += t2pWriteFile(output, (tdata_t) "/XObject <<\n", 12);
++ for(i=0;i<t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount;i++){
++ written += t2pWriteFile(output, (tdata_t) "/Im", 3);
++- buflen = sprintf(buffer, "%u", t2p->pdf_page+1);
+++ buflen = snprintf(buffer, sizeof(buffer), "%u", t2p->pdf_page+1);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) "_", 1);
++- buflen = sprintf(buffer, "%u", i+1);
+++ buflen = snprintf(buffer, sizeof(buffer), "%u", i+1);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " ", 1);
++- buflen = sprintf(
++- buffer,
++- "%lu",
+++ buflen = snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)(object+3+(2*i)+t2p->tiff_pages[t2p->pdf_page].page_extra));
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
++@@ -4198,12 +4196,10 @@
++ } else {
++ written += t2pWriteFile(output, (tdata_t) "/XObject <<\n", 12);
++ written += t2pWriteFile(output, (tdata_t) "/Im", 3);
++- buflen = sprintf(buffer, "%u", t2p->pdf_page+1);
+++ buflen = snprintf(buffer, sizeof(buffer), "%u", t2p->pdf_page+1);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " ", 1);
++- buflen = sprintf(
++- buffer,
++- "%lu",
+++ buflen = snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)(object+3+(2*i)+t2p->tiff_pages[t2p->pdf_page].page_extra));
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
++@@ -4212,9 +4208,7 @@
++ if(t2p->tiff_transferfunctioncount != 0) {
++ written += t2pWriteFile(output, (tdata_t) "/ExtGState <<", 13);
++ t2pWriteFile(output, (tdata_t) "/GS1 ", 5);
++- buflen = sprintf(
++- buffer,
++- "%lu",
+++ buflen = snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)(object + 3));
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
++@@ -4587,7 +4581,7 @@
++ if(t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount>0){
++ for(i=0;i<t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount; i++){
++ box=t2p->tiff_tiles[t2p->pdf_page].tiles_tiles[i].tile_box;
++- buflen=sprintf(buffer,
+++ buflen=snprintf(buffer, sizeof(buffer),
++ "q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d_%ld Do Q\n",
++ t2p->tiff_transferfunctioncount?"/GS1 gs ":"",
++ box.mat[0],
++@@ -4602,7 +4596,7 @@
++ }
++ } else {
++ box=t2p->pdf_imagebox;
++- buflen=sprintf(buffer,
+++ buflen=snprintf(buffer, sizeof(buffer),
++ "q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d Do Q\n",
++ t2p->tiff_transferfunctioncount?"/GS1 gs ":"",
++ box.mat[0],
++@@ -4627,59 +4621,48 @@
++ TIFF* output){
++
++ tsize_t written=0;
++- char buffer[16];
+++ char buffer[32];
++ int buflen=0;
++
++ written += t2p_write_pdf_stream_dict(0, t2p->pdf_xrefcount+1, output);
++ written += t2pWriteFile(output,
++ (tdata_t) "/Type /XObject \n/Subtype /Image \n/Name /Im",
++ 42);
++- buflen=sprintf(buffer, "%u", t2p->pdf_page+1);
+++ buflen=snprintf(buffer, sizeof(buffer), "%u", t2p->pdf_page+1);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ if(tile != 0){
++ written += t2pWriteFile(output, (tdata_t) "_", 1);
++- buflen=sprintf(buffer, "%lu", (unsigned long)tile);
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)tile);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ }
++ written += t2pWriteFile(output, (tdata_t) "\n/Width ", 8);
++- _TIFFmemset((tdata_t)buffer, 0x00, 16);
++ if(tile==0){
++- buflen=sprintf(buffer, "%lu", (unsigned long)t2p->tiff_width);
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->tiff_width);
++ } else {
++ if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)!=0){
++- buflen=sprintf(
++- buffer,
++- "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth);
++ } else {
++- buflen=sprintf(
++- buffer,
++- "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth);
++ }
++ }
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) "\n/Height ", 9);
++- _TIFFmemset((tdata_t)buffer, 0x00, 16);
++ if(tile==0){
++- buflen=sprintf(buffer, "%lu", (unsigned long)t2p->tiff_length);
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->tiff_length);
++ } else {
++ if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)!=0){
++- buflen=sprintf(
++- buffer,
++- "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
++ } else {
++- buflen=sprintf(
++- buffer,
++- "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
++ }
++ }
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) "\n/BitsPerComponent ", 19);
++- _TIFFmemset((tdata_t)buffer, 0x00, 16);
++- buflen=sprintf(buffer, "%u", t2p->tiff_bitspersample);
+++ buflen=snprintf(buffer, sizeof(buffer), "%u", t2p->tiff_bitspersample);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) "\n/ColorSpace ", 13);
++ written += t2p_write_pdf_xobject_cs(t2p, output);
++@@ -4723,11 +4706,10 @@
++ t2p->pdf_colorspace ^= T2P_CS_PALETTE;
++ written += t2p_write_pdf_xobject_cs(t2p, output);
++ t2p->pdf_colorspace |= T2P_CS_PALETTE;
++- buflen=sprintf(buffer, "%u", (0x0001 << t2p->tiff_bitspersample)-1 );
+++ buflen=snprintf(buffer, sizeof(buffer), "%u", (0x0001 << t2p->tiff_bitspersample)-1 );
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " ", 1);
++- _TIFFmemset(buffer, 0x00, 16);
++- buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_palettecs );
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_palettecs );
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R ]\n", 7);
++ return(written);
++@@ -4761,10 +4743,10 @@
++ X_W /= Y_W;
++ Z_W /= Y_W;
++ Y_W = 1.0F;
++- buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
+++ buflen=snprintf(buffer, sizeof(buffer), "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) "/Range ", 7);
++- buflen=sprintf(buffer, "[%d %d %d %d] \n",
+++ buflen=snprintf(buffer, sizeof(buffer), "[%d %d %d %d] \n",
++ t2p->pdf_labrange[0],
++ t2p->pdf_labrange[1],
++ t2p->pdf_labrange[2],
++@@ -4780,26 +4762,26 @@
++ tsize_t t2p_write_pdf_transfer(T2P* t2p, TIFF* output){
++
++ tsize_t written=0;
++- char buffer[16];
+++ char buffer[32];
++ int buflen=0;
++
++ written += t2pWriteFile(output, (tdata_t) "<< /Type /ExtGState \n/TR ", 25);
++ if(t2p->tiff_transferfunctioncount == 1){
++- buflen=sprintf(buffer, "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)(t2p->pdf_xrefcount + 1));
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
++ } else {
++ written += t2pWriteFile(output, (tdata_t) "[ ", 2);
++- buflen=sprintf(buffer, "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)(t2p->pdf_xrefcount + 1));
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
++- buflen=sprintf(buffer, "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)(t2p->pdf_xrefcount + 2));
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
++- buflen=sprintf(buffer, "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)(t2p->pdf_xrefcount + 3));
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
++@@ -4821,7 +4803,7 @@
++ written += t2pWriteFile(output, (tdata_t) "/FunctionType 0 \n", 17);
++ written += t2pWriteFile(output, (tdata_t) "/Domain [0.0 1.0] \n", 19);
++ written += t2pWriteFile(output, (tdata_t) "/Range [0.0 1.0] \n", 18);
++- buflen=sprintf(buffer, "/Size [%u] \n", (1<<t2p->tiff_bitspersample));
+++ buflen=snprintf(buffer, sizeof(buffer), "/Size [%u] \n", (1<<t2p->tiff_bitspersample));
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) "/BitsPerSample 16 \n", 19);
++ written += t2p_write_pdf_stream_dict(((tsize_t)1)<<(t2p->tiff_bitspersample+1), 0, output);
++@@ -4848,7 +4830,7 @@
++ tsize_t t2p_write_pdf_xobject_calcs(T2P* t2p, TIFF* output){
++
++ tsize_t written=0;
++- char buffer[128];
+++ char buffer[256];
++ int buflen=0;
++
++ float X_W=0.0;
++@@ -4916,16 +4898,16 @@
++ written += t2pWriteFile(output, (tdata_t) "<< \n", 4);
++ if(t2p->pdf_colorspace & T2P_CS_CALGRAY){
++ written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12);
++- buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
+++ buflen=snprintf(buffer, sizeof(buffer), "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) "/Gamma 2.2 \n", 12);
++ }
++ if(t2p->pdf_colorspace & T2P_CS_CALRGB){
++ written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12);
++- buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
+++ buflen=snprintf(buffer, sizeof(buffer), "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) "/Matrix ", 8);
++- buflen=sprintf(buffer, "[%.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f] \n",
+++ buflen=snprintf(buffer, sizeof(buffer), "[%.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f] \n",
++ X_R, Y_R, Z_R,
++ X_G, Y_G, Z_G,
++ X_B, Y_B, Z_B);
++@@ -4944,11 +4926,11 @@
++ tsize_t t2p_write_pdf_xobject_icccs(T2P* t2p, TIFF* output){
++
++ tsize_t written=0;
++- char buffer[16];
+++ char buffer[32];
++ int buflen=0;
++
++ written += t2pWriteFile(output, (tdata_t) "[/ICCBased ", 11);
++- buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_icccs);
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_icccs);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " 0 R] \n", 7);
++
++@@ -4958,11 +4940,11 @@
++ tsize_t t2p_write_pdf_xobject_icccs_dict(T2P* t2p, TIFF* output){
++
++ tsize_t written=0;
++- char buffer[16];
+++ char buffer[32];
++ int buflen=0;
++
++ written += t2pWriteFile(output, (tdata_t) "/N ", 3);
++- buflen=sprintf(buffer, "%u \n", t2p->tiff_samplesperpixel);
+++ buflen=snprintf(buffer, sizeof(buffer), "%u \n", t2p->tiff_samplesperpixel);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) "/Alternate ", 11);
++ t2p->pdf_colorspace ^= T2P_CS_ICCBASED;
++@@ -5027,7 +5009,7 @@
++ tsize_t t2p_write_pdf_xobject_stream_filter(ttile_t tile, T2P* t2p, TIFF* output){
++
++ tsize_t written=0;
++- char buffer[16];
+++ char buffer[32];
++ int buflen=0;
++
++ if(t2p->pdf_compression==T2P_COMPRESS_NONE){
++@@ -5042,41 +5024,33 @@
++ written += t2pWriteFile(output, (tdata_t) "<< /K -1 ", 9);
++ if(tile==0){
++ written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
++- buflen=sprintf(buffer, "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)t2p->tiff_width);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
++- buflen=sprintf(buffer, "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)t2p->tiff_length);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ } else {
++ if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)==0){
++ written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
++- buflen=sprintf(
++- buffer,
++- "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ } else {
++ written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
++- buflen=sprintf(
++- buffer,
++- "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ }
++ if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)==0){
++ written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
++- buflen=sprintf(
++- buffer,
++- "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ } else {
++ written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
++- buflen=sprintf(
++- buffer,
++- "%lu",
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ }
++@@ -5103,21 +5077,17 @@
++ if(t2p->pdf_compressionquality%100){
++ written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13);
++ written += t2pWriteFile(output, (tdata_t) "<< /Predictor ", 14);
++- _TIFFmemset(buffer, 0x00, 16);
++- buflen=sprintf(buffer, "%u", t2p->pdf_compressionquality%100);
+++ buflen=snprintf(buffer, sizeof(buffer), "%u", t2p->pdf_compressionquality%100);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " /Columns ", 10);
++- _TIFFmemset(buffer, 0x00, 16);
++- buflen = sprintf(buffer, "%lu",
+++ buflen = snprintf(buffer, sizeof(buffer), "%lu",
++ (unsigned long)t2p->tiff_width);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " /Colors ", 9);
++- _TIFFmemset(buffer, 0x00, 16);
++- buflen=sprintf(buffer, "%u", t2p->tiff_samplesperpixel);
+++ buflen=snprintf(buffer, sizeof(buffer), "%u", t2p->tiff_samplesperpixel);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " /BitsPerComponent ", 19);
++- _TIFFmemset(buffer, 0x00, 16);
++- buflen=sprintf(buffer, "%u", t2p->tiff_bitspersample);
+++ buflen=snprintf(buffer, sizeof(buffer), "%u", t2p->tiff_bitspersample);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
++ }
++@@ -5137,16 +5107,16 @@
++ tsize_t t2p_write_pdf_xreftable(T2P* t2p, TIFF* output){
++
++ tsize_t written=0;
++- char buffer[21];
+++ char buffer[64];
++ int buflen=0;
++ uint32 i=0;
++
++ written += t2pWriteFile(output, (tdata_t) "xref\n0 ", 7);
++- buflen=sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount + 1));
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)(t2p->pdf_xrefcount + 1));
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++ written += t2pWriteFile(output, (tdata_t) " \n0000000000 65535 f \n", 22);
++ for (i=0;i<t2p->pdf_xrefcount;i++){
++- sprintf(buffer, "%.10lu 00000 n \n",
+++ snprintf(buffer, sizeof(buffer), "%.10lu 00000 n \n",
++ (unsigned long)t2p->pdf_xrefoffsets[i]);
++ written += t2pWriteFile(output, (tdata_t) buffer, 20);
++ }
++@@ -5170,17 +5140,14 @@
++ snprintf(t2p->pdf_fileid + i, 9, "%.8X", rand());
++
++ written += t2pWriteFile(output, (tdata_t) "trailer\n<<\n/Size ", 17);
++- buflen = sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount+1));
+++ buflen = snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)(t2p->pdf_xrefcount+1));
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++- _TIFFmemset(buffer, 0x00, 32);
++ written += t2pWriteFile(output, (tdata_t) "\n/Root ", 7);
++- buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_catalog);
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_catalog);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++- _TIFFmemset(buffer, 0x00, 32);
++ written += t2pWriteFile(output, (tdata_t) " 0 R \n/Info ", 12);
++- buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_info);
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_info);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++- _TIFFmemset(buffer, 0x00, 32);
++ written += t2pWriteFile(output, (tdata_t) " 0 R \n/ID[<", 11);
++ written += t2pWriteFile(output, (tdata_t) t2p->pdf_fileid,
++ sizeof(t2p->pdf_fileid) - 1);
++@@ -5188,9 +5155,8 @@
++ written += t2pWriteFile(output, (tdata_t) t2p->pdf_fileid,
++ sizeof(t2p->pdf_fileid) - 1);
++ written += t2pWriteFile(output, (tdata_t) ">]\n>>\nstartxref\n", 16);
++- buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_startxref);
+++ buflen=snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_startxref);
++ written += t2pWriteFile(output, (tdata_t) buffer, buflen);
++- _TIFFmemset(buffer, 0x00, 32);
++ written += t2pWriteFile(output, (tdata_t) "\n%%EOF\n", 7);
++
++ return(written);
++Index: tiff-4.0.3/tools/tiff2ps.c
++===================================================================
++--- tiff-4.0.3.orig/tools/tiff2ps.c 2013-06-23 10:36:51.163629483 -0400
+++++ tiff-4.0.3/tools/tiff2ps.c 2013-06-23 10:36:51.155629481 -0400
++@@ -1781,8 +1781,8 @@
++ imageOp = "imagemask";
++
++ (void)strcpy(im_x, "0");
++- (void)sprintf(im_y, "%lu", (long) h);
++- (void)sprintf(im_h, "%lu", (long) h);
+++ (void)snprintf(im_y, sizeof(im_y), "%lu", (long) h);
+++ (void)snprintf(im_h, sizeof(im_h), "%lu", (long) h);
++ tile_width = w;
++ tile_height = h;
++ if (TIFFIsTiled(tif)) {
++@@ -1803,7 +1803,7 @@
++ }
++ if (tile_height < h) {
++ fputs("/im_y 0 def\n", fd);
++- (void)sprintf(im_y, "%lu im_y sub", (unsigned long) h);
+++ (void)snprintf(im_y, sizeof(im_y), "%lu im_y sub", (unsigned long) h);
++ }
++ } else {
++ repeat_count = tf_numberstrips;
++@@ -1815,7 +1815,7 @@
++ fprintf(fd, "/im_h %lu def\n",
++ (unsigned long) tile_height);
++ (void)strcpy(im_h, "im_h");
++- (void)sprintf(im_y, "%lu im_y sub", (unsigned long) h);
+++ (void)snprintf(im_y, sizeof(im_y), "%lu im_y sub", (unsigned long) h);
++ }
++ }
++
++Index: tiff-4.0.3/tools/tiffcrop.c
++===================================================================
++--- tiff-4.0.3.orig/tools/tiffcrop.c 2013-06-23 10:36:51.163629483 -0400
+++++ tiff-4.0.3/tools/tiffcrop.c 2013-06-23 10:36:51.159629481 -0400
++@@ -2077,7 +2077,7 @@
++ return 1;
++ }
++
++- sprintf (filenum, "-%03d%s", findex, export_ext);
+++ snprintf(filenum, sizeof(filenum), "-%03d%s", findex, export_ext);
++ filenum[14] = '\0';
++ strncat (exportname, filenum, 15);
++ }
++@@ -2230,8 +2230,8 @@
++
++ /* dump.infilename is guaranteed to be NUL termimated and have 20 bytes
++ fewer than PATH_MAX */
++- memset (temp_filename, '\0', PATH_MAX + 1);
++- sprintf (temp_filename, "%s-read-%03d.%s", dump.infilename, dump_images,
+++ snprintf(temp_filename, sizeof(temp_filename), "%s-read-%03d.%s",
+++ dump.infilename, dump_images,
++ (dump.format == DUMP_TEXT) ? "txt" : "raw");
++ if ((dump.infile = fopen(temp_filename, dump.mode)) == NULL)
++ {
++@@ -2249,8 +2249,8 @@
++
++ /* dump.outfilename is guaranteed to be NUL termimated and have 20 bytes
++ fewer than PATH_MAX */
++- memset (temp_filename, '\0', PATH_MAX + 1);
++- sprintf (temp_filename, "%s-write-%03d.%s", dump.outfilename, dump_images,
+++ snprintf(temp_filename, sizeof(temp_filename), "%s-write-%03d.%s",
+++ dump.outfilename, dump_images,
++ (dump.format == DUMP_TEXT) ? "txt" : "raw");
++ if ((dump.outfile = fopen(temp_filename, dump.mode)) == NULL)
++ {
++Index: tiff-4.0.3/tools/tiff2bw.c
++===================================================================
++--- tiff-4.0.3.orig/tools/tiff2bw.c 2013-06-23 10:36:51.163629483 -0400
+++++ tiff-4.0.3/tools/tiff2bw.c 2013-06-23 10:36:51.159629481 -0400
++@@ -205,7 +205,7 @@
++ }
++ }
++ TIFFSetField(out, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
++- sprintf(thing, "B&W version of %s", argv[optind]);
+++ snprintf(thing, sizeof(thing), "B&W version of %s", argv[optind]);
++ TIFFSetField(out, TIFFTAG_IMAGEDESCRIPTION, thing);
++ TIFFSetField(out, TIFFTAG_SOFTWARE, "tiff2bw");
++ outbuf = (unsigned char *)_TIFFmalloc(TIFFScanlineSize(out));
+diff --git a/feeds/packages/libs/tiff/patches/013-CVE-2013-4231.patch b/feeds/packages/libs/tiff/patches/013-CVE-2013-4231.patch
+new file mode 100644
+index 0000000..c26bd85
+--- /dev/null
++++ b/feeds/packages/libs/tiff/patches/013-CVE-2013-4231.patch
+@@ -0,0 +1,17 @@
++Description: Buffer overflow in gif2tiff
++Bug: http://bugzilla.maptools.org/show_bug.cgi?id=2450
++Bug-Debian: http://bugs.debian.org/719303
++
++Index: tiff-4.0.3/tools/gif2tiff.c
++===================================================================
++--- tiff-4.0.3.orig/tools/gif2tiff.c 2013-08-22 11:46:11.960846910 -0400
+++++ tiff-4.0.3/tools/gif2tiff.c 2013-08-22 11:46:11.956846910 -0400
++@@ -333,6 +333,8 @@
++ int status = 1;
++
++ datasize = getc(infile);
+++ if (datasize > 12)
+++ return 0;
++ clear = 1 << datasize;
++ eoi = clear + 1;
++ avail = clear + 2;
+diff --git a/feeds/packages/libs/tiff/patches/014-CVE-2013-4232.patch b/feeds/packages/libs/tiff/patches/014-CVE-2013-4232.patch
+new file mode 100644
+index 0000000..0d80ff3
+--- /dev/null
++++ b/feeds/packages/libs/tiff/patches/014-CVE-2013-4232.patch
+@@ -0,0 +1,18 @@
++Description: use after free in tiff2pdf
++Bug: http://bugzilla.maptools.org/show_bug.cgi?id=2449
++Bug-Debian: http://bugs.debian.org/719303
++
++Index: tiff-4.0.3/tools/tiff2pdf.c
++===================================================================
++--- tiff-4.0.3.orig/tools/tiff2pdf.c 2013-08-22 11:46:37.292847242 -0400
+++++ tiff-4.0.3/tools/tiff2pdf.c 2013-08-22 11:46:37.292847242 -0400
++@@ -2461,7 +2461,8 @@
++ (unsigned long) t2p->tiff_datasize,
++ TIFFFileName(input));
++ t2p->t2p_error = T2P_ERR_ERROR;
++- _TIFFfree(buffer);
+++ _TIFFfree(buffer);
+++ return(0);
++ } else {
++ buffer=samplebuffer;
++ t2p->tiff_datasize *= t2p->tiff_samplesperpixel;
+diff --git a/feeds/packages/libs/tiff/patches/015-CVE-2013-4244.patch b/feeds/packages/libs/tiff/patches/015-CVE-2013-4244.patch
+new file mode 100644
+index 0000000..0a77a0c
+--- /dev/null
++++ b/feeds/packages/libs/tiff/patches/015-CVE-2013-4244.patch
+@@ -0,0 +1,18 @@
++Description: OOB write in gif2tiff
++Bug-Redhat: https://bugzilla.redhat.com/show_bug.cgi?id=996468
++
++Index: tiff-4.0.3/tools/gif2tiff.c
++===================================================================
++--- tiff-4.0.3.orig/tools/gif2tiff.c 2013-08-24 11:17:13.546447901 -0400
+++++ tiff-4.0.3/tools/gif2tiff.c 2013-08-24 11:17:13.546447901 -0400
++@@ -400,6 +400,10 @@
++ }
++
++ if (oldcode == -1) {
+++ if (code >= clear) {
+++ fprintf(stderr, "bad input: code=%d is larger than clear=%d\n",code, clear);
+++ return 0;
+++ }
++ *(*fill)++ = suffix[code];
++ firstchar = oldcode = code;
++ return 1;
+diff --git a/feeds/packages/libs/tiff/patches/016-CVE-2013-4243.patch b/feeds/packages/libs/tiff/patches/016-CVE-2013-4243.patch
+new file mode 100644
+index 0000000..75fae2c
+--- /dev/null
++++ b/feeds/packages/libs/tiff/patches/016-CVE-2013-4243.patch
+@@ -0,0 +1,37 @@
++Index: tiff/tools/gif2tiff.c
++===================================================================
++--- tiff.orig/tools/gif2tiff.c
+++++ tiff/tools/gif2tiff.c
++@@ -280,6 +280,10 @@ readgifimage(char* mode)
++ fprintf(stderr, "no colormap present for image\n");
++ return (0);
++ }
+++ if (width == 0 || height == 0) {
+++ fprintf(stderr, "Invalid value of width or height\n");
+++ return(0);
+++ }
++ if ((raster = (unsigned char*) _TIFFmalloc(width*height+EXTRAFUDGE)) == NULL) {
++ fprintf(stderr, "not enough memory for image\n");
++ return (0);
++@@ -404,6 +408,10 @@ process(register int code, unsigned char
++ fprintf(stderr, "bad input: code=%d is larger than clear=%d\n",code, clear);
++ return 0;
++ }
+++ if (*fill >= raster + width*height) {
+++ fprintf(stderr, "raster full before eoi code\n");
+++ return 0;
+++ }
++ *(*fill)++ = suffix[code];
++ firstchar = oldcode = code;
++ return 1;
++@@ -434,6 +442,10 @@ process(register int code, unsigned char
++ }
++ oldcode = incode;
++ do {
+++ if (*fill >= raster + width*height) {
+++ fprintf(stderr, "raster full before eoi code\n");
+++ return 0;
+++ }
++ *(*fill)++ = *--stackp;
++ } while (stackp > stack);
++ return 1;
+diff --git a/feeds/packages/libs/tiff/patches/017-CVE-2014-9330.patch b/feeds/packages/libs/tiff/patches/017-CVE-2014-9330.patch
+new file mode 100644
+index 0000000..acd0a33
+--- /dev/null
++++ b/feeds/packages/libs/tiff/patches/017-CVE-2014-9330.patch
+@@ -0,0 +1,45 @@
++Description: CVE-2014-9330
++ Integer overflow in bmp2tiff
++Origin: upstream, http://bugzilla.maptools.org/show_bug.cgi?id=2494
++Bug: http://bugzilla.maptools.org/show_bug.cgi?id=2494
++Bug-Debian: http://bugs.debian.org/773987
++
++Index: tiff/tools/bmp2tiff.c
++===================================================================
++--- tiff.orig/tools/bmp2tiff.c
+++++ tiff/tools/bmp2tiff.c
++@@ -1,4 +1,4 @@
++-/* $Id: bmp2tiff.c,v 1.23 2010-03-10 18:56:49 bfriesen Exp $
+++/* $Id: bmp2tiff.c,v 1.24 2014-12-21 15:15:32 erouault Exp $
++ *
++ * Project: libtiff tools
++ * Purpose: Convert Windows BMP files in TIFF.
++@@ -403,6 +403,13 @@ main(int argc, char* argv[])
++
++ width = info_hdr.iWidth;
++ length = (info_hdr.iHeight > 0) ? info_hdr.iHeight : -info_hdr.iHeight;
+++ if( width <= 0 || length <= 0 )
+++ {
+++ TIFFError(infilename,
+++ "Invalid dimensions of BMP file" );
+++ close(fd);
+++ return -1;
+++ }
++
++ switch (info_hdr.iBitCount)
++ {
++@@ -593,6 +600,14 @@ main(int argc, char* argv[])
++
++ compr_size = file_hdr.iSize - file_hdr.iOffBits;
++ uncompr_size = width * length;
+++ /* Detect int overflow */
+++ if( uncompr_size / width != length )
+++ {
+++ TIFFError(infilename,
+++ "Invalid dimensions of BMP file" );
+++ close(fd);
+++ return -1;
+++ }
++ comprbuf = (unsigned char *) _TIFFmalloc( compr_size );
++ if (!comprbuf) {
++ TIFFError(infilename,
+diff --git a/feeds/packages/libs/tinycdb/Makefile b/feeds/packages/libs/tinycdb/Makefile
+new file mode 100644
+index 0000000..5288dea
+--- /dev/null
++++ b/feeds/packages/libs/tinycdb/Makefile
+@@ -0,0 +1,39 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tinycdb
++PKG_RELEASE:=1
++PKG_SOURCE_URL:=http://www.corpit.ru/mjt/tinycdb/
++PKG_VERSION:=0.78
++PKG_MD5SUM:=976266afc3f6e7e17492a8d18f21f8f6
++PKG_MAINTAINER:=Denis Shulyaka <Shulyaka@gmail.com>
++PKG_LICENSE:=NLPL
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tinycdb
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=a Constant DataBase
++ URL:=http://www.corpit.ru/mjt/tinycdb.html
++endef
++
++define Package/tinycdb/description
++ TinyCDB is a very fast and simple package for creating and reading constant data bases
++endef
++
++define Build/InstallDev
++ cd $(PKG_BUILD_DIR); $(MAKE) DESTDIR=$(1) prefix=/usr install
++endef
++
++
++
++$(eval $(call BuildPackage,tinycdb))
+diff --git a/feeds/packages/libs/tinycdb/patches/100-Makefile.patch b/feeds/packages/libs/tinycdb/patches/100-Makefile.patch
+new file mode 100644
+index 0000000..830d712
+--- /dev/null
++++ b/feeds/packages/libs/tinycdb/patches/100-Makefile.patch
+@@ -0,0 +1,25 @@
++diff -Naur tinycdb-0.78/Makefile tinycdb-0.78.patched/Makefile
++--- tinycdb-0.78/Makefile 2012-05-11 18:17:47.000000000 +0400
+++++ tinycdb-0.78.patched/Makefile 2014-09-29 00:10:00.610836323 +0400
++@@ -86,17 +86,17 @@
++ $(SHAREDLIB): $(LIB_OBJS_PIC) $(LIBMAP)
++ -rm -f $(SOLIB)
++ ln -s $@ $(SOLIB)
++- $(LD) $(LDFLAGS) $(LDFLAGS_SHARED) -o $@ \
+++ $(CC) $(LDFLAGS) $(LDFLAGS_SHARED) -o $@ \
++ $(LDFLAGS_SONAME)$(SHAREDLIB) $(LDFLAGS_VSCRIPT)$(LIBMAP) \
++ $(LIB_OBJS_PIC)
++
++ cdb: cdb.o $(CDB_USELIB)
++- $(LD) $(LDFLAGS) -o $@ cdb.o $(CDB_USELIB)
+++ $(CC) $(LDFLAGS) -o $@ cdb.o $(CDB_USELIB)
++ cdb-shared: cdb.o $(SHAREDLIB)
++- $(LD) $(LDFLAGS) -o $@ cdb.o $(SHAREDLIB)
+++ $(CC) $(LDFLAGS) -o $@ cdb.o $(SHAREDLIB)
++
++ $(NSS_CDB): $(NSS_OBJS) $(NSS_USELIB) $(NSSMAP)
++- $(LD) $(LDFLAGS) $(LDFLAGS_SHARED) -o $@ \
+++ $(CC) $(LDFLAGS) $(LDFLAGS_SHARED) -o $@ \
++ $(LDFLAGS_SONAME)$@ $(LDFLAGS_VSCRIPT)$(NSSMAP) \
++ $(NSS_OBJS) $(NSS_USELIB)
++
+diff --git a/feeds/packages/libs/toxcore/Makefile b/feeds/packages/libs/toxcore/Makefile
+new file mode 100644
+index 0000000..07f0c76
+--- /dev/null
++++ b/feeds/packages/libs/toxcore/Makefile
+@@ -0,0 +1,170 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=toxcore
++PKG_VERSION:=0.0.0
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/irungentoo/toxcore.git
++PKG_SOURCE_VERSION:=6d883f488ff59b2394982b62895d50b1d1d55bf4
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=GPL
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/toxcore/Default
++ SECTION:=libs
++ CATEGORY:=Libraries
++ SUBMENU:=Networking
++ TITLE:=Tox
++ URL:=https://tox.im
++endef
++
++define Package/toxcore/description/Default
++ Tox, a FOSS initiative, aims to be an easy to use, all-in-one
++ communication platform that ensures their users full privacy and
++ secure message delivery.
++endef
++
++define Package/libtoxcore
++ $(call Package/toxcore/Default)
++ DEPENDS:=+libsodium +librt +libpthread
++ TITLE+= core library
++endef
++
++define Package/libtoxcore/description
++ $(call Package/toxcore/description/Default)
++
++ core library
++endef
++
++define Package/libtoxav
++ $(call Package/toxcore/Default)
++ DEPENDS:=+libtoxcore +libopus +libvpx
++ TITLE+= A/V library
++endef
++
++define Package/libtoxav/description
++ $(call Package/toxcore/description/Default)
++
++ A/V library providing audio/video codec bindings
++endef
++
++define Package/libtoxdns
++ $(call Package/toxcore/Default)
++ DEPENDS:=+libtoxcore
++ TITLE+= dns library
++endef
++
++define Package/libtoxdns/description
++ $(call Package/toxcore/description/Default)
++
++ DNS library
++endef
++
++define Package/libtoxencryptsave
++ $(call Package/toxcore/Default)
++ DEPENDS:=+libtoxcore
++ TITLE+= encryptsave library
++endef
++
++define Package/libtoxencryptsave/description
++ $(call Package/toxcore/description/Default)
++
++ encryptsave library
++endef
++
++define Package/ntox
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Instant Messaging
++ DEPENDS:=+libtoxcore +libncurses
++ TITLE:=ntox Tox command-line client
++endef
++
++define Package/ntox/description
++ $(call Package/toxcore/description/Default)
++
++ nTox is an ncurses-based command-line client for Tox.
++endef
++
++define Package/tox-bootstrapd
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Instant Messaging
++ DEPENDS:=+libtoxcore +libconfig
++ TITLE:=Tox DHT bootstrap
++endef
++
++define Package/tox-dht-bootstrap/description
++ $(call Package/toxcore/description/Default)
++
++ This package provide the Tox DHT bootstrap service.
++endef
++
++CONFIGURE_ARGS+= \
++ --enable-daemon \
++ --enable-ntox \
++ --enable-av \
++ --disable-testing \
++ --disable-tests
++
++define Package/libtoxav/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libtoxav.*so* $(1)/usr/lib
++endef
++
++define Package/libtoxcore/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libtoxcore.*so* $(1)/usr/lib
++endef
++
++define Package/libtoxdns/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libtoxdns.*so* $(1)/usr/lib
++endef
++
++define Package/libtoxencryptsave/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libtoxencryptsave.*so* $(1)/usr/lib
++endef
++
++define Package/tox-bootstrapd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/tox-bootstrapd $(1)/usr/bin
++endef
++
++define Package/ntox/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/nTox $(1)/usr/bin
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/tox
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/tox/*.h $(1)/usr/include/tox
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libtox* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libtoxcore.pc $(1)/usr/lib/pkgconfig/
++endef
++
++$(eval $(call BuildPackage,libtoxav))
++$(eval $(call BuildPackage,libtoxcore))
++$(eval $(call BuildPackage,libtoxdns))
++$(eval $(call BuildPackage,libtoxencryptsave))
++$(eval $(call BuildPackage,ntox))
++$(eval $(call BuildPackage,tox-bootstrapd))
+diff --git a/feeds/packages/libs/unixodbc/Makefile b/feeds/packages/libs/unixodbc/Makefile
+new file mode 100644
+index 0000000..4a94a89
+--- /dev/null
++++ b/feeds/packages/libs/unixodbc/Makefile
+@@ -0,0 +1,117 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=unixodbc
++PKG_VERSION:=2.3.4
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=@SF/unixodbc
++PKG_SOURCE:=unixODBC-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=bd25d261ca1808c947cb687e2034be81
++PKG_BUILD_DIR:=$(BUILD_DIR)/unixODBC-$(PKG_VERSION)
++PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
++PKG_LICENSE:=prog GPL libs LGPL
++
++include $(INCLUDE_DIR)/package.mk
++CONFIGURE_ARGS += \
++ --disable-gui \
++ --with-pic \
++ --enable-drivers
++
++define Package/unixodbc/Default
++ SUBMENU:=database
++ TITLE:=unixODBC
++ URL:=http://www.unixodbc.org/
++endef
++
++define Package/unixodbc
++ $(call Package/unixodbc/Default)
++ TITLE+= (libraries)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libltdl +libpthread
++endef
++
++define Package/unixodbc/description
++ unixODBC is an Open Source ODBC sub-system and an ODBC SDK for Linux,
++ Mac OSX, and UNIX.
++endef
++
++define Package/unixodbc-tools
++ $(call Package/unixodbc/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= Tools
++ DEPENDS:=+unixodbc +libncurses +libreadline
++endef
++
++define Package/unixodbc-tools/description
++ Command Line Tools to help install a driver and work with SQL.
++endef
++
++define Package/pgsqlodbc
++ $(call Package/unixodbc/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Postgresql driver for ODBC
++ DEPENDS:=+unixodbc +libpq
++endef
++
++define Package/pgsqlodbc/description
++ Postgresql driver for ODBC.
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ $(MAKE_FLAGS) \
++ ARCH="$(ARCH)" \
++ CC="$(TARGET_CC)"
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ $(MAKE_FLAGS) \
++ ARCH="$(ARCH)" \
++ install -i
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_INSTALL_DIR)/etc/odbc* $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/ODBCDataSources
++ $(TARGET_CC) $(TARGET_CFLAGS) -E ./files/unixodbc_conf.h | tr '@' '\#' >$(1)/usr/include/unixodbc_conf.h
++endef
++
++define Package/unixodbc/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libodbc[ci]*so* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libodbc.*so* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnn*so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_INSTALL_DIR)/etc/odbc* $(1)/etc/
++endef
++
++define Package/unixodbc-tools/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++define Package/pgsqlodbc/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libodbcpsql*so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,unixodbc))
++$(eval $(call BuildPackage,unixodbc-tools))
++$(eval $(call BuildPackage,pgsqlodbc))
+diff --git a/feeds/packages/libs/unixodbc/files/unixodbc_conf.h b/feeds/packages/libs/unixodbc/files/unixodbc_conf.h
+new file mode 100644
+index 0000000..f149d02
+--- /dev/null
++++ b/feeds/packages/libs/unixodbc/files/unixodbc_conf.h
+@@ -0,0 +1,22 @@
++@ifndef HAVE_UNISTD_H
++ @define HAVE_UNISTD_H
++@endif
++@ifndef HAVE_PWD_H
++ @define HAVE_PWD_H
++@endif
++@ifndef HAVE_SYS_TYPES_H
++ @define HAVE_SYS_TYPES_H
++@endif
++@ifndef HAVE_LONG_LONG
++ @define HAVE_LONG_LONG
++@endif
++@ifndef ODBCINT64
++ @define ODBCINT64 long
++@endif
++@ifndef UODBCINT64
++ @define UODBCINT64 unsigned long
++@endif
++@ifndef SIZEOF_LONG_INT
++ @define SIZEOF_LONG_INT __SIZEOF_LONG__
++@endif
++
+\ No newline at end of file
+diff --git a/feeds/packages/libs/vips/Makefile b/feeds/packages/libs/vips/Makefile
+new file mode 100644
+index 0000000..501f987
+--- /dev/null
++++ b/feeds/packages/libs/vips/Makefile
+@@ -0,0 +1,82 @@
++#
++# Copyright (C) 2010-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=vips
++PKG_VERSION:=7.42.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.vips.ecs.soton.ac.uk/supported/7.42/
++PKG_MD5SUM:=33a4590924b3120ce309982ec85a7c16
++PKG_FIXUP:=autoreconf
++PKG_CHECK_FORMAT_SECURITY:=0
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++PKG_INSTALL=1
++
++define Package/vips
++ $(call Package/vips/Default)
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ TITLE:=An image manipulation library
++ URL:=http://www.vips.ecs.soton.ac.uk/
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++ DEPENDS:=+glib2 +libexif +libjpeg +libpng +libxml2 $(INTL_DEPENDS)
++endef
++
++TARGET_LDFLAGS+= \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib
++
++CONFIGURE_ARGS += \
++ --disable-cxx \
++ --disable-threads \
++ --without-cfitsio \
++ --without-fftw \
++ --without-lcms \
++ --without-magick \
++ --without-matio \
++ --without-OpenEXR \
++ --without-orc \
++ --without-pangoft2 \
++ --without-python \
++ --without-tiff \
++ --without-v4l \
++ --without-x \
++ --without-zip \
++ --with-jpeg \
++ --with-libexif \
++ --with-png \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/vips
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/* \
++ $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.so* \
++ $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/vips/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.so* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,vips))
+diff --git a/feeds/packages/libs/vips/patches/001-no_cpp.patch b/feeds/packages/libs/vips/patches/001-no_cpp.patch
+new file mode 100644
+index 0000000..72e841c
+--- /dev/null
++++ b/feeds/packages/libs/vips/patches/001-no_cpp.patch
+@@ -0,0 +1,154 @@
++diff -u --recursive --new-file vips-7.42.1-vanilla/configure.ac vips-7.42.1/configure.ac
++--- vips-7.42.1-vanilla/configure.ac 2014-12-29 17:45:59.576995574 -0500
+++++ vips-7.42.1/configure.ac 2014-12-29 17:59:03.698808601 -0500
++@@ -264,7 +264,6 @@
++ AC_PROG_AWK
++ AC_PROG_CC
++ AC_PROG_CC_STDC
++-AC_PROG_CXX
++ AC_C_CONST
++ AC_C_RESTRICT
++ AC_PROG_RANLIB
++@@ -272,19 +271,6 @@
++ AC_PROG_LN_S
++ AM_WITH_DMALLOC
++
++-# vips_PROG_CXX_WORKS
++-# Check whether the C++ compiler works.
++-AC_DEFUN([vips_PROG_CXX_WORKS],
++- [AC_REQUIRE([AC_PROG_CXX])dnl
++- AC_CACHE_CHECK([whether the C++ compiler works],
++- [vips_cv_prog_cxx_works],
++- [AC_LANG_PUSH([C++])
++- AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
++- [vips_cv_prog_cxx_works=yes],
++- [vips_cv_prog_cxx_works=no])
++- AC_LANG_POP([C++])])
++-])
++-
++ # option to build without C++
++ # handy for some embedded applications
++ # also, including C++ source causes link problems on some
++@@ -292,24 +278,8 @@
++ AC_ARG_ENABLE(cxx,
++ AS_HELP_STRING([--enable-cxx], [build C++ components (default: test)]))
++
++-if test x"$enable_cxx" != x"no"; then
++- vips_PROG_CXX_WORKS
++- if test x"$vips_cv_prog_cxx_works" = x"yes"; then
++- AC_DEFINE(ENABLE_CXX,1,[build C++ components])
++- AM_CONDITIONAL(ENABLE_CXX, true)
++- # need -lstdc++ for (eg.) the C++ format loaders
++- # this gets added to vips.pc to help mingw and friends link programs
++- # using libvips
++- if test x"$vips_needs_stdcpp" != x"no"; then
++- VIPS_CXX_LIBS="-lstdc++"
++- fi
++- enable_cxx=yes
++- fi
++-fi
++-
++ if test x"$enable_cxx" != x"yes"; then
++ AM_CONDITIONAL(ENABLE_CXX, false)
++- VIPS_CXX_LIBS=""
++ enable_cxx=no
++ fi
++
++@@ -817,7 +787,6 @@
++ AC_SUBST(VIPS_CFLAGS)
++ AC_SUBST(VIPS_INCLUDES)
++ AC_SUBST(VIPS_LIBS)
++-AC_SUBST(VIPS_CXX_LIBS)
++ AC_SUBST(PACKAGES_USED)
++ AC_SUBST(EXTRA_LIBS_USED)
++
++@@ -850,12 +819,6 @@
++ libvips/create/Makefile
++ libvips/resample/Makefile
++ libvips/video/Makefile
++- libvipsCC/include/Makefile
++- libvipsCC/include/vips/Makefile
++- libvipsCC/Makefile
++- cplusplus/include/Makefile
++- cplusplus/include/vips/Makefile
++- cplusplus/Makefile
++ tools/Makefile
++ tools/batch_crop
++ tools/batch_image_convert
++@@ -866,7 +829,6 @@
++ test/Makefile
++ test/variables.sh
++ swig/Makefile
++- swig/vipsCC/Makefile
++ man/Makefile
++ doc/Makefile
++ doc/reference/Makefile
++diff -u --recursive --new-file vips-7.42.1-vanilla/libvips/Makefile.am vips-7.42.1/libvips/Makefile.am
++--- vips-7.42.1-vanilla/libvips/Makefile.am 2014-12-29 17:45:59.590996100 -0500
+++++ vips-7.42.1/libvips/Makefile.am 2014-12-29 17:59:32.053375826 -0500
++@@ -33,14 +33,6 @@
++ # empty means default to C linking
++ libvips_la_SOURCES =
++
++-# if we have C++ components enabled, make sure we link the top-level with c++
++-#
++-# sadly the if/endif isn't enough to stop automake detecting a c++ link even
++-# when c++ is disabled ... comment out this line if you have linking problems
++-if ENABLE_CXX
++-nodist_EXTRA_libvips_la_SOURCES = resample/dummy2.cc
++-endif
++-
++ # DLLs need dependant libs there too ... put @VIPS_LIBS@ at the end
++ libvips_la_LIBADD = \
++ resample/libresample.la \
++diff -u --recursive --new-file vips-7.42.1-vanilla/libvips/resample/Makefile.am vips-7.42.1/libvips/resample/Makefile.am
++--- vips-7.42.1-vanilla/libvips/resample/Makefile.am 2014-12-29 17:45:59.591996138 -0500
+++++ vips-7.42.1/libvips/resample/Makefile.am 2014-12-29 18:01:57.107188019 -0500
++@@ -1,30 +1,3 @@
++-# only build the C++ stuff if ENABLE_CXX
++-# you'd think we could just define a couple of variables, but that seems to
++-# confuse libtool and make it link the library with g++
++-# instead, have two completely different paths
++-if ENABLE_CXX
++-
++-libresample_la_SOURCES = \
++- affine.c \
++- quadratic.c \
++- resample.c \
++- similarity.c \
++- resize.c \
++- presample.h \
++- shrink.c \
++- interpolate.c \
++- transform.c \
++- bicubic.cpp \
++- lbb.cpp \
++- nohalo.cpp \
++- vsqbs.cpp \
++- templates.h
++-
++-EXTRA_DIST = \
++- dummy2.cc
++-
++-else
++-
++ libresample_la_SOURCES = \
++ resample.c \
++ similarity.c \
++@@ -36,16 +9,6 @@
++ quadratic.c \
++ transform.c
++
++-EXTRA_DIST = \
++- dummy2.cc \
++- bicubic.cpp \
++- lbb.cpp \
++- nohalo.cpp \
++- vsqbs.cpp \
++- templates.h
++-
++-endif
++-
++ noinst_LTLIBRARIES = libresample.la
++
++ AM_CPPFLAGS = -I${top_srcdir}/libvips/include @VIPS_CFLAGS@ @VIPS_INCLUDES@
+diff --git a/feeds/packages/libs/xmlrpc-c/Makefile b/feeds/packages/libs/xmlrpc-c/Makefile
+new file mode 100644
+index 0000000..998219a
+--- /dev/null
++++ b/feeds/packages/libs/xmlrpc-c/Makefile
+@@ -0,0 +1,226 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=xmlrpc-c
++PKG_REV:=2640
++PKG_VERSION:=1.39.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://svn.code.sf.net/p/xmlrpc-c/code/advanced
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_PROTO:=svn
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++PKG_LICENSE:=VARIOUS
++PKG_LICENSE_FILES:=doc/COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=0
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/xmlrpc-c/Default
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=XML-RPC library
++ URL:=http://xmlrpc-c.sourceforge.net/
++endef
++
++define Package/xmlrpc-c-common
++ $(call Package/xmlrpc-c/Default)
++ TITLE+= - common
++ DEPENDS+= +libpthread
++ HIDDEN:=1
++endef
++
++define Package/xmlrpc-c-internal
++ $(call Package/xmlrpc-c/Default)
++ TITLE+= (uses internal expat variant)
++ DEPENDS:=+xmlrpc-c-common
++# PROVIDES:=xmlrpc-c
++ VARIANT:=internal
++ HIDDEN:=1
++endef
++
++define Package/xmlrpc-c
++ $(call Package/xmlrpc-c/Default)
++ TITLE+= (uses internal expat variant)
++ DEPENDS:=+xmlrpc-c-internal
++endef
++
++define Package/xmlrpc-c-libxml2
++ $(call Package/xmlrpc-c/Default)
++ TITLE+= (uses libxml2)
++ DEPENDS:=+xmlrpc-c-common +libxml2 @BROKEN
++# PROVIDES:=xmlrpc-c
++ VARIANT:=libxml2
++endef
++
++define Package/xmlrpc-c-client
++ $(call Package/xmlrpc-c/Default)
++ TITLE+= - client
++ DEPENDS:=+xmlrpc-c +libcurl
++endef
++
++define Package/xmlrpc-c-server
++ $(call Package/xmlrpc-c/Default)
++ TITLE+= - server
++ DEPENDS:=+xmlrpc-c
++endef
++
++define Package/xmlrpc-c-abyss
++ $(call Package/xmlrpc-c/Default)
++ TITLE+= - abyss
++ DEPENDS:=+xmlrpc-c-common @BROKEN
++endef
++
++define Package/xmlrpc-c-server-abyss
++ $(call Package/xmlrpc-c/Default)
++ TITLE+= - abyss server
++ DEPENDS:=+xmlrpc-c-server +xmlrpc-c-abyss
++endef
++
++define Package/xmlrpc-c/description/Default
++ Programming library for writing an XML-RPC server or client in C or C++.
++ XML-RPC is a standard network protocol to allow a client program to make
++ a simple remote procedure call (RPC) type request of a server.
++endef
++
++Package/xmlrpc-c-common/description = $(Package/xmlrpc-c/description/Default)
++Package/xmlrpc-c-libxml2/description = $(Package/xmlrpc-c/description/Default)
++Package/xmlrpc-c-internal/description = $(Package/xmlrpc-c/description/Default)
++
++Package/xmlrpc-c-libxml2/description += Uses external libxml2 library (quite big)
++Package/xmlrpc-c-internal/description += Uses internal expat variant (stripped down)
++
++CONFIGURE_ARGS+= \
++ --disable-wininet-client \
++ --disable-libwww-client \
++ --disable-abyss-server \
++ --disable-cplusplus \
++ --disable-abyss-threads \
++ --disable-cgi-server
++
++ifeq ($(BUILD_VARIANT),libxml2)
++ CONFIGURE_ARGS += \
++ --enable-libxml2-backend
++endif
++
++ifeq ($(BUILD_VARIANT),internal)
++ CONFIGURE_ARGS += \
++ --disable-libxml2-backend
++endif
++
++define Build/Compile
++ ( cd $(PKG_BUILD_DIR)/lib/expat/gennmtab && cc -I$(PKG_BUILD_DIR) -c gennmtab.c -o gennmtab.o && cc -o gennmtab gennmtab.o )
++ $(call Build/Compile/Default)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) \
++ $(1)/usr/include \
++ $(1)/usr/lib \
++ $(1)/usr/bin \
++ $(2)/bin
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/* \
++ $(1)/usr/include/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxmlrpc*.{a,so*} \
++ $(1)/usr/lib/
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/xmlrpc-c-config \
++ $(2)/bin/
++ $(SED) \
++ 's,HEADERINST_DIR="/usr/include",HEADERINST_DIR="$(STAGING_DIR)/usr/include",g' \
++ $(2)/bin/xmlrpc-c-config
++ $(SED) \
++ 's,LIBINST_DIR="/usr/lib",LIBINST_DIR="$(STAGING_DIR)/usr/lib",g' \
++ $(2)/bin/xmlrpc-c-config
++endef
++
++define Package/xmlrpc-c-libxml2/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxmlrpc.so* \
++ $(1)/usr/lib/
++endef
++
++define Package/xmlrpc-c-internal/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxmlrpc.so* \
++ $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxmlrpc_xmltok.so* \
++ $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxmlrpc_xmlparse.so* \
++ $(1)/usr/lib/
++endef
++
++define Package/xmlrpc-c-server/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxmlrpc_server.so* \
++ $(1)/usr/lib/
++endef
++
++define Package/xmlrpc-c-abyss/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxmlrpc_abyss.so* \
++ $(1)/usr/lib/
++endef
++
++define Package/xmlrpc-c-server-abyss/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxmlrpc_server_abyss.so* \
++ $(1)/usr/lib/
++endef
++
++define Package/xmlrpc-c-client/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxmlrpc_client* \
++ $(1)/usr/lib/
++endef
++
++define Package/xmlrpc-c-common/install
++ $(INSTALL_DIR) \
++ $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libxmlrpc_util.so* \
++ $(1)/usr/lib/
++endef
++
++define Package/xmlrpc-c/install
++ true
++endef
++
++$(eval $(call BuildPackage,xmlrpc-c))
++$(eval $(call BuildPackage,xmlrpc-c-common))
++#$(eval $(call BuildPackage,xmlrpc-c-libxml2))
++$(eval $(call BuildPackage,xmlrpc-c-internal))
++$(eval $(call BuildPackage,xmlrpc-c-server))
++#$(eval $(call BuildPackage,xmlrpc-c-abyss))
++#$(eval $(call BuildPackage,xmlrpc-c-server-abyss))
++$(eval $(call BuildPackage,xmlrpc-c-client))
+diff --git a/feeds/packages/libs/xmlrpc-c/patches/001-config.mk.in.patch b/feeds/packages/libs/xmlrpc-c/patches/001-config.mk.in.patch
+new file mode 100644
+index 0000000..e190ebb
+--- /dev/null
++++ b/feeds/packages/libs/xmlrpc-c/patches/001-config.mk.in.patch
+@@ -0,0 +1,11 @@
++--- a/config.mk.in
+++++ b/config.mk.in
++@@ -175,7 +175,7 @@ ifeq ($(patsubst linux-gnu%,linux-gnu,$(
++ shlibfn = $(1:%=%.$(SHLIB_SUFFIX).$(MAJ).$(MIN))
++ shliblefn = $(1:%=%.$(SHLIB_SUFFIX))
++ # SHLIB_CLIB = -lc
++- LDFLAGS_SHLIB = -shared -Wl,-soname,$(SONAME) $(SHLIB_CLIB)
+++ LDFLAGS_SHLIB = -shared -Wl,-soname,$(SONAME) $(SHLIB_CLIB) $(LDFLAGS)
++ CFLAGS_SHLIB=-fPIC
++ endif
++
+diff --git a/feeds/packages/libs/xmlrpc-c/patches/002-automake-compat.patch b/feeds/packages/libs/xmlrpc-c/patches/002-automake-compat.patch
+new file mode 100644
+index 0000000..be69611
+--- /dev/null
++++ b/feeds/packages/libs/xmlrpc-c/patches/002-automake-compat.patch
+@@ -0,0 +1,13 @@
++--- a/configure.in
+++++ b/configure.in
++@@ -224,9 +224,7 @@ dnl Checks for programs.
++ dnl =======================================================================
++
++ AC_PROG_CC
++-if test x"$enable_cplusplus" != xno; then
++- AC_PROG_CXX
++-fi
+++AC_PROG_CXX
++
++
++ dnl =======================================================================
+diff --git a/feeds/packages/libs/yajl/Makefile b/feeds/packages/libs/yajl/Makefile
+new file mode 100644
+index 0000000..f9a2877
+--- /dev/null
++++ b/feeds/packages/libs/yajl/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2014, 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=yajl
++PKG_VERSION:=2.1.0
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Charles Southerland <charlie@stuphlabs.com>
++PKG_LICENSE:=ISC
++PKG_LICENSE_FILES:=COPYING
++PKG_REV:=66cb08ca2ad8581080b626a75dfca266a890afb2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_URL:=git://github.com/lloyd/yajl.git
++PKG_SOURCE_PROTO:=git
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/yajl
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Yet Another JSON Library
++ URL:=http://lloyd.github.io/yajl
++endef
++
++define Package/yajl/description
++ Yet Another JSON Library. YAJL is a small event-driven (SAX-style)
++JSON parser written in ANSI C, and a small validating JSON generator.
++YAJL is released under the ISC license.
++
++ YAJL was created by Lloyd Hilaiel.
++endef
++
++PKG_INSTALL:=1
++
++CMAKE_OPTIONS += \
++ -DCMAKE_BUILD_TYPE:String="Release"
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/yajl $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libyajl.so* $(1)/usr/lib/
++endef
++
++define Package/yajl/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libyajl.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,yajl))
+diff --git a/feeds/packages/libs/yajl/patches/100-link-reformatter-uclibc-libm.patch b/feeds/packages/libs/yajl/patches/100-link-reformatter-uclibc-libm.patch
+new file mode 100644
+index 0000000..fd637ec
+--- /dev/null
++++ b/feeds/packages/libs/yajl/patches/100-link-reformatter-uclibc-libm.patch
+@@ -0,0 +1,11 @@
++--- a/reformatter/CMakeLists.txt
+++++ b/reformatter/CMakeLists.txt
++@@ -26,7 +26,7 @@
++
++ ADD_EXECUTABLE(json_reformat ${SRCS})
++
++-TARGET_LINK_LIBRARIES(json_reformat yajl_s)
+++TARGET_LINK_LIBRARIES(json_reformat yajl_s m)
++
++ # copy the binary into the output directory
++ GET_TARGET_PROPERTY(binPath json_reformat LOCATION)
+diff --git a/feeds/packages/libs/yajl/patches/101-link-perf-uclibc-libm.patch b/feeds/packages/libs/yajl/patches/101-link-perf-uclibc-libm.patch
+new file mode 100644
+index 0000000..0d6fd47
+--- /dev/null
++++ b/feeds/packages/libs/yajl/patches/101-link-perf-uclibc-libm.patch
+@@ -0,0 +1,8 @@
++--- a/perf/CMakeLists.txt
+++++ b/perf/CMakeLists.txt
++@@ -20,4 +20,4 @@
++
++ ADD_EXECUTABLE(perftest ${SRCS})
++
++-TARGET_LINK_LIBRARIES(perftest yajl_s)
+++TARGET_LINK_LIBRARIES(perftest yajl_s m)
+diff --git a/feeds/packages/libs/yaml/Makefile b/feeds/packages/libs/yaml/Makefile
+new file mode 100644
+index 0000000..c2b818a
+--- /dev/null
++++ b/feeds/packages/libs/yaml/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=yaml
++PKG_VERSION:=0.1.6
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://pyyaml.org/download/libyaml/
++PKG_MD5SUM:=5fe00cda18ca5daeb43762b80c38e06e
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libyaml
++ SUBMENU:=Languages
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Fast YAML 1.1 parser and emitter library
++ URL:=http://pyyaml.org/wiki/LibYAML
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/yaml.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libyaml*.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/yaml*.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libyaml/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libyaml*.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libyaml))
+diff --git a/feeds/packages/libs/zmq/Makefile b/feeds/packages/libs/zmq/Makefile
+new file mode 100644
+index 0000000..ab07dc1
+--- /dev/null
++++ b/feeds/packages/libs/zmq/Makefile
+@@ -0,0 +1,93 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++# This Makefile for ZeroMQ
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=zeromq
++PKG_VERSION:=4.1.1
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Dirk Chang <dirk@kooiot.com>
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=LICENCE.txt
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:= http://download.zeromq.org
++PKG_MD5SUM:=0a4b44aa085644f25c177f79dc13f253
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_BUILD_DEPENDS:=libuuid
++
++PKG_FIXUP:=autoreconf
++
++PKG_INSTALL:=1
++
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libzmq/default
++ TITLE:=ZeroMQ - Message Queue engine
++ URL:=http://www.zeromq.org/
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libuuid +libpthread +librt $(CXX_DEPENDS)
++ PROVIDES:=libzmq
++endef
++
++define Package/libzmq-nc
++ $(call Package/libzmq/default)
++ VARIANT:=nc
++endef
++
++define Package/libzmq-curve
++ $(call Package/libzmq/default)
++ VARIANT:=curve
++ TITLE+= (CurveZMQ)
++ DEPENDS+=+libsodium
++endef
++
++define Package/libzmq-nc/description
++ This package contains the ZeroMQ messaging engine shared library.
++endef
++
++define Package/libzmq-curve/description
++ $(call Package/libzmq-nc/description)
++ Includes CurveZMQ security by libsodium.
++endef
++
++# add extra configure flags here
++CONFIGURE_ARGS += \
++ --enable-static \
++ --enable-shared
++
++ifeq ($(BUILD_VARIANT),curve)
++ CONFIGURE_ARGS+= --with-libsodium
++else
++ CONFIGURE_ARGS+= --without-libsodium
++endif
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/zmq.h $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/zmq_utils.h $(1)/usr/include
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libzmq.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libzmq.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libzmq-nc/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libzmq.so.* $(1)/usr/lib/
++endef
++
++Package/libzmq-curve/install=$(Package/libzmq-nc/install)
++
++$(eval $(call BuildPackage,libzmq-nc))
++$(eval $(call BuildPackage,libzmq-curve))
+diff --git a/feeds/packages/libs/zmq/patches/010-disable_pedantic_on_linux_with_ulibc++.patch b/feeds/packages/libs/zmq/patches/010-disable_pedantic_on_linux_with_ulibc++.patch
+new file mode 100644
+index 0000000..74e673c
+--- /dev/null
++++ b/feeds/packages/libs/zmq/patches/010-disable_pedantic_on_linux_with_ulibc++.patch
+@@ -0,0 +1,14 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -147,8 +147,10 @@ case "${host_os}" in
++ *linux*)
++ # Define on Linux to enable all library features. Define if using a gnu compiler
++ if test "x$GXX" = "xyes"; then
++- CPPFLAGS="-D_GNU_SOURCE $CPPFLAGS"
+++ CPPFLAGS="-D_GNU_SOURCE $CPPFLAGS -Wno-long-long"
++ fi
+++ libzmq_pedantic="no"
+++ libzmq_werror="no"
++ AC_DEFINE(ZMQ_HAVE_LINUX, 1, [Have Linux OS])
++ libzmq_on_linux="yes"
++
+diff --git a/feeds/packages/libs/zmq/patches/020-map_with_const_string_with_ublic++.patch b/feeds/packages/libs/zmq/patches/020-map_with_const_string_with_ublic++.patch
+new file mode 100644
+index 0000000..121f707
+--- /dev/null
++++ b/feeds/packages/libs/zmq/patches/020-map_with_const_string_with_ublic++.patch
+@@ -0,0 +1,41 @@
++--- a/src/metadata.hpp
+++++ b/src/metadata.hpp
++@@ -31,7 +31,7 @@ namespace zmq
++ {
++ public:
++
++- typedef std::map <std::string, const std::string> dict_t;
+++ typedef std::map <std::string, std::string> dict_t;
++
++ metadata_t (const dict_t &dict);
++ virtual ~metadata_t ();
++--- a/src/socket_base.cpp
+++++ b/src/socket_base.cpp
++@@ -20,6 +20,7 @@
++ #include <new>
++ #include <string>
++ #include <algorithm>
+++#include <ctype.h>
++
++ #include "platform.hpp"
++
++--- a/src/stream_engine.cpp
+++++ b/src/stream_engine.cpp
++@@ -198,7 +198,7 @@ void zmq::stream_engine_t::plug (io_thre
++ // Compile metadata.
++ typedef metadata_t::dict_t properties_t;
++ properties_t properties;
++- properties.insert(std::make_pair("Peer-Address", peer_address));
+++ properties.insert(std::make_pair<std::string, std::string>("Peer-Address", peer_address));
++ zmq_assert (metadata == NULL);
++ metadata = new (std::nothrow) metadata_t (properties);
++ }
++@@ -805,7 +805,7 @@ void zmq::stream_engine_t::mechanism_rea
++
++ // If we have a peer_address, add it to metadata
++ if (!peer_address.empty()) {
++- properties.insert(std::make_pair("Peer-Address", peer_address));
+++ properties.insert(std::make_pair<std::string, std::string>("Peer-Address", peer_address));
++ }
++
++ // Add ZAP properties.
+diff --git a/feeds/packages/libs/zmq/patches/030-streamoff_missing_with_ulibc++.patch b/feeds/packages/libs/zmq/patches/030-streamoff_missing_with_ulibc++.patch
+new file mode 100644
+index 0000000..6abd647
+--- /dev/null
++++ b/feeds/packages/libs/zmq/patches/030-streamoff_missing_with_ulibc++.patch
+@@ -0,0 +1,10 @@
++--- a/src/blob.hpp
+++++ b/src/blob.hpp
++@@ -21,6 +21,7 @@
++ #define __ZMQ_BLOB_HPP_INCLUDED__
++
++ #include <string>
+++#include <ios>
++ #include <string.h>
++
++ // Borrowed from id3lib_strings.h:
+diff --git a/feeds/packages/libs/zmq/patches/100-fix-cxx-include-order.patch b/feeds/packages/libs/zmq/patches/100-fix-cxx-include-order.patch
+new file mode 100644
+index 0000000..63a21ba
+--- /dev/null
++++ b/feeds/packages/libs/zmq/patches/100-fix-cxx-include-order.patch
+@@ -0,0 +1,84 @@
++--- a/src/mtrie.cpp
+++++ b/src/mtrie.cpp
++@@ -17,11 +17,11 @@
++ along with this program. If not, see <http://www.gnu.org/licenses/>.
++ */
++
++-#include <stdlib.h>
++-
++ #include <new>
++ #include <algorithm>
++
+++#include <stdlib.h>
+++
++ #include "platform.hpp"
++ #if defined ZMQ_HAVE_WINDOWS
++ #include "windows.hpp"
++--- a/src/raw_encoder.cpp
+++++ b/src/raw_encoder.cpp
++@@ -17,6 +17,11 @@
++ along with this program. If not, see <http://www.gnu.org/licenses/>.
++ */
++
+++#include <basic_definitions>
+++#include <exception>
+++#include <cstddef>
+++#include <algorithm>
+++
++ #include "encoder.hpp"
++ #include "raw_encoder.hpp"
++ #include "likely.hpp"
++--- a/src/trie.cpp
+++++ b/src/trie.cpp
++@@ -17,11 +17,11 @@
++ along with this program. If not, see <http://www.gnu.org/licenses/>.
++ */
++
++-#include <stdlib.h>
++-
++ #include <new>
++ #include <algorithm>
++
+++#include <stdlib.h>
+++
++ #include "platform.hpp"
++ #if defined ZMQ_HAVE_WINDOWS
++ #include "windows.hpp"
++--- a/src/encoder.hpp
+++++ b/src/encoder.hpp
++@@ -29,7 +29,6 @@
++ #include <stddef.h>
++ #include <string.h>
++ #include <stdlib.h>
++-#include <algorithm>
++
++ #include "err.hpp"
++ #include "msg.hpp"
++--- a/src/v1_encoder.cpp
+++++ b/src/v1_encoder.cpp
++@@ -17,6 +17,11 @@
++ along with this program. If not, see <http://www.gnu.org/licenses/>.
++ */
++
+++#include <basic_definitions>
+++#include <exception>
+++#include <cstddef>
+++#include <algorithm>
+++
++ #include "encoder.hpp"
++ #include "v1_encoder.hpp"
++ #include "likely.hpp"
++--- a/src/v2_encoder.cpp
+++++ b/src/v2_encoder.cpp
++@@ -17,6 +17,11 @@
++ along with this program. If not, see <http://www.gnu.org/licenses/>.
++ */
++
+++#include <basic_definitions>
+++#include <exception>
+++#include <cstddef>
+++#include <algorithm>
+++
++ #include "v2_protocol.hpp"
++ #include "v2_encoder.hpp"
++ #include "likely.hpp"
+diff --git a/feeds/packages/mail/alpine/Makefile b/feeds/packages/mail/alpine/Makefile
+new file mode 100644
+index 0000000..cd32a62
+--- /dev/null
++++ b/feeds/packages/mail/alpine/Makefile
+@@ -0,0 +1,123 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=alpine
++PKG_VERSION:=2.20
++PKG_RELEASE:=2
++
++PKG_SOURCE_URL:=http://patches.freeiz.com/alpine/release/src/
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_MD5SUM:=043b67666af73b26f9627ad97e2aaf92
++
++PKG_MAINTAINER:=Antti Seppälä <a.seppala@gmail.com>
++PKG_LICENSE:=Apache-2.0
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_INSTALL:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/alpine/Default
++ SECTION:=mail
++ CATEGORY:=Mail
++ DEPENDS:=+libopenssl +libncurses +libpthread +libpam $(ICONV_DEPENDS) $(INTL_DEPENDS)
++ TITLE:=Alternatively Licensed Program for Internet News and Email
++ URL:=http://www.washington.edu/alpine
++endef
++
++define Package/alpine/Default/description
++ Alpine (Alternatively Licenced Program for Internet News and Email) is a
++ free software email client developed at the University of Washington.
++ It is suitable for both the inexperienced email user as well as for
++ the most demanding power user.
++endef
++
++define Package/alpine
++$(call Package/alpine/Default)
++ TITLE+= (with OpenSSL support)
++ DEPENDS+= +libopenssl
++ VARIANT:=ssl
++endef
++
++define Package/alpine/description
++$(call Package/alpine/Default/description)
++ This package is built with OpenSSL support.
++endef
++
++define Package/alpine-nossl
++$(call Package/alpine/Default)
++ TITLE+= (without OpenSSL support)
++ VARIANT:=nossl
++endef
++
++define Package/alpine-nossl/description
++$(call Package/alpine/Default/description)
++ This package is built without OpenSSL support.
++endef
++
++CONFIGURE_ARGS += \
++ --with-libiconv-prefix=$(ICONV_PREFIX) \
++ --with-libintl-prefix=$(INTL_PREFIX) \
++ --without-tcl \
++ --without-ldap \
++ --without-krb5 \
++ --with-system-pinerc=/etc/pine.conf \
++ --with-system-fixed-pinerc=/etc/pine.conf.fixed \
++ --with-supplied-regex \
++ --with-default-sshpath=/usr/bin/ssh \
++ --disable-debug \
++ --disable-mouse \
++ --with-c-client-target=slx \
++
++CONFIGURE_VARS += \
++ top_builddir=$(PKG_BUILD_DIR)
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS += \
++ --with-ssl-include-dir=$(STAGING_DIR)/usr/include/openssl/. \
++ --with-ssl-lib-dir=$(STAGING_DIR)/usr/lib
++endif
++
++ifeq ($(BUILD_VARIANT),nossl)
++ CONFIGURE_ARGS += \
++ --without-ssl
++endif
++
++ifeq ($(CONFIG_BUILD_NLS),y)
++ DISABLE_NLS:=
++endif
++
++ifeq ($(CONFIG_IPV6),y)
++ DISABLE_IPV6:=
++else
++ DISABLE_IPV6:=--without-ipv6
++endif
++
++define Build/Compile
++ ( cd $(PKG_BUILD_DIR)/pith ; \
++ $(HOSTCC) help_h_gen.c -c -o help_h_gen.o ; \
++ $(HOSTCC) help_h_gen.o -o help_h_gen ; \
++ $(HOSTCC) help_c_gen.c -c -o help_c_gen.o ; \
++ $(HOSTCC) help_c_gen.o -o help_c_gen ; \
++ )
++ $(call Build/Compile/Default)
++endef
++
++define Package/alpine/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(PKG_NAME) $(1)/usr/bin/$(PKG_NAME)
++endef
++
++Package/alpine-nossl/install = $(Package/alpine/install)
++
++$(eval $(call BuildPackage,alpine))
++$(eval $(call BuildPackage,alpine-nossl))
+diff --git a/feeds/packages/mail/alpine/patches/100-no-openssl-check-cross-compile.patch b/feeds/packages/mail/alpine/patches/100-no-openssl-check-cross-compile.patch
+new file mode 100644
+index 0000000..4043098
+--- /dev/null
++++ b/feeds/packages/mail/alpine/patches/100-no-openssl-check-cross-compile.patch
+@@ -0,0 +1,29 @@
++diff -Nru alpine-2.20-orig/configure alpine-2.20/configure
++--- alpine-2.20-orig/configure 2015-01-18 09:00:42.100645053 +0200
+++++ alpine-2.20/configure 2015-01-25 12:01:11.831015443 +0200
++@@ -17643,10 +17643,8 @@
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking Openssl library version >= 1.0.1c" >&5
++ $as_echo_n "checking Openssl library version >= 1.0.1c... " >&6; }
++ if test "$cross_compiling" = yes; then :
++- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
++-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++-as_fn_error $? "cannot run test program while cross compiling
++-See \`config.log' for more details" "$LINENO" 5; }
+++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling: not checking" >&5
+++$as_echo "$as_me: WARNING: cross compiling: not checking" >&2;}
++ else
++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++ /* end confdefs.h. */
++diff -Nru alpine-2.20-orig/configure.ac alpine-2.20/configure.ac
++--- alpine-2.20-orig/configure.ac 2015-01-18 08:38:08.893495949 +0200
+++++ alpine-2.20/configure.ac 2015-01-25 12:01:02.773015236 +0200
++@@ -1370,7 +1370,8 @@
++ }
++ ]])],
++ [ AC_MSG_RESULT(yes) ],
++- [ alpine_SSLTYPE="none" ])
+++ [ alpine_SSLTYPE="none" ],
+++ [ AC_MSG_WARN([cross compiling: not checking])])
++
++ if test "x$alpine_SSLTYPE" = "xnone" ; then
++ AC_MSG_ERROR(Install openssl version >= 1.0.1c)
+diff --git a/feeds/packages/mail/bogofilter/Makefile b/feeds/packages/mail/bogofilter/Makefile
+new file mode 100644
+index 0000000..d31dfa8
+--- /dev/null
++++ b/feeds/packages/mail/bogofilter/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bogofilter
++PKG_VERSION:=1.2.4
++PKG_RELEASE:=3
++
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/bogofilter
++PKG_MD5SUM:=d0a5eebb3274b23ceabe766a6443a1c5
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bogofilter
++ SECTION:=mail
++ CATEGORY:=Mail
++ DEPENDS:=+libdb47
++ TITLE:=bogofilter
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++ URL:=http://bogofilter.sourceforge.net/
++endef
++
++define Package/bogofilter/description
++ Bogofilter is a fast Bayesian spam filter
++endef
++
++CONFIGURE_ARGS += \
++ --disable-unicode \
++ --with-libdb-prefix=$(STAGING_DIR) \
++ --with-included-gsl
++
++define Package/bogofilter/install
++ $(INSTALL_DIR) $(1)/etc/ \
++ $(1)/usr/bin \
++ $(1)/usr/sbin
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/bogofilter.cf.example $(1)/etc/bogofilter.cf
++ $(INSTALL_BIN) ./files/postfix-bogofilter $(1)/usr/sbin/postfix-bogofilter
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/bf_compact $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/bf_copy $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/bf_tar $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/bogofilter $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/bogolexer $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/bogotune $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/bogoutil $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,bogofilter))
+diff --git a/feeds/packages/mail/bogofilter/files/postfix-bogofilter b/feeds/packages/mail/bogofilter/files/postfix-bogofilter
+new file mode 100755
+index 0000000..952d8cd
+--- /dev/null
++++ b/feeds/packages/mail/bogofilter/files/postfix-bogofilter
+@@ -0,0 +1,34 @@
++#!/bin/sh
++
++FILTER=/usr/bin/bogofilter
++FILTER_DIR=/mnt/sda1/var/spool/bogofilter
++# WARNING! The -i is crucial, else you may see
++# messages truncated at the first period that is alone on a line
++# (which can happen with several kinds of messages, particularly
++# quoted-printable)
++# -G is ignored before Postfix 2.3 and tells it that the message
++# does not originate on the local system (Gateway submission),
++# so Postfix avoids some of the local expansions that can leave
++# misleading traces in headers, such as local address
++# canonicalizations.
++POSTFIX="/usr/sbin/sendmail -G -i"
++export BOGOFILTER_DIR=/etc/bogofilter
++
++# Exit codes from <sysexits.h>
++EX_TEMPFAIL=75
++EX_UNAVAILABLE=69
++
++cd $FILTER_DIR || \
++ { echo $FILTER_DIR does not exist; exit $EX_TEMPFAIL; }
++
++# Clean up when done or when aborting.
++trap "rm -f msg.$$ ; exit $EX_TEMPFAIL" 0 1 2 3 15
++
++# bogofilter -e returns: 0 for OK, nonzero for error
++rm -f msg.$$ || exit $EX_TEMPFAIL
++$FILTER -p -e > msg.$$ || exit $EX_TEMPFAIL
++
++exec <msg.$$ || exit $EX_TEMPFAIL
++rm -f msg.$$ # safe, we hold the file descriptor
++exec $POSTFIX "$@"
++exit $EX_TEMPFAIL
+diff --git a/feeds/packages/mail/dovecot/Makefile b/feeds/packages/mail/dovecot/Makefile
+new file mode 100644
+index 0000000..1032d97
+--- /dev/null
++++ b/feeds/packages/mail/dovecot/Makefile
+@@ -0,0 +1,98 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dovecot
++PKG_VERSION:=2.2.15
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.dovecot.org/releases/2.2
++PKG_MD5SUM:=c6c176943bd832c780fbb5d2f8850952
++PKG_LICENSE:=LGPL-2.1 MIT BSD-3-Clause Unique
++PKG_LICENSE_FILES:=COPYING COPYING.LGPL COPYING.MIT
++
++PKG_BUILD_DEPENDS:=libiconv
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/dovecot
++ SECTION:=mail
++ CATEGORY:=Mail
++ DEPENDS:=+DOVECOT_LDAP:libopenldap +libopenssl +librt +zlib +libbz2 +libcap
++ TITLE:=An IMAP and POP3 daemon
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++ URL:=http://www.dovecot.org/
++ USERID:=dovecot=59:dovecot=59
++endef
++
++define Package/dovecot/description
++ Dovecot is a program which provides POP3 and IMAP services.
++endef
++
++define Package/dovecot/config
++ menu "Select dovecot build options"
++ depends on PACKAGE_dovecot
++ config DOVECOT_LDAP
++ bool "LDAP support"
++ default n
++ help
++ Implements LDAP support in dovecot.
++ endmenu
++endef
++
++CONFIGURE_ARGS += \
++ --without-gssapi \
++ --without-pam \
++ --with-moduledir=/usr/lib/dovecot/modules \
++ --with-notify=dnotify \
++ --without-lzma \
++ --without-lz4
++
++ifneq ($(strip $(CONFIG_DOVECOT_LDAP)),)
++ CONFIGURE_ARGS+= \
++ --with-ldap=yes
++else
++ CONFIGURE_ARGS+= \
++ --with-ldap=no
++endif
++
++CONFIGURE_VARS += \
++ RPCGEN= \
++ i_cv_signed_size_t=no \
++ i_cv_signed_time_t=no \
++ i_cv_gmtime_max_time_t=32 \
++ i_cv_mmap_plays_with_write=yes \
++ i_cv_fd_passing=yes \
++ i_cv_c99_vsnprintf=yes \
++ lib_cv_va_copy=yes \
++ lib_cv_va_copy=yes \
++ lib_cv___va_copy=yes \
++ lib_cv_va_val_copy=yes
++
++define Package/dovecot/install
++ $(INSTALL_DIR) $(1)/etc/init.d \
++ $(1)/etc/dovecot \
++ $(1)/usr/share/doc/dovecot/example-config \
++ $(1)/usr/lib/dovecot \
++ $(1)/usr/bin \
++ $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/etc/dovecot/* $(1)/etc/dovecot/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/dovecot/* $(1)/usr/lib/dovecot/
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/doc/dovecot/example-config $(1)/usr/share/doc/dovecot/example-config
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/doveconf $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/* $(1)/usr/sbin/
++ $(INSTALL_BIN) ./files/dovecot.init $(1)/etc/init.d/dovecot
++ rm $(1)/usr/lib/dovecot/dovecot-config
++ find $(1)/usr/lib/dovecot/ -name "*.a" -o -name "*.la" | xargs rm
++endef
++
++$(eval $(call BuildPackage,dovecot))
+diff --git a/feeds/packages/mail/dovecot/files/dovecot.init b/feeds/packages/mail/dovecot/files/dovecot.init
+new file mode 100644
+index 0000000..1f83184
+--- /dev/null
++++ b/feeds/packages/mail/dovecot/files/dovecot.init
+@@ -0,0 +1,16 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2013 OpenWrt.org
++
++START=75
++STOP=75
++
++USE_PROCD=1
++
++start_service() {
++ mkdir -p -m 0755 /var/lib/dovecot
++ mkdir -p -m 0755 /var/run/dovecot
++ chmod 0750 /var/lib/dovecot
++ procd_open_instance
++ procd_set_param command /usr/sbin/dovecot -F
++ procd_close_instance
++}
+diff --git a/feeds/packages/mail/dovecot/patches/001-configure_in.patch b/feeds/packages/mail/dovecot/patches/001-configure_in.patch
+new file mode 100644
+index 0000000..70642d6
+--- /dev/null
++++ b/feeds/packages/mail/dovecot/patches/001-configure_in.patch
+@@ -0,0 +1,31 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -504,9 +504,9 @@ have_ioloop=no
++
++ if test "$ioloop" = "best" || test "$ioloop" = "epoll"; then
++ AC_CACHE_CHECK([whether we can use epoll],i_cv_epoll_works,[
++- AC_TRY_RUN([
+++ AC_TRY_LINK([
++ #include <sys/epoll.h>
++-
+++ ], [
++ int main()
++ {
++ return epoll_create(5) < 1;
++@@ -639,7 +639,7 @@ fi
++ dnl * Old glibcs have broken posix_fallocate(). Make sure not to use it.
++ dnl * It may also be broken in AIX.
++ AC_CACHE_CHECK([whether posix_fallocate() works],i_cv_posix_fallocate_works,[
++- AC_TRY_RUN([
+++ AC_TRY_LINK([
++ #define _XOPEN_SOURCE 600
++ #include <stdio.h>
++ #include <stdlib.h>
++@@ -648,6 +648,7 @@ AC_CACHE_CHECK([whether posix_fallocate(
++ #if defined(__GLIBC__) && (__GLIBC__ < 2 || __GLIBC_MINOR__ < 7)
++ possibly broken posix_fallocate
++ #endif
+++ ], [
++ int main() {
++ int fd = creat("conftest.temp", 0600);
++ int ret;
+diff --git a/feeds/packages/mail/fdm/Config.in b/feeds/packages/mail/fdm/Config.in
+new file mode 100644
+index 0000000..084695b
+--- /dev/null
++++ b/feeds/packages/mail/fdm/Config.in
+@@ -0,0 +1,10 @@
++menu "Configuration"
++ depends on PACKAGE_fdm
++
++config FDM_WITH_PCRE
++ bool
++ default y
++ select libpcre
++ prompt "Enable PCRE support (elsewhere POSIX regex)"
++
++endmenu
+diff --git a/feeds/packages/mail/fdm/Makefile b/feeds/packages/mail/fdm/Makefile
+new file mode 100644
+index 0000000..49c02f1
+--- /dev/null
++++ b/feeds/packages/mail/fdm/Makefile
+@@ -0,0 +1,86 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=fdm
++PKG_VERSION:=1.7
++PKG_RELEASE:=1
++PKG_LICENSE:=BSD-2-Clause
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/fdm
++PKG_MD5SUM:=aea0421571e8f3ec8f747a5d72c84348
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/fdm
++ SECTION:=mail
++ CATEGORY:=Mail
++ TITLE:=fetch mail and deliver
++ URL:=http://fdm.sourceforge.net/
++ MAINTAINER:=Dmitry V. Zimin <pfzim@mail.ru>
++ MENU:=1
++ DEPENDS:=+tdb +zlib +libopenssl +FDM_WITH_PCRE:libpcre
++ USERID:=_fdm=99:_fdm=99
++endef
++
++define Package/fdm/description
++ fdm is a simple, lightweight replacement for mail fetch, filter
++ and delivery programs such as fetchmail and procmail. It can
++ fetch using POP3 or IMAP (with SSL) or from stdin, and deliver
++ to a pipe, file, maildir, mbox or SMTP server, based on $(if $(CONFIG_FDM_WITH_PCRE),PCRE,POSIX regexp)
++endef
++
++MAKE_FLAGS += \
++ PREFIX="/usr"\
++ $(if $(CONFIG_FDM_WITH_PCRE),PCRE=1)
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ $(CP) ./src/compat/* $(PKG_BUILD_DIR)/
++endef
++
++define Package/fdm/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/fdm/conffiles
++/etc/fdm.conf
++endef
++
++define Package/fdm/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) ./files/etc/* $(1)/etc/
++ $(INSTALL_DIR) $(1)/opt/fdm
++ chmod a+rwx $(1)/opt/fdm
++endef
++
++define Package/fdm/postinst
++#!/bin/sh
++if [ -z "$${IPKG_INSTROOT}" ]; then
++ echo "Creating cron job template for user _fdm..."
++ (crontab -l -u _fdm 2>/dev/null; echo "# */13 * * * * fdm -q fetch") | crontab -u _fdm -
++ echo "Please, edit file /etc/fdm.conf and enable cron job!"
++fi
++exit 0
++endef
++
++define Package/fdm/prerm
++#!/bin/sh
++if [ -z "$${IPKG_INSTROOT}" ]; then
++ echo "Don't forget disable cron job!"
++ echo "# crontab -r -u _fdm"
++fi
++exit 0
++endef
++
++$(eval $(call BuildPackage,fdm))
+diff --git a/feeds/packages/mail/fdm/files/etc/fdm.conf b/feeds/packages/mail/fdm/files/etc/fdm.conf
+new file mode 100644
+index 0000000..56c9db4
+--- /dev/null
++++ b/feeds/packages/mail/fdm/files/etc/fdm.conf
+@@ -0,0 +1,36 @@
++# /etc/fdm.conf example file
++# 1. Edit this file
++# 2. Test: fdm -vv fetch
++# 3. Enable cron job: crontab -e -u _fdm
++
++set maximum-size 3M
++set delete-oversized
++set queue-high 1
++set queue-low 0
++set purge-after 5
++set unmatched-mail keep
++
++action "drop" drop
++action "keep" keep
++
++action "wakeup" exec "wol -h 192.168.0.255 -p 9 00:11:22:33:44:55"
++action "my-test-action" exec "echo \"OK\" > /tmp/fdm.ok"
++
++# This action extract *.torrent files from incoming email and put it
++# to watch-dir your torrect client application
++
++action "torrent-add" pipe "munpack -f -q -C /your-path/watch-dir/ ; for i in /your-path/watch-dir/*.torrent ; do chmod a+r \$i ; done"
++
++account "xbmc" disabled
++ pop3s
++ server "pop.yandex.ru"
++ port 995
++ user "username-enter-here"
++ pass "password-enter-here"
++ new-only
++ cache "/opt/fdm/cache"
++
++match "^Subject:[ \t]+openwrt:[ \t]*wakeup[ \t]*$" in headers actions { "wakeup" "drop" }
++match "^Subject:[ \t]+openwrt:[ \t]*torrent[ \t]+add[ \t]*\$" in headers actions { "torrent-add" "drop" }
++match "^Subject:[ \t]+openwrt:[ \t]*test[ \t]*$" in headers actions { "my-test-action" "drop" }
++match all action "keep"
+diff --git a/feeds/packages/mail/fdm/patches/001-base64-fix.patch b/feeds/packages/mail/fdm/patches/001-base64-fix.patch
+new file mode 100644
+index 0000000..ad9239b
+--- /dev/null
++++ b/feeds/packages/mail/fdm/patches/001-base64-fix.patch
+@@ -0,0 +1,14 @@
++--- a/fdm.h 2011-10-10 17:36:29.000000000 +0400
+++++ b/fdm.h 2014-11-13 12:56:59.217083683 +0300
++@@ -719,6 +719,11 @@
++ size_t strlcat(char *, const char *, size_t);
++ #endif
++
+++int local_b64_ntop(uint8_t const *src, size_t srclength, char *target,
+++ size_t targsize);
+++
+++int local_b64_pton(char const *src, uint8_t *target, size_t targsize);
+++
++ /* shm.c */
++ char *shm_path(struct shm *);
++ void *shm_create(struct shm *, size_t);
+diff --git a/feeds/packages/mail/fdm/patches/002-base64-fix.patch b/feeds/packages/mail/fdm/patches/002-base64-fix.patch
+new file mode 100644
+index 0000000..7f798a6
+--- /dev/null
++++ b/feeds/packages/mail/fdm/patches/002-base64-fix.patch
+@@ -0,0 +1,20 @@
++--- a/imap-common.c 2011-12-20 00:19:03.000000000 +0400
+++++ b/imap-common.c 2014-11-13 12:56:06.930418446 +0300
++@@ -206,7 +206,7 @@
++
++ size = (strlen(in) * 2) + 1;
++ out = xcalloc(1, size);
++- if (b64_ntop(in, strlen(in), out, size) < 0) {
+++ if (local_b64_ntop(in, strlen(in), out, size) < 0) {
++ xfree(out);
++ return (NULL);
++ }
++@@ -222,7 +222,7 @@
++
++ size = (strlen(in) * 4) + 1;
++ out = xcalloc(1, size);
++- if (b64_pton(in, out, size) < 0) {
+++ if (local_b64_pton(in, out, size) < 0) {
++ xfree(out);
++ return (NULL);
++ }
+diff --git a/feeds/packages/mail/fdm/patches/010-musl_WAIT_ANY.patch b/feeds/packages/mail/fdm/patches/010-musl_WAIT_ANY.patch
+new file mode 100644
+index 0000000..d37bc7f
+--- /dev/null
++++ b/feeds/packages/mail/fdm/patches/010-musl_WAIT_ANY.patch
+@@ -0,0 +1,13 @@
++--- a/fdm.c
+++++ b/fdm.c
++@@ -22,6 +22,10 @@
++ #include <sys/utsname.h>
++ #include <sys/wait.h>
++
+++#ifndef WAIT_ANY
+++#define WAIT_ANY (-1)
+++#endif
+++
++ #include <errno.h>
++ #include <fcntl.h>
++ #include <fnmatch.h>
+diff --git a/feeds/packages/mail/fdm/patches/020-musl_GLOB_BRACE.patch b/feeds/packages/mail/fdm/patches/020-musl_GLOB_BRACE.patch
+new file mode 100644
+index 0000000..2b5683d
+--- /dev/null
++++ b/feeds/packages/mail/fdm/patches/020-musl_GLOB_BRACE.patch
+@@ -0,0 +1,22 @@
++--- a/fetch-maildir.c
+++++ b/fetch-maildir.c
++@@ -31,6 +31,8 @@
++ #include "fdm.h"
++ #include "fetch.h"
++
+++#define GLOB_BRACE 0
+++
++ int fetch_maildir_commit(struct account *, struct mail *);
++ void fetch_maildir_abort(struct account *);
++ u_int fetch_maildir_total(struct account *);
++--- a/fetch-mbox.c
+++++ b/fetch-mbox.c
++@@ -32,6 +32,8 @@
++ #include "fdm.h"
++ #include "fetch.h"
++
+++#define GLOB_BRACE 0
+++
++ int fetch_mbox_commit(struct account *, struct mail *);
++ void fetch_mbox_abort(struct account *);
++ u_int fetch_mbox_total(struct account *);
+diff --git a/feeds/packages/mail/fdm/patches/030-musl_ACCESSPERMS.patch b/feeds/packages/mail/fdm/patches/030-musl_ACCESSPERMS.patch
+new file mode 100644
+index 0000000..b781871
+--- /dev/null
++++ b/feeds/packages/mail/fdm/patches/030-musl_ACCESSPERMS.patch
+@@ -0,0 +1,11 @@
++--- a/file.c
+++++ b/file.c
++@@ -26,6 +26,8 @@
++
++ #include "fdm.h"
++
+++#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO)
+++
++ int mklock(u_int, const char *);
++ void rmlock(u_int, const char *);
++ int lockfd(u_int, int);
+diff --git a/feeds/packages/mail/fdm/src/compat/b64_ntop.c b/feeds/packages/mail/fdm/src/compat/b64_ntop.c
+new file mode 100644
+index 0000000..0d222cf
+--- /dev/null
++++ b/feeds/packages/mail/fdm/src/compat/b64_ntop.c
+@@ -0,0 +1,183 @@
++/*
++ * Copyright (c) 1996, 1998 by Internet Software Consortium.
++ *
++ * Permission to use, copy, modify, and distribute this software for any
++ * purpose with or without fee is hereby granted, provided that the above
++ * copyright notice and this permission notice appear in all copies.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
++ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
++ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
++ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
++ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
++ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
++ * SOFTWARE.
++ */
++
++/*
++ * Portions Copyright (c) 1995 by International Business Machines, Inc.
++ *
++ * International Business Machines, Inc. (hereinafter called IBM) grants
++ * permission under its copyrights to use, copy, modify, and distribute this
++ * Software with or without fee, provided that the above copyright notice and
++ * all paragraphs of this notice appear in all copies, and that the name of IBM
++ * not be used in connection with the marketing of any product incorporating
++ * the Software or modifications thereof, without specific, written prior
++ * permission.
++ *
++ * To the extent it has a right to do so, IBM grants an immunity from suit
++ * under its patents, if any, for the use, sale or manufacture of products to
++ * the extent that such products are used for performing Domain Name System
++ * dynamic updates in TCP/IP networks by means of the Software. No immunity is
++ * granted for any product per se or for any other function of any product.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
++ * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
++ * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
++ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
++ * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
++ */
++//#include <config.h>
++
++#include <sys/types.h>
++#include <sys/param.h>
++#include <sys/socket.h>
++
++#include <netinet/in.h>
++#include <arpa/inet.h>
++
++#include <ctype.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#include "fdm.h"
++
++#define Assert(Cond) if (!(Cond)) abort()
++
++static const char Base64[] =
++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
++static const char Pad64 = '=';
++
++/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
++ The following encoding technique is taken from RFC 1521 by Borenstein
++ and Freed. It is reproduced here in a slightly edited form for
++ convenience.
++
++ A 65-character subset of US-ASCII is used, enabling 6 bits to be
++ represented per printable character. (The extra 65th character, "=",
++ is used to signify a special processing function.)
++
++ The encoding process represents 24-bit groups of input bits as output
++ strings of 4 encoded characters. Proceeding from left to right, a
++ 24-bit input group is formed by concatenating 3 8-bit input groups.
++ These 24 bits are then treated as 4 concatenated 6-bit groups, each
++ of which is translated into a single digit in the base64 alphabet.
++
++ Each 6-bit group is used as an index into an array of 64 printable
++ characters. The character referenced by the index is placed in the
++ output string.
++
++ Table 1: The Base64 Alphabet
++
++ Value Encoding Value Encoding Value Encoding Value Encoding
++ 0 A 17 R 34 i 51 z
++ 1 B 18 S 35 j 52 0
++ 2 C 19 T 36 k 53 1
++ 3 D 20 U 37 l 54 2
++ 4 E 21 V 38 m 55 3
++ 5 F 22 W 39 n 56 4
++ 6 G 23 X 40 o 57 5
++ 7 H 24 Y 41 p 58 6
++ 8 I 25 Z 42 q 59 7
++ 9 J 26 a 43 r 60 8
++ 10 K 27 b 44 s 61 9
++ 11 L 28 c 45 t 62 +
++ 12 M 29 d 46 u 63 /
++ 13 N 30 e 47 v
++ 14 O 31 f 48 w (pad) =
++ 15 P 32 g 49 x
++ 16 Q 33 h 50 y
++
++ Special processing is performed if fewer than 24 bits are available
++ at the end of the data being encoded. A full encoding quantum is
++ always completed at the end of a quantity. When fewer than 24 input
++ bits are available in an input group, zero bits are added (on the
++ right) to form an integral number of 6-bit groups. Padding at the
++ end of the data is performed using the '=' character.
++
++ Since all base64 input is an integral number of octets, only the
++ following cases can arise:
++
++ (1) the final quantum of encoding input is an integral
++ multiple of 24 bits; here, the final unit of encoded
++ output will be an integral multiple of 4 characters
++ with no "=" padding,
++ (2) the final quantum of encoding input is exactly 8 bits;
++ here, the final unit of encoded output will be two
++ characters followed by two "=" padding characters, or
++ (3) the final quantum of encoding input is exactly 16 bits;
++ here, the final unit of encoded output will be three
++ characters followed by one "=" padding character.
++ */
++
++int
++local_b64_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize) {
++ size_t datalength = 0;
++ uint8_t input[3];
++ uint8_t output[4];
++ size_t i;
++
++ while (2 < srclength) {
++ input[0] = *src++;
++ input[1] = *src++;
++ input[2] = *src++;
++ srclength -= 3;
++
++ output[0] = input[0] >> 2;
++ output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
++ output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
++ output[3] = input[2] & 0x3f;
++ Assert(output[0] < 64);
++ Assert(output[1] < 64);
++ Assert(output[2] < 64);
++ Assert(output[3] < 64);
++
++ if (datalength + 4 > targsize)
++ return (-1);
++ target[datalength++] = Base64[output[0]];
++ target[datalength++] = Base64[output[1]];
++ target[datalength++] = Base64[output[2]];
++ target[datalength++] = Base64[output[3]];
++ }
++
++ /* Now we worry about padding. */
++ if (0 != srclength) {
++ /* Get what's left. */
++ input[0] = input[1] = input[2] = '\0';
++ for (i = 0; i < srclength; i++)
++ input[i] = *src++;
++ output[0] = input[0] >> 2;
++ output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
++ output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
++ Assert(output[0] < 64);
++ Assert(output[1] < 64);
++ Assert(output[2] < 64);
++
++ if (datalength + 4 > targsize)
++ return (-1);
++ target[datalength++] = Base64[output[0]];
++ target[datalength++] = Base64[output[1]];
++ if (srclength == 1)
++ target[datalength++] = Pad64;
++ else
++ target[datalength++] = Base64[output[2]];
++ target[datalength++] = Pad64;
++ }
++ if (datalength >= targsize)
++ return (-1);
++ target[datalength] = '\0'; /* Returned value doesn't count \0. */
++ return (datalength);
++}
+diff --git a/feeds/packages/mail/fdm/src/compat/b64_pton.c b/feeds/packages/mail/fdm/src/compat/b64_pton.c
+new file mode 100644
+index 0000000..0e9363a
+--- /dev/null
++++ b/feeds/packages/mail/fdm/src/compat/b64_pton.c
+@@ -0,0 +1,393 @@
++/*
++ * Copyright (c) 1996, 1998 by Internet Software Consortium.
++ *
++ * Permission to use, copy, modify, and distribute this software for any
++ * purpose with or without fee is hereby granted, provided that the above
++ * copyright notice and this permission notice appear in all copies.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
++ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
++ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
++ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
++ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
++ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
++ * SOFTWARE.
++ */
++
++/*
++ * Portions Copyright (c) 1995 by International Business Machines, Inc.
++ *
++ * International Business Machines, Inc. (hereinafter called IBM) grants
++ * permission under its copyrights to use, copy, modify, and distribute this
++ * Software with or without fee, provided that the above copyright notice and
++ * all paragraphs of this notice appear in all copies, and that the name of IBM
++ * not be used in connection with the marketing of any product incorporating
++ * the Software or modifications thereof, without specific, written prior
++ * permission.
++ *
++ * To the extent it has a right to do so, IBM grants an immunity from suit
++ * under its patents, if any, for the use, sale or manufacture of products to
++ * the extent that such products are used for performing Domain Name System
++ * dynamic updates in TCP/IP networks by means of the Software. No immunity is
++ * granted for any product per se or for any other function of any product.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
++ * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
++ * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
++ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
++ * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
++ */
++//#include <config.h>
++
++#include <sys/types.h>
++#include <sys/param.h>
++#include <sys/socket.h>
++
++#include <netinet/in.h>
++#include <arpa/inet.h>
++
++#include <ctype.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#include "fdm.h"
++
++#define Assert(Cond) if (!(Cond)) abort()
++
++static const char Base64[] =
++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
++static const char Pad64 = '=';
++
++/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
++ The following encoding technique is taken from RFC 1521 by Borenstein
++ and Freed. It is reproduced here in a slightly edited form for
++ convenience.
++
++ A 65-character subset of US-ASCII is used, enabling 6 bits to be
++ represented per printable character. (The extra 65th character, "=",
++ is used to signify a special processing function.)
++
++ The encoding process represents 24-bit groups of input bits as output
++ strings of 4 encoded characters. Proceeding from left to right, a
++ 24-bit input group is formed by concatenating 3 8-bit input groups.
++ These 24 bits are then treated as 4 concatenated 6-bit groups, each
++ of which is translated into a single digit in the base64 alphabet.
++
++ Each 6-bit group is used as an index into an array of 64 printable
++ characters. The character referenced by the index is placed in the
++ output string.
++
++ Table 1: The Base64 Alphabet
++
++ Value Encoding Value Encoding Value Encoding Value Encoding
++ 0 A 17 R 34 i 51 z
++ 1 B 18 S 35 j 52 0
++ 2 C 19 T 36 k 53 1
++ 3 D 20 U 37 l 54 2
++ 4 E 21 V 38 m 55 3
++ 5 F 22 W 39 n 56 4
++ 6 G 23 X 40 o 57 5
++ 7 H 24 Y 41 p 58 6
++ 8 I 25 Z 42 q 59 7
++ 9 J 26 a 43 r 60 8
++ 10 K 27 b 44 s 61 9
++ 11 L 28 c 45 t 62 +
++ 12 M 29 d 46 u 63 /
++ 13 N 30 e 47 v
++ 14 O 31 f 48 w (pad) =
++ 15 P 32 g 49 x
++ 16 Q 33 h 50 y
++
++ Special processing is performed if fewer than 24 bits are available
++ at the end of the data being encoded. A full encoding quantum is
++ always completed at the end of a quantity. When fewer than 24 input
++ bits are available in an input group, zero bits are added (on the
++ right) to form an integral number of 6-bit groups. Padding at the
++ end of the data is performed using the '=' character.
++
++ Since all base64 input is an integral number of octets, only the
++ following cases can arise:
++
++ (1) the final quantum of encoding input is an integral
++ multiple of 24 bits; here, the final unit of encoded
++ output will be an integral multiple of 4 characters
++ with no "=" padding,
++ (2) the final quantum of encoding input is exactly 8 bits;
++ here, the final unit of encoded output will be two
++ characters followed by two "=" padding characters, or
++ (3) the final quantum of encoding input is exactly 16 bits;
++ here, the final unit of encoded output will be three
++ characters followed by one "=" padding character.
++ */
++
++/* skips all whitespace anywhere.
++ converts characters, four at a time, starting at (or after)
++ src from base - 64 numbers into three 8 bit bytes in the target area.
++ it returns the number of data bytes stored at the target, or -1 on error.
++ */
++
++static int b64rmap_initialized = 0;
++static uint8_t b64rmap[256];
++
++static const uint8_t b64rmap_special = 0xf0;
++static const uint8_t b64rmap_end = 0xfd;
++static const uint8_t b64rmap_space = 0xfe;
++static const uint8_t b64rmap_invalid = 0xff;
++
++/**
++ * Initializing the reverse map is not thread safe.
++ * Which is fine for NSD. For now...
++ **/
++static void
++b64_initialize_rmap ()
++{
++ int i;
++ char ch;
++
++ /* Null: end of string, stop parsing */
++ b64rmap[0] = b64rmap_end;
++
++ for (i = 1; i < 256; ++i) {
++ ch = (char)i;
++ /* Whitespaces */
++ if (isspace(ch))
++ b64rmap[i] = b64rmap_space;
++ /* Padding: stop parsing */
++ else if (ch == Pad64)
++ b64rmap[i] = b64rmap_end;
++ /* Non-base64 char */
++ else
++ b64rmap[i] = b64rmap_invalid;
++ }
++
++ /* Fill reverse mapping for base64 chars */
++ for (i = 0; Base64[i] != '\0'; ++i)
++ b64rmap[(uint8_t)Base64[i]] = i;
++
++ b64rmap_initialized = 1;
++}
++
++static int
++b64_pton_do(char const *src, uint8_t *target, size_t targsize)
++{
++ int tarindex, state, ch;
++ uint8_t ofs;
++
++ state = 0;
++ tarindex = 0;
++
++ while (1)
++ {
++ ch = *src++;
++ ofs = b64rmap[ch];
++
++ if (ofs >= b64rmap_special) {
++ /* Ignore whitespaces */
++ if (ofs == b64rmap_space)
++ continue;
++ /* End of base64 characters */
++ if (ofs == b64rmap_end)
++ break;
++ /* A non-base64 character. */
++ return (-1);
++ }
++
++ switch (state) {
++ case 0:
++ if ((size_t)tarindex >= targsize)
++ return (-1);
++ target[tarindex] = ofs << 2;
++ state = 1;
++ break;
++ case 1:
++ if ((size_t)tarindex + 1 >= targsize)
++ return (-1);
++ target[tarindex] |= ofs >> 4;
++ target[tarindex+1] = (ofs & 0x0f)
++ << 4 ;
++ tarindex++;
++ state = 2;
++ break;
++ case 2:
++ if ((size_t)tarindex + 1 >= targsize)
++ return (-1);
++ target[tarindex] |= ofs >> 2;
++ target[tarindex+1] = (ofs & 0x03)
++ << 6;
++ tarindex++;
++ state = 3;
++ break;
++ case 3:
++ if ((size_t)tarindex >= targsize)
++ return (-1);
++ target[tarindex] |= ofs;
++ tarindex++;
++ state = 0;
++ break;
++ default:
++ abort();
++ }
++ }
++
++ /*
++ * We are done decoding Base-64 chars. Let's see if we ended
++ * on a byte boundary, and/or with erroneous trailing characters.
++ */
++
++ if (ch == Pad64) { /* We got a pad char. */
++ ch = *src++; /* Skip it, get next. */
++ switch (state) {
++ case 0: /* Invalid = in first position */
++ case 1: /* Invalid = in second position */
++ return (-1);
++
++ case 2: /* Valid, means one byte of info */
++ /* Skip any number of spaces. */
++ for ((void)NULL; ch != '\0'; ch = *src++)
++ if (b64rmap[ch] != b64rmap_space)
++ break;
++ /* Make sure there is another trailing = sign. */
++ if (ch != Pad64)
++ return (-1);
++ ch = *src++; /* Skip the = */
++ /* Fall through to "single trailing =" case. */
++ /* FALLTHROUGH */
++
++ case 3: /* Valid, means two bytes of info */
++ /*
++ * We know this char is an =. Is there anything but
++ * whitespace after it?
++ */
++ for ((void)NULL; ch != '\0'; ch = *src++)
++ if (b64rmap[ch] != b64rmap_space)
++ return (-1);
++
++ /*
++ * Now make sure for cases 2 and 3 that the "extra"
++ * bits that slopped past the last full byte were
++ * zeros. If we don't check them, they become a
++ * subliminal channel.
++ */
++ if (target[tarindex] != 0)
++ return (-1);
++ }
++ } else {
++ /*
++ * We ended by seeing the end of the string. Make sure we
++ * have no partial bytes lying around.
++ */
++ if (state != 0)
++ return (-1);
++ }
++
++ return (tarindex);
++}
++
++
++static int
++b64_pton_len(char const *src)
++{
++ int tarindex, state, ch;
++ uint8_t ofs;
++
++ state = 0;
++ tarindex = 0;
++
++ while (1)
++ {
++ ch = *src++;
++ ofs = b64rmap[ch];
++
++ if (ofs >= b64rmap_special) {
++ /* Ignore whitespaces */
++ if (ofs == b64rmap_space)
++ continue;
++ /* End of base64 characters */
++ if (ofs == b64rmap_end)
++ break;
++ /* A non-base64 character. */
++ return (-1);
++ }
++
++ switch (state) {
++ case 0:
++ state = 1;
++ break;
++ case 1:
++ tarindex++;
++ state = 2;
++ break;
++ case 2:
++ tarindex++;
++ state = 3;
++ break;
++ case 3:
++ tarindex++;
++ state = 0;
++ break;
++ default:
++ abort();
++ }
++ }
++
++ /*
++ * We are done decoding Base-64 chars. Let's see if we ended
++ * on a byte boundary, and/or with erroneous trailing characters.
++ */
++
++ if (ch == Pad64) { /* We got a pad char. */
++ ch = *src++; /* Skip it, get next. */
++ switch (state) {
++ case 0: /* Invalid = in first position */
++ case 1: /* Invalid = in second position */
++ return (-1);
++
++ case 2: /* Valid, means one byte of info */
++ /* Skip any number of spaces. */
++ for ((void)NULL; ch != '\0'; ch = *src++)
++ if (b64rmap[ch] != b64rmap_space)
++ break;
++ /* Make sure there is another trailing = sign. */
++ if (ch != Pad64)
++ return (-1);
++ ch = *src++; /* Skip the = */
++ /* Fall through to "single trailing =" case. */
++ /* FALLTHROUGH */
++
++ case 3: /* Valid, means two bytes of info */
++ /*
++ * We know this char is an =. Is there anything but
++ * whitespace after it?
++ */
++ for ((void)NULL; ch != '\0'; ch = *src++)
++ if (b64rmap[ch] != b64rmap_space)
++ return (-1);
++
++ }
++ } else {
++ /*
++ * We ended by seeing the end of the string. Make sure we
++ * have no partial bytes lying around.
++ */
++ if (state != 0)
++ return (-1);
++ }
++
++ return (tarindex);
++}
++
++
++int
++local_b64_pton(char const *src, uint8_t *target, size_t targsize)
++{
++ if (!b64rmap_initialized)
++ b64_initialize_rmap ();
++
++ if (target)
++ return b64_pton_do (src, target, targsize);
++ else
++ return b64_pton_len (src);
++}
+diff --git a/feeds/packages/mail/mailman/Makefile b/feeds/packages/mail/mailman/Makefile
+new file mode 100644
+index 0000000..eee50f8
+--- /dev/null
++++ b/feeds/packages/mail/mailman/Makefile
+@@ -0,0 +1,126 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mailman
++PKG_RELEASE:=1
++PKG_SOURCE_URL:=ftp://ftp.gnu.org/gnu/mailman/ http://ftp.gnu.org/gnu/mailman/
++PKG_VERSION:=2.1.20
++PKG_MD5SUM:=96819640406f90a12bc28edd3dc09d4a
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tgz
++PKG_MAINTAINER:=Denis Shulyaka <Shulyaka@gmail.com>
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=gnu-COPYING-GPL
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mailman
++ SECTION:=mail
++ CATEGORY:=Mail
++ TITLE:=The GNU Mailing List Manager
++ URL:=http://www.gnu.org/software/mailman/
++ DEPENDS:=+postfix +python +uhttpd +python-dns
++endef
++
++define Package/mailman/description
++ Mailman is free software for managing electronic mail discussion and e-newsletter lists.
++endef
++
++prefix=/usr/local/mailman
++
++define Package/mailman/conffiles
++$(prefix)/Mailman/mm_cfg.py
++endef
++
++CONFIGURE_ARGS += \
++ --prefix="$(prefix)" \
++ --exec-prefix="$(prefix)" \
++ --with-username="root" \
++ --with-groupname="root" \
++ --with-mail-gid="nogroup" \
++ --with-cgi-gid="root" \
++ --without-permcheck \
++
++define Build/Compile
++endef
++
++define Package/mailman/install
++ $(INSTALL_DIR) $(1)$(prefix)
++ cd $(PKG_BUILD_DIR); $(MAKE) DESTDIR=$(1) install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/mailman.init $(1)/etc/init.d/mailman
++ $(INSTALL_DIR) $(1)/usr/www
++ ln -s $(prefix)/cgi-bin/ $(1)/usr/www/mailman
++ ln -s $(prefix)/archives/public/ $(1)/usr/www/pipermail
++ ln -s $(prefix)/icons $(1)/usr/www/icons
++endef
++
++define Package/mailman/postinst
++#!/bin/sh
++# check if we are on real system
++if [ -z "$${IPKG_INSTROOT}" ]; then
++
++ if [ `postconf alias_maps | grep -ci mailman` -eq 0 ]
++ then
++ postconf -e "`postconf alias_maps`, cdb:$(prefix)/data/aliases"
++ fi
++ cd $(prefix)
++ hostname=`cat /proc/sys/kernel/hostname`
++ if [ ! -f data/aliases ]
++ then
++ ./bin/genaliases
++ fi
++ newaliases
++ if [ `grep -c DEFAULT_URL_HOST Mailman/mm_cfg.py` -eq 0 ]
++ then
++ echo "DEFAULT_EMAIL_HOST = '$$hostname'" >> Mailman/mm_cfg.py
++ echo "DEFAULT_URL_HOST = '$$hostname'" >> Mailman/mm_cfg.py
++ echo "add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)" >> Mailman/mm_cfg.py
++ echo "QRUNNERS.remove(('NewsRunner',1))" >> Mailman/mm_cfg.py
++ fi
++ if [ `./bin/list_lists | grep -ci mailman` -eq 0 ]
++ then
++ ./bin/newlist --urlhost=$$hostname --emailhost=$$hostname --quiet mailman root@$$hostname mailman
++ ./bin/config_list -i data/sitelist.cfg mailman
++ echo "NOTE: A default site-wide mailing list Mailman with password 'mailman' has been created. Please review it and change the password."
++ ./bin/mmsitepass mailman
++ echo "NOTE: The default site password 'mailman' has been created."
++ fi
++ # /etc/init.d/mailman enable
++ if [ `ps | grep "mailman/bin/qrunner" | grep -cv grep` -gt 0 ]
++ then
++ $(prefix)/bin/mailmanctl -q restart
++ fi
++ if [ `grep -c mailman /etc/config/uhttpd` -eq 0 ]
++ then #we assume that the server is not configured yet, thus print out some help for the first time:
++ echo "NOTE: Please set the site password using $(prefix)/bin/mmsitepass <your-site-password>"
++ echo "Please add uhttpd config section to your /etc/config/uhttpd like this:"
++ echo "config uhttpd mailman"
++ echo " list listen_http 0.0.0.0:80"
++ echo " option home /usr/www"
++ echo " option cgi_prefix /mailman"
++ echo " no_symlinks 0"
++ echo "Don't forget to setup firewall for accessing this website!"
++ echo "To add a mailing list go to http://$$hostname/mailman/create."
++ fi
++fi
++endef
++
++define Package/mailman/prerm
++#!/bin/sh
++# check if we are on real system
++if [ -z "$${IPKG_INSTROOT}" ]; then
++
++ if [ `ps | grep "mailman/bin/qrunner" | grep -cv grep` -gt 0 ]
++ then
++ $(prefix)/bin/mailmanctl stop
++ fi
++fi
++endef
++
++$(eval $(call BuildPackage,mailman))
+diff --git a/feeds/packages/mail/mailman/files/mailman.init b/feeds/packages/mail/mailman/files/mailman.init
+new file mode 100644
+index 0000000..f68a456
+--- /dev/null
++++ b/feeds/packages/mail/mailman/files/mailman.init
+@@ -0,0 +1,22 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=50
++STOP=50
++
++PYTHON=/usr/bin/python
++MAILMANHOME=/usr/local/mailman
++MAILMANCTL=$MAILMANHOME/bin/mailmanctl
++
++start() {
++ #rm -f $MAILMANHOME/locks/*
++ $PYTHON $MAILMANCTL -s -q start
++}
++
++stop() {
++ $PYTHON $MAILMANCTL -q stop
++}
++
++restart() {
++ $PYTHON $MAILMANCTL -q restart
++}
+diff --git a/feeds/packages/mail/mailman/patches/100-postfix.patch b/feeds/packages/mail/mailman/patches/100-postfix.patch
+new file mode 100644
+index 0000000..22fec1e
+--- /dev/null
++++ b/feeds/packages/mail/mailman/patches/100-postfix.patch
+@@ -0,0 +1,12 @@
++diff -rupN mailman-2.1.14-1/Mailman/Defaults.py.in mailman-2.1.14-1_patched/Mailman/Defaults.py.in
++--- mailman-2.1.14-1/Mailman/Defaults.py.in 2011-03-01 23:35:57.000000000 +0300
+++++ mailman-2.1.14-1_patched/Mailman/Defaults.py.in 2011-03-09 12:26:10.000000000 +0300
++@@ -461,7 +461,7 @@ DELIVERY_MODULE = 'SMTPDirect'
++ # standard out (or send an email to the site list owner) for manual twiddling
++ # of an /etc/aliases style file. Use 'Postfix' if you are using the Postfix
++ # MTA -- but then also see POSTFIX_STYLE_VIRTUAL_DOMAINS.
++-MTA = 'Manual'
+++MTA = 'Postfix'
++
++ # If you set MTA='Postfix', then you also want to set the following variable,
++ # depending on whether you're using virtual domains in Postfix, and which
+diff --git a/feeds/packages/mail/mailman/patches/200-nohostdnspython.patch b/feeds/packages/mail/mailman/patches/200-nohostdnspython.patch
+new file mode 100644
+index 0000000..e321106
+--- /dev/null
++++ b/feeds/packages/mail/mailman/patches/200-nohostdnspython.patch
+@@ -0,0 +1,68 @@
++diff -Naur mailman-2.1.18-1/configure mailman-2.1.18-1_patched/configure
++--- mailman-2.1.18-1/configure 2014-10-26 12:00:38.090360119 +0300
+++++ mailman-2.1.18-1_patched/configure 2014-10-26 12:00:21.323016430 +0300
++@@ -2236,35 +2236,35 @@
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $version" >&5
++ $as_echo "$version" >&6; }
++
++-# See if dnspython is installed.
++-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dnspython" >&5
++-$as_echo_n "checking dnspython... " >&6; }
++-
++-cat > conftest.py <<EOF
++-try:
++- import dns.resolver
++- res = 'ok'
++-except ImportError:
++- res = 'no'
++-fp = open("conftest.out", "w")
++-fp.write("%s\n" % res)
++-fp.close()
++-EOF
++-
++-$PYTHON conftest.py
++-havednspython=`cat conftest.out`
++-rm -f conftest.out conftest.py
++-if test "$havednspython" = "no"
++-then
++- as_fn_error $? "
++-
++-***** dnspython not found. It is required for the new
++-***** dmarc_moderation_action featurer. Get it from
++-***** <http://www.dnspython.org/> or
++-***** <https://pypi.python.org/pypi/dnspython/>" "$LINENO" 5
++-fi
++-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $havednspython" >&5
++-$as_echo "$havednspython" >&6; }
+++## See if dnspython is installed.
+++#{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dnspython" >&5
+++#$as_echo_n "checking dnspython... " >&6; }
+++#
+++#cat > conftest.py <<EOF
+++#try:
+++# import dns.resolver
+++# res = 'ok'
+++#except ImportError:
+++# res = 'no'
+++#fp = open("conftest.out", "w")
+++#fp.write("%s\n" % res)
+++#fp.close()
+++#EOF
+++#
+++#$PYTHON conftest.py
+++#havednspython=`cat conftest.out`
+++#rm -f conftest.out conftest.py
+++#if test "$havednspython" = "no"
+++#then
+++# as_fn_error $? "
+++#
+++#***** dnspython not found. It is required for the new
+++#***** dmarc_moderation_action featurer. Get it from
+++#***** <http://www.dnspython.org/> or
+++#***** <https://pypi.python.org/pypi/dnspython/>" "$LINENO" 5
+++#fi
+++#{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $havednspython" >&5
+++#$as_echo "$havednspython" >&6; }
++
++ # Check the email package version.
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking Python's email package" >&5
+diff --git a/feeds/packages/mail/mailman/patches/300-targetpython.patch b/feeds/packages/mail/mailman/patches/300-targetpython.patch
+new file mode 100644
+index 0000000..1dd2859
+--- /dev/null
++++ b/feeds/packages/mail/mailman/patches/300-targetpython.patch
+@@ -0,0 +1,12 @@
++diff -Naur mailman-2.1.18-1/configure mailman-2.1.18-1_patched/configure
++--- mailman-2.1.18-1/configure 2014-05-06 20:43:56.000000000 +0400
+++++ mailman-2.1.18-1_patched/configure 2014-11-04 15:02:32.892666331 +0300
++@@ -3927,6 +3927,8 @@
++ $as_echo "$URLHOST" >&6; }
++ rm -f conftest.out conftest.py
++
+++PYTHON=/usr/bin/python
+++
++ # Checks for libraries.
++
++ for ac_func in strerror setregid syslog
+diff --git a/feeds/packages/mail/mailman/patches/400-modules.patch b/feeds/packages/mail/mailman/patches/400-modules.patch
+new file mode 100644
+index 0000000..9fa72a2
+--- /dev/null
++++ b/feeds/packages/mail/mailman/patches/400-modules.patch
+@@ -0,0 +1,35 @@
++diff -Naur mailman-2.1.18-1/Mailman/MailList.py mailman-2.1.18-1_patched/Mailman/MailList.py
++--- mailman-2.1.18-1/Mailman/MailList.py 2014-05-06 20:43:56.000000000 +0400
+++++ mailman-2.1.18-1_patched/Mailman/MailList.py 2014-11-04 15:57:06.832636147 +0300
++@@ -30,7 +30,7 @@
++ import shutil
++ import socket
++ import urllib
++-import cPickle
+++import pickle as cPickle
++
++ from cStringIO import StringIO
++ from UserDict import UserDict
++diff -Naur mailman-2.1.18-1/misc/paths.py.in mailman-2.1.18-1_patched/misc/paths.py.in
++--- mailman-2.1.18-1/misc/paths.py.in 2014-05-06 20:43:56.000000000 +0400
+++++ mailman-2.1.18-1_patched/misc/paths.py.in 2014-11-04 15:55:49.594941540 +0300
++@@ -66,14 +66,14 @@
++ # In a normal interactive Python environment, the japanese.pth and korean.pth
++ # files would be imported automatically. But because we inhibit the importing
++ # of the site module, we need to be explicit about importing these codecs.
++-if not jaok:
++- import japanese
+++#if not jaok:
+++# import japanese
++ # As of KoreanCodecs 2.0.5, you had to do the second import to get the Korean
++ # codecs installed, however leave the first import in there in case an upgrade
++ # changes this.
++-if not kook:
++- import korean
++- import korean.aliases
+++#if not kook:
+++# import korean
+++# import korean.aliases
++ # Arabic and Hebrew (RFC-1556) encoding aliases. (temporary solution)
++ import encodings.aliases
++ encodings.aliases.aliases.update({
+diff --git a/feeds/packages/mail/mailsend/Makefile b/feeds/packages/mail/mailsend/Makefile
+new file mode 100644
+index 0000000..f9480f1
+--- /dev/null
++++ b/feeds/packages/mail/mailsend/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mailsend
++PKG_VERSION:=1.17b15
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/muquit/mailsend/archive/$(PKG_VERSION)
++PKG_MD5SUM:=60103c411a8627e893d35e7836f904e8
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=COPYRIGHT
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mailsend/default
++ SECTION:=mail
++ CATEGORY:=Mail
++ TITLE:=A command-line mail sender
++ URL:=https://github.com/muquit/mailsend
++endef
++
++define Package/mailsend-nossl
++ $(call Package/mailsend/default)
++ TITLE+= (without SSL)
++ VARIANT:=nossl
++endef
++
++define Package/mailsend
++ $(call Package/mailsend/default)
++ TITLE+= (with SSL)
++ DEPENDS:=+libopenssl
++ VARIANT:=ssl
++endef
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS+= --with-openssl=$(STAGING_DIR)/usr
++endif
++
++define Package/mailsend/description
++ $(call Package/mailsend-nossl/description)
++ .
++ SSL supported is provided by OpenSSL.
++endef
++
++define Package/mailsend-nossl/description
++ Mailsend is a simple command line program to send mail via SMTP protocol.
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)
++endef
++
++define Package/mailsend/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/mailsend $(1)/usr/bin/
++endef
++
++Package/mailsend-nossl/install=$(Package/mailsend/install)
++
++$(eval $(call BuildPackage,mailsend))
++$(eval $(call BuildPackage,mailsend-nossl))
+diff --git a/feeds/packages/mail/msmtp/Makefile b/feeds/packages/mail/msmtp/Makefile
+new file mode 100644
+index 0000000..9a29f5c
+--- /dev/null
++++ b/feeds/packages/mail/msmtp/Makefile
+@@ -0,0 +1,141 @@
++#
++# Copyright (C) 2009 David Cooper <dave@kupesoft.com>
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=msmtp
++PKG_VERSION:=1.6.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@SF/msmtp
++PKG_MD5SUM:=3baca93c7e5f1aa9d36a2e5b38739ab9
++
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/msmtp/Default
++ SECTION:=mail
++ CATEGORY:=Mail
++ TITLE:=Simple sendmail SMTP forwarding
++ URL:=http://msmtp.sourceforge.net/
++endef
++
++define Package/msmtp/Default/description
++ msmtp is an SMTP client. In the default mode, it transmits a mail to
++ an SMTP server (for example at a free mail provider) which does the
++ delivery. To use this program with your mail user agent (MUA), create
++ a configuration file with your mail account(s) and tell your MUA to
++ call msmtp instead of /usr/sbin/sendmail.
++endef
++
++define Package/msmtp
++$(call Package/msmtp/Default)
++ DEPENDS+= +libopenssl
++ TITLE+= (with SSL support)
++ VARIANT:=ssl
++endef
++
++define Package/msmtp/conffiles
++/etc/msmtprc
++endef
++
++define Package/msmtp/description
++$(call Package/msmtp/Default/description)
++ This package is built with SSL support.
++endef
++
++define Package/msmtp-nossl
++$(call Package/msmtp/Default)
++ TITLE+= (without SSL support)
++ VARIANT:=nossl
++endef
++
++define Package/msmtp-nossl/description
++$(call Package/msmtp/Default/description)
++ This package is built without SSL support.
++endef
++
++define Package/msmtp-queue
++$(call Package/msmtp/Default)
++ DEPENDS+= +bash
++ TITLE+= (queue scripts)
++endef
++
++define Package/msmtp-queue/description
++$(call Package/msmtp/Default/description)
++ This package contains the msmtp queue scripts.
++endef
++
++CONFIGURE_ARGS += \
++ --disable-rpath \
++ --without-libintl-prefix \
++ --without-libgsasl \
++ --without-libidn \
++ --without-libsecret \
++ --without-macosx-keyring \
++
++ifneq ($(CONFIG_USE_UCLIBC),)
++ CONFIGURE_ARGS += --disable-gai-idn
++endif
++
++MAKE_FLAGS :=
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS += \
++ --with-tls=openssl
++endif
++
++ifeq ($(BUILD_VARIANT),nossl)
++ CONFIGURE_ARGS += \
++ --with-tls=no
++endif
++
++define Package/msmtp/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/doc/msmtprc-system.example \
++ $(1)/etc/msmtprc
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/msmtp $(1)/usr/bin/
++endef
++
++define Package/msmtp/postinst
++ [ -e $${IPKG_INSTROOT}/usr/sbin/sendmail ] || {
++ mkdir -p $${IPKG_INSTROOT}/usr/sbin
++ ln -sf ../bin/msmtp $${IPKG_INSTROOT}/usr/sbin/sendmail
++ }
++endef
++
++define Package/msmtp/prerm
++ [ "../bin/msmtp" = "$(readlink -qs $${IPKG_INSTROOT}/usr/sbin/sendmail)" ] && {
++ rm -f $${IPKG_INSTROOT}/usr/sbin/sendmail
++ }
++endef
++
++Package/msmtp-nossl/conffiles = $(Package/msmtp/conffiles)
++Package/msmtp-nossl/install = $(Package/msmtp/install)
++Package/msmtp-nossl/postinst = $(Package/msmtp/postinst)
++Package/msmtp-nossl/prerm = $(Package/msmtp/prerm)
++
++define Package/msmtp-queue/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/msmtpq/msmtp{q,-queue} $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/msmtpqueue/msmtp-{en,list,run}queue.sh $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,msmtp))
++$(eval $(call BuildPackage,msmtp-nossl))
++$(eval $(call BuildPackage,msmtp-queue))
+diff --git a/feeds/packages/mail/nail/Makefile b/feeds/packages/mail/nail/Makefile
+new file mode 100644
+index 0000000..541d203
+--- /dev/null
++++ b/feeds/packages/mail/nail/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=nail
++PKG_VERSION:=12.5
++PKG_RELEASE:=1
++PKG_LICENSE:=BSD-2-Clause
++
++PKG_SOURCE:=heirloom-mailx_$(PKG_VERSION).orig.tar.gz
++PKG_SOURCE_URL:=http://ftp.de.debian.org/debian/pool/main/h/heirloom-mailx/
++PKG_MD5SUM:=29a6033ef1412824d02eb9d9213cb1f2
++PKG_BUILD_DIR:=$(BUILD_DIR)/heirloom-mailx-$(PKG_VERSION)
++
++PKG_INSTALL:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/nail
++ SECTION:=mail
++ CATEGORY:=Mail
++ TITLE:=Heirloom mailx (nail)
++ URL:=http://heirloom.sourceforge.net/mailx.html
++ MAINTAINER:=Dmitry V. Zimin <pfzim@mail.ru>
++ DEPENDS:=+libopenssl
++endef
++
++define Package/nail/description
++ Heirloom mailx (formerly known as "nail") is intended provide
++ the functionality of the POSIX mailx command with additional
++ support for MIME messages, IMAP (including caching), POP3,
++ SMTP, S/MIME, message threading/sorting, scoring, and filtering
++endef
++
++define Package/nail/conffiles
++/etc/nail.rc
++endef
++
++define Build/Install
++ $(INSTALL_DIR) $(PKG_INSTALL_DIR)/usr/bin
++ $(CP) $(PKG_BUILD_DIR)/mailx $(PKG_INSTALL_DIR)/usr/bin/
++ $(INSTALL_DIR) $(PKG_INSTALL_DIR)/etc
++ $(CP) $(PKG_BUILD_DIR)/nail.rc $(PKG_INSTALL_DIR)/etc/
++endef
++
++define Package/nail/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/etc/* $(1)/etc/
++endef
++
++$(eval $(call BuildPackage,nail))
++
+diff --git a/feeds/packages/mail/nail/patches/100-handle-openssl-without-sslv2.patch b/feeds/packages/mail/nail/patches/100-handle-openssl-without-sslv2.patch
+new file mode 100644
+index 0000000..4352fe8
+--- /dev/null
++++ b/feeds/packages/mail/nail/patches/100-handle-openssl-without-sslv2.patch
+@@ -0,0 +1,16 @@
++--- a/openssl.c
+++++ b/openssl.c
++@@ -216,9 +216,12 @@ ssl_select_method(const char *uhp)
++
++ cp = ssl_method_string(uhp);
++ if (cp != NULL) {
+++#ifndef OPENSSL_NO_SSL2
++ if (equal(cp, "ssl2"))
++ method = SSLv2_client_method();
++- else if (equal(cp, "ssl3"))
+++ else
+++#endif
+++ if (equal(cp, "ssl3"))
++ method = SSLv3_client_method();
++ else if (equal(cp, "tls1"))
++ method = TLSv1_client_method();
+diff --git a/feeds/packages/mail/postfix/Makefile b/feeds/packages/mail/postfix/Makefile
+new file mode 100644
+index 0000000..bcbb07a
+--- /dev/null
++++ b/feeds/packages/mail/postfix/Makefile
+@@ -0,0 +1,243 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=postfix
++PKG_RELEASE:=2
++PKG_SOURCE_URL:=ftp://ftp.porcupine.org/mirrors/postfix-release/official/
++PKG_VERSION:=3.0.1
++PKG_MD5SUM:=3ec1416e7d4fba9566297c8fcf7a348c
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MAINTAINER:=Denis Shulyaka <Shulyaka@gmail.com>
++PKG_LICENSE:=IPL-1.0
++PKG_LICENSE_FILES:=LICENSE
++PKG_BUILD_DEPENDS:=+POSTFIX_CDB:tinycdb
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/postfix
++ SECTION:=mail
++ CATEGORY:=Mail
++ TITLE:=Postfix Mail Transmit Agent
++ URL:=http://www.postfix.org/
++ DEPENDS:=+POSTFIX_TLS:libopenssl +POSTFIX_SASL:libsasl2 +POSTFIX_LDAP:libopenldap +POSTFIX_DB:libdb47 +libpcre
++endef
++
++define Package/postfix/description
++ Postfix is Wietse Venema's mailer that started life as an alternative to the widely-used Sendmail program. Postfix attempts to be fast, easy to administer, and secure, while at the same time being sendmail compatible enough to not upset existing users. Thus, the outside has a sendmail-ish flavor, but the inside is completely different.
++endef
++
++define Package/postfix/config
++ menu "Select postfix build options"
++ config POSTFIX_TLS
++ bool "TLS support"
++ default y
++ help
++ Implements TLS support in postfix (using OpenSSL).
++ config POSTFIX_SASL
++ bool "SASL support"
++ default y
++ help
++ Implements SASL support in postfix (using Cyrus SASL).
++ config POSTFIX_LDAP
++ bool "LDAP support"
++ default y
++ help
++ Implements LDAP support in postfix (using OpenLDAP).
++ config POSTFIX_DB
++ bool "BerkeleyDB support"
++ default n
++ help
++ Implements support for btree files using Berkeley DB. Note that hash files support is not compiled into Berkeley DB OpenWRT distribution
++ config POSTFIX_CDB
++ bool "CDB support"
++ default y
++ help
++ Implements support for cdb files using tinycdb
++ endmenu
++endef
++
++CCARGS=-DNO_EPOLL -DNO_SIGSETJMP -DNO_NIS -DNO_EAI
++AUXLIBS=-L$(STAGING_DIR)/usr/lib
++default_database_type=cdb
++
++ifdef CONFIG_POSTFIX_TLS
++ CCARGS+=-DUSE_TLS
++ AUXLIBS+=-lssl -lcrypto
++endif
++
++ifdef CONFIG_POSTFIX_SASL
++ CCARGS+=-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I$(STAGING_DIR)/usr/include/sasl
++ AUXLIBS+=-lsasl2
++endif
++
++ifdef CONFIG_POSTFIX_LDAP
++ CCARGS+=-DHAS_LDAP
++ AUXLIBS+=-lldap -llber
++endif
++
++ifdef CONFIG_POSTFIX_CDB
++ CCARGS+=-DHAS_CDB
++ AUXLIBS+=-lcdb
++endif
++
++ifdef CONFIG_POSTFIX_DB
++ AUXLIBS+=-ldb
++ CCARGS+=-DHAS_DB
++ ifndef CONFIG_POSTFIX_CDB
++ default_database_type=btree
++ endif
++else
++ CCARGS+=-DNO_DB
++endif
++
++CCARGS+=-DDEF_DB_TYPE=\"$(default_database_type)\"
++
++config_directory=/etc/postfix# also add this to postfix init file
++sample_directory=/etc/postfix
++command_directory=/usr/sbin
++daemon_directory=/usr/libexec/postfix
++data_directory=/usr/var/lib/postfix
++queue_directory=/usr/var/spool/postfix
++mail_spool_directory=/usr/var/mail
++html_directory=no
++manpage_directory=no
++readme_directory=no
++sendmail_path=/usr/sbin/sendmail
++newaliases_path=/usr/bin/newaliases
++mailq_path=/usr/bin/mailq
++shlib_directory=/usr/lib/postfix
++meta_directory=/etc/postfix
++
++ln_suffix=.postfix
++ln_old_suffix=.old
++
++define Package/postfix/conffiles
++$(config_directory)/main.cf
++$(config_directory)/master.cf
++$(config_directory)/aliases
++endef
++
++define Build/Configure
++ if [ "$(CONFIG_POSTFIX_DB)" = "" -a "$(CONFIG_POSTFIX_CDB)" = "" ]; then\
++ echo "Build error: You must select at least one of the DB types";\
++ exit 1;\
++ fi
++
++ cd $(PKG_BUILD_DIR); $(MAKE) makefiles CCARGS='$(CCARGS)' $(TARGET_CONFIGURE_OPTS) AUXLIBS="$(AUXLIBS)"
++endef
++
++# Steps to regenerate files/main.cf.default:
++#
++# 1. Compile the package with current file
++# 2. Execute the following command on target device:
++# postconf -d > /tmp/main.cf.new
++# 3. Transfer /tmp/main.cf.new file to the build system
++# 4. Execute the following command:
++# cat /tmp/main.cf.new | ( echo '# DO NOT EDIT THIS FILE. EDIT THE MAIN.CF FILE INSTEAD. THE'; echo '# TEXT HERE JUST SHOWS DEFAULT SETTINGS BUILT INTO POSTFIX.'; echo '#'; grep -v ^alias_maps\ = |grep -v ^alias_database\ = |grep -v ^command_directory\ = |grep -v ^config_directory\ = |grep -v ^daemon_directory\ = |grep -v ^data_directory\ = |grep -v ^default_database_type\ = |grep -v ^html_directory\ = |grep -v ^mail_spool_directory\ = |grep -v ^mailq_path\ = |grep -v ^manpage_directory\ = |grep -v ^meta_directory\ = |grep -v ^mydomain\ = |grep -v ^myhostname\ = |grep -v ^mynetworks\ = |grep -v ^mynetworks_style\ = |grep -v ^newaliases_path\ = |grep -v ^queue_directory\ = |grep -v ^readme_directory\ = |grep -v ^sample_directory\ = |grep -v ^sendmail_path\ = |grep -v ^shlib_directory\ = |grep -v ^smtputf8_enable\ = ) > files/main.cf.default
++# 5. Done. Now you can rebuild the package with new main.cf.default.
++#
++
++define Build/Compile
++ # Currently postfix has a bug with Makefiles that CCARGS are not passed to the compiler, so we are copying them to CC
++ cd $(PKG_BUILD_DIR); $(MAKE) $(TARGET_CONFIGURE_OPTS) CC='$(TARGET_CC) $(CCARGS)'
++ cp ./files/main.cf.default $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "default_database_type = $(default_database_type)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "alias_database = $(default_database_type):$(config_directory)/aliases" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "alias_maps = $(default_database_type):$(config_directory)/aliases" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "sendmail_path = $(sendmail_path)$(ln_suffix)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "newaliases_path = $(newaliases_path)$(ln_suffix)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "mailq_path = $(mailq_path)$(ln_suffix)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "html_directory = $(html_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "manpage_directory = $(manpage_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "sample_directory = $(sample_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "readme_directory = $(readme_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "command_directory = $(command_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "daemon_directory = $(daemon_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "data_directory = $(data_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "queue_directory = $(queue_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "config_directory = $(config_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "mail_spool_directory = $(mail_spool_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "shlib_directory = $(shlib_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "meta_directory = $(meta_directory)" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++ echo "smtputf8_enable = no" >> $(PKG_BUILD_DIR)/conf/main.cf.default
++endef
++
++define Package/postfix/install
++ cd $(PKG_BUILD_DIR); $(MAKE) install_root=$(1) command_directory=$(command_directory) daemon_directory=$(daemon_directory) data_directory=$(data_directory) html_directory=$(html_directory) mail_owner=postfix mailq_path=$(mailq_path)$(ln_suffix) manpage_directory=$(manpage_directory) newaliases_path=$(newaliases_path)$(ln_suffix) queue_directory=$(queue_directory) readme_directory=$(readme_directory) sendmail_path=$(sendmail_path)$(ln_suffix) setgid_group=postdrop sample_directory=$(sample_directory) config_directory=$(config_directory) shlib_directory=$(shlib_directory) meta_directory=$(meta_directory) mail_version=$(PKG_VERSION) non-interactive-package
++ $(INSTALL_DIR) $(1)$(mail_spool_directory)
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) ./files/postfix.init $(1)/etc/init.d/postfix
++endef
++
++define Package/postfix/postinst
++#!/bin/sh
++
++ if [ -f "$${IPKG_INSTROOT}$(sendmail_path)" -a "$$(readlink "$${IPKG_INSTROOT}$(sendmail_path)")" != "$(sendmail_path)$(ln_suffix)" ]; then
++ mv "$${IPKG_INSTROOT}$(sendmail_path)" "$${IPKG_INSTROOT}$(sendmail_path)$(ln_old_suffix)"
++ echo "Warning: $${IPKG_INSTROOT}$(sendmail_path) saved as $${IPKG_INSTROOT}$(sendmail_path)$(ln_old_suffix)"
++ fi
++ if [ ! -f "$${IPKG_INSTROOT}$(sendmail_path)" ]; then
++ ln -s "$${IPKG_INSTROOT}$(sendmail_path)$(ln_suffix)" "$(sendmail_path)"
++ fi
++
++ if [ -f "$${IPKG_INSTROOT}$(newaliases_path)" -a "$$(readlink "$${IPKG_INSTROOT}$(newaliases_path)")" != "$(newaliases_path)$(ln_suffix)" ]; then
++ mv "$${IPKG_INSTROOT}$(newaliases_path)" "$${IPKG_INSTROOT}$(newaliases_path)$(ln_old_suffix)"
++ echo "Warning: $${IPKG_INSTROOT}$(newaliases_path) saved as $${IPKG_INSTROOT}$(newaliases_path)$(ln_old_suffix)"
++ fi
++ if [ ! -f "$${IPKG_INSTROOT}$(newaliases_path)" ]; then
++ ln -s "$${IPKG_INSTROOT}$(newaliases_path)$(ln_suffix)" "$(newaliases_path)"
++ fi
++
++ if [ -f "$${IPKG_INSTROOT}$(mailq_path)" -a "$$(readlink "$${IPKG_INSTROOT}$(mailq_path)")" != "$(mailq_path)$(ln_suffix)" ]; then
++ mv "$${IPKG_INSTROOT}$(mailq_path)" "$${IPKG_INSTROOT}$(mailq_path)$(ln_old_suffix)"
++ echo "Warning: $${IPKG_INSTROOT}$(mailq_path) saved as $${IPKG_INSTROOT}$(mailq_path)$(ln_old_suffix)"
++ fi
++ if [ ! -f "$(mailq_path)" ]; then
++ ln -s "$${IPKG_INSTROOT}$(mailq_path)$(ln_suffix)" "$(mailq_path)"
++ fi
++
++ grep -qc main\.cf "$${IPKG_INSTROOT}"/etc/sysupgrade.conf >/dev/null || echo "$(config_directory)/main.cf" >> "$${IPKG_INSTROOT}"/etc/sysupgrade.conf
++ grep -qc master\.cf "$${IPKG_INSTROOT}"/etc/sysupgrade.conf >/dev/null || echo "$(config_directory)/master.cf" >> "$${IPKG_INSTROOT}"/etc/sysupgrade.conf
++ grep -qc aliases "$${IPKG_INSTROOT}"/etc/sysupgrade.conf >/dev/null || echo "$(config_directory)/aliases" >> "$${IPKG_INSTROOT}"/etc/sysupgrade.conf
++
++ touch "$${IPKG_INSTROOT}$(config_directory)"/opkg_postinst
++
++ if [ -z "$${IPKG_INSTROOT}" ]; then
++ ps | grep "postfix/master" | grep -cvq grep >/dev/null && /etc/init.d/postfix reload
++ fi
++
++endef
++
++define Package/postfix/prerm
++#!/bin/sh
++ ps | grep "postfix/master" | grep -cvq grep >/dev/null && postfix stop
++ /etc/init.d/postfix disable
++endef
++
++define Package/postfix/postrm
++#!/bin/sh
++ rm -f $${IPKG_INSTROOT}$(config_directory)/aliases.cdb $${IPKG_INSTROOT}$(config_directory)/aliases.db $${IPKG_INSTROOT}$(data_directory)/master.lock
++
++ rm -f "$${IPKG_INSTROOT}$(sendmail_path)" "$${IPKG_INSTROOT}$(newaliases_path)" "$${IPKG_INSTROOT}$(mailq_path)"
++
++ if [ -f "$${IPKG_INSTROOT}$(sendmail_path)$(ln_old_suffix)" ]; then
++ mv "$${IPKG_INSTROOT}$(sendmail_path)$(ln_old_suffix)" "$${IPKG_INSTROOT}$(sendmail_path)"
++ echo "Warning: $${IPKG_INSTROOT}$(sendmail_path) restored from $${IPKG_INSTROOT}$(sendmail_path)$(ln_old_suffix)"
++ fi
++ if [ -f "$${IPKG_INSTROOT}$(newaliases_path)$(ln_old_suffix)" ]; then
++ mv "$${IPKG_INSTROOT}$(newaliases_path)$(ln_old_suffix)" "$${IPKG_INSTROOT}$(newaliases_path)"
++ echo "Warning: $${IPKG_INSTROOT}$(newaliases_path) restored from $${IPKG_INSTROOT}$(newaliases_path)$(ln_old_suffix)"
++ fi
++ if [ -f "$${IPKG_INSTROOT}$(mailq_path)$(ln_old_suffix)" ]; then
++ mv "$${IPKG_INSTROOT}$(mailq_path)$(ln_old_suffix)" "$${IPKG_INSTROOT}$(mailq_path)"
++ echo "Warning: $${IPKG_INSTROOT}$(mailq_path) restored from $${IPKG_INSTROOT}$(mailq_path)$(ln_old_suffix)"
++ fi
++endef
++
++$(eval $(call BuildPackage,postfix))
+diff --git a/feeds/packages/mail/postfix/files/main.cf.default b/feeds/packages/mail/postfix/files/main.cf.default
+new file mode 100644
+index 0000000..d9eec99
+--- /dev/null
++++ b/feeds/packages/mail/postfix/files/main.cf.default
+@@ -0,0 +1,840 @@
++# DO NOT EDIT THIS FILE. EDIT THE MAIN.CF FILE INSTEAD. THE
++# TEXT HERE JUST SHOWS DEFAULT SETTINGS BUILT INTO POSTFIX.
++#
++2bounce_notice_recipient = postmaster
++access_map_defer_code = 450
++access_map_reject_code = 554
++address_verify_cache_cleanup_interval = 12h
++address_verify_default_transport = $default_transport
++address_verify_local_transport = $local_transport
++address_verify_map = btree:$data_directory/verify_cache
++address_verify_negative_cache = yes
++address_verify_negative_expire_time = 3d
++address_verify_negative_refresh_time = 3h
++address_verify_poll_count = ${stress?{1}:{3}}
++address_verify_poll_delay = 3s
++address_verify_positive_expire_time = 31d
++address_verify_positive_refresh_time = 7d
++address_verify_relay_transport = $relay_transport
++address_verify_relayhost = $relayhost
++address_verify_sender = $double_bounce_sender
++address_verify_sender_dependent_default_transport_maps = $sender_dependent_default_transport_maps
++address_verify_sender_dependent_relayhost_maps = $sender_dependent_relayhost_maps
++address_verify_sender_ttl = 0s
++address_verify_service_name = verify
++address_verify_transport_maps = $transport_maps
++address_verify_virtual_transport = $virtual_transport
++allow_mail_to_commands = alias, forward
++allow_mail_to_files = alias, forward
++allow_min_user = no
++allow_percent_hack = yes
++allow_untrusted_routing = no
++alternate_config_directories =
++always_add_missing_headers = no
++always_bcc =
++anvil_rate_time_unit = 60s
++anvil_status_update_time = 600s
++append_at_myorigin = yes
++append_dot_mydomain = ${{$compatibility_level} < {1} ? {yes} : {no}}
++application_event_drain_time = 100s
++authorized_flush_users = static:anyone
++authorized_mailq_users = static:anyone
++authorized_submit_users = static:anyone
++backwards_bounce_logfile_compatibility = yes
++berkeley_db_create_buffer_size = 16777216
++berkeley_db_read_buffer_size = 131072
++best_mx_transport =
++biff = yes
++body_checks =
++body_checks_size_limit = 51200
++bounce_notice_recipient = postmaster
++bounce_queue_lifetime = 5d
++bounce_service_name = bounce
++bounce_size_limit = 50000
++bounce_template_file =
++broken_sasl_auth_clients = no
++canonical_classes = envelope_sender, envelope_recipient, header_sender, header_recipient
++canonical_maps =
++cleanup_service_name = cleanup
++command_execution_directory =
++command_expansion_filter = 1234567890!@%-_=+:,./abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
++command_time_limit = 1000s
++compatibility_level = 0
++confirm_delay_cleared = no
++connection_cache_protocol_timeout = 5s
++connection_cache_service_name = scache
++connection_cache_status_update_time = 600s
++connection_cache_ttl_limit = 2s
++content_filter =
++cyrus_sasl_config_path =
++daemon_table_open_error_is_fatal = no
++daemon_timeout = 18000s
++debug_peer_level = 2
++debug_peer_list =
++debugger_command =
++default_delivery_slot_cost = 5
++default_delivery_slot_discount = 50
++default_delivery_slot_loan = 3
++default_delivery_status_filter =
++default_destination_concurrency_failed_cohort_limit = 1
++default_destination_concurrency_limit = 20
++default_destination_concurrency_negative_feedback = 1
++default_destination_concurrency_positive_feedback = 1
++default_destination_rate_delay = 0s
++default_destination_recipient_limit = 50
++default_extra_recipient_limit = 1000
++default_filter_nexthop =
++default_minimum_delivery_slots = 3
++default_privs = nobody
++default_process_limit = 100
++default_rbl_reply = $rbl_code Service unavailable; $rbl_class [$rbl_what] blocked using $rbl_domain${rbl_reason?; $rbl_reason}
++default_recipient_limit = 20000
++default_recipient_refill_delay = 5s
++default_recipient_refill_limit = 100
++default_transport = smtp
++default_verp_delimiters = +=
++defer_code = 450
++defer_service_name = defer
++defer_transports =
++delay_logging_resolution_limit = 2
++delay_notice_recipient = postmaster
++delay_warning_time = 0h
++deliver_lock_attempts = 20
++deliver_lock_delay = 1s
++destination_concurrency_feedback_debug = no
++detect_8bit_encoding_header = yes
++disable_dns_lookups = no
++disable_mime_input_processing = no
++disable_mime_output_conversion = no
++disable_verp_bounces = no
++disable_vrfy_command = no
++dnsblog_reply_delay = 0s
++dnsblog_service_name = dnsblog
++dont_remove = 0
++double_bounce_sender = double-bounce
++duplicate_filter_limit = 1000
++empty_address_default_transport_maps_lookup_key = <>
++empty_address_recipient = MAILER-DAEMON
++empty_address_relayhost_maps_lookup_key = <>
++enable_long_queue_ids = no
++enable_original_recipient = yes
++error_delivery_slot_cost = $default_delivery_slot_cost
++error_delivery_slot_discount = $default_delivery_slot_discount
++error_delivery_slot_loan = $default_delivery_slot_loan
++error_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
++error_destination_concurrency_limit = $default_destination_concurrency_limit
++error_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
++error_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
++error_destination_rate_delay = $default_destination_rate_delay
++error_destination_recipient_limit = $default_destination_recipient_limit
++error_extra_recipient_limit = $default_extra_recipient_limit
++error_initial_destination_concurrency = $initial_destination_concurrency
++error_minimum_delivery_slots = $default_minimum_delivery_slots
++error_notice_recipient = postmaster
++error_recipient_limit = $default_recipient_limit
++error_recipient_refill_delay = $default_recipient_refill_delay
++error_recipient_refill_limit = $default_recipient_refill_limit
++error_service_name = error
++execution_directory_expansion_filter = 1234567890!@%-_=+:,./abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
++expand_owner_alias = no
++export_environment = TZ MAIL_CONFIG LANG
++fallback_transport =
++fallback_transport_maps =
++fast_flush_domains = $relay_domains
++fast_flush_purge_time = 7d
++fast_flush_refresh_time = 12h
++fault_injection_code = 0
++flush_service_name = flush
++fork_attempts = 5
++fork_delay = 1s
++forward_expansion_filter = 1234567890!@%-_=+:,./abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
++forward_path = $home/.forward${recipient_delimiter}${extension}, $home/.forward
++frozen_delivered_to = yes
++hash_queue_depth = 1
++hash_queue_names = deferred, defer
++header_address_token_limit = 10240
++header_checks =
++header_size_limit = 102400
++helpful_warnings = yes
++home_mailbox =
++hopcount_limit = 50
++ignore_mx_lookup_error = no
++import_environment = MAIL_CONFIG MAIL_DEBUG MAIL_LOGTAG TZ XAUTHORITY DISPLAY LANG=C
++in_flow_delay = 1s
++inet_interfaces = all
++inet_protocols = all
++initial_destination_concurrency = 5
++internal_mail_filter_classes =
++invalid_hostname_reject_code = 501
++ipc_idle = 5s
++ipc_timeout = 3600s
++ipc_ttl = 1000s
++line_length_limit = 2048
++lmdb_map_size = 16777216
++lmtp_address_preference = any
++lmtp_address_verify_target = rcpt
++lmtp_assume_final = no
++lmtp_bind_address =
++lmtp_bind_address6 =
++lmtp_body_checks =
++lmtp_cname_overrides_servername = no
++lmtp_connect_timeout = 0s
++lmtp_connection_cache_destinations =
++lmtp_connection_cache_on_demand = yes
++lmtp_connection_cache_time_limit = 2s
++lmtp_connection_reuse_count_limit = 0
++lmtp_connection_reuse_time_limit = 300s
++lmtp_data_done_timeout = 600s
++lmtp_data_init_timeout = 120s
++lmtp_data_xfer_timeout = 180s
++lmtp_defer_if_no_mx_address_found = no
++lmtp_delivery_slot_cost = $default_delivery_slot_cost
++lmtp_delivery_slot_discount = $default_delivery_slot_discount
++lmtp_delivery_slot_loan = $default_delivery_slot_loan
++lmtp_delivery_status_filter = $default_delivery_status_filter
++lmtp_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
++lmtp_destination_concurrency_limit = $default_destination_concurrency_limit
++lmtp_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
++lmtp_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
++lmtp_destination_rate_delay = $default_destination_rate_delay
++lmtp_destination_recipient_limit = $default_destination_recipient_limit
++lmtp_discard_lhlo_keyword_address_maps =
++lmtp_discard_lhlo_keywords =
++lmtp_dns_reply_filter =
++lmtp_dns_resolver_options =
++lmtp_dns_support_level =
++lmtp_enforce_tls = no
++lmtp_extra_recipient_limit = $default_extra_recipient_limit
++lmtp_generic_maps =
++lmtp_header_checks =
++lmtp_host_lookup = dns
++lmtp_initial_destination_concurrency = $initial_destination_concurrency
++lmtp_lhlo_name = $myhostname
++lmtp_lhlo_timeout = 300s
++lmtp_line_length_limit = 998
++lmtp_mail_timeout = 300s
++lmtp_mime_header_checks =
++lmtp_minimum_delivery_slots = $default_minimum_delivery_slots
++lmtp_mx_address_limit = 5
++lmtp_mx_session_limit = 2
++lmtp_nested_header_checks =
++lmtp_per_record_deadline = no
++lmtp_pix_workaround_delay_time = 10s
++lmtp_pix_workaround_maps =
++lmtp_pix_workaround_threshold_time = 500s
++lmtp_pix_workarounds = disable_esmtp,delay_dotcrlf
++lmtp_quit_timeout = 300s
++lmtp_quote_rfc821_envelope = yes
++lmtp_randomize_addresses = yes
++lmtp_rcpt_timeout = 300s
++lmtp_recipient_limit = $default_recipient_limit
++lmtp_recipient_refill_delay = $default_recipient_refill_delay
++lmtp_recipient_refill_limit = $default_recipient_refill_limit
++lmtp_reply_filter =
++lmtp_rset_timeout = 20s
++lmtp_sasl_auth_cache_name =
++lmtp_sasl_auth_cache_time = 90d
++lmtp_sasl_auth_enable = no
++lmtp_sasl_auth_soft_bounce = yes
++lmtp_sasl_mechanism_filter =
++lmtp_sasl_password_maps =
++lmtp_sasl_path =
++lmtp_sasl_security_options = noplaintext, noanonymous
++lmtp_sasl_tls_security_options = $lmtp_sasl_security_options
++lmtp_sasl_tls_verified_security_options = $lmtp_sasl_tls_security_options
++lmtp_sasl_type = cyrus
++lmtp_send_dummy_mail_auth = no
++lmtp_send_xforward_command = no
++lmtp_sender_dependent_authentication = no
++lmtp_skip_5xx_greeting = yes
++lmtp_skip_quit_response = no
++lmtp_starttls_timeout = 300s
++lmtp_tcp_port = 24
++lmtp_tls_CAfile =
++lmtp_tls_CApath =
++lmtp_tls_block_early_mail_reply = no
++lmtp_tls_cert_file =
++lmtp_tls_ciphers = export
++lmtp_tls_dcert_file =
++lmtp_tls_dkey_file = $lmtp_tls_dcert_file
++lmtp_tls_eccert_file =
++lmtp_tls_eckey_file = $lmtp_tls_eccert_file
++lmtp_tls_enforce_peername = yes
++lmtp_tls_exclude_ciphers =
++lmtp_tls_fingerprint_cert_match =
++lmtp_tls_fingerprint_digest = md5
++lmtp_tls_force_insecure_host_tlsa_lookup = no
++lmtp_tls_key_file = $lmtp_tls_cert_file
++lmtp_tls_loglevel = 0
++lmtp_tls_mandatory_ciphers = medium
++lmtp_tls_mandatory_exclude_ciphers =
++lmtp_tls_mandatory_protocols = !SSLv2
++lmtp_tls_note_starttls_offer = no
++lmtp_tls_per_site =
++lmtp_tls_policy_maps =
++lmtp_tls_protocols = !SSLv2
++lmtp_tls_scert_verifydepth = 9
++lmtp_tls_secure_cert_match = nexthop
++lmtp_tls_security_level =
++lmtp_tls_session_cache_database =
++lmtp_tls_session_cache_timeout = 3600s
++lmtp_tls_trust_anchor_file =
++lmtp_tls_verify_cert_match = hostname
++lmtp_tls_wrappermode = no
++lmtp_use_tls = no
++lmtp_xforward_timeout = 300s
++local_command_shell =
++local_delivery_slot_cost = $default_delivery_slot_cost
++local_delivery_slot_discount = $default_delivery_slot_discount
++local_delivery_slot_loan = $default_delivery_slot_loan
++local_delivery_status_filter = $default_delivery_status_filter
++local_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
++local_destination_concurrency_limit = 2
++local_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
++local_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
++local_destination_rate_delay = $default_destination_rate_delay
++local_destination_recipient_limit = 1
++local_extra_recipient_limit = $default_extra_recipient_limit
++local_header_rewrite_clients = permit_inet_interfaces
++local_initial_destination_concurrency = $initial_destination_concurrency
++local_minimum_delivery_slots = $default_minimum_delivery_slots
++local_recipient_limit = $default_recipient_limit
++local_recipient_maps = proxy:unix:passwd.byname $alias_maps
++local_recipient_refill_delay = $default_recipient_refill_delay
++local_recipient_refill_limit = $default_recipient_refill_limit
++local_transport = local:$myhostname
++luser_relay =
++mail_name = Postfix
++mail_owner = postfix
++mail_release_date = 20150208
++mail_version = 3.0.0
++mailbox_command =
++mailbox_command_maps =
++mailbox_delivery_lock = fcntl, dotlock
++mailbox_size_limit = 51200000
++mailbox_transport =
++mailbox_transport_maps =
++maps_rbl_domains =
++maps_rbl_reject_code = 554
++masquerade_classes = envelope_sender, header_sender, header_recipient
++masquerade_domains =
++masquerade_exceptions =
++master_service_disable =
++max_idle = 100s
++max_use = 100
++maximal_backoff_time = 4000s
++maximal_queue_lifetime = 5d
++message_drop_headers = bcc, content-length, resent-bcc, return-path
++message_reject_characters =
++message_size_limit = 10240000
++message_strip_characters =
++milter_command_timeout = 30s
++milter_connect_macros = j {daemon_name} v
++milter_connect_timeout = 30s
++milter_content_timeout = 300s
++milter_data_macros = i
++milter_default_action = tempfail
++milter_end_of_data_macros = i
++milter_end_of_header_macros = i
++milter_header_checks =
++milter_helo_macros = {tls_version} {cipher} {cipher_bits} {cert_subject} {cert_issuer}
++milter_macro_daemon_name = $myhostname
++milter_macro_v = $mail_name $mail_version
++milter_mail_macros = i {auth_type} {auth_authen} {auth_author} {mail_addr} {mail_host} {mail_mailer}
++milter_protocol = 6
++milter_rcpt_macros = i {rcpt_addr} {rcpt_host} {rcpt_mailer}
++milter_unknown_command_macros =
++mime_boundary_length_limit = 2048
++mime_header_checks = $header_checks
++mime_nesting_limit = 100
++minimal_backoff_time = 300s
++multi_instance_directories =
++multi_instance_enable = no
++multi_instance_group =
++multi_instance_name =
++multi_instance_wrapper =
++multi_recipient_bounce_reject_code = 550
++mydestination = $myhostname, localhost.$mydomain, localhost
++myorigin = $myhostname
++nested_header_checks = $header_checks
++non_fqdn_reject_code = 504
++non_smtpd_milters =
++notify_classes = resource, software
++owner_request_special = yes
++parent_domain_matches_subdomains = debug_peer_list,fast_flush_domains,mynetworks,permit_mx_backup_networks,qmqpd_authorized_clients,relay_domains,smtpd_access_maps
++permit_mx_backup_networks =
++pickup_service_name = pickup
++pipe_delivery_status_filter = $default_delivery_status_filter
++plaintext_reject_code = 450
++postmulti_control_commands = reload flush
++postmulti_start_commands = start
++postmulti_stop_commands = stop abort drain quick-stop
++postscreen_access_list = permit_mynetworks
++postscreen_bare_newline_action = ignore
++postscreen_bare_newline_enable = no
++postscreen_bare_newline_ttl = 30d
++postscreen_blacklist_action = ignore
++postscreen_cache_cleanup_interval = 12h
++postscreen_cache_map = btree:$data_directory/postscreen_cache
++postscreen_cache_retention_time = 7d
++postscreen_client_connection_count_limit = $smtpd_client_connection_count_limit
++postscreen_command_count_limit = 20
++postscreen_command_filter =
++postscreen_command_time_limit = ${stress?{10}:{300}}s
++postscreen_disable_vrfy_command = $disable_vrfy_command
++postscreen_discard_ehlo_keyword_address_maps = $smtpd_discard_ehlo_keyword_address_maps
++postscreen_discard_ehlo_keywords = $smtpd_discard_ehlo_keywords
++postscreen_dnsbl_action = ignore
++postscreen_dnsbl_reply_map =
++postscreen_dnsbl_sites =
++postscreen_dnsbl_threshold = 1
++postscreen_dnsbl_timeout = 10s
++postscreen_dnsbl_ttl = 1h
++postscreen_dnsbl_whitelist_threshold = 0
++postscreen_enforce_tls = $smtpd_enforce_tls
++postscreen_expansion_filter = $smtpd_expansion_filter
++postscreen_forbidden_commands = $smtpd_forbidden_commands
++postscreen_greet_action = ignore
++postscreen_greet_banner = $smtpd_banner
++postscreen_greet_ttl = 1d
++postscreen_greet_wait = ${stress?{2}:{6}}s
++postscreen_helo_required = $smtpd_helo_required
++postscreen_non_smtp_command_action = drop
++postscreen_non_smtp_command_enable = no
++postscreen_non_smtp_command_ttl = 30d
++postscreen_pipelining_action = enforce
++postscreen_pipelining_enable = no
++postscreen_pipelining_ttl = 30d
++postscreen_post_queue_limit = $default_process_limit
++postscreen_pre_queue_limit = $default_process_limit
++postscreen_reject_footer = $smtpd_reject_footer
++postscreen_tls_security_level = $smtpd_tls_security_level
++postscreen_upstream_proxy_protocol =
++postscreen_upstream_proxy_timeout = 5s
++postscreen_use_tls = $smtpd_use_tls
++postscreen_watchdog_timeout = 10s
++postscreen_whitelist_interfaces = static:all
++prepend_delivered_header = command, file, forward
++process_id = 25939
++process_id_directory = pid
++process_name = postconf
++propagate_unmatched_extensions = canonical, virtual
++proxy_interfaces =
++proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $sender_bcc_maps $recipient_bcc_maps $smtp_generic_maps $lmtp_generic_maps $alias_maps $smtpd_client_restrictions $smtpd_helo_restrictions $smtpd_sender_restrictions $smtpd_relay_restrictions $smtpd_recipient_restrictions
++proxy_write_maps = $smtp_sasl_auth_cache_name $lmtp_sasl_auth_cache_name $address_verify_map $postscreen_cache_map
++proxymap_service_name = proxymap
++proxywrite_service_name = proxywrite
++qmgr_clog_warn_time = 300s
++qmgr_daemon_timeout = 1000s
++qmgr_fudge_factor = 100
++qmgr_ipc_timeout = 60s
++qmgr_message_active_limit = 20000
++qmgr_message_recipient_limit = 20000
++qmgr_message_recipient_minimum = 10
++qmqpd_authorized_clients =
++qmqpd_client_port_logging = no
++qmqpd_error_delay = 1s
++qmqpd_timeout = 300s
++queue_file_attribute_count_limit = 100
++queue_minfree = 0
++queue_run_delay = 300s
++queue_service_name = qmgr
++rbl_reply_maps =
++receive_override_options =
++recipient_bcc_maps =
++recipient_canonical_classes = envelope_recipient, header_recipient
++recipient_canonical_maps =
++recipient_delimiter =
++reject_code = 554
++reject_tempfail_action = defer_if_permit
++relay_clientcerts =
++relay_delivery_slot_cost = $default_delivery_slot_cost
++relay_delivery_slot_discount = $default_delivery_slot_discount
++relay_delivery_slot_loan = $default_delivery_slot_loan
++relay_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
++relay_destination_concurrency_limit = $default_destination_concurrency_limit
++relay_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
++relay_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
++relay_destination_rate_delay = $default_destination_rate_delay
++relay_destination_recipient_limit = $default_destination_recipient_limit
++relay_domains = ${{$compatibility_level} < {2} ? {$mydestination} : {}}
++relay_domains_reject_code = 554
++relay_extra_recipient_limit = $default_extra_recipient_limit
++relay_initial_destination_concurrency = $initial_destination_concurrency
++relay_minimum_delivery_slots = $default_minimum_delivery_slots
++relay_recipient_limit = $default_recipient_limit
++relay_recipient_maps =
++relay_recipient_refill_delay = $default_recipient_refill_delay
++relay_recipient_refill_limit = $default_recipient_refill_limit
++relay_transport = relay
++relayhost =
++relocated_maps =
++remote_header_rewrite_domain =
++require_home_directory = no
++reset_owner_alias = no
++resolve_dequoted_address = yes
++resolve_null_domain = no
++resolve_numeric_domain = no
++retry_delivery_slot_cost = $default_delivery_slot_cost
++retry_delivery_slot_discount = $default_delivery_slot_discount
++retry_delivery_slot_loan = $default_delivery_slot_loan
++retry_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
++retry_destination_concurrency_limit = $default_destination_concurrency_limit
++retry_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
++retry_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
++retry_destination_rate_delay = $default_destination_rate_delay
++retry_destination_recipient_limit = $default_destination_recipient_limit
++retry_extra_recipient_limit = $default_extra_recipient_limit
++retry_initial_destination_concurrency = $initial_destination_concurrency
++retry_minimum_delivery_slots = $default_minimum_delivery_slots
++retry_recipient_limit = $default_recipient_limit
++retry_recipient_refill_delay = $default_recipient_refill_delay
++retry_recipient_refill_limit = $default_recipient_refill_limit
++rewrite_service_name = rewrite
++send_cyrus_sasl_authzid = no
++sender_bcc_maps =
++sender_canonical_classes = envelope_sender, header_sender
++sender_canonical_maps =
++sender_dependent_default_transport_maps =
++sender_dependent_relayhost_maps =
++sendmail_fix_line_endings = always
++service_throttle_time = 60s
++setgid_group = postdrop
++show_user_unknown_table_name = yes
++showq_service_name = showq
++smtp_address_preference = any
++smtp_address_verify_target = rcpt
++smtp_always_send_ehlo = yes
++smtp_bind_address =
++smtp_bind_address6 =
++smtp_body_checks =
++smtp_cname_overrides_servername = no
++smtp_connect_timeout = 30s
++smtp_connection_cache_destinations =
++smtp_connection_cache_on_demand = yes
++smtp_connection_cache_time_limit = 2s
++smtp_connection_reuse_count_limit = 0
++smtp_connection_reuse_time_limit = 300s
++smtp_data_done_timeout = 600s
++smtp_data_init_timeout = 120s
++smtp_data_xfer_timeout = 180s
++smtp_defer_if_no_mx_address_found = no
++smtp_delivery_slot_cost = $default_delivery_slot_cost
++smtp_delivery_slot_discount = $default_delivery_slot_discount
++smtp_delivery_slot_loan = $default_delivery_slot_loan
++smtp_delivery_status_filter = $default_delivery_status_filter
++smtp_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
++smtp_destination_concurrency_limit = $default_destination_concurrency_limit
++smtp_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
++smtp_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
++smtp_destination_rate_delay = $default_destination_rate_delay
++smtp_destination_recipient_limit = $default_destination_recipient_limit
++smtp_discard_ehlo_keyword_address_maps =
++smtp_discard_ehlo_keywords =
++smtp_dns_reply_filter =
++smtp_dns_resolver_options =
++smtp_dns_support_level =
++smtp_enforce_tls = no
++smtp_extra_recipient_limit = $default_extra_recipient_limit
++smtp_fallback_relay = $fallback_relay
++smtp_generic_maps =
++smtp_header_checks =
++smtp_helo_name = $myhostname
++smtp_helo_timeout = 300s
++smtp_host_lookup = dns
++smtp_initial_destination_concurrency = $initial_destination_concurrency
++smtp_line_length_limit = 998
++smtp_mail_timeout = 300s
++smtp_mime_header_checks =
++smtp_minimum_delivery_slots = $default_minimum_delivery_slots
++smtp_mx_address_limit = 5
++smtp_mx_session_limit = 2
++smtp_nested_header_checks =
++smtp_never_send_ehlo = no
++smtp_per_record_deadline = no
++smtp_pix_workaround_delay_time = 10s
++smtp_pix_workaround_maps =
++smtp_pix_workaround_threshold_time = 500s
++smtp_pix_workarounds = disable_esmtp,delay_dotcrlf
++smtp_quit_timeout = 300s
++smtp_quote_rfc821_envelope = yes
++smtp_randomize_addresses = yes
++smtp_rcpt_timeout = 300s
++smtp_recipient_limit = $default_recipient_limit
++smtp_recipient_refill_delay = $default_recipient_refill_delay
++smtp_recipient_refill_limit = $default_recipient_refill_limit
++smtp_reply_filter =
++smtp_rset_timeout = 20s
++smtp_sasl_auth_cache_name =
++smtp_sasl_auth_cache_time = 90d
++smtp_sasl_auth_enable = no
++smtp_sasl_auth_soft_bounce = yes
++smtp_sasl_mechanism_filter =
++smtp_sasl_password_maps =
++smtp_sasl_path =
++smtp_sasl_security_options = noplaintext, noanonymous
++smtp_sasl_tls_security_options = $smtp_sasl_security_options
++smtp_sasl_tls_verified_security_options = $smtp_sasl_tls_security_options
++smtp_sasl_type = cyrus
++smtp_send_dummy_mail_auth = no
++smtp_send_xforward_command = no
++smtp_sender_dependent_authentication = no
++smtp_skip_5xx_greeting = yes
++smtp_skip_quit_response = yes
++smtp_starttls_timeout = 300s
++smtp_tls_CAfile =
++smtp_tls_CApath =
++smtp_tls_block_early_mail_reply = no
++smtp_tls_cert_file =
++smtp_tls_ciphers = export
++smtp_tls_dcert_file =
++smtp_tls_dkey_file = $smtp_tls_dcert_file
++smtp_tls_eccert_file =
++smtp_tls_eckey_file = $smtp_tls_eccert_file
++smtp_tls_enforce_peername = yes
++smtp_tls_exclude_ciphers =
++smtp_tls_fingerprint_cert_match =
++smtp_tls_fingerprint_digest = md5
++smtp_tls_force_insecure_host_tlsa_lookup = no
++smtp_tls_key_file = $smtp_tls_cert_file
++smtp_tls_loglevel = 0
++smtp_tls_mandatory_ciphers = medium
++smtp_tls_mandatory_exclude_ciphers =
++smtp_tls_mandatory_protocols = !SSLv2
++smtp_tls_note_starttls_offer = no
++smtp_tls_per_site =
++smtp_tls_policy_maps =
++smtp_tls_protocols = !SSLv2
++smtp_tls_scert_verifydepth = 9
++smtp_tls_secure_cert_match = nexthop, dot-nexthop
++smtp_tls_security_level =
++smtp_tls_session_cache_database =
++smtp_tls_session_cache_timeout = 3600s
++smtp_tls_trust_anchor_file =
++smtp_tls_verify_cert_match = hostname
++smtp_tls_wrappermode = no
++smtp_use_tls = no
++smtp_xforward_timeout = 300s
++smtpd_authorized_verp_clients = $authorized_verp_clients
++smtpd_authorized_xclient_hosts =
++smtpd_authorized_xforward_hosts =
++smtpd_banner = $myhostname ESMTP $mail_name
++smtpd_client_connection_count_limit = 50
++smtpd_client_connection_rate_limit = 0
++smtpd_client_event_limit_exceptions = ${smtpd_client_connection_limit_exceptions:$mynetworks}
++smtpd_client_message_rate_limit = 0
++smtpd_client_new_tls_session_rate_limit = 0
++smtpd_client_port_logging = no
++smtpd_client_recipient_rate_limit = 0
++smtpd_client_restrictions =
++smtpd_command_filter =
++smtpd_data_restrictions =
++smtpd_delay_open_until_valid_rcpt = yes
++smtpd_delay_reject = yes
++smtpd_discard_ehlo_keyword_address_maps =
++smtpd_discard_ehlo_keywords =
++smtpd_dns_reply_filter =
++smtpd_end_of_data_restrictions =
++smtpd_enforce_tls = no
++smtpd_error_sleep_time = 1s
++smtpd_etrn_restrictions =
++smtpd_expansion_filter = \t\40!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~
++smtpd_forbidden_commands = CONNECT GET POST
++smtpd_hard_error_limit = ${stress?{1}:{20}}
++smtpd_helo_required = no
++smtpd_helo_restrictions =
++smtpd_history_flush_threshold = 100
++smtpd_junk_command_limit = ${stress?{1}:{100}}
++smtpd_log_access_permit_actions =
++smtpd_milters =
++smtpd_noop_commands =
++smtpd_null_access_lookup_key = <>
++smtpd_peername_lookup = yes
++smtpd_per_record_deadline = ${stress?{yes}:{no}}
++smtpd_policy_service_default_action = 451 4.3.5 Server configuration problem
++smtpd_policy_service_max_idle = 300s
++smtpd_policy_service_max_ttl = 1000s
++smtpd_policy_service_request_limit = 0
++smtpd_policy_service_retry_delay = 1s
++smtpd_policy_service_timeout = 100s
++smtpd_policy_service_try_limit = 2
++smtpd_proxy_ehlo = $myhostname
++smtpd_proxy_filter =
++smtpd_proxy_options =
++smtpd_proxy_timeout = 100s
++smtpd_recipient_limit = 1000
++smtpd_recipient_overshoot_limit = 1000
++smtpd_recipient_restrictions =
++smtpd_reject_footer =
++smtpd_reject_unlisted_recipient = yes
++smtpd_reject_unlisted_sender = no
++smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination
++smtpd_restriction_classes =
++smtpd_sasl_auth_enable = no
++smtpd_sasl_authenticated_header = no
++smtpd_sasl_exceptions_networks =
++smtpd_sasl_local_domain =
++smtpd_sasl_path = smtpd
++smtpd_sasl_security_options = noanonymous
++smtpd_sasl_service = smtp
++smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
++smtpd_sasl_type = cyrus
++smtpd_sender_login_maps =
++smtpd_sender_restrictions =
++smtpd_service_name = smtpd
++smtpd_soft_error_limit = 10
++smtpd_starttls_timeout = ${stress?{10}:{300}}s
++smtpd_timeout = ${stress?{10}:{300}}s
++smtpd_tls_CAfile =
++smtpd_tls_CApath =
++smtpd_tls_always_issue_session_ids = yes
++smtpd_tls_ask_ccert = no
++smtpd_tls_auth_only = no
++smtpd_tls_ccert_verifydepth = 9
++smtpd_tls_cert_file =
++smtpd_tls_ciphers = export
++smtpd_tls_dcert_file =
++smtpd_tls_dh1024_param_file =
++smtpd_tls_dh512_param_file =
++smtpd_tls_dkey_file = $smtpd_tls_dcert_file
++smtpd_tls_eccert_file =
++smtpd_tls_eckey_file = $smtpd_tls_eccert_file
++smtpd_tls_eecdh_grade = strong
++smtpd_tls_exclude_ciphers =
++smtpd_tls_fingerprint_digest = md5
++smtpd_tls_key_file = $smtpd_tls_cert_file
++smtpd_tls_loglevel = 0
++smtpd_tls_mandatory_ciphers = medium
++smtpd_tls_mandatory_exclude_ciphers =
++smtpd_tls_mandatory_protocols = !SSLv2
++smtpd_tls_protocols =
++smtpd_tls_received_header = no
++smtpd_tls_req_ccert = no
++smtpd_tls_security_level =
++smtpd_tls_session_cache_database =
++smtpd_tls_session_cache_timeout = 3600s
++smtpd_tls_wrappermode = no
++smtpd_upstream_proxy_protocol =
++smtpd_upstream_proxy_timeout = 5s
++smtpd_use_tls = no
++smtputf8_autodetect_classes = sendmail, verify
++soft_bounce = no
++stale_lock_time = 500s
++stress =
++strict_7bit_headers = no
++strict_8bitmime = no
++strict_8bitmime_body = no
++strict_mailbox_ownership = yes
++strict_mime_encoding_domain = no
++strict_rfc821_envelopes = no
++strict_smtputf8 = no
++sun_mailtool_compatibility = no
++swap_bangpath = yes
++syslog_facility = mail
++syslog_name = ${multi_instance_name?{$multi_instance_name}:{postfix}}
++tcp_windowsize = 0
++tls_append_default_CA = no
++tls_daemon_random_bytes = 32
++tls_dane_digest_agility = on
++tls_dane_digests = sha512 sha256
++tls_dane_trust_anchor_digest_enable = yes
++tls_disable_workarounds =
++tls_eecdh_strong_curve = prime256v1
++tls_eecdh_ultra_curve = secp384r1
++tls_export_cipherlist = aNULL:-aNULL:ALL:+RC4:@STRENGTH
++tls_high_cipherlist = aNULL:-aNULL:ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH
++tls_legacy_public_key_fingerprints = no
++tls_low_cipherlist = aNULL:-aNULL:ALL:!EXPORT:+RC4:@STRENGTH
++tls_medium_cipherlist = aNULL:-aNULL:ALL:!EXPORT:!LOW:+RC4:@STRENGTH
++tls_null_cipherlist = eNULL:!aNULL
++tls_preempt_cipherlist = no
++tls_random_bytes = 32
++tls_random_exchange_name = ${data_directory}/prng_exch
++tls_random_prng_update_period = 3600s
++tls_random_reseed_period = 3600s
++tls_random_source = dev:/dev/urandom
++tls_session_ticket_cipher = aes-128-cbc
++tls_ssl_options =
++tls_wildcard_matches_multiple_labels = yes
++tlsmgr_service_name = tlsmgr
++tlsproxy_enforce_tls = $smtpd_enforce_tls
++tlsproxy_service_name = tlsproxy
++tlsproxy_tls_CAfile = $smtpd_tls_CAfile
++tlsproxy_tls_CApath = $smtpd_tls_CApath
++tlsproxy_tls_always_issue_session_ids = $smtpd_tls_always_issue_session_ids
++tlsproxy_tls_ask_ccert = $smtpd_tls_ask_ccert
++tlsproxy_tls_ccert_verifydepth = $smtpd_tls_ccert_verifydepth
++tlsproxy_tls_cert_file = $smtpd_tls_cert_file
++tlsproxy_tls_ciphers = $smtpd_tls_ciphers
++tlsproxy_tls_dcert_file = $smtpd_tls_dcert_file
++tlsproxy_tls_dh1024_param_file = $smtpd_tls_dh1024_param_file
++tlsproxy_tls_dh512_param_file = $smtpd_tls_dh512_param_file
++tlsproxy_tls_dkey_file = $smtpd_tls_dkey_file
++tlsproxy_tls_eccert_file = $smtpd_tls_eccert_file
++tlsproxy_tls_eckey_file = $smtpd_tls_eckey_file
++tlsproxy_tls_eecdh_grade = $smtpd_tls_eecdh_grade
++tlsproxy_tls_exclude_ciphers = $smtpd_tls_exclude_ciphers
++tlsproxy_tls_fingerprint_digest = $smtpd_tls_fingerprint_digest
++tlsproxy_tls_key_file = $smtpd_tls_key_file
++tlsproxy_tls_loglevel = $smtpd_tls_loglevel
++tlsproxy_tls_mandatory_ciphers = $smtpd_tls_mandatory_ciphers
++tlsproxy_tls_mandatory_exclude_ciphers = $smtpd_tls_mandatory_exclude_ciphers
++tlsproxy_tls_mandatory_protocols = $smtpd_tls_mandatory_protocols
++tlsproxy_tls_protocols = $smtpd_tls_protocols
++tlsproxy_tls_req_ccert = $smtpd_tls_req_ccert
++tlsproxy_tls_security_level = $smtpd_tls_security_level
++tlsproxy_use_tls = $smtpd_use_tls
++tlsproxy_watchdog_timeout = 10s
++trace_service_name = trace
++transport_maps =
++transport_retry_time = 60s
++trigger_timeout = 10s
++undisclosed_recipients_header =
++unknown_address_reject_code = 450
++unknown_address_tempfail_action = $reject_tempfail_action
++unknown_client_reject_code = 450
++unknown_helo_hostname_tempfail_action = $reject_tempfail_action
++unknown_hostname_reject_code = 450
++unknown_local_recipient_reject_code = 550
++unknown_relay_recipient_reject_code = 550
++unknown_virtual_alias_reject_code = 550
++unknown_virtual_mailbox_reject_code = 550
++unverified_recipient_defer_code = 450
++unverified_recipient_reject_code = 450
++unverified_recipient_reject_reason =
++unverified_recipient_tempfail_action = $reject_tempfail_action
++unverified_sender_defer_code = 450
++unverified_sender_reject_code = 450
++unverified_sender_reject_reason =
++unverified_sender_tempfail_action = $reject_tempfail_action
++verp_delimiter_filter = -=+
++virtual_alias_address_length_limit = 1000
++virtual_alias_domains = $virtual_alias_maps
++virtual_alias_expansion_limit = 1000
++virtual_alias_maps = $virtual_maps
++virtual_alias_recursion_limit = 1000
++virtual_delivery_slot_cost = $default_delivery_slot_cost
++virtual_delivery_slot_discount = $default_delivery_slot_discount
++virtual_delivery_slot_loan = $default_delivery_slot_loan
++virtual_delivery_status_filter = $default_delivery_status_filter
++virtual_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
++virtual_destination_concurrency_limit = $default_destination_concurrency_limit
++virtual_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
++virtual_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
++virtual_destination_rate_delay = $default_destination_rate_delay
++virtual_destination_recipient_limit = $default_destination_recipient_limit
++virtual_extra_recipient_limit = $default_extra_recipient_limit
++virtual_gid_maps =
++virtual_initial_destination_concurrency = $initial_destination_concurrency
++virtual_mailbox_base =
++virtual_mailbox_domains = $virtual_mailbox_maps
++virtual_mailbox_limit = 51200000
++virtual_mailbox_lock = fcntl, dotlock
++virtual_mailbox_maps =
++virtual_minimum_delivery_slots = $default_minimum_delivery_slots
++virtual_minimum_uid = 100
++virtual_recipient_limit = $default_recipient_limit
++virtual_recipient_refill_delay = $default_recipient_refill_delay
++virtual_recipient_refill_limit = $default_recipient_refill_limit
++virtual_transport = virtual
++virtual_uid_maps =
+diff --git a/feeds/packages/mail/postfix/files/postfix.init b/feeds/packages/mail/postfix/files/postfix.init
+new file mode 100644
+index 0000000..1f3bc5e
+--- /dev/null
++++ b/feeds/packages/mail/postfix/files/postfix.init
+@@ -0,0 +1,64 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=50
++STOP=50
++
++upgrade() {
++ config_directory="$IPKG_INSTROOT"/etc/postfix
++
++ if [ -f "$config_directory"/opkg_postinst ]; then
++ rm -f "$config_directory"/opkg_postinst
++
++ group_exists postfix || group_add postfix 87
++ user_exists postfix || user_add postfix 87
++ group_exists postdrop || group_add postdrop 88
++
++ echo "myhostname = $(uci get system.@system[0].hostname)" >> "$config_directory"/main.cf.default
++ echo "mydomain = $(uci get system.@system[0].hostname|sed -e "s/[^\.]*\.\(.*\)/\1/")" >> "$config_directory"/main.cf.default
++ ifconfig | grep "inet addr" | sed -e "s/.*inet addr:\([0-9.]*\).*Mask:/\1 /" | while read IP NETMASK; do eval "$(ipcalc.sh $IP $NETMASK)"; echo "$NETWORK/$PREFIX"; done | xargs echo "mynetworks =" >> "$config_directory"/main.cf.default
++ echo "mynetworks_style = subnet" >> "$config_directory"/main.cf.default
++
++ grep -qc "^sendmail_path[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^sendmail_path =" "$config_directory"/main.cf.default)"
++ grep -qc "^newaliases_path[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^newaliases_path =" "$config_directory"/main.cf.default)"
++ grep -qc "^mailq_path[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^mailq_path =" "$config_directory"/main.cf.default)"
++ grep -qc "^html_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^html_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^manpage_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^manpage_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^sample_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^sample_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^readme_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^readme_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^command_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^command_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^daemon_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^daemon_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^data_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^data_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^queue_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^queue_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^config_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^config_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^mail_spool_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^mail_spool_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^mail_owner[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^mail_owner =" "$config_directory"/main.cf.default)"
++ grep -qc "^setgid_group[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^setgid_group =" "$config_directory"/main.cf.default)"
++ grep -qc "^myhostname[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^myhostname =" "$config_directory"/main.cf.default)"
++ grep -qc "^mydomain[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^mydomain =" "$config_directory"/main.cf.default)"
++ grep -qc "^mynetworks[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^mynetworks =" "$config_directory"/main.cf.default)"
++ grep -qc "^mynetworks_style[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^mynetworks_style =" "$config_directory"/main.cf.default)"
++ grep -qc "^shlib_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^shlib_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^meta_directory[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^meta_directory =" "$config_directory"/main.cf.default)"
++ grep -qc "^smtputf8_enable[^_]" "$config_directory"/main.cf >/dev/null || postconf -e "$(grep "^smtputf8_enable =" "$config_directory"/main.cf.default)"
++
++ postfix set-permissions
++ postfix post-install upgrade-source
++ postfix upgrade-configuration
++ newaliases
++ fi
++}
++
++start() {
++ upgrade
++ postfix start
++}
++
++stop() {
++ postfix stop
++}
++
++reload() {
++ upgrade
++ postfix reload
++}
+diff --git a/feeds/packages/mail/postfix/patches/100-fsstat.patch b/feeds/packages/mail/postfix/patches/100-fsstat.patch
+new file mode 100644
+index 0000000..ca43025
+--- /dev/null
++++ b/feeds/packages/mail/postfix/patches/100-fsstat.patch
+@@ -0,0 +1,12 @@
++diff -rupN postfix-2.8.1/src/smtpd/smtpd_check.c postfix-2.8.1_patched/src/smtpd/smtpd_check.c
++--- postfix-2.8.1/src/smtpd/smtpd_check.c 2011-01-04 22:03:50.000000000 +0300
+++++ postfix-2.8.1_patched/src/smtpd/smtpd_check.c 2011-03-06 19:35:39.000000000 +0300
++@@ -5277,7 +5277,7 @@ char *smtpd_check_queue(SMTPD_STATE *s
++ */
++ #define BLOCKS(x) ((x) / fsbuf.block_size)
++
++- fsspace(".", &fsbuf);
+++ fsspace("/overlay", &fsbuf);
++ if (msg_verbose)
++ msg_info("%s: blocks %lu avail %lu min_free %lu msg_size_limit %lu",
++ myname,
+diff --git a/feeds/packages/mail/postfix/patches/200-manpages.patch b/feeds/packages/mail/postfix/patches/200-manpages.patch
+new file mode 100644
+index 0000000..6344e93
+--- /dev/null
++++ b/feeds/packages/mail/postfix/patches/200-manpages.patch
+@@ -0,0 +1,80 @@
++diff -Naur postfix-2.10.2/conf/post-install postfix-2.10.2_patched/conf/post-install
++--- postfix-2.10.2/conf/post-install 2013-06-13 18:07:46.000000000 +0400
+++++ postfix-2.10.2_patched/conf/post-install 2013-11-19 21:17:49.572820573 +0400
++@@ -359,10 +359,10 @@
++
++ # Sanity checks
++
++-case $manpage_directory in
++- no) echo $0: Error: manpage_directory no longer accepts \"no\" values. 1>&2
++- echo Try again with \"$0 manpage_directory=/pathname ...\". 1>&2; exit 1;;
++-esac
+++#case $manpage_directory in
+++# no) echo $0: Error: manpage_directory no longer accepts \"no\" values. 1>&2
+++# echo Try again with \"$0 manpage_directory=/pathname ...\". 1>&2; exit 1;;
+++#esac
++
++ case $setgid_group in
++ no) echo $0: Error: setgid_group no longer accepts \"no\" values. 1>&2
++@@ -370,7 +370,7 @@
++ esac
++
++ for path in "$daemon_directory" "$command_directory" "$queue_directory" \
++- "$sendmail_path" "$newaliases_path" "$mailq_path" "$manpage_directory" \
+++ "$sendmail_path" "$newaliases_path" "$mailq_path" \
++ "$meta_directory"
++ do
++ case "$path" in
++@@ -379,7 +379,7 @@
++ esac
++ done
++
++-for path in "$html_directory" "$readme_directory" "$shlib_directory"
+++for path in "$html_directory" "$readme_directory" "$shlib_directory" "$manpage_directory"
++ do
++ case "$path" in
++ /*) ;;
++diff -Naur postfix-2.10.2/postfix-install postfix-2.10.2_patched/postfix-install
++--- postfix-2.10.2/postfix-install 2012-05-22 23:40:29.000000000 +0400
+++++ postfix-2.10.2_patched/postfix-install 2013-11-19 21:12:20.694160734 +0400
++@@ -543,13 +543,13 @@
++ exit 1;;
++ esac
++
++-case "$manpage_directory" in
++- no) (echo $0: Error: the manpage_directory parameter no longer accepts
++- echo \"no\" values. Try again with \"manpage_directory=/path/name\"
++- echo on the command line or execute \"make install\" and specify
++- echo manpage_directory interactively.) | ${FMT} 1>&2
++- exit 1;;
++-esac
+++#case "$manpage_directory" in
+++# no) (echo $0: Error: the manpage_directory parameter no longer accepts
+++# echo \"no\" values. Try again with \"manpage_directory=/path/name\"
+++# echo on the command line or execute \"make install\" and specify
+++# echo manpage_directory interactively.) | ${FMT} 1>&2
+++# exit 1;;
+++#esac
++
++ for path in "$html_directory" "$readme_directory" "$shlib_directory"
++ do
++@@ -562,7 +562,7 @@
++ done
++
++ for path in "$daemon_directory" "$data_directory" "$command_directory" "$queue_directory" \
++- "$sendmail_path" "$newaliases_path" "$mailq_path" "$manpage_directory" \
+++ "$sendmail_path" "$newaliases_path" "$mailq_path" \
++ "$meta_directory"
++ do
++ case "$path" in
++@@ -758,8 +758,8 @@
++ compare_or_replace $mode "$owner" "$group" html/$file \
++ $HTML_DIRECTORY/$file || exit 1;;
++ '$manpage_directory')
++- check_parent $MANPAGE_DIRECTORY/$file || exit 1
++- compare_or_replace $mode "$owner" "$group" man/$file \
+++ test "$manpage_directory" = "no" || check_parent $MANPAGE_DIRECTORY/$file || exit 1
+++ test "$manpage_directory" = "no" || compare_or_replace $mode "$owner" "$group" man/$file \
++ $MANPAGE_DIRECTORY/$file || exit 1;;
++ '$readme_directory')
++ test "$readme_directory" = "no" ||
+diff --git a/feeds/packages/mail/postfix/patches/300-bdb_hash_segfault.patch b/feeds/packages/mail/postfix/patches/300-bdb_hash_segfault.patch
+new file mode 100644
+index 0000000..1a9d8e9
+--- /dev/null
++++ b/feeds/packages/mail/postfix/patches/300-bdb_hash_segfault.patch
+@@ -0,0 +1,14 @@
++diff -Naur postfix-2.11.3/src/util/dict_db.c postfix-2.11.3_patched/src/util/dict_db.c
++--- postfix-2.11.3/src/util/dict_db.c 2012-01-25 04:41:08.000000000 +0400
+++++ postfix-2.11.3_patched/src/util/dict_db.c 2014-11-01 12:36:44.287641712 +0300
++@@ -687,8 +687,8 @@
++ msg_panic("db_create null result");
++ if ((errno = db->set_cachesize(db, 0, dict_db_cache_size, 0)) != 0)
++ msg_fatal("set DB cache size %d: %m", dict_db_cache_size);
++- if (type == DB_HASH && db->set_h_nelem(db, DICT_DB_NELM) != 0)
++- msg_fatal("set DB hash element count %d: %m", DICT_DB_NELM);
+++// if (type == DB_HASH && db->set_h_nelem(db, DICT_DB_NELM) != 0)
+++// msg_fatal("set DB hash element count %d: %m", DICT_DB_NELM);
++ #if DB_VERSION_MAJOR == 6 || DB_VERSION_MAJOR == 5 || \
++ (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR > 0)
++ if ((errno = db->open(db, 0, db_path, 0, type, db_flags, 0644)) != 0)
+diff --git a/feeds/packages/mail/postfix/patches/400-cdb.patch b/feeds/packages/mail/postfix/patches/400-cdb.patch
+new file mode 100644
+index 0000000..8aeaea5
+--- /dev/null
++++ b/feeds/packages/mail/postfix/patches/400-cdb.patch
+@@ -0,0 +1,14 @@
++diff -Naur postfix-2.11.1/src/util/sys_defs.h postfix-2.11.1.patched/src/util/sys_defs.h
++--- postfix-2.11.1/src/util/sys_defs.h 2013-09-30 00:51:55.000000000 +0400
+++++ postfix-2.11.1.patched/src/util/sys_defs.h 2014-09-29 03:11:48.962277971 +0400
++@@ -768,9 +768,8 @@
++ #define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK
++ #define DEF_MAILBOX_LOCK "fcntl, dotlock" /* RedHat >= 4.x */
++ #define HAS_FSYNC
++-#define HAS_DB
++ #define NATIVE_DB_TYPE "hash"
++-#define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/aliases"
+++#define ALIAS_DB_MAP DEF_DB_TYPE ":/etc/postfix/aliases"
++ #ifndef NO_NIS
++ #define HAS_NIS
++ #endif
+diff --git a/feeds/packages/mail/postfix/patches/500-crosscompile.patch b/feeds/packages/mail/postfix/patches/500-crosscompile.patch
+new file mode 100644
+index 0000000..0366612
+--- /dev/null
++++ b/feeds/packages/mail/postfix/patches/500-crosscompile.patch
+@@ -0,0 +1,27 @@
++--- a/makedefs
+++++ b/makedefs
++@@ -190,9 +190,9 @@ error() {
++
++ case $# in
++ # Officially supported usage.
++- 0) SYSTEM=`(uname -s) 2>/dev/null`
++- RELEASE=`(uname -r) 2>/dev/null`
++- VERSION=`(uname -v) 2>/dev/null`
+++ 0) SYSTEM="Linux"
+++ RELEASE="3.10.18"
+++ VERSION="OpenWRT"
++ case "$VERSION" in
++ dcosx*) SYSTEM=$VERSION;;
++ esac;;
++@@ -522,9 +522,9 @@ EOF
++ esac
++ for name in nsl resolv
++ do
++- for lib in /usr/lib64 /lib64 /usr/lib /usr/lib/* /lib /lib/*
+++ for lib in /usr/lib64 /usr/lib64/* /usr/lib /usr/lib/* /lib /lib/*
++ do
++- test -e $lib/lib$name.a -o -e $lib/lib$name.so && {
+++ test -e $STAGING_DIR/$lib/lib$name.a -o -e $STAGING_DIR/$lib/lib$name.so && {
++ SYSLIBS="$SYSLIBS -l$name"
++ break
++ }
+diff --git a/feeds/packages/mail/postfix/patches/600-nopostconf.patch b/feeds/packages/mail/postfix/patches/600-nopostconf.patch
+new file mode 100644
+index 0000000..6140e23
+--- /dev/null
++++ b/feeds/packages/mail/postfix/patches/600-nopostconf.patch
+@@ -0,0 +1,44 @@
++diff -Naur postfix-2.11.1/postfix-install postfix-2.11.1.patched/postfix-install
++--- postfix-2.11.1/postfix-install 2014-10-05 20:43:58.598876904 +0400
+++++ postfix-2.11.1.patched/postfix-install 2014-10-05 20:47:36.076700082 +0400
++@@ -830,23 +830,23 @@
++ esac
++ done
++
++-bin/postconf -c $CONFIG_DIRECTORY -e \
++- "daemon_directory = $daemon_directory" \
++- "data_directory = $data_directory" \
++- "command_directory = $command_directory" \
++- "queue_directory = $queue_directory" \
++- "mail_owner = $mail_owner" \
++- "setgid_group = $setgid_group" \
++- "sendmail_path = $sendmail_path" \
++- "mailq_path = $mailq_path" \
++- "newaliases_path = $newaliases_path" \
++- "html_directory = $html_directory" \
++- "manpage_directory = $manpage_directory" \
++- "sample_directory = $sample_directory" \
++- "readme_directory = $readme_directory" \
++- "shlib_directory = $shlib_directory" \
++- "meta_directory = $meta_directory" \
++-|| exit 1
+++#bin/postconf -c $CONFIG_DIRECTORY -e \
+++# "daemon_directory = $daemon_directory" \
+++# "data_directory = $data_directory" \
+++# "command_directory = $command_directory" \
+++# "queue_directory = $queue_directory" \
+++# "mail_owner = $mail_owner" \
+++# "setgid_group = $setgid_group" \
+++# "sendmail_path = $sendmail_path" \
+++# "mailq_path = $mailq_path" \
+++# "newaliases_path = $newaliases_path" \
+++# "html_directory = $html_directory" \
+++# "manpage_directory = $manpage_directory" \
+++# "sample_directory = $sample_directory" \
+++# "readme_directory = $readme_directory" \
+++# "shlib_directory = $shlib_directory" \
+++# "meta_directory = $meta_directory" \
+++#|| exit 1
++
++ # If Postfix is being installed locally from source code, do the
++ # post-install processing now.
+diff --git a/feeds/packages/mail/postfix/patches/700-defaultconfig.patch b/feeds/packages/mail/postfix/patches/700-defaultconfig.patch
+new file mode 100644
+index 0000000..99088d1
+--- /dev/null
++++ b/feeds/packages/mail/postfix/patches/700-defaultconfig.patch
+@@ -0,0 +1,93 @@
++diff -Naur postfix-2.11.1/conf/main.cf postfix-2.11.1.patched/conf/main.cf
++--- postfix-2.11.1/conf/main.cf 2013-12-24 18:57:25.000000000 +0400
+++++ postfix-2.11.1.patched/conf/main.cf 2014-10-05 21:35:53.427534410 +0400
++@@ -40,43 +40,8 @@
++ #
++ #soft_bounce = no
++
++-# LOCAL PATHNAME INFORMATION
++-#
++-# The queue_directory specifies the location of the Postfix queue.
++-# This is also the root directory of Postfix daemons that run chrooted.
++-# See the files in examples/chroot-setup for setting up Postfix chroot
++-# environments on different UNIX systems.
++-#
++-queue_directory = /var/spool/postfix
++-
++-# The command_directory parameter specifies the location of all
++-# postXXX commands.
++-#
++-command_directory = /usr/sbin
++-
++-# The daemon_directory parameter specifies the location of all Postfix
++-# daemon programs (i.e. programs listed in the master.cf file). This
++-# directory must be owned by root.
++-#
++-daemon_directory = /usr/libexec/postfix
++-
++-# The data_directory parameter specifies the location of Postfix-writable
++-# data files (caches, random numbers). This directory must be owned
++-# by the mail_owner account (see below).
++-#
++-data_directory = /var/lib/postfix
++-
++ # QUEUE AND PROCESS OWNERSHIP
++ #
++-# The mail_owner parameter specifies the owner of the Postfix queue
++-# and of most Postfix daemon processes. Specify the name of a user
++-# account THAT DOES NOT SHARE ITS USER OR GROUP ID WITH OTHER ACCOUNTS
++-# AND THAT OWNS NO OTHER FILES OR PROCESSES ON THE SYSTEM. In
++-# particular, don't specify nobody or daemon. PLEASE USE A DEDICATED
++-# USER.
++-#
++-mail_owner = postfix
++-
++ # The default_privs parameter specifies the default rights used by
++ # the local delivery agent for delivery to external file or command.
++ # These rights are used in the absence of a recipient user context.
++@@ -632,45 +597,4 @@
++ # -dmS $process_name gdb $daemon_directory/$process_name
++ # $process_id & sleep 1
++
++-# INSTALL-TIME CONFIGURATION INFORMATION
++-#
++-# The following parameters are used when installing a new Postfix version.
++-#
++-# sendmail_path: The full pathname of the Postfix sendmail command.
++-# This is the Sendmail-compatible mail posting interface.
++-#
++-sendmail_path =
++-
++-# newaliases_path: The full pathname of the Postfix newaliases command.
++-# This is the Sendmail-compatible command to build alias databases.
++-#
++-newaliases_path =
++-
++-# mailq_path: The full pathname of the Postfix mailq command. This
++-# is the Sendmail-compatible mail queue listing command.
++-#
++-mailq_path =
++-
++-# setgid_group: The group for mail submission and queue management
++-# commands. This must be a group name with a numerical group ID that
++-# is not shared with other accounts, not even with the Postfix account.
++-#
++-setgid_group =
++-
++-# html_directory: The location of the Postfix HTML documentation.
++-#
++-html_directory =
++-
++-# manpage_directory: The location of the Postfix on-line manual pages.
++-#
++-manpage_directory =
++-
++-# sample_directory: The location of the Postfix sample configuration files.
++-# This parameter is obsolete as of Postfix 2.1.
++-#
++-sample_directory =
++-
++-# readme_directory: The location of the Postfix README files.
++-#
++-readme_directory =
++ inet_protocols = ipv4
+diff --git a/feeds/packages/mail/postfix/patches/800-fmt.patch b/feeds/packages/mail/postfix/patches/800-fmt.patch
+new file mode 100644
+index 0000000..97a165c
+--- /dev/null
++++ b/feeds/packages/mail/postfix/patches/800-fmt.patch
+@@ -0,0 +1,12 @@
++diff -Naur postfix-2.11.1/conf/post-install postfix-2.11.1.patched/conf/post-install
++--- postfix-2.11.1/conf/post-install 2014-10-05 20:43:58.597876946 +0400
+++++ postfix-2.11.1.patched/conf/post-install 2014-10-11 16:28:01.258874097 +0400
++@@ -319,7 +319,7 @@
++ case `uname -s` in
++ HP-UX*) FMT=cat;;
++ SunOS*) FMT=fake_fmt;;
++- *) FMT=fmt;;
+++ *) FMT="xargs echo";;
++ esac
++
++ # If a parameter is not set via the command line or environment,
+diff --git a/feeds/packages/mail/ssmtp/Makefile b/feeds/packages/mail/ssmtp/Makefile
+new file mode 100644
+index 0000000..3d24394
+--- /dev/null
++++ b/feeds/packages/mail/ssmtp/Makefile
+@@ -0,0 +1,64 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ssmtp
++PKG_VERSION:=2.64
++PKG_RELEASE:=1.1
++PKG_MAINTAINER:=Dirk Brenken <dibdot@gmail.com>
++PKG_LICENSE:=GPL-2.0+
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).orig.tar.bz2
++PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/main/s/ssmtp
++PKG_MD5SUM:=65b4e0df4934a6cd08c506cabcbe584f
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS += $(TARGET_CPPFLAGS)
++
++define Package/ssmtp
++ SECTION:=mail
++ CATEGORY:=Mail
++ DEPENDS:=+libopenssl
++ TITLE:=A minimal and secure mail sender with ssl support
++ URL:=http://packages.debian.org/ssmtp
++endef
++
++define Package/ssmtp/description
++ A secure, effective and simple way of getting mail off a system to your
++ mail hub. It contains no suid-binaries or other dangerous things - no
++ mail spool to poke around in, and no daemons running in the background.
++ Mail is simply forwarded to the configured mailhost. Extremely easy
++ configuration.
++endef
++
++define Package/ssmtp/conffiles
++/etc/ssmtp/ssmtp.conf
++/etc/ssmtp/revaliases
++endef
++
++CONFIGURE_VARS += \
++ LIBS="$(TARGET_LDFLAGS) -lcrypto -lssl"
++
++CONFIGURE_ARGS += \
++ --enable-ssl
++
++define Package/ssmtp/install
++ $(INSTALL_DIR) $(1)/etc/ssmtp
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/ssmtp.conf $(1)/etc/ssmtp/
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/revaliases $(1)/etc/ssmtp/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ssmtp $(1)/usr/sbin/
++endef
++
++define Package/ssmtp/postinst
++#!/bin/sh
++ln -sf ssmtp $${IPKG_INSTROOT}/usr/sbin/sendmail
++endef
++
++$(eval $(call BuildPackage,ssmtp))
+diff --git a/feeds/packages/mail/ssmtp/patches/002-fix_pointer.patch b/feeds/packages/mail/ssmtp/patches/002-fix_pointer.patch
+new file mode 100644
+index 0000000..f22e3d6
+--- /dev/null
++++ b/feeds/packages/mail/ssmtp/patches/002-fix_pointer.patch
+@@ -0,0 +1,466 @@
++--- a/ssmtp.c
+++++ b/ssmtp.c
++@@ -55,21 +55,21 @@ bool_t use_oldauth = False; /* use old
++
++ #define ARPADATE_LENGTH 32 /* Current date in RFC format */
++ char arpadate[ARPADATE_LENGTH];
++-char *auth_user = (char)NULL;
++-char *auth_pass = (char)NULL;
++-char *auth_method = (char)NULL; /* Mechanism for SMTP authentication */
++-char *mail_domain = (char)NULL;
++-char *from = (char)NULL; /* Use this as the From: address */
+++char *auth_user = NULL;
+++char *auth_pass = NULL;
+++char *auth_method = NULL; /* Mechanism for SMTP authentication */
+++char *mail_domain = NULL;
+++char *from = NULL; /* Use this as the From: address */
++ char *hostname;
++ char *mailhost = "mailhub";
++-char *minus_f = (char)NULL;
++-char *minus_F = (char)NULL;
+++char *minus_f = NULL;
+++char *minus_F = NULL;
++ char *gecos;
++-char *prog = (char)NULL;
+++char *prog = NULL;
++ char *root = NULL;
++ char *tls_cert = "/etc/ssl/certs/ssmtp.pem"; /* Default Certificate */
++-char *uad = (char)NULL;
++-char *config_file = (char)NULL; /* alternate configuration file */
+++char *uad = NULL;
+++char *config_file = NULL; /* alternate configuration file */
++
++ headers_t headers, *ht;
++
++@@ -261,7 +261,7 @@ char *strip_post_ws(char *str)
++
++ p = (str + strlen(str));
++ while(isspace(*--p)) {
++- *p = (char)NULL;
+++ *p = '\0';
++ }
++
++ return(p);
++@@ -279,7 +279,7 @@ char *addr_parse(char *str)
++ #endif
++
++ /* Simple case with email address enclosed in <> */
++- if((p = strdup(str)) == (char *)NULL) {
+++ if((p = strdup(str)) == NULL) {
++ die("addr_parse(): strdup()");
++ }
++
++@@ -287,7 +287,7 @@ char *addr_parse(char *str)
++ q++;
++
++ if((p = strchr(q, '>'))) {
++- *p = (char)NULL;
+++ *p = '\0';
++ }
++
++ #if 0
++@@ -310,7 +310,7 @@ char *addr_parse(char *str)
++ q = strip_post_ws(p);
++ if(*q == ')') {
++ while((*--q != '('));
++- *q = (char)NULL;
+++ *q = '\0';
++ }
++ (void)strip_post_ws(p);
++
++@@ -349,7 +349,6 @@ standardise() -- Trim off '\n's and doub
++ */
++ bool_t standardise(char *str, bool_t *linestart)
++ {
++- size_t sl;
++ char *p;
++ bool_t leadingdot = False;
++
++@@ -363,7 +362,7 @@ bool_t standardise(char *str, bool_t *li
++ *linestart = False;
++
++ if((p = strchr(str, '\n'))) {
++- *p = (char)NULL;
+++ *p = '\0';
++ *linestart = True;
++ }
++ return(leadingdot);
++@@ -384,7 +383,7 @@ void revaliases(struct passwd *pw)
++ while(fgets(buf, sizeof(buf), fp)) {
++ /* Make comments invisible */
++ if((p = strchr(buf, '#'))) {
++- *p = (char)NULL;
+++ *p = '\0';
++ }
++
++ /* Ignore malformed lines and comments */
++@@ -519,11 +518,11 @@ void rcpt_save(char *str)
++ #endif
++
++ /* Ignore missing usernames */
++- if(*str == (char)NULL) {
+++ if(*str == '\0') {
++ return;
++ }
++
++- if((rt->string = strdup(str)) == (char *)NULL) {
+++ if((rt->string = strdup(str)) == NULL) {
++ die("rcpt_save() -- strdup() failed");
++ }
++
++@@ -548,7 +547,7 @@ void rcpt_parse(char *str)
++ (void)fprintf(stderr, "*** rcpt_parse(): str = [%s]\n", str);
++ #endif
++
++- if((p = strdup(str)) == (char *)NULL) {
+++ if((p = strdup(str)) == NULL) {
++ die("rcpt_parse(): strdup() failed");
++ }
++ q = p;
++@@ -576,7 +575,7 @@ void rcpt_parse(char *str)
++ }
++
++ /* End of string? */
++- if(*(q + 1) == (char)NULL) {
+++ if(*(q + 1) == '\0') {
++ got_addr = True;
++ }
++
++@@ -584,7 +583,7 @@ void rcpt_parse(char *str)
++ if((*q == ',') && (in_quotes == False)) {
++ got_addr = True;
++
++- *q = (char)NULL;
+++ *q = '\0';
++ }
++
++ if(got_addr) {
++@@ -668,7 +667,7 @@ void header_save(char *str)
++ (void)fprintf(stderr, "header_save(): str = [%s]\n", str);
++ #endif
++
++- if((p = strdup(str)) == (char *)NULL) {
+++ if((p = strdup(str)) == NULL) {
++ die("header_save() -- strdup() failed");
++ }
++ ht->string = p;
++@@ -676,7 +675,7 @@ void header_save(char *str)
++ if(strncasecmp(ht->string, "From:", 5) == 0) {
++ #if 1
++ /* Hack check for NULL From: line */
++- if(*(p + 6) == (char)NULL) {
+++ if(*(p + 6) == '\0') {
++ return;
++ }
++ #endif
++@@ -739,19 +738,19 @@ header_parse() -- Break headers into sep
++ void header_parse(FILE *stream)
++ {
++ size_t size = BUF_SZ, len = 0;
++- char *p = (char *)NULL, *q;
+++ char *p = NULL, *q;
++ bool_t in_header = True;
++- char l = (char)NULL;
+++ char l = '\0';
++ int c;
++
++ while(in_header && ((c = fgetc(stream)) != EOF)) {
++ /* Must have space for up to two more characters, since we
++ may need to insert a '\r' */
++- if((p == (char *)NULL) || (len >= (size - 1))) {
+++ if((p == NULL) || (len >= (size - 1))) {
++ size += BUF_SZ;
++
++ p = (char *)realloc(p, (size * sizeof(char)));
++- if(p == (char *)NULL) {
+++ if(p == NULL) {
++ die("header_parse() -- realloc() failed");
++ }
++ q = (p + len);
++@@ -776,9 +775,9 @@ void header_parse(FILE *stream)
++ in_header = False;
++
++ default:
++- *q = (char)NULL;
+++ *q = '\0';
++ if((q = strrchr(p, '\n'))) {
++- *q = (char)NULL;
+++ *q = '\0';
++ }
++ header_save(p);
++
++@@ -809,9 +808,9 @@ void header_parse(FILE *stream)
++ in_header = False;
++
++ default:
++- *q = (char)NULL;
+++ *q = '\0';
++ if((q = strrchr(p, '\n'))) {
++- *q = (char)NULL;
+++ *q = '\0';
++ }
++ header_save(p);
++
++@@ -876,11 +875,11 @@ bool_t read_config()
++ char *rightside;
++ /* Make comments invisible */
++ if((p = strchr(buf, '#'))) {
++- *p = (char)NULL;
+++ *p = '\0';
++ }
++
++ /* Ignore malformed lines and comments */
++- if(strchr(buf, '=') == (char *)NULL) continue;
+++ if(strchr(buf, '=') == NULL) continue;
++
++ /* Parse out keywords */
++ p=firsttok(&begin, "= \t\n");
++@@ -890,7 +889,7 @@ bool_t read_config()
++ }
++ if(p && q) {
++ if(strcasecmp(p, "Root") == 0) {
++- if((root = strdup(q)) == (char *)NULL) {
+++ if((root = strdup(q)) == NULL) {
++ die("parse_config() -- strdup() failed");
++ }
++
++@@ -904,7 +903,7 @@ bool_t read_config()
++ port = atoi(r);
++ }
++
++- if((mailhost = strdup(q)) == (char *)NULL) {
+++ if((mailhost = strdup(q)) == NULL) {
++ die("parse_config() -- strdup() failed");
++ }
++
++@@ -949,7 +948,7 @@ bool_t read_config()
++ mail_domain = strdup(q);
++ }
++
++- if(mail_domain == (char *)NULL) {
+++ if(mail_domain == NULL) {
++ die("parse_config() -- strdup() failed");
++ }
++ rewrite_domain = True;
++@@ -1025,7 +1024,7 @@ bool_t read_config()
++ }
++ }
++ else if(strcasecmp(p, "TLSCert") == 0) {
++- if((tls_cert = strdup(q)) == (char *)NULL) {
+++ if((tls_cert = strdup(q)) == NULL) {
++ die("parse_config() -- strdup() failed");
++ }
++
++@@ -1036,7 +1035,7 @@ bool_t read_config()
++ #endif
++ /* Command-line overrides these */
++ else if(strcasecmp(p, "AuthUser") == 0 && !auth_user) {
++- if((auth_user = strdup(q)) == (char *)NULL) {
+++ if((auth_user = strdup(q)) == NULL) {
++ die("parse_config() -- strdup() failed");
++ }
++
++@@ -1045,7 +1044,7 @@ bool_t read_config()
++ }
++ }
++ else if(strcasecmp(p, "AuthPass") == 0 && !auth_pass) {
++- if((auth_pass = strdup(q)) == (char *)NULL) {
+++ if((auth_pass = strdup(q)) == NULL) {
++ die("parse_config() -- strdup() failed");
++ }
++
++@@ -1054,7 +1053,7 @@ bool_t read_config()
++ }
++ }
++ else if(strcasecmp(p, "AuthMethod") == 0 && !auth_method) {
++- if((auth_method = strdup(q)) == (char *)NULL) {
+++ if((auth_method = strdup(q)) == NULL) {
++ die("parse_config() -- strdup() failed");
++ }
++
++@@ -1119,14 +1118,11 @@ int smtp_open(char *host, int port)
++ char buf[(BUF_SZ + 1)];
++
++ /* Init SSL stuff */
++- SSL_CTX *ctx;
++- SSL_METHOD *meth;
+++ SSL_CTX *ctx = NULL;
++ X509 *server_cert;
++-
++ SSL_load_error_strings();
++ SSLeay_add_ssl_algorithms();
++- meth=SSLv23_client_method();
++- ctx = SSL_CTX_new(meth);
+++ ctx = SSL_CTX_new(SSLv23_client_method());
++ if(!ctx) {
++ log_event(LOG_ERR, "No SSL support initiated\n");
++ return(-1);
++@@ -1310,7 +1306,7 @@ char *fd_gets(char *buf, int size, int f
++ buf[i++] = c;
++ }
++ }
++- buf[i] = (char)NULL;
+++ buf[i] = '\0';
++
++ return(buf);
++ }
++@@ -1434,14 +1430,14 @@ int ssmtp(char *argv[])
++ }
++
++ if((p = strtok(pw->pw_gecos, ";,"))) {
++- if((gecos = strdup(p)) == (char *)NULL) {
+++ if((gecos = strdup(p)) == NULL) {
++ die("ssmtp() -- strdup() failed");
++ }
++ }
++ revaliases(pw);
++
++ /* revaliases() may have defined this */
++- if(uad == (char *)NULL) {
+++ if(uad == NULL) {
++ uad = append_domain(pw->pw_name);
++ }
++
++@@ -1489,7 +1485,7 @@ int ssmtp(char *argv[])
++ /* Try to log in if username was supplied */
++ if(auth_user) {
++ #ifdef MD5AUTH
++- if(auth_pass == (char *)NULL) {
+++ if(auth_pass == NULL) {
++ auth_pass = strdup("");
++ }
++
++@@ -1508,7 +1504,7 @@ int ssmtp(char *argv[])
++ else {
++ #endif
++ memset(buf, 0, bufsize);
++- to64frombits(buf, auth_user, strlen(auth_user));
+++ to64frombits(buf, (unsigned char *)auth_user, strlen(auth_user));
++ if (use_oldauth) {
++ outbytes += smtp_write(sock, "AUTH LOGIN %s", buf);
++ }
++@@ -1520,7 +1516,7 @@ int ssmtp(char *argv[])
++ }
++ /* we assume server asked us for Username */
++ memset(buf, 0, bufsize);
++- to64frombits(buf, auth_user, strlen(auth_user));
+++ to64frombits(buf, (unsigned char *)auth_user, strlen(auth_user));
++ outbytes += smtp_write(sock, buf);
++ }
++
++@@ -1530,7 +1526,7 @@ int ssmtp(char *argv[])
++ }
++ memset(buf, 0, bufsize);
++
++- to64frombits(buf, auth_pass, strlen(auth_pass));
+++ to64frombits(buf, (unsigned char *)auth_pass, strlen(auth_pass));
++ #ifdef MD5AUTH
++ }
++ #endif
++@@ -1737,7 +1733,7 @@ char **parse_options(int argc, char *arg
++ j = 0;
++
++ add = 1;
++- while(argv[i][++j] != (char)NULL) {
+++ while(argv[i][++j] != '\0') {
++ switch(argv[i][j]) {
++ #ifdef INET6
++ case '6':
++@@ -1755,14 +1751,14 @@ char **parse_options(int argc, char *arg
++ if((!argv[i][(j + 1)])
++ && argv[(i + 1)]) {
++ auth_user = strdup(argv[i+1]);
++- if(auth_user == (char *)NULL) {
+++ if(auth_user == NULL) {
++ die("parse_options() -- strdup() failed");
++ }
++ add++;
++ }
++ else {
++ auth_user = strdup(argv[i]+j+1);
++- if(auth_user == (char *)NULL) {
+++ if(auth_user == NULL) {
++ die("parse_options() -- strdup() failed");
++ }
++ }
++@@ -1772,14 +1768,14 @@ char **parse_options(int argc, char *arg
++ if((!argv[i][(j + 1)])
++ && argv[(i + 1)]) {
++ auth_pass = strdup(argv[i+1]);
++- if(auth_pass == (char *)NULL) {
+++ if(auth_pass == NULL) {
++ die("parse_options() -- strdup() failed");
++ }
++ add++;
++ }
++ else {
++ auth_pass = strdup(argv[i]+j+1);
++- if(auth_pass == (char *)NULL) {
+++ if(auth_pass == NULL) {
++ die("parse_options() -- strdup() failed");
++ }
++ }
++@@ -1870,14 +1866,14 @@ char **parse_options(int argc, char *arg
++ case 'F':
++ if((!argv[i][(j + 1)]) && argv[(i + 1)]) {
++ minus_F = strdup(argv[(i + 1)]);
++- if(minus_F == (char *)NULL) {
+++ if(minus_F == NULL) {
++ die("parse_options() -- strdup() failed");
++ }
++ add++;
++ }
++ else {
++ minus_F = strdup(argv[i]+j+1);
++- if(minus_F == (char *)NULL) {
+++ if(minus_F == NULL) {
++ die("parse_options() -- strdup() failed");
++ }
++ }
++@@ -1889,14 +1885,14 @@ char **parse_options(int argc, char *arg
++ case 'r':
++ if((!argv[i][(j + 1)]) && argv[(i + 1)]) {
++ minus_f = strdup(argv[(i + 1)]);
++- if(minus_f == (char *)NULL) {
+++ if(minus_f == NULL) {
++ die("parse_options() -- strdup() failed");
++ }
++ add++;
++ }
++ else {
++ minus_f = strdup(argv[i]+j+1);
++- if(minus_f == (char *)NULL) {
+++ if(minus_f == NULL) {
++ die("parse_options() -- strdup() failed");
++ }
++ }
++--- a/base64.c
+++++ b/base64.c
++@@ -31,7 +31,7 @@ static const char base64val[] = {
++ };
++ #define DECODE64(c) (isascii(c) ? base64val[c] : BAD)
++
++-void to64frombits(unsigned char *out, const unsigned char *in, int inlen)
+++void to64frombits(char *out, const unsigned char *in, int inlen)
++ /* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */
++ {
++ for (; inlen >= 3; inlen -= 3)
++@@ -57,7 +57,7 @@ void to64frombits(unsigned char *out, co
++ *out = '\0';
++ }
++
++-int from64tobits(char *out, const char *in)
+++int from64tobits(unsigned char *out, const char *in)
++ /* base 64 to raw bytes in quasi-big-endian order, returning count of bytes */
++ {
++ int len = 0;
++--- a/ssmtp.h
+++++ b/ssmtp.h
++@@ -41,5 +41,5 @@ typedef struct string_list rcpt_t;
++ void get_arpadate(char *);
++
++ /* base64.c */
++-void to64frombits(unsigned char *, const unsigned char *, int);
++-int from64tobits(char *, const char *);
+++void to64frombits(char *, const unsigned char *, int);
+++int from64tobits(unsigned char *, const char *);
+diff --git a/feeds/packages/multimedia/crtmpserver/Makefile b/feeds/packages/multimedia/crtmpserver/Makefile
+new file mode 100644
+index 0000000..5f2a31e
+--- /dev/null
++++ b/feeds/packages/multimedia/crtmpserver/Makefile
+@@ -0,0 +1,95 @@
++#
++# Copyright (C) 2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=crtmpserver
++PKG_REV:=811
++PKG_VERSION:=r$(PKG_REV)
++PKG_RELEASE:=1
++PKG_BUILD_PARALLEL:=2
++PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
++PKG_LICENSE:=GPL-3.0
++
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=--username=anonymous --password= https://svn.rtmpd.com/crtmpserver/branches/1.0
++PKG_SOURCE_SUBDIR:=crtmpserver-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_PROTO:=svn
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/crtmpserver
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ DEPENDS:=+libopenssl +libstdcpp +liblua
++ TITLE:=C++ RTMP Server
++ URL:=http://www.rtmpd.com/
++endef
++
++define Package/crtmpserver/description
++C++ RTMP Server it is a high performance streaming server able to
++stream (live or recorded) in the following technologies:
++ * To and from Flash (RTMP,RTMPE, RTMPS, RTMPT, RTMPTE)
++ * To and from embedded devices: iPhone, Android
++ * From surveillance cameras
++ * IP-TV using MPEG-TS and RTSP/RTCP/RTP protocols
++
++Also, crtmpserver can be used as a high performance rendes-vous
++server. For example, it enables you to do:
++ * Audio/Video conferencing
++ * Online gaming
++ * Online collaboration
++ * Simple/complex chat applications
++endef
++
++define Package/crtmpserver/conffiles
++/etc/crtmpserver.lua
++endef
++
++# XXX: this hack handles the usr/bin vs bin difference of backfire and trunk
++TS_BASE:=$(wildcard $(TOOLCHAIN_DIR)/bin/$(TARGET_CC))
++TS_BASE:=$(dir $(if $(TS_BASE),$(TS_BASE),$(wildcard $(TOOLCHAIN_DIR)/usr/bin/$(TARGET_CC))))
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR)/builders/make; \
++ cp linux.mk linux-openwrt-uclibc.mk; \
++ $(SED) 's,^TOOLCHAIN_BASE[[:space:]]*=.*,TOOLCHAIN_BASE=$(TS_BASE),' \
++ -e 's,^TOOLCHAIN_PREFIX[[:space:]]*=.*,TOOLCHAIN_PREFIX=$(TARGET_CROSS),' \
++ -e 's,^CCOMPILER[[:space:]]*=.*,CCOMPILER=$(TARGET_CC),' \
++ -e 's,^CXXCOMPILER[[:space:]]*=.*,CXXCOMPILER=$(TARGET_CXX),' \
++ -e 's,^OPTIMIZATIONS[[:space:]]*=.*,OPTIMIZATIONS=-O2,' \
++ -e 's,^SSL_BASE[[:space:]]*=.*,SSL_BASE=$(STAGING_DIR)/usr,' \
++ linux-openwrt-uclibc.mk)
++endef
++
++define Build/Compile
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/builders/make \
++ PLATFORM=linux-openwrt-uclibc -Wno-error -j6
++endef
++
++define Package/crtmpserver/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/builders/make/output/dynamic/crtmpserver $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib/crtmpserver
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/builders/make/output/dynamic/*.so $(1)/usr/lib/crtmpserver/
++ $(foreach app,flvplayback samplefactory admin stresstest appselector vptests applestreamingclient proxypublish, \
++ $(INSTALL_DIR) $(1)/usr/lib/crtmpserver/$(app); \
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/builders/make/output/dynamic/applications/$(app)/lib$(app).so \
++ $(1)/usr/lib/crtmpserver/$(app)/; \
++ )
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/builders/make/output/dynamic/crtmpserver.lua $(1)/etc/
++ $(INSTALL_DIR) $(1)/usr/share/crtmpserver/appselector
++ $(INSTALL_DIR) $(1)/usr/share/crtmpserver/media
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/crtmpserver.init $(1)/etc/init.d/crtmpserver
++endef
++
++$(eval $(call BuildPackage,crtmpserver))
++
+diff --git a/feeds/packages/multimedia/crtmpserver/files/crtmpserver.init b/feeds/packages/multimedia/crtmpserver/files/crtmpserver.init
+new file mode 100644
+index 0000000..cea3512
+--- /dev/null
++++ b/feeds/packages/multimedia/crtmpserver/files/crtmpserver.init
+@@ -0,0 +1,30 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2010 OpenWrt.org
++
++START=99
++STOP=80
++
++SERVICE_USE_PID=1
++
++CRTMPSERVER_BIN="/usr/bin/crtmpserver"
++CRTMPSERVER_CONFIG="/etc/crtmpserver.lua"
++CRTMPSERVER_PID="/var/run/crtmpserver.pid"
++
++start()
++{
++ echo "start $CRTMPSERVER_BIN"
++ start-stop-daemon -S -x "$CRTMPSERVER_BIN" -- --daemon --pid="$CRTMPSERVER_PID" \
++ "$CRTMPSERVER_CONFIG"
++}
++stop() {
++
++ echo "stop $CRTMPSERVER_BIN"
++ start-stop-daemon -K -x $CRTMPSERVER_BIN -p $CRTMPSERVER_PID
++}
++
++reload()
++{
++ stop
++ start
++}
++
+diff --git a/feeds/packages/multimedia/crtmpserver/patches/010-link-crypt-for-lua.patch b/feeds/packages/multimedia/crtmpserver/patches/010-link-crypt-for-lua.patch
+new file mode 100644
+index 0000000..ec75818
+--- /dev/null
++++ b/feeds/packages/multimedia/crtmpserver/patches/010-link-crypt-for-lua.patch
+@@ -0,0 +1,11 @@
++--- a/builders/make/compile.mk
+++++ b/builders/make/compile.mk
++@@ -67,7 +67,7 @@ TINYXML_OBJS = $(TINYXML_SRCS:.cpp=.tiny
++
++ #common
++ COMMON_INCLUDE=$(LUA_INCLUDE) $(TINYXML_INCLUDE) $(SSL_INCLUDE) -I$(PROJECT_BASE_PATH)/sources/common/include
++-COMMON_LIBS=$(SSL_LIB) -L$(OUTPUT_DYNAMIC) -llua -ltinyxml
+++COMMON_LIBS=$(SSL_LIB) -L$(OUTPUT_DYNAMIC) -llua -ltinyxml -lcrypt
++ COMMON_SRCS = $(shell find $(PROJECT_BASE_PATH)/sources/common/src -type f -name "*.cpp")
++ COMMON_OBJS = $(COMMON_SRCS:.cpp=.common.o)
++
+diff --git a/feeds/packages/multimedia/crtmpserver/patches/020-add-rpath.patch b/feeds/packages/multimedia/crtmpserver/patches/020-add-rpath.patch
+new file mode 100644
+index 0000000..1ea8320
+--- /dev/null
++++ b/feeds/packages/multimedia/crtmpserver/patches/020-add-rpath.patch
+@@ -0,0 +1,13 @@
++--- a/builders/make/linux.mk
+++++ b/builders/make/linux.mk
++@@ -31,8 +31,8 @@ OPTIMIZATIONS = -O3
++ COMPILE_FLAGS = $(FPIC) $(OPTIMIZATIONS) $(CFLAGS)
++
++ #linking flags
++-dynamic_lib_flags = $(FPIC) $(OPTIMIZATIONS) -Wl,-soname,$(DYNAMIC_LIB_PREFIX)$(1)$(DYNAMIC_LIB_SUFIX) -Wl,-rpath,"\$$ORIGIN"
++-dynamic_exec_flags = $(FPIC) $(OPTIMIZATIONS) -Wl,-rpath,"\$$ORIGIN"
+++dynamic_lib_flags = $(FPIC) $(OPTIMIZATIONS) -Wl,-soname,$(DYNAMIC_LIB_PREFIX)$(1)$(DYNAMIC_LIB_SUFIX) -Wl,-rpath,/usr/lib/crtmpserver
+++dynamic_exec_flags = $(FPIC) $(OPTIMIZATIONS) -Wl,-rpath,/usr/lib/crtmpserver
++
++ #compile switches
++ PLATFORM_DEFINES = \
+diff --git a/feeds/packages/multimedia/crtmpserver/patches/030-default-config.patch b/feeds/packages/multimedia/crtmpserver/patches/030-default-config.patch
+new file mode 100644
+index 0000000..c37644c
+--- /dev/null
++++ b/feeds/packages/multimedia/crtmpserver/patches/030-default-config.patch
+@@ -0,0 +1,60 @@
++--- a/builders/cmake/crtmpserver/crtmpserver.lua
+++++ b/builders/cmake/crtmpserver/crtmpserver.lua
++@@ -4,7 +4,7 @@ configuration=
++ {
++ -- if true, the server will run as a daemon.
++ -- NOTE: all console appenders will be ignored if this is a daemon
++- daemon=false,
+++ daemon=true,
++ -- the OS's path separator. Used in composing paths
++ pathSeparator="/",
++
++@@ -44,7 +44,7 @@ configuration=
++ {
++ -- this is the root directory of all applications
++ -- usually this is relative to the binary execuable
++- rootDirectory="applications",
+++ rootDirectory="/usr/lib/crtmpserver",
++
++
++ --this is where the applications array starts
++@@ -68,7 +68,7 @@ configuration=
++ -- this is the folder from where the current application gets it's content.
++ -- It is optional. If not specified, it will be defaulted to:
++ -- <rootDirectory>/<name>/mediaFolder
++- -- mediaFolder="/some/directory/where/media/files/are/stored"
+++ mediaFolder="/usr/share/crtmpserver/appselector",
++ -- the application will also be known by that names. It is optional
++ --aliases=
++ --{
++@@ -89,13 +89,6 @@ configuration=
++ },
++ {
++ ip="0.0.0.0",
++- port=8081,
++- protocol="inboundRtmps",
++- sslKey="server.key",
++- sslCert="server.crt"
++- },
++- {
++- ip="0.0.0.0",
++ port=8080,
++ protocol="inboundRtmpt"
++ },
++@@ -105,7 +98,7 @@ configuration=
++ description="FLV Playback Sample",
++ name="flvplayback",
++ protocol="dynamiclinklibrary",
++- mediaFolder="/Volumes/android/backup/media/",
+++ mediaFolder="/media/",
++ aliases=
++ {
++ "simpleLive",
++@@ -183,6 +176,7 @@ configuration=
++ name="samplefactory",
++ description="asdsadasdsa",
++ protocol="dynamiclinklibrary",
+++ mediaFolder="/usr/share/ctmpserver/media",
++ aliases=
++ {
++ "httpOutboundTest"
+diff --git a/feeds/packages/multimedia/crtmpserver/patches/040-use-select.patch b/feeds/packages/multimedia/crtmpserver/patches/040-use-select.patch
+new file mode 100644
+index 0000000..466f86c
+--- /dev/null
++++ b/feeds/packages/multimedia/crtmpserver/patches/040-use-select.patch
+@@ -0,0 +1,13 @@
++Index: crtmpserver-r726/builders/make/linux.mk
++===================================================================
++--- crtmpserver-r726.orig/builders/make/linux.mk
+++++ crtmpserver-r726/builders/make/linux.mk
++@@ -38,7 +38,7 @@ dynamic_exec_flags = $(FPIC) $(OPTIMIZAT
++ PLATFORM_DEFINES = \
++ -DLINUX \
++ -DLITTLE_ENDIAN_BYTE_ALIGNED \
++- -DNET_EPOLL
+++ -DNET_SELECT
++
++ SSL_BASE=/usr/local
++
+diff --git a/feeds/packages/multimedia/crtmpserver/patches/050-add-missing-make-defines.patch b/feeds/packages/multimedia/crtmpserver/patches/050-add-missing-make-defines.patch
+new file mode 100644
+index 0000000..f9ff617
+--- /dev/null
++++ b/feeds/packages/multimedia/crtmpserver/patches/050-add-missing-make-defines.patch
+@@ -0,0 +1,57 @@
++--- a/builders/make/compile.mk
+++++ b/builders/make/compile.mk
++@@ -43,17 +43,22 @@ FEATURES_DEFINES = \
++ -DHAS_PROTOCOL_RTP \
++ -DHAS_PROTOCOL_TS \
++ -DHAS_PROTOCOL_VAR \
+++ -DHAS_PROTOCOL_CLI \
+++ -DHAS_PROTOCOL_HLS \
+++ -DHAS_PROTOCOL_RAWHTTPSTREAM \
++ -DHAS_LUA \
++ -DHAS_MEDIA_MP3 \
++ -DHAS_MEDIA_MP4 \
++- -DHAS_MEDIA_FLV
+++ -DHAS_MEDIA_FLV \
+++ -DHAS_SYSLOG
+++
++
++
++ DEFINES = $(PLATFORM_DEFINES) $(FEATURES_DEFINES)
++
++ #library paths
++ SSL_INCLUDE=-I$(SSL_BASE)/include
++-SSL_LIB=-L$(SSL_BASE)/lib -lssl -lcrypto
+++SSL_LIB=-L$(SSL_BASE)/lib -lssl -lcrypto -ldl
++
++ #lua
++ LUA_INCLUDE=-I$(PROJECT_BASE_PATH)/3rdparty/lua-dev
++@@ -67,25 +72,25 @@ TINYXML_OBJS = $(TINYXML_SRCS:.cpp=.tiny
++
++ #common
++ COMMON_INCLUDE=$(LUA_INCLUDE) $(TINYXML_INCLUDE) $(SSL_INCLUDE) -I$(PROJECT_BASE_PATH)/sources/common/include
++-COMMON_LIBS=$(SSL_LIB) -L$(OUTPUT_DYNAMIC) -llua -ltinyxml -lcrypt
+++COMMON_LIBS=$(SSL_LIB) -L$(OUTPUT_DYNAMIC) $(PROJECT_BASE_PATH)/builders/make/output/dynamic/liblua.so -ltinyxml -lcrypt -ldl
++ COMMON_SRCS = $(shell find $(PROJECT_BASE_PATH)/sources/common/src -type f -name "*.cpp")
++ COMMON_OBJS = $(COMMON_SRCS:.cpp=.common.o)
++
++ #thelib
++ THELIB_INCLUDE=$(COMMON_INCLUDE) -I$(PROJECT_BASE_PATH)/sources/thelib/include
++-THELIB_LIBS=$(COMMON_LIBS) -L$(OUTPUT_DYNAMIC) -lcommon
+++THELIB_LIBS=$(COMMON_LIBS) -L$(OUTPUT_DYNAMIC) -lcommon -ldl
++ THELIB_SRCS = $(shell find $(PROJECT_BASE_PATH)/sources/thelib/src -type f -name "*.cpp")
++ THELIB_OBJS = $(THELIB_SRCS:.cpp=.thelib.o)
++
++ #tests
++ TESTS_INCLUDE=$(THELIB_INCLUDE) -I$(PROJECT_BASE_PATH)/sources/tests/include
++-TESTS_LIBS=$(THELIB_LIBS) -L$(OUTPUT_DYNAMIC) -lthelib
+++TESTS_LIBS=$(THELIB_LIBS) -L$(OUTPUT_DYNAMIC) -lthelib -ldl
++ TESTS_SRCS=$(shell find $(PROJECT_BASE_PATH)/sources/tests/src -type f -name "*.cpp")
++ TESTS_OBJS=$(TESTS_SRCS:.cpp=.tests.o)
++
++ #crtmpserver
++ CRTMPSERVER_INCLUDE=$(THELIB_INCLUDE) -I$(PROJECT_BASE_PATH)/sources/crtmpserver/include
++-CRTMPSERVER_LIBS=$(THELIB_LIBS) -L$(OUTPUT_DYNAMIC) -lthelib
+++CRTMPSERVER_LIBS=$(THELIB_LIBS) -L$(OUTPUT_DYNAMIC) -lthelib -ldl
++ CRTMPSERVER_SRCS=$(shell find $(PROJECT_BASE_PATH)/sources/crtmpserver/src -type f -name "*.cpp")
++ CRTMPSERVER_OBJS_DYNAMIC=$(CRTMPSERVER_SRCS:.cpp=.crtmpserver_dynamic.o)
++ CRTMPSERVER_OBJS_STATIC=$(CRTMPSERVER_SRCS:.cpp=.crtmpserver_static.o)
+diff --git a/feeds/packages/multimedia/crtmpserver/patches/060-add-missing-includes.patch b/feeds/packages/multimedia/crtmpserver/patches/060-add-missing-includes.patch
+new file mode 100644
+index 0000000..505b5f3
+--- /dev/null
++++ b/feeds/packages/multimedia/crtmpserver/patches/060-add-missing-includes.patch
+@@ -0,0 +1,26 @@
++--- a/sources/common/include/common.h
+++++ b/sources/common/include/common.h
++@@ -20,6 +20,10 @@
++ #ifndef _COMMON_H
++ #define _COMMON_H
++
+++#include <stdio.h>
+++#include <unistd.h>
+++#include <sys/types.h>
+++
++ #include "defines.h"
++ #include "platform/platform.h"
++ #include "utils/utils.h"
++--- a/sources/common/src/utils/logging/fileloglocation.cpp
+++++ b/sources/common/src/utils/logging/fileloglocation.cpp
++@@ -18,6 +18,10 @@
++ */
++
++
+++#include <stdio.h>
+++#include <unistd.h>
+++#include <sys/types.h>
+++
++ #include "utils/logging/fileloglocation.h"
++ #include "utils/lua/luautils.h"
++
+diff --git a/feeds/packages/multimedia/crtmpserver/patches/070-missing-include-gcc-47.patch b/feeds/packages/multimedia/crtmpserver/patches/070-missing-include-gcc-47.patch
+new file mode 100644
+index 0000000..94d80e7
+--- /dev/null
++++ b/feeds/packages/multimedia/crtmpserver/patches/070-missing-include-gcc-47.patch
+@@ -0,0 +1,10 @@
++--- a/3rdparty/tinyxml/tinyxml.h
+++++ b/3rdparty/tinyxml/tinyxml.h
++@@ -39,6 +39,7 @@ distribution.
++ #include <string>
++ #include <iostream>
++ #include <sstream>
+++#include "lstate.h"
++
++ // Help out windows:
++ #if defined( _DEBUG ) && !defined( DEBUG )
+diff --git a/feeds/packages/multimedia/crtmpserver/patches/080-musl-uint32_t.patch b/feeds/packages/multimedia/crtmpserver/patches/080-musl-uint32_t.patch
+new file mode 100644
+index 0000000..51d6712
+--- /dev/null
++++ b/feeds/packages/multimedia/crtmpserver/patches/080-musl-uint32_t.patch
+@@ -0,0 +1,91 @@
++--- a/sources/common/include/platform/linux/max.h
+++++ b/sources/common/include/platform/linux/max.h
++@@ -21,87 +21,7 @@
++ #ifndef _MAX_H
++ #define _MAX_H
++
++-#ifdef UINT64_MAX
++-#undef UINT64_MAX
++-#endif
++-
++-#ifdef INT64_MAX
++-#undef INT64_MAX
++-#endif
++-
++-#ifdef UINT32_MAX
++-#undef UINT32_MAX
++-#endif
++-
++-#ifdef INT32_MAX
++-#undef INT32_MAX
++-#endif
++-
++-#ifdef UINT16_MAX
++-#undef UINT16_MAX
++-#endif
++-
++-#ifdef INT16_MAX
++-#undef INT16_MAX
++-#endif
++-
++-#ifdef UINT8_MAX
++-#undef UINT8_MAX
++-#endif
++-
++-#ifdef INT8_MAX
++-#undef INT8_MAX
++-#endif
++-
++-
++-
++-#ifndef UINT64_MAX
++-#define UINT64_MAX ((uint64_t)(0xffffffffffffffffULL))
++-#endif
++-
++-#ifndef INT64_MAX
++-#define INT64_MAX ((int64_t)(0x7fffffffffffffffLL))
++-#endif
++-
++-#ifndef INT64_MIN
++-#define INT64_MIN ((int64_t)(0x8000000000000000LL))
++-#endif
++-
++-#ifndef UINT32_MAX
++-#define UINT32_MAX ((uint32_t)(0xffffffffUL))
++-#endif
++-
++-#ifndef INT32_MAX
++-#define INT32_MAX ((int32_t)(0x7fffffffL))
++-#endif
++-
++-#ifndef INT32_MIN
++-#define INT32_MIN ((int32_t)(0x80000000L))
++-#endif
++-
++-#ifndef UINT16_MAX
++-#define UINT16_MAX ((uint16_t)(0xffff))
++-#endif
++-
++-#ifndef INT16_MAX
++-#define INT16_MAX ((int16_t)(0x7fff))
++-#endif
++-
++-#ifndef INT16_MIN
++-#define INT16_MIN ((int16_t)(0x8000))
++-#endif
++-
++-#ifndef UINT8_MAX
++-#define UINT8_MAX ((uint8_t)(0xff))
++-#endif
++-
++-#ifndef INT8_MAX
++-#define INT8_MAX ((int8_t)(0x7f))
++-#endif
++-
++-#ifndef INT8_MIN
++-#define INT8_MIN ((int8_t)(0x80))
++-#endif
+++#include <stdint.h>
++
++ #endif /* _MAX_H */
++ #endif /* LINUX */
+diff --git a/feeds/packages/multimedia/ffmpeg/Config.in b/feeds/packages/multimedia/ffmpeg/Config.in
+new file mode 100644
+index 0000000..760dad6
+--- /dev/null
++++ b/feeds/packages/multimedia/ffmpeg/Config.in
+@@ -0,0 +1,434 @@
++menu "Configuration"
++ depends on PACKAGE_libffmpeg-custom
++
++config FFMPEG_CUSTOM_PATENTED
++ bool "Include patented codecs and technologies"
++ default BUILD_PATENTED
++
++comment "Profiles ---"
++
++config FFMPEG_CUSTOM_FFSERVER_SUPPORT
++ bool "Include support for ffserver (FFmpeg streaming server)"
++ select FFMPEG_CUSTOM_MUXER_ffm
++ select FFMPEG_CUSTOM_DEMUXER_ffm
++ select FFMPEG_CUSTOM_DEMUXER_rtsp
++ select FFMPEG_CUSTOM_PROTOCOL_rtp
++
++config FFMPEG_CUSTOM_MINIDLNA_SUPPORT
++ bool "Include support for minidlna"
++ depends on FFMPEG_CUSTOM_PATENTED
++ select FFMPEG_CUSTOM_DECODER_aac
++ select FFMPEG_CUSTOM_DECODER_ac3
++ select FFMPEG_CUSTOM_DECODER_flac
++ select FFMPEG_CUSTOM_DECODER_h264
++ select FFMPEG_CUSTOM_DECODER_jpegls
++ select FFMPEG_CUSTOM_DECODER_mp3
++ select FFMPEG_CUSTOM_DECODER_mpeg1video
++ select FFMPEG_CUSTOM_DECODER_mpeg2video
++ select FFMPEG_CUSTOM_DECODER_mpeg4
++ select FFMPEG_CUSTOM_DECODER_mpegvideo
++ select FFMPEG_CUSTOM_DECODER_png
++ select FFMPEG_CUSTOM_DECODER_wmav1
++ select FFMPEG_CUSTOM_DECODER_wmav2
++ select FFMPEG_CUSTOM_DEMUXER_aac
++ select FFMPEG_CUSTOM_DEMUXER_ac3
++ select FFMPEG_CUSTOM_DEMUXER_avi
++ select FFMPEG_CUSTOM_DEMUXER_flac
++ select FFMPEG_CUSTOM_DEMUXER_h264
++ select FFMPEG_CUSTOM_DEMUXER_matroska
++ select FFMPEG_CUSTOM_DEMUXER_mov
++ select FFMPEG_CUSTOM_DEMUXER_mp3
++ select FFMPEG_CUSTOM_DEMUXER_mpegts
++ select FFMPEG_CUSTOM_DEMUXER_mpegvideo
++ select FFMPEG_CUSTOM_PARSER_ac3
++ select FFMPEG_CUSTOM_PARSER_flac
++ select FFMPEG_CUSTOM_PARSER_h264
++ select FFMPEG_CUSTOM_PARSER_mpeg4video
++ select FFMPEG_CUSTOM_PARSER_mpegaudio
++ select FFMPEG_CUSTOM_PROTOCOL_file
++
++config FFMPEG_CUSTOM_AUDIO_DEC_SUPPORT
++ bool "Include support for most audio decoding requirements"
++ depends on FFMPEG_CUSTOM_PATENTED
++ select FFMPEG_CUSTOM_DECODER_aac
++ select FFMPEG_CUSTOM_DECODER_aac_latm
++ select FFMPEG_CUSTOM_DECODER_ac3
++ select FFMPEG_CUSTOM_SELECT_adpcm
++ select FFMPEG_CUSTOM_DECODER_alac
++ select FFMPEG_CUSTOM_DECODER_amrnb
++ select FFMPEG_CUSTOM_DECODER_amrwb
++ select FFMPEG_CUSTOM_DECODER_ape
++ select FFMPEG_CUSTOM_DECODER_atrac3
++ select FFMPEG_CUSTOM_DECODER_flac
++ select FFMPEG_CUSTOM_DECODER_mp2
++ select FFMPEG_CUSTOM_DECODER_mp3
++ select FFMPEG_CUSTOM_DECODER_mpc7
++ select FFMPEG_CUSTOM_DECODER_mpc8
++ select FFMPEG_CUSTOM_DECODER_opus
++ select FFMPEG_CUSTOM_DECODER_pcm_s16be
++ select FFMPEG_CUSTOM_DECODER_pcm_s16le
++ select FFMPEG_CUSTOM_SELECT_speex
++ select FFMPEG_CUSTOM_DECODER_vorbis
++ select FFMPEG_CUSTOM_DECODER_wavpack
++ select FFMPEG_CUSTOM_DECODER_wmav1
++ select FFMPEG_CUSTOM_DECODER_wmav2
++ select FFMPEG_CUSTOM_DECODER_wmalossless
++ select FFMPEG_CUSTOM_DECODER_wmapro
++ select FFMPEG_CUSTOM_DECODER_zlib
++ select FFMPEG_CUSTOM_DEMUXER_aac
++ select FFMPEG_CUSTOM_DEMUXER_ac3
++ select FFMPEG_CUSTOM_DEMUXER_aiff
++ select FFMPEG_CUSTOM_DEMUXER_amr
++ select FFMPEG_CUSTOM_DEMUXER_ape
++ select FFMPEG_CUSTOM_DEMUXER_avi
++ select FFMPEG_CUSTOM_DEMUXER_flac
++ select FFMPEG_CUSTOM_DEMUXER_ffm
++ select FFMPEG_CUSTOM_DEMUXER_matroska
++ select FFMPEG_CUSTOM_DEMUXER_mp3
++ select FFMPEG_CUSTOM_DEMUXER_mov
++ select FFMPEG_CUSTOM_DEMUXER_mpc
++ select FFMPEG_CUSTOM_DEMUXER_mpc8
++ select FFMPEG_CUSTOM_DEMUXER_mpegts
++ select FFMPEG_CUSTOM_DEMUXER_ogg
++ select FFMPEG_CUSTOM_DEMUXER_rm
++ select FFMPEG_CUSTOM_DEMUXER_rtsp
++ select FFMPEG_CUSTOM_DEMUXER_rtp
++ select FFMPEG_CUSTOM_DEMUXER_sdp
++ select FFMPEG_CUSTOM_DEMUXER_wav
++ select FFMPEG_CUSTOM_DEMUXER_wv
++ select FFMPEG_CUSTOM_PARSER_aac
++ select FFMPEG_CUSTOM_PARSER_aac_latm
++ select FFMPEG_CUSTOM_PARSER_ac3
++ select FFMPEG_CUSTOM_PARSER_flac
++ select FFMPEG_CUSTOM_PARSER_mpegaudio
++ select FFMPEG_CUSTOM_PARSER_opus
++ select FFMPEG_CUSTOM_PROTOCOL_file
++ select FFMPEG_CUSTOM_PROTOCOL_http
++ select FFMPEG_CUSTOM_PROTOCOL_rtp
++ select FFMPEG_CUSTOM_PROTOCOL_tcp
++ select FFMPEG_CUSTOM_PROTOCOL_udp
++
++comment "External Libraries ---"
++
++config FFMPEG_CUSTOM_SELECT_libopus
++ bool "Opus"
++
++config FFMPEG_CUSTOM_SELECT_speex
++ bool "Speex"
++
++comment "Encoders ---"
++
++config FFMPEG_CUSTOM_ENCODER_ac3
++ bool "AC3"
++ depends on FFMPEG_CUSTOM_PATENTED
++ select FFMPEG_CUSTOM_PARSER_ac3
++
++config FFMPEG_CUSTOM_ENCODER_jpegls
++ bool "JPEG-LS"
++
++config FFMPEG_CUSTOM_ENCODER_mpeg1video
++ bool "MPEG-1 Video"
++
++config FFMPEG_CUSTOM_ENCODER_mpeg2video
++ bool "MPEG-2 Video"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_ENCODER_mpeg4
++ bool "MPEG-4"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_ENCODER_pcm_s16be
++ bool "PCM signed 16-bit big-endian"
++
++config FFMPEG_CUSTOM_ENCODER_pcm_s16le
++ bool "PCM signed 16-bit little-endian"
++
++config FFMPEG_CUSTOM_ENCODER_png
++ bool "PNG"
++ select FFMPEG_CUSTOM_ENCODER_zlib
++
++config FFMPEG_CUSTOM_ENCODER_vorbis
++ bool "Vorbis"
++
++config FFMPEG_CUSTOM_ENCODER_zlib
++ bool "Zlib"
++
++comment "Decoders ---"
++
++config FFMPEG_CUSTOM_DECODER_aac
++ bool "AAC (Advanced Audio Coding)"
++ depends on FFMPEG_CUSTOM_PATENTED
++ select FFMPEG_CUSTOM_PARSER_aac
++
++config FFMPEG_CUSTOM_SELECT_adpcm
++ bool "ADPCM (multiple types)"
++
++config FFMPEG_CUSTOM_DECODER_ac3
++ bool "AC3"
++ depends on FFMPEG_CUSTOM_PATENTED
++ select FFMPEG_CUSTOM_PARSER_ac3
++
++config FFMPEG_CUSTOM_DECODER_alac
++ bool "ALAC"
++
++config FFMPEG_CUSTOM_DECODER_amrnb
++ bool "AMR-NB"
++ select FFMPEG_CUSTOM_DEMUXER_amr
++
++config FFMPEG_CUSTOM_DECODER_amrwb
++ bool "AMR-WB"
++ select FFMPEG_CUSTOM_DEMUXER_amr
++
++config FFMPEG_CUSTOM_DECODER_ape
++ bool "APE"
++
++config FFMPEG_CUSTOM_DECODER_atrac3
++ bool "ATRAC3"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_DECODER_flac
++ bool "FLAC"
++ select FFMPEG_CUSTOM_PARSER_flac
++
++config FFMPEG_CUSTOM_DECODER_gif
++ bool "GIF"
++
++config FFMPEG_CUSTOM_DECODER_h264
++ bool "H.264"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_DECODER_jpegls
++ bool "JPEG-LS"
++
++config FFMPEG_CUSTOM_DECODER_mp2
++ bool "MP2 (MPEG Audio Layer 2)"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_DECODER_mp3
++ bool "MP3 (MPEG Audio Layer 2)"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_DECODER_mpegvideo
++ bool "MPEG Video"
++
++config FFMPEG_CUSTOM_DECODER_mpeg1video
++ bool "MPEG-1 Video"
++
++config FFMPEG_CUSTOM_DECODER_mpeg2video
++ bool "MPEG-2 Video"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_DECODER_mpeg4
++ bool "MPEG-4"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_DECODER_mpc7
++ bool "Musepack 7"
++ select FFMPEG_CUSTOM_DEMUXER_mpc
++
++config FFMPEG_CUSTOM_DECODER_mpc8
++ bool "Musepack 8"
++ select FFMPEG_CUSTOM_DEMUXER_mpc8
++
++config FFMPEG_CUSTOM_DECODER_opus
++ bool "Opus"
++
++config FFMPEG_CUSTOM_DECODER_pcm_s16be
++ bool "PCM signed 16-bit big-endian"
++
++config FFMPEG_CUSTOM_DECODER_pcm_s16le
++ bool "PCM signed 16-bit little-endian"
++
++config FFMPEG_CUSTOM_DECODER_png
++ bool "PNG"
++ select FFMPEG_CUSTOM_DECODER_zlib
++
++config FFMPEG_CUSTOM_DECODER_vorbis
++ bool "Vorbis"
++ select FFMPEG_CUSTOM_DEMUXER_ogg
++
++config FFMPEG_CUSTOM_DECODER_wavpack
++ bool "Wavpack"
++
++config FFMPEG_CUSTOM_DECODER_wmav1
++ bool "WMAv1"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_DECODER_wmav2
++ bool "WMAv2"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_DECODER_zlib
++ bool "Zlib"
++
++comment "Muxers ---"
++
++config FFMPEG_CUSTOM_MUXER_ac3
++ bool "AC3"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_MUXER_ffm
++ bool "FFM (ffserver live feed)"
++
++config FFMPEG_CUSTOM_MUXER_h264
++ bool "H.264"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_MUXER_mp3
++ bool "MP3 (MPEG Audio Layer 3)"
++
++config FFMPEG_CUSTOM_MUXER_mp4
++ bool "MP4"
++
++config FFMPEG_CUSTOM_MUXER_mpeg1video
++ bool "MPEG-1 Video"
++
++config FFMPEG_CUSTOM_MUXER_mpeg2video
++ bool "MPEG-2 Video"
++
++config FFMPEG_CUSTOM_MUXER_mpegts
++ bool "MPEG-2 (TS)"
++
++config FFMPEG_CUSTOM_MUXER_ogg
++ bool "Ogg"
++
++config FFMPEG_CUSTOM_MUXER_rtp
++ bool "RTP"
++
++comment "Demuxers ---"
++
++config FFMPEG_CUSTOM_DEMUXER_aac
++ bool "AAC"
++
++config FFMPEG_CUSTOM_DEMUXER_avi
++ bool "AVI (Audio Video Interleave)"
++
++config FFMPEG_CUSTOM_DEMUXER_ac3
++ bool "AC3"
++
++config FFMPEG_CUSTOM_DEMUXER_amr
++ bool "AMR"
++
++config FFMPEG_CUSTOM_DEMUXER_ape
++ bool "APE"
++
++config FFMPEG_CUSTOM_DEMUXER_flac
++ bool "FLAC"
++
++config FFMPEG_CUSTOM_DEMUXER_ffm
++ bool "FFM (ffserver live feed)"
++
++config FFMPEG_CUSTOM_DEMUXER_h264
++ bool "H.264"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_DEMUXER_matroska
++ bool "Matroska (MKA,MKV)"
++ select FFMPEG_CUSTOM_DECODER_zlib
++
++config FFMPEG_CUSTOM_DEMUXER_mov
++ bool "MOV/MP4/M4A/3GP/3G2/MJ2"
++ select FFMPEG_CUSTOM_DECODER_zlib
++
++config FFMPEG_CUSTOM_DEMUXER_mp3
++ bool "MP3 (MPEG Audio Layer 3)"
++ select FFMPEG_CUSTOM_PARSER_mpegaudio
++
++config FFMPEG_CUSTOM_DEMUXER_mpegvideo
++ bool "MPEG Video"
++
++config FFMPEG_CUSTOM_DEMUXER_mpegps
++ bool "MPEG-2 (PS)"
++
++config FFMPEG_CUSTOM_DEMUXER_mpegts
++ bool "MPEG-2 (TS)"
++
++config FFMPEG_CUSTOM_DEMUXER_mpc
++ bool "Musepack"
++
++config FFMPEG_CUSTOM_DEMUXER_mpc8
++ bool "Musepack 8"
++
++config FFMPEG_CUSTOM_DEMUXER_ogg
++ bool "Ogg"
++
++config FFMPEG_CUSTOM_DEMUXER_rm
++ bool "RM"
++ help
++ RealMedia format demuxer
++
++config FFMPEG_CUSTOM_DEMUXER_rtsp
++ bool "RTSP"
++ select FFMPEG_CUSTOM_DEMUXER_rm
++ select FFMPEG_CUSTOM_DEMUXER_sdp
++ select FFMPEG_CUSTOM_DEMUXER_rtp
++
++config FFMPEG_CUSTOM_DEMUXER_sdp
++ bool "SDP"
++ select FFMPEG_CUSTOM_DEMUXER_mpegts
++
++config FFMPEG_CUSTOM_DEMUXER_rtp
++ bool "RTP"
++
++config FFMPEG_CUSTOM_DEMUXER_wav
++ bool "WAV"
++
++config FFMPEG_CUSTOM_DEMUXER_wv
++ bool "WV"
++
++comment "Parsers ---"
++
++config FFMPEG_CUSTOM_PARSER_aac
++ bool "AAC (Advanced Audio Coding)"
++ depends on FFMPEG_CUSTOM_PATENTED
++
++config FFMPEG_CUSTOM_PARSER_ac3
++ bool "AC3"
++
++config FFMPEG_CUSTOM_PARSER_flac
++ bool "FLAC"
++
++config FFMPEG_CUSTOM_PARSER_h264
++ bool "H.264"
++ depends on FFMPEG_CUSTOM_PATENTED
++ select FFMPEG_CUSTOM_DECODER_h264
++
++config FFMPEG_CUSTOM_PARSER_mpegaudio
++ bool "MPEG Audio"
++
++config FFMPEG_CUSTOM_PARSER_mpegvideo
++ bool "MPEG Video"
++
++config FFMPEG_CUSTOM_PARSER_mpeg4video
++ bool "MPEG-4 Video"
++
++config FFMPEG_CUSTOM_PARSER_opus
++ bool "Opus"
++
++comment "Protocols ---"
++
++config FFMPEG_CUSTOM_PROTOCOL_file
++ bool "file:"
++
++config FFMPEG_CUSTOM_PROTOCOL_http
++ bool "http:"
++
++config FFMPEG_CUSTOM_PROTOCOL_icecast
++ bool "icecast:"
++ select FFMPEG_CUSTOM_PROTOCOL_http
++
++config FFMPEG_CUSTOM_PROTOCOL_pipe
++ bool "pipe:"
++
++config FFMPEG_CUSTOM_PROTOCOL_rtp
++ bool "rtp:"
++ select FFMPEG_CUSTOM_PROTOCOL_udp
++
++config FFMPEG_CUSTOM_PROTOCOL_tcp
++ bool "tcp:"
++
++config FFMPEG_CUSTOM_PROTOCOL_udp
++ bool "udp:"
++
++endmenu
++
+diff --git a/feeds/packages/multimedia/ffmpeg/Makefile b/feeds/packages/multimedia/ffmpeg/Makefile
+new file mode 100644
+index 0000000..ed677cf
+--- /dev/null
++++ b/feeds/packages/multimedia/ffmpeg/Makefile
+@@ -0,0 +1,599 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ffmpeg
++PKG_VERSION:=2.7.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://ffmpeg.org/releases/
++PKG_MD5SUM:=7eb2140bab9f0a8669b65b50c8e4cfb5
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=LGPL-2.1+ GPL-2+ LGPL-3
++PKG_LICENSE_FILES:=COPYING.GPLv2 COPYING.GPLv3 COPYING.LGPLv2.1 COPYING.LGPLv3
++
++FFMPEG_CUSTOM_ENCODERS:= \
++ ac3 \
++ jpegls \
++ mpeg1video \
++ mpeg2video \
++ mpeg4 \
++ pcm_s16be \
++ pcm_s16le \
++ png \
++ vorbis \
++ zlib \
++
++FFMPEG_CUSTOM_DECODERS:= \
++ aac \
++ ac3 \
++ alac \
++ amrnb \
++ amrwb \
++ ape \
++ atrac3 \
++ flac \
++ gif \
++ h264 \
++ jpegls \
++ mp2 \
++ mp3 \
++ mpeg1video \
++ mpeg2video \
++ mpeg4 \
++ mpegvideo \
++ mpc7 \
++ mpc8 \
++ pcm_s16be \
++ pcm_s16le \
++ png \
++ vorbis \
++ wavpack \
++ wmav1 \
++ wmav2 \
++ zlib \
++
++FFMPEG_CUSTOM_MUXERS:= \
++ ac3 \
++ ffm \
++ h264 \
++ mp3 \
++ mp4 \
++ mpeg1video \
++ mpeg2video \
++ mpegts \
++ ogg \
++ rtp \
++
++FFMPEG_CUSTOM_DEMUXERS:= \
++ aac \
++ ac3 \
++ amr \
++ ape \
++ avi \
++ flac \
++ ffm \
++ h264 \
++ matroska \
++ mov \
++ mp3 \
++ mpegps \
++ mpegts \
++ mpegvideo \
++ mpc \
++ mpc8 \
++ ogg \
++ rm \
++ rtsp \
++ rtp \
++ sdp \
++ v4l2 \
++ wav \
++ wv \
++
++FFMPEG_CUSTOM_PARSERS:= \
++ aac \
++ flac \
++ ac3 \
++ h264 \
++ mpegaudio \
++ mpeg4video \
++ mpegvideo \
++
++FFMPEG_CUSTOM_PROTOCOLS:= \
++ file http icecast pipe rtp tcp udp
++
++FFMPEG_MINI_DECODERS:= \
++ aac \
++ ac3 \
++ flac \
++ h264 \
++ jpegls \
++ mp3 \
++ mpeg1video \
++ mpeg2video \
++ mpeg4 \
++ mpegvideo \
++ png \
++ wmav1 \
++ wmav2 \
++
++FFMPEG_MINI_DEMUXERS:= \
++ aac \
++ ac3 \
++ avi \
++ flac \
++ h264 \
++ matroska \
++ mov \
++ mp3 \
++ mpegts \
++ mpegvideo \
++
++FFMPEG_MINI_PARSERS:= \
++ ac3 \
++ flac \
++ h264 \
++ mpeg4video \
++ mpegaudio \
++
++FFMPEG_MINI_PROTOCOLS:= \
++ file \
++
++FFMPEG_AUDIO_DECODERS:= \
++ aac \
++ aac_latm \
++ ac3 \
++ adpcm_* \
++ alac \
++ amrnb \
++ amrwb \
++ ape \
++ atrac3 \
++ flac \
++ mp2 \
++ mp3* \
++ mpc7 \
++ mpc8 \
++ opus \
++ pcm_* \
++ vorbis \
++ wavpack \
++ wmav1 \
++ wmav2 \
++ wmalossless \
++ wmapro \
++ zlib \
++
++FFMPEG_AUDIO_DEMUXERS:= \
++ aac \
++ ac3 \
++ aiff \
++ amr \
++ ape \
++ avi \
++ flac \
++ ffm \
++ matroska \
++ mp3 \
++ mov \
++ mpc \
++ mpc8 \
++ mpegts \
++ ogg \
++ rm \
++ rtsp \
++ rtp \
++ sdp \
++ wav \
++ wv \
++
++FFMPEG_AUDIO_PARSERS:= \
++ aac \
++ aac_latm \
++ ac3 \
++ flac \
++ mpegaudio \
++ opus \
++
++FFMPEG_AUDIO_PROTOCOLS:= \
++ file http icecast rtp tcp udp
++
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_CONFIG_DEPENDS:= \
++ $(patsubst %,CONFIG_FFMPEG_CUSTOM_ENCODER_%,$(FFMPEG_CUSTOM_ENCODERS)) \
++ $(patsubst %,CONFIG_FFMPEG_CUSTOM_DECODER_%,$(FFMPEG_CUSTOM_DECODERS)) \
++ $(patsubst %,CONFIG_FFMPEG_CUSTOM_MUXER_%,$(FFMPEG_CUSTOM_DEMUXERS)) \
++ $(patsubst %,CONFIG_FFMPEG_CUSTOM_DEMUXER_%,$(FFMPEG_CUSTOM_DEMUXERS)) \
++ $(patsubst %,CONFIG_FFMPEG_CUSTOM_PARSER_%,$(FFMPEG_CUSTOM_PARSERS)) \
++ $(patsubst %,CONFIG_FFMPEG_CUSTOM_PROTOCOL_%,$(FFMPEG_CUSTOM_PROTOCOLS))
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ffmpeg/Default
++ TITLE:=FFmpeg
++ URL:=http://ffmpeg.mplayerhq.hu/
++endef
++
++define Package/ffmpeg/Default/description
++ FFmpeg is a a software package that can record, convert and stream digital
++ audio and video in numerous formats.
++endef
++
++
++define Package/ffmpeg
++$(call Package/ffmpeg/Default)
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ TITLE+= program
++ DEPENDS+= +libpthread +libffmpeg-full
++ VARIANT:=full
++endef
++
++define Package/ffmpeg/description
++$(call Package/ffmpeg/Default/description)
++ .
++ This package contains the FFmpeg command line tool.
++endef
++
++
++define Package/ffprobe
++$(call Package/ffmpeg/Default)
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ TITLE+= CLI media identifier
++ DEPENDS+= +libffmpeg-full
++ VARIANT:=full
++endef
++
++define Package/ffprobe/description
++$(call Package/ffmpeg/Default/description)
++ .
++ This package contains the FFprobe command line tool.
++endef
++
++
++define Package/ffserver
++$(call Package/ffserver/Default)
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ TITLE+= streaming server
++ DEPENDS+= +libpthread +libffmpeg-full
++ VARIANT:=full
++endef
++
++define Package/ffserver/description
++$(call Package/ffmpeg/Default/description)
++ .
++ This package contains the FFmpeg streaming server.
++endef
++
++
++define Package/libffmpeg/Default
++$(call Package/ffmpeg/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= libraries
++ DEPENDS+= +libpthread +zlib +libbz2
++ PROVIDES:= libffmpeg
++endef
++
++
++define Package/libffmpeg-custom
++$(call Package/libffmpeg/Default)
++ TITLE+= (custom)
++ DEPENDS+= @DEVEL @!ALL +libopus +libspeex
++ VARIANT:=custom
++ MENU:=1
++endef
++
++define Package/libffmpeg-custom/config
++source "$(SOURCE)/Config.in"
++endef
++
++define Package/libffmpeg-custom/description
++$(call Package/ffmpeg/Default/description)
++ .
++ This package contains customized FFmpeg shared libraries.
++endef
++
++
++define Package/libffmpeg-audio-dec
++$(call Package/libffmpeg/Default)
++ TITLE+= (audio)
++ DEPENDS+= @BUILD_PATENTED +libspeex
++ VARIANT:=audio-dec
++endef
++
++define Package/libffmpeg-audio-dec/description
++$(call Package/ffmpeg/Default/description)
++ .
++ This package contains FFmpeg shared libraries for audio decoding
++endef
++
++
++define Package/libffmpeg-full
++$(call Package/libffmpeg/Default)
++ TITLE+= (full)
++ DEPENDS+= @BUILD_PATENTED +alsa-lib
++ VARIANT:=full
++endef
++
++define Package/libffmpeg-full/description
++$(call Package/ffmpeg/Default/description)
++ .
++ This package contains full-featured FFmpeg shared libraries.
++endef
++
++
++define Package/libffmpeg-mini
++$(call Package/libffmpeg/Default)
++ TITLE+= (mini)
++ DEPENDS+= @BUILD_PATENTED
++ VARIANT:=mini
++endef
++
++define Package/libffmpeg-mini/description
++$(call Package/ffmpeg/Default/description)
++ .
++ This package contains minimal-featured FFmpeg shared libraries.
++endef
++
++
++FFMPEG_CONFIGURE:= \
++ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS) $(FPIC)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ ./configure \
++ --enable-cross-compile \
++ --cross-prefix="$(TARGET_CROSS)" \
++ --arch="$(ARCH)" \
++ --target-os=linux \
++ --prefix="/usr" \
++ --pkg-config="pkg-config" \
++ --enable-shared \
++ --enable-static \
++ --enable-small \
++ --enable-pthreads \
++ --enable-zlib \
++ --disable-runtime-cpudetect \
++ --disable-doc \
++ --disable-debug \
++ \
++ --enable-gpl \
++ --enable-version3 \
++ \
++ --disable-altivec \
++ --disable-amd3dnow \
++ --disable-amd3dnowext \
++ --disable-mmx \
++ --disable-mmxext \
++ --disable-sse \
++ --disable-sse2 \
++ --disable-sse3 \
++ --disable-ssse3 \
++ --disable-sse4 \
++ --disable-sse42 \
++ --disable-avx \
++ --disable-xop \
++ --disable-fma3 \
++ --disable-fma4 \
++ --disable-avx2 \
++ --disable-vfp \
++ --disable-neon \
++ --disable-inline-asm \
++ --disable-yasm \
++ --disable-mips32r2 \
++ --disable-mipsdspr1 \
++ --disable-mipsdspr2 \
++ --disable-mipsfpu \
++ \
++ --disable-dxva2 \
++ --disable-lzma \
++ --disable-vaapi \
++ --disable-vda \
++ --disable-vdpau \
++ --disable-outdevs
++
++ifeq ($(BUILD_VARIANT),custom)
++
++ FFMPEG_ENABLE= \
++ $(foreach c, $(2), \
++ $(if $($(3)_$(c)),--enable-$(1)="$(c)") \
++ )
++
++ FFMPEG_CONFIGURE+= \
++ --disable-programs \
++ --disable-avfilter \
++ --disable-postproc \
++ --disable-swresample \
++ --disable-swscale \
++ --disable-everything \
++ $(call FFMPEG_ENABLE,encoder,$(FFMPEG_CUSTOM_ENCODERS),CONFIG_FFMPEG_CUSTOM_ENCODER) \
++ $(call FFMPEG_ENABLE,decoder,$(FFMPEG_CUSTOM_DECODERS),CONFIG_FFMPEG_CUSTOM_DECODER) \
++ $(call FFMPEG_ENABLE,muxer,$(FFMPEG_CUSTOM_MUXERS),CONFIG_FFMPEG_CUSTOM_MUXER) \
++ $(call FFMPEG_ENABLE,demuxer,$(FFMPEG_CUSTOM_DEMUXERS),CONFIG_FFMPEG_CUSTOM_DEMUXER) \
++ $(call FFMPEG_ENABLE,parser,$(FFMPEG_CUSTOM_PARSERS),CONFIG_FFMPEG_CUSTOM_PARSER) \
++ $(call FFMPEG_ENABLE,protocol,$(FFMPEG_CUSTOM_PROTOCOLS),CONFIG_FFMPEG_CUSTOM_PROTOCOL) \
++
++ifeq ($(CONFIG_FFMPEG_CUSTOM_SELECT_adpcm),y)
++ FFMPEG_CONFIGURE+= \
++ --enable-decoder=adpcm_ima_wav \
++ --enable-decoder=adpcm_ima_qt \
++ --enable-decoder=adpcm_ms \
++
++endif
++
++ifeq ($(CONFIG_FFMPEG_CUSTOM_SELECT_libopus),y)
++ FFMPEG_CONFIGURE+= \
++ --enable-libopus --enable-decoder=libopus \
++
++endif
++
++ifeq ($(CONFIG_FFMPEG_CUSTOM_SELECT_speex),y)
++ FFMPEG_CONFIGURE+= \
++ --enable-libspeex --enable-decoder=libspeex \
++
++endif
++
++endif
++
++ifeq ($(BUILD_VARIANT),audio-dec)
++
++ FFMPEG_ENABLE= \
++ $(foreach c, $(2), \
++ --enable-$(1)="$(c)" \
++ )
++
++ FFMPEG_CONFIGURE+= \
++ --disable-programs \
++ --disable-avfilter \
++ --disable-postproc \
++ --disable-swresample \
++ --disable-swscale \
++ --disable-everything \
++ $(call FFMPEG_ENABLE,decoder,$(FFMPEG_AUDIO_DECODERS)) \
++ $(call FFMPEG_ENABLE,demuxer,$(FFMPEG_AUDIO_DEMUXERS)) \
++ $(call FFMPEG_ENABLE,parser,$(FFMPEG_AUDIO_PARSERS)) \
++ $(call FFMPEG_ENABLE,protocol,$(FFMPEG_AUDIO_PROTOCOLS)) \
++ --enable-libspeex --enable-decoder=libspeex \
++ --disable-decoder=pcm_bluray,pcm_dvd \
++
++endif
++
++ifeq ($(BUILD_VARIANT),mini)
++
++ FFMPEG_ENABLE= \
++ $(foreach c, $(2), \
++ --enable-$(1)="$(c)" \
++ )
++
++ FFMPEG_CONFIGURE+= \
++ --disable-programs \
++ --disable-avdevice \
++ --disable-avfilter \
++ --disable-postproc \
++ --disable-swresample \
++ --disable-swscale \
++ --disable-everything \
++ $(call FFMPEG_ENABLE,decoder,$(FFMPEG_MINI_DECODERS)) \
++ $(call FFMPEG_ENABLE,demuxer,$(FFMPEG_MINI_DEMUXERS)) \
++ $(call FFMPEG_ENABLE,parser,$(FFMPEG_MINI_PARSERS)) \
++ $(call FFMPEG_ENABLE,protocol,$(FFMPEG_MINI_PROTOCOLS)) \
++
++endif
++
++ifneq ($(CONFIG_TARGET_x86),)
++ TARGET_CFLAGS += -fomit-frame-pointer
++endif
++
++define Build/Configure
++ ( cd $(PKG_BUILD_DIR); $(FFMPEG_CONFIGURE) )
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install
++endef
++
++define Build/InstallDev/custom
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/lib{avcodec,avdevice,avformat,avutil} $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib{avcodec,avdevice,avformat,avutil}.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/lib{avcodec,avdevice,avformat,avutil}.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Build/InstallDev/full
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/lib{avcodec,avdevice,avfilter,avformat,avutil,postproc,swresample,swscale} $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib{avcodec,avdevice,avfilter,avformat,avutil,postproc,swresample,swscale}.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/lib{avcodec,avdevice,avfilter,avformat,avutil,postproc,swresample,swscale}.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Build/InstallDev/mini
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/lib{avcodec,avformat,avutil} $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib{avcodec,avformat,avutil}.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/lib{avcodec,avformat,avutil}.pc $(1)/usr/lib/pkgconfig/
++endef
++
++Build/InstallDev/audio-dec = $(Build/InstallDev/custom)
++
++# XXX: attempt at installing "best" dev files available
++ifeq ($(BUILD_VARIANT),custom)
++ # XXX: only install "custom" dev files if -full & -mini are not selected
++ ifeq ($(CONFIG_PACKAGE_libffmpeg-full)$(CONFIG_PACKAGE_libffmpeg-mini),)
++ Build/InstallDev = $(Build/InstallDev/custom)
++ endif
++endif
++ifeq ($(BUILD_VARIANT),audio-dec)
++ # XXX: only install "audio-dec" dev files if -full & -mini are not selected
++ ifeq ($(CONFIG_PACKAGE_libffmpeg-full)$(CONFIG_PACKAGE_libffmpeg-mini),)
++ Build/InstallDev = $(Build/InstallDev/audio-dec)
++ endif
++endif
++ifeq ($(BUILD_VARIANT),full)
++ # XXX: always install "full" dev files if -full is selected
++ Build/InstallDev = $(Build/InstallDev/full)
++endif
++ifeq ($(BUILD_VARIANT),mini)
++ # XXX: only install "mini" dev files if -full is not selected
++ ifeq ($(CONFIG_PACKAGE_libffmpeg-full),)
++ Build/InstallDev = $(Build/InstallDev/mini)
++ endif
++endif
++
++define Package/ffmpeg/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/ffmpeg $(1)/usr/bin/
++endef
++
++define Package/ffprobe/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/ffprobe $(1)/usr/bin/
++endef
++
++define Package/ffserver/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/ffserver $(1)/usr/bin/
++endef
++
++define Package/libffmpeg-custom/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib{avcodec,avdevice,avformat,avutil}.so.* $(1)/usr/lib/
++endef
++
++define Package/libffmpeg-full/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib{avcodec,avdevice,avfilter,avformat,avutil,postproc,swresample,swscale}.so.* $(1)/usr/lib/
++endef
++
++define Package/libffmpeg-mini/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib{avcodec,avformat,avutil}.so.* $(1)/usr/lib/
++endef
++
++Package/libffmpeg-audio-dec/install = $(Package/libffmpeg-custom/install)
++
++$(eval $(call BuildPackage,ffmpeg))
++$(eval $(call BuildPackage,ffprobe))
++$(eval $(call BuildPackage,ffserver))
++$(eval $(call BuildPackage,libffmpeg-custom))
++$(eval $(call BuildPackage,libffmpeg-full))
++$(eval $(call BuildPackage,libffmpeg-mini))
++$(eval $(call BuildPackage,libffmpeg-audio-dec))
+diff --git a/feeds/packages/multimedia/fswebcam/Makefile b/feeds/packages/multimedia/fswebcam/Makefile
+new file mode 100644
+index 0000000..5a5f3b5
+--- /dev/null
++++ b/feeds/packages/multimedia/fswebcam/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=fswebcam
++PKG_VERSION:=20140113
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.firestorm.cx/fswebcam/files \
++ http://www.sanslogic.co.uk/fswebcam/files
++PKG_MD5SUM:=1bfdb21904e816f100370ec8f4df986b
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENCE
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/fswebcam
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ TITLE:=fswebcam
++ URL:=http://www.sanslogic.co.uk/fswebcam/
++ DEPENDS:=+libgd
++endef
++
++define Package/fswebcam/description
++ fswebcam is a neat and simple webcam app. It captures images from a V4L1/V4L2 compatible
++ device or file, averages them to reduce noise and draws a caption using the GD Graphics
++ Library which also handles compressing the image to PNG or JPEG. The resulting image
++ is saved to a file or sent to stdio where it can be piped to something like ncftpput or scp.
++endef
++
++EXTRA_CFLAGS+= $(TARGET_CPPFLAGS)
++EXTRA_LDFLAGS+= $(TARGET_LDFLAGS) -Wl,-rpath-link,$(STAGING_DIR)/usr/lib
++
++define Package/fswebcam/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/fswebcam $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,fswebcam))
+diff --git a/feeds/packages/multimedia/grilo-plugins/Makefile b/feeds/packages/multimedia/grilo-plugins/Makefile
+new file mode 100644
+index 0000000..59800e1
+--- /dev/null
++++ b/feeds/packages/multimedia/grilo-plugins/Makefile
+@@ -0,0 +1,92 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=grilo-plugins
++PKG_VERSION:=0.2.16
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=LGPLv2.1
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=https://download.gnome.org/sources/grilo-plugins/0.2/
++PKG_MD5SUM:=62ecaad877b485a950259eef1ef38c18
++
++PKG_BUILD_DEPENDS:=glib2 grilo
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/grilo-plugins/Default
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ TITLE:=grilo-plugins
++ URL:=https://wiki.gnome.org/Projects/Grilo
++endef
++
++define Package/grilo-plugins
++ $(call Package/grilo-plugins/Default)
++ MENU:=1
++ DEPENDS:=+grilo $(ICONV_DEPENDS) $(INTL_DEPENDS)
++ TITLE:=Plugins for the Grilo framework
++endef
++
++define Package/grilo/decription
++ Grilo is a framework that provides access to different sources of
++ multimedia content, using a pluggable system. This package contains
++ plugins to get information from a number of sources.
++endef
++
++CONFIGURE_ARGS += \
++ --enable-static \
++ --without-libiconv-prefix \
++ --without-libintl-prefix \
++ --without-x \
++
++define Package/grilo-plugins/install
++ $(INSTALL_DIR) $(1)/usr/lib/grilo-0.2
++endef
++
++define BuildPlugin
++ define Package/grilo-plugins-$(1)
++ $(call Package/grilo-plugins/Default)
++ DEPENDS:=grilo-plugins
++ ifneq ($(4),)
++ DEPENDS+= $(4)
++ endif
++ TITLE:=$(2) plugin
++ endef
++
++ define Package/grilo-plugins-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/grilo-0.2
++ for p in $(3); do \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/grilo-0.2/libgrl$$$$$$$${p}.so $$(1)/usr/lib/grilo-0.2; \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/grilo-0.2/grl-$$$$$$$${p}.xml $$(1)/usr/lib/grilo-0.2; \
++ done
++ endef
++
++ $$(eval $$(call BuildPackage,grilo-plugins-$(1)))
++endef
++
++$(eval $(call BuildPackage,grilo-plugins))
++
++$(eval $(call BuildPlugin,dleyna,DLNA sharing,dleyna,,30))
++$(eval $(call BuildPlugin,dmap,DAAP and DPAP sharing,daap dpap,libdmapsharing,30))
++$(eval $(call BuildPlugin,gravatar,Gravatar provider,gravatar,,30))
++$(eval $(call BuildPlugin,jamendo,Jamendo sharing,jamendo,,30))
++$(eval $(call BuildPlugin,lastfm-albumart,Last.FM album art provider,lastfm-albumart,,30))
++$(eval $(call BuildPlugin,magnatune,Magnatune sharing,magnatune,,30))
++$(eval $(call BuildPlugin,metadata-store,Extra metadata store,metadata-store,,30))
++$(eval $(call BuildPlugin,opensubtitles,Openi subtitles provider,opensubtitles,,30))
++$(eval $(call BuildPlugin,raitv,Rai.tv sharing,raitv,,30))
++$(eval $(call BuildPlugin,shoutcast,SHOUTcast sharing,shoutcast,,30))
+diff --git a/feeds/packages/multimedia/grilo/Makefile b/feeds/packages/multimedia/grilo/Makefile
+new file mode 100644
+index 0000000..473344a
+--- /dev/null
++++ b/feeds/packages/multimedia/grilo/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=grilo
++PKG_VERSION:=0.2.14
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=LGPLv2.1
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=https://download.gnome.org/sources/grilo/0.2/
++PKG_MD5SUM:=7eba405ada20fefcb877d534d9d4f
++
++PKG_BUILD_DEPENDS:=glib2 libsoup libxml2
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++TARGET_LDFLAGS+= \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib
++
++define Package/grilo
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ TITLE:=grilo
++ URL:=https://wiki.gnome.org/Projects/Grilo
++ DEPENDS:=+glib2 +libsoup +libxml2
++endef
++
++define Package/grilo/decription
++ Grilo is a framework that provides access to different sources of
++ multimedia content, using a pluggable system.
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/grilo-0.2/ \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.so* \
++ $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig/
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/*.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/grilo/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.so* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,grilo))
+diff --git a/feeds/packages/multimedia/gst1-libav/Config.in b/feeds/packages/multimedia/gst1-libav/Config.in
+new file mode 100644
+index 0000000..b394d7d
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-libav/Config.in
+@@ -0,0 +1,279 @@
++menu "Select GStreamer libav configuration options"
++ depends on PACKAGE_gst1-libav
++
++config GST1_LIBAV_IPV6
++ bool "Enable IPv6"
++ default IPV6
++
++config GST1_LIBAV_PATENTED
++ bool "Include patented codecs and technologies"
++ default BUILD_PATENTED
++
++config GET_LIBAV_COMMON_AV_SUPPORT
++ bool "Include support for common audio/video decoders"
++ default y
++ select GST1_LIBAV_DECODER_aac if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DECODER_ac3 if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DECODER_h264 if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DECODER_atrac3 if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DECODER_jpegls
++ select GST1_LIBAV_DECODER_mp3 if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DECODER_mpeg1video
++ select GST1_LIBAV_DECODER_mpeg2video if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DECODER_mpeg4 if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DECODER_mpeg4aac if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DECODER_mpegvideo
++ select GST1_LIBAV_DECODER_pcm_s16be
++ select GST1_LIBAV_DECODER_pcm_s16le
++ select GST1_LIBAV_DECODER_vorbis
++ select GST1_LIBAV_DECODER_wmav1 if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DECODER_wmav2 if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DECODER_png
++ select GST1_LIBAV_PARSER_aac if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_PARSER_h264 if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_PARSER_mpegaudio
++ select GST1_LIBAV_PARSER_mpegvideo
++ select GST1_LIBAV_PARSER_mpeg4video
++ select GST1_LIBAV_DEMUXER_ac3
++ select GST1_LIBAV_DEMUXER_h264 if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DEMUXER_mp3 if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DEMUXER_mpegvideo if GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DEMUXER_ogg
++
++comment "Encoders ---"
++
++config GST1_LIBAV_ENCODER_ac3
++ bool "AC3"
++ depends on GST1_LIBAV_PATENTED
++ select GST1_LIBAV_PARSER_ac3
++
++config GST1_LIBAV_ENCODER_jpegls
++ bool "JPEG-LS"
++
++config GST1_LIBAV_ENCODER_mpeg1video
++ bool "MPEG-1 Video"
++
++config GST1_LIBAV_ENCODER_mpeg2video
++ bool "MPEG-2 Video"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_ENCODER_mpeg4
++ bool "MPEG-4"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_ENCODER_pcm_s16be
++ bool "PCM signed 16-bit big-endian"
++
++config GST1_LIBAV_ENCODER_pcm_s16le
++ bool "PCM signed 16-bit little-endian"
++
++config GST1_LIBAV_ENCODER_png
++ bool "PNG"
++ select GST1_LIBAV_ENCODER_zlib
++
++config GST1_LIBAV_ENCODER_vorbis
++ bool "Vorbis"
++
++config GST1_LIBAV_ENCODER_zlib
++ bool "Zlib"
++
++comment "Decoders ---"
++
++config GST1_LIBAV_DECODER_aac
++ bool "AAC (Advanced Audio Coding)"
++ depends on GST1_LIBAV_PATENTED
++ select GST1_LIBAV_PARSER_aac
++
++config GST1_LIBAV_DECODER_ac3
++ bool "AC3"
++ depends on GST1_LIBAV_PATENTED
++ select GST1_LIBAV_PARSER_ac3
++
++config GST1_LIBAV_DECODER_atrac3
++ bool "ATRAC3"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_DECODER_gif
++ bool "GIF"
++
++config GST1_LIBAV_DECODER_h264
++ bool "H.264"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_DECODER_jpegls
++ bool "JPEG-LS"
++
++config GST1_LIBAV_DECODER_mp2
++ bool "MP2 (MPEG Audio Layer 2)"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_DECODER_mp3
++ bool "MP3 (MPEG Audio Layer 2)"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_DECODER_mpegvideo
++ bool "MPEG Video"
++
++config GST1_LIBAV_DECODER_mpeg1video
++ bool "MPEG-1 Video"
++
++config GST1_LIBAV_DECODER_mpeg2video
++ bool "MPEG-2 Video"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_DECODER_mpeg4
++ bool "MPEG-4"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_DECODER_mpeg4aac
++ bool "MPEG-4 (AAC)"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_DECODER_pcm_s16be
++ bool "PCM signed 16-bit big-endian"
++
++config GST1_LIBAV_DECODER_pcm_s16le
++ bool "PCM signed 16-bit little-endian"
++
++config GST1_LIBAV_DECODER_png
++ bool "PNG"
++ select GST1_LIBAV_DECODER_zlib
++
++config GST1_LIBAV_DECODER_vorbis
++ bool "Vorbis"
++
++config GST1_LIBAV_DECODER_wmav1
++ bool "WMAv1"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_DECODER_wmav2
++ bool "WMAv2"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_DECODER_zlib
++ bool "Zlib"
++
++comment "Muxers ---"
++
++config GST1_LIBAV_MUXER_ac3
++ bool "AC3"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_MUXER_ffm
++ bool "FFM (ffserver live feed)"
++
++config GST1_LIBAV_MUXER_h264
++ bool "H.264"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_MUXER_mp3
++ bool "MP3 (MPEG Audio Layer 3)"
++
++config GST1_LIBAV_MUXER_mp4
++ bool "MP4"
++
++config GST1_LIBAV_MUXER_mpeg1video
++ bool "MPEG-1 Video"
++
++config GST1_LIBAV_MUXER_mpeg2video
++ bool "MPEG-2 Video"
++
++config GST1_LIBAV_MUXER_mpegts
++ bool "MPEG-2 (TS)"
++
++config GST1_LIBAV_MUXER_ogg
++ bool "Ogg"
++
++config GST1_LIBAV_MUXER_oss
++ bool "OSS (Open Sound System playback)"
++
++config GST1_LIBAV_MUXER_rtp
++ bool "RTP"
++
++comment "Demuxers ---"
++
++config GST1_LIBAV_DEMUXER_ac3
++ bool "AC3"
++
++config GST1_LIBAV_DEMUXER_ffm
++ bool "FFM (ffserver live feed)"
++
++config GST1_LIBAV_DEMUXER_h264
++ bool "H.264"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_DEMUXER_mp3
++ bool "MP3 (MPEG Audio Layer 3)"
++
++config GST1_LIBAV_DEMUXER_mpegvideo
++ bool "MPEG Video"
++
++config GST1_LIBAV_DEMUXER_mpegps
++ bool "MPEG-2 (PS)"
++
++config GST1_LIBAV_DEMUXER_mpegts
++ bool "MPEG-2 (TS)"
++
++config GST1_LIBAV_DEMUXER_ogg
++ bool "Ogg"
++
++config GST1_LIBAV_DEMUXER_rm
++ bool "RM"
++ help
++ RealMedia format demuxer
++
++config GST1_LIBAV_DEMUXER_rtsp
++ bool "RTSP"
++ select GST1_LIBAV_DEMUXER_rm
++ select GST1_LIBAV_DEMUXER_sdp
++
++config GST1_LIBAV_DEMUXER_sdp
++ bool "SDP"
++ select GST1_LIBAV_DEMUXER_mpegts
++
++comment "Parsers ---"
++
++config GST1_LIBAV_PARSER_aac
++ bool "AAC (Advanced Audio Coding)"
++ depends on GST1_LIBAV_PATENTED
++
++config GST1_LIBAV_PARSER_ac3
++ bool "AC3"
++
++config GST1_LIBAV_PARSER_h264
++ bool "H.264"
++ depends on GST1_LIBAV_PATENTED
++ select GST1_LIBAV_DECODER_h264
++
++config GST1_LIBAV_PARSER_mpegaudio
++ bool "MPEG Audio"
++
++config GST1_LIBAV_PARSER_mpegvideo
++ bool "MPEG Video"
++
++config GST1_LIBAV_PARSER_mpeg4video
++ bool "MPEG-4 Video"
++
++comment "Protocols ---"
++
++config GST1_LIBAV_PROTOCOL_file
++ bool "file:"
++
++config GST1_LIBAV_PROTOCOL_http
++ bool "http:"
++
++config GST1_LIBAV_PROTOCOL_pipe
++ bool "pipe:"
++
++config GST1_LIBAV_PROTOCOL_rtp
++ bool "rtp:"
++ select GST1_LIBAV_PROTOCOL_udp
++
++config GST1_LIBAV_PROTOCOL_tcp
++ bool "tcp:"
++
++config GST1_LIBAV_PROTOCOL_udp
++ bool "udp:"
++
++endmenu
++
+diff --git a/feeds/packages/multimedia/gst1-libav/Makefile b/feeds/packages/multimedia/gst1-libav/Makefile
+new file mode 100644
+index 0000000..36a2529
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-libav/Makefile
+@@ -0,0 +1,205 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gst1-libav
++PKG_VERSION:=1.4.5
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_SOURCE:=gst-libav-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://gstreamer.freedesktop.org/src/gst-libav
++PKG_MD5SUM:=f4922a46adbcbe7bd01331ff5dc7979d
++
++PKG_LICENSE:=GPL-2.0 LGPL-2.0
++PKG_LICENSE_FILES:=COPYING COPYING.LIB
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/gst-libav-$(PKG_VERSION)
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_USE_MIPS16:=0
++
++GST_VERSION:=1.0
++
++LIBAV_ENCODERS:= \
++ ac3 \
++ jpegls \
++ mpeg1video \
++ mpeg2video \
++ mpeg4 \
++ pcm_s16be \
++ pcm_s16le \
++ png \
++ vorbis \
++ zlib \
++
++LIBAV_DECODERS:= \
++ aac \
++ ac3 \
++ atrac3 \
++ gif \
++ h264 \
++ jpegls \
++ mp2 \
++ mp3 \
++ mpeg1video \
++ mpeg2video \
++ mpeg4 \
++ mpeg4aac \
++ mpegvideo \
++ pcm_s16be \
++ pcm_s16le \
++ png \
++ vorbis \
++ wmav1 \
++ wmav2 \
++ zlib \
++
++LIBAV_MUXERS:= \
++ ac3 \
++ ffm \
++ h264 \
++ mp3 \
++ mp4 \
++ mpeg1video \
++ mpeg2video \
++ mpegts \
++ ogg \
++ oss \
++ rtp \
++
++LIBAV_DEMUXERS:= \
++ ac3 \
++ ffm \
++ h264 \
++ mp3 \
++ mpegps \
++ mpegts \
++ mpegvideo \
++ ogg \
++ rm \
++ rtsp \
++ sdp \
++ v4l2 \
++
++LIBAV_PARSERS:= \
++ aac \
++ ac3 \
++ h264 \
++ mpegaudio \
++ mpegvideo \
++ mpeg4video \
++
++LIBAV_PROTOCOLS:= \
++ file http pipe rtp tcp udp
++
++PKG_CONFIG_DEPENDS:= \
++ $(patsubst %,CONFIG_GST1_LIBAV_ENCODER_%,$(LIBAV_ENCODERS)) \
++ $(patsubst %,CONFIG_GST1_LIBAV_DECODER_%,$(LIBAV_DECODERS)) \
++ $(patsubst %,CONFIG_GST1_LIBAV_MUXER_%,$(LIBAV_DEMUXERS)) \
++ $(patsubst %,CONFIG_GST1_LIBAV_DEMUXER_%,$(LIBAV_DEMUXERS)) \
++ $(patsubst %,CONFIG_GST1_LIBAV_PARSER_%,$(LIBAV_PARSERS)) \
++ $(patsubst %,CONFIG_GST1_LIBAV_PROTOCOL_%,$(LIBAV_PROTOCOLS))
++
++PKG_BUILD_DEPENDS:= libgstreamer1 gstreamer1-plugins-base
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/gst1-libav
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ TITLE:=GStreamer Libav plugin
++ URL:=http://www.gstreamer.net/modules/gst-libav.html
++ DEPENDS:= +libgstreamer1 +gstreamer1-plugins-base \
++ +gst1-mod-alsa +libgst1audio +libgst1pbutils +libgst1video \
++ +libbz2
++endef
++
++define Package/gst1-libav/description
++ GStreamer with libav bindings using internal Libav
++endef
++
++define Package/gst1-libav/config
++ source "$(SOURCE)/Config.in"
++endef
++
++FILTER_CONFIG= \
++ $(foreach c, $(3), \
++ $(if $(CONFIG_GST1_LIBAV_$(1)_$(c)),--enable-$(2)='$(c)') \
++ )
++
++LIBAV_CONFIGURE_ENCODERS:=$(call FILTER_CONFIG,ENCODER,encoder,$(LIBAV_ENCODERS))
++LIBAV_CONFIGURE_DECODERS:=$(call FILTER_CONFIG,DECODER,decoder,$(LIBAV_DECODERS))
++LIBAV_CONFIGURE_MUXERS:=$(call FILTER_CONFIG,MUXER,muxer,$(LIBAV_MUXERS))
++LIBAV_CONFIGURE_DEMUXERS:=$(call FILTER_CONFIG,DEMUXER,demuxer,$(LIBAV_DEMUXERS))
++LIBAV_CONFIGURE_PARSERS:=$(call FILTER_CONFIG,PARSER,parser,$(LIBAV_PARSERS))
++LIBAV_CONFIGURE_PROTOCOLS:=$(call FILTER_CONFIG,PROTOCOL,protocol,$(LIBAV_PROTOCOLS))
++
++CONFIGURE_ARGS += \
++ --without-system-libav \
++ --with-libav-extra-configure="--target-os=linux \
++ --disable-bsfs \
++ --disable-programs \
++ --disable-devices \
++ --disable-encoders \
++ $(LIBAV_CONFIGURE_ENCODERS) \
++ --disable-decoders \
++ $(LIBAV_CONFIGURE_DECODERS) \
++ --disable-muxers \
++ $(LIBAV_CONFIGURE_MUXERS) \
++ --disable-demuxers \
++ $(LIBAV_CONFIGURE_DEMUXERS) \
++ --disable-parsers \
++ $(LIBAV_CONFIGURE_PARSERS) \
++ --disable-protocols \
++ $(LIBAV_CONFIGURE_PROTOCOLS) \
++ --disable-asm \
++ --disable-altivec \
++ --disable-amd3dnow \
++ --disable-amd3dnowext \
++ --disable-mmx \
++ --disable-mmxext \
++ --disable-sse \
++ --disable-sse2 \
++ --disable-sse3 \
++ --disable-ssse3 \
++ --disable-sse4 \
++ --disable-sse42 \
++ --disable-avx \
++ --disable-xop \
++ --disable-fma3 \
++ --disable-fma4 \
++ --disable-avx2 \
++ --disable-vfp \
++ --disable-neon \
++ --disable-inline-asm \
++ --disable-yasm"
++
++# XXX: trick to force use of embedded Libav headers
++TARGET_CFLAGS += $(TARGET_CPPFLAGS) -D_GNU_SOURCE
++TARGET_CPPFLAGS :=
++
++TARGET_LDFLAGS += $(FPIC)
++
++define Build/Prepare
++$(call Build/Prepare/Default)
++endef
++
++define Package/gst1-libav/install
++ $(INSTALL_DIR) $(1)/usr/lib/gstreamer-$(GST_VERSION)
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/gstreamer-$(GST_VERSION)/libgstlibav.so* \
++ $(1)/usr/lib/gstreamer-$(GST_VERSION)/ \
++ )
++endef
++
++$(eval $(call BuildPackage,gst1-libav))
+diff --git a/feeds/packages/multimedia/gst1-plugins-bad/Makefile b/feeds/packages/multimedia/gst1-plugins-bad/Makefile
+new file mode 100644
+index 0000000..bfeb1c5
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-bad/Makefile
+@@ -0,0 +1,274 @@
++#
++# Copyright (C) 2011-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gst1-plugins-bad
++PKG_VERSION:=1.4.5
++PKG_RELEASE:=2
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=LGPLv2 GPLv2
++PKG_LICENSE_FILES:=COPYING.LIB COPYING
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/gst-plugins-bad-$(PKG_VERSION)
++PKG_SOURCE:=gst-plugins-bad-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://gstreamer.freedesktop.org/src/gst-plugins-bad/
++PKG_MD5SUM:=e0bb39412cf4a48fe0397bcf3a7cd451
++
++PKG_BUILD_DEPENDS:= libgstreamer1 gstreamer1-plugins-base
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++GST_BAD_LIBS:=
++GST_BAD_MODULES:=
++
++define Package/gstreamer1-bad/Default
++ CATEGORY:=Multimedia
++ SECTION:=multimedia
++ TITLE:=GStreamer
++ URL:=http://gstreamer.freedesktop.org/
++ DEPENDS:= +libgstreamer1 $(ICONV_DEPENDS)
++endef
++
++define Package/gstreamer1-bad/description/Default
++ GStreamer open source multimedia framework
++endef
++
++
++define Package/gst1-plugins-bad
++$(call Package/gstreamer1-bad/Default)
++ TITLE+= plugins collection (bad)
++ DEPENDS+= $(GST_DEPENDS)
++ HIDDEN:=1
++endef
++
++define Package/gts1-plugins-bad/description
++$(call Package/gstreamer1-bad/description/Default)
++ .
++ This meta package contains only dependencies to the other plugins from
++ the bad plugins collection.
++endef
++
++define Package/gstreamer1-plugins-bad
++ $(call Package/gstreamer1-bad/Default)
++ TITLE+= plugins collection (bad)
++ DEPENDS:=+ALL:gst1-plugins-bad +gstreamer1-plugins-base
++endef
++
++define Package/gstreamer1-plugins-bad/config
++ menu "Select GStreamer bad modules and libraries"
++ depends on PACKAGE_gstreamer1-plugins-bad
++
++
++ config gst1-plugins-bad-all
++ bool "Include all GStreamer bad plugins"
++ select PACKAGE_gst1-plugins-bad
++
++ comment "Modules"
++
++ $(foreach mod,$(GST_BAD_MODULES), \
++ config PACKAGE_gst1-mod-$(mod)
++ prompt "GStreamer $(mod) module"
++
++ )
++
++ comment "Libraries"
++
++ $(foreach lib,$(GST_BAD_LIBS), \
++ config PACKAGE_libgst1$(lib)
++ prompt "GStreamer $(lib) library"
++
++ )
++
++ endmenu
++
++endef
++
++GST_VERSION:=1.0
++
++CONFIGURE_ARGS += \
++ --disable-debug \
++ --disable-examples \
++ --disable-nls \
++ \
++ --disable-directsound \
++ --disable-directdraw \
++ --disable-osx_video \
++ --disable-quicktime \
++ --disable-vcd \
++ --disable-assrender \
++ --disable-apexsink \
++ --disable-bz2 \
++ --disable-dc1394 \
++ --disable-directfb \
++ --disable-dts \
++ --disable-resindvd \
++ --disable-faac \
++ --disable-faad \
++ --disable-fbdev \
++ --disable-flite \
++ --disable-gsm \
++ --disable-kate \
++ --disable-ladspa \
++ --disable-lv2 \
++ --disable-modplug \
++ --disable-mimic \
++ --disable-libmms \
++ --disable-mpeg2enc \
++ --disable-mplex \
++ --disable-musepack \
++ --disable-mythtv \
++ --disable-nas \
++ --disable-neon \
++ --disable-ofa \
++ --disable-rsvg \
++ --disable-timidity \
++ --disable-wildmidi \
++ --disable-sdl \
++ --disable-sdltest \
++ --disable-sndfile \
++ --disable-soundtouch \
++ --disable-spc \
++ --disable-gme \
++ --disable-xvid \
++ --disable-dvb \
++ --disable-wininet \
++ --disable-acm \
++ --disable-vdpau \
++ --disable-schro \
++ --disable-zbar \
++ --disable-srtp \
++ --disable-hls \
++ \
++ --without-libiconv-prefix \
++ --without-libintl-prefix \
++ --with-libgcrypt-prefix="$(STAGING_DIR)/usr" \
++ --without-x \
++
++TARGET_CFLAGS+= -std=gnu99
++
++EXTRA_LDFLAGS+= \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
++ $(if $(ICONV_FULL),-liconv) \
++
++
++define Package/gst1-plugins-bad/install
++ /bin/true
++endef
++
++# 1: short name
++# 2: description
++# 3: dependencies on other gstreamer libraries (short name)
++# 4: dependencies on other packages
++define GstBuildLibrary
++
++ GST_DEPENDS += +libgst1$(1)
++
++ GST_BAD_LIBS+= $(1)
++ define Package/libgst1$(1)
++ $(call Package/gstreamer1-bad/Default)
++ TITLE+= $(2) library (base)
++ DEPENDS+= $$(foreach p,$(3),+libgst1$$(p)) $(4)
++ HIDDEN:=1
++ endef
++
++ define Package/libgst1$(1)/description
++ $(call Package/gstreamer1-bad/description/Default)
++ .
++ This package contains the GStreamer $(2) library.
++ endef
++
++ define Package/libgst1$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/libgst$(1)-$(GST_VERSION).so.* \
++ $$(1)/usr/lib/ \
++ )
++ endef
++
++ $$(eval $$(call BuildPackage,libgst1$(1)))
++endef
++
++$(eval $(call GstBuildLibrary,photography,photography,,))
++$(eval $(call GstBuildLibrary,basecamerabinsrc,basecamerabinsrc,app,))
++
++# 1: short name
++# 2: description
++# 3: dependencies on other gstreamer libraries (short name)
++# 4: dependencies on other gstreamer plugins (short name)
++# 5: dependencies on other packages
++define GstBuildPlugin
++
++ GST_DEPENDS += +gst1-mod-$(1)
++
++ GST_BAD_MODULES+= $(1)
++
++ define Package/gst1-mod-$(1)
++ $(call Package/gstreamer1-bad/Default)
++ TITLE+= $(2) plugin (bad)
++ DEPENDS+= $$(foreach p,$(3),+libgst1$$(p)) $$(foreach p,$(4),+gst1-mod-$$(p)) $(5)
++ HIDDEN:=1
++ endef
++
++ define Package/gst1-mod-$(1)/description
++ $(call Package/gstreamer1-bad/description/Default)
++ .
++ This package contains the GStreamer $(2) plugin.
++ endef
++
++ define Package/gst1-mod-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/gstreamer-$(GST_VERSION)
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/gstreamer-$(GST_VERSION)/libgst$(1).so* \
++ $$(1)/usr/lib/gstreamer-$(GST_VERSION)/ \
++ )
++ endef
++
++ $$(eval $$(call BuildPackage,gst1-mod-$(1)))
++endef
++
++$(eval $(call GstBuildPlugin,adpcmdec,adpcm decoding support,audio,,))
++$(eval $(call GstBuildPlugin,adpcmenc,adpcm encoding support,audio,,))
++$(eval $(call GstBuildPlugin,aiff,aiff support,audio tag,,))
++$(eval $(call GstBuildPlugin,asfmux,asf muxing support,rtp,,))
++$(eval $(call GstBuildPlugin,autoconvert,autoconvert support,,,))
++$(eval $(call GstBuildPlugin,bayer,bayer support,video,,))
++$(eval $(call GstBuildPlugin,camerabin2,camerabin support,basecamerabinsrc photography tag pbutils app,,))
++$(eval $(call GstBuildPlugin,dataurisrc,dataurisrc support,,,))
++$(eval $(call GstBuildPlugin,debugutilsbad,debugutils support,video,,))
++$(eval $(call GstBuildPlugin,dvdspu,dvdspu support,video,,))
++$(eval $(call GstBuildPlugin,festival,festival support,audio,,))
++$(eval $(call GstBuildPlugin,frei0r,frei0r support,controller video,,))
++$(eval $(call GstBuildPlugin,id3tag,id3tag support,tag,,))
++$(eval $(call GstBuildPlugin,jpegformat,jpegformat support,tag,,))
++$(eval $(call GstBuildPlugin,liveadder,liveadder support,audio,,))
++$(eval $(call GstBuildPlugin,mpegpsdemux,mpegpsdemux support,pbutils tag,,))
++$(eval $(call GstBuildPlugin,mpegpsmux,mpegpsmux support,,,))
++#$(eval $(call GstBuildPlugin,mpegtsdemux,mpegtsdemux support,mpegts pbutils tag,,))
++#$(eval $(call GstBuildPlugin,mpegtsmux,mpegtsmux support,video,,))
++$(eval $(call GstBuildPlugin,mxf,mxf support,audio video,,))
++$(eval $(call GstBuildPlugin,opus,OPUS plugin library,audio tag rtp,,+libopus))
++$(eval $(call GstBuildPlugin,pcapparse,pcapparse support,,,))
++$(eval $(call GstBuildPlugin,pnm,pnm support,video,,))
++$(eval $(call GstBuildPlugin,rawparse,rawparse support,audio video,,))
++$(eval $(call GstBuildPlugin,rfbsrc,librfb support,video,,))
++$(eval $(call GstBuildPlugin,sdpelem,sdp support,rtp sdp,,))
++$(eval $(call GstBuildPlugin,segmentclip,segmentclip support,audio,,))
++$(eval $(call GstBuildPlugin,shm,POSIX shared memory source and sink,,,+librt))
++$(eval $(call GstBuildPlugin,siren,siren support,audio rtp,,))
++$(eval $(call GstBuildPlugin,speed,speed support,audio,,))
++$(eval $(call GstBuildPlugin,subenc,subenc support,controller,,))
++#$(eval $(call GstBuildPlugin,srtp,srtp support,rtp,,+libsrtp))
++
++$(eval $(call BuildPackage,gstreamer1-plugins-bad))
++$(eval $(call BuildPackage,gst1-plugins-bad))
+diff --git a/feeds/packages/multimedia/gst1-plugins-bad/patches/000-gettext.patch b/feeds/packages/multimedia/gst1-plugins-bad/patches/000-gettext.patch
+new file mode 100644
+index 0000000..1c0d88e
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-bad/patches/000-gettext.patch
+@@ -0,0 +1,42 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -3334,7 +3334,6 @@ ext/timidity/Makefile
++ ext/webp/Makefile
++ ext/xvid/Makefile
++ ext/zbar/Makefile
++-po/Makefile.in
++ docs/Makefile
++ docs/plugins/Makefile
++ docs/libs/Makefile
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -2,11 +2,11 @@ DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-d
++
++ SUBDIRS = \
++ gst-libs gst sys ext pkgconfig \
++- m4 common docs tests po tools
+++ m4 common docs tests tools
++
++ DIST_SUBDIRS = \
++ gst gst-libs sys ext pkgconfig \
++- m4 common docs tests po tools
+++ m4 common docs tests tools
++
++ # include before EXTRA_DIST for win32 assignment
++ include $(top_srcdir)/common/win32.mak
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -739,11 +739,11 @@ wayland_scanner = @wayland_scanner@
++ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
++ SUBDIRS = \
++ gst-libs gst sys ext pkgconfig \
++- m4 common docs tests po tools
+++ m4 common docs tests tools
++
++ DIST_SUBDIRS = \
++ gst gst-libs sys ext pkgconfig \
++- m4 common docs tests po tools
+++ m4 common docs tests tools
++
++
++ # the MANIFEST contains all win32 related files that should be disted
+diff --git a/feeds/packages/multimedia/gst1-plugins-base/Makefile b/feeds/packages/multimedia/gst1-plugins-base/Makefile
+new file mode 100644
+index 0000000..6f7cda5
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-base/Makefile
+@@ -0,0 +1,289 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gst1-plugins-base
++PKG_VERSION:=1.4.5
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=LGPLv2 GPLv2
++PKG_LICENSE_FILES:=COPYING.LIB COPYING
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/gst-plugins-base-$(PKG_VERSION)
++PKG_SOURCE:=gst-plugins-base-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://gstreamer.freedesktop.org/src/gst-plugins-base/
++PKG_MD5SUM:=357165af625c0ca353ab47c5d843920e
++
++PKG_BUILD_DEPENDS:= libgstreamer1
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_PACKAGE_gst1-mod-alsa \
++ CONFIG_PACKAGE_gst1-mod-app \
++ CONFIG_PACKAGE_gst1-mod-audioconvert \
++ CONFIG_PACKAGE_gst1-mod-audiorate \
++ CONFIG_PACKAGE_gst1-mod-audioresample \
++ CONFIG_PACKAGE_gst1-mod-audiotestsrc \
++ CONFIG_PACKAGE_gst1-mod-gio \
++ CONFIG_PACKAGE_gst1-mod-ogg \
++ CONFIG_PACKAGE_gst1-mod-tcp \
++ CONFIG_PACKAGE_gst1-mod-theora \
++ CONFIG_PACKAGE_gst1-mod-videoconvert \
++ CONFIG_PACKAGE_gst1-mod-videotestsrc \
++ CONFIG_PACKAGE_gst1-mod-volume \
++ CONFIG_PACKAGE_gst1-mod-vorbis \
++ CONFIG_PACKAGE_libgst1app \
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++GST_BASE_LIBS:=
++GST_BASE_MODULES:=
++
++define Package/gstreamer1-base/Default
++ CATEGORY:=Multimedia
++ SECTION:=multimedia
++ TITLE:=GStreamer
++ URL:=http://gstreamer.freedesktop.org/
++ DEPENDS:= +libgstreamer1 $(ICONV_DEPENDS)
++endef
++
++define Package/gstreamer1-base/description/Default
++ GStreamer open source multimedia framework
++endef
++
++
++define Package/gst1-plugins-base
++$(call Package/gstreamer1-base/Default)
++ TITLE+= plugins collection (base)
++ DEPENDS+= $(GST_DEPENDS)
++ HIDDEN:=1
++endef
++
++define Package/gts1-plugins-base/description
++$(call Package/gstreamer1-base/description/Default)
++ .
++ This meta package contains only dependencies to the other libraries and
++ plugins from the base plugins collection.
++endef
++
++define Package/gstreamer1-plugins-base
++ $(call Package/gstreamer1-base/Default)
++ TITLE+= plugins collection (base)
++ DEPENDS:=+ALL:gst1-plugins-base +gstreamer1-libs
++endef
++
++define Package/gstreamer1-plugins-base/config
++ menu "Select GStreamer base modules and libraries"
++ depends on PACKAGE_gstreamer1-plugins-base
++
++
++ config gst1-plugins-base-all
++ bool "Include all GStreamer base plugins"
++ select PACKAGE_gst1-plugins-base
++
++ comment "Modules"
++
++ $(foreach mod,$(GST_BASE_MODULES), \
++ config PACKAGE_gst1-mod-$(mod)
++ prompt "GStreamer $(mod) module"
++
++ )
++
++ comment "Libraries"
++
++ $(foreach lib,$(GST_BASE_LIBS), \
++ config PACKAGE_libgst1$(lib)
++ prompt "GStreamer $(lib) library"
++
++ )
++
++ endmenu
++
++endef
++
++GST_COND_SELECT = $(patsubst %,$(if $(CONFIG_PACKAGE_gst1-mod-$(1)),--enable,--disable)-%,$(1))
++
++GST_VERSION:=1.0
++
++CONFIGURE_ARGS += \
++ --disable-debug \
++ --disable-examples \
++ \
++ $(call GST_COND_SELECT,alsa) \
++ $(call GST_COND_SELECT,app) \
++ $(call GST_COND_SELECT,audioconvert) \
++ $(call GST_COND_SELECT,audiorate) \
++ $(call GST_COND_SELECT,audioresample) \
++ $(call GST_COND_SELECT,audiotestsrc) \
++ --disable-cdparanoia \
++ --disable-freetypetest \
++ $(call GST_COND_SELECT,gio) \
++ --disable-libvisual \
++ $(call GST_COND_SELECT,ogg) \
++ --disable-pango \
++ --disable-subparse \
++ $(call GST_COND_SELECT,tcp) \
++ $(call GST_COND_SELECT,theora) \
++ $(call GST_COND_SELECT,videorate) \
++ $(call GST_COND_SELECT,videoscale) \
++ $(call GST_COND_SELECT,videoconvert) \
++ $(call GST_COND_SELECT,videotestsrc) \
++ $(call GST_COND_SELECT,volume) \
++ $(call GST_COND_SELECT,vorbis) \
++ --disable-x \
++ --disable-xshm \
++ --disable-xvideo \
++ \
++ --without-libiconv-prefix \
++ --without-libintl-prefix \
++ --without-x \
++ \
++ --with-audioresample-format=int \
++
++EXTRA_LDFLAGS+= \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
++ $(if $(ICONV_FULL),-liconv) \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/gstreamer-$(GST_VERSION)
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/include/gstreamer-$(GST_VERSION)/* \
++ $(1)/usr/include/gstreamer-$(GST_VERSION)/ \
++ )
++ $(INSTALL_DIR) $(1)/usr/lib
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/libgst*-$(GST_VERSION).{la,so*} \
++ $(1)/usr/lib/ \
++ )
++ $(INSTALL_DIR) $(1)/usr/lib/gstreamer-$(GST_VERSION)
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/gstreamer-$(GST_VERSION)/libgst*.{la,so} \
++ $(1)/usr/lib/gstreamer-$(GST_VERSION)/ \
++ )
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/pkgconfig/gstreamer*-$(GST_VERSION).pc \
++ $(1)/usr/lib/pkgconfig/ \
++ )
++endef
++
++
++define Package/gst1-plugins-base/install
++ true
++endef
++
++define Package/gstreamer1-plugins-base/install
++ true
++endef
++
++# 1: short name
++# 2: description
++# 3: dependencies on other gstreamer libraries (short name)
++# 4: dependencies on other packages
++define GstBuildLibrary
++
++ GST_DEPENDS += +libgst1$(1)
++
++ GST_BASE_LIBS+= $(1)
++
++ define Package/libgst1$(1)
++ $(call Package/gstreamer1-base/Default)
++ TITLE+= $(2) library (base)
++ DEPENDS+= $$(foreach p,$(3),+libgst1$$(p)) $(4)
++ HIDDEN:=1
++ endef
++
++ define Package/libgst1$(1)/description
++ $(call Package/gstreamer1-base/description/Default)
++ .
++ This package contains the GStreamer $(2) library.
++ endef
++
++ define Package/libgst1$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/libgst$(1)-$(GST_VERSION).so.* \
++ $$(1)/usr/lib/ \
++ )
++ endef
++
++ $$(eval $$(call BuildPackage,libgst1$(1)))
++endef
++
++$(eval $(call GstBuildLibrary,allocators,allocators,,))
++$(eval $(call GstBuildLibrary,app,app,,))
++$(eval $(call GstBuildLibrary,audio,audio,tag,))
++$(eval $(call GstBuildLibrary,fft,FFT,,))
++$(eval $(call GstBuildLibrary,pbutils,utils,audio tag video,))
++$(eval $(call GstBuildLibrary,riff,RIFF media,audio tag,,))
++$(eval $(call GstBuildLibrary,rtp,RTP,,))
++$(eval $(call GstBuildLibrary,rtsp,RTSP,,))
++$(eval $(call GstBuildLibrary,sdp,SDP,,))
++$(eval $(call GstBuildLibrary,tag,tag support,,))
++$(eval $(call GstBuildLibrary,video,video,,))
++
++# 1: short name
++# 2: description
++# 3: dependencies on other gstreamer libraries (short name)
++# 4: dependencies on other gstreamer plugins (short name)
++# 5: dependencies on other packages
++define GstBuildPlugin
++
++ GST_DEPENDS += +gst1-mod-$(1)
++
++ GST_BASE_MODULES+= $(1)
++
++ define Package/gst1-mod-$(1)
++ $(call Package/gstreamer1-base/Default)
++ TITLE+= $(2) plugin (base)
++ DEPENDS+= $$(foreach p,$(3),+libgst1$$(p)) $$(foreach p,$(4),+gst1-mod-$$(p)) $(5)
++ HIDDEN:=1
++ endef
++
++ define Package/gst1-mod-$(1)/description
++ $(call Package/gstreamer1-base/description/Default)
++ .
++ This package contains the GStreamer $(2) plugin.
++ endef
++
++ define Package/gst1-mod-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/gstreamer-$(GST_VERSION)
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/gstreamer-$(GST_VERSION)/libgst$(1).so* \
++ $$(1)/usr/lib/gstreamer-$(GST_VERSION)/ \
++ )
++ endef
++
++ $$(eval $$(call BuildPackage,gst1-mod-$(1)))
++endef
++
++$(eval $(call GstBuildPlugin,alsa,ALSA,audio tag,,+alsa-lib))
++$(eval $(call GstBuildPlugin,app,app,app,,))
++$(eval $(call GstBuildPlugin,audioconvert,audio format conversion,audio,,))
++$(eval $(call GstBuildPlugin,audiorate,audio rate adjusting,audio tag,,))
++$(eval $(call GstBuildPlugin,audioresample,audio resampling,audio tag,,))
++$(eval $(call GstBuildPlugin,audiotestsrc,audio test,audio tag controller,,))
++$(eval $(call GstBuildPlugin,playback,media decoder (v2),pbutils,,))
++$(eval $(call GstBuildPlugin,gio,GIO,,,))
++$(eval $(call GstBuildPlugin,ogg,Ogg,riff tag pbutils video,,+libogg))
++$(eval $(call GstBuildPlugin,tcp,TCP,,,))
++$(eval $(call GstBuildPlugin,theora,Theora,tag video,,+libogg +libtheora))
++$(eval $(call GstBuildPlugin,typefindfunctions,'typefind' functions,audio pbutils tag video,,))
++$(eval $(call GstBuildPlugin,videoconvert,video format conversion,video,,))
++$(eval $(call GstBuildPlugin,videorate,Adjusts video frames,video,,))
++$(eval $(call GstBuildPlugin,videoscale,Resizes video,video,,))
++$(eval $(call GstBuildPlugin,videotestsrc,video test,video,,+liboil))
++$(eval $(call GstBuildPlugin,volume,volume,audio controller,,+liboil))
++$(eval $(call GstBuildPlugin,vorbis,Vorbis,audio tag,ogg,+libvorbis))
++
++$(eval $(call BuildPackage,gstreamer1-plugins-base))
++$(eval $(call BuildPackage,gst1-plugins-base))
+diff --git a/feeds/packages/multimedia/gst1-plugins-base/patches/001-no_docs.patch b/feeds/packages/multimedia/gst1-plugins-base/patches/001-no_docs.patch
+new file mode 100644
+index 0000000..0044cec
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-base/patches/001-no_docs.patch
+@@ -0,0 +1,34 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -12,14 +12,12 @@ SUBDIRS = \
++ gst sys $(SUBDIRS_EXT) \
++ tools \
++ tests \
++- docs \
++ po \
++ common \
++ m4
++
++ DIST_SUBDIRS = \
++ pkgconfig \
++- docs \
++ gst-libs \
++ gst sys ext \
++ tools \
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -539,14 +539,12 @@ SUBDIRS = \
++ gst sys $(SUBDIRS_EXT) \
++ tools \
++ tests \
++- docs \
++ po \
++ common \
++ m4
++
++ DIST_SUBDIRS = \
++ pkgconfig \
++- docs \
++ gst-libs \
++ gst sys ext \
++ tools \
+diff --git a/feeds/packages/multimedia/gst1-plugins-base/patches/002-no_tests.patch b/feeds/packages/multimedia/gst1-plugins-base/patches/002-no_tests.patch
+new file mode 100644
+index 0000000..3e8c93d
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-base/patches/002-no_tests.patch
+@@ -0,0 +1,36 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -11,7 +11,6 @@ SUBDIRS = \
++ gst-libs \
++ gst sys $(SUBDIRS_EXT) \
++ tools \
++- tests \
++ po \
++ common \
++ m4
++@@ -21,7 +20,6 @@ DIST_SUBDIRS = \
++ gst-libs \
++ gst sys ext \
++ tools \
++- tests \
++ po \
++ common \
++ m4
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -538,7 +538,6 @@ SUBDIRS = \
++ gst-libs \
++ gst sys $(SUBDIRS_EXT) \
++ tools \
++- tests \
++ po \
++ common \
++ m4
++@@ -548,7 +547,6 @@ DIST_SUBDIRS = \
++ gst-libs \
++ gst sys ext \
++ tools \
++- tests \
++ po \
++ common \
++ m4
+diff --git a/feeds/packages/multimedia/gst1-plugins-base/patches/003-no_translations.patch b/feeds/packages/multimedia/gst1-plugins-base/patches/003-no_translations.patch
+new file mode 100644
+index 0000000..894c8da
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-base/patches/003-no_translations.patch
+@@ -0,0 +1,46 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -918,7 +918,6 @@ docs/design/Makefile
++ docs/libs/Makefile
++ docs/plugins/Makefile
++ docs/version.entities
++-po/Makefile.in
++ common/Makefile
++ common/m4/Makefile
++ m4/Makefile
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -11,7 +11,6 @@ SUBDIRS = \
++ gst-libs \
++ gst sys $(SUBDIRS_EXT) \
++ tools \
++- po \
++ common \
++ m4
++
++@@ -20,7 +19,6 @@ DIST_SUBDIRS = \
++ gst-libs \
++ gst sys ext \
++ tools \
++- po \
++ common \
++ m4
++
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -538,7 +538,6 @@ SUBDIRS = \
++ gst-libs \
++ gst sys $(SUBDIRS_EXT) \
++ tools \
++- po \
++ common \
++ m4
++
++@@ -547,7 +546,6 @@ DIST_SUBDIRS = \
++ gst-libs \
++ gst sys ext \
++ tools \
++- po \
++ common \
++ m4
++
+diff --git a/feeds/packages/multimedia/gst1-plugins-good/Makefile b/feeds/packages/multimedia/gst1-plugins-good/Makefile
+new file mode 100644
+index 0000000..f52d82f
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-good/Makefile
+@@ -0,0 +1,236 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gst1-plugins-good
++PKG_VERSION:=1.4.5
++PKG_RELEASE:=2
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=LGPLv2
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/gst-plugins-good-$(PKG_VERSION)
++PKG_SOURCE:=gst-plugins-good-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://gstreamer.freedesktop.org/src/gst-plugins-good/
++PKG_MD5SUM:=eaf1a6daf73749bc423feac301d60038
++
++PKG_BUILD_DEPENDS:= libgstreamer1 gstreamer1-plugins-base
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++GST_GOOD_MODULES:=
++
++define Package/gstreamer1-good/Default
++ CATEGORY:=Multimedia
++ SECTION:=multimedia
++ TITLE:=GStreamer
++ URL:=http://gstreamer.freedesktop.org/
++ DEPENDS:= +libgstreamer1 $(ICONV_DEPENDS)
++endef
++
++define Package/gstreamer1-good/description/Default
++ GStreamer open source multimedia framework
++endef
++
++
++define Package/gst1-plugins-good
++$(call Package/gstreamer1-good/Default)
++ TITLE+= plugins collection (good)
++ DEPENDS+= $(GST_DEPENDS)
++ HIDDEN:=1
++endef
++
++define Package/gst1-plugins-good/description
++$(call Package/gstreamer1-good/description/Default)
++ .
++ This meta package contains only dependencies to the other plugins from
++ the good plugins collection.
++endef
++
++
++define Package/gstreamer1-plugins-good
++ $(call Package/gstreamer1-good/Default)
++ TITLE+= plugins collection (good)
++ DEPENDS:=+ALL:gst1-plugins-good +gstreamer1-plugins-base
++endef
++
++define Package/gstreamer1-plugins-good/config
++ menu "Select GStreamer good modules"
++ depends on PACKAGE_gstreamer1-plugins-good
++
++
++ config gst1-plugins-good-all
++ bool "Include all GStreamer good plugins"
++ select PACKAGE_gst1-plugins-good
++
++ comment "Modules"
++
++ $(foreach mod,$(GST_GOOD_MODULES), \
++ config PACKAGE_gst1-mod-$(mod)
++ prompt "GStreamer $(mod) module"
++
++ )
++
++ endmenu
++
++endef
++
++GST_VERSION:=1.0
++
++CONFIGURE_ARGS += \
++ --disable-debug \
++ --disable-examples \
++ \
++ --disable-aalib \
++ --disable-annodex \
++ --disable-bz2 \
++ --disable-cairo \
++ --disable-directsound \
++ --disable-dv1394 \
++ --disable-esd \
++ --disable-gconf \
++ --disable-gconftool \
++ --disable-gdk_pixbuf \
++ --disable-hal \
++ --disable-libcaca \
++ --disable-libdv \
++ --disable-osx_audio \
++ --disable-osx_video \
++ --disable-pulse \
++ --disable-qtdemux \
++ --disable-rtspmanager \
++ --disable-shout2 \
++ --disable-sunaudio \
++ --disable-wavpack \
++ --disable-x \
++ --disable-xshm \
++ --disable-xvideo \
++ --disable-y4m \
++ --disable-zlib \
++ \
++ --without-libiconv-prefix \
++ --without-libintl-prefix \
++ --without-x \
++
++EXTRA_LDFLAGS+= \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
++ $(if $(ICONV_FULL),-liconv) \
++
++
++define Package/gst1-plugins-good/install
++ /bin/true
++endef
++
++
++# 1: short name
++# 2: description
++# 3: dependencies on other gstreamer libraries (short name)
++# 4: dependencies on other gstreamer plugins (short name)
++# 5: dependencies on other packages
++define GstBuildPlugin
++
++ GST_DEPENDS += +gst1-mod-$(1)
++
++ GST_GOOD_MODULES+= $(1)
++
++ define Package/gst1-mod-$(1)
++ $(call Package/gstreamer1-good/Default)
++ TITLE+= $(2) plugin (good)
++ DEPENDS+= $$(foreach p,$(3),+libgst1$$(p)) $$(foreach p,$(4),+gst1-mod-$$(p)) $(5)
++ HIDDEN:=1
++ endef
++
++ define Package/gst1-mod-$(1)/description
++ $(call Package/gstreamer1-good/description/Default)
++ .
++ This package contains the GStreamer $(2) plugin.
++ endef
++
++ define Package/gst1-mod-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/gstreamer-$(GST_VERSION)
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/gstreamer-$(GST_VERSION)/libgst$(1).so* \
++ $$(1)/usr/lib/gstreamer-$(GST_VERSION)/ \
++ )
++ endef
++
++ $$(eval $$(call BuildPackage,gst1-mod-$(1)))
++endef
++
++#$(eval $(call GstBuildPlugin,1394,IEEE 1394 support,,,))
++$(eval $(call GstBuildPlugin,alaw,alaw codec,audio,,))
++$(eval $(call GstBuildPlugin,alpha,alpha support,video,,))
++$(eval $(call GstBuildPlugin,alphacolor,alphacolor support,video,,))
++$(eval $(call GstBuildPlugin,apetag,apetag support,audio pbutils tag video,,))
++$(eval $(call GstBuildPlugin,audiofx,audio effects,audio fft controller,,))
++$(eval $(call GstBuildPlugin,audioparsers,audioparsers,audio tag pbutils,,))
++$(eval $(call GstBuildPlugin,auparse,auparse,audio tag pbutils,,))
++$(eval $(call GstBuildPlugin,autodetect,format auto-detection,,,))
++$(eval $(call GstBuildPlugin,avi,avi support,audio riff tag video,,))
++$(eval $(call GstBuildPlugin,cutter,audio cutter,audio,,))
++$(eval $(call GstBuildPlugin,debug,debugging,,,))
++$(eval $(call GstBuildPlugin,deinterlace,deinterlace support,video,,))
++$(eval $(call GstBuildPlugin,dtmf,dtmf support,rtp,,))
++#$(eval $(call GstBuildPlugin,dv,dv support,audio tag video,,))
++$(eval $(call GstBuildPlugin,effectv,effectvsupport,video,,))
++$(eval $(call GstBuildPlugin,equalizer,audio equalizer,audio controller,,))
++$(eval $(call GstBuildPlugin,flac,FLAC codec,audio pbutils tag,,+libflac))
++$(eval $(call GstBuildPlugin,flv,flv codec,audio pbutils tag video,,))
++$(eval $(call GstBuildPlugin,flxdec,flx codec,,,))
++#$(eval $(call GstBuildPlugin,gdkpixbuf,gdkpixbuf support,video,,))
++$(eval $(call GstBuildPlugin,goom2k1,goom support,,,))
++$(eval $(call GstBuildPlugin,goom,goom support,,,))
++$(eval $(call GstBuildPlugin,icydemux,icy demuxer,audio tag,,))
++$(eval $(call GstBuildPlugin,id3demux,ID3v1/v2 demuxer,pbutils tag,,))
++$(eval $(call GstBuildPlugin,imagefreeze,imagefreeze support,,,))
++$(eval $(call GstBuildPlugin,interleave,audio interleave,audio,,))
++$(eval $(call GstBuildPlugin,isomp4,isomp4 support,audio pbutils riff rtp tag video,,))
++#$(eval $(call GstBuildPlugin,jack,jack support,audio,,))
++$(eval $(call GstBuildPlugin,jpeg,jpeg support,video,,+libjpeg))
++$(eval $(call GstBuildPlugin,level,audio level,audio,,))
++$(eval $(call GstBuildPlugin,matroska,matroska support,audio pbutils riff tag video,,))
++$(eval $(call GstBuildPlugin,mulaw,mulaw support,audio,,))
++$(eval $(call GstBuildPlugin,multifile,multiple files access,video,,))
++$(eval $(call GstBuildPlugin,multipart,multipart stream handling,,,))
++$(eval $(call GstBuildPlugin,navigationtest,navigationtest support,video,,))
++$(eval $(call GstBuildPlugin,oss4audio,OSS 4 audio support,audio tag,,))
++$(eval $(call GstBuildPlugin,ossaudio,OSS audio support,audio,,))
++$(eval $(call GstBuildPlugin,png,png support,video,,+libpng))
++#$(eval $(call GstBuildPlugin,pulse,pulse support,audio pbutils tag video,,))
++$(eval $(call GstBuildPlugin,replaygain,volume normalization,pbutils,,))
++$(eval $(call GstBuildPlugin,rtpmanager,RTP manager,audio net rtp tag pbutils video,,))
++$(eval $(call GstBuildPlugin,rtp,RTP,audio rtp tag pbutils video,,))
++$(eval $(call GstBuildPlugin,rtsp,RTSP,net rtp rtsp sdp,,))
++$(eval $(call GstBuildPlugin,shapewipe,shapewipe support,video,,))
++#$(eval $(call GstBuildPlugin,shout2,shout2 support,,,))
++$(eval $(call GstBuildPlugin,smpte,smpte support,video,,))
++$(eval $(call GstBuildPlugin,souphttpsrc,soup input,audio tag,,+libsoup))
++$(eval $(call GstBuildPlugin,spectrum,spectrum data output,audio fft,,))
++#$(eval $(call GstBuildPlugin,speex,speex support,audio tag,,))
++#$(eval $(call GstBuildPlugin,sty4menc,sty4menc support,video,,))
++#$(eval $(call GstBuildPlugin,taglib,taglib support,tag,,))
++$(eval $(call GstBuildPlugin,udp,UDP,net,,))
++$(eval $(call GstBuildPlugin,video4linux2,video4linux2 support,video allocators,,+libv4l))
++$(eval $(call GstBuildPlugin,videobox,videobox support,video,,))
++$(eval $(call GstBuildPlugin,videocrop,videocrop support,video,,))
++$(eval $(call GstBuildPlugin,videofilter,videofilter support,video,,))
++$(eval $(call GstBuildPlugin,videomixer,videomixer support,video,,))
++$(eval $(call GstBuildPlugin,vpx,vpx support,tag video,,+libvpx))
++$(eval $(call GstBuildPlugin,wavenc,Wav encoder,riff,,))
++#$(eval $(call GstBuildPlugin,wavpack,Wav packer,audio riff tag,,))
++$(eval $(call GstBuildPlugin,wavparse,Wav parser,audio riff tag,,))
++#$(eval $(call GstBuildPlugin,ximagesrc,ximagesrc support,video,,))
++
++$(eval $(call BuildPackage,gstreamer1-plugins-good))
++$(eval $(call BuildPackage,gst1-plugins-good))
+diff --git a/feeds/packages/multimedia/gst1-plugins-good/patches/001-no_docs.patch b/feeds/packages/multimedia/gst1-plugins-good/patches/001-no_docs.patch
+new file mode 100644
+index 0000000..21c10c3
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-good/patches/001-no_docs.patch
+@@ -0,0 +1,20 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -3,7 +3,6 @@ DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-d
++ ALWAYS_SUBDIRS = \
++ gst sys ext \
++ tests \
++- docs \
++ po \
++ common \
++ m4 \
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -571,7 +571,6 @@ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk
++ ALWAYS_SUBDIRS = \
++ gst sys ext \
++ tests \
++- docs \
++ po \
++ common \
++ m4 \
+diff --git a/feeds/packages/multimedia/gst1-plugins-good/patches/002-no_tests.patch b/feeds/packages/multimedia/gst1-plugins-good/patches/002-no_tests.patch
+new file mode 100644
+index 0000000..ed922c5
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-good/patches/002-no_tests.patch
+@@ -0,0 +1,20 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -2,7 +2,6 @@ DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-d
++
++ ALWAYS_SUBDIRS = \
++ gst sys ext \
++- tests \
++ po \
++ common \
++ m4 \
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -570,7 +570,6 @@ top_srcdir = @top_srcdir@
++ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
++ ALWAYS_SUBDIRS = \
++ gst sys ext \
++- tests \
++ po \
++ common \
++ m4 \
+diff --git a/feeds/packages/multimedia/gst1-plugins-good/patches/003-no_translations.patch b/feeds/packages/multimedia/gst1-plugins-good/patches/003-no_translations.patch
+new file mode 100644
+index 0000000..16d1b7e
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-good/patches/003-no_translations.patch
+@@ -0,0 +1,30 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -1083,7 +1083,6 @@ sys/sunaudio/Makefile
++ sys/v4l2/Makefile
++ sys/waveform/Makefile
++ sys/ximage/Makefile
++-po/Makefile.in
++ tests/Makefile
++ tests/check/Makefile
++ tests/examples/Makefile
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -2,7 +2,6 @@ DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-d
++
++ ALWAYS_SUBDIRS = \
++ gst sys ext \
++- po \
++ common \
++ m4 \
++ pkgconfig
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -570,7 +570,6 @@ top_srcdir = @top_srcdir@
++ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
++ ALWAYS_SUBDIRS = \
++ gst sys ext \
++- po \
++ common \
++ m4 \
++ pkgconfig
+diff --git a/feeds/packages/multimedia/gst1-plugins-ugly/Makefile b/feeds/packages/multimedia/gst1-plugins-ugly/Makefile
+new file mode 100644
+index 0000000..26c7995
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-ugly/Makefile
+@@ -0,0 +1,176 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gst1-plugins-ugly
++PKG_VERSION:=1.4.5
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=LGPLv2
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/gst-plugins-ugly-$(PKG_VERSION)
++PKG_SOURCE:=gst-plugins-ugly-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://gstreamer.freedesktop.org/src/gst-plugins-ugly/
++PKG_MD5SUM:=6954beed7bb9a93e426dee543ff46393
++
++PKG_BUILD_DEPENDS:= libgstreamer1 gstreamer1-plugins-base
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_PACKAGE_gst1-mod-asf \
++ CONFIG_PACKAGE_gst1-mod-lame \
++ CONFIG_PACKAGE_gst1-mod-mad \
++ CONFIG_PACKAGE_gst1-mod-mpeg2dec \
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++GST_UGLY_MODULES:=
++
++define Package/gstreamer1-ugly/Default
++ CATEGORY:=Multimedia
++ SECTION:=multimedia
++ TITLE:=GStreamer
++ URL:=http://gstreamer.freedesktop.org/
++ DEPENDS:= +libgstreamer1 $(ICONV_DEPENDS)
++endef
++
++define Package/gstreamer1-ugly/description/Default
++ GStreamer open source multimedia framework
++endef
++
++
++define Package/gst1-plugins-ugly
++$(call Package/gstreamer1-ugly/Default)
++ TITLE+= plugins collection (ugly)
++ DEPENDS+= $(GST_DEPENDS)
++ HIDDEN:=1
++endef
++
++define Package/gts-plugins-ugly/description
++$(call Package/gstreamer1-ugly/description/Default)
++ .
++ This meta package contains only dependencies to the other plugins from
++ the ugly plugins collection.
++endef
++
++
++define Package/gstreamer1-plugins-ugly
++ $(call Package/gstreamer1-ugly/Default)
++ TITLE+= plugins collection (ugly)
++ DEPENDS:=+ALL:gst1-plugins-ugly +gstreamer1-plugins-base
++endef
++
++define Package/gstreamer1-plugins-ugly/config
++ menu "Select GStreamer ugly modules"
++ depends on PACKAGE_gstreamer1-plugins-ugly
++
++
++ config gst1-plugins-ugly-all
++ bool "Include all GStreamer ugly plugins"
++ select PACKAGE_gst1-plugins-ugly
++
++ comment "Modules"
++
++ $(foreach mod,$(GST_UGLY_MODULES), \
++ config PACKAGE_gst1-mod-$(mod)
++ prompt "GStreamer $(mod) module"
++
++ )
++
++ endmenu
++
++endef
++
++GST_COND_SELECT = $(patsubst %,$(if $(CONFIG_PACKAGE_gst1-mod-$(1)),--enable,--disable)-%,$(1))
++
++GST_VERSION:=1.0
++
++CONFIGURE_ARGS += \
++ --disable-debug \
++ --disable-examples \
++ \
++ --disable-a52dec \
++ --disable-amrnb \
++ --disable-amrwb \
++ $(call GST_COND_SELECT,asf) \
++ --disable-cdio \
++ --disable-dvdlpcmdec \
++ --disable-dvdread \
++ --disable-dvdsub \
++ --disable-iec958 \
++ $(call GST_COND_SELECT,lame) \
++ $(call GST_COND_SELECT,mad) \
++ $(call GST_COND_SELECT,mpeg2dec) \
++ --disable-mpegaudioparse \
++ --disable-mpegstream \
++ --disable-realmedia \
++ --disable-sidplay \
++ --disable-synaesthesia \
++ --disable-twolame \
++ --disable-x264 \
++ \
++ --without-libiconv-prefix \
++ --without-libintl-prefix \
++
++EXTRA_LDFLAGS+= \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
++ $(if $(ICONV_FULL),-liconv) \
++
++
++define Package/gst1-plugins-ugly/install
++ /bin/true
++endef
++
++
++# 1: short name
++# 2: description
++# 3: dependencies on other gstreamer libraries (short name)
++# 4: dependencies on other gstreamer plugins (short name)
++# 5: dependencies on other packages
++define GstBuildPlugin
++
++ GST_DEPENDS += +gst1-mod-$(1)
++
++ GST_UGLY_MODULES+= $(1)
++
++ define Package/gst1-mod-$(1)
++ $(call Package/gstreamer1-ugly/Default)
++ TITLE+= $(2) plugin (ugly)
++ DEPENDS+= +libgstreamer1 $$(foreach p,$(3),+libgst1$$(p)) $$(foreach p,$(4),+gst1-mod-$$(p)) $(5)
++ HIDDEN:=1
++ endef
++
++ define Package/gst1-mod-$(1)/description
++ $(call Package/gstreamer1-ugly/description/Default)
++ .
++ This package contains the GStreamer $(2) plugin.
++ endef
++
++ define Package/gst1-mod-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/gstreamer-$(GST_VERSION)
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/gstreamer-$(GST_VERSION)/libgst$(1).so* \
++ $$(1)/usr/lib/gstreamer-$(GST_VERSION)/ \
++ )
++ endef
++
++ $$(eval $$(call BuildPackage,gst1-mod-$(1)))
++endef
++
++$(eval $(call GstBuildPlugin,asf,ASF demuxer,audio riff rtp rtsp sdp tag,,))
++$(eval $(call GstBuildPlugin,lame,MP3 encoder (using LAME),audio,,+lame-lib))
++$(eval $(call GstBuildPlugin,mad,MP3 decoder (using MAD),audio tag,,+libid3tag +libmad))
++$(eval $(call GstBuildPlugin,mpeg2dec,MPEG decoder,video,,+libmpeg2))
++
++$(eval $(call BuildPackage,gstreamer1-plugins-ugly))
++$(eval $(call BuildPackage,gst1-plugins-ugly))
+diff --git a/feeds/packages/multimedia/gst1-plugins-ugly/patches/001-no_docs.patch b/feeds/packages/multimedia/gst1-plugins-ugly/patches/001-no_docs.patch
+new file mode 100644
+index 0000000..72c880a
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-ugly/patches/001-no_docs.patch
+@@ -0,0 +1,22 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -1,7 +1,7 @@
++ DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc
++
++ SUBDIRS = \
++- gst-libs gst ext docs m4 tests common pkgconfig po
+++ gst-libs gst ext m4 tests common pkgconfig po
++
++ # include before EXTRA_DIST for win32 assignment
++ include $(top_srcdir)/common/win32.mak
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -502,7 +502,7 @@ top_builddir = @top_builddir@
++ top_srcdir = @top_srcdir@
++ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
++ SUBDIRS = \
++- gst-libs gst ext docs m4 tests common pkgconfig po
+++ gst-libs gst ext m4 tests common pkgconfig po
++
++
++ # the MANIFEST contains all win32 related files that should be disted
+diff --git a/feeds/packages/multimedia/gst1-plugins-ugly/patches/002-no_tests.patch b/feeds/packages/multimedia/gst1-plugins-ugly/patches/002-no_tests.patch
+new file mode 100644
+index 0000000..1611671
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-ugly/patches/002-no_tests.patch
+@@ -0,0 +1,22 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -1,7 +1,7 @@
++ DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc
++
++ SUBDIRS = \
++- gst-libs gst ext m4 tests common pkgconfig po
+++ gst-libs gst ext m4 common pkgconfig po
++
++ # include before EXTRA_DIST for win32 assignment
++ include $(top_srcdir)/common/win32.mak
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -502,7 +502,7 @@ top_builddir = @top_builddir@
++ top_srcdir = @top_srcdir@
++ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
++ SUBDIRS = \
++- gst-libs gst ext m4 tests common pkgconfig po
+++ gst-libs gst ext m4 common pkgconfig po
++
++
++ # the MANIFEST contains all win32 related files that should be disted
+diff --git a/feeds/packages/multimedia/gst1-plugins-ugly/patches/003-no_translations.patch b/feeds/packages/multimedia/gst1-plugins-ugly/patches/003-no_translations.patch
+new file mode 100644
+index 0000000..bd61771
+--- /dev/null
++++ b/feeds/packages/multimedia/gst1-plugins-ugly/patches/003-no_translations.patch
+@@ -0,0 +1,32 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -475,7 +475,6 @@ docs/version.entities
++ tests/Makefile
++ tests/check/Makefile
++ m4/Makefile
++-po/Makefile.in
++ pkgconfig/Makefile
++ pkgconfig/gstreamer-plugins-ugly-uninstalled.pc
++ gst-plugins-ugly.spec
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -1,7 +1,7 @@
++ DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc
++
++ SUBDIRS = \
++- gst-libs gst ext m4 common pkgconfig po
+++ gst-libs gst ext m4 common pkgconfig
++
++ # include before EXTRA_DIST for win32 assignment
++ include $(top_srcdir)/common/win32.mak
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -502,7 +502,7 @@ top_builddir = @top_builddir@
++ top_srcdir = @top_srcdir@
++ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
++ SUBDIRS = \
++- gst-libs gst ext m4 common pkgconfig po
+++ gst-libs gst ext m4 common pkgconfig
++
++
++ # the MANIFEST contains all win32 related files that should be disted
+diff --git a/feeds/packages/multimedia/gstreamer1/Makefile b/feeds/packages/multimedia/gstreamer1/Makefile
+new file mode 100644
+index 0000000..0ab4629
+--- /dev/null
++++ b/feeds/packages/multimedia/gstreamer1/Makefile
+@@ -0,0 +1,231 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gstreamer1
++PKG_VERSION:=1.4.5
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=LGPLv2
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/gstreamer-$(PKG_VERSION)
++PKG_SOURCE:=gstreamer-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://gstreamer.freedesktop.org/src/gstreamer/
++PKG_MD5SUM:=88a9289c64a4950ebb4f544980234289
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=autogen.sh aclocal.m4
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/gstreamer1/Default
++ CATEGORY:=Multimedia
++ SECTION:=multimedia
++ TITLE:=GStreamer
++ URL:=http://gstreamer.freedesktop.org/
++ DEPENDS:= $(ICONV_DEPENDS) $(INTL_DEPENDS)
++endef
++
++define Package/gstreamer1/description/Default
++ GStreamer open source multimedia framework
++endef
++
++GSTREAMER_CORE_LIBS:= \
++ libgstreamer1 \
++ libgst1check \
++ libgst1controller \
++ libgst1net
++
++define Package/gstreamer1
++ $(call Package/gstreamer1/Default)
++ TITLE+= (All libraries)
++ DEPENDS:= $(foreach lib,$(GSTREAMER_CORE_LIBS),+$(lib))
++ HIDDEN:=1
++endef
++
++define Package/gstreamer1-libs/description
++ $(call Package/gstreamer1/description/Default)
++ .
++ This meta package contains only dependencies on the other GStreamer
++ componenents.
++endef
++
++define Package/gstreamer1-libs
++ $(call Package/gstreamer1/Default)
++ TITLE+= core libraries
++ DEPENDS+=+ALL:gstreamer1
++endef
++
++define Package/gstreamer1-libs/config
++ menu "Select GStreamer libraries"
++ depends on PACKAGE_gstreamer1-libs
++
++ config gstreamer1-all
++ bool "Include all GStreamer1 core libraries"
++ select PACKAGE_gstreamer1
++
++ comment "Libraries"
++
++ $(foreach lib,$(GSTREAMER_CORE_LIBS), \
++ config PACKAGE_$(lib)
++ prompt "GStreamer core library $(lib)"
++
++ )
++
++ endmenu
++
++endef
++
++define Package/gstreamer1-utils
++ $(call Package/gstreamer1/Default)
++ TITLE+= utilities
++ DEPENDS+= +libgstreamer1 +gstreamer1-libs
++endef
++
++define Package/gstreamer1-utils/description
++ $(call Package/gstreamer1/description/Default)
++ .
++ This package contains the GStreamer utilities.
++endef
++
++define Package/libgstreamer1
++ $(call Package/gstreamer1/Default)
++ TITLE+= library (core)
++ DEPENDS+= +glib2 +libpthread +libxml2
++ HIDDEN:=1
++endef
++
++define Package/libgstreamer1/description
++ $(call Package/gstreamer1/description/Default)
++ .
++ This package contains the GStreamer core library.
++endef
++
++
++GST_VERSION:=1.0
++
++CONFIGURE_ARGS += \
++ --enable-static \
++ --disable-examples \
++ --disable-tests \
++ --disable-valgrind \
++ --without-libiconv-prefix \
++ --without-libintl-prefix \
++ --without-x \
++
++EXTRA_LDFLAGS+= \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
++ $(if $(ICONV_FULL),-liconv)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/gstreamer-$(GST_VERSION)
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/include/gstreamer-$(GST_VERSION)/* \
++ $(1)/usr/include/gstreamer-$(GST_VERSION)/ \
++ )
++ $(INSTALL_DIR) $(1)/usr/lib
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/libgst*-$(GST_VERSION).{a,la,so*} \
++ $(1)/usr/lib/ \
++ )
++ $(INSTALL_DIR) $(1)/usr/lib/gstreamer-$(GST_VERSION)
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/gstreamer-$(GST_VERSION)/libgst*.{la,so} \
++ $(1)/usr/lib/gstreamer-$(GST_VERSION)/ \
++ )
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/pkgconfig/gstreamer*-$(GST_VERSION).pc \
++ $(1)/usr/lib/pkgconfig/ \
++ )
++ $(INSTALL_DIR) $(2)/share/aclocal
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/share/aclocal/* \
++ $(2)/share/aclocal/ \
++ )
++endef
++
++define Package/gstreamer1/install
++ true
++endef
++
++define Package/gstreamer1-libs/install
++ true
++endef
++
++define Package/gstreamer1-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/bin/gst-launch* \
++ ./usr/bin/gst-inspect* \
++ ./usr/bin/gst-typefind* \
++ $(1)/usr/bin/ \
++ )
++endef
++
++define Package/libgstreamer1/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/libgstbase-$(GST_VERSION).so.* \
++ ./usr/lib/libgstreamer-$(GST_VERSION).so.* \
++ $(1)/usr/lib/ \
++ )
++ $(INSTALL_DIR) $(1)/usr/lib/gstreamer-$(GST_VERSION)
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/gstreamer-$(GST_VERSION)/libgst*.so \
++ $(1)/usr/lib/gstreamer-$(GST_VERSION)/ \
++ )
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/gstreamer-$(GST_VERSION)/gst-plugin-scanner \
++ $(1)/usr/lib/gstreamer-$(GST_VERSION)
++endef
++
++
++# 1: short name
++# 2: description
++# 3: dependencies on other gstreamer libraries (short name)
++# 4: dependencies on other packages
++define GstBuildLibrary
++
++ define Package/libgst1$(1)
++ $(call Package/gstreamer1/Default)
++ TITLE+= $(2) library (core)
++ DEPENDS+= +libgstreamer1 $$(foreach p,$(3),+libgst1$$(p)) $(4)
++ HIDDEN:=1
++ endef
++
++ define Package/libgst1$(1)/description
++ $(call Package/gstreamer1/description/Default)
++ .
++ This package contains the GStreamer $(2) library.
++ endef
++
++ define Package/libgst1$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/libgst$(1)-$(GST_VERSION).so.* \
++ $$(1)/usr/lib/ \
++ )
++ endef
++
++ $$(eval $$(call BuildPackage,libgst1$(1)))
++endef
++
++$(eval $(call GstBuildLibrary,check,check unit testing))
++$(eval $(call GstBuildLibrary,controller,dynamic parameter control))
++$(eval $(call GstBuildLibrary,net,network classes))
++
++$(eval $(call BuildPackage,libgstreamer1))
++$(eval $(call BuildPackage,gstreamer1-libs))
++$(eval $(call BuildPackage,gstreamer1-utils))
++$(eval $(call BuildPackage,gstreamer1))
+diff --git a/feeds/packages/multimedia/gstreamer1/patches/001-no_docs.patch b/feeds/packages/multimedia/gstreamer1/patches/001-no_docs.patch
+new file mode 100644
+index 0000000..fb0e034
+--- /dev/null
++++ b/feeds/packages/multimedia/gstreamer1/patches/001-no_docs.patch
+@@ -0,0 +1,35 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -8,7 +8,6 @@ aclocal_DATA = gst-element-check-@GST_AP
++
++ SUBDIRS = pkgconfig \
++ gst libs plugins tests \
++- docs \
++ po \
++ m4 \
++ common
++@@ -20,7 +19,6 @@ endif
++ # These are all the possible subdirs
++ DIST_SUBDIRS = pkgconfig \
++ gst libs plugins tools tests \
++- docs \
++ po \
++ m4 \
++ common
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -554,13 +554,12 @@ top_srcdir = @top_srcdir@
++ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-docbook
++ aclocaldir = $(datadir)/aclocal
++ aclocal_DATA = gst-element-check-@GST_API_VERSION@.m4
++-SUBDIRS = pkgconfig gst libs plugins tests docs po m4 common \
+++SUBDIRS = pkgconfig gst libs plugins tests po m4 common \
++ $(am__append_1)
++
++ # These are all the possible subdirs
++ DIST_SUBDIRS = pkgconfig \
++ gst libs plugins tools tests \
++- docs \
++ po \
++ m4 \
++ common
+diff --git a/feeds/packages/multimedia/gstreamer1/patches/002-no_tests.patch b/feeds/packages/multimedia/gstreamer1/patches/002-no_tests.patch
+new file mode 100644
+index 0000000..384dd0a
+--- /dev/null
++++ b/feeds/packages/multimedia/gstreamer1/patches/002-no_tests.patch
+@@ -0,0 +1,37 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -7,7 +7,7 @@ aclocaldir = $(datadir)/aclocal
++ aclocal_DATA = gst-element-check-@GST_API_VERSION@.m4
++
++ SUBDIRS = pkgconfig \
++- gst libs plugins tests \
+++ gst libs plugins \
++ po \
++ m4 \
++ common
++@@ -18,7 +18,7 @@ endif
++
++ # These are all the possible subdirs
++ DIST_SUBDIRS = pkgconfig \
++- gst libs plugins tools tests \
+++ gst libs plugins tools \
++ po \
++ m4 \
++ common
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -554,12 +554,12 @@ top_srcdir = @top_srcdir@
++ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-docbook
++ aclocaldir = $(datadir)/aclocal
++ aclocal_DATA = gst-element-check-@GST_API_VERSION@.m4
++-SUBDIRS = pkgconfig gst libs plugins tests po m4 common \
+++SUBDIRS = pkgconfig gst libs plugins po m4 common \
++ $(am__append_1)
++
++ # These are all the possible subdirs
++ DIST_SUBDIRS = pkgconfig \
++- gst libs plugins tools tests \
+++ gst libs plugins tools \
++ po \
++ m4 \
++ common
+diff --git a/feeds/packages/multimedia/gstreamer1/patches/003-no_translations.patch b/feeds/packages/multimedia/gstreamer1/patches/003-no_translations.patch
+new file mode 100644
+index 0000000..7e918dd
+--- /dev/null
++++ b/feeds/packages/multimedia/gstreamer1/patches/003-no_translations.patch
+@@ -0,0 +1,45 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -780,7 +780,6 @@ libs/gst/helpers/Makefile
++ libs/gst/net/Makefile
++ plugins/Makefile
++ plugins/elements/Makefile
++-po/Makefile.in
++ tests/Makefile
++ tests/benchmarks/Makefile
++ tests/check/Makefile
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -8,7 +8,6 @@ aclocal_DATA = gst-element-check-@GST_AP
++
++ SUBDIRS = pkgconfig \
++ gst libs plugins \
++- po \
++ m4 \
++ common
++
++@@ -19,7 +18,6 @@ endif
++ # These are all the possible subdirs
++ DIST_SUBDIRS = pkgconfig \
++ gst libs plugins tools \
++- po \
++ m4 \
++ common
++
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -554,13 +554,12 @@ top_srcdir = @top_srcdir@
++ DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-docbook
++ aclocaldir = $(datadir)/aclocal
++ aclocal_DATA = gst-element-check-@GST_API_VERSION@.m4
++-SUBDIRS = pkgconfig gst libs plugins po m4 common \
+++SUBDIRS = pkgconfig gst libs plugins m4 common \
++ $(am__append_1)
++
++ # These are all the possible subdirs
++ DIST_SUBDIRS = pkgconfig \
++ gst libs plugins tools \
++- po \
++ m4 \
++ common
++
+diff --git a/feeds/packages/multimedia/gstreamer1/patches/010-gstplugin_use_lazy_symbol_binding.patch b/feeds/packages/multimedia/gstreamer1/patches/010-gstplugin_use_lazy_symbol_binding.patch
+new file mode 100644
+index 0000000..603e57c
+--- /dev/null
++++ b/feeds/packages/multimedia/gstreamer1/patches/010-gstplugin_use_lazy_symbol_binding.patch
+@@ -0,0 +1,20 @@
++--- a/gst/gstplugin.c
+++++ b/gst/gstplugin.c
++@@ -723,15 +723,8 @@ gst_plugin_load_file (const gchar * file
++ goto return_error;
++ }
++
++- flags = G_MODULE_BIND_LOCAL;
++- /* libgstpython.so is the gst-python plugin loader. It needs to be loaded with
++- * G_MODULE_BIND_LAZY.
++- *
++- * Ideally there should be a generic way for plugins to specify that they
++- * need to be loaded with _LAZY.
++- * */
++- if (strstr (filename, "libgstpython"))
++- flags |= G_MODULE_BIND_LAZY;
+++ // No need to resolve all bindings until referenced
+++ flags = G_MODULE_BIND_LOCAL | G_MODULE_BIND_LAZY;
++
++ module = g_module_open (filename, flags);
++ if (module == NULL) {
+diff --git a/feeds/packages/multimedia/icecast/Makefile b/feeds/packages/multimedia/icecast/Makefile
+new file mode 100644
+index 0000000..1b0766e
+--- /dev/null
++++ b/feeds/packages/multimedia/icecast/Makefile
+@@ -0,0 +1,95 @@
++#
++# Copyright (C) 2006-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=icecast
++PKG_VERSION:=2.4.2
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0
++PKG_MAINTAINER:=André Gaul <andre@gaul.io>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.xiph.org/releases/icecast/
++PKG_MD5SUM:=55947c83d31dfcbbede58c9521c676f4
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++TREMOR_BUILD_DIR=$(PKG_BUILD_DIR)/libvorbisidec-1.2.0-dave
++TREMOR_DIR=$(TREMOR_BUILD_DIR)/ipkg-install/usr
++
++define Package/icecast
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ DEPENDS:=+libcurl +libxml2 +libxslt +libogg +libopenssl
++ TITLE:=A streaming media server for Ogg/Vorbis and MP3 audio streams
++ URL:=http://www.icecast.org/
++endef
++
++define Package/icecast/description
++ Icecast is a streaming media server which currently supports Ogg
++ Vorbis and MP3 audio streams. It can be used to create an Internet
++ radio station or a privately running jukebox and many things in
++ between. It is very versatile in that new formats can be added
++ relatively easily and supports open standards for commuincation and
++ interaction.
++endef
++
++define Build/Prepare
++ $(Build/Prepare/Default)
++ $(SUBMAKE) -f libvorbisidec.mk \
++ BUILD_DIR="$(PKG_BUILD_DIR)" \
++ V=99 \
++ prepare
++endef
++
++define Build/Configure
++ $(MAKE) -f libvorbisidec.mk \
++ BUILD_DIR="$(PKG_BUILD_DIR)" \
++ V=99 \
++ compile
++ $(SED) 's,-lvorbis ,$(TREMOR_DIR)/lib/libvorbisidec.a -logg ,g' $(PKG_BUILD_DIR)/configure
++ $(call Build/Configure/Default, \
++ --enable-yp \
++ --with-curl="yes" \
++ --with-curl-config="$(STAGING_DIR)/usr/bin/curl-config" \
++ --with-ogg="$(STAGING_DIR)/usr" \
++ --with-speex="no" \
++ --with-theora="no" \
++ --with-vorbis="$(TREMOR_DIR)" \
++ --with-xslt-config="$(STAGING_DIR)/usr/bin/xslt-config" \
++ , \
++ CPPFLAGS="-I$(TREMOR_DIR)/include -I$(STAGING_DIR)/usr/include/libxml2 $(TARGET_CPPFLAGS)" \
++ )
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ INCLUDES="-I$(PKG_BUILD_DIR)/src -I$(TREMOR_DIR)/include" \
++ all install
++endef
++
++define Package/icecast/install
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_INSTALL_DIR)/etc/icecast.xml $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/icecast.init $(1)/etc/init.d/icecast
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/icecast $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/share/icecast
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/icecast/admin $(1)/usr/share/icecast/
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/icecast/web $(1)/usr/share/icecast/
++endef
++
++define Package/icecast/conffiles
++/etc/icecast.xml
++endef
++
++$(eval $(call BuildPackage,icecast))
+diff --git a/feeds/packages/multimedia/icecast/files/icecast.init b/feeds/packages/multimedia/icecast/files/icecast.init
+new file mode 100755
+index 0000000..355e4b7
+--- /dev/null
++++ b/feeds/packages/multimedia/icecast/files/icecast.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Example script
++# Copyright (C) 2014 OpenWrt.org
++
++USE_PROCD=1
++START=99
++STOP=15
++
++start_service() {
++ procd_open_instance
++ procd_set_param command /usr/bin/icecast -c /etc/icecast.xml
++ procd_set_param respawn
++ procd_close_instance
++}
+diff --git a/feeds/packages/multimedia/icecast/libvorbisidec.mk b/feeds/packages/multimedia/icecast/libvorbisidec.mk
+new file mode 100644
+index 0000000..eda6e76
+--- /dev/null
++++ b/feeds/packages/multimedia/icecast/libvorbisidec.mk
+@@ -0,0 +1,41 @@
++#
++# Copyright (C) 2006 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=icecast-libvorbisidec
++PKG_VERSION:=1.2.0-dave
++PKG_RELEASE:=1
++
++PKG_SOURCE:=libvorbisidec-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://users.tpg.com.au/davico/openwrt/
++PKG_MD5SUM:=cb8e51aab92ef164f8e0e8853f7164fa
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/libvorbisidec-$(PKG_VERSION)
++PKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install
++PATCH_DIR=./patches-libvorbisidec
++
++include $(INCLUDE_DIR)/package.mk
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --disable-shared \
++ --enable-static \
++ )
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install
++endef
++
++define Build/InstallDev
++ true
++endef
++
++$(eval $(call Build/DefaultTargets))
+diff --git a/feeds/packages/multimedia/icecast/patches/001-icecast-2.4.0-tremor.patch b/feeds/packages/multimedia/icecast/patches/001-icecast-2.4.0-tremor.patch
+new file mode 100644
+index 0000000..6fa6f08
+--- /dev/null
++++ b/feeds/packages/multimedia/icecast/patches/001-icecast-2.4.0-tremor.patch
+@@ -0,0 +1,155 @@
++--- a/src/format_flac.c
+++++ b/src/format_flac.c
++@@ -18,7 +18,7 @@
++ #endif
++
++ #include <stdlib.h>
++-#include <ogg/ogg.h>
+++#include <tremor/ogg.h>
++ #include <string.h>
++
++ typedef struct source_tag source_t;
++--- a/src/format_midi.c
+++++ b/src/format_midi.c
++@@ -18,7 +18,7 @@
++ #endif
++
++ #include <stdlib.h>
++-#include <ogg/ogg.h>
+++#include <tremor/ogg.h>
++ #include <string.h>
++
++ typedef struct source_tag source_t;
++--- a/src/format_ogg.c
+++++ b/src/format_ogg.c
++@@ -24,7 +24,7 @@
++ #include <stdlib.h>
++ #include <string.h>
++
++-#include <ogg/ogg.h>
+++#include <tremor/ogg.h>
++
++ #include "refbuf.h"
++ #include "source.h"
++--- a/src/format_ogg.h
+++++ b/src/format_ogg.h
++@@ -18,7 +18,7 @@
++ #ifndef __FORMAT_OGG_H__
++ #define __FORMAT_OGG_H__
++
++-#include <ogg/ogg.h>
+++#include <tremor/ogg.h>
++ #include "refbuf.h"
++ #include "format.h"
++
++--- a/src/format_speex.c
+++++ b/src/format_speex.c
++@@ -18,7 +18,7 @@
++ #endif
++
++ #include <stdlib.h>
++-#include <ogg/ogg.h>
+++#include <tremor/ogg.h>
++ #include <speex/speex_header.h>
++
++ typedef struct source_tag source_t;
++--- a/src/format_theora.c
+++++ b/src/format_theora.c
++@@ -18,7 +18,7 @@
++ #endif
++
++ #include <stdlib.h>
++-#include <ogg/ogg.h>
+++#include <tremor/ogg.h>
++ #include <theora/theora.h>
++
++ typedef struct source_tag source_t;
++--- a/src/format_vorbis.c
+++++ b/src/format_vorbis.c
++@@ -18,8 +18,8 @@
++ #endif
++
++ #include <stdlib.h>
++-#include <ogg/ogg.h>
++-#include <vorbis/codec.h>
+++#include <tremor/ogg.h>
+++#include <tremor/ivorbiscodec.h>
++ #include <memory.h>
++ #include <string.h>
++
++--- a/src/source.c
+++++ b/src/source.c
++@@ -19,7 +19,7 @@
++ #include <stdlib.h>
++ #include <string.h>
++ #include <sys/types.h>
++-#include <ogg/ogg.h>
+++#include <tremor/ogg.h>
++ #include <errno.h>
++
++ #ifndef _WIN32
++--- a/src/format_kate.c
+++++ b/src/format_kate.c
++@@ -19,7 +19,7 @@
++
++ #include <stdlib.h>
++ #include <string.h>
++-#include <ogg/ogg.h>
+++#include <tremor/ogg.h>
++ #ifdef HAVE_KATE
++ #include <kate/oggkate.h>
++ #endif
++--- a/m4/vorbis.m4
+++++ b/m4/vorbis.m4
++@@ -38,9 +38,9 @@ if test "x$vorbis_prefix" != "x$ogg_pref
++ ])
++ fi
++
++-VORBIS_LIBS="-lvorbis"
++-VORBISFILE_LIBS="-lvorbisfile"
++-VORBISENC_LIBS="-lvorbisenc"
+++VORBIS_LIBS="-lvorbisidec"
+++VORBISFILE_LIBS="-lvorbisidec"
+++VORBISENC_LIBS="-lvorbisidec"
++
++ xt_save_LIBS="$LIBS"
++ xt_save_LDFLAGS="$LDFLAGS"
++@@ -58,18 +58,6 @@ AC_TRY_LINK_FUNC(ogg_stream_init, [xt_li
++ )
++ ])
++
++-if test "x$xt_lib_vorbis" = "xok"; then
++-#
++-# Now check if the installed Vorbis is sufficiently new.
++-#
++-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
++-#include <vorbis/codec.h>
++-#include <vorbis/vorbisenc.h>
++- ], [
++-struct ovectl_ratemanage_arg a;
++-])],,[xt_lib_vorbis="old version found"])
++-AC_MSG_RESULT([$xt_lib_vorbis])
++-fi
++ CPPFLAGS="$xt_save_CPPFLAGS"
++ LIBS="$xt_save_LIBS"
++ LDFLAGS="$xt_save_LDFLAGS"
++--- a/m4/ogg.m4
+++++ b/m4/ogg.m4
++@@ -29,7 +29,7 @@ XIPH_GCC_WARNING([-I$ogg_prefix/include]
++ ])
++ AC_CACHE_CHECK([for libogg], xt_cv_lib_ogg,
++ [dnl
++-OGG_LIBS="-logg"
+++OGG_LIBS="-lvorbisidec"
++
++ #
++ # check if the installed Ogg is sufficiently new.
++@@ -42,7 +42,7 @@ LIBS="$LIBS $OGG_LIBS"
++ LDFLAGS="$LDFLAGS $OGG_LDFLAGS"
++ AC_TRY_LINK_FUNC(ogg_sync_init,
++ [ xt_cv_lib_ogg=ok ],
++- [ AC_TRY_LINK([#include <ogg/ogg.h>],,
+++ [ AC_TRY_LINK([#include <tremor/ogg.h>],,
++ [ xt_cv_lib_ogg="pre v1.0, needs updating" ],
++ [ xt_cv_lib_ogg="not found" ])
++ ])
+diff --git a/feeds/packages/multimedia/icecast/patches/010-fix_libcurl_test_crap.patch b/feeds/packages/multimedia/icecast/patches/010-fix_libcurl_test_crap.patch
+new file mode 100644
+index 0000000..8da6e33
+--- /dev/null
++++ b/feeds/packages/multimedia/icecast/patches/010-fix_libcurl_test_crap.patch
+@@ -0,0 +1,11 @@
++--- a/m4/xiph_curl.m4
+++++ b/m4/xiph_curl.m4
++@@ -52,7 +52,7 @@ AC_CHECK_HEADERS([curl/curl.h],, curl_ok
++ AC_MSG_CHECKING(for libcurl)
++ if test "$curl_ok" = "yes"
++ then
++- AC_RUN_IFELSE(AC_LANG_SOURCE([
+++ AC_COMPILE_IFELSE(AC_LANG_SOURCE([
++ #include <curl/curl.h>
++ int main()
++ {
+diff --git a/feeds/packages/multimedia/ices/Makefile b/feeds/packages/multimedia/ices/Makefile
+new file mode 100644
+index 0000000..a3cb714
+--- /dev/null
++++ b/feeds/packages/multimedia/ices/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++# Copyright (C) 2009 Freifunk Leipzig
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ices
++PKG_VERSION:=2.0.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://downloads.xiph.org/releases/ices/
++PKG_MD5SUM:=832c448cc993170a70fd95804fcda5b2
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ices
++ SECTION:=sound
++ CATEGORY:=Sound
++ TITLE:=ices client for Icecast media streaming servers
++ URL:=http://www.icecast.org/ices/
++ DEPENDS:=+libshout +libxml2 +zlib +libogg +libvorbis +alsa-lib
++endef
++
++define Package/ices/description
++ ices is a command line source client for Icecast media streaming servers.
++ It began as the successor of the old "shout" utility, and has since gained a
++ lot of useful features.
++endef
++
++CONFIGURE_ARGS+= \
++ --with-ogg="$(STAGING_DIR)/usr/include" \
++ --with-vorbis="$(STAGING_DIR)/usr/include" \
++
++define Package/ices/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/ices $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,ices))
+diff --git a/feeds/packages/multimedia/lcdgrilo/Makefile b/feeds/packages/multimedia/lcdgrilo/Makefile
+new file mode 100644
+index 0000000..53888d1
+--- /dev/null
++++ b/feeds/packages/multimedia/lcdgrilo/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lcdgrilo
++PKG_VERSION:=0.0.7
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.flyn.org/projects/lcdgrilo
++PKG_MD5SUM:=80a946bf144da5cc32bdf9f1aa2f91e6
++PKG_BUILD_DEPENDS:=+vala
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/lcdgrilo
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ DEPENDS:=+grilo +grilo-plugins +libgee +libgstreamer1
++ TITLE:=lcdgrilo
++ URL:=http://www.flyn.org/projects/lcdgrilo/
++endef
++
++define Package/lcdgrilo/decription
++ A simple Grilo-based audio player meant to run on a Raspberry Pi with a PiFace CAD
++endef
++
++define Package/lcdgrilo/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/bin/lcdgrilo \
++ $(1)/usr/bin/
++ $(INSTALL_BIN) ./files/lcdgrilo.init $(1)/etc/init.d/lcdgrilo
++endef
++
++$(eval $(call BuildPackage,lcdgrilo))
+diff --git a/feeds/packages/multimedia/lcdgrilo/files/lcdgrilo.init b/feeds/packages/multimedia/lcdgrilo/files/lcdgrilo.init
+new file mode 100644
+index 0000000..5c4ff1b
+--- /dev/null
++++ b/feeds/packages/multimedia/lcdgrilo/files/lcdgrilo.init
+@@ -0,0 +1,16 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2012 OpenWrt.org
++
++START=60
++
++start() {
++ /usr/bin/lcdgrilo &
++ echo $! > /var/run/lcdgrilo.pid
++}
++
++stop() {
++ if [ ! -f /var/run/lcdgrilo.pid ]; then
++ return
++ fi
++ /bin/kill `cat /var/run/lcdgrilo.pid`
++}
+diff --git a/feeds/packages/multimedia/minidlna/Makefile b/feeds/packages/multimedia/minidlna/Makefile
+new file mode 100644
+index 0000000..75fa398
+--- /dev/null
++++ b/feeds/packages/multimedia/minidlna/Makefile
+@@ -0,0 +1,85 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=minidlna
++PKG_VERSION:=1.1.4
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/minidlna
++PKG_MD5SUM:=67c9e91285bc3801fd91a5d26ea775d7
++PKG_LICENSE:=GPL-2.0 BSD-3-Clause
++PKG_LICENSE_FILES:=COPYING LICENCE.miniupnpd
++
++PKG_MAINTAINER:=Knyazkov Dmitry <medavedik@gmail.com>
++
++PKG_BUILD_PARALLEL:=0
++PKG_BUILD_DEPENDS:=util-linux
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/minidlna
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ TITLE:=UPnP A/V & DLNA Media Server
++ URL:=http://minidlna.sourceforge.net/
++ DEPENDS:= +libpthread +libexif +libjpeg +libsqlite3 +libffmpeg \
++ +libid3tag +libflac +libvorbis +libuuid \
++ $(ICONV_DEPENDS) $(INTL_DEPENDS)
++endef
++
++define Package/minidlna/description
++ MiniDLNA (aka ReadyDLNA) is server software with the aim of
++ being fully compliant with DLNA/UPnP-AV clients.
++endef
++
++define Package/minidlna/conffiles
++/etc/config/minidlna
++endef
++
++TARGET_CPPFLAGS += \
++ -I$(STAGING_DIR)/usr/include \
++ -I$(STAGING_DIR)/usr/include/FLAC \
++ -I$(STAGING_DIR)/usr/include/libexif \
++ -I$(STAGING_DIR)/usr/include/uuid \
++ -I$(STAGING_DIR)/usr/include/vorbis \
++ -I$(ICONV_PREFIX)/include \
++ -I$(INTL_PREFIX)/include \
++ -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 \
++
++TARGET_LDFLAGS += \
++ -L$(ICONV_PREFIX)/lib \
++ -L$(INTL_PREFIX)/lib \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
++
++MAKE_FLAGS +=\
++ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ ICONV_LIBS="-liconv $(if $(INTL_FULL),-lintl)" \
++
++CONFIGURE_ARGS +=\
++ --with-libiconv-prefix="$(ICONV_PREFIX)" \
++ --with-libintl-prefix="$(INTL_PREFIX)" \
++ --with-os-name="OpenWrt Linux" \
++ --with-os-version="$(LINUX_VERSION)" \
++ --with-os-url="http://openwrt.org/" \
++ --with-db-path="/var/run/minidlna" \
++ --with-log-path="/var/log" \
++
++define Package/minidlna/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/minidlnad $(1)/usr/bin/minidlna
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/minidlna.init $(1)/etc/init.d/minidlna
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/minidlna.config $(1)/etc/config/minidlna
++endef
++
++$(eval $(call BuildPackage,minidlna))
+diff --git a/feeds/packages/multimedia/minidlna/files/minidlna.config b/feeds/packages/multimedia/minidlna/files/minidlna.config
+new file mode 100644
+index 0000000..91a5cc3
+--- /dev/null
++++ b/feeds/packages/multimedia/minidlna/files/minidlna.config
+@@ -0,0 +1,17 @@
++config minidlna config
++ option 'enabled' '1'
++ option port '8200'
++ option interface 'br-lan'
++ option friendly_name 'OpenWrt DLNA Server'
++ option db_dir '/var/run/minidlna'
++ option log_dir '/var/log'
++ option inotify '1'
++ option enable_tivo '0'
++ option strict_dlna '0'
++ option presentation_url ''
++ option notify_interval '900'
++ option serial '12345678'
++ option model_number '1'
++ option root_container '.'
++ list media_dir '/mnt'
++ option album_art_names 'Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg'
+diff --git a/feeds/packages/multimedia/minidlna/files/minidlna.init b/feeds/packages/multimedia/minidlna/files/minidlna.init
+new file mode 100644
+index 0000000..a92a064
+--- /dev/null
++++ b/feeds/packages/multimedia/minidlna/files/minidlna.init
+@@ -0,0 +1,97 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2010 OpenWrt.org
++
++START=50
++
++SERVICE_USE_PID=1
++SERVICE_PID_FILE=/var/run/minidlna/minidlna.pid
++
++MINIDLNA_CONFIG_FILE="/tmp/minidlna.conf"
++
++minidlna_cfg_append() {
++ echo "$1" >> "$MINIDLNA_CONFIG_FILE"
++}
++
++minidlna_cfg_addbool() {
++ local cfg="$1"
++ local key="$2"
++ local def="$3"
++ local val
++
++ config_get_bool val "$cfg" "$key" "$def"
++ [ "$val" -gt 0 ] && val="yes" || val="no"
++ minidlna_cfg_append "$key=$val"
++}
++
++minidlna_cfg_addstr() {
++ local cfg="$1"
++ local key="$2"
++ local def="$3"
++ local val
++
++ config_get val "$cfg" "$key" "$def"
++ [ -n "$val" ] && minidlna_cfg_append "$key=$val"
++}
++
++minidlna_cfg_add_media_dir() {
++ local val=$1
++
++ minidlna_cfg_append "media_dir=$val"
++}
++
++minidlna_create_config() {
++ local cfg=$1
++ local port
++ local interface
++
++ config_get port $cfg port
++ config_get interface $cfg interface
++
++ [ -z "$interface" -o -t "$port" ] && return 1
++
++ echo "# this file is generated automatically, don't edit" > "$MINIDLNA_CONFIG_FILE"
++
++ minidlna_cfg_append "port=$port"
++ minidlna_cfg_append "network_interface=$interface"
++
++ minidlna_cfg_addstr $cfg friendly_name
++ minidlna_cfg_addstr $cfg db_dir
++ minidlna_cfg_addstr $cfg log_dir
++ minidlna_cfg_addbool $cfg inotify '1'
++ minidlna_cfg_addbool $cfg enable_tivo '0'
++ minidlna_cfg_addbool $cfg strict_dlna '0'
++ minidlna_cfg_addstr $cfg album_art_names
++ minidlna_cfg_addstr $cfg presentation_url
++ minidlna_cfg_addstr $cfg notify_interval '900'
++ minidlna_cfg_addstr $cfg serial '12345678'
++ minidlna_cfg_addstr $cfg model_number '1'
++ minidlna_cfg_addstr $cfg minissdpsocket
++ minidlna_cfg_addstr $cfg root_container '.'
++ config_list_foreach "$cfg" "media_dir" minidlna_cfg_add_media_dir
++
++ return 0
++}
++
++start() {
++ local enabled
++ local db_dir
++ local log_dir
++
++ config_load 'minidlna'
++ config_get_bool enabled config 'enabled' '0'
++
++ [ "$enabled" -gt 0 ] || return 1
++
++ minidlna_create_config config || return 1
++
++ config_get db_dir config 'db_dir' '/var/run/minidlna'
++ config_get log_dir config 'log_dir' '/var/log'
++
++ mkdir -m 0755 -p $db_dir
++ mkdir -m 0755 -p $log_dir
++ service_start /usr/bin/minidlna -f "$MINIDLNA_CONFIG_FILE"
++}
++
++stop() {
++ service_stop /usr/bin/minidlna
++}
+diff --git a/feeds/packages/multimedia/minidlna/patches/010-libav-fix.patch b/feeds/packages/multimedia/minidlna/patches/010-libav-fix.patch
+new file mode 100644
+index 0000000..5924599
+--- /dev/null
++++ b/feeds/packages/multimedia/minidlna/patches/010-libav-fix.patch
+@@ -0,0 +1,19 @@
++--- a/libav.h
+++++ b/libav.h
++@@ -167,7 +167,7 @@
++ static inline int
++ lav_is_thumbnail_stream(AVStream *s, uint8_t **data, int *size)
++ {
++-#if LIBAVFORMAT_VERSION_INT >= ((54<<16)+(6<<8))
+++/*if LIBAVFORMAT_VERSION_INT >= ((54<<16)+(6<<8))
++ if (s->disposition & AV_DISPOSITION_ATTACHED_PIC &&
++ s->codec->codec_id == AV_CODEC_ID_MJPEG)
++ {
++@@ -177,6 +177,6 @@
++ *size = s->attached_pic.size;
++ return 1;
++ }
++-#endif
+++endif*/
++ return 0;
++ }
+diff --git a/feeds/packages/multimedia/mjpg-streamer/Config.in b/feeds/packages/multimedia/mjpg-streamer/Config.in
+new file mode 100644
+index 0000000..4a29ba9
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/Config.in
+@@ -0,0 +1,36 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++
++if PACKAGE_mjpg-streamer
++
++config MJPG_STREAMER_V4L2
++ bool "Compile input_uvc with libv4l2 (camera controls)"
++ default n
++ select PACKAGE_libv4l
++
++config MJPG_STREAMER_INPUT_FILE
++ bool "Install input file plugin"
++ default n
++
++config MJPG_STREAMER_INPUT_UVC
++ bool "Install input uvc plugin"
++ default y
++
++config MJPG_STREAMER_INPUT_TESTPICTURE
++ bool "Install input testpicture plugin"
++ default n
++
++config MJPG_STREAMER_OUTPUT_FILE
++ bool "Install output file plugin"
++ default n
++
++config MJPG_STREAMER_OUTPUT_HTTP
++ bool "Install output http plugin"
++ default y
++
++config MJPG_STREAMER_WWW
++ bool "Install complete Web UI files (includes cambozola)"
++ default n
++
++endif
+diff --git a/feeds/packages/multimedia/mjpg-streamer/Makefile b/feeds/packages/multimedia/mjpg-streamer/Makefile
+new file mode 100644
+index 0000000..cae661a
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/Makefile
+@@ -0,0 +1,112 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mjpg-streamer
++PKG_REV:=182
++PKG_VERSION:=r$(PKG_REV)
++PKG_RELEASE:=7
++PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).1.tar.bz2
++PKG_SOURCE_URL:=https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer-experimental
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_PROTO:=svn
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE
++
++include $(INCLUDE_DIR)/package.mk
++
++PKG_BUILD_DEPENDS:=MJPG_STREAMER_V4L2:libv4l
++
++define Package/mjpg-streamer
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ TITLE:=MJPG-streamer
++ DEPENDS:=+libpthread +libjpeg +MJPG_STREAMER_V4L2:libv4l
++ URL:=http://mjpg-streamer.wiki.sourceforge.net/
++ MENU:=1
++endef
++
++define Package/mjpg-streamer/description
++ Streaming application for Linux-UVC compatible webcams
++endef
++
++define Package/mjpg-streamer/config
++ source "$(SOURCE)/Config.in"
++endef
++
++EXTRA_CFLAGS += $(TARGET_CPPFLAGS) $(TARGET_LDFLAGS)
++
++define Package/mjpg-streamer/conffiles
++/etc/config/mjpg-streamer
++endef
++
++CAMBOZOLA:=cambozola-0.936.tar.gz
++
++# Distribution URL doesn't always have the correct version
++# Using the OpenWrt mirror provides a stable version
++# orig-URL:=http://www.andywilcock.com/code/cambozola
++define Download/cambozola
++ URL:=http://mirror2.openwrt.org/sources
++ FILE:=$(CAMBOZOLA)
++ MD5SUM:=35c45188aa9635aef2b745c35c311396
++endef
++
++# Fetch latest cambozola that works with latest Java(s)
++# Yes, I know this is ugly
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ ifeq ($(CONFIG_MJPG_STREAMER_WWW),y)
++ $(eval $(call Download,cambozola))
++ $(TAR) -xvf $(DL_DIR)/$(CAMBOZOLA) --strip=2 --wildcards \
++ -C $(PKG_BUILD_DIR)/www */dist/cambozola.jar
++ endif
++endef
++
++ifeq ($(CONFIG_MJPG_STREAMER_V4L2),y)
++ TARGET_CFLAGS+= -DUSE_LIBV4L2
++ TARGET_LDFLAGS+= -lv4l2
++endif
++
++define Package/mjpg-streamer/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/mjpg_streamer $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(CP) ./files/mjpg-streamer.config $(1)/etc/config/mjpg-streamer
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/mjpg-streamer.init $(1)/etc/init.d/mjpg-streamer
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/usb
++ $(INSTALL_DATA) ./files/mjpg-streamer.hotplug $(1)/etc/hotplug.d/usb/20-mjpg-streamer
++ $(INSTALL_DIR) $(1)/usr/lib
++ifeq ($(CONFIG_MJPG_STREAMER_INPUT_FILE),y)
++ $(CP) $(PKG_BUILD_DIR)/input_file.so $(1)/usr/lib
++endif
++ifeq ($(CONFIG_MJPG_STREAMER_INPUT_UVC),y)
++ $(CP) $(PKG_BUILD_DIR)/input_uvc.so $(1)/usr/lib
++endif
++ifeq ($(CONFIG_MJPG_STREAMER_INPUT_TESTPICTURE),y)
++ $(CP) $(PKG_BUILD_DIR)/input_testpicture.so $(1)/usr/lib
++endif
++ifeq ($(CONFIG_MJPG_STREAMER_OUTPUT_FILE),y)
++ $(CP) $(PKG_BUILD_DIR)/output_file.so $(1)/usr/lib
++endif
++ifeq ($(CONFIG_MJPG_STREAMER_OUTPUT_HTTP),y)
++ $(CP) $(PKG_BUILD_DIR)/output_http.so $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/www/webcam
++ ifeq ($(CONFIG_MJPG_STREAMER_WWW),y)
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/www/* $(1)/www/webcam
++ else
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/www/stream_simple.html $(1)/www/webcam/index.html
++ endif
++endif
++endef
++
++$(eval $(call BuildPackage,mjpg-streamer))
+diff --git a/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.config b/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.config
+new file mode 100644
+index 0000000..a40d787
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.config
+@@ -0,0 +1,15 @@
++
++config mjpg-streamer 'core'
++ option enabled '0'
++ option input 'uvc'
++ option output 'http'
++ option device '/dev/video0'
++ option resolution '640x480'
++ option yuv '0'
++ option quality '80'
++ option fps '5'
++ option led 'auto'
++ option www '/www/webcam'
++ option port '8080'
++ option username 'openwrt'
++ option password 'openwrt'
+diff --git a/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.hotplug b/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.hotplug
+new file mode 100644
+index 0000000..1443b17
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.hotplug
+@@ -0,0 +1,10 @@
++case "$ACTION" in
++ add)
++ # start process
++ /etc/init.d/mjpg-streamer start
++ ;;
++ remove)
++ # stop process
++ /etc/init.d/mjpg-streamer stop
++ ;;
++esac
+diff --git a/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.init b/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.init
+new file mode 100644
+index 0000000..06630d4
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.init
+@@ -0,0 +1,97 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2014 OpenWrt.org
++
++START=90
++STOP=10
++
++USE_PROCD=1
++PROG=/usr/bin/mjpg_streamer
++
++error() {
++ echo "${initscript}:" "$@" 1>&2
++}
++
++start_instance() {
++ local s="$1"
++
++ config_get_bool enabled "$1" 'enabled' 0
++ [ $enabled -eq 0 ] && return
++
++ config_get input "$s" 'input'
++ if [ -z "$input" ]; then
++ error "in section '$s' option input is missing"
++ return 1
++ fi
++
++ config_get output "$s" 'output'
++ if [ -z "$output" ]; then
++ error "in section '$s' option output is missing"
++ return 1
++ fi
++
++ local input_arg
++ if [ "x$input" = 'xuvc' ]; then
++ input_arg="input_uvc.so"
++
++ config_get device "$s" 'device'
++ if [ ! -c "$device" ]; then
++ error "device '$device' does not exist"
++ return 1
++ fi
++ input_arg="${input_arg} --device $device"
++
++ config_get fps "$s" 'fps'
++ [ -n "$fps" ] && input_arg="${input_arg} --fps $fps"
++
++ config_get_bool yuv "$s" 'yuv' 0
++ if [ $yuv -ne 0 ]; then
++ input_arg="${input_arg} --yuv"
++ config_get quality "$s" 'quality'
++ [ -n "$quality" ] && input_arg="${input_arg} --quality $quality"
++ fi
++
++ config_get resolution "$s" 'resolution'
++ [ -n "$resolution" ] && input_arg="${input_arg} --resolution $resolution"
++
++ config_get led "$s" 'led'
++ [ -n "$led" ] && input_arg="${input_arg} --led $led"
++ fi
++
++ if [ -z "$input_arg" ]; then
++ error "unsuported input option '$input' in section '$s'"
++ return 1
++ fi
++
++ local output_arg
++ if [ "x$output" = 'xhttp' ]; then
++ output_arg="output_http.so"
++
++ config_get port "$s" 'port'
++ [ -n "$port" ] && output_arg="${output_arg} --port $port"
++
++ config_get www "$s" 'www'
++ [ -n "$www" ] && output_arg="${output_arg} --www $www"
++
++ config_get username "$s" 'username'
++ config_get password "$s" 'password'
++ [ -n "$username" ] && [ -n "$password" ] && output_arg="${output_arg} --credentials $username:$password"
++ fi
++
++ if [ -z "$output_arg" ]; then
++ error "unsuported output option '$output' in section '$s'"
++ return 1
++ fi
++
++ procd_open_instance
++ procd_set_param command "$PROG" --input "$input_arg" --output "$output_arg"
++ procd_close_instance
++}
++
++start_service() {
++ config_load 'mjpg-streamer'
++ config_foreach start_instance 'mjpg-streamer'
++}
++
++service_triggers() {
++ procd_add_reload_trigger 'mjpg-streamer'
++}
+diff --git a/feeds/packages/multimedia/mjpg-streamer/patches/005-musl_compatibility.patch b/feeds/packages/multimedia/mjpg-streamer/patches/005-musl_compatibility.patch
+new file mode 100644
+index 0000000..c758eb9
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/patches/005-musl_compatibility.patch
+@@ -0,0 +1,13 @@
++--- a/mjpg_streamer.h
+++++ b/mjpg_streamer.h
++@@ -29,6 +29,10 @@
++ #define MAX_OUTPUT_PLUGINS 10
++ #define MAX_PLUGIN_ARGUMENTS 32
++
+++#define __NEED_pthread_t
+++#define __NEED_pthread_mutex_t
+++#define __NEED_pthread_cond_t
+++
++ #include <linux/types.h> /* for videodev2.h */
++ #include <linux/videodev2.h>
++
+diff --git a/feeds/packages/multimedia/mjpg-streamer/patches/010-enable_additional_plugins.patch b/feeds/packages/multimedia/mjpg-streamer/patches/010-enable_additional_plugins.patch
+new file mode 100644
+index 0000000..4713a08
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/patches/010-enable_additional_plugins.patch
+@@ -0,0 +1,17 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -33,12 +33,12 @@ APP_BINARY = mjpg_streamer
++
++ # define the names and targets of the plugins
++ PLUGINS = input_uvc.so
++-#PLUGINS += output_file.so
+++PLUGINS += output_file.so
++ #PLUGINS += output_udp.so
++ PLUGINS += output_http.so
++ PLUGINS += input_testpicture.so
++ #PLUGINS += output_autofocus.so
++-#PLUGINS += input_file.so
+++PLUGINS += input_file.so
++ # PLUGINS += input_pylon.so
++ # PLUGINS += input_megatec.so
++ # PLUGINS += output_mars2020.so
+diff --git a/feeds/packages/multimedia/mjpg-streamer/patches/020-remove_gcc_debug_options.patch b/feeds/packages/multimedia/mjpg-streamer/patches/020-remove_gcc_debug_options.patch
+new file mode 100644
+index 0000000..00d831e
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/patches/020-remove_gcc_debug_options.patch
+@@ -0,0 +1,33 @@
++--- a/plugins/input_uvc/Makefile
+++++ b/plugins/input_uvc/Makefile
++@@ -13,7 +13,7 @@ OTHER_HEADERS = ../../mjpg_streamer.h ..
++
++ CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
++
++-CFLAGS += -g -DDEBUG
+++#CFLAGS += -g -DDEBUG
++
++ ifeq ($(USE_LIBV4L2),true)
++ LFLAGS += -lv4l2
++--- a/plugins/output_file/Makefile
+++++ b/plugins/output_file/Makefile
++@@ -12,7 +12,7 @@ CC = gcc
++ OTHER_HEADERS = ../../mjpg_streamer.h ../../utils.h ../output.h ../input.h
++
++ CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
++-CFLAGS += -DDEBUG -g
+++#CFLAGS += -DDEBUG -g
++ LFLAGS += -lpthread -ldl
++
++ all: output_file.so
++--- a/plugins/output_udp/Makefile
+++++ b/plugins/output_udp/Makefile
++@@ -14,7 +14,7 @@ CC = gcc
++ OTHER_HEADERS = ../../mjpg_streamer.h ../../utils.h ../output.h ../input.h
++
++ CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
++-CFLAGS += -DDEBUG
+++#CFLAGS += -DDEBUG
++ LFLAGS += -lpthread -ldl
++
++ all: output_udp.so
+diff --git a/feeds/packages/multimedia/mjpg-streamer/patches/030-allow_16_char_device_names.patch b/feeds/packages/multimedia/mjpg-streamer/patches/030-allow_16_char_device_names.patch
+new file mode 100644
+index 0000000..0f8660a
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/patches/030-allow_16_char_device_names.patch
+@@ -0,0 +1,11 @@
++--- a/plugins/input_uvc/v4l2uvc.c
+++++ b/plugins/input_uvc/v4l2uvc.c
++@@ -69,7 +69,7 @@ int init_videoIn(struct vdIn *vd, char *
++ vd->videodevice = (char *) calloc(1, 16 * sizeof(char));
++ vd->status = (char *) calloc(1, 100 * sizeof(char));
++ vd->pictName = (char *) calloc(1, 80 * sizeof(char));
++- snprintf(vd->videodevice, 12, "%s", device);
+++ snprintf(vd->videodevice, 16, "%s", device);
++ vd->toggleAvi = 0;
++ vd->getPict = 0;
++ vd->signalquit = 1;
+diff --git a/feeds/packages/multimedia/mjpg-streamer/patches/040-Buffer-the-bytesused-variable-from-struct-v4l2_buffe.patch b/feeds/packages/multimedia/mjpg-streamer/patches/040-Buffer-the-bytesused-variable-from-struct-v4l2_buffe.patch
+new file mode 100644
+index 0000000..a228f42
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/patches/040-Buffer-the-bytesused-variable-from-struct-v4l2_buffe.patch
+@@ -0,0 +1,87 @@
++From 19202b54698b343a0207d7e213448e32b8e58fc3 Mon Sep 17 00:00:00 2001
++From: Olliver Schinagl <o.schinagl@ultimaker.com>
++Date: Wed, 29 Oct 2014 09:34:41 +0100
++Subject: [PATCH 1/7] Buffer the bytesused variable from struct v4l2_buffer
++
++Starting with kernel versions 3.16, (DE)Queing of buffers has been fixed
++after it was leaking data for ages. in the struct v4l2_buffer is the
++bytesused element which indicates the size of the buffer. This however
++gets cleared whenever the buffer gets requeued and is thus no longer
++valid.
++
++This patch copies the bytesused variable so it is available until the
++next frame captured again.
++
++Signed-off-by: Olliver Schinagl <o.schinagl@ultimaker.com>
++---
++ plugins/input_uvc/input_uvc.c | 6 +++---
++ plugins/input_uvc/v4l2uvc.c | 2 ++
++ plugins/input_uvc/v4l2uvc.h | 1 +
++ 3 files changed, 6 insertions(+), 3 deletions(-)
++
++diff --git a/plugins/input_uvc/input_uvc.c b/plugins/input_uvc/input_uvc.c
++index e6c74fd..64f66cb 100644
++--- a/plugins/input_uvc/input_uvc.c
+++++ b/plugins/input_uvc/input_uvc.c
++@@ -482,7 +482,7 @@ void *cam_thread(void *arg)
++ exit(EXIT_FAILURE);
++ }
++
++- //DBG("received frame of size: %d from plugin: %d\n", pcontext->videoIn->buf.bytesused, pcontext->id);
+++ //DBG("received frame of size: %d from plugin: %d\n", pcontext->videoIn->tmpbytesused, pcontext->id);
++
++ /*
++ * Workaround for broken, corrupted frames:
++@@ -491,7 +491,7 @@ void *cam_thread(void *arg)
++ * For example a VGA (640x480) webcam picture is normally >= 8kByte large,
++ * corrupted frames are smaller.
++ */
++- if(pcontext->videoIn->buf.bytesused < minimum_size) {
+++ if(pcontext->videoIn->tmpbytesused < minimum_size) {
++ DBG("dropping too small frame, assuming it as broken\n");
++ continue;
++ }
++@@ -529,7 +529,7 @@ void *cam_thread(void *arg)
++ } else {
++ #endif
++ //DBG("copying frame from input: %d\n", (int)pcontext->id);
++- pglobal->in[pcontext->id].size = memcpy_picture(pglobal->in[pcontext->id].buf, pcontext->videoIn->tmpbuffer, pcontext->videoIn->buf.bytesused);
+++ pglobal->in[pcontext->id].size = memcpy_picture(pglobal->in[pcontext->id].buf, pcontext->videoIn->tmpbuffer, pcontext->videoIn->tmpbytesused);
++ #ifndef NO_LIBJPEG
++ }
++ #endif
++diff --git a/plugins/input_uvc/v4l2uvc.c b/plugins/input_uvc/v4l2uvc.c
++index c5a5aa4..d11510c 100644
++--- a/plugins/input_uvc/v4l2uvc.c
+++++ b/plugins/input_uvc/v4l2uvc.c
++@@ -532,6 +532,7 @@ int uvcGrab(struct vdIn *vd)
++ */
++
++ memcpy(vd->tmpbuffer, vd->mem[vd->buf.index], vd->buf.bytesused);
+++ vd->tmpbytesused = vd->buf.bytesused;
++
++ if(debug)
++ fprintf(stderr, "bytes in used %d \n", vd->buf.bytesused);
++@@ -570,6 +571,7 @@ int close_v4l2(struct vdIn *vd)
++ if(vd->tmpbuffer)
++ free(vd->tmpbuffer);
++ vd->tmpbuffer = NULL;
+++ vd->tmpbytesused = 0;
++ free(vd->framebuffer);
++ vd->framebuffer = NULL;
++ free(vd->videodevice);
++diff --git a/plugins/input_uvc/v4l2uvc.h b/plugins/input_uvc/v4l2uvc.h
++index 022c57e..2c7c8ba 100644
++--- a/plugins/input_uvc/v4l2uvc.h
+++++ b/plugins/input_uvc/v4l2uvc.h
++@@ -83,6 +83,7 @@ struct vdIn {
++ struct v4l2_requestbuffers rb;
++ void *mem[NB_BUFFER];
++ unsigned char *tmpbuffer;
+++ int tmpbytesused;
++ unsigned char *framebuffer;
++ streaming_state streamingState;
++ int grabmethod;
++--
++1.9.1
++
+diff --git a/feeds/packages/multimedia/mjpg-streamer/patches/041-Stop-leaking-data-via-struct-v4l2_buffer.patch b/feeds/packages/multimedia/mjpg-streamer/patches/041-Stop-leaking-data-via-struct-v4l2_buffer.patch
+new file mode 100644
+index 0000000..4f45da5
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/patches/041-Stop-leaking-data-via-struct-v4l2_buffer.patch
+@@ -0,0 +1,242 @@
++From 11b28b36a8711b53658e8bbc50435595522f91ba Mon Sep 17 00:00:00 2001
++From: Olliver Schinagl <o.schinagl@ultimaker.com>
++Date: Wed, 29 Oct 2014 11:21:16 +0100
++Subject: [PATCH 2/7] Stop leaking data via struct v4l2_buffer
++
++Before the 3.16 kernel, the v4l2_buffer was leaking data and violating
++its own spec. Since 3.16 this has been corrected and after calling the
++QBUF ioctl, the struct gets cleaned up.
++
++Right now, input_uvc assumes the buffer is valid at all times. This no
++longer being true, this patch removes the v4l2_buffer from the vdIn
++struct. Certain values are still needed outside of this buffer however,
++the length buffer in the buffer array 'mem' and the timestamp. These are
++now stored in the vdIn struct.
++
++All of this is still somewhat hackish, as a) the processing of the image
++should really be done inside the uvcGrab function between the queuing
++and dequeing of the buffers (or separate that into 3 functions, deq, q
++and process and call them from input_uvc). b) we are still copying the
++image using memcpy, which is something we don't really want and defeats
++the purpose of using a mmap in the first place. Changing this however
++requires some heavier re-architecting and in the end, may still not be avoided.
++
++More information about this bug and change can be found on the
++linux-media mailing list[0] with the title uvcvideo fails on 3.16 and
++3.17 kernels.
++
++[0] http://www.spinics.net/lists/linux-media/msg81515.html
++
++Signed-off-by: Olliver Schinagl <o.schinagl@ultimaker.com>
++---
++ plugins/input_uvc/input_uvc.c | 6 ++--
++ plugins/input_uvc/v4l2uvc.c | 64 +++++++++++++++++++++++--------------------
++ plugins/input_uvc/v4l2uvc.h | 4 ++-
++ 3 files changed, 41 insertions(+), 33 deletions(-)
++
++diff --git a/plugins/input_uvc/input_uvc.c b/plugins/input_uvc/input_uvc.c
++index 64f66cb..64ef56c 100644
++--- a/plugins/input_uvc/input_uvc.c
+++++ b/plugins/input_uvc/input_uvc.c
++@@ -500,8 +500,8 @@ void *cam_thread(void *arg)
++ if (pcontext->videoIn->soft_framedrop == 1) {
++ unsigned long last = pglobal->in[pcontext->id].timestamp.tv_sec * 1000 +
++ (pglobal->in[pcontext->id].timestamp.tv_usec/1000); // convert to ms
++- unsigned long current = pcontext->videoIn->buf.timestamp.tv_sec * 1000 +
++- pcontext->videoIn->buf.timestamp.tv_usec/1000; // convert to ms
+++ unsigned long current = pcontext->videoIn->tmptimestamp.tv_sec * 1000 +
+++ pcontext->videoIn->tmptimestamp.tv_usec/1000; // convert to ms
++
++ // if the requested time did not esplashed skip the frame
++ if ((current - last) < pcontext->videoIn->frame_period_time) {
++@@ -543,7 +543,7 @@ void *cam_thread(void *arg)
++ #endif
++
++ /* copy this frame's timestamp to user space */
++- pglobal->in[pcontext->id].timestamp = pcontext->videoIn->buf.timestamp;
+++ pglobal->in[pcontext->id].timestamp = pcontext->videoIn->tmptimestamp;
++
++ /* signal fresh_frame */
++ pthread_cond_broadcast(&pglobal->in[pcontext->id].db_update);
++diff --git a/plugins/input_uvc/v4l2uvc.c b/plugins/input_uvc/v4l2uvc.c
++index d11510c..7ec5eec 100644
++--- a/plugins/input_uvc/v4l2uvc.c
+++++ b/plugins/input_uvc/v4l2uvc.c
++@@ -217,6 +217,9 @@ static int init_v4l2(struct vdIn *vd)
++ {
++ int i;
++ int ret = 0;
+++ struct v4l2_buffer buf;
+++
+++
++ if((vd->fd = OPEN_VIDEO(vd->videodevice, O_RDWR)) == -1) {
++ perror("ERROR opening V4L interface");
++ DBG("errno: %d", errno);
++@@ -375,26 +378,27 @@ static int init_v4l2(struct vdIn *vd)
++ * map the buffers
++ */
++ for(i = 0; i < NB_BUFFER; i++) {
++- memset(&vd->buf, 0, sizeof(struct v4l2_buffer));
++- vd->buf.index = i;
++- vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++- vd->buf.memory = V4L2_MEMORY_MMAP;
++- ret = xioctl(vd->fd, VIDIOC_QUERYBUF, &vd->buf);
+++ memset(&buf, 0, sizeof(struct v4l2_buffer));
+++ buf.index = i;
+++ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+++ buf.memory = V4L2_MEMORY_MMAP;
+++ ret = xioctl(vd->fd, VIDIOC_QUERYBUF, &buf);
++ if(ret < 0) {
++ perror("Unable to query buffer");
++ goto fatal;
++ }
++
++ if(debug)
++- fprintf(stderr, "length: %u offset: %u\n", vd->buf.length, vd->buf.m.offset);
+++ fprintf(stderr, "length: %u offset: %u\n", buf.length, buf.m.offset);
++
++ vd->mem[i] = mmap(0 /* start anywhere */ ,
++- vd->buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, vd->fd,
++- vd->buf.m.offset);
+++ buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, vd->fd,
+++ buf.m.offset);
++ if(vd->mem[i] == MAP_FAILED) {
++ perror("Unable to map buffer");
++ goto fatal;
++ }
+++ vd->memlength[i] = buf.length;
++ if(debug)
++ fprintf(stderr, "Buffer mapped at address %p.\n", vd->mem[i]);
++ }
++@@ -403,11 +407,11 @@ static int init_v4l2(struct vdIn *vd)
++ * Queue the buffers.
++ */
++ for(i = 0; i < NB_BUFFER; ++i) {
++- memset(&vd->buf, 0, sizeof(struct v4l2_buffer));
++- vd->buf.index = i;
++- vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++- vd->buf.memory = V4L2_MEMORY_MMAP;
++- ret = xioctl(vd->fd, VIDIOC_QBUF, &vd->buf);
+++ memset(&buf, 0, sizeof(struct v4l2_buffer));
+++ buf.index = i;
+++ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+++ buf.memory = V4L2_MEMORY_MMAP;
+++ ret = xioctl(vd->fd, VIDIOC_QBUF, &buf);
++ if(ret < 0) {
++ perror("Unable to queue buffer");
++ goto fatal;;
++@@ -499,17 +503,18 @@ int memcpy_picture(unsigned char *out, unsigned char *buf, int size)
++ int uvcGrab(struct vdIn *vd)
++ {
++ #define HEADERFRAME1 0xaf
+++ struct v4l2_buffer buf;
++ int ret;
++
++ if(vd->streamingState == STREAMING_OFF) {
++ if(video_enable(vd))
++ goto err;
++ }
++- memset(&vd->buf, 0, sizeof(struct v4l2_buffer));
++- vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++- vd->buf.memory = V4L2_MEMORY_MMAP;
+++ memset(&buf, 0, sizeof(struct v4l2_buffer));
+++ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+++ buf.memory = V4L2_MEMORY_MMAP;
++
++- ret = xioctl(vd->fd, VIDIOC_DQBUF, &vd->buf);
+++ ret = xioctl(vd->fd, VIDIOC_DQBUF, &buf);
++ if(ret < 0) {
++ perror("Unable to dequeue buffer");
++ goto err;
++@@ -517,33 +522,34 @@ int uvcGrab(struct vdIn *vd)
++
++ switch(vd->formatIn) {
++ case V4L2_PIX_FMT_MJPEG:
++- if(vd->buf.bytesused <= HEADERFRAME1) {
+++ if(buf.bytesused <= HEADERFRAME1) {
++ /* Prevent crash
++ * on empty image */
++ fprintf(stderr, "Ignoring empty buffer ...\n");
++ return 0;
++ }
++
++- /* memcpy(vd->tmpbuffer, vd->mem[vd->buf.index], vd->buf.bytesused);
+++ /* memcpy(vd->tmpbuffer, vd->mem[buf.index], buf.bytesused);
++
++- memcpy (vd->tmpbuffer, vd->mem[vd->buf.index], HEADERFRAME1);
+++ memcpy (vd->tmpbuffer, vd->mem[buf.index], HEADERFRAME1);
++ memcpy (vd->tmpbuffer + HEADERFRAME1, dht_data, sizeof(dht_data));
++- memcpy (vd->tmpbuffer + HEADERFRAME1 + sizeof(dht_data), vd->mem[vd->buf.index] + HEADERFRAME1, (vd->buf.bytesused - HEADERFRAME1));
+++ memcpy (vd->tmpbuffer + HEADERFRAME1 + sizeof(dht_data), vd->mem[buf.index] + HEADERFRAME1, (buf.bytesused - HEADERFRAME1));
++ */
++
++- memcpy(vd->tmpbuffer, vd->mem[vd->buf.index], vd->buf.bytesused);
++- vd->tmpbytesused = vd->buf.bytesused;
+++ memcpy(vd->tmpbuffer, vd->mem[buf.index], buf.bytesused);
+++ vd->tmpbytesused = buf.bytesused;
+++ vd->tmptimestamp = buf.timestamp;
++
++ if(debug)
++- fprintf(stderr, "bytes in used %d \n", vd->buf.bytesused);
+++ fprintf(stderr, "bytes in used %d \n", buf.bytesused);
++ break;
++ case V4L2_PIX_FMT_RGB565:
++ case V4L2_PIX_FMT_YUYV:
++ case V4L2_PIX_FMT_RGB24:
++- if(vd->buf.bytesused > vd->framesizeIn)
++- memcpy(vd->framebuffer, vd->mem[vd->buf.index], (size_t) vd->framesizeIn);
+++ if(buf.bytesused > vd->framesizeIn)
+++ memcpy(vd->framebuffer, vd->mem[buf.index], (size_t) vd->framesizeIn);
++ else
++- memcpy(vd->framebuffer, vd->mem[vd->buf.index], (size_t) vd->buf.bytesused);
+++ memcpy(vd->framebuffer, vd->mem[buf.index], (size_t) buf.bytesused);
++ break;
++
++ default:
++@@ -551,7 +557,7 @@ int uvcGrab(struct vdIn *vd)
++ break;
++ }
++
++- ret = xioctl(vd->fd, VIDIOC_QBUF, &vd->buf);
+++ ret = xioctl(vd->fd, VIDIOC_QBUF, &buf);
++ if(ret < 0) {
++ perror("Unable to requeue buffer");
++ goto err;
++@@ -947,7 +953,7 @@ int setResolution(struct vdIn *vd, int width, int height)
++ DBG("Unmap buffers\n");
++ int i;
++ for(i = 0; i < NB_BUFFER; i++)
++- munmap(vd->mem[i], vd->buf.length);
+++ munmap(vd->mem[i], vd->memlength[i]);
++
++ if(CLOSE_VIDEO(vd->fd) == 0) {
++ DBG("Device closed successfully\n");
++diff --git a/plugins/input_uvc/v4l2uvc.h b/plugins/input_uvc/v4l2uvc.h
++index 2c7c8ba..e625957 100644
++--- a/plugins/input_uvc/v4l2uvc.h
+++++ b/plugins/input_uvc/v4l2uvc.h
++@@ -35,6 +35,7 @@
++ #include <sys/ioctl.h>
++ #include <sys/mman.h>
++ #include <sys/select.h>
+++#include <sys/time.h>
++
++ #include <linux/types.h> /* for videodev2.h */
++ #include <linux/videodev2.h>
++@@ -79,11 +80,12 @@ struct vdIn {
++ char *pictName;
++ struct v4l2_capability cap;
++ struct v4l2_format fmt;
++- struct v4l2_buffer buf;
++ struct v4l2_requestbuffers rb;
++ void *mem[NB_BUFFER];
+++ int memlength[NB_BUFFER];
++ unsigned char *tmpbuffer;
++ int tmpbytesused;
+++ struct timeval tmptimestamp;
++ unsigned char *framebuffer;
++ streaming_state streamingState;
++ int grabmethod;
++--
++1.9.1
++
+diff --git a/feeds/packages/multimedia/mjpg-streamer/patches/050-fix-yuv-capture.patch b/feeds/packages/multimedia/mjpg-streamer/patches/050-fix-yuv-capture.patch
+new file mode 100644
+index 0000000..0c4d27a
+--- /dev/null
++++ b/feeds/packages/multimedia/mjpg-streamer/patches/050-fix-yuv-capture.patch
+@@ -0,0 +1,58 @@
++Binary files a/ipkg-ar71xx/mjpg-streamer/usr/lib/input_uvc.so and b/ipkg-ar71xx/mjpg-streamer/usr/lib/input_uvc.so differ
++diff -ur a/plugins/input_uvc/input_uvc.c b/plugins/input_uvc/input_uvc.c
++--- a/plugins/input_uvc/input_uvc.c 2015-03-02 09:14:05.000000000 +0200
+++++ b/plugins/input_uvc/input_uvc.c 2015-03-02 09:18:22.000000000 +0200
++@@ -311,6 +311,10 @@
++ }
++ memset(cams[id].videoIn, 0, sizeof(struct vdIn));
++
+++ /* Non-MJPEG formats seem to fail with unlimited FPS */
+++ if (format != V4L2_PIX_FMT_MJPEG && fps == -1)
+++ fps = 15;
+++
++ /* display the parsed values */
++ IPRINT("Using V4L2 device.: %s\n", dev);
++ IPRINT("Desired Resolution: %i x %i\n", width, height);
++diff -ur a/plugins/input_uvc/jpeg_utils.c b/plugins/input_uvc/jpeg_utils.c
++--- a/plugins/input_uvc/jpeg_utils.c 2015-03-02 09:17:02.000000000 +0300
+++++ b/plugins/input_uvc/jpeg_utils.c 2015-03-02 09:25:18.000000000 +0200
++@@ -198,7 +198,7 @@
++ }
++
++ row_pointer = (JSAMPROW*)line_buffer;
++- jpeg_write_scanlines(&cinfo, row_pointer, 1);
+++ jpeg_write_scanlines(&cinfo, &row_pointer, 1);
++ }
++ } else if (vd->formatIn == V4L2_PIX_FMT_RGB565) {
++ while(cinfo.next_scanline < vd->height) {
++@@ -220,7 +220,7 @@
++ }
++
++ row_pointer = (JSAMPROW*)line_buffer;
++- jpeg_write_scanlines(&cinfo, row_pointer, 1);
+++ jpeg_write_scanlines(&cinfo, &row_pointer, 1);
++ }
++ } else if (vd->formatIn == V4L2_PIX_FMT_RGB24) {
++ jpeg_write_scanlines(&cinfo, (JSAMPROW*)vd->framebuffer, vd->height);
++diff -ur a/plugins/input_uvc/v4l2uvc.c b/plugins/input_uvc/v4l2uvc.c
++--- a/plugins/input_uvc/v4l2uvc.c 2015-03-02 09:14:05.000000000 +0200
+++++ b/plugins/input_uvc/v4l2uvc.c 2015-03-02 09:22:09.000000000 +0200
++@@ -338,11 +338,15 @@
++ vd->frame_period_time = 1000/vd->fps; // calcualate frame period time in ms
++ IPRINT("Frame period time ......: %ld ms\n", vd->frame_period_time);
++
++- // set FPS to maximum in order to minimize the lagging
++ memset(setfps, 0, sizeof(struct v4l2_streamparm));
++ setfps->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
++ setfps->parm.capture.timeperframe.numerator = 1;
++- setfps->parm.capture.timeperframe.denominator = 255;
+++ if (vd->formatIn == V4L2_PIX_FMT_MJPEG)
+++ // set FPS to maximum in order to minimize the lagging
+++ setfps->parm.capture.timeperframe.denominator = 255;
+++ else
+++ setfps->parm.capture.timeperframe.denominator = vd->fps;
+++
++ ret = xioctl(vd->fd, VIDIOC_S_PARM, setfps);
++ if (ret) {
++ perror("Unable to set the FPS\n");
++
+diff --git a/feeds/packages/multimedia/motion/Makefile b/feeds/packages/multimedia/motion/Makefile
+new file mode 100644
+index 0000000..eeb49b1
+--- /dev/null
++++ b/feeds/packages/multimedia/motion/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=motion
++PKG_VERSION=3.4.0-20141018-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=2
++
++PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/Mr-Dave/motion.git
++PKG_SOURCE_VERSION:=9479d910f2149b5558788bb86f97f26522794212
++
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/motion
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ DEPENDS:=+libjpeg +libpthread
++ TITLE:=webcam motion sensing and logging
++ URL:=http://www.lavrsen.dk/twiki/bin/view/Motion/WebHome
++endef
++
++define Package/motion/conffiles
++ /etc/motion.conf
++endef
++
++CONFIGURE_ARGS+= \
++ --without-optimizecpu \
++ --without-ffmpeg \
++ --without-jpeg-mmx \
++ --without-sdl \
++ --without-mysql \
++ --without-pgsql \
++ --without-sqlite3 \
++
++define Package/motion/install
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_BUILD_DIR)/motion-dist.conf $(1)/etc/motion.conf
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/motion $(1)/usr/bin/
++
++endef
++
++$(eval $(call BuildPackage,motion))
+diff --git a/feeds/packages/multimedia/motion/patches/100-musl-compat.patch b/feeds/packages/multimedia/motion/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..b788e26
+--- /dev/null
++++ b/feeds/packages/multimedia/motion/patches/100-musl-compat.patch
+@@ -0,0 +1,49 @@
++--- a/motion.c
+++++ b/motion.c
++@@ -2630,6 +2630,17 @@ int main (int argc, char **argv)
++ struct sigaction sigchild_action;
++ setup_signals(&sig_handler_action, &sigchild_action);
++
+++ /*
+++ * Create and a thread attribute for the threads we spawn later on.
+++ * PTHREAD_CREATE_DETACHED means to create threads detached, i.e.
+++ * their termination cannot be synchronized through 'pthread_join'.
+++ */
+++ pthread_attr_init(&thread_attr);
+++ pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
+++
+++ /* Create the TLS key for thread number. */
+++ pthread_key_create(&tls_key_threadnr, NULL);
+++
++ motion_startup(1, argc, argv);
++
++ #ifdef HAVE_FFMPEG
++@@ -2648,17 +2659,6 @@ int main (int argc, char **argv)
++ if (cnt_list[0]->conf.setup_mode)
++ MOTION_LOG(NTC, TYPE_ALL, NO_ERRNO, "%s: Motion running in setup mode.");
++
++- /*
++- * Create and a thread attribute for the threads we spawn later on.
++- * PTHREAD_CREATE_DETACHED means to create threads detached, i.e.
++- * their termination cannot be synchronized through 'pthread_join'.
++- */
++- pthread_attr_init(&thread_attr);
++- pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
++-
++- /* Create the TLS key for thread number. */
++- pthread_key_create(&tls_key_threadnr, NULL);
++-
++ do {
++ if (restart) {
++ /*
++--- a/motion.h
+++++ b/motion.h
++@@ -84,7 +84,7 @@
++ #endif
++
++ /* strerror_r() XSI vs GNU */
++-#if (defined(BSD)) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE)
+++#if (defined(BSD)) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE) || (!defined(__GLIBC__))
++ #define XSI_STRERROR_R
++ #endif
++
+diff --git a/feeds/packages/multimedia/oggfwd/Makefile b/feeds/packages/multimedia/oggfwd/Makefile
+new file mode 100644
+index 0000000..8caf7f1
+--- /dev/null
++++ b/feeds/packages/multimedia/oggfwd/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=oggfwd
++PKG_REV:=506088e5066abd086efc951670906187c120e9a3
++PKG_VERSION:=20150412
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=git://r-w-x.org/oggfwd.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/oggfwd
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ SUBMENU:=Streaming
++ TITLE:=Pipe media into icecast
++ URL:=http://www.v2v.cc/~j/oggfwd
++ DEPENDS:=+libpthread +libshout
++endef
++
++define Package/oggfwd/description
++ A basic icecast client that is very simple but also very useful for video
++ streaming.
++endef
++
++MAKE_FLAGS += \
++ INCLUDEFLAGS="$(TARGET_LDFLAGS)" \
++ LINKFLAGS="$(TARGET_LDFLAGS) -lshout" \
++
++define Package/oggfwd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/oggfwd $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,oggfwd))
+diff --git a/feeds/packages/multimedia/tvheadend/Config.in b/feeds/packages/multimedia/tvheadend/Config.in
+new file mode 100644
+index 0000000..61a3774
+--- /dev/null
++++ b/feeds/packages/multimedia/tvheadend/Config.in
+@@ -0,0 +1,17 @@
++config TVHEADEND_CWC_SUPPORT
++ bool "NewCamd support"
++ default y
++
++config TVHEADEND_LINUXDVB_SUPPORT
++ bool "Linux DVB support"
++ default y
++
++config TVHEADEND_DVBSCAN_SUPPORT
++ bool "Fetch DVB-scan data"
++ depends on TVHEADEND_LINUXDVB_SUPPORT
++ default TVHEADEND_LINUXDVB_SUPPORT
++
++config TVHEADEND_AVAHI_SUPPORT
++ bool "Avahi client support"
++ select PACKAGE_libavahi-client
++ default n
+diff --git a/feeds/packages/multimedia/tvheadend/Makefile b/feeds/packages/multimedia/tvheadend/Makefile
+new file mode 100644
+index 0000000..26c48a9
+--- /dev/null
++++ b/feeds/packages/multimedia/tvheadend/Makefile
+@@ -0,0 +1,98 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tvheadend
++PKG_VERSION:=4.0.5
++PKG_RELEASE:=2
++
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)
++PKG_SOURCE_VERSION:=v$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/tvheadend/tvheadend.git
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=LICENSE.md
++
++PKG_FIXUP:=autoreconf
++
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/tvheadend
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ TITLE:=Tvheadend is a TV streaming server for Linux
++ DEPENDS:=+libopenssl +librt +zlib +TVHEADEND_AVAHI_SUPPORT:libavahi-client
++ URL:=https://tvheadend.org
++ MAINTAINER:=Jan Čermák <jan.cermak@nic.cz>
++endef
++
++define Package/tvheadend/description
++ Tvheadend is a TV streaming server and recorder for Linux, FreeBSD and Android
++ supporting DVB-S, DVB-S2, DVB-C, DVB-T, ATSC, IPTV, SAT>IP and HDHomeRun as input sources.
++
++ Tvheadend offers the HTTP (VLC, MPlayer), HTSP (Kodi, Movian) and SAT>IP streaming.
++endef
++
++define Package/tvheadend/config
++ menu "Configuration"
++ depends on PACKAGE_tvheadend
++ source "$(SOURCE)/Config.in"
++ endmenu
++endef
++
++ifeq ($(CONFIG_TVHEADEND_CWC_SUPPORT),)
++ CONFIGURE_ARGS += --disable-cwc
++endif
++
++ifeq ($(CONFIG_TVHEADEND_LINUXDVB_SUPPORT),)
++ CONFIGURE_ARGS += --disable-linuxdvb
++endif
++
++ifeq ($(CONFIG_TVHEADEND_DVBSCAN_SUPPORT),)
++ CONFIGURE_ARGS += --disable-dvbscan
++endif
++
++ifeq ($(CONFIG_TVHEADEND_AVAHI_SUPPORT),)
++ CONFIGURE_ARGS += --disable-avahi
++else
++ CONFIGURE_ARGS += --enable-avahi
++endif
++
++CONFIGURE_ARGS += \
++ --arch=$(ARCH) \
++ --disable-dbus_1 \
++ --disable-libav \
++ --enable-bundle
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ echo 'Tvheadend $(shell echo $(PKG_SOURCE_VERSION) | sed "s/^v//")~openwrt$(PKG_RELEASE)' \
++ > $(PKG_BUILD_DIR)/debian/changelog
++endef
++
++define Package/conffiles
++/etc/config/tvheadend
++endef
++
++define Package/tvheadend/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/tvheadend.init $(1)/etc/init.d/tvheadend
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/tvheadend.config $(1)/etc/config/tvheadend
++
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/build.linux/tvheadend $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,tvheadend))
+diff --git a/feeds/packages/multimedia/tvheadend/files/tvheadend.config b/feeds/packages/multimedia/tvheadend/files/tvheadend.config
+new file mode 100644
+index 0000000..62c139d
+--- /dev/null
++++ b/feeds/packages/multimedia/tvheadend/files/tvheadend.config
+@@ -0,0 +1,13 @@
++#config tvheadend service
++# option nosyslog '0'
++# option use_temp_epgdb '0'
++# option config_path '/etc/tvheadend'
++
++config tvheadend server
++ option ipv6 '1'
++# option bindaddr '0.0.0.0'
++# option http_port '9981'
++# option http_root '/tvheadend'
++# option htsp_port '9982'
++# option htsp_port2 '9983'
++# option xspf '0'
+diff --git a/feeds/packages/multimedia/tvheadend/files/tvheadend.init b/feeds/packages/multimedia/tvheadend/files/tvheadend.init
+new file mode 100644
+index 0000000..31702e1
+--- /dev/null
++++ b/feeds/packages/multimedia/tvheadend/files/tvheadend.init
+@@ -0,0 +1,71 @@
++#!/bin/sh /etc/rc.common
++
++START=99
++STOP=00
++
++USE_PROCD=1
++PROG=/usr/bin/tvheadend
++
++TEMP_CONFIG=/tmp/tvheadend
++PERSISTENT_CONFIG=/etc/tvheadend
++
++execute_first_run() {
++ "$PROG" -c "$1" -B -C -A >/dev/null 2>&1
++}
++
++ensure_config_exists() {
++ local config_path
++
++ config_load tvheadend
++ config_get config_path service config_path
++
++ if [ -z "$config_path" ]; then
++ [ -d "$PERSISTENT_CONFIG" ] || execute_first_run "$PERSISTENT_CONFIG"
++ else
++ # if the configuration directory is empty, empty config with grant-all ACL is created
++ [ -d "$config_path" ] && [ "$(ls -A $config_path)" ] || execute_first_run "$config_path"
++ fi
++
++ # if use_temp_epgdb is enabled (default), most of the config is put to config_path
++ # (or /etc/config), except for epgdb.v2, which grows quite large and is write-heavy,
++ # so it's put into volatile tmpfs
++ # epgdb.v2 is created and symlinked to main config dir upon each start (if it doesn't exist)
++ config_get_bool use_temp_epgdb service use_temp_epgdb 1
++ if [ "$use_temp_epgdb" == "1" ]; then
++ TEMP_EPG="${TEMP_CONFIG}/epgdb.v2"
++ [ ! -f "$TEMP_EPG" ] && mkdir -p "$TEMP_CONFIG" && touch "$TEMP_EPG" && chmod 700 "$TEMP_EPG"
++ [ -z "$config_path" ] && config_path="$PERSISTENT_CONFIG"
++ ln -sf "$TEMP_EPG" "${config_path}/epgdb.v2"
++ fi
++}
++
++load_uci_config() {
++ config_load tvheadend
++ config_get config_path service config_path "$PERSISTENT_CONFIG"
++ [ -n "$config_path" ] && procd_append_param command -c "$config_path"
++ config_get_bool nosyslog service nosyslog 0
++ [ "$nosyslog" -eq 1 ] && procd_append_param command --nosyslog
++ config_get_bool ipv6 server ipv6 0
++ [ "$ipv6" -eq 1 ] && procd_append_param command --ipv6
++ config_get bindaddr server bindaddr
++ [ -n "$bindaddr" ] && procd_append_param command --bindaddr "$bindaddr"
++ config_get http_port server http_port
++ [ -n "$http_port" ] && procd_append_param command --http_port "$http_port"
++ config_get http_root server http_root
++ [ -n "$http_root" ] && procd_append_param command --http_root "$http_root"
++ config_get htsp_port server htsp_port
++ [ -n "$htsp_port" ] && procd_append_param command --htsp_port "$htsp_port"
++ config_get htsp_port2 server htsp_port2
++ [ -n "$htsp_port2" ] && procd_append_param command --htsp_port "$htsp_port2"
++ config_get xspf server xspf 0
++ [ "$xspf" -eq 1 ] && procd_append_param command --xspf
++}
++
++start_service() {
++ ensure_config_exists
++ procd_open_instance
++ procd_set_param file /etc/config/tvheadend
++ procd_set_param command "$PROG" -B
++ load_uci_config
++ procd_close_instance
++}
+diff --git a/feeds/packages/multimedia/xupnpd/Makefile b/feeds/packages/multimedia/xupnpd/Makefile
+new file mode 100644
+index 0000000..9522e83
+--- /dev/null
++++ b/feeds/packages/multimedia/xupnpd/Makefile
+@@ -0,0 +1,71 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=xupnpd
++PKG_REV:=404
++PKG_VERSION:=$(PKG_REV)
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=svn
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_SUBDIR:=xupnpd-$(PKG_VERSION)
++PKG_SOURCE_URL:=http://tsdemuxer.googlecode.com/svn/trunk/xupnpd/src/
++PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++LUA_FLAGS:=-llua
++
++define Build/Compile
++ (cd $(PKG_BUILD_DIR); $(TARGET_CC) -v $(LUA_FLAGS) $(TARGET_CFLAGS) -fno-exceptions -fno-rtti -DWITH_URANDOM $(TARGET_CPPFLAGS) $(TARGET_LDFLAGS) -lm -ldl -lcrypt -o xupnpd *.c *.cpp)
++endef
++
++define Package/xupnpd
++ SECTION:=multimedia
++ CATEGORY:=Multimedia
++ DEPENDS:=+liblua
++ TITLE:=eXtensible UPnP agent
++ URL:=http://xupnpd.org/
++endef
++
++define Package/xupnpd/conffiles
++/usr/share/xupnpd/xupnpd.lua
++/usr/share/xupnpd/config
++/usr/share/xupnpd/playlists
++endef
++
++define Package/xupnpd/description
++xupnpd - eXtensible UPnP agent
++This program is a light DLNA Media Server which provides ContentDirectory:1 service for sharing IPTV unicast streams over local area network (with udpxy for multicast to HTTP unicast conversion).
++The program shares UTF8-encoded M3U playlists with links over local area network as content of the directory.
++You can watch HDTV broadcasts (multicast or unicast) and listen Internet Radio in IP network without transcoding and PC.
++endef
++
++define Package/xupnpd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/xupnpd $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/xupnpd.init $(1)/etc/init.d/xupnpd
++ $(INSTALL_DIR) $(1)/usr/share/xupnpd
++ $(CP) $(PKG_BUILD_DIR)/*.lua $(1)/usr/share/xupnpd
++ $(INSTALL_DIR) $(1)/usr/share/xupnpd/ui
++ $(CP) $(PKG_BUILD_DIR)/ui/* $(1)/usr/share/xupnpd/ui
++ $(INSTALL_DIR) $(1)/usr/share/xupnpd/www
++ $(CP) $(PKG_BUILD_DIR)/www/* $(1)/usr/share/xupnpd/www
++ $(INSTALL_DIR) $(1)/usr/share/xupnpd/playlists
++ $(INSTALL_DIR) $(1)/usr/share/xupnpd/plugins
++ $(CP) $(PKG_BUILD_DIR)/plugins/* $(1)/usr/share/xupnpd/plugins
++ $(INSTALL_DIR) $(1)/usr/share/xupnpd/config
++ $(INSTALL_DIR) $(1)/etc/xupnpd
++ (cd $(1)/etc/xupnpd; ln -s ../../usr/share/xupnpd/config ./; ln -s ../../usr/share/xupnpd/xupnpd.lua ./)
++ $(INSTALL_DIR) $(1)/usr/share/xupnpd/localmedia
++endef
++
++$(eval $(call BuildPackage,xupnpd))
+diff --git a/feeds/packages/multimedia/xupnpd/files/xupnpd.init b/feeds/packages/multimedia/xupnpd/files/xupnpd.init
+new file mode 100644
+index 0000000..29c458a
+--- /dev/null
++++ b/feeds/packages/multimedia/xupnpd/files/xupnpd.init
+@@ -0,0 +1,15 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2013-2014 OpenWrt.org
++
++START=50
++USE_PROCD=1
++
++start_service() {
++ procd_open_instance
++
++ procd_set_param command /usr/bin/xupnpd
++ procd_append_param command -d /usr/share/xupnpd
++
++ procd_set_param respawn
++ procd_close_instance
++}
+diff --git a/feeds/packages/multimedia/xupnpd/patches/100-default_config.patch b/feeds/packages/multimedia/xupnpd/patches/100-default_config.patch
+new file mode 100644
+index 0000000..89958c7
+--- /dev/null
++++ b/feeds/packages/multimedia/xupnpd/patches/100-default_config.patch
+@@ -0,0 +1,15 @@
++--- a/xupnpd.lua
+++++ b/xupnpd.lua
++@@ -1,10 +1,10 @@
++ cfg={}
++
++ -- multicast interface for SSDP exchange, 'eth0', 'br0', 'br-lan' for example
++-cfg.ssdp_interface='lo'
+++cfg.ssdp_interface='br-lan'
++
++ -- 'cfg.ssdp_loop' enables multicast loop (if player and server in one host)
++-cfg.ssdp_loop=1
+++cfg.ssdp_loop=0
++
++ -- SSDP announcement interval
++ cfg.ssdp_notify_interval=15
+diff --git a/feeds/packages/multimedia/xupnpd/patches/101-root_dir_param.patch b/feeds/packages/multimedia/xupnpd/patches/101-root_dir_param.patch
+new file mode 100644
+index 0000000..68ea3e8
+--- /dev/null
++++ b/feeds/packages/multimedia/xupnpd/patches/101-root_dir_param.patch
+@@ -0,0 +1,83 @@
++--- a/main.cpp
+++++ b/main.cpp
++@@ -4,11 +4,14 @@
++ * https://tsdemuxer.googlecode.com/svn/trunk/xupnpd
++ */
++
+++#include <ctype.h>
++ #include <stdio.h>
++ #include <syslog.h>
++ #include <string.h>
++ #include <unistd.h>
++ #include <stdlib.h>
+++#include <sys/stat.h>
+++#include <sys/types.h>
++ #include "luacompat.h"
++ #include "luaxlib.h"
++ #include "luaxcore.h"
++@@ -16,35 +19,36 @@
++
++ int main(int argc,char** argv)
++ {
++- const char* p=strrchr(argv[0],'/');
++-
++- int rc;
++-
++- if(p)
++- {
++- char location[512];
++- int n=p-argv[0];
++- if(n>=sizeof(location))
++- n=sizeof(location)-1;
++- strncpy(location,argv[0],n);
++- location[n]=0;
++-
++- rc=chdir(location);
++-
++- argv[0]=(char*)p+1;
++- }
++-
++- const char* root=getenv("XUPNPDROOTDIR");
++- if(root && *root)
++- rc=chdir(root);
++-
++- {
++- FILE* fp=fopen("xupnpd.lua","r");
++- if(fp)
++- fclose(fp);
++- else
++- rc=chdir("/usr/share/xupnpd/");
++- }
+++ int c;
+++ char *xupnpd_root = "/usr/share/xupnpd/";
+++ struct stat s;
+++
+++ opterr = 0;
+++ while ((c = getopt (argc, argv, "d:")) != -1) {
+++ switch (c) {
+++ case 'd':
+++ xupnpd_root = optarg;
+++ break;
+++ case '?':
+++ if (optopt == 'd')
+++ fprintf(stderr, "Option -%c requires an argument.\n", optopt);
+++ else if (isprint(optopt))
+++ fprintf(stderr, "Unknown option \"-%c\".\n", optopt);
+++ else
+++ fprintf(stderr, "Unknown option\n");
+++ return 1;
+++ default:
+++ abort();
+++ }
+++ }
+++
+++ if(stat(xupnpd_root, &s) != -1 && S_ISDIR(s.st_mode)) {
+++ c = chdir(xupnpd_root);
+++ }
+++ else {
+++ fprintf(stderr, "Directory %s doesn't exist.\n", xupnpd_root);
+++ return 1;
+++ }
++
++ lua_State* L=lua_open();
++ if(L)
+diff --git a/feeds/packages/net/adblock/Makefile b/feeds/packages/net/adblock/Makefile
+new file mode 100644
+index 0000000..b372506
+--- /dev/null
++++ b/feeds/packages/net/adblock/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v3.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=adblock
++PKG_VERSION:=0.11.0
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-3.0+
++PKG_MAINTAINER:=Dirk Brenken <dirk@brenken.org>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/$(PKG_NAME)
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=powerful adblock script to block ad/abuse domains
++ DEPENDS:=+curl +wget
++ PKGARCH:=all
++endef
++
++define Package/$(PKG_NAME)/description
++powerful adblock script to block ad/abuse domains
++When the dns server on your router receives dns requests, we will sort out queries that ask for the [A] resource records of ad servers
++and return the local ip address of your router and the internal web server delivers a transparent pixel instead.
++The script supports the following domain blacklist sites:
++ http://pgl.yoyo.org/adservers
++ http://malwaredomains.com
++ https://zeustracker.abuse.ch
++ https://feodotracker.abuse.ch
++ https://palevotracker.abuse.ch
++ http://dshield.org
++ http://www.shallalist.de
++ http://www.spam404.com
++ http://winhelp2002.mvps.org
++
++endef
++
++define Package/$(PKG_NAME)/conffiles
++/etc/adblock/adblock.conf
++/etc/adblock/adblock.whitelist
++/etc/adblock/adblock.blacklist
++endef
++
++define Build/Prepare
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/$(PKG_NAME)/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) ./files/usr/bin/adblock-update.sh $(1)/usr/bin/
++ $(INSTALL_DATA) ./files/usr/bin/adblock-helper.sh $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/etc/adblock
++ $(INSTALL_CONF) ./files/etc/adblock/adblock.* $(1)/etc/adblock/
++ $(INSTALL_CONF) ./files/etc/adblock/README.md $(1)/etc/adblock/
++
++ $(INSTALL_DIR) $(1)/etc/adblock/samples
++ $(INSTALL_CONF) ./files/etc/adblock/samples/*.sample $(1)/etc/adblock/samples/
++
++ $(INSTALL_DIR) $(1)/www/adblock
++ $(INSTALL_DATA) ./files/www/adblock/* $(1)/www/adblock/
++endef
++
++$(eval $(call BuildPackage,$(PKG_NAME)))
+diff --git a/feeds/packages/net/adblock/files/etc/adblock/README.md b/feeds/packages/net/adblock/files/etc/adblock/README.md
+new file mode 100644
+index 0000000..19b06eb
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/etc/adblock/README.md
+@@ -0,0 +1,54 @@
++# adblock script for openwrt
++
++## Description
++A lot of people already use adblocker plugins within their desktop browsers,
++but what if you are using your (smart) phone, tablet, watch or any other wlan gadget...
++...getting rid of annoying ads, trackers and other abuse sites (like facebook ;-) is simple: block them with your router.
++
++When the dns server on your router receives dns requests, we’ll sort out queries that ask for the [A] resource records of ad servers
++and return the local ip address of your router and the internal web server delivers a transparent pixel instead.
++
++## Main Features
++* support of the following domain blacklist sites (free for private usage, for commercial use please check their individual licenses):
++ * [pgl.yoyo.org](http://pgl.yoyo.org/adservers)
++ * [malwaredomains.com](http://malwaredomains.com)
++ * [zeustracker.abuse.ch](https://zeustracker.abuse.ch)
++ * [feodotracker.abuse.ch](https://feodotracker.abuse.ch)
++ * [palevotracker.abuse.ch](https://palevotracker.abuse.ch)
++ * [dshield.org](http://dshield.org)
++ * [shallalist.de](http://www.shallalist.de) (tested with the categories "adv" "costtraps" "downloads" "spyware" "tracker" "warez")
++ * [spam404.com](http://www.spam404.com)
++ * [winhelp2002.mvps.org](http://winhelp2002.mvps.org)
++* blocklist parsing by fast & flexible regex rulesets
++* additional white- and blacklist support for manual overrides
++* separate adblock loopback network interface (auto-install)
++* separate uhttpd instance as pixel server (auto-install)
++* optional: quality checks and a powerful backup/restore handling to ensure a reliable dnsmasq service
++* optional: adblock updates only on pre-defined interfaces
++* optional: domain query logging as a background service to easily identify free and already blocked domains
++* optional: ntp time sync
++* optional: status & error logging (req. ntp time sync)
++
++## Prerequisites
++* [openwrt](https://openwrt.org) (tested only with trunk > r47025), CC should also work (please adjust *min_release* accordingly)
++* additional software packages:
++ * curl
++ * wget (due to an openwrt bug still needed for certain https requests - see ticket #19621)
++ * busybox find with *-mtime* support (needed only for query logging/housekeeping, will be disabled if not found)
++* optional: mounted usb stick or any other storage device to overcome limited memory resources on embedded router devices
++* the above dependencies will be checked during package installation & script runtime, please check *logread -e "adblock"* for errors
++
++## Usage
++* select & install adblock package (*opkg install adblock*)
++* configure /etc/adblock/adblock.conf to your needs
++* start /usr/bin/adblock-update.sh and check *logread -e "adblock"* for errors
++
++## Distributed samples
++* to enable/disable additional domain query logging set the dnsmasq option *logqueries* accordingly, see */etc/adblock/samples/dhcp.config.sample*.
++* for script autostart via rc.local and /tmp resizing on the fly see */etc/adblock/samples/rc.local.sample*.
++* for scheduled call of *adblock-update.sh* see */etc/adblock/samples/root.crontab.sample*.
++* to redirect/force all dns queries to your router see */etc/adblock/samples/firwall.user.sample*.
++* for further dnsmasq tweaks see */etc/adblock/samples/dnsmasq.conf.sample*.
++
++Have fun!
++Dirk
+diff --git a/feeds/packages/net/adblock/files/etc/adblock/adblock.blacklist b/feeds/packages/net/adblock/files/etc/adblock/adblock.blacklist
+new file mode 100644
+index 0000000..3df7583
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/etc/adblock/adblock.blacklist
+@@ -0,0 +1 @@
++bild.de
+diff --git a/feeds/packages/net/adblock/files/etc/adblock/adblock.conf b/feeds/packages/net/adblock/files/etc/adblock/adblock.conf
+new file mode 100644
+index 0000000..6b2e0cc
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/etc/adblock/adblock.conf
+@@ -0,0 +1,118 @@
++###################################################
++# adblock configuration used by adblock-update.sh #
++# written by Dirk Brenken (dirk@brenken.org) #
++###################################################
++
++# adblock ip address and device information
++# adb_ip => ip address of the local adblock loopback interface/uhttpd instance
++# adb_dev => name of the physical adblock network device
++# adb_if => name of the adblock network interface and uhttpd instance
++#
++adb_ip="192.168.2.1"
++adb_dev="eth0"
++adb_if="adblock"
++
++# backup file and default restore message
++# backup_dir => full path to directory for logging and backups, an empty entry disables this feature
++# backup_file => full path to backup file
++# restore_msg => default restore message
++#
++backup_dir=""
++backup_file="${backup_dir}/adlist.backup"
++restore_msg="unknown error"
++
++# wan/update interface(s)
++# wan_dev => space separated list of devices that are allowed for adblock updates (check /sys/class/net/<dev>),
++# an empty entry disables this feature
++#
++wan_dev=""
++
++# local adblock black & white list for manual overrides
++# adb_blacklist => full path to domain blacklist file
++# adb_whitelist => full path to domain whitelist file
++#
++adb_blacklist="/etc/adblock/adblock.blacklist"
++adb_whitelist="/etc/adblock/adblock.whitelist"
++
++# error logfile
++# log_file => full path to additional logfile for error logging,
++# "/dev/stdout" redirect errors to console, an empty entry disables this feature
++# this feature requires ntp time sync too (see below)
++#
++log_file="${backup_dir}/error.log"
++
++# domain query logfile
++# query_file => full path to additional domain query logfile,
++# an empty entry or an empty backup_dir entry disables this feature
++# query_history => delete query logfiles older than n days (req. busybox find with mtime support)
++#
++query_file="${backup_dir}/query.log"
++query_history=1
++query_name="$(printf "${query_file}" | sed 's/.*\///g')"
++query_ip="$(printf "${adb_ip}" | sed 's/\./\\./g')"
++query_pid="/var/run/query.pid"
++
++# ntp time server pool
++# ntp_srv => space separated list of ntp serverpools, an empty entry disables this feature
++#
++ntp_srv="ntp0.fau.de ntp1.fau.de ntp2.fau.de ntp3.fau.de"
++
++# domain for nslookup probe
++# check_domain => check the newly generated domain blocklist with this domain
++#
++check_domain="heise.de"
++
++# set startup counter and download timeout defaults
++# max_cnt => wait n seconds/loops for wan & ntp check in sum
++# max_time => wait n seconds for every source download
++#
++cnt=0
++max_cnt=30
++max_time=60
++
++# minimum values for environment checks
++# min_release => minimum required openwrt release number
++# min_space => minimum required space for backups & logfiles (in kbyte)
++#
++min_release=47025
++min_space=100000
++
++# shallalist url, categories and local naming
++# shalla_cat => space separated list of categories to use from shallalist archive
++#
++shalla_cat="adv costtraps downloads spyware tracker warez"
++shalla_url="http://www.shallalist.de/Downloads/shallalist.tar.gz"
++shalla_archive="${tmp_dir}/shallalist.tar.gz"
++shalla_file="${tmp_dir}/shallalist.txt"
++
++# remote and local domain block list sources
++# adb_source => comment out sources you don't want to use
++#
++unset adb_source
++adb_source="${adb_source} http://pgl.yoyo.org/adservers/serverlist.php?hostformat=one-line&showintro=0&mimetype=plaintext&ruleset=yoyo"
++#adb_source="${adb_source} http://mirror1.malwaredomains.com/files/justdomains&ruleset=default"
++#adb_source="${adb_source} https://zeustracker.abuse.ch/blocklist.php?download=domainblocklist&ruleset=default"
++#adb_source="${adb_source} https://feodotracker.abuse.ch/blocklist/?download=domainblocklist&ruleset=default"
++#adb_source="${adb_source} https://palevotracker.abuse.ch/blocklists.php?download=domainblocklist&ruleset=default"
++#adb_source="${adb_source} http://www.dshield.org/feeds/suspiciousdomains_Low.txt&ruleset=default"
++#adb_source="${adb_source} file:///${shalla_file}&ruleset=shalla"
++#adb_source="${adb_source} http://spam404bl.com/spam404scamlist.txt&ruleset=spam404"
++#adb_source="${adb_source} http://winhelp2002.mvps.org/hosts.txt&ruleset=winhelp"
++adb_source="${adb_source} file://${adb_blacklist}&ruleset=default"
++
++# adblock source ruleset definitions
++# note: please keep the default settings below
++#
++rset_start="sed -r 's/[[:space:]]|[\[!#/:;_].*|[0-9\.]*localhost//g; s/[\^#/:;_\.\t ]*$//g'"
++rset_end="sed '/^[#/:;_\s]*$/d'"
++rset_default="${rset_start} | ${rset_end}"
++rset_yoyo="${rset_start} | sed 's/,/\n/g' | ${rset_end}"
++rset_shalla="${rset_start} | sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}$//g' | ${rset_end}"
++rset_spam404="${rset_start} | sed 's/^\|\|//g' | ${rset_end}"
++rset_winhelp="${rset_start} | sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-1]\{1,1\}//g' | ${rset_end}"
++
++# dnsmasq destination file and format
++# note: please keep the default settings below
++#
++dns_file="/tmp/dnsmasq.d/adlist.conf"
++dns_format="sed 's/^/address=\//;s/$/\/'${adb_ip}'/'"
+diff --git a/feeds/packages/net/adblock/files/etc/adblock/adblock.whitelist b/feeds/packages/net/adblock/files/etc/adblock/adblock.whitelist
+new file mode 100644
+index 0000000..42e0a57
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/etc/adblock/adblock.whitelist
+@@ -0,0 +1,4 @@
++downloads.openwrt.org
++ftp.de.debian.org
++download.eclipse.org
++dl.sourceforge.net
+diff --git a/feeds/packages/net/adblock/files/etc/adblock/samples/dhcp.config.sample b/feeds/packages/net/adblock/files/etc/adblock/samples/dhcp.config.sample
+new file mode 100644
+index 0000000..40de7d4
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/etc/adblock/samples/dhcp.config.sample
+@@ -0,0 +1,7 @@
++# tweaks for dnsmasq
++# configuration found in /etc/config/dhcp
++#
++config dnsmasq
++ option cachesize '1000'
++ option filterwin2k '0'
++ option logqueries '1'
+diff --git a/feeds/packages/net/adblock/files/etc/adblock/samples/dnsmasq.conf.sample b/feeds/packages/net/adblock/files/etc/adblock/samples/dnsmasq.conf.sample
+new file mode 100644
+index 0000000..d92adc8
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/etc/adblock/samples/dnsmasq.conf.sample
+@@ -0,0 +1,5 @@
++# tell DHCP clients to not ask for proxy information
++# some clients - like Win7 - will constantly ask if not told "No!"
++# configuration found in /etc/dnsmasq
++#
++dhcp-option=252,"\n"
+diff --git a/feeds/packages/net/adblock/files/etc/adblock/samples/firewall.user.sample b/feeds/packages/net/adblock/files/etc/adblock/samples/firewall.user.sample
+new file mode 100644
+index 0000000..823c014
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/etc/adblock/samples/firewall.user.sample
+@@ -0,0 +1,5 @@
++# redirect/force all dns queries to port 53 of your router
++# configuration found in /etc/firewall.user
++#
++iptables -t nat -I PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
++iptables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
+diff --git a/feeds/packages/net/adblock/files/etc/adblock/samples/rc.local.sample b/feeds/packages/net/adblock/files/etc/adblock/samples/rc.local.sample
+new file mode 100644
+index 0000000..890779e
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/etc/adblock/samples/rc.local.sample
+@@ -0,0 +1,26 @@
++# sample startup script
++# configuration found in /etc/rc.local
++#
++
++# start logging
++#
++/usr/bin/logger -t rc.local "start rc.local processing"
++
++# set home directory
++#
++export HOME=/root
++
++# resize /tmp partition to 256 MB
++#
++/usr/bin/logger -t rc.local "resize /tmp partition to 256 MB"
++mount tmpfs /tmp -t tmpfs -o remount,nosuid,nodev,noatime,size=256M
++
++# start adblock script
++#
++/usr/bin/logger -t rc.local "start adblock script"
++/usr/bin/adblock-update.sh >/dev/null 2>&1
++
++# write log and exit
++#
++/usr/bin/logger -t rc.local "finish rc.local processing"
++exit 0
+diff --git a/feeds/packages/net/adblock/files/etc/adblock/samples/root.crontab.sample b/feeds/packages/net/adblock/files/etc/adblock/samples/root.crontab.sample
+new file mode 100644
+index 0000000..bc7bde7
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/etc/adblock/samples/root.crontab.sample
+@@ -0,0 +1,8 @@
++# sample crontab script
++# configuration found in /etc/crontabs/root
++#
++
++# start adblock script twice a day
++#
++0 06 * * * /usr/bin/adblock-update.sh &
++0 22 * * * /usr/bin/adblock-update.sh &
+diff --git a/feeds/packages/net/adblock/files/usr/bin/adblock-helper.sh b/feeds/packages/net/adblock/files/usr/bin/adblock-helper.sh
+new file mode 100644
+index 0000000..9ad1155
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/usr/bin/adblock-helper.sh
+@@ -0,0 +1,434 @@
++##############################################
++# function library used by adblock-update.sh #
++# written by Dirk Brenken (dirk@brenken.org) #
++##############################################
++
++#############################################
++# f_envcheck: check environment prerequisites
++#
++f_envcheck()
++{
++ # source in json helpers library
++ #
++ if [ -r "/usr/share/libubox/jshn.sh" ]
++ then
++ . "/usr/share/libubox/jshn.sh"
++ else
++ /usr/bin/logger -t "adblock[${pid}]" "json helpers library not found"
++ f_deltemp
++ exit 10
++ fi
++
++ # check adblock network device configuration
++ #
++ if [ ! -d "/sys/class/net/${adb_dev}" ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "invalid adblock network device input (${adb_dev})"
++ f_deltemp
++ exit 15
++ fi
++
++ # check adblock network interface configuration
++ #
++ check_if="$(printf "${adb_if}" | sed -n '/[^_0-9A-Za-z]/p')"
++ banned_if="$(printf "${adb_if}" | sed -n '/.*lan.*\|.*wan.*\|.*switch.*\|main\|globals\|loopback\|px5g/p')"
++ if [ -n "${check_if}" ] || [ -n "${banned_if}" ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "invalid adblock network interface input (${adb_if})"
++ f_deltemp
++ exit 20
++ fi
++
++ # check adblock ip address configuration
++ #
++ check_ip="$(printf "${adb_ip}" | sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p')"
++ if [ -z "${check_ip}" ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "invalid adblock ip address input (${adb_ip})"
++ f_deltemp
++ exit 25
++ fi
++
++ # check adblock blacklist/whitelist configuration
++ #
++ if [ ! -r "${adb_blacklist}" ] || [ ! -r "${adb_whitelist}" ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "adblock blacklist or whitelist not found"
++ f_deltemp
++ exit 30
++ fi
++
++ # check wan update configuration
++ #
++ if [ -n "${wan_dev}" ]
++ then
++ wan_ok="true"
++ else
++ wan_ok="false"
++ /usr/bin/logger -t "adblock[${pid}]" "wan update check will be disabled"
++ fi
++
++ # check ntp sync configuration
++ #
++ if [ -n "${ntp_srv}" ]
++ then
++ ntp_ok="true"
++ else
++ ntp_ok="false"
++ /usr/bin/logger -t "adblock[${pid}]" "ntp time sync will be disabled"
++ fi
++
++ # check backup configuration
++ #
++ if [ -n "${backup_dir}" ] && [ -d "${backup_dir}" ]
++ then
++ backup_ok="true"
++ mounts="${backup_dir} ${tmp_dir}"
++ else
++ backup_ok="false"
++ mounts="${tmp_dir}"
++ /usr/bin/logger -t "adblock[${pid}]" "backup/restore will be disabled"
++ fi
++
++ # check error log configuration
++ #
++ if [ "${log_file}" = "/dev/stdout" ]
++ then
++ log_ok="true"
++ log_file="/proc/self/fd/1"
++ elif [ -n "${log_file}" ] && [ "${backup_ok}" = "true" ] && [ "${ntp_ok}" = "true" ]
++ then
++ log_ok="true"
++ else
++ log_ok="false"
++ log_file="/dev/null"
++ /usr/bin/logger -t "adblock[${pid}]" "error logging will be disabled"
++ fi
++
++ # check dns query log configuration
++ #
++ if [ -n "${query_file}" ] && [ "${backup_ok}" = "true" ]
++ then
++ # check find capabilities
++ #
++ base="$(find --help 2>&1 | grep "mtime")"
++ if [[ -z "${base}" ]]
++ then
++ query_ok="false"
++ /usr/bin/logger -t "adblock[${pid}]" "no 'find/mtime' support, dns query logging will be disabled"
++ else
++ query_ok="true"
++ fi
++ else
++ query_ok="false"
++ /usr/bin/logger -t "adblock[${pid}]" "dns query logging will be disabled"
++ fi
++
++ # check shallalist configuration
++ #
++ check_shalla="$(printf "${adb_source}" | sed -n '/.*shallalist.txt.*/p')"
++ if [ -n "${check_shalla}" ]
++ then
++ shalla_ok="true"
++ else
++ shalla_ok="false"
++ /usr/bin/logger -t "adblock[${pid}]" "shallalist processing will be disabled"
++ fi
++
++ # check mount points & space requirements
++ #
++ for mp in ${mounts}
++ do
++ df "${mp}" 2>/dev/null |\
++ tail -n1 |\
++ while read filesystem overall used available scrap
++ do
++ av_space="${available}"
++ if [ $((av_space)) -eq 0 ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "no space left on device, not mounted (${mp})"
++ exit 35
++ elif [ $((av_space)) -lt $((min_space)) ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "not enough space on device (${mp})"
++ exit 40
++ fi
++ done
++ # subshell return code handling
++ #
++ rc=$?
++ if [ $((rc)) -ne 0 ]
++ then
++ f_deltemp
++ exit ${rc}
++ fi
++ done
++
++ # get list with all installed packages
++ #
++ pkg_list="$(opkg list-installed 2>/dev/null)"
++
++ # check openwrt release
++ #
++ base="$(printf "${pkg_list}" | grep "^base-files" | sed 's/\(.*r\)//g')"
++ if [ $((base)) -lt $((min_release)) ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "openwrt (r${wrt_release}) seems to be too old"
++ f_deltemp
++ exit 45
++ fi
++
++ # check curl package dependency
++ #
++ base="$(printf "${pkg_list}" | grep "^curl")"
++ if [ -z "${base}" ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "curl package not found"
++ f_deltemp
++ exit 50
++ fi
++
++ # check wget package dependency
++ #
++ base="$(printf "${pkg_list}" | grep "^wget")"
++ if [ -z "${base}" ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "wget package not found"
++ f_deltemp
++ exit 55
++ fi
++
++ # check dynamic/volatile adblock network interface configuration
++ #
++ rc="$(ifstatus "${adb_if}" >/dev/null 2>&1; printf $?)"
++ if [ $((rc)) -ne 0 ]
++ then
++ json_init
++ json_add_string name "${adb_if}"
++ json_add_string ifname "${adb_dev}"
++ json_add_string proto "static"
++ json_add_array ipaddr
++ json_add_string "" "${adb_ip}"
++ json_close_array
++ json_close_object
++ ubus call network add_dynamic "$(json_dump)"
++ /usr/bin/logger -t "adblock[${pid}]" "created new dynamic/volatile network interface (${adb_if}, ${adb_ip})"
++ fi
++
++ # check adblock uhttpd instance configuration
++ #
++ if [ -z "$(uci -q get uhttpd.${adb_if} 2>/dev/null)" ]
++ then
++ uci -q set uhttpd.${adb_if}="uhttpd"
++ uci -q set uhttpd.${adb_if}.listen_http="${adb_ip}:80"
++ uci -q set uhttpd.${adb_if}.home="/www/adblock"
++ uci -q set uhttpd.${adb_if}.error_page="/adblock.html"
++ uci -q commit uhttpd
++ /etc/init.d/uhttpd reload
++ /usr/bin/logger -t "adblock[${pid}]" "created new uhttpd instance (${adb_if}, ${adb_ip}) in /etc/config/uhttpd"
++ fi
++}
++
++###################################################
++# f_deltemp: delete temporary files and directories
++f_deltemp()
++{
++ if [ -f "${tmp_file}" ]
++ then
++ rm -f "${tmp_file}" 2>/dev/null
++ fi
++ if [ -d "${tmp_dir}" ]
++ then
++ rm -rf "${tmp_dir}" 2>/dev/null
++ fi
++}
++
++################################################################
++# f_remove: remove temporary files, start and maintain query log
++#
++f_remove()
++{
++ # delete temporary files and directories
++ #
++ f_deltemp
++
++ # kill existing domain query log background process,
++ # housekeeping and start of a new process on daily basis
++ #
++ if [ "${query_ok}" = "true" ] && [ "${ntp_ok}" = "true" ]
++ then
++ query_date="$(date "+%Y%m%d")"
++ if [ -s "${query_pid}" ] && [ ! -f "${query_file}.${query_date}" ]
++ then
++ kill -9 $(< "${query_pid}") 2>/dev/null
++ > "${query_pid}"
++ find "${backup_dir}" -maxdepth 1 -type f -mtime +${query_history} -name "${query_name}.*" -exec rm -f {} \; 2>/dev/null
++ /usr/bin/logger -t "adblock[${pid}]" "kill old query log background process and do logfile housekeeping"
++ fi
++ if [ ! -s "${query_pid}" ]
++ then
++ ( logread -f 2>/dev/null & printf -n "$!" > "${query_pid}" ) | egrep -o "(query\[A\].*)|([a-z0-9\.\-]* is ${query_ip}$)" >> "${query_file}.${query_date}" &
++ /usr/bin/logger -t "adblock[${pid}]" "start new domain query log background process"
++ fi
++ fi
++
++ # final log entry
++ #
++ /usr/bin/logger -t "adblock[${pid}]" "domain adblock processing finished (${script_ver})"
++}
++
++#####################################################
++# f_restore: if available, restore last adlist backup
++#
++f_restore()
++{
++ if [ "${backup_ok}" = "true" ] && [ -f "${backup_file}" ]
++ then
++ cp -f "${backup_file}" "${dns_file}" 2>/dev/null
++ /usr/bin/logger -t "adblock[${pid}]" "${restore_msg}, adlist backup restored"
++ printf "$(/bin/date "+%d.%m.%Y %H:%M:%S") - error: ${restore_msg}, adlist backup restored" >> "${log_file}"
++ else
++ > "${dns_file}"
++ /usr/bin/logger -t "adblock[${pid}]" "${restore_msg}, empty adlist generated"
++ printf "$(/bin/date "+%d.%m.%Y %H:%M:%S") - error: ${restore_msg}, empty adlist generated" >> "${log_file}"
++ fi
++ # restart dnsmasq
++ #
++ /etc/init.d/dnsmasq restart >/dev/null 2>&1
++
++ # remove files and exit
++ #
++ f_remove
++ exit 100
++}
++
++#######################################################
++# f_wancheck: check for usable adblock update interface
++#
++f_wancheck()
++{
++ if [ "${wan_ok}" = "true" ]
++ then
++ # wait for wan update interface(s)
++ #
++ while [ $((cnt)) -le $((max_cnt)) ]
++ do
++ for dev in ${wan_dev}
++ do
++ dev_out=$(< /sys/class/net/${dev}/operstate 2>/dev/null)
++ if [[ "${dev_out}" = "up" ]]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "get wan/update interface: ${dev}, after ${cnt} loops"
++ break 2
++ elif [ $((cnt)) -eq $((max_cnt)) ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "no wan/update interface(s) found (${wan_dev})"
++ printf "$(/bin/date "+%d.%m.%Y %H:%M:%S") - error: no wan/update interface(s) found (${wan_dev})" >> "${log_file}"
++ restore_msg="no wan/update interface(s)"
++ f_restore
++ fi
++ done
++ sleep 1
++ cnt=$((cnt + 1))
++ done
++ fi
++}
++
++#####################################
++# f_ntpcheck: check/get ntp time sync
++#
++f_ntpcheck()
++{
++ if [ "${ntp_ok}" = "true" ]
++ then
++ # prepare ntp server pool
++ #
++ unset ntp_pool
++ for srv in ${ntp_srv}
++ do
++ ntp_pool="${ntp_pool} -p ${srv}"
++ done
++
++ # wait for ntp time sync
++ #
++ while [ $((cnt)) -le $((max_cnt)) ]
++ do
++ /usr/sbin/ntpd -nq ${ntp_pool} >/dev/null 2>&1
++ rc=$?
++ if [ $((rc)) -eq 0 ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "get ntp time sync (${ntp_srv}), after ${cnt} loops"
++ break
++ elif [ $((cnt)) -eq $((max_cnt)) ]
++ then
++ ntp_ok="false"
++ /usr/bin/logger -t "adblock[${pid}]" "ntp time sync failed (${ntp_srv})"
++ printf "$(/bin/date "+%d.%m.%Y %H:%M:%S") - error: ntp time sync failed (${ntp_srv})" >> "${log_file}"
++ restore_msg="time sync failed"
++ f_restore
++ fi
++ sleep 1
++ cnt=$((cnt + 1))
++ done
++ fi
++}
++
++#################################################################
++# f_dnscheck: dnsmasq health check with newly generated blocklist
++#
++f_dnscheck()
++{
++ # check 1: dnsmasq startup
++ #
++ dns_status="$(logread -l 20 -e "dnsmasq" -e "FAILED to start up")"
++ if [ -z "${dns_status}" ]
++ then
++ # check 2: nslookup probe
++ #
++ dns_status="$(nslookup "${check_domain}" 2>/dev/null | grep "${adb_ip}")"
++ if [ -z "${dns_status}" ]
++ then
++ # create backup of new block list only, if both checks are OK and backup enabled
++ #
++ if [ "${backup_ok}" = "true" ]
++ then
++ cp -f "${dns_file}" "${backup_file}" 2>/dev/null
++ /usr/bin/logger -t "adblock[${pid}]" "new block list with ${adb_count} domains loaded, backup generated"
++ else
++ /usr/bin/logger -t "adblock[${pid}]" "new block list with ${adb_count} domains loaded"
++ fi
++ else
++ restore_msg="nslookup probe failed"
++ f_restore
++ fi
++ else
++ restore_msg="dnsmasq probe failed"
++ f_restore
++ fi
++}
++
++##########################################################
++# f_footer: write footer with a few statistics to dns file
++#
++f_footer()
++{
++ # count result of merged domain entries
++ #
++ adb_count="$(wc -l < "${dns_file}")"
++
++ # write file footer with timestamp and merged ad count sum
++ #
++ printf "%s\n" "###################################################" >> "${dns_file}"
++ printf "%s\n" "# last adblock file update: $(date +"%d.%m.%Y - %T")" >> "${dns_file}"
++ printf "%s\n" "# ${0##*/} (${script_ver}) - ${adb_count} ad/abuse domains blocked" >> "${dns_file}"
++ printf "%s\n" "# domain blacklist sources:" >> "${dns_file}"
++ for src in ${adb_source}
++ do
++ url="$(printf "${src}" | sed 's/\(\&ruleset=.*\)//g')"
++ printf "%s\n" "# ${url}" >> "${dns_file}"
++ done
++ printf "%s\n" "###################################################" >> "${dns_file}"
++ printf "%s\n" "# domain whitelist source:" >> "${dns_file}"
++ printf "%s\n" "# ${adb_whitelist}" >> "${dns_file}"
++ printf "%s\n" "###################################################" >> "${dns_file}"
++}
+diff --git a/feeds/packages/net/adblock/files/usr/bin/adblock-update.sh b/feeds/packages/net/adblock/files/usr/bin/adblock-update.sh
+new file mode 100755
+index 0000000..4e9b88c
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/usr/bin/adblock-update.sh
+@@ -0,0 +1,209 @@
++#!/bin/sh
++#######################################################
++# ad/abuse domain blocking script for dnsmasq/openwrt #
++# written by Dirk Brenken (dirk@brenken.org) #
++#######################################################
++
++# LICENSE
++# ========
++# This program is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++###############
++# environment #
++###############
++
++# set script version
++#
++script_ver="0.11.0"
++
++# get current pid and script directory
++#
++pid=$$
++script_dir="$(printf "${0}" | sed 's/\(.*\)\/.*/\1/')"
++
++# set temp variables
++#
++tmp_file="$(mktemp -tu)"
++tmp_dir="$(mktemp -d)"
++
++# source in adblock configuration
++#
++if [ -r "/etc/adblock/adblock.conf" ]
++then
++ . "/etc/adblock/adblock.conf"
++else
++ /usr/bin/logger -t "adblock[${pid}]" "adblock configuration not found"
++ rm -rf "${tmp_dir}" 2>/dev/null
++ exit 200
++fi
++
++# source in adblock function library
++#
++if [ -r "${script_dir}/adblock-helper.sh" ]
++then
++ . "${script_dir}/adblock-helper.sh"
++else
++ /usr/bin/logger -t "adblock[${pid}]" "adblock function library not found"
++ rm -rf "${tmp_dir}" 2>/dev/null
++ exit 210
++fi
++
++################
++# main program #
++################
++
++# call restore function on trap signals (HUP, INT, QUIT, BUS, SEGV, TERM)
++#
++trap "restore_msg='trap error'; f_restore" 1 2 3 10 11 15
++
++# start logging
++#
++/usr/bin/logger -t "adblock[${pid}]" "domain adblock processing started (${script_ver})"
++
++# check environment
++#
++f_envcheck
++
++# check wan update interface(s)
++#
++f_wancheck
++
++# check for ntp time sync
++#
++f_ntpcheck
++
++# download shallalist archive
++#
++if [ "${shalla_ok}" = "true" ]
++then
++ curl --insecure --max-time "${max_time}" "${shalla_url}" -o "${shalla_archive}" 2>/dev/null
++ rc=$?
++ if [ $((rc)) -eq 0 ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "shallalist archive download finished"
++ else
++ /usr/bin/logger -t "adblock[${pid}]" "shallalist archive download failed (${shalla_url})"
++ printf "$(/bin/date "+%d.%m.%Y %H:%M:%S") - error: shallalist archive download failed (${shalla_url})" >> "${log_file}"
++ restore_msg="archive download failed"
++ f_restore
++ fi
++
++ # extract shallalist archive
++ #
++ tar -xzf "${shalla_archive}" -C "${tmp_dir}" 2>/dev/null
++ rc=$?
++ if [ $((rc)) -eq 0 ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "shallalist archive extraction finished"
++ else
++ /usr/bin/logger -t "adblock[${pid}]" "shallalist archive extraction failed"
++ printf "$(/bin/date "+%d.%m.%Y %H:%M:%S") - error: shallalist archive extraction failed" >> "${log_file}"
++ restore_msg="archive extraction failed"
++ f_restore
++ fi
++
++ # merge selected shallalist categories
++ #
++ > "${shalla_file}"
++ for category in ${shalla_cat}
++ do
++ if [ -f "${tmp_dir}/BL/${category}/domains" ]
++ then
++ cat "${tmp_dir}/BL/${category}/domains" >> "${shalla_file}" 2>/dev/null
++ rc=$?
++ else
++ rc=220
++ fi
++ if [ $((rc)) -ne 0 ]
++ then
++ break
++ fi
++ done
++
++ # finish shallalist (pre-)processing
++ #
++ if [ $((rc)) -eq 0 ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "shallalist (pre-)processing finished (${shalla_cat})"
++ else
++ /usr/bin/logger -t "adblock[${pid}]" "shallalist category merge failed (${rc}, ${shalla_cat})"
++ printf "$(/bin/date "+%d.%m.%Y %H:%M:%S") - error: shallalist category merge failed (${rc}, ${shalla_cat})" >> "${log_file}"
++ restore_msg="shallalist merge failed"
++ f_restore
++ fi
++fi
++
++# loop through domain source list,
++# prepare output and store all extracted domains in temp file
++#
++for src in ${adb_source}
++do
++ # download selected adblock sources
++ #
++ url="$(printf "${src}" | sed 's/\(\&ruleset=.*\)//g')"
++ check_url="$(printf "${url}" | sed -n '/^https:/p')"
++ if [ -n "${check_url}" ]
++ then
++ tmp_var="$(wget --timeout="${max_time}" --tries=1 --output-document=- "${url}" 2>/dev/null)"
++ rc=$?
++ else
++ tmp_var="$(curl --insecure --max-time "${max_time}" "${url}" 2>/dev/null)"
++ rc=$?
++ fi
++
++ # check download result and prepare domain output by regex patterns
++ #
++ if [ $((rc)) -eq 0 ] && [ -n "${tmp_var}" ]
++ then
++ eval "$(printf "${src}" | sed 's/\(.*\&ruleset=\)/ruleset=\$rset_/g')"
++ tmp_var="$(printf "%s\n" "${tmp_var}" | tr '[[:upper:]]' '[[:lower:]]')"
++ adb_count="$(printf "%s\n" "${tmp_var}" | eval "${ruleset}" | tee -a "${tmp_file}" | wc -l)"
++ /usr/bin/logger -t "adblock[${pid}]" "source download finished (${url}, ${adb_count} entries)"
++ elif [ $((rc)) -eq 0 ] && [ -z "${tmp_var}" ]
++ then
++ /usr/bin/logger -t "adblock[${pid}]" "empty source download finished (${url})"
++ else
++ /usr/bin/logger -t "adblock[${pid}]" "source download failed (${url})"
++ printf "$(/bin/date "+%d.%m.%Y %H:%M:%S") - error: source download failed (${url})" >> "${log_file}"
++ restore_msg="download failed"
++ f_restore
++ fi
++done
++
++# create empty destination file
++#
++> "${dns_file}"
++
++# rewrite ad/abuse domain information to dns file,
++# remove duplicates and whitelist entries
++#
++grep -vxf "${adb_whitelist}" < "${tmp_file}" | eval "${dns_format}" | sort -u 2>/dev/null >> "${dns_file}"
++
++# write dns file footer
++#
++f_footer
++
++# restart dnsmasq with newly generated block list
++#
++/etc/init.d/dnsmasq restart >/dev/null 2>&1
++sleep 2
++
++# dnsmasq health check
++#
++f_dnscheck
++
++# remove files and exit
++#
++f_remove
++exit 0
+diff --git a/feeds/packages/net/adblock/files/www/adblock/adblock.html b/feeds/packages/net/adblock/files/www/adblock/adblock.html
+new file mode 100644
+index 0000000..cc8d213
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/www/adblock/adblock.html
+@@ -0,0 +1,6 @@
++<html>
++ <head></head>
++ <body>
++ <img src="/adblock.png" border=0 alt=""></img>
++ </body>
++</html>
+diff --git a/feeds/packages/net/adblock/files/www/adblock/adblock.png b/feeds/packages/net/adblock/files/www/adblock/adblock.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
+GIT binary patch
+literal 68
+zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J
+Q1PU{Fy85}Sb4q9e0B4a5jsO4v
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/packages/net/adblock/files/www/adblock/index.html b/feeds/packages/net/adblock/files/www/adblock/index.html
+new file mode 100644
+index 0000000..cc8d213
+--- /dev/null
++++ b/feeds/packages/net/adblock/files/www/adblock/index.html
+@@ -0,0 +1,6 @@
++<html>
++ <head></head>
++ <body>
++ <img src="/adblock.png" border=0 alt=""></img>
++ </body>
++</html>
+diff --git a/feeds/packages/net/aircrack-ng/Makefile b/feeds/packages/net/aircrack-ng/Makefile
+new file mode 100644
+index 0000000..fed4ab2
+--- /dev/null
++++ b/feeds/packages/net/aircrack-ng/Makefile
+@@ -0,0 +1,52 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=aircrack-ng
++PKG_VERSION:=1.2-rc1
++PKG_RELEASE:=1
++PKG_LICENSE:=GPLv2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://download.aircrack-ng.org/ \
++ http://archive.aircrack-ng.org/aircrack-ng/$(PKG_VERSION)/
++PKG_MD5SUM:=c2f8648c92f7e46051c86c618d4fb0d5
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/aircrack-ng
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libpcap +libpthread +libopenssl +libnl-core +libnl-genl +wireless-tools +ethtool
++ TITLE:=WLAN tools for breaking 802.11 WEP/WPA keys
++ URL:=http://www.aircrack-ng.org/
++ MAINTAINER:=Rick Farina <zerochaos@gentoo.org>
++ SUBMENU:=wireless
++endef
++
++define Package/aircrack-ng/description
++ WLAN tools for breaking 802.11 WEP/WPA keys
++endef
++
++MAKE_FLAGS += prefix=/usr \
++ libnl=true \
++ sqlite=false \
++ unstable=false \
++ OSNAME=Linux
++
++define Package/aircrack-ng/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/* $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,aircrack-ng))
+diff --git a/feeds/packages/net/announce/Makefile b/feeds/packages/net/announce/Makefile
+new file mode 100644
+index 0000000..60d9e63
+--- /dev/null
++++ b/feeds/packages/net/announce/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=announce
++PKG_VERSION:=1.0.1
++PKG_RELEASE:=1
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=src/LICENSE.txt
++PKG_MAINTAINER:=Simon Peter <probono@puredarwin.org>
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/probonopd/announce.git
++PKG_SOURCE_VERSION:=1368525c7305ca5bb4134242f332344f5f7e94e3
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION)
++PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++PKG_BUILD_DEPENDS:= +libpthread
++
++define Package/announce
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ TITLE:=Announce services on the network with Zeroconf/Bonjour
++ URL:=https://github.com/probonopd/announce
++ DEPENDS:= +libpthread
++endef
++
++define Package/announce/description
++ Announce services on the network with Zeroconf/Bonjour.
++ This announces services such as ssh, sftp, and http running on the local machine
++ to the network.
++endef
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ $(CP) $(PKG_BUILD_DIR)/src/* $(PKG_BUILD_DIR)/
++endef
++
++define Package/announce/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/announce $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/announce.initscript $(1)/etc/init.d/announce
++endef
++
++$(eval $(call BuildPackage,announce))
+diff --git a/feeds/packages/net/apache/Makefile b/feeds/packages/net/apache/Makefile
+new file mode 100644
+index 0000000..f5de163
+--- /dev/null
++++ b/feeds/packages/net/apache/Makefile
+@@ -0,0 +1,166 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=apache
++PKG_VERSION:=2.2.31
++PKG_RELEASE:=1
++PKG_SOURCE_NAME:=httpd
++PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
++PKG_LICENSE:=Apache License
++
++PKG_SOURCE:=$(PKG_SOURCE_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://mirrors.ibiblio.org/apache/httpd/ \
++ http://apache.imsam.info/httpd/
++PKG_MD5SUM:=6c10e15835ab214464228a9beb7afba8
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_NAME)-$(PKG_VERSION)
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/apache/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Web Servers/Proxies
++ TITLE:=The Apache Web Server
++ URL:=http://httpd.apache.org/
++endef
++
++define Package/apache/Default/description
++ The Apache Web Server is a powerful and flexible HTTP/1.1 compliant
++ web server. Originally designed as a replacement for the NCSA HTTP
++ Server, it has grown to be the most popular web server on the Internet.
++endef
++
++define Package/apache
++$(call Package/apache/Default)
++ DEPENDS:=+libapr +libaprutil +libpcre +libopenssl +unixodbc
++endef
++
++define Package/apache/description
++$(call Package/apache/Default/description)
++ .
++ This package contains the Apache web server and utility programs.
++ .
++ Take care that you don't include apache at the moment into your image
++ please select it only as module because busybox will override
++ /usr/sbin/httpd. It'll be solved soon. If you need to include this
++ package in the image anyway, remove httpd from busybox
++ (Base system --> Configuration --> Networking Utilities --> httpd).
++ Also you should take care for the initscripts, apache's httpd isn't
++ compatible with the one from busybox, so if you want to use apache
++ for running your webif, you'll need to change the parameters in the
++ scripts and configure the rest in /etc/httpd.conf.
++endef
++
++define Package/apache/conffiles
++/etc/apache/httpd.conf
++/etc/apache/extra/httpd-autoindex.conf
++/etc/apache/extra/httpd-dav.conf
++/etc/apache/extra/httpd-default.conf
++/etc/apache/extra/httpd-info.conf
++/etc/apache/extra/httpd-languages.conf
++/etc/apache/extra/httpd-manual.conf
++/etc/apache/extra/httpd-mpm.conf
++/etc/apache/extra/httpd-multilang-errordoc.conf
++/etc/apache/extra/httpd-ssl.conf
++/etc/apache/extra/httpd-userdir.conf
++/etc/apache/extra/httpd-vhosts.conf
++/etc/apache/magic
++/etc/apache/mime.types
++endef
++
++define Package/apache-icons
++$(call Package/apache/Default)
++ TITLE:=Icons from Apache
++ DEPENDS:=apache
++endef
++
++define Package/apache-icons/description
++$(call Package/apache/Default/description)
++ .
++ This package contains the icons from Apache.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++TARGET_CPPFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --with-apr="$(STAGING_DIR)/usr/bin/apr-1-config" \
++ --with-apr-util="$(STAGING_DIR)/usr/bin/apu-1-config" \
++ --with-pcre="$(STAGING_DIR)/usr/bin/pcre-config" \
++ --enable-http \
++ --enable-ssl \
++ --enable-proxy \
++ --disable-disk-cache \
++ --enable-maintainer-mode \
++ --enable-mime-magic \
++ --without-suexec-bin \
++ --sysconfdir=/etc/apache \
++ ap_cv_void_ptr_lt_long=no \
++ logfiledir="/var/log" \
++ runtimedir="/var/run" \
++ )
++endef
++
++define Build/InstallDev
++ rm -rf $(PKG_INSTALL_DIR)/usr/man/ \
++ $(PKG_INSTALL_DIR)/usr/share/manual/
++ # if you need docs take a look into the build-dir :)
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_INSTALL_DIR)/etc/* \
++ $(1)/etc
++ $(INSTALL_DIR) $(1)/usr/include/apache
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* \
++ $(1)/usr/include/apache
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/httpd.exp \
++ $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/* \
++ $(1)/usr/sbin
++ $(INSTALL_DIR) $(1)/usr/share
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/* \
++ $(1)/usr/share
++endef
++
++define Package/apache/preinst
++ rm /usr/sbin/httpd
++ echo -e "You should take a look in the initscripts, busybox's httpd \n\
++ uses some parameters which are maybe unsupported by apache."
++endef
++
++define Package/apache/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ # we don't need apxs on the router, it's just for building apache modules.
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/{ab,apachectl,checkgid,dbmmanage,envvars,envvars-std,htcacheclean,htdbm,htdigest,htpasswd,httpd,httxt2dbm,logresolve,rotatelogs} $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/httpd.exp $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/share
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/{error,htdocs,cgi-bin,build} $(1)/usr/share/
++ $(INSTALL_DIR) $(1)/etc/apache
++ $(CP) $(PKG_INSTALL_DIR)/etc/apache/{httpd.conf,magic,mime.types,extra} $(1)/etc/apache/
++endef
++
++define Package/apache/postrm
++ rm -rf /usr/sbin/httpd
++ ln -s /bin/busybox /usr/sbin/httpd
++ echo -e "You may need to change your initscripts back for the use \n\
++ with busybox's httpd."
++endef
++
++define Package/apache-icons/install
++ $(INSTALL_DIR) $(1)/usr/share
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/icons $(1)/usr/share/
++endef
++
++$(eval $(call BuildPackage,apache))
++$(eval $(call BuildPackage,apache-icons))
+diff --git a/feeds/packages/net/apache/patches/001-Makefile_in.patch b/feeds/packages/net/apache/patches/001-Makefile_in.patch
+new file mode 100644
+index 0000000..0bccfd3
+--- /dev/null
++++ b/feeds/packages/net/apache/patches/001-Makefile_in.patch
+@@ -0,0 +1,14 @@
++--- a/server/Makefile.in
+++++ b/server/Makefile.in
++@@ -26,7 +26,10 @@ gen_test_char: $(gen_test_char_OBJECTS)
++ $(LINK) $(EXTRA_LDFLAGS) $(gen_test_char_OBJECTS) $(EXTRA_LIBS)
++
++ test_char.h: gen_test_char
++- ./gen_test_char > test_char.h
+++ true
+++# ./gen_test_char > test_char.h
+++# doesn't matter if you run it on the buildhost or on an wl500gd,
+++# same output on both, so i just patched in the test_char.h :).
++
++ util.lo: test_char.h
++
+diff --git a/feeds/packages/net/apache/patches/002-test_char_h.patch b/feeds/packages/net/apache/patches/002-test_char_h.patch
+new file mode 100644
+index 0000000..e8ea3cd
+--- /dev/null
++++ b/feeds/packages/net/apache/patches/002-test_char_h.patch
+@@ -0,0 +1,26 @@
++--- /dev/null
+++++ b/server/test_char.h
++@@ -0,0 +1,23 @@
+++/* this file is automatically generated by gen_test_char, do not edit */
+++#define T_ESCAPE_SHELL_CMD (1)
+++#define T_ESCAPE_PATH_SEGMENT (2)
+++#define T_OS_ESCAPE_PATH (4)
+++#define T_HTTP_TOKEN_STOP (8)
+++#define T_ESCAPE_LOGITEM (16)
+++#define T_ESCAPE_FORENSIC (32)
+++
+++static const unsigned char test_char_table[256] = {
+++ 32,62,62,62,62,62,62,62,62,62,63,62,62,62,62,62,62,62,62,62,
+++ 62,62,62,62,62,62,62,62,62,62,62,62,14,0,23,6,1,38,1,1,
+++ 9,9,1,0,8,0,0,10,0,0,0,0,0,0,0,0,0,0,40,15,
+++ 15,8,15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+++ 0,0,0,0,0,0,0,0,0,0,0,15,31,15,7,0,7,0,0,0,
+++ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+++ 0,0,0,15,39,15,1,62,54,54,54,54,54,54,54,54,54,54,54,54,
+++ 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,
+++ 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,
+++ 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,
+++ 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,
+++ 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,
+++ 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54
+++};
+diff --git a/feeds/packages/net/apache/patches/003-logdir_fix.patch b/feeds/packages/net/apache/patches/003-logdir_fix.patch
+new file mode 100644
+index 0000000..635c65c
+--- /dev/null
++++ b/feeds/packages/net/apache/patches/003-logdir_fix.patch
+@@ -0,0 +1,33 @@
++--- a/build/mkconfNW.awk
+++++ b/build/mkconfNW.awk
++@@ -24,7 +24,7 @@ BEGIN {
++ A["sysconfdir"] = "conf"
++ A["iconsdir"] = "icons"
++ A["manualdir"] = "manual"
++- A["runtimedir"] = "logs"
+++ A["runtimedir"] = "log"
++ A["errordir"] = "error"
++ A["proxycachedir"] = "proxy"
++
++--- a/config.layout
+++++ b/config.layout
++@@ -28,8 +28,8 @@
++ cgidir: ${datadir}/cgi-bin
++ includedir: ${prefix}/include
++ localstatedir: ${prefix}
++- runtimedir: ${localstatedir}/logs
++- logfiledir: ${localstatedir}/logs
+++ runtimedir: ${localstatedir}/log
+++ logfiledir: ${localstatedir}/log
++ proxycachedir: ${localstatedir}/proxy
++ </Layout>
++
++@@ -150,7 +150,7 @@
++ includedir: ${prefix}/include
++ localstatedir: /var${prefix}
++ runtimedir: ${localstatedir}/run
++- logfiledir: ${localstatedir}/logs
+++ logfiledir: ${localstatedir}/log
++ proxycachedir: ${localstatedir}/proxy
++ </Layout>
++
+diff --git a/feeds/packages/net/apache/patches/004-pidfile_fix.patch b/feeds/packages/net/apache/patches/004-pidfile_fix.patch
+new file mode 100644
+index 0000000..e9f0b6d
+--- /dev/null
++++ b/feeds/packages/net/apache/patches/004-pidfile_fix.patch
+@@ -0,0 +1,11 @@
++--- a/include/scoreboard.h
+++++ b/include/scoreboard.h
++@@ -42,7 +42,7 @@ extern "C" {
++
++ /* Scoreboard file, if there is one */
++ #ifndef DEFAULT_SCOREBOARD
++-#define DEFAULT_SCOREBOARD "logs/apache_runtime_status"
+++#define DEFAULT_SCOREBOARD "log/apache_runtime_status"
++ #endif
++
++ /* Scoreboard info on a process is, for now, kept very brief ---
+diff --git a/feeds/packages/net/apache/patches/005-httpd_conf.patch b/feeds/packages/net/apache/patches/005-httpd_conf.patch
+new file mode 100644
+index 0000000..60f0dca
+--- /dev/null
++++ b/feeds/packages/net/apache/patches/005-httpd_conf.patch
+@@ -0,0 +1,60 @@
++--- a/docs/conf/httpd.conf.in
+++++ b/docs/conf/httpd.conf.in
++@@ -51,7 +51,6 @@ Listen @@Port@@
++ # Example:
++ # LoadModule foo_module modules/mod_foo.so
++ #
++-@@LoadModule@@
++
++ <IfModule !mpm_netware_module>
++ <IfModule !mpm_winnt_module>
++@@ -63,8 +62,8 @@ Listen @@Port@@
++ # It is usually good practice to create a dedicated user and group for
++ # running httpd, as with most system services.
++ #
++-User daemon
++-Group daemon
+++User nobody
+++Group nogroup
++
++ </IfModule>
++ </IfModule>
++@@ -191,7 +190,7 @@ ErrorLog "@rel_logfiledir@/error_log"
++ # Possible values include: debug, info, notice, warn, error, crit,
++ # alert, emerg.
++ #
++-LogLevel warn
+++LogLevel debug
++
++ <IfModule log_config_module>
++ #
++@@ -336,7 +335,7 @@ DefaultType text/plain
++ # contents of the file itself to determine its type. The MIMEMagicFile
++ # directive tells the module where the hint definitions are located.
++ #
++-#MIMEMagicFile @rel_sysconfdir@/magic
+++MIMEMagicFile @rel_sysconfdir@/magic
++
++ #
++ # Customizable error responses come in three flavors:
++@@ -358,7 +357,7 @@ DefaultType text/plain
++ # broken on your system.
++ #
++ #EnableMMAP off
++-#EnableSendfile off
+++EnableSendfile off
++
++ # Supplemental configuration
++ #
++@@ -404,7 +403,7 @@ DefaultType text/plain
++ # starting without SSL on platforms with no /dev/random equivalent
++ # but a statically compiled-in mod_ssl.
++ #
++-<IfModule ssl_module>
++-SSLRandomSeed startup builtin
++-SSLRandomSeed connect builtin
++-</IfModule>
+++#<IfModule ssl_module>
+++#SSLRandomSeed startup builtin
+++#SSLRandomSeed connect builtin
+++#</IfModule>
+diff --git a/feeds/packages/net/apcupsd/Makefile b/feeds/packages/net/apcupsd/Makefile
+new file mode 100644
+index 0000000..fd8236d
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/Makefile
+@@ -0,0 +1,106 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=apcupsd
++PKG_VERSION:=3.14.13
++PKG_RELEASE:=4
++
++PKG_MAINTAINER:=Othmar Truniger <github@truniger.ch>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/apcupsd
++PKG_MD5SUM:=c291d9d3923b4d9c0e600b755ad4f489
++
++PKG_BUILD_DEPENDS:=libgd
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/apcupsd
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libpthread +libusb-compat
++ TITLE:=UPS control software
++ URL:=http://www.apcupsd.org/
++endef
++
++define Package/apcupsd-cgi
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libpthread +libgd
++ TITLE:=UPS control software CGI module
++ URL:=http://www.apcupsd.org/
++endef
++
++define Build/Configure
++ $(CP) $(SCRIPT_DIR)/config.* $(PKG_BUILD_DIR)/autoconf/
++ $(call Build/Configure/Default, \
++ --with-distname=unknown \
++ --sysconfdir=/etc/apcupsd \
++ --enable-cgi \
++ --enable-usb \
++ --enable-modbus-usb \
++ --without-x \
++ )
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ LD="$(TARGET_CC)" \
++ all install
++endef
++
++define Package/apcupsd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/apcupsd $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/smtp $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/apctest $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/apcaccess $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/apcupsd
++ $(INSTALL_CONF) ./files/apcupsd.conf $(1)/etc/apcupsd/
++ $(INSTALL_CONF) ./files/apcupsd_mail.conf $(1)/etc/apcupsd/
++ $(INSTALL_BIN) ./files/changeme $(1)/etc/apcupsd/
++ $(INSTALL_BIN) ./files/commfailure $(1)/etc/apcupsd/
++ $(INSTALL_BIN) ./files/commok $(1)/etc/apcupsd/
++ $(INSTALL_BIN) ./files/offbattery $(1)/etc/apcupsd/
++ $(INSTALL_BIN) ./files/onbattery $(1)/etc/apcupsd/
++ $(INSTALL_BIN) ./files/apccontrol $(1)/etc/apcupsd/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/apcupsd.init $(1)/etc/init.d/apcupsd
++endef
++
++define Package/apcupsd-cgi/install
++ $(INSTALL_DIR) $(1)/www/cgi-bin/apcupsd
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/etc/apcupsd/*.cgi $(1)/www/cgi-bin/apcupsd
++ $(INSTALL_DIR) $(1)/etc/apcupsd
++ $(INSTALL_CONF) ./files/apcupsd.css $(1)/etc/apcupsd/
++ $(INSTALL_CONF) ./files/hosts.conf $(1)/etc/apcupsd/
++ $(INSTALL_CONF) ./files/multimon.conf $(1)/etc/apcupsd/
++endef
++
++define Package/apcupsd/conffiles
++/etc/apcupsd/apcupsd.conf
++/etc/apcupsd/apcupsd_mail.conf
++/etc/apcupsd/changeme
++/etc/apcupsd/commfailure
++/etc/apcupsd/commok
++/etc/apcupsd/offbattery
++/etc/apcupsd/onbattery
++endef
++
++define Package/apcupsd-cgi/conffiles
++/etc/apcupsd/apcupsd.css
++/etc/apcupsd/hosts.conf
++/etc/apcupsd/multimon.conf
++endef
++
++$(eval $(call BuildPackage,apcupsd))
++$(eval $(call BuildPackage,apcupsd-cgi))
+diff --git a/feeds/packages/net/apcupsd/files/apccontrol b/feeds/packages/net/apcupsd/files/apccontrol
+new file mode 100644
+index 0000000..2549354
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/apccontrol
+@@ -0,0 +1,146 @@
++#!/bin/sh
++#
++# Copyright (C) 1999-2002 Riccardo Facchetti <riccardo@master.oasi.gpa.it>
++#
++# for apcupsd release 3.14.1 (04 May 2007) - unknown
++#
++# platforms/apccontrol. Generated from apccontrol.in by configure.
++#
++# Note, this is a generic file that can be used by most
++# systems. If a particular system needs to have something
++# special, start with this file, and put a copy in the
++# platform subdirectory.
++#
++
++#
++# These variables are needed for set up the autoconf other variables.
++#
++prefix=/usr
++exec_prefix=/usr
++
++APCPID=/var/run/apcupsd.pid
++APCUPSD=/usr/sbin/apcupsd
++SHUTDOWN=/sbin/shutdown
++SCRIPTSHELL=/bin/sh
++SCRIPTDIR=/etc/apcupsd
++WALL=true
++
++#
++# Concatenate all output from this script to the events file
++# Note, the following kills the script in a power fail situation
++# where the disks are mounted read-only.
++# exec >>/var/log/apcupsd.events 2>&1
++
++#
++# This piece is to substitute the default behaviour with your own script,
++# perl, or C program.
++# You can customize every single command creating an executable file (may be a
++# script or a compiled program) and calling it the same as the $1 parameter
++# passed by apcupsd to this script.
++#
++# After executing your script, apccontrol continues with the default action.
++# If you do not want apccontrol to continue, exit your script with exit
++# code 99. E.g. "exit 99".
++#
++# WARNING: the apccontrol file will be overwritten every time you update your
++# apcupsd, doing `make install'. Your own customized scripts will _not_ be
++# overwritten. If you wish to make changes to this file (discouraged), you
++# should change apccontrol.sh.in and then rerun the configure process.
++#
++if [ -f ${SCRIPTDIR}/${1} -a -x ${SCRIPTDIR}/${1} ]
++then
++ ${SCRIPTDIR}/${1} ${2} ${3} ${4}
++ # exit code 99 means he does not want us to do default action
++ if [ $? = 99 ] ; then
++ exit 0
++ fi
++fi
++
++case "$1" in
++ killpower)
++ echo "Apccontrol doing: ${APCUPSD} --killpower on UPS ${2}"
++ sleep 10
++ ${APCUPSD} --killpower
++ echo "Apccontrol has done: ${APCUPSD} --killpower on UPS ${2}" | ${WALL}
++ ;;
++ commfailure)
++ echo "Warning communications lost with UPS ${2}" | ${WALL}
++ ;;
++ commok)
++ echo "Communications restored with UPS ${2}" | ${WALL}
++ ;;
++#
++# powerout, onbattery, offbattery, mainsback events occur
++# in that order.
++#
++ powerout)
++ echo "Warning power loss detected on UPS ${2}" | ${WALL}
++ ;;
++ onbattery)
++ echo "Power failure on UPS ${2}. Running on batteries." | ${WALL}
++ ;;
++ offbattery)
++ ;;
++ mainsback)
++ echo "Power has returned on UPS ${2}..." | ${WALL}
++ if [ -f /etc/powerfail ] ; then
++ printf "Continuing with shutdown." | ${WALL}
++ fi
++ ;;
++ failing)
++ echo "Battery power exhaused on UPS ${2}. Doing shutdown." | ${WALL}
++ ;;
++ timeout)
++ echo "Battery time limit exceeded on UPS ${2}. Doing shutdown." | ${WALL}
++ ;;
++ loadlimit)
++ echo "Remaining battery charge below limit on UPS ${2}. Doing shutdown." | ${WALL}
++ ;;
++ runlimit)
++ echo "Remaining battery runtime below limit on UPS ${2}. Doing shutdown." | ${WALL}
++ ;;
++ doreboot)
++ echo "UPS ${2} initiating Reboot Sequence" | ${WALL}
++ ${SHUTDOWN} -r now "apcupsd UPS ${2} initiated reboot"
++ ;;
++ doshutdown)
++ echo "UPS ${2} initiated Shutdown Sequence" | ${WALL}
++ ${SHUTDOWN} -h now "apcupsd UPS ${2} initiated shutdown"
++ ;;
++ annoyme)
++ echo "Power problems with UPS ${2}. Please logoff." | ${WALL}
++ ;;
++ emergency)
++ echo "Emergency Shutdown. Possible battery failure on UPS ${2}." | ${WALL}
++ ;;
++ changeme)
++ echo "Emergency! Batteries have failed on UPS ${2}. Change them NOW" | ${WALL}
++ ;;
++ remotedown)
++ echo "Remote Shutdown. Beginning Shutdown Sequence." | ${WALL}
++ ;;
++ restartme)
++ echo -n "Restarting APCUPSD Power Management: "
++ THEPID=`cat ${APCPID}`
++ kill ${THEPID}
++ rm -f ${APCPID}
++ rm -f /etc/powerfail
++ rm -f /etc/nologin
++ sleep 5
++ `${APCUPSD}`
++ echo "apcupsd"
++ ;;
++ startselftest)
++ ;;
++ endselftest)
++ ;;
++ battdetach)
++ ;;
++ battattach)
++ ;;
++ *) echo "Usage: ${0##*/} command"
++ echo " warning: this script is intended to be launched by"
++ echo " apcupsd and should never be launched by users."
++ exit 1
++ ;;
++esac
+diff --git a/feeds/packages/net/apcupsd/files/apcupsd.conf b/feeds/packages/net/apcupsd/files/apcupsd.conf
+new file mode 100644
+index 0000000..b9acd61
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/apcupsd.conf
+@@ -0,0 +1,322 @@
++## apcupsd.conf v1.1 ##
++#
++# for apcupsd release 3.14.1 (04 May 2007) - unknown
++#
++# "apcupsd" POSIX config file
++
++#
++# ========= General configuration parameters ============
++#
++
++# UPSNAME xxx
++# Use this to give your UPS a name in log files and such. This
++# is particulary useful if you have multiple UPSes. This does not
++# set the EEPROM. It should be 8 characters or less.
++UPSNAME ups1
++
++# UPSCABLE <cable>
++# Defines the type of cable connecting the UPS to your computer.
++#
++# Possible generic choices for <cable> are:
++# simple, smart, ether, usb
++#
++# Or a specific cable model number may be used:
++# 940-0119A, 940-0127A, 940-0128A, 940-0020B,
++# 940-0020C, 940-0023A, 940-0024B, 940-0024C,
++# 940-1524C, 940-0024G, 940-0095A, 940-0095B,
++# 940-0095C, M-04-02-2000
++#
++UPSCABLE smart
++
++# To get apcupsd to work, in addition to defining the cable
++# above, you must also define a UPSTYPE, which corresponds to
++# the type of UPS you have (see the Description for more details).
++# You must also specify a DEVICE, sometimes referred to as a port.
++# For USB UPSes, please leave the DEVICE directive blank. For
++# other UPS types, you must specify an appropriate port or address.
++#
++# UPSTYPE DEVICE Description
++# apcsmart /dev/tty** Newer serial character device,
++# appropriate for SmartUPS models using
++# a serial cable (not USB).
++#
++# usb <BLANK> Most new UPSes are USB. A blank DEVICE
++# setting enables autodetection, which is
++# the best choice for most installations.
++#
++# net hostname:port Network link to a master apcupsd
++# through apcupsd's Network Information
++# Server. This is used if you don't have
++# a UPS directly connected to your computer.
++#
++# snmp hostname:port:vendor:community
++# SNMP Network link to an SNMP-enabled
++# UPS device. Vendor is the MIB used by
++# the UPS device: can be "APC", "APC_NOTRAP"
++# or "RFC" where APC is the powernet MIB,
++# "APC_NOTRAP" is powernet with SNMP trap
++# catching disabled, and RFC is the IETF's
++# rfc1628 UPS-MIB. You usually want "APC".
++# Port is usually 161. Community is usually
++# "private".
++#
++# dumb /dev/tty** Old serial character device for use
++# with simple-signaling UPSes.
++#
++# pcnet ipaddr:username:passphrase
++# PowerChute Network Shutdown protocol
++# which can be used as an alternative to SNMP
++# with AP9617 family of smart slot cards.
++# ipaddr is the IP address of the UPS mgmt
++# card. username and passphrase are the
++# credentials for which the card has been
++# configured.
++#
++UPSTYPE apcsmart
++DEVICE /dev/ttyS0
++
++
++# LOCKFILE <path to lockfile>
++# Path for device lock file. Not used on Win32.
++LOCKFILE /var/lock
++
++# SCRIPTDIR <path to script directory>
++# Directory in which apccontrol and event scripts are located.
++SCRIPTDIR /etc/apcupsd
++
++# PWRFAILDIR <path to powerfail directory>
++# Directory in which to write the powerfail flag file. This file
++# is created when apcupsd initiates a system shutdown and is
++# checked in the OS halt scripts to determine if a killpower
++# (turning off UPS output power) is required.
++PWRFAILDIR /etc
++
++# NOLOGINDIR <path to nologin directory>
++# Directory in which to write the nologin file. The existence
++# of this flag file tells the OS to disallow new logins.
++NOLOGINDIR /etc
++
++
++#
++# ======== Configuration parameters used during power failures ==========
++#
++
++# The ONBATTERYDELAY is the time in seconds from when a power failure
++# is detected until we react to it with an onbattery event.
++#
++# This means that, apccontrol will be called with the powerout argument
++# immediately when a power failure is detected. However, the
++# onbattery argument is passed to apccontrol only after the
++# ONBATTERYDELAY time. If you don't want to be annoyed by short
++# powerfailures, make sure that apccontrol powerout does nothing
++# i.e. comment out the wall.
++#ONBATTERYDELAY 6
++
++#
++# Note: BATTERYLEVEL, MINUTES, and TIMEOUT work in conjunction, so
++# the first that occurs will cause the initation of a shutdown.
++#
++
++# If during a power failure, the remaining battery percentage
++# (as reported by the UPS) is below or equal to BATTERYLEVEL,
++# apcupsd will initiate a system shutdown.
++BATTERYLEVEL 5
++
++# If during a power failure, the remaining runtime in minutes
++# (as calculated internally by the UPS) is below or equal to MINUTES,
++# apcupsd, will initiate a system shutdown.
++MINUTES 3
++
++# If during a power failure, the UPS has run on batteries for TIMEOUT
++# many seconds or longer, apcupsd will initiate a system shutdown.
++# A value of 0 disables this timer.
++#
++# Note, if you have a Smart UPS, you will most likely want to disable
++# this timer by setting it to zero. That way, you UPS will continue
++# on batteries until either the % charge remaing drops to or below BATTERYLEVEL,
++# or the remaining battery runtime drops to or below MINUTES. Of course,
++# if you are testing, setting this to 60 causes a quick system shutdown
++# if you pull the power plug.
++# If you have an older dumb UPS, you will want to set this to less than
++# the time you know you can run on batteries.
++TIMEOUT 0
++
++# Time in seconds between annoying users to signoff prior to
++# system shutdown. 0 disables.
++ANNOY 300
++
++# Initial delay after power failure before warning users to get
++# off the system.
++ANNOYDELAY 60
++
++# The condition which determines when users are prevented from
++# logging in during a power failure.
++# NOLOGON <string> [ disable | timeout | percent | minutes | always ]
++NOLOGON disable
++
++# If KILLDELAY is non-zero, apcupsd will continue running after a
++# shutdown has been requested, and after the specified time in
++# seconds attempt to kill the power. This is for use on systems
++# where apcupsd cannot regain control after a shutdown.
++# KILLDELAY <seconds> 0 disables
++KILLDELAY 0
++
++#
++# ==== Configuration statements for Network Information Server ====
++#
++
++# NETSERVER [ on | off ] on enables, off disables the network
++# information server. If netstatus is on, a network information
++# server process will be started for serving the STATUS and
++# EVENT data over the network (used by CGI programs).
++NETSERVER on
++
++# NISIP <dotted notation ip address>
++# IP address on which NIS server will listen for incoming connections.
++# This is useful if your server is multi-homed (has more than one
++# network interface and IP address). Default value is 0.0.0.0 which
++# means any incoming request will be serviced. Alternatively, you can
++# configure this setting to any specific IP address of your server and
++# NIS will listen for connections only on that interface. Use the
++# loopback address (127.0.0.1) to accept connections only from the
++# local machine.
++NISIP 0.0.0.0
++
++# NISPORT <port> default is 3551 as registered with the IANA
++# port to use for sending STATUS and EVENTS data over the network.
++# It is not used unless NETSERVER is on. If you change this port,
++# you will need to change the corresponding value in the cgi directory
++# and rebuild the cgi programs.
++NISPORT 3551
++
++# If you want the last few EVENTS to be available over the network
++# by the network information server, you must define an EVENTSFILE.
++EVENTSFILE /var/log/apcupsd.events
++
++# EVENTSFILEMAX <kilobytes>
++# By default, the size of the EVENTSFILE will be not be allowed to exceed
++# 10 kilobytes. When the file grows beyond this limit, older EVENTS will
++# be removed from the beginning of the file (first in first out). The
++# parameter EVENTSFILEMAX can be set to a different kilobyte value, or set
++# to zero to allow the EVENTSFILE to grow without limit.
++EVENTSFILEMAX 10
++
++#
++# ========== Configuration statements used if sharing =============
++# a UPS with more than one machine
++
++# NETTIME <int>
++# Interval (in seconds) at which the NIS client polls the server.
++# Used only when this apcupsd is a network client (UPSTYPE net).
++#NETTIME 60
++
++#
++# Remaining items are for ShareUPS (APC expansion card) ONLY
++#
++
++# UPSCLASS [ standalone | shareslave | sharemaster ]
++# Normally standalone unless you share an UPS using an APC ShareUPS
++# card.
++UPSCLASS standalone
++
++# UPSMODE [ disable | share ]
++# Normally disable unless you share an UPS using an APC ShareUPS card.
++UPSMODE disable
++
++#
++# ===== Configuration statements to control apcupsd system logging ========
++#
++
++# Time interval in seconds between writing the STATUS file; 0 disables
++STATTIME 0
++
++# Location of STATUS file (written to only if STATTIME is non-zero)
++STATFILE /var/log/apcupsd.status
++
++# LOGSTATS [ on | off ] on enables, off disables
++# Note! This generates a lot of output, so if
++# you turn this on, be sure that the
++# file defined in syslog.conf for LOG_NOTICE is a named pipe.
++# You probably do not want this on.
++LOGSTATS off
++
++# Time interval in seconds between writing the DATA records to
++# the log file. 0 disables.
++DATATIME 0
++
++# FACILITY defines the logging facility (class) for logging to syslog.
++# If not specified, it defaults to "daemon". This is useful
++# if you want to separate the data logged by apcupsd from other
++# programs.
++#FACILITY DAEMON
++
++#
++# ========== Configuration statements used in updating the UPS EPROM =========
++#
++
++#
++# These statements are used only by apctest when choosing "Set EEPROM with conf
++# file values" from the EEPROM menu. THESE STATEMENTS HAVE NO EFFECT ON APCUPSD.
++#
++
++# UPS name, max 8 characters
++#UPSNAME UPS_IDEN
++
++# Battery date - 8 characters
++#BATTDATE mm/dd/yy
++
++# Sensitivity to line voltage quality (H cause faster transfer to batteries)
++# SENSITIVITY H M L (default = H)
++#SENSITIVITY H
++
++# UPS delay after power return (seconds)
++# WAKEUP 000 060 180 300 (default = 0)
++#WAKEUP 60
++
++# UPS Grace period after request to power off (seconds)
++# SLEEP 020 180 300 600 (default = 20)
++#SLEEP 180
++
++# Low line voltage causing transfer to batteries
++# The permitted values depend on your model as defined by last letter
++# of FIRMWARE or APCMODEL. Some representative values are:
++# D 106 103 100 097
++# M 177 172 168 182
++# A 092 090 088 086
++# I 208 204 200 196 (default = 0 => not valid)
++#LOTRANSFER 208
++
++# High line voltage causing transfer to batteries
++# The permitted values depend on your model as defined by last letter
++# of FIRMWARE or APCMODEL. Some representative values are:
++# D 127 130 133 136
++# M 229 234 239 224
++# A 108 110 112 114
++# I 253 257 261 265 (default = 0 => not valid)
++#HITRANSFER 253
++
++# Battery charge needed to restore power
++# RETURNCHARGE 00 15 50 90 (default = 15)
++#RETURNCHARGE 15
++
++# Alarm delay
++# 0 = zero delay after pwr fail, T = power fail + 30 sec, L = low battery, N = never
++# BEEPSTATE 0 T L N (default = 0)
++#BEEPSTATE T
++
++# Low battery warning delay in minutes
++# LOWBATT 02 05 07 10 (default = 02)
++#LOWBATT 2
++
++# UPS Output voltage when running on batteries
++# The permitted values depend on your model as defined by last letter
++# of FIRMWARE or APCMODEL. Some representative values are:
++# D 115
++# M 208
++# A 100
++# I 230 240 220 225 (default = 0 => not valid)
++#OUTPUTVOLTS 230
++
++# Self test interval in hours 336=2 weeks, 168=1 week, ON=at power on
++# SELFTEST 336 168 ON OFF (default = 336)
++#SELFTEST 336
+diff --git a/feeds/packages/net/apcupsd/files/apcupsd.css b/feeds/packages/net/apcupsd/files/apcupsd.css
+new file mode 100644
+index 0000000..e98c75e
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/apcupsd.css
+@@ -0,0 +1,64 @@
++body {
++ color: black;
++ background: white;
++}
++
++div.Center {
++ text-align: center;
++}
++
++img {
++ border-style: none;
++}
++
++pre {
++ text-align: left;
++}
++
++strong {
++ color: red;
++}
++
++table.Outer {
++ color: black;
++ background: #60a0a0;
++ empty-cells: show; border: solid #60a0a0
++}
++
++th.Outer {
++ color: black;
++ background: #60b0b0
++}
++
++.Title {
++ font-size: 18pt;
++}
++
++.SubTitle {
++ font-size: 12pt;
++}
++
++.Empty {
++ color: black;
++ background: aqua;
++}
++
++.Fault {
++ color: black;
++ background: red;
++}
++
++.Label {
++ color: black;
++ background: aqua;
++}
++
++.Normal {
++ color: black;
++ background: lime;
++}
++
++.Warning {
++ color: black;
++ background: yellow;
++}
+diff --git a/feeds/packages/net/apcupsd/files/apcupsd.init b/feeds/packages/net/apcupsd/files/apcupsd.init
+new file mode 100644
+index 0000000..5454377
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/apcupsd.init
+@@ -0,0 +1,12 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006 OpenWrt.org
++START=50
++STOP=50
++
++start() {
++ /usr/sbin/apcupsd -f /etc/apcupsd/apcupsd.conf
++}
++
++stop() {
++ kill $(cat /var/run/apcupsd.pid)
++}
+diff --git a/feeds/packages/net/apcupsd/files/apcupsd_mail.conf b/feeds/packages/net/apcupsd/files/apcupsd_mail.conf
+new file mode 100644
+index 0000000..3ada8e5
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/apcupsd_mail.conf
+@@ -0,0 +1,7 @@
++#!/bin/sh
++
++MAILPROG="/usr/sbin/smtp"
++MAILHOST="mail:25"
++FROM="OpenWrt"
++TO="apcups@example.com"
++HOSTNAME="OpenWrt"
+diff --git a/feeds/packages/net/apcupsd/files/changeme b/feeds/packages/net/apcupsd/files/changeme
+new file mode 100644
+index 0000000..bcf448a
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/changeme
+@@ -0,0 +1,17 @@
++#!/bin/sh
++#
++# This shell script if placed in /etc/apcupsd
++# will be called by /etc/apcupsd/apccontrol when apcupsd
++# detects that the battery should be replaced.
++# We send an email message to root to notify him.
++#
++. /etc/apcupsd/apcupsd_mail.conf
++
++MSG="$HOSTNAME UPS battery needs changing NOW."
++#
++(
++ echo "$MSG"
++ echo " "
++ /usr/sbin/apcaccess status
++) | $MAILPROG -h $MAILHOST -f $FROM -s "$MSG" $TO
++exit 0
+diff --git a/feeds/packages/net/apcupsd/files/commfailure b/feeds/packages/net/apcupsd/files/commfailure
+new file mode 100644
+index 0000000..b899195
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/commfailure
+@@ -0,0 +1,17 @@
++#!/bin/sh
++#
++# This shell script if placed in /etc/apcupsd
++# will be called by /etc/apcupsd/apccontrol when apcupsd
++# loses contact with the UPS (i.e. the serial connection is not responding).
++# We send an email message to root to notify him.
++#
++. /etc/apcupsd/apcupsd_mail.conf
++
++MSG="$HOSTNAME Communications with UPS lost"
++#
++(
++ echo "$MSG"
++ echo " "
++ /usr/sbin/apcaccess status
++) | $MAILPROG -h $MAILHOST -f $FROM -s "$MSG" $TO
++exit 0
+diff --git a/feeds/packages/net/apcupsd/files/commok b/feeds/packages/net/apcupsd/files/commok
+new file mode 100644
+index 0000000..cd5d1c6
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/commok
+@@ -0,0 +1,17 @@
++#!/bin/sh
++#
++# This shell script if placed in /etc/apcupsd
++# will be called by /etc/apcupsd/apccontrol when apcupsd
++# restores contact with the UPS (i.e. the serial connection is restored).
++# We send an email message to root to notify him.
++#
++. /etc/apcupsd/apcupsd_mail.conf
++
++MSG="$HOSTNAME Communications with UPS restored"
++#
++(
++ echo "$MSG"
++ echo " "
++ /usr/sbin/apcaccess status
++) | $MAILPROG -h $MAILHOST -f $FROM -s "$MSG" $TO
++exit 0
+diff --git a/feeds/packages/net/apcupsd/files/hosts.conf b/feeds/packages/net/apcupsd/files/hosts.conf
+new file mode 100644
+index 0000000..854e008
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/hosts.conf
+@@ -0,0 +1,19 @@
++# Network UPS Tools - hosts.conf
++#
++# This file does double duty - it lists the systems that multimon will
++# monitor, and also specifies the systems that upsstats is allowed to
++# watch. It keeps people from feeding random addresses to upsstats,
++# among other things. upsimage also uses this file to know who it
++# may speak to. upsfstats too.
++#
++# Usage: list systems running upsd that you want to monitor
++#
++# MONITOR <address> "<host description>"
++#
++# Please note, MONITOR must start in column 1 (no spaces permitted)
++#
++# Example:
++# MONITOR 10.64.1.1 "Finance department"
++# MONITOR 10.78.1.1 "Sierra High School data room #1"
++#
++MONITOR 127.0.0.1 "Local Host"
+diff --git a/feeds/packages/net/apcupsd/files/multimon.conf b/feeds/packages/net/apcupsd/files/multimon.conf
+new file mode 100644
+index 0000000..4cdf9b0
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/multimon.conf
+@@ -0,0 +1,63 @@
++# Sample multimon configuration file
++#
++# This file is not required. Without it, multimon will use the default
++# field layout.
++#
++# Temperature selection
++#
++# Pick "TEMPC" for Celsius or "TEMPF" for Fahrenheit. This will override
++# the --enable-celsius setting from the compile. UPSTEMP (below) will
++# use this setting by default.
++
++TEMPC
++
++# Format:
++# FIELD <variable> "<field name>" "<field suffix>"
++#
++# <variable> is either a word from the UPS protocol like battchg (see the
++# table in src/cgi/upsfetch.c) or a special word in uppercase.
++#
++# Special words are:
++# MODEL - Show the model name for this system in cyan
++#
++# STATUS - Parse the status for this system using the appropriate color
++#
++# UPSTEMP and AMBTEMP use the default scale. This is set to C if you use
++# --enable-celsius at compile time *or* if you use "TEMPC" above.
++#
++# UPSTEMP - Show the UPS temperature in the default scale (suffix ignored)
++# AMBTEMP - Show the ambient temperature in the default scale (suffix ignored)
++#
++# UPSTEMPC - Show the UPS temperature in degrees C (suffix ignored)
++# UPSTEMPF - Show the UPS temperature in degrees F (suffix ignored)
++# AMBTEMPC - Show the ambient temperature in degrees C (suffix ignored)
++# AMBTEMPF - Show the ambient temperature in degrees F (suffix ignored)
++#
++# They're called "special" since they actually understand the content
++# being printed and do other things based on what's in there.
++#
++# <field name> is what you'd like this column to be called on the page.
++# Remember that this is HTML, so you can actually embed markup in here.
++# This means you can even include images here. You can include quotes
++# (and backslashes!) in the string by escaping them with a backslash (\).
++#
++# <field suffix> is typically something like % or VAC. It's useful if
++# you want to convey the units that apply to a value.
++#
++# Example config
++
++FIELD SYSTEM "System" ""
++FIELD MODEL "Model" ""
++FIELD STATUS "Status" ""
++FIELD battpct "Battery Chg" "%"
++FIELD utility "Utility" "VAC"
++FIELD loadpct "UPS Load" "%"
++FIELD UPSTEMP "UPS Temp" ""
++FIELD runtime "Batt. Run Time" "min."
++FIELD DATA "Data" "All data"
++
++# These are only useful if you have a Smart-UPS model with the Measure-UPS II
++# measurement card. No other models presently support these features.
++#
++# FIELD AMBTEMP "Ambient Temp" ""
++# FIELD HUMIDITY "Ambient Humidity" "%"
+diff --git a/feeds/packages/net/apcupsd/files/offbattery b/feeds/packages/net/apcupsd/files/offbattery
+new file mode 100644
+index 0000000..cd5d1c6
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/offbattery
+@@ -0,0 +1,17 @@
++#!/bin/sh
++#
++# This shell script if placed in /etc/apcupsd
++# will be called by /etc/apcupsd/apccontrol when apcupsd
++# restores contact with the UPS (i.e. the serial connection is restored).
++# We send an email message to root to notify him.
++#
++. /etc/apcupsd/apcupsd_mail.conf
++
++MSG="$HOSTNAME Communications with UPS restored"
++#
++(
++ echo "$MSG"
++ echo " "
++ /usr/sbin/apcaccess status
++) | $MAILPROG -h $MAILHOST -f $FROM -s "$MSG" $TO
++exit 0
+diff --git a/feeds/packages/net/apcupsd/files/onbattery b/feeds/packages/net/apcupsd/files/onbattery
+new file mode 100644
+index 0000000..ee5f653
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/files/onbattery
+@@ -0,0 +1,17 @@
++#!/bin/sh
++#
++# This shell script if placed in /etc/apcupsd
++# will be called by /etc/apcupsd/apccontrol when the UPS
++# goes on batteries.
++# We send an email message to root to notify him.
++#
++. /etc/apcupsd/apcupsd_mail.conf
++
++MSG="$HOSTNAME Power Failure !!!"
++#
++(
++ echo "$MSG"
++ echo " "
++ /usr/sbin/apcaccess status
++) | $MAILPROG -h $MAILHOST -f $FROM -s "$MSG" $TO
++exit 0
+diff --git a/feeds/packages/net/apcupsd/patches/010-fix-usb.patch b/feeds/packages/net/apcupsd/patches/010-fix-usb.patch
+new file mode 100644
+index 0000000..b313bb2
+--- /dev/null
++++ b/feeds/packages/net/apcupsd/patches/010-fix-usb.patch
+@@ -0,0 +1,8 @@
++--- a/include/libusb.h.in.orig 2015-02-21 18:53:51.023682068 +0100
+++++ a/include/libusb.h.in 2015-02-21 18:54:14.722788757 +0100
++@@ -6,4 +6,4 @@
++ * path at configure time and various apcupsd bits include this
++ * when they need libusb's usb.h.
++ */
++-#include "@LIBUSBH@"
+++#include "usb.h"
+diff --git a/feeds/packages/net/apinger/Makefile b/feeds/packages/net/apinger/Makefile
+new file mode 100644
+index 0000000..5d73ae1
+--- /dev/null
++++ b/feeds/packages/net/apinger/Makefile
+@@ -0,0 +1,67 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=apinger
++PKG_VERSION:=0.6.1
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/Jajcus/apinger.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=c7da72f7ec26eedd7fd8d224c0e10787b204f94e
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_MAINTAINER:=Alex Samorukov <samm@os2.kiev.ua>
++PKG_LICENSE:= GPL-2.0
++
++PKG_FIXUP:=autoreconf
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/apinger
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Tool which monitors various IP devices by simple ICMP echo requests
++ URL:=https://github.com/Jajcus/apinger
++ PKG_MAINTAINER:=Alex Samorukov <samm@os2.kiev.ua>
++endef
++
++define Package/apinger/description
++ Alarm Pinger (apinger) is a little tool which monitors various IP devices by
++ simple ICMP echo requests. There are various other tools, that can do this,
++ but most of them are shell or perl scripts, spawning many processes, thus much
++ CPU-expensive, especially when one wants continuous monitoring and fast
++ response on target failure. Alarm Pinger is a single program written in C, so
++ it doesn't need much CPU power even when monitoring many targets with frequent
++ probes. Alarm Pinger supports both IPv4 and IPv6. The code have been tested
++ on Linux and FreeBSD.
++endef
++
++define Package/apinger/conffiles
++/etc/apinger.conf
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default)
++endef
++
++define Package/apinger/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/apinger $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/apinger.conf $(1)/etc/apinger.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/apinger.init $(1)/etc/init.d/apinger
++endef
++
++$(eval $(call BuildPackage,apinger))
++
+diff --git a/feeds/packages/net/apinger/files/apinger.init b/feeds/packages/net/apinger/files/apinger.init
+new file mode 100644
+index 0000000..8caac38
+--- /dev/null
++++ b/feeds/packages/net/apinger/files/apinger.init
+@@ -0,0 +1,18 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=80
++
++SERVICE_USE_PID=1
++
++start() {
++ service_start /usr/sbin/apinger
++}
++
++stop() {
++ service_stop /usr/sbin/apinger
++}
++
++reload() {
++ service_reload /usr/sbin/apinger
++}
+diff --git a/feeds/packages/net/apinger/patches/001-autoreconf.patch b/feeds/packages/net/apinger/patches/001-autoreconf.patch
+new file mode 100644
+index 0000000..cb5bd45
+--- /dev/null
++++ b/feeds/packages/net/apinger/patches/001-autoreconf.patch
+@@ -0,0 +1,13 @@
++--- apinger-0.6.1/acinclude.m4 2003-10-21 12:44:48.000000000 +0000
+++++ apinger-0.6.1/acinclude.m4 2015-04-08 15:27:37.451903960 +0000
++@@ -39,9 +39,7 @@
++ [$jk_inet_includes
++ $jk_icmp_includes])
++
++-AC_CHECK_MEMBERS([struct icmp.icmp_type, struct icmp.icmp_code,\
++-struct icmp.icmp_cksum, struct icmp.icmp_seq,\
++-struct icmp.icmp_id],[],
+++AC_CHECK_MEMBERS([struct icmp.icmp_type, struct icmp.icmp_code,struct icmp.icmp_cksum, struct icmp.icmp_seq,struct icmp.icmp_id],[],
++ AC_MSG_ERROR(struct icmp not defined or not compatible),
++ [$jk_inet_includes
++ $jk_icmp_includes])
+diff --git a/feeds/packages/net/apinger/patches/002-run_as_user.patch b/feeds/packages/net/apinger/patches/002-run_as_user.patch
+new file mode 100644
+index 0000000..16d64ac
+--- /dev/null
++++ b/feeds/packages/net/apinger/patches/002-run_as_user.patch
+@@ -0,0 +1,11 @@
++--- apinger-0.6.1/src/apinger.conf.orig 2015-04-08 16:05:24.558919722 +0000
+++++ apinger-0.6.1/src/apinger.conf 2015-04-08 16:07:47.089170236 +0000
++@@ -9,7 +9,7 @@
++
++ ## User and group the pinger should run as
++ user "nobody"
++-group "nobody"
+++group "nogroup"
++
++ ## Mailer to use (default: "/usr/lib/sendmail -t")
++ #mailer "/var/qmail/bin/qmail-inject"
+diff --git a/feeds/packages/net/apinger/patches/003-no_docs.patch b/feeds/packages/net/apinger/patches/003-no_docs.patch
+new file mode 100644
+index 0000000..c08f44d
+--- /dev/null
++++ b/feeds/packages/net/apinger/patches/003-no_docs.patch
+@@ -0,0 +1,11 @@
++--- apinger-0.6.1/Makefile.am.orig 2015-04-08 16:47:40.999990050 +0000
+++++ apinger-0.6.1/Makefile.am 2015-04-08 16:48:07.565220137 +0000
++@@ -1,7 +1,7 @@
++
++ EXTRA_DIST = autogen.sh TODO BUGS
++
++-SUBDIRS = src doc
+++SUBDIRS = src
++
++ .PHONY: ChangeLog
++
+diff --git a/feeds/packages/net/aria2/Config.in b/feeds/packages/net/aria2/Config.in
+new file mode 100644
+index 0000000..ec21faf
+--- /dev/null
++++ b/feeds/packages/net/aria2/Config.in
+@@ -0,0 +1,28 @@
++menu "Aria2 configuration"
++ depends on PACKAGE_aria2
++
++choice
++ prompt "SSL library"
++ default ARIA2_OPENSSL
++
++config ARIA2_OPENSSL
++ bool "OpenSSL"
++
++config ARIA2_GNUTLS
++ bool "GNUTLS"
++
++config ARIA2_NOSSL
++ bool "No SSL support"
++
++endchoice
++
++config ARIA2_BITTORRENT
++ bool "Enable bittorrent support"
++ depends on ARIA2_OPENSSL
++ default n
++
++config ARIA2_METALINK
++ bool "Enable metalink support"
++ default N
++
++endmenu
+diff --git a/feeds/packages/net/aria2/Makefile b/feeds/packages/net/aria2/Makefile
+new file mode 100644
+index 0000000..cac017a
+--- /dev/null
++++ b/feeds/packages/net/aria2/Makefile
+@@ -0,0 +1,70 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=aria2
++PKG_VERSION:=1.18.7
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/aria2
++PKG_MD5SUM:=36e92af92b4370817c577ed802546842
++PKG_INSTALL:=1
++
++PKG_MAINTAINER:=Imre Kaloz <kaloz@openwrt.org>
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=COPYING
++
++PKG_CONFIG_DEPENDS := \
++ ARIA2_NOSSL \
++ ARIA2_OPENSSL \
++ ARIA2_GNUTLS \
++ ARIA2_BITTORRENT \
++ ARIA2_METALINK
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/aria2/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/aria2
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=File Transfer
++ TITLE:=lightweight download utility
++ URL:=http://aria2.sourceforge.net/
++ DEPENDS:=+zlib +ARIA2_METALINK:libxml2 +libstdcpp +ARIA2_OPENSSL:libopenssl +ARIA2_GNUTLS:libgnutls
++endef
++
++define Package/aria2/description
++ aria2 is a lightweight multi-protocol & multi-source command-line download
++ utility
++endef
++
++CONFIGURE_ARGS += \
++ --disable-nls \
++ $(if $(CONFIG_ARIA2_NOSSL),--disable,--enable)-ssl \
++ $(if $(CONFIG_ARIA2_OPENSSL),--with,--without)-openssl \
++ $(if $(CONFIG_ARIA2_GNUTLS),--with,--without)-gnutls \
++ $(if $(CONFIG_ARIA2_BITTORRENT),--enable,--disable)-bittorrent \
++ $(if $(CONFIG_ARIA2_METALINK),--enable,--disable)-metalink \
++ $(if $(CONFIG_ARIA2_METALINK),--with,--without)-libxml2 \
++ --without-libnettle \
++ --without-libgmp \
++ --without-libgcrypt \
++ --without-libexpat \
++ --without-libcares \
++ --without-sqlite3 \
++ --with-libz
++
++define Package/aria2/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/aria2c $(1)/usr/bin
++endef
++
++$(eval $(call BuildPackage,aria2))
+diff --git a/feeds/packages/net/atftp/Makefile b/feeds/packages/net/atftp/Makefile
+new file mode 100644
+index 0000000..d456edb
+--- /dev/null
++++ b/feeds/packages/net/atftp/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=atftp
++PKG_VERSION:=0.7.1
++PKG_RELEASE:=3
++PKG_MAINTAINER:=Daniel Danzberger <daniel@dd-wrt.com>
++PKG_LICENSE:=GPL-2.0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://freefr.dl.sourceforge.net/project/atftp/
++PKG_MD5SUM:=367bf401965fbed04585b1229c2191a8
++
++PKG_BUILD_DEPENDS:=libpcre libreadline
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/atftp/Default
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=TFTP
++ SUBMENU:=File Transfer
++endef
++
++define Package/atftp
++ $(call Package/atftp/Default)
++ DEPENDS:=+libreadline +libncurses
++ TITLE+= client
++endef
++
++define Package/atftpd
++ $(call Package/atftp/Default)
++ DEPENDS:=+libpcre +libpthread
++ TITLE+= server
++endef
++
++CONFIGURE_ARGS += \
++ --disable-libwrap
++
++define Package/atftp/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/atftp $(1)/usr/sbin/
++endef
++
++define Package/atftpd/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/atftpd $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,atftp))
++$(eval $(call BuildPackage,atftpd))
+diff --git a/feeds/packages/net/atftp/patches/01-missing-u_char-type-patch.patch b/feeds/packages/net/atftp/patches/01-missing-u_char-type-patch.patch
+new file mode 100644
+index 0000000..081f4b3
+--- /dev/null
++++ b/feeds/packages/net/atftp/patches/01-missing-u_char-type-patch.patch
+@@ -0,0 +1,13 @@
++diff --git a/tftpd.h b/tftpd.h
++index 945065e..4c2f214 100644
++--- a/tftpd.h
+++++ b/tftpd.h
++@@ -46,7 +46,7 @@ struct thread_data {
++ char *mc_addr; /* multicast address */
++ struct sockaddr_storage sa_mcast;
++ union ip_mreq_storage mcastaddr;
++- u_char mcast_ttl;
+++ unsigned char mcast_ttl;
++
++ /*
++ * Self can read/write until client_ready is set. Then only allowed to read.
+diff --git a/feeds/packages/net/bcp38/Makefile b/feeds/packages/net/bcp38/Makefile
+new file mode 100644
+index 0000000..280bcc5
+--- /dev/null
++++ b/feeds/packages/net/bcp38/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2014 Openwrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bcp38
++PKG_VERSION:=4
++PKG_RELEASE:=1
++PKG_LICENCE:=GPL-3.0+
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bcp38
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE:=BCP38 compliance
++ URL:=https://github.com/dtaht/ceropackages-3.10
++ MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
++ DEPENDS:=+ipset
++endef
++
++define Package/bcp38/description
++ bcp38 implements IETF BCP38 for home routers. See https://tools.ietf.org/html/bcp38.
++endef
++
++define Package/bcp38/conffiles
++/etc/config/bcp38
++endef
++
++define Build/Prepare
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/bcp38/install
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/bcp38.config $(1)/etc/config/bcp38
++ $(INSTALL_DIR) $(1)/usr/lib/bcp38
++ $(INSTALL_BIN) ./files/run.sh $(1)/usr/lib/bcp38/run.sh
++ $(INSTALL_DIR) $(1)/etc/uci-defaults
++ $(INSTALL_BIN) ./files/bcp38.defaults $(1)/etc/uci-defaults/bcp38
++endef
++
++define Package/bcp38/postinst
++#!/bin/sh
++[ -x /etc/uci-defaults/bcp38 ] && /etc/uci-defaults/bcp38 || exit 0
++endef
++
++define Package/bcp38/postrm
++#!/bin/sh
++uci delete firewall.bcp38
++uci commit
++endef
++
++$(eval $(call BuildPackage,bcp38))
+diff --git a/feeds/packages/net/bcp38/files/bcp38.config b/feeds/packages/net/bcp38/files/bcp38.config
+new file mode 100644
+index 0000000..08e8e20
+--- /dev/null
++++ b/feeds/packages/net/bcp38/files/bcp38.config
+@@ -0,0 +1,22 @@
++config bcp38
++ option enabled 0
++ option interface 'eth1'
++ option detect_upstream 1
++ list match '127.0.0.0/8'
++ list match '0.0.0.0/8' # RFC 1700
++ list match '240.0.0.0/4' # RFC 5745
++ list match '192.0.2.0/24' # RFC 5737
++ list match '198.51.100.0/24' # RFC 5737
++ list match '203.0.113.0/24' # RFC 5737
++ list match '192.168.0.0/16' # RFC 1918
++ list match '10.0.0.0/8' # RFC 1918
++ list match '172.16.0.0/12' # RFC 1918
++ list match '169.254.0.0/16' # RFC 3927
++
++# list nomatch '172.26.0.0/21' # Example of something not to match
++# There is a dhcp trigger to do this for the netmask of a
++# double natted connection needed
++
++# I will argue that this level of indirection doesn't scale
++# very well - see how to block china as an example
++# http://www.okean.com/china.txt
+diff --git a/feeds/packages/net/bcp38/files/bcp38.defaults b/feeds/packages/net/bcp38/files/bcp38.defaults
+new file mode 100644
+index 0000000..d7e0d80
+--- /dev/null
++++ b/feeds/packages/net/bcp38/files/bcp38.defaults
+@@ -0,0 +1,13 @@
++#!/bin/sh
++
++uci -q batch <<-EOT
++ delete firewall.bcp38
++ set firewall.bcp38=include
++ set firewall.bcp38.type=script
++ set firewall.bcp38.path=/usr/lib/bcp38/run.sh
++ set firewall.bcp38.family=IPv4
++ set firewall.bcp38.reload=1
++ commit firewall
++EOT
++
++exit 0
+diff --git a/feeds/packages/net/bcp38/files/run.sh b/feeds/packages/net/bcp38/files/run.sh
+new file mode 100755
+index 0000000..bafdf3b
+--- /dev/null
++++ b/feeds/packages/net/bcp38/files/run.sh
+@@ -0,0 +1,104 @@
++#!/bin/sh
++# BCP38 filtering implementation for CeroWrt.
++#
++# This program is free software; you can redistribute it and/or modify it under
++# the terms of the GNU General Public License as published by the Free Software
++# Foundation; either version 3 of the License, or (at your option) any later
++# version.
++#
++# Author: Toke Høiland-Jørgensen <toke@toke.dk>
++
++STOP=$1
++IPSET_NAME=bcp38-ipv4
++IPTABLES_CHAIN=BCP38
++
++. /lib/functions.sh
++
++config_load bcp38
++
++add_bcp38_rule()
++{
++ local subnet="$1"
++ local action="$2"
++
++ if [ "$action" == "nomatch" ]; then
++ ipset add "$IPSET_NAME" "$subnet" nomatch
++ else
++ ipset add "$IPSET_NAME" "$subnet"
++ fi
++}
++
++detect_upstream()
++{
++ local interface="$1"
++
++ subnets=$(ip route show dev "$interface" | grep 'scope link' | awk '{print $1}')
++ for subnet in $subnets; do
++ # ipset test doesn't work for subnets, so strip out the subnet part
++ # and test for that; add as exception if there's a match
++ addr=$(echo $subnet | sed 's|/[0-9]\+$||')
++ ipset test "$IPSET_NAME" $addr 2>/dev/null && add_bcp38_rule $subnet nomatch
++ done
++}
++
++run() {
++ local section="$1"
++ local enabled
++ local interface
++ local detect_upstream
++ config_get_bool enabled "$section" enabled 0
++ config_get interface "$section" interface
++ config_get detect_upstream "$section" detect_upstream
++
++ if [ "$enabled" -eq "1" -a -n "$interface" -a -z "$STOP" ] ; then
++ setup_ipset
++ setup_iptables "$interface"
++ config_list_foreach "$section" match add_bcp38_rule match
++ config_list_foreach "$section" nomatch add_bcp38_rule nomatch
++ [ "$detect_upstream" -eq "1" ] && detect_upstream "$interface"
++ fi
++ exit 0
++}
++
++setup_ipset()
++{
++ ipset create "$IPSET_NAME" hash:net family ipv4
++ ipset flush "$IPSET_NAME"
++}
++
++setup_iptables()
++{
++ local interface="$1"
++ iptables -N "$IPTABLES_CHAIN" 2>/dev/null
++ iptables -F "$IPTABLES_CHAIN" 2>/dev/null
++
++ iptables -I output_rule -j "$IPTABLES_CHAIN"
++ iptables -I input_rule -j "$IPTABLES_CHAIN"
++ iptables -I forwarding_rule -j "$IPTABLES_CHAIN"
++
++ # always accept DHCP traffic
++ iptables -A "$IPTABLES_CHAIN" -p udp --dport 67:68 --sport 67:68 -j RETURN
++ iptables -A "$IPTABLES_CHAIN" -o "$interface" -m set --match-set "$IPSET_NAME" dst -j REJECT --reject-with icmp-net-unreachable
++ iptables -A "$IPTABLES_CHAIN" -i "$interface" -m set --match-set "$IPSET_NAME" src -j DROP
++}
++
++destroy_ipset()
++{
++ ipset flush "$IPSET_NAME" 2>/dev/null
++ ipset destroy "$IPSET_NAME" 2>/dev/null
++}
++
++destroy_iptables()
++{
++ iptables -D output_rule -j "$IPTABLES_CHAIN" 2>/dev/null
++ iptables -D input_rule -j "$IPTABLES_CHAIN" 2>/dev/null
++ iptables -D forwarding_rule -j "$IPTABLES_CHAIN" 2>/dev/null
++ iptables -F "$IPTABLES_CHAIN" 2>/dev/null
++ iptables -X "$IPTABLES_CHAIN" 2>/dev/null
++}
++
++destroy_iptables
++destroy_ipset
++config_foreach run bcp38
++
++exit 0
+diff --git a/feeds/packages/net/bind/Makefile b/feeds/packages/net/bind/Makefile
+new file mode 100644
+index 0000000..be4fc83
+--- /dev/null
++++ b/feeds/packages/net/bind/Makefile
+@@ -0,0 +1,206 @@
++#
++# Copyright (C) 2006-2012 OpenWrt.org
++# 2014 Noah Meyerhans <frodo@morgul.net>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bind
++PKG_VERSION:=9.9.7-P3
++PKG_RELEASE:=1
++USERID:=bind=57:bind=57
++
++PKG_MAINTAINER := Noah Meyerhans <frodo@morgul.net>
++PKG_LICENSE := BSD-3-Clause
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:= \
++ ftp://ftp.isc.org/isc/bind9/$(PKG_VERSION) \
++ http://www.mirrorservice.org/sites/ftp.isc.org/isc/bind9/$(PKG_VERSION)
++PKG_MD5SUM:=022a8aca9ca51e1027d77094094eecfd
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=aclocal.m4 libtool.m4
++
++PKG_INSTALL:=1
++
++PKG_CONFIG_DEPENDS := CONFIG_OPENSSL_WITH_EC
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bind/Default
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+bind-libs
++ TITLE:=bind
++ URL:=https://www.isc.org/software/bind
++ SUBMENU:=IP Addresses and Names
++endef
++
++define Package/bind-libs
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libopenssl
++ TITLE:=bind shared libraries
++ URL:=https://www.isc.org/software/bind
++endef
++
++define Package/bind-server
++ $(call Package/bind/Default)
++ TITLE+= DNS server
++endef
++
++define Package/bind-client
++ $(call Package/bind/Default)
++ TITLE+= dynamic DNS client
++endef
++
++define Package/bind-tools
++ $(call Package/bind/Default)
++ TITLE+= administration tools (all)
++endef
++
++define Package/bind-rndc
++ $(call Package/bind/Default)
++ TITLE+= administration tools (rndc and rndc-confgen only)
++endef
++
++define Package/bind-check
++ $(call Package/bind/Default)
++ TITLE+= administration tools (named-checkconf and named-checkzone only)
++endef
++
++define Package/bind-dnssec
++ $(call Package/bind/Default)
++ TITLE+= administration tools (dnssec-keygen and dnssec-signzone only)
++endef
++
++define Package/bind-host
++ $(call Package/bind/Default)
++ TITLE+= simple DNS client
++endef
++
++define Package/bind-dig
++ $(call Package/bind/Default)
++ TITLE+= DNS excavation tool
++endef
++
++export BUILD_CC="$(TARGET_CC)"
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --with-randomdev="/dev/urandom" \
++ --disable-threads \
++ --disable-linux-caps \
++ --with-openssl="$(STAGING_DIR)/usr" \
++ --with-libtool \
++ --with-libxml2=no \
++ --enable-epoll=yes \
++ --with-gost=no \
++ --with-gssapi=no \
++ --with-ecdsa=$(if $(CONFIG_OPENSSL_WITH_EC),yes,no) \
++ --with-readline=no
++
++CONFIGURE_VARS += \
++ BUILD_CC="$(TARGET_CC)" \
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)/lib/dns \
++ BUILD_CC="$(HOSTCC)" \
++ CC="$(HOSTCC)" \
++ CFLAGS="-O2" \
++ LIBS="" \
++ gen
++ $(call Build/Compile/Default)
++endef
++
++define Package/bind-libs/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib
++endef
++
++define Package/bind-server/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/named $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/bind
++ $(CP) \
++ ./files/bind/db.0 \
++ ./files/bind/db.127 \
++ ./files/bind/db.255 \
++ ./files/bind/db.local \
++ ./files/bind/db.root \
++ $(1)/etc/bind/
++ $(CP) ./files/bind/named.conf.example $(1)/etc/bind/named.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/named.init $(1)/etc/init.d/named
++ find $(1)/etc/bind/ -name ".svn" | xargs rm -rf
++endef
++
++define Package/bind-server/conffiles
++/etc/bind/db.0
++/etc/bind/db.127
++/etc/bind/db.255
++/etc/bind/db.local
++/etc/bind/db.root
++/etc/bind/named.conf
++endef
++
++define Package/bind-client/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/nsupdate $(1)/usr/bin/
++endef
++
++define Package/bind-tools/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dig $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/host $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dnssec-keygen $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dnssec-signzone $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/named-checkconf $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/named-checkzone $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/rndc $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/rndc-confgen $(1)/usr/sbin/
++endef
++
++define Package/bind-rndc/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/rndc $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/rndc-confgen $(1)/usr/sbin/
++endef
++
++define Package/bind-check/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/named-checkconf $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/named-checkzone $(1)/usr/sbin/
++endef
++
++define Package/bind-dnssec/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dnssec-keygen $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dnssec-signzone $(1)/usr/sbin/
++endef
++
++define Package/bind-host/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/host $(1)/usr/bin/
++endef
++
++define Package/bind-dig/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dig $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,bind-libs))
++$(eval $(call BuildPackage,bind-server))
++$(eval $(call BuildPackage,bind-client))
++$(eval $(call BuildPackage,bind-tools))
++$(eval $(call BuildPackage,bind-rndc))
++$(eval $(call BuildPackage,bind-check))
++$(eval $(call BuildPackage,bind-dnssec))
++$(eval $(call BuildPackage,bind-host))
++$(eval $(call BuildPackage,bind-dig))
+diff --git a/feeds/packages/net/bind/files/bind/db.0 b/feeds/packages/net/bind/files/bind/db.0
+new file mode 100644
+index 0000000..e3aabdb
+--- /dev/null
++++ b/feeds/packages/net/bind/files/bind/db.0
+@@ -0,0 +1,12 @@
++;
++; BIND reverse data file for broadcast zone
++;
++$TTL 604800
++@ IN SOA localhost. root.localhost. (
++ 1 ; Serial
++ 604800 ; Refresh
++ 86400 ; Retry
++ 2419200 ; Expire
++ 604800 ) ; Negative Cache TTL
++;
++@ IN NS localhost.
+diff --git a/feeds/packages/net/bind/files/bind/db.127 b/feeds/packages/net/bind/files/bind/db.127
+new file mode 100644
+index 0000000..cd05bef
+--- /dev/null
++++ b/feeds/packages/net/bind/files/bind/db.127
+@@ -0,0 +1,13 @@
++;
++; BIND reverse data file for local loopback interface
++;
++$TTL 604800
++@ IN SOA localhost. root.localhost. (
++ 1 ; Serial
++ 604800 ; Refresh
++ 86400 ; Retry
++ 2419200 ; Expire
++ 604800 ) ; Negative Cache TTL
++;
++@ IN NS localhost.
++1.0.0 IN PTR localhost.
+diff --git a/feeds/packages/net/bind/files/bind/db.255 b/feeds/packages/net/bind/files/bind/db.255
+new file mode 100644
+index 0000000..e3aabdb
+--- /dev/null
++++ b/feeds/packages/net/bind/files/bind/db.255
+@@ -0,0 +1,12 @@
++;
++; BIND reverse data file for broadcast zone
++;
++$TTL 604800
++@ IN SOA localhost. root.localhost. (
++ 1 ; Serial
++ 604800 ; Refresh
++ 86400 ; Retry
++ 2419200 ; Expire
++ 604800 ) ; Negative Cache TTL
++;
++@ IN NS localhost.
+diff --git a/feeds/packages/net/bind/files/bind/db.local b/feeds/packages/net/bind/files/bind/db.local
+new file mode 100644
+index 0000000..66b4892
+--- /dev/null
++++ b/feeds/packages/net/bind/files/bind/db.local
+@@ -0,0 +1,13 @@
++;
++; BIND data file for local loopback interface
++;
++$TTL 604800
++@ IN SOA localhost. root.localhost. (
++ 1 ; Serial
++ 604800 ; Refresh
++ 86400 ; Retry
++ 2419200 ; Expire
++ 604800 ) ; Negative Cache TTL
++;
++@ IN NS localhost.
++@ IN A 127.0.0.1
+diff --git a/feeds/packages/net/bind/files/bind/db.root b/feeds/packages/net/bind/files/bind/db.root
+new file mode 100644
+index 0000000..0eb52af
+--- /dev/null
++++ b/feeds/packages/net/bind/files/bind/db.root
+@@ -0,0 +1,45 @@
++
++; <<>> DiG 9.2.3 <<>> ns . @a.root-servers.net.
++;; global options: printcmd
++;; Got answer:
++;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18944
++;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 13
++
++;; QUESTION SECTION:
++;. IN NS
++
++;; ANSWER SECTION:
++. 518400 IN NS A.ROOT-SERVERS.NET.
++. 518400 IN NS B.ROOT-SERVERS.NET.
++. 518400 IN NS C.ROOT-SERVERS.NET.
++. 518400 IN NS D.ROOT-SERVERS.NET.
++. 518400 IN NS E.ROOT-SERVERS.NET.
++. 518400 IN NS F.ROOT-SERVERS.NET.
++. 518400 IN NS G.ROOT-SERVERS.NET.
++. 518400 IN NS H.ROOT-SERVERS.NET.
++. 518400 IN NS I.ROOT-SERVERS.NET.
++. 518400 IN NS J.ROOT-SERVERS.NET.
++. 518400 IN NS K.ROOT-SERVERS.NET.
++. 518400 IN NS L.ROOT-SERVERS.NET.
++. 518400 IN NS M.ROOT-SERVERS.NET.
++
++;; ADDITIONAL SECTION:
++A.ROOT-SERVERS.NET. 3600000 IN A 198.41.0.4
++B.ROOT-SERVERS.NET. 3600000 IN A 192.228.79.201
++C.ROOT-SERVERS.NET. 3600000 IN A 192.33.4.12
++D.ROOT-SERVERS.NET. 3600000 IN A 128.8.10.90
++E.ROOT-SERVERS.NET. 3600000 IN A 192.203.230.10
++F.ROOT-SERVERS.NET. 3600000 IN A 192.5.5.241
++G.ROOT-SERVERS.NET. 3600000 IN A 192.112.36.4
++H.ROOT-SERVERS.NET. 3600000 IN A 128.63.2.53
++I.ROOT-SERVERS.NET. 3600000 IN A 192.36.148.17
++J.ROOT-SERVERS.NET. 3600000 IN A 192.58.128.30
++K.ROOT-SERVERS.NET. 3600000 IN A 193.0.14.129
++L.ROOT-SERVERS.NET. 3600000 IN A 199.7.83.42
++M.ROOT-SERVERS.NET. 3600000 IN A 202.12.27.33
++
++;; Query time: 81 msec
++;; SERVER: 198.41.0.4#53(a.root-servers.net.)
++;; WHEN: Sun Feb 1 11:27:14 2004
++;; MSG SIZE rcvd: 436
++
+diff --git a/feeds/packages/net/bind/files/bind/named.conf.example b/feeds/packages/net/bind/files/bind/named.conf.example
+new file mode 100644
+index 0000000..1624549
+--- /dev/null
++++ b/feeds/packages/net/bind/files/bind/named.conf.example
+@@ -0,0 +1,45 @@
++// This is the primary configuration file for the BIND DNS server named.
++
++options {
++ directory "/tmp";
++
++ // If your ISP provided one or more IP addresses for stable
++ // nameservers, you probably want to use them as forwarders.
++ // Uncomment the following block, and insert the addresses replacing
++ // the all-0's placeholder.
++
++ // forwarders {
++ // 0.0.0.0;
++ // };
++
++ auth-nxdomain no; # conform to RFC1035
++};
++
++// prime the server with knowledge of the root servers
++zone "." {
++ type hint;
++ file "/etc/bind/db.root";
++};
++
++// be authoritative for the localhost forward and reverse zones, and for
++// broadcast zones as per RFC 1912
++
++zone "localhost" {
++ type master;
++ file "/etc/bind/db.local";
++};
++
++zone "127.in-addr.arpa" {
++ type master;
++ file "/etc/bind/db.127";
++};
++
++zone "0.in-addr.arpa" {
++ type master;
++ file "/etc/bind/db.0";
++};
++
++zone "255.in-addr.arpa" {
++ type master;
++ file "/etc/bind/db.255";
++};
+diff --git a/feeds/packages/net/bind/files/named.init b/feeds/packages/net/bind/files/named.init
+new file mode 100644
+index 0000000..2ef7797
+--- /dev/null
++++ b/feeds/packages/net/bind/files/named.init
+@@ -0,0 +1,36 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 Noah Meyerhans <frodo@morgul.net>
++# Licensed under the terms of the GNU General Public License version 2
++# or (at your discretion) any later later version
++
++USE_PROCD=1
++
++START=50
++
++config_file=/etc/bind/named.conf
++pid_file=/var/run/named/named.pid
++
++logdir=/var/log/named/
++cachedir=/var/cache/bind
++libdir=/var/lib/bind
++config_file=/etc/bind/named.conf
++
++fix_perms() {
++ for dir in $libdir $logdir $cachedir; do
++ test -e "$dir" || {
++ mkdir -p "$dir"
++ chgrp bind "$dir"
++ chmod g+w "$dir"
++ }
++ done
++}
++
++start_service() {
++ user_exists bind 57 || user_add bind 57
++ group_exists bind 57 || group_add bind 57
++ fix_perms
++ procd_open_instance
++ procd_set_param command /usr/sbin/named -u bind -f -c $config_file
++ procd_set_param respawn
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/bind/patches/001-no-tests.patch b/feeds/packages/net/bind/patches/001-no-tests.patch
+new file mode 100644
+index 0000000..c969c5e
+--- /dev/null
++++ b/feeds/packages/net/bind/patches/001-no-tests.patch
+@@ -0,0 +1,26 @@
++Index: bind-9.9.4/bin/Makefile.in
++===================================================================
++--- bind-9.9.4.orig/bin/Makefile.in
+++++ bind-9.9.4/bin/Makefile.in
++@@ -19,7 +19,7 @@ srcdir = @srcdir@
++ VPATH = @srcdir@
++ top_srcdir = @top_srcdir@
++
++-SUBDIRS = named rndc dig dnssec tools tests nsupdate \
+++SUBDIRS = named rndc dig dnssec tools nsupdate \
++ check confgen @PYTHON_TOOLS@ @PKCS11_TOOLS@
++ TARGETS =
++
++Index: bind-9.9.4/lib/Makefile.in
++===================================================================
++--- bind-9.9.4.orig/lib/Makefile.in
+++++ bind-9.9.4/lib/Makefile.in
++@@ -23,7 +23,7 @@ top_srcdir = @top_srcdir@
++ # Attempt to disable parallel processing.
++ .NOTPARALLEL:
++ .NO_PARALLEL:
++-SUBDIRS = isc isccc dns isccfg bind9 lwres tests
+++SUBDIRS = isc isccc dns isccfg bind9 lwres
++ TARGETS =
++
++ @BIND9_MAKE_RULES@
+diff --git a/feeds/packages/net/bind/patches/002-autoconf-ar-fix.patch b/feeds/packages/net/bind/patches/002-autoconf-ar-fix.patch
+new file mode 100644
+index 0000000..501fa7d
+--- /dev/null
++++ b/feeds/packages/net/bind/patches/002-autoconf-ar-fix.patch
+@@ -0,0 +1,29 @@
++--- a/configure.in
+++++ b/configure.in
++@@ -93,26 +93,11 @@ esac
++ #
++ AC_CONFIG_FILES([make/rules make/includes])
++
++-AC_PATH_PROG(AR, ar)
++-ARFLAGS="cruv"
++-AC_SUBST(AR)
++-AC_SUBST(ARFLAGS)
++-
++ # The POSIX ln(1) program. Non-POSIX systems may substitute
++ # "copy" or something.
++ LN=ln
++ AC_SUBST(LN)
++
++-case "$AR" in
++- "")
++- AC_MSG_ERROR([
++-ar program not found. Please fix your PATH to include the directory in
++-which ar resides, or set AR in the environment with the full path to ar.
++-])
++-
++- ;;
++-esac
++-
++ #
++ # Etags.
++ #
+diff --git a/feeds/packages/net/bmon/Makefile b/feeds/packages/net/bmon/Makefile
+new file mode 100644
+index 0000000..2a0fd0e
+--- /dev/null
++++ b/feeds/packages/net/bmon/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bmon
++PKG_VERSION:=3.8
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/tgraf/bmon/releases/download/v$(PKG_VERSION)/
++PKG_MD5SUM:=162ce0d108ff32cbf44b874c5a7e8147
++PKG_MAINTAINER:=Baptiste Jonglez <openwrt-pkg@bitsofnetworks.org>
++PKG_LICENSE:=MIT
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bmon
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+PACKAGE_libncursesw:libncursesw +!PACKAGE_libncursesw:libncurses +libnl-core +libnl-route +confuse +terminfo
++ TITLE:=bmon is a portable bandwidth monitor
++ URL:=https://github.com/tgraf/bmon/
++endef
++
++define Package/bmon/description
++ bmon is a portable bandwidth monitor
++ and rate estimator running on various
++ operating systems. It supports various
++ input methods for different architectures.
++endef
++
++CONFIGURE_ARGS += \
++ --disable-cnt-workaround \
++
++CONFIGURE_VARS += \
++ ac_cv_lib_nl_nl_connect=no \
++
++# Needed to compile some objects
++TARGET_CFLAGS+= -std=gnu99
++
++define Package/bmon/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/bmon $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,bmon))
+diff --git a/feeds/packages/net/bridge-utils/Makefile b/feeds/packages/net/bridge-utils/Makefile
+new file mode 100644
+index 0000000..0075c0e
+--- /dev/null
++++ b/feeds/packages/net/bridge-utils/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=bridge-utils
++PKG_VERSION:=1.5
++PKG_RELEASE:=5
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://git.kernel.org/pub/scm/linux/kernel/git/shemminger/bridge-utils.git
++PKG_SOURCE_VERSION:=v${PKG_VERSION}
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_FIXUP:=autoreconf
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bridge
++ SECTION:=net
++ CATEGORY:=Base system
++ TITLE:=Ethernet bridging configuration utility
++ URL:=http://bridge.sourceforge.net/
++ PKG_MAINTAINER:=Nikolay Martynov <mar.kolya@gmail.com>
++endef
++
++define Package/bridge/description
++ Manage ethernet bridging: a way to connect networks together to
++ form a larger network.
++endef
++
++TARGET_CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
++
++CONFIGURE_ARGS += \
++ --with-linux-headers="$(LINUX_DIR)" \
++
++define Package/bridge/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/brctl/brctl $(1)/usr/sbin
++endef
++
++define Package/bridge/prerm
++#!/bin/sh
++$${IPKG_INSTROOT}/bin/busybox brctl -h 2>&1 | grep -q BusyBox && \
++ln -sf ../../bin/busybox $${IPKG_INSTROOT}/usr/sbin/brctl
++exit 0
++endef
++
++$(eval $(call BuildPackage,bridge))
+diff --git a/feeds/packages/net/bridge-utils/patches/001-libbridge_cflags.patch b/feeds/packages/net/bridge-utils/patches/001-libbridge_cflags.patch
+new file mode 100644
+index 0000000..e35a649
+--- /dev/null
++++ b/feeds/packages/net/bridge-utils/patches/001-libbridge_cflags.patch
+@@ -0,0 +1,11 @@
++--- a/libbridge/Makefile.in
+++++ b/libbridge/Makefile.in
++@@ -5,7 +5,7 @@ AR=ar
++ RANLIB=@RANLIB@
++
++ CC=@CC@
++-CFLAGS = -Wall -g $(KERNEL_HEADERS)
+++CFLAGS = -Wall -g @CFLAGS@ $(KERNEL_HEADERS)
++
++ prefix=@prefix@
++ exec_prefix=@exec_prefix@
+diff --git a/feeds/packages/net/bridge-utils/patches/010-fix_struct_in6_addr_usage.patch b/feeds/packages/net/bridge-utils/patches/010-fix_struct_in6_addr_usage.patch
+new file mode 100644
+index 0000000..c2087e5
+--- /dev/null
++++ b/feeds/packages/net/bridge-utils/patches/010-fix_struct_in6_addr_usage.patch
+@@ -0,0 +1,10 @@
++--- a/libbridge/libbridge.h
+++++ b/libbridge/libbridge.h
++@@ -20,6 +20,7 @@
++ #define _LIBBRIDGE_H
++
++ #include <sys/socket.h>
+++#include <netinet/in.h>
++ #include <linux/if.h>
++ #include <linux/if_bridge.h>
++
+diff --git a/feeds/packages/net/bridge-utils/patches/100-musl-compat.patch b/feeds/packages/net/bridge-utils/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..5655643
+--- /dev/null
++++ b/feeds/packages/net/bridge-utils/patches/100-musl-compat.patch
+@@ -0,0 +1,11 @@
++--- a/libbridge/libbridge.h
+++++ b/libbridge/libbridge.h
++@@ -19,6 +19,8 @@
++ #ifndef _LIBBRIDGE_H
++ #define _LIBBRIDGE_H
++
+++#include <sys/types.h>
+++#include <sys/select.h>
++ #include <sys/socket.h>
++ #include <netinet/in.h>
++ #include <linux/if.h>
+diff --git a/feeds/packages/net/bwm-ng/Config.in b/feeds/packages/net/bwm-ng/Config.in
+new file mode 100644
+index 0000000..d822e12
+--- /dev/null
++++ b/feeds/packages/net/bwm-ng/Config.in
+@@ -0,0 +1,35 @@
++# bwm-ng advanced configuration
++
++menu "Configuration"
++ depends on PACKAGE_bwm-ng
++
++config BWMNG_CONFIGFILE
++ bool "enable configfile support"
++ default n
++
++config BWMNG_HTML
++ bool "enable html output"
++ default n
++
++config BWMNG_CSV
++ bool "enable csv output"
++ default n
++
++config BWMNG_EXTENDEDSTATS
++ bool "enable max, sum and avg stats"
++ default y
++
++config BWMNG_LIBNCURSES
++ bool "enable libncurses support"
++ default n
++
++config BWMNG_TIME
++ bool "enable accurate time calculating"
++ default y
++
++config BWMNG_GETOPT_LONG
++ bool "enable long options"
++ default n
++
++endmenu
++
+diff --git a/feeds/packages/net/bwm-ng/Makefile b/feeds/packages/net/bwm-ng/Makefile
+new file mode 100644
+index 0000000..21c896c
+--- /dev/null
++++ b/feeds/packages/net/bwm-ng/Makefile
+@@ -0,0 +1,61 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bwm-ng
++PKG_VERSION:=0.6.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.gropp.org/bwm-ng
++PKG_MD5SUM:=ef0c7669508e95f56250ad4f8db98b7f
++PKG_MAINTAINER:=Julen Landa Alustiza <julen@zokormazo.info>
++PKG_LICENSE:=GPL2-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bwm-ng
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+BWMNG_LIBNCURSES:libncurses
++ TITLE:=bwm-ng
++ URL:=http://www.gropp.org/?id=projects&sub=bwm-ng
++ MENU:=1
++endef
++
++define Package/bwm-ng/description
++ Bandwidth Monitor NG is a small and simple console-based live
++ network and disk io bandwidth monitor.
++endef
++
++define Package/bwm-ng/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ $(if $(CONFIG_BWMNG_CONFIGFILE),--enable,--disable)-configfile \
++ $(if $(CONFIG_BWMNG_HTML),--enable,--disable)-html \
++ $(if $(CONFIG_BWMNG_CSV),--enable,--disable)-csv \
++ $(if $(CONFIG_BWMNG_EXTENDEDSTATS),--enable,--disable)-extendedstats \
++ $(if $(CONFIG_BWMNG_LIBNCURSES),--with,--without)-ncurses \
++ $(if $(CONFIG_BWMNG_TIME),--with,--without)-time \
++ $(if $(CONFIG_BWMNG_GETOPT_LONG),--with,--without)-getopt_long \
++ --with-strip \
++ --with-procnetdev \
++ --with-diskstats \
++ )
++endef
++
++define Package/bwm-ng/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/bwm-ng $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,bwm-ng))
+diff --git a/feeds/packages/net/cgi-io/Makefile b/feeds/packages/net/cgi-io/Makefile
+new file mode 100644
+index 0000000..c36231a
+--- /dev/null
++++ b/feeds/packages/net/cgi-io/Makefile
+@@ -0,0 +1,44 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=cgi-io
++PKG_RELEASE:=1
++
++PKG_LICENSE:=GPL-2.0+
++
++PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/cgi-io
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Web Servers/Proxies
++ DEPENDS:=+libubox +libubus
++ TITLE:=CGI utility for handling up/downloading of files
++endef
++
++define Package/cgi-io/description
++ This package contains an cgi utility that is useful for up/downloading files
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++ $(CP) ./src/* $(PKG_BUILD_DIR)/
++endef
++
++define Package/cgi-io/install
++ $(INSTALL_DIR) $(1)/usr/libexec $(1)/www/cgi-bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/cgi-io $(1)/usr/libexec
++ $(LN) ../../usr/libexec/cgi-io $(1)/www/cgi-bin/cgi-upload
++ $(LN) ../../usr/libexec/cgi-io $(1)/www/cgi-bin/cgi-download
++endef
++
++$(eval $(call BuildPackage,cgi-io))
+diff --git a/feeds/packages/net/cgi-io/src/CMakeLists.txt b/feeds/packages/net/cgi-io/src/CMakeLists.txt
+new file mode 100644
+index 0000000..8a4ca19
+--- /dev/null
++++ b/feeds/packages/net/cgi-io/src/CMakeLists.txt
+@@ -0,0 +1,19 @@
++cmake_minimum_required(VERSION 2.6)
++
++PROJECT(cgi-io C)
++
++INCLUDE(CheckFunctionExists)
++
++ADD_DEFINITIONS(-Os -Wall -Werror --std=gnu99 -g3 -Wmissing-declarations)
++
++SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
++
++IF(APPLE)
++ INCLUDE_DIRECTORIES(/opt/local/include)
++ LINK_DIRECTORIES(/opt/local/lib)
++ENDIF()
++
++ADD_EXECUTABLE(cgi-io main.c multipart_parser.c)
++TARGET_LINK_LIBRARIES(cgi-io ubox ubus)
++
++INSTALL(TARGETS cgi-io RUNTIME DESTINATION sbin)
+diff --git a/feeds/packages/net/cgi-io/src/main.c b/feeds/packages/net/cgi-io/src/main.c
+new file mode 100644
+index 0000000..985831c
+--- /dev/null
++++ b/feeds/packages/net/cgi-io/src/main.c
+@@ -0,0 +1,644 @@
++/*
++ * cgi-io - LuCI non-RPC helper
++ *
++ * Copyright (C) 2013 Jo-Philipp Wich <jow@openwrt.org>
++ *
++ * Permission to use, copy, modify, and/or distribute this software for any
++ * purpose with or without fee is hereby granted, provided that the above
++ * copyright notice and this permission notice appear in all copies.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <stdbool.h>
++#include <unistd.h>
++#include <string.h>
++#include <errno.h>
++#include <fcntl.h>
++#include <ctype.h>
++#include <sys/stat.h>
++#include <sys/wait.h>
++
++#include <libubus.h>
++#include <libubox/blobmsg.h>
++
++#include "multipart_parser.h"
++
++
++enum part {
++ PART_UNKNOWN,
++ PART_SESSIONID,
++ PART_FILENAME,
++ PART_FILEMODE,
++ PART_FILEDATA
++};
++
++const char *parts[] = {
++ "(bug)",
++ "sessionid",
++ "filename",
++ "filemode",
++ "filedata",
++};
++
++struct state
++{
++ bool is_content_disposition;
++ enum part parttype;
++ char *sessionid;
++ char *filename;
++ bool filedata;
++ int filemode;
++ int filefd;
++ int tempfd;
++};
++
++enum {
++ SES_ACCESS,
++ __SES_MAX,
++};
++
++static const struct blobmsg_policy ses_policy[__SES_MAX] = {
++ [SES_ACCESS] = { .name = "access", .type = BLOBMSG_TYPE_BOOL },
++};
++
++
++static struct state st;
++
++static void
++session_access_cb(struct ubus_request *req, int type, struct blob_attr *msg)
++{
++ struct blob_attr *tb[__SES_MAX];
++ bool *allow = (bool *)req->priv;
++
++ if (!msg)
++ return;
++
++ blobmsg_parse(ses_policy, __SES_MAX, tb, blob_data(msg), blob_len(msg));
++
++ if (tb[SES_ACCESS])
++ *allow = blobmsg_get_bool(tb[SES_ACCESS]);
++}
++
++static bool
++session_access(const char *sid, const char *obj, const char *func)
++{
++ uint32_t id;
++ bool allow = false;
++ struct ubus_context *ctx;
++ static struct blob_buf req;
++
++ ctx = ubus_connect(NULL);
++
++ if (!ctx || ubus_lookup_id(ctx, "session", &id))
++ goto out;
++
++ blob_buf_init(&req, 0);
++ blobmsg_add_string(&req, "ubus_rpc_session", sid);
++ blobmsg_add_string(&req, "scope", "cgi-io");
++ blobmsg_add_string(&req, "object", obj);
++ blobmsg_add_string(&req, "function", func);
++
++ ubus_invoke(ctx, id, "access", req.head, session_access_cb, &allow, 500);
++
++out:
++ if (ctx)
++ ubus_free(ctx);
++
++ return allow;
++}
++
++static char *
++md5sum(const char *file)
++{
++ pid_t pid;
++ int fds[2];
++ static char md5[33];
++
++ if (pipe(fds))
++ return NULL;
++
++ switch ((pid = fork()))
++ {
++ case -1:
++ return NULL;
++
++ case 0:
++ uloop_done();
++
++ dup2(fds[1], 1);
++
++ close(0);
++ close(2);
++ close(fds[0]);
++ close(fds[1]);
++
++ if (execl("/bin/busybox", "/bin/busybox", "md5sum", file, NULL));
++ return NULL;
++
++ break;
++
++ default:
++ memset(md5, 0, sizeof(md5));
++ read(fds[0], md5, 32);
++ waitpid(pid, NULL, 0);
++ close(fds[0]);
++ close(fds[1]);
++ }
++
++ return md5;
++}
++
++static char *
++datadup(const void *in, size_t len)
++{
++ char *out = malloc(len + 1);
++
++ if (!out)
++ return NULL;
++
++ memcpy(out, in, len);
++
++ *(out + len) = 0;
++
++ return out;
++}
++
++static bool
++urldecode(char *buf)
++{
++ char *c, *p;
++
++ if (!buf || !*buf)
++ return true;
++
++#define hex(x) \
++ (((x) <= '9') ? ((x) - '0') : \
++ (((x) <= 'F') ? ((x) - 'A' + 10) : \
++ ((x) - 'a' + 10)))
++
++ for (c = p = buf; *p; c++)
++ {
++ if (*p == '%')
++ {
++ if (!isxdigit(*(p + 1)) || !isxdigit(*(p + 2)))
++ return false;
++
++ *c = (char)(16 * hex(*(p + 1)) + hex(*(p + 2)));
++
++ p += 3;
++ }
++ else if (*p == '+')
++ {
++ *c = ' ';
++ p++;
++ }
++ else
++ {
++ *c = *p++;
++ }
++ }
++
++ *c = 0;
++
++ return true;
++}
++
++static bool
++postdecode(char **fields, int n_fields)
++{
++ char *p;
++ const char *var;
++ static char buf[1024];
++ int i, len, field, found = 0;
++
++ var = getenv("CONTENT_TYPE");
++
++ if (!var || strncmp(var, "application/x-www-form-urlencoded", 33))
++ return false;
++
++ memset(buf, 0, sizeof(buf));
++
++ if ((len = read(0, buf, sizeof(buf) - 1)) > 0)
++ {
++ for (p = buf, i = 0; i <= len; i++)
++ {
++ if (buf[i] == '=')
++ {
++ buf[i] = 0;
++
++ for (field = 0; field < (n_fields * 2); field += 2)
++ {
++ if (!strcmp(p, fields[field]))
++ {
++ fields[field + 1] = buf + i + 1;
++ found++;
++ }
++ }
++ }
++ else if (buf[i] == '&' || buf[i] == '\0')
++ {
++ buf[i] = 0;
++
++ if (found >= n_fields)
++ break;
++
++ p = buf + i + 1;
++ }
++ }
++ }
++
++ for (field = 0; field < (n_fields * 2); field += 2)
++ if (!urldecode(fields[field + 1]))
++ return false;
++
++ return (found >= n_fields);
++}
++
++static int
++response(bool success, const char *message)
++{
++ char *md5;
++ struct stat s;
++
++ printf("Status: 200 OK\r\n");
++ printf("Content-Type: text/plain\r\n\r\n{\n");
++
++ if (success)
++ {
++ if (!stat(st.filename, &s) && (md5 = md5sum(st.filename)) != NULL)
++ printf("\t\"size\": %u,\n\t\"checksum\": \"%s\"\n",
++ (unsigned int)s.st_size, md5);
++ }
++ else
++ {
++ if (message)
++ printf("\t\"message\": \"%s\",\n", message);
++
++ printf("\t\"failure\": [ %u, \"%s\" ]\n", errno, strerror(errno));
++
++ if (st.filefd > -1)
++ unlink(st.filename);
++ }
++
++ printf("}\n");
++
++ return -1;
++}
++
++static int
++failure(int e, const char *message)
++{
++ printf("Status: 500 Internal Server failure\r\n");
++ printf("Content-Type: text/plain\r\n\r\n");
++ printf("%s", message);
++
++ if (e)
++ printf(": %s", strerror(e));
++
++ return -1;
++}
++
++static int
++filecopy(void)
++{
++ int len;
++ char buf[4096];
++
++ if (!st.filedata)
++ {
++ close(st.tempfd);
++ errno = EINVAL;
++ return response(false, "No file data received");
++ }
++
++ if (lseek(st.tempfd, 0, SEEK_SET) < 0)
++ {
++ close(st.tempfd);
++ return response(false, "Failed to rewind temp file");
++ }
++
++ st.filefd = open(st.filename, O_CREAT | O_TRUNC | O_WRONLY, 0600);
++
++ if (st.filefd < 0)
++ {
++ close(st.tempfd);
++ return response(false, "Failed to open target file");
++ }
++
++ while ((len = read(st.tempfd, buf, sizeof(buf))) > 0)
++ {
++ if (write(st.filefd, buf, len) != len)
++ {
++ close(st.tempfd);
++ close(st.filefd);
++ return response(false, "I/O failure while writing target file");
++ }
++ }
++
++ close(st.tempfd);
++ close(st.filefd);
++
++ if (chmod(st.filename, st.filemode))
++ return response(false, "Failed to chmod target file");
++
++ return 0;
++}
++
++static int
++header_field(multipart_parser *p, const char *data, size_t len)
++{
++ st.is_content_disposition = !strncasecmp(data, "Content-Disposition", len);
++ return 0;
++}
++
++static int
++header_value(multipart_parser *p, const char *data, size_t len)
++{
++ int i, j;
++
++ if (!st.is_content_disposition)
++ return 0;
++
++ if (len < 10 || strncasecmp(data, "form-data", 9))
++ return 0;
++
++ for (data += 9, len -= 9; *data == ' ' || *data == ';'; data++, len--);
++
++ if (len < 8 || strncasecmp(data, "name=\"", 6))
++ return 0;
++
++ for (data += 6, len -= 6, i = 0; i <= len; i++)
++ {
++ if (*(data + i) != '"')
++ continue;
++
++ for (j = 1; j < sizeof(parts) / sizeof(parts[0]); j++)
++ if (!strncmp(data, parts[j], i))
++ st.parttype = j;
++
++ break;
++ }
++
++ return 0;
++}
++
++static int
++data_begin_cb(multipart_parser *p)
++{
++ char tmpname[24] = "/tmp/luci-upload.XXXXXX";
++
++ if (st.parttype == PART_FILEDATA)
++ {
++ if (!st.sessionid)
++ return response(false, "File data without session");
++
++ if (!st.filename)
++ return response(false, "File data without name");
++
++ st.tempfd = mkstemp(tmpname);
++
++ if (st.tempfd < 0)
++ return response(false, "Failed to create temporary file");
++
++ unlink(tmpname);
++ }
++
++ return 0;
++}
++
++static int
++data_cb(multipart_parser *p, const char *data, size_t len)
++{
++ switch (st.parttype)
++ {
++ case PART_SESSIONID:
++ st.sessionid = datadup(data, len);
++ break;
++
++ case PART_FILENAME:
++ st.filename = datadup(data, len);
++ break;
++
++ case PART_FILEMODE:
++ st.filemode = strtoul(data, NULL, 8);
++ break;
++
++ case PART_FILEDATA:
++ if (write(st.tempfd, data, len) != len)
++ {
++ close(st.tempfd);
++ return response(false, "I/O failure while writing temporary file");
++ }
++
++ if (!st.filedata)
++ st.filedata = !!len;
++
++ break;
++
++ default:
++ break;
++ }
++
++ return 0;
++}
++
++static int
++data_end_cb(multipart_parser *p)
++{
++ if (st.parttype == PART_SESSIONID)
++ {
++ if (!session_access(st.sessionid, "upload", "write"))
++ {
++ errno = EPERM;
++ return response(false, "Upload permission denied");
++ }
++ }
++ else if (st.parttype == PART_FILEDATA)
++ {
++ if (st.tempfd < 0)
++ return response(false, "Internal program failure");
++
++#if 0
++ /* prepare directory */
++ for (ptr = st.filename; *ptr; ptr++)
++ {
++ if (*ptr == '/')
++ {
++ *ptr = 0;
++
++ if (mkdir(st.filename, 0755))
++ {
++ unlink(st.tmpname);
++ return response(false, "Failed to create destination directory");
++ }
++
++ *ptr = '/';
++ }
++ }
++#endif
++
++ if (filecopy())
++ return -1;
++
++ return response(true, NULL);
++ }
++
++ st.parttype = PART_UNKNOWN;
++ return 0;
++}
++
++static multipart_parser *
++init_parser(void)
++{
++ char *boundary;
++ const char *var;
++
++ multipart_parser *p;
++ static multipart_parser_settings s = {
++ .on_part_data = data_cb,
++ .on_headers_complete = data_begin_cb,
++ .on_part_data_end = data_end_cb,
++ .on_header_field = header_field,
++ .on_header_value = header_value
++ };
++
++ var = getenv("CONTENT_TYPE");
++
++ if (!var || strncmp(var, "multipart/form-data;", 20))
++ return NULL;
++
++ for (var += 20; *var && *var != '='; var++);
++
++ if (*var++ != '=')
++ return NULL;
++
++ boundary = malloc(strlen(var) + 3);
++
++ if (!boundary)
++ return NULL;
++
++ strcpy(boundary, "--");
++ strcpy(boundary + 2, var);
++
++ st.tempfd = -1;
++ st.filefd = -1;
++ st.filemode = 0600;
++
++ p = multipart_parser_init(boundary, &s);
++
++ free(boundary);
++
++ return p;
++}
++
++static int
++main_upload(int argc, char *argv[])
++{
++ int rem, len;
++ char buf[4096];
++ multipart_parser *p;
++
++ p = init_parser();
++
++ if (!p)
++ {
++ errno = EINVAL;
++ return response(false, "Invalid request");
++ }
++
++ while ((len = read(0, buf, sizeof(buf))) > 0)
++ {
++ rem = multipart_parser_execute(p, buf, len);
++
++ if (rem < len)
++ break;
++ }
++
++ multipart_parser_free(p);
++
++ /* read remaining post data */
++ while ((len = read(0, buf, sizeof(buf))) > 0);
++
++ return 0;
++}
++
++static int
++main_backup(int argc, char **argv)
++{
++ pid_t pid;
++ time_t now;
++ int len;
++ int fds[2];
++ char buf[4096];
++ char datestr[16] = { 0 };
++ char hostname[64] = { 0 };
++ char *fields[] = { "sessionid", NULL };
++
++ if (!postdecode(fields, 1) || !session_access(fields[1], "backup", "read"))
++ return failure(0, "Backup permission denied");
++
++ if (pipe(fds))
++ return failure(errno, "Failed to spawn pipe");
++
++ switch ((pid = fork()))
++ {
++ case -1:
++ return failure(errno, "Failed to fork process");
++
++ case 0:
++ dup2(fds[1], 1);
++
++ close(0);
++ close(2);
++ close(fds[0]);
++ close(fds[1]);
++
++ chdir("/");
++
++ execl("/sbin/sysupgrade", "/sbin/sysupgrade",
++ "--create-backup", "-", NULL);
++
++ return -1;
++
++ default:
++ now = time(NULL);
++ strftime(datestr, sizeof(datestr) - 1, "%Y-%m-%d", localtime(&now));
++
++ if (gethostname(hostname, sizeof(hostname) - 1))
++ sprintf(hostname, "OpenWrt");
++
++ printf("Status: 200 OK\r\n");
++ printf("Content-Type: application/x-targz\r\n");
++ printf("Content-Disposition: attachment; "
++ "filename=\"backup-%s-%s.tar.gz\"\r\n\r\n", hostname, datestr);
++
++ while ((len = read(fds[0], buf, sizeof(buf))) > 0)
++ fwrite(buf, len, 1, stdout);
++
++ waitpid(pid, NULL, 0);
++
++ close(fds[0]);
++ close(fds[1]);
++
++ return 0;
++ }
++}
++
++int main(int argc, char **argv)
++{
++ if (strstr(argv[0], "cgi-upload"))
++ return main_upload(argc, argv);
++ else if (strstr(argv[0], "cgi-backup"))
++ return main_backup(argc, argv);
++
++ return -1;
++}
+diff --git a/feeds/packages/net/cgi-io/src/multipart_parser.c b/feeds/packages/net/cgi-io/src/multipart_parser.c
+new file mode 100644
+index 0000000..ee82c82
+--- /dev/null
++++ b/feeds/packages/net/cgi-io/src/multipart_parser.c
+@@ -0,0 +1,309 @@
++/* Based on node-formidable by Felix Geisendörfer
++ * Igor Afonov - afonov@gmail.com - 2012
++ * MIT License - http://www.opensource.org/licenses/mit-license.php
++ */
++
++#include "multipart_parser.h"
++
++#include <stdio.h>
++#include <stdarg.h>
++#include <string.h>
++
++static void multipart_log(const char * format, ...)
++{
++#ifdef DEBUG_MULTIPART
++ va_list args;
++ va_start(args, format);
++
++ fprintf(stderr, "[HTTP_MULTIPART_PARSER] %s:%d: ", __FILE__, __LINE__);
++ vfprintf(stderr, format, args);
++ fprintf(stderr, "\n");
++#endif
++}
++
++#define NOTIFY_CB(FOR) \
++do { \
++ if (p->settings->on_##FOR) { \
++ if (p->settings->on_##FOR(p) != 0) { \
++ return i; \
++ } \
++ } \
++} while (0)
++
++#define EMIT_DATA_CB(FOR, ptr, len) \
++do { \
++ if (p->settings->on_##FOR) { \
++ if (p->settings->on_##FOR(p, ptr, len) != 0) { \
++ return i; \
++ } \
++ } \
++} while (0)
++
++
++#define LF 10
++#define CR 13
++
++struct multipart_parser {
++ void * data;
++
++ size_t index;
++ size_t boundary_length;
++
++ unsigned char state;
++
++ const multipart_parser_settings* settings;
++
++ char* lookbehind;
++ char multipart_boundary[1];
++};
++
++enum state {
++ s_uninitialized = 1,
++ s_start,
++ s_start_boundary,
++ s_header_field_start,
++ s_header_field,
++ s_headers_almost_done,
++ s_header_value_start,
++ s_header_value,
++ s_header_value_almost_done,
++ s_part_data_start,
++ s_part_data,
++ s_part_data_almost_boundary,
++ s_part_data_boundary,
++ s_part_data_almost_end,
++ s_part_data_end,
++ s_part_data_final_hyphen,
++ s_end
++};
++
++multipart_parser* multipart_parser_init
++ (const char *boundary, const multipart_parser_settings* settings) {
++
++ multipart_parser* p = malloc(sizeof(multipart_parser) +
++ strlen(boundary) +
++ strlen(boundary) + 9);
++
++ strcpy(p->multipart_boundary, boundary);
++ p->boundary_length = strlen(boundary);
++
++ p->lookbehind = (p->multipart_boundary + p->boundary_length + 1);
++
++ p->index = 0;
++ p->state = s_start;
++ p->settings = settings;
++
++ return p;
++}
++
++void multipart_parser_free(multipart_parser* p) {
++ free(p);
++}
++
++void multipart_parser_set_data(multipart_parser *p, void *data) {
++ p->data = data;
++}
++
++void *multipart_parser_get_data(multipart_parser *p) {
++ return p->data;
++}
++
++size_t multipart_parser_execute(multipart_parser* p, const char *buf, size_t len) {
++ size_t i = 0;
++ size_t mark = 0;
++ char c, cl;
++ int is_last = 0;
++
++ while(i < len) {
++ c = buf[i];
++ is_last = (i == (len - 1));
++ switch (p->state) {
++ case s_start:
++ multipart_log("s_start");
++ p->index = 0;
++ p->state = s_start_boundary;
++
++ /* fallthrough */
++ case s_start_boundary:
++ multipart_log("s_start_boundary");
++ if (p->index == p->boundary_length) {
++ if (c != CR) {
++ return i;
++ }
++ p->index++;
++ break;
++ } else if (p->index == (p->boundary_length + 1)) {
++ if (c != LF) {
++ return i;
++ }
++ p->index = 0;
++ NOTIFY_CB(part_data_begin);
++ p->state = s_header_field_start;
++ break;
++ }
++ if (c != p->multipart_boundary[p->index]) {
++ return i;
++ }
++ p->index++;
++ break;
++
++ case s_header_field_start:
++ multipart_log("s_header_field_start");
++ mark = i;
++ p->state = s_header_field;
++
++ /* fallthrough */
++ case s_header_field:
++ multipart_log("s_header_field");
++ if (c == CR) {
++ p->state = s_headers_almost_done;
++ break;
++ }
++
++ if (c == '-') {
++ break;
++ }
++
++ if (c == ':') {
++ EMIT_DATA_CB(header_field, buf + mark, i - mark);
++ p->state = s_header_value_start;
++ break;
++ }
++
++ cl = tolower(c);
++ if (cl < 'a' || cl > 'z') {
++ multipart_log("invalid character in header name");
++ return i;
++ }
++ if (is_last)
++ EMIT_DATA_CB(header_field, buf + mark, (i - mark) + 1);
++ break;
++
++ case s_headers_almost_done:
++ multipart_log("s_headers_almost_done");
++ if (c != LF) {
++ return i;
++ }
++
++ p->state = s_part_data_start;
++ break;
++
++ case s_header_value_start:
++ multipart_log("s_header_value_start");
++ if (c == ' ') {
++ break;
++ }
++
++ mark = i;
++ p->state = s_header_value;
++
++ /* fallthrough */
++ case s_header_value:
++ multipart_log("s_header_value");
++ if (c == CR) {
++ EMIT_DATA_CB(header_value, buf + mark, i - mark);
++ p->state = s_header_value_almost_done;
++ }
++ if (is_last)
++ EMIT_DATA_CB(header_value, buf + mark, (i - mark) + 1);
++ break;
++
++ case s_header_value_almost_done:
++ multipart_log("s_header_value_almost_done");
++ if (c != LF) {
++ return i;
++ }
++ p->state = s_header_field_start;
++ break;
++
++ case s_part_data_start:
++ multipart_log("s_part_data_start");
++ NOTIFY_CB(headers_complete);
++ mark = i;
++ p->state = s_part_data;
++
++ /* fallthrough */
++ case s_part_data:
++ multipart_log("s_part_data");
++ if (c == CR) {
++ EMIT_DATA_CB(part_data, buf + mark, i - mark);
++ mark = i;
++ p->state = s_part_data_almost_boundary;
++ p->lookbehind[0] = CR;
++ break;
++ }
++ if (is_last)
++ EMIT_DATA_CB(part_data, buf + mark, (i - mark) + 1);
++ break;
++
++ case s_part_data_almost_boundary:
++ multipart_log("s_part_data_almost_boundary");
++ if (c == LF) {
++ p->state = s_part_data_boundary;
++ p->lookbehind[1] = LF;
++ p->index = 0;
++ break;
++ }
++ EMIT_DATA_CB(part_data, p->lookbehind, 1);
++ p->state = s_part_data;
++ mark = i --;
++ break;
++
++ case s_part_data_boundary:
++ multipart_log("s_part_data_boundary");
++ if (p->multipart_boundary[p->index] != c) {
++ EMIT_DATA_CB(part_data, p->lookbehind, 2 + p->index);
++ p->state = s_part_data;
++ mark = i --;
++ break;
++ }
++ p->lookbehind[2 + p->index] = c;
++ if ((++ p->index) == p->boundary_length) {
++ NOTIFY_CB(part_data_end);
++ p->state = s_part_data_almost_end;
++ }
++ break;
++
++ case s_part_data_almost_end:
++ multipart_log("s_part_data_almost_end");
++ if (c == '-') {
++ p->state = s_part_data_final_hyphen;
++ break;
++ }
++ if (c == CR) {
++ p->state = s_part_data_end;
++ break;
++ }
++ return i;
++
++ case s_part_data_final_hyphen:
++ multipart_log("s_part_data_final_hyphen");
++ if (c == '-') {
++ NOTIFY_CB(body_end);
++ p->state = s_end;
++ break;
++ }
++ return i;
++
++ case s_part_data_end:
++ multipart_log("s_part_data_end");
++ if (c == LF) {
++ p->state = s_header_field_start;
++ NOTIFY_CB(part_data_begin);
++ break;
++ }
++ return i;
++
++ case s_end:
++ multipart_log("s_end: %02X", (int) c);
++ break;
++
++ default:
++ multipart_log("Multipart parser unrecoverable error");
++ return 0;
++ }
++ ++ i;
++ }
++
++ return len;
++}
+diff --git a/feeds/packages/net/cgi-io/src/multipart_parser.h b/feeds/packages/net/cgi-io/src/multipart_parser.h
+new file mode 100644
+index 0000000..87e67f4
+--- /dev/null
++++ b/feeds/packages/net/cgi-io/src/multipart_parser.h
+@@ -0,0 +1,48 @@
++/* Based on node-formidable by Felix Geisendörfer
++ * Igor Afonov - afonov@gmail.com - 2012
++ * MIT License - http://www.opensource.org/licenses/mit-license.php
++ */
++#ifndef _multipart_parser_h
++#define _multipart_parser_h
++
++#ifdef __cplusplus
++extern "C"
++{
++#endif
++
++#include <stdlib.h>
++#include <ctype.h>
++
++typedef struct multipart_parser multipart_parser;
++typedef struct multipart_parser_settings multipart_parser_settings;
++typedef struct multipart_parser_state multipart_parser_state;
++
++typedef int (*multipart_data_cb) (multipart_parser*, const char *at, size_t length);
++typedef int (*multipart_notify_cb) (multipart_parser*);
++
++struct multipart_parser_settings {
++ multipart_data_cb on_header_field;
++ multipart_data_cb on_header_value;
++ multipart_data_cb on_part_data;
++
++ multipart_notify_cb on_part_data_begin;
++ multipart_notify_cb on_headers_complete;
++ multipart_notify_cb on_part_data_end;
++ multipart_notify_cb on_body_end;
++};
++
++multipart_parser* multipart_parser_init
++ (const char *boundary, const multipart_parser_settings* settings);
++
++void multipart_parser_free(multipart_parser* p);
++
++size_t multipart_parser_execute(multipart_parser* p, const char *buf, size_t len);
++
++void multipart_parser_set_data(multipart_parser* p, void* data);
++void * multipart_parser_get_data(multipart_parser* p);
++
++#ifdef __cplusplus
++} /* extern "C" */
++#endif
++
++#endif
+diff --git a/feeds/packages/net/chaosvpn/Makefile b/feeds/packages/net/chaosvpn/Makefile
+new file mode 100644
+index 0000000..0205752
+--- /dev/null
++++ b/feeds/packages/net/chaosvpn/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2010-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=chaosvpn
++
++PKG_REV:=2eb24810b5aa0b2d56f21562e52927020dc3090a
++PKG_VERSION:=2014-01-24
++PKG_RELEASE=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/ryd/chaosvpn.git
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_REV).tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_LICENSE:=Apache-2.0
++PKG_MAINTAINER:Norbert Summer <git@o-g.at>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/chaosvpn
++ TITLE:=Config generator for chaos vpn
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=https://wiki.hamburg.ccc.de/index.php/ChaosVPN::DebianHowto
++ SUBMENU:=VPN
++ DEPENDS:=+tinc +ip +kmod-tun +libopenssl
++endef
++
++define Package/chaosvpn/description
++ Configure tincd for the chaosvpn network
++endef
++
++define Package/chaosvpn/conffiles
++/etc/tinc/chaosvpn.conf
++endef
++
++MAKE_FLAGS += \
++ COPT="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS) $(TARGET_LDFLAGS)"
++
++define Package/chaosvpn/install
++ $(INSTALL_DIR) $(1)/etc/tinc/chaos/ $(1)/usr/sbin/ $(1)/etc/init.d/ $(1)/etc/hotplug.d/iface/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/chaosvpn $(1)/usr/sbin/
++ $(INSTALL_BIN) ./files/chaosvpn.init $(1)/etc/init.d/chaosvpn
++ $(INSTALL_BIN) ./files/chaosvpn.hotplug $(1)/etc/hotplug.d/iface/40-chaosvpn
++ sed -i -e 's/"\/sbin\/ip /"\/usr\/sbin\/ip /' $(PKG_BUILD_DIR)/chaosvpn.conf
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/chaosvpn.conf $(1)/etc/tinc/chaosvpn.conf
++endef
++
++$(eval $(call BuildPackage,chaosvpn))
++
+diff --git a/feeds/packages/net/chaosvpn/files/chaosvpn.hotplug b/feeds/packages/net/chaosvpn/files/chaosvpn.hotplug
+new file mode 100755
+index 0000000..3044e53
+--- /dev/null
++++ b/feeds/packages/net/chaosvpn/files/chaosvpn.hotplug
+@@ -0,0 +1,3 @@
++[ "$INTERFACE" == "wan" ] || return
++[ "$ACTION" == "ifup" ] && /etc/init.d/chaosvpn restart
++
+diff --git a/feeds/packages/net/chaosvpn/files/chaosvpn.init b/feeds/packages/net/chaosvpn/files/chaosvpn.init
+new file mode 100755
+index 0000000..f847a9a
+--- /dev/null
++++ b/feeds/packages/net/chaosvpn/files/chaosvpn.init
+@@ -0,0 +1,31 @@
++#!/bin/sh /etc/rc.common
++START=99
++
++USE_PROCD=1
++
++start_service()
++{
++ #check if chaosvpn is configured
++ if [ ! -f "/etc/tinc/chaos/rsa_key.pub" -o ! -f "/etc/tinc/chaos/rsa_key.priv" ]; then
++ logger -t chaosvpn "please generate rsa key pair"
++ logger -t chaosvpn "tincd -n chaos --generate-keys=2048"
++ exit 1
++ fi
++
++ if [ "`grep unique_name /etc/tinc/chaosvpn.conf | wc -l`" != "0" ]; then
++ logger -t chaosvpn "/etc/tinc/chaosvpn.conf is not configured yet or contains 'unique_name'"
++ exit 1
++ fi
++
++ procd_open_instance
++ procd_set_param command /usr/sbin/chaosvpn -r -c /etc/tinc/chaosvpn.conf
++ procd_close_instance
++}
++
++stop_service()
++{
++ #force remove tinc pid
++ if [ -f "/var/run/tinc.chaos.pid" ]; then
++ rm "/var/run/tinc.chaos.pid"
++ fi
++}
+diff --git a/feeds/packages/net/chrony/Makefile b/feeds/packages/net/chrony/Makefile
+new file mode 100644
+index 0000000..5ef68cf
+--- /dev/null
++++ b/feeds/packages/net/chrony/Makefile
+@@ -0,0 +1,76 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=chrony
++PKG_VERSION:=2.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://download.tuxfamily.org/chrony/
++PKG_MD5SUM:=17bc77d3d2ce942675f9600b60452717
++
++PKG_MAINTAINER:=Miroslav Lichvar <mlichvar0@gmail.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_DEPENDS:=+pps-tools
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/chrony
++ SUBMENU:=Time Synchronization
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libcap
++ USERID:=chrony=323:chrony=323
++ TITLE:=A versatile NTP client and server
++ URL:=http://chrony.tuxfamily.org/
++endef
++
++define Package/chrony/description
++ An NTP client and server designed to perform well in a wide range
++ of conditions. It can synchronize the system clock with NTP servers,
++ reference clocks, and manual input using wristwatch and keyboard.
++endef
++
++define Package/chrony/conffiles
++/etc/chrony/chrony.conf
++/etc/config/chrony
++endef
++
++CONFIGURE_ARGS+= \
++ --host-machine=$(shell echo $(GNU_TARGET_NAME) | sed -e 's/-.*//') \
++ --host-release="" \
++ --host-system=Linux \
++ --sysconfdir=/etc/chrony \
++ --prefix=/usr \
++ --chronysockdir=/var/run/chrony \
++ --disable-readline \
++ --disable-rtc \
++ --disable-asyncdns \
++ --with-user=chrony
++
++CONFIGURE_VARS+=CPPFLAGS=-DNDEBUG
++
++define Package/chrony/install
++ $(INSTALL_DIR) $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/chronyd $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/chronyc $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DIR) $(1)/etc/chrony
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
++ $(INSTALL_BIN) ./files/chrony.hotplug $(1)/etc/hotplug.d/iface/20-chrony
++ $(INSTALL_BIN) ./files/chronyd.init $(1)/etc/init.d/chronyd
++ $(INSTALL_CONF) ./files/chrony.config $(1)/etc/config/chrony
++ $(INSTALL_CONF) ./files/chrony.conf $(1)/etc/chrony/chrony.conf
++endef
++
++$(eval $(call BuildPackage,chrony))
+diff --git a/feeds/packages/net/chrony/files/chrony.conf b/feeds/packages/net/chrony/files/chrony.conf
+new file mode 100644
+index 0000000..b207c94
+--- /dev/null
++++ b/feeds/packages/net/chrony/files/chrony.conf
+@@ -0,0 +1,7 @@
++# This file is included from config file generated from /etc/config/chrony
++
++# Log clock errors above 0.5 seconds
++logchange 0.5
++
++# Don't log client accesses
++noclientlog
+diff --git a/feeds/packages/net/chrony/files/chrony.config b/feeds/packages/net/chrony/files/chrony.config
+new file mode 100644
+index 0000000..56d2b88
+--- /dev/null
++++ b/feeds/packages/net/chrony/files/chrony.config
+@@ -0,0 +1,11 @@
++config pool
++ option hostname '2.openwrt.pool.ntp.org'
++ option maxpoll '12'
++ option iburst 'yes'
++
++config allow
++ option interface 'lan'
++
++config makestep
++ option threshold '1.0'
++ option limit '3'
+diff --git a/feeds/packages/net/chrony/files/chrony.hotplug b/feeds/packages/net/chrony/files/chrony.hotplug
+new file mode 100644
+index 0000000..5f6a14b
+--- /dev/null
++++ b/feeds/packages/net/chrony/files/chrony.hotplug
+@@ -0,0 +1,6 @@
++COMMAND=/usr/bin/chronyc
++
++[ -x $COMMAND ] || exit 0
++
++[ "$ACTION" = "ifup" -a "$INTERFACE" = "wan" ] && $COMMAND online
++[ "$ACTION" = "ifdown" -a "$INTERFACE" = "wan" ] && $COMMAND offline
+diff --git a/feeds/packages/net/chrony/files/chronyd.init b/feeds/packages/net/chrony/files/chronyd.init
+new file mode 100644
+index 0000000..9be3a90
+--- /dev/null
++++ b/feeds/packages/net/chrony/files/chronyd.init
+@@ -0,0 +1,69 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006 OpenWrt.org
++
++START=60
++USE_PROCD=1
++PROG=/usr/sbin/chronyd
++CONFIGFILE=/var/etc/chrony.conf
++
++handle_source() {
++ local cfg=$1 sourcetype=$2 hostname minpoll maxpoll iburst
++
++ config_get hostname "$cfg" hostname
++ [ -z "$hostname" ] && return
++ config_get minpoll "$cfg" minpoll
++ config_get maxpoll "$cfg" maxpoll
++ config_get_bool iburst "$cfg" iburst 0
++ echo $(
++ echo $sourcetype $hostname
++ [ -n "$minpoll" ] && echo minpoll $minpoll
++ [ -n "$maxpoll" ] && echo maxpoll $maxpoll
++ [ "$iburst" = "1" ] && echo iburst
++ ) >> $CONFIGFILE
++}
++
++handle_allow() {
++ local cfg=$1 iface wan_iface wan6_iface subnet subnets subnets6
++
++ network_find_wan wan_iface true
++ network_find_wan6 wan6_iface true
++ config_get iface "$cfg" interface
++
++ if [ "$wan_iface" = "$iface" ]; then
++ echo allow >> $CONFIGFILE
++ else
++ network_get_subnets subnets $iface || \
++ network_get_subnets subnets6 $iface || continue
++ for subnet in $subnets $subnets6; do
++ echo allow $subnet >> $CONFIGFILE
++ done
++ fi
++}
++
++handle_makestep() {
++ local cfg=$1 threshold limit
++
++ config_get threshold "$cfg" threshold
++ config_get limit "$cfg" limit
++ [ -z "$threshold" -o -z "$limit" ] && return
++ echo makestep $threshold $limit >> $CONFIGFILE
++}
++
++start_service() {
++ . /lib/functions/network.sh
++
++ procd_open_instance
++ procd_set_param command $PROG -n -f $CONFIGFILE
++ procd_set_param file $CONFIGFILE
++ procd_set_param file /etc/chrony/chrony.conf
++ procd_close_instance
++
++ echo include /etc/chrony/chrony.conf > $CONFIGFILE
++
++ config_load ntpd
++ config_foreach handle_source server server
++ config_foreach handle_source pool pool
++ config_foreach handle_source peer peer
++ config_foreach handle_allow allow
++ config_foreach handle_makestep makestep
++}
+diff --git a/feeds/packages/net/clamav/Makefile b/feeds/packages/net/clamav/Makefile
+new file mode 100644
+index 0000000..3f3edab
+--- /dev/null
++++ b/feeds/packages/net/clamav/Makefile
+@@ -0,0 +1,120 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=clamav
++PKG_VERSION:=0.98.7
++PKG_RELEASE:=1
++
++PKG_LICENSE:=GPL-2.0
++PKG_MAINTAINER:=Marko Ratkaj <marko.ratkaj@sartura.hr>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://sourceforge.net/projects/clamav/files/clamav/$(PKG_VERSION)/
++PKG_MD5SUM:=157c601161da1c2d5a0e48ea1b49e067
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/clamav/Default
++ SECTION:=net
++ DEPENDS:=+libpthread +uclibcxx +zlib +libcurl +libopenssl
++ CATEGORY:=Network
++ SUBMENU:=Web Servers/Proxies
++ TITLE:=ClamAV
++ URL:=http://www.clamav.net/
++endef
++
++define Package/clamav
++ $(call Package/clamav/Default)
++endef
++
++define Package/freshclam
++ $(call Package/clamav/Default)
++ DEPENDS+= +clamav
++ TITLE+=database updater
++endef
++
++define Package/clamav/description
++ ClamAV is an open source antivirus engine for detecting trojans,
++ viruses, malware & other malicious threats.
++endef
++
++define Package/freshclam/description
++ Database updater for ClamAV
++endef
++
++define Package/clamav/conffiles
++endef
++
++CONFIGURE_VARS += \
++ INCLUDES="" \
++ CXXFLAGS="$$$$CXXFLAGS -fno-rtti" \
++ LIBS="-lpthread" \
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --sysconfdir=/etc/clamav/ \
++ --prefix=/usr/ \
++ --exec-prefix=/usr/ \
++ --disable-xml \
++ --disable-bzip2 \
++ --enable-ltdl-install \
++ --with-user nobody \
++ --with-group nogroup \
++ )
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install
++endef
++
++define Package/clamav/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/clamd $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/clamav-config $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/clambc $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/clamconf $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/clamdscan $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/clamscan $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sigtool $(1)/usr/sbin/
++
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/clamav.h $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib*/* $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/clamav.config $(1)/etc/config/clamav
++
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) ./files/clamav.init $(1)/etc/init.d/clamav
++
++ $(INSTALL_DIR) $(1)/usr/share/clamav
++ $(CP) ./files/bytecode.cvd $(1)/usr/share/clamav/
++endef
++
++define Package/freshclam/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/freshclam $(1)/usr/sbin/
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/freshclam.config $(1)/etc/config/freshclam
++
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) ./files/freshclam.init $(1)/etc/init.d/freshclam
++endef
++
++$(eval $(call BuildPackage,clamav))
++$(eval $(call BuildPackage,freshclam))
+diff --git a/feeds/packages/net/clamav/files/bytecode.cvd b/feeds/packages/net/clamav/files/bytecode.cvd
+new file mode 100644
+index 0000000000000000000000000000000000000000..07ff8ab014f8f8288b7df3dd11bddd9b777c6fda
+GIT binary patch
+literal 68662
+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
+GZUq1nQNSty
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/packages/net/clamav/files/clamav.config b/feeds/packages/net/clamav/files/clamav.config
+new file mode 100644
+index 0000000..1543caa
+--- /dev/null
++++ b/feeds/packages/net/clamav/files/clamav.config
+@@ -0,0 +1,34 @@
++config clamav 'clamav'
++ option clamd_config_file '/etc/clamav/clamd.conf'
++ option LogFile '/tmp/clamd.log'
++ option LogFileMaxSize '1M'
++ option LogTime 'no'
++ option LogVerbose 'no'
++ option ExtendedDetectionInfo 'no'
++ option OfficialDatabaseOnly 'no'
++ option StreamMinPort '1024'
++ option StreamMaxPort '2048'
++ option MaxThreads '10'
++ option ReadTimeout '30'
++ option CommandReadTimeout '5'
++ option MaxDirectoryRecursion '15'
++ option FollowDirectorySymlinks 'no'
++ option FollowFileSymlinks 'no'
++ option SelfCheck '600'
++ option DetectPUA 'yes'
++ option ScanPE 'yes'
++ option DisableCertCheck 'no'
++ option ScanELF 'yes'
++ option DetectBrokenExecutables 'no'
++ option ScanOLE2 'yes'
++ option ScanPDF 'yes'
++ option ScanSWF 'yes'
++ option ScanMail 'yes'
++ option ScanPartialMessages 'no'
++ option ScanArchive 'yes'
++ option ArchiveBlockEncrypted 'yes'
++ option MaxFileSize '10M'
++ option TemporaryDirectory '/tmp'
++ option LocalSocket '/var/run/clamav/clamd.sock'
++ option User 'nobody'
++ option ExitOnOOM 'yes'
+diff --git a/feeds/packages/net/clamav/files/clamav.init b/feeds/packages/net/clamav/files/clamav.init
+new file mode 100644
+index 0000000..b2a8950
+--- /dev/null
++++ b/feeds/packages/net/clamav/files/clamav.init
+@@ -0,0 +1,116 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=90
++STOP=10
++
++USE_PROCD=1
++PROG=/usr/sbin/clamd
++CLAMD_CONFIGFILE="/tmp/clamav/clamd.conf"
++
++validate_clamav_section() {
++ uci_validate_section clamav clamav "${1}" \
++ 'clamd_config_file:string' \
++ 'LogFile:string' \
++ 'LogFileMaxSize:string' \
++ 'LogVerbose:string' \
++ 'ExtendedDetectionInfo:string' \
++ 'LogTime:string' \
++ 'OfficialDatabaseOnly:string' \
++ 'StreamMinPort:uinteger' \
++ 'StreamMaxPort:uinteger' \
++ 'MaxThreads:uinteger' \
++ 'ReadTimeout:uinteger' \
++ 'CommandReadTimeout:uinteger' \
++ 'MaxDirectoryRecursion:uinteger' \
++ 'FollowDirectorySymlinks:string' \
++ 'FollowFileSymlinks:string' \
++ 'SelfCheck:uinteger' \
++ 'DetectPUA:string' \
++ 'ScanPE:string' \
++ 'DisableCertCheck:string' \
++ 'ScanELF:string' \
++ 'DetectBrokenExecutables:string' \
++ 'ScanOLE2:string' \
++ 'ScanPDF:string' \
++ 'ScanSWF:string' \
++ 'ScanMail:string' \
++ 'ScanPartialMessages:string' \
++ 'ScanArchive:string' \
++ 'TemporaryDirectory:string' \
++ 'ArchiveBlockEncrypted:string' \
++ 'MaxFileSize:string' \
++ 'LocalSocket:string' \
++ 'User:string' \
++ 'ExitOnOOM:string'
++}
++
++start_service() {
++ local clamd_config_file LogFile LogTime StreamMinPort \
++ StreamMaxPort MaxThreads ReadTimeout CommandReadTimeout MaxDirectoryRecursion \
++ FollowFileSymlinks FollowDirectorySymlinks SelfCheck DetectPUA ScanPE DisableCertCheck \
++ ScanELF DetectBrokenExecutables ScanOLE2 ScanPDF ScanSWF ScanMail ScanPartialMessages \
++ ScanArchive TemporaryDirectory ArchiveBlockEncrypted MaxFileSize LocalSocket User
++
++ validate_clamav_section clamav || {
++ echo "validation failed"
++ return 1
++ }
++
++ mkdir -p /usr/share/clamav
++ mkdir -p /etc/clamav/
++ mkdir -p /var/run/clamav/
++ chmod a+rw /var/run/clamav
++
++ mkdir -p $(dirname $CLAMD_CONFIGFILE)
++ ln -sf $clamd_config_file $CLAMD_CONFIGFILE
++
++ echo "LogFile " $LogFile > $CLAMD_CONFIGFILE
++ echo "LogFileMaxSize " $LogFileMaxSize >> $CLAMD_CONFIGFILE
++ echo "LogVerbose " $LogVerbose >> $CLAMD_CONFIGFILE
++ echo "ExtendedDetectionInfo " $ExtendedDetectionInfo >> $CLAMD_CONFIGFILE
++ echo "LogTime " $LogTime >> $CLAMD_CONFIGFILE
++ echo "OfficialDatabaseOnly " $OfficialDatabaseOnly >> $CLAMD_CONFIGFILE
++ echo "StreamMinPort " $StreamMinPort >> $CLAMD_CONFIGFILE
++ echo "StreamMaxPort " $StreamMaxPort >> $CLAMD_CONFIGFILE
++ echo "MaxThreads " $MaxThreads >> $CLAMD_CONFIGFILE
++ echo "ReadTimeout " $ReadTimeout >> $CLAMD_CONFIGFILE
++ echo "CommandReadTimeout " $CommandReadTimeout >> $CLAMD_CONFIGFILE
++ echo "MaxDirectoryRecursion " $MaxDirectoryRecursion >> $CLAMD_CONFIGFILE
++ echo "FollowDirectorySymlinks " $FollowDirectorySymlinks >> $CLAMD_CONFIGFILE
++ echo "FollowFileSymlinks " $FollowFileSymlinks >> $CLAMD_CONFIGFILE
++ echo "SelfCheck " $SelfCheck >> $CLAMD_CONFIGFILE
++ echo "DetectPUA " $DetectPUA >> $CLAMD_CONFIGFILE
++ echo "ScanPE " $ScanPE >> $CLAMD_CONFIGFILE
++ echo "DisableCertCheck " $DisableCertCheck >> $CLAMD_CONFIGFILE
++ echo "ScanELF " $ScanELF >> $CLAMD_CONFIGFILE
++ echo "DetectBrokenExecutables " $DetectBrokenExecutables >> $CLAMD_CONFIGFILE
++ echo "ScanOLE2 " $ScanOLE2 >> $CLAMD_CONFIGFILE
++ echo "ScanPDF " $ScanPDF >> $CLAMD_CONFIGFILE
++ echo "ScanSWF " $ScanSWF >> $CLAMD_CONFIGFILE
++ echo "ScanMail " $ScanMail >> $CLAMD_CONFIGFILE
++ echo "ScanPartialMessages " $ScanPartialMessages >> $CLAMD_CONFIGFILE
++ echo "ScanArchive " $ScanArchive >> $CLAMD_CONFIGFILE
++ echo "TemporaryDirectory " $TemporaryDirectory >> $CLAMD_CONFIGFILE
++ echo "ArchiveBlockEncrypted " $ArchiveBlockEncrypted >> $CLAMD_CONFIGFILE
++ echo "MaxFileSize " $MaxFileSize >> $CLAMD_CONFIGFILE
++ echo "LocalSocket " $LocalSocket >> $CLAMD_CONFIGFILE
++ echo "User " $User >> $CLAMD_CONFIGFILE
++ echo "ExitOnOOM " $ExitOnOOM >> $CLAMD_CONFIGFILE
++
++ procd_open_instance
++ procd_set_param command $PROG -c $CLAMD_CONFIGFILE
++ procd_set_param file $CLAMD_CONFIGFILE
++ procd_close_instance
++}
++
++stop_service()
++{
++ service_stop ${PROG}
++}
++
++service_triggers()
++{
++ procd_add_reload_trigger "clamav"
++ procd_add_validation validate_clamav_section
++}
+diff --git a/feeds/packages/net/clamav/files/freshclam.config b/feeds/packages/net/clamav/files/freshclam.config
+new file mode 100644
+index 0000000..827e8dd
+--- /dev/null
++++ b/feeds/packages/net/clamav/files/freshclam.config
+@@ -0,0 +1,7 @@
++config freshclam 'freshclam'
++ option freshclam_config_file '/etc/clamav/freshclam.conf'
++ option UpdateLogFile '/tmp/freshclam.log'
++ option DatabaseMirror 'database.clamav.net'
++ option NotifyClamd '/etc/clamav/clamd.conf'
++ option DatabaseOwner 'root'
++ option CompressLocalDatabase 'yes'
+diff --git a/feeds/packages/net/clamav/files/freshclam.init b/feeds/packages/net/clamav/files/freshclam.init
+new file mode 100644
+index 0000000..37b2767
+--- /dev/null
++++ b/feeds/packages/net/clamav/files/freshclam.init
+@@ -0,0 +1,63 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=90
++STOP=10
++
++USE_PROCD=1
++PROG=/usr/sbin/freshclam
++FRESHCLAM_CONFIGFILE="/tmp/clamav/freshclam.conf"
++
++validate_freshclam_section() {
++ uci_validate_section freshclam freshclam "${1}" \
++ 'freshclam_config_file:string' \
++ 'UpdateLogFile:string' \
++ 'DatabaseMirror:string' \
++ 'NotifyClamd:string' \
++ 'DatabaseOwner:string' \
++ 'CompressLocalDatabase:string:'
++}
++
++start_service() {
++ local freshclam_config_file UpdateLogFile DatabaseOwner NotifyClamd DatabaseMirror
++
++ validate_freshclam_section freshclam || {
++ echo "validation failed"
++ return 1
++ }
++
++ [ -f /tmp/freshclam.pid ] && echo "already running" && return 0
++
++ mkdir -p /usr/share/clamav
++ mkdir -p /etc/clamav
++ touch /tmp/freshclam.log
++ touch /tmp/freshclam.pid
++
++ mkdir -p $(dirname $FRESHCLAM_CONFIGFILE)
++ ln -sf $freshclam_config_file $FRESHCLAM_CONFIGFILE
++
++ echo "UpdateLogFile " $UpdateLogFile > $FRESHCLAM_CONFIGFILE
++ echo "DatabaseMirror " $DatabaseMirror >> $FRESHCLAM_CONFIGFILE
++ echo "NotifyClamd " $NotifyClamd >> $FRESHCLAM_CONFIGFILE
++ echo "DatabaseOwner " $DatabaseOwner >> $FRESHCLAM_CONFIGFILE
++ echo "CompressLocalDatabase " $CompressLocalDatabase >> $FRESHCLAM_CONFIGFILE
++
++ procd_open_instance
++ procd_set_param command $PROG -d --config-file=$FRESHCLAM_CONFIGFILE -p /tmp/freshclam.pid --no-warnings
++ procd_set_param file $FRESHCLAM_CONFIGFILE
++ procd_close_instance
++}
++
++stop_service()
++{
++ [ ! -f /tmp/freshclam.pid ] && echo "not running" && return 0
++ PID=`cat /tmp/freshclam.pid`
++ kill $PID
++ rm -f /tmp/freshclam.pid
++}
++
++service_triggers()
++{
++ procd_add_reload_trigger "freshclam"
++ procd_add_validation validate_freshclam_section
++}
+diff --git a/feeds/packages/net/clamav/patches/001-compile.patch b/feeds/packages/net/clamav/patches/001-compile.patch
+new file mode 100644
+index 0000000..3992257
+--- /dev/null
++++ b/feeds/packages/net/clamav/patches/001-compile.patch
+@@ -0,0 +1,10 @@
++--- a/clamdscan/proto.c
+++++ b/clamdscan/proto.c
++@@ -55,6 +55,7 @@
++ #include "shared/misc.h"
++ #include "shared/clamdcom.h"
++
+++#include <sys/un.h>
++ #include "proto.h"
++ #include "client.h"
++
+diff --git a/feeds/packages/net/coova-chilli/Config.in b/feeds/packages/net/coova-chilli/Config.in
+new file mode 100644
+index 0000000..c0c671f
+--- /dev/null
++++ b/feeds/packages/net/coova-chilli/Config.in
+@@ -0,0 +1,52 @@
++# CoovaChilli advanced configuration
++
++menu "Configuration"
++ depends on PACKAGE_coova-chilli
++
++config COOVACHILLI_PROXY
++ bool "Enable support for chilli proxy. Required for AAA Proxy through http"
++ default n
++
++config COOVACHILLI_REDIR
++ bool "Enable support for redir server. Required for uamregex"
++ default n
++
++config COOVACHILLI_MINIPORTAL
++ bool "Enable support Coova miniportal"
++ default n
++
++config COOVACHILLI_USERAGENT
++ bool "Enable recording user-agent"
++ default n
++
++config COOVACHILLI_DNSLOG
++ bool "Enable support to log DNS name queries"
++ default n
++
++config COOVACHILLI_UAMDOMAINFILE
++ bool "Enable loading of mass uamdomains from file"
++ default n
++
++config COOVACHILLI_LARGELIMITS
++ bool "Enable larger limits for use with non-embedded systems"
++ default n
++
++choice
++ prompt "SSL library"
++ default COOVACHILLI_NOSSL
++
++config COOVACHILLI_NOSSL
++ bool "No SSL support"
++
++config COOVACHILLI_MATRIXSSL
++ bool "MatrixSSL"
++
++config COOVACHILLI_CYASSL
++ bool "CyaSSL"
++
++config COOVACHILLI_OPENSSL
++ bool "OpenSSL"
++
++endchoice
++
++endmenu
+diff --git a/feeds/packages/net/coova-chilli/Makefile b/feeds/packages/net/coova-chilli/Makefile
+new file mode 100644
+index 0000000..b8acf54
+--- /dev/null
++++ b/feeds/packages/net/coova-chilli/Makefile
+@@ -0,0 +1,150 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=coova-chilli
++PKG_VERSION:=1.3.0+20141128
++PKG_MAINTAINER:=Imre Kaloz <kaloz@openwrt.org>
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_RELEASE:=2
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/coova/coova-chilli
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=b93de20a288c01c2ba28e96e31ad6da01627f45f
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=2adb27ec56172b18c5beee359dd7898d
++
++PKG_INSTALL:=1
++
++PKG_CONFIG_DEPENDS := \
++ COOVACHILLI_MINIPORTAL \
++ COOVACHILLI_REDIR \
++ COOVACHILLI_USERAGENT \
++ COOVACHILLI_DNSLOG \
++ COOVACHILLI_UAMDOMAINFILE \
++ COOVACHILLI_LARGELIMITS \
++ COOVACHILLI_NOSSL \
++ COOVACHILLI_MATRIXSSL \
++ COOVACHILLI_CYASSL \
++ COOVACHILLI_OPENSSL
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++define Package/coova-chilli
++ SUBMENU:=Captive Portals
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+kmod-tun +librt +COOVACHILLI_MATRIXSSL:libmatrixssl +COOVACHILLI_CYASSL:libcyassl +COOVACHILLI_OPENSSL:libopenssl
++ TITLE:=Wireless LAN HotSpot controller (Coova Chilli Version)
++ URL:=http://www.coova.org/CoovaChilli
++ MENU:=1
++endef
++
++define Package/coova-chilli/description
++ CoovaChilli is an open source access controller for wireless LAN
++ access points and is based on ChilliSpot. It is used for authenticating
++ users of a wireless (or wired) LAN. It supports web based login (UAM)
++ which is today's standard for public HotSpots and it supports Wireless
++ Protected Access (WPA) which is the standard of the future.
++ Authentication, authorization and accounting (AAA) is handled by your
++ favorite radius server.
++endef
++
++define Package/coova-chilli/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define KernelPackage/ipt-coova
++ URL:=http://www.coova.org/CoovaChilli
++ SUBMENU:=Netfilter Extensions
++ DEPENDS:=coova-chilli +kmod-ipt-core +libxtables
++ TITLE:=Coova netfilter module
++ FILES:=$(PKG_BUILD_DIR)/src/linux/xt_*.$(LINUX_KMOD_SUFFIX)
++ AUTOLOAD:=$(call AutoProbe,xt_coova)
++endef
++
++define KernelPackage/ipt-coova/description
++ Netfilter kernel module for CoovaChilli
++ Includes:
++ - coova
++endef
++
++DISABLE_NLS=
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_VARS += \
++ ARCH="$(LINUX_KARCH)" \
++ KERNEL_DIR="$(LINUX_DIR)"
++
++MAKE_FLAGS += \
++ ARCH="$(LINUX_KARCH)" \
++ KERNEL_DIR="$(LINUX_DIR)"
++
++MAKE_INSTALL_FLAGS += \
++ ARCH="$(LINUX_KARCH)" \
++ KERNEL_DIR="$(LINUX_DIR)" \
++ INSTALL_MOD_PATH="$(PKG_INSTALL_DIR)"
++
++define Build/Prepare
++$(call Build/Prepare/Default)
++ ( cd $(PKG_BUILD_DIR) ; \
++ [ -f ./configure ] || { \
++ ./bootstrap ; \
++ } \
++ )
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ $(if $(CONFIG_COOVACHILLI_PROXY),--enable,--disable)-chilliproxy \
++ $(if $(CONFIG_COOVACHILLI_REDIR),--enable,--disable)-chilliredir \
++ $(if $(CONFIG_COOVACHILLI_DNSLOG),--enable,--disable)-dnslog \
++ $(if $(CONFIG_COOVACHILLI_MINIPORTAL),--enable,--disable)-miniportal \
++ $(if $(CONFIG_COOVACHILLI_USERAGENT),--enable,--disable)-useragent \
++ $(if $(CONFIG_COOVACHILLI_LARGELIMITS),--enable,--disable)-largelimits \
++ $(if $(CONFIG_COOVACHILLI_UAMDOMAINFILE),--enable,--disable)-uamdomainfile \
++ $(if $(CONFIG_COOVACHILLI_MATRIXSSL),--with,--without)-matrixssl \
++ $(if $(CONFIG_COOVACHILLI_CYASSL),--with,--without)-cyassl \
++ $(if $(CONFIG_COOVACHILLI_OPENSSL),--with,--without)-openssl \
++ $(if $(CONFIG_PACKAGE_kmod-ipt-coova),--with-nfcoova) \
++ )
++endef
++
++define Package/coova-chilli/conffiles
++/etc/config/chilli
++endef
++
++define Package/coova-chilli/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/chilli.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/chilli
++ $(CP) $(PKG_INSTALL_DIR)/etc/chilli/* $(1)/etc/chilli/
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
++ $(INSTALL_DATA) ./files/chilli.hotplug $(1)/etc/hotplug.d/iface/30-chilli
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/chilli* $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib*.so.* $(1)/usr/lib/
++ $(if $(CONFIG_PACKAGE_kmod-ipt-coova), \
++ $(INSTALL_DIR) $(1)/usr/lib/iptables; \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/iptables/lib*.so $(1)/usr/lib/iptables/ \
++ )
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) files/chilli.init $(1)/etc/init.d/chilli
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) files/chilli.config $(1)/etc/config/chilli
++ $(INSTALL_DIR) $(1)/lib/firewall
++ $(CP) files/chilli.firewall $(1)/lib/firewall/chilli.sh
++endef
++
++$(eval $(call BuildPackage,coova-chilli))
++$(eval $(call KernelPackage,ipt-coova))
+diff --git a/feeds/packages/net/coova-chilli/files/chilli.config b/feeds/packages/net/coova-chilli/files/chilli.config
+new file mode 100644
+index 0000000..6aa9837
+--- /dev/null
++++ b/feeds/packages/net/coova-chilli/files/chilli.config
+@@ -0,0 +1,230 @@
++#
++# Sample Coova-Chilli configuration file
++#
++
++config chilli
++ # disable to running chilli. remove this option before running.
++ option disabled 1
++
++ # name of TUN device name. required.
++ option tundev 'tun0'
++
++ # Include this flag if process is to run in the foreground
++ #option fg
++
++ # Include this flag to include debug information.
++ #option debug 9
++
++ # Re-read configuration file at this interval. Will also cause new domain
++ # name lookups to be performed. Value is given in seconds.
++ #option interval 3600
++
++ # File to store information about the process id of the program.
++ # The program must have write access to this file/directory.
++ #option pidfile /var/run/chilli.pid
++
++ # Directory to use for nonvolatile storage.
++ # The program must have write access to this directory.
++ # this option is currently ignored
++ #option statedir ./
++
++
++ # TUN parameters
++
++ # IP network address of external packet data network
++ # Used to allocate dynamic IP addresses and set up routing.
++ # Normally you do not need to uncomment this option.
++ #option net 192.168.182.0/24
++
++ # Dynamic IP address pool
++ # Used to allocate dynamic IP addresses to clients.
++ # If not set it defaults to the net tag.
++ # Do not uncomment this option unless you are an experienced user!
++ #option dynip 192.168.182.0/24
++
++ # Static IP address pool
++ # Used to allocate static IP addresses to clients.
++ # Do not uncomment this option unless you are an experienced user!
++ #option statip 192.168.182.0/24
++
++
++ # Primary DNS server.
++ # Will be suggested to the client.
++ # If omitted the system default will be used.
++ # Normally you do not need to uncomment this option.
++ #option dns1 172.16.0.5
++
++ # Secondary DNS server.
++ # Will be suggested to the client.
++ # If omitted the system default will be used.
++ # Normally you do not need to uncomment this option.
++ #option dns2 172.16.0.6
++
++ # Domain name
++ # Will be suggested to the client.
++ # Normally you do not need to uncomment this option.
++ #option domain key.chillispot.org
++
++ # Script executed after network interface has been brought up.
++ # Executed with the following parameters: <devicename> <ip address>
++ # <mask>
++ # Normally you do not need to uncomment this option.
++ #option ipup /etc/chilli.ipup
++
++ # Script executed after network interface has been taken down.
++ # Executed with the following parameters: <devicename> <ip address>
++ # <mask>
++ # Normally you do not need to uncomment this option.
++ #option ipdown /etc/chilli.ipdown
++
++
++ # Radius parameters
++
++ # IP address to listen to
++ # Normally you do not need to uncomment this option.
++ #option radiuslisten 127.0.0.1
++
++ # IP address of radius server 1
++ # For most installations you need to modify this option.
++ radiusserver1 rad01.chillispot.org
++
++ # IP address of radius server 2
++ # If you have only one radius server you should set radiusserver2 to the
++ # same value as radiusserver1.
++ # For most installations you need to modify this option.
++ radiusserver2 rad02.chillispot.org
++
++ # Radius authentication port
++ # The UDP port number to use for radius authentication requests.
++ # The same port number is used for both radiusserver1 and radiusserver2.
++ # Normally you do not need to uncomment this option.
++ #option radiusauthport 1812
++
++ # Radius accounting port
++ # The UDP port number to use for radius accounting requests.
++ # The same port number is used for both radiusserver1 and radiusserver2.
++ # Normally you do not need to uncomment this option.
++ #option radiusacctport 1813
++
++ # Radius shared secret for both servers
++ # For all installations you should modify this option.
++ #option radiussecret testing123
++
++ # Radius NAS-Identifier
++ # Normally you do not need to uncomment this option.
++ #option radiusnasid nas01
++
++ # WISPr Location ID. Should be in the format: isocc=<ISO_Country_Code>,
++ # cc=<E.164_Country_Code>,ac=<E.164_Area_Code>,network=<ssid/ZONE>
++ # Normally you do not need to uncomment this option.
++ #option radiuslocationid isocc=us,cc=1,ac=408,network=ACMEWISP_NewarkAirport
++
++ # WISPr Location Name. Should be in the format:
++ # <HOTSPOT_OPERATOR_NAME>,<LOCATION>
++ # Normally you do not need to uncomment this option.
++ #option radiuslocationname ACMEWISP,Gate_14_Terminal_C_of_Newark_Airport
++
++
++ # Radius proxy parameters
++
++ # IP address to listen to
++ # Normally you do not need to uncomment this option.
++ #option proxylisten 10.0.0.1
++
++ # UDP port to listen to.
++ # If not specified a port will be selected by the system
++ # Normally you do not need to uncomment this option.
++ #option proxyport 1645
++
++ # Client(s) from which we accept radius requests
++ # Normally you do not need to uncomment this option.
++ #option proxyclient 10.0.0.1/24
++
++ # Radius proxy shared secret for all clients
++ # If not specified defaults to radiussecret
++ # Normally you do not need to uncomment this option.
++ #option proxysecret testing123
++
++
++ # DHCP Parameters
++
++ # Ethernet interface to listen to.
++ # This is the network interface which is connected to the access points.
++ # In a typical configuration this option should be set to eth1.
++ dhcpif eth1
++
++ # Use specified MAC address.
++ # An address in the range 00:00:5E:00:02:00 - 00:00:5E:FF:FF:FF falls
++ # within the IANA range of addresses and is not allocated for other
++ # purposes.
++ # Normally you do not need to uncomment this option.
++ #option dhcpmac 00:00:5E:00:02:00
++
++ # Time before DHCP lease expires
++ # Normally you do not need to uncomment this option.
++ #option lease 600
++
++
++ # Universal access method (UAM) parameters
++
++ # URL of web server handling authentication.
++ uamserver https://radius.chillispot.org/hotspotlogin
++
++ # URL of welcome homepage.
++ # Unauthenticated users will be redirected to this URL. If not specified
++ # users will be redirected to the uamserver instead.
++ # Normally you do not need to uncomment this option.
++ #option uamhomepage http://192.168.182.1/welcome.html
++
++ # Shared between chilli and authentication web server
++ #option uamsecret ht2eb8ej6s4et3rg1ulp
++
++ # IP address to listen to for authentication requests
++ # Do not uncomment this option unless you are an experienced user!
++ #option uamlisten 192.168.182.1
++
++ # TCP port to listen to for authentication requests
++ # Do not uncomment this option unless you are an experienced user!
++ #option uamport 3990
++
++ # Comma separated list of domain names, IP addresses or network segments
++ # the client can access without first authenticating.
++ # It is possible to specify this option multiple times.
++ # Normally you do not need to uncomment this option.
++ #option uamallowed www.chillispot.org,10.11.12.0/24
++
++ # Comma separated list of domain names
++ # the client can access without first authenticating.
++ # It is possible to specify this option multiple times.
++ # Normally you do not need to uncomment this option.
++ #option uamdomain .chillispot.org,.coova.org
++
++ # If this flag is given unauthenticated users are allowed to use
++ # any DNS server.
++ # Normally you do not need to uncomment this option.
++ #option uamanydns
++
++
++ # MAC authentication
++
++ # If this flag is given users will be authenticated only on their MAC
++ # address.
++ # Normally you do not need to uncomment this option.
++ #option macauth
++
++ # List of MAC addresses.
++ # The MAC addresses specified in this list will be authenticated only on
++ # their MAC address.
++ # this option is ignored if the macauth tag is given.
++ # It is possible to specify this option multiple times.
++ # Normally you do not need to uncomment this option.
++ #option macallowed 00-0A-5E-AC-BE-51,00-30-1B-3C-32-E9
++
++ # Password to use for MAC authentication.
++ # Normally you do not need to uncomment this option.
++ #option macpasswd password
++
++ # Suffix to add to MAC address in order to form the username.
++ # Normally you do not need to uncomment this option.
++ #option macsuffix suffix
++
+diff --git a/feeds/packages/net/coova-chilli/files/chilli.firewall b/feeds/packages/net/coova-chilli/files/chilli.firewall
+new file mode 100644
+index 0000000..a5b1d00
+--- /dev/null
++++ b/feeds/packages/net/coova-chilli/files/chilli.firewall
+@@ -0,0 +1,41 @@
++#!/bin/sh
++
++chilli_firewall() {
++ local cfg="$1"
++
++ local network ifname tun
++
++ config_get network "$cfg" network
++
++ . /lib/functions/network.sh
++ network_get_device ifname ${network:-lan}
++
++ if [ "$ifname" = "" ]
++ then
++ config_get ifname "$cfg" dhcpif
++ fi
++
++ config_get tun "$cfg" tundev
++
++ for n in ACCEPT DROP REJECT
++ do
++ iptables -F zone_${network}_${n}
++ iptables -I zone_${network}_${n} -i $tun -j $n
++ iptables -I zone_${network}_${n} -o $tun -j $n
++ done
++
++ iptables -D forward -i ${ifname} -j zone_${network}_forward
++ iptables -A forward -i ${ifname} -j DROP
++ iptables -A forward -i $tun -j zone_${network}_forward
++
++ iptables -D input -i ${ifname} -j zone_${network}
++ iptables -A input -i $tun -j zone_${network}
++
++ iptables -I zone_${network} -p tcp --dport 3990 -j ACCEPT
++ iptables -I zone_${network} -p tcp --dport 3991 -j ACCEPT
++}
++
++chilli_post_core_cb() {
++ config_load chilli
++ config_foreach chilli_firewall chilli
++}
+diff --git a/feeds/packages/net/coova-chilli/files/chilli.hotplug b/feeds/packages/net/coova-chilli/files/chilli.hotplug
+new file mode 100644
+index 0000000..e12812b
+--- /dev/null
++++ b/feeds/packages/net/coova-chilli/files/chilli.hotplug
+@@ -0,0 +1,7 @@
++#!/bin/sh
++
++[ "$ACTION" == "ifup" ] || exit 0
++
++[ "$INTERFACE" = "wan" ] && {
++ /etc/init.d/chilli restart
++}
+diff --git a/feeds/packages/net/coova-chilli/files/chilli.init b/feeds/packages/net/coova-chilli/files/chilli.init
+new file mode 100644
+index 0000000..15b79af
+--- /dev/null
++++ b/feeds/packages/net/coova-chilli/files/chilli.init
+@@ -0,0 +1,61 @@
++#!/bin/sh /etc/rc.common
++
++START=30
++STOP=90
++
++config_cb() {
++ chilli_inst=$2
++ if [ "$chilli_inst" != "" ]
++ then
++ rm -f /var/run/chilli_${chilli_inst}*
++ chilli_conf=/var/run/chilli_${chilli_inst}.conf
++ eval "start_chilli_$chilli_inst=1"
++ fi
++}
++
++option_cb() {
++ case "$1" in
++ # UCI settings
++ network)
++ . /lib/functions/network.sh
++ local ifname
++ network_get_device ifname $2
++ echo "dhcpif=\"$ifname\"" >> $chilli_conf
++ ;;
++ disabled)
++ eval "start_chilli_$chilli_inst=0"
++ ;;
++ # boolean settings
++ dhcpbroadcast|nodynip|vlanlocation|locationstopstart|locationcopycalled|locationimmediateupdate|locationopt82|coanoipcheck|noradallow|proxymacaccept|proxyonacct|dhcpmacset|dhcpradius|noc2c|eapolenable|uamanydns|uamanyip|uamnatanyip|nouamsuccess|nowispr1|nowispr2|domaindnslocal|radsec|macauth|macreauth|macauthdeny|macallowlocal|strictmacauth|strictdhcp|ieee8021q|only8021q|radiusoriginalurl|swapoctets|statusfilesave|wpaguests|openidauth|papalwaysok|mschapv2|chillixml|acctupdate|dnsparanoia|seskeepalive|usetap|noarpentries|framedservice|scalewin|redir|injectwispr|redirurl|routeonetone|nousergardendata|uamgardendata|uamotherdata|withunixipc|uamallowpost|redirssl|uamuissl|layer3|patricia|redirdnsreq|dhcpnotidle|ipv6|ipv6only)
++ [ "$2" = "true" -o "$2" = "1" ] && echo "$1" >> $chilli_conf
++ ;;
++ *)
++ echo "$1=\"$2\"" >> $chilli_conf
++ ;;
++ esac
++}
++
++start_chilli() {
++ local cfg="$1"
++ local start_chilli=$(eval "echo \$start_chilli_$cfg")
++ [ "$start_chilli" = "0" ] && return
++ local base=/var/run/chilli_${cfg}
++ chilli -c ${base}.conf \
++ --pidfile ${base}.pid \
++ --cmdsocket ${base}.sock \
++ --unixipc ${base}.ipc &
++}
++
++start() {
++ config_load chilli
++ config_foreach start_chilli chilli
++}
++
++stop() {
++ ls /var/run/chilli*.pid 2>/dev/null && {
++ kill $(cat /var/run/chilli*.pid)
++ sleep 1
++ killall -9 chilli
++ rm -f /var/run/chilli*
++ }
++}
+diff --git a/feeds/packages/net/coova-chilli/patches/100-fix-sysinfo-redeclaration.patch b/feeds/packages/net/coova-chilli/patches/100-fix-sysinfo-redeclaration.patch
+new file mode 100644
+index 0000000..2efecbe
+--- /dev/null
++++ b/feeds/packages/net/coova-chilli/patches/100-fix-sysinfo-redeclaration.patch
+@@ -0,0 +1,24 @@
++--- a/src/system.h
+++++ b/src/system.h
++@@ -83,10 +83,6 @@
++ #include <linux/sysinfo.h>
++ #endif
++
++-#ifdef HAVE_SYS_SYSINFO_H
++-#include <sys/sysinfo.h>
++-#endif
++-
++ #ifdef HAVE_TIME_H
++ #include <time.h>
++ #endif
++@@ -139,6 +135,10 @@
++ #include <linux/un.h>
++ #endif
++
+++#ifdef HAVE_SYS_SYSINFO_H
+++#include <sys/sysinfo.h>
+++#endif
+++
++ #elif defined (__FreeBSD__) || defined (__APPLE__) || defined (__OpenBSD__) || defined (__NetBSD__)
++ #include <net/if.h>
++ #include <net/bpf.h>
+diff --git a/feeds/packages/net/coova-chilli/patches/200-fix_compile_kmod.patch b/feeds/packages/net/coova-chilli/patches/200-fix_compile_kmod.patch
+new file mode 100644
+index 0000000..2722578
+--- /dev/null
++++ b/feeds/packages/net/coova-chilli/patches/200-fix_compile_kmod.patch
+@@ -0,0 +1,17 @@
++--- a/src/linux/Makefile
+++++ b/src/linux/Makefile
++@@ -21,11 +21,11 @@ lib%.so: lib%.o
++ $(CC) $(CFLAGS) -shared -o $@ $^;
++
++ lib%.o: lib%.c
++- $(CC) $(CFLAGS) -fPIC -O2 -Wall -I${KERNEL_DIR}/include -D_INIT=lib$*_init -c -o $@ $<;
+++ $(CC) $(CFLAGS) -D_INIT=lib$*_init -c -o $@ $<;
++
++ install: modules_install libxt_coova.so
++- mkdir -p $(DESTDIR)/lib/xtables/
++- cp libxt_coova.so $(DESTDIR)/lib/xtables/
+++ mkdir -p $(DESTDIR)/usr/lib/iptables/
+++ cp libxt_coova.so $(DESTDIR)/usr/lib/iptables/
++
++ distdir:
++
+diff --git a/feeds/packages/net/coova-chilli/patches/201-fix_dereferencing_pointers.patch b/feeds/packages/net/coova-chilli/patches/201-fix_dereferencing_pointers.patch
+new file mode 100644
+index 0000000..d608835
+--- /dev/null
++++ b/feeds/packages/net/coova-chilli/patches/201-fix_dereferencing_pointers.patch
+@@ -0,0 +1,49 @@
++--- a/src/linux/xt_coova.c
+++++ b/src/linux/xt_coova.c
++@@ -292,6 +292,8 @@ static int coova_mt_check(const struct x
++ struct coova_table *t;
++ #ifdef CONFIG_PROC_FS
++ struct proc_dir_entry *pde;
+++ kuid_t uid;
+++ kgid_t gid;
++ #endif
++ unsigned i;
++ int ret = 0;
++@@ -330,8 +332,9 @@ static int coova_mt_check(const struct x
++ ret = -ENOMEM;
++ goto out;
++ }
++- pde->uid = ip_list_uid;
++- pde->gid = ip_list_gid;
+++ uid = make_kuid(&init_user_ns, ip_list_uid);
+++ gid = make_kgid(&init_user_ns, ip_list_gid);
+++ proc_set_user(pde, uid, gid);
++ #endif
++ spin_lock_bh(&coova_lock);
++ list_add_tail(&t->list, &tables);
++@@ -445,14 +448,13 @@ static const struct seq_operations coova
++
++ static int coova_seq_open(struct inode *inode, struct file *file)
++ {
++- struct proc_dir_entry *pde = PDE(inode);
++ struct coova_iter_state *st;
++
++ st = __seq_open_private(file, &coova_seq_ops, sizeof(*st));
++ if (st == NULL)
++ return -ENOMEM;
++
++- st->table = pde->data;
+++ st->table = PDE_DATA(inode);
++ return 0;
++ }
++
++@@ -460,8 +462,7 @@ static ssize_t
++ coova_mt_proc_write(struct file *file, const char __user *input,
++ size_t size, loff_t *loff)
++ {
++- const struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
++- struct coova_table *t = pde->data;
+++ struct coova_table *t = PDE_DATA(file->f_path.dentry->d_inode);
++ struct coova_entry *e;
++ char buf[sizeof("+b335:1d35:1e55:dead:c0de:1715:5afe:c0de")];
++ const char *c = buf;
+diff --git a/feeds/packages/net/coova-chilli/patches/300-fix-compile-with-cyassl.patch b/feeds/packages/net/coova-chilli/patches/300-fix-compile-with-cyassl.patch
+new file mode 100644
+index 0000000..3b61d49
+--- /dev/null
++++ b/feeds/packages/net/coova-chilli/patches/300-fix-compile-with-cyassl.patch
+@@ -0,0 +1,28 @@
++--- a/src/md5.h
+++++ b/src/md5.h
++@@ -28,6 +28,14 @@
++ #define MD5Update MD5_Update
++ #define MD5Final MD5_Final
++
+++#elif HAVE_CYASSL
+++#include <cyassl/openssl/md5.h>
+++
+++#define MD5Init MD5_Init
+++#define MD5Update MD5_Update
+++#define MD5Final MD5_Final
+++
+++typedef struct CYASSL_MD5_CTX MD5_CTX;
++ #else
++
++ struct MD5Context {
++--- a/src/md5.c
+++++ b/src/md5.c
++@@ -18,7 +18,7 @@
++ #include <string.h> /* for memcpy() */
++ #include "md5.h"
++
++-#ifndef HAVE_OPENSSL
+++#if !defined(HAVE_OPENSSL) && !defined(HAVE_CYASSL)
++
++ void byteReverse(unsigned char *buf, size_t longs);
++
+diff --git a/feeds/packages/net/cshark/Makefile b/feeds/packages/net/cshark/Makefile
+new file mode 100644
+index 0000000..cbfbed5
+--- /dev/null
++++ b/feeds/packages/net/cshark/Makefile
+@@ -0,0 +1,75 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=cshark
++PKG_VERSION:=2015-03-13
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/cloudshark/cshark.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=ab2ae2fbd72b6cbd57c95e3192edc3c1f475412b
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/cshark
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=CloudShark capture tool
++ URL:=http://www.cloudshark.org/
++ DEPENDS:=+libjson-c +libpcap +libuci +libubox +libuclient +libustream-polarssl
++ MAINTAINER:=Luka Perkov <luka@openwrt.org>
++endef
++
++define Package/luci-app-cshark
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=3. Applications
++ TITLE:=Cloudshark capture tool Web UI
++ DEPENDS:=+cshark +luci
++ MAINTAINER:=Luka Perkov <luka@openwrt.org>
++endef
++
++CMAKE_OPTIONS = \
++ -DCMAKE_INSTALL_PREFIX=/usr \
++ -DWITH_DEBUG=OFF \
++
++define Package/cshark/conffiles
++/etc/config/cshark
++endef
++
++define Package/cshark/install
++ $(INSTALL_DIR) $(1)/sbin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/cshark \
++ $(1)/sbin/
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) \
++ $(PKG_BUILD_DIR)/config/cshark \
++ $(1)/etc/config/
++
++ $(INSTALL_DIR) $(1)/etc/ssl/certs
++ $(INSTALL_CONF) \
++ $(PKG_BUILD_DIR)/config/ca-the_usertrust_network.pem \
++ $(1)/etc/ssl/certs/
++endef
++
++define Package/luci-app-cshark/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci
++ $(CP) -R $(PKG_BUILD_DIR)/openwrt/luci/luasrc/* $(1)/usr/lib/lua/luci/
++endef
++
++$(eval $(call BuildPackage,cshark))
++$(eval $(call BuildPackage,luci-app-cshark))
+diff --git a/feeds/packages/net/ctorrent-svn/Makefile b/feeds/packages/net/ctorrent-svn/Makefile
+new file mode 100644
+index 0000000..0725f59
+--- /dev/null
++++ b/feeds/packages/net/ctorrent-svn/Makefile
+@@ -0,0 +1,98 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ctorrent-svn
++PKG_REV:=322
++PKG_VERSION:=r$(PKG_REV)
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://svn.code.sf.net/p/dtorrent/code/dtorrent/trunk
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_PROTO:=svn
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_CHECK_FORMAT_SECURITY:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ctorrent-svn/Default
++ SUBMENU:=BitTorrent
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+uclibcxx
++ TITLE:=console-based BitTorrent client
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++ URL:=http://www.rahul.net/dholmes/ctorrent/
++endef
++
++define Package/ctorrent-svn/Default/description
++ CTorrent is a BitTorrent client written in the C programming language,
++ known to be a very robust and mature programming language, which produces
++ fast and optimized application.
++endef
++
++define Package/ctorrent-svn
++$(call Package/ctorrent-svn/Default)
++ TITLE+= (with OpenSSL support)
++ DEPENDS+=+libopenssl
++ VARIANT:=ssl
++endef
++
++define Package/ctorrent-svn/description
++$(call Package/ctorrent-svn/Default/description)
++ This package is built with OpenSSL support.
++endef
++
++define Package/ctorrent-svn-nossl
++$(call Package/ctorrent-svn/Default)
++ TITLE+= (with builtin SHA-1)
++ VARIANT:=nossl
++endef
++
++define Package/ctorrent-svn-nossl/description
++$(call Package/ctorrent-svn/Default/description)
++ This package is built with builtin (Steve Reid's public-domain) SHA-1 support
++endef
++
++CONFIGURE_VARS += \
++ CXX="g++-uc" \
++ LIBS="-nodefaultlibs -luClibc++ $(LIBGCC_S) -lc"
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS += \
++ --with-ssl="$(STAGING_DIR)/usr"
++endif
++
++ifeq ($(BUILD_VARIANT),nossl)
++ CONFIGURE_ARGS += \
++ --with-ssl=no
++endif
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); touch \
++ configure.ac \
++ aclocal.m4 \
++ Makefile.in \
++ config.h.in \
++ configure \
++ );
++ $(call Build/Configure/Default)
++endef
++
++define Package/ctorrent-svn/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ctorrent $(1)/usr/bin/ctorrent
++endef
++
++Package/ctorrent-svn-nossl/install = $(Package/ctorrent-svn/install)
++
++$(eval $(call BuildPackage,ctorrent-svn))
++$(eval $(call BuildPackage,ctorrent-svn-nossl))
+diff --git a/feeds/packages/net/ctorrent-svn/patches/100-compile-fix.patch b/feeds/packages/net/ctorrent-svn/patches/100-compile-fix.patch
+new file mode 100644
+index 0000000..bb7d33f
+--- /dev/null
++++ b/feeds/packages/net/ctorrent-svn/patches/100-compile-fix.patch
+@@ -0,0 +1,88 @@
++diff --git a/btconfig.cpp b/btconfig.cpp
++index e1badd0..aaa6feb 100644
++--- a/btconfig.cpp
+++++ b/btconfig.cpp
++@@ -828,7 +828,7 @@ void CfgCTCS(Config<const char *> *config)
++ strncpy(CTCS.m_host, *cfg_ctcs, MAXHOSTNAMELEN-1);
++ CTCS.m_host[MAXHOSTNAMELEN-1] = '\0';
++ if( (s = strchr(CTCS.m_host, ':')) ) *s='\0';
++- CTCS.m_port = atoi(s = (strchr(*cfg_ctcs, ':')+1));
+++ CTCS.m_port = atoi(s = (char*)(strchr(*cfg_ctcs, ':')+1));
++ if( strchr(s, ':') )
++ CONSOLE.Input("Enter CTCS password: ", CTCS.m_pass, CTCS_PASS_SIZE);
++ else *CTCS.m_pass = '\0';
++diff --git a/btcontent.cpp b/btcontent.cpp
++index d84f450..88ccb50 100644
++--- a/btcontent.cpp
+++++ b/btcontent.cpp
++@@ -1408,27 +1408,27 @@ void btContent::CompletionCommand()
++ ptmp = cmdstr + strlen(cmdstr);
++ parg = strstr(parg, "&t") + 2;
++ strcat(pt, parg);
++- pt = strstr(ptmp, "&t");
++- if( pd ) pd = strstr(ptmp, "&d");
++- if( pw ) pw = strstr(ptmp, "&w");
+++ pt = (char *)strstr(ptmp, "&t");
+++ if( pd ) pd = (char *)strstr(ptmp, "&d");
+++ if( pw ) pw = (char *)strstr(ptmp, "&w");
++ }
++ if( pd && (!pt || pd < pt) && (!pw || pd < pw) ){
++ strcpy(pd, m_btfiles.GetDataName());
++ ptmp = cmdstr + strlen(cmdstr);
++ parg = strstr(parg, "&d") + 2;
++ strcat(pd, parg);
++- pd = strstr(ptmp, "&d");
++- if( pt ) pt = strstr(ptmp, "&t");
++- if( pw ) pw = strstr(ptmp, "&w");
+++ pd = (char *)strstr(ptmp, "&d");
+++ if( pt ) pt = (char *)strstr(ptmp, "&t");
+++ if( pw ) pw = (char *)strstr(ptmp, "&w");
++ }
++ if( pw && (!pt || pw < pt) && (!pd || pw < pd) ){
++ strcpy(pw, wd);
++ ptmp = cmdstr + strlen(cmdstr);
++ parg = strstr(parg, "&w") + 2;
++ strcat(pw, parg);
++- pw = strstr(ptmp, "&w");
++- if( pt ) pt = strstr(ptmp, "&t");
++- if( pd ) pd = strstr(ptmp, "&d");
+++ pw = (char *)strstr(ptmp, "&w");
+++ if( pt ) pt = (char *)strstr(ptmp, "&t");
+++ if( pd ) pd = (char *)strstr(ptmp, "&d");
++ }
++ }
++ }
++diff --git a/console.cpp b/console.cpp
++index bdadb61..5ab2492 100644
++--- a/console.cpp
+++++ b/console.cpp
++@@ -511,11 +511,8 @@ void ConStream::Error(int sev, const char *message, ...)
++ va_list ap;
++
++ va_start(ap, message);
++- if( g_console_ready ) CONSOLE.Error(sev, message, ap);
++- else{
++ vfprintf(stderr, message, ap);
++ fflush(stderr);
++- }
++ va_end(ap);
++ }
++
++@@ -1766,7 +1763,7 @@ void Console::Warning(int sev, const char *message, ...)
++ va_end(ap);
++ }
++
++-
+++/*
++ void Console::Error(int sev, const char *message, va_list ap)
++ {
++ vsnprintf(m_buffer, sizeof(m_buffer), message, ap);
++@@ -1778,7 +1775,7 @@ void Console::Error(int sev, const char *message, va_list ap)
++ m_warnings.AddMessage(sev, m_buffer);
++ if( sev && *cfg_ctcs ) CTCS.Send_Info(sev, m_buffer);
++ }
++-
+++*/
++
++ void Console::Debug(const char *message, ...)
++ {
+diff --git a/feeds/packages/net/ctorrent-svn/patches/300-negative.patch b/feeds/packages/net/ctorrent-svn/patches/300-negative.patch
+new file mode 100644
+index 0000000..e1e1e65
+--- /dev/null
++++ b/feeds/packages/net/ctorrent-svn/patches/300-negative.patch
+@@ -0,0 +1,14 @@
++diff --git a/bencode.cpp b/bencode.cpp
++index fef82ba..b7f14bc 100644
++--- a/bencode.cpp
+++++ b/bencode.cpp
++@@ -45,6 +45,9 @@ size_t buf_int(const char *b, size_t len, char beginchar, char endchar,
++ p++;
++ len--;
++ }
+++ if( *p == '-'){
+++ p++; len--;
+++ }
++
++ for( psave = p; len && isdigit(*p); p++, len-- );
++
+diff --git a/feeds/packages/net/ctorrent-svn/patches/400-musl-compat.patch b/feeds/packages/net/ctorrent-svn/patches/400-musl-compat.patch
+new file mode 100644
+index 0000000..e17c147
+--- /dev/null
++++ b/feeds/packages/net/ctorrent-svn/patches/400-musl-compat.patch
+@@ -0,0 +1,10 @@
++--- a/compat.c
+++++ b/compat.c
++@@ -51,6 +51,7 @@ int snprintf(char *str, size_t size, con
++
++ #ifndef HAVE_STRNSTR
++ #include <string.h>
+++#include <sys/types.h>
++ /* FUNCTION PROGRAMER: Siberiaic Sang */
++ char *strnstr(const char *haystack, const char *needle, size_t haystacklen)
++ {
+diff --git a/feeds/packages/net/ctorrent/Makefile b/feeds/packages/net/ctorrent/Makefile
+new file mode 100644
+index 0000000..6a8e481
+--- /dev/null
++++ b/feeds/packages/net/ctorrent/Makefile
+@@ -0,0 +1,84 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ctorrent
++PKG_VERSION:=dnh3.3.2
++PKG_RELEASE:=7
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/dtorrent \
++ http://www.rahul.net/dholmes/ctorrent/
++PKG_MD5SUM:=59b23dd05ff70791cd6449effa7fc3b6
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ctorrent/Default
++ SUBMENU:=BitTorrent
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=$(CXX_DEPENDS)
++ TITLE:=console-based BitTorrent client
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++ URL:=http://www.rahul.net/dholmes/ctorrent/
++endef
++
++define Package/ctorrent/Default/description
++ CTorrent is a BitTorrent client written in the C programming language,
++ known to be a very robust and mature programming language, which produces
++ fast and optimized application.
++endef
++
++define Package/ctorrent
++$(call Package/ctorrent/Default)
++ TITLE+= (with OpenSSL support)
++ DEPENDS+=+libopenssl
++ VARIANT:=ssl
++endef
++
++define Package/ctorrent/description
++$(call Package/ctorrent/Default/description)
++ This package is built with OpenSSL support.
++endef
++
++define Package/ctorrent-nossl
++$(call Package/ctorrent/Default)
++ TITLE+= (with builtin SHA-1)
++ VARIANT:=nossl
++endef
++
++define Package/ctorrent-nossl/description
++$(call Package/ctorrent/Default/description)
++ This package is built with builtin (Steve Reid's public-domain) SHA-1 support
++endef
++
++CONFIGURE_VARS += \
++ CXXFLAGS="$$$$CXXFLAGS -fno-rtti"
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS += \
++ --with-ssl="$(STAGING_DIR)/usr"
++endif
++
++ifeq ($(BUILD_VARIANT),nossl)
++ CONFIGURE_ARGS += \
++ --with-ssl=no
++endif
++
++define Package/ctorrent/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/bin/$(PKG_NAME)
++endef
++
++Package/ctorrent-nossl/install = $(Package/ctorrent/install)
++
++$(eval $(call BuildPackage,ctorrent))
++$(eval $(call BuildPackage,ctorrent-nossl))
+diff --git a/feeds/packages/net/ctorrent/patches/100-CVE-2009-1759.patch b/feeds/packages/net/ctorrent/patches/100-CVE-2009-1759.patch
+new file mode 100644
+index 0000000..86ae1d7
+--- /dev/null
++++ b/feeds/packages/net/ctorrent/patches/100-CVE-2009-1759.patch
+@@ -0,0 +1,364 @@
++Patch for CVE-2009-1759.
++Source: Upstream SVN, rev 302 from the dtorrent-3 branch.
++
++Index: a/bencode.h
++===================================================================
++--- a/bencode.h (revision 300)
+++++ b/bencode.h (revision 302)
++@@ -25,7 +25,7 @@
++ size_t decode_list(const char *b,size_t len,const char *keylist);
++ size_t decode_rev(const char *b,size_t len,const char *keylist);
++ size_t decode_query(const char *b,size_t len,const char *keylist,const char **ps,size_t *pi,int64_t *pl,int method);
++-size_t decode_list2path(const char *b, size_t n, char *pathname);
+++size_t decode_list2path(const char *b, size_t n, char *pathname, size_t maxlen);
++ size_t bencode_buf(const char *str,size_t len,FILE *fp);
++ size_t bencode_str(const char *str, FILE *fp);
++ size_t bencode_int(const uint64_t integer, FILE *fp);
++Index: a/bencode.cpp
++===================================================================
++--- a/bencode.cpp (revision 300)
+++++ b/bencode.cpp (revision 302)
++@@ -233,22 +233,28 @@
++ return bencode_end_dict_list(fp);
++ }
++
++-size_t decode_list2path(const char *b, size_t n, char *pathname)
+++size_t decode_list2path(const char *b, size_t n, char *pathname, size_t maxlen)
++ {
++ const char *pb = b;
++ const char *s = (char *) 0;
+++ const char *endmax = pathname + maxlen - 1;
++ size_t r,q;
++
++ if( 'l' != *pb ) return 0;
++ pb++;
++ n--;
++ if( !n ) return 0;
++- for(; n;){
+++ while( n && pathname < endmax ){
++ if(!(r = buf_str(pb, n, &s, &q)) ) return 0;
+++ if( q >= maxlen ) return 0;
++ memcpy(pathname, s, q);
++ pathname += q;
++- pb += r; n -= r;
++- if( 'e' != *pb ){*pathname = PATH_SP, pathname++;} else break;
+++ maxlen -= q;
+++ pb += r;
+++ n -= r;
+++ if( 'e' == *pb ) break;
+++ if( pathname >= endmax ) return 0;
+++ *pathname++ = PATH_SP;
++ }
++ *pathname = '\0';
++ return (pb - b + 1);
++Index: a/btfiles.cpp
++===================================================================
++--- a/btfiles.cpp (revision 300)
+++++ b/btfiles.cpp (revision 302)
++@@ -449,7 +449,8 @@
++ return 0;
++ }
++
++-int btFiles::BuildFromMI(const char *metabuf, const size_t metabuf_len, const char *saveas)
+++int btFiles::BuildFromMI(const char *metabuf, const size_t metabuf_len,
+++ const char *saveas, unsigned char exam_only)
++ {
++ char path[MAXPATHLEN];
++ const char *s, *p;
++@@ -458,11 +459,19 @@
++ int f_warned = 0;
++
++ if( !decode_query(metabuf, metabuf_len, "info|name", &s, &q, (int64_t*)0,
++- QUERY_STR) || MAXPATHLEN <= q )
+++ QUERY_STR) || MAXPATHLEN <= q ){
+++ errno = EINVAL;
++ return -1;
+++ }
++
++ memcpy(path, s, q);
++ path[q] = '\0';
+++ if( !exam_only &&
+++ (PATH_SP == path[0] || '/' == path[0] || 0==strncmp("..", path, 2)) ){
+++ CONSOLE.Warning(1, "error, unsafe path \"%s\" in torrent data", path);
+++ errno = EINVAL;
+++ return -1;
+++ }
++
++ r = decode_query(metabuf, metabuf_len, "info|files", (const char**)0, &q,
++ (int64_t*)0, QUERY_POS);
++@@ -471,21 +480,31 @@
++ BTFILE *pbf_last = (BTFILE*) 0;
++ BTFILE *pbf = (BTFILE*) 0;
++ size_t dl;
+++ unsigned long nfiles = 0;
+++
++ if( decode_query(metabuf,metabuf_len,"info|length",
++- (const char**) 0,(size_t*) 0,(int64_t*) 0,QUERY_LONG) )
+++ (const char**) 0,(size_t*) 0,(int64_t*) 0,QUERY_LONG) ){
+++ errno = EINVAL;
++ return -1;
+++ }
++
++ if( saveas ){
++ m_directory = new char[strlen(saveas) + 1];
++ #ifndef WINDOWS
++- if(!m_directory) return -1;
+++ if( !m_directory ){
+++ errno = ENOMEM;
+++ return -1;
+++ }
++ #endif
++ strcpy(m_directory,saveas);
++ }else{
++ int f_conv;
++ char *tmpfn = new char[strlen(path)*2+5];
++ #ifndef WINDOWS
++- if( !tmpfn ) return -1;
+++ if( !tmpfn ){
+++ errno = ENOMEM;
+++ return -1;
+++ }
++ #endif
++ if( f_conv = ConvertFilename(tmpfn, path, strlen(path)*2+5) ){
++ if( arg_flg_convert_filenames ){
++@@ -493,6 +512,7 @@
++ #ifndef WINDOWS
++ if( !m_directory ){
++ delete []tmpfn;
+++ errno = ENOMEM;
++ return -1;
++ }
++ #endif
++@@ -507,7 +527,10 @@
++ if( !f_conv || !arg_flg_convert_filenames ){
++ m_directory = new char[strlen(path) + 1];
++ #ifndef WINDOWS
++- if( !m_directory ) return -1;
+++ if( !m_directory ){
+++ errno = ENOMEM;
+++ return -1;
+++ }
++ #endif
++ strcpy(m_directory,path);
++ }
++@@ -517,24 +540,50 @@
++ p = metabuf + r + 1;
++ q--;
++ for(; q && 'e' != *p; p += dl, q -= dl){
++- if(!(dl = decode_dict(p, q, (const char*) 0)) ) return -1;
++- if( !decode_query(p, dl, "length", (const char**) 0,
++- (size_t*) 0,&t,QUERY_LONG) ) return -1;
+++ if( !(dl = decode_dict(p, q, (const char*) 0)) ||
+++ !decode_query(p, dl, "length", (const char**) 0, (size_t*) 0, &t,
+++ QUERY_LONG) ){
+++ errno = EINVAL;
+++ return -1;
+++ }
++ pbf = _new_bfnode();
++ #ifndef WINDOWS
++- if( !pbf ) return -1;
+++ if( !pbf ){
+++ errno = ENOMEM;
+++ return -1;
+++ }
++ #endif
+++ nfiles++;
++ pbf->bf_length = t;
++ m_total_files_length += t;
++ r = decode_query(p, dl, "path", (const char **)0, &n, (int64_t*)0,
++ QUERY_POS);
++- if( !r ) return -1;
++- if(!decode_list2path(p + r, n, path)) return -1;
+++ if( !r || !decode_list2path(p + r, n, path, sizeof(path)) ){
+++ CONSOLE.Warning(1,
+++ "error, invalid path in torrent data for file %lu at offset %llu",
+++ nfiles, m_total_files_length - t);
+++ delete pbf;
+++ errno = EINVAL;
+++ return -1;
+++ }
+++ if( !exam_only &&
+++ (PATH_SP == path[0] || '/' == path[0] || 0==strncmp("..", path, 2)) ){
+++ CONSOLE.Warning(1,
+++ "error, unsafe path \"%s\" in torrent data for file %lu",
+++ path, nfiles);
+++ delete pbf;
+++ errno = EINVAL;
+++ return -1;
+++ }
++
+++
++ int f_conv;
++ char *tmpfn = new char[strlen(path)*2+5];
++ #ifndef WINDOWS
++- if( !tmpfn ) return -1;
+++ if( !tmpfn ){
+++ errno = ENOMEM;
+++ return -1;
+++ }
++ #endif
++ if( f_conv = ConvertFilename(tmpfn, path, strlen(path)*2+5) ){
++ if( arg_flg_convert_filenames ){
++@@ -542,6 +591,7 @@
++ #ifndef WINDOWS
++ if( !pbf->bf_filename ){
++ delete []tmpfn;
+++ errno = ENOMEM;
++ return -1;
++ }
++ #endif
++@@ -556,7 +606,10 @@
++ if( !f_conv || !arg_flg_convert_filenames ){
++ pbf->bf_filename = new char[strlen(path) + 1];
++ #ifndef WINDOWS
++- if( !pbf->bf_filename ) return -1;
+++ if( !pbf->bf_filename ){
+++ errno = ENOMEM;
+++ return -1;
+++ }
++ #endif
++ strcpy(pbf->bf_filename, path);
++ }
++@@ -564,30 +617,42 @@
++ pbf_last = pbf;
++ }
++ }else{
++- if( !decode_query(metabuf,metabuf_len,"info|length",
++- (const char**) 0,(size_t*) 0,&t,QUERY_LONG) )
+++ if( !decode_query(metabuf,metabuf_len, "info|length",
+++ (const char**)0, (size_t*) 0, &t, QUERY_LONG) ){
+++ errno = EINVAL;
++ return -1;
+++ }
++ m_btfhead = _new_bfnode();
++ #ifndef WINDOWS
++- if( !m_btfhead) return -1;
+++ if( !m_btfhead ){
+++ errno = ENOMEM;
+++ return -1;
+++ }
++ #endif
++ m_btfhead->bf_length = m_total_files_length = t;
++ if( saveas ){
++ m_btfhead->bf_filename = new char[strlen(saveas) + 1];
++ #ifndef WINDOWS
++- if(!m_btfhead->bf_filename ) return -1;
+++ if( !m_btfhead->bf_filename ){
+++ errno = ENOMEM;
+++ return -1;
+++ }
++ #endif
++ strcpy(m_btfhead->bf_filename, saveas);
++ }else if( arg_flg_convert_filenames ){
++ char *tmpfn = new char[strlen(path)*2+5];
++ #ifndef WINDOWS
++- if( !tmpfn ) return -1;
+++ if( !tmpfn ){
+++ errno = ENOMEM;
+++ return -1;
+++ }
++ #endif
++ ConvertFilename(tmpfn, path, strlen(path)*2+5);
++ m_btfhead->bf_filename = new char[strlen(tmpfn) + 1];
++ #ifndef WINDOWS
++ if( !m_btfhead->bf_filename ){
++ delete []tmpfn;
+++ errno = ENOMEM;
++ return -1;
++ }
++ #endif
++@@ -596,7 +661,10 @@
++ }else{
++ m_btfhead->bf_filename = new char[strlen(path) + 1];
++ #ifndef WINDOWS
++- if(!m_btfhead->bf_filename ) return -1;
+++ if( !m_btfhead->bf_filename ){
+++ errno = ENOMEM;
+++ return -1;
+++ }
++ #endif
++ strcpy(m_btfhead->bf_filename, path);
++ }
++@@ -694,6 +762,32 @@
++ size_t btFiles::FillMetaInfo(FILE* fp)
++ {
++ BTFILE *p;
+++ const char *refname, *s;
+++ char path[MAXPATHLEN];
+++
+++ refname = m_directory ? m_directory : m_btfhead->bf_filename;
+++ while( (s = strchr(refname, PATH_SP)) && *(s + 1) ){
+++ refname = s + 1;
+++ }
+++ if( m_directory && '.' == *refname ){
+++ char dir[MAXPATHLEN];
+++ if( getcwd(dir, sizeof(dir)) && 0==chdir(m_directory) ){
+++ if( getcwd(path, sizeof(path)) ){
+++ refname = path;
+++ while( (s = strchr(refname, PATH_SP)) && *(s + 1) ){
+++ refname = s + 1;
+++ }
+++ }
+++ chdir(dir);
+++ }
+++ }
+++ if( '/' == *refname || '\0' == *refname || '.' == *refname ){
+++ CONSOLE.Warning(1, "error, inappropriate file or directory name \"%s\"",
+++ m_directory ? m_directory : m_btfhead->bf_filename);
+++ errno = EINVAL;
+++ return 0;
+++ }
+++
++ if( m_directory ){
++ // multi files
++ if( bencode_str("files", fp) != 1 ) return 0;
++@@ -715,16 +809,15 @@
++ if(bencode_end_dict_list(fp) != 1 ) return 0;
++
++ if(bencode_str("name", fp) != 1) return 0;
++- return bencode_str(m_directory, fp);
++-
+++ return bencode_str(refname, fp);
++ }else{
++ if( bencode_str("length", fp) != 1 ) return 0;
++ if( bencode_int(m_btfhead->bf_length, fp) != 1) return 0;
++
++ if( bencode_str("name", fp) != 1 ) return 0;
++- return bencode_str(m_btfhead->bf_filename, fp);
+++ return bencode_str(refname, fp);
++ }
++- return 1;
+++ return 0;
++ }
++
++
++Index: a/btcontent.cpp
++===================================================================
++--- a/btcontent.cpp (revision 300)
+++++ b/btcontent.cpp (revision 302)
++@@ -357,7 +357,11 @@
++
++ cfg_req_queue_length = (m_piece_length / cfg_req_slice_size) * 2 - 1;
++
++- if( m_btfiles.BuildFromMI(b, flen, saveas) < 0 ) ERR_RETURN();
+++ if( m_btfiles.BuildFromMI(b, flen, saveas, arg_flg_exam_only) < 0 ){
+++ if( EINVAL == errno )
+++ CONSOLE.Warning(1, "Torrent metainfo file data is invalid or unusable.");
+++ ERR_RETURN();
+++ }
++
++ delete []b;
++ b = (char *)0;
++Index: a/btfiles.h
++===================================================================
++--- a/btfiles.h (revision 300)
+++++ b/btfiles.h (revision 302)
++@@ -61,7 +61,7 @@
++
++ int BuildFromFS(const char *pathname);
++ int BuildFromMI(const char *metabuf, const size_t metabuf_len,
++- const char *saveas);
+++ const char *saveas, unsigned char exam_only);
++
++ char *GetDataName() const;
++ uint64_t GetTotalLength() const { return m_total_files_length; }
+diff --git a/feeds/packages/net/ctorrent/patches/100-negative-ints.patch b/feeds/packages/net/ctorrent/patches/100-negative-ints.patch
+new file mode 100644
+index 0000000..864ce1b
+--- /dev/null
++++ b/feeds/packages/net/ctorrent/patches/100-negative-ints.patch
+@@ -0,0 +1,13 @@
++--- a/bencode.cpp
+++++ b/bencode.cpp
++@@ -44,6 +44,10 @@ size_t buf_long(const char *b,size_t len
++ p++; len--;
++ }
++
+++ if( *p == '-'){
+++ p++; len--;
+++ }
+++
++ for(psave = p; len && isdigit(*p); p++,len--) ;
++
++ if(!len || MAX_INT_SIZ < (p - psave) || *p != endchar) return 0;
+diff --git a/feeds/packages/net/ctorrent/patches/200-musl-compat.patch b/feeds/packages/net/ctorrent/patches/200-musl-compat.patch
+new file mode 100644
+index 0000000..65cb71e
+--- /dev/null
++++ b/feeds/packages/net/ctorrent/patches/200-musl-compat.patch
+@@ -0,0 +1,10 @@
++--- a/compat.c
+++++ b/compat.c
++@@ -63,6 +63,7 @@ int snprintf(char *str, size_t size, con
++
++ #ifndef HAVE_STRNSTR
++ #include <string.h>
+++#include <sys/types.h>
++ /* FUNCTION PROGRAMER: Siberiaic Sang */
++ char *strnstr(const char *haystack, const char *needle, size_t haystacklen)
++ {
+diff --git a/feeds/packages/net/dansguardian/Makefile b/feeds/packages/net/dansguardian/Makefile
+new file mode 100644
+index 0000000..eefefaa
+--- /dev/null
++++ b/feeds/packages/net/dansguardian/Makefile
+@@ -0,0 +1,78 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dansguardian
++PKG_VERSION:=2.12.0.3
++PKG_RELEASE:=1
++
++PKG_LICENSE:=GPL-2.0
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/dansguardian
++PKG_MD5SUM:=2a88d0392cd28eaec02b7ee727b2e253
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/dansguardian
++ SECTION:=net
++ DEPENDS:=+libpthread $(CXX_DEPENDS) +zlib
++ CATEGORY:=Network
++ SUBMENU:=Web Servers/Proxies
++ TITLE:=DansGuardian
++ URL:=http://dansguardian.org
++endef
++
++define Package/dansguardian/conffiles
++/etc/dansguardian/dansguardianf1.conf
++/etc/config/dansguardian
++endef
++
++CONFIGURE_VARS += \
++ INCLUDES="" \
++ CXXFLAGS="$$$$CXXFLAGS -fno-rtti" \
++ LIBS="-lpthread" \
++
++define Build/Configure
++ $(call Build/Configure/Default,\
++ --disable-clamav \
++ --with-sysconfsubdir=dansguardian \
++ --with-proxyuser=root \
++ --with-proxygroup=root \
++ --disable-pcre \
++ )
++endef
++
++define Package/dansguardian/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dansguardian $(1)/usr/sbin/
++
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_INSTALL_DIR)/etc/dansguardian $(1)/etc/
++ $(INSTALL_CONF) ./files/dansguardianf1.conf $(1)/etc/dansguardian/dansguardianf1.conf
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/dansguardian.config $(1)/etc/config/dansguardian
++
++ $(INSTALL_DIR) $(1)/usr/share/dansguardian
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/share/dansguardian/transparent1x1.gif $(1)/usr/share/dansguardian/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/share/dansguardian/blockedflash.swf $(1)/usr/share/dansguardian/
++
++ $(INSTALL_DIR) $(1)/usr/share/dansguardian/languages/ukenglish
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/dansguardian/languages/ukenglish/* $(1)/usr/share/dansguardian/languages/ukenglish/
++
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) ./files/dansguardian.init $(1)/etc/init.d/dansguardian
++endef
++
++$(eval $(call BuildPackage,dansguardian))
+diff --git a/feeds/packages/net/dansguardian/files/dansguardian.config b/feeds/packages/net/dansguardian/files/dansguardian.config
+new file mode 100644
+index 0000000..86640af
+--- /dev/null
++++ b/feeds/packages/net/dansguardian/files/dansguardian.config
+@@ -0,0 +1,71 @@
++config dansguardian 'dansguardian'
++ option config_file '/etc/dansguardian/dansguardianf1.conf'
++ option accessdeniedaddress 'http://YOURSERVER.YOURDOMAIN/cgi-bin/dansguardian.pl'
++ option bannediplist '/etc/dansguardian/lists/bannediplist'
++ option contentscanexceptions 'off'
++ option contentscannertimeout '60'
++ option createlistcachefiles 'on'
++ option custombannedflashfile '/usr/share/dansguardian/blockedflash.swf'
++ option custombannedimagefile '/usr/share/dansguardian/transparent1x1.gif'
++ option deletedownloadedtempfiles 'on'
++ option downloadmanager '/etc/dansguardian/downloadmanagers/default.conf'
++ option exceptioniplist '/etc/dansguardian/lists/exceptioniplist'
++ option filecachedir '/tmp'
++ option filtergroups '1'
++ option filtergroupslist '/etc/dansguardian/lists/filtergroupslist'
++ option filterip ''
++ option filterports '8080'
++ option forcequicksearch 'off'
++ option forwardedfor 'off'
++ option hexdecodecontent 'off'
++ option initialtrickledelay '20'
++ option ipcfilename '/tmp/.dguardianipc'
++ option ipipcfilename '/tmp/.dguardianipipc'
++ option languagedir '/usr/share/dansguardian/languages'
++ option language 'ukenglish'
++ option logadblocks 'off'
++ option logchildprocesshandling 'off'
++ option logclienthostnames 'off'
++ option logconnectionhandlingerrors 'on'
++ option logexceptionhits '2'
++ option logfileformat '1'
++ option loglevel '2'
++ option loglocation '/dev/null'
++ option logsyslog 'on'
++ option loguseragent 'off'
++ option maxagechildren '500'
++ option maxchildren '120'
++ option maxcontentfilecachescansize '20000'
++ option maxcontentfiltersize '256'
++ option maxcontentramcachescansize '2000'
++ option maxips '0'
++ option maxsparechildren '32'
++ option maxuploadsize '-1'
++ option minchildren '8'
++ option minsparechildren '4'
++ option nodaemon 'off'
++ option nologger 'off'
++ option nonstandarddelimiter 'on'
++ option perroomblockingdirectory '/etc/dansguardian/lists/bannedrooms/'
++ option phrasefiltermode '2'
++ option prefercachedlists 'off'
++ option preforkchildren '6'
++ option preservecase '0'
++ option proxyip '127.0.0.1'
++ option proxyport '3128'
++ option proxytimeout '20'
++ option recheckreplacedurls 'off'
++ option reportinglevel '3'
++ option reverseaddresslookups 'off'
++ option reverseclientiplookups 'off'
++ option scancleancache 'on'
++ option showweightedfound 'on'
++ option softrestart 'off'
++ option trickledelay '10'
++ option urlcacheage '900'
++ option urlcachenumber '1000'
++ option urlipcfilename '/tmp/.dguardianurlipc'
++ option usecustombannedflash 'on'
++ option usecustombannedimage 'on'
++ option usexforwardedfor 'off'
++ option weightedphrasemode '2'
+diff --git a/feeds/packages/net/dansguardian/files/dansguardian.init b/feeds/packages/net/dansguardian/files/dansguardian.init
+new file mode 100644
+index 0000000..67ec6bd
+--- /dev/null
++++ b/feeds/packages/net/dansguardian/files/dansguardian.init
+@@ -0,0 +1,190 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=90
++STOP=10
++
++USE_PROCD=1
++PROG=/usr/sbin/dansguardian
++CONFIGFILE="/tmp/dansguardian/dansguardian.conf"
++
++validate_dansguardian_section() {
++ uci_validate_section dansguardian dansguardian "${1}" \
++ 'config_file:string' \
++ 'accessdeniedaddress:string' \
++ 'bannediplist:string' \
++ 'contentscanexceptions:string' \
++ 'contentscannertimeout:uinteger' \
++ 'createlistcachefiles:string' \
++ 'custombannedflashfile:string' \
++ 'custombannedimagefile:string' \
++ 'deletedownloadedtempfiles:string' \
++ 'downloadmanager:string' \
++ 'exceptioniplist:string' \
++ 'filecachedir:string' \
++ 'filtergroups:uinteger' \
++ 'filtergroupslist:string' \
++ 'filterip:ipaddr' \
++ 'filterports:port:8080' \
++ 'forcequicksearch:string' \
++ 'forwardedfor:string' \
++ 'hexdecodecontent:string' \
++ 'initialtrickledelay:uinteger' \
++ 'ipcfilename:string' \
++ 'ipipcfilename:string' \
++ 'languagedir:string' \
++ 'language:string' \
++ 'logadblocks:string' \
++ 'logchildprocesshandling:string' \
++ 'logclienthostnames:string' \
++ 'logconnectionhandlingerrors:string' \
++ 'logexceptionhits:range(0,2)' \
++ 'logfileformat:range(1,4)' \
++ 'loglevel:range(0,3)' \
++ 'loglocation:string' \
++ 'loguseragent:string' \
++ 'maxagechildren:uinteger' \
++ 'maxchildren:uinteger' \
++ 'maxcontentfilecachescansize:uinteger' \
++ 'maxcontentfiltersize:uinteger' \
++ 'maxcontentramcachescansize:uinteger' \
++ 'maxips:uinteger' \
++ 'maxsparechildren:uinteger' \
++ 'maxuploadsize:integer' \
++ 'minchildren:uinteger' \
++ 'minsparechildren:uinteger' \
++ 'nodaemon:string' \
++ 'nologger:string' \
++ 'nonstandarddelimiter:string' \
++ 'perroomblockingdirectory:string' \
++ 'phrasefiltermode:range(0,3)' \
++ 'prefercachedlists:string' \
++ 'preforkchildren:uinteger' \
++ 'preservecase:range(0,2)' \
++ 'proxyip:ipaddr' \
++ 'proxyport:port:3128' \
++ 'proxytimeout:range(20,30)' \
++ 'recheckreplacedurls:string' \
++ 'reportinglevel:range(-1,3)' \
++ 'reverseaddresslookups:string' \
++ 'reverseclientiplookups:string' \
++ 'scancleancache:string' \
++ 'showweightedfound:string' \
++ 'softrestart:string' \
++ 'trickledelay:uinteger' \
++ 'urlcacheage:uinteger' \
++ 'urlcachenumber:uinteger' \
++ 'urlipcfilename:string' \
++ 'usecustombannedflash:string' \
++ 'usecustombannedimage:string' \
++ 'usexforwardedfor:string' \
++ 'weightedphrasemode:range(0,2)'
++}
++
++start_service() {
++ local config_file accessdeniedaddress bannediplist contentscanexceptions contentscannertimeout \
++ createlistcachefiles custombannedflashfile custombannedimagefile deletedownloadedtempfiles \
++ downloadmanager exceptioniplist filecachedir filtergroups filtergroupslist filterip filterports \
++ forcequicksearch forwardedfor hexdecodecontent initialtrickledelay ipcfilename ipipcfilename \
++ language languagedir logadblocks logchildprocesshandling logclienthostnames logconnectionhandlingerrors \
++ logexceptionhits logfileformat loglevel loguseragent maxagechildren maxchildren maxcontentfilecachescansize \
++ maxcontentfiltersize maxcontentramcachescansize maxips maxsparechildren maxuploadsize minchildren minsparechildren \
++ nodaemon nologger nonstandarddelimiter perroomblockingdirectory phrasefiltermode prefercachedlists preforkchildren \
++ preservecase proxyip proxyport proxytimeout recheckreplacedurls reportinglevel reverseaddresslookups \
++ reverseclientiplookups scancleancache showweightedfound softrestart trickledelay urlcacheage urlcachenumber \
++ urlipcfilename usecustombannedflash usecustombannedimage usexforwardedfor weightedphrasemode
++
++ validate_dansguardian_section dansguardian || {
++ echo "validation failed"
++ return 1
++ }
++
++ mkdir -p $(dirname $CONFIGFILE)
++ ln -sf $config_file $(dirname $CONFIGFILE)
++
++ echo "accessdeniedaddress = " $accessdeniedaddress > $CONFIGFILE
++ echo "bannediplist = " $bannediplist >> $CONFIGFILE
++ echo "contentscanexceptions = " $contentscanexceptions >> $CONFIGFILE
++ echo "contentscannertimeout = " $contentscannertimeout >> $CONFIGFILE
++ echo "createlistcachefiles = " $createlistcachefiles >> $CONFIGFILE
++ echo "custombannedflashfile = " $custombannedflashfile >> $CONFIGFILE
++ echo "custombannedimagefile = " $custombannedimagefile >> $CONFIGFILE
++ echo "deletedownloadedtempfiles = " $deletedownloadedtempfiles >> $CONFIGFILE
++ echo "downloadmanager = " $downloadmanager >> $CONFIGFILE
++ echo "exceptioniplist = " $exceptioniplist >> $CONFIGFILE
++ echo "filecachedir = " $filecachedir >> $CONFIGFILE
++ echo "filtergroups = " $filtergroups >> $CONFIGFILE
++ echo "filtergroupslist = " $filtergroupslist >> $CONFIGFILE
++ echo "filterip = " $filterip >> $CONFIGFILE
++ echo "filterports = " $filterports >> $CONFIGFILE
++ echo "forcequicksearch = " $forcequicksearch >> $CONFIGFILE
++ echo "forwardedfor = " $forwardedfor >> $CONFIGFILE
++ echo "hexdecodecontent = " $hexdecodecontent >> $CONFIGFILE
++ echo "initialtrickledelay = " $initialtrickledelay >> $CONFIGFILE
++ echo "ipcfilename = " $ipcfilename >> $CONFIGFILE
++ echo "ipipcfilename = " $ipipcfilename >> $CONFIGFILE
++ echo "language = " $language >> $CONFIGFILE
++ echo "languagedir = " $languagedir >> $CONFIGFILE
++ echo "logadblocks = " $logadblocks >> $CONFIGFILE
++ echo "logchildprocesshandling = " $logchildprocesshandling >> $CONFIGFILE
++ echo "logclienthostnames = " $logclienthostnames >> $CONFIGFILE
++ echo "logconnectionhandlingerrors = " $logconnectionhandlingerrors >> $CONFIGFILE
++ echo "logexceptionhits = " $logexceptionhits >> $CONFIGFILE
++ echo "logfileformat = " $logfileformat >> $CONFIGFILE
++ echo "loglevel = " $loglevel >> $CONFIGFILE
++ echo "loglocation = " $loglocation >> $CONFIGFILE
++ echo "loguseragent = " $loguseragent >> $CONFIGFILE
++ echo "maxagechildren = " $maxagechildren >> $CONFIGFILE
++ echo "maxchildren = " $maxchildren >> $CONFIGFILE
++ echo "maxcontentfilecachescansize = " $maxcontentfilecachescansize >> $CONFIGFILE
++ echo "maxcontentfiltersize = " $maxcontentfiltersize >> $CONFIGFILE
++ echo "maxcontentramcachescansize = " $maxcontentramcachescansize >> $CONFIGFILE
++ echo "maxips = " $maxips >> $CONFIGFILE
++ echo "maxsparechildren = " $maxsparechildren >> $CONFIGFILE
++ echo "maxuploadsize = " $maxuploadsize >> $CONFIGFILE
++ echo "minchildren = " $minchildren >> $CONFIGFILE
++ echo "minsparechildren = " $minsparechildren >> $CONFIGFILE
++ echo "nodaemon = " $nodaemon >> $CONFIGFILE
++ echo "nologger = " $nologger >> $CONFIGFILE
++ echo "nonstandarddelimiter = " $nonstandarddelimiter >> $CONFIGFILE
++ echo "perroomblockingdirectory = " $perroomblockingdirectory >> $CONFIGFILE
++ echo "phrasefiltermode = " $phrasefiltermode >> $CONFIGFILE
++ echo "prefercachedlists = " $prefercachedlists >> $CONFIGFILE
++ echo "preforkchildren = " $preforkchildren >> $CONFIGFILE
++ echo "preservecase = " $preservecase >> $CONFIGFILE
++ echo "proxyip = " $proxyip >> $CONFIGFILE
++ echo "proxyport = " $proxyport >> $CONFIGFILE
++ echo "proxytimeout = " $proxytimeout >> $CONFIGFILE
++ echo "recheckreplacedurls = " $recheckreplacedurls >> $CONFIGFILE
++ echo "reportinglevel = " $reportinglevel >> $CONFIGFILE
++ echo "reverseaddresslookups = " $reverseaddresslookups >> $CONFIGFILE
++ echo "reverseclientiplookups = " $reverseclientiplookups >> $CONFIGFILE
++ echo "scancleancache = " $scancleancache >> $CONFIGFILE
++ echo "showweightedfound = " $showweightedfound >> $CONFIGFILE
++ echo "softrestart = " $softrestart >> $CONFIGFILE
++ echo "trickledelay = " $trickledelay >> $CONFIGFILE
++ echo "urlcacheage = " $urlcacheage >> $CONFIGFILE
++ echo "urlcachenumber = " $urlcachenumber >> $CONFIGFILE
++ echo "urlipcfilename = " $urlipcfilename >> $CONFIGFILE
++ echo "usecustombannedflash = " $usecustombannedflash >> $CONFIGFILE
++ echo "usecustombannedimage = " $usecustombannedimage >> $CONFIGFILE
++ echo "usexforwardedfor = " $usexforwardedfor >> $CONFIGFILE
++ echo "weightedphrasemode = " $weightedphrasemode >> $CONFIGFILE
++
++ procd_open_instance
++ procd_set_param command $PROG -N -c "$CONFIGFILE"
++ procd_set_param file $CONFIGFILE
++ procd_set_param respawn
++ procd_close_instance
++}
++
++stop_service()
++{
++ dansguardian -s | awk -F':' '{ print $2}' | xargs kill -9
++}
++
++service_triggers()
++{
++ procd_add_reload_trigger "dansguardian"
++ procd_add_validation validate_dansguardian_section
++}
+diff --git a/feeds/packages/net/dansguardian/files/dansguardianf1.conf b/feeds/packages/net/dansguardian/files/dansguardianf1.conf
+new file mode 100644
+index 0000000..01e09ae
+--- /dev/null
++++ b/feeds/packages/net/dansguardian/files/dansguardianf1.conf
+@@ -0,0 +1,348 @@
++# DansGuardian filter group config file for version 2.12.0.0
++
++
++# Filter group mode
++# This option determines whether members of this group have their web access
++# unfiltered, filtered, or banned. This mechanism replaces the "banneduserlist"
++# and "exceptionuserlist" files from previous versions.
++#
++# 0 = banned
++# 1 = filtered
++# 2 = unfiltered (exception)
++#
++# Only filter groups with a mode of 1 need to define phrase, URL, site, extension,
++# mimetype and PICS lists; in other modes, these options are ignored to conserve
++# memory.
++#
++# Defaults to 0 if unspecified.
++# Unauthenticated users are treated as being in the first filter group.
++groupmode = 1
++
++# Filter group name
++# Used to fill in the -FILTERGROUP- placeholder in the HTML template file, and to
++# name the group in the access logs
++# Defaults to empty string
++#groupname = ''
++
++# Content filtering files location
++bannedphraselist = '/etc/dansguardian/lists/bannedphraselist'
++weightedphraselist = '/etc/dansguardian/lists/weightedphraselist'
++exceptionphraselist = '/etc/dansguardian/lists/exceptionphraselist'
++bannedsitelist = '/etc/dansguardian/lists/bannedsitelist'
++greysitelist = '/etc/dansguardian/lists/greysitelist'
++exceptionsitelist = '/etc/dansguardian/lists/exceptionsitelist'
++bannedurllist = '/etc/dansguardian/lists/bannedurllist'
++greyurllist = '/etc/dansguardian/lists/greyurllist'
++exceptionurllist = '/etc/dansguardian/lists/exceptionurllist'
++exceptionregexpurllist = '/etc/dansguardian/lists/exceptionregexpurllist'
++bannedregexpurllist = '/etc/dansguardian/lists/bannedregexpurllist'
++picsfile = '/etc/dansguardian/lists/pics'
++contentregexplist = '/etc/dansguardian/lists/contentregexplist'
++urlregexplist = '/etc/dansguardian/lists/urlregexplist'
++
++# Filetype filtering
++#
++# Blanket download blocking
++# If enabled, all files will be blocked, unless they match the
++# exceptionextensionlist or exceptionmimetypelist.
++# These lists do not override virus scanning.
++# Exception lists defined above override all types of filtering, including
++# the blanket download block.
++# Defaults to disabled.
++# (on | off)
++#
++blockdownloads = off
++exceptionextensionlist = '/etc/dansguardian/lists/exceptionextensionlist'
++exceptionmimetypelist = '/etc/dansguardian/lists/exceptionmimetypelist'
++#
++# Use the following lists to block specific kinds of file downloads.
++# The two exception lists above can be used to override these.
++#
++bannedextensionlist = '/etc/dansguardian/lists/bannedextensionlist'
++bannedmimetypelist = '/etc/dansguardian/lists/bannedmimetypelist'
++#
++# In either file filtering mode, the following list can be used to override
++# MIME type & extension blocks for particular domains & URLs (trusted download sites).
++#
++exceptionfilesitelist = '/etc/dansguardian/lists/exceptionfilesitelist'
++exceptionfileurllist = '/etc/dansguardian/lists/exceptionfileurllist'
++
++# Categorise without blocking:
++# Supply categorised lists here and the category string shall be logged against
++# matching requests, but matching these lists does not perform any filtering
++# action.
++#logsitelist = '/etc/dansguardian/lists/logsitelist'
++#logurllist = '/etc/dansguardian/lists/logurllist'
++#logregexpurllist = '/etc/dansguardian/lists/logregexpurllist'
++
++# Outgoing HTTP header rules:
++# Optional lists for blocking based on, and modification of, outgoing HTTP
++# request headers. Format for headerregexplist is one modification rule per
++# line, similar to content/URL modifications. Format for
++# bannedregexpheaderlist is one regular expression per line, with matching
++# headers causing a request to be blocked.
++# Headers are matched/replaced on a line-by-line basis, not as a contiguous
++# block.
++# Use for example, to remove cookies or prevent certain user-agents.
++headerregexplist = '/etc/dansguardian/lists/headerregexplist'
++bannedregexpheaderlist = '/etc/dansguardian/lists/bannedregexpheaderlist'
++
++# Weighted phrase mode
++# Optional; overrides the weightedphrasemode option in dansguardian.conf
++# for this particular group. See documentation for supported values in
++# that file.
++#weightedphrasemode = 0
++
++# Naughtiness limit
++# This the limit over which the page will be blocked. Each weighted phrase is given
++# a value either positive or negative and the values added up. Phrases to do with
++# good subjects will have negative values, and bad subjects will have positive
++# values. See the weightedphraselist file for examples.
++# As a guide:
++# 50 is for young children, 100 for old children, 160 for young adults.
++naughtynesslimit = 50
++
++# Search term blocking
++# Search terms can be extracted from search URLs and filtered using the
++# bannedphraselist, weightedphraselist and exceptionphraselist, with a separate
++# threshold for blocking than that used for normal page content.
++# To do this, the first two options below must be enabled.
++#
++# Search engine regular expression list
++# List of regular expressions for matching search engine URLs. It is assumed
++# that the search terms themselves will be contained within the first submatch
++# of each expression.
++#searchengineregexplist = '/etc/dansguardian/lists/searchengineregexplist'
++#
++# Search term limit
++# The limit over which requests will be blocked for containing search terms
++# which match the weightedphraselist. This should usually be lower than the
++# 'naughtynesslimit' value above, because the amount of text being filtered
++# is only a few words, rather than a whole page.
++# This option must be uncommented if searchengineregexplist is uncommented.
++# A value of 0 here indicates that search terms should be extracted,
++# for logging/reporting purposes, but no filtering should be performed
++# on the resulting text.
++#searchtermlimit = 30
++#
++# Search term lists
++# If the three lines below are uncommented, search term blocking will use
++# the banned, weighted & exception phrases from these lists, instead of using
++# the same phrase lists as for page content. This is optional but recommended,
++# as weights for individual phrases in the "normal" lists may not be
++# appropriate for blocking when those phrases appear in a much smaller block
++# of text.
++# Please note that all or none of the below should be uncommented, not a
++# mixture.
++#bannedsearchtermlist = '/etc/dansguardian/lists/bannedsearchtermlist'
++#weightedsearchtermlist = '/etc/dansguardian/lists/weightedsearchtermlist'
++#exceptionsearchtermlist = '/etc/dansguardian/lists/exceptionsearchtermlist'
++
++# Category display threshold
++# This option only applies to pages blocked by weighted phrase filtering.
++# Defines the minimum score that must be accumulated within a particular
++# category in order for it to show up on the block pages' category list.
++# All categories under which the page scores positively will be logged; those
++# that were not displayed to the user appear in brackets.
++#
++# -1 = display only the highest scoring category
++# 0 = display all categories (default)
++# > 0 = minimum score for a category to be displayed
++categorydisplaythreshold = 0
++
++# Embedded URL weighting
++# When set to something greater than zero, this option causes URLs embedded within a
++# page's HTML (from links, image tags, etc.) to be extracted and checked against the
++# bannedsitelist and bannedurllist. Each link to a banned page causes the amount set
++# here to be added to the page's weighting.
++# The behaviour of this option with regards to multiple occurrences of a site/URL is
++# affected by the weightedphrasemode setting.
++#
++# NB: Currently, this feature uses regular expressions that require the PCRE library.
++# As such, it is only available if you compiled DansGuardian with '--enable-pcre=yes'.
++# You can check compile-time options by running 'dansguardian -v'.
++#
++# Set to 0 to disable.
++# Defaults to 0.
++# WARNING: This option is highly CPU intensive!
++embeddedurlweight = 0
++
++# Enable PICS rating support
++#
++# Defaults to disabled
++# (on | off)
++enablepics = off
++
++# Temporary Denied Page Bypass
++# This provides a link on the denied page to bypass the ban for a few minutes. To be
++# secure it uses a random hashed secret generated at daemon startup. You define the
++# number of seconds the bypass will function for before the deny will appear again.
++# To allow the link on the denied page to appear you will need to edit the template.html
++# or dansguardian.pl file for your language.
++# 300 = enable for 5 minutes
++# 0 = disable ( defaults to 0 )
++# -1 = enable but you require a separate program/CGI to generate a valid link
++bypass = 0
++
++# Temporary Denied Page Bypass Secret Key
++# Rather than generating a random key you can specify one. It must be more than 8 chars.
++# '' = generate a random one (recommended and default)
++# 'Mary had a little lamb.' = an example
++# '76b42abc1cd0fdcaf6e943dcbc93b826' = an example
++bypasskey = ''
++
++# Infection/Scan Error Bypass
++# Similar to the 'bypass' setting, but specifically for bypassing files scanned and found
++# to be infected, or files that trigger scanner errors - for example, archive types with
++# recognised but unsupported compression schemes, or corrupt archives.
++# The option specifies the number of seconds for which the bypass link will be valid.
++# 300 = enable for 5 minutes
++# 0 = disable (default)
++# -1 = enable, but require a separate program/CGI to generate a valid link
++infectionbypass = 0
++
++# Infection/Scan Error Bypass Secret Key
++# Same as the 'bypasskey' option, but used for infection bypass mode.
++infectionbypasskey = ''
++
++# Infection/Scan Error Bypass on Scan Errors Only
++# Enable this option to allow infectionbypass links only when virus scanning fails,
++# not when a file is found to contain a virus.
++# on = enable (default and highly recommended)
++# off = disable
++infectionbypasserrorsonly = on
++
++# Disable content scanning
++# If you enable this option you will disable content scanning for this group.
++# Content scanning primarily is AV scanning (if enabled) but could include
++# other types.
++# (on|off) default = off.
++disablecontentscan = off
++
++# Enable Deep URL Analysis
++# When enabled, DG looks for URLs within URLs, checking against the bannedsitelist and
++# bannedurllist. This can be used, for example, to block images originating from banned
++# sites from appearing in Google Images search results, as the original URLs are
++# embedded in the thumbnail GET requests.
++# (on|off) default = off
++deepurlanalysis = off
++
++# reportinglevel
++#
++# -1 = log, but do not block - Stealth mode
++# 0 = just say 'Access Denied'
++# 1 = report why but not what denied phrase
++# 2 = report fully
++# 3 = use HTML template file (accessdeniedaddress ignored) - recommended
++#
++# If defined, this overrides the global setting in dansguardian.conf for
++# members of this filter group.
++#
++#reportinglevel = 3
++
++# accessdeniedaddress is the address of your web server to which the cgi
++# dansguardian reporting script was copied. Only used in reporting levels
++# 1 and 2.
++#
++# This webserver must be either:
++# 1. Non-proxied. Either a machine on the local network, or listed as an
++# exception in your browser's proxy configuration.
++# 2. Added to the exceptionsitelist. Option 1 is preferable; this option is
++# only for users using both transparent proxying and a non-local server
++# to host this script.
++#
++# If defined, this overrides the global setting in dansguardian.conf for
++# members of this filter group.
++#
++#accessdeniedaddress = 'http://YOURSERVER.YOURDOMAIN/cgi-bin/dansguardian.pl'
++
++# HTML Template override
++# If defined, this specifies a custom HTML template file for members of this
++# filter group, overriding the global setting in dansguardian.conf. This is
++# only used in reporting level 3.
++#
++# The default template file path is <languagedir>/<language>/template.html
++# e.g. /usr/share/dansguardian/languages/ukenglish/template.html when using 'ukenglish'
++# language.
++#
++# This option generates a file path of the form:
++# <languagedir>/<language>/<htmltemplate>
++# e.g. /usr/share/dansguardian/languages/ukenglish/custom.html
++#
++#htmltemplate = 'custom.html'
++
++# Email reporting - original patch by J. Gauthier
++
++# Use SMTP
++# If on, will enable system wide events to be reported by email.
++# need to configure mail program (see 'mailer' in global config)
++# and email recipients
++# default usesmtp = off
++#!! Not compiled !!usesmtp = off
++
++# mailfrom
++# who the email would come from
++# example: mailfrom = 'dansguardian@mycompany.com'
++#!! Not compiled !!mailfrom = ''
++
++# avadmin
++# who the virus emails go to (if notify av is on)
++# example: avadmin = 'admin@mycompany.com'
++#!! Not compiled !!avadmin = ''
++
++# contentdmin
++# who the content emails go to (when thresholds are exceeded)
++# and contentnotify is on
++# example: contentadmin = 'admin@mycompany.com'
++#!! Not compiled !!contentadmin = ''
++
++# avsubject
++# Subject of the email sent when a virus is caught.
++# only applicable if notifyav is on
++# default avsubject = 'dansguardian virus block'
++#!! Not compiled !!avsubject = 'dansguardian virus block'
++
++# content
++# Subject of the email sent when violation thresholds are exceeded
++# default contentsubject = 'dansguardian violation'
++#!! Not compiled !!contentsubject = 'dansguardian violation'
++
++# notifyAV
++# This will send a notification, if usesmtp/notifyav is on, any time an
++# infection is found.
++# Important: If this option is off, viruses will still be recorded like a
++# content infraction.
++#!! Not compiled !!notifyav = off
++
++# notifycontent
++# This will send a notification, if usesmtp is on, based on thresholds
++# below
++#!! Not compiled !!notifycontent = off
++
++# thresholdbyuser
++# results are only predictable with user authenticated configs
++# if enabled the violation/threshold count is kept track of by the user
++#!! Not compiled !!thresholdbyuser = off
++
++#violations
++# number of violations before notification
++# setting to 0 will never trigger a notification
++#!! Not compiled !!violations = 0
++
++#threshold
++# this is in seconds. If 'violations' occur in 'threshold' seconds, then
++# a notification is made.
++# if this is set to 0, then whenever the set number of violations are made a
++# notifaction will be sent.
++#!! Not compiled !!threshold = 0
++
++#SSL certificate checking
++# Check that ssl certificates for servers on https connections are valid
++# and signed by a ca in the configured path
++sslcertcheck = off
++
++#SSL man in the middle
++# Forge ssl certificates for all sites, decrypt the data then re encrypt it
++# using a different private key. Used to filter ssl sites
++sslmitm = off
++
+diff --git a/feeds/packages/net/dansguardian/patches/001-compile.patch b/feeds/packages/net/dansguardian/patches/001-compile.patch
+new file mode 100644
+index 0000000..db8efa4
+--- /dev/null
++++ b/feeds/packages/net/dansguardian/patches/001-compile.patch
+@@ -0,0 +1,29 @@
++--- a/configure
+++++ b/configure
++@@ -827,7 +827,7 @@ sysconfdir='${prefix}/etc'
++ sharedstatedir='${prefix}/com'
++ localstatedir='${prefix}/var'
++ includedir='${prefix}/include'
++-oldincludedir='/usr/include'
+++oldincludedir='${prefix}/usr/include'
++ docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
++ infodir='${datarootdir}/info'
++ htmldir='${docdir}'
++@@ -5265,7 +5265,7 @@ $as_echo_n "checking for zlib... " >&6;
++ # Check whether --with-zlib was given.
++ if test "${with_zlib+set}" = set; then :
++ withval=$with_zlib; # check for header & func (in library) in given prefix
++- CPPFLAGS="${CPPFLAGS} -I${withval}/include"
+++ CPPFLAGS="${CPPFLAGS}"
++ if test "x$staticzlib" = "xtrue"; then
++ LIBS="-Bstatic -L${withval} -lz -Bdynamic ${LIBS}"
++ else
++@@ -7095,7 +7095,7 @@ $as_echo "#define ENABLE_NTLM /**/" >>co
++ if test "${with_libiconv+set}" = set; then :
++ withval=$with_libiconv; # check for header & func (in library) in given prefix
++ if test "x$withval" != "x"; then
++- CPPFLAGS="${CPPFLAGS} -I${withval}/include"
+++ CPPFLAGS="${CPPFLAGS}"
++ LIBS="-L${withval}/lib -liconv ${LIBS}"
++ else
++ LIBS="-liconv ${LIBS}"
+diff --git a/feeds/packages/net/davfs2/Makefile b/feeds/packages/net/davfs2/Makefile
+new file mode 100644
+index 0000000..f11d26a
+--- /dev/null
++++ b/feeds/packages/net/davfs2/Makefile
+@@ -0,0 +1,69 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=davfs2
++PKG_VERSION:=1.5.2
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://download.savannah.gnu.org/releases/davfs2/
++PKG_MD5SUM:=376bc9346454135cba78afacbcb23f86
++
++PKG_FIXUP:=gettext-version autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/davfs2
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Filesystem
++ DEPENDS=+libopenssl +libneon +libiconv +libintl +libexpat +kmod-fuse +libfuse
++ TITLE:=Mount a WebDAV resource as a regular file system.
++ URL:=http://savannah.nongnu.org/projects/davfs2/
++ MAINTAINER:=Federico Di Marco <fededim@gmail.com>
++endef
++
++define Package/davfs2/description
++ Web Distributed Authoring and Versioning (WebDAV), an extension to the HTTP-protocol,
++ allows authoring of resources on a remote web server.davfs2 provides the ability to
++ access such resources like a typical filesystem, allowing for use by standard
++ applications with no built-in support for WebDAV.
++
++ davfs2 is designed to fully integrate into the filesystem semantics of Unix-like
++ systems (mount, umount, etc.). davfs2 makes mounting by unprivileged users as easy
++ and secure as possible.
++
++ davfs2 does extensive caching to make the file system responsive, to avoid
++ unnecessary network traffic and to prevent data loss, and to cope for slow or
++ unreliable connections.
++
++ davfs2 will work with most WebDAV servers needing little or no configuration.
++endef
++
++define Package/davfs2/conffiles
++/etc/davfs2/davfs2.conf
++endef
++
++TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include
++
++CONFIGURE_VARS += \
++ LDFLAGS="$(TARGET_LDFLAGS) -L$(TOOLCHAIN_DIR)/usr/lib -L$(TOOLCHAIN_DIR)/lib"
++
++CONFIGURE_ARGS += --with-neon="$(STAGING_DIR)/usr"
++
++define Package/davfs2/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/mount.davfs $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/umount.davfs $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DIR) $(1)/etc/davfs2
++ $(INSTALL_DATA) files/$(PKG_NAME).conf $(1)/etc/davfs2
++endef
++
++$(eval $(call BuildPackage,davfs2))
+diff --git a/feeds/packages/net/davfs2/files/davfs2.conf b/feeds/packages/net/davfs2/files/davfs2.conf
+new file mode 100644
+index 0000000..4cf501b
+--- /dev/null
++++ b/feeds/packages/net/davfs2/files/davfs2.conf
+@@ -0,0 +1,9 @@
++#
++# davfs2 configuration file
++# please see http://linux.die.net/man/5/davfs2.conf for details
++#
++
++dav_user nobody
++dav_group nogroup
++cache_dir /tmp/davfs2
++cache_size 4
+diff --git a/feeds/packages/net/davfs2/patches/010-main_code_fix.patch b/feeds/packages/net/davfs2/patches/010-main_code_fix.patch
+new file mode 100644
+index 0000000..aa36fdf
+--- /dev/null
++++ b/feeds/packages/net/davfs2/patches/010-main_code_fix.patch
+@@ -0,0 +1,35 @@
++--- a/src/Makefile.am
+++++ b/src/Makefile.am
++@@ -32,8 +32,8 @@ mount_davfs_SOURCES = cache.c dav_coda.c
++ kernel_interface.h mount_davfs.h webdav.h
++ umount_davfs_SOURCES = umount_davfs.c defaults.h
++
++-AM_CFLAGS = -Wall -Werror=format-security \
++- -fstack-protector --param=ssp-buffer-size=4
+++AM_CFLAGS = -Wall -Werror=format-security
+++# -fstack-protector --param=ssp-buffer-size=4 -- removed ssp not supported in openwrt
++ DEFS = -DPROGRAM_NAME=\"mount.davfs\" \
++ -DDAV_SYS_CONF_DIR=\"$(pkgsysconfdir)\" \
++ -DDAV_LOCALSTATE_DIR=\"$(dav_localstatedir)\" \
++--- a/src/cache.c
+++++ b/src/cache.c
++@@ -58,7 +58,7 @@
++ #ifdef HAVE_SYS_TYPES_H
++ #include <sys/types.h>
++ #endif
++-#include <sys/xattr.h>
+++#include <linux/xattr.h>
++
++ #include <ne_alloc.h>
++ #include <ne_string.h>
++--- a/src/webdav.c
+++++ b/src/webdav.c
++@@ -2033,7 +2033,7 @@ ssl_verify(void *userdata, int failures,
++ len = getline(&s, &n, stdin);
++ if (len < 0)
++ abort();
++- if (rpmatch(s) > 0)
+++ if ((s[0]=='y' || s[0]=='Y') > 0)
++ ret = 0;
++ free(s);
++ }
+diff --git a/feeds/packages/net/davfs2/patches/100-musl-compat.patch b/feeds/packages/net/davfs2/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..e819cbc
+--- /dev/null
++++ b/feeds/packages/net/davfs2/patches/100-musl-compat.patch
+@@ -0,0 +1,194 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -42,7 +42,7 @@ DAV_CHECK_NEON
++ # Checks for header files.
++ AC_HEADER_DIRENT
++ AC_HEADER_STDC
++-AC_CHECK_HEADERS([fcntl.h libintl.h langinfo.h limits.h locale.h mntent.h stddef.h stdint.h stdlib.h string.h sys/file.h sys/mount.h sys/time.h syslog.h termios.h unistd.h utime.h])
+++AC_CHECK_HEADERS([error.h fcntl.h libintl.h langinfo.h limits.h locale.h mntent.h stddef.h stdint.h stdlib.h string.h sys/file.h sys/mount.h sys/time.h sys/select.h sys/types.h syslog.h termios.h unistd.h utime.h])
++
++ # Checks for typedefs, structures, and compiler characteristics.
++ AC_C_CONST
++@@ -78,7 +78,7 @@ AC_FUNC_SELECT_ARGTYPES
++ AC_FUNC_STRFTIME
++ AC_FUNC_STAT
++ AC_FUNC_UTIME_NULL
++-AC_CHECK_FUNCS([endpwent ftruncate getmntent memset mkdir nl_langinfo rpmatch select setlocale strcasecmp strchr strdup strerror strpbrk strrchr strstr strtol strtoull utime])
+++AC_CHECK_FUNCS([endpwent ftruncate getmntent memset mkdir nl_langinfo rpmatch select setlocale strcasecmp strchr strdup strerror strpbrk strrchr strstr strtol strtoull utime canonicalize_file_name fopencookie])
++
++ # Misc.
++ DAV_DEFAULTS
++--- a/src/cache.c
+++++ b/src/cache.c
++@@ -19,12 +19,12 @@
++
++
++ #include "config.h"
+++#include "compat.h"
++
++ #ifdef HAVE_DIRENT_H
++ #include <dirent.h>
++ #endif
++ #include <errno.h>
++-#include <error.h>
++ #ifdef HAVE_FCNTL_H
++ #include <fcntl.h>
++ #endif
++--- a/src/dav_fuse.c
+++++ b/src/dav_fuse.c
++@@ -47,6 +47,9 @@
++ #ifdef HAVE_SYS_STAT_H
++ #include <sys/stat.h>
++ #endif
+++#ifdef HAVE_SYS_SELECT_H
+++#include <sys/select.h>
+++#endif
++
++ #include "defaults.h"
++ #include "mount_davfs.h"
++--- a/src/kernel_interface.c
+++++ b/src/kernel_interface.c
++@@ -19,8 +19,8 @@
++
++
++ #include "config.h"
+++#include "compat.h"
++
++-#include <error.h>
++ #ifdef HAVE_FCNTL_H
++ #include <fcntl.h>
++ #endif
++@@ -51,6 +51,9 @@
++ #ifdef HAVE_SYS_STAT_H
++ #include <sys/stat.h>
++ #endif
+++#ifdef HAVE_SYS_TYPES_H
+++#include <sys/types.h>
+++#endif
++ #include <sys/wait.h>
++
++ #include "defaults.h"
++--- a/src/mount_davfs.c
+++++ b/src/mount_davfs.c
++@@ -19,10 +19,10 @@
++
++
++ #include "config.h"
+++#include "compat.h"
++
++ #include <ctype.h>
++ #include <errno.h>
++-#include <error.h>
++ #ifdef HAVE_FCNTL_H
++ #include <fcntl.h>
++ #endif
++--- a/src/umount_davfs.c
+++++ b/src/umount_davfs.c
++@@ -19,8 +19,8 @@
++
++
++ #include "config.h"
+++#include "compat.h"
++
++-#include <error.h>
++ #include <errno.h>
++ #include <getopt.h>
++ #ifdef HAVE_LIBINTL_H
++--- a/src/webdav.c
+++++ b/src/webdav.c
++@@ -19,9 +19,9 @@
++
++
++ #include "config.h"
+++#include "compat.h"
++
++ #include <errno.h>
++-#include <error.h>
++ #ifdef HAVE_FCNTL_H
++ #include <fcntl.h>
++ #endif
++@@ -368,6 +368,7 @@ dav_init_webdav(const dav_args *args)
++ error(EXIT_FAILURE, errno, _("socket library initialization failed"));
++
++ if (args->neon_debug & ~NE_DBG_HTTPPLAIN) {
+++#ifdef HAVE_FOPENCOOKIE
++ char *buf = malloc(log_bufsize);
++ cookie_io_functions_t *log_func = malloc(sizeof(cookie_io_functions_t));
++ if (!log_func) abort();
++@@ -380,6 +381,9 @@ dav_init_webdav(const dav_args *args)
++ error(EXIT_FAILURE, errno,
++ _("can't open stream to log neon-messages"));
++ ne_debug_init(log_stream, args->neon_debug);
+++#else
+++ error(EXIT_FAILURE, 0, "neon debugging unsupported");
+++#endif
++ }
++
++ session = ne_session_create(args->scheme, args->host, args->port);
++--- /dev/null
+++++ b/src/compat.h
++@@ -0,0 +1,64 @@
+++#ifndef _COMPAT_H
+++#define _COMPAT_H
+++
+++#ifndef _PATH_MOUNTED
+++# define _PATH_MOUNTED "/proc/mounts"
+++#endif
+++
+++#ifndef _PATH_MNTTAB
+++# define _PATH_MNTTAB "/etc/fstab"
+++#endif
+++
+++#ifdef HAVE_ERROR_H
+++# include <error.h>
+++#else
+++# include <stdio.h>
+++# include <stdarg.h>
+++# include <stdlib.h>
+++# include <string.h>
+++static void error_at_line(int status, int errnum, const char *filename,
+++ unsigned int linenum, const char *format, ...)
+++{
+++ va_list ap;
+++
+++ fflush(stdout);
+++
+++ if (filename != NULL)
+++ fprintf(stderr, "%s:%u: ", filename, linenum);
+++
+++ va_start(ap, format);
+++ vfprintf(stderr, format, ap);
+++ va_end(ap);
+++
+++ if (errnum != 0)
+++ fprintf(stderr, ": %s", strerror(errnum));
+++
+++ fprintf(stderr, "\n");
+++
+++ if (status != 0)
+++ exit(status);
+++}
+++
+++#define error(status, errnum, format...) \
+++ error_at_line(status, errnum, NULL, 0, format)
+++
+++#endif /* HAVE_ERROR_H */
+++
+++#ifndef HAVE_CANONICALIZE_FILE_NAME
+++#include <limits.h>
+++#include <string.h>
+++#include <stdlib.h>
+++static char * canonicalize_file_name(const char *path)
+++{
+++ char buf[PATH_MAX] = { };
+++
+++ snprintf(buf, sizeof(buf) - 1, "%s", path);
+++
+++ if (!realpath(path, buf))
+++ return NULL;
+++
+++ return strdup(buf);
+++}
+++#endif
+++
+++#endif /* _COMPAT_H */
+diff --git a/feeds/packages/net/ddns-scripts/Makefile b/feeds/packages/net/ddns-scripts/Makefile
+new file mode 100755
+index 0000000..d388b3f
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/Makefile
+@@ -0,0 +1,216 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ddns-scripts
++# Version == major.minor.patch
++# increase on new functionality (minor) or patches (patch)
++PKG_VERSION:=2.4.3
++# Release == build
++# increase on changes of services files or tld_names.dat
++PKG_RELEASE:=2
++
++PKG_LICENSE:=GPL-2.0
++PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++# no default dependencies
++PKG_DEFAULT_DEPENDS=
++
++define Package/$(PKG_NAME)/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ PKGARCH:=all
++endef
++
++##### **********************************
++define Package/$(PKG_NAME)
++ $(call Package/$(PKG_NAME)/Default)
++ TITLE:=Dynamic DNS Client scripts (with IPv6 support)
++endef
++# shown in LuCI package description
++define Package/$(PKG_NAME)/description
++ Dynamic DNS Client scripts (with IPv6 support) - Info: http://wiki.openwrt.org/doc/howto/ddns.client
++endef
++# shown in menuconfig <Help>
++define Package/$(PKG_NAME)/config
++ help
++ A highly configurable set of scripts for doing dynamic dns updates.
++ - IPv6 support
++ - force communication to IPv4 or IPv6 only
++ - DNS server support
++ - using BIND host if installed
++ - DNS requests via TCP
++ - Proxy server support
++ - log file support
++ - support to run once
++ .
++ Version: $(PKG_VERSION)-$(PKG_RELEASE)
++ Info : http://wiki.openwrt.org/doc/howto/ddns.client
++ .
++ $(PKG_MAINTAINER)
++endef
++
++##### **********************************
++define Package/$(PKG_NAME)_cloudflare
++ $(call Package/$(PKG_NAME)/Default)
++ TITLE:=DDNS extension for CloudFlare
++ DEPENDS:=$(PKG_NAME)
++endef
++define Package/$(PKG_NAME)_cloudflare/description
++ Dynamic DNS Client scripts extension for CloudFlare
++endef
++
++##### **********************************
++define Package/$(PKG_NAME)_no-ip_com
++ $(call Package/$(PKG_NAME)/Default)
++ TITLE:=DDNS extension for No-IP.com
++ DEPENDS:=$(PKG_NAME)
++endef
++define Package/$(PKG_NAME)_no-ip_com/description
++ Dynamic DNS Client scripts extension for No-IP.com
++endef
++
++##### **********************************
++define Package/$(PKG_NAME)_nsupdate
++ $(call Package/$(PKG_NAME)/Default)
++ TITLE:=DDNS extension using Bind nsupdate
++ DEPENDS:=$(PKG_NAME) +bind-client
++endef
++define Package/$(PKG_NAME)_nsupdate/description
++ Dynamic DNS Client scripts extension for direct updates using Bind nsupdate
++endef
++define Package/$(PKG_NAME)_nsupdate/config
++ help
++ The script directly updates a PowerDNS (or maybe bind server) via nsupdate
++ from bind-client package. It requires
++ "option dns_server" to be set to the server to be used by nsupdate.
++ "option username" should be set to the key name and
++ "option password" to the base64 encoded shared secret.
++
++endef
++
++##### **********************************
++define Build/Configure
++endef
++define Build/Compile
++ $(CP) ./files $(PKG_BUILD_DIR)
++ for FILE in `find $(PKG_BUILD_DIR)/files -type f`; do \
++ $(SED) 's/^\s*#/#/' \
++ -e '/^#\s\|^#$$$$/d' \
++ -e 's/\s#\s.*$$$$//' \
++ -e 's/\s*$$$$//' \
++ -e '/^\/\/\s/d' \
++ -e '/^\s*$$$$/d' $$$$FILE; \
++ done
++ gzip -f9 $(PKG_BUILD_DIR)/files/tld_names.dat
++endef
++
++define Package/$(PKG_NAME)/conffiles
++/etc/config/ddns
++endef
++
++##### **********************************
++define Package/$(PKG_NAME)/install
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/ddns.hotplug $(1)/etc/hotplug.d/iface/95-ddns
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/ddns.init $(1)/etc/init.d/ddns
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/files/ddns.config $(1)/etc/config/ddns
++
++ $(INSTALL_DIR) $(1)/usr/lib/ddns
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/files/services* $(1)/usr/lib/ddns
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/dynamic_*.sh $(1)/usr/lib/ddns
++endef
++define Package/$(PKG_NAME)/postinst
++ #!/bin/sh
++ # if run within buildroot exit
++ [ -n "$${IPKG_INSTROOT}" ] && exit 0
++
++ # add new section "ddns" "global" if not exists
++ uci -q get ddns.global > /dev/null || uci -q set ddns.global='ddns'
++ uci -q get ddns.global.date_format > /dev/null || uci -q set ddns.global.date_format='%F %R'
++ uci -q get ddns.global.log_lines > /dev/null || uci -q set ddns.global.log_lines='250'
++ uci -q get ddns.global.allow_local_ip > /dev/null || uci -q set ddns.global.allow_local_ip='0'
++ uci -q commit ddns
++
++ # clear LuCI indexcache
++ rm -f /tmp/luci-indexcache >/dev/null 2>&1
++
++ exit 0
++endef
++define Package/$(PKG_NAME)/prerm
++ #!/bin/sh
++ # if run within buildroot exit
++ [ -n "$${IPKG_INSTROOT}" ] && exit 0
++
++ # stop running scripts
++ /etc/init.d/ddns disable
++ /etc/init.d/ddns stop
++
++ # clear LuCI indexcache
++ rm -f /tmp/luci-indexcache >/dev/null 2>&1
++
++ exit 0
++endef
++
++##### **********************************
++define Package/$(PKG_NAME)_cloudflare/install
++ $(INSTALL_DIR) $(1)/usr/lib/ddns
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/update_CloudFlare.sh $(1)/usr/lib/ddns
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/files/tld_names.dat.gz $(1)/usr/lib/ddns
++endef
++define Package/$(PKG_NAME)_cloudflare/postinst
++ #!/bin/sh
++ echo -e '"CloudFlare"\t"update_CloudFlare.sh"' >> $${IPKG_INSTROOT}/usr/lib/ddns/services
++ echo -e '"CloudFlare"\t"update_CloudFlare.sh"' >> $${IPKG_INSTROOT}/usr/lib/ddns/services_ipv6
++endef
++define Package/$(PKG_NAME)_cloudflare/prerm
++ #!/bin/sh
++ /bin/sed -i '/update_CloudFlare\.sh/ d' $${IPKG_INSTROOT}/usr/lib/ddns/services
++ /bin/sed -i '/update_CloudFlare\.sh/ d' $${IPKG_INSTROOT}/usr/lib/ddns/services_ipv6
++endef
++
++##### **********************************
++define Package/$(PKG_NAME)_no-ip_com/install
++ $(INSTALL_DIR) $(1)/usr/lib/ddns
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/update_No-IP.com.sh $(1)/usr/lib/ddns
++endef
++define Package/$(PKG_NAME)_no-ip_com/postinst
++ #!/bin/sh
++ echo -e '"No-IP.com"\t"update_No-IP.com.sh"' >> $${IPKG_INSTROOT}/usr/lib/ddns/services
++ echo -e '"NoIP.com"\t"update_No-IP.com.sh"' >> $${IPKG_INSTROOT}/usr/lib/ddns/services
++endef
++define Package/$(PKG_NAME)_no-ip_com/prerm
++ #!/bin/sh
++ /bin/sed -i '/update_No-IP\.com\.sh/ d' $${IPKG_INSTROOT}/usr/lib/ddns/services
++endef
++
++##### **********************************
++define Package/$(PKG_NAME)_nsupdate/install
++ $(INSTALL_DIR) $(1)/usr/lib/ddns
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/files/update_nsupdate.sh $(1)/usr/lib/ddns
++endef
++define Package/$(PKG_NAME)_nsupdate/postinst
++ #!/bin/sh
++ echo -e '"Bind-nsupdate"\t"update_nsupdate.sh"' >> $${IPKG_INSTROOT}/usr/lib/ddns/services
++ echo -e '"Bind-nsupdate"\t"update_nsupdate.sh"' >> $${IPKG_INSTROOT}/usr/lib/ddns/services_ipv6
++endef
++define Package/$(PKG_NAME)_nsupdate/prerm
++ #!/bin/sh
++ /bin/sed -i '/update_nsupdate\.sh/ d' $${IPKG_INSTROOT}/usr/lib/ddns/services
++ /bin/sed -i '/update_nsupdate\.sh/ d' $${IPKG_INSTROOT}/usr/lib/ddns/services_ipv6
++endef
++
++##### **********************************
++$(eval $(call BuildPackage,$(PKG_NAME)))
++$(eval $(call BuildPackage,$(PKG_NAME)_cloudflare))
++$(eval $(call BuildPackage,$(PKG_NAME)_no-ip_com))
++$(eval $(call BuildPackage,$(PKG_NAME)_nsupdate))
+diff --git a/feeds/packages/net/ddns-scripts/files/ddns.config b/feeds/packages/net/ddns-scripts/files/ddns.config
+new file mode 100644
+index 0000000..5d69bb1
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/ddns.config
+@@ -0,0 +1,31 @@
++#
++# Please read ddns.sample
++# or http://wiki.openwrt.org/doc/uci/ddns
++#
++config ddns "global"
++ option date_format "%F %R"
++# option run_dir "/var/run/ddns"
++# option log_dir "/var/log/ddns"
++ option log_lines "250"
++ option allow_local_ip "0"
++
++
++config service "myddns_ipv4"
++ option service_name "dyndns.com"
++ option domain "yourhost.example.com"
++ option username "your_username"
++ option password "your_password"
++ option interface "wan"
++ option ip_source "network"
++ option ip_network "wan"
++
++config service "myddns_ipv6"
++ option update_url "http://[USERNAME]:[PASSWORD]@your.provider.net/nic/update?hostname=[DOMAIN]&myip=[IP]"
++ option domain "yourhost.example.com"
++ option username "your_username"
++ option password "your_password"
++ option use_ipv6 "1"
++ option interface "wan6"
++ option ip_source "network"
++ option ip_network "wan6"
++
+diff --git a/feeds/packages/net/ddns-scripts/files/ddns.hotplug b/feeds/packages/net/ddns-scripts/files/ddns.hotplug
+new file mode 100644
+index 0000000..dfb35f6
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/ddns.hotplug
+@@ -0,0 +1,14 @@
++#!/bin/sh
++
++# there are other ACTIONs like ifupdate we don't need
++# so parse dynamic_dns_functions.sh only when needed
++case "$ACTION" in
++ ifup)
++ . /usr/lib/ddns/dynamic_dns_functions.sh
++ /etc/init.d/ddns enabled && start_daemon_for_all_ddns_sections "$INTERFACE"
++ ;;
++ ifdown)
++ . /usr/lib/ddns/dynamic_dns_functions.sh
++ stop_daemon_for_all_ddns_sections "$INTERFACE"
++ ;;
++esac
+diff --git a/feeds/packages/net/ddns-scripts/files/ddns.init b/feeds/packages/net/ddns-scripts/files/ddns.init
+new file mode 100644
+index 0000000..2cc9b90
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/ddns.init
+@@ -0,0 +1,28 @@
++#!/bin/sh /etc/rc.common
++START=95
++STOP=10
++
++boot() {
++ return 0
++}
++
++reload() {
++ killall -1 dynamic_dns_updater.sh 2>/dev/null # send SIGHUP
++ return 0
++}
++
++restart() {
++ stop
++ sleep 1 # give time to shutdown
++ start
++}
++
++start() {
++ . /usr/lib/ddns/dynamic_dns_functions.sh
++ start_daemon_for_all_ddns_sections
++}
++
++stop() {
++ killall dynamic_dns_updater.sh 2>/dev/null
++ return 0 # if killall fails, ignore
++}
+diff --git a/feeds/packages/net/ddns-scripts/files/dynamic_dns_functions.sh b/feeds/packages/net/ddns-scripts/files/dynamic_dns_functions.sh
+new file mode 100755
+index 0000000..cb0db9a
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/dynamic_dns_functions.sh
+@@ -0,0 +1,1124 @@
++#!/bin/sh
++# /usr/lib/ddns/dynamic_dns_functions.sh
++#
++# Original written by Eric Paul Bishop, January 2008
++#.Distributed under the terms of the GNU General Public License (GPL) version 2.0
++# (Loosely) based on the script on the one posted by exobyte in the forums here:
++# http://forum.openwrt.org/viewtopic.php?id=14040
++#
++# extended and partial rewritten in August 2014 by
++#.Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++# to support:
++# - IPv6 DDNS services
++# - setting DNS Server to retrieve current IP including TCP transport
++# - Proxy Server to send out updates or retrieving WEB based IP detection
++# - force_interval=0 to run once (useful for cron jobs etc.)
++# - the usage of BIND's host instead of BusyBox's nslookup if installed (DNS via TCP)
++# - extended Verbose Mode and log file support for better error detection
++#
++# function timeout
++# copied from http://www.ict.griffith.edu.au/anthony/software/timeout.sh
++# @author Anthony Thyssen 6 April 2011
++#
++# variables in small chars are read from /etc/config/ddns
++# variables in big chars are defined inside these scripts as global vars
++# variables in big chars beginning with "__" are local defined inside functions only
++# set -vx #script debugger
++
++. /lib/functions.sh
++. /lib/functions/network.sh
++
++# GLOBAL VARIABLES #
++SECTION_ID="" # hold config's section name
++VERBOSE_MODE=1 # default mode is log to console, but easily changed with parameter
++
++LOGFILE="" # logfile - all files are set in dynamic_dns_updater.sh
++PIDFILE="" # pid file
++UPDFILE="" # store UPTIME of last update
++DATFILE="" # save stdout data of WGet and other external programs called
++ERRFILE="" # save stderr output of WGet and other external programs called
++TLDFILE=/usr/lib/ddns/tld_names.dat.gz # TLD file used by split_FQDN
++
++CHECK_SECONDS=0 # calculated seconds out of given
++FORCE_SECONDS=0 # interval and unit
++RETRY_SECONDS=0 # in configuration
++
++LAST_TIME=0 # holds the uptime of last successful update
++CURR_TIME=0 # holds the current uptime
++NEXT_TIME=0 # calculated time for next FORCED update
++EPOCH_TIME=0 # seconds since 1.1.1970 00:00:00
++
++REGISTERED_IP="" # holds the IP read from DNS
++LOCAL_IP="" # holds the local IP read from the box
++
++URL_USER="" # url encoded $username from config file
++URL_PASS="" # url encoded $password from config file
++
++ERR_LAST=0 # used to save $? return code of program and function calls
++ERR_UPDATE=0 # error counter on different local and registered ip
++
++PID_SLEEP=0 # ProcessID of current background "sleep"
++
++# allow NON-public IP's
++ALLOW_LOCAL_IP=$(uci -q get ddns.global.allow_local_ip) || ALLOW_LOCAL_IP=0
++
++# directory to store run information to.
++RUNDIR=$(uci -q get ddns.global.run_dir) || RUNDIR="/var/run/ddns"
++[ -d $RUNDIR ] || mkdir -p -m755 $RUNDIR
++
++# directory to store log files
++LOGDIR=$(uci -q get ddns.global.log_dir) || LOGDIR="/var/log/ddns"
++[ -d $LOGDIR ] || mkdir -p -m755 $LOGDIR
++
++# number of lines to before rotate logfile
++LOGLINES=$(uci -q get ddns.global.log_lines) || LOGLINES=250
++LOGLINES=$((LOGLINES + 1)) # correct sed handling
++
++# format to show date information in log and luci-app-ddns default ISO 8601 format
++DATE_FORMAT=$(uci -q get ddns.global.date_format) || DATE_FORMAT="%F %R"
++DATE_PROG="date +'$DATE_FORMAT'"
++
++# regular expression to detect IPv4 / IPv6
++# IPv4 0-9 1-3x "." 0-9 1-3x "." 0-9 1-3x "." 0-9 1-3x
++IPV4_REGEX="[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
++# IPv6 ( ( 0-9a-f 1-4char ":") min 1x) ( ( 0-9a-f 1-4char )optional) ( (":" 0-9a-f 1-4char ) min 1x)
++IPV6_REGEX="\(\([0-9A-Fa-f]\{1,4\}:\)\{1,\}\)\(\([0-9A-Fa-f]\{1,4\}\)\{0,1\}\)\(\(:[0-9A-Fa-f]\{1,4\}\)\{1,\}\)"
++
++# detect if called by dynamic_dns_lucihelper.sh script, disable retrys (empty variable == false)
++[ "$(basename $0)" = "dynamic_dns_lucihelper.sh" ] && LUCI_HELPER="TRUE" || LUCI_HELPER=""
++
++# USE_CURL if GNU Wget and cURL installed normally Wget is used by do_transfer()
++# to change this use global option use_curl '1'
++USE_CURL=$(uci -q get ddns.global.use_curl) || USE_CURL=0 # read config
++[ -x /usr/bin/curl ] || USE_CURL=0 # check for cURL
++
++# loads all options for a given package and section
++# also, sets all_option_variables to a list of the variable names
++# $1 = ddns, $2 = SECTION_ID
++load_all_config_options()
++{
++ local __PKGNAME="$1"
++ local __SECTIONID="$2"
++ local __VAR
++ local __ALL_OPTION_VARIABLES=""
++
++ # this callback loads all the variables in the __SECTIONID section when we do
++ # config_load. We need to redefine the option_cb for different sections
++ # so that the active one isn't still active after we're done with it. For reference
++ # the $1 variable is the name of the option and $2 is the name of the section
++ config_cb()
++ {
++ if [ ."$2" = ."$__SECTIONID" ]; then
++ option_cb()
++ {
++ __ALL_OPTION_VARIABLES="$__ALL_OPTION_VARIABLES $1"
++ }
++ else
++ option_cb() { return 0; }
++ fi
++ }
++
++ config_load "$__PKGNAME"
++
++ # Given SECTION_ID not found so no data, so return 1
++ [ -z "$__ALL_OPTION_VARIABLES" ] && return 1
++
++ for __VAR in $__ALL_OPTION_VARIABLES
++ do
++ config_get "$__VAR" "$__SECTIONID" "$__VAR"
++ done
++ return 0
++}
++
++# read's all service sections from ddns config
++# $1 = Name of variable to store
++load_all_service_sections() {
++ local __DATA=""
++ config_cb()
++ {
++ # only look for section type "service", ignore everything else
++ [ "$1" = "service" ] && __DATA="$__DATA $2"
++ }
++ config_load "ddns"
++
++ eval "$1=\"$__DATA\""
++ return
++}
++
++# starts updater script for all given sections or only for the one given
++# $1 = interface (Optional: when given only scripts are started
++# configured for that interface)
++# used by /etc/hotplug.d/iface/25-ddns on IFUP
++# and by /etc/init.d/ddns start
++start_daemon_for_all_ddns_sections()
++{
++ local __EVENTIF="$1"
++ local __SECTIONS=""
++ local __SECTIONID=""
++ local __IFACE=""
++
++ load_all_service_sections __SECTIONS
++ for __SECTIONID in $__SECTIONS; do
++ config_get __IFACE "$__SECTIONID" interface "wan"
++ [ -z "$__EVENTIF" -o "$__IFACE" = "$__EVENTIF" ] || continue
++ /usr/lib/ddns/dynamic_dns_updater.sh $__SECTIONID 0 >/dev/null 2>&1 &
++ done
++}
++
++# stop sections process incl. childs (sleeps)
++# $1 = section
++stop_section_processes() {
++ local __PID=0
++ local __PIDFILE="$RUNDIR/$1.pid"
++ [ $# -ne 1 ] && write_log 12 "Error calling 'stop_section_processes()' - wrong number of parameters"
++
++ [ -e "$__PIDFILE" ] && {
++ __PID=$(cat $__PIDFILE)
++ ps | grep "^[\t ]*$__PID" >/dev/null 2>&1 && kill $__PID || __PID=0 # terminate it
++ }
++ [ $__PID -eq 0 ] # report if process was running
++}
++
++# stop updater script for all defines sections or only for one given
++# $1 = interface (optional)
++# used by /etc/hotplug.d/iface/25-ddns on 'ifdown'
++# and by /etc/init.d/ddns stop
++# needed because we also need to kill "sleep" child processes
++stop_daemon_for_all_ddns_sections() {
++ local __EVENTIF="$1"
++ local __SECTIONS=""
++ local __SECTIONID=""
++ local __IFACE=""
++
++ load_all_service_sections __SECTIONS
++ for __SECTIONID in $__SECTIONS; do
++ config_get __IFACE "$__SECTIONID" interface "wan"
++ [ -z "$__EVENTIF" -o "$__IFACE" = "$__EVENTIF" ] || continue
++ stop_section_processes "$__SECTIONID"
++ done
++}
++
++# reports to console, logfile, syslog
++# $1 loglevel 7 == Debug to 0 == EMERG
++# value +10 will exit the scripts
++# $2..n text to report
++write_log() {
++ local __LEVEL __EXIT __CMD __MSG
++ local __TIME=$(date +%H%M%S)
++ [ $1 -ge 10 ] && {
++ __LEVEL=$(($1-10))
++ __EXIT=1
++ } || {
++ __LEVEL=$1
++ __EXIT=0
++ }
++ shift # remove loglevel
++ [ $__EXIT -eq 0 ] && __MSG="$*" || __MSG="$* - TERMINATE"
++ case $__LEVEL in # create log message and command depending on loglevel
++ 0) __CMD="logger -p user.emerg -t ddns-scripts[$$] $SECTION_ID: $__MSG"
++ __MSG=" $__TIME EMERG : $__MSG" ;;
++ 1) __CMD="logger -p user.alert -t ddns-scripts[$$] $SECTION_ID: $__MSG"
++ __MSG=" $__TIME ALERT : $__MSG" ;;
++ 2) __CMD="logger -p user.crit -t ddns-scripts[$$] $SECTION_ID: $__MSG"
++ __MSG=" $__TIME CRIT : $__MSG" ;;
++ 3) __CMD="logger -p user.err -t ddns-scripts[$$] $SECTION_ID: $__MSG"
++ __MSG=" $__TIME ERROR : $__MSG" ;;
++ 4) __CMD="logger -p user.warn -t ddns-scripts[$$] $SECTION_ID: $__MSG"
++ __MSG=" $__TIME WARN : $__MSG" ;;
++ 5) __CMD="logger -p user.notice -t ddns-scripts[$$] $SECTION_ID: $__MSG"
++ __MSG=" $__TIME note : $__MSG" ;;
++ 6) __CMD="logger -p user.info -t ddns-scripts[$$] $SECTION_ID: $__MSG"
++ __MSG=" $__TIME info : $__MSG" ;;
++ 7) __MSG=" $__TIME : $__MSG";;
++ *) return;;
++ esac
++
++ # verbose echo
++ [ $VERBOSE_MODE -gt 0 -o $__EXIT -gt 0 ] && echo -e "$__MSG"
++ # write to logfile
++ if [ ${use_logfile:-1} -eq 1 -o $VERBOSE_MODE -gt 1 ]; then
++ echo -e "$__MSG" >> $LOGFILE
++ # VERBOSE_MODE > 1 then NO loop so NO truncate log to $LOGLINES lines
++ [ $VERBOSE_MODE -gt 1 ] || sed -i -e :a -e '$q;N;'$LOGLINES',$D;ba' $LOGFILE
++ fi
++ [ $LUCI_HELPER ] && return # nothing else todo when running LuCI helper script
++ [ $__LEVEL -eq 7 ] && return # no syslog for debug messages
++ __CMD=$(echo -e "$__CMD" | tr -d '\n' | tr '\t' ' ') # remove \n \t chars
++ [ $__EXIT -eq 1 ] && {
++ $__CMD # force syslog before exit
++ exit 1
++ }
++ [ $use_syslog -eq 0 ] && return
++ [ $((use_syslog + __LEVEL)) -le 7 ] && $__CMD
++ return
++}
++
++# replace all special chars to their %hex value
++# used for USERNAME and PASSWORD in update_url
++# unchanged: "-"(minus) "_"(underscore) "."(dot) "~"(tilde)
++# to verify: "'"(single quote) '"'(double quote) # because shell delimiter
++# "$"(Dollar) # because used as variable output
++# tested with the following string stored via Luci Application as password / username
++# A B!"#AA$1BB%&'()*+,-./:;<=>?@[\]^_`{|}~ without problems at Dollar or quotes
++urlencode() {
++ # $1 Name of Variable to store encoded string to
++ # $2 string to encode
++ local __STR __LEN __CHAR __OUT
++ local __ENC=""
++ local __POS=1
++
++ [ $# -ne 2 ] && write_log 12 "Error calling 'urlencode()' - wrong number of parameters"
++
++ __STR="$2" # read string to encode
++ __LEN=${#__STR} # get string length
++
++ while [ $__POS -le $__LEN ]; do
++ # read one chat of the string
++ __CHAR=$(expr substr "$__STR" $__POS 1)
++
++ case "$__CHAR" in
++ [-_.~a-zA-Z0-9] )
++ # standard char
++ __OUT="${__CHAR}"
++ ;;
++ * )
++ # special char get %hex code
++ __OUT=$(printf '%%%02x' "'$__CHAR" )
++ ;;
++ esac
++ __ENC="${__ENC}${__OUT}" # append to encoded string
++ __POS=$(( $__POS + 1 )) # increment position
++ done
++
++ eval "$1=\"$__ENC\"" # transfer back to variable
++ return 0
++}
++
++# extract url or script for given DDNS Provider from
++# file /usr/lib/ddns/services for IPv4 or from
++# file /usr/lib/ddns/services_ipv6 for IPv6
++# $1 Name of Variable to store url to
++# $2 Name of Variable to store script to
++get_service_data() {
++ local __LINE __FILE __NAME __URL __SERVICES __DATA
++ local __SCRIPT=""
++ local __OLD_IFS=$IFS
++ local __NEWLINE_IFS='
++' # __NEWLINE_IFS
++ [ $# -ne 2 ] && write_log 12 "Error calling 'get_service_data()' - wrong number of parameters"
++
++ __FILE="/usr/lib/ddns/services" # IPv4
++ [ $use_ipv6 -ne 0 ] && __FILE="/usr/lib/ddns/services_ipv6" # IPv6
++
++ # remove any lines not containing data, and then make sure fields are enclosed in double quotes
++ __SERVICES=$(cat $__FILE | grep "^[\t ]*[^#]" | \
++ awk ' gsub("\x27", "\"") { if ($1~/^[^\"]*$/) $1="\""$1"\"" }; { if ( $NF~/^[^\"]*$/) $NF="\""$NF"\"" }; { print $0 }')
++
++ IFS=$__NEWLINE_IFS
++ for __LINE in $__SERVICES; do
++ # grep out proper parts of data and use echo to remove quotes
++ __NAME=$(echo $__LINE | grep -o "^[\t ]*\"[^\"]*\"" | xargs -r -n1 echo)
++ __DATA=$(echo $__LINE | grep -o "\"[^\"]*\"[\t ]*$" | xargs -r -n1 echo)
++
++ if [ "$__NAME" = "$service_name" ]; then
++ break # found so leave for loop
++ fi
++ done
++ IFS=$__OLD_IFS
++
++ # check if URL or SCRIPT is given
++ __URL=$(echo "$__DATA" | grep "^http")
++ [ -z "$__URL" ] && __SCRIPT="/usr/lib/ddns/$__DATA"
++
++ eval "$1=\"$__URL\""
++ eval "$2=\"$__SCRIPT\""
++ return 0
++}
++
++# Calculate seconds from interval and unit
++# $1 Name of Variable to store result in
++# $2 Number and
++# $3 Unit of time interval
++get_seconds() {
++ [ $# -ne 3 ] && write_log 12 "Error calling 'get_seconds()' - wrong number of parameters"
++ case "$3" in
++ "days" ) eval "$1=$(( $2 * 86400 ))";;
++ "hours" ) eval "$1=$(( $2 * 3600 ))";;
++ "minutes" ) eval "$1=$(( $2 * 60 ))";;
++ * ) eval "$1=$2";;
++ esac
++ return 0
++}
++
++timeout() {
++ #.copied from http://www.ict.griffith.edu.au/anthony/software/timeout.sh
++ # only did the following changes
++ # - commented out "#!/bin/bash" and usage section
++ # - replace exit by return for usage as function
++ # - some reformatting
++ #
++ # timeout [-SIG] time [--] command args...
++ #
++ # Run the given command until completion, but kill it if it runs too long.
++ # Specifically designed to exit immediately (no sleep interval) and clean up
++ # nicely without messages or leaving any extra processes when finished.
++ #
++ # Example use
++ # timeout 5 countdown
++ #
++ # Based on notes in my "Shell Script Hints", section "Command Timeout"
++ # http://www.ict.griffith.edu.au/~anthony/info/shell/script.hints
++ #
++ # This script uses a lot of tricks to terminate both the background command,
++ # the timeout script, and even the sleep process. It also includes trap
++ # commands to prevent sub-shells reporting expected "Termination Errors".
++ #
++ # It took years of occasional trials, errors and testing to get a pure bash
++ # timeout command working as well as this does.
++ #
++ #.Anthony Thyssen 6 April 2011
++ #
++# PROGNAME=$(type $0 | awk '{print $3}') # search for executable on path
++# PROGDIR=$(dirname $PROGNAME) # extract directory of program
++# PROGNAME=$(basename $PROGNAME) # base name of program
++
++ # output the script comments as docs
++# Usage() {
++# echo >&2 "$PROGNAME:" "$@"
++# sed >&2 -n '/^###/q; /^#/!q; s/^#//; s/^ //; 3s/^/Usage: /; 2,$ p' "$PROGDIR/$PROGNAME"
++# exit 10;
++# }
++
++ SIG=-TERM
++
++ while [ $# -gt 0 ]; do
++ case "$1" in
++ --)
++ # forced end of user options
++ shift;
++ break ;;
++# -\?|--help|--doc*)
++# Usage ;;
++ [0-9]*)
++ TIMEOUT="$1" ;;
++ -*)
++ SIG="$1" ;;
++ *)
++ # unforced end of user options
++ break ;;
++ esac
++ shift # next option
++ done
++
++ # run main command in backgrounds and get its pid
++ "$@" &
++ command_pid=$!
++
++ # timeout sub-process abort countdown after ABORT seconds! also backgrounded
++ sleep_pid=0
++ (
++ # cleanup sleep process
++ trap 'kill -TERM $sleep_pid; return 1' 1 2 3 15
++ # sleep timeout period in background
++ sleep $TIMEOUT &
++ sleep_pid=$!
++ wait $sleep_pid
++ # Abort the command
++ kill $SIG $command_pid >/dev/null 2>&1
++ return 1
++ ) &
++ timeout_pid=$!
++
++ # Wait for main command to finished or be timed out
++ wait $command_pid
++ status=$?
++
++ # Clean up timeout sub-shell - if it is still running!
++ kill $timeout_pid 2>/dev/null
++ wait $timeout_pid 2>/dev/null
++
++ # Uncomment to check if a LONG sleep still running (no sleep should be)
++ # sleep 1
++ # echo "-----------"
++ # /bin/ps j # uncomment to show if abort "sleep" is still sleeping
++
++ return $status
++}
++
++# verify given host and port is connectable
++# $1 Host/IP to verify
++# $2 Port to verify
++verify_host_port() {
++ local __HOST=$1
++ local __PORT=$2
++ local __IP __IPV4 __IPV6 __RUNPROG __PROG __ERR
++ # return codes
++ # 1 system specific error
++ # 2 nslookup/host error
++ # 3 nc (netcat) error
++ # 4 unmatched IP version
++
++ [ $# -ne 2 ] && write_log 12 "Error calling 'verify_host_port()' - wrong number of parameters"
++
++ # check if ip or FQDN was given
++ __IPV4=$(echo $__HOST | grep -m 1 -o "$IPV4_REGEX$") # do not detect ip in 0.0.0.0.example.com
++ __IPV6=$(echo $__HOST | grep -m 1 -o "$IPV6_REGEX")
++ # if FQDN given get IP address
++ [ -z "$__IPV4" -a -z "$__IPV6" ] && {
++ if [ -x /usr/bin/host ]; then # use BIND host if installed
++ __PROG="BIND host"
++ __RUNPROG="/usr/bin/host -t ANY $__HOST >$DATFILE 2>$ERRFILE"
++ else # use BusyBox nslookup
++ __PROG="BusyBox nslookup"
++ __RUNPROG="/usr/bin/nslookup $__HOST >$DATFILE 2>$ERRFILE"
++ fi
++ write_log 7 "#> $__RUNPROG"
++ eval $__RUNPROG
++ __ERR=$?
++ # command error
++ [ $__ERR -gt 0 ] && {
++ write_log 3 "DNS Resolver Error - $__PROG Error '$__ERR'"
++ write_log 7 "$(cat $ERRFILE)"
++ return 2
++ }
++ # extract IP address
++ if [ -x /usr/bin/host ]; then # use BIND host if installed
++ __IPV4=$(cat $DATFILE | awk -F "address " '/has address/ {print $2; exit}' )
++ __IPV6=$(cat $DATFILE | awk -F "address " '/has IPv6/ {print $2; exit}' )
++ else # use BusyBox nslookup
++ __IPV4=$(cat $DATFILE | sed -ne "/^Name:/,\$ { s/^Address[0-9 ]\{0,\}: \($IPV4_REGEX\).*$/\\1/p }")
++ __IPV6=$(cat $DATFILE | sed -ne "/^Name:/,\$ { s/^Address[0-9 ]\{0,\}: \($IPV6_REGEX\).*$/\\1/p }")
++ fi
++ }
++
++ # check IP version if forced
++ if [ $force_ipversion -ne 0 ]; then
++ __ERR=0
++ [ $use_ipv6 -eq 0 -a -z "$__IPV4" ] && __ERR=4
++ [ $use_ipv6 -eq 1 -a -z "$__IPV6" ] && __ERR=6
++ [ $__ERR -gt 0 ] && {
++ [ $LUCI_HELPER ] && return 4
++ write_log 14 "Verify host Error '4' - Forced IP Version IPv$__ERR don't match"
++ }
++ fi
++
++ # verify nc command
++ # busybox nc compiled without -l option "NO OPT l!" -> critical error
++ /usr/bin/nc --help 2>&1 | grep -i "NO OPT l!" >/dev/null 2>&1 && \
++ write_log 12 "Busybox nc (netcat) compiled without '-l' option, error 'NO OPT l!'"
++ # busybox nc compiled with extensions
++ /usr/bin/nc --help 2>&1 | grep "\-w" >/dev/null 2>&1 && __NCEXT="TRUE"
++
++ # connectivity test
++ # run busybox nc to HOST PORT
++ # busybox might be compiled with "FEATURE_PREFER_IPV4_ADDRESS=n"
++ # then nc will try to connect via IPv6 if there is any IPv6 available on any host interface
++ # not worrying, if there is an IPv6 wan address
++ # so if not "force_ipversion" to use_ipv6 then connect test via ipv4, if available
++ [ $force_ipversion -ne 0 -a $use_ipv6 -ne 0 -o -z "$__IPV4" ] && __IP=$__IPV6 || __IP=$__IPV4
++
++ if [ -n "$__NCEXT" ]; then # BusyBox nc compiled with extensions (timeout support)
++ __RUNPROG="/usr/bin/nc -w 1 $__IP $__PORT </dev/null >$DATFILE 2>$ERRFILE"
++ write_log 7 "#> $__RUNPROG"
++ eval $__RUNPROG
++ __ERR=$?
++ [ $__ERR -eq 0 ] && return 0
++ write_log 3 "Connect error - BusyBox nc (netcat) Error '$__ERR'"
++ write_log 7 "$(cat $ERRFILE)"
++ return 3
++ else # nc compiled without extensions (no timeout support)
++ __RUNPROG="timeout 2 -- /usr/bin/nc $__IP $__PORT </dev/null >$DATFILE 2>$ERRFILE"
++ write_log 7 "#> $__RUNPROG"
++ eval $__RUNPROG
++ __ERR=$?
++ [ $__ERR -eq 0 ] && return 0
++ write_log 3 "Connect error - BusyBox nc (netcat) timeout Error '$__ERR'"
++ return 3
++ fi
++}
++
++# verify given DNS server if connectable
++# $1 DNS server to verify
++verify_dns() {
++ local __ERR=255 # last error buffer
++ local __CNT=0 # error counter
++
++ [ $# -ne 1 ] && write_log 12 "Error calling 'verify_dns()' - wrong number of parameters"
++ write_log 7 "Verify DNS server '$1'"
++
++ while [ $__ERR -ne 0 ]; do
++ # DNS uses port 53
++ verify_host_port "$1" "53"
++ __ERR=$?
++ if [ $LUCI_HELPER ]; then # no retry if called by LuCI helper script
++ return $__ERR
++ elif [ $__ERR -ne 0 -a $VERBOSE_MODE -gt 1 ]; then # VERBOSE_MODE > 1 then NO retry
++ write_log 4 "Verify DNS server '$1' failed - Verbose Mode: $VERBOSE_MODE - NO retry on error"
++ return $__ERR
++ elif [ $__ERR -ne 0 ]; then
++ __CNT=$(( $__CNT + 1 )) # increment error counter
++ # if error count > retry_count leave here
++ [ $retry_count -gt 0 -a $__CNT -gt $retry_count ] && \
++ write_log 14 "Verify DNS server '$1' failed after $retry_count retries"
++
++ write_log 4 "Verify DNS server '$1' failed - retry $__CNT/$retry_count in $RETRY_SECONDS seconds"
++ sleep $RETRY_SECONDS &
++ PID_SLEEP=$!
++ wait $PID_SLEEP # enable trap-handler
++ PID_SLEEP=0
++ fi
++ done
++ return 0
++}
++
++# analyze and verify given proxy string
++# $1 Proxy-String to verify
++verify_proxy() {
++ # complete entry user:password@host:port
++ # inside user and password NO '@' of ":" allowed
++ # host and port only host:port
++ # host only host ERROR unsupported
++ # IPv4 address instead of host 123.234.234.123
++ # IPv6 address instead of host [xxxx:....:xxxx] in square bracket
++ local __TMP __HOST __PORT
++ local __ERR=255 # last error buffer
++ local __CNT=0 # error counter
++
++ [ $# -ne 1 ] && write_log 12 "Error calling 'verify_proxy()' - wrong number of parameters"
++ write_log 7 "Verify Proxy server 'http://$1'"
++
++ # try to split user:password "@" host:port
++ __TMP=$(echo $1 | awk -F "@" '{print $2}')
++ # no "@" found - only host:port is given
++ [ -z "$__TMP" ] && __TMP="$1"
++ # now lets check for IPv6 address
++ __HOST=$(echo $__TMP | grep -m 1 -o "$IPV6_REGEX")
++ # IPv6 host address found read port
++ if [ -n "$__HOST" ]; then
++ # IPv6 split at "]:"
++ __PORT=$(echo $__TMP | awk -F "]:" '{print $2}')
++ else
++ __HOST=$(echo $__TMP | awk -F ":" '{print $1}')
++ __PORT=$(echo $__TMP | awk -F ":" '{print $2}')
++ fi
++ # No Port detected - EXITING
++ [ -z "$__PORT" ] && {
++ [ $LUCI_HELPER ] && return 5
++ write_log 14 "Invalid Proxy server Error '5' - proxy port missing"
++ }
++
++ while [ $__ERR -gt 0 ]; do
++ verify_host_port "$__HOST" "$__PORT"
++ __ERR=$?
++ if [ $LUCI_HELPER ]; then # no retry if called by LuCI helper script
++ return $__ERR
++ elif [ $__ERR -gt 0 -a $VERBOSE_MODE -gt 1 ]; then # VERBOSE_MODE > 1 then NO retry
++ write_log 4 "Verify Proxy server '$1' failed - Verbose Mode: $VERBOSE_MODE - NO retry on error"
++ return $__ERR
++ elif [ $__ERR -gt 0 ]; then
++ __CNT=$(( $__CNT + 1 )) # increment error counter
++ # if error count > retry_count leave here
++ [ $retry_count -gt 0 -a $__CNT -gt $retry_count ] && \
++ write_log 14 "Verify Proxy server '$1' failed after $retry_count retries"
++
++ write_log 4 "Verify Proxy server '$1' failed - retry $__CNT/$retry_count in $RETRY_SECONDS seconds"
++ sleep $RETRY_SECONDS &
++ PID_SLEEP=$!
++ wait $PID_SLEEP # enable trap-handler
++ PID_SLEEP=0
++ fi
++ done
++ return 0
++}
++
++do_transfer() {
++ # $1 # URL to use
++ local __URL="$1"
++ local __ERR=0
++ local __CNT=0 # error counter
++ local __PROG __RUNPROG
++
++ [ $# -ne 1 ] && write_log 12 "Error in 'do_transfer()' - wrong number of parameters"
++
++ # lets prefer GNU Wget because it does all for us - IPv4/IPv6/HTTPS/PROXY/force IP version
++ grep -i "\+ssl" /usr/bin/wget >/dev/null 2>&1 # check for Wget with SSL support
++ if [ $? -eq 0 -a $USE_CURL -eq 0 ]; then # except global option use_curl is set to "1"
++ __PROG="/usr/bin/wget -nv -t 1 -O $DATFILE -o $ERRFILE" # non_verbose no_retry outfile errfile
++ # force network/ip to use for communication
++ if [ -n "$bind_network" ]; then
++ local __BINDIP
++ # set correct program to detect IP
++ [ $use_ipv6 -eq 0 ] && __RUNPROG="network_get_ipaddr" || __RUNPROG="network_get_ipaddr6"
++ eval "$__RUNPROG __BINDIP $bind_network" || \
++ write_log 13 "Can not detect local IP using '$__RUNPROG $bind_network' - Error: '$?'"
++ write_log 7 "Force communication via IP '$__BINDIP'"
++ __PROG="$__PROG --bind-address=$__BINDIP"
++ fi
++ # force ip version to use
++ if [ $force_ipversion -eq 1 ]; then
++ [ $use_ipv6 -eq 0 ] && __PROG="$__PROG -4" || __PROG="$__PROG -6" # force IPv4/IPv6
++ fi
++ # set certificate parameters
++ if [ $use_https -eq 1 ]; then
++ if [ "$cacert" = "IGNORE" ]; then # idea from Ticket #15327 to ignore server cert
++ __PROG="$__PROG --no-check-certificate"
++ elif [ -f "$cacert" ]; then
++ __PROG="$__PROG --ca-certificate=${cacert}"
++ elif [ -d "$cacert" ]; then
++ __PROG="$__PROG --ca-directory=${cacert}"
++ else # exit here because it makes no sense to start loop
++ write_log 14 "No valid certificate(s) found at '$cacert' for HTTPS communication"
++ fi
++ fi
++ # disable proxy if no set (there might be .wgetrc or .curlrc or wrong environment set)
++ [ -z "$proxy" ] && __PROG="$__PROG --no-proxy"
++
++ __RUNPROG="$__PROG '$__URL'" # build final command
++ __PROG="GNU Wget" # reuse for error logging
++
++ # 2nd choice is cURL IPv4/IPv6/HTTPS
++ # libcurl might be compiled without Proxy Support (default in trunk)
++ elif [ -x /usr/bin/curl ]; then
++ __PROG="/usr/bin/curl -RsS -o $DATFILE --stderr $ERRFILE"
++ # force network/interface-device to use for communication
++ if [ -n "$bind_network" ]; then
++ local __DEVICE
++ network_get_physdev __DEVICE $bind_network || \
++ write_log 13 "Can not detect local device using 'network_get_physdev $bind_network' - Error: '$?'"
++ write_log 7 "Force communication via device '$__DEVICE'"
++ __PROG="$__PROG --interface $__DEVICE"
++ fi
++ # force ip version to use
++ if [ $force_ipversion -eq 1 ]; then
++ [ $use_ipv6 -eq 0 ] && __PROG="$__PROG -4" || __PROG="$__PROG -6" # force IPv4/IPv6
++ fi
++ # set certificate parameters
++ if [ $use_https -eq 1 ]; then
++ if [ "$cacert" = "IGNORE" ]; then # idea from Ticket #15327 to ignore server cert
++ __PROG="$__PROG --insecure" # but not empty better to use "IGNORE"
++ elif [ -f "$cacert" ]; then
++ __PROG="$__PROG --cacert $cacert"
++ elif [ -d "$cacert" ]; then
++ __PROG="$__PROG --capath $cacert"
++ else # exit here because it makes no sense to start loop
++ write_log 14 "No valid certificate(s) found at '$cacert' for HTTPS communication"
++ fi
++ fi
++ # disable proxy if no set (there might be .wgetrc or .curlrc or wrong environment set)
++ # or check if libcurl compiled with proxy support
++ if [ -z "$proxy" ]; then
++ __PROG="$__PROG --noproxy '*'"
++ else
++ # if libcurl has no proxy support and proxy should be used then force ERROR
++ # libcurl currently no proxy support by default
++ grep -i "all_proxy" /usr/lib/libcurl.so* >/dev/null 2>&1 || \
++ write_log 13 "cURL: libcurl compiled without Proxy support"
++ fi
++
++ __RUNPROG="$__PROG '$__URL'" # build final command
++ __PROG="cURL" # reuse for error logging
++
++ # busybox Wget (did not support neither IPv6 nor HTTPS)
++ elif [ -x /usr/bin/wget ]; then
++ __PROG="/usr/bin/wget -q -O $DATFILE"
++ # force network/ip not supported
++ [ -n "$__BINDIP" ] && \
++ write_log 14 "BusyBox Wget: FORCE binding to specific address not supported"
++ # force ip version not supported
++ [ $force_ipversion -eq 1 ] && \
++ write_log 14 "BusyBox Wget: Force connecting to IPv4 or IPv6 addresses not supported"
++ # https not supported
++ [ $use_https -eq 1 ] && \
++ write_log 14 "BusyBox Wget: no HTTPS support"
++ # disable proxy if no set (there might be .wgetrc or .curlrc or wrong environment set)
++ [ -z "$proxy" ] && __PROG="$__PROG -Y off"
++
++ __RUNPROG="$__PROG '$__URL' 2>$ERRFILE" # build final command
++ __PROG="Busybox Wget" # reuse for error logging
++
++ else
++ write_log 13 "Neither 'Wget' nor 'cURL' installed or executable"
++ fi
++
++ while : ; do
++ write_log 7 "#> $__RUNPROG"
++ eval $__RUNPROG # DO transfer
++ __ERR=$? # save error code
++ [ $__ERR -eq 0 ] && return 0 # no error leave
++ [ $LUCI_HELPER ] && return 1 # no retry if called by LuCI helper script
++
++ write_log 3 "$__PROG Error: '$__ERR'"
++ write_log 7 "$(cat $ERRFILE)" # report error
++
++ [ $VERBOSE_MODE -gt 1 ] && {
++ # VERBOSE_MODE > 1 then NO retry
++ write_log 4 "Transfer failed - Verbose Mode: $VERBOSE_MODE - NO retry on error"
++ return 1
++ }
++
++ __CNT=$(( $__CNT + 1 )) # increment error counter
++ # if error count > retry_count leave here
++ [ $retry_count -gt 0 -a $__CNT -gt $retry_count ] && \
++ write_log 14 "Transfer failed after $retry_count retries"
++
++ write_log 4 "Transfer failed - retry $__CNT/$retry_count in $RETRY_SECONDS seconds"
++ sleep $RETRY_SECONDS &
++ PID_SLEEP=$!
++ wait $PID_SLEEP # enable trap-handler
++ PID_SLEEP=0
++ done
++ # we should never come here there must be a programming error
++ write_log 12 "Error in 'do_transfer()' - program coding error"
++}
++
++send_update() {
++ # $1 # IP to set at DDNS service provider
++ local __IP
++
++ [ $# -ne 1 ] && write_log 12 "Error calling 'send_update()' - wrong number of parameters"
++
++ if [ $ALLOW_LOCAL_IP -eq 0 ]; then
++ # verify given IP / no private IPv4's / no IPv6 addr starting with fxxx of with ":"
++ [ $use_ipv6 -eq 0 ] && __IP=$(echo $1 | grep -v -E "(^0|^10\.|^100\.6[4-9]\.|^100\.[7-9][0-9]\.|^100\.1[0-1][0-9]\.|^100\.12[0-7]\.|^127|^169\.254|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-1]\.|^192\.168)")
++ [ $use_ipv6 -eq 1 ] && __IP=$(echo $1 | grep "^[0-9a-eA-E]")
++ [ -z "$__IP" ] && write_log 14 "Private or invalid or no IP '$1' given! Please check your configuration"
++ else
++ __IP="$1"
++ fi
++
++ if [ -n "$update_script" ]; then
++ write_log 7 "parsing script '$update_script'"
++ . $update_script
++ else
++ local __URL __ERR
++
++ # do replaces in URL
++ __URL=$(echo $update_url | sed -e "s#\[USERNAME\]#$URL_USER#g" -e "s#\[PASSWORD\]#$URL_PASS#g" \
++ -e "s#\[DOMAIN\]#$domain#g" -e "s#\[IP\]#$__IP#g")
++ [ $use_https -ne 0 ] && __URL=$(echo $__URL | sed -e 's#^http:#https:#')
++
++ do_transfer "$__URL" || return 1
++
++ write_log 7 "DDNS Provider answered:\n$(cat $DATFILE)"
++
++ return 0
++ # TODO analyze providers answer
++ # "good" or "nochg" = dyndns.com compatible API
++ # grep -i -E "good|nochg" $DATFILE >/dev/null 2>&1
++ # return $? # "0" if found
++ fi
++}
++
++get_local_ip () {
++ # $1 Name of Variable to store local IP (LOCAL_IP)
++ local __CNT=0 # error counter
++ local __RUNPROG __DATA __URL __ERR
++
++ [ $# -ne 1 ] && write_log 12 "Error calling 'get_local_ip()' - wrong number of parameters"
++ write_log 7 "Detect local IP on '$ip_source'"
++
++ while : ; do
++ case $ip_source in
++ network)
++ # set correct program
++ [ $use_ipv6 -eq 0 ] && __RUNPROG="network_get_ipaddr" \
++ || __RUNPROG="network_get_ipaddr6"
++ eval "$__RUNPROG __DATA $ip_network" || \
++ write_log 13 "Can not detect local IP using $__RUNPROG '$ip_network' - Error: '$?'"
++ [ -n "$__DATA" ] && write_log 7 "Local IP '$__DATA' detected on network '$ip_network'"
++ ;;
++ interface)
++ write_log 7 "#> ifconfig $ip_interface >$DATFILE 2>$ERRFILE"
++ ifconfig $ip_interface >$DATFILE 2>$ERRFILE
++ __ERR=$?
++ if [ $__ERR -eq 0 ]; then
++ if [ $use_ipv6 -eq 0 ]; then
++ __DATA=$(awk '
++ /inet addr:/ { # Filter IPv4
++ # inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
++ $1=""; # remove inet
++ $3=""; # remove Bcast: ...
++ $4=""; # remove Mask: ...
++ FS=":"; # separator ":"
++ $0=$0; # reread to activate separator
++ $1=""; # remove addr
++ FS=" "; # set back separator to default " "
++ $0=$0; # reread to activate separator (remove whitespaces)
++ print $1; # print IPv4 addr
++ }' $DATFILE
++ )
++ else
++ __DATA=$(awk '
++ /inet6/ && /: [0-9a-eA-E]/ && !/\/128/ { # Filter IPv6 exclude fxxx and /128 prefix
++ # inet6 addr: 2001:db8::xxxx:xxxx/32 Scope:Global
++ FS="/"; # separator "/"
++ $0=$0; # reread to activate separator
++ $2=""; # remove everything behind "/"
++ FS=" "; # set back separator to default " "
++ $0=$0; # reread to activate separator
++ print $3; # print IPv6 addr
++ }' $DATFILE
++ )
++ fi
++ [ -n "$__DATA" ] && write_log 7 "Local IP '$__DATA' detected on interface '$ip_interface'"
++ else
++ write_log 3 "ifconfig Error: '$__ERR'"
++ write_log 7 "$(cat $ERRFILE)" # report error
++ fi
++ ;;
++ script)
++ write_log 7 "#> $ip_script >$DATFILE 2>$ERRFILE"
++ eval $ip_script >$DATFILE 2>$ERRFILE
++ __ERR=$?
++ if [ $__ERR -eq 0 ]; then
++ __DATA=$(cat $DATFILE)
++ [ -n "$__DATA" ] && write_log 7 "Local IP '$__DATA' detected via script '$ip_script'"
++ else
++ write_log 3 "$ip_script Error: '$__ERR'"
++ write_log 7 "$(cat $ERRFILE)" # report error
++ fi
++ ;;
++ web)
++ do_transfer "$ip_url"
++ # use correct regular expression
++ [ $use_ipv6 -eq 0 ] \
++ && __DATA=$(grep -m 1 -o "$IPV4_REGEX" $DATFILE) \
++ || __DATA=$(grep -m 1 -o "$IPV6_REGEX" $DATFILE)
++ [ -n "$__DATA" ] && write_log 7 "Local IP '$__DATA' detected on web at '$ip_url'"
++ ;;
++ *)
++ write_log 12 "Error in 'get_local_ip()' - unhandled ip_source '$ip_source'"
++ ;;
++ esac
++ # valid data found return here
++ [ -n "$__DATA" ] && {
++ eval "$1=\"$__DATA\""
++ return 0
++ }
++
++ [ $LUCI_HELPER ] && return 1 # no retry if called by LuCI helper script
++
++ write_log 7 "Data detected:\n$(cat $DATFILE)"
++
++ [ $VERBOSE_MODE -gt 1 ] && {
++ # VERBOSE_MODE > 1 then NO retry
++ write_log 4 "Get local IP via '$ip_source' failed - Verbose Mode: $VERBOSE_MODE - NO retry on error"
++ return 1
++ }
++
++ __CNT=$(( $__CNT + 1 )) # increment error counter
++ # if error count > retry_count leave here
++ [ $retry_count -gt 0 -a $__CNT -gt $retry_count ] && \
++ write_log 14 "Get local IP via '$ip_source' failed after $retry_count retries"
++ write_log 4 "Get local IP via '$ip_source' failed - retry $__CNT/$retry_count in $RETRY_SECONDS seconds"
++ sleep $RETRY_SECONDS &
++ PID_SLEEP=$!
++ wait $PID_SLEEP # enable trap-handler
++ PID_SLEEP=0
++ done
++ # we should never come here there must be a programming error
++ write_log 12 "Error in 'get_local_ip()' - program coding error"
++}
++
++get_registered_ip() {
++ # $1 Name of Variable to store public IP (REGISTERED_IP)
++ # $2 (optional) if set, do not retry on error
++ local __CNT=0 # error counter
++ local __ERR=255
++ local __REGEX __PROG __RUNPROG __DATA
++ # return codes
++ # 1 no IP detected
++
++ [ $# -lt 1 -o $# -gt 2 ] && write_log 12 "Error calling 'get_registered_ip()' - wrong number of parameters"
++ write_log 7 "Detect registered/public IP"
++
++ # set correct regular expression
++ [ $use_ipv6 -eq 0 ] && __REGEX="$IPV4_REGEX" || __REGEX="$IPV6_REGEX"
++
++ if [ -x /usr/bin/host ]; then
++ __PROG="/usr/bin/host"
++ [ $use_ipv6 -eq 0 ] && __PROG="$__PROG -t A" || __PROG="$__PROG -t AAAA"
++ if [ $force_ipversion -eq 1 ]; then # force IP version
++ [ $use_ipv6 -eq 0 ] && __PROG="$__PROG -4" || __PROG="$__PROG -6"
++ fi
++ [ $force_dnstcp -eq 1 ] && __PROG="$__PROG -T" # force TCP
++
++ __RUNPROG="$__PROG $domain $dns_server >$DATFILE 2>$ERRFILE"
++ __PROG="BIND host"
++ elif [ -x /usr/bin/nslookup ]; then # last use BusyBox nslookup
++ [ $force_ipversion -ne 0 -o $force_dnstcp -ne 0 ] && \
++ write_log 14 "Busybox nslookup - no support to 'force IP Version' or 'DNS over TCP'"
++
++ __RUNPROG="/usr/bin/nslookup $domain $dns_server >$DATFILE 2>$ERRFILE"
++ __PROG="BusyBox nslookup"
++ else # there must be an error
++ write_log 12 "Error in 'get_registered_ip()' - no supported Name Server lookup software accessible"
++ fi
++
++ while : ; do
++ write_log 7 "#> $__RUNPROG"
++ eval $__RUNPROG
++ __ERR=$?
++ if [ $__ERR -ne 0 ]; then
++ write_log 3 "$__PROG error: '$__ERR'"
++ write_log 7 "$(cat $ERRFILE)"
++ else
++ if [ "$__PROG" = "BIND host" ]; then
++ __DATA=$(cat $DATFILE | awk -F "address " '/has/ {print $2; exit}' )
++ else
++ __DATA=$(cat $DATFILE | sed -ne "/^Name:/,\$ { s/^Address[0-9 ]\{0,\}: \($__REGEX\).*$/\\1/p }" )
++ fi
++ [ -n "$__DATA" ] && {
++ write_log 7 "Registered IP '$__DATA' detected"
++ eval "$1=\"$__DATA\"" # valid data found
++ return 0 # leave here
++ }
++ write_log 4 "NO valid IP found"
++ __ERR=127
++ fi
++
++ [ $LUCI_HELPER ] && return $__ERR # no retry if called by LuCI helper script
++ [ -n "$2" ] && return $__ERR # $2 is given -> no retry
++ [ $VERBOSE_MODE -gt 1 ] && {
++ # VERBOSE_MODE > 1 then NO retry
++ write_log 4 "Get registered/public IP for '$domain' failed - Verbose Mode: $VERBOSE_MODE - NO retry on error"
++ return $__ERR
++ }
++
++ __CNT=$(( $__CNT + 1 )) # increment error counter
++ # if error count > retry_count leave here
++ [ $retry_count -gt 0 -a $__CNT -gt $retry_count ] && \
++ write_log 14 "Get registered/public IP for '$domain' failed after $retry_count retries"
++
++ write_log 4 "Get registered/public IP for '$domain' failed - retry $__CNT/$retry_count in $RETRY_SECONDS seconds"
++ sleep $RETRY_SECONDS &
++ PID_SLEEP=$!
++ wait $PID_SLEEP # enable trap-handler
++ PID_SLEEP=0
++ done
++ # we should never come here there must be a programming error
++ write_log 12 "Error in 'get_registered_ip()' - program coding error"
++}
++
++get_uptime() {
++ # $1 Variable to store result in
++ [ $# -ne 1 ] && write_log 12 "Error calling 'verify_host_port()' - wrong number of parameters"
++ local __UPTIME=$(cat /proc/uptime)
++ eval "$1=\"${__UPTIME%%.*}\""
++}
++
++trap_handler() {
++ # $1 trap signal
++ # $2 optional (exit status)
++ local __PIDS __PID
++ local __ERR=${2:-0}
++ local __OLD_IFS=$IFS
++ local __NEWLINE_IFS='
++' # __NEWLINE_IFS
++
++ [ $PID_SLEEP -ne 0 ] && kill -$1 $PID_SLEEP 2>/dev/null # kill pending sleep if exist
++
++ case $1 in
++ 0) if [ $__ERR -eq 0 ]; then
++ write_log 5 "PID '$$' exit normal at $(eval $DATE_PROG)\n"
++ else
++ write_log 4 "PID '$$' exit WITH ERROR '$__ERR' at $(eval $DATE_PROG)\n"
++ fi ;;
++ 1) write_log 6 "PID '$$' received 'SIGHUP' at $(eval $DATE_PROG)"
++ # reload config via starting the script again
++ eval "/usr/lib/ddns/dynamic_dns_updater.sh $SECTION_ID $VERBOSE_MODE &"
++ exit 0 ;; # and leave this one
++ 2) write_log 5 "PID '$$' terminated by 'SIGINT' at $(eval $DATE_PROG)\n";;
++ 3) write_log 5 "PID '$$' terminated by 'SIGQUIT' at $(eval $DATE_PROG)\n";;
++ 15) write_log 5 "PID '$$' terminated by 'SIGTERM' at $(eval $DATE_PROG)\n";;
++ *) write_log 13 "Unhandled signal '$1' in 'trap_handler()'";;
++ esac
++
++ __PIDS=$(pgrep -P $$) # get my childs (pgrep prints with "newline")
++ IFS=$__NEWLINE_IFS
++ for __PID in $__PIDS; do
++ kill -$1 $__PID # terminate it
++ done
++ IFS=$__OLD_IFS
++
++ # remove out and err file
++ [ -f $DATFILE ] && rm -f $DATFILE
++ [ -f $ERRFILE ] && rm -f $ERRFILE
++
++ # exit with correct handling:
++ # remove trap handling settings and send kill to myself
++ trap - 0 1 2 3 15
++ [ $1 -gt 0 ] && kill -$1 $$
++}
++
++split_FQDN() {
++ # $1 FQDN to split
++ # $2 name of variable to store TLD
++ # $3 name of variable to store (reg)Domain
++ # $4 name of variable to store Host/Subdomain
++
++ [ $# -ne 4 ] && write_log 12 "Error calling 'split_FQDN()' - wrong number of parameters"
++ [ -z "$1" ] && write_log 12 "Error calling 'split_FQDN()' - missing FQDN to split"
++ [ -f $TLDFILE ] || write_log 12 "Error calling 'split_FQDN()' - missing file '$TLDFILE'"
++
++ local _HOST _FDOM _CTLD _FTLD
++ local _SET="$@" # save given function parameters
++
++ local _PAR=$(echo "$1" | tr [A-Z] [a-z] | tr "." " ") # to lower and replace DOT with SPACE
++ set -- $_PAR # set new as function parameters
++ _PAR="" # clear variable for later reuse
++ while [ -n "$1" ] ; do # as long we have parameters
++ _PAR="$1 $_PAR" # invert order of parameters
++ shift
++ done
++ set -- $_PAR # use new as function parameters
++ _PAR="" # clear variable
++
++ while [ -n "$1" ] ; do # as long we have parameters
++ if [ -z "$_CTLD" ]; then # first loop
++ _CTLD="$1" # CURRENT TLD to look at
++ shift
++ else
++ _CTLD="$1.$_CTLD" # Next TLD to look at
++ shift
++ fi
++ # check if TLD exact match in tld_names.dat, save TLD
++ zcat $TLDFILE | grep -E "^$_CTLD$" >/dev/null 2>&1 && {
++ _FTLD="$_CTLD" # save found
++ _FDOM="$1" # save domain next step might be invalid
++ continue
++ }
++ # check if match any "*" in tld_names.dat,
++ zcat $TLDFILE | grep -E "^\*.$_CTLD$" >/dev/null 2>&1 && {
++ [ -z "$1" ] && break # no more data break
++ # check if next level TLD match excludes "!" in tld_names.dat
++ if zcat $TLDFILE | grep -E "^!$1.$_CTLD$" >/dev/null 2>&1 ; then
++ _FTLD="$_CTLD" # Yes
++ else
++ _FTLD="$1.$_CTLD"
++ shift
++ fi
++ _FDOM="$1"; shift
++ }
++ [ -n "$_FTLD" ] && break # we have something valid, break
++ done
++
++ # the leftover parameters are the HOST/SUBDOMAIN
++ while [ -n "$1" ]; do
++ _HOST="$1 $HOST" # remember we need to invert
++ shift
++ done
++ _HOST=$(echo $_HOST | tr " " ".") # insert DOT
++
++ set -- $_SET # set back parameters from function call
++ [ -n "$_FTLD" ] && {
++ eval "$2=$_FTLD" # set TLD
++ eval "$3=$_FDOM" # set registrable domain
++ eval "$4=$_HOST" # set HOST/SUBDOMAIN
++ return 0
++ }
++ eval "$2=''" # clear TLD
++ eval "$3=''" # clear registrable domain
++ eval "$4=''" # clear HOST/SUBDOMAIN
++ return 1
++}
+diff --git a/feeds/packages/net/ddns-scripts/files/dynamic_dns_lucihelper.sh b/feeds/packages/net/ddns-scripts/files/dynamic_dns_lucihelper.sh
+new file mode 100755
+index 0000000..0f8bb5a
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/dynamic_dns_lucihelper.sh
+@@ -0,0 +1,102 @@
++#!/bin/sh
++# /usr/lib/ddns/luci_dns_helper.sh
++#
++#.Distributed under the terms of the GNU General Public License (GPL) version 2.0
++#
++# Written in August 2014 by
++#.Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++# This script is used by luci-app-ddns
++# - getting registered IP
++# - check if possible to get local IP
++# - verifing given DNS- or Proxy-Server
++#
++# variables in small chars are read from /etc/config/ddns as parameter given here
++# variables in big chars are defined inside these scripts as gloval vars
++# variables in big chars beginning with "__" are local defined inside functions only
++# set -vx #script debugger
++
++[ $# -lt 2 ] && exit 1
++
++. /usr/lib/ddns/dynamic_dns_functions.sh # global vars are also defined here
++
++# preset some variables, wrong or not set in dynamic_dns_functions.sh
++SECTION_ID="lucihelper"
++LOGFILE="$LOGDIR/$SECTION_ID.log"
++DATFILE="$RUNDIR/$SECTION_ID.$$.dat" # save stdout data of WGet and other extern programs called
++ERRFILE="$RUNDIR/$SECTION_ID.$$.err" # save stderr output of WGet and other extern programs called
++VERBOSE_MODE=0 # no console logging
++# global variables normally set by reading DDNS UCI configuration
++use_syslog=0 # no syslog
++use_logfile=0 # by default no logfile, can be changed here
++
++__RET=0
++case "$1" in
++ get_registered_ip)
++ local IP
++ domain=$2 # Hostname/Domain
++ use_ipv6=${3:-"0"} # Use IPv6 - default IPv4
++ force_ipversion=${4:-"0"} # Force IP Version - default 0 - No
++ force_dnstcp=${5:-"0"} # Force TCP on DNS - default 0 - No
++ dns_server=${6:-""} # DNS server - default No DNS
++ write_log 7 "-----> get_registered_ip IP"
++ get_registered_ip IP
++ __RET=$?
++ [ $__RET -ne 0 ] && IP=""
++ echo -n "$IP" # suppress LF
++ ;;
++ verify_dns)
++ # $2 : dns-server to verify # no need for force_dnstcp because
++ # verify with nc (netcat) uses tcp anyway
++ use_ipv6=${3:-"0"} # Use IPv6 - default IPv4
++ force_ipversion=${4:-"0"} # Force IP Version - default 0 - No
++ write_log 7 "-----> verify_dns '$2'"
++ verify_dns "$2"
++ __RET=$?
++ ;;
++ verify_proxy)
++ # $2 : proxy string to verify
++ use_ipv6=${3:-"0"} # Use IPv6 - default IPv4
++ force_ipversion=${4:-"0"} # Force IP Version - default 0 - No
++ write_log 7 "-----> verify_proxy '$2'"
++ verify_proxy "$2"
++ __RET=$?
++ ;;
++ get_local_ip)
++ local IP
++ use_ipv6="$2" # Use IPv6
++ ip_source="$3" # IP source
++ ip_network="$4" # set if source = "network" otherwise "-"
++ ip_url="$5" # set if source = "web" otherwise "-"
++ ip_interface="$6" # set if source = "interface" itherwiase "-"
++ ip_script="$7" # set if source = "script" otherwise "-"
++ proxy="$8" # proxy if set
++ force_ipversion="0" # not needed but must be set
++ use_https="0" # not needed but must be set
++ [ -n "$proxy" -a "$ip_source" = "web" ] && {
++ # proxy defined, used for ip_source=web
++ export HTTP_PROXY="http://$proxy"
++ export HTTPS_PROXY="http://$proxy"
++ export http_proxy="http://$proxy"
++ export https_proxy="http://$proxy"
++ }
++ # don't need IP only the return code
++ [ "$ip_source" = "web" -o "$ip_source" = "script" ] && {
++ # we wait only 3 seconds for an
++ # answer from "web" or "script"
++ write_log 7 "-----> timeout 3 -- get_local_ip IP"
++ timeout 3 -- get_local_ip IP
++ } || {
++ write_log 7 "-----> get_local_ip IP"
++ get_local_ip IP
++ }
++ __RET=$?
++ ;;
++ *)
++ __RET=255
++ ;;
++esac
++
++# remove out and err file
++[ -f $DATFILE ] && rm -f $DATFILE
++[ -f $ERRFILE ] && rm -f $ERRFILE
++return $__RET
+\ No newline at end of file
+diff --git a/feeds/packages/net/ddns-scripts/files/dynamic_dns_updater.sh b/feeds/packages/net/ddns-scripts/files/dynamic_dns_updater.sh
+new file mode 100644
+index 0000000..95d2c94
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/dynamic_dns_updater.sh
+@@ -0,0 +1,334 @@
++#!/bin/sh
++# /usr/lib/ddns/dynamic_dns_updater.sh
++#
++# Original written by Eric Paul Bishop, January 2008
++#.Distributed under the terms of the GNU General Public License (GPL) version 2.0
++# (Loosely) based on the script on the one posted by exobyte in the forums here:
++# http://forum.openwrt.org/viewtopic.php?id=14040
++#
++# extended and partial rewritten in August 2014 by
++#.Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++# to support:
++# - IPv6 DDNS services
++# - DNS Server to retrieve registered IP including TCP transport (Ticket 7820)
++# - Proxy Server to send out updates
++# - force_interval=0 to run once (Luci Ticket 538)
++# - the usage of BIND's host command instead of BusyBox's nslookup if installed
++# - extended Verbose Mode and log file support for better error detection
++# - wait for interface to fully come up, before the first update is done
++#
++# variables in small chars are read from /etc/config/ddns
++# variables in big chars are defined inside these scripts as global vars
++# variables in big chars beginning with "__" are local defined inside functions only
++# set -vx #script debugger
++
++[ $# -lt 1 -o -n "${2//[0-3]/}" -o ${#2} -gt 1 ] && {
++ echo -e "\n USAGE:"
++ echo -e " $0 [SECTION] [VERBOSE_MODE]\n"
++ echo " [SECTION] - service section as defined in /etc/config/ddns"
++ echo " [VERBOSE_MODE] - '0' NO output to console"
++ echo " '1' output to console"
++ echo " '2' output to console AND logfile"
++ echo " + run once WITHOUT retry on error"
++ echo " '3' output to console AND logfile"
++ echo " + run once WITHOUT retry on error"
++ echo -e " + NOT sending update to DDNS service\n"
++ exit 1
++}
++
++. /usr/lib/ddns/dynamic_dns_functions.sh # global vars are also defined here
++
++SECTION_ID="$1"
++VERBOSE_MODE=${2:-1} # default mode is log to console
++
++# set file names
++PIDFILE="$RUNDIR/$SECTION_ID.pid" # Process ID file
++UPDFILE="$RUNDIR/$SECTION_ID.update" # last update successful send (system uptime)
++DATFILE="$RUNDIR/$SECTION_ID.dat" # save stdout data of WGet and other extern programs called
++ERRFILE="$RUNDIR/$SECTION_ID.err" # save stderr output of WGet and other extern programs called
++LOGFILE="$LOGDIR/$SECTION_ID.log" # log file
++
++# VERBOSE_MODE > 1 delete logfile if exist to create an empty one
++# only with this data of this run for easier diagnostic
++# new one created by write_log function
++[ $VERBOSE_MODE -gt 1 -a -f $LOGFILE ] && rm -f $LOGFILE
++
++# TRAP handler
++trap "trap_handler 0 \$?" 0 # handle script exit with exit status
++trap "trap_handler 1" 1 # SIGHUP Hangup / reload config
++trap "trap_handler 2" 2 # SIGINT Terminal interrupt
++trap "trap_handler 3" 3 # SIGQUIT Terminal quit
++# trap "trap_handler 9" 9 # SIGKILL no chance to trap
++trap "trap_handler 15" 15 # SIGTERM Termination
++
++################################################################################
++# Leave this comment here, to clearly document variable names that are expected/possible
++# Use load_all_config_options to load config options, which is a much more flexible solution.
++#
++# config_load "ddns"
++# config_get <variable> $SECTION_ID <option>
++#
++# defined options (also used as variable):
++#
++# enable self-explanatory
++# interface network interface used by hotplug.d i.e. 'wan' or 'wan6'
++#
++# service_name Which DDNS service do you use or "custom"
++# update_url URL to use to update your "custom" DDNS service
++# update_script SCRIPT to use to update your "custom" DDNS service
++#
++# domain Your DNS name / replace [DOMAIN] in update_url
++# username Username of your DDNS service account / replace [USERNAME] in update_url
++# password Password of your DDNS service account / replace [PASSWORD] in update_url
++#
++# use_https use HTTPS to update DDNS service
++# cacert file or directory where HTTPS can find certificates to verify server; 'IGNORE' ignore check of server certificate
++#
++# use_syslog log activity to syslog
++#
++# ip_source source to detect current local IP ('network' or 'web' or 'script' or 'interface')
++# ip_network local defined network to read IP from i.e. 'wan' or 'wan6'
++# ip_url URL to read local address from i.e. http://checkip.dyndns.com/ or http://checkipv6.dyndns.com/
++# ip_script full path and name of your script to detect local IP
++# ip_interface physical interface to use for detecting
++#
++# check_interval check for changes every !!! checks below 10 minutes make no sense because the Internet
++# check_unit 'days' 'hours' 'minutes' !!! needs about 5-10 minutes to sync an IP-change for an DNS entry
++#
++# force_interval force to send an update to your service if no change was detected
++# force_unit 'days' 'hours' 'minutes' !!! force_interval="0" runs this script once for use i.e. with cron
++#
++# retry_interval if error was detected retry in
++# retry_unit 'days' 'hours' 'minutes' 'seconds'
++# retry_count number of retries before scripts stops
++#
++# use_ipv6 detecting/sending IPv6 address
++# force_ipversion force usage of IPv4 or IPv6 for the whole detection and update communication
++# dns_server using a non default dns server to get Registered IP from Internet
++# force_dnstcp force communication with DNS server via TCP instead of default UDP
++# proxy using a proxy for communication !!! ALSO used to detect local IP via web => return proxy's IP !!!
++# use_logfile self-explanatory "/var/log/ddns/$SECTION_ID.log"
++#
++# some functionality needs
++# - GNU Wget or cURL installed for sending updates to DDNS service
++# - BIND host installed to detect Registered IP
++#
++################################################################################
++
++load_all_config_options "ddns" "$SECTION_ID"
++ERR_LAST=$? # save return code - equal 0 if SECTION_ID found
++
++# set defaults if not defined
++[ -z "$enabled" ] && enabled=0
++[ -z "$retry_count" ] && retry_count=0 # endless retry
++[ -z "$use_syslog" ] && use_syslog=2 # syslog "Notice"
++[ -z "$use_https" ] && use_https=0 # not use https
++[ -z "$use_logfile" ] && use_logfile=1 # use logfile by default
++[ -z "$use_ipv6" ] && use_ipv6=0 # use IPv4 by default
++[ -z "$force_ipversion" ] && force_ipversion=0 # default let system decide
++[ -z "$force_dnstcp" ] && force_dnstcp=0 # default UDP
++[ -z "$ip_source" ] && ip_source="network"
++[ "$ip_source" = "network" -a -z "$ip_network" -a $use_ipv6 -eq 0 ] && ip_network="wan" # IPv4: default wan
++[ "$ip_source" = "network" -a -z "$ip_network" -a $use_ipv6 -eq 1 ] && ip_network="wan6" # IPv6: default wan6
++[ "$ip_source" = "web" -a -z "$ip_url" -a $use_ipv6 -eq 0 ] && ip_url="http://checkip.dyndns.com"
++[ "$ip_source" = "web" -a -z "$ip_url" -a $use_ipv6 -eq 1 ] && ip_url="http://checkipv6.dyndns.com"
++[ "$ip_source" = "interface" -a -z "$ip_interface" ] && ip_interface="eth1"
++
++# SECTION_ID does not exists
++[ $ERR_LAST -ne 0 ] && {
++ [ $VERBOSE_MODE -le 1 ] && VERBOSE_MODE=2 # force console out and logfile output
++ [ -f $LOGFILE ] && rm -f $LOGFILE # clear logfile before first entry
++ write_log 7 "************ ************** ************** **************"
++ write_log 5 "PID '$$' started at $(eval $DATE_PROG)"
++ write_log 7 "uci configuration:\n$(uci -q show ddns | grep '=service' | sort)"
++ write_log 14 "Service section '$SECTION_ID' not defined"
++}
++
++write_log 7 "************ ************** ************** **************"
++write_log 5 "PID '$$' started at $(eval $DATE_PROG)"
++write_log 7 "uci configuration:\n$(uci -q show ddns.$SECTION_ID | sort)"
++write_log 7 "ddns version : $(opkg list-installed ddns-scripts | cut -d ' ' -f 3)"
++case $VERBOSE_MODE in
++ 0) write_log 7 "verbose mode : 0 - run normal, NO console output";;
++ 1) write_log 7 "verbose mode : 1 - run normal, console mode";;
++ 2) write_log 7 "verbose mode : 2 - run once, NO retry on error";;
++ 3) write_log 7 "verbose mode : 3 - run once, NO retry on error, NOT sending update";;
++ *) write_log 14 "error detecting VERBOSE_MODE '$VERBOSE_MODE'";;
++esac
++
++# check enabled state otherwise we don't need to continue
++[ $enabled -eq 0 ] && write_log 14 "Service section disabled!"
++
++# determine what update url we're using if a service_name is supplied
++# otherwise update_url is set inside configuration (custom update url)
++# or update_script is set inside configuration (custom update script)
++[ -n "$service_name" ] && get_service_data update_url update_script
++[ -z "$update_url" -a -z "$update_script" ] && write_log 14 "No update_url found/defined or no update_script found/defined!"
++[ -n "$update_script" -a ! -f "$update_script" ] && write_log 14 "Custom update_script not found!"
++
++# without domain and possibly username and password we can do nothing for you
++[ -z "$domain" ] && write_log 14 "Service section not configured correctly! Missing 'domain'"
++[ -n "$update_url" ] && {
++ # only check if update_url is given, update_scripts have to check themselves
++ [ -z "$username" ] && $(echo "$update_url" | grep "\[USERNAME\]" >/dev/null 2>&1) && \
++ write_log 14 "Service section not configured correctly! Missing 'username'"
++ [ -z "$password" ] && $(echo "$update_url" | grep "\[PASSWORD\]" >/dev/null 2>&1) && \
++ write_log 14 "Service section not configured correctly! Missing 'password'"
++}
++
++# url encode username (might be email or something like this)
++# and password (might have special chars for security reason)
++[ -n "$username" ] && urlencode URL_USER "$username"
++[ -n "$password" ] && urlencode URL_PASS "$password"
++
++# verify ip_source 'script' if script is configured and executable
++if [ "$ip_source" = "script" ]; then
++ set -- $ip_script #handling script with parameters, we need a trick
++ [ -z "$1" ] && write_log 14 "No script defined to detect local IP!"
++ [ -x "$1" ] || write_log 14 "Script to detect local IP not executable!"
++fi
++
++# compute update interval in seconds
++get_seconds CHECK_SECONDS ${check_interval:-10} ${check_unit:-"minutes"} # default 10 min
++get_seconds FORCE_SECONDS ${force_interval:-72} ${force_unit:-"hours"} # default 3 days
++get_seconds RETRY_SECONDS ${retry_interval:-60} ${retry_unit:-"seconds"} # default 60 sec
++[ $CHECK_SECONDS -lt 300 ] && CHECK_SECONDS=300 # minimum 5 minutes
++[ $FORCE_SECONDS -gt 0 -a $FORCE_SECONDS -lt $CHECK_SECONDS ] && FORCE_SECONDS=$CHECK_SECONDS # FORCE_SECONDS >= CHECK_SECONDS or 0
++write_log 7 "check interval: $CHECK_SECONDS seconds"
++write_log 7 "force interval: $FORCE_SECONDS seconds"
++write_log 7 "retry interval: $RETRY_SECONDS seconds"
++write_log 7 "retry counter : $retry_count times"
++
++# kill old process if it exists & set new pid file
++stop_section_processes "$SECTION_ID"
++[ $? -gt 0 ] && write_log 7 "'SIGTERM' was send to old process" || write_log 7 "No old process"
++echo $$ > $PIDFILE
++
++# determine when the last update was
++# the following lines should prevent multiple updates if hotplug fires multiple startups
++# as described in Ticket #7820, but did not function if never an update take place
++# i.e. after a reboot (/var is linked to /tmp)
++# using uptime as reference because date might not be updated via NTP client
++get_uptime CURR_TIME
++[ -e "$UPDFILE" ] && {
++ LAST_TIME=$(cat $UPDFILE)
++ # check also LAST > CURR because link of /var/run to /tmp might be removed
++ # i.e. boxes with larger filesystems
++ [ -z "$LAST_TIME" ] && LAST_TIME=0
++ [ $LAST_TIME -gt $CURR_TIME ] && LAST_TIME=0
++}
++if [ $LAST_TIME -eq 0 ]; then
++ write_log 7 "last update: never"
++else
++ EPOCH_TIME=$(( $(date +%s) - CURR_TIME + LAST_TIME ))
++ EPOCH_TIME="date -d @$EPOCH_TIME +'$DATE_FORMAT'"
++ write_log 7 "last update: $(eval $EPOCH_TIME)"
++fi
++
++# verify DNS server
++[ -n "$dns_server" ] && verify_dns "$dns_server"
++
++# verify Proxy server and set environment
++[ -n "$proxy" ] && {
++ verify_proxy "$proxy" && {
++ # everything ok set proxy
++ export HTTP_PROXY="http://$proxy"
++ export HTTPS_PROXY="http://$proxy"
++ export http_proxy="http://$proxy"
++ export https_proxy="http://$proxy"
++ }
++}
++
++# let's check if there is already an IP registered on the web
++get_registered_ip REGISTERED_IP "NO_RETRY"
++ERR_LAST=$?
++# No error or No IP set otherwise retry
++[ $ERR_LAST -eq 0 -o $ERR_LAST -eq 127 ] || get_registered_ip REGISTERED_IP
++
++# loop endlessly, checking ip every check_interval and forcing an updating once every force_interval
++write_log 6 "Starting main loop at $(eval $DATE_PROG)"
++while : ; do
++
++ get_local_ip LOCAL_IP # read local IP
++
++ # prepare update
++ # never updated or forced immediate then NEXT_TIME = 0
++ [ $FORCE_SECONDS -eq 0 -o $LAST_TIME -eq 0 ] \
++ && NEXT_TIME=0 \
++ || NEXT_TIME=$(( $LAST_TIME + $FORCE_SECONDS ))
++
++ get_uptime CURR_TIME # get current uptime
++
++ # send update when current time > next time or local ip different from registered ip
++ if [ $CURR_TIME -ge $NEXT_TIME -o "$LOCAL_IP" != "$REGISTERED_IP" ]; then
++ if [ $VERBOSE_MODE -gt 2 ]; then
++ write_log 7 "Verbose Mode: $VERBOSE_MODE - NO UPDATE send"
++ elif [ "$LOCAL_IP" != "$REGISTERED_IP" ]; then
++ write_log 7 "Update needed - L: '$LOCAL_IP' <> R: '$REGISTERED_IP'"
++ else
++ write_log 7 "Forced Update - L: '$LOCAL_IP' == R: '$REGISTERED_IP'"
++ fi
++
++ ERR_LAST=0
++ [ $VERBOSE_MODE -lt 3 ] && {
++ # only send if VERBOSE_MODE < 3
++ send_update "$LOCAL_IP"
++ ERR_LAST=$? # save return value
++ }
++
++ # error sending local IP to provider
++ # we have no communication error (handled inside send_update/do_transfer)
++ # but update was not recognized
++ # do NOT retry after RETRY_SECONDS, do retry after CHECK_SECONDS
++ # to early retrys will block most DDNS provider
++ # providers answer is checked inside send_update() function
++ if [ $ERR_LAST -eq 0 ]; then
++ get_uptime LAST_TIME # we send update, so
++ echo $LAST_TIME > $UPDFILE # save LASTTIME to file
++ [ "$LOCAL_IP" != "$REGISTERED_IP" ] \
++ && write_log 6 "Update successful - IP '$LOCAL_IP' send" \
++ || write_log 6 "Forced update successful - IP: '$LOCAL_IP' send"
++ else
++ write_log 3 "Can not update IP at DDNS Provider"
++ fi
++ fi
++
++ # now we wait for check interval before testing if update was recognized
++ # only sleep if VERBOSE_MODE <= 2 because otherwise nothing was send
++ [ $VERBOSE_MODE -le 2 ] && {
++ write_log 7 "Waiting $CHECK_SECONDS seconds (Check Interval)"
++ sleep $CHECK_SECONDS &
++ PID_SLEEP=$!
++ wait $PID_SLEEP # enable trap-handler
++ PID_SLEEP=0
++ } || write_log 7 "Verbose Mode: $VERBOSE_MODE - NO Check Interval waiting"
++
++ REGISTERED_IP="" # clear variable
++ get_registered_ip REGISTERED_IP # get registered/public IP
++
++ # IP's are still different
++ if [ "$LOCAL_IP" != "$REGISTERED_IP" ]; then
++ if [ $VERBOSE_MODE -le 1 ]; then # VERBOSE_MODE <=1 then retry
++ ERR_UPDATE=$(( $ERR_UPDATE + 1 ))
++ [ $retry_count -gt 0 -a $ERR_UPDATE -gt $retry_count ] && \
++ write_log 14 "Updating IP at DDNS provider failed after $retry_count retries"
++ write_log 4 "Updating IP at DDNS provider failed - starting retry $ERR_UPDATE/$retry_count"
++ continue # loop to beginning
++ else
++ write_log 4 "Updating IP at DDNS provider failed"
++ write_log 7 "Verbose Mode: $VERBOSE_MODE - NO retry"; exit 1
++ fi
++ else
++ # we checked successful the last update
++ ERR_UPDATE=0 # reset error counter
++ fi
++
++ # force_update=0 or VERBOSE_MODE > 1 - leave here
++ [ $VERBOSE_MODE -gt 1 ] && write_log 7 "Verbose Mode: $VERBOSE_MODE - NO reloop"
++ [ $FORCE_SECONDS -eq 0 ] && write_log 6 "Configured to run once"
++ [ $VERBOSE_MODE -gt 1 -o $FORCE_SECONDS -eq 0 ] && exit 0
++
++ write_log 6 "Rerun IP check at $(eval $DATE_PROG)"
++done
++# we should never come here there must be a programming error
++write_log 12 "Error in 'dynamic_dns_updater.sh - program coding error"
+diff --git a/feeds/packages/net/ddns-scripts/files/services b/feeds/packages/net/ddns-scripts/files/services
+new file mode 100644
+index 0000000..4d81a24
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/services
+@@ -0,0 +1,96 @@
++# 44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
++#
++# This file contains the update urls for various dynamic dns services.
++# Column one contains the service name, column two contains the update url.
++# within the update url there are 4 variables you can use: [USERNAME],
++# [PASSWORD], [DOMAIN] and [IP]. These are substituted for the username,
++# password, and domain name specified in the /etc/config/ddns file when an
++# update is performed. The IP is substituted for the current ip address of the
++# router. These variables are case sensitive, while urls generally are not, so
++# if you need to enter the same text in the url (which seems very unlikely) put
++# that text in lowercase, while the variables should remain in uppercase
++#
++# There are TONS of dynamic dns services out there. There's a huge list of them at:
++# http://www.dmoz.org/Computers/Software/Internet/Servers/Address_Management/Dynamic_DNS_Services/
++# If anyone has time they could update this file to be compatible with a bunch of them
++#
++# !!! Since ddns-scripts Version 2.x the update of IPv6 addresses is also supported
++# !!! This file is used for update of IPv4 adresses only. For IPv6 use services_ipv6
++#
++# !!! Since ddns-scripts Version 2.x the update via provider specific update scripts is supported.
++# !!! This scripts must be located at /usr/lib/ddns directory if defined inside this file.
++# !!! Use only the script name (without path). Sample:
++# !!! "example.com" "update_sample.sh"
++#
++# 44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
++
++"dyndns.org" "http://[USERNAME]:[PASSWORD]@members.dyndns.org/nic/update?hostname=[DOMAIN]&myip=[IP]"
++"changeip.com" "http://[USERNAME]:[PASSWORD]@nic.changeip.com/nic/update?u=[USERNAME]&p=[PASSWORD]&cmd=update&hostname=[DOMAIN]&ip=[IP]"
++"zoneedit.com" "http://[USERNAME]:[PASSWORD]@dynamic.zoneedit.com/auth/dynamic.html?host=[DOMAIN]&dnsto=[IP]"
++"free.editdns.net" "http://dyndns-free.editdns.net/api/dynLinux.php?p=[PASSWORD]&r=[DOMAIN]"
++
++# freedns.afraid.org is weird, you just need an update code, for which we use the password variable
++"freedns.afraid.org" "http://freedns.afraid.org/dynamic/update.php?[PASSWORD]&address=[IP]"
++
++# DNS Max and resellers' update urls
++"dnsmax.com" "http://update.dnsmax.com/update/?username=[USERNAME]&password=[PASSWORD]&resellerid=1&clientname=openwrt&clientversion=8.09&protocolversion=2.0&updatehostname=[DOMAIN]&ip=[IP]"
++"thatip.com" "http://update.dnsmax.com/update/?username=[USERNAME]&password=[PASSWORD]&resellerid=2&clientname=openwrt&clientversion=8.09&protocolversion=2.0&updatehostname=[DOMAIN]&ip=[IP]"
++
++# Hurricane Electric Dynamic DNS
++"he.net" "http://[DOMAIN]:[PASSWORD]@dyn.dns.he.net/nic/update?hostname=[DOMAIN]&myip=[IP]"
++
++# DNSdynamic.org
++"dnsdynamic.org" "http://[USERNAME]:[PASSWORD]@www.dnsdynamic.org/api/?hostname=[DOMAIN]&myip=[IP]"
++
++# dnsExit.com free dynamic DNS update url
++"dnsexit.com" "http://www.dnsexit.com/RemoteUpdate.sv?login=[USERNAME]&password=[PASSWORD]&host=[DOMAIN]&myip=[IP]"
++
++# OVH
++"ovh.com" "http://[USERNAME]:[PASSWORD]@www.ovh.com/nic/update?system=dyndns&hostname=[DOMAIN]&myip=[IP]"
++
++# dns-o-matic is a free service by opendns.com for updating multiple hosts and
++# dynamic dns services in one api call. To update all your configured services
++# at once, use "all.dnsomatic.com as the hostname.
++"dnsomatic.com" "http://[USERNAME]:[PASSWORD]@updates.dnsomatic.com/nic/update?hostname=[DOMAIN]&myip=[IP]"
++
++# 3322.org
++"3322.org" "http://[USERNAME]:[PASSWORD]@members.3322.org/dyndns/update?system=dyndns&hostname=[DOMAIN]&myip=[IP]"
++
++# namecheap.com
++"namecheap.com" "http://dynamicdns.park-your-domain.com/update?host=[USERNAME]&domain=[DOMAIN]&password=[PASSWORD]&ip=[IP]"
++
++# easydns.com dynamic DNS
++"easydns.com" "http://[USERNAME]:[PASSWORD]@api.cp.easydns.com/dyn/tomato.php?hostname=[DOMAIN]&myip=[IP]"
++
++# Winco DDNS
++"ddns.com.br" "http://[DOMAIN]:[PASSWORD]@members.ddns.com.br/nic/update?hostname=[DOMAIN]&myip=[IP]"
++
++# Mythic Beasts (https://www.mythic-beasts.com) Dynamic DNS
++"mythic-beasts.com" "http://dnsapi4.mythic-beasts.com/?domain=[USERNAME]&password=[PASSWORD]&command=REPLACE%20[DOMAIN]%2060%20A%20DYNAMIC_IP"
++
++# Securepoint Dynamic-DNS-Service (http://www.spdns.de)
++"spdns.de" "http://[USERNAME]:[PASSWORD]@update.spdns.de/nic/update?hostname=[DOMAIN]&myip=[IP]"
++
++# duiadns.net - free dynamic DNS
++"duiadns.net" "http://ipv4.duia.ro/dynamic.duia?host=[DOMAIN]&password=[PASSWORD]&ip4=[IP]"
++
++# Two-DNS - Simply. Connected. Everywhere.
++"twodns.de" "http://[USERNAME]:[PASSWORD]@update.twodns.de/update?hostname=[DOMAIN]&ip=[IP]"
++
++# MyDNS.JP
++"mydns.jp" "http://www.mydns.jp/directip.html?MID=[USERNAME]&PWD=[PASSWORD]&IPV4ADDR=[IP]"
++
++# LoopiaDNS
++"loopia.se" "http://[USERNAME]:[PASSWORD]@dns.loopia.se/XDynDNSServer/XDynDNS.php?system=custom&hostname=[DOMAIN]&myip=[IP]"
++
++# SelfHost.de
++"selfhost.de" "http://carol.selfhost.de/update?username=[USERNAME]&password=[PASSWORD]&myip=[IP]&hostname=1"
++
++# no-ip.pl nothing to do with no-ip.com (domain registered to www.domeny.tv) (IP autodetected by provider)
++"no-ip.pl" "http://[USERNAME]:[PASSWORD]@update.no-ip.pl/?hostname=[DOMAIN]"
++
++# domains.google.com non free service - require HTTPS communication
++"domains.google.com" "https://[USERNAME]:[PASSWORD]@domains.google.com/nic/update?hostname=[DOMAIN]&myip=[IP]"
++
++# Schokokeks Hosting, schokokeks.org
++"schokokeks.org" "http://[USERNAME]:[PASSWORD]@dyndns.schokokeks.org/nic/update?myip=[IP]"
+diff --git a/feeds/packages/net/ddns-scripts/files/services_ipv6 b/feeds/packages/net/ddns-scripts/files/services_ipv6
+new file mode 100644
+index 0000000..a0781a2
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/services_ipv6
+@@ -0,0 +1,43 @@
++# 66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
++#
++# This file contains the update urls for various dynamic dns services.
++# Column one contains the service name, column two contains the update url.
++# within the update url there are 4 variables you can use: [USERNAME],
++# [PASSWORD], [DOMAIN] and [IP]. These are substituted for the username,
++# password, and domain name specified in the /etc/config/ddns file when an
++# update is performed. The IP is substituted for the current ip address of the
++# router. These variables are case sensitive, while urls generally are not, so
++# if you need to enter the same text in the url (which seems very unlikely) put
++# that text in lowercase, while the variables should remain in uppercase
++#
++# There are TONS of dynamic dns services out there. There's a huge list of them at:
++# http://www.dmoz.org/Computers/Software/Internet/Servers/Address_Management/Dynamic_DNS_Services/
++# If anyone has time they could update this file to be compatible with a bunch of them
++#
++# !!! Since ddns-scripts Version 2.x the update of IPv6 addresses is also supported
++# !!! This file is used for update of IPv6 adresses only. For IPv4 use services
++#
++# !!! Since ddns-scripts Version 2.x the update via provider specific update scripts is supported.
++# !!! This scripts must be located at /usr/lib/ddns directory if defined inside this file.
++# !!! Use only the script name (without path). Sample:
++# !!! "example.com" "update_sample.sh"
++#
++# 66666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
++
++# IPv6 @ Securepoint Dynamic-DNS-Service
++"spdns.de" "http://[USERNAME]:[PASSWORD]@update.spdns.de/nic/update?hostname=[DOMAIN]&myip=[IP]"
++
++# IPv6 @ Hurricane Electric Dynamic DNS
++"he.net" "http://[DOMAIN]:[PASSWORD]@dyn.dns.he.net/nic/update?hostname=[DOMAIN]&myip=[IP]"
++
++# IPv6 @ MyDNS.JP
++"mydns.jp" "http://www.mydns.jp/directip.html?MID=[USERNAME]&PWD=[PASSWORD]&IPV6ADDR=[IP]"
++
++# IPv6 @ no-ip.pl nothing to do with no-ip.com (domain registered to www.domeny.tv) (IP autodetected by provider)
++"no-ip.pl" "http://[USERNAME]:[PASSWORD]@update.no-ip.pl/?hostname=[DOMAIN]"
++
++# IPv6 @ freedns.afraid.org
++"freedns.afraid.org" "http://freedns.afraid.org/dynamic/update.php?[PASSWORD]&address=[IP]"
++
++# IPv6 @ LoopiaDNS
++"loopia.se" "http://[USERNAME]:[PASSWORD]@dns.loopia.se/XDynDNSServer/XDynDNS.php?system=custom&hostname=[DOMAIN]&myip=[IP]"
+diff --git a/feeds/packages/net/ddns-scripts/files/tld_names.dat b/feeds/packages/net/ddns-scripts/files/tld_names.dat
+new file mode 100644
+index 0000000..1d848b4
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/tld_names.dat
+@@ -0,0 +1,10702 @@
++// This Source Code Form is subject to the terms of the Mozilla Public
++// License, v. 2.0. If a copy of the MPL was not distributed with this
++// file, You can obtain one at http://mozilla.org/MPL/2.0/.
++
++// ===BEGIN ICANN DOMAINS===
++
++// ac : http://en.wikipedia.org/wiki/.ac
++ac
++com.ac
++edu.ac
++gov.ac
++net.ac
++mil.ac
++org.ac
++
++// ad : http://en.wikipedia.org/wiki/.ad
++ad
++nom.ad
++
++// ae : http://en.wikipedia.org/wiki/.ae
++// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php
++ae
++co.ae
++net.ae
++org.ae
++sch.ae
++ac.ae
++gov.ae
++mil.ae
++
++// aero : see http://www.information.aero/index.php?id=66
++aero
++accident-investigation.aero
++accident-prevention.aero
++aerobatic.aero
++aeroclub.aero
++aerodrome.aero
++agents.aero
++aircraft.aero
++airline.aero
++airport.aero
++air-surveillance.aero
++airtraffic.aero
++air-traffic-control.aero
++ambulance.aero
++amusement.aero
++association.aero
++author.aero
++ballooning.aero
++broker.aero
++caa.aero
++cargo.aero
++catering.aero
++certification.aero
++championship.aero
++charter.aero
++civilaviation.aero
++club.aero
++conference.aero
++consultant.aero
++consulting.aero
++control.aero
++council.aero
++crew.aero
++design.aero
++dgca.aero
++educator.aero
++emergency.aero
++engine.aero
++engineer.aero
++entertainment.aero
++equipment.aero
++exchange.aero
++express.aero
++federation.aero
++flight.aero
++freight.aero
++fuel.aero
++gliding.aero
++government.aero
++groundhandling.aero
++group.aero
++hanggliding.aero
++homebuilt.aero
++insurance.aero
++journal.aero
++journalist.aero
++leasing.aero
++logistics.aero
++magazine.aero
++maintenance.aero
++marketplace.aero
++media.aero
++microlight.aero
++modelling.aero
++navigation.aero
++parachuting.aero
++paragliding.aero
++passenger-association.aero
++pilot.aero
++press.aero
++production.aero
++recreation.aero
++repbody.aero
++res.aero
++research.aero
++rotorcraft.aero
++safety.aero
++scientist.aero
++services.aero
++show.aero
++skydiving.aero
++software.aero
++student.aero
++taxi.aero
++trader.aero
++trading.aero
++trainer.aero
++union.aero
++workinggroup.aero
++works.aero
++
++// af : http://www.nic.af/help.jsp
++af
++gov.af
++com.af
++org.af
++net.af
++edu.af
++
++// ag : http://www.nic.ag/prices.htm
++ag
++com.ag
++org.ag
++net.ag
++co.ag
++nom.ag
++
++// ai : http://nic.com.ai/
++ai
++off.ai
++com.ai
++net.ai
++org.ai
++
++// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31
++al
++com.al
++edu.al
++gov.al
++mil.al
++net.al
++org.al
++
++// am : http://en.wikipedia.org/wiki/.am
++am
++
++// an : http://www.una.an/an_domreg/default.asp
++an
++com.an
++net.an
++org.an
++edu.an
++
++// ao : http://en.wikipedia.org/wiki/.ao
++// http://www.dns.ao/REGISTR.DOC
++ao
++ed.ao
++gv.ao
++og.ao
++co.ao
++pb.ao
++it.ao
++
++// aq : http://en.wikipedia.org/wiki/.aq
++aq
++
++// ar : https://nic.ar/normativa-vigente.xhtml
++ar
++com.ar
++edu.ar
++gob.ar
++gov.ar
++int.ar
++mil.ar
++net.ar
++org.ar
++tur.ar
++
++// arpa : http://en.wikipedia.org/wiki/.arpa
++// Confirmed by registry <iana-questions@icann.org> 2008-06-18
++arpa
++e164.arpa
++in-addr.arpa
++ip6.arpa
++iris.arpa
++uri.arpa
++urn.arpa
++
++// as : http://en.wikipedia.org/wiki/.as
++as
++gov.as
++
++// asia : http://en.wikipedia.org/wiki/.asia
++asia
++
++// at : http://en.wikipedia.org/wiki/.at
++// Confirmed by registry <it@nic.at> 2008-06-17
++at
++ac.at
++co.at
++gv.at
++or.at
++
++// au : http://en.wikipedia.org/wiki/.au
++// http://www.auda.org.au/
++au
++// 2LDs
++com.au
++net.au
++org.au
++edu.au
++gov.au
++asn.au
++id.au
++// Historic 2LDs (closed to new registration, but sites still exist)
++info.au
++conf.au
++oz.au
++// CGDNs - http://www.cgdn.org.au/
++act.au
++nsw.au
++nt.au
++qld.au
++sa.au
++tas.au
++vic.au
++wa.au
++// 3LDs
++act.edu.au
++nsw.edu.au
++nt.edu.au
++qld.edu.au
++sa.edu.au
++tas.edu.au
++vic.edu.au
++wa.edu.au
++// act.gov.au Bug 984824 - Removed at request of Greg Tankard
++// nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au>
++// nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au>
++qld.gov.au
++sa.gov.au
++tas.gov.au
++vic.gov.au
++wa.gov.au
++
++// aw : http://en.wikipedia.org/wiki/.aw
++aw
++com.aw
++
++// ax : http://en.wikipedia.org/wiki/.ax
++ax
++
++// az : http://en.wikipedia.org/wiki/.az
++az
++com.az
++net.az
++int.az
++gov.az
++org.az
++edu.az
++info.az
++pp.az
++mil.az
++name.az
++pro.az
++biz.az
++
++// ba : http://en.wikipedia.org/wiki/.ba
++ba
++org.ba
++net.ba
++edu.ba
++gov.ba
++mil.ba
++unsa.ba
++unbi.ba
++co.ba
++com.ba
++rs.ba
++
++// bb : http://en.wikipedia.org/wiki/.bb
++bb
++biz.bb
++co.bb
++com.bb
++edu.bb
++gov.bb
++info.bb
++net.bb
++org.bb
++store.bb
++tv.bb
++
++// bd : http://en.wikipedia.org/wiki/.bd
++*.bd
++
++// be : http://en.wikipedia.org/wiki/.be
++// Confirmed by registry <tech@dns.be> 2008-06-08
++be
++ac.be
++
++// bf : http://en.wikipedia.org/wiki/.bf
++bf
++gov.bf
++
++// bg : http://en.wikipedia.org/wiki/.bg
++// https://www.register.bg/user/static/rules/en/index.html
++bg
++a.bg
++b.bg
++c.bg
++d.bg
++e.bg
++f.bg
++g.bg
++h.bg
++i.bg
++j.bg
++k.bg
++l.bg
++m.bg
++n.bg
++o.bg
++p.bg
++q.bg
++r.bg
++s.bg
++t.bg
++u.bg
++v.bg
++w.bg
++x.bg
++y.bg
++z.bg
++0.bg
++1.bg
++2.bg
++3.bg
++4.bg
++5.bg
++6.bg
++7.bg
++8.bg
++9.bg
++
++// bh : http://en.wikipedia.org/wiki/.bh
++bh
++com.bh
++edu.bh
++net.bh
++org.bh
++gov.bh
++
++// bi : http://en.wikipedia.org/wiki/.bi
++// http://whois.nic.bi/
++bi
++co.bi
++com.bi
++edu.bi
++or.bi
++org.bi
++
++// biz : http://en.wikipedia.org/wiki/.biz
++biz
++
++// bj : http://en.wikipedia.org/wiki/.bj
++bj
++asso.bj
++barreau.bj
++gouv.bj
++
++// bm : http://www.bermudanic.bm/dnr-text.txt
++bm
++com.bm
++edu.bm
++gov.bm
++net.bm
++org.bm
++
++// bn : http://en.wikipedia.org/wiki/.bn
++*.bn
++
++// bo : http://www.nic.bo/
++bo
++com.bo
++edu.bo
++gov.bo
++gob.bo
++int.bo
++org.bo
++net.bo
++mil.bo
++tv.bo
++
++// br : http://registro.br/dominio/categoria.html
++// Submitted by registry <fneves@registro.br> 2014-08-11
++br
++adm.br
++adv.br
++agr.br
++am.br
++arq.br
++art.br
++ato.br
++b.br
++bio.br
++blog.br
++bmd.br
++cim.br
++cng.br
++cnt.br
++com.br
++coop.br
++ecn.br
++eco.br
++edu.br
++emp.br
++eng.br
++esp.br
++etc.br
++eti.br
++far.br
++flog.br
++fm.br
++fnd.br
++fot.br
++fst.br
++g12.br
++ggf.br
++gov.br
++imb.br
++ind.br
++inf.br
++jor.br
++jus.br
++leg.br
++lel.br
++mat.br
++med.br
++mil.br
++mp.br
++mus.br
++net.br
++*.nom.br
++not.br
++ntr.br
++odo.br
++org.br
++ppg.br
++pro.br
++psc.br
++psi.br
++qsl.br
++radio.br
++rec.br
++slg.br
++srv.br
++taxi.br
++teo.br
++tmp.br
++trd.br
++tur.br
++tv.br
++vet.br
++vlog.br
++wiki.br
++zlg.br
++
++// bs : http://www.nic.bs/rules.html
++bs
++com.bs
++net.bs
++org.bs
++edu.bs
++gov.bs
++
++// bt : http://en.wikipedia.org/wiki/.bt
++bt
++com.bt
++edu.bt
++gov.bt
++net.bt
++org.bt
++
++// bv : No registrations at this time.
++// Submitted by registry <jarle@uninett.no> 2006-06-16
++bv
++
++// bw : http://en.wikipedia.org/wiki/.bw
++// http://www.gobin.info/domainname/bw.doc
++// list of other 2nd level tlds ?
++bw
++co.bw
++org.bw
++
++// by : http://en.wikipedia.org/wiki/.by
++// http://tld.by/rules_2006_en.html
++// list of other 2nd level tlds ?
++by
++gov.by
++mil.by
++// Official information does not indicate that com.by is a reserved
++// second-level domain, but it's being used as one (see www.google.com.by and
++// www.yahoo.com.by, for example), so we list it here for safety's sake.
++com.by
++
++// http://hoster.by/
++of.by
++
++// bz : http://en.wikipedia.org/wiki/.bz
++// http://www.belizenic.bz/
++bz
++com.bz
++net.bz
++org.bz
++edu.bz
++gov.bz
++
++// ca : http://en.wikipedia.org/wiki/.ca
++ca
++// ca geographical names
++ab.ca
++bc.ca
++mb.ca
++nb.ca
++nf.ca
++nl.ca
++ns.ca
++nt.ca
++nu.ca
++on.ca
++pe.ca
++qc.ca
++sk.ca
++yk.ca
++// gc.ca: http://en.wikipedia.org/wiki/.gc.ca
++// see also: http://registry.gc.ca/en/SubdomainFAQ
++gc.ca
++
++// cat : http://en.wikipedia.org/wiki/.cat
++cat
++
++// cc : http://en.wikipedia.org/wiki/.cc
++cc
++
++// cd : http://en.wikipedia.org/wiki/.cd
++// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1
++cd
++gov.cd
++
++// cf : http://en.wikipedia.org/wiki/.cf
++cf
++
++// cg : http://en.wikipedia.org/wiki/.cg
++cg
++
++// ch : http://en.wikipedia.org/wiki/.ch
++ch
++
++// ci : http://en.wikipedia.org/wiki/.ci
++// http://www.nic.ci/index.php?page=charte
++ci
++org.ci
++or.ci
++com.ci
++co.ci
++edu.ci
++ed.ci
++ac.ci
++net.ci
++go.ci
++asso.ci
++aéroport.ci
++xn--aroport-bya.ci
++int.ci
++presse.ci
++md.ci
++gouv.ci
++
++// ck : http://en.wikipedia.org/wiki/.ck
++*.ck
++!www.ck
++
++// cl : http://en.wikipedia.org/wiki/.cl
++cl
++gov.cl
++gob.cl
++co.cl
++mil.cl
++
++// cm : http://en.wikipedia.org/wiki/.cm plus bug 981927
++cm
++co.cm
++com.cm
++gov.cm
++net.cm
++
++// cn : http://en.wikipedia.org/wiki/.cn
++// Submitted by registry <tanyaling@cnnic.cn> 2008-06-11
++cn
++ac.cn
++com.cn
++edu.cn
++gov.cn
++net.cn
++org.cn
++mil.cn
++å…¬å¸.cn
++xn--55qx5d.cn
++网络.cn
++xn--io0a7i.cn
++網絡.cn
++xn--od0alg.cn
++// cn geographic names
++ah.cn
++bj.cn
++cq.cn
++fj.cn
++gd.cn
++gs.cn
++gz.cn
++gx.cn
++ha.cn
++hb.cn
++he.cn
++hi.cn
++hl.cn
++hn.cn
++jl.cn
++js.cn
++jx.cn
++ln.cn
++nm.cn
++nx.cn
++qh.cn
++sc.cn
++sd.cn
++sh.cn
++sn.cn
++sx.cn
++tj.cn
++xj.cn
++xz.cn
++yn.cn
++zj.cn
++hk.cn
++mo.cn
++tw.cn
++
++// co : http://en.wikipedia.org/wiki/.co
++// Submitted by registry <tecnico@uniandes.edu.co> 2008-06-11
++co
++arts.co
++com.co
++edu.co
++firm.co
++gov.co
++info.co
++int.co
++mil.co
++net.co
++nom.co
++org.co
++rec.co
++web.co
++
++// com : http://en.wikipedia.org/wiki/.com
++com
++
++// coop : http://en.wikipedia.org/wiki/.coop
++coop
++
++// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do
++cr
++ac.cr
++co.cr
++ed.cr
++fi.cr
++go.cr
++or.cr
++sa.cr
++
++// cu : http://en.wikipedia.org/wiki/.cu
++cu
++com.cu
++edu.cu
++org.cu
++net.cu
++gov.cu
++inf.cu
++
++// cv : http://en.wikipedia.org/wiki/.cv
++cv
++
++// cw : http://www.una.cw/cw_registry/
++// Confirmed by registry <registry@una.net> 2013-03-26
++cw
++com.cw
++edu.cw
++net.cw
++org.cw
++
++// cx : http://en.wikipedia.org/wiki/.cx
++// list of other 2nd level tlds ?
++cx
++gov.cx
++
++// cy : http://en.wikipedia.org/wiki/.cy
++*.cy
++
++// cz : http://en.wikipedia.org/wiki/.cz
++cz
++
++// de : http://en.wikipedia.org/wiki/.de
++// Confirmed by registry <ops@denic.de> (with technical
++// reservations) 2008-07-01
++de
++
++// dj : http://en.wikipedia.org/wiki/.dj
++dj
++
++// dk : http://en.wikipedia.org/wiki/.dk
++// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17
++dk
++
++// dm : http://en.wikipedia.org/wiki/.dm
++dm
++com.dm
++net.dm
++org.dm
++edu.dm
++gov.dm
++
++// do : http://en.wikipedia.org/wiki/.do
++do
++art.do
++com.do
++edu.do
++gob.do
++gov.do
++mil.do
++net.do
++org.do
++sld.do
++web.do
++
++// dz : http://en.wikipedia.org/wiki/.dz
++dz
++com.dz
++org.dz
++net.dz
++gov.dz
++edu.dz
++asso.dz
++pol.dz
++art.dz
++
++// ec : http://www.nic.ec/reg/paso1.asp
++// Submitted by registry <vabboud@nic.ec> 2008-07-04
++ec
++com.ec
++info.ec
++net.ec
++fin.ec
++k12.ec
++med.ec
++pro.ec
++org.ec
++edu.ec
++gov.ec
++gob.ec
++mil.ec
++
++// edu : http://en.wikipedia.org/wiki/.edu
++edu
++
++// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B
++ee
++edu.ee
++gov.ee
++riik.ee
++lib.ee
++med.ee
++com.ee
++pri.ee
++aip.ee
++org.ee
++fie.ee
++
++// eg : http://en.wikipedia.org/wiki/.eg
++eg
++com.eg
++edu.eg
++eun.eg
++gov.eg
++mil.eg
++name.eg
++net.eg
++org.eg
++sci.eg
++
++// er : http://en.wikipedia.org/wiki/.er
++*.er
++
++// es : https://www.nic.es/site_ingles/ingles/dominios/index.html
++es
++com.es
++nom.es
++org.es
++gob.es
++edu.es
++
++// et : http://en.wikipedia.org/wiki/.et
++et
++com.et
++gov.et
++org.et
++edu.et
++biz.et
++name.et
++info.et
++net.et
++
++// eu : http://en.wikipedia.org/wiki/.eu
++eu
++
++// fi : http://en.wikipedia.org/wiki/.fi
++fi
++// aland.fi : http://en.wikipedia.org/wiki/.ax
++// This domain is being phased out in favor of .ax. As there are still many
++// domains under aland.fi, we still keep it on the list until aland.fi is
++// completely removed.
++// TODO: Check for updates (expected to be phased out around Q1/2009)
++aland.fi
++
++// fj : http://en.wikipedia.org/wiki/.fj
++*.fj
++
++// fk : http://en.wikipedia.org/wiki/.fk
++*.fk
++
++// fm : http://en.wikipedia.org/wiki/.fm
++fm
++
++// fo : http://en.wikipedia.org/wiki/.fo
++fo
++
++// fr : http://www.afnic.fr/
++// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs
++fr
++com.fr
++asso.fr
++nom.fr
++prd.fr
++presse.fr
++tm.fr
++// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels
++aeroport.fr
++assedic.fr
++avocat.fr
++avoues.fr
++cci.fr
++chambagri.fr
++chirurgiens-dentistes.fr
++experts-comptables.fr
++geometre-expert.fr
++gouv.fr
++greta.fr
++huissier-justice.fr
++medecin.fr
++notaires.fr
++pharmacien.fr
++port.fr
++veterinaire.fr
++
++// ga : http://en.wikipedia.org/wiki/.ga
++ga
++
++// gb : This registry is effectively dormant
++// Submitted by registry <Damien.Shaw@ja.net> 2008-06-12
++gb
++
++// gd : http://en.wikipedia.org/wiki/.gd
++gd
++
++// ge : http://www.nic.net.ge/policy_en.pdf
++ge
++com.ge
++edu.ge
++gov.ge
++org.ge
++mil.ge
++net.ge
++pvt.ge
++
++// gf : http://en.wikipedia.org/wiki/.gf
++gf
++
++// gg : http://www.channelisles.net/register-domains/
++// Confirmed by registry <nigel@channelisles.net> 2013-11-28
++gg
++co.gg
++net.gg
++org.gg
++
++// gh : http://en.wikipedia.org/wiki/.gh
++// see also: http://www.nic.gh/reg_now.php
++// Although domains directly at second level are not possible at the moment,
++// they have been possible for some time and may come back.
++gh
++com.gh
++edu.gh
++gov.gh
++org.gh
++mil.gh
++
++// gi : http://www.nic.gi/rules.html
++gi
++com.gi
++ltd.gi
++gov.gi
++mod.gi
++edu.gi
++org.gi
++
++// gl : http://en.wikipedia.org/wiki/.gl
++// http://nic.gl
++gl
++co.gl
++com.gl
++edu.gl
++net.gl
++org.gl
++
++// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm
++gm
++
++// gn : http://psg.com/dns/gn/gn.txt
++// Submitted by registry <randy@psg.com> 2008-06-17
++gn
++ac.gn
++com.gn
++edu.gn
++gov.gn
++org.gn
++net.gn
++
++// gov : http://en.wikipedia.org/wiki/.gov
++gov
++
++// gp : http://www.nic.gp/index.php?lang=en
++gp
++com.gp
++net.gp
++mobi.gp
++edu.gp
++org.gp
++asso.gp
++
++// gq : http://en.wikipedia.org/wiki/.gq
++gq
++
++// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html
++// Submitted by registry <segred@ics.forth.gr> 2008-06-09
++gr
++com.gr
++edu.gr
++net.gr
++org.gr
++gov.gr
++
++// gs : http://en.wikipedia.org/wiki/.gs
++gs
++
++// gt : http://www.gt/politicas_de_registro.html
++gt
++com.gt
++edu.gt
++gob.gt
++ind.gt
++mil.gt
++net.gt
++org.gt
++
++// gu : http://gadao.gov.gu/registration.txt
++*.gu
++
++// gw : http://en.wikipedia.org/wiki/.gw
++gw
++
++// gy : http://en.wikipedia.org/wiki/.gy
++// http://registry.gy/
++gy
++co.gy
++com.gy
++net.gy
++
++// hk : https://www.hkdnr.hk
++// Submitted by registry <hk.tech@hkirc.hk> 2008-06-11
++hk
++com.hk
++edu.hk
++gov.hk
++idv.hk
++net.hk
++org.hk
++å…¬å¸.hk
++xn--55qx5d.hk
++教育.hk
++xn--wcvs22d.hk
++敎育.hk
++xn--lcvr32d.hk
++政府.hk
++xn--mxtq1m.hk
++個人.hk
++xn--gmqw5a.hk
++个人.hk
++xn--ciqpn.hk
++箇人.hk
++xn--gmq050i.hk
++網络.hk
++xn--zf0avx.hk
++网络.hk
++xn--io0a7i.hk
++组織.hk
++xn--mk0axi.hk
++網絡.hk
++xn--od0alg.hk
++网絡.hk
++xn--od0aq3b.hk
++组织.hk
++xn--tn0ag.hk
++組織.hk
++xn--uc0atv.hk
++組织.hk
++xn--uc0ay4a.hk
++
++// hm : http://en.wikipedia.org/wiki/.hm
++hm
++
++// hn : http://www.nic.hn/politicas/ps02,,05.html
++hn
++com.hn
++edu.hn
++org.hn
++net.hn
++mil.hn
++gob.hn
++
++// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf
++hr
++iz.hr
++from.hr
++name.hr
++com.hr
++
++// ht : http://www.nic.ht/info/charte.cfm
++ht
++com.ht
++shop.ht
++firm.ht
++info.ht
++adult.ht
++net.ht
++pro.ht
++org.ht
++med.ht
++art.ht
++coop.ht
++pol.ht
++asso.ht
++edu.ht
++rel.ht
++gouv.ht
++perso.ht
++
++// hu : http://www.domain.hu/domain/English/sld.html
++// Confirmed by registry <pasztor@iszt.hu> 2008-06-12
++hu
++co.hu
++info.hu
++org.hu
++priv.hu
++sport.hu
++tm.hu
++2000.hu
++agrar.hu
++bolt.hu
++casino.hu
++city.hu
++erotica.hu
++erotika.hu
++film.hu
++forum.hu
++games.hu
++hotel.hu
++ingatlan.hu
++jogasz.hu
++konyvelo.hu
++lakas.hu
++media.hu
++news.hu
++reklam.hu
++sex.hu
++shop.hu
++suli.hu
++szex.hu
++tozsde.hu
++utazas.hu
++video.hu
++
++// id : https://register.pandi.or.id/
++id
++ac.id
++biz.id
++co.id
++desa.id
++go.id
++mil.id
++my.id
++net.id
++or.id
++sch.id
++web.id
++
++// ie : http://en.wikipedia.org/wiki/.ie
++ie
++gov.ie
++
++// il : http://en.wikipedia.org/wiki/.il
++*.il
++
++// im : https://www.nic.im/
++// Submitted by registry <info@nic.im> 2013-11-15
++im
++ac.im
++co.im
++com.im
++ltd.co.im
++net.im
++org.im
++plc.co.im
++tt.im
++tv.im
++
++// in : http://en.wikipedia.org/wiki/.in
++// see also: https://registry.in/Policies
++// Please note, that nic.in is not an offical eTLD, but used by most
++// government institutions.
++in
++co.in
++firm.in
++net.in
++org.in
++gen.in
++ind.in
++nic.in
++ac.in
++edu.in
++res.in
++gov.in
++mil.in
++
++// info : http://en.wikipedia.org/wiki/.info
++info
++
++// int : http://en.wikipedia.org/wiki/.int
++// Confirmed by registry <iana-questions@icann.org> 2008-06-18
++int
++eu.int
++
++// io : http://www.nic.io/rules.html
++// list of other 2nd level tlds ?
++io
++com.io
++
++// iq : http://www.cmc.iq/english/iq/iqregister1.htm
++iq
++gov.iq
++edu.iq
++mil.iq
++com.iq
++org.iq
++net.iq
++
++// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules
++// Also see http://www.nic.ir/Internationalized_Domain_Names
++// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16
++ir
++ac.ir
++co.ir
++gov.ir
++id.ir
++net.ir
++org.ir
++sch.ir
++// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH)
++ایران.ir
++xn--mgba3a4f16a.ir
++// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH)
++ايران.ir
++xn--mgba3a4fra.ir
++
++// is : http://www.isnic.is/domain/rules.php
++// Confirmed by registry <marius@isgate.is> 2008-12-06
++is
++net.is
++com.is
++edu.is
++gov.is
++org.is
++int.is
++
++// it : http://en.wikipedia.org/wiki/.it
++it
++gov.it
++edu.it
++// Reserved geo-names:
++// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf
++// There is also a list of reserved geo-names corresponding to Italian municipalities
++// http://www.nic.it/documenti/appendice-c.pdf, but it is not included here.
++// Regions
++abr.it
++abruzzo.it
++aosta-valley.it
++aostavalley.it
++bas.it
++basilicata.it
++cal.it
++calabria.it
++cam.it
++campania.it
++emilia-romagna.it
++emiliaromagna.it
++emr.it
++friuli-v-giulia.it
++friuli-ve-giulia.it
++friuli-vegiulia.it
++friuli-venezia-giulia.it
++friuli-veneziagiulia.it
++friuli-vgiulia.it
++friuliv-giulia.it
++friulive-giulia.it
++friulivegiulia.it
++friulivenezia-giulia.it
++friuliveneziagiulia.it
++friulivgiulia.it
++fvg.it
++laz.it
++lazio.it
++lig.it
++liguria.it
++lom.it
++lombardia.it
++lombardy.it
++lucania.it
++mar.it
++marche.it
++mol.it
++molise.it
++piedmont.it
++piemonte.it
++pmn.it
++pug.it
++puglia.it
++sar.it
++sardegna.it
++sardinia.it
++sic.it
++sicilia.it
++sicily.it
++taa.it
++tos.it
++toscana.it
++trentino-a-adige.it
++trentino-aadige.it
++trentino-alto-adige.it
++trentino-altoadige.it
++trentino-s-tirol.it
++trentino-stirol.it
++trentino-sud-tirol.it
++trentino-sudtirol.it
++trentino-sued-tirol.it
++trentino-suedtirol.it
++trentinoa-adige.it
++trentinoaadige.it
++trentinoalto-adige.it
++trentinoaltoadige.it
++trentinos-tirol.it
++trentinostirol.it
++trentinosud-tirol.it
++trentinosudtirol.it
++trentinosued-tirol.it
++trentinosuedtirol.it
++tuscany.it
++umb.it
++umbria.it
++val-d-aosta.it
++val-daosta.it
++vald-aosta.it
++valdaosta.it
++valle-aosta.it
++valle-d-aosta.it
++valle-daosta.it
++valleaosta.it
++valled-aosta.it
++valledaosta.it
++vallee-aoste.it
++valleeaoste.it
++vao.it
++vda.it
++ven.it
++veneto.it
++// Provinces
++ag.it
++agrigento.it
++al.it
++alessandria.it
++alto-adige.it
++altoadige.it
++an.it
++ancona.it
++andria-barletta-trani.it
++andria-trani-barletta.it
++andriabarlettatrani.it
++andriatranibarletta.it
++ao.it
++aosta.it
++aoste.it
++ap.it
++aq.it
++aquila.it
++ar.it
++arezzo.it
++ascoli-piceno.it
++ascolipiceno.it
++asti.it
++at.it
++av.it
++avellino.it
++ba.it
++balsan.it
++bari.it
++barletta-trani-andria.it
++barlettatraniandria.it
++belluno.it
++benevento.it
++bergamo.it
++bg.it
++bi.it
++biella.it
++bl.it
++bn.it
++bo.it
++bologna.it
++bolzano.it
++bozen.it
++br.it
++brescia.it
++brindisi.it
++bs.it
++bt.it
++bz.it
++ca.it
++cagliari.it
++caltanissetta.it
++campidano-medio.it
++campidanomedio.it
++campobasso.it
++carbonia-iglesias.it
++carboniaiglesias.it
++carrara-massa.it
++carraramassa.it
++caserta.it
++catania.it
++catanzaro.it
++cb.it
++ce.it
++cesena-forli.it
++cesenaforli.it
++ch.it
++chieti.it
++ci.it
++cl.it
++cn.it
++co.it
++como.it
++cosenza.it
++cr.it
++cremona.it
++crotone.it
++cs.it
++ct.it
++cuneo.it
++cz.it
++dell-ogliastra.it
++dellogliastra.it
++en.it
++enna.it
++fc.it
++fe.it
++fermo.it
++ferrara.it
++fg.it
++fi.it
++firenze.it
++florence.it
++fm.it
++foggia.it
++forli-cesena.it
++forlicesena.it
++fr.it
++frosinone.it
++ge.it
++genoa.it
++genova.it
++go.it
++gorizia.it
++gr.it
++grosseto.it
++iglesias-carbonia.it
++iglesiascarbonia.it
++im.it
++imperia.it
++is.it
++isernia.it
++kr.it
++la-spezia.it
++laquila.it
++laspezia.it
++latina.it
++lc.it
++le.it
++lecce.it
++lecco.it
++li.it
++livorno.it
++lo.it
++lodi.it
++lt.it
++lu.it
++lucca.it
++macerata.it
++mantova.it
++massa-carrara.it
++massacarrara.it
++matera.it
++mb.it
++mc.it
++me.it
++medio-campidano.it
++mediocampidano.it
++messina.it
++mi.it
++milan.it
++milano.it
++mn.it
++mo.it
++modena.it
++monza-brianza.it
++monza-e-della-brianza.it
++monza.it
++monzabrianza.it
++monzaebrianza.it
++monzaedellabrianza.it
++ms.it
++mt.it
++na.it
++naples.it
++napoli.it
++no.it
++novara.it
++nu.it
++nuoro.it
++og.it
++ogliastra.it
++olbia-tempio.it
++olbiatempio.it
++or.it
++oristano.it
++ot.it
++pa.it
++padova.it
++padua.it
++palermo.it
++parma.it
++pavia.it
++pc.it
++pd.it
++pe.it
++perugia.it
++pesaro-urbino.it
++pesarourbino.it
++pescara.it
++pg.it
++pi.it
++piacenza.it
++pisa.it
++pistoia.it
++pn.it
++po.it
++pordenone.it
++potenza.it
++pr.it
++prato.it
++pt.it
++pu.it
++pv.it
++pz.it
++ra.it
++ragusa.it
++ravenna.it
++rc.it
++re.it
++reggio-calabria.it
++reggio-emilia.it
++reggiocalabria.it
++reggioemilia.it
++rg.it
++ri.it
++rieti.it
++rimini.it
++rm.it
++rn.it
++ro.it
++roma.it
++rome.it
++rovigo.it
++sa.it
++salerno.it
++sassari.it
++savona.it
++si.it
++siena.it
++siracusa.it
++so.it
++sondrio.it
++sp.it
++sr.it
++ss.it
++suedtirol.it
++sv.it
++ta.it
++taranto.it
++te.it
++tempio-olbia.it
++tempioolbia.it
++teramo.it
++terni.it
++tn.it
++to.it
++torino.it
++tp.it
++tr.it
++trani-andria-barletta.it
++trani-barletta-andria.it
++traniandriabarletta.it
++tranibarlettaandria.it
++trapani.it
++trentino.it
++trento.it
++treviso.it
++trieste.it
++ts.it
++turin.it
++tv.it
++ud.it
++udine.it
++urbino-pesaro.it
++urbinopesaro.it
++va.it
++varese.it
++vb.it
++vc.it
++ve.it
++venezia.it
++venice.it
++verbania.it
++vercelli.it
++verona.it
++vi.it
++vibo-valentia.it
++vibovalentia.it
++vicenza.it
++viterbo.it
++vr.it
++vs.it
++vt.it
++vv.it
++
++// je : http://www.channelisles.net/register-domains/
++// Confirmed by registry <nigel@channelisles.net> 2013-11-28
++je
++co.je
++net.je
++org.je
++
++// jm : http://www.com.jm/register.html
++*.jm
++
++// jo : http://www.dns.jo/Registration_policy.aspx
++jo
++com.jo
++org.jo
++net.jo
++edu.jo
++sch.jo
++gov.jo
++mil.jo
++name.jo
++
++// jobs : http://en.wikipedia.org/wiki/.jobs
++jobs
++
++// jp : http://en.wikipedia.org/wiki/.jp
++// http://jprs.co.jp/en/jpdomain.html
++// Submitted by registry <info@jprs.jp> 2014-10-30
++jp
++// jp organizational type names
++ac.jp
++ad.jp
++co.jp
++ed.jp
++go.jp
++gr.jp
++lg.jp
++ne.jp
++or.jp
++// jp prefecture type names
++aichi.jp
++akita.jp
++aomori.jp
++chiba.jp
++ehime.jp
++fukui.jp
++fukuoka.jp
++fukushima.jp
++gifu.jp
++gunma.jp
++hiroshima.jp
++hokkaido.jp
++hyogo.jp
++ibaraki.jp
++ishikawa.jp
++iwate.jp
++kagawa.jp
++kagoshima.jp
++kanagawa.jp
++kochi.jp
++kumamoto.jp
++kyoto.jp
++mie.jp
++miyagi.jp
++miyazaki.jp
++nagano.jp
++nagasaki.jp
++nara.jp
++niigata.jp
++oita.jp
++okayama.jp
++okinawa.jp
++osaka.jp
++saga.jp
++saitama.jp
++shiga.jp
++shimane.jp
++shizuoka.jp
++tochigi.jp
++tokushima.jp
++tokyo.jp
++tottori.jp
++toyama.jp
++wakayama.jp
++yamagata.jp
++yamaguchi.jp
++yamanashi.jp
++栃木.jp
++xn--4pvxs.jp
++愛知.jp
++xn--vgu402c.jp
++愛媛.jp
++xn--c3s14m.jp
++兵庫.jp
++xn--f6qx53a.jp
++熊本.jp
++xn--8pvr4u.jp
++茨城.jp
++xn--uist22h.jp
++北海é“.jp
++xn--djrs72d6uy.jp
++åƒè‘‰.jp
++xn--mkru45i.jp
++和歌山.jp
++xn--0trq7p7nn.jp
++é•·å´Ž.jp
++xn--8ltr62k.jp
++長野.jp
++xn--2m4a15e.jp
++新潟.jp
++xn--efvn9s.jp
++é’森.jp
++xn--32vp30h.jp
++é™å²¡.jp
++xn--4it797k.jp
++æ±äº¬.jp
++xn--1lqs71d.jp
++石å·.jp
++xn--5rtp49c.jp
++埼玉.jp
++xn--5js045d.jp
++三é‡.jp
++xn--ehqz56n.jp
++京都.jp
++xn--1lqs03n.jp
++ä½è³€.jp
++xn--qqqt11m.jp
++大分.jp
++xn--kbrq7o.jp
++大阪.jp
++xn--pssu33l.jp
++奈良.jp
++xn--ntsq17g.jp
++宮城.jp
++xn--uisz3g.jp
++宮崎.jp
++xn--6btw5a.jp
++富山.jp
++xn--1ctwo.jp
++å±±å£.jp
++xn--6orx2r.jp
++山形.jp
++xn--rht61e.jp
++山梨.jp
++xn--rht27z.jp
++岩手.jp
++xn--djty4k.jp
++å²é˜œ.jp
++xn--nit225k.jp
++岡山.jp
++xn--rht3d.jp
++島根.jp
++xn--klty5x.jp
++広島.jp
++xn--kltx9a.jp
++徳島.jp
++xn--kltp7d.jp
++沖縄.jp
++xn--uuwu58a.jp
++滋賀.jp
++xn--zbx025d.jp
++神奈å·.jp
++xn--ntso0iqx3a.jp
++ç¦äº•.jp
++xn--elqq16h.jp
++ç¦å²¡.jp
++xn--4it168d.jp
++ç¦å³¶.jp
++xn--klt787d.jp
++秋田.jp
++xn--rny31h.jp
++群馬.jp
++xn--7t0a264c.jp
++香å·.jp
++xn--5rtq34k.jp
++高知.jp
++xn--k7yn95e.jp
++é³¥å–.jp
++xn--tor131o.jp
++鹿å…島.jp
++xn--d5qv7z876c.jp
++// jp geographic type names
++// http://jprs.jp/doc/rule/saisoku-1.html
++*.kawasaki.jp
++*.kitakyushu.jp
++*.kobe.jp
++*.nagoya.jp
++*.sapporo.jp
++*.sendai.jp
++*.yokohama.jp
++!city.kawasaki.jp
++!city.kitakyushu.jp
++!city.kobe.jp
++!city.nagoya.jp
++!city.sapporo.jp
++!city.sendai.jp
++!city.yokohama.jp
++// 4th level registration
++aisai.aichi.jp
++ama.aichi.jp
++anjo.aichi.jp
++asuke.aichi.jp
++chiryu.aichi.jp
++chita.aichi.jp
++fuso.aichi.jp
++gamagori.aichi.jp
++handa.aichi.jp
++hazu.aichi.jp
++hekinan.aichi.jp
++higashiura.aichi.jp
++ichinomiya.aichi.jp
++inazawa.aichi.jp
++inuyama.aichi.jp
++isshiki.aichi.jp
++iwakura.aichi.jp
++kanie.aichi.jp
++kariya.aichi.jp
++kasugai.aichi.jp
++kira.aichi.jp
++kiyosu.aichi.jp
++komaki.aichi.jp
++konan.aichi.jp
++kota.aichi.jp
++mihama.aichi.jp
++miyoshi.aichi.jp
++nishio.aichi.jp
++nisshin.aichi.jp
++obu.aichi.jp
++oguchi.aichi.jp
++oharu.aichi.jp
++okazaki.aichi.jp
++owariasahi.aichi.jp
++seto.aichi.jp
++shikatsu.aichi.jp
++shinshiro.aichi.jp
++shitara.aichi.jp
++tahara.aichi.jp
++takahama.aichi.jp
++tobishima.aichi.jp
++toei.aichi.jp
++togo.aichi.jp
++tokai.aichi.jp
++tokoname.aichi.jp
++toyoake.aichi.jp
++toyohashi.aichi.jp
++toyokawa.aichi.jp
++toyone.aichi.jp
++toyota.aichi.jp
++tsushima.aichi.jp
++yatomi.aichi.jp
++akita.akita.jp
++daisen.akita.jp
++fujisato.akita.jp
++gojome.akita.jp
++hachirogata.akita.jp
++happou.akita.jp
++higashinaruse.akita.jp
++honjo.akita.jp
++honjyo.akita.jp
++ikawa.akita.jp
++kamikoani.akita.jp
++kamioka.akita.jp
++katagami.akita.jp
++kazuno.akita.jp
++kitaakita.akita.jp
++kosaka.akita.jp
++kyowa.akita.jp
++misato.akita.jp
++mitane.akita.jp
++moriyoshi.akita.jp
++nikaho.akita.jp
++noshiro.akita.jp
++odate.akita.jp
++oga.akita.jp
++ogata.akita.jp
++semboku.akita.jp
++yokote.akita.jp
++yurihonjo.akita.jp
++aomori.aomori.jp
++gonohe.aomori.jp
++hachinohe.aomori.jp
++hashikami.aomori.jp
++hiranai.aomori.jp
++hirosaki.aomori.jp
++itayanagi.aomori.jp
++kuroishi.aomori.jp
++misawa.aomori.jp
++mutsu.aomori.jp
++nakadomari.aomori.jp
++noheji.aomori.jp
++oirase.aomori.jp
++owani.aomori.jp
++rokunohe.aomori.jp
++sannohe.aomori.jp
++shichinohe.aomori.jp
++shingo.aomori.jp
++takko.aomori.jp
++towada.aomori.jp
++tsugaru.aomori.jp
++tsuruta.aomori.jp
++abiko.chiba.jp
++asahi.chiba.jp
++chonan.chiba.jp
++chosei.chiba.jp
++choshi.chiba.jp
++chuo.chiba.jp
++funabashi.chiba.jp
++futtsu.chiba.jp
++hanamigawa.chiba.jp
++ichihara.chiba.jp
++ichikawa.chiba.jp
++ichinomiya.chiba.jp
++inzai.chiba.jp
++isumi.chiba.jp
++kamagaya.chiba.jp
++kamogawa.chiba.jp
++kashiwa.chiba.jp
++katori.chiba.jp
++katsuura.chiba.jp
++kimitsu.chiba.jp
++kisarazu.chiba.jp
++kozaki.chiba.jp
++kujukuri.chiba.jp
++kyonan.chiba.jp
++matsudo.chiba.jp
++midori.chiba.jp
++mihama.chiba.jp
++minamiboso.chiba.jp
++mobara.chiba.jp
++mutsuzawa.chiba.jp
++nagara.chiba.jp
++nagareyama.chiba.jp
++narashino.chiba.jp
++narita.chiba.jp
++noda.chiba.jp
++oamishirasato.chiba.jp
++omigawa.chiba.jp
++onjuku.chiba.jp
++otaki.chiba.jp
++sakae.chiba.jp
++sakura.chiba.jp
++shimofusa.chiba.jp
++shirako.chiba.jp
++shiroi.chiba.jp
++shisui.chiba.jp
++sodegaura.chiba.jp
++sosa.chiba.jp
++tako.chiba.jp
++tateyama.chiba.jp
++togane.chiba.jp
++tohnosho.chiba.jp
++tomisato.chiba.jp
++urayasu.chiba.jp
++yachimata.chiba.jp
++yachiyo.chiba.jp
++yokaichiba.chiba.jp
++yokoshibahikari.chiba.jp
++yotsukaido.chiba.jp
++ainan.ehime.jp
++honai.ehime.jp
++ikata.ehime.jp
++imabari.ehime.jp
++iyo.ehime.jp
++kamijima.ehime.jp
++kihoku.ehime.jp
++kumakogen.ehime.jp
++masaki.ehime.jp
++matsuno.ehime.jp
++matsuyama.ehime.jp
++namikata.ehime.jp
++niihama.ehime.jp
++ozu.ehime.jp
++saijo.ehime.jp
++seiyo.ehime.jp
++shikokuchuo.ehime.jp
++tobe.ehime.jp
++toon.ehime.jp
++uchiko.ehime.jp
++uwajima.ehime.jp
++yawatahama.ehime.jp
++echizen.fukui.jp
++eiheiji.fukui.jp
++fukui.fukui.jp
++ikeda.fukui.jp
++katsuyama.fukui.jp
++mihama.fukui.jp
++minamiechizen.fukui.jp
++obama.fukui.jp
++ohi.fukui.jp
++ono.fukui.jp
++sabae.fukui.jp
++sakai.fukui.jp
++takahama.fukui.jp
++tsuruga.fukui.jp
++wakasa.fukui.jp
++ashiya.fukuoka.jp
++buzen.fukuoka.jp
++chikugo.fukuoka.jp
++chikuho.fukuoka.jp
++chikujo.fukuoka.jp
++chikushino.fukuoka.jp
++chikuzen.fukuoka.jp
++chuo.fukuoka.jp
++dazaifu.fukuoka.jp
++fukuchi.fukuoka.jp
++hakata.fukuoka.jp
++higashi.fukuoka.jp
++hirokawa.fukuoka.jp
++hisayama.fukuoka.jp
++iizuka.fukuoka.jp
++inatsuki.fukuoka.jp
++kaho.fukuoka.jp
++kasuga.fukuoka.jp
++kasuya.fukuoka.jp
++kawara.fukuoka.jp
++keisen.fukuoka.jp
++koga.fukuoka.jp
++kurate.fukuoka.jp
++kurogi.fukuoka.jp
++kurume.fukuoka.jp
++minami.fukuoka.jp
++miyako.fukuoka.jp
++miyama.fukuoka.jp
++miyawaka.fukuoka.jp
++mizumaki.fukuoka.jp
++munakata.fukuoka.jp
++nakagawa.fukuoka.jp
++nakama.fukuoka.jp
++nishi.fukuoka.jp
++nogata.fukuoka.jp
++ogori.fukuoka.jp
++okagaki.fukuoka.jp
++okawa.fukuoka.jp
++oki.fukuoka.jp
++omuta.fukuoka.jp
++onga.fukuoka.jp
++onojo.fukuoka.jp
++oto.fukuoka.jp
++saigawa.fukuoka.jp
++sasaguri.fukuoka.jp
++shingu.fukuoka.jp
++shinyoshitomi.fukuoka.jp
++shonai.fukuoka.jp
++soeda.fukuoka.jp
++sue.fukuoka.jp
++tachiarai.fukuoka.jp
++tagawa.fukuoka.jp
++takata.fukuoka.jp
++toho.fukuoka.jp
++toyotsu.fukuoka.jp
++tsuiki.fukuoka.jp
++ukiha.fukuoka.jp
++umi.fukuoka.jp
++usui.fukuoka.jp
++yamada.fukuoka.jp
++yame.fukuoka.jp
++yanagawa.fukuoka.jp
++yukuhashi.fukuoka.jp
++aizubange.fukushima.jp
++aizumisato.fukushima.jp
++aizuwakamatsu.fukushima.jp
++asakawa.fukushima.jp
++bandai.fukushima.jp
++date.fukushima.jp
++fukushima.fukushima.jp
++furudono.fukushima.jp
++futaba.fukushima.jp
++hanawa.fukushima.jp
++higashi.fukushima.jp
++hirata.fukushima.jp
++hirono.fukushima.jp
++iitate.fukushima.jp
++inawashiro.fukushima.jp
++ishikawa.fukushima.jp
++iwaki.fukushima.jp
++izumizaki.fukushima.jp
++kagamiishi.fukushima.jp
++kaneyama.fukushima.jp
++kawamata.fukushima.jp
++kitakata.fukushima.jp
++kitashiobara.fukushima.jp
++koori.fukushima.jp
++koriyama.fukushima.jp
++kunimi.fukushima.jp
++miharu.fukushima.jp
++mishima.fukushima.jp
++namie.fukushima.jp
++nango.fukushima.jp
++nishiaizu.fukushima.jp
++nishigo.fukushima.jp
++okuma.fukushima.jp
++omotego.fukushima.jp
++ono.fukushima.jp
++otama.fukushima.jp
++samegawa.fukushima.jp
++shimogo.fukushima.jp
++shirakawa.fukushima.jp
++showa.fukushima.jp
++soma.fukushima.jp
++sukagawa.fukushima.jp
++taishin.fukushima.jp
++tamakawa.fukushima.jp
++tanagura.fukushima.jp
++tenei.fukushima.jp
++yabuki.fukushima.jp
++yamato.fukushima.jp
++yamatsuri.fukushima.jp
++yanaizu.fukushima.jp
++yugawa.fukushima.jp
++anpachi.gifu.jp
++ena.gifu.jp
++gifu.gifu.jp
++ginan.gifu.jp
++godo.gifu.jp
++gujo.gifu.jp
++hashima.gifu.jp
++hichiso.gifu.jp
++hida.gifu.jp
++higashishirakawa.gifu.jp
++ibigawa.gifu.jp
++ikeda.gifu.jp
++kakamigahara.gifu.jp
++kani.gifu.jp
++kasahara.gifu.jp
++kasamatsu.gifu.jp
++kawaue.gifu.jp
++kitagata.gifu.jp
++mino.gifu.jp
++minokamo.gifu.jp
++mitake.gifu.jp
++mizunami.gifu.jp
++motosu.gifu.jp
++nakatsugawa.gifu.jp
++ogaki.gifu.jp
++sakahogi.gifu.jp
++seki.gifu.jp
++sekigahara.gifu.jp
++shirakawa.gifu.jp
++tajimi.gifu.jp
++takayama.gifu.jp
++tarui.gifu.jp
++toki.gifu.jp
++tomika.gifu.jp
++wanouchi.gifu.jp
++yamagata.gifu.jp
++yaotsu.gifu.jp
++yoro.gifu.jp
++annaka.gunma.jp
++chiyoda.gunma.jp
++fujioka.gunma.jp
++higashiagatsuma.gunma.jp
++isesaki.gunma.jp
++itakura.gunma.jp
++kanna.gunma.jp
++kanra.gunma.jp
++katashina.gunma.jp
++kawaba.gunma.jp
++kiryu.gunma.jp
++kusatsu.gunma.jp
++maebashi.gunma.jp
++meiwa.gunma.jp
++midori.gunma.jp
++minakami.gunma.jp
++naganohara.gunma.jp
++nakanojo.gunma.jp
++nanmoku.gunma.jp
++numata.gunma.jp
++oizumi.gunma.jp
++ora.gunma.jp
++ota.gunma.jp
++shibukawa.gunma.jp
++shimonita.gunma.jp
++shinto.gunma.jp
++showa.gunma.jp
++takasaki.gunma.jp
++takayama.gunma.jp
++tamamura.gunma.jp
++tatebayashi.gunma.jp
++tomioka.gunma.jp
++tsukiyono.gunma.jp
++tsumagoi.gunma.jp
++ueno.gunma.jp
++yoshioka.gunma.jp
++asaminami.hiroshima.jp
++daiwa.hiroshima.jp
++etajima.hiroshima.jp
++fuchu.hiroshima.jp
++fukuyama.hiroshima.jp
++hatsukaichi.hiroshima.jp
++higashihiroshima.hiroshima.jp
++hongo.hiroshima.jp
++jinsekikogen.hiroshima.jp
++kaita.hiroshima.jp
++kui.hiroshima.jp
++kumano.hiroshima.jp
++kure.hiroshima.jp
++mihara.hiroshima.jp
++miyoshi.hiroshima.jp
++naka.hiroshima.jp
++onomichi.hiroshima.jp
++osakikamijima.hiroshima.jp
++otake.hiroshima.jp
++saka.hiroshima.jp
++sera.hiroshima.jp
++seranishi.hiroshima.jp
++shinichi.hiroshima.jp
++shobara.hiroshima.jp
++takehara.hiroshima.jp
++abashiri.hokkaido.jp
++abira.hokkaido.jp
++aibetsu.hokkaido.jp
++akabira.hokkaido.jp
++akkeshi.hokkaido.jp
++asahikawa.hokkaido.jp
++ashibetsu.hokkaido.jp
++ashoro.hokkaido.jp
++assabu.hokkaido.jp
++atsuma.hokkaido.jp
++bibai.hokkaido.jp
++biei.hokkaido.jp
++bifuka.hokkaido.jp
++bihoro.hokkaido.jp
++biratori.hokkaido.jp
++chippubetsu.hokkaido.jp
++chitose.hokkaido.jp
++date.hokkaido.jp
++ebetsu.hokkaido.jp
++embetsu.hokkaido.jp
++eniwa.hokkaido.jp
++erimo.hokkaido.jp
++esan.hokkaido.jp
++esashi.hokkaido.jp
++fukagawa.hokkaido.jp
++fukushima.hokkaido.jp
++furano.hokkaido.jp
++furubira.hokkaido.jp
++haboro.hokkaido.jp
++hakodate.hokkaido.jp
++hamatonbetsu.hokkaido.jp
++hidaka.hokkaido.jp
++higashikagura.hokkaido.jp
++higashikawa.hokkaido.jp
++hiroo.hokkaido.jp
++hokuryu.hokkaido.jp
++hokuto.hokkaido.jp
++honbetsu.hokkaido.jp
++horokanai.hokkaido.jp
++horonobe.hokkaido.jp
++ikeda.hokkaido.jp
++imakane.hokkaido.jp
++ishikari.hokkaido.jp
++iwamizawa.hokkaido.jp
++iwanai.hokkaido.jp
++kamifurano.hokkaido.jp
++kamikawa.hokkaido.jp
++kamishihoro.hokkaido.jp
++kamisunagawa.hokkaido.jp
++kamoenai.hokkaido.jp
++kayabe.hokkaido.jp
++kembuchi.hokkaido.jp
++kikonai.hokkaido.jp
++kimobetsu.hokkaido.jp
++kitahiroshima.hokkaido.jp
++kitami.hokkaido.jp
++kiyosato.hokkaido.jp
++koshimizu.hokkaido.jp
++kunneppu.hokkaido.jp
++kuriyama.hokkaido.jp
++kuromatsunai.hokkaido.jp
++kushiro.hokkaido.jp
++kutchan.hokkaido.jp
++kyowa.hokkaido.jp
++mashike.hokkaido.jp
++matsumae.hokkaido.jp
++mikasa.hokkaido.jp
++minamifurano.hokkaido.jp
++mombetsu.hokkaido.jp
++moseushi.hokkaido.jp
++mukawa.hokkaido.jp
++muroran.hokkaido.jp
++naie.hokkaido.jp
++nakagawa.hokkaido.jp
++nakasatsunai.hokkaido.jp
++nakatombetsu.hokkaido.jp
++nanae.hokkaido.jp
++nanporo.hokkaido.jp
++nayoro.hokkaido.jp
++nemuro.hokkaido.jp
++niikappu.hokkaido.jp
++niki.hokkaido.jp
++nishiokoppe.hokkaido.jp
++noboribetsu.hokkaido.jp
++numata.hokkaido.jp
++obihiro.hokkaido.jp
++obira.hokkaido.jp
++oketo.hokkaido.jp
++okoppe.hokkaido.jp
++otaru.hokkaido.jp
++otobe.hokkaido.jp
++otofuke.hokkaido.jp
++otoineppu.hokkaido.jp
++oumu.hokkaido.jp
++ozora.hokkaido.jp
++pippu.hokkaido.jp
++rankoshi.hokkaido.jp
++rebun.hokkaido.jp
++rikubetsu.hokkaido.jp
++rishiri.hokkaido.jp
++rishirifuji.hokkaido.jp
++saroma.hokkaido.jp
++sarufutsu.hokkaido.jp
++shakotan.hokkaido.jp
++shari.hokkaido.jp
++shibecha.hokkaido.jp
++shibetsu.hokkaido.jp
++shikabe.hokkaido.jp
++shikaoi.hokkaido.jp
++shimamaki.hokkaido.jp
++shimizu.hokkaido.jp
++shimokawa.hokkaido.jp
++shinshinotsu.hokkaido.jp
++shintoku.hokkaido.jp
++shiranuka.hokkaido.jp
++shiraoi.hokkaido.jp
++shiriuchi.hokkaido.jp
++sobetsu.hokkaido.jp
++sunagawa.hokkaido.jp
++taiki.hokkaido.jp
++takasu.hokkaido.jp
++takikawa.hokkaido.jp
++takinoue.hokkaido.jp
++teshikaga.hokkaido.jp
++tobetsu.hokkaido.jp
++tohma.hokkaido.jp
++tomakomai.hokkaido.jp
++tomari.hokkaido.jp
++toya.hokkaido.jp
++toyako.hokkaido.jp
++toyotomi.hokkaido.jp
++toyoura.hokkaido.jp
++tsubetsu.hokkaido.jp
++tsukigata.hokkaido.jp
++urakawa.hokkaido.jp
++urausu.hokkaido.jp
++uryu.hokkaido.jp
++utashinai.hokkaido.jp
++wakkanai.hokkaido.jp
++wassamu.hokkaido.jp
++yakumo.hokkaido.jp
++yoichi.hokkaido.jp
++aioi.hyogo.jp
++akashi.hyogo.jp
++ako.hyogo.jp
++amagasaki.hyogo.jp
++aogaki.hyogo.jp
++asago.hyogo.jp
++ashiya.hyogo.jp
++awaji.hyogo.jp
++fukusaki.hyogo.jp
++goshiki.hyogo.jp
++harima.hyogo.jp
++himeji.hyogo.jp
++ichikawa.hyogo.jp
++inagawa.hyogo.jp
++itami.hyogo.jp
++kakogawa.hyogo.jp
++kamigori.hyogo.jp
++kamikawa.hyogo.jp
++kasai.hyogo.jp
++kasuga.hyogo.jp
++kawanishi.hyogo.jp
++miki.hyogo.jp
++minamiawaji.hyogo.jp
++nishinomiya.hyogo.jp
++nishiwaki.hyogo.jp
++ono.hyogo.jp
++sanda.hyogo.jp
++sannan.hyogo.jp
++sasayama.hyogo.jp
++sayo.hyogo.jp
++shingu.hyogo.jp
++shinonsen.hyogo.jp
++shiso.hyogo.jp
++sumoto.hyogo.jp
++taishi.hyogo.jp
++taka.hyogo.jp
++takarazuka.hyogo.jp
++takasago.hyogo.jp
++takino.hyogo.jp
++tamba.hyogo.jp
++tatsuno.hyogo.jp
++toyooka.hyogo.jp
++yabu.hyogo.jp
++yashiro.hyogo.jp
++yoka.hyogo.jp
++yokawa.hyogo.jp
++ami.ibaraki.jp
++asahi.ibaraki.jp
++bando.ibaraki.jp
++chikusei.ibaraki.jp
++daigo.ibaraki.jp
++fujishiro.ibaraki.jp
++hitachi.ibaraki.jp
++hitachinaka.ibaraki.jp
++hitachiomiya.ibaraki.jp
++hitachiota.ibaraki.jp
++ibaraki.ibaraki.jp
++ina.ibaraki.jp
++inashiki.ibaraki.jp
++itako.ibaraki.jp
++iwama.ibaraki.jp
++joso.ibaraki.jp
++kamisu.ibaraki.jp
++kasama.ibaraki.jp
++kashima.ibaraki.jp
++kasumigaura.ibaraki.jp
++koga.ibaraki.jp
++miho.ibaraki.jp
++mito.ibaraki.jp
++moriya.ibaraki.jp
++naka.ibaraki.jp
++namegata.ibaraki.jp
++oarai.ibaraki.jp
++ogawa.ibaraki.jp
++omitama.ibaraki.jp
++ryugasaki.ibaraki.jp
++sakai.ibaraki.jp
++sakuragawa.ibaraki.jp
++shimodate.ibaraki.jp
++shimotsuma.ibaraki.jp
++shirosato.ibaraki.jp
++sowa.ibaraki.jp
++suifu.ibaraki.jp
++takahagi.ibaraki.jp
++tamatsukuri.ibaraki.jp
++tokai.ibaraki.jp
++tomobe.ibaraki.jp
++tone.ibaraki.jp
++toride.ibaraki.jp
++tsuchiura.ibaraki.jp
++tsukuba.ibaraki.jp
++uchihara.ibaraki.jp
++ushiku.ibaraki.jp
++yachiyo.ibaraki.jp
++yamagata.ibaraki.jp
++yawara.ibaraki.jp
++yuki.ibaraki.jp
++anamizu.ishikawa.jp
++hakui.ishikawa.jp
++hakusan.ishikawa.jp
++kaga.ishikawa.jp
++kahoku.ishikawa.jp
++kanazawa.ishikawa.jp
++kawakita.ishikawa.jp
++komatsu.ishikawa.jp
++nakanoto.ishikawa.jp
++nanao.ishikawa.jp
++nomi.ishikawa.jp
++nonoichi.ishikawa.jp
++noto.ishikawa.jp
++shika.ishikawa.jp
++suzu.ishikawa.jp
++tsubata.ishikawa.jp
++tsurugi.ishikawa.jp
++uchinada.ishikawa.jp
++wajima.ishikawa.jp
++fudai.iwate.jp
++fujisawa.iwate.jp
++hanamaki.iwate.jp
++hiraizumi.iwate.jp
++hirono.iwate.jp
++ichinohe.iwate.jp
++ichinoseki.iwate.jp
++iwaizumi.iwate.jp
++iwate.iwate.jp
++joboji.iwate.jp
++kamaishi.iwate.jp
++kanegasaki.iwate.jp
++karumai.iwate.jp
++kawai.iwate.jp
++kitakami.iwate.jp
++kuji.iwate.jp
++kunohe.iwate.jp
++kuzumaki.iwate.jp
++miyako.iwate.jp
++mizusawa.iwate.jp
++morioka.iwate.jp
++ninohe.iwate.jp
++noda.iwate.jp
++ofunato.iwate.jp
++oshu.iwate.jp
++otsuchi.iwate.jp
++rikuzentakata.iwate.jp
++shiwa.iwate.jp
++shizukuishi.iwate.jp
++sumita.iwate.jp
++tanohata.iwate.jp
++tono.iwate.jp
++yahaba.iwate.jp
++yamada.iwate.jp
++ayagawa.kagawa.jp
++higashikagawa.kagawa.jp
++kanonji.kagawa.jp
++kotohira.kagawa.jp
++manno.kagawa.jp
++marugame.kagawa.jp
++mitoyo.kagawa.jp
++naoshima.kagawa.jp
++sanuki.kagawa.jp
++tadotsu.kagawa.jp
++takamatsu.kagawa.jp
++tonosho.kagawa.jp
++uchinomi.kagawa.jp
++utazu.kagawa.jp
++zentsuji.kagawa.jp
++akune.kagoshima.jp
++amami.kagoshima.jp
++hioki.kagoshima.jp
++isa.kagoshima.jp
++isen.kagoshima.jp
++izumi.kagoshima.jp
++kagoshima.kagoshima.jp
++kanoya.kagoshima.jp
++kawanabe.kagoshima.jp
++kinko.kagoshima.jp
++kouyama.kagoshima.jp
++makurazaki.kagoshima.jp
++matsumoto.kagoshima.jp
++minamitane.kagoshima.jp
++nakatane.kagoshima.jp
++nishinoomote.kagoshima.jp
++satsumasendai.kagoshima.jp
++soo.kagoshima.jp
++tarumizu.kagoshima.jp
++yusui.kagoshima.jp
++aikawa.kanagawa.jp
++atsugi.kanagawa.jp
++ayase.kanagawa.jp
++chigasaki.kanagawa.jp
++ebina.kanagawa.jp
++fujisawa.kanagawa.jp
++hadano.kanagawa.jp
++hakone.kanagawa.jp
++hiratsuka.kanagawa.jp
++isehara.kanagawa.jp
++kaisei.kanagawa.jp
++kamakura.kanagawa.jp
++kiyokawa.kanagawa.jp
++matsuda.kanagawa.jp
++minamiashigara.kanagawa.jp
++miura.kanagawa.jp
++nakai.kanagawa.jp
++ninomiya.kanagawa.jp
++odawara.kanagawa.jp
++oi.kanagawa.jp
++oiso.kanagawa.jp
++sagamihara.kanagawa.jp
++samukawa.kanagawa.jp
++tsukui.kanagawa.jp
++yamakita.kanagawa.jp
++yamato.kanagawa.jp
++yokosuka.kanagawa.jp
++yugawara.kanagawa.jp
++zama.kanagawa.jp
++zushi.kanagawa.jp
++aki.kochi.jp
++geisei.kochi.jp
++hidaka.kochi.jp
++higashitsuno.kochi.jp
++ino.kochi.jp
++kagami.kochi.jp
++kami.kochi.jp
++kitagawa.kochi.jp
++kochi.kochi.jp
++mihara.kochi.jp
++motoyama.kochi.jp
++muroto.kochi.jp
++nahari.kochi.jp
++nakamura.kochi.jp
++nankoku.kochi.jp
++nishitosa.kochi.jp
++niyodogawa.kochi.jp
++ochi.kochi.jp
++okawa.kochi.jp
++otoyo.kochi.jp
++otsuki.kochi.jp
++sakawa.kochi.jp
++sukumo.kochi.jp
++susaki.kochi.jp
++tosa.kochi.jp
++tosashimizu.kochi.jp
++toyo.kochi.jp
++tsuno.kochi.jp
++umaji.kochi.jp
++yasuda.kochi.jp
++yusuhara.kochi.jp
++amakusa.kumamoto.jp
++arao.kumamoto.jp
++aso.kumamoto.jp
++choyo.kumamoto.jp
++gyokuto.kumamoto.jp
++hitoyoshi.kumamoto.jp
++kamiamakusa.kumamoto.jp
++kashima.kumamoto.jp
++kikuchi.kumamoto.jp
++kosa.kumamoto.jp
++kumamoto.kumamoto.jp
++mashiki.kumamoto.jp
++mifune.kumamoto.jp
++minamata.kumamoto.jp
++minamioguni.kumamoto.jp
++nagasu.kumamoto.jp
++nishihara.kumamoto.jp
++oguni.kumamoto.jp
++ozu.kumamoto.jp
++sumoto.kumamoto.jp
++takamori.kumamoto.jp
++uki.kumamoto.jp
++uto.kumamoto.jp
++yamaga.kumamoto.jp
++yamato.kumamoto.jp
++yatsushiro.kumamoto.jp
++ayabe.kyoto.jp
++fukuchiyama.kyoto.jp
++higashiyama.kyoto.jp
++ide.kyoto.jp
++ine.kyoto.jp
++joyo.kyoto.jp
++kameoka.kyoto.jp
++kamo.kyoto.jp
++kita.kyoto.jp
++kizu.kyoto.jp
++kumiyama.kyoto.jp
++kyotamba.kyoto.jp
++kyotanabe.kyoto.jp
++kyotango.kyoto.jp
++maizuru.kyoto.jp
++minami.kyoto.jp
++minamiyamashiro.kyoto.jp
++miyazu.kyoto.jp
++muko.kyoto.jp
++nagaokakyo.kyoto.jp
++nakagyo.kyoto.jp
++nantan.kyoto.jp
++oyamazaki.kyoto.jp
++sakyo.kyoto.jp
++seika.kyoto.jp
++tanabe.kyoto.jp
++uji.kyoto.jp
++ujitawara.kyoto.jp
++wazuka.kyoto.jp
++yamashina.kyoto.jp
++yawata.kyoto.jp
++asahi.mie.jp
++inabe.mie.jp
++ise.mie.jp
++kameyama.mie.jp
++kawagoe.mie.jp
++kiho.mie.jp
++kisosaki.mie.jp
++kiwa.mie.jp
++komono.mie.jp
++kumano.mie.jp
++kuwana.mie.jp
++matsusaka.mie.jp
++meiwa.mie.jp
++mihama.mie.jp
++minamiise.mie.jp
++misugi.mie.jp
++miyama.mie.jp
++nabari.mie.jp
++shima.mie.jp
++suzuka.mie.jp
++tado.mie.jp
++taiki.mie.jp
++taki.mie.jp
++tamaki.mie.jp
++toba.mie.jp
++tsu.mie.jp
++udono.mie.jp
++ureshino.mie.jp
++watarai.mie.jp
++yokkaichi.mie.jp
++furukawa.miyagi.jp
++higashimatsushima.miyagi.jp
++ishinomaki.miyagi.jp
++iwanuma.miyagi.jp
++kakuda.miyagi.jp
++kami.miyagi.jp
++kawasaki.miyagi.jp
++kesennuma.miyagi.jp
++marumori.miyagi.jp
++matsushima.miyagi.jp
++minamisanriku.miyagi.jp
++misato.miyagi.jp
++murata.miyagi.jp
++natori.miyagi.jp
++ogawara.miyagi.jp
++ohira.miyagi.jp
++onagawa.miyagi.jp
++osaki.miyagi.jp
++rifu.miyagi.jp
++semine.miyagi.jp
++shibata.miyagi.jp
++shichikashuku.miyagi.jp
++shikama.miyagi.jp
++shiogama.miyagi.jp
++shiroishi.miyagi.jp
++tagajo.miyagi.jp
++taiwa.miyagi.jp
++tome.miyagi.jp
++tomiya.miyagi.jp
++wakuya.miyagi.jp
++watari.miyagi.jp
++yamamoto.miyagi.jp
++zao.miyagi.jp
++aya.miyazaki.jp
++ebino.miyazaki.jp
++gokase.miyazaki.jp
++hyuga.miyazaki.jp
++kadogawa.miyazaki.jp
++kawaminami.miyazaki.jp
++kijo.miyazaki.jp
++kitagawa.miyazaki.jp
++kitakata.miyazaki.jp
++kitaura.miyazaki.jp
++kobayashi.miyazaki.jp
++kunitomi.miyazaki.jp
++kushima.miyazaki.jp
++mimata.miyazaki.jp
++miyakonojo.miyazaki.jp
++miyazaki.miyazaki.jp
++morotsuka.miyazaki.jp
++nichinan.miyazaki.jp
++nishimera.miyazaki.jp
++nobeoka.miyazaki.jp
++saito.miyazaki.jp
++shiiba.miyazaki.jp
++shintomi.miyazaki.jp
++takaharu.miyazaki.jp
++takanabe.miyazaki.jp
++takazaki.miyazaki.jp
++tsuno.miyazaki.jp
++achi.nagano.jp
++agematsu.nagano.jp
++anan.nagano.jp
++aoki.nagano.jp
++asahi.nagano.jp
++azumino.nagano.jp
++chikuhoku.nagano.jp
++chikuma.nagano.jp
++chino.nagano.jp
++fujimi.nagano.jp
++hakuba.nagano.jp
++hara.nagano.jp
++hiraya.nagano.jp
++iida.nagano.jp
++iijima.nagano.jp
++iiyama.nagano.jp
++iizuna.nagano.jp
++ikeda.nagano.jp
++ikusaka.nagano.jp
++ina.nagano.jp
++karuizawa.nagano.jp
++kawakami.nagano.jp
++kiso.nagano.jp
++kisofukushima.nagano.jp
++kitaaiki.nagano.jp
++komagane.nagano.jp
++komoro.nagano.jp
++matsukawa.nagano.jp
++matsumoto.nagano.jp
++miasa.nagano.jp
++minamiaiki.nagano.jp
++minamimaki.nagano.jp
++minamiminowa.nagano.jp
++minowa.nagano.jp
++miyada.nagano.jp
++miyota.nagano.jp
++mochizuki.nagano.jp
++nagano.nagano.jp
++nagawa.nagano.jp
++nagiso.nagano.jp
++nakagawa.nagano.jp
++nakano.nagano.jp
++nozawaonsen.nagano.jp
++obuse.nagano.jp
++ogawa.nagano.jp
++okaya.nagano.jp
++omachi.nagano.jp
++omi.nagano.jp
++ookuwa.nagano.jp
++ooshika.nagano.jp
++otaki.nagano.jp
++otari.nagano.jp
++sakae.nagano.jp
++sakaki.nagano.jp
++saku.nagano.jp
++sakuho.nagano.jp
++shimosuwa.nagano.jp
++shinanomachi.nagano.jp
++shiojiri.nagano.jp
++suwa.nagano.jp
++suzaka.nagano.jp
++takagi.nagano.jp
++takamori.nagano.jp
++takayama.nagano.jp
++tateshina.nagano.jp
++tatsuno.nagano.jp
++togakushi.nagano.jp
++togura.nagano.jp
++tomi.nagano.jp
++ueda.nagano.jp
++wada.nagano.jp
++yamagata.nagano.jp
++yamanouchi.nagano.jp
++yasaka.nagano.jp
++yasuoka.nagano.jp
++chijiwa.nagasaki.jp
++futsu.nagasaki.jp
++goto.nagasaki.jp
++hasami.nagasaki.jp
++hirado.nagasaki.jp
++iki.nagasaki.jp
++isahaya.nagasaki.jp
++kawatana.nagasaki.jp
++kuchinotsu.nagasaki.jp
++matsuura.nagasaki.jp
++nagasaki.nagasaki.jp
++obama.nagasaki.jp
++omura.nagasaki.jp
++oseto.nagasaki.jp
++saikai.nagasaki.jp
++sasebo.nagasaki.jp
++seihi.nagasaki.jp
++shimabara.nagasaki.jp
++shinkamigoto.nagasaki.jp
++togitsu.nagasaki.jp
++tsushima.nagasaki.jp
++unzen.nagasaki.jp
++ando.nara.jp
++gose.nara.jp
++heguri.nara.jp
++higashiyoshino.nara.jp
++ikaruga.nara.jp
++ikoma.nara.jp
++kamikitayama.nara.jp
++kanmaki.nara.jp
++kashiba.nara.jp
++kashihara.nara.jp
++katsuragi.nara.jp
++kawai.nara.jp
++kawakami.nara.jp
++kawanishi.nara.jp
++koryo.nara.jp
++kurotaki.nara.jp
++mitsue.nara.jp
++miyake.nara.jp
++nara.nara.jp
++nosegawa.nara.jp
++oji.nara.jp
++ouda.nara.jp
++oyodo.nara.jp
++sakurai.nara.jp
++sango.nara.jp
++shimoichi.nara.jp
++shimokitayama.nara.jp
++shinjo.nara.jp
++soni.nara.jp
++takatori.nara.jp
++tawaramoto.nara.jp
++tenkawa.nara.jp
++tenri.nara.jp
++uda.nara.jp
++yamatokoriyama.nara.jp
++yamatotakada.nara.jp
++yamazoe.nara.jp
++yoshino.nara.jp
++aga.niigata.jp
++agano.niigata.jp
++gosen.niigata.jp
++itoigawa.niigata.jp
++izumozaki.niigata.jp
++joetsu.niigata.jp
++kamo.niigata.jp
++kariwa.niigata.jp
++kashiwazaki.niigata.jp
++minamiuonuma.niigata.jp
++mitsuke.niigata.jp
++muika.niigata.jp
++murakami.niigata.jp
++myoko.niigata.jp
++nagaoka.niigata.jp
++niigata.niigata.jp
++ojiya.niigata.jp
++omi.niigata.jp
++sado.niigata.jp
++sanjo.niigata.jp
++seiro.niigata.jp
++seirou.niigata.jp
++sekikawa.niigata.jp
++shibata.niigata.jp
++tagami.niigata.jp
++tainai.niigata.jp
++tochio.niigata.jp
++tokamachi.niigata.jp
++tsubame.niigata.jp
++tsunan.niigata.jp
++uonuma.niigata.jp
++yahiko.niigata.jp
++yoita.niigata.jp
++yuzawa.niigata.jp
++beppu.oita.jp
++bungoono.oita.jp
++bungotakada.oita.jp
++hasama.oita.jp
++hiji.oita.jp
++himeshima.oita.jp
++hita.oita.jp
++kamitsue.oita.jp
++kokonoe.oita.jp
++kuju.oita.jp
++kunisaki.oita.jp
++kusu.oita.jp
++oita.oita.jp
++saiki.oita.jp
++taketa.oita.jp
++tsukumi.oita.jp
++usa.oita.jp
++usuki.oita.jp
++yufu.oita.jp
++akaiwa.okayama.jp
++asakuchi.okayama.jp
++bizen.okayama.jp
++hayashima.okayama.jp
++ibara.okayama.jp
++kagamino.okayama.jp
++kasaoka.okayama.jp
++kibichuo.okayama.jp
++kumenan.okayama.jp
++kurashiki.okayama.jp
++maniwa.okayama.jp
++misaki.okayama.jp
++nagi.okayama.jp
++niimi.okayama.jp
++nishiawakura.okayama.jp
++okayama.okayama.jp
++satosho.okayama.jp
++setouchi.okayama.jp
++shinjo.okayama.jp
++shoo.okayama.jp
++soja.okayama.jp
++takahashi.okayama.jp
++tamano.okayama.jp
++tsuyama.okayama.jp
++wake.okayama.jp
++yakage.okayama.jp
++aguni.okinawa.jp
++ginowan.okinawa.jp
++ginoza.okinawa.jp
++gushikami.okinawa.jp
++haebaru.okinawa.jp
++higashi.okinawa.jp
++hirara.okinawa.jp
++iheya.okinawa.jp
++ishigaki.okinawa.jp
++ishikawa.okinawa.jp
++itoman.okinawa.jp
++izena.okinawa.jp
++kadena.okinawa.jp
++kin.okinawa.jp
++kitadaito.okinawa.jp
++kitanakagusuku.okinawa.jp
++kumejima.okinawa.jp
++kunigami.okinawa.jp
++minamidaito.okinawa.jp
++motobu.okinawa.jp
++nago.okinawa.jp
++naha.okinawa.jp
++nakagusuku.okinawa.jp
++nakijin.okinawa.jp
++nanjo.okinawa.jp
++nishihara.okinawa.jp
++ogimi.okinawa.jp
++okinawa.okinawa.jp
++onna.okinawa.jp
++shimoji.okinawa.jp
++taketomi.okinawa.jp
++tarama.okinawa.jp
++tokashiki.okinawa.jp
++tomigusuku.okinawa.jp
++tonaki.okinawa.jp
++urasoe.okinawa.jp
++uruma.okinawa.jp
++yaese.okinawa.jp
++yomitan.okinawa.jp
++yonabaru.okinawa.jp
++yonaguni.okinawa.jp
++zamami.okinawa.jp
++abeno.osaka.jp
++chihayaakasaka.osaka.jp
++chuo.osaka.jp
++daito.osaka.jp
++fujiidera.osaka.jp
++habikino.osaka.jp
++hannan.osaka.jp
++higashiosaka.osaka.jp
++higashisumiyoshi.osaka.jp
++higashiyodogawa.osaka.jp
++hirakata.osaka.jp
++ibaraki.osaka.jp
++ikeda.osaka.jp
++izumi.osaka.jp
++izumiotsu.osaka.jp
++izumisano.osaka.jp
++kadoma.osaka.jp
++kaizuka.osaka.jp
++kanan.osaka.jp
++kashiwara.osaka.jp
++katano.osaka.jp
++kawachinagano.osaka.jp
++kishiwada.osaka.jp
++kita.osaka.jp
++kumatori.osaka.jp
++matsubara.osaka.jp
++minato.osaka.jp
++minoh.osaka.jp
++misaki.osaka.jp
++moriguchi.osaka.jp
++neyagawa.osaka.jp
++nishi.osaka.jp
++nose.osaka.jp
++osakasayama.osaka.jp
++sakai.osaka.jp
++sayama.osaka.jp
++sennan.osaka.jp
++settsu.osaka.jp
++shijonawate.osaka.jp
++shimamoto.osaka.jp
++suita.osaka.jp
++tadaoka.osaka.jp
++taishi.osaka.jp
++tajiri.osaka.jp
++takaishi.osaka.jp
++takatsuki.osaka.jp
++tondabayashi.osaka.jp
++toyonaka.osaka.jp
++toyono.osaka.jp
++yao.osaka.jp
++ariake.saga.jp
++arita.saga.jp
++fukudomi.saga.jp
++genkai.saga.jp
++hamatama.saga.jp
++hizen.saga.jp
++imari.saga.jp
++kamimine.saga.jp
++kanzaki.saga.jp
++karatsu.saga.jp
++kashima.saga.jp
++kitagata.saga.jp
++kitahata.saga.jp
++kiyama.saga.jp
++kouhoku.saga.jp
++kyuragi.saga.jp
++nishiarita.saga.jp
++ogi.saga.jp
++omachi.saga.jp
++ouchi.saga.jp
++saga.saga.jp
++shiroishi.saga.jp
++taku.saga.jp
++tara.saga.jp
++tosu.saga.jp
++yoshinogari.saga.jp
++arakawa.saitama.jp
++asaka.saitama.jp
++chichibu.saitama.jp
++fujimi.saitama.jp
++fujimino.saitama.jp
++fukaya.saitama.jp
++hanno.saitama.jp
++hanyu.saitama.jp
++hasuda.saitama.jp
++hatogaya.saitama.jp
++hatoyama.saitama.jp
++hidaka.saitama.jp
++higashichichibu.saitama.jp
++higashimatsuyama.saitama.jp
++honjo.saitama.jp
++ina.saitama.jp
++iruma.saitama.jp
++iwatsuki.saitama.jp
++kamiizumi.saitama.jp
++kamikawa.saitama.jp
++kamisato.saitama.jp
++kasukabe.saitama.jp
++kawagoe.saitama.jp
++kawaguchi.saitama.jp
++kawajima.saitama.jp
++kazo.saitama.jp
++kitamoto.saitama.jp
++koshigaya.saitama.jp
++kounosu.saitama.jp
++kuki.saitama.jp
++kumagaya.saitama.jp
++matsubushi.saitama.jp
++minano.saitama.jp
++misato.saitama.jp
++miyashiro.saitama.jp
++miyoshi.saitama.jp
++moroyama.saitama.jp
++nagatoro.saitama.jp
++namegawa.saitama.jp
++niiza.saitama.jp
++ogano.saitama.jp
++ogawa.saitama.jp
++ogose.saitama.jp
++okegawa.saitama.jp
++omiya.saitama.jp
++otaki.saitama.jp
++ranzan.saitama.jp
++ryokami.saitama.jp
++saitama.saitama.jp
++sakado.saitama.jp
++satte.saitama.jp
++sayama.saitama.jp
++shiki.saitama.jp
++shiraoka.saitama.jp
++soka.saitama.jp
++sugito.saitama.jp
++toda.saitama.jp
++tokigawa.saitama.jp
++tokorozawa.saitama.jp
++tsurugashima.saitama.jp
++urawa.saitama.jp
++warabi.saitama.jp
++yashio.saitama.jp
++yokoze.saitama.jp
++yono.saitama.jp
++yorii.saitama.jp
++yoshida.saitama.jp
++yoshikawa.saitama.jp
++yoshimi.saitama.jp
++aisho.shiga.jp
++gamo.shiga.jp
++higashiomi.shiga.jp
++hikone.shiga.jp
++koka.shiga.jp
++konan.shiga.jp
++kosei.shiga.jp
++koto.shiga.jp
++kusatsu.shiga.jp
++maibara.shiga.jp
++moriyama.shiga.jp
++nagahama.shiga.jp
++nishiazai.shiga.jp
++notogawa.shiga.jp
++omihachiman.shiga.jp
++otsu.shiga.jp
++ritto.shiga.jp
++ryuoh.shiga.jp
++takashima.shiga.jp
++takatsuki.shiga.jp
++torahime.shiga.jp
++toyosato.shiga.jp
++yasu.shiga.jp
++akagi.shimane.jp
++ama.shimane.jp
++gotsu.shimane.jp
++hamada.shimane.jp
++higashiizumo.shimane.jp
++hikawa.shimane.jp
++hikimi.shimane.jp
++izumo.shimane.jp
++kakinoki.shimane.jp
++masuda.shimane.jp
++matsue.shimane.jp
++misato.shimane.jp
++nishinoshima.shimane.jp
++ohda.shimane.jp
++okinoshima.shimane.jp
++okuizumo.shimane.jp
++shimane.shimane.jp
++tamayu.shimane.jp
++tsuwano.shimane.jp
++unnan.shimane.jp
++yakumo.shimane.jp
++yasugi.shimane.jp
++yatsuka.shimane.jp
++arai.shizuoka.jp
++atami.shizuoka.jp
++fuji.shizuoka.jp
++fujieda.shizuoka.jp
++fujikawa.shizuoka.jp
++fujinomiya.shizuoka.jp
++fukuroi.shizuoka.jp
++gotemba.shizuoka.jp
++haibara.shizuoka.jp
++hamamatsu.shizuoka.jp
++higashiizu.shizuoka.jp
++ito.shizuoka.jp
++iwata.shizuoka.jp
++izu.shizuoka.jp
++izunokuni.shizuoka.jp
++kakegawa.shizuoka.jp
++kannami.shizuoka.jp
++kawanehon.shizuoka.jp
++kawazu.shizuoka.jp
++kikugawa.shizuoka.jp
++kosai.shizuoka.jp
++makinohara.shizuoka.jp
++matsuzaki.shizuoka.jp
++minamiizu.shizuoka.jp
++mishima.shizuoka.jp
++morimachi.shizuoka.jp
++nishiizu.shizuoka.jp
++numazu.shizuoka.jp
++omaezaki.shizuoka.jp
++shimada.shizuoka.jp
++shimizu.shizuoka.jp
++shimoda.shizuoka.jp
++shizuoka.shizuoka.jp
++susono.shizuoka.jp
++yaizu.shizuoka.jp
++yoshida.shizuoka.jp
++ashikaga.tochigi.jp
++bato.tochigi.jp
++haga.tochigi.jp
++ichikai.tochigi.jp
++iwafune.tochigi.jp
++kaminokawa.tochigi.jp
++kanuma.tochigi.jp
++karasuyama.tochigi.jp
++kuroiso.tochigi.jp
++mashiko.tochigi.jp
++mibu.tochigi.jp
++moka.tochigi.jp
++motegi.tochigi.jp
++nasu.tochigi.jp
++nasushiobara.tochigi.jp
++nikko.tochigi.jp
++nishikata.tochigi.jp
++nogi.tochigi.jp
++ohira.tochigi.jp
++ohtawara.tochigi.jp
++oyama.tochigi.jp
++sakura.tochigi.jp
++sano.tochigi.jp
++shimotsuke.tochigi.jp
++shioya.tochigi.jp
++takanezawa.tochigi.jp
++tochigi.tochigi.jp
++tsuga.tochigi.jp
++ujiie.tochigi.jp
++utsunomiya.tochigi.jp
++yaita.tochigi.jp
++aizumi.tokushima.jp
++anan.tokushima.jp
++ichiba.tokushima.jp
++itano.tokushima.jp
++kainan.tokushima.jp
++komatsushima.tokushima.jp
++matsushige.tokushima.jp
++mima.tokushima.jp
++minami.tokushima.jp
++miyoshi.tokushima.jp
++mugi.tokushima.jp
++nakagawa.tokushima.jp
++naruto.tokushima.jp
++sanagochi.tokushima.jp
++shishikui.tokushima.jp
++tokushima.tokushima.jp
++wajiki.tokushima.jp
++adachi.tokyo.jp
++akiruno.tokyo.jp
++akishima.tokyo.jp
++aogashima.tokyo.jp
++arakawa.tokyo.jp
++bunkyo.tokyo.jp
++chiyoda.tokyo.jp
++chofu.tokyo.jp
++chuo.tokyo.jp
++edogawa.tokyo.jp
++fuchu.tokyo.jp
++fussa.tokyo.jp
++hachijo.tokyo.jp
++hachioji.tokyo.jp
++hamura.tokyo.jp
++higashikurume.tokyo.jp
++higashimurayama.tokyo.jp
++higashiyamato.tokyo.jp
++hino.tokyo.jp
++hinode.tokyo.jp
++hinohara.tokyo.jp
++inagi.tokyo.jp
++itabashi.tokyo.jp
++katsushika.tokyo.jp
++kita.tokyo.jp
++kiyose.tokyo.jp
++kodaira.tokyo.jp
++koganei.tokyo.jp
++kokubunji.tokyo.jp
++komae.tokyo.jp
++koto.tokyo.jp
++kouzushima.tokyo.jp
++kunitachi.tokyo.jp
++machida.tokyo.jp
++meguro.tokyo.jp
++minato.tokyo.jp
++mitaka.tokyo.jp
++mizuho.tokyo.jp
++musashimurayama.tokyo.jp
++musashino.tokyo.jp
++nakano.tokyo.jp
++nerima.tokyo.jp
++ogasawara.tokyo.jp
++okutama.tokyo.jp
++ome.tokyo.jp
++oshima.tokyo.jp
++ota.tokyo.jp
++setagaya.tokyo.jp
++shibuya.tokyo.jp
++shinagawa.tokyo.jp
++shinjuku.tokyo.jp
++suginami.tokyo.jp
++sumida.tokyo.jp
++tachikawa.tokyo.jp
++taito.tokyo.jp
++tama.tokyo.jp
++toshima.tokyo.jp
++chizu.tottori.jp
++hino.tottori.jp
++kawahara.tottori.jp
++koge.tottori.jp
++kotoura.tottori.jp
++misasa.tottori.jp
++nanbu.tottori.jp
++nichinan.tottori.jp
++sakaiminato.tottori.jp
++tottori.tottori.jp
++wakasa.tottori.jp
++yazu.tottori.jp
++yonago.tottori.jp
++asahi.toyama.jp
++fuchu.toyama.jp
++fukumitsu.toyama.jp
++funahashi.toyama.jp
++himi.toyama.jp
++imizu.toyama.jp
++inami.toyama.jp
++johana.toyama.jp
++kamiichi.toyama.jp
++kurobe.toyama.jp
++nakaniikawa.toyama.jp
++namerikawa.toyama.jp
++nanto.toyama.jp
++nyuzen.toyama.jp
++oyabe.toyama.jp
++taira.toyama.jp
++takaoka.toyama.jp
++tateyama.toyama.jp
++toga.toyama.jp
++tonami.toyama.jp
++toyama.toyama.jp
++unazuki.toyama.jp
++uozu.toyama.jp
++yamada.toyama.jp
++arida.wakayama.jp
++aridagawa.wakayama.jp
++gobo.wakayama.jp
++hashimoto.wakayama.jp
++hidaka.wakayama.jp
++hirogawa.wakayama.jp
++inami.wakayama.jp
++iwade.wakayama.jp
++kainan.wakayama.jp
++kamitonda.wakayama.jp
++katsuragi.wakayama.jp
++kimino.wakayama.jp
++kinokawa.wakayama.jp
++kitayama.wakayama.jp
++koya.wakayama.jp
++koza.wakayama.jp
++kozagawa.wakayama.jp
++kudoyama.wakayama.jp
++kushimoto.wakayama.jp
++mihama.wakayama.jp
++misato.wakayama.jp
++nachikatsuura.wakayama.jp
++shingu.wakayama.jp
++shirahama.wakayama.jp
++taiji.wakayama.jp
++tanabe.wakayama.jp
++wakayama.wakayama.jp
++yuasa.wakayama.jp
++yura.wakayama.jp
++asahi.yamagata.jp
++funagata.yamagata.jp
++higashine.yamagata.jp
++iide.yamagata.jp
++kahoku.yamagata.jp
++kaminoyama.yamagata.jp
++kaneyama.yamagata.jp
++kawanishi.yamagata.jp
++mamurogawa.yamagata.jp
++mikawa.yamagata.jp
++murayama.yamagata.jp
++nagai.yamagata.jp
++nakayama.yamagata.jp
++nanyo.yamagata.jp
++nishikawa.yamagata.jp
++obanazawa.yamagata.jp
++oe.yamagata.jp
++oguni.yamagata.jp
++ohkura.yamagata.jp
++oishida.yamagata.jp
++sagae.yamagata.jp
++sakata.yamagata.jp
++sakegawa.yamagata.jp
++shinjo.yamagata.jp
++shirataka.yamagata.jp
++shonai.yamagata.jp
++takahata.yamagata.jp
++tendo.yamagata.jp
++tozawa.yamagata.jp
++tsuruoka.yamagata.jp
++yamagata.yamagata.jp
++yamanobe.yamagata.jp
++yonezawa.yamagata.jp
++yuza.yamagata.jp
++abu.yamaguchi.jp
++hagi.yamaguchi.jp
++hikari.yamaguchi.jp
++hofu.yamaguchi.jp
++iwakuni.yamaguchi.jp
++kudamatsu.yamaguchi.jp
++mitou.yamaguchi.jp
++nagato.yamaguchi.jp
++oshima.yamaguchi.jp
++shimonoseki.yamaguchi.jp
++shunan.yamaguchi.jp
++tabuse.yamaguchi.jp
++tokuyama.yamaguchi.jp
++toyota.yamaguchi.jp
++ube.yamaguchi.jp
++yuu.yamaguchi.jp
++chuo.yamanashi.jp
++doshi.yamanashi.jp
++fuefuki.yamanashi.jp
++fujikawa.yamanashi.jp
++fujikawaguchiko.yamanashi.jp
++fujiyoshida.yamanashi.jp
++hayakawa.yamanashi.jp
++hokuto.yamanashi.jp
++ichikawamisato.yamanashi.jp
++kai.yamanashi.jp
++kofu.yamanashi.jp
++koshu.yamanashi.jp
++kosuge.yamanashi.jp
++minami-alps.yamanashi.jp
++minobu.yamanashi.jp
++nakamichi.yamanashi.jp
++nanbu.yamanashi.jp
++narusawa.yamanashi.jp
++nirasaki.yamanashi.jp
++nishikatsura.yamanashi.jp
++oshino.yamanashi.jp
++otsuki.yamanashi.jp
++showa.yamanashi.jp
++tabayama.yamanashi.jp
++tsuru.yamanashi.jp
++uenohara.yamanashi.jp
++yamanakako.yamanashi.jp
++yamanashi.yamanashi.jp
++
++// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145
++*.ke
++
++// kg : http://www.domain.kg/dmn_n.html
++kg
++org.kg
++net.kg
++com.kg
++edu.kg
++gov.kg
++mil.kg
++
++// kh : http://www.mptc.gov.kh/dns_registration.htm
++*.kh
++
++// ki : http://www.ki/dns/index.html
++ki
++edu.ki
++biz.ki
++net.ki
++org.ki
++gov.ki
++info.ki
++com.ki
++
++// km : http://en.wikipedia.org/wiki/.km
++// http://www.domaine.km/documents/charte.doc
++km
++org.km
++nom.km
++gov.km
++prd.km
++tm.km
++edu.km
++mil.km
++ass.km
++com.km
++// These are only mentioned as proposed suggestions at domaine.km, but
++// http://en.wikipedia.org/wiki/.km says they're available for registration:
++coop.km
++asso.km
++presse.km
++medecin.km
++notaires.km
++pharmaciens.km
++veterinaire.km
++gouv.km
++
++// kn : http://en.wikipedia.org/wiki/.kn
++// http://www.dot.kn/domainRules.html
++kn
++net.kn
++org.kn
++edu.kn
++gov.kn
++
++// kp : http://www.kcce.kp/en_index.php
++kp
++com.kp
++edu.kp
++gov.kp
++org.kp
++rep.kp
++tra.kp
++
++// kr : http://en.wikipedia.org/wiki/.kr
++// see also: http://domain.nida.or.kr/eng/registration.jsp
++kr
++ac.kr
++co.kr
++es.kr
++go.kr
++hs.kr
++kg.kr
++mil.kr
++ms.kr
++ne.kr
++or.kr
++pe.kr
++re.kr
++sc.kr
++// kr geographical names
++busan.kr
++chungbuk.kr
++chungnam.kr
++daegu.kr
++daejeon.kr
++gangwon.kr
++gwangju.kr
++gyeongbuk.kr
++gyeonggi.kr
++gyeongnam.kr
++incheon.kr
++jeju.kr
++jeonbuk.kr
++jeonnam.kr
++seoul.kr
++ulsan.kr
++
++// kw : http://en.wikipedia.org/wiki/.kw
++*.kw
++
++// ky : http://www.icta.ky/da_ky_reg_dom.php
++// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17
++ky
++edu.ky
++gov.ky
++com.ky
++org.ky
++net.ky
++
++// kz : http://en.wikipedia.org/wiki/.kz
++// see also: http://www.nic.kz/rules/index.jsp
++kz
++org.kz
++edu.kz
++net.kz
++gov.kz
++mil.kz
++com.kz
++
++// la : http://en.wikipedia.org/wiki/.la
++// Submitted by registry <gavin.brown@nic.la> 2008-06-10
++la
++int.la
++net.la
++info.la
++edu.la
++gov.la
++per.la
++com.la
++org.la
++
++// lb : http://en.wikipedia.org/wiki/.lb
++// Submitted by registry <randy@psg.com> 2008-06-17
++lb
++com.lb
++edu.lb
++gov.lb
++net.lb
++org.lb
++
++// lc : http://en.wikipedia.org/wiki/.lc
++// see also: http://www.nic.lc/rules.htm
++lc
++com.lc
++net.lc
++co.lc
++org.lc
++edu.lc
++gov.lc
++
++// li : http://en.wikipedia.org/wiki/.li
++li
++
++// lk : http://www.nic.lk/seclevpr.html
++lk
++gov.lk
++sch.lk
++net.lk
++int.lk
++com.lk
++org.lk
++edu.lk
++ngo.lk
++soc.lk
++web.lk
++ltd.lk
++assn.lk
++grp.lk
++hotel.lk
++ac.lk
++
++// lr : http://psg.com/dns/lr/lr.txt
++// Submitted by registry <randy@psg.com> 2008-06-17
++lr
++com.lr
++edu.lr
++gov.lr
++org.lr
++net.lr
++
++// ls : http://en.wikipedia.org/wiki/.ls
++ls
++co.ls
++org.ls
++
++// lt : http://en.wikipedia.org/wiki/.lt
++lt
++// gov.lt : http://www.gov.lt/index_en.php
++gov.lt
++
++// lu : http://www.dns.lu/en/
++lu
++
++// lv : http://www.nic.lv/DNS/En/generic.php
++lv
++com.lv
++edu.lv
++gov.lv
++org.lv
++mil.lv
++id.lv
++net.lv
++asn.lv
++conf.lv
++
++// ly : http://www.nic.ly/regulations.php
++ly
++com.ly
++net.ly
++gov.ly
++plc.ly
++edu.ly
++sch.ly
++med.ly
++org.ly
++id.ly
++
++// ma : http://en.wikipedia.org/wiki/.ma
++// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf
++ma
++co.ma
++net.ma
++gov.ma
++org.ma
++ac.ma
++press.ma
++
++// mc : http://www.nic.mc/
++mc
++tm.mc
++asso.mc
++
++// md : http://en.wikipedia.org/wiki/.md
++md
++
++// me : http://en.wikipedia.org/wiki/.me
++me
++co.me
++net.me
++org.me
++edu.me
++ac.me
++gov.me
++its.me
++priv.me
++
++// mg : http://www.nic.mg/tarif.htm
++mg
++org.mg
++nom.mg
++gov.mg
++prd.mg
++tm.mg
++edu.mg
++mil.mg
++com.mg
++
++// mh : http://en.wikipedia.org/wiki/.mh
++mh
++
++// mil : http://en.wikipedia.org/wiki/.mil
++mil
++
++// mk : http://en.wikipedia.org/wiki/.mk
++// see also: http://dns.marnet.net.mk/postapka.php
++mk
++com.mk
++org.mk
++net.mk
++edu.mk
++gov.mk
++inf.mk
++name.mk
++
++// ml : http://www.gobin.info/domainname/ml-template.doc
++// see also: http://en.wikipedia.org/wiki/.ml
++ml
++com.ml
++edu.ml
++gouv.ml
++gov.ml
++net.ml
++org.ml
++presse.ml
++
++// mm : http://en.wikipedia.org/wiki/.mm
++*.mm
++
++// mn : http://en.wikipedia.org/wiki/.mn
++mn
++gov.mn
++edu.mn
++org.mn
++
++// mo : http://www.monic.net.mo/
++mo
++com.mo
++net.mo
++org.mo
++edu.mo
++gov.mo
++
++// mobi : http://en.wikipedia.org/wiki/.mobi
++mobi
++
++// mp : http://www.dot.mp/
++// Confirmed by registry <dcamacho@saipan.com> 2008-06-17
++mp
++
++// mq : http://en.wikipedia.org/wiki/.mq
++mq
++
++// mr : http://en.wikipedia.org/wiki/.mr
++mr
++gov.mr
++
++// ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf
++ms
++com.ms
++edu.ms
++gov.ms
++net.ms
++org.ms
++
++// mt : https://www.nic.org.mt/go/policy
++// Submitted by registry <help@nic.org.mt> 2013-11-19
++mt
++com.mt
++edu.mt
++net.mt
++org.mt
++
++// mu : http://en.wikipedia.org/wiki/.mu
++mu
++com.mu
++net.mu
++org.mu
++gov.mu
++ac.mu
++co.mu
++or.mu
++
++// museum : http://about.museum/naming/
++// http://index.museum/
++museum
++academy.museum
++agriculture.museum
++air.museum
++airguard.museum
++alabama.museum
++alaska.museum
++amber.museum
++ambulance.museum
++american.museum
++americana.museum
++americanantiques.museum
++americanart.museum
++amsterdam.museum
++and.museum
++annefrank.museum
++anthro.museum
++anthropology.museum
++antiques.museum
++aquarium.museum
++arboretum.museum
++archaeological.museum
++archaeology.museum
++architecture.museum
++art.museum
++artanddesign.museum
++artcenter.museum
++artdeco.museum
++arteducation.museum
++artgallery.museum
++arts.museum
++artsandcrafts.museum
++asmatart.museum
++assassination.museum
++assisi.museum
++association.museum
++astronomy.museum
++atlanta.museum
++austin.museum
++australia.museum
++automotive.museum
++aviation.museum
++axis.museum
++badajoz.museum
++baghdad.museum
++bahn.museum
++bale.museum
++baltimore.museum
++barcelona.museum
++baseball.museum
++basel.museum
++baths.museum
++bauern.museum
++beauxarts.museum
++beeldengeluid.museum
++bellevue.museum
++bergbau.museum
++berkeley.museum
++berlin.museum
++bern.museum
++bible.museum
++bilbao.museum
++bill.museum
++birdart.museum
++birthplace.museum
++bonn.museum
++boston.museum
++botanical.museum
++botanicalgarden.museum
++botanicgarden.museum
++botany.museum
++brandywinevalley.museum
++brasil.museum
++bristol.museum
++british.museum
++britishcolumbia.museum
++broadcast.museum
++brunel.museum
++brussel.museum
++brussels.museum
++bruxelles.museum
++building.museum
++burghof.museum
++bus.museum
++bushey.museum
++cadaques.museum
++california.museum
++cambridge.museum
++can.museum
++canada.museum
++capebreton.museum
++carrier.museum
++cartoonart.museum
++casadelamoneda.museum
++castle.museum
++castres.museum
++celtic.museum
++center.museum
++chattanooga.museum
++cheltenham.museum
++chesapeakebay.museum
++chicago.museum
++children.museum
++childrens.museum
++childrensgarden.museum
++chiropractic.museum
++chocolate.museum
++christiansburg.museum
++cincinnati.museum
++cinema.museum
++circus.museum
++civilisation.museum
++civilization.museum
++civilwar.museum
++clinton.museum
++clock.museum
++coal.museum
++coastaldefence.museum
++cody.museum
++coldwar.museum
++collection.museum
++colonialwilliamsburg.museum
++coloradoplateau.museum
++columbia.museum
++columbus.museum
++communication.museum
++communications.museum
++community.museum
++computer.museum
++computerhistory.museum
++comunicações.museum
++xn--comunicaes-v6a2o.museum
++contemporary.museum
++contemporaryart.museum
++convent.museum
++copenhagen.museum
++corporation.museum
++correios-e-telecomunicações.museum
++xn--correios-e-telecomunicaes-ghc29a.museum
++corvette.museum
++costume.museum
++countryestate.museum
++county.museum
++crafts.museum
++cranbrook.museum
++creation.museum
++cultural.museum
++culturalcenter.museum
++culture.museum
++cyber.museum
++cymru.museum
++dali.museum
++dallas.museum
++database.museum
++ddr.museum
++decorativearts.museum
++delaware.museum
++delmenhorst.museum
++denmark.museum
++depot.museum
++design.museum
++detroit.museum
++dinosaur.museum
++discovery.museum
++dolls.museum
++donostia.museum
++durham.museum
++eastafrica.museum
++eastcoast.museum
++education.museum
++educational.museum
++egyptian.museum
++eisenbahn.museum
++elburg.museum
++elvendrell.museum
++embroidery.museum
++encyclopedic.museum
++england.museum
++entomology.museum
++environment.museum
++environmentalconservation.museum
++epilepsy.museum
++essex.museum
++estate.museum
++ethnology.museum
++exeter.museum
++exhibition.museum
++family.museum
++farm.museum
++farmequipment.museum
++farmers.museum
++farmstead.museum
++field.museum
++figueres.museum
++filatelia.museum
++film.museum
++fineart.museum
++finearts.museum
++finland.museum
++flanders.museum
++florida.museum
++force.museum
++fortmissoula.museum
++fortworth.museum
++foundation.museum
++francaise.museum
++frankfurt.museum
++franziskaner.museum
++freemasonry.museum
++freiburg.museum
++fribourg.museum
++frog.museum
++fundacio.museum
++furniture.museum
++gallery.museum
++garden.museum
++gateway.museum
++geelvinck.museum
++gemological.museum
++geology.museum
++georgia.museum
++giessen.museum
++glas.museum
++glass.museum
++gorge.museum
++grandrapids.museum
++graz.museum
++guernsey.museum
++halloffame.museum
++hamburg.museum
++handson.museum
++harvestcelebration.museum
++hawaii.museum
++health.museum
++heimatunduhren.museum
++hellas.museum
++helsinki.museum
++hembygdsforbund.museum
++heritage.museum
++histoire.museum
++historical.museum
++historicalsociety.museum
++historichouses.museum
++historisch.museum
++historisches.museum
++history.museum
++historyofscience.museum
++horology.museum
++house.museum
++humanities.museum
++illustration.museum
++imageandsound.museum
++indian.museum
++indiana.museum
++indianapolis.museum
++indianmarket.museum
++intelligence.museum
++interactive.museum
++iraq.museum
++iron.museum
++isleofman.museum
++jamison.museum
++jefferson.museum
++jerusalem.museum
++jewelry.museum
++jewish.museum
++jewishart.museum
++jfk.museum
++journalism.museum
++judaica.museum
++judygarland.museum
++juedisches.museum
++juif.museum
++karate.museum
++karikatur.museum
++kids.museum
++koebenhavn.museum
++koeln.museum
++kunst.museum
++kunstsammlung.museum
++kunstunddesign.museum
++labor.museum
++labour.museum
++lajolla.museum
++lancashire.museum
++landes.museum
++lans.museum
++läns.museum
++xn--lns-qla.museum
++larsson.museum
++lewismiller.museum
++lincoln.museum
++linz.museum
++living.museum
++livinghistory.museum
++localhistory.museum
++london.museum
++losangeles.museum
++louvre.museum
++loyalist.museum
++lucerne.museum
++luxembourg.museum
++luzern.museum
++mad.museum
++madrid.museum
++mallorca.museum
++manchester.museum
++mansion.museum
++mansions.museum
++manx.museum
++marburg.museum
++maritime.museum
++maritimo.museum
++maryland.museum
++marylhurst.museum
++media.museum
++medical.museum
++medizinhistorisches.museum
++meeres.museum
++memorial.museum
++mesaverde.museum
++michigan.museum
++midatlantic.museum
++military.museum
++mill.museum
++miners.museum
++mining.museum
++minnesota.museum
++missile.museum
++missoula.museum
++modern.museum
++moma.museum
++money.museum
++monmouth.museum
++monticello.museum
++montreal.museum
++moscow.museum
++motorcycle.museum
++muenchen.museum
++muenster.museum
++mulhouse.museum
++muncie.museum
++museet.museum
++museumcenter.museum
++museumvereniging.museum
++music.museum
++national.museum
++nationalfirearms.museum
++nationalheritage.museum
++nativeamerican.museum
++naturalhistory.museum
++naturalhistorymuseum.museum
++naturalsciences.museum
++nature.museum
++naturhistorisches.museum
++natuurwetenschappen.museum
++naumburg.museum
++naval.museum
++nebraska.museum
++neues.museum
++newhampshire.museum
++newjersey.museum
++newmexico.museum
++newport.museum
++newspaper.museum
++newyork.museum
++niepce.museum
++norfolk.museum
++north.museum
++nrw.museum
++nuernberg.museum
++nuremberg.museum
++nyc.museum
++nyny.museum
++oceanographic.museum
++oceanographique.museum
++omaha.museum
++online.museum
++ontario.museum
++openair.museum
++oregon.museum
++oregontrail.museum
++otago.museum
++oxford.museum
++pacific.museum
++paderborn.museum
++palace.museum
++paleo.museum
++palmsprings.museum
++panama.museum
++paris.museum
++pasadena.museum
++pharmacy.museum
++philadelphia.museum
++philadelphiaarea.museum
++philately.museum
++phoenix.museum
++photography.museum
++pilots.museum
++pittsburgh.museum
++planetarium.museum
++plantation.museum
++plants.museum
++plaza.museum
++portal.museum
++portland.museum
++portlligat.museum
++posts-and-telecommunications.museum
++preservation.museum
++presidio.museum
++press.museum
++project.museum
++public.museum
++pubol.museum
++quebec.museum
++railroad.museum
++railway.museum
++research.museum
++resistance.museum
++riodejaneiro.museum
++rochester.museum
++rockart.museum
++roma.museum
++russia.museum
++saintlouis.museum
++salem.museum
++salvadordali.museum
++salzburg.museum
++sandiego.museum
++sanfrancisco.museum
++santabarbara.museum
++santacruz.museum
++santafe.museum
++saskatchewan.museum
++satx.museum
++savannahga.museum
++schlesisches.museum
++schoenbrunn.museum
++schokoladen.museum
++school.museum
++schweiz.museum
++science.museum
++scienceandhistory.museum
++scienceandindustry.museum
++sciencecenter.museum
++sciencecenters.museum
++science-fiction.museum
++sciencehistory.museum
++sciences.museum
++sciencesnaturelles.museum
++scotland.museum
++seaport.museum
++settlement.museum
++settlers.museum
++shell.museum
++sherbrooke.museum
++sibenik.museum
++silk.museum
++ski.museum
++skole.museum
++society.museum
++sologne.museum
++soundandvision.museum
++southcarolina.museum
++southwest.museum
++space.museum
++spy.museum
++square.museum
++stadt.museum
++stalbans.museum
++starnberg.museum
++state.museum
++stateofdelaware.museum
++station.museum
++steam.museum
++steiermark.museum
++stjohn.museum
++stockholm.museum
++stpetersburg.museum
++stuttgart.museum
++suisse.museum
++surgeonshall.museum
++surrey.museum
++svizzera.museum
++sweden.museum
++sydney.museum
++tank.museum
++tcm.museum
++technology.museum
++telekommunikation.museum
++television.museum
++texas.museum
++textile.museum
++theater.museum
++time.museum
++timekeeping.museum
++topology.museum
++torino.museum
++touch.museum
++town.museum
++transport.museum
++tree.museum
++trolley.museum
++trust.museum
++trustee.museum
++uhren.museum
++ulm.museum
++undersea.museum
++university.museum
++usa.museum
++usantiques.museum
++usarts.museum
++uscountryestate.museum
++usculture.museum
++usdecorativearts.museum
++usgarden.museum
++ushistory.museum
++ushuaia.museum
++uslivinghistory.museum
++utah.museum
++uvic.museum
++valley.museum
++vantaa.museum
++versailles.museum
++viking.museum
++village.museum
++virginia.museum
++virtual.museum
++virtuel.museum
++vlaanderen.museum
++volkenkunde.museum
++wales.museum
++wallonie.museum
++war.museum
++washingtondc.museum
++watchandclock.museum
++watch-and-clock.museum
++western.museum
++westfalen.museum
++whaling.museum
++wildlife.museum
++williamsburg.museum
++windmill.museum
++workshop.museum
++york.museum
++yorkshire.museum
++yosemite.museum
++youth.museum
++zoological.museum
++zoology.museum
++ירושלי×.museum
++xn--9dbhblg6di.museum
++иком.museum
++xn--h1aegh.museum
++
++// mv : http://en.wikipedia.org/wiki/.mv
++// "mv" included because, contra Wikipedia, google.mv exists.
++mv
++aero.mv
++biz.mv
++com.mv
++coop.mv
++edu.mv
++gov.mv
++info.mv
++int.mv
++mil.mv
++museum.mv
++name.mv
++net.mv
++org.mv
++pro.mv
++
++// mw : http://www.registrar.mw/
++mw
++ac.mw
++biz.mw
++co.mw
++com.mw
++coop.mw
++edu.mw
++gov.mw
++int.mw
++museum.mw
++net.mw
++org.mw
++
++// mx : http://www.nic.mx/
++// Submitted by registry <farias@nic.mx> 2008-06-19
++mx
++com.mx
++org.mx
++gob.mx
++edu.mx
++net.mx
++
++// my : http://www.mynic.net.my/
++my
++com.my
++net.my
++org.my
++gov.my
++edu.my
++mil.my
++name.my
++
++// mz : http://www.gobin.info/domainname/mz-template.doc
++*.mz
++!teledata.mz
++
++// na : http://www.na-nic.com.na/
++// http://www.info.na/domain/
++na
++info.na
++pro.na
++name.na
++school.na
++or.na
++dr.na
++us.na
++mx.na
++ca.na
++in.na
++cc.na
++tv.na
++ws.na
++mobi.na
++co.na
++com.na
++org.na
++
++// name : has 2nd-level tlds, but there's no list of them
++name
++
++// nc : http://www.cctld.nc/
++nc
++asso.nc
++
++// ne : http://en.wikipedia.org/wiki/.ne
++ne
++
++// net : http://en.wikipedia.org/wiki/.net
++net
++
++// nf : http://en.wikipedia.org/wiki/.nf
++nf
++com.nf
++net.nf
++per.nf
++rec.nf
++web.nf
++arts.nf
++firm.nf
++info.nf
++other.nf
++store.nf
++
++// ng : http://psg.com/dns/ng/
++ng
++com.ng
++edu.ng
++name.ng
++net.ng
++org.ng
++sch.ng
++gov.ng
++mil.ng
++mobi.ng
++
++// ni : http://www.nic.ni/dominios.htm
++*.ni
++
++// nl : http://en.wikipedia.org/wiki/.nl
++// https://www.sidn.nl/
++// ccTLD for the Netherlands
++nl
++
++// BV.nl will be a registry for dutch BV's (besloten vennootschap)
++bv.nl
++
++// no : http://www.norid.no/regelverk/index.en.html
++// The Norwegian registry has declined to notify us of updates. The web pages
++// referenced below are the official source of the data. There is also an
++// announce mailing list:
++// https://postlister.uninett.no/sympa/info/norid-diskusjon
++no
++// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html
++fhs.no
++vgs.no
++fylkesbibl.no
++folkebibl.no
++museum.no
++idrett.no
++priv.no
++// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html
++mil.no
++stat.no
++dep.no
++kommune.no
++herad.no
++// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html
++// counties
++aa.no
++ah.no
++bu.no
++fm.no
++hl.no
++hm.no
++jan-mayen.no
++mr.no
++nl.no
++nt.no
++of.no
++ol.no
++oslo.no
++rl.no
++sf.no
++st.no
++svalbard.no
++tm.no
++tr.no
++va.no
++vf.no
++// primary and lower secondary schools per county
++gs.aa.no
++gs.ah.no
++gs.bu.no
++gs.fm.no
++gs.hl.no
++gs.hm.no
++gs.jan-mayen.no
++gs.mr.no
++gs.nl.no
++gs.nt.no
++gs.of.no
++gs.ol.no
++gs.oslo.no
++gs.rl.no
++gs.sf.no
++gs.st.no
++gs.svalbard.no
++gs.tm.no
++gs.tr.no
++gs.va.no
++gs.vf.no
++// cities
++akrehamn.no
++Ã¥krehamn.no
++xn--krehamn-dxa.no
++algard.no
++ålgård.no
++xn--lgrd-poac.no
++arna.no
++brumunddal.no
++bryne.no
++bronnoysund.no
++brønnøysund.no
++xn--brnnysund-m8ac.no
++drobak.no
++drøbak.no
++xn--drbak-wua.no
++egersund.no
++fetsund.no
++floro.no
++florø.no
++xn--flor-jra.no
++fredrikstad.no
++hokksund.no
++honefoss.no
++hønefoss.no
++xn--hnefoss-q1a.no
++jessheim.no
++jorpeland.no
++jørpeland.no
++xn--jrpeland-54a.no
++kirkenes.no
++kopervik.no
++krokstadelva.no
++langevag.no
++langevåg.no
++xn--langevg-jxa.no
++leirvik.no
++mjondalen.no
++mjøndalen.no
++xn--mjndalen-64a.no
++mo-i-rana.no
++mosjoen.no
++mosjøen.no
++xn--mosjen-eya.no
++nesoddtangen.no
++orkanger.no
++osoyro.no
++osøyro.no
++xn--osyro-wua.no
++raholt.no
++råholt.no
++xn--rholt-mra.no
++sandnessjoen.no
++sandnessjøen.no
++xn--sandnessjen-ogb.no
++skedsmokorset.no
++slattum.no
++spjelkavik.no
++stathelle.no
++stavern.no
++stjordalshalsen.no
++stjørdalshalsen.no
++xn--stjrdalshalsen-sqb.no
++tananger.no
++tranby.no
++vossevangen.no
++// communities
++afjord.no
++Ã¥fjord.no
++xn--fjord-lra.no
++agdenes.no
++al.no
++Ã¥l.no
++xn--l-1fa.no
++alesund.no
++Ã¥lesund.no
++xn--lesund-hua.no
++alstahaug.no
++alta.no
++áltá.no
++xn--lt-liac.no
++alaheadju.no
++álaheadju.no
++xn--laheadju-7ya.no
++alvdal.no
++amli.no
++Ã¥mli.no
++xn--mli-tla.no
++amot.no
++Ã¥mot.no
++xn--mot-tla.no
++andebu.no
++andoy.no
++andøy.no
++xn--andy-ira.no
++andasuolo.no
++ardal.no
++Ã¥rdal.no
++xn--rdal-poa.no
++aremark.no
++arendal.no
++Ã¥s.no
++xn--s-1fa.no
++aseral.no
++Ã¥seral.no
++xn--seral-lra.no
++asker.no
++askim.no
++askvoll.no
++askoy.no
++askøy.no
++xn--asky-ira.no
++asnes.no
++Ã¥snes.no
++xn--snes-poa.no
++audnedaln.no
++aukra.no
++aure.no
++aurland.no
++aurskog-holand.no
++aurskog-høland.no
++xn--aurskog-hland-jnb.no
++austevoll.no
++austrheim.no
++averoy.no
++averøy.no
++xn--avery-yua.no
++balestrand.no
++ballangen.no
++balat.no
++bálát.no
++xn--blt-elab.no
++balsfjord.no
++bahccavuotna.no
++báhccavuotna.no
++xn--bhccavuotna-k7a.no
++bamble.no
++bardu.no
++beardu.no
++beiarn.no
++bajddar.no
++bájddar.no
++xn--bjddar-pta.no
++baidar.no
++báidár.no
++xn--bidr-5nac.no
++berg.no
++bergen.no
++berlevag.no
++berlevåg.no
++xn--berlevg-jxa.no
++bearalvahki.no
++bearalváhki.no
++xn--bearalvhki-y4a.no
++bindal.no
++birkenes.no
++bjarkoy.no
++bjarkøy.no
++xn--bjarky-fya.no
++bjerkreim.no
++bjugn.no
++bodo.no
++bodø.no
++xn--bod-2na.no
++badaddja.no
++bådåddjå.no
++xn--bdddj-mrabd.no
++budejju.no
++bokn.no
++bremanger.no
++bronnoy.no
++brønnøy.no
++xn--brnny-wuac.no
++bygland.no
++bykle.no
++barum.no
++bærum.no
++xn--brum-voa.no
++bo.telemark.no
++bø.telemark.no
++xn--b-5ga.telemark.no
++bo.nordland.no
++bø.nordland.no
++xn--b-5ga.nordland.no
++bievat.no
++bievát.no
++xn--bievt-0qa.no
++bomlo.no
++bømlo.no
++xn--bmlo-gra.no
++batsfjord.no
++båtsfjord.no
++xn--btsfjord-9za.no
++bahcavuotna.no
++báhcavuotna.no
++xn--bhcavuotna-s4a.no
++dovre.no
++drammen.no
++drangedal.no
++dyroy.no
++dyrøy.no
++xn--dyry-ira.no
++donna.no
++dønna.no
++xn--dnna-gra.no
++eid.no
++eidfjord.no
++eidsberg.no
++eidskog.no
++eidsvoll.no
++eigersund.no
++elverum.no
++enebakk.no
++engerdal.no
++etne.no
++etnedal.no
++evenes.no
++evenassi.no
++evenášši.no
++xn--eveni-0qa01ga.no
++evje-og-hornnes.no
++farsund.no
++fauske.no
++fuossko.no
++fuoisku.no
++fedje.no
++fet.no
++finnoy.no
++finnøy.no
++xn--finny-yua.no
++fitjar.no
++fjaler.no
++fjell.no
++flakstad.no
++flatanger.no
++flekkefjord.no
++flesberg.no
++flora.no
++fla.no
++flå.no
++xn--fl-zia.no
++folldal.no
++forsand.no
++fosnes.no
++frei.no
++frogn.no
++froland.no
++frosta.no
++frana.no
++fræna.no
++xn--frna-woa.no
++froya.no
++frøya.no
++xn--frya-hra.no
++fusa.no
++fyresdal.no
++forde.no
++førde.no
++xn--frde-gra.no
++gamvik.no
++gangaviika.no
++gáŋgaviika.no
++xn--ggaviika-8ya47h.no
++gaular.no
++gausdal.no
++gildeskal.no
++gildeskål.no
++xn--gildeskl-g0a.no
++giske.no
++gjemnes.no
++gjerdrum.no
++gjerstad.no
++gjesdal.no
++gjovik.no
++gjøvik.no
++xn--gjvik-wua.no
++gloppen.no
++gol.no
++gran.no
++grane.no
++granvin.no
++gratangen.no
++grimstad.no
++grong.no
++kraanghke.no
++kråanghke.no
++xn--kranghke-b0a.no
++grue.no
++gulen.no
++hadsel.no
++halden.no
++halsa.no
++hamar.no
++hamaroy.no
++habmer.no
++hábmer.no
++xn--hbmer-xqa.no
++hapmir.no
++hápmir.no
++xn--hpmir-xqa.no
++hammerfest.no
++hammarfeasta.no
++hámmárfeasta.no
++xn--hmmrfeasta-s4ac.no
++haram.no
++hareid.no
++harstad.no
++hasvik.no
++aknoluokta.no
++ákŋoluokta.no
++xn--koluokta-7ya57h.no
++hattfjelldal.no
++aarborte.no
++haugesund.no
++hemne.no
++hemnes.no
++hemsedal.no
++heroy.more-og-romsdal.no
++herøy.møre-og-romsdal.no
++xn--hery-ira.xn--mre-og-romsdal-qqb.no
++heroy.nordland.no
++herøy.nordland.no
++xn--hery-ira.nordland.no
++hitra.no
++hjartdal.no
++hjelmeland.no
++hobol.no
++hobøl.no
++xn--hobl-ira.no
++hof.no
++hol.no
++hole.no
++holmestrand.no
++holtalen.no
++holtålen.no
++xn--holtlen-hxa.no
++hornindal.no
++horten.no
++hurdal.no
++hurum.no
++hvaler.no
++hyllestad.no
++hagebostad.no
++hægebostad.no
++xn--hgebostad-g3a.no
++hoyanger.no
++høyanger.no
++xn--hyanger-q1a.no
++hoylandet.no
++høylandet.no
++xn--hylandet-54a.no
++ha.no
++hå.no
++xn--h-2fa.no
++ibestad.no
++inderoy.no
++inderøy.no
++xn--indery-fya.no
++iveland.no
++jevnaker.no
++jondal.no
++jolster.no
++jølster.no
++xn--jlster-bya.no
++karasjok.no
++karasjohka.no
++kárášjohka.no
++xn--krjohka-hwab49j.no
++karlsoy.no
++galsa.no
++gálsá.no
++xn--gls-elac.no
++karmoy.no
++karmøy.no
++xn--karmy-yua.no
++kautokeino.no
++guovdageaidnu.no
++klepp.no
++klabu.no
++klæbu.no
++xn--klbu-woa.no
++kongsberg.no
++kongsvinger.no
++kragero.no
++kragerø.no
++xn--krager-gya.no
++kristiansand.no
++kristiansund.no
++krodsherad.no
++krødsherad.no
++xn--krdsherad-m8a.no
++kvalsund.no
++rahkkeravju.no
++ráhkkerávju.no
++xn--rhkkervju-01af.no
++kvam.no
++kvinesdal.no
++kvinnherad.no
++kviteseid.no
++kvitsoy.no
++kvitsøy.no
++xn--kvitsy-fya.no
++kvafjord.no
++kvæfjord.no
++xn--kvfjord-nxa.no
++giehtavuoatna.no
++kvanangen.no
++kvænangen.no
++xn--kvnangen-k0a.no
++navuotna.no
++návuotna.no
++xn--nvuotna-hwa.no
++kafjord.no
++kåfjord.no
++xn--kfjord-iua.no
++gaivuotna.no
++gáivuotna.no
++xn--givuotna-8ya.no
++larvik.no
++lavangen.no
++lavagis.no
++loabat.no
++loabát.no
++xn--loabt-0qa.no
++lebesby.no
++davvesiida.no
++leikanger.no
++leirfjord.no
++leka.no
++leksvik.no
++lenvik.no
++leangaviika.no
++leaŋgaviika.no
++xn--leagaviika-52b.no
++lesja.no
++levanger.no
++lier.no
++lierne.no
++lillehammer.no
++lillesand.no
++lindesnes.no
++lindas.no
++lindås.no
++xn--linds-pra.no
++lom.no
++loppa.no
++lahppi.no
++láhppi.no
++xn--lhppi-xqa.no
++lund.no
++lunner.no
++luroy.no
++lurøy.no
++xn--lury-ira.no
++luster.no
++lyngdal.no
++lyngen.no
++ivgu.no
++lardal.no
++lerdal.no
++lærdal.no
++xn--lrdal-sra.no
++lodingen.no
++lødingen.no
++xn--ldingen-q1a.no
++lorenskog.no
++lørenskog.no
++xn--lrenskog-54a.no
++loten.no
++løten.no
++xn--lten-gra.no
++malvik.no
++masoy.no
++måsøy.no
++xn--msy-ula0h.no
++muosat.no
++muosát.no
++xn--muost-0qa.no
++mandal.no
++marker.no
++marnardal.no
++masfjorden.no
++meland.no
++meldal.no
++melhus.no
++meloy.no
++meløy.no
++xn--mely-ira.no
++meraker.no
++meråker.no
++xn--merker-kua.no
++moareke.no
++moåreke.no
++xn--moreke-jua.no
++midsund.no
++midtre-gauldal.no
++modalen.no
++modum.no
++molde.no
++moskenes.no
++moss.no
++mosvik.no
++malselv.no
++målselv.no
++xn--mlselv-iua.no
++malatvuopmi.no
++málatvuopmi.no
++xn--mlatvuopmi-s4a.no
++namdalseid.no
++aejrie.no
++namsos.no
++namsskogan.no
++naamesjevuemie.no
++nååmesjevuemie.no
++xn--nmesjevuemie-tcba.no
++laakesvuemie.no
++nannestad.no
++narvik.no
++narviika.no
++naustdal.no
++nedre-eiker.no
++nes.akershus.no
++nes.buskerud.no
++nesna.no
++nesodden.no
++nesseby.no
++unjarga.no
++unjárga.no
++xn--unjrga-rta.no
++nesset.no
++nissedal.no
++nittedal.no
++nord-aurdal.no
++nord-fron.no
++nord-odal.no
++norddal.no
++nordkapp.no
++davvenjarga.no
++davvenjárga.no
++xn--davvenjrga-y4a.no
++nordre-land.no
++nordreisa.no
++raisa.no
++ráisa.no
++xn--risa-5na.no
++nore-og-uvdal.no
++notodden.no
++naroy.no
++nærøy.no
++xn--nry-yla5g.no
++notteroy.no
++nøtterøy.no
++xn--nttery-byae.no
++odda.no
++oksnes.no
++øksnes.no
++xn--ksnes-uua.no
++oppdal.no
++oppegard.no
++oppegård.no
++xn--oppegrd-ixa.no
++orkdal.no
++orland.no
++ørland.no
++xn--rland-uua.no
++orskog.no
++ørskog.no
++xn--rskog-uua.no
++orsta.no
++ørsta.no
++xn--rsta-fra.no
++os.hedmark.no
++os.hordaland.no
++osen.no
++osteroy.no
++osterøy.no
++xn--ostery-fya.no
++ostre-toten.no
++østre-toten.no
++xn--stre-toten-zcb.no
++overhalla.no
++ovre-eiker.no
++øvre-eiker.no
++xn--vre-eiker-k8a.no
++oyer.no
++øyer.no
++xn--yer-zna.no
++oygarden.no
++øygarden.no
++xn--ygarden-p1a.no
++oystre-slidre.no
++øystre-slidre.no
++xn--ystre-slidre-ujb.no
++porsanger.no
++porsangu.no
++porsáŋgu.no
++xn--porsgu-sta26f.no
++porsgrunn.no
++radoy.no
++radøy.no
++xn--rady-ira.no
++rakkestad.no
++rana.no
++ruovat.no
++randaberg.no
++rauma.no
++rendalen.no
++rennebu.no
++rennesoy.no
++rennesøy.no
++xn--rennesy-v1a.no
++rindal.no
++ringebu.no
++ringerike.no
++ringsaker.no
++rissa.no
++risor.no
++risør.no
++xn--risr-ira.no
++roan.no
++rollag.no
++rygge.no
++ralingen.no
++rælingen.no
++xn--rlingen-mxa.no
++rodoy.no
++rødøy.no
++xn--rdy-0nab.no
++romskog.no
++rømskog.no
++xn--rmskog-bya.no
++roros.no
++røros.no
++xn--rros-gra.no
++rost.no
++røst.no
++xn--rst-0na.no
++royken.no
++røyken.no
++xn--ryken-vua.no
++royrvik.no
++røyrvik.no
++xn--ryrvik-bya.no
++rade.no
++råde.no
++xn--rde-ula.no
++salangen.no
++siellak.no
++saltdal.no
++salat.no
++sálát.no
++xn--slt-elab.no
++sálat.no
++xn--slat-5na.no
++samnanger.no
++sande.more-og-romsdal.no
++sande.møre-og-romsdal.no
++sande.xn--mre-og-romsdal-qqb.no
++sande.vestfold.no
++sandefjord.no
++sandnes.no
++sandoy.no
++sandøy.no
++xn--sandy-yua.no
++sarpsborg.no
++sauda.no
++sauherad.no
++sel.no
++selbu.no
++selje.no
++seljord.no
++sigdal.no
++siljan.no
++sirdal.no
++skaun.no
++skedsmo.no
++ski.no
++skien.no
++skiptvet.no
++skjervoy.no
++skjervøy.no
++xn--skjervy-v1a.no
++skierva.no
++skiervá.no
++xn--skierv-uta.no
++skjak.no
++skjåk.no
++xn--skjk-soa.no
++skodje.no
++skanland.no
++skånland.no
++xn--sknland-fxa.no
++skanit.no
++skánit.no
++xn--sknit-yqa.no
++smola.no
++smøla.no
++xn--smla-hra.no
++snillfjord.no
++snasa.no
++snåsa.no
++xn--snsa-roa.no
++snoasa.no
++snaase.no
++snåase.no
++xn--snase-nra.no
++sogndal.no
++sokndal.no
++sola.no
++solund.no
++songdalen.no
++sortland.no
++spydeberg.no
++stange.no
++stavanger.no
++steigen.no
++steinkjer.no
++stjordal.no
++stjørdal.no
++xn--stjrdal-s1a.no
++stokke.no
++stor-elvdal.no
++stord.no
++stordal.no
++storfjord.no
++omasvuotna.no
++strand.no
++stranda.no
++stryn.no
++sula.no
++suldal.no
++sund.no
++sunndal.no
++surnadal.no
++sveio.no
++svelvik.no
++sykkylven.no
++sogne.no
++søgne.no
++xn--sgne-gra.no
++somna.no
++sømna.no
++xn--smna-gra.no
++sondre-land.no
++søndre-land.no
++xn--sndre-land-0cb.no
++sor-aurdal.no
++sør-aurdal.no
++xn--sr-aurdal-l8a.no
++sor-fron.no
++sør-fron.no
++xn--sr-fron-q1a.no
++sor-odal.no
++sør-odal.no
++xn--sr-odal-q1a.no
++sor-varanger.no
++sør-varanger.no
++xn--sr-varanger-ggb.no
++matta-varjjat.no
++mátta-várjjat.no
++xn--mtta-vrjjat-k7af.no
++sorfold.no
++sørfold.no
++xn--srfold-bya.no
++sorreisa.no
++sørreisa.no
++xn--srreisa-q1a.no
++sorum.no
++sørum.no
++xn--srum-gra.no
++tana.no
++deatnu.no
++time.no
++tingvoll.no
++tinn.no
++tjeldsund.no
++dielddanuorri.no
++tjome.no
++tjøme.no
++xn--tjme-hra.no
++tokke.no
++tolga.no
++torsken.no
++tranoy.no
++tranøy.no
++xn--trany-yua.no
++tromso.no
++tromsø.no
++xn--troms-zua.no
++tromsa.no
++romsa.no
++trondheim.no
++troandin.no
++trysil.no
++trana.no
++træna.no
++xn--trna-woa.no
++trogstad.no
++trøgstad.no
++xn--trgstad-r1a.no
++tvedestrand.no
++tydal.no
++tynset.no
++tysfjord.no
++divtasvuodna.no
++divttasvuotna.no
++tysnes.no
++tysvar.no
++tysvær.no
++xn--tysvr-vra.no
++tonsberg.no
++tønsberg.no
++xn--tnsberg-q1a.no
++ullensaker.no
++ullensvang.no
++ulvik.no
++utsira.no
++vadso.no
++vadsø.no
++xn--vads-jra.no
++cahcesuolo.no
++Äáhcesuolo.no
++xn--hcesuolo-7ya35b.no
++vaksdal.no
++valle.no
++vang.no
++vanylven.no
++vardo.no
++vardø.no
++xn--vard-jra.no
++varggat.no
++várggát.no
++xn--vrggt-xqad.no
++vefsn.no
++vaapste.no
++vega.no
++vegarshei.no
++vegårshei.no
++xn--vegrshei-c0a.no
++vennesla.no
++verdal.no
++verran.no
++vestby.no
++vestnes.no
++vestre-slidre.no
++vestre-toten.no
++vestvagoy.no
++vestvågøy.no
++xn--vestvgy-ixa6o.no
++vevelstad.no
++vik.no
++vikna.no
++vindafjord.no
++volda.no
++voss.no
++varoy.no
++værøy.no
++xn--vry-yla5g.no
++vagan.no
++vågan.no
++xn--vgan-qoa.no
++voagat.no
++vagsoy.no
++vågsøy.no
++xn--vgsy-qoa0j.no
++vaga.no
++vågå.no
++xn--vg-yiab.no
++valer.ostfold.no
++våler.østfold.no
++xn--vler-qoa.xn--stfold-9xa.no
++valer.hedmark.no
++våler.hedmark.no
++xn--vler-qoa.hedmark.no
++
++// np : http://www.mos.com.np/register.html
++*.np
++
++// nr : http://cenpac.net.nr/dns/index.html
++// Confirmed by registry <technician@cenpac.net.nr> 2008-06-17
++nr
++biz.nr
++info.nr
++gov.nr
++edu.nr
++org.nr
++net.nr
++com.nr
++
++// nu : http://en.wikipedia.org/wiki/.nu
++nu
++
++// nz : http://en.wikipedia.org/wiki/.nz
++// Confirmed by registry <jay@nzrs.net.nz> 2014-05-19
++nz
++ac.nz
++co.nz
++cri.nz
++geek.nz
++gen.nz
++govt.nz
++health.nz
++iwi.nz
++kiwi.nz
++maori.nz
++mil.nz
++mÄori.nz
++xn--mori-qsa.nz
++net.nz
++org.nz
++parliament.nz
++school.nz
++
++// om : http://en.wikipedia.org/wiki/.om
++om
++co.om
++com.om
++edu.om
++gov.om
++med.om
++museum.om
++net.om
++org.om
++pro.om
++
++// org : http://en.wikipedia.org/wiki/.org
++org
++
++// pa : http://www.nic.pa/
++// Some additional second level "domains" resolve directly as hostnames, such as
++// pannet.pa, so we add a rule for "pa".
++pa
++ac.pa
++gob.pa
++com.pa
++org.pa
++sld.pa
++edu.pa
++net.pa
++ing.pa
++abo.pa
++med.pa
++nom.pa
++
++// pe : https://www.nic.pe/InformeFinalComision.pdf
++pe
++edu.pe
++gob.pe
++nom.pe
++mil.pe
++org.pe
++com.pe
++net.pe
++
++// pf : http://www.gobin.info/domainname/formulaire-pf.pdf
++pf
++com.pf
++org.pf
++edu.pf
++
++// pg : http://en.wikipedia.org/wiki/.pg
++*.pg
++
++// ph : http://www.domains.ph/FAQ2.asp
++// Submitted by registry <jed@email.com.ph> 2008-06-13
++ph
++com.ph
++net.ph
++org.ph
++gov.ph
++edu.ph
++ngo.ph
++mil.ph
++i.ph
++
++// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK
++pk
++com.pk
++net.pk
++edu.pk
++org.pk
++fam.pk
++biz.pk
++web.pk
++gov.pk
++gob.pk
++gok.pk
++gon.pk
++gop.pk
++gos.pk
++info.pk
++
++// pl http://www.dns.pl/english/index.html
++// updated by .PL registry on 2015-04-28
++pl
++com.pl
++net.pl
++org.pl
++// pl functional domains (http://www.dns.pl/english/index.html)
++aid.pl
++agro.pl
++atm.pl
++auto.pl
++biz.pl
++edu.pl
++gmina.pl
++gsm.pl
++info.pl
++mail.pl
++miasta.pl
++media.pl
++mil.pl
++nieruchomosci.pl
++nom.pl
++pc.pl
++powiat.pl
++priv.pl
++realestate.pl
++rel.pl
++sex.pl
++shop.pl
++sklep.pl
++sos.pl
++szkola.pl
++targi.pl
++tm.pl
++tourism.pl
++travel.pl
++turystyka.pl
++// Government domains
++gov.pl
++ap.gov.pl
++ic.gov.pl
++is.gov.pl
++us.gov.pl
++kmpsp.gov.pl
++kppsp.gov.pl
++kwpsp.gov.pl
++psp.gov.pl
++wskr.gov.pl
++kwp.gov.pl
++mw.gov.pl
++ug.gov.pl
++um.gov.pl
++umig.gov.pl
++ugim.gov.pl
++upow.gov.pl
++uw.gov.pl
++starostwo.gov.pl
++pa.gov.pl
++po.gov.pl
++psse.gov.pl
++pup.gov.pl
++rzgw.gov.pl
++sa.gov.pl
++so.gov.pl
++sr.gov.pl
++wsa.gov.pl
++sko.gov.pl
++uzs.gov.pl
++wiih.gov.pl
++winb.gov.pl
++pinb.gov.pl
++wios.gov.pl
++witd.gov.pl
++wzmiuw.gov.pl
++piw.gov.pl
++wiw.gov.pl
++griw.gov.pl
++wif.gov.pl
++oum.gov.pl
++sdn.gov.pl
++zp.gov.pl
++uppo.gov.pl
++mup.gov.pl
++wuoz.gov.pl
++konsulat.gov.pl
++oirm.gov.pl
++// pl regional domains (http://www.dns.pl/english/index.html)
++augustow.pl
++babia-gora.pl
++bedzin.pl
++beskidy.pl
++bialowieza.pl
++bialystok.pl
++bielawa.pl
++bieszczady.pl
++boleslawiec.pl
++bydgoszcz.pl
++bytom.pl
++cieszyn.pl
++czeladz.pl
++czest.pl
++dlugoleka.pl
++elblag.pl
++elk.pl
++glogow.pl
++gniezno.pl
++gorlice.pl
++grajewo.pl
++ilawa.pl
++jaworzno.pl
++jelenia-gora.pl
++jgora.pl
++kalisz.pl
++kazimierz-dolny.pl
++karpacz.pl
++kartuzy.pl
++kaszuby.pl
++katowice.pl
++kepno.pl
++ketrzyn.pl
++klodzko.pl
++kobierzyce.pl
++kolobrzeg.pl
++konin.pl
++konskowola.pl
++kutno.pl
++lapy.pl
++lebork.pl
++legnica.pl
++lezajsk.pl
++limanowa.pl
++lomza.pl
++lowicz.pl
++lubin.pl
++lukow.pl
++malbork.pl
++malopolska.pl
++mazowsze.pl
++mazury.pl
++mielec.pl
++mielno.pl
++mragowo.pl
++naklo.pl
++nowaruda.pl
++nysa.pl
++olawa.pl
++olecko.pl
++olkusz.pl
++olsztyn.pl
++opoczno.pl
++opole.pl
++ostroda.pl
++ostroleka.pl
++ostrowiec.pl
++ostrowwlkp.pl
++pila.pl
++pisz.pl
++podhale.pl
++podlasie.pl
++polkowice.pl
++pomorze.pl
++pomorskie.pl
++prochowice.pl
++pruszkow.pl
++przeworsk.pl
++pulawy.pl
++radom.pl
++rawa-maz.pl
++rybnik.pl
++rzeszow.pl
++sanok.pl
++sejny.pl
++slask.pl
++slupsk.pl
++sosnowiec.pl
++stalowa-wola.pl
++skoczow.pl
++starachowice.pl
++stargard.pl
++suwalki.pl
++swidnica.pl
++swiebodzin.pl
++swinoujscie.pl
++szczecin.pl
++szczytno.pl
++tarnobrzeg.pl
++tgory.pl
++turek.pl
++tychy.pl
++ustka.pl
++walbrzych.pl
++warmia.pl
++warszawa.pl
++waw.pl
++wegrow.pl
++wielun.pl
++wlocl.pl
++wloclawek.pl
++wodzislaw.pl
++wolomin.pl
++wroclaw.pl
++zachpomor.pl
++zagan.pl
++zarow.pl
++zgora.pl
++zgorzelec.pl
++
++// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf
++pm
++
++// pn : http://www.government.pn/PnRegistry/policies.htm
++pn
++gov.pn
++co.pn
++org.pn
++edu.pn
++net.pn
++
++// post : http://en.wikipedia.org/wiki/.post
++post
++
++// pr : http://www.nic.pr/index.asp?f=1
++pr
++com.pr
++net.pr
++org.pr
++gov.pr
++edu.pr
++isla.pr
++pro.pr
++biz.pr
++info.pr
++name.pr
++// these aren't mentioned on nic.pr, but on http://en.wikipedia.org/wiki/.pr
++est.pr
++prof.pr
++ac.pr
++
++// pro : http://www.nic.pro/support_faq.htm
++pro
++aca.pro
++bar.pro
++cpa.pro
++jur.pro
++law.pro
++med.pro
++eng.pro
++
++// ps : http://en.wikipedia.org/wiki/.ps
++// http://www.nic.ps/registration/policy.html#reg
++ps
++edu.ps
++gov.ps
++sec.ps
++plo.ps
++com.ps
++org.ps
++net.ps
++
++// pt : http://online.dns.pt/dns/start_dns
++pt
++net.pt
++gov.pt
++org.pt
++edu.pt
++int.pt
++publ.pt
++com.pt
++nome.pt
++
++// pw : http://en.wikipedia.org/wiki/.pw
++pw
++co.pw
++ne.pw
++or.pw
++ed.pw
++go.pw
++belau.pw
++
++// py : http://www.nic.py/pautas.html#seccion_9
++// Confirmed by registry 2012-10-03
++py
++com.py
++coop.py
++edu.py
++gov.py
++mil.py
++net.py
++org.py
++
++// qa : http://domains.qa/en/
++qa
++com.qa
++edu.qa
++gov.qa
++mil.qa
++name.qa
++net.qa
++org.qa
++sch.qa
++
++// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs
++re
++com.re
++asso.re
++nom.re
++
++// ro : http://www.rotld.ro/
++ro
++com.ro
++org.ro
++tm.ro
++nt.ro
++nom.ro
++info.ro
++rec.ro
++arts.ro
++firm.ro
++store.ro
++www.ro
++
++// rs : http://en.wikipedia.org/wiki/.rs
++rs
++co.rs
++org.rs
++edu.rs
++ac.rs
++gov.rs
++in.rs
++
++// ru : http://www.cctld.ru/ru/docs/aktiv_8.php
++// Industry domains
++ru
++ac.ru
++com.ru
++edu.ru
++int.ru
++net.ru
++org.ru
++pp.ru
++// Geographical domains
++adygeya.ru
++altai.ru
++amur.ru
++arkhangelsk.ru
++astrakhan.ru
++bashkiria.ru
++belgorod.ru
++bir.ru
++bryansk.ru
++buryatia.ru
++cbg.ru
++chel.ru
++chelyabinsk.ru
++chita.ru
++chukotka.ru
++chuvashia.ru
++dagestan.ru
++dudinka.ru
++e-burg.ru
++grozny.ru
++irkutsk.ru
++ivanovo.ru
++izhevsk.ru
++jar.ru
++joshkar-ola.ru
++kalmykia.ru
++kaluga.ru
++kamchatka.ru
++karelia.ru
++kazan.ru
++kchr.ru
++kemerovo.ru
++khabarovsk.ru
++khakassia.ru
++khv.ru
++kirov.ru
++koenig.ru
++komi.ru
++kostroma.ru
++krasnoyarsk.ru
++kuban.ru
++kurgan.ru
++kursk.ru
++lipetsk.ru
++magadan.ru
++mari.ru
++mari-el.ru
++marine.ru
++mordovia.ru
++// mosreg.ru Bug 1090800 - removed at request of Aleksey Konstantinov <konstantinovav@mosreg.ru>
++msk.ru
++murmansk.ru
++nalchik.ru
++nnov.ru
++nov.ru
++novosibirsk.ru
++nsk.ru
++omsk.ru
++orenburg.ru
++oryol.ru
++palana.ru
++penza.ru
++perm.ru
++ptz.ru
++rnd.ru
++ryazan.ru
++sakhalin.ru
++samara.ru
++saratov.ru
++simbirsk.ru
++smolensk.ru
++spb.ru
++stavropol.ru
++stv.ru
++surgut.ru
++tambov.ru
++tatarstan.ru
++tom.ru
++tomsk.ru
++tsaritsyn.ru
++tsk.ru
++tula.ru
++tuva.ru
++tver.ru
++tyumen.ru
++udm.ru
++udmurtia.ru
++ulan-ude.ru
++vladikavkaz.ru
++vladimir.ru
++vladivostok.ru
++volgograd.ru
++vologda.ru
++voronezh.ru
++vrn.ru
++vyatka.ru
++yakutia.ru
++yamal.ru
++yaroslavl.ru
++yekaterinburg.ru
++yuzhno-sakhalinsk.ru
++// More geographical domains
++amursk.ru
++baikal.ru
++cmw.ru
++fareast.ru
++jamal.ru
++kms.ru
++k-uralsk.ru
++kustanai.ru
++kuzbass.ru
++magnitka.ru
++mytis.ru
++nakhodka.ru
++nkz.ru
++norilsk.ru
++oskol.ru
++pyatigorsk.ru
++rubtsovsk.ru
++snz.ru
++syzran.ru
++vdonsk.ru
++zgrad.ru
++// State domains
++gov.ru
++mil.ru
++// Technical domains
++test.ru
++
++// rw : http://www.nic.rw/cgi-bin/policy.pl
++rw
++gov.rw
++net.rw
++edu.rw
++ac.rw
++com.rw
++co.rw
++int.rw
++mil.rw
++gouv.rw
++
++// sa : http://www.nic.net.sa/
++sa
++com.sa
++net.sa
++org.sa
++gov.sa
++med.sa
++pub.sa
++edu.sa
++sch.sa
++
++// sb : http://www.sbnic.net.sb/
++// Submitted by registry <lee.humphries@telekom.com.sb> 2008-06-08
++sb
++com.sb
++edu.sb
++gov.sb
++net.sb
++org.sb
++
++// sc : http://www.nic.sc/
++sc
++com.sc
++gov.sc
++net.sc
++org.sc
++edu.sc
++
++// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm
++// Submitted by registry <admin@isoc.sd> 2008-06-17
++sd
++com.sd
++net.sd
++org.sd
++edu.sd
++med.sd
++tv.sd
++gov.sd
++info.sd
++
++// se : http://en.wikipedia.org/wiki/.se
++// Submitted by registry <patrik.wallstrom@iis.se> 2014-03-18
++se
++a.se
++ac.se
++b.se
++bd.se
++brand.se
++c.se
++d.se
++e.se
++f.se
++fh.se
++fhsk.se
++fhv.se
++g.se
++h.se
++i.se
++k.se
++komforb.se
++kommunalforbund.se
++komvux.se
++l.se
++lanbib.se
++m.se
++n.se
++naturbruksgymn.se
++o.se
++org.se
++p.se
++parti.se
++pp.se
++press.se
++r.se
++s.se
++t.se
++tm.se
++u.se
++w.se
++x.se
++y.se
++z.se
++
++// sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines
++sg
++com.sg
++net.sg
++org.sg
++gov.sg
++edu.sg
++per.sg
++
++// sh : http://www.nic.sh/registrar.html
++sh
++com.sh
++net.sh
++gov.sh
++org.sh
++mil.sh
++
++// si : http://en.wikipedia.org/wiki/.si
++si
++
++// sj : No registrations at this time.
++// Submitted by registry <jarle@uninett.no> 2008-06-16
++sj
++
++// sk : http://en.wikipedia.org/wiki/.sk
++// list of 2nd level domains ?
++sk
++
++// sl : http://www.nic.sl
++// Submitted by registry <adam@neoip.com> 2008-06-12
++sl
++com.sl
++net.sl
++edu.sl
++gov.sl
++org.sl
++
++// sm : http://en.wikipedia.org/wiki/.sm
++sm
++
++// sn : http://en.wikipedia.org/wiki/.sn
++sn
++art.sn
++com.sn
++edu.sn
++gouv.sn
++org.sn
++perso.sn
++univ.sn
++
++// so : http://www.soregistry.com/
++so
++com.so
++net.so
++org.so
++
++// sr : http://en.wikipedia.org/wiki/.sr
++sr
++
++// st : http://www.nic.st/html/policyrules/
++st
++co.st
++com.st
++consulado.st
++edu.st
++embaixada.st
++gov.st
++mil.st
++net.st
++org.st
++principe.st
++saotome.st
++store.st
++
++// su : http://en.wikipedia.org/wiki/.su
++su
++adygeya.su
++arkhangelsk.su
++balashov.su
++bashkiria.su
++bryansk.su
++dagestan.su
++grozny.su
++ivanovo.su
++kalmykia.su
++kaluga.su
++karelia.su
++khakassia.su
++krasnodar.su
++kurgan.su
++lenug.su
++mordovia.su
++msk.su
++murmansk.su
++nalchik.su
++nov.su
++obninsk.su
++penza.su
++pokrovsk.su
++sochi.su
++spb.su
++togliatti.su
++troitsk.su
++tula.su
++tuva.su
++vladikavkaz.su
++vladimir.su
++vologda.su
++
++// sv : http://www.svnet.org.sv/niveldos.pdf
++sv
++com.sv
++edu.sv
++gob.sv
++org.sv
++red.sv
++
++// sx : http://en.wikipedia.org/wiki/.sx
++// Confirmed by registry <jcvignes@openregistry.com> 2012-05-31
++sx
++gov.sx
++
++// sy : http://en.wikipedia.org/wiki/.sy
++// see also: http://www.gobin.info/domainname/sy.doc
++sy
++edu.sy
++gov.sy
++net.sy
++mil.sy
++com.sy
++org.sy
++
++// sz : http://en.wikipedia.org/wiki/.sz
++// http://www.sispa.org.sz/
++sz
++co.sz
++ac.sz
++org.sz
++
++// tc : http://en.wikipedia.org/wiki/.tc
++tc
++
++// td : http://en.wikipedia.org/wiki/.td
++td
++
++// tel: http://en.wikipedia.org/wiki/.tel
++// http://www.telnic.org/
++tel
++
++// tf : http://en.wikipedia.org/wiki/.tf
++tf
++
++// tg : http://en.wikipedia.org/wiki/.tg
++// http://www.nic.tg/
++tg
++
++// th : http://en.wikipedia.org/wiki/.th
++// Submitted by registry <krit@thains.co.th> 2008-06-17
++th
++ac.th
++co.th
++go.th
++in.th
++mi.th
++net.th
++or.th
++
++// tj : http://www.nic.tj/policy.html
++tj
++ac.tj
++biz.tj
++co.tj
++com.tj
++edu.tj
++go.tj
++gov.tj
++int.tj
++mil.tj
++name.tj
++net.tj
++nic.tj
++org.tj
++test.tj
++web.tj
++
++// tk : http://en.wikipedia.org/wiki/.tk
++tk
++
++// tl : http://en.wikipedia.org/wiki/.tl
++tl
++gov.tl
++
++// tm : http://www.nic.tm/local.html
++tm
++com.tm
++co.tm
++org.tm
++net.tm
++nom.tm
++gov.tm
++mil.tm
++edu.tm
++
++// tn : http://en.wikipedia.org/wiki/.tn
++// http://whois.ati.tn/
++tn
++com.tn
++ens.tn
++fin.tn
++gov.tn
++ind.tn
++intl.tn
++nat.tn
++net.tn
++org.tn
++info.tn
++perso.tn
++tourism.tn
++edunet.tn
++rnrt.tn
++rns.tn
++rnu.tn
++mincom.tn
++agrinet.tn
++defense.tn
++turen.tn
++
++// to : http://en.wikipedia.org/wiki/.to
++// Submitted by registry <egullich@colo.to> 2008-06-17
++to
++com.to
++gov.to
++net.to
++org.to
++edu.to
++mil.to
++
++// tp : No registrations at this time.
++// Submitted by Ryan Sleevi <ryan.sleevi@gmail.com> 2014-01-03
++tp
++
++// subTLDs: https://www.nic.tr/forms/eng/policies.pdf
++// and: https://www.nic.tr/forms/politikalar.pdf
++// Submitted by <mehmetgurevin@gmail.com> 2014-07-19
++tr
++com.tr
++info.tr
++biz.tr
++net.tr
++org.tr
++web.tr
++gen.tr
++tv.tr
++av.tr
++dr.tr
++bbs.tr
++name.tr
++tel.tr
++gov.tr
++bel.tr
++pol.tr
++mil.tr
++k12.tr
++edu.tr
++kep.tr
++
++// Used by Northern Cyprus
++nc.tr
++
++// Used by government agencies of Northern Cyprus
++gov.nc.tr
++
++// travel : http://en.wikipedia.org/wiki/.travel
++travel
++
++// tt : http://www.nic.tt/
++tt
++co.tt
++com.tt
++org.tt
++net.tt
++biz.tt
++info.tt
++pro.tt
++int.tt
++coop.tt
++jobs.tt
++mobi.tt
++travel.tt
++museum.tt
++aero.tt
++name.tt
++gov.tt
++edu.tt
++
++// tv : http://en.wikipedia.org/wiki/.tv
++// Not listing any 2LDs as reserved since none seem to exist in practice,
++// Wikipedia notwithstanding.
++tv
++
++// tw : http://en.wikipedia.org/wiki/.tw
++tw
++edu.tw
++gov.tw
++mil.tw
++com.tw
++net.tw
++org.tw
++idv.tw
++game.tw
++ebiz.tw
++club.tw
++網路.tw
++xn--zf0ao64a.tw
++組織.tw
++xn--uc0atv.tw
++商業.tw
++xn--czrw28b.tw
++
++// tz : http://www.tznic.or.tz/index.php/domains
++// Confirmed by registry <manager@tznic.or.tz> 2013-01-22
++tz
++ac.tz
++co.tz
++go.tz
++hotel.tz
++info.tz
++me.tz
++mil.tz
++mobi.tz
++ne.tz
++or.tz
++sc.tz
++tv.tz
++
++// ua : https://hostmaster.ua/policy/?ua
++// Submitted by registry <dk@cctld.ua> 2012-04-27
++ua
++// ua 2LD
++com.ua
++edu.ua
++gov.ua
++in.ua
++net.ua
++org.ua
++// ua geographic names
++// https://hostmaster.ua/2ld/
++cherkassy.ua
++cherkasy.ua
++chernigov.ua
++chernihiv.ua
++chernivtsi.ua
++chernovtsy.ua
++ck.ua
++cn.ua
++cr.ua
++crimea.ua
++cv.ua
++dn.ua
++dnepropetrovsk.ua
++dnipropetrovsk.ua
++dominic.ua
++donetsk.ua
++dp.ua
++if.ua
++ivano-frankivsk.ua
++kh.ua
++kharkiv.ua
++kharkov.ua
++kherson.ua
++khmelnitskiy.ua
++khmelnytskyi.ua
++kiev.ua
++kirovograd.ua
++km.ua
++kr.ua
++krym.ua
++ks.ua
++kv.ua
++kyiv.ua
++lg.ua
++lt.ua
++lugansk.ua
++lutsk.ua
++lv.ua
++lviv.ua
++mk.ua
++mykolaiv.ua
++nikolaev.ua
++od.ua
++odesa.ua
++odessa.ua
++pl.ua
++poltava.ua
++rivne.ua
++rovno.ua
++rv.ua
++sb.ua
++sebastopol.ua
++sevastopol.ua
++sm.ua
++sumy.ua
++te.ua
++ternopil.ua
++uz.ua
++uzhgorod.ua
++vinnica.ua
++vinnytsia.ua
++vn.ua
++volyn.ua
++yalta.ua
++zaporizhzhe.ua
++zaporizhzhia.ua
++zhitomir.ua
++zhytomyr.ua
++zp.ua
++zt.ua
++
++// Private registries in .ua
++co.ua
++pp.ua
++
++// ug : https://www.registry.co.ug/
++ug
++co.ug
++or.ug
++ac.ug
++sc.ug
++go.ug
++ne.ug
++com.ug
++org.ug
++
++// uk : http://en.wikipedia.org/wiki/.uk
++// Submitted by registry <Michael.Daly@nominet.org.uk>
++uk
++ac.uk
++co.uk
++gov.uk
++ltd.uk
++me.uk
++net.uk
++nhs.uk
++org.uk
++plc.uk
++police.uk
++*.sch.uk
++
++// us : http://en.wikipedia.org/wiki/.us
++us
++dni.us
++fed.us
++isa.us
++kids.us
++nsn.us
++// us geographic names
++ak.us
++al.us
++ar.us
++as.us
++az.us
++ca.us
++co.us
++ct.us
++dc.us
++de.us
++fl.us
++ga.us
++gu.us
++hi.us
++ia.us
++id.us
++il.us
++in.us
++ks.us
++ky.us
++la.us
++ma.us
++md.us
++me.us
++mi.us
++mn.us
++mo.us
++ms.us
++mt.us
++nc.us
++nd.us
++ne.us
++nh.us
++nj.us
++nm.us
++nv.us
++ny.us
++oh.us
++ok.us
++or.us
++pa.us
++pr.us
++ri.us
++sc.us
++sd.us
++tn.us
++tx.us
++ut.us
++vi.us
++vt.us
++va.us
++wa.us
++wi.us
++wv.us
++wy.us
++// The registrar notes several more specific domains available in each state,
++// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat
++// haphazard; in some states these domains resolve as addresses, while in others
++// only subdomains are available, or even nothing at all. We include the
++// most common ones where it's clear that different sites are different
++// entities.
++k12.ak.us
++k12.al.us
++k12.ar.us
++k12.as.us
++k12.az.us
++k12.ca.us
++k12.co.us
++k12.ct.us
++k12.dc.us
++k12.de.us
++k12.fl.us
++k12.ga.us
++k12.gu.us
++// k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login
++k12.ia.us
++k12.id.us
++k12.il.us
++k12.in.us
++k12.ks.us
++k12.ky.us
++k12.la.us
++k12.ma.us
++k12.md.us
++k12.me.us
++k12.mi.us
++k12.mn.us
++k12.mo.us
++k12.ms.us
++k12.mt.us
++k12.nc.us
++// k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov>
++k12.ne.us
++k12.nh.us
++k12.nj.us
++k12.nm.us
++k12.nv.us
++k12.ny.us
++k12.oh.us
++k12.ok.us
++k12.or.us
++k12.pa.us
++k12.pr.us
++k12.ri.us
++k12.sc.us
++// k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us>
++k12.tn.us
++k12.tx.us
++k12.ut.us
++k12.vi.us
++k12.vt.us
++k12.va.us
++k12.wa.us
++k12.wi.us
++// k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu>
++k12.wy.us
++cc.ak.us
++cc.al.us
++cc.ar.us
++cc.as.us
++cc.az.us
++cc.ca.us
++cc.co.us
++cc.ct.us
++cc.dc.us
++cc.de.us
++cc.fl.us
++cc.ga.us
++cc.gu.us
++cc.hi.us
++cc.ia.us
++cc.id.us
++cc.il.us
++cc.in.us
++cc.ks.us
++cc.ky.us
++cc.la.us
++cc.ma.us
++cc.md.us
++cc.me.us
++cc.mi.us
++cc.mn.us
++cc.mo.us
++cc.ms.us
++cc.mt.us
++cc.nc.us
++cc.nd.us
++cc.ne.us
++cc.nh.us
++cc.nj.us
++cc.nm.us
++cc.nv.us
++cc.ny.us
++cc.oh.us
++cc.ok.us
++cc.or.us
++cc.pa.us
++cc.pr.us
++cc.ri.us
++cc.sc.us
++cc.sd.us
++cc.tn.us
++cc.tx.us
++cc.ut.us
++cc.vi.us
++cc.vt.us
++cc.va.us
++cc.wa.us
++cc.wi.us
++cc.wv.us
++cc.wy.us
++lib.ak.us
++lib.al.us
++lib.ar.us
++lib.as.us
++lib.az.us
++lib.ca.us
++lib.co.us
++lib.ct.us
++lib.dc.us
++lib.de.us
++lib.fl.us
++lib.ga.us
++lib.gu.us
++lib.hi.us
++lib.ia.us
++lib.id.us
++lib.il.us
++lib.in.us
++lib.ks.us
++lib.ky.us
++lib.la.us
++lib.ma.us
++lib.md.us
++lib.me.us
++lib.mi.us
++lib.mn.us
++lib.mo.us
++lib.ms.us
++lib.mt.us
++lib.nc.us
++lib.nd.us
++lib.ne.us
++lib.nh.us
++lib.nj.us
++lib.nm.us
++lib.nv.us
++lib.ny.us
++lib.oh.us
++lib.ok.us
++lib.or.us
++lib.pa.us
++lib.pr.us
++lib.ri.us
++lib.sc.us
++lib.sd.us
++lib.tn.us
++lib.tx.us
++lib.ut.us
++lib.vi.us
++lib.vt.us
++lib.va.us
++lib.wa.us
++lib.wi.us
++// lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us>
++lib.wy.us
++// k12.ma.us contains school districts in Massachusetts. The 4LDs are
++// managed indepedently except for private (PVT), charter (CHTR) and
++// parochial (PAROCH) schools. Those are delegated dorectly to the
++// 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net>
++pvt.k12.ma.us
++chtr.k12.ma.us
++paroch.k12.ma.us
++
++// uy : http://www.nic.org.uy/
++uy
++com.uy
++edu.uy
++gub.uy
++mil.uy
++net.uy
++org.uy
++
++// uz : http://www.reg.uz/
++uz
++co.uz
++com.uz
++net.uz
++org.uz
++
++// va : http://en.wikipedia.org/wiki/.va
++va
++
++// vc : http://en.wikipedia.org/wiki/.vc
++// Submitted by registry <kshah@ca.afilias.info> 2008-06-13
++vc
++com.vc
++net.vc
++org.vc
++gov.vc
++mil.vc
++edu.vc
++
++// ve : https://registro.nic.ve/
++// Confirmed by registry 2012-10-04
++// Updated 2014-05-20 - Bug 940478
++ve
++arts.ve
++co.ve
++com.ve
++e12.ve
++edu.ve
++firm.ve
++gob.ve
++gov.ve
++info.ve
++int.ve
++mil.ve
++net.ve
++org.ve
++rec.ve
++store.ve
++tec.ve
++web.ve
++
++// vg : http://en.wikipedia.org/wiki/.vg
++vg
++
++// vi : http://www.nic.vi/newdomainform.htm
++// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other
++// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they
++// are available for registration (which they do not seem to be).
++vi
++co.vi
++com.vi
++k12.vi
++net.vi
++org.vi
++
++// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp
++vn
++com.vn
++net.vn
++org.vn
++edu.vn
++gov.vn
++int.vn
++ac.vn
++biz.vn
++info.vn
++name.vn
++pro.vn
++health.vn
++
++// vu : http://en.wikipedia.org/wiki/.vu
++// http://www.vunic.vu/
++vu
++com.vu
++edu.vu
++net.vu
++org.vu
++
++// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf
++wf
++
++// ws : http://en.wikipedia.org/wiki/.ws
++// http://samoanic.ws/index.dhtml
++ws
++com.ws
++net.ws
++org.ws
++gov.ws
++edu.ws
++
++// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf
++yt
++
++// IDN ccTLDs
++// When submitting patches, please maintain a sort by ISO 3166 ccTLD, then
++// U-label, and follow this format:
++// // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD>
++// // [sponsoring org]
++// U-Label
++
++// xn--mgbaam7a8h ("Emerat", Arabic) : AE
++// http://nic.ae/english/arabicdomain/rules.jsp
++امارات
++xn--mgbaam7a8h
++
++// xn--y9a3aq ("hye", Armenian) : AM
++// ISOC AM (operated by .am Registry)
++Õ°Õ¡Õµ
++xn--y9a3aq
++
++// xn--54b7fta0cc ("Bangla", Bangla) : BD
++বাংলা
++xn--54b7fta0cc
++
++// xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY
++// Operated by .by registry
++бел
++xn--90ais
++
++// xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN
++// CNNIC
++// http://cnnic.cn/html/Dir/2005/10/11/3218.htm
++中国
++xn--fiqs8s
++
++// xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN
++// CNNIC
++// http://cnnic.cn/html/Dir/2005/10/11/3218.htm
++中國
++xn--fiqz9s
++
++// xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ
++الجزائر
++xn--lgbbat1ad8j
++
++// xn--wgbh1c ("Egypt/Masr", Arabic) : EG
++// http://www.dotmasr.eg/
++مصر
++xn--wgbh1c
++
++// xn--node ("ge", Georgian Mkhedruli) : GE
++გე
++xn--node
++
++// xn--qxam ("el", Greek) : GR
++// Hellenic Ministry of Infrastructure, Transport, and Networks
++ελ
++xn--qxam
++
++// xn--j6w193g ("Hong Kong", Chinese) : HK
++// https://www2.hkirc.hk/register/rules.jsp
++香港
++xn--j6w193g
++
++// xn--h2brj9c ("Bharat", Devanagari) : IN
++// India
++भारत
++xn--h2brj9c
++
++// xn--mgbbh1a71e ("Bharat", Arabic) : IN
++// India
++بھارت
++xn--mgbbh1a71e
++
++// xn--fpcrj9c3d ("Bharat", Telugu) : IN
++// India
++భారతà±
++xn--fpcrj9c3d
++
++// xn--gecrj9c ("Bharat", Gujarati) : IN
++// India
++ભારત
++xn--gecrj9c
++
++// xn--s9brj9c ("Bharat", Gurmukhi) : IN
++// India
++ਭਾਰਤ
++xn--s9brj9c
++
++// xn--45brj9c ("Bharat", Bengali) : IN
++// India
++ভারত
++xn--45brj9c
++
++// xn--xkc2dl3a5ee0h ("India", Tamil) : IN
++// India
++இநà¯à®¤à®¿à®¯à®¾
++xn--xkc2dl3a5ee0h
++
++// xn--mgba3a4f16a ("Iran", Persian) : IR
++ایران
++xn--mgba3a4f16a
++
++// xn--mgba3a4fra ("Iran", Arabic) : IR
++ايران
++xn--mgba3a4fra
++
++// xn--mgbtx2b ("Iraq", Arabic) : IQ
++// Communications and Media Commission
++عراق
++xn--mgbtx2b
++
++// xn--mgbayh7gpa ("al-Ordon", Arabic) : JO
++// National Information Technology Center (NITC)
++// Royal Scientific Society, Al-Jubeiha
++الاردن
++xn--mgbayh7gpa
++
++// xn--3e0b707e ("Republic of Korea", Hangul) : KR
++한국
++xn--3e0b707e
++
++// xn--80ao21a ("Kaz", Kazakh) : KZ
++қаз
++xn--80ao21a
++
++// xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK
++// http://nic.lk
++ලංකà·
++xn--fzc2c9e2c
++
++// xn--xkc2al3hye2a ("Ilangai", Tamil) : LK
++// http://nic.lk
++இலஙà¯à®•à¯ˆ
++xn--xkc2al3hye2a
++
++// xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA
++المغرب
++xn--mgbc0a9azcg
++
++// xn--d1alf ("mkd", Macedonian) : MK
++// MARnet
++мкд
++xn--d1alf
++
++// xn--l1acc ("mon", Mongolian) : MN
++мон
++xn--l1acc
++
++// xn--mix891f ("Macao", Chinese, Traditional) : MO
++// MONIC / HNET Asia (Registry Operator for .mo)
++澳門
++xn--mix891f
++
++// xn--mix082f ("Macao", Chinese, Simplified) : MO
++澳门
++xn--mix082f
++
++// xn--mgbx4cd0ab ("Malaysia", Malay) : MY
++مليسيا
++xn--mgbx4cd0ab
++
++// xn--mgb9awbf ("Oman", Arabic) : OM
++عمان
++xn--mgb9awbf
++
++// xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK
++پاکستان
++xn--mgbai9azgqp6j
++
++// xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK
++پاكستان
++xn--mgbai9a5eva00b
++
++// xn--ygbi2ammx ("Falasteen", Arabic) : PS
++// The Palestinian National Internet Naming Authority (PNINA)
++// http://www.pnina.ps
++Ùلسطين
++xn--ygbi2ammx
++
++// xn--90a3ac ("srb", Cyrillic) : RS
++// http://www.rnids.rs/en/the-.Ñрб-domain
++Ñрб
++xn--90a3ac
++пр.Ñрб
++xn--o1ac.xn--90a3ac
++орг.Ñрб
++xn--c1avg.xn--90a3ac
++обр.Ñрб
++xn--90azh.xn--90a3ac
++од.Ñрб
++xn--d1at.xn--90a3ac
++упр.Ñрб
++xn--o1ach.xn--90a3ac
++ак.Ñрб
++xn--80au.xn--90a3ac
++
++// xn--p1ai ("rf", Russian-Cyrillic) : RU
++// http://www.cctld.ru/en/docs/rulesrf.php
++рф
++xn--p1ai
++
++// xn--wgbl6a ("Qatar", Arabic) : QA
++// http://www.ict.gov.qa/
++قطر
++xn--wgbl6a
++
++// xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA
++// http://www.nic.net.sa/
++السعودية
++xn--mgberp4a5d4ar
++
++// xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA
++السعودیة
++xn--mgberp4a5d4a87g
++
++// xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA
++السعودیۃ
++xn--mgbqly7c0a67fbc
++
++// xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA
++السعوديه
++xn--mgbqly7cvafr
++
++// xn--mgbpl2fh ("sudan", Arabic) : SD
++// Operated by .sd registry
++سودان
++xn--mgbpl2fh
++
++// xn--yfro4i67o Singapore ("Singapore", Chinese) : SG
++新加å¡
++xn--yfro4i67o
++
++// xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG
++சிஙà¯à®•à®ªà¯à®ªà¯‚à®°à¯
++xn--clchc0ea0b2g2a9gcd
++
++// xn--ogbpf8fl ("Syria", Arabic) : SY
++سورية
++xn--ogbpf8fl
++
++// xn--mgbtf8fl ("Syria", Arabic, variant) : SY
++سوريا
++xn--mgbtf8fl
++
++// xn--o3cw4h ("Thai", Thai) : TH
++// http://www.thnic.co.th
++ไทย
++xn--o3cw4h
++
++// xn--pgbs0dh ("Tunisia", Arabic) : TN
++// http://nic.tn
++تونس
++xn--pgbs0dh
++
++// xn--kpry57d ("Taiwan", Chinese, Traditional) : TW
++// http://www.twnic.net/english/dn/dn_07a.htm
++å°ç£
++xn--kpry57d
++
++// xn--kprw13d ("Taiwan", Chinese, Simplified) : TW
++// http://www.twnic.net/english/dn/dn_07a.htm
++å°æ¹¾
++xn--kprw13d
++
++// xn--nnx388a ("Taiwan", Chinese, variant) : TW
++臺ç£
++xn--nnx388a
++
++// xn--j1amh ("ukr", Cyrillic) : UA
++укр
++xn--j1amh
++
++// xn--mgb2ddes ("AlYemen", Arabic) : YE
++اليمن
++xn--mgb2ddes
++
++// xxx : http://icmregistry.com
++xxx
++
++// ye : http://www.y.net.ye/services/domain_name.htm
++*.ye
++
++// za : http://www.zadna.org.za/slds.html
++*.za
++
++// zm : http://en.wikipedia.org/wiki/.zm
++*.zm
++
++// zw : http://en.wikipedia.org/wiki/.zw
++*.zw
++
++
++// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2015-05-06T09:31:08Z
++
++// aaa : 2015-02-26 American Automobile Association, Inc.
++aaa
++
++// abb : 2014-10-24 ABB Ltd
++abb
++
++// abbott : 2014-07-24 Abbott Laboratories, Inc.
++abbott
++
++// abogado : 2014-04-24 Top Level Domain Holdings Limited
++abogado
++
++// academy : 2013-11-07 Half Oaks, LLC
++academy
++
++// accenture : 2014-08-15 Accenture plc
++accenture
++
++// accountant : 2014-11-20 dot Accountant Limited
++accountant
++
++// accountants : 2014-03-20 Knob Town, LLC
++accountants
++
++// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG
++aco
++
++// active : 2014-05-01 The Active Network, Inc
++active
++
++// actor : 2013-12-12 United TLD Holdco Ltd.
++actor
++
++// ads : 2014-12-04 Charleston Road Registry Inc.
++ads
++
++// adult : 2014-10-16 ICM Registry AD LLC
++adult
++
++// aeg : 2015-03-19 Aktiebolaget Electrolux
++aeg
++
++// afl : 2014-10-02 Australian Football League
++afl
++
++// africa : 2014-03-24 ZA Central Registry NPC trading as Registry.Africa
++africa
++
++// africamagic : 2015-03-05 Electronic Media Network (Pty) Ltd
++africamagic
++
++// agakhan : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation)
++agakhan
++
++// agency : 2013-11-14 Steel Falls, LLC
++agency
++
++// aig : 2014-12-18 American International Group, Inc.
++aig
++
++// airforce : 2014-03-06 United TLD Holdco Ltd.
++airforce
++
++// airtel : 2014-10-24 Bharti Airtel Limited
++airtel
++
++// akdn : 2015-04-23 Fondation Aga Khan (Aga Khan Foundation)
++akdn
++
++// alibaba : 2015-01-15 Alibaba Group Holding Limited
++alibaba
++
++// alipay : 2015-01-15 Alibaba Group Holding Limited
++alipay
++
++// allfinanz : 2014-07-03 Allfinanz Deutsche Vermögensberatung Aktiengesellschaft
++allfinanz
++
++// alsace : 2014-07-02 REGION D ALSACE
++alsace
++
++// amsterdam : 2014-07-24 Gemeente Amsterdam
++amsterdam
++
++// analytics : 2014-12-18 Campus IP LLC
++analytics
++
++// android : 2014-08-07 Charleston Road Registry Inc.
++android
++
++// anquan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
++anquan
++
++// apartments : 2014-12-11 June Maple, LLC
++apartments
++
++// aquarelle : 2014-07-24 Aquarelle.com
++aquarelle
++
++// aramco : 2014-11-20 Aramco Services Company
++aramco
++
++// archi : 2014-02-06 STARTING DOT LIMITED
++archi
++
++// army : 2014-03-06 United TLD Holdco Ltd.
++army
++
++// arte : 2014-12-11 Association Relative à la Télévision Européenne G.E.I.E.
++arte
++
++// associates : 2014-03-06 Baxter Hill, LLC
++associates
++
++// attorney : 2014-03-20
++attorney
++
++// auction : 2014-03-20
++auction
++
++// audio : 2014-03-20 Uniregistry, Corp.
++audio
++
++// author : 2014-12-18 Amazon EU S.à r.l.
++author
++
++// auto : 2014-11-13 Uniregistry, Corp.
++auto
++
++// autos : 2014-01-09 DERAutos, LLC
++autos
++
++// avianca : 2015-01-08 Aerovias del Continente Americano S.A. Avianca
++avianca
++
++// axa : 2013-12-19 AXA SA
++axa
++
++// azure : 2014-12-18 Microsoft Corporation
++azure
++
++// baby : 2015-04-09 Johnson & Johnson Services, Inc.
++baby
++
++// baidu : 2015-01-08 Baidu, Inc.
++baidu
++
++// band : 2014-06-12
++band
++
++// bank : 2014-09-25 fTLD Registry Services LLC
++bank
++
++// bar : 2013-12-12 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable
++bar
++
++// barcelona : 2014-07-24 Municipi de Barcelona
++barcelona
++
++// barclaycard : 2014-11-20 Barclays Bank PLC
++barclaycard
++
++// barclays : 2014-11-20 Barclays Bank PLC
++barclays
++
++// bargains : 2013-11-14 Half Hallow, LLC
++bargains
++
++// bauhaus : 2014-04-17 Werkhaus GmbH
++bauhaus
++
++// bayern : 2014-01-23 Bayern Connect GmbH
++bayern
++
++// bbc : 2014-12-18 British Broadcasting Corporation
++bbc
++
++// bbva : 2014-10-02 BANCO BILBAO VIZCAYA ARGENTARIA, S.A.
++bbva
++
++// bcg : 2015-04-02 The Boston Consulting Group, Inc.
++bcg
++
++// bcn : 2014-07-24 Municipi de Barcelona
++bcn
++
++// beer : 2014-01-09 Top Level Domain Holdings Limited
++beer
++
++// bentley : 2014-12-18 Bentley Motors Limited
++bentley
++
++// berlin : 2013-10-31 dotBERLIN GmbH & Co. KG
++berlin
++
++// best : 2013-12-19 BestTLD Pty Ltd
++best
++
++// bharti : 2014-01-09 Bharti Enterprises (Holding) Private Limited
++bharti
++
++// bible : 2014-06-19 American Bible Society
++bible
++
++// bid : 2013-12-19 dot Bid Limited
++bid
++
++// bike : 2013-08-27 Grand Hollow, LLC
++bike
++
++// bing : 2014-12-18 Microsoft Corporation
++bing
++
++// bingo : 2014-12-04 Sand Cedar, LLC
++bingo
++
++// bio : 2014-03-06 STARTING DOT LIMITED
++bio
++
++// black : 2014-01-16 Afilias Limited
++black
++
++// blackfriday : 2014-01-16 Uniregistry, Corp.
++blackfriday
++
++// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC
++bloomberg
++
++// blue : 2013-11-07 Afilias Limited
++blue
++
++// bms : 2014-10-30 Bristol-Myers Squibb Company
++bms
++
++// bmw : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft
++bmw
++
++// bnl : 2014-07-24 Banca Nazionale del Lavoro
++bnl
++
++// bnpparibas : 2014-05-29 BNP Paribas
++bnpparibas
++
++// boats : 2014-12-04 DERBoats, LLC
++boats
++
++// bom : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br
++bom
++
++// bond : 2014-06-05 Bond University Limited
++bond
++
++// boo : 2014-01-30 Charleston Road Registry Inc.
++boo
++
++// boots : 2015-01-08 THE BOOTS COMPANY PLC
++boots
++
++// bot : 2014-12-18 Amazon EU S.à r.l.
++bot
++
++// boutique : 2013-11-14 Over Galley, LLC
++boutique
++
++// bradesco : 2014-12-18 Banco Bradesco S.A.
++bradesco
++
++// bridgestone : 2014-12-18 Bridgestone Corporation
++bridgestone
++
++// broadway : 2014-12-22 Celebrate Broadway, Inc.
++broadway
++
++// broker : 2014-12-11 IG Group Holdings PLC
++broker
++
++// brother : 2015-01-29 Brother Industries, Ltd.
++brother
++
++// brussels : 2014-02-06 DNS.be vzw
++brussels
++
++// budapest : 2013-11-21 Top Level Domain Holdings Limited
++budapest
++
++// build : 2013-11-07 Plan Bee LLC
++build
++
++// builders : 2013-11-07 Atomic Madison, LLC
++builders
++
++// business : 2013-11-07 Spring Cross, LLC
++business
++
++// buy : 2014-12-18 Amazon EU S.à r.l.
++buy
++
++// buzz : 2013-10-02 DOTSTRATEGY CO.
++buzz
++
++// bzh : 2014-02-27 Association www.bzh
++bzh
++
++// cab : 2013-10-24 Half Sunset, LLC
++cab
++
++// cafe : 2015-02-11 Pioneer Canyon, LLC
++cafe
++
++// cal : 2014-07-24 Charleston Road Registry Inc.
++cal
++
++// call : 2014-12-18 Amazon EU S.à r.l.
++call
++
++// camera : 2013-08-27 Atomic Maple, LLC
++camera
++
++// camp : 2013-11-07 Delta Dynamite, LLC
++camp
++
++// cancerresearch : 2014-05-15 Australian Cancer Research Foundation
++cancerresearch
++
++// canon : 2014-09-12 Canon Inc.
++canon
++
++// capetown : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry
++capetown
++
++// capital : 2014-03-06 Delta Mill, LLC
++capital
++
++// car : 2015-01-22 Charleston Road Registry Inc.
++car
++
++// caravan : 2013-12-12 Caravan International, Inc.
++caravan
++
++// cards : 2013-12-05 Foggy Hollow, LLC
++cards
++
++// care : 2014-03-06 Goose Cross
++care
++
++// career : 2013-10-09 dotCareer LLC
++career
++
++// careers : 2013-10-02 Wild Corner, LLC
++careers
++
++// cars : 2014-11-13 Uniregistry, Corp.
++cars
++
++// cartier : 2014-06-23 Richemont DNS Inc.
++cartier
++
++// casa : 2013-11-21 Top Level Domain Holdings Limited
++casa
++
++// cash : 2014-03-06 Delta Lake, LLC
++cash
++
++// casino : 2014-12-18 Binky Sky, LLC
++casino
++
++// catering : 2013-12-05 New Falls. LLC
++catering
++
++// cba : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
++cba
++
++// cbn : 2014-08-22 The Christian Broadcasting Network, Inc.
++cbn
++
++// ceb : 2015-04-09 The Corporate Executive Board Company
++ceb
++
++// center : 2013-11-07 Tin Mill, LLC
++center
++
++// ceo : 2013-11-07 CEOTLD Pty Ltd
++ceo
++
++// cern : 2014-06-05 European Organization for Nuclear Research ("CERN")
++cern
++
++// cfa : 2014-08-28 CFA Institute
++cfa
++
++// cfd : 2014-12-11 IG Group Holdings PLC
++cfd
++
++// chanel : 2015-04-09 Chanel International B.V.
++chanel
++
++// channel : 2014-05-08 Charleston Road Registry Inc.
++channel
++
++// chase : 2015-04-30 JPMorgan Chase & Co.
++chase
++
++// chat : 2014-12-04 Sand Fields, LLC
++chat
++
++// cheap : 2013-11-14 Sand Cover, LLC
++cheap
++
++// chloe : 2014-10-16 Richemont DNS Inc.
++chloe
++
++// christmas : 2013-11-21 Uniregistry, Corp.
++christmas
++
++// chrome : 2014-07-24 Charleston Road Registry Inc.
++chrome
++
++// church : 2014-02-06 Holly Fields, LLC
++church
++
++// cipriani : 2015-02-19 Hotel Cipriani Srl
++cipriani
++
++// circle : 2014-12-18 Amazon EU S.à r.l.
++circle
++
++// cisco : 2014-12-22 Cisco Technology, Inc.
++cisco
++
++// citic : 2014-01-09 CITIC Group Corporation
++citic
++
++// city : 2014-05-29 Snow Sky, LLC
++city
++
++// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc.
++cityeats
++
++// claims : 2014-03-20 Black Corner, LLC
++claims
++
++// cleaning : 2013-12-05 Fox Shadow, LLC
++cleaning
++
++// click : 2014-06-05 Uniregistry, Corp.
++click
++
++// clinic : 2014-03-20 Goose Park, LLC
++clinic
++
++// clothing : 2013-08-27 Steel Lake, LLC
++clothing
++
++// cloud : 2015-04-16 ARUBA S.p.A.
++cloud
++
++// club : 2013-11-08 .CLUB DOMAINS, LLC
++club
++
++// coach : 2014-10-09 Koko Island, LLC
++coach
++
++// codes : 2013-10-31 Puff Willow, LLC
++codes
++
++// coffee : 2013-10-17 Trixy Cover, LLC
++coffee
++
++// college : 2014-01-16 XYZ.COM LLC
++college
++
++// cologne : 2014-02-05 NetCologne Gesellschaft für Telekommunikation mbH
++cologne
++
++// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
++commbank
++
++// community : 2013-12-05 Fox Orchard, LLC
++community
++
++// company : 2013-11-07 Silver Avenue, LLC
++company
++
++// computer : 2013-10-24 Pine Mill, LLC
++computer
++
++// comsec : 2015-01-08 VeriSign, Inc.
++comsec
++
++// condos : 2013-12-05 Pine House, LLC
++condos
++
++// construction : 2013-09-16 Fox Dynamite, LLC
++construction
++
++// consulting : 2013-12-05
++consulting
++
++// contact : 2015-01-08 Top Level Spectrum, Inc.
++contact
++
++// contractors : 2013-09-10 Magic Woods, LLC
++contractors
++
++// cooking : 2013-11-21 Top Level Domain Holdings Limited
++cooking
++
++// cool : 2013-11-14 Koko Lake, LLC
++cool
++
++// corsica : 2014-09-25 Collectivité Territoriale de Corse
++corsica
++
++// country : 2013-12-19 Top Level Domain Holdings Limited
++country
++
++// coupon : 2015-02-26 Amazon EU S.à r.l.
++coupon
++
++// coupons : 2015-03-26 Black Island, LLC
++coupons
++
++// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD
++courses
++
++// credit : 2014-03-20 Snow Shadow, LLC
++credit
++
++// creditcard : 2014-03-20 Binky Frostbite, LLC
++creditcard
++
++// creditunion : 2015-01-22 CUNA Performance Resources, LLC
++creditunion
++
++// cricket : 2014-10-09 dot Cricket Limited
++cricket
++
++// crown : 2014-10-24 Crown Equipment Corporation
++crown
++
++// crs : 2014-04-03 Federated Co-operatives Limited
++crs
++
++// cruises : 2013-12-05 Spring Way, LLC
++cruises
++
++// csc : 2014-09-25 Alliance-One Services, Inc.
++csc
++
++// cuisinella : 2014-04-03 SALM S.A.S.
++cuisinella
++
++// cymru : 2014-05-08 Nominet UK
++cymru
++
++// cyou : 2015-01-22 Beijing Gamease Age Digital Technology Co., Ltd.
++cyou
++
++// dabur : 2014-02-06 Dabur India Limited
++dabur
++
++// dad : 2014-01-23 Charleston Road Registry Inc.
++dad
++
++// dance : 2013-10-24 United TLD Holdco Ltd.
++dance
++
++// date : 2014-11-20 dot Date Limited
++date
++
++// dating : 2013-12-05 Pine Fest, LLC
++dating
++
++// datsun : 2014-03-27 NISSAN MOTOR CO., LTD.
++datsun
++
++// day : 2014-01-30 Charleston Road Registry Inc.
++day
++
++// dclk : 2014-11-20 Charleston Road Registry Inc.
++dclk
++
++// dealer : 2014-12-22 Dealer Dot Com, Inc.
++dealer
++
++// deals : 2014-05-22 Sand Sunset, LLC
++deals
++
++// degree : 2014-03-06
++degree
++
++// delivery : 2014-09-11 Steel Station, LLC
++delivery
++
++// dell : 2014-10-24 Dell Inc.
++dell
++
++// delta : 2015-02-19 Delta Air Lines, Inc.
++delta
++
++// democrat : 2013-10-24 United TLD Holdco Ltd.
++democrat
++
++// dental : 2014-03-20 Tin Birch, LLC
++dental
++
++// dentist : 2014-03-20
++dentist
++
++// desi : 2013-11-14 Desi Networks LLC
++desi
++
++// design : 2014-11-07 Top Level Design, LLC
++design
++
++// dev : 2014-10-16 Charleston Road Registry Inc.
++dev
++
++// diamonds : 2013-09-22 John Edge, LLC
++diamonds
++
++// diet : 2014-06-26 Uniregistry, Corp.
++diet
++
++// digital : 2014-03-06 Dash Park, LLC
++digital
++
++// direct : 2014-04-10 Half Trail, LLC
++direct
++
++// directory : 2013-09-20 Extra Madison, LLC
++directory
++
++// discount : 2014-03-06 Holly Hill, LLC
++discount
++
++// dnp : 2013-12-13 Dai Nippon Printing Co., Ltd.
++dnp
++
++// docs : 2014-10-16 Charleston Road Registry Inc.
++docs
++
++// dog : 2014-12-04 Koko Mill, LLC
++dog
++
++// doha : 2014-09-18 Communications Regulatory Authority (CRA)
++doha
++
++// domains : 2013-10-17 Sugar Cross, LLC
++domains
++
++// doosan : 2014-04-03 Doosan Corporation
++doosan
++
++// download : 2014-11-20 dot Support Limited
++download
++
++// drive : 2015-03-05 Charleston Road Registry Inc.
++drive
++
++// dstv : 2015-03-12 MultiChoice (Proprietary) Limited
++dstv
++
++// dubai : 2015-01-01 Dubai Smart Government Department
++dubai
++
++// durban : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry
++durban
++
++// dvag : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
++dvag
++
++// earth : 2014-12-04 Interlink Co., Ltd.
++earth
++
++// eat : 2014-01-23 Charleston Road Registry Inc.
++eat
++
++// edeka : 2014-12-18 EDEKA Verband kaufmännischer Genossenschaften e.V.
++edeka
++
++// education : 2013-11-07 Brice Way, LLC
++education
++
++// email : 2013-10-31 Spring Madison, LLC
++email
++
++// emerck : 2014-04-03 Merck KGaA
++emerck
++
++// energy : 2014-09-11 Binky Birch, LLC
++energy
++
++// engineer : 2014-03-06 United TLD Holdco Ltd.
++engineer
++
++// engineering : 2014-03-06 Romeo Canyon
++engineering
++
++// enterprises : 2013-09-20 Snow Oaks, LLC
++enterprises
++
++// epson : 2014-12-04 Seiko Epson Corporation
++epson
++
++// equipment : 2013-08-27 Corn Station, LLC
++equipment
++
++// erni : 2014-04-03 ERNI Group Holding AG
++erni
++
++// esq : 2014-05-08 Charleston Road Registry Inc.
++esq
++
++// estate : 2013-08-27 Trixy Park, LLC
++estate
++
++// eurovision : 2014-04-24 European Broadcasting Union (EBU)
++eurovision
++
++// eus : 2013-12-12 Puntueus Fundazioa
++eus
++
++// events : 2013-12-05 Pioneer Maple, LLC
++events
++
++// everbank : 2014-05-15 EverBank
++everbank
++
++// exchange : 2014-03-06 Spring Falls, LLC
++exchange
++
++// expert : 2013-11-21 Magic Pass, LLC
++expert
++
++// exposed : 2013-12-05 Victor Beach, LLC
++exposed
++
++// express : 2015-02-11 Sea Sunset, LLC
++express
++
++// fage : 2014-12-18 Fage International S.A.
++fage
++
++// fail : 2014-03-06 Atomic Pipe, LLC
++fail
++
++// fairwinds : 2014-11-13 FairWinds Partners, LLC
++fairwinds
++
++// faith : 2014-11-20 dot Faith Limited
++faith
++
++// family : 2015-04-02 Bitter Galley, LLC
++family
++
++// fan : 2014-03-06
++fan
++
++// fans : 2014-11-07 Asiamix Digital Limited
++fans
++
++// farm : 2013-11-07 Just Maple, LLC
++farm
++
++// fashion : 2014-07-03 Top Level Domain Holdings Limited
++fashion
++
++// fast : 2014-12-18 Amazon EU S.à r.l.
++fast
++
++// feedback : 2013-12-19 Top Level Spectrum, Inc.
++feedback
++
++// ferrero : 2014-12-18 Ferrero Trading Lux S.A.
++ferrero
++
++// film : 2015-01-08 Motion Picture Domain Registry Pty Ltd
++film
++
++// final : 2014-10-16 Núcleo de Informação e Coordenação do Ponto BR - NIC.br
++final
++
++// finance : 2014-03-20 Cotton Cypress, LLC
++finance
++
++// financial : 2014-03-06 Just Cover, LLC
++financial
++
++// firestone : 2014-12-18 Bridgestone Corporation
++firestone
++
++// firmdale : 2014-03-27 Firmdale Holdings Limited
++firmdale
++
++// fish : 2013-12-12 Fox Woods, LLC
++fish
++
++// fishing : 2013-11-21 Top Level Domain Holdings Limited
++fishing
++
++// fit : 2014-11-07 Top Level Domain Holdings Limited
++fit
++
++// fitness : 2014-03-06 Brice Orchard, LLC
++fitness
++
++// flickr : 2015-04-02 Yahoo! Domain Services Inc.
++flickr
++
++// flights : 2013-12-05 Fox Station, LLC
++flights
++
++// florist : 2013-11-07 Half Cypress, LLC
++florist
++
++// flowers : 2014-10-09 Uniregistry, Corp.
++flowers
++
++// flsmidth : 2014-07-24 FLSmidth A/S
++flsmidth
++
++// fly : 2014-05-08 Charleston Road Registry Inc.
++fly
++
++// foo : 2014-01-23 Charleston Road Registry Inc.
++foo
++
++// football : 2014-12-18 Foggy Farms, LLC
++football
++
++// ford : 2014-11-13 Ford Motor Company
++ford
++
++// forex : 2014-12-11 IG Group Holdings PLC
++forex
++
++// forsale : 2014-05-22
++forsale
++
++// forum : 2015-04-02 Fegistry, LLC
++forum
++
++// foundation : 2013-12-05 John Dale, LLC
++foundation
++
++// frl : 2014-05-15 FRLregistry B.V.
++frl
++
++// frogans : 2013-12-19 OP3FT
++frogans
++
++// frontier : 2015-02-05 Frontier Communications Corporation
++frontier
++
++// fund : 2014-03-20 John Castle, LLC
++fund
++
++// furniture : 2014-03-20 Lone Fields, LLC
++furniture
++
++// futbol : 2013-09-20
++futbol
++
++// fyi : 2015-04-02 Silver Tigers, LLC
++fyi
++
++// gal : 2013-11-07 Asociación puntoGAL
++gal
++
++// gallery : 2013-09-13 Sugar House, LLC
++gallery
++
++// gallup : 2015-02-19 Gallup, Inc.
++gallup
++
++// garden : 2014-06-26 Top Level Domain Holdings Limited
++garden
++
++// gbiz : 2014-07-17 Charleston Road Registry Inc.
++gbiz
++
++// gdn : 2014-07-31 Joint Stock Company "Navigation-information systems"
++gdn
++
++// gea : 2014-12-04 GEA Group Aktiengesellschaft
++gea
++
++// gent : 2014-01-23 COMBELL GROUP NV/SA
++gent
++
++// genting : 2015-03-12 Resorts World Inc Pte. Ltd.
++genting
++
++// ggee : 2014-01-09 GMO Internet, Inc.
++ggee
++
++// gift : 2013-10-17 Uniregistry, Corp.
++gift
++
++// gifts : 2014-07-03 Goose Sky, LLC
++gifts
++
++// gives : 2014-03-06 United TLD Holdco Ltd.
++gives
++
++// giving : 2014-11-13 Giving Limited
++giving
++
++// glass : 2013-11-07 Black Cover, LLC
++glass
++
++// gle : 2014-07-24 Charleston Road Registry Inc.
++gle
++
++// global : 2014-04-17 Dot GLOBAL AS
++global
++
++// globo : 2013-12-19 Globo Comunicação e Participações S.A
++globo
++
++// gmail : 2014-05-01 Charleston Road Registry Inc.
++gmail
++
++// gmo : 2014-01-09 GMO Internet, Inc.
++gmo
++
++// gmx : 2014-04-24 1&1 Mail & Media GmbH
++gmx
++
++// gold : 2015-01-22 June Edge, LLC
++gold
++
++// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD.
++goldpoint
++
++// golf : 2014-12-18 Lone falls, LLC
++golf
++
++// goo : 2014-12-18 NTT Resonant Inc.
++goo
++
++// goog : 2014-11-20 Charleston Road Registry Inc.
++goog
++
++// google : 2014-07-24 Charleston Road Registry Inc.
++google
++
++// gop : 2014-01-16 Republican State Leadership Committee, Inc.
++gop
++
++// got : 2014-12-18 Amazon EU S.à r.l.
++got
++
++// gotv : 2015-03-12 MultiChoice (Proprietary) Limited
++gotv
++
++// graphics : 2013-09-13 Over Madison, LLC
++graphics
++
++// gratis : 2014-03-20 Pioneer Tigers, LLC
++gratis
++
++// green : 2014-05-08 Afilias Limited
++green
++
++// gripe : 2014-03-06 Corn Sunset, LLC
++gripe
++
++// group : 2014-08-15 Romeo Town, LLC
++group
++
++// gucci : 2014-11-13 Guccio Gucci S.p.a.
++gucci
++
++// guge : 2014-08-28 Charleston Road Registry Inc.
++guge
++
++// guide : 2013-09-13 Snow Moon, LLC
++guide
++
++// guitars : 2013-11-14 Uniregistry, Corp.
++guitars
++
++// guru : 2013-08-27 Pioneer Cypress, LLC
++guru
++
++// hamburg : 2014-02-20 Hamburg Top-Level-Domain GmbH
++hamburg
++
++// hangout : 2014-11-13 Charleston Road Registry Inc.
++hangout
++
++// haus : 2013-12-05
++haus
++
++// hdfcbank : 2015-02-12 HDFC Bank Limited
++hdfcbank
++
++// health : 2015-02-11 DotHealth, LLC
++health
++
++// healthcare : 2014-06-12 Silver Glen, LLC
++healthcare
++
++// help : 2014-06-26 Uniregistry, Corp.
++help
++
++// helsinki : 2015-02-05 City of Helsinki
++helsinki
++
++// here : 2014-02-06 Charleston Road Registry Inc.
++here
++
++// hermes : 2014-07-10 HERMES INTERNATIONAL
++hermes
++
++// hiphop : 2014-03-06 Uniregistry, Corp.
++hiphop
++
++// hitachi : 2014-10-31 Hitachi, Ltd.
++hitachi
++
++// hiv : 2014-03-13 dotHIV gemeinnuetziger e.V.
++hiv
++
++// hockey : 2015-03-19 Half Willow, LLC
++hockey
++
++// holdings : 2013-08-27 John Madison, LLC
++holdings
++
++// holiday : 2013-11-07 Goose Woods, LLC
++holiday
++
++// homedepot : 2015-04-02 Homer TLC, Inc.
++homedepot
++
++// homes : 2014-01-09 DERHomes, LLC
++homes
++
++// honda : 2014-12-18 Honda Motor Co., Ltd.
++honda
++
++// horse : 2013-11-21 Top Level Domain Holdings Limited
++horse
++
++// host : 2014-04-17 DotHost Inc.
++host
++
++// hosting : 2014-05-29 Uniregistry, Corp.
++hosting
++
++// hoteles : 2015-03-05 Travel Reservations SRL
++hoteles
++
++// hotmail : 2014-12-18 Microsoft Corporation
++hotmail
++
++// house : 2013-11-07 Sugar Park, LLC
++house
++
++// how : 2014-01-23 Charleston Road Registry Inc.
++how
++
++// hsbc : 2014-10-24 HSBC Holdings PLC
++hsbc
++
++// htc : 2015-04-02 HTC corporation
++htc
++
++// ibm : 2014-07-31 International Business Machines Corporation
++ibm
++
++// icbc : 2015-02-19 Industrial and Commercial Bank of China Limited
++icbc
++
++// ice : 2014-10-30 IntercontinentalExchange, Inc.
++ice
++
++// icu : 2015-01-08 One.com A/S
++icu
++
++// ifm : 2014-01-30 ifm electronic gmbh
++ifm
++
++// iinet : 2014-07-03 Connect West Pty. Ltd.
++iinet
++
++// immo : 2014-07-10 Auburn Bloom, LLC
++immo
++
++// immobilien : 2013-11-07 United TLD Holdco Ltd.
++immobilien
++
++// industries : 2013-12-05 Outer House, LLC
++industries
++
++// infiniti : 2014-03-27 NISSAN MOTOR CO., LTD.
++infiniti
++
++// ing : 2014-01-23 Charleston Road Registry Inc.
++ing
++
++// ink : 2013-12-05 Top Level Design, LLC
++ink
++
++// institute : 2013-11-07 Outer Maple, LLC
++institute
++
++// insurance : 2015-02-19 fTLD Registry Services LLC
++insurance
++
++// insure : 2014-03-20 Pioneer Willow, LLC
++insure
++
++// international : 2013-11-07 Wild Way, LLC
++international
++
++// investments : 2014-03-20 Holly Glen, LLC
++investments
++
++// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A.
++ipiranga
++
++// irish : 2014-08-07 Dot-Irish LLC
++irish
++
++// iselect : 2015-02-11 iSelect Ltd
++iselect
++
++// ist : 2014-08-28 Istanbul Metropolitan Municipality
++ist
++
++// istanbul : 2014-08-28 Istanbul Metropolitan Municipality
++istanbul
++
++// itau : 2014-10-02 Itau Unibanco Holding S.A.
++itau
++
++// iwc : 2014-06-23 Richemont DNS Inc.
++iwc
++
++// jaguar : 2014-11-13 Jaguar Land Rover Ltd
++jaguar
++
++// java : 2014-06-19 Oracle Corporation
++java
++
++// jcb : 2014-11-20 JCB Co., Ltd.
++jcb
++
++// jcp : 2015-04-23 JCP Media, Inc.
++jcp
++
++// jetzt : 2014-01-09 New TLD Company AB
++jetzt
++
++// jewelry : 2015-03-05 Wild Bloom, LLC
++jewelry
++
++// jio : 2015-04-02 Affinity Names, Inc.
++jio
++
++// jlc : 2014-12-04 Richemont DNS Inc.
++jlc
++
++// jll : 2015-04-02 Jones Lang LaSalle Incorporated
++jll
++
++// jmp : 2015-03-26 Matrix IP LLC
++jmp
++
++// joburg : 2014-03-24 ZA Central Registry NPC trading as ZA Central Registry
++joburg
++
++// jot : 2014-12-18 Amazon EU S.à r.l.
++jot
++
++// joy : 2014-12-18 Amazon EU S.à r.l.
++joy
++
++// jpmorgan : 2015-04-30 JPMorgan Chase & Co.
++jpmorgan
++
++// jprs : 2014-09-18 Japan Registry Services Co., Ltd.
++jprs
++
++// juegos : 2014-03-20 Uniregistry, Corp.
++juegos
++
++// kaufen : 2013-11-07 United TLD Holdco Ltd.
++kaufen
++
++// kddi : 2014-09-12 KDDI CORPORATION
++kddi
++
++// kerryhotels : 2015-04-30 Kerry Trading Co. Limited
++kerryhotels
++
++// kerrylogistics : 2015-04-09 Kerry Trading Co. Limited
++kerrylogistics
++
++// kerryproperties : 2015-04-09 Kerry Trading Co. Limited
++kerryproperties
++
++// kfh : 2014-12-04 Kuwait Finance House
++kfh
++
++// kim : 2013-09-23 Afilias Limited
++kim
++
++// kinder : 2014-11-07 Ferrero Trading Lux S.A.
++kinder
++
++// kitchen : 2013-09-20 Just Goodbye, LLC
++kitchen
++
++// kiwi : 2013-09-20 DOT KIWI LIMITED
++kiwi
++
++// koeln : 2014-01-09 NetCologne Gesellschaft für Telekommunikation mbH
++koeln
++
++// komatsu : 2015-01-08 Komatsu Ltd.
++komatsu
++
++// kpmg : 2015-04-23 KPMG International Cooperative (KPMG International Genossenschaft)
++kpmg
++
++// kpn : 2015-01-08 Koninklijke KPN N.V.
++kpn
++
++// krd : 2013-12-05 KRG Department of Information Technology
++krd
++
++// kred : 2013-12-19 KredTLD Pty Ltd
++kred
++
++// kuokgroup : 2015-04-09 Kerry Trading Co. Limited
++kuokgroup
++
++// kyknet : 2015-03-05 Electronic Media Network (Pty) Ltd
++kyknet
++
++// kyoto : 2014-11-07 Academic Institution: Kyoto Jyoho Gakuen
++kyoto
++
++// lacaixa : 2014-01-09 CAIXA D'ESTALVIS I PENSIONS DE BARCELONA
++lacaixa
++
++// lancaster : 2015-02-12 LANCASTER
++lancaster
++
++// land : 2013-09-10 Pine Moon, LLC
++land
++
++// landrover : 2014-11-13 Jaguar Land Rover Ltd
++landrover
++
++// lasalle : 2015-04-02 Jones Lang LaSalle Incorporated
++lasalle
++
++// lat : 2014-10-16 ECOM-LAC Federaciòn de Latinoamèrica y el Caribe para Internet y el Comercio Electrònico
++lat
++
++// latrobe : 2014-06-16 La Trobe University
++latrobe
++
++// law : 2015-01-22 Minds + Machines Group Limited
++law
++
++// lawyer : 2014-03-20
++lawyer
++
++// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant")
++lds
++
++// lease : 2014-03-06 Victor Trail, LLC
++lease
++
++// leclerc : 2014-08-07 A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc
++leclerc
++
++// legal : 2014-10-16 Blue Falls, LLC
++legal
++
++// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION
++lexus
++
++// lgbt : 2014-05-08 Afilias Limited
++lgbt
++
++// liaison : 2014-10-02 Liaison Technologies, Incorporated
++liaison
++
++// lidl : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG
++lidl
++
++// life : 2014-02-06 Trixy Oaks, LLC
++life
++
++// lifeinsurance : 2015-01-15 American Council of Life Insurers
++lifeinsurance
++
++// lifestyle : 2014-12-11 Lifestyle Domain Holdings, Inc.
++lifestyle
++
++// lighting : 2013-08-27 John McCook, LLC
++lighting
++
++// like : 2014-12-18 Amazon EU S.à r.l.
++like
++
++// limited : 2014-03-06 Big Fest, LLC
++limited
++
++// limo : 2013-10-17 Hidden Frostbite, LLC
++limo
++
++// lincoln : 2014-11-13 Ford Motor Company
++lincoln
++
++// linde : 2014-12-04 Linde Aktiengesellschaft
++linde
++
++// link : 2013-11-14 Uniregistry, Corp.
++link
++
++// live : 2014-12-04 Half Woods, LLC
++live
++
++// lixil : 2015-03-19 LIXIL Group Corporation
++lixil
++
++// loan : 2014-11-20 dot Loan Limited
++loan
++
++// loans : 2014-03-20 June Woods, LLC
++loans
++
++// lol : 2015-01-30 Uniregistry, Corp.
++lol
++
++// london : 2013-11-14 Dot London Domains Limited
++london
++
++// lotte : 2014-11-07 Lotte Holdings Co., Ltd.
++lotte
++
++// lotto : 2014-04-10 Afilias Limited
++lotto
++
++// love : 2014-12-22 Merchant Law Group LLP
++love
++
++// ltd : 2014-09-25 Over Corner, LLC
++ltd
++
++// ltda : 2014-04-17 DOMAIN ROBOT SERVICOS DE HOSPEDAGEM NA INTERNET LTDA
++ltda
++
++// lupin : 2014-11-07 LUPIN LIMITED
++lupin
++
++// luxe : 2014-01-09 Top Level Domain Holdings Limited
++luxe
++
++// luxury : 2013-10-17 Luxury Partners, LLC
++luxury
++
++// madrid : 2014-05-01 Comunidad de Madrid
++madrid
++
++// maif : 2014-10-02 Mutuelle Assurance Instituteur France (MAIF)
++maif
++
++// maison : 2013-12-05 Victor Frostbite, LLC
++maison
++
++// makeup : 2015-01-15 L'Oréal
++makeup
++
++// man : 2014-12-04 MAN SE
++man
++
++// management : 2013-11-07 John Goodbye, LLC
++management
++
++// mango : 2013-10-24 PUNTO FA S.L.
++mango
++
++// market : 2014-03-06
++market
++
++// marketing : 2013-11-07 Fern Pass, LLC
++marketing
++
++// markets : 2014-12-11 IG Group Holdings PLC
++markets
++
++// marriott : 2014-10-09 Marriott Worldwide Corporation
++marriott
++
++// mba : 2015-04-02 Lone Hollow, LLC
++mba
++
++// media : 2014-03-06 Grand Glen, LLC
++media
++
++// meet : 2014-01-16
++meet
++
++// melbourne : 2014-05-29 The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation
++melbourne
++
++// meme : 2014-01-30 Charleston Road Registry Inc.
++meme
++
++// memorial : 2014-10-16 Dog Beach, LLC
++memorial
++
++// men : 2015-02-26 Exclusive Registry Limited
++men
++
++// menu : 2013-09-11 Wedding TLD2, LLC
++menu
++
++// meo : 2014-11-07 PT Comunicacoes S.A.
++meo
++
++// miami : 2013-12-19 Top Level Domain Holdings Limited
++miami
++
++// microsoft : 2014-12-18 Microsoft Corporation
++microsoft
++
++// mini : 2014-01-09 Bayerische Motoren Werke Aktiengesellschaft
++mini
++
++// mls : 2015-04-23 The Canadian Real Estate Association
++mls
++
++// mma : 2014-11-07 MMA IARD
++mma
++
++// mnet : 2015-03-05 Electronic Media Network (Pty) Ltd
++mnet
++
++// mobily : 2014-12-18 GreenTech Consultancy Company W.L.L.
++mobily
++
++// moda : 2013-11-07 United TLD Holdco Ltd.
++moda
++
++// moe : 2013-11-13 Interlink Co., Ltd.
++moe
++
++// moi : 2014-12-18 Amazon EU S.à r.l.
++moi
++
++// mom : 2015-04-16 Uniregistry, Corp.
++mom
++
++// monash : 2013-09-30 Monash University
++monash
++
++// money : 2014-10-16 Outer McCook, LLC
++money
++
++// montblanc : 2014-06-23 Richemont DNS Inc.
++montblanc
++
++// mormon : 2013-12-05 IRI Domain Management, LLC ("Applicant")
++mormon
++
++// mortgage : 2014-03-20
++mortgage
++
++// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)
++moscow
++
++// motorcycles : 2014-01-09 DERMotorcycles, LLC
++motorcycles
++
++// mov : 2014-01-30 Charleston Road Registry Inc.
++mov
++
++// movie : 2015-02-05 New Frostbite, LLC
++movie
++
++// movistar : 2014-10-16 Telefónica S.A.
++movistar
++
++// mtn : 2014-12-04 MTN Dubai Limited
++mtn
++
++// mtpc : 2014-11-20 Mitsubishi Tanabe Pharma Corporation
++mtpc
++
++// mtr : 2015-03-12 MTR Corporation Limited
++mtr
++
++// multichoice : 2015-03-12 MultiChoice (Proprietary) Limited
++multichoice
++
++// mutual : 2015-04-02 Northwestern Mutual MU TLD Registry, LLC
++mutual
++
++// mzansimagic : 2015-03-05 Electronic Media Network (Pty) Ltd
++mzansimagic
++
++// nadex : 2014-12-11 IG Group Holdings PLC
++nadex
++
++// nagoya : 2013-10-24 GMO Registry, Inc.
++nagoya
++
++// naspers : 2015-02-12 Intelprop (Proprietary) Limited
++naspers
++
++// natura : 2015-03-12 NATURA COSMÉTICOS S.A.
++natura
++
++// navy : 2014-03-06 United TLD Holdco Ltd.
++navy
++
++// nec : 2015-01-08 NEC Corporation
++nec
++
++// netbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA
++netbank
++
++// network : 2013-11-14 Trixy Manor, LLC
++network
++
++// neustar : 2013-12-05 NeuStar, Inc.
++neustar
++
++// new : 2014-01-30 Charleston Road Registry Inc.
++new
++
++// news : 2014-12-18
++news
++
++// nexus : 2014-07-24 Charleston Road Registry Inc.
++nexus
++
++// ngo : 2014-03-06 Public Interest Registry
++ngo
++
++// nhk : 2014-02-13 Japan Broadcasting Corporation (NHK)
++nhk
++
++// nico : 2014-12-04 DWANGO Co., Ltd.
++nico
++
++// ninja : 2013-11-07 United TLD Holdco Ltd.
++ninja
++
++// nissan : 2014-03-27 NISSAN MOTOR CO., LTD.
++nissan
++
++// nokia : 2015-01-08 Nokia Corporation
++nokia
++
++// norton : 2014-12-04 Symantec Corporation
++norton
++
++// nowruz : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
++nowruz
++
++// nra : 2014-05-22 NRA Holdings Company, INC.
++nra
++
++// nrw : 2013-11-21 Minds + Machines GmbH
++nrw
++
++// ntt : 2014-10-31 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
++ntt
++
++// nyc : 2014-01-23 The City of New York by and through the New York City Department of Information Technology & Telecommunications
++nyc
++
++// obi : 2014-09-25 OBI Group Holding SE & Co. KGaA
++obi
++
++// observer : 2015-04-30 Guardian News and Media Limited
++observer
++
++// office : 2015-03-12 Microsoft Corporation
++office
++
++// okinawa : 2013-12-05 BusinessRalliart Inc.
++okinawa
++
++// omega : 2015-01-08 The Swatch Group Ltd
++omega
++
++// one : 2014-11-07 One.com A/S
++one
++
++// ong : 2014-03-06 Public Interest Registry
++ong
++
++// onl : 2013-09-16 I-Registry Ltd.
++onl
++
++// online : 2015-01-15 DotOnline Inc.
++online
++
++// ooo : 2014-01-09 INFIBEAM INCORPORATION LIMITED
++ooo
++
++// oracle : 2014-06-19 Oracle Corporation
++oracle
++
++// orange : 2015-03-12 Orange Brand Services Limited
++orange
++
++// organic : 2014-03-27 Afilias Limited
++organic
++
++// orientexpress : 2015-02-05 Belmond Ltd.
++orientexpress
++
++// osaka : 2014-09-04 Interlink Co., Ltd.
++osaka
++
++// otsuka : 2013-10-11 Otsuka Holdings Co., Ltd.
++otsuka
++
++// ovh : 2014-01-16 OVH SAS
++ovh
++
++// page : 2014-12-04 Charleston Road Registry Inc.
++page
++
++// pamperedchef : 2015-02-05 The Pampered Chef, Ltd.
++pamperedchef
++
++// panerai : 2014-11-07 Richemont DNS Inc.
++panerai
++
++// paris : 2014-01-30 City of Paris
++paris
++
++// pars : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
++pars
++
++// partners : 2013-12-05 Magic Glen, LLC
++partners
++
++// parts : 2013-12-05 Sea Goodbye, LLC
++parts
++
++// party : 2014-09-11 Blue Sky Registry Limited
++party
++
++// passagens : 2015-03-05 Travel Reservations SRL
++passagens
++
++// payu : 2015-02-12 MIH PayU B.V.
++payu
++
++// pharmacy : 2014-06-19 National Association of Boards of Pharmacy
++pharmacy
++
++// philips : 2014-11-07 Koninklijke Philips N.V.
++philips
++
++// photo : 2013-11-14 Uniregistry, Corp.
++photo
++
++// photography : 2013-09-20 Sugar Glen, LLC
++photography
++
++// photos : 2013-10-17 Sea Corner, LLC
++photos
++
++// physio : 2014-05-01 PhysBiz Pty Ltd
++physio
++
++// piaget : 2014-10-16 Richemont DNS Inc.
++piaget
++
++// pics : 2013-11-14 Uniregistry, Corp.
++pics
++
++// pictet : 2014-06-26 Pictet Europe S.A.
++pictet
++
++// pictures : 2014-03-06 Foggy Sky, LLC
++pictures
++
++// pid : 2015-01-08 Top Level Spectrum, Inc.
++pid
++
++// pin : 2014-12-18 Amazon EU S.à r.l.
++pin
++
++// pink : 2013-10-01 Afilias Limited
++pink
++
++// pizza : 2014-06-26 Foggy Moon, LLC
++pizza
++
++// place : 2014-04-24 Snow Galley, LLC
++place
++
++// play : 2015-03-05 Charleston Road Registry Inc.
++play
++
++// plumbing : 2013-09-10 Spring Tigers, LLC
++plumbing
++
++// plus : 2015-02-05 Sugar Mill, LLC
++plus
++
++// pohl : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
++pohl
++
++// poker : 2014-07-03 Afilias Domains No. 5 Limited
++poker
++
++// porn : 2014-10-16 ICM Registry PN LLC
++porn
++
++// praxi : 2013-12-05 Praxi S.p.A.
++praxi
++
++// press : 2014-04-03 DotPress Inc.
++press
++
++// prod : 2014-01-23 Charleston Road Registry Inc.
++prod
++
++// productions : 2013-12-05 Magic Birch, LLC
++productions
++
++// prof : 2014-07-24 Charleston Road Registry Inc.
++prof
++
++// promo : 2014-12-18 Play.PROMO Oy
++promo
++
++// properties : 2013-12-05 Big Pass, LLC
++properties
++
++// property : 2014-05-22 Uniregistry, Corp.
++property
++
++// protection : 2015-04-23 Symantec Corporation
++protection
++
++// pub : 2013-12-12 United TLD Holdco Ltd.
++pub
++
++// qpon : 2013-11-14 dotCOOL, Inc.
++qpon
++
++// quebec : 2013-12-19 PointQuébec Inc
++quebec
++
++// quest : 2015-03-26 Quest ION Limited
++quest
++
++// racing : 2014-12-04 Premier Registry Limited
++racing
++
++// read : 2014-12-18 Amazon EU S.à r.l.
++read
++
++// realtor : 2014-05-29 Real Estate Domains LLC
++realtor
++
++// realty : 2015-03-19 Fegistry, LLC
++realty
++
++// recipes : 2013-10-17 Grand Island, LLC
++recipes
++
++// red : 2013-11-07 Afilias Limited
++red
++
++// redstone : 2014-10-31 Redstone Haute Couture Co., Ltd.
++redstone
++
++// redumbrella : 2015-03-26 Travelers TLD, LLC
++redumbrella
++
++// rehab : 2014-03-06 United TLD Holdco Ltd.
++rehab
++
++// reise : 2014-03-13 dotreise GmbH
++reise
++
++// reisen : 2014-03-06 New Cypress, LLC
++reisen
++
++// reit : 2014-09-04 National Association of Real Estate Investment Trusts, Inc.
++reit
++
++// reliance : 2015-04-02 Reliance Industries Limited
++reliance
++
++// ren : 2013-12-12 Beijing Qianxiang Wangjing Technology Development Co., Ltd.
++ren
++
++// rent : 2014-12-04 DERRent, LLC
++rent
++
++// rentals : 2013-12-05 Big Hollow,LLC
++rentals
++
++// repair : 2013-11-07 Lone Sunset, LLC
++repair
++
++// report : 2013-12-05 Binky Glen, LLC
++report
++
++// republican : 2014-03-20 United TLD Holdco Ltd.
++republican
++
++// rest : 2013-12-19 Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable
++rest
++
++// restaurant : 2014-07-03 Snow Avenue, LLC
++restaurant
++
++// review : 2014-11-20 dot Review Limited
++review
++
++// reviews : 2013-09-13
++reviews
++
++// rich : 2013-11-21 I-Registry Ltd.
++rich
++
++// ricoh : 2014-11-20 Ricoh Company, Ltd.
++ricoh
++
++// ril : 2015-04-02 Reliance Industries Limited
++ril
++
++// rio : 2014-02-27 Empresa Municipal de Informática SA - IPLANRIO
++rio
++
++// rip : 2014-07-10 United TLD Holdco Ltd.
++rip
++
++// rocher : 2014-12-18 Ferrero Trading Lux S.A.
++rocher
++
++// rocks : 2013-11-14
++rocks
++
++// rodeo : 2013-12-19 Top Level Domain Holdings Limited
++rodeo
++
++// room : 2014-12-18 Amazon EU S.à r.l.
++room
++
++// rsvp : 2014-05-08 Charleston Road Registry Inc.
++rsvp
++
++// ruhr : 2013-10-02 regiodot GmbH & Co. KG
++ruhr
++
++// run : 2015-03-19 Snow Park, LLC
++run
++
++// rwe : 2015-04-02 RWE AG
++rwe
++
++// ryukyu : 2014-01-09 BusinessRalliart Inc.
++ryukyu
++
++// saarland : 2013-12-12 dotSaarland GmbH
++saarland
++
++// safe : 2014-12-18 Amazon EU S.à r.l.
++safe
++
++// safety : 2015-01-08 Safety Registry Services, LLC.
++safety
++
++// sakura : 2014-12-18 SAKURA Internet Inc.
++sakura
++
++// sale : 2014-10-16
++sale
++
++// salon : 2014-12-11 Outer Orchard, LLC
++salon
++
++// samsung : 2014-04-03 SAMSUNG SDS CO., LTD
++samsung
++
++// sandvik : 2014-11-13 Sandvik AB
++sandvik
++
++// sandvikcoromant : 2014-11-07 Sandvik AB
++sandvikcoromant
++
++// sanofi : 2014-10-09 Sanofi
++sanofi
++
++// sap : 2014-03-27 SAP AG
++sap
++
++// sapo : 2014-11-07 PT Comunicacoes S.A.
++sapo
++
++// sarl : 2014-07-03 Delta Orchard, LLC
++sarl
++
++// sas : 2015-04-02 Research IP LLC
++sas
++
++// saxo : 2014-10-31 Saxo Bank A/S
++saxo
++
++// sbi : 2015-03-12 STATE BANK OF INDIA
++sbi
++
++// sbs : 2014-11-07 SPECIAL BROADCASTING SERVICE CORPORATION
++sbs
++
++// sca : 2014-03-13 SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ)
++sca
++
++// scb : 2014-02-20 The Siam Commercial Bank Public Company Limited ("SCB")
++scb
++
++// schmidt : 2014-04-03 SALM S.A.S.
++schmidt
++
++// scholarships : 2014-04-24 Scholarships.com, LLC
++scholarships
++
++// school : 2014-12-18 Little Galley, LLC
++school
++
++// schule : 2014-03-06 Outer Moon, LLC
++schule
++
++// schwarz : 2014-09-18 Schwarz Domains und Services GmbH & Co. KG
++schwarz
++
++// science : 2014-09-11 dot Science Limited
++science
++
++// scor : 2014-10-31 SCOR SE
++scor
++
++// scot : 2014-01-23 Dot Scot Registry Limited
++scot
++
++// seat : 2014-05-22 SEAT, S.A. (Sociedad Unipersonal)
++seat
++
++// seek : 2014-12-04 Seek Limited
++seek
++
++// sener : 2014-10-24 Sener Ingeniería y Sistemas, S.A.
++sener
++
++// services : 2014-02-27 Fox Castle, LLC
++services
++
++// sew : 2014-07-17 SEW-EURODRIVE GmbH & Co KG
++sew
++
++// sex : 2014-11-13 ICM Registry SX LLC
++sex
++
++// sexy : 2013-09-11 Uniregistry, Corp.
++sexy
++
++// sharp : 2014-05-01 Sharp Corporation
++sharp
++
++// shaw : 2015-04-23 Shaw Cablesystems G.P.
++shaw
++
++// shia : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
++shia
++
++// shiksha : 2013-11-14 Afilias Limited
++shiksha
++
++// shoes : 2013-10-02 Binky Galley, LLC
++shoes
++
++// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
++shouji
++
++// show : 2015-03-05 Snow Beach, LLC
++show
++
++// shriram : 2014-01-23 Shriram Capital Ltd.
++shriram
++
++// sina : 2015-03-12 Sina Corporation
++sina
++
++// singles : 2013-08-27 Fern Madison, LLC
++singles
++
++// site : 2015-01-15 DotSite Inc.
++site
++
++// ski : 2015-04-09 STARTING DOT LIMITED
++ski
++
++// skin : 2015-01-15 L'Oréal
++skin
++
++// sky : 2014-06-19 Sky IP International Ltd, a company incorporated in England and Wales, operating via its registered Swiss branch
++sky
++
++// skype : 2014-12-18 Microsoft Corporation
++skype
++
++// smile : 2014-12-18 Amazon EU S.à r.l.
++smile
++
++// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F
++sncf
++
++// soccer : 2015-03-26 Foggy Shadow, LLC
++soccer
++
++// social : 2013-11-07 United TLD Holdco Ltd.
++social
++
++// software : 2014-03-20
++software
++
++// sohu : 2013-12-19 Sohu.com Limited
++sohu
++
++// solar : 2013-11-07 Ruby Town, LLC
++solar
++
++// solutions : 2013-11-07 Silver Cover, LLC
++solutions
++
++// song : 2015-02-26 Amazon EU S.à r.l.
++song
++
++// sony : 2015-01-08 Sony Corporation
++sony
++
++// soy : 2014-01-23 Charleston Road Registry Inc.
++soy
++
++// space : 2014-04-03 DotSpace Inc.
++space
++
++// spiegel : 2014-02-05 SPIEGEL-Verlag Rudolf Augstein GmbH & Co. KG
++spiegel
++
++// spot : 2015-02-26 Amazon EU S.à r.l.
++spot
++
++// spreadbetting : 2014-12-11 IG Group Holdings PLC
++spreadbetting
++
++// stada : 2014-11-13 STADA Arzneimittel AG
++stada
++
++// star : 2015-01-08 Star India Private Limited
++star
++
++// starhub : 2015-02-05 StarHub Limited
++starhub
++
++// statebank : 2015-03-12 STATE BANK OF INDIA
++statebank
++
++// statoil : 2014-12-04 Statoil ASA
++statoil
++
++// stc : 2014-10-09 Saudi Telecom Company
++stc
++
++// stcgroup : 2014-10-09 Saudi Telecom Company
++stcgroup
++
++// stockholm : 2014-12-18 Stockholms kommun
++stockholm
++
++// storage : 2014-12-22 Self Storage Company LLC
++storage
++
++// store : 2015-04-09 DotStore Inc.
++store
++
++// studio : 2015-02-11 Spring Goodbye, LLC
++studio
++
++// study : 2014-12-11 OPEN UNIVERSITIES AUSTRALIA PTY LTD
++study
++
++// style : 2014-12-04 Binky Moon, LLC
++style
++
++// sucks : 2014-12-22 Vox Populi Registry Inc.
++sucks
++
++// supersport : 2015-03-05 SuperSport International Holdings Proprietary Limited
++supersport
++
++// supplies : 2013-12-19 Atomic Fields, LLC
++supplies
++
++// supply : 2013-12-19 Half Falls, LLC
++supply
++
++// support : 2013-10-24 Grand Orchard, LLC
++support
++
++// surf : 2014-01-09 Top Level Domain Holdings Limited
++surf
++
++// surgery : 2014-03-20 Tin Avenue, LLC
++surgery
++
++// suzuki : 2014-02-20 SUZUKI MOTOR CORPORATION
++suzuki
++
++// swatch : 2015-01-08 The Swatch Group Ltd
++swatch
++
++// swiss : 2014-10-16 Swiss Confederation
++swiss
++
++// sydney : 2014-09-18 State of New South Wales, Department of Premier and Cabinet
++sydney
++
++// symantec : 2014-12-04 Symantec Corporation
++symantec
++
++// systems : 2013-11-07 Dash Cypress, LLC
++systems
++
++// tab : 2014-12-04 Tabcorp Holdings Limited
++tab
++
++// taipei : 2014-07-10 Taipei City Government
++taipei
++
++// talk : 2015-04-09 Amazon EU S.à r.l.
++talk
++
++// taobao : 2015-01-15 Alibaba Group Holding Limited
++taobao
++
++// tatamotors : 2015-03-12 Tata Motors Ltd
++tatamotors
++
++// tatar : 2014-04-24 Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic"
++tatar
++
++// tattoo : 2013-08-30 Uniregistry, Corp.
++tattoo
++
++// tax : 2014-03-20 Storm Orchard, LLC
++tax
++
++// taxi : 2015-03-19 Pine Falls, LLC
++taxi
++
++// tci : 2014-09-12 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
++tci
++
++// team : 2015-03-05 Atomic Lake, LLC
++team
++
++// tech : 2015-01-30 Dot Tech LLC
++tech
++
++// technology : 2013-09-13 Auburn Falls
++technology
++
++// telecity : 2015-02-19 TelecityGroup International Limited
++telecity
++
++// telefonica : 2014-10-16 Telefónica S.A.
++telefonica
++
++// temasek : 2014-08-07 Temasek Holdings (Private) Limited
++temasek
++
++// tennis : 2014-12-04 Cotton Bloom, LLC
++tennis
++
++// thd : 2015-04-02 Homer TLC, Inc.
++thd
++
++// theater : 2015-03-19 Blue Tigers, LLC
++theater
++
++// theguardian : 2015-04-30 Guardian News and Media Limited
++theguardian
++
++// tickets : 2015-02-05 Accent Media Limited
++tickets
++
++// tienda : 2013-11-14 Victor Manor, LLC
++tienda
++
++// tiffany : 2015-01-30 Tiffany and Company
++tiffany
++
++// tips : 2013-09-20 Corn Willow, LLC
++tips
++
++// tires : 2014-11-07 Dog Edge, LLC
++tires
++
++// tirol : 2014-04-24 punkt Tirol GmbH
++tirol
++
++// tmall : 2015-01-15 Alibaba Group Holding Limited
++tmall
++
++// today : 2013-09-20 Pearl Woods, LLC
++today
++
++// tokyo : 2013-11-13 GMO Registry, Inc.
++tokyo
++
++// tools : 2013-11-21 Pioneer North, LLC
++tools
++
++// top : 2014-03-20 Jiangsu Bangning Science & Technology Co.,Ltd.
++top
++
++// toray : 2014-12-18 Toray Industries, Inc.
++toray
++
++// toshiba : 2014-04-10 TOSHIBA Corporation
++toshiba
++
++// tours : 2015-01-22 Sugar Station, LLC
++tours
++
++// town : 2014-03-06 Koko Moon, LLC
++town
++
++// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION
++toyota
++
++// toys : 2014-03-06 Pioneer Orchard, LLC
++toys
++
++// trade : 2014-01-23 Elite Registry Limited
++trade
++
++// trading : 2014-12-11 IG Group Holdings PLC
++trading
++
++// training : 2013-11-07 Wild Willow, LLC
++training
++
++// travelers : 2015-03-26 Travelers TLD, LLC
++travelers
++
++// travelersinsurance : 2015-03-26 Travelers TLD, LLC
++travelersinsurance
++
++// trust : 2014-10-16
++trust
++
++// trv : 2015-03-26 Travelers TLD, LLC
++trv
++
++// tui : 2014-07-03 TUI AG
++tui
++
++// tunes : 2015-02-26 Amazon EU S.à r.l.
++tunes
++
++// tushu : 2014-12-18 Amazon EU S.à r.l.
++tushu
++
++// tvs : 2015-02-19 T V SUNDRAM IYENGAR & SONS LIMITED
++tvs
++
++// ubs : 2014-12-11 UBS AG
++ubs
++
++// university : 2014-03-06 Little Station, LLC
++university
++
++// uno : 2013-09-11 Dot Latin LLC
++uno
++
++// uol : 2014-05-01 UBN INTERNET LTDA.
++uol
++
++// vacations : 2013-12-05 Atomic Tigers, LLC
++vacations
++
++// vana : 2014-12-11 Lifestyle Domain Holdings, Inc.
++vana
++
++// vegas : 2014-01-16 Dot Vegas, Inc.
++vegas
++
++// ventures : 2013-08-27 Binky Lake, LLC
++ventures
++
++// versicherung : 2014-03-20 dotversicherung-registry GmbH
++versicherung
++
++// vet : 2014-03-06
++vet
++
++// viajes : 2013-10-17 Black Madison, LLC
++viajes
++
++// video : 2014-10-16
++video
++
++// viking : 2015-04-02 Viking River Cruises (Bermuda) Ltd.
++viking
++
++// villas : 2013-12-05 New Sky, LLC
++villas
++
++// vip : 2015-01-22 Minds + Machines Group Limited
++vip
++
++// virgin : 2014-09-25 Virgin Enterprises Limited
++virgin
++
++// vision : 2013-12-05 Koko Station, LLC
++vision
++
++// vista : 2014-09-18 Vistaprint Limited
++vista
++
++// vistaprint : 2014-09-18 Vistaprint Limited
++vistaprint
++
++// viva : 2014-11-07 Saudi Telecom Company
++viva
++
++// vlaanderen : 2014-02-06 DNS.be vzw
++vlaanderen
++
++// vodka : 2013-12-19 Top Level Domain Holdings Limited
++vodka
++
++// vote : 2013-11-21 Monolith Registry LLC
++vote
++
++// voting : 2013-11-13 Valuetainment Corp.
++voting
++
++// voto : 2013-11-21 Monolith Registry LLC
++voto
++
++// voyage : 2013-08-27 Ruby House, LLC
++voyage
++
++// vuelos : 2015-03-05 Travel Reservations SRL
++vuelos
++
++// wales : 2014-05-08 Nominet UK
++wales
++
++// walter : 2014-11-13 Sandvik AB
++walter
++
++// wang : 2013-10-24 Zodiac Leo Limited
++wang
++
++// wanggou : 2014-12-18 Amazon EU S.à r.l.
++wanggou
++
++// watch : 2013-11-14 Sand Shadow, LLC
++watch
++
++// watches : 2014-12-22 Richemont DNS Inc.
++watches
++
++// weather : 2015-01-08 The Weather Channel, LLC
++weather
++
++// weatherchannel : 2015-03-12 The Weather Channel, LLC
++weatherchannel
++
++// webcam : 2014-01-23 dot Webcam Limited
++webcam
++
++// website : 2014-04-03 DotWebsite Inc.
++website
++
++// wed : 2013-10-01 Atgron, Inc.
++wed
++
++// wedding : 2014-04-24 Top Level Domain Holdings Limited
++wedding
++
++// weibo : 2015-03-05 Sina Corporation
++weibo
++
++// weir : 2015-01-29 Weir Group IP Limited
++weir
++
++// whoswho : 2014-02-20 Who's Who Registry
++whoswho
++
++// wien : 2013-10-28 punkt.wien GmbH
++wien
++
++// wiki : 2013-11-07 Top Level Design, LLC
++wiki
++
++// williamhill : 2014-03-13 William Hill Organization Limited
++williamhill
++
++// win : 2014-11-20 First Registry Limited
++win
++
++// windows : 2014-12-18 Microsoft Corporation
++windows
++
++// wme : 2014-02-13 William Morris Endeavor Entertainment, LLC
++wme
++
++// work : 2013-12-19 Top Level Domain Holdings Limited
++work
++
++// works : 2013-11-14 Little Dynamite, LLC
++works
++
++// world : 2014-06-12 Bitter Fields, LLC
++world
++
++// wtc : 2013-12-19 World Trade Centers Association, Inc.
++wtc
++
++// wtf : 2014-03-06 Hidden Way, LLC
++wtf
++
++// xbox : 2014-12-18 Microsoft Corporation
++xbox
++
++// xerox : 2014-10-24 Xerox DNHC LLC
++xerox
++
++// xihuan : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
++xihuan
++
++// xin : 2014-12-11 Elegant Leader Limited
++xin
++
++// xn--11b4c3d : 2015-01-15 VeriSign Sarl
++कॉम
++xn--11b4c3d
++
++// xn--1ck2e1b : 2015-02-26 Amazon EU S.à r.l.
++セール
++xn--1ck2e1b
++
++// xn--1qqw23a : 2014-01-09 Guangzhou YU Wei Information Technology Co., Ltd.
++佛山
++xn--1qqw23a
++
++// xn--30rr7y : 2014-06-12 Excellent First Limited
++慈善
++xn--30rr7y
++
++// xn--3bst00m : 2013-09-13 Eagle Horizon Limited
++集团
++xn--3bst00m
++
++// xn--3ds443g : 2013-09-08 TLD REGISTRY LIMITED
++在线
++xn--3ds443g
++
++// xn--3pxu8k : 2015-01-15 VeriSign Sarl
++点看
++xn--3pxu8k
++
++// xn--42c2d9a : 2015-01-15 VeriSign Sarl
++คอม
++xn--42c2d9a
++
++// xn--45q11c : 2013-11-21 Zodiac Scorpio Limited
++å…«å¦
++xn--45q11c
++
++// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment
++موقع
++xn--4gbrim
++
++// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center
++公益
++xn--55qw42g
++
++// xn--55qx5d : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center)
++å…¬å¸
++xn--55qx5d
++
++// xn--5tzm5g : 2014-12-22 Global Website TLD Asia Limited
++网站
++xn--5tzm5g
++
++// xn--6frz82g : 2013-09-23 Afilias Limited
++移动
++xn--6frz82g
++
++// xn--6qq986b3xl : 2013-09-13 Tycoon Treasure Limited
++我爱你
++xn--6qq986b3xl
++
++// xn--80adxhks : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)
++моÑква
++xn--80adxhks
++
++// xn--80asehdb : 2013-07-14 CORE Association
++онлайн
++xn--80asehdb
++
++// xn--80aswg : 2013-07-14 CORE Association
++Ñайт
++xn--80aswg
++
++// xn--8y0a063a : 2015-03-26 China United Network Communications Corporation Limited
++è”通
++xn--8y0a063a
++
++// xn--9dbq2a : 2015-01-15 VeriSign Sarl
++קו×
++xn--9dbq2a
++
++// xn--9et52u : 2014-06-12 RISE VICTORY LIMITED
++时尚
++xn--9et52u
++
++// xn--9krt00a : 2015-03-12 Sina Corporation
++å¾®åš
++xn--9krt00a
++
++// xn--b4w605ferd : 2014-08-07 Temasek Holdings (Private) Limited
++淡马锡
++xn--b4w605ferd
++
++// xn--bck1b9a5dre4c : 2015-02-26 Amazon EU S.à r.l.
++ファッション
++xn--bck1b9a5dre4c
++
++// xn--c1avg : 2013-11-14 Public Interest Registry
++орг
++xn--c1avg
++
++// xn--c2br7g : 2015-01-15 VeriSign Sarl
++नेट
++xn--c2br7g
++
++// xn--cck2b3b : 2015-02-26 Amazon EU S.à r.l.
++ストア
++xn--cck2b3b
++
++// xn--cg4bki : 2013-09-27 SAMSUNG SDS CO., LTD
++삼성
++xn--cg4bki
++
++// xn--czr694b : 2014-01-16 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY.HONGKONG LIMITED
++商标
++xn--czr694b
++
++// xn--czrs0t : 2013-12-19 Wild Island, LLC
++商店
++xn--czrs0t
++
++// xn--czru2d : 2013-11-21 Zodiac Capricorn Limited
++商城
++xn--czru2d
++
++// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internetâ€
++дети
++xn--d1acj3b
++
++// xn--eckvdtc9d : 2014-12-18 Amazon EU S.à r.l.
++ãƒã‚¤ãƒ³ãƒˆ
++xn--eckvdtc9d
++
++// xn--efvy88h : 2014-08-22 Xinhua News Agency Guangdong Branch æ–°åŽé€šè®¯ç¤¾å¹¿ä¸œåˆ†ç¤¾
++æ–°é—»
++xn--efvy88h
++
++// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited
++工行
++xn--estv75g
++
++// xn--fct429k : 2015-04-09 Amazon EU S.à r.l.
++家電
++xn--fct429k
++
++// xn--fhbei : 2015-01-15 VeriSign Sarl
++كوم
++xn--fhbei
++
++// xn--fiq228c5hs : 2013-09-08 TLD REGISTRY LIMITED
++中文网
++xn--fiq228c5hs
++
++// xn--fiq64b : 2013-10-14 CITIC Group Corporation
++中信
++xn--fiq64b
++
++// xn--fjq720a : 2014-05-22 Will Bloom, LLC
++娱ä¹
++xn--fjq720a
++
++// xn--flw351e : 2014-07-31 Charleston Road Registry Inc.
++谷歌
++xn--flw351e
++
++// xn--g2xx48c : 2015-01-30 Minds + Machines Group Limited
++购物
++xn--g2xx48c
++
++// xn--gckr3f0f : 2015-02-26 Amazon EU S.à r.l.
++クラウド
++xn--gckr3f0f
++
++// xn--hxt814e : 2014-05-15 Zodiac Libra Limited
++网店
++xn--hxt814e
++
++// xn--i1b6b1a6a2e : 2013-11-14 Public Interest Registry
++संगठन
++xn--i1b6b1a6a2e
++
++// xn--imr513n : 2014-12-11 HU YI GLOBAL INFORMATION RESOURCES (HOLDING) COMPANY. HONGKONG LIMITED
++é¤åŽ…
++xn--imr513n
++
++// xn--io0a7i : 2013-11-14 Computer Network Information Center of Chinese Academy of Sciences (China Internet Network Information Center)
++网络
++xn--io0a7i
++
++// xn--j1aef : 2015-01-15 VeriSign Sarl
++ком
++xn--j1aef
++
++// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation
++诺基亚
++xn--jlq61u9w7b
++
++// xn--jvr189m : 2015-02-26 Amazon EU S.à r.l.
++食å“
++xn--jvr189m
++
++// xn--kcrx77d1x4a : 2014-11-07 Koninklijke Philips N.V.
++飞利浦
++xn--kcrx77d1x4a
++
++// xn--kpu716f : 2014-12-22 Richemont DNS Inc.
++手表
++xn--kpu716f
++
++// xn--kput3i : 2014-02-13 Beijing RITT-Net Technology Development Co., Ltd
++手机
++xn--kput3i
++
++// xn--mgba3a3ejt : 2014-11-20 Aramco Services Company
++ارامكو
++xn--mgba3a3ejt
++
++// xn--mgbab2bd : 2013-10-31 CORE Association
++بازار
++xn--mgbab2bd
++
++// xn--mgbb9fbpob : 2014-12-18 GreenTech Consultancy Company W.L.L.
++موبايلي
++xn--mgbb9fbpob
++
++// xn--mgbt3dhd : 2014-09-04 Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
++همراه
++xn--mgbt3dhd
++
++// xn--mk1bu44c : 2015-01-15 VeriSign Sarl
++ë‹·ì»´
++xn--mk1bu44c
++
++// xn--mxtq1m : 2014-03-06 Net-Chinese Co., Ltd.
++政府
++xn--mxtq1m
++
++// xn--ngbc5azd : 2013-07-13 International Domain Registry Pty. Ltd.
++شبكة
++xn--ngbc5azd
++
++// xn--ngbe9e0a : 2014-12-04 Kuwait Finance House
++بيتك
++xn--ngbe9e0a
++
++// xn--nqv7f : 2013-11-14 Public Interest Registry
++机构
++xn--nqv7f
++
++// xn--nqv7fs00ema : 2013-11-14 Public Interest Registry
++组织机构
++xn--nqv7fs00ema
++
++// xn--nyqy26a : 2014-11-07 Stable Tone Limited
++å¥åº·
++xn--nyqy26a
++
++// xn--p1acf : 2013-12-12 Rusnames Limited
++руÑ
++xn--p1acf
++
++// xn--pbt977c : 2014-12-22 Richemont DNS Inc.
++ç å®
++xn--pbt977c
++
++// xn--pssy2u : 2015-01-15 VeriSign Sarl
++大拿
++xn--pssy2u
++
++// xn--q9jyb4c : 2013-09-17 Charleston Road Registry Inc.
++ã¿ã‚“ãª
++xn--q9jyb4c
++
++// xn--qcka1pmc : 2014-07-31 Charleston Road Registry Inc.
++グーグル
++xn--qcka1pmc
++
++// xn--rhqv96g : 2013-09-11 Stable Tone Limited
++世界
++xn--rhqv96g
++
++// xn--rovu88b : 2015-02-26 Amazon EU S.à r.l.
++書ç±
++xn--rovu88b
++
++// xn--ses554g : 2014-01-16
++网å€
++xn--ses554g
++
++// xn--t60b56a : 2015-01-15 VeriSign Sarl
++ë‹·ë„·
++xn--t60b56a
++
++// xn--tckwe : 2015-01-15 VeriSign Sarl
++コム
++xn--tckwe
++
++// xn--unup4y : 2013-07-14 Spring Fields, LLC
++游æˆ
++xn--unup4y
++
++// xn--vermgensberater-ctb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
++vermögensberater
++xn--vermgensberater-ctb
++
++// xn--vermgensberatung-pwb : 2014-06-23 Deutsche Vermögensberatung Aktiengesellschaft DVAG
++vermögensberatung
++xn--vermgensberatung-pwb
++
++// xn--vhquv : 2013-08-27 Dash McCook, LLC
++ä¼ä¸š
++xn--vhquv
++
++// xn--vuq861b : 2014-10-16 Beijing Tele-info Network Technology Co., Ltd.
++ä¿¡æ¯
++xn--vuq861b
++
++// xn--w4r85el8fhu5dnra : 2015-04-30 Kerry Trading Co. Limited
++嘉里大酒店
++xn--w4r85el8fhu5dnra
++
++// xn--xhq521b : 2013-11-14 Guangzhou YU Wei Information Technology Co., Ltd.
++广东
++xn--xhq521b
++
++// xn--zfr164b : 2013-11-08 China Organizational Name Administration Center
++政务
++xn--zfr164b
++
++// xyz : 2013-12-05 XYZ.COM LLC
++xyz
++
++// yachts : 2014-01-09 DERYachts, LLC
++yachts
++
++// yahoo : 2015-04-02 Yahoo! Domain Services Inc.
++yahoo
++
++// yamaxun : 2014-12-18 Amazon EU S.à r.l.
++yamaxun
++
++// yandex : 2014-04-10 YANDEX, LLC
++yandex
++
++// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD.
++yodobashi
++
++// yoga : 2014-05-29 Top Level Domain Holdings Limited
++yoga
++
++// yokohama : 2013-12-12 GMO Registry, Inc.
++yokohama
++
++// you : 2015-04-09 Amazon EU S.à r.l.
++you
++
++// youtube : 2014-05-01 Charleston Road Registry Inc.
++youtube
++
++// yun : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD.
++yun
++
++// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.)
++zara
++
++// zero : 2014-12-18 Amazon EU S.à r.l.
++zero
++
++// zip : 2014-05-08 Charleston Road Registry Inc.
++zip
++
++// zone : 2013-11-14 Outer Falls, LLC
++zone
++
++// zuerich : 2014-11-07 Kanton Zürich (Canton of Zurich)
++zuerich
++
++
++// ===END ICANN DOMAINS===
++// ===BEGIN PRIVATE DOMAINS===
++// (Note: these are in alphabetical order by company name)
++
++// Amazon CloudFront : https://aws.amazon.com/cloudfront/
++// Submitted by Donavan Miller <donavanm@amazon.com> 2013-03-22
++cloudfront.net
++
++// Amazon Elastic Compute Cloud: https://aws.amazon.com/ec2/
++// Submitted by Osman Surkatty <osmans@amazon.com> 2014-12-16
++ap-northeast-1.compute.amazonaws.com
++ap-southeast-1.compute.amazonaws.com
++ap-southeast-2.compute.amazonaws.com
++cn-north-1.compute.amazonaws.cn
++compute.amazonaws.cn
++compute.amazonaws.com
++compute-1.amazonaws.com
++eu-west-1.compute.amazonaws.com
++eu-central-1.compute.amazonaws.com
++sa-east-1.compute.amazonaws.com
++us-east-1.amazonaws.com
++us-gov-west-1.compute.amazonaws.com
++us-west-1.compute.amazonaws.com
++us-west-2.compute.amazonaws.com
++z-1.compute-1.amazonaws.com
++z-2.compute-1.amazonaws.com
++
++// Amazon Elastic Beanstalk : https://aws.amazon.com/elasticbeanstalk/
++// Submitted by Adam Stein <astein@amazon.com> 2013-04-02
++elasticbeanstalk.com
++
++// Amazon Elastic Load Balancing : https://aws.amazon.com/elasticloadbalancing/
++// Submitted by Scott Vidmar <svidmar@amazon.com> 2013-03-27
++elb.amazonaws.com
++
++// Amazon S3 : https://aws.amazon.com/s3/
++// Submitted by Courtney Eckhardt <coec@amazon.com> 2013-03-22
++s3.amazonaws.com
++s3-us-west-2.amazonaws.com
++s3-us-west-1.amazonaws.com
++s3-eu-west-1.amazonaws.com
++s3-ap-southeast-1.amazonaws.com
++s3-ap-southeast-2.amazonaws.com
++s3-ap-northeast-1.amazonaws.com
++s3-sa-east-1.amazonaws.com
++s3-us-gov-west-1.amazonaws.com
++s3-fips-us-gov-west-1.amazonaws.com
++s3-website-us-east-1.amazonaws.com
++s3-website-us-west-2.amazonaws.com
++s3-website-us-west-1.amazonaws.com
++s3-website-eu-west-1.amazonaws.com
++s3-website-ap-southeast-1.amazonaws.com
++s3-website-ap-southeast-2.amazonaws.com
++s3-website-ap-northeast-1.amazonaws.com
++s3-website-sa-east-1.amazonaws.com
++s3-website-us-gov-west-1.amazonaws.com
++
++// BetaInABox
++// Submitted by adrian@betainabox.com 2012-09-13
++betainabox.com
++
++// CentralNic : http://www.centralnic.com/names/domains
++// Submitted by registry <gavin.brown@centralnic.com> 2012-09-27
++ae.org
++ar.com
++br.com
++cn.com
++com.de
++com.se
++de.com
++eu.com
++gb.com
++gb.net
++hu.com
++hu.net
++jp.net
++jpn.com
++kr.com
++mex.com
++no.com
++qc.com
++ru.com
++sa.com
++se.com
++se.net
++uk.com
++uk.net
++us.com
++uy.com
++za.bz
++za.com
++
++// Africa.com Web Solutions Ltd : https://registry.africa.com
++// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04
++africa.com
++
++// iDOT Services Limited : http://www.domain.gr.com
++// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04
++gr.com
++
++// Radix FZC : http://domains.in.net
++// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04
++in.net
++
++// US REGISTRY LLC : http://us.org
++// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04
++us.org
++
++// co.com Registry, LLC : https://registry.co.com
++// Submitted by Gavin Brown <gavin.brown@centralnic.com> 2014-02-04
++co.com
++
++// c.la : http://www.c.la/
++c.la
++
++// cloudControl : https://www.cloudcontrol.com/
++// Submitted by Tobias Wilken <tw@cloudcontrol.com> 2013-07-23
++cloudcontrolled.com
++cloudcontrolapp.com
++
++// co.ca : http://registry.co.ca/
++co.ca
++
++// CoDNS B.V.
++co.nl
++co.no
++
++// Commerce Guys, SAS
++// Submitted by Damien Tournoud <damien@commerceguys.com> 2015-01-22
++*.platform.sh
++
++// Cupcake : https://cupcake.io/
++// Submitted by Jonathan Rudenberg <jonathan@cupcake.io> 2013-10-08
++cupcake.is
++
++// DreamHost : http://www.dreamhost.com/
++// Submitted by Andrew Farmer <andrew.farmer@dreamhost.com> 2012-10-02
++dreamhosters.com
++
++// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/
++dyndns-at-home.com
++dyndns-at-work.com
++dyndns-blog.com
++dyndns-free.com
++dyndns-home.com
++dyndns-ip.com
++dyndns-mail.com
++dyndns-office.com
++dyndns-pics.com
++dyndns-remote.com
++dyndns-server.com
++dyndns-web.com
++dyndns-wiki.com
++dyndns-work.com
++dyndns.biz
++dyndns.info
++dyndns.org
++dyndns.tv
++at-band-camp.net
++ath.cx
++barrel-of-knowledge.info
++barrell-of-knowledge.info
++better-than.tv
++blogdns.com
++blogdns.net
++blogdns.org
++blogsite.org
++boldlygoingnowhere.org
++broke-it.net
++buyshouses.net
++cechire.com
++dnsalias.com
++dnsalias.net
++dnsalias.org
++dnsdojo.com
++dnsdojo.net
++dnsdojo.org
++does-it.net
++doesntexist.com
++doesntexist.org
++dontexist.com
++dontexist.net
++dontexist.org
++doomdns.com
++doomdns.org
++dvrdns.org
++dyn-o-saur.com
++dynalias.com
++dynalias.net
++dynalias.org
++dynathome.net
++dyndns.ws
++endofinternet.net
++endofinternet.org
++endoftheinternet.org
++est-a-la-maison.com
++est-a-la-masion.com
++est-le-patron.com
++est-mon-blogueur.com
++for-better.biz
++for-more.biz
++for-our.info
++for-some.biz
++for-the.biz
++forgot.her.name
++forgot.his.name
++from-ak.com
++from-al.com
++from-ar.com
++from-az.net
++from-ca.com
++from-co.net
++from-ct.com
++from-dc.com
++from-de.com
++from-fl.com
++from-ga.com
++from-hi.com
++from-ia.com
++from-id.com
++from-il.com
++from-in.com
++from-ks.com
++from-ky.com
++from-la.net
++from-ma.com
++from-md.com
++from-me.org
++from-mi.com
++from-mn.com
++from-mo.com
++from-ms.com
++from-mt.com
++from-nc.com
++from-nd.com
++from-ne.com
++from-nh.com
++from-nj.com
++from-nm.com
++from-nv.com
++from-ny.net
++from-oh.com
++from-ok.com
++from-or.com
++from-pa.com
++from-pr.com
++from-ri.com
++from-sc.com
++from-sd.com
++from-tn.com
++from-tx.com
++from-ut.com
++from-va.com
++from-vt.com
++from-wa.com
++from-wi.com
++from-wv.com
++from-wy.com
++ftpaccess.cc
++fuettertdasnetz.de
++game-host.org
++game-server.cc
++getmyip.com
++gets-it.net
++go.dyndns.org
++gotdns.com
++gotdns.org
++groks-the.info
++groks-this.info
++ham-radio-op.net
++here-for-more.info
++hobby-site.com
++hobby-site.org
++home.dyndns.org
++homedns.org
++homeftp.net
++homeftp.org
++homeip.net
++homelinux.com
++homelinux.net
++homelinux.org
++homeunix.com
++homeunix.net
++homeunix.org
++iamallama.com
++in-the-band.net
++is-a-anarchist.com
++is-a-blogger.com
++is-a-bookkeeper.com
++is-a-bruinsfan.org
++is-a-bulls-fan.com
++is-a-candidate.org
++is-a-caterer.com
++is-a-celticsfan.org
++is-a-chef.com
++is-a-chef.net
++is-a-chef.org
++is-a-conservative.com
++is-a-cpa.com
++is-a-cubicle-slave.com
++is-a-democrat.com
++is-a-designer.com
++is-a-doctor.com
++is-a-financialadvisor.com
++is-a-geek.com
++is-a-geek.net
++is-a-geek.org
++is-a-green.com
++is-a-guru.com
++is-a-hard-worker.com
++is-a-hunter.com
++is-a-knight.org
++is-a-landscaper.com
++is-a-lawyer.com
++is-a-liberal.com
++is-a-libertarian.com
++is-a-linux-user.org
++is-a-llama.com
++is-a-musician.com
++is-a-nascarfan.com
++is-a-nurse.com
++is-a-painter.com
++is-a-patsfan.org
++is-a-personaltrainer.com
++is-a-photographer.com
++is-a-player.com
++is-a-republican.com
++is-a-rockstar.com
++is-a-socialist.com
++is-a-soxfan.org
++is-a-student.com
++is-a-teacher.com
++is-a-techie.com
++is-a-therapist.com
++is-an-accountant.com
++is-an-actor.com
++is-an-actress.com
++is-an-anarchist.com
++is-an-artist.com
++is-an-engineer.com
++is-an-entertainer.com
++is-by.us
++is-certified.com
++is-found.org
++is-gone.com
++is-into-anime.com
++is-into-cars.com
++is-into-cartoons.com
++is-into-games.com
++is-leet.com
++is-lost.org
++is-not-certified.com
++is-saved.org
++is-slick.com
++is-uberleet.com
++is-very-bad.org
++is-very-evil.org
++is-very-good.org
++is-very-nice.org
++is-very-sweet.org
++is-with-theband.com
++isa-geek.com
++isa-geek.net
++isa-geek.org
++isa-hockeynut.com
++issmarterthanyou.com
++isteingeek.de
++istmein.de
++kicks-ass.net
++kicks-ass.org
++knowsitall.info
++land-4-sale.us
++lebtimnetz.de
++leitungsen.de
++likes-pie.com
++likescandy.com
++merseine.nu
++mine.nu
++misconfused.org
++mypets.ws
++myphotos.cc
++neat-url.com
++office-on-the.net
++on-the-web.tv
++podzone.net
++podzone.org
++readmyblog.org
++saves-the-whales.com
++scrapper-site.net
++scrapping.cc
++selfip.biz
++selfip.com
++selfip.info
++selfip.net
++selfip.org
++sells-for-less.com
++sells-for-u.com
++sells-it.net
++sellsyourhome.org
++servebbs.com
++servebbs.net
++servebbs.org
++serveftp.net
++serveftp.org
++servegame.org
++shacknet.nu
++simple-url.com
++space-to-rent.com
++stuff-4-sale.org
++stuff-4-sale.us
++teaches-yoga.com
++thruhere.net
++traeumtgerade.de
++webhop.biz
++webhop.info
++webhop.net
++webhop.org
++worse-than.tv
++writesthisblog.com
++
++// EU.org https://eu.org/
++// Submitted by Pierre Beyssac <hostmaster@eu.org> 2015-04-17
++
++eu.org
++al.eu.org
++asso.eu.org
++at.eu.org
++au.eu.org
++be.eu.org
++bg.eu.org
++ca.eu.org
++cd.eu.org
++ch.eu.org
++cn.eu.org
++cy.eu.org
++cz.eu.org
++de.eu.org
++dk.eu.org
++edu.eu.org
++ee.eu.org
++es.eu.org
++fi.eu.org
++fr.eu.org
++gr.eu.org
++hr.eu.org
++hu.eu.org
++ie.eu.org
++il.eu.org
++in.eu.org
++int.eu.org
++is.eu.org
++it.eu.org
++jp.eu.org
++kr.eu.org
++lt.eu.org
++lu.eu.org
++lv.eu.org
++mc.eu.org
++me.eu.org
++mk.eu.org
++mt.eu.org
++my.eu.org
++net.eu.org
++ng.eu.org
++nl.eu.org
++no.eu.org
++nz.eu.org
++paris.eu.org
++pl.eu.org
++pt.eu.org
++q-a.eu.org
++ro.eu.org
++ru.eu.org
++se.eu.org
++si.eu.org
++sk.eu.org
++tr.eu.org
++uk.eu.org
++us.eu.org
++
++// Fastly Inc. http://www.fastly.com/
++// Submitted by Vladimir Vuksan <vladimir@fastly.com> 2013-05-31
++a.ssl.fastly.net
++b.ssl.fastly.net
++global.ssl.fastly.net
++a.prod.fastly.net
++global.prod.fastly.net
++
++// Firebase, Inc.
++// Submitted by Chris Raynor <chris@firebase.com> 2014-01-21
++firebaseapp.com
++
++// Flynn : https://flynn.io
++// Submitted by Jonathan Rudenberg <jonathan@flynn.io> 2014-07-12
++flynnhub.com
++
++// GDS : https://www.gov.uk/service-manual/operations/operating-servicegovuk-subdomains
++// Submitted by David Illsley <david.illsley@digital.cabinet-office.gov.uk> 2014-08-28
++service.gov.uk
++
++// GitHub, Inc.
++// Submitted by Ben Toews <btoews@github.com> 2014-02-06
++github.io
++githubusercontent.com
++
++// GlobeHosting, Inc.
++// Submitted by Zoltan Egresi <egresi@globehosting.com> 2013-07-12
++ro.com
++
++// Google, Inc.
++// Submitted by Eduardo Vela <evn@google.com> 2014-12-19
++appspot.com
++blogspot.ae
++blogspot.be
++blogspot.bj
++blogspot.ca
++blogspot.cf
++blogspot.ch
++blogspot.co.at
++blogspot.co.il
++blogspot.co.nz
++blogspot.co.uk
++blogspot.com
++blogspot.com.ar
++blogspot.com.au
++blogspot.com.br
++blogspot.com.es
++blogspot.com.tr
++blogspot.cv
++blogspot.cz
++blogspot.de
++blogspot.dk
++blogspot.fi
++blogspot.fr
++blogspot.gr
++blogspot.hk
++blogspot.hu
++blogspot.ie
++blogspot.in
++blogspot.it
++blogspot.jp
++blogspot.kr
++blogspot.mr
++blogspot.mx
++blogspot.nl
++blogspot.no
++blogspot.pt
++blogspot.re
++blogspot.ro
++blogspot.ru
++blogspot.se
++blogspot.sg
++blogspot.sk
++blogspot.td
++blogspot.tw
++codespot.com
++googleapis.com
++googlecode.com
++pagespeedmobilizer.com
++withgoogle.com
++
++// Heroku : https://www.heroku.com/
++// Submitted by Tom Maher <tmaher@heroku.com> 2013-05-02
++herokuapp.com
++herokussl.com
++
++// iki.fi
++// Submitted by Hannu Aronsson <haa@iki.fi> 2009-11-05
++iki.fi
++
++// info.at : http://www.info.at/
++biz.at
++info.at
++
++// Michau Enterprises Limited : http://www.co.pl/
++co.pl
++
++// Microsoft : http://microsoft.com
++// Submitted by Barry Dorrans <bdorrans@microsoft.com> 2014-01-24
++azurewebsites.net
++azure-mobile.net
++cloudapp.net
++
++// Neustar Inc.
++// Submitted by Trung Tran <Trung.Tran@neustar.biz> 2015-04-23
++4u.com
++
++// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/
++// Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net> 2014-02-02
++nfshost.com
++
++// NYC.mn : http://www.information.nyc.mn
++// Submitted by Matthew Brown <mattbrown@nyc.mn> 2013-03-11
++nyc.mn
++
++// One Fold Media : http://www.onefoldmedia.com/
++// Submitted by Eddie Jones <eddie@onefoldmedia.com> 2014-06-10
++nid.io
++
++// Opera Software, A.S.A.
++// Submitted by Yngve Pettersen <yngve@opera.com> 2009-11-26
++operaunite.com
++
++// OutSystems
++// Submitted by Duarte Santos <domain-admin@outsystemscloud.com> 2014-03-11
++outsystemscloud.com
++
++// .pl domains (grandfathered)
++art.pl
++gliwice.pl
++krakow.pl
++poznan.pl
++wroc.pl
++zakopane.pl
++
++// priv.at : http://www.nic.priv.at/
++// Submitted by registry <lendl@nic.at> 2008-06-09
++priv.at
++
++// Red Hat, Inc. OpenShift : https://openshift.redhat.com/
++// Submitted by Tim Kramer <tkramer@rhcloud.com> 2012-10-24
++rhcloud.com
++
++// SinaAppEngine : http://sae.sina.com.cn/
++// Submitted by SinaAppEngine <saesupport@sinacloud.com> 2015-02-02
++sinaapp.com
++vipsinaapp.com
++1kapp.com
++
++// TASK geographical domains (www.task.gda.pl/uslugi/dns)
++gda.pl
++gdansk.pl
++gdynia.pl
++med.pl
++sopot.pl
++
++// UDR Limited : http://www.udr.hk.com
++// Submitted by registry <hostmaster@udr.hk.com> 2014-11-07
++hk.com
++hk.org
++ltd.hk
++inc.hk
++
++// Yola : https://www.yola.com/
++// Submitted by Stefano Rivera <stefano@yola.com> 2014-07-09
++yolasite.com
++
++// ZaNiC : http://www.za.net/
++// Submitted by registry <hostmaster@nic.za.net> 2009-10-03
++za.net
++za.org
++
++// ===END PRIVATE DOMAINS===
+diff --git a/feeds/packages/net/ddns-scripts/files/update_CloudFlare.sh b/feeds/packages/net/ddns-scripts/files/update_CloudFlare.sh
+new file mode 100644
+index 0000000..2281740
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/update_CloudFlare.sh
+@@ -0,0 +1,142 @@
++#
++#.Distributed under the terms of the GNU General Public License (GPL) version 2.0
++#
++# script for sending updates to cloudflare.com
++#.2014-2015 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++# many thanks to Paul for testing and feedback during development
++#
++# This script is parsed by dynamic_dns_functions.sh inside send_update() function
++#
++# using following options from /etc/config/ddns
++# option username - your cloudflare e-mail
++# option password - cloudflare api key, you can get it from cloudflare.com/my-account/
++# option domain - your full hostname to update, in cloudflare its subdomain.domain
++# i.e. myhost.example.com where myhost is the subdomain and example.com is your domain
++#
++# variable __IP already defined with the ip-address to use for update
++#
++[ $use_https -eq 0 ] && write_log 14 "Cloudflare only support updates via Secure HTTP (HTTPS). Please correct configuration!"
++[ -z "$username" ] && write_log 14 "Service section not configured correctly! Missing 'username'"
++[ -z "$password" ] && write_log 14 "Service section not configured correctly! Missing 'password'"
++
++local __RECID __URL __KEY __KEYS __FOUND __SUBDOM __DOMAIN __TLD
++
++# split given Host/Domain into TLD, registrable domain, and subdomain
++split_FQDN $domain __TLD __DOMAIN __SUBDOM
++[ $? -ne 0 -o -z "$__DOMAIN" ] && \
++ write_log 14 "Wrong Host/Domain configuration ($domain). Please correct configuration!"
++
++# put together what we need
++__DOMAIN="$__DOMAIN.$__TLD"
++
++# parse OpenWrt script with
++# functions for parsing and generating json
++. /usr/share/libubox/jshn.sh
++
++# function copied from /usr/share/libubox/jshn.sh
++# from BB14.09 for backward compatibility to AA12.09
++grep -i "json_get_keys" /usr/share/libubox/jshn.sh >/dev/null 2>&1 || json_get_keys() {
++ local __dest="$1"
++ local _tbl_cur
++
++ if [ -n "$2" ]; then
++ json_get_var _tbl_cur "$2"
++ else
++ _json_get_var _tbl_cur JSON_CUR
++ fi
++ local __var="${JSON_PREFIX}KEYS_${_tbl_cur}"
++ eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]"
++}
++
++# function to "sed" unwanted string parts from DATFILE
++cleanup() {
++ # based on the sample output on cloudflare.com homepage we need to do some cleanup
++ sed -i 's/^[ \t]*//;s/[ \t]*$//' $DATFILE # remove invisible chars at beginning and end of lines
++ sed -i '/^-$/d' $DATFILE # remove lines with "-" (dash)
++ sed -i '/^$/d' $DATFILE # remove empty lines
++ sed -i "#'##g" $DATFILE # remove "'" (single quote)
++}
++
++# build url according to cloudflare client api at https://www.cloudflare.com/docs/client-api.html
++# to "rec_load_all" to detect rec_id needed for update
++__URL="https://www.cloudflare.com/api_json.html" # https://www.cloudflare.com/api_json.html
++__URL="${__URL}?a=rec_load_all" # -d 'a=rec_load_all'
++__URL="${__URL}&tkn=$password" # -d 'tkn=8afbe6dea02407989af4dd4c97bb6e25'
++__URL="${__URL}&email=$username" # -d 'email=sample@example.com'
++__URL="${__URL}&z=$__DOMAIN" # -d 'z=example.com'
++
++# lets request the data
++do_transfer "$__URL" || return 1
++
++cleanup # cleanup dat file
++json_load "$(cat $DATFILE)" # lets extract data
++__FOUND=0 # found record indicator
++json_get_var __RES "result" # cloudflare result of last request
++json_get_var __MSG "msg" # cloudflare error message
++[ "$__RES" != "success" ] && {
++ write_log 4 "'rec_load_all' failed with error: \n$__MSG"
++ return 1
++}
++
++json_select "response"
++json_select "recs"
++json_select "objs"
++json_get_keys __KEYS
++for __KEY in $__KEYS; do
++ local __ZONE __DISPLAY __NAME __TYPE
++ json_select "$__KEY"
++# json_get_var __ZONE "zone_name" # for debugging
++# json_get_var __DISPLAY "display_name" # for debugging
++ json_get_var __NAME "name"
++ json_get_var __TYPE "type"
++ if [ "$__NAME" = "$domain" ]; then
++ # we must verify IPv4 and IPv6 because there might be both for the same host
++ [ \( $use_ipv6 -eq 0 -a "$__TYPE" = "A" \) -o \( $use_ipv6 -eq 1 -a "$__TYPE" = "AAAA" \) ] && {
++ __FOUND=1 # mark found
++ break # found leave for loop
++ }
++ fi
++ json_select ..
++done
++[ $__FOUND -eq 0 ] && {
++ # we don't need to continue trying to update cloudflare because record to update does not exist
++ # user has to setup record first outside ddns-scripts
++ write_log 14 "No valid record found at Cloudflare setup. Please create first!"
++}
++json_get_var __RECID "rec_id" # last thing to do get rec_id
++json_cleanup # cleanup
++write_log 7 "rec_id '$__RECID' detected for host/domain '$domain'"
++
++# build url according to cloudflare client api at https://www.cloudflare.com/docs/client-api.html
++# for "rec_edit" to update IP address
++__URL="https://www.cloudflare.com/api_json.html" # https://www.cloudflare.com/api_json.html
++__URL="${__URL}?a=rec_edit" # -d 'a=rec_edit'
++__URL="${__URL}&tkn=$password" # -d 'tkn=8afbe6dea02407989af4dd4c97bb6e25'
++__URL="${__URL}&id=$__RECID" # -d 'id=9001'
++__URL="${__URL}&email=$username" # -d 'email=sample@example.com'
++__URL="${__URL}&z=$__DOMAIN" # -d 'z=example.com'
++
++[ $use_ipv6 -eq 0 ] && __URL="${__URL}&type=A" # -d 'type=A' (IPv4)
++[ $use_ipv6 -eq 1 ] && __URL="${__URL}&type=AAAA" # -d 'type=AAAA' (IPv6)
++
++# handle subdomain or domain record
++[ -n "$__SUBDOM" ] && __URL="${__URL}&name=$__SUBDOM" # -d 'name=sub' (HOST/SUBDOMAIN)
++[ -z "$__SUBDOM" ] && __URL="${__URL}&name=$__DOMAIN" # -d 'name=example.com'(DOMAIN)
++
++__URL="${__URL}&content=$__IP" # -d 'content=1.2.3.4'
++__URL="${__URL}&service_mode=0" # -d 'service_mode=0'
++__URL="${__URL}&ttl=1" # -d 'ttl=1'
++
++# lets do the update
++do_transfer "$__URL" || return 1
++
++cleanup # cleanup tmp file
++json_load "$(cat $DATFILE)" # lets extract data
++json_get_var __RES "result" # cloudflare result of last request
++json_get_var __MSG "msg" # cloudflare error message
++[ "$__RES" != "success" ] && {
++ write_log 4 "'rec_edit' failed with error:\n$__MSG"
++ return 1
++}
++write_log 7 "Update of rec_id '$__RECID' successful"
++return 0
+diff --git a/feeds/packages/net/ddns-scripts/files/update_No-IP.com.sh b/feeds/packages/net/ddns-scripts/files/update_No-IP.com.sh
+new file mode 100644
+index 0000000..9d73448
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/update_No-IP.com.sh
+@@ -0,0 +1,52 @@
++#
++#.Distributed under the terms of the GNU General Public License (GPL) version 2.0
++#
++# script for sending updates to no-ip.com / noip.com
++#.2014-2015 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++#
++# This script is parsed by dynamic_dns_functions.sh inside send_update() function
++#
++# provider did not reactivate records, if no IP change was recognized
++# so we send a dummy (localhost) and a seconds later we send the correct IP addr
++#
++local __DUMMY
++local __UPDURL="http://[USERNAME]:[PASSWORD]@dynupdate.no-ip.com/nic/update?hostname=[DOMAIN]&myip=[IP]"
++# inside url we need username and password
++[ -z "$username" ] && write_log 14 "Service section not configured correctly! Missing 'username'"
++[ -z "$password" ] && write_log 14 "Service section not configured correctly! Missing 'password'"
++
++# set IP version dependend dummy (localhost)
++[ $use_ipv6 -eq 0 ] && __DUMMY="127.0.0.1" || __DUMMY="::1"
++
++# lets do DUMMY transfer
++write_log 7 "sending dummy IP to 'no-ip.com'"
++__URL=$(echo $__UPDURL | sed -e "s#\[USERNAME\]#$URL_USER#g" -e "s#\[PASSWORD\]#$URL_PASS#g" \
++ -e "s#\[DOMAIN\]#$domain#g" -e "s#\[IP\]#$__DUMMY#g")
++[ $use_https -ne 0 ] && __URL=$(echo $__URL | sed -e 's#^http:#https:#')
++
++do_transfer "$__URL" || return 1
++
++write_log 7 "'no-ip.com' answered:\n$(cat $DATFILE)"
++# analyse provider answers
++# "good [IP_ADR]" = successful
++# "nochg [IP_ADR]" = no change but OK
++grep -E "good|nochg" $DATFILE >/dev/null 2>&1 || return 1
++
++# lets wait a seconds
++sleep 1
++
++# now send the correct data
++write_log 7 "sending real IP to 'no-ip.com'"
++__URL=$(echo $__UPDURL | sed -e "s#\[USERNAME\]#$URL_USER#g" -e "s#\[PASSWORD\]#$URL_PASS#g" \
++ -e "s#\[DOMAIN\]#$domain#g" -e "s#\[IP\]#$__IP#g")
++[ $use_https -ne 0 ] && __URL=$(echo $__URL | sed -e 's#^http:#https:#')
++
++do_transfer "$__URL" || return 1
++
++write_log 7 "'no-ip.com' answered:\n$(cat $DATFILE)"
++# analyse provider answers
++# "good [IP_ADR]" = successful
++# "nochg [IP_ADR]" = no change but OK
++grep -E "good|nochg" $DATFILE >/dev/null 2>&1
++return $? # "0" if "good" or "nochg" found
++
+diff --git a/feeds/packages/net/ddns-scripts/files/update_nsupdate.sh b/feeds/packages/net/ddns-scripts/files/update_nsupdate.sh
+new file mode 100644
+index 0000000..1af9404
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/files/update_nsupdate.sh
+@@ -0,0 +1,46 @@
++#
++#.Distributed under the terms of the GNU General Public License (GPL) version 2.0
++#
++# The script directly updates a PowerDNS (or maybe bind server) via nsupdate from bind-client package.
++#.based on github request #957 by Jan Riechers <de at r-jan dot de>
++#.2015 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++#
++# This script is parsed by dynamic_dns_functions.sh inside send_update() function
++#
++# using following options from /etc/config/ddns
++# option username - keyname
++# option password - shared secret (base64 encoded)
++# option domain - full qualified domain to update
++# option dns_server - DNS server to update
++#
++# variable __IP already defined with the ip-address to use for update
++#
++local __TTL=600 #.preset DNS TTL (in seconds)
++local __RRTYPE __PW __TCP
++
++[ -x /usr/bin/nsupdate ] || write_log 14 "'nsupdate' not installed or not executable !"
++
++[ -z "$username" ] && write_log 14 "Service section not configured correctly! Missing 'username'"
++[ -z "$password" ] && write_log 14 "Service section not configured correctly! Missing 'password'"
++[ -z "$dns_server" ] && write_log 14 "Service section not configured correctly! Missing 'dns_server'"
++
++[ $use_ipv6 -ne 0 ] && __RRTYPE="AAAA" || __RRTYPE="A"
++[ $force_dnstcp -ne 0 ] && __TCP="-v" || __TCP=""
++
++# create command file
++cat >$DATFILE <<-EOF
++server $dns_server
++key $username $password
++update del $domain $__RRTYPE
++update add $domain $__TTL $__RRTYPE $__IP
++show
++send
++quit
++EOF
++
++/usr/bin/nsupdate -d $__TCP $DATFILE >$ERRFILE 2>&1
++
++# nsupdate always return success
++write_log 7 "nsupdate reports:\n$(cat $ERRFILE)"
++
++return 0
+\ No newline at end of file
+diff --git a/feeds/packages/net/ddns-scripts/samples/ddns.config_sample b/feeds/packages/net/ddns-scripts/samples/ddns.config_sample
+new file mode 100644
+index 0000000..b96a7af
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/samples/ddns.config_sample
+@@ -0,0 +1,299 @@
++#
++#
++# Here you find a description on every parameter supported
++# and used by ddns-scripts and corresponding LuCI application
++#
++# Inside your ddns configuration file (/etc/config/ddns)
++# you might not find some of below described options.
++# This is because you don't need to define options
++# if using there defaults. The LuCI application will delete
++# options that configured to there default values.
++#
++# If you have a working ddns configuration from old ddns-scripts (Version 1.x)
++# everything will function the same with new scripts
++# without any changes to the configuration.
++#
++# If you like to use this file for your configuration then
++# use a copy, because the used software to modify the
++# configuration files will throw away all empty lines
++# and those starting with # (comments).
++#
++
++#####################################################################
++# Global application settings
++#
++config ddns "global"
++
++ ###########
++ # set date format to use for display date in logfiles
++ # and LuCI web application.
++ # For codes see man pages of date command.
++ # default: "%F %R" (ISO 8601 format)
++# option date_format "%F %R"
++
++ ###########
++ # set run directory to use for .pid and .update files
++ # there will be a separate file for every running service section
++ # default: "/var/run/ddns"
++# option run_dir "/var/run/ddns"
++
++ ###########
++ # set log directory to use for .log files
++ # there will be a separate file for every running service section
++ # default: "/var/log/ddns"
++# option log_dir "/var/log/ddns"
++
++ ###########
++ # set number of lines stored in .log file before auto truncated
++ # default: "250" lines
++# option log_lines "250"
++
++ ###########
++ # Whether to allow to send Private/Special IP's to the DDNS provider
++ # IPv4: 0.x, 10.x, 127.x, 172.16.x-172.31.x, 192.168.x
++ # IPv6: ::, Fxxx:
++ # default: "0" disabled
++# option allow_local_ip "0"
++
++#####################################################################
++# DDNS service settings
++#
++# for each service you want to serve you need a separate configuration
++# if you need IPv4 and IPv6 you need to setup 2 separate configurations
++# with different names. (i.e. "myddns_ipv4" and "myddns_ipv6")
++# do not use white-spaces or dashes "-" or "@" ":" "!" or
++# other special characters inside name.
++config service "myddns"
++
++ ########### Basic settings ########################
++
++ ###########
++ # enable/disable this service section
++ # default: "0" disabled
++ option enabled "0"
++
++ ###########
++ # detecting/sending IPv4 or IPv6 address to the DDNS provider
++ # set to "1" if you want to use IPv6
++ # default: "0" use IPv4
++ option use_ipv6 "0"
++
++ ###########
++ # defines the network as defined in /etc/config/network
++ # to be monitored for up/down events to start via hotplug
++ default: "wan" for IPv4
++ default: "wan6" for IPv6
++ option interface "wan"
++
++ ###########
++ # Next you need to specify the name of the service you are
++ # connecting to "eg. dyndns.org". The format of the update
++ # urls for several different dynamic dns services is specified
++ # in the "/usr/lib/ddns/services" file for IPv4 and in
++ # "/usr/lib/ddns/service_ipv6" file. This list is hardly complete
++ # as there are many, many different dynamic dns services.
++ # If your service is on the list you can merely specify it with the
++ # "service_name" option. Otherwise you will need to determine
++ # the format of the url to update with. You can either add an
++ # entry to the "/usr/lib/ddns/services" or "services_ipv6" file
++ # or specify this with the "update_url" option.
++ # If your ddns provider doesn't work with ddns-scripts because
++ # there are additional parameters or other special thinks to be done,
++ # then you could write your own script to send updates to your ddns provider.
++ # Have a look into /usr/lib/ddns/update_sample.sh
++ # The script is specified in "update_script"
++ # Either set "service_name" or one of "update_url" and "update_script"
++ # default: none
++ option service_name "dyndns.org"
++
++ # sample:
++ # "http://[USERNAME]:[PASSWORD]@members.dyndns.org/nic/update?hostname=[DOMAIN]&myip=[IP]"
++# option update_url ""
++
++ # sample:
++ # "/usr/lib/ddns/update_sample.sh"
++# option update_script ""
++
++ ###########
++ # You must specify your domain/host name, your username and your password
++ # as you get from you DDNS provider. Keep an eye on providers help pages.
++ #
++ # Your DNS name / replace [DOMAIN] in update_url
++ # default: none
++ option domain ""
++
++ # Username of your DDNS service account / replace [USERNAME] in update_url
++ # default: none
++ option username ""
++
++ # Password of your DDNS service account / replace [PASSWORD] in update_url
++ # default: none
++ option password ""
++
++ ###########
++ # use HTTPS for secure communication with you DDNS provider
++ # personally found some providers having problems when not sending
++ # updates via HTTPS. You must not specify "https://" in update_url.
++ # It's modified by the scripts themselves
++ # Needs GNU Wget (with SSL support) or cURL to be installed.
++ # default: "0" do not use HTTPS
++ option use_https "0"
++
++ # if using HTTPS (see above) the transfer program tries to verify
++ # the providers server certificate. For verification there needs to be
++ # the counterpart on this machine. Specify the path or path/file where
++ # the transfer program can find them. (might need package CA-certificates)
++ # if you don't want to verify servers certificate (insecure) you should
++ # this parameter to "IGNORE" (in capital letters)
++ # default: (none) path where CA-certificate package is installed
++ option cacert "/etc/ssl/certs"
++
++ ###########
++ # for logging and control if everything work fine you can get information inside
++ # system log . Critical Errors are always send to system log.
++ # You can define which information you like to log
++ # 1 == info, notice, warning, errors
++ # 2 == notice, warning, errors
++ # 3 == warning, errors
++ # 4 == errors
++ # default: "0" off
++ option use_syslog "0"
++
++ ###########
++ # for logging and control if everything work fine you can get information inside
++ # log file. You find the file per default in /var/log/ddns/[sectionname].log
++ # The path can be modified for all log files in ddns.global section (see above)
++ # default: "1" on
++ option use_logfile "1"
++
++ ########### Advanced settings #####################
++
++ ###########
++ # you need to specify how ddns-scripts should detect you current local ip.
++ # the ip_source could be set to "network", "web", "interface" or "script"
++ # the parameters below specifying the additional information needed for
++ # the corresponding ip_spource configuration
++ # default: "network"
++
++ # ip_source "network" additional uses option ip_network and detects the
++ # current local ip on network as defined in /etc/config/network
++ # default: "wan" using IPv4
++ # default: "wan6" using IPv6
++ option ip_source "network"
++ option ip_network "wan"
++
++ # ip_source "web" additional uses option ip_url and detects the current
++ # local ip from special web sides that response with the ip address of
++ # calling host. If you are behind a firewall/NAT this is the best option
++ # since none of the local networks or interfaces will have the external ip.
++ # default: "http://checkip.dyndns.com" using IPv4
++ # default: "http://checkipv6.dyndns.com" using IPv6
++# option ip_source "web"
++# option ip_url "http://checkip.dyndns.com"
++
++ # ip_source "interface" additional uses option ip_interface
++ # ip_source "interface" uses one of the locally installed physical interfaces
++ # to detect independent from network they configured to.
++ # default: none
++# option ip_source "interface"
++# option ip_interface "eth1"
++
++ # ip_source "script" additional uses option ip_script
++ # it's useful if you want to write your own script to detect the
++ # current local ip. put full path into ip_script option.
++ # The script must be executable.
++ # default: none
++# option ip_source "script"
++# option ip_script ""
++
++ ###########
++ # force_ipversion option will set the "-4" respectively "-6" parameter
++ # on command line of transfer and DNS lookup program.
++ # So the whole communication uses the selected IP version between both ends.
++ # needs GNU Wget or cURL installed for transfer and
++ # BIND's host for DNS lookup.
++ # default: "0" disabled
++ option force_ipversion "0"
++
++ ###########
++ # Normally the current (in the internet) registered ip is detected using the
++ # local defined name lookup policies (i.e. /etc/resolve.conf etc.)
++ # Specify here a DNS server to use instead of the defaults.
++ # you can use hostname or ip address
++ # i.e. "google-public-dns-a.google.com"
++ # default: none
++# option dns_server "google-public-dns-a.google.com"
++
++ # By default every DNS call is made via UDP protocol
++ # Some internet provider offer modems that cache UDP DNS requests.
++ # They also redirect calls to external servers to local.
++ # To force the usage of TCP for DNS requests enable this option
++ # Needs BIND's host program be installed
++ # default: "0" disabled
++# option force_dnstcp "0"
++
++ ###########
++ # If a Proxy is need to access HTTP/HTTPS pages on the WEB
++ # it can be configured here also for sending updates to the
++ # DDNS provider. If you configured use_https='1' above, you
++ # need to setup your HTTPS proxy here, otherwise your
++ # HTTP proxy. !!! You should not detect your current IP
++ # ip_source='web' (see above) because this request is also
++ # send via the configured proxy !!!
++ # Syntax: [user:password@]proxy:port !port is required !
++ # IPv6 address must be in squared brackets "[...]"
++ # default: none
++# option proxy ''
++
++ ###########
++ # In some very special configurations i.e. Multi WAN environment
++ # in a NAT cascade it might be necessary to define
++ # a network to use for communication.
++ # should use option ip_source "web" (see above)
++ # Needs GNU Wget (with SSL support) or cURL to be installed.
++ # GNU Wget will use IP address and cURL the physical device
++ # of the given network
++ # default: none
++# option bind_network "wan7"
++
++ ########### Timer settings ########################
++
++ ###########
++ # defines the time interval to check if local IP has changed
++ # After the first start and first update send, the system will
++ # wait this time before verify if update was successful send.
++ # !!! checks below 5 minutes make no sense because the Internet
++ # needs about 5-10 minutes to sync an IP-change to all DNS servers !!!
++ # accepted unit entry’s: 'seconds' 'minutes' 'hours'
++ # minimum 5 minutes == 300 seconds
++ # default 10 minutes
++ option check_interval '10'
++ option check_unit 'minutes'
++
++ ###########
++ # force to send an update to service provider, if no change was detected.
++ # consult DDNS providers documentation if your DDNS entry might timeout.
++ # accepted unit entry’s: 'minutes' 'hours' 'days'
++ # minimum needs to be greater or equal check interval (see above)
++ # A special setting of '0' is allowed, which forces the script to run once.
++ # It sends an update, verify if update was accepted by DNS
++ # (retry if not) and finish. Useful if you want to start by your own (i.e. cron)
++ # default 3 days == 72 hours
++ option force_interval '72'
++ option force_unit 'hours'
++
++ ###########
++ # if error happen on detecting, sending or updating the
++ # script will retry the relevant action for retry_count times
++ # before stopping script execution.
++ # default: 5
++ option retry_count '5'
++
++ ###########
++ # if error happen on detecting, sending or updating the
++ # script will retry the relevant action.
++ # here you define the time to wait before retry is started
++ # accepted unit entry’s: 'seconds' 'minutes'
++ # default: 60 seconds
++ option retry_interval '60'
++ option retry_unit 'seconds'
+diff --git a/feeds/packages/net/ddns-scripts/samples/getlocalip_sample.sh b/feeds/packages/net/ddns-scripts/samples/getlocalip_sample.sh
+new file mode 100755
+index 0000000..b98806b
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/samples/getlocalip_sample.sh
+@@ -0,0 +1,35 @@
++#!/bin/sh
++#
++# sample script for detecting local IP
++# 2014-2015 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++#
++# activated inside /etc/config/ddns by setting
++#
++# option ip_source 'script'
++# option ip_script '/usr/lib/ddns/getlocalip_sample.sh -6' !!! parameters ALLOWED
++#
++# the script is executed (not parsed) inside get_local_ip() function
++# of /usr/lib/ddns/dynamic_dns_functions.sh
++#
++# useful when this box is the only DDNS client in the network
++# IP adresses of "internal" boxes could be detected with this script
++# so no need to install ddns client on every "internal" box
++# On IPv6 every internal box normally has it's own external IP
++#
++# This script should
++# - return the IP address via stdout echo -n "...." !!! without line feed
++# - report errors via stderr echo "...." >&2
++# - return an error code ('0' for success) exit 123
++
++case $1 in
++ -4) echo -n "8.8.8.8" # never append linefeed or simular
++ exit 0
++ ;; # IP's of Googles public DNS
++ -6) echo -n "2001:4860:4860::8888"
++ exit 0
++ ;;
++ *) echo "$0 - Invalid or missing parameter" >&2
++ exit 1
++esac
++echo "Should never come here" >&2
++exit 2
+diff --git a/feeds/packages/net/ddns-scripts/samples/update_sample.sh b/feeds/packages/net/ddns-scripts/samples/update_sample.sh
+new file mode 100644
+index 0000000..1799d22
+--- /dev/null
++++ b/feeds/packages/net/ddns-scripts/samples/update_sample.sh
+@@ -0,0 +1,39 @@
++# sample script for sending user defined updates
++# 2014-2015 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
++#
++# activated inside /etc/config/ddns by setting
++#
++# option update_script '/usr/lib/ddns/update_sample.sh'
++#
++# the script is parsed (not executed) inside send_update() function
++# of /usr/lib/ddns/dynamic_dns_functions.sh
++# so you can use all available functions and global variables inside this script
++# already defined in dynamic_dns_updater.sh and dynamic_dns_functions.sh
++#
++# It make sence to define the update url ONLY inside this script
++# because it's anyway unique to the update script
++# otherwise it should work with the default scripts
++#
++# the code here is the copy of the default used inside send_update()
++#
++# tested with spdns.de
++local __URL="http://[USERNAME]:[PASSWORD]@update.spdns.de/nic/update?hostname=[DOMAIN]&myip=[IP]"
++# inside url we need username and password
++[ -z "$username" ] && write_log 14 "Service section not configured correctly! Missing 'username'"
++[ -z "$password" ] && write_log 14 "Service section not configured correctly! Missing 'password'"
++
++# do replaces in URL
++__URL=$(echo $__URL | sed -e "s#\[USERNAME\]#$URL_USER#g" -e "s#\[PASSWORD\]#$URL_PASS#g" \
++ -e "s#\[DOMAIN\]#$domain#g" -e "s#\[IP\]#$__IP#g")
++[ $use_https -ne 0 ] && __URL=$(echo $__URL | sed -e 's#^http:#https:#')
++
++do_transfer "$__URL" || return 1
++
++write_log 7 "DDNS Provider answered:\n$(cat $DATFILE)"
++
++# analyse provider answers
++# "good [IP_ADR]" = successful
++# "nochg [IP_ADR]" = no change but OK
++grep -E "good|nochg" $DATFILE >/dev/null 2>&1
++return $? # "0" if "good" or "nochg" found
++
+diff --git a/feeds/packages/net/dhcpcd/Makefile b/feeds/packages/net/dhcpcd/Makefile
+new file mode 100644
+index 0000000..9add734
+--- /dev/null
++++ b/feeds/packages/net/dhcpcd/Makefile
+@@ -0,0 +1,63 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dhcpcd
++PKG_VERSION:=6.4.3
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=ftp://roy.marples.name/pub/dhcpcd \
++ http://roy.marples.name/downloads/dhcpcd
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_MD5SUM:=b22005c131e7108ecf598b6a4ac091eb
++
++PKG_LICENSE:=BSD-2c
++PKG_LICENSE_FILES:=
++
++PKG_MAINTAINER:=Roy Marples <roy@marples.name>
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/dhcpcd
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=DHCPv4/IPv4LL/IPv6RS/DHCPv6 quad stack client
++ URL:=http://roy.marples.name/projects/dhcpcd
++endef
++
++define Package/dhcpcd/description
++ DHCPv4, IPv6RS and DHCPv6 client with IPv4LL support
++ dhcpcd is a one stop network management daemon which includes
++ * RFC compliant DHCPv4 and DHCPv6 clients
++ * DHCPv6 Prefix Delegation support
++ * IPv4LL (aka ZeroConf) support
++ * ARP address conflict resolution
++ * Link carrier detection
++ * Wireless SSID profiles
++ * ARP ping profiles
++endef
++
++CONFIGURE_ARGS+= --prefix=/ --sbindir=/sbin \
++ --libexecdir=/lib/dhcpcd --dbdir=/var/dhcpcd
++
++define Package/dhcpcd/install
++ $(INSTALL_DIR) $(1)/sbin $(1)/etc $(1)/lib/dhcpcd/dhcpcd-hooks
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/sbin/dhcpcd $(1)/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/lib/dhcpcd/dhcpcd-run-hooks \
++ $(1)/lib/dhcpcd/
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/lib/dhcpcd/dhcpcd-hooks/* \
++ $(1)/lib/dhcpcd/dhcpcd-hooks/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/dhcpcd.init $(1)/etc/init.d/dhcpcd
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/dhcpcd.conf $(1)/etc/dhcpcd.conf
++endef
++
++$(eval $(call BuildPackage,dhcpcd))
+diff --git a/feeds/packages/net/dhcpcd/files/dhcpcd.init b/feeds/packages/net/dhcpcd/files/dhcpcd.init
+new file mode 100755
+index 0000000..2fad41d
+--- /dev/null
++++ b/feeds/packages/net/dhcpcd/files/dhcpcd.init
+@@ -0,0 +1,24 @@
++#!/bin/sh /etc/rc.common
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++START=30
++STOP=85
++USE_PROCD=1
++
++start_service()
++{
++ procd_open_instance
++ procd_set_param command /sbin/dhcpcd -B
++ procd_set_param respawn
++ procd_close_instance
++}
++
++reload_service()
++{
++ /sbin/dhcpcd -n
++}
+diff --git a/feeds/packages/net/dhcpcd/patches/001-fix-musl.patch b/feeds/packages/net/dhcpcd/patches/001-fix-musl.patch
+new file mode 100644
+index 0000000..5751a4c
+--- /dev/null
++++ b/feeds/packages/net/dhcpcd/patches/001-fix-musl.patch
+@@ -0,0 +1,13 @@
++--- a/dhcp6.c
+++++ b/dhcp6.c
++@@ -1047,8 +1047,8 @@ logsend:
++
++ ctx = ifp->ctx->ipv6;
++ dst.sin6_scope_id = ifp->index;
++- ctx->sndhdr.msg_name = (caddr_t)&dst;
++- ctx->sndhdr.msg_iov[0].iov_base = (caddr_t)state->send;
+++ ctx->sndhdr.msg_name = (void *)&dst;
+++ ctx->sndhdr.msg_iov[0].iov_base = (void *)state->send;
++ ctx->sndhdr.msg_iov[0].iov_len = state->send_len;
++
++ /* Set the outbound interface */
+diff --git a/feeds/packages/net/dmapd/Makefile b/feeds/packages/net/dmapd/Makefile
+new file mode 100644
+index 0000000..d53c557
+--- /dev/null
++++ b/feeds/packages/net/dmapd/Makefile
+@@ -0,0 +1,66 @@
++#
++# Copyright (C) 2009-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dmapd
++PKG_VERSION:=0.0.72
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.flyn.org/projects/dmapd
++PKG_MD5SUM:=0fe290d1bf003296b1ed9dfcc0108d6f
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=2
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/dmapd
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libdmapsharing +libdb47 +vips
++ TITLE:= dmapd
++ URL:=http://www.flyn.org/projects/dmapd/
++ USERID:=dmapd=56:dmapd=56
++endef
++
++define Package/dmapd/decription
++ Dmapd is a DMAP server
++endef
++
++define Package/dmapd/conffiles
++/etc/dmapd.conf
++endef
++
++TARGET_LDFLAGS+=\
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
++
++define Package/dmapd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/distro/dmapd.conf $(1)/etc/
++ $(INSTALL_BIN) ./files/dmapd.init $(1)/etc/init.d/dmapd
++ $(INSTALL_DIR) $(1)/usr/lib/dmapd/$(PKG_VERSION)/modules
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/sbin/dmapd \
++ $(1)/usr/sbin/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libdmapd.so* \
++ $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/dmapd/$(PKG_VERSION)/modules/*.so \
++ $(1)/usr/lib/dmapd/$(PKG_VERSION)/modules/
++endef
++
++$(eval $(call BuildPackage,dmapd))
+diff --git a/feeds/packages/net/dmapd/files/dmapd.init b/feeds/packages/net/dmapd/files/dmapd.init
+new file mode 100644
+index 0000000..76ecd50
+--- /dev/null
++++ b/feeds/packages/net/dmapd/files/dmapd.init
+@@ -0,0 +1,28 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2012 OpenWrt.org
++
++START=60
++
++start() {
++ [ -d /var/run/dmapd ] || {
++ mkdir -m 0755 -p /var/run/dmapd
++ chown dmapd:dmapd /var/run/dmapd
++ }
++ [ -d /var/db/dmapd/DAAP ] || {
++ mkdir -m 0755 -p /var/db/dmapd/DAAP
++ chown dmapd:dmapd /var/db/dmapd/DAAP
++ }
++ [ -d /var/db/dmapd/DPAP ] || {
++ mkdir -m 0755 -p /var/db/dmapd/DPAP
++ chown dmapd:dmapd /var/db/dmapd/DPAP
++ }
++ mkdir -m 0755 -p /var/lock/subsys
++ mkdir -m 0755 -p /var/media/music
++ mkdir -m 0755 -p /var/media/pictures
++
++ service_start /usr/sbin/dmapd -u dmapd -g dmapd -m /var/media/music -p /var/media/pictures --vips-disc-threshold 64k
++}
++
++stop() {
++ service_stop /usr/sbin/dmapd
++}
+diff --git a/feeds/packages/net/dmapd/patches/001-dmapd_conf.patch b/feeds/packages/net/dmapd/patches/001-dmapd_conf.patch
+new file mode 100644
+index 0000000..9c1e60a
+--- /dev/null
++++ b/feeds/packages/net/dmapd/patches/001-dmapd_conf.patch
+@@ -0,0 +1,11 @@
++--- a/distro/dmapd.conf
+++++ b/distro/dmapd.conf
++@@ -3,7 +3,7 @@
++ Database-Dir=/var/db/dmapd
++
++ # Name that will be used to identify share:
++-Share-Name=dmapd
+++Share-Name=OpenWrt
++
++ # User that dmapd will run as, current user if undefined:
++ User=dmapd
+diff --git a/feeds/packages/net/dmapd/patches/002-make_unit_test_optionnal.patch b/feeds/packages/net/dmapd/patches/002-make_unit_test_optionnal.patch
+new file mode 100644
+index 0000000..3f42f6b
+--- /dev/null
++++ b/feeds/packages/net/dmapd/patches/002-make_unit_test_optionnal.patch
+@@ -0,0 +1,17 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -233,7 +233,13 @@ else
++ AM_CONDITIONAL(USE_LIBDB, false)
++ fi
++
++-PKG_CHECK_MODULES([CHECK], [check >= 0.9.4],have_check=yes,have_check=no)
+++dnl Test if --enable-unit-test given
+++AC_ARG_ENABLE(unit-test, [AC_HELP_STRING([--enable-unit-test],[enable unit test])])
+++if test "x$enable_unit_test" = "xyes" ; then
+++ PKG_CHECK_MODULES([CHECK], [check >= 0.9.4],have_check=yes,have_check=no)
+++else
+++ have_check=no
+++fi
++ AM_CONDITIONAL(HAVE_CHECK, test x"$have_check" = "xyes")
++
++ AM_CONDITIONAL(FLYN, test "$FLYN")
+diff --git a/feeds/packages/net/dnscrypt-proxy/Makefile b/feeds/packages/net/dnscrypt-proxy/Makefile
+new file mode 100644
+index 0000000..ae7ab88
+--- /dev/null
++++ b/feeds/packages/net/dnscrypt-proxy/Makefile
+@@ -0,0 +1,119 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dnscrypt-proxy
++PKG_VERSION:=1.6.0
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://download.dnscrypt.org/dnscrypt-proxy
++PKG_MD5SUM:=039b8106cf4e15302dc2487cb7fbb17b
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_MAINTAINER:=Damiano Renfer <damiano.renfer@gmail.com>
++PKG_LICENSE:=ISC
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/dnscrypt-proxy/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ DEPENDS:=+libsodium
++ URL:=http://dnscrypt.org/
++ MAINTAINER:=Damiano Renfer <damiano.renfer@gmail.com>
++endef
++
++define Package/dnscrypt-proxy
++ $(call Package/dnscrypt-proxy/Default)
++ TITLE:=A tool for securing communications between a client and a DNS resolver
++endef
++
++define Package/dnscrypt-proxy/description
++ dnscrypt-proxy provides local service which can be used directly as your
++ local resolver or as a DNS forwarder, encrypting and authenticating requests
++ using the DNSCrypt protocol and passing them to an upstream server.
++ The DNSCrypt protocol uses high-speed high-security elliptic-curve cryptography
++ and is very similar to DNSCurve, but focuses on securing communications between
++ a client and its first-level resolver.
++endef
++
++define Package/hostip
++ $(call Package/dnscrypt-proxy/Default)
++ TITLE:=Resolver to IPv4 or IPv6 addresses
++endef
++
++define Package/hostip/description
++ The DNSCrypt proxy ships with a simple tool named hostip that resolves a name
++ to IPv4 or IPv6 addresses.
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --prefix=/usr \
++ --disable-ssp \
++ )
++endef
++
++TARGET_CFLAGS += \
++ -fomit-frame-pointer \
++ -fdata-sections \
++ -ffunction-sections
++
++TARGET_LDFLAGS += \
++ -Wl,-gc-sections
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)"
++
++define Package/dnscrypt-proxy/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/dnscrypt-proxy $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/share/dnscrypt-proxy
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv $(1)/usr/share/dnscrypt-proxy/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/dnscrypt-proxy.init $(1)/etc/init.d/dnscrypt-proxy
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/dnscrypt-proxy.config $(1)/etc/config/dnscrypt-proxy
++endef
++
++define Package/dnscrypt-proxy/postinst
++#!/bin/sh
++# check if we are on real system
++if [ -z "$${IPKG_INSTROOT}" ]; then
++ echo "Enabling rc.d symlink for dnscrypt-proxy"
++ /etc/init.d/dnscrypt-proxy enable
++fi
++exit 0
++endef
++
++define Package/dnscrypt-proxy/prerm
++#!/bin/sh
++# check if we are on real system
++if [ -z "$${IPKG_INSTROOT}" ]; then
++ echo "Removing rc.d symlink for dnscrypt-proxy"
++ /etc/init.d/dnscrypt-proxy disable
++fi
++exit 0
++endef
++
++define Package/dnscrypt-proxy/conffiles
++ /etc/config/dnscrypt-proxy
++endef
++
++define Package/hostip/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/hostip $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,dnscrypt-proxy))
++$(eval $(call BuildPackage,hostip))
+diff --git a/feeds/packages/net/dnscrypt-proxy/files/dnscrypt-proxy.config b/feeds/packages/net/dnscrypt-proxy/files/dnscrypt-proxy.config
+new file mode 100644
+index 0000000..42e25bf
+--- /dev/null
++++ b/feeds/packages/net/dnscrypt-proxy/files/dnscrypt-proxy.config
+@@ -0,0 +1,8 @@
++config dnscrypt-proxy
++ option address '127.0.0.1'
++ option port '5353'
++ # option resolver 'cisco'
++ # option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'
++ # option ephemeral_keys '1'
++ # more details at https://github.com/jedisct1/dnscrypt-proxy#public-key-client-authentication
++ # option client_key ''
+diff --git a/feeds/packages/net/dnscrypt-proxy/files/dnscrypt-proxy.init b/feeds/packages/net/dnscrypt-proxy/files/dnscrypt-proxy.init
+new file mode 100644
+index 0000000..16eaa3a
+--- /dev/null
++++ b/feeds/packages/net/dnscrypt-proxy/files/dnscrypt-proxy.init
+@@ -0,0 +1,31 @@
++#!/bin/sh /etc/rc.common
++
++START=50
++
++start_instance () {
++ local section="$1"
++ config_get address "$section" 'address'
++ config_get port "$section" 'port'
++ config_get resolver "$section" 'resolver'
++ config_get resolvers_list "$section" 'resolvers_list'
++ config_get client_key "$section" 'client_key'
++ config_get_bool ephemeral_keys "$section" 'ephemeral_keys'
++
++ service_start /usr/sbin/dnscrypt-proxy -d \
++ -a ${address}:${port} \
++ -u nobody \
++ -L ${resolvers_list:-'/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'} \
++ -R ${resolver:-'cisco'} \
++ ${ephemeral_keys:+'-E'} \
++ ${client_key:+'--client-key='$client_key}
++}
++
++start() {
++ config_load 'dnscrypt-proxy'
++ config_foreach start_instance 'dnscrypt-proxy'
++}
++
++stop() {
++ service_stop /usr/sbin/dnscrypt-proxy
++}
++
+diff --git a/feeds/packages/net/e2guardian/Makefile b/feeds/packages/net/e2guardian/Makefile
+new file mode 100644
+index 0000000..fac9737
+--- /dev/null
++++ b/feeds/packages/net/e2guardian/Makefile
+@@ -0,0 +1,83 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=e2guardian
++PKG_VERSION:=3.2.0
++PKG_RELEASE:=1
++
++PKG_LICENSE:=GPL-2.0
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_SOURCE:=v$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/$(PKG_NAME)/$(PKG_NAME)/archive/
++PKG_MD5SUM:=70613669ef00a480e3ebb62e12427cf4
++
++PKG_FIXUP:=autoreconf
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/e2guardian
++ SECTION:=net
++ DEPENDS:=+libpthread $(CXX_DEPENDS) +zlib +libpcre
++ CATEGORY:=Network
++ SUBMENU:=Web Servers/Proxies
++ TITLE:=E2Guardian
++ URL:=http://e2guardian.org/cms/
++endef
++
++define Package/e2guardian/conffiles
++/etc/e2guardian/e2guardianf1.conf
++/etc/config/e2guardian
++endef
++
++CONFIGURE_VARS += \
++ INCLUDES="" \
++ CXXFLAGS="$$$$CXXFLAGS -fno-rtti" \
++ LIBS="-lpthread"
++
++CONFIGURE_ARGS += \
++ --with-sysconfsubdir=e2guardian \
++ --with-proxyuser=nobody \
++ --with-proxygroup=nogroup \
++ --enable-pcre=yes \
++ --with-piddir=/tmp/e2guardian/ \
++ --enable-sslextralists=no \
++ --enable-sslmitm=no
++
++define Build/Configure
++ ( cd $(PKG_BUILD_DIR); ./autogen.sh )
++ $(call Build/Configure/Default,$CONFIGURE_ARGS)
++endef
++
++define Package/e2guardian/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/e2guardian $(1)/usr/sbin/
++
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_INSTALL_DIR)/etc/e2guardian $(1)/etc/
++ $(INSTALL_CONF) ./files/e2guardianf1.conf $(1)/etc/e2guardian/e2guardianf1.conf
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/e2guardian.config $(1)/etc/config/e2guardian
++
++ $(INSTALL_DIR) $(1)/usr/share/e2guardian
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/share/e2guardian/transparent1x1.gif $(1)/usr/share/e2guardian/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/share/e2guardian/blockedflash.swf $(1)/usr/share/e2guardian/
++
++ $(INSTALL_DIR) $(1)/usr/share/e2guardian/languages/ukenglish
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/e2guardian/languages/ukenglish/* $(1)/usr/share/e2guardian/languages/ukenglish/
++
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) ./files/e2guardian.init $(1)/etc/init.d/e2guardian
++endef
++
++$(eval $(call BuildPackage,e2guardian))
+diff --git a/feeds/packages/net/e2guardian/files/e2guardian.config b/feeds/packages/net/e2guardian/files/e2guardian.config
+new file mode 100644
+index 0000000..a876151
+--- /dev/null
++++ b/feeds/packages/net/e2guardian/files/e2guardian.config
+@@ -0,0 +1,69 @@
++config e2guardian 'e2guardian'
++ option languagedir '/usr/share/e2guardian/languages'
++ option language 'ukenglish'
++ option loglevel '2'
++ option logexceptionhits '2'
++ option logfileformat '1'
++ option loglocation '/var/log/e2guardian/access.log'
++ option maxuploadsize '-1'
++ option filterports '8080'
++ option proxyip '127.0.0.1'
++ option proxyport '3128'
++ option proxytimeout '20'
++ option proxyexchange '20'
++ option pcontimeout '55'
++ option accessdeniedaddress 'http://YOURSERVER.YOURDOMAIN/cgi-bin/e2guardian.pl'
++ option usecustombannedimage 'on'
++ option custombannedimagefile '/usr/share/e2guardian/transparent1x1.gif'
++ option usecustombannedflash 'on'
++ option custombannedflashfile '/usr/share/e2guardian/blockedflash.swf'
++ option filtergroups '1'
++ option filtergroupslist '/etc/e2guardian/lists/filtergroupslist'
++ option bannediplist '/etc/e2guardian/lists/bannediplist'
++ option exceptioniplist '/etc/e2guardian/lists/exceptioniplist'
++ option perroomdirectory '/etc/e2guardian/lists/bannedrooms/'
++ option showweightedfound 'on'
++ option weightedphrasemode '2'
++ option urlcachenumber '1000'
++ option urlcacheage '900'
++ option scancleancache 'on'
++ option phrasefiltermode '2'
++ option preservecase '0'
++ option hexdecodecontent 'off'
++ option forcequicksearch 'off'
++ option reverseaddresslookups 'off'
++ option reverseclientiplookups 'off'
++ option logclienthostnames 'off'
++ option createlistcachefiles 'on'
++ option prefercachedlists 'off'
++ option maxcontentfiltersize '256'
++ option maxcontentramcachescansize '2000'
++ option maxcontentfilecachescansize '20000'
++ option filecachedir '/tmp'
++ option deletedownloadedtempfiles 'on'
++ option initialtrickledelay '20'
++ option trickledelay '10'
++ option downloadmanager '/etc/e2guardian/downloadmanagers/fancy.conf'
++ option downloadmanager '/etc/e2guardian/downloadmanagers/default.conf'
++ option contentscannertimeout '60'
++ option contentscanexceptions 'off'
++ option recheckreplacedurls 'off'
++ option forwardedfor 'off'
++ option usexforwardedfor 'off'
++ option logconnectionhandlingerrors 'on'
++ option logchildprocesshandling 'off'
++ option maxchildren '180'
++ option minchildren '20'
++ option minsparechildren '16'
++ option preforkchildren '10'
++ option maxsparechildren '32'
++ option maxagechildren '500'
++ option maxips '0'
++ option ipcfilename '/tmp/.dguardianipc'
++ option urlipcfilename '/tmp/.dguardianurlipc'
++ option ipipcfilename '/tmp/.dguardianipipc'
++ option nodaemon 'off'
++ option nologger 'off'
++ option logadblocks 'off'
++ option loguseragent 'off'
++ option softrestart 'off'
+diff --git a/feeds/packages/net/e2guardian/files/e2guardian.init b/feeds/packages/net/e2guardian/files/e2guardian.init
+new file mode 100644
+index 0000000..4a5981e
+--- /dev/null
++++ b/feeds/packages/net/e2guardian/files/e2guardian.init
+@@ -0,0 +1,212 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=90
++STOP=10
++
++USE_PROCD=1
++PROG=/usr/sbin/e2guardian
++CONFIGFILE="/tmp/e2guardian/e2guardian.conf"
++LOGFILE="/tmp/e2guardian/access.log"
++GROUPCONFIG="/tmp/e2guardian/e2guardianf1.conf"
++
++validate_e2guardian_section() {
++ uci_validate_section e2guardian e2guardian "${1}" \
++ 'accessdeniedaddress:string' \
++ 'bannediplist:string' \
++ 'contentscanexceptions:string' \
++ 'contentscanner:string' \
++ 'contentscannertimeout:uinteger' \
++ 'createlistcachefiles:string' \
++ 'custombannedflashfile:string' \
++ 'custombannedimagefile:string' \
++ 'deletedownloadedtempfiles:string' \
++ 'downloadmanager:string' \
++ 'exceptioniplist:string' \
++ 'filecachedir:string' \
++ 'filtergroups:uinteger' \
++ 'filtergroupslist:string' \
++ 'filterip:ipaddr' \
++ 'filterports:port:8080' \
++ 'forcequicksearch:string' \
++ 'forwardedfor:string' \
++ 'hexdecodecontent:string' \
++ 'initialtrickledelay:uinteger' \
++ 'ipcfilename:string' \
++ 'ipipcfilename:string' \
++ 'languagedir:string' \
++ 'language:string' \
++ 'logadblocks:string' \
++ 'logchildprocesshandling:string' \
++ 'logclienthostnames:string' \
++ 'logconnectionhandlingerrors:string' \
++ 'logexceptionhits:range(0,2)' \
++ 'logfileformat:range(1,6)' \
++ 'loglevel:range(0,3)' \
++ 'loglocation:string' \
++ 'loguseragent:string' \
++ 'maxagechildren:uinteger' \
++ 'maxchildren:uinteger' \
++ 'maxcontentfilecachescansize:uinteger' \
++ 'maxcontentfiltersize:uinteger' \
++ 'maxcontentramcachescansize:uinteger' \
++ 'maxips:uinteger' \
++ 'maxsparechildren:uinteger' \
++ 'maxuploadsize:integer' \
++ 'minchildren:uinteger' \
++ 'minsparechildren:uinteger' \
++ 'nodaemon:string' \
++ 'nologger:string' \
++ 'pcontimeout:range(5,300)' \
++ 'perroomdirectory:string' \
++ 'phrasefiltermode:range(0,3)' \
++ 'prefercachedlists:string' \
++ 'preforkchildren:uinteger' \
++ 'preservecase:range(0,2)' \
++ 'proxyexchange:range(20,300)' \
++ 'proxyip:ipaddr' \
++ 'proxyport:port:3128' \
++ 'proxytimeout:range(5,100)' \
++ 'recheckreplacedurls:string' \
++ 'reverseaddresslookups:string' \
++ 'reverseclientiplookups:string' \
++ 'scancleancache:string' \
++ 'showweightedfound:string' \
++ 'softrestart:string' \
++ 'trickledelay:uinteger' \
++ 'urlcacheage:uinteger' \
++ 'urlcachenumber:uinteger' \
++ 'urlipcfilename:string' \
++ 'usecustombannedflash:string' \
++ 'usecustombannedimage:string' \
++ 'usexforwardedfor:string' \
++ 'weightedphrasemode:range(0,2)'
++}
++
++start_service() {
++
++ local accessdeniedaddress bannediplist contentscanexceptions contentscanner contentscannertimeout \
++ createlistcachefiles custombannedflashfile custombannedimagefile deletedownloadedtempfiles \
++ downloadmanager exceptioniplist filecachedir loglocation \
++ filtergroups filtergroupslist filterip filterports forcequicksearch forwardedfor hexdecodecontent \
++ initialtrickledelay ipcfilename ipipcfilename language languagedir logadblocks logchildprocesshandling \
++ logclienthostnames logconnectionhandlingerrors logexceptionhits logfileformat loglevel loguseragent \
++ maxagechildren maxchildren maxcontentfilecachescansize maxcontentfiltersize maxcontentramcachescansize \
++ maxips maxsparechildren maxuploadsize minchildren minsparechildren nodaemon nologger \
++ pcontimeout perroomdirectory phrasefiltermode prefercachedlists preforkchildren preservecase proxyexchange \
++ proxyip proxyport proxytimeout recheckreplacedurls reverseaddresslookups reverseclientiplookups scancleancache \
++ showweightedfound softrestart trickledelay urlcacheage urlcachenumber urlipcfilename usecustombannedflash \
++ usecustombannedimage usexforwardedfor weightedphrasemode
++
++ validate_e2guardian_section e2guardian || {
++ echo "validation failed"
++ return 1
++ }
++
++ mkdir -p $(dirname $CONFIGFILE)
++ chown -R nobody:nogroup $(dirname $CONFIGFILE)
++
++ mkdir -p $(dirname $loglocation)
++ chown -R nobody:nogroup $(dirname $loglocation)
++
++ touch $loglocation
++ chown nobody:nogroup $loglocation
++
++ ln -sf $loglocation $(dirname $LOGFILE)
++ ln -sf /etc/e2guardian/e2guardian.conf $CONFIGFILE
++ ln -sf /etc/e2guardian/e2guardianf1.conf $GROUPCONFIG
++
++ echo "accessdeniedaddress = " $accessdeniedaddress > $CONFIGFILE
++ echo "bannediplist = " $bannediplist >> $CONFIGFILE
++
++ if [ "$contentscanner" != "" ]
++ then
++ echo "contentscanner = " $contentscanner >> $CONFIGFILE
++ fi
++
++ echo "contentscanexceptions = " $contentscanexceptions >> $CONFIGFILE
++ echo "contentscannertimeout = " $contentscannertimeout >> $CONFIGFILE
++ echo "createlistcachefiles = " $createlistcachefiles >> $CONFIGFILE
++ echo "custombannedflashfile = " $custombannedflashfile >> $CONFIGFILE
++ echo "custombannedimagefile = " $custombannedimagefile >> $CONFIGFILE
++ echo "deletedownloadedtempfiles = " $deletedownloadedtempfiles >> $CONFIGFILE
++ echo "downloadmanager = " $downloadmanager >> $CONFIGFILE
++ echo "exceptioniplist = " $exceptioniplist >> $CONFIGFILE
++ echo "filecachedir = " $filecachedir >> $CONFIGFILE
++ echo "filtergroups = " $filtergroups >> $CONFIGFILE
++ echo "filtergroupslist = " $filtergroupslist >> $CONFIGFILE
++ echo "filterip = " $filterip >> $CONFIGFILE
++ echo "filterports = " $filterports >> $CONFIGFILE
++ echo "forcequicksearch = " $forcequicksearch >> $CONFIGFILE
++ echo "forwardedfor = " $forwardedfor >> $CONFIGFILE
++ echo "hexdecodecontent = " $hexdecodecontent >> $CONFIGFILE
++ echo "initialtrickledelay = " $initialtrickledelay >> $CONFIGFILE
++ echo "ipcfilename = " $ipcfilename >> $CONFIGFILE
++ echo "ipipcfilename = " $ipipcfilename >> $CONFIGFILE
++ echo "language = " $language >> $CONFIGFILE
++ echo "languagedir = " $languagedir >> $CONFIGFILE
++ echo "logadblocks = " $logadblocks >> $CONFIGFILE
++ echo "logchildprocesshandling = " $logchildprocesshandling >> $CONFIGFILE
++ echo "logclienthostnames = " $logclienthostnames >> $CONFIGFILE
++ echo "logconnectionhandlingerrors = " $logconnectionhandlingerrors >> $CONFIGFILE
++ echo "logexceptionhits = " $logexceptionhits >> $CONFIGFILE
++ echo "logfileformat = " $logfileformat >> $CONFIGFILE
++ echo "loglevel = " $loglevel >> $CONFIGFILE
++ echo "loglocation = " $loglocation >> $CONFIGFILE
++ echo "loguseragent = " $loguseragent >> $CONFIGFILE
++ echo "maxagechildren = " $maxagechildren >> $CONFIGFILE
++ echo "maxchildren = " $maxchildren >> $CONFIGFILE
++ echo "maxcontentfilecachescansize = " $maxcontentfilecachescansize >> $CONFIGFILE
++ echo "maxcontentfiltersize = " $maxcontentfiltersize >> $CONFIGFILE
++ echo "maxcontentramcachescansize = " $maxcontentramcachescansize >> $CONFIGFILE
++ echo "maxips = " $maxips >> $CONFIGFILE
++ echo "maxsparechildren = " $maxsparechildren >> $CONFIGFILE
++ echo "maxuploadsize = " $maxuploadsize >> $CONFIGFILE
++ echo "minchildren = " $minchildren >> $CONFIGFILE
++ echo "minsparechildren = " $minsparechildren >> $CONFIGFILE
++ echo "nodaemon = " $nodaemon >> $CONFIGFILE
++ echo "nologger = " $nologger >> $CONFIGFILE
++ echo "pcontimeout = " $pcontimeout >> $CONFIGFILE
++ echo "perroomdirectory = " $perroomdirectory >> $CONFIGFILE
++ echo "phrasefiltermode = " $phrasefiltermode >> $CONFIGFILE
++ echo "prefercachedlists = " $prefercachedlists >> $CONFIGFILE
++ echo "preforkchildren = " $preforkchildren >> $CONFIGFILE
++ echo "preservecase = " $preservecase >> $CONFIGFILE
++ echo "proxyexchange = " $proxyexchange >> $CONFIGFILE
++ echo "proxyip = " $proxyip >> $CONFIGFILE
++ echo "proxyport = " $proxyport >> $CONFIGFILE
++ echo "proxytimeout = " $proxytimeout >> $CONFIGFILE
++ echo "recheckreplacedurls = " $recheckreplacedurls >> $CONFIGFILE
++ echo "reverseaddresslookups = " $reverseaddresslookups >> $CONFIGFILE
++ echo "reverseclientiplookups = " $reverseclientiplookups >> $CONFIGFILE
++ echo "scancleancache = " $scancleancache >> $CONFIGFILE
++ echo "showweightedfound = " $showweightedfound >> $CONFIGFILE
++ echo "softrestart = " $softrestart >> $CONFIGFILE
++ echo "trickledelay = " $trickledelay >> $CONFIGFILE
++ echo "urlcacheage = " $urlcacheage >> $CONFIGFILE
++ echo "urlcachenumber = " $urlcachenumber >> $CONFIGFILE
++ echo "urlipcfilename = " $urlipcfilename >> $CONFIGFILE
++ echo "usecustombannedflash = " $usecustombannedflash >> $CONFIGFILE
++ echo "usecustombannedimage = " $usecustombannedimage >> $CONFIGFILE
++ echo "usexforwardedfor = " $usexforwardedfor >> $CONFIGFILE
++ echo "weightedphrasemode = " $weightedphrasemode >> $CONFIGFILE
++
++ procd_open_instance
++ procd_set_param command $PROG -c $CONFIGFILE
++ procd_set_param file $CONFIGFILE
++ procd_close_instance
++
++}
++
++stop_service()
++{
++ PID=`cat /tmp/e2guardian/e2guardian.pid`
++ kill $PID
++ rm -f /tmp/e2guardian/e2guardian.pid
++}
++
++service_triggers()
++{
++ procd_add_reload_trigger "e2guardian"
++ procd_add_validation validate_e2guardian_section
++}
+diff --git a/feeds/packages/net/e2guardian/files/e2guardianf1.conf b/feeds/packages/net/e2guardian/files/e2guardianf1.conf
+new file mode 100644
+index 0000000..c4b821f
+--- /dev/null
++++ b/feeds/packages/net/e2guardian/files/e2guardianf1.conf
+@@ -0,0 +1,430 @@
++# e2guardian filter group config file for version 3.1.2
++
++
++# Filter group mode
++# This option determines whether members of this group have their web access
++# unfiltered, filtered, or banned.
++#
++# 0 = banned
++# 1 = filtered
++# 2 = unfiltered (exception)
++#
++# Only filter groups with a mode of 1 need to define phrase, URL, site, extension,
++# mimetype and PICS lists; in other modes, these options are ignored to conserve
++# memory.
++#
++# Defaults to 0 if unspecified.
++# Unauthenticated users are treated as being in the first filter group.
++groupmode = 1
++
++# Filter group name
++# Used to fill in the -FILTERGROUP- placeholder in the HTML template file, and to
++# name the group in the access logs
++# Defaults to empty string
++#groupname = ''
++groupname = ''
++
++# Content filtering files location
++bannedphraselist = '/etc/e2guardian/lists/bannedphraselist'
++weightedphraselist = '/etc/e2guardian/lists/weightedphraselist'
++exceptionphraselist = '/etc/e2guardian/lists/exceptionphraselist'
++bannedsitelist = '/etc/e2guardian/lists/bannedsitelist'
++greysitelist = '/etc/e2guardian/lists/greysitelist'
++bannedsslsitelist = '/etc/e2guardian/lists/bannedsslsitelist'
++greysslsitelist = '/etc/e2guardian/lists/greysslsitelist'
++exceptionsitelist = '/etc/e2guardian/lists/exceptionsitelist'
++bannedurllist = '/etc/e2guardian/lists/bannedurllist'
++greyurllist = '/etc/e2guardian/lists/greyurllist'
++exceptionurllist = '/etc/e2guardian/lists/exceptionurllist'
++exceptionregexpurllist = '/etc/e2guardian/lists/exceptionregexpurllist'
++bannedregexpurllist = '/etc/e2guardian/lists/bannedregexpurllist'
++picsfile = '/etc/e2guardian/lists/pics'
++contentregexplist = '/etc/e2guardian/lists/contentregexplist'
++urlregexplist = '/etc/e2guardian/lists/urlregexplist'
++refererexceptionsitelist = '/etc/e2guardian/lists/refererexceptionsitelist'
++refererexceptionurllist = '/etc/e2guardian/lists/refererexceptionurllist'
++embededreferersitelist = '/etc/e2guardian/lists/embededreferersitelist'
++embededrefererurllist = '/etc/e2guardian/lists/embededrefererurllist'
++urlredirectregexplist = '/etc/e2guardian/lists/urlredirectregexplist'
++
++# local versions of lists (where LOCAL_LISTS enabled)
++#localbannedsitelist = '/etc/e2guardian/lists/localbannedsitelist'
++#localgreysitelist = '/etc/e2guardian/lists/localgreysitelist'
++#localexceptionsitelist = '/etc/e2guardian/lists/localexceptionsitelist'
++#localbannedurllist = '/etc/e2guardian/lists/localbannedurllist'
++#localgreyurllist = '/etc/e2guardian/lists/localgreyurllist'
++#localexceptionurllist = '/etc/e2guardian/lists/localexceptionurllist'
++#localbannedsslsitelist = '/etc/e2guardian/lists/localbannedsslsitelist'
++#localgreysslsitelist = '/etc/e2guardian/lists/localgreysslsitelist'
++#localbannedsearchlist = '/etc/e2guardian/lists/localbannedsearchlist'
++
++!! Not compiled !! authexceptionsitelist = '/etc/e2guardian/lists/authexceptionsitelist'
++!! Not compiled !! authexceptionurllist = '/etc/e2guardian/lists/authexceptionurllist'
++
++# Filetype filtering
++#
++# Allow bannedregexpurllist with grey list mode
++# bannedregexpheaderlist and bannedregexpurllist
++#
++# bannedregexwithblanketblock = off
++#
++# Blanket download blocking
++# If enabled, all files will be blocked, unless they match the
++# exceptionextensionlist or exceptionmimetypelist.
++# These lists do not override virus scanning.
++# Exception lists defined above override all types of filtering, including
++# the blanket download block.
++# Defaults to disabled.
++# (on | off)
++#
++blockdownloads = off
++exceptionextensionlist = '/etc/e2guardian/lists/exceptionextensionlist'
++exceptionmimetypelist = '/etc/e2guardian/lists/exceptionmimetypelist'
++#
++# Use the following lists to block specific kinds of file downloads.
++# The two exception lists above can be used to override these.
++#
++bannedextensionlist = '/etc/e2guardian/lists/bannedextensionlist'
++bannedmimetypelist = '/etc/e2guardian/lists/bannedmimetypelist'
++#
++# In either file filtering mode, the following list can be used to override
++# MIME type & extension blocks for particular domains & URLs (trusted download sites).
++#
++exceptionfilesitelist = '/etc/e2guardian/lists/exceptionfilesitelist'
++exceptionfileurllist = '/etc/e2guardian/lists/exceptionfileurllist'
++
++# POST protection (web upload and forms)
++# does not block forms without any file upload, i.e. this is just for
++# blocking or limiting uploads
++# measured in kibibytes after MIME encoding and header bumph
++# use 0 for a complete block
++# use higher (e.g. 512 = 512Kbytes) for limiting
++# use -1 for no blocking
++#maxuploadsize = 512
++#maxuploadsize = 0
++maxuploadsize = -1
++
++# Categorise without blocking:
++# Supply categorised lists here and the category string shall be logged against
++# matching requests, but matching these lists does not perform any filtering
++# action.
++#logsitelist = '/etc/e2guardian/lists/logsitelist'
++#logurllist = '/etc/e2guardian/lists/logurllist'
++#logregexpurllist = '/etc/e2guardian/lists/logregexpurllist'
++
++# Outgoing HTTP header rules:
++# Optional lists for blocking based on, and modification of, outgoing HTTP
++# request headers. Format for headerregexplist is one modification rule per
++# line, similar to content/URL modifications. Format for
++# bannedregexpheaderlist is one regular expression per line, with matching
++# headers causing a request to be blocked.
++# Headers are matched/replaced on a line-by-line basis, not as a contiguous
++# block.
++# Use for example, to remove cookies or prevent certain user-agents.
++headerregexplist = '/etc/e2guardian/lists/headerregexplist'
++bannedregexpheaderlist = '/etc/e2guardian/lists/bannedregexpheaderlist'
++addheaderregexplist = '/etc/e2guardian/lists/addheaderregexplist'
++
++# Weighted phrase mode
++# Optional; overrides the weightedphrasemode option in e2guardian.conf
++# for this particular group. See documentation for supported values in
++# that file.
++#weightedphrasemode = 0
++
++# Naughtiness limit
++# This the limit over which the page will be blocked. Each weighted phrase is given
++# a value either positive or negative and the values added up. Phrases to do with
++# good subjects will have negative values, and bad subjects will have positive
++# values. See the weightedphraselist file for examples.
++# As a guide:
++# 50 is for young children, 100 for old children, 160 for young adults.
++naughtynesslimit = 50
++
++# Search term blocking
++# Search terms can be extracted from search URLs and filtered using one or
++# both of two different methods.
++
++# Method 1 is that developed by Protex where specific
++# search terms are contained in a bannedsearchlist.
++# (localbannedsearchlist and bannedsearchoveridelist can be used to suppliment
++# and overide this list as required.)
++# These lists contain banned search words combinations on each line.
++# Words are separated by '+' and must be in sorted order within a line.
++# so to block 'sexy girl' then the list must contain the line
++# girl+sexy
++# and this will block both 'sexy girl' and 'girl sexy'
++# To use this method, the searchregexplist must be enabled and the bannedsearchlist(s) defined
++
++# Method 2 is uses the
++# bannedphraselist, weightedphraselist and exceptionphraselist, with a separate
++# threshold for blocking than that used for normal page content.
++# To do this, the searchregexplist must be enabled and searchtermlimit
++# must be grater than 0.
++
++#
++# Search engine regular expression list (need for both options)
++# List of regular expressions for matching search engine URLs. It is assumed
++# that the search terms themselves will be contained in the
++# of output of each expression.
++#searchregexplist = '/etc/e2guardian/lists/searchregexplist'
++#
++# Banned Search Term list(s) for option 1
++#bannedsearchlist = '/etc/e2guardian/lists/bannedsearchlist'
++#bannedsearchoveridelist = '/etc/e2guardian/lists/bannedsearchoveridelist'
++
++
++# Search term limit (for Option 2)
++# The limit over which requests will be blocked for containing search terms
++# which match the weightedphraselist. This should usually be lower than the
++# 'naughtynesslimit' value above, because the amount of text being filtered
++# is only a few words, rather than a whole page.
++# This option must be uncommented if searchregexplist is uncommented.
++# A value of 0 here indicates that search terms should be extracted,
++# but no phrase filtering should be performed on the resulting text.
++#searchtermlimit = 0
++#
++# Search term phrase lists (for Option 2)
++# If the three lines below are uncommented, search term blocking will use
++# the banned, weighted & exception phrases from these lists, instead of using
++# the same phrase lists as for page content. This is optional but recommended,
++# as weights for individual phrases in the "normal" lists may not be
++# appropriate for blocking when those phrases appear in a much smaller block
++# of text.
++# Please note that all or none of the below should be uncommented, not a
++# mixture.
++#bannedsearchtermlist = '/etc/e2guardian/lists/bannedsearchtermlist'
++#weightedsearchtermlist = '/etc/e2guardian/lists/weightedsearchtermlist'
++#exceptionsearchtermlist = '/etc/e2guardian/lists/exceptionsearchtermlist'
++
++# Category display threshold
++# This option only applies to pages blocked by weighted phrase filtering.
++# Defines the minimum score that must be accumulated within a particular
++# category in order for it to show up on the block pages' category list.
++# All categories under which the page scores positively will be logged; those
++# that were not displayed to the user appear in brackets.
++#
++# -1 = display only the highest scoring category
++# 0 = display all categories (default)
++# > 0 = minimum score for a category to be displayed
++categorydisplaythreshold = 0
++
++# Embedded URL weighting
++# When set to something greater than zero, this option causes URLs embedded within a
++# page's HTML (from links, image tags, etc.) to be extracted and checked against the
++# bannedsitelist and bannedurllist. Each link to a banned page causes the amount set
++# here to be added to the page's weighting.
++# The behaviour of this option with regards to multiple occurrences of a site/URL is
++# affected by the weightedphrasemode setting.
++#
++# NB: Currently, this feature uses regular expressions that require the PCRE library.
++# As such, it is only available if you compiled DansGuardian with '--enable-pcre=yes'.
++# You can check compile-time options by running 'e2guardian -v'.
++#
++# Set to 0 to disable.
++# Defaults to 0.
++# WARNING: This option is highly CPU intensive!
++embeddedurlweight = 0
++
++# Enable PICS rating support
++#
++# Defaults to disabled
++# (on | off)
++enablepics = off
++
++# Temporary Denied Page Bypass
++# This provides a link on the denied page to bypass the ban for a few minutes. To be
++# secure it uses a random hashed secret generated at daemon startup. You define the
++# number of seconds the bypass will function for before the deny will appear again.
++# To allow the link on the denied page to appear you will need to edit the template.html
++# or e2guardian.pl file for your language.
++# 300 = enable for 5 minutes
++# 0 = disable ( defaults to 0 )
++# -1 = enable but you require a separate program/CGI to generate a valid link
++bypass = 0
++
++# Temporary Denied Page Bypass Secret Key
++# Rather than generating a random key you can specify one. It must be more than 8 chars.
++# '' = generate a random one (recommended and default)
++# 'Mary had a little lamb.' = an example
++# '76b42abc1cd0fdcaf6e943dcbc93b826' = an example
++bypasskey = ''
++
++# Infection/Scan Error Bypass
++# Similar to the 'bypass' setting, but specifically for bypassing files scanned and found
++# to be infected, or files that trigger scanner errors - for example, archive types with
++# recognised but unsupported compression schemes, or corrupt archives.
++# The option specifies the number of seconds for which the bypass link will be valid.
++# 300 = enable for 5 minutes
++# 0 = disable (default)
++# -1 = enable, but require a separate program/CGI to generate a valid link
++infectionbypass = 0
++
++# Infection/Scan Error Bypass Secret Key
++# Same as the 'bypasskey' option, but used for infection bypass mode.
++infectionbypasskey = ''
++
++# Infection/Scan Error Bypass on Scan Errors Only
++# Enable this option to allow infectionbypass links only when virus scanning fails,
++# not when a file is found to contain a virus.
++# on = enable (default and highly recommended)
++# off = disable
++infectionbypasserrorsonly = on
++
++# Disable content scanning
++# If you enable this option you will disable content scanning for this group.
++# Content scanning primarily is AV scanning (if enabled) but could include
++# other types.
++# (on|off) default = off.
++disablecontentscan = off
++
++# Enable Deep URL Analysis
++# When enabled, DG looks for URLs within URLs, checking against the bannedsitelist and
++# bannedurllist. This can be used, for example, to block images originating from banned
++# sites from appearing in Google Images search results, as the original URLs are
++# embedded in the thumbnail GET requests.
++# (on|off) default = off
++deepurlanalysis = off
++
++# reportinglevel
++#
++# -1 = log, but do not block - Stealth mode
++# 0 = just say 'Access Denied'
++# 1 = report why but not what denied phrase
++# 2 = report fully
++# 3 = use HTML template file (accessdeniedaddress ignored) - recommended
++#
++# If defined, this overrides the global setting in e2guardian.conf for
++# members of this filter group.
++#
++reportinglevel = 3
++
++# accessdeniedaddress is the address of your web server to which the cgi
++# e2guardian reporting script was copied. Only used in reporting levels
++# 1 and 2.
++#
++# This webserver must be either:
++# 1. Non-proxied. Either a machine on the local network, or listed as an
++# exception in your browser's proxy configuration.
++# 2. Added to the exceptionsitelist. Option 1 is preferable; this option is
++# only for users using both transparent proxying and a non-local server
++# to host this script.
++#
++# If defined, this overrides the global setting in e2guardian.conf for
++# members of this filter group.
++#
++#accessdeniedaddress = 'http://YOURSERVER.YOURDOMAIN/cgi-bin/e2guardian.pl'
++
++# sslaccessdeniedaddress is the address of your web server to which the static page
++# e2guardian reporting was copied. Only used in reporting levels 3 (avoid blank page)
++# Work only in firefox with ssldeniedrewrite off
++
++# sslaccessdeniedaddress = 'http://YOURSERVER.YOURDOMAIN/denyssl.htm'
++
++# Break SSL protocol and redirect to another HTTPS website for denied page (sslaccessdeniedaddress url)
++
++#ssldeniedrewrite = 'on'
++
++# HTML Template override
++# If defined, this specifies a custom HTML template file for members of this
++# filter group, overriding the global setting in e2guardian.conf. This is
++# only used in reporting level 3.
++#
++# The default template file path is <languagedir>/<language>/template.h
++# e.g. /share/e2guardian/languages/ukenglish/template.html when using 'ukenglish'
++# language.
++#
++# This option generates a file path of the form:
++# <languagedir>/<language>/<htmltemplate>
++# e.g. /share/e2guardian/languages/ukenglish/custom.html
++#
++#htmltemplate = 'custom.html'
++
++# Non standard delimiter (only used with accessdeniedaddress)
++# To help preserve the full banned URL, including parameters, the variables
++# passed into the access denied CGI are separated using non-standard
++# delimiters. This can be useful to ensure correct operation of the filter
++# bypass modes. Parameters are split using "::" in place of "&", and "==" in
++# place of "=".
++# Default is enabled, but to go back to the standard mode, disable it.
++
++#nonstandarddelimiter = off
++
++# Email reporting - original patch by J. Gauthier
++
++# Use SMTP
++# If on, will enable system wide events to be reported by email.
++# need to configure mail program (see 'mailer' in global config)
++# and email recipients
++# default usesmtp = off
++#!! Not compiled !!usesmtp = off
++
++# mailfrom
++# who the email would come from
++# example: mailfrom = 'e2guardian@mycompany.com'
++#!! Not compiled !!mailfrom = ''
++
++# avadmin
++# who the virus emails go to (if notify av is on)
++# example: avadmin = 'admin@mycompany.com'
++#!! Not compiled !!avadmin = ''
++
++# contentdmin
++# who the content emails go to (when thresholds are exceeded)
++# and contentnotify is on
++# example: contentadmin = 'admin@mycompany.com'
++#!! Not compiled !!contentadmin = ''
++
++# avsubject
++# Subject of the email sent when a virus is caught.
++# only applicable if notifyav is on
++# default avsubject = 'e2guardian virus block'
++#!! Not compiled !!avsubject = 'e2guardian virus block'
++
++# content
++# Subject of the email sent when violation thresholds are exceeded
++# default contentsubject = 'e2guardian violation'
++#!! Not compiled !!contentsubject = 'e2guardian violation'
++
++# notifyAV
++# This will send a notification, if usesmtp/notifyav is on, any time an
++# infection is found.
++# Important: If this option is off, viruses will still be recorded like a
++# content infraction.
++#!! Not compiled !!notifyav = off
++
++# notifycontent
++# This will send a notification, if usesmtp is on, based on thresholds
++# below
++#!! Not compiled !!notifycontent = off
++
++# thresholdbyuser
++# results are only predictable with user authenticated configs
++# if enabled the violation/threshold count is kept track of by the user
++#!! Not compiled !!thresholdbyuser = off
++
++#violations
++# number of violations before notification
++# setting to 0 will never trigger a notification
++#!! Not compiled !!violations = 0
++
++#threshold
++# this is in seconds. If 'violations' occur in 'threshold' seconds, then
++# a notification is made.
++# if this is set to 0, then whenever the set number of violations are made a
++# notifaction will be sent.
++#!! Not compiled !!threshold = 0
++
++#SSL certificate checking
++# Check that ssl certificates for servers on https connections are valid
++# and signed by a ca in the configured path
++sslcertcheck = off
++
++#SSL man in the middle
++# Forge ssl certificates for all non-exception sites, decrypt the data then re encrypt it
++# using a different private key. Used to filter ssl sites
++sslmitm = off
++
++#Limit SSL MITM to sites in greysslsitelist(s)
++# ignored if sslmitm is off
++# SSL sites not matching greysslsitelist will be treat as if sslmitm is off.
++onlymitmsslgrey = off
+diff --git a/feeds/packages/net/emailrelay/Makefile b/feeds/packages/net/emailrelay/Makefile
+new file mode 100644
+index 0000000..9352db7
+--- /dev/null
++++ b/feeds/packages/net/emailrelay/Makefile
+@@ -0,0 +1,116 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=emailrelay
++PKG_VERSION:=1.9
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-src.tar.gz
++PKG_SOURCE_URL:=@SF/emailrelay/$(PKG_VERSION)
++PKG_MD5SUM:=0892fbf993407c6b5a16f96e23299b62
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/emailrelay/Default
++ SECTION:=net
++ SUBMENU:=Web Servers/Proxies
++ CATEGORY:=Network
++ DEPENDS:=$(CXX_DEPENDS)
++ TITLE:=A simple SMTP proxy and MTA
++ URL:=http://emailrelay.sourceforge.net/
++ MAINTAINER := Federico Di Marco <fededim@gmail.com>
++endef
++
++
++define Package/emailrelay
++$(call Package/emailrelay/Default)
++ TITLE+= (with OpenSSL support)
++ DEPENDS+=+libopenssl
++ VARIANT:=ssl
++endef
++
++define Package/emailrelay-nossl
++$(call Package/emailrelay/Default)
++ TITLE+= (no SSL support)
++ VARIANT:=nossl
++endef
++
++
++
++define Package/emailrelay/Default/description
++ Emailrelay is a simple SMTP proxy and store-and-forward message transfer agent (MTA).
++
++ When running as a proxy all e-mail messages can be passed through
++ a user-defined program, such as a spam filter, which can drop,
++ re-address or edit messages as they pass through. When running
++ as a store-and-forward MTA incoming messages are stored in a
++ local spool directory, and then forwarded to the next SMTP
++ server on request.
++endef
++
++
++define Package/emailrelay/description
++$(call Package/emailrelay/Default/description)
++
++ This package is built with OpenSSL support (SSMTP is supported).
++endef
++
++define Package/emailrelay-nossl/description
++$(call Package/emailrelay/Default/description)
++
++ This package is built without SSL support (no SSMTP)
++endef
++
++
++define Package/emailrelay/conffiles
++/etc/emailrelay.auth
++endef
++
++define Package/emailrelay-nossl/conffiles
++/etc/emailrelay.auth
++endef
++
++CONFIGURE_ARGS += \
++ --with-pam=no
++
++CONFIGURE_VARS += \
++ CXXFLAGS="$$$$CXXFLAGS -fno-rtti"
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS += \
++ --with-openssl
++endif
++
++ifeq ($(BUILD_VARIANT),nossl)
++ CONFIGURE_ARGS += \
++ --with-openssl=no
++endif
++
++define Package/emailrelay/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/main/emailrelay $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/main/emailrelay-filter-copy $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/main/emailrelay-passwd $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/main/emailrelay-poke $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/main/emailrelay-submit $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) files/$(PKG_NAME).auth $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) files/$(PKG_NAME).init $(1)/etc/init.d/$(PKG_NAME)
++endef
++
++Package/emailrelay-nossl/install = $(Package/emailrelay/install)
++
++
++$(eval $(call BuildPackage,emailrelay))
++$(eval $(call BuildPackage,emailrelay-nossl))
+diff --git a/feeds/packages/net/emailrelay/files/emailrelay.auth b/feeds/packages/net/emailrelay/files/emailrelay.auth
+new file mode 100644
+index 0000000..3d11bf0
+--- /dev/null
++++ b/feeds/packages/net/emailrelay/files/emailrelay.auth
+@@ -0,0 +1,16 @@
++#
++# emailrelay secrets file
++#
++#see http://emailrelay.sourceforge.net/reference.html for reference
++
++#Mostly used options:
++#
++#NONE server specifies ip address range allowed to connect to emailrelay SMTP server
++#LOGIN client specifies the credentials to be used when forwarding emails to another SMTP server
++#LOGIN server specifies the credentials to be needed to authenticate with the emailrelay SMTP server
++
++#Examples:
++#
++#NONE server 192.168.1.* keyword
++#LOGIN client smtpuser@smtpserver smtppassword
++#LOGIN server user1 secret
+\ No newline at end of file
+diff --git a/feeds/packages/net/emailrelay/files/emailrelay.init b/feeds/packages/net/emailrelay/files/emailrelay.init
+new file mode 100644
+index 0000000..9fc3399
+--- /dev/null
++++ b/feeds/packages/net/emailrelay/files/emailrelay.init
+@@ -0,0 +1,15 @@
++#!/bin/sh /etc/rc.common
++#see http://emailrelay.sourceforge.net/reference.html for command line reference
++
++START=90
++
++
++start() {
++ logger -t 'emailrelay' "Starting emailrelay service."
++ service_start /usr/bin/emailrelay --as-server --poll 60 --forward-to smtpserver:smtpport --spool-dir /tmp --client-tls --client-auth /etc/emailrelay.auth --server-auth /etc/emailrelay.auth --log
++}
++
++stop() {
++ logger -t 'emailrelay' "Stopping emailrelay service."
++ service_stop /usr/bin/emailrelay
++}
+diff --git a/feeds/packages/net/esniper/Makefile b/feeds/packages/net/esniper/Makefile
+new file mode 100644
+index 0000000..9607d76
+--- /dev/null
++++ b/feeds/packages/net/esniper/Makefile
+@@ -0,0 +1,42 @@
++#
++# Copyright (C) 2015 Thomas Weißschuh
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=esniper
++PKG_VERSION:=2.31.0
++PKG_RELEASE:=1
++PKG_LICENSE:=BSD-2-Clause
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Thomas Weißschuh <openwrt@t-8ch.de>
++
++VERSION_TRANSFORMED:=$(subst .,-,$(PKG_VERSION))
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(VERSION_TRANSFORMED)
++PKG_SOURCE:=$(PKG_NAME)-$(VERSION_TRANSFORMED).tgz
++PKG_SOURCE_URL:=@SF/$(PKG_NAME)
++PKG_MD5SUM:=4b411588c4a223acef7333ab684c7618
++
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/esniper
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Simple, lightweight tool for sniping eBay auctions
++ URL:=http://esniper.sourceforge.net/
++ DEPENDS:=+libcurl +ca-certificates
++endef
++
++define Package/esniper/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/esniper $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/frontends/snipe $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,esniper))
+diff --git a/feeds/packages/net/etherwake/Makefile b/feeds/packages/net/etherwake/Makefile
+new file mode 100644
+index 0000000..4d05e3d
+--- /dev/null
++++ b/feeds/packages/net/etherwake/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=etherwake
++PKG_VERSION:=1.09
++PKG_RELEASE:=4
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).orig.tar.gz
++PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/main/e/etherwake
++PKG_MD5SUM:=628e8b2a28d47f262e4c26c989402a59
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION).orig
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/etherwake
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=WoL client for magic packets via ethernet frames
++ URL:=http://ftp.debian.org/debian/pool/main/e/etherwake
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++endef
++
++define Package/etherwake/description
++ You can wake up WOL compliant Computers which have been powered down to
++ sleep mode or start WOL compliant Computers with a BIOS feature.
++ WOL is an abbreviation for Wake-on-LAN. It is a standard that allows you
++ to turn on a computer from another location over a network connection.
++ ether-wake also supports WOL passwords.
++endef
++
++define Build/Compile
++ $(TARGET_CC) $(TARGET_CFLAGS) -D__UCLIBC__ $(PKG_BUILD_DIR)/ether-wake.c -o $(PKG_BUILD_DIR)/etherwake
++endef
++
++define Package/etherwake/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/etherwake $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) files/$(PKG_NAME).config $(1)/etc/config/$(PKG_NAME)
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) files/$(PKG_NAME).init $(1)/etc/init.d/$(PKG_NAME)
++endef
++
++define Package/etherwake/conffiles
++/etc/config/etherwake
++endef
++
++$(eval $(call BuildPackage,etherwake))
+diff --git a/feeds/packages/net/etherwake/files/etherwake.config b/feeds/packages/net/etherwake/files/etherwake.config
+new file mode 100644
+index 0000000..3d8e515
+--- /dev/null
++++ b/feeds/packages/net/etherwake/files/etherwake.config
+@@ -0,0 +1,28 @@
++config 'etherwake' 'setup'
++ # possible program pathes
++ option 'pathes' '/usr/bin/etherwake /usr/bin/ether-wake'
++ # use sudo, defaults to off
++ option 'sudo' 'off'
++ # interface, defaults to 'eth0'
++ # -i <ifname>
++ option 'interface' ''
++ # send wake-up packet to the broadcast address, defaults to off
++ # -b
++ option 'broadcast' 'off'
++
++config 'target'
++ # name for the target
++ option 'name' 'example'
++ # mac address to wake up
++ option 'mac' '11:22:33:44:55:66'
++ # password in hex without any delimiters
++ option 'password' 'AABBCCDDEEFF'
++ # wake up on system start, defaults to off
++ option 'wakeonboot' 'off'
++
++# To add a new target use:
++# uci add etherwake target
++# uci set etherwake.@target[-1].name=example
++# uci set etherwake.@target[-1].mac=11:22:33:44:55:66
++# uci set etherwake.@target[-1].password=AABBCCDDEEFF
++# uci set etherwake.@target[-1].wakeonboot=off
+diff --git a/feeds/packages/net/etherwake/files/etherwake.init b/feeds/packages/net/etherwake/files/etherwake.init
+new file mode 100644
+index 0000000..0504cf1
+--- /dev/null
++++ b/feeds/packages/net/etherwake/files/etherwake.init
+@@ -0,0 +1,132 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009 OpenWrt.org
++
++NAME='etherwake'
++START=60
++PROGRAM=''
++
++start()
++{
++ local searchlist=''
++ local section=''
++ local value=''
++
++ config_load "${NAME}"
++
++ # check for available program
++ config_get searchlist 'setup' 'pathes'
++ PROGRAM=$(search_program "${searchlist}")
++ [ -z "${PROGRAM}" ] && {
++ echo "${initscript}: No ${NAME} program installed. Check: opkg list | grep ${NAME}"
++ exit 1
++ }
++
++ # sudo
++ config_get_bool value 'setup' 'sudo' '0'
++ [ "${value}" -ne 0 ] && PROGRAM="sudo ${PROGRAM}"
++
++ # interface
++ config_get value 'setup' 'interface'
++ [ -n "${value}" ] && append PROGRAM "-i ${value}"
++
++ # broadcast
++ config_get_bool value 'setup' 'broadcast' '0'
++ [ "${value}" -ne 0 ] && append PROGRAM '-b'
++
++ # wake up targets
++ config_foreach etherwake_start target $*
++}
++
++etherwake_start()
++{
++ local section="$1"
++ shift
++
++ local names="$*"
++
++ local value=''
++ local target=''
++
++ if [ -z "${names}" ]
++ then
++ # check if boot target
++ config_get_bool value "${section}" 'wakeonboot' '0'
++ [ "${value}" -eq 0 ] && return 0
++
++ # wake up target
++ do_etherwake "${section}"
++ return $?
++ else
++ # name
++ config_get value "${section}" 'name'
++ [ -z "${value}" ] && return 0
++
++ for target in ${names}
++ do
++ [ "${value}" != "${target}" ] && continue
++
++ # wake up target
++ do_etherwake "${section}"
++ return $?
++ done
++ fi
++}
++
++# execute etherwake command for target
++do_etherwake()
++{
++ local section="$1"
++ local value=''
++ local password=''
++ local args=''
++
++ # password
++ config_get value "${section}" 'password'
++ [ -n "${value}" ] && {
++ password=$(etherwake_password "${value}")
++ append args "-p ${password}"
++ }
++
++ # mac address
++ config_get value "${section}" 'mac'
++ [ -z "${value}" ] && { echo "${initscript}: Target ${section} has no MAC address"; return 1; }
++ append args "${value}"
++
++ # name
++ config_get value "${section}" 'name'
++ [ -z "${value}" ] && value="{section}"
++
++ # execute command
++ echo "${initscript}: Waking up ${value} via ${PROGRAM}${args:+ ${args}}"
++ ${PROGRAM} ${args}
++ return $?
++}
++
++
++# find first available program from searchlist
++search_program()
++{
++ local searchlist="$1"
++ local test=''
++ local program=''
++
++ for test in ${searchlist} ; do
++ [ -x "${test}" ] && {
++ program="${test}"
++ break;
++ }
++ done
++
++ [ -n "${program}" ] && echo "${program}"
++
++ return
++}
++
++# prepare hex password
++etherwake_password()
++{
++ local delimiter=':'
++ local password=`echo "$1" | sed "s/../&${delimiter}/g"`
++ echo "${password%${delimiter}}"
++ return
++}
+diff --git a/feeds/packages/net/etherwake/patches/100-no_ether_hostton.patch b/feeds/packages/net/etherwake/patches/100-no_ether_hostton.patch
+new file mode 100644
+index 0000000..e33c06b
+--- /dev/null
++++ b/feeds/packages/net/etherwake/patches/100-no_ether_hostton.patch
+@@ -0,0 +1,37 @@
++--- etherwake-1.09.orig/ether-wake.c 2005-07-10 20:44:25.000000000 +0200
+++++ etherwake-1.09.orig.no_ether_hostton/ether-wake.c 2007-04-29 19:03:41.000000000 +0200
++@@ -15,7 +15,11 @@
++ " an optional password appended.\n"
++ "\n"
++ " The single required parameter is the Ethernet MAC (station) address\n"
+++#if !defined(__UCLIBC__)
++ " of the machine to wake or a host ID with known NSS 'ethers' entry.\n"
+++#else
+++" of the machine to wake.\n"
+++#endif
++ " The MAC address may be found with the 'arp' program while the target\n"
++ " machine is awake.\n"
++ "\n"
++@@ -289,16 +293,22 @@
++ if (debug)
++ fprintf(stderr, "The target station address is %s.\n",
++ ether_ntoa(eaddr));
+++#if !defined(__UCLIBC__)
++ } else if (ether_hostton(hostid, eaddr) == 0) {
++ if (debug)
++ fprintf(stderr, "Station address for hostname %s is %s.\n",
++ hostid, ether_ntoa(eaddr));
+++#endif
++ } else {
++ (void)fprintf(stderr,
++ "ether-wake: The Magic Packet host address must be "
++ "specified as\n"
+++#if !defined(__UCLIBC__)
++ " - a station address, 00:11:22:33:44:55, or\n"
++ " - a hostname with a known 'ethers' entry.\n");
+++#else
+++ " - a station address, 00:11:22:33:44:55\n");
+++#endif
++ return -1;
++ }
++ return 0;
+diff --git a/feeds/packages/net/etherwake/patches/110-format_security_fix.patch b/feeds/packages/net/etherwake/patches/110-format_security_fix.patch
+new file mode 100644
+index 0000000..e937fb3
+--- /dev/null
++++ b/feeds/packages/net/etherwake/patches/110-format_security_fix.patch
+@@ -0,0 +1,19 @@
++--- a/ether-wake.c
+++++ b/ether-wake.c
++@@ -135,7 +135,7 @@ int main(int argc, char *argv[])
++ case 'D': debug++; break;
++ case 'i': ifname = optarg; break;
++ case 'p': get_wol_pw(optarg); break;
++- case 'u': printf(usage_msg); return 0;
+++ case 'u': printf("%s\n", usage_msg); return 0;
++ case 'v': verbose++; break;
++ case 'V': do_version++; break;
++ case '?':
++@@ -144,7 +144,7 @@ int main(int argc, char *argv[])
++ if (verbose || do_version)
++ printf("%s\n", version_msg);
++ if (errflag) {
++- fprintf(stderr, brief_usage_msg);
+++ fprintf(stderr, "%s\n", brief_usage_msg);
++ return 3;
++ }
+diff --git a/feeds/packages/net/etherwake/patches/120-musl-compat.patch b/feeds/packages/net/etherwake/patches/120-musl-compat.patch
+new file mode 100644
+index 0000000..a2cdfba
+--- /dev/null
++++ b/feeds/packages/net/etherwake/patches/120-musl-compat.patch
+@@ -0,0 +1,17 @@
++--- a/ether-wake.c
+++++ b/ether-wake.c
++@@ -82,14 +82,8 @@ static char usage_msg[] =
++ #include <linux/if.h>
++
++ #include <features.h>
++-#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
++ #include <netpacket/packet.h>
++ #include <net/ethernet.h>
++-#else
++-#include <asm/types.h>
++-#include <linux/if_packet.h>
++-#include <linux/if_ether.h>
++-#endif
++ #include <netdb.h>
++ #include <netinet/ether.h>
++
+diff --git a/feeds/packages/net/ethtool/Config.in b/feeds/packages/net/ethtool/Config.in
+new file mode 100644
+index 0000000..7ec5553
+--- /dev/null
++++ b/feeds/packages/net/ethtool/Config.in
+@@ -0,0 +1,7 @@
++menu "Configuration"
++ depends on PACKAGE_ethtool
++
++ config ETHTOOL_PRETTY_DUMP
++ bool "Enable pretty printing"
++
++endmenu
+diff --git a/feeds/packages/net/ethtool/Makefile b/feeds/packages/net/ethtool/Makefile
+new file mode 100644
+index 0000000..1107654
+--- /dev/null
++++ b/feeds/packages/net/ethtool/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ethtool
++PKG_VERSION:=4.2
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=Matthias Schiffer <mschiffer@universe-factory.net>
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@KERNEL/software/network/ethtool
++PKG_MD5SUM:=8433e71a256678d859ecc264132063c5
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++PKG_CONFIG_DEPENDS:=ETHTOOL_PRETTY_DUMP
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ethtool
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Display or change ethernet card settings
++ URL:=http://www.kernel.org/pub/software/network/ethtool/
++endef
++
++define Package/ethtool/description
++ ethtool is a small utility for examining and tuning your ethernet-based
++ network interface
++endef
++
++define Package/ethtool/config
++ source "$(SOURCE)/Config.in"
++endef
++
++ifeq ($(CONFIG_ETHTOOL_PRETTY_DUMP),y)
++CONFIGURE_ARGS += --enable-pretty-dump
++else
++CONFIGURE_ARGS += --disable-pretty-dump
++endif
++
++define Package/ethtool/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ethtool $(1)/usr/sbin
++endef
++
++$(eval $(call BuildPackage,ethtool))
+diff --git a/feeds/packages/net/fakeidentd/Makefile b/feeds/packages/net/fakeidentd/Makefile
+new file mode 100644
+index 0000000..ce27911
+--- /dev/null
++++ b/feeds/packages/net/fakeidentd/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=fakeidentd
++PKG_VERSION:=2.6
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).c
++PKG_SOURCE_URL:=http://distfiles.gentoo.org/distfiles/
++PKG_MD5SUM:=d26693c1a7c883d1432e05fb6f7ead6e
++PKG_MAINTAINER:=Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>
++PKG_LICENSE:=GPL-2.0+
++UNPACK_CMD=$(CP) $(DL_DIR)/$(PKG_SOURCE) $(1)/
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/fakeidentd
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=A static, secure identd.
++ URL:=http://www.guru-group.fi/~too/sw/releases/
++endef
++
++define Package/fakeidentd/description
++ A static secure identd, only one source file.
++endef
++
++define Build/Compile
++ $(SHELL) "$(PKG_BUILD_DIR)/$(MAKE_PATH)/$(PKG_SOURCE)" \
++ CC="$(TARGET_CC)" TRG="$(PKG_BUILD_DIR)/$(MAKE_PATH)/$(PKG_NAME)" \
++ $(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS) \
++ $(TARGET_LDFLAGS) $(EXTRA_LDFLAGS) -DUSE_UNIX_OS
++endef
++
++define Package/fakeidentd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/$(PKG_NAME).init $(1)/etc/init.d/$(PKG_NAME)
++endef
++
++$(eval $(call BuildPackage,fakeidentd))
+diff --git a/feeds/packages/net/fakeidentd/files/fakeidentd.init b/feeds/packages/net/fakeidentd/files/fakeidentd.init
+new file mode 100644
+index 0000000..4959ef2
+--- /dev/null
++++ b/feeds/packages/net/fakeidentd/files/fakeidentd.init
+@@ -0,0 +1,12 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2012 OpenWrt.org
++
++START=85
++
++start() {
++ service_start /usr/sbin/fakeidentd -r
++}
++
++stop() {
++ service_stop /usr/sbin/fakeidentd
++}
+diff --git a/feeds/packages/net/fastd/Config.in b/feeds/packages/net/fastd/Config.in
+new file mode 100644
+index 0000000..5820b97
+--- /dev/null
++++ b/feeds/packages/net/fastd/Config.in
+@@ -0,0 +1,108 @@
++menu "Configuration"
++ depends on PACKAGE_fastd
++
++config FASTD_ENABLE_METHOD_CIPHER_TEST
++ bool "Enable cipher-test method provider"
++ depends on PACKAGE_fastd
++ default n
++
++config FASTD_ENABLE_METHOD_COMPOSED_GMAC
++ bool "Enable composed-gmac method provider"
++ depends on PACKAGE_fastd
++ default y
++
++config FASTD_ENABLE_METHOD_COMPOSED_UMAC
++ bool "Enable composed-umac method provider"
++ depends on PACKAGE_fastd
++ default y
++
++config FASTD_ENABLE_METHOD_GENERIC_GMAC
++ bool "Enable generic-gmac method provider"
++ depends on PACKAGE_fastd
++ default y
++
++config FASTD_ENABLE_METHOD_GENERIC_POLY1305
++ bool "Enable generic-poly1305 method provider"
++ depends on PACKAGE_fastd
++ default n
++
++config FASTD_ENABLE_METHOD_GENERIC_UMAC
++ bool "Enable generic-umac method provider"
++ depends on PACKAGE_fastd
++ default y
++
++config FASTD_ENABLE_METHOD_NULL
++ bool "Enable null method"
++ depends on PACKAGE_fastd
++ default y
++
++config FASTD_ENABLE_METHOD_XSALSA20_POLY1305
++ bool "Enable xsalsa20-poly1305 method"
++ depends on PACKAGE_fastd
++ default n
++
++
++config FASTD_ENABLE_CIPHER_AES128_CTR
++ bool "Enable the AES128-CTR cipher"
++ depends on PACKAGE_fastd
++ default n
++
++config FASTD_ENABLE_CIPHER_NULL
++ bool "Enable the null cipher"
++ depends on PACKAGE_fastd
++ default y
++
++config FASTD_ENABLE_CIPHER_SALSA20
++ bool "Enable the Salsa20 cipher"
++ depends on PACKAGE_fastd
++ default n
++
++config FASTD_ENABLE_CIPHER_SALSA2012
++ bool "Enable the Salsa20/12 cipher"
++ depends on PACKAGE_fastd
++ default y
++
++
++config FASTD_ENABLE_MAC_GHASH
++ bool "Enable the GHASH message authentication code"
++ depends on PACKAGE_fastd
++ default y
++
++config FASTD_ENABLE_MAC_UHASH
++ bool "Enable the UHASH message authentication code"
++ depends on PACKAGE_fastd
++ default y
++
++
++config FASTD_WITH_CMDLINE_USER
++ bool "Include support for setting user/group related options on the command line"
++ depends on PACKAGE_fastd
++ default n
++
++config FASTD_WITH_CMDLINE_LOGGING
++ bool "Include support for setting logging related options on the command line"
++ depends on PACKAGE_fastd
++ default n
++
++config FASTD_WITH_CMDLINE_OPERATION
++ bool "Include support for setting options related to the VPN operation (like mode, interface, encryption method) on the command line"
++ depends on PACKAGE_fastd
++ default n
++
++config FASTD_WITH_CMDLINE_COMMANDS
++ bool "Include support for setting handler scripts (e.g. --on-up) on the command line"
++ depends on PACKAGE_fastd
++ default n
++
++config FASTD_WITH_DYNAMIC_PEERS
++ bool "Include support for on-verify handlers"
++ depends on PACKAGE_fastd
++ default n
++
++config FASTD_WITH_STATUS_SOCKET
++ bool "Include support for status sockets"
++ depends on PACKAGE_fastd
++ default y
++
++
++endmenu
+diff --git a/feeds/packages/net/fastd/Makefile b/feeds/packages/net/fastd/Makefile
+new file mode 100644
+index 0000000..0574b39
+--- /dev/null
++++ b/feeds/packages/net/fastd/Makefile
+@@ -0,0 +1,199 @@
++#
++# Copyright (C) 2012-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=fastd
++PKG_VERSION:=17
++PKG_RELEASE:=2
++
++PKG_MAINTAINER:=Matthias Schiffer <mschiffer@universe-factory.net>
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=https://projects.universe-factory.net/attachments/download/81
++PKG_MD5SUM:=bad4f1948702f418b799578f83a0edb8
++
++PKG_LICENSE:=BSD-2-Clause
++PKG_LICENSE_FILES:=COPYRIGHT
++
++PKG_CONFIG_DEPENDS:=\
++ CONFIG_FASTD_ENABLE_METHOD_CIPHER_TEST \
++ CONFIG_FASTD_ENABLE_METHOD_COMPOSED_GMAC \
++ CONFIG_FASTD_ENABLE_METHOD_COMPOSED_UMAC \
++ CONFIG_FASTD_ENABLE_METHOD_GENERIC_GMAC \
++ CONFIG_FASTD_ENABLE_METHOD_GENERIC_POLY1305 \
++ CONFIG_FASTD_ENABLE_METHOD_GENERIC_UMAC \
++ CONFIG_FASTD_ENABLE_METHOD_NULL \
++ CONFIG_FASTD_ENABLE_METHOD_XSALSA20_POLY1305 \
++ CONFIG_FASTD_ENABLE_CIPHER_AES128_CTR \
++ CONFIG_FASTD_ENABLE_CIPHER_NULL \
++ CONFIG_FASTD_ENABLE_CIPHER_SALSA20 \
++ CONFIG_FASTD_ENABLE_CIPHER_SALSA2012 \
++ CONFIG_FASTD_ENABLE_MAC_GHASH \
++ CONFIG_FASTD_ENABLE_MAC_UHASH \
++ CONFIG_FASTD_WITH_CMDLINE_USER \
++ CONFIG_FASTD_WITH_CMDLINE_LOGGING \
++ CONFIG_FASTD_WITH_CMDLINE_OPERATION \
++ CONFIG_FASTD_WITH_CMDLINE_COMMANDS \
++ CONFIG_FASTD_WITH_DYNAMIC_PEERS \
++ CONFIG_FASTD_WITH_STATUS_SOCKET
++
++
++PKG_BUILD_DEPENDS:=nacl libuecc
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/fastd
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+kmod-tun +librt +libpthread +FASTD_WITH_STATUS_SOCKET:libjson-c
++ TITLE:=Fast and Secure Tunneling Daemon
++ URL:=https://projects.universe-factory.net/projects/fastd
++ SUBMENU:=VPN
++endef
++
++define Package/fastd/config
++ source "$(SOURCE)/Config.in"
++endef
++
++TARGET_CFLAGS += -ffunction-sections -fdata-sections
++TARGET_LDFLAGS += -Wl,--gc-sections
++
++CMAKE_OPTIONS += \
++ -DCMAKE_BUILD_TYPE:STRING=MINSIZEREL \
++ -DWITH_METHOD_CIPHER_TEST:BOOL=FALSE \
++ -DWITH_METHOD_COMPOSED_GMAC:BOOL=FALSE \
++ -DWITH_METHOD_COMPOSED_UMAC:BOOL=FALSE \
++ -DWITH_METHOD_GENERIC_GMAC:BOOL=FALSE \
++ -DWITH_METHOD_GENERIC_POLY1305:BOOL=FALSE \
++ -DWITH_METHOD_GENERIC_UMAC:BOOL=FALSE \
++ -DWITH_METHOD_NULL:BOOL=FALSE \
++ -DWITH_METHOD_XSALSA20_POLY1305:BOOL=FALSE \
++ -DWITH_CIPHER_AES128_CTR:BOOL=FALSE \
++ -DWITH_CIPHER_NULL:BOOL=FALSE \
++ -DWITH_CIPHER_SALSA20:BOOL=FALSE \
++ -DWITH_CIPHER_SALSA2012:BOOL=FALSE \
++ -DWITH_MAC_GHASH:BOOL=FALSE \
++ -DWITH_MAC_UHASH:BOOL=FALSE \
++ -DWITH_CMDLINE_USER:BOOL=FALSE \
++ -DWITH_CMDLINE_LOGGING:BOOL=FALSE \
++ -DWITH_CMDLINE_OPERATION:BOOL=FALSE \
++ -DWITH_CMDLINE_COMMANDS:BOOL=FALSE \
++ -DWITH_DYNAMIC_PEERS:BOOL=FALSE \
++ -DWITH_STATUS_SOCKET:BOOL=FALSE \
++ -DWITH_CAPABILITIES:BOOL=FALSE \
++ -DENABLE_SYSTEMD:BOOL=FALSE \
++ -DENABLE_LIBSODIUM:BOOL=FALSE \
++ -DENABLE_LTO:BOOL=TRUE
++
++
++ifeq ($(CONFIG_FASTD_ENABLE_METHOD_CIPHER_TEST),y)
++CMAKE_OPTIONS += -DWITH_METHOD_CIPHER_TEST:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_ENABLE_METHOD_COMPOSED_GMAC),y)
++CMAKE_OPTIONS += -DWITH_METHOD_COMPOSED_GMAC:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_ENABLE_METHOD_COMPOSED_UMAC),y)
++CMAKE_OPTIONS += -DWITH_METHOD_COMPOSED_UMAC:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_ENABLE_METHOD_GENERIC_GMAC),y)
++CMAKE_OPTIONS += -DWITH_METHOD_GENERIC_GMAC:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_ENABLE_METHOD_GENERIC_POLY1305),y)
++CMAKE_OPTIONS += -DWITH_METHOD_GENERIC_POLY1305:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_ENABLE_METHOD_GENERIC_UMAC),y)
++CMAKE_OPTIONS += -DWITH_METHOD_GENERIC_UMAC:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_ENABLE_METHOD_NULL),y)
++CMAKE_OPTIONS += -DWITH_METHOD_NULL:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_ENABLE_METHOD_XSALSA20_POLY1305),y)
++CMAKE_OPTIONS += -DWITH_METHOD_XSALSA20_POLY1305:BOOL=TRUE
++endif
++
++
++ifeq ($(CONFIG_FASTD_ENABLE_CIPHER_AES128_CTR),y)
++CMAKE_OPTIONS += -DWITH_CIPHER_AES128_CTR:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_ENABLE_CIPHER_NULL),y)
++CMAKE_OPTIONS += -DWITH_CIPHER_NULL:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_ENABLE_CIPHER_SALSA20),y)
++CMAKE_OPTIONS += -DWITH_CIPHER_SALSA20:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_ENABLE_CIPHER_SALSA2012),y)
++CMAKE_OPTIONS += -DWITH_CIPHER_SALSA2012:BOOL=TRUE
++endif
++
++
++ifeq ($(CONFIG_FASTD_ENABLE_MAC_GHASH),y)
++CMAKE_OPTIONS += -DWITH_MAC_GHASH:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_ENABLE_MAC_UHASH),y)
++CMAKE_OPTIONS += -DWITH_MAC_UHASH:BOOL=TRUE
++endif
++
++
++ifeq ($(CONFIG_FASTD_WITH_CMDLINE_USER),y)
++CMAKE_OPTIONS += -DWITH_CMDLINE_USER:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_WITH_CMDLINE_LOGGING),y)
++CMAKE_OPTIONS += -DWITH_CMDLINE_LOGGING:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_WITH_CMDLINE_OPERATION),y)
++CMAKE_OPTIONS += -DWITH_CMDLINE_OPERATION:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_WITH_CMDLINE_COMMANDS),y)
++CMAKE_OPTIONS += -DWITH_CMDLINE_COMMANDS:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_WITH_DYNAMIC_PEERS),y)
++CMAKE_OPTIONS += -DWITH_DYNAMIC_PEERS:BOOL=TRUE
++endif
++
++ifeq ($(CONFIG_FASTD_WITH_STATUS_SOCKET),y)
++CMAKE_OPTIONS += -DWITH_STATUS_SOCKET:BOOL=TRUE
++endif
++
++
++define Package/fastd/description
++ Fast and secure tunneling daemon, which is optimized on small code size and few dependencies
++endef
++
++define Package/fastd/conffiles
++/etc/config/fastd
++endef
++
++define Package/fastd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/fastd $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/openwrt/fastd.init $(1)/etc/init.d/fastd
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/doc/examples/openwrt/fastd.config $(1)/etc/config/fastd
++ $(INSTALL_DIR) $(1)/etc/fastd
++ $(INSTALL_DIR) $(1)/lib/upgrade/keep.d
++ $(INSTALL_DATA) files/fastd.upgrade $(1)/lib/upgrade/keep.d/fastd
++endef
++
++$(eval $(call BuildPackage,fastd))
+diff --git a/feeds/packages/net/fastd/files/fastd.upgrade b/feeds/packages/net/fastd/files/fastd.upgrade
+new file mode 100644
+index 0000000..7406613
+--- /dev/null
++++ b/feeds/packages/net/fastd/files/fastd.upgrade
+@@ -0,0 +1 @@
++/etc/fastd/
+diff --git a/feeds/packages/net/fastd/patches/100-musl-compat.patch b/feeds/packages/net/fastd/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..984aace
+--- /dev/null
++++ b/feeds/packages/net/fastd/patches/100-musl-compat.patch
+@@ -0,0 +1,67 @@
++--- a/cmake/checks.cmake
+++++ b/cmake/checks.cmake
++@@ -54,9 +54,13 @@ if(NOT DARWIN)
++ endif(NOT DARWIN)
++
++
+++set(CMAKE_EXTRA_INCLUDE_FILES "linux/if_ether.h")
+++check_type_size("struct ethhdr" SIZEOF_ETHHDR)
+++string(COMPARE NOTEQUAL "${SIZEOF_ETHHDR}" "" HAVE_LINUX_ETHHDR)
+++
++ set(CMAKE_EXTRA_INCLUDE_FILES "netinet/if_ether.h")
++ check_type_size("struct ethhdr" SIZEOF_ETHHDR)
++-string(COMPARE NOTEQUAL "${SIZEOF_ETHHDR}" "" HAVE_ETHHDR)
+++string(COMPARE NOTEQUAL "${SIZEOF_ETHHDR}" "" HAVE_NETINET_ETHHDR)
++
++
++ set(CMAKE_REQUIRED_INCLUDES "sys/types.h")
++--- a/src/compat.h
+++++ b/src/compat.h
++@@ -45,7 +45,12 @@
++ #include <net/if.h>
++ #include <net/if_arp.h>
++ #include <netinet/in.h>
+++
+++#if defined(HAVE_LINUX_ETHHDR)
+++#include <linux/if_ether.h>
+++#elif defined(HAVE_NETINET_ETHHDR)
++ #include <netinet/if_ether.h>
+++#endif
++
++ #ifndef ETH_ALEN
++ /** The length of a MAC address */
++@@ -55,9 +60,8 @@
++ #ifndef ETH_HLEN
++ /** The length of the standard ethernet header */
++ #define ETH_HLEN 14
++-#endif
++
++-#ifndef HAVE_ETHHDR
+++#if !defined(HAVE_LINUX_ETHHDR) && !defined(HAVE_NETINET_ETHHDR)
++ /** An ethernet header */
++ struct ethhdr {
++ uint8_t h_dest[ETH_ALEN]; /**< The destination MAC address field */
++@@ -65,6 +69,7 @@ struct ethhdr {
++ uint16_t h_proto; /**< The EtherType/length field */
++ } __attribute__((packed));
++ #endif
+++#endif
++
++ #if defined(USE_FREEBIND) && !defined(IP_FREEBIND)
++ /** Compatiblity define for systems supporting, but not defining IP_FREEBIND */
++--- a/src/fastd_config.h.in
+++++ b/src/fastd_config.h.in
++@@ -35,8 +35,11 @@
++ /** Defined if the platform supports the AI_ADDRCONFIG flag to getaddrinfo() */
++ #cmakedefine HAVE_AI_ADDRCONFIG
++
++-/** Defined if the platform defines the \e ethhdr struct */
++-#cmakedefine HAVE_ETHHDR
+++/** Defined if the platform defines the \e ethhdr struct through linux/if_ether.h */
+++#cmakedefine HAVE_LINUX_ETHHDR
+++
+++/** Defined if the platform defines the \e ethhdr struct through netinet/if_ether.h */
+++#cmakedefine HAVE_NETINET_ETHHDR
++
++ /** Defined if the platform defines get_current_dir_name() */
++ #cmakedefine HAVE_GET_CURRENT_DIR_NAME
+diff --git a/feeds/packages/net/fossil/Makefile b/feeds/packages/net/fossil/Makefile
+new file mode 100644
+index 0000000..656c83c
+--- /dev/null
++++ b/feeds/packages/net/fossil/Makefile
+@@ -0,0 +1,70 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=fossil
++PKG_VERSION:=1.33
++PKG_RELEASE:=1
++
++PKG_LICENSE:=BSD-2-Clause
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_SOURCE:=$(PKG_NAME)-src-${PKG_VERSION}.tar.gz
++PKG_SOURCE_URL:=http://www.fossil-scm.org/download/
++PKG_MD5SUM:=53f8145084a2065d6cb734980c172c7e
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-src-$(PKG_VERSION)
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/fossil
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Version Control Systems
++ TITLE:=Simple distributed software configuration management
++ URL:=http://www.fossil-scm.org
++ DEPENDS:=+zlib
++endef
++
++define Package/fossil/description
++ Fossil is a distributed version control system, bug tracking system
++ and wiki software server for use in software development.
++endef
++
++MAKE_FLAGS := \
++ TCC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include -DFOSSIL_ENABLE_JSON" \
++ LDFLAGS="$(TARGET_LDFLAGS) -Wl,-rpath=$(TOOLCHAIN_DIR)/lib -L$(STAGING_DIR)/lib -L$(STAGING_DIR)/usr/lib" \
++
++undefine Build/Configure
++
++define Build/Compile
++ $(call Build/Compile/Default, \
++ -f Makefile.classic $(MAKE_FLAGS) all \
++ )
++endef
++
++undefine Build/Install
++
++define Package/fossil/conffiles
++/etc/config/fossil
++endef
++
++define Package/fossil/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/fossil.init $(1)/etc/init.d/fossil
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/fossil.config $(1)/etc/config/fossil
++endef
++
++$(eval $(call BuildPackage,fossil))
+diff --git a/feeds/packages/net/fossil/files/fossil.config b/feeds/packages/net/fossil/files/fossil.config
+new file mode 100644
+index 0000000..f35876c
+--- /dev/null
++++ b/feeds/packages/net/fossil/files/fossil.config
+@@ -0,0 +1,5 @@
++config server 'dummy'
++ option repository '/tmp/fossil/dummy'
++ option port 8008
++ option localhost 0
++ option create 1
+diff --git a/feeds/packages/net/fossil/files/fossil.init b/feeds/packages/net/fossil/files/fossil.init
+new file mode 100644
+index 0000000..f5a17b9
+--- /dev/null
++++ b/feeds/packages/net/fossil/files/fossil.init
+@@ -0,0 +1,54 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=90
++USE_PROCD=1
++
++start_instance() {
++ local cfg="$1"
++
++ config_get repository "$cfg" repository
++ if [ -z "$repository" ]; then
++ echo "repository is not defined in $1, skipping"
++ return
++ fi
++
++ config_get_bool create "$cfg" create 0
++
++ if [ "$create" -eq 0 -a ! -f "$repository" ]; then
++ echo "in $1 create option is '$create' and repository '$repository' is not a regular file, skipping"
++ return
++ fi
++
++ if [ "$create" -eq 1 -a ! -d `dirname $repository` ]; then
++ mkdir -p `dirname $repository`
++ if [ "$?" -ne 0 ]; then
++ echo "could not create directory, skipping"
++ return
++ fi
++ fi
++
++ config_get port "$cfg" port ""
++ if [ -z "$port" ]; then
++ echo "port is not defined in $1, skipping"
++ return
++ fi
++
++ config_get_bool debug "$cfg" debug 0
++ config_get_bool localhost "$cfg" localhost 1
++ config_get_bool scgi "$cfg" scgi 0
++
++ procd_open_instance
++ procd_set_param command /usr/bin/fossil server "$repository" --port $port
++ [ "$debug" -eq 1 ] && procd_append_param command --th-trace
++ [ "$create" -eq 1 ] && procd_append_param command --user root --create
++ [ "$localhost" -eq 1 ] && procd_append_param command --localhost
++ [ "$scgi" -eq 1 ] && procd_append_param command --scgi
++ procd_set_param respawn
++ procd_close_instance
++}
++
++start_service() {
++ config_load 'fossil'
++ config_foreach start_instance 'server'
++}
+diff --git a/feeds/packages/net/fossil/patches/no_https.patch b/feeds/packages/net/fossil/patches/no_https.patch
+new file mode 100644
+index 0000000..411504f
+--- /dev/null
++++ b/feeds/packages/net/fossil/patches/no_https.patch
+@@ -0,0 +1,22 @@
++--- a/Makefile.classic
+++++ b/Makefile.classic
++@@ -41,9 +41,6 @@ TCC = gcc -g -Os -Wall
++ # FOSSIL_ENABLE_MINIZ = 1
++ # TCC += -DFOSSIL_ENABLE_MINIZ
++
++-# To add support for HTTPS
++-TCC += -DFOSSIL_ENABLE_SSL
++-
++ #### Extra arguments for linking the finished binary. Fossil needs
++ # to link against the Z-Lib compression library unless the miniz
++ # library in the source tree is being used. There are no other
++@@ -58,9 +55,6 @@ ZLIB_LIB. = $(ZLIB_LIB.0)
++ # If using zlib:
++ LIB = $(ZLIB_LIB.$(FOSSIL_ENABLE_MINIZ)) $(LDFLAGS)
++
++-# If using HTTPS:
++-LIB += -lcrypto -lssl
++-
++ #### Tcl shell for use in running the fossil testsuite. If you do not
++ # care about testing the end result, this can be blank.
++ #
+diff --git a/feeds/packages/net/freeradius2/Config.in b/feeds/packages/net/freeradius2/Config.in
+new file mode 100644
+index 0000000..cd0141e
+--- /dev/null
++++ b/feeds/packages/net/freeradius2/Config.in
+@@ -0,0 +1,14 @@
++# FreeRADIUS avanced configuration
++
++choice
++ prompt "SSL library"
++ default FREERADIUS_OPENSSL
++ depends on PACKAGE_freeradius2-common
++
++config FREERADIUS_NOSSL
++ bool "No SSL support"
++
++config FREERADIUS_OPENSSL
++ bool "OpenSSL"
++
++endchoice
+diff --git a/feeds/packages/net/freeradius2/Makefile b/feeds/packages/net/freeradius2/Makefile
+new file mode 100644
+index 0000000..d116dba
+--- /dev/null
++++ b/feeds/packages/net/freeradius2/Makefile
+@@ -0,0 +1,635 @@
++#
++# Copyright (C) 2008-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=freeradius2
++PKG_VERSION:=2.2.8
++PKG_RELEASE:=1
++
++PKG_SOURCE:=freeradius-server-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=\
++ ftp://ftp.freeradius.org/pub/freeradius/ \
++ ftp://ftp.freeradius.org/pub/freeradius/old/
++PKG_MD5SUM:=0adc2454392ab8a43664dea416022e28
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYRIGHT LICENSE
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/freeradius-server-$(PKG_VERSION)
++PKG_FIXUP:=autoreconf
++PKG_CHECK_FORMAT_SECURITY:=0
++
++PKG_CONFIG_DEPENDS := \
++ FREERADIUS_OPENSSL \
++ FREERADIUS_NOSSL
++
++PKG_CHECK_FORMAT_SECURITY:=0
++include $(INCLUDE_DIR)/package.mk
++
++define Package/freeradius2/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/freeradius2/Default
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://freeradius.org/
++ SUBMENU:=FreeRADIUS (version 2)
++endef
++
++define Package/freeradius2
++ $(call Package/freeradius2/Default)
++ DEPENDS:=+libltdl +libreadline +freeradius2-common
++ TITLE:=A flexible RADIUS server (version 2)
++endef
++
++define Package/freeradius2/conffiles
++/etc/freeradius2/clients.conf
++/etc/freeradius2/radiusd.conf
++/etc/freeradius2/sites/default
++endef
++
++define Package/freeradius2-democerts
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Demo certificates to test the server
++endef
++
++define Package/freeradius2-common
++ $(call Package/freeradius2/Default)
++ TITLE:=common files
++ DEPENDS:=+libpthread +FREERADIUS_OPENSSL:libopenssl
++endef
++
++define Package/freeradius2-mod-chap
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=CHAP module
++endef
++
++define Package/freeradius2-mod-chap/conffiles
++/etc/freeradius2/modules/chap
++endef
++
++define Package/freeradius2-mod-detail
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Detailed accounting module
++endef
++
++define Package/freeradius2-mod-detail/conffiles
++/etc/freeradius2/modules/detail
++endef
++
++define Package/freeradius2-mod-eap
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Base EAP module
++endef
++
++define Package/freeradius2-mod-eap/conffiles
++/etc/freeradius2/eap.conf
++endef
++
++define Package/freeradius2-mod-eap-gtc
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2-mod-eap
++ TITLE:=EAP/GTC module
++endef
++
++define Package/freeradius2-mod-eap-md5
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2-mod-eap
++ TITLE:=EAP/MD5 module
++endef
++
++define Package/freeradius2-mod-eap-mschapv2
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2-mod-eap +freeradius2-mod-mschap
++ TITLE:=EAP/MS-CHAPv2 module
++endef
++
++define Package/freeradius2-mod-eap-peap
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2-mod-eap @FREERADIUS_OPENSSL
++ TITLE:=EAP/PEAP module
++endef
++
++define Package/freeradius2-mod-eap-tls
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2-mod-eap @FREERADIUS_OPENSSL
++ TITLE:=EAP/TLS module
++endef
++
++define Package/freeradius2-mod-eap-ttls
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2-mod-eap-tls
++ TITLE:=EAP/TTLS module
++endef
++
++define Package/freeradius2-mod-exec
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=EXEC module
++endef
++
++define Package/freeradius2-mod-exec/conffiles
++/etc/freeradius2/modules/exec
++endef
++
++define Package/freeradius2-mod-expiration
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Expiration module
++endef
++
++define Package/freeradius2-mod-expiration/conffiles
++/etc/freeradius2/modules/expiration
++endef
++
++define Package/freeradius2-mod-always
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Always module
++endef
++
++define Package/freeradius2-mod-always/conffiles
++/etc/freeradius2/modules/always
++endef
++
++define Package/freeradius2-mod-expr
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=EXPR module
++endef
++
++define Package/freeradius2-mod-expr/conffiles
++/etc/freeradius2/modules/expr
++endef
++
++define Package/freeradius2-mod-attr-filter
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=ATTR filter module
++endef
++
++define Package/freeradius2-mod-attr-filter/conffiles
++/etc/freeradius2/modules/attr_filter
++/etc/freeradius2/attrs
++/etc/freeradius2/attrs.access_reject
++/etc/freeradius2/attrs.accounting_response
++/etc/freeradius2/attrs.pre-proxy
++endef
++
++define Package/freeradius2-mod-attr-rewrite
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=ATTR rewrite module
++endef
++
++define Package/freeradius2-mod-attr-rewrite/conffiles
++/etc/freeradius2/modules/attr_rewrite
++endef
++
++define Package/freeradius2-mod-files
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Module using local files for authorization
++endef
++
++define Package/freeradius2-mod-files/conffiles
++/etc/freeradius2/acct_users
++/etc/freeradius2/preproxy_users
++/etc/freeradius2/users
++/etc/freeradius2/modules/files
++endef
++
++define Package/freeradius2-mod-passwd
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Rlm passwd module
++endef
++
++define Package/freeradius2-mod-passwd/conffiles
++/etc/freeradius2/modules/passwd
++endef
++
++define Package/freeradius2-mod-ldap
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2 +libopenldap
++ TITLE:=LDAP module
++endef
++
++define Package/freeradius2-mod-ldap/conffiles
++/etc/freeradius2/ldap.attrmap
++/etc/freeradius2/modules/ldap
++endef
++
++define Package/freeradius2-mod-logintime
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Logintime module
++endef
++
++define Package/freeradius2-mod-logintime/conffiles
++/etc/freeradius2/modules/logintime
++endef
++
++define Package/freeradius2-mod-mschap
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=MS-CHAP and MS-CHAPv2 module
++endef
++
++define Package/freeradius2-mod-mschap/conffiles
++/etc/freeradius2/modules/mschap
++endef
++
++define Package/freeradius2-mod-pap
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=PAP module
++endef
++
++define Package/freeradius2-mod-pap/conffiles
++/etc/freeradius2/modules/pap
++endef
++
++define Package/freeradius2-mod-preprocess
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Request pre-processing module
++endef
++
++define Package/freeradius2-mod-preprocess/conffiles
++/etc/freeradius2/hints
++/etc/freeradius2/huntgroups
++/etc/freeradius2/modules/preprocess
++endef
++
++define Package/freeradius2-mod-realm
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Realms handling module
++endef
++
++define Package/freeradius2-mod-realm/conffiles
++/etc/freeradius2/proxy.conf
++/etc/freeradius2/modules/realm
++endef
++
++define Package/freeradius2-mod-sql
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Base SQL module
++endef
++
++define Package/freeradius2-mod-sql/conffiles
++/etc/freeradius2/sql.conf
++endef
++
++define Package/freeradius2-mod-sql-mysql
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2-mod-sql +libmysqlclient-r
++ TITLE:=MySQL module
++endef
++
++define Package/freeradius2-mod-sql-pgsql
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2-mod-sql +libpq
++ TITLE:=PostgreSQL module
++endef
++
++define Package/freeradius2-mod-sql-sqlite
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2-mod-sql +libsqlite3
++ TITLE:=SQLite module
++endef
++
++define Package/freeradius2-mod-sqlcounter
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2-mod-sql
++ TITLE:=Generic SQL Counter module
++endef
++
++define Package/freeradius2-mod-radutmp
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=Radius UTMP module
++endef
++
++define Package/freeradius2-mod-radutmp/conffiles
++/etc/freeradius2/modules/radutmp
++/etc/freeradius2/modules/sradutmp
++endef
++
++define Package/freeradius2-utils
++ $(call Package/freeradius2/Default)
++ DEPENDS:=+freeradius2-common
++ TITLE:=Misc. client utilities
++endef
++
++define Package/freeradius2-mod-sqllog
++ $(call Package/freeradius2/Default)
++ DEPENDS:=freeradius2
++ TITLE:=SQL Logging module
++endef
++
++CONFIGURE_ARGS+= \
++ --libdir=/usr/lib/freeradius2 \
++ --libexecdir=/usr/lib/freeradius2 \
++ --enable-shared \
++ --disable-static \
++ --disable-developer \
++ --with-threads \
++ $(if $(CONFIG_FREERADIUS_OPENSSL),--with,--without)-openssl \
++ $(if $(CONFIG_FREERADIUS_OPENSSL),--with-openssl-includes="$(STAGING_DIR)/usr/include",) \
++ $(if $(CONFIG_FREERADIUS_OPENSSL),--with-openssl-libraries="$(STAGING_DIR)/usr/lib",) \
++ --with-system-libtool \
++ --with-system-libltdl \
++ --enable-strict-dependencies \
++ --with-raddbdir=/etc/freeradius2 \
++ --with-radacctdir=/var/db/radacct \
++ --with-logdir=/var/log \
++ --without-edir \
++ --without-snmp \
++ --without-rlm_checkval \
++ --without-rlm_dbm \
++ --without-rlm_counter \
++ --with-rlm_expr \
++ --with-rlm_eap \
++ --without-rlm_eap_sim \
++ --without-rlm_example \
++ --without-rlm_ippool \
++ --without-rlm_krb5 \
++ --without-rlm_otp \
++ --without-rlm_smsotp \
++ --without-rlm_pam \
++ --without-rlm_perl \
++ --without-rlm_python \
++ --without-rlm_smb \
++ --with-rlm_sql \
++ --with-rlm_sqlcounter \
++ --without-rlm_sqlhpwippool \
++ --without-rlm_sqlippool \
++ --without-rlm_sql_db2 \
++ --without-rlm_sql_firebird \
++ --without-rlm_sql_freetds \
++ --without-rlm_sql_iodbc \
++ --without-rlm_sql_oracle \
++ --without-rlm_sql_sybase \
++ --without-rlm_sql_unixodbc \
++ --without-rlm_sql_log \
++ --without-rlm_unix \
++ --without-rlm_eap_tnc \
++ --without-rlm_eap_ikev2 \
++ --without-rlm_opendirectory \
++ --without-rlm_wimax \
++ --without-rlm_ruby \
++ --without-rlm_caching \
++ --without-rlm_redis \
++ --without-rlm_rediswho \
++ --without-rlm_soh \
++ --without-rlm_sim \
++ --without-rlm_replicate \
++ --without-rlm_protocol_filter \
++ --without-rlm_policy \
++ --without-rlm_linelog \
++ --without-rlm_jradius \
++ --without-rlm_fastusers \
++ --without-rlm_eap_leap \
++ --without-rlm_dynamic_clients \
++ --without-rlm_digest \
++ --without-rlm_cram \
++ --without-rlm_copy_packet \
++ --without-rlm_acct_unique \
++ --without-rlm_acctlog
++
++
++PKG_DICTIONARIES:= \
++ freeradius freeradius.internal \
++ rfc2865 rfc2866 rfc2867 rfc2868 rfc2869 rfc3162 rfc3576 rfc3580 \
++ rfc4372 rfc4675 rfc4679 \
++ microsoft \
++ wispr \
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-ldap),)
++ CONFIGURE_ARGS+= \
++ --with-rlm_ldap-include-dir="$(STAGING_DIR)/usr/include" \
++ --with-rlm_ldap-lib-dir="$(STAGING_DIR)/usr/lib"
++ CONFIGURE_LIBS+= -lcrypto -lssl
++else
++ CONFIGURE_ARGS+= --without-rlm_ldap
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-sql-mysql),)
++ CONFIGURE_ARGS+= \
++ --with-mysql-include-dir="$(STAGING_DIR)/usr/include" \
++ --with-mysql-lib-dir="$(STAGING_DIR)/usr/lib/mysql"
++ CONFIGURE_LIBS+= -lz
++ CONFIGURE_VARS+= ac_cv_lib_mysqlclient_r_mysql_init=yes
++else
++ CONFIGURE_ARGS+= --without-rlm_sql_mysql
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-sql-pgsql),)
++ CONFIGURE_ARGS+= \
++ --with-rlm_sql_postgresql-include-dir="$(STAGING_DIR)/usr/include" \
++ --with-rlm_sql_postgresql-lib-dir="$(STAGING_DIR)/usr/lib"
++else
++ CONFIGURE_ARGS+= --without-rlm_sql_postgresql
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-sqllog),)
++ CONFIGURE_ARGS+= \
++ --with-rlm_sql_log \
++ --with-experimental-modules \
++else
++ CONFIGURE_ARGS+= --without-rlm_sql_log
++endif
++
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-sql-sqlite),)
++ CONFIGURE_ARGS+= \
++ --with-rlm_sql_sqlite \
++ --with-experimental-modules \
++ --with-sqlite-include-dir="$(STAGING_DIR)/usr/include" \
++ --with-sqlite-lib-dir="$(STAGING_DIR)/usr/lib"
++else
++ CONFIGURE_ARGS+= --without-rlm_sql_sqlite
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-eap-peap),)
++ CONFIGURE_ARGS+= \
++ --with-rlm_eap_peap \
++ --with-rlm_eap_peap-include-dir="$(STAGING_DIR)/usr/include" \
++ --with-rlm_eap_peap-lib-dir="$(STAGING_DIR)/usr/lib"
++ CONFIGURE_LIBS+= -lcrypto -lssl
++else
++ CONFIGURE_ARGS+= --without-rlm_eap_peap
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-eap-tls),)
++ CONFIGURE_ARGS+= \
++ --with-rlm_eap_tls \
++ --with-rlm_eap_tls-include-dir="$(STAGING_DIR)/usr/include" \
++ --with-rlm_eap_tls-lib-dir="$(STAGING_DIR)/usr/lib"
++ CONFIGURE_LIBS+= -lcrypto -lssl
++else
++ CONFIGURE_ARGS+= --without-rlm_eap_tls
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-eap-ttls),)
++ CONFIGURE_ARGS+= \
++ --with-rlm_eap_ttls \
++ --with-rlm_eap_ttls-include-dir="$(STAGING_DIR)/usr/include" \
++ --with-rlm_eap_ttls-lib-dir="$(STAGING_DIR)/usr/lib"
++ CONFIGURE_LIBS+= -lcrypto -lssl
++else
++ CONFIGURE_ARGS+= --without-rlm_eap_ttls
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-attr-rewrite),)
++ CONFIGURE_ARGS+= --with-rlm_attr-rewrite
++else
++ CONFIGURE_ARGS+= --without-rlm_attr-rewrite
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-radutmp),)
++ CONFIGURE_ARGS+= --with-rlm_radutmp
++else
++ CONFIGURE_ARGS+= --without-rlm_radutmp
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-logintime),)
++ CONFIGURE_ARGS+= --with-rlm_logintime
++else
++ CONFIGURE_ARGS+= --without-rlm_logintime
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-expiration),)
++ CONFIGURE_ARGS+= --with-rlm_expiration
++else
++ CONFIGURE_ARGS+= --without-rlm_expiration
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_freeradius2-mod-always),)
++ CONFIGURE_ARGS+= --with-rlm_always
++else
++ CONFIGURE_ARGS+= --without-rlm_always
++endif
++
++CONFIGURE_VARS+= \
++ LDFLAGS="$$$$LDFLAGS" \
++ LIBS="$(CONFIGURE_LIBS)" \
++ MYSQL_CONFIG="no" \
++ ac_cv_lib_readline=no \
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ R="$(PKG_INSTALL_DIR)" \
++ INSTALLSTRIP="" \
++ all certs install
++endef
++
++define Package/freeradius2-common/install
++ $(INSTALL_DIR) $(1)/etc/freeradius2
++ chmod 771 $(1)/etc/freeradius2
++ $(CP) $(PKG_INSTALL_DIR)/etc/freeradius2/dictionary $(1)/etc/freeradius2/ ; \
++ $(INSTALL_DIR) $(1)/usr/lib/freeradius2
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/freeradius2/libfreeradius-radius{,-*}.so $(1)/usr/lib/freeradius2
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/freeradius2/libfreeradius-eap{,-*}.so $(1)/usr/lib/freeradius2
++ $(INSTALL_DIR) $(1)/usr/share/freeradius2
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/freeradius/dictionary $(1)/usr/share/freeradius2/
++ $(SED) "s,^\(\$$$$INCLUDE\),#\1,g" $(1)/usr/share/freeradius2/dictionary
++ for f in $(PKG_DICTIONARIES); do \
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/freeradius/dictionary.$$$${f} $(1)/usr/share/freeradius2/ ; \
++ $(SED) "s,^#\(\$$$$INCLUDE dictionary\.$$$${f}\),\1,g" $(1)/usr/share/freeradius2/dictionary ; \
++ done
++endef
++
++define Package/freeradius2/install
++ $(INSTALL_DIR) $(1)/etc/freeradius2/modules
++ $(INSTALL_DIR) $(1)/etc/freeradius2/sites
++ for f in clients.conf radiusd.conf policy.conf; do \
++ $(CP) $(PKG_INSTALL_DIR)/etc/freeradius2/$$$${f} $(1)/etc/freeradius2/ ; \
++ done
++ $(CP) $(PKG_INSTALL_DIR)/etc/freeradius2/sites-available/default $(1)/etc/freeradius2/sites/default
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/radiusd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/radiusd.init $(1)/etc/init.d/radiusd
++endef
++
++define Package/freeradius2-democerts/install
++ $(INSTALL_DIR) $(1)/etc/freeradius2/certs
++ $(CP) \
++ $(PKG_BUILD_DIR)/raddb/certs/ca.pem \
++ $(PKG_BUILD_DIR)/raddb/certs/dh \
++ $(PKG_BUILD_DIR)/raddb/certs/random \
++ $(PKG_BUILD_DIR)/raddb/certs/server.pem \
++ $(1)/etc/freeradius2/certs/
++endef
++
++define Package/freeradius2-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ for f in radclient radeapclient radwho; do \
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$$$${f} $(1)/usr/bin/ ; \
++ done
++endef
++
++define BuildPlugin
++ define Package/$(1)/install
++ [ -z "$(2)" ] || $(INSTALL_DIR) $$(1)/usr/lib/freeradius2
++ for m in $(2); do \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/freeradius2/$$$$$$$${m}{,-*}.so $$(1)/usr/lib/freeradius2 ; \
++ done
++ [ -z "$(3)" ] || $(INSTALL_DIR) $$(1)/etc/freeradius2
++ [ -z "$(4)" ] || $(INSTALL_DIR) $$(1)/etc/freeradius2/$(4)
++ for f in $(3); do \
++ $(CP) $(PKG_INSTALL_DIR)/etc/freeradius2/$$$$$$$${f} $$(1)/etc/freeradius2/$$$$$$$${f} ; \
++ done
++ endef
++
++ $$(eval $$(call BuildPackage,$(1)))
++endef
++
++$(eval $(call BuildPackage,freeradius2))
++$(eval $(call BuildPackage,freeradius2-common))
++$(eval $(call BuildPackage,freeradius2-democerts))
++$(eval $(call BuildPlugin,freeradius2-mod-chap,rlm_chap,modules/chap,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-detail,rlm_detail,modules/detail,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-eap,rlm_eap,eap.conf))
++$(eval $(call BuildPlugin,freeradius2-mod-eap-gtc,rlm_eap_gtc,))
++$(eval $(call BuildPlugin,freeradius2-mod-eap-md5,rlm_eap_md5,))
++$(eval $(call BuildPlugin,freeradius2-mod-eap-mschapv2,rlm_eap_mschapv2,))
++$(eval $(call BuildPlugin,freeradius2-mod-eap-peap,rlm_eap_peap,))
++$(eval $(call BuildPlugin,freeradius2-mod-eap-tls,rlm_eap_tls,))
++$(eval $(call BuildPlugin,freeradius2-mod-eap-ttls,rlm_eap_ttls,))
++$(eval $(call BuildPlugin,freeradius2-mod-exec,rlm_exec,modules/exec modules/echo ,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-attr-rewrite,rlm_attr_rewrite,modules/attr_rewrite,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-files,rlm_files,acct_users preproxy_users users modules/files,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-passwd,rlm_passwd,modules/passwd,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-ldap,rlm_ldap,ldap.attrmap modules/ldap,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-mschap,rlm_mschap,modules/mschap,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-pap,rlm_pap,modules/pap,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-preprocess,rlm_preprocess,hints huntgroups modules/preprocess,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-realm,rlm_realm,proxy.conf modules/realm modules/inner-eap,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-sql,rlm_sql,sql.conf,))
++$(eval $(call BuildPlugin,freeradius2-mod-sql-mysql,rlm_sql_mysql,))
++$(eval $(call BuildPlugin,freeradius2-mod-sql-pgsql,rlm_sql_postgresql,))
++$(eval $(call BuildPlugin,freeradius2-mod-sql-sqlite,rlm_sql_sqlite,))
++$(eval $(call BuildPlugin,freeradius2-mod-sqlcounter,rlm_sqlcounter,))
++$(eval $(call BuildPlugin,freeradius2-mod-sqllog,rlm_sql_log,))
++$(eval $(call BuildPlugin,freeradius2-mod-radutmp,rlm_radutmp,modules/radutmp modules/sradutmp,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-logintime,rlm_logintime,modules/logintime,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-expr,rlm_expr,modules/expr,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-attr-filter,rlm_attr_filter,modules/attr_filter attrs attrs.access_reject attrs.accounting_response attrs.pre-proxy,modules,,))
++$(eval $(call BuildPlugin,freeradius2-mod-expiration,rlm_expiration,modules/expiration,modules,))
++$(eval $(call BuildPlugin,freeradius2-mod-always,rlm_always,modules/always,modules,))
++$(eval $(call BuildPackage,freeradius2-utils))
+diff --git a/feeds/packages/net/freeradius2/files/radiusd.init b/feeds/packages/net/freeradius2/files/radiusd.init
+new file mode 100644
+index 0000000..e529a88
+--- /dev/null
++++ b/feeds/packages/net/freeradius2/files/radiusd.init
+@@ -0,0 +1,27 @@
++#!/bin/sh /etc/rc.common
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++
++USE_PROCD=1
++
++START=50
++
++NAME=radiusd
++PROG=/usr/sbin/radiusd
++DEFAULT=/etc/default/radiusd
++
++start_service()
++{
++ [ -f $DEFAULT ] && . $DEFAULT
++ mkdir -p /var/log
++ mkdir -p /var/run
++ mkdir -p /var/db/radacct
++
++ procd_open_instance
++ procd_set_param command $PROG
++ [ -n "$IPADDR" ] && procd_append_param command -i $IPADDR
++ [ -n "$OPTIONS" ] && procd_append_param command $OPTIONS
++ procd_set_param respawn
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/freeradius2/patches/001-fix-makefile.patch b/feeds/packages/net/freeradius2/patches/001-fix-makefile.patch
+new file mode 100644
+index 0000000..676f99c
+--- /dev/null
++++ b/feeds/packages/net/freeradius2/patches/001-fix-makefile.patch
+@@ -0,0 +1,12 @@
++Index: freeradius-server-2.2.7/Make.inc.in
++===================================================================
++--- freeradius-server-2.2.7.orig/Make.inc.in
+++++ freeradius-server-2.2.7/Make.inc.in
++@@ -5,6 +5,7 @@
++ #
++
++ # Location of files.
+++SHELL = @SHELL@
++ prefix = @prefix@
++ exec_prefix = @exec_prefix@
++ sysconfdir = @sysconfdir@
+diff --git a/feeds/packages/net/freeradius2/patches/002-config.patch b/feeds/packages/net/freeradius2/patches/002-config.patch
+new file mode 100644
+index 0000000..c486389
+--- /dev/null
++++ b/feeds/packages/net/freeradius2/patches/002-config.patch
+@@ -0,0 +1,613 @@
++Index: freeradius-server-2.2.7/raddb/dictionary.in
++===================================================================
++--- freeradius-server-2.2.7.orig/raddb/dictionary.in
+++++ freeradius-server-2.2.7/raddb/dictionary.in
++@@ -11,7 +11,7 @@
++ #
++ # The filename given here should be an absolute path.
++ #
++-$INCLUDE @prefix@/share/freeradius/dictionary
+++$INCLUDE @prefix@/share/freeradius2/dictionary
++
++ #
++ # Place additional attributes or $INCLUDEs here. They will
++Index: freeradius-server-2.2.7/raddb/eap.conf
++===================================================================
++--- freeradius-server-2.2.7.orig/raddb/eap.conf
+++++ freeradius-server-2.2.7/raddb/eap.conf
++@@ -27,7 +27,7 @@
++ # then that EAP type takes precedence over the
++ # default type configured here.
++ #
++- default_eap_type = md5
+++ default_eap_type = peap
++
++ # A list is maintained to correlate EAP-Response
++ # packets with EAP-Request packets. After a
++@@ -72,8 +72,8 @@
++ # for wireless connections. It is insecure, and does
++ # not provide for dynamic WEP keys.
++ #
++- md5 {
++- }
+++# md5 {
+++# }
++
++ # Cisco LEAP
++ #
++@@ -87,8 +87,8 @@
++ # User-Password, or the NT-Password attributes.
++ # 'System' authentication is impossible with LEAP.
++ #
++- leap {
++- }
+++# leap {
+++# }
++
++ # Generic Token Card.
++ #
++@@ -101,7 +101,7 @@
++ # the users password will go over the wire in plain-text,
++ # for anyone to see.
++ #
++- gtc {
+++# gtc {
++ # The default challenge, which many clients
++ # ignore..
++ #challenge = "Password: "
++@@ -118,8 +118,8 @@
++ # configured for the request, and do the
++ # authentication itself.
++ #
++- auth_type = PAP
++- }
+++# auth_type = PAP
+++# }
++
++ ## EAP-TLS
++ #
++@@ -215,7 +215,7 @@
++ # In these cases, fragment size should be
++ # 1024 or less.
++ #
++- # fragment_size = 1024
+++ fragment_size = 1024
++
++ # include_length is a flag which is
++ # by default set to yes If set to
++@@ -225,7 +225,7 @@
++ # message is included ONLY in the
++ # First packet of a fragment series.
++ #
++- # include_length = yes
+++ include_length = yes
++
++ # Check the Certificate Revocation List
++ #
++@@ -297,7 +297,7 @@
++ # for the server to print out an error message,
++ # and refuse to start.
++ #
++- make_cert_command = "${certdir}/bootstrap"
+++ # make_cert_command = "${certdir}/bootstrap"
++
++ #
++ # Elliptical cryptography configuration
++@@ -332,7 +332,7 @@
++ # You probably also want "use_tunneled_reply = yes"
++ # when using fast session resumption.
++ #
++- cache {
+++ # cache {
++ #
++ # Enable it. The default is "no".
++ # Deleting the entire "cache" subsection
++@@ -348,14 +348,14 @@
++ # enable resumption for just one user
++ # by setting the above attribute to "yes".
++ #
++- enable = no
+++ # enable = no
++
++ #
++ # Lifetime of the cached entries, in hours.
++ # The sessions will be deleted after this
++ # time.
++ #
++- lifetime = 24 # hours
+++ # lifetime = 24 # hours
++
++ #
++ # The maximum number of entries in the
++@@ -364,8 +364,8 @@
++ # This could be set to the number of users
++ # who are logged in... which can be a LOT.
++ #
++- max_entries = 255
++- }
+++ # max_entries = 255
+++ # }
++
++ #
++ # As of version 2.1.10, client certificates can be
++@@ -503,7 +503,7 @@
++ #
++ # in the control items for a request.
++ #
++- ttls {
+++# ttls {
++ # The tunneled EAP session needs a default
++ # EAP type which is separate from the one for
++ # the non-tunneled EAP module. Inside of the
++@@ -511,7 +511,7 @@
++ # If the request does not contain an EAP
++ # conversation, then this configuration entry
++ # is ignored.
++- default_eap_type = md5
+++# default_eap_type = mschapv2
++
++ # The tunneled authentication request does
++ # not usually contain useful attributes
++@@ -527,7 +527,7 @@
++ # is copied to the tunneled request.
++ #
++ # allowed values: {no, yes}
++- copy_request_to_tunnel = no
+++# copy_request_to_tunnel = yes
++
++ # The reply attributes sent to the NAS are
++ # usually based on the name of the user
++@@ -540,7 +540,7 @@
++ # the tunneled request.
++ #
++ # allowed values: {no, yes}
++- use_tunneled_reply = no
+++# use_tunneled_reply = no
++
++ #
++ # The inner tunneled request can be sent
++@@ -552,13 +552,13 @@
++ # the virtual server that processed the
++ # outer requests.
++ #
++- virtual_server = "inner-tunnel"
+++# virtual_server = "inner-tunnel"
++
++ # This has the same meaning as the
++ # same field in the "tls" module, above.
++ # The default value here is "yes".
++ # include_length = yes
++- }
+++# }
++
++ ##################################################
++ #
++@@ -627,14 +627,14 @@
++
++ # the PEAP module also has these configuration
++ # items, which are the same as for TTLS.
++- copy_request_to_tunnel = no
++- use_tunneled_reply = no
+++ copy_request_to_tunnel = yes
+++ use_tunneled_reply = yes
++
++ # When the tunneled session is proxied, the
++ # home server may not understand EAP-MSCHAP-V2.
++ # Set this entry to "no" to proxy the tunneled
++ # EAP-MSCHAP-V2 as normal MSCHAPv2.
++- # proxy_tunneled_request_as_eap = yes
+++ proxy_tunneled_request_as_eap = no
++
++ #
++ # The inner tunneled request can be sent
++@@ -646,7 +646,8 @@
++ # the virtual server that processed the
++ # outer requests.
++ #
++- virtual_server = "inner-tunnel"
+++ # virtual_server = "inner-tunnel"
+++ EAP-TLS-Require-Client-Cert = no
++
++ # This option enables support for MS-SoH
++ # see doc/SoH.txt for more info.
++Index: freeradius-server-2.2.7/raddb/modules/counter
++===================================================================
++--- freeradius-server-2.2.7.orig/raddb/modules/counter
+++++ freeradius-server-2.2.7/raddb/modules/counter
++@@ -69,7 +69,7 @@
++ # 'check-name' attribute.
++ #
++ counter daily {
++- filename = ${db_dir}/db.daily
+++ filename = ${radacctdir}/db.daily
++ key = User-Name
++ count-attribute = Acct-Session-Time
++ reset = daily
++Index: freeradius-server-2.2.7/raddb/modules/pap
++===================================================================
++--- freeradius-server-2.2.7.orig/raddb/modules/pap
+++++ freeradius-server-2.2.7/raddb/modules/pap
++@@ -18,5 +18,5 @@
++ #
++ # http://www.openldap.org/faq/data/cache/347.html
++ pap {
++- auto_header = no
+++ auto_header = yes
++ }
++Index: freeradius-server-2.2.7/raddb/modules/radutmp
++===================================================================
++--- freeradius-server-2.2.7.orig/raddb/modules/radutmp
+++++ freeradius-server-2.2.7/raddb/modules/radutmp
++@@ -12,7 +12,7 @@ radutmp {
++ # Where the file is stored. It's not a log file,
++ # so it doesn't need rotating.
++ #
++- filename = ${logdir}/radutmp
+++ filename = ${radacctdir}/radutmp
++
++ # The field in the packet to key on for the
++ # 'user' name, If you have other fields which you want
++Index: freeradius-server-2.2.7/raddb/modules/sradutmp
++===================================================================
++--- freeradius-server-2.2.7.orig/raddb/modules/sradutmp
+++++ freeradius-server-2.2.7/raddb/modules/sradutmp
++@@ -10,7 +10,7 @@
++ # then name "sradutmp" to identify it later in the "accounting"
++ # section.
++ radutmp sradutmp {
++- filename = ${logdir}/sradutmp
+++ filename = ${radacctdir}/sradutmp
++ perm = 0644
++ callerid = "no"
++ }
++Index: freeradius-server-2.2.7/raddb/radiusd.conf.in
++===================================================================
++--- freeradius-server-2.2.7.orig/raddb/radiusd.conf.in
+++++ freeradius-server-2.2.7/raddb/radiusd.conf.in
++@@ -66,7 +66,7 @@ name = radiusd
++
++ # Location of config and logfiles.
++ confdir = ${raddbdir}
++-run_dir = ${localstatedir}/run/${name}
+++run_dir = ${localstatedir}/run
++
++ # Should likely be ${localstatedir}/lib/radiusd
++ db_dir = ${raddbdir}
++@@ -323,7 +323,7 @@ listen {
++ # If your system does not support this feature, you will
++ # get an error if you try to use it.
++ #
++-# interface = eth0
+++ interface = br-lan
++
++ # Per-socket lists of clients. This is a very useful feature.
++ #
++@@ -350,7 +350,7 @@ listen {
++ # ipv6addr = ::
++ port = 0
++ type = acct
++-# interface = eth0
+++ interface = br-lan
++ # clients = per_socket_clients
++ }
++
++@@ -576,8 +576,8 @@ security {
++ #
++ # allowed values: {no, yes}
++ #
++-proxy_requests = yes
++-$INCLUDE proxy.conf
+++proxy_requests = no
+++#$INCLUDE proxy.conf
++
++
++ # CLIENTS CONFIGURATION
++@@ -774,7 +774,7 @@ instantiate {
++ # The entire command line (and output) must fit into 253 bytes.
++ #
++ # e.g. Framed-Pool = `%{exec:/bin/echo foo}`
++- exec
+++# exec
++
++ #
++ # The expression module doesn't do authorization,
++@@ -791,15 +791,15 @@ instantiate {
++ # other xlat functions such as md5, sha1 and lc.
++ #
++ # We do not recommend removing it's listing here.
++- expr
+++# expr
++
++ #
++ # We add the counter module here so that it registers
++ # the check-name attribute before any module which sets
++ # it
++ # daily
++- expiration
++- logintime
+++# expiration
+++# logintime
++
++ # subsections here can be thought of as "virtual" modules.
++ #
++@@ -823,7 +823,7 @@ instantiate {
++ # to multiple times.
++ #
++ ######################################################################
++-$INCLUDE policy.conf
+++#$INCLUDE policy.conf
++
++ ######################################################################
++ #
++@@ -833,9 +833,9 @@ $INCLUDE policy.conf
++ # match the regular expression: /[a-zA-Z0-9_.]+/
++ #
++ # It allows you to define new virtual servers simply by placing
++-# a file into the raddb/sites-enabled/ directory.
+++# a file into the /etc/freeradius2/sites/ directory.
++ #
++-$INCLUDE sites-enabled/
+++$INCLUDE sites/
++
++ ######################################################################
++ #
++@@ -843,7 +843,7 @@ $INCLUDE sites-enabled/
++ # "authenticate {}", "accounting {}", have been moved to the
++ # the file:
++ #
++-# raddb/sites-available/default
+++# /etc/freeradius2/sites/default
++ #
++ # This is the "default" virtual server that has the same
++ # configuration as in version 1.0.x and 1.1.x. The default
++Index: freeradius-server-2.2.7/raddb/sites-available/default
++===================================================================
++--- freeradius-server-2.2.7.orig/raddb/sites-available/default
+++++ freeradius-server-2.2.7/raddb/sites-available/default
++@@ -85,7 +85,7 @@ authorize {
++ #
++ # It takes care of processing the 'raddb/hints' and the
++ # 'raddb/huntgroups' files.
++- preprocess
+++# preprocess
++
++ #
++ # If you want to have a log of authentication requests,
++@@ -96,7 +96,7 @@ authorize {
++ #
++ # The chap module will set 'Auth-Type := CHAP' if we are
++ # handling a CHAP request and Auth-Type has not already been set
++- chap
+++# chap
++
++ #
++ # If the users are logging in with an MS-CHAP-Challenge
++@@ -104,13 +104,13 @@ authorize {
++ # the MS-CHAP-Challenge attribute, and add 'Auth-Type := MS-CHAP'
++ # to the request, which will cause the server to then use
++ # the mschap module for authentication.
++- mschap
+++# mschap
++
++ #
++ # If you have a Cisco SIP server authenticating against
++ # FreeRADIUS, uncomment the following line, and the 'digest'
++ # line in the 'authenticate' section.
++- digest
+++# digest
++
++ #
++ # The WiMAX specification says that the Calling-Station-Id
++@@ -133,7 +133,7 @@ authorize {
++ # Otherwise, when the first style of realm doesn't match,
++ # the other styles won't be checked.
++ #
++- suffix
+++# suffix
++ # ntdomain
++
++ #
++@@ -197,8 +197,8 @@ authorize {
++ # Use the checkval module
++ # checkval
++
++- expiration
++- logintime
+++# expiration
+++# logintime
++
++ #
++ # If no other module has claimed responsibility for
++@@ -279,7 +279,7 @@ authenticate {
++ # If you have a Cisco SIP server authenticating against
++ # FreeRADIUS, uncomment the following line, and the 'digest'
++ # line in the 'authorize' section.
++- digest
+++# digest
++
++ #
++ # Pluggable Authentication Modules.
++@@ -296,7 +296,7 @@ authenticate {
++ # be used for authentication ONLY for compatibility with legacy
++ # FreeRADIUS configurations.
++ #
++- unix
+++# unix
++
++ # Uncomment it if you want to use ldap for authentication
++ #
++@@ -332,8 +332,8 @@ authenticate {
++ #
++ # Pre-accounting. Decide which accounting type to use.
++ #
++-preacct {
++- preprocess
+++#preacct {
+++# preprocess
++
++ #
++ # Session start times are *implied* in RADIUS.
++@@ -356,7 +356,7 @@ preacct {
++ #
++ # Ensure that we have a semi-unique identifier for every
++ # request, and many NAS boxes are broken.
++- acct_unique
+++# acct_unique
++
++ #
++ # Look for IPASS-style 'realm/', and if not found, look for
++@@ -366,13 +366,13 @@ preacct {
++ # Accounting requests are generally proxied to the same
++ # home server as authentication requests.
++ # IPASS
++- suffix
+++# suffix
++ # ntdomain
++
++ #
++ # Read the 'acct_users' file
++- files
++-}
+++# files
+++#}
++
++ #
++ # Accounting. Log the accounting data.
++@@ -382,7 +382,7 @@ accounting {
++ # Create a 'detail'ed log of the packets.
++ # Note that accounting requests which are proxied
++ # are also logged in the detail file.
++- detail
+++# detail
++ # daily
++
++ # Update the wtmp file
++@@ -434,7 +434,7 @@ accounting {
++ exec
++
++ # Filter attributes from the accounting response.
++- attr_filter.accounting_response
+++ #attr_filter.accounting_response
++
++ #
++ # See "Autz-Type Status-Server" for how this works.
++@@ -460,7 +460,7 @@ session {
++ # Post-Authentication
++ # Once we KNOW that the user has been authenticated, there are
++ # additional steps we can take.
++-post-auth {
+++#post-auth {
++ # Get an address from the IP Pool.
++ # main_pool
++
++@@ -490,7 +490,7 @@ post-auth {
++ # ldap
++
++ # For Exec-Program and Exec-Program-Wait
++- exec
+++# exec
++
++ #
++ # Calculate the various WiMAX keys. In order for this to work,
++@@ -574,18 +574,18 @@ post-auth {
++ # Add the ldap module name (or instance) if you have set
++ # 'edir_account_policy_check = yes' in the ldap module configuration
++ #
++- Post-Auth-Type REJECT {
++- # log failed authentications in SQL, too.
+++# Post-Auth-Type REJECT {
+++# # log failed authentications in SQL, too.
++ # sql
++
++ # Insert EAP-Failure message if the request was
++ # rejected by policy instead of because of an
++ # authentication failure
++- eap
+++# eap
++
++- attr_filter.access_reject
++- }
++-}
+++# attr_filter.access_reject
+++# }
+++#}
++
++ #
++ # When the server decides to proxy a request to a home server,
++@@ -595,7 +595,7 @@ post-auth {
++ #
++ # Only a few modules currently have this method.
++ #
++-pre-proxy {
+++#pre-proxy {
++ # attr_rewrite
++
++ # Uncomment the following line if you want to change attributes
++@@ -611,14 +611,14 @@ pre-proxy {
++ # server, un-comment the following line, and the
++ # 'detail pre_proxy_log' section, above.
++ # pre_proxy_log
++-}
+++#}
++
++ #
++ # When the server receives a reply to a request it proxied
++ # to a home server, the request may be massaged here, in the
++ # post-proxy stage.
++ #
++-post-proxy {
+++#post-proxy {
++
++ # If you want to have a log of replies from a home server,
++ # un-comment the following line, and the 'detail post_proxy_log'
++@@ -642,7 +642,7 @@ post-proxy {
++ # hidden inside of the EAP packet, and the end server will
++ # reject the EAP request.
++ #
++- eap
+++# eap
++
++ #
++ # If the server tries to proxy a request and fails, then the
++@@ -664,5 +664,5 @@ post-proxy {
++ # Post-Proxy-Type Fail {
++ # detail
++ # }
++-}
+++#}
++
++Index: freeradius-server-2.2.7/raddb/users
++===================================================================
++--- freeradius-server-2.2.7.orig/raddb/users
+++++ freeradius-server-2.2.7/raddb/users
++@@ -169,22 +169,22 @@
++ # by the terminal server in which case there may not be a "P" suffix.
++ # The terminal server sends "Framed-Protocol = PPP" for auto PPP.
++ #
++-DEFAULT Framed-Protocol == PPP
++- Framed-Protocol = PPP,
++- Framed-Compression = Van-Jacobson-TCP-IP
+++#DEFAULT Framed-Protocol == PPP
+++# Framed-Protocol = PPP,
+++# Framed-Compression = Van-Jacobson-TCP-IP
++
++ #
++ # Default for CSLIP: dynamic IP address, SLIP mode, VJ-compression.
++ #
++-DEFAULT Hint == "CSLIP"
++- Framed-Protocol = SLIP,
++- Framed-Compression = Van-Jacobson-TCP-IP
+++#DEFAULT Hint == "CSLIP"
+++# Framed-Protocol = SLIP,
+++# Framed-Compression = Van-Jacobson-TCP-IP
++
++ #
++ # Default for SLIP: dynamic IP address, SLIP mode.
++ #
++-DEFAULT Hint == "SLIP"
++- Framed-Protocol = SLIP
+++#DEFAULT Hint == "SLIP"
+++# Framed-Protocol = SLIP
++
++ #
++ # Last default: rlogin to our main server.
+diff --git a/feeds/packages/net/freeradius2/patches/004-ldap_configure.patch b/feeds/packages/net/freeradius2/patches/004-ldap_configure.patch
+new file mode 100644
+index 0000000..05b6789
+--- /dev/null
++++ b/feeds/packages/net/freeradius2/patches/004-ldap_configure.patch
+@@ -0,0 +1,4257 @@
++Index: freeradius-server-2.2.7/src/modules/rlm_ldap/configure
++===================================================================
++--- freeradius-server-2.2.7.orig/src/modules/rlm_ldap/configure
+++++ freeradius-server-2.2.7/src/modules/rlm_ldap/configure
++@@ -1,10 +1,10 @@
++ #! /bin/sh
++ # From configure.in Revision.
++ # Guess values for system-dependent variables and create Makefiles.
++-# Generated by GNU Autoconf 2.61.
+++# Generated by GNU Autoconf 2.63.
++ #
++ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
++-# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+++# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
++ # This configure script is free software; the Free Software Foundation
++ # gives unlimited permission to copy, distribute and modify it.
++ ## --------------------- ##
++@@ -16,7 +16,7 @@ DUALCASE=1; export DUALCASE # for MKS sh
++ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
++ emulate sh
++ NULLCMD=:
++- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+++ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
++ # is contrary to our usage. Disable this feature.
++ alias -g '${1+"$@"}'='"$@"'
++ setopt NO_GLOB_SUBST
++@@ -38,17 +38,45 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTE
++ as_cr_digits='0123456789'
++ as_cr_alnum=$as_cr_Letters$as_cr_digits
++
++-# The user is always right.
++-if test "${PATH_SEPARATOR+set}" != set; then
++- echo "#! /bin/sh" >conf$$.sh
++- echo "exit 0" >>conf$$.sh
++- chmod +x conf$$.sh
++- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
++- PATH_SEPARATOR=';'
+++as_nl='
+++'
+++export as_nl
+++# Printing a long string crashes Solaris 7 /usr/bin/printf.
+++as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+++if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+++ as_echo='printf %s\n'
+++ as_echo_n='printf %s'
+++else
+++ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+++ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+++ as_echo_n='/usr/ucb/echo -n'
++ else
++- PATH_SEPARATOR=:
+++ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+++ as_echo_n_body='eval
+++ arg=$1;
+++ case $arg in
+++ *"$as_nl"*)
+++ expr "X$arg" : "X\\(.*\\)$as_nl";
+++ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+++ esac;
+++ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+++ '
+++ export as_echo_n_body
+++ as_echo_n='sh -c $as_echo_n_body as_echo'
++ fi
++- rm -f conf$$.sh
+++ export as_echo_body
+++ as_echo='sh -c $as_echo_body as_echo'
+++fi
+++
+++# The user is always right.
+++if test "${PATH_SEPARATOR+set}" != set; then
+++ PATH_SEPARATOR=:
+++ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+++ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+++ PATH_SEPARATOR=';'
+++ }
++ fi
++
++ # Support unset when possible.
++@@ -64,8 +92,6 @@ fi
++ # there to prevent editors from complaining about space-tab.
++ # (If _AS_PATH_WALK were called with IFS unset, it would disable word
++ # splitting by setting IFS to empty value.)
++-as_nl='
++-'
++ IFS=" "" $as_nl"
++
++ # Find who we are. Look in the path if we contain no directory separator.
++@@ -88,7 +114,7 @@ if test "x$as_myself" = x; then
++ as_myself=$0
++ fi
++ if test ! -f "$as_myself"; then
++- echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+++ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
++ { (exit 1); exit 1; }
++ fi
++
++@@ -101,17 +127,10 @@ PS2='> '
++ PS4='+ '
++
++ # NLS nuisances.
++-for as_var in \
++- LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
++- LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
++- LC_TELEPHONE LC_TIME
++-do
++- if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
++- eval $as_var=C; export $as_var
++- else
++- ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
++- fi
++-done
+++LC_ALL=C
+++export LC_ALL
+++LANGUAGE=C
+++export LANGUAGE
++
++ # Required to use basename.
++ if expr a : '\(a\)' >/dev/null 2>&1 &&
++@@ -133,7 +152,7 @@ as_me=`$as_basename -- "$0" ||
++ $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
++ X"$0" : 'X\(//\)$' \| \
++ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
++-echo X/"$0" |
+++$as_echo X/"$0" |
++ sed '/^.*\/\([^/][^/]*\)\/*$/{
++ s//\1/
++ q
++@@ -159,7 +178,7 @@ else
++ as_have_required=no
++ fi
++
++- if test $as_have_required = yes && (eval ":
+++ if test $as_have_required = yes && (eval ":
++ (as_func_return () {
++ (exit \$1)
++ }
++@@ -241,7 +260,7 @@ IFS=$as_save_IFS
++ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
++ emulate sh
++ NULLCMD=:
++- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+++ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
++ # is contrary to our usage. Disable this feature.
++ alias -g '${1+"$@"}'='"$@"'
++ setopt NO_GLOB_SUBST
++@@ -262,7 +281,7 @@ _ASEOF
++ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
++ emulate sh
++ NULLCMD=:
++- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+++ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
++ # is contrary to our usage. Disable this feature.
++ alias -g '${1+"$@"}'='"$@"'
++ setopt NO_GLOB_SUBST
++@@ -342,10 +361,10 @@ fi
++
++ if test "x$CONFIG_SHELL" != x; then
++ for as_var in BASH_ENV ENV
++- do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
++- done
++- export CONFIG_SHELL
++- exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+++ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+++ done
+++ export CONFIG_SHELL
+++ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
++ fi
++
++
++@@ -414,9 +433,10 @@ fi
++
++ test \$exitcode = 0") || {
++ echo No shell found that supports shell functions.
++- echo Please tell autoconf@gnu.org about your system,
++- echo including any error possibly output before this
++- echo message
+++ echo Please tell bug-autoconf@gnu.org about your system,
+++ echo including any error possibly output before this message.
+++ echo This can help us improve future autoconf versions.
+++ echo Configuration will now proceed without shell functions.
++ }
++
++
++@@ -452,7 +472,7 @@ test \$exitcode = 0") || {
++ s/-\n.*//
++ ' >$as_me.lineno &&
++ chmod +x "$as_me.lineno" ||
++- { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+++ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
++ { (exit 1); exit 1; }; }
++
++ # Don't try to exec as it changes $[0], causing all sort of problems
++@@ -480,7 +500,6 @@ case `echo -n x` in
++ *)
++ ECHO_N='-n';;
++ esac
++-
++ if expr a : '\(a\)' >/dev/null 2>&1 &&
++ test "X`expr 00001 : '.*\(...\)'`" = X001; then
++ as_expr=expr
++@@ -493,19 +512,22 @@ if test -d conf$$.dir; then
++ rm -f conf$$.dir/conf$$.file
++ else
++ rm -f conf$$.dir
++- mkdir conf$$.dir
+++ mkdir conf$$.dir 2>/dev/null
++ fi
++-echo >conf$$.file
++-if ln -s conf$$.file conf$$ 2>/dev/null; then
++- as_ln_s='ln -s'
++- # ... but there are two gotchas:
++- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
++- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
++- # In both cases, we have to default to `cp -p'.
++- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+++if (echo >conf$$.file) 2>/dev/null; then
+++ if ln -s conf$$.file conf$$ 2>/dev/null; then
+++ as_ln_s='ln -s'
+++ # ... but there are two gotchas:
+++ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+++ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+++ # In both cases, we have to default to `cp -p'.
+++ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+++ as_ln_s='cp -p'
+++ elif ln conf$$.file conf$$ 2>/dev/null; then
+++ as_ln_s=ln
+++ else
++ as_ln_s='cp -p'
++-elif ln conf$$.file conf$$ 2>/dev/null; then
++- as_ln_s=ln
+++ fi
++ else
++ as_ln_s='cp -p'
++ fi
++@@ -530,10 +552,10 @@ else
++ as_test_x='
++ eval sh -c '\''
++ if test -d "$1"; then
++- test -d "$1/.";
+++ test -d "$1/.";
++ else
++ case $1 in
++- -*)set "./$1";;
+++ -*)set "./$1";;
++ esac;
++ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
++ ???[sx]*):;;*)false;;esac;fi
++@@ -578,57 +600,65 @@ PACKAGE_STRING=
++ PACKAGE_BUGREPORT=
++
++ ac_unique_file="rlm_ldap.c"
++-ac_subst_vars='SHELL
++-PATH_SEPARATOR
++-PACKAGE_NAME
++-PACKAGE_TARNAME
++-PACKAGE_VERSION
++-PACKAGE_STRING
++-PACKAGE_BUGREPORT
++-exec_prefix
++-prefix
++-program_transform_name
++-bindir
++-sbindir
++-libexecdir
++-datarootdir
++-datadir
++-sysconfdir
++-sharedstatedir
++-localstatedir
++-includedir
++-oldincludedir
++-docdir
++-infodir
++-htmldir
++-dvidir
++-pdfdir
++-psdir
++-libdir
++-localedir
++-mandir
++-DEFS
++-ECHO_C
++-ECHO_N
++-ECHO_T
++-LIBS
++-build_alias
++-host_alias
++-target_alias
++-CC
++-CFLAGS
++-LDFLAGS
++-CPPFLAGS
++-ac_ct_CC
++-EXEEXT
++-OBJEXT
++-edir
++-ldap_ldflags
++-ldap_cflags
++-targetname
+++ac_subst_vars='LTLIBOBJS
++ LIBOBJS
++-LTLIBOBJS'
+++targetname
+++ldap_cflags
+++ldap_ldflags
+++edir
+++OBJEXT
+++EXEEXT
+++ac_ct_CC
+++CPPFLAGS
+++LDFLAGS
+++CFLAGS
+++CC
+++target_alias
+++host_alias
+++build_alias
+++LIBS
+++ECHO_T
+++ECHO_N
+++ECHO_C
+++DEFS
+++mandir
+++localedir
+++libdir
+++psdir
+++pdfdir
+++dvidir
+++htmldir
+++infodir
+++docdir
+++oldincludedir
+++includedir
+++localstatedir
+++sharedstatedir
+++sysconfdir
+++datadir
+++datarootdir
+++libexecdir
+++sbindir
+++bindir
+++program_transform_name
+++prefix
+++exec_prefix
+++PACKAGE_BUGREPORT
+++PACKAGE_STRING
+++PACKAGE_VERSION
+++PACKAGE_TARNAME
+++PACKAGE_NAME
+++PATH_SEPARATOR
+++SHELL'
++ ac_subst_files=''
+++ac_user_opts='
+++enable_option_checking
+++with_rlm_ldap_lib_dir
+++with_rlm_ldap_include_dir
+++enable_shared
+++with_threads
+++with_edir
+++'
++ ac_precious_vars='build_alias
++ host_alias
++ target_alias
++@@ -642,6 +672,8 @@ CPPFLAGS'
++ # Initialize some variables set by options.
++ ac_init_help=
++ ac_init_version=false
+++ac_unrecognized_opts=
+++ac_unrecognized_sep=
++ # The variables have the same names as the options, with
++ # dashes changed to underlines.
++ cache_file=/dev/null
++@@ -740,13 +772,21 @@ do
++ datarootdir=$ac_optarg ;;
++
++ -disable-* | --disable-*)
++- ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+++ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
++ # Reject names that are not valid shell variable names.
++- expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
++- { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+++ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+++ { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
++ { (exit 1); exit 1; }; }
++- ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
++- eval enable_$ac_feature=no ;;
+++ ac_useropt_orig=$ac_useropt
+++ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+++ case $ac_user_opts in
+++ *"
+++"enable_$ac_useropt"
+++"*) ;;
+++ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+++ ac_unrecognized_sep=', ';;
+++ esac
+++ eval enable_$ac_useropt=no ;;
++
++ -docdir | --docdir | --docdi | --doc | --do)
++ ac_prev=docdir ;;
++@@ -759,13 +799,21 @@ do
++ dvidir=$ac_optarg ;;
++
++ -enable-* | --enable-*)
++- ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+++ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
++ # Reject names that are not valid shell variable names.
++- expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
++- { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+++ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+++ { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
++ { (exit 1); exit 1; }; }
++- ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
++- eval enable_$ac_feature=\$ac_optarg ;;
+++ ac_useropt_orig=$ac_useropt
+++ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+++ case $ac_user_opts in
+++ *"
+++"enable_$ac_useropt"
+++"*) ;;
+++ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+++ ac_unrecognized_sep=', ';;
+++ esac
+++ eval enable_$ac_useropt=\$ac_optarg ;;
++
++ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
++ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
++@@ -956,22 +1004,38 @@ do
++ ac_init_version=: ;;
++
++ -with-* | --with-*)
++- ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+++ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
++ # Reject names that are not valid shell variable names.
++- expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
++- { echo "$as_me: error: invalid package name: $ac_package" >&2
+++ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+++ { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
++ { (exit 1); exit 1; }; }
++- ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
++- eval with_$ac_package=\$ac_optarg ;;
+++ ac_useropt_orig=$ac_useropt
+++ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+++ case $ac_user_opts in
+++ *"
+++"with_$ac_useropt"
+++"*) ;;
+++ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+++ ac_unrecognized_sep=', ';;
+++ esac
+++ eval with_$ac_useropt=\$ac_optarg ;;
++
++ -without-* | --without-*)
++- ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+++ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
++ # Reject names that are not valid shell variable names.
++- expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
++- { echo "$as_me: error: invalid package name: $ac_package" >&2
+++ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+++ { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
++ { (exit 1); exit 1; }; }
++- ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
++- eval with_$ac_package=no ;;
+++ ac_useropt_orig=$ac_useropt
+++ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+++ case $ac_user_opts in
+++ *"
+++"with_$ac_useropt"
+++"*) ;;
+++ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+++ ac_unrecognized_sep=', ';;
+++ esac
+++ eval with_$ac_useropt=no ;;
++
++ --x)
++ # Obsolete; use --with-x.
++@@ -991,7 +1055,7 @@ do
++ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
++ x_libraries=$ac_optarg ;;
++
++- -*) { echo "$as_me: error: unrecognized option: $ac_option
+++ -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
++ Try \`$0 --help' for more information." >&2
++ { (exit 1); exit 1; }; }
++ ;;
++@@ -1000,16 +1064,16 @@ Try \`$0 --help' for more information."
++ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
++ # Reject names that are not valid shell variable names.
++ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
++- { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+++ { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
++ { (exit 1); exit 1; }; }
++ eval $ac_envvar=\$ac_optarg
++ export $ac_envvar ;;
++
++ *)
++ # FIXME: should be removed in autoconf 3.0.
++- echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+++ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
++ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
++- echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+++ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
++ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
++ ;;
++
++@@ -1018,22 +1082,38 @@ done
++
++ if test -n "$ac_prev"; then
++ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
++- { echo "$as_me: error: missing argument to $ac_option" >&2
+++ { $as_echo "$as_me: error: missing argument to $ac_option" >&2
++ { (exit 1); exit 1; }; }
++ fi
++
++-# Be sure to have absolute directory names.
+++if test -n "$ac_unrecognized_opts"; then
+++ case $enable_option_checking in
+++ no) ;;
+++ fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
+++ { (exit 1); exit 1; }; } ;;
+++ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+++ esac
+++fi
+++
+++# Check all directory arguments for consistency.
++ for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
++ datadir sysconfdir sharedstatedir localstatedir includedir \
++ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
++ libdir localedir mandir
++ do
++ eval ac_val=\$$ac_var
+++ # Remove trailing slashes.
+++ case $ac_val in
+++ */ )
+++ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+++ eval $ac_var=\$ac_val;;
+++ esac
+++ # Be sure to have absolute directory names.
++ case $ac_val in
++ [\\/$]* | ?:[\\/]* ) continue;;
++ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
++ esac
++- { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+++ { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
++ { (exit 1); exit 1; }; }
++ done
++
++@@ -1048,7 +1128,7 @@ target=$target_alias
++ if test "x$host_alias" != x; then
++ if test "x$build_alias" = x; then
++ cross_compiling=maybe
++- echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+++ $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
++ If a cross compiler is detected then cross compile mode will be used." >&2
++ elif test "x$build_alias" != "x$host_alias"; then
++ cross_compiling=yes
++@@ -1064,10 +1144,10 @@ test "$silent" = yes && exec 6>/dev/null
++ ac_pwd=`pwd` && test -n "$ac_pwd" &&
++ ac_ls_di=`ls -di .` &&
++ ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
++- { echo "$as_me: error: Working directory cannot be determined" >&2
+++ { $as_echo "$as_me: error: working directory cannot be determined" >&2
++ { (exit 1); exit 1; }; }
++ test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
++- { echo "$as_me: error: pwd does not report name of working directory" >&2
+++ { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
++ { (exit 1); exit 1; }; }
++
++
++@@ -1075,12 +1155,12 @@ test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
++ if test -z "$srcdir"; then
++ ac_srcdir_defaulted=yes
++ # Try the directory containing this script, then the parent directory.
++- ac_confdir=`$as_dirname -- "$0" ||
++-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
++- X"$0" : 'X\(//\)[^/]' \| \
++- X"$0" : 'X\(//\)$' \| \
++- X"$0" : 'X\(/\)' \| . 2>/dev/null ||
++-echo X"$0" |
+++ ac_confdir=`$as_dirname -- "$as_myself" ||
+++$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+++ X"$as_myself" : 'X\(//\)[^/]' \| \
+++ X"$as_myself" : 'X\(//\)$' \| \
+++ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+++$as_echo X"$as_myself" |
++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++ s//\1/
++ q
++@@ -1107,12 +1187,12 @@ else
++ fi
++ if test ! -r "$srcdir/$ac_unique_file"; then
++ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
++- { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+++ { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
++ { (exit 1); exit 1; }; }
++ fi
++ ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
++ ac_abs_confdir=`(
++- cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+++ cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
++ { (exit 1); exit 1; }; }
++ pwd)`
++ # When building in place, set srcdir=.
++@@ -1161,9 +1241,9 @@ Configuration:
++
++ Installation directories:
++ --prefix=PREFIX install architecture-independent files in PREFIX
++- [$ac_default_prefix]
+++ [$ac_default_prefix]
++ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
++- [PREFIX]
+++ [PREFIX]
++
++ By default, \`make install' will install all the files in
++ \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
++@@ -1173,25 +1253,25 @@ for instance \`--prefix=\$HOME'.
++ For better control, use the options below.
++
++ Fine tuning of the installation directories:
++- --bindir=DIR user executables [EPREFIX/bin]
++- --sbindir=DIR system admin executables [EPREFIX/sbin]
++- --libexecdir=DIR program executables [EPREFIX/libexec]
++- --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
++- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
++- --localstatedir=DIR modifiable single-machine data [PREFIX/var]
++- --libdir=DIR object code libraries [EPREFIX/lib]
++- --includedir=DIR C header files [PREFIX/include]
++- --oldincludedir=DIR C header files for non-gcc [/usr/include]
++- --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
++- --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
++- --infodir=DIR info documentation [DATAROOTDIR/info]
++- --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
++- --mandir=DIR man documentation [DATAROOTDIR/man]
++- --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
++- --htmldir=DIR html documentation [DOCDIR]
++- --dvidir=DIR dvi documentation [DOCDIR]
++- --pdfdir=DIR pdf documentation [DOCDIR]
++- --psdir=DIR ps documentation [DOCDIR]
+++ --bindir=DIR user executables [EPREFIX/bin]
+++ --sbindir=DIR system admin executables [EPREFIX/sbin]
+++ --libexecdir=DIR program executables [EPREFIX/libexec]
+++ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+++ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+++ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+++ --libdir=DIR object code libraries [EPREFIX/lib]
+++ --includedir=DIR C header files [PREFIX/include]
+++ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+++ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+++ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+++ --infodir=DIR info documentation [DATAROOTDIR/info]
+++ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+++ --mandir=DIR man documentation [DATAROOTDIR/man]
+++ --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE]
+++ --htmldir=DIR html documentation [DOCDIR]
+++ --dvidir=DIR dvi documentation [DOCDIR]
+++ --pdfdir=DIR pdf documentation [DOCDIR]
+++ --psdir=DIR ps documentation [DOCDIR]
++ _ACEOF
++
++ cat <<\_ACEOF
++@@ -1203,6 +1283,7 @@ if test -n "$ac_init_help"; then
++ cat <<\_ACEOF
++
++ Optional Features:
+++ --disable-option-checking ignore unrecognized --enable/--with options
++ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
++ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
++ --enable-shared[=PKGS] build shared libraries [default=yes]
++@@ -1234,15 +1315,17 @@ fi
++ if test "$ac_init_help" = "recursive"; then
++ # If there are subdirs, report their specific --help.
++ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
++- test -d "$ac_dir" || continue
+++ test -d "$ac_dir" ||
+++ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+++ continue
++ ac_builddir=.
++
++ case "$ac_dir" in
++ .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
++ *)
++- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+++ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
++ # A ".." for each directory in $ac_dir_suffix.
++- ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+++ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
++ case $ac_top_builddir_sub in
++ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
++ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
++@@ -1278,7 +1361,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_
++ echo &&
++ $SHELL "$ac_srcdir/configure" --help=recursive
++ else
++- echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+++ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
++ fi || ac_status=$?
++ cd "$ac_pwd" || { ac_status=$?; break; }
++ done
++@@ -1288,10 +1371,10 @@ test -n "$ac_init_help" && exit $ac_stat
++ if $ac_init_version; then
++ cat <<\_ACEOF
++ configure
++-generated by GNU Autoconf 2.61
+++generated by GNU Autoconf 2.63
++
++ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
++-2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+++2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
++ This configure script is free software; the Free Software Foundation
++ gives unlimited permission to copy, distribute and modify it.
++ _ACEOF
++@@ -1302,7 +1385,7 @@ This file contains any messages produced
++ running configure, to aid debugging if configure makes a mistake.
++
++ It was created by $as_me, which was
++-generated by GNU Autoconf 2.61. Invocation command line was
+++generated by GNU Autoconf 2.63. Invocation command line was
++
++ $ $0 $@
++
++@@ -1338,7 +1421,7 @@ for as_dir in $PATH
++ do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++- echo "PATH: $as_dir"
+++ $as_echo "PATH: $as_dir"
++ done
++ IFS=$as_save_IFS
++
++@@ -1373,7 +1456,7 @@ do
++ | -silent | --silent | --silen | --sile | --sil)
++ continue ;;
++ *\'*)
++- ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+++ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
++ esac
++ case $ac_pass in
++ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
++@@ -1425,11 +1508,12 @@ _ASBOX
++ case $ac_val in #(
++ *${as_nl}*)
++ case $ac_var in #(
++- *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
++-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+++ *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+++$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
++ esac
++ case $ac_var in #(
++ _ | IFS | as_nl) ;; #(
+++ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
++ *) $as_unset $ac_var ;;
++ esac ;;
++ esac
++@@ -1459,9 +1543,9 @@ _ASBOX
++ do
++ eval ac_val=\$$ac_var
++ case $ac_val in
++- *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+++ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
++ esac
++- echo "$ac_var='\''$ac_val'\''"
+++ $as_echo "$ac_var='\''$ac_val'\''"
++ done | sort
++ echo
++
++@@ -1476,9 +1560,9 @@ _ASBOX
++ do
++ eval ac_val=\$$ac_var
++ case $ac_val in
++- *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+++ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
++ esac
++- echo "$ac_var='\''$ac_val'\''"
+++ $as_echo "$ac_var='\''$ac_val'\''"
++ done | sort
++ echo
++ fi
++@@ -1494,8 +1578,8 @@ _ASBOX
++ echo
++ fi
++ test "$ac_signal" != 0 &&
++- echo "$as_me: caught signal $ac_signal"
++- echo "$as_me: exit $exit_status"
+++ $as_echo "$as_me: caught signal $ac_signal"
+++ $as_echo "$as_me: exit $exit_status"
++ } >&5
++ rm -f core *.core core.conftest.* &&
++ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
++@@ -1537,21 +1621,24 @@ _ACEOF
++
++
++ # Let the site file select an alternate cache file if it wants to.
++-# Prefer explicitly selected file to automatically selected ones.
+++# Prefer an explicitly selected file to automatically selected ones.
+++ac_site_file1=NONE
+++ac_site_file2=NONE
++ if test -n "$CONFIG_SITE"; then
++- set x "$CONFIG_SITE"
+++ ac_site_file1=$CONFIG_SITE
++ elif test "x$prefix" != xNONE; then
++- set x "$prefix/share/config.site" "$prefix/etc/config.site"
+++ ac_site_file1=$prefix/share/config.site
+++ ac_site_file2=$prefix/etc/config.site
++ else
++- set x "$ac_default_prefix/share/config.site" \
++- "$ac_default_prefix/etc/config.site"
+++ ac_site_file1=$ac_default_prefix/share/config.site
+++ ac_site_file2=$ac_default_prefix/etc/config.site
++ fi
++-shift
++-for ac_site_file
+++for ac_site_file in "$ac_site_file1" "$ac_site_file2"
++ do
+++ test "x$ac_site_file" = xNONE && continue
++ if test -r "$ac_site_file"; then
++- { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
++-echo "$as_me: loading site script $ac_site_file" >&6;}
+++ { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+++$as_echo "$as_me: loading site script $ac_site_file" >&6;}
++ sed 's/^/| /' "$ac_site_file" >&5
++ . "$ac_site_file"
++ fi
++@@ -1561,16 +1648,16 @@ if test -r "$cache_file"; then
++ # Some versions of bash will fail to source /dev/null (special
++ # files actually), so we avoid doing that.
++ if test -f "$cache_file"; then
++- { echo "$as_me:$LINENO: loading cache $cache_file" >&5
++-echo "$as_me: loading cache $cache_file" >&6;}
+++ { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
+++$as_echo "$as_me: loading cache $cache_file" >&6;}
++ case $cache_file in
++ [\\/]* | ?:[\\/]* ) . "$cache_file";;
++ *) . "./$cache_file";;
++ esac
++ fi
++ else
++- { echo "$as_me:$LINENO: creating cache $cache_file" >&5
++-echo "$as_me: creating cache $cache_file" >&6;}
+++ { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
+++$as_echo "$as_me: creating cache $cache_file" >&6;}
++ >$cache_file
++ fi
++
++@@ -1584,29 +1671,38 @@ for ac_var in $ac_precious_vars; do
++ eval ac_new_val=\$ac_env_${ac_var}_value
++ case $ac_old_set,$ac_new_set in
++ set,)
++- { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
++-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+++ { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+++$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
++ ac_cache_corrupted=: ;;
++ ,set)
++- { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
++-echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+++ { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+++$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
++ ac_cache_corrupted=: ;;
++ ,);;
++ *)
++ if test "x$ac_old_val" != "x$ac_new_val"; then
++- { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
++-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
++- { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
++-echo "$as_me: former value: $ac_old_val" >&2;}
++- { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
++-echo "$as_me: current value: $ac_new_val" >&2;}
++- ac_cache_corrupted=:
+++ # differences in whitespace do not lead to failure.
+++ ac_old_val_w=`echo x $ac_old_val`
+++ ac_new_val_w=`echo x $ac_new_val`
+++ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+++ { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+++$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+++ ac_cache_corrupted=:
+++ else
+++ { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+++$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+++ eval $ac_var=\$ac_old_val
+++ fi
+++ { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5
+++$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+++ { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5
+++$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
++ fi;;
++ esac
++ # Pass precious variables to config.status.
++ if test "$ac_new_set" = set; then
++ case $ac_new_val in
++- *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+++ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
++ *) ac_arg=$ac_var=$ac_new_val ;;
++ esac
++ case " $ac_configure_args " in
++@@ -1616,10 +1712,12 @@ echo "$as_me: current value: $ac_new_v
++ fi
++ done
++ if $ac_cache_corrupted; then
++- { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
++-echo "$as_me: error: changes in the environment can compromise the build" >&2;}
++- { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
++-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+++ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+++ { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+++$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+++ { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+++$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
++ { (exit 1); exit 1; }; }
++ fi
++
++@@ -1662,10 +1760,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
++ if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
++ set dummy ${ac_tool_prefix}gcc; ac_word=$2
++-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
++-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+++$as_echo_n "checking for $ac_word... " >&6; }
++ if test "${ac_cv_prog_CC+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ if test -n "$CC"; then
++ ac_cv_prog_CC="$CC" # Let the user override the test.
++@@ -1678,7 +1776,7 @@ do
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_CC="${ac_tool_prefix}gcc"
++- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+++ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++ done
++@@ -1689,11 +1787,11 @@ fi
++ fi
++ CC=$ac_cv_prog_CC
++ if test -n "$CC"; then
++- { echo "$as_me:$LINENO: result: $CC" >&5
++-echo "${ECHO_T}$CC" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: $CC" >&5
+++$as_echo "$CC" >&6; }
++ else
++- { echo "$as_me:$LINENO: result: no" >&5
++-echo "${ECHO_T}no" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: no" >&5
+++$as_echo "no" >&6; }
++ fi
++
++
++@@ -1702,10 +1800,10 @@ if test -z "$ac_cv_prog_CC"; then
++ ac_ct_CC=$CC
++ # Extract the first word of "gcc", so it can be a program name with args.
++ set dummy gcc; ac_word=$2
++-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
++-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+++$as_echo_n "checking for $ac_word... " >&6; }
++ if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ if test -n "$ac_ct_CC"; then
++ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
++@@ -1718,7 +1816,7 @@ do
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_CC="gcc"
++- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+++ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++ done
++@@ -1729,11 +1827,11 @@ fi
++ fi
++ ac_ct_CC=$ac_cv_prog_ac_ct_CC
++ if test -n "$ac_ct_CC"; then
++- { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
++-echo "${ECHO_T}$ac_ct_CC" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+++$as_echo "$ac_ct_CC" >&6; }
++ else
++- { echo "$as_me:$LINENO: result: no" >&5
++-echo "${ECHO_T}no" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: no" >&5
+++$as_echo "no" >&6; }
++ fi
++
++ if test "x$ac_ct_CC" = x; then
++@@ -1741,12 +1839,8 @@ fi
++ else
++ case $cross_compiling:$ac_tool_warned in
++ yes:)
++-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
++-whose name does not start with the host triplet. If you think this
++-configuration is useful to you, please write to autoconf@gnu.org." >&5
++-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
++-whose name does not start with the host triplet. If you think this
++-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+++{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ ac_tool_warned=yes ;;
++ esac
++ CC=$ac_ct_CC
++@@ -1759,10 +1853,10 @@ if test -z "$CC"; then
++ if test -n "$ac_tool_prefix"; then
++ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
++ set dummy ${ac_tool_prefix}cc; ac_word=$2
++-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
++-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+++$as_echo_n "checking for $ac_word... " >&6; }
++ if test "${ac_cv_prog_CC+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ if test -n "$CC"; then
++ ac_cv_prog_CC="$CC" # Let the user override the test.
++@@ -1775,7 +1869,7 @@ do
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_CC="${ac_tool_prefix}cc"
++- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+++ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++ done
++@@ -1786,11 +1880,11 @@ fi
++ fi
++ CC=$ac_cv_prog_CC
++ if test -n "$CC"; then
++- { echo "$as_me:$LINENO: result: $CC" >&5
++-echo "${ECHO_T}$CC" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: $CC" >&5
+++$as_echo "$CC" >&6; }
++ else
++- { echo "$as_me:$LINENO: result: no" >&5
++-echo "${ECHO_T}no" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: no" >&5
+++$as_echo "no" >&6; }
++ fi
++
++
++@@ -1799,10 +1893,10 @@ fi
++ if test -z "$CC"; then
++ # Extract the first word of "cc", so it can be a program name with args.
++ set dummy cc; ac_word=$2
++-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
++-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+++$as_echo_n "checking for $ac_word... " >&6; }
++ if test "${ac_cv_prog_CC+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ if test -n "$CC"; then
++ ac_cv_prog_CC="$CC" # Let the user override the test.
++@@ -1820,7 +1914,7 @@ do
++ continue
++ fi
++ ac_cv_prog_CC="cc"
++- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+++ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++ done
++@@ -1843,11 +1937,11 @@ fi
++ fi
++ CC=$ac_cv_prog_CC
++ if test -n "$CC"; then
++- { echo "$as_me:$LINENO: result: $CC" >&5
++-echo "${ECHO_T}$CC" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: $CC" >&5
+++$as_echo "$CC" >&6; }
++ else
++- { echo "$as_me:$LINENO: result: no" >&5
++-echo "${ECHO_T}no" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: no" >&5
+++$as_echo "no" >&6; }
++ fi
++
++
++@@ -1858,10 +1952,10 @@ if test -z "$CC"; then
++ do
++ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
++ set dummy $ac_tool_prefix$ac_prog; ac_word=$2
++-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
++-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+++$as_echo_n "checking for $ac_word... " >&6; }
++ if test "${ac_cv_prog_CC+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ if test -n "$CC"; then
++ ac_cv_prog_CC="$CC" # Let the user override the test.
++@@ -1874,7 +1968,7 @@ do
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
++- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+++ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++ done
++@@ -1885,11 +1979,11 @@ fi
++ fi
++ CC=$ac_cv_prog_CC
++ if test -n "$CC"; then
++- { echo "$as_me:$LINENO: result: $CC" >&5
++-echo "${ECHO_T}$CC" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: $CC" >&5
+++$as_echo "$CC" >&6; }
++ else
++- { echo "$as_me:$LINENO: result: no" >&5
++-echo "${ECHO_T}no" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: no" >&5
+++$as_echo "no" >&6; }
++ fi
++
++
++@@ -1902,10 +1996,10 @@ if test -z "$CC"; then
++ do
++ # Extract the first word of "$ac_prog", so it can be a program name with args.
++ set dummy $ac_prog; ac_word=$2
++-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
++-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+++$as_echo_n "checking for $ac_word... " >&6; }
++ if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ if test -n "$ac_ct_CC"; then
++ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
++@@ -1918,7 +2012,7 @@ do
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++ ac_cv_prog_ac_ct_CC="$ac_prog"
++- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+++ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++ done
++@@ -1929,11 +2023,11 @@ fi
++ fi
++ ac_ct_CC=$ac_cv_prog_ac_ct_CC
++ if test -n "$ac_ct_CC"; then
++- { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
++-echo "${ECHO_T}$ac_ct_CC" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+++$as_echo "$ac_ct_CC" >&6; }
++ else
++- { echo "$as_me:$LINENO: result: no" >&5
++-echo "${ECHO_T}no" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: no" >&5
+++$as_echo "no" >&6; }
++ fi
++
++
++@@ -1945,12 +2039,8 @@ done
++ else
++ case $cross_compiling:$ac_tool_warned in
++ yes:)
++-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
++-whose name does not start with the host triplet. If you think this
++-configuration is useful to you, please write to autoconf@gnu.org." >&5
++-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
++-whose name does not start with the host triplet. If you think this
++-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+++{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
++ ac_tool_warned=yes ;;
++ esac
++ CC=$ac_ct_CC
++@@ -1960,44 +2050,50 @@ fi
++ fi
++
++
++-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+++test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+++{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
++ See \`config.log' for more details." >&5
++-echo "$as_me: error: no acceptable C compiler found in \$PATH
+++$as_echo "$as_me: error: no acceptable C compiler found in \$PATH
++ See \`config.log' for more details." >&2;}
++- { (exit 1); exit 1; }; }
+++ { (exit 1); exit 1; }; }; }
++
++ # Provide some information about the compiler.
++-echo "$as_me:$LINENO: checking for C compiler version" >&5
++-ac_compiler=`set X $ac_compile; echo $2`
+++$as_echo "$as_me:$LINENO: checking for C compiler version" >&5
+++set X $ac_compile
+++ac_compiler=$2
++ { (ac_try="$ac_compiler --version >&5"
++ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_compiler --version >&5") 2>&5
++ ac_status=$?
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }
++ { (ac_try="$ac_compiler -v >&5"
++ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_compiler -v >&5") 2>&5
++ ac_status=$?
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }
++ { (ac_try="$ac_compiler -V >&5"
++ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_compiler -V >&5") 2>&5
++ ac_status=$?
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }
++
++ cat >conftest.$ac_ext <<_ACEOF
++@@ -2016,27 +2112,22 @@ main ()
++ }
++ _ACEOF
++ ac_clean_files_save=$ac_clean_files
++-ac_clean_files="$ac_clean_files a.out a.exe b.out"
+++ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
++ # Try to create an executable without -o first, disregard a.out.
++ # It will help us diagnose broken compilers, and finding out an intuition
++ # of exeext.
++-{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
++-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
++-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
++-#
++-# List of possible output files, starting from the most likely.
++-# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
++-# only as a last resort. b.out is created by i960 compilers.
++-ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
++-#
++-# The IRIX 6 linker writes into existing files which may not be
++-# executable, retaining their permissions. Remove them first so a
++-# subsequent execution test works.
+++{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+++$as_echo_n "checking for C compiler default output file name... " >&6; }
+++ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+++
+++# The possible output files:
+++ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+++
++ ac_rmfiles=
++ for ac_file in $ac_files
++ do
++ case $ac_file in
++- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
++ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
++ esac
++ done
++@@ -2047,10 +2138,11 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link_default") 2>&5
++ ac_status=$?
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; then
++ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
++ # So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
++@@ -2061,7 +2153,7 @@ for ac_file in $ac_files ''
++ do
++ test -f "$ac_file" || continue
++ case $ac_file in
++- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
++ ;;
++ [ab].out )
++ # We found the default executable, but exeext='' is most
++@@ -2088,25 +2180,27 @@ else
++ ac_file=''
++ fi
++
++-{ echo "$as_me:$LINENO: result: $ac_file" >&5
++-echo "${ECHO_T}$ac_file" >&6; }
+++{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5
+++$as_echo "$ac_file" >&6; }
++ if test -z "$ac_file"; then
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+++{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+++{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables
++ See \`config.log' for more details." >&5
++-echo "$as_me: error: C compiler cannot create executables
+++$as_echo "$as_me: error: C compiler cannot create executables
++ See \`config.log' for more details." >&2;}
++- { (exit 77); exit 77; }; }
+++ { (exit 77); exit 77; }; }; }
++ fi
++
++ ac_exeext=$ac_cv_exeext
++
++ # Check that the compiler produces executables we can run. If not, either
++ # the compiler is broken, or we cross compile.
++-{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
++-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+++$as_echo_n "checking whether the C compiler works... " >&6; }
++ # FIXME: These cross compiler hacks should be removed for Autoconf 3.0
++ # If not cross compiling, check that we can run a simple program.
++ if test "$cross_compiling" != yes; then
++@@ -2115,49 +2209,53 @@ if test "$cross_compiling" != yes; then
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_try") 2>&5
++ ac_status=$?
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ cross_compiling=no
++ else
++ if test "$cross_compiling" = maybe; then
++ cross_compiling=yes
++ else
++- { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+++ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+++{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
++ If you meant to cross compile, use \`--host'.
++ See \`config.log' for more details." >&5
++-echo "$as_me: error: cannot run C compiled programs.
+++$as_echo "$as_me: error: cannot run C compiled programs.
++ If you meant to cross compile, use \`--host'.
++ See \`config.log' for more details." >&2;}
++- { (exit 1); exit 1; }; }
+++ { (exit 1); exit 1; }; }; }
++ fi
++ fi
++ fi
++-{ echo "$as_me:$LINENO: result: yes" >&5
++-echo "${ECHO_T}yes" >&6; }
+++{ $as_echo "$as_me:$LINENO: result: yes" >&5
+++$as_echo "yes" >&6; }
++
++-rm -f a.out a.exe conftest$ac_cv_exeext b.out
+++rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
++ ac_clean_files=$ac_clean_files_save
++ # Check that the compiler produces executables we can run. If not, either
++ # the compiler is broken, or we cross compile.
++-{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
++-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
++-{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
++-echo "${ECHO_T}$cross_compiling" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+++$as_echo_n "checking whether we are cross compiling... " >&6; }
+++{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5
+++$as_echo "$cross_compiling" >&6; }
++
++-{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
++-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5
+++$as_echo_n "checking for suffix of executables... " >&6; }
++ if { (ac_try="$ac_link"
++ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>&5
++ ac_status=$?
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; then
++ # If both `conftest.exe' and `conftest' are `present' (well, observable)
++ # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
++@@ -2166,31 +2264,33 @@ eval "echo \"\$as_me:$LINENO: $ac_try_ec
++ for ac_file in conftest.exe conftest conftest.*; do
++ test -f "$ac_file" || continue
++ case $ac_file in
++- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
++ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
++ break;;
++ * ) break;;
++ esac
++ done
++ else
++- { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+++ { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+++{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
++ See \`config.log' for more details." >&5
++-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+++$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
++ See \`config.log' for more details." >&2;}
++- { (exit 1); exit 1; }; }
+++ { (exit 1); exit 1; }; }; }
++ fi
++
++ rm -f conftest$ac_cv_exeext
++-{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
++-echo "${ECHO_T}$ac_cv_exeext" >&6; }
+++{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+++$as_echo "$ac_cv_exeext" >&6; }
++
++ rm -f conftest.$ac_ext
++ EXEEXT=$ac_cv_exeext
++ ac_exeext=$EXEEXT
++-{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
++-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5
+++$as_echo_n "checking for suffix of object files... " >&6; }
++ if test "${ac_cv_objext+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++@@ -2213,40 +2313,43 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_compile") 2>&5
++ ac_status=$?
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; then
++ for ac_file in conftest.o conftest.obj conftest.*; do
++ test -f "$ac_file" || continue;
++ case $ac_file in
++- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+++ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
++ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
++ break;;
++ esac
++ done
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+++{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+++$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+++{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
++ See \`config.log' for more details." >&5
++-echo "$as_me: error: cannot compute suffix of object files: cannot compile
+++$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
++ See \`config.log' for more details." >&2;}
++- { (exit 1); exit 1; }; }
+++ { (exit 1); exit 1; }; }; }
++ fi
++
++ rm -f conftest.$ac_cv_objext conftest.$ac_ext
++ fi
++-{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
++-echo "${ECHO_T}$ac_cv_objext" >&6; }
+++{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+++$as_echo "$ac_cv_objext" >&6; }
++ OBJEXT=$ac_cv_objext
++ ac_objext=$OBJEXT
++-{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
++-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+++$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
++ if test "${ac_cv_c_compiler_gnu+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++@@ -2272,20 +2375,21 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_compile") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++ } && test -s conftest.$ac_objext; then
++ ac_compiler_gnu=yes
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_compiler_gnu=no
++@@ -2295,15 +2399,19 @@ rm -f core conftest.err conftest.$ac_obj
++ ac_cv_c_compiler_gnu=$ac_compiler_gnu
++
++ fi
++-{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
++-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
++-GCC=`test $ac_compiler_gnu = yes && echo yes`
+++{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+++$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+++if test $ac_compiler_gnu = yes; then
+++ GCC=yes
+++else
+++ GCC=
+++fi
++ ac_test_CFLAGS=${CFLAGS+set}
++ ac_save_CFLAGS=$CFLAGS
++-{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
++-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+++$as_echo_n "checking whether $CC accepts -g... " >&6; }
++ if test "${ac_cv_prog_cc_g+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ ac_save_c_werror_flag=$ac_c_werror_flag
++ ac_c_werror_flag=yes
++@@ -2330,20 +2438,21 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_compile") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++ } && test -s conftest.$ac_objext; then
++ ac_cv_prog_cc_g=yes
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++ CFLAGS=""
++@@ -2368,20 +2477,21 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_compile") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++ } && test -s conftest.$ac_objext; then
++ :
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_c_werror_flag=$ac_save_c_werror_flag
++@@ -2407,20 +2517,21 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_compile") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++ } && test -s conftest.$ac_objext; then
++ ac_cv_prog_cc_g=yes
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++
++@@ -2435,8 +2546,8 @@ fi
++ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++ ac_c_werror_flag=$ac_save_c_werror_flag
++ fi
++-{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
++-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+++{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+++$as_echo "$ac_cv_prog_cc_g" >&6; }
++ if test "$ac_test_CFLAGS" = set; then
++ CFLAGS=$ac_save_CFLAGS
++ elif test $ac_cv_prog_cc_g = yes; then
++@@ -2452,10 +2563,10 @@ else
++ CFLAGS=
++ fi
++ fi
++-{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
++-echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+++{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+++$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
++ if test "${ac_cv_prog_cc_c89+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ ac_cv_prog_cc_c89=no
++ ac_save_CC=$CC
++@@ -2526,20 +2637,21 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_compile") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++ } && test -s conftest.$ac_objext; then
++ ac_cv_prog_cc_c89=$ac_arg
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++
++@@ -2555,15 +2667,15 @@ fi
++ # AC_CACHE_VAL
++ case "x$ac_cv_prog_cc_c89" in
++ x)
++- { echo "$as_me:$LINENO: result: none needed" >&5
++-echo "${ECHO_T}none needed" >&6; } ;;
+++ { $as_echo "$as_me:$LINENO: result: none needed" >&5
+++$as_echo "none needed" >&6; } ;;
++ xno)
++- { echo "$as_me:$LINENO: result: unsupported" >&5
++-echo "${ECHO_T}unsupported" >&6; } ;;
+++ { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+++$as_echo "unsupported" >&6; } ;;
++ *)
++ CC="$CC $ac_cv_prog_cc_c89"
++- { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
++-echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+++ { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+++$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
++ esac
++
++
++@@ -2581,8 +2693,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
++ if test "${with_rlm_ldap_lib_dir+set}" = set; then
++ withval=$with_rlm_ldap_lib_dir; case "$withval" in
++ no)
++- { { echo "$as_me:$LINENO: error: Need rlm-ldap-lib-dir" >&5
++-echo "$as_me: error: Need rlm-ldap-lib-dir" >&2;}
+++ { { $as_echo "$as_me:$LINENO: error: Need rlm-ldap-lib-dir" >&5
+++$as_echo "$as_me: error: Need rlm-ldap-lib-dir" >&2;}
++ { (exit 1); exit 1; }; }
++ ;;
++ yes)
++@@ -2601,8 +2713,8 @@ fi
++ if test "${with_rlm_ldap_include_dir+set}" = set; then
++ withval=$with_rlm_ldap_include_dir; case "$withval" in
++ no)
++- { { echo "$as_me:$LINENO: error: Need rlm-ldap-include-dir" >&5
++-echo "$as_me: error: Need rlm-ldap-include-dir" >&2;}
+++ { { $as_echo "$as_me:$LINENO: error: Need rlm-ldap-include-dir" >&5
+++$as_echo "$as_me: error: Need rlm-ldap-include-dir" >&2;}
++ { (exit 1); exit 1; }; }
++ ;;
++ yes)
++@@ -2641,8 +2753,8 @@ fi
++
++
++ if test "x$enable_shared" = "xno"; then
++- { echo "$as_me:$LINENO: WARNING: Static linking with libldap will probably result in unresolved symbols." >&5
++-echo "$as_me: WARNING: Static linking with libldap will probably result in unresolved symbols." >&2;}
+++ { $as_echo "$as_me:$LINENO: WARNING: Static linking with libldap will probably result in unresolved symbols." >&5
+++$as_echo "$as_me: WARNING: Static linking with libldap will probably result in unresolved symbols." >&2;}
++ fi
++
++ rlm_ldap_with_threads=yes
++@@ -2661,10 +2773,10 @@ fi
++
++
++ if test "x$rlm_ldap_with_threads" = "xyes"; then
++- { echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5
++-echo $ECHO_N "checking for pthread_create in -lpthread... $ECHO_C" >&6; }
+++ { $as_echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5
+++$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
++ if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ ac_check_lib_save_LIBS=$LIBS
++ LIBS="-lpthread $LIBS"
++@@ -2696,39 +2808,43 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
++ ac_cv_lib_pthread_pthread_create=yes
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_cv_lib_pthread_pthread_create=no
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ LIBS=$ac_check_lib_save_LIBS
++ fi
++-{ echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5
++-echo "${ECHO_T}$ac_cv_lib_pthread_pthread_create" >&6; }
++-if test $ac_cv_lib_pthread_pthread_create = yes; then
+++{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5
+++$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
+++if test "x$ac_cv_lib_pthread_pthread_create" = x""yes; then
++ LIBS="-lpthread $LIBS"
++ else
++- { echo "$as_me:$LINENO: checking for pthread_create in -lc_r" >&5
++-echo $ECHO_N "checking for pthread_create in -lc_r... $ECHO_C" >&6; }
+++ { $as_echo "$as_me:$LINENO: checking for pthread_create in -lc_r" >&5
+++$as_echo_n "checking for pthread_create in -lc_r... " >&6; }
++ if test "${ac_cv_lib_c_r_pthread_create+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ ac_check_lib_save_LIBS=$LIBS
++ LIBS="-lc_r $LIBS"
++@@ -2761,33 +2877,37 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
++ ac_cv_lib_c_r_pthread_create=yes
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_cv_lib_c_r_pthread_create=no
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ LIBS=$ac_check_lib_save_LIBS
++ fi
++-{ echo "$as_me:$LINENO: result: $ac_cv_lib_c_r_pthread_create" >&5
++-echo "${ECHO_T}$ac_cv_lib_c_r_pthread_create" >&6; }
++-if test $ac_cv_lib_c_r_pthread_create = yes; then
+++{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_c_r_pthread_create" >&5
+++$as_echo "$ac_cv_lib_c_r_pthread_create" >&6; }
+++if test "x$ac_cv_lib_c_r_pthread_create" = x""yes; then
++ LIBS="-lc_r $LIBS"
++ else
++ rlm_ldap_with_threads="no"
++@@ -2799,14 +2919,12 @@ fi
++
++ fi
++
++- smart_try_dir=$rlm_ldap_lib_dir
++- if test "x$rlm_ldap_with_threads" = "xyes"; then
++
++
++-sm_lib_safe=`echo "ldap_r" | sed 'y%./+-%__p_%'`
++-sm_func_safe=`echo "ldap_init" | sed 'y%./+-%__p_%'`
++-{ echo "$as_me:$LINENO: checking for ldap_init in -lldap_r" >&5
++-echo $ECHO_N "checking for ldap_init in -lldap_r... $ECHO_C" >&6; }
+++sm_lib_safe=`echo "sasl" | sed 'y%./+-%__p_%'`
+++sm_func_safe=`echo "sasl_encode" | sed 'y%./+-%__p_%'`
+++{ $as_echo "$as_me:$LINENO: checking for sasl_encode in -lsasl" >&5
+++$as_echo_n "checking for sasl_encode in -lsasl... " >&6; }
++
++ old_LIBS="$LIBS"
++ smart_lib=
++@@ -2814,18 +2932,18 @@ smart_lib_dir=
++
++ if test "x$smart_try_dir" != "x"; then
++ for try in $smart_try_dir; do
++- LIBS="-L$try -lldap_r $old_LIBS"
+++ LIBS="-L$try -lsasl $old_LIBS"
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++ _ACEOF
++ cat confdefs.h >>conftest.$ac_ext
++ cat >>conftest.$ac_ext <<_ACEOF
++ /* end confdefs.h. */
++-extern char ldap_init();
+++extern char sasl_encode();
++ int
++ main ()
++ {
++- ldap_init()
+++ sasl_encode()
++ ;
++ return 0;
++ }
++@@ -2836,26 +2954,30 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
++- smart_lib="-L$try -lldap_r"
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-L$try -lsasl"
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ if test "x$smart_lib" != "x"; then
++@@ -2866,18 +2988,18 @@ rm -f core conftest.err conftest.$ac_obj
++ fi
++
++ if test "x$smart_lib" = "x"; then
++- LIBS="-lldap_r $old_LIBS"
+++ LIBS="-lsasl $old_LIBS"
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++ _ACEOF
++ cat confdefs.h >>conftest.$ac_ext
++ cat >>conftest.$ac_ext <<_ACEOF
++ /* end confdefs.h. */
++-extern char ldap_init();
+++extern char sasl_encode();
++ int
++ main ()
++ {
++- ldap_init()
+++ sasl_encode()
++ ;
++ return 0;
++ }
++@@ -2888,26 +3010,30 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
++- smart_lib="-lldap_r"
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-lsasl"
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ LIBS="$old_LIBS"
++@@ -2918,7 +3044,7 @@ if test "x$smart_lib" = "x"; then
++
++ if test "x$LOCATE" != "x"; then
++ DIRS=
++- file=libldap_r${libltdl_cv_shlibext}
+++ file=libsasl${libltdl_cv_shlibext}
++
++ for x in `${LOCATE} $file 2>/dev/null`; do
++ base=`echo $x | sed "s%/${file}%%"`
++@@ -2945,7 +3071,7 @@ eval "smart_lib_dir=\"\$smart_lib_dir $D
++
++ if test "x$LOCATE" != "x"; then
++ DIRS=
++- file=libldap_r.a
+++ file=libsasl.a
++
++ for x in `${LOCATE} $file 2>/dev/null`; do
++ base=`echo $x | sed "s%/${file}%%"`
++@@ -2970,18 +3096,18 @@ eval "smart_lib_dir=\"\$smart_lib_dir $D
++
++
++ for try in $smart_lib_dir /usr/local/lib /opt/lib; do
++- LIBS="-L$try -lldap_r $old_LIBS"
+++ LIBS="-L$try -lsasl $old_LIBS"
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++ _ACEOF
++ cat confdefs.h >>conftest.$ac_ext
++ cat >>conftest.$ac_ext <<_ACEOF
++ /* end confdefs.h. */
++-extern char ldap_init();
+++extern char sasl_encode();
++ int
++ main ()
++ {
++- ldap_init()
+++ sasl_encode()
++ ;
++ return 0;
++ }
++@@ -2992,26 +3118,30 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
++- smart_lib="-L$try -lldap_r"
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-L$try -lsasl"
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ if test "x$smart_lib" != "x"; then
++@@ -3022,26 +3152,22 @@ rm -f core conftest.err conftest.$ac_obj
++ fi
++
++ if test "x$smart_lib" != "x"; then
++- { echo "$as_me:$LINENO: result: yes" >&5
++-echo "${ECHO_T}yes" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: yes" >&5
+++$as_echo "yes" >&6; }
++ eval "ac_cv_lib_${sm_lib_safe}_${sm_func_safe}=yes"
++ LIBS="$smart_lib $old_LIBS"
++ SMART_LIBS="$smart_lib $SMART_LIBS"
++ else
++- { echo "$as_me:$LINENO: result: no" >&5
++-echo "${ECHO_T}no" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: no" >&5
+++$as_echo "no" >&6; }
++ fi
++
++- if test "x$ac_cv_lib_ldap_r_ldap_init" != "xyes"; then
++- fail="$fail libldap_r"
++- fi
++- else
++
++
++-sm_lib_safe=`echo "ldap" | sed 'y%./+-%__p_%'`
++-sm_func_safe=`echo "ldap_init" | sed 'y%./+-%__p_%'`
++-{ echo "$as_me:$LINENO: checking for ldap_init in -lldap" >&5
++-echo $ECHO_N "checking for ldap_init in -lldap... $ECHO_C" >&6; }
+++sm_lib_safe=`echo "lber" | sed 'y%./+-%__p_%'`
+++sm_func_safe=`echo "ber_init" | sed 'y%./+-%__p_%'`
+++{ $as_echo "$as_me:$LINENO: checking for ber_init in -llber" >&5
+++$as_echo_n "checking for ber_init in -llber... " >&6; }
++
++ old_LIBS="$LIBS"
++ smart_lib=
++@@ -3049,18 +3175,18 @@ smart_lib_dir=
++
++ if test "x$smart_try_dir" != "x"; then
++ for try in $smart_try_dir; do
++- LIBS="-L$try -lldap $old_LIBS"
+++ LIBS="-L$try -llber $old_LIBS"
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++ _ACEOF
++ cat confdefs.h >>conftest.$ac_ext
++ cat >>conftest.$ac_ext <<_ACEOF
++ /* end confdefs.h. */
++-extern char ldap_init();
+++extern char ber_init();
++ int
++ main ()
++ {
++- ldap_init()
+++ ber_init()
++ ;
++ return 0;
++ }
++@@ -3071,26 +3197,30 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
++- smart_lib="-L$try -lldap"
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-L$try -llber"
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ if test "x$smart_lib" != "x"; then
++@@ -3101,18 +3231,18 @@ rm -f core conftest.err conftest.$ac_obj
++ fi
++
++ if test "x$smart_lib" = "x"; then
++- LIBS="-lldap $old_LIBS"
+++ LIBS="-llber $old_LIBS"
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++ _ACEOF
++ cat confdefs.h >>conftest.$ac_ext
++ cat >>conftest.$ac_ext <<_ACEOF
++ /* end confdefs.h. */
++-extern char ldap_init();
+++extern char ber_init();
++ int
++ main ()
++ {
++- ldap_init()
+++ ber_init()
++ ;
++ return 0;
++ }
++@@ -3123,26 +3253,30 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
++- smart_lib="-lldap"
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-llber"
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ LIBS="$old_LIBS"
++@@ -3153,7 +3287,7 @@ if test "x$smart_lib" = "x"; then
++
++ if test "x$LOCATE" != "x"; then
++ DIRS=
++- file=libldap${libltdl_cv_shlibext}
+++ file=liblber${libltdl_cv_shlibext}
++
++ for x in `${LOCATE} $file 2>/dev/null`; do
++ base=`echo $x | sed "s%/${file}%%"`
++@@ -3180,7 +3314,7 @@ eval "smart_lib_dir=\"\$smart_lib_dir $D
++
++ if test "x$LOCATE" != "x"; then
++ DIRS=
++- file=libldap.a
+++ file=liblber.a
++
++ for x in `${LOCATE} $file 2>/dev/null`; do
++ base=`echo $x | sed "s%/${file}%%"`
++@@ -3205,18 +3339,18 @@ eval "smart_lib_dir=\"\$smart_lib_dir $D
++
++
++ for try in $smart_lib_dir /usr/local/lib /opt/lib; do
++- LIBS="-L$try -lldap $old_LIBS"
+++ LIBS="-L$try -llber $old_LIBS"
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++ _ACEOF
++ cat confdefs.h >>conftest.$ac_ext
++ cat >>conftest.$ac_ext <<_ACEOF
++ /* end confdefs.h. */
++-extern char ldap_init();
+++extern char ber_init();
++ int
++ main ()
++ {
++- ldap_init()
+++ ber_init()
++ ;
++ return 0;
++ }
++@@ -3227,26 +3361,30 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
++- smart_lib="-L$try -lldap"
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-L$try -llber"
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ if test "x$smart_lib" != "x"; then
++@@ -3257,136 +3395,145 @@ rm -f core conftest.err conftest.$ac_obj
++ fi
++
++ if test "x$smart_lib" != "x"; then
++- { echo "$as_me:$LINENO: result: yes" >&5
++-echo "${ECHO_T}yes" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: yes" >&5
+++$as_echo "yes" >&6; }
++ eval "ac_cv_lib_${sm_lib_safe}_${sm_func_safe}=yes"
++ LIBS="$smart_lib $old_LIBS"
++ SMART_LIBS="$smart_lib $SMART_LIBS"
++ else
++- { echo "$as_me:$LINENO: result: no" >&5
++-echo "${ECHO_T}no" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: no" >&5
+++$as_echo "no" >&6; }
++ fi
++
++- if test "x$ac_cv_lib_ldap_ldap_init" != "xyes"; then
++- fail="$fail libldap"
++- fi
++- fi
++-
++
++- smart_try_dir=$rlm_ldap_include_dir
+++ smart_try_dir=$rlm_ldap_lib_dir
+++ if test "x$rlm_ldap_with_threads" = "xyes"; then
++
++
++-ac_safe=`echo "ldap.h" | sed 'y%./+-%__pm%'`
++-{ echo "$as_me:$LINENO: checking for ldap.h" >&5
++-echo $ECHO_N "checking for ldap.h... $ECHO_C" >&6; }
+++sm_lib_safe=`echo "ldap_r" | sed 'y%./+-%__p_%'`
+++sm_func_safe=`echo "ldap_init" | sed 'y%./+-%__p_%'`
+++{ $as_echo "$as_me:$LINENO: checking for ldap_init in -lldap_r" >&5
+++$as_echo_n "checking for ldap_init in -lldap_r... " >&6; }
++
++-old_CFLAGS="$CFLAGS"
++-smart_include=
++-smart_include_dir=
+++old_LIBS="$LIBS"
+++smart_lib=
+++smart_lib_dir=
++
++ if test "x$smart_try_dir" != "x"; then
++ for try in $smart_try_dir; do
++- CFLAGS="$old_CFLAGS -I$try"
+++ LIBS="-L$try -lldap_r $old_LIBS"
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++ _ACEOF
++ cat confdefs.h >>conftest.$ac_ext
++ cat >>conftest.$ac_ext <<_ACEOF
++ /* end confdefs.h. */
++-
++- #include <ldap.h>
+++extern char ldap_init();
++ int
++ main ()
++ {
++- int a = 1;
+++ ldap_init()
++ ;
++ return 0;
++ }
++ _ACEOF
++-rm -f conftest.$ac_objext
++-if { (ac_try="$ac_compile"
+++rm -f conftest.$ac_objext conftest$ac_exeext
+++if { (ac_try="$ac_link"
++ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
++- (eval "$ac_compile") 2>conftest.er1
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
+++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest.$ac_objext; then
++- smart_include="-I$try"
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-L$try -lldap_r"
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++- smart_include=
+++
++ fi
++
++-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++- if test "x$smart_include" != "x"; then
+++rm -rf conftest.dSYM
+++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+++ conftest$ac_exeext conftest.$ac_ext
+++ if test "x$smart_lib" != "x"; then
++ break;
++ fi
++ done
++- CFLAGS="$old_CFLAGS"
+++ LIBS="$old_LIBS"
++ fi
++
++-if test "x$smart_include" = "x"; then
+++if test "x$smart_lib" = "x"; then
+++ LIBS="-lldap_r $old_LIBS"
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++ _ACEOF
++ cat confdefs.h >>conftest.$ac_ext
++ cat >>conftest.$ac_ext <<_ACEOF
++ /* end confdefs.h. */
++-
++- #include <ldap.h>
+++extern char ldap_init();
++ int
++ main ()
++ {
++- int a = 1;
+++ ldap_init()
++ ;
++ return 0;
++ }
++ _ACEOF
++-rm -f conftest.$ac_objext
++-if { (ac_try="$ac_compile"
+++rm -f conftest.$ac_objext conftest$ac_exeext
+++if { (ac_try="$ac_link"
++ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
++- (eval "$ac_compile") 2>conftest.er1
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
+++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest.$ac_objext; then
++- smart_include=" "
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-lldap_r"
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++- smart_include=
+++
++ fi
++
++-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+++rm -rf conftest.dSYM
+++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+++ conftest$ac_exeext conftest.$ac_ext
+++ LIBS="$old_LIBS"
++ fi
++
++-if test "x$smart_include" = "x"; then
+++if test "x$smart_lib" = "x"; then
++
++
++ if test "x$LOCATE" != "x"; then
++ DIRS=
++- file=ldap.h
+++ file=libldap_r${libltdl_cv_shlibext}
++
++ for x in `${LOCATE} $file 2>/dev/null`; do
++ base=`echo $x | sed "s%/${file}%%"`
++@@ -3400,19 +3547,505 @@ if test "x$LOCATE" != "x"; then
++ continue
++ fi
++
++- already=`echo \$smart_include_dir ${DIRS} | ${GREP} ${dir}`
+++ already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}`
++ if test "x$already" = "x"; then
++ DIRS="$DIRS $dir"
++ fi
++ done
++ fi
++
++-eval "smart_include_dir=\"\$smart_include_dir $DIRS\""
+++eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\""
++
++
++- for try in $smart_include_dir /usr/local/include /opt/include; do
++- CFLAGS="$old_CFLAGS -I$try"
++- cat >conftest.$ac_ext <<_ACEOF
+++
+++if test "x$LOCATE" != "x"; then
+++ DIRS=
+++ file=libldap_r.a
+++
+++ for x in `${LOCATE} $file 2>/dev/null`; do
+++ base=`echo $x | sed "s%/${file}%%"`
+++ if test "x$x" = "x$base"; then
+++ continue;
+++ fi
+++
+++ dir=`${DIRNAME} $x 2>/dev/null`
+++ exclude=`echo ${dir} | ${GREP} /home`
+++ if test "x$exclude" != "x"; then
+++ continue
+++ fi
+++
+++ already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}`
+++ if test "x$already" = "x"; then
+++ DIRS="$DIRS $dir"
+++ fi
+++ done
+++fi
+++
+++eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\""
+++
+++
+++ for try in $smart_lib_dir /usr/local/lib /opt/lib; do
+++ LIBS="-L$try -lldap_r $old_LIBS"
+++ cat >conftest.$ac_ext <<_ACEOF
+++/* confdefs.h. */
+++_ACEOF
+++cat confdefs.h >>conftest.$ac_ext
+++cat >>conftest.$ac_ext <<_ACEOF
+++/* end confdefs.h. */
+++extern char ldap_init();
+++int
+++main ()
+++{
+++ ldap_init()
+++ ;
+++ return 0;
+++}
+++_ACEOF
+++rm -f conftest.$ac_objext conftest$ac_exeext
+++if { (ac_try="$ac_link"
+++case "(($ac_try" in
+++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+++ *) ac_try_echo=$ac_try;;
+++esac
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
+++ (eval "$ac_link") 2>conftest.er1
+++ ac_status=$?
+++ grep -v '^ *+' conftest.er1 >conftest.err
+++ rm -f conftest.er1
+++ cat conftest.err >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ (exit $ac_status); } && {
+++ test -z "$ac_c_werror_flag" ||
+++ test ! -s conftest.err
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-L$try -lldap_r"
+++else
+++ $as_echo "$as_me: failed program was:" >&5
+++sed 's/^/| /' conftest.$ac_ext >&5
+++
+++
+++fi
+++
+++rm -rf conftest.dSYM
+++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+++ conftest$ac_exeext conftest.$ac_ext
+++ if test "x$smart_lib" != "x"; then
+++ break;
+++ fi
+++ done
+++ LIBS="$old_LIBS"
+++fi
+++
+++if test "x$smart_lib" != "x"; then
+++ { $as_echo "$as_me:$LINENO: result: yes" >&5
+++$as_echo "yes" >&6; }
+++ eval "ac_cv_lib_${sm_lib_safe}_${sm_func_safe}=yes"
+++ LIBS="$smart_lib $old_LIBS"
+++ SMART_LIBS="$smart_lib $SMART_LIBS"
+++else
+++ { $as_echo "$as_me:$LINENO: result: no" >&5
+++$as_echo "no" >&6; }
+++fi
+++
+++ if test "x$ac_cv_lib_ldap_r_ldap_init" != "xyes"; then
+++ fail="$fail libldap_r"
+++ fi
+++ else
+++
+++
+++sm_lib_safe=`echo "ldap" | sed 'y%./+-%__p_%'`
+++sm_func_safe=`echo "ldap_init" | sed 'y%./+-%__p_%'`
+++{ $as_echo "$as_me:$LINENO: checking for ldap_init in -lldap" >&5
+++$as_echo_n "checking for ldap_init in -lldap... " >&6; }
+++
+++old_LIBS="$LIBS"
+++smart_lib=
+++smart_lib_dir=
+++
+++if test "x$smart_try_dir" != "x"; then
+++ for try in $smart_try_dir; do
+++ LIBS="-L$try -lldap $old_LIBS"
+++ cat >conftest.$ac_ext <<_ACEOF
+++/* confdefs.h. */
+++_ACEOF
+++cat confdefs.h >>conftest.$ac_ext
+++cat >>conftest.$ac_ext <<_ACEOF
+++/* end confdefs.h. */
+++extern char ldap_init();
+++int
+++main ()
+++{
+++ ldap_init()
+++ ;
+++ return 0;
+++}
+++_ACEOF
+++rm -f conftest.$ac_objext conftest$ac_exeext
+++if { (ac_try="$ac_link"
+++case "(($ac_try" in
+++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+++ *) ac_try_echo=$ac_try;;
+++esac
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
+++ (eval "$ac_link") 2>conftest.er1
+++ ac_status=$?
+++ grep -v '^ *+' conftest.er1 >conftest.err
+++ rm -f conftest.er1
+++ cat conftest.err >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ (exit $ac_status); } && {
+++ test -z "$ac_c_werror_flag" ||
+++ test ! -s conftest.err
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-L$try -lldap"
+++else
+++ $as_echo "$as_me: failed program was:" >&5
+++sed 's/^/| /' conftest.$ac_ext >&5
+++
+++
+++fi
+++
+++rm -rf conftest.dSYM
+++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+++ conftest$ac_exeext conftest.$ac_ext
+++ if test "x$smart_lib" != "x"; then
+++ break;
+++ fi
+++ done
+++ LIBS="$old_LIBS"
+++fi
+++
+++if test "x$smart_lib" = "x"; then
+++ LIBS="-lldap $old_LIBS"
+++ cat >conftest.$ac_ext <<_ACEOF
+++/* confdefs.h. */
+++_ACEOF
+++cat confdefs.h >>conftest.$ac_ext
+++cat >>conftest.$ac_ext <<_ACEOF
+++/* end confdefs.h. */
+++extern char ldap_init();
+++int
+++main ()
+++{
+++ ldap_init()
+++ ;
+++ return 0;
+++}
+++_ACEOF
+++rm -f conftest.$ac_objext conftest$ac_exeext
+++if { (ac_try="$ac_link"
+++case "(($ac_try" in
+++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+++ *) ac_try_echo=$ac_try;;
+++esac
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
+++ (eval "$ac_link") 2>conftest.er1
+++ ac_status=$?
+++ grep -v '^ *+' conftest.er1 >conftest.err
+++ rm -f conftest.er1
+++ cat conftest.err >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ (exit $ac_status); } && {
+++ test -z "$ac_c_werror_flag" ||
+++ test ! -s conftest.err
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-lldap"
+++else
+++ $as_echo "$as_me: failed program was:" >&5
+++sed 's/^/| /' conftest.$ac_ext >&5
+++
+++
+++fi
+++
+++rm -rf conftest.dSYM
+++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+++ conftest$ac_exeext conftest.$ac_ext
+++ LIBS="$old_LIBS"
+++fi
+++
+++if test "x$smart_lib" = "x"; then
+++
+++
+++if test "x$LOCATE" != "x"; then
+++ DIRS=
+++ file=libldap${libltdl_cv_shlibext}
+++
+++ for x in `${LOCATE} $file 2>/dev/null`; do
+++ base=`echo $x | sed "s%/${file}%%"`
+++ if test "x$x" = "x$base"; then
+++ continue;
+++ fi
+++
+++ dir=`${DIRNAME} $x 2>/dev/null`
+++ exclude=`echo ${dir} | ${GREP} /home`
+++ if test "x$exclude" != "x"; then
+++ continue
+++ fi
+++
+++ already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}`
+++ if test "x$already" = "x"; then
+++ DIRS="$DIRS $dir"
+++ fi
+++ done
+++fi
+++
+++eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\""
+++
+++
+++
+++if test "x$LOCATE" != "x"; then
+++ DIRS=
+++ file=libldap.a
+++
+++ for x in `${LOCATE} $file 2>/dev/null`; do
+++ base=`echo $x | sed "s%/${file}%%"`
+++ if test "x$x" = "x$base"; then
+++ continue;
+++ fi
+++
+++ dir=`${DIRNAME} $x 2>/dev/null`
+++ exclude=`echo ${dir} | ${GREP} /home`
+++ if test "x$exclude" != "x"; then
+++ continue
+++ fi
+++
+++ already=`echo \$smart_lib_dir ${DIRS} | ${GREP} ${dir}`
+++ if test "x$already" = "x"; then
+++ DIRS="$DIRS $dir"
+++ fi
+++ done
+++fi
+++
+++eval "smart_lib_dir=\"\$smart_lib_dir $DIRS\""
+++
+++
+++ for try in $smart_lib_dir /usr/local/lib /opt/lib; do
+++ LIBS="-L$try -lldap $old_LIBS"
+++ cat >conftest.$ac_ext <<_ACEOF
+++/* confdefs.h. */
+++_ACEOF
+++cat confdefs.h >>conftest.$ac_ext
+++cat >>conftest.$ac_ext <<_ACEOF
+++/* end confdefs.h. */
+++extern char ldap_init();
+++int
+++main ()
+++{
+++ ldap_init()
+++ ;
+++ return 0;
+++}
+++_ACEOF
+++rm -f conftest.$ac_objext conftest$ac_exeext
+++if { (ac_try="$ac_link"
+++case "(($ac_try" in
+++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+++ *) ac_try_echo=$ac_try;;
+++esac
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
+++ (eval "$ac_link") 2>conftest.er1
+++ ac_status=$?
+++ grep -v '^ *+' conftest.er1 >conftest.err
+++ rm -f conftest.er1
+++ cat conftest.err >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ (exit $ac_status); } && {
+++ test -z "$ac_c_werror_flag" ||
+++ test ! -s conftest.err
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
+++ smart_lib="-L$try -lldap"
+++else
+++ $as_echo "$as_me: failed program was:" >&5
+++sed 's/^/| /' conftest.$ac_ext >&5
+++
+++
+++fi
+++
+++rm -rf conftest.dSYM
+++rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+++ conftest$ac_exeext conftest.$ac_ext
+++ if test "x$smart_lib" != "x"; then
+++ break;
+++ fi
+++ done
+++ LIBS="$old_LIBS"
+++fi
+++
+++if test "x$smart_lib" != "x"; then
+++ { $as_echo "$as_me:$LINENO: result: yes" >&5
+++$as_echo "yes" >&6; }
+++ eval "ac_cv_lib_${sm_lib_safe}_${sm_func_safe}=yes"
+++ LIBS="$smart_lib $old_LIBS"
+++ SMART_LIBS="$smart_lib $SMART_LIBS"
+++else
+++ { $as_echo "$as_me:$LINENO: result: no" >&5
+++$as_echo "no" >&6; }
+++fi
+++
+++ if test "x$ac_cv_lib_ldap_ldap_init" != "xyes"; then
+++ fail="$fail libldap"
+++ fi
+++ fi
+++
+++
+++ smart_try_dir=$rlm_ldap_include_dir
+++
+++
+++ac_safe=`echo "ldap.h" | sed 'y%./+-%__pm%'`
+++{ $as_echo "$as_me:$LINENO: checking for ldap.h" >&5
+++$as_echo_n "checking for ldap.h... " >&6; }
+++
+++old_CFLAGS="$CFLAGS"
+++smart_include=
+++smart_include_dir=
+++
+++if test "x$smart_try_dir" != "x"; then
+++ for try in $smart_try_dir; do
+++ CFLAGS="$old_CFLAGS -I$try"
+++ cat >conftest.$ac_ext <<_ACEOF
+++/* confdefs.h. */
+++_ACEOF
+++cat confdefs.h >>conftest.$ac_ext
+++cat >>conftest.$ac_ext <<_ACEOF
+++/* end confdefs.h. */
+++
+++ #include <ldap.h>
+++int
+++main ()
+++{
+++ int a = 1;
+++ ;
+++ return 0;
+++}
+++_ACEOF
+++rm -f conftest.$ac_objext
+++if { (ac_try="$ac_compile"
+++case "(($ac_try" in
+++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+++ *) ac_try_echo=$ac_try;;
+++esac
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
+++ (eval "$ac_compile") 2>conftest.er1
+++ ac_status=$?
+++ grep -v '^ *+' conftest.er1 >conftest.err
+++ rm -f conftest.er1
+++ cat conftest.err >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ (exit $ac_status); } && {
+++ test -z "$ac_c_werror_flag" ||
+++ test ! -s conftest.err
+++ } && test -s conftest.$ac_objext; then
+++ smart_include="-I$try"
+++else
+++ $as_echo "$as_me: failed program was:" >&5
+++sed 's/^/| /' conftest.$ac_ext >&5
+++
+++ smart_include=
+++fi
+++
+++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+++ if test "x$smart_include" != "x"; then
+++ break;
+++ fi
+++ done
+++ CFLAGS="$old_CFLAGS"
+++fi
+++
+++if test "x$smart_include" = "x"; then
+++ cat >conftest.$ac_ext <<_ACEOF
+++/* confdefs.h. */
+++_ACEOF
+++cat confdefs.h >>conftest.$ac_ext
+++cat >>conftest.$ac_ext <<_ACEOF
+++/* end confdefs.h. */
+++
+++ #include <ldap.h>
+++int
+++main ()
+++{
+++ int a = 1;
+++ ;
+++ return 0;
+++}
+++_ACEOF
+++rm -f conftest.$ac_objext
+++if { (ac_try="$ac_compile"
+++case "(($ac_try" in
+++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+++ *) ac_try_echo=$ac_try;;
+++esac
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
+++ (eval "$ac_compile") 2>conftest.er1
+++ ac_status=$?
+++ grep -v '^ *+' conftest.er1 >conftest.err
+++ rm -f conftest.er1
+++ cat conftest.err >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ (exit $ac_status); } && {
+++ test -z "$ac_c_werror_flag" ||
+++ test ! -s conftest.err
+++ } && test -s conftest.$ac_objext; then
+++ smart_include=" "
+++else
+++ $as_echo "$as_me: failed program was:" >&5
+++sed 's/^/| /' conftest.$ac_ext >&5
+++
+++ smart_include=
+++fi
+++
+++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+++fi
+++
+++if test "x$smart_include" = "x"; then
+++
+++
+++if test "x$LOCATE" != "x"; then
+++ DIRS=
+++ file=ldap.h
+++
+++ for x in `${LOCATE} $file 2>/dev/null`; do
+++ base=`echo $x | sed "s%/${file}%%"`
+++ if test "x$x" = "x$base"; then
+++ continue;
+++ fi
+++
+++ dir=`${DIRNAME} $x 2>/dev/null`
+++ exclude=`echo ${dir} | ${GREP} /home`
+++ if test "x$exclude" != "x"; then
+++ continue
+++ fi
+++
+++ already=`echo \$smart_include_dir ${DIRS} | ${GREP} ${dir}`
+++ if test "x$already" = "x"; then
+++ DIRS="$DIRS $dir"
+++ fi
+++ done
+++fi
+++
+++eval "smart_include_dir=\"\$smart_include_dir $DIRS\""
+++
+++
+++ for try in $smart_include_dir /usr/local/include /opt/include; do
+++ CFLAGS="$old_CFLAGS -I$try"
+++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++ _ACEOF
++ cat confdefs.h >>conftest.$ac_ext
++@@ -3434,20 +4067,21 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_compile") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++ } && test -s conftest.$ac_objext; then
++ smart_include="-I$try"
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++ smart_include=
++@@ -3462,14 +4096,14 @@ rm -f core conftest.err conftest.$ac_obj
++ fi
++
++ if test "x$smart_include" != "x"; then
++- { echo "$as_me:$LINENO: result: yes" >&5
++-echo "${ECHO_T}yes" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: yes" >&5
+++$as_echo "yes" >&6; }
++ eval "ac_cv_header_$ac_safe=yes"
++ CFLAGS="$old_CFLAGS $smart_include"
++ SMART_CFLAGS="$SMART_CFLAGS $smart_include"
++ else
++- { echo "$as_me:$LINENO: result: no" >&5
++-echo "${ECHO_T}no" >&6; }
+++ { $as_echo "$as_me:$LINENO: result: no" >&5
+++$as_echo "no" >&6; }
++ fi
++
++ if test "$ac_cv_header_ldap_h" != "yes"; then
++@@ -3478,10 +4112,10 @@ fi
++
++
++ if test "x$fail" = "x"; then
++- { echo "$as_me:$LINENO: checking for ldap_start_tls_s" >&5
++-echo $ECHO_N "checking for ldap_start_tls_s... $ECHO_C" >&6; }
+++ { $as_echo "$as_me:$LINENO: checking for ldap_start_tls_s" >&5
+++$as_echo_n "checking for ldap_start_tls_s... " >&6; }
++ if test "${ac_cv_func_ldap_start_tls_s+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++@@ -3534,39 +4168,43 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
++ ac_cv_func_ldap_start_tls_s=yes
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_cv_func_ldap_start_tls_s=no
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ fi
++-{ echo "$as_me:$LINENO: result: $ac_cv_func_ldap_start_tls_s" >&5
++-echo "${ECHO_T}$ac_cv_func_ldap_start_tls_s" >&6; }
++-if test $ac_cv_func_ldap_start_tls_s = yes; then
+++{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_ldap_start_tls_s" >&5
+++$as_echo "$ac_cv_func_ldap_start_tls_s" >&6; }
+++if test "x$ac_cv_func_ldap_start_tls_s" = x""yes; then
++ SMART_CFLAGS="$SMART_CFLAGS -DHAVE_LDAP_START_TLS"
++ fi
++
++- { echo "$as_me:$LINENO: checking for ldap_initialize" >&5
++-echo $ECHO_N "checking for ldap_initialize... $ECHO_C" >&6; }
+++ { $as_echo "$as_me:$LINENO: checking for ldap_initialize" >&5
+++$as_echo_n "checking for ldap_initialize... " >&6; }
++ if test "${ac_cv_func_ldap_initialize+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++@@ -3619,39 +4257,43 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
++ ac_cv_func_ldap_initialize=yes
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_cv_func_ldap_initialize=no
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ fi
++-{ echo "$as_me:$LINENO: result: $ac_cv_func_ldap_initialize" >&5
++-echo "${ECHO_T}$ac_cv_func_ldap_initialize" >&6; }
++-if test $ac_cv_func_ldap_initialize = yes; then
+++{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_ldap_initialize" >&5
+++$as_echo "$ac_cv_func_ldap_initialize" >&6; }
+++if test "x$ac_cv_func_ldap_initialize" = x""yes; then
++ SMART_CFLAGS="$SMART_CFLAGS -DHAVE_LDAP_INITIALIZE"
++ fi
++
++- { echo "$as_me:$LINENO: checking for ldap_int_tls_config" >&5
++-echo $ECHO_N "checking for ldap_int_tls_config... $ECHO_C" >&6; }
+++ { $as_echo "$as_me:$LINENO: checking for ldap_int_tls_config" >&5
+++$as_echo_n "checking for ldap_int_tls_config... " >&6; }
++ if test "${ac_cv_func_ldap_int_tls_config+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++@@ -3704,32 +4346,36 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
++ ac_cv_func_ldap_int_tls_config=yes
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_cv_func_ldap_int_tls_config=no
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ fi
++-{ echo "$as_me:$LINENO: result: $ac_cv_func_ldap_int_tls_config" >&5
++-echo "${ECHO_T}$ac_cv_func_ldap_int_tls_config" >&6; }
++-if test $ac_cv_func_ldap_int_tls_config = yes; then
+++{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_ldap_int_tls_config" >&5
+++$as_echo "$ac_cv_func_ldap_int_tls_config" >&6; }
+++if test "x$ac_cv_func_ldap_int_tls_config" = x""yes; then
++ SMART_CFLAGS="$SMART_CFLAGS -DHAVE_LDAP_INT_TLS_CONFIG"
++ fi
++
++@@ -3738,11 +4384,11 @@ fi
++
++ for ac_func in ldap_set_rebind_proc
++ do
++-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
++-{ echo "$as_me:$LINENO: checking for $ac_func" >&5
++-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+++as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+++{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
+++$as_echo_n "checking for $ac_func... " >&6; }
++ if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++ cat >conftest.$ac_ext <<_ACEOF
++ /* confdefs.h. */
++@@ -3795,44 +4441,51 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_link") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++- } && test -s conftest$ac_exeext &&
++- $as_test_x conftest$ac_exeext; then
+++ } && test -s conftest$ac_exeext && {
+++ test "$cross_compiling" = yes ||
+++ $as_test_x conftest$ac_exeext
+++ }; then
++ eval "$as_ac_var=yes"
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++ eval "$as_ac_var=no"
++ fi
++
+++rm -rf conftest.dSYM
++ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
++ conftest$ac_exeext conftest.$ac_ext
++ fi
++-ac_res=`eval echo '${'$as_ac_var'}'`
++- { echo "$as_me:$LINENO: result: $ac_res" >&5
++-echo "${ECHO_T}$ac_res" >&6; }
++-if test `eval echo '${'$as_ac_var'}'` = yes; then
+++ac_res=`eval 'as_val=${'$as_ac_var'}
+++ $as_echo "$as_val"'`
+++ { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+++$as_echo "$ac_res" >&6; }
+++as_val=`eval 'as_val=${'$as_ac_var'}
+++ $as_echo "$as_val"'`
+++ if test "x$as_val" = x""yes; then
++ cat >>confdefs.h <<_ACEOF
++-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+++#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
++ _ACEOF
++
++ fi
++ done
++
++- { echo "$as_me:$LINENO: checking whether ldap_set_rebind_proc takes 3 arguments" >&5
++-echo $ECHO_N "checking whether ldap_set_rebind_proc takes 3 arguments... $ECHO_C" >&6; }
+++ { $as_echo "$as_me:$LINENO: checking whether ldap_set_rebind_proc takes 3 arguments" >&5
+++$as_echo_n "checking whether ldap_set_rebind_proc takes 3 arguments... " >&6; }
++ if test "${ac_cv_ldap_set_rebind_proc+set}" = set; then
++- echo $ECHO_N "(cached) $ECHO_C" >&6
+++ $as_echo_n "(cached) " >&6
++ else
++
++ cat >conftest.$ac_ext <<_ACEOF
++@@ -3858,20 +4511,21 @@ case "(($ac_try" in
++ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
++ *) ac_try_echo=$ac_try;;
++ esac
++-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+++eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+++$as_echo "$ac_try_echo") >&5
++ (eval "$ac_compile") 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++- echo "$as_me:$LINENO: \$? = $ac_status" >&5
+++ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } && {
++ test -z "$ac_c_werror_flag" ||
++ test ! -s conftest.err
++ } && test -s conftest.$ac_objext; then
++ ac_cv_ldap_set_rebind_proc=3
++ else
++- echo "$as_me: failed program was:" >&5
+++ $as_echo "$as_me: failed program was:" >&5
++ sed 's/^/| /' conftest.$ac_ext >&5
++
++ ac_cv_ldap_set_rebind_proc=2
++@@ -3879,8 +4533,8 @@ fi
++
++ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++ fi
++-{ echo "$as_me:$LINENO: result: $ac_cv_ldap_set_rebind_proc" >&5
++-echo "${ECHO_T}$ac_cv_ldap_set_rebind_proc" >&6; }
+++{ $as_echo "$as_me:$LINENO: result: $ac_cv_ldap_set_rebind_proc" >&5
+++$as_echo "$ac_cv_ldap_set_rebind_proc" >&6; }
++ fi
++
++ targetname=rlm_ldap
++@@ -3891,21 +4545,21 @@ fi
++
++ if test x"$fail" != x""; then
++ if test x"${enable_strict_dependencies}" = x"yes"; then
++- { { echo "$as_me:$LINENO: error: set --without-rlm_ldap to disable it explicitly." >&5
++-echo "$as_me: error: set --without-rlm_ldap to disable it explicitly." >&2;}
+++ { { $as_echo "$as_me:$LINENO: error: set --without-rlm_ldap to disable it explicitly." >&5
+++$as_echo "$as_me: error: set --without-rlm_ldap to disable it explicitly." >&2;}
++ { (exit 1); exit 1; }; }
++ else
++- { echo "$as_me:$LINENO: WARNING: silently not building rlm_ldap." >&5
++-echo "$as_me: WARNING: silently not building rlm_ldap." >&2;}
++- { echo "$as_me:$LINENO: WARNING: FAILURE: rlm_ldap requires: $fail." >&5
++-echo "$as_me: WARNING: FAILURE: rlm_ldap requires: $fail." >&2;}
+++ { $as_echo "$as_me:$LINENO: WARNING: silently not building rlm_ldap." >&5
+++$as_echo "$as_me: WARNING: silently not building rlm_ldap." >&2;}
+++ { $as_echo "$as_me:$LINENO: WARNING: FAILURE: rlm_ldap requires: $fail." >&5
+++$as_echo "$as_me: WARNING: FAILURE: rlm_ldap requires: $fail." >&2;}
++ if test x"$headersuggestion" != x; then
++- { echo "$as_me:$LINENO: WARNING: $headersuggestion" >&5
++-echo "$as_me: WARNING: $headersuggestion" >&2;}
+++ { $as_echo "$as_me:$LINENO: WARNING: $headersuggestion" >&5
+++$as_echo "$as_me: WARNING: $headersuggestion" >&2;}
++ fi
++ if test x"$libsuggestion" != x; then
++- { echo "$as_me:$LINENO: WARNING: $libsuggestion" >&5
++-echo "$as_me: WARNING: $libsuggestion" >&2;}
+++ { $as_echo "$as_me:$LINENO: WARNING: $libsuggestion" >&5
+++$as_echo "$as_me: WARNING: $libsuggestion" >&2;}
++ fi
++ targetname=""
++ fi
++@@ -3966,11 +4620,12 @@ _ACEOF
++ case $ac_val in #(
++ *${as_nl}*)
++ case $ac_var in #(
++- *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
++-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+++ *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+++$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
++ esac
++ case $ac_var in #(
++ _ | IFS | as_nl) ;; #(
+++ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
++ *) $as_unset $ac_var ;;
++ esac ;;
++ esac
++@@ -4003,12 +4658,12 @@ echo "$as_me: WARNING: Cache variable $a
++ if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
++ if test -w "$cache_file"; then
++ test "x$cache_file" != "x/dev/null" &&
++- { echo "$as_me:$LINENO: updating cache $cache_file" >&5
++-echo "$as_me: updating cache $cache_file" >&6;}
+++ { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
+++$as_echo "$as_me: updating cache $cache_file" >&6;}
++ cat confcache >$cache_file
++ else
++- { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
++-echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+++ { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+++$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
++ fi
++ fi
++ rm -f confcache
++@@ -4025,6 +4680,12 @@ test "x$exec_prefix" = xNONE && exec_pre
++ # take arguments), then branch to the quote section. Otherwise,
++ # look for a macro that doesn't take arguments.
++ ac_script='
+++:mline
+++/\\$/{
+++ N
+++ s,\\\n,,
+++ b mline
+++}
++ t clear
++ :clear
++ s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g
++@@ -4054,7 +4715,7 @@ ac_ltlibobjs=
++ for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
++ # 1. Remove the extension, and $U if already installed.
++ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
++- ac_i=`echo "$ac_i" | sed "$ac_script"`
+++ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
++ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
++ # will be set to the directory where LIBOBJS objects are built.
++ ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
++@@ -4067,11 +4728,12 @@ LTLIBOBJS=$ac_ltlibobjs
++
++
++ : ${CONFIG_STATUS=./config.status}
+++ac_write_fail=0
++ ac_clean_files_save=$ac_clean_files
++ ac_clean_files="$ac_clean_files $CONFIG_STATUS"
++-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
++-echo "$as_me: creating $CONFIG_STATUS" >&6;}
++-cat >$CONFIG_STATUS <<_ACEOF
+++{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+++$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+++cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ #! $SHELL
++ # Generated by $as_me.
++ # Run this file to recreate the current configuration.
++@@ -4084,7 +4746,7 @@ ac_cs_silent=false
++ SHELL=\${CONFIG_SHELL-$SHELL}
++ _ACEOF
++
++-cat >>$CONFIG_STATUS <<\_ACEOF
+++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++ ## --------------------- ##
++ ## M4sh Initialization. ##
++ ## --------------------- ##
++@@ -4094,7 +4756,7 @@ DUALCASE=1; export DUALCASE # for MKS sh
++ if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
++ emulate sh
++ NULLCMD=:
++- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+++ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
++ # is contrary to our usage. Disable this feature.
++ alias -g '${1+"$@"}'='"$@"'
++ setopt NO_GLOB_SUBST
++@@ -4116,17 +4778,45 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTE
++ as_cr_digits='0123456789'
++ as_cr_alnum=$as_cr_Letters$as_cr_digits
++
++-# The user is always right.
++-if test "${PATH_SEPARATOR+set}" != set; then
++- echo "#! /bin/sh" >conf$$.sh
++- echo "exit 0" >>conf$$.sh
++- chmod +x conf$$.sh
++- if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
++- PATH_SEPARATOR=';'
+++as_nl='
+++'
+++export as_nl
+++# Printing a long string crashes Solaris 7 /usr/bin/printf.
+++as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+++as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+++if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+++ as_echo='printf %s\n'
+++ as_echo_n='printf %s'
+++else
+++ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+++ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+++ as_echo_n='/usr/ucb/echo -n'
++ else
++- PATH_SEPARATOR=:
+++ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+++ as_echo_n_body='eval
+++ arg=$1;
+++ case $arg in
+++ *"$as_nl"*)
+++ expr "X$arg" : "X\\(.*\\)$as_nl";
+++ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+++ esac;
+++ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+++ '
+++ export as_echo_n_body
+++ as_echo_n='sh -c $as_echo_n_body as_echo'
++ fi
++- rm -f conf$$.sh
+++ export as_echo_body
+++ as_echo='sh -c $as_echo_body as_echo'
+++fi
+++
+++# The user is always right.
+++if test "${PATH_SEPARATOR+set}" != set; then
+++ PATH_SEPARATOR=:
+++ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+++ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+++ PATH_SEPARATOR=';'
+++ }
++ fi
++
++ # Support unset when possible.
++@@ -4142,8 +4832,6 @@ fi
++ # there to prevent editors from complaining about space-tab.
++ # (If _AS_PATH_WALK were called with IFS unset, it would disable word
++ # splitting by setting IFS to empty value.)
++-as_nl='
++-'
++ IFS=" "" $as_nl"
++
++ # Find who we are. Look in the path if we contain no directory separator.
++@@ -4166,7 +4854,7 @@ if test "x$as_myself" = x; then
++ as_myself=$0
++ fi
++ if test ! -f "$as_myself"; then
++- echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+++ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
++ { (exit 1); exit 1; }
++ fi
++
++@@ -4179,17 +4867,10 @@ PS2='> '
++ PS4='+ '
++
++ # NLS nuisances.
++-for as_var in \
++- LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
++- LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
++- LC_TELEPHONE LC_TIME
++-do
++- if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
++- eval $as_var=C; export $as_var
++- else
++- ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
++- fi
++-done
+++LC_ALL=C
+++export LC_ALL
+++LANGUAGE=C
+++export LANGUAGE
++
++ # Required to use basename.
++ if expr a : '\(a\)' >/dev/null 2>&1 &&
++@@ -4211,7 +4892,7 @@ as_me=`$as_basename -- "$0" ||
++ $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
++ X"$0" : 'X\(//\)$' \| \
++ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
++-echo X/"$0" |
+++$as_echo X/"$0" |
++ sed '/^.*\/\([^/][^/]*\)\/*$/{
++ s//\1/
++ q
++@@ -4262,7 +4943,7 @@ $as_unset CDPATH
++ s/-\n.*//
++ ' >$as_me.lineno &&
++ chmod +x "$as_me.lineno" ||
++- { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+++ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
++ { (exit 1); exit 1; }; }
++
++ # Don't try to exec as it changes $[0], causing all sort of problems
++@@ -4290,7 +4971,6 @@ case `echo -n x` in
++ *)
++ ECHO_N='-n';;
++ esac
++-
++ if expr a : '\(a\)' >/dev/null 2>&1 &&
++ test "X`expr 00001 : '.*\(...\)'`" = X001; then
++ as_expr=expr
++@@ -4303,19 +4983,22 @@ if test -d conf$$.dir; then
++ rm -f conf$$.dir/conf$$.file
++ else
++ rm -f conf$$.dir
++- mkdir conf$$.dir
+++ mkdir conf$$.dir 2>/dev/null
++ fi
++-echo >conf$$.file
++-if ln -s conf$$.file conf$$ 2>/dev/null; then
++- as_ln_s='ln -s'
++- # ... but there are two gotchas:
++- # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
++- # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
++- # In both cases, we have to default to `cp -p'.
++- ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+++if (echo >conf$$.file) 2>/dev/null; then
+++ if ln -s conf$$.file conf$$ 2>/dev/null; then
+++ as_ln_s='ln -s'
+++ # ... but there are two gotchas:
+++ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+++ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+++ # In both cases, we have to default to `cp -p'.
+++ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+++ as_ln_s='cp -p'
+++ elif ln conf$$.file conf$$ 2>/dev/null; then
+++ as_ln_s=ln
+++ else
++ as_ln_s='cp -p'
++-elif ln conf$$.file conf$$ 2>/dev/null; then
++- as_ln_s=ln
+++ fi
++ else
++ as_ln_s='cp -p'
++ fi
++@@ -4340,10 +5023,10 @@ else
++ as_test_x='
++ eval sh -c '\''
++ if test -d "$1"; then
++- test -d "$1/.";
+++ test -d "$1/.";
++ else
++ case $1 in
++- -*)set "./$1";;
+++ -*)set "./$1";;
++ esac;
++ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
++ ???[sx]*):;;*)false;;esac;fi
++@@ -4366,7 +5049,7 @@ exec 6>&1
++ # values after options handling.
++ ac_log="
++ This file was extended by $as_me, which was
++-generated by GNU Autoconf 2.61. Invocation command line was
+++generated by GNU Autoconf 2.63. Invocation command line was
++
++ CONFIG_FILES = $CONFIG_FILES
++ CONFIG_HEADERS = $CONFIG_HEADERS
++@@ -4379,26 +5062,33 @@ on `(hostname || uname -n) 2>/dev/null |
++
++ _ACEOF
++
++-cat >>$CONFIG_STATUS <<_ACEOF
+++case $ac_config_files in *"
+++"*) set x $ac_config_files; shift; ac_config_files=$*;;
+++esac
+++
+++
+++
+++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ # Files that config.status was made for.
++ config_files="$ac_config_files"
++
++ _ACEOF
++
++-cat >>$CONFIG_STATUS <<\_ACEOF
+++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++ ac_cs_usage="\
++ \`$as_me' instantiates files from templates according to the
++ current configuration.
++
++-Usage: $0 [OPTIONS] [FILE]...
+++Usage: $0 [OPTION]... [FILE]...
++
++ -h, --help print this help, then exit
++ -V, --version print version number and configuration settings, then exit
++- -q, --quiet do not print progress messages
+++ -q, --quiet, --silent
+++ do not print progress messages
++ -d, --debug don't remove temporary files
++ --recheck update $as_me by reconfiguring in the same conditions
++- --file=FILE[:TEMPLATE]
++- instantiate the configuration file FILE
+++ --file=FILE[:TEMPLATE]
+++ instantiate the configuration file FILE
++
++ Configuration files:
++ $config_files
++@@ -4406,23 +5096,23 @@ $config_files
++ Report bugs to <bug-autoconf@gnu.org>."
++
++ _ACEOF
++-cat >>$CONFIG_STATUS <<_ACEOF
+++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ ac_cs_version="\\
++ config.status
++-configured by $0, generated by GNU Autoconf 2.61,
++- with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+++configured by $0, generated by GNU Autoconf 2.63,
+++ with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
++
++-Copyright (C) 2006 Free Software Foundation, Inc.
+++Copyright (C) 2008 Free Software Foundation, Inc.
++ This config.status script is free software; the Free Software Foundation
++ gives unlimited permission to copy, distribute and modify it."
++
++ ac_pwd='$ac_pwd'
++ srcdir='$srcdir'
+++test -n "\$AWK" || AWK=awk
++ _ACEOF
++
++-cat >>$CONFIG_STATUS <<\_ACEOF
++-# If no file are specified by the user, then we need to provide default
++-# value. By we need to know if files were specified by the user.
+++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+++# The default lists apply if the user does not specify any file.
++ ac_need_defaults=:
++ while test $# != 0
++ do
++@@ -4444,21 +5134,24 @@ do
++ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
++ ac_cs_recheck=: ;;
++ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
++- echo "$ac_cs_version"; exit ;;
+++ $as_echo "$ac_cs_version"; exit ;;
++ --debug | --debu | --deb | --de | --d | -d )
++ debug=: ;;
++ --file | --fil | --fi | --f )
++ $ac_shift
++- CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+++ case $ac_optarg in
+++ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+++ esac
+++ CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
++ ac_need_defaults=false;;
++ --he | --h | --help | --hel | -h )
++- echo "$ac_cs_usage"; exit ;;
+++ $as_echo "$ac_cs_usage"; exit ;;
++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
++ | -silent | --silent | --silen | --sile | --sil | --si | --s)
++ ac_cs_silent=: ;;
++
++ # This is an error.
++- -*) { echo "$as_me: error: unrecognized option: $1
+++ -*) { $as_echo "$as_me: error: unrecognized option: $1
++ Try \`$0 --help' for more information." >&2
++ { (exit 1); exit 1; }; } ;;
++
++@@ -4477,30 +5170,32 @@ if $ac_cs_silent; then
++ fi
++
++ _ACEOF
++-cat >>$CONFIG_STATUS <<_ACEOF
+++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ if \$ac_cs_recheck; then
++- echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
++- CONFIG_SHELL=$SHELL
+++ set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+++ shift
+++ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+++ CONFIG_SHELL='$SHELL'
++ export CONFIG_SHELL
++- exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+++ exec "\$@"
++ fi
++
++ _ACEOF
++-cat >>$CONFIG_STATUS <<\_ACEOF
+++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++ exec 5>>config.log
++ {
++ echo
++ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
++ ## Running $as_me. ##
++ _ASBOX
++- echo "$ac_log"
+++ $as_echo "$ac_log"
++ } >&5
++
++ _ACEOF
++-cat >>$CONFIG_STATUS <<_ACEOF
+++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ _ACEOF
++
++-cat >>$CONFIG_STATUS <<\_ACEOF
+++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++
++ # Handling of arguments.
++ for ac_config_target in $ac_config_targets
++@@ -4508,8 +5203,8 @@ do
++ case $ac_config_target in
++ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
++
++- *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
++-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+++ *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+++$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
++ { (exit 1); exit 1; }; };;
++ esac
++ done
++@@ -4548,114 +5243,143 @@ $debug ||
++ (umask 077 && mkdir "$tmp")
++ } ||
++ {
++- echo "$me: cannot create a temporary directory in ." >&2
+++ $as_echo "$as_me: cannot create a temporary directory in ." >&2
++ { (exit 1); exit 1; }
++ }
++
++-#
++-# Set up the sed scripts for CONFIG_FILES section.
++-#
++-
++-# No need to generate the scripts if there are no CONFIG_FILES.
++-# This happens for instance when ./config.status config.h
+++# Set up the scripts for CONFIG_FILES section.
+++# No need to generate them if there are no CONFIG_FILES.
+++# This happens for instance with `./config.status config.h'.
++ if test -n "$CONFIG_FILES"; then
++
++-_ACEOF
++
+++ac_cr=' '
+++ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+++if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+++ ac_cs_awk_cr='\\r'
+++else
+++ ac_cs_awk_cr=$ac_cr
+++fi
+++
+++echo 'BEGIN {' >"$tmp/subs1.awk" &&
+++_ACEOF
++
++
+++{
+++ echo "cat >conf$$subs.awk <<_ACEOF" &&
+++ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+++ echo "_ACEOF"
+++} >conf$$subs.sh ||
+++ { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+++$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+++ { (exit 1); exit 1; }; }
+++ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
++ ac_delim='%!_!# '
++ for ac_last_try in false false false false false :; do
++- cat >conf$$subs.sed <<_ACEOF
++-SHELL!$SHELL$ac_delim
++-PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
++-PACKAGE_NAME!$PACKAGE_NAME$ac_delim
++-PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
++-PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
++-PACKAGE_STRING!$PACKAGE_STRING$ac_delim
++-PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
++-exec_prefix!$exec_prefix$ac_delim
++-prefix!$prefix$ac_delim
++-program_transform_name!$program_transform_name$ac_delim
++-bindir!$bindir$ac_delim
++-sbindir!$sbindir$ac_delim
++-libexecdir!$libexecdir$ac_delim
++-datarootdir!$datarootdir$ac_delim
++-datadir!$datadir$ac_delim
++-sysconfdir!$sysconfdir$ac_delim
++-sharedstatedir!$sharedstatedir$ac_delim
++-localstatedir!$localstatedir$ac_delim
++-includedir!$includedir$ac_delim
++-oldincludedir!$oldincludedir$ac_delim
++-docdir!$docdir$ac_delim
++-infodir!$infodir$ac_delim
++-htmldir!$htmldir$ac_delim
++-dvidir!$dvidir$ac_delim
++-pdfdir!$pdfdir$ac_delim
++-psdir!$psdir$ac_delim
++-libdir!$libdir$ac_delim
++-localedir!$localedir$ac_delim
++-mandir!$mandir$ac_delim
++-DEFS!$DEFS$ac_delim
++-ECHO_C!$ECHO_C$ac_delim
++-ECHO_N!$ECHO_N$ac_delim
++-ECHO_T!$ECHO_T$ac_delim
++-LIBS!$LIBS$ac_delim
++-build_alias!$build_alias$ac_delim
++-host_alias!$host_alias$ac_delim
++-target_alias!$target_alias$ac_delim
++-CC!$CC$ac_delim
++-CFLAGS!$CFLAGS$ac_delim
++-LDFLAGS!$LDFLAGS$ac_delim
++-CPPFLAGS!$CPPFLAGS$ac_delim
++-ac_ct_CC!$ac_ct_CC$ac_delim
++-EXEEXT!$EXEEXT$ac_delim
++-OBJEXT!$OBJEXT$ac_delim
++-edir!$edir$ac_delim
++-ldap_ldflags!$ldap_ldflags$ac_delim
++-ldap_cflags!$ldap_cflags$ac_delim
++-targetname!$targetname$ac_delim
++-LIBOBJS!$LIBOBJS$ac_delim
++-LTLIBOBJS!$LTLIBOBJS$ac_delim
++-_ACEOF
+++ . ./conf$$subs.sh ||
+++ { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+++$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+++ { (exit 1); exit 1; }; }
++
++- if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 50; then
+++ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+++ if test $ac_delim_n = $ac_delim_num; then
++ break
++ elif $ac_last_try; then
++- { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
++-echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+++ { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+++$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
++ { (exit 1); exit 1; }; }
++ else
++ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
++ fi
++ done
+++rm -f conf$$subs.sh
++
++-ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
++-if test -n "$ac_eof"; then
++- ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
++- ac_eof=`expr $ac_eof + 1`
++-fi
++-
++-cat >>$CONFIG_STATUS <<_ACEOF
++-cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
++-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
++-_ACEOF
++-sed '
++-s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
++-s/^/s,@/; s/!/@,|#_!!_#|/
++-:n
++-t n
++-s/'"$ac_delim"'$/,g/; t
++-s/$/\\/; p
++-N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
++-' >>$CONFIG_STATUS <conf$$subs.sed
++-rm -f conf$$subs.sed
++-cat >>$CONFIG_STATUS <<_ACEOF
++-:end
++-s/|#_!!_#|//g
++-CEOF$ac_eof
+++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+++cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
++ _ACEOF
+++sed -n '
+++h
+++s/^/S["/; s/!.*/"]=/
+++p
+++g
+++s/^[^!]*!//
+++:repl
+++t repl
+++s/'"$ac_delim"'$//
+++t delim
+++:nl
+++h
+++s/\(.\{148\}\).*/\1/
+++t more1
+++s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+++p
+++n
+++b repl
+++:more1
+++s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+++p
+++g
+++s/.\{148\}//
+++t nl
+++:delim
+++h
+++s/\(.\{148\}\).*/\1/
+++t more2
+++s/["\\]/\\&/g; s/^/"/; s/$/"/
+++p
+++b
+++:more2
+++s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+++p
+++g
+++s/.\{148\}//
+++t delim
+++' <conf$$subs.awk | sed '
+++/^[^""]/{
+++ N
+++ s/\n//
+++}
+++' >>$CONFIG_STATUS || ac_write_fail=1
+++rm -f conf$$subs.awk
+++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+++_ACAWK
+++cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+++ for (key in S) S_is_set[key] = 1
+++ FS = ""
++
+++}
+++{
+++ line = $ 0
+++ nfields = split(line, field, "@")
+++ substed = 0
+++ len = length(field[1])
+++ for (i = 2; i < nfields; i++) {
+++ key = field[i]
+++ keylen = length(key)
+++ if (S_is_set[key]) {
+++ value = S[key]
+++ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+++ len += length(value) + length(field[++i])
+++ substed = 1
+++ } else
+++ len += 1 + keylen
+++ }
+++
+++ print line
+++}
+++
+++_ACAWK
+++_ACEOF
+++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+++if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+++ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+++else
+++ cat
+++fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+++ || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
+++$as_echo "$as_me: error: could not setup config files machinery" >&2;}
+++ { (exit 1); exit 1; }; }
+++_ACEOF
++
++ # VPATH may cause trouble with some makes, so we remove $(srcdir),
++ # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
++@@ -4672,19 +5396,21 @@ s/^[^=]*=[ ]*$//
++ }'
++ fi
++
++-cat >>$CONFIG_STATUS <<\_ACEOF
+++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++ fi # test -n "$CONFIG_FILES"
++
++
++-for ac_tag in :F $CONFIG_FILES
+++eval set X " :F $CONFIG_FILES "
+++shift
+++for ac_tag
++ do
++ case $ac_tag in
++ :[FHLC]) ac_mode=$ac_tag; continue;;
++ esac
++ case $ac_mode$ac_tag in
++ :[FHL]*:*);;
++- :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
++-echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+++ :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
+++$as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
++ { (exit 1); exit 1; }; };;
++ :[FH]-) ac_tag=-:-;;
++ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
++@@ -4713,26 +5439,38 @@ echo "$as_me: error: Invalid tag $ac_tag
++ [\\/$]*) false;;
++ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
++ esac ||
++- { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
++-echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+++ { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+++$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
++ { (exit 1); exit 1; }; };;
++ esac
++- ac_file_inputs="$ac_file_inputs $ac_f"
+++ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+++ ac_file_inputs="$ac_file_inputs '$ac_f'"
++ done
++
++ # Let's still pretend it is `configure' which instantiates (i.e., don't
++ # use $as_me), people would be surprised to read:
++ # /* config.h. Generated by config.status. */
++- configure_input="Generated from "`IFS=:
++- echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+++ configure_input='Generated from '`
+++ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+++ `' by configure.'
++ if test x"$ac_file" != x-; then
++ configure_input="$ac_file. $configure_input"
++- { echo "$as_me:$LINENO: creating $ac_file" >&5
++-echo "$as_me: creating $ac_file" >&6;}
+++ { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
+++$as_echo "$as_me: creating $ac_file" >&6;}
++ fi
+++ # Neutralize special characters interpreted by sed in replacement strings.
+++ case $configure_input in #(
+++ *\&* | *\|* | *\\* )
+++ ac_sed_conf_input=`$as_echo "$configure_input" |
+++ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+++ *) ac_sed_conf_input=$configure_input;;
+++ esac
++
++ case $ac_tag in
++- *:-:* | *:-) cat >"$tmp/stdin";;
+++ *:-:* | *:-) cat >"$tmp/stdin" \
+++ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+++$as_echo "$as_me: error: could not create $ac_file" >&2;}
+++ { (exit 1); exit 1; }; } ;;
++ esac
++ ;;
++ esac
++@@ -4742,7 +5480,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^
++ X"$ac_file" : 'X\(//\)[^/]' \| \
++ X"$ac_file" : 'X\(//\)$' \| \
++ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
++-echo X"$ac_file" |
+++$as_echo X"$ac_file" |
++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++ s//\1/
++ q
++@@ -4768,7 +5506,7 @@ echo X"$ac_file" |
++ as_dirs=
++ while :; do
++ case $as_dir in #(
++- *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+++ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
++ *) as_qdir=$as_dir;;
++ esac
++ as_dirs="'$as_qdir' $as_dirs"
++@@ -4777,7 +5515,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/
++ X"$as_dir" : 'X\(//\)[^/]' \| \
++ X"$as_dir" : 'X\(//\)$' \| \
++ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
++-echo X"$as_dir" |
+++$as_echo X"$as_dir" |
++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
++ s//\1/
++ q
++@@ -4798,17 +5536,17 @@ echo X"$as_dir" |
++ test -d "$as_dir" && break
++ done
++ test -z "$as_dirs" || eval "mkdir $as_dirs"
++- } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
++-echo "$as_me: error: cannot create directory $as_dir" >&2;}
+++ } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+++$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
++ { (exit 1); exit 1; }; }; }
++ ac_builddir=.
++
++ case "$ac_dir" in
++ .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
++ *)
++- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+++ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
++ # A ".." for each directory in $ac_dir_suffix.
++- ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+++ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
++ case $ac_top_builddir_sub in
++ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
++ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
++@@ -4844,12 +5582,13 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_
++
++ _ACEOF
++
++-cat >>$CONFIG_STATUS <<\_ACEOF
+++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++ # If the template does not know about datarootdir, expand it.
++ # FIXME: This hack should be removed a few years after 2.60.
++ ac_datarootdir_hack=; ac_datarootdir_seen=
++
++-case `sed -n '/datarootdir/ {
+++ac_sed_dataroot='
+++/datarootdir/ {
++ p
++ q
++ }
++@@ -4858,13 +5597,14 @@ case `sed -n '/datarootdir/ {
++ /@infodir@/p
++ /@localedir@/p
++ /@mandir@/p
++-' $ac_file_inputs` in
+++'
+++case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
++ *datarootdir*) ac_datarootdir_seen=yes;;
++ *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
++- { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
++-echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+++ { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+++$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
++ _ACEOF
++-cat >>$CONFIG_STATUS <<_ACEOF
+++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
++ ac_datarootdir_hack='
++ s&@datadir@&$datadir&g
++ s&@docdir@&$docdir&g
++@@ -4878,15 +5618,16 @@ _ACEOF
++ # Neutralize VPATH when `$srcdir' = `.'.
++ # Shell code in configure.ac might set extrasub.
++ # FIXME: do we really want to maintain this feature?
++-cat >>$CONFIG_STATUS <<_ACEOF
++- sed "$ac_vpsub
+++cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+++ac_sed_extra="$ac_vpsub
++ $extrasub
++ _ACEOF
++-cat >>$CONFIG_STATUS <<\_ACEOF
+++cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
++ :t
++ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b
++-s&@configure_input@&$configure_input&;t t
+++s|@configure_input@|$ac_sed_conf_input|;t t
++ s&@top_builddir@&$ac_top_builddir_sub&;t t
+++s&@top_build_prefix@&$ac_top_build_prefix&;t t
++ s&@srcdir@&$ac_srcdir&;t t
++ s&@abs_srcdir@&$ac_abs_srcdir&;t t
++ s&@top_srcdir@&$ac_top_srcdir&;t t
++@@ -4895,21 +5636,28 @@ s&@builddir@&$ac_builddir&;t t
++ s&@abs_builddir@&$ac_abs_builddir&;t t
++ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
++ $ac_datarootdir_hack
++-" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
+++"
+++eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+++ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+++$as_echo "$as_me: error: could not create $ac_file" >&2;}
+++ { (exit 1); exit 1; }; }
++
++ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
++ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
++ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
++- { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+++ { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
++ which seems to be undefined. Please make sure it is defined." >&5
++-echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+++$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
++ which seems to be undefined. Please make sure it is defined." >&2;}
++
++ rm -f "$tmp/stdin"
++ case $ac_file in
++- -) cat "$tmp/out"; rm -f "$tmp/out";;
++- *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
++- esac
+++ -) cat "$tmp/out" && rm -f "$tmp/out";;
+++ *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+++ esac \
+++ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+++$as_echo "$as_me: error: could not create $ac_file" >&2;}
+++ { (exit 1); exit 1; }; }
++ ;;
++
++
++@@ -4924,6 +5672,11 @@ _ACEOF
++ chmod +x $CONFIG_STATUS
++ ac_clean_files=$ac_clean_files_save
++
+++test $ac_write_fail = 0 ||
+++ { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
+++$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
+++ { (exit 1); exit 1; }; }
+++
++
++ # configure is writing to config.log, and then calls config.status.
++ # config.status does its own redirection, appending to config.log.
++@@ -4945,5 +5698,9 @@ if test "$no_create" != yes; then
++ # would make configure fail if this is the last instruction.
++ $ac_cs_success || { (exit 1); exit 1; }
++ fi
+++if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+++ { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+++$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+++fi
++
++
++Index: freeradius-server-2.2.7/src/modules/rlm_ldap/configure.in
++===================================================================
++--- freeradius-server-2.2.7.orig/src/modules/rlm_ldap/configure.in
+++++ freeradius-server-2.2.7/src/modules/rlm_ldap/configure.in
++@@ -87,6 +87,9 @@ if test x$with_[]modname != xno; then
++ )
++ fi
++
+++ FR_SMART_CHECK_LIB(sasl, sasl_encode)
+++ FR_SMART_CHECK_LIB(lber, ber_init)
+++
++ dnl Try only "-lldap_r" or "-lldap"
++ dnl Static linking will probably not work, but nobody ever
++ dnl complained about it.
+diff --git a/feeds/packages/net/freeradius2/patches/008-honor_ccpflags.patch b/feeds/packages/net/freeradius2/patches/008-honor_ccpflags.patch
+new file mode 100644
+index 0000000..7e6d81e
+--- /dev/null
++++ b/feeds/packages/net/freeradius2/patches/008-honor_ccpflags.patch
+@@ -0,0 +1,17 @@
++Index: freeradius-server-2.2.7/src/modules/rules.mak
++===================================================================
++--- freeradius-server-2.2.7.orig/src/modules/rules.mak
+++++ freeradius-server-2.2.7/src/modules/rules.mak
++@@ -63,10 +63,10 @@ $(LT_OBJS): $(SERVER_HEADERS)
++ #
++ #######################################################################
++ %.lo: %.c
++- $(LIBTOOL) --mode=compile --tag=CC $(CC) $(CFLAGS) $(RLM_CFLAGS) -c $<
+++ $(LIBTOOL) --mode=compile --tag=CC $(CC) $(CFLAGS) $(CPPFLAGS) $(RLM_CFLAGS) -c $<
++
++ %.lo: %.cpp
++- $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CFLAGS) $(RLM_CFLAGS) -c $<
+++ $(LIBTOOL) --mode=compile --tag=CXX $(CXX) $(CFLAGS) $(CPPFLAGS) $(RLM_CFLAGS) -c $<
++
++ ifneq ($(TARGET),)
++ #######################################################################
+diff --git a/feeds/packages/net/freeradius2/patches/010-disbale-openssl-check.patch b/feeds/packages/net/freeradius2/patches/010-disbale-openssl-check.patch
+new file mode 100644
+index 0000000..483221d
+--- /dev/null
++++ b/feeds/packages/net/freeradius2/patches/010-disbale-openssl-check.patch
+@@ -0,0 +1,40 @@
++Index: freeradius-server-2.2.7/configure.in
++===================================================================
++--- freeradius-server-2.2.7.orig/configure.in
+++++ freeradius-server-2.2.7/configure.in
++@@ -820,35 +820,6 @@ if test "x$WITH_OPENSSL" = xyes; then
++ OPENSSL_INCLUDE="-DOPENSSL_NO_KRB5"
++ fi
++
++- dnl #
++- dnl # Now check that the header versions match the library
++- dnl #
++- AC_MSG_CHECKING([OpenSSL library and header version consistency])
++- AC_RUN_IFELSE(
++- [AC_LANG_PROGRAM(
++- [[
++- #include <stdio.h>
++- #include <openssl/opensslv.h>
++- #include <openssl/crypto.h>
++- ]],
++- [[
++- if (SSLeay() == OPENSSL_VERSION_NUMBER) {
++- return 0;
++- } else {
++- printf("library: %lx header: %lx... ", (unsigned long) SSLeay(), (unsigned long) OPENSSL_VERSION_NUMBER);
++- return 1;
++- }
++- ]]
++- )],
++- [
++- AC_MSG_RESULT(yes)
++- ],
++- [
++- AC_MSG_RESULT(no)
++- AC_MSG_FAILURE([OpenSSL library version does not match header version])
++- ]
++- )
++-
++ if test "x$OPENSSL_LIBS" = x; then
++ LIBS=$old_LIBS
++ LDFLAGS="$old_LDFLAGS"
+diff --git a/feeds/packages/net/fwknop/Config.in b/feeds/packages/net/fwknop/Config.in
+new file mode 100644
+index 0000000..ee0e623
+--- /dev/null
++++ b/feeds/packages/net/fwknop/Config.in
+@@ -0,0 +1,12 @@
++#fwknop config
++menu "Configuration"
++ depends on PACKAGE_fwknopd
++
++config FWKNOPD_GPG
++ bool "Enable GPG support"
++ select PACKAGE_gnupg
++ default n
++
++
++
++endmenu
+diff --git a/feeds/packages/net/fwknop/Makefile b/feeds/packages/net/fwknop/Makefile
+new file mode 100644
+index 0000000..2114cc9
+--- /dev/null
++++ b/feeds/packages/net/fwknop/Makefile
+@@ -0,0 +1,132 @@
++#
++# Copyright (C) 2011-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=fwknop
++PKG_VERSION:=2.6.6
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.cipherdyne.org/fwknop/download
++PKG_MD5SUM:=1372aeaf1e33ab1d6b9906ef9b5cd02e
++PKG_MAINTAINER:=Jonathan Bennett <JBennett@incomsystems.biz>
++PKG_LICENSE:=GPLv2
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/fwknop/Default
++ TITLE:=FireWall KNock OPerator
++ URL:=http://www.cipherdyne.org/fwknop/
++endef
++
++define Package/fwknop/Default/description
++ Fwknop implements an authorization scheme known as Single Packet Authorization
++ (SPA) for Linux systems running iptables. This mechanism requires only a
++ single encrypted and non-replayed packet to communicate various pieces of
++ information including desired access through an iptables policy. The main
++ application of this program is to use iptables in a default-drop stance to
++ protect services such as SSH with an additional layer of security in order to
++ make the exploitation of vulnerabilities (both 0-day and unpatched code) much
++ more difficult.
++endef
++
++define Package/fwknopd
++ $(call Package/fwknop/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Firewall
++ TITLE+= Daemon
++ DEPENDS:=+iptables +libfko +libpcap +FWKNOP_GPG:gnupg
++endef
++
++define Package/fwknopd/description
++ $(call Package/fwknop/Default/description)
++ This package contains the fwknop daemon.
++endef
++
++define Package/fwknopd/conffiles
++/etc/fwknop/access.conf
++/etc/fwknop/fwknopd.conf
++endef
++
++define Package/fwknopd/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/fwknop
++ $(call Package/fwknop/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Firewall
++ TITLE+= Client
++ DEPENDS:=+libfko
++endef
++
++define Package/fwknop/description
++ $(call Package/fwknop/Default/description)
++ This package contains the fwknop client.
++endef
++
++define Package/libfko
++ $(call Package/fwknop/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ SUBMENU:=Firewall
++ TITLE+= Library
++endef
++
++define Package/libfko/description
++ $(call Package/fwknop/Default/description)
++ This package contains the libfko shared library.
++endef
++
++
++ifneq ($(CONFIG_FWKNOPD_GPG),y)
++ CONFIGURE_ARGS += --without-gpgme
++endif
++
++CONFIGURE_ARGS += \
++ --with-iptables=/usr/sbin/iptables
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/fko.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfko.{a,la,so*} $(1)/usr/lib/
++endef
++
++define Package/fwknopd/install
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/fwknopd $(1)/etc/config/fwknopd
++ $(INSTALL_DIR) $(1)/etc/fwknop
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/fwknop/{access,fwknopd}.conf \
++ $(1)/etc/fwknop/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/fwknopd.init $(1)/etc/init.d/fwknopd
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/fwknopd $(1)/usr/sbin/
++endef
++
++define Package/fwknopd/conffiles
++ /etc/config/fwknopd
++endef
++
++define Package/fwknop/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/fwknop $(1)/usr/bin/
++endef
++
++define Package/libfko/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libfko.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,fwknopd))
++$(eval $(call BuildPackage,fwknop))
++$(eval $(call BuildPackage,libfko))
+diff --git a/feeds/packages/net/fwknop/files/fwknopd b/feeds/packages/net/fwknop/files/fwknopd
+new file mode 100644
+index 0000000..0874ee4
+--- /dev/null
++++ b/feeds/packages/net/fwknop/files/fwknopd
+@@ -0,0 +1,9 @@
++config global
++# option uci_enabled '1'
++
++config access
++ option SOURCE 'ANY'
++ option HMAC_KEY 'CHANGEME'
++ option KEY 'CHANGEME'
++
++config config
+diff --git a/feeds/packages/net/fwknop/files/fwknopd.init b/feeds/packages/net/fwknop/files/fwknopd.init
+new file mode 100644
+index 0000000..9776312
+--- /dev/null
++++ b/feeds/packages/net/fwknop/files/fwknopd.init
+@@ -0,0 +1,94 @@
++#!/bin/sh /etc/rc.common
++#
++# Fwknop is developed primarily by the people listed in the file 'AUTHORS'.
++# Copyright (C) 2009-2014 fwknop developers and contributors. For a full
++# list of contributors, see the file 'CREDITS'.
++#
++. /lib/functions.sh
++START=95
++
++FWKNOPD_BIN=/usr/sbin/fwknopd
++
++start()
++{
++ gen_confs
++ $FWKNOPD_BIN
++}
++
++stop()
++{
++ $FWKNOPD_BIN -K
++}
++
++restart()
++{
++ stop;
++ sleep 1;
++ start;
++}
++
++reload()
++{
++ gen_confs
++ $FWKNOPD_BIN -R
++}
++
++gen_confs()
++{
++ [ -f /tmp/access.conf.tmp ] && rm /tmp/access.conf.tmp
++ if [ "`uci get fwknopd.@config[0].PCAP_INTF`" = ""]
++ then
++ . /lib/functions/network.sh
++ network_get_physdev device wan
++ uci set fwknopd.@config[0].PCAP_INTF="$device"
++ uci commit
++ fi
++ config_cb() {
++ local type="$1"
++ local name="$2"
++ if [ "$type" = "global" ]; then
++ option_cb() {
++ local option="$1"
++ local value="$2"
++ if [ "$option" = "uci_enabled" ] && [ "$value" -eq 1 ] ; then
++ > /etc/fwknop/fwknopd.conf
++ > /etc/fwknop/access.conf
++ UCI_ENABLED=1
++ fi
++ }
++ elif [ "$type" = "config" ]; then
++ option_cb() {
++ local option="$1"
++ local value="$2"
++ if [ $UCI_ENABLED ]; then
++ echo "$option $value" >> /etc/fwknop/fwknopd.conf #writing each option to fwknopd.conf
++ fi
++ }
++ elif [ "$type" = "access" ]
++ then
++ if [ -f /tmp/access.conf.tmp ] ; then
++ cat /tmp/access.conf.tmp >> /etc/fwknop/access.conf
++ rm /tmp/access.conf.tmp
++ fi
++ option_cb() {
++ local option="$1"
++ local value="$2"
++ if [ $UCI_ENABLED ] && [ $option = "SOURCE" ]; then
++ echo "$option $value" >> /etc/fwknop/access.conf #writing each option to access.conf
++ fi
++ if [ $UCI_ENABLED ] && [ $option != "SOURCE" ]; then
++ echo "$option $value" >> /tmp/access.conf.tmp #writing each option to access.conf
++ fi
++ }
++ fi
++ }
++
++ if [ -f /etc/config/fwknopd ]; then
++ config_load fwknopd
++ if [ -f /tmp/access.conf.tmp ] ; then
++ cat /tmp/access.conf.tmp >> /etc/fwknop/access.conf
++ rm /tmp/access.conf.tmp
++ fi
++ fi
++
++}
+diff --git a/feeds/packages/net/fwknop/patches/001-add-keygen.patch b/feeds/packages/net/fwknop/patches/001-add-keygen.patch
+new file mode 100644
+index 0000000..bbc3d99
+--- /dev/null
++++ b/feeds/packages/net/fwknop/patches/001-add-keygen.patch
+@@ -0,0 +1,427 @@
++diff --git a/CREDITS b/CREDITS
++index de17d9e..38e2108 100644
++--- a/CREDITS
+++++ b/CREDITS
++@@ -1,5 +1,6 @@
++ Jonathan Bennett
++ - Contributed OpenWRT support - see the extras/openwrt/ directory.
+++ - Suggested the addition of the --key-gen option to fwknopd.
++
++ Sebastien Jeanquier
++ - Assisted with getting fwknop included in BackTrack Linux - the choice
++diff --git a/ChangeLog b/ChangeLog
++index 21a5093..4daf008 100644
++--- a/ChangeLog
+++++ b/ChangeLog
++@@ -1,3 +1,8 @@
+++fwknop-2.6.7 (05//2015):
+++ - Added --key-gen to fwknopd. This feature was suggested by Jonathan
+++ Bennett, and will help with ease of use efforts. The first platform to
+++ take advantage of this will likely be OpenWRT thanks to Jonathan.
+++
++ fwknop-2.6.6 (04/23/2015):
++ - [server] Add the ability for fwknopd to function as an generic SPA
++ gateway. This allows scenarios such as the fwknopd system providing DHCP
++diff --git a/client/config_init.c b/client/config_init.c
++index cdb233d..f0ae135 100644
++--- a/client/config_init.c
+++++ b/client/config_init.c
++@@ -199,7 +199,7 @@ static int critical_var_array[] =
++ };
++
++ /**
++- * @brief Generate Rijndael + HMAC keys from /dev/random (base64 encoded) and exit.
+++ * @brief Generate Rijndael + HMAC keys from /dev/urandom (base64 encoded).
++ *
++ * @param options FKO command line option structure
++ */
++diff --git a/client/fwknop_common.h b/client/fwknop_common.h
++index aef20c4..c57db02 100644
++--- a/client/fwknop_common.h
+++++ b/client/fwknop_common.h
++@@ -69,8 +69,6 @@
++ #define MAX_HOSTNAME_LEN 70
++ #define MAX_URL_HOST_LEN 256
++ #define MAX_URL_PATH_LEN 1024
++-#define MAX_KEY_LEN 128
++-#define MAX_B64_KEY_LEN 180
++
++ /* fwknop client configuration parameters and values
++ */
++@@ -156,10 +154,10 @@ typedef struct fko_cli_options
++ unsigned char use_gpg;
++ unsigned char use_gpg_agent;
++ unsigned char gpg_no_signing_pw;
+++ unsigned char key_gen;
++ int time_offset_plus;
++ int time_offset_minus;
++ int fw_timeout;
++- int key_gen;
++
++ char use_rc_stanza[MAX_LINE_LEN];
++ unsigned char got_named_stanza;
++diff --git a/common/common.h b/common/common.h
++index b63e7c2..c7b2e57 100644
++--- a/common/common.h
+++++ b/common/common.h
++@@ -157,6 +157,9 @@ enum {
++ #define MAX_GPG_KEY_ID 128
++ #define MAX_USERNAME_LEN 30
++
+++#define MAX_KEY_LEN 128
+++#define MAX_B64_KEY_LEN 180
+++
++ /* Command line argument / argv handling
++ */
++ #define MAX_CMDLINE_ARGS 30 /*!< should be way more than enough */
++diff --git a/doc/fwknop.man.asciidoc b/doc/fwknop.man.asciidoc
++index 070ac77..efa99a7 100644
++--- a/doc/fwknop.man.asciidoc
+++++ b/doc/fwknop.man.asciidoc
++@@ -196,6 +196,11 @@ GENERAL OPTIONS
++ keys are generally more secure than passphrases that are typed in from the
++ command line.
++
+++*--key-gen-file*='<file>'::
+++ Write generated keys to the specified file. Note that the file is
+++ overwritten if it already exists. If this option is not given, then
+++ *--key-gen* writes the keys to stdout.
+++
++ *--key-len*='<length>'::
++ Specify the number of bytes for a generated Rijndael key. The maximum size
++ is currently 128 bytes.
++diff --git a/server/cmd_opts.h b/server/cmd_opts.h
++index bc1eee1..d7a645c 100644
++--- a/server/cmd_opts.h
+++++ b/server/cmd_opts.h
++@@ -141,6 +141,10 @@ enum {
++ FW_LIST = 0x200,
++ FW_LIST_ALL,
++ FW_FLUSH,
+++ KEY_GEN_FILE,
+++ KEY_LEN,
+++ HMAC_KEY_LEN,
+++ HMAC_DIGEST_TYPE,
++ AFL_PKT_FILE,
++ GPG_HOME_DIR,
++ GPG_EXE_PATH,
++@@ -178,7 +182,12 @@ static struct option cmd_opts[] =
++ {"fault-injection-tag", 1, NULL, FAULT_INJECTION_TAG},
++ {"help", 0, NULL, 'h'},
++ {"interface", 1, NULL, 'i'},
++- {"kill", 0, NULL, 'K'},
+++ {"key-gen", 0, NULL, 'k'},
+++ {"key-gen-file", 1, NULL, KEY_GEN_FILE },
+++ {"key-len", 1, NULL, KEY_LEN },
+++ {"hmac-key-len", 1, NULL, HMAC_KEY_LEN },
+++ {"hmac-digest-type", 1, NULL, HMAC_DIGEST_TYPE },
+++ {"kill", 0, NULL, 'K' },
++ {"fw-flush", 0, NULL, FW_FLUSH },
++ {"fw-list", 0, NULL, FW_LIST },
++ {"fw-list-all", 0, NULL, FW_LIST_ALL },
++diff --git a/server/config_init.c b/server/config_init.c
++index 0ddceee..2f1d293 100644
++--- a/server/config_init.c
+++++ b/server/config_init.c
++@@ -201,6 +201,69 @@ validate_int_var_ranges(fko_srv_options_t *opts)
++ return;
++ }
++
+++/**
+++ * @brief Generate Rijndael + HMAC keys from /dev/urandom (base64 encoded).
+++ *
+++ * @param options FKO command line option structure
+++ */
+++static void
+++generate_keys(fko_srv_options_t *options)
+++{
+++ char key_base64[MAX_B64_KEY_LEN+1];
+++ char hmac_key_base64[MAX_B64_KEY_LEN+1];
+++
+++ FILE *key_gen_file_ptr = NULL;
+++ int res;
+++
+++ /* Set defaults and validate for --key-gen mode
+++ */
+++ if(options->key_len == 0)
+++ options->key_len = FKO_DEFAULT_KEY_LEN;
+++
+++ if(options->hmac_key_len == 0)
+++ options->hmac_key_len = FKO_DEFAULT_HMAC_KEY_LEN;
+++
+++ if(options->hmac_type == 0)
+++ options->hmac_type = FKO_DEFAULT_HMAC_MODE;
+++
+++ /* Zero out the key buffers */
+++ memset(key_base64, 0x00, sizeof(key_base64));
+++ memset(hmac_key_base64, 0x00, sizeof(hmac_key_base64));
+++
+++ /* Generate the key through libfko */
+++ res = fko_key_gen(key_base64, options->key_len,
+++ hmac_key_base64, options->hmac_key_len,
+++ options->hmac_type);
+++
+++ if(res != FKO_SUCCESS)
+++ {
+++ log_msg(LOG_ERR, "%s: fko_key_gen: Error %i - %s",
+++ MY_NAME, res, fko_errstr(res));
+++ clean_exit(options, NO_FW_CLEANUP, EXIT_FAILURE);
+++ }
+++
+++ if(options->key_gen_file[0] != '\0')
+++ {
+++ if ((key_gen_file_ptr = fopen(options->key_gen_file, "w")) == NULL)
+++ {
+++ log_msg(LOG_ERR, "Unable to create key gen file: %s: %s",
+++ options->key_gen_file, strerror(errno));
+++ clean_exit(options, NO_FW_CLEANUP, EXIT_FAILURE);
+++ }
+++ fprintf(key_gen_file_ptr, "KEY_BASE64: %s\nHMAC_KEY_BASE64: %s\n",
+++ key_base64, hmac_key_base64);
+++ fclose(key_gen_file_ptr);
+++ fprintf(stdout, "[+] Wrote Rijndael and HMAC keys to: %s",
+++ options->key_gen_file);
+++ }
+++ else
+++ {
+++ fprintf(stdout, "KEY_BASE64: %s\nHMAC_KEY_BASE64: %s\n",
+++ key_base64, hmac_key_base64);
+++ }
+++ clean_exit(options, NO_FW_CLEANUP, EXIT_SUCCESS);
+++}
+++
++ /* Parse the config file...
++ */
++ static void
++@@ -427,7 +490,7 @@ validate_options(fko_srv_options_t *opts)
++ if(opts->config[CONF_ENABLE_DIGEST_PERSISTENCE] == NULL)
++ set_config_entry(opts, CONF_ENABLE_DIGEST_PERSISTENCE,
++ DEF_ENABLE_DIGEST_PERSISTENCE);
++-
+++
++ /* Enable destination rule.
++ */
++ if(opts->config[CONF_ENABLE_DESTINATION_RULE] == NULL)
++@@ -928,8 +991,9 @@ config_init(fko_srv_options_t *opts, int argc, char **argv)
++
++ /* First, scan the command-line args for -h/--help or an alternate
++ * configuration file. If we find an alternate config file, use it,
++- * otherwise use the default. We also grab any override config files
++- * as well.
+++ * otherwise use the default. We also grab any override config files
+++ * as well. In addition, we handle key generation here since this is
+++ * independent of configuration parsing.
++ */
++ while ((cmd_arg = getopt_long(argc, argv,
++ GETOPTS_OPTION_STRING, cmd_opts, &index)) != -1) {
++@@ -952,6 +1016,45 @@ config_init(fko_srv_options_t *opts, int argc, char **argv)
++ if(got_override_config > 0)
++ break;
++
+++ case 'k':
+++ opts->key_gen = 1;
+++ break;
+++ case KEY_GEN_FILE:
+++ opts->key_gen = 1;
+++ strlcpy(opts->key_gen_file, optarg, sizeof(opts->key_gen_file));
+++ break;
+++ case KEY_LEN: /* used in --key-gen mode only */
+++ opts->key_len = strtol_wrapper(optarg, 1,
+++ MAX_KEY_LEN, NO_EXIT_UPON_ERR, &is_err);
+++ if(is_err != FKO_SUCCESS)
+++ {
+++ log_msg(LOG_ERR,
+++ "Invalid key length '%s', must be in [%d-%d]",
+++ optarg, 1, MAX_KEY_LEN);
+++ clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
+++ }
+++ break;
+++ case HMAC_DIGEST_TYPE: /* used in --key-gen mode only */
+++ if((opts->hmac_type = hmac_digest_strtoint(optarg)) < 0)
+++ {
+++ log_msg(LOG_ERR,
+++ "* Invalid hmac digest type: %s, use {md5,sha1,sha256,sha384,sha512}",
+++ optarg);
+++ clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
+++ }
+++ break;
+++ case HMAC_KEY_LEN: /* used in --key-gen mode only */
+++ opts->hmac_key_len = strtol_wrapper(optarg, 1,
+++ MAX_KEY_LEN, NO_EXIT_UPON_ERR, &is_err);
+++ if(is_err != FKO_SUCCESS)
+++ {
+++ log_msg(LOG_ERR,
+++ "Invalid hmac key length '%s', must be in [%d-%d]",
+++ optarg, 1, MAX_KEY_LEN);
+++ clean_exit(opts, NO_FW_CLEANUP, EXIT_FAILURE);
+++ }
+++ break;
+++
++ /* Look for override configuration file arg.
++ */
++ case 'O':
++@@ -965,6 +1068,9 @@ config_init(fko_srv_options_t *opts, int argc, char **argv)
++ }
++ }
++
+++ if(opts->key_gen)
+++ generate_keys(opts);
+++
++ /* If no alternate configuration file was specified, we use the
++ * default.
++ */
++diff --git a/server/fwknopd_common.h b/server/fwknopd_common.h
++index ecf2a81..8c33eaa 100644
++--- a/server/fwknopd_common.h
+++++ b/server/fwknopd_common.h
++@@ -585,10 +585,14 @@ typedef struct fko_srv_options
++ unsigned char fw_list; /* List current firewall rules */
++ unsigned char fw_list_all; /* List all current firewall rules */
++ unsigned char fw_flush; /* Flush current firewall rules */
+++ unsigned char key_gen; /* Generate keys and exit */
+++ unsigned char exit_after_parse_config; /* Parse config and exit */
+++
+++ /* Operational flags
+++ */
++ unsigned char test; /* Test mode flag */
++ unsigned char afl_fuzzing; /* SPA pkts from stdin for AFL fuzzing */
++ unsigned char verbose; /* Verbose mode flag */
++- unsigned char exit_after_parse_config; /* Parse config and exit */
++ unsigned char enable_udp_server; /* Enable UDP server mode */
++
++ unsigned char firewd_disable_check_support; /* Don't use firewall-cmd ... -C */
++@@ -605,6 +609,13 @@ typedef struct fko_srv_options
++ int tcp_server_pid;
++ int lock_fd;
++
+++ /* Values used in --key-gen mode only
+++ */
+++ char key_gen_file[MAX_PATH_LEN];
+++ int key_len;
+++ int hmac_key_len;
+++ int hmac_type;
+++
++ #if USE_FILE_CACHE
++ struct digest_cache_list *digest_cache; /* In-memory digest cache list */
++ #endif
++diff --git a/test/tests/basic_operations.pl b/test/tests/basic_operations.pl
++index f4dde2e..76a509d 100644
++--- a/test/tests/basic_operations.pl
+++++ b/test/tests/basic_operations.pl
++@@ -390,6 +390,14 @@
++ 'exec_err' => $YES,
++ 'cmdline' => "$default_client_args --key-gen -K " . 'A'x1030
++ },
+++ {
+++ 'category' => 'basic operations',
+++ 'subcategory' => 'server',
+++ 'detail' => '--key-gen file path (-K) too long',
+++ 'function' => \&generic_exec,
+++ 'exec_err' => $YES,
+++ 'cmdline' => "$fwknopdCmd --key-gen --key-gen-file " . 'A'x1030
+++ },
++
++ {
++ 'category' => 'basic operations',
++diff --git a/test/tests/rijndael.pl b/test/tests/rijndael.pl
++index 26aab6a..34af65e 100644
++--- a/test/tests/rijndael.pl
+++++ b/test/tests/rijndael.pl
++@@ -421,33 +421,6 @@
++ 'key_file' => $cf{'rc_named_key'},
++ },
++
++- ### --key-gen tests
++- {
++- 'category' => 'Rijndael',
++- 'subcategory' => 'client',
++- 'detail' => '--key-gen',
++- 'function' => \&generic_exec,
++- 'cmdline' => "$fwknopCmd --key-gen",
++- 'positive_output_matches' => [qr/^KEY_BASE64\:?\s\S{10}/,
++- qw/HMAC_KEY_BASE64\:?\s\S{10}/],
++- },
++- {
++- 'category' => 'Rijndael',
++- 'subcategory' => 'client',
++- 'detail' => "--key-gen $uniq_keys key uniqueness",
++- 'function' => \&key_gen_uniqueness,
++- 'cmdline' => "$fwknopCmd --key-gen", ### no valgrind string (too slow for 100 client exec's)
++- 'disable_valgrind' => $YES,
++- },
++- {
++- 'category' => 'Rijndael',
++- 'subcategory' => 'client',
++- 'detail' => '--key-gen to file',
++- 'function' => \&generic_exec,
++- 'cmdline' => "$fwknopCmd --key-gen --key-gen-file $key_gen_file",
++- 'positive_output_matches' => [qr/Wrote.*\skeys/],
++- },
++-
++ ### rc file tests
++ {
++ 'category' => 'Rijndael',
++diff --git a/test/tests/rijndael_hmac.pl b/test/tests/rijndael_hmac.pl
++index fc1a8af..fd80f04 100644
++--- a/test/tests/rijndael_hmac.pl
+++++ b/test/tests/rijndael_hmac.pl
++@@ -58,6 +58,59 @@
++ 'exec_err' => $YES,
++ },
++
+++ ### --key-gen tests
+++ {
+++ 'category' => 'Rijndael+HMAC',
+++ 'subcategory' => 'client',
+++ 'detail' => '--key-gen',
+++ 'function' => \&generic_exec,
+++ 'cmdline' => "$fwknopCmd --key-gen",
+++ 'positive_output_matches' => [qr/^KEY_BASE64\:?\s\S{10}/,
+++ qw/HMAC_KEY_BASE64\:?\s\S{10}/],
+++ },
+++ {
+++ 'category' => 'Rijndael+HMAC',
+++ 'subcategory' => 'server',
+++ 'detail' => '--key-gen',
+++ 'function' => \&generic_exec,
+++ 'cmdline' => "$fwknopdCmd --key-gen",
+++ 'positive_output_matches' => [qr/^KEY_BASE64\:?\s\S{10}/,
+++ qw/HMAC_KEY_BASE64\:?\s\S{10}/],
+++ },
+++ {
+++ 'category' => 'Rijndael+HMAC',
+++ 'subcategory' => 'client',
+++ 'detail' => "--key-gen $uniq_keys key uniqueness",
+++ 'function' => \&key_gen_uniqueness,
+++ 'cmdline' => "$fwknopCmd --key-gen", ### no valgrind string (too slow for 100 exec's)
+++ 'disable_valgrind' => $YES,
+++ },
+++ {
+++ 'category' => 'Rijndael+HMAC',
+++ 'subcategory' => 'server',
+++ 'detail' => "--key-gen $uniq_keys key uniqueness",
+++ 'function' => \&key_gen_uniqueness,
+++ 'cmdline' => "$fwknopdCmd --key-gen", ### no valgrind string (too slow for 100 exec's)
+++ 'disable_valgrind' => $YES,
+++ },
+++ {
+++ 'category' => 'Rijndael+HMAC',
+++ 'subcategory' => 'client',
+++ 'detail' => '--key-gen to file',
+++ 'function' => \&generic_exec,
+++ 'cmdline' => "$fwknopCmd --key-gen --key-gen-file $key_gen_file",
+++ 'positive_output_matches' => [qr/Wrote.*\skeys/],
+++ },
+++ {
+++ 'category' => 'Rijndael+HMAC',
+++ 'subcategory' => 'server',
+++ 'detail' => '--key-gen to file',
+++ 'function' => \&generic_exec,
+++ 'cmdline' => "$fwknopdCmd --key-gen --key-gen-file $key_gen_file",
+++ 'positive_output_matches' => [qr/Wrote.*\skeys/],
+++ },
+++
+++ ### complete cycle tests
++ {
++ 'category' => 'Rijndael+HMAC',
++ 'subcategory' => 'client+server',
+diff --git a/feeds/packages/net/git/Makefile b/feeds/packages/net/git/Makefile
+new file mode 100644
+index 0000000..3f646fc
+--- /dev/null
++++ b/feeds/packages/net/git/Makefile
+@@ -0,0 +1,114 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=git
++PKG_VERSION:=2.6.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@KERNEL/software/scm/git/
++PKG_MD5SUM:=6b7d43d615fb3f0dfecf4d131e23f438
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/git/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Version Control Systems
++ DEPENDS:=+libopenssl +libpthread +librt
++ TITLE:=The fast version control system
++ URL:=http://git-scm.com
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++endef
++
++define Package/git
++$(call Package/git/Default)
++ DEPENDS:=+libopenssl +libpthread +librt
++ TITLE:=The fast version control system
++endef
++
++define Package/git/description
++ Git is a free & open source, distributed version control system
++ designed to handle everything from small to very large projects
++ with speed and efficiency.
++endef
++
++define Package/git-http
++$(call Package/git/Default)
++ DEPENDS:=git +libcurl +ca-certificates
++ TITLE:=Git HTTP commands
++endef
++
++define Package/git-http/description
++$(call Package/git/description)
++
++ This package allows git push/fetch over http(s) and ftp(s)
++endef
++
++MAKE_FLAGS := \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ CPPFLAGS="$(TARGET_CPPFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ NO_EXPAT="YesPlease" \
++ NO_MKSTEMPS="YesPlease" \
++ NO_GETTEXT="YesPlease" \
++ NO_UNIX_SOCKETS="YesPlease" \
++ NO_ICONV="YesPlease" \
++ NO_NSEC="YesPlease" \
++ NO_PERL="YesPlease" \
++ NO_PYTHON="YesPlease" \
++ NO_TCLTK="YesPlease" \
++ NO_INSTALL_HARDLINKS="yes" \
++
++CONFIGURE_ARGS += \
++ --without-iconv \
++
++define Build/Configure
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ configure
++
++ $(call Build/Configure/Default,)
++endef
++
++define Package/git/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/git $(1)/usr/bin
++ $(RM) $(PKG_INSTALL_DIR)/usr/bin/git-cvsserver
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/git-* $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/lib/git-core
++ $(LN) /usr/bin/git $(1)/usr/lib/git-core/git
++ ( cd $(PKG_INSTALL_DIR); $(TAR) \
++ --exclude=usr/lib/git-core/git-http-backend \
++ --exclude=usr/lib/git-core/git-http-fetch \
++ --exclude=usr/lib/git-core/git-remote-ftp \
++ --exclude=usr/lib/git-core/git-remote-ftps \
++ --exclude=usr/lib/git-core/git-remote-http \
++ --exclude=usr/lib/git-core/git-remote-https \
++ -cf - \
++ usr/lib/git-core \
++ ) | ( cd $(1); $(TAR) -xf - )
++endef
++
++define Package/git-http/install
++ $(INSTALL_DIR) $(1)/usr/lib/git-core
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/git-core/git-http-backend $(1)/usr/lib/git-core
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/git-core/git-http-fetch $(1)/usr/lib/git-core
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/git-core/git-remote-ftp $(1)/usr/lib/git-core
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/git-core/git-remote-ftps $(1)/usr/lib/git-core
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/git-core/git-remote-http $(1)/usr/lib/git-core
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/git-core/git-remote-https $(1)/usr/lib/git-core
++endef
++
++$(eval $(call BuildPackage,git))
++$(eval $(call BuildPackage,git-http))
+diff --git a/feeds/packages/net/git/patches/100-convert_builtin.patch b/feeds/packages/net/git/patches/100-convert_builtin.patch
+new file mode 100644
+index 0000000..b4920a5
+--- /dev/null
++++ b/feeds/packages/net/git/patches/100-convert_builtin.patch
+@@ -0,0 +1,219 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -549,16 +549,7 @@ EXTRA_PROGRAMS =
++ # ... and all the rest that could be moved out of bindir to gitexecdir
++ PROGRAMS += $(EXTRA_PROGRAMS)
++
++-PROGRAM_OBJS += credential-store.o
++-PROGRAM_OBJS += daemon.o
++-PROGRAM_OBJS += fast-import.o
++ PROGRAM_OBJS += http-backend.o
++-PROGRAM_OBJS += imap-send.o
++-PROGRAM_OBJS += sh-i18n--envsubst.o
++-PROGRAM_OBJS += shell.o
++-PROGRAM_OBJS += show-index.o
++-PROGRAM_OBJS += upload-pack.o
++-PROGRAM_OBJS += remote-testsvn.o
++
++ # Binary suffix, set to .exe for Windows builds
++ X =
++@@ -907,6 +898,11 @@ BUILTIN_OBJS += builtin/verify-commit.o
++ BUILTIN_OBJS += builtin/verify-pack.o
++ BUILTIN_OBJS += builtin/verify-tag.o
++ BUILTIN_OBJS += builtin/write-tree.o
+++BUILTIN_OBJS += builtin/daemon.o
+++BUILTIN_OBJS += builtin/fast-import.o
+++BUILTIN_OBJS += builtin/imap-send.o
+++BUILTIN_OBJS += builtin/shell.o
+++BUILTIN_OBJS += builtin/upload-pack.o
++
++ GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
++ EXTLIBS =
++@@ -1089,7 +1085,7 @@ endif
++ EXTLIBS += -lz
++
++ ifndef NO_OPENSSL
++- OPENSSL_LIBSSL = -lssl
+++ EXTLIBS += -lssl
++ ifdef OPENSSLDIR
++ BASIC_CFLAGS += -I$(OPENSSLDIR)/include
++ OPENSSL_LINK = -L$(OPENSSLDIR)/$(lib) $(CC_LD_DYNPATH)$(OPENSSLDIR)/$(lib)
++@@ -1956,10 +1952,6 @@ endif
++ git-%$X: %.o GIT-LDFLAGS $(GITLIBS)
++ $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
++
++-git-imap-send$X: imap-send.o $(IMAP_SEND_BUILDDEPS) GIT-LDFLAGS $(GITLIBS)
++- $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
++- $(LIBS) $(IMAP_SEND_LDFLAGS)
++-
++ git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS)
++ $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
++ $(LIBS) $(CURL_LIBCURL)
++@@ -2279,10 +2271,11 @@ endif
++ bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
++ execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
++ { test "$$bindir/" = "$$execdir/" || \
++- for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
+++ for p in $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
++ $(RM) "$$execdir/$$p" && \
++ test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
++ ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
+++ ln -s git "$$execdir/$$p" 2>/dev/null || \
++ cp "$$bindir/$$p" "$$execdir/$$p" || exit; \
++ done; \
++ } && \
++--- a/builtin.h
+++++ b/builtin.h
++@@ -138,5 +138,10 @@ extern int cmd_verify_pack(int argc, con
++ extern int cmd_show_ref(int argc, const char **argv, const char *prefix);
++ extern int cmd_pack_refs(int argc, const char **argv, const char *prefix);
++ extern int cmd_replace(int argc, const char **argv, const char *prefix);
+++extern int cmd_daemon(int argc, char **argv, const char *prefix);
+++extern int cmd_fast_import(int argc, char **argv, const char *prefix);
+++extern int cmd_imap_send(int argc, char **argv, const char *prefix);
+++extern int cmd_shell(int argc, char **argv, const char *prefix);
+++extern int cmd_upload_pack(int argc, char **argv, const char *prefix);
++
++ #endif
++--- /dev/null
+++++ b/builtin/daemon.c
++@@ -0,0 +1 @@
+++#include "../daemon.c"
++--- /dev/null
+++++ b/builtin/fast-import.c
++@@ -0,0 +1 @@
+++#include "../fast-import.c"
++--- /dev/null
+++++ b/builtin/imap-send.c
++@@ -0,0 +1 @@
+++#include "../imap-send.c"
++--- /dev/null
+++++ b/builtin/shell.c
++@@ -0,0 +1 @@
+++#include "../shell.c"
++--- /dev/null
+++++ b/builtin/upload-pack.c
++@@ -0,0 +1 @@
+++#include "../upload-pack.c"
++--- a/daemon.c
+++++ b/daemon.c
++@@ -1192,7 +1192,7 @@ static int serve(struct string_list *lis
++ return service_loop(&socklist);
++ }
++
++-int main(int argc, char **argv)
+++int cmd_daemon(int argc, char **argv, const char *prefix)
++ {
++ int listen_port = 0;
++ struct string_list listen_addr = STRING_LIST_INIT_NODUP;
++@@ -1388,12 +1388,13 @@ int main(int argc, char **argv)
++ store_pid(pid_file);
++
++ /* prepare argv for serving-processes */
++- cld_argv = xmalloc(sizeof (char *) * (argc + 2));
++- cld_argv[0] = argv[0]; /* git-daemon */
++- cld_argv[1] = "--serve";
+++ cld_argv = xmalloc(sizeof (char *) * (argc + 3));
+++ cld_argv[0] = "git";
+++ cld_argv[1] = argv[0]; /* daemon */
+++ cld_argv[2] = "--serve";
++ for (i = 1; i < argc; ++i)
++- cld_argv[i+1] = argv[i];
++- cld_argv[argc+1] = NULL;
+++ cld_argv[i+2] = argv[i];
+++ cld_argv[argc+2] = NULL;
++
++ return serve(&listen_addr, listen_port, cred);
++ }
++--- a/fast-import.c
+++++ b/fast-import.c
++@@ -3351,7 +3351,7 @@ static void parse_argv(void)
++ read_marks();
++ }
++
++-int main(int argc, char **argv)
+++int cmd_fast_import(int argc, char **argv, const char *prefix)
++ {
++ unsigned int i;
++
++--- a/git.c
+++++ b/git.c
++@@ -311,11 +311,11 @@ static int handle_alias(int *argcp, cons
++
++ struct cmd_struct {
++ const char *cmd;
++- int (*fn)(int, const char **, const char *);
+++ int (*fn)(int, char **, const char *);
++ int option;
++ };
++
++-static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
+++static int run_builtin(struct cmd_struct *p, int argc, char **argv)
++ {
++ int status, help;
++ struct stat st;
++@@ -395,6 +395,7 @@ static struct cmd_struct commands[] = {
++ { "config", cmd_config, RUN_SETUP_GENTLY },
++ { "count-objects", cmd_count_objects, RUN_SETUP },
++ { "credential", cmd_credential, RUN_SETUP_GENTLY },
+++ { "daemon", cmd_daemon },
++ { "describe", cmd_describe, RUN_SETUP },
++ { "diff", cmd_diff },
++ { "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE },
++@@ -413,6 +414,7 @@ static struct cmd_struct commands[] = {
++ { "grep", cmd_grep, RUN_SETUP_GENTLY },
++ { "hash-object", cmd_hash_object },
++ { "help", cmd_help },
+++ { "imap-send", cmd_imap_send },
++ { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY },
++ { "init", cmd_init_db, NO_SETUP },
++ { "init-db", cmd_init_db, NO_SETUP },
++@@ -461,6 +463,7 @@ static struct cmd_struct commands[] = {
++ { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
++ { "rm", cmd_rm, RUN_SETUP },
++ { "send-pack", cmd_send_pack, RUN_SETUP },
+++ { "shell", cmd_shell },
++ { "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },
++ { "show", cmd_show, RUN_SETUP },
++ { "show-branch", cmd_show_branch, RUN_SETUP },
++@@ -477,6 +480,7 @@ static struct cmd_struct commands[] = {
++ { "update-server-info", cmd_update_server_info, RUN_SETUP },
++ { "upload-archive", cmd_upload_archive },
++ { "upload-archive--writer", cmd_upload_archive_writer },
+++ { "upload-pack", cmd_upload_pack },
++ { "var", cmd_var, RUN_SETUP_GENTLY },
++ { "verify-commit", cmd_verify_commit, RUN_SETUP },
++ { "verify-pack", cmd_verify_pack },
++--- a/imap-send.c
+++++ b/imap-send.c
++@@ -1492,7 +1492,7 @@ static int curl_append_msgs_to_imap(stru
++ }
++ #endif
++
++-int main(int argc, char **argv)
+++int cmd_imap_send(int argc, char **argv, const char *prefix)
++ {
++ struct strbuf all_msgs = STRBUF_INIT;
++ int total;
++--- a/shell.c
+++++ b/shell.c
++@@ -138,7 +138,7 @@ static struct commands {
++ { NULL },
++ };
++
++-int main(int argc, char **argv)
+++int cmd_shell(int argc, char **argv, const char *prefix)
++ {
++ char *prog;
++ const char **user_argv;
++--- a/upload-pack.c
+++++ b/upload-pack.c
++@@ -797,7 +797,7 @@ static int upload_pack_config(const char
++ return parse_hide_refs_config(var, value, "uploadpack");
++ }
++
++-int main(int argc, char **argv)
+++int cmd_upload_pack(int argc, char **argv, const char *prefix)
++ {
++ char *dir;
++ int i;
+diff --git a/feeds/packages/net/git/patches/200-disable_fasthash.patch b/feeds/packages/net/git/patches/200-disable_fasthash.patch
+new file mode 100644
+index 0000000..91f255f
+--- /dev/null
++++ b/feeds/packages/net/git/patches/200-disable_fasthash.patch
+@@ -0,0 +1,12 @@
++--- a/config.mak.uname
+++++ b/config.mak.uname
++@@ -17,9 +17,6 @@ endif
++ # because maintaining the nesting to match is a pain. If
++ # we had "elif" things would have been much nicer...
++
++-ifeq ($(uname_M),x86_64)
++- XDL_FAST_HASH = YesPlease
++-endif
++ ifeq ($(uname_S),OSF1)
++ # Need this for u_short definitions et al
++ BASIC_CFLAGS += -D_OSF_SOURCE
+diff --git a/feeds/packages/net/git/patches/300-configure_for_crosscompiling b/feeds/packages/net/git/patches/300-configure_for_crosscompiling
+new file mode 100644
+index 0000000..0ccfaec
+--- /dev/null
++++ b/feeds/packages/net/git/patches/300-configure_for_crosscompiling
+@@ -0,0 +1,32 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -844,7 +844,8 @@ AC_RUN_IFELSE(
++ FILE *f = fopen(".", "r");
++ return f && fread(&c, 1, 1, f)]])],
++ [ac_cv_fread_reads_directories=no],
++- [ac_cv_fread_reads_directories=yes])
+++ [ac_cv_fread_reads_directories=yes],
+++ [ac_cv_fread_reads_directories=no])
++ ])
++ if test $ac_cv_fread_reads_directories = yes; then
++ FREAD_READS_DIRECTORIES=UnfortunatelyYes
++@@ -878,7 +879,8 @@ AC_RUN_IFELSE(
++ if (snprintf(buf, 3, "%s", "12345") != 5
++ || strcmp(buf, "12")) return 1]])],
++ [ac_cv_snprintf_returns_bogus=no],
++- [ac_cv_snprintf_returns_bogus=yes])
+++ [ac_cv_snprintf_returns_bogus=yes],
+++ [ac_cv_snprintf_returns_bogus=no])
++ ])
++ if test $ac_cv_snprintf_returns_bogus = yes; then
++ SNPRINTF_RETURNS_BOGUS=UnfortunatelyYes
++@@ -901,7 +903,8 @@ yippeeyeswehaveit
++ #endif
++ ]),
++ [ac_cv_sane_mode_bits=yes],
++- [ac_cv_sane_mode_bits=no])
+++ [ac_cv_sane_mode_bits=no],
+++ [ac_cv_sane_mode_bits=yes])
++ ])
++ if test $ac_cv_sane_mode_bits = yes; then
++ NEEDS_MODE_TRANSLATION=
+diff --git a/feeds/packages/net/git/patches/400-imapsend_without_curl.patch b/feeds/packages/net/git/patches/400-imapsend_without_curl.patch
+new file mode 100644
+index 0000000..e96330c
+--- /dev/null
++++ b/feeds/packages/net/git/patches/400-imapsend_without_curl.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -1058,7 +1058,7 @@ else
++ endif
++ curl_check := $(shell (echo 072200; curl-config --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
++ ifeq "$(curl_check)" "072200"
++- USE_CURL_FOR_IMAP_SEND = YesPlease
+++# USE_CURL_FOR_IMAP_SEND = YesPlease
++ endif
++ ifdef USE_CURL_FOR_IMAP_SEND
++ BASIC_CFLAGS += -DUSE_CURL_FOR_IMAP_SEND
+diff --git a/feeds/packages/net/gnunet/Makefile b/feeds/packages/net/gnunet/Makefile
+new file mode 100644
+index 0000000..1a304fc
+--- /dev/null
++++ b/feeds/packages/net/gnunet/Makefile
+@@ -0,0 +1,262 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gnunet
++PKG_SOURCE_VERSION:=36366
++PKG_VERSION:=0.10.1-svn$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++
++# ToDo:
++# - break-out {peer,name,data}store for each backend
++# - package testing stuff
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://gnunet.org/svn/gnunet/
++PKG_SOURCE_PROTO:=svn
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=gettext-version
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++CONFIGURE_ARGS+= \
++ --with-libiconv-prefix="$(ICONV_PREFIX)" \
++ --with-libintl-prefix="$(INTL_PREFIX)" \
++ --with-ltdl \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-mysql),--with-mysql="$(STAGING_DIR)/usr",--without-mysql) \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-pgsql),--with-postgresql="$(STAGING_DIR)/usr/bin/pg_config",--without-postgresql) \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-sqlite),--with-sqlite="$(STAGING_DIR)/usr",--without-sqlite) \
++ --with-extractor=$(STAGING_DIR)/usr \
++ --with-gnutls=$(STAGING_DIR)/usr \
++ --with-libgnurl=$(STAGING_DIR)/usr \
++ --with-libunistring-prefix=$(STAGING_DIR)/usr \
++ --with-microhttpd=$(STAGING_DIR)/usr
++
++# ToDo: request upstream to provide --with-pulseaudio=...
++TARGET_LDFLAGS+= -Wl,-rpath-link=$(STAGING_DIR)/usr/lib/pulseaudio
++
++define Package/gnunet/Default
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=GNUnet
++ URL:=https://www.gnunet.org/
++endef
++
++define Package/gnunet
++$(call Package/gnunet/Default)
++ TITLE+= - a peer-to-peer framework focusing on security
++ DEPENDS:=+ca-certificates +libgnurl +libgnutls +libidn +libltdl \
++ +libmicrohttpd +libunistring +librt $(ICONV_DEPENDS) $(INTL_DEPENDS)
++ USERID:=gnunet=400:gnunet=400
++ MENU:=1
++endef
++
++define Package/gnunet/description
++ GNUnet is a peer-to-peer framework focusing on security. The first and
++ primary application for GNUnet is anonymous file-sharing. GNUnet is
++ currently developed by a worldwide group of independent free software
++ developers. GNUnet is a GNU package (http://www.gnu.org/).
++
++ This is an ALPHA release. There are known and significant bugs as
++ well as many missing features in this release.
++
++ This package provides the core components of GNUnet including the
++ CADET routing engine, a DHT implementation and basic transports as
++ well as their helpers.
++endef
++
++define BuildComponent
++ define Package/gnunet-$(1)
++ $$(call Package/gnunet/Default)
++ TITLE+= $(2)
++ DEPENDS:=gnunet $(DEPENDS_$(1))
++ $(if $(3),DEFAULT:=y if PACKAGE_gnunet)
++ $(if $(USERID_$(1)),USERID:=$(USERID_$(1)))
++ endef
++
++ define Package/gnunet-$(1)/install
++ ( if [ "$(BIN_$(1))" ]; then \
++ $(INSTALL_DIR) $$(1)/usr/bin ; \
++ for bin in $(BIN_$(1)); do \
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/gnunet-$$$$$$$$bin $$(1)/usr/bin/ ; \
++ done \
++ fi )
++
++ ( if [ "$(LIB_$(1))" ]; then \
++ $(INSTALL_DIR) $$(1)/usr/lib ; \
++ for lib in $(LIB_$(1)); do \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgnunet$$$$$$$$lib.so* $$(1)/usr/lib/ ; \
++ done \
++ fi )
++
++ ( if [ "$(PLUGIN_$(1))" ]; then \
++ $(INSTALL_DIR) $$(1)/usr/lib/gnunet ; \
++ for plug in $(PLUGIN_$(1)); do \
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/gnunet/libgnunet_plugin_$$$$$$$$plug*.so $$(1)/usr/lib/gnunet ; \
++ done \
++ fi )
++
++ ( if [ "$(LIBEXEC_$(1))" ]; then \
++ $(INSTALL_DIR) $$(1)/usr/lib/gnunet/libexec ; \
++ for lex in $(LIBEXEC_$(1)); do \
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/gnunet/libexec/gnunet-$$$$$$$$lex $$(1)/usr/lib/gnunet/libexec ; \
++ done \
++ fi )
++
++ ( if [ "$(CONF_$(1))" ]; then \
++ $(INSTALL_DIR) $$(1)/usr/share/gnunet/config.d ; \
++ for conf in $(CONF_$(1)); do \
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/gnunet/config.d/$$$$$$$$conf.conf $$(1)/usr/share/gnunet/config.d ; \
++ done \
++ fi )
++ endef
++
++ $$(eval $$(call BuildPackage,gnunet-$(1)))
++endef
++
++define Package/gnunet/install
++ $(INSTALL_DIR) $(1)/usr/bin $(1)/usr/lib/gnunet/libexec
++ $(INSTALL_DIR) $(1)/usr/share/gnunet/config.d $(1)/usr/share/gnunet/hellos
++
++ ( for bin in arm ats core config ecc identity nat-server nse \
++ peerinfo peerstore revocation scalarproduct statistics transport uri; do \
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/gnunet-$$$$bin $(1)/usr/bin/ ; \
++ done )
++
++ ( for lib in arm ats block cadet core datacache dht \
++ dns dnsparser dnsstub fragmentation friends hello identity nat nse \
++ peerinfo peerstore regexblock regex revocation scalarproduct set \
++ statistics transport util; do \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgnunet$$$$lib.so* $(1)/usr/lib/ ; \
++ done )
++
++ ( for plug in ats_proportional block_dht block_regex datacache_heap \
++ transport_tcp transport_udp transport_unix; do \
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/gnunet/libgnunet_plugin_$$$$plug*.so $(1)/usr/lib/gnunet ; \
++ done )
++
++ ( for lex in daemon-hostlist daemon-topology helper-nat-client \
++ helper-nat-server service-arm service-ats service-cadet \
++ service-core service-dht service-identity service-nse \
++ service-peerinfo service-peerstore service-regex \
++ service-revocation service-scalarproduct-alice \
++ service-scalarproduct-bob service-set service-statistics \
++ service-transport; do \
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/gnunet/libexec/gnunet-$$$$lex $(1)/usr/lib/gnunet/libexec ; \
++ done )
++
++ ( for conf in arm ats cadet core datacache dht hostlist identity \
++ nat nse peerinfo peerstore regex revocation scalarproduct \
++ set statistics topology transport util; do \
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/gnunet/config.d/$$$$conf.conf $(1)/usr/share/gnunet/config.d ; \
++ done )
++
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/gnunet/hellos/* $(1)/usr/share/gnunet/hellos
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/gnunet.init $(1)/etc/init.d/gnunet
++ $(INSTALL_DIR) $(1)/lib/upgrade/keep.d
++ $(INSTALL_DATA) ./files/gnunet.upgrade $(1)/lib/upgrade/keep.d/gnunet
++ $(INSTALL_DIR) $(1)/etc/uci-defaults
++ $(INSTALL_BIN) ./files/gnunet.defaults $(1)/etc/uci-defaults/gnunet
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/gnunet $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.{la,so}* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/*.pc $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/gnunet/*.h $(1)/usr/include/gnunet
++endef
++
++DEPENDS_conversation:=+gnunet-gns +libgst1app +libgst1audio +libgstreamer1 +glib2 +pulseaudio-daemon +libopus +libogg
++BIN_conversation:=conversation conversation-test
++LIB_conversation:=conversation microphone speaker
++PLUGIN_conversation:=gnsrecord_conversation
++LIBEXEC_conversation:=helper-audio-playback helper-audio-record
++CONF_conversation:=conversation
++
++DEPENDS_transport-http_client:=+libgnurl
++PLUGIN_transport-http_client:=transport_http_client transport_https_client
++
++DEPENDS_transport-http_server:=+libmicrohttpd
++PLUGIN_transport-http_server:=transport_http_server transport_https_server
++
++PLUGIN_transport-wlan:=transport_wlan
++LIBEXEC_transport-wlan:=helper-transport-wlan
++
++DEPENDS_experiments:=+libglpk
++PLUGIN_experiments:=ats_mlp ats_ril
++
++DEPENDS_fs:=+gnunet-datastore +libextractor
++BIN_fs:=auto-share directory download download-manager.scm fs publish unindex search
++LIB_fs:=fs
++PLUGIN_fs:=block_fs
++LIBEXEC_fs:=helper-fs-publish service-fs
++CONF_fs:=fs
++
++DEPENDS_gns:=+gnunet-vpn
++USERID_gns:=gnunetdns=401:gnunetdns=401
++BIN_gns:=gns gns-import.sh namecache namestore resolver
++LIB_gns:=gns gnsrecord namecache namestore
++PLUGIN_gns:=block_dns block_gns gnsrecord_dns gnsrecord_gns
++LIBEXEC_gns:=dns2gns gns-proxy helper-dns namestore-fcfsd service-dns service-gns service-namecache service-namestore service-resolver
++CONF_gns:=dns gns namecache namestore resolver
++
++DEPENDS_datastore:=+gnunet-gns +libsqlite3
++BIN_datastore:=datastore
++LIB_datastore:=datastore
++PLUGIN_datastore:=datastore_heap
++LIBEXEC_datastore:=daemon-latency-logger service-datastore
++CONF_datastore:=datastore
++
++DEPENDS_mysql:=+gnunet-gns +gnunet-datastore +libmysqlclient
++LIB_mysql:=mysql
++PLUGIN_mysql:=datastore_mysql
++
++DEPENDS_pgsql:=+gnunet-gns +gnunet-datastore +libpq
++LIB_pgsql:=postgres
++PLUGIN_pgsql:=datacache_postgres datastore_postgres namecache_postgres namestore_postgres
++
++DEPENDS_sqlite:=+gnunet-gns +gnunet-datastore +libsqlite3
++PLUGIN_sqlite:=datacache_sqlite datastore_sqlite namecache_sqlite namestore_sqlite peerstore_sqlite
++
++DEPENDS_transport-bluetooth:=+bluez-libs
++PLUGIN_transport-bluetooth:=transport_bluetooth
++LIBEXEC_transport-bluetooth:=helper-transport-bluetooth
++
++DEPENDS_utils:=+certtool +openssl-util
++BIN_utils:=gns-proxy-setup-ca transport-certificate-creation
++
++DEPENDS_vpn:=+kmod-tun +iptables
++BIN_vpn:=vpn
++LIB_vpn:=tun vpn
++LIBEXEC_vpn:=daemon-exit daemon-pt helper-exit helper-vpn service-vpn
++CONF_vpn:=exit pt vpn
++
++$(eval $(call BuildPackage,gnunet))
++$(eval $(call BuildComponent,conversation,conversation component,))
++$(eval $(call BuildComponent,experiments,experimental components,))
++$(eval $(call BuildComponent,fs,file-sharing components,))
++$(eval $(call BuildComponent,gns,name resolution components,y))
++$(eval $(call BuildComponent,datastore,storage components,))
++$(eval $(call BuildComponent,transport-bluetooth,bluetooth transport,))
++$(eval $(call BuildComponent,transport-http_client,HTTP/HTTPS client transport,y))
++$(eval $(call BuildComponent,transport-http_server,HTTP/HTTPS server transport,))
++$(eval $(call BuildComponent,transport-wlan,WLAN transport,))
++$(eval $(call BuildComponent,utils,administration utililties,))
++$(eval $(call BuildComponent,vpn,vpn components,y))
++$(eval $(call BuildComponent,mysql,mySQL datastore backend,))
++$(eval $(call BuildComponent,pgsql,PostgreSQL backends,))
++$(eval $(call BuildComponent,sqlite,libsqlite3 backends,y))
+diff --git a/feeds/packages/net/gnunet/files/gnunet.defaults b/feeds/packages/net/gnunet/files/gnunet.defaults
+new file mode 100644
+index 0000000..8b76919
+--- /dev/null
++++ b/feeds/packages/net/gnunet/files/gnunet.defaults
+@@ -0,0 +1,36 @@
++#!/bin/sh
++
++[ -e /etc/config/gnunet ] && exit 0
++
++touch /etc/config/gnunet
++
++uci set gnunet.datastore=gnunet-config
++uci set gnunet.datastore.DATABASE=heap
++uci set gnunet.datastore.QUOTA="4 MB"
++
++uci set gnunet.fs=gnunet-config
++uci set gnunet.fs.CONTENT_PUSHING=NO
++uci set gnunet.fs.CONTENT_CACHING=NO
++
++# limit dhtcache memory usage to 4 MB
++uci set gnunet.dhtcache=gnunet-config
++uci set gnunet.dhtcache.QUOTA="4 MB"
++
++# enable dns2gns
++uci set gnunet.dns2gns=gnunet-config
++uci set gnunet.dns2gns.AUTOSTART=YES
++uci set gnunet.dns2gns.FORCESTART=YES
++
++# enable v4/v6 protocol translation for EXIT/VPN
++uci set gnunet.pt=gnunet-config
++uci set gnunet.pt.FORCESTART=YES
++
++uci set gnunet.exit=gnunet-config
++uci set gnunet.exit.AUTOSTART=YES
++uci set gnunet.exit.FORCESTART=YES
++
++# increase WORKDELAY to something more sane on small CPUs
++uci set gnunet.nse=gnunet-config
++uci set gnunet.nse.WORKDELAY='500 ms'
++
++uci commit gnunet
+diff --git a/feeds/packages/net/gnunet/files/gnunet.init b/feeds/packages/net/gnunet/files/gnunet.init
+new file mode 100644
+index 0000000..aa87422
+--- /dev/null
++++ b/feeds/packages/net/gnunet/files/gnunet.init
+@@ -0,0 +1,101 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=50
++STOP=10
++
++USE_PROCD=1
++PROG=/usr/lib/gnunet/libexec/gnunet-service-arm
++
++GNUNET_HOME=/var/run/gnunet
++LOGFILE=$GNUNET_HOME/gnunet.log
++CONFIGFILE=$GNUNET_HOME/gnunet.conf
++SUID_ROOT_HELPERS="exit nat-server nat-client transport-bluetooth transport-wlan vpn"
++
++chmodown_execbin() {
++ execname=/usr/lib/gnunet/libexec/gnunet-$1
++ if [ -x $execname ]; then
++ chmod $2 $execname
++ [ "$3" ] && chown $3 $execname
++ fi
++}
++
++fix_libexec_permissions() {
++ [ -e /usr/share/gnunet/.permfix ] && return
++ for helper in $SUID_ROOT_HELPERS; do
++ chmodown_execbin helper-$helper u+s
++ done
++ chmodown_execbin helper-dns 4750 root:gnunetdns
++ chmodown_execbin service-dns 2750 root:gnunetdns
++
++ touch /usr/share/gnunet/.permfix
++}
++
++prepare_config() {
++ if [ ! -e "$GNUNET_HOME" ]; then
++ mkdir -p $GNUNET_HOME
++ chown gnunet:gnunet $GNUNET_HOME
++ chmod 0750 $GNUNET_HOME
++ fi
++ touch $CONFIGFILE
++ chown root:gnunet $CONFIGFILE
++ chmod 0640 $CONFIGFILE
++ gnunet-config -c $CONFIGFILE -s PATHS -o GNUNET_HOME -V $GNUNET_HOME
++
++ # minimal persistency in /etc/gnunet
++ [ ! -d /etc/gnunet ] && {
++ mkdir -p /etc/gnunet
++ chown gnunet:gnunet /etc/gnunet
++ }
++
++ # defaults paths
++ gnunet-config -c $CONFIGFILE -s PATHS -o GNUNET_CONFIG_HOME -V /etc/gnunet
++ gnunet-config -c $CONFIGFILE -s PEER -o PRIVATE_KEY -V /etc/gnunet/private_key.ecc
++ gnunet-config -c $CONFIGFILE -s identity -o EGODIR -V /etc/gnunet/identity/egos
++ gnunet-config -c $CONFIGFILE -s revocation -o DATABASE -V /etc/gnunet/revocation.dat
++ gnunet-config -c $CONFIGFILE -s nse -o PROOFFILE -V /etc/gnunet/proof.dat
++ gnunet-config -c $CONFIGFILE -s namestore-sqlite -o FILENAME -V /etc/gnunet/namestore.sqlite
++
++ # enable all installed transport plugins
++ transport_plugins=$(gnunet-config -c $CONFIGFILE -s transport -o PLUGINS)
++ for transplug in /usr/lib/gnunet/libgnunet_plugin_transport_*.so; do
++ transplug=$( echo $transplug |
++ sed -ne 's!^.*_transport_\(.*\)\.so$!\1!p' )
++ [ -n "$( echo $transport_plugins | grep $transplug )" ] ||
++ transport_plugins="$transport_plugins $transplug"
++ done
++ gnunet-config -c $CONFIGFILE -s transport -o PLUGINS -V "$transport_plugins"
++
++ # apply config from UCI
++ _gnunet_section=""
++ config_cb()
++ {
++ # $1 "Type"
++ # $2 "Name"
++ local __TYPE="$1"
++ local __NAME="$2"
++ [ "${__TYPE}" = "gnunet-config" ] && _gnunet_section="${__NAME}"
++ [ "${__TYPE}" = "gnunet-exit-service" ] && _gnunet_section="${__NAME}.gnunet."
++ }
++ option_cb() {
++ # $1 name of variable
++ # $2 value
++ local __OPT="$1"
++ local __VAL="$2"
++ gnunet-config -c $CONFIGFILE -s ${_gnunet_section} -o ${__OPT} -V "${__VAL}"
++ }
++ config_load gnunet
++
++ return 0
++}
++
++start_service() {
++ fix_libexec_permissions
++ prepare_config
++
++ procd_open_instance
++ procd_set_param user gnunet
++ procd_set_param command $PROG -c $CONFIGFILE -l $LOGFILE
++ procd_set_param respawn
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/gnunet/files/gnunet.upgrade b/feeds/packages/net/gnunet/files/gnunet.upgrade
+new file mode 100644
+index 0000000..f488957
+--- /dev/null
++++ b/feeds/packages/net/gnunet/files/gnunet.upgrade
+@@ -0,0 +1 @@
++/etc/gnunet
+diff --git a/feeds/packages/net/gnurl/Makefile b/feeds/packages/net/gnurl/Makefile
+new file mode 100644
+index 0000000..141bb9b
+--- /dev/null
++++ b/feeds/packages/net/gnurl/Makefile
+@@ -0,0 +1,120 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gnurl
++PKG_VERSION:=7.43.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://gnunet.org/sites/default/files
++
++PKG_MD5SUM:=67c6667d8843cc514b230f2ce8d80f0e
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/gnurl/Default
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=https://gnunet.org/gnurl
++ MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++endef
++
++define Package/gnurl
++ $(call Package/gnurl/Default)
++ SUBMENU:=File Transfer
++ DEPENDS:=+libgnurl
++ TITLE:=A client-side HTTP/HTTPS transfer utility
++endef
++
++define Package/libgnurl
++ $(call Package/gnurl/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libgnutls +libidn +zlib
++ TITLE:=A client-side HTTP/HTTPS transfer library
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ $(call autoconf_bool,CONFIG_IPV6,ipv6) \
++ --with-gnutls="$(STAGING_DIR)/usr" \
++ --with-libidn="$(STAGING_DIR)/usr" \
++ --with-zlib="$(STAGING_DIR)/usr" \
++ --with-ca-path="/etc/ssl/certs/" \
++ --enable-shared \
++ --enable-static \
++ --without-axtls \
++ --without-libssh2 \
++ --without-libmetalink \
++ --without-winidn \
++ --without-librtmp \
++ --without-nghttp2 \
++ --without-nss \
++ --without-cyassl \
++ --without-polarssl \
++ --without-ssl \
++ --without-winssl \
++ --without-darwinssl \
++ --disable-ares \
++ --disable-sspi \
++ --disable-ntlm-wb \
++ --disable-ldap \
++ --disable-ldaps \
++ --disable-rtsp \
++ --disable-dict \
++ --disable-telnet \
++ --disable-tftp \
++ --disable-pop3 \
++ --disable-imap \
++ --disable-smtp \
++ --disable-gopher \
++ --disable-file \
++ --disable-ftp \
++ --disable-smb \
++ --disable-debug \
++ --disable-manual \
++ --disable-verbose
++
++define Build/Compile
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ CC="$(TARGET_CC)" \
++ install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(2)/bin $(1)/usr/bin $(1)/usr/include/gnurl $(1)/usr/lib $(1)/usr/lib/pkgconfig
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/gnurl-config $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/curl/*.h $(1)/usr/include/gnurl
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgnurl.{a,so*} $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/libgnurl.pc $(1)/usr/lib/pkgconfig/
++ $(SED) 's,-L$$$${exec_prefix}/lib,,g' $(1)/usr/bin/gnurl-config
++ [ -n "$(TARGET_LDFLAGS)" ] && $(SED) 's#$(TARGET_LDFLAGS)##g' $(1)/usr/lib/pkgconfig/libgnurl.pc || true
++ $(LN) $(STAGING_DIR)/usr/bin/gnurl-config $(2)/bin/
++endef
++
++define Package/gnurl/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/gnurl $(1)/usr/bin/
++endef
++
++define Package/libgnurl/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgnurl.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,gnurl))
++$(eval $(call BuildPackage,libgnurl))
+diff --git a/feeds/packages/net/gnurl/patches/100-check_long_long.patch b/feeds/packages/net/gnurl/patches/100-check_long_long.patch
+new file mode 100644
+index 0000000..21e4564
+--- /dev/null
++++ b/feeds/packages/net/gnurl/patches/100-check_long_long.patch
+@@ -0,0 +1,10 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -2954,6 +2954,7 @@ CURL_VERIFY_RUNTIMELIBS
++
++ AC_CHECK_SIZEOF(size_t)
++ AC_CHECK_SIZEOF(long)
+++AC_CHECK_SIZEOF(long long)
++ AC_CHECK_SIZEOF(int)
++ AC_CHECK_SIZEOF(short)
++ CURL_CONFIGURE_LONG
+diff --git a/feeds/packages/net/gnurl/patches/200-no_docs_tests.patch b/feeds/packages/net/gnurl/patches/200-no_docs_tests.patch
+new file mode 100644
+index 0000000..6c778f7
+--- /dev/null
++++ b/feeds/packages/net/gnurl/patches/200-no_docs_tests.patch
+@@ -0,0 +1,22 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -129,7 +129,7 @@ CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP)
++ bin_SCRIPTS = gnurl-config
++
++ SUBDIRS = lib src include
++-DIST_SUBDIRS = $(SUBDIRS) tests packages docs
+++DIST_SUBDIRS = $(SUBDIRS) packages
++
++ pkgconfigdir = $(libdir)/pkgconfig
++ pkgconfig_DATA = libgnurl.pc
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -577,7 +577,7 @@ CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP)
++
++ bin_SCRIPTS = gnurl-config
++ SUBDIRS = lib src include
++-DIST_SUBDIRS = $(SUBDIRS) tests packages docs
+++DIST_SUBDIRS = $(SUBDIRS) packages
++ pkgconfigdir = $(libdir)/pkgconfig
++ pkgconfig_DATA = libgnurl.pc
++ LIB_VTLS_CFILES = vtls/openssl.c vtls/gtls.c vtls/vtls.c vtls/nss.c \
+diff --git a/feeds/packages/net/haproxy/Makefile b/feeds/packages/net/haproxy/Makefile
+new file mode 100644
+index 0000000..c5e1948
+--- /dev/null
++++ b/feeds/packages/net/haproxy/Makefile
+@@ -0,0 +1,135 @@
++#
++# Copyright (C) 2010-2013 OpenWrt.org
++# Copyright (C) 2009-2014 Thomas Heil <heil@terminal-consulting.de>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=haproxy
++PKG_VERSION:=1.5.14
++PKG_RELEASE:=16
++PKG_SOURCE:=haproxy-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://haproxy.1wt.eu/download/1.5/src/
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_MD5SUM:=ad9d7262b96ba85a0f8c6acc6cb9edde
++PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
++PKG_LICENSE:=GPL-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/haproxy/Default
++ SUBMENU:=Web Servers/Proxies
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=The Reliable, High Performance TCP/HTTP Load Balancer
++ URL:=http://haproxy.1wt.eu/
++endef
++
++define Package/haproxy/Default/conffiles
++/etc/haproxy.cfg
++endef
++
++define Package/haproxy/Default/description
++ Open source Reliable, High Performance TCP/HTTP Load Balancer.
++endef
++
++define Package/haproxy
++ DEPENDS+= +libpcre +libltdl +zlib +libpthread +libopenssl
++ TITLE+= (with SSL support)
++ VARIANT:=ssl
++$(call Package/haproxy/Default)
++endef
++
++define Package/haproxy/conffiles
++$(call Package/haproxy/Default/conffiles)
++endef
++
++define Package/haproxy/description
++$(call Package/haproxy/Default/description)
++ This package is built with SSL support.
++endef
++
++define Package/haproxy-nossl
++ TITLE+= (without SSL support)
++ VARIANT:=nossl
++ DEPENDS+= +libpcre +libltdl +zlib +libpthread
++ TITLE+= (with SSL support)
++$(call Package/haproxy/Default)
++endef
++
++define Package/haproxy-nossl/conffiles
++$(call Package/haproxy/Default/conffiles)
++endef
++
++define Package/haproxy-nossl/description
++$(call Package/haproxy/Default/description)
++ This package is built without SSL support.
++endef
++
++ifeq ($(CONFIG_avr32),y)
++ LINUX_TARGET:=linux26
++else
++ LINUX_TARGET:=linux2628
++endif
++
++ifeq ($(BUILD_VARIANT),ssl)
++ USE_OPENSSL=USE_OPENSSL=1
++else
++ USE_OPENSSL=
++endif
++
++define Build/Compile
++ $(MAKE) TARGET=$(LINUX_TARGET) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS) -fno-align-jumps -fno-align-functions -fno-align-labels -fno-align-loops -pipe -fomit-frame-pointer -fhonour-copts" \
++ LD="$(TARGET_CC)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ PCREDIR="$(STAGING_DIR)/usr" \
++ SMALL_OPTS="-DBUFSIZE=16384 -DMAXREWRITE=1030 -DSYSTEM_MAXCONN=165530 " \
++ USE_LINUX_TPROXY=1 USE_LINUX_SPLICE=1 USE_REGPARM=1 $(USE_OPENSSL) \
++ USE_ZLIB=yes USE_PCRE=1 \
++ VERSION="$(PKG_VERSION)-patch$(PKG_RELEASE)" \
++ install
++
++ $(MAKE) -C $(PKG_BUILD_DIR)/contrib/halog \
++ CC="$(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS)" \
++ OPTIMIZE="" \
++ halog
++endef
++
++define Package/haproxy/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/haproxy $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) ./files/haproxy.cfg $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/haproxy.init $(1)/etc/init.d/haproxy
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/net
++ $(INSTALL_BIN) ./files/haproxy.hotplug $(1)/etc/hotplug.d/net/90-haproxy
++endef
++
++Package/haproxy-nossl/install = $(Package/haproxy/install)
++
++define Package/halog
++ MENU:=1
++ $(call Package/haproxy/Default)
++ TITLE+= halog
++ DEPENDS:=haproxy
++endef
++
++define Package/halog/description
++ HAProxy Log Analyzer
++endef
++
++define Package/halog/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/contrib/halog/halog $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,haproxy-nossl))
++$(eval $(call BuildPackage,haproxy))
++$(eval $(call BuildPackage,halog))
+diff --git a/feeds/packages/net/haproxy/files/haproxy.cfg b/feeds/packages/net/haproxy/files/haproxy.cfg
+new file mode 100644
+index 0000000..a54f5f5
+--- /dev/null
++++ b/feeds/packages/net/haproxy/files/haproxy.cfg
+@@ -0,0 +1,100 @@
++# Example configuration file for HAProxy 1.3, refer to the url below for
++# a full documentation and examples for configuration:
++# http://haproxy.1wt.eu/download/1.3/doc/configuration.txt
++
++
++# Global parameters
++global
++
++ # Log events to a remote syslog server at given address using the
++ # specified facility and verbosity level. Multiple log options
++ # are allowed.
++ #log 10.0.0.1 daemon info
++
++ # Specifiy the maximum number of allowed connections.
++ maxconn 32000
++
++ # Raise the ulimit for the maximum allowed number of open socket
++ # descriptors per process. This is usually at least twice the
++ # number of allowed connections (maxconn * 2 + nb_servers + 1) .
++ ulimit-n 65535
++
++ # Drop privileges (setuid, setgid), default is "root" on OpenWrt.
++ uid 0
++ gid 0
++
++ # Perform chroot into the specified directory.
++ #chroot /var/run/haproxy/
++
++ # Daemonize on startup
++ daemon
++
++ nosplice
++ # Enable debugging
++ #debug
++
++ # Spawn given number of processes and distribute load among them,
++ # used for multi-core environments or to circumvent per-process
++ # limits like number of open file descriptors. Default is 1.
++ #nbproc 2
++
++
++# Example HTTP proxy listener
++listen my_http_proxy
++
++ # Bind to port 81 and 444 on all interfaces (0.0.0.0)
++ bind :81,:444
++
++ # We're proxying HTTP here...
++ mode http
++
++ # Simple HTTP round robin over two servers using the specified
++ # source ip 192.168.1.1 .
++ balance roundrobin
++ server server01 192.168.1.10:80 source 192.168.1.1
++ server server02 192.168.1.20:80 source 192.168.1.1
++
++ # Serve an internal statistics page on /stats:
++ stats enable
++ stats uri /stats
++
++ # Enable HTTP basic auth for the statistics:
++ stats realm HA_Stats
++ stats auth username:password
++
++
++# Example SMTP proxy listener
++listen my_smtp_proxy
++
++ # Disable this instance without commenting out the section.
++ disabled
++
++ # Bind to port 26 and 588 on localhost
++ bind 127.0.0.1:26,127.0.0.1:588
++
++ # This is a TCP proxy
++ mode tcp
++
++ # Round robin load balancing over two servers on port 123 forcing
++ # the address 192.168.1.1 and port 25 as source.
++ balance roundrobin
++ #use next line for transparent proxy, so the servers can see the
++ #original ip-address and remove source keyword in server definition
++ #source 0.0.0.0 usesrc clientip
++ server server01 192.168.1.10:123 source 192.168.1.1:25
++ server server02 192.168.1.20:123 source 192.168.1.1:25
++
++
++# Special health check listener for integration with external load
++# balancers.
++listen local_health_check
++
++ # Listen on port 60000
++ bind :60000
++
++ # This is a health check
++ mode health
++
++ # Enable HTTP-style responses: "HTTP/1.0 200 OK"
++ # else just print "OK".
++ #option httpchk
+diff --git a/feeds/packages/net/haproxy/files/haproxy.hotplug b/feeds/packages/net/haproxy/files/haproxy.hotplug
+new file mode 100644
+index 0000000..d14b5bf
+--- /dev/null
++++ b/feeds/packages/net/haproxy/files/haproxy.hotplug
+@@ -0,0 +1,8 @@
++#!/bin/sh
++
++if [ "$ACTION" = add ]; then
++
++ /etc/init.d/haproxy enabled && \
++ /etc/init.d/haproxy start
++fi
++
+diff --git a/feeds/packages/net/haproxy/files/haproxy.init b/feeds/packages/net/haproxy/files/haproxy.init
+new file mode 100644
+index 0000000..edda9a3
+--- /dev/null
++++ b/feeds/packages/net/haproxy/files/haproxy.init
+@@ -0,0 +1,25 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2010 OpenWrt.org
++
++START=99
++STOP=80
++
++SERVICE_USE_PID=1
++
++HAPROXY_BIN="/usr/sbin/haproxy"
++HAPROXY_CONFIG="/etc/haproxy.cfg"
++HAPROXY_PID="/var/run/haproxy.pid"
++
++start() {
++ service_start $HAPROXY_BIN -q -D -f "$HAPROXY_CONFIG" -p "$HAPROXY_PID"
++}
++
++stop() {
++ kill -9 $(cat $HAPROXY_PID | tr "\n" " ")
++ service_stop $HAPROXY_BIN
++}
++
++reload() {
++ $HAPROXY_BIN -D -q -f $HAPROXY_CONFIG -p $HAPROXY_PID -sf $(cat $HAPROXY_PID | tr "\n" " ")
++ #$HAPROXY_BIN -D -q -f $HAPROXY_CONFIG -p $HAPROXY_PID -sf $(cat $HAPROXY_PID)
++}
+diff --git a/feeds/packages/net/haproxy/patches/0001-BUG-MINOR-log-missing-some-ARGC_-entries-in-fmt_dire.patch b/feeds/packages/net/haproxy/patches/0001-BUG-MINOR-log-missing-some-ARGC_-entries-in-fmt_dire.patch
+new file mode 100644
+index 0000000..72db452
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0001-BUG-MINOR-log-missing-some-ARGC_-entries-in-fmt_dire.patch
+@@ -0,0 +1,64 @@
++From df0a5960987b3cb663dcfa93d29c21acc13cd3e3 Mon Sep 17 00:00:00 2001
++From: Willy Tarreau <w@1wt.eu>
++Date: Thu, 9 Jul 2015 11:20:00 +0200
++Subject: [PATCH 1/4] BUG/MINOR: log: missing some ARGC_* entries in
++ fmt_directives()
++
++ARGC_CAP was not added to fmt_directives() which is used to format
++error messages when failing to parse log format expressions. The
++whole switch/case has been reorganized to match the declaration
++order making it easier to spot missing values. The default is not
++the "log" directive anymore but "undefined" asking to report the
++bug.
++
++Backport to 1.5 is not strictly needed but is desirable at least
++for code sanity.
++(cherry picked from commit 53e1a6d31743b1bef6063ff30b812521391ae3c3)
++---
++ src/log.c | 24 ++++++++++++++----------
++ 1 file changed, 14 insertions(+), 10 deletions(-)
++
++diff --git a/src/log.c b/src/log.c
++index 1a5ad25..f0a3072 100644
++--- a/src/log.c
+++++ b/src/log.c
++@@ -167,22 +167,26 @@ struct logformat_var_args var_args_list[] = {
++ static inline const char *fmt_directive(const struct proxy *curproxy)
++ {
++ switch (curproxy->conf.args.ctx) {
++- case ARGC_UIF:
++- return "unique-id-format";
+++ case ARGC_ACL:
+++ return "acl";
+++ case ARGC_STK:
+++ return "stick";
+++ case ARGC_TRK:
+++ return "track-sc";
+++ case ARGC_LOG:
+++ return "log-format";
++ case ARGC_HRQ:
++ return "http-request";
++ case ARGC_HRS:
++ return "http-response";
++- case ARGC_STK:
++- return "stick";
++- case ARGC_TRK:
++- return "track-sc"; break;
+++ case ARGC_UIF:
+++ return "unique-id-format";
++ case ARGC_RDR:
++- return "redirect"; break;
++- case ARGC_ACL:
++- return "acl"; break;
+++ return "redirect";
+++ case ARGC_CAP:
+++ return "capture";
++ default:
++- return "log-format";
+++ return "undefined(please report this bug)"; /* must never happen */
++ }
++ }
++
++--
++2.3.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0002-DOC-usesrc-root-privileges-requirements.patch b/feeds/packages/net/haproxy/patches/0002-DOC-usesrc-root-privileges-requirements.patch
+new file mode 100644
+index 0000000..0af6565
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0002-DOC-usesrc-root-privileges-requirements.patch
+@@ -0,0 +1,27 @@
++From ea31f225c2c93a25b8bef7a9241a89cecfd9d350 Mon Sep 17 00:00:00 2001
++From: Baptiste Assmann <bedis9@gmail.com>
++Date: Fri, 17 Jul 2015 21:59:42 +0200
++Subject: [PATCH 2/4] DOC: usesrc root privileges requirements
++
++The "usesrc" parameter of the source statement requires root privileges.
++(cherry picked from commit 91bd337d90cb347feda34b01402f3471c8a4833c)
++---
++ doc/configuration.txt | 2 ++
++ 1 file changed, 2 insertions(+)
++
++diff --git a/doc/configuration.txt b/doc/configuration.txt
++index 6714afb..64697a4 100644
++--- a/doc/configuration.txt
+++++ b/doc/configuration.txt
++@@ -6117,6 +6117,8 @@ source <addr>[:<port>] [interface <name>]
++ is possible at the server level using the "source" server option. Refer to
++ section 5 for more information.
++
+++ In order to work, "usesrc" requires root privileges.
+++
++ Examples :
++ backend private
++ # Connect to the servers using our 192.168.1.200 source address
++--
++2.3.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0003-BUILD-ssl-Allow-building-against-libssl-without-SSLv.patch b/feeds/packages/net/haproxy/patches/0003-BUILD-ssl-Allow-building-against-libssl-without-SSLv.patch
+new file mode 100644
+index 0000000..074cedc
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0003-BUILD-ssl-Allow-building-against-libssl-without-SSLv.patch
+@@ -0,0 +1,51 @@
++From eee374c28ea8ea22834ff14515b5584bc3e0c7b5 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Courr=C3=A8ges-Anglas?= <jca@wxcvbn.org>
++Date: Sat, 25 Jul 2015 16:50:52 -0600
++Subject: [PATCH 3/4] BUILD: ssl: Allow building against libssl without SSLv3.
++
++If SSLv3 is explicitely requested but not available, warn the user and
++bail out.
++(cherry picked from commit 17c3f6284cf605e47f6525c077bc644c45272849)
++---
++ src/ssl_sock.c | 16 ++++++++++++++--
++ 1 file changed, 14 insertions(+), 2 deletions(-)
++
++diff --git a/src/ssl_sock.c b/src/ssl_sock.c
++index 7d77d36..2ae45ec 100644
++--- a/src/ssl_sock.c
+++++ b/src/ssl_sock.c
++@@ -1405,8 +1405,14 @@ int ssl_sock_prepare_ctx(struct bind_conf *bind_conf, SSL_CTX *ctx, struct proxy
++ ssloptions |= SSL_OP_NO_TLSv1_2;
++ if (bind_conf->ssl_options & BC_SSL_O_NO_TLS_TICKETS)
++ ssloptions |= SSL_OP_NO_TICKET;
++- if (bind_conf->ssl_options & BC_SSL_O_USE_SSLV3)
+++ if (bind_conf->ssl_options & BC_SSL_O_USE_SSLV3) {
+++#ifndef OPENSSL_NO_SSL3
++ SSL_CTX_set_ssl_version(ctx, SSLv3_server_method());
+++#else
+++ Alert("SSLv3 support requested but unavailable.\n");
+++ cfgerr++;
+++#endif
+++ }
++ if (bind_conf->ssl_options & BC_SSL_O_USE_TLSV10)
++ SSL_CTX_set_ssl_version(ctx, TLSv1_server_method());
++ #if SSL_OP_NO_TLSv1_1
++@@ -1750,8 +1756,14 @@ int ssl_sock_prepare_srv_ctx(struct server *srv, struct proxy *curproxy)
++ options |= SSL_OP_NO_TLSv1_2;
++ if (srv->ssl_ctx.options & SRV_SSL_O_NO_TLS_TICKETS)
++ options |= SSL_OP_NO_TICKET;
++- if (srv->ssl_ctx.options & SRV_SSL_O_USE_SSLV3)
+++ if (srv->ssl_ctx.options & SRV_SSL_O_USE_SSLV3) {
+++#ifndef OPENSSL_NO_SSL3
++ SSL_CTX_set_ssl_version(srv->ssl_ctx.ctx, SSLv3_client_method());
+++#else
+++ Alert("SSLv3 support requested but unavailable.");
+++ cfgerr++;
+++#endif
+++ }
++ if (srv->ssl_ctx.options & SRV_SSL_O_USE_TLSV10)
++ SSL_CTX_set_ssl_version(srv->ssl_ctx.ctx, TLSv1_client_method());
++ #if SSL_OP_NO_TLSv1_1
++--
++2.3.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0004-DOC-MINOR-fix-OpenBSD-versions-where-haproxy-works.patch b/feeds/packages/net/haproxy/patches/0004-DOC-MINOR-fix-OpenBSD-versions-where-haproxy-works.patch
+new file mode 100644
+index 0000000..c769228
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0004-DOC-MINOR-fix-OpenBSD-versions-where-haproxy-works.patch
+@@ -0,0 +1,26 @@
++From e4766ba031e1fea8f2ca139316dc4e8209e960c2 Mon Sep 17 00:00:00 2001
++From: Daniel Jakots <vigdis@chown.me>
++Date: Wed, 29 Jul 2015 08:03:08 +0200
++Subject: [PATCH 4/4] DOC/MINOR: fix OpenBSD versions where haproxy works
++
++(cherry picked from commit 17d228be14762b282e5262262c45ecee4c265552)
++---
++ README | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/README b/README
++index add7f06..e267730 100644
++--- a/README
+++++ b/README
++@@ -39,7 +39,7 @@ and assign it to the TARGET variable :
++ - solaris for Solaris 8 or 10 (others untested)
++ - freebsd for FreeBSD 5 to 10 (others untested)
++ - osx for Mac OS/X
++- - openbsd for OpenBSD 3.1 to 5.2 (others untested)
+++ - openbsd for OpenBSD 3.1 and above
++ - aix51 for AIX 5.1
++ - aix52 for AIX 5.2
++ - cygwin for Cygwin
++--
++2.3.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0005-BUG-MINOR-http-sample-gmtime-localtime-can-fail.patch b/feeds/packages/net/haproxy/patches/0005-BUG-MINOR-http-sample-gmtime-localtime-can-fail.patch
+new file mode 100644
+index 0000000..23012ba
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0005-BUG-MINOR-http-sample-gmtime-localtime-can-fail.patch
+@@ -0,0 +1,33 @@
++From 955587271031d66e9b7a768e3bb18dae00b60cc6 Mon Sep 17 00:00:00 2001
++From: Thierry FOURNIER <tfournier@arpalert.org>
++Date: Wed, 8 Jul 2015 00:15:20 +0200
++Subject: [PATCH 05/13] BUG/MINOR: http/sample: gmtime/localtime can fail
++
++The man said that gmtime() and localtime() can return a NULL value.
++This is not tested. It appears that all the values of a 32 bit integer
++are valid, but it is better to check the return of these functions.
++
++However, if the integer move from 32 bits to 64 bits, some 64 values
++can be unsupported.
++(cherry picked from commit fac9ccfb705702f211f99e67d5f5d5129002086a)
++[wt: we only have sample_conv_date() in 1.5]
++---
++ src/proto_http.c | 2 ++
++ 1 file changed, 2 insertions(+)
++
++diff --git a/src/proto_http.c b/src/proto_http.c
++index 5db64b5..02dc42b 100644
++--- a/src/proto_http.c
+++++ b/src/proto_http.c
++@@ -11249,6 +11249,8 @@ static int sample_conv_http_date(const struct arg *args, struct sample *smp)
++ curr_date += args[0].data.sint;
++
++ tm = gmtime(&curr_date);
+++ if (!tm)
+++ return 0;
++
++ temp = get_trash_chunk();
++ temp->len = snprintf(temp->str, temp->size - temp->len,
++--
++2.4.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0006-DOC-typo-in-redirect-302-code-meaning.patch b/feeds/packages/net/haproxy/patches/0006-DOC-typo-in-redirect-302-code-meaning.patch
+new file mode 100644
+index 0000000..9b96280
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0006-DOC-typo-in-redirect-302-code-meaning.patch
+@@ -0,0 +1,27 @@
++From 6c7351bdd0778bc171a2b54faed058eadc8c9d0d Mon Sep 17 00:00:00 2001
++From: Baptiste Assmann <bedis9@gmail.com>
++Date: Mon, 3 Aug 2015 11:42:50 +0200
++Subject: [PATCH 06/13] DOC: typo in 'redirect', 302 code meaning
++
++302 means a temprary move, not a permanent one
++(cherry picked from commit ea849c0cca63b1b56c9c36f9c3504caa5e826816)
++---
++ doc/configuration.txt | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/doc/configuration.txt b/doc/configuration.txt
++index 64697a4..e8d8b2a 100644
++--- a/doc/configuration.txt
+++++ b/doc/configuration.txt
++@@ -5443,7 +5443,7 @@ redirect scheme <sch> [code <code>] <option> [{if | unless} <condition>]
++ is desired. Only codes 301, 302, 303, 307 and 308 are supported,
++ with 302 used by default if no code is specified. 301 means
++ "Moved permanently", and a browser may cache the Location. 302
++- means "Moved permanently" and means that the browser should not
+++ means "Moved temporarily" and means that the browser should not
++ cache the redirection. 303 is equivalent to 302 except that the
++ browser will fetch the location with a GET method. 307 is just
++ like 302 but makes it clear that the same method must be reused.
++--
++2.4.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0007-DOC-mention-that-ms-is-left-padded-with-zeroes.patch b/feeds/packages/net/haproxy/patches/0007-DOC-mention-that-ms-is-left-padded-with-zeroes.patch
+new file mode 100644
+index 0000000..1cad791
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0007-DOC-mention-that-ms-is-left-padded-with-zeroes.patch
+@@ -0,0 +1,27 @@
++From c3453d53f2862b22d8c8e7d2399dfc38ec966aa4 Mon Sep 17 00:00:00 2001
++From: Willy Tarreau <w@1wt.eu>
++Date: Sun, 9 Aug 2015 10:56:35 +0200
++Subject: [PATCH 07/13] DOC: mention that %ms is left-padded with zeroes.
++
++That's important to emit logs.
++(cherry picked from commit 812c88ec126e8fc4fc0f7853f265594d03c63956)
++---
++ doc/configuration.txt | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/doc/configuration.txt b/doc/configuration.txt
++index e8d8b2a..1d95b5b 100644
++--- a/doc/configuration.txt
+++++ b/doc/configuration.txt
++@@ -12381,7 +12381,7 @@ Please refer to the table below for currently defined variables :
++ | | %hrl | captured_request_headers CLF style | string list |
++ | | %hs | captured_response_headers default style | string |
++ | | %hsl | captured_response_headers CLF style | string list |
++- | | %ms | accept date milliseconds | numeric |
+++ | | %ms | accept date milliseconds (left-padded with 0) | numeric |
++ | | %pid | PID | numeric |
++ | H | %r | http_request | string |
++ | | %rc | retries | numeric |
++--
++2.4.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0008-CLEANUP-.gitignore-ignore-more-test-files.patch b/feeds/packages/net/haproxy/patches/0008-CLEANUP-.gitignore-ignore-more-test-files.patch
+new file mode 100644
+index 0000000..d8d51bc
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0008-CLEANUP-.gitignore-ignore-more-test-files.patch
+@@ -0,0 +1,50 @@
++From 1104336c0ba5f474fce8fe7c0125511b59f4dd3d Mon Sep 17 00:00:00 2001
++From: Willy Tarreau <w@1wt.eu>
++Date: Tue, 11 Aug 2015 11:20:45 +0200
++Subject: [PATCH 08/13] CLEANUP: .gitignore: ignore more test files
++
++Exclude from "git status" many of the files that often result from
++development tests and bug reports reproducers.
++(cherry picked from commit de365a320ead43168e78facfa337130759783515)
++---
++ .gitignore | 27 +++++++++++++++++++++++++++
++ 1 file changed, 27 insertions(+)
++
++diff --git a/.gitignore b/.gitignore
++index 762f5ad..f6ccd0e 100644
++--- a/.gitignore
+++++ b/.gitignore
++@@ -18,3 +18,30 @@ make-*
++ dlmalloc.c
++ 00*.patch
++ *.service
+++*.bak
+++contrib/base64/base64rev
+++contrib/halog/halog
+++contrib/ip6range/ip6range
+++contrib/iprange/iprange
+++tests/test_hashes
+++/*.cfg
+++/*.conf
+++/*.diff
+++/*.patch
+++/*.c
+++/*.o
+++/*.so
+++/*.txt
+++/*.TXT
+++/*.txt.*
+++/*.prof
+++/*.gprof
+++/*.prof.*
+++/*.gprof.*
+++/*.tar
+++/*.tar.gz
+++/*.tgz
+++/*.mbox
+++/*.sh
+++/bug*
+++/TAGS
++--
++2.4.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0009-CLEANUP-.gitignore-finally-ignore-everything-but-wha.patch b/feeds/packages/net/haproxy/patches/0009-CLEANUP-.gitignore-finally-ignore-everything-but-wha.patch
+new file mode 100644
+index 0000000..fe43df9
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0009-CLEANUP-.gitignore-finally-ignore-everything-but-wha.patch
+@@ -0,0 +1,44 @@
++From 5e077624951a65e6aae381c7213fc54984768dd4 Mon Sep 17 00:00:00 2001
++From: Willy Tarreau <w@1wt.eu>
++Date: Tue, 11 Aug 2015 11:21:47 +0200
++Subject: [PATCH 09/13] CLEANUP: .gitignore: finally ignore everything but what
++ is known.
++
++Still too many files remain, it's easier to block everything but
++what we know.
++(cherry picked from commit d71f1766bdbb041f80394662b0d293f033f93005)
++---
++ .gitignore | 20 ++++++++++++++++++++
++ 1 file changed, 20 insertions(+)
++
++diff --git a/.gitignore b/.gitignore
++index f6ccd0e..1953ba3 100644
++--- a/.gitignore
+++++ b/.gitignore
++@@ -45,3 +45,23 @@ tests/test_hashes
++ /*.sh
++ /bug*
++ /TAGS
+++# Below we forbid everything and only allow what we know, that's much easier
+++# than blocking about 500 different test files and bug report outputs.
+++/.*
+++/*
+++!/.gitignore
+++!/CHANGELOG
+++!/LICENSE
+++!/Makefile
+++!/README
+++!/ROADMAP
+++!/SUBVERS
+++!/VERDATE
+++!/VERSION
+++!/contrib
+++!/doc
+++!/ebtree
+++!/examples
+++!/include
+++!/src
+++!/tests
++--
++2.4.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0010-MEDIUM-config-emit-a-warning-on-a-frontend-without-l.patch b/feeds/packages/net/haproxy/patches/0010-MEDIUM-config-emit-a-warning-on-a-frontend-without-l.patch
+new file mode 100644
+index 0000000..2a622f5
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0010-MEDIUM-config-emit-a-warning-on-a-frontend-without-l.patch
+@@ -0,0 +1,46 @@
++From c7c1e55f09839727ba7defd37347fc500dabb202 Mon Sep 17 00:00:00 2001
++From: Willy Tarreau <w@1wt.eu>
++Date: Tue, 11 Aug 2015 11:36:45 +0200
++Subject: [PATCH 10/13] MEDIUM: config: emit a warning on a frontend without
++ listener
++
++Commit c6678e2 ("MEDIUM: config: authorize frontend and listen without bind")
++completely removed the test for bind lines in frontends in order to make it
++easier for automated tools to generate configs (eg: replacing a bind with
++another one passing via a temporary config without any bind line). The
++problem is that some common mistakes are totally hidden now. For example,
++this apparently valid entry is silently ignored :
++
++ listen 1.2.3.4:8000
++ server s1 127.0.0.1:8000
++
++Hint: 1.2.3.4:8000 is mistakenly the proxy name here.
++
++Thus instead we now emit a warning to indicate that a frontend was found
++with no listener. This should be backported to 1.5 to help spot abnormal
++configurations.
++(cherry picked from commit f82d1ca2d7ec83804d6b54e61a35747ad2f85188)
++---
++ src/cfgparse.c | 6 ++++++
++ 1 file changed, 6 insertions(+)
++
++diff --git a/src/cfgparse.c b/src/cfgparse.c
++index 2a5f178..d67edc5 100644
++--- a/src/cfgparse.c
+++++ b/src/cfgparse.c
++@@ -6193,6 +6193,12 @@ int check_config_validity()
++ break;
++ }
++
+++ if ((curproxy->cap & PR_CAP_FE) && LIST_ISEMPTY(&curproxy->conf.listeners)) {
+++ Warning("config : %s '%s' has no 'bind' directive. Please declare it as a backend if this was intended.\n",
+++ proxy_type_str(curproxy), curproxy->id);
+++ err_code |= ERR_WARN;
+++ }
+++
++ if ((curproxy->cap & PR_CAP_BE) && (curproxy->mode != PR_MODE_HEALTH)) {
++ if (curproxy->lbprm.algo & BE_LB_KIND) {
++ if (curproxy->options & PR_O_TRANSP) {
++--
++2.4.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0011-BUG-MEDIUM-counters-ensure-that-src_-inc-clr-_gpc0-c.patch b/feeds/packages/net/haproxy/patches/0011-BUG-MEDIUM-counters-ensure-that-src_-inc-clr-_gpc0-c.patch
+new file mode 100644
+index 0000000..25734dc
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0011-BUG-MEDIUM-counters-ensure-that-src_-inc-clr-_gpc0-c.patch
+@@ -0,0 +1,93 @@
++From ee12145d38a7dee81a20cf232c724ccb7a46ad8b Mon Sep 17 00:00:00 2001
++From: Willy Tarreau <w@1wt.eu>
++Date: Tue, 18 Aug 2015 17:15:20 +0200
++Subject: [PATCH 11/13] BUG/MEDIUM: counters: ensure that src_{inc,clr}_gpc0
++ creates a missing entry
++
++During 1.5-dev20 there was some code refactoring to make the src_* fetch
++function use the same code as sc_*. Unfortunately this introduced a
++regression where src_* doesn't create an entry anymore if it does not
++exist in the table. The reason is that smp_fetch_sc_stkctr() only calls
++stktable_lookup_key() while src_inc_*/src_clr_* used to make use of
++stktable_update_key() which additionally create the entry if it does
++not exist.
++
++There's no point modifying the common function for these two exceptions,
++so instead we now have a function dedicated to the creation of this entry
++for src_* only. It is called when the entry didn't exist, so that requires
++minimal modifications to existing code.
++
++Thanks to Thierry Fournier for helping diagnose the issue.
++
++This fix must be backported to 1.5.
++(cherry picked from commit 0f4eadd4830279f5ee83aa545728fb750f5c8185)
++
++[Note: the backport to 1.5 significantly differs from the version in 1.6
++ since we need to use the table's type and to retrieve the source address
++ directly from the connection. At least it matches the way other src_*
++ fetch functions work, and it's been verified to work fine]
++---
++ src/session.c | 33 +++++++++++++++++++++++++++++++++
++ 1 file changed, 33 insertions(+)
++
++diff --git a/src/session.c b/src/session.c
++index 5b9e407..6d62e36 100644
++--- a/src/session.c
+++++ b/src/session.c
++@@ -2806,6 +2806,33 @@ smp_fetch_sc_stkctr(struct session *l4, const struct arg *args, const char *kw)
++ return &l4->stkctr[num];
++ }
++
+++/* same as smp_fetch_sc_stkctr() but dedicated to src_* and can create
+++ * the entry if it doesn't exist yet. This is needed for a few fetch
+++ * functions which need to create an entry, such as src_inc_gpc* and
+++ * src_clr_gpc*.
+++ */
+++struct stkctr *
+++smp_create_src_stkctr(struct session *sess, const struct arg *args, const char *kw)
+++{
+++ static struct stkctr stkctr;
+++ struct stktable_key *key;
+++ struct connection *conn = objt_conn(sess->si[0].end);
+++
+++ if (strncmp(kw, "src_", 4) != 0)
+++ return NULL;
+++
+++ if (!conn)
+++ return NULL;
+++
+++ key = addr_to_stktable_key(&conn->addr.from, args->data.prx->table.type);
+++ if (!key)
+++ return NULL;
+++
+++ stkctr.table = &args->data.prx->table;
+++ stkctr_set_entry(&stkctr, stktable_update_key(stkctr.table, key));
+++ return &stkctr;
+++}
+++
++ /* set return a boolean indicating if the requested session counter is
++ * currently being tracked or not.
++ * Supports being called as "sc[0-9]_tracked" only.
++@@ -2887,6 +2914,9 @@ smp_fetch_sc_inc_gpc0(struct proxy *px, struct session *l4, void *l7, unsigned i
++ if (!stkctr)
++ return 0;
++
+++ if (stkctr_entry(stkctr) == NULL)
+++ stkctr = smp_create_src_stkctr(l4, args, kw);
+++
++ smp->flags = SMP_F_VOL_TEST;
++ smp->type = SMP_T_UINT;
++ smp->data.uint = 0;
++@@ -2924,6 +2954,9 @@ smp_fetch_sc_clr_gpc0(struct proxy *px, struct session *l4, void *l7, unsigned i
++ if (!stkctr)
++ return 0;
++
+++ if (stkctr_entry(stkctr) == NULL)
+++ stkctr = smp_create_src_stkctr(l4, args, kw);
+++
++ smp->flags = SMP_F_VOL_TEST;
++ smp->type = SMP_T_UINT;
++ smp->data.uint = 0;
++--
++2.4.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0012-DOC-ssl-missing-LF.patch b/feeds/packages/net/haproxy/patches/0012-DOC-ssl-missing-LF.patch
+new file mode 100644
+index 0000000..bfa2207
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0012-DOC-ssl-missing-LF.patch
+@@ -0,0 +1,27 @@
++From 2272b4ffde38c836adfd9a9b43ff5c019ef4190a Mon Sep 17 00:00:00 2001
++From: Thierry FOURNIER <tfournier@arpalert.org>
++Date: Wed, 26 Aug 2015 08:21:26 +0200
++Subject: [PATCH 12/13] DOC: ssl: missing LF
++
++An error message miss LF
++(cherry picked from commit bc965348d7ccc0a306504232ab85dc240fd31fbf)
++---
++ src/ssl_sock.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/src/ssl_sock.c b/src/ssl_sock.c
++index 2ae45ec..8f698c0 100644
++--- a/src/ssl_sock.c
+++++ b/src/ssl_sock.c
++@@ -1760,7 +1760,7 @@ int ssl_sock_prepare_srv_ctx(struct server *srv, struct proxy *curproxy)
++ #ifndef OPENSSL_NO_SSL3
++ SSL_CTX_set_ssl_version(srv->ssl_ctx.ctx, SSLv3_client_method());
++ #else
++- Alert("SSLv3 support requested but unavailable.");
+++ Alert("SSLv3 support requested but unavailable.\n");
++ cfgerr++;
++ #endif
++ }
++--
++2.4.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0013-DOC-fix-example-of-http-request-using-ssl_fc_session.patch b/feeds/packages/net/haproxy/patches/0013-DOC-fix-example-of-http-request-using-ssl_fc_session.patch
+new file mode 100644
+index 0000000..f63de13
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0013-DOC-fix-example-of-http-request-using-ssl_fc_session.patch
+@@ -0,0 +1,30 @@
++From d3a93a932430bc1a4cd5d1350820c2bec706e26d Mon Sep 17 00:00:00 2001
++From: Willy Tarreau <w@1wt.eu>
++Date: Thu, 27 Aug 2015 17:15:05 +0200
++Subject: [PATCH 13/13] DOC: fix example of http-request using
++ ssl_fc_session_id
++
++It was missing the ",hex" resulting in raw binary data being dumped in
++the header or the logs. Now we know where these crazy logs originated
++from!
++(cherry picked from commit fca4261dacab51db960d30120f4bb4201f7e4a51)
++---
++ doc/configuration.txt | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/doc/configuration.txt b/doc/configuration.txt
++index 1d95b5b..67d273b 100644
++--- a/doc/configuration.txt
+++++ b/doc/configuration.txt
++@@ -3135,7 +3135,7 @@ http-request { allow | deny | tarpit | auth [realm <realm>] | redirect <rule> |
++ Example:
++ http-request set-header X-Haproxy-Current-Date %T
++ http-request set-header X-SSL %[ssl_fc]
++- http-request set-header X-SSL-Session_ID %[ssl_fc_session_id]
+++ http-request set-header X-SSL-Session_ID %[ssl_fc_session_id,hex]
++ http-request set-header X-SSL-Client-Verify %[ssl_c_verify]
++ http-request set-header X-SSL-Client-DN %{+Q}[ssl_c_s_dn]
++ http-request set-header X-SSL-Client-CN %{+Q}[ssl_c_s_dn(cn)]
++--
++2.4.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0014-BUG-MINOR-http-remove-stupid-HTTP_METH_NONE-entry.patch b/feeds/packages/net/haproxy/patches/0014-BUG-MINOR-http-remove-stupid-HTTP_METH_NONE-entry.patch
+new file mode 100644
+index 0000000..6b51543
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0014-BUG-MINOR-http-remove-stupid-HTTP_METH_NONE-entry.patch
+@@ -0,0 +1,78 @@
++From bcd033699c5a4904967652de4980e4f35f17ee34 Mon Sep 17 00:00:00 2001
++From: Willy Tarreau <w@1wt.eu>
++Date: Thu, 3 Sep 2015 17:15:21 +0200
++Subject: [PATCH 14/16] BUG/MINOR: http: remove stupid HTTP_METH_NONE entry
++
++When converting the "method" fetch to a string, we used to get an empty
++string if the first character was not an upper case. This was caused by
++the lookup function which returns HTTP_METH_NONE when a lookup is not
++possible, and this method being mapped to an empty string in the array.
++
++This is a totally stupid mechanism, there's no reason for having the
++result depend on the first char. In fact the message parser already
++checks that the syntax matches an HTTP token so we can only land there
++with a valid token, hence only HTTP_METH_OTHER should be returned.
++
++This fix should be backported to all actively supported branches.
++(cherry picked from commit b7ce424be2bc9df73a3b971fa9dd6daea0332bf1)
++---
++ include/types/proto_http.h | 1 -
++ src/proto_http.c | 11 ++++-------
++ 2 files changed, 4 insertions(+), 8 deletions(-)
++
++diff --git a/include/types/proto_http.h b/include/types/proto_http.h
++index a5a5d31..dbce972 100644
++--- a/include/types/proto_http.h
+++++ b/include/types/proto_http.h
++@@ -219,7 +219,6 @@ enum {
++
++ /* Known HTTP methods */
++ enum http_meth_t {
++- HTTP_METH_NONE = 0,
++ HTTP_METH_OPTIONS,
++ HTTP_METH_GET,
++ HTTP_METH_HEAD,
++diff --git a/src/proto_http.c b/src/proto_http.c
++index 02dc42b..46694cb 100644
++--- a/src/proto_http.c
+++++ b/src/proto_http.c
++@@ -361,12 +361,11 @@ const struct http_method_desc http_methods[26][3] = {
++ [0] = { .meth = HTTP_METH_TRACE , .len=5, .text="TRACE" },
++ },
++ /* rest is empty like this :
++- * [1] = { .meth = HTTP_METH_NONE , .len=0, .text="" },
+++ * [0] = { .meth = HTTP_METH_OTHER , .len=0, .text="" },
++ */
++ };
++
++ const struct http_method_name http_known_methods[HTTP_METH_OTHER] = {
++- [HTTP_METH_NONE] = { "", 0 },
++ [HTTP_METH_OPTIONS] = { "OPTIONS", 7 },
++ [HTTP_METH_GET] = { "GET", 3 },
++ [HTTP_METH_HEAD] = { "HEAD", 4 },
++@@ -793,8 +792,8 @@ struct chunk *http_error_message(struct session *s, int msgnum)
++ }
++
++ /*
++- * returns HTTP_METH_NONE if there is nothing valid to read (empty or non-text
++- * string), HTTP_METH_OTHER for unknown methods, or the identified method.
+++ * returns a known method among HTTP_METH_* or HTTP_METH_OTHER for all unknown
+++ * ones.
++ */
++ enum http_meth_t find_http_meth(const char *str, const int len)
++ {
++@@ -810,10 +809,8 @@ enum http_meth_t find_http_meth(const char *str, const int len)
++ if (likely(memcmp(str, h->text, h->len) == 0))
++ return h->meth;
++ };
++- return HTTP_METH_OTHER;
++ }
++- return HTTP_METH_NONE;
++-
+++ return HTTP_METH_OTHER;
++ }
++
++ /* Parse the URI from the given transaction (which is assumed to be in request
++--
++2.4.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0015-BUG-MAJOR-http-don-t-call-http_send_name_header-afte.patch b/feeds/packages/net/haproxy/patches/0015-BUG-MAJOR-http-don-t-call-http_send_name_header-afte.patch
+new file mode 100644
+index 0000000..97ac07b
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0015-BUG-MAJOR-http-don-t-call-http_send_name_header-afte.patch
+@@ -0,0 +1,49 @@
++From 3f34b5539e7ba31e44055d853b9ba496e73e0bae Mon Sep 17 00:00:00 2001
++From: Willy Tarreau <w@1wt.eu>
++Date: Mon, 7 Sep 2015 19:32:33 +0200
++Subject: [PATCH 15/16] BUG/MAJOR: http: don't call http_send_name_header()
++ after an error
++
++A crash was reported when using the "famous" http-send-name-header
++directive. This time it's a bit tricky, it requires a certain number of
++conditions to be met including maxconn on a server, queuing, timeout in
++the queue and cookie-based persistence.
++
++The problem is that in stream.c, before calling http_send_name_header(),
++we check a number of conditions to know if we have to replace the header
++name. But prior to reaching this place, it's possible for
++sess_update_stream_int() to fail and change the stream-int's state to
++SI_ST_CLO, send an error 503 to the client, and flush all buffers. But
++http_send_name_header() can only be called with valid buffer contents
++matching the http_msg's description. So when it rewinds the stream to
++modify the header, buf->o becomes negative by the size of the incoming
++request and is used as the argument to memmove() which basically
++displaces 4GB of memory off a few bytes to write the new name, resulting
++in a core and a core file that's really not fun to play with.
++
++The solution obviously consists in refraining from calling this nasty
++function when the stream interface is already closed.
++
++This bug also affects 1.5 and possibly 1.4, so the fix must be backported
++there.
++(cherry picked from commit 9c03b33329cb4924716edc1c851913a18b0670dc)
++---
++ src/session.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/src/session.c b/src/session.c
++index 6d62e36..7520a85 100644
++--- a/src/session.c
+++++ b/src/session.c
++@@ -2293,7 +2293,7 @@ struct task *process_session(struct task *t)
++
++ /* Now we can add the server name to a header (if requested) */
++ /* check for HTTP mode and proxy server_name_hdr_name != NULL */
++- if ((s->si[1].state >= SI_ST_CON) &&
+++ if ((s->si[1].state >= SI_ST_CON) && (s->si[1].state < SI_ST_CLO) &&
++ (s->be->server_id_hdr_name != NULL) &&
++ (s->be->mode == PR_MODE_HTTP) &&
++ objt_server(s->target)) {
++--
++2.4.6
++
+diff --git a/feeds/packages/net/haproxy/patches/0016-BUG-MINOR-tools-make-str2sa_range-report-unresolvabl.patch b/feeds/packages/net/haproxy/patches/0016-BUG-MINOR-tools-make-str2sa_range-report-unresolvabl.patch
+new file mode 100644
+index 0000000..c2b6a0f
+--- /dev/null
++++ b/feeds/packages/net/haproxy/patches/0016-BUG-MINOR-tools-make-str2sa_range-report-unresolvabl.patch
+@@ -0,0 +1,36 @@
++From 36456071ea34546d98d3b66a696cd4c4c4643de5 Mon Sep 17 00:00:00 2001
++From: Willy Tarreau <w@1wt.eu>
++Date: Tue, 8 Sep 2015 16:01:25 +0200
++Subject: [PATCH 16/16] BUG/MINOR: tools: make str2sa_range() report
++ unresolvable addresses
++
++If an environment variable is used in an address, and is not set, it's
++silently considered as ":" or "0.0.0.0:0" which is not correct as it
++can hide environment issues and lead to unexpected behaviours. Let's
++report this case when it happens.
++
++This fix should be backported to 1.5.
++(cherry picked from commit 9f69f46d1f1b1d116c00b4b0483c519747f977b7)
++---
++ src/standard.c | 5 +++++
++ 1 file changed, 5 insertions(+)
++
++diff --git a/src/standard.c b/src/standard.c
++index f57724c..9299882 100644
++--- a/src/standard.c
+++++ b/src/standard.c
++@@ -709,6 +709,11 @@ struct sockaddr_storage *str2sa_range(const char *str, int *low, int *high, char
++ goto out;
++ }
++
+++ if (!*str2) {
+++ memprintf(err, "'%s' resolves to an empty address (environment variable missing?)\n", str);
+++ goto out;
+++ }
+++
++ memset(&ss, 0, sizeof(ss));
++
++ if (strncmp(str2, "unix@", 5) == 0) {
++--
++2.4.6
++
+diff --git a/feeds/packages/net/horst/Makefile b/feeds/packages/net/horst/Makefile
+new file mode 100644
+index 0000000..607e270
+--- /dev/null
++++ b/feeds/packages/net/horst/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=horst
++PKG_VERSION:=4.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-git.tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=git://br1.einfach.org/horst
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=version-$(PKG_VERSION)
++
++PKG_MAINTAINER:=Bruno Randolf <br1@einfach.org>
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++MAKE_FLAGS += DEBUG=1
++
++define Package/horst
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=wireless
++ DEPENDS:=+libncurses
++ MAINTAINER:=Bruno Randolf <br1@einfach.org>
++ TITLE:=Highly Optimized 802.11 Radio Scanning Tool
++ URL:=http://br1.einfach.org/tech/horst/
++endef
++
++define Package/horst/description
++ [horst] is a scanning and analysis tool for 802.11 wireless networks
++ and especially IBSS (ad-hoc) mode and mesh networks (OLSR).
++endef
++
++define Package/horst/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/horst $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/horst.sh $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,horst))
+diff --git a/feeds/packages/net/htpdate/Makefile b/feeds/packages/net/htpdate/Makefile
+new file mode 100644
+index 0000000..c5441c2
+--- /dev/null
++++ b/feeds/packages/net/htpdate/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2006 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=htpdate
++PKG_VERSION:=1.1.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.vervest.org/htp/archive/c/
++PKG_MD5SUM:=c612f63282e3f23b709f37a5c81d4739
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/htpdate
++ SUBMENU:=Time Synchronization
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=an HTP (Hypertext Time Protocol) implementation
++ URL:=http://www.vervest.com/htp/
++ MAINTAINER:=Tijs Van Buggenhout <tvbuggen@netzerk.be>
++endef
++
++define Package/htpdate/description
++ The HTTP Time Protocol (HTP) is used to synchronize a computer's time
++ with web servers as reference time source. Htpdate will synchronize your
++ computer's time by extracting timestamps from HTTP headers found
++ in web server responses. Htpdate can be used as a daemon, to keep your
++ computer synchronized.
++endef
++
++define Package/htpdate/conffiles
++/etc/default/htpdate
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ CFLAGS="$(TARGET_CFLAGS)"
++endef
++
++define Package/htpdate/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/htpdate $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/default/
++ $(INSTALL_CONF) ./files/htpdate.default $(1)/etc/default/htpdate
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) ./files/htpdate.init $(1)/etc/init.d/htpdate
++endef
++
++$(eval $(call BuildPackage,htpdate))
++
+diff --git a/feeds/packages/net/htpdate/files/htpdate.default b/feeds/packages/net/htpdate/files/htpdate.default
+new file mode 100644
+index 0000000..94674fd
+--- /dev/null
++++ b/feeds/packages/net/htpdate/files/htpdate.default
+@@ -0,0 +1 @@
++OPTIONS="www.google.com www.yahoo.com www.linux.org www.freebsd.org"
+diff --git a/feeds/packages/net/htpdate/files/htpdate.init b/feeds/packages/net/htpdate/files/htpdate.init
+new file mode 100644
+index 0000000..1409321
+--- /dev/null
++++ b/feeds/packages/net/htpdate/files/htpdate.init
+@@ -0,0 +1,19 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006 OpenWrt.org
++
++START=49
++BIN=htpdate
++DEFAULT=/etc/default/$BIN
++RUN_D=/var/run
++PID_F=$RUN_D/$BIN.pid
++
++start() {
++ [ -f $DEFAULT ] && . $DEFAULT
++ mkdir -p $RUN_D
++ $BIN -l -s -t $OPTIONS && $BIN -D $OPTIONS
++}
++
++stop() {
++ [ -f $PID_F ] && kill $(cat $PID_F)
++}
++
+diff --git a/feeds/packages/net/htpdate/patches/100-adjtimex.patch b/feeds/packages/net/htpdate/patches/100-adjtimex.patch
+new file mode 100644
+index 0000000..ec7c8a9
+--- /dev/null
++++ b/feeds/packages/net/htpdate/patches/100-adjtimex.patch
+@@ -0,0 +1,20 @@
++--- a/htpdate.c
+++++ b/htpdate.c
++@@ -359,7 +359,7 @@ static int htpdate_adjtimex( double drif
++
++ /* Read current kernel frequency */
++ tmx.modes = 0;
++- ntp_adjtime(&tmx);
+++ adjtimex(&tmx);
++
++ /* Calculate new frequency */
++ freq = (long)(65536e6 * drift);
++@@ -377,7 +377,7 @@ static int htpdate_adjtimex( double drif
++ printlog( 1, "seteuid()" );
++ exit(1);
++ } else {
++- return( ntp_adjtime(&tmx) );
+++ return( adjtimex(&tmx) );
++ }
++
++ }
+diff --git a/feeds/packages/net/ibrdtn-tools/Makefile b/feeds/packages/net/ibrdtn-tools/Makefile
+new file mode 100644
+index 0000000..2ffb30a
+--- /dev/null
++++ b/feeds/packages/net/ibrdtn-tools/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ibrdtn-tools
++PKG_VERSION:=1.0.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.ibr.cs.tu-bs.de/projects/ibr-dtn/releases
++PKG_MD5SUM:=3e527cedc6132739403fc210e4f8abe2
++PKG_MAINTAINER:=Johannes Morgenroth <jm@m-network.de>
++PKG_LICENSE:=Apache-2.0
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ibrdtn-tools
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+ibrdtn +libarchive
++ TITLE:=DTN Tools
++endef
++
++define Package/ibrdtn-tools/description
++ The IBR-DTN Tools include functionality for sending and receiving files (dtnsend/dtnrecv)
++ and a tools to ping a DTN node (dtnping).
++endef
++
++CONFIGURE_ARGS += \
++ --without-libdaemon
++
++define Package/ibrdtn-tools/install
++ $(INSTALL_DIR) $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtnping $(1)/usr/bin/dtnping
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtnsend $(1)/usr/bin/dtnsend
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtnrecv $(1)/usr/bin/dtnrecv
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtninbox $(1)/usr/bin/dtninbox
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtnoutbox $(1)/usr/bin/dtnoutbox
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtntrigger $(1)/usr/bin/dtntrigger
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtntracepath $(1)/usr/bin/dtntracepath
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/dtnstream $(1)/usr/bin/dtnstream
++endef
++
++$(eval $(call BuildPackage,ibrdtn-tools))
+diff --git a/feeds/packages/net/ibrdtnd/Makefile b/feeds/packages/net/ibrdtnd/Makefile
+new file mode 100644
+index 0000000..36d5987
+--- /dev/null
++++ b/feeds/packages/net/ibrdtnd/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ibrdtnd
++PKG_VERSION:=1.0.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.ibr.cs.tu-bs.de/projects/ibr-dtn/releases
++PKG_MD5SUM:=933d37bf777700a6e1709d0f7a129613
++PKG_MAINTAINER:=Johannes Morgenroth <jm@m-network.de>
++PKG_LICENSE:=Apache-2.0
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ibrdtnd
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+dtndht +ibrdtn +libsqlite3
++ TITLE:=DTN Daemon
++endef
++
++define Package/ibrdtnd/conffiles
++/etc/config/ibrdtn
++endef
++
++define Package/ibrdtnd/description
++ The implementation of the bundle protocol of the IBR (TU Braunschweig).
++endef
++
++CONFIGURE_ARGS += \
++ --with-tls \
++ --with-sqlite \
++ --with-dht \
++ --without-wifip2p \
++ --without-vmime \
++ --disable-libdaemon
++
++define Package/ibrdtnd/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dtnd $(1)/usr/sbin/
++ $(INSTALL_BIN) files/safety-wrapper.sh $(1)/usr/sbin/dtnd-safety-wrapper.sh
++ $(INSTALL_DIR) $(1)/usr/share/ibrdtn/
++ $(INSTALL_BIN) files/build-config.sh $(1)/usr/share/ibrdtn/build-config.sh
++ $(INSTALL_BIN) files/mkcontainer.sh $(1)/usr/share/ibrdtn/mkcontainer.sh
++ $(INSTALL_BIN) files/mountcontainer.sh $(1)/usr/share/ibrdtn/mountcontainer.sh
++ $(INSTALL_BIN) files/systemcheck.sh $(1)/usr/share/ibrdtn/systemcheck.sh
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) files/ibrdtn.init $(1)/etc/init.d/ibrdtn
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) files/ibrdtn.uci $(1)/etc/config/ibrdtn
++endef
++
++$(eval $(call BuildPackage,ibrdtnd))
+diff --git a/feeds/packages/net/ibrdtnd/files/build-config.sh b/feeds/packages/net/ibrdtnd/files/build-config.sh
+new file mode 100644
+index 0000000..c9a6128
+--- /dev/null
++++ b/feeds/packages/net/ibrdtnd/files/build-config.sh
+@@ -0,0 +1,173 @@
++#!/bin/sh
++#
++# convert uci configuration into daemon specific format
++#
++
++UCI=/sbin/uci
++
++create_file() {
++ echo "# -- DO NOT EDIT THIS FILE --" > $1
++ echo "# automatic generated configuration file for IBR-DTN daemon" >> $1
++ echo "#" >> $1
++}
++
++add_param() {
++ VALUE=`$UCI -q get $2`
++
++ if [ $? == 0 ]; then
++ echo "$3 = $VALUE" >> $1
++ fi
++}
++
++getconfig() {
++ $UCI -q get ibrdtn.$1
++ return $?
++}
++
++if [ "$1" == "--safe-mode" ]; then
++ SAFEMODE=yes
++ CONFFILE=$2
++else
++ SAFEMODE=no
++ CONFFILE=$1
++fi
++
++# create the file and write some header info
++create_file $CONFFILE
++
++add_param $CONFFILE "ibrdtn.main.uri" "local_uri"
++add_param $CONFFILE "ibrdtn.main.routing" "routing"
++add_param $CONFFILE "ibrdtn.main.fragmentation" "fragmentation"
++
++if [ "$SAFEMODE" == "yes" ]; then
++ if [ -n "`getconfig safemode.forwarding`" ]; then
++ add_param $CONFFILE "ibrdtn.safemode.forwarding" "routing_forwarding"
++ else
++ add_param $CONFFILE "ibrdtn.main.forwarding" "routing_forwarding"
++ fi
++
++ if [ -n "`getconfig safemode.maxblock`" ]; then
++ add_param $CONFFILE "ibrdtn.safemode.maxblock" "limit_blocksize"
++ else
++ add_param $CONFFILE "ibrdtn.main.blocksize" "limit_blocksize"
++ fi
++
++ if [ -n "`getconfig safemode.storage`" ]; then
++ add_param $CONFFILE "ibrdtn.safemode.storage" "limit_storage"
++ else
++ add_param $CONFFILE "ibrdtn.storage.limit" "limit_storage"
++ fi
++else
++ add_param $CONFFILE "ibrdtn.main.forwarding" "routing_forwarding"
++ add_param $CONFFILE "ibrdtn.main.blocksize" "limit_blocksize"
++ add_param $CONFFILE "ibrdtn.storage.limit" "limit_storage"
++ add_param $CONFFILE "ibrdtn.storage.blobs" "blob_path"
++ add_param $CONFFILE "ibrdtn.storage.bundles" "storage_path"
++ add_param $CONFFILE "ibrdtn.storage.engine" "storage"
++fi
++
++add_param $CONFFILE "ibrdtn.main.max_predated_timestamp" "limit_predated_timestamp"
++add_param $CONFFILE "ibrdtn.main.limit_lifetime" "limit_lifetime"
++add_param $CONFFILE "ibrdtn.main.foreign_blocksize" "limit_foreign_blocksize"
++
++add_param $CONFFILE "ibrdtn.discovery.address" "discovery_address"
++add_param $CONFFILE "ibrdtn.discovery.timeout" "discovery_timeout"
++add_param $CONFFILE "ibrdtn.discovery.version" "discovery_version"
++add_param $CONFFILE "ibrdtn.discovery.crosslayer" "discovery_crosslayer"
++
++add_param $CONFFILE "ibrdtn.tcptuning.idle_timeout" "tcp_idle_timeout"
++add_param $CONFFILE "ibrdtn.tcptuning.nodelay" "tcp_nodelay"
++add_param $CONFFILE "ibrdtn.tcptuning.chunksize" "tcp_chunksize"
++
++add_param $CONFFILE "ibrdtn.security.level" "security_level"
++add_param $CONFFILE "ibrdtn.security.bab_key" "security_bab_default_key"
++add_param $CONFFILE "ibrdtn.security.key_path" "security_path"
++add_param $CONFFILE "ibrdtn.security.generate_dh" "generate_dh_params"
++
++add_param $CONFFILE "ibrdtn.tls.certificate" "security_certificate"
++add_param $CONFFILE "ibrdtn.tls.key" "security_key"
++add_param $CONFFILE "ibrdtn.tls.trustedpath" "security_trusted_ca_path"
++add_param $CONFFILE "ibrdtn.tls.required" "security_tls_required"
++add_param $CONFFILE "ibrdtn.tls.noencryption" "security_tls_disable_encryption"
++add_param $CONFFILE "ibrdtn.tls.fallback_badclock" "security_tls_fallback_badclock"
++
++add_param $CONFFILE "ibrdtn.timesync.reference" "time_reference"
++add_param $CONFFILE "ibrdtn.timesync.synchronize" "time_synchronize"
++add_param $CONFFILE "ibrdtn.timesync.discovery_announcement" "time_discovery_announcements"
++add_param $CONFFILE "ibrdtn.timesync.sigma" "time_sigma"
++add_param $CONFFILE "ibrdtn.timesync.psi" "time_psi"
++add_param $CONFFILE "ibrdtn.timesync.sync_level" "time_sync_level"
++add_param $CONFFILE "ibrdtn.timesync.time_set_clock" "time_set_clock"
++
++add_param $CONFFILE "ibrdtn.dht.enabled" "dht_enabled"
++add_param $CONFFILE "ibrdtn.dht.port" "dht_port"
++add_param $CONFFILE "ibrdtn.dht.id" "dht_id"
++add_param $CONFFILE "ibrdtn.dht.bootstrap" "dht_bootstrapping"
++add_param $CONFFILE "ibrdtn.dht.nodesfile" "dht_nodes_file"
++add_param $CONFFILE "ibrdtn.dht.enable_ipv4" "dht_enable_ipv4"
++add_param $CONFFILE "ibrdtn.dht.enable_ipv6" "dht_enable_ipv6"
++add_param $CONFFILE "ibrdtn.dht.bind_ipv4" "dht_bind_ipv4"
++add_param $CONFFILE "ibrdtn.dht.bind_ipv6" "dht_bind_ipv6"
++add_param $CONFFILE "ibrdtn.dht.ignore_neighbour_informations" "dht_ignore_neighbour_informations"
++add_param $CONFFILE "ibrdtn.dht.allow_neighbours_to_announce_me" "dht_allow_neighbours_to_announce_me"
++add_param $CONFFILE "ibrdtn.dht.allow_neighbour_announcement" "dht_allow_neighbour_announcement"
++
++
++# iterate through all network interfaces
++iter=0
++netinterfaces=
++netinternet=
++while [ 1 == 1 ]; do
++ $UCI -q get "ibrdtn.@network[$iter]" > /dev/null
++ if [ $? == 0 ]; then
++ netinterfaces="${netinterfaces} lan${iter}"
++ add_param $CONFFILE "ibrdtn.@network[$iter].type" "net_lan${iter}_type"
++ add_param $CONFFILE "ibrdtn.@network[$iter].interface" "net_lan${iter}_interface"
++ add_param $CONFFILE "ibrdtn.@network[$iter].port" "net_lan${iter}_port"
++ if [ "$(uci -q get ibrdtn.@network[$iter].global)" == "yes" ]; then
++ netinternet="${netinternet} $(uci -q get ibrdtn.@network[$iter].interface)"
++ fi
++ else
++ break
++ fi
++
++ let iter=iter+1
++done
++
++# write list of network interfaces
++echo "net_interfaces =$netinterfaces" >> $CONFFILE
++echo "net_internet =${netinternet}" >> $CONFFILE
++
++# iterate through all static routes
++iter=0
++while [ 1 == 1 ]; do
++ $UCI -q get "ibrdtn.@static-route[$iter]" > /dev/null
++ if [ $? == 0 ]; then
++ PATTERN=`$UCI -q get "ibrdtn.@static-route[$iter].pattern"`
++ DESTINATION=`$UCI -q get "ibrdtn.@static-route[$iter].destination"`
++ let NUMBER=iter+1
++ echo "route$NUMBER = $PATTERN $DESTINATION" >> $CONFFILE
++ else
++ break
++ fi
++
++ let iter=iter+1
++done
++
++#iterate through all static connections
++iter=0
++while [ 1 == 1 ]; do
++ $UCI -q get "ibrdtn.@static-connection[$iter]" > /dev/null
++ if [ $? == 0 ]; then
++ let NUMBER=iter+1
++ add_param $CONFFILE "ibrdtn.@static-connection[$iter].uri" "static${NUMBER}_uri"
++ add_param $CONFFILE "ibrdtn.@static-connection[$iter].address" "static${NUMBER}_address"
++ add_param $CONFFILE "ibrdtn.@static-connection[$iter].port" "static${NUMBER}_port"
++ add_param $CONFFILE "ibrdtn.@static-connection[$iter].protocol" "static${NUMBER}_proto"
++ add_param $CONFFILE "ibrdtn.@static-connection[$iter].immediately" "static${NUMBER}_immediately"
++ else
++ break
++ fi
++
++ let iter=iter+1
++done
+diff --git a/feeds/packages/net/ibrdtnd/files/ibrdtn.init b/feeds/packages/net/ibrdtnd/files/ibrdtn.init
+new file mode 100644
+index 0000000..5a00c24
+--- /dev/null
++++ b/feeds/packages/net/ibrdtnd/files/ibrdtn.init
+@@ -0,0 +1,71 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007 OpenWrt.org
++
++START=90
++
++start() {
++ # check if the daemon is disabled
++ if [ "`/sbin/uci -P/var/state -q get ibrdtn.disable`" == "1" ]; then
++ /bin/echo "dtnd is disabled"
++ return
++ fi
++
++ /bin/echo -n "running dtnd ..."
++
++ # startup the safety-wrapper for the daemon
++ /usr/sbin/dtnd-safety-wrapper.sh &
++
++ # store the pid of the process in uci states
++ /sbin/uci -P/var/state -q set ibrdtn.safetypid=`echo $!`
++
++ /bin/echo " done"
++}
++
++stop() {
++ # check if the daemon is disabled
++ if [ "`/sbin/uci -P/var/state -q get ibrdtn.disable`" == "1" ]; then
++ /bin/echo "dtnd is disabled"
++ return
++ fi
++
++ /bin/echo -n "stopping dtnd ..."
++
++ # set state to None, this indicates a clear shutdown to the safety-wrapper.
++ /sbin/uci -P/var/state -q set ibrdtn.state=None
++
++ # stop the safety-wrapper
++ if [ -n "`/sbin/uci -P/var/state -q get ibrdtn.safetypid`" ]; then
++ /usr/bin/kill `/sbin/uci -P/var/state -q get ibrdtn.safetypid` 2> /dev/null >/dev/null
++ fi
++
++ # finally kill really all safety-wrapper!
++ /bin/sleep 2
++ /usr/bin/killall -9 dtnd-safety-wrapper.sh
++
++ # send a kill signal to the daemon
++ /usr/bin/killall dtnd 2> /dev/null >/dev/null
++
++ # wait for some time
++ TIMEOUT=0;
++
++ # check if the daemon is running
++ while [ -n "`ps | grep dtnd | grep -v grep`" ]; do
++ # check if the daemon is still running
++ if [ $TIMEOUT -ge 10 ]; then
++ /bin/echo " killing"
++ # kill all processes of dtnd
++ /usr/bin/killall -9 dtnd 2> /dev/null >/dev/null
++ return
++ fi
++
++ # increment timeout
++ TIMEOUT=`expr $TIMEOUT + 1`
++
++ echo -n "."
++
++ # wait some time
++ /bin/sleep 1
++ done
++
++ echo " done"
++}
+diff --git a/feeds/packages/net/ibrdtnd/files/ibrdtn.uci b/feeds/packages/net/ibrdtnd/files/ibrdtn.uci
+new file mode 100644
+index 0000000..e025681
+--- /dev/null
++++ b/feeds/packages/net/ibrdtnd/files/ibrdtn.uci
+@@ -0,0 +1,176 @@
++#####################################
++# IBR-DTN daemon #
++#####################################
++
++config 'daemon' 'main'
++ # The local eid of the dtn node. Default is the hostname.
++# option uri dtn://node.dtn
++
++ # logfile for standard output
++ option logfile /tmp/ibrdtn.log
++ option errfile /tmp/ibrdtn.err
++
++ # debug level
++# option debug 20
++
++ # block size limit
++# option blocksize 512M
++# option foreign_blocksize 128M
++
++
++#
++# If something bad happened, the safe mode will be activated.
++# These are the restrictions for safe mode only.
++#
++config 'daemon' 'safemode'
++ option forwarding no
++ option storage 64M
++ option maxblock 16M
++# option wait_mount /dev/sda1
++
++
++#####################################
++# storage configuration #
++#####################################
++
++config 'daemon' 'storage'
++ # possible engines are: simple, sqlite
++ option engine simple
++ option blobs /tmp/ibrdtn/blobs
++ option bundles /tmp/ibrdtn/bundles
++# option container /tmp/ibrdtn/container.img
++# option path /tmp/ibrdtn/container
++# option limit 1G
++
++
++#####################################
++# routing configuration #
++#####################################
++
++#
++# In the "default" the daemon only delivers bundles to neighbors and static
++# available nodes. The alternative module "epidemic" spread all bundles to
++# all available neighbors.
++#
++config 'daemon' 'main'
++ # values: none | default | epidemic | flooding | prophet
++ option routing prophet
++# option forwarding no
++# option fragmentation yes
++
++#
++# static routing rules
++# - a rule is a regex pattern
++# - format is <target-scheme> <routing-node>
++#
++#config 'static-route'
++# list pattern ^dtn://[[:alpha:]].moon.dtn/[[:alpha:]]
++# option destination dtn://router.dtn
++
++
++#####################################
++# static connections
++#####################################
++
++#config 'static-connection'
++# option uri dtn://node-five.dtn
++# option address 10.0.0.5
++# option port 4556
++# option protocol tcp
++# option immediately yes
++
++#config 'static-connection'
++# option uri dtn://node-ten
++# option address 10.0.0.10
++# option port 4556
++# option protocol udp
++# option immediately no
++
++
++#####################################
++# convergence layer configuration #
++#####################################
++
++#
++# You can specify an multicast address to listen to for discovery announcements.
++# If no address is specified the multicast equivalent of broadcast is used.
++#
++config 'daemon' 'discovery'
++# option address 224.0.0.1
++# option timeout 5
++# option crosslayer yes
++
++config 'daemon' 'tcptuning'
++# option 'idle_timeout' 120
++# option 'nodelay' yes
++# option 'chunksize' 4096
++
++config 'network'
++ option type tcp
++ option interface eth0
++ option port 4556
++ option global yes
++
++#config 'network'
++# option type tcp
++# option interface wlan0
++# option port 4556
++
++
++#####################################
++# bundle security protocol #
++#####################################
++
++#
++# the level specifies the security constains
++#
++# 0 = no constrains (default)
++# 1 = accept only BAB authenticated bundles
++# 2 = accept only encrypted bundles
++# 3 = accept only BAB authenticated and encrypted bundles
++#
++
++#config 'daemon' 'security'
++# option level 0
++# option bab_key /path/to/default-bab-key.mac
++# option key_path /path/to/security-keys
++# option generate_dh yes
++
++#config 'daemon' 'tls'
++# option certificate /path/to/tls-cert.crt
++# option key /path/to/tls-key.key
++# option trustedpath /path/to/tls-ca
++# option required no
++# option noencryption no
++
++
++#####################################
++# time synchronization #
++#####################################
++
++#config 'daemon' 'timesync'
++# option reference yes
++# option synchronize yes
++# option discovery_announcement yes
++# option sigma 1.001
++# option psi 0.9
++# option sync_level 0.1
++
++#####################################
++# DHT #
++#####################################
++
++config 'daemon' 'dht'
++# option 'enabled' 'yes'
++# option 'id' '<enter your unique id here>'
++ option 'bootstrap' 'yes'
++# option 'nodesfile' '/tmp/dht_nodes.dat'
++ option 'port' '9999'
++ option 'enable_ipv6' 'no'
++# option 'enable_ipv4' 'no'
++# option 'bind_ipv4' '127.0.0.1'
++# option 'bind_ipv6' '::1'
++ option 'ignore_neighbour_informations' 'yes'
++ option 'allow_neighbours_to_announce_me' 'no'
++ option 'allow_neighbour_announcement' 'no'
++
+diff --git a/feeds/packages/net/ibrdtnd/files/mkcontainer.sh b/feeds/packages/net/ibrdtnd/files/mkcontainer.sh
+new file mode 100644
+index 0000000..5718111
+--- /dev/null
++++ b/feeds/packages/net/ibrdtnd/files/mkcontainer.sh
+@@ -0,0 +1,43 @@
++#!/bin/sh
++#
++# This script creates a bundle storage of a given size.
++#
++# $1 = container file
++# $2 = size of the container in MB
++#
++
++help_message() {
++ echo "usage: "
++ echo " $0 <container file> <size in MB>"
++}
++
++if [ $# -le 1 ]; then
++ help_message
++ exit 1
++fi
++
++CONTAINER=$(cd "$(dirname "$1")"; pwd)/$(basename $1)
++SIZE=$2
++
++# check if the container already exists
++if [ -f $CONTAINER ]; then
++ echo "Aborted! The specified container already exists."
++ exit 1
++fi
++
++# create the container
++echo -n "creating the container file..."
++/bin/dd if=/dev/zero of=$CONTAINER bs=1M count=$SIZE >/dev/null 2>/dev/null
++echo " done"
++
++# create file system
++echo -n "initializing ext3 filesystem for the container..."
++/usr/sbin/mkfs.ext3 -q -F $CONTAINER > /dev/null
++echo " done"
++
++# final hint
++echo "The container is now ready. To use it with IBR-DTN set the container with:"
++echo "# uci set ibrdtn.storage.container=$CONTAINER"
++echo "# uci set ibrdtn.storage.container_size=$SIZE"
++
++exit 0
+diff --git a/feeds/packages/net/ibrdtnd/files/mountcontainer.sh b/feeds/packages/net/ibrdtnd/files/mountcontainer.sh
+new file mode 100644
+index 0000000..2eaed2f
+--- /dev/null
++++ b/feeds/packages/net/ibrdtnd/files/mountcontainer.sh
+@@ -0,0 +1,122 @@
++#!/bin/sh
++#
++
++CONTAINER=`/sbin/uci -q get ibrdtn.storage.container`
++CPATH=`/sbin/uci -q get ibrdtn.storage.path`
++
++check_var() {
++ if [ -z "$1" ]; then
++ echo "$2"
++ exit 1
++ fi
++}
++
++check_path() {
++ if [ ! -d "$1" ]; then
++ echo "$2"
++ return 1
++ fi
++}
++
++check_file() {
++ if [ ! -f "$1" ]; then
++ echo "$2"
++ exit 1
++ fi
++}
++
++container_mount() {
++ CONTAINER=`/sbin/uci -q get ibrdtn.storage.container`
++ CPATH=`/sbin/uci -q get ibrdtn.storage.path`
++
++ if [ -z "`mount | grep ' on $CPATH '`" ]; then
++ # try to mount the container
++ /bin/mount -o loop $CONTAINER $CPATH
++
++ return $?
++ fi
++
++ return 0
++}
++
++container_reinitialize() {
++ SIZE=`/sbin/uci get -q ibrdtn.storage.container_size`
++ CONTAINER=`/sbin/uci -q get ibrdtn.storage.container`
++
++ # try to rebuild the container
++ if [ -n "$SIZE" ]; then
++ /bin/rm -f $CONTAINER
++ /usr/share/ibrdtn/mkcontainer.sh $CONTAINER $SIZE
++
++ if [ $? -eq 0 ]; then
++ container_mount
++ return $?
++ fi
++
++ return 1
++ fi
++
++ return 1
++}
++
++check_var $CONTAINER "Storage container not set in uci.\nuse: uci set ibrdtn.storage.container=<container-file>"
++check_var $CPATH "Storage container mount path not set in uci.\nuse: uci set ibrdtn.storage.path=<mount-path>"
++
++check_path $CPATH "Storage container mount path does not exist."
++if [ $? -gt 0 ]; then
++ /bin/mkdir -p $CPATH
++
++ if [ $? -gt 0 ]; then
++ echo "can not create container mount path."
++ exit 1
++ fi
++fi
++
++if [ "$1" == "-u" ]; then
++ /bin/umount $CPATH
++ exit 0
++fi
++
++if [ -n "`/bin/mount | grep $CPATH`" ]; then
++ echo "Container already mounted"
++ exit 0
++fi
++
++if [ ! -f "$CONTAINER" ]; then
++ echo "Storage container file $CONTAINER does not exist."
++ container_reinitialize
++ exit $?
++fi
++
++# try to mount the container
++container_mount
++
++if [ $? -gt 0 ]; then
++ echo -n "can not mount container file. checking... "
++ /usr/sbin/e2fsck -p $CONTAINER
++
++ if [ $? -gt 0 ]; then
++ echo " error"
++ echo "Container file $CONTAINER broken. Try to reinitialize the container."
++ container_reinitialize
++
++ if [ $? -eq 0 ]; then
++ echo "container ready!"
++ exit 0
++ else
++ exit 1
++ fi
++ fi
++ echo "done"
++
++ container_mount
++
++ if [ $? -gt 0 ]; then
++ echo "mount failed!"
++ exit 1
++ fi
++fi
++
++echo "container ready!"
++exit 0
++
+diff --git a/feeds/packages/net/ibrdtnd/files/safety-wrapper.sh b/feeds/packages/net/ibrdtnd/files/safety-wrapper.sh
+new file mode 100644
+index 0000000..2f35283
+--- /dev/null
++++ b/feeds/packages/net/ibrdtnd/files/safety-wrapper.sh
+@@ -0,0 +1,172 @@
++#!/bin/sh
++#
++# safety wrapper for IBR-DTN daemon
++#
++# Tasks:
++# * start IBR-DTN daemon
++# * restart the daemon after a crash
++# * if respawning to fast, then slow down with backoff
++# * check for enough space on disk and delete bundles if necessary.
++# * clean the blob directory on startup
++#
++
++DTND=/usr/sbin/dtnd
++TMPCONF=/tmp/ibrdtn.config
++UCI=/sbin/uci
++
++getstate() {
++ $UCI -P/var/state -q get ibrdtn.$1
++ return $?
++}
++
++setstate() {
++ $UCI -P/var/state -q set ibrdtn.$1=$2
++ return $?
++}
++
++getconfig() {
++ $UCI -q get ibrdtn.$1
++ return $?
++}
++
++setconfig() {
++ $UCI -q set ibrdtn.$1=$2
++ return $?
++}
++
++# remove the old state file
++/bin/rm /var/state/ibrdtn
++
++# read uci configuration
++BLOB_PATH=`getconfig storage.blobs`
++BUNDLE_PATH=`getconfig storage.bundles`
++CONTAINER_PATH=`getconfig storage.path`
++CONTAINER_FILE=`getconfig storage.container`
++LOG_FILE=`getconfig main.logfile`
++ERR_FILE=`getconfig main.errfile`
++DEBUG_LEVEL=`getconfig main.debug`
++SAFEMODE=no
++
++# run a system check
++/bin/sh /usr/share/ibrdtn/systemcheck.sh
++
++if [ $? -eq 0 ]; then
++ # mount container if specified
++ if [ -n "$CONTAINER_FILE" ] && [ -n "$CONTAINER_PATH" ]; then
++ /bin/sh /usr/share/ibrdtn/mountcontainer.sh
++
++ # if the mount of the container failed
++ # switch to safe mode!
++ if [ $? -gt 0 ]; then
++ SAFEMODE=yes
++ fi
++ fi
++else
++ SAFEMODE=yes
++fi
++
++# create blob & bundle path
++if [ -n "$BLOB_PATH" ]; then
++ /bin/mkdir -p $BLOB_PATH
++
++ # clean the blob directory on startup
++ /bin/rm -f $BLOB_PATH/file*
++fi
++
++if [ -n "$BUNDLE_PATH" ]; then
++ /bin/mkdir -p $BUNDLE_PATH
++fi
++
++LOGGING=""
++if [ -n "$LOG_FILE" ]; then
++ LOGGING="$LOGGING > $LOG_FILE"
++else
++ LOGGING="$LOGGING > /dev/null"
++fi
++
++if [ -n "$ERR_FILE" ]; then
++ LOGGING="$LOGGING 2> $ERR_FILE"
++else
++ LOGGING="$LOGGING 2> /dev/null"
++fi
++
++if [ -z "$LOG_FILE" ] && [ -z "$ERR_FILE" ]; then
++ LOGGING="-q"
++fi
++
++# check for debugging option
++if [ -n "$DEBUG_LEVEL" ]; then
++ DEBUG_ARGS="-v -d ${DEBUG_LEVEL}"
++else
++ DEBUG_ARGS=""
++fi
++
++# create configuration
++if [ "$SAFEMODE" == "yes" ]; then
++ /bin/sh /usr/share/ibrdtn/build-config.sh --safe-mode $TMPCONF
++else
++ /bin/sh /usr/share/ibrdtn/build-config.sh $TMPCONF
++fi
++
++# set the crash counter to zero
++CRASH=0
++
++# run the daemon
++setstate state running
++
++while [ "`getstate state`" == "running" ]; do
++ # run a system check
++ /bin/sh /usr/share/ibrdtn/systemcheck.sh
++
++ # run in safe mode if the system check has failed
++ if [ $? -gt 0 ] && [ "$SAFEMODE" == "no" ]; then
++ SAFEMODE=yes
++ /usr/bin/logger -t "ibrdtn-safe-wrapper" -p 2 "system check failed! Switch to safe-mode settings."
++ /bin/sh /usr/share/ibrdtn/build-config.sh --safe-mode $TMPCONF
++ fi
++
++ # measure the running time
++ TIMESTART=`/bin/date +%s`
++
++ # run the daemon
++ echo "${DTND} ${DEBUG_ARGS} -c ${TMPCONF} ${LOGGING}" | /bin/sh
++
++ # measure the stopping time
++ TIMESTOP=`/bin/date +%s`
++
++ # calc the running time
++ let TIMERUN=$TIMESTOP-$TIMESTART
++
++ # reset the CRASH counter if there is one hour between the crashes
++ if [ $TIMERUN -ge 3600 ]; then
++ CRASH=0
++ fi
++
++ # check if the daemon is crashed
++ if [ "`getstate state`" == "running" ]; then
++ # if the crash counter is higher than 20 switch to safe-mode settings
++ if [ $CRASH -eq 20 ] && [ "$SAFEMODE" == "no" ]; then
++ SAFEMODE=yes
++ /usr/bin/logger -t "ibrdtn-safe-wrapper" -p 2 "IBR-DTN daemon crashed 20 times! Switch to safe-mode settings."
++ /bin/sh /usr/share/ibrdtn/build-config.sh --safe-mode $TMPCONF
++ fi
++
++ # increment the crash counter
++ let CRASH=$CRASH+1
++
++ # backoff wait timer
++ let WAIT=2**$CRASH
++
++ # set a upper limit for the wait time
++ if [ $WAIT -ge 1800 ]; then
++ WAIT=1800
++ fi
++
++ # log the crash
++ /usr/bin/logger -t "ibrdtn-safe-wrapper" -p 2 "IBR-DTN daemon crashed $CRASH times! Wait $WAIT seconds."
++
++ # wait sometime
++ /bin/sleep $WAIT
++ fi
++done
++
+diff --git a/feeds/packages/net/ibrdtnd/files/systemcheck.sh b/feeds/packages/net/ibrdtnd/files/systemcheck.sh
+new file mode 100644
+index 0000000..3110bcf
+--- /dev/null
++++ b/feeds/packages/net/ibrdtnd/files/systemcheck.sh
+@@ -0,0 +1,101 @@
++#!/bin/sh
++#
++#
++
++check_mounted() {
++ DIR=$1
++ while [ "$DIR" != "/" ]; do
++ if [ -n "`mount | grep "$DIR"`" ]; then
++ return 0
++ fi
++
++ DIR=`dirname $DIR`
++ done
++ return 1
++}
++
++check_writable() {
++ CHECKFILE="$1/.container-lock"
++ /bin/touch $CHECKFILE
++
++ if [ $? -gt 0 ]; then
++ return 1;
++ fi
++
++ /bin/echo "0123456789" >> $CHECKFILE
++
++ if [ $? -gt 0 ]; then
++ return 2;
++ fi
++
++ /bin/rm $CHECKFILE
++
++ if [ $? -gt 0 ]; then
++ return 3;
++ fi
++}
++
++check_mountdev() {
++ # get wait_mount option
++ WAIT_MOUNT_DEV=`uci -q get ibrdtn.safemode.wait_mount`
++
++ if [ $? -ne 0 ]; then
++ return 0
++ fi
++
++ DATA=`mount | grep ${WAIT_MOUNT_DEV}`
++
++ if [ -n "${DATA}" ]; then
++ return 0
++ fi
++
++ return 1
++}
++
++# check the storage device
++check_mountdev
++RET=$?
++
++if [ ${RET} -ne 0 ]; then
++ WAIT_SECONDS=60
++ /usr/bin/logger -t "systemcheck.sh" -p 2 "disk storage not ready, wait max. ${WAIT_SECONDS} seconds until it is mounted"
++ while [ ${RET} -ne 0 ] && [ ${WAIT_SECONDS} -ne 0 ]; do
++ sleep 1
++ let WAIT_SECONDS=WAIT_SECONDS-1
++ check_mountdev
++ RET=$?
++ done
++fi
++
++if [ ${RET} -ne 0 ]; then
++ # failed, storage not mounted
++ exit 1
++fi
++
++# get the path for the container
++CONTAINER=`uci -q get ibrdtn.storage.container`
++
++if [ -z "$CONTAINER" ]; then
++ exit 0
++fi
++
++CONTAINER_PATH=`dirname $CONTAINER`
++
++if [ -n "$CONTAINER_PATH" ]; then
++ # check if the container is on a mounted device
++ check_mounted $CONTAINER_PATH
++
++ if [ $? -gt 0 ]; then
++ # failed
++ exit 1
++ fi
++
++ # check if the device is writable
++ check_writable $CONTAINER_PATH
++
++ if [ $? -gt 0 ]; then
++ # failed
++ exit 1
++ fi
++fi
++
+diff --git a/feeds/packages/net/iodine/Makefile b/feeds/packages/net/iodine/Makefile
+new file mode 100644
+index 0000000..0663997
+--- /dev/null
++++ b/feeds/packages/net/iodine/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2006-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=iodine
++PKG_VERSION:=0.7.0
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://code.kryo.se/iodine/
++PKG_MD5SUM:=fdbf3b81cd69caf5230d76a8b039fd99
++
++PKG_MAINTAINER:=Uwe Kleine-König <uwe+openwrt@kleine-koenig.org>
++PKG_LICENSE:=ISC
++PKG_LICENSE_FILES:=README
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/iodine/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Firewall Tunnel
++ DEPENDS:= +kmod-tun +zlib
++ TITLE:=IP over DNS tunneling
++ URL:=http://code.kryo.se/iodine/
++endef
++
++define Package/iodine
++ $(call Package/iodine/Default)
++ TITLE+= client version
++endef
++
++define Package/iodine/description
++ iodine client version
++endef
++
++define Package/iodined
++ $(call Package/iodine/Default)
++ TITLE+= server version
++endef
++
++define Package/iodined/description
++ iodine server version
++endef
++
++define Build/Configure
++endef
++
++define Package/iodine/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/iodine $(1)/usr/sbin
++endef
++
++define Package/iodined/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/iodined.init $(1)/etc/init.d/iodined
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/iodined.config $(1)/etc/config/iodined
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/iodined $(1)/usr/sbin
++endef
++
++define Package/iodined/conffiles
++/etc/config/iodined
++endef
++
++$(eval $(call BuildPackage,iodine))
++$(eval $(call BuildPackage,iodined))
+diff --git a/feeds/packages/net/iodine/files/iodined.config b/feeds/packages/net/iodine/files/iodined.config
+new file mode 100644
+index 0000000..f95549d
+--- /dev/null
++++ b/feeds/packages/net/iodine/files/iodined.config
+@@ -0,0 +1,5 @@
++config iodined
++ option address ''
++ option password ''
++ option tunnelip '10.0.0.1'
++ option tld ''
+diff --git a/feeds/packages/net/iodine/files/iodined.init b/feeds/packages/net/iodine/files/iodined.init
+new file mode 100644
+index 0000000..48dea61
+--- /dev/null
++++ b/feeds/packages/net/iodine/files/iodined.init
+@@ -0,0 +1,27 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=50
++
++start_instance () {
++ local section="$1"
++ config_get address "$section" 'address'
++ config_get password "$section" 'password'
++ config_get tunnelip "$section" 'tunnelip'
++ config_get tld "$section" 'tld'
++ config_get port "$section" 'port'
++
++ test -n "$address" || address='0.0.0.0'
++ test -n "$port" || port='53'
++
++ service_start /usr/sbin/iodined -l "$address" -P "$password" -p "$port" "$tunnelip" "$tld"
++}
++
++start() {
++ config_load 'iodined'
++ config_foreach start_instance 'iodined'
++}
++
++stop() {
++ service_stop /usr/sbin/iodined
++}
+diff --git a/feeds/packages/net/iodine/patches/010-cross-compile.patch b/feeds/packages/net/iodine/patches/010-cross-compile.patch
+new file mode 100644
+index 0000000..40dfb0a
+--- /dev/null
++++ b/feeds/packages/net/iodine/patches/010-cross-compile.patch
+@@ -0,0 +1,24 @@
++--- iodine-0.7.0.orig/src/osflags
+++++ iodine-0.7.0/src/osflags
++@@ -16,12 +16,6 @@ link)
++ windows32)
++ echo '-lws2_32 -liphlpapi';
++ ;;
++- Linux)
++- FLAGS="";
++- [ -e /usr/include/selinux/selinux.h ] && FLAGS="$FLAGS -lselinux";
++- [ -e /usr/include/systemd/sd-daemon.h ] && FLAGS="$FLAGS -lsystemd-daemon";
++- echo $FLAGS;
++- ;;
++ esac
++ ;;
++ cflags)
++@@ -34,8 +28,6 @@ cflags)
++ ;;
++ Linux)
++ FLAGS="-D_GNU_SOURCE"
++- [ -e /usr/include/selinux/selinux.h ] && FLAGS="$FLAGS -DHAVE_SETCON";
++- [ -e /usr/include/systemd/sd-daemon.h ] && FLAGS="$FLAGS -DHAVE_SYSTEMD";
++ echo $FLAGS;
++ ;;
++ esac
+diff --git a/feeds/packages/net/iodine/patches/100-musl-compatibility.patch b/feeds/packages/net/iodine/patches/100-musl-compatibility.patch
+new file mode 100644
+index 0000000..17ddc04
+--- /dev/null
++++ b/feeds/packages/net/iodine/patches/100-musl-compatibility.patch
+@@ -0,0 +1,26 @@
++commit 9603c1848ddd4d9bb2d6ab031fcef91f543b71a0
++Author: Maxim Storchak <m.storchak@gmail.com>
++Date: Thu Jun 25 19:38:24 2015 +0300
++
++ Fix compatibility with musl for OpenWRT
++
++ This patch breaks builds for Windows and Android, but since the only
++ libc flavors OpenWRT currently cares about are musl, uClibc and glibc,
++ this should be fine.
++
++ The reason for such brutal intrusiuon is explained in musl FAQ:
++ http://wiki.musl-libc.org/wiki/FAQ#Q:_why_is_there_no_MUSL_macro_.3F
++
++diff --git a/src/common.c b/src/common.c
++index 2715979..5f0e370 100644
++--- a/src/common.c
+++++ b/src/common.c
++@@ -57,7 +57,7 @@
++ const unsigned char raw_header[RAW_HDR_LEN] = { 0x10, 0xd1, 0x9e, 0x00 };
++
++ /* daemon(3) exists only in 4.4BSD or later, and in GNU libc */
++-#if !defined(ANDROID) && !defined(WINDOWS32) && !(defined(BSD) && (BSD >= 199306)) && !defined(__GLIBC__)
+++#ifdef __UCLIBC__
++ static int daemon(int nochdir, int noclose)
++ {
++ int fd, i;
+diff --git a/feeds/packages/net/iotivity/Makefile b/feeds/packages/net/iotivity/Makefile
+new file mode 100644
+index 0000000..dffd596
+--- /dev/null
++++ b/feeds/packages/net/iotivity/Makefile
+@@ -0,0 +1,268 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=iotivity
++PKG_VERSION:=1.0.0
++PKG_RELEASE=1
++
++PKG_SOURCE:=${PKG_NAME}-${PKG_VERSION}.tar.gz
++PKG_SOURCE_URL:=https://downloads.iotivity.org/${PKG_VERSION}/ \
++ http://mirrors.kernel.org/${PKG_NAME}/${PKG_VERSION}/
++PKG_MD5SUM:=4bcbabffc1734c664bbdf8fedfa60543
++PKG_USE_MIPS16:=0
++
++PKG_MAINTAINER:=Hauke Mehrtens <hauke.mehrtens@lantiq.com>
++
++PKG_LICENSE:=Apache-2.0
++PKG_LICENSE_FILES:=LICENSE.md
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/scons.mk
++
++
++define Package/iotivity
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=@!USE_UCLIBC +libpthread +librt +libuuid
++ TITLE:=IoTivity C Library
++ URL:=https://www.iotivity.org
++endef
++
++define Package/iotivity/description
++ IoTivity is a framework for the Internet of Things based on the
++ Open Interconnect Consortium Specification.
++endef
++
++
++define Package/iotivity-cpp
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=iotivity +libpthread +libstdcpp
++ TITLE:=IoTivity C++ Library
++ URL:=https://www.iotivity.org
++endef
++
++define Package/iotivity-cpp/description
++ IoTivity is a framework for the Internet of Things based on the
++ Open Interconnect Consortium Specification.
++endef
++
++
++define Package/iotivity-things-manager-lib
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=iotivity +iotivity-cpp +libstdcpp
++ TITLE:=IoTivity things manager lib
++ URL:=https://www.iotivity.org
++endef
++
++define Package/iotivity-things-manager-lib/description
++ IoTivity things-manager lib
++endef
++
++
++define Package/iotivity-oic-middle
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=iotivity +iotivity-cpp
++ TITLE:=IoTivity OIC Middle
++ URL:=https://www.iotivity.org
++endef
++
++define Package/iotivity-oic-middle/description
++ IoTivity OIC Middle
++endef
++
++
++define Package/iotivity-things-manager
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=iotivity +iotivity-cpp +iotivity-things-manager-lib
++ TITLE:=IoTivity things manager
++ URL:=https://www.iotivity.org
++endef
++
++define Package/iotivity-things-manager/description
++ IoTivity things manager
++endef
++
++define Package/iotivity-resource-container-lib
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=iotivity +iotivity-cpp +boost-system +boost-thread +boost-date_time
++ TITLE:=IoTivity Resource Container library
++ URL:=https://www.iotivity.org
++endef
++
++define Package/iotivity-resource-container-sample
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=iotivity +iotivity-resource-container-lib
++ TITLE:=IoTivity Resource Container sample Application
++ URL:=https://www.iotivity.org
++endef
++
++define Package/iotivity-resource-container-hue
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=iotivity +iotivity-resource-container-lib +libcurl
++ TITLE:=IoTivity Resource Container Hue Bundle
++ URL:=https://www.iotivity.org
++endef
++
++define Package/iotivity-example-garage
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=iotivity +iotivity-cpp
++ TITLE:=IoTivity Garage example
++ URL:=https://www.iotivity.org
++endef
++
++define Package/iotivity-example-garage/description
++ An IoTivity example application
++endef
++
++
++PKG_TINYCBOR_NAME:=tinycbor
++PKG_TINYCBOR_VERSION:=43e3ac9490cf19459ec7b7bd13df3b66810fb62a
++PKG_TINYCBOR_SOURCE:=$(PKG_TINYCBOR_NAME)-$(PKG_TINYCBOR_VERSION).tar.bz2
++PKG_TINYCBOR_PROTO:=git
++PKG_TINYCBOR_SOURCE_URL:=https://github.com/01org/tinycbor.git
++PKG_TINYCBOR_SUBDIR:=$(PKG_TINYCBOR_NAME)
++#PKG_TINYCBOR_MIRROR_MD5SUM:=?
++
++define Download/iotivity-tinycbor
++ FILE:=$(PKG_TINYCBOR_SOURCE)
++ URL:=$(PKG_TINYCBOR_SOURCE_URL)
++ PROTO:=$(PKG_TINYCBOR_PROTO)
++ VERSION:=$(PKG_TINYCBOR_VERSION)
++ SUBDIR:=$(PKG_TINYCBOR_SUBDIR)
++ #MIRROR_MD5SUM:=$(PKG_TINYCBOR_MIRROR_MD5SUM)
++endef
++$(eval $(call Download,iotivity-tinycbor))
++
++PKG_SQLITE_NAME:=sqlite
++PKG_SQLITE_VERSION:=3081101
++PKG_SQLITE_SOURCE:=$(PKG_SQLITE_NAME)-amalgamation-$(PKG_SQLITE_VERSION).zip
++PKG_SQLITE_SOURCE_URL:=http://www.sqlite.org/2015/
++PKG_SQLITE_SUBDIR:=$(PKG_SQLITE_NAME)
++PKG_SQLITE_MD5SUM:=94907e831502e2080b76e281cfa24dde
++
++define Download/iotivity-sqlite
++ FILE:=$(PKG_SQLITE_SOURCE)
++ URL:=$(PKG_SQLITE_SOURCE_URL)
++ VERSION:=$(PKG_SQLITE_VERSION)
++ SUBDIR:=$(PKG_SQLITE_SUBDIR)
++ MD5SUM:=$(PKG_SQLITE_MD5SUM)
++endef
++$(eval $(call Download,iotivity-sqlite))
++
++
++SCONS_OPTIONS += \
++ TARGET_OS=linux \
++ TARGET_TRANSPORT=IP \
++ TARGET_ARCH=$(ARCH) \
++ STAGING_DIR=$(STAGING_DIR) \
++ LOGGING=true \
++ SECURED=1 \
++ $(if $(CONFIG_PACKAGE_iotivity),liboctbstack) \
++ $(if $(CONFIG_PACKAGE_iotivity-cpp),liboc) \
++ $(if $(CONFIG_PACKAGE_iotivity-things-manager-lib),libTGMSDK) \
++ $(if $(CONFIG_PACKAGE_iotivity-oic-middle),samples) \
++ $(if $(CONFIG_PACKAGE_iotivity-things-manager),ConServerApp ConClientApp BootstrapServerApp) \
++ $(if $(CONFIG_PACKAGE_iotivity-resource-container-lib),libResContainer) \
++ $(if $(CONFIG_PACKAGE_iotivity-resource-container-sample),containersample) \
++ $(if $(CONFIG_PACKAGE_iotivity-resource-container-hue),libHueBundle) \
++ $(if $(CONFIG_PACKAGE_iotivity-example-garage),examples) \
++
++
++ifneq ($(findstring c,$(OPENWRT_VERBOSE)),)
++ SCONS_OPTIONS += VERBOSE=true
++endif
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ $(TAR) -C $(PKG_BUILD_DIR)/extlibs/tinycbor/ -xjf $(DL_DIR)/$(PKG_TINYCBOR_SOURCE)
++ unzip -d $(PKG_BUILD_DIR)/extlibs/sqlite3/ $(DL_DIR)/$(PKG_SQLITE_SOURCE)
++ mv $(PKG_BUILD_DIR)/extlibs/sqlite3/$(PKG_SQLITE_NAME)-amalgamation-$(PKG_SQLITE_VERSION)/sqlite3.h $(PKG_BUILD_DIR)/extlibs/sqlite3/
++ mv $(PKG_BUILD_DIR)/extlibs/sqlite3/$(PKG_SQLITE_NAME)-amalgamation-$(PKG_SQLITE_VERSION)/sqlite3.c $(PKG_BUILD_DIR)/extlibs/sqlite3/
++endef
++
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); \
++ $(SCONS_VARS) \
++ scons \
++ $(SCONS_OPTIONS) \
++ )
++endef
++
++
++define Package/iotivity/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/liboctbstack.so $(1)/usr/lib/
++endef
++
++define Package/iotivity-cpp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/liboc.so $(1)/usr/lib/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/liboc_logger.so $(1)/usr/lib/
++endef
++
++define Package/iotivity-things-manager-lib/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/libTGMSDKLibrary.so $(1)/usr/lib/
++endef
++
++define Package/iotivity-oic-middle/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/examples/OICMiddle/OICMiddle $(1)/usr/bin/
++endef
++
++define Package/iotivity-things-manager/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/service/things-manager/sampleapp/linux/configuration/bootstrapserver $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/service/things-manager/sampleapp/linux/configuration/con-server $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/service/things-manager/sampleapp/linux/configuration/con-client $(1)/usr/bin/
++endef
++
++define Package/iotivity-resource-container-lib/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/librcs_common.so $(1)/usr/lib/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/librcs_client.so $(1)/usr/lib/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/librcs_server.so $(1)/usr/lib/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/librcs_container.so $(1)/usr/lib/
++endef
++
++define Package/iotivity-resource-container-sample/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/service/resource-container/ContainerSample $(1)/usr/bin/
++endef
++
++define Package/iotivity-resource-container-hue/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/libHueBundle.so $(1)/usr/lib/
++endef
++
++define Package/iotivity-example-garage/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/resource/examples/garageclient $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/out/linux/$(ARCH)/release/resource/examples/garageserver $(1)/usr/bin/
++endef
++
++
++$(eval $(call BuildPackage,iotivity))
++$(eval $(call BuildPackage,iotivity-cpp))
++$(eval $(call BuildPackage,iotivity-things-manager-lib))
++$(eval $(call BuildPackage,iotivity-oic-middle))
++$(eval $(call BuildPackage,iotivity-things-manager))
++$(eval $(call BuildPackage,iotivity-resource-container-lib))
++$(eval $(call BuildPackage,iotivity-resource-container-sample))
++$(eval $(call BuildPackage,iotivity-resource-container-hue))
++$(eval $(call BuildPackage,iotivity-example-garage))
+diff --git a/feeds/packages/net/iotivity/patches/001-no_unit_test.patch b/feeds/packages/net/iotivity/patches/001-no_unit_test.patch
+new file mode 100644
+index 0000000..981abf6
+--- /dev/null
++++ b/feeds/packages/net/iotivity/patches/001-no_unit_test.patch
+@@ -0,0 +1,40 @@
++--- a/resource/SConscript
+++++ b/resource/SConscript
++@@ -71,7 +71,7 @@ if target_os == 'linux':
++ SConscript('csdk/stack/samples/linux/secure/SConscript')
++
++ # Build C/C++ unit tests
++- SConscript('unit_tests.scons')
+++ # SConscript('unit_tests.scons')
++
++ elif target_os == 'darwin':
++ env.Command('../../out/darwin/iotivity-csdk.framework',None,src_dir + '/tools/darwin/mkfwk_osx.sh')
++--- a/service/resource-encapsulation/SConscript
+++++ b/service/resource-encapsulation/SConscript
++@@ -113,10 +113,10 @@ SConscript('examples/SConscript')
++ # Build UnitTests Resource Client , resourceCache and resourceBroker and
++ # DiscoveryManager
++ ################################################ ######################
++-if target_os == 'linux':
++- SConscript('unittests/SConscript')
++- SConscript('src/resourceCache/unittests/SConscript')
++- SConscript('src/resourceBroker/unittest/SConscript')
+++# if target_os == 'linux':
+++# SConscript('unittests/SConscript')
+++# SConscript('src/resourceCache/unittests/SConscript')
+++# SConscript('src/resourceBroker/unittest/SConscript')
++
++ if target_os == 'android':
++ SConscript('android/SConscript')
++\ No newline at end of file
++--- a/service/things-manager/SConscript
+++++ b/service/things-manager/SConscript
++@@ -71,6 +71,6 @@ SConscript('sampleapp/SConscript')
++ ######################################################################
++ # Build UnitTests Things Manager
++ ################################################ ######################
++-if target_os == 'linux':
++- SConscript('unittests/SConscript')
+++# if target_os == 'linux':
+++# SConscript('unittests/SConscript')
++
+diff --git a/feeds/packages/net/iotivity/patches/002-do-not-chck-for-boost.patch b/feeds/packages/net/iotivity/patches/002-do-not-chck-for-boost.patch
+new file mode 100644
+index 0000000..21109fd
+--- /dev/null
++++ b/feeds/packages/net/iotivity/patches/002-do-not-chck-for-boost.patch
+@@ -0,0 +1,29 @@
++From 51e26e002aa043435f94ac0f071066090d5c2de8 Mon Sep 17 00:00:00 2001
++From: Hauke Mehrtens <hauke@hauke-m.de>
++Date: Mon, 22 Jun 2015 20:23:36 +0200
++Subject: [PATCH 5/5] do not chck for boost
++
++Boost is not needed for every package just for some.
++
++Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
++---
++ service/third_party_libs.scons | 8 --------
++ 1 file changed, 8 deletions(-)
++
++--- a/service/third_party_libs.scons
+++++ b/service/third_party_libs.scons
++@@ -49,14 +49,6 @@ if target_os in ['linux', 'tizen']:
++
++ conf = Configure(lib_env)
++
++- if target_os not in ['tizen'] and not conf.CheckLib('boost_thread', language='C++'):
++- print 'Did not find boost_thread, exiting!'
++- Exit(1)
++-
++- if target_os not in ['tizen'] and not conf.CheckLib('boost_system', language='C++'):
++- print 'Did not find boost_system, exiting!'
++- Exit(1)
++-
++ lib_env = conf.Finish()
++
++ ######################################################################
+diff --git a/feeds/packages/net/iotivity/patches/004-use-env.patch b/feeds/packages/net/iotivity/patches/004-use-env.patch
+new file mode 100644
+index 0000000..4076d9b
+--- /dev/null
++++ b/feeds/packages/net/iotivity/patches/004-use-env.patch
+@@ -0,0 +1,38 @@
++From 884e831ed07607097614276f6bbf192993228100 Mon Sep 17 00:00:00 2001
++From: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
++Date: Tue, 2 Jun 2015 11:08:17 +0200
++Subject: [PATCH 3/4] 004-use-env.patch
++
++---
++ build_common/SConscript | 22 ++++++++++++++++++++++
++ 1 file changed, 22 insertions(+)
++
++--- a/build_common/SConscript
+++++ b/build_common/SConscript
++@@ -137,6 +137,26 @@ tc_set_msg = '''
++ * cause inexplicable errors. *
++ *******************************************************************************
++ '''
+++env['ENV'] = os.environ
+++if 'CC' in os.environ:
+++ env['CC'] = Split(os.environ['CC'])
+++ print "using CC from enviroment: %s" % env['CC']
+++if 'CXX' in os.environ:
+++ env['CXX'] = Split(os.environ['CXX'])
+++ print "using CXX from enviroment: %s" % env['CXX']
+++if 'CFLAGS' in os.environ:
+++ env['CFLAGS'] = Split(os.environ['CFLAGS'])
+++ print "using CFLAGS from enviroment: %s" % env['CFLAGS']
+++if 'CXXFLAGS' in os.environ:
+++ env['CXXFLAGS'] = Split(os.environ['CXXFLAGS'])
+++ print "using CXXFLAGS from enviroment: %s" % env['CXXFLAGS']
+++if 'CPPFLAGS' in os.environ:
+++ env['CPPFLAGS'] = Split(os.environ['CPPFLAGS'])
+++ print "using CPPFLAGS from enviroment: %s" % env['CPPFLAGS']
+++if 'LDFLAGS' in os.environ:
+++ env['LINKFLAGS'] = Split(os.environ['LDFLAGS'])
+++ print "using LDFLAGS/LINKFLAGS from enviroment: %s" % env['LINKFLAGS']
+++
++ if env.get('VERBOSE') == False:
++ env['CCCOMSTR'] = "Compiling $TARGET"
++ env['SHCCCOMSTR'] = "Compiling $TARGET"
+diff --git a/feeds/packages/net/iotivity/patches/010-big-endian.patch b/feeds/packages/net/iotivity/patches/010-big-endian.patch
+new file mode 100644
+index 0000000..899bb34
+--- /dev/null
++++ b/feeds/packages/net/iotivity/patches/010-big-endian.patch
+@@ -0,0 +1,26 @@
++From d647872aee4871e286ddedf4931792086f5b4565 Mon Sep 17 00:00:00 2001
++From: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
++Date: Mon, 26 Oct 2015 14:32:39 +0100
++Subject: [PATCH] libcoap: remove fix build error on big endian systems
++
++In the big endian case an additional typedef is added in a wrong
++position in TinyDTLS. This breaks compiling this code on big endian
++systems.
++
++Change-Id: Iad854aba112ddb23bf490b064ec6fbf5d01ce6b6
++Signed-off-by: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
++---
++ resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.h | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++--- a/resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.h
+++++ b/resource/csdk/connectivity/lib/libcoap-4.1.1/pdu.h
++@@ -194,7 +194,7 @@ typedef enum
++ #ifdef WORDS_BIGENDIAN
++ typedef union
++ {
++- typedef struct
+++ struct
++ {
++ unsigned int version:2; /* protocol version */
++ unsigned int type:2; /* type flag */
+diff --git a/feeds/packages/net/iotivity/patches/011-musl-use-inttypes.patch b/feeds/packages/net/iotivity/patches/011-musl-use-inttypes.patch
+new file mode 100644
+index 0000000..bd74f37
+--- /dev/null
++++ b/feeds/packages/net/iotivity/patches/011-musl-use-inttypes.patch
+@@ -0,0 +1,31 @@
++From 9510445c5002b0e3502d2ac09723e1b2ddd03704 Mon Sep 17 00:00:00 2001
++From: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
++Date: Mon, 26 Oct 2015 14:39:55 +0100
++Subject: [PATCH] tinydtls: use types from inittype.h, fix musl libc
++
++The SHA2 code currently uses u_int32_t and similar types without
++defining them. This type is not defined by the POSIX standard, but many
++libc implementations have it as a non standard extension. In the musl
++libc it is not implemented and I am getting a compile error when using
++u_int32_t, I should use uint32_t, which is done when
++SHA2_USE_INTTYPES_H is set.
++
++This fixes build with musl libs used in OpenWrt.
++
++Change-Id: I485435ddb8b1a2359caedd335ab54f91ca5e3f3e
++Signed-off-by: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
++---
++ extlibs/tinydtls/SConscript | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++--- a/extlibs/tinydtls/SConscript
+++++ b/extlibs/tinydtls/SConscript
++@@ -68,7 +68,7 @@ if not env.get('RELEASE'):
++ else:
++ env.AppendUnique(CPPDEFINES = ['NDEBUG'])
++
++-env.AppendUnique(CPPDEFINES = ['DTLSV12', 'WITH_SHA256', 'DTLS_CHECK_CONTENTTYPE'])
+++env.AppendUnique(CPPDEFINES = ['DTLSV12', 'WITH_SHA256', 'DTLS_CHECK_CONTENTTYPE', 'SHA2_USE_INTTYPES_H'])
++
++
++ libtinydtls = env.StaticLibrary('libtinydtls', env.get('TINYDTLS_SRC'), OBJPREFIX='libtinydtls_')
+diff --git a/feeds/packages/net/iotivity/patches/012-connectivity-fix-getnameinfo-call-for-musl-libc.patch b/feeds/packages/net/iotivity/patches/012-connectivity-fix-getnameinfo-call-for-musl-libc.patch
+new file mode 100644
+index 0000000..99f9b78
+--- /dev/null
++++ b/feeds/packages/net/iotivity/patches/012-connectivity-fix-getnameinfo-call-for-musl-libc.patch
+@@ -0,0 +1,161 @@
++From 75a19e9059e671442abe40908ba80c2da614118d Mon Sep 17 00:00:00 2001
++From: Hauke Mehrtens <hauke@hauke-m.de>
++Date: Mon, 26 Oct 2015 22:42:40 +0100
++Subject: [PATCH] connectivity: fix getnameinfo() call for musl libc
++
++The musl libc and also the libc from net/freebsd are currently checking
++if the size of the sockaddr given to getnameinfo() matches the size for
++this family and it fails when giving sizeof(struct sockaddr_storage).
++This patch fixes this problem by making the caller also provide the
++size of the struct sockaddr_storage.
++
++I am currently trying to get a fix for this problem into musl libc, but
++IoTivity should still fix this.
++
++This also fixes a wrong error message.
++
++Change-Id: Ie9b89523b5ba20e536c03e3ad85c65bd5ff2ba53
++Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
++---
++ resource/csdk/connectivity/inc/caadapterutils.h | 12 ++++++++----
++ .../csdk/connectivity/src/adapter_util/caadapternetdtls.c | 10 +++++-----
++ resource/csdk/connectivity/src/adapter_util/caadapterutils.c | 9 +++++----
++ resource/csdk/connectivity/src/ip_adapter/caipserver.c | 2 +-
++ resource/csdk/connectivity/src/tcp_adapter/catcpserver.c | 2 +-
++ 5 files changed, 20 insertions(+), 15 deletions(-)
++
++--- a/resource/csdk/connectivity/inc/caadapterutils.h
+++++ b/resource/csdk/connectivity/inc/caadapterutils.h
++@@ -212,13 +212,16 @@ void CAClearNetInterfaceInfoList(u_array
++ */
++ void CAClearServerInfoList(u_arraylist_t *serverInfoList);
++
+++#ifndef WITH_ARDUINO
++ /**
++ * Convert address from binary to string.
++- * @param[in] ipaddr IP address info.
++- * @param[out] host address string (must be CA_IPADDR_SIZE).
++- * @param[out] port host order port number.
+++ * @param[in] sockAddr IP address info.
+++ * @param[in] sockAddrLen size of sockAddr.
+++ * @param[out] host address string (must be CA_IPADDR_SIZE).
+++ * @param[out] port host order port number.
++ */
++-void CAConvertAddrToName(const struct sockaddr_storage *sockaddr, char *host, uint16_t *port);
+++void CAConvertAddrToName(const struct sockaddr_storage *sockAddr, socklen_t sockAddrLen,
+++ char *host, uint16_t *port);
++
++ /**
++ * Convert address from string to binary.
++@@ -227,6 +230,7 @@ void CAConvertAddrToName(const struct so
++ * @param[out] ipaddr IP address info.
++ */
++ void CAConvertNameToAddr(const char *host, uint16_t port, struct sockaddr_storage *sockaddr);
+++#endif /* WITH_ARDUINO */
++
++ #ifdef __ANDROID__
++ /**
++--- a/resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c
+++++ b/resource/csdk/connectivity/src/adapter_util/caadapternetdtls.c
++@@ -417,7 +417,7 @@ static int32_t CAReadDecryptedPayload(dt
++ ((addrInfo->addr.st.ss_family == AF_INET) ? CA_IPV4 : CA_IPV6) | CA_SECURE, .port = 0 },
++ .identity =
++ { 0 } };
++- CAConvertAddrToName(&(addrInfo->addr.st), sep.endpoint.addr, &sep.endpoint.port);
+++ CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, sep.endpoint.addr, &sep.endpoint.port);
++
++ if (NULL == g_caDtlsContext)
++ {
++@@ -468,7 +468,7 @@ static int32_t CASendSecureData(dtls_con
++
++ CAEndpoint_t endpoint = {.adapter = CA_DEFAULT_ADAPTER};
++
++- CAConvertAddrToName(&(addrInfo->addr.st), endpoint.addr, &endpoint.port);
+++ CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, endpoint.addr, &endpoint.port);
++ endpoint.flags = addrInfo->addr.st.ss_family == AF_INET ? CA_IPV4 : CA_IPV6;
++ endpoint.flags |= CA_SECURE;
++ endpoint.adapter = CA_ADAPTER_IP;
++@@ -515,7 +515,7 @@ static int32_t CAHandleSecureEvent(dtls_
++ stCADtlsAddrInfo_t *addrInfo = (stCADtlsAddrInfo_t *)session;
++ char peerAddr[MAX_ADDR_STR_SIZE_CA] = { 0 };
++ uint16_t port = 0;
++- CAConvertAddrToName(&(addrInfo->addr.st), peerAddr, &port);
+++ CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, peerAddr, &port);
++ CARemovePeerFromPeerInfoList(peerAddr, port);
++ }
++
++@@ -553,7 +553,7 @@ static int32_t CAGetPskCredentials(dtls_
++ stCADtlsAddrInfo_t *addrInfo = (stCADtlsAddrInfo_t *)session;
++ char peerAddr[MAX_ADDR_STR_SIZE_CA] = { 0 };
++ uint16_t port = 0;
++- CAConvertAddrToName(&(addrInfo->addr.st), peerAddr, &port);
+++ CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, peerAddr, &port);
++
++ if(CA_STATUS_OK != CAAddIdToPeerInfoList(peerAddr, port, desc, descLen) )
++ {
++@@ -933,7 +933,7 @@ static int CAVerifyCertificate(struct dt
++ stCADtlsAddrInfo_t *addrInfo = (stCADtlsAddrInfo_t *)session;
++ char peerAddr[MAX_ADDR_STR_SIZE_CA] = { 0 };
++ uint16_t port = 0;
++- CAConvertAddrToName(&(addrInfo->addr.st), peerAddr, &port);
+++ CAConvertAddrToName(&(addrInfo->addr.st), addrInfo->size, peerAddr, &port);
++
++ CAResult_t result = CAAddIdToPeerInfoList(peerAddr, port,
++ crtChain[0].subject.data + DER_SUBJECT_HEADER_LEN + 2, crtChain[0].subject.data[DER_SUBJECT_HEADER_LEN + 1]);
++--- a/resource/csdk/connectivity/src/adapter_util/caadapterutils.c
+++++ b/resource/csdk/connectivity/src/adapter_util/caadapterutils.c
++@@ -122,14 +122,15 @@ CAResult_t CAParseIPv4AddressInternal(co
++ * These two conversion functions return void because errors can't happen
++ * (because of NI_NUMERIC), and there's nothing to do if they do happen.
++ */
++-void CAConvertAddrToName(const struct sockaddr_storage *sockAddr, char *host, uint16_t *port)
+++void CAConvertAddrToName(const struct sockaddr_storage *sockAddr, socklen_t sockAddrLen,
+++ char *host, uint16_t *port)
++ {
++ VERIFY_NON_NULL_VOID(sockAddr, CA_ADAPTER_UTILS_TAG, "sockAddr is null");
++ VERIFY_NON_NULL_VOID(host, CA_ADAPTER_UTILS_TAG, "host is null");
++ VERIFY_NON_NULL_VOID(port, CA_ADAPTER_UTILS_TAG, "port is null");
++
++ int r = getnameinfo((struct sockaddr *)sockAddr,
++- sizeof (struct sockaddr_storage),
+++ sockAddrLen,
++ host, MAX_ADDR_STR_SIZE_CA,
++ NULL, 0,
++ NI_NUMERICHOST|NI_NUMERICSERV);
++@@ -138,12 +139,12 @@ void CAConvertAddrToName(const struct so
++ if (EAI_SYSTEM == r)
++ {
++ OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG,
++- "getaddrinfo failed: errno %s", strerror(errno));
+++ "getnameinfo failed: errno %s", strerror(errno));
++ }
++ else
++ {
++ OIC_LOG_V(ERROR, CA_ADAPTER_UTILS_TAG,
++- "getaddrinfo failed: %s", gai_strerror(r));
+++ "getnameinfo failed: %s", gai_strerror(r));
++ }
++ return;
++ }
++--- a/resource/csdk/connectivity/src/ip_adapter/caipserver.c
+++++ b/resource/csdk/connectivity/src/ip_adapter/caipserver.c
++@@ -299,7 +299,7 @@ static CAResult_t CAReceiveMessage(int f
++ }
++ }
++
++- CAConvertAddrToName(&srcAddr, sep.endpoint.addr, &sep.endpoint.port);
+++ CAConvertAddrToName(&srcAddr, msg.msg_namelen, sep.endpoint.addr, &sep.endpoint.port);
++
++ if (flags & CA_SECURE)
++ {
++--- a/resource/csdk/connectivity/src/tcp_adapter/catcpserver.c
+++++ b/resource/csdk/connectivity/src/tcp_adapter/catcpserver.c
++@@ -478,7 +478,7 @@ static void CAAcceptHandler(void *data)
++ }
++ svritem->u4tcp.fd = sockfd;
++
++- CAConvertAddrToName((struct sockaddr_storage *)&clientaddr,
+++ CAConvertAddrToName((struct sockaddr_storage *)&clientaddr, clientlen,
++ (char *) &svritem->addr, &svritem->u4tcp.port);
++
++ ca_mutex_lock(g_mutexObjectList);
+diff --git a/feeds/packages/net/iotivity/patches/020-Do-not-set-architecture-specific-flags.patch b/feeds/packages/net/iotivity/patches/020-Do-not-set-architecture-specific-flags.patch
+new file mode 100644
+index 0000000..4c12064
+--- /dev/null
++++ b/feeds/packages/net/iotivity/patches/020-Do-not-set-architecture-specific-flags.patch
+@@ -0,0 +1,60 @@
++From 980ef34a085f654e74c9896e8143e6f970049b6c Mon Sep 17 00:00:00 2001
++From: Hauke Mehrtens <hauke@hauke-m.de>
++Date: Mon, 22 Jun 2015 19:39:58 +0200
++Subject: [PATCH 3/5] Do not set architecture specific flags
++
++Setting architecture specific flags causes problems when you want to
++build something which is not covered by these.
++
++Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
++---
++ build_common/linux/SConscript | 20 --------------------
++ resource/csdk/connectivity/build/linux/SConscript | 20 --------------------
++ 2 files changed, 40 deletions(-)
++
++--- a/build_common/linux/SConscript
+++++ b/build_common/linux/SConscript
++@@ -24,20 +24,3 @@ env.AppendUnique(LINKFLAGS = ['-ldl', '-
++
++ # Set arch flags
++ target_arch = env.get('TARGET_ARCH')
++-if target_arch in ['x86']:
++- env.AppendUnique(CCFLAGS = ['-m32'])
++- env.AppendUnique(LINKFLAGS = ['-m32'])
++-elif target_arch in ['x86_64']:
++- env.AppendUnique(CCFLAGS = ['-m64'])
++- env.AppendUnique(LINKFLAGS = ['-m64'])
++-elif target_arch.find('v7a-hard') > 0:
++- env.AppendUnique(CPPFLAGS = ['-march=armv7-a'])
++- env.AppendUnique(CPPFLAGS = ['-mfloat-abi=hard'])
++- env.AppendUnique(CCFLAGS = ['-mfloat-abi=hard'])
++- env.AppendUnique(LINKFLAGS = ['-mfloat-abi=hard'])
++-elif target_arch.find('v7a') > 0:
++- env.AppendUnique(CPPFLAGS = ['-march=armv7-a'])
++-elif target_arch.find('arm64') >= 0:
++- env.AppendUnique(CPPFLAGS = ['-march=armv8-a'])
++-else:
++- env.AppendUnique(CPPFLAGS = ['-march=armv5te'])
++--- a/resource/csdk/connectivity/build/linux/SConscript
+++++ b/resource/csdk/connectivity/build/linux/SConscript
++@@ -22,20 +22,3 @@ env.AppendUnique(LINKFLAGS = ['-ldl', '-
++
++ # Set arch flags
++ target_arch = env.get('TARGET_ARCH')
++-if target_arch in ['x86']:
++- env.AppendUnique(CCFLAGS = ['-m32'])
++- env.AppendUnique(LINKFLAGS = ['-m32'])
++-elif target_arch in ['x86_64']:
++- env.AppendUnique(CCFLAGS = ['-m64'])
++- env.AppendUnique(LINKFLAGS = ['-m64'])
++-elif target_arch.find('v7a-hard') > 0:
++- env.AppendUnique(CPPFLAGS = ['-march=armv7-a'])
++- env.AppendUnique(CPPFLAGS = ['-mfloat-abi=hard'])
++- env.AppendUnique(CCFLAGS = ['-mfloat-abi=hard'])
++- env.AppendUnique(LINKFLAGS = ['-mfloat-abi=hard'])
++-elif target_arch.find('v7a') > 0:
++- env.AppendUnique(CPPFLAGS = ['-march=armv7-a'])
++-elif target_arch.find('arm64') > 0:
++- env.AppendUnique(CPPFLAGS = ['-march=armv8-a'])
++-else:
++- env.AppendUnique(CPPFLAGS = ['-march=armv5te'])
+diff --git a/feeds/packages/net/iotivity/patches/021-add-some-more-architectures.patch b/feeds/packages/net/iotivity/patches/021-add-some-more-architectures.patch
+new file mode 100644
+index 0000000..6d570aa
+--- /dev/null
++++ b/feeds/packages/net/iotivity/patches/021-add-some-more-architectures.patch
+@@ -0,0 +1,35 @@
++From f78ba209b14908bf2b6197293e1f9e3458ddba8e Mon Sep 17 00:00:00 2001
++From: Hauke Mehrtens <hauke@hauke-m.de>
++Date: Mon, 22 Jun 2015 19:59:47 +0200
++Subject: [PATCH 4/5] add some more architectures
++
++This does not scale and this check should be removed.
++
++Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
++---
++ build_common/SConscript | 2 +-
++ resource/csdk/connectivity/build/SConscript | 2 +-
++ 2 files changed, 2 insertions(+), 2 deletions(-)
++
++--- a/build_common/SConscript
+++++ b/build_common/SConscript
++@@ -14,7 +14,7 @@ host_target_map = {
++
++ # Map of os and allowed archs (os: allowed archs)
++ os_arch_map = {
++- 'linux': ['x86', 'x86_64', 'arm', 'arm64'],
+++ 'linux': ['x86', 'x86_64', 'arm', 'arm64', 'mips', 'mipsel', 'mips64', 'mips64el', 'i386', 'powerpc', 'sparc', 'aarch64'],
++ 'tizen': ['x86', 'x86_64', 'arm', 'arm64', 'armeabi-v7a'],
++ 'android': ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'arm64-v8a'],
++ 'windows': ['x86', 'amd64', 'arm'],
++--- a/resource/csdk/connectivity/build/SConscript
+++++ b/resource/csdk/connectivity/build/SConscript
++@@ -14,7 +14,7 @@ host_target_map = {
++
++ # Map of os and allowed archs (os: allowed archs)
++ os_arch_map = {
++- 'linux': ['x86', 'x86_64', 'arm', 'arm64'],
+++ 'linux': ['x86', 'x86_64', 'arm', 'arm64', 'mips', 'mipsel', 'mips64', 'mips64el', 'i386', 'powerpc', 'sparc', 'aarch64'],
++ 'tizen': ['x86', 'x86_64', 'arm', 'arm64'],
++ 'android': ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'arm64-v8a'],
++ 'windows': ['x86', 'amd64', 'arm'],
+diff --git a/feeds/packages/net/iotivity/patches/030-remove-check-for-curl.patch b/feeds/packages/net/iotivity/patches/030-remove-check-for-curl.patch
+new file mode 100644
+index 0000000..a7191aa
+--- /dev/null
++++ b/feeds/packages/net/iotivity/patches/030-remove-check-for-curl.patch
+@@ -0,0 +1,53 @@
++--- a/service/resource-container/SConscript
+++++ b/service/resource-container/SConscript
++@@ -176,35 +176,21 @@ if target_os in ['linux', 'tizen', 'andr
++ # build hue sample bundle
++ ######################################################################
++
++-conf2 = Configure(lib_env)
++-if not conf2.CheckLib('curl'):
++- print '''X
++-*********************************** Error *************************************
++-* Cannot build hue sample. Please install libcurl.
++-* Example (Ubuntu):
++-* sudo apt-get install libcurl4-openssl-dev
++-* sudo ldconfig
++-* Hint: check with pkg-config --libs libcurl and clear scons cache.
++-* Skipping hue sample build.
++-*******************************************************************************
++- '''
++-else:
++- hue_resource_bundle_env = resource_container_env.Clone()
++- hue_resource_bundle_env.AppendUnique(CCFLAGS = ['-fPIC'])
++-
++- HUE_RESOURCE_BUNDLE_DIR = 'examples/HueSampleBundle/'
++- hue_resource_bundle_env.AppendUnique(CPPPATH = [
++- HUE_RESOURCE_BUNDLE_DIR + 'include',
++- 'include/'
++- ])
++-
++- hue_resource_bundle_env.PrependUnique(LIBS = ['curl', 'rcs_container'])
++-
++- hue_resource_bundle_src = [ Glob(HUE_RESOURCE_BUNDLE_DIR + 'src/*.cpp')]
++-
++- HueBundle = hue_resource_bundle_env.SharedLibrary('HueBundle', hue_resource_bundle_src)
++- hue_resource_bundle_env.InstallTarget(HueBundle, 'libHueBundle')
++-lib_env = conf2.Finish()
+++hue_resource_bundle_env = resource_container_env.Clone()
+++hue_resource_bundle_env.AppendUnique(CCFLAGS = ['-fPIC'])
+++
+++HUE_RESOURCE_BUNDLE_DIR = 'examples/HueSampleBundle/'
+++hue_resource_bundle_env.AppendUnique(CPPPATH = [
+++ HUE_RESOURCE_BUNDLE_DIR + 'include',
+++ 'include/'
+++ ])
+++
+++hue_resource_bundle_env.PrependUnique(LIBS = ['curl', 'rcs_container'])
+++
+++hue_resource_bundle_src = [ Glob(HUE_RESOURCE_BUNDLE_DIR + 'src/*.cpp')]
+++
+++HueBundle = hue_resource_bundle_env.SharedLibrary('HueBundle', hue_resource_bundle_src)
+++hue_resource_bundle_env.InstallTarget(HueBundle, 'libHueBundle')
++
++ ######################################################################
++ # build resource container unit tests
+diff --git a/feeds/packages/net/iotivity/patches/140-remove-glib2.patch b/feeds/packages/net/iotivity/patches/140-remove-glib2.patch
+new file mode 100644
+index 0000000..36bb82c
+--- /dev/null
++++ b/feeds/packages/net/iotivity/patches/140-remove-glib2.patch
+@@ -0,0 +1,33 @@
++--- a/resource/csdk/connectivity/src/bt_le_adapter/linux/SConscript
+++++ b/resource/csdk/connectivity/src/bt_le_adapter/linux/SConscript
++@@ -31,7 +31,7 @@ this_build_dir = os.path.join(root_build
++
++ # The Linux BLE adapter implementation uses GDBus to make D-Bus based
++ # method calls to BlueZ. Pull in the necessary dependencies.
++-env.ParseConfig("pkg-config gio-unix-2.0 --cflags --libs")
+++# env.ParseConfig("pkg-config gio-unix-2.0 --cflags --libs")
++
++ # Set up commands to generate GDBus code from the D-Bus introspection
++ # XML.
++--- a/resource/csdk/security/provisioning/sample/SConscript
+++++ b/resource/csdk/security/provisioning/sample/SConscript
++@@ -58,7 +58,7 @@ if env.get('SECURED') == '1':
++ if env.get('DTLS_WITH_X509') == '1':
++ provisioning_env.AppendUnique(LIBS = ['CKManager'])
++ provisioning_env.AppendUnique(LIBS = ['asn1'])
++-provisioning_env.ParseConfig('pkg-config --libs glib-2.0');
+++# provisioning_env.ParseConfig('pkg-config --libs glib-2.0');
++
++ provisioning_env.AppendUnique(CPPDEFINES = ['TB_LOG'])
++
++--- a/resource/csdk/security/provisioning/SConscript
+++++ b/resource/csdk/security/provisioning/SConscript
++@@ -73,7 +73,7 @@ provisioning_env.AppendUnique(LIBS = ['t
++ if env.get('DTLS_WITH_X509') == '1':
++ provisioning_env.AppendUnique(LIBS = ['CKManger'])
++
++-provisioning_env.ParseConfig('pkg-config --libs glib-2.0');
+++# provisioning_env.ParseConfig('pkg-config --libs glib-2.0');
++
++ if target_os == 'android':
++ provisioning_env.AppendUnique(CXXFLAGS = ['-frtti', '-fexceptions'])
+diff --git a/feeds/packages/net/iotivity/patches/200-examples-OICMiddle-try-to-load-security-configuratio.patch b/feeds/packages/net/iotivity/patches/200-examples-OICMiddle-try-to-load-security-configuratio.patch
+new file mode 100644
+index 0000000..4bcd322
+--- /dev/null
++++ b/feeds/packages/net/iotivity/patches/200-examples-OICMiddle-try-to-load-security-configuratio.patch
+@@ -0,0 +1,44 @@
++From ce27d50b9c11386242487852f14b025ed6c67701 Mon Sep 17 00:00:00 2001
++From: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
++Date: Wed, 19 Aug 2015 16:47:21 +0200
++Subject: [PATCH 14/14] examples: OICMiddle: try to load security
++ configuration by default
++
++Load the security configuration from the default location by default.
++When it is not found security will just not work.
++
++Signed-off-by: Hauke Mehrtens <hauke.mehrtens@lantiq.com>
++---
++ examples/OICMiddle/OICMiddle.cpp | 9 ++++++++-
++ examples/OICMiddle/OICMiddle.h | 1 +
++ 2 files changed, 9 insertions(+), 1 deletion(-)
++
++--- a/examples/OICMiddle/OICMiddle.cpp
+++++ b/examples/OICMiddle/OICMiddle.cpp
++@@ -99,8 +99,15 @@ void Middle::startPlatform()
++ //std::string ipaddr = INADDR_ANY;
++ std::string ipaddr = "0.0.0.0";
++
+++ // Initialize Persistent Storage for SVR database
+++ middle.ps.open = fopen;
+++ middle.ps.read = fread;
+++ middle.ps.write = fwrite;
+++ middle.ps.close = fclose;
+++ middle.ps.unlink = unlink;
+++
++ PlatformConfig cfg { ServiceType::InProc, ModeType::Both,
++- ipaddr, port, QualityOfService::LowQos};
+++ ipaddr, port, QualityOfService::LowQos, &middle.ps};
++
++ OC::OCPlatform::Configure(cfg);
++ }
++--- a/examples/OICMiddle/OICMiddle.h
+++++ b/examples/OICMiddle/OICMiddle.h
++@@ -83,6 +83,7 @@ protected:
++ MiddleServer *m_server;
++ LineInput *m_lineInput;
++ RestInput *m_restInput;
+++ OCPersistentStorage ps;
++
++ protected:
++ void startPlatform();
+diff --git a/feeds/packages/net/ipsec-tools/Makefile b/feeds/packages/net/ipsec-tools/Makefile
+new file mode 100644
+index 0000000..a1c439e
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/Makefile
+@@ -0,0 +1,102 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++# 2014 Noah Meyerhans <frodo@morgul.net>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=ipsec-tools
++PKG_VERSION:=0.8.2
++PKG_RELEASE:=4
++PKG_MAINTAINER := "Noah Meyerhans <frodo@morgul.net>"
++PKG_LICENSE := BSD-3-Clause
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/ipsec-tools
++PKG_MD5SUM:=d53ec14a0a3ece64e09e5e34b3350b41
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ipsec-tools
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=VPN
++ DEPENDS:=+libopenssl +kmod-ipsec
++ TITLE:=IPsec management tools
++ URL:=http://ipsec-tools.sourceforge.net/
++ MAINTAINER:=Noah Meyerhans <frodo@morgul.net>
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --with-kernel-headers="$(LINUX_DIR)/include" \
++ --without-readline \
++ --with-openssl="$(STAGING_DIR)/usr" \
++ --without-libradius \
++ --without-libpam \
++ --enable-dpd \
++ --enable-hybrid \
++ --enable-security-context=no \
++ --enable-natt \
++ --enable-adminport \
++ --enable-frag \
++ $(call autoconf_bool,CONFIG_IPV6,ipv6)
++
++# override CFLAGS holding "-Werror" that break builds on compile warnings
++MAKE_FLAGS+=\
++ CFLAGS="$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)"
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ chmod -R u+w $(PKG_BUILD_DIR)
++endef
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); touch \
++ configure.ac \
++ aclocal.m4 \
++ Makefile.in \
++ config.h.in \
++ configure \
++ );
++ $(call Build/Configure/Default)
++ifndef CONFIG_SHADOW_PASSWORDS
++ echo "#undef HAVE_SHADOW_H" >> $(PKG_BUILD_DIR)/config.h
++endif
++endef
++
++define Package/ipsec-tools/install
++ $(INSTALL_DIR) $(1)/etc/racoon
++ $(INSTALL_CONF) ./files/functions.sh $(1)/etc/racoon/
++ $(INSTALL_BIN) ./files/p1client-up $(1)/etc/racoon/
++ $(INSTALL_BIN) ./files/p1client-down $(1)/etc/racoon/
++ $(INSTALL_BIN) ./files/vpnctl $(1)/etc/racoon/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/racoon.init $(1)/etc/init.d/racoon
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/racoon $(1)/etc/config/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libipsec.so.* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libracoon.so.* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/plainrsa-gen $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/racoon $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/racoonctl $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/setkey $(1)/usr/sbin/
++endef
++
++define Package/ipsec-tools/conffiles
++/etc/config/racoon
++endef
++
++$(eval $(call BuildPackage,ipsec-tools))
+diff --git a/feeds/packages/net/ipsec-tools/files/functions.sh b/feeds/packages/net/ipsec-tools/files/functions.sh
+new file mode 100644
+index 0000000..e3e739b
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/files/functions.sh
+@@ -0,0 +1,137 @@
++#!/bin/sh
++#
++# Copyright (C) 2015 Vitaly Protsko <villy@sft.ru>
++
++errno=0
++
++get_fieldval() {
++ local __data="$3"
++ local __rest
++
++ test -z "$1" && return
++
++ while true ; do
++ __rest=${__data#* }
++ test "$__rest" = "$__data" && break
++
++ if [ "${__data/ *}" = "$2" ]; then
++ eval "$1=${__rest/ *}"
++ break
++ fi
++
++ __data="$__rest"
++ done
++}
++
++manage_fw() {
++ local cmd=/usr/sbin/iptables
++ local mode
++ local item
++
++ if [ -z "$4" ]; then
++ $log "Bad usage of manage_fw"
++ errno=3; return 3
++ fi
++
++ case "$1" in
++ add|up|1) mode=A ;;
++ del|down|0) mode=D ;;
++ *) return 3 ;;
++ esac
++
++ for item in $4 ; do
++ $cmd -$mode forwarding_$2_rule -s $item -j ACCEPT
++ $cmd -$mode output_$3_rule -d $item -j ACCEPT
++ $cmd -$mode forwarding_$3_rule -d $item -j ACCEPT
++ $cmd -t nat -$mode postrouting_$3_rule -d $item -j ACCEPT
++ done
++}
++
++manage_sa() {
++ local spdcmd
++ local rtcmd
++ local gate
++ local litem
++ local ritem
++
++ if [ -z "$4" ]; then
++ $log "Bad usage of manage_sa"
++ errno=3; return 3
++ fi
++
++ case "$1" in
++ add|up|1) spdcmd=add; rtcmd=add ;;
++ del|down|0) spdcmd=delete; rtcmd=del ;;
++ *) errno=3; return 3 ;;
++ esac
++
++ get_fieldval gate src "$(/usr/sbin/ip route get $4)"
++ if [ -z "$gate" ]; then
++ $log "Can not find outbound IP for $4"
++ errno=3; return 3
++ fi
++
++
++ for litem in $2 ; do
++ for ritem in $3 ; do
++ echo "
++spd$spdcmd $litem $ritem any -P out ipsec esp/tunnel/$gate-$4/require;
++spd$spdcmd $ritem $litem any -P in ipsec esp/tunnel/$4-$gate/require;
++" | /usr/sbin/setkey -c 1>&2
++ done
++ done
++
++ test -n "$5" && gate=$5
++
++ for ritem in $3 ; do
++ (sleep 3; /usr/sbin/ip route $rtcmd $ritem via $gate) &
++ done
++}
++
++
++. /lib/functions/network.sh
++
++get_zoneiflist() {
++ local item
++ local data
++ local addr
++
++ item=0
++ data=$(uci get firewall.@zone[0].name)
++ while [ -n "$data" ]; do
++ test "$data" = "$1" && break
++ let "item=$item+1"
++ data=$(uci get firewall.@zone[$item].name)
++ done
++
++ if [ -z "$data" ]; then
++ errno=1
++ return $errno
++ fi
++ data=$(uci get firewall.@zone[$item].network)
++
++ echo "$data"
++}
++
++get_zoneiplist() {
++ local item
++ local addr
++ local data
++ local result
++
++ data=$(get_zoneiflist $1)
++ test $? -gt 0 -o $errno -gt 0 -o -z "$data" && return $errno
++
++ for item in $data ; do
++ if network_is_up $item ; then
++ network_get_ipaddrs addr $item
++ test $? -eq 0 && result="$result $addr"
++ fi
++ done
++
++ result=$(echo $result)
++ echo "$result"
++}
++
++
++# EOF /etc/racoon/functions.sh
+diff --git a/feeds/packages/net/ipsec-tools/files/p1client-down b/feeds/packages/net/ipsec-tools/files/p1client-down
+new file mode 100644
+index 0000000..8c5a195
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/files/p1client-down
+@@ -0,0 +1,41 @@
++#!/bin/sh
++#
++
++log="logger -t p1client-down[$$]"
++
++. /lib/functions.sh
++. /etc/racoon/functions.sh
++
++if [ -z "$SPLIT_INCLUDE_CIDR" ]; then
++ $log "Connection without server-pushed routing is not supported"
++ exit 1
++fi
++
++$log "Shutting down tunnel to server $REMOTE_ADDR"
++$log "Closing tunnel(-s) to $SPLIT_INCLUDE_CIDR through $INTERNAL_ADDR4"
++
++config_load racoon
++config_get confIntZone racoon int_zone lan
++config_get confExtZone racoon ext_zone wan
++
++manage_fw del $confIntZone $confExtZone "$INTERNAL_ADDR4 $SPLIT_INCLUDE_CIDR"
++
++data=$(get_zoneiflist $confIntZone)
++if [ -n "$data" ]; then
++ for item in $data ; do
++ network_get_subnet locnet $item
++ if [ -n "$locnet" ]; then
++ manage_sa del "$locnet" "$SPLIT_INCLUDE_CIDR" $REMOTE_ADDR $INTERNAL_ADDR4
++ else
++ $log "Can not find subnet on interface $item"
++ fi
++ done
++else
++ $log "Can not find subnets in zone $confIntZone"
++fi
++
++get_fieldval data dev "$(/usr/sbin/ip route get $REMOTE_ADDR)"
++ip address del $INTERNAL_ADDR4/32 dev $data
++
++
++# EOF /etc/racoon/p1client-down
+diff --git a/feeds/packages/net/ipsec-tools/files/p1client-up b/feeds/packages/net/ipsec-tools/files/p1client-up
+new file mode 100644
+index 0000000..8a9678a
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/files/p1client-up
+@@ -0,0 +1,41 @@
++#!/bin/sh
++#
++
++log="logger -t p1client-up[$$]"
++
++. /lib/functions.sh
++. /etc/racoon/functions.sh
++
++if [ -z "$SPLIT_INCLUDE_CIDR" ]; then
++ $log "Connection without server-pushed routing is not supported"
++ exit 1
++fi
++
++$log "Setting up tunnel to server $REMOTE_ADDR"
++$log "Making tunnel(-s) to $SPLIT_INCLUDE_CIDR through $INTERNAL_ADDR4"
++
++get_fieldval data dev "$(/usr/sbin/ip route get $REMOTE_ADDR)"
++ip address add $INTERNAL_ADDR4/32 dev $data
++
++config_load racoon
++config_get confIntZone racoon int_zone lan
++config_get confExtZone racoon ext_zone wan
++
++data=$(get_zoneiflist $confIntZone)
++if [ -n "$data" ]; then
++ for item in $data ; do
++ network_get_subnet locnet $item
++ if [ -n "$locnet" ]; then
++ manage_sa add "$locnet" "$SPLIT_INCLUDE_CIDR" $REMOTE_ADDR $INTERNAL_ADDR4
++ else
++ $log "Can not find subnet on interface $item"
++ fi
++ done
++else
++ $log "Can not find interfaces in zone $confIntZone"
++fi
++
++manage_fw add $confIntZone $confExtZone "$INTERNAL_ADDR4 $SPLIT_INCLUDE_CIDR"
++
++
++# EOF /etc/racoon/p1client-up
+diff --git a/feeds/packages/net/ipsec-tools/files/racoon b/feeds/packages/net/ipsec-tools/files/racoon
+new file mode 100644
+index 0000000..11cd2f2
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/files/racoon
+@@ -0,0 +1,109 @@
++#/etc/config/racoon
++#
++# Copyright 2015 Vitaly Protsko <villy@sft.ru>
++
++# * WARNING: this is "not working" example
++# * Defaults are commented out
++# * Resuting config will appear in /var/racoon/
++
++config racoon
++# option debug 0
++# option ext_zone 'wan'
++# option int_zone 'lan'
++# option port 500
++# option natt_port 4500
++# following 4 or 6, no default
++# option ipversion 4
++
++config p1_proposal 'example_prop1'
++# option lifetime 28800
++ option enc_alg 'aes'
++ option hash_alg 'sha1'
++ option auth_method 'rsasig'
++ option dh_group 2
++
++config p1_proposal 'example_anon'
++# option lifetime 28800
++ option enc_alg 'aes'
++ option hash_alg 'sha1'
++ option auth_method 'xauth_rsa_server'
++ option dh_group 2
++
++config p1_proposal 'example_xauth'
++# option lifetime 28800
++ option enc_alg 'aes'
++ option hash_alg 'sha1'
++ option auth_method 'xauth_rsa_client'
++ option dh_group 2
++
++config p2_proposal 'example_prop2'
++ option pfs_group 2
++ option enc_alg 'aes'
++ option auth_alg 'hmac_sha1'
++
++config p2_proposal 'example_in2'
++ option pfs_group 2
++# option lifetime 14400
++ option enc_alg 'aes'
++ option auth_alg 'hmac_sha1'
++
++config sainfo 'office'
++ option p2_proposal 'example_prop2'
++ option local_net '192.168.8.0/24'
++ option remote_net '192.168.1.0/24'
++
++config sainfo 'welcome'
++ option p2_proposal 'example_in2'
++ option local_net '192.168.8.0/24'
++ option remote_net '192.168.10.0/24'
++ option dns4 '192.168.8.1'
++ option defdomain 'myhome.local'
++
++config sainfo 'client'
++ p2_proposal 'std_p2'
++
++config tunnel 'Office'
++ option enabled 1
++# initial_contact
++# option init 1
++ option remote 'vpn.example.tld'
++ option exchange_mode 'main'
++ option certificate 'example_cert'
++# option peer_id_type 'asn1dn'
++# option prop_check 'obey'
++# option verify_id 1
++# option weak_p1check 1
++# option dpd_delay ''
++ list p1_proposal 'example_prop1'
++ list sainfo 'office'
++
++# WARNING: Only ONE tunnel with remote anonymous
++# can be configured and it can have only
++# ONE sainfo. Otherwise resulting racoon
++# configuration will be unusable
++config tunnel 'Incoming'
++ option enabled 1
++ option remote 'anonymous'
++ option pre_shared_key 'testitnow'
++ option exchange_mode 'aggressive,main'
++ option my_id_type 'fqdn'
++ option my_id 'myserver.homeip.net'
++ list p1_proposal 'example_anon'
++ list sainfo 'welcome'
++
++config tunnel 'Client'
++ option enabled 1
++ option remote 'vpn.example.tld'
++ option username 'testuser'
++ option password 'testW0rD'
++# option mode_cfg 1
++ list p1_proposal 'example_xauth'
++ list sainfo 'client'
++
++# Insert corresponding data in PEM format as one line
++config 'certificate' 'example_cert'
++ option 'key' '-----BEGIN PRIVATE KEY----- ~ -----END PRIVATE KEY-----'
++ option 'crt' '-----BEGIN CERTIFICATE----- ~ -----END CERTIFICATE-----'
++
++config 'certificate' 'example_ca_cert'
++ option 'crt' '-----BEGIN CERTIFICATE----- ~ -----END CERTIFICATE-----'
+diff --git a/feeds/packages/net/ipsec-tools/files/racoon.init b/feeds/packages/net/ipsec-tools/files/racoon.init
+new file mode 100644
+index 0000000..6520d5b
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/files/racoon.init
+@@ -0,0 +1,475 @@
++#!/bin/sh /etc/rc.common
++#
++# Copyright (C) 2015 Vitaly Protsko <villy@sft.ru>
++
++#set -vx
++
++USE_PROCD=1
++
++START=60
++STOP=40
++
++let connWait=2/2
++confDir=/var/racoon
++confExtZone=
++confIntZone=
++confPort=
++confNATPort=
++confIPMode=
++
++confPh1ID=0
++
++log="logger -t init.d/racoon[$$] "
++
++. /etc/racoon/functions.sh
++
++setup_load() {
++ config_get confExtZone "$1" ext_zone wan
++ config_get confIntZone "$1" int_zone lan
++ config_get confPort "$1" port 500
++ config_get confNATPort "$1" natt_port 4500
++ config_get confIPMode "$1" ipversion ""
++
++ case X$confIPMode in
++ X4|X6) ;;
++ *) unset confIPMode ;;
++ esac
++}
++
++write_header() {
++ echo "
++# autogenerated, don't edit, look at /etc/config/racoon
++#
++path certificate \"$confDir/cert\";
++path script \"/etc/racoon\";
++path pre_shared_key \"$confDir/psk.txt\";
++path pidfile \"$confDir/racoon.pid\";
++padding { maximum_length 20; randomize off; strict_check off; exclusive_tail off; }
++timer { counter 5; interval 20 sec; persend 1; phase1 30 sec; phase2 15 sec; }
++"
++}
++
++setup_conf() {
++ local conf=$confDir/racoon.conf
++ local peerconf=$confDir/peers.txt
++ local pskconf=$confDir/psk.txt
++ local item
++ local data
++
++ data="$(get_zoneiplist $confExtZone)"
++ if [ "X$data" = X ]; then
++ $log "No IP addresses found for zone $confExtZone, exitng"
++ errno=2; return 2
++ fi
++
++ write_header > $conf
++ echo -n > $peerconf
++ echo -n > $pskconf
++ chmod 0600 $conf $peerconf $pskconf
++
++ echo "listen {" >> $conf
++ for item in $data ; do
++ echo " isakmp $item [$confPort]; isakmp_natt $item [$confNATPort];" >> $conf
++ done
++ echo "}" >> $conf
++
++ config_get_bool item "$1" debug 0
++ data=warning
++ test $item -ne 0 && data=debug
++ echo "log $data;" >> $conf
++
++ setup_fw add
++}
++
++setup_p1() {
++ local conf=$confDir/racoon.conf
++ local data
++
++ echo " proposal {" >> $conf
++ config_get data "$1" lifetime 28800
++ echo " lifetime time $data sec;" >> $conf
++
++ config_get data "$1" enc_alg
++ test -n "$data" && echo " encryption_algorithm $data;" >> $conf
++
++ config_get data "$1" hash_alg
++ test -n "$data" && echo " hash_algorithm $data;" >> $conf
++
++ config_get data "$1" auth_method
++ test -n "$data" && echo " authentication_method $data;" >> $conf
++
++ config_get data "$1" dh_group 2
++ echo -e " dh_group $data;\n }" >> $conf
++}
++
++setup_fw() {
++ local cmd=/usr/sbin/iptables
++ local mode
++
++ case "$1" in
++ add|up|1) mode=A ;;
++ del|down|0) mode=D ;;
++ *) return 3 ;;
++ esac
++
++ $cmd -$mode input_${confExtZone}_rule -p AH -j ACCEPT
++ $cmd -$mode input_${confExtZone}_rule -p ESP -j ACCEPT
++ $cmd -$mode input_${confExtZone}_rule -p UDP --dport $confPort -j ACCEPT
++ $cmd -$mode input_${confExtZone}_rule -p UDP --dport $confNATPort -j ACCEPT
++}
++
++setup_sa() {
++ local conf=$confDir/racoon.conf
++ local remote="${2/ *}"
++ local client="${2#* }"
++ local locnet
++ local remnet
++ local p2
++ local data
++
++ test "$2" = "$client" && unset client
++
++ if [ -z "$client" ]; then
++ config_get locnet "$1" local_net
++ config_get remnet "$1" remote_net
++ if [ -z "$locnet" ] || [ -z "$remnet" ]; then
++ $log "Remote and local networks for $1 must be configured ($2)"
++ errno=4; return 4
++ fi
++
++ if [ "$remote" = "anonymous" ]; then
++ echo "sainfo anonymous {" >> $conf
++ else
++ echo "sainfo address $locnet any address $remnet any {" >> $conf
++ fi
++ else
++ echo "sainfo anonymous {" >> $conf
++ fi
++
++ config_get p2 "$1" p2_proposal
++ if [ -z "$p2" ]; then
++ $log "Phase2 proposal must be configured in $1 sainfo"
++ errno=5; return 5
++ fi
++
++ echo " remoteid $confPh1ID;" >> $conf
++
++ config_get data "$p2" pfs_group
++ test -n "$data" && echo " pfs_group $data;" >> $conf
++ config_get data "$p2" lifetime 14400
++ test -n "$data" && echo " lifetime time $data sec;" >> $conf
++ config_get data "$p2" enc_alg
++ test -n "$data" && echo " encryption_algorithm $data;" >> $conf
++ config_get data "$p2" auth_alg
++ test -n "$data" && echo " authentication_algorithm $data;" >> $conf
++
++ echo -e " compression_algorithm deflate;\n}" >> $conf
++
++ if [ "$remote" = "anonymous" ]; then
++ echo -e "mode_cfg {\n auth_source system;\n conf_source local;" >> $conf
++
++ config_get data "$1" dns4
++ test -n "$data" && echo " dns4 $data;" >> $conf
++ config_get data "$1" defdomain
++ test -n "$data" && echo " default_domain \"$data\";" >> $conf
++
++ data=${remnet%/*}
++ let "data=${data##*.}+1"
++ echo " network4 ${remnet%.*}.$data;" >> $conf
++
++ let "data=255<<(24-${remnet#*/}+8)&255"
++ echo " netmask4 255.255.255.$data;" >> $conf
++
++ echo -e " split_network include $locnet;\n}" >> $conf
++
++ elif [ -z "$client" ]; then
++ manage_sa add $locnet $remnet $remote
++ test $? -gt 0 -o $errno -gt 0 && return $errno
++
++ manage_fw add $confIntZone $confExtZone $remnet
++ fi
++}
++
++setup_tunnel() {
++ local conf=$confDir/racoon.conf
++ local peerconf=$confDir/peers.txt
++ local data
++ local remote
++ local xauth
++
++ config_get_bool data "$1" enabled 0
++ test "$data" = "0" && return 0
++
++ config_get remote "$1" remote
++ if [ "$remote" = "anonymous" ]; then
++ echo -e "remote anonymous {\n generate_policy on;" >> $conf
++ else
++ data=$(nslookup "$remote" | awk 'NR == 5 {print $3}')
++ test -n "$data" && remote="$data"
++ echo -e "remote \"$1\" {\n remote_address $remote;" >> $conf
++ echo "$data" >> $peerconf
++ fi
++
++ config_get data "$1" pre_shared_key ""
++ if [ -n "$data" ]; then
++ if [ "$remote" != "anonymous" ]; then
++ echo "$remote $data" >> $confDir/psk.txt
++ else
++ echo "* $data" >> $confDir/psk.txt
++ fi
++ fi
++
++ let confPh1ID=$confPh1ID+1
++ echo " ph1id $confPh1ID;" >> $conf
++
++ config_get xauth "$1" username ""
++
++ config_get data "$1" certificate ""
++ if [ -n "$data" ]; then
++ echo -en " verify_cert on;\n my_identifier asn1dn;\n certificate_type x509 " >> $conf
++ echo -en "\"$data.crt\" \"$data.key\";\n send_cr off;\n peers_identifier " >> $conf
++ else
++ config_get data "$1" my_id_type ""
++ if [ -n "$data" ]; then
++ echo -n " my_identifier $data" >> $conf
++ config_get data "$1" my_id ""
++ if [ -n "$data" ]; then
++ echo " \"$data\";" >> $conf
++ elif [ -n "$xauth" ]; then
++ echo " \"$xauth\";" >> $conf
++ else
++ echo ";" >> $conf
++ fi
++ elif [ -n "$xauth" ]; then
++ echo " my_identifier user_fqdn \"$xauth\";" >> $conf
++ fi
++ echo -n " peers_identifier " >> $conf
++ fi
++
++ if [ "$remote" = "anonymous" ]; then
++ echo "user_fqdn;" >> $conf
++ else
++ config_get data "$1" peer_id_type "asn1dn"
++ echo -n "$data" >> $conf
++
++ config_get data "$1" peer_id ""
++ test -n "$data" && echo -n " \"$data\"" >> $conf
++
++ echo ";" >> $conf
++ fi
++
++ if [ -n "$xauth" ]; then
++ config_get data "$1" password
++ if [ -z "$data" ]; then
++ $log "Password must be given in $1 tunnel"
++ errno=7; return 7
++ fi
++ echo "$xauth $data" >> $confDir/psk.txt
++
++ echo " xauth_login \"$xauth\";" >> $conf
++ echo -e " script \"p1client-up\" phase1_up;\n script \"p1client-down\" phase1_down;" >> $conf
++ fi
++
++ config_get data "$1" exchange_mode
++ if [ -z "$data" ]; then
++ data=main
++ test -n "$xauth" && data="${data},aggressive"
++ fi
++ echo -e " exchange_mode $data;\n nat_traversal on;\n support_proxy on;" >> $conf
++
++ config_get data "$1" prop_check "obey"
++ test -n "$data" && echo " proposal_check $data;" >> $conf
++
++ config_get_bool data "$1" weak_p1check 1
++ if [ $data -eq 0 ]; then data=off; else data=on; fi
++ echo " weak_phase1_check $data;" >> $conf
++
++ config_get_bool data "$1" verify_id 1
++ if [ $data -eq 0 ]; then data=off; else data=on; fi
++ echo " verify_identifier $data;" >> $conf
++
++ config_get data "$1" dpd_delay ""
++ test -n "$data" && echo " dpd_delay $data;" >> $conf
++
++ unset data
++ test -n "$xauth" && data="on"
++ config_get data "$1" mode_cfg "$data"
++ test -n "$data" && echo " mode_cfg $data;" >> $conf
++
++ config_get_bool data "$1" init 0
++ if [ $data -eq 0 ]; then data=off; else data=on; fi
++ echo " initial_contact $data;" >> $conf
++
++
++ config_list_foreach "$1" p1_proposal setup_p1
++ echo "}" >> $conf
++
++ config_list_foreach "$1" sainfo setup_sa "$remote $xauth"
++}
++
++setup_cert() {
++ local item
++ local data
++
++ for item in key crt ; do
++ config_get data "$1" $item ""
++ test -z "$data" && continue
++
++ echo "$data" |\
++ sed 's/-\+[A-Z ]\+-\+/\n&\n/g' | sed 's/.\{50,50\}/&\n/g' | sed '/^$/d'\
++ > $confDir/cert/$1.$item
++
++ chmod 600 $confDir/cert/$1.$item
++ done
++
++ if [ -s $confDir/cert/$1.crt ]; then
++ data=$(openssl x509 -noout -hash -in $confDir/cert/$1.crt)
++ ln -sf $confDir/cert/$1.crt $confDir/cert/$data.0
++ fi
++}
++
++destroy_sa() {
++ local locnet
++ local remnet
++
++ config_get locnet "$1" local_net
++ config_get remnet "$1" remote_net
++ if [ -z "$locnet" ] || [ -z "$remnet" ]; then
++ $log "Remote and local networks for $1 must be configured"
++ errno=4; return 4
++ fi
++
++ manage_sa del $locnet $remnet $2
++ manage_fw del $confIntZone $confExtZone $remnet
++}
++
++destroy_tunnel() {
++ local data
++
++ config_get_bool data "$1" enabled 0
++ test "$data" = "0" && return 0
++
++ config_get remote "$1" remote
++ data=$(nslookup "$remote" | awk 'NR == 5 {print $3}')
++ test -n "$data" && remote="$data"
++
++ config_get data "$1" username ""
++ if [ -z "$data" ]; then
++ config_list_foreach "$1" sainfo destroy_sa $remote
++ fi
++}
++
++destroy_conf() {
++ setup_fw del
++}
++
++check_software() {
++ local item
++
++ for item in /usr/sbin/setkey /usr/bin/openssl /usr/sbin/ip ; do
++ if [ ! -x $item ]; then
++ $log "Needed program $item not found, exiting"
++ errno=9; return 9
++ fi
++ done
++}
++
++cleanup_conf() {
++ config_load racoon
++ config_foreach setup_load racoon
++ config_foreach destroy_conf racoon
++ config_foreach destroy_tunnel tunnel
++
++ /usr/sbin/setkey -P -F
++ /usr/sbin/setkey -F
++}
++
++check_dir() {
++ local item
++
++ for item in $confDir $confDir/cert ; do
++ if [ ! -d $item ]; then
++ mkdir -m 0700 -p $item
++ fi
++ done
++}
++
++wait4wanzone() {
++ local item=$connWait
++ local data
++
++ data="$(get_zoneiplist $confExtZone)"
++ while [ $item -gt 0 ]; do
++ test -n "$data" && break
++ sleep 2
++ let "item=$item-1"
++ data="$(get_zoneiplist $confExtZone)"
++ done
++
++ test -z "$data" && return 10
++}
++
++start_service() {
++ check_software
++ test $? -gt 0 -o $errno -gt 0 && exit $errno
++
++ check_dir
++
++ config_load racoon
++ config_foreach setup_load racoon
++
++ config_foreach wait4wanzone racoon
++ if [ $? -gt 0 ] || [ $errno -gt 0 ]; then
++ $log "No active interfaces in $confExtZone zone found, exiting"
++ exit $errno
++ fi
++
++ config_foreach setup_conf racoon
++ test $? -gt 0 -o $errno -gt 0 && exit $errno
++
++ config_foreach setup_tunnel tunnel
++ test $? -gt 0 -o $errno -gt 0 && exit $errno
++
++ config_foreach setup_cert certificate
++
++ procd_open_instance
++ procd_set_param command /usr/sbin/racoon
++ test -n "$confIPMode" && procd_append_param command -$confIPMode
++ procd_append_param command -F -f $confDir/racoon.conf
++ procd_set_param file $confDir/racoon.conf
++ procd_close_instance
++
++ if [ -x /etc/racoon/vpnctl ]; then
++ let connWait=$connWait*2+2
++ ( sleep $connWait; /etc/racoon/vpnctl up ) &
++ fi
++}
++
++service_triggers() {
++ local item
++ local data
++
++ procd_add_reload_trigger "racoon" "network"
++
++ config_load racoon
++ config_foreach setup_load racoon
++
++ data=$(get_zoneiflist $confExtZone)
++ if [ $? -gt 0 ] || [ $errno -gt 0 ] || [ -z "$data" ]; then
++ $log "Can not find interfaces for $confExtZone zone"
++ else
++ for item in $data ; do
++ procd_add_reload_interface_trigger $item
++ done
++ fi
++}
++
++stop_service() {
++ cleanup_conf
++ procd_kill racoon
++}
++
++trap "cleanup_conf" 1 2 3 4 5 6 7 8 9 10
++
++
++# EOF /etc/init.d/racoon
+diff --git a/feeds/packages/net/ipsec-tools/files/vpnctl b/feeds/packages/net/ipsec-tools/files/vpnctl
+new file mode 100644
+index 0000000..5fb6667
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/files/vpnctl
+@@ -0,0 +1,19 @@
++#!/bin/sh
++#
++
++case X$1 in
++ Xup|X1|Xstart) connMode=vpn-connect ;;
++ Xdown|X0|Xstop) connMode=vpn-disconnect ;;
++ *)
++ echo "Usage: $0: up|1|start || down|0|stop"
++ exit 1 ;;
++esac
++
++if [ -s /var/racoon/peers.txt ]; then
++ (while read ipa ; do
++ racoonctl $connMode $ipa
++ done) < /var/racoon/peers.txt
++fi
++
++
++# EOF /usr/bin/vpnctl
+diff --git a/feeds/packages/net/ipsec-tools/patches/001-ipsec-tools-def-psk.patch b/feeds/packages/net/ipsec-tools/patches/001-ipsec-tools-def-psk.patch
+new file mode 100644
+index 0000000..db5b306
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/patches/001-ipsec-tools-def-psk.patch
+@@ -0,0 +1,24 @@
++--- a/src/racoon/oakley.c
+++++ b/src/racoon/oakley.c
++@@ -2424,8 +2424,21 @@ oakley_skeyid(iph1)
++ plog(LLV_ERROR, LOCATION, iph1->remote,
++ "couldn't find the pskey for %s.\n",
++ saddrwop2str(iph1->remote));
+++ }
+++ }
+++ if (iph1->authstr == NULL) {
+++ /*
+++ * If we could not locate a psk above try and locate
+++ * the default psk, ie, "*".
+++ */
+++ iph1->authstr = privsep_getpsk("*", 1);
+++ if (iph1->authstr == NULL) {
+++ plog(LLV_ERROR, LOCATION, iph1->remote,
+++ "couldn't find the the default pskey either.\n");
++ goto end;
++ }
+++ plog(LLV_NOTIFY, LOCATION, iph1->remote,
+++ "Using default PSK.\n");
++ }
++ plog(LLV_DEBUG, LOCATION, NULL, "the psk found.\n");
++ /* should be secret PSK */
+diff --git a/feeds/packages/net/ipsec-tools/patches/001-no_libfl.patch b/feeds/packages/net/ipsec-tools/patches/001-no_libfl.patch
+new file mode 100644
+index 0000000..b56b596
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/patches/001-no_libfl.patch
+@@ -0,0 +1,22 @@
++--- a/src/racoon/cftoken.l
+++++ b/src/racoon/cftoken.l
++@@ -104,6 +104,8 @@ static struct include_stack {
++ static int incstackp = 0;
++
++ static int yy_first_time = 1;
+++
+++int yywrap(void) { return 1; }
++ %}
++
++ /* common seciton */
++--- a/src/setkey/token.l
+++++ b/src/setkey/token.l
++@@ -86,6 +86,8 @@
++ #if defined(SADB_X_EALG_AES) && ! defined(SADB_X_EALG_AESCBC)
++ #define SADB_X_EALG_AESCBC SADB_X_EALG_AES
++ #endif
+++
+++int yywrap(void) { return 1; }
++ %}
++
++ /* common section */
+diff --git a/feeds/packages/net/ipsec-tools/patches/002-patch8-utmp.patch b/feeds/packages/net/ipsec-tools/patches/002-patch8-utmp.patch
+new file mode 100644
+index 0000000..5475390
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/patches/002-patch8-utmp.patch
+@@ -0,0 +1,72 @@
++--- a/src/racoon/isakmp_cfg.c
+++++ b/src/racoon/isakmp_cfg.c
++@@ -38,7 +38,7 @@
++ #include <sys/socket.h>
++ #include <sys/queue.h>
++
++-#include <utmpx.h>
+++#include <utmp.h>
++ #if defined(__APPLE__) && defined(__MACH__)
++ #include <util.h>
++ #endif
++@@ -1664,7 +1664,8 @@ isakmp_cfg_accounting_system(port, raddr
++ int inout;
++ {
++ int error = 0;
++- struct utmpx ut;
+++ struct utmp ut;
+++ char term[UT_LINESIZE];
++ char addr[NI_MAXHOST];
++
++ if (usr == NULL || usr[0]=='\0') {
++@@ -1673,34 +1674,37 @@ isakmp_cfg_accounting_system(port, raddr
++ return -1;
++ }
++
++- memset(&ut, 0, sizeof ut);
++- gettimeofday((struct timeval *)&ut.ut_tv, NULL);
++- snprintf(ut.ut_id, sizeof ut.ut_id, TERMSPEC, port);
+++ sprintf(term, TERMSPEC, port);
++
++ switch (inout) {
++ case ISAKMP_CFG_LOGIN:
++- ut.ut_type = USER_PROCESS;
++- strncpy(ut.ut_user, usr, sizeof ut.ut_user);
+++ strncpy(ut.ut_name, usr, UT_NAMESIZE);
+++ ut.ut_name[UT_NAMESIZE - 1] = '\0';
+++
+++ strncpy(ut.ut_line, term, UT_LINESIZE);
+++ ut.ut_line[UT_LINESIZE - 1] = '\0';
++
++ GETNAMEINFO_NULL(raddr, addr);
++- strncpy(ut.ut_host, addr, sizeof ut.ut_host);
+++ strncpy(ut.ut_host, addr, UT_HOSTSIZE);
+++ ut.ut_host[UT_HOSTSIZE - 1] = '\0';
+++
+++ ut.ut_time = time(NULL);
++
++ plog(LLV_INFO, LOCATION, NULL,
++ "Accounting : '%s' logging on '%s' from %s.\n",
++- ut.ut_user, ut.ut_id, addr);
++-
++- pututxline(&ut);
+++ ut.ut_name, ut.ut_line, ut.ut_host);
++
+++ login(&ut);
+++
++ break;
++ case ISAKMP_CFG_LOGOUT:
++- ut.ut_type = DEAD_PROCESS;
++
++ plog(LLV_INFO, LOCATION, NULL,
++ "Accounting : '%s' unlogging from '%s'.\n",
++- usr, ut.ut_id);
++-
++- pututxline(&ut);
+++ usr, term);
++
+++ logout(term);
+++
++ break;
++ default:
++ plog(LLV_ERROR, LOCATION, NULL, "Unepected inout\n");
+diff --git a/feeds/packages/net/ipsec-tools/patches/003-microsoft-fqdn-in-main.patch b/feeds/packages/net/ipsec-tools/patches/003-microsoft-fqdn-in-main.patch
+new file mode 100644
+index 0000000..7174300
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/patches/003-microsoft-fqdn-in-main.patch
+@@ -0,0 +1,13 @@
++--- a/src/racoon/ipsec_doi.c
+++++ b/src/racoon/ipsec_doi.c
++@@ -3581,8 +3581,8 @@ ipsecdoi_checkid1(iph1)
++ iph1->approval->authmethod == OAKLEY_ATTR_AUTH_METHOD_PSKEY) {
++ if (id_b->type != IPSECDOI_ID_IPV4_ADDR
++ && id_b->type != IPSECDOI_ID_IPV6_ADDR) {
++- plog(LLV_ERROR, LOCATION, NULL,
++- "Expecting IP address type in main mode, "
+++ plog(LLV_WARNING, LOCATION, NULL,
+++ "Expecting IP address type in main mode (RFC2409) , "
++ "but %s.\n", s_ipsecdoi_ident(id_b->type));
++ return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
++ }
+diff --git a/feeds/packages/net/ipsec-tools/patches/005-isakmp-fix.patch b/feeds/packages/net/ipsec-tools/patches/005-isakmp-fix.patch
+new file mode 100644
+index 0000000..f7aa3c2
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/patches/005-isakmp-fix.patch
+@@ -0,0 +1,11 @@
++--- a/src/racoon/isakmp.c
+++++ b/src/racoon/isakmp.c
++@@ -31,6 +31,8 @@
++ * SUCH DAMAGE.
++ */
++
+++#define __packed __attribute__((__packed__))
+++
++ #include "config.h"
++
++ #include <sys/types.h>
+diff --git a/feeds/packages/net/ipsec-tools/patches/006-linux-3.7-compat.patch b/feeds/packages/net/ipsec-tools/patches/006-linux-3.7-compat.patch
+new file mode 100644
+index 0000000..46b11ee
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/patches/006-linux-3.7-compat.patch
+@@ -0,0 +1,50 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -74,9 +74,10 @@ case "$host_os" in
++ [ KERNEL_INCLUDE="/lib/modules/`uname -r`/build/include" ])
++
++ AC_CHECK_HEADER($KERNEL_INCLUDE/linux/pfkeyv2.h, ,
++- [ AC_CHECK_HEADER(/usr/src/linux/include/linux/pfkeyv2.h,
++- KERNEL_INCLUDE=/usr/src/linux/include ,
++- [ AC_MSG_ERROR([Unable to find linux-2.6 kernel headers. Aborting.]) ] ) ] )
+++ [ AC_CHECK_HEADER($KERNEL_INCLUDE/uapi/linux/pfkeyv2.h, ,
+++ [ AC_CHECK_HEADER(/usr/src/linux/include/linux/pfkeyv2.h,
+++ KERNEL_INCLUDE=/usr/src/linux/include ,
+++ [ AC_MSG_ERROR([Unable to find linux-2.6 kernel headers. Aborting.]) ] ) ] ) ] )
++ AC_SUBST(KERNEL_INCLUDE)
++ # We need the configure script to run with correct kernel headers.
++ # However we don't want to point to kernel source tree in compile time,
++@@ -643,7 +644,14 @@ AC_EGREP_CPP(yes,
++ #ifdef SADB_X_EXT_NAT_T_TYPE
++ yes
++ #endif
++-], [kernel_natt="yes"])
+++], [kernel_natt="yes"], [
+++ AC_EGREP_CPP(yes,
+++ [#include <uapi/linux/pfkeyv2.h>
+++ #ifdef SADB_X_EXT_NAT_T_TYPE
+++ yes
+++ #endif
+++ ], [kernel_natt="yes"])
+++])
++ ;;
++ freebsd*|netbsd*)
++ # NetBSD case
++--- a/src/include-glibc/Makefile.am
+++++ b/src/include-glibc/Makefile.am
++@@ -1,14 +1,7 @@
++-
++-.includes: ${top_builddir}/config.status
++- ln -snf $(KERNEL_INCLUDE)/linux
++- touch .includes
++-
++-all: .includes
++-
++ EXTRA_DIST = \
++ glibc-bugs.h \
++ net/pfkeyv2.h \
++ netinet/ipsec.h \
++ sys/queue.h
++
++-DISTCLEANFILES = .includes linux
+++DISTCLEANFILES = linux
+diff --git a/feeds/packages/net/ipsec-tools/patches/007-force_have_policy_fwd.patch b/feeds/packages/net/ipsec-tools/patches/007-force_have_policy_fwd.patch
+new file mode 100644
+index 0000000..69cd1c0
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/patches/007-force_have_policy_fwd.patch
+@@ -0,0 +1,12 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -732,7 +732,8 @@ case $host in
++ ],
++ [AC_MSG_RESULT(yes)
++ AC_DEFINE([HAVE_POLICY_FWD], [], [Have forward policy])],
++- [AC_MSG_RESULT(no)])
+++ [AC_MSG_RESULT(forced)
+++ AC_DEFINE([HAVE_POLICY_FWD], [], [Have forward policy])])
++ ;;
++ *)
++ AC_MSG_RESULT(no)
+diff --git a/feeds/packages/net/ipsec-tools/patches/008-racoon-fix_dereference_crash.patch b/feeds/packages/net/ipsec-tools/patches/008-racoon-fix_dereference_crash.patch
+new file mode 100644
+index 0000000..5e3a2d4
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/patches/008-racoon-fix_dereference_crash.patch
+@@ -0,0 +1,16 @@
++Fix null dereference in racoon/gssapi.c (CVE-2015-4047)
++
++--- a/src/racoon/gssapi.c
+++++ b/src/racoon/gssapi.c
++@@ -192,6 +192,11 @@ gssapi_init(struct ph1handle *iph1)
++ gss_name_t princ, canon_princ;
++ OM_uint32 maj_stat, min_stat;
++
+++ if (iph1->rmconf == NULL) {
+++ plog(LLV_ERROR, LOCATION, NULL, "no remote config\n");
+++ return -1;
+++ }
+++
++ gps = racoon_calloc(1, sizeof (struct gssapi_ph1_state));
++ if (gps == NULL) {
++ plog(LLV_ERROR, LOCATION, NULL, "racoon_calloc failed\n");
+diff --git a/feeds/packages/net/ipsec-tools/patches/009-musl-compat.patch b/feeds/packages/net/ipsec-tools/patches/009-musl-compat.patch
+new file mode 100644
+index 0000000..85d03f9
+--- /dev/null
++++ b/feeds/packages/net/ipsec-tools/patches/009-musl-compat.patch
+@@ -0,0 +1,187 @@
++--- a/src/racoon/grabmyaddr.c
+++++ b/src/racoon/grabmyaddr.c
++@@ -47,7 +47,6 @@
++ #include <net/route.h>
++ #include <net/if.h>
++ #include <net/if_dl.h>
++-#include <sys/sysctl.h>
++ #define USE_ROUTE
++ #endif
++
++--- a/src/racoon/pfkey.c
+++++ b/src/racoon/pfkey.c
++@@ -59,7 +59,6 @@
++ #include <sys/param.h>
++ #include <sys/socket.h>
++ #include <sys/queue.h>
++-#include <sys/sysctl.h>
++
++ #include <net/route.h>
++ #include <net/pfkeyv2.h>
++--- a/src/setkey/setkey.c
+++++ b/src/setkey/setkey.c
++@@ -40,7 +40,6 @@
++ #include <sys/socket.h>
++ #include <sys/time.h>
++ #include <sys/stat.h>
++-#include <sys/sysctl.h>
++ #include <err.h>
++ #include <netinet/in.h>
++ #include <net/pfkeyv2.h>
++--- a/src/libipsec/ipsec_strerror.h
+++++ b/src/libipsec/ipsec_strerror.h
++@@ -34,6 +34,8 @@
++ #ifndef _IPSEC_STRERROR_H
++ #define _IPSEC_STRERROR_H
++
+++#include <sys/cdefs.h>
+++
++ extern int __ipsec_errcode;
++ extern void __ipsec_set_strerror __P((const char *));
++
++--- a/src/libipsec/libpfkey.h
+++++ b/src/libipsec/libpfkey.h
++@@ -34,6 +34,8 @@
++ #ifndef _LIBPFKEY_H
++ #define _LIBPFKEY_H
++
+++#include <sys/cdefs.h>
+++
++ #ifndef KAME_LIBPFKEY_H
++ #define KAME_LIBPFKEY_H
++
++--- a/src/racoon/backupsa.c
+++++ b/src/racoon/backupsa.c
++@@ -276,9 +276,9 @@ do { \
++ GETNEXTNUM(sa_args.a_keylen, strtoul);
++ GETNEXTNUM(sa_args.flags, strtoul);
++ GETNEXTNUM(sa_args.l_alloc, strtoul);
++- GETNEXTNUM(sa_args.l_bytes, strtouq);
++- GETNEXTNUM(sa_args.l_addtime, strtouq);
++- GETNEXTNUM(sa_args.l_usetime, strtouq);
+++ GETNEXTNUM(sa_args.l_bytes, strtoull);
+++ GETNEXTNUM(sa_args.l_addtime, strtoull);
+++ GETNEXTNUM(sa_args.l_usetime, strtoull);
++ GETNEXTNUM(sa_args.seq, strtoul);
++
++ #undef GETNEXTNUM
++--- a/src/racoon/cftoken.l
+++++ b/src/racoon/cftoken.l
++@@ -77,6 +77,10 @@
++
++ #include "cfparse.h"
++
+++#ifndef GLOB_TILDE
+++#define GLOB_TILDE 0
+++#endif
+++
++ int yyerrorcount = 0;
++
++ #if defined(YIPS_DEBUG)
++--- a/src/racoon/logger.h
+++++ b/src/racoon/logger.h
++@@ -34,6 +34,8 @@
++ #ifndef _LOGGER_H
++ #define _LOGGER_H
++
+++#include <sys/cdefs.h>
+++
++ struct log {
++ int head;
++ int siz;
++--- a/src/racoon/misc.h
+++++ b/src/racoon/misc.h
++@@ -34,6 +34,8 @@
++ #ifndef _MISC_H
++ #define _MISC_H
++
+++#include <sys/cdefs.h>
+++
++ #define BIT2STR(b) bit2str(b, sizeof(b)<<3)
++
++ #ifdef HAVE_FUNC_MACRO
++--- a/src/racoon/missing/crypto/sha2/sha2.h
+++++ b/src/racoon/missing/crypto/sha2/sha2.h
++@@ -40,6 +40,8 @@
++ #ifndef __SHA2_H__
++ #define __SHA2_H__
++
+++#include <sys/cdefs.h>
+++
++ #ifdef __cplusplus
++ extern "C" {
++ #endif
++--- a/src/racoon/netdb_dnssec.h
+++++ b/src/racoon/netdb_dnssec.h
++@@ -34,6 +34,8 @@
++ #ifndef _NETDB_DNSSEC_H
++ #define _NETDB_DNSSEC_H
++
+++#include <sys/cdefs.h>
+++
++ #ifndef T_CERT
++ #define T_CERT 37 /* defined by RFC2538 section 2 */
++ #endif
++--- a/src/racoon/plog.h
+++++ b/src/racoon/plog.h
++@@ -34,6 +34,8 @@
++ #ifndef _PLOG_H
++ #define _PLOG_H
++
+++#include <sys/cdefs.h>
+++
++ #ifdef HAVE_STDARG_H
++ #include <stdarg.h>
++ #else
++--- a/src/racoon/str2val.h
+++++ b/src/racoon/str2val.h
++@@ -34,6 +34,8 @@
++ #ifndef _STR2VAL_H
++ #define _STR2VAL_H
++
+++#include <sys/cdefs.h>
+++
++ extern caddr_t val2str __P((const char *, size_t));
++ extern char *str2val __P((const char *, int, size_t *));
++
++--- a/src/racoon/vmbuf.h
+++++ b/src/racoon/vmbuf.h
++@@ -34,6 +34,8 @@
++ #ifndef _VMBUF_H
++ #define _VMBUF_H
++
+++#include <sys/cdefs.h>
+++
++ /*
++ * bp v
++ * v v
++--- a/src/setkey/extern.h
+++++ b/src/setkey/extern.h
++@@ -1,6 +1,6 @@
++ /* $NetBSD: extern.h,v 1.5 2009/03/06 11:45:03 tteras Exp $ */
++
++-
+++#include <sys/cdefs.h>
++
++ void parse_init __P((void));
++ int parse __P((FILE **));
++--- a/src/racoon/isakmp_cfg.c
+++++ b/src/racoon/isakmp_cfg.c
++@@ -1694,8 +1694,6 @@ isakmp_cfg_accounting_system(port, raddr
++ "Accounting : '%s' logging on '%s' from %s.\n",
++ ut.ut_name, ut.ut_line, ut.ut_host);
++
++- login(&ut);
++-
++ break;
++ case ISAKMP_CFG_LOGOUT:
++
++@@ -1703,8 +1701,6 @@ isakmp_cfg_accounting_system(port, raddr
++ "Accounting : '%s' unlogging from '%s'.\n",
++ usr, term);
++
++- logout(term);
++-
++ break;
++ default:
++ plog(LLV_ERROR, LOCATION, NULL, "Unepected inout\n");
+diff --git a/feeds/packages/net/irssi/Makefile b/feeds/packages/net/irssi/Makefile
+new file mode 100644
+index 0000000..3fbfef1
+--- /dev/null
++++ b/feeds/packages/net/irssi/Makefile
+@@ -0,0 +1,98 @@
++#
++# Copyright (C) 2006-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=irssi
++PKG_VERSION:=0.8.17
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://irssi.org/files/
++PKG_MD5SUM:=ecf64be47978d89a742b435a81cb47db
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/irssi/Default
++ SUBMENU:=Instant Messaging
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+glib2 +libncurses +libpthread
++ TITLE:=Console IRC client
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++ URL:=http://irssi.org/
++endef
++
++define Package/irssi/Default/description
++ Irssi is a terminal based IRC client for UNIX systems.
++endef
++
++define Package/irssi
++$(call Package/irssi/Default)
++ TITLE+= (with OpenSSL support)
++ DEPENDS+= +libopenssl
++ VARIANT:=ssl
++endef
++
++define Package/irssi/description
++$(call Package/irssi/Default/description)
++ This package is built with OpenSSL support.
++endef
++
++define Package/irssi-nossl
++$(call Package/irssi/Default)
++ TITLE+= (without OpenSSL support)
++ VARIANT:=nossl
++endef
++
++define Package/irssi-nossl/description
++$(call Package/irssi/Default/description)
++ This package is built without OpenSSL support.
++endef
++
++CONFIGURE_ARGS += \
++ --with-perl=no \
++ --with-glib-prefix="$(STAGING_DIR)/usr" \
++ --with-textui \
++ --without-terminfo \
++ --without-bot \
++ --disable-proxy
++
++EXTRA_CFLAGS+=$(TARGET_CPPFLAGS)
++EXTRA_LDFLAGS+=-lncurses
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS += \
++ --with-ssl="$(STAGING_DIR)/usr"
++endif
++
++ifeq ($(BUILD_VARIANT),nossl)
++ CONFIGURE_ARGS += \
++ --without-ssl \
++ --disable-ssl
++endif
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/irssi
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/irssi/* $(1)/usr/include/irssi/
++endef
++
++define Package/irssi/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(PKG_NAME) $(1)/usr/bin/$(PKG_NAME)
++endef
++
++Package/irssi-nossl/install = $(Package/irssi/install)
++
++$(eval $(call BuildPackage,irssi))
++$(eval $(call BuildPackage,irssi-nossl))
+diff --git a/feeds/packages/net/keepalived/Makefile b/feeds/packages/net/keepalived/Makefile
+new file mode 100644
+index 0000000..6d7d93c
+--- /dev/null
++++ b/feeds/packages/net/keepalived/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=keepalived
++PKG_VERSION:=1.2.16
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:= http://www.keepalived.org/software
++PKG_MD5SUM:=f834ab2cfc2e7300edf1bafaf4a5d83e
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++define Package/keepalived
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Failover and monitoring daemon for LVS clusters
++ URL:=http://www.keepalived.org/
++ DEPENDS:=+libnl-genl +libopenssl
++endef
++
++define Package/keepalived/description
++ Failover and monitoring daemon for Linux Virtual Server (LVS) clusters.
++endef
++
++define Package/keepalived/conffiles
++/etc/keepalived/keepalived.conf
++endef
++
++CONFIGURE_ARGS+= \
++ --enable-vrrp \
++ --enable-fwmark \
++ --enable-sha1 \
++ --disable-lvs \
++ --disable-lvs-syncd \
++ --disable-snmp \
++ --disable-debug \
++ --disable-profile \
++ --with-kernel-dir="$(LINUX_DIR)/$(LINUX_UAPI_DIR)"
++
++MAKE_FLAGS += \
++ STRIP="/bin/true" \
++
++define Package/keepalived/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/keepalived $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/genhash $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/keepalived
++ $(CP) $(PKG_INSTALL_DIR)/etc/keepalived/keepalived.conf $(1)/etc/keepalived/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/keepalived.init $(1)/etc/init.d/keepalived
++endef
++
++$(eval $(call BuildPackage,keepalived))
+diff --git a/feeds/packages/net/keepalived/files/keepalived.init b/feeds/packages/net/keepalived/files/keepalived.init
+new file mode 100644
+index 0000000..1d1ada2
+--- /dev/null
++++ b/feeds/packages/net/keepalived/files/keepalived.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007-2015 OpenWrt.org
++
++START=70
++
++SERVICE_USE_PID=1
++
++start() {
++ service_start /usr/sbin/keepalived
++}
++
++stop() {
++ service_stop /usr/sbin/keepalived
++}
+diff --git a/feeds/packages/net/keepalived/patches/100-musl-compat.patch b/feeds/packages/net/keepalived/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..9668c2b
+--- /dev/null
++++ b/feeds/packages/net/keepalived/patches/100-musl-compat.patch
+@@ -0,0 +1,10 @@
++--- a/lib/utils.h
+++++ b/lib/utils.h
++@@ -31,6 +31,7 @@
++ #include <arpa/inet.h>
++ #include <arpa/nameser.h>
++ #include <sys/param.h>
+++#include <sys/types.h>
++ #include <sys/utsname.h>
++ #include <netdb.h>
++
+diff --git a/feeds/packages/net/kismet/Makefile b/feeds/packages/net/kismet/Makefile
+new file mode 100644
+index 0000000..de60949
+--- /dev/null
++++ b/feeds/packages/net/kismet/Makefile
+@@ -0,0 +1,142 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=kismet
++PKG_VERSION:=2013-03-R1b
++PKG_RELEASE:=1
++
++PKG_LICENSE:=LGPLv2.1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.kismetwireless.net/code
++PKG_MD5SUM:=6cdcd78baf2e15edbe8a9de3c5493f02
++
++PKG_BUILD_DEPENDS:=libpcap libncurses libpcre
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/kismet/Default
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Kismet
++ MAINTAINER:=Sebastian Wendel <packages@sourceindex.de>
++ DEPENDS:= $(CXX_DEPENDS) +libnl
++ URL:=http://www.kismetwireless.net/
++ SUBMENU:=wireless
++endef
++
++define Package/kismet/Default/description
++ An 802.11 layer2 wireless network detector, sniffer, and intrusion
++ detection system.
++endef
++
++define Package/kismet-client/conffiles
++/etc/kismet/kismet.conf
++endef
++
++define Package/kismet-drone/conffiles
++/etc/kismet/kismet_drone.conf
++endef
++
++define Package/kismet-server/conffiles
++/etc/kismet/kismet.conf
++endef
++
++define Package/kismet-client
++$(call Package/kismet/Default)
++ TITLE+= client
++ DEPENDS+= +libncurses
++endef
++
++define Package/kismet-client/description
++$(call Package/kismet/Default/description)
++ This package contains the kismet text interface client.
++endef
++
++define Package/kismet-drone
++$(call Package/kismet/Default)
++ DEPENDS+= +libpcap +libpcre +libcap +wireless-tools
++ TITLE+= drone
++endef
++
++define Package/kismet-drone/description
++$(call Package/kismet/Default/description)
++ This package contains the kismet remote sniffing.and monitoring drone.
++endef
++
++define Package/kismet-server
++$(call Package/kismet/Default)
++ DEPENDS+= +libpcap +libpcre +libcap +wireless-tools
++ TITLE+= server
++endef
++
++define Package/kismet-server/description
++$(call Package/kismet/Default/description)
++ This package contains the kismet server.
++endef
++
++CONFIGURE_ARGS += \
++ --sysconfdir=/etc/kismet \
++
++CONFIGURE_VARS += \
++ CXXFLAGS="$$$$CXXFLAGS -fno-rtti" \
++ LIBS="-lm" \
++ CLIENTCLIBS="-lm"
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ LD="$(TARGET_CXX)" \
++ all
++endef
++
++define Package/kismet/install
++ $(INSTALL_DIR) $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/kismet $(1)/usr/bin/kismet
++endef
++
++define Package/kismet-client/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/kismet_client $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/etc/kismet/
++ $(INSTALL_CONF) ./files/kismet.conf $(1)/etc/kismet/
++endef
++
++define Package/kismet-drone/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/kismet_drone $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/etc/kismet/
++ $(INSTALL_CONF) ./files/kismet_drone.conf $(1)/etc/kismet/
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/kismet_drone.config $(1)/etc/config/kismet_drone
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/kismet_drone.init $(1)/etc/init.d/kismet_drone
++endef
++
++define Package/kismet-server/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/kismet_server $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/etc/kismet/
++ $(INSTALL_CONF) ./files/kismet.conf $(1)/etc/kismet/
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/kismet_server.config $(1)/etc/config/kismet_server
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/kismet_server.init $(1)/etc/init.d/kismet_server
++endef
++
++$(eval $(call BuildPackage,kismet-client))
++$(eval $(call BuildPackage,kismet-drone))
++$(eval $(call BuildPackage,kismet-server))
+diff --git a/feeds/packages/net/kismet/files/kismet.conf b/feeds/packages/net/kismet/files/kismet.conf
+new file mode 100644
+index 0000000..971f2e2
+--- /dev/null
++++ b/feeds/packages/net/kismet/files/kismet.conf
+@@ -0,0 +1,304 @@
++# Kismet config file
++# Most of the "static" configs have been moved to here -- the command line
++# config was getting way too crowded and cryptic. We want functionality,
++# not continually reading --help!
++
++# Version of Kismet config
++version=2009-newcore
++
++# Name of server (Purely for organizational purposes)
++# If commented out, defaults to host name of system
++# servername=Kismet Server
++
++# Prefix of where we log (as used in the logtemplate later)
++logprefix=/tmp
++
++# Do we process the contents of data frames? If this is enabled, data
++# frames will be truncated to the headers only immediately after frame type
++# detection. This will disable IP detection, etc, however it is likely
++# safer (and definitely more polite) if monitoring networks you do not own.
++# hidedata=true
++
++# Do we allow plugins to be used? This will load plugins from the system
++# and user plugin directiories when set to true (See the README for the default
++# plugin locations).
++allowplugins=false
++
++# See the README for full information on the new source format
++# ncsource=interface:options
++# for example:
++# ncsource=wifi0:type=madwifi
++# ncsource=wlan0:name=intel,hop=false,channel=11
++ncsource=wlan0
++
++# Comma-separated list of sources to enable. This is only needed if you defined
++# multiple sources and only want to enable some of them. By default, all defined
++# sources are enabled.
++# For example, if sources with name=prismsource and name=ciscosource are defined,
++# and you only want to enable those two:
++# enablesources=prismsource,ciscosource
++
++# Control which channels we like to spend more time on. By default, the list
++# of channels is pulled from the driver automatically. By setting preferred channels,
++# if they are present in the channel list, they'll be set with a timing delay so that
++# more time is spent on them. Since 1, 6, 11 are the common default channels, it makes
++# sense to spend more time monitoring them.
++# For finer control, see further down in the config for the channellist= directives.
++preferredchannels=1,6,11
++
++# How many channels per second do we hop? (1-10)
++channelvelocity=3
++
++# By setting the dwell time for channel hopping we override the channelvelocity
++# setting above and dwell on each channel for the given number of seconds.
++#channeldwell=10
++
++# Channels are defined as:
++# channellist=name:ch1,ch2,ch3
++# or
++# channellist=name:range-start-end-width-offset,ch,range,ch,...
++#
++# Channels may be a numeric channel or a frequency
++#
++# Channels may specify an additional wait period. For common default channels,
++# an additional wait period can be useful. Wait periods delay for that number
++# of times per second - so a configuration hopping 10 times per second with a
++# channel of 6:3 would delay 3/10ths of a second on channel 6.
++#
++# Channel lists may have up to 256 channels and ranges (combined). For power
++# users scanning more than 256 channels with a single card, ranges must be used.
++#
++# Ranges are meant for "power users" who wish to define a very large number of
++# channels. A range may specify channels or frequencies, and will automatically
++# sort themselves to cover channels in a non-overlapping fashion. An example
++# range for the normal 802.11b/g spectrum would be:
++#
++# range-1-11-3-1
++#
++# which indicates starting at 1, ending at 11, a channel width of 3 channels,
++# incrementing by one. A frequency based definition would be:
++#
++# range-2412-2462-22-5
++#
++# since 11g channels are 22 mhz wide and 5 mhz apart.
++#
++# Ranges have the flaw that they cannot be shared between sources in a non-overlapping
++# way, so multiple sources using the same range may hop in lockstep with each other
++# and duplicate the coverage.
++#
++# channellist=demo:1:3,6:3,11:3,range-5000-6000-20-10
++
++# Default channel lists
++# These channel lists MUST BE PRESENT for Kismet to work properly. While it is
++# possible to change these, it is not recommended. These are used when the supported
++# channel list can not be found for the source; to force using these instead of
++# the detected supported channels, override with channellist= in the source defintion
++#
++# IN GENERAL, if you think you want to modify these, what you REALLY want to do is
++# copy them and use channellist= in the packet source.
++channellist=IEEE80211b:1:3,6:3,11:3,2,7,3,8,4,9,5,10
++channellist=IEEE80211a:36,40,44,48,52,56,60,64,149,153,157,161,165
++channellist=IEEE80211ab:1:3,6:3,11:3,2,7,3,8,4,9,5,10,36,40,44,48,52,56,60,64,149,153,157,161,165
++
++# Client/server listen config
++listen=tcp://127.0.0.1:2501
++#listen=tcp://0.0.0.0:2501
++
++# People allowed to connect, comma seperated IP addresses or network/mask
++# blocks. Netmasks can be expressed as dotted quad (/255.255.255.0) or as
++# numbers (/24)
++allowedhosts=127.0.0.1
++# Maximum number of concurrent GUI's
++maxclients=5
++# Maximum backlog before we start throwing out or killing clients. The
++# bigger this number, the more memory and the more power it will use.
++maxbacklog=5000
++
++# Server + Drone config options. To have a Kismet server export live packets
++# as if it were a drone, uncomment these.
++# dronelisten=tcp://127.0.0.1:3501
++# droneallowedhosts=127.0.0.1
++# dronemaxclients=5
++# droneringlen=65535
++
++# OUI file, expected format 00:11:22<tab>manufname
++# IEEE OUI file used to look up manufacturer info. We default to the
++# wireshark one since most people have that.
++#ouifile=/usr/share/manuf
++
++# Do we have a GPS?
++gps=false
++# Do we use a locally serial attached GPS, or use a gpsd server, or
++# use a fixed virtual gps?
++# (Pick only one)
++gpstype=gpsd
++# Host:port that GPSD is running on. This can be localhost OR remote!
++gpshost=localhost:2947
++
++
++# gpstype=serial
++# What serial device do we look for the GPS on?
++# gpsdevice=/dev/rfcomm0
++
++# gpstype=virtual
++# gpsposition=100,-50
++# gpsaltitude=1234
++
++# Do we lock the mode? This overrides coordinates of lock "0", which will
++# generate some bad information until you get a GPS lock, but it will
++# fix problems with GPS units with broken NMEA that report lock 0
++gpsmodelock=false
++# Do we try to reconnect if we lose our link to the GPS, or do we just
++# let it die and be disabled?
++gpsreconnect=true
++
++# Do we export packets over tun/tap virtual interfaces?
++tuntap_export=false
++# What virtual interface do we use
++tuntap_device=kistap0
++
++# Packet filtering options:
++# filter_tracker - Packets filtered from the tracker are not processed or
++# recorded in any way.
++# filter_export - Controls what packets influence the exported CSV, network,
++# xml, gps, etc files.
++# All filtering options take arguments containing the type of address and
++# addresses to be filtered. Valid address types are 'ANY', 'BSSID',
++# 'SOURCE', and 'DEST'. Filtering can be inverted by the use of '!' before
++# the address. For example,
++# filter_tracker=ANY(!"00:00:DE:AD:BE:EF")
++# has the same effect as the previous mac_filter config file option.
++# filter_tracker=...
++# filter_dump=...
++# filter_export=...
++# filter_netclient=...
++
++# Alerts to be reported and the throttling rates.
++# alert=name,throttle/unit,burst
++# The throttle/unit describes the number of alerts of this type that are
++# sent per time unit. Valid time units are second, minute, hour, and day.
++# Burst describes the number of alerts sent before throttling takes place.
++# For example:
++# alert=FOO,10/min,5
++# Would allow 5 alerts through before throttling is enabled, and will then
++# limit the number of alerts to 10 per minute.
++# A throttle rate of 0 disables throttling of the alert.
++# See the README for a list of alert types.
++alert=ADHOCCONFLICT,5/min,1/sec
++alert=AIRJACKSSID,5/min,1/sec
++alert=APSPOOF,10/min,1/sec
++alert=BCASTDISCON,5/min,2/sec
++alert=BSSTIMESTAMP,5/min,1/sec
++alert=CHANCHANGE,5/min,1/sec
++alert=CRYPTODROP,5/min,1/sec
++alert=DISASSOCTRAFFIC,10/min,1/sec
++alert=DEAUTHFLOOD,5/min,2/sec
++alert=DEAUTHCODEINVALID,5/min,1/sec
++alert=DISCONCODEINVALID,5/min,1/sec
++alert=DHCPNAMECHANGE,5/min,1/sec
++alert=DHCPOSCHANGE,5/min,1/sec
++alert=DHCPCLIENTID,5/min,1/sec
++alert=DHCPCONFLICT,10/min,1/sec
++alert=NETSTUMBLER,5/min,1/sec
++alert=LUCENTTEST,5/min,1/sec
++alert=LONGSSID,5/min,1/sec
++alert=MSFBCOMSSID,5/min,1/sec
++alert=MSFDLINKRATE,5/min,1/sec
++alert=MSFNETGEARBEACON,5/min,1/sec
++alert=NULLPROBERESP,5/min,1/sec
++alert=PROBENOJOIN,5/min,1/sec
++
++# Controls behavior of the APSPOOF alert. SSID may be a literal match (ssid=) or
++# a regex (ssidregex=) if PCRE was available when kismet was built. The allowed
++# MAC list must be comma-separated and enclosed in quotes if there are multiple
++# MAC addresses allowed. MAC address masks are allowed.
++#apspoof=Foo1:ssidregex="(?i:foobar)",validmacs=00:11:22:33:44:55
++#apspoof=Foo2:ssid="Foobar",validmacs="00:11:22:33:44:55,aa:bb:cc:dd:ee:ff"
++
++# Known WEP keys to decrypt, bssid,hexkey. This is only for networks where
++# the keys are already known, and it may impact throughput on slower hardware.
++# Multiple wepkey lines may be used for multiple BSSIDs.
++# wepkey=00:DE:AD:C0:DE:00,FEEDFACEDEADBEEF01020304050607080900
++
++# Is transmission of the keys to the client allowed? This may be a security
++# risk for some. If you disable this, you will not be able to query keys from
++# a client.
++allowkeytransmit=true
++
++# How often (in seconds) do we write all our data files (0 to disable)
++writeinterval=10
++
++# Do we use sound?
++# Not to be confused with GUI sound parameter, this controls wether or not the
++# server itself will play sound. Primarily for headless or automated systems.
++enablesound=false
++# Path to sound player
++soundbin=play
++
++sound=newnet,true
++sound=newcryptnet,true
++sound=packet,true
++sound=gpslock,true
++sound=gpslost,true
++sound=alert,true
++
++# Does the server have speech? (Again, not to be confused with the GUI's speech)
++enablespeech=false
++# Binary used for speech (if not in path, full path must be specified)
++speechbin=flite
++# Specify raw or festival; Flite (and anything else that doesn't need formatting
++# around the string to speak) is 'raw', festival requires the string be wrapped in
++# SayText("...")
++speechtype=raw
++
++# How do we speak? Valid options:
++# speech Normal speech
++# nato NATO spellings (alpha, bravo, charlie)
++# spell Spell the letters out (aye, bee, sea)
++speechencoding=nato
++
++speech=new,"New network detected s.s.i.d. %1 channel %2"
++speech=alert,"Alert %1"
++speech=gpslost,"G.P.S. signal lost"
++speech=gpslock,"G.P.S. signal O.K."
++
++# How many alerts do we backlog for new clients? Only change this if you have
++# a -very- low memory system and need those extra bytes, or if you have a high
++# memory system and a huge number of alert conditions.
++alertbacklog=50
++
++# File types to log, comma seperated. Built-in log file types:
++# alert Text file of alerts
++# gpsxml XML per-packet GPS log
++# nettxt Networks in text format
++# netxml Networks in XML format
++# pcapdump tcpdump/wireshark compatible pcap log file
++# string All strings seen (increases CPU load)
++logtypes=pcapdump,gpsxml,netxml,alert
++
++# Format of the pcap dump (PPI or 80211)
++pcapdumpformat=ppi
++# pcapdumpformat=80211
++
++# Default log title
++logdefault=Kismet
++
++# logtemplate - Filename logging template.
++# This is, at first glance, really nasty and ugly, but you'll hardly ever
++# have to touch it so don't complain too much.
++#
++# %p is replaced by the logging prefix + '/'
++# %n is replaced by the logging instance name
++# %d is replaced by the starting date as Mon-DD-YYYY
++# %D is replaced by the current date as YYYYMMDD
++# %t is replaced by the starting time as HH-MM-SS
++# %i is replaced by the increment log in the case of multiple logs
++# %l is replaced by the log type (pcapdump, strings, etc)
++# %h is replaced by the home directory
++
++logtemplate=%p%n-%D-%t-%i.%l
++
++# Where state info, etc, is stored. You shouldnt ever need to change this.
++# This is a directory.
++configdir=%h/.kismet/
++
+diff --git a/feeds/packages/net/kismet/files/kismet_drone.conf b/feeds/packages/net/kismet/files/kismet_drone.conf
+new file mode 100644
+index 0000000..bd16540
+--- /dev/null
++++ b/feeds/packages/net/kismet/files/kismet_drone.conf
+@@ -0,0 +1,69 @@
++# Kismet drone config file
++
++version=newcore.1
++
++# Name of drone server (informational)
++servername=Kismet-Drone
++
++# Drone configuration
++# Protocol, interface, and port to listen on
++dronelisten=tcp://127.0.0.1:2502
++# Hosts allowed to connect, comma separated. May include netmasks.
++# allowedhosts=127.0.0.1,10.10.10.0/255.255.255.0
++droneallowedhosts=127.0.0.1
++# Maximum number of drone clients
++dronemaxclients=10
++droneringlen=65535
++
++# Do we have a GPS?
++gps=true
++# Do we use a locally serial attached GPS, or use a gpsd server?
++# (Pick only one)
++gpstype=gpsd
++# gpstype=serial
++# What serial device do we look for the GPS on?
++gpsdevice=/dev/rfcomm0
++# Host:port that GPSD is running on. This can be localhost OR remote!
++gpshost=localhost:2947
++# Do we lock the mode? This overrides coordinates of lock "0", which will
++# generate some bad information until you get a GPS lock, but it will
++# fix problems with GPS units with broken NMEA that report lock 0
++gpsmodelock=false
++# Do we try to reconnect if we lose our link to the GPS, or do we just
++# let it die and be disabled?
++gpsreconnect=true
++
++# See the README for full information on the new source format
++# ncsource=interface:options
++ncsource=null
++# for example:
++# ncsource=wlan0
++# ncsource=wifi0:type=madwifi
++# ncsource=wlan0:name=intel,hop=false,channel=11
++
++# Special per-source options
++# sourceopts=[sourcename|*]:opt1,opt2
++# sourceopts=*:fuzzycrypt,weakvalidate
++
++# Comma-separated list of sources to enable, if you don't want to enable all
++# the sources you defined.
++# enablesource=source1,source2
++
++# How many channels per second do we hop? (1-10)
++channelvelocity=5
++
++# By setting the dwell time for channel hopping we override the channelvelocity
++# setting above and dwell on each channel for the given number of seconds.
++#channeldwell=10
++
++# Users outside the US might want to use this list:
++# channellist=IEEE80211b:1,7,13,2,8,3,14,9,4,10,5,11,6,12
++channellist=IEEE80211b:1:3,6:3,11:3,2,7,3,8,4,9,5,10
++
++# US IEEE 80211a
++channellist=IEEE80211a:36,40,44,48,52,56,60,64,149,153,157,161,165
++
++# Combo
++channellist=IEEE80211ab:1:3,6:3,11:3,2,7,3,8,4,9,5,10,36,40,44,48,52,56,60,64,149,153,157,161,165
++
++
+diff --git a/feeds/packages/net/kismet/files/kismet_drone.config b/feeds/packages/net/kismet/files/kismet_drone.config
+new file mode 100644
+index 0000000..749505d
+--- /dev/null
++++ b/feeds/packages/net/kismet/files/kismet_drone.config
+@@ -0,0 +1,2 @@
++config kismet_drone
++ option enabled 0
+diff --git a/feeds/packages/net/kismet/files/kismet_drone.init b/feeds/packages/net/kismet/files/kismet_drone.init
+new file mode 100755
+index 0000000..2cbbe7e
+--- /dev/null
++++ b/feeds/packages/net/kismet/files/kismet_drone.init
+@@ -0,0 +1,26 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2013-2014 OpenWrt.org
++
++START=99
++STOP=99
++
++USE_PROCD=1
++PROG=/usr/bin/kismet_drone
++NAME=kismet_drone
++
++kismet_drone_instance() {
++ procd_open_instance
++ procd_set_param command "${PROG}"
++ procd_append_param command -f /etc/kismet/kismet_drone.conf -s
++ procd_set_param respawn
++ procd_close_instance
++}
++
++start_service() {
++ config_load "${NAME}"
++ config_foreach kismet_drone_instance
++}
++
++stop_service() {
++ service_stop "${PROG}"
++}
+diff --git a/feeds/packages/net/kismet/files/kismet_server.config b/feeds/packages/net/kismet/files/kismet_server.config
+new file mode 100644
+index 0000000..ad39f3e
+--- /dev/null
++++ b/feeds/packages/net/kismet/files/kismet_server.config
+@@ -0,0 +1,2 @@
++config kismet_server
++ option enabled 0
+diff --git a/feeds/packages/net/kismet/files/kismet_server.init b/feeds/packages/net/kismet/files/kismet_server.init
+new file mode 100755
+index 0000000..7d731e7
+--- /dev/null
++++ b/feeds/packages/net/kismet/files/kismet_server.init
+@@ -0,0 +1,26 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2013-2014 OpenWrt.org
++
++START=99
++STOP=99
++
++USE_PROCD=1
++PROG=/usr/bin/kismet_server
++NAME=kismet_server
++
++kismet_server_instance() {
++ procd_open_instance
++ procd_set_param command "${PROG}"
++ procd_append_param command -f /etc/kismet/kismet.conf -s
++ procd_set_param respawn
++ procd_close_instance
++}
++
++start_service() {
++ config_load "${NAME}"
++ config_foreach kismet_server_instance
++}
++
++stop_service() {
++ service_stop "${PROG}"
++}
+diff --git a/feeds/packages/net/kismet/patches/010-dont-add-host-include-paths.patch b/feeds/packages/net/kismet/patches/010-dont-add-host-include-paths.patch
+new file mode 100644
+index 0000000..3b1858a
+--- /dev/null
++++ b/feeds/packages/net/kismet/patches/010-dont-add-host-include-paths.patch
+@@ -0,0 +1,12 @@
++--- a/configure
+++++ b/configure
++@@ -5456,9 +5456,6 @@ fi
++
++
++
++-# Add additional cflags since some distros bury panel.h
++-CPPFLAGS="$CPPFLAGS -I/usr/include/ncurses"
++-
++ termcontrol="none";
++
++ if test "$wantclient" = "yes"; then
+diff --git a/feeds/packages/net/kismet/patches/020-musl-include-fixes.patch b/feeds/packages/net/kismet/patches/020-musl-include-fixes.patch
+new file mode 100644
+index 0000000..7f2d52c
+--- /dev/null
++++ b/feeds/packages/net/kismet/patches/020-musl-include-fixes.patch
+@@ -0,0 +1,22 @@
++--- a/configfile.cc
+++++ b/configfile.cc
++@@ -24,6 +24,7 @@
++ #include <stdlib.h>
++ #include <stdio.h>
++ #include <errno.h>
+++#include <time.h>
++ #include "configfile.h"
++ #include "util.h"
++
++--- a/dumpfile_tuntap.cc
+++++ b/dumpfile_tuntap.cc
++@@ -20,8 +20,8 @@
++
++ #include <errno.h>
++
++-#include "dumpfile_tuntap.h"
++ #include "ifcontrol.h"
+++#include "dumpfile_tuntap.h"
++ #include "ipc_remote.h"
++
++ #ifndef SYS_CYGWIN
+diff --git a/feeds/packages/net/knot/Makefile b/feeds/packages/net/knot/Makefile
+new file mode 100644
+index 0000000..a245d67
+--- /dev/null
++++ b/feeds/packages/net/knot/Makefile
+@@ -0,0 +1,194 @@
++#
++# Copyright (C) 2014-2015 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=knot
++PKG_VERSION:=1.6.5
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://secure.nic.cz/files/knot-dns/
++PKG_MD5SUM:=934b6feaeefd0df7b3be6709e39b19ce
++
++PKG_MAINTAINER:=Daniel Salzman <daniel.salzman@nic.cz>
++PKG_LICENSE:=GPL-2.0+
++
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/knot/Default
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Knot DNS
++ URL:=https://www.knot-dns.cz
++ SUBMENU:=IP Addresses and Names
++ DEPENDS:=+libopenssl +liburcu
++endef
++
++define Package/knot-libknot
++ $(call Package/knot/Default)
++ TITLE+= (library)
++endef
++
++define Package/knot
++ $(call Package/knot/Default)
++ TITLE+= (server)
++ DEPENDS+=+knot-libknot
++endef
++
++define Package/knot-dig
++ $(call Package/knot/Default)
++ TITLE+= lookup utility
++ DEPENDS+=+knot-libknot
++endef
++
++define Package/knot-host
++ $(call Package/knot/Default)
++ TITLE+= simple DNS lookup utility
++ DEPENDS+=+knot-libknot
++endef
++
++define Package/knot-nsec3hash
++ $(call Package/knot/Default)
++ TITLE+= simple NSEC3 hash utility
++ DEPENDS+=+knot-libknot
++endef
++
++define Package/knot-nsupdate
++ $(call Package/knot/Default)
++ TITLE+= dynamic DNS update utility
++ DEPENDS+=+knot-libknot
++endef
++
++define Package/knot-tests
++ $(call Package/knot/Default)
++ TITLE+= (tests)
++ DEPENDS+=+knot-libknot
++endef
++
++define Package/knot-libknot/description
++ Knot DNS library.
++endef
++
++define Package/knot/description
++ High-performance authoritative-only DNS server.
++endef
++
++define Package/knot-dig/description
++ Knot DNS lookup utility.
++endef
++
++define Package/knot-host/description
++ Knot DNS simple DNS lookup utility.
++endef
++
++define Package/knot-nsec3hash/description
++ Knot DNS simple utility to compute NSEC3 hash.
++endef
++
++define Package/knot-nsupdate/description
++ Knot DNS dynamic DNS update utility.
++endef
++
++define Package/knot-tests/description
++ Unit tests for Knot DNS server.
++ Usage: /usr/share/knot/runtests.sh
++endef
++
++define Package/knot/conffiles
++/etc/knot/knot.conf
++endef
++
++CONFIGURE_ARGS += \
++ --enable-recvmmsg=no \
++ --disable-fastparser \
++ --without-libidn \
++ --with-rundir=/var/run \
++ --with-storage=/etc/knot
++
++TARGET_CFLAGS += -std=gnu99 -DPSELECT_COMPAT
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)
++ $(MAKE) -C $(PKG_BUILD_DIR)/libtap check
++ $(MAKE) -C $(PKG_BUILD_DIR)/tests check-compile-only
++ $(MAKE) -C $(PKG_BUILD_DIR)/src/zscanner check-compile-only
++endef
++
++define Package/knot-libknot/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libknot.so.* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libzscanner.so.* $(1)/usr/lib/
++endef
++
++define Package/knot/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/knotc $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/knotd $(1)/usr/sbin/
++
++ $(INSTALL_DIR) $(1)/etc/knot
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/knot/knot.sample.conf $(1)/etc/knot/knot.conf
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/knot/example.com.zone $(1)/etc/knot/
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/knotd.init $(1)/etc/init.d/knotd
++endef
++
++define Package/knot-dig/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/kdig $(1)/usr/bin/
++endef
++
++define Package/knot-host/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/khost $(1)/usr/bin/
++endef
++
++define Package/knot-nsec3hash/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/knsec3hash $(1)/usr/bin/
++endef
++
++define Package/knot-nsupdate/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/knsupdate $(1)/usr/bin/
++endef
++
++define Package/knot-tests/install
++ $(INSTALL_DIR) $(1)/usr/share/knot
++ $(INSTALL_BIN) ./files/runtests.sh $(1)/usr/share/knot/
++
++ $(INSTALL_DIR) $(1)/usr/share/knot/tap
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/libtap/runtests $(1)/usr/share/knot/tap/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/libtap/tap/libtap.sh $(1)/usr/share/knot/tap/
++
++ $(INSTALL_DIR) $(1)/usr/share/knot/tests
++ find $(PKG_BUILD_DIR)/tests/.libs -maxdepth 1 -executable -type f | \
++ xargs -I{} basename {} | \
++ xargs -I{} $(INSTALL_BIN) -T $(PKG_BUILD_DIR)/tests/.libs/{} $(1)/usr/share/knot/tests/test_{}
++
++ $(INSTALL_DIR) $(1)/usr/share/knot/tests/data
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/tests/data/sample_conf $(1)/usr/share/knot/tests/data/
++
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/zscanner/tests/.libs/zscanner-tool $(1)/usr/share/knot/tests/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/zscanner/tests/unittests $(1)/usr/share/knot/tests/test_zscanner
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/zscanner/tests/TESTS $(1)/usr/share/knot/tests/
++ cp -a $(PKG_BUILD_DIR)/src/zscanner/tests/data $(1)/usr/share/knot/tests/
++endef
++
++$(eval $(call BuildPackage,knot-libknot))
++$(eval $(call BuildPackage,knot))
++$(eval $(call BuildPackage,knot-dig))
++$(eval $(call BuildPackage,knot-host))
++$(eval $(call BuildPackage,knot-nsec3hash))
++$(eval $(call BuildPackage,knot-nsupdate))
++$(eval $(call BuildPackage,knot-tests))
+diff --git a/feeds/packages/net/knot/files/knotd.init b/feeds/packages/net/knot/files/knotd.init
+new file mode 100644
+index 0000000..23d3bd5
+--- /dev/null
++++ b/feeds/packages/net/knot/files/knotd.init
+@@ -0,0 +1,45 @@
++#!/bin/sh /etc/rc.common
++START=70
++
++knot_bin="/usr/sbin/knotd"
++knot_ctl="/usr/sbin/knotc"
++config_file="/etc/knot/knot.conf"
++pid_file="/var/run/knot.pid"
++
++start() {
++ echo "Starting Knot DNS"
++
++ if [ -e $pid_file ]; then
++ echo " Already running with PID `cat $pid_file`"
++ return 1
++ fi
++
++ $knot_bin -c $config_file -d
++
++ if [ $? -ne 0 ]; then
++ echo " Failed to start"
++ fi
++}
++
++stop() {
++ echo "Stopping Knot DNS"
++
++ if [ -e $pid_file ]; then
++ kill `cat $pid_file`
++ rm -f $pid_file
++ else
++ echo " No PID file $pid_file"
++ return 1
++ fi
++}
++
++restart() {
++ stop
++ start
++}
++
++reload() {
++ echo "Reloading Knot DNS"
++
++ $knot_ctl -c $config_file reload
++}
+diff --git a/feeds/packages/net/knot/files/runtests.sh b/feeds/packages/net/knot/files/runtests.sh
+new file mode 100644
+index 0000000..10032cb
+--- /dev/null
++++ b/feeds/packages/net/knot/files/runtests.sh
+@@ -0,0 +1,9 @@
++#!/bin/sh
++
++cd `dirname "$0"`/tests
++../tap/runtests -b /tmp ./test_*
++
++ret=$?
++cd -
++
++return $ret
+diff --git a/feeds/packages/net/knot/patches/01_strptime_susv3.patch b/feeds/packages/net/knot/patches/01_strptime_susv3.patch
+new file mode 100644
+index 0000000..fc14b91
+--- /dev/null
++++ b/feeds/packages/net/knot/patches/01_strptime_susv3.patch
+@@ -0,0 +1,21 @@
++diff --git a/src/libknot/dnssec/key.c b/src/libknot/dnssec/key.c
++index 7dc0540..3e351bb 100644
++--- a/src/libknot/dnssec/key.c
+++++ b/src/libknot/dnssec/key.c
++@@ -260,7 +260,15 @@ static int key_param_time(const void *save_to, char *value)
++
++ struct tm parsed = { 0 };
++
++- if (!strptime(value, "%Y%m%d%H%M%S", &parsed)) {
+++ if (strlen(value) != 14) {
+++ return KNOT_EINVAL;
+++ }
+++
+++ char *v = value;
+++ char buf[32] = "";
+++ int ret = sprintf(buf, "%.4s %.2s %.2s %.2s %.2s %.2s",
+++ v, v + 4, v + 6, v + 8, v + 10, v + 12);
+++ if (ret != 19 || !strptime(buf, "%Y %m %d %H %M %S", &parsed)) {
++ return KNOT_EINVAL;
++ }
++
+diff --git a/feeds/packages/net/knot/patches/02_knot.conf.patch b/feeds/packages/net/knot/patches/02_knot.conf.patch
+new file mode 100644
+index 0000000..f82af0c
+--- /dev/null
++++ b/feeds/packages/net/knot/patches/02_knot.conf.patch
+@@ -0,0 +1,28 @@
++diff --git a/samples/knot.sample.conf.in b/samples/knot.sample.conf.in
++index 956e8a9..a068e67 100644
++--- a/samples/knot.sample.conf.in
+++++ b/samples/knot.sample.conf.in
++@@ -14,7 +14,7 @@ system {
++
++ # User for running server
++ # May also specify user.group (e.g. knot.knot)
++- user knot.knot;
+++ user root.root;
++
++ # Directory for storing run-time data
++ # e.g. PID file and control sockets
++@@ -63,11 +63,11 @@ zones {
++ # storage "@storage_dir@";
++ #
++ # Example master zone
++-# example.com {
++-# file "@config_dir@/example.com.zone";
+++ example.com {
+++ file "example.com.zone";
++ # xfr-out slave0;
++ # notify-out slave0;
++-# }
+++ }
++ #
++ # Example slave zone
++ # example.net {
+diff --git a/feeds/packages/net/knot/patches/03_zscanner_tests.patch b/feeds/packages/net/knot/patches/03_zscanner_tests.patch
+new file mode 100644
+index 0000000..a0d0524
+--- /dev/null
++++ b/feeds/packages/net/knot/patches/03_zscanner_tests.patch
+@@ -0,0 +1,41 @@
++diff --git a/src/zscanner/tests/TESTS b/src/zscanner/tests/TESTS
++index c88aef1..4e2148f 100644
++--- a/src/zscanner/tests/TESTS
+++++ b/src/zscanner/tests/TESTS
++@@ -18,10 +18,8 @@
++ 05-2_TTL
++ 05-3_TTL
++ 05-4_TTL
++-06-0_INCLUDE
++ 06-1_INCLUDE
++ 06-2_INCLUDE
++-06-3_INCLUDE
++ 06-4_INCLUDE
++ 06-5_INCLUDE
++ 06-6_INCLUDE
++diff --git a/src/zscanner/tests/unittests.in b/src/zscanner/tests/unittests.in
++index 846f351..272856c 100644
++--- a/src/zscanner/tests/unittests.in
+++++ b/src/zscanner/tests/unittests.in
++@@ -1,9 +1,9 @@
++ #!/bin/sh
++
++-SOURCE=@top_srcdir@/src/zscanner/tests
++-BUILD=@top_builddir@/src/zscanner/tests
+++SOURCE="."
+++BUILD="."
++
++-. @top_srcdir@/libtap/tap/libtap.sh
+++. ../tap/libtap.sh
++
++ cd "$BUILD"
++
++@@ -11,7 +11,7 @@ TMPDIR=$(test_tmpdir)
++ TESTS_DIR="$SOURCE"/data
++ ZSCANNER_TOOL="$BUILD"/zscanner-tool
++
++-plan 71
+++plan 69
++
++ mkdir -p "$TMPDIR"/includes/
++ for a in 1 2 3 4 5 6; do
+diff --git a/feeds/packages/net/knxd/Makefile b/feeds/packages/net/knxd/Makefile
+new file mode 100644
+index 0000000..e0a6cd5
+--- /dev/null
++++ b/feeds/packages/net/knxd/Makefile
+@@ -0,0 +1,103 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++### Remarks
++### 'python pascal ruby lua' need to be deleted in src/clients/Makefile.am
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=knxd
++PKG_VERSION=2015-07-19-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/knxd/knxd.git
++PKG_SOURCE_VERSION:=be1fcfe85cc1dfcc41f791cd9a45c57fe18da6a0
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_MAINTAINER:=Othmar Truniger <github@truniger.ch>
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_PARALLEL:=1
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
++PKG_BUILD_DEPENDS:=argp-standalone
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/knxd
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=EIB KNX daemon
++ DEPENDS:=+pthsem +libusb-1.0
++endef
++
++define Package/knxd/description
++EIB KNX Daemon
++endef
++
++define Package/knxd/conffiles
++/etc/config/knxd
++endef
++
++define Package/knxd-tools
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=EIB KNX Utils
++endef
++
++define Package/knxd-tools/description
++EIB KNX Tools
++endef
++
++TARGET_CXXFLAGS+= -fno-rtti
++TARGET_CXX=$(TARGET_CC)
++
++CONFIGURE_ARGS+= \
++ --disable-ft12 \
++ --enable-eibnetip \
++ --enable-eibnetiptunnel \
++ --enable-eibnetipserver \
++ --enable-usb \
++ --enable-tpuarts \
++ --disable-pei16s \
++ --enable-groupcache \
++ --without-pth-test \
++ --disable-systemd \
++ --without-libstdc
++
++EXTRA_LDFLAGS+= \
++ -fno-builtin -largp
++
++define Package/knxd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++ $(RM) $(1)/usr/bin/knxtool
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/knxd.init $(1)/etc/init.d/knxd
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/knxd.config $(1)/etc/config/knxd
++endef
++
++define Package/knxd-tools/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libeibclient.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/knxtool $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/knxd/eibwrite-cgi $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/knxd/eibread-cgi $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,knxd))
++$(eval $(call BuildPackage,knxd-tools))
+diff --git a/feeds/packages/net/knxd/files/knxd.config b/feeds/packages/net/knxd/files/knxd.config
+new file mode 100644
+index 0000000..cd86a62
+--- /dev/null
++++ b/feeds/packages/net/knxd/files/knxd.config
+@@ -0,0 +1,12 @@
++config daemon args
++ # daemon is started as 'knxd $options $url'
++ # use 'knxd --help' to get all possible options'
++ #
++ # typical example for options for tunnel mode
++ option options '-D -T -S -d/tmp/knxd.log -i -p/var/run/knxd.pid'
++ # add '-t1023' or '--trace=1023' for full log trace
++
++ # example with tpuarts interface
++ # option url 'tpuarts:/dev/ttyAMA0'
++ # example with IP interface in tunnel mode
++ option url 'ipt:192.168.1.20'
+diff --git a/feeds/packages/net/knxd/files/knxd.init b/feeds/packages/net/knxd/files/knxd.init
+new file mode 100644
+index 0000000..026e4cf
+--- /dev/null
++++ b/feeds/packages/net/knxd/files/knxd.init
+@@ -0,0 +1,19 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006 OpenWrt.org
++
++START=98
++STOP=20
++NAME=knxd
++PROG=/usr/bin/$NAME
++
++start() {
++ local options url
++ config_load "$NAME"
++ config_get options args options ''
++ config_get url args url
++ service_start $PROG $options $url
++}
++
++stop() {
++ service_stop $PROG
++}
+diff --git a/feeds/packages/net/knxd/patches/0099-openwrt.patch b/feeds/packages/net/knxd/patches/0099-openwrt.patch
+new file mode 100644
+index 0000000..f7e33ed
+--- /dev/null
++++ b/feeds/packages/net/knxd/patches/0099-openwrt.patch
+@@ -0,0 +1,8 @@
++--- a/src/client/Makefile.am 2014-12-21 20:17:14.000000000 +0100
+++++ b/src/client/Makefile.am 2014-12-21 20:18:50.639995000 +0100
++@@ -4,5 +4,5 @@
++ BUILDJAVA =
++ endif
++
++-SUBDIRS=def c $(BUILDJAVA) php perl cs python pascal ruby lua .
+++SUBDIRS=def c $(BUILDJAVA) php perl cs .
+diff --git a/feeds/packages/net/kplex/Makefile b/feeds/packages/net/kplex/Makefile
+new file mode 100644
+index 0000000..5fac1fa
+--- /dev/null
++++ b/feeds/packages/net/kplex/Makefile
+@@ -0,0 +1,52 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=kplex
++PKG_VERSION:=20150809
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/stripydog/kplex.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=fec47cd1877ec7903969adefa4220838a706d940
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/kplex
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=NMEA-0183 multiplexer and router
++ DEPENDS:=+libpthread
++ URL:=http://www.stripydog.com/kplex/
++endef
++
++define Package/kplex/description
++ Kplex is a program for combining and routing NMEA-0183 data to and from multiple
++ sources and destinations. kplex inputs and outputs may be any of Serial lines,
++ Pseudo Terminals (ptys), Network Interfaces and Files.
++endef
++
++define Package/kplex/conffiles
++/etc/kplex.conf
++endef
++
++define Package/kplex/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/kplex $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/kplex.init $(1)/etc/init.d/kplex
++endef
++
++$(eval $(call BuildPackage,kplex))
+diff --git a/feeds/packages/net/kplex/files/kplex.init b/feeds/packages/net/kplex/files/kplex.init
+new file mode 100644
+index 0000000..8e48041
+--- /dev/null
++++ b/feeds/packages/net/kplex/files/kplex.init
+@@ -0,0 +1,19 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=99
++
++USE_PROCD=1
++PROG=/usr/bin/kplex
++
++CONF_FILE=/etc/kplex.conf
++
++start_service() {
++ [ -e "$CONF_FILE" ] || return 1
++
++ procd_open_instance
++ procd_set_param command "$PROG" -f "$CONF_FILE"
++ procd_set_param respawn
++ procd_set_param file "$CONF_FILE"
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/krb5/Makefile b/feeds/packages/net/krb5/Makefile
+new file mode 100644
+index 0000000..c9c84de
+--- /dev/null
++++ b/feeds/packages/net/krb5/Makefile
+@@ -0,0 +1,138 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=krb5
++PKG_VERSION:=1.13.2
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=NOTICE
++
++PKG_SOURCE:=krb5-$(PKG_VERSION)-signed.tar
++PKG_SOURCE_URL:=http://web.mit.edu/kerberos/dist/krb5/1.13/
++PKG_MD5SUM:=f7ebfa6c99c10b16979ebf9a98343189
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++PKG_CHECK_FORMAT_SECURITY:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++MAKE_PATH:=src
++
++define Package/krb5/Default
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Kerberos
++ URL:=http://web.mit.edu/kerberos/
++endef
++
++define Package/krb5-libs
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Kerberos
++ DEPENDS:=+libncurses
++ TITLE:=Kerberos 5 Shared Libraries
++ URL:=http://web.mit.edu/kerberos/
++endef
++
++define Package/krb5-server
++ $(call Package/krb5/Default)
++ DEPENDS:=+krb5-libs +libpthread
++ TITLE:=Kerberos 5 Server
++endef
++
++define Package/krb5-client
++ $(call Package/krb5/Default)
++ DEPENDS:=+krb5-libs
++ TITLE:=Kerberos 5 Client
++endef
++
++define Package/krb5/description
++ Kerberos
++endef
++
++define Build/Prepare
++ # Krb5 tarball contains signature and a second tarball
++ # containing source code.
++ tar xf "$(DL_DIR)/$(PKG_SOURCE)" -C "$(BUILD_DIR)"
++ tar xzf "$(BUILD_DIR)/krb5-$(PKG_VERSION).tar.gz" -C "$(BUILD_DIR)"
++ patch -p1 -d "$(PKG_BUILD_DIR)" < "$(PATCH_DIR)/001-fix-build.patch"
++endef
++
++CONFIGURE_PATH = ./src
++
++CONFIGURE_VARS += \
++ cross_compiling=yes \
++ krb5_cv_attr_constructor_destructor=yes,yes \
++ ac_cv_func_regcomp=yes \
++ ac_cv_printf_positional=yes \
++ ac_cv_file__etc_environment=no \
++ ac_cv_file__etc_TIMEZONE=no
++
++CONFIGURE_ARGS += \
++ --without-system-verto \
++ --without-tcl \
++ --without-libedit \
++ --localstatedir=/etc
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include \
++ $(1)/usr/include/krb5
++ $(INSTALL_DIR) $(1)/usr
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib \
++ $(1)/usr
++ rm -f $(1)/usr/lib/libcom_err*
++endef
++
++define Package/krb5-libs/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/lib/krb5
++ $(INSTALL_DIR) $(1)/usr/lib/krb5/plugins
++ $(INSTALL_DIR) $(1)/usr/lib/krb5/plugins/kdb
++ $(INSTALL_DIR) $(1)/usr/lib/krb5/plugins/libkrb5
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/krb5/plugins/kdb/db2.so $(1)/usr/lib/krb5/plugins/kdb
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib
++endef
++
++define Package/krb5-client/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/kdestroy $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/kinit $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/klist $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/kpasswd $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ksu $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/kvno $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/krb5-send-pr $(1)/usr/sbin
++endef
++
++# Removed some server-side software to reduce package size. This should be
++# put in a separate package if needed.
++define Package/krb5-server/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/krb5kdc $(1)/etc/init.d/krb5kdc
++# $(INSTALL_DIR) $(1)/usr/bin
++# $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sclient $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/kadmin.local $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/kadmind $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/kdb5_util $(1)/usr/sbin
++# $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/kprop $(1)/usr/sbin
++# $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/kpropd $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/krb5kdc $(1)/usr/sbin
++# $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/sim_server $(1)/usr/sbin
++endef
++
++$(eval $(call BuildPackage,krb5-libs))
++$(eval $(call BuildPackage,krb5-server))
++$(eval $(call BuildPackage,krb5-client))
+diff --git a/feeds/packages/net/krb5/files/krb5kdc b/feeds/packages/net/krb5/files/krb5kdc
+new file mode 100644
+index 0000000..dec7188
+--- /dev/null
++++ b/feeds/packages/net/krb5/files/krb5kdc
+@@ -0,0 +1,19 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009 OpenWrt.org
++
++START=60
++
++start() {
++ mkdir -p /var/tmp
++ mkdir -p /etc/krb5kdc
++
++ [ -f /etc/krb5kdc/principal ] || ( echo; echo ) | kdb5_util create -s
++
++ /usr/sbin/krb5kdc
++ /usr/sbin/kadmind
++}
++
++stop() {
++ killall krb5kdc 2> /dev/null
++ killall kadmind 2> /dev/null
++}
+diff --git a/feeds/packages/net/krb5/patches/001-fix-build.patch b/feeds/packages/net/krb5/patches/001-fix-build.patch
+new file mode 100644
+index 0000000..2801fd3
+--- /dev/null
++++ b/feeds/packages/net/krb5/patches/001-fix-build.patch
+@@ -0,0 +1,45 @@
++diff -u --recursive krb5-1.13.1-vanilla/src/lib/krad/packet.c krb5-1.13.1/src/lib/krad/packet.c
++--- krb5-1.13.1-vanilla/src/lib/krad/packet.c 2015-02-22 10:08:38.213087138 -0500
+++++ krb5-1.13.1/src/lib/krad/packet.c 2015-02-22 10:13:25.223709951 -0500
++@@ -253,7 +253,7 @@
++ {
++ krb5_error_code retval;
++ krad_packet *pkt;
++- uchar id;
+++ uchar id = 0;
++ size_t attrset_len;
++
++ pkt = packet_new();
++diff -u --recursive krb5-1.13.1-vanilla/src/lib/krb5/ccache/cc_file.c krb5-1.13.1/src/lib/krb5/ccache/cc_file.c
++--- krb5-1.13.1-vanilla/src/lib/krb5/ccache/cc_file.c 2015-02-22 10:08:38.211087133 -0500
+++++ krb5-1.13.1/src/lib/krb5/ccache/cc_file.c 2015-02-22 10:14:15.410819464 -0500
++@@ -401,7 +401,7 @@
++ {
++ krb5_error_code ret;
++ struct k5buf buf;
++- size_t maxsize;
+++ size_t maxsize = 0;
++
++ *princ = NULL;
++ k5_cc_mutex_assert_locked(context, &((fcc_data *)id->data)->lock);
++@@ -1088,7 +1088,7 @@
++ krb5_fcc_cursor *fcursor = *cursor;
++ fcc_data *data = id->data;
++ struct k5buf buf;
++- size_t maxsize;
+++ size_t maxsize = 0;
++
++ memset(creds, 0, sizeof(*creds));
++ k5_cc_mutex_lock(context, &data->lock);
++diff -u --recursive krb5-1.13.1-vanilla/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c krb5-1.13.1/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
++--- krb5-1.13.1-vanilla/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c 2015-02-22 10:08:38.190087088 -0500
+++++ krb5-1.13.1/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c 2015-02-22 10:17:37.981263250 -0500
++@@ -3593,7 +3593,7 @@
++ {
++ CK_ULONG i, r;
++ unsigned char *cp;
++- size_t label_len;
+++ size_t label_len = 0;
++ CK_ULONG count = 0;
++ CK_SLOT_ID_PTR slotlist;
++ CK_TOKEN_INFO tinfo;
+diff --git a/feeds/packages/net/l7-protocols/Makefile b/feeds/packages/net/l7-protocols/Makefile
+new file mode 100644
+index 0000000..0258216
+--- /dev/null
++++ b/feeds/packages/net/l7-protocols/Makefile
+@@ -0,0 +1,87 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=l7-protocols
++PKG_VERSION:=2009-05-28
++PKG_RELEASE:=2
++PKG_LICENSE:=GPL-2.0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/l7-filter
++PKG_MD5SUM:=91be154d12134dcdbc560cc7aa7fe4ce
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/l7-protocols
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Protocols for layer7 filtering
++ URL:=http://l7-filter.sourceforge.net/
++ SUBMENU:=Firewall
++ MAINTAINER:=Lim Guo Wei <limguowei@gmail.com>
++ DEPENDS:=iptables-mod-filter
++endef
++
++define Package/l7-protocols/description
++ l7-filter classifies packets based on patterns in application
++ layer data. This allows correct classification of P2P traffic that
++ uses unpredictable ports as well as standard protocols running on
++ non-standard ports.
++endef
++
++define Package/l7-protocols-testing
++ $(call Package/l7-protocols)
++ TITLE:=testing utilities for layer7
++ DEPENDS+=l7-protocols $(CXX_DEPENDS)
++endef
++
++define Package/l7-protocols-testing/description
++ testing utilities for layer 7 patterns
++endef
++
++define Build/Configure
++endef
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_l7-protocols-testing),)
++ define Build/Compile
++ cd $(PKG_BUILD_DIR)/testing && $(MAKE) $(CONFIGURE_VARS)
++ endef
++else
++ define Build/Compile
++ endef
++endif
++
++define Package/l7-protocols/install
++ find $(PKG_BUILD_DIR) -name "README" -delete
++ $(INSTALL_DIR) $(1)/etc/l7-protocols
++ $(CP) $(PKG_BUILD_DIR)/extra \
++ $(PKG_BUILD_DIR)/file_types \
++ $(PKG_BUILD_DIR)/groups.sh \
++ $(PKG_BUILD_DIR)/malware \
++ $(PKG_BUILD_DIR)/protocols \
++ $(1)/etc/l7-protocols
++endef
++
++define Package/l7-protocols-testing/install
++ $(INSTALL_DIR) $(1)/etc/l7-protocols/testing
++ $(CP) $(PKG_BUILD_DIR)/testing/data \
++ $(1)/etc/l7-protocols/testing
++ $(INSTALL_BIN) \
++ $(PKG_BUILD_DIR)/testing/rand{chars,printable} \
++ $(PKG_BUILD_DIR)/testing/test_speed-{kernel,userspace} \
++ $(PKG_BUILD_DIR)/testing/match_kernel \
++ $(PKG_BUILD_DIR)/testing/doallspeeds.sh \
++ $(PKG_BUILD_DIR)/testing/test_match.sh \
++ $(PKG_BUILD_DIR)/testing/timeit.sh \
++ $(1)/etc/l7-protocols/testing
++endef
++
++$(eval $(call BuildPackage,l7-protocols))
++$(eval $(call BuildPackage,l7-protocols-testing))
+diff --git a/feeds/packages/net/l7-protocols/patches/100-testing_crosscompile.patch b/feeds/packages/net/l7-protocols/patches/100-testing_crosscompile.patch
+new file mode 100644
+index 0000000..b5d3953
+--- /dev/null
++++ b/feeds/packages/net/l7-protocols/patches/100-testing_crosscompile.patch
+@@ -0,0 +1,27 @@
++--- a/testing/Makefile
+++++ b/testing/Makefile
++@@ -1,19 +1,19 @@
++ all: randchars randprintable test_speed-kernel test_speed-userspace match_kernel
++
++ randchars: randchars.c
++- gcc -O2 -o randchars randchars.c
+++ $(CC) $(CFLAGS) -o randchars randchars.c
++
++ randprintable: randprintable.c
++- gcc -O2 -o randprintable randprintable.c
+++ $(CC) $(CFLAGS) -o randprintable randprintable.c
++
++ test_speed-kernel: test_speed-kernel.c
++- gcc -o test_speed-kernel test_speed-kernel.c
+++ $(CC) $(CFLAGS) -o test_speed-kernel test_speed-kernel.c
++
++ test_speed-userspace: test_speed-userspace.cpp l7-parse-patterns.cpp l7-parse-patterns.h
++- g++ -Wall -o test_speed-userspace test_speed-userspace.cpp l7-parse-patterns.cpp
+++ $(CXX) $(CXXFLAGS) -Wall -o test_speed-userspace test_speed-userspace.cpp l7-parse-patterns.cpp
++
++ match_kernel: match-kernel.c
++- gcc -O2 -o match_kernel match-kernel.c
+++ $(CC) $(CFLAGS) -o match_kernel match-kernel.c
++
++ clean:
++ rm -f randprintable randchars test_speed-kernel test_speed-userspace match_kernel
+diff --git a/feeds/packages/net/l7-protocols/patches/101-testing-timeit.patch b/feeds/packages/net/l7-protocols/patches/101-testing-timeit.patch
+new file mode 100644
+index 0000000..6656889
+--- /dev/null
++++ b/feeds/packages/net/l7-protocols/patches/101-testing-timeit.patch
+@@ -0,0 +1,102 @@
++--- a/testing/timeit.sh
+++++ b/testing/timeit.sh
++@@ -1,11 +1,8 @@
++ #!/bin/bash
++
++-# "man 1 time" for details
++-export TIME="%U seconds"
++-
++ add()
++ {
++- if ! dc -e ""; then
+++ if ! dc p >/dev/null 2>&1; then
++ echo you do not have dc, so I cannot add these numbers...
++ exit 1
++ fi
++@@ -14,7 +11,7 @@ add()
++ tot=0
++
++ while read n; do
++- tot=`dc -e "$n $tot + pop" 2> /dev/null`
+++ tot=`dc $n $tot + p 2> /dev/null`
++ done
++
++ echo $tot seconds
++@@ -34,7 +31,7 @@ extract()
++
++ if [ ! $3 ] || [ $2 == "-h" ] || [ $2 == "--help" ]; then
++ echo
++- echo Syntax: ./timeit.sh patternfile kernel\|userspace all\|print\|real [data_files]
+++ echo Syntax: .//usr/bin/timeit.sh patternfile kernel\|userspace all\|print\|real [data_files]
++ echo
++ echo \"kernel\" uses the kernel pattern and library
++ echo \"userspace\" uses userspace pattern and library
++@@ -72,12 +69,12 @@ echo Timing $1
++ if [ $3 == "all" ]; then
++ echo Using all characters
++ if [ $2 == "kernel" ]; then
++- if ! ./randchars | time $speedprog "`extract $1`" verbose; then
+++ if ! ./randchars | /usr/bin/time $speedprog "`extract $1`" verbose 2>&1 >/dev/null | grep user | cut -d\ -f2; then
++ echo $speedprog failed. > /dev/stderr
++ exit 1
++ fi
++ else
++- if ! ./randchars | time $speedprog -f "$1" -v; then
+++ if ! ./randchars | /usr/bin/time $speedprog -f "$1" -v 2>&1 >/dev/null | grep user | cut -d\ -f2; then
++ echo $speedprog failed. > /dev/stderr
++ exit 1
++ fi
++@@ -85,12 +82,12 @@ if [ $3 == "all" ]; then
++ elif [ $3 == "print" ]; then
++ echo Using only printable characters
++ if [ $2 == "kernel" ]; then
++- if ! ./randprintable | time $speedprog "`extract $1`" verbose; then
+++ if ! ./randprintable | /usr/bin/time $speedprog "`extract $1`" verbose 2>&1 >/dev/null | grep user | cut -d\ -f2; then
++ echo $speedprog failed. > /dev/stderr
++ exit 1
++ fi
++ else
++- if ! ./randprintable | time $speedprog -f "$1" -v; then
+++ if ! ./randprintable | /usr/bin/time $speedprog -f "$1" -v 2>&1 >/dev/null | grep user | cut -d\ -f2; then
++ echo $speedprog failed. > /dev/stderr
++ exit 1
++ fi
++@@ -107,12 +104,12 @@ elif [ $3 == "real" ]; then
++ printf $f\\t
++ #echo `extract $1`
++ if [ $2 == "kernel" ]; then
++- if ! cat $f | time $speedprog "`extract $1`" 2> /dev/stdout | tee -a tmp.$$; then
+++ if ! cat $f | /usr/bin/time $speedprog "`extract $1`" 2>&1 >/dev/null | grep user | cut -d\ -f2 | tee -a tmp.$$; then
++ echo $speedprog failed. > /dev/stderr
++ exit 1
++ fi
++ else
++- if ! cat $f | time $speedprog -f "$1" 2> /dev/stdout | tee -a tmp.$$; then
+++ if ! cat $f | /usr/bin/time $speedprog -f "$1" 2>&1 >/dev/null | grep user | cut -d\ -f2 | tee -a tmp.$$; then
++ echo $speedprog failed. > /dev/stderr
++ exit 1
++ fi
++@@ -123,12 +120,12 @@ elif [ $3 == "real" ]; then
++ for f in data/*; do
++ printf $f\\t
++ if [ $2 == "kernel" ]; then
++- if ! cat $f | time $speedprog "`extract $1`" 2> /dev/stdout | tee -a tmp.$$; then
+++ if ! cat $f | /usr/bin/time $speedprog "`extract $1`" 2>&1 >/dev/null | grep user | cut -d\ -f2 | tee -a tmp.$$; then
++ echo $speedprog failed. > /dev/stderr
++ exit 1
++ fi
++ else
++- if ! cat $f | time $speedprog -f "$1" 2> /dev/stdout | tee -a tmp.$$; then
+++ if ! cat $f | /usr/bin/time $speedprog -f "$1" 2>&1 >/dev/null | grep user | cut -d\ -f2 | tee -a tmp.$$; then
++ echo $speedprog failed. > /dev/stderr
++ exit 1
++ fi
++@@ -137,7 +134,7 @@ elif [ $3 == "real" ]; then
++ fi
++
++ printf Total:\
++- cat tmp.$$ | cut -d\ -f 2 | add
+++ cat tmp.$$ | cut -ds -f 1| add
++
++ rm tmp.$$
++ else
+diff --git a/feeds/packages/net/l7-protocols/patches/102-testing-doallspeeds.patch b/feeds/packages/net/l7-protocols/patches/102-testing-doallspeeds.patch
+new file mode 100644
+index 0000000..850a1d6
+--- /dev/null
++++ b/feeds/packages/net/l7-protocols/patches/102-testing-doallspeeds.patch
+@@ -0,0 +1,16 @@
++--- a/testing/doallspeeds.sh
+++++ b/testing/doallspeeds.sh
++@@ -25,11 +25,11 @@ for f in ../*/*.pat; do
++ printf `basename $f .pat`
++
++ if [ $userspace ]; then
++- gtime=`./timeit.sh $f userspace real | grep Total | cut -d\ -f 2`
+++ gtime=`./timeit.sh $f userspace real | grep Total | cut -d\ -f 2 | awk '{print $1}'`
++ printf \\t$gtime
++ fi
++ if [ $kernel ]; then
++- htime=`./timeit.sh $f kernel real | grep Total | cut -d\ -f 2`
+++ htime=`./timeit.sh $f kernel real | grep Total | cut -d\ -f 2 | awk '{print $1}'`
++ printf \\t$htime
++ fi
++ printf \\n
+diff --git a/feeds/packages/net/lftp/Makefile b/feeds/packages/net/lftp/Makefile
+new file mode 100644
+index 0000000..01ea998
+--- /dev/null
++++ b/feeds/packages/net/lftp/Makefile
+@@ -0,0 +1,78 @@
++#
++# Copyright (C) 2008-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lftp
++PKG_VERSION:=4.6.2
++PKG_RELEASE:=1
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://lftp.yar.ru/ftp \
++ http://lftp.yar.ru/ftp/old \
++ http://lftp.cybermirror.org \
++ http://lftp.cybermirror.org/old
++PKG_MD5SUM:=487c064ee1bd732e5f95928e530435a8
++
++
++
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lftp
++ SUBMENU:=File Transfer
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libncurses +libopenssl +libreadline $(CXX_DEPENDS) +libexpat
++ TITLE:=a sophisticated file transfer program with command line interface.
++ MAINTAINER:=Federico Di Marco <fededim@gmail.com>
++ URL:=http://lftp.yar.ru/
++endef
++
++define Package/lftp/description
++LFTP is a sophisticated file transfer program with command line interface. It supports FTP, HTTP, FISH, SFTP, HTTPS and FTPS protocols. GNU Readline library is used for input.
++Every operation in lftp is reliable, that is any non-fatal error is handled and the operation is retried automatically. So if downloading breaks, it will be restarted from the point automatically. Even if ftp server does not support REST command, lftp will try to retrieve the file from the very beginning until the file is transferred completely. This is useful for dynamic-ip machines which change their IP addresses quite often, and for sites with very bad internet connectivity.
++
++If you exit lftp when some jobs are not finished yet, lftp will move itself to nohup mode in background. The same happens when you have a real modem hangup or when you close an xterm.
++
++lftp has shell-like command syntax allowing you to launch several commands in parallel in background (&). It is also possible to group commands within () and execute them in background. All background jobs are executed in the same single process. You can bring a foreground job to background with ^Z (c-z) and back with command `wait' (or `fg' which is alias to `wait'). To list running jobs, use command `jobs'. Some commands allow redirecting their output (cat, ls, ...) to file or via pipe to external command. Commands can be executed conditionally based on termination status of previous command (&&, ||).
++
++lftp has builtin mirror which can download or update a whole directory tree. There is also reverse mirror (mirror -R) which uploads or updates a directory tree on server.
++
++There is command `at' to launch a job at specified time in current context, command `queue' to queue commands for sequential execution for current server, and much more.
++
++LFTP supports IPv6 for both FTP and HTTP protocols. For FTP protocol it uses method described in RFC2428.
++
++Other low level stuff supported: ftp proxy, http proxy, ftp over http, opie/skey, fxp transfers, socks.
++
++LFTP supports secure versions of the protocols FTP and HTTP: FTPS (explicit and implicit) and HTTPS. LFTP needs to be linked with an SSL library to support them. GNU TLS and OpenSSL are both supported as SSL backend.
++endef
++
++CONFIGURE_ARGS += \
++ --without-libiconv-prefix \
++ --without-libintl-prefix \
++ --without-gnutls \
++ --without-libidn \
++ --without-libresolv \
++ --with-openssl="$(STAGING_DIR)/usr" \
++ --disable-static
++
++#CONFIGURE_VARS += \
++# LIBS="-lz -lutil -lcurses -ldl" \
++# i_cv_posix_fallocate_works=no
++
++#MAKE_VARS += \
++# LD="$(TARGET_CXX)"
++
++define Package/lftp/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/lftp $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,lftp))
+diff --git a/feeds/packages/net/lighttpd/Makefile b/feeds/packages/net/lighttpd/Makefile
+new file mode 100644
+index 0000000..72eb7b6
+--- /dev/null
++++ b/feeds/packages/net/lighttpd/Makefile
+@@ -0,0 +1,187 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lighttpd
++PKG_VERSION:=1.4.37
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://download.lighttpd.net/lighttpd/releases-1.4.x
++PKG_MD5SUM:=ca40168f54b46ee29475868ced8507d6
++
++PKG_LICENSE:=BSD-3c
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lighttpd/Default
++ SUBMENU:=Web Servers/Proxies
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://www.lighttpd.net/
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++endef
++
++define Package/lighttpd
++ $(call Package/lighttpd/Default)
++ MENU:=1
++ DEPENDS:=+LIGHTTPD_SSL:libopenssl +libpcre +libpthread
++ TITLE:=A flexible and lightweight web server
++endef
++
++define Package/lighttpd/config
++config LIGHTTPD_SSL
++ bool "SSL support"
++ depends on PACKAGE_lighttpd
++ default y
++ help
++ Implements SSL support in lighttpd (using libopenssl). This
++ option is required if you enable the SSL engine in your
++ lighttpd confguration file.
++endef
++
++CONFIGURE_ARGS+= \
++ --libdir=/usr/lib/lighttpd \
++ --sysconfdir=/etc/lighttpd \
++ --enable-shared \
++ --enable-static \
++ --disable-rpath \
++ --without-attr \
++ --without-bzip2 \
++ --without-fam \
++ --without-gdbm \
++ --without-ldap \
++ --with-lua \
++ --without-memcache \
++ --with-pcre \
++ --without-valgrind \
++ $(call autoconf_bool,CONFIG_IPV6,ipv6)
++
++CONFIGURE_VARS+= \
++ PCRE_LIB="-lpcre" \
++
++ifneq ($(strip $(CONFIG_LIGHTTPD_SSL)),)
++ CONFIGURE_ARGS+= \
++ --with-openssl="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-openssl
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_lighttpd-mod-mysql-vhost),)
++ CONFIGURE_ARGS+= \
++ --with-mysql
++else
++ CONFIGURE_ARGS+= \
++ --without-mysql
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_lighttpd-mod-webdav),)
++ CONFIGURE_ARGS+= \
++ --with-webdav-locks \
++ --with-webdav-props
++ # XXX: needed by sqlite3 to prevent segfaults in mod_webdav.so
++ CONFIGURE_VARS+= \
++ LIBS="-lpthread"
++else
++ CONFIGURE_ARGS+= \
++ --without-webdav-locks \
++ --without-webdav-props
++endif
++
++define Build/Configure
++$(call Build/Configure/Default)
++ # XXX: override pcre (mis)detection by ./configure when cross-compiling
++ echo "#define HAVE_LIBPCRE 1" >>$(PKG_BUILD_DIR)/config.h
++ echo "#define HAVE_PCRE_H 1" >>$(PKG_BUILD_DIR)/config.h
++endef
++
++define Package/lighttpd/conffiles
++/etc/lighttpd/lighttpd.conf
++endef
++
++define Package/lighttpd/install
++ $(INSTALL_DIR) $(1)/etc/lighttpd
++ $(INSTALL_DATA) ./files/lighttpd.conf $(1)/etc/lighttpd/
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/doc/config/conf.d/mime.conf $(1)/etc/lighttpd/
++ $(INSTALL_DIR) $(1)/etc/lighttpd/conf.d
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/lighttpd.init $(1)/etc/init.d/lighttpd
++ $(INSTALL_DIR) $(1)/usr/lib/lighttpd
++ for m in dirlisting indexfile staticfile; do \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lighttpd/mod_$$$${m}.so $(1)/usr/lib/lighttpd/ ; \
++ done
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/lighttpd $(1)/usr/sbin/
++endef
++
++define BuildPlugin
++ define Package/lighttpd-mod-$(1)
++ $(call Package/lighttpd/Default)
++ DEPENDS:=lighttpd
++ ifneq ($(3),)
++ DEPENDS+= $(3)
++ endif
++ TITLE:=$(2) module
++ endef
++
++ define Package/lighttpd-mod-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/lighttpd
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lighttpd/mod_$(1).so $$(1)/usr/lib/lighttpd
++ $(INSTALL_DIR) $$(1)/etc/lighttpd/conf.d
++ if [ -f $(PKG_BUILD_DIR)/doc/config/conf.d/$(1).conf ]; then \
++ $(CP) $(PKG_BUILD_DIR)/doc/config/conf.d/$(1).conf $$(1)/etc/lighttpd/conf.d/$(4)-$(1).conf ; \
++ else \
++ echo 'server.modules += ( "mod_$(1)" )' > $$(1)/etc/lighttpd/conf.d/$(4)-$(1).conf ; \
++ fi
++ endef
++
++ $$(eval $$(call BuildPackage,lighttpd-mod-$(1)))
++endef
++
++$(eval $(call BuildPackage,lighttpd))
++
++# First, permit redirect from HTTP to HTTPS.
++$(eval $(call BuildPlugin,redirect,URL redirection,+PACKAGE_lighttpd-mod-redirect:libpcre,10))
++
++# Next, permit authentication.
++$(eval $(call BuildPlugin,auth,Authentication,,20))
++
++# Finally, everything else.
++$(eval $(call BuildPlugin,access,Access restrictions,,30))
++$(eval $(call BuildPlugin,accesslog,Access logging,,30))
++$(eval $(call BuildPlugin,alias,Directory alias,,30))
++$(eval $(call BuildPlugin,cgi,CGI,,30))
++$(eval $(call BuildPlugin,cml,Cache Meta Language,+liblua,30))
++$(eval $(call BuildPlugin,compress,Compress output,+PACKAGE_lighttpd-mod-compress:zlib,30))
++$(eval $(call BuildPlugin,evasive,Evasive,,30))
++$(eval $(call BuildPlugin,evhost,Exnhanced Virtual-Hosting,,30))
++$(eval $(call BuildPlugin,expire,Expire,,30))
++$(eval $(call BuildPlugin,extforward,Extract client,,30))
++$(eval $(call BuildPlugin,fastcgi,FastCGI,,30))
++$(eval $(call BuildPlugin,flv_streaming,FLV streaming,,30))
++$(eval $(call BuildPlugin,magnet,Magnet,+liblua,30))
++$(eval $(call BuildPlugin,mysql_vhost,Mysql virtual hosting,+PACKAGE_lighttpd-mod-mysql_vhost:libmysqlclient,30))
++$(eval $(call BuildPlugin,proxy,Proxy,,30))
++$(eval $(call BuildPlugin,rewrite,URL rewriting,+PACKAGE_lighttpd-mod-rewrite:libpcre,30))
++$(eval $(call BuildPlugin,rrdtool,RRDtool,,30))
++$(eval $(call BuildPlugin,scgi,SCGI,,30))
++$(eval $(call BuildPlugin,secdownload,Secure and fast download,,30))
++$(eval $(call BuildPlugin,setenv,Environment variable setting,,30))
++$(eval $(call BuildPlugin,simple_vhost,Simple virtual hosting,,30))
++$(eval $(call BuildPlugin,ssi,SSI,+libpcre,30))
++$(eval $(call BuildPlugin,status,Server status display,,30))
++$(eval $(call BuildPlugin,trigger_b4_dl,Trigger before download,+PACKAGE_lighttpd-mod-trigger_b4_dl:libpcre,30))
++$(eval $(call BuildPlugin,userdir,User directory,,30))
++$(eval $(call BuildPlugin,usertrack,User tracking,,30))
++$(eval $(call BuildPlugin,webdav,WebDAV,+PACKAGE_lighttpd-mod-webdav:libsqlite3 +PACKAGE_lighttpd-mod-webdav:libuuid +PACKAGE_lighttpd-mod-webdav:libxml2,30))
++
+diff --git a/feeds/packages/net/lighttpd/files/lighttpd.conf b/feeds/packages/net/lighttpd/files/lighttpd.conf
+new file mode 100644
+index 0000000..04b06bc
+--- /dev/null
++++ b/feeds/packages/net/lighttpd/files/lighttpd.conf
+@@ -0,0 +1,32 @@
++server.modules = (
++)
++
++server.document-root = "/www"
++server.upload-dirs = ( "/tmp" )
++server.errorlog = "/var/log/lighttpd/error.log"
++server.pid-file = "/var/run/lighttpd.pid"
++server.username = "http"
++server.groupname = "www-data"
++
++index-file.names = ( "index.php", "index.html",
++ "index.htm", "default.htm",
++ "index.lighttpd.html" )
++
++static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
++
++### Options that are useful but not always necessary:
++#server.chroot = "/"
++#server.port = 81
++#server.bind = "localhost"
++#server.tag = "lighttpd"
++#server.errorlog-use-syslog = "enable"
++#server.network-backend = "write"
++
++### Use IPv6 if available
++#include_shell "/usr/share/lighttpd/use-ipv6.pl"
++
++#dir-listing.encoding = "utf-8"
++#server.dir-listing = "enable"
++
++include "/etc/lighttpd/mime.conf"
++include_shell "cat /etc/lighttpd/conf.d/*.conf"
+diff --git a/feeds/packages/net/lighttpd/files/lighttpd.init b/feeds/packages/net/lighttpd/files/lighttpd.init
+new file mode 100644
+index 0000000..936c7f6
+--- /dev/null
++++ b/feeds/packages/net/lighttpd/files/lighttpd.init
+@@ -0,0 +1,20 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++SERVICE_USE_PID=1
++
++START=50
++
++start() {
++ user_exists http || user_add http
++ [ -d /var/log/lighttpd ] || {
++ mkdir -m 0775 -p /var/log/lighttpd
++ chgrp www-data /var/log/lighttpd
++ }
++ service_start /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
++}
++
++stop() {
++ service_stop /usr/sbin/lighttpd
++}
++
+diff --git a/feeds/packages/net/linknx/Makefile b/feeds/packages/net/linknx/Makefile
+new file mode 100644
+index 0000000..3af3842
+--- /dev/null
++++ b/feeds/packages/net/linknx/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=linknx
++PKG_VERSION:=0.0.1.32
++PKG_RELEASE:=7
++PKG_MD5SUM:=7ecc1208f59bceb05068c752b2250b63
++
++PKG_MAINTAINER:=Othmar Truniger <github@truniger.ch>
++PKG_LICENSE:=GPL-2.0+
++
++PKG_SOURCE_URL:=@SF/linknx
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_BUILD_DEPENDS:=argp-standalone
++PKG_FORTIFY_SOURCE:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/linknx
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=KNX home automation platform
++ URL:=http://sourceforge.net/projects/linknx/
++ DEPENDS:=+pthsem +lua +luac +libstdcpp +libcurl +libesmtp
++endef
++
++CONFIGURE_ARGS+= \
++ --verbose \
++ --without-pth-test \
++ --without-log4cpp \
++ --with-lua \
++ --with-libcurl \
++ --without-mysql
++
++EXTRA_LDFLAGS+= \
++ -fno-builtin
++
++define Package/linknx/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/linknx $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/linknx.init $(1)/etc/init.d/linknx
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/linknx.config $(1)/etc/config/linknx
++ $(INSTALL_DATA) ./files/linknx.xml.dist $(1)/etc/linknx.xml.dist
++ $(INSTALL_DIR) $(1)/tmp/linknx/persist
++endef
++
++define Package/linknx/conffiles
++/etc/config/linknx
++/etc/linknx.xml.dist
++endef
++
++$(eval $(call BuildPackage,linknx))
+diff --git a/feeds/packages/net/linknx/files/linknx.config b/feeds/packages/net/linknx/files/linknx.config
+new file mode 100644
+index 0000000..d2f0562
+--- /dev/null
++++ b/feeds/packages/net/linknx/files/linknx.config
+@@ -0,0 +1,8 @@
++config daemon args
++ # daemon is started as 'linknx --config=$conf $options'
++ # use 'linknx --help' to get all possible options'
++ #
++ # typical example
++ option conf '/etc/linknx.xml'
++ option options '-w --daemon=/tmp/linknx/linknx.log --pid-file=/var/run/linknx.pid'
++
+diff --git a/feeds/packages/net/linknx/files/linknx.init b/feeds/packages/net/linknx/files/linknx.init
+new file mode 100644
+index 0000000..d38f194
+--- /dev/null
++++ b/feeds/packages/net/linknx/files/linknx.init
+@@ -0,0 +1,23 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006 OpenWrt.org
++
++START=98
++STOP=10
++NAME=linknx
++PROG=/usr/bin/$NAME
++
++. /lib/functions.sh
++
++start() {
++ local conf options
++ config_load "$NAME"
++ config_get conf args conf '/etc/linknx.xml'
++ config_get options args options ''
++ test -f $conf || cp -p /etc/linknx.xml.dist $conf
++ mkdir -p /tmp/$NAME/persist
++ service_start $PROG --config=$conf $options
++}
++
++stop() {
++ service_stop $PROG
++}
+diff --git a/feeds/packages/net/linknx/files/linknx.xml.dist b/feeds/packages/net/linknx/files/linknx.xml.dist
+new file mode 100644
+index 0000000..55eb41d
+--- /dev/null
++++ b/feeds/packages/net/linknx/files/linknx.xml.dist
+@@ -0,0 +1,16 @@
++<config>
++ <objects>
++ </objects>
++
++ <rules>
++ </rules>
++
++ <services>
++ <xmlserver type="inet" port="1028"/>
++ <knxconnection url="ip:localhost"/>
++ <persistence type="file" path="/tmp/linknx/persist"/>
++ <emailserver type="smtp" host="localhost:25" from="linknx@local.local" />
++ </services>
++ <logging format="basic" level="INFO" />
++
++</config>
+diff --git a/feeds/packages/net/linknx/patches/010-musl-compat b/feeds/packages/net/linknx/patches/010-musl-compat
+new file mode 100644
+index 0000000..15c757e
+--- /dev/null
++++ b/feeds/packages/net/linknx/patches/010-musl-compat
+@@ -0,0 +1,10 @@
++--- a/src/eibclient.c 2007-10-11 01:55:31.000000000 +0200
+++++ b/src/eibclient.c 2015-06-27 22:18:01.433296921 +0200
++@@ -32,6 +32,7 @@
++ #include <netinet/in.h>
++ #include <netdb.h>
++ #include <errno.h>
+++#include <string.h>
++
++ #include "config.h"
++
+diff --git a/feeds/packages/net/linknx/patches/012-fix-linknx.cpp b/feeds/packages/net/linknx/patches/012-fix-linknx.cpp
+new file mode 100644
+index 0000000..8394cf1
+--- /dev/null
++++ b/feeds/packages/net/linknx/patches/012-fix-linknx.cpp
+@@ -0,0 +1,11 @@
++--- a/src/linknx.cpp 2012-06-04 22:12:13.000000000 +0200
+++++ b/src/linknx.cpp 2015-06-27 22:35:23.705721355 +0200
++@@ -136,7 +136,7 @@
++ if (errno)
++ printf (": %s\n", strerror (errno));
++ else
++- printf ("\n", strerror (errno));
+++ printf ("\n");
++ exit (1);
++ }
++
+diff --git a/feeds/packages/net/lispmob/Makefile b/feeds/packages/net/lispmob/Makefile
+new file mode 100644
+index 0000000..3f9ea0c
+--- /dev/null
++++ b/feeds/packages/net/lispmob/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lispmob
++PKG_REV:=180aa39d338a00bb532e421de7f8513492cf2e8b
++PKG_VERSION:=0.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=git://github.com/LISPmob/lispmob.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=LICENSE
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lispd/default
++ MAINTAINER:=Vasileios Lakafosis <lakafv@gmail.com>
++ URL:=http://lisp.cisco.com/
++endef
++
++define Package/lispd
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Locator/ID separation protocol (using TUN)
++ URL:=https://github.com/LISPmob
++ DEPENDS:= +librt +libopenssl +confuse +kmod-tun +uci @IPV6
++ $(call Package/lispd/default)
++endef
++
++define Package/lispd/description
++ This packet provides support for the Locator-ID Seperation Protocol.
++endef
++
++MAKE_FLAGS += \
++ platform=openwrt
++
++define Package/lispd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lispd/lispd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/openWRT/lispd.uci.example $(1)/etc/config/lispd
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/openWRT/openwrt.init.script $(1)/etc/init.d/lisp
++endef
++
++$(eval $(call BuildPackage,lispd))
+diff --git a/feeds/packages/net/lksctp-tools/Makefile b/feeds/packages/net/lksctp-tools/Makefile
+new file mode 100644
+index 0000000..0d65292
+--- /dev/null
++++ b/feeds/packages/net/lksctp-tools/Makefile
+@@ -0,0 +1,92 @@
++#
++# Copyright (C) 2010-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lksctp-tools
++PKG_VERSION:=1.0.16
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/lksctp
++PKG_MD5SUM:=708bb0b5a6806ad6e8d13c55b067518e
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lksctp-tools/Default
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=SCTP user-land
++ URL:=http://lksctp.sourceforge.net
++endef
++
++define Package/libsctp
++$(call Package/lksctp-tools/Default)
++ SUBMENU:=Networking
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= library
++ URL:=http://lksctp.sourceforge.net
++ DEPENDS:=+kmod-sctp
++endef
++
++define Package/sctp
++$(call Package/lksctp-tools/Default)
++ TITLE+= (meta)
++ URL:=http://lksctp.sourceforge.net
++ DEPENDS:=+libsctp +sctp-tools
++endef
++
++define Package/sctp-tools
++$(call Package/lksctp-tools/Default)
++ TITLE+= tools
++ URL:=http://lksctp.sourceforge.net
++ DEPENDS:=+libsctp
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/netinet \
++ $(STAGING_DIR)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libsctp.{a,so*} \
++ $(1)/usr/lib/
++endef
++
++define Package/libsctp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libsctp.so.* \
++ $(1)/usr/lib/
++endef
++
++define Package/sctp/install
++ :
++endef
++
++define Package/sctp-tools/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/bin/checksctp \
++ $(1)/usr/bin/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/bin/sctp_{darn,status,test} \
++ $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libsctp))
++$(eval $(call BuildPackage,sctp))
++$(eval $(call BuildPackage,sctp-tools))
+diff --git a/feeds/packages/net/luci-app-bcp38/Makefile b/feeds/packages/net/luci-app-bcp38/Makefile
+new file mode 100644
+index 0000000..d42916c
+--- /dev/null
++++ b/feeds/packages/net/luci-app-bcp38/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-app-bcp38
++PKG_VERSION:=2
++PKG_RELEASE:=1
++PKG_LICENSE:=Apache-2.0
++LUCI_DIR:=/usr/lib/lua/luci
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luci-app-bcp38
++ SECTION:=luci
++ CATEGORY:=LuCI
++ TITLE:=BCP38 LuCI interface
++ MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
++ PKGARCH:=all
++ DEPENDS:= lua luci-base +bcp38
++ SUBMENU:=3. Applications
++endef
++
++define Package/luci-app-bcp38/description
++ Control BCP38 subnet blocking
++endef
++
++define Build/Compile
++endef
++
++define Build/Configure
++endef
++
++define Package/luci-app-bcp38/install
++ $(INSTALL_DIR) $(1)$(LUCI_DIR)/controller $(1)$(LUCI_DIR)/model/cbi
++ $(INSTALL_DATA) ./files/bcp38-controller.lua $(1)$(LUCI_DIR)/controller/bcp38.lua
++ $(INSTALL_DATA) ./files/bcp38-cbi.lua $(1)$(LUCI_DIR)/model/cbi/bcp38.lua
++ $(INSTALL_DIR) $(1)/etc/uci-defaults
++ $(INSTALL_BIN) ./files/uci-defaults-bcp38 $(1)/etc/uci-defaults/luci-bcp38
++endef
++
++define Package/luci-app-bcp38/postinst
++#!/bin/sh
++[ -x /etc/uci-defaults/luci-bcp38 ] && /etc/uci-defaults/luci-bcp38 || exit 0
++endef
++
++define Package/luci-app-bcp38/postrm
++#!/bin/sh
++uci delete ucitrack.@bcp38[0]
++uci commit
++endef
++
++$(eval $(call BuildPackage,luci-app-bcp38))
+diff --git a/feeds/packages/net/luci-app-bcp38/files/bcp38-cbi.lua b/feeds/packages/net/luci-app-bcp38/files/bcp38-cbi.lua
+new file mode 100644
+index 0000000..b0b8f38
+--- /dev/null
++++ b/feeds/packages/net/luci-app-bcp38/files/bcp38-cbi.lua
+@@ -0,0 +1,58 @@
++--[[
++LuCI - Lua Configuration Interface
++
++Copyright 2014 Toke Høiland-Jørgensen <toke@toke.dk>
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++$Id$
++]]--
++
++local wa = require "luci.tools.webadmin"
++local net = require "luci.model.network".init()
++local ifaces = net:get_interfaces()
++
++m = Map("bcp38", translate("BCP38"),
++ translate("This function blocks packets with private address destinations " ..
++ "from going out onto the internet as per " ..
++ "<a href=\"http://tools.ietf.org/html/bcp38\">BCP 38</a>."))
++
++s = m:section(TypedSection, "bcp38", translate("BCP38 config"))
++s.anonymous = true
++-- BASIC
++e = s:option(Flag, "enabled", translate("Enable"))
++e.rmempty = false
++
++a = s:option(Flag, "detect_upstream", translate("Auto-detect upstream IP"),
++ translate("Attempt to automatically detect if the upstream IP " ..
++ "will be blocked by the configuration, and add an exception if it will. " ..
++ "If this does not work correctly, you can add exceptions manually below."))
++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
++end
++n.rmempty = false
++
++ma = s:option(DynamicList, "match",
++ translate("Blocked IP ranges"))
++
++ma.datatype = "ip4addr"
++
++nm = s:option(DynamicList, "nomatch",
++ translate("Allowed IP ranges"), translate("Takes precedence over blocked ranges. "..
++ "Use to whitelist your upstream network if you're behind a double NAT " ..
++ "and the auto-detection doesn't work."))
++
++nm.datatype = "ip4addr"
++
++
++return m
+diff --git a/feeds/packages/net/luci-app-bcp38/files/bcp38-controller.lua b/feeds/packages/net/luci-app-bcp38/files/bcp38-controller.lua
+new file mode 100644
+index 0000000..7ea2283
+--- /dev/null
++++ b/feeds/packages/net/luci-app-bcp38/files/bcp38-controller.lua
+@@ -0,0 +1,7 @@
++module("luci.controller.bcp38", package.seeall)
++
++function index()
++ entry({"admin", "network", "firewall", "bcp38"},
++ cbi("bcp38"),
++ _("BCP38"), 50).dependent = false
++end
+diff --git a/feeds/packages/net/luci-app-bcp38/files/uci-defaults-bcp38 b/feeds/packages/net/luci-app-bcp38/files/uci-defaults-bcp38
+new file mode 100755
+index 0000000..c204236
+--- /dev/null
++++ b/feeds/packages/net/luci-app-bcp38/files/uci-defaults-bcp38
+@@ -0,0 +1,11 @@
++#!/bin/sh
++
++uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@bcp38[-1]
++ add ucitrack bcp38
++ add_list ucitrack.@bcp38[0].affects=firewall
++ commit ucitrack
++EOF
++
++rm -f /tmp/luci-indexcache
++exit 0
+diff --git a/feeds/packages/net/luci-app-clamav/Makefile b/feeds/packages/net/luci-app-clamav/Makefile
+new file mode 100644
+index 0000000..fed8e63
+--- /dev/null
++++ b/feeds/packages/net/luci-app-clamav/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-app-clamav
++PKG_RELEASE:=20150520
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++PKG_LICENSE:=Apache-2.0
++PKG_MAINTAINER:=Marko Ratkaj <marko.ratkaj@sartura.hr>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luci-app-clamav
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=3. Applications
++ TITLE:=ClamAV Web UI
++ DEPENDS:=+luci-mod-admin-full +clamav
++endef
++
++define Package/luci-app-clamav/description
++ This package will install ClamAV Web UI.
++endef
++
++define Build/Prepare
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/luci-app-clamav/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
++ $(INSTALL_BIN) \
++ ./files/controller/clamav-controller.lua \
++ $(1)/usr/lib/lua/luci/controller/clamav.lua
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/
++ $(INSTALL_BIN) \
++ ./files/model/cbi/clamav-cbi.lua \
++ $(1)/usr/lib/lua/luci/model/cbi/clamav.lua
++endef
++
++$(eval $(call BuildPackage,luci-app-clamav))
+diff --git a/feeds/packages/net/luci-app-clamav/files/controller/clamav-controller.lua b/feeds/packages/net/luci-app-clamav/files/controller/clamav-controller.lua
+new file mode 100644
+index 0000000..02f3bfc
+--- /dev/null
++++ b/feeds/packages/net/luci-app-clamav/files/controller/clamav-controller.lua
+@@ -0,0 +1,22 @@
++--[[
++
++LuCI ClamAV module
++
++Copyright (C) 2015, Itus Networks, Inc.
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Author: Marko Ratkaj <marko.ratkaj@sartura.hr>
++ Luka Perkov <luka.perkov@sartura.hr>
++
++]]--
++
++module("luci.controller.clamav", package.seeall)
++
++function index()
++ entry({"admin", "services", "clamav"}, cbi("clamav"), _("ClamAV"))
++end
+diff --git a/feeds/packages/net/luci-app-clamav/files/model/cbi/clamav-cbi.lua b/feeds/packages/net/luci-app-clamav/files/model/cbi/clamav-cbi.lua
+new file mode 100644
+index 0000000..ff98139
+--- /dev/null
++++ b/feeds/packages/net/luci-app-clamav/files/model/cbi/clamav-cbi.lua
+@@ -0,0 +1,178 @@
++--[[
++
++LuCI ClamAV module
++
++Copyright (C) 2015, Itus Networks, Inc.
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Author: Marko Ratkaj <marko.ratkaj@sartura.hr>
++ Luka Perkov <luka.perkov@sartura.hr>
++
++]]--
++
++local fs = require "nixio.fs"
++local sys = require "luci.sys"
++require "ubus"
++
++m = Map("clamav", translate("ClamAV"))
++m.on_after_commit = function() luci.sys.call("/etc/init.d/clamav restart") end
++
++s = m:section(TypedSection, "clamav")
++s.anonymous = true
++s.addremove = false
++
++s:tab("tab_advanced", translate("Settings"))
++s:tab("tab_logs", translate("Log"))
++
++--------------- Settings --------------
++
++LogFileMaxSize = s:taboption("tab_advanced", Value, "LogFileMaxSize", translate("Max size of log file"))
++LogFileMaxSize:value("512K", translate("512K"))
++LogFileMaxSize:value("1M", translate("1M"))
++LogFileMaxSize:value("2M", translate("2M"))
++LogFileMaxSize.default = "1M"
++
++LogTime = s:taboption("tab_advanced", ListValue, "LogTime", translate("Log time with each message"))
++LogTime:value("no", translate("No"))
++LogTime:value("yes", translate("Yes"))
++LogTime.default = "no"
++
++LogVerbose = s:taboption("tab_advanced", ListValue, "LogVerbose", translate("Enable verbose logging"))
++LogVerbose:value("no", translate("No"))
++LogVerbose:value("yes", translate("Yes"))
++LogVerbose.default = "no"
++
++ExtendedDetectionInfo = s:taboption("tab_advanced", ListValue, "ExtendedDetectionInfo", translate("Log additional infection info"))
++ExtendedDetectionInfo:value("no", translate("No"))
++ExtendedDetectionInfo:value("yes", translate("Yes"))
++ExtendedDetectionInfo.default = "no"
++
++dummy3 = s:taboption("tab_advanced", DummyValue, "")
++dummy4 = s:taboption("tab_advanced", DummyValue, "")
++
++MaxDirectoryRecursion = s:taboption("tab_advanced", Value, "MaxDirectoryRecursion", translate("Max directory scan depth"))
++MaxDirectoryRecursion:value("15", translate("15"))
++MaxDirectoryRecursion:value("20", translate("20"))
++MaxDirectoryRecursion.default = "15"
++
++FollowDirectorySymlink = s:taboption("tab_advanced", ListValue, "FollowDirectorySymlink", translate("Follow directory symlinks"))
++FollowDirectorySymlink:value("no", translate("No"))
++FollowDirectorySymlink:value("yes", translate("Yes"))
++FollowDirectorySymlink.default = "no"
++
++FollowFileSymlinks = s:taboption("tab_advanced", ListValue, "FollowFileSymlinks", translate("Follow file symlinks"))
++FollowFileSymlinks:value("no", translate("No"))
++FollowFileSymlinks:value("yes", translate("Yes"))
++FollowFileSymlinks.default = "no"
++
++DetectPUA = s:taboption("tab_advanced", ListValue, "DetectPUA", translate("Detect possibly unwanted apps"))
++DetectPUA:value("no", translate("No"))
++DetectPUA:value("yes", translate("Yes"))
++DetectPUA.default = "no"
++
++ScanPE = s:taboption("tab_advanced", ListValue, "ScanPE", translate("Scan portable executables"))
++ScanPE:value("no", translate("No"))
++ScanPE:value("yes", translate("Yes"))
++ScanPE.default = "yes"
++
++ScanELF = s:taboption("tab_advanced", ListValue, "ScanELF", translate("Scan ELF files"))
++ScanELF:value("no", translate("No"))
++ScanELF:value("yes", translate("Yes"))
++ScanELF.default = "yes"
++
++DetectBrokenExecutables = s:taboption("tab_advanced", ListValue, "DetectBrokenExecutables", translate("Detect broken executables"))
++DetectBrokenExecutables:value("no", translate("No"))
++DetectBrokenExecutables:value("yes", translate("Yes"))
++DetectBrokenExecutables.default = "no"
++
++ScanOLE2 = s:taboption("tab_advanced", ListValue, "ScanOLE2", translate("Scan MS Office and .msi files"))
++ScanOLE2:value("no", translate("No"))
++ScanOLE2:value("yes", translate("Yes"))
++ScanOLE2.default = "yes"
++
++ScanPDF = s:taboption("tab_advanced", ListValue, "ScanPDF", translate("Scan pdf files"))
++ScanPDF:value("no", translate("No"))
++ScanPDF:value("yes", translate("Yes"))
++ScanPDF.default = "yes"
++
++ScanSWF = s:taboption("tab_advanced", ListValue, "ScanSWF", translate("Scan swf files"))
++ScanSWF:value("no", translate("No"))
++ScanSWF:value("yes", translate("Yes"))
++ScanSWF.default = "yes"
++
++ScanMail = s:taboption("tab_advanced", ListValue, "ScanMail", translate("Scan emails"))
++ScanMail:value("no", translate("No"))
++ScanMail:value("yes", translate("Yes"))
++ScanMail.default = "yes"
++
++ScanPartialMessages = s:taboption("tab_advanced", ListValue, "ScanPartialMessages", translate("Scan RFC1341 messages split over many emails"))
++ScanPartialMessages:value("no", translate("No"))
++ScanPartialMessages:value("yes", translate("Yes"))
++ScanPartialMessages.default = "no"
++
++ScanArchive = s:taboption("tab_advanced", ListValue, "ScanArchive", translate("Scan archives"))
++ScanArchive:value("no", translate("No"))
++ScanArchive:value("yes", translate("Yes"))
++ScanArchive.default = "yes"
++
++ArchiveBlockEncrypted = s:taboption("tab_advanced", ListValue, "ArchiveBlockEncrypted", translate("Block encrypted archives"))
++ArchiveBlockEncrypted:value("no", translate("No"))
++ArchiveBlockEncrypted:value("yes", translate("Yes"))
++ArchiveBlockEncrypted.default = "no"
++
++dummy5 = s:taboption("tab_advanced", DummyValue, "")
++dummy6 = s:taboption("tab_advanced", DummyValue, "")
++
++StreamMinPort = s:taboption("tab_advanced", Value, "StreamMinPort", translate("Port range, lowest port"))
++StreamMinPort.datatype = "portrange"
++StreamMinPort:value("1024",translate("1024"))
++StreamMinPort.default = "1024"
++
++StreamMaxPort = s:taboption("tab_advanced", Value, "StreamMaxPort", translate("Port range, highest port"))
++StreamMaxPort.datatype = "portrange"
++StreamMaxPort:value("2048",translate("2048"))
++StreamMaxPort.default = "2048"
++
++MaxThreads = s:taboption("tab_advanced", Value, "MaxThreads", translate("Max number of threads"))
++MaxThreads.datatype = "and(uinteger,min(1))"
++MaxThreads:value("10",translate("10"))
++MaxThreads:value("20",translate("20"))
++MaxThreads.default = "10"
++
++SelfCheck = s:taboption("tab_advanced", Value, "SelfCheck", translate("Database check every N sec"))
++SelfCheck.datatype = "and(uinteger,min(1))"
++SelfCheck:value("600",translate("600"))
++SelfCheck.default = "600"
++
++MaxFileSize = s:taboption("tab_advanced", Value, "MaxFileSize", translate("Max size of scanned file"))
++MaxFileSize.datatype = "string"
++MaxFileSize:value("150M",translate("150M"))
++MaxFileSize:value("50M",translate("50M"))
++MaxFileSize.default = "150M"
++
++------------------ Log --------------------
++
++clamav_logfile = s:taboption("tab_logs", TextValue, "lines", "")
++clamav_logfile.wrap = "off"
++clamav_logfile.rows = 25
++clamav_logfile.rmempty = true
++
++function clamav_logfile.cfgvalue()
++ local uci = require "luci.model.uci".cursor_state()
++ local file = "/tmp/clamd.log"
++ if file then
++ return fs.readfile(file) or ""
++ else
++ return ""
++ end
++end
++
++function clamav_logfile.write()
++end
++
++return m
+diff --git a/feeds/packages/net/luci-app-e2guardian/Makefile b/feeds/packages/net/luci-app-e2guardian/Makefile
+new file mode 100644
+index 0000000..880f373
+--- /dev/null
++++ b/feeds/packages/net/luci-app-e2guardian/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-app-e2guardian
++PKG_RELEASE:=20150520
++
++PKG_LICENSE:=Apache-2.0
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luci-app-e2guardian
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=3. Applications
++ TITLE:=E2Guardian Web UI
++ DEPENDS:=+luci-mod-admin-full +e2guardian
++ MAINTAINER:=Marko Ratkaj <marko.ratkaj@sartura.hr>
++endef
++
++define Package/luci-app-e2guardian/description
++ This package will install E2Guardian Web UI.
++endef
++
++define Build/Prepare
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/luci-app-e2guardian/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
++ $(INSTALL_BIN) \
++ ./files/e2guardian-controller.lua \
++ $(1)/usr/lib/lua/luci/controller/e2guardian.lua
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/
++ $(INSTALL_BIN) \
++ ./files//e2guardian-cbi.lua \
++ $(1)/usr/lib/lua/luci/model/cbi/e2guardian.lua
++endef
++
++$(eval $(call BuildPackage,luci-app-e2guardian))
+diff --git a/feeds/packages/net/luci-app-e2guardian/files/e2guardian-cbi.lua b/feeds/packages/net/luci-app-e2guardian/files/e2guardian-cbi.lua
+new file mode 100644
+index 0000000..a943115
+--- /dev/null
++++ b/feeds/packages/net/luci-app-e2guardian/files/e2guardian-cbi.lua
+@@ -0,0 +1,399 @@
++--[[
++
++LuCI E2Guardian module
++
++Copyright (C) 2015, Itus Networks, Inc.
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Author: Marko Ratkaj <marko.ratkaj@sartura.hr>
++ Luka Perkov <luka.perkov@sartura.hr>
++
++]]--
++
++local fs = require "nixio.fs"
++local sys = require "luci.sys"
++
++m = Map("e2guardian", translate("E2Guardian"))
++m.on_after_commit = function() luci.sys.call("/etc/init.d/e2guardian restart") end
++
++s = m:section(TypedSection, "e2guardian")
++s.anonymous = true
++s.addremove = false
++
++s:tab("tab_general", translate("General Settings"))
++s:tab("tab_additional", translate("Additional Settings"))
++s:tab("tab_logs", translate("Logs"))
++
++
++----------------- General Settings Tab -----------------------
++
++filterip = s:taboption("tab_general", Value, "filterip", translate("IP that E2Guardian listens"))
++filterip.datatype = "ip4addr"
++
++filterports = s:taboption("tab_general", Value, "filterports", translate("Port that E2Guardian listens"))
++filterports.datatype = "portrange"
++filterports.placeholder = "0-65535"
++
++proxyip = s:taboption("tab_general", Value, "proxyip", translate("IP address of the proxy"))
++proxyip.datatype = "ip4addr"
++proxyip.default = "127.0.0.1"
++
++proxyport = s:taboption("tab_general", Value, "proxyport", translate("Port of the proxy"))
++proxyport.datatype = "portrange"
++proxyport.placeholder = "0-65535"
++
++languagedir = s:taboption("tab_general", Value, "languagedir", translate("Language dir"))
++languagedir.datatype = "string"
++languagedir.default = "/usr/share/e2guardian/languages"
++
++language = s:taboption("tab_general", Value, "language", translate("Language to use"))
++language.datatype = "string"
++language.default = "ukenglish"
++
++loglevel = s:taboption("tab_general", ListValue, "loglevel", translate("Logging Settings"))
++loglevel:value("0", translate("none"))
++loglevel:value("1", translate("just denied"))
++loglevel:value("2", translate("all text based"))
++loglevel:value("3", translate("all requests"))
++loglevel.default = "2"
++
++logexceptionhits = s:taboption("tab_general", ListValue, "logexceptionhits", translate("Log Exception Hits"))
++logexceptionhits:value("0", translate("never"))
++logexceptionhits:value("1", translate("log, but dont mark as exceptions"))
++logexceptionhits:value("2", translate("log and mark"))
++logexceptionhits.default = "2"
++
++logfileformat = s:taboption("tab_general", ListValue, "logfileformat", translate("Log File Format"))
++logfileformat:value("1", translate("DansgGuardian format, space delimited"))
++logfileformat:value("2", translate("CSV-style format"))
++logfileformat:value("3", translate("Squid Log File Format"))
++logfileformat:value("4", translate("Tab delimited"))
++logfileformat:value("5", translate("Protex format"))
++logfileformat:value("6", translate("Protex format with server field blanked"))
++logfileformat.default = "1"
++
++accessdeniedaddress = s:taboption("tab_general", Value, "accessdeniedaddress", translate("Access denied address"),
++translate("Server to which the cgi e2guardian reporting script was copied. Reporting levels 1 and 2 only"))
++accessdeniedaddress.datatype = "string"
++accessdeniedaddress.default = "http://YOURSERVER.YOURDOMAIN/cgi-bin/e2guardian.pl"
++
++usecustombannedimage = s:taboption("tab_general", ListValue, "usecustombannedimage", translate("Banned image replacement"))
++usecustombannedimage:value("on", translate("Yes"))
++usecustombannedimage:value("off", translate("No"))
++usecustombannedimage.default = "on"
++
++custombannedimagefile = s:taboption("tab_general", Value, "custombannedimagefile", translate("Custom banned image file"))
++custombannedimagefile.datatype = "string"
++custombannedimagefile.default = "/usr/share/e2guardian/transparent1x1.gif"
++
++usecustombannedflash = s:taboption("tab_general", ListValue, "usecustombannedflash", translate("Banned flash replacement"))
++usecustombannedflash:value("on", translate("Yes"))
++usecustombannedflash:value("off", translate("No"))
++usecustombannedflash.default = "on"
++
++custombannedflashfile = s:taboption("tab_general", Value, "custombannedflashfile", translate("Custom banned flash file"))
++custombannedflashfile.datatype = "string"
++custombannedflashfile.default = "/usr/share/e2guardian/blockedflash.swf"
++
++filtergroups = s:taboption("tab_general", Value, "filtergroups", translate("Number of filter groups"))
++filtergroups.datatype = "and(uinteger,min(1))"
++filtergroups.default = "1"
++
++filtergroupslist = s:taboption("tab_general", Value, "filtergroupslist", translate("List of filter groups"))
++filtergroupslist.datatype = "string"
++filtergroupslist.default = "/etc/e2guardian/lists/filtergroupslist"
++
++bannediplist = s:taboption("tab_general", Value, "bannediplist", translate("List of banned IPs"))
++bannediplist.datatype = "string"
++bannediplist.default = "/etc/e2guardian/lists/bannediplist"
++
++exceptioniplist = s:taboption("tab_general", Value, "exceptioniplist", translate("List of IP exceptions"))
++exceptioniplist.datatype = "string"
++exceptioniplist.default = "/etc/e2guardian/lists/exceptioniplist"
++
++perroomblockingdirectory = s:taboption("tab_general", Value, "perroomblockingdirectory", translate("Per-Room blocking definition directory"))
++perroomblockingdirectory.datatype = "string"
++perroomblockingdirectory.default = "/etc/e2guardian/lists/bannedrooms/"
++
++showweightedfound = s:taboption("tab_general", ListValue, "showweightedfound", translate("Show weighted phrases found"))
++showweightedfound:value("on", translate("Yes"))
++showweightedfound:value("off", translate("No"))
++showweightedfound.default = "on"
++
++weightedphrasemode = s:taboption("tab_general", ListValue, "weightedphrasemode", translate("Weighted phrase mode"))
++weightedphrasemode:value("0", translate("off"))
++weightedphrasemode:value("1", translate("on, normal operation"))
++weightedphrasemode:value("2", translate("on, phrase found only counts once on a page"))
++weightedphrasemode.default = "2"
++
++urlcachenumber = s:taboption("tab_general", Value, "urlcachenumber", translate("Clean result caching for URLs"))
++urlcachenumber.datatype = "and(uinteger,min(0))"
++urlcachenumber.default = "1000"
++
++urlcacheage = s:taboption("tab_general", Value, "urlcacheage", translate("Age before they should be ignored in seconds"))
++urlcacheage.datatype = "and(uinteger,min(0))"
++urlcacheage.default = "900"
++
++scancleancache = s:taboption("tab_general", ListValue, "scancleancache", translate("Cache for content (AV) scans as 'clean'"))
++scancleancache:value("on", translate("Yes"))
++scancleancache:value("off", translate("No"))
++scancleancache.default = "on"
++
++phrasefiltermode = s:taboption("tab_general", ListValue, "phrasefiltermode", translate("Filtering options"))
++phrasefiltermode:value("0", translate("raw"))
++phrasefiltermode:value("1", translate("smart"))
++phrasefiltermode:value("2", translate("both raw and smart"))
++phrasefiltermode:value("3", translate("meta/title"))
++phrasefiltermode.default = "2"
++
++preservecase = s:taboption("tab_general", ListValue, "perservecase", translate("Lower caseing options"))
++preservecase:value("0", translate("force lower case"))
++preservecase:value("1", translate("dont change"))
++preservecase:value("2", translate("scan fist in lower, then in original"))
++preservecase.default = "0"
++
++hexdecodecontent = s:taboption("tab_general", ListValue, "hexdecodecontent", translate("Hex decoding options"))
++hexdecodecontent:value("on", translate("Yes"))
++hexdecodecontent:value("off", translate("No"))
++hexdecodecontent.default = "off"
++
++forcequicksearch = s:taboption("tab_general", ListValue, "forcequicksearch", translate("Quick search"))
++forcequicksearch:value("on", translate("Yes"))
++forcequicksearch:value("off", translate("No"))
++forcequicksearch.default = "off"
++
++reverseaddresslookups= s:taboption("tab_general", ListValue, "reverseaddresslookups", translate("Reverse lookups for banned site and URLs"))
++reverseaddresslookups:value("on", translate("Yes"))
++reverseaddresslookups:value("off", translate("No"))
++reverseaddresslookups.default = "off"
++
++reverseclientiplookups = s:taboption("tab_general", ListValue, "reverseclientiplookups", translate("Reverse lookups for banned and exception IP lists"))
++reverseclientiplookups:value("on", translate("Yes"))
++reverseclientiplookups:value("off", translate("No"))
++reverseclientiplookups.default = "off"
++
++logclienthostnames = s:taboption("tab_general", ListValue, "logclienthostnames", translate("Perform reverse lookups on client IPs for successful requests"))
++logclienthostnames:value("on", translate("Yes"))
++logclienthostnames:value("off", translate("No"))
++logclienthostnames.default = "off"
++
++createlistcachefiles = s:taboption("tab_general", ListValue, "createlistcachefiles", translate("Build bannedsitelist and bannedurllist cache files"))
++createlistcachefiles:value("on",translate("Yes"))
++createlistcachefiles:value("off",translate("No"))
++createlistcachefiles.default = "on"
++
++prefercachedlists = s:taboption("tab_general", ListValue, "prefercachedlists", translate("Prefer cached list files"))
++prefercachedlists:value("on", translate("Yes"))
++prefercachedlists:value("off", translate("No"))
++prefercachedlists.default = "off"
++
++maxuploadsize = s:taboption("tab_general", Value, "maxuploadsize", translate("Max upload size (in Kbytes)"))
++maxuploadsize:value("-1", translate("no blocking"))
++maxuploadsize:value("0", translate("complete block"))
++maxuploadsize.default = "-1"
++
++maxcontentfiltersize = s:taboption("tab_general", Value, "maxcontentfiltersize", translate("Max content filter size"),
++translate("The value must not be higher than max content ram cache scan size or 0 to match it"))
++maxcontentfiltersize.datatype = "and(uinteger,min(0))"
++maxcontentfiltersize.default = "256"
++
++maxcontentramcachescansize = s:taboption("tab_general", Value, "maxcontentramcachescansize", translate("Max content ram cache scan size"),
++translate("This is the max size of file that DG will download and cache in RAM"))
++maxcontentramcachescansize.datatype = "and(uinteger,min(0))"
++maxcontentramcachescansize.default = "2000"
++
++maxcontentfilecachescansize = s:taboption("tab_general", Value, "maxcontentfilecachescansize", translate("Max content file cache scan size"))
++maxcontentfilecachescansize.datatype = "and(uinteger,min(0))"
++maxcontentfilecachescansize.default = "20000"
++
++proxytimeout = s:taboption("tab_general", Value, "proxytimeout", translate("Proxy timeout (5-100)"))
++proxytimeout.datatype = "range(5,100)"
++proxytimeout.default = "20"
++
++proxyexchange = s:taboption("tab_general", Value, "proxyexchange", translate("Proxy header excahnge (20-300)"))
++proxyexchange.datatype = "range(20,300)"
++proxyexchange.default = "20"
++
++pcontimeout = s:taboption("tab_general", Value, "pcontimeout", translate("Pconn timeout"),
++translate("How long a persistent connection will wait for other requests"))
++pcontimeout.datatype = "range(5,300)"
++pcontimeout.default = "55"
++
++filecachedir = s:taboption("tab_general", Value, "filecachedir", translate("File cache directory"))
++filecachedir.datatype = "string"
++filecachedir.default = "/tmp"
++
++deletedownloadedtempfiles = s:taboption("tab_general", ListValue, "deletedownloadedtempfiles", translate("Delete file cache after user completes download"))
++deletedownloadedtempfiles:value("on", translate("Yes"))
++deletedownloadedtempfiles:value("off", translate("No"))
++deletedownloadedtempfiles.default = "on"
++
++initialtrickledelay = s:taboption("tab_general", Value, "initialtrickledelay", translate("Initial Trickle delay"),
++translate("Number of seconds a browser connection is left waiting before first being sent *something* to keep it alive"))
++initialtrickledelay.datatype = "and(uinteger,min(0))"
++initialtrickledelay.default = "20"
++
++trickledelay = s:taboption("tab_general", Value, "trickledelay", translate("Trickle delay"),
++translate("Number of seconds a browser connection is left waiting before being sent more *something* to keep it alive"))
++trickledelay.datatype = "and(uinteger,min(0))"
++trickledelay.default = "10"
++
++downloadmanager = s:taboption("tab_general", Value, "downloadmanager", translate("Download manager"))
++downloadmanager.datatype = "string"
++downloadmanager.default = "/etc/e2guardian/downloadmanagers/default.conf"
++
++contentscannertimeout = s:taboption("tab_general", Value, "contentscannertimeout", translate("Content scanner timeout"))
++contentscannertimeout.datatype = "and(uinteger,min(0))"
++contentscannertimeout.default = "60"
++
++contentscanexceptions = s:taboption("tab_general", ListValue, "contentscanexceptions", translate("Content scan exceptions"))
++contentscanexceptions:value("on", translate("Yes"))
++contentscanexceptions:value("off", translate("No"))
++contentscanexceptions.default = "off"
++
++recheckreplacedurls = s:taboption("tab_general", ListValue, "recheckreplacedurls", translate("e-check replaced URLs"))
++recheckreplacedurls:value("on", translate("Yes"))
++recheckreplacedurls:value("off", translate("No"))
++recheckreplacedurls.default = "off"
++
++forwardedfor = s:taboption("tab_general", ListValue, "forwardedfor", translate("Misc setting: forwardedfor"),
++translate("If on, it may help solve some problem sites that need to know the source ip."))
++forwardedfor:value("on", translate("Yes"))
++forwardedfor:value("off", translate("No"))
++forwardedfor.default = "off"
++
++usexforwardedfor = s:taboption("tab_general", ListValue, "usexforwardedfor", translate("Misc setting: usexforwardedfor"),
++translate("This is for when you have squid between the clients and E2Guardian"))
++usexforwardedfor:value("on", translate("Yes"))
++usexforwardedfor:value("off", translate("No"))
++usexforwardedfor.default = "off"
++
++logconnectionhandlingerrors = s:taboption("tab_general", ListValue, "logconnectionhandlingerrors", translate("Log debug info about log()ing and accept()ing"))
++logconnectionhandlingerrors:value("on", translate("Yes"))
++logconnectionhandlingerrors:value("off", translate("No"))
++logconnectionhandlingerrors.default = "on"
++
++logchildprocesshandling = s:taboption("tab_general", ListValue, "logchildprocesshandling", translate("Log child process handling"))
++logchildprocesshandling:value("on", translate("Yes"))
++logchildprocesshandling:value("off", translate("No"))
++logchildprocesshandling.default = "off"
++
++maxchildren = s:taboption("tab_general", Value, "maxchildren", translate("Max number of processes to spawn"))
++maxchildren.datatype = "and(uinteger,min(0))"
++maxchildren.default = "180"
++
++minchildren = s:taboption("tab_general", Value, "minchildren", translate("Min number of processes to spawn"))
++minchildren.datatype = "and(uinteger,min(0))"
++minchildren.default = "20"
++
++minsparechildren = s:taboption("tab_general", Value, "minsparechildren", translate("Min number of processes to keep ready"))
++minsparechildren.datatype = "and(uinteger,min(0))"
++minsparechildren.default = "16"
++
++preforkchildren = s:taboption("tab_general", Value, "preforkchildren", translate("Sets minimum nuber of processes when it runs out"))
++preforkchildren.datatype = "and(uinteger,min(0))"
++preforkchildren.default = "10"
++
++maxsparechildren = s:taboption("tab_general", Value, "maxsparechildren", translate("Sets the maximum number of processes to have doing nothing"))
++maxsparechildren.datatype = "and(uinteger,min(0))"
++maxsparechildren.default = "32"
++
++maxagechildren = s:taboption("tab_general", Value, "maxagechildren", translate("Max age of child process"))
++maxagechildren.datatype = "and(uinteger,min(0))"
++maxagechildren.default = "500"
++
++maxips = s:taboption("tab_general", Value, "maxips", translate("Max number of clinets allowed to connect"))
++maxips:value("0", translate("no limit"))
++maxips.default = "0"
++
++ipipcfilename = s:taboption("tab_general", Value, "ipipcfilename", translate("IP list IPC server directory and filename"))
++ipipcfilename.datatype = "string"
++ipipcfilename.default = "/tmp/.dguardianipc"
++
++urlipcfilename = s:taboption("tab_general", Value, "urlipcfilename", translate("Defines URL list IPC server directory and filename used to communicate with the URL cache process"))
++urlipcfilename.datatype = "string"
++urlipcfilename.default = "/tmp/.dguardianurlipc"
++
++ipcfilename = s:taboption("tab_general", Value, "ipcfilename", translate("Defines URL list IPC server directory and filename used to communicate with the URL cache process"))
++ipcfilename.datatype = "string"
++ipcfilename.default = "/tmp/.dguardianipipc"
++
++nodeamon = s:taboption("tab_general", ListValue, "nodeamon", translate("Disable deamoning"))
++nodeamon:value("on", translate("Yes"))
++nodeamon:value("off", translate("No"))
++nodeamon.default = "off"
++
++nologger = s:taboption("tab_general", ListValue, "nologger", translate("Disable logger"))
++nologger:value("on", translate("Yes"))
++nologger:value("off", translate("No"))
++nologger.default = "off"
++
++logadblock = s:taboption("tab_general", ListValue, "logadblock", translate("Enable logging of ADs"))
++logadblock:value("on", translate("Yes"))
++logadblock:value("off", translate("No"))
++logadblock.default = "off"
++
++loguseragent = s:taboption("tab_general", ListValue, "loguseragent", translate("Enable logging of client user agent"))
++loguseragent:value("on", translate("Yes"))
++loguseragent:value("off", translate("No"))
++loguseragent.default = "off"
++
++softrestart = s:taboption("tab_general", ListValue, "softrestart", translate("Enable soft restart"))
++softrestart:value("on", translate("Yes"))
++softrestart:value("off", translate("No"))
++softrestart.default = "off"
++
++
++------------------------ Additional Settings Tab ----------------------------
++
++e2guardian_config_file = s:taboption("tab_additional", TextValue, "_data", "")
++e2guardian_config_file.wrap = "off"
++e2guardian_config_file.rows = 25
++e2guardian_config_file.rmempty = false
++
++function e2guardian_config_file.cfgvalue()
++ local uci = require "luci.model.uci".cursor_state()
++ file = "/etc/e2guardian/e2guardianf1.conf"
++ if file then
++ return fs.readfile(file) or ""
++ else
++ return ""
++ end
++end
++
++function e2guardian_config_file.write(self, section, value)
++ if value then
++ local uci = require "luci.model.uci".cursor_state()
++ file = "/etc/e2guardian/e2guardianf1.conf"
++ fs.writefile(file, value:gsub("\r\n", "\n"))
++ end
++end
++
++
++---------------------------- Logs Tab -----------------------------
++
++e2guardian_logfile = s:taboption("tab_logs", TextValue, "lines", "")
++e2guardian_logfile.wrap = "off"
++e2guardian_logfile.rows = 25
++e2guardian_logfile.rmempty = true
++
++function e2guardian_logfile.cfgvalue()
++ local uci = require "luci.model.uci".cursor_state()
++ file = "/tmp/e2guardian/access.log"
++ if file then
++ return fs.readfile(file) or ""
++ else
++ return "Can't read log file"
++ end
++end
++
++function e2guardian_logfile.write()
++ return ""
++end
++
++return m
+diff --git a/feeds/packages/net/luci-app-e2guardian/files/e2guardian-controller.lua b/feeds/packages/net/luci-app-e2guardian/files/e2guardian-controller.lua
+new file mode 100644
+index 0000000..dd545f5
+--- /dev/null
++++ b/feeds/packages/net/luci-app-e2guardian/files/e2guardian-controller.lua
+@@ -0,0 +1,22 @@
++--[[
++
++LuCI E2Guardian module
++
++Copyright (C) 2015, Itus Networks, Inc.
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Author: Marko Ratkaj <marko.ratkaj@sartura.hr>
++ Luka Perkov <luka.perkov@sartura.hr>
++
++]]--
++
++module("luci.controller.e2guardian", package.seeall)
++
++function index()
++ entry({"admin", "services", "e2guardian"}, cbi("e2guardian"), _("E2Guardian"))
++end
+diff --git a/feeds/packages/net/luci-app-squid/Makefile b/feeds/packages/net/luci-app-squid/Makefile
+new file mode 100644
+index 0000000..91ce724
+--- /dev/null
++++ b/feeds/packages/net/luci-app-squid/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-app-squid
++PKG_RELEASE:=20150608
++
++PKG_LICENSE:=Apache-2.0
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luci-app-squid
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=3. Applications
++ TITLE:=Squid Web UI
++ DEPENDS:=+luci-mod-admin-full +squid
++ MAINTAINER:=Marko Ratkaj <marko.ratkaj@sartura.hr>
++endef
++
++define Package/luci-app-squid/description
++ This package will install Squid Web UI.
++endef
++
++define Build/Prepare
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/luci-app-squid/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
++ $(INSTALL_BIN) \
++ ./files/squid-controller.lua \
++ $(1)/usr/lib/lua/luci/controller/squid.lua
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/
++ $(INSTALL_BIN) \
++ ./files//squid-cbi.lua \
++ $(1)/usr/lib/lua/luci/model/cbi/squid.lua
++endef
++
++$(eval $(call BuildPackage,luci-app-squid))
+diff --git a/feeds/packages/net/luci-app-squid/files/squid-cbi.lua b/feeds/packages/net/luci-app-squid/files/squid-cbi.lua
+new file mode 100644
+index 0000000..0ac554a
+--- /dev/null
++++ b/feeds/packages/net/luci-app-squid/files/squid-cbi.lua
+@@ -0,0 +1,67 @@
++--[[
++
++LuCI Squid module
++
++Copyright (C) 2015, OpenWrt.org
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Author: Marko Ratkaj <marko.ratkaj@sartura.hr>
++
++]]--
++
++local fs = require "nixio.fs"
++local sys = require "luci.sys"
++require "ubus"
++
++m = Map("squid", translate("Squid"))
++m.on_after_commit = function() luci.sys.call("/etc/init.d/squid restart") end
++
++s = m:section(TypedSection, "squid")
++s.anonymous = true
++s.addremove = false
++
++s:tab("general", translate("General Settings"))
++
++http_port = s:taboption("general", Value, "http_port", translate("Port"))
++http_port.datatype = "portrange"
++http_port.placeholder = "0-65535"
++
++visible_hostname = s:taboption("general", Value, "visible_hostname", translate("Visible Hostname"))
++visible_hostname.datatype="string"
++visible_hostname.placeholder = "OpenWrt"
++
++coredump_dir = s:taboption("general", Value, "coredump_dir", translate("Coredump files directory"))
++coredump_dir.datatype="string"
++coredump_dir.placeholder = "/tmp/squid"
++
++s:tab("advanced", translate("Advanced Settings"))
++
++squid_config_file = s:taboption("advanced", TextValue, "_data", "")
++squid_config_file.wrap = "off"
++squid_config_file.rows = 25
++squid_config_file.rmempty = false
++
++function squid_config_file.cfgvalue()
++ local uci = require "luci.model.uci".cursor_state()
++ local file = uci:get("squid", "squid", "config_file")
++ if file then
++ return fs.readfile(file) or ""
++ else
++ return ""
++ end
++end
++
++function squid_config_file.write(self, section, value)
++ if value then
++ local uci = require "luci.model.uci".cursor_state()
++ local file = uci:get("squid", "squid", "config_file")
++ fs.writefile(file, value:gsub("\r\n", "\n"))
++ end
++end
++
++return m
+diff --git a/feeds/packages/net/luci-app-squid/files/squid-controller.lua b/feeds/packages/net/luci-app-squid/files/squid-controller.lua
+new file mode 100644
+index 0000000..09946a1
+--- /dev/null
++++ b/feeds/packages/net/luci-app-squid/files/squid-controller.lua
+@@ -0,0 +1,21 @@
++--[[
++
++LuCI Squid module
++
++Copyright (C) 2015, OpenWrt.org
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Author: Marko Ratkaj <marko.ratkaj@sartura.hr>
++
++]]--
++
++module("luci.controller.squid", package.seeall)
++
++function index()
++ entry({"admin", "services", "squid"}, cbi("squid"), _("Squid"))
++end
+diff --git a/feeds/packages/net/mac-telnet/Makefile b/feeds/packages/net/mac-telnet/Makefile
+new file mode 100644
+index 0000000..815a532
+--- /dev/null
++++ b/feeds/packages/net/mac-telnet/Makefile
+@@ -0,0 +1,71 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mac-telnet
++PKG_VERSION:=2015-09-02
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/jow-/MAC-Telnet.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=37d83cbc9c07266d6c957d27bf75285b305eceab
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_LICENSE:=GPL-2.0+
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS += -ffunction-sections -fdata-sections $(if $(CONFIG_MACTELNET_PLAIN_SUPPORT),-DTELNET_SUPPORT)
++TARGET_LDFLAGS += -Wl,--gc-sections
++
++# 1: name
++# 2: executable
++define BuildPlugin
++ define Package/mac-telnet-$(1)
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libubox
++ TITLE:=MAC-Telnet / MAC-SSH $(1)
++ URL:=https://github.com/jow-/MAC-Telnet
++ endef
++
++ define Package/mac-telnet-$(1)/description
++ Open source MAC Telnet client and server utilities for connecting to
++ Mikrotik RouterOS routers and Linux machines via MAC address.
++ endef
++
++ define Package/mac-telnet-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(2) $$(1)/usr/sbin/
++ $(call Package/mac-telnet-$(1)/install-extra)
++ endef
++
++ $$(eval $$(call BuildPackage,mac-telnet-$(1)))
++endef
++
++define Package/mac-telnet-server/config
++ config MACTELNET_PLAIN_SUPPORT
++ bool "Include support for plain telnet connections"
++ depends on PACKAGE_mac-telnet-server
++ default y
++ help
++ Disable this option to only support SSH logins to the
++ MAC-Telnet server.
++endef
++
++define Package/mac-telnet-server/install-extra
++ $(INSTALL_DIR) $$(1)/etc/init.d
++ $(INSTALL_BIN) ./files/mactelnet.init $$(1)/etc/init.d/mactelnet
++ $(INSTALL_DIR) $$(1)/etc/config
++ $(INSTALL_DATA) ./files/mactelnet.config $$(1)/etc/config/mactelnet
++endef
++
++
++$(eval $(call BuildPlugin,server,mactelnetd))
++$(eval $(call BuildPlugin,client,mactelnet))
++$(eval $(call BuildPlugin,ping,macping))
++$(eval $(call BuildPlugin,discover,mndp))
+diff --git a/feeds/packages/net/mac-telnet/files/mactelnet.config b/feeds/packages/net/mac-telnet/files/mactelnet.config
+new file mode 100644
+index 0000000..ddf7157
+--- /dev/null
++++ b/feeds/packages/net/mac-telnet/files/mactelnet.config
+@@ -0,0 +1,9 @@
++# Global settings for MAC-Telnet daemon
++config mactelnetd
++ option sshmode '0'
++ list interface 'lan'
++
++# Define a MAC-Telnet login, multiple login sections allowed
++config login
++ option username 'root'
++ option password ''
+diff --git a/feeds/packages/net/mac-telnet/files/mactelnet.init b/feeds/packages/net/mac-telnet/files/mactelnet.init
+new file mode 100755
+index 0000000..701ce98
+--- /dev/null
++++ b/feeds/packages/net/mac-telnet/files/mactelnet.init
+@@ -0,0 +1,80 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=60
++
++USE_PROCD=1
++
++PROG=/usr/sbin/mactelnetd
++USERS=/var/etc/mactelnetd.users
++SSHMODE=0
++
++add_account() {
++ local cfg="$1"
++ local user pass
++
++ [ $SSHMODE -eq 0 ] || {
++ [ -n "$already_warned" ] || {
++ echo "mactelnet.$cfg: login sections ignored in SSH mode" >&1
++ already_warned=1
++ }
++ return
++ }
++
++ config_get username "$cfg" username
++ config_get password "$cfg" password
++
++ [ -n "$username" ] || {
++ echo "mactelnet.$cfg: username missing" >&2
++ return
++ }
++
++ [ -n "$password" ] || {
++ echo "mactelnet.$cfg: password missing" >&2
++ return
++ }
++
++ echo "$username:$password" >> $USERS
++}
++
++add_interface() {
++ local iface="$1"
++ local device
++
++ [ -n "$iface" ] || return
++
++ if network_get_physdev device "$iface"; then
++ procd_append_param command -i "$device"
++ fi
++
++ procd_add_reload_interface_trigger "$iface"
++}
++
++add_globals() {
++ local cfg="$1"
++
++ config_get_bool SSHMODE "$cfg" sshmode 0
++ [ $SSHMODE -eq 0 ] || procd_append_param command -S
++
++ config_list_foreach "$cfg" interface add_interface
++}
++
++start_service() {
++ . /lib/functions/network.sh
++
++ procd_open_instance
++
++ procd_add_reload_trigger mactelnet
++ procd_set_param command "$PROG" -f
++
++ config_load mactelnet
++ config_foreach add_globals mactelnetd
++
++ [ $SSHMODE -eq 1 ] || {
++ rm -f $USERS
++ config_foreach add_account login
++ }
++
++ procd_close_instance
++}
++
+diff --git a/feeds/packages/net/mdnsresponder/Makefile b/feeds/packages/net/mdnsresponder/Makefile
+new file mode 100644
+index 0000000..cfc5527
+--- /dev/null
++++ b/feeds/packages/net/mdnsresponder/Makefile
+@@ -0,0 +1,163 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mDNSResponder
++PKG_VERSION:=567
++PKG_RELEASE:=2
++
++PKG_SOURCE:=mDNSResponder-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://opensource.apple.com/tarballs/mDNSResponder/
++PKG_MD5SUM:=6eff6d243a12a3d4b6fca03c05a9893b
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=Apache-2.0
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/mDNSResponder-$(PKG_VERSION)
++
++PKG_BUILD_PARALLEL:=0
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++# sys/capability.h is not part of *libc*
++PKG_BUILD_DEPENDS:=libcap
++
++define Package/mDNSResponder/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ TITLE:=mDNS
++ URL:=http://developer.apple.com/networking/bonjour/
++endef
++
++define Package/mDNSResponder/Default/description
++ Bonjour, also known as zero-configuration networking, enables
++ automatic discovery of computers, devices, and services on
++ IP networks.
++endef
++
++define Package/mdns-utils
++$(call Package/mDNSResponder/Default)
++ TITLE+= client utilities
++ DEPENDS+= +mdnsd
++endef
++
++define Package/mdns-utils/description
++$(call Package/mDNSResponder/Default/description)
++ .
++ This package contains mDNS client utilities:
++ - dns-sd
++ - mDNSClient
++ - mDNSIdentify
++ - mDNSNetMonitor
++ - mDNSProxyResponder
++ - mDNSResponder
++endef
++
++define Package/mdnsd
++$(call Package/mDNSResponder/Default)
++ TITLE+= server daemon
++endef
++
++define Package/mdnsd/description
++$(call Package/mDNSResponder/Default/description)
++ .
++ This package contains the mDNS server daemon.
++endef
++
++define Package/mdnsresponder
++$(call Package/mDNSResponder/Default)
++ TITLE+= suite (meta)
++ DEPENDS+= +mdns-utils +mdnsd
++endef
++
++define Package/mdnsresponder/description
++$(call Package/mDNSResponder/Default/description)
++ .
++ This meta package contains only dependencies on other packages.
++endef
++
++# I have no idea why -lc is required, but without it, C library symbols are
++# not found:
++MAKE_FLAGS += \
++ CFLAGS_DEBUG="$(TARGET_CFLAGS)" \
++ LINKOPTS=-lc \
++ LDCONFIG= \
++ ETCBASE="$(PKG_INSTALL_DIR)/etc" \
++ INSTBASE="$(PKG_INSTALL_DIR)/usr" \
++ NSSINSTPATH="$(PKG_INSTALL_DIR)/lib" \
++ MANPATH="$(PKG_INSTALL_DIR)/usr/man" \
++ STARTUPSCRIPTDIR="$(PKG_INSTALL_DIR)/etc/init.d" \
++ RUNLEVELSCRIPTSDIR="$(PKG_INSTALL_DIR)/etc/rc.d" \
++ os=linux-uclibc
++MAKE_PATH = mDNSPosix
++
++define Build/Compile
++ $(call Build/Compile/Default)
++ # XXX: mDNSResponder's "make install" does not seem to create:
++ mkdir -p $(PKG_INSTALL_DIR)/lib/
++ mkdir -p $(PKG_INSTALL_DIR)/usr/bin/
++ mkdir -p $(PKG_INSTALL_DIR)/usr/sbin/
++ mkdir -p $(PKG_INSTALL_DIR)/usr/lib/
++ mkdir -p $(PKG_INSTALL_DIR)/usr/man/man5/
++ mkdir -p $(PKG_INSTALL_DIR)/usr/man/man8/
++ mkdir -p $(PKG_INSTALL_DIR)/usr/include/
++ mkdir -p $(PKG_INSTALL_DIR)/etc/
++ mkdir -p $(PKG_INSTALL_DIR)/etc/init.d/
++ mkdir -p $(PKG_INSTALL_DIR)/etc/rc.d/
++ mkdir -p $(PKG_INSTALL_DIR)/etc/rc.d/rc2.d/
++ mkdir -p $(PKG_INSTALL_DIR)/etc/rc.d/rc3.d/
++ mkdir -p $(PKG_INSTALL_DIR)/etc/rc.d/rc4.d/
++ mkdir -p $(PKG_INSTALL_DIR)/etc/rc.d/rc5.d/
++ mkdir -p $(PKG_INSTALL_DIR)/etc/rc.d/rc0.d/
++ mkdir -p $(PKG_INSTALL_DIR)/etc/rc.d/rc6.d/
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_BUILD_DIR)/mDNSShared/dns_sd.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/mDNSPosix/build/prod/*.so* $(1)/usr/lib/
++endef
++
++define Package/mdns-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/dns-sd $(1)/usr/bin/
++ $(CP) $(PKG_BUILD_DIR)/mDNSPosix/build/prod/mDNSClientPosix $(1)/usr/bin/mDNSClient
++ $(CP) $(PKG_BUILD_DIR)/mDNSPosix/build/prod/mDNSIdentify $(1)/usr/bin/mDNSIdentify
++ $(CP) $(PKG_BUILD_DIR)/mDNSPosix/build/prod/mDNSNetMonitor $(1)/usr/bin/mDNSNetMonitor
++ $(CP) $(PKG_BUILD_DIR)/mDNSPosix/build/prod/mDNSProxyResponderPosix $(1)/usr/bin/mDNSProxyResponder
++ $(CP) $(PKG_BUILD_DIR)/mDNSPosix/build/prod/mDNSResponderPosix $(1)/usr/bin/mDNSResponder
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) ./files/mDNSResponder.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/mDNSResponder.init $(1)/etc/init.d/mDNSResponder
++endef
++
++define Package/mdns-utils/conffiles
++/etc/mDNSResponder.conf
++endef
++
++define Package/mdnsd/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/mdnsd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/mdnsd.init $(1)/etc/init.d/mdnsd
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdns_sd.so.1 $(1)/usr/lib/
++ $(LN) -s libdns_sd.so.1 $(1)/usr/lib/libdns_sd.so
++endef
++
++define Package/mdnsresponder/install
++ :
++endef
++
++$(eval $(call BuildPackage,mdns-utils))
++$(eval $(call BuildPackage,mdnsd))
++$(eval $(call BuildPackage,mdnsresponder))
+diff --git a/feeds/packages/net/mdnsresponder/files/mDNSResponder.conf b/feeds/packages/net/mdnsresponder/files/mDNSResponder.conf
+new file mode 100644
+index 0000000..23aab16
+--- /dev/null
++++ b/feeds/packages/net/mdnsresponder/files/mDNSResponder.conf
+@@ -0,0 +1,4 @@
++"OpenWrt SSH"
++_ssh._tcp. local
++22
++OpenWrt SSH server
+diff --git a/feeds/packages/net/mdnsresponder/files/mDNSResponder.init b/feeds/packages/net/mdnsresponder/files/mDNSResponder.init
+new file mode 100644
+index 0000000..87f9e90
+--- /dev/null
++++ b/feeds/packages/net/mdnsresponder/files/mDNSResponder.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2011 OpenWrt.org
++
++START=61
++
++SERVICE_USE_PID=1
++
++start() {
++ service_start /usr/bin/mDNSResponder -b -f /etc/mDNSResponder.conf
++}
++
++stop() {
++ service_stop /usr/bin/mDNSResponder
++}
+diff --git a/feeds/packages/net/mdnsresponder/files/mdnsd.init b/feeds/packages/net/mdnsresponder/files/mdnsd.init
+new file mode 100755
+index 0000000..817604b
+--- /dev/null
++++ b/feeds/packages/net/mdnsresponder/files/mdnsd.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2014 OpenWrt.org
++
++START=60
++STOP=10
++USE_PROCD=1
++
++start_service() {
++ procd_open_instance
++ procd_set_param command /usr/sbin/mdnsd -debug
++ procd_set_param respawn
++ procd_close_instance
++}
++
+diff --git a/feeds/packages/net/mdnsresponder/patches/001-cross_compile.patch b/feeds/packages/net/mdnsresponder/patches/001-cross_compile.patch
+new file mode 100644
+index 0000000..b1685fc
+--- /dev/null
++++ b/feeds/packages/net/mdnsresponder/patches/001-cross_compile.patch
+@@ -0,0 +1,115 @@
++--- a/Clients/Makefile
+++++ b/Clients/Makefile
++@@ -27,6 +27,8 @@
++
++ #############################################################################
++
+++CC = @cc
+++
++ # On OS X the dns_sd library functions are included in libSystem, which is implicitly linked with every executable
++ # If /usr/lib/libSystem.dylib exists, then we're on OS X, so we don't need also to link the "dns_sd" shared library
++ ifneq "$(wildcard /usr/lib/libSystem.dylib)" ""
++@@ -46,10 +48,10 @@ build:
++ mkdir build
++
++ build/dns-sd: build dns-sd.c ClientCommon.c
++- $(CC) $(filter %.c %.o, $+) $(LIBS) -I../mDNSShared -Wall -o $@
+++ $(CC) $(CFLAGS) $(filter %.c %.o, $+) $(LIBS) -I../mDNSShared -Wall -o $@
++
++ build/dns-sd64: build dns-sd.c ClientCommon.c
++- $(CC) $(filter %.c %.o, $+) $(LIBS) -I../mDNSShared -Wall -o $@ -m64
+++ $(CC) $(CFLAGS) $(filter %.c %.o, $+) $(LIBS) -I../mDNSShared -Wall -o $@ -m64
++
++ # Note, we can make a 'fat' version of dns-sd using 'lipo', as shown below, but we
++ # don't, because we don't want or need a 'fat' version of dns-sd, because it will
++--- a/mDNSPosix/Makefile
+++++ b/mDNSPosix/Makefile
++@@ -54,11 +54,12 @@ COREDIR = ../mDNSCore
++ SHAREDDIR ?= ../mDNSShared
++ JDK = /usr/jdk
++
++-CC = @cc
+++CC = @gcc
++ BISON = @bison
++ FLEX = @flex
++ ST = @strip
++-LD = ld -shared
+++LD = @ld
+++SOOPTS = -shared
++ CP = cp
++ RM = rm
++ LN = ln -s -f
++@@ -92,7 +93,7 @@ CFLAGS_DEBUG = -O0 -DMDNS_DEBUGMSGS=0
++ CFLAGS_OS = -DNOT_HAVE_DAEMON -DNOT_HAVE_SA_LEN -DNOT_HAVE_SOCKLEN_T -DNOT_HAVE_IF_NAMETOINDEX \
++ -DLOG_PERROR=0 -D_XPG4_2 -D__EXTENSIONS__ -DHAVE_BROKEN_RECVIF_NAME -DTARGET_OS_SOLARIS
++ CC = gcc
++-LD = gcc -shared
+++LD = gcc
++ LINKOPTS = -lsocket -lnsl -lresolv
++ JAVACFLAGS_OS += -I$(JDK)/include/solaris
++ ifneq ($(DEBUG),1)
++@@ -148,7 +149,8 @@ CFLAGS_OS = -DHAVE_IPV6 -no-cpp-precomp
++ -D__MAC_OS_X_VERSION_MIN_REQUIRED=__MAC_OS_X_VERSION_10_4 \
++ -D__APPLE_USE_RFC_2292 #-Wunreachable-code
++ CC = gcc
++-LD = $(CC) -dynamiclib
+++LD = $(CC)
+++SOOPTS= -dynamiclib
++ LINKOPTS = -lSystem
++ LDSUFFIX = dylib
++ JDK = /System/Library/Frameworks/JavaVM.framework/Home
++@@ -170,8 +172,9 @@ NSSLIBFILE := $(NSSLIBNAME)-$(NSSVERSIO
++ NSSLINKNAME := $(NSSLIBNAME).so.2
++ NSSINSTPATH := /lib
++
++-# If not otherwise defined, we install into /usr/lib and /usr/include
+++# If not otherwise defined, we install into /usr/lib, /usr/include and /etc
++ # and our startup script is called mdns (e.g. /etc/init.d/mdns)
+++ETCBASE?=/etc
++ INSTBASE?=/usr
++ STARTUPSCRIPTNAME?=mdns
++
++@@ -257,7 +260,7 @@ libdns_sd: setup $(BUILDDIR)/libdns_sd.$
++ CLIENTLIBOBJS = $(OBJDIR)/dnssd_clientlib.c.so.o $(OBJDIR)/dnssd_clientstub.c.so.o $(OBJDIR)/dnssd_ipc.c.so.o
++
++ $(BUILDDIR)/libdns_sd.$(LDSUFFIX): $(CLIENTLIBOBJS)
++- @$(LD) $(LINKOPTS) -o $@ $+
+++ @$(LD) $(SOOPTS) $(LINKOPTS) -o $@ $+
++ @$(STRIP) $@
++
++ Clients: setup libdns_sd ../Clients/build/dns-sd
++@@ -292,7 +295,7 @@ InstalledManPages: $(MANPATH)/man8/mdnsd
++ InstalledClients: $(INSTBASE)/bin/dns-sd
++ @echo $+ " installed"
++
++-InstalledNSS: $(NSSINSTPATH)/$(NSSLINKNAME) /etc/nss_mdns.conf $(MANPATH)/man5/nss_mdns.conf.5 $(MANPATH)/man8/libnss_mdns.8
+++InstalledNSS: $(NSSINSTPATH)/$(NSSLINKNAME) $(ETCBASE)/nss_mdns.conf $(MANPATH)/man5/nss_mdns.conf.5 $(MANPATH)/man8/libnss_mdns.8
++ @echo $+ " installed"
++
++ # Note: If daemon already installed, we make sure it's stopped before overwriting it
++@@ -347,19 +350,21 @@ $(INSTBASE)/bin/dns-sd: ../Clients/build
++
++ $(NSSINSTPATH)/$(NSSLINKNAME): $(NSSINSTPATH)/$(NSSLIBFILE)
++ $(LN) $< $@
++- ldconfig
+++ifdef LDCONFIG
+++ $(LDCONFIG)
+++endif
++
++ $(NSSINSTPATH)/$(NSSLIBFILE): $(BUILDDIR)/$(NSSLIBFILE)
++ $(CP) $< $@
++ chmod 444 $@
++
++-/etc/nss_mdns.conf: nss_mdns.conf
+++$(ETCBASE)/nss_mdns.conf: nss_mdns.conf
++ $(CP) $< $@
++ chmod 444 $@
++ # Check the nsswitch.conf file.
++ # If 'mdns' does not already appear on the "hosts:" line, then add it right before 'dns'
++- cp -f /etc/nsswitch.conf /etc/nsswitch.conf.pre-mdns
++- sed -e '/mdns/!s/^\(hosts:.*\)dns\(.*\)/\1mdns dns\2/' /etc/nsswitch.conf.pre-mdns > /etc/nsswitch.conf
+++ -[ -f $(ETCBASE)/nsswitch.conf ] && cp -f $(ETCBASE)/nsswitch.conf $(ETCBASE)/nsswitch.conf.pre-mdns
+++ -[ -f $(ETCBASE)/nsswitch.conf ] && sed -e '/mdns/!s/^\(hosts:.*\)dns\(.*\)/\1mdns dns\2/' $(ETCBASE)/nsswitch.conf.pre-mdns > $(ETCBASE)/nsswitch.conf
++
++ #############################################################################
++
+diff --git a/feeds/packages/net/mdnsresponder/patches/100-linux_fixes.patch b/feeds/packages/net/mdnsresponder/patches/100-linux_fixes.patch
+new file mode 100644
+index 0000000..df56608
+--- /dev/null
++++ b/feeds/packages/net/mdnsresponder/patches/100-linux_fixes.patch
+@@ -0,0 +1,403 @@
++diff --git a/.gitignore b/.gitignore
++new file mode 100644
++index 0000000..920cdfc
++--- /dev/null
+++++ b/.gitignore
++@@ -0,0 +1,4 @@
+++Clients/build
+++mDNSPosix/build
+++mDNSPosix/objects
+++
++diff --git a/Clients/Makefile b/Clients/Makefile
++index 383af31..925c20e 100755
++--- a/Clients/Makefile
+++++ b/Clients/Makefile
++@@ -34,7 +34,7 @@ TARGETS = build/dns-sd build/dns-sd64
++ LIBS =
++ else
++ TARGETS = build/dns-sd
++-LIBS = -L../mDNSPosix/build/prod/ -ldns_sd
+++LIBS ?= -L../mDNSPosix/build/prod/ -ldns_sd
++ endif
++
++ all: $(TARGETS)
++diff --git a/mDNSPosix/PosixDaemon.c b/mDNSPosix/PosixDaemon.c
++index 88b3292..e86a6c7 100644
++--- a/mDNSPosix/PosixDaemon.c
+++++ b/mDNSPosix/PosixDaemon.c
++@@ -37,6 +37,11 @@
++ #include <fcntl.h>
++ #include <pwd.h>
++ #include <sys/types.h>
+++#ifdef __linux__
+++#include <sys/capability.h> /* !!! We require libcap-dev for this. Oh well. */
+++/* prctl is required to enable inheriting of capabilities across setuid */
+++#include <sys/prctl.h>
+++#endif /* __linux__ */
++
++ #if __APPLE__
++ #undef daemon
++@@ -184,16 +189,50 @@ int main(int argc, char **argv)
++
++ Reconfigure(&mDNSStorage);
++
+++#ifdef __linux__
+++ /*
+++ * SO_BINDTODEVICE is privileged operation; however, we can get
+++ * around it using capabilities instead of remaining root.
+++ */
+++ if (mStatus_NoError == err)
+++ {
+++ if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) < 0)
+++ perror("prctl PR_SET_KEEPCAPS");
+++ }
+++#endif /* __linux__ */
+++
++ // Now that we're finished with anything privileged, switch over to running as "nobody"
++ if (mStatus_NoError == err)
++ {
++ const struct passwd *pw = getpwnam("nobody");
++ if (pw != NULL)
+++ {
++ setuid(pw->pw_uid);
+++#ifdef __linux__
+++ struct __user_cap_header_struct ch;
+++ struct __user_cap_data_struct cd[_LINUX_CAPABILITY_U32S_3];
+++
+++ memset(&ch, 0, sizeof(ch));
+++ ch.version = _LINUX_CAPABILITY_VERSION_3;
+++ ch.pid = getpid();
+++ memset(&cd[0], 0, sizeof(cd));
+++ /* CAP_NET_RAW is required to use SO_BINDTODEVICE */
+++ int caps = CAP_TO_MASK(CAP_NET_RAW);
+++ cd[0].permitted = caps;
+++ cd[0].effective = caps;
+++ if (capset(&ch, &cd[0]) < 0)
+++ perror("capset");
+++#endif /* __linux__ */
+++ }
++ else
++ LogMsg("WARNING: mdnsd continuing as root because user \"nobody\" does not exist");
++ }
++
+++#ifdef __linux__
+++ if (mStatus_NoError == err)
+++ err = mDNSPlatformPosixRefreshInterfaceList(&mDNSStorage);
+++#endif /* __linux__ */
+++
++ if (mStatus_NoError == err)
++ err = MainLoop(&mDNSStorage);
++
++diff --git a/mDNSPosix/Responder.c b/mDNSPosix/Responder.c
++index 3996b7b..e58d8eb 100755
++--- a/mDNSPosix/Responder.c
+++++ b/mDNSPosix/Responder.c
++@@ -603,7 +603,8 @@ static mStatus RegisterServicesInFile(const char *filePath)
++ status = mStatus_UnknownErr;
++ }
++
++- assert(0 == fclose(fp));
+++ int rv = fclose(fp);
+++ assert(0 == rv);
++
++ return status;
++ }
++diff --git a/mDNSPosix/mDNSPosix.c b/mDNSPosix/mDNSPosix.c
++index 6effa12..7c1d6eb 100755
++--- a/mDNSPosix/mDNSPosix.c
+++++ b/mDNSPosix/mDNSPosix.c
++@@ -138,7 +138,7 @@ mDNSlocal void SockAddrTomDNSAddr(const struct sockaddr *const sa, mDNSAddr *ipA
++
++ // mDNS core calls this routine when it needs to send a packet.
++ mDNSexport mStatus mDNSPlatformSendUDP(const mDNS *const m, const void *const msg, const mDNSu8 *const end,
++- mDNSInterfaceID InterfaceID, UDPSocket *src, const mDNSAddr *dst,
+++ mDNSInterfaceID InterfaceID, UDPSocket *src, const mDNSAddr *dst,
++ mDNSIPPort dstPort, mDNSBool useBackgroundTrafficClass)
++ {
++ int err = 0;
++@@ -583,9 +583,17 @@ mDNSlocal void FreePosixNetworkInterface(PosixNetworkInterface *intf)
++ {
++ assert(intf != NULL);
++ if (intf->intfName != NULL) free((void *)intf->intfName);
++- if (intf->multicastSocket4 != -1) assert(close(intf->multicastSocket4) == 0);
+++ if (intf->multicastSocket4 != -1)
+++ {
+++ int rv = close(intf->multicastSocket4);
+++ assert(rv == 0);
+++ }
++ #if HAVE_IPV6
++- if (intf->multicastSocket6 != -1) assert(close(intf->multicastSocket6) == 0);
+++ if (intf->multicastSocket6 != -1)
+++ {
+++ int rv = close(intf->multicastSocket6);
+++ assert(rv == 0);
+++ }
++ #endif
++
++ // Move interface to the RecentInterfaces list for a minute
++@@ -724,6 +732,29 @@ mDNSlocal int SetupSocket(struct sockaddr *intfAddr, mDNSIPPort port, int interf
++ if (err < 0) { err = errno; perror("setsockopt - IP_MULTICAST_TTL"); }
++ }
++
+++#ifdef __linux__
+++#ifdef SO_BINDTODEVICE
+++ if (err == 0 && interfaceIndex)
+++ {
+++ char ifname[IFNAMSIZ];
+++ if (if_indextoname(interfaceIndex, ifname))
+++ {
+++ err = setsockopt(*sktPtr, SOL_SOCKET, SO_BINDTODEVICE, ifname, strlen(ifname));
+++ if (err < 0)
+++ {
+++ err = errno;
+++ perror("setsockopt - SO_BINDTODEVICE");
+++ }
+++ }
+++ else
+++ {
+++ err = errno;
+++ perror("if_indextoname");
+++ }
+++ }
+++#endif /* SO_BINDTODEVICE */
+++#endif /* __linux__ */
+++
++ // And start listening for packets
++ if (err == 0)
++ {
++@@ -805,6 +836,29 @@ mDNSlocal int SetupSocket(struct sockaddr *intfAddr, mDNSIPPort port, int interf
++ if (err < 0) { err = errno; perror("setsockopt - IPV6_MULTICAST_HOPS"); }
++ }
++
+++#ifdef __linux__
+++#ifdef SO_BINDTODEVICE
+++ if (err == 0 && interfaceIndex)
+++ {
+++ char ifname[IFNAMSIZ];
+++ if (if_indextoname(interfaceIndex, ifname))
+++ {
+++ err = setsockopt(*sktPtr, SOL_SOCKET, SO_BINDTODEVICE, ifname, strlen(ifname));
+++ if (err < 0)
+++ {
+++ err = errno;
+++ perror("setsockopt - SO_BINDTODEVICE");
+++ }
+++ }
+++ else
+++ {
+++ err = errno;
+++ perror("if_indextoname");
+++ }
+++ }
+++#endif /* SO_BINDTODEVICE */
+++#endif /* __linux__ */
+++
++ // And start listening for packets
++ if (err == 0)
++ {
++@@ -836,7 +890,12 @@ mDNSlocal int SetupSocket(struct sockaddr *intfAddr, mDNSIPPort port, int interf
++ }
++
++ // Clean up
++- if (err != 0 && *sktPtr != -1) { assert(close(*sktPtr) == 0); *sktPtr = -1; }
+++ if (err != 0 && *sktPtr != -1)
+++ {
+++ int rv = close(*sktPtr);
+++ assert(rv == 0);
+++ *sktPtr = -1;
+++ }
++ assert((err == 0) == (*sktPtr != -1));
++ return err;
++ }
++@@ -938,19 +997,14 @@ mDNSlocal int SetupInterfaceList(mDNS *const m)
++ int err = 0;
++ struct ifi_info *intfList = get_ifi_info(AF_INET, mDNStrue);
++ struct ifi_info *firstLoopback = NULL;
+++ struct ifi_info **p = &intfList;
++
++ assert(m != NULL);
++ debugf("SetupInterfaceList");
++
++- if (intfList == NULL) err = ENOENT;
++-
++ #if HAVE_IPV6
++- if (err == 0) /* Link the IPv6 list to the end of the IPv4 list */
++- {
++- struct ifi_info **p = &intfList;
++- while (*p) p = &(*p)->ifi_next;
++- *p = get_ifi_info(AF_INET6, mDNStrue);
++- }
+++ while (*p) p = &(*p)->ifi_next;
+++ *p = get_ifi_info(AF_INET6, mDNStrue);
++ #endif
++
++ if (err == 0)
++@@ -1026,7 +1080,7 @@ mDNSlocal mStatus OpenIfNotifySocket(int *pFD)
++ /* Subscribe the socket to Link & IP addr notifications. */
++ mDNSPlatformMemZero(&snl, sizeof snl);
++ snl.nl_family = AF_NETLINK;
++- snl.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR;
+++ snl.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR;
++ ret = bind(sock, (struct sockaddr *) &snl, sizeof snl);
++ if (0 == ret)
++ *pFD = sock;
++@@ -1104,11 +1158,18 @@ mDNSlocal mDNSu32 ProcessRoutingNotification(int sd)
++ PrintNetLinkMsg(pNLMsg);
++ #endif
++
+++ // this result isn't used anywhere as a number, just as
+++ // non-zero - however, I have seen devices with more than 32
+++ // interfaces at some point..
+++ // (on Linux, every tunnel increases index for example)
+++
++ // Process the NetLink message
++ if (pNLMsg->nlmsg_type == RTM_GETLINK || pNLMsg->nlmsg_type == RTM_NEWLINK)
++- result |= 1 << ((struct ifinfomsg*) NLMSG_DATA(pNLMsg))->ifi_index;
+++ result |= 1;
+++ // << ((struct ifinfomsg*) NLMSG_DATA(pNLMsg))->ifi_index;
++ else if (pNLMsg->nlmsg_type == RTM_DELADDR || pNLMsg->nlmsg_type == RTM_NEWADDR)
++- result |= 1 << ((struct ifaddrmsg*) NLMSG_DATA(pNLMsg))->ifa_index;
+++ result |= 1;
+++ // << ((struct ifaddrmsg*) NLMSG_DATA(pNLMsg))->ifa_index;
++
++ // Advance pNLMsg to the next message in the buffer
++ if ((pNLMsg->nlmsg_flags & NLM_F_MULTI) != 0 && pNLMsg->nlmsg_type != NLMSG_DONE)
++@@ -1279,8 +1340,12 @@ mDNSexport mStatus mDNSPlatformInit(mDNS *const m)
++ if (err == mStatus_NoError) err = SetupSocket(&sa, zeroIPPort, 0, &m->p->unicastSocket6);
++ #endif
++
+++ // In Linux case, we can't set up sockets with different owner -
+++ // it blows up SO_REUSEPORT. So we do this step bit later.
+++#ifndef __linux__
++ // Tell mDNS core about the network interfaces on this machine.
++ if (err == mStatus_NoError) err = SetupInterfaceList(m);
+++#endif /* !__linux__ */
++
++ // Tell mDNS core about DNS Servers
++ mDNS_Lock(m);
++@@ -1313,9 +1378,17 @@ mDNSexport void mDNSPlatformClose(mDNS *const m)
++ {
++ assert(m != NULL);
++ ClearInterfaceList(m);
++- if (m->p->unicastSocket4 != -1) assert(close(m->p->unicastSocket4) == 0);
+++ if (m->p->unicastSocket4 != -1)
+++ {
+++ int rv = close(m->p->unicastSocket4);
+++ assert(rv == 0);
+++ }
++ #if HAVE_IPV6
++- if (m->p->unicastSocket6 != -1) assert(close(m->p->unicastSocket6) == 0);
+++ if (m->p->unicastSocket6 != -1)
+++ {
+++ int rv = close(m->p->unicastSocket6);
+++ assert(rv == 0);
+++ }
++ #endif
++ }
++
++@@ -1571,14 +1644,14 @@ mDNSexport mStatus mDNSPlatformClearSPSMACAddr(void)
++ mDNSexport mDNSu16 mDNSPlatformGetUDPPort(UDPSocket *sock)
++ {
++ (void) sock; // unused
++-
+++
++ return (mDNSu16)-1;
++ }
++
++ mDNSexport mDNSBool mDNSPlatformInterfaceIsD2D(mDNSInterfaceID InterfaceID)
++ {
++ (void) InterfaceID; // unused
++-
+++
++ return mDNSfalse;
++ }
++
++diff --git a/mDNSPosix/mDNSUNP.c b/mDNSPosix/mDNSUNP.c
++index b392fc7..f551ad5 100755
++--- a/mDNSPosix/mDNSUNP.c
+++++ b/mDNSPosix/mDNSUNP.c
++@@ -63,6 +63,7 @@
++ #if defined(AF_INET6) && HAVE_IPV6 && HAVE_LINUX
++ #include <netdb.h>
++ #include <arpa/inet.h>
+++#include <linux/if_addr.h>
++
++ /* Converts a prefix length to IPv6 network mask */
++ void plen_to_mask(int plen, char *addr) {
++@@ -86,7 +87,7 @@ struct ifi_info *get_ifi_info_linuxv6(int family, int doaliases)
++ FILE *fp;
++ char addr[8][5];
++ int flags, myflags, index, plen, scope;
++- char ifname[9], lastname[IFNAMSIZ];
+++ char ifname[IFNAMSIZ], lastname[IFNAMSIZ];
++ char addr6[32+7+1]; /* don't forget the seven ':' */
++ struct addrinfo hints, *res0;
++ struct sockaddr_in6 *sin6;
++@@ -94,7 +95,8 @@ struct ifi_info *get_ifi_info_linuxv6(int family, int doaliases)
++ int err;
++ int sockfd = -1;
++ struct ifreq ifr;
++-
+++ char mask[64] = "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %";
+++ sprintf(mask+strlen(mask), "%ds\n", IFNAMSIZ);
++ res0=NULL;
++ ifihead = NULL;
++ ifipnext = &ifihead;
++@@ -106,11 +108,12 @@ struct ifi_info *get_ifi_info_linuxv6(int family, int doaliases)
++ goto gotError;
++ }
++ while (fscanf(fp,
++- "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %8s\n",
+++ mask,
++ addr[0],addr[1],addr[2],addr[3],
++ addr[4],addr[5],addr[6],addr[7],
++ &index, &plen, &scope, &flags, ifname) != EOF) {
++
+++ if (flags & IFA_F_DEPRECATED) continue;
++ myflags = 0;
++ if (strncmp(lastname, ifname, IFNAMSIZ) == 0) {
++ if (doaliases == 0)
++@@ -204,8 +207,11 @@ gotError:
++ res0=NULL;
++ }
++ done:
+++ if (fp)
+++ fclose(fp);
++ if (sockfd != -1) {
++- assert(close(sockfd) == 0);
+++ int rv = close(sockfd);
+++ assert(rv == 0);
++ }
++ return(ifihead); /* pointer to first structure in linked list */
++ }
++diff --git a/mDNSShared/dnsextd_parser.y b/mDNSShared/dnsextd_parser.y
++index 18c5990..d4b63ce 100644
++--- a/mDNSShared/dnsextd_parser.y
+++++ b/mDNSShared/dnsextd_parser.y
++@@ -15,6 +15,8 @@
++ * limitations under the License.
++ */
++
+++%parse-param { void *context }
+++
++ %{
++ #include <stdio.h>
++ #include <stdlib.h>
++@@ -23,7 +25,7 @@
++ #include "DebugServices.h"
++ #include "dnsextd.h"
++
++-void yyerror( const char* error );
+++void yyerror( void *context, const char* error );
++ int yylex(void);
++
++
++@@ -378,7 +380,7 @@ int yywrap(void);
++
++ extern int yylineno;
++
++-void yyerror( const char *str )
+++void yyerror( void *context, const char *str )
++ {
++ fprintf( stderr,"%s:%d: error: %s\n", g_filename, yylineno, str );
++ }
+diff --git a/feeds/packages/net/memcached/Makefile b/feeds/packages/net/memcached/Makefile
+new file mode 100644
+index 0000000..211cfe0
+--- /dev/null
++++ b/feeds/packages/net/memcached/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2009-2012 OpenWrt.org
++# Copyright (C) 2009-2014 Thomas Heil <heil@terminal-consulting.de>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=memcached
++PKG_VERSION:=1.4.24
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://memcached.org/files
++PKG_MD5SUM:=4d6e8c90e2068580526c7579dd7f37f6
++PKG_INSTALL:=1
++PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
++PKG_LICENSE:=permissive free software license
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/memcached
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libevent2 +libpthread
++ TITLE:=The high-performance, distributed memory object caching system
++ URL:=http://memcached.org/
++endef
++
++define Package/memcached/description
++ Free and open source, high-performance, distributed memory object caching system
++endef
++
++define Package/memcached/conffiles
++/etc/config/memcached
++endef
++
++ifeq ($(CONFIG_BIG_ENDIAN),y)
++CONFIGURE_VARS += ac_cv_c_endian=big
++else
++CONFIGURE_VARS += ac_cv_c_endian=little
++endif
++
++CONFIGURE_ARGS += \
++ --with-libevent=$(STAGING_DIR)/usr/include/libevent \
++ --disable-docs \
++ --disable-dtrace \
++ --disable-coverage \
++ --disable-sasl
++
++TARGET_CFLAGS += \
++ -std=gnu99
++
++TARGET_LDFLAGS = \
++ -L$(STAGING_DIR)/usr/lib/libevent -L$(STAGING_DIR)/usr/lib -L$(STAGING_DIR)/lib
++
++define Package/memcached/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/memcached $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/memcached.config $(1)/etc/config/memcached
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/memcached.init $(1)/etc/init.d/memcached
++endef
++
++$(eval $(call BuildPackage,memcached))
+diff --git a/feeds/packages/net/memcached/files/memcached.config b/feeds/packages/net/memcached/files/memcached.config
+new file mode 100644
+index 0000000..4071116
+--- /dev/null
++++ b/feeds/packages/net/memcached/files/memcached.config
+@@ -0,0 +1,6 @@
++config memcached
++ option user 'nobody'
++ option maxconn '1024'
++ option listen '0.0.0.0'
++ option port '11211'
++ option memory '64'
+diff --git a/feeds/packages/net/memcached/files/memcached.init b/feeds/packages/net/memcached/files/memcached.init
+new file mode 100644
+index 0000000..063bf64
+--- /dev/null
++++ b/feeds/packages/net/memcached/files/memcached.init
+@@ -0,0 +1,27 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2010-2011 OpenWrt.org
++
++START=80
++
++start_instance () {
++ local section="$1"
++
++ config_get user "$section" user
++ config_get maxconn "$section" maxconn
++ config_get listen "$section" listen
++ config_get port "$section" port
++ config_get memory "$section" memory
++
++ service_start /usr/bin/memcached -d -u ${user:-nobody} \
++ -c ${maxconn:-1024} -l ${listen:-0.0.0.0} \
++ -p ${port:-11211} -U ${port:-11211} -m ${memory:-64}
++}
++
++start() {
++ config_load 'memcached'
++ config_foreach start_instance 'memcached'
++}
++
++stop() {
++ service_stop /usr/bin/memcached
++}
+diff --git a/feeds/packages/net/memcached/patches/001-musl-compat.patch b/feeds/packages/net/memcached/patches/001-musl-compat.patch
+new file mode 100644
+index 0000000..558931e
+--- /dev/null
++++ b/feeds/packages/net/memcached/patches/001-musl-compat.patch
+@@ -0,0 +1,47 @@
++--- memcached-1.4.15.orig/assoc.c
+++++ memcached-1.4.15/assoc.c
++@@ -14,8 +14,8 @@
++ #include "memcached.h"
++ #include <sys/stat.h>
++ #include <sys/socket.h>
++-#include <sys/signal.h>
++ #include <sys/resource.h>
+++#include <signal.h>
++ #include <fcntl.h>
++ #include <netinet/in.h>
++ #include <errno.h>
++--- memcached-1.4.15.orig/items.c
+++++ memcached-1.4.15/items.c
++@@ -2,13 +2,13 @@
++ #include "memcached.h"
++ #include <sys/stat.h>
++ #include <sys/socket.h>
++-#include <sys/signal.h>
++ #include <sys/resource.h>
++ #include <fcntl.h>
++ #include <netinet/in.h>
++ #include <errno.h>
++ #include <stdlib.h>
++ #include <stdio.h>
+++#include <signal.h>
++ #include <string.h>
++ #include <time.h>
++ #include <assert.h>
++--- memcached-1.4.15.orig/slabs.c
+++++ memcached-1.4.15/slabs.c
++@@ -10,7 +10,6 @@
++ #include "memcached.h"
++ #include <sys/stat.h>
++ #include <sys/socket.h>
++-#include <sys/signal.h>
++ #include <sys/resource.h>
++ #include <fcntl.h>
++ #include <netinet/in.h>
++@@ -18,6 +17,7 @@
++ #include <stdlib.h>
++ #include <stdio.h>
++ #include <string.h>
+++#include <signal.h>
++ #include <assert.h>
++ #include <pthread.h>
++
+diff --git a/feeds/packages/net/memcached/patches/100-fix_iov_max.patch b/feeds/packages/net/memcached/patches/100-fix_iov_max.patch
+new file mode 100644
+index 0000000..1a5da94
+--- /dev/null
++++ b/feeds/packages/net/memcached/patches/100-fix_iov_max.patch
+@@ -0,0 +1,23 @@
++--- a/memcached.c
+++++ b/memcached.c
++@@ -13,6 +13,10 @@
++ * Anatoly Vorobey <mellon@pobox.com>
++ * Brad Fitzpatrick <brad@danga.com>
++ */
+++#ifndef __need_IOV_MAX
+++#define __need_IOV_MAX
+++#endif
+++
++ #include "memcached.h"
++ #include <sys/stat.h>
++ #include <sys/socket.h>
++@@ -29,9 +33,6 @@
++ #define _P1003_1B_VISIBLE
++ #endif
++ /* need this to get IOV_MAX on some platforms. */
++-#ifndef __need_IOV_MAX
++-#define __need_IOV_MAX
++-#endif
++ #include <pwd.h>
++ #include <sys/mman.h>
++ #include <fcntl.h>
+diff --git a/feeds/packages/net/miniupnpc/Makefile b/feeds/packages/net/miniupnpc/Makefile
+new file mode 100644
+index 0000000..fbf6222
+--- /dev/null
++++ b/feeds/packages/net/miniupnpc/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2010-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=miniupnpc
++PKG_VERSION:=1.9
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://miniupnp.free.fr/files
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=5ef3ba321e6df72d6519b728b292073e
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/miniupnpc/Default
++ TITLE:=Lightweight UPnP
++ URL:=http://miniupnp.tuxfamily.org/
++endef
++
++define Package/miniupnpc
++ $(call Package/miniupnpc/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Firewall
++ TITLE+= client
++ DEPENDS:=+libminiupnpc
++endef
++
++define Package/libminiupnpc
++ $(call Package/miniupnpc/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= library
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++MAKE_FLAGS += \
++ OS="Linux" \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/miniupnpc
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/miniupnpc/*.h \
++ $(1)/usr/include/miniupnpc/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.{so*,a} \
++ $(1)/usr/lib/
++endef
++
++define Package/miniupnpc/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/upnpc $(1)/usr/bin/
++endef
++
++define Package/libminiupnpc/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/lib/libminiupnpc.so.* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,miniupnpc))
++$(eval $(call BuildPackage,libminiupnpc))
+diff --git a/feeds/packages/net/miniupnpc/patches/100-no_minixml_test.patch b/feeds/packages/net/miniupnpc/patches/100-no_minixml_test.patch
+new file mode 100644
+index 0000000..93f6772
+--- /dev/null
++++ b/feeds/packages/net/miniupnpc/patches/100-no_minixml_test.patch
+@@ -0,0 +1,13 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -151,8 +151,8 @@ installpythonmodule3: pythonmodule3
++ python3 setup.py install
++
++ validateminixml: minixmlvalid
++- @echo "minixml validation test"
++- ./minixmlvalid
+++ @echo "(skipping) minixml validation test"
+++# ./minixmlvalid
++ touch $@
++
++ validateminiwget: testminiwget minihttptestserver testminiwget.sh
+diff --git a/feeds/packages/net/miniupnpc/patches/200-miniupnpc_desc.patch b/feeds/packages/net/miniupnpc/patches/200-miniupnpc_desc.patch
+new file mode 100644
+index 0000000..320707e
+--- /dev/null
++++ b/feeds/packages/net/miniupnpc/patches/200-miniupnpc_desc.patch
+@@ -0,0 +1,11 @@
++--- a/upnpcommands.c
+++++ b/upnpcommands.c
++@@ -367,7 +367,7 @@ UPNP_AddPortMapping(const char * control
++ AddPortMappingArgs[5].elt = "NewEnabled";
++ AddPortMappingArgs[5].val = "1";
++ AddPortMappingArgs[6].elt = "NewPortMappingDescription";
++- AddPortMappingArgs[6].val = desc?desc:"libminiupnpc";
+++ AddPortMappingArgs[6].val = desc?desc:"miniupnpc";
++ AddPortMappingArgs[7].elt = "NewLeaseDuration";
++ AddPortMappingArgs[7].val = leaseDuration?leaseDuration:"0";
++ if(!(buffer = simpleUPnPcommand(-1, controlURL, servicetype,
+diff --git a/feeds/packages/net/mosquitto/Config.in b/feeds/packages/net/mosquitto/Config.in
+new file mode 100644
+index 0000000..9fe48ce
+--- /dev/null
++++ b/feeds/packages/net/mosquitto/Config.in
+@@ -0,0 +1,6 @@
++config MOSQUITTO_LWS
++ bool "libwebsockets support"
++ depends on PACKAGE_mosquitto
++ default y
++ help
++ Includes websockets support in the broker, via libwebsockets
+diff --git a/feeds/packages/net/mosquitto/Makefile b/feeds/packages/net/mosquitto/Makefile
+new file mode 100644
+index 0000000..87ff529
+--- /dev/null
++++ b/feeds/packages/net/mosquitto/Makefile
+@@ -0,0 +1,198 @@
++#
++# Copyright (C) 2011-2013 OpenWrt.org
++# Copyright (C) 2010 Jo-Philipp Wich <xm@subsignal.org>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mosquitto
++PKG_VERSION:=1.4.4
++PKG_RELEASE:=1
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENSE.txt
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://mosquitto.org/files/source/
++PKG_MD5SUM:=89a57f11cdfec140fa21fe3d4493b2ca
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/$(PKG_NAME)/default
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=mosquitto - an MQTT message broker
++ URL:=http://www.mosquitto.org/
++ MAINTAINER:=Karl Palsson <karlp@remake.is>
++ DEPENDS:= +librt +libuuid
++ USERID:=mosquitto=200:mosquitto=200
++endef
++
++define Package/$(PKG_NAME)
++ $(call Package/mosquitto/default)
++ TITLE+= (with SSL support)
++ DEPENDS+= +libopenssl +MOSQUITTO_LWS:libwebsockets-openssl
++ VARIANT:=ssl
++endef
++
++define Package/$(PKG_NAME)-nossl
++ $(call Package/$(PKG_NAME)/default)
++ TITLE+= (without SSL support)
++ VARIANT:=nossl
++endef
++
++define Package/$(PKG_NAME)/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/$(PKG_NAME)/default/description
++Mosquitto is an open source (BSD licensed) message broker that implements
++the MQTT protocol version 3.1 and 3.1.1. MQTT provides a lightweight
++method of carrying out messaging using a publish/subscribe model.
++
++This package also includes some basic support for configuring via UCI
++endef
++
++define Package/$(PKG_NAME)/description
++ $(call Package/$(PKG_NAME)/default/description)
++ This package is built with SSL support
++endef
++
++define Package/$(PKG_NAME)-nossl/description
++ $(call Package/$(PKG_NAME)/default/description)
++ This package is built WITHOUT SSL support.
++endef
++
++
++define Package/mosquitto-client/default
++ $(Package/mosquitto/default)
++ TITLE:= mosquitto - client tools
++ DEPENDS+=+libcares
++endef
++define Package/mosquitto-client
++ $(call Package/mosquitto-client/default)
++ TITLE+= (With SSL support)
++ DEPENDS+=+libmosquitto
++ VARIANT:=ssl
++endef
++define Package/mosquitto-client-nossl
++ $(call Package/mosquitto-client/default)
++ TITLE+= (Without SSL support)
++ DEPENDS+=+libmosquitto-nossl
++ VARIANT:=nossl
++endef
++
++define Package/mosquitto-client/default/description
++ Command line client tools for publishing messages to MQTT servers
++and subscribing to topics.
++endef
++
++define Package/mosquitto-client/description
++$(call Package/mosquitto-client/default/description)
++ This package is built with SSL support
++endef
++define Package/mosquitto-client-nossl/description
++$(call Package/mosquitto-client/default/description)
++ This package is built without SSL support
++endef
++
++define Package/libmosquitto/default
++ $(Package/mosquitto/default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libpthread +librt +libcares
++ TITLE:= mosquitto - client library
++endef
++
++define Package/libmosquitto
++ $(call Package/libmosquitto/default)
++ TITLE+= (With SSL Support)
++ DEPENDS+= +libopenssl
++ VARIANT=ssl
++endef
++define Package/libmosquitto-nossl
++ $(call Package/libmosquitto/default)
++ TITLE+= (Without SSL Support)
++ VARIANT=nossl
++endef
++
++define Package/libmosquitto/default/description
++ Library required for mosquitto's command line client tools, also for
++use by any third party software that wants to communicate with a
++mosquitto server.
++
++Should be useable for communicating with any MQTT v3.1/3.1.1 compatible
++server, such as IBM's RSMB, in addition to Mosquitto
++endef
++
++define Package/libmosquitto/description
++ $(call Package/libmosquitto/default/description)
++ This package is built with SSL support
++endef
++define Package/libmosquitto-nossl/description
++ $(call Package/libmosquitto/default/description)
++ This package is built without SSL support
++endef
++
++
++define Package/$(PKG_NAME)/conffiles
++/etc/mosquitto/mosquitto.conf
++/etc/config/mosquitto
++endef
++
++Package/$(PKG_NAME)-nossl/conffiles = $(Package/$(PKG_NAME)/conffiles)
++
++define Package/$(PKG_NAME)/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/mosquitto $(1)/usr/sbin/mosquitto
++ $(INSTALL_DIR) $(1)/etc/mosquitto
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/mosquitto.conf $(1)/etc/mosquitto/mosquitto.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/mosquitto.init $(1)/etc/init.d/mosquitto
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) ./files/mosquitto.uci.convert $(1)/usr/bin
++endef
++Package/$(PKG_NAME)-nossl/install = $(Package/$(PKG_NAME)/install)
++
++
++define Package/mosquitto-client/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/client/mosquitto_pub $(1)/usr/bin/mosquitto_pub
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/client/mosquitto_sub $(1)/usr/bin/mosquitto_sub
++endef
++Package/mosquitto-client-nossl/install = $(Package/mosquitto-client/install)
++
++# This installs files into ./staging_dir/. so that you can cross compile from the host
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_BUILD_DIR)/lib/mosquitto.h $(1)/usr/include
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/lib/libmosquitto.so.1 $(1)/usr/lib/
++ $(LN) libmosquitto.so.1 $(1)/usr/lib/libmosquitto.so
++endef
++
++# This installs files on the target. Compare with Build/InstallDev
++define Package/libmosquitto/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/libmosquitto.so.1 $(1)/usr/lib/
++ $(LN) libmosquitto.so.1 $(1)/usr/lib/libmosquitto.so
++endef
++Package/libmosquitto-nossl/install = $(Package/libmosquitto/install)
++
++# Applies to all...
++MAKE_FLAGS += WITH_DOCS=no
++ifeq ($(BUILD_VARIANT),nossl)
++ MAKE_FLAGS += WITH_TLS=no WITH_WEBSOCKETS=no
++else
++ MAKE_FLAGS += WITH_WEBSOCKETS=$(if $(CONFIG_MOSQUITTO_LWS),"yes","no")
++endif
++
++$(eval $(call BuildPackage,$(PKG_NAME)))
++$(eval $(call BuildPackage,$(PKG_NAME)-nossl))
++$(eval $(call BuildPackage,libmosquitto))
++$(eval $(call BuildPackage,libmosquitto-nossl))
++$(eval $(call BuildPackage,mosquitto-client))
++$(eval $(call BuildPackage,mosquitto-client-nossl))
+diff --git a/feeds/packages/net/mosquitto/files/mosquitto.init b/feeds/packages/net/mosquitto/files/mosquitto.init
+new file mode 100755
+index 0000000..2b3a93a
+--- /dev/null
++++ b/feeds/packages/net/mosquitto/files/mosquitto.init
+@@ -0,0 +1,28 @@
++#!/bin/sh /etc/rc.common
++# Basic init script for mosquitto
++# April 2012, OpenWrt.org
++# Provides support for the luci-app-mosquitto package, if installed
++
++START=80
++APP=`which mosquitto`
++USE_UCI_CONFIG=$(uci -q get mosquitto.owrt.use_uci)
++if [ $? -eq 1 ]; then
++ USE_UCI_CONFIG=0
++fi
++
++SERVICE_DAEMONIZE=1
++SERVICE_WRITE_PID=1
++
++start() {
++ if [ "$USE_UCI_CONFIG" -eq 1 ]; then
++ CONF=/tmp/mosquitto.converted.$$.conf
++ mosquitto.uci.convert -f $CONF
++ else
++ CONF=/etc/mosquitto/mosquitto.conf
++ fi
++ service_start $APP -c $CONF
++}
++
++stop() {
++ service_stop $APP
++}
+diff --git a/feeds/packages/net/mosquitto/files/mosquitto.uci.convert b/feeds/packages/net/mosquitto/files/mosquitto.uci.convert
+new file mode 100644
+index 0000000..1a03d97
+--- /dev/null
++++ b/feeds/packages/net/mosquitto/files/mosquitto.uci.convert
+@@ -0,0 +1,134 @@
++#!/bin/sh
++# Converts a uci config file into an appropriate mosquitto.conf snippet
++# expected to be used in an init file to generate a config file to run from
++# Karl Palsson <karlp@remake.is> 2012.
++# Considered to be released into the public domain
++
++[ -f $IPKG_INSTROOT/lib/functions.sh ] && . $IPKG_INSTROOT/lib/functions.sh
++
++TCONF=/tmp/mosquitto.generated.$$.conf
++while getopts "f:" o; do
++ case $o in
++ f)
++ TCONF=$OPTARG
++ ;;
++ esac
++done
++
++if [ -e $TCONF ]; then
++ echo "Odd, same temporary generated config file already existed: $TCONF"
++ exit 1
++fi
++
++echo "Generating mosquitto config file in $TCONF"
++NOW=$(date)
++echo "# mosquitto.conf file generated from UCI config." >>$TCONF
++echo "# Config snippet generated by $0 on $NOW" >>$TCONF
++echo "#" >> $TCONF
++
++# Usage: append_if cfg uci_name output_name
++# add a config line of the form "output_name <value>"
++# if the "uci_name" was found.
++# output_name defaults to uci_name if not specified.
++append_if() {
++ local cfg="$1"
++ local uci_name="$2"
++ local out_name="$3"
++ if [ -z "$out_name" ]; then
++ out_name=$uci_name
++ fi
++ config_get val $cfg $uci_name
++ if [ -n "$val" ]; then
++ echo "$out_name $val" >> $TCONF
++ fi
++}
++
++# mosquitto uses true/false, uci uses 1/0
++# note that this is not shell truthy, but equality with 1!
++append_bool() {
++ if [ $2 -eq 1 ]; then
++ echo "$1 true" >> $TCONF
++ else
++ echo "$1 false" >> $TCONF
++ fi
++}
++
++# as per append_if, but gets the value as a uci bool, not raw
++append_optional_bool() {
++ local cfg="$1"
++ local uci_name="$2"
++ local out_name="$3"
++ config_get val $cfg $uci_name
++ if [ -n "$val" ]; then
++ config_get_bool real $cfg $uci_name
++ append_bool $out_name $real
++ fi
++}
++
++mosq_general() {
++ config_get destinations "$1" log_dest
++ for dest in $destinations; do
++ echo "log_dest $dest" >> $TCONF
++ done
++
++ config_get_bool no_remote "$1" no_remote_access 0
++ if [ "$no_remote" -eq 1 ]; then
++ echo "bind_address 127.0.0.1" >> $TCONF
++ fi
++
++ config_get port "$1" port 1883
++ echo "port $port" >> $TCONF
++ append_if "$1" protocol
++ append_if "$1" max_inflight_messages
++ append_if "$1" max_queued_messages
++
++}
++
++add_listener() {
++ echo "" >> $TCONF
++ config_get port "$1" port
++ if [ -z "$port" ]; then
++ echo "Ignoring listener section without port"
++ return
++ fi
++ config_get_bool no_remote "$1" no_remote_access 0
++ if [ "$no_remote" -eq 1 ]; then
++ echo "listener $port 127.0.0.1" >> $TCONF
++ else
++ echo "listener $port" >> $TCONF
++ fi
++
++ append_if "$1" protocol
++}
++
++add_topic() {
++ echo "topic $1" >> $TCONF
++}
++
++add_bridge() {
++ config_get conn "$1" connection
++ config_get addr "$1" address
++ if [ -z "$conn" -o -z "$addr" ]; then
++ echo "Ignoring bridge section, misisng connection/address"
++ return
++ fi
++ echo "" >> $TCONF
++ echo "# Bridge connection from UCI section" >> $TCONF
++ append_if "$1" connection
++ append_if "$1" address
++
++ config_list_foreach "$1" topic add_topic
++ append_optional_bool "$1" cleansession cleansession
++ append_optional_bool "$1" try_private try_private
++
++ append_if "$1" clientid
++ append_if "$1" identity bridge_identity
++ append_if "$1" psk bridge_psk
++ append_if "$1" tls_version bridge_tls_version
++}
++
++
++config_load "mosquitto"
++config_foreach mosq_general "mosquitto"
++config_foreach add_listener "listener"
++config_foreach add_bridge "bridge"
+diff --git a/feeds/packages/net/mtr/Makefile b/feeds/packages/net/mtr/Makefile
+new file mode 100644
+index 0000000..f3ca9ba
+--- /dev/null
++++ b/feeds/packages/net/mtr/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mtr
++PKG_REV:=dd2b750
++PKG_VERSION:=0.85+newdns-$(PKG_REV)
++PKG_RELEASE:=2
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/traviscross/mtr.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mtr
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libncurses
++ TITLE:=Full screen ncurses traceroute tool
++ URL:=http://www.bitwizard.nl/mtr/
++ PKG_MAINTAINER:=Jonathan McCrohan <jmccrohan@gmail.com>
++endef
++
++define Package/mtr/description
++ mtr combines the functionality of the 'traceroute' and 'ping' programs
++ in a single network diagnostic tool.
++ As mtr starts, it investigates the network connection between the host
++ mtr runs on and a user-specified destination host. After it
++ determines the address of each network hop between the machines,
++ it sends a sequence ICMP ECHO requests to each one to determine the
++ quality of the link to each machine. As it does this, it prints
++ running statistics about each machine.
++endef
++
++CONFIGURE_ARGS += \
++ --without-gtk \
++ --without-glib \
++ $(call autoconf_bool,CONFIG_IPV6,ipv6)
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); touch \
++ configure.in \
++ aclocal.m4 \
++ Makefile.in \
++ img/Makefile.in \
++ stamp-h.in \
++ config.h.in \
++ configure \
++ );
++ $(call Build/Configure/Default)
++endef
++
++define Package/mtr/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/mtr $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,mtr))
+diff --git a/feeds/packages/net/mtr/patches/100-disabled-ipv6-fix.patch b/feeds/packages/net/mtr/patches/100-disabled-ipv6-fix.patch
+new file mode 100644
+index 0000000..5ef9984
+--- /dev/null
++++ b/feeds/packages/net/mtr/patches/100-disabled-ipv6-fix.patch
+@@ -0,0 +1,49 @@
++--- a/net.c
+++++ b/net.c
++@@ -307,9 +307,11 @@ void net_send_tcp(int index)
++ struct sockaddr_storage local;
++ struct sockaddr_storage remote;
++ struct sockaddr_in *local4 = (struct sockaddr_in *) &local;
++- struct sockaddr_in6 *local6 = (struct sockaddr_in6 *) &local;
++ struct sockaddr_in *remote4 = (struct sockaddr_in *) &remote;
+++#ifdef ENABLE_IPV6
+++ struct sockaddr_in6 *local6 = (struct sockaddr_in6 *) &local;
++ struct sockaddr_in6 *remote6 = (struct sockaddr_in6 *) &remote;
+++#endif
++ socklen_t len;
++
++ ttl = index + 1;
++@@ -566,8 +568,10 @@ void net_send_query(int index)
++
++ /* sendto() assumes packet length includes the IPv4 header but not the
++ IPv6 header. */
++- spacketsize = abs(packetsize) -
++- ( ( af == AF_INET ) ? 0 : sizeof (struct ip6_hdr) );
+++ spacketsize = abs(packetsize);
+++#ifdef ENABLE_IPV6
+++ spacketsize -= ( ( af == AF_INET ) ? 0 : sizeof (struct ip6_hdr) );
+++#endif
++ rv = sendto(sendsock, packet, spacketsize, 0, remotesockaddr, salen);
++ if (first && (rv < 0) && ((errno == EINVAL) || (errno == EMSGSIZE))) {
++ /* Try the first packet again using host byte order. */
++--- a/dns.c
+++++ b/dns.c
++@@ -49,7 +49,7 @@
++ #include <unistd.h>
++ #include <fcntl.h>
++ //#include <ctype.h>
++-//#include <string.h>
+++#include <string.h>
++ #include <stdio.h>
++ #include <stdlib.h>
++ #include <signal.h>
++--- a/net.h
+++++ b/net.h
++@@ -20,6 +20,7 @@
++ #include <netdb.h>
++ #include <arpa/inet.h>
++ #include <netinet/in.h>
+++#include <sys/select.h>
++ #include <sys/socket.h>
++ #ifdef ENABLE_IPV6
++ #include <netinet/ip6.h>
+diff --git a/feeds/packages/net/mwan3-luci/Makefile b/feeds/packages/net/mwan3-luci/Makefile
+new file mode 100644
+index 0000000..b4b49ce
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/Makefile
+@@ -0,0 +1,41 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-app-mwan3
++PKG_VERSION:=1.4
++PKG_RELEASE:=4
++PKG_MAINTAINER:=Aedan Renner <chipdankly@gmail.com>
++PKG_LICENSE:=GPLv2
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luci-app-mwan3
++ SECTION:=LuCI
++ CATEGORY:=LuCI
++ SUBMENU:=3. Applications
++ TITLE:=LuCI support for the MWAN3 multiwan hotplug script
++ DEPENDS:=+mwan3 +luci-mod-admin-full +luci-app-firewall +luci-lib-nixio
++ PKGARCH:=all
++ MAINTAINER:=Aedan Renner <chipdankly@gmail.com>
++endef
++
++define Package/luci-app-mwan3/description
++Hotplug script which makes configuration of multiple WAN interfaces simple and
++manageable with loadbalancing/failover support for up to 250 physical or logical
++WAN interfaces, connection tracking and an easy to manage traffic ruleset
++endef
++
++define Build/Compile
++endef
++
++define Package/luci-app-mwan3/install
++ $(CP) ./files/* $(1)
++endef
++
++$(eval $(call BuildPackage,luci-app-mwan3))
+diff --git a/feeds/packages/net/mwan3-luci/files/etc/hotplug.d/iface/16-mwancustombak b/feeds/packages/net/mwan3-luci/files/etc/hotplug.d/iface/16-mwancustombak
+new file mode 100755
+index 0000000..6e2875e
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/etc/hotplug.d/iface/16-mwancustombak
+@@ -0,0 +1,38 @@
++#!/bin/sh
++
++# to enable this script uncomment the case loop at the bottom
++# to report mwan status on interface hotplug ifup/ifdown events modify the lines in the send_alert function
++
++send_alert()
++{
++ # variable "$1" stores the MWAN status information
++ # insert your code here to send the contents of "$1"
++ echo "$1"
++}
++
++gather_event_info()
++{
++ # create event information message
++ local EVENT_INFO="Interface [ "$INTERFACE" ($DEVICE) ] on router [ "$(uci -p /var/state get system.@system[0].hostname)" ] has triggered a hotplug [ "$ACTION" ] event on "$(date +"%a %b %d %Y %T %Z")""
++
++ # get current interface, policy and rule status
++ local CURRENT_STATUS="$(/usr/sbin/mwan3 status)"
++
++ # get last 50 MWAN systemlog messages
++ local MWAN_LOG="$(echo -e "Last 50 MWAN systemlog entries. Newest entries sorted at the top:\n$(logread | grep mwan3 | tail -n 50 | sed 'x;1!H;$!d;x')")"
++
++ # pass event info to send_alert function
++ send_alert "$(echo -e "$EVENT_INFO\n\n$CURRENT_STATUS\n\n$MWAN_LOG")"
++}
++
++#case "$ACTION" in
++# ifup)
++# gather_event_info
++# ;;
++#
++# ifdown)
++# gather_event_info
++# ;;
++#esac
++
++exit 0
+diff --git a/feeds/packages/net/mwan3-luci/files/etc/uci-defaults/mwan-luci b/feeds/packages/net/mwan3-luci/files/etc/uci-defaults/mwan-luci
+new file mode 100755
+index 0000000..ff9a229
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/etc/uci-defaults/mwan-luci
+@@ -0,0 +1,14 @@
++#!/bin/sh
++
++# replace existing mwan ucitrack entry
++uci -q batch <<-EOF >/dev/null
++ del ucitrack.@mwan3[-1]
++ add ucitrack mwan3
++ set ucitrack.@mwan3[-1].exec="/usr/sbin/mwan3 restart"
++ commit ucitrack
++EOF
++
++# remove LuCI cache
++rm -rf /tmp/luci-indexcache /tmp/luci-modulecache
++
++exit 0
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/controller/mwan3.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/controller/mwan3.lua
+new file mode 100644
+index 0000000..bd34360
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/controller/mwan3.lua
+@@ -0,0 +1,322 @@
++module("luci.controller.mwan3", package.seeall)
++
++sys = require "luci.sys"
++ut = require "luci.util"
++
++ip = "/usr/bin/ip -4 "
++
++function index()
++ if not nixio.fs.access("/etc/config/mwan3") then
++ return
++ end
++
++ entry({"admin", "network", "mwan"},
++ alias("admin", "network", "mwan", "overview"),
++ _("Load Balancing"), 600)
++
++ entry({"admin", "network", "mwan", "overview"},
++ alias("admin", "network", "mwan", "overview", "overview_interface"),
++ _("Overview"), 10)
++ entry({"admin", "network", "mwan", "overview", "overview_interface"},
++ template("mwan/overview_interface"))
++ entry({"admin", "network", "mwan", "overview", "interface_status"},
++ call("interfaceStatus"))
++ entry({"admin", "network", "mwan", "overview", "overview_detailed"},
++ template("mwan/overview_detailed"))
++ entry({"admin", "network", "mwan", "overview", "detailed_status"},
++ call("detailedStatus"))
++
++ entry({"admin", "network", "mwan", "configuration"},
++ alias("admin", "network", "mwan", "configuration", "interface"),
++ _("Configuration"), 20)
++ entry({"admin", "network", "mwan", "configuration", "interface"},
++ arcombine(cbi("mwan/interface"), cbi("mwan/interfaceconfig")),
++ _("Interfaces"), 10).leaf = true
++ entry({"admin", "network", "mwan", "configuration", "member"},
++ arcombine(cbi("mwan/member"), cbi("mwan/memberconfig")),
++ _("Members"), 20).leaf = true
++ entry({"admin", "network", "mwan", "configuration", "policy"},
++ arcombine(cbi("mwan/policy"), cbi("mwan/policyconfig")),
++ _("Policies"), 30).leaf = true
++ entry({"admin", "network", "mwan", "configuration", "rule"},
++ arcombine(cbi("mwan/rule"), cbi("mwan/ruleconfig")),
++ _("Rules"), 40).leaf = true
++
++ entry({"admin", "network", "mwan", "advanced"},
++ alias("admin", "network", "mwan", "advanced", "hotplugscript"),
++ _("Advanced"), 100)
++ entry({"admin", "network", "mwan", "advanced", "hotplugscript"},
++ form("mwan/advanced_hotplugscript"))
++ entry({"admin", "network", "mwan", "advanced", "mwanconfig"},
++ form("mwan/advanced_mwanconfig"))
++ entry({"admin", "network", "mwan", "advanced", "networkconfig"},
++ form("mwan/advanced_networkconfig"))
++ entry({"admin", "network", "mwan", "advanced", "diagnostics"},
++ template("mwan/advanced_diagnostics"))
++ entry({"admin", "network", "mwan", "advanced", "diagnostics_display"},
++ call("diagnosticsData"), nil).leaf = true
++ entry({"admin", "network", "mwan", "advanced", "troubleshooting"},
++ template("mwan/advanced_troubleshooting"))
++ entry({"admin", "network", "mwan", "advanced", "troubleshooting_display"},
++ call("troubleshootingData"))
++end
++
++function getInterfaceStatus(ruleNumber, interfaceName)
++ if ut.trim(sys.exec("uci -p /var/state get mwan3." .. interfaceName .. ".enabled")) == "1" then
++ if ut.trim(sys.exec(ip .. "route list table " .. ruleNumber)) ~= "" then
++ if ut.trim(sys.exec("uci -p /var/state get mwan3." .. interfaceName .. ".track_ip")) ~= "" then
++ return "online"
++ else
++ return "notMonitored"
++ end
++ else
++ return "offline"
++ end
++ else
++ return "notEnabled"
++ end
++end
++
++function getInterfaceName()
++ local ruleNumber, status = 0, ""
++ uci.cursor():foreach("mwan3", "interface",
++ function (section)
++ ruleNumber = ruleNumber+1
++ status = status .. section[".name"] .. "[" .. getInterfaceStatus(ruleNumber, section[".name"]) .. "]"
++ end
++ )
++ return status
++end
++
++function interfaceStatus()
++ local ntm = require "luci.model.network".init()
++
++ local mArray = {}
++
++ -- overview status
++ local statusString = getInterfaceName()
++ if statusString ~= "" then
++ mArray.wans = {}
++ wansid = {}
++
++ for wanName, interfaceState in string.gfind(statusString, "([^%[]+)%[([^%]]+)%]") do
++ local wanInterfaceName = ut.trim(sys.exec("uci -p /var/state get network." .. wanName .. ".ifname"))
++ if wanInterfaceName == "" then
++ wanInterfaceName = "X"
++ end
++ local wanDeviceLink = ntm:get_interface(wanInterfaceName)
++ wanDeviceLink = wanDeviceLink and wanDeviceLink:get_network()
++ wanDeviceLink = wanDeviceLink and wanDeviceLink:adminlink() or "#"
++ wansid[wanName] = #mArray.wans + 1
++ mArray.wans[wansid[wanName]] = { name = wanName, link = wanDeviceLink, ifname = wanInterfaceName, status = interfaceState }
++ end
++ end
++
++ -- overview status log
++ local mwanLog = ut.trim(sys.exec("logread | grep mwan3 | tail -n 50 | sed 'x;1!H;$!d;x'"))
++ if mwanLog ~= "" then
++ mArray.mwanlog = { mwanLog }
++ end
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(mArray)
++end
++
++function detailedStatus()
++ local mArray = {}
++
++ -- detailed mwan status
++ local detailStatusInfo = ut.trim(sys.exec("/usr/sbin/mwan3 status"))
++ if detailStatusInfo ~= "" then
++ mArray.mwandetail = { detailStatusInfo }
++ end
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(mArray)
++end
++
++function diagnosticsData(interface, tool, task)
++ function getInterfaceNumber()
++ local number = 0
++ uci.cursor():foreach("mwan3", "interface",
++ function (section)
++ number = number+1
++ if section[".name"] == interface then
++ interfaceNumber = number
++ end
++ end
++ )
++ end
++
++ local mArray = {}
++
++ local results = ""
++ if tool == "service" then
++ os.execute("/usr/sbin/mwan3 " .. task)
++ if task == "restart" then
++ results = "MWAN3 restarted"
++ elseif task == "stop" then
++ results = "MWAN3 stopped"
++ else
++ results = "MWAN3 started"
++ end
++ else
++ local interfaceDevice = ut.trim(sys.exec("uci -p /var/state get network." .. interface .. ".ifname"))
++ if interfaceDevice ~= "" then
++ if tool == "ping" then
++ local gateway = ut.trim(sys.exec("route -n | awk '{if ($8 == \"" .. interfaceDevice .. "\" && $1 == \"0.0.0.0\" && $3 == \"0.0.0.0\") print $2}'"))
++ if gateway ~= "" then
++ if task == "gateway" then
++ local pingCommand = "ping -c 3 -W 2 -I " .. interfaceDevice .. " " .. gateway
++ results = pingCommand .. "\n\n" .. sys.exec(pingCommand)
++ else
++ local tracked = ut.trim(sys.exec("uci -p /var/state get mwan3." .. interface .. ".track_ip"))
++ if tracked ~= "" then
++ for z in tracked:gmatch("[^ ]+") do
++ local pingCommand = "ping -c 3 -W 2 -I " .. interfaceDevice .. " " .. z
++ results = results .. pingCommand .. "\n\n" .. sys.exec(pingCommand) .. "\n\n"
++ end
++ else
++ results = "No tracking IP addresses configured on " .. interface
++ end
++ end
++ else
++ results = "No default gateway for " .. interface .. " found. Default route does not exist or is configured incorrectly"
++ end
++ elseif tool == "rulechk" then
++ getInterfaceNumber()
++ local rule1 = sys.exec(ip .. "rule | grep $(echo $((" .. interfaceNumber .. " + 1000)))")
++ local rule2 = sys.exec(ip .. "rule | grep $(echo $((" .. interfaceNumber .. " + 2000)))")
++ if rule1 ~= "" and rule2 ~= "" then
++ results = "All required interface IP rules found:\n\n" .. rule1 .. rule2
++ elseif rule1 ~= "" or rule2 ~= "" then
++ results = "Missing 1 of the 2 required interface IP rules\n\n\nRules found:\n\n" .. rule1 .. rule2
++ else
++ results = "Missing both of the required interface IP rules"
++ end
++ elseif tool == "routechk" then
++ getInterfaceNumber()
++ local routeTable = sys.exec(ip .. "route list table " .. interfaceNumber)
++ if routeTable ~= "" then
++ results = "Interface routing table " .. interfaceNumber .. " was found:\n\n" .. routeTable
++ else
++ results = "Missing required interface routing table " .. interfaceNumber
++ end
++ elseif tool == "hotplug" then
++ if task == "ifup" then
++ os.execute("/usr/sbin/mwan3 ifup " .. interface)
++ results = "Hotplug ifup sent to interface " .. interface .. "..."
++ else
++ os.execute("/usr/sbin/mwan3 ifdown " .. interface)
++ results = "Hotplug ifdown sent to interface " .. interface .. "..."
++ end
++ end
++ else
++ results = "Unable to perform diagnostic tests on " .. interface .. ". There is no physical or virtual device associated with this interface"
++ end
++ end
++ if results ~= "" then
++ results = ut.trim(results)
++ mArray.diagnostics = { results }
++ end
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(mArray)
++end
++
++function troubleshootingData()
++ local ver = require "luci.version"
++
++ local mArray = {}
++
++ -- software versions
++ local wrtRelease = ut.trim(ver.distversion)
++ if wrtRelease ~= "" then
++ wrtRelease = "OpenWrt - " .. wrtRelease
++ else
++ wrtRelease = "OpenWrt - unknown"
++ end
++ local luciRelease = ut.trim(ver.luciversion)
++ if luciRelease ~= "" then
++ luciRelease = "\nLuCI - " .. luciRelease
++ else
++ luciRelease = "\nLuCI - unknown"
++ end
++ local mwanVersion = ut.trim(sys.exec("opkg info mwan3 | grep Version | awk '{print $2}'"))
++ if mwanVersion ~= "" then
++ mwanVersion = "\n\nmwan3 - " .. mwanVersion
++ else
++ mwanVersion = "\n\nmwan3 - unknown"
++ end
++ local mwanLuciVersion = ut.trim(sys.exec("opkg info luci-app-mwan3 | grep Version | awk '{print $2}'"))
++ if mwanLuciVersion ~= "" then
++ mwanLuciVersion = "\nmwan3-luci - " .. mwanLuciVersion
++ else
++ mwanLuciVersion = "\nmwan3-luci - unknown"
++ end
++ mArray.versions = { wrtRelease .. luciRelease .. mwanVersion .. mwanLuciVersion }
++
++ -- mwan config
++ local mwanConfig = ut.trim(sys.exec("cat /etc/config/mwan3"))
++ if mwanConfig == "" then
++ mwanConfig = "No data found"
++ end
++ mArray.mwanconfig = { mwanConfig }
++
++ -- network config
++ local networkConfig = ut.trim(sys.exec("cat /etc/config/network | sed -e 's/.*username.*/ USERNAME HIDDEN/' -e 's/.*password.*/ PASSWORD HIDDEN/'"))
++ if networkConfig == "" then
++ networkConfig = "No data found"
++ end
++ mArray.netconfig = { networkConfig }
++
++ -- ifconfig
++ local ifconfig = ut.trim(sys.exec("ifconfig"))
++ if ifconfig == "" then
++ ifconfig = "No data found"
++ end
++ mArray.ifconfig = { ifconfig }
++
++ -- route -n
++ local routeShow = ut.trim(sys.exec("route -n"))
++ if routeShow == "" then
++ routeShow = "No data found"
++ end
++ mArray.routeshow = { routeShow }
++
++ -- ip rule show
++ local ipRuleShow = ut.trim(sys.exec(ip .. "rule show"))
++ if ipRuleShow == "" then
++ ipRuleShow = "No data found"
++ end
++ mArray.iprule = { ipRuleShow }
++
++ -- ip route list table 1-250
++ local routeList, routeString = ut.trim(sys.exec(ip .. "rule | sed 's/://g' | awk '$1>=2001 && $1<=2250' | awk '{print $NF}'")), ""
++ if routeList ~= "" then
++ for line in routeList:gmatch("[^\r\n]+") do
++ routeString = routeString .. line .. "\n" .. sys.exec(ip .. "route list table " .. line)
++ end
++ routeString = ut.trim(routeString)
++ else
++ routeString = "No data found"
++ end
++ mArray.routelist = { routeString }
++
++ -- default firewall output policy
++ local firewallOut = ut.trim(sys.exec("uci -p /var/state get firewall.@defaults[0].output"))
++ if firewallOut == "" then
++ firewallOut = "No data found"
++ end
++ mArray.firewallout = { firewallOut }
++
++ -- iptables
++ local iptables = ut.trim(sys.exec("iptables -L -t mangle -v -n"))
++ if iptables == "" then
++ iptables = "No data found"
++ end
++ mArray.iptables = { iptables }
++
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(mArray)
++end
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/advanced_hotplugscript.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/advanced_hotplugscript.lua
+new file mode 100644
+index 0000000..0e7b8b1
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/advanced_hotplugscript.lua
+@@ -0,0 +1,55 @@
++-- ------ hotplug script configuration ------ --
++
++fs = require "nixio.fs"
++sys = require "luci.sys"
++ut = require "luci.util"
++
++script = "/etc/hotplug.d/iface/16-mwancustom"
++scriptBackup = "/etc/hotplug.d/iface/16-mwancustombak"
++
++if luci.http.formvalue("cbid.luci.1._restorebak") then -- restore button has been clicked
++ luci.http.redirect(luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript") .. "?restore=yes")
++elseif luci.http.formvalue("restore") == "yes" then -- restore script from backup
++ os.execute("cp -f " .. scriptBackup .. " " .. script)
++end
++
++
++m5 = SimpleForm("luci", nil)
++ m5:append(Template("mwan/advanced_hotplugscript")) -- highlight current tab
++
++f = m5:section(SimpleSection, nil,
++ translate("This section allows you to modify the contents of /etc/hotplug.d/iface/16-mwancustom<br />" ..
++ "This is useful for running system commands and/or scripts based on interface ifup or ifdown hotplug events<br /><br />" ..
++ "Notes:<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 /><br />" ..
++ "Available variables:<br />" ..
++ "$ACTION is the hotplug event (ifup, ifdown)<br />" ..
++ "$INTERFACE is the interface name (wan1, wan2, etc.)<br />" ..
++ "$DEVICE is the device name attached to the interface (eth0.1, eth1, etc.)"))
++
++
++restore = f:option(Button, "_restorebak", translate("Restore default hotplug script"))
++ restore.inputtitle = translate("Restore...")
++ restore.inputstyle = "apply"
++
++t = f:option(TextValue, "lines")
++ t.rmempty = true
++ t.rows = 20
++
++ function t.cfgvalue()
++ local hps = fs.readfile(script)
++ if not hps or hps == "" then -- if script does not exist or is blank restore from backup
++ sys.call("cp -f " .. scriptBackup .. " " .. script)
++ return fs.readfile(script)
++ else
++ return hps
++ end
++ end
++
++ function t.write(self, section, data) -- format and write new data to script
++ return fs.writefile(script, ut.trim(data:gsub("\r\n", "\n")) .. "\n")
++ end
++
++
++return m5
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/advanced_mwanconfig.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/advanced_mwanconfig.lua
+new file mode 100644
+index 0000000..e0a99e8
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/advanced_mwanconfig.lua
+@@ -0,0 +1,32 @@
++-- ------ mwan configuration ------ --
++
++ut = require "luci.util"
++
++mwanConfig = "/etc/config/mwan3"
++
++
++m5 = SimpleForm("luci", nil)
++ m5:append(Template("mwan/advanced_mwanconfig")) -- highlight current tab
++
++
++f = m5:section(SimpleSection, nil,
++ translate("This section allows you to modify the contents of /etc/config/mwan3"))
++
++t = f:option(TextValue, "lines")
++ t.rmempty = true
++ t.rows = 20
++
++ function t.cfgvalue()
++ return nixio.fs.readfile(mwanConfig) or ""
++ end
++
++ function t.write(self, section, data) -- format and write new data to script
++ return nixio.fs.writefile(mwanConfig, "\n" .. ut.trim(data:gsub("\r\n", "\n")) .. "\n")
++ end
++
++ function f.handle(self, state, data)
++ return true
++ end
++
++
++return m5
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/advanced_networkconfig.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/advanced_networkconfig.lua
+new file mode 100644
+index 0000000..b93d897
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/advanced_networkconfig.lua
+@@ -0,0 +1,32 @@
++-- ------ network configuration ------ --
++
++ut = require "luci.util"
++
++networkConfig = "/etc/config/network"
++
++
++m5 = SimpleForm("networkconf", nil)
++ m5:append(Template("mwan/advanced_networkconfig")) -- highlight current tab
++
++
++f = m5:section(SimpleSection, nil,
++ translate("This section allows you to modify the contents of /etc/config/network"))
++
++t = f:option(TextValue, "lines")
++ t.rmempty = true
++ t.rows = 20
++
++ function t.cfgvalue()
++ return nixio.fs.readfile(networkConfig) or ""
++ end
++
++ function t.write(self, section, data) -- format and write new data to script
++ return nixio.fs.writefile(networkConfig, "\n" .. ut.trim(data:gsub("\r\n", "\n")) .. "\n")
++ end
++
++ function f.handle(self, state, data)
++ return true
++ end
++
++
++return m5
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/interface.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/interface.lua
+new file mode 100644
+index 0000000..a8e68a0
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/interface.lua
+@@ -0,0 +1,266 @@
++-- ------ extra functions ------ --
++
++function interfaceCheck() -- find issues with too many interfaces, reliability and metric
++ uci.cursor():foreach("mwan3", "interface",
++ function (section)
++ local interfaceName = section[".name"]
++ interfaceNumber = interfaceNumber+1 -- count number of mwan interfaces configured
++ -- create list of metrics for none and duplicate checking
++ local metricValue = ut.trim(sys.exec("uci -p /var/state get network." .. interfaceName .. ".metric"))
++ if metricValue == "" then
++ errorFound = 1
++ errorNoMetricList = errorNoMetricList .. interfaceName .. " "
++ else
++ metricList = metricList .. interfaceName .. " " .. metricValue .. "\n"
++ end
++ -- check if any interfaces have a higher reliability requirement than tracking IPs configured
++ local trackingNumber = tonumber(ut.trim(sys.exec("echo $(uci -p /var/state get mwan3." .. interfaceName .. ".track_ip) | wc -w")))
++ if trackingNumber > 0 then
++ local reliabilityNumber = tonumber(ut.trim(sys.exec("uci -p /var/state get mwan3." .. interfaceName .. ".reliability")))
++ if reliabilityNumber and reliabilityNumber > trackingNumber then
++ errorFound = 1
++ errorReliabilityList = errorReliabilityList .. interfaceName .. " "
++ end
++ end
++ -- check if any interfaces are not properly configured in /etc/config/network or have no default route in main routing table
++ if ut.trim(sys.exec("uci -p /var/state get network." .. interfaceName)) == "interface" then
++ local interfaceDevice = ut.trim(sys.exec("uci -p /var/state get network." .. interfaceName .. ".ifname"))
++ if interfaceDevice == "uci: Entry not found" or interfaceDevice == "" then
++ errorFound = 1
++ errorNetConfigList = errorNetConfigList .. interfaceName .. " "
++ errorRouteList = errorRouteList .. interfaceName .. " "
++ else
++ local routeCheck = ut.trim(sys.exec("route -n | awk '{if ($8 == \"" .. interfaceDevice .. "\" && $1 == \"0.0.0.0\" && $3 == \"0.0.0.0\") print $1}'"))
++ if routeCheck == "" then
++ errorFound = 1
++ errorRouteList = errorRouteList .. interfaceName .. " "
++ end
++ end
++ else
++ errorFound = 1
++ errorNetConfigList = errorNetConfigList .. interfaceName .. " "
++ errorRouteList = errorRouteList .. interfaceName .. " "
++ end
++ end
++ )
++ -- check if any interfaces have duplicate metrics
++ local metricDuplicateNumbers = sys.exec("echo '" .. metricList .. "' | awk '{print $2}' | uniq -d")
++ if metricDuplicateNumbers ~= "" then
++ errorFound = 1
++ local metricDuplicates = ""
++ for line in metricDuplicateNumbers:gmatch("[^\r\n]+") do
++ metricDuplicates = sys.exec("echo '" .. metricList .. "' | grep '" .. line .. "' | awk '{print $1}'")
++ errorDuplicateMetricList = errorDuplicateMetricList .. metricDuplicates
++ end
++ errorDuplicateMetricList = sys.exec("echo '" .. errorDuplicateMetricList .. "' | tr '\n' ' '")
++ end
++end
++
++function interfaceWarnings() -- display status and warning messages at the top of the page
++ local warnings = ""
++ if interfaceNumber <= 250 then
++ warnings = "<strong>There are currently " .. interfaceNumber .. " of 250 supported interfaces configured</strong>"
++ else
++ warnings = "<font color=\"ff0000\"><strong>WARNING: " .. interfaceNumber .. " interfaces are configured exceeding the maximum of 250!</strong></font>"
++ end
++ if errorReliabilityList ~= " " then
++ warnings = warnings .. "<br /><br /><font color=\"ff0000\"><strong>WARNING: some interfaces have a higher reliability requirement than there are tracking IP addresses!</strong></font>"
++ end
++ if errorRouteList ~= " " then
++ warnings = warnings .. "<br /><br /><font color=\"ff0000\"><strong>WARNING: some interfaces have no default route in the main routing table!</strong></font>"
++ end
++ if errorNetConfigList ~= " " then
++ warnings = warnings .. "<br /><br /><font color=\"ff0000\"><strong>WARNING: some interfaces are configured incorrectly or not at all in /etc/config/network!</strong></font>"
++ end
++ if errorNoMetricList ~= " " then
++ warnings = warnings .. "<br /><br /><font color=\"ff0000\"><strong>WARNING: some interfaces have no metric configured in /etc/config/network!</strong></font>"
++ end
++ if errorDuplicateMetricList ~= " " then
++ warnings = warnings .. "<br /><br /><font color=\"ff0000\"><strong>WARNING: some interfaces have duplicate metrics configured in /etc/config/network!</strong></font>"
++ end
++ return warnings
++end
++
++-- ------ interface configuration ------ --
++
++dsp = require "luci.dispatcher"
++sys = require "luci.sys"
++ut = require "luci.util"
++
++interfaceNumber = 0
++metricList = ""
++errorFound = 0
++errorDuplicateMetricList = " "
++errorNetConfigList = " "
++errorNoMetricList = " "
++errorReliabilityList = " "
++errorRouteList = " "
++interfaceCheck()
++
++
++m5 = Map("mwan3", translate("MWAN Interface Configuration"),
++ translate(interfaceWarnings()))
++ m5:append(Template("mwan/config_css"))
++
++
++mwan_interface = m5:section(TypedSection, "interface", translate("Interfaces"),
++ translate("MWAN supports up to 250 physical and/or logical interfaces<br />" ..
++ "MWAN requires that all interfaces have a unique metric configured in /etc/config/network<br />" ..
++ "Names must match the interface name found in /etc/config/network (see advanced tab)<br />" ..
++ "Names may contain characters A-Z, a-z, 0-9, _ and no spaces<br />" ..
++ "Interfaces may not share the same name as configured members, policies or rules"))
++ mwan_interface.addremove = true
++ mwan_interface.dynamic = false
++ mwan_interface.sectionhead = "Interface"
++ mwan_interface.sortable = true
++ mwan_interface.template = "cbi/tblsection"
++ mwan_interface.extedit = dsp.build_url("admin", "network", "mwan", "configuration", "interface", "%s")
++ function mwan_interface.create(self, section)
++ TypedSection.create(self, section)
++ m5.uci:save("mwan3")
++ luci.http.redirect(dsp.build_url("admin", "network", "mwan", "configuration", "interface", section))
++ end
++
++
++enabled = mwan_interface:option(DummyValue, "enabled", translate("Enabled"))
++ enabled.rawhtml = true
++ function enabled.cfgvalue(self, s)
++ if self.map:get(s, "enabled") == "1" then
++ return "Yes"
++ else
++ return "No"
++ end
++ end
++
++track_ip = mwan_interface:option(DummyValue, "track_ip", translate("Tracking IP"))
++ track_ip.rawhtml = true
++ function track_ip.cfgvalue(self, s)
++ tracked = self.map:get(s, "track_ip")
++ if tracked then
++ local ipList = ""
++ for k,v in pairs(tracked) do
++ ipList = ipList .. v .. "<br />"
++ end
++ return ipList
++ else
++ return "&#8212;"
++ end
++ end
++
++reliability = mwan_interface:option(DummyValue, "reliability", translate("Tracking reliability"))
++ reliability.rawhtml = true
++ function reliability.cfgvalue(self, s)
++ if tracked then
++ return self.map:get(s, "reliability") or "&#8212;"
++ else
++ return "&#8212;"
++ end
++ end
++
++count = mwan_interface:option(DummyValue, "count", translate("Ping count"))
++ count.rawhtml = true
++ function count.cfgvalue(self, s)
++ if tracked then
++ return self.map:get(s, "count") or "&#8212;"
++ else
++ return "&#8212;"
++ end
++ end
++
++timeout = mwan_interface:option(DummyValue, "timeout", translate("Ping timeout"))
++ timeout.rawhtml = true
++ function timeout.cfgvalue(self, s)
++ if tracked then
++ local timeoutValue = self.map:get(s, "timeout")
++ if timeoutValue then
++ return timeoutValue .. "s"
++ else
++ return "&#8212;"
++ end
++ else
++ return "&#8212;"
++ end
++ end
++
++interval = mwan_interface:option(DummyValue, "interval", translate("Ping interval"))
++ interval.rawhtml = true
++ function interval.cfgvalue(self, s)
++ if tracked then
++ local intervalValue = self.map:get(s, "interval")
++ if intervalValue then
++ return intervalValue .. "s"
++ else
++ return "&#8212;"
++ end
++ else
++ return "&#8212;"
++ end
++ end
++
++down = mwan_interface:option(DummyValue, "down", translate("Interface down"))
++ down.rawhtml = true
++ function down.cfgvalue(self, s)
++ if tracked then
++ return self.map:get(s, "down") or "&#8212;"
++ else
++ return "&#8212;"
++ end
++ end
++
++up = mwan_interface:option(DummyValue, "up", translate("Interface up"))
++ up.rawhtml = true
++ function up.cfgvalue(self, s)
++ if tracked then
++ return self.map:get(s, "up") or "&#8212;"
++ else
++ return "&#8212;"
++ end
++ end
++
++metric = mwan_interface:option(DummyValue, "metric", translate("Metric"))
++ metric.rawhtml = true
++ function metric.cfgvalue(self, s)
++ local metricValue = sys.exec("uci -p /var/state get network." .. s .. ".metric")
++ if metricValue ~= "" then
++ return metricValue
++ else
++ return "&#8212;"
++ end
++ end
++
++errors = mwan_interface:option(DummyValue, "errors", translate("Errors"))
++ errors.rawhtml = true
++ function errors.cfgvalue(self, s)
++ if errorFound == 1 then
++ local mouseOver, lineBreak = "", ""
++ if string.find(errorReliabilityList, " " .. s .. " ") then
++ mouseOver = "Higher reliability requirement than there are tracking IP addresses"
++ lineBreak = "&#10;&#10;"
++ end
++ if string.find(errorRouteList, " " .. s .. " ") then
++ mouseOver = mouseOver .. lineBreak .. "No default route in the main routing table"
++ lineBreak = "&#10;&#10;"
++ end
++ if string.find(errorNetConfigList, " " .. s .. " ") then
++ mouseOver = mouseOver .. lineBreak .. "Configured incorrectly or not at all in /etc/config/network"
++ lineBreak = "&#10;&#10;"
++ end
++ if string.find(errorNoMetricList, " " .. s .. " ") then
++ mouseOver = mouseOver .. lineBreak .. "No metric configured in /etc/config/network"
++ lineBreak = "&#10;&#10;"
++ end
++ if string.find(errorDuplicateMetricList, " " .. s .. " ") then
++ mouseOver = mouseOver .. lineBreak .. "Duplicate metric configured in /etc/config/network"
++ end
++ if mouseOver == "" then
++ return ""
++ else
++ return "<span title=\"" .. mouseOver .. "\"><img src=\"/luci-static/resources/cbi/reset.gif\" alt=\"error\"></img></span>"
++ end
++ else
++ return ""
++ end
++ end
++
++
++return m5
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/interfaceconfig.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/interfaceconfig.lua
+new file mode 100644
+index 0000000..387ff01
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/interfaceconfig.lua
+@@ -0,0 +1,190 @@
++-- ------ extra functions ------ --
++
++function interfaceCheck()
++ metricValue = ut.trim(sys.exec("uci -p /var/state get network." .. arg[1] .. ".metric"))
++ if metricValue == "" then -- no metric
++ errorNoMetric = 1
++ else -- if metric exists create list of interface metrics to compare against for duplicates
++ uci.cursor():foreach("mwan3", "interface",
++ function (section)
++ local metricValue = ut.trim(sys.exec("uci -p /var/state get network." .. section[".name"] .. ".metric"))
++ metricList = metricList .. section[".name"] .. " " .. metricValue .. "\n"
++ end
++ )
++ -- compare metric against list
++ local metricDuplicateNumbers, metricDuplicates = sys.exec("echo '" .. metricList .. "' | awk '{print $2}' | uniq -d"), ""
++ for line in metricDuplicateNumbers:gmatch("[^\r\n]+") do
++ metricDuplicates = sys.exec("echo '" .. metricList .. "' | grep '" .. line .. "' | awk '{print $1}'")
++ errorDuplicateMetricList = errorDuplicateMetricList .. metricDuplicates
++ end
++ if sys.exec("echo '" .. errorDuplicateMetricList .. "' | grep -w " .. arg[1]) ~= "" then
++ errorDuplicateMetric = 1
++ end
++ end
++ -- check if this interface has a higher reliability requirement than track IPs configured
++ local trackingNumber = tonumber(ut.trim(sys.exec("echo $(uci -p /var/state get mwan3." .. arg[1] .. ".track_ip) | wc -w")))
++ if trackingNumber > 0 then
++ local reliabilityNumber = tonumber(ut.trim(sys.exec("uci -p /var/state get mwan3." .. arg[1] .. ".reliability")))
++ if reliabilityNumber and reliabilityNumber > trackingNumber then
++ errorReliability = 1
++ end
++ end
++ -- check if any interfaces are not properly configured in /etc/config/network or have no default route in main routing table
++ if ut.trim(sys.exec("uci -p /var/state get network." .. arg[1])) == "interface" then
++ local interfaceDevice = ut.trim(sys.exec("uci -p /var/state get network." .. arg[1] .. ".ifname"))
++ if interfaceDevice == "uci: Entry not found" or interfaceDevice == "" then
++ errorNetConfig = 1
++ errorRoute = 1
++ else
++ local routeCheck = ut.trim(sys.exec("route -n | awk '{if ($8 == \"" .. interfaceDevice .. "\" && $1 == \"0.0.0.0\" && $3 == \"0.0.0.0\") print $1}'"))
++ if routeCheck == "" then
++ errorRoute = 1
++ end
++ end
++ else
++ errorNetConfig = 1
++ errorRoute = 1
++ end
++end
++
++function interfaceWarnings() -- display warning messages at the top of the page
++ local warns, lineBreak = "", ""
++ if errorReliability == 1 then
++ warns = "<font color=\"ff0000\"><strong>WARNING: this interface has a higher reliability requirement than there are tracking IP addresses!</strong></font>"
++ lineBreak = "<br /><br />"
++ end
++ if errorRoute == 1 then
++ warns = warns .. lineBreak .. "<font color=\"ff0000\"><strong>WARNING: this interface has no default route in the main routing table!</strong></font>"
++ lineBreak = "<br /><br />"
++ end
++ if errorNetConfig == 1 then
++ warns = warns .. lineBreak .. "<font color=\"ff0000\"><strong>WARNING: this interface is configured incorrectly or not at all in /etc/config/network!</strong></font>"
++ lineBreak = "<br /><br />"
++ end
++ if errorNoMetric == 1 then
++ warns = warns .. lineBreak .. "<font color=\"ff0000\"><strong>WARNING: this interface has no metric configured in /etc/config/network!</strong></font>"
++ elseif errorDuplicateMetric == 1 then
++ warns = warns .. lineBreak .. "<font color=\"ff0000\"><strong>WARNING: this and other interfaces have duplicate metrics configured in /etc/config/network!</strong></font>"
++ end
++ return warns
++end
++
++-- ------ interface configuration ------ --
++
++dsp = require "luci.dispatcher"
++sys = require "luci.sys"
++ut = require "luci.util"
++arg[1] = arg[1] or ""
++
++metricValue = ""
++metricList = ""
++errorDuplicateMetricList = ""
++errorNoMetric = 0
++errorDuplicateMetric = 0
++errorRoute = 0
++errorNetConfig = 0
++errorReliability = 0
++interfaceCheck()
++
++
++m5 = Map("mwan3", translate("MWAN Interface Configuration - " .. arg[1]),
++ translate(interfaceWarnings()))
++ m5.redirect = dsp.build_url("admin", "network", "mwan", "configuration", "interface")
++
++
++mwan_interface = m5:section(NamedSection, arg[1], "interface", "")
++ mwan_interface.addremove = false
++ mwan_interface.dynamic = false
++
++
++enabled = mwan_interface:option(ListValue, "enabled", translate("Enabled"))
++ enabled.default = "1"
++ enabled:value("1", translate("Yes"))
++ enabled:value("0", translate("No"))
++
++track_ip = mwan_interface:option(DynamicList, "track_ip", translate("Tracking IP"),
++ translate("This IP address will be pinged to dermine if the link is up or down. Leave blank to assume interface is always online"))
++ track_ip.datatype = "ipaddr"
++
++reliability = mwan_interface:option(Value, "reliability", translate("Tracking reliability"),
++ translate("Acceptable values: 1-100. This many Tracking IP addresses must respond for the link to be deemed up"))
++ reliability.datatype = "range(1, 100)"
++ reliability.default = "1"
++
++count = mwan_interface:option(ListValue, "count", translate("Ping count"))
++ count.default = "1"
++ count:value("1")
++ count:value("2")
++ count:value("3")
++ count:value("4")
++ count:value("5")
++
++timeout = mwan_interface:option(ListValue, "timeout", translate("Ping timeout"))
++ timeout.default = "2"
++ timeout:value("1", translate("1 second"))
++ timeout:value("2", translate("2 seconds"))
++ timeout:value("3", translate("3 seconds"))
++ timeout:value("4", translate("4 seconds"))
++ timeout:value("5", translate("5 seconds"))
++ timeout:value("6", translate("6 seconds"))
++ timeout:value("7", translate("7 seconds"))
++ timeout:value("8", translate("8 seconds"))
++ timeout:value("9", translate("9 seconds"))
++ timeout:value("10", translate("10 seconds"))
++
++interval = mwan_interface:option(ListValue, "interval", translate("Ping interval"))
++ interval.default = "5"
++ interval:value("1", translate("1 second"))
++ interval:value("3", translate("3 seconds"))
++ interval:value("5", translate("5 seconds"))
++ interval:value("10", translate("10 seconds"))
++ interval:value("20", translate("20 seconds"))
++ interval:value("30", translate("30 seconds"))
++ interval:value("60", translate("1 minute"))
++ interval:value("300", translate("5 minutes"))
++ interval:value("600", translate("10 minutes"))
++ interval:value("900", translate("15 minutes"))
++ interval:value("1800", translate("30 minutes"))
++ interval:value("3600", translate("1 hour"))
++
++down = mwan_interface:option(ListValue, "down", translate("Interface down"),
++ translate("Interface will be deemed down after this many failed ping tests"))
++ down.default = "3"
++ down:value("1")
++ down:value("2")
++ down:value("3")
++ down:value("4")
++ down:value("5")
++ down:value("6")
++ down:value("7")
++ down:value("8")
++ down:value("9")
++ down:value("10")
++
++up = mwan_interface:option(ListValue, "up", translate("Interface up"),
++ translate("Downed interface will be deemed up after this many successful ping tests"))
++ up.default = "3"
++ up:value("1")
++ up:value("2")
++ up:value("3")
++ up:value("4")
++ up:value("5")
++ up:value("6")
++ up:value("7")
++ up:value("8")
++ up:value("9")
++ up:value("10")
++
++metric = mwan_interface:option(DummyValue, "metric", translate("Metric"),
++ translate("This displays the metric assigned to this interface in /etc/config/network"))
++ metric.rawhtml = true
++ function metric.cfgvalue(self, s)
++ if errorNoMetric == 0 then
++ return metricValue
++ else
++ return "&#8212;"
++ end
++ end
++
++
++return m5
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/member.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/member.lua
+new file mode 100644
+index 0000000..3bccbd9
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/member.lua
+@@ -0,0 +1,46 @@
++-- ------ member configuration ------ --
++
++ds = require "luci.dispatcher"
++
++
++m5 = Map("mwan3", translate("MWAN Member Configuration"))
++ m5:append(Template("mwan/config_css"))
++
++
++mwan_member = m5:section(TypedSection, "member", translate("Members"),
++ translate("Members are profiles attaching a metric and weight to an MWAN interface<br />" ..
++ "Names may contain characters A-Z, a-z, 0-9, _ and no spaces<br />" ..
++ "Members may not share the same name as configured interfaces, policies or rules"))
++ mwan_member.addremove = true
++ mwan_member.dynamic = false
++ mwan_member.sectionhead = "Member"
++ mwan_member.sortable = true
++ mwan_member.template = "cbi/tblsection"
++ mwan_member.extedit = ds.build_url("admin", "network", "mwan", "configuration", "member", "%s")
++ function mwan_member.create(self, section)
++ TypedSection.create(self, section)
++ m5.uci:save("mwan3")
++ luci.http.redirect(ds.build_url("admin", "network", "mwan", "configuration", "member", section))
++ end
++
++
++interface = mwan_member:option(DummyValue, "interface", translate("Interface"))
++ interface.rawhtml = true
++ function interface.cfgvalue(self, s)
++ return self.map:get(s, "interface") or "&#8212;"
++ end
++
++metric = mwan_member:option(DummyValue, "metric", translate("Metric"))
++ metric.rawhtml = true
++ function metric.cfgvalue(self, s)
++ return self.map:get(s, "metric") or "1"
++ end
++
++weight = mwan_member:option(DummyValue, "weight", translate("Weight"))
++ weight.rawhtml = true
++ function weight.cfgvalue(self, s)
++ return self.map:get(s, "weight") or "1"
++ end
++
++
++return m5
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/memberconfig.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/memberconfig.lua
+new file mode 100644
+index 0000000..181d22e
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/memberconfig.lua
+@@ -0,0 +1,47 @@
++-- ------ extra functions ------ --
++
++function cbi_add_interface(field)
++ uci.cursor():foreach("mwan3", "interface",
++ function (section)
++ field:value(section[".name"])
++ end
++ )
++end
++
++-- ------ member configuration ------ --
++
++dsp = require "luci.dispatcher"
++arg[1] = arg[1] or ""
++
++
++m5 = Map("mwan3", translate("MWAN Member Configuration - ") .. arg[1])
++ m5.redirect = dsp.build_url("admin", "network", "mwan", "configuration", "member")
++
++
++mwan_member = m5:section(NamedSection, arg[1], "member", "")
++ mwan_member.addremove = false
++ mwan_member.dynamic = false
++
++
++interface = mwan_member:option(Value, "interface", translate("Interface"))
++ cbi_add_interface(interface)
++
++metric = mwan_member:option(Value, "metric", translate("Metric"),
++ translate("Acceptable values: 1-1000. Defaults to 1 if not set"))
++ metric.datatype = "range(1, 1000)"
++
++weight = mwan_member:option(Value, "weight", translate("Weight"),
++ translate("Acceptable values: 1-1000. Defaults to 1 if not set"))
++ weight.datatype = "range(1, 1000)"
++
++
++-- ------ currently configured interfaces ------ --
++
++mwan_interface = m5:section(TypedSection, "interface", translate("Currently Configured Interfaces"))
++ mwan_interface.addremove = false
++ mwan_interface.dynamic = false
++ mwan_interface.sortable = false
++ mwan_interface.template = "cbi/tblsection"
++
++
++return m5
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/policy.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/policy.lua
+new file mode 100644
+index 0000000..e141d69
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/policy.lua
+@@ -0,0 +1,95 @@
++-- ------ extra functions ------ --
++
++function policyCheck() -- check to see if any policy names exceed the maximum of 15 characters
++ uci.cursor():foreach("mwan3", "policy",
++ function (section)
++ if string.len(section[".name"]) > 15 then
++ nameTooLong = 1
++ err_name_list = err_name_list .. section[".name"] .. " "
++ end
++ end
++ )
++end
++
++function policyWarn() -- display status and warning messages at the top of the page
++ if nameTooLong == 1 then
++ return "<font color=\"ff0000\"><strong>WARNING: Some policies have names exceeding the maximum of 15 characters!</strong></font>"
++ else
++ return ""
++ end
++end
++
++-- ------ policy configuration ------ --
++
++ds = require "luci.dispatcher"
++sys = require "luci.sys"
++
++nameTooLong = 0
++err_name_list = " "
++policyCheck()
++
++
++m5 = Map("mwan3", translate("MWAN Policy Configuration"),
++ translate(policyWarn()))
++ m5:append(Template("mwan/config_css"))
++
++
++mwan_policy = m5:section(TypedSection, "policy", translate("Policies"),
++ translate("Policies are profiles grouping one or more members controlling how MWAN distributes traffic<br />" ..
++ "Member interfaces with lower metrics are used first. Interfaces with the same metric load-balance<br />" ..
++ "Load-balanced member interfaces distribute more traffic out those with higher weights<br />" ..
++ "Names may contain characters A-Z, a-z, 0-9, _ and no spaces. Names must be 15 characters or less<br />" ..
++ "Policies may not share the same name as configured interfaces, members or rules"))
++ mwan_policy.addremove = true
++ mwan_policy.dynamic = false
++ mwan_policy.sectionhead = "Policy"
++ mwan_policy.sortable = true
++ mwan_policy.template = "cbi/tblsection"
++ mwan_policy.extedit = ds.build_url("admin", "network", "mwan", "configuration", "policy", "%s")
++ function mwan_policy.create(self, section)
++ TypedSection.create(self, section)
++ m5.uci:save("mwan3")
++ luci.http.redirect(ds.build_url("admin", "network", "mwan", "configuration", "policy", section))
++ end
++
++
++use_member = mwan_policy:option(DummyValue, "use_member", translate("Members assigned"))
++ use_member.rawhtml = true
++ function use_member.cfgvalue(self, s)
++ local memberConfig, memberList = self.map:get(s, "use_member"), ""
++ if memberConfig then
++ for k,v in pairs(memberConfig) do
++ memberList = memberList .. v .. "<br />"
++ end
++ return memberList
++ else
++ return "&#8212;"
++ end
++
++ end
++
++last_resort = mwan_policy:option(DummyValue, "last_resort", translate("Last resort"))
++ last_resort.rawhtml = true
++ function last_resort.cfgvalue(self, s)
++ local action = self.map:get(s, "last_resort")
++ if action == "blackhole" then
++ return "blackhole (drop)"
++ elseif action == "default" then
++ return "default (use main routing table)"
++ else
++ return "unreachable (reject)"
++ end
++ end
++
++errors = mwan_policy:option(DummyValue, "errors", translate("Errors"))
++ errors.rawhtml = true
++ function errors.cfgvalue(self, s)
++ if not string.find(err_name_list, " " .. s .. " ") then
++ return ""
++ else
++ return "<span title=\"Name exceeds 15 characters\"><img src=\"/luci-static/resources/cbi/reset.gif\" alt=\"error\"></img></span>"
++ end
++ end
++
++
++return m5
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/policyconfig.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/policyconfig.lua
+new file mode 100644
+index 0000000..f48a104
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/policyconfig.lua
+@@ -0,0 +1,65 @@
++-- ------ extra functions ------ --
++
++function policyCheck() -- check to see if this policy's name exceed the maximum of 15 characters
++ policyNameLength = string.len(arg[1])
++ if policyNameLength > 15 then
++ nameTooLong = 1
++ end
++end
++
++function policyWarn() -- display status and warning messages at the top of the page
++ if nameTooLong == 1 then
++ return "<font color=\"ff0000\"><strong>WARNING: this policy's name is " .. policyNameLength .. " characters exceeding the maximum of 15!</strong></font>"
++ else
++ return ""
++ end
++end
++
++function cbiAddMember(field)
++ uci.cursor():foreach("mwan3", "member",
++ function (section)
++ field:value(section[".name"])
++ end
++ )
++end
++
++-- ------ policy configuration ------ --
++
++dsp = require "luci.dispatcher"
++arg[1] = arg[1] or ""
++
++nameTooLong = 0
++policyCheck()
++
++
++m5 = Map("mwan3", translate("MWAN Policy Configuration - " .. arg[1]),
++ translate(policyWarn()))
++ m5.redirect = dsp.build_url("admin", "network", "mwan", "configuration", "policy")
++
++
++mwan_policy = m5:section(NamedSection, arg[1], "policy", "")
++ mwan_policy.addremove = false
++ mwan_policy.dynamic = false
++
++
++use_member = mwan_policy:option(DynamicList, "use_member", translate("Member used"))
++ cbiAddMember(use_member)
++
++last_resort = mwan_policy:option(ListValue, "last_resort", translate("Last resort"),
++ translate("When all policy members are offline use this behavior for matched traffic"))
++ last_resort.default = "unreachable"
++ last_resort:value("unreachable", translate("unreachable (reject)"))
++ last_resort:value("blackhole", translate("blackhole (drop)"))
++ last_resort:value("default", translate("default (use main routing table)"))
++
++
++-- ------ currently configured members ------ --
++
++mwan_member = m5:section(TypedSection, "member", translate("Currently Configured Members"))
++ mwan_member.addremove = false
++ mwan_member.dynamic = false
++ mwan_member.sortable = false
++ mwan_member.template = "cbi/tblsection"
++
++
++return m5
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/rule.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/rule.lua
+new file mode 100644
+index 0000000..a22e010
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/rule.lua
+@@ -0,0 +1,141 @@
++-- ------ extra functions ------ --
++
++function ruleCheck() -- determine if rules needs a proper protocol configured
++ uci.cursor():foreach("mwan3", "rule",
++ function (section)
++ local sourcePort = ut.trim(sys.exec("uci -p /var/state get mwan3." .. section[".name"] .. ".src_port"))
++ local destPort = ut.trim(sys.exec("uci -p /var/state get mwan3." .. section[".name"] .. ".dest_port"))
++ if sourcePort ~= "" or destPort ~= "" then -- ports configured
++ local protocol = ut.trim(sys.exec("uci -p /var/state get mwan3." .. section[".name"] .. ".proto"))
++ if protocol == "" or protocol == "all" then -- no or improper protocol
++ error_protocol_list = error_protocol_list .. section[".name"] .. " "
++ end
++ end
++ end
++ )
++end
++
++function ruleWarn() -- display warning messages at the top of the page
++ if error_protocol_list ~= " " then
++ return "<font color=\"ff0000\"><strong>WARNING: some rules have a port configured with no or improper protocol specified! Please configure a specific protocol!</strong></font>"
++ else
++ return ""
++ end
++end
++
++-- ------ rule configuration ------ --
++
++dsp = require "luci.dispatcher"
++sys = require "luci.sys"
++ut = require "luci.util"
++
++error_protocol_list = " "
++ruleCheck()
++
++
++m5 = Map("mwan3", translate("MWAN Rule Configuration"),
++ translate(ruleWarn()))
++ m5:append(Template("mwan/config_css"))
++
++
++mwan_rule = m5:section(TypedSection, "rule", translate("Traffic Rules"),
++ translate("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"))
++ mwan_rule.addremove = true
++ mwan_rule.anonymous = false
++ mwan_rule.dynamic = false
++ mwan_rule.sectionhead = "Rule"
++ mwan_rule.sortable = true
++ mwan_rule.template = "cbi/tblsection"
++ mwan_rule.extedit = dsp.build_url("admin", "network", "mwan", "configuration", "rule", "%s")
++ function mwan_rule.create(self, section)
++ TypedSection.create(self, section)
++ m5.uci:save("mwan3")
++ luci.http.redirect(dsp.build_url("admin", "network", "mwan", "configuration", "rule", section))
++ end
++
++
++src_ip = mwan_rule:option(DummyValue, "src_ip", translate("Source address"))
++ src_ip.rawhtml = true
++ function src_ip.cfgvalue(self, s)
++ return self.map:get(s, "src_ip") or "&#8212;"
++ end
++
++src_port = mwan_rule:option(DummyValue, "src_port", translate("Source port"))
++ src_port.rawhtml = true
++ function src_port.cfgvalue(self, s)
++ return self.map:get(s, "src_port") or "&#8212;"
++ end
++
++dest_ip = mwan_rule:option(DummyValue, "dest_ip", translate("Destination address"))
++ dest_ip.rawhtml = true
++ function dest_ip.cfgvalue(self, s)
++ return self.map:get(s, "dest_ip") or "&#8212;"
++ end
++
++dest_port = mwan_rule:option(DummyValue, "dest_port", translate("Destination port"))
++ dest_port.rawhtml = true
++ function dest_port.cfgvalue(self, s)
++ return self.map:get(s, "dest_port") or "&#8212;"
++ end
++
++proto = mwan_rule:option(DummyValue, "proto", translate("Protocol"))
++ proto.rawhtml = true
++ function proto.cfgvalue(self, s)
++ return self.map:get(s, "proto") or "all"
++ end
++
++sticky = mwan_rule:option(DummyValue, "sticky", translate("Sticky"))
++ sticky.rawhtml = true
++ function sticky.cfgvalue(self, s)
++ if self.map:get(s, "sticky") == "1" then
++ stickied = 1
++ return "Yes"
++ else
++ stickied = nil
++ return "No"
++ end
++ end
++
++timeout = mwan_rule:option(DummyValue, "timeout", translate("Sticky timeout"))
++ timeout.rawhtml = true
++ function timeout.cfgvalue(self, s)
++ if stickied then
++ local timeoutValue = self.map:get(s, "timeout")
++ if timeoutValue then
++ return timeoutValue .. "s"
++ else
++ return "600s"
++ end
++ else
++ return "&#8212;"
++ end
++ end
++
++ipset = mwan_rule:option(DummyValue, "ipset", translate("IPset"))
++ ipset.rawhtml = true
++ function ipset.cfgvalue(self, s)
++ return self.map:get(s, "ipset") or "&#8212;"
++ end
++
++use_policy = mwan_rule:option(DummyValue, "use_policy", translate("Policy assigned"))
++ use_policy.rawhtml = true
++ function use_policy.cfgvalue(self, s)
++ return self.map:get(s, "use_policy") or "&#8212;"
++ end
++
++errors = mwan_rule:option(DummyValue, "errors", translate("Errors"))
++ errors.rawhtml = true
++ function errors.cfgvalue(self, s)
++ if not string.find(error_protocol_list, " " .. s .. " ") then
++ return ""
++ else
++ return "<span title=\"No protocol specified\"><img src=\"/luci-static/resources/cbi/reset.gif\" alt=\"error\"></img></span>"
++ end
++ end
++
++
++return m5
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/ruleconfig.lua b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/ruleconfig.lua
+new file mode 100644
+index 0000000..f7fb341
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/model/cbi/mwan/ruleconfig.lua
+@@ -0,0 +1,113 @@
++-- ------ extra functions ------ --
++
++function ruleCheck() -- determine if rule needs a protocol specified
++ local sourcePort = ut.trim(sys.exec("uci -p /var/state get mwan3." .. arg[1] .. ".src_port"))
++ local destPort = ut.trim(sys.exec("uci -p /var/state get mwan3." .. arg[1] .. ".dest_port"))
++ if sourcePort ~= "" or destPort ~= "" then -- ports configured
++ local protocol = ut.trim(sys.exec("uci -p /var/state get mwan3." .. arg[1] .. ".proto"))
++ if protocol == "" or protocol == "all" then -- no or improper protocol
++ error_protocol = 1
++ end
++ end
++end
++
++function ruleWarn() -- display warning message at the top of the page
++ if error_protocol == 1 then
++ return "<font color=\"ff0000\"><strong>WARNING: this rule is incorrectly configured with no or improper protocol specified! Please configure a specific protocol!</strong></font>"
++ else
++ return ""
++ end
++end
++
++function cbiAddPolicy(field)
++ uci.cursor():foreach("mwan3", "policy",
++ function (section)
++ field:value(section[".name"])
++ end
++ )
++end
++
++function cbiAddProtocol(field)
++ local protocols = ut.trim(sys.exec("cat /etc/protocols | grep ' # ' | awk '{print $1}' | grep -vw -e 'ip' -e 'tcp' -e 'udp' -e 'icmp' -e 'esp' | grep -v 'ipv6' | sort | tr '\n' ' '"))
++ for p in string.gmatch(protocols, "%S+") do
++ field:value(p)
++ end
++end
++
++-- ------ rule configuration ------ --
++
++dsp = require "luci.dispatcher"
++sys = require "luci.sys"
++ut = require "luci.util"
++arg[1] = arg[1] or ""
++
++error_protocol = 0
++ruleCheck()
++
++
++m5 = Map("mwan3", translate("MWAN Rule Configuration - ") .. arg[1],
++ translate(ruleWarn()))
++ m5.redirect = dsp.build_url("admin", "network", "mwan", "configuration", "rule")
++
++
++mwan_rule = m5:section(NamedSection, arg[1], "rule", "")
++ mwan_rule.addremove = false
++ mwan_rule.dynamic = false
++
++
++src_ip = mwan_rule:option(Value, "src_ip", translate("Source address"),
++ translate("Supports CIDR notation (eg \"192.168.100.0/24\") without quotes"))
++ src_ip.datatype = ipaddr
++
++src_port = mwan_rule:option(Value, "src_port", translate("Source port"),
++ translate("May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or as a portrange (eg \"1024:2048\") without quotes"))
++
++dest_ip = mwan_rule:option(Value, "dest_ip", translate("Destination address"),
++ translate("Supports CIDR notation (eg \"192.168.100.0/24\") without quotes"))
++ dest_ip.datatype = ipaddr
++
++dest_port = mwan_rule:option(Value, "dest_port", translate("Destination port"),
++ translate("May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or as a portrange (eg \"1024:2048\") without quotes"))
++
++proto = mwan_rule:option(Value, "proto", translate("Protocol"),
++ translate("View the contents of /etc/protocols for protocol descriptions"))
++ proto.default = "all"
++ proto.rmempty = false
++ proto:value("all")
++ proto:value("ip")
++ proto:value("tcp")
++ proto:value("udp")
++ proto:value("icmp")
++ proto:value("esp")
++ cbiAddProtocol(proto)
++
++sticky = mwan_rule:option(ListValue, "sticky", translate("Sticky"),
++ translate("Traffic from the same source IP address that previously matched this rule within the sticky timeout period will use the same WAN interface"))
++ sticky.default = "0"
++ sticky:value("1", translate("Yes"))
++ sticky:value("0", translate("No"))
++
++timeout = mwan_rule:option(Value, "timeout", translate("Sticky timeout"),
++ translate("Seconds. Acceptable values: 1-1000000. Defaults to 600 if not set"))
++ timeout.datatype = "range(1, 1000000)"
++
++ipset = mwan_rule:option(Value, "ipset", translate("IPset"),
++ translate("Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/youtube.com/youtube\")"))
++
++use_policy = mwan_rule:option(Value, "use_policy", translate("Policy assigned"))
++ cbiAddPolicy(use_policy)
++ use_policy:value("unreachable", translate("unreachable (reject)"))
++ use_policy:value("blackhole", translate("blackhole (drop)"))
++ use_policy:value("default", translate("default (use main routing table)"))
++
++
++-- ------ currently configured policies ------ --
++
++mwan_policy = m5:section(TypedSection, "policy", translate("Currently Configured Policies"))
++ mwan_policy.addremove = false
++ mwan_policy.dynamic = false
++ mwan_policy.sortable = false
++ mwan_policy.template = "cbi/tblsection"
++
++
++return m5
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/admin_status/index/mwan.htm b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/admin_status/index/mwan.htm
+new file mode 100644
+index 0000000..53b997a
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/admin_status/index/mwan.htm
+@@ -0,0 +1 @@
++<%+mwan/openwrt_overview_status%>
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_diagnostics.htm b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_diagnostics.htm
+new file mode 100644
+index 0000000..1961569
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_diagnostics.htm
+@@ -0,0 +1,128 @@
++<%+header%>
++
++<ul class="cbi-tabmenu">
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript")%>"><%:Hotplug Script%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/mwanconfig")%>"><%:MWAN Config%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/networkconfig")%>"><%:Network Config%></a></li>
++ <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/diagnostics")%>"><%:Diagnostics%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/troubleshooting")%>"><%:Troubleshooting%></a></li>
++</ul>
++
++<%
++ local uci = require "luci.model.uci"
++
++ interfaceNames = ""
++ uci.cursor():foreach("mwan3", "interface",
++ function (section)
++ interfaceNames = interfaceNames .. section[".name"] .. " "
++ end
++ )
++%>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ var stxhr = new XHR();
++
++ function update_status(tool, task)
++ {
++ var iface = document.getElementById('mwaniface').value;
++ var output = document.getElementById('diag_output');
++
++ if (tool == "service")
++ {
++ output.innerHTML =
++ '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="padding: 20px; vertical-align: middle;" /> ' +
++ "Waiting for MWAN to " + task + "..."
++ ;
++ }
++ else
++ {
++ output.innerHTML =
++ '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="padding: 20px; vertical-align: middle;" /> ' +
++ "Waiting for diagnostic results..."
++ ;
++ }
++
++ output.parentNode.style.display = 'block';
++ output.style.display = 'inline';
++
++ stxhr.get('<%=luci.dispatcher.build_url("admin", "network", "mwan", "advanced")%>/diagnostics_display' + '/' + iface + '/' + tool + '/' + task, null,
++ function(x, mArray)
++ {
++ if (mArray.diagnostics)
++ {
++ output.innerHTML = String.format('<pre id="diag_output_css">%h</pre>', mArray.diagnostics[0]);
++ }
++ else
++ {
++ output.innerHTML = '<pre id="diag_output_css"><strong>No diagnostic results returned</strong></pre>';
++ }
++ }
++ );
++ }
++//]]></script>
++
++<div id="mwan_diagnostics" class="cbi-map">
++ <fieldset id="diag_select" class="cbi-section">
++ <legend><%:MWAN Interface Diagnostics%></legend>
++ <select id="mwaniface">
++ <% for z in interfaceNames:gmatch("[^ ]+") do -%><option value="<%=z%>"><%=z%></option><%- end %>
++ </select>
++ <div id="buttoncss">
++ <input type="button" value="<%:Ping default gateway%>" class="cbi-button cbi-button-apply" onclick="update_status('ping', 'gateway')" />
++ <input type="button" value="<%:Ping tracking IP%>" class="cbi-button cbi-button-apply" onclick="update_status('ping', 'track_ip')" />
++ <input type="button" value="<%:Check IP rules%>" class="cbi-button cbi-button-apply" onclick="update_status('rulechk', null)" />
++ <input type="button" value="<%:Check routing table%>" class="cbi-button cbi-button-apply" onclick="update_status('routechk', null)" />
++ <input type="button" value="<%:Hotplug ifup%>" class="cbi-button cbi-button-apply" onclick="update_status('hotplug', 'ifup')" />
++ <input type="button" value="<%:Hotplug ifdown%>" class="cbi-button cbi-button-apply" onclick="update_status('hotplug', 'ifdown')" />
++ </div>
++ </fieldset>
++ <fieldset id="diag_select" class="cbi-section">
++ <legend><%:MWAN Service Control%></legend>
++ <div id="buttoncss">
++ <input type="button" value="<%:Restart MWAN%>" class="cbi-button cbi-button-apply" onclick="update_status('service', 'restart')" />
++ <input type="button" value="<%:Stop MWAN%>" class="cbi-button cbi-button-apply" onclick="update_status('service', 'stop')" />
++ <input type="button" value="<%:Start MWAN%>" class="cbi-button cbi-button-apply" onclick="update_status('service', 'start')" />
++ </div>
++ </fieldset>
++ <fieldset class="cbi-section" style="display:none">
++ <legend><%:Diagnostic Results%></legend>
++ <div id="diag_output"></div>
++ </fieldset>
++</div>
++
++<style type="text/css">
++ .container { /* container for entire page. fixes bootstrap theme's ridiculously small page width */
++ max-width: none;
++ margin-left: 30px;
++ padding-right: 30px;
++ width: auto;
++ }
++ #mwan_diagnostics {
++ background-color: #FFFFFF;
++ border: 1px dotted #555555;
++ padding: 20px;
++ }
++ #diag_select {
++ padding: 12px 20px 20px 20px;
++ }
++ #mwaniface {
++ float: left;
++ margin: 8px 20px 0px 0px;
++ }
++ #buttoncss {
++ display: table;
++ float: left;
++ text-align: left;
++ }
++ .cbi-button {
++ margin: 8px 20px 0px 0px;
++ min-width: 153px;
++ }
++ #diag_output_css {
++ padding: 20px;
++ text-align: left;
++ }
++</style>
++
++<%+footer%>
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_hotplugscript.htm b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_hotplugscript.htm
+new file mode 100644
+index 0000000..cbef94b
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_hotplugscript.htm
+@@ -0,0 +1,23 @@
++<ul class="cbi-tabmenu">
++ <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript")%>"><%:Hotplug Script%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/mwanconfig")%>"><%:MWAN Config%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/networkconfig")%>"><%:Network Config%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/diagnostics")%>"><%:Diagnostics%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/troubleshooting")%>"><%:Troubleshooting%></a></li>
++</ul>
++
++<style type="text/css">
++ .container { /* container for entire page. fixes bootstrap theme's ridiculously small page width */
++ max-width: none;
++ margin: 0px 0px 0px 30px;
++ padding-right: 30px;
++ width: auto;
++ }
++ .cbi-section-node {
++ margin-top: 20px;
++ }
++ .cbi-section {
++ border: 1px dotted #555555;
++ padding: 20px;
++ }
++</style>
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_mwanconfig.htm b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_mwanconfig.htm
+new file mode 100644
+index 0000000..5d83bdd
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_mwanconfig.htm
+@@ -0,0 +1,23 @@
++<ul class="cbi-tabmenu">
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript")%>"><%:Hotplug Script%></a></li>
++ <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/mwanconfig")%>"><%:MWAN Config%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/networkconfig")%>"><%:Network Config%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/diagnostics")%>"><%:Diagnostics%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/troubleshooting")%>"><%:Troubleshooting%></a></li>
++</ul>
++
++<style type="text/css">
++ .container { /* container for entire page. fixes bootstrap theme's ridiculously small page width */
++ max-width: none;
++ margin: 0px 0px 0px 30px;
++ padding-right: 30px;
++ width: auto;
++ }
++ .cbi-section-node {
++ margin-top: 20px;
++ }
++ .cbi-section {
++ border: 1px dotted #555555;
++ padding: 20px;
++ }
++</style>
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_networkconfig.htm b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_networkconfig.htm
+new file mode 100644
+index 0000000..5c06d36
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_networkconfig.htm
+@@ -0,0 +1,23 @@
++<ul class="cbi-tabmenu">
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript")%>"><%:Hotplug Script%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/mwanconfig")%>"><%:MWAN Config%></a></li>
++ <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/networkconfig")%>"><%:Network Config%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/diagnostics")%>"><%:Diagnostics%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/troubleshooting")%>"><%:Troubleshooting%></a></li>
++</ul>
++
++<style type="text/css">
++ .container { /* container for entire page. fixes bootstrap theme's ridiculously small page width */
++ max-width: none;
++ margin: 0px 0px 0px 30px;
++ padding-right: 30px;
++ width: auto;
++ }
++ .cbi-section-node {
++ margin-top: 20px;
++ }
++ .cbi-section {
++ border: 1px dotted #555555;
++ padding: 20px;
++ }
++</style>
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_troubleshooting.htm b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_troubleshooting.htm
+new file mode 100644
+index 0000000..514d91f
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/advanced_troubleshooting.htm
+@@ -0,0 +1,71 @@
++<%+header%>
++
++<ul class="cbi-tabmenu">
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript")%>"><%:Hotplug Script%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/mwanconfig")%>"><%:MWAN Config%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/networkconfig")%>"><%:Network Config%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/diagnostics")%>"><%:Diagnostics%></a></li>
++ <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/troubleshooting")%>"><%:Troubleshooting%></a></li>
++</ul>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ XHR.poll(15, '<%=luci.dispatcher.build_url("admin", "network", "mwan", "advanced", "troubleshooting_display")%>', null,
++ function(x, mArray)
++ {
++ var tshoot = document.getElementById('troubleshoot_text');
++ if (mArray.versions)
++ {
++ var versions = '<span class="description">Software versions : </span><br /><br />';
++ var mwanConfig = '<br /><br /><span class="description">Output of &#34;cat /etc/config/mwan3&#34; : </span><br /><br />';
++ var netConfig = '<br /><br /><span class="description">Output of &#34;cat /etc/config/network&#34; : </span><br /><br />';
++ var ifconfig = '<br /><br /><span class="description">Output of &#34;ifconfig&#34; : </span><br /><br />';
++ var ipRoute = '<br /><br /><span class="description">Output of &#34;route -n&#34; : </span><br /><br />';
++ var ipRuleShow = '<br /><br /><span class="description">Output of &#34;ip rule show&#34; : </span><br /><br />';
++ var routeListTable = '<br /><br /><span class="description">Output of &#34;ip route list table 1-250&#34; : </span><br /><br />';
++ var firewallOut = '<br /><br /><span class="description">Firewall default output policy (must be ACCEPT) : </span><br /><br />';
++ var iptables = '<br /><br /><span class="description">Output of &#34;iptables -L -t mangle -v -n&#34; : </span><br /><br />';
++ tshoot.innerHTML = String.format(
++ '<pre>%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s</pre>',
++ versions, mArray.versions[0], mwanConfig, mArray.mwanconfig[0], netConfig, mArray.netconfig[0],
++ ifconfig, mArray.ifconfig[0], ipRoute, mArray.routeshow[0], ipRuleShow, mArray.iprule[0],
++ routeListTable, mArray.routelist[0], firewallOut, mArray.firewallout[0], iptables, mArray.iptables[0]
++ );
++ }
++ else
++ {
++ tshoot.innerHTML = '<strong>Error collecting troubleshooting information</strong>';
++ }
++ }
++ );
++//]]></script>
++
++<div id="troubleshoot">
++ <fieldset class="cbi-section">
++ <legend><%:Troubleshooting Data%></legend>
++ <div id="troubleshoot_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> Collecting data...</div>
++ </fieldset>
++</div>
++
++<style type="text/css">
++ .container { /* container for entire page. fixes bootstrap theme's ridiculously small page width */
++ max-width: none;
++ margin-left: 30px;
++ padding-right: 30px;
++ width: auto;
++ }
++ #troubleshoot {
++ background-color: #FFFFFF;
++ border: 1px dotted #555555;
++ padding: 20px;
++ }
++ #troubleshoot_text {
++ padding: 20px;
++ text-align: left;
++ }
++ .description {
++ background-color: rgb(78, 186, 241);
++ }
++</style>
++
++<%+footer%>
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/config_css.htm b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/config_css.htm
+new file mode 100644
+index 0000000..99da487
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/config_css.htm
+@@ -0,0 +1,34 @@
++<style type="text/css">
++ .container { /* container for entire page. fixes bootstrap theme's ridiculously small page width */
++ max-width: none;
++ margin-left: 30px;
++ padding-right: 30px;
++ width: auto;
++ }
++ table td { /* cells showing the configuration values */
++ padding: 0px;
++ text-align: center;
++ vertical-align: middle;
++ }
++ table th { /* column for configuration section name */
++ padding: 0px;
++ text-align: center;
++ vertical-align: middle;
++ }
++ table tbody th { /* column for configuration section name */
++ padding: 0px;
++ vertical-align: middle;
++ }
++ .cbi-section-node table div { /* rows */
++ padding-top: 5px;
++ }
++ table.cbi-section-table td.cbi-section-table-cell { /* sort buttons column */
++ text-align: center;
++ }
++ .cbi-section h3 {
++ color: rgb(85, 85, 85);
++ font-family: Trebuchet MS,Verdana,sans-serif;
++ font-style: italic;
++ font-weight: normal;
++ }
++</style>
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/openwrt_overview_status.htm b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/openwrt_overview_status.htm
+new file mode 100644
+index 0000000..9329b92
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/openwrt_overview_status.htm
+@@ -0,0 +1,83 @@
++<script type="text/javascript">//<![CDATA[
++ XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "mwan", "overview", "interface_status")%>', null,
++ function(x, mArray)
++ {
++ var status = document.getElementById('mwan_status_text');
++ if (mArray.wans)
++ {
++ var temp = '';
++ for ( var i = 0; i < mArray.wans.length; i++ )
++ {
++ var stat = '';
++ var cssc = '';
++ switch (mArray.wans[i].status)
++ {
++ case 'online':
++ stat = 'Online (tracking active)';
++ cssc = 'wanon';
++ break;
++ case 'notMonitored':
++ stat = 'Online (tracking off)';
++ cssc = 'wanon';
++ break;
++ case 'offline':
++ stat = 'Offline';
++ cssc = 'wanoff';
++ break;
++ case 'notEnabled':
++ stat = 'Disabled';
++ cssc = 'wanoff';
++ break;
++ }
++ temp += String.format(
++ '<span class="%s"><strong>%s (<a href="%q">%s</a>)</strong><br />%s</span>',
++ cssc, mArray.wans[i].name, mArray.wans[i].link, mArray.wans[i].ifname, stat
++ );
++ }
++ status.innerHTML = temp;
++ }
++ else
++ {
++ status.innerHTML = '<strong>No MWAN interfaces found</strong>';
++ }
++ }
++ );
++//]]></script>
++
++<fieldset id="interface_field" class="cbi-section">
++ <legend><%:MWAN Interface Live Status%></legend>
++ <div id="mwan_status_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> Collecting data...</div>
++</fieldset>
++
++<style type="text/css">
++ .container { /* container for entire page. fixes bootstrap theme's ridiculously small page width */
++ max-width: 1044px;
++ }
++ #interface_field {
++ padding: 12px 20px 20px 20px;
++ }
++ #mwan_status_text {
++ display: table;
++ font-size: 14px;
++ margin: auto;
++ max-width: 1044px;
++ min-width: 246px;
++ width: 100%;
++ }
++ .wanon {
++ background-color: rgb(144, 240, 144);
++ }
++ .wanoff {
++ background-color: rgb(240, 144, 144);
++ }
++ .wanon, .wanoff {
++ border-radius: 60px;
++ box-shadow: 0px 2px 5px -3px;
++ float: left;
++ margin: 8px 3px 0px 3px;
++ min-height: 30px;
++ min-width: 235px;
++ padding: 5px 10px 8px 10px;
++ text-align: center;
++ }
++</style>
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/overview_detailed.htm b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/overview_detailed.htm
+new file mode 100644
+index 0000000..b80b9f3
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/overview_detailed.htm
+@@ -0,0 +1,51 @@
++<%+header%>
++
++<ul class="cbi-tabmenu">
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/overview")%>"><%:Interface Status%></a></li>
++ <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/overview/overview_detailed")%>"><%:Detailed Status%></a></li>
++</ul>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "mwan", "overview", "detailed_status")%>', null,
++ function(x, mArray)
++ {
++ var status = document.getElementById('mwan_detail_text');
++ if (mArray.mwandetail)
++ {
++ status.innerHTML = String.format('<pre>%s</pre>', mArray.mwandetail[0]);
++ }
++ else
++ {
++ status.innerHTML = '<strong>No detailed status information available</strong>';
++ }
++ }
++ );
++//]]></script>
++
++<div id="mwan_detail_status">
++ <fieldset class="cbi-section">
++ <legend><%:MWAN Detailed Status%></legend>
++ <div id="mwan_detail_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> Collecting data...</div>
++ </fieldset>
++</div>
++
++<style type="text/css">
++ .container { /* container for entire page. fixes bootstrap theme's ridiculously small page width */
++ max-width: none;
++ margin-left: 30px;
++ padding-right: 30px;
++ width: auto;
++ }
++ #mwan_detail_status {
++ border: 1px dotted #555555;
++ background-color: #FFFFFF;
++ padding: 20px;
++ }
++ #mwan_detail_text {
++ padding: 20px;
++ text-align: left;
++ }
++</style>
++
++<%+footer%>
+diff --git a/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/overview_interface.htm b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/overview_interface.htm
+new file mode 100644
+index 0000000..472c7ce
+--- /dev/null
++++ b/feeds/packages/net/mwan3-luci/files/usr/lib/lua/luci/view/mwan/overview_interface.htm
+@@ -0,0 +1,122 @@
++<%+header%>
++
++<ul class="cbi-tabmenu">
++ <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/overview")%>"><%:Interface Status%></a></li>
++ <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/overview/overview_detailed")%>"><%:Detailed Status%></a></li>
++</ul>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++ XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "mwan", "overview", "interface_status")%>', null,
++ function(x, mArray)
++ {
++ var statusDiv = document.getElementById('mwan_status_text');
++ if (mArray.wans)
++ {
++ var interfaceStatus = '';
++ for ( var i = 0; i < mArray.wans.length; i++ )
++ {
++ var status = '';
++ var css = '';
++ switch (mArray.wans[i].status)
++ {
++ case 'online':
++ status = 'Online (tracking active)';
++ css = 'wanon';
++ break;
++ case 'notMonitored':
++ status = 'Online (tracking off)';
++ css = 'wanon';
++ break;
++ case 'offline':
++ status = 'Offline';
++ css = 'wanoff';
++ break;
++ case 'notEnabled':
++ status = 'Disabled';
++ css = 'wanoff';
++ break;
++ }
++ interfaceStatus += String.format(
++ '<span class="%s"><strong>%s (<a href="%q">%s</a>)</strong><br />%s</span>',
++ css, mArray.wans[i].name, mArray.wans[i].link, mArray.wans[i].ifname, status
++ );
++ }
++ statusDiv.innerHTML = interfaceStatus;
++ }
++ else
++ {
++ statusDiv.innerHTML = '<strong>No MWAN interfaces found</strong>';
++ }
++
++ var logs = document.getElementById('mwan_statuslog_text');
++ if (mArray.mwanlog)
++ {
++ var mwanLog = 'Last 50 MWAN systemlog entries. Newest entries sorted at the top :';
++ logs.innerHTML = String.format('<pre>%s<br /><br />%s</pre>', mwanLog, mArray.mwanlog[0]);
++ }
++ else
++ {
++ logs.innerHTML = '<strong>No MWAN systemlog history found</strong>';
++ }
++ }
++ );
++//]]></script>
++
++<div id="mwan_interface_status">
++ <fieldset id="interface_field" class="cbi-section">
++ <legend><%:MWAN Interface Live Status%></legend>
++ <div id="mwan_status_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> Collecting data...</div>
++ </fieldset>
++ <fieldset class="cbi-section">
++ <legend><%:MWAN Interface Systemlog%></legend>
++ <div id="mwan_statuslog_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> Collecting data...</div>
++ </fieldset>
++</div>
++
++<style type="text/css">
++ .container { /* container for entire page. fixes bootstrap theme's ridiculously small page width */
++ max-width: none;
++ margin-left: 30px;
++ padding-right: 30px;
++ width: auto;
++ }
++ #mwan_interface_status {
++ background-color: #FFFFFF;
++ border: 1px dotted #555555;
++ padding: 20px;
++ }
++ #interface_field {
++ padding: 12px 20px 20px 20px;
++ }
++ #mwan_status_text {
++ display: table;
++ font-size: 14px;
++ margin: auto;
++ max-width: 1044px;
++ min-width: 246px;
++ width: 100%;
++ }
++ .wanon {
++ background-color: rgb(144, 240, 144);
++ }
++ .wanoff {
++ background-color: rgb(240, 144, 144);
++ }
++ .wanon, .wanoff {
++ border-radius: 60px;
++ box-shadow: 0px 2px 5px -3px;
++ float: left;
++ margin: 8px 3px 0px 3px;
++ min-height: 30px;
++ min-width: 235px;
++ padding: 5px 10px 8px 10px;
++ text-align: center;
++ }
++ #mwan_statuslog_text {
++ padding: 20px;
++ text-align: left;
++ }
++</style>
++
++<%+footer%>
+diff --git a/feeds/packages/net/mwan3/Makefile b/feeds/packages/net/mwan3/Makefile
+new file mode 100644
+index 0000000..bcf56f0
+--- /dev/null
++++ b/feeds/packages/net/mwan3/Makefile
+@@ -0,0 +1,45 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mwan3
++PKG_VERSION:=1.6
++PKG_RELEASE:=3
++PKG_MAINTAINER:=Jeroen Louwes <jeroen.louwes@gmail.com>
++PKG_LICENSE:=GPLv2
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mwan3
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ DEPENDS:=+ip +ipset +iptables +iptables-mod-conntrack-extra +iptables-mod-ipopt
++ TITLE:=Multiwan hotplug script with connection tracking support
++ MAINTAINER:=Jeroen Louwes <jeroen.louwes@gmail.com>
++ PKGARCH:=all
++endef
++
++define Package/mwan3/description
++Hotplug script which makes configuration of multiple WAN interfaces simple
++and manageable. With loadbalancing/failover support for up to 250 wan
++interfaces, connection tracking and an easy to manage traffic ruleset.
++endef
++
++define Package/mwan3/conffiles
++/etc/config/mwan3
++endef
++
++define Build/Compile
++endef
++
++define Package/mwan3/install
++$(CP) ./files/* $(1)
++endef
++
++$(eval $(call BuildPackage,mwan3))
+diff --git a/feeds/packages/net/mwan3/files/etc/config/mwan3 b/feeds/packages/net/mwan3/files/etc/config/mwan3
+new file mode 100644
+index 0000000..f66c024
+--- /dev/null
++++ b/feeds/packages/net/mwan3/files/etc/config/mwan3
+@@ -0,0 +1,80 @@
++
++config interface 'wan'
++ option enabled '1'
++ list track_ip '8.8.4.4'
++ list track_ip '8.8.8.8'
++ list track_ip '208.67.222.222'
++ list track_ip '208.67.220.220'
++ option reliability '2'
++ option count '1'
++ option timeout '2'
++ option interval '5'
++ option down '3'
++ option up '8'
++
++config interface 'wan2'
++ option enabled '0'
++ list track_ip '8.8.8.8'
++ list track_ip '208.67.220.220'
++ option reliability '1'
++ option count '1'
++ option timeout '2'
++ option interval '5'
++ option down '3'
++ option up '8'
++
++config member 'wan_m1_w3'
++ option interface 'wan'
++ option metric '1'
++ option weight '3'
++
++config member 'wan_m2_w3'
++ option interface 'wan'
++ option metric '2'
++ option weight '3'
++
++config member 'wan2_m1_w2'
++ option interface 'wan2'
++ option metric '1'
++ option weight '2'
++
++config member 'wan2_m2_w2'
++ option interface 'wan2'
++ option metric '2'
++ option weight '2'
++
++config policy 'wan_only'
++ list use_member 'wan_m1_w3'
++
++config policy 'wan2_only'
++ list use_member 'wan2_m1_w2'
++
++config policy 'balanced'
++ list use_member 'wan_m1_w3'
++ list use_member 'wan2_m1_w2'
++
++config policy 'wan_wan2'
++ list use_member 'wan_m1_w3'
++ list use_member 'wan2_m2_w2'
++
++config policy 'wan2_wan'
++ list use_member 'wan_m2_w3'
++ list use_member 'wan2_m1_w2'
++
++config rule 'youtube'
++ option sticky '1'
++ option ipset 'youtube'
++ option dest_port '80,443'
++ option proto 'tcp'
++ option use_policy 'balanced'
++
++config rule 'https'
++ option sticky '1'
++ option dest_port '443'
++ option proto 'tcp'
++ option use_policy 'balanced'
++
++config rule 'default_rule'
++ option dest_ip '0.0.0.0/0'
++ option use_policy 'balanced'
++
+diff --git a/feeds/packages/net/mwan3/files/etc/hotplug.d/iface/15-mwan3 b/feeds/packages/net/mwan3/files/etc/hotplug.d/iface/15-mwan3
+new file mode 100644
+index 0000000..12423c7
+--- /dev/null
++++ b/feeds/packages/net/mwan3/files/etc/hotplug.d/iface/15-mwan3
+@@ -0,0 +1,444 @@
++#!/bin/sh
++
++local IP IPS IPT LOG
++
++[ -n "$ACTION" ] || exit 0
++[ -n "$INTERFACE" ] || exit 0
++
++if [ $ACTION == "ifup" ]; then
++ [ -n "$DEVICE" ] || exit 0
++fi
++
++if [ -x /usr/sbin/ip ]; then
++ IP="/usr/sbin/ip -4"
++elif [ -x /usr/bin/ip ]; then
++ IP="/usr/bin/ip -4"
++else
++ exit 1
++fi
++
++if [ -x /usr/sbin/ipset ]; then
++ IPS="/usr/sbin/ipset"
++else
++ exit 1
++fi
++
++if [ -x /usr/sbin/iptables ]; then
++ IPT="/usr/sbin/iptables -t mangle -w"
++else
++ exit 1
++fi
++
++if [ -x /usr/bin/logger ]; then
++ LOG="/usr/bin/logger -t mwan3 -p"
++else
++ exit 1
++fi
++
++
++mwan3_get_iface_id()
++{
++ let iface_count++
++ [ "$1" == "$INTERFACE" ] && iface_id=$iface_count
++}
++
++mwan3_set_general_iptables()
++{
++ if ! $IPT -S mwan3_ifaces &> /dev/null; then
++ $IPT -N mwan3_ifaces
++ fi
++
++ if ! $IPT -S mwan3_connected &> /dev/null; then
++ $IPT -N mwan3_connected
++ $IPS create mwan3_connected hash:net
++ $IPT -A mwan3_connected -m set --match-set mwan3_connected dst -j MARK --set-xmark 0xff00/0xff00
++ fi
++
++ if ! $IPT -S mwan3_track &> /dev/null; then
++ $IPT -N mwan3_track
++ fi
++
++ if ! $IPT -S mwan3_rules &> /dev/null; then
++ $IPT -N mwan3_rules
++ fi
++
++ if ! $IPT -S mwan3_hook &> /dev/null; then
++ $IPT -N mwan3_hook
++ $IPT -A mwan3_hook -j CONNMARK --restore-mark --nfmask 0xff00 --ctmask 0xff00
++ $IPT -A mwan3_hook -m mark --mark 0x0/0xff00 -j mwan3_ifaces
++ $IPT -A mwan3_hook -m mark --mark 0x0/0xff00 -j mwan3_connected
++ $IPT -A mwan3_hook -m mark --mark 0x0/0xff00 -j mwan3_track
++ $IPT -A mwan3_hook -m mark --mark 0x0/0xff00 -j mwan3_rules
++ $IPT -A mwan3_hook -j CONNMARK --save-mark --nfmask 0xff00 --ctmask 0xff00
++ $IPT -A mwan3_hook -m mark ! --mark 0xff00/0xff00 -j mwan3_connected
++ fi
++
++ if ! $IPT -S PREROUTING | grep mwan3_hook &> /dev/null; then
++ $IPT -A PREROUTING -j mwan3_hook
++ fi
++
++ if ! $IPT -S OUTPUT | grep mwan3_hook &> /dev/null; then
++ $IPT -A OUTPUT -j mwan3_hook
++ fi
++
++ $IPT -F mwan3_rules
++}
++
++mwan3_set_general_rules()
++{
++ if [ -z "$($IP rule list | awk '$1 == "2253:"')" ]; then
++ $IP rule add pref 2253 fwmark 0xfd00/0xff00 blackhole
++ fi
++
++ if [ -z "$($IP rule list | awk '$1 == "2254:"')" ]; then
++ $IP rule add pref 2254 fwmark 0xfe00/0xff00 unreachable
++ fi
++}
++
++mwan3_set_connected_iptables()
++{
++ local connected_network
++
++ if $IPT -S mwan3_connected &> /dev/null; then
++
++ $IPS create mwan3_connected_temp hash:net
++
++ for connected_network in $($IP route | awk '{print $1}' | egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}'); do
++ $IPS -! add mwan3_connected_temp $connected_network
++ done
++
++ for connected_network in $($IP route list table 0 | awk '{print $2}' | egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}'); do
++ $IPS -! add mwan3_connected_temp $connected_network
++ done
++
++ $IPS add mwan3_connected_temp 224.0.0.0/3
++ $IPS swap mwan3_connected_temp mwan3_connected
++ $IPS destroy mwan3_connected_temp
++
++ fi
++}
++
++mwan3_set_iface_iptables()
++{
++ if ! $IPT -S mwan3_iface_$INTERFACE &> /dev/null; then
++ $IPT -N mwan3_iface_$INTERFACE
++ fi
++
++ $IPT -F mwan3_iface_$INTERFACE
++ $IPT -D mwan3_ifaces -m mark --mark 0x0/0xff00 -j mwan3_iface_$INTERFACE &> /dev/null
++
++ if [ $ACTION == "ifup" ]; then
++ $IPT -I mwan3_iface_$INTERFACE -i $DEVICE -m set --match-set mwan3_connected src -m mark --mark 0x0/0xff00 -m comment --comment "default" -j MARK --set-xmark 0xff00/0xff00
++ $IPT -A mwan3_iface_$INTERFACE -i $DEVICE -m mark --mark 0x0/0xff00 -m comment --comment "$INTERFACE" -j MARK --set-xmark $(($iface_id*256))/0xff00
++ $IPT -A mwan3_ifaces -m mark --mark 0x0/0xff00 -j mwan3_iface_$INTERFACE
++ fi
++
++ if [ $ACTION == "ifdown" ]; then
++ $IPT -X mwan3_iface_$INTERFACE
++ fi
++}
++
++mwan3_set_iface_route()
++{
++ $IP route flush table $iface_id
++ [ $ACTION == "ifup" ] && $IP route add table $iface_id default $route_args
++}
++
++mwan3_set_iface_rules()
++{
++ while [ -n "$($IP rule list | awk '$1 == "'$(($iface_id+1000)):'"')" ]; do
++ $IP rule del pref $(($iface_id+1000))
++ done
++
++ while [ -n "$($IP rule list | awk '$1 == "'$(($iface_id+2000)):'"')" ]; do
++ $IP rule del pref $(($iface_id+2000))
++ done
++
++ [ $ACTION == "ifup" ] && $IP rule add pref $(($iface_id+1000)) iif $DEVICE lookup main
++ [ $ACTION == "ifup" ] && $IP rule add pref $(($iface_id+2000)) fwmark $(($iface_id*256))/0xff00 lookup $iface_id
++}
++
++mwan3_set_iface_ipset()
++{
++ local setname entry
++
++ for setname in $(ipset -n list | grep ^mwan3_sticky_); do
++ for entry in $(ipset list $setname | grep "$(echo $(($iface_id*256)) | awk '{ printf "0x%08x", $1; }')" | cut -d ' ' -f 1); do
++ $IPS del $setname $entry
++ done
++ done
++}
++
++mwan3_track()
++{
++ local track_ip track_ips reliability count timeout interval down up
++
++ mwan3_list_track_ips()
++ {
++ track_ips="$1 $track_ips"
++ }
++ config_list_foreach $INTERFACE track_ip mwan3_list_track_ips
++
++ if [ -e /var/run/mwan3track-$INTERFACE.pid ] ; then
++ kill $(cat /var/run/mwan3track-$INTERFACE.pid) &> /dev/null
++ rm /var/run/mwan3track-$INTERFACE.pid &> /dev/null
++ fi
++
++ if [ -n "$track_ips" ]; then
++ config_get reliability $INTERFACE reliability 1
++ config_get count $INTERFACE count 1
++ config_get timeout $INTERFACE timeout 4
++ config_get interval $INTERFACE interval 10
++ config_get down $INTERFACE down 5
++ config_get up $INTERFACE up 5
++
++ $IPS -! create mwan3_track_$INTERFACE hash:ip
++ $IPS create mwan3_track_temp_$INTERFACE hash:ip
++
++ for track_ip in $track_ips; do
++ $IPS -! add mwan3_track_temp_$INTERFACE $track_ip
++ done
++
++ $IPS swap mwan3_track_temp_$INTERFACE mwan3_track_$INTERFACE
++ $IPS destroy mwan3_track_temp_$INTERFACE
++
++ $IPT -D mwan3_track -p icmp -m set --match-set mwan3_track_$INTERFACE dst -m icmp --icmp-type 8 -m length --length 32 -j MARK --set-xmark 0xff00/0xff00 &> /dev/null
++ $IPT -A mwan3_track -p icmp -m set --match-set mwan3_track_$INTERFACE dst -m icmp --icmp-type 8 -m length --length 32 -j MARK --set-xmark 0xff00/0xff00
++
++ [ -x /usr/sbin/mwan3track ] && /usr/sbin/mwan3track $INTERFACE $DEVICE $reliability $count $timeout $interval $down $up $track_ips &
++ else
++ $IPT -D mwan3_track -p icmp -m set --match-set mwan3_track_$INTERFACE dst -m icmp --icmp-type 8 -m length --length 32 -j MARK --set-xmark 0xff00/0xff00 &> /dev/null
++ $IPS destroy mwan3_track_$INTERFACE
++ fi
++}
++
++mwan3_set_policy()
++{
++ local iface_count iface_id INTERFACE metric probability weight
++
++ config_get INTERFACE $1 interface
++ config_get metric $1 metric 1
++ config_get weight $1 weight 1
++
++ [ -n "$INTERFACE" ] || return 0
++
++ config_foreach mwan3_get_iface_id interface
++
++ [ -n "$iface_id" ] || return 0
++
++ if $IPT -S mwan3_iface_$INTERFACE &> /dev/null; then
++ if [ "$metric" -lt "$lowest_metric" ]; then
++
++ total_weight=$weight
++ $IPT -F mwan3_policy_$policy
++ $IPT -A mwan3_policy_$policy -m mark --mark 0x0/0xff00 -m comment --comment "$INTERFACE $weight $weight" -j MARK --set-xmark $(($iface_id*256))/0xff00
++
++ lowest_metric=$metric
++
++ elif [ "$metric" -eq "$lowest_metric" ]; then
++
++ total_weight=$(($total_weight+$weight))
++ probability=$(($weight*1000/$total_weight))
++
++ if [ "$probability" -lt 10 ]; then
++ probability="0.00$probability"
++ elif [ $probability -lt 100 ]; then
++ probability="0.0$probability"
++ elif [ $probability -lt 1000 ]; then
++ probability="0.$probability"
++ else
++ probability="1"
++ fi
++
++ probability="-m statistic --mode random --probability $probability"
++
++ $IPT -I mwan3_policy_$policy -m mark --mark 0x0/0xff00 $probability -m comment --comment "$INTERFACE $weight $total_weight" -j MARK --set-xmark $(($iface_id*256))/0xff00
++ fi
++ fi
++}
++
++mwan3_set_policies_iptables()
++{
++ local last_resort lowest_metric policy total_weight
++
++ policy=$1
++
++ config_get last_resort $1 last_resort unreachable
++
++ if [ "$policy" != $(echo "$policy" | cut -c1-15) ]; then
++ $LOG warn "Policy $policy exceeds max of 15 chars. Not setting policy" && return 0
++ fi
++
++ if ! $IPT -S mwan3_policy_$policy &> /dev/null; then
++ $IPT -N mwan3_policy_$policy
++ fi
++
++ $IPT -F mwan3_policy_$policy
++
++ case "$last_resort" in
++ blackhole)
++ $IPT -A mwan3_policy_$policy -m mark --mark 0x0/0xff00 -m comment --comment "blackhole" -j MARK --set-xmark 0xfd00/0xff00
++ ;;
++ default)
++ $IPT -A mwan3_policy_$policy -m mark --mark 0x0/0xff00 -m comment --comment "default" -j MARK --set-xmark 0xff00/0xff00
++ ;;
++ *)
++ $IPT -A mwan3_policy_$policy -m mark --mark 0x0/0xff00 -m comment --comment "unreachable" -j MARK --set-xmark 0xfe00/0xff00
++ ;;
++ esac
++
++ lowest_metric=256
++ total_weight=0
++
++ config_list_foreach $policy use_member mwan3_set_policy
++}
++
++mwan3_set_sticky_iptables()
++{
++ local INTERFACE iface_count iface_id
++
++ INTERFACE="$1"
++
++ config_foreach mwan3_get_iface_id interface
++ unset iface_count
++
++ $IPS -! create mwan3_sticky_$rule hash:ip,mark markmask 0xff00 timeout $timeout
++
++ if [ -n "$iface_id" ]; then
++ if [ -n "$($IPT -S mwan3_iface_$1 2> /dev/null)" ]; then
++ $IPT -I mwan3_rule_$rule -m set ! --match-set mwan3_sticky_$rule src,src -j MARK --set-xmark 0x0/0xff00
++ $IPT -I mwan3_rule_$rule -m mark --mark 0/0xff00 -j MARK --set-xmark $(($iface_id*256))/0xff00
++ fi
++ fi
++
++ unset iface_id
++}
++
++mwan3_set_user_rules_iptables()
++{
++ local ipset proto src_ip src_port sticky dest_ip dest_port use_policy rule timeout
++
++ config_get sticky $1 sticky 0
++ config_get timeout $1 timeout 600
++ config_get ipset $1 ipset
++ config_get proto $1 proto all
++ config_get src_ip $1 src_ip 0.0.0.0/0
++ config_get src_port $1 src_port 0:65535
++ config_get dest_ip $1 dest_ip 0.0.0.0/0
++ config_get dest_port $1 dest_port 0:65535
++ config_get use_policy $1 use_policy
++
++ rule="$1"
++
++ if [ "$rule" != $(echo "$rule" | cut -c1-15) ]; then
++ $LOG warn "Rule $rule exceeds max of 15 chars. Not setting rule" && return 0
++ fi
++
++ if [ -n "$ipset" ]; then
++ if [ -z "$($IPS -n list $ipset)" ]; then
++ $IPS create $ipset hash:ip timeout 3600
++ fi
++
++ ipset="-m set --match-set $ipset dst"
++ fi
++
++ if [ -n "$use_policy" ]; then
++ if [ "$use_policy" == "default" ]; then
++ use_policy="MARK --set-xmark 0xff00/0xff00"
++ elif [ "$use_policy" == "unreachable" ]; then
++ use_policy="MARK --set-xmark 0xfe00/0xff00"
++ elif [ "$use_policy" == "blackhole" ]; then
++ use_policy="MARK --set-xmark 0xfd00/0xff00"
++ else
++ if [ "$sticky" -eq 1 ]; then
++
++ if ! $IPT -S mwan3_rule_$rule &> /dev/null; then
++ $IPT -N mwan3_rule_$rule
++ fi
++
++ $IPT -F mwan3_rule_$rule
++
++ config_foreach mwan3_set_sticky_iptables interface
++
++ $IPT -A mwan3_rule_$rule -m mark --mark 0/0xff00 -j mwan3_policy_$use_policy
++ $IPT -A mwan3_rule_$rule -m mark ! --mark 0xfc00/0xfc00 -j SET --del-set mwan3_sticky_$rule src,src
++ $IPT -A mwan3_rule_$rule -m mark ! --mark 0xfc00/0xfc00 -j SET --add-set mwan3_sticky_$rule src,src
++
++ use_policy="mwan3_rule_$rule"
++ else
++ use_policy="mwan3_policy_$use_policy"
++ fi
++ fi
++
++ case $proto in
++ tcp|udp)
++ $IPT -A mwan3_rules -p $proto -s $src_ip -d $dest_ip $ipset -m multiport --sports $src_port -m multiport --dports $dest_port -m mark --mark 0/0xff00 -m comment --comment "$1" -j $use_policy &> /dev/null
++ ;;
++ *)
++ $IPT -A mwan3_rules -p $proto -s $src_ip -d $dest_ip $ipset -m mark --mark 0/0xff00 -m comment --comment "$1" -j $use_policy &> /dev/null
++ ;;
++ esac
++ fi
++}
++
++mwan3_ifupdown()
++{
++ local counter enabled iface_count iface_id route_args wan_metric
++
++ config_load mwan3
++ config_foreach mwan3_get_iface_id interface
++
++ [ -n "$iface_id" ] || return 0
++ [ "$iface_count" -le 250 ] || return 0
++ unset iface_count
++
++ config_get enabled $INTERFACE enabled 0
++
++ counter=0
++
++ if [ $ACTION == "ifup" ]; then
++ [ "$enabled" -eq 1 ] || return 0
++
++ while [ -z "$($IP route list dev $DEVICE default | head -1)" -a "$counter" -lt 10 ]; do
++ sleep 1
++ let counter++
++ if [ "$counter" -ge 10 ]; then
++ $LOG warn "Could not find gateway for interface $INTERFACE ($DEVICE)" && return 0
++ fi
++ done
++
++ route_args=$($IP route list dev $DEVICE default | head -1 | sed '/.*via \([^ ]*\) .*$/!d;s//via \1/;q' | egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}')
++ route_args="$route_args dev $DEVICE"
++ fi
++
++ while [ "$(pgrep -f -o hotplug-call)" -ne $$ -a "$counter" -lt 60 ]; do
++ sleep 1
++ let counter++
++ if [ "$counter" -ge 60 ]; then
++ $LOG warn "Timeout waiting for older hotplug processes to finish. $ACTION interface $INTERFACE (${DEVICE:-unknown}) aborted" && return 0
++ fi
++ done
++
++ $LOG notice "$ACTION interface $INTERFACE (${DEVICE:-unknown})"
++
++ mwan3_set_general_iptables
++ mwan3_set_general_rules
++ mwan3_set_iface_iptables
++ mwan3_set_iface_route
++ mwan3_set_iface_rules
++
++ [ $ACTION == "ifdown" ] && mwan3_set_iface_ipset
++ [ $ACTION == "ifup" ] && mwan3_track
++
++ config_foreach mwan3_set_policies_iptables policy
++ config_foreach mwan3_set_user_rules_iptables rule
++}
++
++case "$ACTION" in
++ ifup|ifdown)
++ mwan3_ifupdown
++ mwan3_set_connected_iptables
++ ;;
++esac
++
++exit 0
+diff --git a/feeds/packages/net/mwan3/files/usr/sbin/mwan3 b/feeds/packages/net/mwan3/files/usr/sbin/mwan3
+new file mode 100755
+index 0000000..a5da22a
+--- /dev/null
++++ b/feeds/packages/net/mwan3/files/usr/sbin/mwan3
+@@ -0,0 +1,237 @@
++#!/bin/sh
++
++if [ -x /usr/sbin/ip ]; then
++ IP="/usr/sbin/ip -4"
++elif [ -x /usr/bin/ip ]; then
++ IP="/usr/bin/ip -4"
++else
++ exit 1
++fi
++
++if [ -x /usr/sbin/ipset ]; then
++ IPS="/usr/sbin/ipset"
++else
++ exit 1
++fi
++
++if [ -x /usr/sbin/iptables ]; then
++ IPT="/usr/sbin/iptables -t mangle -w"
++else
++ exit 1
++fi
++
++. /lib/functions.sh
++
++help()
++{
++ cat <<EOF
++Syntax: mwan3 [command]
++
++Available commands:
++ start Load iptables rules, ip rules and ip routes
++ stop Unload iptables rules, ip rules and ip routes
++ restart Reload iptables rules, ip rules and ip routes
++ ifup <iface> Load rules and routes for specific interface
++ ifdown <iface> Unload rules and routes for specific interface
++ interfaces Show interfaces status
++ policies Show policies status
++ rules Show rules status
++ status Show all status
++
++EOF
++}
++
++ifdown()
++{
++ if [ -z "$1" ]; then
++ echo "Error: Expecting interface. Usage: mwan3 ifdown <interface>" && exit 0
++ fi
++
++ if [ -n "$2" ]; then
++ echo "Error: Too many arguments. Usage: mwan3 ifdown <interface>" && exit 0
++ fi
++
++ if [ -e /var/run/mwan3track-$1.pid ] ; then
++ kill $(cat /var/run/mwan3track-$1.pid)
++ rm /var/run/mwan3track-$1.pid
++ fi
++
++ ACTION=ifdown INTERFACE=$1 /sbin/hotplug-call iface
++}
++
++ifup()
++{
++ local device enabled
++
++ config_load mwan3
++
++ if [ -z "$1" ]; then
++ echo "Expecting interface. Usage: mwan3 ifup <interface>" && exit 0
++ fi
++
++ if [ -n "$2" ]; then
++ echo "Too many arguments. Usage: mwan3 ifup <interface>" && exit 0
++ fi
++
++ config_get enabled "$1" enabled 0
++
++ device=$(uci -p /var/state get network.$1.ifname) &> /dev/null
++
++ if [ -n "$device" ] ; then
++ [ "$enabled" -eq 1 ] && ACTION=ifup INTERFACE=$1 DEVICE=$device /sbin/hotplug-call iface
++ fi
++}
++
++interfaces()
++{
++ local device enabled iface_id tracking
++
++ config_load mwan3
++
++ echo "Interface status:"
++
++ check_iface_status()
++ {
++ let iface_id++
++ device=$(uci -p /var/state get network.$1.ifname) &> /dev/null
++
++ if [ -z "$device" ]; then
++ echo " interface $1 is unknown"
++ return 0
++ fi
++
++ config_get enabled "$1" enabled 0
++
++ if [ -n "$(ps -w | grep mwan3track | grep -v grep | sed '/.*\/usr\/sbin\/mwan3track \([^ ]*\) .*$/!d;s//\1/' | awk '$1 == "'$1'"')" ]; then
++ tracking="active"
++ else
++ tracking="down"
++ fi
++
++ if [ -n "$($IP rule | awk '$5 == "'$device'"')" -a -n "$($IPT -S mwan3_iface_$1 2> /dev/null)" -a -n "$($IP route list table $iface_id default dev $device 2> /dev/null)" ]; then
++ if [ -n "$(uci -p /var/state get mwan3.$1.track_ip 2> /dev/null)" ]; then
++ echo " interface $1 is online (tracking $tracking)"
++ else
++ echo " interface $1 is online"
++ fi
++ elif [ -n "$($IP rule | awk '$5 == "'$device'"')" -o -n "$($IPT -S mwan3_iface_$1 2> /dev/null)" -o -n "$($IP route list table $iface_id default dev $device 2> /dev/null)" ]; then
++ echo " interface $1 error"
++ else
++ if [ "$enabled" -eq 1 ]; then
++ if [ -n "$(uci -p /var/state get mwan3.$1.track_ip 2> /dev/null)" ]; then
++ echo " interface $1 is offline (tracking $tracking)"
++ else
++ echo " interface $1 is offline"
++ fi
++ else
++ echo " interface $1 is disabled"
++ fi
++ fi
++ }
++ config_foreach check_iface_status interface
++ echo -e
++}
++
++policies()
++{
++ local percent policy share total_weight weight iface
++
++ for policy in $($IPT -S | awk '{print $2}' | grep mwan3_policy_ | sort -u); do
++ echo "Policy $policy:" | sed 's/mwan3_policy_//'
++
++ [ -n "$total_weight" ] || total_weight=$($IPT -S $policy | cut -s -d'"' -f2 | head -1 | awk '{print $3}')
++
++ if [ ! -z "${total_weight##*[!0-9]*}" ]; then
++ for iface in $($IPT -S $policy | cut -s -d'"' -f2 | awk '{print $1}'); do
++ weight=$($IPT -S $policy | cut -s -d'"' -f2 | awk '$1 == "'$iface'"' | awk '{print $2}')
++ percent=$(($weight*100/$total_weight))
++ echo " $iface ($percent%)"
++ done
++ else
++ echo " $($IPT -S $policy | sed '/.*--comment \([^ ]*\) .*$/!d;s//\1/;q')"
++ fi
++
++ echo -e
++
++ unset iface
++ unset total_weight
++ done
++}
++rules()
++{
++ local address
++
++ if [ -n "$($IPT -S mwan3_connected 2> /dev/null)" ]; then
++ echo "Known networks:"
++ for address in $($IPS list mwan3_connected | egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}'); do
++ echo " $address"
++ done
++ echo -e
++ fi
++
++ if [ -n "$($IPT -S mwan3_rules 2> /dev/null)" ]; then
++ echo "Active rules:"
++ $IPT -L mwan3_rules -n -v 2> /dev/null | tail -n+3 | sed 's/mark.*//' | sed 's/mwan3_policy_/- /' | sed 's/mwan3_rule_/S /'
++ echo -e
++ fi
++}
++
++status()
++{
++ interfaces
++ policies
++ rules
++}
++
++start()
++{
++ config_load mwan3
++ config_foreach ifup interface
++}
++
++stop()
++{
++ local ipset route rule table
++
++ killall mwan3track &> /dev/null
++ rm /var/run/mwan3track-* &> /dev/null
++
++ for route in $($IP route list table all | sed 's/.*table \([^ ]*\) .*/\1/' | awk '{print $1}' | awk '{for(i=1;i<=NF;i++) if($i+0>0) if($i+0<255) {print;break}}'); do
++ $IP route flush table $route &> /dev/null
++ done
++
++ for rule in $($IP rule list | egrep '^[1-2][0-9]{3}\:' | cut -d ':' -f 1); do
++ $IP rule del pref $rule &> /dev/null
++ done
++
++ $IPT -D PREROUTING -j mwan3_hook &> /dev/null
++ $IPT -D OUTPUT -j mwan3_hook &> /dev/null
++
++ for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
++ $IPT -F $table &> /dev/null
++ done
++
++ for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
++ $IPT -X $table &> /dev/null
++ done
++
++ for ipset in $(ipset -n list | grep mwan3); do
++ $IPS destroy $ipset
++ done
++}
++
++restart() {
++ stop
++ start
++}
++
++case "$1" in
++ ifup|ifdown|interfaces|policies|rules|status|start|stop|restart)
++ $*
++ ;;
++ *)
++ help
++ ;;
++esac
++
++exit 0
+diff --git a/feeds/packages/net/mwan3/files/usr/sbin/mwan3track b/feeds/packages/net/mwan3/files/usr/sbin/mwan3track
+new file mode 100755
+index 0000000..c4d25e9
+--- /dev/null
++++ b/feeds/packages/net/mwan3/files/usr/sbin/mwan3track
+@@ -0,0 +1,65 @@
++#!/bin/sh
++
++[ -z "$9" ] && echo "Error: should not be started manually" && exit 0
++
++if [ -e /var/run/mwan3track-$1.pid ] ; then
++ kill $(cat /var/run/mwan3track-$1.pid) &> /dev/null
++ rm /var/run/mwan3track-$1.pid &> /dev/null
++fi
++
++echo "$$" > /var/run/mwan3track-$1.pid
++
++score=$(($7+$8))
++track_ips=$(echo $* | cut -d ' ' -f 9-99)
++host_up_count=0
++lost=0
++
++while true; do
++
++ for track_ip in $track_ips; do
++ ping -I $2 -c $4 -W $5 -s 4 -q $track_ip &> /dev/null
++ if [ $? -eq 0 ]; then
++ let host_up_count++
++ else
++ let lost++
++ fi
++ done
++
++ if [ $host_up_count -lt $3 ]; then
++ let score--
++
++ if [ $score -lt $8 ]; then score=0 ; fi
++ if [ $score -eq $8 ]; then
++
++ logger -t mwan3track -p notice "Interface $1 ($2) is offline"
++ env -i ACTION=ifdown INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
++ score=0
++
++ fi
++
++ else
++
++ if [ $score -lt $(($7+$8)) ] && [ $lost -gt 0 ]; then
++
++ logger -t mwan3track -p info "Lost $(($lost*$4)) ping(s) on interface $1 ($2)"
++
++ fi
++
++ let score++
++ lost=0
++
++ if [ $score -gt $8 ]; then score=$(($7+$8)); fi
++ if [ $score -eq $8 ]; then
++
++ logger -t mwan3track -p notice "Interface $1 ($2) is online"
++ env -i ACTION=ifup INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
++ rm /var/run/mwan3track-$1.pid
++ exit 0
++ fi
++ fi
++
++ host_up_count=0
++ sleep $6
++done
++
++exit 1
+diff --git a/feeds/packages/net/nbd/Makefile b/feeds/packages/net/nbd/Makefile
+new file mode 100644
+index 0000000..130b31b
+--- /dev/null
++++ b/feeds/packages/net/nbd/Makefile
+@@ -0,0 +1,88 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=nbd
++PKG_VERSION:=3.11
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@SF/nbd
++PKG_MD5SUM:=73d11644a28b9f335292cdb3bdc4b74b
++PKG_LICENSE:=GPL-2.0+
++PKG_MAINTAINER:=Marcin Jurkowski <marcin1j@gmail.com>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++# -liconv due to glib2, to be revisited later
++include $(INCLUDE_DIR)/nls.mk
++
++PKG_BUILD_DEPENDS:=glib2 libintl
++
++define Package/nbd
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Network Block Device utilities
++ URL:=http://nbd.sourceforge.net
++ DEPENDS:=+kmod-nbd
++endef
++
++define Package/nbd/description
++ This package contains the network block device client.
++endef
++
++define Package/nbd-server
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Network Block Device Server
++ URL:=http://nbd.sourceforge.net
++ DEPENDS:=+glib2
++endef
++
++define Package/nbd-server/description
++ This package contains the network block device server.
++endef
++
++CONFIGURE_ARGS += \
++ --disable-glibtest
++
++TARGET_CFLAGS += --std=gnu99 -DNODAEMON
++
++define Package/nbd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/nbd-client $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/nbd-client.conf $(1)/etc/config/nbd-client
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/nbd-client.init $(1)/etc/init.d/nbd-client
++endef
++
++define Package/nbd/conffiles
++/etc/config/nbd-client
++endef
++
++$(eval $(call BuildPackage,nbd))
++
++define Package/nbd-server/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/nbd-server $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/nbd-server.conf $(1)/etc/config/nbd-server
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/nbd-server.init $(1)/etc/init.d/nbd-server
++endef
++
++define Package/nbd-server/conffiles
++/etc/config/nbd-server
++/etc/nbd-server/conf.d
++/etc/nbd-server/allow
++endef
++
++$(eval $(call BuildPackage,nbd-server))
+diff --git a/feeds/packages/net/nbd/files/nbd-client.conf b/feeds/packages/net/nbd/files/nbd-client.conf
+new file mode 100644
+index 0000000..e355c61
+--- /dev/null
++++ b/feeds/packages/net/nbd/files/nbd-client.conf
+@@ -0,0 +1,9 @@
++config nbd-client nbd0
++ option enabled '0'
++ option server '127.0.0.1'
++ option port 10809
++ option sdp 0
++ option swap 0
++ option persist 0
++ option blocksize 1024
++ option exportname foo
+diff --git a/feeds/packages/net/nbd/files/nbd-client.init b/feeds/packages/net/nbd/files/nbd-client.init
+new file mode 100644
+index 0000000..e10c220
+--- /dev/null
++++ b/feeds/packages/net/nbd/files/nbd-client.init
+@@ -0,0 +1,69 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=90
++STOP=10
++USE_PROCD=1
++
++append_arg() {
++ local cfg="$1"
++ local var="$2"
++ local opt="$3"
++ local def="$4"
++ local val
++
++ config_get val "$cfg" "$var"
++ [ -n "$val" -o -n "$def" ] && procd_append_param command $opt "${val:-$def}"
++}
++
++append_bool() {
++ local cfg="$1"
++ local var="$2"
++ local opt="$3"
++ local def="$4"
++ local val
++
++ config_get_bool val "$cfg" "$var" "$def"
++ [ "$val" = 1 ] && procd_append_param command "$opt"
++}
++
++start_instance() {
++ local cfg="$1"
++ local enabled
++
++ config_get_bool enabled "$cfg" 'enabled' '0'
++ [ "$enabled" = 0 ] && return 1
++
++ procd_open_instance
++
++ procd_set_param command /usr/sbin/nbd-client
++
++ append_arg "$cfg" server
++ append_arg "$cfg" port
++ # device path
++ procd_append_param command "/dev/$cfg"
++ procd_append_param command -nofork
++ append_bool "$cfg" sdp "-sdp"
++ append_bool "$cfg" swap "-swap"
++ append_bool "$cfg" persist "-persist"
++ append_arg "$cfg" blocksize "-block-size"
++ append_arg "$cfg" timeout "-timeout"
++ append_arg "$cfg" exportname "-name"
++
++ procd_close_instance
++}
++
++service_triggers() {
++ procd_add_reload_trigger "nbd-client"
++}
++
++start_service() {
++ config_load nbd-client
++ config_foreach start_instance nbd-client
++}
++
++stop_service() {
++ for dev in /dev/nbd*; do
++ nbd-client -d $dev 1>/dev/null 2>&1
++ done
++}
+diff --git a/feeds/packages/net/nbd/files/nbd-server.conf b/feeds/packages/net/nbd/files/nbd-server.conf
+new file mode 100644
+index 0000000..ec9a1c3
+--- /dev/null
++++ b/feeds/packages/net/nbd/files/nbd-server.conf
+@@ -0,0 +1,31 @@
++config nbd-server
++ option enabled 0
++# option port 10809
++# option user root
++# option group root
++# option allowlist 0
++# option includedir '/etc/nbd-server/conf.d'
++# option listenaddr '0.0.0.0'
++# option oldstyle 0
++
++config share usb_sda1
++ option filename '/dev/sda1'
++# option authfile '/etc/nbd-server/allow'
++# option timeout 0
++# option flush 0
++# option fua 0
++# option rotational 0
++# option sync 0
++# option discard 0
++# option maxconnections 10
++# option filesize 1000000
++# option multifile 0
++# option copyonwrite 0
++# option sparse_cow 1
++# option readonly 0
++# option prerun '/bin/true'
++# option postrun '/bin/true'
++# option virtstyle 'ipliteral'
++# option oldstyle_port 12345
++# option oldstyle_listenaddr '0.0.0.0'
++
+diff --git a/feeds/packages/net/nbd/files/nbd-server.init b/feeds/packages/net/nbd/files/nbd-server.init
+new file mode 100644
+index 0000000..ae3db24
+--- /dev/null
++++ b/feeds/packages/net/nbd/files/nbd-server.init
+@@ -0,0 +1,112 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=60
++STOP=40
++USE_PROCD=1
++
++PROG=/usr/bin/nbd-server
++CONFIGFILE="/var/etc/nbd-server.conf"
++
++
++append_plain() {
++ echo "$1" >> $CONFIGFILE
++}
++
++append_val_str() {
++ local resultname="$1"
++ local cfg="$2"
++ local uciname="${3:-$1}"
++ local value=
++
++ config_get value "$cfg" "$uciname"
++
++ if [ -z "$value" ]; then
++ return
++ fi
++ append_plain "$resultname = $value"
++}
++
++append_val_bool() {
++ local resultname="$1"
++ local cfg="$2"
++ local uciname="${3:-$1}"
++ local value=
++
++ config_get_bool value "$cfg" "$uciname"
++ if [ -z "$value" ]; then
++ return
++ fi
++
++ [ $value == 1 ] && value="true" || value="false"
++ append_plain "$resultname = $value"
++}
++
++config_handle_generic() {
++ local cfg="$1"
++
++ append_plain "[generic]"
++ append_val_str user "$cfg"
++ append_val_str group "$cfg"
++ append_val_str port "$cfg"
++ append_val_str listenaddr "$cfg"
++ append_val_bool allowlist "$cfg"
++ append_val_str includedir "$cfg"
++ append_val_bool oldstyle "$cfg"
++
++ config_get_bool SERVICE_ENABLED "$cfg" enabled 0
++}
++
++config_handle_share() {
++ local cfg="$1"
++
++ append_plain
++ append_plain "[$cfg]"
++ append_val_str exportname "$cfg" filename
++ append_val_str timeout "$cfg"
++ append_val_str maxconnections "$cfg"
++ append_val_str authfile "$cfg"
++ append_val_str filesize "$cfg"
++ append_val_str readonly "$cfg"
++ append_val_str multifile "$cfg"
++ append_val_str copyonwrite "$cfg"
++ append_val_bool sparse_cow "$cfg"
++ append_val_bool flush "$cfg"
++ append_val_bool fua "$cfg"
++ append_val_bool rotational "$cfg"
++ append_val_bool sync "$cfg"
++ append_val_bool discard "$cfg"
++ append_val_str prerun "$cfg"
++ append_val_str postrun "$cfg"
++ append_val_str virtstyle "$cfg"
++ append_val_str port "$cfg" oldstyle_port
++ append_val_str listenaddr "$cfg" oldstyle_listenaddr
++}
++
++start_instance() {
++ local cfg="$1"
++ local enabled
++
++ config_get_bool enabled "$cfg" 'enabled' '0'
++ [ "$enabled" = 0 ] && return 1
++
++ procd_open_instance
++ procd_set_param command $PROG --config-file=$CONFIGFILE
++ procd_set_param file $CONFIGFILE
++ procd_close_instance
++}
++
++start_service() {
++ config_load nbd-server
++
++ mkdir -p $(dirname $CONFIGFILE)
++ echo "# auto-generated config file from /etc/config/nbd-server" > $CONFIGFILE
++ config_foreach config_handle_generic nbd-server
++ config_foreach config_handle_share share
++
++ config_foreach start_instance nbd-server
++}
++
++service_triggers() {
++ procd_add_reload_trigger "nbd-server"
++}
+diff --git a/feeds/packages/net/net-snmp/Makefile b/feeds/packages/net/net-snmp/Makefile
+new file mode 100644
+index 0000000..2bf4ca1
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/Makefile
+@@ -0,0 +1,257 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=net-snmp
++PKG_VERSION:=5.4.4
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/net-snmp
++PKG_MD5SUM:=95aa054f3c99a1ce242807d7eaf98619
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++PKG_LICENSE:=MIT BSD-3-Clause-Clear
++
++PKG_FIXUP = patch-libtool
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/net-snmp/Default
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://www.net-snmp.org/
++endef
++
++define Package/net-snmp/Default/description
++ Simple Network Management Protocol (SNMP) is a widely used protocol for
++ monitoring the health and welfare of network equipment (eg. routers),
++ computer equipment and even devices like UPSs. Net-SNMP is a suite of
++ applications used to implement SNMP v1, SNMP v2c and SNMP v3 using both
++ IPv4 and IPv6.
++endef
++
++
++define Package/libnetsnmp
++$(call Package/net-snmp/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Open source SNMP implementation (libraries)
++endef
++
++define Package/libnetsnmp/description
++$(call Package/net-snmp/Default/description)
++ .
++ This package contains shared libraries, needed by other programs.
++endef
++
++
++define Package/snmp-utils
++$(call Package/net-snmp/Default)
++ DEPENDS:=+libnetsnmp
++ TITLE:=Open source SNMP implementation (utilities)
++endef
++
++define Package/snmp-utils/description
++$(call Package/net-snmp/Default/description)
++ .
++ This package contains SNMP client utilities.
++endef
++
++
++define Package/snmpd
++$(call Package/net-snmp/Default)
++ DEPENDS:=+libnetsnmp
++ TITLE:=Open source SNMP implementation (daemon)
++endef
++
++define Package/snmpd/description
++$(call Package/net-snmp/Default/description)
++ .
++ This package contains the SNMP agent, dynamically linked.
++endef
++
++
++define Package/snmpd-static
++$(call Package/net-snmp/Default)
++ TITLE:=Open source SNMP implementation (daemon)
++endef
++
++define Package/snmpd-static/description
++$(call Package/net-snmp/Default/description)
++ .
++ This package contains the SNMP agent, statically linked.
++endef
++
++
++SNMP_MIB_MODULES_INCLUDED = \
++ host/hr_device \
++ host/hr_disk \
++ host/hr_filesys \
++ host/hr_network \
++ host/hr_partition \
++ host/hr_proc \
++ host/hr_storage \
++ host/hr_system \
++ ieee802dot11 \
++ if-mib/ifXTable \
++ mibII/at \
++ mibII/icmp \
++ mibII/ifTable \
++ mibII/ip \
++ mibII/snmp_mib \
++ mibII/sysORTable \
++ mibII/system_mib \
++ mibII/tcp \
++ mibII/udp \
++ mibII/vacm_context \
++ mibII/vacm_vars \
++ snmpv3/snmpEngine \
++ snmpv3/snmpMPDStats \
++ snmpv3/usmConf \
++ snmpv3/usmStats \
++ snmpv3/usmUser \
++ tunnel \
++ ucd-snmp/disk \
++ ucd-snmp/dlmod \
++ ucd-snmp/extensible \
++ ucd-snmp/loadave \
++ ucd-snmp/memory \
++ ucd-snmp/pass \
++ ucd-snmp/pass_persist \
++ ucd-snmp/proc \
++ ucd-snmp/vmstat \
++ util_funcs \
++ utilities/execute \
++
++SNMP_MIB_MODULES_EXCLUDED = \
++ agent_mibs \
++ agentx \
++ disman/event \
++ disman/schedule \
++ hardware \
++ host \
++ if-mib \
++ mibII \
++ notification \
++ notification-log-mib \
++ snmpv3mibs \
++ target \
++ tcp-mib \
++ ucd_snmp \
++ udp-mib \
++ utilities \
++
++SNMP_TRANSPORTS_INCLUDED = Callback UDP
++
++SNMP_TRANSPORTS_EXCLUDED = TCP TCPIPv6 Unix
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-mfd-rewrites \
++ --enable-shared \
++ --enable-static \
++ --with-endianness=$(if $(CONFIG_BIG_ENDIAN),big,little) \
++ --with-logfile=/var/log/snmpd.log \
++ --with-persistent-directory=/usr/lib/snmp/ \
++ --with-default-snmp-version=1 \
++ --with-sys-contact=root@localhost \
++ --with-sys-location=Unknown \
++ --enable-applications \
++ --disable-debugging \
++ --disable-manuals \
++ --disable-mibs \
++ --disable-scripts \
++ --with-out-mib-modules="$(SNMP_MIB_MODULES_EXCLUDED)" \
++ --with-mib-modules="$(SNMP_MIB_MODULES_INCLUDED)" \
++ --with-out-transports="$(SNMP_TRANSPORTS_EXCLUDED)" \
++ --with-transports="$(SNMP_TRANSPORTS_INCLUDED)" \
++ --without-openssl \
++ --without-libwrap \
++ --without-rpm \
++ --without-zlib \
++ $(call autoconf_bool,CONFIG_IPV6,ipv6) \
++
++ifeq ($(CONFIG_IPV6),y)
++SNMP_TRANSPORTS_INCLUDED+= UDPIPv6
++endif
++
++TARGET_LDFLAGS += -L$(TOOLCHAIN_DIR)/usr/lib
++
++ifdef CONFIG_PACKAGE_snmpd-static
++ define Build/Compile/static
++ $(MAKE) -C $(PKG_BUILD_DIR)/agent \
++ LDFLAGS="$(TARGET_LDFLAGS) -lm -static" \
++ EXEEXT="-static" \
++ snmpd-static
++ endef
++endif
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
++ LDFLAGS="$(TARGET_LDFLAGS) -lm -lc" \
++ all install
++ $(Build/Compile/static)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(2)/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/net-snmp-config $(2)/bin/
++ $(SED) 's,=/usr,=$(STAGING_DIR)/usr,g' $(2)/bin/net-snmp-config
++
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/net-snmp $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnetsnmp{,agent,helpers,mibs}.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/libnetsnmp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libnetsnmp{,agent,helpers,mibs}.so.* $(1)/usr/lib/
++endef
++
++define Package/snmpd/conffiles
++/etc/config/snmpd
++endef
++
++define Package/snmpd/install
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/snmpd.conf $(1)/etc/config/snmpd
++ $(INSTALL_DIR) $(1)/etc/snmp
++ ln -sf /var/run/snmpd.conf $(1)/etc/snmp/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/snmpd.init $(1)/etc/init.d/snmpd
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/snmpd $(1)/usr/sbin/snmpd
++endef
++
++define Package/snmpd-static/conffiles
++/etc/config/snmpd
++endef
++
++define Package/snmpd-static/install
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/snmpd.conf $(1)/etc/config/snmpd
++ $(INSTALL_DIR) $(1)/etc/snmp
++ ln -sf /var/run/snmpd.conf $(1)/etc/snmp/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/snmpd.init $(1)/etc/init.d/snmpd
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/agent/snmpd-static $(1)/usr/sbin/snmpd
++endef
++
++define Package/snmp-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/snmp{get,set,status,test,trap,walk} $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,libnetsnmp))
++$(eval $(call BuildPackage,snmp-utils))
++$(eval $(call BuildPackage,snmpd))
++$(eval $(call BuildPackage,snmpd-static))
+diff --git a/feeds/packages/net/net-snmp/files/snmpd.conf b/feeds/packages/net/net-snmp/files/snmpd.conf
+new file mode 100644
+index 0000000..4bdc3d4
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/files/snmpd.conf
+@@ -0,0 +1,82 @@
++config agent
++ option agentaddress UDP:161
++
++config com2sec public
++ option secname ro
++ option source default
++ option community public
++
++config com2sec private
++ option secname rw
++ option source localhost
++ option community private
++
++config group public_v1
++ option group public
++ option version v1
++ option secname ro
++
++config group public_v2c
++ option group public
++ option version v2c
++ option secname ro
++
++config group public_usm
++ option group public
++ option version usm
++ option secname ro
++
++config group private_v1
++ option group private
++ option version v1
++ option secname rw
++
++config group private_v2c
++ option group private
++ option version v2c
++ option secname rw
++
++config group private_usm
++ option group private
++ option version usm
++ option secname rw
++
++config view all
++ option viewname all
++ option type included
++ option oid .1
++
++config access public_access
++ option group public
++ option context none
++ option version any
++ option level noauth
++ option prefix exact
++ option read all
++ option write none
++ option notify none
++
++config access private_access
++ option group private
++ option context none
++ option version any
++ option level noauth
++ option prefix exact
++ option read all
++ option write all
++ option notify all
++
++config system
++ option sysLocation 'office'
++ option sysContact 'bofh@example.com'
++ option sysName 'HeartOfGold'
++# option sysServices 72
++# option sysDescr 'adult playground'
++# option sysObjectID '1.2.3.4'
++
++config exec
++ option name filedescriptors
++ option prog /bin/cat
++ option args /proc/sys/fs/file-nr
++# option miboid 1.2.3.4
++
+diff --git a/feeds/packages/net/net-snmp/files/snmpd.init b/feeds/packages/net/net-snmp/files/snmpd.init
+new file mode 100644
+index 0000000..3dd8c41
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/files/snmpd.init
+@@ -0,0 +1,171 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008 OpenWrt.org
++START=50
++
++USE_PROCD=1
++PROG="/usr/sbin/snmpd"
++
++CONFIGFILE="/var/run/snmpd.conf"
++
++snmpd_agent_add() {
++ local cfg="$1"
++
++ config_get agentaddress "$cfg" agentaddress
++ [ -n "$agentaddress" ] || return 0
++ echo "agentaddress $agentaddress" >> $CONFIGFILE
++}
++
++snmpd_system_add() {
++ local cfg="$1"
++ config_get syslocation "$cfg" sysLocation
++ [ -n "$syslocation" ] && echo "sysLocation $syslocation" >> $CONFIGFILE
++ config_get syscontact "$cfg" sysContact
++ [ -n "$syscontact" ] && echo "sysContact $syscontact" >> $CONFIGFILE
++ config_get sysname "$cfg" sysName
++ [ -n "$sysname" ] && echo "sysName $sysname" >> $CONFIGFILE
++ config_get sysservice "$cfg" sysService
++ [ -n "$sysservice" ] && echo "sysService $sysservice" >> $CONFIGFILE
++ config_get sysdescr "$cfg" sysDescr
++ [ -n "$sysdescr" ] && echo "sysDescr $sysdescr" >> $CONFIGFILE
++ config_get sysobjectid "$cfg" sysObjectID
++ [ -n "$sysobjectid" ] && echo "sysObjectID $sysobjectid" >> $CONFIGFILE
++}
++
++snmpd_com2sec_add() {
++ local cfg="$1"
++ config_get secname "$cfg" secname
++ [ -n "$secname" ] || return 0
++ config_get source "$cfg" source
++ [ -n "$source" ] || return 0
++ config_get community "$cfg" community
++ [ -n "$community" ] || return 0
++ echo "com2sec $secname $source $community" >> $CONFIGFILE
++}
++
++snmpd_com2sec6_add() {
++ local cfg="$1"
++ config_get secname "$cfg" secname
++ [ -n "$secname" ] || return 0
++ config_get source "$cfg" source
++ [ -n "$source" ] || return 0
++ config_get community "$cfg" community
++ [ -n "$community" ] || return 0
++ echo "com2sec6 $secname $source $community" >> $CONFIGFILE
++}
++
++snmpd_group_add() {
++ local cfg="$1"
++ config_get group "$cfg" group
++ [ -n "$group" ] || return 0
++ config_get version "$cfg" version
++ [ -n "$version" ] || return 0
++ config_get secname "$cfg" secname
++ [ -n "$secname" ] || return 0
++ echo "group $group $version $secname" >> $CONFIGFILE
++}
++
++snmpd_view_add() {
++ local cfg="$1"
++ config_get viewname "$cfg" viewname
++ [ -n "$viewname" ] || return 0
++ config_get type "$cfg" type
++ [ -n "$type" ] || return 0
++ config_get oid "$cfg" oid
++ [ -n "$oid" ] || return 0
++ # optional mask
++ config_get mask "$cfg" mask
++ echo "view $viewname $type $oid $mask" >> $CONFIGFILE
++}
++
++snmpd_access_add() {
++ local cfg="$1"
++ config_get group "$cfg" group
++ [ -n "$group" ] || return 0
++ config_get context "$cfg" context
++ [ -n $context ] || return 0
++ [ "$context" == "none" ] && context='""'
++ config_get version "$cfg" version
++ [ -n "$version" ] || return 0
++ config_get level "$cfg" level
++ [ -n "$level" ] || return 0
++ config_get prefix "$cfg" prefix
++ [ -n "$prefix" ] || return 0
++ config_get read "$cfg" read
++ [ -n "$read" ] || return 0
++ config_get write "$cfg" write
++ [ -n "$write" ] || return 0
++ config_get notify "$cfg" notify
++ [ -n "$notify" ] || return 0
++ echo "access $group $context $version $level $prefix $read $write $notify" >> $CONFIGFILE
++}
++
++snmpd_pass_add() {
++ local cfg="$1"
++ local pass='pass'
++
++ config_get miboid "$cfg" miboid
++ [ -n "$miboid" ] || return 0
++ config_get prog "$cfg" prog
++ [ -n "$prog" ] || return 0
++ config_get_bool persist "$cfg" persist 0
++ [ $persist -ne 0 ] && pass='pass_persist'
++ config_get priority "$cfg" priority
++ priority=${priority:+-p $priority}
++ echo "$pass $priority $miboid $prog" >> $CONFIGFILE
++}
++
++snmpd_exec_add() {
++ local cfg="$1"
++
++ config_get name "$cfg" name
++ [ -n "$name" ] || return 0
++ config_get prog "$cfg" prog
++ [ -n "$prog" ] || return 0
++ config_get args "$cfg" args
++ config_get miboid "$cfg" miboid
++ echo "exec $miboid $name $prog $args" >> $CONFIGFILE
++}
++
++snmpd_disk_add() {
++ local cfg="$1"
++ local disk='disk'
++
++ config_get partition "$cfg" partition
++ [ -n "$partition" ] || return 0
++ config_get size "$cfg" size
++ [ -n "$size" ] || return 0
++ echo "$disk $partition $size" >> $CONFIGFILE
++}
++
++start_service() {
++ [ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE"
++
++ procd_open_instance
++
++ config_load snmpd
++
++ config_foreach snmpd_agent_add agent
++ config_foreach snmpd_system_add system
++ config_foreach snmpd_com2sec_add com2sec
++ config_foreach snmpd_com2sec6_add com2sec6
++ config_foreach snmpd_group_add group
++ config_foreach snmpd_view_add view
++ config_foreach snmpd_access_add access
++ config_foreach snmpd_pass_add pass
++ config_foreach snmpd_exec_add exec
++ config_foreach snmpd_disk_add disk
++
++ procd_set_param command $PROG -Lf /dev/null -f
++ procd_set_param file $CONFIGFILE
++ procd_set_param respawn
++
++ for iface in $(ls /sys/class/net 2>/dev/null); do
++ procd_append_param netdev "$iface"
++ done
++
++ procd_close_instance
++}
++
++stop_service() {
++ [ -f "$CONFIGFILE" ] && rm -f "$CONFIGFILE"
++}
+diff --git a/feeds/packages/net/net-snmp/patches/100-debian-statistics.patch b/feeds/packages/net/net-snmp/patches/100-debian-statistics.patch
+new file mode 100644
+index 0000000..c937fca
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/patches/100-debian-statistics.patch
+@@ -0,0 +1,22 @@
++--- a/agent/mibgroup/mibII/interfaces.c
+++++ b/agent/mibgroup/mibII/interfaces.c
++@@ -1561,6 +1561,10 @@ Interface_Scan_Init(void)
++ struct ifnet *nnew;
++ char *stats, *ifstart = line;
++
+++ /* Ignore interfaces with no statistics. */
+++ if (strstr(line, "No statistics available."))
+++ continue;
+++
++ if (line[strlen(line) - 1] == '\n')
++ line[strlen(line) - 1] = '\0';
++
++@@ -1594,7 +1598,7 @@ Interface_Scan_Init(void)
++ &coll) != 5)) {
++ if ((scan_line_to_use == scan_line_2_2)
++ && !strstr(line, "No statistics available"))
++- snmp_log(LOG_ERR,
+++ snmp_log(LOG_DEBUG,
++ "/proc/net/dev data format error, line ==|%s|",
++ line);
++ continue;
+diff --git a/feeds/packages/net/net-snmp/patches/110-debian-makefiles.patch b/feeds/packages/net/net-snmp/patches/110-debian-makefiles.patch
+new file mode 100644
+index 0000000..5ce771c
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/patches/110-debian-makefiles.patch
+@@ -0,0 +1,40 @@
++--- a/local/Makefile.in
+++++ b/local/Makefile.in
++@@ -100,7 +100,7 @@ tkmib.made: $(srcdir)/tkmib
++
++ mib2c.made: $(srcdir)/mib2c
++ if test "x$(PERL)" != "x" ; then \
++- $(PERL) -p -e 's%^#!.*/perl.*%#!$(PERL)%;s#/usr/local/share/snmp#$(snmplibdir)#;' ${srcdir}/mib2c > mib2c.made; \
+++ $(PERL) -p -e 's%^#!.*/perl.*%#!$(PERL)%;s#/usr/local/share/snmp#$(snmplibdir)#;s#/usr/local/etc/snmp#$(SNMPCONFPATH)#;' ${srcdir}/mib2c > mib2c.made; \
++ else \
++ touch mib2c.made; \
++ fi
++--- a/mibs/Makefile.in
+++++ b/mibs/Makefile.in
++@@ -48,11 +48,15 @@ NETSNMPMIBS = NET-SNMP-TC.txt NET-SNMP-M
++ UCDMIBS = UCD-SNMP-MIB.txt UCD-DEMO-MIB.txt UCD-IPFWACC-MIB.txt \
++ UCD-DLMOD-MIB.txt UCD-DISKIO-MIB.txt
++
+++EXTRAMIBS = BGP4-MIB.txt BRIDGE-MIB.txt GNOME-SMI.txt OSPF-MIB.txt \
+++ OSPF-TRAP-MIB.txt RIPv2-MIB.txt SOURCE-ROUTING-MIB.txt \
+++ LM-SENSORS-MIB.txt
+++
++ DEFAULTMIBS = @default_mibs_install@
++
++ MIBS = $(V1MIBS) $(V2MIBS) $(V3MIBS) $(RFCMIBS) \
++ $(AGENTMIBS) $(IANAMIBS) \
++- $(NETSNMPMIBS) $(UCDMIBS) $(DEFAULTMIBS)
+++ $(NETSNMPMIBS) $(UCDMIBS) $(DEFAULTMIBS) $(EXTRAMIBS)
++
++ all: standardall
++
++--- a/Makefile.top
+++++ b/Makefile.top
++@@ -26,6 +26,7 @@ man8dir = $(mandir)/man8
++ snmplibdir = $(datadir)/snmp
++ mibdir = $(snmplibdir)/mibs
++ persistentdir = @PERSISTENT_DIRECTORY@
+++sysconfdir = @sysconfdir@
++ DESTDIR = @INSTALL_PREFIX@
++ INSTALL_PREFIX = $(DESTDIR)
++
+diff --git a/feeds/packages/net/net-snmp/patches/120-debian-searchdirs.patch b/feeds/packages/net/net-snmp/patches/120-debian-searchdirs.patch
+new file mode 100644
+index 0000000..d8c88f3
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/patches/120-debian-searchdirs.patch
+@@ -0,0 +1,14 @@
++--- a/local/mib2c
+++++ b/local/mib2c
++@@ -60,8 +60,9 @@ $currentlevel = -1;
++ if($ENV{MIB2C_DIR}) {
++ push @def_search_dirs, split(/:/, $ENV{MIB2C_DIR});
++ }
++-push @def_search_dirs, "/usr/local/share/snmp/";
++-push @def_search_dirs, "/usr/local/share/snmp/mib2c-data";
+++push @def_search_dirs, "/etc/snmp/";
+++push @def_search_dirs, "/usr/share/snmp/";
+++push @def_search_dirs, "/usr/share/snmp/mib2c-data";
++ push @def_search_dirs, "./mib2c-conf.d";
++
++ sub usage {
+diff --git a/feeds/packages/net/net-snmp/patches/130-debian-extramibs.patch b/feeds/packages/net/net-snmp/patches/130-debian-extramibs.patch
+new file mode 100644
+index 0000000..e741ee7
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/patches/130-debian-extramibs.patch
+@@ -0,0 +1,6261 @@
++--- /dev/null
+++++ b/mibs/BGP4-MIB.txt
++@@ -0,0 +1,929 @@
+++ BGP4-MIB DEFINITIONS ::= BEGIN
+++
+++ IMPORTS
+++ MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE,
+++ IpAddress, Integer32, Counter32, Gauge32, mib-2
+++ FROM SNMPv2-SMI
+++ MODULE-COMPLIANCE, OBJECT-GROUP, NOTIFICATION-GROUP
+++ FROM SNMPv2-CONF;
+++
+++ bgp MODULE-IDENTITY
+++ LAST-UPDATED "9902100000Z"
+++ ORGANIZATION "IETF IDR Working Group"
+++ CONTACT-INFO "E-mail: idr@merit.net
+++
+++ Susan Hares (Editor)
+++ Merit Network
+++ 4251 Plymouth Road
+++ Suite C
+++ Ann Arbor, MI 48105-2785
+++ Tel: +1 734 936 2095
+++ Fax: +1 734 647 3185
+++ E-mail: skh@merit.edu
+++
+++ Jeff Johnson (Editor)
+++ RedBack Networks, Inc.
+++ 1389 Moffett Park Drive
+++ Sunnyvale, CA 94089-1134
+++ Tel: +1 408 548 3516
+++ Fax: +1 408 548 3599
+++ E-mail: jeff@redback.com"
+++ DESCRIPTION
+++ "The MIB module for BGP-4."
+++ REVISION "9902100000Z"
+++ DESCRIPTION
+++ "Corrected duplicate OBJECT IDENTIFIER
+++ assignment in the conformance information."
+++ REVISION "9601080000Z"
+++ DESCRIPTION
+++ "1) Fixed the definitions of the traps to
+++ make them equivalent to their initial
+++ definition in RFC 1269.
+++ 2) Added compliance and conformance info."
+++ ::= { mib-2 15 }
+++
+++ bgpVersion OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE (1..255))
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "Vector of supported BGP protocol version
+++ numbers. Each peer negotiates the version
+++ from this vector. Versions are identified
+++ via the string of bits contained within this
+++ object. The first octet contains bits 0 to
+++ 7, the second octet contains bits 8 to 15,
+++ and so on, with the most significant bit
+++ referring to the lowest bit number in the
+++ octet (e.g., the MSB of the first octet
+++ refers to bit 0). If a bit, i, is present
+++ and set, then the version (i+1) of the BGP
+++ is supported."
+++ ::= { bgp 1 }
+++
+++ bgpLocalAs OBJECT-TYPE
+++ SYNTAX INTEGER (0..65535)
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The local autonomous system number."
+++ ::= { bgp 2 }
+++
+++
+++
+++ -- BGP Peer table. This table contains, one entry per BGP
+++ -- peer, information about the BGP peer.
+++
+++ bgpPeerTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF BgpPeerEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "BGP peer table. This table contains,
+++ one entry per BGP peer, information about the
+++ connections with BGP peers."
+++ ::= { bgp 3 }
+++
+++ bgpPeerEntry OBJECT-TYPE
+++ SYNTAX BgpPeerEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "Entry containing information about the
+++ connection with a BGP peer."
+++ INDEX { bgpPeerRemoteAddr }
+++ ::= { bgpPeerTable 1 }
+++
+++ BgpPeerEntry ::= SEQUENCE {
+++ bgpPeerIdentifier
+++ IpAddress,
+++ bgpPeerState
+++ INTEGER,
+++ bgpPeerAdminStatus
+++ INTEGER,
+++ bgpPeerNegotiatedVersion
+++ Integer32,
+++ bgpPeerLocalAddr
+++ IpAddress,
+++ bgpPeerLocalPort
+++ INTEGER,
+++ bgpPeerRemoteAddr
+++ IpAddress,
+++ bgpPeerRemotePort
+++ INTEGER,
+++ bgpPeerRemoteAs
+++ INTEGER,
+++ bgpPeerInUpdates
+++ Counter32,
+++ bgpPeerOutUpdates
+++ Counter32,
+++ bgpPeerInTotalMessages
+++ Counter32,
+++ bgpPeerOutTotalMessages
+++ Counter32,
+++ bgpPeerLastError
+++ OCTET STRING,
+++ bgpPeerFsmEstablishedTransitions
+++ Counter32,
+++ bgpPeerFsmEstablishedTime
+++ Gauge32,
+++ bgpPeerConnectRetryInterval
+++ INTEGER,
+++ bgpPeerHoldTime
+++ INTEGER,
+++ bgpPeerKeepAlive
+++ INTEGER,
+++ bgpPeerHoldTimeConfigured
+++ INTEGER,
+++ bgpPeerKeepAliveConfigured
+++ INTEGER,
+++ bgpPeerMinASOriginationInterval
+++ INTEGER,
+++ bgpPeerMinRouteAdvertisementInterval
+++ INTEGER,
+++ bgpPeerInUpdateElapsedTime
+++ Gauge32
+++ }
+++
+++ bgpPeerIdentifier OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The BGP Identifier of this entry's BGP peer."
+++ ::= { bgpPeerEntry 1 }
+++
+++ bgpPeerState OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ idle(1),
+++ connect(2),
+++ active(3),
+++ opensent(4),
+++ openconfirm(5),
+++ established(6)
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The BGP peer connection state."
+++ ::= { bgpPeerEntry 2 }
+++
+++ bgpPeerAdminStatus OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ stop(1),
+++ start(2)
+++ }
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "The desired state of the BGP connection. A
+++ transition from 'stop' to 'start' will cause
+++ the BGP Start Event to be generated. A
+++ transition from 'start' to 'stop' will cause
+++ the BGP Stop Event to be generated. This
+++ parameter can be used to restart BGP peer
+++ connections. Care should be used in providing
+++ write access to this object without adequate
+++ authentication."
+++ ::= { bgpPeerEntry 3 }
+++
+++ bgpPeerNegotiatedVersion OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The negotiated version of BGP running between
+++ the two peers."
+++ ::= { bgpPeerEntry 4 }
+++
+++ bgpPeerLocalAddr OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The local IP address of this entry's BGP
+++ connection."
+++ ::= { bgpPeerEntry 5 }
+++
+++ bgpPeerLocalPort OBJECT-TYPE
+++ SYNTAX INTEGER (0..65535)
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The local port for the TCP connection between
+++ the BGP peers."
+++ ::= { bgpPeerEntry 6 }
+++
+++ bgpPeerRemoteAddr OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The remote IP address of this entry's BGP
+++ peer."
+++ ::= { bgpPeerEntry 7 }
+++
+++ bgpPeerRemotePort OBJECT-TYPE
+++ SYNTAX INTEGER (0..65535)
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The remote port for the TCP connection between
+++ the BGP peers. Note that the objects
+++ bgpPeerLocalAddr, bgpPeerLocalPort,
+++ bgpPeerRemoteAddr and bgpPeerRemotePort
+++ provide the appropriate reference to the
+++ standard MIB TCP connection table."
+++ ::= { bgpPeerEntry 8 }
+++
+++ bgpPeerRemoteAs OBJECT-TYPE
+++ SYNTAX INTEGER (0..65535)
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The remote autonomous system number."
+++ ::= { bgpPeerEntry 9 }
+++
+++ bgpPeerInUpdates OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of BGP UPDATE messages received on
+++ this connection. This object should be
+++ initialized to zero (0) when the connection is
+++ established."
+++ ::= { bgpPeerEntry 10 }
+++
+++ bgpPeerOutUpdates OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of BGP UPDATE messages transmitted
+++ on this connection. This object should be
+++ initialized to zero (0) when the connection is
+++ established."
+++ ::= { bgpPeerEntry 11 }
+++
+++ bgpPeerInTotalMessages OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The total number of messages received from the
+++ remote peer on this connection. This object
+++ should be initialized to zero when the
+++ connection is established."
+++ ::= { bgpPeerEntry 12 }
+++
+++ bgpPeerOutTotalMessages OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The total number of messages transmitted to
+++ the remote peer on this connection. This object
+++ should be initialized to zero when the
+++ connection is established."
+++ ::= { bgpPeerEntry 13 }
+++
+++ bgpPeerLastError OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE (2))
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The last error code and subcode seen by this
+++ peer on this connection. If no error has
+++ occurred, this field is zero. Otherwise, the
+++ first byte of this two byte OCTET STRING
+++ contains the error code, and the second byte
+++ contains the subcode."
+++ ::= { bgpPeerEntry 14 }
+++
+++ bgpPeerFsmEstablishedTransitions OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The total number of times the BGP FSM
+++ transitioned into the established state."
+++ ::= { bgpPeerEntry 15 }
+++
+++ bgpPeerFsmEstablishedTime OBJECT-TYPE
+++ SYNTAX Gauge32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "This timer indicates how long (in seconds) this
+++ peer has been in the Established state or how long
+++ since this peer was last in the Established state.
+++ It is set to zero when a new peer is configured or
+++ the router is booted."
+++ ::= { bgpPeerEntry 16 }
+++
+++ bgpPeerConnectRetryInterval OBJECT-TYPE
+++ SYNTAX INTEGER (1..65535)
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "Time interval in seconds for the ConnectRetry
+++ timer. The suggested value for this timer is
+++ 120 seconds."
+++ ::= { bgpPeerEntry 17 }
+++
+++ bgpPeerHoldTime OBJECT-TYPE
+++ SYNTAX INTEGER ( 0 | 3..65535 )
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "Time interval in seconds for the Hold Timer
+++ established with the peer. The value of this
+++ object is calculated by this BGP speaker by
+++ using the smaller of the value in
+++ bgpPeerHoldTimeConfigured and the Hold Time
+++ received in the OPEN message. This value
+++ must be at lease three seconds if it is not
+++ zero (0) in which case the Hold Timer has
+++ not been established with the peer, or, the
+++ value of bgpPeerHoldTimeConfigured is zero (0)."
+++ ::= { bgpPeerEntry 18 }
+++
+++ bgpPeerKeepAlive OBJECT-TYPE
+++ SYNTAX INTEGER ( 0 | 1..21845 )
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "Time interval in seconds for the KeepAlive
+++ timer established with the peer. The value of
+++ this object is calculated by this BGP speaker
+++ such that, when compared with bgpPeerHoldTime,
+++ it has the same proportion as what
+++ bgpPeerKeepAliveConfigured has when compared
+++ with bgpPeerHoldTimeConfigured. If the value
+++ of this object is zero (0), it indicates that
+++ the KeepAlive timer has not been established
+++ with the peer, or, the value of
+++ bgpPeerKeepAliveConfigured is zero (0)."
+++ ::= { bgpPeerEntry 19 }
+++
+++ bgpPeerHoldTimeConfigured OBJECT-TYPE
+++ SYNTAX INTEGER ( 0 | 3..65535 )
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "Time interval in seconds for the Hold Time
+++ configured for this BGP speaker with this peer.
+++ This value is placed in an OPEN message sent to
+++ this peer by this BGP speaker, and is compared
+++ with the Hold Time field in an OPEN message
+++ received from the peer when determining the Hold
+++ Time (bgpPeerHoldTime) with the peer. This value
+++ must not be less than three seconds if it is not
+++ zero (0) in which case the Hold Time is NOT to be
+++ established with the peer. The suggested value for
+++ this timer is 90 seconds."
+++ ::= { bgpPeerEntry 20 }
+++
+++ bgpPeerKeepAliveConfigured OBJECT-TYPE
+++ SYNTAX INTEGER ( 0 | 1..21845 )
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "Time interval in seconds for the KeepAlive timer
+++ configured for this BGP speaker with this peer.
+++ The value of this object will only determine the
+++ KEEPALIVE messages' frequency relative to the value
+++ specified in bgpPeerHoldTimeConfigured; the actual
+++ time interval for the KEEPALIVE messages is
+++ indicated by bgpPeerKeepAlive. A reasonable
+++ maximum value for this timer would be configured to
+++ be one third of that of bgpPeerHoldTimeConfigured.
+++ If the value of this object is zero (0), no
+++ periodical KEEPALIVE messages are sent to the peer
+++ after the BGP connection has been established. The
+++ suggested value for this timer is 30 seconds."
+++ ::= { bgpPeerEntry 21 }
+++
+++ bgpPeerMinASOriginationInterval OBJECT-TYPE
+++ SYNTAX INTEGER (1..65535)
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "Time interval in seconds for the
+++ MinASOriginationInterval timer.
+++ The suggested value for this timer is 15 seconds."
+++ ::= { bgpPeerEntry 22 }
+++
+++ bgpPeerMinRouteAdvertisementInterval OBJECT-TYPE
+++ SYNTAX INTEGER (1..65535)
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "Time interval in seconds for the
+++ MinRouteAdvertisementInterval timer.
+++ The suggested value for this timer is 30 seconds."
+++ ::= { bgpPeerEntry 23 }
+++
+++ bgpPeerInUpdateElapsedTime OBJECT-TYPE
+++ SYNTAX Gauge32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "Elapsed time in seconds since the last BGP
+++ UPDATE message was received from the peer.
+++ Each time bgpPeerInUpdates is incremented,
+++ the value of this object is set to zero (0)."
+++ ::= { bgpPeerEntry 24 }
+++
+++
+++
+++ bgpIdentifier OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The BGP Identifier of local system."
+++ ::= { bgp 4 }
+++
+++
+++
+++ -- Received Path Attribute Table. This table contains,
+++ -- one entry per path to a network, path attributes
+++ -- received from all peers running BGP version 3 or less.
+++ -- This table is obsolete, having been replaced in
+++ -- functionality with the bgp4PathAttrTable.
+++
+++ bgpRcvdPathAttrTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF BgpPathAttrEntry
+++ MAX-ACCESS not-accessible
+++ STATUS obsolete
+++ DESCRIPTION
+++ "The BGP Received Path Attribute Table contains
+++ information about paths to destination networks
+++ received from all peers running BGP version 3 or
+++ less."
+++ ::= { bgp 5 }
+++
+++ bgpPathAttrEntry OBJECT-TYPE
+++ SYNTAX BgpPathAttrEntry
+++ MAX-ACCESS not-accessible
+++ STATUS obsolete
+++ DESCRIPTION
+++ "Information about a path to a network."
+++ INDEX { bgpPathAttrDestNetwork,
+++ bgpPathAttrPeer }
+++ ::= { bgpRcvdPathAttrTable 1 }
+++
+++ BgpPathAttrEntry ::= SEQUENCE {
+++ bgpPathAttrPeer
+++ IpAddress,
+++ bgpPathAttrDestNetwork
+++ IpAddress,
+++ bgpPathAttrOrigin
+++ INTEGER,
+++ bgpPathAttrASPath
+++ OCTET STRING,
+++ bgpPathAttrNextHop
+++ IpAddress,
+++ bgpPathAttrInterASMetric
+++ Integer32
+++ }
+++
+++ bgpPathAttrPeer OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS obsolete
+++ DESCRIPTION
+++ "The IP address of the peer where the path
+++ information was learned."
+++ ::= { bgpPathAttrEntry 1 }
+++
+++ bgpPathAttrDestNetwork OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS obsolete
+++ DESCRIPTION
+++ "The address of the destination network."
+++ ::= { bgpPathAttrEntry 2 }
+++
+++ bgpPathAttrOrigin OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ igp(1),-- networks are interior
+++ egp(2),-- networks learned via EGP
+++ incomplete(3) -- undetermined
+++ }
+++ MAX-ACCESS read-only
+++ STATUS obsolete
+++ DESCRIPTION
+++ "The ultimate origin of the path information."
+++ ::= { bgpPathAttrEntry 3 }
+++
+++ bgpPathAttrASPath OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE (2..255))
+++ MAX-ACCESS read-only
+++ STATUS obsolete
+++ DESCRIPTION
+++ "The set of ASs that must be traversed to reach
+++ the network. This object is probably best
+++ represented as SEQUENCE OF INTEGER. For SMI
+++ compatibility, though, it is represented as
+++ OCTET STRING. Each AS is represented as a pair
+++ of octets according to the following algorithm:
+++
+++ first-byte-of-pair = ASNumber / 256;
+++ second-byte-of-pair = ASNumber & 255;"
+++ ::= { bgpPathAttrEntry 4 }
+++
+++ bgpPathAttrNextHop OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS obsolete
+++ DESCRIPTION
+++ "The address of the border router that should
+++ be used for the destination network."
+++ ::= { bgpPathAttrEntry 5 }
+++
+++ bgpPathAttrInterASMetric OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS obsolete
+++ DESCRIPTION
+++ "The optional inter-AS metric. If this
+++ attribute has not been provided for this route,
+++ the value for this object is 0."
+++ ::= { bgpPathAttrEntry 6 }
+++
+++
+++
+++ -- BGP-4 Received Path Attribute Table. This table contains,
+++ -- one entry per path to a network, path attributes
+++ -- received from all peers running BGP-4.
+++
+++ bgp4PathAttrTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF Bgp4PathAttrEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "The BGP-4 Received Path Attribute Table contains
+++ information about paths to destination networks
+++ received from all BGP4 peers."
+++ ::= { bgp 6 }
+++
+++ bgp4PathAttrEntry OBJECT-TYPE
+++ SYNTAX Bgp4PathAttrEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "Information about a path to a network."
+++ INDEX { bgp4PathAttrIpAddrPrefix,
+++ bgp4PathAttrIpAddrPrefixLen,
+++ bgp4PathAttrPeer }
+++ ::= { bgp4PathAttrTable 1 }
+++
+++ Bgp4PathAttrEntry ::= SEQUENCE {
+++ bgp4PathAttrPeer
+++ IpAddress,
+++ bgp4PathAttrIpAddrPrefixLen
+++ INTEGER,
+++ bgp4PathAttrIpAddrPrefix
+++ IpAddress,
+++ bgp4PathAttrOrigin
+++ INTEGER,
+++ bgp4PathAttrASPathSegment
+++ OCTET STRING,
+++ bgp4PathAttrNextHop
+++ IpAddress,
+++ bgp4PathAttrMultiExitDisc
+++ INTEGER,
+++ bgp4PathAttrLocalPref
+++ INTEGER,
+++ bgp4PathAttrAtomicAggregate
+++ INTEGER,
+++ bgp4PathAttrAggregatorAS
+++ INTEGER,
+++ bgp4PathAttrAggregatorAddr
+++ IpAddress,
+++ bgp4PathAttrCalcLocalPref
+++ INTEGER,
+++ bgp4PathAttrBest
+++ INTEGER,
+++ bgp4PathAttrUnknown
+++ OCTET STRING
+++ }
+++
+++ bgp4PathAttrPeer OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP address of the peer where the path
+++ information was learned."
+++ ::= { bgp4PathAttrEntry 1 }
+++ bgp4PathAttrIpAddrPrefixLen OBJECT-TYPE
+++ SYNTAX INTEGER (0..32)
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "Length in bits of the IP address prefix in the
+++ Network Layer Reachability Information field."
+++ ::= { bgp4PathAttrEntry 2 }
+++
+++ bgp4PathAttrIpAddrPrefix OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "An IP address prefix in the Network Layer
+++ Reachability Information field. This object
+++ is an IP address containing the prefix with
+++ length specified by bgp4PathAttrIpAddrPrefixLen.
+++ Any bits beyond the length specified by
+++ bgp4PathAttrIpAddrPrefixLen are zeroed."
+++ ::= { bgp4PathAttrEntry 3 }
+++
+++ bgp4PathAttrOrigin OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ igp(1),-- networks are interior
+++ egp(2),-- networks learned via EGP
+++ incomplete(3) -- undetermined
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The ultimate origin of the path information."
+++ ::= { bgp4PathAttrEntry 4 }
+++
+++ bgp4PathAttrASPathSegment OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE (2..255))
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The sequence of AS path segments. Each AS
+++ path segment is represented by a triple
+++ <type, length, value>.
+++
+++ The type is a 1-octet field which has two
+++ possible values:
+++ 1 AS_SET: unordered set of ASs a
+++ route in the UPDATE message
+++ has traversed
+++ 2 AS_SEQUENCE: ordered set of ASs
+++ a route in the UPDATE message
+++ has traversed.
+++
+++ The length is a 1-octet field containing the
+++ number of ASs in the value field.
+++
+++ The value field contains one or more AS
+++ numbers, each AS is represented in the octet
+++ string as a pair of octets according to the
+++ following algorithm:
+++
+++ first-byte-of-pair = ASNumber / 256;
+++ second-byte-of-pair = ASNumber & 255;"
+++ ::= { bgp4PathAttrEntry 5 }
+++
+++ bgp4PathAttrNextHop OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The address of the border router that should
+++ be used for the destination network."
+++ ::= { bgp4PathAttrEntry 6 }
+++
+++ bgp4PathAttrMultiExitDisc OBJECT-TYPE
+++ SYNTAX INTEGER (-1..2147483647)
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "This metric is used to discriminate between
+++ multiple exit points to an adjacent autonomous
+++ system. A value of -1 indicates the absence of
+++ this attribute."
+++ ::= { bgp4PathAttrEntry 7 }
+++
+++ bgp4PathAttrLocalPref OBJECT-TYPE
+++ SYNTAX INTEGER (-1..2147483647)
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The originating BGP4 speaker's degree of
+++ preference for an advertised route. A value of
+++ -1 indicates the absence of this attribute."
+++ ::= { bgp4PathAttrEntry 8 }
+++
+++ bgp4PathAttrAtomicAggregate OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ lessSpecificRrouteNotSelected(1),
+++ lessSpecificRouteSelected(2)
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "Whether or not a system has selected
+++ a less specific route without selecting a
+++ more specific route."
+++ ::= { bgp4PathAttrEntry 9 }
+++
+++ bgp4PathAttrAggregatorAS OBJECT-TYPE
+++ SYNTAX INTEGER (0..65535)
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The AS number of the last BGP4 speaker that
+++ performed route aggregation. A value of zero (0)
+++ indicates the absence of this attribute."
+++ ::= { bgp4PathAttrEntry 10 }
+++
+++ bgp4PathAttrAggregatorAddr OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP address of the last BGP4 speaker that
+++ performed route aggregation. A value of
+++ 0.0.0.0 indicates the absence of this attribute."
+++ ::= { bgp4PathAttrEntry 11 }
+++
+++ bgp4PathAttrCalcLocalPref OBJECT-TYPE
+++ SYNTAX INTEGER (-1..2147483647)
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The degree of preference calculated by the
+++ receiving BGP4 speaker for an advertised route.
+++ A value of -1 indicates the absence of this
+++ attribute."
+++ ::= { bgp4PathAttrEntry 12 }
+++
+++ bgp4PathAttrBest OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ false(1),-- not chosen as best route
+++ true(2) -- chosen as best route
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "An indication of whether or not this route
+++ was chosen as the best BGP4 route."
+++ ::= { bgp4PathAttrEntry 13 }
+++
+++ bgp4PathAttrUnknown OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE(0..255))
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "One or more path attributes not understood
+++ by this BGP4 speaker. Size zero (0) indicates
+++ the absence of such attribute(s). Octets
+++ beyond the maximum size, if any, are not
+++ recorded by this object."
+++ ::= { bgp4PathAttrEntry 14 }
+++
+++
+++ -- Traps.
+++
+++ -- note that in RFC 1657, bgpTraps was incorrectly
+++ -- assigned a value of { bgp 7 }, and each of the
+++ -- traps had the bgpPeerRemoteAddr object inappropriately
+++ -- removed from their OBJECTS clause. The following
+++ -- definitions restore the semantics of the traps as
+++ -- they were initially defined in RFC 1269.
+++
+++ -- { bgp 7 } is unused
+++
+++ bgpTraps OBJECT IDENTIFIER ::= { bgp 0 }
+++
+++ bgpEstablished NOTIFICATION-TYPE
+++ OBJECTS { bgpPeerRemoteAddr,
+++ bgpPeerLastError,
+++ bgpPeerState }
+++ STATUS current
+++ DESCRIPTION
+++ "The BGP Established event is generated when
+++ the BGP FSM enters the ESTABLISHED state."
+++ ::= { bgpTraps 1 }
+++
+++ bgpBackwardTransition NOTIFICATION-TYPE
+++ OBJECTS { bgpPeerRemoteAddr,
+++ bgpPeerLastError,
+++ bgpPeerState }
+++ STATUS current
+++ DESCRIPTION
+++ "The BGPBackwardTransition Event is generated
+++ when the BGP FSM moves from a higher numbered
+++ state to a lower numbered state."
+++ ::= { bgpTraps 2 }
+++
+++ -- conformance information
+++
+++ bgpMIBConformance OBJECT IDENTIFIER ::= { bgp 8 }
+++ bgpMIBCompliances OBJECT IDENTIFIER ::= { bgpMIBConformance 1 }
+++ bgpMIBGroups OBJECT IDENTIFIER ::= { bgpMIBConformance 2 }
+++
+++ -- compliance statements
+++
+++ bgpMIBCompliance MODULE-COMPLIANCE
+++ STATUS current
+++ DESCRIPTION
+++ "The compliance statement for entities which
+++ implement the BGP4 mib."
+++ MODULE -- this module
+++ MANDATORY-GROUPS { bgp4MIBGlobalsGroup,
+++ bgp4MIBPeerGroup,
+++ bgp4MIBPathAttrGroup,
+++ bgp4MIBNotificationGroup }
+++ ::= { bgpMIBCompliances 1 }
+++
+++ -- units of conformance
+++
+++ bgp4MIBGlobalsGroup OBJECT-GROUP
+++ OBJECTS { bgpVersion,
+++ bgpLocalAs,
+++ bgpIdentifier }
+++ STATUS current
+++ DESCRIPTION
+++ "A collection of objects providing information
+++ on global BGP state."
+++ ::= { bgpMIBGroups 1 }
+++
+++ bgp4MIBPeerGroup OBJECT-GROUP
+++ OBJECTS { bgpPeerIdentifier,
+++ bgpPeerState,
+++ bgpPeerAdminStatus,
+++ bgpPeerNegotiatedVersion,
+++ bgpPeerLocalAddr,
+++ bgpPeerLocalPort,
+++ bgpPeerRemoteAddr,
+++ bgpPeerRemotePort,
+++ bgpPeerRemoteAs,
+++ bgpPeerInUpdates,
+++ bgpPeerOutUpdates,
+++ bgpPeerInTotalMessages,
+++ bgpPeerOutTotalMessages,
+++ bgpPeerLastError,
+++ bgpPeerFsmEstablishedTransitions,
+++ bgpPeerFsmEstablishedTime,
+++ bgpPeerConnectRetryInterval,
+++ bgpPeerHoldTime,
+++ bgpPeerKeepAlive,
+++ bgpPeerHoldTimeConfigured,
+++ bgpPeerKeepAliveConfigured,
+++ bgpPeerMinASOriginationInterval,
+++ bgpPeerMinRouteAdvertisementInterval,
+++ bgpPeerInUpdateElapsedTime }
+++ STATUS current
+++ DESCRIPTION
+++ "A collection of objects for managing
+++ BGP peers."
+++ ::= { bgpMIBGroups 2 }
+++
+++ bgp4MIBRcvdPathAttrGroup OBJECT-GROUP
+++ OBJECTS { bgpPathAttrPeer,
+++ bgpPathAttrDestNetwork,
+++ bgpPathAttrOrigin,
+++ bgpPathAttrASPath,
+++ bgpPathAttrNextHop,
+++ bgpPathAttrInterASMetric }
+++ STATUS obsolete
+++ DESCRIPTION
+++ "A collection of objects for managing BGP
+++ path entries.
+++
+++ This conformance group is obsolete,
+++ replaced by bgp4MIBPathAttrGroup."
+++ ::= { bgpMIBGroups 3 }
+++
+++ bgp4MIBPathAttrGroup OBJECT-GROUP
+++ OBJECTS { bgp4PathAttrPeer,
+++ bgp4PathAttrIpAddrPrefixLen,
+++ bgp4PathAttrIpAddrPrefix,
+++ bgp4PathAttrOrigin,
+++ bgp4PathAttrASPathSegment,
+++ bgp4PathAttrNextHop,
+++ bgp4PathAttrMultiExitDisc,
+++ bgp4PathAttrLocalPref,
+++ bgp4PathAttrAtomicAggregate,
+++ bgp4PathAttrAggregatorAS,
+++ bgp4PathAttrAggregatorAddr,
+++ bgp4PathAttrCalcLocalPref,
+++ bgp4PathAttrBest,
+++ bgp4PathAttrUnknown }
+++ STATUS current
+++ DESCRIPTION
+++ "A collection of objects for managing
+++ BGP path entries."
+++ ::= { bgpMIBGroups 4 }
+++
+++ bgp4MIBNotificationGroup NOTIFICATION-GROUP
+++ NOTIFICATIONS { bgpEstablished,
+++ bgpBackwardTransition }
+++ STATUS current
+++ DESCRIPTION
+++ "A collection of notifications for signaling
+++ changes in BGP peer relationships."
+++ ::= { bgpMIBGroups 5 }
+++
+++ END
++--- /dev/null
+++++ b/mibs/BRIDGE-MIB.txt
++@@ -0,0 +1,1075 @@
+++BRIDGE-MIB DEFINITIONS ::= BEGIN
+++
+++IMPORTS
+++ Counter, TimeTicks
+++ FROM RFC1155-SMI
+++ mib-2
+++ FROM RFC1213-MIB
+++ OBJECT-TYPE
+++ FROM RFC-1212
+++ TRAP-TYPE
+++ FROM RFC-1215;
+++
+++-- All representations of MAC addresses in this MIB Module
+++-- use, as a textual convention (i.e. this convention does
+++-- not affect their encoding), the data type:
+++MacAddress ::= OCTET STRING (SIZE (6)) -- a 6 octet address
+++ -- in the
+++ -- "canonical"
+++ -- order
+++-- defined by IEEE 802.1a, i.e., as if it were transmitted
+++-- least significant bit first, even though 802.5 (in
+++-- contrast to other n802.x protocols) requires MAC
+++-- addresses to be transmitted most significant bit first.
+++--
+++-- 16-bit addresses, if needed, are represented by setting
+++-- their upper 4 octets to all 0's, i.e., AAFF would be
+++-- represented as 00000000AAFF.
+++
+++-- Similarly, all representations of Bridge-Id in this MIB
+++-- Module use, as a textual convention (i.e. this
+++-- convention does not affect their encoding), the data
+++-- type:
+++BridgeId ::= OCTET STRING (SIZE (8)) -- the
+++ -- Bridge-Identifier
+++ -- as used in the
+++ -- Spanning Tree
+++-- Protocol to uniquely identify a bridge. Its first two
+++-- octets (in network byte order) contain a priority
+++-- value and its last 6 octets contain the MAC address
+++-- used to refer to a bridge in a unique fashion
+++-- (typically, the numerically smallest MAC address
+++-- of all ports on the bridge).
+++
+++-- Several objects in this MIB module represent values of
+++-- timers used by the Spanning Tree Protocol. In this
+++-- MIB, these timers have values in units of hundreths of
+++-- a second (i.e. 1/100 secs).
+++-- These timers, when stored in a Spanning Tree Protocol's
+++-- BPDU, are in units of 1/256 seconds. Note, however,
+++-- that 802.1D-1990 specifies a settable granularity of
+++-- no more than 1 second for these timers. To avoid
+++-- ambiguity, a data type is defined here as a textual
+++-- convention and all representation of these timers
+++-- in this MIB module are defined using this data type. An
+++-- algorithm is also defined for converting between the
+++-- different units, to ensure a timer's value is not
+++-- distorted by multiple conversions.
+++-- The data type is:
+++
+++Timeout ::= INTEGER -- a STP timer in units of 1/100 seconds
+++
+++-- To convert a Timeout value into a value in units of
+++-- 1/256 seconds, the following algorithm should be used:
+++--
+++-- b = floor( (n * 256) / 100)
+++--
+++-- where:
+++-- floor = quotient [ignore remainder]
+++-- n is the value in 1/100 second units
+++-- b is the value in 1/256 second units
+++--
+++-- To convert the value from 1/256 second units back to
+++-- 1/100 seconds, the following algorithm should be used:
+++--
+++-- n = ceiling( (b * 100) / 256)
+++--
+++-- where:
+++-- ceiling = quotient [if remainder is 0], or
+++-- quotient + 1 [if remainder is non-zero]
+++-- n is the value in 1/100 second units
+++-- b is the value in 1/256 second units
+++--
+++-- Note: it is important that the arithmetic operations are
+++-- done in the order specified (i.e., multiply first, divide
+++-- second).
+++
+++ dot1dBridge OBJECT IDENTIFIER ::= { mib-2 17 }
+++
+++-- groups in the Bridge MIB
+++
+++dot1dBase OBJECT IDENTIFIER ::= { dot1dBridge 1 }
+++
+++dot1dStp OBJECT IDENTIFIER ::= { dot1dBridge 2 }
+++
+++dot1dSr OBJECT IDENTIFIER ::= { dot1dBridge 3 }
+++-- separately documented
+++
+++dot1dTp OBJECT IDENTIFIER ::= { dot1dBridge 4 }
+++
+++dot1dStatic OBJECT IDENTIFIER ::= { dot1dBridge 5 }
+++
+++-- the dot1dBase group
+++
+++-- Implementation of the dot1dBase group is mandatory for all
+++-- bridges.
+++
+++dot1dBaseBridgeAddress OBJECT-TYPE
+++ SYNTAX MacAddress
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The MAC address used by this bridge when it must
+++ be referred to in a unique fashion. It is
+++ recommended that this be the numerically smallest
+++ MAC address of all ports that belong to this
+++ bridge. However it is only required to be unique.
+++ When concatenated with dot1dStpPriority a unique
+++ BridgeIdentifier is formed which is used in the
+++ Spanning Tree Protocol."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Sections 6.4.1.1.3 and 3.12.5"
+++ ::= { dot1dBase 1 }
+++
+++dot1dBaseNumPorts OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of ports controlled by this bridging
+++ entity."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.4.1.1.3"
+++ ::= { dot1dBase 2 }
+++
+++dot1dBaseType OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ unknown(1),
+++ transparent-only(2),
+++ sourceroute-only(3),
+++ srt(4)
+++ }
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "Indicates what type of bridging this bridge can
+++ perform. If a bridge is actually performing a
+++ certain type of bridging this will be indicated by
+++ entries in the port table for the given type."
+++ ::= { dot1dBase 3 }
+++
+++-- The Generic Bridge Port Table
+++
+++dot1dBasePortTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF Dot1dBasePortEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A table that contains generic information about
+++ every port that is associated with this bridge.
+++ Transparent, source-route, and srt ports are
+++ included."
+++ ::= { dot1dBase 4 }
+++
+++dot1dBasePortEntry OBJECT-TYPE
+++ SYNTAX Dot1dBasePortEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A list of information for each port of the
+++ bridge."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.4.2, 6.6.1"
+++ INDEX { dot1dBasePort }
+++ ::= { dot1dBasePortTable 1 }
+++
+++Dot1dBasePortEntry ::=
+++ SEQUENCE {
+++ dot1dBasePort
+++ INTEGER,
+++ dot1dBasePortIfIndex
+++ INTEGER,
+++ dot1dBasePortCircuit
+++
+++ OBJECT IDENTIFIER,
+++ dot1dBasePortDelayExceededDiscards
+++ Counter,
+++ dot1dBasePortMtuExceededDiscards
+++ Counter
+++ }
+++
+++dot1dBasePort OBJECT-TYPE
+++ SYNTAX INTEGER (1..65535)
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The port number of the port for which this entry
+++ contains bridge management information."
+++ ::= { dot1dBasePortEntry 1 }
+++
+++dot1dBasePortIfIndex OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The value of the instance of the ifIndex object,
+++ defined in MIB-II, for the interface corresponding
+++ to this port."
+++ ::= { dot1dBasePortEntry 2 }
+++
+++dot1dBasePortCircuit OBJECT-TYPE
+++ SYNTAX OBJECT IDENTIFIER
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "For a port which (potentially) has the same value
+++ of dot1dBasePortIfIndex as another port on the
+++ same bridge, this object contains the name of an
+++ object instance unique to this port. For example,
+++ in the case where multiple ports correspond one-
+++ to-one with multiple X.25 virtual circuits, this
+++ value might identify an (e.g., the first) object
+++ instance associated with the X.25 virtual circuit
+++ corresponding to this port.
+++
+++ For a port which has a unique value of
+++ dot1dBasePortIfIndex, this object can have the
+++ value { 0 0 }."
+++ ::= { dot1dBasePortEntry 3 }
+++
+++dot1dBasePortDelayExceededDiscards OBJECT-TYPE
+++ SYNTAX Counter
+++
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of frames discarded by this port due
+++ to excessive transit delay through the bridge. It
+++ is incremented by both transparent and source
+++ route bridges."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.6.1.1.3"
+++ ::= { dot1dBasePortEntry 4 }
+++
+++dot1dBasePortMtuExceededDiscards OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of frames discarded by this port due
+++ to an excessive size. It is incremented by both
+++ transparent and source route bridges."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.6.1.1.3"
+++ ::= { dot1dBasePortEntry 5 }
+++
+++-- the dot1dStp group
+++
+++-- Implementation of the dot1dStp group is optional. It is
+++-- implemented by those bridges that support the Spanning Tree
+++-- Protocol.
+++
+++dot1dStpProtocolSpecification OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ unknown(1),
+++ decLb100(2),
+++ ieee8021d(3)
+++ }
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "An indication of what version of the Spanning
+++ Tree Protocol is being run. The value
+++ 'decLb100(2)' indicates the DEC LANbridge 100
+++ Spanning Tree protocol. IEEE 802.1d
+++ implementations will return 'ieee8021d(3)'. If
+++ future versions of the IEEE Spanning Tree Protocol
+++ are released that are incompatible with the
+++ current version a new value will be defined."
+++
+++ ::= { dot1dStp 1 }
+++
+++dot1dStpPriority OBJECT-TYPE
+++ SYNTAX INTEGER (0..65535)
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The value of the write-able portion of the Bridge
+++ ID, i.e., the first two octets of the (8 octet
+++ long) Bridge ID. The other (last) 6 octets of the
+++ Bridge ID are given by the value of
+++ dot1dBaseBridgeAddress."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.3.7"
+++ ::= { dot1dStp 2 }
+++
+++dot1dStpTimeSinceTopologyChange OBJECT-TYPE
+++ SYNTAX TimeTicks
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The time (in hundredths of a second) since the
+++ last time a topology change was detected by the
+++ bridge entity."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.8.1.1.3"
+++ ::= { dot1dStp 3 }
+++
+++dot1dStpTopChanges OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The total number of topology changes detected by
+++ this bridge since the management entity was last
+++ reset or initialized."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.8.1.1.3"
+++ ::= { dot1dStp 4 }
+++
+++dot1dStpDesignatedRoot OBJECT-TYPE
+++ SYNTAX BridgeId
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The bridge identifier of the root of the spanning
+++ tree as determined by the Spanning Tree Protocol
+++ as executed by this node. This value is used as
+++
+++ the Root Identifier parameter in all Configuration
+++ Bridge PDUs originated by this node."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.3.1"
+++ ::= { dot1dStp 5 }
+++
+++dot1dStpRootCost OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The cost of the path to the root as seen from
+++ this bridge."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.3.2"
+++ ::= { dot1dStp 6 }
+++
+++dot1dStpRootPort OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The port number of the port which offers the
+++ lowest cost path from this bridge to the root
+++ bridge."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.3.3"
+++ ::= { dot1dStp 7 }
+++
+++dot1dStpMaxAge OBJECT-TYPE
+++ SYNTAX Timeout
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The maximum age of Spanning Tree Protocol
+++ information learned from the network on any port
+++ before it is discarded, in units of hundredths of
+++ a second. This is the actual value that this
+++ bridge is currently using."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.3.4"
+++ ::= { dot1dStp 8 }
+++
+++dot1dStpHelloTime OBJECT-TYPE
+++ SYNTAX Timeout
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++
+++ "The amount of time between the transmission of
+++ Configuration bridge PDUs by this node on any port
+++ when it is the root of the spanning tree or trying
+++ to become so, in units of hundredths of a second.
+++ This is the actual value that this bridge is
+++ currently using."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.3.5"
+++ ::= { dot1dStp 9 }
+++
+++dot1dStpHoldTime OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "This time value determines the interval length
+++ during which no more than two Configuration bridge
+++ PDUs shall be transmitted by this node, in units
+++ of hundredths of a second."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.3.14"
+++ ::= { dot1dStp 10 }
+++
+++dot1dStpForwardDelay OBJECT-TYPE
+++ SYNTAX Timeout
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "This time value, measured in units of hundredths
+++ of a second, controls how fast a port changes its
+++ spanning state when moving towards the Forwarding
+++ state. The value determines how long the port
+++ stays in each of the Listening and Learning
+++ states, which precede the Forwarding state. This
+++ value is also used, when a topology change has
+++ been detected and is underway, to age all dynamic
+++ entries in the Forwarding Database. [Note that
+++ this value is the one that this bridge is
+++ currently using, in contrast to
+++ dot1dStpBridgeForwardDelay which is the value that
+++ this bridge and all others would start using
+++ if/when this bridge were to become the root.]"
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.3.6"
+++ ::= { dot1dStp 11 }
+++
+++dot1dStpBridgeMaxAge OBJECT-TYPE
+++ SYNTAX Timeout (600..4000)
+++
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The value that all bridges use for MaxAge when
+++ this bridge is acting as the root. Note that
+++ 802.1D-1990 specifies that the range for this
+++ parameter is related to the value of
+++ dot1dStpBridgeHelloTime. The granularity of this
+++ timer is specified by 802.1D-1990 to be 1 second.
+++ An agent may return a badValue error if a set is
+++ attempted to a value which is not a whole number
+++ of seconds."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.3.8"
+++ ::= { dot1dStp 12 }
+++
+++dot1dStpBridgeHelloTime OBJECT-TYPE
+++ SYNTAX Timeout (100..1000)
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The value that all bridges use for HelloTime when
+++ this bridge is acting as the root. The
+++ granularity of this timer is specified by 802.1D-
+++ 1990 to be 1 second. An agent may return a
+++ badValue error if a set is attempted to a value
+++ which is not a whole number of seconds."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.3.9"
+++ ::= { dot1dStp 13 }
+++
+++dot1dStpBridgeForwardDelay OBJECT-TYPE
+++ SYNTAX Timeout (400..3000)
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The value that all bridges use for ForwardDelay
+++ when this bridge is acting as the root. Note that
+++ 802.1D-1990 specifies that the range for this
+++ parameter is related to the value of
+++ dot1dStpBridgeMaxAge. The granularity of this
+++ timer is specified by 802.1D-1990 to be 1 second.
+++ An agent may return a badValue error if a set is
+++ attempted to a value which is not a whole number
+++ of seconds."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.3.10"
+++ ::= { dot1dStp 14 }
+++
+++-- The Spanning Tree Port Table
+++
+++dot1dStpPortTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF Dot1dStpPortEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A table that contains port-specific information
+++ for the Spanning Tree Protocol."
+++ ::= { dot1dStp 15 }
+++
+++dot1dStpPortEntry OBJECT-TYPE
+++ SYNTAX Dot1dStpPortEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A list of information maintained by every port
+++ about the Spanning Tree Protocol state for that
+++ port."
+++ INDEX { dot1dStpPort }
+++ ::= { dot1dStpPortTable 1 }
+++
+++Dot1dStpPortEntry ::=
+++ SEQUENCE {
+++ dot1dStpPort
+++ INTEGER,
+++ dot1dStpPortPriority
+++ INTEGER,
+++ dot1dStpPortState
+++ INTEGER,
+++ dot1dStpPortEnable
+++ INTEGER,
+++ dot1dStpPortPathCost
+++ INTEGER,
+++ dot1dStpPortDesignatedRoot
+++ BridgeId,
+++ dot1dStpPortDesignatedCost
+++ INTEGER,
+++ dot1dStpPortDesignatedBridge
+++ BridgeId,
+++ dot1dStpPortDesignatedPort
+++ OCTET STRING,
+++ dot1dStpPortForwardTransitions
+++ Counter
+++ }
+++
+++dot1dStpPort OBJECT-TYPE
+++ SYNTAX INTEGER (1..65535)
+++
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The port number of the port for which this entry
+++ contains Spanning Tree Protocol management
+++ information."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.8.2.1.2"
+++ ::= { dot1dStpPortEntry 1 }
+++
+++dot1dStpPortPriority OBJECT-TYPE
+++ SYNTAX INTEGER (0..255)
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The value of the priority field which is
+++ contained in the first (in network byte order)
+++ octet of the (2 octet long) Port ID. The other
+++ octet of the Port ID is given by the value of
+++ dot1dStpPort."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.5.1"
+++ ::= { dot1dStpPortEntry 2 }
+++
+++dot1dStpPortState OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ disabled(1),
+++ blocking(2),
+++ listening(3),
+++ learning(4),
+++ forwarding(5),
+++ broken(6)
+++ }
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The port's current state as defined by
+++ application of the Spanning Tree Protocol. This
+++ state controls what action a port takes on
+++ reception of a frame. If the bridge has detected
+++ a port that is malfunctioning it will place that
+++ port into the broken(6) state. For ports which
+++ are disabled (see dot1dStpPortEnable), this object
+++ will have a value of disabled(1)."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.5.2"
+++ ::= { dot1dStpPortEntry 3 }
+++
+++dot1dStpPortEnable OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ enabled(1),
+++ disabled(2)
+++ }
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The enabled/disabled status of the port."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.5.2"
+++ ::= { dot1dStpPortEntry 4 }
+++
+++dot1dStpPortPathCost OBJECT-TYPE
+++ SYNTAX INTEGER (1..65535)
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The contribution of this port to the path cost of
+++ paths towards the spanning tree root which include
+++ this port. 802.1D-1990 recommends that the
+++ default value of this parameter be in inverse
+++ proportion to the speed of the attached LAN."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.5.3"
+++ ::= { dot1dStpPortEntry 5 }
+++
+++dot1dStpPortDesignatedRoot OBJECT-TYPE
+++ SYNTAX BridgeId
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The unique Bridge Identifier of the Bridge
+++ recorded as the Root in the Configuration BPDUs
+++ transmitted by the Designated Bridge for the
+++ segment to which the port is attached."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.5.4"
+++ ::= { dot1dStpPortEntry 6 }
+++
+++dot1dStpPortDesignatedCost OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The path cost of the Designated Port of the
+++ segment connected to this port. This value is
+++ compared to the Root Path Cost field in received
+++
+++ bridge PDUs."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.5.5"
+++ ::= { dot1dStpPortEntry 7 }
+++
+++dot1dStpPortDesignatedBridge OBJECT-TYPE
+++ SYNTAX BridgeId
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The Bridge Identifier of the bridge which this
+++ port considers to be the Designated Bridge for
+++ this port's segment."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.5.6"
+++ ::= { dot1dStpPortEntry 8 }
+++
+++dot1dStpPortDesignatedPort OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE (2))
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The Port Identifier of the port on the Designated
+++ Bridge for this port's segment."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 4.5.5.7"
+++ ::= { dot1dStpPortEntry 9 }
+++
+++dot1dStpPortForwardTransitions OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of times this port has transitioned
+++ from the Learning state to the Forwarding state."
+++ ::= { dot1dStpPortEntry 10 }
+++
+++-- the dot1dTp group
+++
+++-- Implementation of the dot1dTp group is optional. It is
+++-- implemented by those bridges that support the transparent
+++-- bridging mode. A transparent or SRT bridge will implement
+++-- this group.
+++
+++dot1dTpLearnedEntryDiscards OBJECT-TYPE
+++ SYNTAX Counter
+++
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The total number of Forwarding Database entries,
+++ which have been or would have been learnt, but
+++ have been discarded due to a lack of space to
+++ store them in the Forwarding Database. If this
+++ counter is increasing, it indicates that the
+++ Forwarding Database is regularly becoming full (a
+++ condition which has unpleasant performance effects
+++ on the subnetwork). If this counter has a
+++ significant value but is not presently increasing,
+++ it indicates that the problem has been occurring
+++ but is not persistent."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.7.1.1.3"
+++ ::= { dot1dTp 1 }
+++
+++dot1dTpAgingTime OBJECT-TYPE
+++ SYNTAX INTEGER (10..1000000)
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The timeout period in seconds for aging out
+++ dynamically learned forwarding information.
+++ 802.1D-1990 recommends a default of 300 seconds."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.7.1.1.3"
+++ ::= { dot1dTp 2 }
+++
+++-- The Forwarding Database for Transparent Bridges
+++
+++dot1dTpFdbTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF Dot1dTpFdbEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A table that contains information about unicast
+++ entries for which the bridge has forwarding and/or
+++ filtering information. This information is used
+++ by the transparent bridging function in
+++ determining how to propagate a received frame."
+++ ::= { dot1dTp 3 }
+++
+++dot1dTpFdbEntry OBJECT-TYPE
+++ SYNTAX Dot1dTpFdbEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "Information about a specific unicast MAC address
+++ for which the bridge has some forwarding and/or
+++ filtering information."
+++ INDEX { dot1dTpFdbAddress }
+++ ::= { dot1dTpFdbTable 1 }
+++
+++Dot1dTpFdbEntry ::=
+++ SEQUENCE {
+++ dot1dTpFdbAddress
+++ MacAddress,
+++ dot1dTpFdbPort
+++ INTEGER,
+++ dot1dTpFdbStatus
+++ INTEGER
+++ }
+++
+++dot1dTpFdbAddress OBJECT-TYPE
+++ SYNTAX MacAddress
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A unicast MAC address for which the bridge has
+++ forwarding and/or filtering information."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 3.9.1, 3.9.2"
+++ ::= { dot1dTpFdbEntry 1 }
+++
+++dot1dTpFdbPort OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "Either the value '0', or the port number of the
+++ port on which a frame having a source address
+++ equal to the value of the corresponding instance
+++ of dot1dTpFdbAddress has been seen. A value of
+++ '0' indicates that the port number has not been
+++ learned but that the bridge does have some
+++ forwarding/filtering information about this
+++ address (e.g. in the dot1dStaticTable).
+++ Implementors are encouraged to assign the port
+++ value to this object whenever it is learned even
+++ for addresses for which the corresponding value of
+++ dot1dTpFdbStatus is not learned(3)."
+++ ::= { dot1dTpFdbEntry 2 }
+++
+++dot1dTpFdbStatus OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ other(1),
+++ invalid(2),
+++ learned(3),
+++ self(4),
+++ mgmt(5)
+++ }
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The status of this entry. The meanings of the
+++ values are:
+++ other(1) : none of the following. This would
+++ include the case where some other
+++ MIB object (not the corresponding
+++ instance of dot1dTpFdbPort, nor an
+++ entry in the dot1dStaticTable) is
+++ being used to determine if and how
+++ frames addressed to the value of
+++ the corresponding instance of
+++ dot1dTpFdbAddress are being
+++ forwarded.
+++ invalid(2) : this entry is not longer valid
+++ (e.g., it was learned but has since
+++ aged-out), but has not yet been
+++ flushed from the table.
+++ learned(3) : the value of the corresponding
+++ instance of dot1dTpFdbPort was
+++ learned, and is being used.
+++ self(4) : the value of the corresponding
+++ instance of dot1dTpFdbAddress
+++ represents one of the bridge's
+++ addresses. The corresponding
+++ instance of dot1dTpFdbPort
+++ indicates which of the bridge's
+++ ports has this address.
+++ mgmt(5) : the value of the corresponding
+++ instance of dot1dTpFdbAddress is
+++ also the value of an existing
+++ instance of dot1dStaticAddress."
+++ ::= { dot1dTpFdbEntry 3 }
+++
+++-- Port Table for Transparent Bridges
+++
+++dot1dTpPortTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF Dot1dTpPortEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A table that contains information about every
+++ port that is associated with this transparent
+++ bridge."
+++ ::= { dot1dTp 4 }
+++
+++dot1dTpPortEntry OBJECT-TYPE
+++ SYNTAX Dot1dTpPortEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A list of information for each port of a
+++ transparent bridge."
+++ INDEX { dot1dTpPort }
+++ ::= { dot1dTpPortTable 1 }
+++
+++Dot1dTpPortEntry ::=
+++ SEQUENCE {
+++ dot1dTpPort
+++ INTEGER,
+++ dot1dTpPortMaxInfo
+++ INTEGER,
+++ dot1dTpPortInFrames
+++ Counter,
+++ dot1dTpPortOutFrames
+++ Counter,
+++ dot1dTpPortInDiscards
+++ Counter
+++ }
+++
+++dot1dTpPort OBJECT-TYPE
+++ SYNTAX INTEGER (1..65535)
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The port number of the port for which this entry
+++ contains Transparent bridging management
+++ information."
+++ ::= { dot1dTpPortEntry 1 }
+++
+++-- It would be nice if we could use ifMtu as the size of the
+++-- largest INFO field, but we can't because ifMtu is defined
+++-- to be the size that the (inter-)network layer can use which
+++-- can differ from the MAC layer (especially if several layers
+++-- of encapsulation are used).
+++
+++dot1dTpPortMaxInfo OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The maximum size of the INFO (non-MAC) field that
+++ this port will receive or transmit."
+++ ::= { dot1dTpPortEntry 2 }
+++
+++dot1dTpPortInFrames OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of frames that have been received by
+++ this port from its segment. Note that a frame
+++ received on the interface corresponding to this
+++ port is only counted by this object if and only if
+++ it is for a protocol being processed by the local
+++ bridging function, including bridge management
+++ frames."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.6.1.1.3"
+++ ::= { dot1dTpPortEntry 3 }
+++
+++dot1dTpPortOutFrames OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of frames that have been transmitted
+++ by this port to its segment. Note that a frame
+++ transmitted on the interface corresponding to this
+++ port is only counted by this object if and only if
+++ it is for a protocol being processed by the local
+++ bridging function, including bridge management
+++ frames."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.6.1.1.3"
+++ ::= { dot1dTpPortEntry 4 }
+++
+++dot1dTpPortInDiscards OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "Count of valid frames received which were
+++ discarded (i.e., filtered) by the Forwarding
+++ Process."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.6.1.1.3"
+++ ::= { dot1dTpPortEntry 5 }
+++-- The Static (Destination-Address Filtering) Database
+++
+++-- Implementation of this group is optional.
+++
+++dot1dStaticTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF Dot1dStaticEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A table containing filtering information
+++ configured into the bridge by (local or network)
+++ management specifying the set of ports to which
+++ frames received from specific ports and containing
+++ specific destination addresses are allowed to be
+++ forwarded. The value of zero in this table as the
+++ port number from which frames with a specific
+++ destination address are received, is used to
+++ specify all ports for which there is no specific
+++ entry in this table for that particular
+++ destination address. Entries are valid for
+++ unicast and for group/broadcast addresses."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.7.2"
+++ ::= { dot1dStatic 1 }
+++
+++dot1dStaticEntry OBJECT-TYPE
+++ SYNTAX Dot1dStaticEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "Filtering information configured into the bridge
+++ by (local or network) management specifying the
+++ set of ports to which frames received from a
+++ specific port and containing a specific
+++ destination address are allowed to be forwarded."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 6.7.2"
+++ INDEX { dot1dStaticAddress, dot1dStaticReceivePort }
+++ ::= { dot1dStaticTable 1 }
+++
+++Dot1dStaticEntry ::=
+++ SEQUENCE {
+++ dot1dStaticAddress
+++ MacAddress,
+++ dot1dStaticReceivePort
+++ INTEGER,
+++ dot1dStaticAllowedToGoTo
+++ OCTET STRING,
+++ dot1dStaticStatus
+++ INTEGER
+++ }
+++
+++dot1dStaticAddress OBJECT-TYPE
+++ SYNTAX MacAddress
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The destination MAC address in a frame to which
+++ this entry's filtering information applies. This
+++ object can take the value of a unicast address, a
+++ group address or the broadcast address."
+++ REFERENCE
+++ "IEEE 802.1D-1990: Section 3.9.1, 3.9.2"
+++ ::= { dot1dStaticEntry 1 }
+++
+++dot1dStaticReceivePort OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "Either the value '0', or the port number of the
+++ port from which a frame must be received in order
+++ for this entry's filtering information to apply.
+++ A value of zero indicates that this entry applies
+++ on all ports of the bridge for which there is no
+++ other applicable entry."
+++ ::= { dot1dStaticEntry 2 }
+++
+++dot1dStaticAllowedToGoTo OBJECT-TYPE
+++ SYNTAX OCTET STRING
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The set of ports to which frames received from a
+++ specific port and destined for a specific MAC
+++
+++ address, are allowed to be forwarded. Each octet
+++ within the value of this object specifies a set of
+++ eight ports, with the first octet specifying ports
+++ 1 through 8, the second octet specifying ports 9
+++ through 16, etc. Within each octet, the most
+++ significant bit represents the lowest numbered
+++ port, and the least significant bit represents the
+++ highest numbered port. Thus, each port of the
+++ bridge is represented by a single bit within the
+++ value of this object. If that bit has a value of
+++ '1' then that port is included in the set of
+++ ports; the port is not included if its bit has a
+++ value of '0'. (Note that the setting of the bit
+++ corresponding to the port from which a frame is
+++ received is irrelevant.) The default value of
+++ this object is a string of ones of appropriate
+++ length."
+++ ::= { dot1dStaticEntry 3 }
+++
+++dot1dStaticStatus OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ other(1),
+++ invalid(2),
+++ permanent(3),
+++ deleteOnReset(4),
+++ deleteOnTimeout(5)
+++ }
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "This object indicates the status of this entry.
+++ The default value is permanent(3).
+++ other(1) - this entry is currently in use but
+++ the conditions under which it will
+++ remain so are different from each of the
+++ following values.
+++ invalid(2) - writing this value to the object
+++ removes the corresponding entry.
+++ permanent(3) - this entry is currently in use
+++ and will remain so after the next reset
+++ of the bridge.
+++ deleteOnReset(4) - this entry is currently in
+++ use and will remain so until the next
+++ reset of the bridge.
+++ deleteOnTimeout(5) - this entry is currently
+++ in use and will remain so until it is
+++ aged out."
+++
+++ ::= { dot1dStaticEntry 4 }
+++
+++-- Traps for use by Bridges
+++
+++-- Traps for the Spanning Tree Protocol
+++
+++newRoot TRAP-TYPE
+++ ENTERPRISE dot1dBridge
+++ DESCRIPTION
+++ "The newRoot trap indicates that the sending agent
+++ has become the new root of the Spanning Tree; the
+++ trap is sent by a bridge soon after its election
+++ as the new root, e.g., upon expiration of the
+++ Topology Change Timer immediately subsequent to
+++ its election. Implementation of this trap is
+++ optional."
+++ ::= 1
+++
+++topologyChange TRAP-TYPE
+++ ENTERPRISE dot1dBridge
+++ DESCRIPTION
+++ "A topologyChange trap is sent by a bridge when
+++ any of its configured ports transitions from the
+++ Learning state to the Forwarding state, or from
+++ the Forwarding state to the Blocking state. The
+++ trap is not sent if a newRoot trap is sent for the
+++ same transition. Implementation of this trap is
+++ optional."
+++ ::= 2
+++
+++END
++--- /dev/null
+++++ b/mibs/GNOME-SMI.txt
++@@ -0,0 +1,88 @@
+++GNOME-SMI DEFINITIONS ::= BEGIN
+++
+++IMPORTS
+++ MODULE-IDENTITY,
+++ OBJECT-IDENTITY,
+++ enterprises
+++ FROM SNMPv2-SMI;
+++
+++gnome MODULE-IDENTITY
+++ LAST-UPDATED "200709070000Z"
+++ ORGANIZATION "GNOME project"
+++ CONTACT-INFO
+++ "GNU Network Object Model Environment project
+++
+++ see http://www.gnome.org for contact persons of a particular
+++ area or subproject of GNOME.
+++
+++ Administrative contact for MIB module:
+++
+++ Jochen Friedrich
+++ Ramsaystr. 9
+++ 63450 Hanau
+++ Germany
+++
+++ email: jochen@scram.de"
+++ DESCRIPTION
+++ "The Structure of GNOME."
+++
+++ -- revision history
+++
+++ REVISION "200709070000Z" -- Sep 07, 2007
+++ DESCRIPTION
+++ "Fixed wrong enterprise number (how comes this
+++ typo was unnoticed for so long?)."
+++
+++ REVISION "200505070000Z" -- May 07, 2005
+++ DESCRIPTION
+++ "Added gnomeLDAP subtree for LDAP definitions."
+++
+++ REVISION "200312070000Z" -- December 07, 2003
+++ DESCRIPTION
+++ "Added gnomeSysadmin subtree for GNOME project system administration.
+++ Updated contact info."
+++
+++ REVISION "9809010000Z" -- September 01, 1998
+++ DESCRIPTION
+++ "Initial version."
+++
+++ ::= { enterprises 3319 } -- assigned by IANA
+++
+++gnomeProducts OBJECT-IDENTITY
+++ STATUS current
+++ DESCRIPTION
+++ "gnomeProducts is the root OBJECT IDENTIFIER from
+++ which sysObjectID values are assigned."
+++ ::= { gnome 1 }
+++
+++gnomeMgmt OBJECT-IDENTITY
+++ STATUS current
+++ DESCRIPTION
+++ "gnomeMgmt defines the subtree for production GNOME related
+++ MIB registrations."
+++ ::= { gnome 2 }
+++
+++gnomeTest OBJECT-IDENTITY
+++ STATUS current
+++ DESCRIPTION
+++ "gnomeTest defines the subtree for testing GNOME related
+++ MIB registrations."
+++ ::= { gnome 3 }
+++
+++gnomeSysadmin OBJECT-IDENTITY
+++ STATUS current
+++ DESCRIPTION
+++ "gnomeSysadmin defines the subtree for GNOME related Sysadmin
+++ MIB registrations."
+++ ::= { gnome 4 }
+++
+++gnomeLDAP OBJECT-IDENTITY
+++ STATUS current
+++ DESCRIPTION
+++ "gnomeLDAP defines the subtree for GNOME related LDAP
+++ registrations."
+++ ::= { gnome 5 }
+++
+++-- more to come if necessary.
+++
+++END
++--- /dev/null
+++++ b/mibs/OSPF-MIB.txt
++@@ -0,0 +1,2723 @@
+++OSPF-MIB DEFINITIONS ::= BEGIN
+++
+++ IMPORTS
+++ MODULE-IDENTITY, OBJECT-TYPE, Counter32, Gauge32,
+++ Integer32, IpAddress
+++ FROM SNMPv2-SMI
+++ TEXTUAL-CONVENTION, TruthValue, RowStatus
+++ FROM SNMPv2-TC
+++ MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF
+++ mib-2 FROM RFC1213-MIB;
+++
+++-- This MIB module uses the extended OBJECT-TYPE macro as
+++-- defined in [9].
+++
+++ospf MODULE-IDENTITY
+++ LAST-UPDATED "9501201225Z" -- Fri Jan 20 12:25:50 PST 1995
+++ ORGANIZATION "IETF OSPF Working Group"
+++ CONTACT-INFO
+++ " Fred Baker
+++ Postal: Cisco Systems
+++ 519 Lado Drive
+++ Santa Barbara, California 93111
+++ Tel: +1 805 681 0115
+++ E-Mail: fred@cisco.com
+++
+++ Rob Coltun
+++ Postal: RainbowBridge Communications
+++ Tel: (301) 340-9416
+++ E-Mail: rcoltun@rainbow-bridge.com"
+++ DESCRIPTION
+++ "The MIB module to describe the OSPF Version 2
+++ Protocol"
+++ ::= { mib-2 14 }
+++
+++-- The Area ID, in OSPF, has the same format as an IP Address,
+++-- but has the function of defining a summarization point for
+++-- Link State Advertisements
+++
+++AreaID ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "An OSPF Area Identifier."
+++ SYNTAX IpAddress
+++
+++
+++-- The Router ID, in OSPF, has the same format as an IP Address,
+++-- but identifies the router independent of its IP Address.
+++
+++RouterID ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "A OSPF Router Identifier."
+++ SYNTAX IpAddress
+++
+++
+++-- The OSPF Metric is defined as an unsigned value in the range
+++
+++Metric ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "The OSPF Internal Metric."
+++ SYNTAX Integer32 (0..'FFFF'h)
+++
+++BigMetric ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "The OSPF External Metric."
+++ SYNTAX Integer32 (0..'FFFFFF'h)
+++
+++-- Status Values
+++
+++Status ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "The status of an interface: 'enabled' indicates that
+++ it is willing to communicate with other OSPF Routers,
+++ while 'disabled' indicates that it is not."
+++ SYNTAX INTEGER { enabled (1), disabled (2) }
+++
+++-- Time Durations measured in seconds
+++
+++PositiveInteger ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "A positive integer. Values in excess are precluded as
+++ unnecessary and prone to interoperability issues."
+++ SYNTAX Integer32 (0..'7FFFFFFF'h)
+++
+++HelloRange ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "The range of intervals on which hello messages are
+++ exchanged."
+++ SYNTAX Integer32 (1..'FFFF'h)
+++
+++UpToMaxAge ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "The values that one might find or configure for
+++ variables bounded by the maximum age of an LSA."
+++ SYNTAX Integer32 (0..3600)
+++
+++
+++-- The range of ifIndex
+++
+++InterfaceIndex ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "The range of ifIndex."
+++ SYNTAX Integer32
+++
+++
+++-- Potential Priorities for the Designated Router Election
+++
+++DesignatedRouterPriority ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "The values defined for the priority of a system for
+++ becoming the designated router."
+++ SYNTAX Integer32 (0..'FF'h)
+++
+++TOSType ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "Type of Service is defined as a mapping to the IP Type of
+++ Service Flags as defined in the IP Forwarding Table MIB
+++
+++ +-----+-----+-----+-----+-----+-----+-----+-----+
+++ | | | |
+++ | PRECEDENCE | TYPE OF SERVICE | 0 |
+++ | | | |
+++ +-----+-----+-----+-----+-----+-----+-----+-----+
+++
+++ IP TOS IP TOS
+++ Field Policy Field Policy
+++
+++ Contents Code Contents Code
+++ 0 0 0 0 ==> 0 0 0 0 1 ==> 2
+++ 0 0 1 0 ==> 4 0 0 1 1 ==> 6
+++ 0 1 0 0 ==> 8 0 1 0 1 ==> 10
+++ 0 1 1 0 ==> 12 0 1 1 1 ==> 14
+++ 1 0 0 0 ==> 16 1 0 0 1 ==> 18
+++ 1 0 1 0 ==> 20 1 0 1 1 ==> 22
+++ 1 1 0 0 ==> 24 1 1 0 1 ==> 26
+++ 1 1 1 0 ==> 28 1 1 1 1 ==> 30
+++
+++ The remaining values are left for future definition."
+++ SYNTAX Integer32 (0..30)
+++
+++
+++-- OSPF General Variables
+++
+++-- These parameters apply globally to the Router's
+++-- OSPF Process.
+++
+++ospfGeneralGroup OBJECT IDENTIFIER ::= { ospf 1 }
+++
+++
+++ ospfRouterId OBJECT-TYPE
+++ SYNTAX RouterID
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "A 32-bit integer uniquely identifying the
+++ router in the Autonomous System.
+++
+++ By convention, to ensure uniqueness, this
+++ should default to the value of one of the
+++ router's IP interface addresses."
+++ REFERENCE
+++ "OSPF Version 2, C.1 Global parameters"
+++ ::= { ospfGeneralGroup 1 }
+++
+++
+++ ospfAdminStat OBJECT-TYPE
+++ SYNTAX Status
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "The administrative status of OSPF in the
+++ router. The value 'enabled' denotes that the
+++ OSPF Process is active on at least one inter-
+++ face; 'disabled' disables it on all inter-
+++ faces."
+++ ::= { ospfGeneralGroup 2 }
+++
+++ ospfVersionNumber OBJECT-TYPE
+++ SYNTAX INTEGER { version2 (2) }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The current version number of the OSPF proto-
+++ col is 2."
+++ REFERENCE
+++ "OSPF Version 2, Title"
+++ ::= { ospfGeneralGroup 3 }
+++
+++
+++ ospfAreaBdrRtrStatus OBJECT-TYPE
+++ SYNTAX TruthValue
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "A flag to note whether this router is an area
+++ border router."
+++ REFERENCE
+++ "OSPF Version 2, Section 3 Splitting the AS into
+++ Areas"
+++ ::= { ospfGeneralGroup 4 }
+++
+++
+++ ospfASBdrRtrStatus OBJECT-TYPE
+++ SYNTAX TruthValue
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "A flag to note whether this router is config-
+++ ured as an Autonomous System border router."
+++ REFERENCE
+++ "OSPF Version 2, Section 3.3 Classification of
+++ routers"
+++ ::= { ospfGeneralGroup 5 }
+++
+++ ospfExternLsaCount OBJECT-TYPE
+++ SYNTAX Gauge32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of external (LS type 5) link-state
+++ advertisements in the link-state database."
+++ REFERENCE
+++ "OSPF Version 2, Appendix A.4.5 AS external link
+++ advertisements"
+++ ::= { ospfGeneralGroup 6 }
+++
+++
+++ ospfExternLsaCksumSum OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The 32-bit unsigned sum of the LS checksums of
+++ the external link-state advertisements con-
+++ tained in the link-state database. This sum
+++ can be used to determine if there has been a
+++ change in a router's link state database, and
+++ to compare the link-state database of two
+++ routers."
+++ ::= { ospfGeneralGroup 7 }
+++
+++
+++ ospfTOSSupport OBJECT-TYPE
+++ SYNTAX TruthValue
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "The router's support for type-of-service rout-
+++ ing."
+++ REFERENCE
+++ "OSPF Version 2, Appendix F.1.2 Optional TOS
+++ support"
+++ ::= { ospfGeneralGroup 8 }
+++
+++ ospfOriginateNewLsas OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of new link-state advertisements
+++ that have been originated. This number is in-
+++ cremented each time the router originates a new
+++ LSA."
+++ ::= { ospfGeneralGroup 9 }
+++
+++
+++ ospfRxNewLsas OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of link-state advertisements re-
+++ ceived determined to be new instantiations.
+++ This number does not include newer instantia-
+++ tions of self-originated link-state advertise-
+++ ments."
+++ ::= { ospfGeneralGroup 10 }
+++
+++ ospfExtLsdbLimit OBJECT-TYPE
+++ SYNTAX Integer32 (-1..'7FFFFFFF'h)
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "The maximum number of non-default AS-
+++ external-LSAs entries that can be stored in the
+++ link-state database. If the value is -1, then
+++ there is no limit.
+++
+++ When the number of non-default AS-external-LSAs
+++ in a router's link-state database reaches
+++ ospfExtLsdbLimit, the router enters Overflow-
+++ State. The router never holds more than
+++ ospfExtLsdbLimit non-default AS-external-LSAs
+++ in its database. OspfExtLsdbLimit MUST be set
+++ identically in all routers attached to the OSPF
+++ backbone and/or any regular OSPF area. (i.e.,
+++ OSPF stub areas and NSSAs are excluded)."
+++ DEFVAL { -1 }
+++ ::= { ospfGeneralGroup 11 }
+++
+++ ospfMulticastExtensions OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "A Bit Mask indicating whether the router is
+++ forwarding IP multicast (Class D) datagrams
+++ based on the algorithms defined in the Multi-
+++ cast Extensions to OSPF.
+++
+++ Bit 0, if set, indicates that the router can
+++ forward IP multicast datagrams in the router's
+++ directly attached areas (called intra-area mul-
+++ ticast routing).
+++
+++ Bit 1, if set, indicates that the router can
+++ forward IP multicast datagrams between OSPF
+++ areas (called inter-area multicast routing).
+++
+++ Bit 2, if set, indicates that the router can
+++ forward IP multicast datagrams between Auto-
+++ nomous Systems (called inter-AS multicast rout-
+++ ing).
+++
+++ Only certain combinations of bit settings are
+++ allowed, namely: 0 (no multicast forwarding is
+++ enabled), 1 (intra-area multicasting only), 3
+++ (intra-area and inter-area multicasting), 5
+++ (intra-area and inter-AS multicasting) and 7
+++ (multicasting everywhere). By default, no mul-
+++ ticast forwarding is enabled."
+++ DEFVAL { 0 }
+++ ::= { ospfGeneralGroup 12 }
+++
+++ ospfExitOverflowInterval OBJECT-TYPE
+++ SYNTAX PositiveInteger
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "The number of seconds that, after entering
+++ OverflowState, a router will attempt to leave
+++ OverflowState. This allows the router to again
+++ originate non-default AS-external-LSAs. When
+++ set to 0, the router will not leave Overflow-
+++ State until restarted."
+++ DEFVAL { 0 }
+++ ::= { ospfGeneralGroup 13 }
+++
+++
+++ ospfDemandExtensions OBJECT-TYPE
+++ SYNTAX TruthValue
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "The router's support for demand routing."
+++ REFERENCE
+++ "OSPF Version 2, Appendix on Demand Routing"
+++ ::= { ospfGeneralGroup 14 }
+++
+++
+++-- The OSPF Area Data Structure contains information
+++-- regarding the various areas. The interfaces and
+++-- virtual links are configured as part of these areas.
+++-- Area 0.0.0.0, by definition, is the Backbone Area
+++
+++
+++ ospfAreaTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfAreaEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "Information describing the configured parame-
+++ ters and cumulative statistics of the router's
+++ attached areas."
+++ REFERENCE
+++ "OSPF Version 2, Section 6 The Area Data Struc-
+++ ture"
+++ ::= { ospf 2 }
+++
+++
+++ ospfAreaEntry OBJECT-TYPE
+++ SYNTAX OspfAreaEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "Information describing the configured parame-
+++ ters and cumulative statistics of one of the
+++ router's attached areas."
+++ INDEX { ospfAreaId }
+++ ::= { ospfAreaTable 1 }
+++
+++OspfAreaEntry ::=
+++ SEQUENCE {
+++ ospfAreaId
+++ AreaID,
+++ ospfAuthType
+++ Integer32,
+++ ospfImportAsExtern
+++ INTEGER,
+++ ospfSpfRuns
+++ Counter32,
+++ ospfAreaBdrRtrCount
+++ Gauge32,
+++ ospfAsBdrRtrCount
+++ Gauge32,
+++ ospfAreaLsaCount
+++ Gauge32,
+++ ospfAreaLsaCksumSum
+++ Integer32,
+++ ospfAreaSummary
+++ INTEGER,
+++ ospfAreaStatus
+++ RowStatus
+++ }
+++
+++ ospfAreaId OBJECT-TYPE
+++ SYNTAX AreaID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "A 32-bit integer uniquely identifying an area.
+++ Area ID 0.0.0.0 is used for the OSPF backbone."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ ::= { ospfAreaEntry 1 }
+++
+++
+++ ospfAuthType OBJECT-TYPE
+++ SYNTAX Integer32
+++ -- none (0),
+++ -- simplePassword (1)
+++ -- md5 (2)
+++ -- reserved for specification by IANA (> 2)
+++ MAX-ACCESS read-create
+++ STATUS obsolete
+++ DESCRIPTION
+++ "The authentication type specified for an area.
+++ Additional authentication types may be assigned
+++ locally on a per Area basis."
+++ REFERENCE
+++ "OSPF Version 2, Appendix E Authentication"
+++ DEFVAL { 0 } -- no authentication, by default
+++ ::= { ospfAreaEntry 2 }
+++
+++ ospfImportAsExtern OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ importExternal (1),
+++ importNoExternal (2),
+++ importNssa (3)
+++ }
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The area's support for importing AS external
+++ link- state advertisements."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ DEFVAL { importExternal }
+++ ::= { ospfAreaEntry 3 }
+++
+++
+++ ospfSpfRuns OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of times that the intra-area route
+++ table has been calculated using this area's
+++ link-state database. This is typically done
+++ using Dijkstra's algorithm."
+++ ::= { ospfAreaEntry 4 }
+++
+++
+++ ospfAreaBdrRtrCount OBJECT-TYPE
+++ SYNTAX Gauge32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The total number of area border routers reach-
+++ able within this area. This is initially zero,
+++ and is calculated in each SPF Pass."
+++ ::= { ospfAreaEntry 5 }
+++
+++ ospfAsBdrRtrCount OBJECT-TYPE
+++ SYNTAX Gauge32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The total number of Autonomous System border
+++ routers reachable within this area. This is
+++ initially zero, and is calculated in each SPF
+++ Pass."
+++ ::= { ospfAreaEntry 6 }
+++
+++
+++ ospfAreaLsaCount OBJECT-TYPE
+++ SYNTAX Gauge32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The total number of link-state advertisements
+++ in this area's link-state database, excluding
+++ AS External LSA's."
+++ ::= { ospfAreaEntry 7 }
+++
+++
+++ ospfAreaLsaCksumSum OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The 32-bit unsigned sum of the link-state ad-
+++ vertisements' LS checksums contained in this
+++ area's link-state database. This sum excludes
+++ external (LS type 5) link-state advertisements.
+++ The sum can be used to determine if there has
+++ been a change in a router's link state data-
+++ base, and to compare the link-state database of
+++ two routers."
+++ DEFVAL { 0 }
+++ ::= { ospfAreaEntry 8 }
+++
+++ ospfAreaSummary OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ noAreaSummary (1),
+++ sendAreaSummary (2)
+++ }
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The variable ospfAreaSummary controls the im-
+++ port of summary LSAs into stub areas. It has
+++ no effect on other areas.
+++
+++ If it is noAreaSummary, the router will neither
+++ originate nor propagate summary LSAs into the
+++ stub area. It will rely entirely on its de-
+++ fault route.
+++
+++ If it is sendAreaSummary, the router will both
+++ summarize and propagate summary LSAs."
+++ DEFVAL { noAreaSummary }
+++ ::= { ospfAreaEntry 9 }
+++
+++
+++ ospfAreaStatus OBJECT-TYPE
+++ SYNTAX RowStatus
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "This variable displays the status of the en-
+++ try. Setting it to 'invalid' has the effect of
+++ rendering it inoperative. The internal effect
+++ (row removal) is implementation dependent."
+++ ::= { ospfAreaEntry 10 }
+++
+++
+++-- OSPF Area Default Metric Table
+++
+++-- The OSPF Area Default Metric Table describes the metrics
+++-- that a default Area Border Router will advertise into a
+++-- Stub area.
+++
+++
+++ ospfStubAreaTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfStubAreaEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "The set of metrics that will be advertised by
+++ a default Area Border Router into a stub area."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2, Area Parameters"
+++ ::= { ospf 3 }
+++
+++
+++ ospfStubAreaEntry OBJECT-TYPE
+++ SYNTAX OspfStubAreaEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "The metric for a given Type of Service that
+++ will be advertised by a default Area Border
+++ Router into a stub area."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2, Area Parameters"
+++ INDEX { ospfStubAreaId, ospfStubTOS }
+++ ::= { ospfStubAreaTable 1 }
+++
+++OspfStubAreaEntry ::=
+++ SEQUENCE {
+++ ospfStubAreaId
+++ AreaID,
+++ ospfStubTOS
+++ TOSType,
+++ ospfStubMetric
+++ BigMetric,
+++ ospfStubStatus
+++ RowStatus,
+++ ospfStubMetricType
+++ INTEGER
+++ }
+++
+++ ospfStubAreaId OBJECT-TYPE
+++ SYNTAX AreaID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The 32 bit identifier for the Stub Area. On
+++ creation, this can be derived from the in-
+++ stance."
+++ ::= { ospfStubAreaEntry 1 }
+++
+++
+++ ospfStubTOS OBJECT-TYPE
+++ SYNTAX TOSType
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The Type of Service associated with the
+++ metric. On creation, this can be derived from
+++ the instance."
+++ ::= { ospfStubAreaEntry 2 }
+++
+++
+++ ospfStubMetric OBJECT-TYPE
+++ SYNTAX BigMetric
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The metric value applied at the indicated type
+++ of service. By default, this equals the least
+++ metric at the type of service among the inter-
+++ faces to other areas."
+++ ::= { ospfStubAreaEntry 3 }
+++
+++
+++ ospfStubStatus OBJECT-TYPE
+++ SYNTAX RowStatus
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "This variable displays the status of the en-
+++ try. Setting it to 'invalid' has the effect of
+++ rendering it inoperative. The internal effect
+++ (row removal) is implementation dependent."
+++ ::= { ospfStubAreaEntry 4 }
+++
+++ ospfStubMetricType OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ ospfMetric (1), -- OSPF Metric
+++ comparableCost (2), -- external type 1
+++ nonComparable (3) -- external type 2
+++ }
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "This variable displays the type of metric ad-
+++ vertised as a default route."
+++ DEFVAL { ospfMetric }
+++ ::= { ospfStubAreaEntry 5 }
+++
+++-- OSPF Link State Database
+++
+++-- The Link State Database contains the Link State
+++-- Advertisements from throughout the areas that the
+++-- device is attached to.
+++
+++
+++ ospfLsdbTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfLsdbEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "The OSPF Process's Link State Database."
+++ REFERENCE
+++ "OSPF Version 2, Section 12 Link State Adver-
+++ tisements"
+++ ::= { ospf 4 }
+++
+++
+++ ospfLsdbEntry OBJECT-TYPE
+++ SYNTAX OspfLsdbEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A single Link State Advertisement."
+++ INDEX { ospfLsdbAreaId, ospfLsdbType,
+++ ospfLsdbLsid, ospfLsdbRouterId }
+++ ::= { ospfLsdbTable 1 }
+++
+++OspfLsdbEntry ::=
+++ SEQUENCE {
+++ ospfLsdbAreaId
+++ AreaID,
+++ ospfLsdbType
+++ INTEGER,
+++ ospfLsdbLsid
+++ IpAddress,
+++ ospfLsdbRouterId
+++ RouterID,
+++ ospfLsdbSequence
+++ Integer32,
+++ ospfLsdbAge
+++ Integer32,
+++ ospfLsdbChecksum
+++ Integer32,
+++ ospfLsdbAdvertisement
+++ OCTET STRING
+++ }
+++ ospfLsdbAreaId OBJECT-TYPE
+++ SYNTAX AreaID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The 32 bit identifier of the Area from which
+++ the LSA was received."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ ::= { ospfLsdbEntry 1 }
+++
+++-- External Link State Advertisements are permitted
+++-- for backward compatibility, but should be displayed in
+++-- the ospfExtLsdbTable rather than here.
+++
+++ ospfLsdbType OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ routerLink (1),
+++ networkLink (2),
+++ summaryLink (3),
+++ asSummaryLink (4),
+++ asExternalLink (5), -- but see ospfExtLsdbTable
+++ multicastLink (6),
+++ nssaExternalLink (7)
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The type of the link state advertisement.
+++ Each link state type has a separate advertise-
+++ ment format."
+++ REFERENCE
+++ "OSPF Version 2, Appendix A.4.1 The Link State
+++ Advertisement header"
+++ ::= { ospfLsdbEntry 2 }
+++
+++ ospfLsdbLsid OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The Link State ID is an LS Type Specific field
+++ containing either a Router ID or an IP Address;
+++ it identifies the piece of the routing domain
+++ that is being described by the advertisement."
+++ REFERENCE
+++ "OSPF Version 2, Section 12.1.4 Link State ID"
+++ ::= { ospfLsdbEntry 3 }
+++ ospfLsdbRouterId OBJECT-TYPE
+++ SYNTAX RouterID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The 32 bit number that uniquely identifies the
+++ originating router in the Autonomous System."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.1 Global parameters"
+++ ::= { ospfLsdbEntry 4 }
+++
+++-- Note that the OSPF Sequence Number is a 32 bit signed
+++-- integer. It starts with the value '80000001'h,
+++-- or -'7FFFFFFF'h, and increments until '7FFFFFFF'h
+++-- Thus, a typical sequence number will be very negative.
+++
+++ ospfLsdbSequence OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The sequence number field is a signed 32-bit
+++ integer. It is used to detect old and dupli-
+++ cate link state advertisements. The space of
+++ sequence numbers is linearly ordered. The
+++ larger the sequence number the more recent the
+++ advertisement."
+++ REFERENCE
+++ "OSPF Version 2, Section 12.1.6 LS sequence
+++ number"
+++ ::= { ospfLsdbEntry 5 }
+++
+++
+++ ospfLsdbAge OBJECT-TYPE
+++ SYNTAX Integer32 -- Should be 0..MaxAge
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "This field is the age of the link state adver-
+++ tisement in seconds."
+++ REFERENCE
+++ "OSPF Version 2, Section 12.1.1 LS age"
+++ ::= { ospfLsdbEntry 6 }
+++
+++ ospfLsdbChecksum OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "This field is the checksum of the complete
+++ contents of the advertisement, excepting the
+++ age field. The age field is excepted so that
+++ an advertisement's age can be incremented
+++ without updating the checksum. The checksum
+++ used is the same that is used for ISO connec-
+++ tionless datagrams; it is commonly referred to
+++ as the Fletcher checksum."
+++ REFERENCE
+++ "OSPF Version 2, Section 12.1.7 LS checksum"
+++ ::= { ospfLsdbEntry 7 }
+++
+++
+++ ospfLsdbAdvertisement OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE (1..65535))
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The entire Link State Advertisement, including
+++ its header."
+++ REFERENCE
+++ "OSPF Version 2, Section 12 Link State Adver-
+++ tisements"
+++ ::= { ospfLsdbEntry 8 }
+++
+++
+++-- Address Range Table
+++
+++-- The Address Range Table acts as an adjunct to the Area
+++-- Table; It describes those Address Range Summaries that
+++-- are configured to be propagated from an Area to reduce
+++-- the amount of information about it which is known beyond
+++-- its borders.
+++
+++ ospfAreaRangeTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfAreaRangeEntry
+++ MAX-ACCESS not-accessible
+++ STATUS obsolete
+++ DESCRIPTION
+++ "A range if IP addresses specified by an IP
+++ address/IP network mask pair. For example,
+++ class B address range of X.X.X.X with a network
+++ mask of 255.255.0.0 includes all IP addresses
+++ from X.X.0.0 to X.X.255.255"
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ ::= { ospf 5 }
+++ ospfAreaRangeEntry OBJECT-TYPE
+++ SYNTAX OspfAreaRangeEntry
+++ MAX-ACCESS not-accessible
+++ STATUS obsolete
+++ DESCRIPTION
+++ "A range if IP addresses specified by an IP
+++ address/IP network mask pair. For example,
+++ class B address range of X.X.X.X with a network
+++ mask of 255.255.0.0 includes all IP addresses
+++ from X.X.0.0 to X.X.255.255"
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ INDEX { ospfAreaRangeAreaId, ospfAreaRangeNet }
+++ ::= { ospfAreaRangeTable 1 }
+++
+++OspfAreaRangeEntry ::=
+++ SEQUENCE {
+++ ospfAreaRangeAreaId
+++ AreaID,
+++ ospfAreaRangeNet
+++ IpAddress,
+++ ospfAreaRangeMask
+++ IpAddress,
+++ ospfAreaRangeStatus
+++ RowStatus,
+++ ospfAreaRangeEffect
+++ INTEGER
+++ }
+++
+++ ospfAreaRangeAreaId OBJECT-TYPE
+++ SYNTAX AreaID
+++ MAX-ACCESS read-only
+++ STATUS obsolete
+++ DESCRIPTION
+++ "The Area the Address Range is to be found
+++ within."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ ::= { ospfAreaRangeEntry 1 }
+++
+++
+++ ospfAreaRangeNet OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS obsolete
+++ DESCRIPTION
+++ "The IP Address of the Net or Subnet indicated
+++ by the range."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ ::= { ospfAreaRangeEntry 2 }
+++
+++
+++ ospfAreaRangeMask OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-create
+++ STATUS obsolete
+++ DESCRIPTION
+++ "The Subnet Mask that pertains to the Net or
+++ Subnet."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ ::= { ospfAreaRangeEntry 3 }
+++
+++ ospfAreaRangeStatus OBJECT-TYPE
+++ SYNTAX RowStatus
+++ MAX-ACCESS read-create
+++ STATUS obsolete
+++ DESCRIPTION
+++ "This variable displays the status of the en-
+++ try. Setting it to 'invalid' has the effect of
+++ rendering it inoperative. The internal effect
+++ (row removal) is implementation dependent."
+++ ::= { ospfAreaRangeEntry 4 }
+++
+++
+++ ospfAreaRangeEffect OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ advertiseMatching (1),
+++ doNotAdvertiseMatching (2)
+++ }
+++ MAX-ACCESS read-create
+++ STATUS obsolete
+++ DESCRIPTION
+++ "Subnets subsumed by ranges either trigger the
+++ advertisement of the indicated summary (adver-
+++ tiseMatching), or result in the subnet's not
+++ being advertised at all outside the area."
+++ DEFVAL { advertiseMatching }
+++ ::= { ospfAreaRangeEntry 5 }
+++
+++
+++
+++-- OSPF Host Table
+++
+++-- The Host/Metric Table indicates what hosts are directly
+++-- attached to the Router, and what metrics and types of
+++-- service should be advertised for them.
+++
+++ ospfHostTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfHostEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "The list of Hosts, and their metrics, that the
+++ router will advertise as host routes."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.6 Host route param-
+++ eters"
+++ ::= { ospf 6 }
+++
+++
+++ ospfHostEntry OBJECT-TYPE
+++ SYNTAX OspfHostEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A metric to be advertised, for a given type of
+++ service, when a given host is reachable."
+++ INDEX { ospfHostIpAddress, ospfHostTOS }
+++ ::= { ospfHostTable 1 }
+++
+++OspfHostEntry ::=
+++ SEQUENCE {
+++ ospfHostIpAddress
+++ IpAddress,
+++ ospfHostTOS
+++ TOSType,
+++ ospfHostMetric
+++ Metric,
+++ ospfHostStatus
+++ RowStatus,
+++ ospfHostAreaID
+++ AreaID
+++ }
+++
+++ ospfHostIpAddress OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP Address of the Host."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.6 Host route parame-
+++ ters"
+++ ::= { ospfHostEntry 1 }
+++
+++
+++ ospfHostTOS OBJECT-TYPE
+++ SYNTAX TOSType
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The Type of Service of the route being config-
+++ ured."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.6 Host route parame-
+++ ters"
+++ ::= { ospfHostEntry 2 }
+++
+++
+++ ospfHostMetric OBJECT-TYPE
+++ SYNTAX Metric
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The Metric to be advertised."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.6 Host route parame-
+++ ters"
+++ ::= { ospfHostEntry 3 }
+++
+++ ospfHostStatus OBJECT-TYPE
+++ SYNTAX RowStatus
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "This variable displays the status of the en-
+++ try. Setting it to 'invalid' has the effect of
+++ rendering it inoperative. The internal effect
+++ (row removal) is implementation dependent."
+++ ::= { ospfHostEntry 4 }
+++
+++
+++ ospfHostAreaID OBJECT-TYPE
+++ SYNTAX AreaID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The Area the Host Entry is to be found within.
+++ By default, the area that a subsuming OSPF in-
+++ terface is in, or 0.0.0.0"
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ ::= { ospfHostEntry 5 }
+++
+++
+++-- OSPF Interface Table
+++
+++-- The OSPF Interface Table augments the ipAddrTable
+++-- with OSPF specific information.
+++
+++ ospfIfTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfIfEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "The OSPF Interface Table describes the inter-
+++ faces from the viewpoint of OSPF."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.3 Router interface
+++ parameters"
+++ ::= { ospf 7 }
+++
+++
+++ ospfIfEntry OBJECT-TYPE
+++ SYNTAX OspfIfEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "The OSPF Interface Entry describes one inter-
+++ face from the viewpoint of OSPF."
+++ INDEX { ospfIfIpAddress, ospfAddressLessIf }
+++ ::= { ospfIfTable 1 }
+++
+++OspfIfEntry ::=
+++ SEQUENCE {
+++ ospfIfIpAddress
+++ IpAddress,
+++ ospfAddressLessIf
+++ Integer32,
+++ ospfIfAreaId
+++ AreaID,
+++ ospfIfType
+++ INTEGER,
+++ ospfIfAdminStat
+++ Status,
+++ ospfIfRtrPriority
+++ DesignatedRouterPriority,
+++ ospfIfTransitDelay
+++ UpToMaxAge,
+++ ospfIfRetransInterval
+++ UpToMaxAge,
+++ ospfIfHelloInterval
+++ HelloRange,
+++ ospfIfRtrDeadInterval
+++ PositiveInteger,
+++ ospfIfPollInterval
+++ PositiveInteger,
+++ ospfIfState
+++ INTEGER,
+++ ospfIfDesignatedRouter
+++ IpAddress,
+++ ospfIfBackupDesignatedRouter
+++ IpAddress,
+++ ospfIfEvents
+++ Counter32,
+++ ospfIfAuthType
+++ INTEGER,
+++ ospfIfAuthKey
+++ OCTET STRING,
+++ ospfIfStatus
+++ RowStatus,
+++ ospfIfMulticastForwarding
+++ INTEGER,
+++ ospfIfDemand
+++ TruthValue
+++ }
+++
+++ ospfIfIpAddress OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP address of this OSPF interface."
+++ ::= { ospfIfEntry 1 }
+++
+++ ospfAddressLessIf OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "For the purpose of easing the instancing of
+++ addressed and addressless interfaces; This
+++ variable takes the value 0 on interfaces with
+++ IP Addresses, and the corresponding value of
+++ ifIndex for interfaces having no IP Address."
+++ ::= { ospfIfEntry 2 }
+++ ospfIfAreaId OBJECT-TYPE
+++ SYNTAX AreaID
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "A 32-bit integer uniquely identifying the area
+++ to which the interface connects. Area ID
+++ 0.0.0.0 is used for the OSPF backbone."
+++ DEFVAL { '00000000'H } -- 0.0.0.0
+++ ::= { ospfIfEntry 3 }
+++
+++ ospfIfType OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ broadcast (1),
+++ nbma (2),
+++ pointToPoint (3),
+++ pointToMultipoint (5)
+++ }
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The OSPF interface type.
+++
+++ By way of a default, this field may be intuited
+++ from the corresponding value of ifType. Broad-
+++ cast LANs, such as Ethernet and IEEE 802.5,
+++ take the value 'broadcast', X.25 and similar
+++ technologies take the value 'nbma', and links
+++ that are definitively point to point take the
+++ value 'pointToPoint'."
+++ ::= { ospfIfEntry 4 }
+++
+++
+++ ospfIfAdminStat OBJECT-TYPE
+++ SYNTAX Status
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The OSPF interface's administrative status.
+++ The value formed on the interface, and the in-
+++ terface will be advertised as an internal route
+++ to some area. The value 'disabled' denotes
+++ that the interface is external to OSPF."
+++ DEFVAL { enabled }
+++ ::= { ospfIfEntry 5 }
+++
+++ ospfIfRtrPriority OBJECT-TYPE
+++ SYNTAX DesignatedRouterPriority
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The priority of this interface. Used in
+++ multi-access networks, this field is used in
+++ the designated router election algorithm. The
+++ value 0 signifies that the router is not eligi-
+++ ble to become the designated router on this
+++ particular network. In the event of a tie in
+++ this value, routers will use their Router ID as
+++ a tie breaker."
+++ DEFVAL { 1 }
+++ ::= { ospfIfEntry 6 }
+++
+++
+++ ospfIfTransitDelay OBJECT-TYPE
+++ SYNTAX UpToMaxAge
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The estimated number of seconds it takes to
+++ transmit a link state update packet over this
+++ interface."
+++ DEFVAL { 1 }
+++ ::= { ospfIfEntry 7 }
+++
+++
+++ ospfIfRetransInterval OBJECT-TYPE
+++ SYNTAX UpToMaxAge
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The number of seconds between link-state ad-
+++ vertisement retransmissions, for adjacencies
+++ belonging to this interface. This value is
+++ also used when retransmitting database descrip-
+++ tion and link-state request packets."
+++ DEFVAL { 5 }
+++ ::= { ospfIfEntry 8 }
+++
+++
+++ ospfIfHelloInterval OBJECT-TYPE
+++ SYNTAX HelloRange
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The length of time, in seconds, between the
+++ Hello packets that the router sends on the in-
+++ terface. This value must be the same for all
+++ routers attached to a common network."
+++ DEFVAL { 10 }
+++ ::= { ospfIfEntry 9 }
+++
+++
+++ ospfIfRtrDeadInterval OBJECT-TYPE
+++ SYNTAX PositiveInteger
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The number of seconds that a router's Hello
+++ packets have not been seen before it's neigh-
+++ bors declare the router down. This should be
+++ some multiple of the Hello interval. This
+++ value must be the same for all routers attached
+++ to a common network."
+++ DEFVAL { 40 }
+++ ::= { ospfIfEntry 10 }
+++
+++
+++ ospfIfPollInterval OBJECT-TYPE
+++ SYNTAX PositiveInteger
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The larger time interval, in seconds, between
+++ the Hello packets sent to an inactive non-
+++ broadcast multi- access neighbor."
+++ DEFVAL { 120 }
+++ ::= { ospfIfEntry 11 }
+++
+++
+++ ospfIfState OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ down (1),
+++ loopback (2),
+++ waiting (3),
+++ pointToPoint (4),
+++ designatedRouter (5),
+++ backupDesignatedRouter (6),
+++ otherDesignatedRouter (7)
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The OSPF Interface State."
+++ DEFVAL { down }
+++ ::= { ospfIfEntry 12 }
+++
+++
+++ ospfIfDesignatedRouter OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP Address of the Designated Router."
+++ DEFVAL { '00000000'H } -- 0.0.0.0
+++ ::= { ospfIfEntry 13 }
+++
+++
+++ ospfIfBackupDesignatedRouter OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP Address of the Backup Designated
+++ Router."
+++ DEFVAL { '00000000'H } -- 0.0.0.0
+++ ::= { ospfIfEntry 14 }
+++
+++ ospfIfEvents OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of times this OSPF interface has
+++ changed its state, or an error has occurred."
+++ ::= { ospfIfEntry 15 }
+++
+++
+++ ospfIfAuthKey OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE (0..256))
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The Authentication Key. If the Area's Author-
+++ ization Type is simplePassword, and the key
+++ length is shorter than 8 octets, the agent will
+++ left adjust and zero fill to 8 octets.
+++
+++ Note that unauthenticated interfaces need no
+++ authentication key, and simple password authen-
+++ tication cannot use a key of more than 8 oc-
+++ tets. Larger keys are useful only with authen-
+++ tication mechanisms not specified in this docu-
+++ ment.
+++
+++ When read, ospfIfAuthKey always returns an Oc-
+++ tet String of length zero."
+++ REFERENCE
+++ "OSPF Version 2, Section 9 The Interface Data
+++ Structure"
+++ DEFVAL { '0000000000000000'H } -- 0.0.0.0.0.0.0.0
+++ ::= { ospfIfEntry 16 }
+++
+++ ospfIfStatus OBJECT-TYPE
+++ SYNTAX RowStatus
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "This variable displays the status of the en-
+++ try. Setting it to 'invalid' has the effect of
+++ rendering it inoperative. The internal effect
+++ (row removal) is implementation dependent."
+++ ::= { ospfIfEntry 17 }
+++
+++
+++ ospfIfMulticastForwarding OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ blocked (1), -- no multicast forwarding
+++ multicast (2), -- using multicast address
+++ unicast (3) -- to each OSPF neighbor
+++ }
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The way multicasts should forwarded on this
+++ interface; not forwarded, forwarded as data
+++ link multicasts, or forwarded as data link uni-
+++ casts. Data link multicasting is not meaning-
+++ ful on point to point and NBMA interfaces, and
+++ setting ospfMulticastForwarding to 0 effective-
+++ ly disables all multicast forwarding."
+++ DEFVAL { blocked }
+++ ::= { ospfIfEntry 18 }
+++
+++
+++ ospfIfDemand OBJECT-TYPE
+++ SYNTAX TruthValue
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "Indicates whether Demand OSPF procedures (hel-
+++ lo supression to FULL neighbors and setting the
+++ DoNotAge flag on proogated LSAs) should be per-
+++ formed on this interface."
+++ DEFVAL { false }
+++ ::= { ospfIfEntry 19 }
+++
+++
+++ ospfIfAuthType OBJECT-TYPE
+++ SYNTAX INTEGER (0..255)
+++ -- none (0),
+++ -- simplePassword (1)
+++ -- md5 (2)
+++ -- reserved for specification by IANA (> 2)
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The authentication type specified for an in-
+++ terface. Additional authentication types may
+++ be assigned locally."
+++ REFERENCE
+++ "OSPF Version 2, Appendix E Authentication"
+++ DEFVAL { 0 } -- no authentication, by default
+++ ::= { ospfIfEntry 20 }
+++
+++
+++-- OSPF Interface Metric Table
+++
+++-- The Metric Table describes the metrics to be advertised
+++-- for a specified interface at the various types of service.
+++-- As such, this table is an adjunct of the OSPF Interface
+++-- Table.
+++
+++-- Types of service, as defined by RFC 791, have the ability
+++-- to request low delay, high bandwidth, or reliable linkage.
+++
+++-- For the purposes of this specification, the measure of
+++-- bandwidth
+++
+++-- Metric = 10^8 / ifSpeed
+++
+++-- is the default value. For multiple link interfaces, note
+++-- that ifSpeed is the sum of the individual link speeds.
+++-- This yields a number having the following typical values:
+++
+++-- Network Type/bit rate Metric
+++
+++-- >= 100 MBPS 1
+++-- Ethernet/802.3 10
+++-- E1 48
+++-- T1 (ESF) 65
+++-- 64 KBPS 1562
+++-- 56 KBPS 1785
+++-- 19.2 KBPS 5208
+++-- 9.6 KBPS 10416
+++
+++-- Routes that are not specified use the default (TOS 0) metric
+++
+++ ospfIfMetricTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfIfMetricEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "The TOS metrics for a non-virtual interface
+++ identified by the interface index."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.3 Router interface
+++ parameters"
+++ ::= { ospf 8 }
+++
+++ ospfIfMetricEntry OBJECT-TYPE
+++ SYNTAX OspfIfMetricEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A particular TOS metric for a non-virtual in-
+++ terface identified by the interface index."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.3 Router interface
+++ parameters"
+++ INDEX { ospfIfMetricIpAddress,
+++ ospfIfMetricAddressLessIf,
+++ ospfIfMetricTOS }
+++ ::= { ospfIfMetricTable 1 }
+++
+++OspfIfMetricEntry ::=
+++ SEQUENCE {
+++ ospfIfMetricIpAddress
+++ IpAddress,
+++ ospfIfMetricAddressLessIf
+++ Integer32,
+++ ospfIfMetricTOS
+++ TOSType,
+++ ospfIfMetricValue
+++ Metric,
+++ ospfIfMetricStatus
+++ RowStatus
+++ }
+++
+++ ospfIfMetricIpAddress OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP address of this OSPF interface. On row
+++ creation, this can be derived from the in-
+++ stance."
+++ ::= { ospfIfMetricEntry 1 }
+++
+++ ospfIfMetricAddressLessIf OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "For the purpose of easing the instancing of
+++ addressed and addressless interfaces; This
+++ variable takes the value 0 on interfaces with
+++ IP Addresses, and the value of ifIndex for in-
+++ terfaces having no IP Address. On row crea-
+++ tion, this can be derived from the instance."
+++ ::= { ospfIfMetricEntry 2 }
+++
+++
+++ ospfIfMetricTOS OBJECT-TYPE
+++ SYNTAX TOSType
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The type of service metric being referenced.
+++ On row creation, this can be derived from the
+++ instance."
+++ ::= { ospfIfMetricEntry 3 }
+++
+++
+++ ospfIfMetricValue OBJECT-TYPE
+++ SYNTAX Metric
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The metric of using this type of service on
+++ this interface. The default value of the TOS 0
+++ Metric is 10^8 / ifSpeed."
+++ ::= { ospfIfMetricEntry 4 }
+++
+++ ospfIfMetricStatus OBJECT-TYPE
+++ SYNTAX RowStatus
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "This variable displays the status of the en-
+++ try. Setting it to 'invalid' has the effect of
+++ rendering it inoperative. The internal effect
+++ (row removal) is implementation dependent."
+++ ::= { ospfIfMetricEntry 5 }
+++
+++
+++-- OSPF Virtual Interface Table
+++
+++-- The Virtual Interface Table describes the virtual
+++-- links that the OSPF Process is configured to
+++-- carry on.
+++
+++ ospfVirtIfTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfVirtIfEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "Information about this router's virtual inter-
+++ faces."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.4 Virtual link
+++ parameters"
+++ ::= { ospf 9 }
+++
+++
+++ ospfVirtIfEntry OBJECT-TYPE
+++ SYNTAX OspfVirtIfEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "Information about a single Virtual Interface."
+++ INDEX { ospfVirtIfAreaId, ospfVirtIfNeighbor }
+++ ::= { ospfVirtIfTable 1 }
+++
+++OspfVirtIfEntry ::=
+++ SEQUENCE {
+++ ospfVirtIfAreaId
+++ AreaID,
+++ ospfVirtIfNeighbor
+++ RouterID,
+++ ospfVirtIfTransitDelay
+++ UpToMaxAge,
+++ ospfVirtIfRetransInterval
+++ UpToMaxAge,
+++ ospfVirtIfHelloInterval
+++ HelloRange,
+++ ospfVirtIfRtrDeadInterval
+++ PositiveInteger,
+++ ospfVirtIfState
+++ INTEGER,
+++ ospfVirtIfEvents
+++ Counter32,
+++ ospfVirtIfAuthType
+++ INTEGER,
+++ ospfVirtIfAuthKey
+++ OCTET STRING,
+++ ospfVirtIfStatus
+++ RowStatus
+++ }
+++
+++ ospfVirtIfAreaId OBJECT-TYPE
+++ SYNTAX AreaID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The Transit Area that the Virtual Link
+++ traverses. By definition, this is not 0.0.0.0"
+++ ::= { ospfVirtIfEntry 1 }
+++
+++
+++ ospfVirtIfNeighbor OBJECT-TYPE
+++ SYNTAX RouterID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The Router ID of the Virtual Neighbor."
+++ ::= { ospfVirtIfEntry 2 }
+++
+++
+++ ospfVirtIfTransitDelay OBJECT-TYPE
+++ SYNTAX UpToMaxAge
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The estimated number of seconds it takes to
+++ transmit a link- state update packet over this
+++ interface."
+++ DEFVAL { 1 }
+++ ::= { ospfVirtIfEntry 3 }
+++
+++
+++ ospfVirtIfRetransInterval OBJECT-TYPE
+++ SYNTAX UpToMaxAge
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The number of seconds between link-state ad-
+++ vertisement retransmissions, for adjacencies
+++ belonging to this interface. This value is
+++ also used when retransmitting database descrip-
+++ tion and link-state request packets. This
+++ value should be well over the expected round-
+++ trip time."
+++ DEFVAL { 5 }
+++ ::= { ospfVirtIfEntry 4 }
+++
+++
+++ ospfVirtIfHelloInterval OBJECT-TYPE
+++ SYNTAX HelloRange
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The length of time, in seconds, between the
+++ Hello packets that the router sends on the in-
+++ terface. This value must be the same for the
+++ virtual neighbor."
+++ DEFVAL { 10 }
+++ ::= { ospfVirtIfEntry 5 }
+++
+++
+++ ospfVirtIfRtrDeadInterval OBJECT-TYPE
+++ SYNTAX PositiveInteger
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The number of seconds that a router's Hello
+++ packets have not been seen before it's neigh-
+++ bors declare the router down. This should be
+++ some multiple of the Hello interval. This
+++ value must be the same for the virtual neigh-
+++ bor."
+++ DEFVAL { 60 }
+++ ::= { ospfVirtIfEntry 6 }
+++
+++
+++ ospfVirtIfState OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ down (1), -- these use the same encoding
+++ pointToPoint (4) -- as the ospfIfTable
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "OSPF virtual interface states."
+++ DEFVAL { down }
+++ ::= { ospfVirtIfEntry 7 }
+++
+++
+++ ospfVirtIfEvents OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of state changes or error events on
+++ this Virtual Link"
+++ ::= { ospfVirtIfEntry 8 }
+++
+++
+++ ospfVirtIfAuthKey OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE(0..256))
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "If Authentication Type is simplePassword, the
+++ device will left adjust and zero fill to 8 oc-
+++ tets.
+++
+++ Note that unauthenticated interfaces need no
+++ authentication key, and simple password authen-
+++ tication cannot use a key of more than 8 oc-
+++ tets. Larger keys are useful only with authen-
+++ tication mechanisms not specified in this docu-
+++ ment.
+++
+++ When read, ospfVifAuthKey always returns a
+++ string of length zero."
+++ REFERENCE
+++ "OSPF Version 2, Section 9 The Interface Data
+++ Structure"
+++ DEFVAL { '0000000000000000'H } -- 0.0.0.0.0.0.0.0
+++ ::= { ospfVirtIfEntry 9 }
+++
+++
+++ ospfVirtIfStatus OBJECT-TYPE
+++ SYNTAX RowStatus
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "This variable displays the status of the en-
+++ try. Setting it to 'invalid' has the effect of
+++ rendering it inoperative. The internal effect
+++ (row removal) is implementation dependent."
+++ ::= { ospfVirtIfEntry 10 }
+++
+++
+++ ospfVirtIfAuthType OBJECT-TYPE
+++ SYNTAX INTEGER (0..255)
+++ -- none (0),
+++ -- simplePassword (1)
+++ -- md5 (2)
+++ -- reserved for specification by IANA (> 2)
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The authentication type specified for a virtu-
+++ al interface. Additional authentication types
+++ may be assigned locally."
+++ REFERENCE
+++ "OSPF Version 2, Appendix E Authentication"
+++ DEFVAL { 0 } -- no authentication, by default
+++ ::= { ospfVirtIfEntry 11 }
+++
+++
+++-- OSPF Neighbor Table
+++
+++-- The OSPF Neighbor Table describes all neighbors in
+++-- the locality of the subject router.
+++
+++ ospfNbrTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfNbrEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A table of non-virtual neighbor information."
+++ REFERENCE
+++ "OSPF Version 2, Section 10 The Neighbor Data
+++ Structure"
+++ ::= { ospf 10 }
+++
+++
+++ ospfNbrEntry OBJECT-TYPE
+++ SYNTAX OspfNbrEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "The information regarding a single neighbor."
+++ REFERENCE
+++ "OSPF Version 2, Section 10 The Neighbor Data
+++ Structure"
+++ INDEX { ospfNbrIpAddr, ospfNbrAddressLessIndex }
+++ ::= { ospfNbrTable 1 }
+++
+++OspfNbrEntry ::=
+++ SEQUENCE {
+++ ospfNbrIpAddr
+++ IpAddress,
+++ ospfNbrAddressLessIndex
+++ InterfaceIndex,
+++ ospfNbrRtrId
+++ RouterID,
+++ ospfNbrOptions
+++ Integer32,
+++ ospfNbrPriority
+++ DesignatedRouterPriority,
+++ ospfNbrState
+++ INTEGER,
+++ ospfNbrEvents
+++ Counter32,
+++ ospfNbrLsRetransQLen
+++ Gauge32,
+++ ospfNbmaNbrStatus
+++ RowStatus,
+++ ospfNbmaNbrPermanence
+++ INTEGER,
+++ ospfNbrHelloSuppressed
+++ TruthValue
+++ }
+++
+++ ospfNbrIpAddr OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP address this neighbor is using in its
+++ IP Source Address. Note that, on addressless
+++ links, this will not be 0.0.0.0, but the ad-
+++ dress of another of the neighbor's interfaces."
+++ ::= { ospfNbrEntry 1 }
+++
+++
+++ ospfNbrAddressLessIndex OBJECT-TYPE
+++ SYNTAX InterfaceIndex
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "On an interface having an IP Address, zero.
+++ On addressless interfaces, the corresponding
+++ value of ifIndex in the Internet Standard MIB.
+++ On row creation, this can be derived from the
+++ instance."
+++ ::= { ospfNbrEntry 2 }
+++
+++
+++ ospfNbrRtrId OBJECT-TYPE
+++ SYNTAX RouterID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "A 32-bit integer (represented as a type IpAd-
+++ dress) uniquely identifying the neighboring
+++ router in the Autonomous System."
+++ DEFVAL { '00000000'H } -- 0.0.0.0
+++ ::= { ospfNbrEntry 3 }
+++
+++
+++ ospfNbrOptions OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "A Bit Mask corresponding to the neighbor's op-
+++ tions field.
+++
+++ Bit 0, if set, indicates that the system will
+++ operate on Type of Service metrics other than
+++ TOS 0. If zero, the neighbor will ignore all
+++ metrics except the TOS 0 metric.
+++
+++ Bit 1, if set, indicates that the associated
+++ area accepts and operates on external informa-
+++ tion; if zero, it is a stub area.
+++
+++ Bit 2, if set, indicates that the system is ca-
+++ pable of routing IP Multicast datagrams; i.e.,
+++ that it implements the Multicast Extensions to
+++ OSPF.
+++
+++ Bit 3, if set, indicates that the associated
+++ area is an NSSA. These areas are capable of
+++ carrying type 7 external advertisements, which
+++ are translated into type 5 external advertise-
+++ ments at NSSA borders."
+++ REFERENCE
+++ "OSPF Version 2, Section 12.1.2 Options"
+++ DEFVAL { 0 }
+++ ::= { ospfNbrEntry 4 }
+++
+++
+++ ospfNbrPriority OBJECT-TYPE
+++ SYNTAX DesignatedRouterPriority
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The priority of this neighbor in the designat-
+++ ed router election algorithm. The value 0 sig-
+++ nifies that the neighbor is not eligible to be-
+++ come the designated router on this particular
+++ network."
+++ DEFVAL { 1 }
+++ ::= { ospfNbrEntry 5 }
+++
+++
+++ ospfNbrState OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ down (1),
+++ attempt (2),
+++ init (3),
+++ twoWay (4),
+++ exchangeStart (5),
+++ exchange (6),
+++ loading (7),
+++ full (8)
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The State of the relationship with this Neigh-
+++ bor."
+++ REFERENCE
+++ "OSPF Version 2, Section 10.1 Neighbor States"
+++ DEFVAL { down }
+++ ::= { ospfNbrEntry 6 }
+++
+++
+++ ospfNbrEvents OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of times this neighbor relationship
+++ has changed state, or an error has occurred."
+++ ::= { ospfNbrEntry 7 }
+++
+++
+++ ospfNbrLsRetransQLen OBJECT-TYPE
+++ SYNTAX Gauge32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The current length of the retransmission
+++ queue."
+++ ::= { ospfNbrEntry 8 }
+++
+++
+++ ospfNbmaNbrStatus OBJECT-TYPE
+++ SYNTAX RowStatus
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "This variable displays the status of the en-
+++ try. Setting it to 'invalid' has the effect of
+++ rendering it inoperative. The internal effect
+++ (row removal) is implementation dependent."
+++ ::= { ospfNbrEntry 9 }
+++
+++
+++ ospfNbmaNbrPermanence OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ dynamic (1), -- learned through protocol
+++ permanent (2) -- configured address
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "This variable displays the status of the en-
+++ try. 'dynamic' and 'permanent' refer to how
+++ the neighbor became known."
+++ DEFVAL { permanent }
+++ ::= { ospfNbrEntry 10 }
+++
+++
+++ ospfNbrHelloSuppressed OBJECT-TYPE
+++ SYNTAX TruthValue
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "Indicates whether Hellos are being suppressed
+++ to the neighbor"
+++ ::= { ospfNbrEntry 11 }
+++
+++
+++-- OSPF Virtual Neighbor Table
+++
+++-- This table describes all virtual neighbors.
+++-- Since Virtual Links are configured in the
+++-- virtual interface table, this table is read-only.
+++
+++ ospfVirtNbrTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfVirtNbrEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A table of virtual neighbor information."
+++ REFERENCE
+++ "OSPF Version 2, Section 15 Virtual Links"
+++ ::= { ospf 11 }
+++
+++
+++ ospfVirtNbrEntry OBJECT-TYPE
+++ SYNTAX OspfVirtNbrEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "Virtual neighbor information."
+++ INDEX { ospfVirtNbrArea, ospfVirtNbrRtrId }
+++ ::= { ospfVirtNbrTable 1 }
+++
+++OspfVirtNbrEntry ::=
+++ SEQUENCE {
+++ ospfVirtNbrArea
+++ AreaID,
+++ ospfVirtNbrRtrId
+++ RouterID,
+++ ospfVirtNbrIpAddr
+++ IpAddress,
+++ ospfVirtNbrOptions
+++ Integer32,
+++ ospfVirtNbrState
+++ INTEGER,
+++ ospfVirtNbrEvents
+++ Counter32,
+++ ospfVirtNbrLsRetransQLen
+++ Gauge32,
+++ ospfVirtNbrHelloSuppressed
+++ TruthValue
+++ }
+++
+++ ospfVirtNbrArea OBJECT-TYPE
+++ SYNTAX AreaID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The Transit Area Identifier."
+++ ::= { ospfVirtNbrEntry 1 }
+++
+++
+++ ospfVirtNbrRtrId OBJECT-TYPE
+++ SYNTAX RouterID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "A 32-bit integer uniquely identifying the
+++ neighboring router in the Autonomous System."
+++ ::= { ospfVirtNbrEntry 2 }
+++
+++
+++ ospfVirtNbrIpAddr OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP address this Virtual Neighbor is us-
+++ ing."
+++ ::= { ospfVirtNbrEntry 3 }
+++
+++
+++ ospfVirtNbrOptions OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "A Bit Mask corresponding to the neighbor's op-
+++ tions field.
+++
+++ Bit 1, if set, indicates that the system will
+++ operate on Type of Service metrics other than
+++ TOS 0. If zero, the neighbor will ignore all
+++ metrics except the TOS 0 metric.
+++
+++ Bit 2, if set, indicates that the system is
+++ Network Multicast capable; ie, that it imple-
+++ ments OSPF Multicast Routing."
+++ ::= { ospfVirtNbrEntry 4 }
+++ ospfVirtNbrState OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ down (1),
+++ attempt (2),
+++ init (3),
+++ twoWay (4),
+++ exchangeStart (5),
+++ exchange (6),
+++ loading (7),
+++ full (8)
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The state of the Virtual Neighbor Relation-
+++ ship."
+++ ::= { ospfVirtNbrEntry 5 }
+++
+++
+++ ospfVirtNbrEvents OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of times this virtual link has
+++ changed its state, or an error has occurred."
+++ ::= { ospfVirtNbrEntry 6 }
+++
+++
+++ ospfVirtNbrLsRetransQLen OBJECT-TYPE
+++ SYNTAX Gauge32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The current length of the retransmission
+++ queue."
+++ ::= { ospfVirtNbrEntry 7 }
+++
+++
+++ ospfVirtNbrHelloSuppressed OBJECT-TYPE
+++ SYNTAX TruthValue
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "Indicates whether Hellos are being suppressed
+++ to the neighbor"
+++ ::= { ospfVirtNbrEntry 8 }
+++
+++-- OSPF Link State Database, External
+++
+++-- The Link State Database contains the Link State
+++-- Advertisements from throughout the areas that the
+++-- device is attached to.
+++
+++-- This table is identical to the OSPF LSDB Table in
+++-- format, but contains only External Link State
+++-- Advertisements. The purpose is to allow external
+++-- LSAs to be displayed once for the router rather
+++-- than once in each non-stub area.
+++
+++ ospfExtLsdbTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfExtLsdbEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "The OSPF Process's Links State Database."
+++ REFERENCE
+++ "OSPF Version 2, Section 12 Link State Adver-
+++ tisements"
+++ ::= { ospf 12 }
+++
+++
+++ ospfExtLsdbEntry OBJECT-TYPE
+++ SYNTAX OspfExtLsdbEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A single Link State Advertisement."
+++ INDEX { ospfExtLsdbType, ospfExtLsdbLsid, ospfExtLsdbRouterId }
+++ ::= { ospfExtLsdbTable 1 }
+++
+++OspfExtLsdbEntry ::=
+++ SEQUENCE {
+++ ospfExtLsdbType
+++ INTEGER,
+++ ospfExtLsdbLsid
+++ IpAddress,
+++ ospfExtLsdbRouterId
+++ RouterID,
+++ ospfExtLsdbSequence
+++ Integer32,
+++ ospfExtLsdbAge
+++ Integer32,
+++ ospfExtLsdbChecksum
+++ Integer32,
+++ ospfExtLsdbAdvertisement
+++ OCTET STRING
+++ }
+++
+++ ospfExtLsdbType OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ asExternalLink (5)
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The type of the link state advertisement.
+++ Each link state type has a separate advertise-
+++ ment format."
+++ REFERENCE
+++ "OSPF Version 2, Appendix A.4.1 The Link State
+++ Advertisement header"
+++ ::= { ospfExtLsdbEntry 1 }
+++
+++
+++ ospfExtLsdbLsid OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The Link State ID is an LS Type Specific field
+++ containing either a Router ID or an IP Address;
+++ it identifies the piece of the routing domain
+++ that is being described by the advertisement."
+++ REFERENCE
+++ "OSPF Version 2, Section 12.1.4 Link State ID"
+++ ::= { ospfExtLsdbEntry 2 }
+++
+++
+++ ospfExtLsdbRouterId OBJECT-TYPE
+++ SYNTAX RouterID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The 32 bit number that uniquely identifies the
+++ originating router in the Autonomous System."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.1 Global parameters"
+++ ::= { ospfExtLsdbEntry 3 }
+++
+++-- Note that the OSPF Sequence Number is a 32 bit signed
+++-- integer. It starts with the value '80000001'h,
+++-- or -'7FFFFFFF'h, and increments until '7FFFFFFF'h
+++-- Thus, a typical sequence number will be very negative.
+++ ospfExtLsdbSequence OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The sequence number field is a signed 32-bit
+++ integer. It is used to detect old and dupli-
+++ cate link state advertisements. The space of
+++ sequence numbers is linearly ordered. The
+++ larger the sequence number the more recent the
+++ advertisement."
+++ REFERENCE
+++ "OSPF Version 2, Section 12.1.6 LS sequence
+++ number"
+++ ::= { ospfExtLsdbEntry 4 }
+++
+++
+++ ospfExtLsdbAge OBJECT-TYPE
+++ SYNTAX Integer32 -- Should be 0..MaxAge
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "This field is the age of the link state adver-
+++ tisement in seconds."
+++ REFERENCE
+++ "OSPF Version 2, Section 12.1.1 LS age"
+++ ::= { ospfExtLsdbEntry 5 }
+++
+++
+++ ospfExtLsdbChecksum OBJECT-TYPE
+++ SYNTAX Integer32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "This field is the checksum of the complete
+++ contents of the advertisement, excepting the
+++ age field. The age field is excepted so that
+++ an advertisement's age can be incremented
+++ without updating the checksum. The checksum
+++ used is the same that is used for ISO connec-
+++ tionless datagrams; it is commonly referred to
+++ as the Fletcher checksum."
+++ REFERENCE
+++ "OSPF Version 2, Section 12.1.7 LS checksum"
+++ ::= { ospfExtLsdbEntry 6 }
+++
+++
+++ ospfExtLsdbAdvertisement OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE(36))
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The entire Link State Advertisement, including
+++ its header."
+++ REFERENCE
+++ "OSPF Version 2, Section 12 Link State Adver-
+++ tisements"
+++ ::= { ospfExtLsdbEntry 7 }
+++
+++
+++-- OSPF Use of the CIDR Route Table
+++
+++ospfRouteGroup OBJECT IDENTIFIER ::= { ospf 13 }
+++
+++-- The IP Forwarding Table defines a number of objects for use by
+++-- the routing protocol to externalize its information. Most of
+++-- the variables (ipForwardDest, ipForwardMask, ipForwardPolicy,
+++-- ipForwardNextHop, ipForwardIfIndex, ipForwardType,
+++-- ipForwardProto, ipForwardAge, and ipForwardNextHopAS) are
+++-- defined there.
+++
+++-- Those that leave some discretion are defined here.
+++
+++-- ipCidrRouteProto is, of course, ospf (13).
+++
+++-- ipCidrRouteAge is the time since the route was first calculated,
+++-- as opposed to the time since the last SPF run.
+++
+++-- ipCidrRouteInfo is an OBJECT IDENTIFIER for use by the routing
+++-- protocol. The following values shall be found there depending
+++-- on the way the route was calculated.
+++
+++ospfIntraArea OBJECT IDENTIFIER ::= { ospfRouteGroup 1 }
+++ospfInterArea OBJECT IDENTIFIER ::= { ospfRouteGroup 2 }
+++ospfExternalType1 OBJECT IDENTIFIER ::= { ospfRouteGroup 3 }
+++ospfExternalType2 OBJECT IDENTIFIER ::= { ospfRouteGroup 4 }
+++
+++-- ipCidrRouteMetric1 is, by definition, the primary routing
+++-- metric. Therefore, it should be the metric that route
+++-- selection is based on. For intra-area and inter-area routes,
+++-- it is an OSPF metric. For External Type 1 (comparable value)
+++-- routes, it is an OSPF metric plus the External Metric. For
+++-- external Type 2 (non-comparable value) routes, it is the
+++-- external metric.
+++
+++-- ipCidrRouteMetric2 is, by definition, a secondary routing
+++-- metric. Therefore, it should be the metric that breaks a tie
+++-- among routes having equal metric1 values and the same
+++-- calculation rule. For intra-area, inter-area routes, and
+++-- External Type 1 (comparable value) routes, it is unused. For
+++-- external Type 2 (non-comparable value) routes, it is the metric
+++-- to the AS border router.
+++
+++-- ipCidrRouteMetric3, ipCidrRouteMetric4, and ipCidrRouteMetric5 are
+++-- unused.
+++
+++--
+++-- The OSPF Area Aggregate Table
+++--
+++-- This table replaces the OSPF Area Summary Table, being an
+++-- extension of that for CIDR routers.
+++
+++ ospfAreaAggregateTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF OspfAreaAggregateEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A range of IP addresses specified by an IP
+++ address/IP network mask pair. For example,
+++ class B address range of X.X.X.X with a network
+++ mask of 255.255.0.0 includes all IP addresses
+++ from X.X.0.0 to X.X.255.255. Note that if
+++ ranges are configured such that one range sub-
+++ sumes another range (e.g., 10.0.0.0 mask
+++ 255.0.0.0 and 10.1.0.0 mask 255.255.0.0), the
+++ most specific match is the preferred one."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ ::= { ospf 14 }
+++
+++
+++ ospfAreaAggregateEntry OBJECT-TYPE
+++ SYNTAX OspfAreaAggregateEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A range of IP addresses specified by an IP
+++ address/IP network mask pair. For example,
+++ class B address range of X.X.X.X with a network
+++ mask of 255.255.0.0 includes all IP addresses
+++ from X.X.0.0 to X.X.255.255. Note that if
+++ ranges are range configured such that one range
+++ subsumes another range (e.g., 10.0.0.0 mask
+++ 255.0.0.0 and 10.1.0.0 mask 255.255.0.0), the
+++ most specific match is the preferred one."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ INDEX { ospfAreaAggregateAreaID, ospfAreaAggregateLsdbType,
+++ ospfAreaAggregateNet, ospfAreaAggregateMask }
+++ ::= { ospfAreaAggregateTable 1 }
+++
+++
+++OspfAreaAggregateEntry ::=
+++ SEQUENCE {
+++ ospfAreaAggregateAreaID
+++ AreaID,
+++ ospfAreaAggregateLsdbType
+++ INTEGER,
+++ ospfAreaAggregateNet
+++ IpAddress,
+++ ospfAreaAggregateMask
+++ IpAddress,
+++ ospfAreaAggregateStatus
+++ RowStatus,
+++ ospfAreaAggregateEffect
+++ INTEGER
+++ }
+++
+++ ospfAreaAggregateAreaID OBJECT-TYPE
+++ SYNTAX AreaID
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The Area the Address Aggregate is to be found
+++ within."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ ::= { ospfAreaAggregateEntry 1 }
+++
+++
+++ ospfAreaAggregateLsdbType OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ summaryLink (3),
+++ nssaExternalLink (7)
+++ }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The type of the Address Aggregate. This field
+++ specifies the Lsdb type that this Address Ag-
+++ gregate applies to."
+++ REFERENCE
+++ "OSPF Version 2, Appendix A.4.1 The Link State
+++ Advertisement header"
+++ ::= { ospfAreaAggregateEntry 2 }
+++
+++
+++ ospfAreaAggregateNet OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP Address of the Net or Subnet indicated
+++ by the range."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ ::= { ospfAreaAggregateEntry 3 }
+++
+++
+++ ospfAreaAggregateMask OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The Subnet Mask that pertains to the Net or
+++ Subnet."
+++ REFERENCE
+++ "OSPF Version 2, Appendix C.2 Area parameters"
+++ ::= { ospfAreaAggregateEntry 4 }
+++
+++
+++ ospfAreaAggregateStatus OBJECT-TYPE
+++ SYNTAX RowStatus
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "This variable displays the status of the en-
+++ try. Setting it to 'invalid' has the effect of
+++ rendering it inoperative. The internal effect
+++ (row removal) is implementation dependent."
+++ ::= { ospfAreaAggregateEntry 5 }
+++
+++
+++ ospfAreaAggregateEffect OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ advertiseMatching (1),
+++ doNotAdvertiseMatching (2)
+++ }
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "Subnets subsumed by ranges either trigger the
+++ advertisement of the indicated aggregate (ad-
+++ vertiseMatching), or result in the subnet's not
+++ being advertised at all outside the area."
+++ DEFVAL { advertiseMatching }
+++ ::= { ospfAreaAggregateEntry 6 }
+++
+++
+++-- conformance information
+++
+++ospfConformance OBJECT IDENTIFIER ::= { ospf 15 }
+++
+++ospfGroups OBJECT IDENTIFIER ::= { ospfConformance 1 }
+++ospfCompliances OBJECT IDENTIFIER ::= { ospfConformance 2 }
+++
+++-- compliance statements
+++
+++ ospfCompliance MODULE-COMPLIANCE
+++ STATUS current
+++ DESCRIPTION
+++ "The compliance statement "
+++ MODULE -- this module
+++ MANDATORY-GROUPS {
+++ ospfBasicGroup,
+++ ospfAreaGroup,
+++ ospfStubAreaGroup,
+++ ospfIfGroup,
+++ ospfIfMetricGroup,
+++ ospfVirtIfGroup,
+++ ospfNbrGroup,
+++ ospfVirtNbrGroup,
+++ ospfAreaAggregateGroup
+++ }
+++ ::= { ospfCompliances 1 }
+++
+++
+++-- units of conformance
+++
+++ ospfBasicGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfRouterId,
+++ ospfAdminStat,
+++ ospfVersionNumber,
+++ ospfAreaBdrRtrStatus,
+++ ospfASBdrRtrStatus,
+++ ospfExternLsaCount,
+++ ospfExternLsaCksumSum,
+++ ospfTOSSupport,
+++ ospfOriginateNewLsas,
+++ ospfRxNewLsas,
+++ ospfExtLsdbLimit,
+++ ospfMulticastExtensions,
+++ ospfExitOverflowInterval,
+++ ospfDemandExtensions
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems."
+++ ::= { ospfGroups 1 }
+++
+++
+++ ospfAreaGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfAreaId,
+++ ospfImportAsExtern,
+++ ospfSpfRuns,
+++ ospfAreaBdrRtrCount,
+++ ospfAsBdrRtrCount,
+++ ospfAreaLsaCount,
+++ ospfAreaLsaCksumSum,
+++ ospfAreaSummary,
+++ ospfAreaStatus
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems
+++ supporting areas."
+++ ::= { ospfGroups 2 }
+++
+++
+++ ospfStubAreaGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfStubAreaId,
+++ ospfStubTOS,
+++ ospfStubMetric,
+++ ospfStubStatus,
+++ ospfStubMetricType
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems
+++ supporting stub areas."
+++ ::= { ospfGroups 3 }
+++
+++
+++ ospfLsdbGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfLsdbAreaId,
+++ ospfLsdbType,
+++ ospfLsdbLsid,
+++ ospfLsdbRouterId,
+++ ospfLsdbSequence,
+++ ospfLsdbAge,
+++ ospfLsdbChecksum,
+++ ospfLsdbAdvertisement
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems
+++ that display their link state database."
+++ ::= { ospfGroups 4 }
+++
+++
+++ ospfAreaRangeGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfAreaRangeAreaId,
+++ ospfAreaRangeNet,
+++ ospfAreaRangeMask,
+++ ospfAreaRangeStatus,
+++ ospfAreaRangeEffect
+++ }
+++ STATUS obsolete
+++ DESCRIPTION
+++ "These objects are required for non-CIDR OSPF
+++ systems that support multiple areas."
+++ ::= { ospfGroups 5 }
+++
+++
+++ ospfHostGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfHostIpAddress,
+++ ospfHostTOS,
+++ ospfHostMetric,
+++ ospfHostStatus,
+++ ospfHostAreaID
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems
+++ that support attached hosts."
+++ ::= { ospfGroups 6 }
+++
+++
+++ ospfIfGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfIfIpAddress,
+++ ospfAddressLessIf,
+++ ospfIfAreaId,
+++ ospfIfType,
+++ ospfIfAdminStat,
+++ ospfIfRtrPriority,
+++ ospfIfTransitDelay,
+++ ospfIfRetransInterval,
+++ ospfIfHelloInterval,
+++ ospfIfRtrDeadInterval,
+++ ospfIfPollInterval,
+++ ospfIfState,
+++ ospfIfDesignatedRouter,
+++ ospfIfBackupDesignatedRouter,
+++ ospfIfEvents,
+++ ospfIfAuthType,
+++ ospfIfAuthKey,
+++ ospfIfStatus,
+++ ospfIfMulticastForwarding,
+++ ospfIfDemand
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems."
+++ ::= { ospfGroups 7 }
+++
+++
+++ ospfIfMetricGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfIfMetricIpAddress,
+++ ospfIfMetricAddressLessIf,
+++ ospfIfMetricTOS,
+++ ospfIfMetricValue,
+++ ospfIfMetricStatus
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems."
+++ ::= { ospfGroups 8 }
+++
+++
+++ ospfVirtIfGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfVirtIfAreaId,
+++ ospfVirtIfNeighbor,
+++ ospfVirtIfTransitDelay,
+++ ospfVirtIfRetransInterval,
+++ ospfVirtIfHelloInterval,
+++ ospfVirtIfRtrDeadInterval,
+++ ospfVirtIfState,
+++ ospfVirtIfEvents,
+++ ospfVirtIfAuthType,
+++ ospfVirtIfAuthKey,
+++ ospfVirtIfStatus
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems."
+++ ::= { ospfGroups 9 }
+++
+++
+++ ospfNbrGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfNbrIpAddr,
+++ ospfNbrAddressLessIndex,
+++ ospfNbrRtrId,
+++ ospfNbrOptions,
+++ ospfNbrPriority,
+++ ospfNbrState,
+++ ospfNbrEvents,
+++ ospfNbrLsRetransQLen,
+++ ospfNbmaNbrStatus,
+++ ospfNbmaNbrPermanence,
+++ ospfNbrHelloSuppressed
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems."
+++ ::= { ospfGroups 10 }
+++
+++
+++ ospfVirtNbrGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfVirtNbrArea,
+++ ospfVirtNbrRtrId,
+++ ospfVirtNbrIpAddr,
+++ ospfVirtNbrOptions,
+++ ospfVirtNbrState,
+++ ospfVirtNbrEvents,
+++ ospfVirtNbrLsRetransQLen,
+++ ospfVirtNbrHelloSuppressed
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems."
+++ ::= { ospfGroups 11 }
+++
+++
+++ ospfExtLsdbGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfExtLsdbType,
+++ ospfExtLsdbLsid,
+++ ospfExtLsdbRouterId,
+++ ospfExtLsdbSequence,
+++ ospfExtLsdbAge,
+++ ospfExtLsdbChecksum,
+++ ospfExtLsdbAdvertisement
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems
+++ that display their link state database."
+++ ::= { ospfGroups 12 }
+++
+++
+++ ospfAreaAggregateGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfAreaAggregateAreaID,
+++ ospfAreaAggregateLsdbType,
+++ ospfAreaAggregateNet,
+++ ospfAreaAggregateMask,
+++ ospfAreaAggregateStatus,
+++ ospfAreaAggregateEffect
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required for OSPF systems."
+++ ::= { ospfGroups 13 }
+++
+++END
++--- /dev/null
+++++ b/mibs/OSPF-TRAP-MIB.txt
++@@ -0,0 +1,443 @@
+++OSPF-TRAP-MIB DEFINITIONS ::= BEGIN
+++
+++ IMPORTS
+++ MODULE-IDENTITY, OBJECT-TYPE, NOTIFICATION-TYPE, IpAddress
+++ FROM SNMPv2-SMI
+++ MODULE-COMPLIANCE, OBJECT-GROUP
+++ FROM SNMPv2-CONF
+++ ospfRouterId, ospfIfIpAddress, ospfAddressLessIf, ospfIfState,
+++ ospfVirtIfAreaId, ospfVirtIfNeighbor, ospfVirtIfState,
+++ ospfNbrIpAddr, ospfNbrAddressLessIndex, ospfNbrRtrId,
+++ ospfNbrState, ospfVirtNbrArea, ospfVirtNbrRtrId, ospfVirtNbrState,
+++ ospfLsdbType, ospfLsdbLsid, ospfLsdbRouterId, ospfLsdbAreaId,
+++ ospfExtLsdbLimit, ospf
+++ FROM OSPF-MIB;
+++
+++ ospfTrap MODULE-IDENTITY
+++ LAST-UPDATED "9501201225Z" -- Fri Jan 20 12:25:50 PST 1995
+++ ORGANIZATION "IETF OSPF Working Group"
+++ CONTACT-INFO
+++ " Fred Baker
+++ Postal: Cisco Systems
+++ 519 Lado Drive
+++ Santa Barbara, California 93111
+++ Tel: +1 805 681 0115
+++ E-Mail: fred@cisco.com
+++
+++ Rob Coltun
+++ Postal: RainbowBridge Communications
+++ Tel: (301) 340-9416
+++ E-Mail: rcoltun@rainbow-bridge.com"
+++ DESCRIPTION
+++ "The MIB module to describe traps for the OSPF
+++ Version 2 Protocol."
+++ ::= { ospf 16 }
+++
+++-- Trap Support Objects
+++
+++-- The following are support objects for the OSPF traps.
+++
+++ospfTrapControl OBJECT IDENTIFIER ::= { ospfTrap 1 }
+++ospfTraps OBJECT IDENTIFIER ::= { ospfTrap 2 }
+++
+++ ospfSetTrap OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE(4))
+++ MAX-ACCESS read-write
+++ STATUS current
+++ DESCRIPTION
+++ "A four-octet string serving as a bit map for
+++ the trap events defined by the OSPF traps. This
+++ object is used to enable and disable specific
+++ OSPF traps where a 1 in the bit field
+++ represents enabled. The right-most bit (least
+++ significant) represents trap 0."
+++ ::= { ospfTrapControl 1 }
+++
+++
+++ ospfConfigErrorType OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ badVersion (1),
+++ areaMismatch (2),
+++ unknownNbmaNbr (3), -- Router is Dr eligible
+++ unknownVirtualNbr (4),
+++ authTypeMismatch(5),
+++ authFailure (6),
+++ netMaskMismatch (7),
+++ helloIntervalMismatch (8),
+++ deadIntervalMismatch (9),
+++ optionMismatch (10) }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "Potential types of configuration conflicts.
+++ Used by the ospfConfigError and ospfConfigVir-
+++ tError traps."
+++ ::= { ospfTrapControl 2 }
+++
+++
+++ ospfPacketType OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ hello (1),
+++ dbDescript (2),
+++ lsReq (3),
+++ lsUpdate (4),
+++ lsAck (5) }
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "OSPF packet types."
+++ ::= { ospfTrapControl 3 }
+++
+++
+++ ospfPacketSrc OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP address of an inbound packet that can-
+++ not be identified by a neighbor instance."
+++ ::= { ospfTrapControl 4 }
+++
+++
+++-- Traps
+++
+++
+++ ospfIfStateChange NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfIfIpAddress,
+++ ospfAddressLessIf,
+++ ospfIfState -- The new state
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfIfStateChange trap signifies that there
+++ has been a change in the state of a non-virtual
+++ OSPF interface. This trap should be generated
+++ when the interface state regresses (e.g., goes
+++ from Dr to Down) or progresses to a terminal
+++ state (i.e., Point-to-Point, DR Other, Dr, or
+++ Backup)."
+++ ::= { ospfTraps 16 }
+++
+++
+++ ospfVirtIfStateChange NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfVirtIfAreaId,
+++ ospfVirtIfNeighbor,
+++ ospfVirtIfState -- The new state
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfIfStateChange trap signifies that there
+++ has been a change in the state of an OSPF vir-
+++ tual interface.
+++ This trap should be generated when the inter-
+++ face state regresses (e.g., goes from Point-
+++ to-Point to Down) or progresses to a terminal
+++ state (i.e., Point-to-Point)."
+++ ::= { ospfTraps 1 }
+++
+++
+++ ospfNbrStateChange NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfNbrIpAddr,
+++ ospfNbrAddressLessIndex,
+++ ospfNbrRtrId,
+++ ospfNbrState -- The new state
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfNbrStateChange trap signifies that
+++ there has been a change in the state of a non-
+++ virtual OSPF neighbor. This trap should be
+++ generated when the neighbor state regresses
+++ (e.g., goes from Attempt or Full to 1-Way or
+++ Down) or progresses to a terminal state (e.g.,
+++ 2-Way or Full). When an neighbor transitions
+++ from or to Full on non-broadcast multi-access
+++ and broadcast networks, the trap should be gen-
+++ erated by the designated router. A designated
+++ router transitioning to Down will be noted by
+++ ospfIfStateChange."
+++ ::= { ospfTraps 2 }
+++
+++
+++ ospfVirtNbrStateChange NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfVirtNbrArea,
+++ ospfVirtNbrRtrId,
+++ ospfVirtNbrState -- The new state
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfIfStateChange trap signifies that there
+++ has been a change in the state of an OSPF vir-
+++ tual neighbor. This trap should be generated
+++ when the neighbor state regresses (e.g., goes
+++ from Attempt or Full to 1-Way or Down) or
+++ progresses to a terminal state (e.g., Full)."
+++ ::= { ospfTraps 3 }
+++ ospfIfConfigError NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfIfIpAddress,
+++ ospfAddressLessIf,
+++ ospfPacketSrc, -- The source IP address
+++ ospfConfigErrorType, -- Type of error
+++ ospfPacketType
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfIfConfigError trap signifies that a
+++ packet has been received on a non-virtual in-
+++ terface from a router whose configuration
+++ parameters conflict with this router's confi-
+++ guration parameters. Note that the event op-
+++ tionMismatch should cause a trap only if it
+++ prevents an adjacency from forming."
+++ ::= { ospfTraps 4 }
+++
+++
+++ ospfVirtIfConfigError NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfVirtIfAreaId,
+++ ospfVirtIfNeighbor,
+++ ospfConfigErrorType, -- Type of error
+++ ospfPacketType
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfConfigError trap signifies that a pack-
+++ et has been received on a virtual interface
+++ from a router whose configuration parameters
+++ conflict with this router's configuration
+++ parameters. Note that the event optionMismatch
+++ should cause a trap only if it prevents an ad-
+++ jacency from forming."
+++ ::= { ospfTraps 5 }
+++
+++
+++ ospfIfAuthFailure NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfIfIpAddress,
+++ ospfAddressLessIf,
+++ ospfPacketSrc, -- The source IP address
+++ ospfConfigErrorType, -- authTypeMismatch or
+++ -- authFailure
+++ ospfPacketType
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfIfAuthFailure trap signifies that a
+++ packet has been received on a non-virtual in-
+++ terface from a router whose authentication key
+++ or authentication type conflicts with this
+++ router's authentication key or authentication
+++ type."
+++ ::= { ospfTraps 6 }
+++
+++
+++ ospfVirtIfAuthFailure NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfVirtIfAreaId,
+++ ospfVirtIfNeighbor,
+++ ospfConfigErrorType, -- authTypeMismatch or
+++ -- authFailure
+++ ospfPacketType
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfVirtIfAuthFailure trap signifies that a
+++ packet has been received on a virtual interface
+++ from a router whose authentication key or au-
+++ thentication type conflicts with this router's
+++ authentication key or authentication type."
+++ ::= { ospfTraps 7 }
+++
+++
+++ ospfIfRxBadPacket NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfIfIpAddress,
+++ ospfAddressLessIf,
+++ ospfPacketSrc, -- The source IP address
+++ ospfPacketType
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfIfRxBadPacket trap signifies that an
+++ OSPF packet has been received on a non-virtual
+++ interface that cannot be parsed."
+++ ::= { ospfTraps 8 }
+++
+++ ospfVirtIfRxBadPacket NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfVirtIfAreaId,
+++ ospfVirtIfNeighbor,
+++ ospfPacketType
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfRxBadPacket trap signifies that an OSPF
+++ packet has been received on a virtual interface
+++ that cannot be parsed."
+++ ::= { ospfTraps 9 }
+++
+++
+++ ospfTxRetransmit NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfIfIpAddress,
+++ ospfAddressLessIf,
+++ ospfNbrRtrId, -- Destination
+++ ospfPacketType,
+++ ospfLsdbType,
+++ ospfLsdbLsid,
+++ ospfLsdbRouterId
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfTxRetransmit trap signifies than an
+++ OSPF packet has been retransmitted on a non-
+++ virtual interface. All packets that may be re-
+++ transmitted are associated with an LSDB entry.
+++ The LS type, LS ID, and Router ID are used to
+++ identify the LSDB entry."
+++ ::= { ospfTraps 10 }
+++
+++
+++ ospfVirtIfTxRetransmit NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfVirtIfAreaId,
+++ ospfVirtIfNeighbor,
+++ ospfPacketType,
+++ ospfLsdbType,
+++ ospfLsdbLsid,
+++ ospfLsdbRouterId
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfTxRetransmit trap signifies than an
+++ OSPF packet has been retransmitted on a virtual
+++ interface. All packets that may be retransmit-
+++ ted are associated with an LSDB entry. The LS
+++ type, LS ID, and Router ID are used to identify
+++ the LSDB entry."
+++ ::= { ospfTraps 11 }
+++
+++
+++ ospfOriginateLsa NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfLsdbAreaId, -- 0.0.0.0 for AS Externals
+++ ospfLsdbType,
+++ ospfLsdbLsid,
+++ ospfLsdbRouterId
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfOriginateLsa trap signifies that a new
+++ LSA has been originated by this router. This
+++ trap should not be invoked for simple refreshes
+++ of LSAs (which happesn every 30 minutes), but
+++ instead will only be invoked when an LSA is
+++ (re)originated due to a topology change. Addi-
+++ tionally, this trap does not include LSAs that
+++ are being flushed because they have reached
+++ MaxAge."
+++ ::= { ospfTraps 12 }
+++
+++
+++ ospfMaxAgeLsa NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfLsdbAreaId, -- 0.0.0.0 for AS Externals
+++ ospfLsdbType,
+++ ospfLsdbLsid,
+++ ospfLsdbRouterId
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfMaxAgeLsa trap signifies that one of
+++ the LSA in the router's link-state database has
+++ aged to MaxAge."
+++ ::= { ospfTraps 13 }
+++
+++
+++ ospfLsdbOverflow NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfExtLsdbLimit
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfLsdbOverflow trap signifies that the
+++ number of LSAs in the router's link-state data-
+++ base has exceeded ospfExtLsdbLimit."
+++ ::= { ospfTraps 14 }
+++
+++
+++ ospfLsdbApproachingOverflow NOTIFICATION-TYPE
+++ OBJECTS {
+++ ospfRouterId, -- The originator of the trap
+++ ospfExtLsdbLimit
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "An ospfLsdbApproachingOverflow trap signifies
+++ that the number of LSAs in the router's link-
+++ state database has exceeded ninety percent of
+++ ospfExtLsdbLimit."
+++ ::= { ospfTraps 15 }
+++
+++
+++-- conformance information
+++
+++ospfTrapConformance OBJECT IDENTIFIER ::= { ospfTrap 3 }
+++
+++ospfTrapGroups OBJECT IDENTIFIER ::= { ospfTrapConformance 1 }
+++ospfTrapCompliances OBJECT IDENTIFIER ::= { ospfTrapConformance 2 }
+++
+++-- compliance statements
+++
+++ ospfTrapCompliance MODULE-COMPLIANCE
+++ STATUS current
+++ DESCRIPTION
+++ "The compliance statement "
+++ MODULE -- this module
+++ MANDATORY-GROUPS { ospfTrapControlGroup }
+++
+++
+++ GROUP ospfTrapControlGroup
+++ DESCRIPTION
+++ "This group is optional but recommended for all
+++ OSPF systems"
+++ ::= { ospfTrapCompliances 1 }
+++
+++
+++-- units of conformance
+++
+++ ospfTrapControlGroup OBJECT-GROUP
+++ OBJECTS {
+++ ospfSetTrap,
+++ ospfConfigErrorType,
+++ ospfPacketType,
+++ ospfPacketSrc
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "These objects are required to control traps
+++ from OSPF systems."
+++ ::= { ospfTrapGroups 1 }
+++
+++
+++END
++--- /dev/null
+++++ b/mibs/RIPv2-MIB.txt
++@@ -0,0 +1,530 @@
+++ RIPv2-MIB DEFINITIONS ::= BEGIN
+++
+++ IMPORTS
+++ MODULE-IDENTITY, OBJECT-TYPE, Counter32,
+++ TimeTicks, IpAddress FROM SNMPv2-SMI
+++ TEXTUAL-CONVENTION, RowStatus FROM SNMPv2-TC
+++ MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF
+++ mib-2 FROM RFC1213-MIB;
+++
+++ -- This MIB module uses the extended OBJECT-TYPE macro as
+++ -- defined in [9].
+++
+++ rip2 MODULE-IDENTITY
+++ LAST-UPDATED "9407272253Z" -- Wed Jul 27 22:53:04 PDT 1994
+++ ORGANIZATION "IETF RIP-II Working Group"
+++ CONTACT-INFO
+++ " Fred Baker
+++ Postal: Cisco Systems
+++ 519 Lado Drive
+++ Santa Barbara, California 93111
+++ Tel: +1 805 681 0115
+++ E-Mail: fbaker@cisco.com
+++
+++ Postal: Gary Malkin
+++ Xylogics, Inc.
+++ 53 Third Avenue
+++ Burlington, MA 01803
+++
+++ Phone: (617) 272-8140
+++ EMail: gmalkin@Xylogics.COM"
+++ DESCRIPTION
+++ "The MIB module to describe the RIP2 Version 2 Protocol"
+++ ::= { mib-2 23 }
+++
+++ -- RIP-2 Management Information Base
+++
+++ -- the RouteTag type represents the contents of the
+++ -- Route Domain field in the packet header or route entry.
+++ -- The use of the Route Domain is deprecated.
+++
+++ RouteTag ::= TEXTUAL-CONVENTION
+++ STATUS current
+++ DESCRIPTION
+++ "the RouteTag type represents the contents of the Route Domain
+++ field in the packet header or route entry"
+++ SYNTAX OCTET STRING (SIZE (2))
+++
+++--4.1 Global Counters
+++
+++-- The RIP-2 Globals Group.
+++-- Implementation of this group is mandatory for systems
+++-- which implement RIP-2.
+++
+++-- These counters are intended to facilitate debugging quickly
+++-- changing routes or failing neighbors
+++
+++rip2Globals OBJECT IDENTIFIER ::= { rip2 1 }
+++
+++ rip2GlobalRouteChanges OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of route changes made to the IP Route
+++ Database by RIP. This does not include the refresh
+++ of a route's age."
+++ ::= { rip2Globals 1 }
+++
+++ rip2GlobalQueries OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of responses sent to RIP queries
+++ from other systems."
+++ ::= { rip2Globals 2 }
+++
+++--4.2 RIP Interface Tables
+++
+++-- RIP Interfaces Groups
+++-- Implementation of these Groups is mandatory for systems
+++-- which implement RIP-2.
+++
+++-- The RIP Interface Status Table.
+++
+++ rip2IfStatTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF Rip2IfStatEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A list of subnets which require separate
+++ status monitoring in RIP."
+++ ::= { rip2 2 }
+++
+++ rip2IfStatEntry OBJECT-TYPE
+++ SYNTAX Rip2IfStatEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A Single Routing Domain in a single Subnet."
+++ INDEX { rip2IfStatAddress }
+++ ::= { rip2IfStatTable 1 }
+++
+++ Rip2IfStatEntry ::=
+++ SEQUENCE {
+++ rip2IfStatAddress
+++ IpAddress,
+++ rip2IfStatRcvBadPackets
+++ Counter32,
+++ rip2IfStatRcvBadRoutes
+++ Counter32,
+++ rip2IfStatSentUpdates
+++ Counter32,
+++ rip2IfStatStatus
+++ RowStatus
+++ }
+++
+++ rip2IfStatAddress OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP Address of this system on the indicated
+++ subnet. For unnumbered interfaces, the value 0.0.0.N,
+++ where the least significant 24 bits (N) is the ifIndex
+++ for the IP Interface in network byte order."
+++ ::= { rip2IfStatEntry 1 }
+++
+++ rip2IfStatRcvBadPackets OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of RIP response packets received by
+++ the RIP process which were subsequently discarded
+++ for any reason (e.g. a version 0 packet, or an
+++ unknown command type)."
+++ ::= { rip2IfStatEntry 2 }
+++
+++ rip2IfStatRcvBadRoutes OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of routes, in valid RIP packets,
+++ which were ignored for any reason (e.g. unknown
+++ address family, or invalid metric)."
+++ ::= { rip2IfStatEntry 3 }
+++
+++ rip2IfStatSentUpdates OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of triggered RIP updates actually
+++ sent on this interface. This explicitly does
+++ NOT include full updates sent containing new
+++ information."
+++ ::= { rip2IfStatEntry 4 }
+++
+++ rip2IfStatStatus OBJECT-TYPE
+++ SYNTAX RowStatus
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "Writing invalid has the effect of deleting
+++ this interface."
+++ ::= { rip2IfStatEntry 5 }
+++
+++-- The RIP Interface Configuration Table.
+++
+++ rip2IfConfTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF Rip2IfConfEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A list of subnets which require separate
+++ configuration in RIP."
+++ ::= { rip2 3 }
+++
+++ rip2IfConfEntry OBJECT-TYPE
+++ SYNTAX Rip2IfConfEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A Single Routing Domain in a single Subnet."
+++ INDEX { rip2IfConfAddress }
+++ ::= { rip2IfConfTable 1 }
+++
+++ Rip2IfConfEntry ::=
+++ SEQUENCE {
+++ rip2IfConfAddress
+++ IpAddress,
+++ rip2IfConfDomain
+++ RouteTag,
+++ rip2IfConfAuthType
+++ INTEGER,
+++ rip2IfConfAuthKey
+++ OCTET STRING (SIZE(0..16)),
+++ rip2IfConfSend
+++ INTEGER,
+++ rip2IfConfReceive
+++ INTEGER,
+++ rip2IfConfDefaultMetric
+++ INTEGER,
+++ rip2IfConfStatus
+++ RowStatus,
+++ rip2IfConfSrcAddress
+++ IpAddress
+++ }
+++
+++ rip2IfConfAddress OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP Address of this system on the indicated
+++ subnet. For unnumbered interfaces, the value 0.0.0.N,
+++ where the least significant 24 bits (N) is the ifIndex
+++ for the IP Interface in network byte order."
+++ ::= { rip2IfConfEntry 1 }
+++
+++ rip2IfConfDomain OBJECT-TYPE
+++ SYNTAX RouteTag
+++ MAX-ACCESS read-create
+++ STATUS obsolete
+++ DESCRIPTION
+++ "Value inserted into the Routing Domain field
+++ of all RIP packets sent on this interface."
+++ DEFVAL { '0000'h }
+++ ::= { rip2IfConfEntry 2 }
+++
+++ rip2IfConfAuthType OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ noAuthentication (1),
+++ simplePassword (2),
+++ md5 (3)
+++ }
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The type of Authentication used on this
+++ interface."
+++ DEFVAL { noAuthentication }
+++ ::= { rip2IfConfEntry 3 }
+++
+++ rip2IfConfAuthKey OBJECT-TYPE
+++ SYNTAX OCTET STRING (SIZE(0..16))
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The value to be used as the Authentication Key
+++ whenever the corresponding instance of
+++ rip2IfConfAuthType has a value other than
+++ noAuthentication. A modification of the corresponding
+++ instance of rip2IfConfAuthType does not modify
+++ the rip2IfConfAuthKey value. If a string shorter
+++ than 16 octets is supplied, it will be left-
+++ justified and padded to 16 octets, on the right,
+++ with nulls (0x00).
+++
+++ Reading this object always results in an OCTET
+++ STRING of length zero; authentication may not
+++ be bypassed by reading the MIB object."
+++ DEFVAL { ''h }
+++ ::= { rip2IfConfEntry 4 }
+++
+++ rip2IfConfSend OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ doNotSend (1),
+++ ripVersion1 (2),
+++ rip1Compatible (3),
+++ ripVersion2 (4),
+++ ripV1Demand (5),
+++ ripV2Demand (6)
+++ }
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "What the router sends on this interface.
+++ ripVersion1 implies sending RIP updates compliant
+++ with RFC 1058. rip1Compatible implies
+++ broadcasting RIP-2 updates using RFC 1058 route
+++ subsumption rules. ripVersion2 implies
+++ multicasting RIP-2 updates. ripV1Demand indicates
+++ the use of Demand RIP on a WAN interface under RIP
+++ Version 1 rules. ripV2Demand indicates the use of
+++ Demand RIP on a WAN interface under Version 2 rules."
+++ DEFVAL { rip1Compatible }
+++ ::= { rip2IfConfEntry 5 }
+++
+++ rip2IfConfReceive OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ rip1 (1),
+++ rip2 (2),
+++ rip1OrRip2 (3),
+++ doNotRecieve (4)
+++ }
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "This indicates which version of RIP updates
+++ are to be accepted. Note that rip2 and
+++ rip1OrRip2 implies reception of multicast
+++ packets."
+++ DEFVAL { rip1OrRip2 }
+++ ::= { rip2IfConfEntry 6 }
+++
+++ rip2IfConfDefaultMetric OBJECT-TYPE
+++ SYNTAX INTEGER ( 0..15 )
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "This variable indicates the metric that is to
+++ be used for the default route entry in RIP updates
+++ originated on this interface. A value of zero
+++ indicates that no default route should be
+++ originated; in this case, a default route via
+++ another router may be propagated."
+++ ::= { rip2IfConfEntry 7 }
+++
+++ rip2IfConfStatus OBJECT-TYPE
+++ SYNTAX RowStatus
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "Writing invalid has the effect of deleting
+++ this interface."
+++ ::= { rip2IfConfEntry 8 }
+++
+++ rip2IfConfSrcAddress OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-create
+++ STATUS current
+++ DESCRIPTION
+++ "The IP Address this system will use as a source
+++ address on this interface. If it is a numbered
+++ interface, this MUST be the same value as
+++ rip2IfConfAddress. On unnumbered interfaces,
+++ it must be the value of rip2IfConfAddress for
+++ some interface on the system."
+++ ::= { rip2IfConfEntry 9 }
+++
+++--4.3 Peer Table
+++
+++-- Peer Table
+++
+++-- The RIP Peer Group
+++-- Implementation of this Group is Optional
+++
+++-- This group provides information about active peer
+++-- relationships intended to assist in debugging. An
+++-- active peer is a router from which a valid RIP
+++-- updated has been heard in the last 180 seconds.
+++
+++ rip2PeerTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF Rip2PeerEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "A list of RIP Peers."
+++ ::= { rip2 4 }
+++
+++ rip2PeerEntry OBJECT-TYPE
+++ SYNTAX Rip2PeerEntry
+++ MAX-ACCESS not-accessible
+++ STATUS current
+++ DESCRIPTION
+++ "Information regarding a single routing peer."
+++ INDEX { rip2PeerAddress, rip2PeerDomain }
+++ ::= { rip2PeerTable 1 }
+++
+++ Rip2PeerEntry ::=
+++ SEQUENCE {
+++ rip2PeerAddress
+++ IpAddress,
+++ rip2PeerDomain
+++ RouteTag,
+++ rip2PeerLastUpdate
+++ TimeTicks,
+++ rip2PeerVersion
+++ INTEGER,
+++ rip2PeerRcvBadPackets
+++ Counter32,
+++ rip2PeerRcvBadRoutes
+++ Counter32
+++ }
+++
+++ rip2PeerAddress OBJECT-TYPE
+++ SYNTAX IpAddress
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The IP Address that the peer is using as its source
+++ address. Note that on an unnumbered link, this may
+++ not be a member of any subnet on the system."
+++ ::= { rip2PeerEntry 1 }
+++
+++ rip2PeerDomain OBJECT-TYPE
+++ SYNTAX RouteTag
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The value in the Routing Domain field in RIP
+++ packets received from the peer. As domain suuport
+++ is deprecated, this must be zero."
+++ ::= { rip2PeerEntry 2 }
+++
+++ rip2PeerLastUpdate OBJECT-TYPE
+++ SYNTAX TimeTicks
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The value of sysUpTime when the most recent
+++ RIP update was received from this system."
+++ ::= { rip2PeerEntry 3 }
+++
+++ rip2PeerVersion OBJECT-TYPE
+++ SYNTAX INTEGER ( 0..255 )
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The RIP version number in the header of the
+++ last RIP packet received."
+++ ::= { rip2PeerEntry 4 }
+++
+++ rip2PeerRcvBadPackets OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of RIP response packets from this
+++ peer discarded as invalid."
+++ ::= { rip2PeerEntry 5 }
+++
+++
+++ rip2PeerRcvBadRoutes OBJECT-TYPE
+++ SYNTAX Counter32
+++ MAX-ACCESS read-only
+++ STATUS current
+++ DESCRIPTION
+++ "The number of routes from this peer that were
+++ ignored because the entry format was invalid."
+++ ::= { rip2PeerEntry 6 }
+++
+++-- conformance information
+++
+++rip2Conformance OBJECT IDENTIFIER ::= { rip2 5 }
+++
+++rip2Groups OBJECT IDENTIFIER ::= { rip2Conformance 1 }
+++rip2Compliances OBJECT IDENTIFIER ::= { rip2Conformance 2 }
+++
+++-- compliance statements
+++rip2Compliance MODULE-COMPLIANCE
+++ STATUS current
+++ DESCRIPTION
+++ "The compliance statement "
+++ MODULE -- this module
+++ MANDATORY-GROUPS {
+++ rip2GlobalGroup,
+++ rip2IfStatGroup,
+++ rip2IfConfGroup,
+++ rip2PeerGroup
+++ }
+++ GROUP rip2GlobalGroup
+++ DESCRIPTION
+++ "This group defines global controls for RIP-II systems."
+++ GROUP rip2IfStatGroup
+++ DESCRIPTION
+++ "This group defines interface statistics for RIP-II systems."
+++ GROUP rip2IfConfGroup
+++ DESCRIPTION
+++ "This group defines interface configuration for RIP-II systems."
+++ GROUP rip2PeerGroup
+++ DESCRIPTION
+++ "This group defines peer information for RIP-II systems."
+++ ::= { rip2Compliances 1 }
+++
+++-- units of conformance
+++
+++rip2GlobalGroup OBJECT-GROUP
+++ OBJECTS {
+++ rip2GlobalRouteChanges,
+++ rip2GlobalQueries
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "This group defines global controls for RIP-II systems."
+++ ::= { rip2Groups 1 }
+++rip2IfStatGroup OBJECT-GROUP
+++ OBJECTS {
+++ rip2IfStatAddress,
+++ rip2IfStatRcvBadPackets,
+++ rip2IfStatRcvBadRoutes,
+++ rip2IfStatSentUpdates,
+++ rip2IfStatStatus
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "This group defines interface statistics for RIP-II systems."
+++ ::= { rip2Groups 2 }
+++rip2IfConfGroup OBJECT-GROUP
+++ OBJECTS {
+++ rip2IfConfAddress,
+++ rip2IfConfAuthType,
+++ rip2IfConfAuthKey,
+++ rip2IfConfSend,
+++ rip2IfConfReceive,
+++ rip2IfConfDefaultMetric,
+++ rip2IfConfStatus,
+++ rip2IfConfSrcAddress
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "This group defines interface configuration for RIP-II systems."
+++ ::= { rip2Groups 3 }
+++rip2PeerGroup OBJECT-GROUP
+++ OBJECTS {
+++ rip2PeerAddress,
+++ rip2PeerDomain,
+++ rip2PeerLastUpdate,
+++ rip2PeerVersion,
+++ rip2PeerRcvBadPackets,
+++ rip2PeerRcvBadRoutes
+++ }
+++ STATUS current
+++ DESCRIPTION
+++ "This group defines peer information for RIP-II systems."
+++ ::= { rip2Groups 4 }
+++END
++--- /dev/null
+++++ b/mibs/SOURCE-ROUTING-MIB.txt
++@@ -0,0 +1,452 @@
+++SOURCE-ROUTING-MIB DEFINITIONS ::= BEGIN
+++
+++IMPORTS
+++ Counter, Gauge
+++ FROM RFC1155-SMI
+++ dot1dBridge, dot1dSr
+++ FROM BRIDGE-MIB
+++ OBJECT-TYPE
+++ FROM RFC-1212;
+++
+++-- groups in the SR MIB
+++
+++-- dot1dSr is imported from the Bridge MIB
+++
+++dot1dPortPair OBJECT IDENTIFIER ::= { dot1dBridge 10 }
+++
+++-- the dot1dSr group
+++
+++-- this group is implemented by those bridges that
+++-- support the source route bridging mode, including Source
+++-- Routing and SRT bridges.
+++
+++dot1dSrPortTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF Dot1dSrPortEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A table that contains information about every
+++ port that is associated with this source route
+++ bridge."
+++ ::= { dot1dSr 1 }
+++
+++dot1dSrPortEntry OBJECT-TYPE
+++ SYNTAX Dot1dSrPortEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A list of information for each port of a source
+++ route bridge."
+++ INDEX { dot1dSrPort }
+++
+++ ::= { dot1dSrPortTable 1 }
+++
+++Dot1dSrPortEntry ::=
+++ SEQUENCE {
+++ dot1dSrPort
+++ INTEGER,
+++ dot1dSrPortHopCount
+++ INTEGER,
+++ dot1dSrPortLocalSegment
+++ INTEGER,
+++ dot1dSrPortBridgeNum
+++ INTEGER,
+++ dot1dSrPortTargetSegment
+++ INTEGER,
+++ dot1dSrPortLargestFrame
+++ INTEGER,
+++ dot1dSrPortSTESpanMode
+++ INTEGER,
+++ dot1dSrPortSpecInFrames
+++ Counter,
+++ dot1dSrPortSpecOutFrames
+++ Counter,
+++ dot1dSrPortApeInFrames
+++ Counter,
+++ dot1dSrPortApeOutFrames
+++ Counter,
+++ dot1dSrPortSteInFrames
+++ Counter,
+++ dot1dSrPortSteOutFrames
+++ Counter,
+++ dot1dSrPortSegmentMismatchDiscards
+++ Counter,
+++ dot1dSrPortDuplicateSegmentDiscards
+++ Counter,
+++ dot1dSrPortHopCountExceededDiscards
+++ Counter,
+++ dot1dSrPortDupLanIdOrTreeErrors
+++ Counter,
+++ dot1dSrPortLanIdMismatches
+++ Counter
+++ }
+++
+++dot1dSrPort OBJECT-TYPE
+++ SYNTAX INTEGER (1..65535)
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The port number of the port for which this entry
+++
+++ contains Source Route management information."
+++ ::= { dot1dSrPortEntry 1 }
+++
+++dot1dSrPortHopCount OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The maximum number of routing descriptors allowed
+++ in an All Paths or Spanning Tree Explorer frames."
+++ ::= { dot1dSrPortEntry 2 }
+++
+++dot1dSrPortLocalSegment OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The segment number that uniquely identifies the
+++ segment to which this port is connected. Current
+++ source routing protocols limit this value to the
+++ range: 0 through 4095. (The value 0 is used by
+++ some management applications for special test
+++ cases.) A value of 65535 signifies that no segment
+++ number is assigned to this port."
+++ ::= { dot1dSrPortEntry 3 }
+++
+++dot1dSrPortBridgeNum OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A bridge number uniquely identifies a bridge when
+++ more than one bridge is used to span the same two
+++ segments. Current source routing protocols limit
+++ this value to the range: 0 through 15. A value of
+++ 65535 signifies that no bridge number is assigned
+++ to this bridge."
+++ ::= { dot1dSrPortEntry 4 }
+++
+++dot1dSrPortTargetSegment OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The segment number that corresponds to the target
+++ segment this port is considered to be connected to
+++ by the bridge. Current source routing protocols
+++ limit this value to the range: 0 through 4095.
+++
+++ (The value 0 is used by some management
+++ applications for special test cases.) A value of
+++ 65535 signifies that no target segment is assigned
+++ to this port."
+++ ::= { dot1dSrPortEntry 5 }
+++
+++-- It would be nice if we could use ifMtu as the size of the
+++-- largest frame, but we can't because ifMtu is defined to be
+++-- the size that the (inter-)network layer can use which can
+++-- differ from the MAC layer (especially if several layers of
+++-- encapsulation are used).
+++
+++dot1dSrPortLargestFrame OBJECT-TYPE
+++ SYNTAX INTEGER
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The maximum size of the INFO field (LLC and
+++ above) that this port can send/receive. It does
+++ not include any MAC level (framing) octets. The
+++ value of this object is used by this bridge to
+++ determine whether a modification of the
+++ LargestFrame (LF, see [14]) field of the Routing
+++ Control field of the Routing Information Field is
+++ necessary.
+++
+++ 64 valid values are defined by the IEEE 802.5M SRT
+++ Addendum: 516, 635, 754, 873, 993, 1112, 1231,
+++ 1350, 1470, 1542, 1615, 1688, 1761, 1833, 1906,
+++ 1979, 2052, 2345, 2638, 2932, 3225, 3518, 3812,
+++ 4105, 4399, 4865, 5331, 5798, 6264, 6730, 7197,
+++ 7663, 8130, 8539, 8949, 9358, 9768, 10178, 10587,
+++ 10997, 11407, 12199, 12992, 13785, 14578, 15370,
+++ 16163, 16956, 17749, 20730, 23711, 26693, 29674,
+++ 32655, 35637, 38618, 41600, 44591, 47583, 50575,
+++ 53567, 56559, 59551, and 65535.
+++
+++ An illegal value will not be accepted by the
+++ bridge."
+++ ::= { dot1dSrPortEntry 6 }
+++
+++dot1dSrPortSTESpanMode OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ auto-span(1),
+++ disabled(2),
+++ forced(3)
+++ }
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "Determines how this port behaves when presented
+++ with a Spanning Tree Explorer frame. The value
+++ 'disabled(2)' indicates that the port will not
+++ accept or send Spanning Tree Explorer packets; any
+++ STE packets received will be silently discarded.
+++ The value 'forced(3)' indicates the port will
+++ always accept and propagate Spanning Tree Explorer
+++ frames. This allows a manually configured
+++ Spanning Tree for this class of packet to be
+++ configured. Note that unlike transparent
+++ bridging, this is not catastrophic to the network
+++ if there are loops. The value 'auto-span(1)' can
+++ only be returned by a bridge that both implements
+++ the Spanning Tree Protocol and has use of the
+++ protocol enabled on this port. The behavior of the
+++ port for Spanning Tree Explorer frames is
+++ determined by the state of dot1dStpPortState. If
+++ the port is in the 'forwarding' state, the frame
+++ will be accepted or propagated. Otherwise, it
+++ will be silently discarded."
+++ ::= { dot1dSrPortEntry 7 }
+++
+++dot1dSrPortSpecInFrames OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of Specifically Routed frames, also
+++ referred to as Source Routed Frames, that have
+++ been received from this port's segment."
+++ ::= { dot1dSrPortEntry 8 }
+++
+++dot1dSrPortSpecOutFrames OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of Specifically Routed frames, also
+++ referred to as Source Routed Frames, that this
+++ port has transmitted on its segment."
+++ ::= { dot1dSrPortEntry 9 }
+++
+++dot1dSrPortApeInFrames OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of All Paths Explorer frames, also
+++ referred to as All Routes Explorer frames, that
+++ have been received by this port from its segment."
+++ ::= { dot1dSrPortEntry 10 }
+++
+++dot1dSrPortApeOutFrames OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of all Paths Explorer Frames, also
+++ referred to as All Routes Explorer frames, that
+++ have been transmitted by this port on its
+++ segment."
+++ ::= { dot1dSrPortEntry 11 }
+++
+++dot1dSrPortSteInFrames OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of spanning tree explorer frames that
+++ have been received by this port from its segment."
+++ ::= { dot1dSrPortEntry 12 }
+++
+++dot1dSrPortSteOutFrames OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of spanning tree explorer frames that
+++ have been transmitted by this port on its
+++ segment."
+++ ::= { dot1dSrPortEntry 13 }
+++
+++dot1dSrPortSegmentMismatchDiscards OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of explorer frames that have been
+++ discarded by this port because the routing
+++ descriptor field contained an invalid adjacent
+++ segment value."
+++ ::= { dot1dSrPortEntry 14 }
+++
+++dot1dSrPortDuplicateSegmentDiscards OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of frames that have been discarded by
+++ this port because the routing descriptor field
+++ contained a duplicate segment identifier."
+++ ::= { dot1dSrPortEntry 15 }
+++
+++dot1dSrPortHopCountExceededDiscards OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of explorer frames that have been
+++ discarded by this port because the Routing
+++ Information Field has exceeded the maximum route
+++ descriptor length."
+++ ::= { dot1dSrPortEntry 16 }
+++
+++dot1dSrPortDupLanIdOrTreeErrors OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of duplicate LAN IDs or Tree errors.
+++ This helps in detection of problems in networks
+++ containing older IBM Source Routing Bridges."
+++ ::= { dot1dSrPortEntry 17 }
+++
+++dot1dSrPortLanIdMismatches OBJECT-TYPE
+++ SYNTAX Counter
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The number of ARE and STE frames that were
+++ discarded because the last LAN ID in the routing
+++ information field did not equal the LAN-in ID.
+++ This error can occur in implementations which do
+++ only a LAN-in ID and Bridge Number check instead
+++ of a LAN-in ID, Bridge Number, and LAN-out ID
+++ check before they forward broadcast frames."
+++ ::= { dot1dSrPortEntry 18 }
+++
+++-- scalar object in dot1dSr
+++
+++dot1dSrBridgeLfMode OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ mode3(1),
+++ mode6(2)
+++ }
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "Indicates whether the bridge operates using older
+++ 3 bit length negotiation fields or the newer 6 bit
+++ length field in its RIF."
+++ ::= { dot1dSr 2 }
+++
+++-- The Port-Pair Database
+++
+++-- Implementation of this group is optional.
+++
+++-- This group is implemented by those bridges that support
+++-- the direct multiport model of the source route bridging
+++-- mode as defined in the IEEE 802.5 SRT Addendum to
+++-- 802.1d.
+++
+++-- Bridges implementing this group may report 65535 for
+++-- dot1dSrPortBridgeNumber and dot1dSrPortTargetSegment,
+++-- indicating that those objects are not applicable.
+++
+++dot1dPortPairTableSize OBJECT-TYPE
+++ SYNTAX Gauge
+++ ACCESS read-only
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The total number of entries in the Bridge Port
+++ Pair Database."
+++ ::= { dot1dPortPair 1 }
+++
+++-- the Bridge Port-Pair table
+++
+++-- this table represents port pairs within a bridge forming
+++-- a unique bridge path, as defined in the IEEE 802.5M SRT
+++-- Addendum.
+++
+++dot1dPortPairTable OBJECT-TYPE
+++ SYNTAX SEQUENCE OF Dot1dPortPairEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A table that contains information about every
+++
+++ port pair database entity associated with this
+++ source routing bridge."
+++ ::= { dot1dPortPair 2 }
+++
+++dot1dPortPairEntry OBJECT-TYPE
+++ SYNTAX Dot1dPortPairEntry
+++ ACCESS not-accessible
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A list of information for each port pair entity
+++ of a bridge."
+++ INDEX { dot1dPortPairLowPort, dot1dPortPairHighPort }
+++ ::= { dot1dPortPairTable 1 }
+++
+++Dot1dPortPairEntry ::=
+++ SEQUENCE {
+++ dot1dPortPairLowPort
+++ INTEGER,
+++ dot1dPortPairHighPort
+++ INTEGER,
+++ dot1dPortPairBridgeNum
+++ INTEGER,
+++ dot1dPortPairBridgeState
+++ INTEGER
+++ }
+++
+++dot1dPortPairLowPort OBJECT-TYPE
+++ SYNTAX INTEGER (1..65535)
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The port number of the lower numbered port for
+++ which this entry contains port pair database
+++ information."
+++ ::= { dot1dPortPairEntry 1 }
+++
+++dot1dPortPairHighPort OBJECT-TYPE
+++ SYNTAX INTEGER (1..65535)
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The port number of the higher numbered port for
+++ which this entry contains port pair database
+++ information."
+++ ::= { dot1dPortPairEntry 2 }
+++
+++dot1dPortPairBridgeNum OBJECT-TYPE
+++ SYNTAX INTEGER
+++
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "A bridge number that uniquely identifies the path
+++ provided by this source routing bridge between the
+++ segments connected to dot1dPortPairLowPort and
+++ dot1dPortPairHighPort. The purpose of bridge
+++ number is to disambiguate between multiple paths
+++ connecting the same two LANs."
+++ ::= { dot1dPortPairEntry 3 }
+++
+++dot1dPortPairBridgeState OBJECT-TYPE
+++ SYNTAX INTEGER {
+++ enabled(1),
+++ disabled(2),
+++ invalid(3)
+++ }
+++ ACCESS read-write
+++ STATUS mandatory
+++ DESCRIPTION
+++ "The state of dot1dPortPairBridgeNum. Writing
+++ 'invalid(3)' to this object removes the
+++ corresponding entry."
+++ ::= { dot1dPortPairEntry 4 }
+++
+++END
+diff --git a/feeds/packages/net/net-snmp/patches/160-no_ldconfig.patch b/feeds/packages/net/net-snmp/patches/160-no_ldconfig.patch
+new file mode 100644
+index 0000000..6a28ea0
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/patches/160-no_ldconfig.patch
+@@ -0,0 +1,11 @@
++--- a/configure
+++++ b/configure
++@@ -10216,7 +10216,7 @@ linux* | k*bsd*-gnu)
++ need_version=no
++ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
++ soname_spec='${libname}${release}${shared_ext}$major'
++- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+++ finish_cmds=''
++ shlibpath_var=LD_LIBRARY_PATH
++ shlibpath_overrides_runpath=no
++ # This implies no fast_install, which is unacceptable.
+diff --git a/feeds/packages/net/net-snmp/patches/170-ldflags.patch b/feeds/packages/net/net-snmp/patches/170-ldflags.patch
+new file mode 100644
+index 0000000..fa32544
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/patches/170-ldflags.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile.top
+++++ b/Makefile.top
++@@ -81,7 +81,7 @@ LIBCURRENT = 16
++ LIBAGE = 1
++ LIBREVISION = 3
++
++-LIB_LD_CMD = $(LIBTOOL) --mode=link $(LINKCC) $(CFLAGS) -rpath $(libdir) -version-info $(LIBCURRENT):$(LIBREVISION):$(LIBAGE) -o
+++LIB_LD_CMD = $(LIBTOOL) --mode=link $(LINKCC) $(CFLAGS) -rpath $(libdir) $(LDFLAGS) -version-info $(LIBCURRENT):$(LIBREVISION):$(LIBAGE) -o
++ LIB_EXTENSION = la
++ LIB_VERSION =
++ LIB_LDCONFIG_CMD = $(LIBTOOL) --mode=finish $(libdir)
+diff --git a/feeds/packages/net/net-snmp/patches/750-ieee802dot11.patch b/feeds/packages/net/net-snmp/patches/750-ieee802dot11.patch
+new file mode 100644
+index 0000000..9e0625c
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/patches/750-ieee802dot11.patch
+@@ -0,0 +1,6156 @@
++--- /dev/null
+++++ b/agent/mibgroup/ieee802dot11.c
++@@ -0,0 +1,4915 @@
+++/****************************************************************************
+++* *
+++* File Name: ieee802dot11.c *
+++* Used By: *
+++* *
+++* Operating System: *
+++* Purpose: *
+++* *
+++* Comments: *
+++* *
+++* Author: Larry Simmons *
+++* lsimmons@avantcom.com *
+++* www.avantcom.com *
+++* *
+++* Creation Date: 09/02/03 *
+++* *
+++* Ver Date Inits Modification *
+++* ----- -------- ----- ------------ *
+++* 0.0.1 09/02/03 LRS created *
+++* 0.0.2 09/24/03 LRS wouldn't build after fresh ./configure *
+++****************************************************************************/
+++/****************************************************************************
+++* Includes *
+++****************************************************************************/
+++#include <net-snmp/net-snmp-config.h>
+++#include <net-snmp/net-snmp-includes.h>
+++#include <net-snmp/agent/net-snmp-agent-includes.h>
+++#include "ieee802dot11.h"
+++#include "iwlib.h"
+++
+++/****************************************************************************
+++* Defines *
+++****************************************************************************/
+++#define DISPLAYWIEXT // display wireless ext info
+++#define TABLE_SIZE 1
+++//#define MINLOADFREQ 15 // min reload frequency in seconds
+++#define MINLOADFREQ 5 // min reload frequency in seconds // for testing
+++#define PROC_NET_DEV "/proc/net/dev"
+++#define PROC_NET_WIRELESS "/proc/net/wireless"
+++
+++#ifndef UCHAR
+++ typedef unsigned char UCHAR;
+++#endif
+++
+++/****************************************************************************
+++* Private Functions *
+++****************************************************************************/
+++static void loadTables();
+++static void loadWiExt ( int, char *, struct wireless_info * );
+++static void load80211Structs ( int, char *, struct wireless_info * );
+++static void initStructs();
+++
+++// Wireless Extensions Specific Functions
+++static void loadWiExtTo80211Structs ( int, char *, struct wireless_info * );
+++static void displayWiExt ( struct wireless_info );
+++
+++// Linked List Functions
+++static void addList ( char *, char *, int );
+++static void initLists(); // initialize all the linked lists
+++static void flushLists(); // flush all the linked lists
+++static void flushList ( char * ); // flush a single linked list
+++
+++// Utility Functions
+++static int openSocket ( void );
+++static int mWatt2dbm ( int );
+++static char *htob ( char * );
+++static int hasChanged ( char *, int );
+++
+++/****************************************************************************
+++* Private Variables *
+++****************************************************************************/
+++static unsigned long lastLoad = 0; // ET in secs at last table load
+++
+++static struct avNode *lastNode, *newNode, *np;
+++
+++/****************************************************************************
+++* External Functions *
+++****************************************************************************/
+++
+++/****************************************************************************
+++* ieee802dot11_variables_oid: *
+++* this is the top level oid that we want to register under. This *
+++* is essentially a prefix, with the suffix appearing in the *
+++* variable below. *
+++****************************************************************************/
+++oid ieee802dot11_variables_oid[] = { 1,2,840,10036 };
+++
+++/****************************************************************************
+++* variable7 ieee802dot11_variables: *
+++* this variable defines function callbacks and type return information *
+++* for the ieee802dot11 mib section *
+++****************************************************************************/
+++struct variable7 ieee802dot11_variables[] = {
+++/* magic number , variable type , ro/rw , callback fn , L, oidsuffix */
+++#define DOT11STATIONID 3
+++ { DOT11STATIONID , ASN_OCTET_STR , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,1 } },
+++#define DOT11MEDIUMOCCUPANCYLIMIT 4
+++ { DOT11MEDIUMOCCUPANCYLIMIT, ASN_INTEGER , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,2 } },
+++#define DOT11CFPOLLABLE 5
+++ { DOT11CFPOLLABLE , ASN_INTEGER , RONLY , var_dot11StationConfigTable, 4, { 1,1,1,3 } },
+++#define DOT11CFPPERIOD 6
+++ { DOT11CFPPERIOD , ASN_INTEGER , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,4 } },
+++#define DOT11CFPMAXDURATION 7
+++ { DOT11CFPMAXDURATION , ASN_INTEGER , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,5 } },
+++#define DOT11AUTHENTICATIONRESPONSETIMEOUT 8
+++ { DOT11AUTHENTICATIONRESPONSETIMEOUT, ASN_INTEGER , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,6 } },
+++#define DOT11PRIVACYOPTIONIMPLEMENTED 9
+++ { DOT11PRIVACYOPTIONIMPLEMENTED, ASN_INTEGER , RONLY , var_dot11StationConfigTable, 4, { 1,1,1,7 } },
+++#define DOT11POWERMANAGEMENTMODE 10
+++ { DOT11POWERMANAGEMENTMODE, ASN_INTEGER , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,8 } },
+++#define DOT11DESIREDSSID 11
+++ { DOT11DESIREDSSID , ASN_OCTET_STR , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,9 } },
+++#define DOT11DESIREDBSSTYPE 12
+++ { DOT11DESIREDBSSTYPE , ASN_INTEGER , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,10 } },
+++#define DOT11OPERATIONALRATESET 13
+++ { DOT11OPERATIONALRATESET, ASN_OCTET_STR , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,11 } },
+++#define DOT11BEACONPERIOD 14
+++ { DOT11BEACONPERIOD , ASN_INTEGER , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,12 } },
+++#define DOT11DTIMPERIOD 15
+++ { DOT11DTIMPERIOD , ASN_INTEGER , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,13 } },
+++#define DOT11ASSOCIATIONRESPONSETIMEOUT 16
+++ { DOT11ASSOCIATIONRESPONSETIMEOUT, ASN_INTEGER , RWRITE, var_dot11StationConfigTable, 4, { 1,1,1,14 } },
+++#define DOT11DISASSOCIATEREASON 17
+++ { DOT11DISASSOCIATEREASON, ASN_INTEGER , RONLY , var_dot11StationConfigTable, 4, { 1,1,1,15 } },
+++#define DOT11DISASSOCIATESTATION 18
+++ { DOT11DISASSOCIATESTATION, ASN_OCTET_STR , RONLY , var_dot11StationConfigTable, 4, { 1,1,1,16 } },
+++#define DOT11DEAUTHENTICATEREASON 19
+++ { DOT11DEAUTHENTICATEREASON, ASN_INTEGER , RONLY , var_dot11StationConfigTable, 4, { 1,1,1,17 } },
+++#define DOT11DEAUTHENTICATESTATION 20
+++ { DOT11DEAUTHENTICATESTATION, ASN_OCTET_STR , RONLY , var_dot11StationConfigTable, 4, { 1,1,1,18 } },
+++#define DOT11AUTHENTICATEFAILSTATUS 21
+++ { DOT11AUTHENTICATEFAILSTATUS, ASN_INTEGER , RONLY , var_dot11StationConfigTable, 4, { 1,1,1,19 } },
+++#define DOT11AUTHENTICATEFAILSTATION 22
+++ { DOT11AUTHENTICATEFAILSTATION, ASN_OCTET_STR , RONLY , var_dot11StationConfigTable, 4, { 1,1,1,20 } },
+++
+++#define DOT11AUTHENTICATIONALGORITHM 26
+++ { DOT11AUTHENTICATIONALGORITHM, ASN_INTEGER , RONLY , var_dot11AuthenticationAlgorithmsTable, 4, { 1,2,1,2 } },
+++#define DOT11AUTHENTICATIONALGORITHMSENABLE 27
+++ { DOT11AUTHENTICATIONALGORITHMSENABLE, ASN_INTEGER , RWRITE, var_dot11AuthenticationAlgorithmsTable, 4, { 1,2,1,3 } },
+++
+++#define DOT11WEPDEFAULTKEYVALUE 31
+++ { DOT11WEPDEFAULTKEYVALUE, ASN_OCTET_STR , RWRITE, var_dot11WEPDefaultKeysTable, 4, { 1,3,1,2 } },
+++
+++#define DOT11WEPKEYMAPPINGADDRESS 35
+++ { DOT11WEPKEYMAPPINGADDRESS, ASN_OCTET_STR , RWRITE, var_dot11WEPKeyMappingsTable, 4, { 1,4,1,2 } },
+++#define DOT11WEPKEYMAPPINGWEPON 36
+++ { DOT11WEPKEYMAPPINGWEPON, ASN_INTEGER , RWRITE, var_dot11WEPKeyMappingsTable, 4, { 1,4,1,3 } },
+++#define DOT11WEPKEYMAPPINGVALUE 37
+++ { DOT11WEPKEYMAPPINGVALUE, ASN_OCTET_STR , RWRITE, var_dot11WEPKeyMappingsTable, 4, { 1,4,1,4 } },
+++#define DOT11WEPKEYMAPPINGSTATUS 38
+++ { DOT11WEPKEYMAPPINGSTATUS, ASN_INTEGER , RWRITE, var_dot11WEPKeyMappingsTable, 4, { 1,4,1,5 } },
+++
+++#define DOT11PRIVACYINVOKED 41
+++ { DOT11PRIVACYINVOKED , ASN_INTEGER , RWRITE, var_dot11PrivacyTable, 4, { 1,5,1,1 } },
+++#define DOT11WEPDEFAULTKEYID 42
+++ { DOT11WEPDEFAULTKEYID, ASN_INTEGER , RWRITE, var_dot11PrivacyTable, 4, { 1,5,1,2 } },
+++#define DOT11WEPKEYMAPPINGLENGTH 43
+++ { DOT11WEPKEYMAPPINGLENGTH, ASN_INTEGER , RWRITE, var_dot11PrivacyTable, 4, { 1,5,1,3 } },
+++#define DOT11EXCLUDEUNENCRYPTED 44
+++ { DOT11EXCLUDEUNENCRYPTED, ASN_INTEGER , RWRITE, var_dot11PrivacyTable, 4, { 1,5,1,4 } },
+++#define DOT11WEPICVERRORCOUNT 45
+++ { DOT11WEPICVERRORCOUNT, ASN_COUNTER , RONLY , var_dot11PrivacyTable, 4, { 1,5,1,5 } },
+++#define DOT11WEPEXCLUDEDCOUNT 46
+++ { DOT11WEPEXCLUDEDCOUNT, ASN_COUNTER , RONLY , var_dot11PrivacyTable, 4, { 1,5,1,6 } },
+++
+++#define DOT11MACADDRESS 49
+++ { DOT11MACADDRESS , ASN_OCTET_STR , RONLY , var_dot11OperationTable, 4, { 2,1,1,1 } },
+++#define DOT11RTSTHRESHOLD 50
+++ { DOT11RTSTHRESHOLD , ASN_INTEGER , RWRITE, var_dot11OperationTable, 4, { 2,1,1,2 } },
+++#define DOT11SHORTRETRYLIMIT 51
+++ { DOT11SHORTRETRYLIMIT, ASN_INTEGER , RWRITE, var_dot11OperationTable, 4, { 2,1,1,3 } },
+++#define DOT11LONGRETRYLIMIT 52
+++ { DOT11LONGRETRYLIMIT , ASN_INTEGER , RWRITE, var_dot11OperationTable, 4, { 2,1,1,4 } },
+++#define DOT11FRAGMENTATIONTHRESHOLD 53
+++ { DOT11FRAGMENTATIONTHRESHOLD, ASN_INTEGER , RWRITE, var_dot11OperationTable, 4, { 2,1,1,5 } },
+++#define DOT11MAXTRANSMITMSDULIFETIME 54
+++ { DOT11MAXTRANSMITMSDULIFETIME, ASN_INTEGER , RWRITE, var_dot11OperationTable, 4, { 2,1,1,6 } },
+++#define DOT11MAXRECEIVELIFETIME 55
+++ { DOT11MAXRECEIVELIFETIME, ASN_INTEGER , RWRITE, var_dot11OperationTable, 4, { 2,1,1,7 } },
+++#define DOT11MANUFACTURERID 56
+++ { DOT11MANUFACTURERID , ASN_OCTET_STR , RONLY , var_dot11OperationTable, 4, { 2,1,1,8 } },
+++#define DOT11PRODUCTID 57
+++ { DOT11PRODUCTID , ASN_OCTET_STR , RONLY , var_dot11OperationTable, 4, { 2,1,1,9 } },
+++
+++#define DOT11TRANSMITTEDFRAGMENTCOUNT 60
+++ { DOT11TRANSMITTEDFRAGMENTCOUNT, ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,1 } },
+++#define DOT11MULTICASTTRANSMITTEDFRAMECOUNT 61
+++ { DOT11MULTICASTTRANSMITTEDFRAMECOUNT, ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,2 } },
+++#define DOT11FAILEDCOUNT 62
+++ { DOT11FAILEDCOUNT , ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,3 } },
+++#define DOT11RETRYCOUNT 63
+++ { DOT11RETRYCOUNT , ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,4 } },
+++#define DOT11MULTIPLERETRYCOUNT 64
+++ { DOT11MULTIPLERETRYCOUNT, ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,5 } },
+++#define DOT11FRAMEDUPLICATECOUNT 65
+++ { DOT11FRAMEDUPLICATECOUNT, ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,6 } },
+++#define DOT11RTSSUCCESSCOUNT 66
+++ { DOT11RTSSUCCESSCOUNT, ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,7 } },
+++#define DOT11RTSFAILURECOUNT 67
+++ { DOT11RTSFAILURECOUNT, ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,8 } },
+++#define DOT11ACKFAILURECOUNT 68
+++ { DOT11ACKFAILURECOUNT, ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,9 } },
+++#define DOT11RECEIVEDFRAGMENTCOUNT 69
+++ { DOT11RECEIVEDFRAGMENTCOUNT, ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,10 } },
+++#define DOT11MULTICASTRECEIVEDFRAMECOUNT 70
+++ { DOT11MULTICASTRECEIVEDFRAMECOUNT, ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,11 } },
+++#define DOT11FCSERRORCOUNT 71
+++ { DOT11FCSERRORCOUNT , ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,12 } },
+++#define DOT11TRANSMITTEDFRAMECOUNT 72
+++ { DOT11TRANSMITTEDFRAMECOUNT, ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,13 } },
+++#define DOT11WEPUNDECRYPTABLECOUNT 73
+++ { DOT11WEPUNDECRYPTABLECOUNT, ASN_COUNTER , RONLY , var_dot11CountersTable, 4, { 2,2,1,14 } },
+++
+++#define DOT11ADDRESS 77
+++ { DOT11ADDRESS , ASN_OCTET_STR , RWRITE, var_dot11GroupAddressesTable, 4, { 2,3,1,2 } },
+++#define DOT11GROUPADDRESSESSTATUS 78
+++ { DOT11GROUPADDRESSESSTATUS, ASN_INTEGER , RWRITE, var_dot11GroupAddressesTable, 4, { 2,3,1,3 } },
+++
+++#define DOT11RESOURCETYPEIDNAME 79
+++ { DOT11RESOURCETYPEIDNAME, ASN_OCTET_STR , RONLY , var_ieee802dot11, 3, { 3,1,1 } },
+++#define DOT11MANUFACTUREROUI 82
+++ { DOT11MANUFACTUREROUI, ASN_OCTET_STR , RONLY , var_dot11ResourceInfoTable, 5, { 3,1,2,1,1 } },
+++#define DOT11MANUFACTURERNAME 83
+++ { DOT11MANUFACTURERNAME, ASN_OCTET_STR , RONLY , var_dot11ResourceInfoTable, 5, { 3,1,2,1,2 } },
+++#define DOT11MANUFACTURERPRODUCTNAME 84
+++ { DOT11MANUFACTURERPRODUCTNAME, ASN_OCTET_STR , RONLY , var_dot11ResourceInfoTable, 5, { 3,1,2,1,3 } },
+++#define DOT11MANUFACTURERPRODUCTVERSION 85
+++ { DOT11MANUFACTURERPRODUCTVERSION, ASN_OCTET_STR , RONLY , var_dot11ResourceInfoTable, 5, { 3,1,2,1,4 } },
+++
+++#define DOT11PHYTYPE 88
+++ { DOT11PHYTYPE , ASN_INTEGER , RONLY , var_dot11PhyOperationTable, 4, { 4,1,1,1 } },
+++#define DOT11CURRENTREGDOMAIN 89
+++ { DOT11CURRENTREGDOMAIN, ASN_INTEGER , RWRITE, var_dot11PhyOperationTable, 4, { 4,1,1,2 } },
+++#define DOT11TEMPTYPE 90
+++ { DOT11TEMPTYPE , ASN_INTEGER , RONLY , var_dot11PhyOperationTable, 4, { 4,1,1,3 } },
+++#define DOT11CURRENTTXANTENNA 93
+++ { DOT11CURRENTTXANTENNA, ASN_INTEGER , RWRITE, var_dot11PhyAntennaTable, 4, { 4,2,1,1 } },
+++#define DOT11DIVERSITYSUPPORT 94
+++ { DOT11DIVERSITYSUPPORT, ASN_INTEGER , RONLY , var_dot11PhyAntennaTable, 4, { 4,2,1,2 } },
+++#define DOT11CURRENTRXANTENNA 95
+++ { DOT11CURRENTRXANTENNA, ASN_INTEGER , RWRITE, var_dot11PhyAntennaTable, 4, { 4,2,1,3 } },
+++#define DOT11NUMBERSUPPORTEDPOWERLEVELS 98
+++ { DOT11NUMBERSUPPORTEDPOWERLEVELS, ASN_INTEGER , RONLY , var_dot11PhyTxPowerTable, 4, { 4,3,1,1 } },
+++#define DOT11TXPOWERLEVEL1 99
+++ { DOT11TXPOWERLEVEL1 , ASN_INTEGER , RONLY , var_dot11PhyTxPowerTable, 4, { 4,3,1,2 } },
+++#define DOT11TXPOWERLEVEL2 100
+++ { DOT11TXPOWERLEVEL2 , ASN_INTEGER , RONLY , var_dot11PhyTxPowerTable, 4, { 4,3,1,3 } },
+++#define DOT11TXPOWERLEVEL3 101
+++ { DOT11TXPOWERLEVEL3 , ASN_INTEGER , RONLY , var_dot11PhyTxPowerTable, 4, { 4,3,1,4 } },
+++#define DOT11TXPOWERLEVEL4 102
+++ { DOT11TXPOWERLEVEL4 , ASN_INTEGER , RONLY , var_dot11PhyTxPowerTable, 4, { 4,3,1,5 } },
+++#define DOT11TXPOWERLEVEL5 103
+++ { DOT11TXPOWERLEVEL5 , ASN_INTEGER , RONLY , var_dot11PhyTxPowerTable, 4, { 4,3,1,6 } },
+++#define DOT11TXPOWERLEVEL6 104
+++ { DOT11TXPOWERLEVEL6 , ASN_INTEGER , RONLY , var_dot11PhyTxPowerTable, 4, { 4,3,1,7 } },
+++#define DOT11TXPOWERLEVEL7 105
+++ { DOT11TXPOWERLEVEL7 , ASN_INTEGER , RONLY , var_dot11PhyTxPowerTable, 4, { 4,3,1,8 } },
+++#define DOT11TXPOWERLEVEL8 106
+++ { DOT11TXPOWERLEVEL8 , ASN_INTEGER , RONLY , var_dot11PhyTxPowerTable, 4, { 4,3,1,9 } },
+++#define DOT11CURRENTTXPOWERLEVEL 107
+++ { DOT11CURRENTTXPOWERLEVEL, ASN_INTEGER , RWRITE, var_dot11PhyTxPowerTable, 4, { 4,3,1,10 } },
+++
+++#define DOT11HOPTIME 110
+++ { DOT11HOPTIME , ASN_INTEGER , RONLY , var_dot11PhyFHSSTable, 4, { 4,4,1,1 } },
+++#define DOT11CURRENTCHANNELNUMBER 111
+++ { DOT11CURRENTCHANNELNUMBER, ASN_INTEGER , RWRITE, var_dot11PhyFHSSTable, 4, { 4,4,1,2 } },
+++#define DOT11MAXDWELLTIME 112
+++ { DOT11MAXDWELLTIME , ASN_INTEGER , RONLY , var_dot11PhyFHSSTable, 4, { 4,4,1,3 } },
+++#define DOT11CURRENTDWELLTIME 113
+++ { DOT11CURRENTDWELLTIME, ASN_INTEGER , RWRITE, var_dot11PhyFHSSTable, 4, { 4,4,1,4 } },
+++#define DOT11CURRENTSET 114
+++ { DOT11CURRENTSET , ASN_INTEGER , RWRITE, var_dot11PhyFHSSTable, 4, { 4,4,1,5 } },
+++#define DOT11CURRENTPATTERN 115
+++ { DOT11CURRENTPATTERN , ASN_INTEGER , RWRITE, var_dot11PhyFHSSTable, 4, { 4,4,1,6 } },
+++#define DOT11CURRENTINDEX 116
+++ { DOT11CURRENTINDEX , ASN_INTEGER , RWRITE, var_dot11PhyFHSSTable, 4, { 4,4,1,7 } },
+++
+++#define DOT11CURRENTCHANNEL 119
+++ { DOT11CURRENTCHANNEL , ASN_INTEGER , RWRITE, var_dot11PhyDSSSTable, 4, { 4,5,1,1 } },
+++#define DOT11CCAMODESUPPORTED 120
+++ { DOT11CCAMODESUPPORTED, ASN_INTEGER , RONLY , var_dot11PhyDSSSTable, 4, { 4,5,1,2 } },
+++#define DOT11CURRENTCCAMODE 121
+++ { DOT11CURRENTCCAMODE , ASN_INTEGER , RWRITE, var_dot11PhyDSSSTable, 4, { 4,5,1,3 } },
+++#define DOT11EDTHRESHOLD 122
+++ { DOT11EDTHRESHOLD , ASN_INTEGER , RWRITE, var_dot11PhyDSSSTable, 4, { 4,5,1,4 } },
+++
+++#define DOT11CCAWATCHDOGTIMERMAX 125
+++ { DOT11CCAWATCHDOGTIMERMAX, ASN_INTEGER , RWRITE, var_dot11PhyIRTable, 4, { 4,6,1,1 } },
+++#define DOT11CCAWATCHDOGCOUNTMAX 126
+++ { DOT11CCAWATCHDOGCOUNTMAX, ASN_INTEGER , RWRITE, var_dot11PhyIRTable, 4, { 4,6,1,2 } },
+++#define DOT11CCAWATCHDOGTIMERMIN 127
+++ { DOT11CCAWATCHDOGTIMERMIN, ASN_INTEGER , RWRITE, var_dot11PhyIRTable, 4, { 4,6,1,3 } },
+++#define DOT11CCAWATCHDOGCOUNTMIN 128
+++ { DOT11CCAWATCHDOGCOUNTMIN, ASN_INTEGER , RWRITE, var_dot11PhyIRTable, 4, { 4,6,1,4 } },
+++
+++#define DOT11REGDOMAINSSUPPORTVALUE 132
+++ { DOT11REGDOMAINSSUPPORTVALUE, ASN_INTEGER , RONLY , var_dot11RegDomainsSupportedTable, 4, { 4,7,1,2 } },
+++
+++#define DOT11SUPPORTEDTXANTENNA 136
+++ { DOT11SUPPORTEDTXANTENNA, ASN_INTEGER , RWRITE, var_dot11AntennasListTable, 4, { 4,8,1,2 } },
+++#define DOT11SUPPORTEDRXANTENNA 137
+++ { DOT11SUPPORTEDRXANTENNA, ASN_INTEGER , RWRITE, var_dot11AntennasListTable, 4, { 4,8,1,3 } },
+++#define DOT11DIVERSITYSELECTIONRX 138
+++ { DOT11DIVERSITYSELECTIONRX, ASN_INTEGER , RWRITE, var_dot11AntennasListTable, 4, { 4,8,1,4 } },
+++
+++#define DOT11SUPPORTEDDATARATESTXVALUE 142
+++ { DOT11SUPPORTEDDATARATESTXVALUE, ASN_INTEGER , RONLY , var_dot11SupportedDataRatesTxTable, 4, { 4,9,1,2 } },
+++
+++#define DOT11SUPPORTEDDATARATESRXVALUE 146
+++ { DOT11SUPPORTEDDATARATESRXVALUE, ASN_INTEGER , RONLY , var_dot11SupportedDataRatesRxTable, 4, { 4,10,1,2 } },
+++};
+++// ( L = length of the oidsuffix )
+++
+++/****************************************************************************
+++* *
+++* init_ieee802dot11() - perform any required initialization *
+++* *
+++****************************************************************************/
+++void init_ieee802dot11 ( void ) {
+++
+++ /* register ourselves with the agent to handle our mib tree */
+++ REGISTER_MIB("ieee802dot11", ieee802dot11_variables, variable7,
+++ ieee802dot11_variables_oid);
+++
+++ initLists();
+++}
+++
+++/****************************************************************************
+++* *
+++* shutdown_ieee802dot11() - perform any required cleanup @ shutdown *
+++* *
+++****************************************************************************/
+++void shutdown_ieee802dot11 ( void )
+++{
+++ flushLists();
+++}
+++
+++/****************************************************************************
+++* *
+++* var_ieee802dot11() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_ieee802dot11 ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method)
+++{
+++ loadTables();
+++
+++ if ( header_generic ( vp, name, length, exact,var_len,write_method )
+++ == MATCH_FAILED )
+++ return NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11RESOURCETYPEIDNAME:
+++ if ( !haveResourceTypeIDName )
+++ return NULL;
+++ *var_len = strlen ( resourceTypeIDName );
+++ return ( UCHAR * ) resourceTypeIDName;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11StationConfigTable() - return a variable value from the table *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11StationConfigTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++ static char MACWork[17];
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &scList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ sc = ( struct scTbl_data * ) np->data;
+++ rName[vp->namelen] = sc->ifIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) > 0 ))) {
+++
+++ switch ( vp->magic ) { // found requested OID, now check for requested variable
+++ case DOT11STATIONID:
+++ if ( sc->haveStationID ) found = TRUE; break;
+++ case DOT11MEDIUMOCCUPANCYLIMIT:
+++ if ( sc->haveMediumOccupancyLimit ) found = TRUE; break;
+++ case DOT11CFPOLLABLE:
+++ if ( sc->haveCFPPollable ) found = TRUE; break;
+++ case DOT11CFPPERIOD:
+++ if ( sc->haveCFPPeriod ) found = TRUE; break;
+++ case DOT11CFPMAXDURATION:
+++ if ( sc->haveMaxDuration ) found = TRUE; break;
+++ case DOT11AUTHENTICATIONRESPONSETIMEOUT:
+++ if ( sc->haveAuthenticationResponseTimeOut ) found = TRUE; break;
+++ case DOT11PRIVACYOPTIONIMPLEMENTED:
+++ if ( sc->havePrivacyOptionImplemented ) found = TRUE; break;
+++ case DOT11POWERMANAGEMENTMODE:
+++ if ( sc->havePowerManagementMode ) found = TRUE; break;
+++ case DOT11DESIREDSSID:
+++ if ( sc->haveDesiredSSID ) found = TRUE; break;
+++ case DOT11DESIREDBSSTYPE:
+++ if ( sc->haveDesiredBSSType ) found = TRUE; break;
+++ case DOT11OPERATIONALRATESET:
+++ if ( sc->haveOperationalRateSet ) found = TRUE; break;
+++ case DOT11BEACONPERIOD:
+++ if ( sc->haveBeaconPeriod ) found = TRUE; break;
+++ case DOT11DTIMPERIOD:
+++ if ( sc->haveDTIMPeriod ) found = TRUE; break;
+++ case DOT11ASSOCIATIONRESPONSETIMEOUT:
+++ if ( sc->haveAssociationResponseTimeOut ) found = TRUE; break;
+++ case DOT11DISASSOCIATEREASON:
+++ if ( sc->disAssociationReason ) found = TRUE; break;
+++ case DOT11DISASSOCIATESTATION:
+++ if ( sc->haveDisAssociationStation ) found = TRUE; break;
+++ case DOT11DEAUTHENTICATEREASON:
+++ if ( sc->deAuthenticationReason ) found = TRUE; break;
+++ case DOT11DEAUTHENTICATESTATION:
+++ if ( sc->haveDeAuthenticationStation ) found = TRUE; break;
+++ case DOT11AUTHENTICATEFAILSTATUS:
+++ if ( sc->authenticateFailStatus ) found = TRUE; break;
+++ case DOT11AUTHENTICATEFAILSTATION:
+++ if ( sc->haveAuthenticateFailStation ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 1 ) * sizeof ( oid ));
+++ *length = vp->namelen + 1;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11STATIONID:
+++// *write_method = write_dot11StationID;
+++ MACWork[ 0] = sc->stationID [ 0];
+++ MACWork[ 1] = sc->stationID [ 1];
+++ MACWork[ 2] = sc->stationID [ 3];
+++ MACWork[ 3] = sc->stationID [ 4];
+++ MACWork[ 4] = sc->stationID [ 6];
+++ MACWork[ 5] = sc->stationID [ 7];
+++ MACWork[ 6] = sc->stationID [ 9];
+++ MACWork[ 7] = sc->stationID [10];
+++ MACWork[ 8] = sc->stationID [12];
+++ MACWork[ 9] = sc->stationID [13];
+++ MACWork[10] = sc->stationID [15];
+++ MACWork[11] = sc->stationID [16];
+++ MACWork[12] = '\0';
+++ *var_len = 6;
+++ return ( UCHAR * ) htob ( MACWork );
+++
+++ case DOT11MEDIUMOCCUPANCYLIMIT:
+++// *write_method = write_dot11MediumOccupancyLimit;
+++ sc->mediumOccupancyLimit = 5;
+++ return ( UCHAR * ) &sc->mediumOccupancyLimit;
+++
+++ case DOT11CFPOLLABLE:
+++ return ( UCHAR * ) &sc->CFPPollable;
+++
+++ case DOT11CFPPERIOD:
+++// *write_method = write_dot11CFPPeriod;
+++ return ( UCHAR * ) &sc->CFPPeriod;
+++
+++ case DOT11CFPMAXDURATION:
+++// *write_method = write_dot11CFPMaxDuration;
+++ return ( UCHAR * ) &sc->maxDuration;
+++
+++ case DOT11AUTHENTICATIONRESPONSETIMEOUT:
+++// *write_method = write_dot11AuthenticationResponseTimeOut;
+++ return ( UCHAR * ) &sc->authenticationResponseTimeOut;
+++
+++ case DOT11PRIVACYOPTIONIMPLEMENTED:
+++ return ( UCHAR * ) &sc->privacyOptionImplemented;
+++
+++ case DOT11POWERMANAGEMENTMODE:
+++// *write_method = write_dot11PowerManagementMode;
+++ return ( UCHAR * ) &sc->powerManagementMode;
+++
+++ case DOT11DESIREDSSID:
+++// *write_method = write_dot11DesiredSSID;
+++ *var_len = strlen ( sc->desiredSSID );
+++ return ( UCHAR * ) sc->desiredSSID;
+++
+++ case DOT11DESIREDBSSTYPE:
+++// *write_method = write_dot11DesiredBSSType;
+++ return ( UCHAR * ) &sc->desiredBSSType;
+++
+++ case DOT11OPERATIONALRATESET:
+++// *write_method = write_dot11OperationalRateSet;
+++ *var_len = strlen ( sc->operationalRateSet );
+++ return ( UCHAR * ) sc->operationalRateSet;
+++
+++ case DOT11BEACONPERIOD:
+++// *write_method = write_dot11BeaconPeriod;
+++ return ( UCHAR * ) &sc->beaconPeriod;
+++
+++ case DOT11DTIMPERIOD:
+++// *write_method = write_dot11DTIMPeriod;
+++ return ( UCHAR * ) &sc->DTIMPeriod;
+++
+++ case DOT11ASSOCIATIONRESPONSETIMEOUT:
+++// *write_method = write_dot11AssociationResponseTimeOut;
+++ return ( UCHAR * ) &sc->associationResponseTimeOut;
+++
+++ case DOT11DISASSOCIATEREASON:
+++ return ( UCHAR * ) &sc->disAssociationReason;
+++
+++ case DOT11DISASSOCIATESTATION:
+++ MACWork[ 0] = sc->disAssociationStation[ 0];
+++ MACWork[ 1] = sc->disAssociationStation[ 1];
+++ MACWork[ 2] = sc->disAssociationStation[ 3];
+++ MACWork[ 3] = sc->disAssociationStation[ 4];
+++ MACWork[ 4] = sc->disAssociationStation[ 6];
+++ MACWork[ 5] = sc->disAssociationStation[ 7];
+++ MACWork[ 6] = sc->disAssociationStation[ 9];
+++ MACWork[ 7] = sc->disAssociationStation[10];
+++ MACWork[ 8] = sc->disAssociationStation[12];
+++ MACWork[ 9] = sc->disAssociationStation[13];
+++ MACWork[10] = sc->disAssociationStation[15];
+++ MACWork[11] = sc->disAssociationStation[16];
+++ MACWork[12] = '\0';
+++ *var_len = 6;
+++ return ( UCHAR * ) htob ( MACWork );
+++
+++ case DOT11DEAUTHENTICATEREASON:
+++ return ( UCHAR * ) &sc->deAuthenticationReason;
+++
+++ case DOT11DEAUTHENTICATESTATION:
+++ MACWork[ 0] = sc->deAuthenticationStation[ 0];
+++ MACWork[ 1] = sc->deAuthenticationStation[ 1];
+++ MACWork[ 2] = sc->deAuthenticationStation[ 3];
+++ MACWork[ 3] = sc->deAuthenticationStation[ 4];
+++ MACWork[ 4] = sc->deAuthenticationStation[ 6];
+++ MACWork[ 5] = sc->deAuthenticationStation[ 7];
+++ MACWork[ 6] = sc->deAuthenticationStation[ 9];
+++ MACWork[ 7] = sc->deAuthenticationStation[10];
+++ MACWork[ 8] = sc->deAuthenticationStation[12];
+++ MACWork[ 9] = sc->deAuthenticationStation[13];
+++ MACWork[10] = sc->deAuthenticationStation[15];
+++ MACWork[11] = sc->deAuthenticationStation[16];
+++ MACWork[12] = '\0';
+++ *var_len = 6;
+++ return ( UCHAR * ) htob ( MACWork );
+++
+++ case DOT11AUTHENTICATEFAILSTATUS:
+++ return ( UCHAR * ) &sc->authenticateFailStatus;
+++
+++ case DOT11AUTHENTICATEFAILSTATION:
+++ MACWork[ 0] = sc->authenticateFailStation[ 0];
+++ MACWork[ 1] = sc->authenticateFailStation[ 1];
+++ MACWork[ 2] = sc->authenticateFailStation[ 3];
+++ MACWork[ 3] = sc->authenticateFailStation[ 4];
+++ MACWork[ 4] = sc->authenticateFailStation[ 6];
+++ MACWork[ 5] = sc->authenticateFailStation[ 7];
+++ MACWork[ 6] = sc->authenticateFailStation[ 9];
+++ MACWork[ 7] = sc->authenticateFailStation[10];
+++ MACWork[ 8] = sc->authenticateFailStation[12];
+++ MACWork[ 9] = sc->authenticateFailStation[13];
+++ MACWork[10] = sc->authenticateFailStation[15];
+++ MACWork[11] = sc->authenticateFailStation[16];
+++ MACWork[12] = '\0';
+++ *var_len = 6;
+++ return ( UCHAR * ) htob ( MACWork );
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11AuthenticationAlgorithmsTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11AuthenticationAlgorithmsTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &aaList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ aa = ( struct aaTbl_data * ) np->data;
+++ rName[vp->namelen + 0] = aa->ifIndex;
+++ rName[vp->namelen + 1] = aa->authenticationAlgorithmsIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11AUTHENTICATIONALGORITHM:
+++ if ( aa->haveAuthenticationAlgorithm ) found = TRUE; break;
+++ case DOT11AUTHENTICATIONALGORITHMSENABLE:
+++ if ( aa->authenticationAlgorithmsEnable ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 2 ) * sizeof ( oid ));
+++ *length = vp->namelen + 2;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11AUTHENTICATIONALGORITHM:
+++ return ( UCHAR * ) &aa->authenticationAlgorithm;
+++
+++ case DOT11AUTHENTICATIONALGORITHMSENABLE:
+++// *write_method = write_dot11AuthenticationAlgorithmsEnable;
+++ return ( UCHAR * ) &aa->authenticationAlgorithmsEnable;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11WEPDefaultKeysTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11WEPDefaultKeysTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &dfList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ df = ( struct dfTbl_data * ) np->data;
+++ rName[vp->namelen + 0] = df->ifIndex;
+++ rName[vp->namelen + 1] = df->WEPDefaultKeyIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11WEPDEFAULTKEYVALUE:
+++ if ( df->haveWEPDefaultKeyValue ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 2 ) * sizeof ( oid ));
+++ *length = vp->namelen + 2;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11WEPDEFAULTKEYVALUE:
+++// *write_method = write_dot11WEPDefaultKeyValue;
+++ *var_len = strlen ( df->WEPDefaultKeyValue );
+++ return ( UCHAR * ) df->WEPDefaultKeyValue;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11WEPKeyMappingsTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11WEPKeyMappingsTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method)
+++{
+++ static char MACWork[17];
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &kmList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ km = ( struct kmTbl_data * ) np->data;
+++ rName[vp->namelen + 0] = km->ifIndex;
+++ rName[vp->namelen + 1] = km->WEPKeyMappingIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11WEPKEYMAPPINGADDRESS:
+++ if ( km->haveWEPKeyMappingAddress ) found = TRUE; break;
+++ case DOT11WEPKEYMAPPINGWEPON:
+++ if ( km->haveWEPKeyMappingWEPOn ) found = TRUE; break;
+++ case DOT11WEPKEYMAPPINGVALUE:
+++ if ( km->haveWEPKeyMappingValue ) found = TRUE; break;
+++ case DOT11WEPKEYMAPPINGSTATUS:
+++ if ( km->haveWEPKeyMappingStatus ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 2 ) * sizeof ( oid ));
+++ *length = vp->namelen + 2;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11WEPKEYMAPPINGADDRESS:
+++// *write_method = write_dot11WEPKeyMappingAddress;
+++ MACWork[ 0] = km->WEPKeyMappingAddress[ 0];
+++ MACWork[ 1] = km->WEPKeyMappingAddress[ 1];
+++ MACWork[ 2] = km->WEPKeyMappingAddress[ 3];
+++ MACWork[ 3] = km->WEPKeyMappingAddress[ 4];
+++ MACWork[ 4] = km->WEPKeyMappingAddress[ 6];
+++ MACWork[ 5] = km->WEPKeyMappingAddress[ 7];
+++ MACWork[ 6] = km->WEPKeyMappingAddress[ 9];
+++ MACWork[ 7] = km->WEPKeyMappingAddress[10];
+++ MACWork[ 8] = km->WEPKeyMappingAddress[12];
+++ MACWork[ 9] = km->WEPKeyMappingAddress[13];
+++ MACWork[10] = km->WEPKeyMappingAddress[15];
+++ MACWork[11] = km->WEPKeyMappingAddress[16];
+++ MACWork[12] = '\0';
+++ *var_len = 6;
+++ return ( UCHAR * ) htob ( MACWork );
+++
+++ case DOT11WEPKEYMAPPINGWEPON:
+++// *write_method = write_dot11WEPKeyMappingWEPOn;
+++ return ( UCHAR * ) &km->WEPKeyMappingWEPOn;
+++
+++ case DOT11WEPKEYMAPPINGVALUE:
+++// *write_method = write_dot11WEPKeyMappingValue;
+++ *var_len = strlen ( km->WEPKeyMappingValue );
+++ return ( UCHAR * ) km->WEPKeyMappingValue;
+++
+++ case DOT11WEPKEYMAPPINGSTATUS:
+++// *write_method = write_dot11WEPKeyMappingStatus;
+++ return ( UCHAR * ) &km->WEPKeyMappingStatus;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11PrivacyTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11PrivacyTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &prList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ pr = ( struct prTbl_data * ) np->data;
+++ rName[vp->namelen] = pr->ifIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11PRIVACYINVOKED:
+++ if ( pr->havePrivacyInvoked ) found = TRUE; break;
+++ case DOT11WEPDEFAULTKEYID:
+++ if ( pr->haveWEPDefaultKeyID ) found = TRUE; break;
+++ case DOT11WEPKEYMAPPINGLENGTH:
+++ if ( pr->haveWEPKeyMappingLength ) found = TRUE; break;
+++ case DOT11EXCLUDEUNENCRYPTED:
+++ if ( pr->haveExcludeUnencrypted ) found = TRUE; break;
+++ case DOT11WEPICVERRORCOUNT:
+++ if ( pr->haveWEPICVErrorCount ) found = TRUE; break;
+++ case DOT11WEPEXCLUDEDCOUNT:
+++ if ( pr->haveWEPExcludedCount ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 1 ) * sizeof ( oid ));
+++ *length = vp->namelen + 1;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11PRIVACYINVOKED:
+++// *write_method = write_dot11PrivacyInvoked;
+++ return ( UCHAR * ) &pr->privacyInvoked;
+++
+++ case DOT11WEPDEFAULTKEYID:
+++// *write_method = write_dot11WEPDefaultKeyID;
+++ return ( UCHAR * ) &pr->WEPDefaultKeyID;
+++
+++ case DOT11WEPKEYMAPPINGLENGTH:
+++// *write_method = write_dot11WEPKeyMappingLength;
+++ return ( UCHAR * ) &pr->WEPKeyMappingLength;
+++
+++ case DOT11EXCLUDEUNENCRYPTED:
+++// *write_method = write_dot11ExcludeUnencrypted;
+++ return ( UCHAR * ) &pr->excludeUnencrypted;
+++
+++ case DOT11WEPICVERRORCOUNT:
+++ return ( UCHAR * ) &pr->WEPICVErrorCount;
+++
+++ case DOT11WEPEXCLUDEDCOUNT:
+++ return ( UCHAR * ) &pr->WEPExcludedCount;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11OperationTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11OperationTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++ static char MACWork[17];
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &opList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ op = ( struct opTbl_data * ) np->data;
+++ rName[vp->namelen] = op->ifIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) > 0 ))) {
+++
+++ switch ( vp->magic ) { // found requested OID, now check for requested variable
+++ case DOT11MACADDRESS:
+++ if ( op->haveMACAddress ) found = TRUE; break;
+++ case DOT11RTSTHRESHOLD:
+++ if ( op->haveRTSThreshold ) found = TRUE; break;
+++ case DOT11SHORTRETRYLIMIT:
+++ if ( op->haveShortRetryLimit ) found = TRUE; break;
+++ case DOT11LONGRETRYLIMIT:
+++ if ( op->haveLongRetryLimit ) found = TRUE; break;
+++ case DOT11FRAGMENTATIONTHRESHOLD:
+++ if ( op->haveFragmentationThreshold ) found = TRUE; break;
+++ case DOT11MAXTRANSMITMSDULIFETIME:
+++ if ( op->haveMaxTransmitMSDULifetime ) found = TRUE; break;
+++ case DOT11MAXRECEIVELIFETIME:
+++ if ( op->haveMaxReceiveLifetime ) found = TRUE; break;
+++ case DOT11MANUFACTURERID:
+++ if ( op->haveManufacturerID ) found = TRUE; break;
+++ case DOT11PRODUCTID:
+++ if ( op->haveProductID ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 1 ) * sizeof ( oid ));
+++ *length = vp->namelen + 1;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11MACADDRESS:
+++ MACWork[ 0] = op->MACAddress[ 0];
+++ MACWork[ 1] = op->MACAddress[ 1];
+++ MACWork[ 2] = op->MACAddress[ 3];
+++ MACWork[ 3] = op->MACAddress[ 4];
+++ MACWork[ 4] = op->MACAddress[ 6];
+++ MACWork[ 5] = op->MACAddress[ 7];
+++ MACWork[ 6] = op->MACAddress[ 9];
+++ MACWork[ 7] = op->MACAddress[10];
+++ MACWork[ 8] = op->MACAddress[12];
+++ MACWork[ 9] = op->MACAddress[13];
+++ MACWork[10] = op->MACAddress[15];
+++ MACWork[11] = op->MACAddress[16];
+++ MACWork[12] = '\0';
+++ *var_len = 6;
+++ return ( UCHAR * ) htob ( MACWork );
+++
+++ case DOT11RTSTHRESHOLD:
+++// *write_method = write_dot11RTSThreshold;
+++ return ( UCHAR * ) &op->RTSThreshold;
+++
+++ case DOT11SHORTRETRYLIMIT:
+++// *write_method = write_dot11ShortRetryLimit;
+++ return ( UCHAR * ) &op->shortRetryLimit;
+++
+++ case DOT11LONGRETRYLIMIT:
+++// *write_method = write_dot11LongRetryLimit;
+++ return ( UCHAR * ) &op->longRetryLimit;
+++
+++ case DOT11FRAGMENTATIONTHRESHOLD:
+++// *write_method = write_dot11FragmentationThreshold;
+++ return ( UCHAR * ) &op->fragmentationThreshold;
+++
+++ case DOT11MAXTRANSMITMSDULIFETIME:
+++// *write_method = write_dot11MaxTransmitMSDULifetime;
+++ return ( UCHAR * ) &op->maxTransmitMSDULifetime;
+++
+++ case DOT11MAXRECEIVELIFETIME:
+++// *write_method = write_dot11MaxReceiveLifetime;
+++ return ( UCHAR * ) &op->maxReceiveLifetime;
+++
+++ case DOT11MANUFACTURERID:
+++ *var_len = strlen ( op->manufacturerID );
+++ return ( UCHAR * ) op->manufacturerID;
+++
+++ case DOT11PRODUCTID:
+++ *var_len = strlen ( op->productID );
+++ return ( UCHAR * ) op->productID;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11CountersTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11CountersTable(struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method)
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &coList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ co = ( struct coTbl_data * ) np->data;
+++ rName[vp->namelen] = co->ifIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11TRANSMITTEDFRAGMENTCOUNT:
+++ if ( co->haveTransmittedFragmentCount ) found = TRUE; break;
+++ case DOT11MULTICASTTRANSMITTEDFRAMECOUNT:
+++ if ( co->haveTransmittedFrameCount ) found = TRUE; break;
+++ case DOT11FAILEDCOUNT:
+++ if ( co->haveFailedCount ) found = TRUE; break;
+++ case DOT11RETRYCOUNT:
+++ if ( co->haveRetryCount ) found = TRUE; break;
+++ case DOT11MULTIPLERETRYCOUNT:
+++ if ( co->haveMultipleRetryCount ) found = TRUE; break;
+++ case DOT11FRAMEDUPLICATECOUNT:
+++ if ( co->haveFrameDuplicateCount ) found = TRUE; break;
+++ case DOT11RTSSUCCESSCOUNT:
+++ if ( co->haveRTSSuccessCount ) found = TRUE; break;
+++ case DOT11RTSFAILURECOUNT:
+++ if ( co->haveRTSFailureCount ) found = TRUE; break;
+++ case DOT11ACKFAILURECOUNT:
+++ if ( co->haveACKFailureCount ) found = TRUE; break;
+++ case DOT11RECEIVEDFRAGMENTCOUNT:
+++ if ( co->haveReceivedFragmentCount ) found = TRUE; break;
+++ case DOT11MULTICASTRECEIVEDFRAMECOUNT:
+++ if ( co->haveMulticastReceivedFrameCount ) found = TRUE; break;
+++ case DOT11FCSERRORCOUNT:
+++ if ( co->haveFCSErrorCount ) found = TRUE; break;
+++ case DOT11TRANSMITTEDFRAMECOUNT:
+++ if ( co->haveTransmittedFrameCount ) found = TRUE; break;
+++ case DOT11WEPUNDECRYPTABLECOUNT:
+++ if ( co->haveWEPUndecryptableCount ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 1 ) * sizeof ( oid ));
+++ *length = vp->namelen + 1;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11TRANSMITTEDFRAGMENTCOUNT: return ( UCHAR * ) &co->transmittedFragmentCount;
+++ case DOT11MULTICASTTRANSMITTEDFRAMECOUNT: return ( UCHAR * ) &co->transmittedFrameCount;
+++ case DOT11FAILEDCOUNT: return ( UCHAR * ) &co->failedCount;
+++ case DOT11RETRYCOUNT: return ( UCHAR * ) &co->retryCount;
+++ case DOT11MULTIPLERETRYCOUNT: return ( UCHAR * ) &co->multipleRetryCount;
+++ case DOT11FRAMEDUPLICATECOUNT: return ( UCHAR * ) &co->frameDuplicateCount;
+++ case DOT11RTSSUCCESSCOUNT: return ( UCHAR * ) &co->RTSSuccessCount;
+++ case DOT11RTSFAILURECOUNT: return ( UCHAR * ) &co->RTSFailureCount;
+++ case DOT11ACKFAILURECOUNT: return ( UCHAR * ) &co->ACKFailureCount;
+++ case DOT11RECEIVEDFRAGMENTCOUNT: return ( UCHAR * ) &co->receivedFragmentCount;
+++ case DOT11MULTICASTRECEIVEDFRAMECOUNT: return ( UCHAR * ) &co->multicastReceivedFrameCount;
+++ case DOT11FCSERRORCOUNT: return ( UCHAR * ) &co->FCSErrorCount;
+++ case DOT11TRANSMITTEDFRAMECOUNT: return ( UCHAR * ) &co->transmittedFrameCount;
+++ case DOT11WEPUNDECRYPTABLECOUNT: return ( UCHAR * ) &co->WEPUndecryptableCount;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11GroupAddressesTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11GroupAddressesTable(struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method)
+++{
+++ static char MACWork[17];
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &gaList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ ga = ( struct gaTbl_data * ) np->data;
+++ rName[vp->namelen + 0] = ga->ifIndex;
+++ rName[vp->namelen + 1] = ga->groupAddressesIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11ADDRESS:
+++ if ( ga->haveAddress ) found = TRUE; break;
+++ case DOT11GROUPADDRESSESSTATUS:
+++ if ( ga->haveGroupAddressesStatus ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 2 ) * sizeof ( oid ));
+++ *length = vp->namelen + 2;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11ADDRESS:
+++// *write_method = write_dot11Address;
+++ MACWork[ 0] = ga->address[ 0];
+++ MACWork[ 1] = ga->address[ 1];
+++ MACWork[ 2] = ga->address[ 3];
+++ MACWork[ 3] = ga->address[ 4];
+++ MACWork[ 4] = ga->address[ 6];
+++ MACWork[ 5] = ga->address[ 7];
+++ MACWork[ 6] = ga->address[ 9];
+++ MACWork[ 7] = ga->address[10];
+++ MACWork[ 8] = ga->address[12];
+++ MACWork[ 9] = ga->address[13];
+++ MACWork[10] = ga->address[15];
+++ MACWork[11] = ga->address[16];
+++ MACWork[12] = '\0';
+++ *var_len = 6;
+++ return ( UCHAR * ) htob ( MACWork );
+++
+++ case DOT11GROUPADDRESSESSTATUS:
+++// *write_method = write_dot11GroupAddressesStatus;
+++ return ( UCHAR * ) &ga->groupAddressesStatus;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11ResourceInfoTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11ResourceInfoTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &riList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ ri = ( struct riTbl_data * ) np->data;
+++ rName[vp->namelen] = ri->ifIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11MANUFACTUREROUI:
+++ if ( ri->haveManufacturerOUI ) found = TRUE; break;
+++ case DOT11MANUFACTURERNAME:
+++ if ( ri->haveManufacturerName ) found = TRUE; break;
+++ case DOT11MANUFACTURERPRODUCTNAME:
+++ if ( ri->haveManufacturerProductName ) found = TRUE; break;
+++ case DOT11MANUFACTURERPRODUCTVERSION:
+++ if ( ri->haveManufacturerProductVersion ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 1 ) * sizeof ( oid ));
+++ *length = vp->namelen + 1;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11MANUFACTUREROUI:
+++ *var_len = strlen ( ri->manufacturerOUI );
+++ return ( UCHAR * ) ri->manufacturerOUI;
+++
+++ case DOT11MANUFACTURERNAME:
+++ *var_len = strlen ( ri->manufacturerName );
+++ return ( UCHAR * ) ri->manufacturerName;
+++
+++ case DOT11MANUFACTURERPRODUCTNAME:
+++ *var_len = strlen ( ri->manufacturerProductName );
+++ return ( UCHAR * ) ri->manufacturerProductName;
+++
+++ case DOT11MANUFACTURERPRODUCTVERSION:
+++ *var_len = strlen ( ri->manufacturerProductVersion );
+++ return ( UCHAR * ) ri->manufacturerProductVersion;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11PhyOperationTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11PhyOperationTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &poList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ po = ( struct poTbl_data * ) np->data;
+++ rName[vp->namelen] = po->ifIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11PHYTYPE:
+++ if ( po->havePHYType ) found = TRUE; break;
+++ case DOT11CURRENTREGDOMAIN:
+++ if ( po->haveCurrentRegDomain ) found = TRUE; break;
+++ case DOT11TEMPTYPE:
+++ if ( po->haveTempType ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 1 ) * sizeof ( oid ));
+++ *length = vp->namelen + 1;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11PHYTYPE:
+++ return ( UCHAR * ) &po->PHYType;
+++
+++ case DOT11CURRENTREGDOMAIN:
+++// *write_method = write_dot11CurrentRegDomain;
+++ return ( UCHAR * ) &po->currentRegDomain;
+++
+++ case DOT11TEMPTYPE:
+++ return ( UCHAR * ) &po->tempType;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11PhyAntennaTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11PhyAntennaTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &paList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ pa = ( struct paTbl_data * ) np->data;
+++ rName[vp->namelen] = pa->ifIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11CURRENTTXANTENNA:
+++ if ( pa->haveCurrentTxAntenna ) found = TRUE; break;
+++ case DOT11DIVERSITYSUPPORT:
+++ if ( pa->haveDiversitySupport ) found = TRUE; break;
+++ case DOT11CURRENTRXANTENNA:
+++ if ( pa->haveCurrentRxAntenna ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 1 ) * sizeof ( oid ));
+++ *length = vp->namelen + 1;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11CURRENTTXANTENNA:
+++// *write_method = write_dot11CurrentTxAntenna;
+++ return ( UCHAR * ) &pa->currentTxAntenna;
+++
+++ case DOT11DIVERSITYSUPPORT:
+++ return ( UCHAR * ) &pa->diversitySupport;
+++
+++ case DOT11CURRENTRXANTENNA:
+++// *write_method = write_dot11CurrentRxAntenna;
+++ return ( UCHAR * ) &pa->currentRxAntenna;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11PhyTxPowerTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11PhyTxPowerTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &ptList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ pt = ( struct ptTbl_data * ) np->data;
+++ rName[vp->namelen] = pt->ifIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11NUMBERSUPPORTEDPOWERLEVELS:
+++ if ( pt->haveNumberSupportedPowerLevels ) found = TRUE; break;
+++ case DOT11TXPOWERLEVEL1:
+++ if ( pt->haveTxPowerLevel1 ) found = TRUE; break;
+++ case DOT11TXPOWERLEVEL2:
+++ if ( pt->haveTxPowerLevel2 ) found = TRUE; break;
+++ case DOT11TXPOWERLEVEL3:
+++ if ( pt->haveTxPowerLevel3 ) found = TRUE; break;
+++ case DOT11TXPOWERLEVEL4:
+++ if ( pt->haveTxPowerLevel4 ) found = TRUE; break;
+++ case DOT11TXPOWERLEVEL5:
+++ if ( pt->haveTxPowerLevel5 ) found = TRUE; break;
+++ case DOT11TXPOWERLEVEL6:
+++ if ( pt->haveTxPowerLevel6 ) found = TRUE; break;
+++ case DOT11TXPOWERLEVEL7:
+++ if ( pt->haveTxPowerLevel7 ) found = TRUE; break;
+++ case DOT11TXPOWERLEVEL8:
+++ if ( pt->haveTxPowerLevel8 ) found = TRUE; break;
+++ case DOT11CURRENTTXPOWERLEVEL:
+++ if ( pt->currentTxPowerLevel ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 1 ) * sizeof ( oid ));
+++ *length = vp->namelen + 1;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11NUMBERSUPPORTEDPOWERLEVELS:
+++ return ( UCHAR * ) &pt->numberSupportedPowerLevels;
+++
+++ case DOT11TXPOWERLEVEL1: return ( UCHAR * ) &pt->TxPowerLevel1;
+++ case DOT11TXPOWERLEVEL2: return ( UCHAR * ) &pt->TxPowerLevel2;
+++ case DOT11TXPOWERLEVEL3: return ( UCHAR * ) &pt->TxPowerLevel3;
+++ case DOT11TXPOWERLEVEL4: return ( UCHAR * ) &pt->TxPowerLevel4;
+++ case DOT11TXPOWERLEVEL5: return ( UCHAR * ) &pt->TxPowerLevel5;
+++ case DOT11TXPOWERLEVEL6: return ( UCHAR * ) &pt->TxPowerLevel6;
+++ case DOT11TXPOWERLEVEL7: return ( UCHAR * ) &pt->TxPowerLevel7;
+++ case DOT11TXPOWERLEVEL8: return ( UCHAR * ) &pt->TxPowerLevel8;
+++
+++ case DOT11CURRENTTXPOWERLEVEL:
+++// *write_method = write_dot11CurrentTxPowerLevel;
+++ return ( UCHAR * ) &pt->currentTxPowerLevel;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11PhyFHSSTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11PhyFHSSTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &pfList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ pf = ( struct pfTbl_data * ) np->data;
+++ rName[vp->namelen] = pf->ifIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11HOPTIME:
+++ if ( pf->haveHopTime ) found = TRUE; break;
+++ case DOT11CURRENTCHANNELNUMBER:
+++ if ( pf->haveCurrentChannelNumber ) found = TRUE; break;
+++ case DOT11MAXDWELLTIME:
+++ if ( pf->haveMaxDwellTime ) found = TRUE; break;
+++ case DOT11CURRENTDWELLTIME:
+++ if ( pf->haveCurrentDwellTime ) found = TRUE; break;
+++ case DOT11CURRENTSET:
+++ if ( pf->haveCurrentSet ) found = TRUE; break;
+++ case DOT11CURRENTPATTERN:
+++ if ( pf->haveCurrentPattern ) found = TRUE; break;
+++ case DOT11CURRENTINDEX:
+++ if ( pf->haveCurrentIndex ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 1 ) * sizeof ( oid ));
+++ *length = vp->namelen + 1;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11HOPTIME:
+++ return ( UCHAR * ) &pf->hopTime;
+++
+++ case DOT11CURRENTCHANNELNUMBER:
+++// *write_method = write_dot11CurrentChannelNumber;
+++ return ( UCHAR * ) &pf->currentChannelNumber;
+++
+++ case DOT11MAXDWELLTIME:
+++ return ( UCHAR * ) &pf->maxDwellTime;
+++
+++ case DOT11CURRENTDWELLTIME:
+++// *write_method = write_dot11CurrentDwellTime;
+++ return ( UCHAR * ) &pf->currentDwellTime;
+++
+++ case DOT11CURRENTSET:
+++// *write_method = write_dot11CurrentSet;
+++ return ( UCHAR * ) &pf->currentSet;
+++
+++ case DOT11CURRENTPATTERN:
+++// *write_method = write_dot11CurrentPattern;
+++ return ( UCHAR * ) &pf->currentPattern;
+++
+++ case DOT11CURRENTINDEX:
+++// *write_method = write_dot11CurrentIndex;
+++ return ( UCHAR * ) &pf->currentIndex;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11PhyDSSSTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11PhyDSSSTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &pdList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ pd = ( struct pdTbl_data * ) np->data;
+++ rName[vp->namelen] = pd->ifIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11CURRENTCHANNEL:
+++ if ( pd->haveCurrentChannel ) found = TRUE; break;
+++ case DOT11CCAMODESUPPORTED:
+++ if ( pd->haveCCAModeSupported ) found = TRUE; break;
+++ case DOT11CURRENTCCAMODE:
+++ if ( pd->haveCurrentCCAMode ) found = TRUE; break;
+++ case DOT11EDTHRESHOLD:
+++ if ( pd->haveEDThreshold ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 1 ) * sizeof ( oid ));
+++ *length = vp->namelen + 1;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11CURRENTCHANNEL:
+++// *write_method = write_dot11CurrentChannel;
+++ return ( UCHAR * ) &pd->currentChannel;
+++
+++ case DOT11CCAMODESUPPORTED:
+++ return ( UCHAR * ) &pd->CCAModeSupported;
+++
+++ case DOT11CURRENTCCAMODE:
+++// *write_method = write_dot11CurrentCCAMode;
+++ return ( UCHAR * ) &pd->currentCCAMode;
+++
+++ case DOT11EDTHRESHOLD:
+++// *write_method = write_dot11EDThreshold;
+++ return ( UCHAR * ) &pd->EDThreshold;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11PhyIRTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11PhyIRTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method)
+++{
+++
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &piList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ pi = ( struct piTbl_data * ) np->data;
+++ rName[vp->namelen] = pi->ifIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 1, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11CCAWATCHDOGTIMERMAX:
+++ if ( pi->CCAWatchdogTimerMax ) found = TRUE; break;
+++ case DOT11CCAWATCHDOGCOUNTMAX:
+++ if ( pi->CCAWatchdogCountMax ) found = TRUE; break;
+++ case DOT11CCAWATCHDOGTIMERMIN:
+++ if ( pi->CCAWatchdogTimerMin ) found = TRUE; break;
+++ case DOT11CCAWATCHDOGCOUNTMIN:
+++ if ( pi->CCAWatchdogCountMin ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 1 ) * sizeof ( oid ));
+++ *length = vp->namelen + 1;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11CCAWATCHDOGTIMERMAX:
+++// *write_method = write_dot11CCAWatchdogTimerMax;
+++ return ( UCHAR * ) &pi->CCAWatchdogTimerMax;
+++
+++ case DOT11CCAWATCHDOGCOUNTMAX:
+++// *write_method = write_dot11CCAWatchdogCountMax;
+++ return ( UCHAR * ) &pi->CCAWatchdogCountMax;
+++
+++ case DOT11CCAWATCHDOGTIMERMIN:
+++// *write_method = write_dot11CCAWatchdogTimerMin;
+++ return ( UCHAR * ) &pi->CCAWatchdogTimerMin;
+++
+++ case DOT11CCAWATCHDOGCOUNTMIN:
+++// *write_method = write_dot11CCAWatchdogCountMin;
+++ return ( UCHAR * ) &pi->CCAWatchdogCountMin;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11RegDomainsSupportedTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11RegDomainsSupportedTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method)
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &rdList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ rd = ( struct rdTbl_data * ) np->data;
+++ rName[vp->namelen + 0] = rd->ifIndex;
+++ rName[vp->namelen + 1] = rd->regDomainsSupportIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11REGDOMAINSSUPPORTVALUE:
+++ if ( rd->haveRegDomainsSupportValue ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 2 ) * sizeof ( oid ));
+++ *length = vp->namelen + 2;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11REGDOMAINSSUPPORTVALUE:
+++ return ( UCHAR * ) &rd->regDomainsSupportValue;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11AntennasListTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11AntennasListTable(struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method)
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &alList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ al = ( struct alTbl_data * ) np->data;
+++ rName[vp->namelen + 0] = al->ifIndex;
+++ rName[vp->namelen + 1] = al->antennaListIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11SUPPORTEDTXANTENNA:
+++ if ( al->haveSupportedTxAntenna ) found = TRUE; break;
+++ case DOT11SUPPORTEDRXANTENNA:
+++ if ( al->haveSupportedRxAntenna ) found = TRUE; break;
+++ case DOT11DIVERSITYSELECTIONRX:
+++ if ( al->haveDiversitySelectionRx ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 2 ) * sizeof ( oid ));
+++ *length = vp->namelen + 2;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11SUPPORTEDTXANTENNA:
+++// *write_method = write_dot11SupportedTxAntenna;
+++ return ( UCHAR * ) &al->supportedTxAntenna;
+++
+++ case DOT11SUPPORTEDRXANTENNA:
+++// *write_method = write_dot11SupportedRxAntenna;
+++ return ( UCHAR * ) &al->supportedRxAntenna;
+++
+++ case DOT11DIVERSITYSELECTIONRX:
+++// *write_method = write_dot11DiversitySelectionRx;
+++ return ( UCHAR * ) &al->diversitySelectionRx;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11SupportedDataRatesTxTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11SupportedDataRatesTxTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &rtList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ rt = ( struct rtTbl_data * ) np->data;
+++ rName[vp->namelen + 0] = rt->ifIndex;
+++ rName[vp->namelen + 1] = rt->supportedDataRatesTxIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11SUPPORTEDDATARATESTXVALUE:
+++ if ( rt->haveSupportedDataRatesTxValue ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 2 ) * sizeof ( oid ));
+++ *length = vp->namelen + 2;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11SUPPORTEDDATARATESTXVALUE:
+++ return ( UCHAR * ) &rt->supportedDataRatesTxValue;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++* var_dot11SupportedDataRatesRxTable() - *
+++* *
+++****************************************************************************/
+++unsigned char *
+++var_dot11SupportedDataRatesRxTable ( struct variable *vp,
+++ oid *name,
+++ size_t *length,
+++ int exact,
+++ size_t *var_len,
+++ WriteMethod **write_method )
+++{
+++ int found = FALSE;
+++ oid rName [ MAX_OID_LEN ]; // OID to be returned
+++
+++ loadTables();
+++ memcpy (( char * ) rName, ( char * ) vp->name, ( int ) vp->namelen * sizeof ( oid ));
+++ for ( np = LIST_FIRST ( &rrList ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ rr = ( struct rrTbl_data * ) np->data;
+++ rName[vp->namelen + 0] = rr->ifIndex;
+++ rName[vp->namelen + 1] = rr->supportedDataRatesRxIndex;
+++ if (( exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) == 0 )) ||
+++ ( !exact && ( snmp_oid_compare ( rName, vp->namelen + 2, name, *length ) > 0 ))) {
+++ switch ( vp->magic ) {
+++ case DOT11SUPPORTEDDATARATESRXVALUE:
+++ if ( rr->haveSupportedDataRatesRxValue ) found = TRUE; break;
+++ }
+++ }
+++ if ( found )
+++ break;
+++ }
+++
+++ if ( !found )
+++ return NULL;
+++
+++ memcpy (( char * ) name, ( char * ) rName, ( vp->namelen + 2 ) * sizeof ( oid ));
+++ *length = vp->namelen + 2;
+++ *var_len = sizeof ( long );
+++ *write_method = NULL;
+++
+++ switch ( vp->magic ) {
+++
+++ case DOT11SUPPORTEDDATARATESRXVALUE:
+++ return ( UCHAR * ) &rr->supportedDataRatesRxValue;
+++
+++ default:
+++ ERROR_MSG ( "" );
+++ }
+++
+++ return NULL;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11StationID(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static unsigned char string[SPRINT_MAX_LEN];
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_OCTET_STR ) {
+++ fprintf ( stderr, "write to dot11StationID not ASN_OCTET_STR\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( string )) {
+++ fprintf ( stderr,"write to dot11StationID: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11MediumOccupancyLimit(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11MediumOccupancyLimit not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11MediumOccupancyLimit: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CFPPeriod(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CFPPeriod not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CFPPeriod: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CFPMaxDuration(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CFPMaxDuration not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CFPMaxDuration: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11AuthenticationResponseTimeOut(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11AuthenticationResponseTimeOut not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11AuthenticationResponseTimeOut: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11PowerManagementMode(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11PowerManagementMode not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )) {
+++ fprintf ( stderr, "write to dot11PowerManagementMode: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11DesiredSSID(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static unsigned char string[SPRINT_MAX_LEN];
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_OCTET_STR ) {
+++ fprintf ( stderr, "write to dot11DesiredSSID not ASN_OCTET_STR\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( string )){
+++ fprintf ( stderr, "write to dot11DesiredSSID: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11DesiredBSSType(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11DesiredBSSType not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11DesiredBSSType: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11OperationalRateSet(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static unsigned char string[SPRINT_MAX_LEN];
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_OCTET_STR ) {
+++ fprintf ( stderr, "write to dot11OperationalRateSet not ASN_OCTET_STR\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( string )){
+++ fprintf ( stderr, "write to dot11OperationalRateSet: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11BeaconPeriod(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11BeaconPeriod not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11BeaconPeriod: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11DTIMPeriod(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11DTIMPeriod not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11DTIMPeriod: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11AssociationResponseTimeOut(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11AssociationResponseTimeOut not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )) {
+++ fprintf ( stderr,"write to dot11AssociationResponseTimeOut: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11AuthenticationAlgorithmsEnable(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11AuthenticationAlgorithmsEnable not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11AuthenticationAlgorithmsEnable: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11WEPDefaultKeyValue(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static unsigned char string[SPRINT_MAX_LEN];
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_OCTET_STR ) {
+++ fprintf ( stderr, "write to dot11WEPDefaultKeyValue not ASN_OCTET_STR\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( string )){
+++ fprintf ( stderr,"write to dot11WEPDefaultKeyValue: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11WEPKeyMappingAddress(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static unsigned char string[SPRINT_MAX_LEN];
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_OCTET_STR ) {
+++ fprintf ( stderr, "write to dot11WEPKeyMappingAddress not ASN_OCTET_STR\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( string )) {
+++ fprintf ( stderr,"write to dot11WEPKeyMappingAddress: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11WEPKeyMappingWEPOn(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11WEPKeyMappingWEPOn not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11WEPKeyMappingWEPOn: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11WEPKeyMappingValue(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static unsigned char string[SPRINT_MAX_LEN];
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_OCTET_STR ) {
+++ fprintf ( stderr, "write to dot11WEPKeyMappingValue not ASN_OCTET_STR\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( string )) {
+++ fprintf ( stderr, "write to dot11WEPKeyMappingValue: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11WEPKeyMappingStatus(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11WEPKeyMappingStatus not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11WEPKeyMappingStatus: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11PrivacyInvoked(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11PrivacyInvoked not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11PrivacyInvoked: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11WEPDefaultKeyID(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11WEPDefaultKeyID not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11WEPDefaultKeyID: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11WEPKeyMappingLength(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11WEPKeyMappingLength not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11WEPKeyMappingLength: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11ExcludeUnencrypted(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11ExcludeUnencrypted not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11ExcludeUnencrypted: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11RTSThreshold(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ){
+++ fprintf ( stderr, "write to dot11RTSThreshold not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11RTSThreshold: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11ShortRetryLimit(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11ShortRetryLimit not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11ShortRetryLimit: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11LongRetryLimit(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11LongRetryLimit not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11LongRetryLimit: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11FragmentationThreshold(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11FragmentationThreshold not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11FragmentationThreshold: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11MaxTransmitMSDULifetime(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11MaxTransmitMSDULifetime not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11MaxTransmitMSDULifetime: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11MaxReceiveLifetime(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11MaxReceiveLifetime not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11MaxReceiveLifetime: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11Address(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static unsigned char string[SPRINT_MAX_LEN];
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_OCTET_STR ) {
+++ fprintf ( stderr, "write to dot11Address not ASN_OCTET_STR\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( string )){
+++ fprintf ( stderr, "write to dot11Address: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11GroupAddressesStatus(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11GroupAddressesStatus not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11GroupAddressesStatus: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CurrentRegDomain(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CurrentRegDomain not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CurrentRegDomain: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CurrentTxAntenna(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CurrentTxAntenna not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CurrentTxAntenna: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CurrentRxAntenna(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CurrentRxAntenna not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11CurrentRxAntenna: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CurrentTxPowerLevel(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CurrentTxPowerLevel not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CurrentTxPowerLevel: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CurrentChannelNumber(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CurrentChannelNumber not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11CurrentChannelNumber: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CurrentDwellTime(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CurrentDwellTime not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CurrentDwellTime: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CurrentSet(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CurrentSet not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CurrentSet: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CurrentPattern(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CurrentPattern not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CurrentPattern: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CurrentIndex(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CurrentIndex not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CurrentIndex: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CurrentChannel(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CurrentChannel not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CurrentChannel: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CurrentCCAMode(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CurrentCCAMode not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11CurrentCCAMode: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11EDThreshold(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11EDThreshold not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11EDThreshold: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CCAWatchdogTimerMax(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CCAWatchdogTimerMax not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CCAWatchdogTimerMax: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CCAWatchdogCountMax(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CCAWatchdogCountMax not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CCAWatchdogCountMax: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CCAWatchdogTimerMin(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CCAWatchdogTimerMin not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CCAWatchdogTimerMin: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11CCAWatchdogCountMin(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11CCAWatchdogCountMin not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11CCAWatchdogCountMin: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11SupportedTxAntenna(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11SupportedTxAntenna not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11SupportedTxAntenna: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11SupportedRxAntenna(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11SupportedRxAntenna not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr,"write to dot11SupportedRxAntenna: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++int
+++write_dot11DiversitySelectionRx(int action,
+++ u_char *var_val,
+++ u_char var_val_type,
+++ size_t var_val_len,
+++ u_char *statP,
+++ oid *name,
+++ size_t name_len)
+++{
+++ static long *long_ret;
+++ int size;
+++
+++ switch ( action ) {
+++
+++ case RESERVE1:
+++ if ( var_val_type != ASN_INTEGER ) {
+++ fprintf ( stderr, "write to dot11DiversitySelectionRx not ASN_INTEGER\n" );
+++ return SNMP_ERR_WRONGTYPE;
+++ }
+++ if ( var_val_len > sizeof ( long_ret )){
+++ fprintf ( stderr, "write to dot11DiversitySelectionRx: bad length\n" );
+++ return SNMP_ERR_WRONGLENGTH;
+++ }
+++ break;
+++
+++ case RESERVE2:
+++ case FREE:
+++ case ACTION:
+++ case UNDO:
+++ break;
+++
+++ case COMMIT:
+++ break;
+++ }
+++
+++ return SNMP_ERR_NOERROR;
+++}
+++
+++/****************************************************************************
+++* *
+++* loadTables() - Load the Tables *
+++* *
+++****************************************************************************/
+++static void loadTables()
+++{
+++ int skfd; // generic raw socket desc
+++ struct iwreq wrq; // ioctl request structure
+++ struct ifreq ifr;
+++ struct timeval et; // elapsed time
+++ struct wireless_info info; // workarea for wireless ioctl information
+++ FILE *fp;
+++ char bfr[1024], ifName[1024];
+++ char *s, *t;
+++
+++ gettimeofday ( &et, ( struct timezone * ) 0 ); // get time-of-day
+++ if ( et.tv_sec < lastLoad + MINLOADFREQ ) // only reload so often
+++ return;
+++ lastLoad = et.tv_sec;
+++
+++ skfd = openSocket(); // open socket
+++ if ( skfd < 0 ) {
+++ syslog ( LOG_ERR, "SNMP ieee802dot11.loadTables() - %s\n", "socket open failure" );
+++ return;
+++ }
+++
+++ flushLists();
+++
+++ // find interfaces in /proc/net/dev and find the wireless interfaces
+++ fp = fopen ( PROC_NET_DEV, "r" );
+++ if ( fp ) {
+++ while ( fgets ( bfr, sizeof ( bfr ), fp )) {
+++ if ( strstr ( bfr, ":" )) {
+++ s = bfr; t = ifName;
+++ while ( isspace ( *s )) // discard white space
+++ *s++;
+++ while ( *s != ':' ) // get interface name
+++ *t++ = *s++;
+++ *t = '\0';
+++
+++ // verify as a wireless device
+++ memset (( char * ) &info, 0, sizeof ( struct wireless_info ));
+++ strncpy ( wrq.ifr_name, ifName, IFNAMSIZ );
+++ if ( ioctl ( skfd, SIOCGIWNAME, &wrq ) >= 0 ) {
+++ printf ( "%s ifName: %s\n", "loadTables() -", ifName );
+++ initStructs();
+++ loadWiExt( skfd, ifName, &info );
+++ displayWiExt ( info );
+++ load80211Structs ( skfd, ifName, &info );
+++ }
+++ }
+++ }
+++ fclose ( fp );
+++ }
+++
+++ close ( skfd );
+++}
+++
+++/****************************************************************************
+++* *
+++* load80211Structs() - load the 802.11 structures *
+++* *
+++****************************************************************************/
+++static void
+++load80211Structs ( int skfd, char *ifName, struct wireless_info *wi )
+++{
+++ int rc, ifIndex = 0;
+++ struct ifreq ifr;
+++ char MACAddress [ MACADDR_LEN + 1 ];
+++
+++ strcpy ( ifr.ifr_name, ifName );
+++ rc = ioctl ( skfd, SIOCGIFHWADDR, &ifr );
+++ if ( rc >= 0 ) {
+++
+++ sprintf ( MACAddress, "%02X:%02X:%02X:%02X:%02X:%02X\0",
+++ ( UCHAR ) ifr.ifr_hwaddr.sa_data[0], ( UCHAR ) ifr.ifr_hwaddr.sa_data[1],
+++ ( UCHAR ) ifr.ifr_hwaddr.sa_data[2], ( UCHAR ) ifr.ifr_hwaddr.sa_data[3],
+++ ( UCHAR ) ifr.ifr_hwaddr.sa_data[4], ( UCHAR ) ifr.ifr_hwaddr.sa_data[5] );
+++
+++ nSc.haveStationID = TRUE;
+++ strcpy ( nSc.stationID, MACAddress );
+++ nOp.haveMACAddress = TRUE;
+++ strcpy ( nOp.MACAddress, MACAddress );
+++ nRi.haveManufacturerOUI = TRUE;
+++ strncpy ( nRi.manufacturerOUI, MACAddress, MAN_OUI_LEN );
+++
+++ ifIndex = if_nametoindex ( ifName );
+++ if ( !ifIndex ) {
+++ syslog ( LOG_ERR, "SNMP %s - %s %s\n",
+++ "ieee802dot11.load80211Structs()", ifName, "has no ifIndex" );
+++ return;
+++ }
+++
+++ loadWiExtTo80211Structs ( ifIndex, ifName, wi );
+++
+++ if ( hasChanged (( char * ) &nSc, sizeof ( nSc ))) {
+++ nSc.ifIndex = ifIndex;
+++ sprintf ( nSc.UID, "%04d\0", nSc.ifIndex );
+++ strcpy ( nSc.ifName, ifName );
+++ addList (( char * ) &scList, ( char * ) &nSc, sizeof ( nSc ));
+++ }
+++
+++ if ( hasChanged (( char * ) &nPr, sizeof ( nPr ))) {
+++ nPr.ifIndex = ifIndex;
+++ sprintf ( nPr.UID, "%04d\0", nPr.ifIndex );
+++ strcpy ( nPr.ifName, ifName );
+++ addList (( char * ) &prList, ( char * ) &nPr, sizeof ( nPr ));
+++ }
+++
+++ if ( hasChanged (( char * ) &nOp, sizeof ( nOp ))) {
+++ nOp.ifIndex = ifIndex;
+++ sprintf ( nOp.UID, "%04d\0", nOp.ifIndex );
+++ strcpy ( nOp.ifName, ifName );
+++ addList (( char * ) &opList, ( char * ) &nOp, sizeof ( nOp ));
+++ }
+++
+++ if ( hasChanged (( char * ) &nCo, sizeof ( nCo ))) {
+++ nCo.ifIndex = ifIndex;
+++ sprintf ( nCo.UID, "%04d\0", nCo.ifIndex );
+++ strcpy ( nCo.ifName, ifName );
+++ addList (( char * ) &coList, ( char * ) &nCo, sizeof ( nCo ));
+++ }
+++
+++ if ( hasChanged (( char * ) &nRi, sizeof ( nRi ))) {
+++ nRi.ifIndex = ifIndex;
+++ sprintf ( nRi.UID, "%04d\0", nRi.ifIndex );
+++ strcpy ( nRi.ifName, ifName );
+++ addList (( char * ) &riList, ( char * ) &nRi, sizeof ( nRi ));
+++ }
+++
+++ if ( hasChanged (( char * ) &nPo, sizeof ( nPo ))) {
+++ nPo.ifIndex = ifIndex;
+++ sprintf ( nPo.UID, "%04d\0", nPo.ifIndex );
+++ strcpy ( nPo.ifName, ifName );
+++ addList (( char * ) &poList, ( char * ) &nPo, sizeof ( nPo ));
+++ }
+++
+++ if ( hasChanged (( char * ) &nPa, sizeof ( nPa ))) {
+++ nPa.ifIndex = ifIndex;
+++ sprintf ( nPa.UID, "%04d\0", nPa.ifIndex );
+++ strcpy ( nPa.ifName, ifName );
+++ addList (( char * ) &paList, ( char * ) &nPa, sizeof ( nPa ));
+++ }
+++
+++ if ( hasChanged (( char * ) &nPt, sizeof ( nPt ))) {
+++ nPt.ifIndex = ifIndex;
+++ sprintf ( nPt.UID, "%04d\0", nPt.ifIndex );
+++ strcpy ( nPt.ifName, ifName );
+++ addList (( char * ) &ptList, ( char * ) &nPt, sizeof ( nPt ));
+++ }
+++
+++ if ( hasChanged (( char * ) &nPf, sizeof ( nPf ))) {
+++ nPf.ifIndex = ifIndex;
+++ sprintf ( nPf.UID, "%04d\0", nPf.ifIndex );
+++ strcpy ( nPf.ifName, ifName );
+++ addList (( char * ) &pfList, ( char * ) &nPf, sizeof ( nPf ));
+++ }
+++
+++ if ( hasChanged (( char * ) &nPd, sizeof ( nPd ))) {
+++ nPd.ifIndex = ifIndex;
+++ sprintf ( nPd.UID, "%04d\0", nPd.ifIndex );
+++ strcpy ( nPd.ifName, ifName );
+++ addList (( char * ) &pdList, ( char * ) &nPd, sizeof ( nPd ));
+++ }
+++
+++ if ( hasChanged (( char * ) &nPi, sizeof ( nPi ))) {
+++ nPi.ifIndex = ifIndex;
+++ sprintf ( nPi.UID, "%04d\0", nPi.ifIndex );
+++ strcpy ( nPi.ifName, ifName );
+++ addList (( char * ) &piList, ( char * ) &nPi, sizeof ( nPi ));
+++ }
+++ }
+++
+++//printf ( "%s - ifIndex: %d ifName: %s UID: %s\n",
+++// "load80211Structs() - HASCHANGED", ifIndex, ifName, nSc.UID );
+++}
+++
+++/****************************************************************************
+++* *
+++* initStructs() - initialize structures *
+++* *
+++****************************************************************************/
+++static void initStructs()
+++{
+++ int i;
+++
+++ // 802.11 MIB Stuctures
+++ memset (( char * ) &nSc, 0, sizeof ( nSc )); memset (( char * ) &nAa, 0, sizeof ( nAa ));
+++ memset (( char * ) &nDf, 0, sizeof ( nDf )); memset (( char * ) &nKm, 0, sizeof ( nKm ));
+++ memset (( char * ) &nPr, 0, sizeof ( nPr )); memset (( char * ) &nOp, 0, sizeof ( nOp ));
+++ memset (( char * ) &nCo, 0, sizeof ( nCo )); memset (( char * ) &nGa, 0, sizeof ( nGa ));
+++ memset (( char * ) &nRi, 0, sizeof ( nRi )); memset (( char * ) &nPo, 0, sizeof ( nPo ));
+++ memset (( char * ) &nPa, 0, sizeof ( nPa )); memset (( char * ) &nPt, 0, sizeof ( nPt ));
+++ memset (( char * ) &nPf, 0, sizeof ( nPf )); memset (( char * ) &nPd, 0, sizeof ( nPd ));
+++ memset (( char * ) &nPi, 0, sizeof ( nPi )); memset (( char * ) &nRd, 0, sizeof ( nRd ));
+++ memset (( char * ) &nAl, 0, sizeof ( nAl )); memset (( char * ) &nRt, 0, sizeof ( nRt ));
+++ memset (( char * ) &nRr, 0, sizeof ( nRr ));
+++
+++ // Wireless Extensions
+++ wepCurrentKey = 0;
+++ haveWepCurrentKey = FALSE;
+++ for ( i = 0; i < MAX_WEP_KEYS; i++ ) {
+++ wep[i].len = 0;
+++ wep[i].key[0] = '\0';
+++ wep[i].haveKey = FALSE;
+++ }
+++}
+++
+++/****************************************************************************
+++* *
+++* Wireless Extensions Specific Functions *
+++* *
+++****************************************************************************/
+++/****************************************************************************
+++* *
+++* loadWiExtTo80211Structs() - load wireless extensions to 802.11 structures *
+++* *
+++****************************************************************************/
+++static void
+++loadWiExtTo80211Structs ( int ifIndex, char *ifName, struct wireless_info *wi )
+++{
+++ int i, j = 0;
+++
+++ // dot11Smt Group
+++ // dot11StationConfigTable
+++ nSc.havePrivacyOptionImplemented = TRUE;
+++ nSc.privacyOptionImplemented = 1; // assume we support WEP
+++
+++ if ( wi->has_power ) {
+++ nSc.havePowerManagementMode = TRUE;
+++ nSc.powerManagementMode = 1; // assume power is active
+++ if ( !wi->power.disabled &&
+++ wi->power.flags & IW_POWER_MIN )
+++ nSc.powerManagementMode = 2; // power save mode
+++ }
+++
+++ if ( wi->has_essid && strlen ( wi->essid )) {
+++ nSc.haveDesiredSSID = TRUE;
+++ strcpy ( nSc.desiredSSID, wi->essid );
+++ }
+++
+++ if ( wi->has_mode ) {
+++ nSc.haveDesiredBSSType = TRUE;
+++ if ( wi->mode == IW_MODE_ADHOC )
+++ nSc.desiredBSSType = 2; // independent
+++ else if ( wi->has_ap_addr )
+++ nSc.desiredBSSType = 1; // infrastructure
+++ else
+++ nSc.desiredBSSType = 3; // any
+++ }
+++
+++ if ( wi->has_range ) {
+++ for ( i = 0; i < wi->range.num_bitrates && j < 126; i++ ) {
+++ nSc.haveOperationalRateSet = TRUE;
+++ nSc.operationalRateSet[j++] = ( char ) ( wi->range.bitrate[i] / 500000L );
+++ }
+++ }
+++
+++ // dot11AuthenticationAlgorithmsTable
+++ nAa.haveAuthenticationAlgorithm = TRUE; // it's a rule to always have
+++ nAa.haveAuthenticationAlgorithmsEnable = TRUE; // 'open' supported
+++ nAa.ifIndex = ifIndex;
+++ nAa.authenticationAlgorithmsIndex = 1; // index number one
+++ nAa.authenticationAlgorithm = 1; // 1 => open key
+++ sprintf ( nAa.UID, "%04d%04d\0", nAa.ifIndex, nAa.authenticationAlgorithmsIndex );
+++ nAa.authenticationAlgorithmsEnable = 1; // enabled by default
+++ if ( ( wi->has_key ) &&
+++ ( wi->key_size != 0 ) &&
+++ !( wi->key_flags & IW_ENCODE_DISABLED ))
+++ nAa.authenticationAlgorithmsEnable = 2;
+++ addList (( char * ) &aaList, ( char * ) &nAa, sizeof ( nAa ));
+++
+++ nAa.haveAuthenticationAlgorithm = TRUE; // I'm gonna assume we always support WEP
+++ nAa.haveAuthenticationAlgorithmsEnable = TRUE;
+++ nAa.ifIndex = ifIndex;
+++ nAa.authenticationAlgorithmsIndex = 2; // index number 2
+++ nAa.authenticationAlgorithm = 2; // 2 => shared key
+++ sprintf ( nAa.UID, "%04d%04d\0", nAa.ifIndex, nAa.authenticationAlgorithmsIndex );
+++ nAa.authenticationAlgorithmsEnable = 2;
+++ if ( ( wi->has_key ) &&
+++ ( wi->key_size != 0 ) &&
+++ !( wi->key_flags & IW_ENCODE_DISABLED ))
+++ nAa.authenticationAlgorithmsEnable = 1; // disabled by default
+++ addList (( char * ) &aaList, ( char * ) &nAa, sizeof ( nAa ));
+++
+++ //dot11WEPDefaultKeysTable
+++ if ( wi->has_range ) {
+++ for ( i = 0; i < MAX_WEP_KEYS; i++ ) {
+++ nDf.haveWEPDefaultKeyValue = TRUE;
+++ nDf.ifIndex = ifIndex;
+++ nDf.WEPDefaultKeyIndex = i + 1; // index number
+++ sprintf ( nDf.UID, "%04d%04d\0", nDf.ifIndex, nDf.WEPDefaultKeyIndex );
+++ if ( wep[i].haveKey )
+++ strcpy ( nDf.WEPDefaultKeyValue, "*****" );
+++ else
+++ nDf.WEPDefaultKeyValue[0] = '\0';
+++ addList (( char * ) &dfList, ( char * ) &nDf, sizeof ( nDf ));
+++ }
+++ }
+++
+++ // dot11PrivacyTable
+++ nPr.havePrivacyInvoked = TRUE;
+++ nPr.privacyInvoked = 2; // 2 => FALSE
+++ nPr.haveWEPDefaultKeyID = TRUE;
+++ nPr.WEPDefaultKeyID = 0;
+++ nPr.haveExcludeUnencrypted = TRUE;
+++ nPr.excludeUnencrypted = 2; // 2 => FALSE
+++ if ( wi->has_range ) {
+++ if ( ( wi->key_size != 0 ) &&
+++ !( wi->key_flags & IW_ENCODE_DISABLED )) {
+++ nPr.privacyInvoked = 1;
+++ if ( wi->key_flags & IW_ENCODE_RESTRICTED )
+++ nPr.excludeUnencrypted = 1;
+++ nPr.WEPDefaultKeyID = wepCurrentKey;
+++ }
+++ }
+++
+++ // dot11Mac Group
+++ // dot11OperationTable
+++ if ( wi->has_range ) {
+++ nOp.haveRTSThreshold = TRUE;
+++ nOp.RTSThreshold = wi->range.max_rts;
+++ }
+++
+++ if ( wi->has_frag && wi->frag.value ) {
+++ nOp.haveFragmentationThreshold = TRUE;
+++ nOp.fragmentationThreshold = wi->frag.value;
+++ }
+++
+++ // dot11Phy Group
+++ // dot11PhyOperationTable
+++ if ( strstr ( wi->name, "IEEE 802.11-FS" )) nPo.PHYType = 1; // So what if I
+++ if ( strstr ( wi->name, "IEEE 802.11-DS" )) nPo.PHYType = 2; // made up a couple?
+++ if ( strstr ( wi->name, "IEEE 802.11-IR" )) nPo.PHYType = 3;
+++ if ( strstr ( wi->name, "IEEE 802.11-OFDM" )) nPo.PHYType = 4; // 802.11a
+++ if ( strstr ( wi->name, "IEEE 802.11-OFDM/DS" )) nPo.PHYType = 5; // 802.11g
+++ if ( strstr ( wi->name, "IEEE 802.11-TURBO" )) nPo.PHYType = 6; // Atheros TURBO mode
+++ if ( nPo.PHYType ) nPo.havePHYType = TRUE;
+++
+++ // dot11PhyDSSSTable
+++ if ( wi->has_range ) { // && wi->freq <= ( double ) 2483000000 ) { // DSSS frequencies only
+++ for ( i = 0; i < wi->range.num_frequency; i++ ) {
+++ if ((( double ) ( wi->range.freq[i].e * 10 ) * ( double ) wi->range.freq[i].m ) == wi->freq ) {
+++ nPd.haveCurrentChannel = TRUE;
+++ nPd.currentChannel = wi->range.freq[i].i;
+++ }
+++ }
+++ }
+++
+++ // dot11SupportedDataRatesTxTable
+++ if ( wi->has_range ) {
+++ for ( i = 0; i < wi->range.num_bitrates; i++ ) {
+++ nRt.ifIndex = ifIndex;
+++ nRt.supportedDataRatesTxIndex = i + 1;
+++ nRt.supportedDataRatesTxValue = wi->range.bitrate[i] / 500000L;
+++ nRt.haveSupportedDataRatesTxValue = TRUE;
+++ sprintf ( nRt.UID, "%04d%04d\0", nRt.ifIndex, nRt.supportedDataRatesTxIndex );
+++ strcpy ( nRt.ifName, ifName );
+++ addList (( char * ) &rtList, ( char * ) &nRt, sizeof ( nRt ));
+++ }
+++ }
+++
+++ // dot11SupportedDataRatesRxTable
+++ if ( wi->has_range ) {
+++ for ( i = 0; i < wi->range.num_bitrates; i++ ) {
+++ nRr.ifIndex = ifIndex;
+++ nRr.supportedDataRatesRxIndex = i + 1;
+++ nRr.supportedDataRatesRxValue = wi->range.bitrate[i] / 500000L;
+++ nRr.haveSupportedDataRatesRxValue = TRUE;
+++ sprintf ( nRr.UID, "%04d%04d\0", nRr.ifIndex, nRr.supportedDataRatesRxIndex );
+++ strcpy ( nRr.ifName, ifName );
+++ addList (( char * ) &rrList, ( char * ) &nRr, sizeof ( nRr ));
+++ }
+++ }
+++
+++//printf ( "%s max_encoding_tokens: %d\n",
+++// "loadWiExtTo80211Structs() - ", wi->range.max_encoding_tokens );
+++}
+++
+++/****************************************************************************
+++* *
+++* loadWiExt() - load wireless extensions structures; *
+++* use ioctl calls and read /proc/net/wireless *
+++* *
+++****************************************************************************/
+++static void loadWiExt ( int skfd, char *ifname, struct wireless_info *wi )
+++{
+++ struct iwreq wrq; // ioctl request structure
+++ FILE *fp;
+++ char bfr[1024];
+++ char buffer[sizeof ( iwrange ) * 2]; /* Large enough */
+++ char *s, *t;
+++ int i, j;
+++
+++ strncpy ( wrq.ifr_name, ifname, IFNAMSIZ );
+++
+++ /* Get wireless name */
+++ if ( ioctl ( skfd, SIOCGIWNAME, &wrq ) >= 0 ) {
+++ strncpy ( wi->name, wrq.u.name, IFNAMSIZ );
+++ wi->name[IFNAMSIZ] = '\0';
+++ }
+++
+++ /* Get ranges */ // NOTE: some version checking in iwlib.c
+++ memset ( buffer, 0, sizeof ( buffer ));
+++ wrq.u.data.pointer = ( caddr_t ) &buffer;
+++ wrq.u.data.length = sizeof ( buffer );
+++ wrq.u.data.flags = 0;
+++ if ( ioctl ( skfd, SIOCGIWRANGE, &wrq ) >= 0 ) {
+++ memcpy (( char * ) &wi->range, buffer, sizeof ( iwrange ));
+++ wi->has_range = 1;
+++ }
+++
+++ /* Get network ID */
+++ if ( ioctl ( skfd, SIOCGIWNWID, &wrq ) >= 0 ) {
+++ memcpy ( &wi->nwid, &wrq.u.nwid, sizeof ( iwparam ));
+++ wi->has_nwid = 1;
+++ }
+++
+++ /* Get frequency / channel */ // THIS NUMBER LOOKS FUNNY
+++ if ( ioctl ( skfd, SIOCGIWFREQ, &wrq ) >= 0 ) {
+++ wi->has_freq = 1;
+++ wi->freq = (( double ) wrq.u.freq.m ) * pow ( 10, wrq.u.freq.e );
+++ }
+++
+++ /* Get sensitivity */
+++ if ( ioctl ( skfd, SIOCGIWSENS, &wrq ) >= 0 ) {
+++ wi->has_sens = 1;
+++ memcpy ( &wi->sens, &wrq.u.sens, sizeof ( iwparam ));
+++ }
+++
+++ /* Get encryption information */
+++ wrq.u.data.pointer = ( caddr_t ) &wi->key;
+++ wrq.u.data.length = IW_ENCODING_TOKEN_MAX;
+++ wrq.u.data.flags = 0;
+++ if ( ioctl ( skfd, SIOCGIWENCODE, &wrq ) >= 0 ) {
+++ wi->has_key = 1;
+++ wi->key_size = wrq.u.data.length;
+++ wi->key_flags = wrq.u.data.flags;
+++ wepCurrentKey = wrq.u.data.flags & IW_ENCODE_INDEX;
+++ }
+++
+++ for ( i = 0; i < wi->range.max_encoding_tokens; i++ ) {
+++ wrq.u.data.pointer = ( caddr_t ) &wi->key;
+++ wrq.u.data.length = IW_ENCODING_TOKEN_MAX;
+++ wrq.u.data.flags = i;
+++ if ( ioctl ( skfd, SIOCGIWENCODE, &wrq ) >= 0 ) {
+++ if ( ( wrq.u.data.length != 0 ) &&
+++ !( wrq.u.data.flags & IW_ENCODE_DISABLED )) {
+++ wep[i].len = wrq.u.data.length;
+++ wep[i].haveKey = TRUE;
+++ t = wep[i].key;
+++ for ( j = 0; j < wrq.u.data.length; j++ ) {
+++ if (( j & 0x1 ) == 0 && j != 0 )
+++ strcpy ( t++, "-");
+++ sprintf ( t, "%.2X", wi->key[j] );
+++ t += 2;
+++ }
+++ t = '\0';
+++ }
+++ }
+++ }
+++
+++ /* Get ESSID */
+++ wrq.u.essid.pointer = ( caddr_t ) &wi->essid;
+++ wrq.u.essid.length = IW_ESSID_MAX_SIZE + 1;
+++ wrq.u.essid.flags = 0;
+++ if ( ioctl ( skfd, SIOCGIWESSID, &wrq ) >= 0 ) {
+++ wi->has_essid = 1;
+++ wi->essid_on = wrq.u.data.flags;
+++ }
+++
+++ /* Get AP address */
+++ if ( ioctl ( skfd, SIOCGIWAP, &wrq ) >= 0 ) {
+++ wi->has_ap_addr = 1;
+++ memcpy ( &wi->ap_addr, &wrq.u.ap_addr, sizeof ( sockaddr ));
+++ }
+++
+++ /* Get NickName */
+++ wrq.u.essid.pointer = ( caddr_t ) &wi->nickname;
+++ wrq.u.essid.length = IW_ESSID_MAX_SIZE + 1;
+++ wrq.u.essid.flags = 0;
+++ if ( ioctl ( skfd, SIOCGIWNICKN, &wrq ) >= 0 ) {
+++ if ( wrq.u.data.length > 1 )
+++ wi->has_nickname = 1;
+++ }
+++
+++ /* Get bit rate */
+++ if ( ioctl ( skfd, SIOCGIWRATE, &wrq ) >= 0 ) {
+++ wi->has_bitrate = 1;
+++ memcpy ( &wi->bitrate, &wrq.u.bitrate, sizeof ( iwparam ));
+++ }
+++
+++ /* Get RTS threshold */
+++ if ( ioctl ( skfd, SIOCGIWRTS, &wrq ) >= 0 ) {
+++ wi->has_rts = 1;
+++ memcpy ( &wi->rts, &wrq.u.rts, sizeof ( iwparam ));
+++ }
+++
+++ /* Get fragmentation threshold */
+++ if ( ioctl ( skfd, SIOCGIWFRAG, &wrq ) >= 0 ) {
+++ wi->has_frag = 1;
+++ memcpy ( &wi->frag, &wrq.u.frag, sizeof ( iwparam ));
+++ }
+++
+++ /* Get operation mode */
+++ if ( ioctl ( skfd, SIOCGIWMODE, &wrq ) >= 0 ) {
+++ wi->mode = wrq.u.mode;
+++ if ( wi->mode < IW_NUM_OPER_MODE && wi->mode >= 0 )
+++ wi->has_mode = 1;
+++ }
+++
+++ /* Get Power Management settings */ // #if WIRELESS_EXT > 9
+++ wrq.u.power.flags = 0;
+++ if ( ioctl ( skfd, SIOCGIWPOWER, &wrq ) >= 0 ) {
+++ wi->has_power = 1;
+++ memcpy ( &wi->power, &wrq.u.power, sizeof ( iwparam ));
+++ }
+++
+++ /* Get retry limit/lifetime */ // #if WIRELESS_EXT > 10
+++ if ( ioctl ( skfd, SIOCGIWRETRY, &wrq ) >= 0 ) {
+++ wi->has_retry = 1;
+++ memcpy ( &wi->retry, &wrq.u.retry, sizeof ( iwparam ));
+++ }
+++
+++ /* Get stats */ // #if WIRELESS_EXT > 11
+++ wrq.u.data.pointer = ( caddr_t ) &wi->stats;
+++ wrq.u.data.length = 0;
+++ wrq.u.data.flags = 1; /* Clear updated flag */
+++ if ( ioctl ( skfd, SIOCGIWSTATS, &wrq ) < 0 )
+++ wi->has_stats = 1;
+++
+++ if ( !wi->has_stats ) { // no ioctl support, go to file
+++ fp = fopen ( PROC_NET_WIRELESS, "r" );
+++ if ( fp ) {
+++ while ( fgets ( bfr, sizeof ( bfr ), fp )) {
+++ bfr [ sizeof ( bfr ) - 1 ] = '\0'; // no buffer overruns here!
+++ strtok (( char * ) &bfr, "\n" ); // '\n' => '\0'
+++ if ( strstr ( bfr, ifname ) && strstr ( bfr, ":" )) {
+++ wi->has_stats = 1;
+++ s = bfr;
+++ s = strchr ( s, ':' ); s++; /* Skip ethX: */
+++ s = strtok ( s, " " ); /* ' ' => '\0' */
+++ sscanf ( s, "%X", &wi->stats.status ); // status
+++
+++ s = strtok ( NULL, " " ); // link quality
+++ if ( strchr ( s, '.' ) != NULL )
+++ wi->stats.qual.updated |= 1;
+++ sscanf ( s, "%d", &wi->stats.qual.qual );
+++
+++ s = strtok ( NULL, " " ); // signal level
+++ if ( strchr ( s,'.' ) != NULL )
+++ wi->stats.qual.updated |= 2;
+++ sscanf ( s, "%d", &wi->stats.qual.level );
+++
+++ s = strtok ( NULL, " " ); // noise level
+++ if ( strchr ( s, '.' ) != NULL )
+++ wi->stats.qual.updated += 4;
+++ sscanf ( s, "%d", &wi->stats.qual.noise );
+++
+++ s = strtok ( NULL, " " ); sscanf ( s, "%d", &wi->stats.discard.nwid );
+++ s = strtok ( NULL, " " ); sscanf ( s, "%d", &wi->stats.discard.code );
+++ s = strtok ( NULL, " " ); sscanf ( s, "%d", &wi->stats.discard.fragment );
+++ s = strtok ( NULL, " " ); sscanf ( s, "%d", &wi->stats.discard.retries );
+++ s = strtok ( NULL, " " ); sscanf ( s, "%d", &wi->stats.discard.misc );
+++ s = strtok ( NULL, " " ); sscanf ( s, "%d", &wi->stats.miss.beacon );
+++ }
+++ }
+++ fclose ( fp );
+++ }
+++ }
+++
+++// printf ( "%s bfr: %s\n", "loadTables()", bfr );
+++}
+++
+++/****************************************************************************
+++* *
+++* displayWiExt() - show what I got from Wireless Extensions *
+++* *
+++****************************************************************************/
+++static void displayWiExt ( struct wireless_info info )
+++{
+++#ifdef DISPLAYWIEXT
+++ int i;
+++ char title[] = "displayWiExt() -";
+++
+++ printf ( "========================================\n" );
+++ printf ( "===> Wireless Extension IOCTL calls <===\n" );
+++ printf ( "========================================\n" );
+++
+++ if ( strlen ( info.name ))
+++ printf ( "%s name: %s\n", "SIOCGIWNAME", info.name );
+++ else
+++ printf ( "%s\n", "no info.name support" );
+++
+++ if ( info.has_nickname = 1 )
+++ printf ( "%s nickname: %s\n", "SIOCGIWNICKN", info.nickname );
+++ else
+++ printf ( "%s %s\n", "SIOCGIWNICKN", " ===> no info.nickname support" );
+++
+++ if ( info.has_essid )
+++ printf ( "%s essid_on: %d essid: %s\n", "SIOCGIWESSID", info.essid_on, info.essid );
+++ else
+++ printf ( "%s %s\n", "SIOCGIWESSID", " ===> no info.essid support" );
+++
+++ if ( info.has_range ) {
+++ printf ( "%s throughput: %d\n", "SIOCGIWRANGE", info.range.throughput );
+++ printf ( "%s min_nwid: %d\n", "SIOCGIWRANGE", info.range.min_nwid );
+++ printf ( "%s max_nwid: %d\n", "SIOCGIWRANGE", info.range.max_nwid );
+++ printf ( "%s sensitivity: %d\n", "SIOCGIWRANGE", info.range.sensitivity );
+++ printf ( "%s num_bitrates: %d\n", "SIOCGIWRANGE", info.range.num_bitrates );
+++ for ( i = 0; i < info.range.num_bitrates; i++ )
+++ printf ( "%s bitrate[%d]: %d\n", "SIOCGIWRANGE", i, info.range.bitrate[i] );
+++ printf ( "%s min_rts: %d\n", "SIOCGIWRANGE", info.range.min_rts );
+++ printf ( "%s max_rts: %d\n", "SIOCGIWRANGE", info.range.max_rts );
+++ printf ( "%s min_frag: %d\n", "SIOCGIWRANGE", info.range.min_frag );
+++ printf ( "%s max_frag: %d\n", "SIOCGIWRANGE", info.range.max_frag );
+++ printf ( "%s min_pmp: %d\n", "SIOCGIWRANGE", info.range.min_pmp );
+++ printf ( "%s max_pmp: %d\n", "SIOCGIWRANGE", info.range.max_pmp );
+++ printf ( "%s min_pmt: %d\n", "SIOCGIWRANGE", info.range.min_pmt );
+++ printf ( "%s max_pmt: %d\n", "SIOCGIWRANGE", info.range.max_pmt );
+++ printf ( "%s pmp_flags: %d\n", "SIOCGIWRANGE", info.range.pmp_flags );
+++ printf ( "%s pmt_flags: %d\n", "SIOCGIWRANGE", info.range.pmt_flags );
+++ printf ( "%s pm_capa: %d\n", "SIOCGIWRANGE", info.range.pm_capa );
+++ printf ( "%s num_encoding_sizes: %d\n", "SIOCGIWRANGE", info.range.num_encoding_sizes );
+++ for ( i = 0; i < info.range.num_encoding_sizes; i++ )
+++ printf ( "%s encoding_size[%d]: %d\n", "SIOCGIWRANGE", i, info.range.encoding_size[i] );
+++ printf ( "%s max_encoding_tokens: %d\n", "SIOCGIWRANGE", info.range.max_encoding_tokens );
+++// printf ( "%s encoding_login_index: %d\n", "SIOCGIWRANGE", info.range.encoding_login_index );
+++ printf ( "%s txpower_capa: %d\n", "SIOCGIWRANGE", info.range.txpower_capa );
+++ printf ( "%s num_txpower: %d dBm\n", "SIOCGIWRANGE", info.range.num_txpower );
+++ for ( i = 0; i < info.range.num_txpower; i++ )
+++ printf ( "%s txpower[%d]: %d\n", "SIOCGIWRANGE", i, info.range.txpower[i] );
+++ printf ( "%s we_version_compiled: %d\n", "SIOCGIWRANGE", info.range.we_version_compiled );
+++ printf ( "%s we_version_source: %d\n", "SIOCGIWRANGE", info.range.we_version_source );
+++ printf ( "%s retry_capa: %d\n", "SIOCGIWRANGE", info.range.retry_capa );
+++ printf ( "%s retry_flags: %d\n", "SIOCGIWRANGE", info.range.retry_flags );
+++ printf ( "%s r_time_flags: %d\n", "SIOCGIWRANGE", info.range.r_time_flags );
+++ printf ( "%s min_retry: %d\n", "SIOCGIWRANGE", info.range.min_retry );
+++ printf ( "%s max_retry: %d\n", "SIOCGIWRANGE", info.range.max_retry );
+++ printf ( "%s min_r_time: %d\n", "SIOCGIWRANGE", info.range.min_r_time );
+++ printf ( "%s max_r_time: %d\n", "SIOCGIWRANGE", info.range.max_r_time );
+++ printf ( "%s num_channels: %d\n", "SIOCGIWRANGE", info.range.num_channels );
+++ printf ( "%s num_frequency: %d\n", "SIOCGIWRANGE", info.range.num_frequency );
+++ for ( i = 0; i < info.range.num_frequency; i++ )
+++ printf ( "%s freq[%d].i: %d freq[%d].e: %d freq[%d].m: %d\n", "SIOCGIWRANGE",
+++ i, info.range.freq[i].i, i, info.range.freq[i].e, i, info.range.freq[i].m );
+++ }
+++ else
+++ printf ( "%s %s\n", "SIOCGIWRANGE", " ===> no info.range support" );
+++
+++ if ( info.has_nwid )
+++ printf ( "%s nwid - disabled: %d value: %X\n", "SIOCGIWNWID", info.nwid.disabled, info.nwid.value );
+++ else
+++ printf ( "%s %s\n", "SIOCGIWNWID", " ===> no info.nwid support" );
+++
+++ if ( info.has_freq ) {
+++// printf ( "%s freq: %g\n", "SIOCGIWFREQ", info.freq / GIGA );
+++ printf ( "%s freq: %g\n", "SIOCGIWFREQ", info.freq );
+++ }
+++ else
+++ printf ( "%s %s\n", "SIOCGIWFREQ", " ===> no info.freq support" );
+++
+++ if ( info.has_sens )
+++ printf ( "%s sens: %d\n", "SIOCGIWSENS", info.sens );
+++ else
+++ printf ( "%s %s\n", "SIOCGIWSENS", " ===> no info.sens support" );
+++
+++ if ( info.has_key ) {
+++ printf ( "%s key_size: %d key_flags: %d wepCurrentKey: %d\n",
+++ "SIOCGIWENCODE", info.key_size, info.key_flags, wepCurrentKey );
+++ printf ( "%s MODE: %d DISABLED: %d INDEX: %d OPEN: %d RESTRICTED: %d NOKEY: %d TEMP: %d\n",
+++ "SIOCGIWENCODE", info.key_flags & IW_ENCODE_MODE,
+++ info.key_flags & IW_ENCODE_DISABLED ? 1:0, info.key_flags & IW_ENCODE_INDEX,
+++ info.key_flags & IW_ENCODE_OPEN ? 1:0, info.key_flags & IW_ENCODE_RESTRICTED ? 1:0,
+++ info.key_flags & IW_ENCODE_NOKEY ? 1:0, info.key_flags & IW_ENCODE_TEMP ? 1:0 );
+++ }
+++ else
+++ printf ( "%s %s\n", "SIOCGIWENCODE", " ===> no info.key support" );
+++
+++ for ( i = 0; i < MAX_WEP_KEYS; i++ ) {
+++ if ( wep[i].haveKey )
+++ printf ( "%s wep[%d].len: %d wep[%d].key: %s\n",
+++ "SIOCGIWENCODE", i, wep[i].len, i, wep[i].key );
+++ }
+++
+++ if ( info.has_ap_addr )
+++ printf ( "%s ap_addr.sa_data: %02X:%02X:%02X:%02X:%02X:%02X ap_addr.sa_family: %d\n",
+++ "SIOCGIWAP", ( UCHAR ) info.ap_addr.sa_data[0], ( UCHAR ) info.ap_addr.sa_data[1],
+++ ( UCHAR ) info.ap_addr.sa_data[2], ( UCHAR ) info.ap_addr.sa_data[3],
+++ ( UCHAR ) info.ap_addr.sa_data[4], ( UCHAR ) info.ap_addr.sa_data[5],
+++ info.ap_addr.sa_family );
+++ else
+++ printf ( "%s %s\n", "SIOCGIWAP", " ===> no ap_addr information" );
+++
+++ if ( info.has_bitrate )
+++ printf ( "%s bitrate: %d value: %d fixed: %d disabled: %d flags: %d\n",
+++ "SIOCGIWRATE", info.bitrate, info.bitrate.value, info.bitrate.fixed,
+++ info.bitrate.disabled, info.bitrate.flags );
+++ else
+++ printf ( "%s %s\n", "SIOCGIWRATE", " ===> no info.bitrate support" );
+++
+++ if ( info.has_rts )
+++ printf ( "%s rts: %d\n", "SIOCGIWRTS", info.rts );
+++ else
+++ printf ( "%s %s\n", "SIOCGIWRTS", " ===> no info.rts support" );
+++
+++ if ( info.has_frag )
+++ printf ( "%s frag: %d\n", "SIOCGIWFRAG", info.frag );
+++ else
+++ printf ( "%s %s\n", "SIOCGIWFRAG", " ===> no info.frag support" );
+++
+++ if ( info.has_mode )
+++ printf ( "%s mode: %d\n", "SIOCGIWMODE", info.mode );
+++ else
+++ printf ( "%s %s\n", "SIOCGIWMODE", " ===> no info.mode support" );
+++
+++ if ( info.has_power ) {
+++ printf ( "%s power: %d\n", "SIOCGIWPOWER", info.power );
+++ printf ( "%s disabled: %d MIN: %d MAX: %d TIMEOUT: %d RELATIVE: %d\n",
+++ "SIOCGIWPOWER",
+++ info.power.disabled ? 1:0,
+++ info.power.flags & IW_POWER_MIN ? 1:0,
+++ info.power.flags & IW_POWER_MAX ? 1:0,
+++ info.power.flags & IW_POWER_TIMEOUT ? 1:0,
+++ info.power.flags & IW_POWER_RELATIVE ? 1:0 );
+++ printf ( "%s UNICAST: %d MULTICAST: %d ALL: %d FORCE: %d REPEATER: %d\n",
+++ "SIOCGIWPOWER",
+++ info.power.flags & IW_POWER_UNICAST_R ? 1:0,
+++ info.power.flags & IW_POWER_MULTICAST_R ? 1:0,
+++ info.power.flags & IW_POWER_ALL_R ? 1:0,
+++ info.power.flags & IW_POWER_FORCE_S ? 1:0,
+++ info.power.flags & IW_POWER_REPEATER ? 1:0 );
+++ }
+++ else
+++ printf ( "%s %s\n", "SIOCGIWPOWER", " ===> no info.power support" );
+++
+++ if ( info.has_retry )
+++ printf ( "%s retry: %d\n", "SIOCGIWRETRY", info.retry );
+++ else
+++ printf ( "%s %s\n", "SIOCGIWRETRY", " ===> no info.retry support" );
+++
+++ if ( info.has_stats ) {
+++ printf ( "%s status: %d\n", "SIOCGIWSTATS", info.stats.status );
+++ printf ( "%s qual.level: %d\n", "SIOCGIWSTATS", info.stats.qual.level );
+++ printf ( "%s qual.noise: %d\n", "SIOCGIWSTATS", info.stats.qual.noise );
+++ printf ( "%s qual.qual: %d\n", "SIOCGIWSTATS", info.stats.qual.qual );
+++ printf ( "%s qual.updated: %d\n", "SIOCGIWSTATS", info.stats.qual.updated );
+++ printf ( "%s discard.code: %d\n", "SIOCGIWSTATS", info.stats.discard.code );
+++ printf ( "%s discard.fragment: %d\n", "SIOCGIWSTATS", info.stats.discard.fragment );
+++ printf ( "%s discard.misc: %d\n", "SIOCGIWSTATS", info.stats.discard.misc );
+++ printf ( "%s discard.nwid: %d\n", "SIOCGIWSTATS", info.stats.discard.nwid );
+++ printf ( "%s discard.retries: %d\n", "SIOCGIWSTATS", info.stats.discard.retries );
+++ printf ( "%s miss.beacon: %d\n", "SIOCGIWSTATS", info.stats.miss.beacon );
+++ }
+++ else
+++ printf ( "%s %s\n", "SIOCGIWSTATS", " ===> no info.stats support" );
+++
+++ if ( info.txpower.flags & IW_TXPOW_MWATT )
+++ printf ( "%s txpower1: %d dBm disabled: %d fixed: %d flags: %d\n", "SIOCGIWRANGE",
+++ mWatt2dbm ( info.txpower.value ), info.txpower.disabled, info.txpower.fixed, info.txpower.flags);
+++ else
+++ printf ( "%s txpower2: %d dBm disabled: %d fixed: %d flags: %d\n", "SIOCGIWRANGE", info.txpower.value, info.txpower.disabled, info.txpower.fixed, info.txpower.flags );
+++
+++ if ( info.has_range )
+++ if ( info.sens.value < 0 )
+++ printf ( "%s sens: %d dBm\n", "SIOCGIWRANGE", info.sens.value );
+++ else
+++ printf ( "%s sens: %d/%d\n", "SIOCGIWRANGE", info.sens.value, info.range.sensitivity );
+++
+++ if ( info.has_range && ( info.stats.qual.level != 0 ))
+++ if ( info.stats.qual.level > info.range.max_qual.level )
+++ /* Statistics are in dBm (absolute power measurement) */
+++ printf ( "%s Quality: %d/%d Signal level: %d dBm Noise level: %d dBm\n",
+++ "SIOCGIWRANGE",
+++ info.stats.qual.qual, info.range.max_qual.qual,
+++ info.stats.qual.level - 0x100,
+++ info.stats.qual.noise - 0x100 );
+++ else
+++ printf ( "%s Quality: %d/%d Signal level: %d/%d Noise level: %d/%d",
+++ "SIOCGIWRANGE",
+++ info.stats.qual.qual, info.range.max_qual.qual,
+++ info.stats.qual.level, info.range.max_qual.level,
+++ info.stats.qual.noise, info.range.max_qual.noise );
+++
+++#endif // #ifdef DISPLAYWIEXT
+++}
+++
+++/****************************************************************************
+++* *
+++* Linked List Functions *
+++* *
+++****************************************************************************/
+++/****************************************************************************
+++* *
+++* addList() - add an entry to a linked list *
+++* *
+++****************************************************************************/
+++static void
+++addList ( char *l, char *data, int len )
+++{
+++ char uid[256];
+++ LIST_HEAD ( , avNode ) *list;
+++
+++ // NOTE: this assumes the UID is at the begining of the
+++ // data structure and that UIDs are strings
+++
+++ list = ( LIST_HEAD ( , avNode ) * ) l; // NOTE: don't know how to get
+++ strcpy ( uid, data ); // rid of compiler warning on
+++ // LISTHEAD typecast
+++ // create a new node and the data that goes in it
+++ newNode = malloc ( sizeof ( struct avNode ));
+++ newNode->data = malloc ( len );
+++ memcpy ( newNode->data, data, len );
+++
+++ // this deals with an empty list
+++ if ( LIST_EMPTY ( list )) {
+++ LIST_INSERT_HEAD ( list, newNode, nodes );
+++ return;
+++ }
+++
+++ // this deals with UIDs that match
+++ for ( np = LIST_FIRST ( list ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ if ( strncmp ( uid, np->data, strlen ( uid )) == 0 ) { // found matching UID
+++ LIST_INSERT_AFTER ( np, newNode, nodes );
+++ if ( np->data )
+++ free ( np->data );
+++ LIST_REMOVE ( np, nodes );
+++ free ( np );
+++ return;
+++ }
+++ }
+++
+++ // this deals with inserting a new UID in the list
+++ for ( np = LIST_FIRST ( list ); np != NULL; np = LIST_NEXT ( np, nodes )) {
+++ lastNode = np;
+++ if ( strncmp ( np->data, uid, strlen ( uid )) > 0 ) { // old ID > new ID AND
+++ LIST_INSERT_BEFORE ( np, newNode, nodes );
+++ return;
+++ }
+++ }
+++
+++ // this deals with a UID that needs to go on the end of the list
+++ LIST_INSERT_AFTER ( lastNode, newNode, nodes );
+++
+++ return;
+++}
+++
+++/****************************************************************************
+++* *
+++* initLists() - initialize all the linked lists *
+++* *
+++****************************************************************************/
+++static void initLists()
+++{
+++ LIST_INIT ( &scList ); LIST_INIT ( &aaList ); LIST_INIT ( &dfList );
+++ LIST_INIT ( &kmList ); LIST_INIT ( &prList );
+++ LIST_INIT ( &opList ); LIST_INIT ( &coList );
+++ LIST_INIT ( &gaList ); LIST_INIT ( &riList ); LIST_INIT ( &poList );
+++ LIST_INIT ( &paList ); LIST_INIT ( &ptList ); LIST_INIT ( &pfList );
+++ LIST_INIT ( &pdList ); LIST_INIT ( &piList ); LIST_INIT ( &rdList );
+++ LIST_INIT ( &alList ); LIST_INIT ( &rtList ); LIST_INIT ( &rrList );
+++}
+++/****************************************************************************
+++* *
+++* flushLists() - flush all linked lists *
+++* *
+++****************************************************************************/
+++static void flushLists()
+++{
+++ flushList (( char * ) &scList ); flushList (( char * ) &aaList );
+++ flushList (( char * ) &dfList ); flushList (( char * ) &kmList );
+++ flushList (( char * ) &prList );
+++ flushList (( char * ) &opList ); flushList (( char * ) &coList );
+++ flushList (( char * ) &gaList ); flushList (( char * ) &riList );
+++ flushList (( char * ) &poList ); flushList (( char * ) &paList );
+++ flushList (( char * ) &ptList ); flushList (( char * ) &pfList );
+++ flushList (( char * ) &pdList ); flushList (( char * ) &piList );
+++ flushList (( char * ) &rdList ); flushList (( char * ) &alList );
+++ flushList (( char * ) &rtList ); flushList (( char * ) &rrList );
+++}
+++
+++/****************************************************************************
+++* *
+++* flushList() - flush a linked list *
+++* *
+++****************************************************************************/
+++static void flushList ( char *l )
+++{
+++ LIST_HEAD ( , avNode ) *list;
+++
+++ list = ( LIST_HEAD ( , avNode ) * ) l; // NOTE: don't know how to get
+++ while ( !LIST_EMPTY ( list )) { // rid of compiler warning on
+++ np = LIST_FIRST ( list ); // LISTHEAD typecast
+++ if ( np->data )
+++ free ( np->data );
+++ LIST_REMOVE ( np, nodes );
+++ free ( np );
+++ }
+++}
+++
+++/****************************************************************************
+++* *
+++* Utility Functions *
+++* *
+++****************************************************************************/
+++/****************************************************************************
+++* *
+++* The following two routines were taken directly from iwlib.c *
+++* *
+++****************************************************************************/
+++ /*
+++ * Open a socket.
+++ * Depending on the protocol present, open the right socket. The socket
+++ * will allow us to talk to the driver.
+++ */
+++static int openSocket ( void )
+++{
+++ static const int families[] = {
+++ AF_INET, AF_IPX, AF_AX25, AF_APPLETALK
+++ };
+++ unsigned int i;
+++ int sock;
+++
+++ /*
+++ * Now pick any (exisiting) useful socket family for generic queries
+++ * Note : don't open all the socket, only returns when one matches,
+++ * all protocols might not be valid.
+++ * Workaround by Jim Kaba <jkaba@sarnoff.com>
+++ * Note : in 99% of the case, we will just open the inet_sock.
+++ * The remaining 1% case are not fully correct...
+++ */
+++
+++ /* Try all families we support */
+++ for(i = 0; i < sizeof(families)/sizeof(int); ++i) {
+++ /* Try to open the socket, if success returns it */
+++ sock = socket(families[i], SOCK_DGRAM, 0);
+++ if(sock >= 0)
+++ return sock;
+++ }
+++
+++ return -1;
+++}
+++
+++/*------------------------------------------------------------------*/
+++/*
+++ * Convert a value in milliWatt to a value in dBm.
+++ */
+++static int mWatt2dbm ( int in )
+++{
+++#ifdef WE_NOLIBM
+++ /* Version without libm : slower */
+++ double fin = (double) in;
+++ int res = 0;
+++
+++ /* Split integral and floating part to avoid accumulating rounding errors */
+++ while(fin > 10.0)
+++ {
+++ res += 10;
+++ fin /= 10.0;
+++ }
+++ while(fin > 1.000001) /* Eliminate rounding errors, take ceil */
+++ {
+++ res += 1;
+++ fin /= LOG10_MAGIC;
+++ }
+++ return(res);
+++#else /* WE_NOLIBM */
+++ /* Version with libm : faster */
+++ return((int) (ceil(10.0 * log10((double) in))));
+++#endif /* WE_NOLIBM */
+++}
+++
+++/****************************************************************************
+++* *
+++* htob - converts hex string to binary *
+++* *
+++****************************************************************************/
+++static char *htob ( char *s )
+++{
+++ char nibl, *byt;
+++ static char bin[20];
+++
+++ byt = bin;
+++
+++ while ((nibl = *s++) && nibl != ' ') { /* While not end of string. */
+++ nibl -= ( nibl > '9') ? ('A' - 10): '0';
+++ *byt = nibl << 4; /* place high nibble */
+++ if((nibl = *s++) && nibl != ' ') {
+++ nibl -= ( nibl > '9') ? ('A' - 10): '0';
+++ *byt |= nibl; /* place low nibble */
+++ }
+++ else break;
+++ ++byt;
+++ }
+++ *++byt = '\0';
+++ return ( bin );
+++}
+++
+++/****************************************************************************
+++* *
+++* hasChanged() - see if area has been changed from NULLs *
+++* *
+++****************************************************************************/
+++static int hasChanged ( char *loc, int len )
+++{
+++ char *wrk;
+++ int changed = TRUE;
+++
+++ wrk = malloc ( len );
+++ memset ( wrk, 0, len );
+++ if ( memcmp ( loc, wrk, len ) == 0 )
+++ changed = FALSE;
+++ free ( wrk );
+++
+++ return ( changed );
+++}
+++
++--- /dev/null
+++++ b/agent/mibgroup/ieee802dot11.h
++@@ -0,0 +1,730 @@
+++/****************************************************************************
+++* *
+++* File Name: ieee802dot11.h *
+++* Used By: *
+++* *
+++* Operating System: *
+++* Purpose: *
+++* *
+++* Comments: *
+++* *
+++* Author: Larry Simmons *
+++* lsimmons@avantcom.com *
+++* www.avantcom.com *
+++* *
+++* Creation Date: 09/02/03 *
+++* *
+++* Ver Date Inits Modification *
+++* ----- -------- ----- ------------ *
+++* 0.0.1 09/02/03 LRS created *
+++* 0.0.2 09/24/03 LRS wouldn't build after fresh ./configure *
+++****************************************************************************/
+++/* This file was generated by mib2c and is intended for use as a mib module
+++ for the ucd-snmp snmpd agent. */
+++#ifndef _MIBGROUP_IEEE802DOT11_H
+++#define _MIBGROUP_IEEE802DOT11_H
+++/* we may use header_generic and header_simple_table from the util_funcs module */
+++
+++/****************************************************************************
+++* Includes *
+++****************************************************************************/
+++#include <sys/queue.h>
+++
+++/****************************************************************************
+++* Linked List Defines *
+++****************************************************************************/
+++// here are some Linked List MACROS I wanted to use,
+++// but curiously were not in /usr/includes/sys/queue.h
+++
+++#ifndef LIST_EMPTY
+++ #define LIST_EMPTY(head) ((head)->lh_first == NULL)
+++#endif
+++
+++#ifndef LIST_NEXT
+++ #define LIST_NEXT(elm, field) ((elm)->field.le_next)
+++#endif
+++
+++#ifndef LIST_INSERT_BEFORE
+++ #define LIST_INSERT_BEFORE(listelm, elm, field) do { \
+++ (elm)->field.le_prev = (listelm)->field.le_prev; \
+++ LIST_NEXT((elm), field) = (listelm); \
+++ *(listelm)->field.le_prev = (elm); \
+++ (listelm)->field.le_prev = &LIST_NEXT((elm), field); \
+++ } while (0)
+++#endif
+++
+++#ifndef LIST_FIRST
+++ #define LIST_FIRST(head) ((head)->lh_first)
+++#endif
+++
+++/****************************************************************************
+++* 802.11 MIB Defines *
+++****************************************************************************/
+++#define SYS_STRING_LEN 256
+++#define MACADDR_LEN ( 6 * 2 ) + 5
+++#define OPER_RATE_SET_LEN 126
+++#define MAN_OUI_LEN ( 3 * 2 ) + 2
+++#define WEP_STR_LEN 64
+++#define SNMP_STR_LEN 128
+++#define TEXT_LEN 80
+++#define IFINDEX_LEN 4
+++#define IFNAME_LEN 16
+++#define MAX_WEP_KEYS 4
+++
+++#define AUTHENICATION_ALGORITHMS_INDEX_LEN 4
+++#define WEP_DEFAULT_KEY_INDEX_LEN 4
+++#define WEP_KEY_MAPPING_INDEX_LEN 4
+++#define GROUP_ADDRESS_INDEX_LEN 4
+++#define REG_DOMAIN_SUPPORT_INDEX_LEN 4
+++#define ANTENNA_LIST_INDEX_LEN 4
+++#define SUPPORTED_DATA_RATES_TX_INDEX_LEN 4
+++#define SUPPORTED_DATA_RATES_RX_INDEX_LEN 4
+++
+++#define SC_UID_LEN IFINDEX_LEN
+++#define AA_UID_LEN IFINDEX_LEN + AUTHENICATION_ALGORITHMS_INDEX_LEN
+++#define DF_UID_LEN IFINDEX_LEN + WEP_DEFAULT_KEY_INDEX_LEN
+++#define KM_UID_LEN IFINDEX_LEN + WEP_KEY_MAPPING_INDEX_LEN
+++#define PR_UID_LEN IFINDEX_LEN
+++#define OP_UID_LEN IFINDEX_LEN
+++#define CO_UID_LEN IFINDEX_LEN
+++#define GA_UID_LEN IFINDEX_LEN + GROUP_ADDRESS_INDEX_LEN
+++#define RI_UID_LEN IFINDEX_LEN
+++#define PO_UID_LEN IFINDEX_LEN
+++#define PA_UID_LEN IFINDEX_LEN
+++#define PT_UID_LEN IFINDEX_LEN
+++#define PF_UID_LEN IFINDEX_LEN
+++#define PD_UID_LEN IFINDEX_LEN
+++#define PI_UID_LEN IFINDEX_LEN
+++#define RD_UID_LEN IFINDEX_LEN + REG_DOMAIN_SUPPORT_INDEX_LEN
+++#define AL_UID_LEN IFINDEX_LEN + ANTENNA_LIST_INDEX_LEN
+++#define RT_UID_LEN IFINDEX_LEN + SUPPORTED_DATA_RATES_TX_INDEX_LEN
+++#define RR_UID_LEN IFINDEX_LEN + SUPPORTED_DATA_RATES_RX_INDEX_LEN
+++
+++/****************************************************************************
+++* Linked List Structure *
+++****************************************************************************/
+++static struct avNode {
+++ LIST_ENTRY ( avNode ) nodes;
+++ char *data; // pointer to data
+++};
+++
+++typedef LIST_HEAD ( , avNode ) avList_t;
+++
+++/****************************************************************************
+++* 802.11 MIB structures *
+++****************************************************************************/
+++/****************************************************************************
+++* dot11Smt Group *
+++****************************************************************************/
+++/****************************************************************************
+++* dot11StationConfigTable *
+++****************************************************************************/
+++static struct scTbl_data {
+++
+++ char UID [ SC_UID_LEN + 1 ]; // unique ID
+++ char ifName [ IFNAME_LEN + 1 ]; // ifName of card
+++
+++ long ifIndex; // ifindex of card
+++
+++ char stationID [ MACADDR_LEN + 1 ]; // Default actual MacAddr
+++ long mediumOccupancyLimit;
+++ long CFPPollable;
+++ long CFPPeriod;
+++ long maxDuration;
+++ long authenticationResponseTimeOut;
+++ long privacyOptionImplemented;
+++ long powerManagementMode;
+++ char desiredSSID [ SNMP_STR_LEN + 1 ];
+++ long desiredBSSType;
+++ char operationalRateSet [ OPER_RATE_SET_LEN + 1];
+++ long beaconPeriod;
+++ long DTIMPeriod;
+++ long associationResponseTimeOut;
+++ long disAssociationReason;
+++ char disAssociationStation [ MACADDR_LEN + 1 ];
+++ long deAuthenticationReason;
+++ char deAuthenticationStation [ MACADDR_LEN + 1 ];
+++ long authenticateFailStatus;
+++ char authenticateFailStation [ MACADDR_LEN + 1 ];
+++
+++ long haveStationID;
+++ long haveMediumOccupancyLimit;
+++ long haveCFPPollable;
+++ long haveCFPPeriod;
+++ long haveMaxDuration;
+++ long haveAuthenticationResponseTimeOut;
+++ long havePrivacyOptionImplemented;
+++ long havePowerManagementMode;
+++ long haveDesiredSSID;
+++ long haveDesiredBSSType;
+++ long haveOperationalRateSet;
+++ long haveBeaconPeriod;
+++ long haveDTIMPeriod;
+++ long haveAssociationResponseTimeOut;
+++ long haveDisAssociationReason;
+++ long haveDisAssociationStation;
+++ long haveDeAuthenticationReason;
+++ long haveDeAuthenticationStation;
+++ long haveAuthenticateFailStatus;
+++ long haveAuthenticateFailStation;
+++
+++} nSc, *sc = &nSc;
+++
+++static avList_t scList;
+++
+++/****************************************************************************
+++* dot11AuthenticationAlgorithmsTable *
+++****************************************************************************/
+++static struct aaTbl_data {
+++
+++ char UID [ AA_UID_LEN + 1 ];
+++ char ifName [ IFNAME_LEN + 1 ]; // ifName of card
+++
+++ long ifIndex; // ifindex of card
+++ long authenticationAlgorithmsIndex;
+++
+++ long authenticationAlgorithm;
+++ long authenticationAlgorithmsEnable;
+++
+++ long haveAuthenticationAlgorithm;
+++ long haveAuthenticationAlgorithmsEnable;
+++
+++} nAa, *aa = &nAa;
+++
+++static avList_t aaList;
+++
+++/****************************************************************************
+++* dot11WEPDefaultKeysTable *
+++****************************************************************************/
+++static struct dfTbl_data {
+++
+++ char UID [ DF_UID_LEN + 1 ];
+++ char ifName [ IFNAME_LEN + 1 ];
+++
+++ long ifIndex; // ifindex of card
+++ long WEPDefaultKeyIndex;
+++
+++ char WEPDefaultKeyValue [ WEP_STR_LEN + 1 ];
+++ long haveWEPDefaultKeyValue;
+++
+++} nDf, *df = &nDf;
+++
+++static avList_t dfList;
+++
+++/****************************************************************************
+++* dot11WEPKeyMappingsTable *
+++****************************************************************************/
+++static struct kmTbl_data {
+++
+++ char UID [ KM_UID_LEN + 1 ];
+++ char ifName [ IFNAME_LEN + 1 ];
+++
+++ long ifIndex;
+++ long WEPKeyMappingIndex;
+++
+++ char WEPKeyMappingAddress [ MACADDR_LEN + 1 ];
+++ long WEPKeyMappingWEPOn;
+++ char WEPKeyMappingValue [ WEP_STR_LEN + 1 ];
+++ long WEPKeyMappingStatus;
+++
+++ long haveWEPKeyMappingIndex;
+++ long haveWEPKeyMappingAddress;
+++ long haveWEPKeyMappingWEPOn;
+++ long haveWEPKeyMappingValue;
+++ long haveWEPKeyMappingStatus;
+++
+++} nKm, *km = &nKm;
+++
+++static avList_t kmList;
+++
+++/****************************************************************************
+++* dot11PrivacyTable *
+++****************************************************************************/
+++static struct prTbl_data {
+++
+++ char UID [ PR_UID_LEN + 1 ];
+++ char ifName [ IFNAME_LEN + 1 ];
+++
+++ long ifIndex;
+++
+++ long privacyInvoked;
+++ long WEPDefaultKeyID;
+++ long WEPKeyMappingLength;
+++ long excludeUnencrypted;
+++ unsigned long WEPICVErrorCount;
+++ unsigned long WEPExcludedCount;
+++
+++ long havePrivacyInvoked;
+++ long haveWEPDefaultKeyID;
+++ long haveWEPKeyMappingLength;
+++ long haveExcludeUnencrypted;
+++ long haveWEPICVErrorCount;
+++ long haveWEPExcludedCount;
+++
+++} nPr, *pr = &nPr;
+++
+++static avList_t prList;
+++
+++/****************************************************************************
+++* dot11Mac Group *
+++****************************************************************************/
+++/****************************************************************************
+++* dot11OperationTable *
+++****************************************************************************/
+++static struct opTbl_data {
+++
+++ char UID [ OP_UID_LEN + 1 ]; // unique ID
+++ char ifName [ IFNAME_LEN + 1 ]; // ifName of card
+++
+++ long ifIndex; // ifindex of card
+++
+++ char MACAddress [ MACADDR_LEN + 1 ];
+++ long RTSThreshold;
+++ long shortRetryLimit;
+++ long longRetryLimit;
+++ long fragmentationThreshold;
+++ long maxTransmitMSDULifetime;
+++ long maxReceiveLifetime;
+++ char manufacturerID [ SNMP_STR_LEN + 1 ];
+++ char productID [ SNMP_STR_LEN + 1 ];
+++
+++ long haveMACAddress;
+++ long haveRTSThreshold;
+++ long haveShortRetryLimit;
+++ long haveLongRetryLimit;
+++ long haveFragmentationThreshold;
+++ long haveMaxTransmitMSDULifetime;
+++ long haveMaxReceiveLifetime;
+++ long haveManufacturerID;
+++ long haveProductID;
+++
+++} nOp, *op = &nOp;
+++
+++static avList_t opList;
+++
+++/****************************************************************************
+++* dot11CountersTable *
+++****************************************************************************/
+++static struct coTbl_data {
+++
+++ char UID [ CO_UID_LEN + 1 ]; // unique ID
+++ char ifName [ IFNAME_LEN + 1 ]; // ifName of card
+++
+++ long ifIndex; // ifindex of card
+++
+++ unsigned long transmittedFragmentCount;
+++ unsigned long multicastTransmittedFrameCount;
+++ unsigned long failedCount;
+++ unsigned long retryCount;
+++ unsigned long multipleRetryCount;
+++ unsigned long frameDuplicateCount;
+++ unsigned long RTSSuccessCount;
+++ unsigned long RTSFailureCount;
+++ unsigned long ACKFailureCount;
+++ unsigned long receivedFragmentCount;
+++ unsigned long multicastReceivedFrameCount;
+++ unsigned long FCSErrorCount;
+++ unsigned long transmittedFrameCount;
+++ unsigned long WEPUndecryptableCount;
+++
+++ long haveTransmittedFragmentCount;
+++ long haveMulticastTransmittedFrameCount;
+++ long haveFailedCount;
+++ long haveRetryCount;
+++ long haveMultipleRetryCount;
+++ long haveFrameDuplicateCount;
+++ long haveRTSSuccessCount;
+++ long haveRTSFailureCount;
+++ long haveACKFailureCount;
+++ long haveReceivedFragmentCount;
+++ long haveMulticastReceivedFrameCount;
+++ long haveFCSErrorCount;
+++ long haveTransmittedFrameCount;
+++ long haveWEPUndecryptableCount;
+++
+++} nCo, *co = &nCo;
+++
+++static avList_t coList;
+++
+++/****************************************************************************
+++* dot11GroupAddressesTable *
+++****************************************************************************/
+++static struct gaTbl_data {
+++
+++ char UID [ GA_UID_LEN + 1 ];
+++ char ifName [ IFNAME_LEN + 1 ];
+++
+++ long ifIndex; // ifindex of card
+++ long groupAddressesIndex;
+++
+++ char address [ MACADDR_LEN + 1 ];
+++ long groupAddressesStatus;
+++
+++ long haveAddress;
+++ long haveGroupAddressesStatus;
+++
+++} nGa, *ga = &nGa;
+++
+++static avList_t gaList;
+++
+++/****************************************************************************
+++* dot11Res Group *
+++****************************************************************************/
+++static char resourceTypeIDName[] = "RTID";
+++static long haveResourceTypeIDName = 1;
+++
+++/****************************************************************************
+++* dot11ResourceInfoTable *
+++****************************************************************************/
+++static struct riTbl_data {
+++
+++ char UID [ RI_UID_LEN + 1 ]; // unique ID
+++ char ifName [ IFNAME_LEN + 1 ]; // ifName of card
+++
+++ long ifIndex; // ifindex of card
+++
+++ char manufacturerOUI [ MAN_OUI_LEN + 1 ];
+++ char manufacturerName [ SYS_STRING_LEN + 1 ];
+++ char manufacturerProductName [ SYS_STRING_LEN + 1 ];
+++ char manufacturerProductVersion [ SYS_STRING_LEN + 1 ];
+++
+++ char haveManufacturerOUI;
+++ char haveManufacturerName;
+++ char haveManufacturerProductName;
+++ char haveManufacturerProductVersion;
+++
+++} nRi, *ri = &nRi;
+++
+++static avList_t riList;
+++
+++/****************************************************************************
+++* dot11Phy Group *
+++****************************************************************************/
+++/****************************************************************************
+++* dot11PhyOperationTable *
+++****************************************************************************/
+++static struct poTbl_data {
+++
+++ char UID [ PO_UID_LEN + 1 ]; // unique ID
+++ char ifName [ IFNAME_LEN + 1 ]; // ifName of card
+++
+++ long ifIndex; // ifindex of card
+++
+++ long PHYType;
+++ long currentRegDomain;
+++ long tempType;
+++
+++ long havePHYType;
+++ long haveCurrentRegDomain;
+++ long haveTempType;
+++
+++} nPo, *po = &nPo;
+++
+++static avList_t poList;
+++
+++/****************************************************************************
+++* dot11PhyAntennaEntry *
+++****************************************************************************/
+++static struct paTbl_data {
+++
+++ char UID [ PA_UID_LEN + 1 ]; // unique ID
+++ char ifName [ IFNAME_LEN + 1 ]; // ifName of card
+++
+++ long ifIndex; // ifindex of card
+++
+++ long currentTxAntenna;
+++ long diversitySupport;
+++ long currentRxAntenna;
+++
+++ long haveCurrentTxAntenna;
+++ long haveDiversitySupport;
+++ long haveCurrentRxAntenna;
+++
+++} nPa, *pa = &nPa;
+++
+++static avList_t paList;
+++
+++/****************************************************************************
+++* dot11PhyTxPowerTable *
+++****************************************************************************/
+++static struct ptTbl_data {
+++
+++ char UID [ PT_UID_LEN + 1 ]; // unique ID
+++ char ifName [ IFNAME_LEN + 1 ]; // ifName of card
+++
+++ long ifIndex; // ifindex of card
+++
+++ long numberSupportedPowerLevels;
+++ long TxPowerLevel1;
+++ long TxPowerLevel2;
+++ long TxPowerLevel3;
+++ long TxPowerLevel4;
+++ long TxPowerLevel5;
+++ long TxPowerLevel6;
+++ long TxPowerLevel7;
+++ long TxPowerLevel8;
+++ long currentTxPowerLevel;
+++
+++ long haveNumberSupportedPowerLevels;
+++ long haveTxPowerLevel1;
+++ long haveTxPowerLevel2;
+++ long haveTxPowerLevel3;
+++ long haveTxPowerLevel4;
+++ long haveTxPowerLevel5;
+++ long haveTxPowerLevel6;
+++ long haveTxPowerLevel7;
+++ long haveTxPowerLevel8;
+++ long haveCurrentTxPowerLevel ;
+++
+++} nPt, *pt = &nPt;
+++
+++static avList_t ptList;
+++
+++/****************************************************************************
+++* dot11PhyFHSSTable *
+++****************************************************************************/
+++static struct pfTbl_data {
+++
+++ char UID [ PF_UID_LEN + 1 ]; // unique ID
+++ char ifName [ IFNAME_LEN + 1 ]; // ifName of card
+++
+++ long ifIndex; // ifindex of card
+++
+++ long hopTime;
+++ long currentChannelNumber;
+++ long maxDwellTime;
+++ long currentDwellTime;
+++ long currentSet;
+++ long currentPattern;
+++ long currentIndex;
+++
+++ long haveHopTime;
+++ long haveCurrentChannelNumber;
+++ long haveMaxDwellTime;
+++ long haveCurrentDwellTime;
+++ long haveCurrentSet;
+++ long haveCurrentPattern;
+++ long haveCurrentIndex;
+++
+++} nPf, *pf = &nPf;
+++
+++static avList_t pfList;
+++
+++/****************************************************************************
+++* dot11PhyDSSSTable *
+++****************************************************************************/
+++static struct pdTbl_data {
+++
+++ char UID [ PD_UID_LEN + 1 ]; // unique ID
+++ char ifName [ IFNAME_LEN + 1 ]; // ifName of card
+++
+++ long ifIndex; // ifindex of card
+++
+++ long currentChannel;
+++ long CCAModeSupported;
+++ long currentCCAMode;
+++ long EDThreshold;
+++
+++ long haveCurrentChannel;
+++ long haveCCAModeSupported ;
+++ long haveCurrentCCAMode;
+++ long haveEDThreshold;
+++
+++} nPd, *pd = &nPd;
+++
+++static avList_t pdList;
+++
+++/****************************************************************************
+++* dot11PhyIRTable *
+++****************************************************************************/
+++static struct piTbl_data {
+++
+++ char UID [ PI_UID_LEN + 1 ]; // unique ID
+++ char ifName [ IFNAME_LEN + 1 ]; // ifName of card
+++
+++ long ifIndex; // ifindex of card
+++
+++ long CCAWatchdogTimerMax;
+++ long CCAWatchdogCountMax;
+++ long CCAWatchdogTimerMin;
+++ long CCAWatchdogCountMin;
+++
+++ long haveCCAWatchdogTimerMax;
+++ long haveCCAWatchdogCountMax;
+++ long haveCCAWatchdogTimerMin;
+++ long haveCCAWatchdogCountMin;
+++
+++} nPi, *pi = &nPi;
+++
+++static avList_t piList;
+++
+++/****************************************************************************
+++* dot11RegDomainsSupportedTable *
+++****************************************************************************/
+++static struct rdTbl_data {
+++
+++ char UID [ RD_UID_LEN + 1 ];
+++ char ifName [ IFNAME_LEN + 1 ];
+++
+++ long ifIndex; // ifindex of card
+++ long regDomainsSupportIndex;
+++
+++ long regDomainsSupportValue;
+++ long haveRegDomainsSupportValue;
+++
+++} nRd, *rd = &nRd;
+++
+++static avList_t rdList;
+++
+++/****************************************************************************
+++* dot11AntennasListTable *
+++****************************************************************************/
+++static struct alTbl_data {
+++
+++ char UID [ AL_UID_LEN + 1 ];
+++ char ifName [ IFNAME_LEN + 1 ];
+++
+++ long ifIndex; // ifindex of card
+++ long antennaListIndex;
+++
+++ long supportedTxAntenna;
+++ long supportedRxAntenna;
+++ long diversitySelectionRx ;
+++
+++ long haveSupportedTxAntenna;
+++ long haveSupportedRxAntenna;
+++ long haveDiversitySelectionRx ;
+++
+++} nAl, *al = &nAl;
+++
+++static avList_t alList;
+++
+++/****************************************************************************
+++* dot11SupportedDataRatesTxTable *
+++****************************************************************************/
+++static struct rtTbl_data {
+++
+++ char UID [ RT_UID_LEN + 1 ];
+++ char ifName [ IFNAME_LEN + 1 ];
+++
+++ long ifIndex; // ifindex of card
+++ long supportedDataRatesTxIndex;
+++
+++ long supportedDataRatesTxValue;
+++ long haveSupportedDataRatesTxValue;
+++
+++} nRt, *rt = &nRt;
+++
+++static avList_t rtList;
+++
+++/****************************************************************************
+++* dot11SupportedDataRatesRxTable *
+++****************************************************************************/
+++static struct rrTbl_data {
+++
+++ char UID [ RR_UID_LEN + 1 ];
+++ char ifName [ IFNAME_LEN + 1 ];
+++
+++ long ifIndex; // ifindex of card
+++ long supportedDataRatesRxIndex;
+++
+++ long supportedDataRatesRxValue;
+++ long haveSupportedDataRatesRxValue;
+++
+++} nRr, *rr = &nRr;
+++
+++static avList_t rrList;
+++
+++/****************************************************************************
+++* Wireless Extensions Structures *
+++****************************************************************************/
+++static long wepCurrentKey;
+++static long haveWepCurrentKey;
+++static struct wepTbl_data {
+++
+++ long len;
+++ char key [ WEP_STR_LEN + 1 ];
+++ long haveKey;
+++
+++} wep[4];
+++
+++/****************************************************************************
+++* *
+++****************************************************************************/
+++config_require(util_funcs)
+++
+++/* function prototypes */
+++
+++void init_ieee802dot11 ( void );
+++FindVarMethod var_ieee802dot11;
+++FindVarMethod var_dot11StationConfigTable;
+++FindVarMethod var_dot11AuthenticationAlgorithmsTable;
+++FindVarMethod var_dot11WEPDefaultKeysTable;
+++FindVarMethod var_dot11WEPKeyMappingsTable;
+++FindVarMethod var_dot11PrivacyTable;
+++FindVarMethod var_dot11OperationTable;
+++FindVarMethod var_dot11CountersTable;
+++FindVarMethod var_dot11GroupAddressesTable;
+++FindVarMethod var_dot11ResourceInfoTable;
+++FindVarMethod var_dot11PhyOperationTable;
+++FindVarMethod var_dot11PhyAntennaTable;
+++FindVarMethod var_dot11PhyTxPowerTable;
+++FindVarMethod var_dot11PhyFHSSTable;
+++FindVarMethod var_dot11PhyDSSSTable;
+++FindVarMethod var_dot11PhyIRTable;
+++FindVarMethod var_dot11RegDomainsSupportedTable;
+++FindVarMethod var_dot11AntennasListTable;
+++FindVarMethod var_dot11SupportedDataRatesTxTable;
+++FindVarMethod var_dot11SupportedDataRatesRxTable;
+++
+++WriteMethod write_dot11StationID;
+++WriteMethod write_dot11MediumOccupancyLimit;
+++WriteMethod write_dot11CFPPeriod;
+++WriteMethod write_dot11CFPMaxDuration;
+++WriteMethod write_dot11AuthenticationResponseTimeOut;
+++WriteMethod write_dot11PowerManagementMode;
+++WriteMethod write_dot11DesiredSSID;
+++WriteMethod write_dot11DesiredBSSType;
+++WriteMethod write_dot11OperationalRateSet;
+++WriteMethod write_dot11BeaconPeriod;
+++WriteMethod write_dot11DTIMPeriod;
+++WriteMethod write_dot11AssociationResponseTimeOut;
+++WriteMethod write_dot11AuthenticationAlgorithmsEnable;
+++WriteMethod write_dot11WEPDefaultKeyValue;
+++WriteMethod write_dot11WEPKeyMappingAddress;
+++WriteMethod write_dot11WEPKeyMappingWEPOn;
+++WriteMethod write_dot11WEPKeyMappingValue;
+++WriteMethod write_dot11WEPKeyMappingStatus;
+++WriteMethod write_dot11PrivacyInvoked;
+++WriteMethod write_dot11WEPDefaultKeyID;
+++WriteMethod write_dot11WEPKeyMappingLength;
+++WriteMethod write_dot11ExcludeUnencrypted;
+++WriteMethod write_dot11RTSThreshold;
+++WriteMethod write_dot11ShortRetryLimit;
+++WriteMethod write_dot11LongRetryLimit;
+++WriteMethod write_dot11FragmentationThreshold;
+++WriteMethod write_dot11MaxTransmitMSDULifetime;
+++WriteMethod write_dot11MaxReceiveLifetime;
+++WriteMethod write_dot11Address;
+++WriteMethod write_dot11GroupAddressesStatus;
+++WriteMethod write_dot11CurrentRegDomain;
+++WriteMethod write_dot11CurrentTxAntenna;
+++WriteMethod write_dot11CurrentRxAntenna;
+++WriteMethod write_dot11CurrentTxPowerLevel;
+++WriteMethod write_dot11CurrentChannelNumber;
+++WriteMethod write_dot11CurrentDwellTime;
+++WriteMethod write_dot11CurrentSet;
+++WriteMethod write_dot11CurrentPattern;
+++WriteMethod write_dot11CurrentIndex;
+++WriteMethod write_dot11CurrentChannel;
+++WriteMethod write_dot11CurrentCCAMode;
+++WriteMethod write_dot11EDThreshold;
+++WriteMethod write_dot11CCAWatchdogTimerMax;
+++WriteMethod write_dot11CCAWatchdogCountMax;
+++WriteMethod write_dot11CCAWatchdogTimerMin;
+++WriteMethod write_dot11CCAWatchdogCountMin;
+++WriteMethod write_dot11SupportedTxAntenna;
+++WriteMethod write_dot11SupportedRxAntenna;
+++WriteMethod write_dot11DiversitySelectionRx;
+++
+++#endif /* _MIBGROUP_IEEE802DOT11_H */
++--- /dev/null
+++++ b/agent/mibgroup/iwlib.h
++@@ -0,0 +1,502 @@
+++/*
+++ * Wireless Tools
+++ *
+++ * Jean II - HPLB 97->99 - HPL 99->02
+++ *
+++ * Common header for the Wireless Extension library...
+++ *
+++ * This file is released under the GPL license.
+++ * Copyright (c) 1997-2002 Jean Tourrilhes <jt@hpl.hp.com>
+++ */
+++
+++#ifndef IWLIB_H
+++#define IWLIB_H
+++
+++/*#include "CHANGELOG.h"*/
+++
+++/***************************** INCLUDES *****************************/
+++
+++/* Standard headers */
+++#include <sys/types.h>
+++#include <sys/ioctl.h>
+++#include <stdio.h>
+++#include <math.h>
+++#include <errno.h>
+++#include <fcntl.h>
+++#include <ctype.h>
+++#include <stdlib.h>
+++#include <string.h>
+++#include <unistd.h>
+++#include <netdb.h> /* gethostbyname, getnetbyname */
+++#include <net/ethernet.h> /* struct ether_addr */
+++#include <sys/time.h> /* struct timeval */
+++#include <unistd.h>
+++
+++/* This is our header selection. Try to hide the mess and the misery :-(
+++ * Don't look, you would go blind ;-) */
+++
+++#ifndef LINUX_VERSION_CODE
+++#include <linux/version.h>
+++#endif
+++
+++/* Kernel headers 2.4.X + Glibc 2.2 - Mandrake 8.0, Debian 2.3, RH 7.1
+++ * Kernel headers 2.2.X + Glibc 2.2 - Slackware 8.0 */
+++#if defined(__GLIBC__) \
+++ && __GLIBC__ == 2 \
+++ && __GLIBC_MINOR__ >= 2 \
+++ && LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
+++//#define GLIBC22_HEADERS
+++#define GENERIC_HEADERS
+++
+++/* Kernel headers 2.4.X + Glibc 2.1 - Debian 2.2 upgraded, RH 7.0
+++ * Kernel headers 2.2.X + Glibc 2.1 - Debian 2.2, RH 6.1 */
+++#elif defined(__GLIBC__) \
+++ && __GLIBC__ == 2 \
+++ && __GLIBC_MINOR__ == 1 \
+++ && LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
+++//#define GLIBC_HEADERS
+++#define GENERIC_HEADERS
+++
+++/* Kernel headers 2.2.X + Glibc 2.0 - Debian 2.1 */
+++#elif defined(__GLIBC__) \
+++ && __GLIBC__ == 2 \
+++ && __GLIBC_MINOR__ == 0 \
+++ && LINUX_VERSION_CODE >= KERNEL_VERSION(2,0,0) \
+++ && LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
+++#define GLIBC_HEADERS
+++#define KLUDGE_HEADERS
+++
+++/* Note : is it really worth supporting kernel 2.0.X, knowing that
+++ * we require WE v9, which is only available in 2.2.X and higher ?
+++ * I guess one could use 2.0.x with an upgraded wireless.h... */
+++
+++/* Kernel headers 2.0.X + Glibc 2.0 - Debian 2.0, RH 5 */
+++#elif defined(__GLIBC__) \
+++ && __GLIBC__ == 2 \
+++ && __GLIBC_MINOR__ == 0 \
+++ && LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) \
+++ && LINUX_VERSION_CODE >= KERNEL_VERSION(2,0,0)
+++#define GLIBC_HEADERS
+++
+++/* Kernel headers 2.0.X + libc5 - old systems */
+++#elif defined(_LINUX_C_LIB_VERSION_MAJOR) \
+++ && _LINUX_C_LIB_VERSION_MAJOR == 5 \
+++ && LINUX_VERSION_CODE >= KERNEL_VERSION(2,0,0) \
+++ && LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
+++#define LIBC5_HEADERS
+++
+++/* Unsupported combination */
+++#else
+++#error "Your kernel/libc combination is not supported"
+++#endif
+++
+++#ifdef GENERIC_HEADERS
+++/* Proposed by Dr. Michael Rietz <rietz@mail.amps.de>, 27.3.2 */
+++/* If this works for all, it might be more stable on the long term - Jean II */
+++#include <net/if_arp.h> /* For ARPHRD_ETHER */
+++#include <sys/socket.h> /* For AF_INET & struct sockaddr */
+++#include <netinet/in.h> /* For struct sockaddr_in */
+++#include <netinet/if_ether.h>
+++#endif /* GENERIC_HEADERS */
+++
+++#ifdef GLIBC22_HEADERS
+++/* Added by Ross G. Miller <Ross_Miller@baylor.edu>, 3/28/01 */
+++#include <linux/if_arp.h> /* For ARPHRD_ETHER */
+++#include <linux/socket.h> /* For AF_INET & struct sockaddr */
+++#include <sys/socket.h>
+++#endif /* GLIBC22_HEADERS */
+++
+++#ifdef KLUDGE_HEADERS
+++#include <socketbits.h>
+++#endif /* KLUDGE_HEADERS */
+++
+++#ifdef GLIBC_HEADERS
+++#include <linux/if_arp.h> /* For ARPHRD_ETHER */
+++#include <linux/socket.h> /* For AF_INET & struct sockaddr */
+++#include <linux/in.h> /* For struct sockaddr_in */
+++#endif /* KLUDGE_HEADERS || GLIBC_HEADERS */
+++
+++#ifdef LIBC5_HEADERS
+++#include <sys/socket.h> /* For AF_INET & struct sockaddr & socket() */
+++#include <linux/if_arp.h> /* For ARPHRD_ETHER */
+++#include <linux/in.h> /* For struct sockaddr_in */
+++#endif /* LIBC5_HEADERS */
+++
+++/* Those 3 headers were previously included in wireless.h */
+++#include <linux/types.h> /* for "caddr_t" et al */
+++#include <linux/socket.h> /* for "struct sockaddr" et al */
+++#include <linux/if.h> /* for IFNAMSIZ and co... */
+++
+++#ifdef WEXT_HEADER
+++/* Private copy of Wireless extensions */
+++#include WEXT_HEADER
+++#else /* !WEXT_HEADER */
+++/* System wide Wireless extensions */
+++#include <linux/wireless.h>
+++#endif /* !WEXT_HEADER */
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++/****************************** DEBUG ******************************/
+++
+++
+++/************************ CONSTANTS & MACROS ************************/
+++
+++/* Paths */
+++#define PROC_NET_WIRELESS "/proc/net/wireless"
+++#define PROC_NET_DEV "/proc/net/dev"
+++
+++/* Some usefull constants */
+++#define KILO 1e3
+++#define MEGA 1e6
+++#define GIGA 1e9
+++/* For doing log10/exp10 without libm */
+++#define LOG10_MAGIC 1.25892541179
+++
+++/* Backward compatibility for Wireless Extension 9 */
+++#ifndef IW_POWER_MODIFIER
+++#define IW_POWER_MODIFIER 0x000F /* Modify a parameter */
+++#define IW_POWER_MIN 0x0001 /* Value is a minimum */
+++#define IW_POWER_MAX 0x0002 /* Value is a maximum */
+++#define IW_POWER_RELATIVE 0x0004 /* Value is not in seconds/ms/us */
+++#endif /* IW_POWER_MODIFIER */
+++
+++#ifndef IW_ENCODE_NOKEY
+++#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not here */
+++#define IW_ENCODE_MODE 0xF000 /* Modes defined below */
+++#endif /* IW_ENCODE_NOKEY */
+++#ifndef IW_ENCODE_TEMP
+++#define IW_ENCODE_TEMP 0x0400 /* Temporary key */
+++#endif /* IW_ENCODE_TEMP */
+++
+++/* More backward compatibility */
+++#ifndef SIOCSIWCOMMIT
+++#define SIOCSIWCOMMIT SIOCSIWNAME
+++#endif /* SIOCSIWCOMMIT */
+++
+++/****************************** TYPES ******************************/
+++
+++/* Shortcuts */
+++typedef struct iw_statistics iwstats;
+++typedef struct iw_range iwrange;
+++typedef struct iw_param iwparam;
+++typedef struct iw_freq iwfreq;
+++typedef struct iw_quality iwqual;
+++typedef struct iw_priv_args iwprivargs;
+++typedef struct sockaddr sockaddr;
+++
+++/* Structure for storing all wireless information for each device
+++ * This is pretty exhaustive... */
+++typedef struct wireless_info
+++{
+++ char name[IFNAMSIZ + 1]; /* Wireless/protocol name */
+++ int has_nwid;
+++ iwparam nwid; /* Network ID */
+++ int has_freq;
+++ double freq; /* Frequency/channel */
+++ int has_sens;
+++ iwparam sens; /* sensitivity */
+++ int has_key;
+++ unsigned char key[IW_ENCODING_TOKEN_MAX]; /* Encoding key used */
+++ int key_size; /* Number of bytes */
+++ int key_flags; /* Various flags */
+++ int has_essid;
+++ int essid_on;
+++ char essid[IW_ESSID_MAX_SIZE + 1]; /* ESSID (extended network) */
+++ int has_nickname;
+++ char nickname[IW_ESSID_MAX_SIZE + 1]; /* NickName */
+++ int has_ap_addr;
+++ sockaddr ap_addr; /* Access point address */
+++ int has_bitrate;
+++ iwparam bitrate; /* Bit rate in bps */
+++ int has_rts;
+++ iwparam rts; /* RTS threshold in bytes */
+++ int has_frag;
+++ iwparam frag; /* Fragmentation threshold in bytes */
+++ int has_mode;
+++ int mode; /* Operation mode */
+++ int has_power;
+++ iwparam power; /* Power management parameters */
+++ int has_txpower;
+++ iwparam txpower; /* Transmit Power in dBm */
+++ int has_retry;
+++ iwparam retry; /* Retry limit or lifetime */
+++
+++ /* Stats */
+++ iwstats stats;
+++ int has_stats;
+++ iwrange range;
+++ int has_range;
+++} wireless_info;
+++
+++/* Structure for storing all wireless information for each device
+++ * This is a cut down version of the one above, containing only
+++ * the things *truly* needed to configure a card.
+++ * Don't add other junk, I'll remove it... */
+++typedef struct wireless_config
+++{
+++ char name[IFNAMSIZ + 1]; /* Wireless/protocol name */
+++ int has_nwid;
+++ iwparam nwid; /* Network ID */
+++ int has_freq;
+++ double freq; /* Frequency/channel */
+++ int has_key;
+++ unsigned char key[IW_ENCODING_TOKEN_MAX]; /* Encoding key used */
+++ int key_size; /* Number of bytes */
+++ int key_flags; /* Various flags */
+++ int has_essid;
+++ int essid_on;
+++ char essid[IW_ESSID_MAX_SIZE + 1]; /* ESSID (extended network) */
+++ int has_mode;
+++ int mode; /* Operation mode */
+++} wireless_config;
+++
+++typedef struct stream_descr
+++{
+++ char * end; /* End of the stream */
+++ char * current; /* Current event in stream of events */
+++ char * value; /* Current value in event */
+++} stream_descr;
+++
+++/* Prototype for handling display of each single interface on the
+++ * system - see iw_enum_devices() */
+++typedef int (*iw_enum_handler)(int skfd,
+++ char * ifname,
+++ char * args[],
+++ int count);
+++
+++/**************************** PROTOTYPES ****************************/
+++/*
+++ * All the functions in iwcommon.c
+++ */
+++
+++/* ---------------------- SOCKET SUBROUTINES -----------------------*/
+++int
+++ iw_sockets_open(void);
+++void
+++ iw_enum_devices(int skfd,
+++ iw_enum_handler fn,
+++ char * args[],
+++ int count);
+++/* --------------------- WIRELESS SUBROUTINES ----------------------*/
+++int
+++ iw_get_range_info(int skfd,
+++ char * ifname,
+++ iwrange * range);
+++int
+++ iw_print_version_info(char * toolname);
+++int
+++ iw_get_priv_info(int skfd,
+++ char * ifname,
+++ iwprivargs * priv,
+++ int maxpriv);
+++int
+++ iw_get_basic_config(int skfd,
+++ char * ifname,
+++ wireless_config * info);
+++int
+++ iw_set_basic_config(int skfd,
+++ char * ifname,
+++ wireless_config * info);
+++/* --------------------- PROTOCOL SUBROUTINES --------------------- */
+++int
+++ iw_protocol_compare(char * protocol1,
+++ char * protocol2);
+++/* -------------------- FREQUENCY SUBROUTINES --------------------- */
+++void
+++ iw_float2freq(double in,
+++ iwfreq * out);
+++double
+++ iw_freq2float(iwfreq * in);
+++void
+++ iw_print_freq(char * buffer,
+++ double freq);
+++int
+++ iw_freq_to_channel(double freq,
+++ struct iw_range * range);
+++void
+++ iw_print_bitrate(char * buffer,
+++ int bitrate);
+++/* ---------------------- POWER SUBROUTINES ----------------------- */
+++int
+++ iw_dbm2mwatt(int in);
+++int
+++ iw_mwatt2dbm(int in);
+++/* -------------------- STATISTICS SUBROUTINES -------------------- */
+++int
+++ iw_get_stats(int skfd,
+++ char * ifname,
+++ iwstats * stats);
+++void
+++ iw_print_stats(char * buffer,
+++ iwqual * qual,
+++ iwrange * range,
+++ int has_range);
+++/* --------------------- ENCODING SUBROUTINES --------------------- */
+++void
+++ iw_print_key(char * buffer,
+++ unsigned char * key,
+++ int key_size,
+++ int key_flags);
+++int
+++ iw_in_key(char * input,
+++ unsigned char * key);
+++int
+++ iw_in_key_full(int skfd,
+++ char * ifname,
+++ char * input,
+++ unsigned char * key,
+++ __u16 * flags);
+++/* ----------------- POWER MANAGEMENT SUBROUTINES ----------------- */
+++void
+++ iw_print_pm_value(char * buffer,
+++ int value,
+++ int flags);
+++void
+++ iw_print_pm_mode(char * buffer,
+++ int flags);
+++/* --------------- RETRY LIMIT/LIFETIME SUBROUTINES --------------- */
+++#if WIRELESS_EXT > 10
+++void
+++ iw_print_retry_value(char * buffer,
+++ int value,
+++ int flags);
+++#endif
+++/* ----------------------- TIME SUBROUTINES ----------------------- */
+++void
+++ iw_print_timeval(char * buffer,
+++ const struct timeval * time);
+++/* --------------------- ADDRESS SUBROUTINES ---------------------- */
+++int
+++ iw_check_mac_addr_type(int skfd,
+++ char * ifname);
+++int
+++ iw_check_if_addr_type(int skfd,
+++ char * ifname);
+++#if 0
+++int
+++ iw_check_addr_type(int skfd,
+++ char * ifname);
+++#endif
+++void
+++ iw_ether_ntop(const struct ether_addr* eth, char* buf);
+++char*
+++ iw_ether_ntoa(const struct ether_addr* eth);
+++int
+++ iw_ether_aton(const char* bufp, struct ether_addr* eth);
+++int
+++ iw_in_inet(char *bufp, struct sockaddr *sap);
+++int
+++ iw_in_addr(int skfd,
+++ char * ifname,
+++ char * bufp,
+++ struct sockaddr * sap);
+++/* ----------------------- MISC SUBROUTINES ------------------------ */
+++int
+++ iw_get_priv_size(int args);
+++
+++#if WIRELESS_EXT > 13
+++/* ---------------------- EVENT SUBROUTINES ---------------------- */
+++void
+++ iw_init_event_stream(struct stream_descr * stream,
+++ char * data,
+++ int len);
+++int
+++ iw_extract_event_stream(struct stream_descr * stream,
+++ struct iw_event * iwe);
+++#endif /* WIRELESS_EXT > 13 */
+++
+++/**************************** VARIABLES ****************************/
+++
+++extern const char * const iw_operation_mode[];
+++#define IW_NUM_OPER_MODE 7
+++
+++/************************* INLINE FUNTIONS *************************/
+++/*
+++ * Functions that are so simple that it's more efficient inlining them
+++ */
+++
+++/*
+++ * Note : I've defined wrapper for the ioctl request so that
+++ * it will be easier to migrate to other kernel API if needed
+++ */
+++
+++/*------------------------------------------------------------------*/
+++/*
+++ * Wrapper to push some Wireless Parameter in the driver
+++ */
+++static inline int
+++iw_set_ext(int skfd, /* Socket to the kernel */
+++ char * ifname, /* Device name */
+++ int request, /* WE ID */
+++ struct iwreq * pwrq) /* Fixed part of the request */
+++{
+++ /* Set device name */
+++ strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
+++ /* Do the request */
+++ return(ioctl(skfd, request, pwrq));
+++}
+++
+++/*------------------------------------------------------------------*/
+++/*
+++ * Wrapper to extract some Wireless Parameter out of the driver
+++ */
+++static inline int
+++iw_get_ext(int skfd, /* Socket to the kernel */
+++ char * ifname, /* Device name */
+++ int request, /* WE ID */
+++ struct iwreq * pwrq) /* Fixed part of the request */
+++{
+++ /* Set device name */
+++ strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
+++ /* Do the request */
+++ return(ioctl(skfd, request, pwrq));
+++}
+++
+++/*------------------------------------------------------------------*/
+++/* Backwards compatability
+++ * Actually, those form are much easier to use when dealing with
+++ * struct sockaddr... */
+++static inline char*
+++iw_pr_ether(char* bufp, const unsigned char* addr)
+++{
+++ iw_ether_ntop((const struct ether_addr *) addr, bufp);
+++ return bufp;
+++}
+++/* Backwards compatability */
+++static inline int
+++iw_in_ether(const char *bufp, struct sockaddr *sap)
+++{
+++ sap->sa_family = ARPHRD_ETHER;
+++ return iw_ether_aton(bufp, (struct ether_addr *) sap->sa_data) ? 0 : -1;
+++}
+++
+++/*------------------------------------------------------------------*/
+++/*
+++ * Create an Ethernet broadcast address
+++ */
+++static inline void
+++iw_broad_ether(struct sockaddr *sap)
+++{
+++ sap->sa_family = ARPHRD_ETHER;
+++ memset((char *) sap->sa_data, 0xFF, ETH_ALEN);
+++}
+++
+++/*------------------------------------------------------------------*/
+++/*
+++ * Create an Ethernet NULL address
+++ */
+++static inline void
+++iw_null_ether(struct sockaddr *sap)
+++{
+++ sap->sa_family = ARPHRD_ETHER;
+++ memset((char *) sap->sa_data, 0x00, ETH_ALEN);
+++}
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif /* IWLIB_H */
+diff --git a/feeds/packages/net/net-snmp/patches/800-format-security.patch b/feeds/packages/net/net-snmp/patches/800-format-security.patch
+new file mode 100644
+index 0000000..87a3e92
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/patches/800-format-security.patch
+@@ -0,0 +1,29 @@
++--- a/agent/mibgroup/host/hr_filesys.c
+++++ b/agent/mibgroup/host/hr_filesys.c
++@@ -322,13 +322,13 @@ var_hrfilesys(struct variable *vp,
++ long_return = fsys_idx;
++ return (u_char *) & long_return;
++ case HRFSYS_MOUNT:
++- snprintf(string, sizeof(string), HRFS_entry->HRFS_mount);
+++ snprintf(string, sizeof(string), "%s", HRFS_entry->HRFS_mount);
++ string[ sizeof(string)-1 ] = 0;
++ *var_len = strlen(string);
++ return (u_char *) string;
++ case HRFSYS_RMOUNT:
++ if (Check_HR_FileSys_NFS()) {
++- snprintf(string, sizeof(string), HRFS_entry->HRFS_name);
+++ snprintf(string, sizeof(string), "%s", HRFS_entry->HRFS_name);
++ string[ sizeof(string)-1 ] = 0;
++ } else
++ string[0] = '\0';
++--- a/agent/mibgroup/ucd-snmp/extensible.c
+++++ b/agent/mibgroup/ucd-snmp/extensible.c
++@@ -513,7 +513,7 @@ fixExecError(int action,
++ }
++ tmp = *((long *) var_val);
++ if ((tmp == 1) && (action == COMMIT) && (exten->fixcmd[0] != 0)) {
++- sprintf(ex.command, exten->fixcmd);
+++ sprintf(ex.command, "%s", exten->fixcmd);
++ if ((fd = get_exec_output(&ex)) != -1) {
++ file = fdopen(fd, "r");
++ while (fgets(ex.output, sizeof(ex.output), file) != NULL);
+diff --git a/feeds/packages/net/net-snmp/patches/900-musl-compat.patch b/feeds/packages/net/net-snmp/patches/900-musl-compat.patch
+new file mode 100644
+index 0000000..fa9a01e
+--- /dev/null
++++ b/feeds/packages/net/net-snmp/patches/900-musl-compat.patch
+@@ -0,0 +1,14 @@
++--- a/agent/mibgroup/iwlib.h
+++++ b/agent/mibgroup/iwlib.h
++@@ -85,6 +85,11 @@
++ && LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
++ #define LIBC5_HEADERS
++
+++/* Musl */
+++#elif !defined(__GLIBC__) && !defined(__UCLIBC__) \
+++ && LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
+++#define GENERIC_HEADERS
+++
++ /* Unsupported combination */
++ #else
++ #error "Your kernel/libc combination is not supported"
+diff --git a/feeds/packages/net/netatalk/Makefile b/feeds/packages/net/netatalk/Makefile
+new file mode 100644
+index 0000000..8729053
+--- /dev/null
++++ b/feeds/packages/net/netatalk/Makefile
+@@ -0,0 +1,86 @@
++#
++# Copyright (C) 2009-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=netatalk
++PKG_VERSION:=2.2.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/netatalk
++PKG_MD5SUM:=40753a32340c24e4ec395aeb55ef056e
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/netatalk
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Filesystem
++ DEPENDS:=+attr +libdb47 +libgcrypt +libopenssl $(LIBRPC_DEPENDS)
++ TITLE:=netatalk
++ URL:=http://netatalk.sourceforge.net
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++endef
++
++define Package/netatalk/decription
++ Netatalk is a freely-available Open Source AFP fileserver.
++ It also provides a kernel level implementation of the AppleTalk
++ Protocol Suite.
++endef
++
++define Package/netatalk/conffiles
++/etc/netatalk/afpd.conf
++endef
++
++TARGET_CFLAGS += -std=gnu99
++TARGET_LDFLAGS += $(LIBRPC)
++
++CONFIGURE_ARGS += \
++ --disable-afs \
++ --enable-hfs \
++ --disable-debugging \
++ --disable-shell-check \
++ --disable-timelord \
++ --disable-a2boot \
++ --disable-cups \
++ --disable-tcp-wrappers \
++ --with-cnid-default-backend=dbd \
++ --with-bdb="$(STAGING_DIR)/usr/" \
++ --with-libgcrypt-dir="$(STAGING_DIR)/usr" \
++ --with-ssl-dir="$(STAGING_DIR)/usr" \
++ --with-uams-path="/usr/lib/uams" \
++ --without-acls \
++ --without-pam \
++ --disable-admin-group \
++ --disable-srvloc \
++ --disable-zeroconf \
++ $(if $(CONFIG_SHADOW_PASSWORDS),--with-shadow,--without-shadow) \
++ --without-ldap
++
++define Package/netatalk/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_DIR) $(1)/usr/lib/uams
++ $(INSTALL_DIR) $(1)/etc/netatalk
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/afppasswd $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/afpd $(1)/usr/sbin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/cnid_dbd $(1)/usr/sbin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/cnid_metad $(1)/usr/sbin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/uams/*.so $(1)/usr/lib/uams/
++ $(CP) ./files/AppleVolumes.default $(1)/etc/netatalk/
++ $(CP) $(PKG_INSTALL_DIR)/etc/netatalk/AppleVolumes.system $(1)/etc/netatalk/
++ $(INSTALL_CONF) ./files/afpd.conf $(1)/etc/netatalk/
++ $(INSTALL_BIN) ./files/afpd.init $(1)/etc/init.d/afpd
++endef
++
++$(eval $(call BuildPackage,netatalk))
+diff --git a/feeds/packages/net/netatalk/files/AppleVolumes.default b/feeds/packages/net/netatalk/files/AppleVolumes.default
+new file mode 100644
+index 0000000..5835163
+--- /dev/null
++++ b/feeds/packages/net/netatalk/files/AppleVolumes.default
+@@ -0,0 +1,2 @@
++-
++/tmp Temp allow:root,nobody cnidscheme:dbd
+diff --git a/feeds/packages/net/netatalk/files/afpd.conf b/feeds/packages/net/netatalk/files/afpd.conf
+new file mode 100644
+index 0000000..097e954
+--- /dev/null
++++ b/feeds/packages/net/netatalk/files/afpd.conf
+@@ -0,0 +1 @@
++- -noddp -uampath /usr/lib/uams -uamlist uams_guest.so,uams_passwd.so,uams_dhx_passwd.so,uams_randnum.so,uams_dhx2.so -passwdfile /etc/netatalk/afppasswd -savepassword -passwdminlen 0 -nosetpassword -defaultvol /etc/netatalk/AppleVolumes.default -systemvol /etc/netatalk/AppleVolumes.system -nouservol -guestname "nobody" -sleep 1 -icon
+diff --git a/feeds/packages/net/netatalk/files/afpd.init b/feeds/packages/net/netatalk/files/afpd.init
+new file mode 100644
+index 0000000..8b13339
+--- /dev/null
++++ b/feeds/packages/net/netatalk/files/afpd.init
+@@ -0,0 +1,23 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2010-2012 OpenWrt.org
++
++START=70
++
++MAXCONS="7"
++
++start()
++{
++ service_start /usr/sbin/cnid_metad
++ service_start /usr/sbin/afpd -c ${MAXCONS}
++}
++
++stop()
++{
++ service_stop /usr/sbin/afpd
++ service_stop /usr/sbin/cnid_metad
++}
++
++reload()
++{
++ service_reload /usr/sbin/afpd
++}
+diff --git a/feeds/packages/net/netatalk/patches/001-automake-compat.patch b/feeds/packages/net/netatalk/patches/001-automake-compat.patch
+new file mode 100644
+index 0000000..28c107a
+--- /dev/null
++++ b/feeds/packages/net/netatalk/patches/001-automake-compat.patch
+@@ -0,0 +1,9 @@
++--- a/macros/iconv.m4
+++++ b/macros/iconv.m4
++@@ -115,6 +115,5 @@ int main() {
++
++ CFLAGS="$savedcflags"
++ LDFLAGS="$savedldflags"
++- CPPFLAGS="$saved_CPPFLAGS"
++
++ ])
+diff --git a/feeds/packages/net/netatalk/patches/002-ld_library_path.patch b/feeds/packages/net/netatalk/patches/002-ld_library_path.patch
+new file mode 100644
+index 0000000..381a85b
+--- /dev/null
++++ b/feeds/packages/net/netatalk/patches/002-ld_library_path.patch
+@@ -0,0 +1,26 @@
++--- a/macros/db3-check.m4
+++++ b/macros/db3-check.m4
++@@ -148,9 +148,9 @@ AC_DEFUN([AC_PATH_BDB],[
++ dnl -- LD_LIBRARY_PATH on many platforms. This will be fairly
++ dnl -- portable hopefully. Reference:
++ dnl -- http://lists.gnu.org/archive/html/autoconf/2009-03/msg00040.html
++- eval export $shlibpath_var=$bdblibdir
+++# eval export $shlibpath_var=$bdblibdir
++ NETATALK_BDB_TRY_LINK
++- eval export $shlibpath_var=$saved_shlibpath_var
+++# eval export $shlibpath_var=$saved_shlibpath_var
++
++ if test x"${atalk_cv_bdb_version}" = x"yes"; then
++ BDB_CFLAGS="-I${bdbdir}/include${subdir}"
++@@ -171,9 +171,9 @@ AC_DEFUN([AC_PATH_BDB],[
++ CPPFLAGS="-I${bdbdir}/include${subdir} $CPPFLAGS"
++ LDFLAGS="-L$bdblibdir $LDFLAGS"
++
++- eval export $shlibpath_var=$bdblibdir
+++# eval export $shlibpath_var=$bdblibdir
++ NETATALK_BDB_TRY_LINK
++- eval export $shlibpath_var=$saved_shlibpath_var
+++# eval export $shlibpath_var=$saved_shlibpath_var
++
++ if test x"${atalk_cv_bdb_version}" = x"yes"; then
++ BDB_CFLAGS="-I${bdbdir}/include${subdir}"
+diff --git a/feeds/packages/net/netcat/Makefile b/feeds/packages/net/netcat/Makefile
+new file mode 100644
+index 0000000..0248f0d
+--- /dev/null
++++ b/feeds/packages/net/netcat/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=netcat
++PKG_VERSION:=0.7.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/$(PKG_NAME)
++PKG_MD5SUM:=0a29eff1736ddb5effd0b1ec1f6fe0ef
++PKG_MAINTAINER:=Adam Gensler <openwrt@a.gnslr.us>
++PKG_LICENSE:=GPL-2.0
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/netcat
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=A feature-rich network debugging and exploration tool.
++ URL:=http://netcat.sourceforge.net/
++endef
++
++define Package/netcat/description
++ Netcat is a featured networking utility which reads and writes data across network connections, using the TCP/IP protocol.
++ It is designed to be a reliable "back-end" tool that can be used directly or easily driven by other programs and scripts. At the same time, it is a feature-rich network debugging and exploration tool, since it can create almost any kind of connection you would need and has several interesting built-in capabilities.
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --disable-rpath \
++ --with-included-getopt \
++ )
++endef
++
++define Package/netcat/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/netcat \
++ $(1)/usr/bin
++endef
++
++define Package/netcat/postinst
++#!/bin/sh
++if [ -e $${IPKG_INSTROOT}/usr/bin/nc ]; then
++ rm -rf $${IPKG_INSTROOT}/usr/bin/nc;
++fi
++ln -s ./netcat $${IPKG_INSTROOT}/usr/bin/nc
++endef
++
++define Package/netcat/postrm
++#!/bin/sh
++rm $${IPKG_INSTROOT}/usr/bin/nc
++ln -s ../../bin/busybox $${IPKG_INSTROOT}/usr/bin/nc
++$${IPKG_INSTROOT}/usr/bin/nc 2>&1 | grep 'applet not found' > /dev/null 2>&1 && rm $${IPKG_INSTROOT}/usr/bin/nc
++exit 0
++endef
++
++
++$(eval $(call BuildPackage,netcat))
+diff --git a/feeds/packages/net/netcat/patches/001-netcat_flag_count.patch b/feeds/packages/net/netcat/patches/001-netcat_flag_count.patch
+new file mode 100644
+index 0000000..44ee9e1
+--- /dev/null
++++ b/feeds/packages/net/netcat/patches/001-netcat_flag_count.patch
+@@ -0,0 +1,22 @@
++Index: netcat-0.7.1/src/flagset.c
++===================================================================
++--- netcat-0.7.1.orig/src/flagset.c 2009-02-06 19:56:01.000000000 +0100
+++++ netcat-0.7.1/src/flagset.c 2009-02-06 19:56:13.000000000 +0100
++@@ -134,7 +134,7 @@
++
++ int netcat_flag_count(void)
++ {
++- register char c;
+++ register unsigned char c;
++ register int i;
++ int ret = 0;
++
++@@ -154,7 +154,7 @@
++ Assumed that the bit number 1 is the sign, and that we will shift the
++ bit 1 (or the bit that takes its place later) until the the most right,
++ WHY it has to keep the wrong sign? */
++- ret -= (c >> 7);
+++ ret += (c >> 7);
++ c <<= 1;
++ }
++ }
+diff --git a/feeds/packages/net/netdiscover/Makefile b/feeds/packages/net/netdiscover/Makefile
+new file mode 100644
+index 0000000..0862799
+--- /dev/null
++++ b/feeds/packages/net/netdiscover/Makefile
+@@ -0,0 +1,42 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=netdiscover
++PKG_VERSION:=0.3-pre-beta7
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-LINUXONLY.tar.gz
++PKG_SOURCE_URL:=http://nixgeneration.com/~jaime/netdiscover/releases/
++PKG_MD5SUM:=8780e66d00496e933b4064cfe9ae61da
++PKG_MAINTAINER:=Mislav Novakovic <mislav.novakovic@sartura.hr>
++PKG_LICENSE:=GPL-2.0
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/netdiscover
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libpcap +libnet-1.2.x +libpthread
++ TITLE:=An active/passive address reconnaissance tool
++ URL:=http://nixgeneration.com/~jaime/netdiscover/
++endef
++
++CONFIGURE_VARS+= \
++ CPPFLAGS="$(TARGET_CPPFLAGS) -I$(STAGING_DIR)/usr/lib/libnet-1.2.x/lib" \
++ LDFLAGS="$(TARGET_LDFLAGS) -L$(STAGING_DIR)/usr/lib/libnet-1.2.x/lib"
++
++define Package/netdiscover/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/netdiscover $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,netdiscover))
+diff --git a/feeds/packages/net/netperf/Makefile b/feeds/packages/net/netperf/Makefile
+new file mode 100644
+index 0000000..f50b7e8
+--- /dev/null
++++ b/feeds/packages/net/netperf/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2006-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=netperf
++PKG_VERSION:=2.7.0
++PKG_RELEASE:=1
++PKG_LICENSE:=Custom
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=ftp://ftp.netperf.org/netperf/
++PKG_MD5SUM:=ad1c5342d61f297c417a93133aeba65a
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/netperf
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Network performance measurement tool
++ URL:=http://www.netperf.org/
++ MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
++endef
++
++TARGET_CFLAGS+=-std=gnu89
++
++CONFIGURE_ARGS += --enable-demo
++
++define Package/netperf/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/netserver.init $(1)/etc/init.d/netserver
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/netperf $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/netserver $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/lib/netperf
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/arr_script $(1)/lib/netperf
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/packet_byte_script $(1)/lib/netperf
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/sctp_stream_script $(1)/lib/netperf
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/snapshot_script $(1)/lib/netperf
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/tcp_range_script $(1)/lib/netperf
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/tcp_rr_script $(1)/lib/netperf
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/tcp_stream_script $(1)/lib/netperf
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/udp_rr_script $(1)/lib/netperf
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/doc/examples/udp_stream_script $(1)/lib/netperf
++endef
++
++$(eval $(call BuildPackage,netperf))
+diff --git a/feeds/packages/net/netperf/files/netserver.init b/feeds/packages/net/netperf/files/netserver.init
+new file mode 100644
+index 0000000..42fcf33
+--- /dev/null
++++ b/feeds/packages/net/netperf/files/netserver.init
+@@ -0,0 +1,12 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=50
++
++start() {
++ service_start /usr/bin/netserver
++}
++
++stop() {
++ service_stop /usr/bin/netserver
++}
+diff --git a/feeds/packages/net/nfs-kernel-server/Makefile b/feeds/packages/net/nfs-kernel-server/Makefile
+new file mode 100644
+index 0000000..8c2d26d
+--- /dev/null
++++ b/feeds/packages/net/nfs-kernel-server/Makefile
+@@ -0,0 +1,157 @@
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=nfs-kernel-server
++PKG_VERSION:=1.3.3
++PKG_RELEASE:=1
++PKG_MD5SUM:=9b87d890669eaaec8e97a2b0a35b2665
++
++PKG_SOURCE_URL:=@SF/nfs
++PKG_SOURCE:=nfs-utils-$(PKG_VERSION).tar.bz2
++
++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/nfs-utils-$(PKG_VERSION)
++PKG_BUILD_DIR:=$(BUILD_DIR)/nfs-utils-$(PKG_VERSION)
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++PKG_BUILD_DEPENDS:=$(PKG_NAME)/host
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/nfs-kernel-server/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Filesystem
++ DEPENDS:=+libwrap +libblkid +libuuid $(LIBRPC_DEPENDS)
++ URL:=http://nfs.sourceforge.net/
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++endef
++
++define Package/nfs-kernel-server
++ $(call Package/nfs-kernel-server/Default)
++ TITLE:=Kernel NFS server support
++ DEPENDS+= +kmod-fs-nfsd +kmod-fs-nfs +portmap
++endef
++
++define Package/nfs-kernel-server/description
++ Kernel NFS server support
++endef
++
++define Package/nfs-kernel-server-utils
++ $(call Package/nfs-kernel-server/Default)
++ TITLE:=NFS server utils
++ DEPENDS:=nfs-kernel-server
++endef
++
++define Package/nfs-kernel-server-utils/description
++ NFS server utils
++endef
++
++define Package/nfs-kernel-server/conffiles
++/etc/exports
++endef
++
++define Package/nfs-utils
++ $(call Package/nfs-kernel-server/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS+= +libevent +USE_UCLIBC:librpc
++ TITLE:=updated mount utility (includes nfs4)
++endef
++
++define Package/nfs-utils/description
++ Updated mount.nfs command - allows mounting nfs4 volumes
++endef
++
++TARGET_CFLAGS += -I$(PKG_BUILD_DIR)/lib -I$(STAGING_DIR)/usr/include/libevent \
++ -I$(STAGING_DIR)/usr/include/ -Drpc_uint=uint
++TARGET_LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib $(LIBRPC) \
++ -L$(STAGING_DIR)/usr/lib/libevent
++
++CONFIGURE_ARGS += \
++ --disable-gss \
++ --disable-nfsv4 \
++ --disable-nfsv41 \
++ --disable-ipv6 \
++ --enable-static \
++ --enable-shared \
++ --disable-caps \
++ --disable-tirpc \
++ --disable-nfsdcld
++
++CONFIGURE_VARS += \
++ libblkid_cv_is_recent=yes \
++ CONFIG_SQLITE3_TRUE="\#" \
++ CONFIG_NFSDCLD_TRUE="\#"
++
++MAKE_FLAGS += \
++ OPT="$(TARGET_CFLAGS)" \
++ INSTALLSUID="install -m 4755" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ RPCGEN_PATH=$(STAGING_DIR_HOST)/bin/rpcgen \
++ RPCGEN=$(STAGING_DIR_HOST)/bin/rpcgen
++
++HOST_CFLAGS += -Dlinux
++
++HOST_CONFIGURE_ARGS += \
++ --disable-gss \
++ --disable-nfsv4 \
++ --disable-nfsv41 \
++ --disable-ipv6 \
++ --disable-tirpc \
++ --without-tcp-wrappers
++
++HOST_CONFIGURE_VARS += \
++ ac_cv_lib_event_event_dispatch=yes \
++ ac_cv_lib_nfsidmap_nfs4_init_name_mapping=yes \
++ ac_cv_lib_blkid_blkid_get_library_version=yes \
++ ac_cv_header_event_h=yes \
++ ac_cv_header_nfsidmap_h=yes \
++ ac_cv_header_blkid_blkid_h=yes \
++ GSSGLUE_CFLAGS=" " \
++ GSSGLUE_LIBS=" " \
++ RPCSECGSS_CFLAGS=" " \
++ RPCSECGSS_LIBS=" " \
++ CONFIG_SQLITE3_TRUE="\#" \
++ CONFIG_NFSDCLD_TRUE="\#"
++
++define Host/Compile
++ $(MAKE) -C $(HOST_BUILD_DIR)/tools/rpcgen all
++endef
++
++define Host/Install
++ $(INSTALL_BIN) $(HOST_BUILD_DIR)/tools/rpcgen/rpcgen $(STAGING_DIR_HOST)/bin/rpcgen
++endef
++
++define Package/nfs-kernel-server/install
++ $(INSTALL_DIR) $(1)/etc/init.d $(1)/usr/sbin
++ $(INSTALL_DATA) ./files/nfsd.exports $(1)/etc/exports
++ $(INSTALL_BIN) ./files/nfsd.init $(1)/etc/init.d/nfsd
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utils/statd/sm-notify $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utils/statd/statd $(1)/usr/sbin/rpc.statd
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utils/nfsd/nfsd $(1)/usr/sbin/rpc.nfsd
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utils/mountd/mountd $(1)/usr/sbin/rpc.mountd
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utils/exportfs/exportfs $(1)/usr/sbin/
++endef
++
++define Package/nfs-kernel-server-utils/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utils/showmount/showmount $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utils/nfsstat/nfsstat $(1)/usr/sbin
++endef
++
++define Package/nfs-utils/install
++ $(INSTALL_DIR) $(1)/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/sbin/mount.nfs $(1)/sbin/
++ (cd $(1)/sbin; ln -sf mount.nfs mount.nfs4; ln -sf mount.nfs umount.nfs; ln -sf mount.nfs umount.nfs4)
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,nfs-kernel-server))
++$(eval $(call BuildPackage,nfs-kernel-server-utils))
++$(eval $(call BuildPackage,nfs-utils))
+diff --git a/feeds/packages/net/nfs-kernel-server/files/nfsd.exports b/feeds/packages/net/nfs-kernel-server/files/nfsd.exports
+new file mode 100644
+index 0000000..0453e04
+--- /dev/null
++++ b/feeds/packages/net/nfs-kernel-server/files/nfsd.exports
+@@ -0,0 +1 @@
++/mnt *(ro,all_squash,insecure,sync)
+diff --git a/feeds/packages/net/nfs-kernel-server/files/nfsd.init b/feeds/packages/net/nfs-kernel-server/files/nfsd.init
+new file mode 100644
+index 0000000..af36c12
+--- /dev/null
++++ b/feeds/packages/net/nfs-kernel-server/files/nfsd.init
+@@ -0,0 +1,38 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006 OpenWrt.org
++
++START=99
++STOP=60
++
++USE_PROCD=1
++
++NFS_D=/var/lib/nfs
++LOCK_D=/var/lib/nfs/sm
++
++start_service() {
++ grep -q /proc/fs/nfsd /proc/mounts || \
++ mount -t nfsd nfsd /proc/fs/nfsd
++ mkdir -p $NFS_D
++ mkdir -p $LOCK_D
++ touch $NFS_D/rmtab
++
++ sysctl -w fs.nfs.nlm_tcpport=32777 fs.nfs.nlm_udpport=32777 > /dev/null
++
++ procd_open_instance
++ procd_set_param command /usr/sbin/rpc.statd -p 32778 -o 32779 -F
++ procd_close_instance
++
++ /usr/sbin/exportfs -r
++ /usr/sbin/rpc.nfsd
++
++ procd_open_instance
++ procd_set_param command /usr/sbin/rpc.mountd -p 32780 -F
++ procd_close_instance
++}
++
++stop_service() {
++ rpc.nfsd 0 2> /dev/null
++ /usr/sbin/exportfs -au
++ grep -q /proc/fs/nfsd /proc/mounts && \
++ umount /proc/fs/nfsd
++}
+diff --git a/feeds/packages/net/nfs-kernel-server/patches/100-no_malloc_h.patch b/feeds/packages/net/nfs-kernel-server/patches/100-no_malloc_h.patch
+new file mode 100644
+index 0000000..afe4c98
+--- /dev/null
++++ b/feeds/packages/net/nfs-kernel-server/patches/100-no_malloc_h.patch
+@@ -0,0 +1,10 @@
++--- a/tools/rpcgen/rpc_cout.c
+++++ b/tools/rpcgen/rpc_cout.c
++@@ -36,7 +36,6 @@ static char sccsid[] = "@(#)rpc_cout.c 1
++ #include <stdio.h>
++ #include <string.h>
++ #include <stdlib.h>
++-#include <malloc.h>
++ #include <ctype.h>
++ #include "rpc_parse.h"
++ #include "rpc_util.h"
+diff --git a/feeds/packages/net/nginx/Config.in b/feeds/packages/net/nginx/Config.in
+new file mode 100644
+index 0000000..a4cc4c8
+--- /dev/null
++++ b/feeds/packages/net/nginx/Config.in
+@@ -0,0 +1,175 @@
++#
++# Copyright (C) 2010-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++menu "Configuration"
++ depends on PACKAGE_nginx
++
++config NGINX_SSL
++ bool
++ prompt "Enable SSL module"
++ help
++ Enable HTTPS/SSL support.
++ default n
++
++config NGINX_DAV
++ bool
++ prompt "Enable WebDAV module"
++ help
++ Enable the HTTP and WebDAV methods PUT, DELETE, MKCOL, COPY and MOVE.
++ default n
++
++config NGINX_FLV
++ bool
++ prompt "Enable FLV module"
++ help
++ Provides the ability to seek within FLV (Flash) files using time-based offsets.
++ default n
++
++config NGINX_STUB_STATUS
++ bool
++ prompt "Enable stub status module"
++ help
++ Enable the stub status module which gives some status from the server.
++ default n
++
++config NGINX_HTTP_CHARSET
++ bool
++ prompt "Enable HTTP charset module"
++ default y
++
++config NGINX_HTTP_GZIP
++ bool
++ prompt "Enable HTTP gzip module"
++ default y
++
++config NGINX_HTTP_SSI
++ bool
++ prompt "Enable HTTP ssi module"
++ default y
++
++config NGINX_HTTP_USERID
++ bool
++ prompt "Enable HTTP userid module"
++ default y
++
++config NGINX_HTTP_ACCESS
++ bool
++ prompt "Enable HTTP access module"
++ default y
++
++config NGINX_HTTP_AUTH_BASIC
++ bool
++ prompt "Enable HTTP auth basic"
++ default y
++
++config NGINX_HTTP_AUTOINDEX
++ bool
++ prompt "Enable HTTP autoindex module"
++ default y
++
++config NGINX_HTTP_GEO
++ bool
++ prompt "Enable HTTP geo module"
++ default y
++
++config NGINX_HTTP_MAP
++ bool
++ prompt "Enable HTTP map module"
++ default y
++
++config NGINX_HTTP_SPLIT_CLIENTS
++ bool
++ prompt "Enable HTTP split clients"
++ default y
++
++config NGINX_HTTP_REFERER
++ bool
++ prompt "Enable HTTP referer module"
++ default y
++
++config NGINX_HTTP_REWRITE
++ bool
++ prompt "Enable HTTP rewrite module"
++ select NGINX_PCRE
++ default y
++
++config NGINX_HTTP_PROXY
++ bool
++ prompt "Enable HTTP proxy module"
++ default y
++
++config NGINX_HTTP_FASTCGI
++ bool
++ prompt "Enable HTTP fastcgi module"
++ default y
++
++config NGINX_HTTP_UWSGI
++ bool
++ prompt "Enable HTTP uwsgi module"
++ default y
++
++config NGINX_HTTP_SCGI
++ bool
++ prompt "Enable HTTP scgi module"
++ default y
++
++config NGINX_HTTP_MEMCACHED
++ bool
++ prompt "Enable HTTP memcached module"
++ default y
++
++config NGINX_HTTP_LIMIT_CONN
++ bool
++ prompt "Enable HTTP limit conn"
++ default y
++
++config NGINX_HTTP_LIMIT_REQ
++ bool
++ prompt "Enable HTTP limit req"
++ default y
++
++config NGINX_HTTP_EMPTY_GIF
++ bool
++ prompt "Enable HTTP empty gif"
++ default y
++
++config NGINX_HTTP_BROWSER
++ bool
++ prompt "Enable HTTP browser module"
++ default y
++
++config NGINX_HTTP_UPSTREAM_HASH
++ bool
++ prompt "Enable HTTP hash module"
++ default y
++
++config NGINX_HTTP_UPSTREAM_IP_HASH
++ bool
++ prompt "Enable HTTP IP hash module"
++ default y
++
++config NGINX_HTTP_UPSTREAM_LEAST_CONN
++ bool
++ prompt "Enable HTTP least conn module"
++ default y
++
++config NGINX_HTTP_UPSTREAM_KEEPALIVE
++ bool
++ prompt "Enable HTTP keepalive module"
++ default y
++
++config NGINX_HTTP_CACHE
++ bool
++ prompt "Enable HTTP cache"
++ default y
++
++config NGINX_PCRE
++ bool
++ prompt "Enable PCRE library usage"
++ default y
++
++endmenu
+diff --git a/feeds/packages/net/nginx/Makefile b/feeds/packages/net/nginx/Makefile
+new file mode 100644
+index 0000000..cc59715
+--- /dev/null
++++ b/feeds/packages/net/nginx/Makefile
+@@ -0,0 +1,214 @@
++#
++# Copyright (C) 2012-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=nginx
++PKG_VERSION:=1.9.6
++PKG_RELEASE:=1
++
++PKG_SOURCE:=nginx-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://nginx.org/download/
++PKG_MD5SUM:=f6899825e7a8deadba4948ff84515ad6
++PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
++PKG_LICENSE:=2-clause BSD-like license
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/nginx-$(PKG_VERSION)
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++PKG_CONFIG_DEPENDS := \
++ CONFIG_NGINX_SSL \
++ CONFIG_NGINX_DAV \
++ CONFIG_NGINX_FLV \
++ CONFIG_NGINX_STUB_STATUS \
++ CONFIG_NGINX_HTTP_CHARSET \
++ CONFIG_NGINX_HTTP_GZIP \
++ CONFIG_NGINX_HTTP_SSI \
++ CONFIG_NGINX_HTTP_USERID \
++ CONFIG_NGINX_HTTP_ACCESS \
++ CONFIG_NGINX_HTTP_AUTH_BASIC \
++ CONFIG_NGINX_HTTP_AUTOINDEX \
++ CONFIG_NGINX_HTTP_GEO \
++ CONFIG_NGINX_HTTP_MAP \
++ CONFIG_NGINX_HTTP_SPLIT_CLIENTS \
++ CONFIG_NGINX_HTTP_REFERER \
++ CONFIG_NGINX_HTTP_REWRITE \
++ CONFIG_NGINX_HTTP_PROXY \
++ CONFIG_NGINX_HTTP_FASTCGI \
++ CONFIG_NGINX_HTTP_UWSGI \
++ CONFIG_NGINX_HTTP_SCGI \
++ CONFIG_NGINX_HTTP_MEMCACHED \
++ CONFIG_NGINX_HTTP_LIMIT_CONN \
++ CONFIG_NGINX_HTTP_LIMIT_REQ \
++ CONFIG_NGINX_HTTP_EMPTY_GIF \
++ CONFIG_NGINX_HTTP_BROWSER \
++ CONFIG_NGINX_HTTP_UPSTREAM_HASH \
++ CONFIG_NGINX_HTTP_UPSTREAM_IP_HASH \
++ CONFIG_NGINX_HTTP_UPSTREAM_LEAST_CONN \
++ CONFIG_NGINX_HTTP_UPSTREAM_KEEPALIVE \
++ CONFIG_NGINX_HTTP_UPSTREAM_ZONE \
++ CONFIG_NGINX_HTTP_CACHE \
++ CONFIG_NGINX_PCRE
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/nginx
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Web Servers/Proxies
++ TITLE:=Nginx web server
++ URL:=http://nginx.org/
++ DEPENDS:=+NGINX_PCRE:libpcre +(NGINX_SSL||NGINX_HTTP_CACHE||NGINX_HTTP_AUTH_BASIC):libopenssl +NGINX_HTTP_GZIP:zlib +libpthread
++ MENU:=1
++endef
++
++define Package/nginx/description
++ nginx is an HTTP and reverse proxy server, as well as a mail proxy server,
++ written by Igor Sysoev.
++endef
++
++define Package/nginx/config
++ source "$(SOURCE)/Config.in"
++endef
++
++config_files=nginx.conf mime.types fastcgi_params koi-utf koi-win win-utf
++
++define Package/nginx/conffiles
++/etc/nginx/
++endef
++
++ADDITIONAL_MODULES:=
++ifeq ($(CONFIG_IPV6),y)
++ ADDITIONAL_MODULES += --with-ipv6
++endif
++ifeq ($(CONFIG_NGINX_STUB_STATUS),y)
++ ADDITIONAL_MODULES += --with-http_stub_status_module
++endif
++ifeq ($(CONFIG_NGINX_FLV),y)
++ ADDITIONAL_MODULES += --with-http_flv_module
++endif
++ifeq ($(CONFIG_NGINX_SSL),y)
++ ADDITIONAL_MODULES += --with-http_ssl_module
++endif
++ifeq ($(CONFIG_NGINX_DAV),y)
++ ADDITIONAL_MODULES += --with-http_dav_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_CACHE),y)
++ ADDITIONAL_MODULES += --without-http-cache
++endif
++ifneq ($(CONFIG_NGINX_PCRE),y)
++ ADDITIONAL_MODULES += --without-pcre
++endif
++ifneq ($(CONFIG_NGINX_HTTP_CHARSET),y)
++ ADDITIONAL_MODULES += --without-http_charset_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_GZIP),y)
++ ADDITIONAL_MODULES += --without-http_gzip_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_SSI),y)
++ ADDITIONAL_MODULES += --without-http_ssi_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_USERID),y)
++ ADDITIONAL_MODULES += --without-http_userid_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_ACCESS),y)
++ ADDITIONAL_MODULES += --without-http_access_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_AUTH_BASIC),y)
++ ADDITIONAL_MODULES += --without-http_auth_basic_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_AUTOINDEX),y)
++ ADDITIONAL_MODULES += --without-http_autoindex_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_GEO),y)
++ ADDITIONAL_MODULES += --without-http_geo_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_MAP),y)
++ ADDITIONAL_MODULES += --without-http_map_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_SPLIT_CLIENTS),y)
++ ADDITIONAL_MODULES += --without-http_split_clients_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_REFERER),y)
++ ADDITIONAL_MODULES += --without-http_referer_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_REWRITE),y)
++ ADDITIONAL_MODULES += --without-http_rewrite_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_PROXY),y)
++ ADDITIONAL_MODULES += --without-http_proxy_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_FASTCGI),y)
++ ADDITIONAL_MODULES += --without-http_fastcgi_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_UWSGI),y)
++ ADDITIONAL_MODULES += --without-http_uwsgi_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_SCGI),y)
++ ADDITIONAL_MODULES += --without-http_scgi_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_MEMCACHED),y)
++ ADDITIONAL_MODULES += --without-http_memcached_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_LIMIT_CONN),y)
++ ADDITIONAL_MODULES += --without-http_limit_conn_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_LIMIT_REQ),y)
++ ADDITIONAL_MODULES += --without-http_limit_req_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_EMPTY_GIF),y)
++ ADDITIONAL_MODULES += --without-http_empty_gif_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_BROWSER),y)
++ ADDITIONAL_MODULES += --without-http_browser_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_UPSTREAM_HASH),y)
++ ADDITIONAL_MODULES += --without-http_upstream_hash_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_UPSTREAM_IP_HASH),y)
++ ADDITIONAL_MODULES += --without-http_upstream_ip_hash_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_UPSTREAM_LEAST_CONN),y)
++ ADDITIONAL_MODULES += --without-http_upstream_least_conn_module
++endif
++ifneq ($(CONFIG_NGINX_HTTP_UPSTREAM_KEEPALIVE),y)
++ ADDITIONAL_MODULES += --without-http_upstream_keepalive_module
++endif
++
++define Build/Configure
++ ( cd $(PKG_BUILD_DIR) ; \
++ ./configure \
++ --crossbuild=Linux::$(ARCH) \
++ --prefix=/usr \
++ --conf-path=/etc/nginx/nginx.conf \
++ $(ADDITIONAL_MODULES) \
++ --error-log-path=/var/log/nginx/error.log \
++ --pid-path=/var/run/nginx.pid \
++ --lock-path=/var/lock/nginx.lock \
++ --http-log-path=/var/log/nginx/access.log \
++ --http-client-body-temp-path=/var/lib/nginx/body \
++ --http-proxy-temp-path=/var/lib/nginx/proxy \
++ --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
++ --with-cc="$(TARGET_CC)" \
++ --with-cc-opt="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \
++ --with-ld-opt="$(TARGET_LDFLAGS)" \
++ --without-http_upstream_zone_module \
++ )
++endef
++
++define Package/nginx/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/nginx $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/nginx
++ $(INSTALL_DATA) $(addprefix $(PKG_INSTALL_DIR)/etc/nginx/,$(config_files)) $(1)/etc/nginx/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/nginx.init $(1)/etc/init.d/nginx
++endef
++
++$(eval $(call BuildPackage,nginx))
+diff --git a/feeds/packages/net/nginx/files/nginx.init b/feeds/packages/net/nginx/files/nginx.init
+new file mode 100644
+index 0000000..d47d46f
+--- /dev/null
++++ b/feeds/packages/net/nginx/files/nginx.init
+@@ -0,0 +1,17 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=50
++
++USE_PROCD=1
++
++start_service() {
++ [ -d /var/log/nginx ] || mkdir -p /var/log/nginx
++ [ -d /var/lib/nginx ] || mkdir -p /var/lib/nginx
++
++ procd_open_instance
++ procd_set_param command /usr/sbin/nginx -c /etc/nginx/nginx.conf -g 'daemon off;'
++ procd_set_param file /etc/nginx/nginx.conf
++ procd_set_param respawn
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/nginx/patches/101-feature_test_fix.patch b/feeds/packages/net/nginx/patches/101-feature_test_fix.patch
+new file mode 100644
+index 0000000..a345c0e
+--- /dev/null
++++ b/feeds/packages/net/nginx/patches/101-feature_test_fix.patch
+@@ -0,0 +1,107 @@
++--- a/auto/cc/name
+++++ b/auto/cc/name
++@@ -7,7 +7,7 @@ if [ "$NGX_PLATFORM" != win32 ]; then
++
++ ngx_feature="C compiler"
++ ngx_feature_name=
++- ngx_feature_run=yes
+++ ngx_feature_run=
++ ngx_feature_incs=
++ ngx_feature_path=
++ ngx_feature_libs=
++--- a/auto/cc/conf
+++++ b/auto/cc/conf
++@@ -178,7 +178,7 @@ if [ "$NGX_PLATFORM" != win32 ]; then
++ else
++ ngx_feature="C99 variadic macros"
++ ngx_feature_name="NGX_HAVE_C99_VARIADIC_MACROS"
++- ngx_feature_run=yes
+++ ngx_feature_run=no
++ ngx_feature_incs="#include <stdio.h>
++ #define var(dummy, ...) sprintf(__VA_ARGS__)"
++ ngx_feature_path=
++@@ -192,7 +192,7 @@ if [ "$NGX_PLATFORM" != win32 ]; then
++
++ ngx_feature="gcc variadic macros"
++ ngx_feature_name="NGX_HAVE_GCC_VARIADIC_MACROS"
++- ngx_feature_run=yes
+++ ngx_feature_run=no
++ ngx_feature_incs="#include <stdio.h>
++ #define var(dummy, args...) sprintf(args)"
++ ngx_feature_path=
++--- a/auto/os/linux
+++++ b/auto/os/linux
++@@ -36,7 +36,7 @@ fi
++
++ ngx_feature="epoll"
++ ngx_feature_name="NGX_HAVE_EPOLL"
++-ngx_feature_run=yes
+++ngx_feature_run=no
++ ngx_feature_incs="#include <sys/epoll.h>"
++ ngx_feature_path=
++ ngx_feature_libs=
++@@ -93,7 +93,7 @@ ngx_feature_test="int fd; struct stat sb
++ CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE"
++ ngx_feature="sendfile()"
++ ngx_feature_name="NGX_HAVE_SENDFILE"
++-ngx_feature_run=yes
+++ngx_feature_run=no
++ ngx_feature_incs="#include <sys/sendfile.h>
++ #include <errno.h>"
++ ngx_feature_path=
++@@ -114,7 +114,7 @@ fi
++ CC_AUX_FLAGS="$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"
++ ngx_feature="sendfile64()"
++ ngx_feature_name="NGX_HAVE_SENDFILE64"
++-ngx_feature_run=yes
+++ngx_feature_run=no
++ ngx_feature_incs="#include <sys/sendfile.h>
++ #include <errno.h>"
++ ngx_feature_path=
++@@ -132,7 +132,7 @@ ngx_include="sys/prctl.h"; . auto/includ
++
++ ngx_feature="prctl(PR_SET_DUMPABLE)"
++ ngx_feature_name="NGX_HAVE_PR_SET_DUMPABLE"
++-ngx_feature_run=yes
+++ngx_feature_run=no
++ ngx_feature_incs="#include <sys/prctl.h>"
++ ngx_feature_path=
++ ngx_feature_libs=
++--- a/auto/unix
+++++ b/auto/unix
++@@ -678,7 +678,7 @@ ngx_feature_test="void *p; p = memalign(
++
++ ngx_feature="mmap(MAP_ANON|MAP_SHARED)"
++ ngx_feature_name="NGX_HAVE_MAP_ANON"
++-ngx_feature_run=yes
+++ngx_feature_run=no
++ ngx_feature_incs="#include <sys/mman.h>"
++ ngx_feature_path=
++ ngx_feature_libs=
++@@ -691,7 +691,7 @@ ngx_feature_test="void *p;
++
++ ngx_feature='mmap("/dev/zero", MAP_SHARED)'
++ ngx_feature_name="NGX_HAVE_MAP_DEVZERO"
++-ngx_feature_run=yes
+++ngx_feature_run=no
++ ngx_feature_incs="#include <sys/mman.h>
++ #include <sys/stat.h>
++ #include <fcntl.h>"
++@@ -706,7 +706,7 @@ ngx_feature_test='void *p; int fd;
++
++ ngx_feature="System V shared memory"
++ ngx_feature_name="NGX_HAVE_SYSVSHM"
++-ngx_feature_run=yes
+++ngx_feature_run=no
++ ngx_feature_incs="#include <sys/ipc.h>
++ #include <sys/shm.h>"
++ ngx_feature_path=
++@@ -720,7 +720,7 @@ ngx_feature_test="int id;
++
++ ngx_feature="POSIX semaphores"
++ ngx_feature_name="NGX_HAVE_POSIX_SEM"
++-ngx_feature_run=yes
+++ngx_feature_run=no
++ ngx_feature_incs="#include <semaphore.h>"
++ ngx_feature_path=
++ ngx_feature_libs=
+diff --git a/feeds/packages/net/nginx/patches/102-sizeof_test_fix.patch b/feeds/packages/net/nginx/patches/102-sizeof_test_fix.patch
+new file mode 100644
+index 0000000..0cd93cc
+--- /dev/null
++++ b/feeds/packages/net/nginx/patches/102-sizeof_test_fix.patch
+@@ -0,0 +1,26 @@
++--- a/auto/types/sizeof
+++++ b/auto/types/sizeof
++@@ -25,8 +25,13 @@ $NGX_INCLUDE_UNISTD_H
++ $NGX_INCLUDE_INTTYPES_H
++ $NGX_INCLUDE_AUTO_CONFIG_H
++
+++char object_code_block[] = {
+++ '\n', 'e', '4', 'V', 'A',
+++ '0', 'x', ('0' + sizeof($ngx_type)),
+++ 'Y', '3', 'p', 'M', '\n'
+++};
+++
++ int main() {
++- printf("%d", (int) sizeof($ngx_type));
++ return 0;
++ }
++
++@@ -40,7 +45,7 @@ eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&
++
++
++ if [ -x $NGX_AUTOTEST ]; then
++- ngx_size=`$NGX_AUTOTEST`
+++ ngx_size=`sed -ne 's/^e4VA0x\(.\)Y3pM$/\1/p' < $NGX_AUTOTEST`
++ echo " $ngx_size bytes"
++ fi
++
+diff --git a/feeds/packages/net/nginx/patches/103-sys_nerr.patch b/feeds/packages/net/nginx/patches/103-sys_nerr.patch
+new file mode 100644
+index 0000000..5f5d106
+--- /dev/null
++++ b/feeds/packages/net/nginx/patches/103-sys_nerr.patch
+@@ -0,0 +1,12 @@
++--- a/src/os/unix/ngx_errno.c
+++++ b/src/os/unix/ngx_errno.c
++@@ -8,6 +8,9 @@
++ #include <ngx_config.h>
++ #include <ngx_core.h>
++
+++#ifndef NGX_SYS_NERR
+++#define NGX_SYS_NERR 128
+++#endif
++
++ /*
++ * The strerror() messages are copied because:
+diff --git a/feeds/packages/net/nginx/patches/200-config.patch b/feeds/packages/net/nginx/patches/200-config.patch
+new file mode 100644
+index 0000000..f350095
+--- /dev/null
++++ b/feeds/packages/net/nginx/patches/200-config.patch
+@@ -0,0 +1,18 @@
++--- a/conf/nginx.conf
+++++ b/conf/nginx.conf
++@@ -1,5 +1,5 @@
++
++-#user nobody;
+++user nobody nogroup;
++ worker_processes 1;
++
++ #error_log logs/error.log;
++@@ -16,7 +16,7 @@ events {
++
++ http {
++ include mime.types;
++- default_type application/octet-stream;
+++ #default_type application/octet-stream;
++
++ #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
++ # '$status $body_bytes_sent "$http_referer" '
+diff --git a/feeds/packages/net/ngircd/Makefile b/feeds/packages/net/ngircd/Makefile
+new file mode 100644
+index 0000000..a431cd9
+--- /dev/null
++++ b/feeds/packages/net/ngircd/Makefile
+@@ -0,0 +1,109 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ngircd
++PKG_VERSION:=22.1
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Claudio Leite <leitec@staticky.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:= \
++ http://ngircd.barton.de/pub/ngircd/ \
++ ftp://ftp.berlios.de/pub/ngircd/
++PKG_MD5SUM:=586c4fef1fbb77dcbe723e9136ec08eb
++
++PKG_INSTALL:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ngircd/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Instant Messaging
++ DEPENDS:=+zlib
++ TITLE:=Next Generation IRC Server
++ URL:=http://ngircd.barton.de
++endef
++
++define Package/ngircd/Default/description
++ ngIRCd is an Open Source server for the Internet Relay Chat (IRC), which
++ is developed and published under the terms of the GNU General Public Licence.
++ ngIRCd means "next generation IRC daemon", it's written from scratch and
++ not deduced from the "grandfather of IRC daemons", the daemon of the IRCNet.
++endef
++
++define Package/ngircd
++ $(call Package/ngircd/Default)
++ TITLE+= (with OpenSSL support)
++ DEPENDS+= +libopenssl
++ VARIANT:=ssl
++endef
++
++define Package/ngircd/conffiles
++/etc/ngircd.conf
++endef
++
++define Package/ngircd/description
++ $(call Package/ngircd/Default/description)
++ This package is built with OpenSSL support.
++endef
++
++define Package/ngircd-nossl
++$(call Package/ngircd/Default)
++ TITLE+= (without OpenSSL support)
++ VARIANT:=nossl
++endef
++
++Package/ngircd-nossl/conffiles = $(Package/ngircd/conffiles)
++
++define Package/ngircd-nossl/description
++ $(call Package/ngircd/Default/description)
++ This package is built without OpenSSL support.
++endef
++
++ifeq ($(CONFIG_IPV6),y)
++ CONFIGURE_ARGS += \
++ --enable-ipv6
++endif
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS += \
++ --with-openssl="$(STAGING_DIR)/usr"
++endif
++
++ifeq ($(BUILD_VARIANT),nossl)
++ CONFIGURE_ARGS += \
++ --without-openssl
++endif
++
++# The test for HAVE_WORKING_GETADDRINFO fails
++# when cross-compiling.
++#
++define Build/Configure
++ $(call Build/Configure/Default)
++ $(SED) 's/\/\* #undef HAVE_WORKING_GETADDRINFO \*\//#define HAVE_WORKING_GETADDRINFO 1/' $(PKG_BUILD_DIR)/src/config.h
++endef
++
++define Package/ngircd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ngircd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/ngircd.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/ngircd.init $(1)/etc/init.d/ngircd
++endef
++
++Package/ngircd-nossl/install = $(Package/ngircd/install)
++
++$(eval $(call BuildPackage,ngircd))
++$(eval $(call BuildPackage,ngircd-nossl))
+diff --git a/feeds/packages/net/ngircd/files/ngircd.init b/feeds/packages/net/ngircd/files/ngircd.init
+new file mode 100644
+index 0000000..6a21358
+--- /dev/null
++++ b/feeds/packages/net/ngircd/files/ngircd.init
+@@ -0,0 +1,11 @@
++#!/bin/sh /etc/rc.common
++
++START=65
++
++start() {
++ service_start /usr/sbin/ngircd
++}
++
++stop() {
++ service_stop /usr/sbin/ngircd
++}
+diff --git a/feeds/packages/net/nmap/Makefile b/feeds/packages/net/nmap/Makefile
+new file mode 100644
+index 0000000..251b91e
+--- /dev/null
++++ b/feeds/packages/net/nmap/Makefile
+@@ -0,0 +1,143 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++#TODO
++#
++# * uClibcpp not supported, performance +100x slower. libstdcpp is being used. https://bugs.busybox.net/show_bug.cgi?id=2545
++# * liblua is still not recognized/blindly accepted. Impossible to compile with support
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=nmap
++PKG_VERSION:=6.47
++PKG_RELEASE:=2
++PKG_MAINTAINER=Nuno Goncalves <nunojpg@gmail.com>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://nmap.org/dist/
++PKG_MD5SUM:=edfe81f6763223c0a29bfa15a8526e2a
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++NMAP_DEPENDS:=+libpcap +libstdcpp
++NCAT_DEPENDS:=+libpcap
++NPING_DEPENDS:=+libpcap +libpthread +libstdcpp
++NDIFF_DEPENDS:=+python
++
++define Package/nmap/default
++ SUBMENU:=NMAP Suite
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://nmap.org/
++endef
++
++define Package/nmap
++$(call Package/nmap/default)
++ DEPENDS:=$(NMAP_DEPENDS)
++ VARIANT:=nossl
++ TITLE:=Utility for network exploration or security auditing
++endef
++
++define Package/nmap-ssl
++$(call Package/nmap/default)
++ DEPENDS:=$(NMAP_DEPENDS) +libopenssl
++ VARIANT:=ssl
++ TITLE:=Nmap (with OpenSSL support)
++endef
++
++define Package/ncat
++$(call Package/nmap/default)
++ DEPENDS:=$(NCAT_DEPENDS)
++ VARIANT:=nossl
++ TITLE:=Much-improved reimplementation of Netcat
++endef
++
++define Package/ncat-ssl
++$(call Package/nmap/default)
++ DEPENDS:=$(NCAT_DEPENDS) +libopenssl
++ VARIANT:=ssl
++ TITLE:=Ncat (with OpenSSL support)
++endef
++
++define Package/nping
++$(call Package/nmap/default)
++ DEPENDS:=$(NPING_DEPENDS)
++ VARIANT:=nossl
++ TITLE:=Network packet generation tool / ping utility
++endef
++
++define Package/ndiff
++$(call Package/nmap/default)
++ DEPENDS:=$(NDIFF_DEPENDS)
++ VARIANT:=nossl
++ TITLE:=Utility to compare the results of Nmap scans
++endef
++
++CONFIGURE_ARGS += \
++ --with-libdnet=included \
++ --with-libpcre=included \
++ --with-libpcap="$(STAGING_DIR)/usr" \
++ --without-liblua \
++ --without-zenmap
++
++CONFIGURE_VARS += CXXFLAGS="$$$$CXXFLAGS -fno-builtin"
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS += --with-openssl="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS += --without-openssl
++endif
++
++define Package/nmap/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/nmap $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/share/nmap
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/nmap/* $(1)/usr/share/nmap/
++endef
++
++define Package/nmap-ssl/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/nmap $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/share/nmap
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/nmap/* $(1)/usr/share/nmap/
++endef
++
++define Package/ncat/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ncat $(1)/usr/bin/
++endef
++
++define Package/ncat-ssl/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ncat $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/share/ncat
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/ncat/ca-bundle.crt $(1)/usr/share/ncat/
++endef
++
++define Package/ndiff/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ndiff $(1)/usr/bin/
++endef
++
++define Package/nping/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/nping $(1)/usr/bin/
++endef
++
++
++$(eval $(call BuildPackage,nmap))
++$(eval $(call BuildPackage,nmap-ssl))
++$(eval $(call BuildPackage,ncat))
++$(eval $(call BuildPackage,ncat-ssl))
++$(eval $(call BuildPackage,nping))
++$(eval $(call BuildPackage,ndiff))
+diff --git a/feeds/packages/net/nsd/Makefile b/feeds/packages/net/nsd/Makefile
+new file mode 100644
+index 0000000..14b2144
+--- /dev/null
++++ b/feeds/packages/net/nsd/Makefile
+@@ -0,0 +1,135 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=nsd
++PKG_VERSION:=4.1.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.nlnetlabs.nl/downloads/nsd
++PKG_MD5SUM:=73014bab5514b9babaf6c9007a6b36d8
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_LICENSE:=BSD-3c
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_MAINTAINER:=Vasilis Tsiligiannis <acinonyx@openwrt.gr>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/nsd/default
++ TITLE:=NSD Name Server Daemon
++ URL:=http://www.nlnetlabs.nl/projects/nsd/
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++endef
++
++define Package/nsd/default/description
++ NSD is an authoritative only, high performance, simple and open source name
++ server.
++endef
++
++define Package/nsd
++ $(Package/nsd/default)
++ TITLE += (with SSL support)
++ DEPENDS += +libopenssl
++ VARIANT:=ssl
++endef
++
++define Package/nsd/description
++ $(Package/nsd/default/description)
++endef
++
++define Package/nsd-nossl
++ $(Package/nsd/default)
++ TITLE += (without SSL support)
++ VARIANT:=nossl
++endef
++
++define Package/nsd-nossl/description
++ $(Package/nsd/default/description)
++endef
++
++define Package/nsd-checkconf/description
++ $(Package/nsd/default/description)
++endef
++
++define Package/nsd-control
++ $(Package/nsd/default)
++ TITLE += remote control utility
++ DEPENDS += +libopenssl
++endef
++
++define Package/nsd-control/description
++ $(Package/nsd/default/description)
++endef
++
++define Package/nsd-control-setup
++ $(Package/nsd/default)
++ TITLE += SSL keys setup script
++ DEPENDS += +openssl-util
++endef
++
++define Package/nsd-control-setup/description
++ $(Package/nsd/default/description)
++endef
++
++CONFIGURE_ARGS+= \
++ --disable-checking \
++ --with-libevent=no \
++ --with-user="network" \
++
++CONFIGURE_VARS+= \
++ ac_cv_c_va_list_def=no \
++ ac_cv_c_strptime_needs_defs=no \
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS += \
++ --with-ssl="$(STAGING_DIR)/usr"
++endif
++
++ifeq ($(BUILD_VARIANT),nossl)
++ CONFIGURE_ARGS += \
++ --without-ssl
++endif
++
++define Package/nsd/conffiles
++/etc/nsd/
++endef
++
++define Package/nsd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/{nsd,nsd-checkconf} $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/nsd
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/nsd/nsd.conf.sample $(1)/etc/nsd/nsd.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/nsd.init $(1)/etc/init.d/nsd
++endef
++
++define Package/nsd-control/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/nsd-control $(1)/usr/sbin/
++endef
++
++define Package/nsd-control-setup/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/nsd-control-setup $(1)/usr/sbin/
++endef
++
++Package/nsd-nossl/install = $(Package/nsd/install)
++Package/nsd-nossl/conffiles = $(Package/nsd/conffiles)
++
++$(eval $(call BuildPackage,nsd))
++$(eval $(call BuildPackage,nsd-nossl))
++$(eval $(call BuildPackage,nsd-control))
++$(eval $(call BuildPackage,nsd-control-setup))
+diff --git a/feeds/packages/net/nsd/files/nsd.init b/feeds/packages/net/nsd/files/nsd.init
+new file mode 100644
+index 0000000..8b1cf1d
+--- /dev/null
++++ b/feeds/packages/net/nsd/files/nsd.init
+@@ -0,0 +1,16 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=60
++USE_PROCD=1
++PROG=/usr/sbin/nsd
++
++start_service() {
++ mkdir -p /var/db/nsd
++ chown network /var/db/nsd
++ chmod 640 /etc/nsd/*.conf 2>/dev/null
++ chgrp network /etc/nsd/*.conf 2>/dev/null
++ procd_open_instance
++ procd_set_param command "$PROG" -d
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/ntpclient/Makefile b/feeds/packages/net/ntpclient/Makefile
+new file mode 100644
+index 0000000..bca4b65
+--- /dev/null
++++ b/feeds/packages/net/ntpclient/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ntpclient
++PKG_VERSION:=2010_365
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://doolittle.icarus.com/ntpclient/
++PKG_MD5SUM:=a64689398f2df8933ee0d8da246e9eaa
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=GPL-2.0
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-2010
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ntpclient
++ SUBMENU:=Time Synchronization
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=NTP (Network Time Protocol) client
++ URL:=http://doolittle.icarus.com/ntpclient/
++ DEPENDS:=+librt
++endef
++
++define Package/ntpclient/description
++ NTP client for setting system time from NTP servers.
++endef
++
++define Package/ntpclient/conffiles
++/etc/config/ntpclient
++endef
++
++MAKE_FLAGS += \
++ all adjtimex
++
++define Package/ntpclient/install
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
++ $(INSTALL_DATA) ./files/ntpclient.hotplug $(1)/etc/hotplug.d/iface/20-ntpclient
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/ntpclient.config $(1)/etc/config/ntpclient
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ntpclient $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/adjtimex $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/rate.awk $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,ntpclient))
+diff --git a/feeds/packages/net/ntpclient/files/ntpclient.config b/feeds/packages/net/ntpclient/files/ntpclient.config
+new file mode 100644
+index 0000000..10be886
+--- /dev/null
++++ b/feeds/packages/net/ntpclient/files/ntpclient.config
+@@ -0,0 +1,23 @@
++config ntpserver
++ option hostname '0.openwrt.pool.ntp.org'
++ option port '123'
++
++config ntpserver
++ option hostname '1.openwrt.pool.ntp.org'
++ option port '123'
++
++config ntpserver
++ option hostname '2.openwrt.pool.ntp.org'
++ option port '123'
++
++config ntpserver
++ option hostname '3.openwrt.pool.ntp.org'
++ option port '123'
++
++config ntpdrift
++ option freq '0'
++
++config ntpclient
++ option interval 600
++ #option count 10
++ #option interface wan
+diff --git a/feeds/packages/net/ntpclient/files/ntpclient.hotplug b/feeds/packages/net/ntpclient/files/ntpclient.hotplug
+new file mode 100644
+index 0000000..cdf18ee
+--- /dev/null
++++ b/feeds/packages/net/ntpclient/files/ntpclient.hotplug
+@@ -0,0 +1,78 @@
++#!/bin/sh
++# Copyright (C) 2006-2014 OpenWrt.org
++
++. /lib/functions.sh
++
++unset SERVER
++unset PORT
++unset INTERVAL
++unset COUNT
++unset INTERFACE_GLOBAL
++
++NTPC=`which ntpclient`
++
++check_server() {
++ local hostname
++ local port
++ local interface
++ [ -n "$SERVER" ] && return
++ config_get hostname $1 hostname
++ config_get port $1 port
++ config_get interface $1 interface
++
++ [ -z "$interface" ] && interface=$INTERFACE_GLOBAL
++
++ [ -n "$interface" ] && {
++ # $INTERFACE is passed from hotplug event
++ [ "$interface" = "$INTERFACE" ] || return
++ }
++
++ [ -z "$hostname" ] && return
++ $NTPC -c 1 -p ${port:-123} -i 2 -h $hostname > /dev/null && { SERVER=$hostname; PORT=${port:-123}; }
++}
++
++set_drift() {
++ config_get freq $1 freq
++ [ -n "$freq" ] && adjtimex -f $freq >/dev/null
++}
++
++start_ntpclient() {
++ config_foreach set_drift ntpdrift
++ config_foreach check_server ntpserver
++ [ -z "$SERVER" ] && exit 0
++ logger starting ntpclient
++ $NTPC ${COUNT:+-c $COUNT} ${INTERVAL:+-i $INTERVAL} -s -l -D -p $PORT -h $SERVER 2> /dev/null
++}
++
++stop_ntpclient() {
++ logger stopping ntpclient
++ killall ntpclient
++}
++
++load_settings() {
++ local interval
++ local count
++ local iface
++
++ config_get interval $1 interval
++ config_get count $1 count
++ config_get interface $1 interface
++
++ [ -n "$count" ] && COUNT=$count
++ [ -n "$interval" ] && INTERVAL=$interval
++ [ -n "$interface" ] && INTERFACE_GLOBAL=$interface
++}
++
++config_load ntpclient
++config_foreach load_settings ntpclient
++
++NTP_RUNNING=`ps | grep $NTPC | grep -v grep`
++
++case "${ACTION:-ifup}" in
++ ifup)
++ [ -z "$NTP_RUNNING" ] && start_ntpclient
++ ;;
++ ifdown)
++ [ -n "$NTP_RUNNING" ] && stop_ntpclient
++ ;;
++esac
+diff --git a/feeds/packages/net/ntpclient/patches/100-daemon.patch b/feeds/packages/net/ntpclient/patches/100-daemon.patch
+new file mode 100644
+index 0000000..aa35f96
+--- /dev/null
++++ b/feeds/packages/net/ntpclient/patches/100-daemon.patch
+@@ -0,0 +1,22 @@
++--- a/ntpclient.c
+++++ b/ntpclient.c
++@@ -611,7 +611,7 @@ int main(int argc, char *argv[]) {
++ ntpc.cross_check=1;
++
++ for (;;) {
++- c = getopt( argc, argv, "c:" DEBUG_OPTION "f:g:h:i:lp:q:" REPLAY_OPTION "st");
+++ c = getopt( argc, argv, "c:" DEBUG_OPTION "f:g:h:i:lp:q:" REPLAY_OPTION "stD");
++ if (c == EOF) break;
++ switch (c) {
++ case 'c':
++@@ -660,6 +660,10 @@ int main(int argc, char *argv[]) {
++ (ntpc.cross_check)=0;
++ break;
++
+++ case 'D':
+++ daemon(0, 0);
+++ break;
+++
++ default:
++ usage(argv[0]);
++ exit(1);
+diff --git a/feeds/packages/net/ntpd/Makefile b/feeds/packages/net/ntpd/Makefile
+new file mode 100644
+index 0000000..787e779
+--- /dev/null
++++ b/feeds/packages/net/ntpd/Makefile
+@@ -0,0 +1,160 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ntp
++PKG_VERSION:=4.2.8p2
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/
++PKG_MD5SUM:=fa37049383316322d060ec9061ac23a9
++
++PKG_LICENSE:=Unique
++PKG_LICENSE_FILES:=COPYRIGHT html/copyright.html
++
++PKG_FIXUP:=autoreconf
++PKG_LIBTOOL_PATHS:=. sntp
++PKG_CHECK_FORMAT_SECURITY:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ntpd/Default
++ SUBMENU:=Time Synchronization
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=ISC ntp
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++ URL:=http://www.ntp.org/
++ DEPENDS:=+libopenssl +libpthread
++endef
++
++define Package/ntpd/Default/description
++ The ISC ntp suite is a collection of tools used to synchronize the
++ system clock with remote NTP time servers and run/monitor local NTP
++ servers.
++endef
++
++define Package/ntpd
++$(call Package/ntpd/Default)
++ TITLE+= server
++ DEPENDS+= +libcap
++ USERID:=ntp=123:ntp=123
++endef
++
++define Package/ntpd/description
++$(call Package/ntpd/Default/description)
++ .
++ This package contains the ntpd server.
++endef
++
++define Package/ntpdate
++$(call Package/ntpd/Default)
++ TITLE+=date
++endef
++
++define Package/ntpdate/description
++$(call Package/ntpd/Default/description)
++ .
++ This package contains ntpdate.
++endef
++
++define Package/ntp-utils
++$(call Package/ntpd/Default)
++ TITLE+= utilities
++endef
++
++define Package/ntp-utils/description
++$(call Package/ntpd/Default/description)
++ .
++ This package contains ntpdc, ntpq and ntptime.
++endef
++
++define Package/ntp-keygen
++$(call Package/ntpd/Default)
++ TITLE+=keygen
++endef
++
++define Package/ntp-keygen/description
++$(call Package/ntpd/Default/description)
++ .
++ This package contains the ntp-keygen.
++endef
++
++define Package/ntpd/conffiles
++/etc/ntp.conf
++endef
++
++CONFIGURE_VARS += \
++ ac_cv_header_md5_h=no \
++ ac_cv_lib_rt_sched_setscheduler=no \
++ ac_cv_header_dns_sd_h=no \
++ hw_cv_func_snprintf_c99=yes \
++ hw_cv_func_vsnprintf_c99=yes \
++
++CONFIGURE_ARGS += \
++ --disable-all-clocks \
++ --disable-parse-clocks \
++ --without-ntpsnmpd \
++ --without-lineeditlibs \
++ --enable-NMEA \
++ --enable-LOCAL-CLOCK \
++ --enable-SHM \
++ --enable-ATOM \
++ --enable-linuxcaps \
++ --with-yielding-select=yes \
++ --with-crypto \
++ --with-openssl-incdir="$(STAGING_DIR)/usr/include" \
++ --with-openssl-libdir="$(STAGING_DIR)/usr/lib"
++
++define Package/ntpd/install
++ $(INSTALL_DIR) $(1)/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ntpd/ntpd $(1)/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) ./files/ntp.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/ntpd.init $(1)/etc/init.d/ntpd
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
++ $(INSTALL_BIN) ./files/ntpd.hotplug $(1)/etc/hotplug.d/iface/20-ntpd
++endef
++
++define Package/ntpd/postinst
++#!/bin/sh
++[ -L "$${IPKG_INSTROOT}/usr/sbin/ntpd" ] && rm -f "$${IPKG_INSTROOT}/usr/sbin/ntpd"
++exit 0
++endef
++
++define Package/ntpd/postrm
++#!/bin/sh
++/bin/busybox ntpd -h 2>&1 | grep -q BusyBox && ln -sf ../../bin/busybox /usr/sbin/ntpd
++exit 0
++endef
++
++define Package/ntpdate/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ntpdate/ntpdate $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/ntpdate.init $(1)/etc/init.d/ntpdate
++endef
++
++define Package/ntp-utils/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ntpdc/ntpdc $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ntpq/ntpq $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/util/ntptime $(1)/usr/sbin/
++endef
++
++define Package/ntp-keygen/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/util/ntp-keygen $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,ntpd))
++$(eval $(call BuildPackage,ntpdate))
++$(eval $(call BuildPackage,ntp-utils))
++$(eval $(call BuildPackage,ntp-keygen))
+diff --git a/feeds/packages/net/ntpd/files/ntp.conf b/feeds/packages/net/ntpd/files/ntp.conf
+new file mode 100644
+index 0000000..8bfb8e3
+--- /dev/null
++++ b/feeds/packages/net/ntpd/files/ntp.conf
+@@ -0,0 +1,26 @@
++# use a random selection of 4 public stratum 2 servers
++# see http://twiki.ntp.org/bin/view/Servers/NTPPoolServers
++
++#restrict default nomodify notrap noquery
++#restrict default noquery
++
++restrict 127.0.0.1
++
++driftfile /var/lib/ntp/ntp.drift
++
++server 0.openwrt.pool.ntp.org iburst
++server 1.openwrt.pool.ntp.org iburst
++server 2.openwrt.pool.ntp.org iburst
++server 3.openwrt.pool.ntp.org iburst
++
++
++# GPS(NMEA)+PPS
++#server 127.127.20.0 minpoll 4 prefer
++#fudge 127.127.20.0 flag3 1 flag2 0
++
++# SMA PPS
++#server 127.127.28.0 minpoll 4 prefer
++#fudge 127.127.28.0 refid PPS flag3 1
++
++#server 192.168.1.253
++
+diff --git a/feeds/packages/net/ntpd/files/ntpd.hotplug b/feeds/packages/net/ntpd/files/ntpd.hotplug
+new file mode 100644
+index 0000000..975be75
+--- /dev/null
++++ b/feeds/packages/net/ntpd/files/ntpd.hotplug
+@@ -0,0 +1,10 @@
++NAME=ntpd
++CONFIG=/etc/ntp.conf
++COMMAND=/sbin/$NAME
++
++[ "$ACTION" = "ifup" -a "$INTERFACE" = "wan" ] && {
++ [ -x $COMMAND ] && [ -r $CONFIG ] && {
++ killall ntpd
++ /etc/init.d/ntpd start
++ } &
++}
+diff --git a/feeds/packages/net/ntpd/files/ntpd.init b/feeds/packages/net/ntpd/files/ntpd.init
+new file mode 100644
+index 0000000..e626e24
+--- /dev/null
++++ b/feeds/packages/net/ntpd/files/ntpd.init
+@@ -0,0 +1,18 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=65
++STOP=65
++
++USE_PROCD=1
++
++start_service() {
++# ln -sf /dev/ttyS0 /dev/gps0
++# /usr/sbin/setgarmin -d /dev/gps -c /etc/setgarmin.conf
++ mkdir -p /var/lib/ntp
++ chown -R ntp:ntp /var/lib/ntp
++
++ procd_open_instance
++ procd_set_param command /sbin/ntpd -g -u ntp:ntp -p /var/run/ntpd.pid -n
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/ntpd/files/ntpdate.init b/feeds/packages/net/ntpd/files/ntpdate.init
+new file mode 100644
+index 0000000..2f33210
+--- /dev/null
++++ b/feeds/packages/net/ntpd/files/ntpdate.init
+@@ -0,0 +1,13 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2008 OpenWrt.org
++
++START=60
++
++STEP_SERVERS="0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org"
++TIMEOUT="2" # in seconds
++
++start() {
++ for s in $STEP_SERVERS ; do
++ /usr/sbin/ntpdate -s -b -u -t "$TIMEOUT" "$s" && break
++ done
++}
+diff --git a/feeds/packages/net/ntripcaster/Makefile b/feeds/packages/net/ntripcaster/Makefile
+new file mode 100644
+index 0000000..7828a25
+--- /dev/null
++++ b/feeds/packages/net/ntripcaster/Makefile
+@@ -0,0 +1,49 @@
++#
++# Copyright (C) 2011 segal.ubi.pt
++# Copyright (C) 2010-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ntripcaster
++PKG_VERSION:=0.1.5
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/nunojpg/ntripcaster.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=03878920195cf854b38a1ea424f1cae57353fa87
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_LICENSE:=GPL-2.0+
++
++PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ntripcaster
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=NTRIP
++ TITLE:=Standard Ntrip Broadcaster
++ URL:=http://igs.bkg.bund.de/ntrip/download
++ DEPENDS:=+libpthread
++endef
++
++define Package/ntripcaster/description
++ BKG Standard Ntrip Broadcaster
++endef
++
++define Package/ntripcaster/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ntripcaster $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/share/ntripcaster/conf
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/conf/ntripcaster.conf.dist $(1)/usr/share/ntripcaster/conf/
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/conf/sourcetable.dat.dist $(1)/usr/share/ntripcaster/conf/
++endef
++
++$(eval $(call BuildPackage,ntripcaster))
+diff --git a/feeds/packages/net/ntripclient/Makefile b/feeds/packages/net/ntripclient/Makefile
+new file mode 100644
+index 0000000..f0d92d5
+--- /dev/null
++++ b/feeds/packages/net/ntripclient/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2011 segal.ubi.pt
++# Copyright (C) 2010-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ntripclient
++PKG_VERSION:=1.5.0
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/nunojpg/ntripclient.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=dcfb2cb3e6f31b7291a94e7f86379c78ffc0d44e
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_LICENSE:=GPL-2.0+
++
++PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ntripclient
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=NTRIP
++ TITLE:=Ntrip Version 2.0 Command Line Client
++ URL:=http://igs.bkg.bund.de/ntrip/download
++endef
++
++define Package/ntripclient/description
++ Ntrip Version 2.0 Command Line Client, reading from Ntrip Version 1.0 or 2.0 Caster
++endef
++
++MAKE_FLAGS += \
++ OPTS="$(TARGET_CFLAGS)"
++
++define Package/ntripclient/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ntripclient $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,ntripclient))
+diff --git a/feeds/packages/net/ntripclient/patches/100-musl-compat.patch b/feeds/packages/net/ntripclient/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..10f690f
+--- /dev/null
++++ b/feeds/packages/net/ntripclient/patches/100-musl-compat.patch
+@@ -0,0 +1,10 @@
++--- a/ntripclient.c
+++++ b/ntripclient.c
++@@ -44,6 +44,7 @@
++ #include <fcntl.h>
++ #include <unistd.h>
++ #include <arpa/inet.h>
+++ #include <sys/select.h>
++ #include <sys/socket.h>
++ #include <netinet/in.h>
++ #include <netdb.h>
+diff --git a/feeds/packages/net/ntripserver/Makefile b/feeds/packages/net/ntripserver/Makefile
+new file mode 100644
+index 0000000..a3e3cf9
+--- /dev/null
++++ b/feeds/packages/net/ntripserver/Makefile
+@@ -0,0 +1,49 @@
++#
++# Copyright (C) 2011 segal.ubi.pt
++# Copyright (C) 2010-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ntripserver
++PKG_VERSION:=1.5.1
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/nunojpg/ntripserver.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=c3034ab575e8442222eb8c2ee9e224cac99cfa6d
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_LICENSE:=GPL-2.0+
++
++PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ntripserver
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=NTRIP
++ TITLE:=Ntrip Version 2.0 Command Line Server
++ URL:=http://igs.bkg.bund.de/ntrip/download
++endef
++
++define Package/ntripserver/description
++ Ntrip Version 2.0 Command Line Server, reading from SISNeT Server, TCP/UDP IP
++ Port, Serial port, or NtripCaster to support an Ntrip Version 1.0 or 2.0 Caster
++endef
++
++MAKE_FLAGS += \
++ OPTS="$(TARGET_CFLAGS)"
++
++define Package/ntripserver/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ntripserver $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,ntripserver))
+diff --git a/feeds/packages/net/nut/Config.in b/feeds/packages/net/nut/Config.in
+new file mode 100644
+index 0000000..b48102f
+--- /dev/null
++++ b/feeds/packages/net/nut/Config.in
+@@ -0,0 +1,100 @@
++ config NUT_SERVER
++ depends on PACKAGE_nut
++ bool "Include server components (upsd)"
++ help
++ upsd is responsible for serving the data from the drivers to the
++ clients. It connects to each driver and maintains a local cache of the
++ current state. Queries from the clients are served from this cache, so
++ delays are minimal. This program is essential, and must be running at
++ all times to actually make any use out of the drivers and clients.
++ default y
++
++ config NUT_CLIENTS_UPSC
++ depends on PACKAGE_nut
++ bool "Include command line client (upsc)"
++ help
++ upsc is provided as a quick way to poll the status of a UPS server. It
++ can be used inside shell scripts and other programs that need UPS data
++ but don't want to include the full interface.
++ default y
++
++ config NUT_CLIENTS_UPSLOG
++ depends on PACKAGE_nut
++ bool "Include logging client (upslog)"
++ help
++ upslog is a daemon that will poll a UPS at periodic intervals, fetch the
++ variables that interest you, format them, and write them to a file.
++ default n
++
++ config NUT_CLIENTS_UPSCMD
++ depends on PACKAGE_nut
++ bool "Include UPS controller (upscmd)"
++ help
++ upscmd allows you to invoke "instant commands" in your UPS hardware. Not
++ all hardware supports this, so check the list with -l to see if anything
++ will work on your equipment. On hardware that supports it, you can use
++ this program to start and stop battery tests, invoke a front panel test
++ (beep!), turn the load on or off, and more.
++ default n
++
++ config NUT_CLIENTS_UPSRW
++ depends on PACKAGE_nut
++ bool "Include UPS variable editor (upsrw)"
++ help
++ upsrw allows you to view and change the read/write variables inside your
++ UPS. It sends commands via the upsd to your driver, which configures the
++ hardware for you. The list of variables that allow you to change their
++ values is based on the capabilities of your UPS equipment. Not all
++ models support this feature. Typically, cheaper hardware does not
++ support any of them.
++ default n
++
++ config NUT_CLIENTS_UPSMON
++ depends on PACKAGE_nut
++ bool "Include monitor and shutdown controller (upsmon)"
++ help
++ upsmon is the client process that is responsible for the most important
++ part of UPS monitoring--shutting down the system when the power goes
++ out. It can call out to other helper programs for notification purposes
++ during power events. upsmon can monitor multiple systems using a single
++ process. Every UPS that is defined in the upsmon.conf configuration file
++ is assigned a power value and a type (slave or master).
++ default y
++
++ config NUT_CLIENTS_UPSSCHED
++ depends on NUT_CLIENTS_UPSMON
++ bool "Include helper for triggering events from upsmon (upssched)"
++ help
++ upssched was created to allow users to execute programs at times relative
++ to events being monitored by upsmon. The original purpose was to allow
++ for a shutdown to occur after some fixed period on battery, but there are
++ other uses that are possible.
++ You can alternatively write your own script and save some space.
++ default n
++
++ config NUT_SSL
++ depends on PACKAGE_nut
++ bool "Build with support for OpenSSL"
++ help
++ SSL allows sessions between upsd and clients to be encrypted and can
++ also be used to authenticate servers. This means that stealing port
++ 3493 from upsd will no longer net you interesting passwords. SSL is
++ available via OpenSSL on OpenWRT (NSS doesn't seem to work). If you
++ are happy with using passwords to authenticate clients, you can save
++ some space and build NUT without SSL support.
++ default n
++
++ config NUT_DRIVER_USB
++ depends on PACKAGE_nut
++ bool "Build with support for USB drivers"
++ help
++ If you have a UPS connected via USB, select this.
++ default y
++
++ config NUT_DRIVER_SNMP
++ depends on PACKAGE_nut
++ bool "Build with support for SNMP drivers"
++ help
++ If you have a UPS you can connect to via SNMP, select this.
++ default n
++
+diff --git a/feeds/packages/net/nut/Makefile b/feeds/packages/net/nut/Makefile
+new file mode 100644
+index 0000000..41ab4cc
+--- /dev/null
++++ b/feeds/packages/net/nut/Makefile
+@@ -0,0 +1,352 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=nut
++PKG_VERSION:=2.7.3
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.networkupstools.org/source/2.7/
++PKG_MD5SUM:=a1a7f747093663e1f39ab595b63b45e4
++PKG_MAINTAINER:=Martin Rowe <martin.p.rowe@gmail.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE-GPL2
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/nut-$(PKG_VERSION)
++PKG_INSTALL:=1
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_NUT_CLIENTS_UPSC \
++ CONFIG_NUT_CLIENTS_UPSCMD \
++ CONFIG_NUT_CLIENTS_UPSLOG \
++ CONFIG_NUT_CLIENTS_UPSMON \
++ CONFIG_NUT_CLIENTS_UPSRW \
++ CONFIG_NUT_CLIENTS_UPSSCHED \
++ CONFIG_NUT_DRIVER_SNMP \
++ CONFIG_NUT_DRIVER_USB \
++ CONFIG_NUT_SERVER \
++ CONFIG_NUT_SSL
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/nut/Default
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://www.networkupstools.org/
++ DEPENDS:=nut
++endef
++
++define Package/nut/description
++Network UPS Tools (NUT) is a client/server monitoring system that
++allows computers to share uninterruptible power supply (UPS) and
++power distribution unit (PDU) hardware. Clients access the hardware
++through the server, and are notified whenever the power status
++changes.
++endef
++
++define Package/nut
++ $(call Package/nut/Default)
++ TITLE:=Network UPS Tools
++ DEPENDS:= \
++ +libpthread \
++ +NUT_DRIVER_SNMP:libnetsnmp \
++ +NUT_DRIVER_USB:libusb-compat \
++ +NUT_SSL:libopenssl
++ MENU:=1
++endef
++
++define Package/nut/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/nut/conffiles
++ /etc/nut/nut.conf
++ $(if $(CONFIG_NUT_CLIENTS_UPSMON),/etc/nut/upsmon.conf)
++ $(if $(CONFIG_NUT_CLIENTS_UPSSCHED),/etc/nut/upssched.conf)
++ $(if $(CONFIG_NUT_SERVER),/etc/nut/ups.conf)
++ $(if $(CONFIG_NUT_SERVER),/etc/nut/upsd.conf)
++ $(if $(CONFIG_NUT_SERVER),/etc/nut/upsd.users)
++endef
++
++define Package/nut/install
++ $(INSTALL_DIR) $(1)/etc/nut
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/nut/nut.conf.sample $(1)/etc/nut/nut.conf
++ $(if $(or $(CONFIG_NUT_CLIENTS_UPSC),\
++ $(CONFIG_NUT_CLIENTS_UPSCMD),\
++ $(CONFIG_NUT_CLIENTS_LOG),\
++ $(CONFIG_NUT_CLIENTS_UPSRW),\
++ $(CONFIG_NUT_CLIENTS_UPSMON),\
++ $(CONFIG_NUT_CLIENTS_UPSSCHED)),$(CP) $(PKG_INSTALL_DIR)/usr/lib/libupsclient.so* $(1)/usr/lib/)
++ $(if $(or $(CONFIG_NUT_SERVER),\
++ $(CONFIG_NUT_CLIENTS_UPSMON)),$(INSTALL_DIR) $(1)/etc/init.d)
++ $(if $(CONFIG_NUT_SERVER),$(INSTALL_DIR) $(1)/lib/nut)
++ $(if $(CONFIG_NUT_SERVER),$(INSTALL_DIR) $(1)/usr/share/nut)
++ $(if $(CONFIG_NUT_SERVER),$(CP) ./files/nut-server.init $(1)/etc/init.d/)
++ $(if $(CONFIG_NUT_SERVER),$(CP) $(PKG_INSTALL_DIR)/usr/sbin/upsd $(1)/usr/sbin)
++ $(if $(CONFIG_NUT_SERVER),$(CP) $(PKG_INSTALL_DIR)/usr/sbin/upsdrvctl $(1)/usr/sbin)
++ $(if $(CONFIG_NUT_SERVER),$(CP) $(PKG_INSTALL_DIR)/usr/share/nut/cmdvartab $(1)/usr/share/nut/)
++ $(if $(CONFIG_NUT_SERVER),$(CP) $(PKG_INSTALL_DIR)/usr/share/nut/driver.list $(1)/usr/share/nut/)
++ $(if $(CONFIG_NUT_SERVER),$(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/nut/ups.conf.sample $(1)/etc/nut/ups.conf)
++ $(if $(CONFIG_NUT_SERVER),$(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/nut/upsd.conf.sample $(1)/etc/nut/upsd.conf)
++ $(if $(CONFIG_NUT_SERVER),$(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/nut/upsd.users.sample $(1)/etc/nut/upsd.users)
++ $(if $(CONFIG_NUT_CLIENTS_UPSC),$(CP) $(PKG_INSTALL_DIR)/usr/bin/upsc $(1)/usr/bin/)
++ $(if $(CONFIG_NUT_CLIENTS_UPSCMD),$(CP) $(PKG_INSTALL_DIR)/usr/bin/upscmd $(1)/usr/bin/)
++ $(if $(CONFIG_NUT_CLIENTS_UPSLOG),$(CP) $(PKG_INSTALL_DIR)/usr/bin/upslog $(1)/usr/bin/)
++ $(if $(CONFIG_NUT_CLIENTS_UPSRW),$(CP) $(PKG_INSTALL_DIR)/usr/bin/upsrw $(1)/usr/bin/)
++ $(if $(CONFIG_NUT_CLIENTS_UPSMON),$(CP) ./files/nut-monitor.init $(1)/etc/init.d/)
++ $(if $(CONFIG_NUT_CLIENTS_UPSMON),$(CP) $(PKG_INSTALL_DIR)/usr/sbin/upsmon $(1)/usr/sbin/)
++ $(if $(CONFIG_NUT_CLIENTS_UPSMON),$(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/nut/upsmon.conf.sample $(1)/etc/nut/upsmon.conf)
++ $(if $(CONFIG_NUT_CLIENTS_UPSSCHED),$(CP) $(PKG_INSTALL_DIR)/usr/bin/upssched-cmd $(1)/usr/bin/)
++ $(if $(CONFIG_NUT_CLIENTS_UPSSCHED),$(CP) $(PKG_INSTALL_DIR)/usr/sbin/upssched $(1)/usr/sbin/)
++ $(if $(CONFIG_NUT_CLIENTS_UPSSCHED),$(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/nut/upssched.conf.sample $(1)/etc/nut/upssched.conf)
++endef
++
++define Package/nut-web-cgi
++ $(call Package/nut/Default)
++ TITLE+= Web CGI interface
++ DEPENDS+=+libgd
++endef
++
++define Package/nut-web-cgi/description
++The CGI programs are clients that run through your web server.
++They allow you to see UPS status and perform certain administrative
++commands from any web browser. Javascript and cookies are not required.
++endef
++
++define Package/nut-web-cgi/conffiles
++ /etc/nut/hosts.conf
++ /etc/nut/upsset.conf
++ /etc/nut/upsstats.html
++ /etc/nut/upsstats-single.html
++endef
++
++define Package/nut-web-cgi/install
++ $(INSTALL_DIR) $(1)/etc/nut
++ $(INSTALL_DIR) $(1)/usr/share/www/cgi-bin
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/nut/hosts.conf.sample $(1)/etc/nut/hosts.conf
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/nut/upsset.conf.sample $(1)/etc/nut/upsset.conf
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/nut/upsstats.html.sample $(1)/etc/nut/upsstats.html
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/nut/upsstats-single.html.sample $(1)/etc/nut/upsstats-single.html
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/www/nut $(1)/usr/share/www/
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/www/cgi-bin/nut $(1)/usr/share/www/cgi-bin/
++endef
++
++define Package/nut-avahi-service
++ $(call Package/nut/Default)
++ TITLE+= (Avahi service)
++ DEPENDS+=+avahi-daemon
++endef
++
++define Package/nut-avahi-service/description
++This package contains the service definition for announcing the
++attached UPS via mDNS/DNS-SD.
++endef
++
++define Package/nut-avahi-service/conffiles
++ /etc/avahi/services/nut.service
++endef
++
++define Package/nut-avahi-service/install
++ $(INSTALL_DIR) $(1)/etc/avahi/services
++ $(INSTALL_CONF) ./files/nut.service $(1)/etc/avahi/services/
++endef
++
++# Dealing with all of the drivers is very repetitive, but the previous
++# maintainer had a neat solution which just needed some tweaking.
++define DriverPackage
++ define Package/nut-driver-$(2)
++ $(call Package/nut/Default)
++ TITLE:=$(2) (NUT $(1) driver)
++ $(if $(filter $(1),snmp),DEPENDS+= @NUT_DRIVER_SNMP)
++ $(if $(filter $(1),usb),DEPENDS+= @NUT_DRIVER_USB)
++ endef
++ # Deliberately empty description in order to trigger a build failure.
++ # It should be overridden by the list below, and when updating to a
++ # new version of nut we will need to provide descriptions for any new
++ # drivers.
++ define Package/nut-driver-$(2)/description
++
++ endef
++ define Package/nut-driver-$(2)/install
++ $(INSTALL_DIR) $$(1)/lib/nut
++ $(CP) $$(PKG_INSTALL_DIR)/lib/nut/$(2) $$(1)/lib/nut/
++ $(if $(filter $(2),clone),$(CP) $$(PKG_INSTALL_DIR)/lib/nut/$(2)-outlet $$(1)/lib/nut/)
++ endef
++endef
++define DriverDescription
++ define Package/nut-driver-$(2)/description
++ $(3)
++ endef
++endef
++# These lists are lifted *directly* from drivers/Makefile.am in the nut
++# source tree. This it to make it simpler to keep in sync when updating
++# to a newer version of nut. Do not edit this manually.
++#
++# DO NOT EDIT (except to update with a fresh cut/paste)!
++SERIAL_DRIVERLIST = al175 bcmxcp belkin belkinunv bestfcom \
++ bestfortress bestuferrups bestups dummy-ups etapro everups \
++ gamatronic genericups isbmex liebert liebert-esp2 masterguard metasys \
++ oldmge-shut mge-utalk microdowell mge-shut oneac optiups powercom rhino \
++ safenet skel solis tripplite tripplitesu upscode2 victronups powerpanel \
++ blazer_ser clone clone-outlet ivtscd apcsmart apcsmart-old apcupsd-ups riello_ser \
++ nutdrv_qx
++SNMP_DRIVERLIST = snmp-ups
++USB_LIBUSB_DRIVERLIST = usbhid-ups bcmxcp_usb tripplite_usb \
++ blazer_usb richcomm_usb riello_usb \
++ nutdrv_atcl_usb \
++ nutdrv_qx
++# END: DO NOT EDIT!
++SERIAL_DRIVERLIST_IGNORE:=skel clone-outlet nutdrv_qx
++# nutdrv_qx can be either USB or serial. Given most routers have USB
++# instead of serial ports, and not wanting two identical packages with
++# different names that conflict with each other, only the option for the
++# driver with USB bindings is provided. If you really want to save that
++# tiny bit of space and build it without USB support, remove nutdrv_qx
++# from the previous line.
++
++$(foreach d,$(filter-out $(SERIAL_DRIVERLIST_IGNORE),$(SERIAL_DRIVERLIST)),$(eval $(call DriverPackage,serial,$(d))))
++$(foreach d,$(SNMP_DRIVERLIST),$(eval $(call DriverPackage,snmp,$(d))))
++$(foreach d,$(USB_LIBUSB_DRIVERLIST),$(eval $(call DriverPackage,usb,$(d))))
++
++$(eval $(call DriverDescription,serial,al175,\
++ Driver for Eltek UPS models with AL175 alarm module))
++$(eval $(call DriverDescription,serial,bcmxcp,\
++ Driver for UPSes supporting the serial BCM/XCP protocol))
++$(eval $(call DriverDescription,serial,belkin,\
++ Driver for Belkin serial UPS equipment))
++$(eval $(call DriverDescription,serial,belkinunv,\
++ Driver for Belkin "Universal UPS" and compatible))
++$(eval $(call DriverDescription,serial,bestfcom,\
++ Driver for Best Power Fortress/Ferrups))
++$(eval $(call DriverDescription,serial,bestfortress,\
++ Driver for old Best Fortress UPS equipment))
++$(eval $(call DriverDescription,serial,bestuferrups,\
++ Driver for Best Power Micro-Ferrups))
++$(eval $(call DriverDescription,serial,bestups,\
++ Driver for Best Power / SOLA (Phoenixtec protocol) UPS equipment))
++$(eval $(call DriverDescription,serial,dummy-ups,\
++ Driver for multi-purpose UPS emulation))
++$(eval $(call DriverDescription,serial,etapro,\
++ Driver for ETA UPS equipment))
++$(eval $(call DriverDescription,serial,everups,\
++ Driver for Ever UPS models))
++$(eval $(call DriverDescription,serial,gamatronic,\
++ Driver for Gamatronic UPS equipment))
++$(eval $(call DriverDescription,serial,genericups,\
++ Driver for contact-closure UPS equipment))
++$(eval $(call DriverDescription,serial,isbmex,\
++ Driver for ISBMEX UPS equipment))
++$(eval $(call DriverDescription,serial,liebert,\
++ Driver for Liebert contact-closure UPS equipment))
++$(eval $(call DriverDescription,serial,liebert-esp2,\
++ Driver for Liebert UPS, using the ESP-II serial protocol))
++$(eval $(call DriverDescription,serial,masterguard,\
++ Driver for Masterguard UPS equipment))
++$(eval $(call DriverDescription,serial,metasys,\
++ Driver for Meta System UPS equipment))
++$(eval $(call DriverDescription,serial,oldmge-shut,\
++ Driver for SHUT Protocol UPS equipment, deprecated, use mge-shut))
++$(eval $(call DriverDescription,serial,mge-utalk,\
++ Driver for MGE UPS SYSTEMS UTalk protocol equipment))
++$(eval $(call DriverDescription,serial,microdowell,\
++ Driver for Microdowell Enterprise UPS series))
++$(eval $(call DriverDescription,serial,mge-shut,\
++ Driver for SHUT Protocol UPS equipment))
++$(eval $(call DriverDescription,serial,oneac,\
++ Driver for Oneac UPS equipment))
++$(eval $(call DriverDescription,serial,optiups,\
++ Driver for Opti-UPS (Viewsonic) UPS and Zinto D (ONLINE-USV) equipment))
++$(eval $(call DriverDescription,serial,powercom,\
++ Driver for serial Powercom/Trust/Advice UPS equipment))
++$(eval $(call DriverDescription,serial,rhino,\
++ Driver for Brazilian Microsol RHINO UPS equipment))
++$(eval $(call DriverDescription,serial,safenet,\
++ Driver for SafeNet compatible UPS equipment))
++$(eval $(call DriverDescription,serial,solis,\
++ Driver for Brazilian Microsol SOLIS UPS equipment))
++$(eval $(call DriverDescription,serial,tripplite,\
++ Driver for Tripp-Lite SmartPro UPS equipment))
++$(eval $(call DriverDescription,serial,tripplitesu,\
++ Driver for Tripp-Lite SmartOnline (SU) UPS equipment))
++$(eval $(call DriverDescription,serial,upscode2,\
++ Driver for UPScode II compatible UPS equipment))
++$(eval $(call DriverDescription,serial,victronups,\
++ Driver for IMV/Victron UPS unit Match, Match Lite, NetUps))
++$(eval $(call DriverDescription,serial,powerpanel,\
++ Driver for PowerPanel Plus compatible UPS equipment))
++$(eval $(call DriverDescription,serial,blazer_ser,\
++ Driver for Megatec/Q1 protocol serial based UPS equipment))
++$(eval $(call DriverDescription,serial,clone,\
++ UPS driver clone))
++$(eval $(call DriverDescription,serial,ivtscd,\
++ Driver for the IVT Solar Controller Device))
++$(eval $(call DriverDescription,serial,apcsmart,\
++ Driver for American Power Conversion Smart Protocol UPS equipment))
++$(eval $(call DriverDescription,serial,apcsmart-old,\
++ Driver for American Power Conversion Smart Protocol UPS equipment))
++$(eval $(call DriverDescription,serial,apcupsd-ups,\
++ Driver for apcupsd client access))
++$(eval $(call DriverDescription,serial,riello_ser,\
++ Driver for Riello UPS Protocol UPS equipment))
++$(eval $(call DriverDescription,snmp,snmp-ups,\
++ Multi-MIB Driver for SNMP UPS equipment))
++$(eval $(call DriverDescription,usb,usbhid-ups,\
++ Driver for USB/HID UPS equipment))
++$(eval $(call DriverDescription,usb,bcmxcp_usb,\
++ Experimental driver for UPSes supporting the BCM/XCP protocol over USB))
++$(eval $(call DriverDescription,usb,tripplite_usb,\
++ Driver for older Tripp Lite USB UPSes (not PDC HID)))
++$(eval $(call DriverDescription,usb,blazer_usb,\
++ Driver for Megatec/Q1 protocol USB based UPS equipment))
++$(eval $(call DriverDescription,usb,richcomm_usb,\
++ Driver for UPS equipment using Richcomm dry-contact to USB solution))
++$(eval $(call DriverDescription,usb,riello_usb,\
++ Driver for Riello UPS Protocol UPS equipment via USB))
++$(eval $(call DriverDescription,usb,nutdrv_atcl_usb,\
++ Driver for ATCL FOR UPS equipment))
++$(eval $(call DriverDescription,usb,nutdrv_qx,\
++ Driver for Q* protocol serial and USB based UPS equipment))
++
++CONFIGURE_ARGS += \
++ --sysconfdir=/etc/nut \
++ --datadir=/usr/share/nut \
++ --with-dev \
++ --$(if $(CONFIG_NUT_DRIVER_USB),with,without)-usb \
++ --without-avahi \
++ --$(if $(CONFIG_NUT_DRIVER_SNMP),with,without)-snmp \
++ --without-neon \
++ --without-powerman \
++ --without-ipmi \
++ --without-freeipmi \
++ --$(if $(CONFIG_NUT_SSL),with,without)-ssl $(if $(CONFIG_NUT_SSL),--with-openssl) \
++ --without-libltdl \
++ --$(if $(CONFIG_PACKAGE_nut-web-cgi),with,without)-cgi \
++ --with-statepath=/var/run \
++ --with-drvpath=/lib/nut \
++ --with-cgipath=/usr/share/www/cgi-bin/nut \
++ --with-htmlpath=/usr/share/www/nut \
++ --with-user=root \
++ --with-group=root
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib*.so* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/*.pc $(1)/usr/lib/pkgconfig/
++endef
++
++$(eval $(call BuildPackage,nut))
++$(eval $(call BuildPackage,nut-web-cgi))
++$(eval $(call BuildPackage,nut-avahi-service))
++$(foreach d,$(filter-out $(SERIAL_DRIVERLIST_IGNORE),$(SERIAL_DRIVERLIST)),$(eval $(call BuildPackage,nut-driver-$(d))))
++$(foreach d,$(SNMP_DRIVERLIST),$(eval $(call BuildPackage,nut-driver-$(d))))
++$(foreach d,$(USB_LIBUSB_DRIVERLIST),$(eval $(call BuildPackage,nut-driver-$(d))))
+diff --git a/feeds/packages/net/nut/files/nut-monitor.init b/feeds/packages/net/nut/files/nut-monitor.init
+new file mode 100755
+index 0000000..e9fdb33
+--- /dev/null
++++ b/feeds/packages/net/nut/files/nut-monitor.init
+@@ -0,0 +1,21 @@
++#!/bin/sh /etc/rc.common
++
++START=60
++USE_PROCD=1
++
++restart() {
++ stop_service
++ start_service
++}
++
++start_service() {
++ upsmon -p
++}
++
++stop_service() {
++ upsmon -c stop
++}
++
++reload_service() {
++ upsmon -c reload
++}
+diff --git a/feeds/packages/net/nut/files/nut-server.init b/feeds/packages/net/nut/files/nut-server.init
+new file mode 100755
+index 0000000..f9971be
+--- /dev/null
++++ b/feeds/packages/net/nut/files/nut-server.init
+@@ -0,0 +1,23 @@
++#!/bin/sh /etc/rc.common
++
++START=50
++USE_PROCD=1
++
++restart() {
++ stop_service
++ start_service
++}
++
++start_service() {
++ upsdrvctl start
++ upsd
++}
++
++stop_service() {
++ upsd -c stop
++ upsdrvctl stop
++}
++
++reload_service() {
++ upsd -c reload
++}
+diff --git a/feeds/packages/net/nut/files/nut.service b/feeds/packages/net/nut/files/nut.service
+new file mode 100644
+index 0000000..5ad6b31
+--- /dev/null
++++ b/feeds/packages/net/nut/files/nut.service
+@@ -0,0 +1,34 @@
++<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
++<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
++
++<!--
++ This file is part of NUT - Network UPS Tools
++
++ NUT is free software; you can redistribute it and/or modify it
++ under the terms of the GNU Lesser General Public License as
++ published by the Free Software Foundation; either version 2 of the
++ License, or (at your option) any later version.
++
++ NUT is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with NUT; if not, write to the Free Software
++ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
++ 02111-1307 USA.
++-->
++
++<!-- See avahi.service(5) for more information about this configuration file -->
++
++<service-group>
++
++ <name replace-wildcards="yes">%h</name>
++
++ <service>
++ <type>_nut._tcp</type>
++ <port>3493</port>
++ </service>
++
++</service-group>
+diff --git a/feeds/packages/net/ocserv/Config.in b/feeds/packages/net/ocserv/Config.in
+new file mode 100644
+index 0000000..b6460cd
+--- /dev/null
++++ b/feeds/packages/net/ocserv/Config.in
+@@ -0,0 +1,26 @@
++# ocserv avanced configuration
++
++menu "Configuration"
++ depends on PACKAGE_ocserv
++
++config OCSERV_PAM
++ bool "enable PAM"
++ default n
++
++config OCSERV_SECCOMP
++ bool "enable seccomp"
++ default n
++
++config OCSERV_RADIUS
++ bool "enable radius authentication"
++ default n
++
++config OCSERV_PROTOBUF
++ bool "use external libprotobuf"
++ default y
++
++config OCSERV_HTTP_PARSER
++ bool "use external libhttp-parser"
++ default y
++
++endmenu
+diff --git a/feeds/packages/net/ocserv/Makefile b/feeds/packages/net/ocserv/Makefile
+new file mode 100644
+index 0000000..5cf3265
+--- /dev/null
++++ b/feeds/packages/net/ocserv/Makefile
+@@ -0,0 +1,105 @@
++#
++# Copyright (C) 2007-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ocserv
++PKG_VERSION:=0.10.9
++PKG_RELEASE:=2
++PKG_USE_MIPS16:=0
++
++PKG_BUILD_DIR :=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=ftp://ftp.infradead.org/pub/ocserv/
++PKG_MD5SUM:=74834c59aa96beaa222c21ee6521adb2
++
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=COPYING
++PKG_FIXUP:=autoreconf
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_OCSERV_PAM \
++ CONFIG_OCSERV_SECCOMP \
++ CONFIG_OCSERV_PROTOBUF \
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ocserv/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/ocserv
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=VPN
++ TITLE:=OpenConnect VPN server
++ URL:=http://www.infradead.org/ocserv/
++ MAINTAINER:=Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
++ DEPENDS:= +OCSERV_RADIUS:libradcli +OCSERV_HTTP_PARSER:libhttp-parser +OCSERV_SECCOMP:libseccomp +libgnutls +certtool +libncurses +libreadline +OCSERV_PAM:libpam +OCSERV_PROTOBUF:libprotobuf-c +kmod-tun
++ USERID:=ocserv=72:ocserv=72
++endef
++
++define Package/ocserv/description
++ OpenConnect server (ocserv) is an SSL VPN server. Its purpose is to be
++ a secure, small, fast and configurable VPN server. It implements the
++ OpenConnect SSL VPN protocol, and has also (currently experimental)
++ compatibility with clients using the AnyConnect SSL VPN protocol. The
++ OpenConnect VPN protocol uses the standard IETF security protocols such
++ as TLS 1.2, and Datagram TLS to provide the secure VPN service.
++endef
++
++EXTRA_CPPFLAGS+=-I$(STAGING_DIR)/usr/include/readline/
++EXTRA_LDFLAGS+=-lncurses
++
++CONFIGURE_ARGS+= \
++ --enable-local-libopts \
++ --with-libreadline-prefix="$(STAGING_DIR)/" \
++ --without-libnl \
++ --without-gssapi \
++ --with-libcrypt-prefix="$(STAGING_DIR)/" \
++
++ifneq ($(CONFIG_OCSERV_PAM),y)
++CONFIGURE_ARGS += --without-pam
++endif
++
++ifneq ($(CONFIG_OCSERV_RADIUS),y)
++CONFIGURE_ARGS += --without-radius
++endif
++
++ifneq ($(CONFIG_OCSERV_SECCOMP),y)
++CONFIGURE_ARGS += --disable-seccomp
++endif
++
++ifneq ($(CONFIG_OCSERV_PROTOBUF),y)
++CONFIGURE_ARGS += --without-protobuf
++endif
++
++ifneq ($(CONFIG_OCSERV_HTTP_PARSER),y)
++CONFIGURE_ARGS += --without-http-parser
++endif
++
++define Package/ocserv/conffiles
++/etc/config/ocserv
++endef
++
++define Package/ocserv/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ocserv $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ocpasswd $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/occtl $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/ocserv.init $(1)/etc/init.d/ocserv
++ $(INSTALL_DIR) $(1)/etc/ocserv
++ $(INSTALL_CONF) ./files/ocserv.conf.template $(1)/etc/ocserv/ocserv.conf.template
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/config $(1)/etc/config/ocserv
++ $(INSTALL_DIR) $(1)/lib/upgrade/keep.d
++ $(INSTALL_DATA) ./files/ocserv.upgrade $(1)/lib/upgrade/keep.d/ocserv
++endef
++
++$(eval $(call BuildPackage,ocserv))
+diff --git a/feeds/packages/net/ocserv/README b/feeds/packages/net/ocserv/README
+new file mode 100644
+index 0000000..ed1ff42
+--- /dev/null
++++ b/feeds/packages/net/ocserv/README
+@@ -0,0 +1,179 @@
++Setting up OpenConnect VPN server
++=================================
++
++The openconnect server expects to be configured using the uci interface.
++
++It is recommended to setup a dynamic DNS address with openwrt prior
++to starting the server. That is because during the first startup
++a certificate file which contain the setup dynamic DNS name will be
++created. You can always regenerate the certificate by deleting
++/etc/ocserv/server-key.pem.
++
++There are two approaches to setup the VPN. The proxy-arp approach (1)
++which provides clients with addresses of the LAN, and the "forwarding"
++approach (2) which provides clients with addresses of a separate private
++network. The former is suitable when you have "roadwarrior" type of clients
++connecting to the LAN, and the latter when you may need to connect
++multiple networks with the LAN.
++
++
++1. Proxy-ARP Approach
++=====================
++
++[This option is available since ocserv-0.10.9-2 package]
++
++To setup a server the provides access to LAN with network address
++10.100.2.0/255.255.255.0 add the following to /etc/config/ocserv.
++The following setup will assign the upper 62 addresses for VPN use.
++
++```
++----/etc/config/ocserv-------------------------------------------
++config ocserv 'config'
++ option port '443'
++ option dpd '120'
++ option max_clients '8'
++ option max_same '2'
++ option netmask '255.255.255.192'
++ option ipaddr '10.100.2.192'
++ option auth 'plain'
++ option default_domain 'lan'
++ option compression '1'
++ option proxy_arp '1'
++ option ping_leases '1'
++ option enable '1'
++
++config dns
++ option ip '10.100.2.1'
++
++config routes
++ option ip '10.100.2.0'
++ option netmask '255.255.255.0'
++
++config ocservusers
++ option name 'test'
++ option password '$5$unl8uKAGNsdTh9zm$PnUHEGhDc5VHbFE2EfWwW38Bub6Y6EZ5hrFwZE1r2F1'
++
++-----------------------------------------------------------------
++```
++
++This setup re-utilizes the addresses assigned to LAN for the VPN clients.
++To ensure that there are no conflicts with the DHCP server use the following
++commands. These will set the maximum address assigned by DHCP to be 10.100.2.191
++which is below the first VPN assigned address (10.100.2.192).
++
++```
++# uci set dhcp.lan.start=100
++# uci set dhcp.lan.limit=91
++```
++
++For simple networks like that you may also leave the 'netmask' and 'ipaddr'
++fields empty and ocserv on startup will set the necessary values.
++
++
++2. Forwarding Approach
++======================
++
++To setup a server the provides access to LAN with network address
++10.100.2.0/255.255.255.0 using the VPN address range
++10.100.3.0/255.255.255.0 add the following to /etc/config/ocserv:
++
++```
++----/etc/config/ocserv-------------------------------------------
++config ocserv 'config'
++ option port '443'
++ option dpd '120'
++ option max_clients '8'
++ option max_same '2'
++ option netmask '255.255.255.0'
++ option ipaddr '10.100.3.0'
++ option auth 'plain'
++ option default_domain 'lan'
++ option compression '1'
++ option enable '1'
++
++config dns
++ option ip '10.100.2.1'
++
++config routes
++ option ip '10.100.2.0'
++ option netmask '255.255.255.0'
++
++config ocservusers
++ option name 'test'
++ option password '$5$unl8uKAGNsdTh9zm$PnUHEGhDc5VHbFE2EfWwW38Bub6Y6EZ5hrFwZE1r2F1'
++
++-----------------------------------------------------------------
++```
++
++
++Setting up the firewall
++=======================
++
++Since the connected users will be assigned to other interfaces than the LAN
++one, it is required to assign the VPN clients to an interface, and enable
++forwarding for them. That is, you should setup an unmanaged interface (e.g.,
++called vpn), which will have assigned the 'vpns+' interfaces (i.e., all vpns
++interfaces). Then a zone called vpn should be setup to handle interactions
++with lan. An example, which alls all forwarding between LAN and VPN clients,
++follows.
++
++```
++----/etc/config/network------------------------------------------
++config interface 'vpn'
++ option proto 'none'
++ option ifname 'vpns+'
++-----------------------------------------------------------------
++
++----/etc/config/firewall-----------------------------------------
++config zone
++ option input 'ACCEPT'
++ option forward 'ACCEPT'
++ option output 'ACCEPT'
++ option name 'vpn'
++ option device 'vpns+'
++ option network 'vpn'
++
++config forwarding
++ option dest 'lan'
++ option src 'vpn'
++
++config forwarding
++ option dest 'vpn'
++ option src 'lan'
++
++config rule
++ option target 'ACCEPT'
++ option src 'wan'
++ option proto 'tcp'
++ option dest_port '443'
++ option name 'vpn'
++
++config rule
++ option target 'ACCEPT'
++ option src 'wan'
++ option proto 'udp'
++ option dest_port '443'
++ option name 'vpn'
++-----------------------------------------------------------------
++```
++
++Note, that the last two rules, enable connections to port 443 from the
++Internet. That is the port used by OpenConnect VPN.
++
++
++Starting the server
++===================
++
++Note that both configurations above add the user "test" with password "test". The
++password is specified in the crypt(3) format.
++
++The server can be enabled and started using:
++# /etc/init.d/ocserv enable
++# /etc/init.d/ocserv start
++
++For any custom configuration options of ocserv you may add values in
++/etc/ocserv/ocserv.conf.local.
++
++There is a luci plugin to allow configuring the server from
++the web environment; see the package luci-app-ocserv.
++
+diff --git a/feeds/packages/net/ocserv/files/config b/feeds/packages/net/ocserv/files/config
+new file mode 100644
+index 0000000..4814459
+--- /dev/null
++++ b/feeds/packages/net/ocserv/files/config
+@@ -0,0 +1,17 @@
++
++config ocserv 'config'
++ option port '4443'
++ option dpd '180'
++ option max_clients '8'
++ option max_same '2'
++ option enable '0'
++ option zone 'lan'
++
++config ocservusers
++
++config dns
++ option ip '8.8.8.8'
++
++config routes
++ option ip '192.168.1.0'
++ option netmask '255.255.255.0'
+diff --git a/feeds/packages/net/ocserv/files/ocserv.conf.template b/feeds/packages/net/ocserv/files/ocserv.conf.template
+new file mode 100644
+index 0000000..9a5f195
+--- /dev/null
++++ b/feeds/packages/net/ocserv/files/ocserv.conf.template
+@@ -0,0 +1,378 @@
++# User authentication method. Could be set multiple times and in that case
++# all should succeed.
++# Options: certificate, pam.
++#auth = "certificate"
++#auth = "pam"
++
++# The gid-min option is used by auto-select-group option, in order to
++# select the minimum group ID.
++#auth = "pam[gid-min=1000]"
++
++# The plain option requires specifying a password file which contains
++# entries of the following format.
++# "username:groupname:encoded-password"
++# One entry must be listed per line, and 'ocpasswd' can be used
++# to generate password entries.
++auth = "|AUTH|"
++
++# A banner to be displayed on clients
++banner = "Welcome to OpenWRT"
++
++#isolate-workers = true
++
++# When the server has a dynamic DNS address (that may change),
++# should set that to true to ask the client to resolve again on
++# reconnects.
++listen-host-is-dyndns = |DYNDNS|
++
++# Use listen-host to limit to specific IPs or to the IPs of a provided
++# hostname.
++#listen-host = [IP|HOSTNAME]
++
++# Limit the number of clients. Unset or set to zero for unlimited.
++#max-clients = 1024
++max-clients = |MAX_CLIENTS|
++
++# Limit the number of client connections to one every X milliseconds
++# (X is the provided value). Set to zero for no limit.
++rate-limit-ms = 100
++
++# Limit the number of identical clients (i.e., users connecting
++# multiple times). Unset or set to zero for unlimited.
++max-same-clients = |MAX_SAME|
++
++# TCP and UDP port number
++tcp-port = |PORT|
++|UDP|udp-port = |PORT|
++
++# Stats report time. The number of seconds after which each
++# worker process will report its usage statistics (number of
++# bytes transferred etc). This is useful when accounting like
++# radius is in use.
++#stats-report-time = 360
++
++# Keepalive in seconds
++keepalive = 32400
++
++# Dead peer detection in seconds.
++dpd = |DPD|
++
++# Dead peer detection for mobile clients. The needs to
++# be much higher to prevent such clients being awaken too
++# often by the DPD messages, and save battery.
++# (clients that send the X-AnyConnect-Identifier-DeviceType)
++#mobile-dpd = 1800
++
++# MTU discovery (DPD must be enabled)
++try-mtu-discovery = false
++
++# The key and the certificates of the server
++# The key may be a file, or any URL supported by GnuTLS (e.g.,
++# tpmkey:uuid=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx;storage=user
++# or pkcs11:object=my-vpn-key;object-type=private)
++#
++# There may be multiple certificate and key pairs and each key
++# should correspond to the preceding certificate.
++server-cert = /etc/ocserv/server-cert.pem
++server-key = /etc/ocserv/server-key.pem
++
++# Diffie-Hellman parameters. Only needed if you require support
++# for the DHE ciphersuites (by default this server supports ECDHE).
++# Can be generated using:
++# certtool --generate-dh-params --outfile /path/to/dh.pem
++#dh-params = /path/to/dh.pem
++
++# If you have a certificate from a CA that provides an OCSP
++# service you may provide a fresh OCSP status response within
++# the TLS handshake. That will prevent the client from connecting
++# independently on the OCSP server.
++# You can update this response periodically using:
++# ocsptool --ask --load-cert=your_cert --load-issuer=your_ca --outfile response
++# Make sure that you replace the following file in an atomic way.
++#ocsp-response = /path/to/ocsp.der
++
++# In case PKCS #11 or TPM keys are used the PINs should be available
++# in files. The srk-pin-file is applicable to TPM keys only, and is the
++# storage root key.
++#pin-file = /path/to/pin.txt
++#srk-pin-file = /path/to/srkpin.txt
++
++# The Certificate Authority that will be used to verify
++# client certificates (public keys) if certificate authentication
++# is set.
++#ca-cert = /etc/ocserv/ca.pem
++
++# The object identifier that will be used to read the user ID in the client
++# certificate. The object identifier should be part of the certificate's DN
++# Useful OIDs are:
++# CN = 2.5.4.3, UID = 0.9.2342.19200300.100.1.1
++#cert-user-oid = 0.9.2342.19200300.100.1.1
++
++# The object identifier that will be used to read the user group in the
++# client certificate. The object identifier should be part of the certificate's
++# DN. Useful OIDs are:
++# OU (organizational unit) = 2.5.4.11
++#cert-group-oid = 2.5.4.11
++
++# The revocation list of the certificates issued by the 'ca-cert' above.
++#crl = /etc/ocserv/crl.pem
++
++# Uncomment this to enable compression negotiation (LZS, LZ4).
++|COMPRESSION|compression = true
++
++# GnuTLS priority string
++tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0"
++
++# To enforce perfect forward secrecy (PFS) on the main channel.
++#tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0:-RSA"
++
++# The time (in seconds) that a client is allowed to stay connected prior
++# to authentication
++auth-timeout = 40
++
++# The time (in seconds) that a client is allowed to stay idle (no traffic)
++# before being disconnected. Unset to disable.
++#idle-timeout = 1200
++
++# The time (in seconds) that a mobile client is allowed to stay idle (no
++# traffic) before being disconnected. Unset to disable.
++#mobile-idle-timeout = 2400
++
++# The time (in seconds) that a client is not allowed to reconnect after
++# a failed authentication attempt.
++min-reauth-time = 360
++
++# Banning clients in ocserv works with a point system. IP addresses
++# that get a score over that configured number are banned for
++# min-reauth-time seconds. By default a wrong password attempt is 10 points,
++# a KKDCP POST is 1 point, and a connection is 1 point. Note that
++# due to difference processes being involved the count of points
++# will not be real-time precise.
++#
++# Score banning cannot be reliably used when receiving proxied connections
++# locally from an HTTP server (i.e., when listen-clear-file is used).
++#
++# Set to zero to disable.
++max-ban-score = 50
++
++# The time (in seconds) that all score kept for a client is reset.
++ban-reset-time = 300
++
++# In case you'd like to change the default points.
++#ban-points-wrong-password = 10
++#ban-points-connection = 1
++#ban-points-kkdcp = 1
++
++# Cookie timeout (in seconds)
++# which he can reconnect. That cookie will be invalided if not
++# used within this timeout value. On a user disconnection, that
++# cookie will also be active for this time amount prior to be
++# invalid. That should allow a reasonable amount of time for roaming
++# between different networks.
++cookie-timeout = 300
++
++# Whether roaming is allowed, i.e., if true a cookie is
++# restricted to a single IP address and cannot be re-used
++# from a different IP.
++deny-roaming = false
++
++# ReKey time (in seconds)
++# ocserv will ask the client to refresh keys periodically once
++# this amount of seconds is elapsed. Set to zero to disable.
++rekey-time = 172800
++
++# ReKey method
++# Valid options: ssl, new-tunnel
++# ssl: Will perform an efficient rehandshake on the channel allowing
++# a seamless connection during rekey.
++# new-tunnel: Will instruct the client to discard and re-establish the channel.
++# Use this option only if the connecting clients have issues with the ssl
++# option.
++rekey-method = ssl
++
++# Script to call when a client connects and obtains an IP
++# Parameters are passed on the environment.
++# REASON, USERNAME, GROUPNAME, HOSTNAME (the hostname selected by client),
++# DEVICE, IP_REAL (the real IP of the client), IP_LOCAL (the local IP
++# in the P-t-P connection), IP_REMOTE (the VPN IP of the client),
++# ID (a unique numeric ID); REASON may be "connect" or "disconnect".
++
++# These scripts are not needed if you have setup an interface for all vpns+
++# devices.
++#connect-script = /usr/bin/ocserv-script
++#disconnect-script = /usr/bin/ocserv-script
++
++# UTMP
++use-utmp = false
++
++# Whether to enable support for the occtl tool (i.e., either through D-BUS,
++# or via a unix socket).
++use-occtl = true
++
++# socket file used for IPC with occtl. You only need to set that,
++# if you use more than a single servers.
++occtl-socket-file = /var/run/occtl.socket
++
++# PID file. It can be overriden in the command line.
++pid-file = /var/run/ocserv.pid
++
++# The default server directory. Does not require any devices present.
++chroot-dir = /var/lib/ocserv
++
++# socket file used for IPC, will be appended with .PID
++# It must be accessible within the chroot environment (if any)
++#socket-file = /var/run/ocserv-socket
++socket-file = ocserv-socket
++
++# The user the worker processes will be run as. It should be
++# unique (no other services run as this user).
++run-as-user = ocserv
++run-as-group = ocserv
++
++# Set the protocol-defined priority (SO_PRIORITY) for packets to
++# be sent. That is a number from 0 to 6 with 0 being the lowest
++# priority. Alternatively this can be used to set the IP Type-
++# Of-Service, by setting it to a hexadecimal number (e.g., 0x20).
++# This can be set per user/group or globally.
++#net-priority = 3
++
++# Set the VPN worker process into a specific cgroup. This is Linux
++# specific and can be set per user/group or globally.
++#cgroup = "cpuset,cpu:test"
++
++#
++# Network settings
++#
++
++# The name of the tun device
++device = vpns
++
++# Whether the generated IPs will be predictable, i.e., IP stays the
++# same for the same user when possible.
++predictable-ips = |PREDICTABLE_IPS|
++
++# The default domain to be advertised
++|ENABLE_DEFAULT_DOMAIN|default-domain = |DEFAULT_DOMAIN|
++
++# The pool of addresses that leases will be given from.
++ipv4-network = |IPV4ADDR|
++ipv4-netmask = |NETMASK|
++
++# The advertized DNS server. Use multiple lines for
++# multiple servers.
++# dns = fc00::4be0
++#dns = 192.168.1.2
++
++# The NBNS server (if any)
++#nbns = 192.168.1.3
++
++# The IPv6 subnet that leases will be given from.
++|ENABLE_IPV6|ipv6-network = |IPV6ADDR|
++
++# The domains over which the provided DNS should be used. Use
++# multiple lines for multiple domains.
++#split-dns = example.com
++
++# Prior to leasing any IP from the pool ping it to verify that
++# it is not in use by another (unrelated to this server) host.
++ping-leases = |PING_LEASES|
++
++# Unset to assign the default MTU of the device
++# mtu =
++
++# Unset to enable bandwidth restrictions (in bytes/sec). The
++# setting here is global, but can also be set per user or per group.
++#rx-data-per-sec = 40000
++#tx-data-per-sec = 40000
++
++# The number of packets (of MTU size) that are available in
++# the output buffer. The default is low to improve latency.
++# Setting it higher will improve throughput.
++#output-buffer = 10
++
++# Routes to be forwarded to the client. If you need the
++# client to forward routes to the server, you may use the
++# config-per-user/group or even connect and disconnect scripts.
++#
++# To set the server as the default gateway for the client just
++# comment out all routes from the server.
++#route = 192.168.1.0/255.255.255.0
++#route = 192.168.5.0/255.255.255.0
++#route = fef4:db8:1000:1001::/64
++
++# Configuration files that will be applied per user connection or
++# per group. Each file name on these directories must match the username
++# or the groupname.
++# The options allowed in the configuration files are dns, nbns,
++# ipv?-network, ipv4-netmask, ipv6-prefix, rx/tx-per-sec, iroute, route,
++# net-priority and cgroup.
++#
++# Note that the 'iroute' option allows to add routes on the server
++# based on a user or group. The syntax depends on the input accepted
++# by the commands route-add-cmd and route-del-cmd (see below).
++
++config-per-user = /etc/ocserv/config-per-user/
++config-per-group = /etc/ocserv/config-per-group/
++
++# When config-per-xxx is specified and there is no group or user that
++# matches, then utilize the following configuration.
++
++#default-user-config = /etc/ocserv/defaults/user.conf
++#default-group-config = /etc/ocserv/defaults/group.conf
++
++# Groups that a client is allowed to select from.
++# A client may belong in multiple groups, and in certain use-cases
++# it is needed to switch between them. For these cases the client can
++# select prior to authentication. Add multiple entries for multiple groups.
++#select-group = group1
++#select-group = group2[My group 2]
++#select-group = tost[The tost group]
++
++# The name of the group that if selected it would allow to use
++# the assigned by default group.
++#default-select-group = DEFAULT
++
++# Instead of specifying manually all the allowed groups, you may instruct
++# ocserv to scan all available groups and include the full list. That
++# option is only functional on plain authentication.
++#auto-select-group = true
++
++# The system command to use to setup a route. %{R} will be replaced with the
++# route/mask and %{D} with the (tun) device.
++#
++# The following example is from linux systems. %{R} should be something
++# like 192.168.2.0/24
++
++route-add-cmd = "/sbin/route add -net %{R} dev %{D}"
++route-del-cmd = "/sbin/route del -net %{R} dev %{D}"
++
++# This option allows to forward a proxy. The special strings '%{U}'
++# and '%{G}', if present will be replaced by the username and group name.
++#proxy-url = http://example.com/
++#proxy-url = http://example.com/%{U}/%{G}/hello
++
++#
++# The following options are for (experimental) AnyConnect client
++# compatibility.
++
++# Client profile xml. A sample file exists in doc/profile.xml.
++# This file must be accessible from inside the worker's chroot.
++# It is not used by the openconnect client.
++#user-profile = profile.xml
++
++# Binary files that may be downloaded by the CISCO client. Must
++# be within any chroot environment.
++#binary-files = /path/to/binaries
++
++# Unless set to false it is required for clients to present their
++# certificate even if they are authenticating via a previously granted
++# cookie and complete their authentication in the same TCP connection.
++# Legacy CISCO clients do not do that, and thus this option should be
++# set for them.
++cisco-client-compat = |CISCO_COMPAT|
++
++#Advanced options
++
++# Option to allow sending arbitrary custom headers to the client after
++# authentication and prior to VPN tunnel establishment.
++#custom-header = "X-My-Header: hi there"
+diff --git a/feeds/packages/net/ocserv/files/ocserv.init b/feeds/packages/net/ocserv/files/ocserv.init
+new file mode 100644
+index 0000000..61eb67c
+--- /dev/null
++++ b/feeds/packages/net/ocserv/files/ocserv.init
+@@ -0,0 +1,206 @@
++#!/bin/sh /etc/rc.common
++
++START=50
++USE_PROCD=1
++
++setup_config() {
++ config_get port $1 port "4443"
++ config_get max_clients $1 max_clients "8"
++ config_get max_same $1 max_same "2"
++ config_get dpd $1 dpd "120"
++ config_get predictable_ips $1 predictable_ips "1"
++ config_get compression $1 compression "0"
++ config_get udp $1 udp "1"
++ config_get auth $1 auth "plain"
++ config_get cisco_compat $1 cisco_compat "1"
++ config_get ipaddr $1 ipaddr ""
++ config_get netmask $1 netmask ""
++ config_get ip6addr $1 ip6addr ""
++ config_get proxy_arp $1 proxy_arp "0"
++ config_get ping_leases $1 ping_leases "0"
++ config_get default_domain $1 default_domain ""
++
++ # Enable proxy arp, and make sure that ping leases is set to true in that case,
++ # to prevent conflicts.
++ if test "$proxy_arp" = 1;then
++ local ip
++ # IP address is empty. Auto-configure LAN + VPN.
++ if test -z "$ipaddr";then
++ local mask
++ mask=$(uci get network.lan.netmask)
++ if test "$mask" = "255.255.255.0";then
++ uci set dhcp.lan.start=100
++ uci set dhcp.lan.limit=91
++ fi
++ ip=$(uci get network.lan.ipaddr)
++ ipaddr="$(echo $ip|cut -d . -f1,2,3).192"
++ netmask="255.255.255.192"
++ uci set ocserv.config.ipaddr="$ipaddr"
++ uci set ocserv.config.netmask="$netmask"
++ uci commit
++ fi
++
++ if test -z "$ip6addr";then
++ ip6addr=$(uci get network.lan.ip6addr 2>/dev/null)
++ test -n "$ip6addr" && uci set ocserv.config.ip6addr="$ip6addr"
++ uci commit
++ fi
++
++ ping_leases=1
++ test -n "$ipaddr" && sysctl -w "net.ipv4.conf.$(uci get network.lan.ifname).proxy_arp"=1 >/dev/null
++ test -n "$ip6addr" && sysctl -w "net.ipv6.conf.$(uci get network.lan.ifname).proxy_ndp"=1 >/dev/null
++ else
++ test "$ipaddr" = "" && ipaddr="192.168.100.0"
++ test "$netmask" = "" && ipaddr="255.255.255.0"
++ fi
++
++ enable_default_domain="#"
++ enable_udp="#"
++ enable_compression="#"
++ test $predictable_ips = "0" && predictable_ips="false"
++ test $predictable_ips = "1" && predictable_ips="true"
++ test $cisco_compat = "0" && cisco_compat="false"
++ test $cisco_compat = "1" && cisco_compat="true"
++ test $ping_leases = "0" && ping_leases="false"
++ test $ping_leases = "1" && ping_leases="true"
++ test $udp = "1" && enable_udp=""
++ test $compression = "1" && enable_compression=""
++ test -z $default_domain && enable_default_domain=""
++ test -z $ip6addr && enable_ipv6="#"
++
++ test $auth = "plain" && authsuffix="\[passwd=/var/etc/ocpasswd\]"
++
++ dyndns="false"
++ hostname=`uci show ddns 2>/dev/null|grep domain|head -1|cut -d '=' -f 2`
++ [ -n "$hostname" ] && dyndns="true"
++
++ mkdir -p /var/etc
++ sed -e "s/|PORT|/$port/g" \
++ -e "s/|MAX_CLIENTS|/$max_clients/g" \
++ -e "s/|MAX_SAME|/$max_same/g" \
++ -e "s/|DPD|/$dpd/g" \
++ -e "s#|AUTH|#$auth$authsuffix#g" \
++ -e "s#|DYNDNS|#$dyndns#g" \
++ -e "s/|PREDICTABLE_IPS|/$predictable_ips/g" \
++ -e "s/|DEFAULT_DOMAIN|/$default_domain/g" \
++ -e "s/|ENABLE_DEFAULT_DOMAIN|/$enable_default_domain/g" \
++ -e "s/|CISCO_COMPAT|/$cisco_compat/g" \
++ -e "s/|PING_LEASES|/$ping_leases/g" \
++ -e "s/|UDP|/$enable_udp/g" \
++ -e "s/|COMPRESSION|/$enable_compression/g" \
++ -e "s/|IPV4ADDR|/$ipaddr/g" \
++ -e "s/|NETMASK|/$netmask/g" \
++ -e "s#|IPV6ADDR|#$ip6addr#g" \
++ -e "s/|ENABLE_IPV6|/$enable_ipv6/g" \
++ /etc/ocserv/ocserv.conf.template > /var/etc/ocserv.conf
++
++ test -f /etc/ocserv/ocserv.conf.local && cat /etc/ocserv/ocserv.conf.local >> /var/etc/ocserv.conf
++}
++
++setup_users() {
++ local name
++ local group
++ local password
++
++ config_get name $1 name
++ config_get group $1 group '*'
++ config_get password $1 password
++
++ [ -z "$name" -o -z "$password" ] && return
++
++ echo "$name:$group:$password" >> /var/etc/ocpasswd
++}
++
++setup_routes() {
++ local routes
++
++ config_get ip $1 ip
++ config_get netmask $1 netmask
++
++ [ -z "$ip" -o -z "$netmask" ] && return
++
++ echo "route = $ip/$netmask" >> /var/etc/ocserv.conf
++}
++
++setup_dns() {
++ local routes
++
++ config_get ip $1 ip
++
++ [ -z "$ip" ] && return
++
++ echo "dns = $ip" >> /var/etc/ocserv.conf
++}
++
++start_service() {
++ local hostname iface
++
++ hostname=`uci show ddns 2>/dev/null|grep domain|head -1|cut -d '=' -f 2`
++ [ -z "$hostname" ] && hostname=`uci get system.@system[0].hostname 2>/dev/null`
++
++ [ -f /etc/config/ocserv-dir/ca-key.pem ] && mv /etc/config/ocserv-dir/ca-key.pem /etc/ocserv/ca-key.pem
++ [ -f /etc/config/ocserv-dir/ca.pem ] && mv /etc/config/ocserv-dir/ca.pem /etc/ocserv/ca.pem
++ [ -f /etc/config/ocserv-dir/server-key.pem ] && mv /etc/config/ocserv-dir/server-key.pem /etc/ocserv/server-key.pem
++ [ -f /etc/config/ocserv-dir/server-cert.pem ] && mv /etc/config/ocserv-dir/server-cert.pem /etc/ocserv/server-cert.pem
++ [ -d /etc/config/ocserv-dir ] && rmdir /etc/config/ocserv-dir
++
++ [ ! -f /etc/ocserv/ca-key.pem ] && [ -x /usr/bin/certtool ] && {
++ logger -t ocserv "Generating CA certificate..."
++ mkdir -p /etc/ocserv/pki/
++ certtool --bits 2048 --generate-privkey --outfile /etc/ocserv/ca-key.pem >/dev/null 2>&1
++ echo "cn=$hostname CA" >/etc/ocserv/pki/ca.tmpl
++ echo "expiration_days=-1" >>/etc/ocserv/pki/ca.tmpl
++ echo "serial=1" >>/etc/ocserv/pki/ca.tmpl
++ echo "ca" >>/etc/ocserv/pki/ca.tmpl
++ echo "cert_signing_key" >>/etc/ocserv/pki/ca.tmpl
++
++ certtool --template /etc/ocserv/pki/ca.tmpl \
++ --generate-self-signed --load-privkey /etc/ocserv/ca-key.pem \
++ --outfile /etc/ocserv/ca.pem >/dev/null 2>&1
++ }
++
++ #generate server certificate/key
++ [ ! -f /etc/ocserv/server-key.pem ] && [ -x /usr/bin/certtool ] && {
++ logger -t ocserv "Generating server certificate..."
++ mkdir -p /etc/ocserv/pki/
++ certtool --bits 2048 --generate-privkey --outfile /etc/ocserv/server-key.pem >/dev/null 2>&1
++ echo "cn=$hostname" >/etc/ocserv/pki/server.tmpl
++ echo "serial=2" >>/etc/ocserv/pki/server.tmpl
++ echo "expiration_days=-1" >>/etc/ocserv/pki/server.tmpl
++ echo "signing_key" >>/etc/ocserv/pki/server.tmpl
++ echo "encryption_key" >>/etc/ocserv/pki/server.tmpl
++ certtool --template /etc/ocserv/pki/server.tmpl \
++ --generate-certificate --load-privkey /etc/ocserv/server-key.pem \
++ --load-ca-certificate /etc/ocserv/ca.pem --load-ca-privkey \
++ /etc/ocserv/ca-key.pem --outfile /etc/ocserv/server-cert.pem >/dev/null 2>&1
++ }
++
++ [ -f /var/run/ocserv.pid ] || {
++ touch /var/run/ocserv.pid
++ chown ocserv:ocserv /var/run/ocserv.pid
++ }
++ [ -d /var/lib/ocserv ] || {
++ mkdir -m 0755 -p /var/lib/ocserv
++ chmod 0700 /var/lib/ocserv
++ chown ocserv:ocserv /var/lib/ocserv
++ }
++
++ config_load "ocserv"
++
++ rm -f /var/etc/ocserv.conf
++ touch /var/etc/ocserv.conf
++ setup_config config
++ config_foreach setup_routes routes
++ config_foreach setup_dns dns
++
++ rm -f /var/etc/ocpasswd
++ touch /var/etc/ocpasswd
++ chmod 600 /var/etc/ocpasswd
++ config_foreach setup_users ocservusers
++
++ procd_open_instance
++ procd_set_param command /usr/sbin/ocserv -f -c /var/etc/ocserv.conf
++ procd_set_param respawn
++ procd_close_instance
++}
++
+diff --git a/feeds/packages/net/ocserv/files/ocserv.upgrade b/feeds/packages/net/ocserv/files/ocserv.upgrade
+new file mode 100644
+index 0000000..fdffcb2
+--- /dev/null
++++ b/feeds/packages/net/ocserv/files/ocserv.upgrade
+@@ -0,0 +1,8 @@
++/etc/ocserv/ca-key.pem
++/etc/ocserv/ca.pem
++/etc/ocserv/server-key.pem
++/etc/ocserv/server-cert.pem
++/etc/ocserv/ocserv.conf.local
++/etc/ocserv/config-per-user/*
++/etc/ocserv/config-per-group/*
++/etc/ocserv/crl.pem
+diff --git a/feeds/packages/net/ola/Makefile b/feeds/packages/net/ola/Makefile
+new file mode 100644
+index 0000000..c2284aa
+--- /dev/null
++++ b/feeds/packages/net/ola/Makefile
+@@ -0,0 +1,114 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++# Copyright (C) 2015 Christian Beier <dontmind@freeshell.org>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ola
++PKG_VERSION:=0.9.7
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/OpenLightingProject/ola.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=2a306e4f0221fea9f4833ba04b042e72c6f10cd3
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_LICENSE:=LGPL-2.1+
++
++PKG_FIXUP:=libtool
++PKG_INSTALL:=1
++
++PKG_BUILD_PARALLEL:=1
++PKG_USE_MIPS16:=0
++
++HOST_BUILD_DEPENDS:=protobuf/host
++PKG_BUILD_DEPENDS:=ola/host
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ola
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Open Lighting Architecture Daemon
++ URL:=https://www.openlighting.org/
++ MAINTAINER:=Christian Beier <dontmind@freeshell.org>
++ DEPENDS:=+protobuf +libusb-1.0 +libuuid +libstdcpp +libpthread +librt +zlib +libncurses +sudo
++endef
++
++define Package/ola/description
++ OLA (Open Lighting Architecture) is a framework that allows applications to
++ send and receive DMX512, using various hardware devices and 'DMX over IP'
++ protocols. It enables software controllers talk to DMX hardware.
++endef
++
++CONFIGURE_ARGS += \
++ --disable-dependency-tracking \
++ --disable-static \
++ --disable-fatal-warnings \
++ --disable-unittests \
++ --disable-http \
++ --with-ola-protoc-plugin=$(HOST_BUILD_DIR)/protoc/ola_protoc_plugin
++
++HOST_CONFIGURE_ARGS += \
++ --disable-all-plugins \
++ --disable-slp \
++ --disable-osc \
++ --disable-uart \
++ --disable-libusb \
++ --disable-libftdi \
++ --disable-http \
++ --disable-examples \
++ --disable-unittests \
++ --disable-doxygen-html \
++ --disable-doxygen-doc
++
++# only build the ola_protoc thingy
++define Host/Compile
++ cd $(HOST_BUILD_DIR); \
++ $(MAKE) protoc/ola_protoc_plugin
++endef
++
++# nothing to install for host part
++define Host/Install
++endef
++
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/ola $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/olad $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
++endef
++
++define Package/ola/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/olad.init $(1)/etc/init.d/olad
++
++ $(INSTALL_DIR) $(1)/usr/share/ola/pids
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/ola/pids/* $(1)/usr/share/ola/pids
++endef
++
++define Package/ola/postinst
++#!/bin/sh
++
++# make sure the conf dir exists and is writeable by the group olad uses
++mkdir -p $${IPKG_INSTROOT}/etc/ola
++chgrp nogroup $${IPKG_INSTROOT}/etc/ola
++chmod 775 $${IPKG_INSTROOT}/etc/ola
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,ola))
+diff --git a/feeds/packages/net/ola/files/olad.init b/feeds/packages/net/ola/files/olad.init
+new file mode 100644
+index 0000000..f1dff36
+--- /dev/null
++++ b/feeds/packages/net/ola/files/olad.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2015 OpenWrt.org
++# Copyright (C) 2015 Christian Beier <dontmind@freeshell.org>
++
++USE_PROCD=1
++
++START=90
++
++start_service() {
++ procd_open_instance
++ procd_set_param command sudo -u nobody /usr/bin/olad --syslog --log-level 2 --config-dir /etc/ola
++ procd_set_param respawn
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/ola/patches/001-include-endian_h.patch b/feeds/packages/net/ola/patches/001-include-endian_h.patch
+new file mode 100644
+index 0000000..784f10c
+--- /dev/null
++++ b/feeds/packages/net/ola/patches/001-include-endian_h.patch
+@@ -0,0 +1,15 @@
++diff --git a/common/network/NetworkUtils.cpp b/common/network/NetworkUtils.cpp
++index 3914818..094a311 100644
++--- a/common/network/NetworkUtils.cpp
+++++ b/common/network/NetworkUtils.cpp
++@@ -39,6 +39,10 @@ typedef uint32_t in_addr_t;
++ #include <resolv.h>
++ #endif
++
+++#ifdef HAVE_ENDIAN_H
+++#include <endian.h>
+++#endif
+++
++ #if defined(HAVE_LINUX_NETLINK_H) && defined(HAVE_LINUX_RTNETLINK_H)
++ #define USE_NETLINK_FOR_DEFAULT_ROUTE 1
++ #include <linux/netlink.h>
+diff --git a/feeds/packages/net/openconnect/Config.in b/feeds/packages/net/openconnect/Config.in
+new file mode 100644
+index 0000000..d73bd3a
+--- /dev/null
++++ b/feeds/packages/net/openconnect/Config.in
+@@ -0,0 +1,21 @@
++# openconnect avanced configuration
++
++menu "Configuration"
++ depends on PACKAGE_openconnect
++
++choice
++ prompt "SSL library"
++ default OPENCONNECT_GNUTLS
++
++config OPENCONNECT_GNUTLS
++ bool "GnuTLS support"
++
++config OPENCONNECT_OPENSSL
++ bool "OpenSSL"
++
++endchoice
++
++config OPENCONNECT_STOKEN
++ bool "stoken support"
++
++endmenu
+diff --git a/feeds/packages/net/openconnect/Makefile b/feeds/packages/net/openconnect/Makefile
+new file mode 100644
+index 0000000..33f1078
+--- /dev/null
++++ b/feeds/packages/net/openconnect/Makefile
+@@ -0,0 +1,76 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=openconnect
++PKG_VERSION:=7.06
++PKG_RELEASE:=3
++PKG_USE_MIPS16:=0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=ftp://ftp.infradead.org/pub/openconnect/
++PKG_MD5SUM:=80f397911e1fed43d897d99be3d5f1a1
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_OPENCONNECT_GNUTLS \
++ CONFIG_OPENCONNECT_OPENSSL \
++
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/openconnect/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/openconnect
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libxml2 +kmod-tun +resolveip +vpnc-scripts +OPENCONNECT_OPENSSL:libopenssl +OPENCONNECT_GNUTLS:libgnutls +OPENCONNECT_STOKEN:libstoken
++ TITLE:=OpenConnect VPN client (Cisco AnyConnect compatible)
++ MAINTAINER:=Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
++ URL:=http://www.infradead.org/openconnect/
++ SUBMENU:=VPN
++endef
++
++define Package/openconnect/description
++ A VPN client compatible with Cisco's AnyConnect SSL VPN and ocserv.
++
++ OpenConnect is a client that follows the Cisco's AnyConnect SSL VPN protocol,
++ which is supported by IOS 12.4(9)T or later on Cisco SR500, 870, 880, 1800,
++ 2800, 3800, 7200 Series and Cisco 7301 Routers, as well as the OpenConnect
++ VPN server.
++endef
++
++CONFIGURE_ARGS += \
++ --disable-shared \
++ --with-vpnc-script=/lib/netifd/vpnc-script \
++ --without-libpcsclite \
++ --without-stoken
++
++ifeq ($(CONFIG_OPENCONNECT_OPENSSL),y)
++CONFIGURE_ARGS += \
++ --without-gnutls
++endif
++
++ifeq ($(CONFIG_OPENCONNECT_STOKEN),y)
++CONFIGURE_ARGS += \
++ --with-stoken
++endif
++
++define Package/openconnect/install
++ $(INSTALL_DIR) $(1)/etc/openconnect/
++ $(INSTALL_DIR) $(1)/lib/netifd/proto
++ $(INSTALL_BIN) ./files/openconnect.sh $(1)/lib/netifd/proto/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/openconnect $(1)/usr/sbin/
++ $(INSTALL_BIN) ./files/openconnect-wrapper $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/lib/upgrade/keep.d
++ $(INSTALL_DATA) ./files/openconnect.upgrade $(1)/lib/upgrade/keep.d/openconnect
++endef
++
++$(eval $(call BuildPackage,openconnect))
+diff --git a/feeds/packages/net/openconnect/README b/feeds/packages/net/openconnect/README
+new file mode 100644
+index 0000000..772b0e3
+--- /dev/null
++++ b/feeds/packages/net/openconnect/README
+@@ -0,0 +1,43 @@
++The openconnect client expects to be configured using the uci interface.
++
++To setup a VPN connection, add the following to /etc/config/network:
++
++config interface 'MYVPN'
++ option proto 'openconnect'
++ option interface 'wan'
++ option server 'vpn.example.com'
++ option port '4443'
++ option username 'test'
++ option password 'secret'
++ option serverhash 'AE7FF6A0426F0A0CD0A02EB9EC3C5066FAEB0B25'
++ option defaultroute '0'
++ option authgroup 'DEFAULT'
++
++ # For second factor auth:
++
++ # when a fixed 2FA password can be used
++ #option password2 'my-fixed-2fa-password'
++
++ # RSA tokens, must be built with stoken support
++ #option token_mode 'rsa'
++ #option token_secret 'secret'
++
++ # HOTP/TOTP tokens
++ #option token_mode 'hotp'
++ #option token_secret '00'
++
++The additional files are also used:
++/etc/openconnect/user-cert-vpn-MYVPN.pem: The user certificate
++/etc/openconnect/user-key-vpn-MYVPN.pem: The user private key
++/etc/openconnect/ca-vpn-MYVPN.pem: The CA certificate (instead of serverhash)
++
++After these are setup you can initiate the VPN using "ifup MYVPN", and
++deinitialize it using ifdown. You may also use the luci web interface
++(Network -> Interfaces -> MYVPN Connect).
++
++Note that you need to configure the firewall to allow communication between
++the MYVPN interface and lan.
++
++
++There is a luci plugin to allow configuring an openconnect interface from
++the web environment; see the luci-proto-openconnect package.
+diff --git a/feeds/packages/net/openconnect/files/openconnect-wrapper b/feeds/packages/net/openconnect/files/openconnect-wrapper
+new file mode 100755
+index 0000000..082dfba
+--- /dev/null
++++ b/feeds/packages/net/openconnect/files/openconnect-wrapper
+@@ -0,0 +1,41 @@
++#!/bin/sh
++
++# This script wraps openconnect in order to obtain the password
++# file from cmd.
++
++# $1 password file
++# $2... are passed to openconnect
++
++test -z "$1" && exit 1
++
++pwfile=$1
++shift
++
++pidfile=/var/run/ocwrap-$$.pid
++
++cleanup()
++{
++ if ! test -z "$pid";then
++ kill $pid
++ wait $pid
++ fi
++ exit 0
++}
++
++cleanup2()
++{
++ if ! test -z "$pid";then
++ kill -2 $pid
++ wait $pid
++ fi
++ exit 0
++}
++
++trap cleanup2 2
++trap cleanup 1 3 6 15
++
++rm -f "$pidfile"
++/usr/sbin/openconnect $* <$pwfile &
++pid=$!
++
++wait $pid
+diff --git a/feeds/packages/net/openconnect/files/openconnect.sh b/feeds/packages/net/openconnect/files/openconnect.sh
+new file mode 100755
+index 0000000..ecdd66a
+--- /dev/null
++++ b/feeds/packages/net/openconnect/files/openconnect.sh
+@@ -0,0 +1,99 @@
++#!/bin/sh
++. /lib/functions.sh
++. ../netifd-proto.sh
++init_proto "$@"
++
++proto_openconnect_init_config() {
++ proto_config_add_string "server"
++ proto_config_add_int "port"
++ proto_config_add_string "username"
++ proto_config_add_string "serverhash"
++ proto_config_add_string "authgroup"
++ proto_config_add_string "password"
++ proto_config_add_string "password2"
++ proto_config_add_string "token_mode"
++ proto_config_add_string "token_secret"
++ proto_config_add_string "interface"
++ proto_config_add_string "os"
++ proto_config_add_string "csd_wrapper"
++ no_device=1
++ available=1
++}
++
++proto_openconnect_setup() {
++ local config="$1"
++
++ json_get_vars server port username serverhash authgroup password password2 interface token_mode token_secret os csd_wrapper
++
++ grep -q tun /proc/modules || insmod tun
++ ifname="vpn-$config"
++
++ logger -t openconnect "initializing..."
++# serv_addr=
++# for ip in $(resolveip -t 10 "$server"); do
++# ( proto_add_host_dependency "$interface" "$ip" "$ifname" )
++# serv_addr=1
++# done
++# [ -n "$serv_addr" ] || {
++# logger -t openconnect "Could not resolve server address: '$server'"
++# sleep 5
++# proto_setup_failed "$config"
++# exit 1
++# }
++
++ [ -n "$port" ] && port=":$port"
++
++ cmdline="$server$port -i "$ifname" --non-inter --syslog --script /lib/netifd/vpnc-script"
++
++ # migrate to standard config files
++ [ -f "/etc/config/openconnect-user-cert-vpn-$config.pem" ] && mv "/etc/config/openconnect-user-cert-vpn-$config.pem" "/etc/openconnect/user-cert-vpn-$config.pem"
++ [ -f "/etc/config/openconnect-user-key-vpn-$config.pem" ] && mv "/etc/config/openconnect-user-key-vpn-$config.pem" "/etc/openconnect/user-key-vpn-$config.pem"
++ [ -f "/etc/config/openconnect-ca-vpn-$config.pem" ] && mv "/etc/config/openconnect-ca-vpn-$config.pem" "/etc/openconnect/ca-vpn-$config.pem"
++
++ [ -f /etc/openconnect/user-cert-vpn-$config.pem ] && append cmdline "-c /etc/openconnect/user-cert-vpn-$config.pem"
++ [ -f /etc/openconnect/user-key-vpn-$config.pem ] && append cmdline "--sslkey /etc/openconnect/user-key-vpn-$config.pem"
++ [ -f /etc/openconnect/ca-vpn-$config.pem ] && {
++ append cmdline "--cafile /etc/openconnect/ca-vpn-$config.pem"
++ append cmdline "--no-system-trust"
++ }
++ [ -n "$serverhash" ] && {
++ append cmdline " --servercert=$serverhash"
++ append cmdline "--no-system-trust"
++ }
++ [ -n "$authgroup" ] && append cmdline "--authgroup $authgroup"
++ [ -n "$username" ] && append cmdline "-u $username"
++ [ -n "$password" ] && {
++ umask 077
++ mkdir -p /var/etc
++ pwfile="/var/etc/openconnect-$config.passwd"
++ echo "$password" > "$pwfile"
++ [ -n "$password2" ] && echo "$password2" >> "$pwfile"
++ append cmdline "--passwd-on-stdin"
++ }
++
++ [ -n "$token_mode" ] && append cmdline "--token-mode=$token_mode"
++ [ -n "$token_secret" ] && append cmdline "--token-secret=$token_secret"
++ [ -n "$os" ] && append cmdline "--os=$os"
++ [ -n "$csd_wrapper" ] && [ -x "$csd_wrapper" ] && append cmdline "--csd-wrapper=$csd_wrapper"
++
++ proto_export INTERFACE="$config"
++ logger -t openconnect "executing 'openconnect $cmdline'"
++
++ if [ -f "$pwfile" ]; then
++ proto_run_command "$config" /usr/sbin/openconnect-wrapper $pwfile $cmdline
++ else
++ proto_run_command "$config" /usr/sbin/openconnect $cmdline
++ fi
++}
++
++proto_openconnect_teardown() {
++ local config="$1"
++
++ pwfile="/var/etc/openconnect-$config.passwd"
++
++ rm -f $pwfile
++ logger -t openconnect "bringing down openconnect"
++ proto_kill_command "$config" 2
++}
++
++add_protocol openconnect
+diff --git a/feeds/packages/net/openconnect/files/openconnect.upgrade b/feeds/packages/net/openconnect/files/openconnect.upgrade
+new file mode 100644
+index 0000000..01bad65
+--- /dev/null
++++ b/feeds/packages/net/openconnect/files/openconnect.upgrade
+@@ -0,0 +1,9 @@
++/etc/openconnect/user-cert-vpn-*.pem
++/etc/openconnect/user-key-vpn-*.pem
++/etc/openconnect/ca-vpn-*.pem
++/etc/openconnect/pre-init.d/
++/etc/openconnect/connect.d/
++/etc/openconnect/post-connect.d/
++/etc/openconnect/disconnect.d/
++/etc/openconnect/post-disconnect.d/
++/etc/openconnect/reconnect.d/
+diff --git a/feeds/packages/net/openconnect/patches/001-Allow-processing-two-passwords-from-stdin-in-non-int.patch b/feeds/packages/net/openconnect/patches/001-Allow-processing-two-passwords-from-stdin-in-non-int.patch
+new file mode 100644
+index 0000000..be652f8
+--- /dev/null
++++ b/feeds/packages/net/openconnect/patches/001-Allow-processing-two-passwords-from-stdin-in-non-int.patch
+@@ -0,0 +1,125 @@
++From 5f2e24fdc9935d049a7e4a5b6e10461e9467597f Mon Sep 17 00:00:00 2001
++From: Nikos Mavrogiannopoulos <nmav@gnutls.org>
++Date: Thu, 18 Jun 2015 22:38:05 +0200
++Subject: [PATCH] Allow processing two passwords from stdin in non-interactive
++ mode
++
++Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
++---
++ main.c | 38 ++++++++++++++++++++++++++------------
++ 1 file changed, 26 insertions(+), 12 deletions(-)
++
++diff --git a/main.c b/main.c
++index 3b976d8..f853afe 100644
++--- a/main.c
+++++ b/main.c
++@@ -85,6 +85,7 @@ static int do_passphrase_from_fsid;
++ static int nocertcheck;
++ static int non_inter;
++ static int cookieonly;
+++static int allow_stdin_read;
++
++ static char *token_filename;
++ static char *server_cert = NULL;
++@@ -358,7 +359,7 @@ static char *convert_arg_to_utf8(char **argv, char *arg)
++ #define vfprintf vfprintf_utf8
++ #define is_arg_utf8(str) (0)
++
++-static void read_stdin(char **string, int hidden)
+++static void read_stdin(char **string, int hidden, int allow_fail)
++ {
++ CONSOLE_READCONSOLE_CONTROL rcc = { sizeof(rcc), 0, 13, 0 };
++ HANDLE stdinh = GetStdHandle(STD_INPUT_HANDLE);
++@@ -375,6 +376,7 @@ static void read_stdin(char **string, int hidden)
++ char *errstr = openconnect__win32_strerror(GetLastError());
++ fprintf(stderr, _("ReadConsole() failed: %s\n"), errstr);
++ free(errstr);
+++ *string = NULL;
++ goto out;
++ }
++
++@@ -622,7 +624,7 @@ static void print_build_opts(void)
++
++ #ifndef _WIN32
++ static const char default_vpncscript[] = DEFAULT_VPNCSCRIPT;
++-static void read_stdin(char **string, int hidden)
+++static void read_stdin(char **string, int hidden, int allow_fail)
++ {
++ char *c, *buf = malloc(1025);
++ int fd = fileno(stdin);
++@@ -648,8 +650,14 @@ static void read_stdin(char **string, int hidden)
++ }
++
++ if (!buf) {
++- perror(_("fgets (stdin)"));
++- exit(1);
+++ if (allow_fail) {
+++ *string = NULL;
+++ free(buf);
+++ return;
+++ } else {
+++ perror(_("fgets (stdin)"));
+++ exit(1);
+++ }
++ }
++
++ c = strchr(buf, '\n');
++@@ -1160,13 +1168,14 @@ int main(int argc, char **argv)
++ cookieonly = 3;
++ break;
++ case OPT_COOKIE_ON_STDIN:
++- read_stdin(&vpninfo->cookie, 0);
+++ read_stdin(&vpninfo->cookie, 0, 0);
++ /* If the cookie is empty, ignore it */
++ if (!*vpninfo->cookie)
++ vpninfo->cookie = NULL;
++ break;
++ case OPT_PASSWORD_ON_STDIN:
++- read_stdin(&password, 0);
+++ read_stdin(&password, 0, 0);
+++ allow_stdin_read = 1;
++ break;
++ case OPT_NO_PASSWD:
++ vpninfo->nopasswd = 1;
++@@ -1708,7 +1717,7 @@ static int validate_peer_cert(void *_vpninfo, const char *reason)
++ fprintf(stderr, _("Enter '%s' to accept, '%s' to abort; anything else to view: "),
++ _("yes"), _("no"));
++
++- read_stdin(&response, 0);
+++ read_stdin(&response, 0, 0);
++ if (!response)
++ return -EINVAL;
++
++@@ -1779,19 +1788,24 @@ static char *prompt_for_input(const char *prompt,
++ struct openconnect_info *vpninfo,
++ int hidden)
++ {
++- char *response;
+++ char *response = NULL;
++
++ fprintf(stderr, "%s", prompt);
++ fflush(stderr);
++
++ if (non_inter) {
++- fprintf(stderr, "***\n");
++- vpn_progress(vpninfo, PRG_ERR,
+++ if (allow_stdin_read) {
+++ read_stdin(&response, hidden, 1);
+++ }
+++ if (response == NULL) {
+++ fprintf(stderr, "***\n");
+++ vpn_progress(vpninfo, PRG_ERR,
++ _("User input required in non-interactive mode\n"));
++- return NULL;
+++ }
+++ return response;
++ }
++
++- read_stdin(&response, hidden);
+++ read_stdin(&response, hidden, 0);
++ return response;
++ }
++
++--
++2.1.4
++
+diff --git a/feeds/packages/net/opennhrp/Makefile b/feeds/packages/net/opennhrp/Makefile
+new file mode 100644
+index 0000000..4c2b9e8
+--- /dev/null
++++ b/feeds/packages/net/opennhrp/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++# Copyright (C) 2009 Jakob Pfeiffer
++# Copyright (C) 2014 Artem Makhutov
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=opennhrp
++PKG_VERSION:=0.14.1
++PKG_RELEASE:=2
++PKG_MAINTAINER:=Artem Makhutov <artem@makhutov.org>
++PKG_LICENSE:=MIT License
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/opennhrp
++PKG_MD5SUM:=eb42ddb13e07ceb415b9ebb8eaca28ee
++
++PKG_FIXUP:=autoreconf
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/opennhrp
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=VPN
++ DEPENDS:=+libcares +ipsec-tools +ip +kmod-gre
++ KCONFIG:=CONFIG_ARPD=y
++ TITLE:=NBMA Next Hop Resolution Protocol
++ URL:=http://opennhrp.sourceforge.net/
++endef
++
++define Package/opennhrp/description
++ OpenNHRP implements NBMA Next Hop Resolution Protocol (as defined in RFC 2332).
++ It makes it possible to create dynamic multipoint VPN Linux router using NHRP,
++ GRE and IPsec. It aims to be Cisco DMVPN compatible.
++endef
++
++define Package/opennhrp/conffiles
++/etc/opennhrp/opennhrp.conf
++endef
++
++define Package/opennhrp/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/opennhrp{,ctl} $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/opennhrp
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/opennhrp/opennhrp.conf $(1)/etc/opennhrp/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/etc/opennhrp/opennhrp-script $(1)/etc/opennhrp/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/etc/opennhrp/racoon-ph1down.sh $(1)/etc/opennhrp/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/etc/opennhrp/racoon-ph1dead.sh $(1)/etc/opennhrp/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/opennhrp.init $(1)/etc/init.d/opennhrp
++endef
++
++$(eval $(call BuildPackage,opennhrp))
+diff --git a/feeds/packages/net/opennhrp/files/opennhrp.init b/feeds/packages/net/opennhrp/files/opennhrp.init
+new file mode 100644
+index 0000000..8831287
+--- /dev/null
++++ b/feeds/packages/net/opennhrp/files/opennhrp.init
+@@ -0,0 +1,15 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2011 OpenWrt.org
++# Copyright (C) 2009 Jakob Pfeiffer
++
++START=50
++
++SERVICE_USE_PID=1
++
++start() {
++ service_start /usr/sbin/opennhrp -d
++}
++
++stop() {
++ service_stop /usr/sbin/opennhrp
++}
+diff --git a/feeds/packages/net/opennhrp/patches/100-musl-compat.patch b/feeds/packages/net/opennhrp/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..8be0f71
+--- /dev/null
++++ b/feeds/packages/net/opennhrp/patches/100-musl-compat.patch
+@@ -0,0 +1,20 @@
++--- a/nhrp/opennhrp.c
+++++ b/nhrp/opennhrp.c
++@@ -9,6 +9,7 @@
++ #include <ctype.h>
++ #include <stdio.h>
++ #include <errno.h>
+++#include <fcntl.h>
++ #include <malloc.h>
++ #include <stddef.h>
++ #include <string.h>
++--- a/nhrp/nhrp_common.h
+++++ b/nhrp/nhrp_common.h
++@@ -12,6 +12,7 @@
++ #include <stdint.h>
++ #include <stdlib.h>
++ #include <sys/time.h>
+++#include <sys/types.h>
++ #include <linux/if_ether.h>
++
++ struct nhrp_interface;
+diff --git a/feeds/packages/net/openssh/Makefile b/feeds/packages/net/openssh/Makefile
+new file mode 100644
+index 0000000..3a1e400
+--- /dev/null
++++ b/feeds/packages/net/openssh/Makefile
+@@ -0,0 +1,291 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=openssh
++PKG_VERSION:=7.1p1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/ \
++ http://ftp.belnet.be/pub/OpenBSD/OpenSSH/portable/
++PKG_MD5SUM:=8709736bc8a8c253bc4eeb4829888ca5
++
++PKG_LICENSE:=BSD ISC
++PKG_LICENSE_FILES:=LICENCE
++
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_BUILD_DEPENDS:=libopenssl
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/openssh/Default
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libopenssl +zlib
++ TITLE:=OpenSSH
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++ URL:=http://www.openssh.com/
++ SUBMENU:=SSH
++ VARIANT:=without-pam
++endef
++
++define Package/openssh-moduli
++ $(call Package/openssh/Default)
++ DEPENDS+= +openssh-keygen
++ TITLE+= moduli file
++endef
++
++define Package/openssh-moduli/description
++OpenSSH server moduli file.
++endef
++
++define Package/openssh-client
++ $(call Package/openssh/Default)
++ TITLE+= client
++endef
++
++define Package/openssh-client/description
++OpenSSH client.
++endef
++
++define Package/openssh-client/conffiles
++/etc/ssh/ssh_config
++endef
++
++define Package/openssh-client-utils
++ $(call Package/openssh/Default)
++ DEPENDS+= +openssh-client +openssh-keygen
++ TITLE+= client utilities
++endef
++
++define Package/openssh-client-utils/description
++OpenSSH client utilities.
++endef
++
++define Package/openssh-keygen
++ $(call Package/openssh/Default)
++ TITLE+= keygen
++endef
++
++define Package/openssh-keygen/description
++OpenSSH keygen.
++endef
++
++define Package/openssh-server
++ $(call Package/openssh/Default)
++ DEPENDS+= +openssh-keygen
++ TITLE+= server
++ USERID:=sshd=22:sshd=22
++endef
++
++define Package/openssh-server/description
++OpenSSH server.
++endef
++
++define Package/openssh-server/conffiles
++/etc/ssh/sshd_config
++endef
++
++define Package/openssh-server-pam
++ $(call Package/openssh/Default)
++ DEPENDS+= +libpthread +openssh-keygen +libpam
++ TITLE+= server (with PAM support)
++ VARIANT:=with-pam
++ USERID:=sshd=22:sshd=22
++endef
++
++define Package/openssh-server-pam/description
++OpenSSH server (with PAM support).
++endef
++
++define Package/openssh-server-pam/conffiles
++/etc/pam.d/sshd
++/etc/security/access-sshd-local.conf
++/etc/ssh/sshd_config
++endef
++
++define Package/openssh-sftp-client
++ $(call Package/openssh/Default)
++ TITLE+= SFTP client
++endef
++
++define Package/openssh-sftp-client/description
++OpenSSH SFTP client.
++endef
++
++define Package/openssh-sftp-server
++ $(call Package/openssh/Default)
++ TITLE+= SFTP server
++ # Strip dependencies to avoid pulling in OpenSSL etc.
++ DEPENDS:=
++endef
++
++define Package/openssh-sftp-server/description
++OpenSSH SFTP server.
++endef
++
++define Package/openssh-sftp-avahi-service
++ $(call Package/openssh/Default)
++ TITLE+= (SFTP Avahi service)
++ DEPENDS:=+openssh-sftp-server +avahi-daemon
++endef
++
++define Package/openssh-sftp-avahi-service/description
++ This package contains the service definition for announcing
++ SFTP support via mDNS/DNS-SD.
++endef
++
++define Package/openssh-sftp-avahi-service/conffiles
++/etc/avahi/services/sftp-ssh.service
++endef
++
++CONFIGURE_ARGS+= \
++ $(DISABLE_NLS) \
++ --sysconfdir=/etc/ssh \
++ --with-privsep-user=sshd \
++ --with-privsep-path=/var/empty \
++ --enable-shared \
++ --disable-static \
++ --disable-debug \
++ --disable-strip \
++ --disable-etc-default-login \
++ --disable-lastlog \
++ --disable-utmp \
++ --disable-utmpx \
++ --disable-wtmp \
++ --disable-wtmpx \
++ --without-bsd-auth \
++ --without-kerberos5 \
++ --without-x
++
++ifeq ($(BUILD_VARIANT),with-pam)
++CONFIGURE_ARGS += \
++ --with-pam
++else
++CONFIGURE_ARGS += \
++ --without-pam
++endif
++
++ifeq ($(CONFIG_OPENSSL_ENGINE),y)
++CONFIGURE_ARGS+= \
++ --with-ssl-engine
++endif
++
++ifneq ($(CONFIG_SSP_SUPPORT),y)
++CONFIGURE_ARGS += \
++ --without-stackprotect
++endif
++
++CONFIGURE_VARS += LD="$(TARGET_CC)"
++
++ifeq ($(BUILD_VARIANT),with-pam)
++TARGET_LDFLAGS += -lpthread
++endif
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ LIBS="" \
++ sftp-server
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ STRIP_OPT="" \
++ all install
++endef
++
++define Package/openssh-client/preinst
++#!/bin/sh
++if [ -L $${IPKG_INSTROOT}/usr/bin/ssh ] && [ -L $${IPKG_INSTROOT}/usr/bin/scp ]; then
++ rm -f $${IPKG_INSTROOT}/usr/bin/ssh $${IPKG_INSTROOT}/usr/bin/scp;
++fi
++exit 0
++endef
++
++define Package/openssh-client/postrm
++#!/bin/sh
++rm -f $${IPKG_INSTROOT}/usr/bin/ssh $${IPKG_INSTROOT}/usr/bin/scp;
++if [ -x $${IPKG_INSTROOT}/usr/sbin/dropbear ] ; then
++ ln -s /usr/sbin/dropbear $${IPKG_INSTROOT}/usr/bin/ssh;
++ ln -s /usr/sbin/dropbear $${IPKG_INSTROOT}/usr/bin/scp;
++fi
++exit 0
++endef
++
++define Package/openssh-moduli/install
++ $(INSTALL_DIR) $(1)/etc/ssh
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/ssh/moduli $(1)/etc/ssh/
++endef
++
++define Package/openssh-client/install
++ $(INSTALL_DIR) $(1)/etc/ssh
++ chmod 0700 $(1)/etc/ssh
++ $(CP) $(PKG_INSTALL_DIR)/etc/ssh/ssh_config $(1)/etc/ssh/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ssh $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/scp $(1)/usr/bin/
++endef
++
++define Package/openssh-client-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(foreach bin,add agent keyscan keysign,$(PKG_BUILD_DIR)/ssh-$(bin)) $(1)/usr/bin/
++endef
++
++define Package/openssh-keygen/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ssh-keygen $(1)/usr/bin/
++endef
++
++define Package/openssh-server/install
++ $(INSTALL_DIR) $(1)/etc/ssh
++ chmod 0700 $(1)/etc/ssh
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/ssh/sshd_config $(1)/etc/ssh/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/sshd.init $(1)/etc/init.d/sshd
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/sshd $(1)/usr/sbin/
++endef
++
++define Package/openssh-server-pam/install
++ $(call Package/openssh-server/install,$(1))
++ sed -i 's,#PasswordAuthentication yes,PasswordAuthentication no,g' $(1)/etc/ssh/sshd_config
++ sed -i 's,#UsePAM no,UsePAM yes,g' $(1)/etc/ssh/sshd_config
++ $(INSTALL_DIR) $(1)/etc/pam.d
++ $(INSTALL_DATA) ./files/sshd.pam $(1)/etc/pam.d/sshd
++ $(INSTALL_DIR) $(1)/etc/security
++ $(INSTALL_DATA) ./files/sshd.pam-access $(1)/etc/security/access-sshd-local.conf
++endef
++
++define Package/openssh-sftp-client/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sftp $(1)/usr/bin/
++endef
++
++define Package/openssh-sftp-server/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/sftp-server $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/libexec
++ ln -sf ../lib/sftp-server $(1)/usr/libexec/sftp-server
++endef
++
++define Package/openssh-sftp-avahi-service/install
++ $(INSTALL_DIR) $(1)/etc/avahi/services
++ $(INSTALL_DATA) ./files/sftp-ssh.service $(1)/etc/avahi/services/
++endef
++
++$(eval $(call BuildPackage,openssh-client))
++$(eval $(call BuildPackage,openssh-moduli))
++$(eval $(call BuildPackage,openssh-client-utils))
++$(eval $(call BuildPackage,openssh-keygen))
++$(eval $(call BuildPackage,openssh-server))
++$(eval $(call BuildPackage,openssh-server-pam))
++$(eval $(call BuildPackage,openssh-sftp-client))
++$(eval $(call BuildPackage,openssh-sftp-server))
++$(eval $(call BuildPackage,openssh-sftp-avahi-service))
+diff --git a/feeds/packages/net/openssh/files/sftp-ssh.service b/feeds/packages/net/openssh/files/sftp-ssh.service
+new file mode 100644
+index 0000000..17e0927
+--- /dev/null
++++ b/feeds/packages/net/openssh/files/sftp-ssh.service
+@@ -0,0 +1,9 @@
++<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
++<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
++<service-group>
++ <name replace-wildcards="yes">%h</name>
++ <service>
++ <type>_sftp-ssh._tcp</type>
++ <port>22</port>
++ </service>
++</service-group>
+diff --git a/feeds/packages/net/openssh/files/sshd.init b/feeds/packages/net/openssh/files/sshd.init
+new file mode 100644
+index 0000000..c5a54e0
+--- /dev/null
++++ b/feeds/packages/net/openssh/files/sshd.init
+@@ -0,0 +1,42 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=50
++STOP=50
++
++USE_PROCD=1
++PROG=/usr/sbin/sshd
++
++start_service() {
++ for type in rsa dsa; do {
++ # check for keys
++ key=/etc/ssh/ssh_host_${type}_key
++ [ ! -f $key ] && {
++ # generate missing keys
++ [ -x /usr/bin/ssh-keygen ] && {
++ /usr/bin/ssh-keygen -N '' -t $type -f $key 2>&- >&-
++ }
++ }
++ }; done
++ mkdir -m 0700 -p /var/empty
++
++ procd_open_instance
++ procd_set_param command $PROG -D
++ procd_close_instance
++}
++
++shutdown() {
++ local pid
++ local pids
++ local pid_mine
++
++ stop
++
++ # kill active clients
++ pid_mine="$$"
++ pids="$(pidof sshd)"
++ for pid in $pids; do
++ [ "$pid" = "$pid_mine" ] && continue
++ [ -e "/proc/$pid/stat" ] && kill $pid
++ done
++}
+diff --git a/feeds/packages/net/openssh/files/sshd.pam b/feeds/packages/net/openssh/files/sshd.pam
+new file mode 100644
+index 0000000..387ff2e
+--- /dev/null
++++ b/feeds/packages/net/openssh/files/sshd.pam
+@@ -0,0 +1,41 @@
++# PAM configuration for the Secure Shell service
++
++# Read environment variables from /etc/environment and
++# /etc/security/pam_env.conf.
++auth required pam_env.so
++
++# Skip Google Authenticator if logging in from the local network.
++# auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-sshd-local.conf
++# Google Authenticator 2-step verification.
++# auth requisite pam_google_authenticator.so
++
++# Standard Un*x authentication.
++auth include common-auth
++
++# Disallow non-root logins when /etc/nologin exists.
++account required pam_nologin.so
++
++# Uncomment and edit /etc/security/access.conf if you need to set complex
++# access limits that are hard to express in sshd_config.
++# account required pam_access.so
++
++# Standard Un*x authorization.
++account include common-account
++
++# Standard Un*x session setup and teardown.
++session include common-session
++
++# Print the message of the day upon successful login.
++session optional pam_motd.so
++
++# Print the status of the user's mailbox upon successful login.
++session optional pam_mail.so standard noenv
++
++# Set up user limits from /etc/security/limits.conf.
++session required pam_limits.so
++
++# Set up SELinux capabilities (need modified pam)
++# session required pam_selinux.so multiple
++
++# Standard Un*x password updating.
++password include common-password
+diff --git a/feeds/packages/net/openssh/files/sshd.pam-access b/feeds/packages/net/openssh/files/sshd.pam-access
+new file mode 100644
+index 0000000..425ff11
+--- /dev/null
++++ b/feeds/packages/net/openssh/files/sshd.pam-access
+@@ -0,0 +1,4 @@
++# Skip Google Authenticator for local network
++#+ : ALL : 192.168.1.0/24
+++ : ALL : LOCAL
++- : ALL : ALL
+diff --git a/feeds/packages/net/openssh/patches/100-no_cast_fix.patch b/feeds/packages/net/openssh/patches/100-no_cast_fix.patch
+new file mode 100644
+index 0000000..5a4ecb1
+--- /dev/null
++++ b/feeds/packages/net/openssh/patches/100-no_cast_fix.patch
+@@ -0,0 +1,13 @@
++--- a/cipher.c
+++++ b/cipher.c
++@@ -88,8 +88,10 @@ static const struct sshcipher ciphers[]
++ { "3des-cbc", SSH_CIPHER_SSH2, 8, 24, 0, 0, 0, 1, EVP_des_ede3_cbc },
++ { "blowfish-cbc",
++ SSH_CIPHER_SSH2, 8, 16, 0, 0, 0, 1, EVP_bf_cbc },
+++#ifndef OPENSSL_NO_CAST
++ { "cast128-cbc",
++ SSH_CIPHER_SSH2, 8, 16, 0, 0, 0, 1, EVP_cast5_cbc },
+++#endif
++ { "arcfour", SSH_CIPHER_SSH2, 8, 16, 0, 0, 0, 0, EVP_rc4 },
++ { "arcfour128", SSH_CIPHER_SSH2, 8, 16, 0, 0, 1536, 0, EVP_rc4 },
++ { "arcfour256", SSH_CIPHER_SSH2, 8, 32, 0, 0, 1536, 0, EVP_rc4 },
+diff --git a/feeds/packages/net/openssh/patches/130-implicit_memset_decl_fix.patch b/feeds/packages/net/openssh/patches/130-implicit_memset_decl_fix.patch
+new file mode 100644
+index 0000000..7d46d20
+--- /dev/null
++++ b/feeds/packages/net/openssh/patches/130-implicit_memset_decl_fix.patch
+@@ -0,0 +1,12 @@
++--- a/includes.h
+++++ b/includes.h
++@@ -60,6 +60,9 @@
++ /*
++ *-*-nto-qnx needs these headers for strcasecmp and LASTLOG_FILE respectively
++ */
+++#ifdef HAVE_STRING_H
+++# include <string.h>
+++#endif
++ #ifdef HAVE_STRINGS_H
++ # include <strings.h>
++ #endif
+diff --git a/feeds/packages/net/openssh/patches/140-pam_uclibc_pthreads_fix.patch b/feeds/packages/net/openssh/patches/140-pam_uclibc_pthreads_fix.patch
+new file mode 100644
+index 0000000..1319b52
+--- /dev/null
++++ b/feeds/packages/net/openssh/patches/140-pam_uclibc_pthreads_fix.patch
+@@ -0,0 +1,84 @@
++--- a/auth-pam.c
+++++ b/auth-pam.c
++@@ -159,7 +159,7 @@ sshpam_sigchld_handler(int sig)
++ }
++ if (WIFSIGNALED(sshpam_thread_status) &&
++ WTERMSIG(sshpam_thread_status) == SIGTERM)
++- return; /* terminated by pthread_cancel */
+++ return; /* terminated by pthread2_cancel */
++ if (!WIFEXITED(sshpam_thread_status))
++ sigdie("PAM: authentication thread exited unexpectedly");
++ if (WEXITSTATUS(sshpam_thread_status) != 0)
++@@ -168,14 +168,14 @@ sshpam_sigchld_handler(int sig)
++
++ /* ARGSUSED */
++ static void
++-pthread_exit(void *value)
+++pthread2_exit(void *value)
++ {
++ _exit(0);
++ }
++
++ /* ARGSUSED */
++ static int
++-pthread_create(sp_pthread_t *thread, const void *attr,
+++pthread2_create(sp_pthread_t *thread, const void *attr,
++ void *(*thread_start)(void *), void *arg)
++ {
++ pid_t pid;
++@@ -201,7 +201,7 @@ pthread_create(sp_pthread_t *thread, con
++ }
++
++ static int
++-pthread_cancel(sp_pthread_t thread)
+++pthread2_cancel(sp_pthread_t thread)
++ {
++ signal(SIGCHLD, sshpam_oldsig);
++ return (kill(thread, SIGTERM));
++@@ -209,7 +209,7 @@ pthread_cancel(sp_pthread_t thread)
++
++ /* ARGSUSED */
++ static int
++-pthread_join(sp_pthread_t thread, void **value)
+++pthread2_join(sp_pthread_t thread, void **value)
++ {
++ int status;
++
++@@ -510,7 +510,7 @@ sshpam_thread(void *ctxtp)
++ /* XXX - can't do much about an error here */
++ ssh_msg_send(ctxt->pam_csock, sshpam_err, &buffer);
++ buffer_free(&buffer);
++- pthread_exit(NULL);
+++ pthread2_exit(NULL);
++
++ auth_fail:
++ buffer_put_cstring(&buffer,
++@@ -521,7 +521,7 @@ sshpam_thread(void *ctxtp)
++ else
++ ssh_msg_send(ctxt->pam_csock, PAM_AUTH_ERR, &buffer);
++ buffer_free(&buffer);
++- pthread_exit(NULL);
+++ pthread2_exit(NULL);
++
++ return (NULL); /* Avoid warning for non-pthread case */
++ }
++@@ -533,8 +533,8 @@ sshpam_thread_cleanup(void)
++
++ debug3("PAM: %s entering", __func__);
++ if (ctxt != NULL && ctxt->pam_thread != 0) {
++- pthread_cancel(ctxt->pam_thread);
++- pthread_join(ctxt->pam_thread, NULL);
+++ pthread2_cancel(ctxt->pam_thread);
+++ pthread2_join(ctxt->pam_thread, NULL);
++ close(ctxt->pam_psock);
++ close(ctxt->pam_csock);
++ memset(ctxt, 0, sizeof(*ctxt));
++@@ -698,7 +698,7 @@ sshpam_init_ctx(Authctxt *authctxt)
++ }
++ ctxt->pam_psock = socks[0];
++ ctxt->pam_csock = socks[1];
++- if (pthread_create(&ctxt->pam_thread, NULL, sshpam_thread, ctxt) == -1) {
+++ if (pthread2_create(&ctxt->pam_thread, NULL, sshpam_thread, ctxt) == -1) {
++ error("PAM: failed to start authentication thread: %s",
++ strerror(errno));
++ close(socks[0]);
+diff --git a/feeds/packages/net/openssh/patches/200-dscp-qos.patch b/feeds/packages/net/openssh/patches/200-dscp-qos.patch
+new file mode 100644
+index 0000000..827a668
+--- /dev/null
++++ b/feeds/packages/net/openssh/patches/200-dscp-qos.patch
+@@ -0,0 +1,21 @@
++--- a/ssh_config
+++++ b/ssh_config
++@@ -46,3 +46,6 @@
++ # VisualHostKey no
++ # ProxyCommand ssh -q -W %h:%p gateway.example.com
++ # RekeyLimit 1G 1h
+++
+++# enable DSCP QoS values (per RFC-4594)
+++#IPQoS AF21 AF11
++--- a/sshd_config
+++++ b/sshd_config
++@@ -122,6 +122,9 @@ UsePrivilegeSeparation sandbox # Defaul
++ # no default banner path
++ #Banner none
++
+++# enable DSCP QoS values (per RFC-4594)
+++#IPQoS AF21 AF11
+++
++ # override default of no subsystems
++ Subsystem sftp /usr/libexec/sftp-server
++
+diff --git a/feeds/packages/net/opentracker/Makefile b/feeds/packages/net/opentracker/Makefile
+new file mode 100644
+index 0000000..4422cd3
+--- /dev/null
++++ b/feeds/packages/net/opentracker/Makefile
+@@ -0,0 +1,98 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=opentracker
++PKG_VERSION:=20150427
++PKG_RELEASE:=1
++PKG_REV:=27499d7a55bde404f3273a23026f2495e96adf87
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=Beerware
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=git://erdgeist.org/opentracker
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_PROTO:=git
++PKG_BUILD_DEPENDS:=libowfat
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/opentracker/Default
++ SUBMENU:=BitTorrent
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=opentracker
++ URL:=http://erdgeist.org/arts/software/opentracker/
++ DEPENDS:=+zlib +libpthread
++endef
++
++define Package/opentracker
++$(call Package/opentracker/Default)
++ VARIANT:=ipv4
++endef
++
++define Package/opentracker6
++$(call Package/opentracker/Default)
++ TITLE+= (IPv6 build)
++ VARIANT:=ipv6
++endef
++
++
++define Package/opentracker-default/description
++ opentracker - An open and free bittorrent tracker
++
++ opentracker is an open and free bittorrent tracker project.
++ It aims for minimal resource usage and is intended to run at your wlan router.
++ Currently it is deployed as an open and free tracker instance.
++ Read our free and open tracker blog and announce your torrents there
++ (but do not hesitate to setup your own free trackers!).
++endef
++
++define Package/opentracker/description
++ $(call Package/opentracker-default/description)
++
++ This package contains the IPv4-build of opentracker.
++
++endef
++
++define Package/opentracker6/description
++ $(call Package/opentracker-default/description)
++
++ This package contains the IPv6-build of opentracker.
++
++endef
++
++
++MAKE_FLAGS += PREFIX="$(STAGING_DIR)/usr"
++
++ifeq ($(BUILD_VARIANT),ipv6)
++ MAKE_FLAGS += FEATURES="-DWANT_V6"
++endif
++
++define Package/opentracker/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/opentracker $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/opentracker.conf.sample $(1)/etc/opentracker.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/opentracker.init $(1)/etc/init.d/opentracker
++endef
++
++define Package/opentracker6/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/opentracker $(1)/usr/bin/opentracker6
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/opentracker.conf.sample $(1)/etc/opentracker6.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/opentracker6.init $(1)/etc/init.d/opentracker6
++endef
++
++$(eval $(call BuildPackage,opentracker))
++$(eval $(call BuildPackage,opentracker6))
+diff --git a/feeds/packages/net/opentracker/files/opentracker.init b/feeds/packages/net/opentracker/files/opentracker.init
+new file mode 100755
+index 0000000..91fb386
+--- /dev/null
++++ b/feeds/packages/net/opentracker/files/opentracker.init
+@@ -0,0 +1,16 @@
++#!/bin/sh /etc/rc.common
++
++START=10
++STOP=15
++
++NAME="opentracker"
++PROG="/usr/bin/opentracker"
++OPTIONS="-f /etc/opentracker.conf"
++USE_PROCD=1
++
++start_service()
++{
++ procd_open_instance
++ procd_set_param command $PROG $OPTIONS
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/opentracker/files/opentracker6.init b/feeds/packages/net/opentracker/files/opentracker6.init
+new file mode 100755
+index 0000000..02417f3
+--- /dev/null
++++ b/feeds/packages/net/opentracker/files/opentracker6.init
+@@ -0,0 +1,16 @@
++#!/bin/sh /etc/rc.common
++
++START=10
++STOP=15
++
++NAME="opentracker6"
++PROG="/usr/bin/opentracker6"
++OPTIONS="-f /etc/opentracker6.conf"
++USE_PROCD=1
++
++start_service()
++{
++ procd_open_instance
++ procd_set_param command $PROG $OPTIONS
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/opentracker/patches/100-makefile.patch b/feeds/packages/net/opentracker/patches/100-makefile.patch
+new file mode 100644
+index 0000000..bbaf8d9
+--- /dev/null
++++ b/feeds/packages/net/opentracker/patches/100-makefile.patch
+@@ -0,0 +1,30 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -9,13 +9,13 @@ CC?=gcc
++
++ # BSD flavour
++ # PREFIX?=/usr/local
++-# LIBOWFAT_HEADERS=$(PREFIX)/include/libowfat
++-# LIBOWFAT_LIBRARY=$(PREFIX)/lib
+++LIBOWFAT_HEADERS=$(PREFIX)/include/libowfat
+++LIBOWFAT_LIBRARY=$(PREFIX)/lib
++
++ # Debug flavour
++-PREFIX?=..
++-LIBOWFAT_HEADERS=$(PREFIX)/libowfat
++-LIBOWFAT_LIBRARY=$(PREFIX)/libowfat
+++# PREFIX?=..
+++# LIBOWFAT_HEADERS=$(PREFIX)/libowfat
+++# LIBOWFAT_LIBRARY=$(PREFIX)/libowfat
++
++ BINDIR?=$(PREFIX)/bin
++
++@@ -66,7 +66,7 @@ CFLAGS_debug = $(CFLAGS) $(OPTS_debug) $
++
++ $(BINARY): $(OBJECTS) $(HEADERS)
++ $(CC) -o $@ $(OBJECTS) $(LDFLAGS)
++- strip $@
+++ $(STRIP) $@
++ $(BINARY).debug: $(OBJECTS_debug) $(HEADERS)
++ $(CC) -o $@ $(OBJECTS_debug) $(LDFLAGS)
++ proxy: $(OBJECTS_proxy) $(HEADERS)
+diff --git a/feeds/packages/net/openvswitch/Makefile b/feeds/packages/net/openvswitch/Makefile
+new file mode 100644
+index 0000000..f6d7e01
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/Makefile
+@@ -0,0 +1,176 @@
++#
++# Copyright (C) 2013 Julius Schulz-Zander <julius@net.t-labs.tu-berlin.de>
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++# $Id: Makefile $
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=openvswitch
++
++PKG_RELEASE:=2
++PKG_VERSION:=2.4.0
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++PKG_LICENSE:=Apache-2.0
++PKG_LICENSE_FILES:=COPYING
++PKG_USE_MIPS16:=0
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/openvswitch/ovs
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=b979c282ef040a20d09b8d6885648b09352f05db
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++SUPPORTED_KERNELS:=LINUX_3_8||LINUX_3_10||LINUX_3_13||LINUX_3_14||LINUX_3_18||LINUX_4_0||LINUX_4_1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/kernel.mk
++$(call include_mk, python-package.mk)
++
++define Package/openvswitch/Default
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://openvswitch.org/
++ MAINTAINER:=Alexandru Ardelean <ardeleanalex@gmail.com>
++endef
++
++define Package/openvswitch/Default/description
++ Open vSwitch is a production quality, multilayer, software-based, Ethernet
++ virtual switch. It is designed to enable massive network automation through
++ programmatic extension, while still supporting standard management interfaces
++ and protocols (e.g. NetFlow, sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag). In
++ addition, it is designed to support distribution across multiple physical
++ servers similar to VMware's vNetwork distributed vswitch or Cisco's Nexus
++ 1000V.
++endef
++
++define Package/openvswitch
++ $(call Package/openvswitch/Default)
++ TITLE:=Open vSwitch Userspace Package
++ DEPENDS:=+libpcap +libopenssl +librt +kmod-openvswitch @($(SUPPORTED_KERNELS))
++endef
++
++define Package/openvswitch/description
++ Provides the main userspace components required for Open vSwitch to function.
++endef
++
++define Package/openvswitch-python
++ $(call Package/openvswitch/Default)
++ TITLE:=Open vSwitch Python Support
++ DEPENDS:=@PACKAGE_openvswitch +PACKAGE_openvswitch:openvswitch +python
++endef
++
++define Package/openvswitch-python/description
++ Provides bindings and libraries for using Python to manipulate/work with Open vSwitch.
++endef
++
++define Package/openvswitch-ipsec
++ $(call Package/openvswitch/Default)
++ TITLE:=Open vSwitch Userspace Package
++ DEPENDS:=@PACKAGE_openvswitch +PACKAGE_openvswitch:openvswitch-python
++endef
++
++define Package/openvswitch-ipsec/description
++ The ovs-monitor-ipsec script provides support for encrypting GRE tunnels with
++ IPsec.
++endef
++
++define Package/openvswitch-benchmark
++ $(call Package/openvswitch/Default)
++ TITLE:=Open vSwitch Userspace Package
++ DEPENDS:=@PACKAGE_openvswitch +PACKAGE_openvswitch:openvswitch
++endef
++
++define Package/openvswitch-benchmark/description
++ Utility for running OpenVSwitch benchmarking
++endef
++
++define KernelPackage/openvswitch
++ SECTION:=kernel
++ CATEGORY:=Kernel modules
++ SUBMENU:=Network Support
++ TITLE:=Open vSwitch Kernel Package
++ KCONFIG:=CONFIG_BRIDGE
++ DEPENDS:=+kmod-stp @IPV6 +kmod-gre +kmod-lib-crc32c +kmod-vxlan @($(SUPPORTED_KERNELS))
++ FILES:= \
++ $(PKG_BUILD_DIR)/datapath/linux/openvswitch.$(LINUX_KMOD_SUFFIX)
++ AUTOLOAD:=$(call AutoLoad,21,openvswitch)
++endef
++
++define KernelPackage/openvswitch/description
++ This package contains the Open vSwitch kernel moodule and bridge compat
++ module. Furthermore, it supports OpenFlow.
++endef
++
++CONFIGURE_ARGS += --with-linux=$(LINUX_DIR) --with-rundir=/var/run
++CONFIGURE_ARGS += --enable-ndebug
++CONFIGURE_ARGS += --disable-ssl
++CONFIGURE_ARGS += --enable-shared
++
++TARGET_CFLAGS += -flto -std=gnu99
++
++CONFIGURE_VARS += KARCH=$(LINUX_KARCH)
++MAKE_FLAGS += ARCH="$(LINUX_KARCH)"
++
++define Package/openvswitch/install
++ $(INSTALL_DIR) $(1)/etc/openvswitch
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/etc/init.d/openvswitch.init $(1)/etc/init.d/openvswitch
++
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/lib/.libs/libsflow.so* $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/lib/.libs/libopenvswitch.so* $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/ofproto/.libs/libofproto.so* $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/ovsdb/.libs/libovsdb.so* $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utilities/.libs/ovs-appctl $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utilities/.libs/ovs-ofctl $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ovsdb/.libs/ovsdb-client $(1)/usr/bin/
++
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utilities/.libs/ovs-dpctl $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utilities/.libs/ovs-vsctl $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ovsdb/.libs/ovsdb-tool $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/vswitchd/.libs/ovs-vswitchd $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ovsdb/.libs/ovsdb-server $(1)/usr/sbin/
++
++ $(INSTALL_DIR) $(1)/usr/share/openvswitch/
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/vswitchd/vswitch.ovsschema $(1)/usr/share/openvswitch/
++endef
++
++define Package/openvswitch-python/install
++ $(INSTALL_DIR) $(1)/usr/lib/python$(PYTHON_VERSION)/
++ $(CP) $(PKG_BUILD_DIR)/python/ovs/ $(1)/usr/lib/python$(PYTHON_VERSION)/
++endef
++
++define Package/openvswitch-ipsec/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/debian/ovs-monitor-ipsec $(1)/usr/sbin/
++endef
++
++define Package/openvswitch-benchmark/install
++ $(INSTALL_DIR) $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/utilities/.libs/ovs-benchmark $(1)/usr/bin/
++endef
++
++define Package/openvswitch/postinst
++#!/bin/sh
++[ -n "$${IPKG_INSTROOT}" ] || /etc/init.d/openvswitch enable || true
++endef
++
++$(eval $(call BuildPackage,openvswitch))
++$(eval $(call BuildPackage,openvswitch-python))
++$(eval $(call BuildPackage,openvswitch-ipsec))
++$(eval $(call BuildPackage,openvswitch-benchmark))
++$(eval $(call KernelPackage,openvswitch))
++
+diff --git a/feeds/packages/net/openvswitch/files/etc/init.d/openvswitch.init b/feeds/packages/net/openvswitch/files/etc/init.d/openvswitch.init
+new file mode 100644
+index 0000000..ffe879a
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/files/etc/init.d/openvswitch.init
+@@ -0,0 +1,41 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2013 Julius Schulz-Zander <julius@net.t-labs.tu-berlin.de>
++# Copyright (C) 2014 OpenWrt.org
++
++START=15
++USE_PROCD=1
++
++start_service() {
++ [ -x /var/run/openvswitch ] || mkdir -p /var/run/openvswitch
++ [ -e /etc/openvswitch/conf.db ] || {
++ /usr/bin/ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
++ }
++
++ # ovsdb-server
++ procd_open_instance
++ procd_set_param command /usr/sbin/ovsdb-server
++ procd_append_param command --remote=punix:/var/run/db.sock
++ procd_append_param command --remote=db:Open_vSwitch,Open_vSwitch,manager_options
++ procd_append_param command --pidfile=/var/run/ovsdb-server.pid
++ procd_set_param respawn
++ procd_append_param respawn 3600
++ procd_append_param respawn 5
++ procd_append_param respawn -1
++ procd_set_param nice
++ procd_append_param nice -10
++ procd_close_instance
++
++ # ovs-vswitchd
++ procd_open_instance
++ procd_set_param command /usr/sbin/ovs-vswitchd
++ procd_append_param command --pidfile=/var/run/ovs-vswitchd.pid
++ procd_set_param respawn
++ procd_append_param respawn 3600
++ procd_append_param respawn 5
++ procd_append_param respawn -1
++ procd_set_param nice
++ procd_append_param nice -10
++ procd_close_instance
++
++}
++
+diff --git a/feeds/packages/net/openvswitch/patches/0001-netdev-linux-Use-unsigned-int-for-ifi_flags.patch b/feeds/packages/net/openvswitch/patches/0001-netdev-linux-Use-unsigned-int-for-ifi_flags.patch
+new file mode 100644
+index 0000000..ed537d1
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/patches/0001-netdev-linux-Use-unsigned-int-for-ifi_flags.patch
+@@ -0,0 +1,28 @@
++From 12edcd800d924f69630768eeece842373dee5bb0 Mon Sep 17 00:00:00 2001
++From: Helmut Schaa <helmut.schaa@googlemail.com>
++Date: Wed, 8 Jan 2014 13:48:33 +0100
++Subject: [PATCH 1/2] netdev-linux: Use unsigned int for ifi_flags
++
++ifi_flags is unsigned, the local equivalents should do the same.
++
++Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
++---
++ lib/netdev-linux.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
++index 9bdbbdf..9eaac33 100644
++--- a/lib/netdev-linux.c
+++++ b/lib/netdev-linux.c
++@@ -2709,7 +2709,7 @@ update_flags(struct netdev_linux *netdev, enum netdev_flags off,
++ enum netdev_flags on, enum netdev_flags *old_flagsp)
++ OVS_REQUIRES(netdev->mutex)
++ {
++- int old_flags, new_flags;
+++ unsigned int old_flags, new_flags;
++ int error = 0;
++
++ old_flags = netdev->ifi_flags;
++--
++1.8.1.4
++
+diff --git a/feeds/packages/net/openvswitch/patches/0002-netdev-linux-Let-interface-flag-survive-internal-por.patch b/feeds/packages/net/openvswitch/patches/0002-netdev-linux-Let-interface-flag-survive-internal-por.patch
+new file mode 100644
+index 0000000..b31816a
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/patches/0002-netdev-linux-Let-interface-flag-survive-internal-por.patch
+@@ -0,0 +1,41 @@
++From b9284f535e93c337ab21f330753e60e1038f9a27 Mon Sep 17 00:00:00 2001
++From: Helmut Schaa <helmut.schaa@googlemail.com>
++Date: Wed, 8 Jan 2014 13:48:49 +0100
++Subject: [PATCH 2/2] netdev-linux: Let interface flag survive internal port
++ setup
++
++Due to a race condition when bringing up an internal port on Linux
++some interface flags (e.g. IFF_MULTICAST) are falsely reset. This
++happens because netlink events may be processed after the according
++netdev has been brought up (which sets interface flags).
++
++Fix this by reading the interface flags just before updating them
++if they have not been updated by from the kernel yet.
++
++Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
++---
++ lib/netdev-linux.c | 8 +++++++-
++ 1 file changed, 7 insertions(+), 1 deletion(-)
++
++diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
++index 9eaac33..423e72e 100644
++--- a/lib/netdev-linux.c
+++++ b/lib/netdev-linux.c
++@@ -2712,7 +2712,13 @@ update_flags(struct netdev_linux *netdev, enum netdev_flags off,
++ unsigned int old_flags, new_flags;
++ int error = 0;
++
++- old_flags = netdev->ifi_flags;
+++ if (!(netdev->cache_valid & VALID_DRVINFO)) {
+++ /* Most likely the debvice flags are not in sync yet, fetch them now */
+++ get_flags(&netdev->up, &old_flags);
+++ } else {
+++ old_flags = netdev->ifi_flags;
+++ }
+++
++ *old_flagsp = iff_to_nd_flags(old_flags);
++ new_flags = (old_flags & ~nd_to_iff_flags(off)) | nd_to_iff_flags(on);
++ if (new_flags != old_flags) {
++--
++1.8.1.4
++
+diff --git a/feeds/packages/net/openvswitch/patches/0003-datapath-do-not-add-vlan_hwaccel_push_inside-for-ker.patch b/feeds/packages/net/openvswitch/patches/0003-datapath-do-not-add-vlan_hwaccel_push_inside-for-ker.patch
+new file mode 100644
+index 0000000..673b8d6
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/patches/0003-datapath-do-not-add-vlan_hwaccel_push_inside-for-ker.patch
+@@ -0,0 +1,35 @@
++From 5919cb26c631b1dd77a745a3c546f9d117ed34b3 Mon Sep 17 00:00:00 2001
++From: Hauke Mehrtens <hauke@hauke-m.de>
++Date: Sat, 23 May 2015 18:12:09 +0200
++Subject: [PATCH] datapath: do not add vlan_hwaccel_push_inside() for kernel >=
++ 3.18.13
++
++The vlan_hwaccel_push_inside() function was backported in this commit
++to kernel 3.18.13:
++
++commit a67e2e88342accd49587d9bad72f6dabd7673f7c
++Author: Jiri Pirko <jiri@resnulli.us>
++Date: Wed Nov 19 14:04:59 2014 +0100
++
++ vlan: introduce *vlan_hwaccel_push_inside helpers
++
++ [ Upstream commit 5968250c868ceee680aa77395b24e6ddcae17d36 ]
++
++Without this patch compilation breaks on kernel >= 3.18.13
++
++Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
++---
++ datapath/linux/compat/include/linux/if_vlan.h | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++--- a/datapath/linux/compat/include/linux/if_vlan.h
+++++ b/datapath/linux/compat/include/linux/if_vlan.h
++@@ -52,7 +52,7 @@ static inline struct sk_buff *rpl_vlan_i
++ }
++ #endif
++
++-#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
+++#if LINUX_VERSION_CODE < KERNEL_VERSION(3,18,13)
++ /*
++ * __vlan_hwaccel_push_inside - pushes vlan tag to the payload
++ * @skb: skbuff to tag
+diff --git a/feeds/packages/net/openvswitch/patches/0004-musl-compatibility.patch b/feeds/packages/net/openvswitch/patches/0004-musl-compatibility.patch
+new file mode 100644
+index 0000000..25aa45d
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/patches/0004-musl-compatibility.patch
+@@ -0,0 +1,39 @@
++diff --git a/configure.ac b/configure.ac
++index 8d47eb9..69eeed8 100644
++--- a/configure.ac
+++++ b/configure.ac
++@@ -117,7 +117,6 @@ OVS_CHECK_XENSERVER_VERSION
++ OVS_CHECK_GROFF
++ OVS_CHECK_GNU_MAKE
++ OVS_CHECK_TLS
++-OVS_CHECK_ATOMIC_LIBS
++ OVS_CHECK_GCC4_ATOMICS
++ OVS_CHECK_ATOMIC_ALWAYS_LOCK_FREE(1)
++ OVS_CHECK_ATOMIC_ALWAYS_LOCK_FREE(2)
++diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
++index 9b2e74f..70126bb 100644
++--- a/lib/netdev-linux.c
+++++ b/lib/netdev-linux.c
++@@ -40,7 +40,9 @@
++ #include <netpacket/packet.h>
++ #include <net/if.h>
++ #include <net/if_arp.h>
+++#if defined(__UCLIBC__) || defined(__GLIBC__)
++ #include <net/if_packet.h>
+++#endif
++ #include <net/route.h>
++ #include <netinet/in.h>
++ #include <poll.h>
++diff --git a/lib/ovs-atomic.h b/lib/ovs-atomic.h
++index 9ead907..86d3341 100644
++--- a/lib/ovs-atomic.h
+++++ b/lib/ovs-atomic.h
++@@ -325,8 +325,6 @@
++ #include "ovs-atomic-clang.h"
++ #elif HAVE_STDATOMIC_H
++ #include "ovs-atomic-c11.h"
++- #elif __GNUC__ >= 4 && __GNUC_MINOR__ >= 7
++- #include "ovs-atomic-gcc4.7+.h"
++ #elif __GNUC__ && defined(__x86_64__)
++ #include "ovs-atomic-x86_64.h"
++ #elif __GNUC__ && defined(__i386__)
+diff --git a/feeds/packages/net/openvswitch/patches/0005-datapath-Add-net-ip6_checksum.h-to-stt.c.patch b/feeds/packages/net/openvswitch/patches/0005-datapath-Add-net-ip6_checksum.h-to-stt.c.patch
+new file mode 100644
+index 0000000..61504d2
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/patches/0005-datapath-Add-net-ip6_checksum.h-to-stt.c.patch
+@@ -0,0 +1,34 @@
++From 554daf066bf4a8eb7bbc8edc1a877a3afc0de38d Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Jason=20K=C3=B6lker?= <jason@koelker.net>
++Date: Wed, 2 Sep 2015 22:40:24 +0000
++Subject: [PATCH] datapath: Add net/ip6_checksum.h to stt.c
++MIME-Version: 1.0
++Content-Type: text/plain; charset=UTF-8
++Content-Transfer-Encoding: 8bit
++
++`csum_ipv6_magic` is an asm inline on most platforms. However if it is
++not defined (like on ppc64le) including <net/ip6_checksum.h> will fall
++back to the c implementation by wrapping it in an
++`#ifndef _HAVE_ARCH_IPV6_CSUM`.
++
++Signed-off-by: Jason Kölker <jason@koelker.net>
++Signed-off-by: Jesse Gross <jesse@nicira.com>
++---
++ datapath/linux/compat/stt.c | 1 +
++ 1 file changed, 1 insertion(+)
++
++diff --git a/datapath/linux/compat/stt.c b/datapath/linux/compat/stt.c
++index b44f470..dd21753 100644
++--- a/datapath/linux/compat/stt.c
+++++ b/datapath/linux/compat/stt.c
++@@ -30,6 +30,7 @@
++ #include <net/icmp.h>
++ #include <net/inet_ecn.h>
++ #include <net/ip.h>
+++#include <net/ip6_checksum.h>
++ #include <net/net_namespace.h>
++ #include <net/netns/generic.h>
++ #include <net/sock.h>
++--
++2.1.4
++
+diff --git a/feeds/packages/net/openvswitch/patches/0006-force-kernel-4-1.patch b/feeds/packages/net/openvswitch/patches/0006-force-kernel-4-1.patch
+new file mode 100644
+index 0000000..d87fd90
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/patches/0006-force-kernel-4-1.patch
+@@ -0,0 +1,17 @@
++diff --git a/acinclude.m4 b/acinclude.m4
++index 45cfaf6..42866de 100644
++--- a/acinclude.m4
+++++ b/acinclude.m4
++@@ -134,10 +134,10 @@ AC_DEFUN([OVS_CHECK_LINUX], [
++ AC_MSG_RESULT([$kversion])
++
++ if test "$version" -ge 4; then
++- if test "$version" = 4 && test "$patchlevel" -le 0; then
+++ if test "$version" = 4 && test "$patchlevel" -le 1; then
++ : # Linux 4.x
++ else
++- AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 4.0.x is not supported (please refer to the FAQ for advice)])
+++ AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 4.1.x is not supported (please refer to the FAQ for advice)])
++ fi
++ elif test "$version" = 3; then
++ : # Linux 3.x
+diff --git a/feeds/packages/net/openvswitch/patches/0007-add-netns-compat.patch b/feeds/packages/net/openvswitch/patches/0007-add-netns-compat.patch
+new file mode 100644
+index 0000000..b6592c8
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/patches/0007-add-netns-compat.patch
+@@ -0,0 +1,93 @@
++diff --git a/datapath/datapath.h b/datapath/datapath.h
++index fdf35f0..02be8be 100644
++--- a/datapath/datapath.h
+++++ b/datapath/datapath.h
++@@ -86,10 +86,8 @@ struct datapath {
++ /* Stats. */
++ struct dp_stats_percpu __percpu *stats_percpu;
++
++-#ifdef CONFIG_NET_NS
++ /* Network namespace ref. */
++- struct net *net;
++-#endif
+++ possible_net_t net;
++
++ u32 user_features;
++ };
++@@ -154,12 +152,12 @@ int lockdep_ovsl_is_held(void);
++
++ static inline struct net *ovs_dp_get_net(const struct datapath *dp)
++ {
++- return read_pnet(&dp->net);
+++ return ovs_compat_read_pnet(&dp->net);
++ }
++
++ static inline void ovs_dp_set_net(struct datapath *dp, struct net *net)
++ {
++- write_pnet(&dp->net, net);
+++ ovs_compat_write_pnet(&dp->net, net);
++ }
++
++ struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no);
++diff --git a/datapath/linux/compat/include/net/net_namespace.h b/datapath/linux/compat/include/net/net_namespace.h
++index b7dbfe3..7763584 100644
++--- a/datapath/linux/compat/include/net/net_namespace.h
+++++ b/datapath/linux/compat/include/net/net_namespace.h
++@@ -51,4 +51,57 @@ static void rpl_unregister_pernet_gen_##TYPE(struct rpl_pernet_operations *rpl_p
++ #define DEFINE_COMPAT_PNET_REG_FUNC(TYPE)
++ #endif /* 2.6.33 */
++
+++/* In recent kernel versions (4.1) this type is defined ; for older versions we have to define it */
+++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
+++#define ovs_compat_read_pnet read_pnet
+++#define ovs_compat_write_pnet write_pnet
+++
+++#if defined(CONFIG_NET_NS) && defined(NETNS_REFCNT_DEBUG)
+++static inline struct net *hold_net(struct net *net)
+++{
+++ if (net)
+++ atomic_inc(&net->use_count);
+++ return net;
+++}
+++
+++static inline void release_net(struct net *net)
+++{
+++ if (net)
+++ atomic_dec(&net->use_count);
+++}
+++#else
+++static inline struct net *hold_net(struct net *net)
+++{
+++ return net;
+++}
+++
+++static inline void release_net(struct net *net)
+++{
+++}
+++#endif
+++
+++#else /* lower than 4.1 */
+++typedef struct {
+++#ifdef CONFIG_NET_NS
+++ struct net *net;
+++#endif
+++} possible_net_t;
+++
+++static inline void ovs_compat_write_pnet(possible_net_t *pnet, struct net *net)
+++{
+++#ifdef CONFIG_NET_NS
+++ pnet->net = net;
+++#endif
+++}
+++
+++static inline struct net *ovs_compat_read_pnet(const possible_net_t *pnet)
+++{
+++#ifdef CONFIG_NET_NS
+++ return pnet->net;
+++#else
+++ return &init_net;
+++#endif
+++}
+++#endif /* 4.1.0 */
+++
++ #endif /* net/net_namespace.h wrapper */
+diff --git a/feeds/packages/net/openvswitch/patches/0008-add-back-old-gfp-this-node-define.patch b/feeds/packages/net/openvswitch/patches/0008-add-back-old-gfp-this-node-define.patch
+new file mode 100644
+index 0000000..ec7d325
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/patches/0008-add-back-old-gfp-this-node-define.patch
+@@ -0,0 +1,19 @@
++diff --git a/datapath/flow.c b/datapath/flow.c
++index a7a2063..8db8041 100644
++--- a/datapath/flow.c
+++++ b/datapath/flow.c
++@@ -51,6 +51,14 @@
++
++ #include "vlan.h"
++
+++#ifndef GFP_THISNODE
+++#ifdef CONFIG_NUMA
+++#define GFP_THISNODE (__GFP_THISNODE | __GFP_NOWARN | __GFP_NORETRY)
+++#else
+++#define GFP_THISNODE ((__force gfp_t)0)
+++#endif
+++#endif
+++
++ u64 ovs_flow_used_time(unsigned long flow_jiffies)
++ {
++ struct timespec cur_ts;
+diff --git a/feeds/packages/net/openvswitch/patches/0010-patch-nf_ip_hook-4.1.patch b/feeds/packages/net/openvswitch/patches/0010-patch-nf_ip_hook-4.1.patch
+new file mode 100644
+index 0000000..46c3432
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/patches/0010-patch-nf_ip_hook-4.1.patch
+@@ -0,0 +1,20 @@
++diff --git a/datapath/linux/compat/stt.c b/datapath/linux/compat/stt.c
++index b44f470..f95416e 100644
++--- a/datapath/linux/compat/stt.c
+++++ b/datapath/linux/compat/stt.c
++@@ -1326,9 +1326,14 @@ static void clean_percpu(struct work_struct *work)
++
++ static unsigned int nf_ip_hook(FIRST_PARAM
++ struct sk_buff *skb,
+++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
+++ const struct nf_hook_state *state
+++#else
++ const struct net_device *in,
++ const struct net_device *out,
++- int (*okfn)(struct sk_buff *))
+++ int (*okfn)(struct sk_buff *)
+++#endif
+++ )
++ {
++ struct stt_sock *stt_sock;
++ int ip_hdr_len;
+diff --git a/feeds/packages/net/openvswitch/patches/0011-fix-vxlan-xmit-skb-4.1.patch b/feeds/packages/net/openvswitch/patches/0011-fix-vxlan-xmit-skb-4.1.patch
+new file mode 100644
+index 0000000..1aecdab
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/patches/0011-fix-vxlan-xmit-skb-4.1.patch
+@@ -0,0 +1,18 @@
++diff --git a/datapath/linux/compat/include/net/vxlan.h b/datapath/linux/compat/include/net/vxlan.h
++index 0d60c18..db4dfb6 100644
++--- a/datapath/linux/compat/include/net/vxlan.h
+++++ b/datapath/linux/compat/include/net/vxlan.h
++@@ -99,8 +99,13 @@ static inline int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
++ return -ENOSYS;
++ }
++
+++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
+++ return vxlan_xmit_skb(rt, vs->sock->sk, skb, src, dst, tos, ttl, df,
+++ src_port, dst_port, md, xnet, vxflags);
+++#else
++ return vxlan_xmit_skb(rt, skb, src, dst, tos, ttl, df,
++ src_port, dst_port, md, xnet, vxflags);
+++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0) */
++ }
++
++ #define vxlan_xmit_skb rpl_vxlan_xmit_skb
+diff --git a/feeds/packages/net/openvswitch/patches/0012-fix-vport-lisp-4.1.patch b/feeds/packages/net/openvswitch/patches/0012-fix-vport-lisp-4.1.patch
+new file mode 100644
+index 0000000..47bbfb4
+--- /dev/null
++++ b/feeds/packages/net/openvswitch/patches/0012-fix-vport-lisp-4.1.patch
+@@ -0,0 +1,16 @@
++diff --git a/datapath/vport-lisp.c b/datapath/vport-lisp.c
++index 0024eb4..ce1c3a8 100644
++--- a/datapath/vport-lisp.c
+++++ b/datapath/vport-lisp.c
++@@ -455,7 +455,11 @@ static int lisp_send(struct vport *vport, struct sk_buff *skb)
++ ovs_skb_set_inner_protocol(skb, skb->protocol);
++
++ df = tun_key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
+++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
+++ sent_len = udp_tunnel_xmit_skb(rt, lisp_port->lisp_rcv_socket->sk, skb, saddr, tun_key->ipv4_dst,
+++#else
++ sent_len = udp_tunnel_xmit_skb(rt, skb, saddr, tun_key->ipv4_dst,
+++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0) */
++ tun_key->ipv4_tos, tun_key->ipv4_ttl,
++ df, src_port, dst_port, false, true);
++
+diff --git a/feeds/packages/net/p910nd/Makefile b/feeds/packages/net/p910nd/Makefile
+new file mode 100644
+index 0000000..d07ee1a
+--- /dev/null
++++ b/feeds/packages/net/p910nd/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=p910nd
++PKG_VERSION:=0.97
++PKG_RELEASE:=4
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/p910nd
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=COPYING
++PKG_MD5SUM:=69461a6c54dca0b13ecad5b83864b43e
++PKG_MAINTAINER:=Philipp Kerling <pkerling@casix.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/p910nd
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Printing
++ TITLE:=A small non-spooling printer server
++ URL:=http://p910nd.sourceforge.net
++endef
++
++define Package/p910nd/conffiles
++/etc/config/p910nd
++endef
++
++define Package/p910nd/description
++ p910nd is a small daemon that copies any data received on
++ the port it is listening on to the corresponding printer
++ port. It is primarily intended for diskless Linux hosts
++ running as printer drivers but there is no reason why it
++ could not be used on diskful hosts. Port 9100 is copied
++ to /dev/lp0, 9101 to /dev/lp1 and 9102 to /dev/lp2. The
++ default is port 9100 to /dev/lp0.
++endef
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) -DLOCKFILE_DIR=\"\\\"/tmp\"\\\""
++
++define Package/p910nd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/p910nd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/p910nd.config $(1)/etc/config/p910nd
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/p910nd.init $(1)/etc/init.d/p910nd
++endef
++
++$(eval $(call BuildPackage,p910nd))
+diff --git a/feeds/packages/net/p910nd/files/p910nd.config b/feeds/packages/net/p910nd/files/p910nd.config
+new file mode 100644
+index 0000000..d509035
+--- /dev/null
++++ b/feeds/packages/net/p910nd/files/p910nd.config
+@@ -0,0 +1,5 @@
++config p910nd
++ option device /dev/usb/lp0
++ option port 0
++ option bidirectional 1
++ option enabled 0
+diff --git a/feeds/packages/net/p910nd/files/p910nd.init b/feeds/packages/net/p910nd/files/p910nd.init
+new file mode 100644
+index 0000000..8757551
+--- /dev/null
++++ b/feeds/packages/net/p910nd/files/p910nd.init
+@@ -0,0 +1,51 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007 OpenWrt.org
++START=50
++
++append_bool() {
++ local section="$1"
++ local option="$2"
++ local value="$3"
++ local _val
++ config_get_bool _val "$section" "$option" '0'
++ [ "$_val" -gt 0 ] && append args "$3"
++}
++
++append_string() {
++ local section="$1"
++ local option="$2"
++ local value="$3"
++ local _val
++ config_get _val "$section" "$option"
++ [ -n "$_val" ] && append args "$3$_val"
++}
++
++start_service() {
++ local section="$1"
++ args=""
++
++ append_bool "$section" bidirectional "-b"
++ append_string "$section" device "-f "
++ append_string "$section" bind "-i "
++ append_string "$section" port ""
++ config_get_bool "enabled" "$section" "enabled" '1'
++ [ "$enabled" -gt 0 ] && /usr/sbin/p910nd $args
++}
++
++stop_service() {
++ local section="$1"
++ config_get port "$section" port
++
++ PID_F=/var/run/p910${port}d.pid
++ [ -f $PID_F ] && kill $(cat $PID_F)
++}
++
++start() {
++ config_load "p910nd"
++ config_foreach start_service p910nd
++}
++
++stop() {
++ config_load "p910nd"
++ config_foreach stop_service p910nd
++}
+diff --git a/feeds/packages/net/pen/Makefile b/feeds/packages/net/pen/Makefile
+new file mode 100644
+index 0000000..c05ba96
+--- /dev/null
++++ b/feeds/packages/net/pen/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pen
++PKG_VERSION:=0.29.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://siag.nu/pub/pen/
++PKG_MD5SUM:=6040c43d80d62536afb4d4b1cf40c127
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/pen
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libopenssl
++ TITLE:=Simple TCP load balancer
++ URL:=http://morestuff.siag.nu/category/pen/
++endef
++
++define Package/pen/description
++ This is pen, a load balancer for "simple" TCP based protocols
++ such as HTTP or SMTP. It allows several servers to appear as
++ one to the outside and automatically detects servers that are
++ down and distributes clients among the available servers.
++ This gives high availability and scalable performance.
++endef
++
++CONFIGURE_ARGS += \
++ --with-poll \
++ --with-ssl="$(STAGING_DIR)/usr" \
++ --without-geoip \
++
++define Package/pen/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/mergelogs $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/pen $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/penctl $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/penlog $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/penlogd $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/penctl.cgi $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/penstats $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,pen))
+diff --git a/feeds/packages/net/polipo/Makefile b/feeds/packages/net/polipo/Makefile
+new file mode 100644
+index 0000000..48c24a1
+--- /dev/null
++++ b/feeds/packages/net/polipo/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2007-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=polipo
++PKG_VERSION:=1.1.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.pps.jussieu.fr/~jch/software/files/$(PKG_NAME)/
++PKG_MD5SUM:=86939e331e656f638271f578b6e3f893
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/polipo
++ SUBMENU:=Web Servers/Proxies
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=A caching web proxy
++ URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/polipo/
++ MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
++endef
++
++define Package/polipo/description
++ Polipo is a small and fast caching web proxy (a web cache, an HTTP proxy,
++ a proxy server). While Polipo was designed to be used by one person or a
++ small group of people, there is nothing that prevents it from being used
++ by a larger group.
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ polipo
++endef
++
++define Package/polipo/conffiles
++/etc/config/polipo
++/etc/polipo/config
++endef
++
++define Package/polipo/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/polipo $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/polipo
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/config.sample $(1)/etc/polipo/config
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/polipo.config $(1)/etc/config/polipo
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/polipo.init $(1)/etc/init.d/polipo
++endef
++
++$(eval $(call BuildPackage,polipo))
+diff --git a/feeds/packages/net/polipo/files/polipo.config b/feeds/packages/net/polipo/files/polipo.config
+new file mode 100644
+index 0000000..8f85331
+--- /dev/null
++++ b/feeds/packages/net/polipo/files/polipo.config
+@@ -0,0 +1,42 @@
++# polipo daemon configuration
++config 'polipo' 'daemon'
++ # daemonise polipo (fork in background)
++ option 'daemonise' '1'
++ # where polipo will store its process pid
++ option 'pidFile' '/var/run/polipo.pid'
++
++config 'polipo' 'general'
++ option 'enabled' '1'
++ # adress on which polipo will listen, 0.0.0.0 means all addresses
++ option 'proxyAddress' '0.0.0.0'
++ # port on which polipo will listen, default is 8123
++ #option 'proxyPort' '8123'
++ # list of allowed clients to connect
++ list 'allowedClients' '192.168.1.0/24'
++ #list 'allowedClients' '127.0.0.1'
++ #list 'allowedClients' '192.168.2.1'
++ # how much RAM memory should Polipo use (in bytes).
++ option 'chunkHighMark' '1048576'
++ # enable disk cache index and serverlist of integrated polipo web interface
++ #option 'disableIndexing' '0'
++ #option 'disableServersList' '0'
++ # disable loging to syslog
++ option 'logSyslog' '0'
++ # set log file location (disabled when not set)
++ #option 'logFile' '/mnt/usbdrive/polipo/log'
++
++config 'polipo' 'cache'
++ # disk cache location, you should always use external storage device
++ # (disabled when not set)
++ #option 'diskCacheRoot' '/mnt/usbdrive-p2/polipo/cache'
++ # disk cache cleanup settings
++ #option 'diskCacheUnlinkTime' '20d'
++ #option 'diskCacheTruncateTime' '5d'
++ #option 'diskCacheTruncateSize' '3145728'
++ # set to 1 if proxy is used by multiple users
++ #option 'cacheIsShared' '1'
++
++config 'polipo' 'pmm'
++ # poor man's multiplexing semgnet size to fetch
++ #option 'pmmSize' '8192'
++
+diff --git a/feeds/packages/net/polipo/files/polipo.init b/feeds/packages/net/polipo/files/polipo.init
+new file mode 100644
+index 0000000..3cd73d4
+--- /dev/null
++++ b/feeds/packages/net/polipo/files/polipo.init
+@@ -0,0 +1,150 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008-2011 OpenWrt.org
++
++START=99
++
++CFGFILE=/var/etc/polipo.conf
++
++start() {
++ config_load 'polipo'
++
++ config_get_bool enabled "general" 'enabled' '0'
++ [ $enabled -gt 0 ] || return 1
++
++ mkdir -m 0755 -p /var/etc/
++ echo '### AUTOGENERATED CONFIGURATION' > $CFGFILE
++ echo '### DO NOT EDIT' >> $CFGFILE
++ echo '### SEE /etc/config/polipo INSTEAD' >> $CFGFILE
++ echo '' >> $CFGFILE
++
++ config_foreach polipo_config 'polipo'
++
++ # handle values that are disabled when not defined or empty
++ echo "### VALUES THAT ARE DISABLED WHEN EMPTY" >> $CFGFILE
++ polipo_atom "cache" "diskCacheRoot" '"' "1" >> $CFGFILE
++ polipo_atom "general" "logFile" '"' "1" >> $CFGFILE
++ polipo_atom "general" "localDocumentRoot" '"' "1" >> $CFGFILE
++
++ service_start /usr/sbin/polipo -c "$CFGFILE"
++}
++
++stop() {
++ service_stop /usr/sbin/polipo -c "$CFGFILE"
++}
++
++polipo_config() {
++ echo "### SECTION $1" >> $CFGFILE
++
++ string_options='authCredentials authRealm dnsNameServer forbiddenFile
++ forbiddenUrl logFacility pidFile parentAuthCredentials parentProxy
++ proxyAddress proxyName redirector socksParentProxy socksProxyType
++ socksUserName uncachableFile'
++
++ number_options='bigBufferSize chunkCriticalMark chunkHighMark chunkLowMark
++ diskCacheDirectoryPermissions diskCacheFilePermissions
++ diskCacheTruncateSize diskCacheWriteoutOnClose forbiddenRedirectCode
++ logFilePermissions logLevel maxDiskCacheEntrySize maxDiskEntries
++ maxObjectsWhenIdle maxPipelineTrain maxSideBuffering maxWriteoutWhenIdle
++ objectHashTableSize objectHighMark pmmFirstSize pmmSize proxyPort
++ publicObjectLowMark redirectorRedirectCode replyUnpipelineSize
++ serverMaxSlots serverSlots serverSlots1 maxAgeFraction'
++
++ time_options='clientTimeout diskCacheTruncateTime diskCacheUnlinkTime
++ dnsGethostbynameTtl dnsMaxTimeout dnsNegativeTtl idleTime maxAge
++ maxConnectionAge maxConnectionRequests maxExpiresAge maxNoModifiedAge
++ replyUnpipelineTime serverExpireTime serverIdleTimeout serverTimeout
++ smallRequestTime'
++
++ multistate_options='censorReferer dnsQueryIPv6 dnsUseGethostbyname
++ dontTrustVaryETag expectContinue pipelineAdditionalRequests
++ useTemporarySourceAddress relaxTransparency'
++
++ boolean_options='cacheIsShared daemonise disableConfiguration disableIndexing
++ disableLocalInterface disableProxy disableServersList disableVia
++ dontCacheCookies dontCacheRedirects logSyslog mindlesslyCacheVary
++ preciseExpiry proxyOffline scrubLogs laxHttpParser'
++
++ string_list_options='allowedClients censoredHeaders'
++
++ number_list_options='allowedPorts tunnelAllowedPorts'
++
++ for option in $string_options; do
++ polipo_atom "$1" "$option" '"' >> $CFGFILE
++ done
++
++ for option in $number_options; do
++ polipo_atom "$1" "$option" >> $CFGFILE
++ done
++
++ for option in $time_options; do
++ polipo_atom "$1" "$option" >> $CFGFILE
++ done
++
++ for option in $multistate_options; do
++ polipo_atom "$1" "$option" >> $CFGFILE
++ done
++
++ for option in $boolean_options; do
++ polipo_boolean "$1" "$option" >> $CFGFILE
++ done
++
++ for option in $string_list_options; do
++ polipo_list "$1" "$option" '"' >> $CFGFILE
++ done
++
++ for option in $number_list_options; do
++ polipo_list "$1" "$option" >> $CFGFILE
++ done
++}
++
++polipo_atom() {
++ local SECTION=$1
++ local OPTION=$2
++ local QUOTE=$3
++ local EMPTY_DISABLED=${4:-0}
++
++ config_get _value "$SECTION" "$OPTION"
++ [ -n "$_value" -o "$EMPTY_DISABLED" -eq "1" ] && {
++ echo "$OPTION = ${QUOTE}${_value}${QUOTE}"
++ }
++}
++
++polipo_boolean() {
++ local SECTION=$1
++ local OPTION=$2
++
++ config_get_bool _value "$SECTION" "$OPTION"
++ [ -n "$_value" ] && {
++ [ "$_value" -eq "1" ] && _value="true" || _value="false"
++ echo "$OPTION = $_value"
++ }
++}
++
++polipo_list() {
++ local SECTION=$1
++ local OPTION=$2
++ local QUOTE=$3
++
++ config_get _value "$SECTION" "$OPTION"
++
++ [ "$SECTION" = general ] && [ "$OPTION" = allowedClients ] && {
++ case "$_value" in
++ *127.0.0.1*) : ;;
++ *) _value="127.0.0.1 $_value" ;;
++ esac
++ }
++
++ [ -n "$_value" ] && {
++ echo -n "$OPTION = "
++
++ local FIRST=1
++ for entry in $_value; do
++ [ "$FIRST" -ne "1" ] && echo -n ", " || FIRST=0
++
++ echo -n "${QUOTE}${entry}${QUOTE}"
++ done
++
++ echo ''
++ }
++}
++
+diff --git a/feeds/packages/net/portmap/Makefile b/feeds/packages/net/portmap/Makefile
+new file mode 100644
+index 0000000..03969f7
+--- /dev/null
++++ b/feeds/packages/net/portmap/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2006-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=portmap
++PKG_VERSION:=6.0
++PKG_RELEASE:=4
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=http://neil.brown.name/portmap/
++PKG_MD5SUM:=ac108ab68bf0f34477f8317791aaf1ff
++
++PKG_LICENSE:=BSD-4c
++PKG_LICENSE_FILES:=portmap.man
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)_$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/portmap
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libwrap $(LIBRPC_DEPENDS)
++ TITLE:=The RPC Portmapper
++ URL:=http://neil.brown.name/portmap/
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++ USERID:=rpc=65533:rpc=65533
++endef
++
++define Package/portmap/description
++ Portmap is a server that converts RPC (Remote Procedure Call) program
++ numbers into DARPA protocol port numbers.
++endef
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS) -DHOSTS_ACCESS -DFACILITY=LOG_DAEMON -DIGNORE_SIGCHLD" \
++ RPCUSER="rpc" \
++ LDLIBS="$(TARGET_LDFLAGS) -lwrap $(LIBRPC)" \
++ all
++
++define Package/portmap/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/portmap $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/portmap.init $(1)/etc/init.d/portmap
++endef
++
++$(eval $(call BuildPackage,portmap))
+diff --git a/feeds/packages/net/portmap/files/portmap.init b/feeds/packages/net/portmap/files/portmap.init
+new file mode 100644
+index 0000000..621c313
+--- /dev/null
++++ b/feeds/packages/net/portmap/files/portmap.init
+@@ -0,0 +1,13 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=19
++STOP=19
++
++USE_PROCD=1
++
++start_service() {
++ procd_open_instance
++ procd_set_param command /usr/sbin/portmap -f
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/portmap/patches/101-no_pie.patch b/feeds/packages/net/portmap/patches/101-no_pie.patch
+new file mode 100644
+index 0000000..6cbdece
+--- /dev/null
++++ b/feeds/packages/net/portmap/patches/101-no_pie.patch
+@@ -0,0 +1,12 @@
++diff -ur portmap_6.0.org/Makefile portmap_6.0/Makefile
++--- portmap_6.0.org/Makefile 2008-04-19 22:44:35.000000000 +0200
+++++ portmap_6.0/Makefile 2008-04-19 00:02:01.000000000 +0200
++@@ -127,7 +127,7 @@
++ CPPFLAGS += $(HOSTS_ACCESS)
++ portmap: CFLAGS += -fpie
++ portmap: LDLIBS += $(WRAP_LIB)
++-portmap: LDFLAGS += -pie
+++#portmap: LDFLAGS += -pie
++ portmap: portmap.o pmap_check.o from_local.o
++
++ from_local: CPPFLAGS += -DTEST
+diff --git a/feeds/packages/net/pppossh/Makefile b/feeds/packages/net/pppossh/Makefile
+new file mode 100644
+index 0000000..a4a048f
+--- /dev/null
++++ b/feeds/packages/net/pppossh/Makefile
+@@ -0,0 +1,37 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pppossh
++PKG_RELEASE:=2
++PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
++PKG_LICENSE:=GPLv2
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/pppossh
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=PPPoSSH (Point-to-Point Protocol over SSH)
++ DEPENDS:=+ppp +resolveip @(PACKAGE_dropbear||PACKAGE_openssh-client)
++endef
++
++define Package/pppossh/description
++This package adds protocol support for PPP over SSH. The protocol name is
++'pppossh' as in netifd interface config option 'proto'.
++endef
++
++define Build/Compile
++endef
++
++define Package/pppossh/install
++ $(INSTALL_DIR) $(1)/lib/netifd/proto
++ $(INSTALL_BIN) ./files/pppossh.sh $(1)/lib/netifd/proto
++endef
++
++$(eval $(call BuildPackage,pppossh))
+diff --git a/feeds/packages/net/pppossh/README.md b/feeds/packages/net/pppossh/README.md
+new file mode 100644
+index 0000000..2f44f77
+--- /dev/null
++++ b/feeds/packages/net/pppossh/README.md
+@@ -0,0 +1,68 @@
++This package will add the so-called `pppossh` protocol support to OpenWrt. The idea is mainly from [`pvpn` project](https://github.com/halhen/pvpn) (poor man's VPN over SSH).
++
++PPPoSSH is generally not considered a network setup for production use mainly due to the TCP-over-TCP styles of traffic transport, but it can be quite handy for personal use. And with what's already in OpenWrt, it is really easy and takes little extra space to configure it up running.
++
++## Prerequisites and dependency.
++
++`pppossh` depends on either `dropbear` or `openssh-client`; `dropbear` is normally enabled in OpenWrt by default.
++
++The following requirements need to be fulfilled for it to work.
++
++- A SSH account on the remote machine with `CAP_NET_ADMIN` capability is required.
++- Public key authentication must be enabled and setup properly.
++
++ Public key of the one generated automatially by dropbear can be induced by the following command. But you can always use your own (dropbear can work with OpenSSH public key).
++
++ dropbearkey -y -f /etc/dropbear/dropbear_rsa_host_key
++
++- SSH server's fingerprint has to be present in `~/.ssh/known_hosts` for the authentication to proceed in an unattended way.
++
++ Manually logging in at least once to the remote server from OpenWrt should do this for you.
++
++## How to use it.
++
++The protocol name to use in `/etc/config/network` is `pppossh`. Options are as described below.
++
++- `server`, SSH server name
++- `port`, SSH server port (defaults to `22`).
++- `sshuser`, SSH login username
++- `identity`, list of client private key files. `~/.ssh/id_{rsa,dsa}` will
++ be used if no identity file was specified and at least one of them must be
++ valid for the public key authentication to proceed.
++- `ipaddr`, local ip address to be assigned.
++- `peeraddr`, peer ip address to be assigned.
++- `ssh_options`, extra options for the ssh client.
++- `use_hostdep`, set it to `0` to disable the use of `proto_add_host_dependency`. This is mainly for the case that the appropriate route to `server` is not registered to `netifd` and thus causing a incorrect route being setup.
++
++## Tips
++
++An `uci batch` command template for your reference. Modify it to suite your situation.
++
++ uci batch <<EOF
++ delete network.fs
++ set network.fs=interface
++ set network.fs.proto=pppossh
++ set network.fs.sshuser=root
++ set network.fs.server=ssh.example.cn
++ set network.fs.port=30244
++ add_list network.fs.identity=/etc/dropbear/dropbear_rsa_host_key
++ set network.fs.ipaddr=192.168.177.2
++ set network.fs.peeraddr=192.168.177.1
++ commit
++ EOF
++
++Allow forward and NAT on the remote side (`ppp0` is the peer interface on the remote side. `eth0` is the interface for Internet access).
++
++ sysctl -w net.ipv4.ip_forward=1
++ iptables -t filter -A FORWARD -i ppp0 -j ACCEPT
++ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
++
++It's possible that pppd may output protocol negotiation incompatibilities issues to syslog, such as something like the following which did not hurt the connectivity and was annoying only because we thought it can do better.
++
++ Sun Oct 25 09:45:14 2015 daemon.err pppd[22188]: Received bad configure-rej: 12 06 00 00 00 00
++
++To debug such problems, we can try adding `option pppd_optinos debug` to the interface config. In the above case, it's a LCP CCP configure rej (the CCP options struct is exactly 6 octets in size as indicated in source code `pppd/ccp.h`) and since the internet fee is not charged on the bytes transfered, I will just use `noccp` to disable the negotiation altogether.
++
++Also to optimize bulk transfer performance, you can try tweaking the ciphers. OpenSSH client does not support `none` cipher by default and you have to patch and install it for by yourself. Another option is to try ciphers like `arcfour` and `blowfish-cbc`. In my case, `arcfour` has the best throughput.
++
++ option ssh_options '-o "Ciphers arcfour"'
+diff --git a/feeds/packages/net/pppossh/files/pppossh.sh b/feeds/packages/net/pppossh/files/pppossh.sh
+new file mode 100644
+index 0000000..421980d
+--- /dev/null
++++ b/feeds/packages/net/pppossh/files/pppossh.sh
+@@ -0,0 +1,72 @@
++#!/bin/sh
++
++SSH=/usr/bin/ssh
++[ -x "$SSH" ] || {
++ echo "Cannot find executable $SSH." >&2
++ exit 1
++}
++
++. /lib/functions.sh
++. ../netifd-proto.sh
++init_proto "$@"
++
++INCLUDE_ONLY=1
++
++. ./ppp.sh
++
++proto_pppossh_init_config() {
++ ppp_generic_init_config
++ config_add_string server sshuser ipaddr peeraddr ssh_options
++ config_add_array 'identity:list(string)'
++ config_add_int port use_hostdep
++ available=1
++ no_device=1
++}
++
++proto_pppossh_setup() {
++ local config="$1"
++ local iface="$2"
++ local user="$(id -nu)"
++ local home=$(sh -c "echo ~$user")
++ local server port sshuser ipaddr peeraddr ssh_options identity use_hostdep
++ local ip fn errmsg opts pty
++
++ json_get_vars port sshuser ipaddr peeraddr ssh_options use_hostdep
++ json_get_var server server && {
++ [ -z "$use_hostdep" ] && use_hostdep=1
++ for ip in $(resolveip -t 5 "$server"); do
++ if [ "$use_hostdep" -gt 0 ]; then
++ ( proto_add_host_dependency "$config" "$ip" )
++ else
++ break
++ fi
++ done
++ }
++ [ -n "$ip" ] || errmsg="${errmsg}Could not resolve $server\n"
++ [ -n "$sshuser" ] || errmsg="${errmsg}Missing sshuser option\n"
++
++ json_get_values identity identity
++ [ -z "$identity" ] && identity="$home/.ssh/id_rsa $home/.ssh/id_dsa"
++ for fn in $identity; do
++ [ -f "$fn" ] && opts="$opts -i $fn"
++ done
++ [ -n "$opts" ] || errmsg="${errmsg}Cannot find valid identity file\n"
++
++ [ -n "$errmsg" ] && {
++ echo -ne "$errmsg" >&2
++ proto_setup_failed "$config"
++ exit 1
++ }
++ opts="$opts ${port:+-p $port}"
++ opts="$opts ${ssh_options}"
++ opts="$opts $sshuser@$server"
++ pty="exec env 'HOME=$home' $SSH $opts pppd nodetach notty noauth"
++
++ ppp_generic_setup "$config" noauth pty "$pty" "$ipaddr:$peeraddr"
++}
++
++proto_pppossh_teardown() {
++ ppp_generic_teardown "$@"
++}
++
++add_protocol pppossh
+diff --git a/feeds/packages/net/pptpd/Makefile b/feeds/packages/net/pptpd/Makefile
+new file mode 100644
+index 0000000..d17d196
+--- /dev/null
++++ b/feeds/packages/net/pptpd/Makefile
+@@ -0,0 +1,69 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pptpd
++PKG_VERSION:=1.4.0
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/poptop
++PKG_MD5SUM:=36f9f45c6ffa92bc3b6e24ae2d053505
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/pptpd
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+kmod-ppp +kmod-gre +kmod-mppe +ppp
++ TITLE:=PopTop pptp server
++ URL:=http://poptop.sourceforge.net/
++ SUBMENU:=VPN
++endef
++
++CONFIGURE_ARGS += \
++ --enable-bcrelay \
++
++CONFIGURE_VARS += \
++ ac_cv_header_libintl_h=no \
++
++MAKE_FLAGS += \
++ COPTS="$(TARGET_CFLAGS)" \
++ INSTALL="install" \
++
++define Package/pptpd/conffiles
++/etc/pptpd.conf
++/etc/ppp/options.pptpd
++/etc/config/pptpd
++endef
++
++define Package/pptpd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/sbin/bcrelay \
++ $(PKG_INSTALL_DIR)/usr/sbin/pptpctrl \
++ $(PKG_INSTALL_DIR)/usr/sbin/pptpd \
++ $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/lib/pptpd
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pptpd/* $(1)/usr/lib/pptpd/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) ./files/pptpd.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/pptpd.init $(1)/etc/init.d/pptpd
++ $(INSTALL_DIR) $(1)/etc/ppp
++ $(INSTALL_DATA) ./files/options.pptpd $(1)/etc/ppp/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/pptpd.config $(1)/etc/config/pptpd
++endef
++
++$(eval $(call BuildPackage,pptpd))
+diff --git a/feeds/packages/net/pptpd/files/options.pptpd b/feeds/packages/net/pptpd/files/options.pptpd
+new file mode 100644
+index 0000000..f73eeea
+--- /dev/null
++++ b/feeds/packages/net/pptpd/files/options.pptpd
+@@ -0,0 +1,22 @@
++#debug
++#logfile /tmp/pptp-server.log
++auth
++name "pptp-server"
++lcp-echo-failure 3
++lcp-echo-interval 60
++default-asyncmap
++mtu 1482
++mru 1482
++nobsdcomp
++nodeflate
++#noproxyarp
++#nomppc
++mppe required,no40,no56,stateless
++require-mschap-v2
++refuse-chap
++refuse-mschap
++refuse-eap
++refuse-pap
++#ms-dns 172.16.1.1
++#plugin radius.so
++#radius-config-file /etc/radius.conf
+diff --git a/feeds/packages/net/pptpd/files/pptpd.conf b/feeds/packages/net/pptpd/files/pptpd.conf
+new file mode 100644
+index 0000000..354745f
+--- /dev/null
++++ b/feeds/packages/net/pptpd/files/pptpd.conf
+@@ -0,0 +1,5 @@
++#debug
++option /etc/ppp/options.pptpd
++speed 115200
++stimeout 10
++#localip & remoteip are not needed, ip management is done by pppd
+diff --git a/feeds/packages/net/pptpd/files/pptpd.config b/feeds/packages/net/pptpd/files/pptpd.config
+new file mode 100644
+index 0000000..b2d5df5
+--- /dev/null
++++ b/feeds/packages/net/pptpd/files/pptpd.config
+@@ -0,0 +1,8 @@
++config service 'pptpd'
++ option 'enabled' '0'
++ option 'localip' '192.168.0.1'
++ option 'remoteip' '192.168.0.20-30'
++
++config 'login'
++ option 'username' 'youruser'
++ option 'password' 'yourpass'
+diff --git a/feeds/packages/net/pptpd/files/pptpd.init b/feeds/packages/net/pptpd/files/pptpd.init
+new file mode 100644
+index 0000000..d1c50fd
+--- /dev/null
++++ b/feeds/packages/net/pptpd/files/pptpd.init
+@@ -0,0 +1,63 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=60
++USE_PROCD=1
++
++BIN=/usr/sbin/pptpd
++CONFIG=/var/etc/pptpd.conf
++CHAP_SECRETS=/var/etc/chap-secrets
++
++validate_login_section() {
++ uci_validate_section pptpd login "${1}" \
++ 'username:string' \
++ 'password:string'
++}
++
++validate_pptpd_section() {
++ uci_validate_section pptpd service "${1}" \
++ 'enabled:uinteger' \
++ 'localip:string' \
++ 'remoteip:string'
++}
++
++setup_login() {
++ validate_login_section "${1}" || {
++ echo "validation failed"
++ return 1
++ }
++
++ [ -n "${username}" ] || return 0
++ [ -n "${password}" ] || return 0
++
++ echo "${username} pptp-server ${password} *" >> $CHAP_SECRETS
++}
++
++setup_config() {
++ validate_pptpd_section "${1}" || {
++ echo "validation failed"
++ return 1
++ }
++
++ [ "$enabled" -eq 0 ] && return 1
++
++ mkdir -p /var/etc
++ cp /etc/pptpd.conf $CONFIG
++
++ [ -n "$localip" ] && echo "localip $localip" >> $CONFIG
++ [ -n "$remoteip" ] && echo "remoteip $remoteip" >> $CONFIG
++
++ return 0
++}
++
++start_service() {
++ config_load pptpd
++ setup_config pptpd || return
++ config_foreach setup_login login
++
++ ln -sfn $CHAP_SECRETS /etc/ppp/chap-secrets
++
++ procd_open_instance
++ procd_set_param command $BIN -c $CONFIG
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/pptpd/patches/001-bad_pqueue_debug.patch b/feeds/packages/net/pptpd/patches/001-bad_pqueue_debug.patch
+new file mode 100644
+index 0000000..50d5252
+--- /dev/null
++++ b/feeds/packages/net/pptpd/patches/001-bad_pqueue_debug.patch
+@@ -0,0 +1,18 @@
++--- a/pqueue.c
+++++ b/pqueue.c
++@@ -7,13 +7,11 @@
++ #include "pqueue.h"
++
++ #ifdef DEBUG_PQUEUE
++-#define DEBUG_ON 1
+++#define DEBUG_CMD(_a) { _a }
++ #else
++-#define DEBUG_ON 0
+++#define DEBUG_CMD(_a)
++ #endif
++
++-#define DEBUG_CMD(_a) if (DEBUG_ON) { _a }
++-
++ #define MIN_CAPACITY 128 /* min allocated buffer for a packet */
++
++ static int pqueue_alloc (int seq, unsigned char *packet, int packlen, pqueue_t **new);
+diff --git a/feeds/packages/net/pptpd/patches/002-makefile_fix.patch b/feeds/packages/net/pptpd/patches/002-makefile_fix.patch
+new file mode 100644
+index 0000000..74e3335
+--- /dev/null
++++ b/feeds/packages/net/pptpd/patches/002-makefile_fix.patch
+@@ -0,0 +1,11 @@
++--- a/plugins/Makefile
+++++ b/plugins/Makefile
++@@ -18,7 +18,7 @@ all: $(PLUGINS)
++ %.so: %.c
++ $(CC) -o $@ $(LDFLAGS) $(CFLAGS) $^ $(LDADD)
++
++-LIBDIR ?= $(DESTDIR)$(prefix)/lib/pptpd
+++LIBDIR = $(DESTDIR)$(prefix)/lib/pptpd
++
++ install: $(PLUGINS)
++ $(INSTALL) -d $(LIBDIR)
+diff --git a/feeds/packages/net/pptpd/patches/003-opt_flags.patch b/feeds/packages/net/pptpd/patches/003-opt_flags.patch
+new file mode 100644
+index 0000000..cc136c5
+--- /dev/null
++++ b/feeds/packages/net/pptpd/patches/003-opt_flags.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -153,7 +153,7 @@ AUTOMAKE = @AUTOMAKE@
++ AWK = @AWK@
++ CC = @CC@
++ CCDEPMODE = @CCDEPMODE@
++-CFLAGS = -O2 -fno-builtin -Wall -DSBINDIR='"$(sbindir)"'
+++CFLAGS = $(COPTS) -fno-builtin -Wall -DSBINDIR='"$(sbindir)"'
++ CPP = @CPP@
++ CPPFLAGS = @CPPFLAGS@
++ CYGPATH_W = @CYGPATH_W@
+diff --git a/feeds/packages/net/pptpd/patches/100-musl-compat.patch b/feeds/packages/net/pptpd/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..6ce625a
+--- /dev/null
++++ b/feeds/packages/net/pptpd/patches/100-musl-compat.patch
+@@ -0,0 +1,38 @@
++--- a/bcrelay.c
+++++ b/bcrelay.c
++@@ -667,7 +667,7 @@ static void mainloop(int argc, char **ar
++ * there is no need to concern about the physical/link layer header because it is
++ * filled in automatically (based on the contents of sa).
++ */
++- if ((nrsent = sendto(cur_ifsnr[j].sock_nr, ipp_p, rlen, MSG_DONTWAIT|MSG_TRYHARD, (struct sockaddr *)&sa, salen)) < 0)
+++ if ((nrsent = sendto(cur_ifsnr[j].sock_nr, ipp_p, rlen, MSG_DONTWAIT|MSG_DONTROUTE, (struct sockaddr *)&sa, salen)) < 0)
++ {
++ if (errno == ENETDOWN) {
++ syslog(LOG_NOTICE, "ignored ENETDOWN from sendto(), a network interface was going down?");
++--- a/compat.c
+++++ b/compat.c
++@@ -11,10 +11,10 @@
++ #include "compat.h"
++ #include "our_syslog.h"
++
++-#ifndef HAVE_STRLCPY
++ #include <string.h>
++ #include <stdio.h>
++
+++#ifndef HAVE_STRLCPY
++ void strlcpy(char *dst, const char *src, size_t size)
++ {
++ strncpy(dst, src, size - 1);
++--- /dev/null
+++++ b/net/ppp_defs.h
++@@ -0,0 +1,10 @@
+++#ifndef _NET_PPP_DEFS_H
+++#define _NET_PPP_DEFS_H 1
+++
+++#define __need_time_t
+++#include <time.h>
+++
+++#include <asm/types.h>
+++#include <linux/ppp_defs.h>
+++
+++#endif /* net/ppp_defs.h */
+diff --git a/feeds/packages/net/privoxy/Makefile b/feeds/packages/net/privoxy/Makefile
+new file mode 100644
+index 0000000..76f5615
+--- /dev/null
++++ b/feeds/packages/net/privoxy/Makefile
+@@ -0,0 +1,109 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=privoxy
++PKG_VERSION:=3.0.23
++PKG_RELEASE:=3
++
++PKG_SOURCE:=privoxy-$(PKG_VERSION)-stable-src.tar.gz
++PKG_SOURCE_URL:=@SF/ijbswa
++PKG_MD5SUM:=bbe47d5ff1a54d9f9fc93a160532697f
++PKG_BUILD_DIR:=$(BUILD_DIR)/privoxy-$(PKG_VERSION)-stable
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_MAINTAINER:=christian.schoenebeck@gmail.com
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/$(PKG_NAME)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Web Servers/Proxies
++ DEPENDS:=+libpcre +libpthread +zlib
++ TITLE:=Privoxy WEB Proxy
++ URL:=http://www.privoxy.org/
++ USERID:=privoxy=8118:privoxy=8118
++endef
++
++# shown in LuCI package description
++define Package/$(PKG_NAME)/description
++$(TITLE) - Homepage: www.privoxy.org
++endef
++
++# shown in make menuconfig <Help>
++define Package/$(PKG_NAME)/config
++help
++ Privoxy is a web proxy with advanced filtering capabilities for protecting
++ privacy, modifying web page content, managing cookies, controlling access,
++ and removing ads, banners, pop-ups and other obnoxious Internet junk.
++ Privoxy has a very flexible configuration and can be customized to suit
++ individual needs and tastes.
++ Privoxy has application for both stand-alone systems and multi-user networks.
++
++ Run as : $(USERID)
++ Version: $(PKG_VERSION)-$(PKG_RELEASE)
++ Home : $(URL)
++
++ $(PKG_MAINTAINER)
++endef
++
++CONFIGURE_ARGS += \
++ --sysconfdir=/etc/privoxy
++
++# needed otherwise errors during compile
++MAKE_FLAGS:=
++
++define Package/$(PKG_NAME)/conffiles
++/etc/config/privoxy
++/etc/privoxy/user.action
++/etc/privoxy/user.filter
++/etc/privoxy/user.trust
++endef
++
++define Package/$(PKG_NAME)/preinst
++ #!/bin/sh
++ [ -n "$${IPKG_INSTROOT}" ] && exit 0 # if run within buildroot exit
++
++ # stop service if PKG_UPGRADE
++ [ "$${PKG_UPGRADE}" = "1" ] && /etc/init.d/privoxy stop >/dev/null 2>&1
++
++ exit 0 # supress errors from stop command
++endef
++
++define Package/$(PKG_NAME)/install
++ if [ -f $(PKG_INSTALL_DIR)/etc/privoxy/trust ]; then \
++ mv -f $(PKG_INSTALL_DIR)/etc/privoxy/trust $(PKG_INSTALL_DIR)/etc/privoxy/user.trust; \
++ fi
++ if [ -f $(PKG_INSTALL_DIR)/etc/privoxy/config ]; then \
++ rm -f $(PKG_INSTALL_DIR)/etc/privoxy/config; \
++ fi
++
++ $(INSTALL_DIR) \
++ $(1)/usr/sbin\
++ $(1)/etc/privoxy/templates
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/privoxy $(1)/usr/sbin/
++ find $(PKG_INSTALL_DIR)/etc/privoxy/templates -maxdepth 1 -type f \
++ -exec $(INSTALL_DATA) -t $(1)/etc/privoxy/templates {} \;
++ find $(PKG_INSTALL_DIR)/etc/privoxy -maxdepth 1 -type f \
++ -exec install -m0664 -t $(1)/etc/privoxy {} \;
++
++ $(INSTALL_DIR) \
++ $(1)/etc/init.d \
++ $(1)/etc/hotplug.d/iface \
++ $(1)/etc/config
++ $(INSTALL_BIN) ./files/privoxy.init $(1)/etc/init.d/privoxy
++ $(INSTALL_BIN) ./files/privoxy.hotplug $(1)/etc/hotplug.d/iface/80-privoxy
++ $(INSTALL_CONF) ./files/privoxy.config $(1)/etc/config/privoxy
++endef
++
++$(eval $(call BuildPackage,$(PKG_NAME)))
+diff --git a/feeds/packages/net/privoxy/files/privoxy.config b/feeds/packages/net/privoxy/files/privoxy.config
+new file mode 100644
+index 0000000..95b6cf1
+--- /dev/null
++++ b/feeds/packages/net/privoxy/files/privoxy.config
+@@ -0,0 +1,44 @@
++# this file support all available configuration options of Privoxy web-proxy
++# the scripts move all options to the final privoxy readable configuration file
++#
++# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
++# !!! privoxy uses "-" in option names but uci only support "_" !!!
++# !!! privoxy "listen-address" must be uci "listen_address" !!!
++# !!! !!!
++# !!! if you add entries please use !!!
++# !!! option for options with one parameter (option confdir) !!!
++# !!! list for options with multiple parameters (list listen_address) !!!
++# !!! !!!
++# !!! special handling for debug option !!!
++# !!! privoxy option "debug 1024" must be uci option debug_1024 '1' !!!
++# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
++#
++config privoxy 'privoxy'
++ option confdir '/etc/privoxy'
++ option logdir '/var/log'
++ option logfile 'privoxy.log'
++ list filterfile 'default.filter'
++# list filterfile 'user.filter'
++ list actionsfile 'match-all.action'
++ list actionsfile 'default.action'
++# list actionsfile 'user.action'
++# list listen_address '127.0.0.1:8118'
++ list listen_address '192.168.1.1:8118'
++ option toggle '1'
++ option enable_remote_toggle '1'
++ option enable_remote_http_toggle '0'
++ option enable_edit_actions '1'
++ option enforce_blocks '0'
++ option buffer_limit '4096'
++ option forwarded_connect_retries '0'
++ option accept_intercepted_requests '0'
++ option allow_cgi_request_crunching '0'
++ option split_large_forms '0'
++ option keep_alive_timeout '300'
++ option socket_timeout '300'
++ list permit_access '192.168.1.0/24'
++ option debug_1 '0'
++ option debug_512 '1'
++ option debug_1024 '0'
++ option debug_4096 '1'
++ option debug_8192 '1'
+diff --git a/feeds/packages/net/privoxy/files/privoxy.hotplug b/feeds/packages/net/privoxy/files/privoxy.hotplug
+new file mode 100644
+index 0000000..bd66801
+--- /dev/null
++++ b/feeds/packages/net/privoxy/files/privoxy.hotplug
+@@ -0,0 +1,18 @@
++#!/bin/sh
++
++# only (re-)start on ifup
++[ "$ACTION" = "ifup" ] || exit 0
++
++PIDFILE=/var/run/privoxy.pid
++
++_PID=$(cat $PIDFILE 2>/dev/null)
++kill -1 $_PID 2>/dev/null
++if [ $? -eq 0 ]; then
++ # only restart if already running
++ logger -p daemon.info -t "privoxy[$_PID]" \
++ "Restart request due to '$ACTION' of interface '$INTERFACE'"
++ /etc/init.d/privoxy restart
++else
++ # only start if enabled
++ /etc/init.d/privoxy enabled && /etc/init.d/privoxy start
++fi
+diff --git a/feeds/packages/net/privoxy/files/privoxy.init b/feeds/packages/net/privoxy/files/privoxy.init
+new file mode 100644
+index 0000000..b8d978f
+--- /dev/null
++++ b/feeds/packages/net/privoxy/files/privoxy.init
+@@ -0,0 +1,150 @@
++#!/bin/sh /etc/rc.common
++
++START=80
++STOP=20
++
++PIDFILE=/var/run/privoxy.pid
++CFGFILE=/var/etc/privoxy.conf
++CFGTEMP=/var/etc/privoxy.conf.tmp
++
++_uci2conf() {
++ # redefined callback for options when calling config_load
++ option_cb()
++ {
++ # $1 name of variable
++ # $2 value
++ local __OPT="$1"
++ local __VAL="$2"
++ case $__OPT in
++ confdir|templdir|temporary_directory|logdir|logfile)
++ # needs to be handled separately because we need to set permissions
++ # AND needs to be defined first because of a BUG inside privoxy
++ # require directories to be defined first inside config
++ ;;
++ debug_*)
++ [ $__VAL -eq 0 ] && return # not set ignore
++ echo -e "debug\t$(echo $__OPT | sed -e 's#debug_##g')" >> $CFGTEMP ;;
++ *)
++ # detect list options (LENGTH) and ignore
++ echo $__OPT | grep -i "_LENGTH" >/dev/null 2>&1 && return
++ # detect list options (ITEM) and ignore
++ echo $__OPT | grep -i "_ITEM" >/dev/null 2>&1 && __OPT=$(echo $__OPT | sed -e "s#_ITEM.##g")
++ # uci only accept "_" but we need "-"
++ local __OPT=$(echo $__OPT | sed -e "s#_#-#g")
++ # write to config
++ echo -e "$__OPT\t$__VAL" >> $CFGTEMP
++ ;;
++ esac
++ }
++
++ # temporary config file
++ # privoxy need read access
++ mkdir -m0755 -p /var/etc
++ echo "" > $CFGTEMP
++ chmod 644 $CFGTEMP
++ chgrp privoxy $CFGTEMP
++
++ echo '### AUTO-GENERATED CONFIGURATION' >> $CFGTEMP
++ echo '### USED BY PRIVOXY' >> $CFGTEMP
++ echo '### DO NOT EDIT' >> $CFGTEMP
++ echo '### SEE /etc/config/privoxy INSTEAD' >> $CFGTEMP
++ echo '' >> $CFGTEMP
++
++ # confdir
++ # privoxy needs read access (possibly write access)
++ _CONFDIR=$(uci -q get privoxy.privoxy.confdir) || _CONFDIR="/etc/privoxy"
++ chmod 755 $_CONFDIR
++ chmod 664 $_CONFDIR/*
++ chgrp privoxy $_CONFDIR $_CONFDIR/*
++ echo -e "confdir\t$_CONFDIR" >> $CFGTEMP
++
++ # templdir
++ # privoxy need read access
++ _TEMPLDIR=$(uci -q get privoxy.privoxy.templdir) # no default needed
++ if [ -z "$_TEMPLDIR" ]; then
++ chmod 755 $_CONFDIR/templates
++ chmod 644 $_CONFDIR/templates/*
++ chgrp privoxy $_CONFDIR/templates $_CONFDIR/templates/*
++ else
++ chmod 755 $_TEMPLDIR
++ chmod 644 $_TEMPLDIR/*
++ chgrp privoxy $_TEMPLDIR $_TEMPLDIR/*
++ echo -e "templdir\t$_TEMPLDIR" >> $CFGTEMP
++ fi
++
++ # logdir and logfile
++ # privoxy needs read/write access
++ _LOGDIR=$(uci -q get privoxy.privoxy.logdir) || _LOGDIR="/var/log"
++ _LOGFILE=$(uci -q get privoxy.privoxy.logfile) || _LOGFILE="privoxy.log"
++ mkdir -m0755 -p $_LOGDIR
++ touch $_LOGDIR/$_LOGFILE
++ chmod 664 $_LOGDIR/$_LOGFILE
++ chown privoxy:privoxy $_LOGDIR/$_LOGFILE
++ echo -e "logdir\t$_LOGDIR" >> $CFGTEMP
++ echo -e "logfile\t$_LOGFILE" >> $CFGTEMP
++
++ # temporary-directory
++ # privoxy needs read/write access
++ _TMP_DIR=$(uci -q get privoxy.privoxy.temporary_directory) # no default needed
++ if [ -n "$_TMP_DIR" ]; then
++ mkdir -m0750 -p $_TMP_DIR
++ chown privoxy:privoxy $_TMP_DIR
++ echo -e "temporary-directory\t$_TMP_DIR" >> $CFGTEMP
++ fi
++
++ config_load privoxy # calling above option_cb() and write the rest into $CFGTEMP
++
++ # move temp to final privoxy readable configuration
++ mv -f $CFGTEMP $CFGFILE
++ return 0
++}
++
++boot() {
++ return 0 # will be started by "iface" hotplug events
++}
++
++start() {
++ # if already running do nothing
++ local _PID=$(cat $PIDFILE 2>/dev/null)
++ kill -1 $_PID 2>/dev/null && return 0
++
++ _uci2conf
++ /usr/sbin/privoxy --pidfile $PIDFILE --user privoxy.privoxy $CFGFILE
++
++ # verify startup
++ _PID=$(cat $PIDFILE 2>/dev/null)
++ kill -1 $_PID 2>/dev/null
++ local _ERR=$?
++ [ $_ERR -eq 0 ] \
++ && logger -p daemon.notice -t "privoxy[$_PID]" "Started successfully"\
++ || logger -p daemon.warn -t "privoxy[-----]" "Failed to start"
++ return $_ERR
++}
++
++reload() {
++ # reload is also used by luci-app-privoxy
++ local _PID=$(cat $PIDFILE 2>/dev/null)
++ kill -1 $_PID 2>/dev/null
++ if [ $? -eq 0 ]; then
++ # only restart if already running
++ restart
++ else
++ # only start if enabled
++ enabled && start
++ fi
++ return 0
++}
++
++stop() {
++ local _PID=$(cat $PIDFILE 2>/dev/null)
++ kill -15 $_PID 2>/dev/null
++ sleep 1 # give time to shutdown
++ local _tmp=$(pgrep privoxy | tr "\n" " ")
++ if [ -z "$_tmp" ]; then
++ logger -p daemon.notice -t "privoxy[$_PID]" "Shutdown successfully"
++ else
++ kill -9 $_tmp # Normally never come here
++ logger -p daemon.warn -t "privoxy[-----]" "Shutdown forced by KILL"
++ fi
++ return 0
++}
+diff --git a/feeds/packages/net/prosody/Makefile b/feeds/packages/net/prosody/Makefile
+new file mode 100644
+index 0000000..4ff6d38
+--- /dev/null
++++ b/feeds/packages/net/prosody/Makefile
+@@ -0,0 +1,124 @@
++#
++# Copyright (C) 2009-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=prosody
++PKG_VERSION:=0.9.8
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://prosody.im/downloads/source
++PKG_MD5SUM:=5144cd832a1860443e21e336dc560ee7
++PKG_MAINTAINER:=Thomas Heil <heil@terminal-consulting.de>
++PKG_LICENSE:=MIT/X11
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/prosody
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Instant Messaging
++ DEPENDS:=+luafilesystem +libidn +luaexpat +luasec +libopenssl +libidn +liblua
++ TITLE:=XMPP server
++ URL:=http://prosody.im/
++ USERID:=prosody=54:prosody=54
++endef
++
++define Package/prosody/description
++ Prosody is an exciting new server for Jabber/XMPP
++ written in Lua. It aims to be easy to use, and light
++ on resources
++endef
++
++define Package/prosody/conffiles
++/etc/prosody/prosody.cfg.lua
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++TARGET_LDFLAGS += -L$(STAGING_DIR)/usr/lib
++
++
++define Build/Configure
++ # this is *NOT* GNU autoconf stuff
++ (cd $(PKG_BUILD_DIR); ./configure \
++ --prefix=/usr \
++ --with-lua="$(STAGING_DIR)/host/bin" \
++ --with-lua-include="$(STAGING_DIR)/usr/include" \
++ --with-lua-lib="$(STAGING_DIR)/usr/lib" \
++ --cflags="$(TARGET_CFLAGS)" \
++ --ldflags="$(TARGET_LDFLAGS) -llua -lm -ldl -shared" \
++ --c-compiler="$(CC)" \
++ --linker="$(LD)" \
++ --datadir="/etc/prosody/data" \
++ )
++endef
++# LDFLAGS="$(TARGET_LDFLAGS) -llua -lm -ldl" \
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS) -std=gnu99" \
++ PREFIX="/usr" \
++
++define Package/prosody/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/prosody.init $(1)/etc/init.d/prosody
++ $(INSTALL_DIR) $(1)/etc/prosody
++ #$(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/prosody/prosody.cfg.lua $(1)/etc/prosody/
++ $(INSTALL_CONF) ./files/prosody.cfg.lua $(1)/etc/prosody/
++ $(INSTALL_DIR) $(1)/etc/prosody/certs
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/prosody/certs/localhost.{crt,key} $(1)/etc/prosody/certs/
++ $(INSTALL_DIR) $(1)/etc/prosody/data
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/prosody{,ctl} $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/prosody/prosody.version $(1)/usr/lib/prosody/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody/core
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/prosody/core/*.lua $(1)/usr/lib/prosody/core/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody/fallbacks
++ #$(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/prosody/fallbacks/*.lua $(1)/usr/lib/prosody/fallbacks/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody/modules
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/prosody/modules/*.lua $(1)/usr/lib/prosody/modules/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody/modules/adhoc
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/prosody/modules/adhoc/*.lua $(1)/usr/lib/prosody/modules/adhoc/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody/modules/mod_s2s
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/prosody/modules/mod_s2s/*.lua $(1)/usr/lib/prosody/modules/mod_s2s/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody/modules/muc
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/prosody/modules/muc/*.lua $(1)/usr/lib/prosody/modules/muc/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody/modules/storage
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/prosody/modules/storage/*.lua $(1)/usr/lib/prosody/modules/storage/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody/net
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/prosody/net/*.lua $(1)/usr/lib/prosody/net/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody/net/http
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/prosody/net/http/*.lua $(1)/usr/lib/prosody/net/http/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody/util
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/prosody/util/*.lua $(1)/usr/lib/prosody/util/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/prosody/util/*.so $(1)/usr/lib/prosody/util/
++ $(INSTALL_DIR) $(1)/usr/lib/prosody/util/sasl
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/prosody/util/sasl/*.lua $(1)/usr/lib/prosody/util/sasl/
++ #$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/prosody/util/sasl/*.so $(1)/usr/lib/prosody/util/sasl/
++endef
++
++define Package/prosody/postinst
++#!/bin/sh
++[ -n "$${IPKG_INSTROOT}" ] || {
++ echo "Fixing lua with paxctl if needed!!!"
++ [ -f /sbin/paxctl ] && {
++ paxctl -v /usr/bin/ > /dev/null 2>&1
++ [ $$? -ne 0 ] && {
++ cp /usr/bin/lua /tmp
++ paxctl -c -m /tmp/lua > /dev/null 2>&1
++ cp -f /tmp/lua /usr/bin/lua
++ }
++ }
++ exit 0
++}
++endef
++
++$(eval $(call BuildPackage,prosody))
+diff --git a/feeds/packages/net/prosody/files/prosody.cfg.lua b/feeds/packages/net/prosody/files/prosody.cfg.lua
+new file mode 100644
+index 0000000..0fe4216
+--- /dev/null
++++ b/feeds/packages/net/prosody/files/prosody.cfg.lua
+@@ -0,0 +1,170 @@
++-- Prosody Example Configuration File
++--
++-- Information on configuring Prosody can be found on our
++-- website at http://prosody.im/doc/configure
++--
++-- Tip: You can check that the syntax of this file is correct
++-- when you have finished by running: luac -p prosody.cfg.lua
++-- If there are any errors, it will let you know what and where
++-- they are, otherwise it will keep quiet.
++--
++-- The only thing left to do is rename this file to remove the .dist ending, and fill in the
++-- blanks. Good luck, and happy Jabbering!
++
++
++---------- Server-wide settings ----------
++-- Settings in this section apply to the whole server and are the default settings
++-- for any virtual hosts
++
++-- This is a (by default, empty) list of accounts that are admins
++-- for the server. Note that you must create the accounts separately
++-- (see http://prosody.im/doc/creating_accounts for info)
++-- Example: admins = { "user1@example.com", "user2@example.net" }
++admins = { }
++
++-- Enable use of libevent for better performance under high load
++-- For more information see: http://prosody.im/doc/libevent
++--use_libevent = true;
++
++-- This is the list of modules Prosody will load on startup.
++-- It looks for mod_modulename.lua in the plugins folder, so make sure that exists too.
++-- Documentation on modules can be found at: http://prosody.im/doc/modules
++modules_enabled = {
++
++ -- Generally required
++ "roster"; -- Allow users to have a roster. Recommended ;)
++ "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
++ "tls"; -- Add support for secure TLS on c2s/s2s connections
++ "dialback"; -- s2s dialback support
++ "disco"; -- Service discovery
++
++ -- Not essential, but recommended
++ "private"; -- Private XML storage (for room bookmarks, etc.)
++ "vcard"; -- Allow users to set vCards
++ --"privacy"; -- Support privacy lists
++ --"compression"; -- Stream compression
++
++ -- Nice to have
++ "legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
++ "version"; -- Replies to server version requests
++ "uptime"; -- Report how long server has been running
++ "time"; -- Let others know the time here on this server
++ "ping"; -- Replies to XMPP pings with pongs
++ "pep"; -- Enables users to publish their mood, activity, playing music and more
++ "register"; -- Allow users to register on this server using a client and change passwords
++ "adhoc"; -- Support for "ad-hoc commands" that can be executed with an XMPP client
++
++ -- Admin interfaces
++ "admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
++ --"admin_telnet"; -- Opens telnet console interface on localhost port 5582
++
++ -- Other specific functionality
++ "posix"; -- POSIX functionality, sends server to background, enables syslog, etc.
++ --"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
++ --"httpserver"; -- Serve static files from a directory over HTTP
++ --"groups"; -- Shared roster support
++ --"announce"; -- Send announcement to all online users
++ --"welcome"; -- Welcome users who register accounts
++ --"watchregistrations"; -- Alert admins of registrations
++ --"motd"; -- Send a message to users when they log in
++};
++
++-- These modules are auto-loaded, should you
++-- (for some mad reason) want to disable
++-- them then uncomment them below
++modules_disabled = {
++ -- "presence"; -- Route user/contact status information
++ -- "message"; -- Route messages
++ -- "iq"; -- Route info queries
++ -- "offline"; -- Store offline messages
++};
++
++-- Disable account creation by default, for security
++-- For more information see http://prosody.im/doc/creating_accounts
++allow_registration = false;
++
++-- Only allow encrypted streams? Encryption is already used when
++-- available. These options will cause Prosody to deny connections that
++-- are not encrypted. Note that some servers do not support s2s
++-- encryption or have it disabled, including gmail.com and Google Apps
++-- domains.
++
++--c2s_require_encryption = false
++--s2s_require_encryption = false
++
++-- Select the authentication backend to use. The 'internal' providers
++-- use Prosody's configured data storage to store the authentication data.
++-- To allow Prosody to offer secure authentication mechanisms to clients, the
++-- default provider stores passwords in plaintext. If you do not trust your
++-- server please see http://prosody.im/doc/modules/mod_auth_internal_hashed
++-- for information about using the hashed backend.
++-- See http://prosody.im/doc/authentication for other possibilities including
++-- Cyrus SASL.
++
++authentication = "internal_plain"
++
++-- Select the storage backend to use. By default Prosody uses flat files
++-- in its configured data directory, but it also supports more backends
++-- through modules. An "sql" backend is included by default, but requires
++-- additional dependencies. See http://prosody.im/doc/storage for more info.
++
++--storage = "sql" -- Default is "internal"
++
++-- For the "sql" backend, you can uncomment *one* of the below to configure:
++--sql = { driver = "SQLite3", database = "prosody.sqlite" } -- Default. 'database' is the filename.
++--sql = { driver = "MySQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" }
++--sql = { driver = "PostgreSQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" }
++
++-- Logging configuration
++-- For advanced logging see http://prosody.im/doc/logging
++log = {
++ info = "/var/log/prosody/prosody.log"; -- Change 'info' to 'debug' for verbose logging
++ error = "/var/log/prosody/prosody.err";
++ -- "*syslog"; -- Uncomment this for logging to syslog; needs mod_posix
++ -- "*console"; -- Log to the console, useful for debugging with daemonize=false
++}
++
++-- Pidfile, used by prosodyctl and the init.d script
++pidfile = "/var/run/prosody/prosody.pid"
++
++-- User and group, used for daemon
++prosody_user = "prosody"
++prosody_group = "prosody"
++
++----------- Virtual hosts -----------
++-- You need to add a VirtualHost entry for each domain you wish Prosody to serve.
++-- Settings under each VirtualHost entry apply *only* to that host.
++
++VirtualHost "localhost"
++
++VirtualHost "example.com"
++ enabled = false -- Remove this line to enable this host
++
++ -- Assign this host a certificate for TLS, otherwise it would use the one
++ -- set in the global section (if any).
++ -- Note that old-style SSL on port 5223 only supports one certificate, and will always
++ -- use the global one.
++ ssl = {
++ key = "/etc/prosody/certs/example.com.key";
++ certificate = "/etc/prosody/certs/example.com.crt";
++ }
++
++------ Components ------
++-- You can specify components to add hosts that provide special services,
++-- like multi-user conferences, and transports.
++-- For more information on components, see http://prosody.im/doc/components
++
++---Set up a MUC (multi-user chat) room server on conference.example.com:
++--Component "conference.example.com" "muc"
++
++-- Set up a SOCKS5 bytestream proxy for server-proxied file transfers:
++--Component "proxy.example.com" "proxy65"
++
++---Set up an external component (default component port is 5347)
++--
++-- External components allow adding various services, such as gateways/
++-- transports to other networks like ICQ, MSN and Yahoo. For more info
++-- see: http://prosody.im/doc/components#adding_an_external_component
++--
++--Component "gateway.example.com"
++-- component_secret = "password"
+diff --git a/feeds/packages/net/prosody/files/prosody.init b/feeds/packages/net/prosody/files/prosody.init
+new file mode 100644
+index 0000000..bab0ae7
+--- /dev/null
++++ b/feeds/packages/net/prosody/files/prosody.init
+@@ -0,0 +1,53 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2010-2011 OpenWrt.org
++
++START=99
++
++EXTRA_COMMANDS="status"
++EXTRA_HELP=" status Print the status of the service"
++
++BIN=/usr/bin/prosodyctl
++LOG_D=/var/log/prosody
++RUN_D=/var/run/prosody
++PID_F=$RUN_D/prosody.pid
++RUN_USER=prosody
++RUN_GROUP=prosody
++
++start() {
++ [ -d /var/run/prosody ] || {
++ mkdir -m 0755 -p /var/run/prosody
++ chown prosody:prosody /var/run/prosody
++ }
++ [ -d /var/log/prosody ] || {
++ mkdir -m 0755 -p /var/log/prosody
++ chown prosody:prosody /var/log/prosody
++ }
++
++ [ -d /var/log/prosody ] && {
++ chown -R prosody:prosody /etc/prosody
++ }
++
++ [ -f /sbin/paxctl ] && {
++ paxctl -v /usr/bin/ > /dev/null 2>&1
++ [ $? -ne 0 ] && {
++ cp /usr/bin/lua /tmp
++ paxctl -c -m /tmp/lua
++ cp -f /tmp/lua /usr/bin/lua
++ }
++ }
++
++
++ $BIN start
++}
++
++stop() {
++ $BIN stop
++}
++
++reload() {
++ [ -f $PID_F ] && kill -HUP $(cat $PID_F)
++}
++
++status() {
++ $BIN status
++}
+diff --git a/feeds/packages/net/prosody/patches/010-fix-randomseed.patch b/feeds/packages/net/prosody/patches/010-fix-randomseed.patch
+new file mode 100644
+index 0000000..05bdffa
+--- /dev/null
++++ b/feeds/packages/net/prosody/patches/010-fix-randomseed.patch
+@@ -0,0 +1,12 @@
++diff -u --recursive prosody-0.9.7-vanilla/net/dns.lua prosody-0.9.7/net/dns.lua
++--- prosody-0.9.7-vanilla/net/dns.lua 2015-01-02 00:26:19.981433830 -0500
+++++ prosody-0.9.7/net/dns.lua 2015-01-02 00:33:10.467077715 -0500
++@@ -225,7 +225,7 @@
++
++
++ function dns.random(...) -- - - - - - - - - - - - - - - - - - - dns.random
++- math.randomseed(math.floor(10000*socket.gettime()) % 0x100000000);
+++ math.randomseed(math.floor(10000*socket.gettime()) % 0x80000000);
++ dns.random = math.random;
++ return dns.random(...);
++ end
+diff --git a/feeds/packages/net/radicale/Makefile b/feeds/packages/net/radicale/Makefile
+new file mode 100644
+index 0000000..f604a9f
+--- /dev/null
++++ b/feeds/packages/net/radicale/Makefile
+@@ -0,0 +1,138 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=radicale
++PKG_VERSION:=0.10
++PKG_RELEASE:=2
++PKG_MAINTAINER:=Christian Schoenebeck <christian.schoenebeck@gmail.com>
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=Radicale-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://pypi.python.org/packages/source/R/Radicale/
++PKG_MD5SUM:=32655d8893962956ead0ad690cca6044
++
++# needed for "r"adicale <-> "R"adicale
++PKG_BUILD_DIR:=$(BUILD_DIR)/Radicale-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++# no default dependencies
++PKG_DEFAULT_DEPENDS=
++
++define Package/$(PKG_NAME)/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Web Servers/Proxies
++ URL:=http://radicale.org/
++ PKGARCH:=all
++ USERID:=radicale=5232:radicale=5232
++endef
++define Package/$(PKG_NAME)-py2
++ $(call Package/$(PKG_NAME)/Default)
++ PYTHON_VERSION:=2.7
++ TITLE:=Radicale CalDAV/CardDAV server (Python 2)
++ VARIANT:=python2
++ DEPENDS:=+python-logging +python-openssl +python-xml +python-codecs
++endef
++define Package/$(PKG_NAME)-py3
++ $(call Package/$(PKG_NAME)/Default)
++ PYTHON_VERSION:=3.4
++ TITLE:=Radicale CalDAV/CardDAV server (Python 3)
++ VARIANT:=python3
++ DEPENDS:=+python3-logging +python3-openssl +python3-xml +python3-codecs +python3-email @BROKEN
++endef
++
++# shown in LuCI package description
++define Package/$(PKG_NAME)-py2/description
++Radicale CalDAV/CardDAV server (Python 2) - Homepage: http://radicale.org/
++endef
++define Package/$(PKG_NAME)-py3/description
++Radicale CalDAV/CardDAV server (Python 3) - Homepage: http://radicale.org/
++endef
++
++# shown in make menuconfig <Help>
++define Package/$(PKG_NAME)-py2/config
++ help
++ The Radicale Project is a CalDAV (calendar) and CardDAV (contact) server.
++ It aims to be a light solution, easy to use, easy to install, easy to configure.
++ As a consequence, it requires few software dependances and is pre-configured to work out-of-the-box.
++ !!! Will install and use Python $(PYTHON_VERSION) !!!
++ .
++ Version : $(PKG_VERSION)
++ Homepage: http://radicale.org/
++ .
++ $(PKG_MAINTAINER)
++endef
++Package/$(PKG_NAME)-py3/config = $(Package/$(PKG_NAME)-py2/config)
++
++define Package/$(PKG_NAME)-py2/conffiles
++/etc/config/radicale
++/etc/radicale/users
++/etc/radicale/rights
++endef
++Package/$(PKG_NAME)-py3/conffiles = $(Package/$(PKG_NAME)-py2/conffiles)
++
++define Build/Configure
++endef
++define Build/Compile
++endef
++
++define Package/$(PKG_NAME)-py2/preinst
++ #!/bin/sh
++ [ -n "$${IPKG_INSTROOT}" ] && exit 0 # if run within buildroot exit
++
++ # stop service if PKG_UPGRADE
++ [ "$${PKG_UPGRADE}" = "1" ] && /etc/init.d/$(PKG_NAME) stop >/dev/null 2>&1
++
++ exit 0 # supress errors from stop command
++endef
++define Package/$(PKG_NAME)-py3/preinst
++$(call Package/$(PKG_NAME)-py2/preinst)
++endef
++
++define Package/$(PKG_NAME)-py2/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/radicale.init $(1)/etc/init.d/radicale
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
++ $(INSTALL_BIN) ./files/radicale.hotplug $(1)/etc/hotplug.d/iface/80-radicale
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/radicale.config $(1)/etc/config/radicale
++
++ $(INSTALL_DIR) $(1)/etc/radicale/ssl
++ $(INSTALL_DATA) ./files/config.template $(1)/etc/radicale/
++ $(INSTALL_DATA) ./files/logging.template $(1)/etc/radicale/
++ $(INSTALL_DATA) ./files/radicale.users $(1)/etc/radicale/users
++ $(INSTALL_DATA) ./files/radicale.rights $(1)/etc/radicale/rights
++
++ $(INSTALL_DIR) $(1)/usr/lib/python$(PYTHON_VERSION)/site-packages/radicale
++ $(CP) \
++ $(PKG_BUILD_DIR)/radicale/* \
++ $(1)/usr/lib/python$(PYTHON_VERSION)/site-packages/radicale
++
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/radicale $(1)/usr/bin/
++endef
++define Package/$(PKG_NAME)-py3/install
++ $(call Package/$(PKG_NAME)-py2/install, $(1))
++endef
++
++define Package/$(PKG_NAME)-py2/postinst
++ #!/bin/sh
++ # patch /usr/bin/radicale force run using python2
++ /bin/sed -i 's/python/python2/' $${IPKG_INSTROOT}/usr/bin/radicale
++endef
++define Package/$(PKG_NAME)-py3/postinst
++ #!/bin/sh
++ # patch /usr/bin/radicale force run using python3
++ /bin/sed -i 's/python/python3/' $${IPKG_INSTROOT}/usr/bin/radicale
++endef
++
++$(eval $(call BuildPackage,$(PKG_NAME)-py2))
++$(eval $(call BuildPackage,$(PKG_NAME)-py3))
+diff --git a/feeds/packages/net/radicale/files/config.template b/feeds/packages/net/radicale/files/config.template
+new file mode 100644
+index 0000000..1b8fcf2
+--- /dev/null
++++ b/feeds/packages/net/radicale/files/config.template
+@@ -0,0 +1,30 @@
++# -*- mode: conf -*-
++# vim:ft=cfg
++
++### AUTO-GENERATED CONFIGURATION
++### USED BY RADICALE
++### DO NOT EDIT
++### SEE /etc/config/radicale INSTEAD
++
++[server]
++# daemon # handled by /etc/init.d/radicale
++# pid # handled by /etc/init.d/radicale
++
++[encoding]
++
++[well-known]
++
++[auth]
++# htpasswd_filename # hard-coded /etc/radicale/users
++
++[git]
++
++[rights]
++# file # hard-coded /etc/radicale/rights
++
++[storage]
++
++[logging]
++# config # hard-coded /var/etc/radicale/logging
++
++[headers]
+diff --git a/feeds/packages/net/radicale/files/logging.template b/feeds/packages/net/radicale/files/logging.template
+new file mode 100644
+index 0000000..a730ca0
+--- /dev/null
++++ b/feeds/packages/net/radicale/files/logging.template
+@@ -0,0 +1,47 @@
++# -*- mode: conf -*-
++# vim:ft=cfg
++
++### AUTO-GENERATED CONFIGURATION
++### USED BY RADICALE
++### DO NOT EDIT
++### SEE /etc/config/radicale INSTEAD
++
++[loggers]
++keys = root
++
++[handlers]
++keys = console,file,syslog
++
++[formatters]
++keys = simple,full,syslog
++
++[logger_root]
++level = DEBUG
++handlers = console,file,syslog
++
++[handler_console]
++class = StreamHandler
++args = (sys.stdout,)
++formatter = simple
++# level = WARNING # set via /etc/config/radicale
++
++[handler_file]
++class = handlers.RotatingFileHandler
++formatter = full
++# level = INFO # set via /etc/config/radicale
++# args = ('[filename]','a',[maxbytes],[backupcount]) # set via /etc/config/radicale
++
++[handler_syslog]
++class = handlers.SysLogHandler
++args = ('/dev/log', handlers.SysLogHandler.LOG_DAEMON)
++formatter = syslog
++# level = WARNING # set via /etc/config/radicale
++
++[formatter_simple]
++format = %(message)s
++
++[formatter_full]
++format = %(asctime)s - %(levelname)s: %(message)s
++
++[formatter_syslog]
++format = radicale [%(process)d]: %(message)s
+diff --git a/feeds/packages/net/radicale/files/radicale.config b/feeds/packages/net/radicale/files/radicale.config
+new file mode 100644
+index 0000000..58148f8
+--- /dev/null
++++ b/feeds/packages/net/radicale/files/radicale.config
+@@ -0,0 +1,190 @@
++#
++# You find additional information on Radicale Homepage
++# http://radicale.org
++#
++# OpenWrt's wiki needs to be setup/updated ;-)
++#
++# if setting additional options please remember that UCI does not support
++# section names and option names with "-" (Dash) inside their name
++# to use them anyway replace "-" with "_" (Underscore)
++# Each Radicale's config [section] is setup as UCI config setting 'section'
++#
++
++####################################################
++# Server options
++#
++config setting 'server'
++
++ # hostname:port
++ # IPv4 syntax: address:port
++ # IPv6 syntax: [address]:port
++ # ATTENTION:
++ # only use ports > 1024 (non-privileged Ports)
++ # because this implementation is running as non-root user
++ # Default: 0.0.0.0:5232
++# list hosts '0.0.0.0:5232'
++# list hosts 'localhost:5232'
++
++ # SSL flag, enable HTTPS protocol
++ # Default: 0 (disabled)
++# option ssl '1'
++
++ # SSL Protocol used. See python's ssl module for available values
++ # Default: PROTOCOL_SSLv23
++# option protocol 'PROTOCOL_SSLv23'
++
++ # Ciphers available. See python's ssl module for available ciphers
++# option ciphers ''
++
++ # SSL certificate path and file
++# option certificate '/etc/radicale/ssl/server.crt'
++
++ # SSL private key path and file
++# option key '/etc/radicale/ssl/server.key'
++
++ # Reverse DNS to resolve client address in logs
++ # Default: 0 (disabled)
++# option dns_lookup '1'
++
++ # Message displayed in the client when a password is needed
++# option realm 'Radicale - Password Required'
++
++
++####################################################
++# Encoding options
++#
++config setting 'encoding'
++
++ # Encoding for responding requests
++# option request 'utf-8'
++
++ # Encoding for storing local collections
++# option stock 'utf-8'
++
++
++####################################################
++# Authentication options
++#
++config setting 'auth'
++
++ # Authentication method
++ # Value: None | htpasswd | IMAP | LDAP | PAM | courier | http | remote_user | custom
++ # Default: None
++ # if setting 'htpasswd' the file /etc/radicale/users is used (hardcoded)
++
++ # Htpasswd encryption method
++ # Value: plain | sha1 | ssha | crypt
++# option htpasswd_encryption 'crypt'
++
++ # for other authenication methods consult Radicale documentation
++ # and set options here
++
++
++####################################################
++# Git default options
++#
++config setting 'git'
++
++ # Git default options
++# option committer 'Radicale <radicale@example.com>'
++
++
++####################################################
++# Rights backend
++#
++config setting 'rights'
++
++ # Value: None | authenticated | owner_only | owner_write | from_file | custom
++ # Default: None
++ # if setting 'from_file' the file /etc/radicale/rights is used (hardcoded)
++
++ # Custom rights handler
++# option custom_handler ''
++
++
++####################################################
++# Storage backend
++# -------
++# WARNING: ONLY "filesystem" IS DOCUMENTED AND TESTED,
++# OTHER BACKENDS ARE NOT READY FOR PRODUCTION.
++# -------
++#
++config setting 'storage'
++ # Value: filesystem | multifilesystem | database | custom
++ option type 'filesystem'
++ option filesystem_folder '/srv/radicale'
++
++
++####################################################
++# Additional HTTP headers
++#
++config setting 'headers'
++ # enable all if using CardDavMATE-, CalDavZAP- or InfCloud- WEBclient
++# list Access_Control_Allow_Origin '*'
++# list Access_Control_Allow_Methods 'GET'
++# list Access_Control_Allow_Methods 'POST'
++# list Access_Control_Allow_Methods 'OPTIONS'
++# list Access_Control_Allow_Methods 'PROPFIND'
++# list Access_Control_Allow_Methods 'PROPPATCH'
++# list Access_Control_Allow_Methods 'REPORT'
++# list Access_Control_Allow_Methods 'PUT'
++# list Access_Control_Allow_Methods 'MOVE'
++# list Access_Control_Allow_Methods 'DELETE'
++# list Access_Control_Allow_Methods 'LOCK'
++# list Access_Control_Allow_Methods 'UNLOCK'
++# list Access_Control_Allow_Headers 'User-Agent'
++# list Access_Control_Allow_Headers 'Authorization'
++# list Access_Control_Allow_Headers 'Content-type'
++# list Access_Control_Allow_Headers 'Depth'
++# list Access_Control_Allow_Headers 'If-match'
++# list Access_Control_Allow_Headers 'If-None-Match'
++# list Access_Control_Allow_Headers 'Lock-Token'
++# list Access_Control_Allow_Headers 'Timeout'
++# list Access_Control_Allow_Headers 'Destination'
++# list Access_Control_Allow_Headers 'Overwrite'
++# list Access_Control_Allow_Headers 'X-client'
++# list Access_Control_Allow_Headers 'X-Requested-With'
++# list Access_Control_Expose_Headers 'Etag'
++
++
++####################################################
++# Global logging options
++#
++config setting 'logging'
++
++ # Set the default logging level to debug for all outputs (ignore output level settings)
++ # Default: 0 (disabled)
++# option debug '1'
++ # Log all environment variables (including those set in the shell) when starting
++ # Default: 0 (disabled)
++# option full_environment '1'
++
++
++####################################################
++# Spezial logging options
++# !!! not documented in Radicale documentation
++# !!! special settings for this implementation
++#
++config logging 'logger'
++
++ # Level: DEBUG | INFO | WARNING | ERROR | CRITICAL
++ # To nearly disable logging set level to critical
++
++ # log level on console
++# option console_level 'ERROR'
++
++ # Here we use Rotating Logfiles in this implementation
++ # !!! if maxbytes and/or backupcount is set to 0 !!!
++ # !!! file rotation is disabled and logfile grows endless !!!
++ # log level
++# option file_level 'INFO'
++ # directory where log files are written
++# option file_path '/var/log/radicale'
++ # max size of each logfile (see warning above)
++# option file_maxbytes '8196'
++ # number of backup files to create (see warning above)
++# option file_backupcount '1'
++
++ # log level for syslog logging
++# option syslog_level 'WARNING'
++
+diff --git a/feeds/packages/net/radicale/files/radicale.hotplug b/feeds/packages/net/radicale/files/radicale.hotplug
+new file mode 100644
+index 0000000..3b91419
+--- /dev/null
++++ b/feeds/packages/net/radicale/files/radicale.hotplug
+@@ -0,0 +1,16 @@
++#!/bin/sh
++
++# only (re-)start on ifup
++[ "$ACTION" = "ifup" ] || exit 0
++
++_PID=$(ps | grep '[p]ython.*[r]adicale' 2>/dev/null | awk '{print $1}')
++kill -1 $_PID 2>/dev/null
++if [ $? -eq 0 ]; then
++ # only restart if already running
++ logger -p user.info -t "radicale[$_PID]" \
++ "Restart request due to '$ACTION' of interface '$INTERFACE'"
++ /etc/init.d/radicale restart
++else
++ # only start if enabled
++ /etc/init.d/radicale enabled && /etc/init.d/radicale start
++fi
+diff --git a/feeds/packages/net/radicale/files/radicale.init b/feeds/packages/net/radicale/files/radicale.init
+new file mode 100755
+index 0000000..991ca50
+--- /dev/null
++++ b/feeds/packages/net/radicale/files/radicale.init
+@@ -0,0 +1,220 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2015 OpenWrt.org
++
++START=80
++STOP=10
++
++CFGDIR=/var/etc/radicale
++SYSCFG=$CFGDIR/config
++LOGCFG=$CFGDIR/logging
++
++DATADIR="/srv/radicale"
++LOGDIR=""
++
++PGREP="ps | grep '[p]ython.*[r]adicale' 2>/dev/null | awk '{print \$1}' "
++
++# we could start with empty configuration file using defaults
++[ -f /etc/config/radicale ] || touch /etc/config/radicale
++
++_uci2radicale() {
++ local _SYSTMP="$SYSCFG.tmp"
++ local _LOGTMP="$LOGCFG.tmp"
++ local _LOPT # list option name
++ local _LVAL # list option value
++ local _STYPE # section type
++ local _SNAME # section name
++ local _console_level="ERROR" # logging console level
++ local _file_level="INFO" # logging file level
++ local _file_path="/var/log/radicale" # logging file path
++ local _file_maxbytes="8196" # logging file maxBytes
++ local _file_backupcount="1" # logging file backupCount
++ local _syslog_level="WARNING" # logging syslog level
++
++ # write list values to config
++ _write_list() {
++ _write_value "$_LOPT" "$_LVAL" # there might be spaces in _LVAL
++ _LOPT=""
++ _LVAL=""
++ }
++
++ _write_value() {
++ # $1 option
++ # $2 value
++ local __OPT=$1
++ local __VAL=$2
++ # section "server" ignore option "daemon" and "pid"
++ [ "$_SNAME" = "server" -a "$__OPT" = "daemon" ] && return 0
++ [ "$_SNAME" = "server" -a "$__OPT" = "pid" ] && return 0
++ # section "logging" ignore option "config" (logging config file)
++ [ "$_SNAME" = "logging" -a "$__OPT" = "config" ] && return 0
++ # section "auth" ignore option "htpasswd_filename" (htpasswd file)
++ [ "$_SNAME" = "auth" -a "$__OPT" = "htpasswd_filename" ] && return 0
++ # section "rights" ignore option "file" (reg-based rights file)
++ [ "$_SNAME" = "rights" -a "$__OPT" = "file" ] && return 0
++ # section "headers" replace "_" with "-" in option (UCI problem)
++ [ "$_SNAME" = "headers" ] && __OPT=$(echo "$__OPT" | sed -e "s#_#-#g")
++ # save data driectory
++ [ "$_SNAME" = "storage" -a "$__OPT" = "filesystem_folder" ] && DATADIR="$__VAL"
++ # special handling for well-known, value needs single quotes
++ [ "$_SNAME" = "well-known" -a "${__VAL#*\%\(}" != "$__VAL" ] && __VAL="'$__VAL'"
++ # handling of log settings
++ if [ "$_STYPE" = "logging" -a "$_SNAME" = "logger" ]; then
++ eval "_$__OPT='$__VAL'" # set to environment for later use
++ else
++ # handle bool
++ [ "$__VAL" = "0" ] && __VAL="False"
++ [ "$__VAL" = "1" ] && __VAL="True"
++ # append data to the corresponding section
++ sed -i "/\[$_SNAME\]/a $__OPT = $__VAL" $_SYSTMP
++ fi
++ }
++
++ # redefined callback for sections when calling config_load
++ config_cb() {
++ # $1 "Type"
++ # $2 "Name"
++ # write out last list option
++ [ -n "$_LOPT" ] && _write_list
++ # mark invalid
++ _STYPE=""
++ _SNAME=""
++ # check section type
++ [ "$1" = "setting" -o "$1" = "logging" ] && {
++ _STYPE="$1"
++ _SNAME="$2"
++ }
++ # translate section name
++ [ "$2" = "well_known" ] && _SNAME="well-known"
++ return 0
++ }
++
++ # redefined callback for lists when calling config_load
++ list_cb() {
++ # $1 name of variable
++ # $2 value
++ # invalid section type then ignore
++ [ -z "$_STYPE" -o -z "$_SNAME" ] && return 0
++ # write out last list option if new list starts
++ [ -n "$_LOPT" -a "$_LOPT" != "$1" ] && _write_list
++ # new list option
++ if [ -z "$_LOPT" ]; then
++ _LOPT="$1"
++ _LVAL="$2"
++ else
++ _LVAL="$_LVAL, $2"
++ fi
++ return 0
++ }
++
++ # redefined callback for options when calling config_load
++ option_cb() {
++ # $1 name of variable
++ # $2 value
++ local __OPT="$1"
++ local __VAL="$2"
++ # invalid section type then ignore
++ [ -z "$_STYPE" -o -z "$_SNAME" ] && return 0
++ # ignore list entrys will be handled by list_cb()
++ [ "${__OPT#*_ITEM}" != "$__OPT" ] && return 0 # ignore lists *_ITEM*
++ [ "${__OPT#*_LENGTH}" != "$__OPT" ] && return 0 # ignore lists *_LENGTH
++ # write out last list option and clear
++ [ -n "$_LOPT" ] && _write_list
++ # write to file
++ _write_value "$__OPT" "$__VAL" # there might be spaces in __VAL
++ return 0
++ }
++
++ # temporary config file
++ # radicale need read access
++ mkdir -m0755 -p $CFGDIR
++
++ cp /etc/radicale/config.template $_SYSTMP
++ config_load radicale # calling above config_cb()/option_cb()/list_cb() and write into $_SYSTMP
++ sed -i "/\[logging\]/a config = /var/etc/radicale/logging" $_SYSTMP # hard-code logging config
++ sed -i "/\[auth\]/a htpasswd_filename = /etc/radicale/users" $_SYSTMP # hard-code htpasswd
++ sed -i "/\[rights\]/a file = /etc/radicale/rights" $_SYSTMP # hard-code regexp-based rights
++
++ # temporary logging config file
++ cp /etc/radicale/logging.template $_LOGTMP
++ LOGDIR="$_file_path"
++ sed -i "/\[handler_console\]/a level = $_console_level" $_LOGTMP
++ sed -i "/\[handler_file\]/a level = $_file_level" $_LOGTMP
++ sed -i "/\[handler_file\]/a args = ('$_file_path/radicale','a',$_file_maxbytes,$_file_backupcount)" $_LOGTMP
++ sed -i "/\[handler_syslog\]/a level = $_syslog_level" $_LOGTMP
++
++ # move tmp to final
++ mv -f $_SYSTMP $SYSCFG
++ mv -f $_LOGTMP $LOGCFG
++}
++
++_set_permission() {
++ # config file permissions (read access for group)
++ chmod 644 $SYSCFG $LOGCFG
++ chgrp -R radicale $CFGDIR
++ # log directory (full access and owner)
++ [ -d $LOGDIR ] || mkdir -m0755 -p $LOGDIR
++ chown -R radicale:radicale $LOGDIR
++ # data directory does not exist
++ [ -d $DATADIR ] || {
++ logger -p user.error -t "radicale[----]" "Data directory '$DATADIR' does not exists. Startup failed !!!"
++ exit 1
++ }
++ chgrp -R radicale $DATADIR
++}
++
++boot() {
++ return 0 # will be started by "iface" hotplug events
++}
++
++start() {
++ _running() {
++ sleep 2 # give radicale time to completely come up
++ local _PID=$(eval "$PGREP")
++ kill -1 $_PID 2>/dev/null
++ [ $? -eq 0 ] \
++ && logger -p user.notice -t "radicale[$_PID]" "Service started successfully"\
++ || logger -p user.warn -t "radicale[----]" "Service failed to start"
++ }
++
++ # if already running do nothing
++ local _PID=$(eval "$PGREP")
++ kill -1 $_PID 2>/dev/null && return 0
++
++ _uci2radicale
++ _set_permission
++
++ radicale --daemon --config=$SYSCFG
++
++ _running & # check if running and syslog
++
++ return 0
++}
++
++reload() {
++ # reload is also used by luci
++ local _PID=$(eval "$PGREP")
++ kill -1 $_PID 2>/dev/null
++ if [ $? -eq 0 ]; then
++ # only restart if already running
++ restart
++ else
++ # only start if enabled
++ enabled && start
++ fi
++ return 0
++}
++
++stop() {
++ local _PID=$(eval "$PGREP")
++ [ -z "$_PID" ] && return 0 # not running
++ kill -15 $_PID 2>/dev/null
++ sleep 3 # give time to shutdown
++ local _tmp=$(eval "$PGREP")
++ if [ -z "$_tmp" ]; then
++ logger -p user.notice -t "radicale[$_PID]" "Service shutdown successfully"
++ else
++ kill -9 $_tmp # Normally never come here
++ logger -p user.warn -t "radicale[----]" "Service shutdown FORCED"
++ fi
++ return 0
++}
+diff --git a/feeds/packages/net/radicale/files/radicale.rights b/feeds/packages/net/radicale/files/radicale.rights
+new file mode 100644
+index 0000000..3de3955
+--- /dev/null
++++ b/feeds/packages/net/radicale/files/radicale.rights
+@@ -0,0 +1,49 @@
++#
++# Authentication login is matched against the "user" key, and collection's path is matched against the "collection" key.
++# You can use Python's ConfigParser interpolation values %(login)s and %(path)s.
++# You can also get groups from the user regex in the collection with {0}, {1}, etc.
++#
++# For example, for the "user" key, ".+" means "authenticated user" and ".*" means "anybody" (including anonymous users).
++#
++# Section names are only used for naming the rule.
++# Leading or ending slashes are trimmed from collection's path.
++#
++
++# This means all users starting with "admin" may read any collection
++[admin]
++user: ^admin.*$
++collection: .*
++permission: r
++
++# This means all users may read and write any collection starting with public.
++# We do so by just not testing against the user string.
++[public]
++user: .*
++collection: ^public(/.+)?$
++permission: rw
++
++# A little more complex: give read access to users from a domain for all
++# collections of all the users (ie. user@domain.tld can read domain/\*).
++[domain-wide-access]
++user: ^.+@(.+)\..+$
++collection: ^{0}/.+$
++permission: r
++
++# Allow authenticated user to read all collections
++[allow-everyone-read]
++user: .+
++collection: .*
++permission: r
++
++# Give write access to owners
++[owner-write]
++user: .+
++collection: ^%(login)s(/.+)?$
++permission: rw
++
++# Allow CardDavMATE-, CalDavZAP- or InfCloud- WEBclient to work
++# anonymous users have read access to "/" but no files or subdir
++[infcloud]
++user: .*
++collection: /
++permission: r
+diff --git a/feeds/packages/net/radicale/files/radicale.users b/feeds/packages/net/radicale/files/radicale.users
+new file mode 100644
+index 0000000..7722176
+--- /dev/null
++++ b/feeds/packages/net/radicale/files/radicale.users
+@@ -0,0 +1,6 @@
++#
++# Sample File
++#
++
++user1:password1
++user2:password2
+\ No newline at end of file
+diff --git a/feeds/packages/net/radicale/patches/010-Run-as-user-group-radicale-radicale.patch b/feeds/packages/net/radicale/patches/010-Run-as-user-group-radicale-radicale.patch
+new file mode 100644
+index 0000000..e1f1c21
+--- /dev/null
++++ b/feeds/packages/net/radicale/patches/010-Run-as-user-group-radicale-radicale.patch
+@@ -0,0 +1,30 @@
++Subject: [PATCH] Run as user radicale and group radicale
++
++Patch to run Radicale service as radicale:radicale non root user
++
++Signed-off-by: Christian Schoenebeck <christian.schoenebeck@gmail.com>
++---
++ bin/radicale | 7 +++++++
++ 1 file changed, 7 insertions(+)
++
++diff --git a/bin/radicale b/bin/radicale
++index 619aca5..7466020 100755
++--- a/bin/radicale
+++++ b/bin/radicale
++@@ -26,6 +26,13 @@ Launch the server according to configuration and command-line options.
++
++ """
++
+++# inserted to run as user radicale
+++import pwd, grp, os
+++uid = pwd.getpwnam('radicale').pw_uid
+++gid = grp.getgrnam('radicale').gr_gid
+++os.setegid(gid)
+++os.seteuid(uid)
+++
++ import radicale.__main__
++
++
++--
++2.1.0
++
+diff --git a/feeds/packages/net/radsecproxy/Makefile b/feeds/packages/net/radsecproxy/Makefile
+new file mode 100644
+index 0000000..f155532
+--- /dev/null
++++ b/feeds/packages/net/radsecproxy/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2008-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=radsecproxy
++PKG_VERSION:=1.6.6
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://software.uninett.no/radsecproxy/
++PKG_MD5SUM:=8270b2a9d7cb1dcf30ddd677f3e7ac5f
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/radsecproxy
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libopenssl +libpthread
++ TITLE:=radsecproxy
++ URL:=http://software.uninett.no/radsecproxy
++ MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
++endef
++
++define Package/radsecproxy/description
++ A generic radius proxy for UDP/TLS (RadSec)
++endef
++
++CONFIGURE_ARGS+= \
++ --with-ssl="$(STAGING_DIR)/usr"
++
++#TARGET_CFLAGS += -ansi
++#TARGET_CFLAGS += -std=c99
++TARGET_CFLAGS += -Wno-long-long
++
++
++define Package/radsecproxy/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/radsecproxy $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/
++ $(CP) $(PKG_BUILD_DIR)/radsecproxy.conf-example $(1)/etc/radsecproxy.conf
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) ./files/radsecproxy.init $(1)/etc/init.d/radsecproxy
++endef
++
++define Package/radsecproxy/conffiles
++/etc/radsecproxy.conf
++endef
++
++$(eval $(call BuildPackage,radsecproxy))
++
+diff --git a/feeds/packages/net/radsecproxy/files/radsecproxy.init b/feeds/packages/net/radsecproxy/files/radsecproxy.init
+new file mode 100644
+index 0000000..39bdc6e
+--- /dev/null
++++ b/feeds/packages/net/radsecproxy/files/radsecproxy.init
+@@ -0,0 +1,16 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=70
++
++USE_PROCD=1
++PROG=/usr/sbin/radsecproxy
++CONFFILE=/etc/radsecproxy.conf
++
++start_service() {
++ procd_open_instance
++ procd_set_param command $PROG -f -c $CONFFILE
++ procd_set_param file $CONFFILE
++ procd_set_param respawn
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/radsecproxy/patches/100-missing-return.patch b/feeds/packages/net/radsecproxy/patches/100-missing-return.patch
+new file mode 100644
+index 0000000..871fc6e
+--- /dev/null
++++ b/feeds/packages/net/radsecproxy/patches/100-missing-return.patch
+@@ -0,0 +1,58 @@
++--- a/dtls.c
+++++ b/dtls.c
++@@ -523,6 +523,7 @@ void *udpdtlsserverrd(void *arg) {
++ free(params);
++ cacheexpire(sessioncache, &lastexpiry);
++ }
+++ return NULL;
++ }
++
++ int dtlsconnect(struct server *server, struct timeval *when, int timeout, char *text) {
++@@ -642,6 +643,7 @@ void *udpdtlsclientrd(void *arg) {
++ if (udp2bio(s, conf->servers->rbios, cnt))
++ debug(DBG_DBG, "radudpget: got DTLS in UDP from %s", addr2string((struct sockaddr *)&from));
++ }
+++ return NULL;
++ }
++
++ void *dtlsclientrd(void *arg) {
++--- a/radsecproxy.c
+++++ b/radsecproxy.c
++@@ -3203,6 +3203,8 @@ void *sighandler(void *arg) {
++ debug(DBG_WARN, "sighandler: ignoring signal %d", sig);
++ }
++ }
+++
+++ return NULL;
++ }
++
++ int createpidfile(const char *pidfile) {
++@@ -3289,6 +3291,8 @@ int radsecproxy_main(int argc, char **ar
++ /* just hang around doing nothing, anything to do here? */
++ for (;;)
++ sleep(1000);
+++
+++ return 0;
++ }
++
++ /* Local Variables: */
++--- a/udp.c
+++++ b/udp.c
++@@ -266,6 +266,8 @@ void *udpclientrd(void *arg) {
++ buf = radudpget(*s, NULL, &server, NULL);
++ replyh(server, buf);
++ }
+++
+++ return NULL;
++ }
++
++ void *udpserverrd(void *arg) {
++@@ -310,6 +312,8 @@ void *udpserverwr(void *arg) {
++ debug(DBG_DBG, "udpserverwr: refcount %d", reply->refcount);
++ freerq(reply);
++ }
+++
+++ return NULL;
++ }
++
++ void addclientudp(struct client *client) {
+diff --git a/feeds/packages/net/radsecproxy/patches/200-logdest-on-foreground.patch b/feeds/packages/net/radsecproxy/patches/200-logdest-on-foreground.patch
+new file mode 100644
+index 0000000..6678448
+--- /dev/null
++++ b/feeds/packages/net/radsecproxy/patches/200-logdest-on-foreground.patch
+@@ -0,0 +1,31 @@
++diff --git a/radsecproxy.c b/radsecproxy.c
++index 563c4a8..9fa076d 100644
++--- a/radsecproxy.c
+++++ b/radsecproxy.c
++@@ -3382,18 +3382,16 @@ int radsecproxy_main(int argc, char **argv) {
++ options.loglevel = loglevel;
++ else if (options.loglevel)
++ debug_set_level(options.loglevel);
++- if (!foreground) {
++- debug_set_destination(options.logdestination
++- ? options.logdestination
++- : "x-syslog:///", LOG_TYPE_DEBUG);
+++ debug_set_destination(options.logdestination
+++ ? options.logdestination
+++ : "x-syslog:///", LOG_TYPE_DEBUG);
++ #if defined(WANT_FTICKS)
++- if (options.ftickssyslogfacility) {
++- debug_set_destination(options.ftickssyslogfacility,
++- LOG_TYPE_FTICKS);
++- free(options.ftickssyslogfacility);
++- }
++-#endif
+++ if (options.ftickssyslogfacility) {
+++ debug_set_destination(options.ftickssyslogfacility,
+++ LOG_TYPE_FTICKS);
+++ free(options.ftickssyslogfacility);
++ }
+++#endif
++ free(options.logdestination);
++
++ if (!list_first(clconfs))
+diff --git a/feeds/packages/net/reaver/Makefile b/feeds/packages/net/reaver/Makefile
+new file mode 100644
+index 0000000..9335b59
+--- /dev/null
++++ b/feeds/packages/net/reaver/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2012-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=reaver
++PKG_REV:=113
++PKG_VERSION:=r$(PKG_REV)
++PKG_RELEASE:=2
++PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://reaver-wps.googlecode.com/svn/trunk
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_PROTO:=svn
++PKG_LICENSE:=GPL-2.0
++
++PKG_USE_MIPS16:=0
++PKG_AUTOMAKE_PATHS:=src
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++CONFIGURE_PATH:=src
++MAKE_PATH:=src
++
++define Package/reaver
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=wireless
++ TITLE:=Efficient brute force attack against Wifi Protected Setup
++ URL:=https://code.google.com/p/reaver-wps/
++ DEPENDS:=+libpcap +libsqlite3
++endef
++
++define Package/reaver/description
++ Reaver targets the external registrar functionality mandated by the WiFi
++ Protected Setup specification.
++ Access points will provide authenticated registrars with their current
++ wireless configuration (including the WPA PSK), and also accept a new
++ configuration from the registrar.
++endef
++
++define Package/reaver/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/{reaver,wash} $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/reaver
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/reaver.db $(1)/etc/reaver/
++endef
++
++$(eval $(call BuildPackage,reaver))
+diff --git a/feeds/packages/net/reaver/patches/0001-wpscrack-big-endian-fixes.patch b/feeds/packages/net/reaver/patches/0001-wpscrack-big-endian-fixes.patch
+new file mode 100644
+index 0000000..da76c2e
+--- /dev/null
++++ b/feeds/packages/net/reaver/patches/0001-wpscrack-big-endian-fixes.patch
+@@ -0,0 +1,565 @@
++From 4e7af9f022996cb0a03b30f6af265b757807dfa2 Mon Sep 17 00:00:00 2001
++From: Paul Fertser <fercerpav@gmail.com>
++Date: Wed, 27 Jun 2012 17:44:55 +0400
++Subject: [PATCH 1/3] wpscrack: big-endian fixes
++
++This should fix access to the radiotap, 802.11, LLC/SNAP and WFA
++headers' fields. Run-time tested on an ar71xx BE system.
++
++Signed-off-by: Paul Fertser <fercerpav@gmail.com>
++---
++ src/80211.c | 65 +++++++++++++++++++------------
++ src/builder.c | 23 +++++------
++ src/defs.h | 116 +++++++++++++++++++++++++++++++++++++++-----------------
++ src/exchange.c | 23 ++++++-----
++ src/wpsmon.c | 13 ++++--
++ 5 files changed, 151 insertions(+), 89 deletions(-)
++
++diff --git a/src/80211.c b/src/80211.c
++index c2aff59..19f1e92 100644
++--- a/src/80211.c
+++++ b/src/80211.c
++@@ -90,17 +90,19 @@ void read_ap_beacon()
++ if(header.len >= MIN_BEACON_SIZE)
++ {
++ rt_header = (struct radio_tap_header *) radio_header(packet, header.len);
++- frame_header = (struct dot11_frame_header *) (packet + rt_header->len);
++-
+++ size_t rt_header_len = __le16_to_cpu(rt_header->len);
+++ frame_header = (struct dot11_frame_header *) (packet + rt_header_len);
+++
++ if(is_target(frame_header))
++ {
++- if(frame_header->fc.type == MANAGEMENT_FRAME && frame_header->fc.sub_type == SUBTYPE_BEACON)
+++ if((frame_header->fc & __cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+++ __cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON))
++ {
++- beacon = (struct beacon_management_frame *) (packet + rt_header->len + sizeof(struct dot11_frame_header));
+++ beacon = (struct beacon_management_frame *) (packet + rt_header_len + sizeof(struct dot11_frame_header));
++ set_ap_capability(beacon->capability);
++
++ /* Obtain the SSID and channel number from the beacon packet */
++- tag_offset = rt_header->len + sizeof(struct dot11_frame_header) + sizeof(struct beacon_management_frame);
+++ tag_offset = rt_header_len + sizeof(struct dot11_frame_header) + sizeof(struct beacon_management_frame);
++ channel = parse_beacon_tags(packet, header.len);
++
++ /* If no channel was manually specified, switch to the AP's current channel */
++@@ -135,29 +137,31 @@ int8_t signal_strength(const u_char *packet, size_t len)
++ {
++ header = (struct radio_tap_header *) packet;
++
++- if((header->flags & SSI_FLAG) == SSI_FLAG)
+++ uint32_t flags = __le32_to_cpu(header->flags);
+++
+++ if((flags & SSI_FLAG) == SSI_FLAG)
++ {
++- if((header->flags & TSFT_FLAG) == TSFT_FLAG)
+++ if((flags & TSFT_FLAG) == TSFT_FLAG)
++ {
++ offset += TSFT_SIZE;
++ }
++
++- if((header->flags & FLAGS_FLAG) == FLAGS_FLAG)
+++ if((flags & FLAGS_FLAG) == FLAGS_FLAG)
++ {
++ offset += FLAGS_SIZE;
++ }
++
++- if((header->flags & RATE_FLAG) == RATE_FLAG)
+++ if((flags & RATE_FLAG) == RATE_FLAG)
++ {
++ offset += RATE_SIZE;
++ }
++
++- if((header->flags & CHANNEL_FLAG) == CHANNEL_FLAG)
+++ if((flags & CHANNEL_FLAG) == CHANNEL_FLAG)
++ {
++ offset += CHANNEL_SIZE;
++ }
++
++- if((header->flags & FHSS_FLAG) == FHSS_FLAG)
+++ if((flags & FHSS_FLAG) == FHSS_FLAG)
++ {
++ offset += FHSS_FLAG;
++ }
++@@ -196,11 +200,13 @@ int is_wps_locked()
++ if(header.len >= MIN_BEACON_SIZE)
++ {
++ rt_header = (struct radio_tap_header *) radio_header(packet, header.len);
++- frame_header = (struct dot11_frame_header *) (packet + rt_header->len);
+++ size_t rt_header_len = __le16_to_cpu(rt_header->len);
+++ frame_header = (struct dot11_frame_header *) (packet + rt_header_len);
++
++ if(memcmp(frame_header->addr3, get_bssid(), MAC_ADDR_LEN) == 0)
++ {
++- if(frame_header->fc.type == MANAGEMENT_FRAME && frame_header->fc.sub_type == SUBTYPE_BEACON)
+++ if((frame_header->fc & __cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+++ __cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON))
++ {
++ if(parse_wps_parameters(packet, header.len, &wps))
++ {
++@@ -411,24 +417,30 @@ int associate_recv_loop()
++ if(header.len >= MIN_AUTH_SIZE)
++ {
++ rt_header = (struct radio_tap_header *) radio_header(packet, header.len);
++- dot11_frame = (struct dot11_frame_header *) (packet + rt_header->len);
+++ size_t rt_header_len = __le16_to_cpu(rt_header->len);
+++ dot11_frame = (struct dot11_frame_header *) (packet + rt_header_len);
++
++ if((memcmp(dot11_frame->addr3, get_bssid(), MAC_ADDR_LEN) == 0) &&
++ (memcmp(dot11_frame->addr1, get_mac(), MAC_ADDR_LEN) == 0))
++ {
++- if(dot11_frame->fc.type == MANAGEMENT_FRAME)
+++ if((dot11_frame->fc & __cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
+++ __cpu_to_le16(IEEE80211_FTYPE_MGMT))
++ {
++- auth_frame = (struct authentication_management_frame *) (packet + sizeof(struct dot11_frame_header) + rt_header->len);
++- assoc_frame = (struct association_response_management_frame *) (packet + sizeof(struct dot11_frame_header) + rt_header->len);
+++ auth_frame = (struct authentication_management_frame *) (packet + sizeof(struct dot11_frame_header) + rt_header_len);
+++ assoc_frame = (struct association_response_management_frame *) (packet + sizeof(struct dot11_frame_header) + rt_header_len);
++
++ /* Did we get an authentication packet with a successful status? */
++- if((dot11_frame->fc.sub_type == SUBTYPE_AUTHENTICATION) && (auth_frame->status == AUTHENTICATION_SUCCESS))
+++ if((dot11_frame->fc & __cpu_to_le16(IEEE80211_FCTL_STYPE)) ==
+++ __cpu_to_le16(IEEE80211_STYPE_AUTH)
+++ && (auth_frame->status == __cpu_to_le16(AUTHENTICATION_SUCCESS)))
++ {
++ ret_val = AUTH_OK;
++ break;
++ }
++ /* Did we get an association packet with a successful status? */
++- else if((dot11_frame->fc.sub_type == SUBTYPE_ASSOCIATION) && (assoc_frame->status == ASSOCIATION_SUCCESS))
+++ else if((dot11_frame->fc & __cpu_to_le16(IEEE80211_FCTL_STYPE)) ==
+++ __cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP)
+++ && (assoc_frame->status == __cpu_to_le16(ASSOCIATION_SUCCESS)))
++ {
++ ret_val = ASSOCIATE_OK;
++ break;
++@@ -455,13 +467,14 @@ enum encryption_type supported_encryption(const u_char *packet, size_t len)
++ if(len > MIN_BEACON_SIZE)
++ {
++ rt_header = (struct radio_tap_header *) radio_header(packet, len);
++- beacon = (struct beacon_management_frame *) (packet + rt_header->len + sizeof(struct dot11_frame_header));
++- offset = tag_offset = rt_header->len + sizeof(struct dot11_frame_header) + sizeof(struct beacon_management_frame);
+++ size_t rt_header_len = __le16_to_cpu(rt_header->len);
+++ beacon = (struct beacon_management_frame *) (packet + rt_header_len + sizeof(struct dot11_frame_header));
+++ offset = tag_offset = rt_header_len + sizeof(struct dot11_frame_header) + sizeof(struct beacon_management_frame);
++
++ tag_len = len - tag_offset;
++ tag_data = (const u_char *) (packet + tag_offset);
++
++- if((beacon->capability & CAPABILITY_WEP) == CAPABILITY_WEP)
+++ if((__le16_to_cpu(beacon->capability) & CAPABILITY_WEP) == CAPABILITY_WEP)
++ {
++ enc = WEP;
++
++@@ -509,7 +522,7 @@ int parse_beacon_tags(const u_char *packet, size_t len)
++ struct radio_tap_header *rt_header = NULL;
++
++ rt_header = (struct radio_tap_header *) radio_header(packet, len);
++- tag_offset = rt_header->len + sizeof(struct dot11_frame_header) + sizeof(struct beacon_management_frame);
+++ tag_offset = __le16_to_cpu(rt_header->len) + sizeof(struct dot11_frame_header) + sizeof(struct beacon_management_frame);
++
++ if(tag_offset < len)
++ {
++@@ -548,7 +561,7 @@ int parse_beacon_tags(const u_char *packet, size_t len)
++ {
++ if(ie_len == 1)
++ {
++- memcpy((int *) &channel, channel_data, ie_len);
+++ channel = *(uint8_t*)channel_data;
++ }
++ free(channel_data);
++ }
++@@ -603,13 +616,13 @@ int check_fcs(const u_char *packet, size_t len)
++ if(len > 4)
++ {
++ /* Get the packet's reported FCS (last 4 bytes of the packet) */
++- memcpy((uint32_t *) &fcs, (packet + (len-4)), 4);
+++ fcs = __le32_to_cpu(*(uint32_t*)(packet + (len-4)));
++
++ /* FCS is not calculated over the radio tap header */
++ if(has_rt_header())
++ {
++ rt_header = (struct radio_tap_header *) packet;
++- offset += rt_header->len;
+++ offset += __le16_to_cpu(rt_header->len);
++ }
++
++ if(len > offset)
++diff --git a/src/builder.c b/src/builder.c
++index 37f2de7..6bf89e7 100644
++--- a/src/builder.c
+++++ b/src/builder.c
++@@ -44,9 +44,8 @@ const void *build_radio_tap_header(size_t *len)
++ memset((void *) buf, 0, sizeof(struct radio_tap_header));
++ rt_header = (struct radio_tap_header *) buf;
++
++- rt_header->len = sizeof(struct radio_tap_header);
++-
++- *len = rt_header->len;
+++ *len = sizeof(struct radio_tap_header);
+++ rt_header->len = __cpu_to_le16(*len);
++ }
++
++ return buf;
++@@ -67,9 +66,9 @@ const void *build_dot11_frame_header(uint16_t fc, size_t *len)
++
++ frag_seq += SEQ_MASK;
++
++- header->duration = DEFAULT_DURATION;
++- memcpy((void *) &header->fc, (void *) &fc, sizeof(struct frame_control));
++- header->frag_seq = frag_seq;
+++ header->duration = __cpu_to_le16(DEFAULT_DURATION);
+++ header->fc = __cpu_to_le16(fc);
+++ header->frag_seq = __cpu_to_le16(frag_seq);
++
++ memcpy((void *) header->addr1, get_bssid(), MAC_ADDR_LEN);
++ memcpy((void *) header->addr2, get_mac(), MAC_ADDR_LEN);
++@@ -91,8 +90,8 @@ const void *build_authentication_management_frame(size_t *len)
++ memset((void *) buf, 0, *len);
++ frame = (struct authentication_management_frame *) buf;
++
++- frame->algorithm = OPEN_SYSTEM;
++- frame->sequence = 1;
+++ frame->algorithm = __cpu_to_le16(OPEN_SYSTEM);
+++ frame->sequence = __cpu_to_le16(1);
++ frame->status = 0;
++ }
++
++@@ -111,8 +110,8 @@ const void *build_association_management_frame(size_t *len)
++ memset((void *) buf, 0, *len);
++ frame = (struct association_request_management_frame *) buf;
++
++- frame->capability = get_ap_capability();
++- frame->listen_interval = LISTEN_INTERVAL;
+++ frame->capability = __cpu_to_le16(get_ap_capability());
+++ frame->listen_interval = __cpu_to_le16(LISTEN_INTERVAL);
++ }
++
++ return buf;
++@@ -133,7 +132,7 @@ const void *build_llc_header(size_t *len)
++ header->dsap = LLC_SNAP;
++ header->ssap = LLC_SNAP;
++ header->control_field = UNNUMBERED_FRAME;
++- header->type = DOT1X_AUTHENTICATION;
+++ header->type = __cpu_to_be16(DOT1X_AUTHENTICATION);
++
++ }
++
++@@ -279,7 +278,7 @@ const void *build_wfa_header(uint8_t op_code, size_t *len)
++ header = (struct wfa_expanded_header *) buf;
++
++ memcpy(header->id, WFA_VENDOR_ID, sizeof(header->id));
++- header->type = SIMPLE_CONFIG;
+++ header->type = __cpu_to_be32(SIMPLE_CONFIG);
++ header->opcode = op_code;
++ }
++
++diff --git a/src/defs.h b/src/defs.h
++index b2f45ea..0c628e7 100644
++--- a/src/defs.h
+++++ b/src/defs.h
++@@ -41,6 +41,7 @@
++ #include <string.h>
++ #include <time.h>
++ #include <pcap.h>
+++#include <asm/byteorder.h>
++
++ #include "wps.h"
++
++@@ -65,10 +66,10 @@
++ #define MANAGEMENT_FRAME 0x00
++ #define SUBTYPE_BEACON 0x08
++
++-#define DOT1X_AUTHENTICATION 0x8E88
+++#define DOT1X_AUTHENTICATION 0x888E
++ #define DOT1X_EAP_PACKET 0x00
++
++-#define SIMPLE_CONFIG 0x01000000
+++#define SIMPLE_CONFIG 0x00000001
++
++ #define P1_SIZE 10000
++ #define P2_SIZE 1000
++@@ -282,66 +283,111 @@ enum wfa_elements
++ WEP_TRANSMIT_KEY = 0x10064
++ };
++
+++#define IEEE80211_FCTL_VERS 0x0003
+++#define IEEE80211_FCTL_FTYPE 0x000c
+++#define IEEE80211_FCTL_STYPE 0x00f0
+++#define IEEE80211_FCTL_TODS 0x0100
+++#define IEEE80211_FCTL_FROMDS 0x0200
+++#define IEEE80211_FCTL_MOREFRAGS 0x0400
+++#define IEEE80211_FCTL_RETRY 0x0800
+++#define IEEE80211_FCTL_PM 0x1000
+++#define IEEE80211_FCTL_MOREDATA 0x2000
+++#define IEEE80211_FCTL_PROTECTED 0x4000
+++#define IEEE80211_FCTL_ORDER 0x8000
+++
+++#define IEEE80211_SCTL_FRAG 0x000F
+++#define IEEE80211_SCTL_SEQ 0xFFF0
+++
+++#define IEEE80211_FTYPE_MGMT 0x0000
+++#define IEEE80211_FTYPE_CTL 0x0004
+++#define IEEE80211_FTYPE_DATA 0x0008
+++
+++/* management */
+++#define IEEE80211_STYPE_ASSOC_REQ 0x0000
+++#define IEEE80211_STYPE_ASSOC_RESP 0x0010
+++#define IEEE80211_STYPE_REASSOC_REQ 0x0020
+++#define IEEE80211_STYPE_REASSOC_RESP 0x0030
+++#define IEEE80211_STYPE_PROBE_REQ 0x0040
+++#define IEEE80211_STYPE_PROBE_RESP 0x0050
+++#define IEEE80211_STYPE_BEACON 0x0080
+++#define IEEE80211_STYPE_ATIM 0x0090
+++#define IEEE80211_STYPE_DISASSOC 0x00A0
+++#define IEEE80211_STYPE_AUTH 0x00B0
+++#define IEEE80211_STYPE_DEAUTH 0x00C0
+++#define IEEE80211_STYPE_ACTION 0x00D0
+++
+++/* control */
+++#define IEEE80211_STYPE_BACK_REQ 0x0080
+++#define IEEE80211_STYPE_BACK 0x0090
+++#define IEEE80211_STYPE_PSPOLL 0x00A0
+++#define IEEE80211_STYPE_RTS 0x00B0
+++#define IEEE80211_STYPE_CTS 0x00C0
+++#define IEEE80211_STYPE_ACK 0x00D0
+++#define IEEE80211_STYPE_CFEND 0x00E0
+++#define IEEE80211_STYPE_CFENDACK 0x00F0
+++
+++/* data */
+++#define IEEE80211_STYPE_DATA 0x0000
+++#define IEEE80211_STYPE_DATA_CFACK 0x0010
+++#define IEEE80211_STYPE_DATA_CFPOLL 0x0020
+++#define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030
+++#define IEEE80211_STYPE_NULLFUNC 0x0040
+++#define IEEE80211_STYPE_CFACK 0x0050
+++#define IEEE80211_STYPE_CFPOLL 0x0060
+++#define IEEE80211_STYPE_CFACKPOLL 0x0070
+++#define IEEE80211_STYPE_QOS_DATA 0x0080
+++#define IEEE80211_STYPE_QOS_DATA_CFACK 0x0090
+++#define IEEE80211_STYPE_QOS_DATA_CFPOLL 0x00A0
+++#define IEEE80211_STYPE_QOS_DATA_CFACKPOLL 0x00B0
+++#define IEEE80211_STYPE_QOS_NULLFUNC 0x00C0
+++#define IEEE80211_STYPE_QOS_CFACK 0x00D0
+++#define IEEE80211_STYPE_QOS_CFPOLL 0x00E0
+++#define IEEE80211_STYPE_QOS_CFACKPOLL 0x00F0
+++
++ #pragma pack(1)
++ struct radio_tap_header
++ {
++ uint8_t revision;
++ uint8_t pad;
++- uint16_t len;
++- uint32_t flags;
++-};
++-
++-struct frame_control
++-{
++- unsigned version : 2;
++- unsigned type : 2;
++- unsigned sub_type : 4;
++-
++- unsigned to_ds : 1;
++- unsigned from_ds : 1;
++- unsigned more_frag : 1;
++- unsigned retry : 1;
++- unsigned pwr_mgt : 1;
++- unsigned more_data : 1;
++- unsigned protected_frame : 1;
++- unsigned order : 1;
+++ __le16 len;
+++ __le32 flags;
++ };
++
++ struct dot11_frame_header
++ {
++- struct frame_control fc;
++- uint16_t duration;
+++ __le16 fc;
+++ __le16 duration;
++ unsigned char addr1[MAC_ADDR_LEN];
++ unsigned char addr2[MAC_ADDR_LEN];
++ unsigned char addr3[MAC_ADDR_LEN];
++- uint16_t frag_seq;
+++ __le16 frag_seq;
++ };
++
++ struct authentication_management_frame
++ {
++- uint16_t algorithm;
++- uint16_t sequence;
++- uint16_t status;
+++ __le16 algorithm;
+++ __le16 sequence;
+++ __le16 status;
++ };
++
++ struct association_request_management_frame
++ {
++- uint16_t capability;
++- uint16_t listen_interval;
+++ __le16 capability;
+++ __le16 listen_interval;
++ };
++
++ struct association_response_management_frame
++ {
++- uint16_t capability;
++- uint16_t status;
++- uint16_t id;
+++ __le16 capability;
+++ __le16 status;
+++ __le16 id;
++ };
++
++ struct beacon_management_frame
++ {
++ unsigned char timestamp[TIMESTAMP_LEN];
++- uint16_t beacon_interval;
++- uint16_t capability;
+++ __le16 beacon_interval;
+++ __le16 capability;
++ };
++
++ struct llc_header
++@@ -350,7 +396,7 @@ struct llc_header
++ uint8_t ssap;
++ uint8_t control_field;
++ unsigned char org_code[3];
++- uint16_t type;
+++ __be16 type;
++ };
++
++ struct dot1X_header
++@@ -371,7 +417,7 @@ struct eap_header
++ struct wfa_expanded_header
++ {
++ unsigned char id[3];
++- uint32_t type;
+++ __be32 type;
++ uint8_t opcode;
++ uint8_t flags;
++ };
++diff --git a/src/exchange.c b/src/exchange.c
++index 23c87e9..4f9a82b 100644
++--- a/src/exchange.c
+++++ b/src/exchange.c
++@@ -306,26 +306,27 @@ enum wps_type process_packet(const u_char *packet, struct pcap_pkthdr *header)
++
++ /* Cast the radio tap and 802.11 frame headers and parse out the Frame Control field */
++ rt_header = (struct radio_tap_header *) packet;
++- frame_header = (struct dot11_frame_header *) (packet+rt_header->len);
+++ size_t rt_header_len = __le16_to_cpu(rt_header->len);
+++ frame_header = (struct dot11_frame_header *) (packet+rt_header_len);
++
++ /* Does the BSSID/source address match our target BSSID? */
++ if(memcmp(frame_header->addr3, get_bssid(), MAC_ADDR_LEN) == 0)
++ {
++ /* Is this a data packet sent to our MAC address? */
++- if(frame_header->fc.type == DATA_FRAME &&
++- frame_header->fc.sub_type == SUBTYPE_DATA &&
++- (memcmp(frame_header->addr1, get_mac(), MAC_ADDR_LEN) == 0))
+++ if (((frame_header->fc & __cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
+++ __cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA)) &&
+++ (memcmp(frame_header->addr1, get_mac(), MAC_ADDR_LEN) == 0))
++ {
++ llc = (struct llc_header *) (packet +
++- rt_header->len +
+++ rt_header_len +
++ sizeof(struct dot11_frame_header)
++ );
++
++ /* All packets in our exchanges will be 802.1x */
++- if(llc->type == DOT1X_AUTHENTICATION)
+++ if(llc->type == __cpu_to_be16(DOT1X_AUTHENTICATION))
++ {
++ dot1x = (struct dot1X_header *) (packet +
++- rt_header->len +
+++ rt_header_len +
++ sizeof(struct dot11_frame_header) +
++ sizeof(struct llc_header)
++ );
++@@ -334,7 +335,7 @@ enum wps_type process_packet(const u_char *packet, struct pcap_pkthdr *header)
++ if(dot1x->type == DOT1X_EAP_PACKET && (header->len >= EAP_PACKET_SIZE))
++ {
++ eap = (struct eap_header *) (packet +
++- rt_header->len +
+++ rt_header_len +
++ sizeof(struct dot11_frame_header) +
++ sizeof(struct llc_header) +
++ sizeof(struct dot1X_header)
++@@ -366,7 +367,7 @@ enum wps_type process_packet(const u_char *packet, struct pcap_pkthdr *header)
++ else if((eap->type == EAP_EXPANDED) && (header->len > WFA_PACKET_SIZE))
++ {
++ wfa = (struct wfa_expanded_header *) (packet +
++- rt_header->len +
+++ rt_header_len +
++ sizeof(struct dot11_frame_header) +
++ sizeof(struct llc_header) +
++ sizeof(struct dot1X_header) +
++@@ -374,14 +375,14 @@ enum wps_type process_packet(const u_char *packet, struct pcap_pkthdr *header)
++ );
++
++ /* Verify that this is a WPS message */
++- if(wfa->type == SIMPLE_CONFIG)
+++ if(wfa->type == __cpu_to_be32(SIMPLE_CONFIG))
++ {
++ wps_msg_len = (size_t) ntohs(eap->len) -
++ sizeof(struct eap_header) -
++ sizeof(struct wfa_expanded_header);
++
++ wps_msg = (const void *) (packet +
++- rt_header->len +
+++ rt_header_len +
++ sizeof(struct dot11_frame_header) +
++ sizeof(struct llc_header) +
++ sizeof(struct dot1X_header) +
++diff --git a/src/wpsmon.c b/src/wpsmon.c
++index d976924..22a394f 100644
++--- a/src/wpsmon.c
+++++ b/src/wpsmon.c
++@@ -295,7 +295,8 @@ void parse_wps_settings(const u_char *packet, struct pcap_pkthdr *header, char *
++ }
++
++ rt_header = (struct radio_tap_header *) radio_header(packet, header->len);
++- frame_header = (struct dot11_frame_header *) (packet + rt_header->len);
+++ size_t rt_header_len = __le16_to_cpu(rt_header->len);
+++ frame_header = (struct dot11_frame_header *) (packet + rt_header_len);
++
++ /* If a specific BSSID was specified, only parse packets from that BSSID */
++ if(!is_target(frame_header))
++@@ -323,15 +324,17 @@ void parse_wps_settings(const u_char *packet, struct pcap_pkthdr *header, char *
++ channel_changed = 1;
++ }
++
++- if(frame_header->fc.sub_type == PROBE_RESPONSE ||
++- frame_header->fc.sub_type == SUBTYPE_BEACON)
+++ unsigned fsub_type = frame_header->fc & __cpu_to_le16(IEEE80211_FCTL_STYPE);
+++
+++ if(fsub_type == __cpu_to_le16(IEEE80211_STYPE_PROBE_RESP) ||
+++ fsub_type == __cpu_to_le16(IEEE80211_STYPE_BEACON))
++ {
++ wps_parsed = parse_wps_parameters(packet, header->len, wps);
++ }
++
++ if(!is_done(bssid) && (get_channel() == channel || source == PCAP_FILE))
++ {
++- if(frame_header->fc.sub_type == SUBTYPE_BEACON &&
+++ if(fsub_type == __cpu_to_le16(IEEE80211_STYPE_BEACON) &&
++ mode == SCAN &&
++ !passive &&
++ should_probe(bssid))
++@@ -369,7 +372,7 @@ void parse_wps_settings(const u_char *packet, struct pcap_pkthdr *header, char *
++ * If there was no WPS information, then the AP does not support WPS and we should ignore it from here on.
++ * If this was a probe response, then we've gotten all WPS info we can get from this AP and should ignore it from here on.
++ */
++- if(!wps_parsed || frame_header->fc.sub_type == PROBE_RESPONSE)
+++ if(!wps_parsed || fsub_type == __cpu_to_le16(IEEE80211_STYPE_PROBE_RESP))
++ {
++ mark_ap_complete(bssid);
++ }
++--
++1.7.7
++
+diff --git a/feeds/packages/net/reaver/patches/0002-Use-the-current-directory-for-storing-and-loading-se.patch b/feeds/packages/net/reaver/patches/0002-Use-the-current-directory-for-storing-and-loading-se.patch
+new file mode 100644
+index 0000000..dd1bb42
+--- /dev/null
++++ b/feeds/packages/net/reaver/patches/0002-Use-the-current-directory-for-storing-and-loading-se.patch
+@@ -0,0 +1,53 @@
++From cd444949f3176790101b8bdc9656831a03d8c01d Mon Sep 17 00:00:00 2001
++From: Paul Fertser <fercerpav@gmail.com>
++Date: Tue, 10 Jul 2012 11:13:29 +0400
++Subject: [PATCH 2/3] Use the current directory for storing and loading
++ sessions
++
++This allows the user to always explicitely choose (by changing the
++current directory before launching the program) where the session
++files should go. Useful e.g. to avoid hogging the precious space on
++embedded devices, just cd /tmp before starting the app.
++
++Signed-off-by: Paul Fertser <fercerpav@gmail.com>
++---
++ src/session.c | 16 +++-------------
++ 1 files changed, 3 insertions(+), 13 deletions(-)
++
++diff --git a/src/session.c b/src/session.c
++index d3af0c3..308f213 100644
++--- a/src/session.c
+++++ b/src/session.c
++@@ -62,7 +62,7 @@ int restore_session()
++ memset(file, 0, FILENAME_MAX);
++
++ bssid = mac2str(get_bssid(), '\0');
++- snprintf(file, FILENAME_MAX, "%s/%s.%s", CONF_DIR, bssid, CONF_EXT);
+++ snprintf(file, FILENAME_MAX, "%s.%s", bssid, CONF_EXT);
++ free(bssid);
++ }
++
++@@ -199,18 +199,8 @@ int save_session()
++ }
++ else
++ {
++- /*
++- * If the configuration directory exists, save the session file there; else, save it to the
++- * current working directory.
++- */
++- if(configuration_directory_exists())
++- {
++- snprintf((char *) &file_name, FILENAME_MAX, "%s/%s.%s", CONF_DIR, bssid, CONF_EXT);
++- }
++- else
++- {
++- snprintf((char *) &file_name, FILENAME_MAX, "%s.%s", bssid, CONF_EXT);
++- }
+++ /* save session to the current directory */
+++ snprintf((char *) &file_name, FILENAME_MAX, "%s.%s", bssid, CONF_EXT);
++ }
++
++ /* Don't bother saving anything if nothing has been done */
++--
++1.7.7
++
+diff --git a/feeds/packages/net/reaver/patches/0003-wash-wpsmon-use-less-useless-spaces-in-output-to-fit.patch b/feeds/packages/net/reaver/patches/0003-wash-wpsmon-use-less-useless-spaces-in-output-to-fit.patch
+new file mode 100644
+index 0000000..64b290b
+--- /dev/null
++++ b/feeds/packages/net/reaver/patches/0003-wash-wpsmon-use-less-useless-spaces-in-output-to-fit.patch
+@@ -0,0 +1,38 @@
++From 638bb8d70d6c7e5dc99975e0bf57d8ce0455e2cc Mon Sep 17 00:00:00 2001
++From: Paul Fertser <fercerpav@gmail.com>
++Date: Tue, 10 Jul 2012 11:25:00 +0400
++Subject: [PATCH 3/3] wash/wpsmon: use less useless spaces in output to fit
++ narrow terminals
++
++Signed-off-by: Paul Fertser <fercerpav@gmail.com>
++---
++ src/wpsmon.c | 6 +++---
++ 1 files changed, 3 insertions(+), 3 deletions(-)
++
++diff --git a/src/wpsmon.c b/src/wpsmon.c
++index 22a394f..e0948b3 100644
++--- a/src/wpsmon.c
+++++ b/src/wpsmon.c
++@@ -262,8 +262,8 @@ void monitor(char *bssid, int passive, int source, int channel, int mode)
++
++ if(!header_printed)
++ {
++- cprintf(INFO, "BSSID Channel RSSI WPS Version WPS Locked ESSID\n");
++- cprintf(INFO, "---------------------------------------------------------------------------------------------------------------\n");
+++ cprintf(INFO, "BSSID Channel RSSI WPS Version WPS Locked ESSID\n");
+++ cprintf(INFO, "--------------------------------------------------------------------------------------\n");
++ header_printed = 1;
++ }
++
++@@ -360,7 +360,7 @@ void parse_wps_settings(const u_char *packet, struct pcap_pkthdr *header, char *
++ break;
++ }
++
++- cprintf(INFO, "%17s %2d %.2d %d.%d %s %s\n", bssid, channel, rssi, (wps->version >> 4), (wps->version & 0x0F), lock_display, ssid);
+++ cprintf(INFO, "%17s %2d %.2d %d.%d %s %s\n", bssid, channel, rssi, (wps->version >> 4), (wps->version & 0x0F), lock_display, ssid);
++ }
++
++ if(probe_sent)
++--
++1.7.7
++
+diff --git a/feeds/packages/net/reaver/patches/0100-Include-sys-types.h-for-definition-of-u_char.patch b/feeds/packages/net/reaver/patches/0100-Include-sys-types.h-for-definition-of-u_char.patch
+new file mode 100644
+index 0000000..541968a
+--- /dev/null
++++ b/feeds/packages/net/reaver/patches/0100-Include-sys-types.h-for-definition-of-u_char.patch
+@@ -0,0 +1,27 @@
++From 811f5c0b0a226edfbf5aa2f316e083f30ec3cd8d Mon Sep 17 00:00:00 2001
++From: Yousong Zhou <yszhou4tech@gmail.com>
++Date: Tue, 18 Aug 2015 14:34:26 +0800
++Subject: [PATCH] Include <sys/types.h> for definition of u_char.
++
++Fixes build with musl-libc.
++
++Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
++---
++ src/libwps/libwps.h | 1 +
++ 1 file changed, 1 insertion(+)
++
++diff --git a/src/libwps/libwps.h b/src/libwps/libwps.h
++index b04dd8b..bdd7b9a 100755
++--- a/src/libwps/libwps.h
+++++ b/src/libwps/libwps.h
++@@ -17,6 +17,7 @@
++ #include <stdio.h>
++ #include <string.h>
++ #include <arpa/inet.h>
+++#include <sys/types.h>
++
++ #define LIBWPS_MAX_STR_LEN 256
++
++--
++1.7.10.4
++
+diff --git a/feeds/packages/net/redsocks/Makefile b/feeds/packages/net/redsocks/Makefile
+new file mode 100644
+index 0000000..caf541e
+--- /dev/null
++++ b/feeds/packages/net/redsocks/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=redsocks
++PKG_VERSION:=0.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://github.com/darkk/redsocks.git
++PKG_SOURCE_VERSION:=release-0.4
++
++PKG_MAINTAINER:=Johannes Morgenroth <jm@m-network.de>
++PKG_LICENSE:=Apache-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/redsocks
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libevent2
++ TITLE:=Redirect any TCP connection to a SOCKS or HTTPS proxy server
++endef
++
++define Package/redsocks/conffiles
++/etc/redsocks.conf
++endef
++
++define Package/redsocks/description
++ Redsocks is a daemon running on the local system, that will transparently
++ tunnel any TCP connection via a remote SOCKS4, SOCKS5 or HTTP proxy server. It
++ uses the system firewall's redirection facility to intercept TCP connections,
++ thus the redirection is system-wide, with fine-grained control, and does
++ not depend on LD_PRELOAD libraries.
++
++ Redsocks supports tunneling TCP connections and UDP packets. It has
++ authentication support for both, SOCKS and HTTP proxies.
++
++ Also included is a small DNS server returning answers with the "truncated" flag
++ set for any UDP query, forcing the resolver to use TCP.
++endef
++
++define Package/redsocks/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/redsocks $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) files/redsocks.init $(1)/etc/init.d/redsocks
++ $(INSTALL_CONF) files/redsocks.conf $(1)/etc/
++endef
++
++$(eval $(call BuildPackage,redsocks))
+diff --git a/feeds/packages/net/redsocks/files/redsocks.conf b/feeds/packages/net/redsocks/files/redsocks.conf
+new file mode 100644
+index 0000000..64307c7
+--- /dev/null
++++ b/feeds/packages/net/redsocks/files/redsocks.conf
+@@ -0,0 +1,108 @@
++base {
++ // debug: connection progress & client list on SIGUSR1
++ log_debug = off;
++
++ // info: start and end of client session
++ log_info = on;
++
++ /* possible `log' values are:
++ * stderr
++ * "file:/path/to/file"
++ * syslog:FACILITY facility is any of "daemon", "local0"..."local7"
++ */
++ // log = stderr;
++ // log = "file:/path/to/file";
++ log = "syslog:local7";
++
++ // detach from console
++ daemon = on;
++
++ /* Change uid, gid and root directory, these options require root
++ * privilegies on startup.
++ * Note, your chroot may requre /etc/localtime if you write log to syslog.
++ * Log is opened before chroot & uid changing.
++ */
++ // user = nobody;
++ // group = nobody;
++ // chroot = "/var/chroot";
++
++ /* possible `redirector' values are:
++ * iptables - for Linux
++ * ipf - for FreeBSD
++ * pf - for OpenBSD
++ * generic - some generic redirector that MAY work
++ */
++ redirector = iptables;
++}
++
++redsocks {
++ /* `local_ip' defaults to 127.0.0.1 for security reasons,
++ * use 0.0.0.0 if you want to listen on every interface.
++ * `local_*' are used as port to redirect to.
++ */
++ local_ip = 127.0.0.1;
++ local_port = 12345;
++
++ // listen() queue length. Default value is SOMAXCONN and it should be
++ // good enough for most of us.
++ // listenq = 128; // SOMAXCONN equals 128 on my Linux box.
++
++ // `max_accept_backoff` is a delay to retry `accept()` after accept
++ // failure (e.g. due to lack of file descriptors). It's measured in
++ // milliseconds and maximal value is 65535. `min_accept_backoff` is
++ // used as initial backoff value and as a damper for `accept() after
++ // close()` logic.
++ // min_accept_backoff = 100;
++ // max_accept_backoff = 60000;
++
++ // `ip' and `port' are IP and tcp-port of proxy-server
++ // You can also use hostname instead of IP, only one (random)
++ // address of multihomed host will be used.
++ ip = example.org;
++ port = 1080;
++
++
++ // known types: socks4, socks5, http-connect, http-relay
++ type = socks5;
++
++ // login = "foobar";
++ // password = "baz";
++}
++
++redudp {
++ // `local_ip' should not be 0.0.0.0 as it's also used for outgoing
++ // packets that are sent as replies - and it should be fixed
++ // if we want NAT to work properly.
++ local_ip = 127.0.0.1;
++ local_port = 10053;
++
++ // `ip' and `port' of socks5 proxy server.
++ ip = 10.0.0.1;
++ port = 1080;
++ login = username;
++ password = pazzw0rd;
++
++ // redsocks knows about two options while redirecting UDP packets at
++ // linux: TPROXY and REDIRECT. TPROXY requires more complex routing
++ // configuration and fresh kernel (>= 2.6.37 according to squid
++ // developers[1]) but has hack-free way to get original destination
++ // address, REDIRECT is easier to configure, but requires `dest_ip` and
++ // `dest_port` to be set, limiting packet redirection to single
++ // destination.
++ // [1] http://wiki.squid-cache.org/Features/Tproxy4
++ dest_ip = 8.8.8.8;
++ dest_port = 53;
++
++ udp_timeout = 30;
++ udp_timeout_stream = 180;
++}
++
++dnstc {
++ // fake and really dumb DNS server that returns "truncated answer" to
++ // every query via UDP, RFC-compliant resolver should repeat same query
++ // via TCP in this case.
++ local_ip = 127.0.0.1;
++ local_port = 5300;
++}
++
++// you can add more `redsocks' and `redudp' sections if you need.
+diff --git a/feeds/packages/net/redsocks/files/redsocks.init b/feeds/packages/net/redsocks/files/redsocks.init
+new file mode 100644
+index 0000000..56c9de3
+--- /dev/null
++++ b/feeds/packages/net/redsocks/files/redsocks.init
+@@ -0,0 +1,36 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007 OpenWrt.org
++
++START=90
++
++# check if configuration exists
++[ -e "/etc/redsocks.conf" ] || exit 0
++
++start() {
++ if [ -e "/var/run/redsocks.pid" ]; then
++ echo "redsocks is already running"
++ exit 0
++ fi
++
++ /bin/echo -n "running redsocks ..."
++
++ # startup the safety-wrapper for the daemon
++ /usr/sbin/redsocks -p /var/run/redsocks.pid
++
++ /bin/echo " done"
++}
++
++stop() {
++ if [ ! -e "/var/run/redsocks.pid" ]; then
++ echo "redsocks is not running"
++ exit 0
++ fi
++
++ /bin/echo -n "stopping redsocks ..."
++
++ # kill the process
++ /bin/kill $(cat /var/run/redsocks.pid)
++ rm /var/run/redsocks.pid
++
++ echo " done"
++}
+diff --git a/feeds/packages/net/redsocks/patches/0001-Fix-bug-in-DNS-resolution-results-were-ignored-since.patch b/feeds/packages/net/redsocks/patches/0001-Fix-bug-in-DNS-resolution-results-were-ignored-since.patch
+new file mode 100644
+index 0000000..595be19
+--- /dev/null
++++ b/feeds/packages/net/redsocks/patches/0001-Fix-bug-in-DNS-resolution-results-were-ignored-since.patch
+@@ -0,0 +1,53 @@
++From 290f19972e9f7b74f818ae211cb535e32f1f314f Mon Sep 17 00:00:00 2001
++From: Leonid Evdokimov <leon@darkk.net.ru>
++Date: Tue, 10 Apr 2012 00:57:26 +0400
++Subject: [PATCH 01/12] Fix bug in DNS resolution - results were ignored (since
++ 8179a1ff).
++
++---
++ parser.c | 10 +++++-----
++ 1 file changed, 5 insertions(+), 5 deletions(-)
++
++diff --git a/parser.c b/parser.c
++index 85d3533..6198828 100644
++--- a/parser.c
+++++ b/parser.c
++@@ -295,22 +295,22 @@ static int vp_in_addr(parser_context *context, void *addr, const char *token)
++ memcpy(addr, &ia, sizeof(ia));
++ }
++ else {
++- struct addrinfo *addr, hints;
+++ struct addrinfo *ainfo, hints;
++ int err;
++ memset(&hints, 0, sizeof(hints));
++ hints.ai_family = AF_INET; /* IPv4-only */
++ hints.ai_socktype = SOCK_STREAM; /* I want to have one address once and ONLY once, that's why I specify socktype and protocol */
++ hints.ai_protocol = IPPROTO_TCP;
++ hints.ai_flags = AI_ADDRCONFIG; /* I don't need IPv4 addrs without IPv4 connectivity */
++- err = getaddrinfo(token, NULL, &hints, &addr);
+++ err = getaddrinfo(token, NULL, &hints, &ainfo);
++ if (err == 0) {
++ int count, taken;
++ struct addrinfo *iter;
++ struct sockaddr_in *resolved_addr;
++- for (iter = addr, count = 0; iter; iter = iter->ai_next, ++count)
+++ for (iter = ainfo, count = 0; iter; iter = iter->ai_next, ++count)
++ ;
++ taken = rand() % count;
++- for (iter = addr; taken > 0; iter = iter->ai_next, --taken)
+++ for (iter = ainfo; taken > 0; iter = iter->ai_next, --taken)
++ ;
++ resolved_addr = (struct sockaddr_in*)iter->ai_addr;
++ assert(resolved_addr->sin_family == iter->ai_family && iter->ai_family == AF_INET);
++@@ -318,7 +318,7 @@ static int vp_in_addr(parser_context *context, void *addr, const char *token)
++ log_error(LOG_WARNING, "%s resolves to %d addresses, using %s",
++ token, count, inet_ntoa(resolved_addr->sin_addr));
++ memcpy(addr, &resolved_addr->sin_addr, sizeof(ia));
++- freeaddrinfo(addr);
+++ freeaddrinfo(ainfo);
++ }
++ else {
++ if (err == EAI_SYSTEM)
++--
++1.9.1
++
+diff --git a/feeds/packages/net/redsocks/patches/0002-inet_ntop-red_inet_ntop.patch b/feeds/packages/net/redsocks/patches/0002-inet_ntop-red_inet_ntop.patch
+new file mode 100644
+index 0000000..058556e
+--- /dev/null
++++ b/feeds/packages/net/redsocks/patches/0002-inet_ntop-red_inet_ntop.patch
+@@ -0,0 +1,161 @@
++From 6015b3a6f26e04dd5d78cd6c1320886fc9035612 Mon Sep 17 00:00:00 2001
++From: Leonid Evdokimov <leon@darkk.net.ru>
++Date: Tue, 10 Apr 2012 01:37:34 +0400
++Subject: [PATCH 02/12] inet_ntop -> red_inet_ntop
++
++---
++ redsocks.c | 13 ++++---------
++ redudp.c | 19 +++++++++++--------
++ utils.c | 37 +++++++++++++++++++++++++++++++++----
++ utils.h | 7 +++++++
++ 4 files changed, 55 insertions(+), 21 deletions(-)
++
++diff --git a/redsocks.c b/redsocks.c
++index d085e10..ba5eab2 100644
++--- a/redsocks.c
+++++ b/redsocks.c
++@@ -207,22 +207,17 @@ void redsocks_log_write_plain(
++ int saved_errno = errno;
++ struct evbuffer *fmt = evbuffer_new();
++ va_list ap;
++- char clientaddr_str[INET6_ADDRSTRLEN], destaddr_str[INET6_ADDRSTRLEN];
+++ char clientaddr_str[RED_INET_ADDRSTRLEN], destaddr_str[RED_INET_ADDRSTRLEN];
++
++ if (!fmt) {
++ log_errno(LOG_ERR, "evbuffer_new()");
++ // no return, as I have to call va_start/va_end
++ }
++
++- if (!inet_ntop(clientaddr->sin_family, &clientaddr->sin_addr, clientaddr_str, sizeof(clientaddr_str)))
++- strncpy(clientaddr_str, "???", sizeof(clientaddr_str));
++- if (!inet_ntop(destaddr->sin_family, &destaddr->sin_addr, destaddr_str, sizeof(destaddr_str)))
++- strncpy(destaddr_str, "???", sizeof(destaddr_str));
++-
++ if (fmt) {
++- evbuffer_add_printf(fmt, "[%s:%i->%s:%i]: %s",
++- clientaddr_str, ntohs(clientaddr->sin_port),
++- destaddr_str, ntohs(destaddr->sin_port),
+++ evbuffer_add_printf(fmt, "[%s->%s]: %s",
+++ red_inet_ntop(clientaddr, clientaddr_str, sizeof(clientaddr_str)),
+++ red_inet_ntop(destaddr, destaddr_str, sizeof(destaddr_str)),
++ orig_fmt);
++ }
++
++diff --git a/redudp.c b/redudp.c
++index 0a97852..9516a50 100644
++--- a/redudp.c
+++++ b/redudp.c
++@@ -436,10 +436,9 @@ static void redudp_pkt_from_socks(int fd, short what, void *_arg)
++ return;
++
++ if (memcmp(&udprelayaddr, &client->udprelayaddr, sizeof(udprelayaddr)) != 0) {
++- char buf[INET6_ADDRSTRLEN];
++- const char *addr = inet_ntop(udprelayaddr.sin_family, &udprelayaddr.sin_addr, buf, sizeof(buf));
++- redudp_log_error(client, LOG_NOTICE, "Got packet from unexpected address %s:%u.",
++- addr ? addr : "?", ntohs(udprelayaddr.sin_port));
+++ char buf[RED_INET_ADDRSTRLEN];
+++ redudp_log_error(client, LOG_NOTICE, "Got packet from unexpected address %s.",
+++ red_inet_ntop(&udprelayaddr, buf, sizeof(buf)));
++ return;
++ }
++
++@@ -459,10 +458,14 @@ static void redudp_pkt_from_socks(int fd, short what, void *_arg)
++ if (pkt.header.ip.port != client->instance->config.destaddr.sin_port ||
++ pkt.header.ip.addr != client->instance->config.destaddr.sin_addr.s_addr)
++ {
++- char buf[INET6_ADDRSTRLEN];
++- const char *addr = inet_ntop(AF_INET, &pkt.header.ip.addr, buf, sizeof(buf));
++- redudp_log_error(client, LOG_NOTICE, "Socks5 server relayed packet from unexpected address %s:%u.",
++- addr ? addr : "?", ntohs(pkt.header.ip.port));
+++ char buf[RED_INET_ADDRSTRLEN];
+++ struct sockaddr_in pktaddr = {
+++ .sin_family = AF_INET,
+++ .sin_addr = { pkt.header.ip.addr },
+++ .sin_port = pkt.header.ip.port,
+++ };
+++ redudp_log_error(client, LOG_NOTICE, "Socks5 server relayed packet from unexpected address %s.",
+++ red_inet_ntop(&pktaddr, buf, sizeof(buf)));
++ return;
++ }
++
++diff --git a/utils.c b/utils.c
++index c6ced51..6e1f3af 100644
++--- a/utils.c
+++++ b/utils.c
++@@ -18,6 +18,7 @@
++ #include <errno.h>
++ #include <assert.h>
++ #include <fcntl.h>
+++#include <string.h>
++ #include <sys/socket.h>
++ #include <netinet/in.h>
++ #include <arpa/inet.h>
++@@ -42,10 +43,9 @@ int red_recv_udp_pkt(int fd, char *buf, size_t buflen, struct sockaddr_in *inadd
++ }
++
++ if (pktlen >= buflen) {
++- char buf[INET6_ADDRSTRLEN];
++- const char *addr = inet_ntop(inaddr->sin_family, &inaddr->sin_addr, buf, sizeof(buf));
++- log_error(LOG_WARNING, "wow! Truncated udp packet of size %zd from %s:%u! impossible! dropping it...",
++- pktlen, addr ? addr : "?", ntohs(inaddr->sin_port));
+++ char buf[RED_INET_ADDRSTRLEN];
+++ log_error(LOG_WARNING, "wow! Truncated udp packet of size %zd from %s! impossible! dropping it...",
+++ pktlen, red_inet_ntop(inaddr, buf, sizeof(buf)));
++ return -1;
++ }
++
++@@ -176,4 +176,33 @@ int red_is_socket_connected_ok(struct bufferevent *buffev)
++ }
++ }
++
+++char *red_inet_ntop(const struct sockaddr_in* sa, char* buffer, size_t buffer_size)
+++{
+++ const char *retval = 0;
+++ size_t len = 0;
+++ uint16_t port;
+++ const char placeholder[] = "???:???";
+++
+++ assert(buffer_size >= sizeof(placeholder));
+++
+++ memset(buffer, buffer_size, 0);
+++ if (sa->sin_family == AF_INET) {
+++ retval = inet_ntop(AF_INET, &sa->sin_addr, buffer, buffer_size);
+++ port = ((struct sockaddr_in*)sa)->sin_port;
+++ }
+++ else if (sa->sin_family == AF_INET6) {
+++ retval = inet_ntop(AF_INET6, &((const struct sockaddr_in6*)sa)->sin6_addr, buffer, buffer_size);
+++ port = ((struct sockaddr_in6*)sa)->sin6_port;
+++ }
+++ if (retval) {
+++ assert(retval == buffer);
+++ len = strlen(retval);
+++ snprintf(buffer + len, buffer_size - len, ":%d", ntohs(port));
+++ }
+++ else {
+++ strcpy(buffer, placeholder);
+++ }
+++ return buffer;
+++}
+++
++ /* vim:set tabstop=4 softtabstop=4 shiftwidth=4: */
++diff --git a/utils.h b/utils.h
++index f691b77..d3af00f 100644
++--- a/utils.h
+++++ b/utils.h
++@@ -57,6 +57,13 @@ int fcntl_nonblock(int fd);
++ (what) & EVBUFFER_TIMEOUT ? "EVBUFFER_TIMEOUT" : "0", \
++ (what) & ~(EVBUFFER_READ|EVBUFFER_WRITE|EVBUFFER_EOF|EVBUFFER_ERROR|EVBUFFER_TIMEOUT)
++
+++#if INET6_ADDRSTRLEN < INET_ADDRSTRLEN
+++# error Impossible happens: INET6_ADDRSTRLEN < INET_ADDRSTRLEN
+++#else
+++# define RED_INET_ADDRSTRLEN (INET6_ADDRSTRLEN + 1 + 5 + 1) // addr + : + port + \0
+++#endif
+++char *red_inet_ntop(const struct sockaddr_in* sa, char* buffer, size_t buffer_size);
+++
++ /* vim:set tabstop=4 softtabstop=4 shiftwidth=4: */
++ /* vim:set foldmethod=marker foldlevel=32 foldmarker={,}: */
++ #endif /* UTILS_H_SAT_FEB__2_02_24_05_2008 */
++--
++1.9.1
++
+diff --git a/feeds/packages/net/redsocks/patches/0003-Initial-support-for-UDP-TPROXY-redirection.-No-more-.patch b/feeds/packages/net/redsocks/patches/0003-Initial-support-for-UDP-TPROXY-redirection.-No-more-.patch
+new file mode 100644
+index 0000000..b89f4be
+--- /dev/null
++++ b/feeds/packages/net/redsocks/patches/0003-Initial-support-for-UDP-TPROXY-redirection.-No-more-.patch
+@@ -0,0 +1,449 @@
++From 709646d59d96cb73a7e70347f37de9823e4e5f14 Mon Sep 17 00:00:00 2001
++From: Leonid Evdokimov <leon@darkk.net.ru>
++Date: Fri, 13 Apr 2012 01:57:23 +0400
++Subject: [PATCH 03/12] Initial support for UDP + TPROXY redirection. No more
++ dest_ip in redudp.
++
++ * TPROXY requires Linux 2.6.29+ (see man 7 ip[1]).
++ * all redsocks code is running as root to bind to arbitrary port.
++ * Non-Linux and old-Linux builds are broken at the moment.
++
++[1] http://www.kernel.org/doc/man-pages/online/pages/man7/ip.7.html
++---
++ dnstc.c | 2 +-
++ redudp.c | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
++ redudp.h | 2 +
++ utils.c | 43 +++++++++++++-
++ utils.h | 2 +-
++ 5 files changed, 227 insertions(+), 19 deletions(-)
++
++diff --git a/dnstc.c b/dnstc.c
++index 43881d8..5f9fedd 100644
++--- a/dnstc.c
+++++ b/dnstc.c
++@@ -68,7 +68,7 @@ static void dnstc_pkt_from_client(int fd, short what, void *_arg)
++ ssize_t pktlen, outgoing;
++
++ assert(fd == EVENT_FD(&self->listener));
++- pktlen = red_recv_udp_pkt(fd, buf.raw, sizeof(buf), &clientaddr);
+++ pktlen = red_recv_udp_pkt(fd, buf.raw, sizeof(buf), &clientaddr, NULL);
++ if (pktlen == -1)
++ return;
++
++diff --git a/redudp.c b/redudp.c
++index 9516a50..262af3e 100644
++--- a/redudp.c
+++++ b/redudp.c
++@@ -15,6 +15,7 @@
++ */
++
++ #include <stdlib.h>
+++#include <search.h>
++ #include <string.h>
++ #include <sys/types.h>
++ #include <sys/uio.h>
++@@ -33,30 +34,157 @@
++ #include "redudp.h"
++
++ #define redudp_log_error(client, prio, msg...) \
++- redsocks_log_write_plain(__FILE__, __LINE__, __func__, 0, &(client)->clientaddr, &(client)->instance->config.destaddr, prio, ## msg)
+++ redsocks_log_write_plain(__FILE__, __LINE__, __func__, 0, &(client)->clientaddr, get_destaddr(client), prio, ## msg)
++ #define redudp_log_errno(client, prio, msg...) \
++- redsocks_log_write_plain(__FILE__, __LINE__, __func__, 1, &(client)->clientaddr, &(client)->instance->config.destaddr, prio, ## msg)
+++ redsocks_log_write_plain(__FILE__, __LINE__, __func__, 1, &(client)->clientaddr, get_destaddr(client), prio, ## msg)
++
++ static void redudp_pkt_from_socks(int fd, short what, void *_arg);
++ static void redudp_drop_client(redudp_client *client);
++ static void redudp_fini_instance(redudp_instance *instance);
++ static int redudp_fini();
+++static int redudp_transparent(int fd);
++
++ typedef struct redudp_expected_assoc_reply_t {
++ socks5_reply h;
++ socks5_addr_ipv4 ip;
++ } PACKED redudp_expected_assoc_reply;
++
+++struct bound_udp4_key {
+++ struct in_addr sin_addr;
+++ uint16_t sin_port;
+++};
+++
+++struct bound_udp4 {
+++ struct bound_udp4_key key;
+++ int ref;
+++ int fd;
+++};
+++
++ /***********************************************************************
++ * Helpers
++ */
+++// TODO: separate binding to privileged process (this operation requires uid-0)
+++static void* root_bound_udp4 = NULL; // to avoid two binds to same IP:port
+++
+++static int bound_udp4_cmp(const void *a, const void *b)
+++{
+++ return memcmp(a, b, sizeof(struct bound_udp4_key));
+++}
+++
+++static void bound_udp4_mkkey(struct bound_udp4_key *key, const struct sockaddr_in *addr)
+++{
+++ memset(key, 0, sizeof(*key));
+++ key->sin_addr = addr->sin_addr;
+++ key->sin_port = addr->sin_port;
+++}
+++
+++static int bound_udp4_get(const struct sockaddr_in *addr)
+++{
+++ struct bound_udp4_key key;
+++ struct bound_udp4 *node, **pnode;
+++
+++ bound_udp4_mkkey(&key, addr);
+++ // I assume, that memory allocation for lookup is awful, so I use
+++ // tfind/tsearch pair instead of tsearch/check-result.
+++ pnode = tfind(&key, &root_bound_udp4, bound_udp4_cmp);
+++ if (pnode) {
+++ assert((*pnode)->ref > 0);
+++ (*pnode)->ref++;
+++ return (*pnode)->fd;
+++ }
+++
+++ node = calloc(1, sizeof(*node));
+++ if (!node) {
+++ log_errno(LOG_ERR, "calloc");
+++ goto fail;
+++ }
+++
+++ node->key = key;
+++ node->ref = 1;
+++ node->fd = socket(AF_INET, SOCK_DGRAM, 0);
+++ if (node->fd == -1) {
+++ log_errno(LOG_ERR, "socket");
+++ goto fail;
+++ }
+++
+++ if (0 != redudp_transparent(node->fd))
+++ goto fail;
+++
+++ if (0 != bind(node->fd, (struct sockaddr*)addr, sizeof(*addr))) {
+++ log_errno(LOG_ERR, "bind");
+++ goto fail;
+++ }
+++
+++ pnode = tsearch(node, &root_bound_udp4, bound_udp4_cmp);
+++ if (!pnode) {
+++ log_errno(LOG_ERR, "tsearch(%p) == %p", node, pnode);
+++ goto fail;
+++ }
+++ assert(node == *pnode);
+++
+++ return node->fd;
+++
+++fail:
+++ if (node) {
+++ if (node->fd != -1)
+++ redsocks_close(node->fd);
+++ free(node);
+++ }
+++ return -1;
+++}
+++
+++static void bound_udp4_put(const struct sockaddr_in *addr)
+++{
+++ struct bound_udp4_key key;
+++ struct bound_udp4 **pnode, *node;
+++ void *parent;
+++
+++ bound_udp4_mkkey(&key, addr);
+++ pnode = tfind(&key, &root_bound_udp4, bound_udp4_cmp);
+++ assert(pnode && (*pnode)->ref > 0);
+++
+++ node = *pnode;
+++
+++ node->ref--;
+++ if (node->ref)
+++ return;
+++
+++ parent = tdelete(node, &root_bound_udp4, bound_udp4_cmp);
+++ assert(parent);
+++
+++ redsocks_close(node->fd); // expanding `pnode` to avoid use after free
+++ free(node);
+++}
+++
+++static int redudp_transparent(int fd)
+++{
+++ int on = 1;
+++ int error = setsockopt(fd, SOL_IP, IP_TRANSPARENT, &on, sizeof(on));
+++ if (error)
+++ log_errno(LOG_ERR, "setsockopt(..., SOL_IP, IP_TRANSPARENT)");
+++ return error;
+++}
+++
+++static int do_tproxy(redudp_instance* instance)
+++{
+++ return instance->config.destaddr.sin_addr.s_addr == 0;
+++}
+++
+++static struct sockaddr_in* get_destaddr(redudp_client *client)
+++{
+++ if (do_tproxy(client->instance))
+++ return &client->destaddr;
+++ else
+++ return &client->instance->config.destaddr;
+++}
+++
++ static void redudp_fill_preamble(socks5_udp_preabmle *preamble, redudp_client *client)
++ {
++ preamble->reserved = 0;
++ preamble->frag_no = 0; /* fragmentation is not supported */
++ preamble->addrtype = socks5_addrtype_ipv4;
++- preamble->ip.addr = client->instance->config.destaddr.sin_addr.s_addr;
++- preamble->ip.port = client->instance->config.destaddr.sin_port;
+++ preamble->ip.addr = get_destaddr(client)->sin_addr.s_addr;
+++ preamble->ip.port = get_destaddr(client)->sin_port;
++ }
++
++ static struct evbuffer* socks5_mkmethods_plain_wrapper(void *p)
++@@ -104,6 +232,8 @@ static void redudp_drop_client(redudp_client *client)
++ redudp_log_errno(client, LOG_ERR, "event_del");
++ redsocks_close(fd);
++ }
+++ if (client->sender_fd != -1)
+++ bound_udp4_put(&client->destaddr);
++ list_for_each_entry_safe(q, tmp, &client->queue, list) {
++ list_del(&q->list);
++ free(q);
++@@ -344,7 +474,8 @@ static void redudp_relay_connected(struct bufferevent *buffev, void *_arg)
++ redudp_client *client = _arg;
++ int do_password = socks5_is_valid_cred(client->instance->config.login, client->instance->config.password);
++ int error;
++- redudp_log_error(client, LOG_DEBUG, "<trace>");
+++ char relayaddr_str[RED_INET_ADDRSTRLEN];
+++ redudp_log_error(client, LOG_DEBUG, "via %s", red_inet_ntop(&client->instance->config.relayaddr, relayaddr_str, sizeof(relayaddr_str)));
++
++ if (!red_is_socket_connected_ok(buffev)) {
++ redudp_log_errno(client, LOG_NOTICE, "red_is_socket_connected_ok");
++@@ -382,7 +513,7 @@ static void redudp_timeout(int fd, short what, void *_arg)
++ redudp_drop_client(client);
++ }
++
++-static void redudp_first_pkt_from_client(redudp_instance *self, struct sockaddr_in *clientaddr, char *buf, size_t pktlen)
+++static void redudp_first_pkt_from_client(redudp_instance *self, struct sockaddr_in *clientaddr, struct sockaddr_in *destaddr, char *buf, size_t pktlen)
++ {
++ redudp_client *client = calloc(1, sizeof(*client));
++
++@@ -395,9 +526,13 @@ static void redudp_first_pkt_from_client(redudp_instance *self, struct sockaddr_
++ INIT_LIST_HEAD(&client->queue);
++ client->instance = self;
++ memcpy(&client->clientaddr, clientaddr, sizeof(*clientaddr));
+++ if (destaddr)
+++ memcpy(&client->destaddr, destaddr, sizeof(client->destaddr));
++ evtimer_set(&client->timeout, redudp_timeout, client);
++ // XXX: self->relay_ss->init(client);
++
+++ client->sender_fd = -1; // it's postponed until socks-server replies to avoid trivial DoS
+++
++ client->relay = red_connect_relay(&client->instance->config.relayaddr,
++ redudp_relay_connected, redudp_relay_error, client);
++ if (!client->relay)
++@@ -431,7 +566,7 @@ static void redudp_pkt_from_socks(int fd, short what, void *_arg)
++
++ assert(fd == EVENT_FD(&client->udprelay));
++
++- pktlen = red_recv_udp_pkt(fd, pkt.buf, sizeof(pkt.buf), &udprelayaddr);
+++ pktlen = red_recv_udp_pkt(fd, pkt.buf, sizeof(pkt.buf), &udprelayaddr, NULL);
++ if (pktlen == -1)
++ return;
++
++@@ -455,8 +590,8 @@ static void redudp_pkt_from_socks(int fd, short what, void *_arg)
++ return;
++ }
++
++- if (pkt.header.ip.port != client->instance->config.destaddr.sin_port ||
++- pkt.header.ip.addr != client->instance->config.destaddr.sin_addr.s_addr)
+++ if (pkt.header.ip.port != get_destaddr(client)->sin_port ||
+++ pkt.header.ip.addr != get_destaddr(client)->sin_addr.s_addr)
++ {
++ char buf[RED_INET_ADDRSTRLEN];
++ struct sockaddr_in pktaddr = {
++@@ -472,8 +607,18 @@ static void redudp_pkt_from_socks(int fd, short what, void *_arg)
++ redsocks_time(&client->last_relay_event);
++ redudp_bump_timeout(client);
++
+++ if (do_tproxy(client->instance) && client->sender_fd == -1) {
+++ client->sender_fd = bound_udp4_get(&client->destaddr);
+++ if (client->sender_fd == -1) {
+++ redudp_log_error(client, LOG_WARNING, "bound_udp4_get failure");
+++ return;
+++ }
+++ }
+++
++ fwdlen = pktlen - sizeof(pkt.header);
++- outgoing = sendto(EVENT_FD(&client->instance->listener),
+++ outgoing = sendto(do_tproxy(client->instance)
+++ ? client->sender_fd
+++ : EVENT_FD(&client->instance->listener),
++ pkt.buf + sizeof(pkt.header), fwdlen, 0,
++ (struct sockaddr*)&client->clientaddr, sizeof(client->clientaddr));
++ if (outgoing != fwdlen) {
++@@ -486,18 +631,21 @@ static void redudp_pkt_from_socks(int fd, short what, void *_arg)
++ static void redudp_pkt_from_client(int fd, short what, void *_arg)
++ {
++ redudp_instance *self = _arg;
++- struct sockaddr_in clientaddr;
+++ struct sockaddr_in clientaddr, destaddr, *pdestaddr;
++ char buf[0xFFFF]; // UDP packet can't be larger then that
++ ssize_t pktlen;
++ redudp_client *tmp, *client = NULL;
++
+++ pdestaddr = do_tproxy(self) ? &destaddr : NULL;
+++
++ assert(fd == EVENT_FD(&self->listener));
++- pktlen = red_recv_udp_pkt(fd, buf, sizeof(buf), &clientaddr);
+++ pktlen = red_recv_udp_pkt(fd, buf, sizeof(buf), &clientaddr, pdestaddr);
++ if (pktlen == -1)
++ return;
++
++ // TODO: this lookup may be SLOOOOOW.
++ list_for_each_entry(tmp, &self->clients, list) {
+++ // TODO: check destaddr
++ if (0 == memcmp(&clientaddr, &tmp->clientaddr, sizeof(clientaddr))) {
++ client = tmp;
++ break;
++@@ -515,7 +663,7 @@ static void redudp_pkt_from_client(int fd, short what, void *_arg)
++ }
++ }
++ else {
++- redudp_first_pkt_from_client(self, &clientaddr, buf, pktlen);
+++ redudp_first_pkt_from_client(self, &clientaddr, pdestaddr, buf, pktlen);
++ }
++ }
++
++@@ -554,7 +702,6 @@ static int redudp_onenter(parser_section *section)
++ instance->config.relayaddr.sin_family = AF_INET;
++ instance->config.relayaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
++ instance->config.destaddr.sin_family = AF_INET;
++- instance->config.destaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
++ instance->config.max_pktqueue = 5;
++ instance->config.udp_timeout = 30;
++ instance->config.udp_timeout_stream = 180;
++@@ -614,6 +761,28 @@ static int redudp_init_instance(redudp_instance *instance)
++ goto fail;
++ }
++
+++ if (do_tproxy(instance)) {
+++ int on = 1;
+++ char buf[RED_INET_ADDRSTRLEN];
+++ // iptables TPROXY target does not send packets to non-transparent sockets
+++ if (0 != redudp_transparent(fd))
+++ goto fail;
+++
+++ error = setsockopt(fd, SOL_IP, IP_RECVORIGDSTADDR, &on, sizeof(on));
+++ if (error) {
+++ log_errno(LOG_ERR, "setsockopt(listener, SOL_IP, IP_RECVORIGDSTADDR)");
+++ goto fail;
+++ }
+++
+++ log_error(LOG_DEBUG, "redudp @ %s: TPROXY", red_inet_ntop(&instance->config.bindaddr, buf, sizeof(buf)));
+++ }
+++ else {
+++ char buf1[RED_INET_ADDRSTRLEN], buf2[RED_INET_ADDRSTRLEN];
+++ log_error(LOG_DEBUG, "redudp @ %s: destaddr=%s",
+++ red_inet_ntop(&instance->config.bindaddr, buf1, sizeof(buf1)),
+++ red_inet_ntop(&instance->config.destaddr, buf2, sizeof(buf2)));
+++ }
+++
++ error = bind(fd, (struct sockaddr*)&instance->config.bindaddr, sizeof(instance->config.bindaddr));
++ if (error) {
++ log_errno(LOG_ERR, "bind");
++diff --git a/redudp.h b/redudp.h
++index 308bd33..3f1d9d1 100644
++--- a/redudp.h
+++++ b/redudp.h
++@@ -24,6 +24,8 @@ typedef struct redudp_client_t {
++ list_head list;
++ redudp_instance *instance;
++ struct sockaddr_in clientaddr;
+++ struct sockaddr_in destaddr;
+++ int sender_fd; // shared between several clients socket (bound to `destaddr`)
++ struct event timeout;
++ struct bufferevent *relay;
++ struct event udprelay;
++diff --git a/utils.c b/utils.c
++index 6e1f3af..afdeea8 100644
++--- a/utils.c
+++++ b/utils.c
++@@ -26,17 +26,54 @@
++ #include "utils.h"
++ #include "redsocks.h" // for redsocks_close
++
++-int red_recv_udp_pkt(int fd, char *buf, size_t buflen, struct sockaddr_in *inaddr)
+++int red_recv_udp_pkt(int fd, char *buf, size_t buflen, struct sockaddr_in *inaddr, struct sockaddr_in *toaddr)
++ {
++ socklen_t addrlen = sizeof(*inaddr);
++ ssize_t pktlen;
++-
++- pktlen = recvfrom(fd, buf, buflen, 0, (struct sockaddr*)inaddr, &addrlen);
+++ struct msghdr msg;
+++ struct iovec io;
+++ char control[1024];
+++
+++ memset(&msg, 0, sizeof(msg));
+++ msg.msg_name = inaddr;
+++ msg.msg_namelen = sizeof(*inaddr);
+++ msg.msg_iov = &io;
+++ msg.msg_iovlen = 1;
+++ msg.msg_control = control;
+++ msg.msg_controllen = sizeof(control);
+++ io.iov_base = buf;
+++ io.iov_len = buflen;
+++
+++ pktlen = recvmsg(fd, &msg, 0);
++ if (pktlen == -1) {
++ log_errno(LOG_WARNING, "recvfrom");
++ return -1;
++ }
++
+++ if (toaddr) {
+++ memset(toaddr, 0, sizeof(*toaddr));
+++ for (struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
+++ if (
+++ cmsg->cmsg_level == SOL_IP &&
+++ cmsg->cmsg_type == IP_ORIGDSTADDR &&
+++ cmsg->cmsg_len >= CMSG_LEN(sizeof(*toaddr))
+++ ) {
+++ struct sockaddr_in* cmsgaddr = (struct sockaddr_in*)CMSG_DATA(cmsg);
+++ char buf[RED_INET_ADDRSTRLEN];
+++ log_error(LOG_DEBUG, "IP_ORIGDSTADDR: %s", red_inet_ntop(cmsgaddr, buf, sizeof(buf)));
+++ memcpy(toaddr, cmsgaddr, sizeof(*toaddr));
+++ }
+++ else {
+++ log_error(LOG_WARNING, "unexepcted cmsg (level,type) = (%d,%d)",
+++ cmsg->cmsg_level, cmsg->cmsg_type);
+++ }
+++ }
+++ if (toaddr->sin_family != AF_INET) {
+++ log_error(LOG_WARNING, "(SOL_IP, IP_ORIGDSTADDR) not found");
+++ return -1;
+++ }
+++ }
+++
++ if (addrlen != sizeof(*inaddr)) {
++ log_error(LOG_WARNING, "unexpected address length %u instead of %zu", addrlen, sizeof(*inaddr));
++ return -1;
++diff --git a/utils.h b/utils.h
++index d3af00f..c2277e9 100644
++--- a/utils.h
+++++ b/utils.h
++@@ -44,7 +44,7 @@ char *redsocks_evbuffer_readline(struct evbuffer *buf);
++ struct bufferevent* red_connect_relay(struct sockaddr_in *addr, evbuffercb writecb, everrorcb errorcb, void *cbarg);
++ int red_socket_geterrno(struct bufferevent *buffev);
++ int red_is_socket_connected_ok(struct bufferevent *buffev);
++-int red_recv_udp_pkt(int fd, char *buf, size_t buflen, struct sockaddr_in *inaddr);
+++int red_recv_udp_pkt(int fd, char *buf, size_t buflen, struct sockaddr_in *fromaddr, struct sockaddr_in *toaddr);
++
++ int fcntl_nonblock(int fd);
++
++--
++1.9.1
++
+diff --git a/feeds/packages/net/redsocks/patches/0004-Fix-transposition-of-memset-parameters.patch b/feeds/packages/net/redsocks/patches/0004-Fix-transposition-of-memset-parameters.patch
+new file mode 100644
+index 0000000..cb6fa1e
+--- /dev/null
++++ b/feeds/packages/net/redsocks/patches/0004-Fix-transposition-of-memset-parameters.patch
+@@ -0,0 +1,25 @@
++From b60b492602448b59aea194afd4991910d3613e5c Mon Sep 17 00:00:00 2001
++From: Cody Schafer <jmesmon@gmail.com>
++Date: Tue, 24 Apr 2012 04:33:13 -0500
++Subject: [PATCH 04/12] Fix transposition of memset parameters.
++
++---
++ utils.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/utils.c b/utils.c
++index afdeea8..31c6894 100644
++--- a/utils.c
+++++ b/utils.c
++@@ -222,7 +222,7 @@ char *red_inet_ntop(const struct sockaddr_in* sa, char* buffer, size_t buffer_si
++
++ assert(buffer_size >= sizeof(placeholder));
++
++- memset(buffer, buffer_size, 0);
+++ memset(buffer, 0, buffer_size);
++ if (sa->sin_family == AF_INET) {
++ retval = inet_ntop(AF_INET, &sa->sin_addr, buffer, buffer_size);
++ port = ((struct sockaddr_in*)sa)->sin_port;
++--
++1.9.1
++
+diff --git a/feeds/packages/net/redsocks/patches/0005-Fix-compilation-on-Ubuntu-10.04-LTS-and-hopefully-De.patch b/feeds/packages/net/redsocks/patches/0005-Fix-compilation-on-Ubuntu-10.04-LTS-and-hopefully-De.patch
+new file mode 100644
+index 0000000..f0f09aa
+--- /dev/null
++++ b/feeds/packages/net/redsocks/patches/0005-Fix-compilation-on-Ubuntu-10.04-LTS-and-hopefully-De.patch
+@@ -0,0 +1,105 @@
++From 18e2b5ed1ffb3e7c5dfec8ff41b3027163f680ed Mon Sep 17 00:00:00 2001
++From: Leonid Evdokimov <leon@darkk.net.ru>
++Date: Wed, 12 Sep 2012 02:05:39 +0400
++Subject: [PATCH 09/12] Fix compilation on Ubuntu 10.04 LTS and (hopefully)
++ Debian squeeze[1]
++
++fixes #28, fixes #22, fixes #24
++[1] current "stable" release
++---
++ libc-compat.h | 25 +++++++++++++++++++++++++
++ libevent-compat.h | 11 +++++++++++
++ redsocks.c | 1 +
++ redudp.c | 1 +
++ utils.c | 1 +
++ 5 files changed, 39 insertions(+)
++ create mode 100644 libc-compat.h
++ create mode 100644 libevent-compat.h
++
++diff --git a/libc-compat.h b/libc-compat.h
++new file mode 100644
++index 0000000..adcf63b
++--- /dev/null
+++++ b/libc-compat.h
++@@ -0,0 +1,25 @@
+++#ifndef UUID_67C91670_FCCB_4855_BDF7_609F1EECB8B4
+++#define UUID_67C91670_FCCB_4855_BDF7_609F1EECB8B4
+++
+++/* all these definitions, are included into bits/in.h from libc6-dev 2.15-0ubuntu10
+++ * from Ubuntu 12.04 and is not included into libc6-dev 2.11.1-0ubuntu7.10 from
+++ * Ubuntu 10.04.
+++ * linux/in.h is not included directly because of lots of redefinitions,
+++ * extracting single value from linux/in.h is not done because it looks like
+++ * autotools reinvention */
+++#ifndef IP_ORIGDSTADDR
+++# warning Using hardcoded value for IP_ORIGDSTADDR as libc headers do not define it.
+++# define IP_ORIGDSTADDR 20
+++#endif
+++
+++#ifndef IP_RECVORIGDSTADDR
+++# warning Using hardcoded value for IP_RECVORIGDSTADDR as libc headers do not define it.
+++# define IP_RECVORIGDSTADDR IP_ORIGDSTADDR
+++#endif
+++
+++#ifndef IP_TRANSPARENT
+++# warning Using hardcoded value for IP_TRANSPARENT as libc headers do not define it.
+++# define IP_TRANSPARENT 19
+++#endif
+++
+++#endif // 67C91670_FCCB_4855_BDF7_609F1EECB8B4
++diff --git a/libevent-compat.h b/libevent-compat.h
++new file mode 100644
++index 0000000..a7f1ca1
++--- /dev/null
+++++ b/libevent-compat.h
++@@ -0,0 +1,11 @@
+++#ifndef UUID_FC148CFA_5ECC_488E_8A62_CD39406C9F1E
+++#define UUID_FC148CFA_5ECC_488E_8A62_CD39406C9F1E
+++
+++/* evutil_socket_t is macros in libevent-2.0, not typedef, libevent-1.4 is
+++ * still supported because of Ubuntu 10.04 LTS */
+++#ifndef evutil_socket_t
+++# warning Using hardcoded value for evutil_socket_t as libevent headers do not define it.
+++# define evutil_socket_t int
+++#endif
+++
+++#endif // FC148CFA_5ECC_488E_8A62_CD39406C9F1E
++diff --git a/redsocks.c b/redsocks.c
++index ba5eab2..878576f 100644
++--- a/redsocks.c
+++++ b/redsocks.c
++@@ -33,6 +33,7 @@
++ #include "base.h"
++ #include "redsocks.h"
++ #include "utils.h"
+++#include "libevent-compat.h"
++
++
++ #define REDSOCKS_RELAY_HALFBUFF 4096
++diff --git a/redudp.c b/redudp.c
++index 262af3e..05460dc 100644
++--- a/redudp.c
+++++ b/redudp.c
++@@ -32,6 +32,7 @@
++ #include "main.h"
++ #include "redsocks.h"
++ #include "redudp.h"
+++#include "libc-compat.h"
++
++ #define redudp_log_error(client, prio, msg...) \
++ redsocks_log_write_plain(__FILE__, __LINE__, __func__, 0, &(client)->clientaddr, get_destaddr(client), prio, ## msg)
++diff --git a/utils.c b/utils.c
++index 31c6894..7de3969 100644
++--- a/utils.c
+++++ b/utils.c
++@@ -25,6 +25,7 @@
++ #include "log.h"
++ #include "utils.h"
++ #include "redsocks.h" // for redsocks_close
+++#include "libc-compat.h"
++
++ int red_recv_udp_pkt(int fd, char *buf, size_t buflen, struct sockaddr_in *inaddr, struct sockaddr_in *toaddr)
++ {
++--
++1.9.1
++
+diff --git a/feeds/packages/net/redsocks/patches/0006-fix_default_config_location.patch b/feeds/packages/net/redsocks/patches/0006-fix_default_config_location.patch
+new file mode 100644
+index 0000000..1994bef
+--- /dev/null
++++ b/feeds/packages/net/redsocks/patches/0006-fix_default_config_location.patch
+@@ -0,0 +1,17 @@
++Description: change the default config file location
++ redsocks by default looks for ./redsocks.conf. Change this to
++ /etc/redsocks.conf for a more deterministic behaviour.
++Author: Apollon Oikonomopoulos <apoikos@gmail.com>
++Forwared: no
++Last-Update: 2013-04-23
++--- a/main.c
+++++ b/main.c
++@@ -39,7 +39,7 @@
++ &dnstc_subsys,
++ };
++
++-static const char *confname = "redsocks.conf";
+++static const char *confname = "/etc/redsocks.conf";
++ static const char *pidfile = NULL;
++
++ static void terminate(int sig, short what, void *_arg)
+diff --git a/feeds/packages/net/remserial/Makefile b/feeds/packages/net/remserial/Makefile
+new file mode 100644
+index 0000000..4fe476d
+--- /dev/null
++++ b/feeds/packages/net/remserial/Makefile
+@@ -0,0 +1,34 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=remserial
++PKG_VERSION:=1.4
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0+
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://lpccomp.bc.ca/remserial/
++PKG_MD5SUM:=b19b57fd118329c5ea3aaf9887f946a6
++
++PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/remserial
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Bridge TCP/IP port with a device
++ URL:=http://lpccomp.bc.ca/remserial/
++endef
++
++define Package/remserial/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/remserial $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,remserial))
+diff --git a/feeds/packages/net/rsync/Config.in b/feeds/packages/net/rsync/Config.in
+new file mode 100644
+index 0000000..dfbfdf1
+--- /dev/null
++++ b/feeds/packages/net/rsync/Config.in
+@@ -0,0 +1,25 @@
++if PACKAGE_rsync
++
++ config RSYNC_xattr
++ bool
++ prompt "Enable xattr support"
++ default n
++
++ config RSYNC_acl
++ bool
++ prompt "Enable ACL support"
++ default n
++
++ config RSYNC_zlib
++ bool
++ prompt "Enable system zlib"
++ help
++ Use the system's zlib library instead of rsync's internal copy. Enabling
++ this may create compatibility errors when using compression with older
++ clients, or those using the current default of the bundled zlib.
++
++ rsync's upstream default is to use their bundled zlib. OpenWrt uses the
++ system zlib for space reasons. The system zlib will eventually become
++ default for upstream as well.
++ default y
++endif
+diff --git a/feeds/packages/net/rsync/Makefile b/feeds/packages/net/rsync/Makefile
+new file mode 100644
+index 0000000..f4419d3
+--- /dev/null
++++ b/feeds/packages/net/rsync/Makefile
+@@ -0,0 +1,104 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=rsync
++PKG_VERSION:=3.1.1
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://rsync.samba.org/ftp/rsync/src
++PKG_MD5SUM:=43bd6676f0b404326eee2d63be3cdcfe
++PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/rsync
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=File Transfer
++ TITLE:=Fast remote file copy program (like rcp)
++ DEPENDS:=+libpopt +RSYNC_xattr:libattr +RSYNC_acl:libacl +RSYNC_zlib:zlib
++ URL:=http://rsync.samba.org/
++ MENU:=1
++endef
++
++define Package/rsync/config
++ source "$(SOURCE)/Config.in"
++endef
++
++CONFIGURE_ARGS += \
++ --with-included-popt=no \
++ --disable-debug \
++ --disable-locale \
++
++ifeq ($(CONFIG_RSYNC_xattr),y)
++ CONFIGURE_ARGS+= --enable-xattr-support
++else
++ CONFIGURE_ARGS+= --disable-xattr-support
++endif
++
++ifeq ($(CONFIG_RSYNC_acl),y)
++ CONFIGURE_ARGS+= --enable-acl-support
++else
++ CONFIGURE_ARGS+= --disable-acl-support
++endif
++
++ifeq ($(CONFIG_RSYNC_zlib),y)
++ CONFIGURE_ARGS+= --with-included-zlib=no
++else
++ CONFIGURE_ARGS+= --with-included-zlib=yes
++endif
++
++define Package/rsyncd
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=File Transfer
++ TITLE:=Rsync daemon
++ DEPENDS:=+rsync
++ URL:=http://rsync.samba.org/
++endef
++
++define Package/rsync/description
++ rsync is a program that allows files to be copied to and from remote machines
++ in much the same way as rcp. It has many more options than rcp, and uses the
++ rsync remote-update protocol to greatly speed up file transfers when the
++ destination file already exists.
++
++ The rsync remote-update protocol allows rsync to transfer just the differences
++ between two sets of files across the network link.
++endef
++
++define Package/rsync/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(PKG_NAME) $(1)/usr/bin/
++endef
++
++define Package/rsyncd/description
++ rsyncd is a configuration file and initscript to utilize rsync as a daemon. It
++ uses the same binary as rsync.
++endef
++
++define Package/rsyncd/conffiles
++/etc/rsyncd.conf
++endef
++
++define Package/rsyncd/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) ./files/rsyncd.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/rsyncd.init $(1)/etc/init.d/rsyncd
++endef
++
++$(eval $(call BuildPackage,rsync))
++$(eval $(call BuildPackage,rsyncd))
+diff --git a/feeds/packages/net/rsync/files/rsyncd.conf b/feeds/packages/net/rsync/files/rsyncd.conf
+new file mode 100644
+index 0000000..2f4cd9e
+--- /dev/null
++++ b/feeds/packages/net/rsync/files/rsyncd.conf
+@@ -0,0 +1,16 @@
++# /etc/rsyncd.conf
++# Minimal configuration for rsync daemon
++
++# Next line required for init script
++pid file = /var/run/rsyncd.pid
++log file = /var/log/rsyncd.log
++use chroot = yes
++uid = nobody
++gid = nogroup
++read only = yes
++
++# Simple example to configure server
++#[openwrt-etc]
++#path = /etc
++#comment = OpenWrt Configuration Files
++#exclude = /init.d
+diff --git a/feeds/packages/net/rsync/files/rsyncd.init b/feeds/packages/net/rsync/files/rsyncd.init
+new file mode 100644
+index 0000000..d226d0f
+--- /dev/null
++++ b/feeds/packages/net/rsync/files/rsyncd.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2011-2014 OpenWrt.org
++
++START=90
++STOP=10
++
++USE_PROCD=1
++PROG=/usr/bin/rsync
++
++start_service() {
++ procd_open_instance
++ procd_set_param command "$PROG" --daemon --no-detach
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/rsync/patches/000-CVE-2014-9512.patch b/feeds/packages/net/rsync/patches/000-CVE-2014-9512.patch
+new file mode 100644
+index 0000000..aaefbad
+--- /dev/null
++++ b/feeds/packages/net/rsync/patches/000-CVE-2014-9512.patch
+@@ -0,0 +1,106 @@
++From: Wayne Davison <wayned@samba.org>
++Date: Wed, 31 Dec 2014 20:41:03 +0000 (-0800)
++Subject: Complain if an inc-recursive path is not right for its dir.
++X-Git-Url: https://git.samba.org/?p=rsync.git;a=commitdiff_plain;h=962f8b90045ab331fc04c9e65f80f1a53e68243b
++
++Complain if an inc-recursive path is not right for its dir.
++This ensures that a malicious sender can't use a just-sent
++symlink as a trasnfer path.
++---
++
++diff --git a/flist.c b/flist.c
++index c24672e..92e4b65 100644
++--- a/flist.c
+++++ b/flist.c
++@@ -2435,8 +2435,9 @@ struct file_list *send_file_list(int f, int argc, char *argv[])
++ return flist;
++ }
++
++-struct file_list *recv_file_list(int f)
+++struct file_list *recv_file_list(int f, int dir_ndx)
++ {
+++ const char *good_dirname = NULL;
++ struct file_list *flist;
++ int dstart, flags;
++ int64 start_read;
++@@ -2492,6 +2493,23 @@ struct file_list *recv_file_list(int f)
++ flist_expand(flist, 1);
++ file = recv_file_entry(f, flist, flags);
++
+++ if (inc_recurse) {
+++ static const char empty_dir[] = "\0";
+++ const char *cur_dir = file->dirname ? file->dirname : empty_dir;
+++ if (relative_paths && *cur_dir == '/')
+++ cur_dir++;
+++ if (cur_dir != good_dirname) {
+++ const char *d = dir_ndx >= 0 ? f_name(dir_flist->files[dir_ndx], NULL) : empty_dir;
+++ if (strcmp(cur_dir, d) != 0) {
+++ rprintf(FERROR,
+++ "ABORTING due to invalid dir prefix from sender: %s (should be: %s)\n",
+++ cur_dir, d);
+++ exit_cleanup(RERR_PROTOCOL);
+++ }
+++ good_dirname = cur_dir;
+++ }
+++ }
+++
++ if (S_ISREG(file->mode)) {
++ /* Already counted */
++ } else if (S_ISDIR(file->mode)) {
++@@ -2615,7 +2633,7 @@ void recv_additional_file_list(int f)
++ rprintf(FINFO, "[%s] receiving flist for dir %d\n",
++ who_am_i(), ndx);
++ }
++- flist = recv_file_list(f);
+++ flist = recv_file_list(f, ndx);
++ flist->parent_ndx = ndx;
++ }
++ }
++diff --git a/io.c b/io.c
++index b9a9bd0..a868fa9 100644
++--- a/io.c
+++++ b/io.c
++@@ -1685,7 +1685,7 @@ void wait_for_receiver(void)
++ rprintf(FINFO, "[%s] receiving flist for dir %d\n",
++ who_am_i(), ndx);
++ }
++- flist = recv_file_list(iobuf.in_fd);
+++ flist = recv_file_list(iobuf.in_fd, ndx);
++ flist->parent_ndx = ndx;
++ #ifdef SUPPORT_HARD_LINKS
++ if (preserve_hard_links)
++diff --git a/main.c b/main.c
++index e7a13f7..713b818 100644
++--- a/main.c
+++++ b/main.c
++@@ -1009,7 +1009,7 @@ static void do_server_recv(int f_in, int f_out, int argc, char *argv[])
++ filesfrom_fd = -1;
++ }
++
++- flist = recv_file_list(f_in);
+++ flist = recv_file_list(f_in, -1);
++ if (!flist) {
++ rprintf(FERROR,"server_recv: recv_file_list error\n");
++ exit_cleanup(RERR_FILESELECT);
++@@ -1183,7 +1183,7 @@ int client_run(int f_in, int f_out, pid_t pid, int argc, char *argv[])
++
++ if (write_batch && !am_server)
++ start_write_batch(f_in);
++- flist = recv_file_list(f_in);
+++ flist = recv_file_list(f_in, -1);
++ if (inc_recurse && file_total == 1)
++ recv_additional_file_list(f_in);
++
++diff --git a/rsync.c b/rsync.c
++index 68ff6b1..c3ecc51 100644
++--- a/rsync.c
+++++ b/rsync.c
++@@ -364,7 +364,7 @@ int read_ndx_and_attrs(int f_in, int f_out, int *iflag_ptr, uchar *type_ptr,
++ }
++ /* Send all the data we read for this flist to the generator. */
++ start_flist_forward(ndx);
++- flist = recv_file_list(f_in);
+++ flist = recv_file_list(f_in, ndx);
++ flist->parent_ndx = ndx;
++ stop_flist_forward();
++ }
+diff --git a/feeds/packages/net/rtorrent/Makefile b/feeds/packages/net/rtorrent/Makefile
+new file mode 100644
+index 0000000..bba6dde
+--- /dev/null
++++ b/feeds/packages/net/rtorrent/Makefile
+@@ -0,0 +1,92 @@
++#
++# Copyright (C) 2007-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=rtorrent
++PKG_VERSION:=0.9.4-git-1
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/rakshasa/rtorrent.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=7343e33a6a0d279179b304a380bf011f1c8be64a
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/rtorrent/Default
++ SUBMENU:=BitTorrent
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=BitTorrent client for ncurses
++ URL:=http://libtorrent.rakshasa.no/
++ DEPENDS:=+libcurl +libtorrent +libncursesw +libsigcxx +libpthread
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++endef
++
++define Package/rtorrent/Default/description
++ rTorrent is a BitTorrent client for ncurses, using the libtorrent library.
++ The client and library is written in C++ with emphasis on speed and
++ efficiency, while delivering equivalent features to those found in GUI based
++ clients in an ncurses client.
++endef
++
++define Package/rtorrent
++$(call Package/rtorrent/Default)
++ VARIANT:=norpc
++endef
++
++define Package/rtorrent/description
++$(call Package/rtorrent/Default/description)
++ This package is built without xmlrpc support
++endef
++
++define Package/rtorrent-rpc
++$(call Package/rtorrent/Default)
++ VARIANT:=rpc
++ DEPENDS+=+xmlrpc-c-server
++ TITLE+=(with rpc support)
++endef
++
++define Package/rtorrent-rpc/description
++$(call Package/rtorrent/Default/description)
++ This package is built with xmlrpc support
++endef
++
++TARGET_LDFLAGS += -lz -lpthread -Wl,-rpath-link=$(STAGING_DIR)/usr/lib
++
++CONFIGURE_ARGS+= \
++ --enable-shared \
++ --disable-static \
++ --disable-debug \
++ $(call autoconf_bool,CONFIG_IPV6,ipv6)
++
++ifeq ($(BUILD_VARIANT),rpc)
++ CONFIGURE_ARGS += \
++ --with-xmlrpc-c
++endif
++
++
++define Package/rtorrent/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/rtorrent $(1)/usr/bin/
++endef
++
++Package/rtorrent-rpc/install = $(Package/rtorrent/install)
++
++$(eval $(call BuildPackage,rtorrent))
++$(eval $(call BuildPackage,rtorrent-rpc))
+diff --git a/feeds/packages/net/rtorrent/patches/100-fix-cross_compile.patch b/feeds/packages/net/rtorrent/patches/100-fix-cross_compile.patch
+new file mode 100644
+index 0000000..a421351
+--- /dev/null
++++ b/feeds/packages/net/rtorrent/patches/100-fix-cross_compile.patch
+@@ -0,0 +1,30 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -4,7 +4,6 @@ AC_DEFINE(API_VERSION, 8, api version)
++
++ AM_INIT_AUTOMAKE
++ AC_CONFIG_HEADERS(config.h)
++-AM_PATH_CPPUNIT(1.9.6)
++
++ AC_PROG_CXX
++ AC_PROG_LIBTOOL
++--- a/scripts/common.m4
+++++ b/scripts/common.m4
++@@ -153,7 +153,7 @@ dnl Need to fix this so that it uses t
++ AC_DEFUN([TORRENT_CHECK_EXECINFO], [
++ AC_MSG_CHECKING(for execinfo.h)
++
++- AC_RUN_IFELSE([AC_LANG_SOURCE([
+++ AC_LINK_IFELSE([AC_LANG_SOURCE([
++ #include <execinfo.h>
++ int main() { backtrace((void**)0, 0); backtrace_symbols((char**)0, 0); return 0;}
++ ])],
++@@ -168,7 +168,7 @@ AC_DEFUN([TORRENT_CHECK_EXECINFO], [
++ AC_DEFUN([TORRENT_CHECK_ALIGNED], [
++ AC_MSG_CHECKING(the byte alignment)
++
++- AC_RUN_IFELSE([AC_LANG_SOURCE([
+++ AC_LINK_IFELSE([AC_LANG_SOURCE([
++ #include <inttypes.h>
++ int main() {
++ char buf@<:@8@:>@ = { 0, 0, 0, 0, 1, 0, 0, 0 };
+diff --git a/feeds/packages/net/rtorrent/patches/120-fix-ncurses.patch b/feeds/packages/net/rtorrent/patches/120-fix-ncurses.patch
+new file mode 100644
+index 0000000..f491de3
+--- /dev/null
++++ b/feeds/packages/net/rtorrent/patches/120-fix-ncurses.patch
+@@ -0,0 +1,11 @@
++--- a/src/display/canvas.h
+++++ b/src/display/canvas.h
++@@ -48,7 +48,7 @@ class Canvas {
++ public:
++ typedef std::vector<Attributes> attributes_list;
++
++- Canvas(int x = 0, int y = 0, int width = 0, int height = 0);
+++ Canvas(int x = 0, int y = 0, int width = 1, int height = 1);
++ ~Canvas() { delwin(m_window); }
++
++ void refresh() { wnoutrefresh(m_window); }
+diff --git a/feeds/packages/net/scapy/Makefile b/feeds/packages/net/scapy/Makefile
+new file mode 100644
+index 0000000..e8af27a
+--- /dev/null
++++ b/feeds/packages/net/scapy/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=scapy
++PKG_VERSION:=2.2.0
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=PKG-INFO
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).zip
++PKG_SOURCE_URL:=https://bitbucket.org/secdev/scapy/downloads/
++PKG_MD5SUM:=d68903c5d877820026dc544caa0b5d3c
++
++PKG_BUILD_DEPENDS:=python python-setuptools
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/scapy
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Interactive packet manipulation tool and network scanner
++ MAINTAINER:=W. Michael Petullo <mike@flyn.org>
++ URL:=http://www.secdev.org/projects/scapy/
++ DEPENDS:=+python
++endef
++
++define Package/scapy/description
++ Scapy is a powerful interactive packet manipulation program built on top
++ of the Python interpreter. It can be used to forge or decode packets of
++ a wide number of protocols, send them over the wire, capture them, match
++ requests and replies, and much more.
++endef
++
++define Build/Compile
++ $(call Build/Compile/PyMod,., \
++ install --prefix="/usr" --root="$(PKG_INSTALL_DIR)", \
++ )
++endef
++
++define Package/scapy/install
++ $(INSTALL_DIR) $(1)$(PYTHON_PKG_DIR)
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) \
++ $(PKG_INSTALL_DIR)$(PYTHON_PKG_DIR)/* \
++ $(1)$(PYTHON_PKG_DIR)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin
++endef
++
++$(eval $(call BuildPackage,scapy))
+diff --git a/feeds/packages/net/seafile-ccnet/Makefile b/feeds/packages/net/seafile-ccnet/Makefile
+new file mode 100644
+index 0000000..91e6e23
+--- /dev/null
++++ b/feeds/packages/net/seafile-ccnet/Makefile
+@@ -0,0 +1,74 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=seafile-ccnet
++PKG_VERSION:=4.1.2
++PKG_RELEASE=$(PKG_SOURCE_VERSION)-2
++PKG_LICENSE:=GPL-3.0
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/haiwen/ccnet.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=a73109f09af4ecc49cdc4c57cdde51b38e15c31a
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/seafile-ccnet
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Seafile server - ccnet component
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++ URL:=http://seafile.com/
++ DEPENDS:=+libsearpc +libevent2 +libopenssl \
++ +glib2 +python +libzdb +libuuid \
++ +libpthread +libsqlite3 +jansson $(ICONV_DEPENDS)
++endef
++
++define Package/seafile-ccnet/description
++ Ccnet is a framework for writing networked applications in C.
++endef
++
++CONFIGURE_ARGS += --disable-client \
++ --enable-server \
++ --disable-ldap \
++ --disable-cluster \
++ --enable-python \
++ --disable-server-pkg \
++ --disable-static-build \
++ --disable-compile-demo \
++ --disable-console
++
++PKG_BUILD_DEPENDS:=vala/host \
++ libsearpc/host
++
++TARGET_LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib -liconv \
++ -L$(STAGING_DIR)/usr/lib/mysql -lmysqlclient -lz
++
++define Package/seafile-ccnet/install
++ $(INSTALL_DIR) $(1)/usr/{bin,lib}
++ $(INSTALL_DIR) $(1)/usr/lib/python2.7/site-packages
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/ccnet* $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/python2.7/site-packages/ccnet $(1)/usr/lib/python2.7/site-packages/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libccnet.so* $(1)/usr/lib/
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/ccnet* $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libccnet.pc $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libccnet.a $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libccnet.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,seafile-ccnet))
+diff --git a/feeds/packages/net/seafile-ccnet/patches/010-libevent-include-path.patch b/feeds/packages/net/seafile-ccnet/patches/010-libevent-include-path.patch
+new file mode 100644
+index 0000000..11b809c
+--- /dev/null
++++ b/feeds/packages/net/seafile-ccnet/patches/010-libevent-include-path.patch
+@@ -0,0 +1,300 @@
++diff -rupN seafile-ccnet-4.1.2.orig/include/ccnet/ccnet-client.h seafile-ccnet-4.1.2/include/ccnet/ccnet-client.h
++--- seafile-ccnet-4.1.2.orig/include/ccnet/ccnet-client.h 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/include/ccnet/ccnet-client.h 2015-09-09 19:22:23.515461892 +0200
++@@ -10,11 +10,7 @@
++ #include <glib.h>
++ #include <glib-object.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/util.h>
++-#else
++-#include <evutil.h>
++-#endif
++
++ #include "ccnet-session-base.h"
++
++diff -rupN seafile-ccnet-4.1.2.orig/include/ccnet/cevent.h seafile-ccnet-4.1.2/include/ccnet/cevent.h
++--- seafile-ccnet-4.1.2.orig/include/ccnet/cevent.h 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/include/ccnet/cevent.h 2015-09-09 19:22:23.516461920 +0200
++@@ -6,13 +6,9 @@
++ #ifndef CEVENT_H
++ #define CEVENT_H
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++ #include <event2/event_compat.h>
++ #include <event2/event_struct.h>
++-#else
++-#include <event.h>
++-#endif
++
++ #include <glib.h>
++
++diff -rupN seafile-ccnet-4.1.2.orig/lib/job-mgr.c seafile-ccnet-4.1.2/lib/job-mgr.c
++--- seafile-ccnet-4.1.2.orig/lib/job-mgr.c 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/lib/job-mgr.c 2015-09-09 19:22:23.516461920 +0200
++@@ -1,11 +1,7 @@
++ /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++ #include <event2/event_compat.h>
++-#else
++-#include <event.h>
++-#endif
++
++ #include <string.h>
++ #include <stdlib.h>
++diff -rupN seafile-ccnet-4.1.2.orig/lib/libccnet_utils.h seafile-ccnet-4.1.2/lib/libccnet_utils.h
++--- seafile-ccnet-4.1.2.orig/lib/libccnet_utils.h 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/lib/libccnet_utils.h 2015-09-09 19:22:23.517461948 +0200
++@@ -15,11 +15,7 @@
++ #include <glib-object.h>
++ #include <stdlib.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/util.h>
++-#else
++-#include <evutil.h>
++-#endif
++
++ #ifdef WIN32
++ #include <errno.h>
++diff -rupN seafile-ccnet-4.1.2.orig/lib/mainloop.c seafile-ccnet-4.1.2/lib/mainloop.c
++--- seafile-ccnet-4.1.2.orig/lib/mainloop.c 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/lib/mainloop.c 2015-09-09 19:22:23.517461948 +0200
++@@ -3,13 +3,9 @@
++ #include "include.h"
++ #include <ccnet.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++ #include <event2/event_compat.h>
++ #include <event2/event_struct.h>
++-#else
++-#include <event.h>
++-#endif
++
++ static int
++ cmdrsp_cb (const char *code, char *content, int clen, void *data)
++diff -rupN seafile-ccnet-4.1.2.orig/lib/net.h seafile-ccnet-4.1.2/lib/net.h
++--- seafile-ccnet-4.1.2.orig/lib/net.h 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/lib/net.h 2015-09-09 19:22:23.517461948 +0200
++@@ -19,11 +19,7 @@
++ #include <netinet/tcp.h>
++ #endif
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/util.h>
++-#else
++-#include <evutil.h>
++-#endif
++
++ #ifdef WIN32
++ #define ECONNREFUSED WSAECONNREFUSED
++diff -rupN seafile-ccnet-4.1.2.orig/lib/packet-io.h seafile-ccnet-4.1.2/lib/packet-io.h
++--- seafile-ccnet-4.1.2.orig/lib/packet-io.h 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/lib/packet-io.h 2015-09-09 19:22:23.518461976 +0200
++@@ -5,11 +5,7 @@
++
++ #include <packet.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/util.h>
++-#else
++-#include <evutil.h>
++-#endif
++
++ struct buffer;
++
++diff -rupN seafile-ccnet-4.1.2.orig/lib/processor.c seafile-ccnet-4.1.2/lib/processor.c
++--- seafile-ccnet-4.1.2.orig/lib/processor.c 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/lib/processor.c 2015-09-09 19:22:23.518461976 +0200
++@@ -4,11 +4,7 @@
++
++ #include <pthread.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++-#else
++-#include <event.h>
++-#endif
++
++ #include "ccnet-client.h"
++ #include "processor.h"
++diff -rupN seafile-ccnet-4.1.2.orig/lib/timer.c seafile-ccnet-4.1.2/lib/timer.c
++--- seafile-ccnet-4.1.2.orig/lib/timer.c 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/lib/timer.c 2015-09-09 19:22:23.519462004 +0200
++@@ -1,12 +1,8 @@
++ /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++ #include <event2/event_compat.h>
++ #include <event2/event_struct.h>
++-#else
++-#include <event.h>
++-#endif
++
++ #include <sys/time.h>
++
++diff -rupN seafile-ccnet-4.1.2.orig/lib/utils.h seafile-ccnet-4.1.2/lib/utils.h
++--- seafile-ccnet-4.1.2.orig/lib/utils.h 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/lib/utils.h 2015-09-09 19:22:23.519462004 +0200
++@@ -11,11 +11,7 @@
++ #include <glib-object.h>
++ #include <stdlib.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/util.h>
++-#else
++-#include <evutil.h>
++-#endif
++
++ #ifdef WIN32
++ #include <errno.h>
++diff -rupN seafile-ccnet-4.1.2.orig/net/cluster/server.c seafile-ccnet-4.1.2/net/cluster/server.c
++--- seafile-ccnet-4.1.2.orig/net/cluster/server.c 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/net/cluster/server.c 2015-09-09 19:24:33.800125741 +0200
++@@ -6,11 +6,7 @@
++ #include <stdio.h>
++ #include <getopt.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/dns.h>
++-#else
++-#include <evdns.h>
++-#endif
++
++ #include "inner-session.h"
++ #include "outer-session.h"
++diff -rupN seafile-ccnet-4.1.2.orig/net/common/connect-mgr.h seafile-ccnet-4.1.2/net/common/connect-mgr.h
++--- seafile-ccnet-4.1.2.orig/net/common/connect-mgr.h 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/net/common/connect-mgr.h 2015-09-09 19:22:23.520462032 +0200
++@@ -3,11 +3,7 @@
++ #ifndef CCNET_CONNECTION_MANAGER
++ #define CCNET_CONNECTION_MANAGER
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++-#else
++-#include <event.h>
++-#endif
++
++ #include "timer.h"
++
++diff -rupN seafile-ccnet-4.1.2.orig/net/common/packet-io.c seafile-ccnet-4.1.2/net/common/packet-io.c
++--- seafile-ccnet-4.1.2.orig/net/common/packet-io.c 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/net/common/packet-io.c 2015-09-09 19:22:23.521462060 +0200
++@@ -13,13 +13,9 @@
++
++ #include <unistd.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++ #include <event2/bufferevent.h>
++ #include <event2/bufferevent_struct.h>
++-#else
++-#include <event.h>
++-#endif
++
++ #include <glib.h>
++ #include <errno.h>
++diff -rupN seafile-ccnet-4.1.2.orig/net/common/packet-io.h seafile-ccnet-4.1.2/net/common/packet-io.h
++--- seafile-ccnet-4.1.2.orig/net/common/packet-io.h 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/net/common/packet-io.h 2015-09-09 19:22:23.521462060 +0200
++@@ -5,13 +5,9 @@
++
++ #include "packet.h"
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/util.h>
++ #include <event2/buffer.h>
++ #include <event2/buffer_compat.h>
++-#else
++-#include <evutil.h>
++-#endif
++
++ /* struct evbuffer; */
++ /* for libevent2 */
++diff -rupN seafile-ccnet-4.1.2.orig/net/common/peer.c seafile-ccnet-4.1.2/net/common/peer.c
++--- seafile-ccnet-4.1.2.orig/net/common/peer.c 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/net/common/peer.c 2015-09-09 19:22:23.522462088 +0200
++@@ -2,14 +2,10 @@
++
++ #include "common.h"
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++ #include <event2/bufferevent.h>
++ #include <event2/bufferevent_compat.h>
++ #include <event2/bufferevent_struct.h>
++-#else
++-#include <event.h>
++-#endif
++
++ #include <stdio.h>
++ #include <stdlib.h>
++diff -rupN seafile-ccnet-4.1.2.orig/net/common/session.h seafile-ccnet-4.1.2/net/common/session.h
++--- seafile-ccnet-4.1.2.orig/net/common/session.h 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/net/common/session.h 2015-09-09 19:22:23.523462116 +0200
++@@ -3,13 +3,9 @@
++ #ifndef CCNET_SESSION_H
++ #define CCNET_SESSION_H
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++ #include <event2/event_compat.h>
++ #include <event2/event_struct.h>
++-#else
++-#include <event.h>
++-#endif
++
++ #include <glib.h>
++ #include <glib/gstdio.h>
++diff -rupN seafile-ccnet-4.1.2.orig/net/daemon/ccnet-daemon.c seafile-ccnet-4.1.2/net/daemon/ccnet-daemon.c
++--- seafile-ccnet-4.1.2.orig/net/daemon/ccnet-daemon.c 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/net/daemon/ccnet-daemon.c 2015-09-09 19:24:59.313846178 +0200
++@@ -6,12 +6,8 @@
++ #include <stdio.h>
++ #include <getopt.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/dns.h>
++ #include <event2/dns_compat.h>
++-#else
++-#include <evdns.h>
++-#endif
++
++ #include "daemon-session.h"
++ #include "rpc-service.h"
++diff -rupN seafile-ccnet-4.1.2.orig/net/daemon/ccnet-test.c seafile-ccnet-4.1.2/net/daemon/ccnet-test.c
++--- seafile-ccnet-4.1.2.orig/net/daemon/ccnet-test.c 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/net/daemon/ccnet-test.c 2015-09-09 19:24:45.089444412 +0200
++@@ -5,11 +5,7 @@
++
++ #include <stdio.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/dns.h>
++-#else
++-#include <evdns.h>
++-#endif
++
++ #include "utils.h"
++
++diff -rupN seafile-ccnet-4.1.2.orig/net/server/ccnet-server.c seafile-ccnet-4.1.2/net/server/ccnet-server.c
++--- seafile-ccnet-4.1.2.orig/net/server/ccnet-server.c 2015-09-09 18:49:35.000000000 +0200
+++++ seafile-ccnet-4.1.2/net/server/ccnet-server.c 2015-09-09 19:25:53.967392265 +0200
++@@ -6,11 +6,7 @@
++ #include <stdio.h>
++ #include <getopt.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/dns.h>
++-#else
++-#include <evdns.h>
++-#endif
++
++ #include "server-session.h"
++ #include "user-mgr.h"
+diff --git a/feeds/packages/net/seafile-seahub/Makefile b/feeds/packages/net/seafile-seahub/Makefile
+new file mode 100644
+index 0000000..cbedc5c
+--- /dev/null
++++ b/feeds/packages/net/seafile-seahub/Makefile
+@@ -0,0 +1,159 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=seafile-seahub
++PKG_VERSION:=4.1.2
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++PKG_LICENSE:=Apache-2.0
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/haiwen/seahub.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=3fb1288f920de03a4e2e6a06b60671ce98971742
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/seafile-seahub
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Seafile server - seahub component
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++ URL:=http://seafile.com/
++ DEPENDS:=+python +simplejson +python-imglib +python-setuptools
++endef
++
++define Package/seafile-seahub/description
++ The web end of seafile server.
++
++ NOTE: in order to have better performance, language support is turned off by default.
++ Please set 'USE_I18N = True' in seahub_settings.py to support multiple languages.
++endef
++
++PKG_BUILD_DEPENDS:=python-setuptools
++PYTHONPATH:=$(PYTHONPATH):$(PKG_BUILD_DIR)/thirdpart
++
++define Download/django
++ FILE=Django-1.5.8.tar.gz
++ URL=https://www.djangoproject.com/m/releases/1.5/
++ MD5SUM:=675fc736e2c29090f005e217ccf90b5b
++endef
++
++define Download/djblets
++ PROTO=git
++ URL=https://github.com/djblets/djblets.git
++ SUBDIR=djblets-0.6.14
++ FILE=djblets-0.6.14.tar.gz
++ VERSION=58c09bae9b71ac164f78c76746fd2e545aae6c68
++endef
++
++define Download/gunicorn
++ FILE=gunicorn-0.16.1.tar.gz
++ URL=https://pypi.python.org/packages/source/g/gunicorn/
++ MD5SUM:=d53d5d04d941f2a3089e814e753a218f
++endef
++
++define Download/six
++ FILE=six-1.4.1.tar.gz
++ URL=https://pypi.python.org/packages/source/s/six/
++ MD5SUM:=bdbb9e12d3336c198695aa4cf3a61d62
++endef
++
++define Download/chardet
++ FILE=chardet-2.1.1.tar.gz
++ URL=https://pypi.python.org/packages/source/c/chardet/
++ MD5SUM:=295367fd210d20f3febda615a88e1ef0
++endef
++
++define Download/flup
++ FILE=flup-1.0.2-py2.6.egg
++ URL=https://pypi.python.org/packages/2.6/f/flup/
++ MD5SUM:=93ec6e3baeee3e5649a8456105178d4e
++endef
++
++define Download/lockfile
++ FILE=lockfile-0.9.1.tar.gz
++ URL=https://pypi.python.org/packages/source/l/lockfile/
++ MD5SUM:=ce61468d4c1263e3005737bbed2641f0
++endef
++
++define Download/python-daemon
++ FILE=python-daemon-1.5.5.tar.gz
++ URL=https://pypi.python.org/packages/source/p/python-daemon/
++ MD5SUM:=1f6cd41473c2e201021a0aeef395b2b1
++endef
++
++define Download/python-dateutil
++ FILE=python-dateutil-1.5.tar.gz
++ URL=https://pypi.python.org/packages/source/p/python-dateutil/
++ MD5SUM:=0dcb1de5e5cad69490a3b6ab63f0cfa5
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++ # Download python dependencies
++ $(eval $(call Download,django))
++ $(eval $(call Download,djblets))
++ $(eval $(call Download,gunicorn))
++ $(eval $(call Download,six))
++ $(eval $(call Download,chardet))
++ $(eval $(call Download,flup))
++ $(eval $(call Download,lockfile))
++ $(eval $(call Download,python-daemon))
++ $(eval $(call Download,python-dateutil))
++ # Install python dependencies
++ $(call HostPython,, \
++ $(STAGING_DIR_ROOT)/usr/bin/easy_install -d $(PKG_BUILD_DIR)/thirdpart -Z -N \
++ $(DL_DIR)/Django-1.5.8.tar.gz)
++ $(call HostPython,, \
++ $(STAGING_DIR_ROOT)/usr/bin/easy_install -d $(PKG_BUILD_DIR)/thirdpart -Z -N \
++ $(DL_DIR)/djblets-0.6.14.tar.gz)
++ $(call HostPython,, \
++ $(STAGING_DIR_ROOT)/usr/bin/easy_install -d $(PKG_BUILD_DIR)/thirdpart -Z -N \
++ $(DL_DIR)/gunicorn-0.16.1.tar.gz)
++ $(call HostPython,, \
++ $(STAGING_DIR_ROOT)/usr/bin/easy_install -d $(PKG_BUILD_DIR)/thirdpart -Z -N \
++ $(DL_DIR)/six-1.4.1.tar.gz)
++ $(call HostPython,, \
++ $(STAGING_DIR_ROOT)/usr/bin/easy_install -d $(PKG_BUILD_DIR)/thirdpart -Z -N \
++ $(DL_DIR)/chardet-2.1.1.tar.gz)
++ $(call HostPython,, \
++ $(STAGING_DIR_ROOT)/usr/bin/easy_install -d $(PKG_BUILD_DIR)/thirdpart -Z -N \
++ $(DL_DIR)/flup-1.0.2-py2.6.egg)
++ $(call HostPython,, \
++ $(STAGING_DIR_ROOT)/usr/bin/easy_install -d $(PKG_BUILD_DIR)/thirdpart -Z -N \
++ $(DL_DIR)/lockfile-0.9.1.tar.gz)
++ $(call HostPython,, \
++ $(STAGING_DIR_ROOT)/usr/bin/easy_install -d $(PKG_BUILD_DIR)/thirdpart -Z -N \
++ $(DL_DIR)/python-daemon-1.5.5.tar.gz)
++ $(call HostPython,, \
++ $(STAGING_DIR_ROOT)/usr/bin/easy_install -d $(PKG_BUILD_DIR)/thirdpart -Z -N \
++ $(DL_DIR)/python-dateutil-1.5.tar.gz)
++endef
++
++define Package/seafile-seahub/install
++ $(INSTALL_DIR) $(1)/usr/share/seafile/seafile-server/seahub
++ $(CP) $(PKG_BUILD_DIR)/{locale,media,fabfile,seahub,sql,tests,thirdpart,tools} $(1)/usr/share/seafile/seafile-server/seahub/
++ $(CP) $(PKG_BUILD_DIR)/*.{sh,template,py,txt} $(1)/usr/share/seafile/seafile-server/seahub/
++ $(CP) $(PKG_BUILD_DIR)/{CONTRIBUTORS,HACKING,README.markdown} $(1)/usr/share/seafile/seafile-server/seahub/
++ $(CP) $(PKG_BUILD_DIR)/pylintrc* $(1)/usr/share/seafile/seafile-server/seahub/
++ # fix python exec path in scripts
++ sed -i 's/#!.*/#!\/usr\/bin\/python/g' $(1)/usr/share/seafile/seafile-server/seahub/thirdpart/chardetect.py
++ sed -i 's/#!.*/#!\/usr\/bin\/python/g' $(1)/usr/share/seafile/seafile-server/seahub/thirdpart/django-admin.py
++ sed -i 's/#!.*/#!\/usr\/bin\/python/g' $(1)/usr/share/seafile/seafile-server/seahub/thirdpart/gunicorn
++ sed -i 's/#!.*/#!\/usr\/bin\/python/g' $(1)/usr/share/seafile/seafile-server/seahub/thirdpart/gunicorn_django
++ sed -i 's/#!.*/#!\/usr\/bin\/python/g' $(1)/usr/share/seafile/seafile-server/seahub/thirdpart/gunicorn_paster
++ find $(1) -name "*\.pyc" -o -name "*\.pyo" | xargs rm -f
++ sed -i "s/\(SEAFILE_VERSION\s*=\s*\)'\([0-9]\.[0-9]\.[0-9]\)'/\1'$(PKG_VERSION)'/g" $(1)/usr/share/seafile/seafile-server/seahub/seahub/settings.py
++endef
++
++$(eval $(call BuildPackage,seafile-seahub))
+diff --git a/feeds/packages/net/seafile-seahub/patches/010-default-config.patch b/feeds/packages/net/seafile-seahub/patches/010-default-config.patch
+new file mode 100644
+index 0000000..4168dc1
+--- /dev/null
++++ b/feeds/packages/net/seafile-seahub/patches/010-default-config.patch
+@@ -0,0 +1,30 @@
++diff -rupN seahub-3.1.7-server.orig/seahub/settings.py seahub-3.1.7-server/seahub/settings.py
++--- seahub-3.1.7-server.orig/seahub/settings.py 2014-10-20 09:32:35.000000000 +0200
+++++ seahub-3.1.7-server/seahub/settings.py 2014-12-10 15:47:21.625104606 +0100
++@@ -46,7 +46,7 @@ SITE_ID = 1
++
++ # If you set this to False, Django will make some optimizations so as not
++ # to load the internationalization machinery.
++-USE_I18N = True
+++USE_I18N = False
++
++ # If you set this to False, Django will not format dates, numbers and
++ # calendars according to the current locale.
++@@ -209,7 +209,7 @@ SHOW_REPO_DOWNLOAD_BUTTON = False
++ REPO_PASSWORD_MIN_LENGTH = 8
++
++ # mininum length for user's password
++-USER_PASSWORD_MIN_LENGTH = 6
+++USER_PASSWORD_MIN_LENGTH = 8
++
++ # LEVEL based on four types of input:
++ # num, upper letter, lower letter, other symbols
++@@ -218,7 +218,7 @@ USER_PASSWORD_STRENGTH_LEVEL = 3
++
++ # default False, only check USER_PASSWORD_MIN_LENGTH
++ # when True, check password strength level, STRONG(or above) is allowed
++-USER_STRONG_PASSWORD_REQUIRED = False
+++USER_STRONG_PASSWORD_REQUIRED = True
++
++ # Using server side crypto by default, otherwise, let user choose crypto method.
++ FORCE_SERVER_CRYPTO = True
+diff --git a/feeds/packages/net/seafile-server/Makefile b/feeds/packages/net/seafile-server/Makefile
+new file mode 100644
+index 0000000..949345d
+--- /dev/null
++++ b/feeds/packages/net/seafile-server/Makefile
+@@ -0,0 +1,142 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++# NOTE: make sure to update EXTRA_DEPENDS in case of version/release changes!
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=seafile-server
++PKG_VERSION:=4.1.2
++PKG_RELEASE=$(PKG_SOURCE_VERSION)-5
++PKG_LICENSE:=GPL-3.0
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/haiwen/seafile.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=c0166019c712e2e1d5e532fd5f7401b1b72db6d8
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/seafile-server
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Seafile server
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++ URL:=http://seafile.com/
++ DEPENDS:=+libarchive +libopenssl +glib2 +libsearpc +seafile-ccnet +seafile-seahub \
++ +sqlite3-cli +python-mysql +jansson +libevent2 +libevent2-openssl +zlib +libzdb +libsqlite3 \
++ +libmysqlclient +libpthread +libuuid \
++ +bash +sudo +procps-ng +procps-ng-pkill $(ICONV_DEPENDS)
++ EXTRA_DEPENDS:=seafile-ccnet (=4.1.2-a73109f09af4ecc49cdc4c57cdde51b38e15c31a-2), seafile-seahub (=4.1.2-3fb1288f920de03a4e2e6a06b60671ce98971742)
++endef
++
++define Package/seafile-server/description
++ Open source cloud storage with advanced features on privacy protection and teamwork.
++endef
++
++define Package/seafile-server/conffiles
++/etc/config/seafile
++endef
++
++CONFIGURE_ARGS += --disable-riak \
++ --disable-client \
++ --disable-fuse \
++ --enable-server \
++ --enable-python \
++ --disable-static-build \
++ --disable-server-pkg \
++ --disable-console
++
++PKG_BUILD_DEPENDS:=vala/host \
++ libsearpc/host \
++ libevhtp-1.1
++
++TARGET_LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib -liconv \
++ -L$(STAGING_DIR)/usr/lib/mysql -lmysqlclient -lz
++
++define Package/seafile-server/install
++ $(INSTALL_DIR) $(1)/usr/{bin,lib}
++ $(INSTALL_DIR) $(1)/usr/lib/python2.7/site-packages
++ $(INSTALL_DIR) $(1)/usr/share/seafile/seafile-server/runtime
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_DIR) $(1)/etc/config
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/python2.7/site-packages/seafile/ $(1)/usr/lib/python2.7/site-packages/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/python2.7/site-packages/seaserv/ $(1)/usr/lib/python2.7/site-packages/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libseafile.so* $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/scripts/seaf-gc.sh $(1)/usr/share/seafile/seafile-server/
++ $(CP) $(PKG_BUILD_DIR)/scripts/setup-seafile-mysql.py $(1)/usr/share/seafile/seafile-server/
++ $(CP) $(PKG_BUILD_DIR)/scripts/setup-seafile-mysql.sh $(1)/usr/share/seafile/seafile-server/
++ $(CP) $(PKG_BUILD_DIR)/scripts/sqlite2mysql.py $(1)/usr/share/seafile/seafile-server/
++ $(CP) $(PKG_BUILD_DIR)/scripts/sqlite2mysql.sh $(1)/usr/share/seafile/seafile-server/
++ $(CP) $(PKG_BUILD_DIR)/scripts/upgrade/ $(1)/usr/share/seafile/seafile-server/
++ $(INSTALL_BIN) ./files/seafile.init $(1)/etc/init.d/seafile
++ $(CP) ./files/seafile.conf $(1)/etc/config/seafile
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/seafile/ $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libseafile.pc $(1)/usr/lib/pkgconfig/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libseafile.so* $(1)/usr/lib/
++endef
++
++define Package/seafile-server/postinst
++#!/bin/sh
++
++if ! group_exists seafile; then
++ group_add_next seafile; fi
++
++SEAFILE_GID=$$(grep -s '^seafile:' "$${IPKG_INSTROOT}/etc/group" | cut -d: -f3)
++
++if ! user_exists seafile; then
++ user_add seafile "" "$${SEAFILE_GID}" seafile /usr/share/seafile /bin/sh; fi
++
++if [ -z "$${IPKG_INSTROOT}" ]
++then
++ chown -R seafile:seafile /usr/share/seafile/
++ chmod -R o-rwx /usr/share/seafile/
++
++ if [ ! -d /usr/share/seafile/seafile-data ]
++ then
++ echo "*** Installation completed, running configuration script..."
++ /etc/init.d/seafile setup
++
++ if [ $$? -ne 0 ]
++ then
++ echo
++ echo "*** ERROR: Configuration failed. Please fix the issues if any and re-run the script using the command below:"
++ echo "*** \"/etc/init.d/seafile setup\""
++ fi
++
++ echo
++ echo "*** NOTE: you need to create an admin account before using Seafile."
++ echo "*** Please run \"/etc/init.d/seafile create_admin\" to do so."
++ else
++ echo "*** It seems you are upgrading from an older version."
++ echo "*** If so, please run the appropriate upgrade scripts before using the new version of Seafile."
++ echo "*** Upgrade scripts are located at \"/usr/share/seafile/seafile-server/upgrade\""
++ echo
++ echo "*** For more information, please read http://manual.seafile.com/deploy/upgrade.html"
++ fi
++else
++ cat > "$${IPKG_INSTROOT}/etc/uci-defaults/99_seafile-server" << EOF
++#!/bin/sh
++
++chown -R seafile:seafile /usr/share/seafile/
++chmod -R o-rwx /usr/share/seafile/
++exit 0
++EOF
++fi
++endef
++
++$(eval $(call BuildPackage,seafile-server))
+diff --git a/feeds/packages/net/seafile-server/files/seafile.conf b/feeds/packages/net/seafile-server/files/seafile.conf
+new file mode 100644
+index 0000000..fa8240e
+--- /dev/null
++++ b/feeds/packages/net/seafile-server/files/seafile.conf
+@@ -0,0 +1,2 @@
++# Start Seahub in fastcgi mode - 1 = enable, 0 = disable
++SEAHUB_FASTCGI=0
+diff --git a/feeds/packages/net/seafile-server/files/seafile.init b/feeds/packages/net/seafile-server/files/seafile.init
+new file mode 100755
+index 0000000..42f98e2
+--- /dev/null
++++ b/feeds/packages/net/seafile-server/files/seafile.init
+@@ -0,0 +1,57 @@
++#!/bin/sh /etc/rc.common
++
++START=99
++APP=seafile
++EXTRA_HELP=" setup Runs the setup script
++ create_admin Creates the administrative login
++ reset_admin Alias to create_admin"
++EXTRA_COMMANDS="setup create_admin reset_admin"
++
++SEAHUB_FASTCGI=0
++
++[ -f /etc/config/seafile ] && \
++ . /etc/config/seafile
++
++export PATH="/usr/share/seafile/seafile-server/seahub/thirdpart:${PATH}"
++export PYTHONPATH="/usr/share/seafile/seafile-server/seahub/thirdpart:${PYTHONPATH}"
++
++start() {
++ if [ ! -d /var/run/seafile ]
++ then
++ mkdir /var/run/seafile
++ chown seafile:seafile /var/run/seafile
++ chmod o-rwx /var/run/seafile
++ fi
++
++ if [ ${SEAHUB_FASTCGI} -eq 1 ]; then
++ cd "/usr/share/seafile" && \
++ sudo PYTHONPATH="${PYTHONPATH}" -u seafile -E \
++ "/usr/bin/seafile-admin" start --fastcgi
++ else
++ cd "/usr/share/seafile" && \
++ sudo PYTHONPATH="${PYTHONPATH}" -u seafile -E \
++ "/usr/bin/seafile-admin" start
++ fi
++}
++
++stop() {
++ cd "/usr/share/seafile" && \
++ sudo PYTHONPATH="${PYTHONPATH}" -u seafile -E \
++ "/usr/bin/seafile-admin" stop
++}
++
++setup() {
++ cd "/usr/share/seafile" && \
++ sudo PYTHONPATH="${PYTHONPATH}" -u seafile -E \
++ "/usr/bin/seafile-admin" setup
++}
++
++create_admin() {
++ cd "/usr/share/seafile" && \
++ sudo PYTHONPATH="${PYTHONPATH}" -u seafile -E \
++ "/usr/bin/seafile-admin" create-admin
++}
++
++reset_admin() {
++ create_admin
++}
+diff --git a/feeds/packages/net/seafile-server/patches/020-script-patches.patch b/feeds/packages/net/seafile-server/patches/020-script-patches.patch
+new file mode 100644
+index 0000000..8bb7ae7
+--- /dev/null
++++ b/feeds/packages/net/seafile-server/patches/020-script-patches.patch
+@@ -0,0 +1,40 @@
++diff -rupN seafile-3.1.7-server.orig/scripts/seaf-gc.sh seafile-3.1.7-server/scripts/seaf-gc.sh
++--- seafile-3.1.7-server.orig/scripts/seaf-gc.sh 2014-10-16 05:30:04.000000000 +0200
+++++ seafile-3.1.7-server/scripts/seaf-gc.sh 2014-12-13 00:51:12.919136978 +0100
++@@ -6,11 +6,10 @@ SCRIPT=$(readlink -f "$0")
++ INSTALLPATH=$(dirname "${SCRIPT}")
++ TOPDIR=$(dirname "${INSTALLPATH}")
++ default_ccnet_conf_dir=${TOPDIR}/ccnet
++-seaf_gc=${INSTALLPATH}/seafile/bin/seafserv-gc
+++seaf_gc=/usr/bin/seafserv-gc
++ seaf_gc_opts=""
++
++-export PATH=${INSTALLPATH}/seafile/bin:$PATH
++-export SEAFILE_LD_LIBRARY_PATH=${INSTALLPATH}/seafile/lib/:${INSTALLPATH}/seafile/lib64:${LD_LIBRARY_PATH}
+++export PYTHONPATH="/usr/share/seafile/seafile-server/seahub/thirdpart:$PYTHONPATH"
++
++ script_name=$0
++ function usage () {
++@@ -78,9 +77,7 @@ function run_seaf_gc () {
++
++ echo "Starting seafserv-gc, please wait ..."
++
++- LD_LIBRARY_PATH=$SEAFILE_LD_LIBRARY_PATH ${seaf_gc} \
++- -c "${default_ccnet_conf_dir}" -d "${seafile_data_dir}" \
++- ${seaf_gc_opts}
+++ ${seaf_gc} -c "${default_ccnet_conf_dir}" -d "${seafile_data_dir}" ${seaf_gc_opts}
++
++ echo "seafserv-gc run done"
++ echo
++diff -rupN seafile-3.1.7-server.orig/scripts/setup-seafile-mysql.sh seafile-3.1.7-server/scripts/setup-seafile-mysql.sh
++--- seafile-3.1.7-server.orig/scripts/setup-seafile-mysql.sh 2014-10-16 05:30:04.000000000 +0200
+++++ seafile-3.1.7-server/scripts/setup-seafile-mysql.sh 2014-12-13 00:51:49.242172631 +0100
++@@ -9,6 +9,8 @@ set -e
++ SCRIPT=$(readlink -f "$0")
++ INSTALLPATH=$(dirname "${SCRIPT}")
++
+++export PYTHONPATH="/usr/share/seafile/seafile-server/seahub/thirdpart:$PYTHONPATH"
+++
++ cd "$INSTALLPATH"
++
++ python_script=setup-seafile-mysql.py
+diff --git a/feeds/packages/net/seafile-server/patches/030-pidfiles-in-same-directory.patch b/feeds/packages/net/seafile-server/patches/030-pidfiles-in-same-directory.patch
+new file mode 100644
+index 0000000..4338f17
+--- /dev/null
++++ b/feeds/packages/net/seafile-server/patches/030-pidfiles-in-same-directory.patch
+@@ -0,0 +1,24 @@
++diff -rupN seafile-3.1.7-server.orig/controller/seafile-controller.c seafile-3.1.7-server/controller/seafile-controller.c
++--- seafile-3.1.7-server.orig/controller/seafile-controller.c 2014-10-16 05:30:04.000000000 +0200
+++++ seafile-3.1.7-server/controller/seafile-controller.c 2014-11-28 16:50:24.053674057 +0100
++@@ -21,7 +21,7 @@
++
++ SeafileController *ctl;
++
++-static char *controller_pidfile = NULL;
+++static char *controller_pidfile = "/var/run/seafile/seafile-controller.pid";
++
++ char *bin_dir = NULL;
++ char *installpath = NULL;
++@@ -614,9 +614,9 @@ stop_ccnet_server ()
++ static void
++ init_pidfile_path (SeafileController *ctl)
++ {
++- char *pid_dir = g_build_filename (topdir, "pids", NULL);
+++ char *pid_dir = g_path_get_dirname (controller_pidfile);
++ if (!g_file_test(pid_dir, G_FILE_TEST_EXISTS)) {
++- if (g_mkdir(pid_dir, 0777) < 0) {
+++ if (g_mkdir(pid_dir, 0755) < 0) {
++ seaf_warning("failed to create pid dir %s: %s", pid_dir, strerror(errno));
++ controller_exit(1);
++ }
+diff --git a/feeds/packages/net/seafile-server/patches/040-seafile-admin.patch b/feeds/packages/net/seafile-server/patches/040-seafile-admin.patch
+new file mode 100644
+index 0000000..1948c73
+--- /dev/null
++++ b/feeds/packages/net/seafile-server/patches/040-seafile-admin.patch
+@@ -0,0 +1,68 @@
++diff -rupN seafile-3.1.7-server.orig/tools/seafile-admin seafile-3.1.7-server/tools/seafile-admin
++--- seafile-3.1.7-server.orig/tools/seafile-admin 2014-10-16 05:30:04.000000000 +0200
+++++ seafile-3.1.7-server/tools/seafile-admin 2014-12-22 21:52:25.929781054 +0100
++@@ -416,13 +416,13 @@ def create_gunicorn_conf():
++ content = '''\
++ import os
++ daemon = True
++-workers = 3
+++workers = 1
+++threads = 3
++
++ # Logging
++ runtime_dir = os.path.dirname(__file__)
++-pidfile = os.path.join(runtime_dir, 'seahub.pid')
+++pidfile = '/var/run/seafile/seahub.pid'
++ errorlog = os.path.join(runtime_dir, 'error.log')
++-accesslog = os.path.join(runtime_dir, 'access.log')
++ '''
++ try:
++ with open(confpath, 'w') as fp:
++@@ -607,6 +607,7 @@ def start_seahub_gunicorn():
++ 'gunicorn_django',
++ '-c', conf[CONF_SEAHUB_CONF],
++ '-b', '0.0.0.0:%s' % conf[CONF_SEAHUB_PORT],
+++ '-t', '120',
++ ]
++
++ info('Starting seahub...')
++@@ -625,6 +626,7 @@ def start_seahub_fastcgi():
++ 'pidfile=%(pidfile)s',
++ 'outlog=%(outlog)s',
++ 'errlog=%(errlog)s',
+++ 'method=threaded',
++ ]
++
++ cmdline = ' '.join(argv) % \
++@@ -693,7 +695,7 @@ def check_layout(args):
++ conf[CONF_SEAFILE_DIR] = seafile_data_dir
++ conf[CONF_SEAHUB_DIR] = seahub_dir
++ conf[CONF_SEAHUB_CONF] = seahub_conf
++- conf[CONF_SEAHUB_PIDFILE] = os.path.join(runtime_dir, 'seahub.pid')
+++ conf[CONF_SEAHUB_PIDFILE] = '/var/run/seafile/seahub.pid'
++ conf[CONF_SEAHUB_OUTLOG] = os.path.join(runtime_dir, 'access.log')
++ conf[CONF_SEAHUB_ERRLOG] = os.path.join(runtime_dir, 'error.log')
++
++@@ -738,10 +740,9 @@ def setup_seafile(args):
++ print '-----------------------------------------------------------------'
++ print '-----------------------------------------------------------------'
++ print
++- print 'To start/stop seafile server:'
+++ print 'To start, stop or restart seafile server, please run as root:'
++ print
++- print highlight(' $ cd %s' % cwd)
++- print highlight(' $ %s { start | stop }' % SCRIPT_NAME)
+++ print highlight(' # /etc/init.d/seafile { start | stop | restart }')
++ print
++ print 'If you have any problem, refer to\n'
++ print
++@@ -802,8 +803,7 @@ def start_seafile(args):
++ def stop_seafile(dummy):
++ info('Stopping seafile server')
++ pkill('seafile-controller')
++- runtime_dir = os.path.join(cwd, 'seafile-server', 'runtime')
++- pidfile = os.path.join(runtime_dir, 'seahub.pid')
+++ pidfile = '/var/run/seafile/seahub.pid'
++ try:
++ with open(pidfile, 'r') as fp:
++ pid = fp.read().strip('\n ')
+diff --git a/feeds/packages/net/seafile-server/patches/050-libevhtp-search-path-fix.patch b/feeds/packages/net/seafile-server/patches/050-libevhtp-search-path-fix.patch
+new file mode 100644
+index 0000000..cb7e545
+--- /dev/null
++++ b/feeds/packages/net/seafile-server/patches/050-libevhtp-search-path-fix.patch
+@@ -0,0 +1,17 @@
++diff -rupN seafile-server-4.1.2.orig/server/Makefile.am seafile-server-4.1.2/server/Makefile.am
++--- seafile-server-4.1.2.orig/server/Makefile.am 2015-05-02 11:04:11.000000000 +0200
+++++ seafile-server-4.1.2/server/Makefile.am 2015-06-14 01:28:55.924834806 +0200
++@@ -4,6 +4,7 @@ AM_CFLAGS = -DPKGDATADIR=\"$(pkgdatadir)
++ -DPACKAGE_DATA_DIR=\""$(pkgdatadir)"\" \
++ -DSEAFILE_SERVER \
++ -DFULL_FEATURE \
+++ -I$(STAGING_DIR)/usr/include/libevhtp-1.1 \
++ -I$(top_srcdir)/include \
++ -I$(top_srcdir)/lib \
++ -I$(top_builddir)/lib \
++@@ -122,4 +123,4 @@ seaf_server_LDADD = @CCNET_LIBS@ \
++ @SEARPC_LIBS@ @JANSSON_LIBS@ @ZDB_LIBS@ @CURL_LIBS@ ${LIB_WS32} @ZLIB_LIBS@ \
++ @LIBARCHIVE_LIBS@
++
++-seaf_server_LDFLAGS = @STATIC_COMPILE@ @SERVER_PKG_RPATH@
+++seaf_server_LDFLAGS = @STATIC_COMPILE@ @SERVER_PKG_RPATH@ -L$(STAGING_DIR)/usr/lib/libevhtp-1.1
+diff --git a/feeds/packages/net/seafile-server/patches/060-libevent2-include-path.patch b/feeds/packages/net/seafile-server/patches/060-libevent2-include-path.patch
+new file mode 100644
+index 0000000..958a136
+--- /dev/null
++++ b/feeds/packages/net/seafile-server/patches/060-libevent2-include-path.patch
+@@ -0,0 +1,107 @@
++diff -rupN seafile-server-4.1.2.orig/lib/net.c seafile-server-4.1.2/lib/net.c
++--- seafile-server-4.1.2.orig/lib/net.c 2015-09-09 19:31:56.000000000 +0200
+++++ seafile-server-4.1.2/lib/net.c 2015-09-14 20:20:30.906021296 +0200
++@@ -31,11 +31,7 @@
++
++ #include <fcntl.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/util.h>
++-#else
++-#include <evutil.h>
++-#endif
++
++ #include "net.h"
++
++diff -rupN seafile-server-4.1.2.orig/lib/net.h seafile-server-4.1.2/lib/net.h
++--- seafile-server-4.1.2.orig/lib/net.h 2015-09-09 19:31:56.000000000 +0200
+++++ seafile-server-4.1.2/lib/net.h 2015-09-14 20:20:30.906021296 +0200
++@@ -19,11 +19,7 @@
++ #include <netinet/tcp.h>
++ #endif
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/util.h>
++-#else
++-#include <evutil.h>
++-#endif
++
++ #ifdef WIN32
++ #define ECONNREFUSED WSAECONNREFUSED
++diff -rupN seafile-server-4.1.2.orig/lib/utils.h seafile-server-4.1.2/lib/utils.h
++--- seafile-server-4.1.2.orig/lib/utils.h 2015-09-09 19:31:56.000000000 +0200
+++++ seafile-server-4.1.2/lib/utils.h 2015-09-14 20:20:30.907021326 +0200
++@@ -13,11 +13,7 @@
++ #include <stdlib.h>
++ #include <sys/stat.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/util.h>
++-#else
++-#include <evutil.h>
++-#endif
++
++ #ifdef __linux__
++ #include <endian.h>
++diff -rupN seafile-server-4.1.2.orig/server/access-file.c seafile-server-4.1.2/server/access-file.c
++--- seafile-server-4.1.2.orig/server/access-file.c 2015-09-09 19:31:56.000000000 +0200
+++++ seafile-server-4.1.2/server/access-file.c 2015-09-14 20:20:30.907021326 +0200
++@@ -3,13 +3,9 @@
++ #define DEBUG_FLAG SEAFILE_DEBUG_HTTP
++ #include "log.h"
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++ #include <event2/bufferevent.h>
++ #include <event2/bufferevent_struct.h>
++-#else
++-#include <event.h>
++-#endif
++
++ #include <evhtp.h>
++
++diff -rupN seafile-server-4.1.2.orig/server/http-server.c seafile-server-4.1.2/server/http-server.c
++--- seafile-server-4.1.2.orig/server/http-server.c 2015-09-09 19:31:56.000000000 +0200
+++++ seafile-server-4.1.2/server/http-server.c 2015-09-14 20:20:30.908021355 +0200
++@@ -6,11 +6,7 @@
++ #include <locale.h>
++ #include <sys/types.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++-#else
++-#include <event.h>
++-#endif
++
++ #include <evhtp.h>
++
++diff -rupN seafile-server-4.1.2.orig/server/listen-mgr.c seafile-server-4.1.2/server/listen-mgr.c
++--- seafile-server-4.1.2.orig/server/listen-mgr.c 2015-09-09 19:31:56.000000000 +0200
+++++ seafile-server-4.1.2/server/listen-mgr.c 2015-09-14 20:23:15.614452334 +0200
++@@ -3,11 +3,9 @@
++ #include <event2/event.h>
++ #include <event2/listener.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/bufferevent.h>
++ #include <event2/buffer_compat.h>
++ #include <event2/bufferevent_struct.h>
++-#endif
++
++
++ #include "seafile-session.h"
++diff -rupN seafile-server-4.1.2.orig/server/upload-file.c seafile-server-4.1.2/server/upload-file.c
++--- seafile-server-4.1.2.orig/server/upload-file.c 2015-09-09 19:31:56.000000000 +0200
+++++ seafile-server-4.1.2/server/upload-file.c 2015-09-14 20:20:30.909021385 +0200
++@@ -6,11 +6,7 @@
++ #include <getopt.h>
++ #include <fcntl.h>
++
++-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
++ #include <event2/event.h>
++-#else
++-#include <event.h>
++-#endif
++
++ #include <evhtp.h>
++
+diff --git a/feeds/packages/net/ser2net/Makefile b/feeds/packages/net/ser2net/Makefile
+new file mode 100644
+index 0000000..49c9774
+--- /dev/null
++++ b/feeds/packages/net/ser2net/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ser2net
++PKG_VERSION:=2.10.0
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/ser2net
++PKG_MD5SUM:=cd937041144de83d41d811521e72158c
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ser2net
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Serial to Network Proxy
++ URL:=http://sourceforge.net/projects/ser2net/
++endef
++
++define Package/ser2net/description
++ This project provides a proxy that allows telnet/tcp connections to be made to
++ serial ports on a machine.
++endef
++
++define Package/ser2net/conffiles
++/etc/ser2net.conf
++endef
++
++define Package/ser2net/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/ser2net $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/ser2net.conf $(1)/etc/
++endef
++
++$(eval $(call BuildPackage,ser2net))
+diff --git a/feeds/packages/net/ser2net/patches/001-fix_TIOCSRS485_undeclared_error.patch b/feeds/packages/net/ser2net/patches/001-fix_TIOCSRS485_undeclared_error.patch
+new file mode 100644
+index 0000000..370d0b9
+--- /dev/null
++++ b/feeds/packages/net/ser2net/patches/001-fix_TIOCSRS485_undeclared_error.patch
+@@ -0,0 +1,59 @@
++ser2net: Fix compilation failures due to missing TIOCSRS485 macro
++
++Patch sent upstream:
++ https://sourceforge.net/p/ser2net/mailman/message/32905302/
++
++Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.com>
++
++From: Yegor Yefremov <yegorslists@googlemail.com>
++
++include <asm-generic/ioctls.h> fixes compilations for systems,
++where <asm-generic/ioctls.h> won't be included automatically.
++
++Move special Linux includes to dataxfer.h.
++
++Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
++---
++ dataxfer.h | 5 +++--
++ devcfg.c | 2 --
++ 2 files changed, 3 insertions(+), 4 deletions(-)
++
++--- a/dataxfer.h
+++++ b/dataxfer.h
++@@ -20,8 +20,6 @@
++ #ifndef DATAXFER
++ #define DATAXFER
++
++-#include <linux/serial.h>
++-
++ #include "controller.h"
++
++ #ifdef USE_UUCP_LOCKING
++@@ -30,6 +28,9 @@ extern int uucp_locking_enabled;
++
++ #ifdef linux
++
+++#include <linux/serial.h>
+++#include <asm-generic/ioctls.h>
+++
++ #define USE_RS485_FEATURE
++
++ /* Check, if the toolchain provides serial_rs485 structure and macros */
++--- a/devcfg.c
+++++ b/devcfg.c
++@@ -18,7 +18,6 @@
++ */
++
++ /* This code handles generating the configuration for the serial port. */
++-
++ #include <unistd.h>
++ #include <termios.h>
++ #include <sys/ioctl.h>
++@@ -31,7 +30,6 @@
++ #include <signal.h>
++ #include <errno.h>
++ #include <syslog.h>
++-#include <linux/serial.h>
++
++ #include "ser2net.h"
++ #include "selector.h"
+diff --git a/feeds/packages/net/ser2net/patches/002-LED-trigger.patch b/feeds/packages/net/ser2net/patches/002-LED-trigger.patch
+new file mode 100644
+index 0000000..bfc2734
+--- /dev/null
++++ b/feeds/packages/net/ser2net/patches/002-LED-trigger.patch
+@@ -0,0 +1,418 @@
++From fa68debd94d40299dd2a69abd0a820ccfaadcbe8 Mon Sep 17 00:00:00 2001
++From: Michael Heimpold <michael.heimpold@i2se.com>
++Date: Wed, 22 Apr 2015 13:35:43 +0200
++Subject: [PATCH] Add support for triggering LEDs during serial traffic
++
++Signed-off-by: Michael Heimpold <michael.heimpold@i2se.com>
++---
++
++Patch sent upstream:
++ http://sourceforge.net/p/ser2net/mailman/message/34064847/
++
++ Makefile.am | 4 +--
++ dataxfer.c | 20 ++++++++++++
++ readconfig.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ ser2net.conf | 13 ++++++++
++ sysfs-led.c | 43 +++++++++++++++++++++++++
++ sysfs-led.h | 11 +++++++
++ utils.c | 30 ++++++++++++++++++
++ utils.h | 9 ++++++
++ 8 files changed, 228 insertions(+), 2 deletions(-)
++ create mode 100644 sysfs-led.c
++ create mode 100644 sysfs-led.h
++
++diff --git a/Makefile.am b/Makefile.am
++index d56179f..866eb89 100644
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -2,9 +2,9 @@ sbin_PROGRAMS = ser2net
++ ACLOCAL_AMFLAGS = -I m4
++ AM_CFLAGS=-Wall
++ ser2net_SOURCES = controller.c dataxfer.c devcfg.c readconfig.c selector.c \
++- ser2net.c utils.c telnet.c buffer.c
+++ ser2net.c utils.c telnet.c buffer.c sysfs-led.c
++ noinst_HEADERS = controller.h dataxfer.h devio.h readconfig.h selector.h \
++- utils.h telnet.h buffer.h ser2net.h
+++ utils.h telnet.h buffer.h sysfs-led.h ser2net.h
++ man_MANS = ser2net.8
++ EXTRA_DIST = $(man_MANS) ser2net.conf ser2net.spec ser2net.init
++
++diff --git a/dataxfer.c b/dataxfer.c
++index 646a71b..b99cabf 100644
++--- a/dataxfer.c
+++++ b/dataxfer.c
++@@ -42,6 +42,7 @@
++ #include "telnet.h"
++ #include "devio.h"
++ #include "buffer.h"
+++#include "sysfs-led.h"
++
++ #define SERIAL "term"
++ #define NET "tcp "
++@@ -230,6 +231,12 @@ typedef struct port_info
++ #ifdef USE_RS485_FEATURE
++ struct serial_rs485 *rs485conf;
++ #endif
+++
+++ /*
+++ * LED names to flash for serial traffic
+++ */
+++ char *led_tx;
+++ char *led_rx;
++ } port_info_t;
++
++ port_info_t *ports = NULL; /* Linked list of ports. */
++@@ -311,6 +318,8 @@ init_port_data(port_info_t *port)
++ #ifdef USE_RS485_FEATURE
++ port->rs485conf = NULL;
++ #endif
+++ port->led_tx = NULL;
+++ port->led_rx = NULL;
++ }
++
++ static void
++@@ -530,6 +539,9 @@ handle_dev_fd_read(struct devio *io)
++ /* Do both tracing, ignore errors. */
++ do_trace(port, port->tb, port->dev_to_tcp.buf, count, SERIAL);
++
+++ if (port->led_rx)
+++ led_blink_kick(port->led_rx);
+++
++ port->dev_bytes_received += count;
++
++ if (port->enabled == PORT_TELNET) {
++@@ -759,6 +771,8 @@ handle_tcp_fd_read(int fd, void *data)
++ return;
++ }
++ } else {
+++ if (port->led_tx)
+++ led_blink_kick(port->led_tx);
++ port->dev_bytes_sent += count;
++ port->tcp_to_dev.cursize -= count;
++ if (port->tcp_to_dev.cursize != 0) {
++@@ -1854,6 +1868,12 @@ myconfig(void *data, struct absout *eout, const char *pos)
++ } else if (strncmp(pos, "tb=", 3) == 0) {
++ /* trace both directions. */
++ port->trace_both.filename = find_tracefile(pos + 3);
+++ } else if (strncmp(pos, "led-rx=", 7) == 0) {
+++ /* LED for UART RX traffic */
+++ port->led_rx = find_led(pos + 7);
+++ } else if (strncmp(pos, "led-tx=", 7) == 0) {
+++ /* LED for UART TX traffic */
+++ port->led_tx = find_led(pos + 7);
++ #ifdef USE_RS485_FEATURE
++ } else if (strncmp(pos, "rs485=", 6) == 0) {
++ /* get RS485 configuration. */
++diff --git a/readconfig.c b/readconfig.c
++index d4ca0d4..62cff5c 100644
++--- a/readconfig.c
+++++ b/readconfig.c
++@@ -31,6 +31,7 @@
++ #include "readconfig.h"
++ #include "utils.h"
++ #include "telnet.h"
+++#include "sysfs-led.h"
++
++ #define MAX_LINE_SIZE 256 /* Maximum line length in the config file. */
++
++@@ -361,6 +362,89 @@ free_rs485confs(void)
++ }
++ #endif
++
+++struct led_s
+++{
+++ char *name;
+++ char *device;
+++ unsigned int duration;
+++ struct led_s *next;
+++};
+++
+++/* all LEDs in the system. */
+++struct led_s *leds = NULL;
+++
+++static void
+++handle_led(char *name, char *cfg)
+++{
+++ struct led_s *new_led;
+++ char devicename[256];
+++
+++ new_led = malloc(sizeof(*new_led));
+++ if (!new_led) {
+++ syslog(LOG_ERR, "Out of memory handling LED on %d", lineno);
+++ return;
+++ }
+++
+++ new_led->name = strdup(name);
+++ if (!new_led->name) {
+++ syslog(LOG_ERR, "Out of memory handling LED on %d", lineno);
+++ free(new_led);
+++ return;
+++ }
+++
+++ if (sscanf(cfg, "%256s %u", devicename, &new_led->duration) != 2) {
+++ syslog(LOG_ERR, "Couldn't parse LED config on %d", lineno);
+++ free(new_led->name);
+++ free(new_led);
+++ return;
+++ }
+++
+++ new_led->device = strdup(devicename);
+++ if (!new_led->device) {
+++ syslog(LOG_ERR, "Out of memory handling LED on %d", lineno);
+++ free(new_led->name);
+++ free(new_led);
+++ return;
+++ }
+++
+++ /* setup the led */
+++ led_blink_prepare(new_led->device, new_led->duration);
+++
+++ new_led->next = leds;
+++ leds = new_led;
+++}
+++
+++char *
+++find_led(const char *name)
+++{
+++ struct led_s *led = leds;
+++
+++ while (led) {
+++ if (strcmp(name, led->name) == 0)
+++ return strdup(led->device);
+++ led = led->next;
+++ }
+++ syslog(LOG_ERR, "LED %s not found, it will be ignored", name);
+++ return NULL;
+++}
+++
+++static void
+++free_leds(void)
+++{
+++ struct led_s *led;
+++
+++ while (leds) {
+++ led = leds;
+++ leds = leds->next;
+++
+++ led_off(led->device);
+++
+++ free(led->name);
+++ free(led->device);
+++ free(led);
+++ }
+++}
+++
++ static int
++ startswith(char *str, const char *test, char **strtok_data)
++ {
++@@ -503,6 +587,21 @@ handle_config_line(char *inbuf)
++ return;
++ }
++
+++ if (startswith(inbuf, "LED", &strtok_data)) {
+++ char *name = strtok_r(NULL, ":", &strtok_data);
+++ char *str = strtok_r(NULL, "\n", &strtok_data);
+++ if (name == NULL) {
+++ syslog(LOG_ERR, "No LED name given on line %d", lineno);
+++ return;
+++ }
+++ if ((str == NULL) || (strlen(str) == 0)) {
+++ syslog(LOG_ERR, "No LED given on line %d", lineno);
+++ return;
+++ }
+++ handle_led(name, str);
+++ return;
+++ }
+++
++ comma = strchr(inbuf, ',');
++ if (comma) {
++ if (!strtok_r(comma, ":", &strtok_data)) {
++@@ -568,6 +667,7 @@ readconfig(char *filename)
++ #ifdef USE_RS485_FEATURE
++ free_rs485confs();
++ #endif
+++ free_leds();
++
++ config_num++;
++
++diff --git a/ser2net.conf b/ser2net.conf
++index 870926c..dc2ba19 100644
++--- a/ser2net.conf
+++++ b/ser2net.conf
++@@ -53,6 +53,8 @@
++ # specified in TRACEFILE that will take all traced data.
++ # tw is data written to the device, tr is data read from
++ # the device, and tb is both.
+++# The "led-tx" and "led-rx" options allow to specify
+++# a LED defined above to trigger for traffic.
++ #
++ # or...
++
++@@ -79,6 +81,12 @@
++ # This specifies a filename to trace output into, as tw=/tmp/trace1.
++ # This takes the same escape sequences as banners.
++ #
+++# LED:<name>:sysfs-filename duration
+++# This specifies a LED which will be configured to use linux's transient trigger.
+++# The LED is always kicked when traffic is detected on serial side. The duration
+++# is given in milliseconds. See Linux's documentation for transient trigger for
+++# details.
+++#
++ # OPENSTR:<name>:str
++ # This specifies a string to be transmitted to the device when the
++ # port is opened. This takes the same escape sequences as banners.
++@@ -108,6 +116,9 @@ SIGNATURE:signature1:ser2net port ttyS2
++
++ RS485CONF:rs485port1:0:0:0:0
++
+++LED:rx:duckbill:green:rs485 10
+++LED:tx:duckbill:red:rs485 10
+++
++ TRACEFILE:tw1:/tmp/tw-\p-\Y-\M-\D-\H:\i:\s.\U
++ TRACEFILE:tr1:/tmp/tr-\p-\Y-\M-\D-\H:\i:\s.\U
++
++@@ -138,3 +149,5 @@ CLOSESTR:close1:close str\r\n
++
++ 3020:telnet:0:/dev/ttyUSB0:9600 banner1 remctl asdfasd
++ 3021:telnet:0:/dev/ttyUSB1:9600 banner2 open1 close1 remctl
+++
+++5000:telnet:0:/dev/ttyAPP0:9600 NONE 1STOPBIT 8DATABITS -XONXOFF LOCAL -RTSCTS led-tx=tx led-rx=rx
++diff --git a/sysfs-led.c b/sysfs-led.c
++new file mode 100644
++index 0000000..efe0b29
++--- /dev/null
+++++ b/sysfs-led.c
++@@ -0,0 +1,43 @@
+++/*
+++ * Copyright (C) 2015 I2SE GmbH
+++ */
+++#include <stdio.h>
+++#include <string.h>
+++
+++#include "utils.h"
+++#include "sysfs-led.h"
+++
+++#define SYSFS_LED_BASE "/sys/class/leds"
+++
+++static int led_write(char *led, char *property, char *buf)
+++{
+++ char fn[255];
+++
+++ snprintf(fn, sizeof(fn), "%s/%s/%s", SYSFS_LED_BASE, led, property);
+++
+++ return file_store(fn, buf, strlen(buf));
+++}
+++
+++int led_off(char *led)
+++{
+++ led_write(led, "trigger", "none");
+++ led_write(led, "brightness", "0");
+++ return 0;
+++}
+++
+++int led_blink_prepare(char *led, unsigned int duration)
+++{
+++ char buffer[10];
+++
+++ snprintf(buffer, sizeof(buffer), "%u", duration);
+++ led_write(led, "trigger", "transient");
+++ msleep(10);
+++ led_write(led, "state", "1");
+++ led_write(led, "duration", buffer);
+++ return 0;
+++}
+++
+++int led_blink_kick(char *led)
+++{
+++ return led_write(led, "activate", "1");
+++}
++diff --git a/sysfs-led.h b/sysfs-led.h
++new file mode 100644
++index 0000000..00b21b6
++--- /dev/null
+++++ b/sysfs-led.h
++@@ -0,0 +1,11 @@
+++/*
+++ * Copyright (C) 2015 I2SE GmbH
+++ */
+++#ifndef SYSFS_LED_H
+++#define SYSFS_LED_H
+++
+++int led_off(char *led);
+++int led_blink_prepare(char *led, unsigned int duration);
+++int led_blink_kick(char *led);
+++
+++#endif /* SYSFS_LED_H */
++diff --git a/utils.c b/utils.c
++index c194c4c..c96cedb 100644
++--- a/utils.c
+++++ b/utils.c
++@@ -25,6 +25,9 @@
++ #include <errno.h>
++ #include <unistd.h>
++ #include <fcntl.h>
+++#include <time.h>
+++#include <sys/types.h>
+++#include <sys/stat.h>
++
++ #include "ser2net.h"
++ #include "utils.h"
++@@ -205,3 +208,30 @@ write_ignore_fail(int fd, const char *data, size_t count)
++ count -= written;
++ }
++ }
+++
+++int
+++msleep(int msec)
+++{
+++ struct timespec req;
+++
+++ req.tv_sec = 0;
+++ req.tv_nsec = msec * 1000000;
+++
+++ return nanosleep(&req, NULL);
+++}
+++
+++int
+++file_store(const char *filename, const char *buf, size_t count)
+++{
+++ int fd;
+++
+++ if ((fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) == -1)
+++ return -1;
+++
+++ if (write(fd, buf, count) != count) {
+++ close(fd);
+++ return -1;
+++ }
+++
+++ return close(fd);
+++}
++diff --git a/utils.h b/utils.h
++index 582ea88..8af65ec 100644
++--- a/utils.h
+++++ b/utils.h
++@@ -64,6 +64,9 @@ char *find_tracefile(const char *name);
++ /* Search for RS485 configuration by name. */
++ struct serial_rs485 *find_rs485conf(const char *name);
++
+++/* Search for a LED by name */
+++char *find_led(const char *name);
+++
++ void check_ipv6_only(int family, struct sockaddr *addr, int fd);
++
++ /* Make sure the full contents get written, return an error if it occurs. */
++@@ -72,4 +75,10 @@ int write_full(int fd, char *data, size_t count);
++ /* Write the data completely out, return without comment on error. */
++ void write_ignore_fail(int fd, const char *data, size_t count);
++
+++/* Helper to sleep a given amount of milli-seconds */
+++int msleep(int msec);
+++
+++/* Store the given data to a file */
+++int file_store(const char *filename, const char *buf, size_t count);
+++
++ #endif /* UTILS */
++--
++1.7.10.4
++
+diff --git a/feeds/packages/net/shadowsocks-client/Makefile b/feeds/packages/net/shadowsocks-client/Makefile
+new file mode 100644
+index 0000000..e4344d6
+--- /dev/null
++++ b/feeds/packages/net/shadowsocks-client/Makefile
+@@ -0,0 +1,39 @@
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=shadowsocks-client
++PKG_VERSION:=0.5
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=http://github.com/zhao-gang/shadowsocks-tiny.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=d8ef02715f40de0fb7ba0f7267d3f8260f38ba80
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_MAINTAINER:=Zhao, Gang <gang.zhao.42@gmail.com>
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/shadowsocks-client
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Web Servers/Proxies
++ TITLE:=shadowsocks client for router
++ URL:=https://github.com/zhao-gang/shadowsocks-tiny
++ DEPENDS:=+libopenssl
++endef
++
++define Package/shadowsocks-client/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/sslocal $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/sslocal.config $(1)/etc/config/sslocal
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/sslocal.init $(1)/etc/init.d/sslocal
++endef
++
++$(eval $(call BuildPackage,shadowsocks-client))
+diff --git a/feeds/packages/net/shadowsocks-client/files/sslocal.config b/feeds/packages/net/shadowsocks-client/files/sslocal.config
+new file mode 100644
+index 0000000..28dc261
+--- /dev/null
++++ b/feeds/packages/net/shadowsocks-client/files/sslocal.config
+@@ -0,0 +1,7 @@
++config sslocal
++ option server_addr ''
++ option server_port ''
++ option local_addr ''
++ option local_port ''
++ option password ''
++ option method ''
+diff --git a/feeds/packages/net/shadowsocks-client/files/sslocal.init b/feeds/packages/net/shadowsocks-client/files/sslocal.init
+new file mode 100755
+index 0000000..ac845e5
+--- /dev/null
++++ b/feeds/packages/net/shadowsocks-client/files/sslocal.init
+@@ -0,0 +1,52 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2012 OpenWrt.org
++# Copyright (C) 2014 Zhao, Gang <gang.zhao.42@gmail.com>
++
++START=99
++
++USE_PROCD=1
++PROG=/usr/bin/sslocal
++
++validate_section_sslocal() {
++ uci_validate_section sslocal sslocal "${1}" \
++ 'server_addr:host' \
++ 'server_port:port' \
++ 'local_addr:host' \
++ 'local_port:port' \
++ 'password:string' \
++ 'method:string' \
++ 'log_level:range(0,7):5'
++
++ return $?
++}
++
++sslocal_instance() {
++ local server_addr server_port local_addr local_port
++ local password method log_level
++
++ validate_section_sslocal "${1}" || {
++ echo "validation failed"
++ return 1
++ }
++
++ procd_open_instance
++ procd_set_param command "$PROG"
++ procd_append_param command -s "${server_addr}" -p "${server_port}"
++ procd_append_param command -u "${local_addr}" -b "${local_port}"
++ procd_append_param command -k "${password}" -m "${method}"
++ procd_append_param command -l "${log_level}"
++ procd_set_param respawn
++ procd_close_instance
++}
++
++start_service() {
++ config_load sslocal
++
++ config_foreach sslocal_instance sslocal
++}
++
++service_triggers()
++{
++ procd_add_reload_trigger "sslocal"
++ procd_add_validation validate_section_sslocal
++}
+diff --git a/feeds/packages/net/shadowsocks-client/patches/100-fortify-source-compat.patch b/feeds/packages/net/shadowsocks-client/patches/100-fortify-source-compat.patch
+new file mode 100644
+index 0000000..e4e1538
+--- /dev/null
++++ b/feeds/packages/net/shadowsocks-client/patches/100-fortify-source-compat.patch
+@@ -0,0 +1,72 @@
++--- a/client.c
+++++ b/client.c
++@@ -111,7 +111,7 @@ int client_do_local_read(int sockfd, str
++ goto out;
++ }
++
++- if (encrypt(sockfd, ln) == -1)
+++ if (crypto_encrypt(sockfd, ln) == -1)
++ goto out;
++
++ ret = do_send(ln->server_sockfd, ln, "cipher", 0);
++@@ -172,7 +172,7 @@ int client_do_server_read(int sockfd, st
++ }
++ }
++
++- if (decrypt(sockfd, ln) == -1)
+++ if (crypto_decrypt(sockfd, ln) == -1)
++ goto out;
++
++ if (ln->state & SS_UDP) {
++--- a/crypto.c
+++++ b/crypto.c
++@@ -185,7 +185,7 @@ err:
++ return -1;
++ }
++
++-int encrypt(int sockfd, struct link *ln)
+++int crypto_encrypt(int sockfd, struct link *ln)
++ {
++ int len, cipher_len;
++ EVP_CIPHER_CTX *ctx_p;
++@@ -223,7 +223,7 @@ err:
++ return -1;
++ }
++
++-int decrypt(int sockfd, struct link *ln)
+++int crypto_decrypt(int sockfd, struct link *ln)
++ {
++ int len, text_len;
++ EVP_CIPHER_CTX *ctx_p;
++--- a/crypto.h
+++++ b/crypto.h
++@@ -15,7 +15,7 @@ extern int iv_len;
++
++ int crypto_init(char *key, char *method);
++ void crypto_exit(void);
++-int encrypt(int sockfd, struct link *ln);
++-int decrypt(int sockfd, struct link *ln);
+++int crypto_encrypt(int sockfd, struct link *ln);
+++int crypto_decrypt(int sockfd, struct link *ln);
++
++ #endif
++--- a/server.c
+++++ b/server.c
++@@ -36,7 +36,7 @@ int server_do_remote_read(int sockfd, st
++ goto out;
++ }
++
++- if (encrypt(sockfd, ln) == -1)
+++ if (crypto_encrypt(sockfd, ln) == -1)
++ goto out;
++
++ ret = do_send(ln->local_sockfd, ln, "cipher", 0);
++@@ -91,7 +91,7 @@ int server_do_local_read(int sockfd, str
++ }
++ }
++
++- if (decrypt(sockfd, ln) == -1)
+++ if (crypto_decrypt(sockfd, ln) == -1)
++ goto out;
++
++ if (ln->state & SS_UDP) {
+diff --git a/feeds/packages/net/shadowsocks-libev/Makefile b/feeds/packages/net/shadowsocks-libev/Makefile
+new file mode 100644
+index 0000000..415c2df
+--- /dev/null
++++ b/feeds/packages/net/shadowsocks-libev/Makefile
+@@ -0,0 +1,91 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=shadowsocks-libev
++PKG_VERSION:=2.2.3
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/shadowsocks/shadowsocks-libev.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)
++PKG_SOURCE_VERSION:=2b1eef11973de3f7380401fd20f937e84bc2b756
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_MAINTAINER:=Jian Chang <aa65535@live.com>
++
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)
++
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++PKG_USE_MIPS16:=0
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/shadowsocks-libev/Default
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Lightweight Secured Socks5 Proxy $(2)
++ URL:=https://github.com/shadowsocks/shadowsocks-libev
++ VARIANT:=$(1)
++ DEPENDS:=$(3) +libpthread +ipset +ip +iptables-mod-tproxy
++endef
++
++Package/shadowsocks-libev = $(call Package/shadowsocks-libev/Default,openssl,(OpenSSL),+libopenssl)
++Package/shadowsocks-libev-polarssl = $(call Package/shadowsocks-libev/Default,polarssl,(PolarSSL),+libpolarssl)
++
++define Package/shadowsocks-libev/description
++Shadowsocks-libev is a lightweight secured socks5 proxy for embedded devices and low end boxes.
++endef
++
++Package/shadowsocks-libev-polarssl/description = $(Package/shadowsocks-libev/description)
++
++define Package/shadowsocks-libev/conffiles
++/etc/config/shadowsocks-libev
++endef
++
++Package/shadowsocks-libev-polarssl/conffiles = $(Package/shadowsocks-libev/conffiles)
++
++define Package/shadowsocks-libev/postinst
++#!/bin/sh
++uci -q batch <<-EOF >/dev/null
++ delete firewall.shadowsocks_libev
++ set firewall.shadowsocks_libev=include
++ set firewall.shadowsocks_libev.type=script
++ set firewall.shadowsocks_libev.path=/usr/share/shadowsocks-libev/firewall.include
++ set firewall.shadowsocks_libev.reload=1
++ commit firewall
++EOF
++exit 0
++endef
++
++Package/shadowsocks-libev-polarssl/postinst = $(Package/shadowsocks-libev/postinst)
++
++ifeq ($(BUILD_VARIANT),polarssl)
++ CONFIGURE_ARGS += --with-crypto-library=polarssl
++endif
++
++define Package/shadowsocks-libev/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ss-{redir,tunnel} $(1)/usr/bin
++ $(INSTALL_BIN) ./files/ss-rules $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/shadowsocks-libev.config $(1)/etc/config/shadowsocks-libev
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/shadowsocks-libev.init $(1)/etc/init.d/shadowsocks-libev
++ $(INSTALL_DIR) $(1)/usr/share/shadowsocks-libev
++ $(INSTALL_DATA) ./files/firewall.include $(1)/usr/share/shadowsocks-libev/firewall.include
++endef
++
++Package/shadowsocks-libev-polarssl/install = $(Package/shadowsocks-libev/install)
++
++$(eval $(call BuildPackage,shadowsocks-libev))
++$(eval $(call BuildPackage,shadowsocks-libev-polarssl))
+diff --git a/feeds/packages/net/shadowsocks-libev/files/firewall.include b/feeds/packages/net/shadowsocks-libev/files/firewall.include
+new file mode 100644
+index 0000000..3a00e80
+--- /dev/null
++++ b/feeds/packages/net/shadowsocks-libev/files/firewall.include
+@@ -0,0 +1,6 @@
++#!/bin/sh
++
++if pidof ss-redir>/dev/null; then
++ /etc/init.d/shadowsocks-libev rules
++ logger -t ShadowSocks-libev "Reloading ShadowSocks-libev due to restart of firewall"
++fi
+diff --git a/feeds/packages/net/shadowsocks-libev/files/shadowsocks-libev.config b/feeds/packages/net/shadowsocks-libev/files/shadowsocks-libev.config
+new file mode 100644
+index 0000000..95aec7b
+--- /dev/null
++++ b/feeds/packages/net/shadowsocks-libev/files/shadowsocks-libev.config
+@@ -0,0 +1,15 @@
++
++config shadowsocks-libev
++ option enable '1'
++ option server '127.0.0.1'
++ option server_port '8388'
++ option local_port '1080'
++ option password 'barfoo!'
++ option timeout '60'
++ option encrypt_method 'rc4-md5'
++ option ignore_list '/dev/null'
++ option udp_mode '0'
++ option tunnel_enable '1'
++ option tunnel_port '5300'
++ option tunnel_forward '8.8.4.4:53'
++ option lan_ac_mode '0'
+diff --git a/feeds/packages/net/shadowsocks-libev/files/shadowsocks-libev.init b/feeds/packages/net/shadowsocks-libev/files/shadowsocks-libev.init
+new file mode 100644
+index 0000000..9a64038
+--- /dev/null
++++ b/feeds/packages/net/shadowsocks-libev/files/shadowsocks-libev.init
+@@ -0,0 +1,156 @@
++#!/bin/sh /etc/rc.common
++
++START=90
++STOP=15
++
++SERVICE_USE_PID=1
++SERVICE_WRITE_PID=1
++SERVICE_DAEMONIZE=1
++EXTRA_COMMANDS="rules"
++CONFIG_FILE=/var/etc/shadowsocks-libev.json
++
++get_config() {
++ config_get_bool enable $1 enable
++ config_get server $1 server
++ config_get server_port $1 server_port
++ config_get local_port $1 local_port
++ config_get timeout $1 timeout
++ config_get password $1 password
++ config_get encrypt_method $1 encrypt_method
++ config_get ignore_list $1 ignore_list
++ config_get udp_mode $1 udp_mode
++ config_get udp_server $1 udp_server
++ config_get udp_server_port $1 udp_server_port
++ config_get udp_local_port $1 udp_local_port
++ config_get udp_timeout $1 udp_timeout
++ config_get udp_password $1 udp_password
++ config_get udp_encrypt_method $1 udp_encrypt_method
++ config_get_bool tunnel_enable $1 tunnel_enable
++ config_get tunnel_port $1 tunnel_port
++ config_get tunnel_forward $1 tunnel_forward
++ config_get lan_ac_mode $1 lan_ac_mode
++ config_get lan_ac_ip $1 lan_ac_ip
++ config_get wan_bp_ip $1 wan_bp_ip
++ config_get wan_fw_ip $1 wan_fw_ip
++ config_get ipt_ext $1 ipt_ext
++ : ${timeout:=60}
++ : ${udp_timeout:=60}
++ : ${tunnel_port:=5300}
++ : ${tunnel_forward:=8.8.4.4:53}
++}
++
++start_rules() {
++ local ac_args
++
++ if [ -n "$lan_ac_ip" ]; then
++ case $lan_ac_mode in
++ 1) ac_args="w$lan_ac_ip"
++ ;;
++ 2) ac_args="b$lan_ac_ip"
++ ;;
++ esac
++ fi
++ /usr/bin/ss-rules \
++ -s "$server" \
++ -l "$local_port" \
++ -S "$udp_server" \
++ -L "$udp_local_port" \
++ -i "$ignore_list" \
++ -a "$ac_args" \
++ -b "$wan_bp_ip" \
++ -w "$wan_fw_ip" \
++ -e "$ipt_ext" \
++ -o $udp
++ return $?
++}
++
++start_redir() {
++ cat <<-EOF >$CONFIG_FILE
++ {
++ "server": "$server",
++ "server_port": $server_port,
++ "local_address": "0.0.0.0",
++ "local_port": $local_port,
++ "password": "$password",
++ "timeout": $timeout,
++ "method": "$encrypt_method"
++ }
++EOF
++ if [ "$udp_mode" = 2 ]; then
++ /usr/bin/ss-redir \
++ -c $CONFIG_FILE \
++ -f /var/run/ss-redir_t.pid
++ cat <<-EOF >$CONFIG_FILE
++ {
++ "server": "$udp_server",
++ "server_port": $udp_server_port,
++ "local_address": "0.0.0.0",
++ "local_port": $udp_local_port,
++ "password": "$udp_password",
++ "timeout": $udp_timeout,
++ "method": "$udp_encrypt_method"
++ }
++EOF
++ fi
++ /usr/bin/ss-redir \
++ -c $CONFIG_FILE \
++ -f /var/run/ss-redir.pid \
++ $udp
++ return $?
++}
++
++start_tunnel() {
++ : ${udp:="-u"}
++ /usr/bin/ss-tunnel \
++ -c $CONFIG_FILE \
++ -l $tunnel_port \
++ -L $tunnel_forward \
++ -f /var/run/ss-tunnel.pid \
++ $udp
++ return $?
++}
++
++rules() {
++ config_load shadowsocks-libev
++ config_foreach get_config shadowsocks-libev
++ [ "$enable" = 1 ] || exit 0
++ mkdir -p /var/run /var/etc
++
++ : ${server:?}
++ : ${server_port:?}
++ : ${local_port:?}
++ : ${password:?}
++ : ${encrypt_method:?}
++ case $udp_mode in
++ 1) udp="-u"
++ ;;
++ 2)
++ udp="-U"
++ : ${udp_server:?}
++ : ${udp_server_port:?}
++ : ${udp_local_port:?}
++ : ${udp_password:?}
++ : ${udp_encrypt_method:?}
++ ;;
++ esac
++
++ start_rules
++}
++
++boot() {
++ until iptables-save -t nat | grep -q "^:zone_lan_prerouting"; do
++ sleep 1
++ done
++ start
++}
++
++start() {
++ rules && start_redir
++ [ "$tunnel_enable" = 1 ] && start_tunnel
++}
++
++stop() {
++ /usr/bin/ss-rules -f
++ killall -q -9 ss-redir
++ killall -q -9 ss-tunnel
++}
+diff --git a/feeds/packages/net/shadowsocks-libev/files/ss-rules b/feeds/packages/net/shadowsocks-libev/files/ss-rules
+new file mode 100644
+index 0000000..8ce1000
+--- /dev/null
++++ b/feeds/packages/net/shadowsocks-libev/files/ss-rules
+@@ -0,0 +1,219 @@
++#!/bin/sh
++
++usage() {
++ cat <<-EOF
++ Usage: ss-rules [options]
++
++ Valid options are:
++
++ -s <server_host> hostname or ip of shadowsocks remote server
++ -l <local_port> port number of shadowsocks local server
++ -i <ip_list_file> a file content is bypassed ip list
++ -a <lan_ips> lan ip of access control, need a prefix to
++ define access control mode
++ -b <wan_ips> wan ip of will be bypassed
++ -w <wan_ips> wan ip of will be forwarded
++ -e <extra_options> extra options for iptables
++ -o apply the rules to the OUTPUT chain
++ -u enable udprelay mode, TPROXY is required
++ -U enable udprelay mode, using different IP
++ and ports for TCP and UDP
++ -f flush the rules
++EOF
++}
++
++loger() {
++ # 1.alert 2.crit 3.err 4.warn 5.notice 6.info 7.debug
++ logger -st ss-rules[$$] -p$1 $2
++}
++
++ipt_n="iptables -t nat"
++ipt_m="iptables -t mangle"
++
++flush_r() {
++ local IPT
++
++ IPT=$(iptables-save -t nat)
++ eval $(echo "$IPT" | grep "_SS_SPEC_RULE_" | \
++ sed -e 's/^-A/$ipt_n -D/' -e 's/$/;/')
++
++ for chain in $(echo "$IPT" | awk '/^:SS_SPEC/{print $1}'); do
++ $ipt_n -F ${chain:1} 2>/dev/null && $ipt_n -X ${chain:1}
++ done
++
++ IPT=$(iptables-save -t mangle)
++ eval $(echo "$IPT" | grep "_SS_SPEC_RULE_" | \
++ sed -e 's/^-A/$ipt_m -D/' -e 's/$/;/')
++
++ for chain in $(echo "$IPT" | awk '/^:SS_SPEC/{print $1}'); do
++ $ipt_m -F ${chain:1} 2>/dev/null && $ipt_m -X ${chain:1}
++ done
++
++ ip rule del fwmark 0x01/0x01 table 100 2>/dev/null
++ ip route del local 0.0.0.0/0 dev lo table 100 2>/dev/null
++ ipset -X ss_spec_lan_ac 2>/dev/null
++ ipset -X ss_spec_wan_ac 2>/dev/null
++ return 0
++}
++
++ipset_r() {
++ ipset -! -R <<-EOF || return 1
++ create ss_spec_wan_ac hash:net
++ $(echo -e "$IPLIST" | sed -e "s/^/add ss_spec_wan_ac /")
++ $(for ip in $WAN_FW_IP; do echo "add ss_spec_wan_ac $ip nomatch"; done)
++EOF
++ $ipt_n -N SS_SPEC_WAN_AC && \
++ $ipt_n -A SS_SPEC_WAN_AC -m set --match-set ss_spec_wan_ac dst -j RETURN && \
++ $ipt_n -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW
++ return $?
++}
++
++fw_rule() {
++ $ipt_n -N SS_SPEC_WAN_FW && \
++ $ipt_n -A SS_SPEC_WAN_FW -p tcp \
++ -j REDIRECT --to-ports $local_port 2>/dev/null || {
++ loger 3 "Can't redirect, please check the iptables."
++ exit 1
++ }
++ return $?
++}
++
++ac_rule() {
++ local TAG ROUTECHAIN
++
++ if [ -n "$LAN_AC_IP" ]; then
++ if [ "${LAN_AC_IP:0:1}" = "w" ]; then
++ TAG="nomatch"
++ else
++ if [ "${LAN_AC_IP:0:1}" != "b" ]; then
++ loger 3 "Bad argument \`-a $LAN_AC_IP\`."
++ return 2
++ fi
++ fi
++ fi
++
++ ROUTECHAIN=PREROUTING
++ if iptables-save -t nat | grep -q "^:zone_lan_prerouting"; then
++ ROUTECHAIN=zone_lan_prerouting
++ fi
++
++ ipset -! -R <<-EOF || return 1
++ create ss_spec_lan_ac hash:net
++ $(for ip in ${LAN_AC_IP:1}; do echo "add ss_spec_lan_ac $ip $TAG"; done)
++EOF
++ $ipt_n -A $ROUTECHAIN -p tcp $EXT_ARGS \
++ -m set ! --match-set ss_spec_lan_ac src \
++ -m comment --comment "_SS_SPEC_RULE_" -j SS_SPEC_WAN_AC
++
++ if [ "$OUTPUT" = 1 ]; then
++ $ipt_n -A OUTPUT -p tcp $EXT_ARGS \
++ -m comment --comment "_SS_SPEC_RULE_" -j SS_SPEC_WAN_AC
++ fi
++ return $?
++}
++
++tp_rule() {
++ [ -n "$TPROXY" ] || return 0
++ ip rule add fwmark 0x01/0x01 table 100
++ ip route add local 0.0.0.0/0 dev lo table 100
++ $ipt_m -N SS_SPEC_TPROXY
++ $ipt_m -A SS_SPEC_TPROXY -p udp -m set ! --match-set ss_spec_wan_ac dst \
++ -j TPROXY --on-port $LOCAL_PORT --tproxy-mark 0x01/0x01
++ $ipt_m -A PREROUTING -p udp $EXT_ARGS \
++ -m set ! --match-set ss_spec_lan_ac src \
++ -m comment --comment "_SS_SPEC_RULE_" -j SS_SPEC_TPROXY
++ return $?
++}
++
++while getopts ":s:l:S:L:i:e:a:b:w:ouUf" arg; do
++ case $arg in
++ s)
++ server=$OPTARG
++ ;;
++ l)
++ local_port=$OPTARG
++ ;;
++ S)
++ SERVER=$OPTARG
++ ;;
++ L)
++ LOCAL_PORT=$OPTARG
++ ;;
++ i)
++ IGNORE=$OPTARG
++ ;;
++ e)
++ EXT_ARGS=$OPTARG
++ ;;
++ a)
++ LAN_AC_IP=$OPTARG
++ ;;
++ b)
++ WAN_BP_IP=$(for ip in $OPTARG; do echo $ip; done)
++ ;;
++ w)
++ WAN_FW_IP=$OPTARG
++ ;;
++ o)
++ OUTPUT=1
++ ;;
++ u)
++ TPROXY=1
++ ;;
++ U)
++ TPROXY=2
++ ;;
++ f)
++ flush_r
++ exit 0
++ ;;
++ esac
++done
++
++if [ -z "$server" -o -z "$local_port" ]; then
++ usage
++ exit 2
++fi
++
++if [ "$TPROXY" = 1 ]; then
++ SERVER=$server
++ LOCAL_PORT=$local_port
++fi
++
++if [ "$TPROXY" = 2 ]; then
++ if [ -z "$SERVER" -o -z "$LOCAL_PORT" ]; then
++ loger 3 "Please use -S and -L specifies IP and port for UDP."
++ fi
++fi
++
++if [ -f "$IGNORE" ]; then
++ IGNORE_IP=$(cat $IGNORE 2>/dev/null)
++fi
++
++IPLIST=$(cat <<-EOF | grep -E "^([0-9]{1,3}\.){3}[0-9]{1,3}"
++ $server
++ $SERVER
++ 0.0.0.0/8
++ 10.0.0.0/8
++ 100.64.0.0/10
++ 127.0.0.0/8
++ 169.254.0.0/16
++ 172.16.0.0/12
++ 192.0.0.0/24
++ 192.0.2.0/24
++ 192.88.99.0/24
++ 192.168.0.0/16
++ 198.18.0.0/15
++ 198.51.100.0/24
++ 203.0.113.0/24
++ 224.0.0.0/4
++ 240.0.0.0/4
++ 255.255.255.255
++ $WAN_BP_IP
++ $IGNORE_IP
++EOF
++)
++
++flush_r && fw_rule && ipset_r && ac_rule && tp_rule
++
++exit $?
+diff --git a/feeds/packages/net/siit/Makefile b/feeds/packages/net/siit/Makefile
+new file mode 100644
+index 0000000..6d6d298
+--- /dev/null
++++ b/feeds/packages/net/siit/Makefile
+@@ -0,0 +1,42 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=siit
++PKG_VERSION:=1.2
++PKG_RELEASE:=1
++PKG_LICENSE:=GPLv2+
++
++include $(INCLUDE_DIR)/package.mk
++
++define KernelPackage/siit
++ SUBMENU:=Network Devices
++ TITLE:=Stateless IP ICMP Translation Algorithm
++ DEPENDS:= @(!(TARGET_ps3||TARGET_pxcab))
++ FILES:=$(PKG_BUILD_DIR)/siit.ko
++ AUTOLOAD:=$(call AutoLoad,50,siit)
++ MAINTAINER=Vladimir Ulrich <admin@evl.su>
++endef
++
++include $(INCLUDE_DIR)/kernel-defaults.mk
++
++define KernelPackage/siit/description
++ Stateless IP ICMP Translation Algorithm
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++ cp src/Makefile src/siit.h src/siit.c $(PKG_BUILD_DIR)/
++endef
++
++define Build/Compile
++ $(MAKE) $(KERNEL_MAKEOPTS) SUBDIRS="$(PKG_BUILD_DIR)" modules
++endef
++
++$(eval $(call KernelPackage,siit))
+diff --git a/feeds/packages/net/siit/src/Makefile b/feeds/packages/net/siit/src/Makefile
+new file mode 100644
+index 0000000..06c36f1
+--- /dev/null
++++ b/feeds/packages/net/siit/src/Makefile
+@@ -0,0 +1,5 @@
++obj-m := siit.o
++ifeq ($(MAKING_MODULES),1)
++-include $(TOPDIR)/Rules.make
++endif
++
+diff --git a/feeds/packages/net/siit/src/siit.c b/feeds/packages/net/siit/src/siit.c
+new file mode 100644
+index 0000000..a25da9a
+--- /dev/null
++++ b/feeds/packages/net/siit/src/siit.c
+@@ -0,0 +1,1429 @@
++/*
++ * siit.c: the Stateless IP/ICMP Translator (SIIT) module for Linux.
++ *
++ *
++ */
++
++#include <linux/version.h>
++#include <linux/module.h>
++#include <linux/sched.h>
++#include <linux/kernel.h> /* printk() */
++#include <linux/slab.h>
++
++#include <linux/errno.h> /* error codes */
++#include <linux/types.h> /* size_t */
++#include <linux/interrupt.h> /* mark_bh */
++#include <linux/random.h>
++#include <linux/in.h>
++#include <linux/netdevice.h> /* struct device, and other headers */
++#include <linux/etherdevice.h> /* eth_type_trans */
++#include <net/ip.h> /* struct iphdr */
++#include <net/icmp.h> /* struct icmphdr */
++#include <net/ipv6.h>
++#include <net/udp.h>
++#include <linux/skbuff.h>
++#include <linux/in6.h>
++#include <linux/init.h>
++#include <asm/uaccess.h>
++#include <asm/checksum.h>
++#include <net/ip6_checksum.h>
++#include <linux/in6.h>
++#include "siit.h"
++
++MODULE_AUTHOR("Dmitriy Moscalev, Grigory Klyuchnikov, Felix Fietkau");
++
++/*
++ * If tos_ignore_flag != 0, we don't copy TOS and Traffic Class
++ * from origin paket and set it to 0
++ */
++int tos_ignore_flag = 0;
++
++#define siit_stats(_dev) (&(_dev)->stats)
++
++/*
++ * The Utility stuff
++ */
++
++#ifdef SIIT_DEBUG
++/* print dump bytes (data point data area sizeof len and message
++ * before dump.
++ */
++static int siit_print_dump(char *data, int len, char *message)
++{
++ int i;
++ int j = 0, k = 1;
++
++ len = len > BUFF_SIZE ? BUFF_SIZE : len;
++ printk("%s:\n", message);
++ for (i=0; i < len; i++, k++) {
++ if( i == len-1 || k == 16) {
++ printk("%02x\n", (~(~0 << 8) & *(data+i)));
++ j = 0;
++ k = 0;
++ }
++ else if (j) {
++ printk("%02x ", (~(~0 << 8) & *(data+i)));
++ j--;
++ }
++ else {
++ printk("%02x", (~(~0 << 8) & *(data+i)));
++ j++;
++ }
++ }
++ return 0;
++}
++#endif
++
++/*
++ * Open and close
++ */
++static int siit_open(struct net_device *dev)
++{
++ netif_start_queue(dev);
++ return 0;
++}
++
++
++static int siit_release(struct net_device *dev)
++{
++ netif_stop_queue(dev); /* can't transmit any more */
++ return 0;
++}
++
++/*
++ * Translation IPv4 to IPv6 stuff
++ *
++ * ip4_ip6 (src, len, dst, include_flag)
++ *
++ * where
++ * src - buffer with original IPv4 packet,
++ * len - size of original packet,
++ * dst - new buffer for IPv6 packet,
++ * include_flag - if = 1, dst point to IPv4 packet that is ICMP error
++ * included IP packet, else = 0
++ */
++
++static int ip4_ip6(char *src, int len, char *dst, int include_flag)
++{
++ struct iphdr *ih4 = (struct iphdr *) src; /* point to current IPv4 header struct */
++ struct icmphdr *icmp_hdr; /* point to current ICMPv4 header struct */
++ struct udphdr *udp_hdr; /* point to current IPv4 UDP header struct */
++
++ struct ipv6hdr *ih6 = (struct ipv6hdr *) dst; /* point to current IPv6 header struct */
++ struct frag_hdr *ih6_frag = (struct frag_hdr *)(dst+sizeof(struct ipv6hdr));
++ /* point to current IPv6 fragment header struct */
++ struct icmp6hdr *icmp6_hdr; /* point to current ICMPv6 header */
++
++ int hdr_len = (int)(ih4->ihl * 4); /* IPv4 header length */
++ int icmp_len; /* ICMPv4 packet length */
++ int plen; /* payload length */
++
++ unsigned int csum; /* need to calculate ICMPv6 and UDP checksum */
++ int fl_csum = 0; /* flag to calculate UDP checksum */
++ int icmperr = 1; /* flag to indicate ICMP error message and to need
++ translate ICMP included IP packet */
++ int fr_flag = 0; /* fragment flag, if = 0 - don't add
++ fragment header */
++ __u16 new_tot_len; /* need to calculate IPv6 total length */
++ __u8 new_nexthdr; /* next header code */
++ __u16 icmp_ptr = 0; /* Pointer field in ICMP_PARAMETERPROB */
++
++#ifdef SIIT_DEBUG /* print IPv4 header dump */
++ siit_print_dump(src, hdr_len, "siit: ip4_ip6() (in) ip4 header dump");
++#endif
++
++ /* If DF == 1 && MF == 0 && Fragment Offset == 0
++ * or this packet is ICMP included IP packet
++ * we don't need fragment header */
++ if (ntohs(ih4->frag_off) == IP_DF || include_flag ) {
++ /* not fragment and we need not to add Fragment
++ * Header to IPv6 packet. */
++ /* total length = total length from IPv4 packet */
++ new_tot_len = ntohs(ih4->tot_len);
++
++ if (ih4->protocol == IPPROTO_ICMP)
++ new_nexthdr = NEXTHDR_ICMP;
++ else
++ new_nexthdr = ih4->protocol;
++ }
++ else {
++ /* need to add Fragment Header */
++ fr_flag = 1;
++ /* total length = total length from IPv4 packet +
++ length of Fragment Header */
++ new_tot_len = ntohs(ih4->tot_len) + sizeof(struct frag_hdr);
++ /* IPv6 Header NextHeader = NEXTHDR_FRAGMENT */
++ new_nexthdr = NEXTHDR_FRAGMENT;
++ /* Fragment Header NextHeader copy from IPv4 packet */
++ if (ih4->protocol == IPPROTO_ICMP)
++ ih6_frag->nexthdr = NEXTHDR_ICMP;
++ else
++ ih6_frag->nexthdr = ih4->protocol;
++
++ /* copy frag offset from IPv4 packet */
++ ih6_frag->frag_off = htons((ntohs(ih4->frag_off) & IP_OFFSET) << 3);
++ /* copy MF flag from IPv4 packet */
++ ih6_frag->frag_off = htons((ntohs(ih6_frag->frag_off) |
++ ((ntohs(ih4->frag_off) & IP_MF) >> 13)));
++ /* copy Identification field from IPv4 packet */
++ ih6_frag->identification = htonl(ntohs(ih4->id));
++ /* reserved field initialized to zero */
++ ih6_frag->reserved = 0;
++ }
++
++ /* Form rest IPv6 fields */
++
++ /*
++ * At this point we need to add checking of unxpired source
++ * route optin and if it is, send ICMPv4 "destination
++ * unreacheble/source route failes" Type 3/Code 5 and
++ * drop packet. (NOT RELEASED YET)
++ */
++
++ /* IP version = 6 */
++ ih6->version = 6;
++
++ if (tos_ignore_flag) {
++ ih6->priority = 0;
++ ih6->flow_lbl[0] = 0;
++ } else {
++ ih6->priority = (ih4->tos & 0xf0) >> 4;
++ ih6->flow_lbl[0] = (ih4->tos & 0x0f) << 4;
++ }
++ ih6->flow_lbl[1] = 0;
++ ih6->flow_lbl[2] = 0;
++
++ /* Hop Limit = IPv4 TTL */
++ ih6->hop_limit = ih4->ttl;
++
++ /* Translate source destination addresses,
++ for IPv6 host it's IPv4-translated IPv6 address,
++ for IPv4 host it's IPv4-mapped IPv6 address
++
++ !!WARNING!! Instead IPv4-mapped IPv6 addresses we use addreesses
++ with unused prefix ::ffff:ffff:0:0/96, because KAME implementation
++ doesn't support IPv4-mapped addresses in IPv6 packets and discard them.
++
++ */
++
++ if (include_flag) {
++ /*
++ It's ICMP included IP packet and there is a diffirence
++ in src/dst addresses then src/dst in normal direction
++ */
++
++ /*
++ Source address
++ is IPv4-translated IPv6 address because packet traveled
++ from IPv6 to IPv4 area
++ */
++ ih6->saddr.in6_u.u6_addr32[0] = 0;
++ ih6->saddr.in6_u.u6_addr32[1] = 0;
++ ih6->saddr.in6_u.u6_addr32[2] = htonl(TRANSLATED_PREFIX); /* to network order bytes */
++ ih6->saddr.in6_u.u6_addr32[3] = ih4->saddr;
++
++ /*
++ Destination address
++ is IPv4-mapped address (but it's not IPv4- mapped, we use
++ prefix ::ffff:ffff:0:0/96
++ */
++ ih6->daddr.in6_u.u6_addr32[0] = 0;
++ ih6->daddr.in6_u.u6_addr32[1] = 0;
++ ih6->daddr.in6_u.u6_addr32[2] = htonl(MAPPED_PREFIX); /* to network order bytes */
++ ih6->daddr.in6_u.u6_addr32[3] = ih4->daddr;
++ }
++ else {
++
++ /*
++ This is normal case (packet isn't included IP packet)
++
++ Source address
++ is IPv4-mapped address (but it's not IPv4- mapped, we use
++ prefix ::ffff:ffff:0:0/96)
++ */
++ ih6->saddr.in6_u.u6_addr32[0] = 0;
++ ih6->saddr.in6_u.u6_addr32[1] = 0;
++ ih6->saddr.in6_u.u6_addr32[2] = htonl(MAPPED_PREFIX); /* to network order bytes */
++ ih6->saddr.in6_u.u6_addr32[3] = ih4->saddr;
++
++ /* Destination address
++ is is IPv4-translated IPv6 address
++ */
++ ih6->daddr.in6_u.u6_addr32[0] = 0;
++ ih6->daddr.in6_u.u6_addr32[1] = 0;
++ ih6->daddr.in6_u.u6_addr32[2] = htonl(TRANSLATED_PREFIX); /* to network order bytes */
++ ih6->daddr.in6_u.u6_addr32[3] = ih4->daddr;
++ }
++
++ /* Payload Length */
++ plen = new_tot_len - hdr_len; /* Payload length = IPv4 total len - IPv4 header len */
++ ih6->payload_len = htons(plen);
++
++ /* Next Header */
++ ih6->nexthdr = new_nexthdr; /* Next Header */
++
++ /* Process ICMP protocols data */
++
++ switch (ih4->protocol) {
++ case IPPROTO_ICMP:
++ if ( (ntohs(ih4->frag_off) & IP_OFFSET) != 0 || (ntohs(ih4->frag_off) & IP_MF) != 0 ) {
++ PDEBUG("ip4_ip6(): don't translate ICMPv4 fragments - packet dropped.\n");
++ return -1;
++ }
++
++ icmp_hdr = (struct icmphdr *) (src+hdr_len); /* point to ICMPv4 header */
++ csum = 0;
++ icmp_len = ntohs(ih4->tot_len) - hdr_len; /* ICMPv4 packet length */
++ icmp6_hdr = (struct icmp6hdr *)(dst+sizeof(struct ipv6hdr)
++ +fr_flag*sizeof(struct frag_hdr)); /* point to ICMPv6 header */
++
++ if (include_flag) {
++ /* ICMPv4 packet cannot be included in ICMPv4 Error message */
++ /* !!! May be it's WRONG !!! ICMPv4 QUERY packet can be included
++ in ICMPv4 Error message */
++ PDEBUG("ip4_ip6(): It's included ICMPv4 in ICMPv4 Error message - packet dropped.\n");
++ return -1;
++ }
++
++ /* Check ICMPv4 Type field */
++ switch (icmp_hdr->type) {
++ /* ICMP Error messages */
++ /* Destination Unreachable (Type 3) */
++ case ICMP_DEST_UNREACH:
++ icmp6_hdr->icmp6_type = ICMPV6_DEST_UNREACH; /* to Type 1 */
++ icmp6_hdr->icmp6_unused = 0;
++ switch (icmp_hdr->code)
++ {
++ case ICMP_NET_UNREACH: /* Code 0 */
++ case ICMP_HOST_UNREACH: /* Code 1 */
++ case ICMP_SR_FAILED: /* Code 5 */
++ case ICMP_NET_UNKNOWN: /* Code 6 */
++ case ICMP_HOST_UNKNOWN: /* Code 7 */
++ case ICMP_HOST_ISOLATED: /* Code 8 */
++ case ICMP_NET_UNR_TOS: /* Code 11 */
++ case ICMP_HOST_UNR_TOS: /* Code 12 */
++ icmp6_hdr->icmp6_code = ICMPV6_NOROUTE; /* to Code 0 */
++ break;
++ case ICMP_PROT_UNREACH: /* Code 2 */
++ icmp6_hdr->icmp6_type = ICMPV6_PARAMPROB; /* to Type 4 */
++ icmp6_hdr->icmp6_code = ICMPV6_UNK_NEXTHDR; /* to Code 1 */
++ /* Set pointer filed to 6, it's octet offset IPv6 Next Header field */
++ icmp6_hdr->icmp6_pointer = htonl(6);
++ break;
++ case ICMP_PORT_UNREACH: /* Code 3 */
++ icmp6_hdr->icmp6_code = ICMPV6_PORT_UNREACH; /* to Code 4 */
++ break;
++ case ICMP_FRAG_NEEDED: /* Code 4 */
++ icmp6_hdr->icmp6_type = ICMPV6_PKT_TOOBIG; /* to Type 2 */
++ icmp6_hdr->icmp6_code = 0;
++ /* Correct MTU */
++ if (icmp_hdr->un.frag.mtu == 0)
++ /* we use minimum MTU for IPv4 PMTUv4 RFC1191, section 5;
++ IPv6 implementation wouldn't accept Path MTU < 1280,
++ but it records info correctly to always include
++ a fragment header */
++ icmp6_hdr->icmp6_mtu = htonl(576);
++ else
++ /* needs to adjusted for difference between IPv4/IPv6 headers
++ * SIIT RFC2765, section 3.3,
++ * we assume that difference is 20 bytes */
++ icmp6_hdr->icmp6_mtu = htonl(ntohs(icmp_hdr->un.frag.mtu)+IP4_IP6_HDR_DIFF);
++
++ break;
++ case ICMP_NET_ANO: /* Code 9 */
++ case ICMP_HOST_ANO: /* Code 10 */
++ icmp6_hdr->icmp6_code = ICMPV6_ADM_PROHIBITED; /* to Code 1 */
++ break;
++ default: /* discard any other Code */
++ PDEBUG("ip4_ip6(): Unknown ICMPv4 Type %d Code %d - packet dropped.\n",
++ ICMP_DEST_UNREACH, icmp_hdr->code);
++ return -1;
++ }
++ break;
++ /* Time Exceeded (Type 11) */
++ case ICMP_TIME_EXCEEDED:
++ icmp6_hdr->icmp6_type = ICMPV6_TIME_EXCEED;
++ icmp6_hdr->icmp6_code = icmp_hdr->code;
++ break;
++ /* Parameter Problem (Type 12) */
++ case ICMP_PARAMETERPROB:
++ icmp6_hdr->icmp6_type = ICMPV6_PARAMPROB;
++ icmp6_hdr->icmp6_code = icmp_hdr->code;
++
++ icmp_ptr = ntohs(icmp_hdr->un.echo.id) >> 8;
++ switch (icmp_ptr) {
++ case 0:
++ icmp6_hdr->icmp6_pointer = 0; /* IPv4 Version -> IPv6 Version */
++ break;
++ case 2:
++ icmp6_hdr->icmp6_pointer = __constant_htonl(4); /* IPv4 length -> IPv6 Payload Length */
++ break;
++ case 8:
++ icmp6_hdr->icmp6_pointer = __constant_htonl(7); /* IPv4 TTL -> IPv6 Hop Limit */
++ break;
++ case 9:
++ icmp6_hdr->icmp6_pointer = __constant_htonl(6); /* IPv4 Protocol -> IPv6 Next Header */
++ break;
++ case 12:
++ icmp6_hdr->icmp6_pointer = __constant_htonl(8); /* IPv4 Src Addr -> IPv6 Src Addr */
++ break;
++ case 16:
++ icmp6_hdr->icmp6_pointer = __constant_htonl(24); /* IPv4 Dst Addr -> IPv6 Dst Addr */
++ break;
++ default:
++ icmp6_hdr->icmp6_pointer = 0xffffffff; /* set to all ones in any other cases */
++ break;
++ }
++ break;
++ case ICMP_ECHO:
++ icmperr = 0;
++ icmp6_hdr->icmp6_type = ICMPV6_ECHO_REQUEST;
++ icmp6_hdr->icmp6_code = 0;
++ /* Copy rest ICMP data to new IPv6 packet without changing */
++ memcpy(((char *)icmp6_hdr)+4, ((char *)icmp_hdr)+4, len - hdr_len - 4);
++ break;
++
++ case ICMP_ECHOREPLY:
++ icmperr = 0;
++ icmp6_hdr->icmp6_type = ICMPV6_ECHO_REPLY;
++ icmp6_hdr->icmp6_code = 0;
++ /* Copy rest ICMP data to new IPv6 packet without changing */
++ memcpy(((char *)icmp6_hdr)+4, ((char *)icmp_hdr)+4, len - hdr_len - 4);
++ break;
++
++ /* Discard any other ICMP messages */
++ default:
++ PDEBUG("ip4_ip6(): Unknown ICMPv4 packet Type %x - packet dropped.\n", icmp_hdr->type);
++ return -1;
++ }
++
++ /* Now if it's ICMPv4 Error message we must translate included IP packet */
++
++ if (icmperr) {
++ /* Call our ip4_ip6() to translate included IP packet */
++ if (ip4_ip6(src+hdr_len+sizeof(struct icmphdr), len - hdr_len - sizeof(struct icmphdr),
++ dst+sizeof(struct ipv6hdr)+fr_flag*sizeof(struct frag_hdr)
++ +sizeof(struct icmp6hdr), 1) == -1) {
++ PDEBUG("ip4_ip6(): Uncorrect translation of ICMPv4 Error message - packet dropped.\n");
++ return -1;
++ }
++ /* correct ICMPv6 packet length for diffirence between IPv4 and IPv6 headers
++ in included IP packet
++ */
++ icmp_len += 20;
++ /* and correct Payload length for diffirence between IPv4 and IPv6 headers */
++ plen += 20;
++ ih6->payload_len = htons(plen);
++ }
++
++ /* Calculate ICMPv6 checksum */
++
++ icmp6_hdr->icmp6_cksum = 0;
++ csum = 0;
++
++ csum = csum_partial((u_char *)icmp6_hdr, icmp_len, csum);
++ icmp6_hdr->icmp6_cksum = csum_ipv6_magic(&ih6->saddr, &ih6->daddr, icmp_len,
++ IPPROTO_ICMPV6, csum);
++ break;
++
++ /* Process TCP protocols data */
++ case IPPROTO_TCP:
++ /* Copy TCP data to new IPv6 packet without changing */
++ memcpy(dst+sizeof(struct ipv6hdr)+fr_flag*sizeof(struct frag_hdr),
++ src+hdr_len, len - hdr_len);
++ break;
++
++ /* Process UDP protocols data */
++ case IPPROTO_UDP:
++ udp_hdr = (struct udphdr *)(src+hdr_len);
++ if ((ntohs(ih4->frag_off) & IP_OFFSET) == 0) {
++ if ((ntohs(ih4->frag_off) & IP_MF) != 0) {
++ /* It's a first fragment */
++ if (udp_hdr->check == 0) {
++ /* System management event */
++ printk("siit: First fragment of UDP with zero checksum - packet droped\n");
++ printk("siit: addr: %x src port: %d dst port: %d\n",
++ htonl(ih4->saddr), htons(udp_hdr->source), htons(udp_hdr->dest));
++ return -1;
++ }
++ }
++ else if (udp_hdr->check == 0)
++ fl_csum = 1;
++ }
++
++ /* Copy UDP data to new IPv6 packet */
++ udp_hdr = (struct udphdr *)(dst+sizeof(struct ipv6hdr)
++ + fr_flag*sizeof(struct frag_hdr));
++ memcpy((char *)udp_hdr, src+hdr_len, len - hdr_len);
++
++ /* Calculate UDP checksum if UDP checksum in IPv4 packet was ZERO
++ and if it isn't included IP packet
++ */
++ if (fl_csum && (!include_flag)) {
++ udp_hdr->check = 0;
++ csum = 0;
++ csum = csum_partial((unsigned char *)udp_hdr, plen - fr_flag*sizeof(struct frag_hdr), csum);
++ udp_hdr->check = csum_ipv6_magic(&ih6->saddr, &ih6->daddr, plen -
++ fr_flag*sizeof(struct frag_hdr), IPPROTO_UDP, csum);
++ }
++ break;
++
++ /* Discard packets with any other protocol */
++ default:
++ PDEBUG("ip4_ip6(): Unknown upper protocol - packet dropped.\n");
++ return -1;
++ }
++
++#ifdef SIIT_DEBUG
++ siit_print_dump(dst, sizeof(struct ipv6hdr), "siit: ip4_ip6(): (out) ipv6 header dump");
++#endif
++
++ return 0;
++}
++
++/*
++ * Translation IPv6 to IPv4 stuff
++ *
++ * ip6_ip4(src, len, dst, include_flag)
++ *
++ * where
++ * src - buffer with original IPv6 packet,
++ * len - size of original packet,
++ * dst - new buffer for IPv4 packet,
++ * include_flag - if = 1, dst point to IPv6 packet that is ICMP error
++ * included IP packet, else = 0
++ *
++ */
++
++static int ip6_ip4(char *src, int len, char *dst, int include_flag)
++{
++ struct ipv6hdr *ip6_hdr; /* point to current IPv6 header struct */
++ struct iphdr *ip_hdr; /* point to current IPv4 header struct */
++ int opts_len = 0; /* to sum Option Headers length */
++ int icmperr = 1; /* if = 1, indicate that packet is ICMP Error message, else = 0 */
++ int ntot_len = 0; /* to calculate IPv6 Total Length field */
++ int real_len;
++ int len_delta;
++ int ip6_payload_len;
++ int inc_opts_len = 0; /* to sum Option Headers length in ICMP included IP packet */
++ __u8 next_hdr; /* Next Header */
++
++#ifdef SIIT_DEBUG
++ siit_print_dump(src, sizeof(struct ipv6hdr), "siit: ip6_ip4(): (in) ipv6 header dump");
++#endif
++
++ if ( (len_delta = len - sizeof(struct ipv6hdr)) >= 0)
++ {
++ ip6_hdr = (struct ipv6hdr *)src;
++ ip_hdr = (struct iphdr *)dst;
++
++ real_len = sizeof(struct iphdr);
++
++ /* Check validation of Saddr & Daddr? is a packet to fall under our translation? */
++ if (include_flag) { /* It's ICMP included IP packet,
++ about process include_flag see comment in ip4_ip6() */
++ if (ip6_hdr->saddr.s6_addr32[2] != htonl(MAPPED_PREFIX)) {
++ PDEBUG("ip6_ip4(): Included IP packet Src addr isn't mapped addr: %x%x%x%x, packet dropped.\n",
++ ip6_hdr->saddr.s6_addr32[0], ip6_hdr->saddr.s6_addr32[1],
++ ip6_hdr->saddr.s6_addr32[2], ip6_hdr->saddr.s6_addr32[3]);
++ return -1;
++ }
++ if ( ip6_hdr->daddr.s6_addr32[2] != htonl(TRANSLATED_PREFIX)) {
++ PDEBUG("ip6_ip4(): Included IP packet Dst addr isn't translated addr: %x%x%x%x, packet dropped.\n",
++ ip6_hdr->daddr.s6_addr32[0], ip6_hdr->daddr.s6_addr32[1],
++ ip6_hdr->daddr.s6_addr32[2], ip6_hdr->daddr.s6_addr32[3]);
++ return -1;
++ }
++ }
++ else { /* It's normal IP packet (not included in ICMP) */
++ if (ip6_hdr->saddr.s6_addr32[2] != htonl(TRANSLATED_PREFIX)) {
++ PDEBUG("ip6_ip4(): Src addr isn't translated addr: %x%x%x%x, packet dropped.\n",
++ ip6_hdr->saddr.s6_addr32[0], ip6_hdr->saddr.s6_addr32[1],
++ ip6_hdr->saddr.s6_addr32[2], ip6_hdr->saddr.s6_addr32[3]);
++ return -1;
++ }
++ if ( ip6_hdr->daddr.s6_addr32[2] != htonl(MAPPED_PREFIX)) {
++ PDEBUG("ip6_ip4(): Dst addr isn't mapped addr: %x%x%x%x, packet dropped.\n",
++ ip6_hdr->daddr.s6_addr32[0], ip6_hdr->daddr.s6_addr32[1],
++ ip6_hdr->daddr.s6_addr32[2], ip6_hdr->daddr.s6_addr32[3]);
++ return -1;
++ }
++ }
++
++ /* Set IPv4 Fragment Offset and ID to 0
++ before process any Option Headers */
++ ip_hdr->frag_off = 0;
++ ip_hdr->id = 0;
++
++ /*
++ * We process only Fragment Header. Any other options headers
++ * are ignored, i.e. there is no attempt to translate them.
++ * However, the Total Length field and the Protocol field would
++ * have to be adjusted to "skip" these extension headers.
++ */
++
++ next_hdr = ip6_hdr->nexthdr;
++
++ /* Hop_by_Hop options header (ip6_hdr->nexthdr = 0). It must
++ * appear only in IPv6 header's Next Header field.
++ */
++ if (next_hdr == NEXTHDR_HOP) {
++ if ( (len_delta - sizeof(struct ipv6_opt_hdr)) >= 0)
++ {
++ struct ipv6_opt_hdr *ip6h =
++ (struct ipv6_opt_hdr *)(src+sizeof(struct ipv6hdr) + opts_len);
++ if ( (len_delta -= ip6h->hdrlen*8 + 8) >= 0)
++ {
++ opts_len += ip6h->hdrlen*8 + 8; /* See RFC 2460 page 11:
++ Hdr Ext Len 8-bit unsigned integer. Length of the Hop-by-
++ Hop Options header in 8-octet units, not
++ including the first 8 octets.
++ */
++ next_hdr = ip6h->nexthdr;
++ }
++ else
++ {
++ PDEBUG("ip6_ip4(): hop_by_hop header error, packet droped");
++ /* Generate ICMP Parameter Problem */
++ return -1;
++ }
++ }
++ }
++
++ if (len_delta > 0)
++ {
++ while(next_hdr != NEXTHDR_ICMP && next_hdr != NEXTHDR_TCP
++ && next_hdr != NEXTHDR_UDP)
++ {
++ /* Destination options header */
++ if (next_hdr == NEXTHDR_DEST)
++ {
++ if ( (len_delta - sizeof(struct ipv6_opt_hdr)) >= 0)
++ {
++ struct ipv6_opt_hdr *ip6d =
++ (struct ipv6_opt_hdr *)(src + sizeof(struct ipv6hdr) + opts_len);
++ if ( (len_delta -= ip6d->hdrlen*8 + 8) >= 0)
++ {
++ opts_len += ip6d->hdrlen*8 + 8;
++ next_hdr = ip6d->nexthdr;
++ }
++ }
++ else
++ {
++ PDEBUG("ip6_ip4(): destination header error, packet droped");
++ /* Generate ICMP Parameter Problem */
++ return -1;
++ }
++ }
++ /* Routing options header */
++ else if (next_hdr == NEXTHDR_ROUTING)
++ {
++ if ( (len_delta - sizeof(struct ipv6_rt_hdr)) >= 0)
++ {
++ struct ipv6_rt_hdr *ip6rt =
++ (struct ipv6_rt_hdr *)(src+sizeof(struct ipv6hdr) + opts_len);
++ /* RFC 2765 SIIT, 4.1:
++ If a routing header with a non-zero Segments Left field is present
++ then the packet MUST NOT be translated, and an ICMPv6 "parameter
++ problem/ erroneous header field encountered" (Type 4/Code 0) error
++ message, with the Pointer field indicating the first byte of the
++ Segments Left field, SHOULD be returned to the sender.
++ */
++ if (ip6rt->segments_left != 0) {
++ /* Build ICMPv6 "Parameter Problem/Erroneous Header
++ Field Encountered" & drop the packet */
++ /* !!! We don't send ICMPv6 "Parameter Problem" !!! */
++ PDEBUG("ip6_ip4(): routing header type != 0\n");
++ return -1;
++ }
++ if ( (len_delta -= ip6rt->hdrlen*8 + 8) >= 0)
++ {
++ opts_len += ip6rt->hdrlen*8 + 8;
++ next_hdr = ip6rt->nexthdr;
++ }
++ else
++ {
++ PDEBUG("ip6_ip4(): routing header error, packet droped");
++ /* Generate ICMP Parameter Problem */
++ return -1;
++ }
++ }
++ }
++ /* Fragment options header */
++ else if (next_hdr == NEXTHDR_FRAGMENT)
++ {
++ if ( (len_delta -= sizeof(struct frag_hdr)) >= 0)
++ {
++ struct frag_hdr *ip6f =
++ (struct frag_hdr *)(src+sizeof(struct ipv6hdr)+opts_len);
++
++ opts_len += sizeof(struct frag_hdr); /* Frag Header Length = 8 */
++ ip_hdr->id = htons(ntohl(ip6f->identification)); /* ID field */
++ ip_hdr->frag_off = htons((ntohs(ip6f->frag_off) & IP6F_OFF_MASK) >> 3);
++ /* fragment offset */
++ ip_hdr->frag_off = htons(ntohs(ip_hdr->frag_off) |
++ ((ntohs(ip6f->frag_off) & IP6F_MORE_FRAG) << 13));
++ /* more fragments flag */
++ next_hdr = ip6f->nexthdr;
++ }
++ else
++ {
++ PDEBUG("ip6_ip4(): fragment header error, packet droped");
++ /* Generate ICMP Parameter Problem */
++ return -1;
++ }
++ }
++ /* No Next Header */
++ else if (next_hdr == NEXTHDR_NONE)
++ {
++ /* RFC 2460 IPv6 Specification, 4.7
++ 4.7 No Next Header
++
++ The value 59 in the Next Header field of an IPv6 header or any
++ extension header indicates that there is nothing following that
++ header. If the Payload Length field of the IPv6 header indicates the
++ presence of octets past the end of a header whose Next Header field
++ contains 59, those octets must be ignored, and passed on unchanged if
++ the packet is forwarded.
++ */
++ break;
++ }
++ else if (next_hdr == NEXTHDR_ESP || next_hdr == NEXTHDR_AUTH)
++ {
++ PDEBUG("ip6_ip4(): cannot translate AUTH or ESP extention header, packet dropped\n");
++ return -1;
++ }
++ else if (next_hdr == NEXTHDR_IPV6)
++ {
++ PDEBUG("ip6_ip4(): cannot translate IPv6-IPv6 packet, packet dropped\n");
++ return -1;
++ }
++ else if (next_hdr == 0)
++ {
++ /* As say RFC 2460 (IPv6 Spec) we should discard the packet and send an
++ ICMP Parameter Problem message to the source of the packet, with an
++ ICMP Code value of 1 ("unrecognized Next Header type encountered")
++ and the ICMP Pointer field containing the offset of the unrecognized
++ value within the original packet
++ */
++ /* NOT IMPLEMENTED */
++ PDEBUG("ip6_ip4(): NEXTHDR in extention header = 0, packet dropped\n");
++ return -1;
++ }
++ else
++ {
++ PDEBUG("ip6_ip4(): cannot translate extention header = %d, packet dropped\n", next_hdr);
++ return -1;
++ }
++ }
++ }
++ }
++ else
++ {
++ PDEBUG("ip6_ip4(): error packet len, packet dropped.\n");
++ return -1;
++ }
++
++ /* Building ipv4 packet */
++
++ ip_hdr->version = IPVERSION;
++ ip_hdr->ihl = 5;
++
++ /* TOS see comment about TOS in ip4_ip6() */
++ if (tos_ignore_flag)
++ ip_hdr->tos = 0;
++ else {
++ ip_hdr->tos = ip6_hdr->priority << 4;
++ ip_hdr->tos = ip_hdr->tos | (ip6_hdr->flow_lbl[0] >> 4);
++ }
++
++ /* IPv4 Total Len = IPv6 Payload Len +
++ IPv4 Header Len (without options) - Options Headers Len */
++ ip6_payload_len = ntohs(ip6_hdr->payload_len);
++
++ if (ip6_payload_len == 0)
++ ntot_len = 0;
++ else
++ ntot_len = ip6_payload_len + IP4_IP6_HDR_DIFF - opts_len;
++
++ ip_hdr->tot_len = htons(ntot_len);
++
++ /* IPv4 TTL = IPv6 Hop Limit */
++ ip_hdr->ttl = ip6_hdr->hop_limit;
++
++ /* IPv4 Protocol = Next Header that will point to upper layer protocol */
++ ip_hdr->protocol = next_hdr;
++
++ /* IPv4 Src addr = last 4 bytes from IPv6 Src addr */
++ ip_hdr->saddr = ip6_hdr->saddr.s6_addr32[3];
++ /* IPv4 Dst addr = last 4 bytes from IPv6 Dst addr */
++ ip_hdr->daddr = ip6_hdr->daddr.s6_addr32[3];
++
++ /* Calculate IPv4 header checksum */
++ ip_hdr->check = 0;
++ ip_hdr->check = ip_fast_csum((unsigned char *)ip_hdr, ip_hdr->ihl);
++
++ if (len_delta > 0)
++ {
++ /* PROCESS ICMP */
++
++ if (next_hdr == NEXTHDR_ICMP)
++ {
++ struct icmp6hdr *icmp6_hdr;
++ struct icmphdr *icmp_hdr;
++
++ if ((len_delta -= sizeof(struct icmp6hdr)) >= 0)
++ {
++ icmp6_hdr = (struct icmp6hdr *)(src + sizeof(struct ipv6hdr) + opts_len);
++ icmp_hdr = (struct icmphdr *)(dst + sizeof(struct iphdr));
++
++ real_len += len_delta + sizeof(struct icmphdr);
++
++ /* There is diffirent between ICMPv4/ICMPv6 protocol codes
++ IPPROTO_ICMP = 1
++ IPPROTO_ICMPV6 = 58 */
++ ip_hdr->protocol = IPPROTO_ICMP;
++
++ if (include_flag) {
++ /* !!! Warnig !!! We discard ICMP packets with any ICMP as included
++ in ICMP Error. But ICMP Error messages can include ICMP Query message
++ */
++ if (icmp6_hdr->icmp6_type != ICMPV6_ECHO_REQUEST)
++ {
++ PDEBUG("ip6_ip4(): included ICMPv6 in ICMPv6 Error message, packet dropped\n");
++ return -1;
++ }
++ }
++
++ /* Translate ICMPv6 to ICMPv4 */
++ switch (icmp6_hdr->icmp6_type)
++ {
++/* ICMP Error messages */
++ /* Destination Unreachable (Type 1) */
++ case ICMPV6_DEST_UNREACH: /* Type 1 */
++ icmp_hdr->type = ICMP_DEST_UNREACH; /* to Type 3 */
++ icmp_hdr->un.echo.id = 0;
++ icmp_hdr->un.echo.sequence = 0;
++ switch (icmp6_hdr->icmp6_code)
++ {
++ case ICMPV6_NOROUTE: /* Code 0 */
++ case ICMPV6_NOT_NEIGHBOUR: /* Code 2 */
++ case ICMPV6_ADDR_UNREACH: /* Code 3 */
++ icmp_hdr->code = ICMP_HOST_UNREACH; /* To Code 1 */
++ break;
++ case ICMPV6_ADM_PROHIBITED: /* Code 1 */
++ icmp_hdr->code = ICMP_HOST_ANO; /* To Code 10 */
++ break;
++ case ICMPV6_PORT_UNREACH: /* Code 4 */
++ icmp_hdr->code = ICMP_PORT_UNREACH; /* To Code 3 */
++
++ break;
++ default: /* discard any other codes */
++ PDEBUG("ip6_ip4(): Unknown ICMPv6 Type %d Code %d - packet dropped.\n",
++ ICMPV6_DEST_UNREACH, icmp6_hdr->icmp6_code);
++ return -1;
++ }
++ break;
++ /* Packet Too Big (Type 2) */
++ case ICMPV6_PKT_TOOBIG: /* Type 2 */
++ icmp_hdr->type = ICMP_DEST_UNREACH; /* to Type 3 */
++ icmp_hdr->code = ICMP_FRAG_NEEDED; /* to Code 4 */
++ /* Change MTU, RFC 2765 (SIIT), 4.2:
++ The MTU field needs to be adjusted for the difference between
++ the IPv4 and IPv6 header sizes taking into account whether or
++ not the packet in error includes a Fragment header.
++ */
++ /* !!! Don't implement !!! */
++ icmp_hdr->un.frag.mtu = (__u16) icmp6_hdr->icmp6_mtu;
++ break;
++ /* Time Exceeded (Type 3) */
++ case ICMPV6_TIME_EXCEED:
++ icmp_hdr->type = ICMP_TIME_EXCEEDED; /* to Type 11 */
++ icmp_hdr->code = icmp6_hdr->icmp6_code; /* Code unchanged */
++ break;
++ /* Parameter Problem (Type 4) */
++ case ICMPV6_PARAMPROB:
++ switch (icmp6_hdr->icmp6_code) {
++ case ICMPV6_UNK_NEXTHDR: /* Code 1 */
++ icmp_hdr->type = ICMP_DEST_UNREACH; /* to Type 3 */
++ icmp_hdr->code = ICMP_PROT_UNREACH; /* to Code 2 */
++ break;
++ default: /* if Code != 1 */
++ icmp_hdr->type = ICMP_PARAMETERPROB; /* to Type 12 */
++ icmp_hdr->code = 0; /* to Code 0 */
++ /* Update Pointer field
++ RFC 2765 (SIIT), 4.2:
++ The Pointer needs to be updated to point to the corresponding
++ field in the translated include IP header.
++ */
++ switch (ntohl(icmp6_hdr->icmp6_pointer))
++ {
++ case 0: /* IPv6 Version -> IPv4 Version */
++ icmp_hdr->un.echo.id = 0;
++ break;
++ case 4: /* IPv6 PayloadLength -> IPv4 Total Length */
++ icmp_hdr->un.echo.id = 0x0002; /* 2 */
++ break;
++ case 6: /* IPv6 Next Header-> IPv4 Protocol */
++ icmp_hdr->un.echo.id = 0x0009; /* 9 */
++ break;
++ case 7: /* IPv6 Hop Limit -> IPv4 TTL */
++ icmp_hdr->un.echo.id = 0x0008; /* 8 */
++ break;
++ case 8: /* IPv6 Src addr -> IPv4 Src addr */
++ icmp_hdr->un.echo.id = 0x000c; /* 12 */
++ break;
++ case 24: /* IPv6 Dst addr -> IPv4 Dst addr*/
++ icmp_hdr->un.echo.id = 0x0010; /* 16 */
++ break;
++ default: /* set all ones in other cases */
++ icmp_hdr->un.echo.id = 0xff;
++ break;
++ }
++ break;
++ }
++ break;
++
++/* End of ICMP Error messages */
++
++ /* Echo Request and Echo Reply (Type 128 and 129) */
++ case ICMPV6_ECHO_REQUEST:
++ icmperr = 0; /* not error ICMP message */
++ icmp_hdr->type = ICMP_ECHO; /* to Type 8 */
++ icmp_hdr->code = 0; /* to Code 0 */
++ icmp_hdr->un.echo.id = icmp6_hdr->icmp6_identifier;
++ icmp_hdr->un.echo.sequence = icmp6_hdr->icmp6_sequence;
++ /* copy rest of ICMP data to result packet */
++ if (len_delta > 0)
++ memcpy(((char *)icmp_hdr) + sizeof(struct icmphdr),
++ ((char *)icmp6_hdr) + sizeof(struct icmp6hdr), len_delta);
++ break;
++ case ICMPV6_ECHO_REPLY:
++ icmperr = 0; /* not error ICMP message */
++ icmp_hdr->type = ICMP_ECHOREPLY; /* to Type 0 */
++ icmp_hdr->code = 0; /* to Code 0 */
++ icmp_hdr->un.echo.id = icmp6_hdr->icmp6_identifier;
++ icmp_hdr->un.echo.sequence = icmp6_hdr->icmp6_sequence;
++ /* copy rest of ICMP data */
++ if (len_delta > 0)
++ memcpy(((char *)icmp_hdr) + sizeof(struct icmphdr),
++ ((char *)icmp6_hdr) + sizeof(struct icmp6hdr), len_delta);
++ break;
++ default:
++ /* Unknown error messages. Silently drop. */
++ PDEBUG("ip6_ip4(): unknown ICMPv6 Type %d, packet dropped.\n", icmp6_hdr->icmp6_type);
++ return -1;
++ }
++
++ if (icmperr)
++ {
++ /* If ICMP Error message, we translate IP included packet*/
++ if (len_delta >= sizeof(struct ipv6hdr))
++ {
++ if((inc_opts_len = ip6_ip4((char *)icmp6_hdr + sizeof(struct icmp6hdr), len_delta,
++ (char *)icmp_hdr + sizeof(struct icmphdr), 1)) == -1) {
++ PDEBUG("ip6_ip4(): incorrect translation of ICMPv6 Error message, packet dropped\n");
++ return -1;
++ }
++ /* correct IPv4 Total Len that = old Total Len
++ - Options Headers Len in included IP packet
++ - diffirence between IPv6 Header Len and IPv4 Header Len
++ */
++ if (ntot_len != 0)
++ ip_hdr->tot_len = htons(ntot_len - inc_opts_len - IP4_IP6_HDR_DIFF);
++ real_len = real_len - inc_opts_len - IP4_IP6_HDR_DIFF;
++ }
++ else if (len_delta > 0)
++ {
++ /* May be it need set 0x0 to rest area in result IPv4 packet,
++ * but we copy rest data unchanged
++ */
++ memcpy(((char *)icmp_hdr) + sizeof(struct icmphdr),
++ ((char *)icmp6_hdr) + sizeof(struct icmp6hdr), len_delta);
++ }
++ }
++
++ /* Calculate IPv4 Header checksum */
++ ip_hdr->check = 0;
++ ip_hdr->check = ip_fast_csum((unsigned char *)ip_hdr, ip_hdr->ihl);
++
++ /* Calculate ICMPv4 checksum */
++ if (ntot_len != 0)
++ {
++ icmp_hdr->checksum = 0;
++ icmp_hdr->checksum = ip_compute_csum((unsigned char *)icmp_hdr, ntohs(ip_hdr->tot_len)
++ - sizeof(struct iphdr));
++ }
++ }
++ else
++ {
++ PDEBUG("ip6_ip4(): error length ICMP packet, packet dropped.\n");
++ return -1;
++ }
++
++ }
++ /* PROCESS TCP and UDP (and rest data) */
++
++ else {
++ real_len += len_delta;
++ /* we copy rest data to IPv4 packet without changing */
++ memcpy(dst+sizeof(struct iphdr), src + sizeof(struct ipv6hdr) + opts_len, len_delta);
++ }
++ }
++
++ if (include_flag) /* if it's included IP packet */
++ return opts_len; /* return options headers length */
++ else
++ return real_len; /* result packet len */
++}
++
++/*
++ * ip4_fragment(skb, len, hdr_len, dev, eth_h)
++ * to fragment original IPv4 packet if result IPv6 packet will be > 1280
++ */
++
++static int ip4_fragment(struct sk_buff *skb, int len, int hdr_len, struct net_device *dev, struct ethhdr *eth_h)
++{
++ struct sk_buff *skb2 = NULL; /* pointer to new struct sk_buff for transleded packet */
++ char buff[FRAG_BUFF_SIZE+hdr_len]; /* buffer to form new fragment packet */
++ char *cur_ptr = skb->data+hdr_len; /* pointter to current packet data with len = frag_len */
++ struct iphdr *ih4 = (struct iphdr *) skb->data;
++ struct iphdr *new_ih4 = (struct iphdr *) buff; /* point to new IPv4 hdr */
++ struct ethhdr *new_eth_h; /* point to ether hdr, need to set hard header data in fragment */
++ int data_len = len - hdr_len; /* origin packet data len */
++ int rest_len = data_len; /* rest data to fragment */
++ int frag_len = 0; /* current fragment len */
++ int last_frag = 0; /* last fragment flag, if = 1, it's last fragment */
++ int flag_last_mf = 0;
++ __u16 new_id = 0; /* to generate identification field */
++ __u16 frag_offset = 0; /* fragment offset */
++ unsigned int csum;
++ unsigned short udp_len;
++
++#ifdef SIIT_DEBUG
++ printk("siit: it's DF == 0 and result IPv6 packet will be > 1280\n");
++ siit_print_dump(skb->data, hdr_len, "siit: (orig) ipv4_hdr dump");
++#endif
++
++ if ((ntohs(ih4->frag_off) & IP_MF) == 0 )
++ /* it's a case we'll clear MF flag in our last packet */
++ flag_last_mf = 1;
++
++ if (ih4->protocol == IPPROTO_UDP) {
++ if ( (ntohs(ih4->frag_off) & IP_OFFSET) == 0) {
++ struct udphdr *udp_hdr = (struct udphdr *)((char *)ih4 + hdr_len);
++ if (!flag_last_mf) {
++ if (udp_hdr->check == 0) {
++ /* it's a first fragment with ZERO checksum and we drop packet */
++ printk("siit: First fragment of UDP with zero checksum - packet droped\n");
++ printk("siit: addr: %x src port: %d dst port: %d\n",
++ htonl(ih4->saddr), htons(udp_hdr->source), htons(udp_hdr->dest));
++ return -1;
++ }
++ }
++ else if (udp_hdr->check == 0) {
++ /* Calculate UDP checksum only if it's not fragment */
++ udp_len = ntohs(udp_hdr->len);
++ csum = 0;
++ csum = csum_partial((unsigned char *)udp_hdr, udp_len, csum);
++ udp_hdr->check = csum_tcpudp_magic(ih4->saddr, ih4->daddr, udp_len, IPPROTO_UDP, csum);
++ }
++ }
++ }
++
++ frag_offset = ntohs(ih4->frag_off) & IP_OFFSET;
++
++ new_id = ih4->id;
++
++ while(1) {
++ if (rest_len <= FRAG_BUFF_SIZE) {
++ /* it's last fragmen */
++ frag_len = rest_len; /* rest data */
++ last_frag = 1;
++ }
++ else
++ frag_len = FRAG_BUFF_SIZE;
++
++ /* copy IP header to buffer */
++ memcpy(buff, skb->data, hdr_len);
++ /* copy data to buffer with len = frag_len */
++ memcpy(buff + hdr_len, cur_ptr, frag_len);
++
++ /* set id field in new IPv4 header*/
++ new_ih4->id = new_id;
++
++ /* is it last fragmet */
++ if(last_frag && flag_last_mf)
++ /* clear MF flag */
++ new_ih4->frag_off = htons(frag_offset & (~IP_MF));
++ else
++ /* set MF flag */
++ new_ih4->frag_off = htons(frag_offset | IP_MF);
++
++ /* change packet total length */
++ new_ih4->tot_len = htons(frag_len+hdr_len);
++
++ /* rebuild the header checksum (IP needs it) */
++ new_ih4->check = 0;
++ new_ih4->check = ip_fast_csum((unsigned char *)new_ih4,new_ih4->ihl);
++
++ /* Allocate new sk_buff to compose translated packet */
++ skb2 = dev_alloc_skb(frag_len+hdr_len+dev->hard_header_len+IP4_IP6_HDR_DIFF+IP6_FRAGMENT_SIZE);
++ if (!skb2) {
++ printk(KERN_DEBUG "%s: alloc_skb failure - packet dropped.\n", dev->name);
++ dev_kfree_skb(skb2);
++ return -1;
++ }
++ /* allocate skb->data portion for IP header len, fragment data len and ether header len
++ * and copy to head ether header from origin skb
++ */
++ memcpy(skb_put(skb2, frag_len+hdr_len+dev->hard_header_len+IP4_IP6_HDR_DIFF+IP6_FRAGMENT_SIZE), (char *) eth_h,
++ dev->hard_header_len);
++ /* correct ether header data, ether protocol field to ETH_P_IPV6 */
++ new_eth_h = (struct ethhdr *)skb2->data;
++ new_eth_h->h_proto = htons(ETH_P_IPV6);
++
++ /* reset the mac header */
++ skb_reset_mac_header(skb2);
++
++ /* pull ether header from new skb->data */
++ skb_pull(skb2, dev->hard_header_len);
++ /* set skb protocol to IPV6 */
++ skb2->protocol = htons(ETH_P_IPV6);
++
++ /* call translation function */
++ if ( ip4_ip6(buff, frag_len+hdr_len, skb2->data, 0) == -1) {
++ dev_kfree_skb(skb2);
++ return -1;
++ }
++
++ /*
++ * Set needed fields in new sk_buff
++ */
++ skb2->dev = dev;
++ skb2->ip_summed = CHECKSUM_UNNECESSARY;
++ skb2->pkt_type = PACKET_HOST;
++
++ /* Add transmit statistic */
++ siit_stats(dev)->tx_packets++;
++ siit_stats(dev)->tx_bytes += skb2->len;
++
++ /* send packet to upper layer */
++ netif_rx(skb2);
++
++ /* exit if it was last fragment */
++ if (last_frag)
++ break;
++
++ /* correct current data pointer */
++ cur_ptr += frag_len;
++ /* rest data len */
++ rest_len -= frag_len;
++ /* current fragment offset */
++ frag_offset = (frag_offset*8 + frag_len)/8;
++ }
++
++ return 0;
++}
++/*
++ * Transmit a packet (called by the kernel)
++ *
++ * siit_xmit(skb, dev)
++ *
++ * where
++ * skb - pointer to struct sk_buff with incomed packet
++ * dev - pointer to struct device on which packet revieved
++ *
++ * Statistic:
++ * for all incoming packes:
++ * stats.rx_bytes+=skb->len
++ * stats.rx_packets++
++ * for packets we can't transle:
++ * stats.tx_errors++
++ * device busy:
++ * stats.tx_errors++
++ * for packets we can't allocate sk_buff:
++ * stats.tx_dropped++
++ * for outgoing packes:
++ * stats.tx_packets++
++ * stats.tx_bytes+=skb2->len !!! But we don't set skb2->len !!!
++ */
++
++static int siit_xmit(struct sk_buff *skb, struct net_device *dev)
++{
++ struct sk_buff *skb2 = NULL;/* pointer to new struct sk_buff for transleded packet */
++ struct ethhdr *eth_h; /* pointer to incoming Ether header */
++ int len; /* original packets length */
++ int new_packet_len;
++ int skb_delta = 0; /* delta size for allocate new skb */
++ char new_packet_buff[2048];
++
++ /* Check pointer to sk_buff and device structs */
++ if (skb == NULL || dev == NULL)
++ return -EINVAL;
++
++ /* Add receive statistic */
++ siit_stats(dev)->rx_bytes += skb->len;
++ siit_stats(dev)->rx_packets++;
++
++ dev->trans_start = jiffies;
++
++ /* Upper layer (IP) protocol forms sk_buff for outgoing packet
++ * and sets IP header + Ether header too. IP layer sets outgoing
++ * device in sk_buff->dev.
++ * In function (from linux/net/core/dev.c) ther is a call to
++ * device transmit function (dev->hard_start_xmit):
++ *
++ * dev_queue_xmit(struct sk_buff *skb)
++ * {
++ * ...
++ * device *dev = skb->dev;
++ * ...
++ * dev->hard_start_xmit(skb, dev);
++ * ...
++ * }
++ * We save pointer to ether header in eth_h and skb_pull ether header
++ * from data field of skb_buff
++ */
++
++ eth_h = (struct ethhdr *)skb->data; /* point to incoming packet Ether Header */
++
++#ifdef SIIT_DEBUG
++ siit_print_dump(skb->data, ETH_HLEN, "siit: eth_hdr dump");
++#endif
++
++ /* Remove hardware header from origin sk_buff */
++ skb_pull(skb,dev->hard_header_len);
++
++ /*
++ * Process IPv4 paket
++ */
++ if (ntohs(skb->protocol) == ETH_P_IP) {
++ int hdr_len; /* IPv4 header length */
++ int data_len; /* IPv4 data length */
++ struct iphdr *ih4; /* pointer to IPv4 header */
++ struct icmphdr *icmp_hdr; /* point to current ICMPv4 header struct */
++
++ ih4 = (struct iphdr *)skb->data; /* point to incoming packet's IPv4 header */
++
++ /* Check IPv4 Total Length */
++ if (skb->len != ntohs(ih4->tot_len)) {
++ PDEBUG("siit_xmit(): Different skb_len %x and ip4 tot_len %x - packet dropped.\n",
++ skb->len, ih4->tot_len);
++ siit_stats(dev)->tx_errors++;
++ dev_kfree_skb(skb);
++ return 0;
++ }
++
++ len = skb->len; /* packet's total len */
++ hdr_len = (int)(ih4->ihl * 4); /* packet's header len */
++ data_len = len - hdr_len; /* packet's data len */
++
++ /* If DF == 0 */
++ if ( (ntohs(ih4->frag_off) & IP_DF) == 0 ) {
++ /* If result IPv6 packet will be > 1280
++ we need to fragment original IPv4 packet
++ */
++ if ( data_len > FRAG_BUFF_SIZE ) {
++ /* call function that fragment packet and translate to IPv6 each fragment
++ * and send to upper layer
++ */
++ if ( ip4_fragment(skb, len, hdr_len, dev, eth_h) == -1) {
++ siit_stats(dev)->tx_errors++;
++ }
++ /* Free incoming skb */
++ dev_kfree_skb(skb);
++ /* Device can accept a new packet */
++
++ return 0;
++
++ }
++ }
++ /* If DF == 1 && MF == 0 && Fragment Offset == 0
++ * we don't include fragment header
++ */
++ if ( ntohs(ih4->frag_off) == IP_DF )
++ skb_delta = IP4_IP6_HDR_DIFF; /* delta is +20 */
++ else
++ skb_delta = IP4_IP6_HDR_DIFF + IP6_FRAGMENT_SIZE; /* delta is +20 and +8 */
++
++ /* If it's ICMP, check is it included IP packet in it */
++ if ( ih4->protocol == IPPROTO_ICMP) {
++ icmp_hdr = (struct icmphdr *) (skb->data+hdr_len); /* point to ICMPv4 header */
++ if ( icmp_hdr->type != ICMP_ECHO && icmp_hdr->type != ICMP_ECHOREPLY) {
++ /*
++ * It's ICMP Error that has included IP packet
++ * we'll add only +20 because we don't include Fragment Header
++ * into translated included IP packet
++ */
++ skb_delta += IP4_IP6_HDR_DIFF;
++ }
++ }
++
++ /* Allocate new sk_buff to compose translated packet */
++ skb2 = dev_alloc_skb(len+dev->hard_header_len+skb_delta);
++ if (!skb2) {
++ printk(KERN_DEBUG "%s: alloc_skb failure - packet dropped.\n", dev->name);
++ dev_kfree_skb(skb);
++ siit_stats(dev)->rx_dropped++;
++
++ return 0;
++ }
++ /* allocate skb->data portion = IPv4 packet len + ether header len
++ * + skb_delta (max = two times (diffirence between IPv4 header and
++ * IPv6 header + Frag Header), second for included packet,
++ * and copy to head of skb->data ether header from origin skb
++ */
++ memcpy(skb_put(skb2, len+dev->hard_header_len+skb_delta), (char *)eth_h, dev->hard_header_len);
++ /* correct ether header data, ether protocol field to ETH_P_IPV6 */
++ eth_h = (struct ethhdr *)skb2->data;
++ eth_h->h_proto = htons(ETH_P_IPV6);
++ skb_reset_mac_header(skb2);
++ /* remove ether header from new skb->data,
++ * NOTE! data will rest, pointer to data and data len will change
++ */
++ skb_pull(skb2,dev->hard_header_len);
++ /* set skb protocol to IPV6 */
++ skb2->protocol = htons(ETH_P_IPV6);
++
++ /* call translation function */
++ if (ip4_ip6(skb->data, len, skb2->data, 0) == -1 ) {
++ dev_kfree_skb(skb);
++ dev_kfree_skb(skb2);
++ siit_stats(dev)->rx_errors++;
++
++ return 0;
++ }
++ }
++ /*
++ * IPv6 paket
++ */
++ else if (ntohs(skb->protocol) == ETH_P_IPV6) {
++
++#ifdef SIIT_DEBUG
++ siit_print_dump(skb->data, sizeof(struct ipv6hdr), "siit: (in) ip6_hdr dump");
++#endif
++ /* packet len = skb->data len*/
++ len = skb->len;
++
++ /* call translation function */
++ if ((new_packet_len = ip6_ip4(skb->data, len, new_packet_buff, 0)) == -1 )
++ {
++ PDEBUG("siit_xmit(): error translation ipv6->ipv4, packet dropped.\n");
++ siit_stats(dev)->rx_dropped++;
++ goto end;
++ }
++
++ /* Allocate new sk_buff to compose translated packet */
++ skb2 = dev_alloc_skb(new_packet_len + dev->hard_header_len);
++ if (!skb2) {
++ printk(KERN_DEBUG "%s: alloc_skb failure, packet dropped.\n", dev->name);
++ siit_stats(dev)->rx_dropped++;
++ goto end;
++ }
++ memcpy(skb_put(skb2, new_packet_len + dev->hard_header_len), (char *)eth_h, dev->hard_header_len);
++ eth_h = (struct ethhdr *)skb2->data;
++ eth_h->h_proto = htons(ETH_P_IP);
++ skb_reset_mac_header(skb2);
++ skb_pull(skb2, dev->hard_header_len);
++ memcpy(skb2->data, new_packet_buff, new_packet_len);
++ skb2->protocol = htons(ETH_P_IP);
++ }
++ else {
++ PDEBUG("siit_xmit(): unsupported protocol family %x, packet dropped.\n", skb->protocol);
++ goto end;
++ }
++
++ /*
++ * Set needed fields in new sk_buff
++ */
++ skb2->pkt_type = PACKET_HOST;
++ skb2->dev = dev;
++ skb2->ip_summed = CHECKSUM_UNNECESSARY;
++
++ /* Add transmit statistic */
++ siit_stats(dev)->tx_packets++;
++ siit_stats(dev)->tx_bytes += skb2->len;
++
++ /* Send packet to upper layer protocol */
++ netif_rx(skb2);
++
++end:
++ dev_kfree_skb(skb);
++
++ return 0;
++}
++
++static bool header_ops_init = false;
++static struct header_ops siit_header_ops ____cacheline_aligned;
++
++static const struct net_device_ops siit_netdev_ops = {
++ .ndo_open = siit_open,
++ .ndo_stop = siit_release,
++ .ndo_start_xmit = siit_xmit,
++};
++
++/*
++ * The init function initialize of the SIIT device..
++ * It is invoked by register_netdev()
++ */
++
++static void
++siit_init(struct net_device *dev)
++{
++ ether_setup(dev); /* assign some of the fields */
++ random_ether_addr(dev->dev_addr);
++
++ /*
++ * Assign device function.
++ */
++ dev->netdev_ops = &siit_netdev_ops;
++ dev->flags |= IFF_NOARP; /* ARP not used */
++ dev->tx_queue_len = 10;
++
++ if (!header_ops_init) {
++ memcpy(&siit_header_ops, dev->header_ops, sizeof(struct header_ops));
++ siit_header_ops.cache = NULL;
++ }
++ dev->header_ops = &siit_header_ops;
++}
++
++/*
++ * Finally, the module stuff
++ */
++static struct net_device *siit_dev = NULL;
++
++int init_module(void)
++{
++ int res = -ENOMEM;
++ int priv_size;
++
++ priv_size = sizeof(struct header_ops);
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
++ siit_dev = alloc_netdev(priv_size, "siit%d", NET_NAME_UNKNOWN, siit_init);
++#else
++ siit_dev = alloc_netdev(priv_size, "siit%d", siit_init);
++#endif
++ if (!siit_dev)
++ goto err_alloc;
++
++ res = register_netdev(siit_dev);
++ if (res)
++ goto err_register;
++
++ return 0;
++
++err_register:
++ free_netdev(siit_dev);
++err_alloc:
++ printk(KERN_ERR "Error creating siit device: %d\n", res);
++ return res;
++}
++
++void cleanup_module(void)
++{
++ unregister_netdev(siit_dev);
++ free_netdev(siit_dev);
++}
++
++MODULE_LICENSE("GPL");
+diff --git a/feeds/packages/net/siit/src/siit.h b/feeds/packages/net/siit/src/siit.h
+new file mode 100644
+index 0000000..47cf776
+--- /dev/null
++++ b/feeds/packages/net/siit/src/siit.h
+@@ -0,0 +1,61 @@
++/*
++ * siit.h -- definitions for the SIIT module
++ *
++ *
++ */
++
++/*
++ * Constants
++ */
++
++/* SIIT_ETH control the name of SIIT interface:
++ * 0 - interface name is siit0,
++ * 1 - interface name is ethX.
++ */
++#define SIIT_ETH 0
++
++#define BUFF_SIZE 4096
++#define FRAG_BUFF_SIZE 1232 /* IPv6 max fragment size without IPv6 header
++ * to fragmanet IPv4 if result IPv6 packet will be > 1280
++ */
++
++#define TRANSLATED_PREFIX 0x0000ffff /* third byte in IPv4-translated addr prefix */
++#define MAPPED_PREFIX 0x0000ffff /* third byte in IPv4-mapped addr prefix */
++
++#define IP4_IP6_HDR_DIFF 20 /* diffirence between IPv4 and IPv6 headers */
++#define IP6_FRAGMENT_SIZE 8 /* size of Fragment Header */
++
++/* IPv6 header fields masks */
++#define IP6F_OFF_MASK 0xfff8 /* mask out offset from frag_off */
++#define IP6F_RESERVED_MASK 0x0006 /* reserved bits in frag_off */
++#define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */
++
++
++
++/*
++ * Macros to help debugging
++ */
++
++#undef PDEBUG /* undef it, just in case */
++#ifdef SIIT_DEBUG
++# ifdef __KERNEL__
++ /* This one if debugging is on, and kernel space */
++# define PDEBUG(fmt, args...) printk(KERN_DEBUG "siit: " fmt, ## args)
++# else
++ /* This one for user space */
++# define PDEBUG(fmt, args...) fprintf(stderr, fmt, ## args)
++# endif
++#else
++# define PDEBUG(fmt, args...) /* not debugging: nothing */
++#endif
++
++#undef PDEBUGG
++#define PDEBUGG(fmt, args...)
++
++
++
++
++
++
++
++
+diff --git a/feeds/packages/net/smartsnmpd/Makefile b/feeds/packages/net/smartsnmpd/Makefile
+new file mode 100644
+index 0000000..9be39cb
+--- /dev/null
++++ b/feeds/packages/net/smartsnmpd/Makefile
+@@ -0,0 +1,75 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=smartsnmpd
++PKG_VERSION:=2014-08-13
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/credosemi/smartsnmp.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=fb93473d895f058b2d8975d3cfa280ae2a8ae98d
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_MIRROR_MD5SUM:=
++
++
++PKG_MAINTAINER:=Xiongfei Guo <xfguo@credosemi.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE
++
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/scons.mk
++
++define Package/smartsnmpd
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS+=+lua +liblua +libubox +libuci-lua +libubus-lua
++ TITLE:=Smart-SNMP (Agent)
++ URL:=https://github.com/credosemi/smartsnmp
++endef
++
++define Package/smartsnmpd/description
++smartsnmpd is an implementation of SNMP Agent. Its goal is "Easily
++writing boring SNMP MIB with Lua". This package add native support
++for OpenWrt. Include using ubus and uci to get system info/status.
++And, it use libubox/uloop as low level event-driven library.
++endef
++
++SCONS_OPTIONS += --transport=uloop
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); \
++ $(SCONS_VARS) \
++ scons \
++ prefix=/usr \
++ $(SCONS_OPTIONS) \
++ )
++endef
++
++define Package/smartsnmpd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/smartsnmpd $(1)/usr/sbin/smartsnmpd
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/smartsnmp
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/build/smartsnmp/core.so $(1)/usr/lib/lua/smartsnmp/core.so
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lualib/smartsnmp/*.lua $(1)/usr/lib/lua/smartsnmp/
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/smartsnmp/mibs
++ $(INSTALL_BIN) ./files/mibs/*.lua $(1)/usr/lib/lua/smartsnmp/mibs/
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/smartsnmpd.conf $(1)/etc/config/smartsnmpd
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/smartsnmpd.init $(1)/etc/init.d/smartsnmpd
++endef
++
++$(eval $(call BuildPackage,smartsnmpd))
++
+diff --git a/feeds/packages/net/smartsnmpd/files/mibs/dummy.lua b/feeds/packages/net/smartsnmpd/files/mibs/dummy.lua
+new file mode 100644
+index 0000000..e49ca68
+--- /dev/null
++++ b/feeds/packages/net/smartsnmpd/files/mibs/dummy.lua
+@@ -0,0 +1,24 @@
++--
++-- This file is part of SmartSNMP
++-- Copyright (C) 2014, Credo Semiconductor Inc.
++--
++-- This program is free software; you can redistribute it and/or modify
++-- it under the terms of the GNU General Public License as published by
++-- the Free Software Foundation; either version 2 of the License, or
++-- (at your option) any later version.
++--
++-- This program is distributed in the hope that it will be useful,
++-- but WITHOUT ANY WARRANTY; without even the implied warranty of
++-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++-- GNU General Public License for more details.
++--
++-- You should have received a copy of the GNU General Public License along
++-- with this program; if not, write to the Free Software Foundation, Inc.,
++-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++--
++
++local mib = require "smartsnmp"
++
++local dummy = {}
++
++return dummy
+diff --git a/feeds/packages/net/smartsnmpd/files/mibs/interfaces.lua b/feeds/packages/net/smartsnmpd/files/mibs/interfaces.lua
+new file mode 100644
+index 0000000..01cea6a
+--- /dev/null
++++ b/feeds/packages/net/smartsnmpd/files/mibs/interfaces.lua
+@@ -0,0 +1,125 @@
++--
++-- This file is part of SmartSNMP
++-- Copyright (C) 2014, Credo Semiconductor Inc.
++--
++-- This program is free software; you can redistribute it and/or modify
++-- it under the terms of the GNU General Public License as published by
++-- the Free Software Foundation; either version 2 of the License, or
++-- (at your option) any later version.
++--
++-- This program is distributed in the hope that it will be useful,
++-- but WITHOUT ANY WARRANTY; without even the implied warranty of
++-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++-- GNU General Public License for more details.
++--
++-- You should have received a copy of the GNU General Public License along
++-- with this program; if not, write to the Free Software Foundation, Inc.,
++-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++--
++
++local mib = require "smartsnmp"
++require "ubus"
++require "uloop"
++
++uloop.init()
++
++local conn = ubus.connect()
++if not conn then
++ error("Failed to connect to ubusd")
++end
++
++local if_cache = {}
++local if_status_cache = {}
++local if_index_cache = {}
++
++local last_load_time = os.time()
++local function need_to_reload()
++ if os.time() - last_load_time >= 3 then
++ last_load_time = os.time()
++ return true
++ else
++ return false
++ end
++end
++
++local function load_config()
++ if need_to_reload() == true then
++ if_cache = {}
++ if_status_cache = {}
++ if_index_cache = {}
++
++ -- if description
++ for k, v in pairs(conn:call("network.device", "status", {})) do
++ if_status_cache[k] = {}
++ end
++
++ for name_ in pairs(if_status_cache) do
++ for k, v in pairs(conn:call("network.device", "status", { name = name_ })) do
++ if k == 'mtu' then
++ if_status_cache[name_].mtu = v
++ elseif k == 'macaddr' then
++ if_status_cache[name_].macaddr = v
++ elseif k == 'up' then
++ if v == true then
++ if_status_cache[name_].up = 1
++ else
++ if_status_cache[name_].up = 2
++ end
++ elseif k == 'statistics' then
++ for item, stat in pairs(v) do
++ if item == 'rx_bytes' then
++ if_status_cache[name_].in_octet = stat
++ elseif item == 'tx_bytes' then
++ if_status_cache[name_].out_octet = stat
++ elseif item == 'rx_errors' then
++ if_status_cache[name_].in_errors = stat
++ elseif item == 'tx_errors' then
++ if_status_cache[name_].out_errors = stat
++ elseif item == 'rx_dropped' then
++ if_status_cache[name_].in_discards = stat
++ elseif item == 'tx_dropped' then
++ if_status_cache[name_].out_discards = stat
++ end
++ end
++ end
++ end
++ end
++
++ if_cache['desc'] = {}
++ for name, status in pairs(if_status_cache) do
++ table.insert(if_cache['desc'], name)
++ for k, v in pairs(status) do
++ if if_cache[k] == nil then if_cache[k] = {} end
++ table.insert(if_cache[k], v)
++ end
++ end
++
++ -- if index
++ for i in ipairs(if_cache['desc']) do
++ table.insert(if_index_cache, i)
++ end
++ end
++end
++
++mib.module_methods.or_table_reg("1.3.6.1.2.1.2", "The MIB module for managing Interfaces implementations")
++
++local ifGroup = {
++ [1] = mib.ConstInt(function () load_config() return #if_index_cache end),
++ [2] = {
++ [1] = {
++ [1] = mib.ConstIndex(function () load_config() return if_index_cache end),
++ [2] = mib.ConstString(function (i) load_config() return if_cache['desc'][i] end),
++ [4] = mib.ConstInt(function (i) load_config() return if_cache['mtu'][i] end),
++ [6] = mib.ConstString(function (i) load_config() return if_cache['macaddr'][i] end),
++ [8] = mib.ConstInt(function (i) load_config() return if_cache['up'][i] end),
++ [10] = mib.ConstCount(function (i) load_config() return if_cache['in_octet'][i] end),
++ [13] = mib.ConstCount(function (i) load_config() return if_cache['in_discards'][i] end),
++ [14] = mib.ConstCount(function (i) load_config() return if_cache['in_errors'][i] end),
++ [16] = mib.ConstCount(function (i) load_config() return if_cache['out_octet'][i] end),
++ [19] = mib.ConstCount(function (i) load_config() return if_cache['out_discards'][i] end),
++ [20] = mib.ConstCount(function (i) load_config() return if_cache['out_errors'][i] end),
++ }
++ }
++}
++
++return ifGroup
+diff --git a/feeds/packages/net/smartsnmpd/files/mibs/system.lua b/feeds/packages/net/smartsnmpd/files/mibs/system.lua
+new file mode 100644
+index 0000000..5b0a4af
+--- /dev/null
++++ b/feeds/packages/net/smartsnmpd/files/mibs/system.lua
+@@ -0,0 +1,176 @@
++--
++-- This file is part of SmartSNMP
++-- Copyright (C) 2014, Credo Semiconductor Inc.
++--
++-- This program is free software; you can redistribute it and/or modify
++-- it under the terms of the GNU General Public License as published by
++-- the Free Software Foundation; either version 2 of the License, or
++-- (at your option) any later version.
++--
++-- This program is distributed in the hope that it will be useful,
++-- but WITHOUT ANY WARRANTY; without even the implied warranty of
++-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++-- GNU General Public License for more details.
++--
++-- You should have received a copy of the GNU General Public License along
++-- with this program; if not, write to the Free Software Foundation, Inc.,
++-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++--
++
++local mib = require "smartsnmp"
++local uci = require "uci"
++
++-- System config
++local context = uci.cursor("/etc/config", "/tmp/.uci")
++
++-- scalar index
++local sysDesc = 1
++local sysObjectID = 2
++local sysUpTime = 3
++local sysContact = 4
++local sysName = 5
++local sysLocation = 6
++local sysServices = 7
++local sysORLastChange = 8
++
++-- table index
++local sysORTable = 9
++
++-- entry index
++local sysOREntry = 1
++
++-- list index
++local sysORIndex = 1
++local sysORID = 2
++local sysORDesc = 3
++local sysORUpTime = 4
++
++local startup_time = 0
++local or_last_changed_time = 0
++
++local function mib_system_startup(time)
++ startup_time = time
++ or_last_changed_time = time
++end
++
++mib_system_startup(os.time())
++
++local sysGroup = {}
++local or_oid_cache = {}
++local or_index_cache = {}
++local or_table_cache = {}
++
++local or_table_reg = function (oid, desc)
++ local row = {}
++ row['oid'] = {}
++ for i in string.gmatch(oid, "%d") do
++ table.insert(row['oid'], tonumber(i))
++ end
++ row['desc'] = desc
++ row['uptime'] = os.time()
++ table.insert(or_table_cache, row)
++
++ or_last_changed_time = os.time()
++
++ or_oid_cache[oid] = #or_table_cache
++
++ or_index_cache = {}
++ for i in ipairs(or_table_cache) do
++ table.insert(or_index_cache, i)
++ end
++end
++
++local or_table_unreg = function (oid)
++ local or_idx = or_oid_cache[oid]
++
++ if or_table_cache[or_idx] ~= nil then
++ table.remove(or_table_cache, or_idx)
++ or_last_changed_time = os.time()
++
++ or_index_cache = {}
++ for i in ipairs(or_table_cache) do
++ table.insert(or_index_cache, i)
++ end
++ end
++end
++
++local last_load_time = os.time()
++local function need_to_reload()
++ if os.difftime(os.time(), last_load_time) < 3 then
++ return false
++ else
++ last_load_time = os.time()
++ return true
++ end
++end
++
++local function load_config()
++ if need_to_reload() == true then
++ context:load("smartsnmpd")
++ end
++end
++
++context:load("smartsnmpd")
++
++local sysMethods = {
++ ["or_table_reg"] = or_table_reg,
++ ["or_table_unreg"] = or_table_unreg
++}
++mib.module_method_register(sysMethods)
++
++sysGroup = {
++ rocommunity = 'public',
++ [sysDesc] = mib.ConstString(function () load_config() return mib.sh_call("uname -a") end),
++ [sysObjectID] = mib.ConstOid(function ()
++ load_config()
++ local oid
++ local objectid
++ context:foreach("smartsnmpd", "smartsnmpd", function (s)
++ objectid = s.objectid
++ end)
++ if objectid ~= nil then
++ oid = {}
++ for i in string.gmatch(objectid, "%d+") do
++ table.insert(oid, tonumber(i))
++ end
++ end
++ return oid
++ end),
++ [sysUpTime] = mib.ConstTimeticks(function () load_config() return os.difftime(os.time(), startup_time) * 100 end),
++ [sysContact] = mib.ConstString(function ()
++ load_config()
++ local contact
++ context:foreach("smartsnmpd", "smartsnmpd", function (s)
++ contact = s.contact
++ end)
++ return contact
++ end),
++ [sysName] = mib.ConstString(function () load_config() return mib.sh_call("uname -n") end),
++ [sysLocation] = mib.ConstString(function ()
++ load_config()
++ local location
++ context:foreach("smartsnmpd", "smartsnmpd", function (s)
++ location = s.location
++ end)
++ return location
++ end),
++ [sysServices] = mib.ConstInt(function ()
++ load_config()
++ local services
++ context:foreach("smartsnmpd", "smartsnmpd", function (s)
++ services = tonumber(s.services)
++ end)
++ return services
++ end),
++ [sysORLastChange] = mib.ConstTimeticks(function () load_config() return os.difftime(os.time(), or_last_changed_time) * 100 end),
++ [sysORTable] = {
++ [sysOREntry] = {
++ [sysORIndex] = mib.UnaIndex(function () load_config() return or_index_cache end),
++ [sysORID] = mib.ConstOid(function (i) load_config() return or_table_cache[i].oid end),
++ [sysORDesc] = mib.ConstString(function (i) load_config() return or_table_cache[i].desc end),
++ [sysORUpTime] = mib.ConstTimeticks(function (i) load_config() return os.difftime(os.time(), or_table_cache[i].uptime) * 100 end),
++ }
++ }
++}
++
++return sysGroup
+diff --git a/feeds/packages/net/smartsnmpd/files/smartsnmpd.conf b/feeds/packages/net/smartsnmpd/files/smartsnmpd.conf
+new file mode 100644
+index 0000000..aace5a6
+--- /dev/null
++++ b/feeds/packages/net/smartsnmpd/files/smartsnmpd.conf
+@@ -0,0 +1,21 @@
++config smartsnmpd
++ option port '161'
++ option ro_community 'public'
++ option rw_community 'private'
++ option mib_module_path 'mibs'
++ option objectid '1.2.3.4'
++ option contact 'Me <me@example.org>'
++ option location 'Shanghai'
++ option services '72'
++
++config smartsnmpd_module
++ option oid "1.3.6.1.2.1.1"
++ option module 'system'
++
++config smartsnmpd_module
++ option oid "1.3.6.1.2.1.2"
++ option module 'interfaces'
++
++config smartsnmpd_module
++ option oid "1.3.6.1.1"
++ option module 'dummy'
+diff --git a/feeds/packages/net/smartsnmpd/files/smartsnmpd.init b/feeds/packages/net/smartsnmpd/files/smartsnmpd.init
+new file mode 100755
+index 0000000..dbe3af8
+--- /dev/null
++++ b/feeds/packages/net/smartsnmpd/files/smartsnmpd.init
+@@ -0,0 +1,47 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=97
++
++USE_PROCD=1
++PROG=/usr/sbin/smartsnmpd
++CONFIGFILE=/etc/smartsnmpd.conf
++
++smartsnmpd_mib_module() {
++ local cfg="$1"
++ config_get OID "$cfg" oid
++ config_get MODULE "$cfg" module
++ echo " ['$OID'] = '$MODULE'," >> $CONFIGFILE
++}
++
++start_service() {
++ include /lib/functions
++
++ config_load smartsnmpd
++
++ procd_open_instance
++ procd_set_param command $PROG -c $CONFIGFILE
++ procd_set_param file $CONFIGFILE
++ procd_set_param respawn
++ procd_close_instance
++
++ # before we can call xappend
++ mkdir -p $(dirname $CONFIGFILE)
++
++ echo "-- auto-generated config file from /etc/config/smartsnmpd" > $CONFIGFILE
++
++ config_get PORT smartsnmpd port 161
++ echo "port = $PORT" >> $CONFIGFILE
++
++ config_get RO_COMMUNITY smartsnmpd ro_community 'public'
++ config_get RW_COMMUNITY smartsnmpd rw_community 'private'
++ echo "ro_community = '$RO_COMMUNITY'" >> $CONFIGFILE
++ echo "rw_community = '$RW_COMMUNITY'" >> $CONFIGFILE
++
++ config_get MIB_MODULE_PATH smartsnmpd mib_module_path '/usr/lib/lua/smartsnmp/mibs/'
++ echo "mib_module_path = '$MIB_MODULE_PATH'" >> $CONFIGFILE
++
++ echo "mib_modules = {" >> $CONFIGFILE
++ config_foreach smartsnmpd_mib_module smartsnmpd_module
++ echo "}" >> $CONFIGFILE
++}
+diff --git a/feeds/packages/net/snort/Config.in b/feeds/packages/net/snort/Config.in
+new file mode 100644
+index 0000000..433557c
+--- /dev/null
++++ b/feeds/packages/net/snort/Config.in
+@@ -0,0 +1,25 @@
++menu "Configuration"
++ depends on PACKAGE_snort
++
++config SNORT_MYSQL
++ bool "Enable MySQL support"
++ default n
++ help
++ This option enables support for logging to a MySQL database.
++ Disabled by default.
++
++config SNORT_PGSQL
++ bool "Enable PostgreSQL support"
++ default n
++ help
++ This option enables support for logging to a PostgreSQL database.
++ Disabled by default.
++
++config SNORT_LZMA
++ bool "Enable LZMA support"
++ default n
++ help
++ This option enables LZMA decompression.
++ Disabled by default.
++
++endmenu
+diff --git a/feeds/packages/net/snort/Makefile b/feeds/packages/net/snort/Makefile
+new file mode 100644
+index 0000000..9886a5d
+--- /dev/null
++++ b/feeds/packages/net/snort/Makefile
+@@ -0,0 +1,168 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=snort
++PKG_VERSION:=2.9.7.2
++PKG_RELEASE:=3
++
++PKG_LICENSE:=GPL-2.0
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://www.snort.org/downloads/snort/ \
++ @SF/$(PKG_NAME)
++PKG_MD5SUM:=b01e9964827394c39194a0147bc15705
++
++PKG_BUILD_DEPENDS:=librpc
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/snort
++ SUBMENU:=Firewall
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libdaq +libdnet +libopenssl +libpcap +libpcre +libpthread +libuuid +zlib +SNORT_MYSQL:libmysqlclient +SNORT_PGSQL:libpq +SNORT_PGSQL:libuuid +SNORT_LZMA:liblzma
++ TITLE:=Lightweight Network Intrusion Detection System
++ URL:=http://www.snort.org/
++ MENU:=1
++endef
++
++define Package/snort/description
++ Snort is an open source network intrusion detection and prevention system.
++ It is capable of performing real-time traffic analysis, alerting, blocking
++ and packet logging on IP networks. It utilizes a combination of protocol
++ analysis and pattern matching in order to detect anomalies, misuse and
++ attacks.
++endef
++
++define Package/snort/config
++ source "$(SOURCE)/Config.in"
++endef
++
++CONFIGURE_ARGS += \
++ --prefix="/usr" \
++ --enable-flexresp \
++ --with-dnet-includes="$(STAGING_DIR)/usr/include" \
++ --with-dnet-libraries="$(STAGING_DIR)/usr/lib" \
++ --with-libpcap-includes="$(STAGING_DIR)/usr/include" \
++ --with-libpcap-libraries="$(STAGING_DIR)/usr/lib" \
++ --with-libpcre-includes="$(STAGING_DIR)/usr/include" \
++ --with-libpcre-libraries="$(STAGING_DIR)/usr/lib" \
++ --with-daq-includes="$(STAGING_DIR)/usr/include" \
++ --with-daq-libraries="$(STAGING_DIR)/usr/lib" \
++ --disable-static-daq
++
++ifeq ($(CONFIG_SNORT_MYSQL),)
++CONFIGURE_ARGS += \
++ --without-mysql
++endif
++
++ifeq ($(CONFIG_PGSQL),)
++CONFIGURE_ARGS += \
++ --without-postgresql
++endif
++
++ifeq ($(CONFIG_SNORT_LZMA),)
++CONFIGURE_ARGS += \
++ --disable-lzma
++endif
++
++CONFIGURE_VARS += \
++ CPPFLAGS="$$$$CPPFLAGS -I$(STAGING_DIR)/usr/include/mysql" \
++ LDFLAGS="$$$$LDFLAGS -L$(STAGING_DIR)/usr/lib/mysql" \
++ PATH="$(STAGING_DIR)/usr/lib/libnet-1.0.x/bin:$$$$PATH"
++
++MAKE_FLAGS += \
++ extra_incl=""
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/include/snort/dynamic_preproc
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/snort/dynamic_preproc/* \
++ $(STAGING_DIR)/usr/include/snort/dynamic_preproc/
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/lib/snort/dynamic_preproc
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/snort/dynamic_preproc/* \
++ $(STAGING_DIR)/usr/lib/snort/dynamic_preproc/
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/lib/snort_dynamicengine
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/snort_dynamicengine/* \
++ $(STAGING_DIR)/usr/lib/snort_dynamicengine/
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/lib/snort_dynamicpreprocessor
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/snort_dynamicpreprocessor/* \
++ $(STAGING_DIR)/usr/lib/snort_dynamicpreprocessor/
++endef
++
++define Package/snort/conffiles
++/etc/config/snort
++/etc/snort/snort.conf
++endef
++
++define Package/snort/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/snort \
++ $(1)/usr/bin/snort
++
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/u2{boat,spewfoo} \
++ $(1)/usr/bin
++
++ $(INSTALL_DIR) $(1)/usr/lib/snort_dynamicengine
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/snort_dynamicengine/libsf_engine.so* \
++ $(1)/usr/lib/snort_dynamicengine/
++
++ $(INSTALL_DIR) $(1)/usr/lib/snort_dynamicpreprocessor
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/snort_dynamicpreprocessor/libsf*.so* \
++ $(1)/usr/lib/snort_dynamicpreprocessor/
++
++ $(INSTALL_DIR) $(1)/etc/snort
++ $(INSTALL_CONF) \
++ $(PKG_BUILD_DIR)/etc/snort.conf \
++ $(1)/etc/snort/
++ $(INSTALL_CONF) \
++ $(PKG_BUILD_DIR)/etc/attribute_table.dtd \
++ $(1)/etc/snort/
++ $(INSTALL_CONF) \
++ $(PKG_BUILD_DIR)/etc/classification.config \
++ $(1)/etc/snort/
++ $(INSTALL_CONF) \
++ $(PKG_BUILD_DIR)/etc/gen-msg.map \
++ $(1)/etc/snort/
++ $(INSTALL_CONF) \
++ $(PKG_BUILD_DIR)/etc/reference.config \
++ $(1)/etc/snort/
++ $(INSTALL_CONF) \
++ $(PKG_BUILD_DIR)/etc/unicode.map \
++ $(1)/etc/snort/
++
++ $(INSTALL_DIR) $(1)/etc/snort/preproc_rules
++ $(INSTALL_CONF) \
++ $(PKG_BUILD_DIR)/preproc_rules/*.rules \
++ $(1)/etc/snort/preproc_rules/
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) \
++ ./files/snort.init \
++ $(1)/etc/init.d/snort
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) \
++ ./files/snort.config \
++ $(1)/etc/config/snort
++endef
++
++$(eval $(call BuildPackage,snort))
++
+diff --git a/feeds/packages/net/snort/files/snort.config b/feeds/packages/net/snort/files/snort.config
+new file mode 100644
+index 0000000..cda7441
+--- /dev/null
++++ b/feeds/packages/net/snort/files/snort.config
+@@ -0,0 +1,3 @@
++config snort 'snort'
++ option config_file '/etc/snort/snort.conf'
++ option interface 'lo'
+diff --git a/feeds/packages/net/snort/files/snort.init b/feeds/packages/net/snort/files/snort.init
+new file mode 100644
+index 0000000..fcdb090
+--- /dev/null
++++ b/feeds/packages/net/snort/files/snort.init
+@@ -0,0 +1,40 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=90
++STOP=10
++
++USE_PROCD=1
++PROG=/usr/bin/snort
++
++validate_snort_section() {
++ uci_validate_section snort snort "${1}" \
++ 'config_file:string' \
++ 'interface:string'
++}
++
++start_service() {
++ local config_file interface
++
++ validate_snort_section snort || {
++ echo "validation failed"
++ return 1
++ }
++
++ procd_open_instance
++ procd_set_param command $PROG "-q" "--daq-dir" "/usr/lib/daq/" "-i" "$interface" "-s" "-N"
++ procd_set_param file $CONFIGFILE
++ procd_set_param respawn
++ procd_close_instance
++}
++
++stop_service()
++{
++ service_stop ${PROG}
++}
++
++service_triggers()
++{
++ procd_add_reload_trigger "snort"
++ procd_add_validation validate_snort_section
++}
+diff --git a/feeds/packages/net/snort/patches/001-compile.patch b/feeds/packages/net/snort/patches/001-compile.patch
+new file mode 100644
+index 0000000..06d283a
+--- /dev/null
++++ b/feeds/packages/net/snort/patches/001-compile.patch
+@@ -0,0 +1,105 @@
++--- /dev/null
+++++ b/acinclude.m4
++@@ -0,0 +1 @@
+++sinclude(m4/libprelude.m4)
++--- a/configure.in
+++++ b/configure.in
++@@ -285,21 +285,7 @@ AC_CHECK_TYPES([int8_t,int16_t,int32_t,i
++ AC_CHECK_TYPES([boolean])
++
++ # In case INADDR_NONE is not defined (like on Solaris)
++-have_inaddr_none="no"
++-AC_MSG_CHECKING([for INADDR_NONE])
++-AC_RUN_IFELSE(
++-[AC_LANG_PROGRAM(
++-[[
++-#include <sys/types.h>
++-#include <netinet/in.h>
++-#include <arpa/inet.h>
++-]],
++-[[
++- if (inet_addr("10,5,2") == INADDR_NONE);
++- return 0;
++-]])],
++-[have_inaddr_none="yes"],
++-[have_inaddr_none="no"])
+++have_inaddr_none="yes"
++ AC_MSG_RESULT($have_inaddr_none)
++ if test "x$have_inaddr_none" = "xno"; then
++ AC_DEFINE([INADDR_NONE],[-1],[For INADDR_NONE definition])
++@@ -433,16 +419,7 @@ if test "x$LPCAP" = "xno"; then
++ fi
++
++ AC_MSG_CHECKING([for pcap_lex_destroy])
++-AC_RUN_IFELSE(
++-[AC_LANG_PROGRAM(
++-[[
++-#include <pcap.h>
++-]],
++-[[
++- pcap_lex_destroy();
++-]])],
++-[have_pcap_lex_destroy="yes"],
++-[have_pcap_lex_destroy="no"])
+++have_pcap_lex_destroy="yes"
++ AC_MSG_RESULT($have_pcap_lex_destroy)
++ if test "x$have_pcap_lex_destroy" = "xyes"; then
++ AC_DEFINE([HAVE_PCAP_LEX_DESTROY],[1],[Can cleanup lex buffer stack created by pcap bpf filter])
++@@ -727,54 +704,21 @@ if test "x$ac_cv_func_daq_dp_add_dc" = "
++
++ fi
++
++-AC_MSG_CHECKING([for daq address space ID])
++-AC_RUN_IFELSE(
++-[AC_LANG_PROGRAM(
++-[[
++-#include <daq.h>
++-]],
++-[[
++- DAQ_PktHdr_t hdr;
++- hdr.address_space_id = 0;
++-]])],
++-[have_daq_address_space_id="yes"],
++-[have_daq_address_space_id="no"])
+++have_daq_address_space_id="yes"
++ AC_MSG_RESULT($have_daq_address_space_id)
++ if test "x$have_daq_address_space_id" = "xyes"; then
++ AC_DEFINE([HAVE_DAQ_ADDRESS_SPACE_ID],[1],
++ [DAQ version supports address space ID in header.])
++ fi
++
++-AC_MSG_CHECKING([for daq flow ID])
++-AC_RUN_IFELSE(
++-[AC_LANG_PROGRAM(
++-[[
++-#include <daq.h>
++-]],
++-[[
++- DAQ_PktHdr_t hdr;
++- hdr.flow_id = 0;
++-]])],
++-[have_daq_flow_id="yes"],
++-[have_daq_flow_id="no"])
+++have_daq_flow_id="yes"
++ AC_MSG_RESULT($have_daq_flow_id)
++ if test "x$have_daq_flow_id" = "xyes"; then
++ AC_DEFINE([HAVE_DAQ_FLOW_ID],[1],
++ [DAQ version supports flow ID in header.])
++ fi
++
++-AC_MSG_CHECKING([for DAQ_VERDICT_RETRY])
++-AC_RUN_IFELSE(
++-[AC_LANG_PROGRAM(
++-[[
++-#include <daq.h>
++-]],
++-[[
++- DAQ_Verdict verdict;
++- verdict = DAQ_VERDICT_RETRY;
++-]])],
++-[have_daq_verdict_retry="yes"],
++-[have_daq_verdict_retry="no"])
+++have_daq_verdict_retry="yes"
++ AC_MSG_RESULT($have_daq_verdict_retry)
++ if test "x$have_daq_verdict_retry" = "xyes"; then
++ AC_DEFINE([HAVE_DAQ_VERDICT_RETRY],[1],
+diff --git a/feeds/packages/net/snort/patches/100-autoconf-fixes.patch b/feeds/packages/net/snort/patches/100-autoconf-fixes.patch
+new file mode 100644
+index 0000000..414c0c1
+--- /dev/null
++++ b/feeds/packages/net/snort/patches/100-autoconf-fixes.patch
+@@ -0,0 +1,17 @@
++--- a/configure.in
+++++ b/configure.in
++@@ -11,14 +11,6 @@ AM_INIT_AUTOMAKE(snort,2.9.7.2)
++ NO_OPTIMIZE="no"
++ ADD_WERROR="no"
++
++-# Test for -Werror and sed it out for now since some of the auto tests,
++-# for example AC_CHECK_LIB, will fail because of
++-# warning: conflicting types for built-in function <func>
++-if eval "echo $CFLAGS | grep -e -Werror"; then
++- CFLAGS=`echo $CFLAGS | sed -e "s/-Werror//g"`
++- ADD_WERROR="yes"
++-fi
++-
++ # Disable annoying practice of recursively re-running the autotools
++ AM_MAINTAINER_MODE
++ AC_PROG_CC_STDC
+diff --git a/feeds/packages/net/socat/Makefile b/feeds/packages/net/socat/Makefile
+new file mode 100644
+index 0000000..b89ffca
+--- /dev/null
++++ b/feeds/packages/net/socat/Makefile
+@@ -0,0 +1,81 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=socat
++PKG_VERSION:=1.7.3.0
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.dest-unreach.org/socat/download
++PKG_MD5SUM:=b607edb65bc6c57f4a43f06247504274
++
++PKG_MAINTAINER:= Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=GPL-2.0 OpenSSL
++PKG_LICENSE_FILES:=COPYING COPYING.OpenSSL
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/socat
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libpthread +librt +SOCAT_SSL:libopenssl
++ TITLE:=A multipurpose relay (SOcket CAT)
++ URL:=http://www.dest-unreach.org/socat/
++endef
++
++define Package/socat/description
++ SoCat (for SOcket CAT) establishes two bidirectional byte streams and
++ transfers data between them.
++ Data channels may be files, pipes, devices (terminal or modem, etc.), or
++ sockets (Unix, IPv4, IPv6, raw, UDP, TCP, SSL). It provides forking,
++ logging and tracing, different modes for interprocess communication and
++ many more options.
++endef
++
++define Package/socat/config
++config SOCAT_SSL
++ bool "SSL support"
++ depends on PACKAGE_socat
++ default n
++ help
++ Implements SSL support in socat (using libopenssl).
++endef
++
++define Package/socat/conffiles
++/etc/config/socat
++endef
++
++CONFIGURE_ARGS += \
++ --disable-libwrap \
++ --disable-readline \
++ --enable-termios
++
++ifneq ($(CONFIG_SOCAT_SSL),y)
++ CONFIGURE_ARGS+= --disable-openssl
++endif
++
++CONFIGURE_VARS += \
++ sc_cv_termios_ispeed="no" \
++ sc_cv_sys_crdly_shift=9 \
++ sc_cv_sys_tabdly_shift=11 \
++ sc_cv_sys_csize_shift=4
++
++define Package/socat/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/socat $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/socat.config $(1)/etc/config/socat
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/socat.init $(1)/etc/init.d/socat
++endef
++
++$(eval $(call BuildPackage,socat))
+diff --git a/feeds/packages/net/socat/files/socat.config b/feeds/packages/net/socat/files/socat.config
+new file mode 100644
+index 0000000..7df6358
+--- /dev/null
++++ b/feeds/packages/net/socat/files/socat.config
+@@ -0,0 +1,5 @@
++# forward port 8000 on IPv6 to IPv4 host port 80
++# change enable to '1' to use this example
++config socat 'http'
++ option enable '0'
++ option SocatOptions '-d -d TCP6-LISTEN:8000,fork TCP4:192.168.1.20:80'
+diff --git a/feeds/packages/net/socat/files/socat.init b/feeds/packages/net/socat/files/socat.init
+new file mode 100644
+index 0000000..379dc07
+--- /dev/null
++++ b/feeds/packages/net/socat/files/socat.init
+@@ -0,0 +1,39 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008-2014 OpenWrt.org
++
++START=99
++STOP=99
++
++USE_PROCD=1
++PROG=/usr/bin/socat
++NAME=socat
++
++validate_section_socat()
++{
++ uci_validate_section socat socat "${1}" \
++ 'enable:bool:1' \
++ 'SocatOptions:string'
++ return $?
++}
++
++socat_instance()
++{
++ local SocatOptions enable
++
++ validate_section_socat "${1}" || {
++ echo "validation failed"
++ return 1
++ }
++
++ [ "${enable}" = "0" ] && return 1
++
++ procd_open_instance
++ procd_set_param command "$PROG"
++ procd_append_param command ${SocatOptions}
++ procd_close_instance
++}
++
++start_service () {
++ config_load "${NAME}"
++ config_foreach socat_instance socat
++}
+diff --git a/feeds/packages/net/socat/patches/100-musl-compat.patch b/feeds/packages/net/socat/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..ae5c8d0
+--- /dev/null
++++ b/feeds/packages/net/socat/patches/100-musl-compat.patch
+@@ -0,0 +1,23 @@
++--- a/sysincludes.h
+++++ b/sysincludes.h
++@@ -79,6 +79,9 @@
++ #endif
++ #if HAVE_NETDB_H && (_WITH_IP4 || _WITH_IP6)
++ #include <netdb.h> /* struct hostent, gethostbyname() */
+++#if !(__UCLIBC__ || __GLIBC__)
+++#define NETDB_INTERNAL -1
+++#endif
++ #endif
++ #if HAVE_SYS_UN_H && WITH_UNIX
++ #include <sys/un.h> /* struct sockaddr_un, unix domain sockets */
++@@ -139,8 +142,10 @@
++ #include <netpacket/packet.h>
++ #endif
++ #if HAVE_NETINET_IF_ETHER_H
+++#if defined(__UCLIBC__) || defined(__GLIBC__)
++ #include <netinet/if_ether.h>
++ #endif
+++#endif
++ #if HAVE_LINUX_IF_TUN_H
++ #include <linux/if_tun.h>
++ #endif
+diff --git a/feeds/packages/net/softflowd/Makefile b/feeds/packages/net/softflowd/Makefile
+new file mode 100644
+index 0000000..a908d31
+--- /dev/null
++++ b/feeds/packages/net/softflowd/Makefile
+@@ -0,0 +1,54 @@
++#
++# Copyright (C) 2007-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=softflowd
++PKG_VERSION:=0.9.9
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://softflowd.googlecode.com/files/
++PKG_MD5SUM:=ba83e2715e6250e6645ebcaa9ae1009d
++PKG_MAINTAINER:=Ross Vandegrift <ross@kallisti.us>
++PKG_LICENSE:=BSD-3-Clause
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/softflowd
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libpcap
++ TITLE:=softflowd
++ URL:=http://code.google.com/p/softflowd/
++endef
++
++define Package/softflowd/description
++ Software netflow exporter
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) DESTDIR="$(PKG_INSTALL_DIR)" softflowd softflowctl
++endef
++
++define Package/softflowd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/softflowd $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/softflowctl $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/$(PKG_NAME).config $(1)/etc/config/$(PKG_NAME)
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/$(PKG_NAME).init $(1)/etc/init.d/$(PKG_NAME)
++endef
++
++define Package/softflowd/conffiles
++/etc/config/softflowd
++endef
++
++$(eval $(call BuildPackage,softflowd))
+diff --git a/feeds/packages/net/softflowd/files/softflowd.config b/feeds/packages/net/softflowd/files/softflowd.config
+new file mode 100644
+index 0000000..61a2ee4
+--- /dev/null
++++ b/feeds/packages/net/softflowd/files/softflowd.config
+@@ -0,0 +1,14 @@
++config softflowd
++ option enabled '0'
++ option interface 'br-lan'
++ option pcap_file ''
++ option timeout ''
++ option max_flows '8192'
++ option host_port ''
++ option pid_file '/var/run/softflowd.pid'
++ option control_socket '/var/run/softflowd.ctl'
++ option export_version '5'
++ option hoplimit ''
++ option tracking_level 'full'
++ option track_ipv6 '0'
++ option sampling_rate '100'
+diff --git a/feeds/packages/net/softflowd/files/softflowd.init b/feeds/packages/net/softflowd/files/softflowd.init
+new file mode 100755
+index 0000000..a4956c3
+--- /dev/null
++++ b/feeds/packages/net/softflowd/files/softflowd.init
+@@ -0,0 +1,74 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007-2011 OpenWrt.org
++
++START=50
++
++append_bool() {
++ local section="$1"
++ local option="$2"
++ local value="$3"
++ local _val
++ config_get_bool _val "$section" "$option" '0'
++ [ "$_val" -gt 0 ] && append args "$3"
++}
++
++append_string() {
++ local section="$1"
++ local option="$2"
++ local value="$3"
++ local _val
++ config_get _val "$section" "$option"
++ [ -n "$_val" ] && append args "$3 $_val"
++}
++
++start_instance() {
++ local section="$1"
++
++ config_get_bool enabled "$section" 'enabled' '0'
++ [ $enabled -gt 0 ] || return 1
++
++ config_get pid_file "$section" 'pid_file'
++
++ args=""
++ append_string "$section" 'interface' '-i'
++ append_string "$section" 'pcap_file' '-r'
++ append_string "$section" 'timeout' '-t'
++ append_string "$section" 'max_flows' '-m'
++ append_string "$section" 'host_port' '-n'
++ append_string "$section" 'pid_file' '-p'
++ append_string "$section" 'control_socket' '-c'
++ append_string "$section" 'export_version' '-v'
++ append_string "$section" 'hoplimit' '-L'
++ append_string "$section" 'tracking_level' '-T'
++ append_string "$section" 'sampling_rate' '-s'
++ append_bool "$section" track_ipv6 '-6'
++
++ SERVICE_PID_FILE="$pid_file" \
++ service_start /usr/sbin/softflowd $args${pid_file:+ -p $pid_file}
++}
++
++stop_instance() {
++ local section="$1"
++
++ config_get_bool enabled "$section" 'enabled' '0'
++ [ $enabled -gt 0 ] || return 1
++
++ config_get control_socket "$section" 'control_socket'
++
++ [ -n "control_socket" -a -S $control_socket ] && {
++ /usr/sbin/softflowctl -c $control_socket exit
++ }
++}
++
++start() {
++ mkdir -m 0755 -p /var/empty
++
++ config_load 'softflowd'
++ config_foreach start_instance 'softflowd'
++}
++
++stop() {
++ config_load 'softflowd'
++ config_foreach stop_instance 'softflowd'
++ service_stop /usr/sbin/softflowd
++}
+diff --git a/feeds/packages/net/spawn-fcgi/Makefile b/feeds/packages/net/spawn-fcgi/Makefile
+new file mode 100644
+index 0000000..54c9ab7
+--- /dev/null
++++ b/feeds/packages/net/spawn-fcgi/Makefile
+@@ -0,0 +1,42 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=spawn-fcgi
++PKG_VERSION:=1.6.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://download.lighttpd.net/spawn-fcgi/releases-1.6.x/
++PKG_MD5SUM:=a67c098a50cd625fd12adf61b5dd4c32
++
++PKG_LICENSE:=BSD-3c
++PKG_LICENSE_FILES:=COPYING
++
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/spawn-fcgi
++ SUBMENU:=Web Servers/Proxies
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Tool to spawn fastcgi applications
++ URL:=http://redmine.lighttpd.net/projects/spawn-fcgi
++endef
++
++define Package/spawn-fcgi/description
++ spawn-fcgi is used to spawn fastcgi applications
++endef
++
++define Package/spawn-fcgi/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/spawn-fcgi $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,spawn-fcgi))
+diff --git a/feeds/packages/net/sqm-scripts/Makefile b/feeds/packages/net/sqm-scripts/Makefile
+new file mode 100644
+index 0000000..a71a6a9
+--- /dev/null
++++ b/feeds/packages/net/sqm-scripts/Makefile
+@@ -0,0 +1,87 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sqm-scripts
++PKG_SOURCE_VERSION:=b761c3d39fadd6b868e9417595ba4260c047bcd2
++PKG_VERSION:=1.0.4
++PKG_RELEASE:=1
++PKG_LICENSE:=GPLv2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE).tar.xz
++PKG_SOURCE_URL:=git://github.com/tohojo/sqm-scripts.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/sqm-scripts
++ SECTION:=net
++ CATEGORY:=Base system
++ DEPENDS:=+tc +kmod-sched +kmod-ifb iptables +ip \
++ +iptables-mod-ipopt +iptables-mod-conntrack-extra
++ TITLE:=SQM Scripts (QoS)
++ PKGARCH:=all
++ MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
++endef
++
++define Package/sqm-scripts/description
++ A set of scripts that does simple SQM configuration.
++endef
++
++define Package/sqm-scripts/conffiles
++/etc/config/sqm
++/etc/sqm/sqm.conf
++endef
++
++define Package/sqm-scripts/install
++ make -C $(PKG_BUILD_DIR) DESTDIR=$(1) PLATFORM=openwrt install
++endef
++
++define Package/luci-app-sqm
++ SECTION:=luci
++ CATEGORY:=LuCI
++ TITLE:=SQM Scripts - LuCI interface
++ MAINTAINER:=Toke Høiland-Jørgensen <toke@toke.dk>
++ PKGARCH:=all
++ DEPENDS:= lua luci-base +sqm-scripts
++ SUBMENU:=3. Applications
++endef
++
++define Package/luci-app-sqm/description
++ Control the simple_qos SQM script
++endef
++
++define Package/luci-app-sqm/install
++ make -C $(PKG_BUILD_DIR) DESTDIR=$(1) PLATFORM=openwrt install-luci
++endef
++
++define Package/luci-app-sqm/postinst
++#!/bin/sh
++which uci > /dev/null || exit 0
++uci -q get ucitrack.@sqm[0] > /dev/null || {
++ uci add ucitrack sqm > /dev/null
++ uci set ucitrack.@sqm[0].init=sqm
++ uci add_list ucitrack.@firewall[0].affects=sqm
++ uci commit
++}
++endef
++
++define Package/luci-app-sqm/postrm
++#!/bin/sh
++which uci > /dev/null || exit 0
++uci -q get ucitrack.@sqm[0] > /dev/null && {
++ uci delete ucitrack.@sqm[0]
++ uci del_list ucitrack.@firewall[0].affects=sqm
++ uci commit
++}
++endef
++
++$(eval $(call BuildPackage,sqm-scripts))
++$(eval $(call BuildPackage,luci-app-sqm))
+diff --git a/feeds/packages/net/squid/Makefile b/feeds/packages/net/squid/Makefile
+new file mode 100644
+index 0000000..38c1cd7
+--- /dev/null
++++ b/feeds/packages/net/squid/Makefile
+@@ -0,0 +1,133 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=squid
++PKG_VERSION:=3.5.9
++PKG_RELEASE:=1
++
++PKG_LICENSE:=GPL-2.0
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.squid-cache.org/Versions/v3/3.5/
++PKG_MD5SUM:=fe7306a90a0ba2fc906e9a8c741cc8ea
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/squid/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Web Servers/Proxies
++ URL:=http://www.squid-cache.org/
++endef
++
++define Package/squid
++ $(call Package/squid/Default)
++ MENU:=1
++ DEPENDS:=+libopenssl +libpthread +librt +libltdl +libstdcpp
++ TITLE:=full-featured Web proxy cache
++endef
++
++define Package/squid/description
++ Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more.
++ It reduces bandwidth and improves response times by caching and reusing
++ frequently-requested web pages.
++endef
++
++define Package/squid-mod-cachemgr
++ $(call Package/squid/Default)
++ DEPENDS:=squid
++ TITLE:=Web based proxy manager and reporting tool
++endef
++
++CONFIGURE_ARGS += \
++ --config-cache \
++ --datadir=/usr/share/squid \
++ --libexecdir=/usr/lib/squid \
++ --sysconfdir=/etc/squid \
++ --enable-shared \
++ --disable-static \
++ --enable-icmp \
++ --enable-delay-pools \
++ --enable-icap-client \
++ --enable-kill-parent-hack \
++ --disable-snmp \
++ --enable-ssl \
++ --enable-ssl-crtd \
++ --enable-cache-digests \
++ --enable-linux-netfilter \
++ --disable-unlinkd \
++ --enable-x-accelerator-vary \
++ --disable-translation \
++ --disable-auto-locale \
++ --with-dl \
++ --with-pthreads \
++ --without-expat \
++ --without-libxml2 \
++ --without-gnutls \
++ --without-nettle \
++ --with-openssl=$(STAGING_DIR)/usr \
++ --enable-epoll \
++ --with-maxfd=4096 \
++ --disable-external-acl-helpers \
++ --disable-auth-negotiate \
++ --disable-auth-ntlm \
++ --disable-auth-digest \
++ --disable-auth-basic \
++ --disable-arch-native \
++ --with-krb5-config=no \
++ --without-libcap \
++ --without-netfilter-conntrack
++
++CONFIGURE_VARS += \
++ ac_cv_header_linux_netfilter_ipv4_h=yes \
++ ac_cv_epoll_works=yes \
++ squid_cv_gnu_atomics=no
++
++define Build/Compile
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/lib all
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ install
++endef
++
++define Package/squid/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/squid $(1)/usr/sbin/
++
++ $(INSTALL_DIR) $(1)/usr/lib/squid
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/squid/ssl_crtd $(1)/usr/lib/squid
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/squid.config $(1)/etc/config/squid
++
++ $(INSTALL_DIR) $(1)/etc/squid
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/squid/mime.conf $(1)/etc/squid/
++ $(INSTALL_CONF) ./files/squid.conf $(1)/etc/squid/
++
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) ./files/squid.init $(1)/etc/init.d/squid
++
++ $(INSTALL_DIR) $(1)/usr/share/squid/icons/
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/squid/icons/* $(1)/usr/share/squid/icons/
++
++ $(INSTALL_DIR) $(1)/usr/share/squid/errors/templates/
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/squid/errors/templates/* $(1)/usr/share/squid/errors/templates/
++endef
++
++define Package/squid-mod-cachemgr/install
++ $(INSTALL_DIR) $(1)/www/cgi-bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/squid/cachemgr.cgi $(1)/www/cgi-bin/
++endef
++
++$(eval $(call BuildPackage,squid))
++$(eval $(call BuildPackage,squid-mod-cachemgr))
+diff --git a/feeds/packages/net/squid/files/squid.conf b/feeds/packages/net/squid/files/squid.conf
+new file mode 100644
+index 0000000..9535c1d
+--- /dev/null
++++ b/feeds/packages/net/squid/files/squid.conf
+@@ -0,0 +1,44 @@
++acl localnet src 10.0.0.0/8
++acl localnet src 172.16.0.0/12
++acl localnet src 192.168.0.0/16
++acl localnet src fc00::/7
++acl localnet src fe80::/10
++
++acl ssl_ports port 443
++
++acl safe_ports port 80
++acl safe_ports port 21
++acl safe_ports port 443
++acl safe_ports port 70
++acl safe_ports port 210
++acl safe_ports port 1025-65535
++acl safe_ports port 280
++acl safe_ports port 488
++acl safe_ports port 591
++acl safe_ports port 777
++acl connect method connect
++
++http_access deny !safe_ports
++http_access deny connect !ssl_ports
++
++http_access allow localhost manager
++http_access deny manager
++
++http_access deny to_localhost
++
++http_access allow localnet
++http_access allow localhost
++
++http_access deny all
++
++refresh_pattern ^ftp: 1440 20% 10080
++refresh_pattern ^gopher: 1440 0% 1440
++refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
++refresh_pattern . 0 20% 4320
++
++access_log none
++cache_log /dev/null
++cache_store_log stdio:/dev/null
++logfile_rotate 0
++
++logfile_daemon /dev/null
+diff --git a/feeds/packages/net/squid/files/squid.config b/feeds/packages/net/squid/files/squid.config
+new file mode 100644
+index 0000000..e781860
+--- /dev/null
++++ b/feeds/packages/net/squid/files/squid.config
+@@ -0,0 +1,8 @@
++config squid 'squid'
++ option config_file '/etc/squid/squid.conf'
++ option http_port '3128'
++ option coredump_dir '/tmp/squid'
++ option visible_hostname 'OpenWrt'
++ #option http_port_options 'intercept'
++ #option ssldb '/tmp/squid/ssldb'
++ #option ssldb_options '-M 4MB'
+diff --git a/feeds/packages/net/squid/files/squid.init b/feeds/packages/net/squid/files/squid.init
+new file mode 100644
+index 0000000..76ec756
+--- /dev/null
++++ b/feeds/packages/net/squid/files/squid.init
+@@ -0,0 +1,60 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=90
++STOP=10
++
++USE_PROCD=1
++PROG=/usr/sbin/squid
++CONFIGFILE="/tmp/squid/squid.conf"
++
++validate_squid_section() {
++ uci_validate_section squid squid "${1}" \
++ 'config_file:string' \
++ 'http_port:port:3128' \
++ 'http_port_options:string' \
++ 'ssldb:string' \
++ 'ssldb_options:string' \
++ 'coredump_dir:string' \
++ 'visible_hostname:string:OpenWrt' \
++ 'pinger_enable:string:off'
++}
++
++start_service() {
++ local config_file http_port http_port_options ssldb ssldb_options coredump_dir visible_hostname pinger_enable
++
++ validate_squid_section squid || {
++ echo "validation failed"
++ return 1
++ }
++
++ config_dir=$(dirname $CONFIGFILE)
++ [ -d $config_dir ] || mkdir -p $config_dir && chown nobody:nogroup $config_dir
++ [ -d $coredump_dir ] || mkdir -p $coredump_dir && chown nobody:nogroup $coredump_dir
++ [ "$ssldb" ] && ( [ -f "$ssldb"/size ] || /usr/lib/squid/ssl_crtd -c -s $ssldb && chown -R nobody:nogroup $ssldb )
++
++ cat $config_file > $CONFIGFILE
++ echo http_port $http_port $http_port_options >> $CONFIGFILE
++ echo coredump_dir $coredump_dir >> $CONFIGFILE
++ echo visible_hostname $visible_hostname >> $CONFIGFILE
++ echo pinger_enable $pinger_enable >> $CONFIGFILE
++ [ "$ssldb" ] && echo sslcrtd_program /usr/lib/squid/ssl_crtd -s $ssldb $ssldb_options >> $CONFIGFILE
++ $PROG -s -f $CONFIGFILE -N -z 2>/dev/null
++
++ procd_open_instance
++ procd_set_param command $PROG -s -f $CONFIGFILE -N
++ procd_set_param file $CONFIGFILE
++ procd_set_param respawn
++ procd_close_instance
++}
++
++stop_service()
++{
++ ${PROG} -f $CONFIGFILE -N -k shutdown 2>/dev/null
++}
++
++service_triggers()
++{
++ procd_add_reload_trigger "squid"
++ procd_add_validation validate_squid_section
++}
+diff --git a/feeds/packages/net/squid/patches/001-cross_compile.patch b/feeds/packages/net/squid/patches/001-cross_compile.patch
+new file mode 100644
+index 0000000..c7493bb
+--- /dev/null
++++ b/feeds/packages/net/squid/patches/001-cross_compile.patch
+@@ -0,0 +1,24 @@
++--- a/src/Makefile.in
+++++ b/src/Makefile.in
++@@ -7761,3 +7761,3 @@ cache_cf.o: cf_parser.cci
++ cf_gen$(EXEEXT): $(cf_gen_SOURCES) $(cf_gen_DEPENDENCIES) cf_gen_defines.cci
++- $(BUILDCXX) $(BUILDCXXFLAGS) -o $@ $(srcdir)/cf_gen.cc -I$(srcdir) -I$(top_builddir)/include/ -I$(top_builddir)/src
+++ g++ -o $@ $(srcdir)/cf_gen.cc -I$(srcdir) -I$(top_builddir)/include/ -I$(top_builddir)/src
++
++--- a/configure
+++++ b/configure
++@@ -20133,3 +20133,3 @@ if test "$cross_compiling" = yes; then :
++ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++-as_fn_error $? "cannot run test program while cross compiling
+++_as_fn_error $? "cannot run test program while cross compiling
++ See \`config.log' for more details" "$LINENO" 5; }
++@@ -28289,3 +28289,3 @@ else
++ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++-as_fn_error $? "cannot run test program while cross compiling
+++_as_fn_error $? "cannot run test program while cross compiling
++ See \`config.log' for more details" "$LINENO" 5; }
++@@ -28314,3 +28314,3 @@ else
++ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
++-as_fn_error $? "cannot run test program while cross compiling
+++_as_fn_error $? "cannot run test program while cross compiling
++ See \`config.log' for more details" "$LINENO" 5; }
+diff --git a/feeds/packages/net/squid/patches/100-mime.patch b/feeds/packages/net/squid/patches/100-mime.patch
+new file mode 100644
+index 0000000..1138a41
+--- /dev/null
++++ b/feeds/packages/net/squid/patches/100-mime.patch
+@@ -0,0 +1,30 @@
++--- a/src/mime.conf.default
+++++ b/src/mime.conf.default
++@@ -1,20 +1,3 @@
++-## Copyright (C) 1996-2015 The Squid Software Foundation and contributors
++-##
++-## Squid software is distributed under GPLv2+ license and includes
++-## contributions from numerous individuals and organizations.
++-## Please see the COPYING and CONTRIBUTORS files for details.
++-##
++-#
++-# This file associates URL patterns for servers or services
++-# that don't automatically include Content-Type (like ftp) with a mime type
++-# and a graphical icon.
++-#
++-# Content-Encodings are taken from section 3.1 of RFC2068 (HTTP/1.1)
++-#
++-# This file has the format :
++-#
++-# regexp content-type icon encoding mode actions
++-#--------------------------------------------------------------------------------------------------------
++ \.gif$ image/gif silk/image.png - image +download
++ \.mime$ www/mime silk/page_white_text.png - ascii +download
++ ^internal-dirup$ - silk/arrow_up.png - -
++@@ -191,6 +174,4 @@ README text/plain silk/information.pn
++ \.xml$ text/xml silk/page_world.png - ascii +download
++ \.xsl$ text/xml silk/layout.png - ascii +download
++ \.xyz$ chemical/x-xyz silk/chart_line.png - image +download
++-#
++-# the default
++ . text/plain silk/bullet_red.png - image +download +view
+diff --git a/feeds/packages/net/sshfs/Makefile b/feeds/packages/net/sshfs/Makefile
+new file mode 100644
+index 0000000..d99dd92
+--- /dev/null
++++ b/feeds/packages/net/sshfs/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sshfs
++PKG_VERSION:=2.5
++PKG_RELEASE:=1
++
++PKG_LICENSE:=GPL-2.0
++PKG_MAINTAINER:=Zoltan HERPAI <wigyori@uid0.hu>
++
++PKG_SOURCE:=$(PKG_NAME)-fuse-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/fuse
++PKG_MD5SUM:=17494910db8383a366b1301e5f5148a9
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-fuse-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/sshfs
++ TITLE:=SSHFS
++ DEPENDS:=+libfuse +fuse-utils +glib2 +libpthread
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Filesystem
++ URL:=http://fuse.sourceforge.net/
++endef
++
++define Package/sshfs/description
++ Mount remote system over sftp.
++endef
++
++CONFIGURE_VARS += \
++ SSHFS_CFLAGS=" \
++ -D_FILE_OFFSET_BITS=64 \
++ -I$(STAGING_DIR)/usr/include/glib-2.0 \
++ -I$(STAGING_DIR)/usr/lib/glib-2.0/include \
++ -I$(STAGING_DIR)/usr/include/fuse" \
++ SSHFS_LIBS=" \
++ -lglib-2.0 -liconv $(if $(INTL_FULL),-lintl) -lfuse -pthread -lgthread-2.0 \
++ -L$(STAGING_DIR)/usr/lib"
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ ARCH="$(LINUX_KARCH)" \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install
++endef
++
++define Package/sshfs/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sshfs $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,sshfs))
+diff --git a/feeds/packages/net/sshtunnel/Makefile b/feeds/packages/net/sshtunnel/Makefile
+new file mode 100644
+index 0000000..48cdb79
+--- /dev/null
++++ b/feeds/packages/net/sshtunnel/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++# Copyright (C) 2010 segal.di.ubi.pt
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sshtunnel
++PKG_VERSION:=3
++PKG_RELEASE:=3
++PKG_LICENSE:=GPL-2.0+
++
++PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/sshtunnel
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=SSH
++ TITLE:=Manages Local and Remote openssh ssh(1) tunnels
++ DEPENDS:=+openssh-client
++endef
++
++define Package/sshtunnel/description
++Creates openssh ssh(1) Local and Remote tunnels configured in UCI file. Can be used to allow remote connections, possibly over NATed connections or without public IP/DNS
++endef
++
++define Package/sshtunnel/conffiles
++/etc/config/sshtunnel
++endef
++
++define Build/Compile
++endef
++
++define Package/sshtunnel/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/sshtunnel.init $(1)/etc/init.d/sshtunnel
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) ./files/sshtunnel.sh $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/uci_sshtunnel $(1)/etc/config/sshtunnel
++endef
++
++$(eval $(call BuildPackage,sshtunnel))
+diff --git a/feeds/packages/net/sshtunnel/files/sshtunnel.init b/feeds/packages/net/sshtunnel/files/sshtunnel.init
+new file mode 100644
+index 0000000..482ec67
+--- /dev/null
++++ b/feeds/packages/net/sshtunnel/files/sshtunnel.init
+@@ -0,0 +1,202 @@
++#!/bin/sh /etc/rc.common
++
++START=99
++STOP=01
++
++PIDFILE="/tmp/run/sshtunnel"
++
++
++append_params() {
++ local p; local v; local args;
++ for p in $*; do
++ eval "v=\$$p"
++ [ -n "$v" ] && args="$args -o $p=$v"
++ done
++
++ ARGS_options="${args# *}"
++}
++
++append_string() {
++ local varname="$1"; local add="$2"; local separator="${3:- }"; local actual
++ eval "actual=\$$varname"
++
++ new="${actual:+$actual$separator}$add"
++ eval "$varname=\$new"
++}
++
++load_tunnelR() {
++ config_get section_server $1 server
++ [ "$server" = "$section_server" ] || return 0 # continue to read next section if this is not for the current server
++ let count++ # count nr of valid sections to make sure there are at least one
++
++ config_get remoteaddress $1 remoteaddress "*"
++ config_get remoteport $1 remoteport
++ config_get localaddress $1 localaddress
++ config_get localport $1 localport
++
++ [ "$remoteport" -gt 0 ] || append_string "error" "[tunnelR: $1]remoteport must be a positive integer" "; "
++ [ "$localport" -gt 0 ] || append_string "error" "[tunnelR: $1]localport must be a positive integer" "; "
++ [ -n "$error" ] && return 1
++
++ append_string "ARGS_tunnels" "-R $remoteaddress:$remoteport:$localaddress:$localport"
++}
++
++load_tunnelL() {
++ config_get section_server $1 server
++ [ "$server" = "$section_server" ] || return 0 # continue to read next section if this is not for the current server
++ let count++ # count nr of valid sections to make sure there are at least one
++
++ config_get localaddress $1 localaddress "*"
++ config_get localport $1 localport
++ config_get remoteaddress $1 remoteaddress
++ config_get remoteport $1 remoteport
++
++ [ "$remoteport" -gt 0 ] || append_string "error" "[tunnelL: $1]remoteport must be a positive integer" "; "
++ [ "$localport" -gt 0 ] || append_string "error" "[tunnelL: $1]localport must be a positive integer" "; "
++ [ -n "$error" ] && return 1
++
++ append_string "ARGS_tunnels" "-L $localaddress:$localport:$remoteaddress:$remoteport"
++}
++
++load_tunnelD() {
++ config_get section_server $1 server
++ [ "$server" = "$section_server" ] || return 0 # continue to read next section if this is not for the current server
++ let count++ # count nr of valid sections to make sure there are at least one
++
++ config_get localaddress $1 localaddress "*"
++ config_get localport $1 localport
++
++ [ "$localport" -gt 0 ] || append_string "error" "[tunnelD: $1]localport must be a positive integer" "; "
++ [ -n "$error" ] && return 1
++
++ append_string "ARGS_tunnels" "-D $localaddress:$localport"
++}
++
++load_tunnelW() {
++ config_get section_server $1 server
++ [ "$server" = "$section_server" ] || return 0 # continue to read next section if this is not for the current server
++ let count++ # count nr of valid sections to make sure there are at least one
++
++ config_get localdev $1 localdev "*"
++ config_get remotedev $1 remotedev "*"
++ config_get vpntype $1 vpntype "*"
++
++ [ "$vpntype" == "ethernet" ] || [ "$vpntype" == "point-to-point" ] || append_string "error" "[tunnelW: $1] vpntype must be \"ethernet\" (tap) or \"pointopoint\" (tun)" "; "
++ [ "$localdev" == "any" ] || [ "$localdev" -ge 0 ] || append_string "error" "[tunnelW: $1] localdev must be an integer or \"any\"" "; "
++ [ "$remotedev" == "any" ] || [ "$remotedev" -ge 0 ] || append_string "error" "[tunnelW: $1] remotedev must be an integer or \"any\"" "; "
++ [ "$user" == "root" ] || logger -p user.warn -t "sshtunnel" "warning: root is required unless the tunnel device has been created manually"
++ [ -n "$error" ] && return 1
++
++ append_string "ARGS_tunnels" "-w $localdev:$remotedev -o Tunnel=$vpntype"
++}
++
++load_server() {
++ server="$1"
++
++ config_get user $1 user
++ config_get hostname $1 hostname
++ config_get port $1 port "22"
++ config_get retrydelay $1 retrydelay "60"
++ config_get PKCS11Provider $1 PKCS11Provider
++ config_get CheckHostIP $1 CheckHostIP
++ config_get Compression $1 Compression
++ config_get CompressionLevel $1 CompressionLevel
++ config_get IdentityFile $1 IdentityFile
++ config_get LogLevel $1 LogLevel
++ config_get ServerAliveCountMax $1 ServerAliveCountMax
++ config_get ServerAliveInterval $1 ServerAliveInterval
++ config_get StrictHostKeyChecking $1 StrictHostKeyChecking
++ config_get TCPKeepAlive $1 TCPKeepAlive
++ config_get VerifyHostKeyDNS $1 VerifyHostKeyDNS
++
++ error=""
++ [ -n "$user" ] \
++ || append_string "error" "user is not set" "; "
++ [ -n "$hostname" ] \
++ || append_string "error" "hostname is not set" "; "
++ [ "$retrydelay" -ge 1 ] \
++ || append_string "error" "retrydelay must be a positive integer" "; "
++ [ -z "$PKCS11Provider" -o -f "$PKCS11Provider" ] \
++ || append_string "error" "PKCS11Provider must be a pkcs11 shared library accessible" "; "
++ [ -z "$CheckHostIP" -o "$CheckHostIP"="yes" -o "$CheckHostIP"="no" ] \
++ || append_string "error" "CheckHostIP must be 'yes' or 'no'" "; "
++ [ -z "$Compression" -o "$Compression"="yes" -o "$Compression"="no" ] \
++ || append_string "error" "Compression must be 'yes' or 'no'" "; "
++ [ -z "$CompressionLevel" ] || [ "$CompressionLevel" -ge 1 -a "$CompressionLevel" -le 9 ] \
++ || append_string "error" "CompressionLevel must be between 1 and 9" "; "
++ [ -z "$IdentityFile" -o -f "$IdentityFile" ] \
++ || append_string "error" "IdentityFile $IdentityFile not accessible" "; "
++ [ -z "$LogLevel" -o "$LogLevel" = "QUIET" -o "$LogLevel" = "FATAL" -o "$LogLevel" = "ERROR" -o \
++ "$LogLevel" = "INFO" -o "$LogLevel" = "VERBOSE" -o "$LogLevel" = "DEBUG" -o \
++ "$LogLevel" = "DEBUG1" -o "$LogLevel" = "DEBUG2" -o "$LogLevel" = "DEBUG3" ] \
++ || append_string "error" "LogLevel is invalid" "; "
++ [ -z "$ServerAliveCountMax" ] || [ "$ServerAliveCountMax" -ge 1 ] \
++ || append_string "error" "ServerAliveCountMax must be greater or equal than 1" "; "
++ [ -z "$ServerAliveInterval" ] || [ "$ServerAliveInterval" -ge 0 ] \
++ || append_string "error" "ServerAliveInterval must be greater or equal than 0" "; "
++ [ -z "$StrictHostKeyChecking" -o "$StrictHostKeyChecking" = "yes" -o "$StrictHostKeyChecking" = "ask" -o "$StrictHostKeyChecking" = "no" ] \
++ || append_string "error" "StrictHostKeyChecking must be 'yes', 'ask' or 'no'" "; "
++ [ -z "$TCPKeepAlive" -o "$TCPKeepAlive" = "yes" -o "$TCPKeepAlive" = "no" ] \
++ || append_string "error" "TCPKeepAlive must be 'yes' or 'no'" "; "
++ [ -z "$VerifyHostKeyDNS" -o "$VerifyHostKeyDNS" = "yes" -o "$VerifyHostKeyDNS" = "no" ] \
++ || append_string "error" "VerifyHostKeyDNS must be 'yes' or 'no'" "; "
++
++ [ -n "$error" ] && { logger -p user.err -t "sshtunnel" "tunnels to $server not started - $error"; return; }
++
++
++ ARGS=""
++ ARGS_options=""
++ ARGS_tunnels=""
++
++ count=0
++ config_foreach load_tunnelR tunnelR && config_foreach load_tunnelL tunnelL && config_foreach load_tunnelD tunnelD
++ [ -n "$error" ] && { logger -p user.err -t "sshtunnel" "tunnels to $server not started - $error"; return; }
++ [ "$count" -eq 0 ] && { logger -p user.err -t "sshtunnel" "tunnels to $server not started - no tunnels defined"; return; }
++
++ append_params CheckHostIP Compression CompressionLevel IdentityFile LogLevel PKCS11Provider ServerAliveCountMax ServerAliveInterval StrictHostKeyChecking TCPKeepAlive VerifyHostKeyDNS
++ ARGS="$ARGS_options -o ExitOnForwardFailure=yes -o BatchMode=yes -nN $ARGS_tunnels -p $port $user@$hostname"
++
++ /usr/bin/sshtunnel.sh "$ARGS" "$retrydelay" "$server" &
++ echo $! >> "${PIDFILE}.pids"
++ logger -p user.info -t "sshtunnel" "started tunnels to $server (pid=$!;retrydelay=$retrydelay)"
++}
++
++stop() {
++ if [ -f "$PIDFILE".pids ]
++ then
++ logger -p user.info -t "sshtunnel" "stopping all tunnels"
++
++ while read pid
++ do
++ kill "$pid" # kill mother process first
++
++ [ -f "${PIDFILE}_${pid}.pid" ] && { # if ssh was running, kill it also (mother process could be in retry wait)
++ start-stop-daemon -K -p "${PIDFILE}_${pid}.pid"
++ rm "${PIDFILE}_${pid}.pid"
++ }
++
++ logger -p daemon.info -t "sshtunnel[$pid]" "tunnel stopped"
++
++ done < "${PIDFILE}.pids"
++
++ rm "${PIDFILE}.pids"
++
++ logger -p user.info -t "sshtunnel" "all tunnels stopped"
++ else
++ logger -p user.info -t "sshtunnel" "no tunnels running"
++ fi
++}
++
++start() {
++ [ -f "${PIDFILE}.pids" ] && stop
++
++ config_load sshtunnel
++ if [ -n "$(uci show sshtunnel.@server[0])" ] # at least one server section exists
++ then
++ logger -p user.info -t "sshtunnel" "starting all tunnels"
++ config_foreach load_server server
++ logger -p user.info -t "sshtunnel" "all tunnels started"
++ else
++ logger -p user.info -t "sshtunnel" "no servers defined"
++ fi
++}
+diff --git a/feeds/packages/net/sshtunnel/files/sshtunnel.sh b/feeds/packages/net/sshtunnel/files/sshtunnel.sh
+new file mode 100644
+index 0000000..0ff18a6
+--- /dev/null
++++ b/feeds/packages/net/sshtunnel/files/sshtunnel.sh
+@@ -0,0 +1,21 @@
++#!/bin/sh
++
++PIDFILE="/tmp/run/sshtunnel"
++
++args="$1"
++retrydelay="$2"
++server="$3"
++
++while true
++do
++ logger -p daemon.info -t "sshtunnel[$$][$server]" "connection started"
++
++ start-stop-daemon -S -p "${PIDFILE}_${$}.pid" -mx ssh -- $args &>/tmp/log/sshtunnel_$$
++
++ logger -p daemon.err -t "sshtunnel[$$][$server]" < /tmp/log/sshtunnel_$$
++ rm /tmp/log/sshtunnel_$$
++ logger -p daemon.info -t "sshtunnel[$$][$server]" "ssh exited with code $?, retrying in $retrydelay seconds"
++ rm "${PIDFILE}_${$}.pid"
++
++ sleep "$retrydelay" & wait
++done
+diff --git a/feeds/packages/net/sshtunnel/files/uci_sshtunnel b/feeds/packages/net/sshtunnel/files/uci_sshtunnel
+new file mode 100644
+index 0000000..52e6881
+--- /dev/null
++++ b/feeds/packages/net/sshtunnel/files/uci_sshtunnel
+@@ -0,0 +1,63 @@
++#
++# password authentication is not possible, public key authentication must be used.
++# set "option IdentityFile" to he file from which the identity (private key) for RSA or DSA authentication is read.
++# The default is ~/.ssh/identity for protocol version 1, and ~/.ssh/id_rsa and ~/.ssh/id_dsa for protocol version 2.
++# ssh will also try to load certificate information from the filename obtained by appending -cert.pub to identity filenames.
++#
++
++#config server disney
++# option user mourinho
++# option hostname server.disney.com
++# option port 22
++# option retrydelay 1
++# option CheckHostIP yes
++# option Compression no
++# option CompressionLevel 6
++# option IdentityFile ~/.ssh/id_rsa
++# option LogLevel INFO
++# option PKCS11Provider /lib/pteidpkcs11.so
++# option ServerAliveCountMax 3
++# option ServerAliveInterval 0
++# option StrictHostKeyChecking ask
++# option TCPKeepAlive yes
++# option VerifyHostKeyDNS yes
++
++# tunnelR(emote) - when the connection will be initiated to the R(emote) endpoint at
++# remoteaddress:remoteport and then forwarded to localaddress:localport
++#
++#config tunnelR http
++# option server disney
++# option remoteaddress *
++# option remoteport 9009
++# option localaddress 192.168.1.13
++# option localport 80
++
++# tunnelL(ocal) - when the connection will be initiated to the L(ocal) endpoint at
++# localaddress:localport and then forwarded to remoteaddress:remoteport
++#
++#config tunnelL test
++# option server disney
++# option localaddress *
++# option localport 1022
++# option remoteaddress secretserver.disney.com
++# option remoteport 22
++
++# tunnelD(ynamic) - when the connection will be initiated with the SOCKS4 or SOCKS5 protocol
++# to the local endpoint at localaddress:localport and then forwarded over the remote host
++#
++#config tunnelD proxy
++# option server disney
++# option localaddress *
++# option localport 4055
++
++# tunnelW - creates TUN/TAP devices on client and server to establish a VPN tunnel between them
++# vpntypes:
++# point-to-point = TUN
++# ethernet = TAP
++#
++#config tunnelW proxy
++# option server disney
++# option vpntype point-to-point|ethernet
++# option localdev any|0|1|2|...
++# option remotedev any|0|1|2|...
++
+diff --git a/feeds/packages/net/sslh/Makefile b/feeds/packages/net/sslh/Makefile
+new file mode 100644
+index 0000000..738b36b
+--- /dev/null
++++ b/feeds/packages/net/sslh/Makefile
+@@ -0,0 +1,54 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sslh
++PKG_VERSION:=v1.17
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://rutschle.net/tech/
++PKG_MD5SUM:=1fc3ada4bafaca5a9786cc1431f48ed4
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/sslh
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE:=SSL/SSH multiplexer
++ URL:=http://rutschle.net/tech/sslh.shtml
++ PKG_MAINTAINER:=Jonathan McCrohan <jmccrohan@gmail.com>
++endef
++
++define Package/sslh/conffiles
++/etc/config/sslh
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ USELIBCONFIG= \
++ USELIBWRAP= \
++ USELIBPCRE= \
++ all
++endef
++
++define Package/sslh/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/sslh-fork $(1)/usr/sbin/sslh
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) files/$(PKG_NAME).init $(1)/etc/init.d/$(PKG_NAME)
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) files/$(PKG_NAME).config $(1)/etc/config/$(PKG_NAME)
++endef
++
++$(eval $(call BuildPackage,sslh))
+diff --git a/feeds/packages/net/sslh/files/sslh.config b/feeds/packages/net/sslh/files/sslh.config
+new file mode 100644
+index 0000000..07ed02b
+--- /dev/null
++++ b/feeds/packages/net/sslh/files/sslh.config
+@@ -0,0 +1,30 @@
++package 'sslh'
++
++config 'sslh' 'default'
++ # disable or enable
++ option 'enable' '1'
++ # listen defaults to '0.0.0.0:443' (all interfaces)
++ # multiple -p arguments may be supplied using a uci list
++ # -p <listenaddr>:<listenport>
++ option 'listen' ''
++ # ssh defaults to 'localhost:22'
++ # --ssh <sshhost>:<sshport>
++ option 'ssh' ''
++ # ssl defaults to 'localhost:443'
++ # --ssl <sslhost>:<sslport>
++ option 'ssl' ''
++ # openvpn defaults to 'localhost:1194'
++ # --openvpn <openvpnhost>:<openvpnport>
++ option 'openvpn' ''
++ # tinc defaults to 'localhost:655'
++ # --tinc <tinchost>:<tincport>
++ option 'tinc' ''
++ # xmpp defaults to 'localhost:5222'
++ # --xmpp <xmpphost>:<xmppport>
++ option 'xmpp' ''
++ # timeout (for ssh, then ssl is assumed) defaults to 2
++ # -t
++ option 'timeout' ''
++ # verbose defaults to off
++ # -v
++ option 'verbose' '0'
+diff --git a/feeds/packages/net/sslh/files/sslh.init b/feeds/packages/net/sslh/files/sslh.init
+new file mode 100644
+index 0000000..f7fc647
+--- /dev/null
++++ b/feeds/packages/net/sslh/files/sslh.init
+@@ -0,0 +1,62 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2012 OpenWrt.org
++
++START=95
++
++# XXX: pid-files are useless because sslh forks after creating them
++SERVICE_USE_PID=
++
++start_instance() {
++ local section="$1"
++
++ # check if section is enabled (default)
++ local enable
++ config_get_bool enable "${section}" 'enable' '0'
++ [ ${enable} -gt 0 ] || return 1
++
++ local args=""
++ local val
++ # A) listen parameter
++ config_get vals "${section}" listen
++ [ -n "${vals}" ] && for val in $vals; do append args "-p${val}"; done
++ # B) ssh parameter
++ config_get val "${section}" ssh
++ [ -n "${val}" ] && append args "--ssh ${val}"
++ # C) ssl parameter
++ config_get val "${section}" ssl
++ [ -n "${val}" ] && append args "--ssl ${val}"
++ # D) openvpn parameter
++ config_get val "${section}" openvpn
++ [ -n "${val}" ] && append args "--openvpn ${val}"
++ # E) tinc parameter
++ config_get val "${section}" tinc
++ [ -n "${val}" ] && append args "--tinc ${val}"
++ # F) xmpp parameter
++ config_get val "${section}" xmpp
++ [ -n "${val}" ] && append args "--xmpp ${val}"
++ # G) timeout (before a connection is considered to be SSH)
++ config_get val "${section}" timeout
++ [ -n "${val}" ] && append args "-t ${val}"
++ # H) verbose parameter
++ local verbosed
++ config_get_bool verbosed "${section}" verbose 0
++ [ "${verbosed}" -ne 0 ] && append args "-v"
++
++ # Defaults were removed for --user and --pidfile options
++ # in sslh 1.11; Define them here instead.
++ append args "--user nobody"
++ append args "--pidfile /var/run/sslh.pid"
++
++ # XXX: allow more that one instance to run simultaneously
++ SERVICE_MATCH_NAME=1 SERVICE_NAME="sslh-dummy-$$" \
++ service_start /usr/sbin/sslh ${args}
++}
++
++start() {
++ config_load 'sslh'
++ config_foreach start_instance 'sslh'
++}
++
++stop() {
++ service_stop /usr/sbin/sslh
++}
+diff --git a/feeds/packages/net/sslh/patches/001-no_sslh_select.patch b/feeds/packages/net/sslh/patches/001-no_sslh_select.patch
+new file mode 100644
+index 0000000..2b461f6
+--- /dev/null
++++ b/feeds/packages/net/sslh/patches/001-no_sslh_select.patch
+@@ -0,0 +1,29 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -45,16 +45,12 @@ all: sslh $(MAN) echosrv
++ version.h:
++ ./genver.sh >version.h
++
++-sslh: sslh-fork sslh-select
+++sslh: sslh-fork
++
++ sslh-fork: version.h $(OBJS) sslh-fork.o Makefile common.h
++ $(CC) $(CFLAGS) $(LDFLAGS) -o sslh-fork sslh-fork.o $(OBJS) $(LIBS)
++ #strip sslh-fork
++
++-sslh-select: version.h $(OBJS) sslh-select.o Makefile common.h
++- $(CC) $(CFLAGS) $(LDFLAGS) -o sslh-select sslh-select.o $(OBJS) $(LIBS)
++- #strip sslh-select
++-
++ echosrv: $(OBJS) echosrv.o
++ $(CC) $(CFLAGS) $(LDFLAGS) -o echosrv echosrv.o probe.o common.o $(LIBS)
++
++@@ -85,7 +81,7 @@ distclean: clean
++ rm -f tags cscope.*
++
++ clean:
++- rm -f sslh-fork sslh-select echosrv version.h $(MAN) *.o *.gcov *.gcno *.gcda *.png *.html *.css *.info
+++ rm -f sslh-fork echosrv version.h $(MAN) *.o *.gcov *.gcno *.gcda *.png *.html *.css *.info
++
++ tags:
++ ctags --globals -T *.[ch]
+diff --git a/feeds/packages/net/sslh/patches/002-no_regex_probes.patch b/feeds/packages/net/sslh/patches/002-no_regex_probes.patch
+new file mode 100644
+index 0000000..130c311
+--- /dev/null
++++ b/feeds/packages/net/sslh/patches/002-no_regex_probes.patch
+@@ -0,0 +1,90 @@
++From 3aefaf300478cd6fbc4892d5baaf70521ed323af Mon Sep 17 00:00:00 2001
++From: Yves Rutschle <git1@rutschle.net>
++Date: Thu, 9 Jul 2015 15:31:42 +0200
++Subject: [PATCH] Added Makefile option to build without libpcre
++
++---
++--- a/Makefile
+++++ b/Makefile
++@@ -2,6 +2,7 @@
++
++ VERSION=$(shell ./genver.sh -r)
++ USELIBCONFIG=1 # Use libconfig? (necessary to use configuration files)
+++USELIBPCRE=1 # Use libpcre? (necessary to use regex probe)
++ USELIBWRAP?= # Use libwrap?
++ USELIBCAP= # Use libcap?
++ COV_TEST= # Perform test coverage?
++@@ -27,6 +28,10 @@ ifneq ($(strip $(USELIBWRAP)),)
++ CPPFLAGS+=-DLIBWRAP
++ endif
++
+++ifneq ($(strip $(USELIBPCRE)),)
+++ CPPFLAGS+=-DLIBPCRE
+++endif
+++
++ ifneq ($(strip $(USELIBCONFIG)),)
++ LIBS:=$(LIBS) -lconfig
++ CPPFLAGS+=-DLIBCONFIG
++--- a/probe.c
+++++ b/probe.c
++@@ -21,7 +21,9 @@
++
++ #define _GNU_SOURCE
++ #include <stdio.h>
+++#ifdef LIBPCRE
++ #include <regex.h>
+++#endif
++ #include <ctype.h>
++ #include "probe.h"
++
++@@ -226,6 +228,7 @@ static int is_tls_protocol(const char *p
++
++ static int regex_probe(const char *p, int len, struct proto *proto)
++ {
+++#ifdef LIBPCRE
++ regex_t **probe = proto->data;
++ regmatch_t pos = { 0, len };
++
++@@ -233,6 +236,11 @@ static int regex_probe(const char *p, in
++ /* try them all */;
++
++ return (*probe != NULL);
+++#else
+++ /* Should never happen as we check when loading config file */
+++ fprintf(stderr, "FATAL: regex probe called but not built in\n");
+++ exit(5);
+++#endif
++ }
++
++ /*
++--- a/sslh-main.c
+++++ b/sslh-main.c
++@@ -25,7 +25,9 @@
++ #ifdef LIBCONFIG
++ #include <libconfig.h>
++ #endif
+++#ifdef LIBPCRE
++ #include <regex.h>
+++#endif
++
++ #include "common.h"
++ #include "probe.h"
++@@ -174,6 +176,7 @@ static int config_listen(config_t *confi
++ #ifdef LIBCONFIG
++ static void setup_regex_probe(struct proto *p, config_setting_t* probes)
++ {
+++#ifdef LIBPCRE
++ int num_probes, errsize, i, res;
++ char *err;
++ const char * expr;
++@@ -201,6 +204,10 @@ static void setup_regex_probe(struct pro
++ exit(1);
++ }
++ }
+++#else
+++ fprintf(stderr, "line %d: regex probe specified but not compiled in\n", config_setting_source_line(probes));
+++ exit(5);
+++#endif
++ }
++ #endif
++
+diff --git a/feeds/packages/net/sstp-client/Makefile b/feeds/packages/net/sstp-client/Makefile
+new file mode 100644
+index 0000000..baea8d2
+--- /dev/null
++++ b/feeds/packages/net/sstp-client/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sstp-client
++PKG_VERSION:=1.0.10
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/sstp-client/$(PKG_VERSION)
++PKG_MD5SUM:=5f290355187e5ce0423fb7e388e65b9d
++PKG_LICENSE=GPLv2
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CPPFLAGS += -I$(PKG_BUILD_DIR)/include
++
++define Package/sstp-client
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS=+libevent2 +libopenssl +ppp
++ TITLE:=SSTP is Microsofts Remote Access Solution for PPP over SSL
++ URL:=http://sstp-client.sourceforge.net/
++ MAINTAINER:=Federico Di Marco <fededim@gmail.com>
++endef
++
++define Package/sstp-client/description
++ It can be used instead of PPTP or L2TP, and is only available with Windows Vista/7 connecting to a Windows 2008 Server. The advantage of SSTP compared to PPTP and L2TP is that it cannot be easily blocked by firewalls since the traffic is transmitted over HTTPS on port 443.
++ Windows Vista/7 uses SSTP whenever PPTP or L2TP cannot be established. For further information on SSTP check out wikipedia's article on Secure Socket Tunneling Protocol.
++endef
++
++define Package/sstp-client/conffiles
++ /etc/ppp/chap-secrets
++ /etc/ppp/peers/peer-sstp-example-nopty.txt
++ /etc/ppp/peers/peer-sstp-example.txt
++endef
++
++define Package/sstp-client/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/.libs/sstpc $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/src/libsstp-api/.libs/*.so* $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/src/pppd-plugin/.libs/*.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/etc/ppp
++ $(INSTALL_DIR) $(1)/etc/peers
++endef
++
++$(eval $(call BuildPackage,sstp-client))
+diff --git a/feeds/packages/net/sstp-client/files/etc/ppp/chap-secrets b/feeds/packages/net/sstp-client/files/etc/ppp/chap-secrets
+new file mode 100644
+index 0000000..3b93768
+--- /dev/null
++++ b/feeds/packages/net/sstp-client/files/etc/ppp/chap-secrets
+@@ -0,0 +1,4 @@
++# Secrets for authentication using CHAP
++# client (domain\\username) server secret (password) acceptable local IP addresses
++# SSTP-TEST\\JonDoe sstp-test 'testme1234!' *
++
+diff --git a/feeds/packages/net/sstp-client/files/etc/ppp/peers/peer-sstp-example-nopty.txt b/feeds/packages/net/sstp-client/files/etc/ppp/peers/peer-sstp-example-nopty.txt
+new file mode 100644
+index 0000000..0149220
+--- /dev/null
++++ b/feeds/packages/net/sstp-client/files/etc/ppp/peers/peer-sstp-example-nopty.txt
+@@ -0,0 +1,14 @@
++remotename sstp-test
++linkname sstp-test
++ipparam sstp-test
++name SSTP-TEST\\jdoe
++plugin sstp-pppd-plugin.so
++sstp-sock /tmp/sstp-uds-sock
++usepeerdns
++require-mppe
++noauth
++refuse-eap
++debug
++
++# adopt defaults from the pptp-linux package
++file /etc/ppp/options.pptp
+diff --git a/feeds/packages/net/sstp-client/files/etc/ppp/peers/peer-sstp-example.txt b/feeds/packages/net/sstp-client/files/etc/ppp/peers/peer-sstp-example.txt
+new file mode 100644
+index 0000000..e96e188
+--- /dev/null
++++ b/feeds/packages/net/sstp-client/files/etc/ppp/peers/peer-sstp-example.txt
+@@ -0,0 +1,15 @@
++remotename sstp-test
++linkname sstp-test
++ipparam sstp-test
++pty "sstpc --server n3zz-dc1.sstp-test.net --nolaunchpppd "
++name SSTP-TEST\\jdoe
++plugin sstp-pppd-plugin.so
++sstp-sock /tmp/sstpc-uds-sock
++usepeerdns
++require-mppe
++refuse-eap
++noauth
++debug
++
++# adopt defaults from the pptp-linux package
++file /etc/ppp/options.pptp
+diff --git a/feeds/packages/net/sstp-client/patches/100-musl-compat.patch b/feeds/packages/net/sstp-client/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..d19b2fa
+--- /dev/null
++++ b/feeds/packages/net/sstp-client/patches/100-musl-compat.patch
+@@ -0,0 +1,33 @@
++--- /dev/null
+++++ b/include/net/ppp_defs.h
++@@ -0,0 +1,10 @@
+++#ifndef _NET_PPP_DEFS_H
+++#define _NET_PPP_DEFS_H 1
+++
+++#define __need_time_t
+++#include <time.h>
+++
+++#include <asm/types.h>
+++#include <linux/ppp_defs.h>
+++
+++#endif /* net/ppp_defs.h */
++--- a/src/libsstp-log/sstp-log-syslog.c
+++++ b/src/libsstp-log/sstp-log-syslog.c
++@@ -32,6 +32,7 @@
++ #include <sys/uio.h>
++ #include <sys/un.h>
++ #include <sys/socket.h>
+++#include <sys/types.h>
++ #include <unistd.h>
++
++ #include <sstp-common.h>
++--- a/src/libsstp-log/sstp-log-std.c
+++++ b/src/libsstp-log/sstp-log-std.c
++@@ -25,6 +25,7 @@
++ #include <stdio.h>
++ #include <stdint.h>
++ #include <string.h>
+++#include <sys/types.h>
++ #include <sys/uio.h>
++ #include <unistd.h>
++
+diff --git a/feeds/packages/net/strongswan/Config.in b/feeds/packages/net/strongswan/Config.in
+new file mode 100644
+index 0000000..5bb78ae
+--- /dev/null
++++ b/feeds/packages/net/strongswan/Config.in
+@@ -0,0 +1,16 @@
++menu "Configuration"
++ depends on PACKAGE_strongswan
++
++# --with-routing-table
++config STRONGSWAN_ROUTING_TABLE
++ string
++ prompt "Set the IPsec routing table ID"
++ default "220"
++
++# --with-routing-table-prio
++config STRONGSWAN_ROUTING_TABLE_PRIO
++ string
++ prompt "Set the IPsec routing table priority"
++ default "220"
++
++endmenu
+diff --git a/feeds/packages/net/strongswan/Makefile b/feeds/packages/net/strongswan/Makefile
+new file mode 100644
+index 0000000..7c68f72
+--- /dev/null
++++ b/feeds/packages/net/strongswan/Makefile
+@@ -0,0 +1,528 @@
++#
++# Copyright (C) 2012-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=strongswan
++PKG_VERSION:=5.3.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://download.strongswan.org/ http://download2.strongswan.org/
++PKG_MD5SUM:=5a25f3d1c31a77ef44d14a2e7b3eaad0
++PKG_LICENSE:=GPL-2.0+
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++
++PKG_MOD_AVAILABLE:= \
++ addrblock \
++ aes \
++ af-alg \
++ agent \
++ attr \
++ attr-sql \
++ blowfish \
++ ccm \
++ cmac \
++ constraints \
++ coupling \
++ ctr \
++ curl \
++ des \
++ dhcp \
++ dnskey \
++ duplicheck \
++ eap-identity \
++ eap-md5 \
++ eap-mschapv2 \
++ eap-radius \
++ eap-tls \
++ farp \
++ fips-prf \
++ gcm \
++ gcrypt \
++ gmp \
++ ha \
++ hmac \
++ kernel-libipsec \
++ kernel-netlink \
++ ldap \
++ led \
++ load-tester \
++ nonce \
++ md4 \
++ md5 \
++ mysql \
++ openssl \
++ pem \
++ pgp \
++ pkcs1 \
++ pkcs7 \
++ pkcs8 \
++ pkcs11 \
++ pkcs12 \
++ pubkey \
++ random \
++ rc2 \
++ resolve \
++ revocation \
++ sha1 \
++ sha2 \
++ smp \
++ socket-default \
++ socket-dynamic \
++ sql \
++ sqlite \
++ sshkey \
++ stroke \
++ test-vectors \
++ unity \
++ uci \
++ updown \
++ whitelist \
++ x509 \
++ xauth-eap \
++ xauth-generic \
++ xcbc
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_STRONGSWAN_ROUTING_TABLE \
++ CONFIG_STRONGSWAN_ROUTING_TABLE_PRIO \
++ $(patsubst %,CONFIG_PACKAGE_strongswan-mod-%,$(PKG_MOD_AVAILABLE)) \
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/strongswan/Default
++ SUBMENU:=VPN
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=StrongSwan
++ URL:=http://www.strongswan.org/
++endef
++
++define Package/strongswan/description/Default
++ StrongSwan is an OpenSource IPsec implementation for the Linux operating system.
++endef
++
++define Package/strongswan
++$(call Package/strongswan/Default)
++ DEPENDS:= +libpthread +ip \
++ +kmod-crypto-authenc \
++ +kmod-ipsec +kmod-ipsec4 +IPV6:kmod-ipsec6 \
++ +kmod-ipt-ipsec +iptables-mod-ipsec
++endef
++
++define Package/strongswan/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/strongswan/description
++$(call Package/strongswan/description/Default)
++ This package contains shared libraries and scripts.
++endef
++
++define Package/strongswan-full
++$(call Package/strongswan/Default)
++ TITLE+= (full)
++ DEPENDS:= +strongswan \
++ +strongswan-charon \
++ +strongswan-mod-addrblock \
++ +strongswan-mod-aes \
++ +strongswan-mod-af-alg \
++ +strongswan-mod-agent \
++ +strongswan-mod-attr \
++ +strongswan-mod-attr-sql \
++ +strongswan-mod-blowfish \
++ +strongswan-mod-ccm \
++ +strongswan-mod-cmac \
++ +strongswan-mod-constraints \
++ +strongswan-mod-coupling \
++ +strongswan-mod-ctr \
++ +strongswan-mod-curl \
++ +strongswan-mod-des \
++ +strongswan-mod-dhcp \
++ +strongswan-mod-dnskey \
++ +strongswan-mod-duplicheck \
++ +strongswan-mod-eap-identity \
++ +strongswan-mod-eap-md5 \
++ +strongswan-mod-eap-mschapv2 \
++ +strongswan-mod-eap-radius \
++ +strongswan-mod-eap-tls \
++ +strongswan-mod-farp \
++ +strongswan-mod-fips-prf \
++ +strongswan-mod-gcm \
++ +strongswan-mod-gcrypt \
++ +strongswan-mod-gmp \
++ +strongswan-mod-ha \
++ +strongswan-mod-hmac \
++ +strongswan-mod-kernel-netlink \
++ +strongswan-mod-ldap \
++ +strongswan-mod-led \
++ +strongswan-mod-load-tester \
++ +strongswan-mod-nonce \
++ +strongswan-mod-md4 \
++ +strongswan-mod-md5 \
++ +strongswan-mod-mysql \
++ +strongswan-mod-openssl \
++ +strongswan-mod-pem \
++ +strongswan-mod-pgp \
++ +strongswan-mod-pkcs1 \
++ +strongswan-mod-pkcs7 \
++ +strongswan-mod-pkcs8 \
++ +strongswan-mod-pkcs11 \
++ +strongswan-mod-pkcs12 \
++ +strongswan-mod-pubkey \
++ +strongswan-mod-random \
++ +strongswan-mod-rc2 \
++ +strongswan-mod-resolve \
++ +strongswan-mod-revocation \
++ +strongswan-mod-sha1 \
++ +strongswan-mod-sha2 \
++ +strongswan-mod-smp \
++ +strongswan-mod-socket-default \
++ +strongswan-mod-sql \
++ +strongswan-mod-sqlite \
++ +strongswan-mod-sshkey \
++ +strongswan-mod-stroke \
++ +strongswan-mod-test-vectors \
++ +strongswan-mod-uci \
++ +strongswan-mod-unity \
++ +strongswan-mod-updown \
++ +strongswan-mod-whitelist \
++ +strongswan-mod-x509 \
++ +strongswan-mod-xauth-eap \
++ +strongswan-mod-xauth-generic \
++ +strongswan-mod-xcbc \
++ +strongswan-utils \
++ @DEVEL
++endef
++
++define Package/strongswan-full/description
++$(call Package/strongswan/description/Default)
++ This meta-package contains dependencies for all of the strongswan plugins
++ except kernel-libipsec,
++ socket-dynamic and which are ommitted in favor of the kernel-netlink and
++ socket-default plugins.
++endef
++
++
++define Package/strongswan-default
++$(call Package/strongswan/Default)
++ TITLE+= (default)
++ DEPENDS:= +strongswan \
++ +strongswan-charon \
++ +strongswan-mod-aes \
++ +strongswan-mod-attr \
++ +strongswan-mod-constraints \
++ +strongswan-mod-des \
++ +strongswan-mod-dnskey \
++ +strongswan-mod-fips-prf \
++ +strongswan-mod-gmp \
++ +strongswan-mod-hmac \
++ +strongswan-mod-kernel-netlink \
++ +strongswan-mod-md5 \
++ +strongswan-mod-nonce \
++ +strongswan-mod-pem \
++ +strongswan-mod-pgp \
++ +strongswan-mod-pkcs1 \
++ +strongswan-mod-pubkey \
++ +strongswan-mod-random \
++ +strongswan-mod-rc2 \
++ +strongswan-mod-resolve \
++ +strongswan-mod-revocation \
++ +strongswan-mod-sha1 \
++ +strongswan-mod-sha2 \
++ +strongswan-mod-socket-default \
++ +strongswan-mod-sshkey \
++ +strongswan-mod-stroke \
++ +strongswan-mod-updown \
++ +strongswan-mod-x509 \
++ +strongswan-mod-xauth-generic \
++ +strongswan-mod-xcbc \
++ +strongswan-utils
++endef
++
++define Package/strongswan-default/description
++$(call Package/strongswan/description/Default)
++ This meta-package contains only dependencies to match upstream defaults.
++endef
++
++define Package/strongswan-minimal
++$(call Package/strongswan/Default)
++ TITLE+= (minimal)
++ DEPENDS:= +strongswan \
++ +strongswan-charon \
++ +strongswan-mod-aes \
++ +strongswan-mod-gmp \
++ +strongswan-mod-hmac \
++ +strongswan-mod-kernel-netlink \
++ +strongswan-mod-nonce \
++ +strongswan-mod-pubkey \
++ +strongswan-mod-random \
++ +strongswan-mod-sha1 \
++ +strongswan-mod-socket-default \
++ +strongswan-mod-stroke \
++ +strongswan-mod-updown \
++ +strongswan-mod-x509 \
++ +strongswan-mod-xcbc
++endef
++
++define Package/strongswan-minimal/description
++$(call Package/strongswan/description/Default)
++ This meta-package contains only dependencies for a minimal IKEv2 setup.
++endef
++
++define Package/strongswan-charon
++$(call Package/strongswan/Default)
++ TITLE+= IKEv1/IKEv2 keying daemon
++ DEPENDS:= +strongswan
++endef
++
++define Package/strongswan-charon/description
++$(call Package/strongswan/description/Default)
++ This package contains charon, an IKEv2 keying daemon.
++endef
++
++define Package/strongswan-utils
++$(call Package/strongswan/Default)
++ TITLE+= utilities
++ DEPENDS:= +strongswan
++endef
++
++define Package/strongswan-utils/description
++$(call Package/strongswan/description/Default)
++ This package contains the pki & scepclient utilities.
++endef
++
++define Package/strongswan-libtls
++$(call Package/strongswan/Default)
++ TITLE+= libtls
++ DEPENDS:= +strongswan
++endef
++
++define Package/strongswan-libtls/description
++$(call Package/strongswan/description/Default)
++ This package contains libtls for strongSwan plugins eap-tls, eap-ttls,
++ eap-peap, tnc-tnccs
++endef
++
++define BuildPlugin
++ define Package/strongswan-mod-$(1)
++ $$(call Package/strongswan/Default)
++ TITLE:= StrongSwan $(2) plugin
++ DEPENDS:= +strongswan $(3)
++ endef
++
++ define Package/strongswan-mod-$(1)/install
++ $(INSTALL_DIR) $$(1)/etc/strongswan.d/charon
++ if [ -f $(PKG_INSTALL_DIR)/etc/strongswan.d/charon/$(1).conf ]; then \
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/strongswan.d/charon/$(1).conf $$(1)/etc/strongswan.d/charon/; fi
++ $(INSTALL_DIR) $$(1)/usr/lib/ipsec/plugins
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/plugins/libstrongswan-$(1).so \
++ $$(1)/usr/lib/ipsec/plugins/
++ $(call Plugin/$(1)/install,$$(1))
++ endef
++
++ $$(eval $$(call BuildPackage,strongswan-mod-$(1)))
++endef
++
++CONFIGURE_ARGS+= \
++ --disable-scripts \
++ --disable-static \
++ --disable-fast \
++ --with-systemdsystemunitdir=no \
++ $(if $(CONFIG_PACKAGE_strongswan-utils),--enable-pki --enable-scepclient,--disable-pki --disable-scepclient) \
++ --with-random-device=/dev/random \
++ --with-urandom-device=/dev/urandom \
++ --with-routing-table="$(call qstrip,$(CONFIG_STRONGSWAN_ROUTING_TABLE))" \
++ --with-routing-table-prio="$(call qstrip,$(CONFIG_STRONGSWAN_ROUTING_TABLE_PRIO))" \
++ $(foreach m,$(PKG_MOD_AVAILABLE), \
++ $(if $(CONFIG_PACKAGE_strongswan-mod-$(m)),--enable-$(m),--disable-$(m)) \
++ )
++
++EXTRA_LDFLAGS+= -Wl,-rpath-link,$(STAGING_DIR)/usr/lib
++
++define Package/strongswan/conffiles
++/etc/ipsec.conf
++/etc/ipsec.secrets
++/etc/ipsec.user
++/etc/strongswan.conf
++endef
++
++define Package/strongswan/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/ipsec.conf $(1)/etc/
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/strongswan.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/usr/lib/ipsec
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/{libstrongswan.so.*,libhydra.so.*} $(1)/usr/lib/ipsec/
++ $(INSTALL_CONF) ./files/ipsec.secrets $(1)/etc/
++ $(INSTALL_CONF) ./files/ipsec.user $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/ipsec.init $(1)/etc/init.d/ipsec
++endef
++
++define Package/strongswan-default/install
++ true
++endef
++
++define Package/strongswan-full/install
++ true
++endef
++
++define Package/strongswan-minimal/install
++ true
++endef
++
++define Package/strongswan-charon/install
++ $(INSTALL_DIR) $(1)/usr/lib/ipsec
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ipsec/charon $(1)/usr/lib/ipsec/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/libcharon.so.* $(1)/usr/lib/ipsec/
++endef
++
++define Package/strongswan-utils/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ipsec $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/pki $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib/ipsec
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ipsec/scepclient $(1)/usr/lib/ipsec/
++endef
++
++define Package/strongswan-libtls/install
++ $(INSTALL_DIR) $(1)/usr/lib/ipsec
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/libtls.so.* $(1)/usr/lib/ipsec/
++endef
++
++define Plugin/duplicheck/install
++ $(INSTALL_DIR) $(1)/usr/lib/ipsec/plugins
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/duplicheck $(1)/usr/lib/ipsec/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/plugins/libstrongswan-duplicheck.so $(1)/usr/lib/ipsec/plugins/
++endef
++
++define Plugin/eap-radius/install
++ $(INSTALL_DIR) $(1)/usr/lib/ipsec/plugins
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/libradius.so.* $(1)/usr/lib/ipsec/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/plugins/libstrongswan-eap-radius.so $(1)/usr/lib/ipsec/plugins/
++endef
++
++define Plugin/attr-sql/install
++ $(INSTALL_DIR) $(1)/usr/lib/ipsec
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/pool $(1)/usr/lib/ipsec/
++endef
++
++define Plugin/stroke/install
++ $(INSTALL_DIR) $(1)/etc/ipsec.d/aacerts
++ $(INSTALL_DIR) $(1)/etc/ipsec.d/acerts
++ $(INSTALL_DIR) $(1)/etc/ipsec.d/cacerts
++ $(INSTALL_DIR) $(1)/etc/ipsec.d/certs
++ $(INSTALL_DIR) $(1)/etc/ipsec.d/crls
++ $(INSTALL_DIR) $(1)/etc/ipsec.d/ocspcerts
++ $(INSTALL_DIR) $(1)/etc/ipsec.d/private
++ $(INSTALL_DIR) $(1)/etc/ipsec.d/reqs
++
++ $(INSTALL_DIR) $(1)/usr/lib/ipsec/plugins
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ipsec/{starter,stroke} $(1)/usr/lib/ipsec/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/plugins/libstrongswan-stroke.so $(1)/usr/lib/ipsec/plugins/
++endef
++
++define Plugin/updown/install
++ $(INSTALL_DIR) $(1)/usr/lib/ipsec/plugins
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/_updown $(1)/usr/lib/ipsec/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/plugins/libstrongswan-updown.so $(1)/usr/lib/ipsec/plugins/
++ $(INSTALL_DIR) $(1)/etc
++endef
++
++define Plugin/whitelist/install
++ $(INSTALL_DIR) $(1)/usr/lib/ipsec/plugins
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/whitelist $(1)/usr/lib/ipsec/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/plugins/libstrongswan-whitelist.so $(1)/usr/lib/ipsec/plugins/
++endef
++
++define Plugin/kernel-libipsec/install
++ $(INSTALL_DIR) $(1)/usr/lib/ipsec
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ipsec/libipsec.so.* $(1)/usr/lib/ipsec/
++endef
++
++$(eval $(call BuildPackage,strongswan))
++$(eval $(call BuildPackage,strongswan-default))
++$(eval $(call BuildPackage,strongswan-full))
++$(eval $(call BuildPackage,strongswan-minimal))
++$(eval $(call BuildPackage,strongswan-charon))
++$(eval $(call BuildPackage,strongswan-utils))
++$(eval $(call BuildPackage,strongswan-libtls))
++$(eval $(call BuildPlugin,addrblock,RFC 3779 address block constraint support,))
++$(eval $(call BuildPlugin,aes,AES crypto,))
++$(eval $(call BuildPlugin,af-alg,AF_ALG crypto interface to Linux Crypto API,+kmod-crypto-user))
++$(eval $(call BuildPlugin,agent,SSH agent signing,))
++$(eval $(call BuildPlugin,attr,file based config,))
++$(eval $(call BuildPlugin,attr-sql,SQL based config,+strongswan-charon))
++$(eval $(call BuildPlugin,blowfish,Blowfish crypto,))
++$(eval $(call BuildPlugin,ccm,CCM AEAD wrapper crypto,))
++$(eval $(call BuildPlugin,cmac,CMAC crypto,))
++$(eval $(call BuildPlugin,constraints,advanced X509 constraint checking,))
++$(eval $(call BuildPlugin,coupling,IKEv2 plugin to couple peer certificates permanently to authentication,))
++$(eval $(call BuildPlugin,ctr,Counter Mode wrapper crypto,))
++$(eval $(call BuildPlugin,curl,cURL fetcher plugin,+PACKAGE_strongswan-mod-curl:libcurl))
++$(eval $(call BuildPlugin,des,DES crypto,))
++$(eval $(call BuildPlugin,dhcp,DHCP based attribute provider,))
++$(eval $(call BuildPlugin,dnskey,DNS RR key decoding,))
++$(eval $(call BuildPlugin,duplicheck,advanced duplicate checking,))
++$(eval $(call BuildPlugin,eap-identity,EAP identity helper,))
++$(eval $(call BuildPlugin,eap-md5,EAP MD5 (CHAP) EAP auth,))
++$(eval $(call BuildPlugin,eap-mschapv2,EAP MS-CHAPv2 EAP auth,+strongswan-mod-md4 +strongswan-mod-des))
++$(eval $(call BuildPlugin,eap-radius,EAP RADIUS auth,))
++$(eval $(call BuildPlugin,eap-tls,EAP TLS auth,+strongswan-libtls))
++$(eval $(call BuildPlugin,farp,fake arp respsonses,))
++$(eval $(call BuildPlugin,fips-prf,FIPS PRF crypto,+strongswan-mod-sha1))
++$(eval $(call BuildPlugin,gcm,GCM AEAD wrapper crypto,))
++$(eval $(call BuildPlugin,gcrypt,libgcrypt,+PACKAGE_strongswan-mod-gcrypt:libgcrypt))
++$(eval $(call BuildPlugin,gmp,libgmp,+PACKAGE_strongswan-mod-gmp:libgmp))
++$(eval $(call BuildPlugin,ha,high availability cluster,))
++$(eval $(call BuildPlugin,hmac,HMAC crypto,))
++$(eval $(call BuildPlugin,kernel-libipsec,libipsec kernel interface,))
++$(eval $(call BuildPlugin,kernel-netlink,netlink kernel interface,))
++$(eval $(call BuildPlugin,ldap,LDAP,+PACKAGE_strongswan-mod-ldap:libopenldap))
++$(eval $(call BuildPlugin,led,LED blink on IKE activity,))
++$(eval $(call BuildPlugin,load-tester,load testing,))
++$(eval $(call BuildPlugin,nonce,nonce genereation,))
++$(eval $(call BuildPlugin,md4,MD4 crypto,))
++$(eval $(call BuildPlugin,md5,MD5 crypto,))
++$(eval $(call BuildPlugin,mysql,MySQL database interface,+strongswan-mod-sql +PACKAGE_strongswan-mod-mysql:libmysqlclient-r))
++$(eval $(call BuildPlugin,openssl,OpenSSL crypto,+PACKAGE_strongswan-mod-openssl:libopenssl))
++$(eval $(call BuildPlugin,pem,PEM decoding,))
++$(eval $(call BuildPlugin,pgp,PGP key decoding,))
++$(eval $(call BuildPlugin,pkcs1,PKCS1 key decoding,))
++$(eval $(call BuildPlugin,pkcs7,PKCS7 key decoding,))
++$(eval $(call BuildPlugin,pkcs8,PKCS8 key decoding,))
++$(eval $(call BuildPlugin,pkcs11,PKCS11 key decoding,))
++$(eval $(call BuildPlugin,pkcs12,PKCS12 key decoding,))
++$(eval $(call BuildPlugin,pubkey,raw public key,))
++$(eval $(call BuildPlugin,random,RNG,))
++$(eval $(call BuildPlugin,rc2,RC2 crypto,))
++$(eval $(call BuildPlugin,resolve,DNS resolver,))
++$(eval $(call BuildPlugin,revocation,X509 CRL/OCSP revocation,))
++$(eval $(call BuildPlugin,sha1,SHA1 crypto,))
++$(eval $(call BuildPlugin,sha2,SHA2 crypto,))
++$(eval $(call BuildPlugin,smp,SMP configuration and control interface,+PACKAGE_strongswan-mod-smp:libxml2))
++$(eval $(call BuildPlugin,socket-default,default socket implementation for charon,))
++$(eval $(call BuildPlugin,socket-dynamic,dynamic socket implementation for charon,))
++$(eval $(call BuildPlugin,sql,SQL database interface,))
++$(eval $(call BuildPlugin,sqlite,SQLite database interface,+strongswan-mod-sql +PACKAGE_strongswan-mod-sqlite:libsqlite3))
++$(eval $(call BuildPlugin,sshkey,SSH key decoding,))
++$(eval $(call BuildPlugin,stroke,Stroke,+strongswan-utils))
++$(eval $(call BuildPlugin,test-vectors,crypto test vectors,))
++$(eval $(call BuildPlugin,uci,UCI config interface,+PACKAGE_strongswan-mod-uci:libuci))
++$(eval $(call BuildPlugin,unity,Cisco Unity extension,))
++$(eval $(call BuildPlugin,updown,updown firewall,))
++$(eval $(call BuildPlugin,whitelist,peer identity whitelisting,))
++$(eval $(call BuildPlugin,x509,x509 certificate,))
++$(eval $(call BuildPlugin,xauth-eap,EAP XAuth backend,))
++$(eval $(call BuildPlugin,xauth-generic,generic XAuth backend,))
++$(eval $(call BuildPlugin,xcbc,xcbc crypto,))
+diff --git a/feeds/packages/net/strongswan/files/ipsec.init b/feeds/packages/net/strongswan/files/ipsec.init
+new file mode 100644
+index 0000000..391a2ae
+--- /dev/null
++++ b/feeds/packages/net/strongswan/files/ipsec.init
+@@ -0,0 +1,20 @@
++#!/bin/sh /etc/rc.common
++
++START=90
++STOP=10
++
++start() {
++ ipsec start
++}
++
++stop() {
++ ipsec stop
++}
++
++restart() {
++ ipsec restart
++}
++
++reload() {
++ ipsec update
++}
+diff --git a/feeds/packages/net/strongswan/files/ipsec.secrets b/feeds/packages/net/strongswan/files/ipsec.secrets
+new file mode 100644
+index 0000000..ddd4956
+--- /dev/null
++++ b/feeds/packages/net/strongswan/files/ipsec.secrets
+@@ -0,0 +1 @@
++# /etc/ipsec.secrets - strongSwan IPsec secrets file
+diff --git a/feeds/packages/net/strongswan/files/ipsec.user b/feeds/packages/net/strongswan/files/ipsec.user
+new file mode 100644
+index 0000000..4351ace
+--- /dev/null
++++ b/feeds/packages/net/strongswan/files/ipsec.user
+@@ -0,0 +1,6 @@
++# This file is interpreted as shell script.
++# Put your custom ip rules here, they will
++# be executed with each call to the script
++# /usr/lib/ipsec/_updown which by default
++# strongswan executes.
++
+diff --git a/feeds/packages/net/strongswan/patches/101-musl-fixes.patch b/feeds/packages/net/strongswan/patches/101-musl-fixes.patch
+new file mode 100644
+index 0000000..3b90e6c
+--- /dev/null
++++ b/feeds/packages/net/strongswan/patches/101-musl-fixes.patch
+@@ -0,0 +1,85 @@
++--- a/src/libstrongswan/library.h
+++++ b/src/libstrongswan/library.h
++@@ -118,6 +118,7 @@
++ #include "utils/leak_detective.h"
++ #include "plugins/plugin_loader.h"
++ #include "settings/settings.h"
+++#include "musl.h"
++
++ typedef struct library_t library_t;
++
++--- /dev/null
+++++ b/src/libstrongswan/musl.h
++@@ -0,0 +1,39 @@
+++#include <sys/types.h>
+++
+++#define crypt x_crypt
+++#define encrypt x_encrypt
+++#include <unistd.h>
+++
+++#define fd_set x_fd_set
+++#define ino_t x_ino_t
+++#define off_t x_off_t
+++#define loff_t x_loff_t
+++#define dev_t x_dev_t
+++#define mode_t x_mode_t
+++#define uid_t x_uid_t
+++#define gid_t x_gid_t
+++#define uint64_t x_uint64_t
+++#define u_int64_t x_u_int64_t
+++#define int64_t x_int64_t
+++#define nlink_t x_nlink_t
+++#define timer_t x_timer_t
+++#define blkcnt_t x_blkcnt_t
+++#define __kernel_nlink_t void
+++
+++#include <linux/types.h>
+++
+++#undef fd_set
+++#undef ino_t
+++#undef off_t
+++#undef dev_t
+++#undef mode_t
+++#undef uid_t
+++#undef gid_t
+++#undef uint64_t
+++#undef u_int64_t
+++#undef int64_t
+++#undef nlink_t
+++#undef timer_t
+++#undef blkcnt_t
+++#undef crypt
+++#undef encrypt
++--- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c
+++++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_ipsec.c
++@@ -18,6 +18,8 @@
++ * for more details.
++ */
++
+++#include <musl.h>
+++
++ #include <sys/types.h>
++ #include <sys/socket.h>
++ #include <stdint.h>
++--- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
+++++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_net.c
++@@ -37,6 +37,8 @@
++ * THE SOFTWARE.
++ */
++
+++#include "musl.h"
+++
++ #include <sys/socket.h>
++ #include <sys/utsname.h>
++ #include <linux/netlink.h>
++--- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c
+++++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c
++@@ -15,6 +15,8 @@
++ * for more details.
++ */
++
+++#include "musl.h"
+++
++ #include <sys/socket.h>
++ #include <linux/netlink.h>
++ #include <linux/rtnetlink.h>
+diff --git a/feeds/packages/net/strongswan/patches/201-kmodloader.patch b/feeds/packages/net/strongswan/patches/201-kmodloader.patch
+new file mode 100644
+index 0000000..7d46156
+--- /dev/null
++++ b/feeds/packages/net/strongswan/patches/201-kmodloader.patch
+@@ -0,0 +1,28 @@
++--- a/src/starter/netkey.c
+++++ b/src/starter/netkey.c
++@@ -31,7 +31,7 @@ bool starter_netkey_init(void)
++ /* af_key module makes the netkey proc interface visible */
++ if (stat(PROC_MODULES, &stb) == 0)
++ {
++- ignore_result(system("modprobe -qv af_key"));
+++ ignore_result(system("modprobe af_key 2>&1 >/dev/null"));
++ }
++
++ /* now test again */
++@@ -45,11 +45,11 @@ bool starter_netkey_init(void)
++ /* make sure that all required IPsec modules are loaded */
++ if (stat(PROC_MODULES, &stb) == 0)
++ {
++- ignore_result(system("modprobe -qv ah4"));
++- ignore_result(system("modprobe -qv esp4"));
++- ignore_result(system("modprobe -qv ipcomp"));
++- ignore_result(system("modprobe -qv xfrm4_tunnel"));
++- ignore_result(system("modprobe -qv xfrm_user"));
+++ ignore_result(system("modprobe ah4 2>&1 >/dev/null"));
+++ ignore_result(system("modprobe esp4 2>&1 >/dev/null"));
+++ ignore_result(system("modprobe ipcomp 2>&1 >/dev/null"));
+++ ignore_result(system("modprobe xfrm4_tunnel 2>&1 >/dev/null"));
+++ ignore_result(system("modprobe xfrm_user 2>&1 >/dev/null"));
++ }
++
++ DBG2(DBG_APP, "found netkey IPsec stack");
+diff --git a/feeds/packages/net/strongswan/patches/203-uci.patch b/feeds/packages/net/strongswan/patches/203-uci.patch
+new file mode 100644
+index 0000000..274ea86
+--- /dev/null
++++ b/feeds/packages/net/strongswan/patches/203-uci.patch
+@@ -0,0 +1,20 @@
++--- a/src/libcharon/plugins/uci/uci_parser.c
+++++ b/src/libcharon/plugins/uci/uci_parser.c
++@@ -78,7 +78,7 @@ METHOD(enumerator_t, section_enumerator_
++ if (uci_lookup(this->ctx, &element, this->package,
++ this->current->name, "name") == UCI_OK)
++ { /* use "name" attribute as config name if available ... */
++- *value = uci_to_option(element)->value;
+++ *value = uci_to_option(element)->v.string;
++ }
++ else
++ { /* ... or the section name becomes config name */
++@@ -93,7 +93,7 @@ METHOD(enumerator_t, section_enumerator_
++ if (value && uci_lookup(this->ctx, &element, this->package,
++ this->current->name, this->keywords[i]) == UCI_OK)
++ {
++- *value = uci_to_option(element)->value;
+++ *value = uci_to_option(element)->v.string;
++ }
++ }
++ va_end(args);
+diff --git a/feeds/packages/net/strongswan/patches/300-include-ipsec-user-script.patch b/feeds/packages/net/strongswan/patches/300-include-ipsec-user-script.patch
+new file mode 100644
+index 0000000..6835e02
+--- /dev/null
++++ b/feeds/packages/net/strongswan/patches/300-include-ipsec-user-script.patch
+@@ -0,0 +1,17 @@
++--- a/src/_updown/_updown.in
+++++ b/src/_updown/_updown.in
++@@ -16,11 +16,9 @@
++ # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ # for more details.
++
++-# CAUTION: Installing a new version of strongSwan will install a new
++-# copy of this script, wiping out any custom changes you make. If
++-# you need changes, make a copy of this under another name, and customize
++-# that, and use the (left/right)updown parameters in ipsec.conf to make
++-# strongSwan use yours instead of this default one.
+++# Add your custom ip rules to the /etc/ipsec.user file if you need that functionality.
+++
+++[ -e /etc/ipsec.user ] && . /etc/ipsec.user "$1"
++
++ # PLUTO_VERSION
++ # indicates what version of this interface is being
+diff --git a/feeds/packages/net/stunnel/Makefile b/feeds/packages/net/stunnel/Makefile
+new file mode 100644
+index 0000000..58a6bbe
+--- /dev/null
++++ b/feeds/packages/net/stunnel/Makefile
+@@ -0,0 +1,77 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=stunnel
++PKG_VERSION:=5.20
++PKG_RELEASE:=1
++
++PKG_LICENSE:=GPL-2.0+
++PKG_MAINTAINER:=Michael Haas <haas@computerlinguist.org>
++PKG_LICENSE_FILES:=COPYING COPYRIGHT.GPL
++
++PKG_SOURCE_URL:=http://stunnel.cybermirror.org/archive/5.x/
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=3264375026c2b496b5d258e243222de8
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/stunnel
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libopenssl
++ TITLE:=SSL TCP Wrapper
++ URL:=http://www.stunnel.org/
++endef
++
++define Package/stunnel/description
++ Stunnel is a program that allows you to encrypt arbitrary TCP
++ connections inside SSL (Secure Sockets Layer) available on both Unix
++ and Windows. Stunnel can allow you to secure non-SSL aware daemons and
++ protocols (like POP, IMAP, LDAP, etc) by having Stunnel provide the
++ encryption, requiring no changes to the daemon's code.
++endef
++
++define Package/stunnel/conffiles
++/etc/stunnel/stunnel.conf
++endef
++
++
++CONFIGURE_ARGS+= \
++ --with-random=/dev/urandom \
++ --with-threads=fork \
++ --with-ssl=$(STAGING_DIR)/usr \
++ --disable-libwrap \
++ --disable-systemd
++
++ifeq ($(CONFIG_IPV6),n)
++CONFIGURE_ARGS+= \
++ --disable-ipv6
++endif
++
++define Build/Compile
++ mkdir -p $(PKG_INSTALL_DIR)/etc/stunnel
++ echo '#dummy' > $(PKG_INSTALL_DIR)/etc/stunnel/stunnel.pem
++ $(call Build/Compile/Default)
++endef
++
++define Package/stunnel/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/stunnel $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib/stunnel
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/stunnel/libstunnel.so $(1)/usr/lib/stunnel/
++ $(INSTALL_DIR) $(1)/etc/stunnel
++ $(INSTALL_CONF) ./files/stunnel.conf $(1)/etc/stunnel/stunnel.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/stunnel.init $(1)/etc/init.d/stunnel
++endef
++
++$(eval $(call BuildPackage,stunnel))
+diff --git a/feeds/packages/net/stunnel/files/stunnel.conf b/feeds/packages/net/stunnel/files/stunnel.conf
+new file mode 100644
+index 0000000..2f10800
+--- /dev/null
++++ b/feeds/packages/net/stunnel/files/stunnel.conf
+@@ -0,0 +1,45 @@
++; Drop privileges
++setuid = nobody
++setgid = nogroup
++
++; When running under procd, stay in foreground
++foreground = yes
++
++; Don't log to stderr, use syslog
++syslog = yes
++
++; 1-7. Use 7 for greatest verbosity
++;debug = 5
++
++; Starting here, enter your services or uncomment the examples
++
++; Example:
++; If your local httpd does not support HTTPS, use stunnel in remote
++; mode to forward TLS connections coming in on port 443 to non-TLS
++; on port 80.
++; Make sure that the cert is available.
++;[httpd]
++;accept = 443
++;connect = 127.0.0.1:80
++;cert = /etc/stunnel/stunnel.pem
++
++; Example:
++; If your local email client does not support TLS,
++; use stunnel in client mode to forward non-TLS connections on
++; port 143 to TLS-enabled servername:993.
++;[imap]
++;client = yes
++;accept = 143
++;connect = servername:993
++; Disable peer verification - be sure to understand the limitations of peer
++; verification in stunnel when enabling.
++;verify = 0
++
++; Default client section:
++; stunnel requires at least one section to start successfully.
++; You can safely remove this section once you have configured
++; your own. We use client mode here as server requires a certificate.
++[dummy]
++client = yes
++accept = localhost:6000
++connect = localhost:6001
+diff --git a/feeds/packages/net/stunnel/files/stunnel.init b/feeds/packages/net/stunnel/files/stunnel.init
+new file mode 100644
+index 0000000..e622205
+--- /dev/null
++++ b/feeds/packages/net/stunnel/files/stunnel.init
+@@ -0,0 +1,12 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2008 OpenWrt.org
++
++START=90
++USE_PROCD=1
++
++start_service() {
++ procd_open_instance
++ procd_set_param command /usr/bin/stunnel /etc/stunnel/stunnel.conf
++ procd_set_param respawn # respawn automatically if something died
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/stunnel/patches/011_disable_ssp_linking.patch b/feeds/packages/net/stunnel/patches/011_disable_ssp_linking.patch
+new file mode 100644
+index 0000000..459c016
+--- /dev/null
++++ b/feeds/packages/net/stunnel/patches/011_disable_ssp_linking.patch
+@@ -0,0 +1,140 @@
++--- a/configure
+++++ b/configure
++@@ -5646,66 +5646,66 @@ done
++
++
++
++-for flag in -fstack-protector; do
++- as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
++-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
++-$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
++-if eval \${$as_CACHEVAR+:} false; then :
++- $as_echo_n "(cached) " >&6
++-else
++-
++- ax_check_save_flags=$CFLAGS
++- CFLAGS="$CFLAGS $flag"
++- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++-/* end confdefs.h. */
++-
++-int
++-main ()
++-{
++-
++- ;
++- return 0;
++-}
++-_ACEOF
++-if ac_fn_c_try_compile "$LINENO"; then :
++- eval "$as_CACHEVAR=yes"
++-else
++- eval "$as_CACHEVAR=no"
++-fi
++-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
++- CFLAGS=$ax_check_save_flags
++-fi
++-eval ac_res=\$$as_CACHEVAR
++- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
++-$as_echo "$ac_res" >&6; }
++-if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
++- if ${CFLAGS+:} false; then :
++- case " $CFLAGS " in
++- *" $flag "*)
++- { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5
++- (: CFLAGS already contains $flag) 2>&5
++- ac_status=$?
++- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++- test $ac_status = 0; }
++- ;;
++- *)
++- { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$flag\""; } >&5
++- (: CFLAGS="$CFLAGS $flag") 2>&5
++- ac_status=$?
++- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
++- test $ac_status = 0; }
++- CFLAGS="$CFLAGS $flag"
++- ;;
++- esac
++-else
++- CFLAGS="$flag"
++-fi
++-
++-else
++- :
++-fi
++-
++-done
+++#for flag in -fstack-protector; do
+++# as_CACHEVAR=`$as_echo "ax_cv_check_cflags__$flag" | $as_tr_sh`
+++#{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
+++#$as_echo_n "checking whether C compiler accepts $flag... " >&6; }
+++#if eval \${$as_CACHEVAR+:} false; then :
+++# $as_echo_n "(cached) " >&6
+++#else
+++#
+++# ax_check_save_flags=$CFLAGS
+++# CFLAGS="$CFLAGS $flag"
+++# cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+++#/* end confdefs.h. */
+++
+++#int
+++#main ()
+++#{
+++#
+++# ;
+++# return 0;
+++#}
+++#_ACEOF
+++#if ac_fn_c_try_compile "$LINENO"; then :
+++# eval "$as_CACHEVAR=yes"
+++#else
+++# eval "$as_CACHEVAR=no"
+++#fi
+++#rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+++# CFLAGS=$ax_check_save_flags
+++#fi
+++#eval ac_res=\$$as_CACHEVAR
+++# { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+++#$as_echo "$ac_res" >&6; }
+++#if test x"`eval 'as_val=${'$as_CACHEVAR'};$as_echo "$as_val"'`" = xyes; then :
+++# if ${CFLAGS+:} false; then :
+++# case " $CFLAGS " in
+++# *" $flag "*)
+++# { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$flag"; } >&5
+++# (: CFLAGS already contains $flag) 2>&5
+++# ac_status=$?
+++# $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+++# test $ac_status = 0; }
+++# ;;
+++# *)
+++# { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$flag\""; } >&5
+++# (: CFLAGS="$CFLAGS $flag") 2>&5
+++# ac_status=$?
+++# $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+++# test $ac_status = 0; }
+++# CFLAGS="$CFLAGS $flag"
+++# ;;
+++# esac
+++#else
+++# CFLAGS="$flag"
+++#fi
+++#
+++#else
+++# :
+++#fi
+++#
+++#done
++
++
++
++--- a/configure.ac
+++++ b/configure.ac
++@@ -71,7 +71,7 @@ AX_APPEND_COMPILE_FLAGS([-Wformat=2])
++ AX_APPEND_COMPILE_FLAGS([-Wconversion])
++ AX_APPEND_COMPILE_FLAGS([-Wno-long-long])
++ AX_APPEND_COMPILE_FLAGS([-Wno-deprecated-declarations])
++-AX_APPEND_COMPILE_FLAGS([-fstack-protector])
+++#AX_APPEND_COMPILE_FLAGS([-fstack-protector])
++ AX_APPEND_COMPILE_FLAGS([-fPIE])
++ AX_APPEND_COMPILE_FLAGS([-D_FORTIFY_SOURCE=2])
++ AX_APPEND_LINK_FLAGS([-fPIE -pie])
+diff --git a/feeds/packages/net/stunnel/patches/012-cron-without-pthread-fix.patch b/feeds/packages/net/stunnel/patches/012-cron-without-pthread-fix.patch
+new file mode 100644
+index 0000000..0f644b3
+--- /dev/null
++++ b/feeds/packages/net/stunnel/patches/012-cron-without-pthread-fix.patch
+@@ -0,0 +1,14 @@
++Index: stunnel-5.20/src/cron.c
++===================================================================
++--- stunnel-5.20.orig/src/cron.c
+++++ stunnel-5.20/src/cron.c
++@@ -46,6 +46,9 @@ NOEXPORT void cron_thread(void *arg);
++ #endif
++ #if defined(USE_PTHREAD) || defined(USE_WIN32)
++ NOEXPORT void cron_worker(void);
+++#endif
+++
+++#ifndef OPENSSL_NO_DH
++ NOEXPORT void cron_dh_param(void);
++ #endif
++
+diff --git a/feeds/packages/net/tcpproxy/Makefile b/feeds/packages/net/tcpproxy/Makefile
+new file mode 100644
+index 0000000..77ef825
+--- /dev/null
++++ b/feeds/packages/net/tcpproxy/Makefile
+@@ -0,0 +1,85 @@
++#
++# Copyright (C) 2010 Christian Pointner,
++# <equinox@spreadspace.org>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++# This Makefile builds tcpproxy Package for OpenWRT
++#
++# $Id: $
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tcpproxy
++PKG_VERSION:=1.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.spreadspace.org/tcpproxy/releases/
++PKG_MD5SUM:=14f734a61350c52556909e2ed5bff361
++PKG_MAINTAINER:=Christian Pointner <equinox@spreadspace.org>
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=LICENSE
++include $(INCLUDE_DIR)/package.mk
++
++
++define Package/tcpproxy
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE:=IPv4/IPv6 tcp connection proxy
++ URL:=http://www.spreadspace.org/tcpproxy/
++endef
++
++define Package/tcpproxy/conffiles
++/etc/config/tcpproxy
++endef
++
++define Package/tcpproxy/description
++tcpproxy is a simple tcp connection proxy which combines the features of rinetd and 6tunnel.
++ tcpproxy supports IPv4 and IPv6 and also supports connections from IPv6 to IPv4 endpoints and vice versa.
++endef
++
++define Package/tcpproxy/configure
++endef
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR)/src; \
++ touch include.mk; \
++ echo '#ifndef TCPPROXY_config_h_INCLUDED' > config.h; \
++ echo '#define TCPPROXY_config_h_INCLUDED' >> config.h; \
++ echo '' >> config.h; \
++ echo '#define VERSION_STRING_0 "tcpproxy version '`cat $(PKG_BUILD_DIR)/version`'"' >> config.h; \
++ echo '#define VERSION_STRING_1 "built on '`hostname`', '`date +"%d.%m.%Y %H:%M:%S %Z"`'"' >> config.h; \
++ echo '' >> config.h; \
++ echo '#define TARGET "linux"' >> config.h; \
++ echo '#define PREFIX "/usr"' >> config.h; \
++ echo '#define BINDIR "/usr/bin"' >> config.h; \
++ echo '#define SYSTEMDDIR "/tmp"' >> config.h; \
++ echo '#define ETCDIR "/etc"' >> config.h; \
++ echo '#define CONFFILE "/etc/tcpproxy.conf"' >> config.h; \
++ echo '' >> config.h; \
++ echo '#endif' >> config.h \
++ )
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)/src \
++ $(TARGET_CONFIGURE_OPTS) \
++ TARGET=Linux \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)"
++ $(STRIP) $(PKG_BUILD_DIR)/src/tcpproxy
++endef
++
++define Package/tcpproxy/install
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/tcpproxy.config $(1)/etc/config/tcpproxy
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(2)/src/tcpproxy $(1)/usr/bin/tcpproxy
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/tcpproxy.init $(1)/etc/init.d/tcpproxy
++endef
++
++$(eval $(call BuildPackage,tcpproxy))
+diff --git a/feeds/packages/net/tcpproxy/files/tcpproxy.config b/feeds/packages/net/tcpproxy/files/tcpproxy.config
+new file mode 100644
+index 0000000..cd3f67c
+--- /dev/null
++++ b/feeds/packages/net/tcpproxy/files/tcpproxy.config
+@@ -0,0 +1,26 @@
++config tcpproxy
++ option username 'nobody'
++ option groupname 'nogroup'
++# option chroot "/var/run/tcpproxy"
++# option log 'syslog:3,tcpproxy,daemon'
++
++config listen
++ option disabled 1
++
++ option local_port '8000'
++ option resolv 'ipv4'
++
++ option remote_addr 'www.google.at'
++ option remote_port '80'
++ option remote_resolv 'ipv6'
++ option source_addr '2a02:3e0:2002:1:215:58ff:fe31:2ce7'
++
++config listen
++ option disabled 1
++
++ option local_addr '2a02:3e0:2002:1:215:58ff:fe31:2ce7'
++ option local_port '1234'
++
++ option remote_addr 'www.google.at'
++ option remote_port '80'
++ option remote_resolv 'ipv4'
+diff --git a/feeds/packages/net/tcpproxy/files/tcpproxy.init b/feeds/packages/net/tcpproxy/files/tcpproxy.init
+new file mode 100644
+index 0000000..4587a1c
+--- /dev/null
++++ b/feeds/packages/net/tcpproxy/files/tcpproxy.init
+@@ -0,0 +1,96 @@
++#!/bin/sh /etc/rc.common
++START=50
++
++BIN=tcpproxy
++DAEMON=/usr/bin/$BIN
++DAEMON_ARGS=""
++DESC=$BIN
++RUN_D=/var/run
++CONFIG_DIR=/var/etc
++CONFIG_FILE=$CONFIG_DIR/$BIN.conf
++
++tcpproxy_write_config() {
++ local cfg="$1"
++
++ config_get_bool value "$cfg" disabled 0
++ [ "$value" -ne 0 ] && return
++
++ local local_addr=""
++ local resolv=""
++ local local_port=""
++ local remote_addr=""
++ local remote_resolv=""
++ local remote_port=""
++ local source_addr=""
++
++ config_get local_addr "$cfg" local_addr
++ config_get local_port "$cfg" local_port
++ config_get resolv "$cfg" resolv
++ config_get remote_addr "$cfg" remote_addr
++ config_get remote_port "$cfg" remote_port
++ config_get remote_resolv "$cfg" remote_resolv
++ config_get source_addr "$cfg" source_addr
++
++ if [ -z "$local_addr" ]; then
++ local_addr="*"
++ fi
++
++ echo "listen $local_addr $local_port" >> $CONFIG_FILE
++ echo "{" >> $CONFIG_FILE
++ if [ -n "$resolv" ]; then
++ echo " resolv: $resolv;" >> $CONFIG_FILE
++ fi
++ echo " remote: $remote_addr $remote_port;" >> $CONFIG_FILE
++ if [ -n "$remote_resolv" ]; then
++ echo " remote-resolv: $remote_resolv;" >> $CONFIG_FILE
++ fi
++ if [ -n "$source_addr" ]; then
++ echo " source: $source_addr;" >> $CONFIG_FILE
++ fi
++ echo "};" >> $CONFIG_FILE
++ echo "" >> $CONFIG_FILE
++}
++
++tcpproxy_generate_args() {
++ local cfg="$1"
++ local option
++ local value
++
++ for option in username groupname chroot log
++ do
++ config_get value "$cfg" "$option"
++ option=`echo $option | tr '_' '-'`
++ if [ -n "$value" ]; then
++ DAEMON_ARGS="$DAEMON_ARGS --$option $value"
++ fi
++ done
++}
++
++tcpproxy_rebuild_config() {
++ mkdir -p $CONFIG_DIR
++ rm -f $CONFIG_FILE
++ touch $CONFIG_FILE
++ config_load $BIN
++ config_foreach tcpproxy_write_config listen
++}
++
++start() {
++ echo -n "Starting $DESC "
++ tcpproxy_rebuild_config
++ config_foreach tcpproxy_generate_args $BIN
++ $DAEMON $DAEMON_ARGS --config $CONFIG_FILE --write-pid "$RUN_D/$BIN.pid"
++ echo "."
++}
++
++reload() {
++ echo -n "Reloading $DESC "
++ tcpproxy_rebuild_config
++ kill -SIGHUP `cat "$RUN_D/$BIN.pid"`
++ echo "."
++}
++
++stop() {
++ echo -n "Stopping $DESC "
++ kill `cat $RUN_D/$BIN.pid` > /dev/null 2>&1
++ echo "."
++}
+diff --git a/feeds/packages/net/tcpproxy/patches/001-ragel_generated.patch b/feeds/packages/net/tcpproxy/patches/001-ragel_generated.patch
+new file mode 100644
+index 0000000..600e602
+--- /dev/null
++++ b/feeds/packages/net/tcpproxy/patches/001-ragel_generated.patch
+@@ -0,0 +1,1378 @@
++diff -Nur tcpproxy-1.2.orig/src/cfg_parser.c tcpproxy-1.2/src/cfg_parser.c
++--- tcpproxy-1.2.orig/src/cfg_parser.c 1970-01-01 01:00:00.000000000 +0100
+++++ tcpproxy-1.2/src/cfg_parser.c 2015-05-17 18:10:54.933307372 +0200
++@@ -0,0 +1,1374 @@
+++
+++#line 1 "cfg_parser.rl"
+++/*
+++ * tcpproxy
+++ *
+++ * tcpproxy is a simple tcp connection proxy which combines the
+++ * features of rinetd and 6tunnel. tcpproxy supports IPv4 and
+++ * IPv6 and also supports connections from IPv6 to IPv4
+++ * endpoints and vice versa.
+++ *
+++ *
+++ * Copyright (C) 2010-2015 Christian Pointner <equinox@spreadspace.org>
+++ *
+++ * This file is part of tcpproxy.
+++ *
+++ * tcpproxy is free software: you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License as published by
+++ * the Free Software Foundation, either version 3 of the License, or
+++ * any later version.
+++ *
+++ * tcpproxy is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU General Public License for more details.
+++ *
+++ * You should have received a copy of the GNU General Public License
+++ * along with tcpproxy. If not, see <http://www.gnu.org/licenses/>.
+++ */
+++
+++#include <stdlib.h>
+++#include <string.h>
+++#include <errno.h>
+++#include <sys/types.h>
+++#include <sys/stat.h>
+++#include <fcntl.h>
+++#include <unistd.h>
+++#include <sys/mman.h>
+++
+++#include "datatypes.h"
+++#include "log.h"
+++#include "options.h"
+++#include "tcp.h"
+++#include "listener.h"
+++
+++struct listener {
+++ char* la_;
+++ resolv_type_t lrt_;
+++ char* lp_;
+++ char* ra_;
+++ resolv_type_t rrt_;
+++ char* rp_;
+++ char* sa_;
+++};
+++
+++static void init_listener_struct(struct listener* l)
+++{
+++ if(!l) return;
+++
+++ l->la_ = NULL;
+++ l->lrt_ = ANY;
+++ l->lp_ = NULL;
+++ l->ra_ = NULL;
+++ l->rrt_ = ANY;
+++ l->rp_ = NULL;
+++ l->sa_ = NULL;
+++}
+++
+++static void clear_listener_struct(struct listener* l)
+++{
+++ if(!l) return;
+++
+++ if(l->la_)
+++ free(l->la_);
+++ if(l->lp_)
+++ free(l->lp_);
+++ if(l->ra_)
+++ free(l->ra_);
+++ if(l->rp_)
+++ free(l->rp_);
+++ if(l->sa_)
+++ free(l->sa_);
+++
+++ init_listener_struct(l);
+++}
+++
+++static int owrt_string(char** dest, char* start, char* end)
+++{
+++ if(!dest || start >= end)
+++ return -1;
+++
+++ if(*dest) free(*dest);
+++ int n = end - start;
+++ *dest = malloc(n+1);
+++ if(!(*dest))
+++ return -2;
+++
+++ memcpy(*dest, start, n);
+++ (*dest)[n] = 0;
+++
+++ return 0;
+++}
+++
+++
+++#line 162 "cfg_parser.rl"
+++
+++
+++
+++int parse_listener(char* p, char* pe, listeners_t* listener)
+++{
+++ int cs, ret = 0, cur_line = 1;
+++
+++
+++#line 114 "cfg_parser.c"
+++static const int cfg_parser_start = 67;
+++static const int cfg_parser_first_final = 67;
+++static const int cfg_parser_error = 0;
+++
+++static const int cfg_parser_en_main = 67;
+++
+++
+++#line 170 "cfg_parser.rl"
+++
+++#line 124 "cfg_parser.c"
+++ {
+++ cs = cfg_parser_start;
+++ }
+++
+++#line 171 "cfg_parser.rl"
+++
+++ char* cpy_start = NULL;
+++ struct listener lst;
+++ init_listener_struct(&lst);
+++
+++ char* eof = pe;
+++
+++#line 137 "cfg_parser.c"
+++ {
+++ if ( p == pe )
+++ goto _test_eof;
+++ goto _resume;
+++
+++_again:
+++ switch ( cs ) {
+++ case 67: goto st67;
+++ case 0: goto st0;
+++ case 1: goto st1;
+++ case 2: goto st2;
+++ case 3: goto st3;
+++ case 4: goto st4;
+++ case 5: goto st5;
+++ case 6: goto st6;
+++ case 7: goto st7;
+++ case 8: goto st8;
+++ case 9: goto st9;
+++ case 10: goto st10;
+++ case 11: goto st11;
+++ case 12: goto st12;
+++ case 13: goto st13;
+++ case 14: goto st14;
+++ case 15: goto st15;
+++ case 16: goto st16;
+++ case 17: goto st17;
+++ case 18: goto st18;
+++ case 19: goto st19;
+++ case 20: goto st20;
+++ case 21: goto st21;
+++ case 22: goto st22;
+++ case 23: goto st23;
+++ case 24: goto st24;
+++ case 25: goto st25;
+++ case 26: goto st26;
+++ case 27: goto st27;
+++ case 28: goto st28;
+++ case 29: goto st29;
+++ case 30: goto st30;
+++ case 31: goto st31;
+++ case 32: goto st32;
+++ case 33: goto st33;
+++ case 34: goto st34;
+++ case 35: goto st35;
+++ case 36: goto st36;
+++ case 37: goto st37;
+++ case 38: goto st38;
+++ case 39: goto st39;
+++ case 40: goto st40;
+++ case 41: goto st41;
+++ case 42: goto st42;
+++ case 43: goto st43;
+++ case 44: goto st44;
+++ case 45: goto st45;
+++ case 46: goto st46;
+++ case 47: goto st47;
+++ case 48: goto st48;
+++ case 49: goto st49;
+++ case 50: goto st50;
+++ case 51: goto st51;
+++ case 52: goto st52;
+++ case 53: goto st53;
+++ case 54: goto st54;
+++ case 55: goto st55;
+++ case 56: goto st56;
+++ case 57: goto st57;
+++ case 58: goto st58;
+++ case 59: goto st59;
+++ case 60: goto st60;
+++ case 61: goto st61;
+++ case 62: goto st62;
+++ case 63: goto st63;
+++ case 64: goto st64;
+++ case 65: goto st65;
+++ case 66: goto st66;
+++ default: break;
+++ }
+++
+++ if ( ++p == pe )
+++ goto _test_eof;
+++_resume:
+++ switch ( cs )
+++ {
+++tr1:
+++#line 127 "cfg_parser.rl"
+++ {cur_line++;}
+++ goto st67;
+++tr90:
+++#line 114 "cfg_parser.rl"
+++ {
+++ ret = listeners_add(listener, lst.la_, lst.lrt_, lst.lp_, lst.ra_, lst.rrt_, lst.rp_, lst.sa_);
+++ clear_listener_struct(&lst);
+++ }
+++ goto st67;
+++st67:
+++ if ( ++p == pe )
+++ goto _test_eof67;
+++case 67:
+++#line 236 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 10: goto tr1;
+++ case 32: goto st67;
+++ case 35: goto st1;
+++ case 108: goto st2;
+++ }
+++ if ( 9 <= (*p) && (*p) <= 13 )
+++ goto st67;
+++ goto tr2;
+++tr2:
+++#line 118 "cfg_parser.rl"
+++ {
+++ if(p == eof)
+++ log_printf(ERROR, "config file syntax error: unexpected end of file");
+++ else
+++ log_printf(ERROR, "config file syntax error at line %d", cur_line);
+++
+++ {cs = (cfg_parser_error); goto _again;}
+++ }
+++ goto st0;
+++#line 257 "cfg_parser.c"
+++st0:
+++cs = 0;
+++ goto _out;
+++st1:
+++ if ( ++p == pe )
+++ goto _test_eof1;
+++case 1:
+++ if ( (*p) == 10 )
+++ goto tr1;
+++ goto st1;
+++st2:
+++ if ( ++p == pe )
+++ goto _test_eof2;
+++case 2:
+++ if ( (*p) == 105 )
+++ goto st3;
+++ goto tr2;
+++st3:
+++ if ( ++p == pe )
+++ goto _test_eof3;
+++case 3:
+++ if ( (*p) == 115 )
+++ goto st4;
+++ goto tr2;
+++st4:
+++ if ( ++p == pe )
+++ goto _test_eof4;
+++case 4:
+++ if ( (*p) == 116 )
+++ goto st5;
+++ goto tr2;
+++st5:
+++ if ( ++p == pe )
+++ goto _test_eof5;
+++case 5:
+++ if ( (*p) == 101 )
+++ goto st6;
+++ goto tr2;
+++st6:
+++ if ( ++p == pe )
+++ goto _test_eof6;
+++case 6:
+++ if ( (*p) == 110 )
+++ goto st7;
+++ goto tr2;
+++st7:
+++ if ( ++p == pe )
+++ goto _test_eof7;
+++case 7:
+++ switch( (*p) ) {
+++ case 9: goto st8;
+++ case 32: goto st8;
+++ }
+++ goto tr2;
+++st8:
+++ if ( ++p == pe )
+++ goto _test_eof8;
+++case 8:
+++ switch( (*p) ) {
+++ case 9: goto st8;
+++ case 32: goto st8;
+++ case 42: goto st9;
+++ case 58: goto tr12;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( (*p) > 46 ) {
+++ if ( 48 <= (*p) && (*p) <= 57 )
+++ goto tr11;
+++ } else if ( (*p) >= 45 )
+++ goto tr10;
+++ } else if ( (*p) > 70 ) {
+++ if ( (*p) < 97 ) {
+++ if ( 71 <= (*p) && (*p) <= 90 )
+++ goto tr10;
+++ } else if ( (*p) > 102 ) {
+++ if ( 103 <= (*p) && (*p) <= 122 )
+++ goto tr10;
+++ } else
+++ goto tr11;
+++ } else
+++ goto tr11;
+++ goto tr2;
+++st9:
+++ if ( ++p == pe )
+++ goto _test_eof9;
+++case 9:
+++ switch( (*p) ) {
+++ case 9: goto st10;
+++ case 32: goto st10;
+++ }
+++ goto tr2;
+++tr91:
+++#line 105 "cfg_parser.rl"
+++ { ret = owrt_string(&(lst.la_), cpy_start, p); cpy_start = NULL; }
+++ goto st10;
+++st10:
+++ if ( ++p == pe )
+++ goto _test_eof10;
+++case 10:
+++#line 357 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto st10;
+++ case 32: goto st10;
+++ case 45: goto tr14;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( 48 <= (*p) && (*p) <= 57 )
+++ goto tr14;
+++ } else if ( (*p) > 90 ) {
+++ if ( 97 <= (*p) && (*p) <= 122 )
+++ goto tr14;
+++ } else
+++ goto tr14;
+++ goto tr2;
+++tr14:
+++#line 104 "cfg_parser.rl"
+++ { cpy_start = p; }
+++ goto st11;
+++st11:
+++ if ( ++p == pe )
+++ goto _test_eof11;
+++case 11:
+++#line 380 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 10: goto tr16;
+++ case 32: goto tr15;
+++ case 35: goto tr17;
+++ case 45: goto st11;
+++ case 123: goto tr19;
+++ }
+++ if ( (*p) < 48 ) {
+++ if ( 9 <= (*p) && (*p) <= 13 )
+++ goto tr15;
+++ } else if ( (*p) > 57 ) {
+++ if ( (*p) > 90 ) {
+++ if ( 97 <= (*p) && (*p) <= 122 )
+++ goto st11;
+++ } else if ( (*p) >= 65 )
+++ goto st11;
+++ } else
+++ goto st11;
+++ goto tr2;
+++tr21:
+++#line 127 "cfg_parser.rl"
+++ {cur_line++;}
+++ goto st12;
+++tr15:
+++#line 106 "cfg_parser.rl"
+++ { ret = owrt_string(&(lst.lp_), cpy_start, p); cpy_start = NULL; }
+++ goto st12;
+++tr16:
+++#line 106 "cfg_parser.rl"
+++ { ret = owrt_string(&(lst.lp_), cpy_start, p); cpy_start = NULL; }
+++#line 127 "cfg_parser.rl"
+++ {cur_line++;}
+++ goto st12;
+++st12:
+++ if ( ++p == pe )
+++ goto _test_eof12;
+++case 12:
+++#line 418 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 10: goto tr21;
+++ case 32: goto st12;
+++ case 35: goto st13;
+++ case 123: goto st14;
+++ }
+++ if ( 9 <= (*p) && (*p) <= 13 )
+++ goto st12;
+++ goto tr2;
+++tr17:
+++#line 106 "cfg_parser.rl"
+++ { ret = owrt_string(&(lst.lp_), cpy_start, p); cpy_start = NULL; }
+++ goto st13;
+++st13:
+++ if ( ++p == pe )
+++ goto _test_eof13;
+++case 13:
+++#line 436 "cfg_parser.c"
+++ if ( (*p) == 10 )
+++ goto tr21;
+++ goto st13;
+++tr24:
+++#line 127 "cfg_parser.rl"
+++ {cur_line++;}
+++ goto st14;
+++tr19:
+++#line 106 "cfg_parser.rl"
+++ { ret = owrt_string(&(lst.lp_), cpy_start, p); cpy_start = NULL; }
+++ goto st14;
+++tr48:
+++#line 110 "cfg_parser.rl"
+++ { ret = owrt_string(&(lst.rp_), cpy_start, p); cpy_start = NULL; }
+++ goto st14;
+++tr87:
+++#line 113 "cfg_parser.rl"
+++ { ret = owrt_string(&(lst.sa_), cpy_start, p); cpy_start = NULL; }
+++ goto st14;
+++st14:
+++ if ( ++p == pe )
+++ goto _test_eof14;
+++case 14:
+++#line 460 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 10: goto tr24;
+++ case 32: goto st14;
+++ case 35: goto st15;
+++ case 114: goto st16;
+++ case 115: goto st52;
+++ case 125: goto st63;
+++ }
+++ if ( 9 <= (*p) && (*p) <= 13 )
+++ goto st14;
+++ goto tr2;
+++st15:
+++ if ( ++p == pe )
+++ goto _test_eof15;
+++case 15:
+++ if ( (*p) == 10 )
+++ goto tr24;
+++ goto st15;
+++st16:
+++ if ( ++p == pe )
+++ goto _test_eof16;
+++case 16:
+++ if ( (*p) == 101 )
+++ goto st17;
+++ goto tr2;
+++st17:
+++ if ( ++p == pe )
+++ goto _test_eof17;
+++case 17:
+++ switch( (*p) ) {
+++ case 109: goto st18;
+++ case 115: goto st43;
+++ }
+++ goto tr2;
+++st18:
+++ if ( ++p == pe )
+++ goto _test_eof18;
+++case 18:
+++ if ( (*p) == 111 )
+++ goto st19;
+++ goto tr2;
+++st19:
+++ if ( ++p == pe )
+++ goto _test_eof19;
+++case 19:
+++ if ( (*p) == 116 )
+++ goto st20;
+++ goto tr2;
+++st20:
+++ if ( ++p == pe )
+++ goto _test_eof20;
+++case 20:
+++ if ( (*p) == 101 )
+++ goto st21;
+++ goto tr2;
+++st21:
+++ if ( ++p == pe )
+++ goto _test_eof21;
+++case 21:
+++ switch( (*p) ) {
+++ case 9: goto st22;
+++ case 32: goto st22;
+++ case 45: goto st31;
+++ case 58: goto st23;
+++ }
+++ goto tr2;
+++st22:
+++ if ( ++p == pe )
+++ goto _test_eof22;
+++case 22:
+++ switch( (*p) ) {
+++ case 9: goto st22;
+++ case 32: goto st22;
+++ case 58: goto st23;
+++ }
+++ goto tr2;
+++st23:
+++ if ( ++p == pe )
+++ goto _test_eof23;
+++case 23:
+++ switch( (*p) ) {
+++ case 9: goto st24;
+++ case 32: goto st24;
+++ }
+++ goto tr2;
+++st24:
+++ if ( ++p == pe )
+++ goto _test_eof24;
+++case 24:
+++ switch( (*p) ) {
+++ case 9: goto st24;
+++ case 32: goto st24;
+++ case 58: goto tr41;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( (*p) > 46 ) {
+++ if ( 48 <= (*p) && (*p) <= 57 )
+++ goto tr40;
+++ } else if ( (*p) >= 45 )
+++ goto tr39;
+++ } else if ( (*p) > 70 ) {
+++ if ( (*p) < 97 ) {
+++ if ( 71 <= (*p) && (*p) <= 90 )
+++ goto tr39;
+++ } else if ( (*p) > 102 ) {
+++ if ( 103 <= (*p) && (*p) <= 122 )
+++ goto tr39;
+++ } else
+++ goto tr40;
+++ } else
+++ goto tr40;
+++ goto tr2;
+++tr39:
+++#line 104 "cfg_parser.rl"
+++ { cpy_start = p; }
+++ goto st25;
+++st25:
+++ if ( ++p == pe )
+++ goto _test_eof25;
+++case 25:
+++#line 581 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto tr42;
+++ case 32: goto tr42;
+++ }
+++ if ( (*p) < 48 ) {
+++ if ( 45 <= (*p) && (*p) <= 46 )
+++ goto st25;
+++ } else if ( (*p) > 57 ) {
+++ if ( (*p) > 90 ) {
+++ if ( 97 <= (*p) && (*p) <= 122 )
+++ goto st25;
+++ } else if ( (*p) >= 65 )
+++ goto st25;
+++ } else
+++ goto st25;
+++ goto tr2;
+++tr42:
+++#line 109 "cfg_parser.rl"
+++ { ret = owrt_string(&(lst.ra_), cpy_start, p); cpy_start = NULL; }
+++ goto st26;
+++st26:
+++ if ( ++p == pe )
+++ goto _test_eof26;
+++case 26:
+++#line 606 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto st26;
+++ case 32: goto st26;
+++ case 45: goto tr45;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( 48 <= (*p) && (*p) <= 57 )
+++ goto tr45;
+++ } else if ( (*p) > 90 ) {
+++ if ( 97 <= (*p) && (*p) <= 122 )
+++ goto tr45;
+++ } else
+++ goto tr45;
+++ goto tr2;
+++tr45:
+++#line 104 "cfg_parser.rl"
+++ { cpy_start = p; }
+++ goto st27;
+++st27:
+++ if ( ++p == pe )
+++ goto _test_eof27;
+++case 27:
+++#line 629 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto tr46;
+++ case 32: goto tr46;
+++ case 45: goto st27;
+++ case 59: goto tr48;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( 48 <= (*p) && (*p) <= 57 )
+++ goto st27;
+++ } else if ( (*p) > 90 ) {
+++ if ( 97 <= (*p) && (*p) <= 122 )
+++ goto st27;
+++ } else
+++ goto st27;
+++ goto tr2;
+++tr46:
+++#line 110 "cfg_parser.rl"
+++ { ret = owrt_string(&(lst.rp_), cpy_start, p); cpy_start = NULL; }
+++ goto st28;
+++tr63:
+++#line 111 "cfg_parser.rl"
+++ { lst.rrt_ = IPV4_ONLY; }
+++ goto st28;
+++tr64:
+++#line 112 "cfg_parser.rl"
+++ { lst.rrt_ = IPV6_ONLY; }
+++ goto st28;
+++tr73:
+++#line 107 "cfg_parser.rl"
+++ { lst.lrt_ = IPV4_ONLY; }
+++ goto st28;
+++tr74:
+++#line 108 "cfg_parser.rl"
+++ { lst.lrt_ = IPV6_ONLY; }
+++ goto st28;
+++tr85:
+++#line 113 "cfg_parser.rl"
+++ { ret = owrt_string(&(lst.sa_), cpy_start, p); cpy_start = NULL; }
+++ goto st28;
+++st28:
+++ if ( ++p == pe )
+++ goto _test_eof28;
+++case 28:
+++#line 673 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto st28;
+++ case 32: goto st28;
+++ case 59: goto st14;
+++ }
+++ goto tr2;
+++tr40:
+++#line 104 "cfg_parser.rl"
+++ { cpy_start = p; }
+++ goto st29;
+++st29:
+++ if ( ++p == pe )
+++ goto _test_eof29;
+++case 29:
+++#line 688 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto tr42;
+++ case 32: goto tr42;
+++ case 58: goto st30;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( (*p) > 46 ) {
+++ if ( 48 <= (*p) && (*p) <= 57 )
+++ goto st29;
+++ } else if ( (*p) >= 45 )
+++ goto st25;
+++ } else if ( (*p) > 70 ) {
+++ if ( (*p) < 97 ) {
+++ if ( 71 <= (*p) && (*p) <= 90 )
+++ goto st25;
+++ } else if ( (*p) > 102 ) {
+++ if ( 103 <= (*p) && (*p) <= 122 )
+++ goto st25;
+++ } else
+++ goto st29;
+++ } else
+++ goto st29;
+++ goto tr2;
+++tr41:
+++#line 104 "cfg_parser.rl"
+++ { cpy_start = p; }
+++ goto st30;
+++st30:
+++ if ( ++p == pe )
+++ goto _test_eof30;
+++case 30:
+++#line 720 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto tr42;
+++ case 32: goto tr42;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( 48 <= (*p) && (*p) <= 58 )
+++ goto st30;
+++ } else if ( (*p) > 70 ) {
+++ if ( 97 <= (*p) && (*p) <= 102 )
+++ goto st30;
+++ } else
+++ goto st30;
+++ goto tr2;
+++st31:
+++ if ( ++p == pe )
+++ goto _test_eof31;
+++case 31:
+++ if ( (*p) == 114 )
+++ goto st32;
+++ goto tr2;
+++st32:
+++ if ( ++p == pe )
+++ goto _test_eof32;
+++case 32:
+++ if ( (*p) == 101 )
+++ goto st33;
+++ goto tr2;
+++st33:
+++ if ( ++p == pe )
+++ goto _test_eof33;
+++case 33:
+++ if ( (*p) == 115 )
+++ goto st34;
+++ goto tr2;
+++st34:
+++ if ( ++p == pe )
+++ goto _test_eof34;
+++case 34:
+++ if ( (*p) == 111 )
+++ goto st35;
+++ goto tr2;
+++st35:
+++ if ( ++p == pe )
+++ goto _test_eof35;
+++case 35:
+++ if ( (*p) == 108 )
+++ goto st36;
+++ goto tr2;
+++st36:
+++ if ( ++p == pe )
+++ goto _test_eof36;
+++case 36:
+++ if ( (*p) == 118 )
+++ goto st37;
+++ goto tr2;
+++st37:
+++ if ( ++p == pe )
+++ goto _test_eof37;
+++case 37:
+++ switch( (*p) ) {
+++ case 9: goto st37;
+++ case 32: goto st37;
+++ case 58: goto st38;
+++ }
+++ goto tr2;
+++st38:
+++ if ( ++p == pe )
+++ goto _test_eof38;
+++case 38:
+++ switch( (*p) ) {
+++ case 9: goto st39;
+++ case 32: goto st39;
+++ }
+++ goto tr2;
+++st39:
+++ if ( ++p == pe )
+++ goto _test_eof39;
+++case 39:
+++ switch( (*p) ) {
+++ case 9: goto st39;
+++ case 32: goto st39;
+++ case 73: goto st40;
+++ case 105: goto st40;
+++ }
+++ goto tr2;
+++st40:
+++ if ( ++p == pe )
+++ goto _test_eof40;
+++case 40:
+++ switch( (*p) ) {
+++ case 80: goto st41;
+++ case 112: goto st41;
+++ }
+++ goto tr2;
+++st41:
+++ if ( ++p == pe )
+++ goto _test_eof41;
+++case 41:
+++ switch( (*p) ) {
+++ case 86: goto st42;
+++ case 118: goto st42;
+++ }
+++ goto tr2;
+++st42:
+++ if ( ++p == pe )
+++ goto _test_eof42;
+++case 42:
+++ switch( (*p) ) {
+++ case 52: goto tr63;
+++ case 54: goto tr64;
+++ }
+++ goto tr2;
+++st43:
+++ if ( ++p == pe )
+++ goto _test_eof43;
+++case 43:
+++ if ( (*p) == 111 )
+++ goto st44;
+++ goto tr2;
+++st44:
+++ if ( ++p == pe )
+++ goto _test_eof44;
+++case 44:
+++ if ( (*p) == 108 )
+++ goto st45;
+++ goto tr2;
+++st45:
+++ if ( ++p == pe )
+++ goto _test_eof45;
+++case 45:
+++ if ( (*p) == 118 )
+++ goto st46;
+++ goto tr2;
+++st46:
+++ if ( ++p == pe )
+++ goto _test_eof46;
+++case 46:
+++ switch( (*p) ) {
+++ case 9: goto st46;
+++ case 32: goto st46;
+++ case 58: goto st47;
+++ }
+++ goto tr2;
+++st47:
+++ if ( ++p == pe )
+++ goto _test_eof47;
+++case 47:
+++ switch( (*p) ) {
+++ case 9: goto st48;
+++ case 32: goto st48;
+++ }
+++ goto tr2;
+++st48:
+++ if ( ++p == pe )
+++ goto _test_eof48;
+++case 48:
+++ switch( (*p) ) {
+++ case 9: goto st48;
+++ case 32: goto st48;
+++ case 73: goto st49;
+++ case 105: goto st49;
+++ }
+++ goto tr2;
+++st49:
+++ if ( ++p == pe )
+++ goto _test_eof49;
+++case 49:
+++ switch( (*p) ) {
+++ case 80: goto st50;
+++ case 112: goto st50;
+++ }
+++ goto tr2;
+++st50:
+++ if ( ++p == pe )
+++ goto _test_eof50;
+++case 50:
+++ switch( (*p) ) {
+++ case 86: goto st51;
+++ case 118: goto st51;
+++ }
+++ goto tr2;
+++st51:
+++ if ( ++p == pe )
+++ goto _test_eof51;
+++case 51:
+++ switch( (*p) ) {
+++ case 52: goto tr73;
+++ case 54: goto tr74;
+++ }
+++ goto tr2;
+++st52:
+++ if ( ++p == pe )
+++ goto _test_eof52;
+++case 52:
+++ if ( (*p) == 111 )
+++ goto st53;
+++ goto tr2;
+++st53:
+++ if ( ++p == pe )
+++ goto _test_eof53;
+++case 53:
+++ if ( (*p) == 117 )
+++ goto st54;
+++ goto tr2;
+++st54:
+++ if ( ++p == pe )
+++ goto _test_eof54;
+++case 54:
+++ if ( (*p) == 114 )
+++ goto st55;
+++ goto tr2;
+++st55:
+++ if ( ++p == pe )
+++ goto _test_eof55;
+++case 55:
+++ if ( (*p) == 99 )
+++ goto st56;
+++ goto tr2;
+++st56:
+++ if ( ++p == pe )
+++ goto _test_eof56;
+++case 56:
+++ if ( (*p) == 101 )
+++ goto st57;
+++ goto tr2;
+++st57:
+++ if ( ++p == pe )
+++ goto _test_eof57;
+++case 57:
+++ switch( (*p) ) {
+++ case 9: goto st57;
+++ case 32: goto st57;
+++ case 58: goto st58;
+++ }
+++ goto tr2;
+++st58:
+++ if ( ++p == pe )
+++ goto _test_eof58;
+++case 58:
+++ switch( (*p) ) {
+++ case 9: goto st59;
+++ case 32: goto st59;
+++ }
+++ goto tr2;
+++st59:
+++ if ( ++p == pe )
+++ goto _test_eof59;
+++case 59:
+++ switch( (*p) ) {
+++ case 9: goto st59;
+++ case 32: goto st59;
+++ case 58: goto tr84;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( (*p) > 46 ) {
+++ if ( 48 <= (*p) && (*p) <= 57 )
+++ goto tr83;
+++ } else if ( (*p) >= 45 )
+++ goto tr82;
+++ } else if ( (*p) > 70 ) {
+++ if ( (*p) < 97 ) {
+++ if ( 71 <= (*p) && (*p) <= 90 )
+++ goto tr82;
+++ } else if ( (*p) > 102 ) {
+++ if ( 103 <= (*p) && (*p) <= 122 )
+++ goto tr82;
+++ } else
+++ goto tr83;
+++ } else
+++ goto tr83;
+++ goto tr2;
+++tr82:
+++#line 104 "cfg_parser.rl"
+++ { cpy_start = p; }
+++ goto st60;
+++st60:
+++ if ( ++p == pe )
+++ goto _test_eof60;
+++case 60:
+++#line 1000 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto tr85;
+++ case 32: goto tr85;
+++ case 59: goto tr87;
+++ }
+++ if ( (*p) < 48 ) {
+++ if ( 45 <= (*p) && (*p) <= 46 )
+++ goto st60;
+++ } else if ( (*p) > 57 ) {
+++ if ( (*p) > 90 ) {
+++ if ( 97 <= (*p) && (*p) <= 122 )
+++ goto st60;
+++ } else if ( (*p) >= 65 )
+++ goto st60;
+++ } else
+++ goto st60;
+++ goto tr2;
+++tr83:
+++#line 104 "cfg_parser.rl"
+++ { cpy_start = p; }
+++ goto st61;
+++st61:
+++ if ( ++p == pe )
+++ goto _test_eof61;
+++case 61:
+++#line 1026 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto tr85;
+++ case 32: goto tr85;
+++ case 58: goto st62;
+++ case 59: goto tr87;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( (*p) > 46 ) {
+++ if ( 48 <= (*p) && (*p) <= 57 )
+++ goto st61;
+++ } else if ( (*p) >= 45 )
+++ goto st60;
+++ } else if ( (*p) > 70 ) {
+++ if ( (*p) < 97 ) {
+++ if ( 71 <= (*p) && (*p) <= 90 )
+++ goto st60;
+++ } else if ( (*p) > 102 ) {
+++ if ( 103 <= (*p) && (*p) <= 122 )
+++ goto st60;
+++ } else
+++ goto st61;
+++ } else
+++ goto st61;
+++ goto tr2;
+++tr84:
+++#line 104 "cfg_parser.rl"
+++ { cpy_start = p; }
+++ goto st62;
+++st62:
+++ if ( ++p == pe )
+++ goto _test_eof62;
+++case 62:
+++#line 1059 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto tr85;
+++ case 32: goto tr85;
+++ case 59: goto tr87;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( 48 <= (*p) && (*p) <= 58 )
+++ goto st62;
+++ } else if ( (*p) > 70 ) {
+++ if ( 97 <= (*p) && (*p) <= 102 )
+++ goto st62;
+++ } else
+++ goto st62;
+++ goto tr2;
+++st63:
+++ if ( ++p == pe )
+++ goto _test_eof63;
+++case 63:
+++ if ( (*p) == 59 )
+++ goto tr90;
+++ goto tr2;
+++tr10:
+++#line 104 "cfg_parser.rl"
+++ { cpy_start = p; }
+++ goto st64;
+++st64:
+++ if ( ++p == pe )
+++ goto _test_eof64;
+++case 64:
+++#line 1089 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto tr91;
+++ case 32: goto tr91;
+++ }
+++ if ( (*p) < 48 ) {
+++ if ( 45 <= (*p) && (*p) <= 46 )
+++ goto st64;
+++ } else if ( (*p) > 57 ) {
+++ if ( (*p) > 90 ) {
+++ if ( 97 <= (*p) && (*p) <= 122 )
+++ goto st64;
+++ } else if ( (*p) >= 65 )
+++ goto st64;
+++ } else
+++ goto st64;
+++ goto tr2;
+++tr11:
+++#line 104 "cfg_parser.rl"
+++ { cpy_start = p; }
+++ goto st65;
+++st65:
+++ if ( ++p == pe )
+++ goto _test_eof65;
+++case 65:
+++#line 1114 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto tr91;
+++ case 32: goto tr91;
+++ case 58: goto st66;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( (*p) > 46 ) {
+++ if ( 48 <= (*p) && (*p) <= 57 )
+++ goto st65;
+++ } else if ( (*p) >= 45 )
+++ goto st64;
+++ } else if ( (*p) > 70 ) {
+++ if ( (*p) < 97 ) {
+++ if ( 71 <= (*p) && (*p) <= 90 )
+++ goto st64;
+++ } else if ( (*p) > 102 ) {
+++ if ( 103 <= (*p) && (*p) <= 122 )
+++ goto st64;
+++ } else
+++ goto st65;
+++ } else
+++ goto st65;
+++ goto tr2;
+++tr12:
+++#line 104 "cfg_parser.rl"
+++ { cpy_start = p; }
+++ goto st66;
+++st66:
+++ if ( ++p == pe )
+++ goto _test_eof66;
+++case 66:
+++#line 1146 "cfg_parser.c"
+++ switch( (*p) ) {
+++ case 9: goto tr91;
+++ case 32: goto tr91;
+++ }
+++ if ( (*p) < 65 ) {
+++ if ( 48 <= (*p) && (*p) <= 58 )
+++ goto st66;
+++ } else if ( (*p) > 70 ) {
+++ if ( 97 <= (*p) && (*p) <= 102 )
+++ goto st66;
+++ } else
+++ goto st66;
+++ goto tr2;
+++ }
+++ _test_eof67: cs = 67; goto _test_eof;
+++ _test_eof1: cs = 1; goto _test_eof;
+++ _test_eof2: cs = 2; goto _test_eof;
+++ _test_eof3: cs = 3; goto _test_eof;
+++ _test_eof4: cs = 4; goto _test_eof;
+++ _test_eof5: cs = 5; goto _test_eof;
+++ _test_eof6: cs = 6; goto _test_eof;
+++ _test_eof7: cs = 7; goto _test_eof;
+++ _test_eof8: cs = 8; goto _test_eof;
+++ _test_eof9: cs = 9; goto _test_eof;
+++ _test_eof10: cs = 10; goto _test_eof;
+++ _test_eof11: cs = 11; goto _test_eof;
+++ _test_eof12: cs = 12; goto _test_eof;
+++ _test_eof13: cs = 13; goto _test_eof;
+++ _test_eof14: cs = 14; goto _test_eof;
+++ _test_eof15: cs = 15; goto _test_eof;
+++ _test_eof16: cs = 16; goto _test_eof;
+++ _test_eof17: cs = 17; goto _test_eof;
+++ _test_eof18: cs = 18; goto _test_eof;
+++ _test_eof19: cs = 19; goto _test_eof;
+++ _test_eof20: cs = 20; goto _test_eof;
+++ _test_eof21: cs = 21; goto _test_eof;
+++ _test_eof22: cs = 22; goto _test_eof;
+++ _test_eof23: cs = 23; goto _test_eof;
+++ _test_eof24: cs = 24; goto _test_eof;
+++ _test_eof25: cs = 25; goto _test_eof;
+++ _test_eof26: cs = 26; goto _test_eof;
+++ _test_eof27: cs = 27; goto _test_eof;
+++ _test_eof28: cs = 28; goto _test_eof;
+++ _test_eof29: cs = 29; goto _test_eof;
+++ _test_eof30: cs = 30; goto _test_eof;
+++ _test_eof31: cs = 31; goto _test_eof;
+++ _test_eof32: cs = 32; goto _test_eof;
+++ _test_eof33: cs = 33; goto _test_eof;
+++ _test_eof34: cs = 34; goto _test_eof;
+++ _test_eof35: cs = 35; goto _test_eof;
+++ _test_eof36: cs = 36; goto _test_eof;
+++ _test_eof37: cs = 37; goto _test_eof;
+++ _test_eof38: cs = 38; goto _test_eof;
+++ _test_eof39: cs = 39; goto _test_eof;
+++ _test_eof40: cs = 40; goto _test_eof;
+++ _test_eof41: cs = 41; goto _test_eof;
+++ _test_eof42: cs = 42; goto _test_eof;
+++ _test_eof43: cs = 43; goto _test_eof;
+++ _test_eof44: cs = 44; goto _test_eof;
+++ _test_eof45: cs = 45; goto _test_eof;
+++ _test_eof46: cs = 46; goto _test_eof;
+++ _test_eof47: cs = 47; goto _test_eof;
+++ _test_eof48: cs = 48; goto _test_eof;
+++ _test_eof49: cs = 49; goto _test_eof;
+++ _test_eof50: cs = 50; goto _test_eof;
+++ _test_eof51: cs = 51; goto _test_eof;
+++ _test_eof52: cs = 52; goto _test_eof;
+++ _test_eof53: cs = 53; goto _test_eof;
+++ _test_eof54: cs = 54; goto _test_eof;
+++ _test_eof55: cs = 55; goto _test_eof;
+++ _test_eof56: cs = 56; goto _test_eof;
+++ _test_eof57: cs = 57; goto _test_eof;
+++ _test_eof58: cs = 58; goto _test_eof;
+++ _test_eof59: cs = 59; goto _test_eof;
+++ _test_eof60: cs = 60; goto _test_eof;
+++ _test_eof61: cs = 61; goto _test_eof;
+++ _test_eof62: cs = 62; goto _test_eof;
+++ _test_eof63: cs = 63; goto _test_eof;
+++ _test_eof64: cs = 64; goto _test_eof;
+++ _test_eof65: cs = 65; goto _test_eof;
+++ _test_eof66: cs = 66; goto _test_eof;
+++
+++ _test_eof: {}
+++ if ( p == eof )
+++ {
+++ switch ( cs ) {
+++ case 1:
+++ case 2:
+++ case 3:
+++ case 4:
+++ case 5:
+++ case 6:
+++ case 7:
+++ case 8:
+++ case 9:
+++ case 10:
+++ case 11:
+++ case 12:
+++ case 13:
+++ case 14:
+++ case 15:
+++ case 16:
+++ case 17:
+++ case 18:
+++ case 19:
+++ case 20:
+++ case 21:
+++ case 22:
+++ case 23:
+++ case 24:
+++ case 25:
+++ case 26:
+++ case 27:
+++ case 28:
+++ case 29:
+++ case 30:
+++ case 31:
+++ case 32:
+++ case 33:
+++ case 34:
+++ case 35:
+++ case 36:
+++ case 37:
+++ case 38:
+++ case 39:
+++ case 40:
+++ case 41:
+++ case 42:
+++ case 43:
+++ case 44:
+++ case 45:
+++ case 46:
+++ case 47:
+++ case 48:
+++ case 49:
+++ case 50:
+++ case 51:
+++ case 52:
+++ case 53:
+++ case 54:
+++ case 55:
+++ case 56:
+++ case 57:
+++ case 58:
+++ case 59:
+++ case 60:
+++ case 61:
+++ case 62:
+++ case 63:
+++ case 64:
+++ case 65:
+++ case 66:
+++#line 118 "cfg_parser.rl"
+++ {
+++ if(p == eof)
+++ log_printf(ERROR, "config file syntax error: unexpected end of file");
+++ else
+++ log_printf(ERROR, "config file syntax error at line %d", cur_line);
+++
+++ {cs = (cfg_parser_error); goto _again;}
+++ }
+++ break;
+++#line 1309 "cfg_parser.c"
+++ }
+++ }
+++
+++ _out: {}
+++ }
+++
+++#line 178 "cfg_parser.rl"
+++
+++ if(cs == cfg_parser_error) {
+++ listeners_revert(listener);
+++ ret = 1;
+++ }
+++ else
+++ ret = listeners_update(listener);
+++
+++ clear_listener_struct(&lst);
+++
+++ return ret;
+++}
+++
+++int read_configfile(const char* filename, listeners_t* listener)
+++{
+++ int fd = open(filename, 0);
+++ if(fd < 0) {
+++ log_printf(ERROR, "open('%s') failed: %s", filename, strerror(errno));
+++ return -1;
+++ }
+++
+++ struct stat sb;
+++ if(fstat(fd, &sb) == -1) {
+++ log_printf(ERROR, "fstat() error: %s", strerror(errno));
+++ close(fd);
+++ return -1;
+++ }
+++
+++ if(!sb.st_size) {
+++ log_printf(ERROR, "config file %s is empty", filename);
+++ close(fd);
+++ return -1;
+++ }
+++
+++ if(!S_ISREG(sb.st_mode)) {
+++ log_printf(ERROR, "config file %s is not a regular file", filename);
+++ close(fd);
+++ return -1;
+++ }
+++
+++ char* p = (char*)mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);
+++ if(p == MAP_FAILED) {
+++ log_printf(ERROR, "mmap() error: %s", strerror(errno));
+++ close(fd);
+++ return -1;
+++ }
+++ close(fd);
+++
+++ log_printf(DEBUG, "mapped %ld bytes from file %s at address 0x%08lX", sb.st_size, filename, p);
+++ int ret = parse_listener(p, p + sb.st_size, listener);
+++
+++ if(munmap(p, sb.st_size) == -1) {
+++ log_printf(ERROR, "munmap() error: %s", strerror(errno));
+++ return -1;
+++ }
+++ log_printf(DEBUG, "unmapped file %s", filename);
+++
+++ return ret;
+++}
+diff --git a/feeds/packages/net/tgt/Makefile b/feeds/packages/net/tgt/Makefile
+new file mode 100644
+index 0000000..77e5180
+--- /dev/null
++++ b/feeds/packages/net/tgt/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2012-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tgt
++PKG_VERSION:=1.0.53
++PKG_REV:=9764e0afd9a7115e356fc85569a780f9003c4eac
++PKG_RELEASE:=4
++PKG_USE_MIPS16:=0
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/fujita/tgt.git
++
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_REV).tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
++PKG_LICENSE:=GPL-2.0
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tgt
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://stgt.sourceforge.net/
++ TITLE:=userspace iSCSI target
++ DEPENDS:=+libpthread +libaio +@KERNEL_AIO +@KERNEL_DIRECT_IO
++endef
++
++define Package/tgt/description
++Linux SCSI target framework (tgt) aims to simplify various SCSI target driver (iSCSI, Fibre Channel, SRP, etc) creation and maintenance.
++Key goals of the project are the clean integration into the scsi-mid layer and implementing a great portion of tgt in user space.
++Tgt consists of kernel-space and user-space code. The kernel-space component is included in upstream as of 2.6.20.
++Note that if you are interested in only iSCSI (probably you are), you need only the user-space code (any kernel version is fine).
++endef
++
++define Build/Compile
++ CC=$(TARGET_CC) CFLAGS="$(TARGET_CFLAGS)" $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ LD="$(TARGET_CC)" \
++ install-programs
++endef
++
++define Package/tgt/conffiles
++/etc/config/tgt
++endef
++
++define Package/tgt/install
++ $(INSTALL_DIR) $(1)/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) ./files/* $(1)/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/tgtd $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/tgtadm $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,tgt))
+diff --git a/feeds/packages/net/tgt/files/etc/config/tgt b/feeds/packages/net/tgt/files/etc/config/tgt
+new file mode 100644
+index 0000000..a721c71
+--- /dev/null
++++ b/feeds/packages/net/tgt/files/etc/config/tgt
+@@ -0,0 +1,64 @@
++config options 'tgt'
++# iothreads limits number of worker threads per rdwr target, default is 16
++# which seems to be too much for an avarage router
++ option iothreads '2'
++# option nop_count '3'
++# option nop_interval '1'
++# list portal '[::1]'
++# list portal '127.0.0.1:3261'
++# list portal '0.0.0.0:3262'
++# list portal '[::]:3263'
++
++config target 1
++ option name 'iqn.2012-06.org.openwrt:target1'
++# list allow_name 'iqn.1994-05.org.example:fedcba987654'
++# list allow_address '192.168.2.128/27'
++
++#config target 2
++# option name 'iqn.2012-06.org.openwrt:t2'
++
++# all options are set to default, except for the device
++# lun "name" is constructed as TGTID_LUN
++#config lun 1_1
++# option 'device' '/dev/sda'
++# type of scsi device. available options: disk, cd, pt (sg passthrough)
++# option 'type' 'disk'
++# backing store access method: rdwr (read-write), aio (async IO), sg (for pt type only, device must be /dev/sgN)
++# option 'bstype' 'aio'
++# set sync and/or direct flags when opening device, affect only rdwr
++# option 'sync' '0'
++# option 'direct' '0'
++# block size for lun, default is 512
++# option 'blocksize' 4096
++# override SCSI mode page, see tgtadm man page for details
++# option 'mode_page' 'string'
++# vendor, product, revision, SCSI ID and SCSI Serial number
++# option 'vendor_id' 'string'
++# option 'product_id' 'string'
++# option 'product_rev' 'string'
++# option 'scsi_id' 'string'
++# option 'scsi_sn' 'string'
++# refuse write attempts. applies only to disk type
++# option 'readonly' '0'
++# Disk devices default to non-removable, cd - to removable
++# option 'removable' '0'
++# 0 = Clasic sense format, 1 = Support descriptor format.
++# option 'sense_format' '0'
++
++#config lun 2_1
++# option device /mnt/iscsi.img
++
++#config lun 2_2
++# option device /dev/sdc
++
++#config account
++# list target 1
++# list target 2
++# option user "username1"
++# option password "pass1"
++
++#config account
++# option target 2
++# option user "user2"
++# option password "pwd2"
++# option outgoing 1
+diff --git a/feeds/packages/net/tgt/files/etc/init.d/tgt b/feeds/packages/net/tgt/files/etc/init.d/tgt
+new file mode 100755
+index 0000000..bd5f983
+--- /dev/null
++++ b/feeds/packages/net/tgt/files/etc/init.d/tgt
+@@ -0,0 +1,237 @@
++#!/bin/sh /etc/rc.common
++START=91
++STOP=10
++
++EXTRA_COMMANDS="show"
++EXTRA_HELP=" show Show current configuration of tgtd"
++
++NAME=tgt
++PROG=/usr/sbin/tgtd
++USE_PROCD=1
++
++tgtadm="/usr/sbin/tgtadm --lld iscsi"
++logger="logger -p daemon.err -s -t $NAME"
++
++validate_lun_section() {
++ uci_validate_section tgt lun $1 \
++ 'device:or(file, device)' \
++ 'type:or("disk", "cd", "pt"):disk' \
++ 'bstype:or("rdwr", "aio", "sg"):rdwr' \
++ 'sync:bool:0' \
++ 'direct:bool:0' \
++ 'blocksize:uinteger' \
++ 'mode_page:string' \
++ 'product_id:string' \
++ 'product_rev:string' \
++ 'readonly:bool:0' \
++ 'removable:bool' \
++ 'scsi_id:string' \
++ 'scsi_sn:string' \
++ 'sense_format:range(0, 1)' \
++ 'vendor_id:string'
++}
++
++handle_lun() {
++ local tgt_lun=$1
++ local tgtid=$2
++ local readonly device type bstype sync direct
++ local my_tgtid=${tgt_lun%_*}
++ local lun=${tgt_lun#*_}
++
++ [ $my_tgtid -eq $tgtid ] || return 0
++
++ validate_lun_section $tgt_lun || {
++ $logger "Validation failed for LUN $tgt_lun"
++ return 1
++ }
++ [ "$device" ] || {
++ $logger "Device is required for target $tgt_lun"
++ return 1
++ }
++
++ if [ $sync -ne 0 -o $direct -ne 0 ]; then
++ local bsoflags
++ [ $sync -ne 0 ] && bsoflags="sync"
++ [ $direct -ne 0 ] && bsoflags="direct"
++ [ $sync -ne 0 -a $direct -ne 0 ] && bsoflags="sync:direct"
++ bsoflags="--bsoflags $bsoflags"
++ fi
++
++ blocksize=${blocksize+--blocksize=$blocksize}
++ local params='' i
++ for i in mode_page product_id product_rev readonly removable scsi_id scsi_sn sense_format vendor_id; do
++ eval params=\${$i+$i=\$$i,}\$params
++ done
++
++ local _tgtadm="$tgtadm --mode logicalunit --tid $tgtid --lun $lun"
++ $_tgtadm --op new --backing-store $device --device-type $type --bstype $bstype --bstype $bstype $bsoflags $blocksize || {
++ $logger "Failed to create lun $tgt_lun"
++ return 1
++ }
++ $_tgtadm --op update --param $params || {
++ $logger "Failed to update lun $tgt_lun"
++ return 1
++ }
++}
++
++validate_account_section () {
++ uci_validate_section tgt account $1 \
++ 'target:list(uinteger)' \
++ 'user:string' \
++ 'password:string' \
++ 'outgoing:bool:0'
++}
++
++handle_account() {
++ local _tgtadm="$tgtadm --mode account"
++ local user password target outgoing
++
++ validate_account_section $1 || {
++ $logger "Validation failed for account ${user:-$1}"
++ return 1
++ }
++ [ "$user" ] || {
++ $logger "User is required for account $1. Run 'uci show tgt.$1' and check options"
++ return 1
++ }
++ [ "$target" ] || {
++ $logger "Target is required for account $user"
++ return 1
++ }
++ [ "$password" ] || {
++ $logger "Password is required for account $user"
++ return 1
++ }
++ $_tgtadm --op new --user "$user" --password "$password" || {
++ $logger "Failed to create user $username"
++ return 1
++ }
++}
++
++bind_account_to_target() {
++ local _tgtadm="$tgtadm --mode account"
++ local tgtid=$2 user password outgoing
++
++ validate_account_section $1 || {
++ $logger "Validation failed for account ${user:-$1}"
++ return 1
++ }
++
++ [ "$outgoing" -ne 0 ] && outgoing=--outgoing || outgoing=""
++ local t
++ for t in $target; do
++ [ "$t" -eq "$tgtid" ] && {
++ $_tgtadm --op bind --tid $tgtid --user "$user" $outgoing || {
++ $logger "Failed to bind user $username to target $tgtid"
++ return 1
++ }
++ }
++ done
++ return 0
++}
++
++validate_target_section() {
++ uci_validate_section tgt target $1 \
++ 'name:string:iqn.2012-06.org.openwrt' \
++ 'allow_address:list(string):ALL' \
++ 'allow_name:list(string)'
++}
++
++handle_target() {
++ local tgtid=$1
++ local _tgtadm="$tgtadm --mode target"
++ local name allow
++
++ [ $tgtid -ge 0 ] || return 1
++ validate_target_section $tgtid || {
++ $logger "Validation failed for target $tgtid"
++ return 1
++ }
++ $_tgtadm --op new --tid $tgtid --targetname $name || {
++ $logger "Failed to create target $tgtid"
++ return 1
++ }
++ local i
++ for i in $allow_address; do
++ $_tgtadm --op bind --tid $tgtid --initiator-address $i || {
++ $logger "Failed to set allow $i to connect to target $tgtid"
++ return 1
++ }
++ done
++ for i in $allow_name; do
++ $_tgtadm --op bind --tid $tgtid --initiator-name $i || {
++ $logger "Failed to set allow $i to connect to target $tgtid"
++ return 1
++ }
++ done
++ config_foreach handle_lun lun $tgtid || return 1
++ config_foreach bind_account_to_target account $tgtid || return 1
++}
++
++configure() {
++ config_load $NAME
++ $tgtadm --mode sys --op update --name State -v offline || {
++ $logger "Failed to set system state to Offline"
++ return 1
++ }
++ config_foreach handle_account account || return 1
++ config_foreach handle_target target || return 1
++ $tgtadm --mode sys --op update --name State -v ready || {
++ $logger "Failed to set system state to Ready"
++ return 1
++ }
++ return 0
++}
++
++validate_tgt_section() {
++ uci_validate_section tgt options $1 \
++ 'iothreads:uinteger' \
++ 'portal:list(string)' \
++ 'nop_interval:uinteger' \
++ 'nop_count:uinteger'
++}
++
++start_service() {
++ local iothreads portal nop_interval nop_count
++ validate_tgt_section tgt || {
++ $logger "Validation failed for tgt options"
++ return 1
++ }
++ procd_open_instance
++ procd_set_param command $PROG -f
++ [ "$iothreads" ] && procd_append_param command -t $iothreads
++ [ "${portal}${nop_interval}${nop_count}" ] && {
++ local iscsi="" i
++ for i in nop_interval nop_count; do
++ eval iscsi=\${$i+$i=\$$i,}\$iscsi
++ done
++ for i in $portal; do
++ iscsi="portal=$i,$iscsi"
++ done
++ procd_append_param command --iscsi $iscsi
++ }
++ procd_set_param respawn
++ procd_close_instance
++ logger -p daemon.info -t $NAME -s "Configuration will be loaded in seconds"
++ ( sleep 5; configure || { stop_service; exit 1; } ) &
++}
++
++stop_service() {
++ $tgtadm --mode sys --op update --name State -v offline || {
++ $logger "Failed to set system state to Offline"
++ return 1
++ }
++ $tgtadm --mode target --op show \
++ | awk '$1 == "Target" {sub(/:/,"",$2); print $2}' \
++ | xargs -r -n1 $tgtadm --mode target --op delete --force --tid
++ $tgtadm --mode sys --op delete
++}
++
++reload_service() {
++ stop_service
++ start_service
++}
++
++show() {
++ $tgtadm --mode target --op show
++}
+diff --git a/feeds/packages/net/tgt/patches/010-fallocate.patch b/feeds/packages/net/tgt/patches/010-fallocate.patch
+new file mode 100644
+index 0000000..9d572d6
+--- /dev/null
++++ b/feeds/packages/net/tgt/patches/010-fallocate.patch
+@@ -0,0 +1,14 @@
++--- tgt-1.0.48.orig/usr/util.h 2014-06-04 15:03:53.000000000 +0300
+++++ tgt-1.0.48/usr/util.h 2014-06-04 15:17:48.548123039 +0300
++@@ -212,11 +212,6 @@
++ */
++ static inline int unmap_file_region(int fd, off_t offset, off_t length)
++ {
++-#ifdef FALLOC_FL_PUNCH_HOLE
++- if (fallocate(fd, FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE,
++- offset, length) == 0)
++- return 0;
++-#endif
++ return -1;
++ }
++
+diff --git a/feeds/packages/net/tgt/patches/020-usr_Makefile.patch b/feeds/packages/net/tgt/patches/020-usr_Makefile.patch
+new file mode 100644
+index 0000000..2deb305
+--- /dev/null
++++ b/feeds/packages/net/tgt/patches/020-usr_Makefile.patch
+@@ -0,0 +1,56 @@
++--- tgt-1.0.48.orig/usr/Makefile 2014-06-04 15:03:53.000000000 +0300
+++++ tgt-1.0.48/usr/Makefile 2014-06-04 15:17:56.373670618 +0300
++@@ -1,13 +1,13 @@
++ sbindir ?= $(PREFIX)/sbin
++ libdir ?= $(PREFIX)/lib/tgt
++
++-ifneq ($(shell test -e /usr/include/linux/signalfd.h && echo 1),)
+++#ifneq ($(shell test -e /usr/include/linux/signalfd.h && echo 1),)
++ CFLAGS += -DUSE_SIGNALFD
++-endif
+++#endif
++
++-ifneq ($(shell test -e /usr/include/sys/timerfd.h && echo 1),)
+++#ifneq ($(shell test -e /usr/include/sys/timerfd.h && echo 1),)
++ CFLAGS += -DUSE_TIMERFD
++-endif
+++#endif
++
++ TGTD_OBJS += $(addprefix iscsi/, conn.o param.o session.o \
++ iscsid.o target.o chap.o sha1.o md5.o transport.o iscsi_tcp.o \
++@@ -25,8 +25,9 @@
++ CFLAGS += -DUSE_SYSTEMD
++ endif
++
++-ifneq ($(shell test -e /usr/include/sys/eventfd.h && test -e /usr/include/libaio.h && echo 1),)
++-CFLAGS += -DUSE_EVENTFD
+++#ifneq ($(shell test -e /usr/include/sys/eventfd.h && test -e $(STAGING_DIR)/usr/include/libaio.h && echo 1),)
+++ifneq ((test -e $(STAGING_DIR)/usr/include/libaio.h && echo 1),)
+++CFLAGS += -DUSE_EVENTFD -I$(STAGING_DIR)/usr/include/
++ TGTD_OBJS += bs_aio.o
++ LIBS += -laio
++ endif
++@@ -55,7 +56,7 @@
++ LIBS += -lsystemd-daemon
++ endif
++
++-PROGRAMS += tgtd tgtadm tgtimg
+++PROGRAMS += tgtd tgtadm
++ TGTD_OBJS += tgtd.o mgmt.o target.o scsi.o log.o driver.o util.o work.o \
++ concat_buf.o parser.o spc.o sbc.o mmc.o osd.o scc.o smc.o \
++ ssc.o libssc.o bs_rdwr.o bs_ssc.o \
++@@ -82,14 +83,8 @@
++
++ -include $(TGTADM_DEP)
++
++-TGTIMG_OBJS = tgtimg.o libssc.o libcrc32c.o
++ TGTIMG_DEP = $(TGTIMG_OBJS:.o=.d)
++
++-tgtimg: $(TGTIMG_OBJS)
++- $(CC) $^ -o $@
++-
++--include $(TGTIMG_DEP)
++-
++ %.o: %.c
++ $(CC) -c $(CFLAGS) $*.c -o $*.o
++ @$(CC) -MM $(CFLAGS) -MF $*.d -MT $*.o $*.c
+diff --git a/feeds/packages/net/tgt/patches/030-Makefile.patch b/feeds/packages/net/tgt/patches/030-Makefile.patch
+new file mode 100644
+index 0000000..ab54f22
+--- /dev/null
++++ b/feeds/packages/net/tgt/patches/030-Makefile.patch
+@@ -0,0 +1,11 @@
++--- tgt-1.0.48.orig/Makefile 2014-06-04 15:03:53.000000000 +0300
+++++ tgt-1.0.48/Makefile 2014-06-04 15:18:13.132963670 +0300
++@@ -64,7 +64,7 @@
++ $(MAKE) -C conf clean
++
++ .PHONY: install
++-install: install-programs install-doc install-conf install-scripts
+++install: install-programs
++
++ .PHONY: rpm
++ rpm:
+diff --git a/feeds/packages/net/tgt/patches/100-musl-compat.patch b/feeds/packages/net/tgt/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..4d84955
+--- /dev/null
++++ b/feeds/packages/net/tgt/patches/100-musl-compat.patch
+@@ -0,0 +1,36 @@
++--- a/usr/tgtd.h
+++++ b/usr/tgtd.h
++@@ -9,6 +9,10 @@
++ #include <systemd/sd-daemon.h>
++ #endif
++
+++#ifndef __WORDSIZE
+++#include <sys/user.h>
+++#endif
+++
++ struct concat_buf;
++
++ #define NR_SCSI_OPCODES 256
++--- a/usr/util.h
+++++ b/usr/util.h
++@@ -16,6 +16,10 @@
++ #include <limits.h>
++ #include <linux/types.h>
++
+++#ifndef __WORDSIZE
+++#include <sys/user.h>
+++#endif
+++
++ #include "be_byteshift.h"
++
++ #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
++--- a/usr/libssc.c
+++++ b/usr/libssc.c
++@@ -23,6 +23,7 @@
++ #include <string.h>
++ #include <unistd.h>
++ #include <stdio.h>
+++#include <fcntl.h>
++ #include "bs_ssc.h"
++ #include "ssc.h"
++ #include "be_byteshift.h"
+diff --git a/feeds/packages/net/tinc/Makefile b/feeds/packages/net/tinc/Makefile
+new file mode 100644
+index 0000000..c7d4028
+--- /dev/null
++++ b/feeds/packages/net/tinc/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tinc
++PKG_VERSION:=1.0.26
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.tinc-vpn.org/packages
++PKG_MD5SUM:=a8c168227fa42cbfcd4983247bf609ca
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tinc
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+liblzo +libopenssl +kmod-tun
++ TITLE:=VPN tunneling daemon
++ URL:=http://www.tinc-vpn.org/
++ MAINTAINER:=Saverio Proto <zioproto@gmail.com>
++ SUBMENU:=VPN
++endef
++
++define Package/tinc/description
++ tinc is a Virtual Private Network (VPN) daemon that uses tunnelling and
++ encryption to create a secure private network between hosts on the Internet.
++endef
++
++TARGET_CFLAGS += -std=gnu99
++
++CONFIGURE_ARGS += \
++ --with-kernel="$(LINUX_DIR)" \
++ --with-zlib="$(STAGING_DIR)/usr" \
++ --with-lzo-include="$(STAGING_DIR)/usr/include/lzo"
++
++define Package/tinc/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/tincd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) files/$(PKG_NAME).init $(1)/etc/init.d/$(PKG_NAME)
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) files/$(PKG_NAME).config $(1)/etc/config/$(PKG_NAME)
++ $(INSTALL_DIR) $(1)/etc/tinc
++ $(INSTALL_DIR) $(1)/lib/upgrade/keep.d
++ $(INSTALL_DATA) files/tinc.upgrade $(1)/lib/upgrade/keep.d/tinc
++endef
++
++define Package/tinc/conffiles
++/etc/config/tinc
++endef
++
++$(eval $(call BuildPackage,tinc))
+diff --git a/feeds/packages/net/tinc/files/tinc.config b/feeds/packages/net/tinc/files/tinc.config
+new file mode 100644
+index 0000000..1894078
+--- /dev/null
++++ b/feeds/packages/net/tinc/files/tinc.config
+@@ -0,0 +1,56 @@
++config tinc-net NETNAME
++ option enabled 0
++
++ ## Daemon Configuration (cmd arguments)
++ #option generate_keys 0
++ #option key_size 2048
++ #option logfile /tmp/log/tinc.NETNAME.log
++ #option debug 3
++
++ ## Server Configuration (tinc.conf)
++ #option AddressFamily any
++ #option BindToAddress 127.0.0.1
++ #option BindToInterface lo
++
++ #list ConnectTo peer1
++
++ #option DirectOnly 0
++ #option Forwarding internal
++ #option GraphDumpFile /tmp/log/tinc.NETNAME.dot
++ #option Hostnames 0
++ #option IffOneQueue 0
++ #option Interface NETNAME
++ #option KeyExpire 3600
++ #option MACExpire 600
++ #option MaxTimeout 900
++ #option Mode router
++
++ option Name NODENAME
++
++ #option PingInterval 60
++ #option PingTimeout 5
++ #option PriorityInheritance 0
++ #option PrivateKeyFile /etc/tinc/NETNAME/rsa_key.priv
++ #option ProcessPriority normal
++ #option ReplayWindow 16
++ #option StrictSubnets 0
++ #option TunnelServer 0
++ #option UDPRcvBuf x
++ #option UDPSndBuf x
++
++config tinc-host NODENAME
++ option enabled 0
++
++ option net NETNAME
++
++ #list Address example.com
++ #option Cipher blowfish
++ #option ClampMSS yes
++ #option Compression 0
++ #option Digest sha1
++ #option IndirectData 0
++ #option MACLength 4
++ #option PMTU 1514
++ #option PMTUDiscovery yes
++ #option Port 655
++ #option Subnet 192.168.1.0/24
+diff --git a/feeds/packages/net/tinc/files/tinc.init b/feeds/packages/net/tinc/files/tinc.init
+new file mode 100644
+index 0000000..e49b358
+--- /dev/null
++++ b/feeds/packages/net/tinc/files/tinc.init
+@@ -0,0 +1,239 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2011 OpenWrt.org
++# Copyright (C) 2011 Linus Lüssing
++# Based on Jo-Philipp Wich's OpenVPN init script
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++START=42
++
++SERVICE_USE_PID=1
++
++BIN=/usr/sbin/tincd
++EXTRA_COMMANDS="up down"
++
++LIST_SEP="
++"
++TMP_TINC="/tmp/tinc"
++
++append_param() {
++ local v="$1"
++ case "$v" in
++ *_*_*_*) v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;;
++ *_*_*) v=${v%%_*}-${v#*_}; v=${v%%_*}-${v#*_} ;;
++ *_*) v=${v%%_*}-${v#*_} ;;
++ esac
++ ARGS="$ARGS --$v"
++ return 0
++}
++
++append_conf_bools() {
++ local p; local v; local s="$1"; local f="$2"; shift; shift
++ for p in $*; do
++ config_get_bool v "$s" "$p"
++ [ "$v" == 1 ] && echo "$p = yes" >> "$f"
++ [ "$v" == 0 ] && echo "$p = no" >> "$f"
++ done
++}
++
++append_params() {
++ local p; local v; local s="$1"; shift
++ for p in $*; do
++ config_get v "$s" "$p"
++ IFS="$LIST_SEP"
++ for v in $v; do
++ [ -n "$v" ] && append_param "$p" && ARGS="$ARGS=$v"
++ done
++ unset IFS
++ done
++}
++
++append_conf_params() {
++ local p; local v; local s="$1"; local f="$2"; shift; shift
++ for p in $*; do
++ config_get v "$s" "$p"
++ IFS="$LIST_SEP"
++ for v in $v; do
++ # Look up OpenWRT interface names
++ [ "$p" = "BindToInterface" ] && {
++ local ifname=$(uci -P /var/state get network.$v.ifname 2>&-)
++ [ -n "$ifname" ] && v="$ifname"
++ }
++
++ [ -n "$v" ] && echo "$p = $v" >> "$f"
++ done
++ unset IFS
++ done
++}
++
++section_enabled() {
++ config_get_bool enabled "$1" 'enabled' 0
++ [ $enabled -gt 0 ]
++}
++
++prepare_host() {
++ local s="$1"
++ local n
++
++ # net disabled?
++ config_get n "$s" net
++ section_enabled "$n" || return 1
++
++ if [ "$#" = "2" ]; then
++ [ "$2" != "$n" ] && return 1
++ fi
++
++ # host disabled?
++ section_enabled "$s" || {
++ [ -f "$TMP_TINC/$n/hosts/$s" ] && rm "$TMP_TINC/$n/hosts/$s"
++ return 1
++ }
++
++ [ ! -f "/etc/tinc/$n/hosts/$s" ] && {
++ echo -n "tinc: Warning, public key for $s for network $n "
++ echo -n "missing in /etc/tinc/$n/hosts/$s, "
++ echo "skipping configuration of $s"
++ return 1
++ }
++
++ # append flags
++ append_conf_bools "$s" "$TMP_TINC/$n/hosts/$s" \
++ ClampMSS IndirectData PMTUDiscovery TCPOnly
++
++ # append params
++ append_conf_params "$s" "$TMP_TINC/$n/hosts/$s" \
++ Address Cipher Compression Digest MACLength PMTU \
++ Port PublicKey PublicKeyFile Subnet
++}
++
++check_gen_own_key() {
++ local s="$1"; local n; local k
++
++ config_get n "$s" Name
++ config_get_bool k "$s" generate_keys 0
++ [ "$k" == 0 ] && return 0
++
++ ([ -z "$n" ] || [ -f "$TMP_TINC/$s/hosts/$n" ] || [ -f "$TMP_TINC/$s/rsa_key.priv" ]) && \
++ return 0
++ [ ! -d "$TMP_TINC/$s/hosts" ] && mkdir -p "$TMP_TINC/$s/hosts"
++
++ config_get k "$s" key_size
++ if [ -z "$k" ]; then
++ $BIN -c "$TMP_TINC/$s" --generate-keys </dev/null
++ else
++ $BIN -c "$TMP_TINC/$s" "--generate-keys=$k" </dev/null
++ fi
++
++ [ ! -d "/etc/tinc/$s/hosts" ] && mkdir -p "/etc/tinc/$s/hosts"
++ cp "$TMP_TINC/$s/rsa_key.priv" "/etc/tinc/$s/"
++ [ -n "$n" ] && cp "$TMP_TINC/$s/hosts/$n" "/etc/tinc/$s/hosts/"
++}
++
++prepare_net() {
++ local s="$1"
++ local n
++
++ section_enabled "$s" || return 1
++
++ [ -d "$TMP_TINC/$s" ] && rm -rf "$TMP_TINC/$s/"
++ mkdir -p "$TMP_TINC/$s"
++ [ -d "/etc/tinc/$s" ] && cp -r "/etc/tinc/$s" "$TMP_TINC/"
++
++ # append flags
++ append_conf_bools "$s" "$TMP_TINC/$s/tinc.conf" \
++ DecrementTTL DirectOnly Hostnames IffOneQueue \
++ LocalDiscovery PriorityInheritance StrictSubnets TunnelServer \
++ ClampMSS IndirectData PMTUDiscovery TCPOnly
++
++ # append params
++ append_conf_params "$s" "$TMP_TINC/$s/tinc.conf" \
++ AddressFamily BindToAddress ConnectTo BindToInterface \
++ Broadcast Device DeviceType Forwarding \
++ GraphDumpFile Interface KeyExpire MACExpire \
++ MaxTimeout Mode Name PingInterval PingTimeout \
++ PrivateKey PrivateKeyFile ProcessPriority ReplayWindow \
++ UDPRcvBuf UDPSndBuf \
++ Address Cipher Compression Digest MACLength PMTU \
++ Port PublicKey PublicKeyFile Subnet
++
++ check_gen_own_key "$s" && return 0
++}
++
++start_instance() {
++ local s="$1"
++
++ section_enabled "$s" || return 1
++
++ ARGS=""
++
++ # append params
++ append_params "$s" logfile debug
++
++ SERVICE_PID_FILE="/var/run/tinc.$s.pid"
++ service_start $BIN -c "$TMP_TINC/$s" -n $s $ARGS --pidfile="$SERVICE_PID_FILE"
++}
++
++stop_instance() {
++ local s="$1"
++
++ section_enabled "$s" || return 1
++
++ SERVICE_PID_FILE="/var/run/tinc.$s.pid"
++ service_stop $BIN
++ # rm old config
++ rm -rf "$TMP_TINC/$s/"
++}
++
++reload_instance() {
++ local s="$1"
++
++ section_enabled "$s" || return 1
++
++ SERVICE_PID_FILE="/var/run/tinc.$s.pid"
++ service_reload $BIN
++}
++
++start() {
++ config_load 'tinc'
++
++ config_foreach prepare_net 'tinc-net'
++ config_foreach prepare_host 'tinc-host'
++
++ config_foreach start_instance 'tinc-net'
++}
++
++stop() {
++ config_load 'tinc'
++ config_foreach stop_instance 'tinc-net'
++}
++
++reload() {
++ config_load 'tinc'
++ config_foreach reload_instance 'tinc-net'
++}
++
++up() {
++ local exists
++ local instance
++ config_load 'tinc'
++ for instance in "$@"; do
++ config_get exists "$instance" 'TYPE'
++ if [ "$exists" == "tinc-net" ]; then
++ prepare_net "$instance"
++ config_foreach prepare_host 'tinc-host' "$instance"
++ start_instance "$instance"
++ fi
++ done
++}
++
++down() {
++ local exists
++ local instance
++ config_load 'tinc'
++ for instance in "$@"; do
++ config_get exists "$instance" 'TYPE'
++ if [ "$exists" == "tinc-net" ]; then
++ stop_instance "$instance"
++ fi
++ done
++}
+diff --git a/feeds/packages/net/tinc/files/tinc.upgrade b/feeds/packages/net/tinc/files/tinc.upgrade
+new file mode 100644
+index 0000000..13f5d80
+--- /dev/null
++++ b/feeds/packages/net/tinc/files/tinc.upgrade
+@@ -0,0 +1 @@
++/etc/tinc/
+diff --git a/feeds/packages/net/tinyproxy/Makefile b/feeds/packages/net/tinyproxy/Makefile
+new file mode 100644
+index 0000000..566b500
+--- /dev/null
++++ b/feeds/packages/net/tinyproxy/Makefile
+@@ -0,0 +1,51 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tinyproxy
++PKG_VERSION:=1.8.3
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.banu.com/pub/tinyproxy/1.8/
++PKG_MD5SUM:=292ac51da8ad6ae883d4ebf56908400d
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tinyproxy
++ SUBMENU:=Web Servers/Proxies
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Tinyproxy is a lightweight HTTP and HTTPS proxy
++ URL:=http://tinyproxy.sourceforge.net/
++endef
++
++define Package/tinyproxy/conffiles
++/etc/config/tinyproxy
++endef
++
++CONFIGURE_ARGS+= \
++ --enable-filter \
++ --enable-transparent \
++ --disable-regexcheck \
++
++define Package/tinyproxy/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/tinyproxy $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/share/tinyproxy
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/tinyproxy/*.html $(1)/usr/share/tinyproxy/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/tinyproxy.config $(1)/etc/config/tinyproxy
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/tinyproxy.init $(1)/etc/init.d/tinyproxy
++endef
++
++$(eval $(call BuildPackage,tinyproxy))
+diff --git a/feeds/packages/net/tinyproxy/files/tinyproxy.config b/feeds/packages/net/tinyproxy/files/tinyproxy.config
+new file mode 100644
+index 0000000..c812723
+--- /dev/null
++++ b/feeds/packages/net/tinyproxy/files/tinyproxy.config
+@@ -0,0 +1,251 @@
++config tinyproxy
++
++#
++# Enable the proxy
++#
++option enabled 0
++
++#
++# Name of the user the tinyproxy daemon should switch to after the port
++# has been bound.
++#
++option User nobody
++option Group nogroup
++
++#
++# Port to listen on.
++#
++option Port 8888
++
++#
++# If you have multiple interfaces this allows you to bind to only one. If
++# this is commented out, tinyproxy will bind to all interfaces present.
++#
++#option Listen 192.168.0.1
++
++#
++# The Bind directive allows you to bind the outgoing connections to a
++# particular IP address.
++#
++#option Bind 192.168.0.1
++
++#
++# Timeout: The number of seconds of inactivity a connection is allowed to
++# have before it closed by tinyproxy.
++#
++option Timeout 600
++
++#
++# ErrorFile: Defines the HTML file to send when a given HTTP error
++# occurs. You will probably need to customize the location to your
++# particular install. The usual locations to check are:
++# /usr/local/share/tinyproxy
++# /usr/share/tinyproxy
++# /etc/tinyproxy
++#
++#option ErrorFile_404 "/usr/share/tinyproxy/404.html"
++#option ErrorFile_400 "/usr/share/tinyproxy/400.html"
++#option ErrorFile_503 "/usr/share/tinyproxy/503.html"
++#option ErrorFile_403 "/usr/share/tinyproxy/403.html"
++#option ErrorFile_408 "/usr/share/tinyproxy/408.html"
++
++#
++# DefaultErrorFile: The HTML file that gets sent if there is no
++# HTML file defined with an ErrorFile keyword for the HTTP error
++# that has occured.
++#
++option DefaultErrorFile "/usr/share/tinyproxy/default.html"
++
++#
++# StatFile: The HTML file that gets sent when a request is made
++# for the stathost. If this file doesn't exist a basic page is
++# hardcoded in tinyproxy.
++#
++option StatFile "/usr/share/tinyproxy/stats.html"
++
++#
++# Where to log the information. Either LogFile or Syslog should be set,
++# but not both.
++#
++option LogFile "/var/log/tinyproxy.log"
++#option Syslog 1
++
++#
++# Set the logging level. Allowed settings are:
++# Critical (least verbose)
++# Error
++# Warning
++# Notice
++# Connect (to log connections without Info's noise)
++# Info (most verbose)
++# The LogLevel logs from the set level and above. For example, if the LogLevel
++# was set to Warning, than all log messages from Warning to Critical would be
++# output, but Notice and below would be suppressed.
++#
++option LogLevel Info
++
++#
++# Include the X-Tinyproxy header, which has the client's IP address when
++# connecting to the sites listed.
++#
++# list XTinyproxy mydomain.com
++
++#
++# This is the absolute highest number of threads which will be created. In
++# other words, only MaxClients number of clients can be connected at the
++# same time.
++#
++option MaxClients 100
++
++#
++# These settings set the upper and lower limit for the number of
++# spare servers which should be available. If the number of spare servers
++# falls below MinSpareServers then new ones will be created. If the number
++# of servers exceeds MaxSpareServers then the extras will be killed off.
++#
++option MinSpareServers 5
++option MaxSpareServers 20
++
++#
++# Number of servers to start initially.
++#
++option StartServers 10
++
++#
++# MaxRequestsPerChild is the number of connections a thread will handle
++# before it is killed. In practise this should be set to 0, which disables
++# thread reaping. If you do notice problems with memory leakage, then set
++# this to something like 10000
++#
++option MaxRequestsPerChild 0
++
++#
++# The following is the authorization controls. If there are any access
++# control keywords then the default action is to DENY. Otherwise, the
++# default action is ALLOW.
++#
++# Also the order of the controls are important. The incoming connections
++# are tested against the controls based on order.
++#
++list Allow 127.0.0.1
++#list Allow 192.168.0.0/16
++#list Allow 172.16.0.0/12
++#list Allow 10.0.0.0/8
++
++#
++# The "Via" header is required by the HTTP RFC, but using the real host name
++# is a security concern. If the following directive is enabled, the string
++# supplied will be used as the host name in the Via header; otherwise, the
++# server's host name will be used.
++#
++option ViaProxyName "tinyproxy"
++
++#
++# The location of the filter file.
++#
++#option Filter "/etc/tinyproxy/filter"
++
++#
++# Filter based on URLs rather than domains.
++#
++#option FilterURLs 1
++
++#
++# Use POSIX Extended regular expressions rather than basic.
++#
++#option FilterExtended 1
++
++#
++# Use case sensitive regular expressions.
++#
++#option FilterCaseSensitive 1
++
++#
++# Change the default policy of the filtering system. If this directive is
++# commented out, or is set to "0" then the default policy is to allow
++# everything which is not specifically denied by the filter file.
++#
++# However, by setting this directive to "1" the default policy becomes to
++# deny everything which is _not_ specifically allowed by the filter file.
++#
++#option FilterDefaultDeny 1
++
++#
++# If an Anonymous keyword is present, then anonymous proxying is enabled.
++# The headers listed are allowed through, while all others are denied. If
++# no Anonymous keyword is present, then all header are allowed through.
++# You must include quotes around the headers.
++#
++#list Anonymous "Host"
++#list Anonymous "Authorization"
++
++#
++# This is a list of ports allowed by tinyproxy when the CONNECT method
++# is used. To disable the CONNECT method altogether, set the value to 0.
++# If no ConnectPort line is found, all ports are allowed (which is not
++# very secure.)
++#
++# The following two ports are used by SSL.
++#
++list ConnectPort 443
++list ConnectPort 563
++
++#
++# Turns on upstream proxy support.
++#
++# The upstream rules allow you to selectively route upstream connections
++# based on the host/domain of the site being accessed.
++#
++# For example:
++# # connection to test domain goes through testproxy
++#
++#config upstream
++# option type proxy
++# option via testproxy:8008
++# option target ".test.domain.invalid"
++#
++#config upstream
++# option type proxy
++# option via testproxy:8008
++# option target ".our_testbed.example.com"
++#
++#config upstream
++# option type proxy
++# option via testproxy:8008
++# option target "192.168.128.0/255.255.254.0"
++#
++# # no upstream proxy for internal websites and unqualified hosts
++#
++#config upstream
++# option type reject
++# option target ".internal.example.com"
++#
++#config upstream
++# option type reject
++# option target "www.example.com"
++#
++#config upstream
++# option type reject
++# option target "10.0.0.0/8"
++#
++#config upstream
++# option type reject
++# option target "192.168.0.0/255.255.254.0"
++#
++#config upstream
++# option type reject
++# option target "."
++#
++# # default upstream is internet firewall
++#
++#config upstream
++# option type proxy
++# option via firewall.internal.example.com:80
++#
++# The LAST matching rule wins the route decision. As you can see, you
++# can use a host, or a domain:
++# name matches host exactly
++# .name matches any host in domain "name"
++# . matches any host with no domain (in 'empty' domain)
++# IP/bits matches network/mask
++# IP/mask matches network/mask
+diff --git a/feeds/packages/net/tinyproxy/files/tinyproxy.init b/feeds/packages/net/tinyproxy/files/tinyproxy.init
+new file mode 100644
+index 0000000..73f38c6
+--- /dev/null
++++ b/feeds/packages/net/tinyproxy/files/tinyproxy.init
+@@ -0,0 +1,142 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008-2011 OpenWrt.org
++
++START=50
++
++CFGFILE=/var/etc/tinyproxy.conf
++
++section_enabled() {
++ config_get_bool enabled "$1" 'enabled' 0
++ [ $enabled -gt 0 ]
++}
++
++start() {
++ config_load 'tinyproxy'
++ config_foreach start_proxy 'tinyproxy'
++}
++
++stop() {
++ service_stop /usr/sbin/tinyproxy
++}
++
++start_proxy() {
++ section_enabled "$1" || return 1
++
++ mkdir -m0755 -p /var/etc
++ echo '### AUTOGENERATED CONFIGURATION' > $CFGFILE
++ echo '### DO NOT EDIT' >> $CFGFILE
++ echo '### SEE /etc/config/tinyproxy INSTEAD' >> $CFGFILE
++ echo '' >> $CFGFILE
++
++ proxy_atom "$1" User >> $CFGFILE
++ proxy_atom "$1" Group >> $CFGFILE
++ proxy_atom "$1" Port 8888 >> $CFGFILE
++ proxy_atom "$1" Listen >> $CFGFILE
++ proxy_atom "$1" Bind >> $CFGFILE
++ proxy_atom "$1" Timeout >> $CFGFILE
++
++ proxy_string "$1" ErrorFile_400 "ErrorFile 400" >> $CFGFILE
++ proxy_string "$1" ErrorFile_403 "ErrorFile 403" >> $CFGFILE
++ proxy_string "$1" ErrorFile_404 "ErrorFile 404" >> $CFGFILE
++ proxy_string "$1" ErrorFile_408 "ErrorFile 408" >> $CFGFILE
++ proxy_string "$1" ErrorFile_503 "ErrorFile 503" >> $CFGFILE
++
++ proxy_string "$1" DefaultErrorFile >> $CFGFILE
++ proxy_string "$1" StatHost StatHost 127.0.0.1 >> $CFGFILE
++ proxy_string "$1" StatFile >> $CFGFILE
++ proxy_string "$1" LogFile >> $CFGFILE
++
++ proxy_flag "$1" Syslog >> $CFGFILE
++
++ proxy_atom "$1" LogLevel >> $CFGFILE
++
++ proxy_list "$1" XTinyproxy >> $CFGFILE
++
++ proxy_atom "$1" MaxClients >> $CFGFILE
++ proxy_atom "$1" MinSpareServers >> $CFGFILE
++ proxy_atom "$1" MaxSpareServers >> $CFGFILE
++ proxy_atom "$1" StartServers >> $CFGFILE
++ proxy_atom "$1" MaxRequestsPerChild >> $CFGFILE
++ proxy_list "$1" Allow >> $CFGFILE
++
++ proxy_string "$1" ViaProxyName >> $CFGFILE
++ proxy_string "$1" Filter >> $CFGFILE
++
++ proxy_flag "$1" FilterURLs >> $CFGFILE
++ proxy_flag "$1" FilterExtended >> $CFGFILE
++ proxy_flag "$1" FilterCaseSensitive >> $CFGFILE
++ proxy_flag "$1" FilterDefaultDeny Yes No >> $CFGFILE
++
++ proxy_list "$1" Anonymous '"' >> $CFGFILE
++ proxy_list "$1" ConnectPort >> $CFGFILE
++
++ config_foreach write_upstream upstream
++
++ service_start /usr/sbin/tinyproxy -c "$CFGFILE"
++}
++
++write_upstream() {
++ local type
++ local via
++ local target
++
++ config_get "type" "$1" "type"
++ config_get via "$1" via
++ config_get target "$1" target
++ [ -n "$target" ] && target=' "'"$target"'"'
++
++ [ "$type" == "proxy" -a -n "$via" ] && \
++ echo "upstream $via$target" >> $CFGFILE
++
++ [ "$type" == "reject" -a -n "$target" ] && \
++ echo "no upstream$target" >> $CFGFILE
++}
++
++proxy_atom() {
++ local SECTION=$1
++ local OPTION=$2
++ local DEFAULT=$3
++
++ config_get _value "$SECTION" "$OPTION"
++ [ -z "$_value" ] && _value="$DEFAULT"
++ [ -n "$_value" ] && echo "$OPTION $_value"
++}
++
++proxy_string() {
++ local SECTION=$1
++ local OPTION=$2
++ local ALIAS=$3
++ local DEFAULT=$4
++
++ config_get _value "$SECTION" "$OPTION"
++ [ -z "$_value" ] && _value="$DEFAULT"
++ [ -n "$_value" ] && echo "${ALIAS:-${OPTION}} "'"'"$_value"'"'
++ [ -n "$_value" -a "$OPTION" = "LogFile" ] && {
++ touch $_value
++ chmod 666 $_value
++ }
++}
++
++proxy_flag() {
++ local SECTION=$1
++ local OPTION=$2
++ local TRUE="${3:-On}"
++ local FALSE="${4:-Off}"
++
++ config_get_bool _value "$SECTION" "$OPTION" 0
++ [ "$_value" -eq "1" ] && _value="$TRUE" || _value="$FALSE"
++ echo "$OPTION $_value"
++}
++
++proxy_list() {
++ local SECTION=$1
++ local OPTION=$2
++ local ENCLOSE=$3
++
++ config_get _value "$SECTION" "$OPTION"
++ [ -n "$_value" ] && {
++ for entry in $_value; do
++ echo "$OPTION ${ENCLOSE}${entry}${ENCLOSE}"
++ done
++ }
++}
+diff --git a/feeds/packages/net/tinyproxy/patches/010-no-docs-and-tests.patch b/feeds/packages/net/tinyproxy/patches/010-no-docs-and-tests.patch
+new file mode 100644
+index 0000000..cbb0dd1
+--- /dev/null
++++ b/feeds/packages/net/tinyproxy/patches/010-no-docs-and-tests.patch
+@@ -0,0 +1,86 @@
++--- a/configure
+++++ b/configure
++@@ -6815,59 +6815,8 @@ fi
++
++
++
++-# Check for asciidoc
++-# Extract the first word of "a2x", so it can be a program name with args.
++-set dummy a2x; ac_word=$2
++-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++-$as_echo_n "checking for $ac_word... " >&6; }
++-if test "${ac_cv_path_A2X+set}" = set; then :
++- $as_echo_n "(cached) " >&6
++-else
++- case $A2X in
++- [\\/]* | ?:[\\/]*)
++- ac_cv_path_A2X="$A2X" # Let the user override the test with a path.
++- ;;
++- *)
++- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++-for as_dir in $PATH
++-do
++- IFS=$as_save_IFS
++- test -z "$as_dir" && as_dir=.
++- for ac_exec_ext in '' $ac_executable_extensions; do
++- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
++- ac_cv_path_A2X="$as_dir/$ac_word$ac_exec_ext"
++- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++- break 2
++- fi
++-done
++- done
++-IFS=$as_save_IFS
++-
++- test -z "$ac_cv_path_A2X" && ac_cv_path_A2X="no"
++- ;;
++-esac
++-fi
++-A2X=$ac_cv_path_A2X
++-if test -n "$A2X"; then
++- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $A2X" >&5
++-$as_echo "$A2X" >&6; }
++-else
++- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++-$as_echo "no" >&6; }
++-fi
++-
++-
++- if test "x$A2X" != "xno"; then
++- HAVE_A2X_TRUE=
++- HAVE_A2X_FALSE='#'
++-else
++ HAVE_A2X_TRUE='#'
++ HAVE_A2X_FALSE=
++-fi
++-
++-if test x"$A2X" = x"no"; then
++- as_fn_error $? "Test for asciidoc failed. See the file 'INSTALL' for help." "$LINENO" 5
++-fi
++
++ ac_config_files="$ac_config_files Makefile src/Makefile data/Makefile data/templates/Makefile etc/Makefile docs/Makefile docs/man5/Makefile docs/man5/tinyproxy.conf.txt docs/man8/Makefile docs/man8/tinyproxy.txt m4macros/Makefile tests/Makefile tests/scripts/Makefile"
++
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -2,9 +2,7 @@ SUBDIRS = \
++ src \
++ data \
++ etc \
++- docs \
++ m4macros \
++- tests
++
++ # tools want this on a single line
++ ACLOCAL_AMFLAGS = -I m4macros
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -222,9 +222,7 @@ SUBDIRS = \
++ src \
++ data \
++ etc \
++- docs \
++ m4macros \
++- tests
++
++
++ # tools want this on a single line
+diff --git a/feeds/packages/net/tinyproxy/patches/020-config_and_pid-path.patch b/feeds/packages/net/tinyproxy/patches/020-config_and_pid-path.patch
+new file mode 100644
+index 0000000..3ab7482
+--- /dev/null
++++ b/feeds/packages/net/tinyproxy/patches/020-config_and_pid-path.patch
+@@ -0,0 +1,13 @@
++--- a/src/main.c
+++++ b/src/main.c
++@@ -326,8 +326,8 @@ static void initialize_config_defaults (
++ conf->errorpages = NULL;
++ conf->stathost = safestrdup (TINYPROXY_STATHOST);
++ conf->idletimeout = MAX_IDLE_TIME;
++- conf->logf_name = safestrdup (LOCALSTATEDIR "/log/tinyproxy/tinyproxy.log");
++- conf->pidpath = safestrdup (LOCALSTATEDIR "/run/tinyproxy/tinyproxy.pid");
+++ conf->logf_name = safestrdup (LOCALSTATEDIR "/log/tinyproxy.log");
+++ conf->pidpath = safestrdup (LOCALSTATEDIR "/tinyproxy.pid");
++ }
++
++ /**
+diff --git a/feeds/packages/net/tinyproxy/patches/030-allow_bind_in_transparent_mode.patch b/feeds/packages/net/tinyproxy/patches/030-allow_bind_in_transparent_mode.patch
+new file mode 100644
+index 0000000..68d89db
+--- /dev/null
++++ b/feeds/packages/net/tinyproxy/patches/030-allow_bind_in_transparent_mode.patch
+@@ -0,0 +1,22 @@
++--- a/src/conf.c
+++++ b/src/conf.c
++@@ -865,7 +865,6 @@ static HANDLE_FUNC (handle_deny)
++
++ static HANDLE_FUNC (handle_bind)
++ {
++-#ifndef TRANSPARENT_PROXY
++ int r = set_string_arg (&conf->bind_address, line, &match[2]);
++
++ if (r)
++@@ -873,11 +872,6 @@ static HANDLE_FUNC (handle_bind)
++ log_message (LOG_INFO,
++ "Outgoing connections bound to IP %s", conf->bind_address);
++ return 0;
++-#else
++- fprintf (stderr,
++- "\"Bind\" cannot be used with transparent support enabled.\n");
++- return 1;
++-#endif
++ }
++
++ static HANDLE_FUNC (handle_listen)
+diff --git a/feeds/packages/net/tinyproxy/patches/120-fix_INET6.patch b/feeds/packages/net/tinyproxy/patches/120-fix_INET6.patch
+new file mode 100644
+index 0000000..1c26835
+--- /dev/null
++++ b/feeds/packages/net/tinyproxy/patches/120-fix_INET6.patch
+@@ -0,0 +1,38 @@
++--- a/src/sock.c
+++++ b/src/sock.c
++@@ -39,8 +39,7 @@
++ * returned if the bind succeeded. Otherwise, -1 is returned
++ * to indicate an error.
++ */
++-static int
++-bind_socket (int sockfd, const char *addr, int family)
+++static int bind_socket (int sockfd, const char *addr)
++ {
++ struct addrinfo hints, *res, *ressave;
++
++@@ -48,7 +47,7 @@ bind_socket (int sockfd, const char *add
++ assert (addr != NULL && strlen (addr) != 0);
++
++ memset (&hints, 0, sizeof (struct addrinfo));
++- hints.ai_family = family;
+++ hints.ai_family = AF_UNSPEC;
++ hints.ai_socktype = SOCK_STREAM;
++
++ /* The local port it not important */
++@@ -106,14 +105,12 @@ int opensock (const char *host, int port
++
++ /* Bind to the specified address */
++ if (bind_to) {
++- if (bind_socket (sockfd, bind_to,
++- res->ai_family) < 0) {
+++ if (bind_socket (sockfd, bind_to) < 0) {
++ close (sockfd);
++ continue; /* can't bind, so try again */
++ }
++ } else if (config.bind_address) {
++- if (bind_socket (sockfd, config.bind_address,
++- res->ai_family) < 0) {
+++ if (bind_socket (sockfd, config.bind_address) < 0) {
++ close (sockfd);
++ continue; /* can't bind, so try again */
++ }
+diff --git a/feeds/packages/net/tinyproxy/patches/CVE-2012-3505-tiniproxy-randomized-hashmaps.patch b/feeds/packages/net/tinyproxy/patches/CVE-2012-3505-tiniproxy-randomized-hashmaps.patch
+new file mode 100644
+index 0000000..4737b8b
+--- /dev/null
++++ b/feeds/packages/net/tinyproxy/patches/CVE-2012-3505-tiniproxy-randomized-hashmaps.patch
+@@ -0,0 +1,101 @@
++--- a/src/child.c
+++++ b/src/child.c
++@@ -20,6 +20,9 @@
++ * processing incoming connections.
++ */
++
+++#include <stdlib.h>
+++#include <time.h>
+++
++ #include "main.h"
++
++ #include "child.h"
++@@ -196,6 +199,7 @@ static void child_main (struct child_s *
++ }
++
++ ptr->connects = 0;
+++ srand(time(NULL));
++
++ while (!config.quit) {
++ ptr->status = T_WAITING;
++--- a/src/hashmap.c
+++++ b/src/hashmap.c
++@@ -25,6 +25,8 @@
++ * don't try to free the data, or realloc the memory. :)
++ */
++
+++#include <stdlib.h>
+++
++ #include "main.h"
++
++ #include "hashmap.h"
++@@ -50,6 +52,7 @@ struct hashbucket_s {
++ };
++
++ struct hashmap_s {
+++ uint32_t seed;
++ unsigned int size;
++ hashmap_iter end_iterator;
++
++@@ -65,7 +68,7 @@ struct hashmap_s {
++ *
++ * If any of the arguments are invalid a negative number is returned.
++ */
++-static int hashfunc (const char *key, unsigned int size)
+++static int hashfunc (const char *key, unsigned int size, uint32_t seed)
++ {
++ uint32_t hash;
++
++@@ -74,7 +77,7 @@ static int hashfunc (const char *key, un
++ if (size == 0)
++ return -ERANGE;
++
++- for (hash = tolower (*key++); *key != '\0'; key++) {
+++ for (hash = seed; *key != '\0'; key++) {
++ uint32_t bit = (hash & 1) ? (1 << (sizeof (uint32_t) - 1)) : 0;
++
++ hash >>= 1;
++@@ -104,6 +107,7 @@ hashmap_t hashmap_create (unsigned int n
++ if (!ptr)
++ return NULL;
++
+++ ptr->seed = (uint32_t)rand();
++ ptr->size = nbuckets;
++ ptr->buckets = (struct hashbucket_s *) safecalloc (nbuckets,
++ sizeof (struct
++@@ -201,7 +205,7 @@ hashmap_insert (hashmap_t map, const cha
++ if (!data || len < 1)
++ return -ERANGE;
++
++- hash = hashfunc (key, map->size);
+++ hash = hashfunc (key, map->size, map->seed);
++ if (hash < 0)
++ return hash;
++
++@@ -382,7 +386,7 @@ ssize_t hashmap_search (hashmap_t map, c
++ if (map == NULL || key == NULL)
++ return -EINVAL;
++
++- hash = hashfunc (key, map->size);
+++ hash = hashfunc (key, map->size, map->seed);
++ if (hash < 0)
++ return hash;
++
++@@ -416,7 +420,7 @@ ssize_t hashmap_entry_by_key (hashmap_t
++ if (!map || !key || !data)
++ return -EINVAL;
++
++- hash = hashfunc (key, map->size);
+++ hash = hashfunc (key, map->size, map->seed);
++ if (hash < 0)
++ return hash;
++
++@@ -451,7 +455,7 @@ ssize_t hashmap_remove (hashmap_t map, c
++ if (map == NULL || key == NULL)
++ return -EINVAL;
++
++- hash = hashfunc (key, map->size);
+++ hash = hashfunc (key, map->size, map->seed);
++ if (hash < 0)
++ return hash;
++
+diff --git a/feeds/packages/net/tinyproxy/patches/CVE-2012-3505-tinyproxy-limit-headers.patch b/feeds/packages/net/tinyproxy/patches/CVE-2012-3505-tinyproxy-limit-headers.patch
+new file mode 100644
+index 0000000..b8023ab
+--- /dev/null
++++ b/feeds/packages/net/tinyproxy/patches/CVE-2012-3505-tinyproxy-limit-headers.patch
+@@ -0,0 +1,44 @@
++--- a/src/reqs.c
+++++ b/src/reqs.c
++@@ -610,6 +610,11 @@ add_header_to_connection (hashmap_t hash
++ return hashmap_insert (hashofheaders, header, sep, len);
++ }
++
+++/* define max number of headers. big enough to handle legitimate cases,
+++ * but limited to avoid DoS
+++ */
+++#define MAX_HEADERS 10000
+++
++ /*
++ * Read all the headers from the stream
++ */
++@@ -617,6 +622,7 @@ static int get_all_headers (int fd, hash
++ {
++ char *line = NULL;
++ char *header = NULL;
+++ int count;
++ char *tmp;
++ ssize_t linelen;
++ ssize_t len = 0;
++@@ -625,7 +631,7 @@ static int get_all_headers (int fd, hash
++ assert (fd >= 0);
++ assert (hashofheaders != NULL);
++
++- for (;;) {
+++ for (count = 0; count < MAX_HEADERS; count++) {
++ if ((linelen = readline (fd, &line)) <= 0) {
++ safefree (header);
++ safefree (line);
++@@ -691,6 +697,12 @@ static int get_all_headers (int fd, hash
++
++ safefree (line);
++ }
+++
+++ /* if we get there, this is we reached MAX_HEADERS count.
+++ bail out with error */
+++ safefree (header);
+++ safefree (line);
+++ return -1;
++ }
++
++ /*
+diff --git a/feeds/packages/net/tor/Makefile b/feeds/packages/net/tor/Makefile
+new file mode 100644
+index 0000000..79f61af
+--- /dev/null
++++ b/feeds/packages/net/tor/Makefile
+@@ -0,0 +1,122 @@
++#
++# Copyright (C) 2008-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tor
++PKG_VERSION:=0.2.6.10
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://www.torproject.org/dist \
++ https://archive.torproject.org/tor-package-archive
++PKG_MD5SUM:=04f919e7882d1ca80f835545af562bad
++PKG_MAINTAINER:=Hauke Mehrtens <hauke@hauke-m.de>
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_DEPENDS:=libminiupnpc libnatpmp
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tor/Default
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=https://www.torproject.org/
++ USERID:=tor=52:tor=52
++endef
++
++define Package/tor/Default/description
++ Tor is a toolset for a wide range of organizations and people that want to
++ improve their safety and security on the Internet. Using Tor can help you
++ anonymize web browsing and publishing, instant messaging, IRC, SSH, and
++ more. Tor also provides a platform on which software developers can build
++ new applications with built-in anonymity, safety, and privacy features.
++endef
++
++define Package/tor
++$(call Package/tor/Default)
++ TITLE:=An anonymous Internet communication system
++ DEPENDS:=+libevent2 +libopenssl +libpthread +librt
++endef
++
++define Package/tor/description
++$(call Package/tor/Default/description)
++ This package contains the tor daemon.
++endef
++
++define Package/tor-fw-helper
++$(call Package/tor/Default)
++ TITLE:=Firewall helper for tor
++ DEPENDS:=+tor +libminiupnpc +libnatpmp
++endef
++
++define Package/tor-fw-helper/description
++$(call Package/tor/Default/description)
++ This package contains a helper for automatically configuring port forwarding.
++endef
++
++define Package/tor-geoip
++$(call Package/tor/Default)
++ TITLE:=GeoIP db for tor
++ DEPENDS:=+tor
++endef
++
++define Package/tor-geoip/description
++$(call Package/tor/Default/description)
++ This package contains a GeoIP database mapping IP addresses to countries.
++endef
++
++define Package/tor/conffiles
++/etc/tor/torrc
++endef
++
++CONFIGURE_ARGS += \
++ --with-libevent-dir="$(STAGING_DIR)/usr" \
++ --with-ssl-dir="$(STAGING_DIR)/usr" \
++ --enable-upnp \
++ --with-libminiupnpc-dir="$(STAGING_DIR)/usr" \
++ --enable-nat-pmp \
++ --with-libnatpmp-dir="$(STAGING_DIR)/usr" \
++ --disable-asciidoc \
++ --disable-seccomp
++
++ifneq ($(CONFIG_SSP_SUPPORT),y)
++ CONFIGURE_ARGS += \
++ --disable-gcc-hardening
++ MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) -std=gnu99"
++else
++ MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) -fPIC -std=gnu99"
++endif
++
++CONFIGURE_VARS += \
++ CROSS_COMPILE="yes"
++
++define Package/tor/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/tor $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/tor.init $(1)/etc/init.d/tor
++ $(INSTALL_DIR) $(1)/etc/tor
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/tor/torrc.sample $(1)/etc/tor/torrc
++endef
++
++define Package/tor-fw-helper/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/tor-fw-helper $(1)/usr/bin/
++endef
++
++define Package/tor-geoip/install
++ $(INSTALL_DIR) $(1)/usr/share/tor
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/tor/geoip $(1)/usr/share/tor/
++endef
++
++$(eval $(call BuildPackage,tor))
++$(eval $(call BuildPackage,tor-fw-helper))
++$(eval $(call BuildPackage,tor-geoip))
+diff --git a/feeds/packages/net/tor/files/tor.init b/feeds/packages/net/tor/files/tor.init
+new file mode 100644
+index 0000000..6974057
+--- /dev/null
++++ b/feeds/packages/net/tor/files/tor.init
+@@ -0,0 +1,26 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=50
++STOP=50
++
++USE_PROCD=1
++
++start_service() {
++ [ -f /var/run/tor.pid ] || {
++ touch /var/run/tor.pid
++ chown tor:tor /var/run/tor.pid
++ }
++ [ -d /var/lib/tor ] || {
++ mkdir -m 0755 -p /var/lib/tor
++ chmod 0700 /var/lib/tor
++ chown tor:tor /var/lib/tor
++ }
++ [ -d /var/log/tor ] || {
++ mkdir -m 0755 -p /var/log/tor
++ chown tor:tor /var/log/tor
++ }
++ procd_open_instance
++ procd_set_param command /usr/sbin/tor --runasdaemon 0
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/tor/patches/001-torrc.patch b/feeds/packages/net/tor/patches/001-torrc.patch
+new file mode 100644
+index 0000000..e295219
+--- /dev/null
++++ b/feeds/packages/net/tor/patches/001-torrc.patch
+@@ -0,0 +1,21 @@
++--- a/src/config/torrc.sample.in
+++++ b/src/config/torrc.sample.in
++@@ -45,11 +45,11 @@
++ ## Uncomment this to start the process in the background... or use
++ ## --runasdaemon 1 on the command line. This is ignored on Windows;
++ ## see the FAQ entry if you want Tor to run as an NT service.
++-#RunAsDaemon 1
+++RunAsDaemon 1
++
++ ## The directory for keeping all the keys/etc. By default, we store
++ ## things in $HOME/.tor on Unix, and in Application Data\tor on Windows.
++-#DataDirectory @LOCALSTATEDIR@/lib/tor
+++DataDirectory @LOCALSTATEDIR@/lib/tor
++
++ ## The port on which Tor will listen for local connections from Tor
++ ## controller applications, as documented in control-spec.txt.
++@@ -190,3 +190,4 @@
++ ## address manually to your friends, uncomment this line:
++ #PublishServerDescriptor 0
++
+++User tor
+diff --git a/feeds/packages/net/transmission/Makefile b/feeds/packages/net/transmission/Makefile
+new file mode 100644
+index 0000000..1cd4b91
+--- /dev/null
++++ b/feeds/packages/net/transmission/Makefile
+@@ -0,0 +1,123 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=transmission
++PKG_VERSION:=2.84
++PKG_RELEASE:=4
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://download-origin.transmissionbt.com/files/ http://mirrors.m0k.org/transmission/files
++PKG_MD5SUM:=411aec1c418c14f6765710d89743ae42
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/transmission/template
++ SUBMENU:=BitTorrent
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=A free, lightweight BitTorrent client
++ URL:=http://www.transmissionbt.com
++ MAINTAINER:=Cezary Jackiewicz <cezary@eko.one.pl>
++endef
++
++define Package/transmission-daemon
++ $(call Package/transmission/template)
++ DEPENDS:=+libcurl +libopenssl +libpthread +libevent2 +librt
++ MENU:=1
++ USERID:=transmission=224:transmission=224
++endef
++
++define Package/transmission-cli
++ $(call Package/transmission/template)
++ DEPENDS:=transmission-daemon
++endef
++
++define Package/transmission-remote
++ $(call Package/transmission/template)
++ DEPENDS:=+libcurl +libopenssl +libpthread +libevent2 +librt
++endef
++
++define Package/transmission-web
++ $(call Package/transmission/template)
++ DEPENDS:=transmission-daemon
++endef
++
++
++define Package/transmission-daemon/description
++ Transmission is a simple BitTorrent client.
++ It features a very simple, intuitive interface
++ on top on an efficient, cross-platform back-end.
++ This package contains the daemon itself.
++endef
++
++define Package/transmission-cli/description
++ CLI utilities for transmission.
++endef
++
++define Package/transmission-remote/description
++ CLI remote interface for transmission.
++endef
++
++define Package/transmission-web/description
++ Webinterface resources for transmission.
++endef
++
++define Package/transmission-daemon/conffiles
++/etc/config/transmission
++endef
++
++CONFIGURE_VARS += \
++ LIBEVENT_LIBS="$(STAGING_DIR)/usr/lib/libevent-2.0.so.5"
++
++CONFIGURE_ARGS += \
++ --enable-daemon \
++ --enable-cli \
++ --without-gtk \
++ --enable-largefile \
++ --enable-lightweight
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) -D_GNU_SOURCE"
++
++define Package/transmission-daemon/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/transmission-daemon $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) files/transmission.init $(1)/etc/init.d/transmission
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) files/transmission.config $(1)/etc/config/transmission
++endef
++
++define Package/transmission-cli/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/transmission-cli \
++ $(PKG_INSTALL_DIR)/usr/bin/transmission-create \
++ $(PKG_INSTALL_DIR)/usr/bin/transmission-edit \
++ $(PKG_INSTALL_DIR)/usr/bin/transmission-show \
++ $(1)/usr/bin/
++endef
++
++define Package/transmission-remote/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/transmission-remote $(1)/usr/bin/
++endef
++
++define Package/transmission-web/install
++ $(INSTALL_DIR) $(1)/usr/share/transmission
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/transmission/web $(1)/usr/share/transmission/
++endef
++
++$(eval $(call BuildPackage,transmission-daemon))
++$(eval $(call BuildPackage,transmission-cli))
++$(eval $(call BuildPackage,transmission-remote))
++$(eval $(call BuildPackage,transmission-web))
+diff --git a/feeds/packages/net/transmission/files/transmission.config b/feeds/packages/net/transmission/files/transmission.config
+new file mode 100644
+index 0000000..2ea69d0
+--- /dev/null
++++ b/feeds/packages/net/transmission/files/transmission.config
+@@ -0,0 +1,74 @@
++config transmission
++ option enabled 0
++ option config_dir '/tmp/transmission'
++ #option user 'nobody'
++ option mem_percentage 50
++ option nice 10
++ option ionice_flags '-c 3'
++ option alt_speed_down 50
++ option alt_speed_enabled false
++ option alt_speed_time_begin 540
++ option alt_speed_time_day 127
++ option alt_speed_time_enabled false
++ option alt_speed_time_end 1020
++ option alt_speed_up 50
++ option bind_address_ipv4 '0.0.0.0'
++ option bind_address_ipv6 '::'
++ option blocklist_enabled false
++ option blocklist_url ''
++ option cache_size_mb 2
++ option dht_enabled true
++ option download_dir '/tmp/transmission/done'
++ option download_queue_enabled true
++ option download_queue_size 4
++ option encryption 1
++ option idle_seeding_limit 30
++ option idle_seeding_limit_enabled false
++ option incomplete_dir '/tmp/transmission/incomplete'
++ option incomplete_dir_enabled false
++ option lazy_bitfield_enabled true
++ option lpd_enabled false
++ option message_level 1
++ option peer_congestion_algorithm ''
++ option peer_limit_global 240
++ option peer_limit_per_torrent 60
++ option peer_port 51413
++ option peer_port_random_high 65535
++ option peer_port_random_low 49152
++ option peer_port_random_on_start false
++ option peer_socket_tos 'default'
++ option pex_enabled true
++ option port_forwarding_enabled true
++ option preallocation 1
++ option prefetch_enabled true
++ option queue_stalled_enabled true
++ option queue_stalled_minutes 30
++ option ratio_limit 2.0000
++ option ratio_limit_enabled false
++ option rename_partial_files true
++ option rpc_authentication_required false
++ option rpc_bind_address '0.0.0.0'
++ option rpc_enabled true
++ option rpc_password ''
++ option rpc_port 9091
++ option rpc_url '/transmission/'
++ option rpc_username ''
++ option rpc_whitelist '127.0.0.1,192.168.1.*'
++ option rpc_whitelist_enabled true
++ option scrape_paused_torrents_enabled true
++ option script_torrent_done_enabled false
++ option script_torrent_done_filename ''
++ option seed_queue_enabled false
++ option seed_queue_size 10
++ option speed_limit_down 100
++ option speed_limit_down_enabled false
++ option speed_limit_up 20
++ option speed_limit_up_enabled false
++ option start_added_torrents true
++ option trash_original_torrent_files false
++ option umask 18
++ option upload_slots_per_torrent 14
++ option utp_enabled true
++ option scrape_paused_torrents true
++ option watch_dir_enabled false
++ option watch_dir ''
+diff --git a/feeds/packages/net/transmission/files/transmission.init b/feeds/packages/net/transmission/files/transmission.init
+new file mode 100644
+index 0000000..f7b1d41
+--- /dev/null
++++ b/feeds/packages/net/transmission/files/transmission.init
+@@ -0,0 +1,134 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2010-2015 OpenWrt.org
++
++START=99
++USE_PROCD=1
++
++
++LIST_SEP="
++"
++
++append_params() {
++ local p; local v; local s="$1"; shift
++ for p in $*; do
++ config_get v "$s" "$p"
++ IFS="$LIST_SEP"
++ for v in $v; do
++ [ -n "$v" ] && (
++ echo "\""$p"\": "$v"," | sed -e 's|_|-|g' >> $config_file
++ )
++ done
++ unset IFS
++ done
++}
++
++append_params_quotes() {
++ local p; local v; local s="$1"; shift
++ for p in $*; do
++ config_get v "$s" "$p"
++ IFS="$LIST_SEP"
++ for v in $v; do
++ [ -n "$v" ] && (
++ echo -n "\""$p | sed -e 's|/|\\/|g;s|_|-|g' >> $config_file; \
++ echo "\": \""$v"\"," >> $config_file
++ )
++ done
++ unset IFS
++ done
++}
++
++section_enabled() {
++ config_get_bool enabled "$1" 'enabled' 0
++ [ $enabled -gt 0 ]
++}
++
++transmission() {
++ local cfg="$1"
++ local USE
++
++ local user
++ local download_dir config_dir
++ local mem_percentage
++ local config_overwrite nice ionice_flags
++ local cmdline
++
++ section_enabled "$section" || return 1
++
++ config_get config_dir "$cfg" 'config_dir' '/var/etc/transmission'
++ config_get user "$cfg" 'user'
++ config_get download_dir "$cfg" 'download_dir' '/var/etc/transmission'
++ config_get mem_percentage "$cfg" 'mem_percentage' '50'
++ config_get config_overwrite "$cfg" config_overwrite 1
++ config_get nice "$cfg" nice 0
++ config_get ionice_flags "$cfg" ionice_flags ''
++ which ionice > /dev/null || ionice_flags=''
++
++ local MEM=$(sed -ne 's!^MemTotal:[[:space:]]*\([0-9]*\) kB$!\1!p' /proc/meminfo)
++ if test "$MEM" -gt 1;then
++ USE=$(expr $MEM \* $mem_percentage \* 10)
++ fi
++
++ config_file="$config_dir/settings.json"
++ [ -d $config_dir ] || {
++ mkdir -m 0755 -p "$config_dir"
++ touch $config_file
++ [ -z "$user" ] || chown -R $user $config_dir
++ }
++
++ [ "$config_overwrite" == 0 ] || {
++
++ echo "{" > $config_file
++
++ append_params "$cfg" \
++ alt_speed_down alt_speed_enabled alt_speed_time_begin alt_speed_time_day \
++ alt_speed_time_enabled alt_speed_time_end alt_speed_up blocklist_enabled \
++ cache_size_mb download_queue_enabled download_queue_size \
++ dht_enabled encryption idle_seeding_limit idle_seeding_limit_enabled \
++ incomplete_dir_enabled lazy_bitfield_enabled lpd_enabled message_level \
++ peer_limit_global peer_limit_per_torrent peer_port \
++ peer_port_random_high peer_port_random_low peer_port_random_on_start \
++ pex_enabled port_forwarding_enabled preallocation prefetch_enabled \
++ ratio_limit ratio_limit_enabled rename_partial_files rpc_authentication_required \
++ rpc_enabled rpc_port rpc_whitelist_enabled queue_stalled_enabled \
++ queue_stalled_minutes scrape_paused_torrents_enabled script_torrent_done_enabled \
++ seed_queue_enabled seed_queue_size \
++ speed_limit_down speed_limit_down_enabled speed_limit_up \
++ speed_limit_up_enabled start_added_torrents trash_original_torrent_files \
++ umask upload_slots_per_torrent utp_enabled scrape_paused_torrents \
++ watch_dir_enabled
++
++ append_params_quotes "$cfg" \
++ blocklist_url bind_address_ipv4 bind_address_ipv6 download_dir incomplete_dir \
++ peer_congestion_algorithm peer_socket_tos rpc_bind_address rpc_password rpc_url \
++ rpc_username rpc_whitelist script_torrent_done_filename watch_dir
++
++ echo "\""invalid-key"\": false" >> $config_file
++ echo "}" >> $config_file
++
++ }
++
++ cmdline="/usr/bin/transmission-daemon -g $config_dir -f"
++ [ "$ionice_flags" ] && cmdline="ionice $ionice_flags $cmdline"
++ procd_open_instance
++ procd_set_param command $cmdline
++ procd_set_param respawn retry=60
++ procd_set_param user "$user"
++ procd_set_param nice "$nice"
++ if test -z "$USE";then
++ procd_set_param limits core="0 0"
++ else
++ procd_set_param limits core="0 0" as="$USE $USE"
++ logger -t transmission "Starting with $USE virt mem"
++ fi
++
++ procd_add_jail transmission log
++ procd_add_jail_mount $config_file
++ procd_add_jail_mount_rw $download_dir
++ procd_close_instance
++}
++
++start_service() {
++ config_load 'transmission'
++ config_foreach transmission 'transmission'
++}
++
+diff --git a/feeds/packages/net/transmission/patches/010_libtransmission_fallocate64_eglibc.patch b/feeds/packages/net/transmission/patches/010_libtransmission_fallocate64_eglibc.patch
+new file mode 100644
+index 0000000..e46a1ad
+--- /dev/null
++++ b/feeds/packages/net/transmission/patches/010_libtransmission_fallocate64_eglibc.patch
+@@ -0,0 +1,14 @@
++--- a/libtransmission/fdlimit.c
+++++ b/libtransmission/fdlimit.c
++@@ -22,11 +22,6 @@
++ #include <fcntl.h>
++ #endif
++
++-#ifdef HAVE_FALLOCATE64
++- /* FIXME can't find the right #include voodoo to pick up the declaration.. */
++- extern int fallocate64 (int fd, int mode, uint64_t offset, uint64_t len);
++-#endif
++-
++ #ifdef HAVE_XFS_XFS_H
++ #include <xfs/xfs.h>
++ #endif
+diff --git a/feeds/packages/net/transmission/patches/020-use-internal-miniupnp.patch b/feeds/packages/net/transmission/patches/020-use-internal-miniupnp.patch
+new file mode 100644
+index 0000000..cf78567
+--- /dev/null
++++ b/feeds/packages/net/transmission/patches/020-use-internal-miniupnp.patch
+@@ -0,0 +1,11 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -251,7 +251,7 @@
++ AC_LINK_IFELSE(
++ [AC_LANG_PROGRAM([#include <miniupnpc/miniupnpc.h>],
++ [struct UPNPDev dev;])],
++- [upnp_version="unknown"],
+++ [upnp_version="none"],
++ [upnp_version="none"]
++ )
++
+diff --git a/feeds/packages/net/transmission/patches/030-fix-musl-build.patch b/feeds/packages/net/transmission/patches/030-fix-musl-build.patch
+new file mode 100644
+index 0000000..badf673
+--- /dev/null
++++ b/feeds/packages/net/transmission/patches/030-fix-musl-build.patch
+@@ -0,0 +1,34 @@
++Index: transmission-2.84/libtransmission/bitfield.c
++===================================================================
++--- transmission-2.84.orig/libtransmission/bitfield.c
+++++ transmission-2.84/libtransmission/bitfield.c
++@@ -7,6 +7,8 @@
++ * $Id: bitfield.c 14302 2014-06-29 01:42:38Z jordan $
++ */
++
+++#define __NEED_ssize_t
+++
++ #include <assert.h>
++ #include <stdlib.h> /* realloc () */
++ #include <string.h> /* memset */
++@@ -15,6 +17,7 @@
++ #include "bitfield.h"
++ #include "utils.h" /* tr_new0 () */
++
+++
++ const tr_bitfield TR_BITFIELD_INIT = { NULL, 0, 0, 0, false, false };
++
++ /****
++Index: transmission-2.84/libtransmission/fdlimit.h
++===================================================================
++--- transmission-2.84.orig/libtransmission/fdlimit.h
+++++ transmission-2.84/libtransmission/fdlimit.h
++@@ -11,6 +11,8 @@
++ #error only libtransmission should #include this header.
++ #endif
++
+++#define __NEED_off_t
+++
++ #include "transmission.h"
++ #include "net.h"
++
+diff --git a/feeds/packages/net/u2pnpd/Makefile b/feeds/packages/net/u2pnpd/Makefile
+new file mode 100644
+index 0000000..f859d3b
+--- /dev/null
++++ b/feeds/packages/net/u2pnpd/Makefile
+@@ -0,0 +1,63 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=u2pnpd
++PKG_VERSION:=0.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://github.com/mhei/u2pnpd/releases/download/v$(PKG_VERSION)
++PKG_MD5SUM:=a98089923d93803fa90d03a504c98b8e
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_MAINTAINER:=Michael Heimpold <mhei@heimpold.de>
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/u2pnpd
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Announce device via UPnP on the network
++ URL:=https://github.com/mhei/u2pnpd
++ DEPENDS:=+libupnp
++endef
++
++define Package/u2pnpd/description
++ This tools announces a device via UPnP on the local network, thus it is possible
++ to find it within the network neightboorhood of a well-known OS and the user
++ can easily double-click on an icon to open the web frontend of this device without
++ knowing the IP address.
++endef
++
++define Package/u2pnpd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/u2pnpd $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/u2pnpd.init $(1)/etc/init.d/u2pnpd
++
++ $(INSTALL_DIR) $(1)/etc/uci-defaults
++ $(INSTALL_DATA) ./files/u2pnpd.defaults $(1)/etc/uci-defaults/u2pnpd
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/u2pnpd.config $(1)/etc/config/u2pnpd
++endef
++
++define Package/u2pnpd/postinst
++#!/bin/sh
++[ -n "$${IPKG_INSTROOT}" ] || (. /etc/uci-defaults/u2pnpd) && rm -f /etc/uci-defaults/u2pnpd
++exit 0
++endef
++
++$(eval $(call BuildPackage,u2pnpd))
+diff --git a/feeds/packages/net/u2pnpd/files/u2pnpd.config b/feeds/packages/net/u2pnpd/files/u2pnpd.config
+new file mode 100644
+index 0000000..8c0d561
+--- /dev/null
++++ b/feeds/packages/net/u2pnpd/files/u2pnpd.config
+@@ -0,0 +1,11 @@
++config u2pnpd
++# option interface br-lan
++# option use_https no
++# option manufacturer 'OpenWrt'
++# option manufacturerURL 'http://www.openwrt.org/'
++# option modelDescription ''
++# option modelName 'Generic'
++# option modelNumber ''
++# option modelURL ''
++# option serialNumber ''
++# option uuid ''
+diff --git a/feeds/packages/net/u2pnpd/files/u2pnpd.defaults b/feeds/packages/net/u2pnpd/files/u2pnpd.defaults
+new file mode 100644
+index 0000000..322b0bc
+--- /dev/null
++++ b/feeds/packages/net/u2pnpd/files/u2pnpd.defaults
+@@ -0,0 +1,10 @@
++#!/bin/sh
++
++uuid=$(cat /proc/sys/kernel/random/uuid)
++
++uci -q batch <<-EOF >/dev/null
++ set u2pnpd.@u2pnpd[0].uuid=$uuid
++ commit u2pnpd
++EOF
++
++exit 0
+diff --git a/feeds/packages/net/u2pnpd/files/u2pnpd.init b/feeds/packages/net/u2pnpd/files/u2pnpd.init
+new file mode 100644
+index 0000000..01437fd
+--- /dev/null
++++ b/feeds/packages/net/u2pnpd/files/u2pnpd.init
+@@ -0,0 +1,62 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=50
++STOP=20
++
++SERVICE_DAEMONIZE=1
++SERVICE_PID_FILE=/var/run/u2pnpd.pid
++SERVICE_USE_PID=1
++SERVICE_WRITE_PID=1
++
++start_instance() {
++ local section="$1"
++ local enabled
++ local interface manufacturer manufacturerURL modelDescription
++ local modelName modelNumber modelURL serialNumber friendlyName
++ local uuid httpsURL
++ local i
++
++ config_get_bool enabled "$section" 'enabled' 1
++ [ "$enabled" -gt 0 ] || return 0
++
++ for i in interface httpsURL manufacturer manufacturerURL modelDescription \
++ modelName modelNumber modelURL serialNumber friendlyName uuid; do
++ config_get "$i" "$section" "$i"
++ done
++
++ [ -n "$interface" ] && SERVICE_PID_FILE="/var/run/u2pnpd.$interface.pid"
++
++ service_start /usr/bin/u2pnpd ${httpsURL:+-s} \
++ ${interface:+--interface="$interface"} \
++ ${manufacturer:+--manufacturer="$manufacturer"} \
++ ${manufacturerURL:+--manufacturerURL="$manufacturerURL"} \
++ ${modelDescription:+--modelDescription="$modelDescription"} \
++ ${modelName:+--modelName="$modelName"} \
++ ${modelNumber:+--modelNumber="$modelNumber"} \
++ ${modelURL:+--modelURL="$modelURL"} \
++ ${serialNumber:+--serialNumber="$serialNumber"} \
++ ${friendlyName:+--friendlyName="$friendlyName"} \
++ ${uuid:+--uuid="$uuid"}
++}
++
++stop_instance() {
++ local section="$1"
++ local interface
++
++ config_get interface "$section" 'interface'
++ [ -n "$interface" ] && SERVICE_PID_FILE="/var/run/u2pnpd.$interface.pid"
++
++ service_stop /usr/bin/u2pnpd
++ rm -f "$SERVICE_PID_FILE"
++}
++
++start() {
++ config_load 'u2pnpd'
++ config_foreach start_instance 'u2pnpd'
++}
++
++stop() {
++ config_load 'u2pnpd'
++ config_foreach stop_instance 'u2pnpd'
++}
+diff --git a/feeds/packages/net/uanytun/Makefile b/feeds/packages/net/uanytun/Makefile
+new file mode 100644
+index 0000000..5091920
+--- /dev/null
++++ b/feeds/packages/net/uanytun/Makefile
+@@ -0,0 +1,175 @@
++#
++# Copyright (C) 2008-2014 Christian Pointner,
++# <equinox@anytun.org>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++# This Makefile builds uAnytun Package for OpenWRT
++#
++# $Id: $
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=uanytun
++PKG_VERSION:=0.3.5
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.anytun.org/download/
++PKG_MD5SUM:=ce47ad45003ff1d84eaf5276941b9ddf
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_MAINTAINER:=Christian Pointner <equinox@spreadspace.org>
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=LICENSE
++include $(INCLUDE_DIR)/package.mk
++
++
++define Package/uanytun/template
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=VPN
++ DEPENDS:=+kmod-tun
++ TITLE:=micro anycast tunneling daemon
++ URL:=http://www.anytun.org/
++endef
++
++
++define Package/uanytun
++ $(call Package/uanytun/template)
++ TITLE+= (gcrypt)
++ VARIANT:=gcrypt
++ DEPENDS+=+libgcrypt
++endef
++
++define Package/uanytun/conffiles
++/etc/config/uanytun
++endef
++
++define Package/uanytun/description
++uAnytun is a tiny implementation of SATP the secure anycast tunneling protocol.
++ SATP defines a protocol used for communication between any combination of
++ unicast and anycast tunnel endpoints. It has less protocol overhead than
++ IPSec in Tunnel mode and allows tunneling of every ETHER TYPE protocol (e.g.
++ ethernet, ip, arp ...). SATP directly includes cryptography and message
++ authentication based on the methods used by SRTP. It is intended to deliver
++ a generic, scaleable and secure solution for tunneling and relaying of packets
++ of any protocol.
++ Unlike Anytun which is a full featured implementation uAnytun has no support
++ for multiple connections or synchronisation. It is a small single threaded
++ implementation intended to act as a client on small platforms.
++endef
++
++
++define Package/uanytun-nettle
++ $(call Package/uanytun/template)
++ TITLE+= (nettle)
++ VARIANT:=nettle
++ DEPENDS+=+libnettle
++endef
++
++Package/uanytun-nettle/conffiles=$(Package/uanytun/conffiles)
++Package/uanytun-nettle/description=$(Package/uanytun/description)
++
++
++define Package/uanytun-sslcrypt
++ $(call Package/uanytun/template)
++ TITLE+= (openssl)
++ VARIANT:=sslcrypt
++ DEPENDS+=+libopenssl
++endef
++
++Package/uanytun-sslcrypt/conffiles=$(Package/uanytun/conffiles)
++Package/uanytun-sslcrypt/description=$(Package/uanytun/description)
++
++
++define Package/uanytun-nocrypt
++ $(call Package/uanytun/template)
++ TITLE+= (no crypt)
++ VARIANT:=nocrypt
++endef
++
++Package/uanytun-nocrypt/conffiles=$(Package/uanytun/conffiles)
++Package/uanytun-nocrypt/description=$(Package/uanytun/description)
++
++
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR)/src; \
++ touch include.mk; \
++ ln -s linux/tun.c .; \
++ echo '#ifndef UANYTUN_version_h_INCLUDED' > version.h; \
++ echo '#define UANYTUN_version_h_INCLUDED' >> version.h; \
++ echo '' >> version.h; \
++ echo '#define VERSION_STRING_0 "uanytun version '`cat $(PKG_BUILD_DIR)/version`'"' >> version.h; \
++ echo '#define VERSION_STRING_1 "built on '`hostname`', '`date +"%d.%m.%Y %H:%M:%S %Z"`'"' >> version.h; \
++ echo '' >> version.h; \
++ echo '#endif' >> version.h \
++ )
++endef
++
++VARIANT_CFLAGS:=
++VARIANT_LDFLAGS:=-ldl
++VARIANT_MAKE_OPTS:=
++
++ifeq ($(BUILD_VARIANT),gcrypt)
++VARIANT_CFLAGS+=-DUSE_GCRYPT
++VARIANT_LDFLAGS+=-lgpg-error -lgcrypt
++endif
++
++ifeq ($(BUILD_VARIANT),nettle)
++VARIANT_CFLAGS+=-DUSE_NETTLE
++VARIANT_LDFLAGS+=-lnettle
++endif
++
++ifeq ($(BUILD_VARIANT),sslcrypt)
++VARIANT_CFLAGS+=-DUSE_SSL_CRYPTO
++VARIANT_LDFLAGS+=-lcrypto
++endif
++
++ifeq ($(BUILD_VARIANT),nocrypt)
++VARIANT_CFLAGS+=-DNO_CRYPT
++VARIANT_MAKE_OPTS+=NO_CRYPT_OBJ=1
++endif
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)/src \
++ $(TARGET_CONFIGURE_OPTS) \
++ $(VARIANT_MAKE_OPTS) \
++ TARGET=Linux \
++ CFLAGS="$(TARGET_CFLAGS) $(VARIANT_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS) $(VARIANT_LDFLAGS)"
++ $(STRIP) $(PKG_BUILD_DIR)/src/uanytun
++endef
++
++
++define Package/uanytun/install-generic
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/$(2) $(1)/etc/config/$(PKG_NAME)
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/uanytun $(1)/usr/sbin/$(PKG_NAME)
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/uanytun.init $(1)/etc/init.d/$(PKG_NAME)
++endef
++
++define Package/uanytun/install
++ $(call Package/uanytun/install-generic,$(1),uanytun.config)
++endef
++
++define Package/uanytun-nettle/install
++ $(call Package/uanytun/install-generic,$(1),uanytun.config)
++endef
++
++define Package/uanytun-sslcrypt/install
++ $(call Package/uanytun/install-generic,$(1),uanytun.config)
++endef
++
++define Package/uanytun-nocrypt/install
++ $(call Package/uanytun/install-generic,$(1),uanytun-nocrypt.config)
++endef
++
++
++$(eval $(call BuildPackage,uanytun))
++$(eval $(call BuildPackage,uanytun-nettle))
++$(eval $(call BuildPackage,uanytun-sslcrypt))
++$(eval $(call BuildPackage,uanytun-nocrypt))
+diff --git a/feeds/packages/net/uanytun/files/uanytun-nocrypt.config b/feeds/packages/net/uanytun/files/uanytun-nocrypt.config
+new file mode 100644
+index 0000000..9792d1f
+--- /dev/null
++++ b/feeds/packages/net/uanytun/files/uanytun-nocrypt.config
+@@ -0,0 +1,88 @@
++config "client1"
++ option disabled 0
++ option username 'nobody'
++ option groupname 'nogroup'
++# option chroot "/var/run/uanytun"
++
++# option interface '<ip-address>'
++# option port '4444'
++# option sender_id '1'
++
++# option dev 'anytun0'
++ option type 'tun'
++ option ifconfig '192.168.123.1/24'
++# option post-up-script '/etc/uanytun/client1-post-up.sh'
++
++ option remote_host 'example.com'
++ option remote_port '4444'
++
++ option window_size 0
++ option mux 1
++
++ option log 'syslog:3,anytun-client1,daemon'
++
++
++config "client2"
++ option disabled 1
++ option username 'nobody'
++ option groupname 'nogroup'
++
++ option type 'tun'
++ option ifconfig '192.168.123.2/24'
++
++ option remote_host 'example.com'
++ option remote_port '4444'
++
++ option window_size 0
++ option mux 2
++
++ option log 'syslog:3,anytun-client2,daemon'
++
++
++config "client3"
++ option disabled 1
++ option username 'nobody'
++ option groupname 'nogroup'
++
++ option type 'tun'
++ option ifconfig '192.168.123.3/24'
++
++ option remote_host 'example.com'
++ option remote_port '4444'
++
++ option window_size 0
++ option mux 3
++
++ option log 'syslog:3,anytun-client3,daemon'
++
++
++config "p2p-a"
++ option disabled 1
++ option username 'nobody'
++ option groupname 'nogroup'
++
++ option type 'tun'
++ option ifconfig '192.168.223.1/24'
++
++ option remote_host 'p2p-b.example.com'
++ option remote_port '4444'
++
++ option window_size 0
++
++ option log 'syslog:3,anytun-p2p-a,daemon'
++
++
++config "p2p-b"
++ option disabled 1
++ option username 'nobody'
++ option groupname 'nogroup'
++
++ option type 'tun'
++ option ifconfig '192.168.223.2/24'
++
++ option remote_host 'p2p-a.example.com'
++ option remote_port '4444'
++
++ option window_size 0
++
++ option log 'syslog:3,anytun-p2p-b,daemon'
+diff --git a/feeds/packages/net/uanytun/files/uanytun.config b/feeds/packages/net/uanytun/files/uanytun.config
+new file mode 100644
+index 0000000..c53db37
+--- /dev/null
++++ b/feeds/packages/net/uanytun/files/uanytun.config
+@@ -0,0 +1,116 @@
++config "client1"
++ option disabled 0
++# option username 'nobody'
++# option groupname 'nogroup'
++# option chroot "/var/run/uanytun"
++
++# option interface '<ip-address>'
++# option port '4444'
++# option sender_id '1'
++
++ option cipher 'aes-ctr'
++# option cipher 'null'
++# option cipher 'aes-ctr-128'
++# option cipher 'aes-ctr-192'
++# option cipher 'aes-ctr-256'
++ option auth_algo 'sha1'
++# option auth_algo 'null'
++# option auth_tag_length 10
++
++# option dev 'anytun0'
++ option type 'tun'
++ option ifconfig '192.168.123.1/24'
++# option post-up-script '/etc/uanytun/client1-post-up.sh'
++
++ option remote_host 'example.com'
++ option remote_port '4444'
++
++ option window_size 0
++ option mux 1
++
++ option role 'client'
++# option kd_prf 'null'
++# option kd_prf 'aes-ctr'
++# option kd_prf 'aes-ctr-128'
++# option kd_prf 'aes-ctr-192'
++# option kd_prf 'aes-ctr-256'
++# option ld_kdr '0'
++# option key '0123456789ABCDEF0123456789ABCDEF'
++# option salt '0123456789ABCD0123456789ABCD'
++ option passphrase 'Creating_VPN_Tunnels_With_Anytun_Is_Easy'
++
++ option log 'syslog:3,anytun-client1,daemon'
++
++
++config "client2"
++ option disabled 1
++
++ option cipher 'aes-ctr'
++ option auth_algo 'sha1'
++ option type 'tun'
++ option ifconfig '192.168.123.2/24'
++
++ option remote_host 'example.com'
++ option remote_port '4444'
++
++ option window_size 0
++ option mux 2
++ option role 'client'
++ option passphrase 'Creating_VPN_Tunnels_With_Anytun_Is_Easy'
++
++ option log 'syslog:3,anytun-client2,daemon'
++
++
++config "client3"
++ option disabled 1
++
++ option cipher 'aes-ctr'
++ option auth_algo 'sha1'
++ option type 'tun'
++ option ifconfig '192.168.123.3/24'
++
++ option remote_host 'example.com'
++ option remote_port '4444'
++
++ option window_size 0
++ option mux 3
++ option role 'client'
++ option passphrase 'Creating_VPN_Tunnels_With_Anytun_Is_Easy'
++
++ option log 'syslog:3,anytun-client3,daemon'
++
++
++config "p2p-a"
++ option disabled 1
++
++ option cipher 'aes-ctr'
++ option auth_algo 'sha1'
++ option type 'tun'
++ option ifconfig '192.168.223.1/24'
++
++ option remote_host 'p2p-b.example.com'
++ option remote_port '4444'
++
++ option window_size 0
++ option role 'alice'
++ option passphrase 'Creating_P2P_VPN_Tunnels_With_Anytun_Is_Easy'
++
++ option log 'syslog:3,anytun-p2p-a,daemon'
++
++
++config "p2p-b"
++ option disabled 1
++
++ option cipher 'aes-ctr'
++ option auth_algo 'sha1'
++ option type 'tun'
++ option ifconfig '192.168.223.2/24'
++
++ option remote_host 'p2p-a.example.com'
++ option remote_port '4444'
++
++ option window_size 0
++ option role 'bob'
++ option passphrase 'Creating_P2P_VPN_Tunnels_With_Anytun_Is_Easy'
++
++ option log 'syslog:3,anytun-p2p-b,daemon'
+diff --git a/feeds/packages/net/uanytun/files/uanytun.init b/feeds/packages/net/uanytun/files/uanytun.init
+new file mode 100644
+index 0000000..21609ca
+--- /dev/null
++++ b/feeds/packages/net/uanytun/files/uanytun.init
+@@ -0,0 +1,104 @@
++#!/bin/sh /etc/rc.common
++START=50
++
++BIN=uanytun
++DAEMON=/usr/sbin/$BIN
++DESC=$BIN
++RUN_D=/var/run
++
++
++option_cb() {
++ local varname="$1"
++ local value="$2"
++
++ if ! echo "$CONFIG_OPTIONS" | grep " $varname " > /dev/null; then
++ CONFIG_OPTIONS="$CONFIG_OPTIONS $varname "
++ fi
++}
++
++foreach_config_forced() {
++ foreach_config $1 "forced"
++}
++
++foreach_config() {
++ local cfg="$1"
++ local name
++ local option
++ local value
++ local args=""
++ local forced=0
++
++ if [ -n "$2" ] && [ "x$2" == "xforced" ]; then
++ forced=1
++ fi
++
++ config_get name "$cfg" TYPE
++ for option in $CONFIG_OPTIONS
++ do
++ config_get value "$cfg" "$option"
++ if [ "x$option" == "xdisabled" ]; then
++ if [ $forced -eq 0 ] && [ $value -eq 1 ]; then
++ echo -n " $name(disabled)"
++ return
++ fi
++ continue
++ fi
++
++ option=`echo $option | tr '_' '-'`
++ if [ -n "$value" ]; then
++ args="$args --$option $value"
++ fi
++ done
++ echo -n " $name"
++ local status="OK"
++ $DAEMON --write-pid "$RUN_D/$BIN.$name.pid" $args || status="failed"
++ echo -n "($status)"
++}
++
++stop_vpn() {
++ local name=$1
++ local pidfile=$RUN_D/$BIN.$name.pid
++ echo -n " $name"
++ local status="OK"
++ if [ ! -f "$pidfile" ]; then
++ status="tunnel not active"
++ else
++ kill `cat $pidfile` > /dev/null 2>&1 || status="failed"
++ rm -f $pidfile
++ fi
++ echo -n "($status)"
++}
++
++start() {
++ echo -n "Starting $DESC:"
++ config_load $BIN
++ if [ $# -gt 0 ]; then
++ while [ $# -gt 0 ]; do
++ config_foreach foreach_config_forced "$1"
++ shift
++ done
++ else
++ config_foreach foreach_config ""
++ fi
++ echo "."
++}
++
++stop() {
++ echo -n "Stopping $DESC:"
++ local name
++ local pidfile
++
++ if [ $# -gt 0 ]; then
++ while [ $# -gt 0 ]; do
++ stop_vpn $1
++ shift
++ done
++ else
++ for pidfile in `ls $RUN_D/$BIN.*.pid 2> /dev/null`; do
++ name=${pidfile%%.pid}
++ name=${name##$RUN_D/$BIN.}
++ stop_vpn $name
++ done
++ fi
++ echo "."
++}
+diff --git a/feeds/packages/net/udpxy/Makefile b/feeds/packages/net/udpxy/Makefile
+new file mode 100644
+index 0000000..7d94a99
+--- /dev/null
++++ b/feeds/packages/net/udpxy/Makefile
+@@ -0,0 +1,64 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=udpxy
++PKG_SOURCE_VERSION:=c045a1e855a8033c5d70ab3e42271ba5636eb520
++PKG_VERSION:=2015-03-08-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/pcherenkov/udpxy.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=gpl.txt
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++MAKE_PATH:=chipmunk
++
++define Package/udpxy
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Convert UDP IPTV streams into HTTP streams
++ URL:=https://github.com/pcherenkov/udpxy
++endef
++
++define Package/udpxy/description
++ udproxy makes it possible to convert UDP IPTV streams into HTTP
++ streams which can be viewed even over WLANs. HTTP streams do
++ not generate huge amounts of multicast traffic, so a sd stream
++ only takes about 300k. Interesting for peoply who have IPTV at
++ home and do not want to rent multiple decoders from their
++ provider but just use their own streaming client (for example
++ popcornhour/mediatomb/vlc).
++endef
++
++define Package/udpxy/conffiles
++/etc/config/udpxy
++endef
++
++MAKE_FLAGS += \
++ INSTALLROOT="$(PKG_INSTALL_DIR)/usr" \
++ ALL_CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)"
++
++define Package/udpxy/install
++ $(INSTALL_DIR) $(1)/etc/init.d $(1)/etc/config
++ $(INSTALL_CONF) ./files/udpxy.conf $(1)/etc/config/udpxy
++ $(INSTALL_BIN) ./files/udpxy.init $(1)/etc/init.d/udpxy
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/udpxy $(1)/usr/bin/
++ ln -sf udpxy $(1)/usr/bin/udpxrec
++endef
++
++$(eval $(call BuildPackage,udpxy))
+diff --git a/feeds/packages/net/udpxy/files/udpxy.conf b/feeds/packages/net/udpxy/files/udpxy.conf
+new file mode 100644
+index 0000000..9117a53
+--- /dev/null
++++ b/feeds/packages/net/udpxy/files/udpxy.conf
+@@ -0,0 +1,15 @@
++config udpxy
++ option disabled '1'
++ option respawn '1'
++ option verbose '0'
++ option status '1'
++ # option bind '0.0.0.0'
++ option port '4022'
++ # option source '0.0.0.0'
++ # option max_clients '3'
++ # option log_file '/var/log/udpxy'
++ # option buffer_size '4096'
++ # option buffer_messages '-1'
++ # option buffer_time '-1'
++ # option nice_increment '0'
++ # option mcsub_renew '0'
+diff --git a/feeds/packages/net/udpxy/files/udpxy.init b/feeds/packages/net/udpxy/files/udpxy.init
+new file mode 100644
+index 0000000..6f911a6
+--- /dev/null
++++ b/feeds/packages/net/udpxy/files/udpxy.init
+@@ -0,0 +1,67 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2014 OpenWrt.org
++
++START=50
++USE_PROCD=1
++
++append_arg() {
++ local cfg="$1"
++ local var="$2"
++ local opt="$3"
++ local def="$4"
++ local val
++
++ config_get val "$cfg" "$var"
++ [ -n "$val" -o -n "$def" ] && procd_append_param command $opt "${val:-$def}"
++}
++
++append_bool() {
++ local cfg="$1"
++ local var="$2"
++ local opt="$3"
++ local def="$4"
++ local val
++
++ config_get_bool val "$cfg" "$var" "$def"
++ [ "$val" = 1 ] && procd_append_param command "$opt"
++}
++
++start_instance() {
++ local cfg="$1"
++ local aux
++
++ config_get_bool aux "$cfg" 'disabled' '0'
++ [ "$aux" = 1 ] && return 1
++
++ procd_open_instance
++
++ procd_set_param command /usr/bin/udpxy
++ procd_append_param command "-T"
++
++ append_bool "$cfg" verbose "-V"
++ append_bool "$cfg" status "-S"
++ append_arg "$cfg" bind "-a"
++ append_arg "$cfg" port "-p"
++ append_arg "$cfg" source "-m"
++ append_arg "$cfg" max_clients "-c"
++ append_arg "$cfg" log_file "-l"
++ append_arg "$cfg" buffer_size "-B"
++ append_arg "$cfg" buffer_messages "-R"
++ append_arg "$cfg" buffer_time "-H"
++ append_arg "$cfg" nice_increment "-n"
++ append_arg "$cfg" mcsub_renew "-M"
++
++ config_get_bool aux "$cfg" 'respawn' '0'
++ [ "$aux" = 1 ] && procd_set_param respawn
++
++ procd_close_instance
++}
++
++service_triggers() {
++ procd_add_reload_trigger "udpxy"
++}
++
++start_service() {
++ config_load udpxy
++ config_foreach start_instance udpxy
++}
+diff --git a/feeds/packages/net/udpxy/patches/0001-fix-build-on-Mac-OS-X.patch b/feeds/packages/net/udpxy/patches/0001-fix-build-on-Mac-OS-X.patch
+new file mode 100644
+index 0000000..24f62e7
+--- /dev/null
++++ b/feeds/packages/net/udpxy/patches/0001-fix-build-on-Mac-OS-X.patch
+@@ -0,0 +1,30 @@
++From 26f8177f799f3cf781ed89cb28f771da7ef22421 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com>
++Date: Thu, 5 Mar 2015 13:42:09 +0100
++Subject: [PATCH] fix build on Mac OS X
++MIME-Version: 1.0
++Content-Type: text/plain; charset=UTF-8
++Content-Transfer-Encoding: 8bit
++
++Signed-off-by: Ãlvaro Fernández Rojas <noltari@gmail.com>
++---
++ chipmunk/Makefile | 5 ++++-
++ 1 file changed, 4 insertions(+), 1 deletion(-)
++
++--- a/chipmunk/Makefile
+++++ b/chipmunk/Makefile
++@@ -32,10 +32,13 @@ DEBUG_ON := -g
++ ALL_CFLAGS = -W -Wall -Werror --pedantic $(CFLAGS)
++
++ SYSTEM=$(shell uname 2>/dev/null)
++-ifneq (,$(filter $(SYSTEM),FreeBSD Darwin))
+++ifneq (,$(filter $(SYSTEM),FreeBSD))
++ MAKE := gmake
++ GZIP := /usr/bin/gzip
++ endif
+++ifneq (,$(filter $(SYSTEM),Darwin))
+++GZIP := /usr/bin/gzip
+++endif
++
++ BUILDFILE = BUILD
++ BUILDNO := `cat $(BUILDFILE)`
+diff --git a/feeds/packages/net/ulogd/Makefile b/feeds/packages/net/ulogd/Makefile
+new file mode 100644
+index 0000000..2fa9f6c
+--- /dev/null
++++ b/feeds/packages/net/ulogd/Makefile
+@@ -0,0 +1,210 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ulogd
++PKG_VERSION:=2.0.5
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=ftp://ftp.netfilter.org/pub/ulogd/ \
++ ftp://ftp.be.netfilter.org/pub/netfilter/ulogd/ \
++ ftp://ftp.de.netfilter.org/pub/netfilter/ulogd/ \
++ ftp://ftp.no.netfilter.org/pub/netfilter/ulogd/
++PKG_MD5SUM:=f0f8fe1371fa28b5e06cb16aaa0111dd
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ulogd/Default
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://www.netfilter.org/projects/ulogd/index.html
++endef
++
++define Package/ulogd
++ $(call Package/ulogd/Default)
++ DEPENDS:=+libmnl +libnfnetlink +libpthread
++ TITLE:=Netfilter userspace logging daemon
++ MENU:=1
++endef
++
++define Package/ulogd/conffiles
++/etc/ulogd.conf
++endef
++
++define Package/ulogd-mod-dbi
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd +libdbi
++ TITLE:=Output plugin for logging to a database using libdbi
++endef
++
++define Package/ulogd-mod-json
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd +jansson
++ TITLE:=JSON output plugin
++endef
++
++define Package/ulogd-mod-mysql
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd +libmysqlclient
++ TITLE:=Output plugin for logging to a MySQL database
++endef
++
++define Package/ulogd-mod-nfacct
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd +libnetfilter-acct
++ TITLE:=Input plugin for flow-based logging (accounting)
++endef
++
++define Package/ulogd-mod-nfct
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd +libnetfilter-conntrack
++ TITLE:=Input plugin for flow-based logging (conntracking)
++endef
++
++define Package/ulogd-mod-nflog
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd +libnetfilter-log
++ TITLE:=Input plugin using NFLOG
++endef
++
++define Package/ulogd-mod-pcap
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd +libpcap
++ TITLE:=Output plugin for logging in pcap format
++endef
++
++define Package/ulogd-mod-pgsql
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd +libpq
++ TITLE:=Output plugin for logging to a PostgreSQL database
++endef
++
++define Package/ulogd-mod-sqlite
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd +libsqlite3
++ TITLE:=Output plugin for logging to an SQLite database
++endef
++
++define Package/ulogd-mod-syslog
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd
++ TITLE:=Syslog output plugin
++endef
++
++define Package/ulogd-mod-xml
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd +libnetfilter-acct +libnetfilter-conntrack +libnetfilter-log
++ TITLE:=XML output plugin
++endef
++
++define Package/ulogd-mod-extra
++ $(call Package/ulogd/Default)
++ DEPENDS:=ulogd
++ TITLE:=Extra plugins
++endef
++
++PKG_BUILD_DEPENDS:=libnetfilter-acct libnetfilter-conntrack libnetfilter-log
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_PACKAGE_ulogd-mod-dbi \
++ CONFIG_PACKAGE_ulogd-mod-mysql \
++ CONFIG_PACKAGE_ulogd-mod-pgsql \
++ CONFIG_PACKAGE_ulogd-mod-sqlite \
++
++TARGET_CFLAGS += \
++ -D_GNU_SOURCE \
++
++CONFIGURE_ARGS += \
++ --enable-nfacct \
++ --enable-nfct \
++ --enable-nflog \
++
++ifneq ($(DEVELOPER)$(SDK)$(CONFIG_PACKAGE_ulogd-mod-dbi),)
++ CONFIGURE_ARGS += --with-dbi \
++ --with-dbi-inc=$(STAGING_DIR)/usr/include/dbi \
++ --with-dbi-lib=$(STAGING_DIR)/usr/lib
++else
++ CONFIGURE_ARGS += --without-dbi
++endif
++
++ifneq ($(DEVELOPER)$(SDK)$(CONFIG_PACKAGE_ulogd-mod-mysql),)
++ CONFIGURE_ARGS += --with-mysql="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS += --without-mysql
++endif
++
++ifneq ($(DEVELOPER)$(SDK)$(CONFIG_PACKAGE_ulogd-mod-pgsql),)
++ CONFIGURE_ARGS += --with-pgsql="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS += --without-pgsql
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_ulogd-mod-sqlite),)
++ CONFIGURE_ARGS += --with-sqlite="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS += --without-sqlite
++endif
++
++define Package/ulogd/install
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_BUILD_DIR)/ulogd.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/ulogd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/lib/ulogd
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ulogd/ulogd_raw2packet_BASE.so $(1)/usr/lib/ulogd/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/ulogd.init $(1)/etc/init.d/ulogd
++endef
++
++define BuildPlugin
++ define Package/ulogd-mod-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/ulogd
++ for m in $(2); do \
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/ulogd/ulogd_$$$$$$$${m}.so $$(1)/usr/lib/ulogd/ ; \
++ done
++ endef
++ $$(eval $$(call BuildPackage,ulogd-mod-$(1)))
++endef
++
++ULOGD_EXTRA_PLUGINS:= \
++ filter_HWHDR \
++ filter_IFINDEX \
++ filter_IP2BIN \
++ filter_IP2HBIN \
++ filter_IP2STR \
++ filter_MARK \
++ filter_PRINTFLOW \
++ filter_PRINTPKT \
++ filter_PWSNIFF \
++ inppkt_UNIXSOCK \
++ output_GPRINT \
++ output_GRAPHITE \
++ output_LOGEMU \
++ output_OPRINT \
++
++$(eval $(call BuildPackage,ulogd))
++$(eval $(call BuildPlugin,dbi,output_DBI))
++$(eval $(call BuildPlugin,json,output_JSON))
++$(eval $(call BuildPlugin,mysql,output_MYSQL))
++$(eval $(call BuildPlugin,nfacct,inpflow_NFACCT))
++$(eval $(call BuildPlugin,nfct,inpflow_NFCT))
++$(eval $(call BuildPlugin,nflog,inppkt_NFLOG))
++$(eval $(call BuildPlugin,pcap,output_PCAP))
++$(eval $(call BuildPlugin,pgsql,output_PGSQL))
++$(eval $(call BuildPlugin,sqlite,output_SQLITE3))
++$(eval $(call BuildPlugin,syslog,output_SYSLOG))
++$(eval $(call BuildPlugin,xml,output_XML))
++$(eval $(call BuildPlugin,extra,$(ULOGD_EXTRA_PLUGINS)))
+diff --git a/feeds/packages/net/ulogd/files/ulogd.init b/feeds/packages/net/ulogd/files/ulogd.init
+new file mode 100644
+index 0000000..3650322
+--- /dev/null
++++ b/feeds/packages/net/ulogd/files/ulogd.init
+@@ -0,0 +1,12 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=20
++
++USE_PROCD=1
++
++start_service() {
++ procd_open_instance
++ procd_set_param command /usr/sbin/ulogd
++ procd_close_instance
++}
+diff --git a/feeds/packages/net/ulogd/patches/100-musl-compat.patch b/feeds/packages/net/ulogd/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..2f1c293
+--- /dev/null
++++ b/feeds/packages/net/ulogd/patches/100-musl-compat.patch
+@@ -0,0 +1,57 @@
++--- a/src/ulogd.c
+++++ b/src/ulogd.c
++@@ -83,7 +83,7 @@ static char *ulogd_logfile = NULL;
++ static const char *ulogd_configfile = ULOGD_CONFIGFILE;
++ static const char *ulogd_pidfile = NULL;
++ static int ulogd_pidfile_fd = -1;
++-static FILE syslog_dummy;
+++static int ulogd_use_syslog = 0;
++
++ static int info_mode = 0;
++
++@@ -427,7 +427,7 @@ void __ulogd_log(int level, char *file,
++ if (level < loglevel_ce.u.value)
++ return;
++
++- if (logfile == &syslog_dummy) {
+++ if (ulogd_use_syslog) {
++ /* FIXME: this omits the 'file' string */
++ va_start(ap, format);
++ vsyslog(ulogd2syslog_level(level), format, ap);
++@@ -950,7 +950,7 @@ static int logfile_open(const char *name
++ logfile = stdout;
++ } else if (!strcmp(name, "syslog")) {
++ openlog("ulogd", LOG_PID, LOG_DAEMON);
++- logfile = &syslog_dummy;
+++ ulogd_use_syslog = 1;
++ } else {
++ logfile = fopen(ulogd_logfile, "a");
++ if (!logfile) {
++@@ -1240,7 +1240,7 @@ static void sigterm_handler(int signal)
++ unload_plugins();
++ #endif
++
++- if (logfile != NULL && logfile != stdout && logfile != &syslog_dummy) {
+++ if (logfile != NULL && logfile != stdout) {
++ fclose(logfile);
++ logfile = NULL;
++ }
++@@ -1262,7 +1262,7 @@ static void signal_handler(int signal)
++ switch (signal) {
++ case SIGHUP:
++ /* reopen logfile */
++- if (logfile != stdout && logfile != &syslog_dummy) {
+++ if (logfile != NULL && logfile != stdout) {
++ fclose(logfile);
++ logfile = fopen(ulogd_logfile, "a");
++ if (!logfile) {
++--- a/filter/raw2packet/ulogd_raw2packet_BASE.c
+++++ b/filter/raw2packet/ulogd_raw2packet_BASE.c
++@@ -42,6 +42,7 @@
++ #include <ulogd/ulogd.h>
++ #include <ulogd/ipfix_protocol.h>
++ #include <netinet/if_ether.h>
+++#include <linux/types.h>
++ #include <string.h>
++
++ enum input_keys {
+diff --git a/feeds/packages/net/umurmur/Makefile b/feeds/packages/net/umurmur/Makefile
+new file mode 100644
+index 0000000..2725423
+--- /dev/null
++++ b/feeds/packages/net/umurmur/Makefile
+@@ -0,0 +1,103 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=umurmur
++PKG_VERSION:=0.2.16
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=git://github.com/umurmur/umurmur.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=0.2.16
++
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++PKG_MAINTAINER:=Martin Johansson <martin@fatbob.nu>
++PKG_LICENSE:=BSD-3-Clause
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/umurmur/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Instant Messaging
++ TITLE:=uMurmur
++ DEPENDS:=+libconfig +libprotobuf-c
++ URL:=http://code.google.com/p/umurmur
++ MAINTAINER:=Martin Johansson <martin@fatbob.nu>
++endef
++
++define Package/umurmur/Default/description
++ Minimalistic Mumble server daemon.
++endef
++
++define Package/umurmur-openssl
++ $(call Package/umurmur/Default)
++ TITLE+= (with OpenSSL support)
++ DEPENDS+= +libopenssl
++ VARIANT:=openssl
++endef
++
++define Package/umurmur-openssl/description
++ $(call Package/umurmur/Default/description)
++ Uses OpenSSL library for SSL and crypto.
++endef
++
++define Package/umurmur-polarssl
++ $(call Package/umurmur/Default)
++ TITLE+= (with PolarSSL support)
++ DEPENDS+= +libpolarssl
++ VARIANT:=polarssl
++endef
++
++define Package/umurmur-polarssl/description
++ $(call Package/umurmur/Default/description)
++ Uses the PolarSSL library for SSL and crypto.
++endef
++
++define Build/Compile
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ $(MAKE) -C $(PKG_BUILD_DIR)/src all
++endef
++
++define Package/umurmur-openssl/conffiles
++/etc/umurmur.conf
++endef
++
++Package/umurmur-polarssl/conffiles = $(Package/umurmur-openssl/conffiles)
++
++define Package/umurmur-openssl/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/umurmurd $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/openwrt/files/umurmur.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/openwrt/files/umurmur.init $(1)/etc/init.d/umurmur
++ $(INSTALL_DIR) $(1)/etc/umurmur
++endef
++
++Package/umurmur-polarssl/install = $(Package/umurmur-openssl/install)
++
++ifeq ($(BUILD_VARIANT),openssl)
++ CONFIGURE_ARGS += \
++ --with-ssl=openssl
++endif
++
++ifeq ($(BUILD_VARIANT),polarssl)
++ CONFIGURE_ARGS += \
++ --with-ssl=polarssl
++endif
++
++$(eval $(call BuildPackage,umurmur-openssl))
++$(eval $(call BuildPackage,umurmur-polarssl))
+diff --git a/feeds/packages/net/umurmur/patches/10-Add-compile-time-check-for-POLARSSL_VERSION_FEATURES.patch b/feeds/packages/net/umurmur/patches/10-Add-compile-time-check-for-POLARSSL_VERSION_FEATURES.patch
+new file mode 100644
+index 0000000..c8fcdc8
+--- /dev/null
++++ b/feeds/packages/net/umurmur/patches/10-Add-compile-time-check-for-POLARSSL_VERSION_FEATURES.patch
+@@ -0,0 +1,17 @@
++diff --git a/src/ssli_polarssl.c b/src/ssli_polarssl.c
++index a36ccb6..167637b 100644
++--- a/src/ssli_polarssl.c
+++++ b/src/ssli_polarssl.c
++@@ -225,8 +225,12 @@ void SSLi_init(void)
++ Log_fatal("Cannot open /dev/urandom");
++ #endif
++
+++#ifdef POLARSSL_VERSION_FEATURES
++ version_get_string(verstring);
++ Log_info("PolarSSL library version %s initialized", verstring);
+++#else
+++ Log_info("PolarSSL library initialized");
+++#endif
++ }
++
++ void SSLi_deinit(void)
+diff --git a/feeds/packages/net/unbound/Makefile b/feeds/packages/net/unbound/Makefile
+new file mode 100644
+index 0000000..ae346b1
+--- /dev/null
++++ b/feeds/packages/net/unbound/Makefile
+@@ -0,0 +1,175 @@
++#
++# Copyright (C) 2010-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=unbound
++PKG_VERSION:=1.5.6
++PKG_RELEASE:=1
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENSE
++PKG_MAINTAINER:=Michael Hanselmann <public@hansmi.ch>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.unbound.net/downloads
++PKG_MD5SUM:=691a34abd8e9257dd65b70f28326c1f0
++
++PKG_BUILD_DEPENDS:=libexpat
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/unbound/Default
++ TITLE:=A validating, recursive & caching DNS resolver
++ URL:=http://www.unbound.net/
++ DEPENDS:=+libopenssl
++endef
++
++define Package/unbound
++ $(call Package/unbound/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ TITLE+= (daemon)
++ DEPENDS+= +libunbound
++endef
++
++define Package/unbound/description
++ This package contains the Unbound daemon.
++endef
++
++define Package/unbound-anchor
++ $(call Package/unbound/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ TITLE+= (anchor utility)
++ DEPENDS+= +unbound +libexpat
++endef
++
++define Package/unbound-anchor/description
++ This package contains the Unbound anchor utility.
++endef
++
++define Package/unbound-control
++ $(call Package/unbound/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ TITLE+= (control utility)
++ DEPENDS+= +unbound
++endef
++
++define Package/unbound-control/description
++ This package contains the Unbound control utility.
++endef
++
++define Package/unbound-control-setup
++ $(call Package/unbound/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ TITLE+= (control setup utility)
++ DEPENDS+= +unbound-control +openssl-util
++endef
++
++define Package/unbound-control-setup/description
++ This package contains the Unbound control setup utility.
++endef
++
++define Package/unbound-host
++ $(call Package/unbound/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ TITLE+= (DNS lookup utility)
++ DEPENDS+= +libunbound
++endef
++
++define Package/unbound-host/description
++ This package contains the Unbound DNS lookup utility.
++endef
++
++define Package/libunbound
++ $(call Package/unbound/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= (library)
++endef
++
++define Package/libunbound/description
++ This package contains the Unbound shared library.
++endef
++
++CONFIGURE_ARGS += \
++ --disable-gost \
++ --enable-allsymbols \
++ --with-libexpat="$(STAGING_DIR)/usr" \
++ --with-ssl="$(STAGING_DIR)/usr" \
++ --without-pthreads
++
++define Package/unbound/conffiles
++/etc/unbound/unbound.conf
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/unbound.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libunbound.{so*,a,la} $(1)/usr/lib/
++endef
++
++define Package/unbound/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/sbin/unbound \
++ $(PKG_INSTALL_DIR)/usr/sbin/unbound-checkconf \
++ $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/unbound
++ $(INSTALL_CONF) \
++ $(PKG_INSTALL_DIR)/etc/unbound/unbound.conf \
++ $(1)/etc/unbound/
++ $(INSTALL_CONF) ./files/root.key $(1)/etc/unbound/
++ $(INSTALL_CONF) ./files/named.cache $(1)/etc/unbound/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/unbound.init $(1)/etc/init.d/unbound
++endef
++
++define Package/unbound-anchor/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/unbound-anchor $(1)/usr/sbin/
++endef
++
++define Package/unbound-control/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/unbound-control $(1)/usr/sbin/
++endef
++
++define Package/unbound-control-setup/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/unbound-control-setup $(1)/usr/sbin/
++endef
++
++define Package/unbound-host/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/unbound-host $(1)/usr/sbin/
++endef
++
++define Package/libunbound/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libunbound.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,unbound))
++$(eval $(call BuildPackage,unbound-anchor))
++$(eval $(call BuildPackage,unbound-control))
++$(eval $(call BuildPackage,unbound-control-setup))
++$(eval $(call BuildPackage,unbound-host))
++$(eval $(call BuildPackage,libunbound))
+diff --git a/feeds/packages/net/unbound/files/named.cache b/feeds/packages/net/unbound/files/named.cache
+new file mode 100644
+index 0000000..9cc2022
+--- /dev/null
++++ b/feeds/packages/net/unbound/files/named.cache
+@@ -0,0 +1,90 @@
++; This file holds the information on root name servers needed to
++; initialize cache of Internet domain name servers
++; (e.g. reference this file in the "cache . <file>"
++; configuration file of BIND domain name servers).
++;
++; This file is made available by InterNIC
++; under anonymous FTP as
++; file /domain/named.cache
++; on server FTP.INTERNIC.NET
++; -OR- RS.INTERNIC.NET
++;
++; last update: November 05, 2014
++; related version of root zone: 2014110501
++;
++; formerly NS.INTERNIC.NET
++;
++. 3600000 NS A.ROOT-SERVERS.NET.
++A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
++A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:ba3e::2:30
++;
++; FORMERLY NS1.ISI.EDU
++;
++. 3600000 NS B.ROOT-SERVERS.NET.
++B.ROOT-SERVERS.NET. 3600000 A 192.228.79.201
++B.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:84::b
++;
++; FORMERLY C.PSI.NET
++;
++. 3600000 NS C.ROOT-SERVERS.NET.
++C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
++C.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2::c
++;
++; FORMERLY TERP.UMD.EDU
++;
++. 3600000 NS D.ROOT-SERVERS.NET.
++D.ROOT-SERVERS.NET. 3600000 A 199.7.91.13
++D.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2d::d
++;
++; FORMERLY NS.NASA.GOV
++;
++. 3600000 NS E.ROOT-SERVERS.NET.
++E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10
++;
++; FORMERLY NS.ISC.ORG
++;
++. 3600000 NS F.ROOT-SERVERS.NET.
++F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241
++F.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2f::f
++;
++; FORMERLY NS.NIC.DDN.MIL
++;
++. 3600000 NS G.ROOT-SERVERS.NET.
++G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4
++;
++; FORMERLY AOS.ARL.ARMY.MIL
++;
++. 3600000 NS H.ROOT-SERVERS.NET.
++H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53
++H.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:1::803f:235
++;
++; FORMERLY NIC.NORDU.NET
++;
++. 3600000 NS I.ROOT-SERVERS.NET.
++I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17
++I.ROOT-SERVERS.NET. 3600000 AAAA 2001:7fe::53
++;
++; OPERATED BY VERISIGN, INC.
++;
++. 3600000 NS J.ROOT-SERVERS.NET.
++J.ROOT-SERVERS.NET. 3600000 A 192.58.128.30
++J.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:c27::2:30
++;
++; OPERATED BY RIPE NCC
++;
++. 3600000 NS K.ROOT-SERVERS.NET.
++K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129
++K.ROOT-SERVERS.NET. 3600000 AAAA 2001:7fd::1
++;
++; OPERATED BY ICANN
++;
++. 3600000 NS L.ROOT-SERVERS.NET.
++L.ROOT-SERVERS.NET. 3600000 A 199.7.83.42
++L.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:3::42
++;
++; OPERATED BY WIDE
++;
++. 3600000 NS M.ROOT-SERVERS.NET.
++M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33
++M.ROOT-SERVERS.NET. 3600000 AAAA 2001:dc3::35
++; End of file
+diff --git a/feeds/packages/net/unbound/files/root.key b/feeds/packages/net/unbound/files/root.key
+new file mode 100644
+index 0000000..2ad6641
+--- /dev/null
++++ b/feeds/packages/net/unbound/files/root.key
+@@ -0,0 +1 @@
++. IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5
+diff --git a/feeds/packages/net/unbound/files/unbound.init b/feeds/packages/net/unbound/files/unbound.init
+new file mode 100755
+index 0000000..4e700e4
+--- /dev/null
++++ b/feeds/packages/net/unbound/files/unbound.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++#Copyright (C) 2010 Ondrej Caletka <o.caletka@sh.cvut.cz>
++START=61
++
++start () {
++ unbound
++}
++
++stop () {
++ PIDFILE='/var/run/unbound.pid'
++ if [ -f $PIDFILE ] ; then
++ kill $(cat $PIDFILE)
++ fi
++}
+diff --git a/feeds/packages/net/unbound/patches/001-conf.patch b/feeds/packages/net/unbound/patches/001-conf.patch
+new file mode 100644
+index 0000000..a795532
+--- /dev/null
++++ b/feeds/packages/net/unbound/patches/001-conf.patch
+@@ -0,0 +1,156 @@
++diff --git a/doc/example.conf.in b/doc/example.conf.in
++index 60ed5c8..abd85f9 100644
++--- a/doc/example.conf.in
+++++ b/doc/example.conf.in
++@@ -38,6 +38,8 @@ server:
++ # interface: 192.0.2.154
++ # interface: 192.0.2.154@5003
++ # interface: 2001:DB8::5
+++ interface: 0.0.0.0
+++ interface: ::0
++
++ # enable this feature to copy the source address of queries to reply.
++ # Socket options are not supported on all platforms. experimental.
++@@ -57,6 +59,7 @@ server:
++ # port range that can be open simultaneously. About double the
++ # num-queries-per-thread, or, use as many as the OS will allow you.
++ # outgoing-range: 4096
+++ outgoing-range: 60
++
++ # permit unbound to use this port number or port range for
++ # making outgoing queries, using an outgoing interface.
++@@ -73,9 +76,11 @@ server:
++
++ # number of outgoing simultaneous tcp buffers to hold per thread.
++ # outgoing-num-tcp: 10
+++ outgoing-num-tcp: 1
++
++ # number of incoming simultaneous tcp buffers to hold per thread.
++ # incoming-num-tcp: 10
+++ incoming-num-tcp: 1
++
++ # buffer size for UDP port 53 incoming (SO_RCVBUF socket option).
++ # 0 is system default. Use 4m to catch query spikes for busy servers.
++@@ -99,18 +104,22 @@ server:
++ # buffer size for handling DNS data. No messages larger than this
++ # size can be sent or received, by UDP or TCP. In bytes.
++ # msg-buffer-size: 65552
+++ msg-buffer-size: 8192
++
++ # the amount of memory to use for the message cache.
++ # plain value in bytes or you can append k, m or G. default is "4Mb".
++ # msg-cache-size: 4m
+++ msg-cache-size: 100k
++
++ # the number of slabs to use for the message cache.
++ # the number of slabs must be a power of 2.
++ # more slabs reduce lock contention, but fragment memory usage.
++ # msg-cache-slabs: 4
+++ msg-cache-slabs: 1
++
++ # the number of queries that a thread gets to service.
++ # num-queries-per-thread: 1024
+++ num-queries-per-thread: 30
++
++ # if very busy, 50% queries run to completion, 50% get timeout in msec
++ # jostle-timeout: 200
++@@ -121,11 +130,13 @@ server:
++ # the amount of memory to use for the RRset cache.
++ # plain value in bytes or you can append k, m or G. default is "4Mb".
++ # rrset-cache-size: 4m
+++ rrset-cache-size: 100k
++
++ # the number of slabs to use for the RRset cache.
++ # the number of slabs must be a power of 2.
++ # more slabs reduce lock contention, but fragment memory usage.
++ # rrset-cache-slabs: 4
+++ rrset-cache-slabs: 1
++
++ # the time to live (TTL) value lower bound, in seconds. Default 0.
++ # If more than an hour could easily give trouble due to stale data.
++@@ -146,9 +157,11 @@ server:
++ # the number of slabs must be a power of 2.
++ # more slabs reduce lock contention, but fragment memory usage.
++ # infra-cache-slabs: 4
+++ infra-cache-slabs: 1
++
++ # the maximum number of hosts that are cached (roundtrip, EDNS, lame).
++ # infra-cache-numhosts: 10000
+++ infra-cache-numhosts: 200
++
++ # Enable IPv4, "yes" or "no".
++ # do-ip4: yes
++@@ -181,6 +194,8 @@ server:
++ # access-control: ::0/0 refuse
++ # access-control: ::1 allow
++ # access-control: ::ffff:127.0.0.1 allow
+++ access-control: 0.0.0.0/0 allow
+++ access-control: ::0/0 allow
++
++ # if given, a chroot(2) is done to the given directory.
++ # i.e. you can chroot to the working directory, for example,
++@@ -211,6 +226,7 @@ server:
++ # and the given username is assumed. Default is user "unbound".
++ # If you give "" no privileges are dropped.
++ # username: "@UNBOUND_USERNAME@"
+++ username: ""
++
++ # the working directory. The relative files in this config are
++ # relative to this directory. If you give "" the working directory
++@@ -233,10 +249,12 @@ server:
++
++ # the pid file. Can be an absolute path outside of chroot/work dir.
++ # pidfile: "@UNBOUND_PIDFILE@"
+++ pidfile: "/var/run/unbound.pid"
++
++ # file to read root hints from.
++ # get one from ftp://FTP.INTERNIC.NET/domain/named.cache
++ # root-hints: ""
+++ root-hints: "/etc/unbound/named.cache"
++
++ # enable to not answer id.server and hostname.bind queries.
++ # hide-identity: no
++@@ -259,12 +277,15 @@ server:
++ # positive value: fetch that many targets opportunistically.
++ # Enclose the list of numbers between quotes ("").
++ # target-fetch-policy: "3 2 1 0 0"
+++ target-fetch-policy: "2 1 0 0 0 0"
++
++ # Harden against very small EDNS buffer sizes.
++ # harden-short-bufsize: no
+++ harden-short-bufsize: yes
++
++ # Harden against unseemly large queries.
++ # harden-large-queries: no
+++ harden-large-queries: yes
++
++ # Harden against out of zone rrsets, to avoid spoofing attempts.
++ # harden-glue: yes
++@@ -345,7 +366,7 @@ server:
++ # you start unbound (i.e. in the system boot scripts). And enable:
++ # Please note usage of unbound-anchor root anchor is at your own risk
++ # and under the terms of our LICENSE (see that file in the source).
++- # auto-trust-anchor-file: "@UNBOUND_ROOTKEY_FILE@"
+++ auto-trust-anchor-file: "@UNBOUND_ROOTKEY_FILE@"
++
++ # File with DLV trusted keys. Same format as trust-anchor-file.
++ # There can be only one DLV configured, it is trusted from root down.
++@@ -431,15 +452,18 @@ server:
++ # the amount of memory to use for the key cache.
++ # plain value in bytes or you can append k, m or G. default is "4Mb".
++ # key-cache-size: 4m
+++ key-cache-size: 100k
++
++ # the number of slabs to use for the key cache.
++ # the number of slabs must be a power of 2.
++ # more slabs reduce lock contention, but fragment memory usage.
++ # key-cache-slabs: 4
+++ key-cache-slabs: 1
++
++ # the amount of memory to use for the negative cache (used for DLV).
++ # plain value in bytes or you can append k, m or G. default is "1Mb".
++ # neg-cache-size: 1m
+++ neg-cache-size: 10k
++
++ # By default, for a number of zones a small default 'nothing here'
++ # reply is built-in. Query traffic is thus blocked. If you
+diff --git a/feeds/packages/net/usbip/Makefile b/feeds/packages/net/usbip/Makefile
+new file mode 100644
+index 0000000..4913057
+--- /dev/null
++++ b/feeds/packages/net/usbip/Makefile
+@@ -0,0 +1,108 @@
++#
++# Copyright (C) 2010-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=usbip
++PKG_RELEASE:=5
++PKG_LICENSE:=GPL-2.0
++
++# Since kernel 2.6.39.1 userspace tools are inside the kernel tree
++# Package Automatic match version in kernel
++# MD5SUM is not useful kernel package already check it
++PKG_VERSION:=$(shell sed -n -e '/^AC_INIT/s/.*\[\([[:digit:]\.]*\)\].*/\1/gp' $(LINUX_DIR)/tools/usb/usbip/configure.ac)
++PKG_SOURCE:=
++PKG_SOURCE_URL:=
++PKG_MD5SUM:=unknown
++
++PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
++
++PATCH_DIR:=./patches-$(PKG_VERSION)
++
++define prepare_source_directory
++ rm -rf $(PKG_BUILD_DIR)
++ $(CP) $(LINUX_DIR)/tools/usb/usbip $(PKG_BUILD_DIR)
++endef
++Hooks/Prepare/Pre += prepare_source_directory
++
++PKG_BUILD_DEPENDS:=udev
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/usbip/Common
++ TITLE:=USB-over-IP
++ URL:=http://usbip.sourceforge.net/
++ DEPENDS:=@USB_SUPPORT
++endef
++
++define Package/usbip/Default
++ $(call Package/usbip/Common)
++ SECTION:=net
++ CATEGORY:=Network
++endef
++
++define Package/usbip
++ $(call Package/usbip/Default)
++ TITLE+= (common)
++ DEPENDS+= +libwrap +kmod-usbip +udev
++endef
++
++define Package/usbip-client
++ $(call Package/usbip/Default)
++ TITLE+= (client)
++ DEPENDS+= usbip +kmod-usbip-client
++endef
++
++define Package/usbip-server
++ $(call Package/usbip/Default)
++ TITLE+= (server)
++ DEPENDS+= usbip +kmod-usbip-server
++endef
++
++CONFIGURE_PATH:=.
++MAKE_PATH:=.
++LIBTOOL_PATHS:=.
++MAKE_FLAGS+=CFLAGS="-Wno-implicit-function-declaration"
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); ./autogen.sh );
++ $(call Build/Configure/Default)
++endef
++
++CFLAGS+="$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include"
++
++define Download/usb.ids
++ URL:=http://www.linux-usb.org/
++ FILE:=usb.ids
++ MD5SUM:=
++endef
++
++define Package/usbip/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libusbip.so.* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/share/hwdata
++ $(CP) $(DL_DIR)/usb.ids $(1)/usr/share/hwdata/
++endef
++
++define Package/usbip-client/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/usbip $(1)/usr/sbin/
++endef
++
++define Package/usbip-server/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/usbipd $(1)/usr/sbin/
++endef
++
++$(eval $(call Download,usb.ids))
++$(eval $(call BuildPackage,usbip))
++$(eval $(call BuildPackage,usbip-client))
++$(eval $(call BuildPackage,usbip-server))
+diff --git a/feeds/packages/net/usbip/patches-2.0/100-musl-compat.patch b/feeds/packages/net/usbip/patches-2.0/100-musl-compat.patch
+new file mode 100644
+index 0000000..a64678c
+--- /dev/null
++++ b/feeds/packages/net/usbip/patches-2.0/100-musl-compat.patch
+@@ -0,0 +1,11 @@
++--- a/src/usbipd.c
+++++ b/src/usbipd.c
++@@ -453,7 +453,7 @@ static void set_signal(void)
++ sigaction(SIGTERM, &act, NULL);
++ sigaction(SIGINT, &act, NULL);
++ act.sa_handler = SIG_IGN;
++- sigaction(SIGCLD, &act, NULL);
+++ sigaction(SIGCHLD, &act, NULL);
++ }
++
++ static const char *pid_file;
+diff --git a/feeds/packages/net/usbip/patches/001-upstream_svn_r99.diff b/feeds/packages/net/usbip/patches/001-upstream_svn_r99.diff
+new file mode 100644
+index 0000000..aa193e1
+--- /dev/null
++++ b/feeds/packages/net/usbip/patches/001-upstream_svn_r99.diff
+@@ -0,0 +1,11 @@
++Index: trunk/src/cmd/Makefile.am
++===================================================================
++--- trunk/src/cmd/Makefile.am (revision 98)
+++++ trunk/src/cmd/Makefile.am (revision 99)
++@@ -17,5 +17,5 @@
++ INCLUDES = -I$(top_srcdir)/lib
++ LDADD = ../lib/libusbip.la @PACKAGE_LIBS@
++ EXTRA_CFLAGS = @EXTRA_CFLAGS@
++-AM_CFLAGS = -Wall -W -Wstrict-prototypes -std=gnu99 $(EXTRA_CFLAGS) @PACKAGE_CFLAGS@
+++AM_CFLAGS = -Wall -W -Wstrict-prototypes -std=gnu99 $(EXTRA_CFLAGS) @PACKAGE_CFLAGS@ -DUSBIDS_FILE='"@USBIDS_DIR@/usb.ids"'
++
+diff --git a/feeds/packages/net/usbip/patches/002-upstream_svn_r152.patch b/feeds/packages/net/usbip/patches/002-upstream_svn_r152.patch
+new file mode 100644
+index 0000000..e7135a6
+--- /dev/null
++++ b/feeds/packages/net/usbip/patches/002-upstream_svn_r152.patch
+@@ -0,0 +1,229 @@
++--- a/drivers/head/stub_dev.c
+++++ b/drivers/head/stub_dev.c
++@@ -398,7 +398,11 @@ static int stub_probe(struct usb_interfa
++ {
++ struct usb_device *udev = interface_to_usbdev(interface);
++ struct stub_device *sdev = NULL;
+++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
++ char *udev_busid = interface->dev.parent->bus_id;
+++#else
+++ char *udev_busid = dev_name(interface->dev.parent);
+++#endif
++ int err = 0;
++
++ udbg("Enter\n");
++--- a/drivers/head/stub_main.c
+++++ b/drivers/head/stub_main.c
++@@ -252,18 +252,17 @@ static int __init usb_stub_init(void)
++ return -ENOMEM;
++ }
++
+++ info(DRIVER_DESC "" DRIVER_VERSION);
+++
+++ memset(busid_table, 0, sizeof(busid_table));
+++ spin_lock_init(&busid_table_lock);
+++
++ ret = usb_register(&stub_driver);
++ if (ret) {
++ uerr("usb_register failed %d\n", ret);
++ return ret;
++ }
++
++-
++- info(DRIVER_DESC "" DRIVER_VERSION);
++-
++- memset(busid_table, 0, sizeof(busid_table));
++- spin_lock_init(&busid_table_lock);
++-
++ ret = driver_create_file(&stub_driver.drvwrap.driver, &driver_attr_match_busid);
++
++ if (ret) {
++--- a/drivers/head/stub_rx.c
+++++ b/drivers/head/stub_rx.c
++@@ -159,7 +159,11 @@ static int tweak_set_configuration_cmd(s
++ * A user may need to set a special configuration value before
++ * exporting the device.
++ */
+++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
++ uinfo("set_configuration (%d) to %s\n", config, urb->dev->dev.bus_id);
+++#else
+++ uinfo("set_configuration (%d) to %s\n", config, dev_name(&urb->dev->dev));
+++#endif
++ uinfo("but, skip!\n");
++
++ return 0;
++@@ -177,7 +181,11 @@ static int tweak_reset_device_cmd(struct
++ value = le16_to_cpu(req->wValue);
++ index = le16_to_cpu(req->wIndex);
++
+++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
++ uinfo("reset_device (port %d) to %s\n", index, urb->dev->dev.bus_id);
+++#else
+++ uinfo("reset_device (port %d) to %s\n", index, dev_name(&urb->dev->dev));
+++#endif
++
++ /* all interfaces should be owned by usbip driver, so just reset it. */
++ ret = usb_lock_device_for_reset(urb->dev, NULL);
++@@ -187,7 +195,11 @@ static int tweak_reset_device_cmd(struct
++ }
++
++ /* try to reset the device */
++- ret = usb_reset_composite_device(urb->dev, NULL);
+++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
+++ ret = usb_reset_composite_device(urb->dev, NULL);
+++#else
+++ ret = usb_reset_device(urb->dev);
+++#endif
++ if (ret < 0)
++ uerr("device reset\n");
++
++--- a/drivers/head/usbip_common.c
+++++ b/drivers/head/usbip_common.c
++@@ -55,10 +55,7 @@ static ssize_t show_flag(struct device *
++ static ssize_t store_flag(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++ {
++- unsigned long flag;
++-
++- sscanf(buf, "%lx", &flag);
++- usbip_debug_flag = flag;
+++ sscanf(buf, "%lx", &usbip_debug_flag);
++
++ return count;
++ }
++@@ -390,7 +387,7 @@ int usbip_thread(void *param)
++ unlock_kernel();
++
++ /* srv.rb must wait for rx_thread starting */
++- complete(&ut->thread_done);
+++ complete(&ut->thread_started);
++
++ /* start of while loop */
++ ut->loop_ops(ut);
++@@ -403,15 +400,21 @@ int usbip_thread(void *param)
++
++ void usbip_start_threads(struct usbip_device *ud)
++ {
+++
++ /*
++ * threads are invoked per one device (per one connection).
++ */
+++ INIT_COMPLETION(ud->tcp_rx.thread_started);
+++ INIT_COMPLETION(ud->tcp_tx.thread_started);
+++ INIT_COMPLETION(ud->tcp_rx.thread_done);
+++ INIT_COMPLETION(ud->tcp_tx.thread_done);
+++
++ kernel_thread((int(*)(void *))usbip_thread, (void *)&ud->tcp_rx, 0);
++ kernel_thread((int(*)(void *))usbip_thread, (void *)&ud->tcp_tx, 0);
++
++ /* confirm threads are starting */
++- wait_for_completion(&ud->tcp_rx.thread_done);
++- wait_for_completion(&ud->tcp_tx.thread_done);
+++ wait_for_completion(&ud->tcp_rx.thread_started);
+++ wait_for_completion(&ud->tcp_tx.thread_started);
++ }
++ EXPORT_SYMBOL(usbip_start_threads);
++
++@@ -436,6 +439,7 @@ void usbip_task_init(struct usbip_task *
++ void (*loop_ops)(struct usbip_task *))
++ {
++ ut->thread = NULL;
+++ init_completion(&ut->thread_started);
++ init_completion(&ut->thread_done);
++ ut->name = name;
++ ut->loop_ops = loop_ops;
++--- a/drivers/head/usbip_event.c
+++++ b/drivers/head/usbip_event.c
++@@ -38,7 +38,7 @@ void usbip_start_eh(struct usbip_device
++
++ kernel_thread((int(*)(void *)) usbip_thread, (void *) eh, 0);
++
++- wait_for_completion(&eh->thread_done);
+++ wait_for_completion(&eh->thread_started);
++ }
++ EXPORT_SYMBOL(usbip_start_eh);
++
++--- a/drivers/head/vhci_hcd.c
+++++ b/drivers/head/vhci_hcd.c
++@@ -58,7 +58,7 @@ static void vhci_stop(struct usb_hcd *hc
++ static int vhci_get_frame_number(struct usb_hcd *hcd);
++
++ static const char driver_name[] = "vhci_hcd";
++-static const char driver_desc[] = "USB/IP Virtual Host Contoroller";
+++static const char driver_desc[] = "USB/IP Virtual Host Controller";
++
++
++
++@@ -416,14 +416,6 @@ static int vhci_hub_control(struct usb_h
++ case USB_PORT_FEAT_SUSPEND:
++ dbg_vhci_rh(" SetPortFeature: USB_PORT_FEAT_SUSPEND\n");
++ uerr(" not yet\n");
++-#if 0
++- dum->port_status[rhport] |= (1 << USB_PORT_FEAT_SUSPEND);
++- if (dum->driver->suspend) {
++- spin_unlock (&dum->lock);
++- dum->driver->suspend (&dum->gadget);
++- spin_lock (&dum->lock);
++- }
++-#endif
++ break;
++ case USB_PORT_FEAT_RESET:
++ dbg_vhci_rh(" SetPortFeature: USB_PORT_FEAT_RESET\n");
++@@ -432,12 +424,6 @@ static int vhci_hub_control(struct usb_h
++ dum->port_status[rhport] &= ~(USB_PORT_STAT_ENABLE
++ | USB_PORT_STAT_LOW_SPEED
++ | USB_PORT_STAT_HIGH_SPEED);
++-#if 0
++- if (dum->driver) {
++- dev_dbg (hardware, "disconnect\n");
++- stop_activity (dum, dum->driver);
++- }
++-#endif
++
++ /* FIXME test that code path! */
++ }
++@@ -1060,7 +1046,7 @@ static int vhci_hcd_probe(struct platfor
++ struct usb_hcd *hcd;
++ int ret;
++
++- uinfo("proving...\n");
+++ uinfo("probing...\n");
++
++ dbg_vhci_hc("name %s id %d\n", pdev->name, pdev->id);
++
++@@ -1076,7 +1062,11 @@ static int vhci_hcd_probe(struct platfor
++ * Allocate and initialize hcd.
++ * Our private data is also allocated automatically.
++ */
+++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
++ hcd = usb_create_hcd(&vhci_hc_driver, &pdev->dev, pdev->dev.bus_id);
+++#else
+++ hcd = usb_create_hcd(&vhci_hc_driver, &pdev->dev, dev_name(&pdev->dev));
+++#endif
++ if (!hcd) {
++ uerr("create hcd failed\n");
++ return -ENOMEM;
++--- a/drivers/head/vhci_sysfs.c
+++++ b/drivers/head/vhci_sysfs.c
++@@ -123,7 +123,11 @@ static ssize_t show_status(struct device
++ out += sprintf(out, "%03u %08x ",
++ vdev->speed, vdev->devid);
++ out += sprintf(out, "%16p ", vdev->ud.tcp_socket);
+++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
++ out += sprintf(out, "%s", vdev->udev->dev.bus_id);
+++#else
+++ out += sprintf(out, "%s", dev_name(&vdev->udev->dev));
+++#endif
++
++ } else
++ out += sprintf(out, "000 000 000 0000000000000000 0-0");
++--- a/drivers/head/usbip_common.h
+++++ b/drivers/head/usbip_common.h
++@@ -300,6 +300,7 @@ struct usbip_device;
++
++ struct usbip_task {
++ struct task_struct *thread;
+++ struct completion thread_started;
++ struct completion thread_done;
++ char *name;
++ void (*loop_ops)(struct usbip_task *);
+diff --git a/feeds/packages/net/vnstat/Makefile b/feeds/packages/net/vnstat/Makefile
+new file mode 100644
+index 0000000..cae144e
+--- /dev/null
++++ b/feeds/packages/net/vnstat/Makefile
+@@ -0,0 +1,109 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=vnstat
++PKG_VERSION:=1.12
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://humdi.net/vnstat
++PKG_MD5SUM:=a154b2196771e06a8accd1c24374009c
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++
++PKG_INSTALL:=1
++
++PKG_BUILD_DEPENDS:=libgd
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/vnstat/Default
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://humdi.net/vnstat/
++endef
++
++define Package/vnstat
++$(call Package/vnstat/Default)
++ TITLE:=Console-based network traffic monitor
++endef
++
++define Package/vnstat/description
++ vnStat is a network traffic monitor for Linux that keeps a log of daily
++ network traffic for the selected interface(s). vnStat isn't a packet
++ sniffer. The traffic information is analyzed from the /proc -filesystem,
++ so vnStat can be used without root permissions.
++endef
++
++define Package/vnstati
++$(call Package/vnstat/Default)
++ DEPENDS+=vnstat +libgd
++ TITLE:=PNG image output support for vnStat
++endef
++
++define Package/vnstati/description
++ The purpose of vnstati is to provide image output support for statistics
++ collected using vnstat(1). However, the image file format is limited to
++ png. All basic outputs of vnStat are supported excluding live traffic
++ features. The image can be outputted either to a file or to standard
++ output.
++endef
++
++define Package/vnstat/conffiles
++/etc/vnstat.conf
++/etc/config/vnstat
++endef
++
++define Build/Compile/vnstat
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ CFLAGS="$(TARGET_CFLAGS)"
++endef
++
++define Build/Compile/vnstati
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ CFLAGS="$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include" \
++ LDFLAGS="$(TARGET_LDFLAGS) -Wl,-rpath-link,$(STAGING_DIR)/usr/lib" \
++ all
++endef
++
++define Build/Compile
++$(call Build/Compile/vnstat)
++$(call Build/Compile/vnstati)
++endef
++
++define Package/vnstat/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/vnstat $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/vnstatd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/vnstat.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/vnstat.config $(1)/etc/config/vnstat
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/vnstat.init $(1)/etc/init.d/vnstat
++ $(INSTALL_DIR) $(1)/etc/uci-defaults
++ $(INSTALL_BIN) ./files/vnstat.defaults $(1)/etc/uci-defaults/vnstat
++endef
++
++define Package/vnstati/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/vnstati $(1)/usr/bin/
++endef
++
++define Package/vnstat/postinst
++#!/bin/sh
++[ -n "$${IPKG_INSTROOT}" ] || (. /etc/uci-defaults/vnstat) && rm -f /etc/uci-defaults/vnstat
++exit 0
++endef
++
++$(eval $(call BuildPackage,vnstat))
++$(eval $(call BuildPackage,vnstati))
+diff --git a/feeds/packages/net/vnstat/files/vnstat.config b/feeds/packages/net/vnstat/files/vnstat.config
+new file mode 100644
+index 0000000..9da71ed
+--- /dev/null
++++ b/feeds/packages/net/vnstat/files/vnstat.config
+@@ -0,0 +1,5 @@
++config vnstat
++ list interface br-lan
++# list interface eth0.1
++# option remote http://example.org/vnstat/
++# option symlink /www/vnstat
+diff --git a/feeds/packages/net/vnstat/files/vnstat.defaults b/feeds/packages/net/vnstat/files/vnstat.defaults
+new file mode 100644
+index 0000000..e013b8e
+--- /dev/null
++++ b/feeds/packages/net/vnstat/files/vnstat.defaults
+@@ -0,0 +1,13 @@
++#!/bin/sh
++
++wan="$(uci -P/var/state get network.wan.ifname)"
++
++if [ -n "$wan" ]; then
++ uci -q batch <<-EOF >/dev/null
++ del_list vnstat.@vnstat[-1].interface=$wan
++ add_list vnstat.@vnstat[-1].interface=$wan
++ commit vnstat
++ EOF
++fi
++
++exit 0
+diff --git a/feeds/packages/net/vnstat/files/vnstat.init b/feeds/packages/net/vnstat/files/vnstat.init
+new file mode 100644
+index 0000000..802e60b
+--- /dev/null
++++ b/feeds/packages/net/vnstat/files/vnstat.init
+@@ -0,0 +1,82 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008-2011 OpenWrt.org
++
++START=99
++
++vnstat_option() {
++ sed -ne "s/^[[:space:]]*$1[[:space:]]*['\"]\([^'\"]*\)['\"].*/\1/p" \
++ /etc/vnstat.conf
++}
++
++start() {
++ local lib="$(vnstat_option DatabaseDir)"
++ local pid="$(vnstat_option PidFile)"
++
++ [ -n "$lib" ] || {
++ echo "Error: No DatabaseDir set in vnstat.conf" >&2
++ exit 1
++ }
++
++ [ -n "$pid" ] || {
++ echo "Error: No PidFile set in vnstat.conf" >&2
++ exit 1
++ }
++
++ mkdir -p "$lib"
++
++ init_ifaces() {
++ local cfg="$1"
++ local url lnk
++
++ init_iface() {
++ local ifn="$1"
++
++ [ -n "$url" ] && {
++ local try=0
++ local max=3
++ local hostname="$(cat /proc/sys/kernel/hostname)"
++
++ while [ $((++try)) -le $max ]; do
++ if wget -q -O "$lib/$ifn" "$url/${hostname}_$ifn" 2>/dev/null && [ -e "$lib/$ifn" ]; then
++ logger -t "vnstat" "Downloaded backup for database $ifn"
++ break
++ else
++ logger -t "vnstat" "Download try $try/$max for database $ifn failed"
++ sleep 30
++ fi
++ done
++ }
++
++ /usr/bin/vnstat -u -i "$ifn" >/dev/null
++
++ [ -n "$lnk" ] && {
++ mkdir -p "$lnk"
++ [ -L "$lnk/$ifn" ] || ln -s "$lib/$ifn" "$lnk/$ifn"
++ }
++ }
++
++ config_get url "$cfg" remote
++ config_get lnk "$cfg" symlink
++ config_list_foreach "$cfg" interface init_iface
++
++ return 1
++ }
++
++ config_load vnstat
++ config_foreach init_ifaces vnstat
++
++ SERVICE_PID_FILE="${pid}"
++ service_start /usr/sbin/vnstatd -d
++}
++
++stop() {
++ local pid="$(vnstat_option PidFile)"
++
++ [ -n "$pid" ] || {
++ echo "Error: No PidFile set in vnstat.conf" >&2
++ exit 1
++ }
++
++ SERVICE_PID_FILE="${pid}"
++ service_stop /usr/sbin/vnstatd
++}
+diff --git a/feeds/packages/net/vnstat/patches/001-conf.patch b/feeds/packages/net/vnstat/patches/001-conf.patch
+new file mode 100644
+index 0000000..5fb24c3
+--- /dev/null
++++ b/feeds/packages/net/vnstat/patches/001-conf.patch
+@@ -0,0 +1,19 @@
++--- a/cfg/vnstat.conf
+++++ b/cfg/vnstat.conf
++@@ -78,13 +78,13 @@ DaemonUser ""
++ DaemonGroup ""
++
++ # how often (in seconds) interface data is updated
++-UpdateInterval 30
+++UpdateInterval 60
++
++ # how often (in seconds) interface status changes are checked
++-PollInterval 5
+++PollInterval 30
++
++ # how often (in minutes) data is saved to file
++-SaveInterval 5
+++SaveInterval 30
++
++ # how often (in minutes) data is saved when all interface are offline
++ OfflineSaveInterval 30
+diff --git a/feeds/packages/net/vnstat/patches/002-no_install_strip.patch b/feeds/packages/net/vnstat/patches/002-no_install_strip.patch
+new file mode 100644
+index 0000000..8f11de6
+--- /dev/null
++++ b/feeds/packages/net/vnstat/patches/002-no_install_strip.patch
+@@ -0,0 +1,35 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -66,11 +66,11 @@ install:
++
++ # install everything else
++ install -d -m 755 $(BIN) $(SBIN) $(MAN)/man1 $(MAN)/man5
++- install -s -m 755 src/vnstat $(BIN)
++- install -s -m 755 src/vnstatd $(SBIN)
+++ install -m 755 src/vnstat $(BIN)
+++ install -m 755 src/vnstatd $(SBIN)
++ @if [ -f "src/vnstati" ]; \
++- then echo install -s -m 755 src/vnstati $(BIN); \
++- install -s -m 755 src/vnstati $(BIN); \
+++ then echo install -m 755 src/vnstati $(BIN); \
+++ install -m 755 src/vnstati $(BIN); \
++ fi
++
++ # update man pages, gzip it if previous version was done so
++@@ -139,12 +139,12 @@ bsdinstall:
++
++ # install binaries
++ install -d -m 755 $(DESTDIR)/var/db/vnstat
++- install -s -m 755 src/vnstat $(BIN_BSD)
++- install -s -m 755 src/vnstatd $(SBIN_BSD)
+++ install -m 755 src/vnstat $(BIN_BSD)
+++ install -m 755 src/vnstatd $(SBIN_BSD)
++
++ @if [ -f "src/vnstati" ]; \
++- then echo install -s -m 755 src/vnstati $(BIN_BSD); \
++- install -s -m 755 src/vnstati $(BIN_BSD); \
+++ then echo install -m 755 src/vnstati $(BIN_BSD); \
+++ install -m 755 src/vnstati $(BIN_BSD); \
++ fi
++
++ # install default config if such doesn't exist
+diff --git a/feeds/packages/net/vnstat/patches/003-no_install_uname.patch b/feeds/packages/net/vnstat/patches/003-no_install_uname.patch
+new file mode 100644
+index 0000000..14c17d5
+--- /dev/null
++++ b/feeds/packages/net/vnstat/patches/003-no_install_uname.patch
+@@ -0,0 +1,15 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -33,12 +33,6 @@ debug:
++ install:
++ @echo "Installing vnStat..."
++
++-# check that system is really Linux
++- @if [ `uname` != "Linux" ]; \
++- then echo "This isn't a Linux system. Maybe 'make bsdinstall' is what you need?"; \
++- false; \
++- fi
++-
++ # check that there's something to install
++ @if [ ! -f "src/vnstat" ] || [ ! -f "src/vnstatd" ]; \
++ then echo "Nothing to install, run make first."; \
+diff --git a/feeds/packages/net/vnstat/patches/100-musl-compat.patch b/feeds/packages/net/vnstat/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..0512389
+--- /dev/null
++++ b/feeds/packages/net/vnstat/patches/100-musl-compat.patch
+@@ -0,0 +1,10 @@
++--- a/src/common.h
+++++ b/src/common.h
++@@ -22,6 +22,7 @@
++ #include <pwd.h>
++ #include <grp.h>
++ #include <libgen.h>
+++#include <fcntl.h>
++
++ #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__FreeBSD_kernel__)
++ #include <sys/param.h>
+diff --git a/feeds/packages/net/vpnc-scripts/Makefile b/feeds/packages/net/vpnc-scripts/Makefile
+new file mode 100644
+index 0000000..3af3695
+--- /dev/null
++++ b/feeds/packages/net/vpnc-scripts/Makefile
+@@ -0,0 +1,37 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=vpnc-scripts
++PKG_VERSION:=20150116
++PKG_RELEASE:=2
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/vpnc-scripts
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=VPN configuration script for vpnc and OpenConnect
++ MAINTAINER:=Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
++ SUBMENU:=VPN
++endef
++
++define Package/vpnc-scripts/description
++ This package contains the vpnc-script which is used by vpnc
++ and OpenConnect to configure the tunnel interface.
++endef
++
++define Build/Compile
++endef
++
++define Package/vpnc-scripts/install
++ $(INSTALL_DIR) $(1)/lib/netifd
++ $(INSTALL_BIN) ./files/vpnc-script $(1)/lib/netifd/
++endef
++
++$(eval $(call BuildPackage,vpnc-scripts))
+diff --git a/feeds/packages/net/vpnc-scripts/files/vpnc-script b/feeds/packages/net/vpnc-scripts/files/vpnc-script
+new file mode 100755
+index 0000000..48c8ed0
+--- /dev/null
++++ b/feeds/packages/net/vpnc-scripts/files/vpnc-script
+@@ -0,0 +1,203 @@
++#!/bin/sh
++# List of parameters passed through environment
++#* reason -- why this script was called, one of: pre-init connect disconnect
++#* VPNGATEWAY -- vpn gateway address (always present)
++#* TUNDEV -- tunnel device (always present)
++#* INTERNAL_IP4_ADDRESS -- address (always present)
++#* INTERNAL_IP4_MTU -- mtu (often unset)
++#* INTERNAL_IP4_NETMASK -- netmask (often unset)
++#* INTERNAL_IP4_NETMASKLEN -- netmask length (often unset)
++#* INTERNAL_IP4_NETADDR -- address of network (only present if netmask is set)
++#* INTERNAL_IP4_DNS -- list of dns servers
++#* INTERNAL_IP4_NBNS -- list of wins servers
++#* INTERNAL_IP6_ADDRESS -- IPv6 address
++#* INTERNAL_IP6_NETMASK -- IPv6 netmask
++#* INTERNAL_IP6_DNS -- IPv6 list of dns servers
++#* CISCO_DEF_DOMAIN -- default domain name
++#* CISCO_BANNER -- banner from server
++#* CISCO_SPLIT_INC -- number of networks in split-network-list
++#* CISCO_SPLIT_INC_%d_ADDR -- network address
++#* CISCO_SPLIT_INC_%d_MASK -- subnet mask (for example: 255.255.255.0)
++#* CISCO_SPLIT_INC_%d_MASKLEN -- subnet masklen (for example: 24)
++#* CISCO_SPLIT_INC_%d_PROTOCOL -- protocol (often just 0)
++#* CISCO_SPLIT_INC_%d_SPORT -- source port (often just 0)
++#* CISCO_SPLIT_INC_%d_DPORT -- destination port (often just 0)
++#* CISCO_IPV6_SPLIT_INC -- number of networks in IPv6 split-network-list
++#* CISCO_IPV6_SPLIT_INC_%d_ADDR -- IPv6 network address
++#* CISCO_IPV6_SPLIT_INC_$%d_MASKLEN -- IPv6 subnet masklen
++
++HOOKS_DIR=/etc/openconnect
++
++# FIXMEs:
++
++# Section A: route handling
++
++# 1) The 3 values CISCO_SPLIT_INC_%d_PROTOCOL/SPORT/DPORT are currently being ignored
++# In order to use them, we'll probably need os specific solutions
++# * Linux: iptables -t mangle -I PREROUTING <conditions> -j ROUTE --oif $TUNDEV
++# This would be an *alternative* to changing the routes (and thus 2) and 3)
++# shouldn't be relevant at all)
++# 2) There are two different functions to set routes: generic routes and the
++# default route. Why isn't the defaultroute handled via the generic route case?
++# 3) In the split tunnel case, all routes but the default route might get replaced
++# without getting restored later. We should explicitely check and save them just
++# like the defaultroute
++# 4) Replies to a dhcp-server should never be sent into the tunnel
++
++# Section B: Split DNS handling
++
++# 1) We parse CISCO_SPLIT_DNS and use dnsmasq to set it
++
++do_connect() {
++ if [ -n "$CISCO_BANNER" ]; then
++ logger -t openconnect "Connect Banner:"
++ echo "$CISCO_BANNER" | while read LINE ; do logger -t openconnect "|" "$LINE" ; done
++ fi
++
++ proto_init_update "$TUNDEV" 1
++
++ if [ -n "$INTERNAL_IP4_MTU" ]; then
++ MTU=$INTERNAL_IP4_MTU
++ fi
++
++ if [ -z "$MTU" ]; then
++ MTU=1412
++ fi
++
++ proto_add_ipv4_address "$INTERNAL_IP4_ADDRESS" 32 "" "$INTERNAL_IP4_ADDRESS"
++
++ if [ -n "$INTERNAL_IP4_NETMASKLEN" ]; then
++ proto_add_ipv4_route "$INTERNAL_IP4_NETADDR" "$INTERNAL_IP4_NETMASKLEN"
++ fi
++
++ # If the netmask is provided, it contains the address _and_ netmask
++ if [ -n "$INTERNAL_IP6_ADDRESS" ] && [ -z "$INTERNAL_IP6_NETMASK" ]; then
++ INTERNAL_IP6_NETMASK="$INTERNAL_IP6_ADDRESS/128"
++ fi
++
++ if [ -n "$INTERNAL_IP6_NETMASK" ]; then
++ addr="${INTERNAL_IP6_NETMASK%%/*}"
++ mask="${INTERNAL_IP6_NETMASK##*/}"
++ [[ "$addr" != "$mask" ]] && proto_add_ipv6_address "$addr" "$mask"
++ fi
++
++ if [ -n "$CISCO_SPLIT_DNS" ] && [ -d "/tmp/dnsmasq.d/" ];then
++ SDNS=`echo $CISCO_SPLIT_DNS|sed 's/,/\n/g'`
++ DNSMASQ_FILE="/tmp/dnsmasq.d/openconnect.$TUNDEV"
++ rm -f $DNSMASQ_FILE
++ echo "$SDNS" | while read i; do
++ if [ -n "$INTERNAL_IP4_DNS" ];then
++ for dns in "$INTERNAL_IP4_DNS";do
++ echo "server=/$i/$dns" >> $DNSMASQ_FILE
++ done
++ fi
++ if [ -n "$INTERNAL_IP6_DNS" ];then
++ for dns in "$INTERNAL_IP6_DNS";do
++ echo "server=/$i/$dns" >> $DNSMASQ_FILE
++ done
++ fi
++ echo "rebind-domain-ok=$i" >> $DNSMASQ_FILE
++ done
++ /etc/init.d/dnsmasq restart
++ else
++ if [ -n "$INTERNAL_IP4_DNS" ];then
++ for dns in "$INTERNAL_IP4_DNS";do
++ proto_add_dns_server "$dns"
++ done
++ fi
++ if [ -n "$INTERNAL_IP6_DNS" ];then
++ for dns in "$INTERNAL_IP6_DNS";do
++ proto_add_dns_server "$dns"
++ done
++ fi
++ [ -n "$CISCO_DEF_DOMAIN" ] && proto_add_dns_search "$CISCO_DEF_DOMAIN"
++ fi
++
++ if [ -n "$CISCO_SPLIT_INC" ]; then
++ i=0
++ while [ $i -lt $CISCO_SPLIT_INC ] ; do
++ eval NETWORK="\${CISCO_SPLIT_INC_${i}_ADDR}"
++ eval NETMASK="\${CISCO_SPLIT_INC_${i}_MASK}"
++ eval NETMASKLEN="\${CISCO_SPLIT_INC_${i}_MASKLEN}"
++ if [ $NETWORK != "0.0.0.0" ]; then
++ proto_add_ipv4_route "$NETWORK" "$NETMASKLEN"
++ else
++ proto_add_ipv4_route "0.0.0.0" 0
++ fi
++ i=$(($i + 1))
++ done
++ elif [ -n "$INTERNAL_IP4_ADDRESS" ]; then
++ proto_add_ipv4_route "0.0.0.0" 0
++ fi
++ if [ -n "$CISCO_IPV6_SPLIT_INC" ]; then
++ i=0
++ while [ $i -lt $CISCO_IPV6_SPLIT_INC ] ; do
++ eval NETWORK="\${CISCO_IPV6_SPLIT_INC_${i}_ADDR}"
++ eval NETMASKLEN="\${CISCO_IPV6_SPLIT_INC_${i}_MASKLEN}"
++ if [ $NETMASKLEN -lt 128 ]; then
++ proto_add_ipv6_route "$NETWORK" "$NETMASKLEN"
++ else
++ proto_add_ipv6_route "::0" 0
++ fi
++ i=$(($i + 1))
++ done
++ elif [ -n "$INTERNAL_IP6_NETMASK" -o -n "$INTERNAL_IP6_ADDRESS" ]; then
++ proto_add_ipv6_route "::0" 0
++ fi
++ proto_send_update "$INTERFACE"
++}
++
++do_disconnect() {
++ rm -f "/tmp/dnsmasq.d/openconnect.$TUNDEV"
++ proto_init_update "$TUNDEV" 0
++ proto_send_update "$INTERFACE"
++}
++
++#### Hooks
++run_hooks() {
++ HOOK="$1"
++
++ if [ -d ${HOOKS_DIR}/${HOOK}.d ]; then
++ for script in ${HOOKS_DIR}/${HOOK}.d/* ; do
++ [ -f $script ] && . $script
++ done
++ fi
++}
++
++#### Main
++
++if [ -z "$reason" ]; then
++ logger -t openconnect "this script must be called from vpnc" 1>&2
++ exit 1
++fi
++if [ -z "$INTERFACE" ]; then
++ logger -t openconnect "this script must be called for an active interface"
++ exit 1
++fi
++
++. /lib/netifd/netifd-proto.sh
++
++case "$reason" in
++ pre-init)
++ run_hooks pre-init
++ ;;
++ connect)
++ run_hooks connect
++ do_connect
++ run_hooks post-connect
++ ;;
++ disconnect)
++ run_hooks disconnect
++ do_disconnect
++ run_hooks post-disconnect
++ ;;
++ reconnect)
++ run_hooks reconnect
++ ;;
++ *)
++ logger -t openconnect "unknown reason '$reason'. Maybe vpnc-script is out of date" 1>&2
++ exit 1
++ ;;
++esac
++
++exit 0
+diff --git a/feeds/packages/net/vpnc/Config.in b/feeds/packages/net/vpnc/Config.in
+new file mode 100644
+index 0000000..5eacd97
+--- /dev/null
++++ b/feeds/packages/net/vpnc/Config.in
+@@ -0,0 +1,18 @@
++# vpnc avanced configuration
++
++menu "Configuration"
++ depends on PACKAGE_vpnc
++
++choice
++ prompt "SSL library"
++ default VPNC_GNUTLS
++
++config VPNC_GNUTLS
++ bool "GnuTLS support"
++
++config VPNC_OPENSSL
++ bool "OpenSSL"
++
++endchoice
++
++endmenu
+diff --git a/feeds/packages/net/vpnc/Makefile b/feeds/packages/net/vpnc/Makefile
+new file mode 100644
+index 0000000..052da0c
+--- /dev/null
++++ b/feeds/packages/net/vpnc/Makefile
+@@ -0,0 +1,94 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=vpnc
++PKG_REV:=550
++PKG_VERSION:=0.5.3.r$(PKG_REV)
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://svn.unix-ag.uni-kl.de/vpnc/trunk/
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_PROTO:=svn
++
++PKG_MAINTAINER:=Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>
++PKG_LICENSE:=VARIOUS
++PKG_LICENSE_FILES:=COPYING
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_VPNC_GNUTLS \
++ CONFIG_VPNC_OPENSSL \
++
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/vpnc/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/vpnc
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libgpg-error +libgcrypt +kmod-tun +VPNC_OPENSSL:libopenssl +VPNC_GNUTLS:libgnutls +vpnc-scripts +resolveip
++ TITLE:=VPN client for Cisco EasyVPN
++ URL:=http://www.unix-ag.uni-kl.de/~massar/vpnc/
++ SUBMENU:=VPN
++endef
++
++define Package/vpnc/description
++ A VPN client compatible with Cisco's EasyVPN equipment.
++
++ Supports IPSec (ESP) with Mode Configuration and Xauth. Supports only
++ shared-secret IPSec authentication with Xauth, AES (256, 192, 128),
++ 3DES, 1DES, MD5, SHA1, DH1/2/5 and IP tunneling.
++endef
++
++define Package/vpnc/conffiles
++/etc/vpnc/default.conf
++endef
++
++ifeq ($(CONFIG_VPNC_OPENSSL),y)
++define Build/Compile
++ $(call Build/Compile/Default, \
++ OFLAGS="$(TARGET_CFLAGS)" \
++ OS="Linux" VERSION="$(PKG_VERSION)" \
++ STAGING_DIR="$(STAGING_DIR)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ OPENSSL_GPL_VIOLATION=yes PREFIX=/usr \
++ all install \
++ )
++endef
++else
++define Build/Compile
++ $(call Build/Compile/Default, \
++ OFLAGS="$(TARGET_CFLAGS)" \
++ OS="Linux" VERSION="$(PKG_VERSION)" \
++ STAGING_DIR="$(STAGING_DIR)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ PREFIX=/usr \
++ all install \
++ )
++endef
++endif
++
++define Package/vpnc/install
++ $(INSTALL_DIR) $(1)/lib/netifd/proto
++ $(INSTALL_BIN) ./files/vpnc.sh $(1)/lib/netifd/proto/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/vpnc \
++ $(PKG_INSTALL_DIR)/usr/sbin/vpnc-disconnect \
++ $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/vpnc
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/vpnc/default.conf $(1)/etc/vpnc/
++ $(INSTALL_DIR) $(1)/lib/upgrade/keep.d
++ $(INSTALL_DATA) ./files/vpnc.upgrade $(1)/lib/upgrade/keep.d/vpnc
++endef
++
++$(eval $(call BuildPackage,vpnc))
+diff --git a/feeds/packages/net/vpnc/README b/feeds/packages/net/vpnc/README
+new file mode 100644
+index 0000000..b18777e
+--- /dev/null
++++ b/feeds/packages/net/vpnc/README
+@@ -0,0 +1,39 @@
++The vpnc client expects to be configured using the uci interface.
++
++To setup a VPN connection, add the following to /etc/config/network:
++
++config interface 'MYVPN'
++ option proto 'vpnc'
++ option interface 'wan'
++ option server 'vpn.example.com'
++ option username 'test'
++ option password 'secret' # or:
++ option hexpasswd 'AE7FF6A0426F0A0CD0A02EB9EC3C5066FAEB0B25'
++ option authgroup 'DEFAULT'
++ option passgroup 'groupsecret' # or:
++ option hexpassgroup '52B0BEAF6605C3CE9BE20A0DC0A0F6240A6FF7EA'
++ option domain 'WORKGROUP'
++ option vendor 'cisco' # or 'netscreen'
++ option natt_mode 'natt' # or 'none' or 'force-natt' or 'cisco-udp'
++ option dh_group 'dh2' # or 'dh1' or 'dh5'
++ option pfs 'server' # or 'nopfs' or 'dh1' or 'dh2' or 'dh5'
++ option enable_single_des '0'
++ option enable_no_enc '0' # '1' to enable unencrypted VPN
++ option mtu '0'
++ option local_addr '0.0.0.0'
++ option local_port '500' # '0' to use a random port
++ option udp_port '10000' # '0' to use a random port
++ option dpd_idle '300'
++ option auth_mode 'psk' # or 'hybrid'
++ option target_network '0.0.0.0/0.0.0.0' # network/netmask or CIDR
++
++The additional file(s) are also used:
++/etc/vpnc/ca-vpn-MYVPN.pem: The server's CA certificate (for auth_mode 'hybrid')
++
++After these are setup you can initiate the VPN using "ifup MYVPN", and
++deinitialize it using ifdown. You may also use the luci web interface
++(Network -> Interfaces -> MYVPN Connect).
++
++Note that you need to configure the firewall to allow communication between
++the MYVPN interface and lan.
++
+diff --git a/feeds/packages/net/vpnc/files/vpnc.sh b/feeds/packages/net/vpnc/files/vpnc.sh
+new file mode 100755
+index 0000000..c408d78
+--- /dev/null
++++ b/feeds/packages/net/vpnc/files/vpnc.sh
+@@ -0,0 +1,98 @@
++#!/bin/sh
++. /lib/functions.sh
++. ../netifd-proto.sh
++init_proto "$@"
++
++proto_vpnc_init_config() {
++ proto_config_add_string "server"
++ proto_config_add_string "username"
++ proto_config_add_string "hexpasswd"
++ proto_config_add_string "authgroup"
++ proto_config_add_string "password"
++ proto_config_add_string "token_mode"
++ proto_config_add_string "token_secret"
++ proto_config_add_string "interface"
++ proto_config_add_string "passgroup"
++ proto_config_add_string "hexpassgroup"
++ proto_config_add_string "domain"
++ proto_config_add_string "vendor"
++ proto_config_add_string "natt_mode"
++ proto_config_add_string "dh_group"
++ proto_config_add_string "pfs"
++ proto_config_add_boolean "enable_single_des"
++ proto_config_add_boolean "enable_no_enc"
++ proto_config_add_int "mtu"
++ proto_config_add_string "local_addr"
++ proto_config_add_int "local_port"
++ proto_config_add_int "udp_port"
++ proto_config_add_int "dpd_idle"
++ proto_config_add_string "auth_mode"
++ proto_config_add_string "target_network"
++ no_device=1
++ available=1
++}
++
++proto_vpnc_setup() {
++ local config="$1"
++
++ json_get_vars server username hexpasswd authgroup password token_mode token_secret interface passgroup hexpassgroup domain vendor natt_mode dh_group pfs enable_single_des enable_no_enc mtu local_addr local_port udp_port dpd_idle auth_mode target_network
++
++ grep -q tun /proc/modules || insmod tun
++
++ logger -t vpnc "initializing..."
++ serv_addr=
++ for ip in $(resolveip -t 10 "$server"); do
++ ( proto_add_host_dependency "vpn-$config" "$ip" $interface )
++ serv_addr=1
++ done
++ [ -n "$serv_addr" ] || {
++ logger -t vpnc "Could not resolve server address: '$server'"
++ sleep 60
++ proto_setup_failed "$config"
++ exit 1
++ }
++
++ mkdir -p /var/etc
++ umask 077
++ pwfile="/var/etc/vpnc-$config.conf"
++ echo "IPSec gateway $server" > "$pwfile"
++ cmdline="--no-detach --pid-file /var/run/vpnc-$config.pid --ifname vpn-$config --non-inter --script /lib/netifd/vpnc-script $pwfile"
++
++ [ -f /etc/vpnc/ca-vpn-$config.pem ] && echo "CA-File /etc/vpnc/ca-vpn-$config.pem" >> "$pwfile"
++ [ -n "$hexpasswd" ] && echo "Xauth obfuscated password $hexpasswd" >> "$pwfile"
++ [ -n "$authgroup" ] && echo "IPSec ID $authgroup" >> "$pwfile"
++ [ -n "$username" ] && echo "Xauth username $username" >> "$pwfile"
++ [ -n "$password" ] && echo "Xauth password $password" >> "$pwfile"
++ [ -n "$passgroup" ] && echo "IPSec secret $passgroup" >> "$pwfile"
++ [ -n "$hexpassgroup" ] && echo "IPSec obfuscated secret $hexpassgroup" >> "$pwfile"
++ [ -n "$domain" ] && echo "Domain $domain" >> "$pwfile"
++ [ -n "$vendor" ] && echo "Vendor $vendor" >> "$pwfile"
++ [ -n "$natt_mode" ] && echo "NAT Traversal Mode $natt_mode" >> "$pwfile"
++ [ -n "$dh_group" ] && echo "IKE DH Group $dh_group" >> "$pwfile"
++ [ -n "$pfs" ] && echo "Perfect Forward Secrecy $pfs" >> "$pwfile"
++ [ "${enable_single_des:-0}" -gt 0 ] && echo "Enable Single DES" >> "$pwfile"
++ [ "${enable_no_enc:-0}" -gt 0 ] && echo "Enable no encryption" >> "$pwfile"
++ [ -n "$mtu" ] && echo "Interface MTU $mtu" >> "$pwfile"
++ [ -n "$local_addr" ] && echo "Local Addr $local_addr" >> "$pwfile"
++ [ -n "$local_port" ] && echo "Local Port $local_port" >> "$pwfile"
++ [ -n "$udp_port" ] && echo "Cisco UDP Encapsulation Port $udp_port" >> "$pwfile"
++ [ -n "$dpd_idle" ] && echo "DPD idle timeout (our side) $dpd_idle" >> "$pwfile"
++ [ -n "$auth_mode" ] && echo "IKE Authmode $auth_mode" >> "$pwfile"
++ [ -n "$target_network" ] && echo "IPSEC target network $target_network" >> "$pwfile"
++
++ proto_export INTERFACE="$config"
++ logger -t vpnc "executing 'vpnc $cmdline'"
++ proto_run_command "$config" /usr/sbin/vpnc $cmdline
++}
++
++proto_vpnc_teardown() {
++ local config="$1"
++
++ pwfile="/var/etc/vpnc-$config.conf"
++
++ rm -f $pwfile
++ logger -t vpnc "bringing down vpnc"
++ proto_kill_command "$config" 2
++}
++
++add_protocol vpnc
+diff --git a/feeds/packages/net/vpnc/files/vpnc.upgrade b/feeds/packages/net/vpnc/files/vpnc.upgrade
+new file mode 100644
+index 0000000..585513d
+--- /dev/null
++++ b/feeds/packages/net/vpnc/files/vpnc.upgrade
+@@ -0,0 +1,2 @@
++/etc/vpnc/ca-vpn-*.pem
++
+diff --git a/feeds/packages/net/vpnc/patches/001-cross.patch b/feeds/packages/net/vpnc/patches/001-cross.patch
+new file mode 100644
+index 0000000..33bcfee
+--- /dev/null
++++ b/feeds/packages/net/vpnc/patches/001-cross.patch
+@@ -0,0 +1,42 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -20,7 +20,7 @@
++ # $Id: Makefile 539 2013-12-04 13:41:04Z Antonio Borneo $
++
++ DESTDIR=
++-PREFIX=/usr/local
+++PREFIX=/usr
++ ETCDIR=/etc/vpnc
++ BINDIR=$(PREFIX)/bin
++ SBINDIR=$(PREFIX)/sbin
++@@ -57,18 +57,15 @@ OBJS = $(addsuffix .o,$(basename $(SRCS)
++ CRYPTO_OBJS = $(addsuffix .o,$(basename $(CRYPTO_SRCS)))
++ BINOBJS = $(addsuffix .o,$(BINS))
++ BINSRCS = $(addsuffix .c,$(BINS))
++-VERSION := $(shell sh mk-version)
++ RELEASE_VERSION := $(shell cat VERSION)
++
++ CC ?= gcc
++-CFLAGS ?= -O3 -g
++ CFLAGS += -W -Wall -Wmissing-declarations -Wwrite-strings
++-CFLAGS += $(shell libgcrypt-config --cflags) $(CRYPTO_CFLAGS)
+++CFLAGS += -O3 -I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/include $(OFLAGS) $(CRYPTO_CFLAGS)
++ CPPFLAGS += -DVERSION=\"$(VERSION)\"
++-LDFLAGS ?= -g
++-LIBS += $(shell libgcrypt-config --libs) $(CRYPTO_LDADD)
+++LIBS += -L$(STAGING_DIR)/usr/lib -L$(STAGING_DIR)/lib -lgcrypt -lgpg-error $(CRYPTO_LDADD)
++
++-ifeq ($(shell uname -s), SunOS)
+++ifeq ($(OS), SunOS)
++ LIBS += -lnsl -lresolv -lsocket
++ endif
++ ifneq (,$(findstring Apple,$(shell $(CC) --version)))
++@@ -82,7 +79,7 @@ vpnc : $(OBJS) vpnc.o
++ $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
++
++ vpnc.8 : vpnc.8.template makeman.pl vpnc
++- ./makeman.pl
+++ touch vpnc.8
++
++ cisco-decrypt : cisco-decrypt.o decrypt-utils.o
++ $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
+diff --git a/feeds/packages/net/vpnc/patches/100-musl-compat.patch b/feeds/packages/net/vpnc/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..1186428
+--- /dev/null
++++ b/feeds/packages/net/vpnc/patches/100-musl-compat.patch
+@@ -0,0 +1,42 @@
++--- a/sysdep.h
+++++ b/sysdep.h
++@@ -37,12 +37,14 @@ int tun_read(int fd, unsigned char *buf,
++ int tun_get_hwaddr(int fd, char *dev, uint8_t *hwaddr);
++
++ /***************************************************************************/
++-#if defined(__linux__) || defined(__GLIBC__)
+++#if defined(__GLIBC__) || defined(__UCLIBC__)
++ #include <error.h>
+++#define HAVE_ERROR 1
+++#endif
++
+++#if defined(__linux__) || defined(__GLIBC__)
++ #define HAVE_VASPRINTF 1
++ #define HAVE_ASPRINTF 1
++-#define HAVE_ERROR 1
++ #define HAVE_UNSETENV 1
++ #define HAVE_SETENV 1
++ #endif
++--- a/sysdep.c
+++++ b/sysdep.c
++@@ -59,7 +59,9 @@
++ #if defined(__DragonFly__)
++ #include <net/tun/if_tun.h>
++ #elif defined(__linux__)
++-#include <linux/if_tun.h>
+++# if defined(__GLIBC__) || defined(__UCLIBC__)
+++# include <linux/if_tun.h>
+++# endif
++ #elif defined(__APPLE__)
++ /* no header for tun */
++ #elif defined(__CYGWIN__)
++--- a/config.c
+++++ b/config.c
++@@ -28,6 +28,7 @@
++ #include <unistd.h>
++ #include <string.h>
++ #include <errno.h>
+++#include <sys/ttydefaults.h>
++ #include <sys/types.h>
++ #include <sys/utsname.h>
++ #include <sys/wait.h>
+diff --git a/feeds/packages/net/vsftpd/Makefile b/feeds/packages/net/vsftpd/Makefile
+new file mode 100644
+index 0000000..da50698
+--- /dev/null
++++ b/feeds/packages/net/vsftpd/Makefile
+@@ -0,0 +1,94 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=vsftpd
++PKG_VERSION:=3.0.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://security.appspot.com/downloads/
++PKG_MD5SUM:=da119d084bd3f98664636ea05b5bb398
++PKG_LICENSE:=GPLv2
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/vsftpd/Default
++ SUBMENU:=File Transfer
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=A fast and secure FTP server
++ URL:=http://vsftpd.beasts.org/
++ MAINTAINER:=Cezary Jackiewicz <cezary@eko.one.pl>
++endef
++
++
++define Package/vsftpd
++$(call Package/vsftpd/Default)
++ VARIANT:=notls
++ TITLE+= (no TLS)
++endef
++
++define Package/vsftpd-tls
++$(call Package/vsftpd/Default)
++ VARIANT:=tls
++ TITLE+= (TLS)
++ DEPENDS+=+libopenssl
++endef
++
++define Package/vsftpd/conffiles
++/etc/vsftpd.conf
++endef
++
++Package/vsftpd-tls/conffiles=$(Package/vsftpd/conffiles)
++
++ifneq ($(CONFIG_USE_MUSL),)
++ NLSSTRING:=-lcrypt
++else
++ NLSSTRING:=-lcrypt -lnsl
++endif
++
++ifeq ($(BUILD_VARIANT),notls)
++ define Build/Compile
++ $(SED) 's/-lcrypt -lnsl/$(NLSSTRING)/' $(PKG_BUILD_DIR)/Makefile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ vsftpd
++ endef
++endif
++
++ifeq ($(BUILD_VARIANT),tls)
++ define Build/Compile
++ $(SED) 's/#undef VSF_BUILD_SSL/#define VSF_BUILD_SSL/' $(PKG_BUILD_DIR)/builddefs.h
++ $(SED) 's/-lcrypt -lnsl/-lcrypt -lnsl -lssl -lcrypto/' $(PKG_BUILD_DIR)/Makefile
++ $(SED) 's/-lcrypt -lnsl/$(NLSSTRING)/' $(PKG_BUILD_DIR)/Makefile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ vsftpd
++ endef
++endif
++
++define Package/vsftpd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) ./files/$(PKG_NAME).conf $(1)/etc/$(PKG_NAME).conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/$(PKG_NAME).init $(1)/etc/init.d/$(PKG_NAME)
++endef
++
++Package/vsftpd-tls/install=$(Package/vsftpd/install)
++
++$(eval $(call BuildPackage,vsftpd))
++$(eval $(call BuildPackage,vsftpd-tls))
+diff --git a/feeds/packages/net/vsftpd/files/vsftpd.conf b/feeds/packages/net/vsftpd/files/vsftpd.conf
+new file mode 100644
+index 0000000..7d46506
+--- /dev/null
++++ b/feeds/packages/net/vsftpd/files/vsftpd.conf
+@@ -0,0 +1,30 @@
++background=YES
++listen=YES
++anonymous_enable=NO
++local_enable=YES
++write_enable=YES
++local_umask=022
++check_shell=NO
++#dirmessage_enable=YES
++#ftpd_banner=Welcome to blah FTP service.
++session_support=NO
++#syslog_enable=YES
++#userlist_enable=YES
++#userlist_deny=NO
++#userlist_file=/etc/vsftpd.users
++#xferlog_enable=YES
++#xferlog_file=/var/log/vsftpd.log
++#xferlog_std_format=YES
++###
++### TLS/SSL options
++### example key generation: openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/config/vsftpd_privkey.pem -out /etc/config/vsftpd_cert.pem -subj /C="DE"/ST="Saxony"/L="Leipzig"/CN="OpenWrt"
++#ssl_enable=YES
++#allow_anon_ssl=NO
++#force_local_data_ssl=NO
++#force_local_logins_ssl=NO
++#ssl_tlsv1=YES
++#ssl_sslv2=NO
++#ssl_sslv3=NO
++#rsa_cert_file=/etc/config/vsftpd_cert.pem
++#rsa_private_key_file=/etc/config/vsftpd_privkey.pem
++
+diff --git a/feeds/packages/net/vsftpd/files/vsftpd.init b/feeds/packages/net/vsftpd/files/vsftpd.init
+new file mode 100644
+index 0000000..ad3e23d
+--- /dev/null
++++ b/feeds/packages/net/vsftpd/files/vsftpd.init
+@@ -0,0 +1,13 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=50
++
++start() {
++ mkdir -m 0755 -p /var/run/vsftpd
++ service_start /usr/sbin/vsftpd
++}
++
++stop() {
++ service_stop /usr/sbin/vsftpd
++}
+diff --git a/feeds/packages/net/vsftpd/patches/001-destdir.patch b/feeds/packages/net/vsftpd/patches/001-destdir.patch
+new file mode 100644
+index 0000000..b0274ac
+--- /dev/null
++++ b/feeds/packages/net/vsftpd/patches/001-destdir.patch
+@@ -0,0 +1,47 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -22,6 +22,8 @@ OBJS = main.o utility.o prelogin.o ftpcm
++ seccompsandbox.o
++
++
+++DESTDIR =
+++
++ .c.o:
++ $(CC) -c $*.c $(CFLAGS) $(IFLAGS)
++
++@@ -29,21 +31,20 @@ vsftpd: $(OBJS)
++ $(CC) -o vsftpd $(OBJS) $(LINK) $(LDFLAGS) $(LIBS)
++
++ install:
++- if [ -x /usr/local/sbin ]; then \
++- $(INSTALL) -m 755 vsftpd /usr/local/sbin/vsftpd; \
++- else \
++- $(INSTALL) -m 755 vsftpd /usr/sbin/vsftpd; fi
++- if [ -x /usr/local/man ]; then \
++- $(INSTALL) -m 644 vsftpd.8 /usr/local/man/man8/vsftpd.8; \
++- $(INSTALL) -m 644 vsftpd.conf.5 /usr/local/man/man5/vsftpd.conf.5; \
++- elif [ -x /usr/share/man ]; then \
++- $(INSTALL) -m 644 vsftpd.8 /usr/share/man/man8/vsftpd.8; \
++- $(INSTALL) -m 644 vsftpd.conf.5 /usr/share/man/man5/vsftpd.conf.5; \
++- else \
++- $(INSTALL) -m 644 vsftpd.8 /usr/man/man8/vsftpd.8; \
++- $(INSTALL) -m 644 vsftpd.conf.5 /usr/man/man5/vsftpd.conf.5; fi
++- if [ -x /etc/xinetd.d ]; then \
++- $(INSTALL) -m 644 xinetd.d/vsftpd /etc/xinetd.d/vsftpd; fi
+++ mkdir -p $(DESTDIR)/usr/sbin
+++ $(INSTALL) -m 755 vsftpd $(DESTDIR)/usr/sbin/
+++ mkdir -p $(DESTDIR)/usr/share/man/man8
+++ $(INSTALL) -m 644 vsftpd.8 $(DESTDIR)/usr/share/man/man8/
+++ mkdir -p $(DESTDIR)/usr/share/man/man5
+++ $(INSTALL) -m 644 vsftpd.conf.5 $(DESTDIR)/usr/share/man/man5/
+++ mkdir -p $(DESTDIR)/etc/xinetd.d
+++ $(INSTALL) -m 644 xinetd.d/vsftpd $(DESTDIR)/etc/xinetd.d/
+++
+++uninstall:
+++ rm -f $(DESTDIR)/usr/sbin/vsftpd
+++ rm -f $(DESTDIR)/usr/share/man/man8/vsftpd.8
+++ rm -f $(DESTDIR)/usr/share/man/man5/vsftpd.conf.5
+++ rm -f $(DESTDIR)/etc/xinetd.d/vsftpd
++
++ clean:
++ rm -f *.o *.swp vsftpd
+diff --git a/feeds/packages/net/vsftpd/patches/002-find_libs.patch b/feeds/packages/net/vsftpd/patches/002-find_libs.patch
+new file mode 100644
+index 0000000..daf83ef
+--- /dev/null
++++ b/feeds/packages/net/vsftpd/patches/002-find_libs.patch
+@@ -0,0 +1,13 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -8,8 +8,8 @@ CFLAGS = -O2 -fPIE -fstack-protector --p
++ -D_FORTIFY_SOURCE=2 \
++ #-pedantic -Wconversion
++
++-LIBS = `./vsf_findlibs.sh`
++-LINK = -Wl,-s
+++LIBS = -lcrypt -lnsl
+++LINK =
++ LDFLAGS = -fPIE -pie -Wl,-z,relro -Wl,-z,now
++
++ OBJS = main.o utility.o prelogin.o ftpcmdio.o postlogin.o privsock.o \
+diff --git a/feeds/packages/net/vsftpd/patches/003-chroot.patch b/feeds/packages/net/vsftpd/patches/003-chroot.patch
+new file mode 100644
+index 0000000..8965da4
+--- /dev/null
++++ b/feeds/packages/net/vsftpd/patches/003-chroot.patch
+@@ -0,0 +1,11 @@
++--- a/tunables.c
+++++ b/tunables.c
++@@ -254,7 +254,7 @@ tunables_load_defaults()
++ /* -rw------- */
++ tunable_chown_upload_mode = 0600;
++
++- install_str_setting("/usr/share/empty", &tunable_secure_chroot_dir);
+++ install_str_setting("/var/run/vsftpd", &tunable_secure_chroot_dir);
++ install_str_setting("ftp", &tunable_ftp_username);
++ install_str_setting("root", &tunable_chown_username);
++ install_str_setting("/var/log/xferlog", &tunable_xferlog_file);
+diff --git a/feeds/packages/net/vsftpd/patches/004-disable-capabilities.patch b/feeds/packages/net/vsftpd/patches/004-disable-capabilities.patch
+new file mode 100644
+index 0000000..7aa6330
+--- /dev/null
++++ b/feeds/packages/net/vsftpd/patches/004-disable-capabilities.patch
+@@ -0,0 +1,12 @@
++--- a/sysdeputil.c
+++++ b/sysdeputil.c
++@@ -165,6 +165,9 @@
++ #endif
++ /* END config */
++
+++#undef VSF_SYSDEP_HAVE_CAPABILITIES
+++#undef VSF_SYSDEP_HAVE_LIBCAP
+++
++ /* PAM support - we include our own dummy version if the system lacks this */
++ #include <security/pam_appl.h>
++
+diff --git a/feeds/packages/net/vsftpd/patches/005-disable-pam.patch b/feeds/packages/net/vsftpd/patches/005-disable-pam.patch
+new file mode 100644
+index 0000000..ebb7244
+--- /dev/null
++++ b/feeds/packages/net/vsftpd/patches/005-disable-pam.patch
+@@ -0,0 +1,11 @@
++--- a/builddefs.h
+++++ b/builddefs.h
++@@ -2,7 +2,7 @@
++ #define VSF_BUILDDEFS_H
++
++ #undef VSF_BUILD_TCPWRAPPERS
++-#define VSF_BUILD_PAM
+++#undef VSF_BUILD_PAM
++ #undef VSF_BUILD_SSL
++
++ #endif /* VSF_BUILDDEFS_H */
+diff --git a/feeds/packages/net/vsftpd/patches/006-musl-compatibility.patch b/feeds/packages/net/vsftpd/patches/006-musl-compatibility.patch
+new file mode 100644
+index 0000000..9eefec7
+--- /dev/null
++++ b/feeds/packages/net/vsftpd/patches/006-musl-compatibility.patch
+@@ -0,0 +1,13 @@
++--- a/sysdeputil.c
+++++ b/sysdeputil.c
++@@ -58,7 +58,9 @@
++ #define VSF_SYSDEP_HAVE_SHADOW
++ #define VSF_SYSDEP_HAVE_USERSHELL
++ #define VSF_SYSDEP_HAVE_LIBCAP
++-#define VSF_SYSDEP_HAVE_UTMPX
+++#if defined(__GLIBC__) || defined(__UCLIBC__)
+++ #define VSF_SYSDEP_HAVE_UTMPX
+++#endif
++
++ #define __USE_GNU
++ #include <utmpx.h>
+diff --git a/feeds/packages/net/vsftpd/patches/007-CVE-2015-1419.patch b/feeds/packages/net/vsftpd/patches/007-CVE-2015-1419.patch
+new file mode 100644
+index 0000000..173027a
+--- /dev/null
++++ b/feeds/packages/net/vsftpd/patches/007-CVE-2015-1419.patch
+@@ -0,0 +1,98 @@
++Description: CVE-2015-1419: config option deny_file is not handled correctly
++Author: Marcus Meissner <meissner@suse.com>
++Origin: https://bugzilla.novell.com/show_bug.cgi?id=CVE-2015-1419
++Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=776922
++Last-Update: 2015-02-24
++---
++This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
++--- a/ls.c
+++++ b/ls.c
++@@ -7,6 +7,7 @@
++ * Would you believe, code to handle directory listing.
++ */
++
+++#include <stdlib.h>
++ #include "ls.h"
++ #include "access.h"
++ #include "defs.h"
++@@ -243,11 +244,42 @@ vsf_filename_passes_filter(const struct
++ struct mystr temp_str = INIT_MYSTR;
++ struct mystr brace_list_str = INIT_MYSTR;
++ struct mystr new_filter_str = INIT_MYSTR;
+++ struct mystr normalize_filename_str = INIT_MYSTR;
+++ const char *normname;
+++ const char *path;
++ int ret = 0;
++ char last_token = 0;
++ int must_match_at_current_pos = 1;
+++
++ str_copy(&filter_remain_str, p_filter_str);
++- str_copy(&name_remain_str, p_filename_str);
+++
+++ /* normalize filepath */
+++ path = str_strdup(p_filename_str);
+++ normname = realpath(path, NULL);
+++ if (normname == NULL)
+++ goto out;
+++ str_alloc_text(&normalize_filename_str, normname);
+++
+++ if (!str_isempty (&filter_remain_str) && !str_isempty(&normalize_filename_str)) {
+++ if (str_get_char_at(p_filter_str, 0) == '/') {
+++ if (str_get_char_at(&normalize_filename_str, 0) != '/') {
+++ str_getcwd (&name_remain_str);
+++
+++ if (str_getlen(&name_remain_str) > 1) /* cwd != root dir */
+++ str_append_char (&name_remain_str, '/');
+++
+++ str_append_str (&name_remain_str, &normalize_filename_str);
+++ }
+++ else
+++ str_copy (&name_remain_str, &normalize_filename_str);
+++ } else {
+++ if (str_get_char_at(p_filter_str, 0) != '{')
+++ str_basename (&name_remain_str, &normalize_filename_str);
+++ else
+++ str_copy (&name_remain_str, &normalize_filename_str);
+++ }
+++ } else
+++ str_copy(&name_remain_str, &normalize_filename_str);
++
++ while (!str_isempty(&filter_remain_str) && *iters < VSFTP_MATCHITERS_MAX)
++ {
++@@ -360,6 +392,9 @@ vsf_filename_passes_filter(const struct
++ ret = 0;
++ }
++ out:
+++ free(normname);
+++ free(path);
+++ str_free(&normalize_filename_str);
++ str_free(&filter_remain_str);
++ str_free(&name_remain_str);
++ str_free(&temp_str);
++--- a/str.c
+++++ b/str.c
++@@ -711,3 +711,14 @@ str_replace_unprintable(struct mystr* p_
++ }
++ }
++
+++void
+++str_basename (struct mystr* d_str, const struct mystr* path)
+++{
+++ static struct mystr tmp;
+++
+++ str_copy (&tmp, path);
+++ str_split_char_reverse(&tmp, d_str, '/');
+++
+++ if (str_isempty(d_str))
+++ str_copy (d_str, path);
+++}
++--- a/str.h
+++++ b/str.h
++@@ -100,6 +100,7 @@ void str_replace_unprintable(struct myst
++ int str_atoi(const struct mystr* p_str);
++ filesize_t str_a_to_filesize_t(const struct mystr* p_str);
++ unsigned int str_octal_to_uint(const struct mystr* p_str);
+++void str_basename (struct mystr* d_str, const struct mystr* path);
++
++ /* PURPOSE: Extract a line of text (delimited by \n or EOF) from a string
++ * buffer, starting at character position 'p_pos'. The extracted line will
+diff --git a/feeds/packages/net/wavemon/Makefile b/feeds/packages/net/wavemon/Makefile
+new file mode 100644
+index 0000000..f843db8
+--- /dev/null
++++ b/feeds/packages/net/wavemon/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=wavemon
++PKG_VERSION:=0.7.6
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://github.com/uoaerg/wavemon.git
++PKG_SOURCE_VERSION:=v$(PKG_VERSION)
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Jonathan McCrohan <jmccrohan@gmail.com>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/wavemon
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=N-curses based wireless network devices monitor
++ DEPENDS:=+libncurses +libpthread
++ SUBMENU:=wireless
++ URL:=https://github.com/uoaerg/wavemon/releases
++endef
++
++define Package/wavemon/description
++ wavemon is a ncurses-based monitoring application for wireless network
++ devices. It currently works under Linux with devices that are supported
++ by the wireless extensions by Jean Tourrilhes (included in Kernel 2.4
++ and higher), e.g. the Lucent Orinoco cards.
++endef
++
++CONFIGURE_VARS += \
++ ac_cv_lib_cap_cap_get_flag=no
++
++TARGET_CFLAGS += -pthread
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) -L$(STAGING_DIR)/usr/lib -I$(STAGING_DIR)/usr/include"
++
++define Package/wavemon/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wavemon $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,wavemon))
+diff --git a/feeds/packages/net/wget/Makefile b/feeds/packages/net/wget/Makefile
+new file mode 100644
+index 0000000..a146a01
+--- /dev/null
++++ b/feeds/packages/net/wget/Makefile
+@@ -0,0 +1,134 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=wget
++PKG_VERSION:=1.16.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@GNU/$(PKG_NAME)
++PKG_MD5SUM:=d2e4455781a70140ae83b54ca594ce21
++PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/wget/Default
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libpcre
++ SUBMENU:=File Transfer
++ TITLE:=Non-interactive network downloader
++ URL:=http://www.gnu.org/software/wget/index.html
++endef
++
++define Package/wget/Default/description
++ Wget is a network utility to retrieve files from the Web using http
++ and ftp, the two most widely used Internet protocols. It works
++ non-interactively, so it will work in the background, after having
++ logged off. The program supports recursive retrieval of web-authoring
++ pages as well as ftp sites -- you can use wget to make mirrors of
++ archives and home pages or to travel the Web like a WWW robot.
++endef
++
++define Package/wget
++$(call Package/wget/Default)
++ DEPENDS+= +libopenssl +librt
++ TITLE+= (with SSL support)
++ VARIANT:=ssl
++endef
++
++define Package/wget/description
++$(call Package/wget/Default/description)
++ This package is built with SSL support.
++endef
++
++define Package/wget-nossl
++$(call Package/wget/Default)
++ TITLE+= (without SSL support)
++ DEPENDS+= +zlib
++ VARIANT:=nossl
++endef
++
++define Package/wget-nossl/description
++$(call Package/wget/Default/description)
++ This package is built without SSL support.
++endef
++
++CONFIGURE_ARGS+= \
++ --disable-rpath \
++ --disable-iri \
++ --without-libuuid
++
++CONFIGURE_VARS += \
++ ac_cv_header_uuid_uuid_h=no
++
++ifeq ($(BUILD_VARIANT),ssl)
++ CONFIGURE_ARGS+= \
++ --with-ssl=openssl \
++ --with-libssl-prefix="$(STAGING_DIR)/usr"
++endif
++
++ifeq ($(BUILD_VARIANT),nossl)
++ CONFIGURE_ARGS+= \
++ --disable-ntlm \
++ --without-ssl
++endif
++
++define Package/wget/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/wget $(1)/usr/bin/wget-ssl
++endef
++
++define Package/wget-nossl/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/wget $(1)/usr/bin/wget-nossl
++endef
++
++define Package/wget/postinst
++#!/bin/sh
++if [ -e $${IPKG_INSTROOT}/usr/bin/wget ]; then
++ rm -rf $${IPKG_INSTROOT}/usr/bin/wget;
++fi
++ln -sf ./wget-ssl $${IPKG_INSTROOT}/usr/bin/wget
++endef
++
++define Package/wget/postrm
++#!/bin/sh
++rm $${IPKG_INSTROOT}/usr/bin/wget
++[ -x $${IPKG_INSTROOT}/usr/bin/wget-nossl ] && ln -s ./wget-nossl $${IPKG_INSTROOT}/usr/bin/wget || {
++ ln -s ../../bin/busybox $${IPKG_INSTROOT}/usr/bin/wget
++ $${IPKG_INSTROOT}/usr/bin/wget 2>&1 | grep 'applet not found' > /dev/null 2>&1 && rm $${IPKG_INSTROOT}/usr/bin/wget
++}
++exit 0
++endef
++
++define Package/wget-nossl/postinst
++#!/bin/sh
++if [ -e $${IPKG_INSTROOT}/usr/bin/wget ]; then
++ rm -rf $${IPKG_INSTROOT}/usr/bin/wget;
++fi
++ln -s ./wget-nossl $${IPKG_INSTROOT}/usr/bin/wget
++endef
++
++define Package/wget-nossl/postrm
++#!/bin/sh
++rm $${IPKG_INSTROOT}/usr/bin/wget
++[ -x $${IPKG_INSTROOT}/usr/bin/wget-ssl ] && ln -s ./wget-ssl $${IPKG_INSTROOT}/usr/bin/wget || {
++ ln -s ../../bin/busybox $${IPKG_INSTROOT}/usr/bin/wget
++ $${IPKG_INSTROOT}/usr/bin/wget 2>&1 | grep 'applet not found' > /dev/null 2>&1 && rm $${IPKG_INSTROOT}/usr/bin/wget
++}
++exit 0
++endef
++
++$(eval $(call BuildPackage,wget))
++$(eval $(call BuildPackage,wget-nossl))
+diff --git a/feeds/packages/net/wifidog/Makefile b/feeds/packages/net/wifidog/Makefile
+new file mode 100644
+index 0000000..591f291
+--- /dev/null
++++ b/feeds/packages/net/wifidog/Makefile
+@@ -0,0 +1,103 @@
++#
++# Copyright (C) 2006,2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=wifidog
++PKG_VERSION:=1.3.0
++PKG_RELEASE=1
++
++
++PKG_LICENSE:=GPL-2.0
++# Note: Packaging is maintained upstream at
++# https://github.com/wifidog/packages
++PKG_MAINTAINER:=Michael Haas <haas@computerlinguist.org>
++PKG_LICENSE_FILES:=COPYING
++
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/wifidog/wifidog-gateway.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=1.3.0
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_FIXUP:=autoreconf
++# do not run make install
++PKG_INSTALL:=0
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/wifidog/Default
++ SUBMENU:=Captive Portals
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+iptables-mod-extra +iptables-mod-ipopt +iptables-mod-nat-extra +libpthread
++ TITLE:=A wireless captive portal solution
++ URL:=http://www.wifidog.org
++endef
++
++define Package/wifidog
++$(call Package/wifidog/Default)
++ VARIANT:=normal
++endef
++
++define Package/wifidog-tls
++$(call Package/wifidog/Default)
++ DEPENDS+= +libcyassl
++ VARIANT:=tls
++endef
++
++
++define Package/wifidog/description
++ The Wifidog project is a complete and embeddable captive
++ portal solution for wireless community groups or individuals
++ who wish to open a free Hotspot while still preventing abuse
++ of their Internet connection.
++endef
++
++define Package/wifidog-tls/description
++$(call Package/wifidog/description)
++
++This variant can talk TLS to the auth server.
++endef
++
++define Package/wifidog/conffiles
++/etc/wifidog.conf
++endef
++
++Package/wifidog-tls/conffiles = $(Package/wifidog/conffiles)
++
++
++define Package/wifidog/configure
++ $(call Build/Configure/Default)
++endef
++
++ifeq ($(BUILD_VARIANT),tls)
++
++CONFIGURE_ARGS += \
++ --enable-cyassl
++
++endif
++
++define Package/wifidog/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wifidog $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wdctl $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libhttpd.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog.conf $(1)/etc/
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-msg.html $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/wifidog.init $(1)/etc/init.d/wifidog
++endef
++
++Package/wifidog-tls/install = $(Package/wifidog/install)
++
++$(eval $(call BuildPackage,wifidog))
++$(eval $(call BuildPackage,wifidog-tls))
+diff --git a/feeds/packages/net/wifidog/files/wifidog.init b/feeds/packages/net/wifidog/files/wifidog.init
+new file mode 100644
+index 0000000..6ebf64f
+--- /dev/null
++++ b/feeds/packages/net/wifidog/files/wifidog.init
+@@ -0,0 +1,22 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006 OpenWrt.org
++START=65
++
++USE_PROCD=1
++
++EXTRA_COMMANDS="status"
++EXTRA_HELP=" status Print the status of the service"
++
++start_service() {
++ procd_open_instance
++ # -s: log to syslog
++ # -f: run in foreground
++ procd_set_param command /usr/bin/wifidog -s -f
++ procd_set_param respawn # respawn automatically if something died
++ procd_set_param file /etc/wifidog.conf
++ procd_close_instance
++}
++
++status() {
++ /usr/bin/wdctl status
++}
+diff --git a/feeds/packages/net/wshaper/Makefile b/feeds/packages/net/wshaper/Makefile
+new file mode 100644
+index 0000000..65b4045
+--- /dev/null
++++ b/feeds/packages/net/wshaper/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=wshaper
++PKG_VERSION:=1.1a
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/wshaper
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+kmod-sched +tc
++ TITLE:=wshaper
++ URL:=http://lartc.org/wondershaper/
++ PKGARCH:=all
++endef
++
++define Package/wshaper/description
++ A script to do traffing shaping with the HTB algorithm.
++ Wshaper attempts to:
++ * Maintain low latency for interfactive traffic at all times
++ * Allow 'surfing' at reasonable speeds while up or downloading
++ * Make sure uploads don't harm downloads, and the other way around
++endef
++
++define Build/Prepare
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/wshaper/install
++ $(INSTALL_DIR) $(1)/usr/sbin/ $(1)/etc/init.d $(1)/etc/config $(1)/etc/hotplug.d/iface
++ $(INSTALL_BIN) ./files/wshaper.htb $(1)/usr/sbin/
++ $(INSTALL_BIN) ./files/wshaper.init $(1)/etc/init.d/wshaper
++ $(INSTALL_BIN) ./files/wshaper.iface $(1)/etc/hotplug.d/iface/10-wshaper
++ $(INSTALL_DATA) ./files/wshaper.config $(1)/etc/config/wshaper
++endef
++
++define Package/wshaper/conffiles
++/etc/config/wshaper
++endef
++
++$(eval $(call BuildPackage,wshaper))
+diff --git a/feeds/packages/net/wshaper/files/wshaper.config b/feeds/packages/net/wshaper/files/wshaper.config
+new file mode 100644
+index 0000000..ed857c5
+--- /dev/null
++++ b/feeds/packages/net/wshaper/files/wshaper.config
+@@ -0,0 +1,4 @@
++config 'wshaper' 'settings'
++ option 'network' 'wan'
++ option 'downlink' '2000'
++ option 'uplink' '240'
+diff --git a/feeds/packages/net/wshaper/files/wshaper.htb b/feeds/packages/net/wshaper/files/wshaper.htb
+new file mode 100755
+index 0000000..4b63eee
+--- /dev/null
++++ b/feeds/packages/net/wshaper/files/wshaper.htb
+@@ -0,0 +1,166 @@
++#!/bin/sh
++# Wonder Shaper
++# please read the README before filling out these values
++#
++# Set the following values to somewhat less than your actual download
++# and uplink speed. In kilobits. Also set the device that is to be shaped.
++
++# All config needs to be done in /etc/config/wshaper
++
++. /lib/functions.sh
++. /lib/functions/network.sh
++
++config_load wshaper
++for s in downlink uplink network nopriohostdst nopriohostsrc noprioportdst noprioportsrc; do
++ config_get $s settings $s
++done
++
++if ! network_get_device device "$network"; then
++ logger -t wondershaper "Error: Could not find the device for network $network, aborting."
++ exit 1
++fi
++
++[ -z "$downlink" ] && logger -t wondershaper "Error: Downlink speed not set, aborting." && exit 1
++[ -z "$uplink" ] && logger -t wondershaper "Error: Uplink speed not set, aborting." && exit 1
++
++MODULES='sch_ingress sch_sfq sch_htb cls_u32 act_police'
++DOWNLINK="$downlink"
++UPLINK="$uplink"
++DEV="$device"
++
++# low priority OUTGOING traffic - you can leave this blank if you want
++# low priority source netmasks
++NOPRIOHOSTSRC="$nopriohostsrc"
++
++# low priority destination netmasks
++NOPRIOHOSTDST="$nopriohostdst"
++
++# low priority source ports
++NOPRIOPORTSRC="$noprioportsrc"
++
++# low priority destination ports
++NOPRIOPORTDST="$noprioportdst"
++
++if [ "$1" = "status" ]
++then
++ tc -s qdisc ls dev $DEV
++ tc -s class ls dev $DEV
++ exit
++fi
++
++
++# clean existing down- and uplink qdiscs, hide errors
++tc qdisc del dev $DEV root 2> /dev/null > /dev/null
++tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null
++
++if [ "$1" = "stop" ]
++then
++ for i in $MODULES ; do
++ rmmod $i
++ done
++ exit
++fi
++
++for i in $MODULES ; do
++ insmod $i
++done
++
++###### uplink
++
++# install root HTB, point default traffic to 1:20:
++
++tc qdisc add dev $DEV root handle 1: htb default 20
++
++# shape everything at $UPLINK speed - this prevents huge queues in your
++# DSL modem which destroy latency:
++
++tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit burst 6k
++
++# high prio class 1:10:
++
++tc class add dev $DEV parent 1:1 classid 1:10 htb rate ${UPLINK}kbit \
++ burst 6k prio 1
++
++# bulk & default class 1:20 - gets slightly less traffic,
++# and a lower priority:
++
++tc class add dev $DEV parent 1:1 classid 1:20 htb rate $((9*$UPLINK/10))kbit \
++ burst 6k prio 2
++
++tc class add dev $DEV parent 1:1 classid 1:30 htb rate $((8*$UPLINK/10))kbit \
++ burst 6k prio 2
++
++# all get Stochastic Fairness:
++tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
++tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
++tc qdisc add dev $DEV parent 1:30 handle 30: sfq perturb 10
++
++# TOS Minimum Delay (ssh, NOT scp) in 1:10:
++
++tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32 \
++ match ip tos 0x10 0xff flowid 1:10
++
++# ICMP (ip protocol 1) in the interactive class 1:10 so we
++# can do measurements & impress our friends:
++tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32 \
++ match ip protocol 1 0xff flowid 1:10
++
++# To speed up downloads while an upload is going on, put ACK packets in
++# the interactive class:
++
++tc filter add dev $DEV parent 1: protocol ip prio 10 u32 \
++ match ip protocol 6 0xff \
++ match u8 0x05 0x0f at 0 \
++ match u16 0x0000 0xffc0 at 2 \
++ match u8 0x10 0xff at 33 \
++ flowid 1:10
++
++# rest is 'non-interactive' ie 'bulk' and ends up in 1:20
++
++# some traffic however suffers a worse fate
++for a in $NOPRIOPORTDST
++do
++ tc filter add dev $DEV parent 1: protocol ip prio 14 u32 \
++ match ip dport $a 0xffff flowid 1:30
++done
++
++for a in $NOPRIOPORTSRC
++do
++ tc filter add dev $DEV parent 1: protocol ip prio 15 u32 \
++ match ip sport $a 0xffff flowid 1:30
++done
++
++for a in $NOPRIOHOSTSRC
++do
++ tc filter add dev $DEV parent 1: protocol ip prio 16 u32 \
++ match ip src $a flowid 1:30
++done
++
++for a in $NOPRIOHOSTDST
++do
++ tc filter add dev $DEV parent 1: protocol ip prio 17 u32 \
++ match ip dst $a flowid 1:30
++done
++
++# rest is 'non-interactive' ie 'bulk' and ends up in 1:20
++
++tc filter add dev $DEV parent 1: protocol ip prio 18 u32 \
++ match ip dst 0.0.0.0/0 flowid 1:20
++
++
++########## downlink #############
++# slow downloads down to somewhat less than the real speed to prevent
++# queuing at our ISP. Tune to see how high you can set it.
++# ISPs tend to have *huge* queues to make sure big downloads are fast
++#
++# attach ingress policer:
++
++tc qdisc add dev $DEV handle ffff: ingress
++
++# filter *everything* to it (0.0.0.0/0), drop everything that's
++# coming in too fast:
++
++tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
++ 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
++
++logger -t wondershaper "Wondershaper was started on device $device."
+diff --git a/feeds/packages/net/wshaper/files/wshaper.iface b/feeds/packages/net/wshaper/files/wshaper.iface
+new file mode 100644
+index 0000000..2964005
+--- /dev/null
++++ b/feeds/packages/net/wshaper/files/wshaper.iface
+@@ -0,0 +1,3 @@
++#!/bin/sh
++
++[ "$ACTION" = ifup ] && /etc/init.d/wshaper enabled && /etc/init.d/wshaper start || exit 0
+diff --git a/feeds/packages/net/wshaper/files/wshaper.init b/feeds/packages/net/wshaper/files/wshaper.init
+new file mode 100644
+index 0000000..638cef2
+--- /dev/null
++++ b/feeds/packages/net/wshaper/files/wshaper.init
+@@ -0,0 +1,10 @@
++#!/bin/sh /etc/rc.common
++
++START=45
++start() {
++ wshaper.htb
++}
++
++stop() {
++ wshaper.htb stop
++}
+diff --git a/feeds/packages/net/xinetd/Makefile b/feeds/packages/net/xinetd/Makefile
+new file mode 100644
+index 0000000..c1586b7
+--- /dev/null
++++ b/feeds/packages/net/xinetd/Makefile
+@@ -0,0 +1,66 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=xinetd
++PKG_VERSION:=2.3.15
++PKG_RELEASE:=4
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.xinetd.org
++PKG_MD5SUM:=77358478fd58efa6366accae99b8b04c
++PKG_LICENSE:=xinetd
++PKG_LICENSE_FILES:=COPYRIGHT
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/xinetd
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=A powerful and secure super-server
++ URL:=http://www.xinetd.org/
++ PKG_MAINTAINER:=Jonathan McCrohan <jmccrohan@gmail.com>
++endef
++
++define Package/xinetd/description
++ xinetd has access control mechanisms, extensive logging capabilities,
++ the ability to make services available based on time, can place limits
++ on the number of servers that can be started, and has deployable
++ defence mechanisms to protect against port scanners, among other
++ things.
++endef
++
++define Package/xinetd/conffiles
++/etc/xinetd.conf
++endef
++
++TARGET_CFLAGS += -DNO_RPC
++TARGET_CPPFLAGS += -DHAVE_RLIM_T
++
++CONFIGURE_ARGS += \
++ --without-libwrap \
++ --with-loadavg
++
++CONFIGURE_VARS += \
++ ac_cv_header_rpc_pmap_clnt_h=no \
++ ac_cv_header_rpc_rpc_h=no \
++ ac_cv_header_rpc_rpcent_h=no
++
++define Package/xinetd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/xinetd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) ./files/xinetd.conf $(1)/etc/xinetd.conf
++ $(INSTALL_DIR) $(1)/etc/xinetd.d
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/xinetd.init $(1)/etc/init.d/xinetd
++endef
++
++$(eval $(call BuildPackage,xinetd))
+diff --git a/feeds/packages/net/xinetd/files/xinetd.conf b/feeds/packages/net/xinetd/files/xinetd.conf
+new file mode 100644
+index 0000000..bd473ed
+--- /dev/null
++++ b/feeds/packages/net/xinetd/files/xinetd.conf
+@@ -0,0 +1,6 @@
++defaults
++{
++
++}
++
++includedir /etc/xinetd.d
+diff --git a/feeds/packages/net/xinetd/files/xinetd.init b/feeds/packages/net/xinetd/files/xinetd.init
+new file mode 100644
+index 0000000..1437f58
+--- /dev/null
++++ b/feeds/packages/net/xinetd/files/xinetd.init
+@@ -0,0 +1,15 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=50
++
++SERVICE_USE_PID=1
++
++start() {
++ service_start /usr/sbin/xinetd -pidfile /var/run/xinetd.pid
++}
++
++stop() {
++ service_stop /usr/sbin/xinetd
++}
++
+diff --git a/feeds/packages/net/xinetd/patches/001-ar.patch b/feeds/packages/net/xinetd/patches/001-ar.patch
+new file mode 100644
+index 0000000..4d961ba
+--- /dev/null
++++ b/feeds/packages/net/xinetd/patches/001-ar.patch
+@@ -0,0 +1,66 @@
++--- a/libs/src/misc/Makefile.in
+++++ b/libs/src/misc/Makefile.in
++@@ -62,7 +62,7 @@ libopt: clean
++
++
++ $(LIBNAME): $(OBJECTS)
++- ar r $@ $?
+++ $(AR) r $@ $?
++ $(RANLIB) $@
++
++ install: $(LIBNAME)
++--- a/libs/src/portable/Makefile.in
+++++ b/libs/src/portable/Makefile.in
++@@ -57,7 +57,7 @@ libopt: clean
++
++
++ $(LIBNAME): $(OBJECTS)
++- ar r $@ $?
+++ $(AR) r $@ $?
++ $(RANLIB) $@
++
++ install: $(LIBNAME)
++--- a/libs/src/pset/Makefile.in
+++++ b/libs/src/pset/Makefile.in
++@@ -53,7 +53,7 @@ libopt: clean
++ mv $(LIBNAME) $(LIBDIR)/optimized
++
++ $(LIBNAME): $(OBJECTS)
++- ar r $@ $?
+++ $(AR) r $@ $?
++ $(RANLIB) $@
++
++ install: $(LIBNAME)
++--- a/libs/src/sio/Makefile.in
+++++ b/libs/src/sio/Makefile.in
++@@ -52,7 +52,7 @@ libopt: clean
++ $(INSTALL) $(FMODE) $(LIBNAME) $(LIBDIR)/optimized
++
++ $(LIBNAME): $(OBJECTS)
++- ar r $@ $?
+++ $(AR) r $@ $?
++ $(RANLIB) $@
++
++ install: $(LIBNAME)
++--- a/libs/src/str/Makefile.in
+++++ b/libs/src/str/Makefile.in
++@@ -63,7 +63,7 @@ libopt: clean
++ $(INSTALL) $(FMODE) $(LIBNAME) $(LIBDIR)-O
++
++ $(LIBNAME): $(OBJECTS)
++- ar r $@ $?
+++ $(AR) r $@ $?
++ $(RANLIB) $@
++
++ LINT_IGNORE=possible pointer alignment|RCSid unused
++--- a/libs/src/xlog/Makefile.in
+++++ b/libs/src/xlog/Makefile.in
++@@ -58,7 +58,7 @@ libopt: clean
++ $(INSTALL) $(FMODE) $(LIBNAME) $(LIBDIR)/optimized
++
++ $(LIBNAME): $(OBJECTS)
++- ar r $@ $?
+++ $(AR) r $@ $?
++ $(RANLIB) $@
++
++ install: $(LIBNAME)
+diff --git a/feeds/packages/net/xinetd/patches/002-destdir.patch b/feeds/packages/net/xinetd/patches/002-destdir.patch
+new file mode 100644
+index 0000000..89075c8
+--- /dev/null
++++ b/feeds/packages/net/xinetd/patches/002-destdir.patch
+@@ -0,0 +1,27 @@
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -75,15 +75,15 @@ dlibxlog: dlibsio dlibstr
++
++ install: build
++ for i in $(DAEMONDIR) $(BINDIR) $(MANDIR)/man5 $(MANDIR)/man8 ; do \
++- test -d $$i || mkdir -p $$i ; done
++- $(INSTALL_CMD) -m 755 xinetd/xinetd $(DAEMONDIR)
++- $(INSTALL_CMD) -m 755 xinetd/itox $(DAEMONDIR)
++- $(INSTALL_CMD) -m 755 $(SRCDIR)/xinetd/xconv.pl $(DAEMONDIR)
++- $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.conf.man $(MANDIR)/man5/xinetd.conf.5
++- $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.log.man $(MANDIR)/man8/xinetd.log.8
++- $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.man $(MANDIR)/man8/xinetd.8
++- $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/itox.8 $(MANDIR)/man8/itox.8
++- $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xconv.pl.8 $(MANDIR)/man8/xconv.pl.8
+++ test -d $(DESTDIR)$$i || mkdir -p $(DESTDIR)$$i ; done
+++ $(INSTALL_CMD) -m 755 xinetd/xinetd $(DESTDIR)$(DAEMONDIR)
+++ $(INSTALL_CMD) -m 755 xinetd/itox $(DESTDIR)$(DAEMONDIR)
+++ $(INSTALL_CMD) -m 755 $(SRCDIR)/xinetd/xconv.pl $(DESTDIR)$(DAEMONDIR)
+++ $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.conf.man $(DESTDIR)$(MANDIR)/man5/xinetd.conf.5
+++ $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.log.man $(DESTDIR)$(MANDIR)/man8/xinetd.log.8
+++ $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xinetd.man $(DESTDIR)$(MANDIR)/man8/xinetd.8
+++ $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/itox.8 $(DESTDIR)$(MANDIR)/man8/itox.8
+++ $(INSTALL_CMD) -m 644 $(SRCDIR)/xinetd/xconv.pl.8 $(DESTDIR)$(MANDIR)/man8/xconv.pl.8
++ @echo "You must put your xinetd.conf in /etc/xinetd.conf"
++ @echo "There is a sample config file in xinetd/sample.conf and you can"
++ @echo "use xconv.pl to convert your old inetd.conf file to an xinetd format"
+diff --git a/feeds/packages/net/xinetd/patches/003-rpc_fix.patch b/feeds/packages/net/xinetd/patches/003-rpc_fix.patch
+new file mode 100644
+index 0000000..11f47e7
+--- /dev/null
++++ b/feeds/packages/net/xinetd/patches/003-rpc_fix.patch
+@@ -0,0 +1,19 @@
++--- a/xinetd/confparse.c
+++++ b/xinetd/confparse.c
++@@ -745,7 +745,7 @@ static status_e check_entry( struct serv
++ }
++ }
++
++-/* #ifndef NO_RPC */
+++#ifndef NO_RPC
++ #if defined(HAVE_RPC_RPCENT_H) || defined(HAVE_NETDB_H)
++ if ( SC_IS_RPC( scp ) && !SC_IS_UNLISTED( scp ) )
++ {
++@@ -759,6 +759,7 @@ static status_e check_entry( struct serv
++ SC_RPCDATA( scp )->rd_program_number = rep->r_number ;
++ }
++ else
+++#endif
++ #endif /* ! NO_RPC */
++ {
++ if ( !SC_IS_UNLISTED( scp ) )
+diff --git a/feeds/packages/net/xinetd/patches/004-ident-bind.patch b/feeds/packages/net/xinetd/patches/004-ident-bind.patch
+new file mode 100644
+index 0000000..0da0148
+--- /dev/null
++++ b/feeds/packages/net/xinetd/patches/004-ident-bind.patch
+@@ -0,0 +1,42 @@
++xinetd: socket bind: Invalid argument (errno = 22) when using USERID on ipv6
++
++Use right size of addresses in bind() call. Also use getpeername addresses when
++connecting to ident service to prevent address family mismatch between socket(),
++bind() and connect() calls.
++
++Author: Jan Safranek <jsafrane@redhat.com>
++Reviewed-By: Adam Tkac <atkac@redhat.com>
++
++#diff -up xinetd-2.3.14/xinetd/ident.c.orig xinetd-2.3.14/xinetd/ident.c
++--- a/xinetd/ident.c
+++++ b/xinetd/ident.c
++@@ -97,7 +97,13 @@ idresult_e log_remote_user( const struct
++ }
++
++ CLEAR( sin_contact );
++- sin_remote = *CONN_XADDRESS( SERVER_CONNECTION( serp ) ) ;
+++
+++ sin_len = sizeof( sin_remote );
+++ if ( getpeername( SERVER_FD( serp ), &sin_remote.sa, &sin_len ) == -1 )
+++ {
+++ msg( LOG_ERR, func, "(%d) getpeername: %m", getpid() ) ;
+++ return( IDR_ERROR ) ;
+++ }
++ sin_contact = sin_remote;
++ memcpy( &sin_bind, &sin_local, sizeof(sin_bind) ) ;
++ local_port = 0;
++@@ -127,7 +133,13 @@ idresult_e log_remote_user( const struct
++ msg( LOG_ERR, func, "socket creation: %m" ) ;
++ return( IDR_ERROR ) ;
++ }
++- if ( bind(sd, &sin_bind.sa, sizeof(sin_bind.sa)) == -1 )
+++
+++ if ( sin_bind.sa.sa_family == AF_INET )
+++ sin_len = sizeof( sin_bind.sa_in ) ;
+++ else
+++ sin_len = sizeof( sin_bind.sa_in6 ) ;
+++
+++ if ( bind(sd, &sin_bind.sa, sin_len) == -1 )
++ {
++ msg( LOG_ERR, func, "socket bind: %m" ) ;
++ (void) Sclose( sd ) ;
+diff --git a/feeds/packages/net/xl2tpd/Makefile b/feeds/packages/net/xl2tpd/Makefile
+new file mode 100644
+index 0000000..91dcbfb
+--- /dev/null
++++ b/feeds/packages/net/xl2tpd/Makefile
+@@ -0,0 +1,90 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=xl2tpd
++PKG_VERSION:=devel-20150930
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/xelerance/xl2tpd.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=5faece38704ae32063abe1d25e199c03e6f44669
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/xl2tpd
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=An L2TP (Layer 2 Tunneling Protocol) daemon
++ URL:=http://www.xelerance.com/software/xl2tpd/
++ SUBMENU:=VPN
++ DEPENDS:=+ppp-mod-pppol2tp +resolveip
++endef
++
++define Package/xl2tpd/description
++l2tpd is the open source implementation of the L2TP tunneling protocol (RFC2661).
++It does implement both LAC and LNS role in a L2TP networking architecture. The
++main goal of this protocol is to tunnel PPP frame trough an IP network.
++endef
++
++# Use optimization options from OpenWrt build system
++MAKE_FLAGS += OFLAGS=""
++
++ifneq (0,0)
++ # debugging options from Makefile of xl2tpd package
++ EXTRA_CFLAGS += \
++ -DDEBUG_ZLB \
++ -DDEBUG_HELLO \
++ -DDEBUG_CLOSE \
++ -DDEBUG_FLOW \
++ -DDEBUG_FILE \
++ -DDEBUG_AAA \
++ -DDEBUG_PAYLOAD \
++ -DDEBUG_CONTROL \
++ -DDEBUG_PPPD \
++ -DDEBUG_HIDDEN \
++ -DDEBUG_ENTROPY \
++ -DDEBUG_CONTROL_XMIT \
++ -DDEBUG_MAGIC \
++ -DDEBUG_FLOW_MORE \
++ -DDEBUG_AUTH
++endif
++
++define Package/xl2tpd/conffiles
++/etc/xl2tpd/xl2tpd.conf
++/etc/xl2tpd/xl2tp-secrets
++/etc/ppp/options.xl2tpd
++endef
++
++define Package/xl2tpd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/local/sbin/xl2tpd $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/local/sbin/xl2tpd-control $(1)/usr/sbin/
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/xl2tpd.init $(1)/etc/init.d/xl2tpd
++
++ $(INSTALL_DIR) $(1)/etc/xl2tpd
++ $(INSTALL_DATA) ./files/xl2tpd.conf $(1)/etc/xl2tpd/
++ $(INSTALL_CONF) ./files/xl2tp-secrets $(1)/etc/xl2tpd/
++
++ $(INSTALL_DIR) $(1)/etc/ppp
++ $(INSTALL_DATA) ./files/options.xl2tpd $(1)/etc/ppp/
++
++ $(INSTALL_DIR) $(1)/lib/netifd/proto
++ $(INSTALL_BIN) ./files/l2tp.sh $(1)/lib/netifd/proto
++endef
++
++$(eval $(call BuildPackage,xl2tpd))
+diff --git a/feeds/packages/net/xl2tpd/README b/feeds/packages/net/xl2tpd/README
+new file mode 100644
+index 0000000..aadc26e
+--- /dev/null
++++ b/feeds/packages/net/xl2tpd/README
+@@ -0,0 +1,23 @@
++OpenWRT Package for xl2tpd
++
++xl2tpd is a development from the original l2tpd package originally written by
++Mark Spencer, subsequently forked by Scott Balmos and David Stipp, inherited
++by Jeff McAdams, modified substantially by Jacco de Leeuw and then forked
++again by Xelerance (after it was abandoned by l2tpd.org).
++
++Rationale for inclusion in OpenWRT:
++
++l2tpd has some serious alignment problems on RISC platforms. It also runs
++purely in userspace.
++
++Some of the features added in this fork include:
++
++1. IPSec SA reference tracking inconjunction with openswan's IPSec transport
++ mode, which adds support for multiple clients behind the same NAT router
++ and multiple clients on the same internal IP behind different NAT routers.
++
++2. Support for the pppol2tp kernel mode L2TP.
++
++3. Alignment and endian problems resolved.
++
++hcg
+diff --git a/feeds/packages/net/xl2tpd/files/l2tp.sh b/feeds/packages/net/xl2tpd/files/l2tp.sh
+new file mode 100644
+index 0000000..8a931ad
+--- /dev/null
++++ b/feeds/packages/net/xl2tpd/files/l2tp.sh
+@@ -0,0 +1,125 @@
++#!/bin/sh
++
++[ -x /usr/sbin/xl2tpd ] || exit 0
++
++[ -n "$INCLUDE_ONLY" ] || {
++ . /lib/functions.sh
++ . ../netifd-proto.sh
++ init_proto "$@"
++}
++
++proto_l2tp_init_config() {
++ proto_config_add_string "username"
++ proto_config_add_string "password"
++ proto_config_add_string "keepalive"
++ proto_config_add_string "pppd_options"
++ proto_config_add_boolean "ipv6"
++ proto_config_add_int "mtu"
++ proto_config_add_int "checkup_interval"
++ proto_config_add_string "server"
++ available=1
++ no_device=1
++ no_proto_task=1
++}
++
++proto_l2tp_setup() {
++ local interface="$1"
++ local optfile="/tmp/l2tp/options.${interface}"
++
++ local ip serv_addr server
++ json_get_var server server && {
++ for ip in $(resolveip -t 5 "$server"); do
++ ( proto_add_host_dependency "$interface" "$ip" )
++ serv_addr=1
++ done
++ }
++ [ -n "$serv_addr" ] || {
++ echo "Could not resolve server address" >&2
++ sleep 5
++ proto_setup_failed "$interface"
++ exit 1
++ }
++
++ # Start and wait for xl2tpd
++ if [ ! -p /var/run/xl2tpd/l2tp-control -o -z "$(pidof xl2tpd)" ]; then
++ /etc/init.d/xl2tpd restart
++
++ local wait_timeout=0
++ while [ ! -p /var/run/xl2tpd/l2tp-control ]; do
++ wait_timeout=$(($wait_timeout + 1))
++ [ "$wait_timeout" -gt 5 ] && {
++ echo "Cannot find xl2tpd control file." >&2
++ proto_setup_failed "$interface"
++ exit 1
++ }
++ sleep 1
++ done
++ fi
++
++ local ipv6 demand keepalive username password pppd_options mtu
++ json_get_vars ipv6 demand keepalive username password pppd_options mtu
++ [ "$ipv6" = 1 ] || ipv6=""
++ if [ "${demand:-0}" -gt 0 ]; then
++ demand="precompiled-active-filter /etc/ppp/filter demand idle $demand"
++ else
++ demand="persist"
++ fi
++
++ local interval="${keepalive##*[, ]}"
++ [ "$interval" != "$keepalive" ] || interval=5
++
++ keepalive="${keepalive:+lcp-echo-interval $interval lcp-echo-failure ${keepalive%%[, ]*}}"
++ username="${username:+user \"$username\" password \"$password\"}"
++ ipv6="${ipv6:++ipv6}"
++ mtu="${mtu:+mtu $mtu mru $mtu}"
++
++ mkdir -p /tmp/l2tp
++ cat <<EOF >"$optfile"
++usepeerdns
++nodefaultroute
++ipparam "$interface"
++ifname "l2tp-$interface"
++ip-up-script /lib/netifd/ppp-up
++ipv6-up-script /lib/netifd/ppp-up
++ip-down-script /lib/netifd/ppp-down
++ipv6-down-script /lib/netifd/ppp-down
++# Don't wait for LCP term responses; exit immediately when killed.
++lcp-max-terminate 0
++$keepalive
++$username
++$ipv6
++$mtu
++$pppd_options
++EOF
++
++ xl2tpd-control add l2tp-${interface} pppoptfile=${optfile} lns=${server} || {
++ echo "xl2tpd-control: Add l2tp-$interface failed" >&2
++ proto_setup_failed "$interface"
++ exit 1
++ }
++ xl2tpd-control connect l2tp-${interface} || {
++ echo "xl2tpd-control: Connect l2tp-$interface failed" >&2
++ proto_setup_failed "$interface"
++ exit 1
++ }
++}
++
++proto_l2tp_teardown() {
++ local interface="$1"
++ local optfile="/tmp/l2tp/options.${interface}"
++
++ rm -f ${optfile}
++ if [ -p /var/run/xl2tpd/l2tp-control ]; then
++ xl2tpd-control remove l2tp-${interface} || {
++ echo "xl2tpd-control: Remove l2tp-$interface failed" >&2
++ }
++ fi
++ # Wait for interface to go down
++ while [ -d /sys/class/net/l2tp-${interface} ]; do
++ sleep 1
++ done
++}
++
++[ -n "$INCLUDE_ONLY" ] || {
++ add_protocol l2tp
++}
+diff --git a/feeds/packages/net/xl2tpd/files/options.xl2tpd b/feeds/packages/net/xl2tpd/files/options.xl2tpd
+new file mode 100644
+index 0000000..f0fc4f4
+--- /dev/null
++++ b/feeds/packages/net/xl2tpd/files/options.xl2tpd
+@@ -0,0 +1,13 @@
++#
++
++lock
++noauth
++debug
++dump
++logfd 2
++logfile /var/log/xl2tpd.log
++noccp
++novj
++novjccomp
++nopcomp
++noaccomp
+diff --git a/feeds/packages/net/xl2tpd/files/xl2tp-secrets b/feeds/packages/net/xl2tpd/files/xl2tp-secrets
+new file mode 100644
+index 0000000..0fb513f
+--- /dev/null
++++ b/feeds/packages/net/xl2tpd/files/xl2tp-secrets
+@@ -0,0 +1,5 @@
++# Secrets for authenticating l2tp tunnels
++# us them secret
++# * marko blah2
++# zeus marko blah
++# * * interop
+diff --git a/feeds/packages/net/xl2tpd/files/xl2tpd.conf b/feeds/packages/net/xl2tpd/files/xl2tpd.conf
+new file mode 100644
+index 0000000..2423ff6
+--- /dev/null
++++ b/feeds/packages/net/xl2tpd/files/xl2tpd.conf
+@@ -0,0 +1,23 @@
++[global]
++port = 1701
++auth file = /etc/xl2tpd/xl2tp-secrets
++access control = no
++
++;[lns default]
++;exclusive = yes
++;ip range = 192.168.254.202-192.168.254.210
++;lac = 10.0.1.2
++;hidden bit = no
++;local ip = 192.168.254.200
++;length bit = yes
++;refuse authentication = yes
++;name = VersaLink
++;ppp debug = yes
++;pppoptfile = /etc/ppp/options.xl2tpd
++
++;[lac left]
++;lns = 10.0.1.2
++;refuse authentication = yes
++;name = VersaLink
++;ppp debug = yes
++;pppoptfile = /etc/ppp/options.xl2tpd
+diff --git a/feeds/packages/net/xl2tpd/files/xl2tpd.conf.sample b/feeds/packages/net/xl2tpd/files/xl2tpd.conf.sample
+new file mode 100644
+index 0000000..477afa5
+--- /dev/null
++++ b/feeds/packages/net/xl2tpd/files/xl2tpd.conf.sample
+@@ -0,0 +1,73 @@
++;
++; Sample l2tpd configuration file
++;
++; This example file should give you some idea of how the options for l2tpd
++; should work. The best place to look for a list of all options is in
++; the source code itself, until I have the time to write better documetation :)
++; Specifically, the file "file.c" contains a list of commands at the end.
++;
++; You most definitely don't have to spell out everything as it is done here
++;
++; [global] ; Global parameters:
++; port = 1701 ; * Bind to port 1701
++; auth file = /etc/xl2tpd/xl2tp-secrets ; * Where our challenge secrets are
++; access control = yes ; * Refuse connections without IP match
++; rand source = dev ; Source for entropy for random
++; ; numbers, options are:
++; ; dev - reads of /dev/urandom
++; ; sys - uses rand()
++; ; egd - reads from egd socket
++; ; egd is not yet implemented
++;
++; [lns default] ; Our fallthrough LNS definition
++; exclusive = no ; * Only permit one tunnel per host
++; ip range = 192.168.0.1-192.168.0.20 ; * Allocate from this IP range
++; no ip range = 192.168.0.3-192.168.0.9 ; * Except these hosts
++; ip range = 192.168.0.5 ; * But this one is okay
++; ip range = lac1-lac2 ; * And anything from lac1 to lac2's IP
++; lac = 192.168.1.4 - 192.168.1.8 ; * These can connect as LAC's
++; no lac = untrusted.marko.net ; * This guy can't connect
++; hidden bit = no ; * Use hidden AVP's?
++; local ip = 192.168.1.2 ; * Our local IP to use
++; length bit = yes ; * Use length bit in payload?
++; require chap = yes ; * Require CHAP auth. by peer
++; refuse pap = yes ; * Refuse PAP authentication
++; refuse chap = no ; * Refuse CHAP authentication
++; refuse authentication = no ; * Refuse authentication altogether
++; require authentication = yes ; * Require peer to authenticate
++; unix authentication = no ; * Use /etc/passwd for auth.
++; name = myhostname ; * Report this as our hostname
++; ppp debug = no ; * Turn on PPP debugging
++; pppoptfile = /etc/ppp/options.xl2tpd.lns ; * ppp options file
++; call rws = 10 ; * RWS for call (-1 is valid)
++; tunnel rws = 4 ; * RWS for tunnel (must be > 0)
++; flow bit = yes ; * Include sequence numbers
++; challenge = yes ; * Challenge authenticate peer ;
++;
++; [lac marko] ; Example VPN LAC definition
++; lns = lns.marko.net ; * Who is our LNS?
++; lns = lns2.marko.net ; * A backup LNS (not yet used)
++; redial = yes ; * Redial if disconnected?
++; redial timeout = 15 ; * Wait n seconds between redials
++; max redials = 5 ; * Give up after n consecutive failures
++; hidden bit = yes ; * User hidden AVP's?
++; local ip = 192.168.1.1 ; * Force peer to use this IP for us
++; remote ip = 192.168.1.2 ; * Force peer to use this as their IP
++; length bit = no ; * Use length bit in payload?
++; require pap = no ; * Require PAP auth. by peer
++; require chap = yes ; * Require CHAP auth. by peer
++; refuse pap = yes ; * Refuse PAP authentication
++; refuse chap = no ; * Refuse CHAP authentication
++; refuse authentication = no ; * Refuse authentication altogether
++; require authentication = yes ; * Require peer to authenticate
++; name = marko ; * Report this as our hostname
++; ppp debug = no ; * Turn on PPP debugging
++; pppoptfile = /etc/ppp/options.xl2tpd.marko ; * ppp options file for this lac
++; call rws = 10 ; * RWS for call (-1 is valid)
++; tunnel rws = 4 ; * RWS for tunnel (must be > 0)
++; flow bit = yes ; * Include sequence numbers
++; challenge = yes ; * Challenge authenticate peer
++;
++; [lac cisco] ; Another quick LAC
++; lns = cisco.marko.net ; * Required, but can take from default
++; require authentication = yes
+diff --git a/feeds/packages/net/xl2tpd/files/xl2tpd.init b/feeds/packages/net/xl2tpd/files/xl2tpd.init
+new file mode 100644
+index 0000000..7d2e9ea
+--- /dev/null
++++ b/feeds/packages/net/xl2tpd/files/xl2tpd.init
+@@ -0,0 +1,24 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2015 OpenWrt.org
++
++START=60
++USE_PROCD=1
++
++BIN=xl2tpd
++RUN_D="/var/run/xl2tpd"
++PID_F="/var/run/xl2tpd.pid"
++
++start_service() {
++ rm -rf "$RUN_D"
++ mkdir -p "$RUN_D"
++
++ procd_open_instance
++ procd_set_param command $BIN -D -l -p "$PID_F"
++ procd_set_param respawn
++ procd_close_instance
++}
++
++stop_service() {
++ rm -rf "$RUN_D"
++ rm -rf "$PID_F"
++}
+diff --git a/feeds/packages/net/xl2tpd/patches/100-makefile_opt_flags.patch b/feeds/packages/net/xl2tpd/patches/100-makefile_opt_flags.patch
+new file mode 100644
+index 0000000..1af416f
+--- /dev/null
++++ b/feeds/packages/net/xl2tpd/patches/100-makefile_opt_flags.patch
+@@ -0,0 +1,12 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -97,7 +97,8 @@ OSFLAGS+= -DUSE_KERNEL
++
++ IPFLAGS?= -DIP_ALLOCATION
++
++-CFLAGS+= $(DFLAGS) -O2 -fno-builtin -Wall -DSANITY $(OSFLAGS) $(IPFLAGS)
+++OFLAGS=-O2
+++CFLAGS+= $(DFLAGS) $(OFLAGS) -fno-builtin -Wall -DSANITY $(OSFLAGS) $(IPFLAGS)
++ HDRS=l2tp.h avp.h misc.h control.h call.h scheduler.h file.h aaa.h md5.h
++ OBJS=xl2tpd.o pty.o misc.o control.o avp.o call.o network.o avpsend.o scheduler.o file.o aaa.o md5.o
++ SRCS=${OBJS:.o=.c} ${HDRS}
+diff --git a/feeds/packages/net/xl2tpd/patches/110-makefile_dont_build_pfc.patch b/feeds/packages/net/xl2tpd/patches/110-makefile_dont_build_pfc.patch
+new file mode 100644
+index 0000000..f76364f
+--- /dev/null
++++ b/feeds/packages/net/xl2tpd/patches/110-makefile_dont_build_pfc.patch
+@@ -0,0 +1,43 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -113,10 +113,10 @@ BINDIR?=$(DESTDIR)${PREFIX}/bin
++ MANDIR?=$(DESTDIR)${PREFIX}/share/man
++
++
++-all: $(EXEC) pfc $(CONTROL_EXEC)
+++all: $(EXEC) $(CONTROL_EXEC)
++
++ clean:
++- rm -f $(OBJS) $(EXEC) pfc.o pfc $(CONTROL_EXEC)
+++ rm -f $(OBJS) $(EXEC) $(CONTROL_EXEC)
++
++ $(EXEC): $(OBJS) $(HDRS)
++ $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
++@@ -124,14 +124,10 @@ $(EXEC): $(OBJS) $(HDRS)
++ $(CONTROL_EXEC): $(CONTROL_SRCS)
++ $(CC) $(CFLAGS) $(LDFLAGS) $(CONTROL_SRCS) -o $@
++
++-pfc:
++- $(CC) $(CFLAGS) -c contrib/pfc.c
++- $(CC) $(LDFLAGS) -o pfc pfc.o -lpcap $(LDLIBS)
++-
++ romfs:
++ $(ROMFSINST) /bin/$(EXEC)
++
++-install: ${EXEC} pfc ${CONTROL_EXEC}
+++install: ${EXEC} ${CONTROL_EXEC}
++ install -d -m 0755 ${SBINDIR}
++ install -m 0755 $(EXEC) ${SBINDIR}/$(EXEC)
++ install -d -m 0755 ${MANDIR}/man5
++@@ -139,11 +135,6 @@ install: ${EXEC} pfc ${CONTROL_EXEC}
++ install -m 0644 doc/xl2tpd.8 ${MANDIR}/man8/
++ install -m 0644 doc/xl2tpd.conf.5 doc/l2tp-secrets.5 \
++ ${MANDIR}/man5/
++- # pfc
++- install -d -m 0755 ${BINDIR}
++- install -m 0755 pfc ${BINDIR}/pfc
++- install -d -m 0755 ${MANDIR}/man1
++- install -m 0644 contrib/pfc.1 ${MANDIR}/man1/
++ # control exec
++ install -d -m 0755 ${SBINDIR}
++ install -m 0755 $(CONTROL_EXEC) ${SBINDIR}/$(CONTROL_EXEC)
+diff --git a/feeds/packages/net/xl2tpd/patches/120-no-bsd-signal-in-musl.patch b/feeds/packages/net/xl2tpd/patches/120-no-bsd-signal-in-musl.patch
+new file mode 100644
+index 0000000..c8c4a7d
+--- /dev/null
++++ b/feeds/packages/net/xl2tpd/patches/120-no-bsd-signal-in-musl.patch
+@@ -0,0 +1,11 @@
++--- a/xl2tpd.c
+++++ b/xl2tpd.c
++@@ -30,7 +30,7 @@
++ #include <errno.h>
++ #include <unistd.h>
++ #include <time.h>
++-#if (__GLIBC__ < 2)
+++#if defined (__GLIBC__) && (__GLIBC__ < 2)
++ # if defined(FREEBSD) || defined(OPENBSD)
++ # include <sys/signal.h>
++ # elif defined(LINUX)
+diff --git a/feeds/packages/net/znc/Makefile b/feeds/packages/net/znc/Makefile
+new file mode 100644
+index 0000000..64a7a4f
+--- /dev/null
++++ b/feeds/packages/net/znc/Makefile
+@@ -0,0 +1,295 @@
++#
++# Copyright (C) 2009-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=znc
++PKG_VERSION:=1.6.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://znc.in/releases \
++ http://znc.in/releases/archive
++PKG_MD5SUM:=8e29289e6229b6d2473de202170745ab
++
++PKG_MAINTAINER:=Jonas Gorski <jogo@openwrt.org>
++PKG_LICENSE:=Apache-2.0
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_USE_MIPS16:=0
++PKG_BUILD_PARALLEL:=1
++
++
++define Package/znc/default
++ SUBMENU:=Instant Messaging
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=ZNC
++ URL:=http://en.znc.in/
++endef
++
++define Package/znc
++ $(Package/znc/default)
++ DEPENDS:=+libopenssl +libpthread +libstdcpp @GCC_VERSION_4_8||GCC_VERSION_4_9
++ MENU:=1
++endef
++
++define Package/znc/description
++ ZNC is an IRC bouncer with many advanced features like detaching,
++ multiple users, per channel playback buffer, SSL, IPv6, transparent DCC
++ bouncing, and c++ module support to name a few.
++endef
++
++define Package/znc/conffiles
++/etc/config/znc
++endef
++
++
++define Package/znc/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/znc $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/znc.init $(1)/etc/init.d/znc
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/znc.conf $(1)/etc/config/znc
++ $(INSTALL_DIR) $(1)/usr/lib/znc/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/modules/droproot.so $(1)/usr/lib/znc/
++endef
++
++
++ZNC_MODULES :=
++ZNC_MODULE_TARGETS := droproot.so
++
++define module
++ define Package/znc-mod-$(strip $(1))
++ $(Package/znc/default)
++ TITLE+= ($(strip $(1)) plugin)
++ DEPENDS:=znc
++ endef
++
++ define Package/znc-mod-$(strip $(1))/description
++ $(strip $(2))
++ endef
++
++ define Package/znc-mod-$(strip $(1))/install
++ $(INSTALL_DIR) $$(1)/usr/lib/znc/
++ $(INSTALL_BIN) $$(PKG_BUILD_DIR)/modules/$(subst -,_,$(strip $(1))).so $$(1)/usr/lib/znc/
++ # include webadmin page templates if existing
++ if [ -d $$(PKG_BUILD_DIR)/modules/data/$(subst -,_,$(strip $(1))) ]; then \
++ $(INSTALL_DIR) $$(1)/usr/share/znc/modules ;\
++ $(CP) -r $$(PKG_BUILD_DIR)/modules/data/$(subst -,_,$(strip $(1))) $$(1)/usr/share/znc/modules ;\
++ fi
++ endef
++
++ ZNC_MODULES += znc-mod-$(strip $(1))
++ $(if $(CONFIG_PACKAGE_znc-mod-$(strip $(1))),ZNC_MODULE_TARGETS += $(subst -,_,$(strip $(1))).so)
++endef
++
++define webadmin
++ define Package/znc-mod-webadmin
++ $(Package/znc/default)
++ TITLE+= (webadmin plugin)
++ DEPENDS:=znc
++ endef
++
++ define Package/znc-mod-webadmin/description
++ Allows you to add/remove/edit users and settings on the fly via a web browser.
++ endef
++
++ define Package/znc-mod-webadmin/install
++ $(INSTALL_DIR) $$(1)/usr/lib/znc/
++ $(INSTALL_BIN) $$(PKG_BUILD_DIR)/modules/webadmin.so $$(1)/usr/lib/znc/
++ $(INSTALL_DIR) $$(1)/usr/share/znc/modules
++ $(CP) -r $$(PKG_BUILD_DIR)/modules/data/webadmin $$(1)/usr/share/znc/modules
++ $(INSTALL_DIR) $$(1)/usr/share/znc/webskins/
++ $(CP) -r $$(PKG_BUILD_DIR)/webskins/_default_ $$(1)/usr/share/znc/webskins/
++ endef
++
++ ZNC_MODULES += znc-mod-webadmin
++ $(if $(CONFIG_PACKAGE_znc-mod-webadmin),ZNC_MODULE_TARGETS += webadmin.so)
++endef
++
++define webskin
++ define Package/znc-webskin-$(strip $(1))
++ $(Package/znc/default)
++ TITLE+= ($(strip $(1)) webskin)
++ DEPENDS:=znc-mod-webadmin
++ endef
++
++ define Package/znc-webskin-$(strip $(1))/description
++ $(strip $(1)) webskin for webadmin
++ endef
++
++ define Package/znc-webskin-$(strip $(1))/install
++ $(INSTALL_DIR) $$(1)/usr/share/znc/webskins/
++ $(CP) -r $$(PKG_BUILD_DIR)/webskins/$(strip $(1)) $$(1)/usr/share/znc/webskins/
++ endef
++ ZNC_MODULES += znc-webskin-$(strip $(1))
++endef
++
++, := ,
++
++$(eval $(call module,adminlog,Log user connects and disconnects and failed \
++ logins to file or syslog.))
++
++$(eval $(call module,alias,Provides bouncer-side command alias support.))
++
++$(eval $(call module,autoattach,Reattaches you to channels on activity.))
++
++$(eval $(call module,autocycle,Cycles a channel when you are the only one in \
++ there and you don't have op.))
++
++$(eval $(call module,autoop,Auto op the good guys.))
++
++$(eval $(call module,autoreply,Gives a automatic reply if someone messages you \
++ if you are away.))
++
++$(eval $(call module,autovoice,Autovoices everyone who joins some channel.))
++
++$(eval $(call module,awaynick,Change your nick while you are away.))
++
++$(eval $(call module,awaystore,Stores messages while away$(,) also auto away.))
++
++$(eval $(call module,block-motd,This module blocks the server's Message of the \
++ Day.))
++
++$(eval $(call module,blockuser,Blocks certain users from using ZNC saying \
++ their account was disabled.))
++
++$(eval $(call module,bouncedcc,Bounces dcc transfers through the znc server \
++ instead of sending them directly to the user.))
++
++$(eval $(call module,buffextras,Add nick changes$(,) joins$(,) parts$(,) topic \
++ changes etc. to your playback buffer.))
++
++$(eval $(call module,cert,Use a SSL certificate for connecting to a server.))
++
++$(eval $(call module,certauth,This module allows users to log in to ZNC via \
++ SSL client keys.))
++
++$(eval $(call module,chansaver,Keeping config up to date when user joins and \
++ parts.))
++
++$(eval $(call module,clearbufferonmsg,This module keeps the buffer until the \
++ next message from the client.))
++
++$(eval $(call module,clientnotify,Notify about new incoming connections to \
++ your user.))
++
++$(eval $(call module,controlpanel,Allows you to add/remove/edit users and \
++ settings on the fly via IRC messages.))
++
++$(eval $(call module,crypt,Encryption for channel/private messages.))
++
++$(eval $(call module,ctcpflood,This module tries to block ctcp floods.))
++
++$(eval $(call module,dcc,Allows you to transfer files to and from ZNC.))
++
++$(eval $(call module,disconkick,This module will kick your client from all \
++ channels where you are$(,) in case if ZNC disconnects from server.))
++
++$(eval $(call module,fail2ban,Block IPs for some time after a failed login.))
++
++$(eval $(call module,flooddetach,This module detaches you from channels which \
++ are flooded.))
++
++$(eval $(call module,identfile,Places the ident of a user to a file when they \
++ are trying to connect.))
++
++$(eval $(call module,imapauth,Allow users to authenticate via IMAP.))
++
++$(eval $(call module,keepnick,Tries to get you your primary nick.))
++
++$(eval $(call module,kickrejoin,Implements auto-rejoin-on-kick.))
++
++$(eval $(call module,lastseen,Logs when a user last logged in to ZNC.))
++
++$(eval $(call module,listsockets,This module displays a list of all open \
++ sockets in ZNC.))
++
++$(eval $(call module,log,Log conversations to file.))
++
++$(eval $(call module,missingmotd,Sends 422 to clients when they login.))
++
++$(eval $(call module,modules_online,This module fakes the online status of \
++ ZNC-*users.))
++
++$(eval $(call module,nickserv,Auths you with NickServ.))
++
++$(eval $(call module,notes,This modules stores and displays short notes using \
++ a key/note pairs and shows them to you on connect.))
++
++$(eval $(call module,notify-connect,Sends a notice to all admins when a user \
++ logs in or out.))
++
++$(eval $(call module,partyline,Allows ZNC users to join internal channels and \
++ query other ZNC users on the same ZNC.))
++
++$(eval $(call module,perform,Performs commands on connect.))
++
++$(eval $(call module,q,Auths you with Q (and a little more).))
++
++$(eval $(call module,raw,View all of the raw traffic.))
++
++$(eval $(call module,route-replies,Routes back answers to the right client \
++ when connected with multiple clients.))
++
++$(eval $(call module,sasl,The SASL module allows you to authenticate to an \
++ IRC network via SASL.))
++
++$(eval $(call module,savebuff,Saves your channel buffers into an encrypted \
++ file so they can survive restarts and reboots.))
++
++$(eval $(call module,schat,SSL (encrypted) DCC chats.))
++
++$(eval $(call module,send-raw,Allows you to send raw traffic to IRC from \
++ other users.))
++
++$(eval $(call module,simple-away,This module will automatically set you away \
++ on IRC while you are disconnected from the bouncer.))
++
++$(eval $(call module,shell,Have your unix shell in a query window right inside \
++ of your IRC client.))
++
++$(eval $(call module,stickychan,Keeps you sticked to specific channels.))
++
++$(eval $(call module,watch,Monitor activity for specific text patterns from \
++ specific users and have the text sent to a special query window.))
++
++$(eval $(call webadmin))
++
++$(eval $(call webskin,dark-clouds))
++$(eval $(call webskin,forest))
++$(eval $(call webskin,ice))
++
++PKG_CONFIG_DEPENDS := $(patsubst %,CONFIG_PACKAGE_%,$(ZNC_MODULES))
++
++include $(INCLUDE_DIR)/package.mk
++
++CONFIGURE_VARS += \
++ CXXFLAGS="$(TARGET_CFLAGS) -fno-builtin -fno-rtti" \
++ CPPFLAGS="-I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/include" \
++ LDFLAGS="-nodefaultlibs -lc -L$(STAGING_DIR)/usr/lib -L$(STAGING_DIR)/lib" \
++ LIBS="-lstdc++ -lm -lssl -lcrypto $(LIBGCC_S) -lc"
++
++CONFIGURE_ARGS += \
++ --disable-c-ares \
++ --disable-perl
++
++define Build/Configure
++ $(call Build/Configure/Default,)
++ $(call libtool_disable_rpath)
++endef
++
++define Build/Compile
++ $(call Build/Compile/Default,znc)
++ +$(MAKE_VARS) $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/modules \
++ $(MAKE_FLAGS) $(ZNC_MODULE_TARGETS)
++endef
++
++$(eval $(call BuildPackage,znc))
++$(foreach m,$(ZNC_MODULES),$(eval $(call BuildPackage,$(m))))
+diff --git a/feeds/packages/net/znc/files/znc.conf b/feeds/packages/net/znc/files/znc.conf
+new file mode 100644
+index 0000000..1b0d842
+--- /dev/null
++++ b/feeds/packages/net/znc/files/znc.conf
+@@ -0,0 +1,29 @@
++config znc
++ # where to listen for connections
++ list listener '192.168.1.1 1234'
++ # If using SSL sockets, use the following certifcate:
++ # option znc_ssl_cert '/etc/znc.cert'
++
++ # load global modules (You need to install them first):
++ # list module 'fail2ban'
++
++ # remove this to enable the service
++ option disabled 1
++
++config user 'sampleUser'
++ # Use either a plain text password or use the full sha256#... line.
++ # You can generate one with 'znc -s'.
++ option password 'changeme'
++ option nick 'sampleUser'
++ option altnick 'userSample'
++ option ident 'openwrt'
++ option realname 'John Doe'
++
++ # This adds support for channels in znc configuration:
++ # list channel '#chan optional_password'
++
++ # list of allowed servers:
++ # list server 'chat.freenode.net 6667'
++
++ # load user modules ('<module> [params...]'):
++ # list module 'simple_away -timer 10 disconnected'
+diff --git a/feeds/packages/net/znc/files/znc.init b/feeds/packages/net/znc/files/znc.init
+new file mode 100644
+index 0000000..2ee5a1e
+--- /dev/null
++++ b/feeds/packages/net/znc/files/znc.init
+@@ -0,0 +1,197 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2010 Openwrt.org
++
++START=60
++
++ZNC_CONFIG_PATH=/tmp/etc/znc
++PID_FILE=${ZNC_CONFIG_PATH}/znc.pid
++ZNC_CONFIG=${ZNC_CONFIG_PATH}/configs/znc.conf
++
++EXTERNAL_CONFIG=0
++DISABLED=
++
++RUNAS_USER=
++RUNAS_GROUP=
++
++add_param() {
++ echo "$1 = $2" >> $ZNC_CONFIG
++}
++
++add_chan() {
++ chan=${1% *}
++ pass=${1#* }
++ echo " <Chan $chan>" >> $ZNC_CONFIG
++ [ "$chan" != "$pass" ] && echo " Key = $pass" >> $ZNC_CONFIG
++ echo " </Chan>" >> $ZNC_CONFIG
++}
++
++add_network() {
++ local current_user="$1"
++ local network="$2"
++ local user
++ local name
++
++ config_get user "$network" user
++
++ [ "$user" = "$current_user" ] || return 0
++
++ config_get name "$network" name
++ echo " <Network $name>" >> $ZNC_CONFIG
++ config_list_foreach "$network" server "add_param \" Server\""
++ config_list_foreach "$network" fingerprint "add_param \" trustedserverfingerprint\""
++ config_list_foreach "$network" channel "add_chan"
++ echo " </Network>" >> $ZNC_CONFIG
++}
++
++znc_global() {
++ local znc="$1"
++ local anoniplimit
++ local maxbuffersize
++ local connectdelay
++ local serverthrottle
++ local znc_config_path
++ local znc_pem_file
++
++ config_get_bool DISABLED "$znc" disabled 0
++
++ [ "$DISABLED" -eq 0 ] || return 0
++
++ config_get znc_config_path "$znc" znc_config_path
++
++ config_get RUNAS_USER "$znc" runas_user
++ config_get RUNAS_GROUP "$znc" runas_group
++
++ if [ "${znc_config_path}" ]
++ then
++ ZNC_CONFIG_PATH=$znc_config_path
++ EXTERNAL_CONFIG=1
++ else
++ mkdir -p $ZNC_CONFIG_PATH/configs/
++ [ ! -f "$ZNC_CONFIG" ] || rm "$ZNC_CONFIG"
++
++ add_param "Version" "1.0"
++
++ config_get anoniplimit "$znc" anoniplimit
++ config_get maxbuffersize "$znc" maxbuffersize
++ config_get connectdelay "$znc" connectdelay
++ config_get serverthrottle "$znc" serverthrottle
++ config_get znc_pem_file "$znc" znc_ssl_cert
++
++ [ -z "$znc_pem_file" ] || ln -sf "$znc_pem_file" $ZNC_CONFIG_PATH/znc.pem
++
++ [ -z $anoniplimit ] || echo "AnonIPLimit = $anoniplimit" >> $ZNC_CONFIG
++ [ -z $maxbuffersize ] || echo "MaxBufferSize = $maxbuffersize" >> $ZNC_CONFIG
++ [ -z $connectdelay ] || echo "ConnectDelay = $connectdelay" >> $ZNC_CONFIG
++ [ -z $serverthrottle ] || echo "ServerThrottle = $anoniplimit" >> $ZNC_CONFIG
++
++ echo "PidFile = $PID_FILE" >> $ZNC_CONFIG
++
++ config_list_foreach "$znc" listener "add_param Listener"
++ config_list_foreach "$znc" module "add_param LoadModule"
++
++ add_param LoadModule "droproot ${RUNAS_USER:-nobody} ${RUNAS_GROUP:-nogroup}"
++ fi
++}
++
++add_user() {
++ local user="$1"
++ local password
++ local nick
++ local altnick
++ local ident
++ local realname
++ local buffer
++ local quitmsg
++ local chanmodes
++ local vhost
++ local server
++
++ config_get password "$user" password
++ config_get nick "$user" nick
++ config_get altnick "$user" altnick
++ config_get ident "$user" ident
++ config_get realname "$user" realname
++ config_get buffer "$user" buffer
++ config_get quitmsg "$user" quitmsg
++ config_get chanmodes "$user" chanmodes
++ config_get vhost "$user" vhost
++ config_get server "$user" server
++
++ echo "<User $user>" >> $ZNC_CONFIG
++
++ case "$password" in
++ "md5#"* | "sha256#"* | "plain#"*)
++ add_param " Pass" "$password"
++ ;;
++ *)
++ add_param " Pass" "plain#$password"
++ ;;
++ esac
++
++ add_param " Nick" "$nick"
++ add_param " AltNick" "${altnick:-$nick"_"}"
++ add_param " Ident" "${ident:-$nick}"
++ add_param " RealName" "${realname:-$nick}"
++ [ -z "$vhost" ] || add_param " VHost" "$vhost"
++ add_param " Buffer" "${buffer:-50}"
++ add_param " KeepBuffer" "false"
++ add_param " ChanModes" "${chanmodes:-"+stn"}"
++ [ -z "$quitmsg" ] || add_param " QuitMsg" "$quitmsg"
++
++ config_list_foreach "$user" module "add_param \" LoadModule\""
++
++ # add legacy network
++ if [ "$server" ]; then
++ echo " <Network Default>" >> $ZNC_CONFIG
++ config_list_foreach "$user" server "add_param \" Server\""
++ config_list_foreach "$user" fingerprint "add_param \" trustedserverfingerprint\""
++ config_list_foreach "$user" channel "add_chan"
++ echo " </Network>" >> $ZNC_CONFIG
++ fi
++
++ config_foreach "add_network \"$user\"" network
++
++ echo "</User>" >> $ZNC_CONFIG
++}
++
++
++start() {
++ config_load znc
++ config_foreach znc_global znc
++
++ if [ "$DISABLED" -eq 1 ]; then
++ return 0
++ fi
++
++ if [ "$EXTERNAL_CONFIG" -eq 0 ]
++ then
++ config_foreach add_listener listener
++ config_foreach add_user user
++
++ chown -hR ${RUNAS_USER:-nobody}:${RUNAS_GROUP:-nogroup} /tmp/etc/znc
++ fi
++
++ if [ "$EXTERNAL_CONFIG" -eq 1 -a "$RUNAS_USER" ]
++ then
++ local SU=$(which su)
++ if [ "$SU" ]
++ then
++ $SU -c "/usr/bin/znc -d$ZNC_CONFIG_PATH >/dev/null &" $RUNAS_USER
++ else
++ logger -s -t ZNC -p daemon.err "Could not run ZNC as user $RUNAS_USER: su not found."
++ exit 1
++ fi
++ else
++ /usr/bin/znc -d$ZNC_CONFIG_PATH >/dev/null &
++ fi
++}
++
++stop() {
++ if [ -f "$PID_FILE" ]
++ then
++ kill $(cat "$PID_FILE")
++ else
++ killall znc
++ fi
++}
++
+diff --git a/feeds/packages/net/znc/patches/100-move_rootcheck_after_config.patch b/feeds/packages/net/znc/patches/100-move_rootcheck_after_config.patch
+new file mode 100644
+index 0000000..6ef6630
+--- /dev/null
++++ b/feeds/packages/net/znc/patches/100-move_rootcheck_after_config.patch
+@@ -0,0 +1,52 @@
++From adf42357c9043c38d9a9b47544a1b46445bdae19 Mon Sep 17 00:00:00 2001
++From: Jonas Gorski <jonas.gorski+openwrt@gmail.com>
++Date: Wed, 6 Apr 2011 04:10:23 +0200
++Subject: [PATCH] Move the root check to after config parsing
++
++---
++ src/main.cpp | 27 ++++++++++++++-------------
++ 1 file changed, 14 insertions(+), 13 deletions(-)
++
++--- a/src/main.cpp
+++++ b/src/main.cpp
++@@ -304,19 +304,6 @@ int main(int argc, char** argv) {
++ CUtils::PrintStatus(true, "");
++ }
++
++- if (isRoot()) {
++- CUtils::PrintError("You are running ZNC as root! Don't do that! There are not many valid");
++- CUtils::PrintError("reasons for this and it can, in theory, cause great damage!");
++- if (!bAllowRoot) {
++- CZNC::DestroyInstance();
++- return 1;
++- }
++- CUtils::PrintError("You have been warned.");
++- CUtils::PrintError("Hit CTRL+C now if you don't want to run ZNC as root.");
++- CUtils::PrintError("ZNC will start in 30 seconds.");
++- sleep(30);
++- }
++-
++ if (bMakeConf) {
++ if (!pZNC->WriteNewConfig(sConfig)) {
++ CZNC::DestroyInstance();
++@@ -338,6 +325,20 @@ int main(int argc, char** argv) {
++ return 1;
++ }
++
+++ if (isRoot()) {
+++ CUtils::PrintError("You are running ZNC as root! Don't do that! There are not many valid");
+++ CUtils::PrintError("reasons for this and it can, in theory, cause great damage!");
+++ if (!bAllowRoot) {
+++ CZNC::DestroyInstance();
+++ return 1;
+++ }
+++ CUtils::PrintError("You have been warned.");
+++ CUtils::PrintError("Hit CTRL+C now if you don't want to run ZNC as root.");
+++ CUtils::PrintError("ZNC will start in 30 seconds.");
+++ sleep(30);
+++ }
+++
+++
++ if (bForeground) {
++ int iPid = getpid();
++ CUtils::PrintMessage("Staying open for debugging [pid: " + CString(iPid) + "]");
+diff --git a/feeds/packages/net/znc/patches/101-Reduce_rebuild_time.patch b/feeds/packages/net/znc/patches/101-Reduce_rebuild_time.patch
+new file mode 100644
+index 0000000..60d335c
+--- /dev/null
++++ b/feeds/packages/net/znc/patches/101-Reduce_rebuild_time.patch
+@@ -0,0 +1,39 @@
++From 0527869a72c27bfb25b5f92fdd77a04c39d939db Mon Sep 17 00:00:00 2001
++From: Jonas Gorski <jonas.gorski+openwrt@gmail.com>
++Date: Sat, 16 Apr 2011 05:51:04 +0200
++Subject: [PATCH] Don't rebuild everything when the Makefile's timestamp
++ changed
++
++---
++ Makefile.in | 2 +-
++ modules/Makefile.in | 4 ++--
++ 2 files changed, 3 insertions(+), 3 deletions(-)
++
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -112,7 +112,7 @@ clean:
++ distclean: clean
++ rm -rf $(DISTCLEAN)
++
++-src/%.o: src/%.cpp Makefile include/znc/Csocket.h
+++src/%.o: src/%.cpp include/znc/Csocket.h
++ @mkdir -p .depend src
++ $(E) Building core object $*...
++ $(Q)$(CXX) $(CXXFLAGS) -c -o $@ $< -MD -MF .depend/$*.dep -MT $@
++--- a/modules/Makefile.in
+++++ b/modules/Makefile.in
++@@ -112,12 +112,12 @@ install_datadir:
++ clean:
++ rm -rf $(CLEAN)
++
++-%.o: %.cpp Makefile
+++%.o: %.cpp
++ @mkdir -p .depend
++ $(E) Building module $(notdir $(basename $@))...
++ $(Q)$(CXX) $(MODFLAGS) -c -o $@ $< $($(notdir $(basename $@))CXXFLAGS) -MD -MF .depend/$(notdir $@).dep
++
++-%.so: %.o Makefile
+++%.so: %.o
++ $(E) "Linking module" $(notdir $(basename $@))...
++ $(Q)$(CXX) $(MODFLAGS) $(LDFLAGS) $(MODLINK) -o $@ $< $($(notdir $(basename $@))LDFLAGS) $(LIBS)
++
+diff --git a/feeds/packages/net/znc/patches/102-restore_droproot.patch b/feeds/packages/net/znc/patches/102-restore_droproot.patch
+new file mode 100644
+index 0000000..2c7cefe
+--- /dev/null
++++ b/feeds/packages/net/znc/patches/102-restore_droproot.patch
+@@ -0,0 +1,147 @@
++--- /dev/null
+++++ b/modules/droproot.cpp
++@@ -0,0 +1,144 @@
+++/*
+++ * droproot.cpp
+++ *
+++ * Copyright (c) 2009 Vadtec (vadtec@vadtec.net)
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License version 2 as published
+++ * by the Free Software Foundation.
+++ *
+++ * Copyright (C) 2004-2012 See the AUTHORS file for details.
+++ *
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License version 2 as published
+++ * by the Free Software Foundation.
+++ */
+++
+++#include <znc/znc.h>
+++#include <znc/User.h>
+++#include <pwd.h>
+++#include <grp.h>
+++
+++class CDroproot : public CModule {
+++
+++public:
+++ MODCONSTRUCTOR(CDroproot) {
+++ }
+++
+++ virtual ~CDroproot() {
+++ }
+++
+++ uid_t GetUser(const CString& sUser, CString& sMessage) {
+++ uid_t ret = sUser.ToUInt();
+++
+++ if (ret != 0)
+++ return ret;
+++
+++ struct passwd *pUser = getpwnam(sUser.c_str());
+++
+++ if (!pUser) {
+++ sMessage = "User [" + sUser + "] not found!";
+++ return 0;
+++ }
+++
+++ return pUser->pw_uid;
+++ }
+++
+++ gid_t GetGroup(const CString& sGroup, CString& sMessage) {
+++ gid_t ret = sGroup.ToUInt();
+++
+++ if (ret != 0)
+++ return ret;
+++
+++ struct group *pGroup = getgrnam(sGroup.c_str());
+++
+++ if (!pGroup) {
+++ sMessage = "Group [" + sGroup + "] not found!";
+++ return 0;
+++ }
+++
+++ return pGroup->gr_gid;
+++ }
+++
+++ virtual bool OnLoad(const CString& sArgs, CString& sMessage) {
+++ CString sUser = sArgs.Token(0);
+++ CString sGroup = sArgs.Token(1, true);
+++
+++ if (sUser.empty() || sGroup.empty()) {
+++ sMessage = "Usage: LoadModule = Droproot <uid> <gid>";
+++ return false;
+++ }
+++
+++ m_user = GetUser(sUser, sMessage);
+++
+++ if (m_user == 0) {
+++ sMessage
+++ = "Error: Cannot run as root, check your config file | Useage: LoadModule = Droproot <uid> <gid>";
+++ return false;
+++ }
+++
+++ m_group = GetGroup(sGroup, sMessage);
+++
+++ if (m_group == 0) {
+++ sMessage
+++ = "Error: Cannot run as root, check your config file | Useage: LoadModule = Droproot <uid> <gid>";
+++ return false;
+++ }
+++
+++ return true;
+++ }
+++
+++ virtual bool OnBoot() {
+++ int u, eu, g, eg, sg;
+++
+++ if ((geteuid() == 0) || (getuid() == 0) || (getegid() == 0) || (getgid()
+++ == 0)) {
+++
+++ CUtils::PrintAction("Dropping root permissions");
+++
+++ // Clear all the supplementary groups
+++ sg = setgroups(0, NULL);
+++
+++ if (sg < 0) {
+++ CUtils::PrintStatus(false,
+++ "Could not remove supplementary groups! ["
+++ + CString(strerror(errno)) + "]");
+++
+++ return false;
+++ }
+++
+++ // Set the group (if we are root, this sets all three group IDs)
+++ g = setgid(m_group);
+++ eg = setegid(m_group);
+++
+++ if ((g < 0) || (eg < 0)) {
+++ CUtils::PrintStatus(false, "Could not switch group id! ["
+++ + CString(strerror(errno)) + "]");
+++
+++ return false;
+++ }
+++
+++ // and set the user (if we are root, this sets all three user IDs)
+++ u = setuid(m_user);
+++ eu = seteuid(m_user);
+++
+++ if ((u < 0) || (eu < 0)) {
+++ CUtils::PrintStatus(false, "Could not switch user id! ["
+++ + CString(strerror(errno)) + "]");
+++
+++ return false;
+++ }
+++
+++ CUtils::PrintStatus(true);
+++
+++ return true;
+++ }
+++
+++ return true;
+++ }
+++
+++protected:
+++ uid_t m_user;
+++ gid_t m_group;
+++};
+++
+++GLOBALMODULEDEFS(CDroproot, "Allows ZNC to drop root privileges and run as an un-privileged user.")
+diff --git a/feeds/packages/sound/espeak/Makefile b/feeds/packages/sound/espeak/Makefile
+new file mode 100644
+index 0000000..fd06c6e
+--- /dev/null
++++ b/feeds/packages/sound/espeak/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=espeak
++PKG_VERSION:=1.48.04
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-source.zip
++PKG_SOURCE_URL:=@SF/espeak
++PKG_MD5SUM:=cadd7482eaafe9239546bdc09fa244c3
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=License.txt
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-source
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/espeak
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+libpthread +libstdcpp +portaudio
++ TITLE:=Speech synthesizer
++ URL:=http://espeak.sourceforge.net/
++endef
++
++define Package/espeak/description
++ eSpeak is a compact open source software speech synthesizer for English and
++ other languages.
++endef
++
++MAKE_FLAGS+= \
++ AUDIO="portaudio" \
++ DATADIR="/usr/share/espeak" \
++ CXXFLAGS="$(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++
++MAKE_PATH:=./src
++
++define Package/espeak/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/espeak $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libespeak.so.* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/share
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/espeak $(1)/usr/share/
++endef
++
++$(eval $(call BuildPackage,espeak))
+diff --git a/feeds/packages/sound/espeak/patches/101-portaudio.patch b/feeds/packages/sound/espeak/patches/101-portaudio.patch
+new file mode 100644
+index 0000000..ff396b3
+--- /dev/null
++++ b/feeds/packages/sound/espeak/patches/101-portaudio.patch
+@@ -0,0 +1,2093 @@
++--- a/src/portaudio.h
+++++ /dev/null
++@@ -1,466 +0,0 @@
++-// NOTE: Copy this file to portaudio.h in order to compile with V18 portaudio
++-
++-
++-#ifndef PORT_AUDIO_H
++-#define PORT_AUDIO_H
++-
++-#ifdef __cplusplus
++-extern "C"
++-{
++-#endif /* __cplusplus */
++-
++-/*
++- * $Id: portaudio.h,v 1.5 2002/03/26 18:04:22 philburk Exp $
++- * PortAudio Portable Real-Time Audio Library
++- * PortAudio API Header File
++- * Latest version available at: http://www.audiomulch.com/portaudio/
++- *
++- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
++- *
++- * 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:
++- *
++- * The above copyright notice and this permission notice shall be
++- * included in all copies or substantial portions of the Software.
++- *
++- * Any person wishing to distribute modifications to the Software is
++- * requested to send the modifications to the original developer so that
++- * they can be incorporated into the canonical version.
++- *
++- * 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.
++- *
++- */
++-
++-typedef int PaError;
++-typedef enum {
++- paNoError = 0,
++-
++- paHostError = -10000,
++- paInvalidChannelCount,
++- paInvalidSampleRate,
++- paInvalidDeviceId,
++- paInvalidFlag,
++- paSampleFormatNotSupported,
++- paBadIODeviceCombination,
++- paInsufficientMemory,
++- paBufferTooBig,
++- paBufferTooSmall,
++- paNullCallback,
++- paBadStreamPtr,
++- paTimedOut,
++- paInternalError,
++- paDeviceUnavailable
++-} PaErrorNum;
++-
++-/*
++- Pa_Initialize() is the library initialisation function - call this before
++- using the library.
++-
++-*/
++-
++-PaError Pa_Initialize( void );
++-
++-/*
++- Pa_Terminate() is the library termination function - call this after
++- using the library.
++-
++-*/
++-
++-PaError Pa_Terminate( void );
++-
++-/*
++- Pa_GetHostError() returns a host specific error code.
++- This can be called after receiving a PortAudio error code of paHostError.
++-
++-*/
++-
++-long Pa_GetHostError( void );
++-
++-/*
++- Pa_GetErrorText() translates the supplied PortAudio error number
++- into a human readable message.
++-
++-*/
++-
++-const char *Pa_GetErrorText( PaError errnum );
++-
++-/*
++- Sample formats
++-
++- These are formats used to pass sound data between the callback and the
++- stream. Each device has a "native" format which may be used when optimum
++- efficiency or control over conversion is required.
++-
++- Formats marked "always available" are supported (emulated) by all
++- PortAudio implementations.
++-
++- The floating point representation (paFloat32) uses +1.0 and -1.0 as the
++- maximum and minimum respectively.
++-
++- paUInt8 is an unsigned 8 bit format where 128 is considered "ground"
++-
++-*/
++-
++-typedef unsigned long PaSampleFormat;
++-#define paFloat32 ((PaSampleFormat) (1<<0)) /*always available*/
++-#define paInt16 ((PaSampleFormat) (1<<1)) /*always available*/
++-#define paInt32 ((PaSampleFormat) (1<<2)) /*always available*/
++-#define paInt24 ((PaSampleFormat) (1<<3))
++-#define paPackedInt24 ((PaSampleFormat) (1<<4))
++-#define paInt8 ((PaSampleFormat) (1<<5))
++-#define paUInt8 ((PaSampleFormat) (1<<6))
++-#define paCustomFormat ((PaSampleFormat) (1<<16))
++-
++-/*
++- Device enumeration mechanism.
++-
++- Device ids range from 0 to Pa_CountDevices()-1.
++-
++- Devices may support input, output or both.
++-
++-*/
++-
++-typedef int PaDeviceID;
++-#define paNoDevice -1
++-
++-int Pa_CountDevices( void );
++-
++-typedef struct
++-{
++- int structVersion;
++- const char *name;
++- int maxInputChannels;
++- int maxOutputChannels;
++- /* Number of discrete rates, or -1 if range supported. */
++- int numSampleRates;
++- /* Array of supported sample rates, or {min,max} if range supported. */
++- const double *sampleRates;
++- PaSampleFormat nativeSampleFormats;
++-}
++-PaDeviceInfo;
++-
++-/*
++- Pa_GetDefaultInputDeviceID(), Pa_GetDefaultOutputDeviceID() return the
++- default device ids for input and output respectively, or paNoDevice if
++- no device is available.
++- The result can be passed to Pa_OpenStream().
++-
++- On the PC, the user can specify a default device by
++- setting an environment variable. For example, to use device #1.
++-
++- set PA_RECOMMENDED_OUTPUT_DEVICE=1
++-
++- The user should first determine the available device ids by using
++- the supplied application "pa_devs".
++-
++-*/
++-
++-PaDeviceID Pa_GetDefaultInputDeviceID( void );
++-PaDeviceID Pa_GetDefaultOutputDeviceID( void );
++-
++-
++-
++-/*
++- Pa_GetDeviceInfo() returns a pointer to an immutable PaDeviceInfo structure
++- for the device specified.
++- If the device parameter is out of range the function returns NULL.
++-
++- PortAudio manages the memory referenced by the returned pointer, the client
++- must not manipulate or free the memory. The pointer is only guaranteed to be
++- valid between calls to Pa_Initialize() and Pa_Terminate().
++-
++-*/
++-
++-const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceID device );
++-
++-/*
++- PaTimestamp is used to represent a continuous sample clock with arbitrary
++- start time that can be used for syncronization. The type is used for the
++- outTime argument to the PortAudioCallback and as the result of Pa_StreamTime()
++-
++-*/
++-
++-typedef double PaTimestamp;
++-
++-/*
++- PortAudioCallback is implemented by PortAudio clients.
++-
++- inputBuffer and outputBuffer are arrays of interleaved samples,
++- the format, packing and number of channels used by the buffers are
++- determined by parameters to Pa_OpenStream() (see below).
++-
++- framesPerBuffer is the number of sample frames to be processed by the callback.
++-
++- outTime is the time in samples when the buffer(s) processed by
++- this callback will begin being played at the audio output.
++- See also Pa_StreamTime()
++-
++- userData is the value of a user supplied pointer passed to Pa_OpenStream()
++- intended for storing synthesis data etc.
++-
++- return value:
++- The callback can return a non-zero value to stop the stream. This may be
++- useful in applications such as soundfile players where a specific duration
++- of output is required. However, it is not necessary to utilise this mechanism
++- as StopStream() will also terminate the stream. A callback returning a
++- non-zero value must fill the entire outputBuffer.
++-
++- NOTE: None of the other stream functions may be called from within the
++- callback function except for Pa_GetCPULoad().
++-
++-*/
++-
++-typedef int (PortAudioCallback)(
++- void *inputBuffer, void *outputBuffer,
++- unsigned long framesPerBuffer,
++- PaTimestamp outTime, void *userData );
++-
++-
++-/*
++- Stream flags
++-
++- These flags may be supplied (ored together) in the streamFlags argument to
++- the Pa_OpenStream() function.
++-
++-*/
++-
++-#define paNoFlag (0)
++-#define paClipOff (1<<0) /* disable default clipping of out of range samples */
++-#define paDitherOff (1<<1) /* disable default dithering */
++-#define paPlatformSpecificFlags (0x00010000)
++-typedef unsigned long PaStreamFlags;
++-
++-/*
++- A single PortAudioStream provides multiple channels of real-time
++- input and output audio streaming to a client application.
++- Pointers to PortAudioStream objects are passed between PortAudio functions.
++-*/
++-
++-typedef void PortAudioStream;
++-#define PaStream PortAudioStream
++-
++-/*
++- Pa_OpenStream() opens a stream for either input, output or both.
++-
++- stream is the address of a PortAudioStream pointer which will receive
++- a pointer to the newly opened stream.
++-
++- inputDevice is the id of the device used for input (see PaDeviceID above.)
++- inputDevice may be paNoDevice to indicate that an input device is not required.
++-
++- numInputChannels is the number of channels of sound to be delivered to the
++- callback. It can range from 1 to the value of maxInputChannels in the
++- PaDeviceInfo record for the device specified by the inputDevice parameter.
++- If inputDevice is paNoDevice numInputChannels is ignored.
++-
++- inputSampleFormat is the sample format of inputBuffer provided to the callback
++- function. inputSampleFormat may be any of the formats described by the
++- PaSampleFormat enumeration (see above). PortAudio guarantees support for
++- the device's native formats (nativeSampleFormats in the device info record)
++- and additionally 16 and 32 bit integer and 32 bit floating point formats.
++- Support for other formats is implementation defined.
++-
++- inputDriverInfo is a pointer to an optional driver specific data structure
++- containing additional information for device setup or stream processing.
++- inputDriverInfo is never required for correct operation. If not used
++- inputDriverInfo should be NULL.
++-
++- outputDevice is the id of the device used for output (see PaDeviceID above.)
++- outputDevice may be paNoDevice to indicate that an output device is not required.
++-
++- numOutputChannels is the number of channels of sound to be supplied by the
++- callback. See the definition of numInputChannels above for more details.
++-
++- outputSampleFormat is the sample format of the outputBuffer filled by the
++- callback function. See the definition of inputSampleFormat above for more
++- details.
++-
++- outputDriverInfo is a pointer to an optional driver specific data structure
++- containing additional information for device setup or stream processing.
++- outputDriverInfo is never required for correct operation. If not used
++- outputDriverInfo should be NULL.
++-
++- sampleRate is the desired sampleRate. For full-duplex streams it is the
++- sample rate for both input and output
++-
++- framesPerBuffer is the length in sample frames of all internal sample buffers
++- used for communication with platform specific audio routines. Wherever
++- possible this corresponds to the framesPerBuffer parameter passed to the
++- callback function.
++-
++- numberOfBuffers is the number of buffers used for multibuffered communication
++- with the platform specific audio routines. If you pass zero, then an optimum
++- value will be chosen for you internally. This parameter is provided only
++- as a guide - and does not imply that an implementation must use multibuffered
++- i/o when reliable double buffering is available (such as SndPlayDoubleBuffer()
++- on the Macintosh.)
++-
++- streamFlags may contain a combination of flags ORed together.
++- These flags modify the behaviour of the streaming process. Some flags may only
++- be relevant to certain buffer formats.
++-
++- callback is a pointer to a client supplied function that is responsible
++- for processing and filling input and output buffers (see above for details.)
++-
++- userData is a client supplied pointer which is passed to the callback
++- function. It could for example, contain a pointer to instance data necessary
++- for processing the audio buffers.
++-
++- return value:
++- Upon success Pa_OpenStream() returns PaNoError and places a pointer to a
++- valid PortAudioStream in the stream argument. The stream is inactive (stopped).
++- If a call to Pa_OpenStream() fails a non-zero error code is returned (see
++- PaError above) and the value of stream is invalid.
++-
++-*/
++-
++-PaError Pa_OpenStream( PortAudioStream** stream,
++- PaDeviceID inputDevice,
++- int numInputChannels,
++- PaSampleFormat inputSampleFormat,
++- void *inputDriverInfo,
++- PaDeviceID outputDevice,
++- int numOutputChannels,
++- PaSampleFormat outputSampleFormat,
++- void *outputDriverInfo,
++- double sampleRate,
++- unsigned long framesPerBuffer,
++- unsigned long numberOfBuffers,
++- PaStreamFlags streamFlags,
++- PortAudioCallback *callback,
++- void *userData );
++-
++-
++-/*
++- Pa_OpenDefaultStream() is a simplified version of Pa_OpenStream() that opens
++- the default input and/or output devices. Most parameters have identical meaning
++- to their Pa_OpenStream() counterparts, with the following exceptions:
++-
++- If either numInputChannels or numOutputChannels is 0 the respective device
++- is not opened. This has the same effect as passing paNoDevice in the device
++- arguments to Pa_OpenStream().
++-
++- sampleFormat applies to both the input and output buffers.
++-
++-*/
++-
++-PaError Pa_OpenDefaultStream( PortAudioStream** stream,
++- int numInputChannels,
++- int numOutputChannels,
++- PaSampleFormat sampleFormat,
++- double sampleRate,
++- unsigned long framesPerBuffer,
++- unsigned long numberOfBuffers,
++- PortAudioCallback *callback,
++- void *userData );
++-
++-/*
++- Pa_CloseStream() closes an audio stream, flushing any pending buffers.
++-
++-*/
++-
++-PaError Pa_CloseStream( PortAudioStream* );
++-
++-/*
++- Pa_StartStream() and Pa_StopStream() begin and terminate audio processing.
++- Pa_StopStream() waits until all pending audio buffers have been played.
++- Pa_AbortStream() stops playing immediately without waiting for pending
++- buffers to complete.
++-
++-*/
++-
++-PaError Pa_StartStream( PortAudioStream *stream );
++-
++-PaError Pa_StopStream( PortAudioStream *stream );
++-
++-PaError Pa_AbortStream( PortAudioStream *stream );
++-
++-/*
++- Pa_StreamActive() returns one (1) when the stream is active (ie playing
++- or recording audio), zero (0) when not playing, or a negative error number
++- if the stream is invalid.
++- The stream is active between calls to Pa_StartStream() and Pa_StopStream(),
++- but may also become inactive if the callback returns a non-zero value.
++- In the latter case, the stream is considered inactive after the last
++- buffer has finished playing.
++-
++-*/
++-
++-PaError Pa_StreamActive( PortAudioStream *stream );
++-
++-/*
++- Pa_StreamTime() returns the current output time in samples for the stream.
++- This time may be used as a time reference (for example synchronizing audio to
++- MIDI).
++-
++-*/
++-
++-PaTimestamp Pa_StreamTime( PortAudioStream *stream );
++-
++-/*
++- Pa_GetCPULoad() returns the CPU Load for the stream.
++- The "CPU Load" is a fraction of total CPU time consumed by the stream's
++- audio processing routines including, but not limited to the client supplied
++- callback.
++- A value of 0.5 would imply that PortAudio and the sound generating
++- callback was consuming roughly 50% of the available CPU time.
++- This function may be called from the callback function or the application.
++-
++-*/
++-
++-double Pa_GetCPULoad( PortAudioStream* stream );
++-
++-/*
++- Pa_GetMinNumBuffers() returns the minimum number of buffers required by
++- the current host based on minimum latency.
++- On the PC, for the DirectSound implementation, latency can be optionally set
++- by user by setting an environment variable.
++- For example, to set latency to 200 msec, put:
++-
++- set PA_MIN_LATENCY_MSEC=200
++-
++- in the AUTOEXEC.BAT file and reboot.
++- If the environment variable is not set, then the latency will be determined
++- based on the OS. Windows NT has higher latency than Win95.
++-
++-*/
++-
++-int Pa_GetMinNumBuffers( int framesPerBuffer, double sampleRate );
++-
++-/*
++- Pa_Sleep() puts the caller to sleep for at least 'msec' milliseconds.
++- You may sleep longer than the requested time so don't rely on this for
++- accurate musical timing.
++-
++- Pa_Sleep() is provided as a convenience for authors of portable code (such as
++- the tests and examples in the PortAudio distribution.)
++-
++-*/
++-
++-void Pa_Sleep( long msec );
++-
++-/*
++- Pa_GetSampleSize() returns the size in bytes of a single sample in the
++- supplied PaSampleFormat, or paSampleFormatNotSupported if the format is
++- no supported.
++-
++-*/
++-
++-PaError Pa_GetSampleSize( PaSampleFormat format );
++-
++-
++-#ifdef __cplusplus
++-}
++-#endif /* __cplusplus */
++-#endif /* PORT_AUDIO_H */
++--- a/src/portaudio18.h
+++++ /dev/null
++@@ -1,466 +0,0 @@
++-// NOTE: Copy this file to portaudio.h in order to compile with V18 portaudio
++-
++-
++-#ifndef PORT_AUDIO_H
++-#define PORT_AUDIO_H
++-
++-#ifdef __cplusplus
++-extern "C"
++-{
++-#endif /* __cplusplus */
++-
++-/*
++- * $Id: portaudio.h,v 1.5 2002/03/26 18:04:22 philburk Exp $
++- * PortAudio Portable Real-Time Audio Library
++- * PortAudio API Header File
++- * Latest version available at: http://www.audiomulch.com/portaudio/
++- *
++- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
++- *
++- * 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:
++- *
++- * The above copyright notice and this permission notice shall be
++- * included in all copies or substantial portions of the Software.
++- *
++- * Any person wishing to distribute modifications to the Software is
++- * requested to send the modifications to the original developer so that
++- * they can be incorporated into the canonical version.
++- *
++- * 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.
++- *
++- */
++-
++-typedef int PaError;
++-typedef enum {
++- paNoError = 0,
++-
++- paHostError = -10000,
++- paInvalidChannelCount,
++- paInvalidSampleRate,
++- paInvalidDeviceId,
++- paInvalidFlag,
++- paSampleFormatNotSupported,
++- paBadIODeviceCombination,
++- paInsufficientMemory,
++- paBufferTooBig,
++- paBufferTooSmall,
++- paNullCallback,
++- paBadStreamPtr,
++- paTimedOut,
++- paInternalError,
++- paDeviceUnavailable
++-} PaErrorNum;
++-
++-/*
++- Pa_Initialize() is the library initialisation function - call this before
++- using the library.
++-
++-*/
++-
++-PaError Pa_Initialize( void );
++-
++-/*
++- Pa_Terminate() is the library termination function - call this after
++- using the library.
++-
++-*/
++-
++-PaError Pa_Terminate( void );
++-
++-/*
++- Pa_GetHostError() returns a host specific error code.
++- This can be called after receiving a PortAudio error code of paHostError.
++-
++-*/
++-
++-long Pa_GetHostError( void );
++-
++-/*
++- Pa_GetErrorText() translates the supplied PortAudio error number
++- into a human readable message.
++-
++-*/
++-
++-const char *Pa_GetErrorText( PaError errnum );
++-
++-/*
++- Sample formats
++-
++- These are formats used to pass sound data between the callback and the
++- stream. Each device has a "native" format which may be used when optimum
++- efficiency or control over conversion is required.
++-
++- Formats marked "always available" are supported (emulated) by all
++- PortAudio implementations.
++-
++- The floating point representation (paFloat32) uses +1.0 and -1.0 as the
++- maximum and minimum respectively.
++-
++- paUInt8 is an unsigned 8 bit format where 128 is considered "ground"
++-
++-*/
++-
++-typedef unsigned long PaSampleFormat;
++-#define paFloat32 ((PaSampleFormat) (1<<0)) /*always available*/
++-#define paInt16 ((PaSampleFormat) (1<<1)) /*always available*/
++-#define paInt32 ((PaSampleFormat) (1<<2)) /*always available*/
++-#define paInt24 ((PaSampleFormat) (1<<3))
++-#define paPackedInt24 ((PaSampleFormat) (1<<4))
++-#define paInt8 ((PaSampleFormat) (1<<5))
++-#define paUInt8 ((PaSampleFormat) (1<<6))
++-#define paCustomFormat ((PaSampleFormat) (1<<16))
++-
++-/*
++- Device enumeration mechanism.
++-
++- Device ids range from 0 to Pa_CountDevices()-1.
++-
++- Devices may support input, output or both.
++-
++-*/
++-
++-typedef int PaDeviceID;
++-#define paNoDevice -1
++-
++-int Pa_CountDevices( void );
++-
++-typedef struct
++-{
++- int structVersion;
++- const char *name;
++- int maxInputChannels;
++- int maxOutputChannels;
++- /* Number of discrete rates, or -1 if range supported. */
++- int numSampleRates;
++- /* Array of supported sample rates, or {min,max} if range supported. */
++- const double *sampleRates;
++- PaSampleFormat nativeSampleFormats;
++-}
++-PaDeviceInfo;
++-
++-/*
++- Pa_GetDefaultInputDeviceID(), Pa_GetDefaultOutputDeviceID() return the
++- default device ids for input and output respectively, or paNoDevice if
++- no device is available.
++- The result can be passed to Pa_OpenStream().
++-
++- On the PC, the user can specify a default device by
++- setting an environment variable. For example, to use device #1.
++-
++- set PA_RECOMMENDED_OUTPUT_DEVICE=1
++-
++- The user should first determine the available device ids by using
++- the supplied application "pa_devs".
++-
++-*/
++-
++-PaDeviceID Pa_GetDefaultInputDeviceID( void );
++-PaDeviceID Pa_GetDefaultOutputDeviceID( void );
++-
++-
++-
++-/*
++- Pa_GetDeviceInfo() returns a pointer to an immutable PaDeviceInfo structure
++- for the device specified.
++- If the device parameter is out of range the function returns NULL.
++-
++- PortAudio manages the memory referenced by the returned pointer, the client
++- must not manipulate or free the memory. The pointer is only guaranteed to be
++- valid between calls to Pa_Initialize() and Pa_Terminate().
++-
++-*/
++-
++-const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceID device );
++-
++-/*
++- PaTimestamp is used to represent a continuous sample clock with arbitrary
++- start time that can be used for syncronization. The type is used for the
++- outTime argument to the PortAudioCallback and as the result of Pa_StreamTime()
++-
++-*/
++-
++-typedef double PaTimestamp;
++-
++-/*
++- PortAudioCallback is implemented by PortAudio clients.
++-
++- inputBuffer and outputBuffer are arrays of interleaved samples,
++- the format, packing and number of channels used by the buffers are
++- determined by parameters to Pa_OpenStream() (see below).
++-
++- framesPerBuffer is the number of sample frames to be processed by the callback.
++-
++- outTime is the time in samples when the buffer(s) processed by
++- this callback will begin being played at the audio output.
++- See also Pa_StreamTime()
++-
++- userData is the value of a user supplied pointer passed to Pa_OpenStream()
++- intended for storing synthesis data etc.
++-
++- return value:
++- The callback can return a non-zero value to stop the stream. This may be
++- useful in applications such as soundfile players where a specific duration
++- of output is required. However, it is not necessary to utilise this mechanism
++- as StopStream() will also terminate the stream. A callback returning a
++- non-zero value must fill the entire outputBuffer.
++-
++- NOTE: None of the other stream functions may be called from within the
++- callback function except for Pa_GetCPULoad().
++-
++-*/
++-
++-typedef int (PortAudioCallback)(
++- void *inputBuffer, void *outputBuffer,
++- unsigned long framesPerBuffer,
++- PaTimestamp outTime, void *userData );
++-
++-
++-/*
++- Stream flags
++-
++- These flags may be supplied (ored together) in the streamFlags argument to
++- the Pa_OpenStream() function.
++-
++-*/
++-
++-#define paNoFlag (0)
++-#define paClipOff (1<<0) /* disable default clipping of out of range samples */
++-#define paDitherOff (1<<1) /* disable default dithering */
++-#define paPlatformSpecificFlags (0x00010000)
++-typedef unsigned long PaStreamFlags;
++-
++-/*
++- A single PortAudioStream provides multiple channels of real-time
++- input and output audio streaming to a client application.
++- Pointers to PortAudioStream objects are passed between PortAudio functions.
++-*/
++-
++-typedef void PortAudioStream;
++-#define PaStream PortAudioStream
++-
++-/*
++- Pa_OpenStream() opens a stream for either input, output or both.
++-
++- stream is the address of a PortAudioStream pointer which will receive
++- a pointer to the newly opened stream.
++-
++- inputDevice is the id of the device used for input (see PaDeviceID above.)
++- inputDevice may be paNoDevice to indicate that an input device is not required.
++-
++- numInputChannels is the number of channels of sound to be delivered to the
++- callback. It can range from 1 to the value of maxInputChannels in the
++- PaDeviceInfo record for the device specified by the inputDevice parameter.
++- If inputDevice is paNoDevice numInputChannels is ignored.
++-
++- inputSampleFormat is the sample format of inputBuffer provided to the callback
++- function. inputSampleFormat may be any of the formats described by the
++- PaSampleFormat enumeration (see above). PortAudio guarantees support for
++- the device's native formats (nativeSampleFormats in the device info record)
++- and additionally 16 and 32 bit integer and 32 bit floating point formats.
++- Support for other formats is implementation defined.
++-
++- inputDriverInfo is a pointer to an optional driver specific data structure
++- containing additional information for device setup or stream processing.
++- inputDriverInfo is never required for correct operation. If not used
++- inputDriverInfo should be NULL.
++-
++- outputDevice is the id of the device used for output (see PaDeviceID above.)
++- outputDevice may be paNoDevice to indicate that an output device is not required.
++-
++- numOutputChannels is the number of channels of sound to be supplied by the
++- callback. See the definition of numInputChannels above for more details.
++-
++- outputSampleFormat is the sample format of the outputBuffer filled by the
++- callback function. See the definition of inputSampleFormat above for more
++- details.
++-
++- outputDriverInfo is a pointer to an optional driver specific data structure
++- containing additional information for device setup or stream processing.
++- outputDriverInfo is never required for correct operation. If not used
++- outputDriverInfo should be NULL.
++-
++- sampleRate is the desired sampleRate. For full-duplex streams it is the
++- sample rate for both input and output
++-
++- framesPerBuffer is the length in sample frames of all internal sample buffers
++- used for communication with platform specific audio routines. Wherever
++- possible this corresponds to the framesPerBuffer parameter passed to the
++- callback function.
++-
++- numberOfBuffers is the number of buffers used for multibuffered communication
++- with the platform specific audio routines. If you pass zero, then an optimum
++- value will be chosen for you internally. This parameter is provided only
++- as a guide - and does not imply that an implementation must use multibuffered
++- i/o when reliable double buffering is available (such as SndPlayDoubleBuffer()
++- on the Macintosh.)
++-
++- streamFlags may contain a combination of flags ORed together.
++- These flags modify the behaviour of the streaming process. Some flags may only
++- be relevant to certain buffer formats.
++-
++- callback is a pointer to a client supplied function that is responsible
++- for processing and filling input and output buffers (see above for details.)
++-
++- userData is a client supplied pointer which is passed to the callback
++- function. It could for example, contain a pointer to instance data necessary
++- for processing the audio buffers.
++-
++- return value:
++- Upon success Pa_OpenStream() returns PaNoError and places a pointer to a
++- valid PortAudioStream in the stream argument. The stream is inactive (stopped).
++- If a call to Pa_OpenStream() fails a non-zero error code is returned (see
++- PaError above) and the value of stream is invalid.
++-
++-*/
++-
++-PaError Pa_OpenStream( PortAudioStream** stream,
++- PaDeviceID inputDevice,
++- int numInputChannels,
++- PaSampleFormat inputSampleFormat,
++- void *inputDriverInfo,
++- PaDeviceID outputDevice,
++- int numOutputChannels,
++- PaSampleFormat outputSampleFormat,
++- void *outputDriverInfo,
++- double sampleRate,
++- unsigned long framesPerBuffer,
++- unsigned long numberOfBuffers,
++- PaStreamFlags streamFlags,
++- PortAudioCallback *callback,
++- void *userData );
++-
++-
++-/*
++- Pa_OpenDefaultStream() is a simplified version of Pa_OpenStream() that opens
++- the default input and/or output devices. Most parameters have identical meaning
++- to their Pa_OpenStream() counterparts, with the following exceptions:
++-
++- If either numInputChannels or numOutputChannels is 0 the respective device
++- is not opened. This has the same effect as passing paNoDevice in the device
++- arguments to Pa_OpenStream().
++-
++- sampleFormat applies to both the input and output buffers.
++-
++-*/
++-
++-PaError Pa_OpenDefaultStream( PortAudioStream** stream,
++- int numInputChannels,
++- int numOutputChannels,
++- PaSampleFormat sampleFormat,
++- double sampleRate,
++- unsigned long framesPerBuffer,
++- unsigned long numberOfBuffers,
++- PortAudioCallback *callback,
++- void *userData );
++-
++-/*
++- Pa_CloseStream() closes an audio stream, flushing any pending buffers.
++-
++-*/
++-
++-PaError Pa_CloseStream( PortAudioStream* );
++-
++-/*
++- Pa_StartStream() and Pa_StopStream() begin and terminate audio processing.
++- Pa_StopStream() waits until all pending audio buffers have been played.
++- Pa_AbortStream() stops playing immediately without waiting for pending
++- buffers to complete.
++-
++-*/
++-
++-PaError Pa_StartStream( PortAudioStream *stream );
++-
++-PaError Pa_StopStream( PortAudioStream *stream );
++-
++-PaError Pa_AbortStream( PortAudioStream *stream );
++-
++-/*
++- Pa_StreamActive() returns one (1) when the stream is active (ie playing
++- or recording audio), zero (0) when not playing, or a negative error number
++- if the stream is invalid.
++- The stream is active between calls to Pa_StartStream() and Pa_StopStream(),
++- but may also become inactive if the callback returns a non-zero value.
++- In the latter case, the stream is considered inactive after the last
++- buffer has finished playing.
++-
++-*/
++-
++-PaError Pa_StreamActive( PortAudioStream *stream );
++-
++-/*
++- Pa_StreamTime() returns the current output time in samples for the stream.
++- This time may be used as a time reference (for example synchronizing audio to
++- MIDI).
++-
++-*/
++-
++-PaTimestamp Pa_StreamTime( PortAudioStream *stream );
++-
++-/*
++- Pa_GetCPULoad() returns the CPU Load for the stream.
++- The "CPU Load" is a fraction of total CPU time consumed by the stream's
++- audio processing routines including, but not limited to the client supplied
++- callback.
++- A value of 0.5 would imply that PortAudio and the sound generating
++- callback was consuming roughly 50% of the available CPU time.
++- This function may be called from the callback function or the application.
++-
++-*/
++-
++-double Pa_GetCPULoad( PortAudioStream* stream );
++-
++-/*
++- Pa_GetMinNumBuffers() returns the minimum number of buffers required by
++- the current host based on minimum latency.
++- On the PC, for the DirectSound implementation, latency can be optionally set
++- by user by setting an environment variable.
++- For example, to set latency to 200 msec, put:
++-
++- set PA_MIN_LATENCY_MSEC=200
++-
++- in the AUTOEXEC.BAT file and reboot.
++- If the environment variable is not set, then the latency will be determined
++- based on the OS. Windows NT has higher latency than Win95.
++-
++-*/
++-
++-int Pa_GetMinNumBuffers( int framesPerBuffer, double sampleRate );
++-
++-/*
++- Pa_Sleep() puts the caller to sleep for at least 'msec' milliseconds.
++- You may sleep longer than the requested time so don't rely on this for
++- accurate musical timing.
++-
++- Pa_Sleep() is provided as a convenience for authors of portable code (such as
++- the tests and examples in the PortAudio distribution.)
++-
++-*/
++-
++-void Pa_Sleep( long msec );
++-
++-/*
++- Pa_GetSampleSize() returns the size in bytes of a single sample in the
++- supplied PaSampleFormat, or paSampleFormatNotSupported if the format is
++- no supported.
++-
++-*/
++-
++-PaError Pa_GetSampleSize( PaSampleFormat format );
++-
++-
++-#ifdef __cplusplus
++-}
++-#endif /* __cplusplus */
++-#endif /* PORT_AUDIO_H */
++--- a/src/portaudio19.h
+++++ /dev/null
++@@ -1,1127 +0,0 @@
++-// NOTE: Copy this file to portaudio.h in order to compile with V19 portaudio
++-
++-#ifndef PORTAUDIO_H
++-#define PORTAUDIO_H
++-/*
++- * $Id: portaudio.h 1061 2006-06-19 22:46:41Z lschwardt $
++- * PortAudio Portable Real-Time Audio Library
++- * PortAudio API Header File
++- * Latest version available at: http://www.portaudio.com/
++- *
++- * Copyright (c) 1999-2002 Ross Bencina and Phil Burk
++- *
++- * 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:
++- *
++- * The above copyright notice and this permission notice shall be
++- * included in all copies or substantial portions of the Software.
++- *
++- * Any person wishing to distribute modifications to the Software is
++- * requested to send the modifications to the original developer so that
++- * they can be incorporated into the canonical version.
++- *
++- * 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.
++- */
++-
++-/** @file
++- @brief The PortAudio API.
++-*/
++-
++-
++-#ifdef __cplusplus
++-extern "C"
++-{
++-#endif /* __cplusplus */
++-
++-
++-/** Retrieve the release number of the currently running PortAudio build,
++- eg 1900.
++-*/
++-int Pa_GetVersion( void );
++-
++-
++-/** Retrieve a textual description of the current PortAudio build,
++- eg "PortAudio V19-devel 13 October 2002".
++-*/
++-const char* Pa_GetVersionText( void );
++-
++-
++-/** Error codes returned by PortAudio functions.
++- Note that with the exception of paNoError, all PaErrorCodes are negative.
++-*/
++-
++-typedef int PaError;
++-typedef enum PaErrorCode
++-{
++- paNoError = 0,
++-
++- paNotInitialized = -10000,
++- paUnanticipatedHostError,
++- paInvalidChannelCount,
++- paInvalidSampleRate,
++- paInvalidDevice,
++- paInvalidFlag,
++- paSampleFormatNotSupported,
++- paBadIODeviceCombination,
++- paInsufficientMemory,
++- paBufferTooBig,
++- paBufferTooSmall,
++- paNullCallback,
++- paBadStreamPtr,
++- paTimedOut,
++- paInternalError,
++- paDeviceUnavailable,
++- paIncompatibleHostApiSpecificStreamInfo,
++- paStreamIsStopped,
++- paStreamIsNotStopped,
++- paInputOverflowed,
++- paOutputUnderflowed,
++- paHostApiNotFound,
++- paInvalidHostApi,
++- paCanNotReadFromACallbackStream, /**< @todo review error code name */
++- paCanNotWriteToACallbackStream, /**< @todo review error code name */
++- paCanNotReadFromAnOutputOnlyStream, /**< @todo review error code name */
++- paCanNotWriteToAnInputOnlyStream, /**< @todo review error code name */
++- paIncompatibleStreamHostApi,
++- paBadBufferPtr
++-} PaErrorCode;
++-
++-
++-/** Translate the supplied PortAudio error code into a human readable
++- message.
++-*/
++-const char *Pa_GetErrorText( PaError errorCode );
++-
++-
++-/** Library initialization function - call this before using PortAudio.
++- This function initialises internal data structures and prepares underlying
++- host APIs for use. This function MUST be called before using any other
++- PortAudio API functions.
++-
++- If Pa_Initialize() is called multiple times, each successful
++- call must be matched with a corresponding call to Pa_Terminate().
++- Pairs of calls to Pa_Initialize()/Pa_Terminate() may overlap, and are not
++- required to be fully nested.
++-
++- Note that if Pa_Initialize() returns an error code, Pa_Terminate() should
++- NOT be called.
++-
++- @return paNoError if successful, otherwise an error code indicating the cause
++- of failure.
++-
++- @see Pa_Terminate
++-*/
++-PaError Pa_Initialize( void );
++-
++-
++-/** Library termination function - call this when finished using PortAudio.
++- This function deallocates all resources allocated by PortAudio since it was
++- initializied by a call to Pa_Initialize(). In cases where Pa_Initialise() has
++- been called multiple times, each call must be matched with a corresponding call
++- to Pa_Terminate(). The final matching call to Pa_Terminate() will automatically
++- close any PortAudio streams that are still open.
++-
++- Pa_Terminate() MUST be called before exiting a program which uses PortAudio.
++- Failure to do so may result in serious resource leaks, such as audio devices
++- not being available until the next reboot.
++-
++- @return paNoError if successful, otherwise an error code indicating the cause
++- of failure.
++-
++- @see Pa_Initialize
++-*/
++-PaError Pa_Terminate( void );
++-
++-
++-
++-/** The type used to refer to audio devices. Values of this type usually
++- range from 0 to (Pa_DeviceCount-1), and may also take on the PaNoDevice
++- and paUseHostApiSpecificDeviceSpecification values.
++-
++- @see Pa_DeviceCount, paNoDevice, paUseHostApiSpecificDeviceSpecification
++-*/
++-typedef int PaDeviceIndex;
++-
++-
++-/** A special PaDeviceIndex value indicating that no device is available,
++- or should be used.
++-
++- @see PaDeviceIndex
++-*/
++-#define paNoDevice ((PaDeviceIndex)-1)
++-
++-
++-/** A special PaDeviceIndex value indicating that the device(s) to be used
++- are specified in the host api specific stream info structure.
++-
++- @see PaDeviceIndex
++-*/
++-#define paUseHostApiSpecificDeviceSpecification ((PaDeviceIndex)-2)
++-
++-
++-/* Host API enumeration mechanism */
++-
++-/** The type used to enumerate to host APIs at runtime. Values of this type
++- range from 0 to (Pa_GetHostApiCount()-1).
++-
++- @see Pa_GetHostApiCount
++-*/
++-typedef int PaHostApiIndex;
++-
++-
++-/** Retrieve the number of available host APIs. Even if a host API is
++- available it may have no devices available.
++-
++- @return A non-negative value indicating the number of available host APIs
++- or, a PaErrorCode (which are always negative) if PortAudio is not initialized
++- or an error is encountered.
++-
++- @see PaHostApiIndex
++-*/
++-PaHostApiIndex Pa_GetHostApiCount( void );
++-
++-
++-/** Retrieve the index of the default host API. The default host API will be
++- the lowest common denominator host API on the current platform and is
++- unlikely to provide the best performance.
++-
++- @return A non-negative value ranging from 0 to (Pa_GetHostApiCount()-1)
++- indicating the default host API index or, a PaErrorCode (which are always
++- negative) if PortAudio is not initialized or an error is encountered.
++-*/
++-PaHostApiIndex Pa_GetDefaultHostApi( void );
++-
++-
++-/** Unchanging unique identifiers for each supported host API. This type
++- is used in the PaHostApiInfo structure. The values are guaranteed to be
++- unique and to never change, thus allowing code to be written that
++- conditionally uses host API specific extensions.
++-
++- New type ids will be allocated when support for a host API reaches
++- "public alpha" status, prior to that developers should use the
++- paInDevelopment type id.
++-
++- @see PaHostApiInfo
++-*/
++-typedef enum PaHostApiTypeId
++-{
++- paInDevelopment=0, /* use while developing support for a new host API */
++- paDirectSound=1,
++- paMME=2,
++- paASIO=3,
++- paSoundManager=4,
++- paCoreAudio=5,
++- paOSS=7,
++- paALSA=8,
++- paAL=9,
++- paBeOS=10,
++- paWDMKS=11,
++- paJACK=12,
++- paWASAPI=13,
++- paAudioScienceHPI=14
++-} PaHostApiTypeId;
++-
++-
++-/** A structure containing information about a particular host API. */
++-
++-typedef struct PaHostApiInfo
++-{
++- /** this is struct version 1 */
++- int structVersion;
++- /** The well known unique identifier of this host API @see PaHostApiTypeId */
++- PaHostApiTypeId type;
++- /** A textual description of the host API for display on user interfaces. */
++- const char *name;
++-
++- /** The number of devices belonging to this host API. This field may be
++- used in conjunction with Pa_HostApiDeviceIndexToDeviceIndex() to enumerate
++- all devices for this host API.
++- @see Pa_HostApiDeviceIndexToDeviceIndex
++- */
++- int deviceCount;
++-
++- /** The default input device for this host API. The value will be a
++- device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice
++- if no default input device is available.
++- */
++- PaDeviceIndex defaultInputDevice;
++-
++- /** The default output device for this host API. The value will be a
++- device index ranging from 0 to (Pa_GetDeviceCount()-1), or paNoDevice
++- if no default output device is available.
++- */
++- PaDeviceIndex defaultOutputDevice;
++-
++-} PaHostApiInfo;
++-
++-
++-/** Retrieve a pointer to a structure containing information about a specific
++- host Api.
++-
++- @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1)
++-
++- @return A pointer to an immutable PaHostApiInfo structure describing
++- a specific host API. If the hostApi parameter is out of range or an error
++- is encountered, the function returns NULL.
++-
++- The returned structure is owned by the PortAudio implementation and must not
++- be manipulated or freed. The pointer is only guaranteed to be valid between
++- calls to Pa_Initialize() and Pa_Terminate().
++-*/
++-const PaHostApiInfo * Pa_GetHostApiInfo( PaHostApiIndex hostApi );
++-
++-
++-/** Convert a static host API unique identifier, into a runtime
++- host API index.
++-
++- @param type A unique host API identifier belonging to the PaHostApiTypeId
++- enumeration.
++-
++- @return A valid PaHostApiIndex ranging from 0 to (Pa_GetHostApiCount()-1) or,
++- a PaErrorCode (which are always negative) if PortAudio is not initialized
++- or an error is encountered.
++-
++- The paHostApiNotFound error code indicates that the host API specified by the
++- type parameter is not available.
++-
++- @see PaHostApiTypeId
++-*/
++-PaHostApiIndex Pa_HostApiTypeIdToHostApiIndex( PaHostApiTypeId type );
++-
++-
++-/** Convert a host-API-specific device index to standard PortAudio device index.
++- This function may be used in conjunction with the deviceCount field of
++- PaHostApiInfo to enumerate all devices for the specified host API.
++-
++- @param hostApi A valid host API index ranging from 0 to (Pa_GetHostApiCount()-1)
++-
++- @param hostApiDeviceIndex A valid per-host device index in the range
++- 0 to (Pa_GetHostApiInfo(hostApi)->deviceCount-1)
++-
++- @return A non-negative PaDeviceIndex ranging from 0 to (Pa_GetDeviceCount()-1)
++- or, a PaErrorCode (which are always negative) if PortAudio is not initialized
++- or an error is encountered.
++-
++- A paInvalidHostApi error code indicates that the host API index specified by
++- the hostApi parameter is out of range.
++-
++- A paInvalidDevice error code indicates that the hostApiDeviceIndex parameter
++- is out of range.
++-
++- @see PaHostApiInfo
++-*/
++-PaDeviceIndex Pa_HostApiDeviceIndexToDeviceIndex( PaHostApiIndex hostApi,
++- int hostApiDeviceIndex );
++-
++-
++-
++-/** Structure used to return information about a host error condition.
++-*/
++-typedef struct PaHostErrorInfo{
++- PaHostApiTypeId hostApiType; /**< the host API which returned the error code */
++- long errorCode; /**< the error code returned */
++- const char *errorText; /**< a textual description of the error if available, otherwise a zero-length string */
++-}PaHostErrorInfo;
++-
++-
++-/** Return information about the last host error encountered. The error
++- information returned by Pa_GetLastHostErrorInfo() will never be modified
++- asyncronously by errors occurring in other PortAudio owned threads
++- (such as the thread that manages the stream callback.)
++-
++- This function is provided as a last resort, primarily to enhance debugging
++- by providing clients with access to all available error information.
++-
++- @return A pointer to an immutable structure constaining information about
++- the host error. The values in this structure will only be valid if a
++- PortAudio function has previously returned the paUnanticipatedHostError
++- error code.
++-*/
++-const PaHostErrorInfo* Pa_GetLastHostErrorInfo( void );
++-
++-
++-
++-/* Device enumeration and capabilities */
++-
++-/** Retrieve the number of available devices. The number of available devices
++- may be zero.
++-
++- @return A non-negative value indicating the number of available devices or,
++- a PaErrorCode (which are always negative) if PortAudio is not initialized
++- or an error is encountered.
++-*/
++-PaDeviceIndex Pa_GetDeviceCount( void );
++-
++-
++-/** Retrieve the index of the default input device. The result can be
++- used in the inputDevice parameter to Pa_OpenStream().
++-
++- @return The default input device index for the default host API, or paNoDevice
++- if no default input device is available or an error was encountered.
++-*/
++-PaDeviceIndex Pa_GetDefaultInputDevice( void );
++-
++-
++-/** Retrieve the index of the default output device. The result can be
++- used in the outputDevice parameter to Pa_OpenStream().
++-
++- @return The default output device index for the defualt host API, or paNoDevice
++- if no default output device is available or an error was encountered.
++-
++- @note
++- On the PC, the user can specify a default device by
++- setting an environment variable. For example, to use device #1.
++-<pre>
++- set PA_RECOMMENDED_OUTPUT_DEVICE=1
++-</pre>
++- The user should first determine the available device ids by using
++- the supplied application "pa_devs".
++-*/
++-PaDeviceIndex Pa_GetDefaultOutputDevice( void );
++-
++-
++-/** The type used to represent monotonic time in seconds that can be used
++- for syncronisation. The type is used for the outTime argument to the
++- PaStreamCallback and as the result of Pa_GetStreamTime().
++-
++- @see PaStreamCallback, Pa_GetStreamTime
++-*/
++-typedef double PaTime;
++-
++-
++-/** A type used to specify one or more sample formats. Each value indicates
++- a possible format for sound data passed to and from the stream callback,
++- Pa_ReadStream and Pa_WriteStream.
++-
++- The standard formats paFloat32, paInt16, paInt32, paInt24, paInt8
++- and aUInt8 are usually implemented by all implementations.
++-
++- The floating point representation (paFloat32) uses +1.0 and -1.0 as the
++- maximum and minimum respectively.
++-
++- paUInt8 is an unsigned 8 bit format where 128 is considered "ground"
++-
++- The paNonInterleaved flag indicates that a multichannel buffer is passed
++- as a set of non-interleaved pointers.
++-
++- @see Pa_OpenStream, Pa_OpenDefaultStream, PaDeviceInfo
++- @see paFloat32, paInt16, paInt32, paInt24, paInt8
++- @see paUInt8, paCustomFormat, paNonInterleaved
++-*/
++-typedef unsigned long PaSampleFormat;
++-
++-
++-#define paFloat32 ((PaSampleFormat) 0x00000001) /**< @see PaSampleFormat */
++-#define paInt32 ((PaSampleFormat) 0x00000002) /**< @see PaSampleFormat */
++-#define paInt24 ((PaSampleFormat) 0x00000004) /**< Packed 24 bit format. @see PaSampleFormat */
++-#define paInt16 ((PaSampleFormat) 0x00000008) /**< @see PaSampleFormat */
++-#define paInt8 ((PaSampleFormat) 0x00000010) /**< @see PaSampleFormat */
++-#define paUInt8 ((PaSampleFormat) 0x00000020) /**< @see PaSampleFormat */
++-#define paCustomFormat ((PaSampleFormat) 0x00010000)/**< @see PaSampleFormat */
++-
++-#define paNonInterleaved ((PaSampleFormat) 0x80000000)
++-
++-/** A structure providing information and capabilities of PortAudio devices.
++- Devices may support input, output or both input and output.
++-*/
++-typedef struct PaDeviceInfo
++-{
++- int structVersion; /* this is struct version 2 */
++- const char *name;
++- PaHostApiIndex hostApi; /* note this is a host API index, not a type id*/
++-
++- int maxInputChannels;
++- int maxOutputChannels;
++-
++- /* Default latency values for interactive performance. */
++- PaTime defaultLowInputLatency;
++- PaTime defaultLowOutputLatency;
++- /* Default latency values for robust non-interactive applications (eg. playing sound files). */
++- PaTime defaultHighInputLatency;
++- PaTime defaultHighOutputLatency;
++-
++- double defaultSampleRate;
++-} PaDeviceInfo;
++-
++-
++-/** Retrieve a pointer to a PaDeviceInfo structure containing information
++- about the specified device.
++- @return A pointer to an immutable PaDeviceInfo structure. If the device
++- parameter is out of range the function returns NULL.
++-
++- @param device A valid device index in the range 0 to (Pa_GetDeviceCount()-1)
++-
++- @note PortAudio manages the memory referenced by the returned pointer,
++- the client must not manipulate or free the memory. The pointer is only
++- guaranteed to be valid between calls to Pa_Initialize() and Pa_Terminate().
++-
++- @see PaDeviceInfo, PaDeviceIndex
++-*/
++-const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceIndex device );
++-
++-
++-/** Parameters for one direction (input or output) of a stream.
++-*/
++-typedef struct PaStreamParameters
++-{
++- /** A valid device index in the range 0 to (Pa_GetDeviceCount()-1)
++- specifying the device to be used or the special constant
++- paUseHostApiSpecificDeviceSpecification which indicates that the actual
++- device(s) to use are specified in hostApiSpecificStreamInfo.
++- This field must not be set to paNoDevice.
++- */
++- PaDeviceIndex device;
++-
++- /** The number of channels of sound to be delivered to the
++- stream callback or accessed by Pa_ReadStream() or Pa_WriteStream().
++- It can range from 1 to the value of maxInputChannels in the
++- PaDeviceInfo record for the device specified by the device parameter.
++- */
++- int channelCount;
++-
++- /** The sample format of the buffer provided to the stream callback,
++- a_ReadStream() or Pa_WriteStream(). It may be any of the formats described
++- by the PaSampleFormat enumeration.
++- */
++- PaSampleFormat sampleFormat;
++-
++- /** The desired latency in seconds. Where practical, implementations should
++- configure their latency based on these parameters, otherwise they may
++- choose the closest viable latency instead. Unless the suggested latency
++- is greater than the absolute upper limit for the device implementations
++- should round the suggestedLatency up to the next practial value - ie to
++- provide an equal or higher latency than suggestedLatency wherever possibe.
++- Actual latency values for an open stream may be retrieved using the
++- inputLatency and outputLatency fields of the PaStreamInfo structure
++- returned by Pa_GetStreamInfo().
++- @see default*Latency in PaDeviceInfo, *Latency in PaStreamInfo
++- */
++- PaTime suggestedLatency;
++-
++- /** An optional pointer to a host api specific data structure
++- containing additional information for device setup and/or stream processing.
++- hostApiSpecificStreamInfo is never required for correct operation,
++- if not used it should be set to NULL.
++- */
++- void *hostApiSpecificStreamInfo;
++-
++-} PaStreamParameters;
++-
++-
++-/** Return code for Pa_IsFormatSupported indicating success. */
++-#define paFormatIsSupported (0)
++-
++-/** Determine whether it would be possible to open a stream with the specified
++- parameters.
++-
++- @param inputParameters A structure that describes the input parameters used to
++- open a stream. The suggestedLatency field is ignored. See PaStreamParameters
++- for a description of these parameters. inputParameters must be NULL for
++- output-only streams.
++-
++- @param outputParameters A structure that describes the output parameters used
++- to open a stream. The suggestedLatency field is ignored. See PaStreamParameters
++- for a description of these parameters. outputParameters must be NULL for
++- input-only streams.
++-
++- @param sampleRate The required sampleRate. For full-duplex streams it is the
++- sample rate for both input and output
++-
++- @return Returns 0 if the format is supported, and an error code indicating why
++- the format is not supported otherwise. The constant paFormatIsSupported is
++- provided to compare with the return value for success.
++-
++- @see paFormatIsSupported, PaStreamParameters
++-*/
++-PaError Pa_IsFormatSupported( const PaStreamParameters *inputParameters,
++- const PaStreamParameters *outputParameters,
++- double sampleRate );
++-
++-
++-
++-/* Streaming types and functions */
++-
++-
++-/**
++- A single PaStream can provide multiple channels of real-time
++- streaming audio input and output to a client application. A stream
++- provides access to audio hardware represented by one or more
++- PaDevices. Depending on the underlying Host API, it may be possible
++- to open multiple streams using the same device, however this behavior
++- is implementation defined. Portable applications should assume that
++- a PaDevice may be simultaneously used by at most one PaStream.
++-
++- Pointers to PaStream objects are passed between PortAudio functions that
++- operate on streams.
++-
++- @see Pa_OpenStream, Pa_OpenDefaultStream, Pa_OpenDefaultStream, Pa_CloseStream,
++- Pa_StartStream, Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive,
++- Pa_GetStreamTime, Pa_GetStreamCpuLoad
++-
++-*/
++-typedef void PaStream;
++-
++-
++-/** Can be passed as the framesPerBuffer parameter to Pa_OpenStream()
++- or Pa_OpenDefaultStream() to indicate that the stream callback will
++- accept buffers of any size.
++-*/
++-#define paFramesPerBufferUnspecified (0)
++-
++-
++-/** Flags used to control the behavior of a stream. They are passed as
++- parameters to Pa_OpenStream or Pa_OpenDefaultStream. Multiple flags may be
++- ORed together.
++-
++- @see Pa_OpenStream, Pa_OpenDefaultStream
++- @see paNoFlag, paClipOff, paDitherOff, paNeverDropInput,
++- paPrimeOutputBuffersUsingStreamCallback, paPlatformSpecificFlags
++-*/
++-typedef unsigned long PaStreamFlags;
++-
++-/** @see PaStreamFlags */
++-#define paNoFlag ((PaStreamFlags) 0)
++-
++-/** Disable default clipping of out of range samples.
++- @see PaStreamFlags
++-*/
++-#define paClipOff ((PaStreamFlags) 0x00000001)
++-
++-/** Disable default dithering.
++- @see PaStreamFlags
++-*/
++-#define paDitherOff ((PaStreamFlags) 0x00000002)
++-
++-/** Flag requests that where possible a full duplex stream will not discard
++- overflowed input samples without calling the stream callback. This flag is
++- only valid for full duplex callback streams and only when used in combination
++- with the paFramesPerBufferUnspecified (0) framesPerBuffer parameter. Using
++- this flag incorrectly results in a paInvalidFlag error being returned from
++- Pa_OpenStream and Pa_OpenDefaultStream.
++-
++- @see PaStreamFlags, paFramesPerBufferUnspecified
++-*/
++-#define paNeverDropInput ((PaStreamFlags) 0x00000004)
++-
++-/** Call the stream callback to fill initial output buffers, rather than the
++- default behavior of priming the buffers with zeros (silence). This flag has
++- no effect for input-only and blocking read/write streams.
++-
++- @see PaStreamFlags
++-*/
++-#define paPrimeOutputBuffersUsingStreamCallback ((PaStreamFlags) 0x00000008)
++-
++-/** A mask specifying the platform specific bits.
++- @see PaStreamFlags
++-*/
++-#define paPlatformSpecificFlags ((PaStreamFlags)0xFFFF0000)
++-
++-/**
++- Timing information for the buffers passed to the stream callback.
++-*/
++-typedef struct PaStreamCallbackTimeInfo{
++- PaTime inputBufferAdcTime;
++- PaTime currentTime;
++- PaTime outputBufferDacTime;
++-} PaStreamCallbackTimeInfo;
++-
++-
++-/**
++- Flag bit constants for the statusFlags to PaStreamCallback.
++-
++- @see paInputUnderflow, paInputOverflow, paOutputUnderflow, paOutputOverflow,
++- paPrimingOutput
++-*/
++-typedef unsigned long PaStreamCallbackFlags;
++-
++-/** In a stream opened with paFramesPerBufferUnspecified, indicates that
++- input data is all silence (zeros) because no real data is available. In a
++- stream opened without paFramesPerBufferUnspecified, it indicates that one or
++- more zero samples have been inserted into the input buffer to compensate
++- for an input underflow.
++- @see PaStreamCallbackFlags
++-*/
++-#define paInputUnderflow ((PaStreamCallbackFlags) 0x00000001)
++-
++-/** In a stream opened with paFramesPerBufferUnspecified, indicates that data
++- prior to the first sample of the input buffer was discarded due to an
++- overflow, possibly because the stream callback is using too much CPU time.
++- Otherwise indicates that data prior to one or more samples in the
++- input buffer was discarded.
++- @see PaStreamCallbackFlags
++-*/
++-#define paInputOverflow ((PaStreamCallbackFlags) 0x00000002)
++-
++-/** Indicates that output data (or a gap) was inserted, possibly because the
++- stream callback is using too much CPU time.
++- @see PaStreamCallbackFlags
++-*/
++-#define paOutputUnderflow ((PaStreamCallbackFlags) 0x00000004)
++-
++-/** Indicates that output data will be discarded because no room is available.
++- @see PaStreamCallbackFlags
++-*/
++-#define paOutputOverflow ((PaStreamCallbackFlags) 0x00000008)
++-
++-/** Some of all of the output data will be used to prime the stream, input
++- data may be zero.
++- @see PaStreamCallbackFlags
++-*/
++-#define paPrimingOutput ((PaStreamCallbackFlags) 0x00000010)
++-
++-/**
++- Allowable return values for the PaStreamCallback.
++- @see PaStreamCallback
++-*/
++-typedef enum PaStreamCallbackResult
++-{
++- paContinue=0,
++- paComplete=1,
++- paAbort=2
++-} PaStreamCallbackResult;
++-
++-
++-/**
++- Functions of type PaStreamCallback are implemented by PortAudio clients.
++- They consume, process or generate audio in response to requests from an
++- active PortAudio stream.
++-
++- @param input and @param output are arrays of interleaved samples,
++- the format, packing and number of channels used by the buffers are
++- determined by parameters to Pa_OpenStream().
++-
++- @param frameCount The number of sample frames to be processed by
++- the stream callback.
++-
++- @param timeInfo The time in seconds when the first sample of the input
++- buffer was received at the audio input, the time in seconds when the first
++- sample of the output buffer will begin being played at the audio output, and
++- the time in seconds when the stream callback was called.
++- See also Pa_GetStreamTime()
++-
++- @param statusFlags Flags indicating whether input and/or output buffers
++- have been inserted or will be dropped to overcome underflow or overflow
++- conditions.
++-
++- @param userData The value of a user supplied pointer passed to
++- Pa_OpenStream() intended for storing synthesis data etc.
++-
++- @return
++- The stream callback should return one of the values in the
++- PaStreamCallbackResult enumeration. To ensure that the callback continues
++- to be called, it should return paContinue (0). Either paComplete or paAbort
++- can be returned to finish stream processing, after either of these values is
++- returned the callback will not be called again. If paAbort is returned the
++- stream will finish as soon as possible. If paComplete is returned, the stream
++- will continue until all buffers generated by the callback have been played.
++- This may be useful in applications such as soundfile players where a specific
++- duration of output is required. However, it is not necessary to utilise this
++- mechanism as Pa_StopStream(), Pa_AbortStream() or Pa_CloseStream() can also
++- be used to stop the stream. The callback must always fill the entire output
++- buffer irrespective of its return value.
++-
++- @see Pa_OpenStream, Pa_OpenDefaultStream
++-
++- @note With the exception of Pa_GetStreamCpuLoad() it is not permissable to call
++- PortAudio API functions from within the stream callback.
++-*/
++-typedef int PaStreamCallback(
++- const void *input, void *output,
++- unsigned long frameCount,
++- const PaStreamCallbackTimeInfo* timeInfo,
++- PaStreamCallbackFlags statusFlags,
++- void *userData );
++-
++-
++-/** Opens a stream for either input, output or both.
++-
++- @param stream The address of a PaStream pointer which will receive
++- a pointer to the newly opened stream.
++-
++- @param inputParameters A structure that describes the input parameters used by
++- the opened stream. See PaStreamParameters for a description of these parameters.
++- inputParameters must be NULL for output-only streams.
++-
++- @param outputParameters A structure that describes the output parameters used by
++- the opened stream. See PaStreamParameters for a description of these parameters.
++- outputParameters must be NULL for input-only streams.
++-
++- @param sampleRate The desired sampleRate. For full-duplex streams it is the
++- sample rate for both input and output
++-
++- @param framesPerBuffer The number of frames passed to the stream callback
++- function, or the preferred block granularity for a blocking read/write stream.
++- The special value paFramesPerBufferUnspecified (0) may be used to request that
++- the stream callback will recieve an optimal (and possibly varying) number of
++- frames based on host requirements and the requested latency settings.
++- Note: With some host APIs, the use of non-zero framesPerBuffer for a callback
++- stream may introduce an additional layer of buffering which could introduce
++- additional latency. PortAudio guarantees that the additional latency
++- will be kept to the theoretical minimum however, it is strongly recommended
++- that a non-zero framesPerBuffer value only be used when your algorithm
++- requires a fixed number of frames per stream callback.
++-
++- @param streamFlags Flags which modify the behaviour of the streaming process.
++- This parameter may contain a combination of flags ORed together. Some flags may
++- only be relevant to certain buffer formats.
++-
++- @param streamCallback A pointer to a client supplied function that is responsible
++- for processing and filling input and output buffers. If this parameter is NULL
++- the stream will be opened in 'blocking read/write' mode. In blocking mode,
++- the client can receive sample data using Pa_ReadStream and write sample data
++- using Pa_WriteStream, the number of samples that may be read or written
++- without blocking is returned by Pa_GetStreamReadAvailable and
++- Pa_GetStreamWriteAvailable respectively.
++-
++- @param userData A client supplied pointer which is passed to the stream callback
++- function. It could for example, contain a pointer to instance data necessary
++- for processing the audio buffers. This parameter is ignored if streamCallback
++- is NULL.
++-
++- @return
++- Upon success Pa_OpenStream() returns paNoError and places a pointer to a
++- valid PaStream in the stream argument. The stream is inactive (stopped).
++- If a call to Pa_OpenStream() fails, a non-zero error code is returned (see
++- PaError for possible error codes) and the value of stream is invalid.
++-
++- @see PaStreamParameters, PaStreamCallback, Pa_ReadStream, Pa_WriteStream,
++- Pa_GetStreamReadAvailable, Pa_GetStreamWriteAvailable
++-*/
++-PaError Pa_OpenStream( PaStream** stream,
++- const PaStreamParameters *inputParameters,
++- const PaStreamParameters *outputParameters,
++- double sampleRate,
++- unsigned long framesPerBuffer,
++- PaStreamFlags streamFlags,
++- PaStreamCallback *streamCallback,
++- void *userData );
++-
++-
++-/** A simplified version of Pa_OpenStream() that opens the default input
++- and/or output devices.
++-
++- @param stream The address of a PaStream pointer which will receive
++- a pointer to the newly opened stream.
++-
++- @param numInputChannels The number of channels of sound that will be supplied
++- to the stream callback or returned by Pa_ReadStream. It can range from 1 to
++- the value of maxInputChannels in the PaDeviceInfo record for the default input
++- device. If 0 the stream is opened as an output-only stream.
++-
++- @param numOutputChannels The number of channels of sound to be delivered to the
++- stream callback or passed to Pa_WriteStream. It can range from 1 to the value
++- of maxOutputChannels in the PaDeviceInfo record for the default output dvice.
++- If 0 the stream is opened as an output-only stream.
++-
++- @param sampleFormat The sample format of both the input and output buffers
++- provided to the callback or passed to and from Pa_ReadStream and Pa_WriteStream.
++- sampleFormat may be any of the formats described by the PaSampleFormat
++- enumeration.
++-
++- @param sampleRate Same as Pa_OpenStream parameter of the same name.
++- @param framesPerBuffer Same as Pa_OpenStream parameter of the same name.
++- @param streamCallback Same as Pa_OpenStream parameter of the same name.
++- @param userData Same as Pa_OpenStream parameter of the same name.
++-
++- @return As for Pa_OpenStream
++-
++- @see Pa_OpenStream, PaStreamCallback
++-*/
++-PaError Pa_OpenDefaultStream( PaStream** stream,
++- int numInputChannels,
++- int numOutputChannels,
++- PaSampleFormat sampleFormat,
++- double sampleRate,
++- unsigned long framesPerBuffer,
++- PaStreamCallback *streamCallback,
++- void *userData );
++-
++-
++-/** Closes an audio stream. If the audio stream is active it
++- discards any pending buffers as if Pa_AbortStream() had been called.
++-*/
++-PaError Pa_CloseStream( PaStream *stream );
++-
++-
++-/** Functions of type PaStreamFinishedCallback are implemented by PortAudio
++- clients. They can be registered with a stream using the Pa_SetStreamFinishedCallback
++- function. Once registered they are called when the stream becomes inactive
++- (ie once a call to Pa_StopStream() will not block).
++- A stream will become inactive after the stream callback returns non-zero,
++- or when Pa_StopStream or Pa_AbortStream is called. For a stream providing audio
++- output, if the stream callback returns paComplete, or Pa_StopStream is called,
++- the stream finished callback will not be called until all generated sample data
++- has been played.
++-
++- @param userData The userData parameter supplied to Pa_OpenStream()
++-
++- @see Pa_SetStreamFinishedCallback
++-*/
++-typedef void PaStreamFinishedCallback( void *userData );
++-
++-
++-/** Register a stream finished callback function which will be called when the
++- stream becomes inactive. See the description of PaStreamFinishedCallback for
++- further details about when the callback will be called.
++-
++- @param stream a pointer to a PaStream that is in the stopped state - if the
++- stream is not stopped, the stream's finished callback will remain unchanged
++- and an error code will be returned.
++-
++- @param streamFinishedCallback a pointer to a function with the same signature
++- as PaStreamFinishedCallback, that will be called when the stream becomes
++- inactive. Passing NULL for this parameter will un-register a previously
++- registered stream finished callback function.
++-
++- @return on success returns paNoError, otherwise an error code indicating the cause
++- of the error.
++-
++- @see PaStreamFinishedCallback
++-*/
++-PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback );
++-
++-
++-/** Commences audio processing.
++-*/
++-PaError Pa_StartStream( PaStream *stream );
++-
++-
++-/** Terminates audio processing. It waits until all pending
++- audio buffers have been played before it returns.
++-*/
++-PaError Pa_StopStream( PaStream *stream );
++-
++-
++-/** Terminates audio processing immediately without waiting for pending
++- buffers to complete.
++-*/
++-PaError Pa_AbortStream( PaStream *stream );
++-
++-
++-/** Determine whether the stream is stopped.
++- A stream is considered to be stopped prior to a successful call to
++- Pa_StartStream and after a successful call to Pa_StopStream or Pa_AbortStream.
++- If a stream callback returns a value other than paContinue the stream is NOT
++- considered to be stopped.
++-
++- @return Returns one (1) when the stream is stopped, zero (0) when
++- the stream is running or, a PaErrorCode (which are always negative) if
++- PortAudio is not initialized or an error is encountered.
++-
++- @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamActive
++-*/
++-PaError Pa_IsStreamStopped( PaStream *stream );
++-
++-
++-/** Determine whether the stream is active.
++- A stream is active after a successful call to Pa_StartStream(), until it
++- becomes inactive either as a result of a call to Pa_StopStream() or
++- Pa_AbortStream(), or as a result of a return value other than paContinue from
++- the stream callback. In the latter case, the stream is considered inactive
++- after the last buffer has finished playing.
++-
++- @return Returns one (1) when the stream is active (ie playing or recording
++- audio), zero (0) when not playing or, a PaErrorCode (which are always negative)
++- if PortAudio is not initialized or an error is encountered.
++-
++- @see Pa_StopStream, Pa_AbortStream, Pa_IsStreamStopped
++-*/
++-PaError Pa_IsStreamActive( PaStream *stream );
++-
++-
++-
++-/** A structure containing unchanging information about an open stream.
++- @see Pa_GetStreamInfo
++-*/
++-
++-typedef struct PaStreamInfo
++-{
++- /** this is struct version 1 */
++- int structVersion;
++-
++- /** The input latency of the stream in seconds. This value provides the most
++- accurate estimate of input latency available to the implementation. It may
++- differ significantly from the suggestedLatency value passed to Pa_OpenStream().
++- The value of this field will be zero (0.) for output-only streams.
++- @see PaTime
++- */
++- PaTime inputLatency;
++-
++- /** The output latency of the stream in seconds. This value provides the most
++- accurate estimate of output latency available to the implementation. It may
++- differ significantly from the suggestedLatency value passed to Pa_OpenStream().
++- The value of this field will be zero (0.) for input-only streams.
++- @see PaTime
++- */
++- PaTime outputLatency;
++-
++- /** The sample rate of the stream in Hertz (samples per second). In cases
++- where the hardware sample rate is inaccurate and PortAudio is aware of it,
++- the value of this field may be different from the sampleRate parameter
++- passed to Pa_OpenStream(). If information about the actual hardware sample
++- rate is not available, this field will have the same value as the sampleRate
++- parameter passed to Pa_OpenStream().
++- */
++- double sampleRate;
++-
++-} PaStreamInfo;
++-
++-
++-/** Retrieve a pointer to a PaStreamInfo structure containing information
++- about the specified stream.
++- @return A pointer to an immutable PaStreamInfo structure. If the stream
++- parameter invalid, or an error is encountered, the function returns NULL.
++-
++- @param stream A pointer to an open stream previously created with Pa_OpenStream.
++-
++- @note PortAudio manages the memory referenced by the returned pointer,
++- the client must not manipulate or free the memory. The pointer is only
++- guaranteed to be valid until the specified stream is closed.
++-
++- @see PaStreamInfo
++-*/
++-const PaStreamInfo* Pa_GetStreamInfo( PaStream *stream );
++-
++-
++-/** Determine the current time for the stream according to the same clock used
++- to generate buffer timestamps. This time may be used for syncronising other
++- events to the audio stream, for example synchronizing audio to MIDI.
++-
++- @return The stream's current time in seconds, or 0 if an error occurred.
++-
++- @see PaTime, PaStreamCallback
++-*/
++-PaTime Pa_GetStreamTime( PaStream *stream );
++-
++-
++-/** Retrieve CPU usage information for the specified stream.
++- The "CPU Load" is a fraction of total CPU time consumed by a callback stream's
++- audio processing routines including, but not limited to the client supplied
++- stream callback. This function does not work with blocking read/write streams.
++-
++- This function may be called from the stream callback function or the
++- application.
++-
++- @return
++- A floating point value, typically between 0.0 and 1.0, where 1.0 indicates
++- that the stream callback is consuming the maximum number of CPU cycles possible
++- to maintain real-time operation. A value of 0.5 would imply that PortAudio and
++- the stream callback was consuming roughly 50% of the available CPU time. The
++- return value may exceed 1.0. A value of 0.0 will always be returned for a
++- blocking read/write stream, or if an error occurrs.
++-*/
++-double Pa_GetStreamCpuLoad( PaStream* stream );
++-
++-
++-/** Read samples from an input stream. The function doesn't return until
++- the entire buffer has been filled - this may involve waiting for the operating
++- system to supply the data.
++-
++- @param stream A pointer to an open stream previously created with Pa_OpenStream.
++-
++- @param buffer A pointer to a buffer of sample frames. The buffer contains
++- samples in the format specified by the inputParameters->sampleFormat field
++- used to open the stream, and the number of channels specified by
++- inputParameters->numChannels. If non-interleaved samples were requested,
++- buffer is a pointer to the first element of an array of non-interleaved
++- buffer pointers, one for each channel.
++-
++- @param frames The number of frames to be read into buffer. This parameter
++- is not constrained to a specific range, however high performance applications
++- will want to match this parameter to the framesPerBuffer parameter used
++- when opening the stream.
++-
++- @return On success PaNoError will be returned, or PaInputOverflowed if input
++- data was discarded by PortAudio after the previous call and before this call.
++-*/
++-PaError Pa_ReadStream( PaStream* stream,
++- void *buffer,
++- unsigned long frames );
++-
++-
++-/** Write samples to an output stream. This function doesn't return until the
++- entire buffer has been consumed - this may involve waiting for the operating
++- system to consume the data.
++-
++- @param stream A pointer to an open stream previously created with Pa_OpenStream.
++-
++- @param buffer A pointer to a buffer of sample frames. The buffer contains
++- samples in the format specified by the outputParameters->sampleFormat field
++- used to open the stream, and the number of channels specified by
++- outputParameters->numChannels. If non-interleaved samples were requested,
++- buffer is a pointer to the first element of an array of non-interleaved
++- buffer pointers, one for each channel.
++-
++- @param frames The number of frames to be written from buffer. This parameter
++- is not constrained to a specific range, however high performance applications
++- will want to match this parameter to the framesPerBuffer parameter used
++- when opening the stream.
++-
++- @return On success PaNoError will be returned, or paOutputUnderflowed if
++- additional output data was inserted after the previous call and before this
++- call.
++-*/
++-PaError Pa_WriteStream( PaStream* stream,
++- const void *buffer,
++- unsigned long frames );
++-
++-
++-/** Retrieve the number of frames that can be read from the stream without
++- waiting.
++-
++- @return Returns a non-negative value representing the maximum number of frames
++- that can be read from the stream without blocking or busy waiting or, a
++- PaErrorCode (which are always negative) if PortAudio is not initialized or an
++- error is encountered.
++-*/
++-signed long Pa_GetStreamReadAvailable( PaStream* stream );
++-
++-
++-/** Retrieve the number of frames that can be written to the stream without
++- waiting.
++-
++- @return Returns a non-negative value representing the maximum number of frames
++- that can be written to the stream without blocking or busy waiting or, a
++- PaErrorCode (which are always negative) if PortAudio is not initialized or an
++- error is encountered.
++-*/
++-signed long Pa_GetStreamWriteAvailable( PaStream* stream );
++-
++-
++-/* Miscellaneous utilities */
++-
++-
++-/** Retrieve the size of a given sample format in bytes.
++-
++- @return The size in bytes of a single sample in the specified format,
++- or paSampleFormatNotSupported if the format is not supported.
++-*/
++-PaError Pa_GetSampleSize( PaSampleFormat format );
++-
++-
++-/** Put the caller to sleep for at least 'msec' milliseconds. This function is
++- provided only as a convenience for authors of portable code (such as the tests
++- and examples in the PortAudio distribution.)
++-
++- The function may sleep longer than requested so don't rely on this for accurate
++- musical timing.
++-*/
++-void Pa_Sleep( long msec );
++-
++-
++-
++-#ifdef __cplusplus
++-}
++-#endif /* __cplusplus */
++-#endif /* PORTAUDIO_H */
++--- a/src/wave.cpp
+++++ b/src/wave.cpp
++@@ -31,7 +31,10 @@
++ #include <sys/time.h>
++ #include <time.h>
++
++-#include "portaudio.h"
+++#ifdef USE_PORTAUDIO
+++#include <portaudio.h>
+++#endif
+++
++ #ifdef PLATFORM_WINDOWS
++ #include <windows.h>
++ #else
++--- a/src/wavegen.cpp
+++++ b/src/wavegen.cpp
++@@ -40,7 +40,7 @@
++ #endif
++
++ #ifdef USE_PORTAUDIO
++-#include "portaudio.h"
+++#include <portaudio.h>
++ #undef USE_PORTAUDIO
++ // determine portaudio version by looking for a #define which is not in V18
++ #ifdef paNeverDropInput
+diff --git a/feeds/packages/sound/forked-daapd/Makefile b/feeds/packages/sound/forked-daapd/Makefile
+new file mode 100644
+index 0000000..51f459f
+--- /dev/null
++++ b/feeds/packages/sound/forked-daapd/Makefile
+@@ -0,0 +1,72 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=forked-daapd
++PKG_VERSION:=23.2
++PKG_RELEASE:=20150622
++PKG_REV:=227017ef5ba8df921b2f1db681a46494ec296b8b
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/ejurgensen/forked-daapd.git
++PKG_SOURCE_VERSION:=$(PKG_REV)
++
++PKG_BUILD_DEPENDS:=gperf/host
++PKG_FIXUP:=autoreconf
++PKG_USE_MIPS16:=0
++PKG_INSTALL:=1
++
++PKG_MAINTAINER:=Espen Jürgensen <espenjurgensen+openwrt@gmail.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/forked-daapd
++SECTION:=sound
++CATEGORY:=Sound
++TITLE:=iTunes (DAAP) server for Apple Remote and AirPlay
++URL:=https://github.com/ejurgensen/forked-daapd
++DEPENDS:=+libgpg-error +libgcrypt +libgdbm +zlib +libexpat +libunistring \
++ +libevent2 +libdaemon +libantlr3c +confuse +alsa-lib +libffmpeg-full \
++ +mxml +libavahi-client +sqlite3-cli +libplist +libcurl
++endef
++
++define Package/forked-daapd/description
++ forked-daapd is a Linux/FreeBSD DAAP (iTunes), MPD (Music Player Daemon) and
++ RSP (Roku) media server. It has support for AirPlay devices/speakers, Apple
++ Remote (and compatibles), MPD clients, internet radio and LastFM. It does not
++ support AirPlay video.
++endef
++
++define Package/forked-daapd/conffiles
++/etc/forked-daapd.conf
++endef
++
++CONFIGURE_ARGS += \
++ --enable-itunes \
++ --enable-lastfm \
++ --enable-mpd
++
++TARGET_CFLAGS += $(FPIC)
++TARGET_LDFLAGS += -Wl,-rpath-link,$(STAGING_DIR)/usr/lib
++
++define Package/forked-daapd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/forked-daapd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) ./files/forked-daapd.conf $(1)/etc/forked-daapd.conf
++ $(INSTALL_DIR) $(1)/usr/lib/forked-daapd
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/forked-daapd/* $(1)/usr/lib/forked-daapd/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/forked-daapd.init $(1)/etc/init.d/forked-daapd
++endef
++
++$(eval $(call BuildPackage,forked-daapd))
+diff --git a/feeds/packages/sound/forked-daapd/files/forked-daapd.conf b/feeds/packages/sound/forked-daapd/files/forked-daapd.conf
+new file mode 100644
+index 0000000..0f756e0
+--- /dev/null
++++ b/feeds/packages/sound/forked-daapd/files/forked-daapd.conf
+@@ -0,0 +1,187 @@
++# A quick guide to configuring forked-daapd:
++#
++# For regular use, the most important setting to configure is "directories",
++# which should be the location of your media. Whatever user you have set as
++# "uid" must have read access to this location. If the location is a network
++# mount, please see the README.
++#
++# In all likelihood, that's all you need to do!
++
++general {
++ # Username
++ # Make sure the user has read access to the library directories you set
++ # below, and full access to the databases, log and local audio
++ uid = "daapd"
++
++ # Database location
++ db_path = "/var/cache/forked-daapd/songs3.db"
++
++ # Log file and level
++ # Available levels: fatal, log, warning, info, debug, spam
++ logfile = "/var/log/forked-daapd.log"
++ loglevel = log
++
++ # Admin password for the non-existent web interface
++ admin_password = "unused"
++
++ # Enable/disable IPv6
++ ipv6 = no
++
++ # Location of cache database
++ cache_path = "/var/cache/forked-daapd/cache.db"
++
++ # DAAP requests that take longer than this threshold (in msec) get their
++ # replies cached for next time. Set to 0 to disable caching.
++# cache_daap_threshold = 1000
++}
++
++# Library configuration
++library {
++ # Name of the library as displayed by the clients
++ # %h: hostname, %v: version
++ name = "My Music on %h"
++
++ # TCP port to listen on. Default port is 3689 (daap)
++ port = 3689
++
++ # Password for the library. Optional.
++# password = ""
++
++ # Directories to index
++ directories = { "/srv/music" }
++
++ # Directories containing podcasts
++ # For each directory that is indexed the path is matched against these
++ # names. If there is a match all items in the directory are marked as
++ # podcasts. Eg. if you index /srv/music, and your podcasts are in
++ # /srv/music/Podcasts, you can set this to "/Podcasts".
++ # (changing this setting only takes effect after rescan, see the README)
++ podcasts = { "/Podcasts" }
++
++ # Directories containing audiobooks
++ # For each directory that is indexed the path is matched against these
++ # names. If there is a match all items in the directory are marked as
++ # audiobooks.
++ # (changing this setting only takes effect after rescan, see the README)
++ audiobooks = { "/Audiobooks" }
++
++ # Directories containing compilations (eg soundtracks)
++ # For each directory that is indexed the path is matched against these
++ # names. If there is a match all items in the directory are marked as
++ # compilations.
++ # (changing this setting only takes effect after rescan, see the README)
++ compilations = { "/Compilations" }
++
++ # Compilations usually have many artists, and if you don't want every
++ # artist to be listed when artist browsing in Remote, you can set
++ # a single name which will be used for all music in the compilation dir
++ # (changing this setting only takes effect after rescan, see the README)
++ compilation_artist = "Various artists"
++
++ # Internet streams in your playlists will by default be shown in the
++ # "Radio" library, like iTunes does. However, some clients (like
++ # TunesRemote+) won't show the "Radio" library. If you would also like
++ # to have them shown like normal playlists, you can enable this option.
++# radio_playlists = false
++
++ # There are 5 default playlists: "Library", "Music", "Movies", "TV Shows"
++ # and "Podcasts". Here you can change the names of these playlists.
++# name_library = "Library"
++# name_music = "Music"
++# name_movies = "Movies"
++# name_tvshows = "TV Shows"
++# name_podcasts = "Podcasts"
++# name_audiobooks = "Audiobooks"
++# name_radio = "Radio"
++
++ # Artwork file names (without file type extension)
++ # forked-daapd will look for jpg and png files with these base names
++# artwork_basenames = { "artwork", "cover", "Folder" }
++
++ # Enable searching for artwork corresponding to each individual media
++ # file instead of only looking for album artwork. This is disabled by
++ # default to reduce cache size.
++# artwork_individual = false
++
++ # File types the scanner should ignore
++ # Non-audio files will never be added to the database, but here you
++ # can prevent the scanner from even probing them. This might improve
++ # scan time. By default .db, .ini, .db-journal and .pdf are ignored.
++# filetypes_ignore = { ".db", ".ini", ".db-journal", ".pdf" }
++
++ # File paths the scanner should ignore
++ # If you want to exclude files on a more advanced basis you can enter
++ # one or more POSIX regular expressions, and any file with a matching
++ # path will be ignored.
++# filepath_ignore = { "myregex" }
++
++ # Disable startup file scanning
++ # When forked-daapd starts it will do an initial file scan of your
++ # library (and then watch it for changes). If you are sure your library
++ # never changes while forked-daapd is not running, you can disable the
++ # initial file scan and save some system ressources. Disabling this scan
++ # may lead to forked-daapd's database coming out of sync with the
++ # library. If that happens read the instructions in the README on how
++ # to trigger a rescan.
++# filescan_disable = false
++
++ # Should iTunes metadata override ours?
++# itunes_overrides = false
++
++ # Formats: mp4a, mp4v, mpeg, alac, flac, mpc, ogg, wma, wmal, wmav, aif, wav
++ # Formats that should never be transcoded
++# no_transcode = { "alac", "mp4a" }
++ # Formats that should always be transcoded
++# force_transcode = { "ogg", "flac" }
++}
++
++# Local audio output
++audio {
++ # Name - used in the speaker list in Remote
++ nickname = "OpenWrt"
++
++ # Audio device name for local audio output
++# card = "default"
++
++ # Mixer channel to use for volume control - ALSA/Linux only
++ # If not set, PCM will be used if available, otherwise Master.
++# mixer = ""
++}
++
++# AirPlay/Airport Express device settings
++# (make sure you get the capitalization of the device name right)
++#airplay "My AirPlay device" {
++ # forked-daapd's volume goes to 11! If that's more than you can handle
++ # you can set a lower value here
++# max_volume = 11
++
++ # AirPlay password
++# password = "s1kr3t"
++#}
++
++# SQLite configuration (allows to modify the operation of the SQLite databases)
++# Make sure to read the SQLite documentation for the corresponding PRAGMA statements as
++# changing them from the defaults may increase the possibility of database corruptions!
++# By default the SQLite default values are used.
++sqlite {
++ # Cache size in number of db pages for the library database
++ # (SQLite default page size is 1024 bytes and cache size is 2000 pages)
++# pragma_cache_size_library = 2000
++
++ # Cache size in number of db pages for the daap cache database
++ # (SQLite default page size is 1024 bytes and cache size is 2000 pages)
++# pragma_cache_size_cache = 2000
++
++ # Sets the journal mode for the database
++ # DELETE (default), TRUNCATE, PERSIST, MEMORY, WAL, OFF
++# pragma_journal_mode = DELETE
++
++ # Change the setting of the "synchronous" flag
++ # 0: OFF, 1: NORMAL, 2: FULL (default)
++# pragma_synchronous = 2
++
++ # Should the database be vacuumed on startup? (increases startup time,
++ # but may reduce database size). Default is yes.
++# vacuum = yes
++}
++
+diff --git a/feeds/packages/sound/forked-daapd/files/forked-daapd.init b/feeds/packages/sound/forked-daapd/files/forked-daapd.init
+new file mode 100644
+index 0000000..3ae38f9
+--- /dev/null
++++ b/feeds/packages/sound/forked-daapd/files/forked-daapd.init
+@@ -0,0 +1,15 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=99
++BIN=/usr/sbin/forked-daapd
++PID=/var/run/forked-daapd.pid
++SSD=start-stop-daemon
++
++start() {
++ $SSD -p $PID -S -x $BIN -- -P $PID
++}
++
++stop() {
++ $SSD -p $PID -K -s SIGINT
++}
+diff --git a/feeds/packages/sound/forked-daapd/patches/010-include_pregen.patch b/feeds/packages/sound/forked-daapd/patches/010-include_pregen.patch
+new file mode 100644
+index 0000000..6236ace
+--- /dev/null
++++ b/feeds/packages/sound/forked-daapd/patches/010-include_pregen.patch
+@@ -0,0 +1,23271 @@
++diff --git a/src/pregen/DAAP.u b/src/pregen/DAAP.u
++new file mode 100644
++index 0000000..3de527b
++--- /dev/null
+++++ b/src/pregen/DAAP.u
++@@ -0,0 +1,6 @@
+++DAAPParser.c : DAAP.g
+++./DAAP.tokens : DAAP.g
+++DAAPParser.h : DAAP.g
+++DAAPLexer.c : DAAP.g
+++DAAPLexer.h : DAAP.g
+++ANTLR_PRODUCTS += DAAPParser.c ./DAAP.tokens DAAPParser.h DAAPLexer.c DAAPLexer.h
++\ No newline at end of file
++diff --git a/src/pregen/DAAP2SQL.c b/src/pregen/DAAP2SQL.c
++new file mode 100644
++index 0000000..f13209c
++--- /dev/null
+++++ b/src/pregen/DAAP2SQL.c
++@@ -0,0 +1,975 @@
+++/** \file
+++ * This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : DAAP2SQL.g
+++ * - On : 2015-06-27 19:05:20
+++ * - for the tree parser : DAAP2SQLTreeParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++*/
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++
+++/* =============================================================================
+++ * This is what the grammar programmer asked us to put at the top of every file.
+++ */
+++
+++ #include <stdio.h>
+++ #include <stdlib.h>
+++ #include <string.h>
+++ #include <limits.h>
+++ #include <errno.h>
+++
+++ #include "logger.h"
+++ #include "db.h"
+++ #include "daap_query.h"
+++
+++/* End of Header action.
+++ * =============================================================================
+++ */
+++/* -----------------------------------------
+++ * Include the ANTLR3 generated header file.
+++ */
+++#include "DAAP2SQL.h"
+++/* ----------------------------------------- */
+++
+++
+++
+++
+++
+++/* MACROS that hide the C interface implementations from the
+++ * generated code, which makes it a little more understandable to the human eye.
+++ * I am very much against using C pre-processor macros for function calls and bits
+++ * of code as you cannot see what is happening when single stepping in debuggers
+++ * and so on. The exception (in my book at least) is for generated code, where you are
+++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
+++ * hides some indirect calls, but is always referring to the input stream. This is
+++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
+++ * the runtime interfaces without changing the generated code too often, without
+++ * confusing the reader of the generated output, who may not wish to know the gory
+++ * details of the interface inheritance.
+++ */
+++
+++#define CTX ctx
+++
+++/* Aids in accessing scopes for grammar programmers
+++ */
+++#undef SCOPE_TYPE
+++#undef SCOPE_STACK
+++#undef SCOPE_TOP
+++#define SCOPE_TYPE(scope) pDAAP2SQL_##scope##_SCOPE
+++#define SCOPE_STACK(scope) pDAAP2SQL_##scope##Stack
+++#define SCOPE_TOP(scope) ctx->pDAAP2SQL_##scope##Top
+++#define SCOPE_SIZE(scope) ctx->pDAAP2SQL_##scope##Stack_limit
+++#define SCOPE_INSTANCE(scope, i) (ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
+++
+++/* Macros for accessing things in the parser
+++ */
+++
+++#undef PARSER
+++#undef RECOGNIZER
+++#undef HAVEPARSEDRULE
+++#undef INPUT
+++#undef STRSTREAM
+++#undef HASEXCEPTION
+++#undef EXCEPTION
+++#undef MATCHT
+++#undef MATCHANYT
+++#undef FOLLOWSTACK
+++#undef FOLLOWPUSH
+++#undef FOLLOWPOP
+++#undef PRECOVER
+++#undef PREPORTERROR
+++#undef LA
+++#undef LT
+++#undef CONSTRUCTEX
+++#undef CONSUME
+++#undef MARK
+++#undef REWIND
+++#undef REWINDLAST
+++#undef PERRORRECOVERY
+++#undef HASFAILED
+++#undef FAILEDFLAG
+++#undef RECOVERFROMMISMATCHEDSET
+++#undef RECOVERFROMMISMATCHEDELEMENT
+++#undef BACKTRACKING
+++#undef ADAPTOR
+++#undef RULEMEMO
+++#undef SEEK
+++#undef INDEX
+++#undef DBG
+++
+++#define PARSER ctx->pTreeParser
+++#define RECOGNIZER PARSER->rec
+++#define PSRSTATE RECOGNIZER->state
+++#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
+++#define INPUT PARSER->ctnstream
+++#define ISTREAM INPUT->tnstream->istream
+++#define STRSTREAM INPUT->tnstream
+++#define HASEXCEPTION() (PSRSTATE->error == ANTLR3_TRUE)
+++#define EXCEPTION PSRSTATE->exception
+++#define MATCHT(t, fs) RECOGNIZER->match(RECOGNIZER, t, fs)
+++#define MATCHANYT() RECOGNIZER->matchAny(RECOGNIZER)
+++#define FOLLOWSTACK PSRSTATE->following
+++#define FOLLOWPUSH(x) FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
+++#define FOLLOWPOP() FOLLOWSTACK->pop(FOLLOWSTACK)
+++#define PRECOVER() RECOGNIZER->recover(RECOGNIZER)
+++#define PREPORTERROR() RECOGNIZER->reportError(RECOGNIZER)
+++#define LA(n) ISTREAM->_LA(ISTREAM, n)
+++#define LT(n) INPUT->tnstream->_LT(INPUT->tnstream, n)
+++#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER)
+++#define CONSUME() ISTREAM->consume(ISTREAM)
+++#define MARK() ISTREAM->mark(ISTREAM)
+++#define REWIND(m) ISTREAM->rewind(ISTREAM, m)
+++#define REWINDLAST() ISTREAM->rewindLast(ISTREAM)
+++#define PERRORRECOVERY PSRSTATE->errorRecovery
+++#define FAILEDFLAG PSRSTATE->failed
+++#define HASFAILED() (FAILEDFLAG == ANTLR3_TRUE)
+++#define BACKTRACKING PSRSTATE->backtracking
+++#define RECOVERFROMMISMATCHEDSET(s) RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
+++#define RECOVERFROMMISMATCHEDELEMENT(e) RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
+++#define ADAPTOR INPUT->adaptor
+++#define RULEMEMO PSRSTATE->ruleMemo
+++#define SEEK(n) ISTREAM->seek(ISTREAM, n)
+++#define INDEX() ISTREAM->index(ISTREAM)
+++#define DBG RECOGNIZER->debugger
+++
+++
+++#define TOKTEXT(tok, txt) tok, (pANTLR3_UINT8)txt
+++
+++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
+++ * then for the present you must use different names for your defines as these are hard coded
+++ * in the code generator. It would be better not to use such names internally, and maybe
+++ * we can change this in a forthcoming release. I deliberately do not #undef these
+++ * here as this will at least give you a redefined error somewhere if they clash.
+++ */
+++#define UP ANTLR3_TOKEN_UP
+++#define DOWN ANTLR3_TOKEN_DOWN
+++#define EOR ANTLR3_TOKEN_EOR
+++#define INVALID ANTLR3_TOKEN_INVALID
+++
+++
+++/* =============================================================================
+++ * Functions to create and destroy scopes. First come the rule scopes, followed
+++ * by the global declared scopes.
+++ */
+++
+++
+++
+++/* ============================================================================= */
+++
+++/* =============================================================================
+++ * Start of recognizer
+++ */
+++
+++
+++
+++/** \brief Table of all token names in symbolic order, mainly used for
+++ * error reporting.
+++ */
+++pANTLR3_UINT8 DAAP2SQLTokenNames[8+4]
+++ = {
+++ (pANTLR3_UINT8) "<invalid>", /* String to print to indicate an invalid token */
+++ (pANTLR3_UINT8) "<EOR>",
+++ (pANTLR3_UINT8) "<DOWN>",
+++ (pANTLR3_UINT8) "<UP>",
+++ (pANTLR3_UINT8) "NEWLINE",
+++ (pANTLR3_UINT8) "OPOR",
+++ (pANTLR3_UINT8) "OPAND",
+++ (pANTLR3_UINT8) "LPAR",
+++ (pANTLR3_UINT8) "RPAR",
+++ (pANTLR3_UINT8) "STR",
+++ (pANTLR3_UINT8) "QUOTE",
+++ (pANTLR3_UINT8) "ESCAPED"
+++ };
+++
+++
+++
+++// Forward declare the locally static matching functions we have generated.
+++//
+++static pANTLR3_STRING query (pDAAP2SQL ctx);
+++static DAAP2SQL_expr_return expr (pDAAP2SQL ctx);
+++static void DAAP2SQLFree(pDAAP2SQL ctx);
+++/* For use in tree output where we are accumulating rule labels via label += ruleRef
+++ * we need a function that knows how to free a return scope when the list is destroyed.
+++ * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
+++ */
+++static void ANTLR3_CDECL freeScope(void * scope)
+++{
+++ ANTLR3_FREE(scope);
+++}
+++
+++/** \brief Name of the grammar file that generated this code
+++ */
+++static const char fileName[] = "DAAP2SQL.g";
+++
+++/** \brief Return the name of the grammar file that generated this code.
+++ */
+++static const char * getGrammarFileName()
+++{
+++ return fileName;
+++}
+++/** \brief Create a new DAAP2SQL parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pDAAP2SQL
+++DAAP2SQLNew (pANTLR3_COMMON_TREE_NODE_STREAM instream)
+++{
+++ // See if we can create a new parser with the standard constructor
+++ //
+++ return DAAP2SQLNewSSD(instream, NULL);
+++}
+++
+++/** \brief Create a new DAAP2SQL parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pDAAP2SQL
+++DAAP2SQLNewSSD (pANTLR3_COMMON_TREE_NODE_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
+++{
+++ pDAAP2SQL ctx; /* Context structure we will build and return */
+++
+++ ctx = (pDAAP2SQL) ANTLR3_CALLOC(1, sizeof(DAAP2SQL));
+++
+++ if (ctx == NULL)
+++ {
+++ // Failed to allocate memory for parser context
+++ //
+++ return NULL;
+++ }
+++
+++ /* -------------------------------------------------------------------
+++ * Memory for basic structure is allocated, now to fill in
+++ * the base ANTLR3 structures. We initialize the function pointers
+++ * for the standard ANTLR3 parser function set, but upon return
+++ * from here, the programmer may set the pointers to provide custom
+++ * implementations of each function.
+++ *
+++ * We don't use the macros defined in DAAP2SQL.h here, in order that you can get a sense
+++ * of what goes where.
+++ */
+++
+++ /* Create a base Tree parser/recognizer, using the supplied tree node stream
+++ */
+++ ctx->pTreeParser = antlr3TreeParserNewStream(ANTLR3_SIZE_HINT, instream, state);
+++ /* Install the implementation of our DAAP2SQL interface
+++ */
+++ ctx->query = query;
+++ ctx->expr = expr;
+++ ctx->free = DAAP2SQLFree;
+++ ctx->getGrammarFileName = getGrammarFileName;
+++
+++ /* Install the scope pushing methods.
+++ */
+++
+++
+++
+++
+++
+++ /* Install the token table
+++ */
+++ PSRSTATE->tokenNames = DAAP2SQLTokenNames;
+++
+++
+++ /* Return the newly built parser to the caller
+++ */
+++ return ctx;
+++}
+++
+++/** Free the parser resources
+++ */
+++ static void
+++ DAAP2SQLFree(pDAAP2SQL ctx)
+++ {
+++ /* Free any scope memory
+++ */
+++
+++
+++ // Free this parser
+++ //
+++ ctx->pTreeParser->free(ctx->pTreeParser);
+++ ANTLR3_FREE(ctx);
+++
+++ /* Everything is released, so we can return
+++ */
+++ return;
+++ }
+++
+++/** Return token names used by this tree parser
+++ *
+++ * The returned pointer is used as an index into the token names table (using the token
+++ * number as the index).
+++ *
+++ * \return Pointer to first char * in the table.
+++ */
+++static pANTLR3_UINT8 *getTokenNames()
+++{
+++ return DAAP2SQLTokenNames;
+++}
+++
+++
+++ struct dmap_query_field_map {
+++ char *dmap_field;
+++ char *db_col;
+++ int as_int;
+++ };
+++
+++ /* gperf static hash, daap_query.gperf */
+++ #include "daap_query_hash.c"
+++
+++
+++/* Declare the bitsets
+++ */
+++
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_query70 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_query70_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_query70 = { FOLLOW_expr_in_query70_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OPAND_in_expr95 */
+++static ANTLR3_BITWORD FOLLOW_OPAND_in_expr95_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_OPAND_in_expr95 = { FOLLOW_OPAND_in_expr95_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr101 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_expr101_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000260) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_expr101 = { FOLLOW_expr_in_expr101_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr107 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_expr107_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_expr107 = { FOLLOW_expr_in_expr107_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OPOR_in_expr118 */
+++static ANTLR3_BITWORD FOLLOW_OPOR_in_expr118_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_OPOR_in_expr118 = { FOLLOW_OPOR_in_expr118_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr124 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_expr124_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000260) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_expr124 = { FOLLOW_expr_in_expr124_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr130 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_expr130_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_expr130 = { FOLLOW_expr_in_expr130_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_expr140 */
+++static ANTLR3_BITWORD FOLLOW_STR_in_expr140_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_STR_in_expr140 = { FOLLOW_STR_in_expr140_bits, 1 };
+++
+++
+++
+++
+++/* ==============================================
+++ * Parsing rules
+++ */
+++/**
+++ * $ANTLR start query
+++ * DAAP2SQL.g:50:1: query returns [ pANTLR3_STRING result ] : e= expr ;
+++ */
+++static pANTLR3_STRING
+++query(pDAAP2SQL ctx)
+++{
+++ pANTLR3_STRING result = NULL;
+++
+++ DAAP2SQL_expr_return e;
+++ #undef RETURN_TYPE_e
+++ #define RETURN_TYPE_e DAAP2SQL_expr_return
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ result= NULL;
+++ {
+++ // DAAP2SQL.g:52:2: (e= expr )
+++ // DAAP2SQL.g:52:4: e= expr
+++ {
+++ FOLLOWPUSH(FOLLOW_expr_in_query70);
+++ e=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulequeryEx;
+++ }
+++
+++ {
+++
+++ if (!e.valid)
+++ {
+++ result= NULL;
+++ }
+++ else
+++ {
+++ result= e.result->factory->newRaw(e.result->factory);
+++ result->append8(result, "(");
+++ result->appendS(result, e.result);
+++ result->append8(result, ")");
+++ }
+++
+++ }
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulequeryEx; /* Prevent compiler warnings */
+++ rulequeryEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return result;
+++}
+++/* $ANTLR end query */
+++
+++/**
+++ * $ANTLR start expr
+++ * DAAP2SQL.g:68:1: expr returns [ pANTLR3_STRING result, int valid ] : ( ^( OPAND a= expr b= expr ) | ^( OPOR a= expr b= expr ) | STR );
+++ */
+++static DAAP2SQL_expr_return
+++expr(pDAAP2SQL ctx)
+++{
+++ DAAP2SQL_expr_return retval;
+++
+++ pANTLR3_BASE_TREE STR1;
+++ DAAP2SQL_expr_return a;
+++ #undef RETURN_TYPE_a
+++ #define RETURN_TYPE_a DAAP2SQL_expr_return
+++
+++ DAAP2SQL_expr_return b;
+++ #undef RETURN_TYPE_b
+++ #define RETURN_TYPE_b DAAP2SQL_expr_return
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ retval.result= NULL; retval.valid= 1;
+++ STR1 = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ {
+++ {
+++ // DAAP2SQL.g:70:2: ( ^( OPAND a= expr b= expr ) | ^( OPOR a= expr b= expr ) | STR )
+++
+++ ANTLR3_UINT32 alt1;
+++
+++ alt1=3;
+++
+++ switch ( LA(1) )
+++ {
+++ case OPAND:
+++ {
+++ alt1=1;
+++ }
+++ break;
+++ case OPOR:
+++ {
+++ alt1=2;
+++ }
+++ break;
+++ case STR:
+++ {
+++ alt1=3;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleexprEx;
+++ }
+++
+++ switch (alt1)
+++ {
+++ case 1:
+++ // DAAP2SQL.g:70:4: ^( OPAND a= expr b= expr )
+++ {
+++ MATCHT(OPAND, &FOLLOW_OPAND_in_expr95);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expr_in_expr101);
+++ a=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expr_in_expr107);
+++ b=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ {
+++
+++ if (a.valid && b.valid)
+++ {
+++ retval.result= a.result->factory->newRaw(a.result->factory);
+++ retval.result->append8(retval.result, "(");
+++ retval.result->appendS(retval.result, a.result);
+++ retval.result->append8(retval.result, " AND ");
+++ retval.result->appendS(retval.result, b.result);
+++ retval.result->append8(retval.result, ")");
+++ }
+++ else if (a.valid)
+++ {
+++ retval.result= a.result->factory->newRaw(a.result->factory);
+++ retval.result->appendS(retval.result, a.result);
+++ }
+++ else if (b.valid)
+++ {
+++ retval.result= b.result->factory->newRaw(b.result->factory);
+++ retval.result->appendS(retval.result, b.result);
+++ }
+++ else
+++ {
+++ retval.valid= 0;
+++ }
+++
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // DAAP2SQL.g:96:4: ^( OPOR a= expr b= expr )
+++ {
+++ MATCHT(OPOR, &FOLLOW_OPOR_in_expr118);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expr_in_expr124);
+++ a=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expr_in_expr130);
+++ b=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ {
+++
+++ if (a.valid && b.valid)
+++ {
+++ retval.result= a.result->factory->newRaw(a.result->factory);
+++ retval.result->append8(retval.result, "(");
+++ retval.result->appendS(retval.result, a.result);
+++ retval.result->append8(retval.result, " OR ");
+++ retval.result->appendS(retval.result, b.result);
+++ retval.result->append8(retval.result, ")");
+++ }
+++ else if (a.valid)
+++ {
+++ retval.result= a.result->factory->newRaw(a.result->factory);
+++ retval.result->appendS(retval.result, a.result);
+++ }
+++ else if (b.valid)
+++ {
+++ retval.result= b.result->factory->newRaw(b.result->factory);
+++ retval.result->appendS(retval.result, b.result);
+++ }
+++ else
+++ {
+++ retval.valid= 0;
+++ }
+++
+++ }
+++
+++ }
+++ break;
+++ case 3:
+++ // DAAP2SQL.g:122:4: STR
+++ {
+++ STR1 = (pANTLR3_BASE_TREE) MATCHT(STR, &FOLLOW_STR_in_expr140);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ {
+++
+++ pANTLR3_STRING str;
+++ pANTLR3_UINT8 field;
+++ pANTLR3_UINT8 val;
+++ pANTLR3_UINT8 escaped;
+++ ANTLR3_UINT8 op;
+++ int neg_op;
+++ const struct dmap_query_field_map *dqfm;
+++ char *end;
+++ long long llval;
+++
+++ escaped = NULL;
+++
+++ retval.result= (STR1->getText(STR1))->factory->newRaw((STR1->getText(STR1))->factory);
+++
+++ str = (STR1->getText(STR1))->toUTF8((STR1->getText(STR1)));
+++
+++ /* NOTE: the lexer delivers the string without quotes
+++ which may not be obvious from the grammar due to embedded code
+++ */
+++
+++ /* Make daap.songalbumid:0 a no-op */
+++ if (strcmp((char *)str->chars, "daap.songalbumid:0") == 0)
+++ {
+++ retval.result->append8(retval.result, "1 = 1");
+++
+++ goto STR_out;
+++ }
+++
+++ field = str->chars;
+++
+++ val = field;
+++ while ((*val != '\0') && ((*val == '.')
+++ || (*val == '-')
+++ || ((*val >= 'a') && (*val <= 'z'))
+++ || ((*val >= 'A') && (*val <= 'Z'))
+++ || ((*val >= '0') && (*val <= '9'))))
+++ {
+++ val++;
+++ }
+++
+++ if (*field == '\0')
+++ {
+++ DPRINTF(E_LOG, L_DAAP, "No field name found in clause '%s'\n", field);
+++ retval.valid= 0;
+++ goto STR_result_valid_0; /* ABORT */
+++ }
+++
+++ if (*val == '\0')
+++ {
+++ DPRINTF(E_LOG, L_DAAP, "No operator found in clause '%s'\n", field);
+++ retval.valid= 0;
+++ goto STR_result_valid_0; /* ABORT */
+++ }
+++
+++ op = *val;
+++ *val = '\0';
+++ val++;
+++
+++ if (op == '!')
+++ {
+++ if (*val == '\0')
+++ {
+++ DPRINTF(E_LOG, L_DAAP, "Negation found but operator missing in clause '%s%c'\n", field, op);
+++ retval.valid= 0;
+++ goto STR_result_valid_0; /* ABORT */
+++ }
+++
+++ neg_op = 1;
+++ op = *val;
+++ val++;
+++ }
+++ else
+++ neg_op = 0;
+++
+++ /* Lookup DMAP field in the query field map */
+++ dqfm = daap_query_field_lookup((char *)field, strlen((char *)field));
+++ if (!dqfm)
+++ {
+++ DPRINTF(E_LOG, L_DAAP, "DMAP field '%s' is not a valid field in queries\n", field);
+++ retval.valid= 0;
+++ goto STR_result_valid_0; /* ABORT */
+++ }
+++
+++ /* Empty values OK for string fields, NOK for integer */
+++ if (*val == '\0')
+++ {
+++ if (dqfm->as_int)
+++ {
+++ DPRINTF(E_LOG, L_DAAP, "No value given in clause '%s%s%c'\n", field, (neg_op) ? "!" : "", op);
+++ retval.valid= 0;
+++ goto STR_result_valid_0; /* ABORT */
+++ }
+++
+++ /* No need to exclude empty artist and album, as forked-daapd makes sure there always exists an artist/album. */
+++ if (neg_op && op == ':'
+++ && (strcmp((char *)field, "daap.songalbumartist") == 0
+++ || strcmp((char *)field, "daap.songartist") == 0
+++ || strcmp((char *)field, "daap.songalbum") == 0))
+++ {
+++ DPRINTF(E_DBG, L_DAAP, "Ignoring clause '%s%s%c'\n", field, (neg_op) ? "!" : "", op);
+++ retval.valid= 0;
+++ goto STR_result_valid_0;
+++ }
+++
+++ /* Need to check against NULL too */
+++ if (op == ':')
+++ retval.result->append8(retval.result, "(");
+++ }
+++
+++ /* Int field: check integer conversion */
+++ if (dqfm->as_int)
+++ {
+++ errno = 0;
+++ llval = strtoll((const char *)val, &end, 10);
+++
+++ if (((errno == ERANGE) && ((llval == LLONG_MAX) || (llval == LLONG_MIN)))
+++ || ((errno != 0) && (llval == 0)))
+++ {
+++ DPRINTF(E_LOG, L_DAAP, "Value '%s' in clause '%s%s%c%s' does not convert to an integer type\n",
+++ val, field, (neg_op) ? "!" : "", op, val);
+++ retval.valid= 0;
+++ goto STR_result_valid_0; /* ABORT */
+++ }
+++
+++ if (end == (char *)val)
+++ {
+++ DPRINTF(E_LOG, L_DAAP, "Value '%s' in clause '%s%s%c%s' does not represent an integer value\n",
+++ val, field, (neg_op) ? "!" : "", op, val);
+++ retval.valid= 0;
+++ goto STR_result_valid_0; /* ABORT */
+++ }
+++
+++ *end = '\0'; /* Cut out potential garbage - we're being kind */
+++
+++ /* forked-daapd only has media_kind = 1 for music - so remove media_kind = 32 to imporve select query performance. */
+++ if (llval == 32
+++ && (strcmp((char *)field, "com.apple.itunes.mediakind") == 0
+++ || strcmp((char *)field, "com.apple.itunes.extended-media-kind") == 0))
+++ {
+++ DPRINTF(E_DBG, L_DAAP, "Ignoring clause '%s%s%c%s'\n", field, (neg_op) ? "!" : "", op, val);
+++
+++ if (neg_op)
+++ retval.result->append8(retval.result, "1 = 1");
+++ else
+++ retval.result->append8(retval.result, "1 = 0");
+++
+++ goto STR_out;
+++ }
+++ }
+++ /* String field: escape string, check for '*' */
+++ else
+++ {
+++ if (op != ':')
+++ {
+++ DPRINTF(E_LOG, L_DAAP, "Operation '%c' not valid for string values\n", op);
+++ retval.valid= 0;
+++ goto STR_result_valid_0; /* ABORT */
+++ }
+++
+++ escaped = (pANTLR3_UINT8)db_escape_string((char *)val);
+++ if (!escaped)
+++ {
+++ DPRINTF(E_LOG, L_DAAP, "Could not escape value\n");
+++ retval.valid= 0;
+++ goto STR_result_valid_0; /* ABORT */
+++ }
+++
+++ val = escaped;
+++
+++ if (val[0] == '*')
+++ {
+++ op = '%';
+++ val[0] = '%';
+++ }
+++
+++ if (val[0] && val[1] && val[strlen((char *)val) - 1] == '*')
+++ {
+++ op = '%';
+++ val[strlen((char *)val) - 1] = '%';
+++ }
+++ }
+++
+++ retval.result->append8(retval.result, dqfm->db_col);
+++
+++ switch(op)
+++ {
+++ case ':':
+++ if (neg_op)
+++ retval.result->append8(retval.result, " <> ");
+++ else
+++ retval.result->append8(retval.result, " = ");
+++ break;
+++
+++ case '+':
+++ if (neg_op)
+++ retval.result->append8(retval.result, " <= ");
+++ else
+++ retval.result->append8(retval.result, " > ");
+++ break;
+++
+++ case '-':
+++ if (neg_op)
+++ retval.result->append8(retval.result, " >= ");
+++ else
+++ retval.result->append8(retval.result, " < ");
+++ break;
+++
+++ case '%':
+++ retval.result->append8(retval.result, " LIKE ");
+++ break;
+++
+++ default:
+++ if (neg_op)
+++ DPRINTF(E_LOG, L_DAAP, "Missing or unknown operator '%c' in clause '%s!%c%s'\n", op, field, op, val);
+++ else
+++ DPRINTF(E_LOG, L_DAAP, "Unknown operator '%c' in clause '%s%c%s'\n", op, field, op, val);
+++ retval.valid= 0;
+++ goto STR_result_valid_0; /* ABORT */
+++ break;
+++ }
+++
+++ if (!dqfm->as_int)
+++ retval.result->append8(retval.result, "'");
+++
+++ retval.result->append8(retval.result, (const char *)val);
+++
+++ if (!dqfm->as_int)
+++ retval.result->append8(retval.result, "'");
+++
+++ /* For empty string value, we need to check against NULL too */
+++ if ((*val == '\0') && (op == ':'))
+++ {
+++ if (neg_op)
+++ retval.result->append8(retval.result, " AND ");
+++ else
+++ retval.result->append8(retval.result, " OR ");
+++
+++ retval.result->append8(retval.result, dqfm->db_col);
+++
+++ if (neg_op)
+++ retval.result->append8(retval.result, " IS NOT NULL");
+++ else
+++ retval.result->append8(retval.result, " IS NULL");
+++
+++ retval.result->append8(retval.result, ")");
+++ }
+++
+++ STR_result_valid_0: /* bail out label */
+++ ;
+++
+++ if (escaped)
+++ free(escaped);
+++
+++ STR_out: /* get out of here */
+++ ;
+++
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleexprEx; /* Prevent compiler warnings */
+++ ruleexprEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end expr */
+++/* End of parsing rules
+++ * ==============================================
+++ */
+++
+++/* ==============================================
+++ * Syntactic predicates
+++ */
+++/* End of syntactic predicates
+++ * ==============================================
+++ */
+++
+++
+++
+++
+++
+++
+++/* End of code
+++ * =============================================================================
+++ */
++diff --git a/src/pregen/DAAP2SQL.h b/src/pregen/DAAP2SQL.h
++new file mode 100644
++index 0000000..2b1e806
++--- /dev/null
+++++ b/src/pregen/DAAP2SQL.h
++@@ -0,0 +1,195 @@
+++/** \file
+++ * This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : DAAP2SQL.g
+++ * - On : 2015-06-27 19:05:20
+++ * - for the tree parser : DAAP2SQLTreeParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++ * The tree parser DAAP2SQL has the callable functions (rules) shown below,
+++ * which will invoke the code for the associated rule in the source grammar
+++ * assuming that the input stream is pointing to a token/text stream that could begin
+++ * this rule.
+++ *
+++ * For instance if you call the first (topmost) rule in a parser grammar, you will
+++ * get the results of a full parse, but calling a rule half way through the grammar will
+++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
+++ * in editors and so on.
+++ *
+++ * The parser entry points are called indirectly (by function pointer to function) via
+++ * a parser context typedef pDAAP2SQL, which is returned from a call to DAAP2SQLNew().
+++ *
+++ * The methods in pDAAP2SQL are as follows:
+++ *
+++ * - pANTLR3_STRING pDAAP2SQL->query(pDAAP2SQL)
+++ * - DAAP2SQL_expr_return pDAAP2SQL->expr(pDAAP2SQL)
+++ *
+++ * The return type for any particular rule is of course determined by the source
+++ * grammar file.
+++ */
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++#ifndef _DAAP2SQL_H
+++#define _DAAP2SQL_H
+++/* =============================================================================
+++ * Standard antlr3 C runtime definitions
+++ */
+++#include <antlr3.h>
+++
+++/* End of standard antlr 3 runtime definitions
+++ * =============================================================================
+++ */
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++// Forward declare the context typedef so that we can use it before it is
+++// properly defined. Delegators and delegates (from import statements) are
+++// interdependent and their context structures contain pointers to each other
+++// C only allows such things to be declared if you pre-declare the typedef.
+++//
+++typedef struct DAAP2SQL_Ctx_struct DAAP2SQL, * pDAAP2SQL;
+++
+++
+++
+++ #include <stdio.h>
+++ #include <stdlib.h>
+++ #include <string.h>
+++ #include <limits.h>
+++ #include <errno.h>
+++
+++ #include "logger.h"
+++ #include "db.h"
+++ #include "daap_query.h"
+++
+++
+++#ifdef ANTLR3_WINDOWS
+++// Disable: Unreferenced parameter, - Rules with parameters that are not used
+++// constant conditional, - ANTLR realizes that a prediction is always true (synpred usually)
+++// initialized but unused variable - tree rewrite variables declared but not needed
+++// Unreferenced local variable - lexer rule declares but does not always use _type
+++// potentially unitialized variable used - retval always returned from a rule
+++// unreferenced local function has been removed - susually getTokenNames or freeScope, they can go without warnigns
+++//
+++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
+++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
+++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
+++// this is a matter of orthogonality hence I disable that one.
+++//
+++#pragma warning( disable : 4100 )
+++#pragma warning( disable : 4101 )
+++#pragma warning( disable : 4127 )
+++#pragma warning( disable : 4189 )
+++#pragma warning( disable : 4505 )
+++#pragma warning( disable : 4701 )
+++#endif
+++typedef struct DAAP2SQL_expr_return_struct
+++{
+++ pANTLR3_BASE_TREE start;
+++ pANTLR3_BASE_TREE stop;
+++ pANTLR3_STRING result;
+++ int valid;
+++}
+++ DAAP2SQL_expr_return;
+++
+++
+++
+++/** Context tracking structure for DAAP2SQL
+++ */
+++struct DAAP2SQL_Ctx_struct
+++{
+++ /** Built in ANTLR3 context tracker contains all the generic elements
+++ * required for context tracking.
+++ */
+++ pANTLR3_TREE_PARSER pTreeParser;
+++
+++
+++ pANTLR3_STRING (*query) (struct DAAP2SQL_Ctx_struct * ctx);
+++ DAAP2SQL_expr_return (*expr) (struct DAAP2SQL_Ctx_struct * ctx);
+++ // Delegated rules
+++ const char * (*getGrammarFileName)();
+++ void (*free) (struct DAAP2SQL_Ctx_struct * ctx);
+++
+++};
+++
+++// Function protoypes for the constructor functions that external translation units
+++// such as delegators and delegates may wish to call.
+++//
+++ANTLR3_API pDAAP2SQL DAAP2SQLNew (pANTLR3_COMMON_TREE_NODE_STREAM instream);
+++ANTLR3_API pDAAP2SQL DAAP2SQLNewSSD (pANTLR3_COMMON_TREE_NODE_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
+++
+++/** Symbolic definitions of all the tokens that the tree parser will work with.
+++ * \{
+++ *
+++ * Antlr will define EOF, but we can't use that as it it is too common in
+++ * in C header files and that would be confusing. There is no way to filter this out at the moment
+++ * so we just undef it here for now. That isn't the value we get back from C recognizers
+++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
+++ */
+++#ifdef EOF
+++#undef EOF
+++#endif
+++#ifdef Tokens
+++#undef Tokens
+++#endif
+++#define STR 9
+++#define QUOTE 10
+++#define NEWLINE 4
+++#define LPAR 7
+++#define OPOR 5
+++#define RPAR 8
+++#define ESCAPED 11
+++#define OPAND 6
+++#define EOF -1
+++#ifdef EOF
+++#undef EOF
+++#define EOF ANTLR3_TOKEN_EOF
+++#endif
+++
+++#ifndef TOKENSOURCE
+++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
+++#endif
+++
+++/* End of token definitions for DAAP2SQL
+++ * =============================================================================
+++ */
+++/** \} */
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif
+++
+++/* END - Note:Keep extra line feed to satisfy UNIX systems */
++diff --git a/src/pregen/DAAP2SQL.u b/src/pregen/DAAP2SQL.u
++new file mode 100644
++index 0000000..385d80b
++--- /dev/null
+++++ b/src/pregen/DAAP2SQL.u
++@@ -0,0 +1,5 @@
+++DAAP2SQL.g: DAAP.tokens
+++DAAP2SQL.c : DAAP2SQL.g
+++./DAAP2SQL.tokens : DAAP2SQL.g
+++DAAP2SQL.h : DAAP2SQL.g
+++ANTLR_PRODUCTS += DAAP2SQL.c ./DAAP2SQL.tokens DAAP2SQL.h
++\ No newline at end of file
++diff --git a/src/pregen/DAAPLexer.c b/src/pregen/DAAPLexer.c
++new file mode 100644
++index 0000000..b72f28a
++--- /dev/null
+++++ b/src/pregen/DAAPLexer.c
++@@ -0,0 +1,1101 @@
+++/** \file
+++ * This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : DAAP.g
+++ * - On : 2015-06-27 19:05:17
+++ * - for the lexer : DAAPLexerLexer *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++*/
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++/* -----------------------------------------
+++ * Include the ANTLR3 generated header file.
+++ */
+++#include "DAAPLexer.h"
+++/* ----------------------------------------- */
+++
+++
+++
+++
+++
+++/* MACROS that hide the C interface implementations from the
+++ * generated code, which makes it a little more understandable to the human eye.
+++ * I am very much against using C pre-processor macros for function calls and bits
+++ * of code as you cannot see what is happening when single stepping in debuggers
+++ * and so on. The exception (in my book at least) is for generated code, where you are
+++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
+++ * hides some indirect calls, but is always referring to the input stream. This is
+++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
+++ * the runtime interfaces without changing the generated code too often, without
+++ * confusing the reader of the generated output, who may not wish to know the gory
+++ * details of the interface inheritance.
+++ */
+++
+++#define CTX ctx
+++
+++/* Aids in accessing scopes for grammar programmers
+++ */
+++#undef SCOPE_TYPE
+++#undef SCOPE_STACK
+++#undef SCOPE_TOP
+++#define SCOPE_TYPE(scope) pDAAPLexer_##scope##_SCOPE
+++#define SCOPE_STACK(scope) pDAAPLexer_##scope##Stack
+++#define SCOPE_TOP(scope) ctx->pDAAPLexer_##scope##Top
+++#define SCOPE_SIZE(scope) ctx->pDAAPLexer_##scope##Stack_limit
+++#define SCOPE_INSTANCE(scope, i) (ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
+++
+++
+++/* Macros for accessing things in a lexer
+++ */
+++#undef LEXER
+++#undef RECOGNIZER
+++#undef RULEMEMO
+++#undef GETCHARINDEX
+++#undef GETLINE
+++#undef GETCHARPOSITIONINLINE
+++#undef EMIT
+++#undef EMITNEW
+++#undef MATCHC
+++#undef MATCHS
+++#undef MATCHRANGE
+++#undef LTOKEN
+++#undef HASFAILED
+++#undef FAILEDFLAG
+++#undef INPUT
+++#undef STRSTREAM
+++#undef LA
+++#undef HASEXCEPTION
+++#undef EXCEPTION
+++#undef CONSTRUCTEX
+++#undef CONSUME
+++#undef LRECOVER
+++#undef MARK
+++#undef REWIND
+++#undef REWINDLAST
+++#undef BACKTRACKING
+++#undef MATCHANY
+++#undef MEMOIZE
+++#undef HAVEPARSEDRULE
+++#undef GETTEXT
+++#undef INDEX
+++#undef SEEK
+++#undef PUSHSTREAM
+++#undef POPSTREAM
+++#undef SETTEXT
+++#undef SETTEXT8
+++
+++#define LEXER ctx->pLexer
+++#define RECOGNIZER LEXER->rec
+++#define LEXSTATE RECOGNIZER->state
+++#define TOKSOURCE LEXSTATE->tokSource
+++#define GETCHARINDEX() LEXER->getCharIndex(LEXER)
+++#define GETLINE() LEXER->getLine(LEXER)
+++#define GETTEXT() LEXER->getText(LEXER)
+++#define GETCHARPOSITIONINLINE() LEXER->getCharPositionInLine(LEXER)
+++#define EMIT() LEXSTATE->type = _type; LEXER->emit(LEXER)
+++#define EMITNEW(t) LEXER->emitNew(LEXER, t)
+++#define MATCHC(c) LEXER->matchc(LEXER, c)
+++#define MATCHS(s) LEXER->matchs(LEXER, s)
+++#define MATCHRANGE(c1,c2) LEXER->matchRange(LEXER, c1, c2)
+++#define MATCHANY() LEXER->matchAny(LEXER)
+++#define LTOKEN LEXSTATE->token
+++#define HASFAILED() (LEXSTATE->failed == ANTLR3_TRUE)
+++#define BACKTRACKING LEXSTATE->backtracking
+++#define FAILEDFLAG LEXSTATE->failed
+++#define INPUT LEXER->input
+++#define STRSTREAM INPUT
+++#define ISTREAM INPUT->istream
+++#define INDEX() ISTREAM->index(ISTREAM)
+++#define SEEK(n) ISTREAM->seek(ISTREAM, n)
+++#define EOF_TOKEN &(LEXSTATE->tokSource->eofToken)
+++#define HASEXCEPTION() (LEXSTATE->error == ANTLR3_TRUE)
+++#define EXCEPTION LEXSTATE->exception
+++#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER)
+++#define LRECOVER() LEXER->recover(LEXER)
+++#define MARK() ISTREAM->mark(ISTREAM)
+++#define REWIND(m) ISTREAM->rewind(ISTREAM, m)
+++#define REWINDLAST() ISTREAM->rewindLast(ISTREAM)
+++#define MEMOIZE(ri,si) RECOGNIZER->memoize(RECOGNIZER, ri, si)
+++#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
+++#define PUSHSTREAM(str) LEXER->pushCharStream(LEXER, str)
+++#define POPSTREAM() LEXER->popCharStream(LEXER)
+++#define SETTEXT(str) LEXSTATE->text = str
+++#define SKIP() LEXSTATE->token = &(TOKSOURCE->skipToken)
+++#define USER1 LEXSTATE->user1
+++#define USER2 LEXSTATE->user2
+++#define USER3 LEXSTATE->user3
+++#define CUSTOM LEXSTATE->custom
+++#define RULEMEMO LEXSTATE->ruleMemo
+++#define DBG RECOGNIZER->debugger
+++
+++/* If we have been told we can rely on the standard 8 bit or 16 bit input
+++ * stream, then we can define our macros to use the direct pointers
+++ * in the input object, which is much faster than indirect calls. This
+++ * is really only significant to lexers with a lot of fragment rules (which
+++ * do not place LA(1) in a temporary at the moment) and even then
+++ * only if there is a lot of input (order of say 1M or so).
+++ */
+++#if defined(ANTLR3_INLINE_INPUT_ASCII) || defined(ANTLR3_INLINE_INPUT_UTF16)
+++
+++# ifdef ANTLR3_INLINE_INPUT_ASCII
+++
+++/* 8 bit "ASCII" (actually any 8 bit character set) */
+++
+++# define NEXTCHAR ((pANTLR3_UINT8)(INPUT->nextChar))
+++# define DATAP ((pANTLR3_UINT8)(INPUT->data))
+++
+++# else
+++
+++# define NEXTCHAR ((pANTLR3_UINT16)(INPUT->nextChar))
+++# define DATAP ((pANTLR3_UINT16)(INPUT->data))
+++
+++# endif
+++
+++# define LA(n) ((NEXTCHAR + n) > (DATAP + INPUT->sizeBuf) ? ANTLR3_CHARSTREAM_EOF : (ANTLR3_UCHAR)(*(NEXTCHAR + n - 1)))
+++# define CONSUME() \
+++{ \
+++ if (NEXTCHAR < (DATAP + INPUT->sizeBuf)) \
+++ { \
+++ INPUT->charPositionInLine++; \
+++ if ((ANTLR3_UCHAR)(*NEXTCHAR) == INPUT->newlineChar) \
+++ { \
+++ INPUT->line++; \
+++ INPUT->charPositionInLine = 0; \
+++ INPUT->currentLine = (void *)(NEXTCHAR + 1); \
+++ } \
+++ INPUT->nextChar = (void *)(NEXTCHAR + 1); \
+++ } \
+++}
+++
+++#else
+++
+++// Pick up the input character by calling the input stream implementation.
+++//
+++#define CONSUME() INPUT->istream->consume(INPUT->istream)
+++#define LA(n) INPUT->istream->_LA(INPUT->istream, n)
+++
+++#endif
+++#define TOKTEXT(tok, txt) tok, (pANTLR3_UINT8)txt
+++
+++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
+++ * then for the present you must use different names for your defines as these are hard coded
+++ * in the code generator. It would be better not to use such names internally, and maybe
+++ * we can change this in a forthcoming release. I deliberately do not #undef these
+++ * here as this will at least give you a redefined error somewhere if they clash.
+++ */
+++#define UP ANTLR3_TOKEN_UP
+++#define DOWN ANTLR3_TOKEN_DOWN
+++#define EOR ANTLR3_TOKEN_EOR
+++#define INVALID ANTLR3_TOKEN_INVALID
+++
+++
+++/* =============================================================================
+++ * Functions to create and destroy scopes. First come the rule scopes, followed
+++ * by the global declared scopes.
+++ */
+++
+++
+++
+++/* ============================================================================= */
+++
+++/* =============================================================================
+++ * Start of recognizer
+++ */
+++
+++
+++/* Forward declare the locally static matching functions we have generated and any predicate functions.
+++ */
+++static ANTLR3_INLINE void mQUOTE (pDAAPLexer ctx);
+++static ANTLR3_INLINE void mLPAR (pDAAPLexer ctx);
+++static ANTLR3_INLINE void mRPAR (pDAAPLexer ctx);
+++static ANTLR3_INLINE void mOPAND (pDAAPLexer ctx);
+++static ANTLR3_INLINE void mOPOR (pDAAPLexer ctx);
+++static ANTLR3_INLINE void mNEWLINE (pDAAPLexer ctx);
+++static ANTLR3_INLINE void mSTR (pDAAPLexer ctx);
+++static ANTLR3_INLINE void mESCAPED (pDAAPLexer ctx);
+++static ANTLR3_INLINE void mTokens (pDAAPLexer ctx);
+++static void DAAPLexerFree(pDAAPLexer ctx);
+++
+++/* =========================================================================
+++ * Lexer matching rules end.
+++ * =========================================================================
+++ */
+++
+++
+++
+++static void
+++DAAPLexerFree (pDAAPLexer ctx)
+++{
+++ LEXER->free(LEXER);
+++
+++ ANTLR3_FREE(ctx);
+++}
+++
+++/** \brief Name of the grammar file that generated this code
+++ */
+++static const char fileName[] = "DAAP.g";
+++
+++/** \brief Return the name of the grammar file that generated this code.
+++ */
+++static const char * getGrammarFileName()
+++{
+++ return fileName;
+++}
+++
+++/** \brief Create a new lexer called DAAPLexer
+++ *
+++ * \param[in] instream Pointer to an initialized input stream
+++ * \return
+++ * - Success pDAAPLexer initialized for the lex start
+++ * - Fail NULL
+++ */
+++ANTLR3_API pDAAPLexer DAAPLexerNew
+++(pANTLR3_INPUT_STREAM instream)
+++{
+++ // See if we can create a new lexer with the standard constructor
+++ //
+++ return DAAPLexerNewSSD(instream, NULL);
+++}
+++
+++/** \brief Create a new lexer called DAAPLexer
+++ *
+++ * \param[in] instream Pointer to an initialized input stream
+++ * \param[state] state Previously created shared recognizer stat
+++ * \return
+++ * - Success pDAAPLexer initialized for the lex start
+++ * - Fail NULL
+++ */
+++ANTLR3_API pDAAPLexer DAAPLexerNewSSD
+++(pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
+++{
+++ pDAAPLexer ctx; // Context structure we will build and return
+++
+++ ctx = (pDAAPLexer) ANTLR3_CALLOC(1, sizeof(DAAPLexer));
+++
+++ if (ctx == NULL)
+++ {
+++ // Failed to allocate memory for lexer context
+++ return NULL;
+++ }
+++
+++ /* -------------------------------------------------------------------
+++ * Memory for basic structure is allocated, now to fill in
+++ * in base ANTLR3 structures. We initialize the function pointers
+++ * for the standard ANTLR3 lexer function set, but upon return
+++ * from here, the programmer may set the pointers to provide custom
+++ * implementations of each function.
+++ *
+++ * We don't use the macros defined in DAAPLexer.h here so you can get a sense
+++ * of what goes where.
+++ */
+++
+++ /* Create a base lexer, using the supplied input stream
+++ */
+++ ctx->pLexer = antlr3LexerNewStream(ANTLR3_SIZE_HINT, instream, state);
+++
+++ /* Check that we allocated the memory correctly
+++ */
+++ if (ctx->pLexer == NULL)
+++ {
+++ ANTLR3_FREE(ctx);
+++ return NULL;
+++ }
+++ /* Install the implementation of our DAAPLexer interface
+++ */
+++ ctx->mQUOTE = mQUOTE;
+++ ctx->mLPAR = mLPAR;
+++ ctx->mRPAR = mRPAR;
+++ ctx->mOPAND = mOPAND;
+++ ctx->mOPOR = mOPOR;
+++ ctx->mNEWLINE = mNEWLINE;
+++ ctx->mSTR = mSTR;
+++ ctx->mESCAPED = mESCAPED;
+++ ctx->mTokens = mTokens;
+++
+++ /** When the nextToken() call is made to this lexer's pANTLR3_TOKEN_SOURCE
+++ * it will call mTokens() in this generated code, and will pass it the ctx
+++ * pointer of this lexer, not the context of the base lexer, so store that now.
+++ */
+++ ctx->pLexer->ctx = ctx;
+++
+++ /**Install the token matching function
+++ */
+++ ctx->pLexer->mTokens = (void (*) (void *))(mTokens);
+++
+++ ctx->getGrammarFileName = getGrammarFileName;
+++ ctx->free = DAAPLexerFree;
+++
+++
+++
+++
+++
+++ /* Return the newly built lexer to the caller
+++ */
+++ return ctx;
+++}
+++
+++
+++/* =========================================================================
+++ * Functions to match the lexer grammar defined tokens from the input stream
+++ */
+++
+++// Comes from: 40:7: ( '\\'' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start QUOTE
+++ *
+++ * Looks to match the characters the constitute the token QUOTE
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mQUOTE(pDAAPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = QUOTE;
+++
+++
+++ // DAAP.g:40:7: ( '\\'' )
+++ // DAAP.g:40:9: '\\''
+++ {
+++ MATCHC('\'');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleQUOTEEx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleQUOTEEx; /* Prevent compiler warnings */
+++ ruleQUOTEEx: ;
+++
+++}
+++// $ANTLR end QUOTE
+++
+++// Comes from: 41:6: ( '(' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start LPAR
+++ *
+++ * Looks to match the characters the constitute the token LPAR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mLPAR(pDAAPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = LPAR;
+++
+++
+++ // DAAP.g:41:6: ( '(' )
+++ // DAAP.g:41:8: '('
+++ {
+++ MATCHC('(');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleLPAREx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleLPAREx; /* Prevent compiler warnings */
+++ ruleLPAREx: ;
+++
+++}
+++// $ANTLR end LPAR
+++
+++// Comes from: 42:6: ( ')' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start RPAR
+++ *
+++ * Looks to match the characters the constitute the token RPAR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mRPAR(pDAAPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = RPAR;
+++
+++
+++ // DAAP.g:42:6: ( ')' )
+++ // DAAP.g:42:8: ')'
+++ {
+++ MATCHC(')');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleRPAREx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleRPAREx; /* Prevent compiler warnings */
+++ ruleRPAREx: ;
+++
+++}
+++// $ANTLR end RPAR
+++
+++// Comes from: 44:7: ( '+' | ' ' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start OPAND
+++ *
+++ * Looks to match the characters the constitute the token OPAND
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mOPAND(pDAAPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = OPAND;
+++
+++
+++ // DAAP.g:44:7: ( '+' | ' ' )
+++ // DAAP.g:
+++ {
+++ if ( LA(1) == ' ' || LA(1) == '+' )
+++ {
+++ CONSUME();
+++
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++
+++ LRECOVER(); goto ruleOPANDEx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleOPANDEx; /* Prevent compiler warnings */
+++ ruleOPANDEx: ;
+++
+++}
+++// $ANTLR end OPAND
+++
+++// Comes from: 45:6: ( ',' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start OPOR
+++ *
+++ * Looks to match the characters the constitute the token OPOR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mOPOR(pDAAPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = OPOR;
+++
+++
+++ // DAAP.g:45:6: ( ',' )
+++ // DAAP.g:45:8: ','
+++ {
+++ MATCHC(',');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleOPOREx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleOPOREx; /* Prevent compiler warnings */
+++ ruleOPOREx: ;
+++
+++}
+++// $ANTLR end OPOR
+++
+++// Comes from: 47:9: ( ( '\\r' )? '\\n' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start NEWLINE
+++ *
+++ * Looks to match the characters the constitute the token NEWLINE
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mNEWLINE(pDAAPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = NEWLINE;
+++
+++
+++ // DAAP.g:47:9: ( ( '\\r' )? '\\n' )
+++ // DAAP.g:47:11: ( '\\r' )? '\\n'
+++ {
+++
+++ // DAAP.g:47:11: ( '\\r' )?
+++ {
+++ int alt1=2;
+++ switch ( LA(1) )
+++ {
+++ case '\r':
+++ {
+++ alt1=1;
+++ }
+++ break;
+++ }
+++
+++ switch (alt1)
+++ {
+++ case 1:
+++ // DAAP.g:47:11: '\\r'
+++ {
+++ MATCHC('\r');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleNEWLINEEx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ MATCHC('\n');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleNEWLINEEx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleNEWLINEEx; /* Prevent compiler warnings */
+++ ruleNEWLINEEx: ;
+++
+++}
+++// $ANTLR end NEWLINE
+++
+++// Comes from: 55:2: ( QUOTE (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+ QUOTE )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start STR
+++ *
+++ * Looks to match the characters the constitute the token STR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mSTR(pDAAPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++ pANTLR3_COMMON_TOKEN esc;
+++ ANTLR3_UINT32 reg;
+++
+++
+++ esc = NULL;
+++
+++ _type = STR;
+++
+++ pANTLR3_STRING unesc = GETTEXT()->factory->newRaw(GETTEXT()->factory);
+++
+++ // DAAP.g:55:2: ( QUOTE (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+ QUOTE )
+++ // DAAP.g:55:4: QUOTE (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+ QUOTE
+++ {
+++ /* 55:4: QUOTE (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+ QUOTE */
+++ mQUOTE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTREx;
+++ }
+++
+++ // DAAP.g:55:10: (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+
+++ {
+++ int cnt2=0;
+++
+++ for (;;)
+++ {
+++ int alt2=3;
+++ {
+++ /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
+++ */
+++ int LA2_0 = LA(1);
+++ if ( (((LA2_0 >= 0x0000) && (LA2_0 <= '&')) || ((LA2_0 >= '(') && (LA2_0 <= '[')) || ((LA2_0 >= ']') && (LA2_0 <= 0xFFFF))) )
+++ {
+++ alt2=1;
+++ }
+++ else if ( (LA2_0 == '\\') )
+++ {
+++ alt2=2;
+++ }
+++
+++ }
+++ switch (alt2)
+++ {
+++ case 1:
+++ // DAAP.g:55:12: reg=~ ( '\\\\' | '\\'' )
+++ {
+++ reg= LA(1);
+++ if ( ((LA(1) >= 0x0000) && (LA(1) <= '&')) || ((LA(1) >= '(') && (LA(1) <= '[')) || ((LA(1) >= ']') && (LA(1) <= 0xFFFF)) )
+++ {
+++ CONSUME();
+++
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++
+++ LRECOVER(); goto ruleSTREx;
+++ }
+++
+++ {
+++ unesc->addc(unesc, reg);
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // DAAP.g:56:6: esc= ESCAPED
+++ {
+++ /* 56:6: esc= ESCAPED */
+++ {
+++ ANTLR3_MARKER escStart118 = GETCHARINDEX();
+++ mESCAPED(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTREx;
+++ }
+++
+++ esc = LEXSTATE->tokFactory->newToken(LEXSTATE->tokFactory);
+++ esc->setType(esc, ANTLR3_TOKEN_INVALID);
+++ esc->setStartIndex(esc, escStart118);
+++ esc->setStopIndex(esc, GETCHARINDEX()-1);
+++ esc->input = INPUT;
+++ }
+++ {
+++ unesc->appendS(unesc, GETTEXT());
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++
+++ if ( cnt2 >= 1 )
+++ {
+++ goto loop2;
+++ }
+++ /* mismatchedSetEx()
+++ */
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;
+++
+++
+++ goto ruleSTREx;
+++ }
+++ cnt2++;
+++ }
+++ loop2: ; /* Jump to here if this rule does not match */
+++ }
+++ /* 55:4: QUOTE (reg=~ ( '\\\\' | '\\'' ) | esc= ESCAPED )+ QUOTE */
+++ mQUOTE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTREx;
+++ }
+++
+++ {
+++ SETTEXT(unesc);
+++ }
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleSTREx; /* Prevent compiler warnings */
+++ ruleSTREx: ;
+++
+++ esc = NULL;
+++
+++}
+++// $ANTLR end STR
+++
+++// Comes from: 59:9: ( '\\\\' ( '\\\\' | '\\'' ) )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start ESCAPED
+++ *
+++ * Looks to match the characters the constitute the token ESCAPED
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mESCAPED(pDAAPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++
+++ // DAAP.g:59:9: ( '\\\\' ( '\\\\' | '\\'' ) )
+++ // DAAP.g:59:11: '\\\\' ( '\\\\' | '\\'' )
+++ {
+++ MATCHC('\\');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleESCAPEDEx;
+++ }
+++
+++
+++ // DAAP.g:60:3: ( '\\\\' | '\\'' )
+++ {
+++ int alt3=2;
+++ switch ( LA(1) )
+++ {
+++ case '\\':
+++ {
+++ alt3=1;
+++ }
+++ break;
+++ case '\'':
+++ {
+++ alt3=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleESCAPEDEx;
+++ }
+++
+++ switch (alt3)
+++ {
+++ case 1:
+++ // DAAP.g:60:5: '\\\\'
+++ {
+++ MATCHC('\\');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleESCAPEDEx;
+++ }
+++
+++ {
+++ SETTEXT(GETTEXT()->factory->newStr8(GETTEXT()->factory, (pANTLR3_UINT8)"\\"));
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // DAAP.g:61:5: '\\''
+++ {
+++ MATCHC('\'');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleESCAPEDEx;
+++ }
+++
+++ {
+++ SETTEXT(GETTEXT()->factory->newStr8(GETTEXT()->factory, (pANTLR3_UINT8)"\'"));
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++
+++ }
+++
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleESCAPEDEx; /* Prevent compiler warnings */
+++ ruleESCAPEDEx: ;
+++
+++}
+++// $ANTLR end ESCAPED
+++
+++/** This is the entry point in to the lexer from an object that
+++ * wants to generate the next token, such as a pCOMMON_TOKEN_STREAM
+++ */
+++static void
+++mTokens(pDAAPLexer ctx)
+++{
+++ {
+++ // DAAP.g:1:8: ( QUOTE | LPAR | RPAR | OPAND | OPOR | NEWLINE | STR )
+++
+++ ANTLR3_UINT32 alt4;
+++
+++ alt4=7;
+++
+++ switch ( LA(1) )
+++ {
+++ case '\'':
+++ {
+++
+++ {
+++ int LA4_1 = LA(2);
+++ if ( (((LA4_1 >= 0x0000) && (LA4_1 <= '&')) || ((LA4_1 >= '(') && (LA4_1 <= 0xFFFF))) )
+++ {
+++ alt4=7;
+++ }
+++ else
+++ {
+++ alt4=1; }
+++ }
+++ }
+++ break;
+++ case '(':
+++ {
+++ alt4=2;
+++ }
+++ break;
+++ case ')':
+++ {
+++ alt4=3;
+++ }
+++ break;
+++ case ' ':
+++ case '+':
+++ {
+++ alt4=4;
+++ }
+++ break;
+++ case ',':
+++ {
+++ alt4=5;
+++ }
+++ break;
+++ case '\n':
+++ case '\r':
+++ {
+++ alt4=6;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ switch (alt4)
+++ {
+++ case 1:
+++ // DAAP.g:1:10: QUOTE
+++ {
+++ /* 1:10: QUOTE */
+++ mQUOTE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // DAAP.g:1:16: LPAR
+++ {
+++ /* 1:16: LPAR */
+++ mLPAR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // DAAP.g:1:21: RPAR
+++ {
+++ /* 1:21: RPAR */
+++ mRPAR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 4:
+++ // DAAP.g:1:26: OPAND
+++ {
+++ /* 1:26: OPAND */
+++ mOPAND(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 5:
+++ // DAAP.g:1:32: OPOR
+++ {
+++ /* 1:32: OPOR */
+++ mOPOR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 6:
+++ // DAAP.g:1:37: NEWLINE
+++ {
+++ /* 1:37: NEWLINE */
+++ mNEWLINE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 7:
+++ // DAAP.g:1:45: STR
+++ {
+++ /* 1:45: STR */
+++ mSTR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++
+++
+++ goto ruleTokensEx; /* Prevent compiler warnings */
+++ruleTokensEx: ;
+++}
+++
+++/* =========================================================================
+++ * Lexer matching rules end.
+++ * =========================================================================
+++ */
+++/* End of Lexer code
+++ * ================================================
+++ * ================================================
+++ */
+++
+++
+++/* End of code
+++ * =============================================================================
+++ */
++diff --git a/src/pregen/DAAPLexer.h b/src/pregen/DAAPLexer.h
++new file mode 100644
++index 0000000..401b214
++--- /dev/null
+++++ b/src/pregen/DAAPLexer.h
++@@ -0,0 +1,188 @@
+++/** \file
+++ * This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : DAAP.g
+++ * - On : 2015-06-27 19:05:17
+++ * - for the lexer : DAAPLexerLexer *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++ * The lexer DAAPLexer has the callable functions (rules) shown below,
+++ * which will invoke the code for the associated rule in the source grammar
+++ * assuming that the input stream is pointing to a token/text stream that could begin
+++ * this rule.
+++ *
+++ * For instance if you call the first (topmost) rule in a parser grammar, you will
+++ * get the results of a full parse, but calling a rule half way through the grammar will
+++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
+++ * in editors and so on.
+++ *
+++ * The parser entry points are called indirectly (by function pointer to function) via
+++ * a parser context typedef pDAAPLexer, which is returned from a call to DAAPLexerNew().
+++ *
+++ * As this is a generated lexer, it is unlikely you will call it 'manually'. However
+++ * the methods are provided anyway.
+++ * * The methods in pDAAPLexer are as follows:
+++ *
+++ * - void pDAAPLexer->QUOTE(pDAAPLexer)
+++ * - void pDAAPLexer->LPAR(pDAAPLexer)
+++ * - void pDAAPLexer->RPAR(pDAAPLexer)
+++ * - void pDAAPLexer->OPAND(pDAAPLexer)
+++ * - void pDAAPLexer->OPOR(pDAAPLexer)
+++ * - void pDAAPLexer->NEWLINE(pDAAPLexer)
+++ * - void pDAAPLexer->STR(pDAAPLexer)
+++ * - void pDAAPLexer->ESCAPED(pDAAPLexer)
+++ * - void pDAAPLexer->Tokens(pDAAPLexer)
+++ *
+++ * The return type for any particular rule is of course determined by the source
+++ * grammar file.
+++ */
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++#ifndef _DAAPLexer_H
+++#define _DAAPLexer_H
+++/* =============================================================================
+++ * Standard antlr3 C runtime definitions
+++ */
+++#include <antlr3.h>
+++
+++/* End of standard antlr 3 runtime definitions
+++ * =============================================================================
+++ */
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++// Forward declare the context typedef so that we can use it before it is
+++// properly defined. Delegators and delegates (from import statements) are
+++// interdependent and their context structures contain pointers to each other
+++// C only allows such things to be declared if you pre-declare the typedef.
+++//
+++typedef struct DAAPLexer_Ctx_struct DAAPLexer, * pDAAPLexer;
+++
+++
+++
+++#ifdef ANTLR3_WINDOWS
+++// Disable: Unreferenced parameter, - Rules with parameters that are not used
+++// constant conditional, - ANTLR realizes that a prediction is always true (synpred usually)
+++// initialized but unused variable - tree rewrite variables declared but not needed
+++// Unreferenced local variable - lexer rule declares but does not always use _type
+++// potentially unitialized variable used - retval always returned from a rule
+++// unreferenced local function has been removed - susually getTokenNames or freeScope, they can go without warnigns
+++//
+++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
+++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
+++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
+++// this is a matter of orthogonality hence I disable that one.
+++//
+++#pragma warning( disable : 4100 )
+++#pragma warning( disable : 4101 )
+++#pragma warning( disable : 4127 )
+++#pragma warning( disable : 4189 )
+++#pragma warning( disable : 4505 )
+++#pragma warning( disable : 4701 )
+++#endif
+++
+++/** Context tracking structure for DAAPLexer
+++ */
+++struct DAAPLexer_Ctx_struct
+++{
+++ /** Built in ANTLR3 context tracker contains all the generic elements
+++ * required for context tracking.
+++ */
+++ pANTLR3_LEXER pLexer;
+++
+++
+++ void (*mQUOTE) (struct DAAPLexer_Ctx_struct * ctx);
+++ void (*mLPAR) (struct DAAPLexer_Ctx_struct * ctx);
+++ void (*mRPAR) (struct DAAPLexer_Ctx_struct * ctx);
+++ void (*mOPAND) (struct DAAPLexer_Ctx_struct * ctx);
+++ void (*mOPOR) (struct DAAPLexer_Ctx_struct * ctx);
+++ void (*mNEWLINE) (struct DAAPLexer_Ctx_struct * ctx);
+++ void (*mSTR) (struct DAAPLexer_Ctx_struct * ctx);
+++ void (*mESCAPED) (struct DAAPLexer_Ctx_struct * ctx);
+++ void (*mTokens) (struct DAAPLexer_Ctx_struct * ctx); const char * (*getGrammarFileName)();
+++ void (*free) (struct DAAPLexer_Ctx_struct * ctx);
+++
+++};
+++
+++// Function protoypes for the constructor functions that external translation units
+++// such as delegators and delegates may wish to call.
+++//
+++ANTLR3_API pDAAPLexer DAAPLexerNew (pANTLR3_INPUT_STREAM instream);
+++ANTLR3_API pDAAPLexer DAAPLexerNewSSD (pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
+++
+++/** Symbolic definitions of all the tokens that the lexer will work with.
+++ * \{
+++ *
+++ * Antlr will define EOF, but we can't use that as it it is too common in
+++ * in C header files and that would be confusing. There is no way to filter this out at the moment
+++ * so we just undef it here for now. That isn't the value we get back from C recognizers
+++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
+++ */
+++#ifdef EOF
+++#undef EOF
+++#endif
+++#ifdef Tokens
+++#undef Tokens
+++#endif
+++#define STR 9
+++#define QUOTE 10
+++#define NEWLINE 4
+++#define LPAR 7
+++#define OPOR 5
+++#define RPAR 8
+++#define ESCAPED 11
+++#define OPAND 6
+++#define EOF -1
+++#ifdef EOF
+++#undef EOF
+++#define EOF ANTLR3_TOKEN_EOF
+++#endif
+++
+++#ifndef TOKENSOURCE
+++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
+++#endif
+++
+++/* End of token definitions for DAAPLexer
+++ * =============================================================================
+++ */
+++/** \} */
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif
+++
+++/* END - Note:Keep extra line feed to satisfy UNIX systems */
++diff --git a/src/pregen/DAAPParser.c b/src/pregen/DAAPParser.c
++new file mode 100644
++index 0000000..7a9aae9
++--- /dev/null
+++++ b/src/pregen/DAAPParser.c
++@@ -0,0 +1,1014 @@
+++/** \file
+++ * This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : DAAP.g
+++ * - On : 2015-06-27 19:05:16
+++ * - for the parser : DAAPParserParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++*/
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++/* -----------------------------------------
+++ * Include the ANTLR3 generated header file.
+++ */
+++#include "DAAPParser.h"
+++/* ----------------------------------------- */
+++
+++
+++
+++
+++
+++/* MACROS that hide the C interface implementations from the
+++ * generated code, which makes it a little more understandable to the human eye.
+++ * I am very much against using C pre-processor macros for function calls and bits
+++ * of code as you cannot see what is happening when single stepping in debuggers
+++ * and so on. The exception (in my book at least) is for generated code, where you are
+++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
+++ * hides some indirect calls, but is always referring to the input stream. This is
+++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
+++ * the runtime interfaces without changing the generated code too often, without
+++ * confusing the reader of the generated output, who may not wish to know the gory
+++ * details of the interface inheritance.
+++ */
+++
+++#define CTX ctx
+++
+++/* Aids in accessing scopes for grammar programmers
+++ */
+++#undef SCOPE_TYPE
+++#undef SCOPE_STACK
+++#undef SCOPE_TOP
+++#define SCOPE_TYPE(scope) pDAAPParser_##scope##_SCOPE
+++#define SCOPE_STACK(scope) pDAAPParser_##scope##Stack
+++#define SCOPE_TOP(scope) ctx->pDAAPParser_##scope##Top
+++#define SCOPE_SIZE(scope) ctx->pDAAPParser_##scope##Stack_limit
+++#define SCOPE_INSTANCE(scope, i) (ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
+++
+++/* Macros for accessing things in the parser
+++ */
+++
+++#undef PARSER
+++#undef RECOGNIZER
+++#undef HAVEPARSEDRULE
+++#undef MEMOIZE
+++#undef INPUT
+++#undef STRSTREAM
+++#undef HASEXCEPTION
+++#undef EXCEPTION
+++#undef MATCHT
+++#undef MATCHANYT
+++#undef FOLLOWSTACK
+++#undef FOLLOWPUSH
+++#undef FOLLOWPOP
+++#undef PRECOVER
+++#undef PREPORTERROR
+++#undef LA
+++#undef LT
+++#undef CONSTRUCTEX
+++#undef CONSUME
+++#undef MARK
+++#undef REWIND
+++#undef REWINDLAST
+++#undef PERRORRECOVERY
+++#undef HASFAILED
+++#undef FAILEDFLAG
+++#undef RECOVERFROMMISMATCHEDSET
+++#undef RECOVERFROMMISMATCHEDELEMENT
+++#undef INDEX
+++#undef ADAPTOR
+++#undef SEEK
+++#undef RULEMEMO
+++#undef DBG
+++
+++#define PARSER ctx->pParser
+++#define RECOGNIZER PARSER->rec
+++#define PSRSTATE RECOGNIZER->state
+++#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
+++#define MEMOIZE(ri,si) RECOGNIZER->memoize(RECOGNIZER, ri, si)
+++#define INPUT PARSER->tstream
+++#define STRSTREAM INPUT
+++#define ISTREAM INPUT->istream
+++#define INDEX() ISTREAM->index(INPUT->istream)
+++#define HASEXCEPTION() (PSRSTATE->error == ANTLR3_TRUE)
+++#define EXCEPTION PSRSTATE->exception
+++#define MATCHT(t, fs) RECOGNIZER->match(RECOGNIZER, t, fs)
+++#define MATCHANYT() RECOGNIZER->matchAny(RECOGNIZER)
+++#define FOLLOWSTACK PSRSTATE->following
+++#define FOLLOWPUSH(x) FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
+++#define FOLLOWPOP() FOLLOWSTACK->pop(FOLLOWSTACK)
+++#define PRECOVER() RECOGNIZER->recover(RECOGNIZER)
+++#define PREPORTERROR() RECOGNIZER->reportError(RECOGNIZER)
+++#define LA(n) INPUT->istream->_LA(ISTREAM, n)
+++#define LT(n) INPUT->_LT(INPUT, n)
+++#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER)
+++#define CONSUME() ISTREAM->consume(ISTREAM)
+++#define MARK() ISTREAM->mark(ISTREAM)
+++#define REWIND(m) ISTREAM->rewind(ISTREAM, m)
+++#define REWINDLAST() ISTREAM->rewindLast(ISTREAM)
+++#define SEEK(n) ISTREAM->seek(ISTREAM, n)
+++#define PERRORRECOVERY PSRSTATE->errorRecovery
+++#define FAILEDFLAG PSRSTATE->failed
+++#define HASFAILED() (FAILEDFLAG == ANTLR3_TRUE)
+++#define BACKTRACKING PSRSTATE->backtracking
+++#define RECOVERFROMMISMATCHEDSET(s) RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
+++#define RECOVERFROMMISMATCHEDELEMENT(e) RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
+++#define ADAPTOR ctx->adaptor
+++#define RULEMEMO PSRSTATE->ruleMemo
+++#define DBG RECOGNIZER->debugger
+++
+++#define TOKTEXT(tok, txt) tok, (pANTLR3_UINT8)txt
+++
+++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
+++ * then for the present you must use different names for your defines as these are hard coded
+++ * in the code generator. It would be better not to use such names internally, and maybe
+++ * we can change this in a forthcoming release. I deliberately do not #undef these
+++ * here as this will at least give you a redefined error somewhere if they clash.
+++ */
+++#define UP ANTLR3_TOKEN_UP
+++#define DOWN ANTLR3_TOKEN_DOWN
+++#define EOR ANTLR3_TOKEN_EOR
+++#define INVALID ANTLR3_TOKEN_INVALID
+++
+++
+++/* =============================================================================
+++ * Functions to create and destroy scopes. First come the rule scopes, followed
+++ * by the global declared scopes.
+++ */
+++
+++
+++
+++/* ============================================================================= */
+++
+++/* =============================================================================
+++ * Start of recognizer
+++ */
+++
+++
+++
+++/** \brief Table of all token names in symbolic order, mainly used for
+++ * error reporting.
+++ */
+++pANTLR3_UINT8 DAAPParserTokenNames[8+4]
+++ = {
+++ (pANTLR3_UINT8) "<invalid>", /* String to print to indicate an invalid token */
+++ (pANTLR3_UINT8) "<EOR>",
+++ (pANTLR3_UINT8) "<DOWN>",
+++ (pANTLR3_UINT8) "<UP>",
+++ (pANTLR3_UINT8) "NEWLINE",
+++ (pANTLR3_UINT8) "OPOR",
+++ (pANTLR3_UINT8) "OPAND",
+++ (pANTLR3_UINT8) "LPAR",
+++ (pANTLR3_UINT8) "RPAR",
+++ (pANTLR3_UINT8) "STR",
+++ (pANTLR3_UINT8) "QUOTE",
+++ (pANTLR3_UINT8) "ESCAPED"
+++ };
+++
+++
+++
+++// Forward declare the locally static matching functions we have generated.
+++//
+++static DAAPParser_query_return query (pDAAPParser ctx);
+++static DAAPParser_expr_return expr (pDAAPParser ctx);
+++static DAAPParser_aexpr_return aexpr (pDAAPParser ctx);
+++static DAAPParser_crit_return crit (pDAAPParser ctx);
+++static void DAAPParserFree(pDAAPParser ctx);
+++/* For use in tree output where we are accumulating rule labels via label += ruleRef
+++ * we need a function that knows how to free a return scope when the list is destroyed.
+++ * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
+++ */
+++static void ANTLR3_CDECL freeScope(void * scope)
+++{
+++ ANTLR3_FREE(scope);
+++}
+++
+++/** \brief Name of the grammar file that generated this code
+++ */
+++static const char fileName[] = "DAAP.g";
+++
+++/** \brief Return the name of the grammar file that generated this code.
+++ */
+++static const char * getGrammarFileName()
+++{
+++ return fileName;
+++}
+++/** \brief Create a new DAAPParser parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pDAAPParser
+++DAAPParserNew (pANTLR3_COMMON_TOKEN_STREAM instream)
+++{
+++ // See if we can create a new parser with the standard constructor
+++ //
+++ return DAAPParserNewSSD(instream, NULL);
+++}
+++
+++/** \brief Create a new DAAPParser parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pDAAPParser
+++DAAPParserNewSSD (pANTLR3_COMMON_TOKEN_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
+++{
+++ pDAAPParser ctx; /* Context structure we will build and return */
+++
+++ ctx = (pDAAPParser) ANTLR3_CALLOC(1, sizeof(DAAPParser));
+++
+++ if (ctx == NULL)
+++ {
+++ // Failed to allocate memory for parser context
+++ //
+++ return NULL;
+++ }
+++
+++ /* -------------------------------------------------------------------
+++ * Memory for basic structure is allocated, now to fill in
+++ * the base ANTLR3 structures. We initialize the function pointers
+++ * for the standard ANTLR3 parser function set, but upon return
+++ * from here, the programmer may set the pointers to provide custom
+++ * implementations of each function.
+++ *
+++ * We don't use the macros defined in DAAPParser.h here, in order that you can get a sense
+++ * of what goes where.
+++ */
+++
+++ /* Create a base parser/recognizer, using the supplied token stream
+++ */
+++ ctx->pParser = antlr3ParserNewStream(ANTLR3_SIZE_HINT, instream->tstream, state);
+++ /* Install the implementation of our DAAPParser interface
+++ */
+++ ctx->query = query;
+++ ctx->expr = expr;
+++ ctx->aexpr = aexpr;
+++ ctx->crit = crit;
+++ ctx->free = DAAPParserFree;
+++ ctx->getGrammarFileName = getGrammarFileName;
+++
+++ /* Install the scope pushing methods.
+++ */
+++ ADAPTOR = ANTLR3_TREE_ADAPTORNew(instream->tstream->tokenSource->strFactory);
+++ ctx->vectors = antlr3VectorFactoryNew(0);
+++
+++
+++
+++ /* Install the token table
+++ */
+++ PSRSTATE->tokenNames = DAAPParserTokenNames;
+++
+++
+++ /* Return the newly built parser to the caller
+++ */
+++ return ctx;
+++}
+++
+++/** Free the parser resources
+++ */
+++ static void
+++ DAAPParserFree(pDAAPParser ctx)
+++ {
+++ /* Free any scope memory
+++ */
+++
+++ ctx->vectors->close(ctx->vectors);
+++ /* We created the adaptor so we must free it
+++ */
+++ ADAPTOR->free(ADAPTOR);
+++ // Free this parser
+++ //
+++ ctx->pParser->free(ctx->pParser);
+++ ANTLR3_FREE(ctx);
+++
+++ /* Everything is released, so we can return
+++ */
+++ return;
+++ }
+++
+++/** Return token names used by this parser
+++ *
+++ * The returned pointer is used as an index into the token names table (using the token
+++ * number as the index).
+++ *
+++ * \return Pointer to first char * in the table.
+++ */
+++static pANTLR3_UINT8 *getTokenNames()
+++{
+++ return DAAPParserTokenNames;
+++}
+++
+++
+++/* Declare the bitsets
+++ */
+++
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_query42 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_query42_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000010) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_query42 = { FOLLOW_expr_in_query42_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NEWLINE_in_query44 */
+++static ANTLR3_BITWORD FOLLOW_NEWLINE_in_query44_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000000) };
+++static ANTLR3_BITSET_LIST FOLLOW_NEWLINE_in_query44 = { FOLLOW_NEWLINE_in_query44_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_EOF_in_query47 */
+++static ANTLR3_BITWORD FOLLOW_EOF_in_query47_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_EOF_in_query47 = { FOLLOW_EOF_in_query47_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_aexpr_in_expr62 */
+++static ANTLR3_BITWORD FOLLOW_aexpr_in_expr62_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000022) };
+++static ANTLR3_BITSET_LIST FOLLOW_aexpr_in_expr62 = { FOLLOW_aexpr_in_expr62_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OPOR_in_expr65 */
+++static ANTLR3_BITWORD FOLLOW_OPOR_in_expr65_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000280) };
+++static ANTLR3_BITSET_LIST FOLLOW_OPOR_in_expr65 = { FOLLOW_OPOR_in_expr65_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_aexpr_in_expr68 */
+++static ANTLR3_BITWORD FOLLOW_aexpr_in_expr68_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000022) };
+++static ANTLR3_BITSET_LIST FOLLOW_aexpr_in_expr68 = { FOLLOW_aexpr_in_expr68_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_crit_in_aexpr80 */
+++static ANTLR3_BITWORD FOLLOW_crit_in_aexpr80_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000042) };
+++static ANTLR3_BITSET_LIST FOLLOW_crit_in_aexpr80 = { FOLLOW_crit_in_aexpr80_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OPAND_in_aexpr83 */
+++static ANTLR3_BITWORD FOLLOW_OPAND_in_aexpr83_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000280) };
+++static ANTLR3_BITSET_LIST FOLLOW_OPAND_in_aexpr83 = { FOLLOW_OPAND_in_aexpr83_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_crit_in_aexpr86 */
+++static ANTLR3_BITWORD FOLLOW_crit_in_aexpr86_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000042) };
+++static ANTLR3_BITSET_LIST FOLLOW_crit_in_aexpr86 = { FOLLOW_crit_in_aexpr86_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAR_in_crit98 */
+++static ANTLR3_BITWORD FOLLOW_LPAR_in_crit98_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000280) };
+++static ANTLR3_BITSET_LIST FOLLOW_LPAR_in_crit98 = { FOLLOW_LPAR_in_crit98_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_crit100 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_crit100_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000100) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_crit100 = { FOLLOW_expr_in_crit100_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAR_in_crit102 */
+++static ANTLR3_BITWORD FOLLOW_RPAR_in_crit102_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_RPAR_in_crit102 = { FOLLOW_RPAR_in_crit102_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_crit112 */
+++static ANTLR3_BITWORD FOLLOW_STR_in_crit112_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_STR_in_crit112 = { FOLLOW_STR_in_crit112_bits, 1 };
+++
+++
+++
+++
+++/* ==============================================
+++ * Parsing rules
+++ */
+++/**
+++ * $ANTLR start query
+++ * DAAP.g:27:1: query : expr ( NEWLINE )? EOF -> expr ;
+++ */
+++static DAAPParser_query_return
+++query(pDAAPParser ctx)
+++{
+++ DAAPParser_query_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN NEWLINE2;
+++ pANTLR3_COMMON_TOKEN EOF3;
+++ DAAPParser_expr_return expr1;
+++ #undef RETURN_TYPE_expr1
+++ #define RETURN_TYPE_expr1 DAAPParser_expr_return
+++
+++ pANTLR3_BASE_TREE NEWLINE2_tree;
+++ pANTLR3_BASE_TREE EOF3_tree;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_NEWLINE;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_EOF;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_expr;
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ NEWLINE2 = NULL;
+++ EOF3 = NULL;
+++ expr1.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ NEWLINE2_tree = NULL;
+++ EOF3_tree = NULL;
+++
+++ stream_NEWLINE = NULL;
+++ #define CREATE_stream_NEWLINE if (stream_NEWLINE == NULL) {stream_NEWLINE = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token NEWLINE"); }
+++ stream_EOF = NULL;
+++ #define CREATE_stream_EOF if (stream_EOF == NULL) {stream_EOF = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token EOF"); }
+++ stream_expr = NULL;
+++ #define CREATE_stream_expr if (stream_expr == NULL) {stream_expr = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule expr"); }
+++
+++ retval.tree = NULL;
+++ {
+++ // DAAP.g:27:7: ( expr ( NEWLINE )? EOF -> expr )
+++ // DAAP.g:27:9: expr ( NEWLINE )? EOF
+++ {
+++ FOLLOWPUSH(FOLLOW_expr_in_query42);
+++ expr1=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulequeryEx;
+++ }
+++
+++ CREATE_stream_expr; stream_expr->add(stream_expr, expr1.tree, NULL);
+++
+++ // DAAP.g:27:14: ( NEWLINE )?
+++ {
+++ int alt1=2;
+++ switch ( LA(1) )
+++ {
+++ case NEWLINE:
+++ {
+++ alt1=1;
+++ }
+++ break;
+++ }
+++
+++ switch (alt1)
+++ {
+++ case 1:
+++ // DAAP.g:27:14: NEWLINE
+++ {
+++ NEWLINE2 = (pANTLR3_COMMON_TOKEN) MATCHT(NEWLINE, &FOLLOW_NEWLINE_in_query44);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulequeryEx;
+++ }
+++
+++ CREATE_stream_NEWLINE; stream_NEWLINE->add(stream_NEWLINE, NEWLINE2, NULL);
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ EOF3 = (pANTLR3_COMMON_TOKEN) MATCHT(EOF, &FOLLOW_EOF_in_query47);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulequeryEx;
+++ }
+++
+++ CREATE_stream_EOF; stream_EOF->add(stream_EOF, EOF3, NULL);
+++
+++
+++
+++ /* AST REWRITE
+++ * elements : expr
+++ * token labels :
+++ * rule labels : retval
+++ * token list labels :
+++ * rule list labels :
+++ */
+++ {
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
+++
+++ stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
+++
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ retval.tree = root_0;
+++ // 27:27: -> expr
+++ {
+++ ADAPTOR->addChild(ADAPTOR, root_0, stream_expr == NULL ? NULL : stream_expr->nextTree(stream_expr));
+++
+++ }
+++
+++ retval.tree = root_0; // set result root
+++ if (stream_retval != NULL) stream_retval->free(stream_retval);
+++
+++
+++ }
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulequeryEx; /* Prevent compiler warnings */
+++ rulequeryEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++ if (stream_NEWLINE != NULL) stream_NEWLINE->free(stream_NEWLINE);
+++ if (stream_EOF != NULL) stream_EOF->free(stream_EOF);
+++ if (stream_expr != NULL) stream_expr->free(stream_expr);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end query */
+++
+++/**
+++ * $ANTLR start expr
+++ * DAAP.g:30:1: expr : aexpr ( OPOR aexpr )* ;
+++ */
+++static DAAPParser_expr_return
+++expr(pDAAPParser ctx)
+++{
+++ DAAPParser_expr_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN OPOR5;
+++ DAAPParser_aexpr_return aexpr4;
+++ #undef RETURN_TYPE_aexpr4
+++ #define RETURN_TYPE_aexpr4 DAAPParser_aexpr_return
+++
+++ DAAPParser_aexpr_return aexpr6;
+++ #undef RETURN_TYPE_aexpr6
+++ #define RETURN_TYPE_aexpr6 DAAPParser_aexpr_return
+++
+++ pANTLR3_BASE_TREE OPOR5_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ OPOR5 = NULL;
+++ aexpr4.tree = NULL;
+++
+++ aexpr6.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ OPOR5_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // DAAP.g:30:6: ( aexpr ( OPOR aexpr )* )
+++ // DAAP.g:30:8: aexpr ( OPOR aexpr )*
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_aexpr_in_expr62);
+++ aexpr4=aexpr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, aexpr4.tree);
+++
+++ // DAAP.g:30:14: ( OPOR aexpr )*
+++
+++ for (;;)
+++ {
+++ int alt2=2;
+++ switch ( LA(1) )
+++ {
+++ case OPOR:
+++ {
+++ alt2=1;
+++ }
+++ break;
+++
+++ }
+++
+++ switch (alt2)
+++ {
+++ case 1:
+++ // DAAP.g:30:15: OPOR aexpr
+++ {
+++ OPOR5 = (pANTLR3_COMMON_TOKEN) MATCHT(OPOR, &FOLLOW_OPOR_in_expr65);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ OPOR5_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, OPOR5));
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, OPOR5_tree, root_0));
+++
+++ FOLLOWPUSH(FOLLOW_aexpr_in_expr68);
+++ aexpr6=aexpr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, aexpr6.tree);
+++
+++ }
+++ break;
+++
+++ default:
+++ goto loop2; /* break out of the loop */
+++ break;
+++ }
+++ }
+++ loop2: ; /* Jump out to here if this rule does not match */
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleexprEx; /* Prevent compiler warnings */
+++ ruleexprEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end expr */
+++
+++/**
+++ * $ANTLR start aexpr
+++ * DAAP.g:33:1: aexpr : crit ( OPAND crit )* ;
+++ */
+++static DAAPParser_aexpr_return
+++aexpr(pDAAPParser ctx)
+++{
+++ DAAPParser_aexpr_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN OPAND8;
+++ DAAPParser_crit_return crit7;
+++ #undef RETURN_TYPE_crit7
+++ #define RETURN_TYPE_crit7 DAAPParser_crit_return
+++
+++ DAAPParser_crit_return crit9;
+++ #undef RETURN_TYPE_crit9
+++ #define RETURN_TYPE_crit9 DAAPParser_crit_return
+++
+++ pANTLR3_BASE_TREE OPAND8_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ OPAND8 = NULL;
+++ crit7.tree = NULL;
+++
+++ crit9.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ OPAND8_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // DAAP.g:33:7: ( crit ( OPAND crit )* )
+++ // DAAP.g:33:9: crit ( OPAND crit )*
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_crit_in_aexpr80);
+++ crit7=crit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleaexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, crit7.tree);
+++
+++ // DAAP.g:33:14: ( OPAND crit )*
+++
+++ for (;;)
+++ {
+++ int alt3=2;
+++ switch ( LA(1) )
+++ {
+++ case OPAND:
+++ {
+++ alt3=1;
+++ }
+++ break;
+++
+++ }
+++
+++ switch (alt3)
+++ {
+++ case 1:
+++ // DAAP.g:33:15: OPAND crit
+++ {
+++ OPAND8 = (pANTLR3_COMMON_TOKEN) MATCHT(OPAND, &FOLLOW_OPAND_in_aexpr83);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleaexprEx;
+++ }
+++
+++ OPAND8_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, OPAND8));
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, OPAND8_tree, root_0));
+++
+++ FOLLOWPUSH(FOLLOW_crit_in_aexpr86);
+++ crit9=crit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleaexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, crit9.tree);
+++
+++ }
+++ break;
+++
+++ default:
+++ goto loop3; /* break out of the loop */
+++ break;
+++ }
+++ }
+++ loop3: ; /* Jump out to here if this rule does not match */
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleaexprEx; /* Prevent compiler warnings */
+++ ruleaexprEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end aexpr */
+++
+++/**
+++ * $ANTLR start crit
+++ * DAAP.g:36:1: crit : ( LPAR expr RPAR -> expr | STR );
+++ */
+++static DAAPParser_crit_return
+++crit(pDAAPParser ctx)
+++{
+++ DAAPParser_crit_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN LPAR10;
+++ pANTLR3_COMMON_TOKEN RPAR12;
+++ pANTLR3_COMMON_TOKEN STR13;
+++ DAAPParser_expr_return expr11;
+++ #undef RETURN_TYPE_expr11
+++ #define RETURN_TYPE_expr11 DAAPParser_expr_return
+++
+++ pANTLR3_BASE_TREE LPAR10_tree;
+++ pANTLR3_BASE_TREE RPAR12_tree;
+++ pANTLR3_BASE_TREE STR13_tree;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_RPAR;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_LPAR;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_expr;
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ LPAR10 = NULL;
+++ RPAR12 = NULL;
+++ STR13 = NULL;
+++ expr11.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ LPAR10_tree = NULL;
+++ RPAR12_tree = NULL;
+++ STR13_tree = NULL;
+++
+++ stream_RPAR = NULL;
+++ #define CREATE_stream_RPAR if (stream_RPAR == NULL) {stream_RPAR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token RPAR"); }
+++ stream_LPAR = NULL;
+++ #define CREATE_stream_LPAR if (stream_LPAR == NULL) {stream_LPAR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token LPAR"); }
+++ stream_expr = NULL;
+++ #define CREATE_stream_expr if (stream_expr == NULL) {stream_expr = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule expr"); }
+++
+++ retval.tree = NULL;
+++ {
+++ {
+++ // DAAP.g:36:6: ( LPAR expr RPAR -> expr | STR )
+++
+++ ANTLR3_UINT32 alt4;
+++
+++ alt4=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case LPAR:
+++ {
+++ alt4=1;
+++ }
+++ break;
+++ case STR:
+++ {
+++ alt4=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto rulecritEx;
+++ }
+++
+++ switch (alt4)
+++ {
+++ case 1:
+++ // DAAP.g:36:8: LPAR expr RPAR
+++ {
+++ LPAR10 = (pANTLR3_COMMON_TOKEN) MATCHT(LPAR, &FOLLOW_LPAR_in_crit98);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ CREATE_stream_LPAR; stream_LPAR->add(stream_LPAR, LPAR10, NULL);
+++
+++ FOLLOWPUSH(FOLLOW_expr_in_crit100);
+++ expr11=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ CREATE_stream_expr; stream_expr->add(stream_expr, expr11.tree, NULL);
+++ RPAR12 = (pANTLR3_COMMON_TOKEN) MATCHT(RPAR, &FOLLOW_RPAR_in_crit102);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ CREATE_stream_RPAR; stream_RPAR->add(stream_RPAR, RPAR12, NULL);
+++
+++
+++
+++ /* AST REWRITE
+++ * elements : expr
+++ * token labels :
+++ * rule labels : retval
+++ * token list labels :
+++ * rule list labels :
+++ */
+++ {
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
+++
+++ stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
+++
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ retval.tree = root_0;
+++ // 36:24: -> expr
+++ {
+++ ADAPTOR->addChild(ADAPTOR, root_0, stream_expr == NULL ? NULL : stream_expr->nextTree(stream_expr));
+++
+++ }
+++
+++ retval.tree = root_0; // set result root
+++ if (stream_retval != NULL) stream_retval->free(stream_retval);
+++
+++
+++ }
+++ }
+++ break;
+++ case 2:
+++ // DAAP.g:37:4: STR
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ STR13 = (pANTLR3_COMMON_TOKEN) MATCHT(STR, &FOLLOW_STR_in_crit112);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ STR13_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, STR13));
+++ ADAPTOR->addChild(ADAPTOR, root_0, STR13_tree);
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulecritEx; /* Prevent compiler warnings */
+++ rulecritEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++ if (stream_RPAR != NULL) stream_RPAR->free(stream_RPAR);
+++ if (stream_LPAR != NULL) stream_LPAR->free(stream_LPAR);
+++ if (stream_expr != NULL) stream_expr->free(stream_expr);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end crit */
+++/* End of parsing rules
+++ * ==============================================
+++ */
+++
+++/* ==============================================
+++ * Syntactic predicates
+++ */
+++/* End of syntactic predicates
+++ * ==============================================
+++ */
+++
+++
+++
+++
+++
+++
+++/* End of code
+++ * =============================================================================
+++ */
++diff --git a/src/pregen/DAAPParser.h b/src/pregen/DAAPParser.h
++new file mode 100644
++index 0000000..82ce85e
++--- /dev/null
+++++ b/src/pregen/DAAPParser.h
++@@ -0,0 +1,226 @@
+++/** \file
+++ * This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : DAAP.g
+++ * - On : 2015-06-27 19:05:16
+++ * - for the parser : DAAPParserParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++ * The parser DAAPParser has the callable functions (rules) shown below,
+++ * which will invoke the code for the associated rule in the source grammar
+++ * assuming that the input stream is pointing to a token/text stream that could begin
+++ * this rule.
+++ *
+++ * For instance if you call the first (topmost) rule in a parser grammar, you will
+++ * get the results of a full parse, but calling a rule half way through the grammar will
+++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
+++ * in editors and so on.
+++ *
+++ * The parser entry points are called indirectly (by function pointer to function) via
+++ * a parser context typedef pDAAPParser, which is returned from a call to DAAPParserNew().
+++ *
+++ * The methods in pDAAPParser are as follows:
+++ *
+++ * - DAAPParser_query_return pDAAPParser->query(pDAAPParser)
+++ * - DAAPParser_expr_return pDAAPParser->expr(pDAAPParser)
+++ * - DAAPParser_aexpr_return pDAAPParser->aexpr(pDAAPParser)
+++ * - DAAPParser_crit_return pDAAPParser->crit(pDAAPParser)
+++ *
+++ * The return type for any particular rule is of course determined by the source
+++ * grammar file.
+++ */
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++#ifndef _DAAPParser_H
+++#define _DAAPParser_H
+++/* =============================================================================
+++ * Standard antlr3 C runtime definitions
+++ */
+++#include <antlr3.h>
+++
+++/* End of standard antlr 3 runtime definitions
+++ * =============================================================================
+++ */
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++// Forward declare the context typedef so that we can use it before it is
+++// properly defined. Delegators and delegates (from import statements) are
+++// interdependent and their context structures contain pointers to each other
+++// C only allows such things to be declared if you pre-declare the typedef.
+++//
+++typedef struct DAAPParser_Ctx_struct DAAPParser, * pDAAPParser;
+++
+++
+++
+++#ifdef ANTLR3_WINDOWS
+++// Disable: Unreferenced parameter, - Rules with parameters that are not used
+++// constant conditional, - ANTLR realizes that a prediction is always true (synpred usually)
+++// initialized but unused variable - tree rewrite variables declared but not needed
+++// Unreferenced local variable - lexer rule declares but does not always use _type
+++// potentially unitialized variable used - retval always returned from a rule
+++// unreferenced local function has been removed - susually getTokenNames or freeScope, they can go without warnigns
+++//
+++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
+++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
+++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
+++// this is a matter of orthogonality hence I disable that one.
+++//
+++#pragma warning( disable : 4100 )
+++#pragma warning( disable : 4101 )
+++#pragma warning( disable : 4127 )
+++#pragma warning( disable : 4189 )
+++#pragma warning( disable : 4505 )
+++#pragma warning( disable : 4701 )
+++#endif
+++typedef struct DAAPParser_query_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ DAAPParser_query_return;
+++
+++typedef struct DAAPParser_expr_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ DAAPParser_expr_return;
+++
+++typedef struct DAAPParser_aexpr_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ DAAPParser_aexpr_return;
+++
+++typedef struct DAAPParser_crit_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ DAAPParser_crit_return;
+++
+++
+++
+++/** Context tracking structure for DAAPParser
+++ */
+++struct DAAPParser_Ctx_struct
+++{
+++ /** Built in ANTLR3 context tracker contains all the generic elements
+++ * required for context tracking.
+++ */
+++ pANTLR3_PARSER pParser;
+++
+++
+++ DAAPParser_query_return (*query) (struct DAAPParser_Ctx_struct * ctx);
+++ DAAPParser_expr_return (*expr) (struct DAAPParser_Ctx_struct * ctx);
+++ DAAPParser_aexpr_return (*aexpr) (struct DAAPParser_Ctx_struct * ctx);
+++ DAAPParser_crit_return (*crit) (struct DAAPParser_Ctx_struct * ctx);
+++ // Delegated rules
+++ const char * (*getGrammarFileName)();
+++ void (*free) (struct DAAPParser_Ctx_struct * ctx);
+++ /* @headerFile.members() */
+++ pANTLR3_BASE_TREE_ADAPTOR adaptor;
+++ pANTLR3_VECTOR_FACTORY vectors;
+++ /* End @headerFile.members() */
+++};
+++
+++// Function protoypes for the constructor functions that external translation units
+++// such as delegators and delegates may wish to call.
+++//
+++ANTLR3_API pDAAPParser DAAPParserNew (pANTLR3_COMMON_TOKEN_STREAM instream);
+++ANTLR3_API pDAAPParser DAAPParserNewSSD (pANTLR3_COMMON_TOKEN_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
+++
+++/** Symbolic definitions of all the tokens that the parser will work with.
+++ * \{
+++ *
+++ * Antlr will define EOF, but we can't use that as it it is too common in
+++ * in C header files and that would be confusing. There is no way to filter this out at the moment
+++ * so we just undef it here for now. That isn't the value we get back from C recognizers
+++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
+++ */
+++#ifdef EOF
+++#undef EOF
+++#endif
+++#ifdef Tokens
+++#undef Tokens
+++#endif
+++#define STR 9
+++#define QUOTE 10
+++#define LPAR 7
+++#define NEWLINE 4
+++#define OPOR 5
+++#define RPAR 8
+++#define ESCAPED 11
+++#define OPAND 6
+++#define EOF -1
+++#ifdef EOF
+++#undef EOF
+++#define EOF ANTLR3_TOKEN_EOF
+++#endif
+++
+++#ifndef TOKENSOURCE
+++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
+++#endif
+++
+++/* End of token definitions for DAAPParser
+++ * =============================================================================
+++ */
+++/** \} */
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif
+++
+++/* END - Note:Keep extra line feed to satisfy UNIX systems */
++diff --git a/src/pregen/RSP.u b/src/pregen/RSP.u
++new file mode 100644
++index 0000000..89256ff
++--- /dev/null
+++++ b/src/pregen/RSP.u
++@@ -0,0 +1,6 @@
+++RSPParser.c : RSP.g
+++./RSP.tokens : RSP.g
+++RSPParser.h : RSP.g
+++RSPLexer.c : RSP.g
+++RSPLexer.h : RSP.g
+++ANTLR_PRODUCTS += RSPParser.c ./RSP.tokens RSPParser.h RSPLexer.c RSPLexer.h
++\ No newline at end of file
++diff --git a/src/pregen/RSP2SQL.c b/src/pregen/RSP2SQL.c
++new file mode 100644
++index 0000000..05b54d3
++--- /dev/null
+++++ b/src/pregen/RSP2SQL.c
++@@ -0,0 +1,2546 @@
+++/** \file
+++ * This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : RSP2SQL.g
+++ * - On : 2015-06-27 19:05:19
+++ * - for the tree parser : RSP2SQLTreeParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++*/
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++
+++/* =============================================================================
+++ * This is what the grammar programmer asked us to put at the top of every file.
+++ */
+++
+++ /* Needs #define _GNU_SOURCE for strptime() */
+++
+++ #include <stdio.h>
+++ #include <string.h>
+++ #include <time.h>
+++ #include <stdint.h>
+++
+++ #include "logger.h"
+++ #include "db.h"
+++ #include "misc.h"
+++ #include "rsp_query.h"
+++
+++/* End of Header action.
+++ * =============================================================================
+++ */
+++/* -----------------------------------------
+++ * Include the ANTLR3 generated header file.
+++ */
+++#include "RSP2SQL.h"
+++/* ----------------------------------------- */
+++
+++
+++
+++
+++
+++/* MACROS that hide the C interface implementations from the
+++ * generated code, which makes it a little more understandable to the human eye.
+++ * I am very much against using C pre-processor macros for function calls and bits
+++ * of code as you cannot see what is happening when single stepping in debuggers
+++ * and so on. The exception (in my book at least) is for generated code, where you are
+++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
+++ * hides some indirect calls, but is always referring to the input stream. This is
+++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
+++ * the runtime interfaces without changing the generated code too often, without
+++ * confusing the reader of the generated output, who may not wish to know the gory
+++ * details of the interface inheritance.
+++ */
+++
+++#define CTX ctx
+++
+++/* Aids in accessing scopes for grammar programmers
+++ */
+++#undef SCOPE_TYPE
+++#undef SCOPE_STACK
+++#undef SCOPE_TOP
+++#define SCOPE_TYPE(scope) pRSP2SQL_##scope##_SCOPE
+++#define SCOPE_STACK(scope) pRSP2SQL_##scope##Stack
+++#define SCOPE_TOP(scope) ctx->pRSP2SQL_##scope##Top
+++#define SCOPE_SIZE(scope) ctx->pRSP2SQL_##scope##Stack_limit
+++#define SCOPE_INSTANCE(scope, i) (ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
+++
+++/* Macros for accessing things in the parser
+++ */
+++
+++#undef PARSER
+++#undef RECOGNIZER
+++#undef HAVEPARSEDRULE
+++#undef INPUT
+++#undef STRSTREAM
+++#undef HASEXCEPTION
+++#undef EXCEPTION
+++#undef MATCHT
+++#undef MATCHANYT
+++#undef FOLLOWSTACK
+++#undef FOLLOWPUSH
+++#undef FOLLOWPOP
+++#undef PRECOVER
+++#undef PREPORTERROR
+++#undef LA
+++#undef LT
+++#undef CONSTRUCTEX
+++#undef CONSUME
+++#undef MARK
+++#undef REWIND
+++#undef REWINDLAST
+++#undef PERRORRECOVERY
+++#undef HASFAILED
+++#undef FAILEDFLAG
+++#undef RECOVERFROMMISMATCHEDSET
+++#undef RECOVERFROMMISMATCHEDELEMENT
+++#undef BACKTRACKING
+++#undef ADAPTOR
+++#undef RULEMEMO
+++#undef SEEK
+++#undef INDEX
+++#undef DBG
+++
+++#define PARSER ctx->pTreeParser
+++#define RECOGNIZER PARSER->rec
+++#define PSRSTATE RECOGNIZER->state
+++#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
+++#define INPUT PARSER->ctnstream
+++#define ISTREAM INPUT->tnstream->istream
+++#define STRSTREAM INPUT->tnstream
+++#define HASEXCEPTION() (PSRSTATE->error == ANTLR3_TRUE)
+++#define EXCEPTION PSRSTATE->exception
+++#define MATCHT(t, fs) RECOGNIZER->match(RECOGNIZER, t, fs)
+++#define MATCHANYT() RECOGNIZER->matchAny(RECOGNIZER)
+++#define FOLLOWSTACK PSRSTATE->following
+++#define FOLLOWPUSH(x) FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
+++#define FOLLOWPOP() FOLLOWSTACK->pop(FOLLOWSTACK)
+++#define PRECOVER() RECOGNIZER->recover(RECOGNIZER)
+++#define PREPORTERROR() RECOGNIZER->reportError(RECOGNIZER)
+++#define LA(n) ISTREAM->_LA(ISTREAM, n)
+++#define LT(n) INPUT->tnstream->_LT(INPUT->tnstream, n)
+++#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER)
+++#define CONSUME() ISTREAM->consume(ISTREAM)
+++#define MARK() ISTREAM->mark(ISTREAM)
+++#define REWIND(m) ISTREAM->rewind(ISTREAM, m)
+++#define REWINDLAST() ISTREAM->rewindLast(ISTREAM)
+++#define PERRORRECOVERY PSRSTATE->errorRecovery
+++#define FAILEDFLAG PSRSTATE->failed
+++#define HASFAILED() (FAILEDFLAG == ANTLR3_TRUE)
+++#define BACKTRACKING PSRSTATE->backtracking
+++#define RECOVERFROMMISMATCHEDSET(s) RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
+++#define RECOVERFROMMISMATCHEDELEMENT(e) RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
+++#define ADAPTOR INPUT->adaptor
+++#define RULEMEMO PSRSTATE->ruleMemo
+++#define SEEK(n) ISTREAM->seek(ISTREAM, n)
+++#define INDEX() ISTREAM->index(ISTREAM)
+++#define DBG RECOGNIZER->debugger
+++
+++
+++#define TOKTEXT(tok, txt) tok, (pANTLR3_UINT8)txt
+++
+++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
+++ * then for the present you must use different names for your defines as these are hard coded
+++ * in the code generator. It would be better not to use such names internally, and maybe
+++ * we can change this in a forthcoming release. I deliberately do not #undef these
+++ * here as this will at least give you a redefined error somewhere if they clash.
+++ */
+++#define UP ANTLR3_TOKEN_UP
+++#define DOWN ANTLR3_TOKEN_DOWN
+++#define EOR ANTLR3_TOKEN_EOR
+++#define INVALID ANTLR3_TOKEN_INVALID
+++
+++
+++/* =============================================================================
+++ * Functions to create and destroy scopes. First come the rule scopes, followed
+++ * by the global declared scopes.
+++ */
+++
+++
+++
+++/* ============================================================================= */
+++
+++/* =============================================================================
+++ * Start of recognizer
+++ */
+++
+++
+++
+++/** \brief Table of all token names in symbolic order, mainly used for
+++ * error reporting.
+++ */
+++pANTLR3_UINT8 RSP2SQLTokenNames[30+4]
+++ = {
+++ (pANTLR3_UINT8) "<invalid>", /* String to print to indicate an invalid token */
+++ (pANTLR3_UINT8) "<EOR>",
+++ (pANTLR3_UINT8) "<DOWN>",
+++ (pANTLR3_UINT8) "<UP>",
+++ (pANTLR3_UINT8) "NEWLINE",
+++ (pANTLR3_UINT8) "OR",
+++ (pANTLR3_UINT8) "AND",
+++ (pANTLR3_UINT8) "LPAR",
+++ (pANTLR3_UINT8) "RPAR",
+++ (pANTLR3_UINT8) "FIELD",
+++ (pANTLR3_UINT8) "STR",
+++ (pANTLR3_UINT8) "NOT",
+++ (pANTLR3_UINT8) "EQUAL",
+++ (pANTLR3_UINT8) "INCLUDES",
+++ (pANTLR3_UINT8) "STARTSW",
+++ (pANTLR3_UINT8) "ENDSW",
+++ (pANTLR3_UINT8) "INT",
+++ (pANTLR3_UINT8) "LESS",
+++ (pANTLR3_UINT8) "GREATER",
+++ (pANTLR3_UINT8) "LTE",
+++ (pANTLR3_UINT8) "GTE",
+++ (pANTLR3_UINT8) "BEFORE",
+++ (pANTLR3_UINT8) "AFTER",
+++ (pANTLR3_UINT8) "DATE",
+++ (pANTLR3_UINT8) "TODAY",
+++ (pANTLR3_UINT8) "DAY",
+++ (pANTLR3_UINT8) "WEEK",
+++ (pANTLR3_UINT8) "MONTH",
+++ (pANTLR3_UINT8) "YEAR",
+++ (pANTLR3_UINT8) "QUOTE",
+++ (pANTLR3_UINT8) "WS",
+++ (pANTLR3_UINT8) "DIGIT19",
+++ (pANTLR3_UINT8) "DIGIT09",
+++ (pANTLR3_UINT8) "ESCAPED"
+++ };
+++
+++
+++
+++// Forward declare the locally static matching functions we have generated.
+++//
+++static pANTLR3_STRING query (pRSP2SQL ctx);
+++static RSP2SQL_expr_return expr (pRSP2SQL ctx);
+++static RSP2SQL_strcrit_return strcrit (pRSP2SQL ctx);
+++static pANTLR3_COMMON_TOKEN strop (pRSP2SQL ctx);
+++static RSP2SQL_intcrit_return intcrit (pRSP2SQL ctx);
+++static pANTLR3_COMMON_TOKEN intop (pRSP2SQL ctx);
+++static RSP2SQL_datecrit_return datecrit (pRSP2SQL ctx);
+++static pANTLR3_COMMON_TOKEN dateop (pRSP2SQL ctx);
+++static RSP2SQL_datespec_return datespec (pRSP2SQL ctx);
+++static RSP2SQL_dateref_return dateref (pRSP2SQL ctx);
+++static RSP2SQL_dateintval_return dateintval (pRSP2SQL ctx);
+++static void RSP2SQLFree(pRSP2SQL ctx);
+++/* For use in tree output where we are accumulating rule labels via label += ruleRef
+++ * we need a function that knows how to free a return scope when the list is destroyed.
+++ * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
+++ */
+++static void ANTLR3_CDECL freeScope(void * scope)
+++{
+++ ANTLR3_FREE(scope);
+++}
+++
+++/** \brief Name of the grammar file that generated this code
+++ */
+++static const char fileName[] = "RSP2SQL.g";
+++
+++/** \brief Return the name of the grammar file that generated this code.
+++ */
+++static const char * getGrammarFileName()
+++{
+++ return fileName;
+++}
+++/** \brief Create a new RSP2SQL parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pRSP2SQL
+++RSP2SQLNew (pANTLR3_COMMON_TREE_NODE_STREAM instream)
+++{
+++ // See if we can create a new parser with the standard constructor
+++ //
+++ return RSP2SQLNewSSD(instream, NULL);
+++}
+++
+++/** \brief Create a new RSP2SQL parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pRSP2SQL
+++RSP2SQLNewSSD (pANTLR3_COMMON_TREE_NODE_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
+++{
+++ pRSP2SQL ctx; /* Context structure we will build and return */
+++
+++ ctx = (pRSP2SQL) ANTLR3_CALLOC(1, sizeof(RSP2SQL));
+++
+++ if (ctx == NULL)
+++ {
+++ // Failed to allocate memory for parser context
+++ //
+++ return NULL;
+++ }
+++
+++ /* -------------------------------------------------------------------
+++ * Memory for basic structure is allocated, now to fill in
+++ * the base ANTLR3 structures. We initialize the function pointers
+++ * for the standard ANTLR3 parser function set, but upon return
+++ * from here, the programmer may set the pointers to provide custom
+++ * implementations of each function.
+++ *
+++ * We don't use the macros defined in RSP2SQL.h here, in order that you can get a sense
+++ * of what goes where.
+++ */
+++
+++ /* Create a base Tree parser/recognizer, using the supplied tree node stream
+++ */
+++ ctx->pTreeParser = antlr3TreeParserNewStream(ANTLR3_SIZE_HINT, instream, state);
+++ /* Install the implementation of our RSP2SQL interface
+++ */
+++ ctx->query = query;
+++ ctx->expr = expr;
+++ ctx->strcrit = strcrit;
+++ ctx->strop = strop;
+++ ctx->intcrit = intcrit;
+++ ctx->intop = intop;
+++ ctx->datecrit = datecrit;
+++ ctx->dateop = dateop;
+++ ctx->datespec = datespec;
+++ ctx->dateref = dateref;
+++ ctx->dateintval = dateintval;
+++ ctx->free = RSP2SQLFree;
+++ ctx->getGrammarFileName = getGrammarFileName;
+++
+++ /* Install the scope pushing methods.
+++ */
+++
+++
+++
+++
+++
+++ /* Install the token table
+++ */
+++ PSRSTATE->tokenNames = RSP2SQLTokenNames;
+++
+++
+++ /* Return the newly built parser to the caller
+++ */
+++ return ctx;
+++}
+++
+++/** Free the parser resources
+++ */
+++ static void
+++ RSP2SQLFree(pRSP2SQL ctx)
+++ {
+++ /* Free any scope memory
+++ */
+++
+++
+++ // Free this parser
+++ //
+++ ctx->pTreeParser->free(ctx->pTreeParser);
+++ ANTLR3_FREE(ctx);
+++
+++ /* Everything is released, so we can return
+++ */
+++ return;
+++ }
+++
+++/** Return token names used by this tree parser
+++ *
+++ * The returned pointer is used as an index into the token names table (using the token
+++ * number as the index).
+++ *
+++ * \return Pointer to first char * in the table.
+++ */
+++static pANTLR3_UINT8 *getTokenNames()
+++{
+++ return RSP2SQLTokenNames;
+++}
+++
+++
+++ #define RSP_TYPE_STRING 0
+++ #define RSP_TYPE_INT 1
+++ #define RSP_TYPE_DATE 2
+++
+++ struct rsp_query_field_map {
+++ char *rsp_field;
+++ int field_type;
+++ /* RSP fields are named after the DB columns - or vice versa */
+++ };
+++
+++ /* gperf static hash, rsp_query.gperf */
+++ #include "rsp_query_hash.c"
+++
+++
+++/* Declare the bitsets
+++ */
+++
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_query70 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_query70_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_query70 = { FOLLOW_expr_in_query70_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AND_in_expr95 */
+++static ANTLR3_BITWORD FOLLOW_AND_in_expr95_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_AND_in_expr95 = { FOLLOW_AND_in_expr95_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr101 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_expr101_bits[] = { ANTLR3_UINT64_LIT(0x00000000007EF860) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_expr101 = { FOLLOW_expr_in_expr101_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr107 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_expr107_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_expr107 = { FOLLOW_expr_in_expr107_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OR_in_expr118 */
+++static ANTLR3_BITWORD FOLLOW_OR_in_expr118_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_OR_in_expr118 = { FOLLOW_OR_in_expr118_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr124 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_expr124_bits[] = { ANTLR3_UINT64_LIT(0x00000000007EF860) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_expr124 = { FOLLOW_expr_in_expr124_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_expr130 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_expr130_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_expr130 = { FOLLOW_expr_in_expr130_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strcrit_in_expr144 */
+++static ANTLR3_BITWORD FOLLOW_strcrit_in_expr144_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_strcrit_in_expr144 = { FOLLOW_strcrit_in_expr144_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NOT_in_expr154 */
+++static ANTLR3_BITWORD FOLLOW_NOT_in_expr154_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_NOT_in_expr154 = { FOLLOW_NOT_in_expr154_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strcrit_in_expr160 */
+++static ANTLR3_BITWORD FOLLOW_strcrit_in_expr160_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_strcrit_in_expr160 = { FOLLOW_strcrit_in_expr160_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intcrit_in_expr174 */
+++static ANTLR3_BITWORD FOLLOW_intcrit_in_expr174_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_intcrit_in_expr174 = { FOLLOW_intcrit_in_expr174_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NOT_in_expr184 */
+++static ANTLR3_BITWORD FOLLOW_NOT_in_expr184_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_NOT_in_expr184 = { FOLLOW_NOT_in_expr184_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intcrit_in_expr190 */
+++static ANTLR3_BITWORD FOLLOW_intcrit_in_expr190_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_intcrit_in_expr190 = { FOLLOW_intcrit_in_expr190_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_datecrit_in_expr204 */
+++static ANTLR3_BITWORD FOLLOW_datecrit_in_expr204_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_datecrit_in_expr204 = { FOLLOW_datecrit_in_expr204_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strop_in_strcrit233 */
+++static ANTLR3_BITWORD FOLLOW_strop_in_strcrit233_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_strop_in_strcrit233 = { FOLLOW_strop_in_strcrit233_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_strcrit239 */
+++static ANTLR3_BITWORD FOLLOW_FIELD_in_strcrit239_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000400) };
+++static ANTLR3_BITSET_LIST FOLLOW_FIELD_in_strcrit239 = { FOLLOW_FIELD_in_strcrit239_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_strcrit245 */
+++static ANTLR3_BITWORD FOLLOW_STR_in_strcrit245_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_STR_in_strcrit245 = { FOLLOW_STR_in_strcrit245_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_EQUAL_in_strop274 */
+++static ANTLR3_BITWORD FOLLOW_EQUAL_in_strop274_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_EQUAL_in_strop274 = { FOLLOW_EQUAL_in_strop274_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INCLUDES_in_strop287 */
+++static ANTLR3_BITWORD FOLLOW_INCLUDES_in_strop287_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_INCLUDES_in_strop287 = { FOLLOW_INCLUDES_in_strop287_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STARTSW_in_strop300 */
+++static ANTLR3_BITWORD FOLLOW_STARTSW_in_strop300_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_STARTSW_in_strop300 = { FOLLOW_STARTSW_in_strop300_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_ENDSW_in_strop313 */
+++static ANTLR3_BITWORD FOLLOW_ENDSW_in_strop313_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_ENDSW_in_strop313 = { FOLLOW_ENDSW_in_strop313_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intop_in_intcrit342 */
+++static ANTLR3_BITWORD FOLLOW_intop_in_intcrit342_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_intop_in_intcrit342 = { FOLLOW_intop_in_intcrit342_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_intcrit348 */
+++static ANTLR3_BITWORD FOLLOW_FIELD_in_intcrit348_bits[] = { ANTLR3_UINT64_LIT(0x0000000000010000) };
+++static ANTLR3_BITSET_LIST FOLLOW_FIELD_in_intcrit348 = { FOLLOW_FIELD_in_intcrit348_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_intcrit354 */
+++static ANTLR3_BITWORD FOLLOW_INT_in_intcrit354_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_INT_in_intcrit354 = { FOLLOW_INT_in_intcrit354_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_EQUAL_in_intop383 */
+++static ANTLR3_BITWORD FOLLOW_EQUAL_in_intop383_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_EQUAL_in_intop383 = { FOLLOW_EQUAL_in_intop383_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_LESS_in_intop396 */
+++static ANTLR3_BITWORD FOLLOW_LESS_in_intop396_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_LESS_in_intop396 = { FOLLOW_LESS_in_intop396_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_GREATER_in_intop409 */
+++static ANTLR3_BITWORD FOLLOW_GREATER_in_intop409_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_GREATER_in_intop409 = { FOLLOW_GREATER_in_intop409_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_LTE_in_intop422 */
+++static ANTLR3_BITWORD FOLLOW_LTE_in_intop422_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_LTE_in_intop422 = { FOLLOW_LTE_in_intop422_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_GTE_in_intop435 */
+++static ANTLR3_BITWORD FOLLOW_GTE_in_intop435_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_GTE_in_intop435 = { FOLLOW_GTE_in_intop435_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateop_in_datecrit464 */
+++static ANTLR3_BITWORD FOLLOW_dateop_in_datecrit464_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateop_in_datecrit464 = { FOLLOW_dateop_in_datecrit464_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_datecrit470 */
+++static ANTLR3_BITWORD FOLLOW_FIELD_in_datecrit470_bits[] = { ANTLR3_UINT64_LIT(0x0000000001FEF860) };
+++static ANTLR3_BITSET_LIST FOLLOW_FIELD_in_datecrit470 = { FOLLOW_FIELD_in_datecrit470_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_datespec_in_datecrit476 */
+++static ANTLR3_BITWORD FOLLOW_datespec_in_datecrit476_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_datespec_in_datecrit476 = { FOLLOW_datespec_in_datecrit476_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_BEFORE_in_dateop505 */
+++static ANTLR3_BITWORD FOLLOW_BEFORE_in_dateop505_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_BEFORE_in_dateop505 = { FOLLOW_BEFORE_in_dateop505_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AFTER_in_dateop518 */
+++static ANTLR3_BITWORD FOLLOW_AFTER_in_dateop518_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_AFTER_in_dateop518 = { FOLLOW_AFTER_in_dateop518_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateref_in_datespec546 */
+++static ANTLR3_BITWORD FOLLOW_dateref_in_datespec546_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateref_in_datespec546 = { FOLLOW_dateref_in_datespec546_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateop_in_datespec560 */
+++static ANTLR3_BITWORD FOLLOW_dateop_in_datespec560_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateop_in_datespec560 = { FOLLOW_dateop_in_datespec560_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateref_in_datespec566 */
+++static ANTLR3_BITWORD FOLLOW_dateref_in_datespec566_bits[] = { ANTLR3_UINT64_LIT(0x0000000000010000) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateref_in_datespec566 = { FOLLOW_dateref_in_datespec566_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_datespec572 */
+++static ANTLR3_BITWORD FOLLOW_INT_in_datespec572_bits[] = { ANTLR3_UINT64_LIT(0x000000001E000000) };
+++static ANTLR3_BITSET_LIST FOLLOW_INT_in_datespec572 = { FOLLOW_INT_in_datespec572_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateintval_in_datespec578 */
+++static ANTLR3_BITWORD FOLLOW_dateintval_in_datespec578_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateintval_in_datespec578 = { FOLLOW_dateintval_in_datespec578_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATE_in_dateref607 */
+++static ANTLR3_BITWORD FOLLOW_DATE_in_dateref607_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATE_in_dateref607 = { FOLLOW_DATE_in_dateref607_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_TODAY_in_dateref616 */
+++static ANTLR3_BITWORD FOLLOW_TODAY_in_dateref616_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_TODAY_in_dateref616 = { FOLLOW_TODAY_in_dateref616_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DAY_in_dateintval640 */
+++static ANTLR3_BITWORD FOLLOW_DAY_in_dateintval640_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_DAY_in_dateintval640 = { FOLLOW_DAY_in_dateintval640_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_WEEK_in_dateintval649 */
+++static ANTLR3_BITWORD FOLLOW_WEEK_in_dateintval649_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_WEEK_in_dateintval649 = { FOLLOW_WEEK_in_dateintval649_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_MONTH_in_dateintval658 */
+++static ANTLR3_BITWORD FOLLOW_MONTH_in_dateintval658_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_MONTH_in_dateintval658 = { FOLLOW_MONTH_in_dateintval658_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_YEAR_in_dateintval667 */
+++static ANTLR3_BITWORD FOLLOW_YEAR_in_dateintval667_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_YEAR_in_dateintval667 = { FOLLOW_YEAR_in_dateintval667_bits, 1 };
+++
+++
+++
+++
+++/* ==============================================
+++ * Parsing rules
+++ */
+++/**
+++ * $ANTLR start query
+++ * RSP2SQL.g:56:1: query returns [ pANTLR3_STRING result ] : e= expr ;
+++ */
+++static pANTLR3_STRING
+++query(pRSP2SQL ctx)
+++{
+++ pANTLR3_STRING result = NULL;
+++
+++ RSP2SQL_expr_return e;
+++ #undef RETURN_TYPE_e
+++ #define RETURN_TYPE_e RSP2SQL_expr_return
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ result= NULL;
+++ {
+++ // RSP2SQL.g:58:2: (e= expr )
+++ // RSP2SQL.g:58:4: e= expr
+++ {
+++ FOLLOWPUSH(FOLLOW_expr_in_query70);
+++ e=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulequeryEx;
+++ }
+++
+++ {
+++
+++ if (!e.valid)
+++ {
+++ result= NULL;
+++ }
+++ else
+++ {
+++ result= e.result->factory->newRaw(e.result->factory);
+++ result->append8(result, "(");
+++ result->appendS(result, e.result);
+++ result->append8(result, ")");
+++ }
+++
+++ }
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulequeryEx; /* Prevent compiler warnings */
+++ rulequeryEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return result;
+++}
+++/* $ANTLR end query */
+++
+++/**
+++ * $ANTLR start expr
+++ * RSP2SQL.g:74:1: expr returns [ pANTLR3_STRING result, int valid ] : ( ^( AND a= expr b= expr ) | ^( OR a= expr b= expr ) | c= strcrit | ^( NOT c= strcrit ) | i= intcrit | ^( NOT i= intcrit ) | d= datecrit );
+++ */
+++static RSP2SQL_expr_return
+++expr(pRSP2SQL ctx)
+++{
+++ RSP2SQL_expr_return retval;
+++
+++ RSP2SQL_expr_return a;
+++ #undef RETURN_TYPE_a
+++ #define RETURN_TYPE_a RSP2SQL_expr_return
+++
+++ RSP2SQL_expr_return b;
+++ #undef RETURN_TYPE_b
+++ #define RETURN_TYPE_b RSP2SQL_expr_return
+++
+++ RSP2SQL_strcrit_return c;
+++ #undef RETURN_TYPE_c
+++ #define RETURN_TYPE_c RSP2SQL_strcrit_return
+++
+++ RSP2SQL_intcrit_return i;
+++ #undef RETURN_TYPE_i
+++ #define RETURN_TYPE_i RSP2SQL_intcrit_return
+++
+++ RSP2SQL_datecrit_return d;
+++ #undef RETURN_TYPE_d
+++ #define RETURN_TYPE_d RSP2SQL_datecrit_return
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ retval.result= NULL; retval.valid= 1;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ {
+++ {
+++ // RSP2SQL.g:76:2: ( ^( AND a= expr b= expr ) | ^( OR a= expr b= expr ) | c= strcrit | ^( NOT c= strcrit ) | i= intcrit | ^( NOT i= intcrit ) | d= datecrit )
+++
+++ ANTLR3_UINT32 alt1;
+++
+++ alt1=7;
+++
+++ switch ( LA(1) )
+++ {
+++ case AND:
+++ {
+++ alt1=1;
+++ }
+++ break;
+++ case OR:
+++ {
+++ alt1=2;
+++ }
+++ break;
+++ case EQUAL:
+++ {
+++ switch ( LA(2) )
+++ {
+++ case DOWN:
+++ {
+++ switch ( LA(3) )
+++ {
+++ case FIELD:
+++ {
+++ switch ( LA(4) )
+++ {
+++ case INT:
+++ {
+++ alt1=5;
+++ }
+++ break;
+++ case STR:
+++ {
+++ alt1=3;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 10;
+++
+++
+++ goto ruleexprEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 8;
+++
+++
+++ goto ruleexprEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 3;
+++
+++
+++ goto ruleexprEx;
+++ }
+++
+++ }
+++ break;
+++ case INCLUDES:
+++ case STARTSW:
+++ case ENDSW:
+++ {
+++ alt1=3;
+++ }
+++ break;
+++ case NOT:
+++ {
+++ switch ( LA(2) )
+++ {
+++ case DOWN:
+++ {
+++ switch ( LA(3) )
+++ {
+++ case EQUAL:
+++ {
+++ switch ( LA(4) )
+++ {
+++ case DOWN:
+++ {
+++ switch ( LA(5) )
+++ {
+++ case FIELD:
+++ {
+++ switch ( LA(6) )
+++ {
+++ case STR:
+++ {
+++ alt1=4;
+++ }
+++ break;
+++ case INT:
+++ {
+++ alt1=6;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 15;
+++
+++
+++ goto ruleexprEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 14;
+++
+++
+++ goto ruleexprEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 11;
+++
+++
+++ goto ruleexprEx;
+++ }
+++
+++ }
+++ break;
+++ case LESS:
+++ case GREATER:
+++ case LTE:
+++ case GTE:
+++ {
+++ alt1=6;
+++ }
+++ break;
+++ case INCLUDES:
+++ case STARTSW:
+++ case ENDSW:
+++ {
+++ alt1=4;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 9;
+++
+++
+++ goto ruleexprEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 5;
+++
+++
+++ goto ruleexprEx;
+++ }
+++
+++ }
+++ break;
+++ case LESS:
+++ case GREATER:
+++ case LTE:
+++ case GTE:
+++ {
+++ alt1=5;
+++ }
+++ break;
+++ case BEFORE:
+++ case AFTER:
+++ {
+++ alt1=7;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleexprEx;
+++ }
+++
+++ switch (alt1)
+++ {
+++ case 1:
+++ // RSP2SQL.g:76:4: ^( AND a= expr b= expr )
+++ {
+++ MATCHT(AND, &FOLLOW_AND_in_expr95);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expr_in_expr101);
+++ a=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expr_in_expr107);
+++ b=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ {
+++
+++ if (!a.valid || !b.valid)
+++ {
+++ retval.valid= 0;
+++ }
+++ else
+++ {
+++ retval.result= a.result->factory->newRaw(a.result->factory);
+++ retval.result->append8(retval.result, "(");
+++ retval.result->appendS(retval.result, a.result);
+++ retval.result->append8(retval.result, " AND ");
+++ retval.result->appendS(retval.result, b.result);
+++ retval.result->append8(retval.result, ")");
+++ }
+++
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP2SQL.g:92:4: ^( OR a= expr b= expr )
+++ {
+++ MATCHT(OR, &FOLLOW_OR_in_expr118);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expr_in_expr124);
+++ a=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expr_in_expr130);
+++ b=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ {
+++
+++ if (!a.valid || !b.valid)
+++ {
+++ retval.valid= 0;
+++ }
+++ else
+++ {
+++ retval.result= a.result->factory->newRaw(a.result->factory);
+++ retval.result->append8(retval.result, "(");
+++ retval.result->appendS(retval.result, a.result);
+++ retval.result->append8(retval.result, " OR ");
+++ retval.result->appendS(retval.result, b.result);
+++ retval.result->append8(retval.result, ")");
+++ }
+++
+++ }
+++
+++ }
+++ break;
+++ case 3:
+++ // RSP2SQL.g:108:4: c= strcrit
+++ {
+++ FOLLOWPUSH(FOLLOW_strcrit_in_expr144);
+++ c=strcrit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ {
+++
+++ retval.valid= c.valid;
+++ retval.result= c.result;
+++
+++ }
+++
+++ }
+++ break;
+++ case 4:
+++ // RSP2SQL.g:113:4: ^( NOT c= strcrit )
+++ {
+++ MATCHT(NOT, &FOLLOW_NOT_in_expr154);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_strcrit_in_expr160);
+++ c=strcrit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ {
+++
+++ if (!c.valid)
+++ {
+++ retval.valid= 0;
+++ }
+++ else
+++ {
+++ retval.result= c.result->factory->newRaw(c.result->factory);
+++ retval.result->append8(retval.result, "(NOT ");
+++ retval.result->appendS(retval.result, c.result);
+++ retval.result->append8(retval.result, ")");
+++ }
+++
+++ }
+++
+++ }
+++ break;
+++ case 5:
+++ // RSP2SQL.g:127:4: i= intcrit
+++ {
+++ FOLLOWPUSH(FOLLOW_intcrit_in_expr174);
+++ i=intcrit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ {
+++
+++ retval.valid= i.valid;
+++ retval.result= i.result;
+++
+++ }
+++
+++ }
+++ break;
+++ case 6:
+++ // RSP2SQL.g:132:4: ^( NOT i= intcrit )
+++ {
+++ MATCHT(NOT, &FOLLOW_NOT_in_expr184);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_intcrit_in_expr190);
+++ i=intcrit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ {
+++
+++ if (!i.valid)
+++ {
+++ retval.valid= 0;
+++ }
+++ else
+++ {
+++ retval.result= i.result->factory->newRaw(i.result->factory);
+++ retval.result->append8(retval.result, "(NOT ");
+++ retval.result->appendS(retval.result, i.result);
+++ retval.result->append8(retval.result, ")");
+++ }
+++
+++ }
+++
+++ }
+++ break;
+++ case 7:
+++ // RSP2SQL.g:146:4: d= datecrit
+++ {
+++ FOLLOWPUSH(FOLLOW_datecrit_in_expr204);
+++ d=datecrit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ {
+++
+++ retval.valid= d.valid;
+++ retval.result= d.result;
+++
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleexprEx; /* Prevent compiler warnings */
+++ ruleexprEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end expr */
+++
+++/**
+++ * $ANTLR start strcrit
+++ * RSP2SQL.g:153:1: strcrit returns [ pANTLR3_STRING result, int valid ] : ^(o= strop f= FIELD s= STR ) ;
+++ */
+++static RSP2SQL_strcrit_return
+++strcrit(pRSP2SQL ctx)
+++{
+++ RSP2SQL_strcrit_return retval;
+++
+++ pANTLR3_BASE_TREE f;
+++ pANTLR3_BASE_TREE s;
+++ pANTLR3_COMMON_TOKEN o;
+++ #undef RETURN_TYPE_o
+++ #define RETURN_TYPE_o pANTLR3_COMMON_TOKEN
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ retval.result= NULL; retval.valid= 1;
+++ f = NULL;
+++ s = NULL;
+++ o = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ {
+++ // RSP2SQL.g:155:2: ( ^(o= strop f= FIELD s= STR ) )
+++ // RSP2SQL.g:155:4: ^(o= strop f= FIELD s= STR )
+++ {
+++ FOLLOWPUSH(FOLLOW_strop_in_strcrit233);
+++ o=strop(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++ f = (pANTLR3_BASE_TREE) MATCHT(FIELD, &FOLLOW_FIELD_in_strcrit239);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++ s = (pANTLR3_BASE_TREE) MATCHT(STR, &FOLLOW_STR_in_strcrit245);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++ {
+++
+++ char *op;
+++ const struct rsp_query_field_map *rqfp;
+++ pANTLR3_STRING field;
+++ char *escaped;
+++ ANTLR3_UINT32 optok;
+++
+++ escaped = NULL;
+++
+++ op = NULL;
+++ optok = o->getType(o);
+++ switch (optok)
+++ {
+++ case EQUAL:
+++ op = " = ";
+++ break;
+++
+++ case INCLUDES:
+++ case STARTSW:
+++ case ENDSW:
+++ op = " LIKE ";
+++ break;
+++ }
+++
+++ field = f->getText(f);
+++
+++ /* Field lookup */
+++ rqfp = rsp_query_field_lookup((char *)field->chars, strlen((char *)field->chars));
+++ if (!rqfp)
+++ {
+++ DPRINTF(E_LOG, L_RSP, "Field '%s' is not a valid field in queries\n", field->chars);
+++ retval.valid= 0;
+++ goto strcrit_valid_0; /* ABORT */
+++ }
+++
+++ /* Check field type */
+++ if (rqfp->field_type != RSP_TYPE_STRING)
+++ {
+++ DPRINTF(E_LOG, L_RSP, "Field '%s' is not a string field\n", field->chars);
+++ retval.valid= 0;
+++ goto strcrit_valid_0; /* ABORT */
+++ }
+++
+++ escaped = db_escape_string((char *)s->getText(s)->chars);
+++ if (!escaped)
+++ {
+++ DPRINTF(E_LOG, L_RSP, "Could not escape value\n");
+++ retval.valid= 0;
+++ goto strcrit_valid_0; /* ABORT */
+++ }
+++
+++ retval.result= field->factory->newRaw(field->factory);
+++ retval.result->append8(retval.result, "f.");
+++ retval.result->appendS(retval.result, field);
+++ retval.result->append8(retval.result, op);
+++ retval.result->append8(retval.result, "'");
+++ if ((optok == INCLUDES) || (optok == STARTSW))
+++ retval.result->append8(retval.result, "%");
+++
+++ retval.result->append8(retval.result, escaped);
+++
+++ if ((optok == INCLUDES) || (optok == ENDSW))
+++ retval.result->append8(retval.result, "%");
+++ retval.result->append8(retval.result, "'");
+++
+++ strcrit_valid_0:
+++ ;
+++
+++ if (escaped)
+++ free(escaped);
+++
+++ }
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulestrcritEx; /* Prevent compiler warnings */
+++ rulestrcritEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end strcrit */
+++
+++/**
+++ * $ANTLR start strop
+++ * RSP2SQL.g:229:1: strop returns [ pANTLR3_COMMON_TOKEN op ] : (n= EQUAL | n= INCLUDES | n= STARTSW | n= ENDSW );
+++ */
+++static pANTLR3_COMMON_TOKEN
+++strop(pRSP2SQL ctx)
+++{
+++ pANTLR3_COMMON_TOKEN op = NULL;
+++
+++ pANTLR3_BASE_TREE n;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ op= NULL;
+++ n = NULL;
+++
+++ {
+++ {
+++ // RSP2SQL.g:231:2: (n= EQUAL | n= INCLUDES | n= STARTSW | n= ENDSW )
+++
+++ ANTLR3_UINT32 alt2;
+++
+++ alt2=4;
+++
+++ switch ( LA(1) )
+++ {
+++ case EQUAL:
+++ {
+++ alt2=1;
+++ }
+++ break;
+++ case INCLUDES:
+++ {
+++ alt2=2;
+++ }
+++ break;
+++ case STARTSW:
+++ {
+++ alt2=3;
+++ }
+++ break;
+++ case ENDSW:
+++ {
+++ alt2=4;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 2;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto rulestropEx;
+++ }
+++
+++ switch (alt2)
+++ {
+++ case 1:
+++ // RSP2SQL.g:231:4: n= EQUAL
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(EQUAL, &FOLLOW_EQUAL_in_strop274);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestropEx;
+++ }
+++
+++ {
+++ op= n->getToken(n);
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP2SQL.g:233:4: n= INCLUDES
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(INCLUDES, &FOLLOW_INCLUDES_in_strop287);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestropEx;
+++ }
+++
+++ {
+++ op= n->getToken(n);
+++ }
+++
+++ }
+++ break;
+++ case 3:
+++ // RSP2SQL.g:235:4: n= STARTSW
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(STARTSW, &FOLLOW_STARTSW_in_strop300);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestropEx;
+++ }
+++
+++ {
+++ op= n->getToken(n);
+++ }
+++
+++ }
+++ break;
+++ case 4:
+++ // RSP2SQL.g:237:4: n= ENDSW
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(ENDSW, &FOLLOW_ENDSW_in_strop313);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestropEx;
+++ }
+++
+++ {
+++ op= n->getToken(n);
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulestropEx; /* Prevent compiler warnings */
+++ rulestropEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return op;
+++}
+++/* $ANTLR end strop */
+++
+++/**
+++ * $ANTLR start intcrit
+++ * RSP2SQL.g:241:1: intcrit returns [ pANTLR3_STRING result, int valid ] : ^(o= intop f= FIELD i= INT ) ;
+++ */
+++static RSP2SQL_intcrit_return
+++intcrit(pRSP2SQL ctx)
+++{
+++ RSP2SQL_intcrit_return retval;
+++
+++ pANTLR3_BASE_TREE f;
+++ pANTLR3_BASE_TREE i;
+++ pANTLR3_COMMON_TOKEN o;
+++ #undef RETURN_TYPE_o
+++ #define RETURN_TYPE_o pANTLR3_COMMON_TOKEN
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ retval.result= NULL; retval.valid= 1;
+++ f = NULL;
+++ i = NULL;
+++ o = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ {
+++ // RSP2SQL.g:243:2: ( ^(o= intop f= FIELD i= INT ) )
+++ // RSP2SQL.g:243:4: ^(o= intop f= FIELD i= INT )
+++ {
+++ FOLLOWPUSH(FOLLOW_intop_in_intcrit342);
+++ o=intop(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++ f = (pANTLR3_BASE_TREE) MATCHT(FIELD, &FOLLOW_FIELD_in_intcrit348);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++ i = (pANTLR3_BASE_TREE) MATCHT(INT, &FOLLOW_INT_in_intcrit354);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++ {
+++
+++ char *op;
+++ const struct rsp_query_field_map *rqfp;
+++ pANTLR3_STRING field;
+++
+++ op = NULL;
+++ switch (o->getType(o))
+++ {
+++ case EQUAL:
+++ op = " = ";
+++ break;
+++
+++ case LESS:
+++ op = " < ";
+++ break;
+++
+++ case GREATER:
+++ op = " > ";
+++ break;
+++
+++ case LTE:
+++ op = " <= ";
+++ break;
+++
+++ case GTE:
+++ op = " >= ";
+++ break;
+++ }
+++
+++ field = f->getText(f);
+++
+++ /* Field lookup */
+++ rqfp = rsp_query_field_lookup((char *)field->chars, strlen((char *)field->chars));
+++ if (!rqfp)
+++ {
+++ DPRINTF(E_LOG, L_RSP, "Field '%s' is not a valid field in queries\n", field->chars);
+++ retval.valid= 0;
+++ goto intcrit_valid_0; /* ABORT */
+++ }
+++
+++ /* Check field type */
+++ if (rqfp->field_type != RSP_TYPE_INT)
+++ {
+++ DPRINTF(E_LOG, L_RSP, "Field '%s' is not an integer field\n", field->chars);
+++ retval.valid= 0;
+++ goto intcrit_valid_0; /* ABORT */
+++ }
+++
+++ retval.result= field->factory->newRaw(field->factory);
+++ retval.result->append8(retval.result, "f.");
+++ retval.result->appendS(retval.result, field);
+++ retval.result->append8(retval.result, op);
+++ retval.result->appendS(retval.result, i->getText(i));
+++
+++ intcrit_valid_0:
+++ ;
+++
+++ }
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleintcritEx; /* Prevent compiler warnings */
+++ ruleintcritEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end intcrit */
+++
+++/**
+++ * $ANTLR start intop
+++ * RSP2SQL.g:303:1: intop returns [ pANTLR3_COMMON_TOKEN op ] : (n= EQUAL | n= LESS | n= GREATER | n= LTE | n= GTE );
+++ */
+++static pANTLR3_COMMON_TOKEN
+++intop(pRSP2SQL ctx)
+++{
+++ pANTLR3_COMMON_TOKEN op = NULL;
+++
+++ pANTLR3_BASE_TREE n;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ op= NULL;
+++ n = NULL;
+++
+++ {
+++ {
+++ // RSP2SQL.g:305:2: (n= EQUAL | n= LESS | n= GREATER | n= LTE | n= GTE )
+++
+++ ANTLR3_UINT32 alt3;
+++
+++ alt3=5;
+++
+++ switch ( LA(1) )
+++ {
+++ case EQUAL:
+++ {
+++ alt3=1;
+++ }
+++ break;
+++ case LESS:
+++ {
+++ alt3=2;
+++ }
+++ break;
+++ case GREATER:
+++ {
+++ alt3=3;
+++ }
+++ break;
+++ case LTE:
+++ {
+++ alt3=4;
+++ }
+++ break;
+++ case GTE:
+++ {
+++ alt3=5;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleintopEx;
+++ }
+++
+++ switch (alt3)
+++ {
+++ case 1:
+++ // RSP2SQL.g:305:4: n= EQUAL
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(EQUAL, &FOLLOW_EQUAL_in_intop383);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintopEx;
+++ }
+++
+++ {
+++ op= n->getToken(n);
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP2SQL.g:307:4: n= LESS
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(LESS, &FOLLOW_LESS_in_intop396);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintopEx;
+++ }
+++
+++ {
+++ op= n->getToken(n);
+++ }
+++
+++ }
+++ break;
+++ case 3:
+++ // RSP2SQL.g:309:4: n= GREATER
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(GREATER, &FOLLOW_GREATER_in_intop409);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintopEx;
+++ }
+++
+++ {
+++ op= n->getToken(n);
+++ }
+++
+++ }
+++ break;
+++ case 4:
+++ // RSP2SQL.g:311:4: n= LTE
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(LTE, &FOLLOW_LTE_in_intop422);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintopEx;
+++ }
+++
+++ {
+++ op= n->getToken(n);
+++ }
+++
+++ }
+++ break;
+++ case 5:
+++ // RSP2SQL.g:313:4: n= GTE
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(GTE, &FOLLOW_GTE_in_intop435);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintopEx;
+++ }
+++
+++ {
+++ op= n->getToken(n);
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleintopEx; /* Prevent compiler warnings */
+++ ruleintopEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return op;
+++}
+++/* $ANTLR end intop */
+++
+++/**
+++ * $ANTLR start datecrit
+++ * RSP2SQL.g:317:1: datecrit returns [ pANTLR3_STRING result, int valid ] : ^(o= dateop f= FIELD d= datespec ) ;
+++ */
+++static RSP2SQL_datecrit_return
+++datecrit(pRSP2SQL ctx)
+++{
+++ RSP2SQL_datecrit_return retval;
+++
+++ pANTLR3_BASE_TREE f;
+++ pANTLR3_COMMON_TOKEN o;
+++ #undef RETURN_TYPE_o
+++ #define RETURN_TYPE_o pANTLR3_COMMON_TOKEN
+++
+++ RSP2SQL_datespec_return d;
+++ #undef RETURN_TYPE_d
+++ #define RETURN_TYPE_d RSP2SQL_datespec_return
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ retval.result= NULL; retval.valid= 1;
+++ f = NULL;
+++ o = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ {
+++ // RSP2SQL.g:319:2: ( ^(o= dateop f= FIELD d= datespec ) )
+++ // RSP2SQL.g:319:4: ^(o= dateop f= FIELD d= datespec )
+++ {
+++ FOLLOWPUSH(FOLLOW_dateop_in_datecrit464);
+++ o=dateop(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatecritEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatecritEx;
+++ }
+++
+++ f = (pANTLR3_BASE_TREE) MATCHT(FIELD, &FOLLOW_FIELD_in_datecrit470);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatecritEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_datespec_in_datecrit476);
+++ d=datespec(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatecritEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatecritEx;
+++ }
+++
+++ {
+++
+++ char *op;
+++ const struct rsp_query_field_map *rqfp;
+++ pANTLR3_STRING field;
+++ char buf[32];
+++ int ret;
+++
+++ op = NULL;
+++ switch (o->getType(o))
+++ {
+++ case BEFORE:
+++ op = " < ";
+++ break;
+++
+++ case AFTER:
+++ op = " > ";
+++ break;
+++ }
+++
+++ field = f->getText(f);
+++
+++ /* Field lookup */
+++ rqfp = rsp_query_field_lookup((char *)field->chars, strlen((char *)field->chars));
+++ if (!rqfp)
+++ {
+++ DPRINTF(E_LOG, L_RSP, "Field '%s' is not a valid field in queries\n", field->chars);
+++ retval.valid= 0;
+++ goto datecrit_valid_0; /* ABORT */
+++ }
+++
+++ /* Check field type */
+++ if (rqfp->field_type != RSP_TYPE_DATE)
+++ {
+++ DPRINTF(E_LOG, L_RSP, "Field '%s' is not a date field\n", field->chars);
+++ retval.valid= 0;
+++ goto datecrit_valid_0; /* ABORT */
+++ }
+++
+++ ret = snprintf(buf, sizeof(buf), "%ld", d.date);
+++ if ((ret < 0) || (ret >= sizeof(buf)))
+++ {
+++ DPRINTF(E_LOG, L_RSP, "Date %ld too large for buffer, oops!\n", d.date);
+++ retval.valid= 0;
+++ goto datecrit_valid_0; /* ABORT */
+++ }
+++
+++ retval.result= field->factory->newRaw(field->factory);
+++ retval.result->append8(retval.result, "f.");
+++ retval.result->appendS(retval.result, field);
+++ retval.result->append8(retval.result, op);
+++ retval.result->append8(retval.result, buf);
+++
+++ datecrit_valid_0:
+++ ;
+++
+++ }
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledatecritEx; /* Prevent compiler warnings */
+++ ruledatecritEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end datecrit */
+++
+++/**
+++ * $ANTLR start dateop
+++ * RSP2SQL.g:377:1: dateop returns [ pANTLR3_COMMON_TOKEN op ] : (n= BEFORE | n= AFTER );
+++ */
+++static pANTLR3_COMMON_TOKEN
+++dateop(pRSP2SQL ctx)
+++{
+++ pANTLR3_COMMON_TOKEN op = NULL;
+++
+++ pANTLR3_BASE_TREE n;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ op= NULL;
+++ n = NULL;
+++
+++ {
+++ {
+++ // RSP2SQL.g:379:2: (n= BEFORE | n= AFTER )
+++
+++ ANTLR3_UINT32 alt4;
+++
+++ alt4=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case BEFORE:
+++ {
+++ alt4=1;
+++ }
+++ break;
+++ case AFTER:
+++ {
+++ alt4=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruledateopEx;
+++ }
+++
+++ switch (alt4)
+++ {
+++ case 1:
+++ // RSP2SQL.g:379:4: n= BEFORE
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(BEFORE, &FOLLOW_BEFORE_in_dateop505);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledateopEx;
+++ }
+++
+++ {
+++ op= n->getToken(n);
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP2SQL.g:381:4: n= AFTER
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(AFTER, &FOLLOW_AFTER_in_dateop518);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledateopEx;
+++ }
+++
+++ {
+++ op= n->getToken(n);
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledateopEx; /* Prevent compiler warnings */
+++ ruledateopEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return op;
+++}
+++/* $ANTLR end dateop */
+++
+++/**
+++ * $ANTLR start datespec
+++ * RSP2SQL.g:385:1: datespec returns [ time_t date, int valid ] : (r= dateref | ^(o= dateop r= dateref m= INT i= dateintval ) );
+++ */
+++static RSP2SQL_datespec_return
+++datespec(pRSP2SQL ctx)
+++{
+++ RSP2SQL_datespec_return retval;
+++
+++ pANTLR3_BASE_TREE m;
+++ RSP2SQL_dateref_return r;
+++ #undef RETURN_TYPE_r
+++ #define RETURN_TYPE_r RSP2SQL_dateref_return
+++
+++ pANTLR3_COMMON_TOKEN o;
+++ #undef RETURN_TYPE_o
+++ #define RETURN_TYPE_o pANTLR3_COMMON_TOKEN
+++
+++ RSP2SQL_dateintval_return i;
+++ #undef RETURN_TYPE_i
+++ #define RETURN_TYPE_i RSP2SQL_dateintval_return
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ retval.date= 0; retval.valid= 1;
+++ m = NULL;
+++ o = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ {
+++ {
+++ // RSP2SQL.g:387:2: (r= dateref | ^(o= dateop r= dateref m= INT i= dateintval ) )
+++
+++ ANTLR3_UINT32 alt5;
+++
+++ alt5=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case DATE:
+++ case TODAY:
+++ {
+++ alt5=1;
+++ }
+++ break;
+++ case BEFORE:
+++ case AFTER:
+++ {
+++ alt5=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 5;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruledatespecEx;
+++ }
+++
+++ switch (alt5)
+++ {
+++ case 1:
+++ // RSP2SQL.g:387:4: r= dateref
+++ {
+++ FOLLOWPUSH(FOLLOW_dateref_in_datespec546);
+++ r=dateref(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++ {
+++
+++ if (!r.valid)
+++ retval.valid= 0;
+++ else
+++ retval.date= r.date;
+++
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP2SQL.g:394:4: ^(o= dateop r= dateref m= INT i= dateintval )
+++ {
+++ FOLLOWPUSH(FOLLOW_dateop_in_datespec560);
+++ o=dateop(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_dateref_in_datespec566);
+++ r=dateref(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++ m = (pANTLR3_BASE_TREE) MATCHT(INT, &FOLLOW_INT_in_datespec572);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_dateintval_in_datespec578);
+++ i=dateintval(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++ {
+++
+++ int32_t val;
+++ int ret;
+++
+++ if (!r.valid || !i.valid)
+++ {
+++ retval.valid= 0;
+++ goto datespec_valid_0; /* ABORT */
+++ }
+++
+++ ret = safe_atoi32((char *)m->getText(m)->chars, &val);
+++ if (ret < 0)
+++ {
+++ DPRINTF(E_LOG, L_RSP, "Could not convert '%s' to integer\n", (char *)m->getText(m));
+++ retval.valid= 0;
+++ goto datespec_valid_0; /* ABORT */
+++ }
+++
+++ switch (o->getType(o))
+++ {
+++ case BEFORE:
+++ retval.date= r.date - (val * i.period);
+++ break;
+++
+++ case AFTER:
+++ retval.date= r.date + (val * i.period);
+++ break;
+++ }
+++
+++ datespec_valid_0:
+++ ;
+++
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledatespecEx; /* Prevent compiler warnings */
+++ ruledatespecEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end datespec */
+++
+++/**
+++ * $ANTLR start dateref
+++ * RSP2SQL.g:429:1: dateref returns [ time_t date, int valid ] : (n= DATE | TODAY );
+++ */
+++static RSP2SQL_dateref_return
+++dateref(pRSP2SQL ctx)
+++{
+++ RSP2SQL_dateref_return retval;
+++
+++ pANTLR3_BASE_TREE n;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ retval.date= 0; retval.valid= 1;
+++ n = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ {
+++ {
+++ // RSP2SQL.g:431:2: (n= DATE | TODAY )
+++
+++ ANTLR3_UINT32 alt6;
+++
+++ alt6=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case DATE:
+++ {
+++ alt6=1;
+++ }
+++ break;
+++ case TODAY:
+++ {
+++ alt6=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 6;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruledaterefEx;
+++ }
+++
+++ switch (alt6)
+++ {
+++ case 1:
+++ // RSP2SQL.g:431:4: n= DATE
+++ {
+++ n = (pANTLR3_BASE_TREE) MATCHT(DATE, &FOLLOW_DATE_in_dateref607);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledaterefEx;
+++ }
+++
+++ {
+++
+++ struct tm tm;
+++ char *ret;
+++
+++ ret = strptime((char *)n->getText(n), "%Y-%m-%d", &tm);
+++ if (!ret)
+++ {
+++ DPRINTF(E_LOG, L_RSP, "Date '%s' could not be interpreted\n", (char *)n->getText(n));
+++ retval.valid= 0;
+++ goto dateref_valid_0; /* ABORT */
+++ }
+++ else
+++ {
+++ if (*ret != '\0')
+++ DPRINTF(E_LOG, L_RSP, "Garbage at end of date '%s' ?!\n", (char *)n->getText(n));
+++
+++ retval.date= mktime(&tm);
+++ if (retval.date == (time_t) -1)
+++ {
+++ DPRINTF(E_LOG, L_RSP, "Date '%s' could not be converted to an epoch\n", (char *)n->getText(n));
+++ retval.valid= 0;
+++ goto dateref_valid_0; /* ABORT */
+++ }
+++ }
+++
+++ dateref_valid_0:
+++ ;
+++
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP2SQL.g:460:4: TODAY
+++ {
+++ MATCHT(TODAY, &FOLLOW_TODAY_in_dateref616);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledaterefEx;
+++ }
+++
+++ {
+++ retval.date= time(NULL);
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledaterefEx; /* Prevent compiler warnings */
+++ ruledaterefEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end dateref */
+++
+++/**
+++ * $ANTLR start dateintval
+++ * RSP2SQL.g:464:1: dateintval returns [ time_t period, int valid ] : ( DAY | WEEK | MONTH | YEAR );
+++ */
+++static RSP2SQL_dateintval_return
+++dateintval(pRSP2SQL ctx)
+++{
+++ RSP2SQL_dateintval_return retval;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ retval.period= 0; retval.valid= 1;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ {
+++ {
+++ // RSP2SQL.g:466:2: ( DAY | WEEK | MONTH | YEAR )
+++
+++ ANTLR3_UINT32 alt7;
+++
+++ alt7=4;
+++
+++ switch ( LA(1) )
+++ {
+++ case DAY:
+++ {
+++ alt7=1;
+++ }
+++ break;
+++ case WEEK:
+++ {
+++ alt7=2;
+++ }
+++ break;
+++ case MONTH:
+++ {
+++ alt7=3;
+++ }
+++ break;
+++ case YEAR:
+++ {
+++ alt7=4;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 7;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruledateintvalEx;
+++ }
+++
+++ switch (alt7)
+++ {
+++ case 1:
+++ // RSP2SQL.g:466:4: DAY
+++ {
+++ MATCHT(DAY, &FOLLOW_DAY_in_dateintval640);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledateintvalEx;
+++ }
+++
+++ {
+++ retval.period= 24 * 60 * 60;
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP2SQL.g:468:4: WEEK
+++ {
+++ MATCHT(WEEK, &FOLLOW_WEEK_in_dateintval649);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledateintvalEx;
+++ }
+++
+++ {
+++ retval.period= 7 * 24 * 60 * 60;
+++ }
+++
+++ }
+++ break;
+++ case 3:
+++ // RSP2SQL.g:470:4: MONTH
+++ {
+++ MATCHT(MONTH, &FOLLOW_MONTH_in_dateintval658);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledateintvalEx;
+++ }
+++
+++ {
+++ retval.period= 30 * 24 * 60 * 60;
+++ }
+++
+++ }
+++ break;
+++ case 4:
+++ // RSP2SQL.g:472:4: YEAR
+++ {
+++ MATCHT(YEAR, &FOLLOW_YEAR_in_dateintval667);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledateintvalEx;
+++ }
+++
+++ {
+++ retval.period= 365 * 24 * 60 * 60;
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledateintvalEx; /* Prevent compiler warnings */
+++ ruledateintvalEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end dateintval */
+++/* End of parsing rules
+++ * ==============================================
+++ */
+++
+++/* ==============================================
+++ * Syntactic predicates
+++ */
+++/* End of syntactic predicates
+++ * ==============================================
+++ */
+++
+++
+++
+++
+++
+++
+++/* End of code
+++ * =============================================================================
+++ */
++diff --git a/src/pregen/RSP2SQL.h b/src/pregen/RSP2SQL.h
++new file mode 100644
++index 0000000..a94e317
++--- /dev/null
+++++ b/src/pregen/RSP2SQL.h
++@@ -0,0 +1,291 @@
+++/** \file
+++ * This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : RSP2SQL.g
+++ * - On : 2015-06-27 19:05:19
+++ * - for the tree parser : RSP2SQLTreeParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++ * The tree parser RSP2SQL has the callable functions (rules) shown below,
+++ * which will invoke the code for the associated rule in the source grammar
+++ * assuming that the input stream is pointing to a token/text stream that could begin
+++ * this rule.
+++ *
+++ * For instance if you call the first (topmost) rule in a parser grammar, you will
+++ * get the results of a full parse, but calling a rule half way through the grammar will
+++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
+++ * in editors and so on.
+++ *
+++ * The parser entry points are called indirectly (by function pointer to function) via
+++ * a parser context typedef pRSP2SQL, which is returned from a call to RSP2SQLNew().
+++ *
+++ * The methods in pRSP2SQL are as follows:
+++ *
+++ * - pANTLR3_STRING pRSP2SQL->query(pRSP2SQL)
+++ * - RSP2SQL_expr_return pRSP2SQL->expr(pRSP2SQL)
+++ * - RSP2SQL_strcrit_return pRSP2SQL->strcrit(pRSP2SQL)
+++ * - pANTLR3_COMMON_TOKEN pRSP2SQL->strop(pRSP2SQL)
+++ * - RSP2SQL_intcrit_return pRSP2SQL->intcrit(pRSP2SQL)
+++ * - pANTLR3_COMMON_TOKEN pRSP2SQL->intop(pRSP2SQL)
+++ * - RSP2SQL_datecrit_return pRSP2SQL->datecrit(pRSP2SQL)
+++ * - pANTLR3_COMMON_TOKEN pRSP2SQL->dateop(pRSP2SQL)
+++ * - RSP2SQL_datespec_return pRSP2SQL->datespec(pRSP2SQL)
+++ * - RSP2SQL_dateref_return pRSP2SQL->dateref(pRSP2SQL)
+++ * - RSP2SQL_dateintval_return pRSP2SQL->dateintval(pRSP2SQL)
+++ *
+++ * The return type for any particular rule is of course determined by the source
+++ * grammar file.
+++ */
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++#ifndef _RSP2SQL_H
+++#define _RSP2SQL_H
+++/* =============================================================================
+++ * Standard antlr3 C runtime definitions
+++ */
+++#include <antlr3.h>
+++
+++/* End of standard antlr 3 runtime definitions
+++ * =============================================================================
+++ */
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++// Forward declare the context typedef so that we can use it before it is
+++// properly defined. Delegators and delegates (from import statements) are
+++// interdependent and their context structures contain pointers to each other
+++// C only allows such things to be declared if you pre-declare the typedef.
+++//
+++typedef struct RSP2SQL_Ctx_struct RSP2SQL, * pRSP2SQL;
+++
+++
+++
+++ /* Needs #define _GNU_SOURCE for strptime() */
+++
+++ #include <stdio.h>
+++ #include <string.h>
+++ #include <time.h>
+++ #include <stdint.h>
+++
+++ #include "logger.h"
+++ #include "db.h"
+++ #include "misc.h"
+++ #include "rsp_query.h"
+++
+++
+++#ifdef ANTLR3_WINDOWS
+++// Disable: Unreferenced parameter, - Rules with parameters that are not used
+++// constant conditional, - ANTLR realizes that a prediction is always true (synpred usually)
+++// initialized but unused variable - tree rewrite variables declared but not needed
+++// Unreferenced local variable - lexer rule declares but does not always use _type
+++// potentially unitialized variable used - retval always returned from a rule
+++// unreferenced local function has been removed - susually getTokenNames or freeScope, they can go without warnigns
+++//
+++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
+++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
+++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
+++// this is a matter of orthogonality hence I disable that one.
+++//
+++#pragma warning( disable : 4100 )
+++#pragma warning( disable : 4101 )
+++#pragma warning( disable : 4127 )
+++#pragma warning( disable : 4189 )
+++#pragma warning( disable : 4505 )
+++#pragma warning( disable : 4701 )
+++#endif
+++typedef struct RSP2SQL_expr_return_struct
+++{
+++ pANTLR3_BASE_TREE start;
+++ pANTLR3_BASE_TREE stop;
+++ pANTLR3_STRING result;
+++ int valid;
+++}
+++ RSP2SQL_expr_return;
+++
+++typedef struct RSP2SQL_strcrit_return_struct
+++{
+++ pANTLR3_BASE_TREE start;
+++ pANTLR3_BASE_TREE stop;
+++ pANTLR3_STRING result;
+++ int valid;
+++}
+++ RSP2SQL_strcrit_return;
+++
+++typedef struct RSP2SQL_intcrit_return_struct
+++{
+++ pANTLR3_BASE_TREE start;
+++ pANTLR3_BASE_TREE stop;
+++ pANTLR3_STRING result;
+++ int valid;
+++}
+++ RSP2SQL_intcrit_return;
+++
+++typedef struct RSP2SQL_datecrit_return_struct
+++{
+++ pANTLR3_BASE_TREE start;
+++ pANTLR3_BASE_TREE stop;
+++ pANTLR3_STRING result;
+++ int valid;
+++}
+++ RSP2SQL_datecrit_return;
+++
+++typedef struct RSP2SQL_datespec_return_struct
+++{
+++ pANTLR3_BASE_TREE start;
+++ pANTLR3_BASE_TREE stop;
+++ time_t date;
+++ int valid;
+++}
+++ RSP2SQL_datespec_return;
+++
+++typedef struct RSP2SQL_dateref_return_struct
+++{
+++ pANTLR3_BASE_TREE start;
+++ pANTLR3_BASE_TREE stop;
+++ time_t date;
+++ int valid;
+++}
+++ RSP2SQL_dateref_return;
+++
+++typedef struct RSP2SQL_dateintval_return_struct
+++{
+++ pANTLR3_BASE_TREE start;
+++ pANTLR3_BASE_TREE stop;
+++ time_t period;
+++ int valid;
+++}
+++ RSP2SQL_dateintval_return;
+++
+++
+++
+++/** Context tracking structure for RSP2SQL
+++ */
+++struct RSP2SQL_Ctx_struct
+++{
+++ /** Built in ANTLR3 context tracker contains all the generic elements
+++ * required for context tracking.
+++ */
+++ pANTLR3_TREE_PARSER pTreeParser;
+++
+++
+++ pANTLR3_STRING (*query) (struct RSP2SQL_Ctx_struct * ctx);
+++ RSP2SQL_expr_return (*expr) (struct RSP2SQL_Ctx_struct * ctx);
+++ RSP2SQL_strcrit_return (*strcrit) (struct RSP2SQL_Ctx_struct * ctx);
+++ pANTLR3_COMMON_TOKEN (*strop) (struct RSP2SQL_Ctx_struct * ctx);
+++ RSP2SQL_intcrit_return (*intcrit) (struct RSP2SQL_Ctx_struct * ctx);
+++ pANTLR3_COMMON_TOKEN (*intop) (struct RSP2SQL_Ctx_struct * ctx);
+++ RSP2SQL_datecrit_return (*datecrit) (struct RSP2SQL_Ctx_struct * ctx);
+++ pANTLR3_COMMON_TOKEN (*dateop) (struct RSP2SQL_Ctx_struct * ctx);
+++ RSP2SQL_datespec_return (*datespec) (struct RSP2SQL_Ctx_struct * ctx);
+++ RSP2SQL_dateref_return (*dateref) (struct RSP2SQL_Ctx_struct * ctx);
+++ RSP2SQL_dateintval_return (*dateintval) (struct RSP2SQL_Ctx_struct * ctx);
+++ // Delegated rules
+++ const char * (*getGrammarFileName)();
+++ void (*free) (struct RSP2SQL_Ctx_struct * ctx);
+++
+++};
+++
+++// Function protoypes for the constructor functions that external translation units
+++// such as delegators and delegates may wish to call.
+++//
+++ANTLR3_API pRSP2SQL RSP2SQLNew (pANTLR3_COMMON_TREE_NODE_STREAM instream);
+++ANTLR3_API pRSP2SQL RSP2SQLNewSSD (pANTLR3_COMMON_TREE_NODE_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
+++
+++/** Symbolic definitions of all the tokens that the tree parser will work with.
+++ * \{
+++ *
+++ * Antlr will define EOF, but we can't use that as it it is too common in
+++ * in C header files and that would be confusing. There is no way to filter this out at the moment
+++ * so we just undef it here for now. That isn't the value we get back from C recognizers
+++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
+++ */
+++#ifdef EOF
+++#undef EOF
+++#endif
+++#ifdef Tokens
+++#undef Tokens
+++#endif
+++#define STARTSW 14
+++#define WEEK 26
+++#define TODAY 24
+++#define YEAR 28
+++#define ENDSW 15
+++#define GTE 20
+++#define BEFORE 21
+++#define DAY 25
+++#define INT 16
+++#define NOT 11
+++#define AFTER 22
+++#define AND 6
+++#define EOF -1
+++#define LTE 19
+++#define MONTH 27
+++#define DIGIT19 31
+++#define INCLUDES 13
+++#define STR 10
+++#define QUOTE 29
+++#define GREATER 18
+++#define WS 30
+++#define LPAR 7
+++#define NEWLINE 4
+++#define EQUAL 12
+++#define OR 5
+++#define LESS 17
+++#define FIELD 9
+++#define RPAR 8
+++#define ESCAPED 33
+++#define DATE 23
+++#define DIGIT09 32
+++#ifdef EOF
+++#undef EOF
+++#define EOF ANTLR3_TOKEN_EOF
+++#endif
+++
+++#ifndef TOKENSOURCE
+++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
+++#endif
+++
+++/* End of token definitions for RSP2SQL
+++ * =============================================================================
+++ */
+++/** \} */
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif
+++
+++/* END - Note:Keep extra line feed to satisfy UNIX systems */
++diff --git a/src/pregen/RSP2SQL.u b/src/pregen/RSP2SQL.u
++new file mode 100644
++index 0000000..53d8cda
++--- /dev/null
+++++ b/src/pregen/RSP2SQL.u
++@@ -0,0 +1,5 @@
+++RSP2SQL.g: RSP.tokens
+++RSP2SQL.c : RSP2SQL.g
+++./RSP2SQL.tokens : RSP2SQL.g
+++RSP2SQL.h : RSP2SQL.g
+++ANTLR_PRODUCTS += RSP2SQL.c ./RSP2SQL.tokens RSP2SQL.h
++\ No newline at end of file
++diff --git a/src/pregen/RSPLexer.c b/src/pregen/RSPLexer.c
++new file mode 100644
++index 0000000..bc4245a
++--- /dev/null
+++++ b/src/pregen/RSPLexer.c
++@@ -0,0 +1,4867 @@
+++/** \file
+++ * This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : RSP.g
+++ * - On : 2015-06-27 19:05:18
+++ * - for the lexer : RSPLexerLexer *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++*/
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++/* -----------------------------------------
+++ * Include the ANTLR3 generated header file.
+++ */
+++#include "RSPLexer.h"
+++/* ----------------------------------------- */
+++
+++
+++/** String literals used by RSPLexer that we must do things like MATCHS() with.
+++ * C will normally just lay down 8 bit characters, and you can use L"xxx" to
+++ * get wchar_t, but wchar_t is 16 bits on Windows, which is not UTF32 and so
+++ * we perform this little trick of defining the literals as arrays of UINT32
+++ * and passing in the address of these.
+++ */
+++static ANTLR3_UCHAR lit_1[] = { 0x61, 0x6E, 0x64, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_2[] = { 0x6F, 0x72, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_3[] = { 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x73, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_4[] = { 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x77, 0x69, 0x74, 0x68, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_5[] = { 0x65, 0x6E, 0x64, 0x73, 0x77, 0x69, 0x74, 0x68, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_6[] = { 0x3E, 0x3D, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_7[] = { 0x3C, 0x3D, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_8[] = { 0x62, 0x65, 0x66, 0x6F, 0x72, 0x65, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_9[] = { 0x61, 0x66, 0x74, 0x65, 0x72, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_10[] = { 0x64, 0x61, 0x79, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_11[] = { 0x64, 0x61, 0x79, 0x73, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_12[] = { 0x77, 0x65, 0x65, 0x6B, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_13[] = { 0x77, 0x65, 0x65, 0x6B, 0x73, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_14[] = { 0x6D, 0x6F, 0x6E, 0x74, 0x68, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_15[] = { 0x6D, 0x6F, 0x6E, 0x74, 0x68, 0x73, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_16[] = { 0x79, 0x65, 0x61, 0x72, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_17[] = { 0x79, 0x65, 0x61, 0x72, 0x73, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_18[] = { 0x74, 0x6F, 0x64, 0x61, 0x79, ANTLR3_STRING_TERMINATOR};
+++
+++
+++
+++
+++/* MACROS that hide the C interface implementations from the
+++ * generated code, which makes it a little more understandable to the human eye.
+++ * I am very much against using C pre-processor macros for function calls and bits
+++ * of code as you cannot see what is happening when single stepping in debuggers
+++ * and so on. The exception (in my book at least) is for generated code, where you are
+++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
+++ * hides some indirect calls, but is always referring to the input stream. This is
+++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
+++ * the runtime interfaces without changing the generated code too often, without
+++ * confusing the reader of the generated output, who may not wish to know the gory
+++ * details of the interface inheritance.
+++ */
+++
+++#define CTX ctx
+++
+++/* Aids in accessing scopes for grammar programmers
+++ */
+++#undef SCOPE_TYPE
+++#undef SCOPE_STACK
+++#undef SCOPE_TOP
+++#define SCOPE_TYPE(scope) pRSPLexer_##scope##_SCOPE
+++#define SCOPE_STACK(scope) pRSPLexer_##scope##Stack
+++#define SCOPE_TOP(scope) ctx->pRSPLexer_##scope##Top
+++#define SCOPE_SIZE(scope) ctx->pRSPLexer_##scope##Stack_limit
+++#define SCOPE_INSTANCE(scope, i) (ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
+++
+++
+++/* Macros for accessing things in a lexer
+++ */
+++#undef LEXER
+++#undef RECOGNIZER
+++#undef RULEMEMO
+++#undef GETCHARINDEX
+++#undef GETLINE
+++#undef GETCHARPOSITIONINLINE
+++#undef EMIT
+++#undef EMITNEW
+++#undef MATCHC
+++#undef MATCHS
+++#undef MATCHRANGE
+++#undef LTOKEN
+++#undef HASFAILED
+++#undef FAILEDFLAG
+++#undef INPUT
+++#undef STRSTREAM
+++#undef LA
+++#undef HASEXCEPTION
+++#undef EXCEPTION
+++#undef CONSTRUCTEX
+++#undef CONSUME
+++#undef LRECOVER
+++#undef MARK
+++#undef REWIND
+++#undef REWINDLAST
+++#undef BACKTRACKING
+++#undef MATCHANY
+++#undef MEMOIZE
+++#undef HAVEPARSEDRULE
+++#undef GETTEXT
+++#undef INDEX
+++#undef SEEK
+++#undef PUSHSTREAM
+++#undef POPSTREAM
+++#undef SETTEXT
+++#undef SETTEXT8
+++
+++#define LEXER ctx->pLexer
+++#define RECOGNIZER LEXER->rec
+++#define LEXSTATE RECOGNIZER->state
+++#define TOKSOURCE LEXSTATE->tokSource
+++#define GETCHARINDEX() LEXER->getCharIndex(LEXER)
+++#define GETLINE() LEXER->getLine(LEXER)
+++#define GETTEXT() LEXER->getText(LEXER)
+++#define GETCHARPOSITIONINLINE() LEXER->getCharPositionInLine(LEXER)
+++#define EMIT() LEXSTATE->type = _type; LEXER->emit(LEXER)
+++#define EMITNEW(t) LEXER->emitNew(LEXER, t)
+++#define MATCHC(c) LEXER->matchc(LEXER, c)
+++#define MATCHS(s) LEXER->matchs(LEXER, s)
+++#define MATCHRANGE(c1,c2) LEXER->matchRange(LEXER, c1, c2)
+++#define MATCHANY() LEXER->matchAny(LEXER)
+++#define LTOKEN LEXSTATE->token
+++#define HASFAILED() (LEXSTATE->failed == ANTLR3_TRUE)
+++#define BACKTRACKING LEXSTATE->backtracking
+++#define FAILEDFLAG LEXSTATE->failed
+++#define INPUT LEXER->input
+++#define STRSTREAM INPUT
+++#define ISTREAM INPUT->istream
+++#define INDEX() ISTREAM->index(ISTREAM)
+++#define SEEK(n) ISTREAM->seek(ISTREAM, n)
+++#define EOF_TOKEN &(LEXSTATE->tokSource->eofToken)
+++#define HASEXCEPTION() (LEXSTATE->error == ANTLR3_TRUE)
+++#define EXCEPTION LEXSTATE->exception
+++#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER)
+++#define LRECOVER() LEXER->recover(LEXER)
+++#define MARK() ISTREAM->mark(ISTREAM)
+++#define REWIND(m) ISTREAM->rewind(ISTREAM, m)
+++#define REWINDLAST() ISTREAM->rewindLast(ISTREAM)
+++#define MEMOIZE(ri,si) RECOGNIZER->memoize(RECOGNIZER, ri, si)
+++#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
+++#define PUSHSTREAM(str) LEXER->pushCharStream(LEXER, str)
+++#define POPSTREAM() LEXER->popCharStream(LEXER)
+++#define SETTEXT(str) LEXSTATE->text = str
+++#define SKIP() LEXSTATE->token = &(TOKSOURCE->skipToken)
+++#define USER1 LEXSTATE->user1
+++#define USER2 LEXSTATE->user2
+++#define USER3 LEXSTATE->user3
+++#define CUSTOM LEXSTATE->custom
+++#define RULEMEMO LEXSTATE->ruleMemo
+++#define DBG RECOGNIZER->debugger
+++
+++/* If we have been told we can rely on the standard 8 bit or 16 bit input
+++ * stream, then we can define our macros to use the direct pointers
+++ * in the input object, which is much faster than indirect calls. This
+++ * is really only significant to lexers with a lot of fragment rules (which
+++ * do not place LA(1) in a temporary at the moment) and even then
+++ * only if there is a lot of input (order of say 1M or so).
+++ */
+++#if defined(ANTLR3_INLINE_INPUT_ASCII) || defined(ANTLR3_INLINE_INPUT_UTF16)
+++
+++# ifdef ANTLR3_INLINE_INPUT_ASCII
+++
+++/* 8 bit "ASCII" (actually any 8 bit character set) */
+++
+++# define NEXTCHAR ((pANTLR3_UINT8)(INPUT->nextChar))
+++# define DATAP ((pANTLR3_UINT8)(INPUT->data))
+++
+++# else
+++
+++# define NEXTCHAR ((pANTLR3_UINT16)(INPUT->nextChar))
+++# define DATAP ((pANTLR3_UINT16)(INPUT->data))
+++
+++# endif
+++
+++# define LA(n) ((NEXTCHAR + n) > (DATAP + INPUT->sizeBuf) ? ANTLR3_CHARSTREAM_EOF : (ANTLR3_UCHAR)(*(NEXTCHAR + n - 1)))
+++# define CONSUME() \
+++{ \
+++ if (NEXTCHAR < (DATAP + INPUT->sizeBuf)) \
+++ { \
+++ INPUT->charPositionInLine++; \
+++ if ((ANTLR3_UCHAR)(*NEXTCHAR) == INPUT->newlineChar) \
+++ { \
+++ INPUT->line++; \
+++ INPUT->charPositionInLine = 0; \
+++ INPUT->currentLine = (void *)(NEXTCHAR + 1); \
+++ } \
+++ INPUT->nextChar = (void *)(NEXTCHAR + 1); \
+++ } \
+++}
+++
+++#else
+++
+++// Pick up the input character by calling the input stream implementation.
+++//
+++#define CONSUME() INPUT->istream->consume(INPUT->istream)
+++#define LA(n) INPUT->istream->_LA(INPUT->istream, n)
+++
+++#endif
+++#define TOKTEXT(tok, txt) tok, (pANTLR3_UINT8)txt
+++
+++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
+++ * then for the present you must use different names for your defines as these are hard coded
+++ * in the code generator. It would be better not to use such names internally, and maybe
+++ * we can change this in a forthcoming release. I deliberately do not #undef these
+++ * here as this will at least give you a redefined error somewhere if they clash.
+++ */
+++#define UP ANTLR3_TOKEN_UP
+++#define DOWN ANTLR3_TOKEN_DOWN
+++#define EOR ANTLR3_TOKEN_EOR
+++#define INVALID ANTLR3_TOKEN_INVALID
+++
+++
+++/* =============================================================================
+++ * Functions to create and destroy scopes. First come the rule scopes, followed
+++ * by the global declared scopes.
+++ */
+++
+++
+++
+++/* ============================================================================= */
+++
+++/* =============================================================================
+++ * Start of recognizer
+++ */
+++
+++
+++/* Forward declare the locally static matching functions we have generated and any predicate functions.
+++ */
+++static ANTLR3_INLINE void mQUOTE (pRSPLexer ctx);
+++static ANTLR3_INLINE void mLPAR (pRSPLexer ctx);
+++static ANTLR3_INLINE void mRPAR (pRSPLexer ctx);
+++static ANTLR3_INLINE void mAND (pRSPLexer ctx);
+++static ANTLR3_INLINE void mOR (pRSPLexer ctx);
+++static ANTLR3_INLINE void mNOT (pRSPLexer ctx);
+++static ANTLR3_INLINE void mEQUAL (pRSPLexer ctx);
+++static ANTLR3_INLINE void mINCLUDES (pRSPLexer ctx);
+++static ANTLR3_INLINE void mSTARTSW (pRSPLexer ctx);
+++static ANTLR3_INLINE void mENDSW (pRSPLexer ctx);
+++static ANTLR3_INLINE void mGREATER (pRSPLexer ctx);
+++static ANTLR3_INLINE void mLESS (pRSPLexer ctx);
+++static ANTLR3_INLINE void mGTE (pRSPLexer ctx);
+++static ANTLR3_INLINE void mLTE (pRSPLexer ctx);
+++static ANTLR3_INLINE void mBEFORE (pRSPLexer ctx);
+++static ANTLR3_INLINE void mAFTER (pRSPLexer ctx);
+++static ANTLR3_INLINE void mDAY (pRSPLexer ctx);
+++static ANTLR3_INLINE void mWEEK (pRSPLexer ctx);
+++static ANTLR3_INLINE void mMONTH (pRSPLexer ctx);
+++static ANTLR3_INLINE void mYEAR (pRSPLexer ctx);
+++static ANTLR3_INLINE void mTODAY (pRSPLexer ctx);
+++static ANTLR3_INLINE void mNEWLINE (pRSPLexer ctx);
+++static ANTLR3_INLINE void mWS (pRSPLexer ctx);
+++static ANTLR3_INLINE void mFIELD (pRSPLexer ctx);
+++static ANTLR3_INLINE void mINT (pRSPLexer ctx);
+++static ANTLR3_INLINE void mDATE (pRSPLexer ctx);
+++static ANTLR3_INLINE void mSTR (pRSPLexer ctx);
+++static ANTLR3_INLINE void mESCAPED (pRSPLexer ctx);
+++static ANTLR3_INLINE void mDIGIT09 (pRSPLexer ctx);
+++static ANTLR3_INLINE void mDIGIT19 (pRSPLexer ctx);
+++static ANTLR3_INLINE void mTokens (pRSPLexer ctx);
+++static void RSPLexerFree(pRSPLexer ctx);
+++
+++/* =========================================================================
+++ * Lexer matching rules end.
+++ * =========================================================================
+++ */
+++
+++
+++
+++static void
+++RSPLexerFree (pRSPLexer ctx)
+++{
+++ LEXER->free(LEXER);
+++
+++ ANTLR3_FREE(ctx);
+++}
+++
+++/** \brief Name of the grammar file that generated this code
+++ */
+++static const char fileName[] = "RSP.g";
+++
+++/** \brief Return the name of the grammar file that generated this code.
+++ */
+++static const char * getGrammarFileName()
+++{
+++ return fileName;
+++}
+++
+++/** \brief Create a new lexer called RSPLexer
+++ *
+++ * \param[in] instream Pointer to an initialized input stream
+++ * \return
+++ * - Success pRSPLexer initialized for the lex start
+++ * - Fail NULL
+++ */
+++ANTLR3_API pRSPLexer RSPLexerNew
+++(pANTLR3_INPUT_STREAM instream)
+++{
+++ // See if we can create a new lexer with the standard constructor
+++ //
+++ return RSPLexerNewSSD(instream, NULL);
+++}
+++
+++/** \brief Create a new lexer called RSPLexer
+++ *
+++ * \param[in] instream Pointer to an initialized input stream
+++ * \param[state] state Previously created shared recognizer stat
+++ * \return
+++ * - Success pRSPLexer initialized for the lex start
+++ * - Fail NULL
+++ */
+++ANTLR3_API pRSPLexer RSPLexerNewSSD
+++(pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
+++{
+++ pRSPLexer ctx; // Context structure we will build and return
+++
+++ ctx = (pRSPLexer) ANTLR3_CALLOC(1, sizeof(RSPLexer));
+++
+++ if (ctx == NULL)
+++ {
+++ // Failed to allocate memory for lexer context
+++ return NULL;
+++ }
+++
+++ /* -------------------------------------------------------------------
+++ * Memory for basic structure is allocated, now to fill in
+++ * in base ANTLR3 structures. We initialize the function pointers
+++ * for the standard ANTLR3 lexer function set, but upon return
+++ * from here, the programmer may set the pointers to provide custom
+++ * implementations of each function.
+++ *
+++ * We don't use the macros defined in RSPLexer.h here so you can get a sense
+++ * of what goes where.
+++ */
+++
+++ /* Create a base lexer, using the supplied input stream
+++ */
+++ ctx->pLexer = antlr3LexerNewStream(ANTLR3_SIZE_HINT, instream, state);
+++
+++ /* Check that we allocated the memory correctly
+++ */
+++ if (ctx->pLexer == NULL)
+++ {
+++ ANTLR3_FREE(ctx);
+++ return NULL;
+++ }
+++ /* Install the implementation of our RSPLexer interface
+++ */
+++ ctx->mQUOTE = mQUOTE;
+++ ctx->mLPAR = mLPAR;
+++ ctx->mRPAR = mRPAR;
+++ ctx->mAND = mAND;
+++ ctx->mOR = mOR;
+++ ctx->mNOT = mNOT;
+++ ctx->mEQUAL = mEQUAL;
+++ ctx->mINCLUDES = mINCLUDES;
+++ ctx->mSTARTSW = mSTARTSW;
+++ ctx->mENDSW = mENDSW;
+++ ctx->mGREATER = mGREATER;
+++ ctx->mLESS = mLESS;
+++ ctx->mGTE = mGTE;
+++ ctx->mLTE = mLTE;
+++ ctx->mBEFORE = mBEFORE;
+++ ctx->mAFTER = mAFTER;
+++ ctx->mDAY = mDAY;
+++ ctx->mWEEK = mWEEK;
+++ ctx->mMONTH = mMONTH;
+++ ctx->mYEAR = mYEAR;
+++ ctx->mTODAY = mTODAY;
+++ ctx->mNEWLINE = mNEWLINE;
+++ ctx->mWS = mWS;
+++ ctx->mFIELD = mFIELD;
+++ ctx->mINT = mINT;
+++ ctx->mDATE = mDATE;
+++ ctx->mSTR = mSTR;
+++ ctx->mESCAPED = mESCAPED;
+++ ctx->mDIGIT09 = mDIGIT09;
+++ ctx->mDIGIT19 = mDIGIT19;
+++ ctx->mTokens = mTokens;
+++
+++ /** When the nextToken() call is made to this lexer's pANTLR3_TOKEN_SOURCE
+++ * it will call mTokens() in this generated code, and will pass it the ctx
+++ * pointer of this lexer, not the context of the base lexer, so store that now.
+++ */
+++ ctx->pLexer->ctx = ctx;
+++
+++ /**Install the token matching function
+++ */
+++ ctx->pLexer->mTokens = (void (*) (void *))(mTokens);
+++
+++ ctx->getGrammarFileName = getGrammarFileName;
+++ ctx->free = RSPLexerFree;
+++
+++
+++
+++
+++
+++ /* Return the newly built lexer to the caller
+++ */
+++ return ctx;
+++}
+++
+++
+++/* =========================================================================
+++ * Functions to match the lexer grammar defined tokens from the input stream
+++ */
+++
+++// Comes from: 85:7: ( '\"' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start QUOTE
+++ *
+++ * Looks to match the characters the constitute the token QUOTE
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mQUOTE(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = QUOTE;
+++
+++
+++ // RSP.g:85:7: ( '\"' )
+++ // RSP.g:85:9: '\"'
+++ {
+++ MATCHC('"');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleQUOTEEx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleQUOTEEx; /* Prevent compiler warnings */
+++ ruleQUOTEEx: ;
+++
+++}
+++// $ANTLR end QUOTE
+++
+++// Comes from: 86:6: ( '(' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start LPAR
+++ *
+++ * Looks to match the characters the constitute the token LPAR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mLPAR(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = LPAR;
+++
+++
+++ // RSP.g:86:6: ( '(' )
+++ // RSP.g:86:8: '('
+++ {
+++ MATCHC('(');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleLPAREx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleLPAREx; /* Prevent compiler warnings */
+++ ruleLPAREx: ;
+++
+++}
+++// $ANTLR end LPAR
+++
+++// Comes from: 87:6: ( ')' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start RPAR
+++ *
+++ * Looks to match the characters the constitute the token RPAR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mRPAR(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = RPAR;
+++
+++
+++ // RSP.g:87:6: ( ')' )
+++ // RSP.g:87:8: ')'
+++ {
+++ MATCHC(')');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleRPAREx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleRPAREx; /* Prevent compiler warnings */
+++ ruleRPAREx: ;
+++
+++}
+++// $ANTLR end RPAR
+++
+++// Comes from: 89:5: ( 'and' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start AND
+++ *
+++ * Looks to match the characters the constitute the token AND
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mAND(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = AND;
+++
+++
+++ // RSP.g:89:5: ( 'and' )
+++ // RSP.g:89:7: 'and'
+++ {
+++ MATCHS(lit_1);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleANDEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleANDEx; /* Prevent compiler warnings */
+++ ruleANDEx: ;
+++
+++}
+++// $ANTLR end AND
+++
+++// Comes from: 90:4: ( 'or' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start OR
+++ *
+++ * Looks to match the characters the constitute the token OR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mOR(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = OR;
+++
+++
+++ // RSP.g:90:4: ( 'or' )
+++ // RSP.g:90:6: 'or'
+++ {
+++ MATCHS(lit_2);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleOREx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleOREx; /* Prevent compiler warnings */
+++ ruleOREx: ;
+++
+++}
+++// $ANTLR end OR
+++
+++// Comes from: 91:5: ( '!' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start NOT
+++ *
+++ * Looks to match the characters the constitute the token NOT
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mNOT(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = NOT;
+++
+++
+++ // RSP.g:91:5: ( '!' )
+++ // RSP.g:91:7: '!'
+++ {
+++ MATCHC('!');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleNOTEx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleNOTEx; /* Prevent compiler warnings */
+++ ruleNOTEx: ;
+++
+++}
+++// $ANTLR end NOT
+++
+++// Comes from: 94:7: ( '=' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start EQUAL
+++ *
+++ * Looks to match the characters the constitute the token EQUAL
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mEQUAL(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = EQUAL;
+++
+++
+++ // RSP.g:94:7: ( '=' )
+++ // RSP.g:94:9: '='
+++ {
+++ MATCHC('=');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleEQUALEx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleEQUALEx; /* Prevent compiler warnings */
+++ ruleEQUALEx: ;
+++
+++}
+++// $ANTLR end EQUAL
+++
+++// Comes from: 97:9: ( 'includes' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start INCLUDES
+++ *
+++ * Looks to match the characters the constitute the token INCLUDES
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mINCLUDES(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = INCLUDES;
+++
+++
+++ // RSP.g:97:9: ( 'includes' )
+++ // RSP.g:97:11: 'includes'
+++ {
+++ MATCHS(lit_3);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINCLUDESEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleINCLUDESEx; /* Prevent compiler warnings */
+++ ruleINCLUDESEx: ;
+++
+++}
+++// $ANTLR end INCLUDES
+++
+++// Comes from: 98:9: ( 'startswith' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start STARTSW
+++ *
+++ * Looks to match the characters the constitute the token STARTSW
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mSTARTSW(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = STARTSW;
+++
+++
+++ // RSP.g:98:9: ( 'startswith' )
+++ // RSP.g:98:11: 'startswith'
+++ {
+++ MATCHS(lit_4);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTARTSWEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleSTARTSWEx; /* Prevent compiler warnings */
+++ ruleSTARTSWEx: ;
+++
+++}
+++// $ANTLR end STARTSW
+++
+++// Comes from: 99:7: ( 'endswith' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start ENDSW
+++ *
+++ * Looks to match the characters the constitute the token ENDSW
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mENDSW(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = ENDSW;
+++
+++
+++ // RSP.g:99:7: ( 'endswith' )
+++ // RSP.g:99:9: 'endswith'
+++ {
+++ MATCHS(lit_5);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENDSWEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleENDSWEx; /* Prevent compiler warnings */
+++ ruleENDSWEx: ;
+++
+++}
+++// $ANTLR end ENDSW
+++
+++// Comes from: 102:9: ( '>' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start GREATER
+++ *
+++ * Looks to match the characters the constitute the token GREATER
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mGREATER(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = GREATER;
+++
+++
+++ // RSP.g:102:9: ( '>' )
+++ // RSP.g:102:11: '>'
+++ {
+++ MATCHC('>');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleGREATEREx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleGREATEREx; /* Prevent compiler warnings */
+++ ruleGREATEREx: ;
+++
+++}
+++// $ANTLR end GREATER
+++
+++// Comes from: 103:6: ( '<' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start LESS
+++ *
+++ * Looks to match the characters the constitute the token LESS
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mLESS(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = LESS;
+++
+++
+++ // RSP.g:103:6: ( '<' )
+++ // RSP.g:103:8: '<'
+++ {
+++ MATCHC('<');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleLESSEx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleLESSEx; /* Prevent compiler warnings */
+++ ruleLESSEx: ;
+++
+++}
+++// $ANTLR end LESS
+++
+++// Comes from: 104:5: ( '>=' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start GTE
+++ *
+++ * Looks to match the characters the constitute the token GTE
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mGTE(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = GTE;
+++
+++
+++ // RSP.g:104:5: ( '>=' )
+++ // RSP.g:104:7: '>='
+++ {
+++ MATCHS(lit_6);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleGTEEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleGTEEx; /* Prevent compiler warnings */
+++ ruleGTEEx: ;
+++
+++}
+++// $ANTLR end GTE
+++
+++// Comes from: 105:5: ( '<=' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start LTE
+++ *
+++ * Looks to match the characters the constitute the token LTE
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mLTE(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = LTE;
+++
+++
+++ // RSP.g:105:5: ( '<=' )
+++ // RSP.g:105:7: '<='
+++ {
+++ MATCHS(lit_7);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleLTEEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleLTEEx; /* Prevent compiler warnings */
+++ ruleLTEEx: ;
+++
+++}
+++// $ANTLR end LTE
+++
+++// Comes from: 108:8: ( 'before' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start BEFORE
+++ *
+++ * Looks to match the characters the constitute the token BEFORE
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mBEFORE(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = BEFORE;
+++
+++
+++ // RSP.g:108:8: ( 'before' )
+++ // RSP.g:108:10: 'before'
+++ {
+++ MATCHS(lit_8);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleBEFOREEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleBEFOREEx; /* Prevent compiler warnings */
+++ ruleBEFOREEx: ;
+++
+++}
+++// $ANTLR end BEFORE
+++
+++// Comes from: 109:7: ( 'after' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start AFTER
+++ *
+++ * Looks to match the characters the constitute the token AFTER
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mAFTER(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = AFTER;
+++
+++
+++ // RSP.g:109:7: ( 'after' )
+++ // RSP.g:109:9: 'after'
+++ {
+++ MATCHS(lit_9);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleAFTEREx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleAFTEREx; /* Prevent compiler warnings */
+++ ruleAFTEREx: ;
+++
+++}
+++// $ANTLR end AFTER
+++
+++// Comes from: 110:5: ( 'day' | 'days' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start DAY
+++ *
+++ * Looks to match the characters the constitute the token DAY
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mDAY(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = DAY;
+++
+++
+++ {
+++ // RSP.g:110:5: ( 'day' | 'days' )
+++
+++ ANTLR3_UINT32 alt1;
+++
+++ alt1=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'd':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'a':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'y':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 's':
+++ {
+++ alt1=2;
+++ }
+++ break;
+++
+++ default:
+++ alt1=1;}
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 2;
+++
+++
+++ goto ruleDAYEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 1;
+++
+++
+++ goto ruleDAYEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleDAYEx;
+++ }
+++
+++ switch (alt1)
+++ {
+++ case 1:
+++ // RSP.g:110:7: 'day'
+++ {
+++ MATCHS(lit_10);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDAYEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:110:15: 'days'
+++ {
+++ MATCHS(lit_11);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDAYEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleDAYEx; /* Prevent compiler warnings */
+++ ruleDAYEx: ;
+++
+++}
+++// $ANTLR end DAY
+++
+++// Comes from: 111:6: ( 'week' | 'weeks' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start WEEK
+++ *
+++ * Looks to match the characters the constitute the token WEEK
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mWEEK(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = WEEK;
+++
+++
+++ {
+++ // RSP.g:111:6: ( 'week' | 'weeks' )
+++
+++ ANTLR3_UINT32 alt2;
+++
+++ alt2=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'w':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'k':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 's':
+++ {
+++ alt2=2;
+++ }
+++ break;
+++
+++ default:
+++ alt2=1;}
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 2;
+++ EXCEPTION->state = 3;
+++
+++
+++ goto ruleWEEKEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 2;
+++ EXCEPTION->state = 2;
+++
+++
+++ goto ruleWEEKEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 2;
+++ EXCEPTION->state = 1;
+++
+++
+++ goto ruleWEEKEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 2;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleWEEKEx;
+++ }
+++
+++ switch (alt2)
+++ {
+++ case 1:
+++ // RSP.g:111:8: 'week'
+++ {
+++ MATCHS(lit_12);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleWEEKEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:111:17: 'weeks'
+++ {
+++ MATCHS(lit_13);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleWEEKEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleWEEKEx; /* Prevent compiler warnings */
+++ ruleWEEKEx: ;
+++
+++}
+++// $ANTLR end WEEK
+++
+++// Comes from: 112:7: ( 'month' | 'months' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start MONTH
+++ *
+++ * Looks to match the characters the constitute the token MONTH
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mMONTH(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = MONTH;
+++
+++
+++ {
+++ // RSP.g:112:7: ( 'month' | 'months' )
+++
+++ ANTLR3_UINT32 alt3;
+++
+++ alt3=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'm':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'o':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'n':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 't':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 'h':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case 's':
+++ {
+++ alt3=2;
+++ }
+++ break;
+++
+++ default:
+++ alt3=1;}
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 4;
+++
+++
+++ goto ruleMONTHEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 3;
+++
+++
+++ goto ruleMONTHEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 2;
+++
+++
+++ goto ruleMONTHEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 1;
+++
+++
+++ goto ruleMONTHEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleMONTHEx;
+++ }
+++
+++ switch (alt3)
+++ {
+++ case 1:
+++ // RSP.g:112:9: 'month'
+++ {
+++ MATCHS(lit_14);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleMONTHEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:112:19: 'months'
+++ {
+++ MATCHS(lit_15);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleMONTHEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleMONTHEx; /* Prevent compiler warnings */
+++ ruleMONTHEx: ;
+++
+++}
+++// $ANTLR end MONTH
+++
+++// Comes from: 113:6: ( 'year' | 'years' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start YEAR
+++ *
+++ * Looks to match the characters the constitute the token YEAR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mYEAR(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = YEAR;
+++
+++
+++ {
+++ // RSP.g:113:6: ( 'year' | 'years' )
+++
+++ ANTLR3_UINT32 alt4;
+++
+++ alt4=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'y':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'a':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'r':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 's':
+++ {
+++ alt4=2;
+++ }
+++ break;
+++
+++ default:
+++ alt4=1;}
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 3;
+++
+++
+++ goto ruleYEAREx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 2;
+++
+++
+++ goto ruleYEAREx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 1;
+++
+++
+++ goto ruleYEAREx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleYEAREx;
+++ }
+++
+++ switch (alt4)
+++ {
+++ case 1:
+++ // RSP.g:113:8: 'year'
+++ {
+++ MATCHS(lit_16);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleYEAREx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:113:17: 'years'
+++ {
+++ MATCHS(lit_17);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleYEAREx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleYEAREx; /* Prevent compiler warnings */
+++ ruleYEAREx: ;
+++
+++}
+++// $ANTLR end YEAR
+++
+++// Comes from: 114:7: ( 'today' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start TODAY
+++ *
+++ * Looks to match the characters the constitute the token TODAY
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mTODAY(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = TODAY;
+++
+++
+++ // RSP.g:114:7: ( 'today' )
+++ // RSP.g:114:9: 'today'
+++ {
+++ MATCHS(lit_18);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTODAYEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleTODAYEx; /* Prevent compiler warnings */
+++ ruleTODAYEx: ;
+++
+++}
+++// $ANTLR end TODAY
+++
+++// Comes from: 116:9: ( ( '\\r' )? '\\n' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start NEWLINE
+++ *
+++ * Looks to match the characters the constitute the token NEWLINE
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mNEWLINE(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = NEWLINE;
+++
+++
+++ // RSP.g:116:9: ( ( '\\r' )? '\\n' )
+++ // RSP.g:116:11: ( '\\r' )? '\\n'
+++ {
+++
+++ // RSP.g:116:11: ( '\\r' )?
+++ {
+++ int alt5=2;
+++ switch ( LA(1) )
+++ {
+++ case '\r':
+++ {
+++ alt5=1;
+++ }
+++ break;
+++ }
+++
+++ switch (alt5)
+++ {
+++ case 1:
+++ // RSP.g:116:11: '\\r'
+++ {
+++ MATCHC('\r');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleNEWLINEEx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ MATCHC('\n');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleNEWLINEEx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleNEWLINEEx; /* Prevent compiler warnings */
+++ ruleNEWLINEEx: ;
+++
+++}
+++// $ANTLR end NEWLINE
+++
+++// Comes from: 118:4: ( ( ' ' | '\\t' ) )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start WS
+++ *
+++ * Looks to match the characters the constitute the token WS
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mWS(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = WS;
+++
+++
+++ // RSP.g:118:4: ( ( ' ' | '\\t' ) )
+++ // RSP.g:118:6: ( ' ' | '\\t' )
+++ {
+++ if ( LA(1) == '\t' || LA(1) == ' ' )
+++ {
+++ CONSUME();
+++
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++
+++ LRECOVER(); goto ruleWSEx;
+++ }
+++
+++ {
+++ LEXSTATE->channel = HIDDEN;
+++ }
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleWSEx; /* Prevent compiler warnings */
+++ ruleWSEx: ;
+++
+++}
+++// $ANTLR end WS
+++
+++// Comes from: 120:7: ( 'a' .. 'z' ( 'a' .. 'z' | '_' )* 'a' .. 'z' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start FIELD
+++ *
+++ * Looks to match the characters the constitute the token FIELD
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mFIELD(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = FIELD;
+++
+++
+++ // RSP.g:120:7: ( 'a' .. 'z' ( 'a' .. 'z' | '_' )* 'a' .. 'z' )
+++ // RSP.g:120:9: 'a' .. 'z' ( 'a' .. 'z' | '_' )* 'a' .. 'z'
+++ {
+++ MATCHRANGE('a', 'z');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleFIELDEx;
+++ }
+++
+++
+++ // RSP.g:120:18: ( 'a' .. 'z' | '_' )*
+++
+++ for (;;)
+++ {
+++ int alt6=2;
+++ switch ( LA(1) )
+++ {
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt6=1;
+++ }
+++ break;
+++
+++ }
+++
+++ }
+++ break;
+++ case '_':
+++ {
+++ alt6=1;
+++ }
+++ break;
+++
+++ }
+++
+++ switch (alt6)
+++ {
+++ case 1:
+++ // RSP.g:
+++ {
+++ if ( LA(1) == '_' || ((LA(1) >= 'a') && (LA(1) <= 'z')) )
+++ {
+++ CONSUME();
+++
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++
+++ LRECOVER(); goto ruleFIELDEx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ default:
+++ goto loop6; /* break out of the loop */
+++ break;
+++ }
+++ }
+++ loop6: ; /* Jump out to here if this rule does not match */
+++
+++ MATCHRANGE('a', 'z');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleFIELDEx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleFIELDEx; /* Prevent compiler warnings */
+++ ruleFIELDEx: ;
+++
+++}
+++// $ANTLR end FIELD
+++
+++// Comes from: 122:5: ( DIGIT19 ( DIGIT09 )* )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start INT
+++ *
+++ * Looks to match the characters the constitute the token INT
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mINT(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = INT;
+++
+++
+++ // RSP.g:122:5: ( DIGIT19 ( DIGIT09 )* )
+++ // RSP.g:122:7: DIGIT19 ( DIGIT09 )*
+++ {
+++ /* 122:7: DIGIT19 ( DIGIT09 )* */
+++ mDIGIT19(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTEx;
+++ }
+++
+++
+++ // RSP.g:122:15: ( DIGIT09 )*
+++
+++ for (;;)
+++ {
+++ int alt7=2;
+++ switch ( LA(1) )
+++ {
+++ case '0':
+++ case '1':
+++ case '2':
+++ case '3':
+++ case '4':
+++ case '5':
+++ case '6':
+++ case '7':
+++ case '8':
+++ case '9':
+++ {
+++ alt7=1;
+++ }
+++ break;
+++
+++ }
+++
+++ switch (alt7)
+++ {
+++ case 1:
+++ // RSP.g:122:15: DIGIT09
+++ {
+++ /* 122:15: DIGIT09 */
+++ mDIGIT09(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTEx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ default:
+++ goto loop7; /* break out of the loop */
+++ break;
+++ }
+++ }
+++ loop7: ; /* Jump out to here if this rule does not match */
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleINTEx; /* Prevent compiler warnings */
+++ ruleINTEx: ;
+++
+++}
+++// $ANTLR end INT
+++
+++// Comes from: 125:6: ( DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start DATE
+++ *
+++ * Looks to match the characters the constitute the token DATE
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mDATE(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = DATE;
+++
+++
+++ // RSP.g:125:6: ( DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) )
+++ // RSP.g:125:8: DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' )
+++ {
+++ /* 125:8: DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) */
+++ mDIGIT19(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++ /* 125:8: DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) */
+++ mDIGIT09(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++ /* 125:8: DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) */
+++ mDIGIT09(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++ /* 125:8: DIGIT19 DIGIT09 DIGIT09 DIGIT09 '-' ( '0' DIGIT19 | '1' '0' .. '2' ) '-' ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' ) */
+++ mDIGIT09(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++ MATCHC('-');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ // RSP.g:125:44: ( '0' DIGIT19 | '1' '0' .. '2' )
+++ {
+++ int alt8=2;
+++ switch ( LA(1) )
+++ {
+++ case '0':
+++ {
+++ alt8=1;
+++ }
+++ break;
+++ case '1':
+++ {
+++ alt8=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 8;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleDATEEx;
+++ }
+++
+++ switch (alt8)
+++ {
+++ case 1:
+++ // RSP.g:125:45: '0' DIGIT19
+++ {
+++ MATCHC('0');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++ /* 125:45: '0' DIGIT19 */
+++ mDIGIT19(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:125:59: '1' '0' .. '2'
+++ {
+++ MATCHC('1');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++ MATCHRANGE('0', '2');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ MATCHC('-');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ // RSP.g:125:77: ( '0' DIGIT19 | '1' .. '2' DIGIT09 | '3' '0' .. '1' )
+++ {
+++ int alt9=3;
+++ switch ( LA(1) )
+++ {
+++ case '0':
+++ {
+++ alt9=1;
+++ }
+++ break;
+++ case '1':
+++ case '2':
+++ {
+++ alt9=2;
+++ }
+++ break;
+++ case '3':
+++ {
+++ alt9=3;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 9;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleDATEEx;
+++ }
+++
+++ switch (alt9)
+++ {
+++ case 1:
+++ // RSP.g:125:78: '0' DIGIT19
+++ {
+++ MATCHC('0');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++ /* 125:78: '0' DIGIT19 */
+++ mDIGIT19(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:125:92: '1' .. '2' DIGIT09
+++ {
+++ MATCHRANGE('1', '2');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++ /* 125:92: '1' .. '2' DIGIT09 */
+++ mDIGIT09(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // RSP.g:125:111: '3' '0' .. '1'
+++ {
+++ MATCHC('3');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++ MATCHRANGE('0', '1');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleDATEEx; /* Prevent compiler warnings */
+++ ruleDATEEx: ;
+++
+++}
+++// $ANTLR end DATE
+++
+++// Comes from: 133:2: ( QUOTE (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+ QUOTE )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start STR
+++ *
+++ * Looks to match the characters the constitute the token STR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mSTR(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++ pANTLR3_COMMON_TOKEN esc;
+++ ANTLR3_UINT32 reg;
+++
+++
+++ esc = NULL;
+++
+++ _type = STR;
+++
+++ pANTLR3_STRING unesc = GETTEXT()->factory->newRaw(GETTEXT()->factory);
+++
+++ // RSP.g:133:2: ( QUOTE (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+ QUOTE )
+++ // RSP.g:133:4: QUOTE (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+ QUOTE
+++ {
+++ /* 133:4: QUOTE (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+ QUOTE */
+++ mQUOTE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTREx;
+++ }
+++
+++ // RSP.g:133:10: (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+
+++ {
+++ int cnt10=0;
+++
+++ for (;;)
+++ {
+++ int alt10=3;
+++ {
+++ /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
+++ */
+++ int LA10_0 = LA(1);
+++ if ( (((LA10_0 >= 0x0000) && (LA10_0 <= '!')) || ((LA10_0 >= '#') && (LA10_0 <= '[')) || ((LA10_0 >= ']') && (LA10_0 <= 0xFFFF))) )
+++ {
+++ alt10=1;
+++ }
+++ else if ( (LA10_0 == '\\') )
+++ {
+++ alt10=2;
+++ }
+++
+++ }
+++ switch (alt10)
+++ {
+++ case 1:
+++ // RSP.g:133:12: reg=~ ( '\\\\' | '\"' )
+++ {
+++ reg= LA(1);
+++ if ( ((LA(1) >= 0x0000) && (LA(1) <= '!')) || ((LA(1) >= '#') && (LA(1) <= '[')) || ((LA(1) >= ']') && (LA(1) <= 0xFFFF)) )
+++ {
+++ CONSUME();
+++
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++
+++ LRECOVER(); goto ruleSTREx;
+++ }
+++
+++ {
+++ unesc->addc(unesc, reg);
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:134:6: esc= ESCAPED
+++ {
+++ /* 134:6: esc= ESCAPED */
+++ {
+++ ANTLR3_MARKER escStart381 = GETCHARINDEX();
+++ mESCAPED(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTREx;
+++ }
+++
+++ esc = LEXSTATE->tokFactory->newToken(LEXSTATE->tokFactory);
+++ esc->setType(esc, ANTLR3_TOKEN_INVALID);
+++ esc->setStartIndex(esc, escStart381);
+++ esc->setStopIndex(esc, GETCHARINDEX()-1);
+++ esc->input = INPUT;
+++ }
+++ {
+++ unesc->appendS(unesc, GETTEXT());
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++
+++ if ( cnt10 >= 1 )
+++ {
+++ goto loop10;
+++ }
+++ /* mismatchedSetEx()
+++ */
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;
+++
+++
+++ goto ruleSTREx;
+++ }
+++ cnt10++;
+++ }
+++ loop10: ; /* Jump to here if this rule does not match */
+++ }
+++ /* 133:4: QUOTE (reg=~ ( '\\\\' | '\"' ) | esc= ESCAPED )+ QUOTE */
+++ mQUOTE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTREx;
+++ }
+++
+++ {
+++ SETTEXT(unesc);
+++ }
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleSTREx; /* Prevent compiler warnings */
+++ ruleSTREx: ;
+++
+++ esc = NULL;
+++
+++}
+++// $ANTLR end STR
+++
+++// Comes from: 138:9: ( '\\\\' ( '\\\\' | '\"' ) )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start ESCAPED
+++ *
+++ * Looks to match the characters the constitute the token ESCAPED
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mESCAPED(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++
+++ // RSP.g:138:9: ( '\\\\' ( '\\\\' | '\"' ) )
+++ // RSP.g:138:11: '\\\\' ( '\\\\' | '\"' )
+++ {
+++ MATCHC('\\');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleESCAPEDEx;
+++ }
+++
+++
+++ // RSP.g:139:3: ( '\\\\' | '\"' )
+++ {
+++ int alt11=2;
+++ switch ( LA(1) )
+++ {
+++ case '\\':
+++ {
+++ alt11=1;
+++ }
+++ break;
+++ case '"':
+++ {
+++ alt11=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 11;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleESCAPEDEx;
+++ }
+++
+++ switch (alt11)
+++ {
+++ case 1:
+++ // RSP.g:139:5: '\\\\'
+++ {
+++ MATCHC('\\');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleESCAPEDEx;
+++ }
+++
+++ {
+++ SETTEXT(GETTEXT()->factory->newStr8(GETTEXT()->factory, (pANTLR3_UINT8)"\\"));
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:140:5: '\"'
+++ {
+++ MATCHC('"');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleESCAPEDEx;
+++ }
+++
+++ {
+++ SETTEXT(GETTEXT()->factory->newStr8(GETTEXT()->factory, (pANTLR3_UINT8)"\""));
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++
+++ }
+++
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleESCAPEDEx; /* Prevent compiler warnings */
+++ ruleESCAPEDEx: ;
+++
+++}
+++// $ANTLR end ESCAPED
+++
+++// Comes from: 145:9: ( '0' .. '9' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start DIGIT09
+++ *
+++ * Looks to match the characters the constitute the token DIGIT09
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mDIGIT09(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++
+++ // RSP.g:145:9: ( '0' .. '9' )
+++ // RSP.g:145:11: '0' .. '9'
+++ {
+++ MATCHRANGE('0', '9');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDIGIT09Ex;
+++ }
+++
+++
+++ }
+++
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleDIGIT09Ex; /* Prevent compiler warnings */
+++ ruleDIGIT09Ex: ;
+++
+++}
+++// $ANTLR end DIGIT09
+++
+++// Comes from: 148:9: ( '1' .. '9' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start DIGIT19
+++ *
+++ * Looks to match the characters the constitute the token DIGIT19
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mDIGIT19(pRSPLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++
+++ // RSP.g:148:9: ( '1' .. '9' )
+++ // RSP.g:148:11: '1' .. '9'
+++ {
+++ MATCHRANGE('1', '9');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDIGIT19Ex;
+++ }
+++
+++
+++ }
+++
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleDIGIT19Ex; /* Prevent compiler warnings */
+++ ruleDIGIT19Ex: ;
+++
+++}
+++// $ANTLR end DIGIT19
+++
+++/** This is the entry point in to the lexer from an object that
+++ * wants to generate the next token, such as a pCOMMON_TOKEN_STREAM
+++ */
+++static void
+++mTokens(pRSPLexer ctx)
+++{
+++ {
+++ // RSP.g:1:8: ( QUOTE | LPAR | RPAR | AND | OR | NOT | EQUAL | INCLUDES | STARTSW | ENDSW | GREATER | LESS | GTE | LTE | BEFORE | AFTER | DAY | WEEK | MONTH | YEAR | TODAY | NEWLINE | WS | FIELD | INT | DATE | STR )
+++
+++ ANTLR3_UINT32 alt12;
+++
+++ alt12=27;
+++
+++ switch ( LA(1) )
+++ {
+++ case '"':
+++ {
+++
+++ {
+++ int LA12_1 = LA(2);
+++ if ( (((LA12_1 >= 0x0000) && (LA12_1 <= '!')) || ((LA12_1 >= '#') && (LA12_1 <= 0xFFFF))) )
+++ {
+++ alt12=27;
+++ }
+++ else
+++ {
+++ alt12=1; }
+++ }
+++ }
+++ break;
+++ case '(':
+++ {
+++ alt12=2;
+++ }
+++ break;
+++ case ')':
+++ {
+++ alt12=3;
+++ }
+++ break;
+++ case 'a':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'n':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'd':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=4;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++ case 'f':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 't':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 'r':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=16;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 4;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'o':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'r':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=5;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 5;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case '!':
+++ {
+++ alt12=6;
+++ }
+++ break;
+++ case '=':
+++ {
+++ alt12=7;
+++ }
+++ break;
+++ case 'i':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'n':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'c':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'l':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 'u':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case 'd':
+++ {
+++ switch ( LA(7) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(8) )
+++ {
+++ case 's':
+++ {
+++ switch ( LA(9) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=8;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 8;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 's':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 't':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'a':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'r':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 't':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case 's':
+++ {
+++ switch ( LA(7) )
+++ {
+++ case 'w':
+++ {
+++ switch ( LA(8) )
+++ {
+++ case 'i':
+++ {
+++ switch ( LA(9) )
+++ {
+++ case 't':
+++ {
+++ switch ( LA(10) )
+++ {
+++ case 'h':
+++ {
+++ switch ( LA(11) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=9;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 9;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'e':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'n':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'd':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 's':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 'w':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case 'i':
+++ {
+++ switch ( LA(7) )
+++ {
+++ case 't':
+++ {
+++ switch ( LA(8) )
+++ {
+++ case 'h':
+++ {
+++ switch ( LA(9) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=10;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 10;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case '>':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case '=':
+++ {
+++ alt12=13;
+++ }
+++ break;
+++
+++ default:
+++ alt12=11;}
+++
+++ }
+++ break;
+++ case '<':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case '=':
+++ {
+++ alt12=14;
+++ }
+++ break;
+++
+++ default:
+++ alt12=12;}
+++
+++ }
+++ break;
+++ case 'b':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'f':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'o':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 'r':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(7) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=15;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 13;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'd':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'a':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'y':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 's':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=17;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=17;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 14;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'w':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'k':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 's':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=18;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=18;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 15;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'm':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'o':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'n':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 't':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 'h':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case 's':
+++ {
+++ switch ( LA(7) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=19;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=19;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 16;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'y':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'a':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'r':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 's':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=20;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=20;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 17;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 't':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'o':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'd':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'a':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 'y':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'o':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ alt12=21;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=24;}
+++
+++ }
+++ break;
+++ case '_':
+++ case 'a':
+++ case 'b':
+++ case 'c':
+++ case 'd':
+++ case 'e':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'i':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'm':
+++ case 'n':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 's':
+++ case 't':
+++ case 'u':
+++ case 'v':
+++ case 'w':
+++ case 'x':
+++ case 'y':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 18;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case '\n':
+++ case '\r':
+++ {
+++ alt12=22;
+++ }
+++ break;
+++ case '\t':
+++ case ' ':
+++ {
+++ alt12=23;
+++ }
+++ break;
+++ case 'c':
+++ case 'f':
+++ case 'g':
+++ case 'h':
+++ case 'j':
+++ case 'k':
+++ case 'l':
+++ case 'n':
+++ case 'p':
+++ case 'q':
+++ case 'r':
+++ case 'u':
+++ case 'v':
+++ case 'x':
+++ case 'z':
+++ {
+++ alt12=24;
+++ }
+++ break;
+++ case '1':
+++ case '2':
+++ case '3':
+++ case '4':
+++ case '5':
+++ case '6':
+++ case '7':
+++ case '8':
+++ case '9':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case '0':
+++ case '1':
+++ case '2':
+++ case '3':
+++ case '4':
+++ case '5':
+++ case '6':
+++ case '7':
+++ case '8':
+++ case '9':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case '0':
+++ case '1':
+++ case '2':
+++ case '3':
+++ case '4':
+++ case '5':
+++ case '6':
+++ case '7':
+++ case '8':
+++ case '9':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case '0':
+++ case '1':
+++ case '2':
+++ case '3':
+++ case '4':
+++ case '5':
+++ case '6':
+++ case '7':
+++ case '8':
+++ case '9':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case '-':
+++ {
+++ alt12=26;
+++ }
+++ break;
+++
+++ default:
+++ alt12=25;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=25;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=25;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt12=25;}
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 12;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ switch (alt12)
+++ {
+++ case 1:
+++ // RSP.g:1:10: QUOTE
+++ {
+++ /* 1:10: QUOTE */
+++ mQUOTE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:1:16: LPAR
+++ {
+++ /* 1:16: LPAR */
+++ mLPAR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // RSP.g:1:21: RPAR
+++ {
+++ /* 1:21: RPAR */
+++ mRPAR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 4:
+++ // RSP.g:1:26: AND
+++ {
+++ /* 1:26: AND */
+++ mAND(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 5:
+++ // RSP.g:1:30: OR
+++ {
+++ /* 1:30: OR */
+++ mOR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 6:
+++ // RSP.g:1:33: NOT
+++ {
+++ /* 1:33: NOT */
+++ mNOT(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 7:
+++ // RSP.g:1:37: EQUAL
+++ {
+++ /* 1:37: EQUAL */
+++ mEQUAL(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 8:
+++ // RSP.g:1:43: INCLUDES
+++ {
+++ /* 1:43: INCLUDES */
+++ mINCLUDES(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 9:
+++ // RSP.g:1:52: STARTSW
+++ {
+++ /* 1:52: STARTSW */
+++ mSTARTSW(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 10:
+++ // RSP.g:1:60: ENDSW
+++ {
+++ /* 1:60: ENDSW */
+++ mENDSW(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 11:
+++ // RSP.g:1:66: GREATER
+++ {
+++ /* 1:66: GREATER */
+++ mGREATER(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 12:
+++ // RSP.g:1:74: LESS
+++ {
+++ /* 1:74: LESS */
+++ mLESS(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 13:
+++ // RSP.g:1:79: GTE
+++ {
+++ /* 1:79: GTE */
+++ mGTE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 14:
+++ // RSP.g:1:83: LTE
+++ {
+++ /* 1:83: LTE */
+++ mLTE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 15:
+++ // RSP.g:1:87: BEFORE
+++ {
+++ /* 1:87: BEFORE */
+++ mBEFORE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 16:
+++ // RSP.g:1:94: AFTER
+++ {
+++ /* 1:94: AFTER */
+++ mAFTER(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 17:
+++ // RSP.g:1:100: DAY
+++ {
+++ /* 1:100: DAY */
+++ mDAY(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 18:
+++ // RSP.g:1:104: WEEK
+++ {
+++ /* 1:104: WEEK */
+++ mWEEK(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 19:
+++ // RSP.g:1:109: MONTH
+++ {
+++ /* 1:109: MONTH */
+++ mMONTH(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 20:
+++ // RSP.g:1:115: YEAR
+++ {
+++ /* 1:115: YEAR */
+++ mYEAR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 21:
+++ // RSP.g:1:120: TODAY
+++ {
+++ /* 1:120: TODAY */
+++ mTODAY(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 22:
+++ // RSP.g:1:126: NEWLINE
+++ {
+++ /* 1:126: NEWLINE */
+++ mNEWLINE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 23:
+++ // RSP.g:1:134: WS
+++ {
+++ /* 1:134: WS */
+++ mWS(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 24:
+++ // RSP.g:1:137: FIELD
+++ {
+++ /* 1:137: FIELD */
+++ mFIELD(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 25:
+++ // RSP.g:1:143: INT
+++ {
+++ /* 1:143: INT */
+++ mINT(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 26:
+++ // RSP.g:1:147: DATE
+++ {
+++ /* 1:147: DATE */
+++ mDATE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 27:
+++ // RSP.g:1:152: STR
+++ {
+++ /* 1:152: STR */
+++ mSTR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++
+++
+++ goto ruleTokensEx; /* Prevent compiler warnings */
+++ruleTokensEx: ;
+++}
+++
+++/* =========================================================================
+++ * Lexer matching rules end.
+++ * =========================================================================
+++ */
+++/* End of Lexer code
+++ * ================================================
+++ * ================================================
+++ */
+++
+++
+++/* End of code
+++ * =============================================================================
+++ */
++diff --git a/src/pregen/RSPLexer.h b/src/pregen/RSPLexer.h
++new file mode 100644
++index 0000000..d93f93e
++--- /dev/null
+++++ b/src/pregen/RSPLexer.h
++@@ -0,0 +1,254 @@
+++/** \file
+++ * This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : RSP.g
+++ * - On : 2015-06-27 19:05:18
+++ * - for the lexer : RSPLexerLexer *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++ * The lexer RSPLexer has the callable functions (rules) shown below,
+++ * which will invoke the code for the associated rule in the source grammar
+++ * assuming that the input stream is pointing to a token/text stream that could begin
+++ * this rule.
+++ *
+++ * For instance if you call the first (topmost) rule in a parser grammar, you will
+++ * get the results of a full parse, but calling a rule half way through the grammar will
+++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
+++ * in editors and so on.
+++ *
+++ * The parser entry points are called indirectly (by function pointer to function) via
+++ * a parser context typedef pRSPLexer, which is returned from a call to RSPLexerNew().
+++ *
+++ * As this is a generated lexer, it is unlikely you will call it 'manually'. However
+++ * the methods are provided anyway.
+++ * * The methods in pRSPLexer are as follows:
+++ *
+++ * - void pRSPLexer->QUOTE(pRSPLexer)
+++ * - void pRSPLexer->LPAR(pRSPLexer)
+++ * - void pRSPLexer->RPAR(pRSPLexer)
+++ * - void pRSPLexer->AND(pRSPLexer)
+++ * - void pRSPLexer->OR(pRSPLexer)
+++ * - void pRSPLexer->NOT(pRSPLexer)
+++ * - void pRSPLexer->EQUAL(pRSPLexer)
+++ * - void pRSPLexer->INCLUDES(pRSPLexer)
+++ * - void pRSPLexer->STARTSW(pRSPLexer)
+++ * - void pRSPLexer->ENDSW(pRSPLexer)
+++ * - void pRSPLexer->GREATER(pRSPLexer)
+++ * - void pRSPLexer->LESS(pRSPLexer)
+++ * - void pRSPLexer->GTE(pRSPLexer)
+++ * - void pRSPLexer->LTE(pRSPLexer)
+++ * - void pRSPLexer->BEFORE(pRSPLexer)
+++ * - void pRSPLexer->AFTER(pRSPLexer)
+++ * - void pRSPLexer->DAY(pRSPLexer)
+++ * - void pRSPLexer->WEEK(pRSPLexer)
+++ * - void pRSPLexer->MONTH(pRSPLexer)
+++ * - void pRSPLexer->YEAR(pRSPLexer)
+++ * - void pRSPLexer->TODAY(pRSPLexer)
+++ * - void pRSPLexer->NEWLINE(pRSPLexer)
+++ * - void pRSPLexer->WS(pRSPLexer)
+++ * - void pRSPLexer->FIELD(pRSPLexer)
+++ * - void pRSPLexer->INT(pRSPLexer)
+++ * - void pRSPLexer->DATE(pRSPLexer)
+++ * - void pRSPLexer->STR(pRSPLexer)
+++ * - void pRSPLexer->ESCAPED(pRSPLexer)
+++ * - void pRSPLexer->DIGIT09(pRSPLexer)
+++ * - void pRSPLexer->DIGIT19(pRSPLexer)
+++ * - void pRSPLexer->Tokens(pRSPLexer)
+++ *
+++ * The return type for any particular rule is of course determined by the source
+++ * grammar file.
+++ */
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++#ifndef _RSPLexer_H
+++#define _RSPLexer_H
+++/* =============================================================================
+++ * Standard antlr3 C runtime definitions
+++ */
+++#include <antlr3.h>
+++
+++/* End of standard antlr 3 runtime definitions
+++ * =============================================================================
+++ */
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++// Forward declare the context typedef so that we can use it before it is
+++// properly defined. Delegators and delegates (from import statements) are
+++// interdependent and their context structures contain pointers to each other
+++// C only allows such things to be declared if you pre-declare the typedef.
+++//
+++typedef struct RSPLexer_Ctx_struct RSPLexer, * pRSPLexer;
+++
+++
+++
+++#ifdef ANTLR3_WINDOWS
+++// Disable: Unreferenced parameter, - Rules with parameters that are not used
+++// constant conditional, - ANTLR realizes that a prediction is always true (synpred usually)
+++// initialized but unused variable - tree rewrite variables declared but not needed
+++// Unreferenced local variable - lexer rule declares but does not always use _type
+++// potentially unitialized variable used - retval always returned from a rule
+++// unreferenced local function has been removed - susually getTokenNames or freeScope, they can go without warnigns
+++//
+++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
+++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
+++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
+++// this is a matter of orthogonality hence I disable that one.
+++//
+++#pragma warning( disable : 4100 )
+++#pragma warning( disable : 4101 )
+++#pragma warning( disable : 4127 )
+++#pragma warning( disable : 4189 )
+++#pragma warning( disable : 4505 )
+++#pragma warning( disable : 4701 )
+++#endif
+++
+++/** Context tracking structure for RSPLexer
+++ */
+++struct RSPLexer_Ctx_struct
+++{
+++ /** Built in ANTLR3 context tracker contains all the generic elements
+++ * required for context tracking.
+++ */
+++ pANTLR3_LEXER pLexer;
+++
+++
+++ void (*mQUOTE) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mLPAR) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mRPAR) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mAND) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mOR) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mNOT) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mEQUAL) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mINCLUDES) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mSTARTSW) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mENDSW) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mGREATER) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mLESS) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mGTE) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mLTE) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mBEFORE) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mAFTER) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mDAY) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mWEEK) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mMONTH) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mYEAR) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mTODAY) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mNEWLINE) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mWS) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mFIELD) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mINT) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mDATE) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mSTR) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mESCAPED) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mDIGIT09) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mDIGIT19) (struct RSPLexer_Ctx_struct * ctx);
+++ void (*mTokens) (struct RSPLexer_Ctx_struct * ctx); const char * (*getGrammarFileName)();
+++ void (*free) (struct RSPLexer_Ctx_struct * ctx);
+++
+++};
+++
+++// Function protoypes for the constructor functions that external translation units
+++// such as delegators and delegates may wish to call.
+++//
+++ANTLR3_API pRSPLexer RSPLexerNew (pANTLR3_INPUT_STREAM instream);
+++ANTLR3_API pRSPLexer RSPLexerNewSSD (pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
+++
+++/** Symbolic definitions of all the tokens that the lexer will work with.
+++ * \{
+++ *
+++ * Antlr will define EOF, but we can't use that as it it is too common in
+++ * in C header files and that would be confusing. There is no way to filter this out at the moment
+++ * so we just undef it here for now. That isn't the value we get back from C recognizers
+++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
+++ */
+++#ifdef EOF
+++#undef EOF
+++#endif
+++#ifdef Tokens
+++#undef Tokens
+++#endif
+++#define STARTSW 14
+++#define WEEK 26
+++#define TODAY 24
+++#define YEAR 28
+++#define ENDSW 15
+++#define GTE 20
+++#define BEFORE 21
+++#define DAY 25
+++#define INT 16
+++#define NOT 11
+++#define AFTER 22
+++#define AND 6
+++#define EOF -1
+++#define LTE 19
+++#define MONTH 27
+++#define DIGIT19 31
+++#define INCLUDES 13
+++#define STR 10
+++#define QUOTE 29
+++#define GREATER 18
+++#define WS 30
+++#define LPAR 7
+++#define NEWLINE 4
+++#define EQUAL 12
+++#define OR 5
+++#define LESS 17
+++#define FIELD 9
+++#define RPAR 8
+++#define ESCAPED 33
+++#define DATE 23
+++#define DIGIT09 32
+++#ifdef EOF
+++#undef EOF
+++#define EOF ANTLR3_TOKEN_EOF
+++#endif
+++
+++#ifndef TOKENSOURCE
+++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
+++#endif
+++
+++/* End of token definitions for RSPLexer
+++ * =============================================================================
+++ */
+++/** \} */
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif
+++
+++/* END - Note:Keep extra line feed to satisfy UNIX systems */
++diff --git a/src/pregen/RSPParser.c b/src/pregen/RSPParser.c
++new file mode 100644
++index 0000000..c0f3e2a
++--- /dev/null
+++++ b/src/pregen/RSPParser.c
++@@ -0,0 +1,2684 @@
+++/** \file
+++ * This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : RSP.g
+++ * - On : 2015-06-27 19:05:18
+++ * - for the parser : RSPParserParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++*/
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++/* -----------------------------------------
+++ * Include the ANTLR3 generated header file.
+++ */
+++#include "RSPParser.h"
+++/* ----------------------------------------- */
+++
+++
+++
+++
+++
+++/* MACROS that hide the C interface implementations from the
+++ * generated code, which makes it a little more understandable to the human eye.
+++ * I am very much against using C pre-processor macros for function calls and bits
+++ * of code as you cannot see what is happening when single stepping in debuggers
+++ * and so on. The exception (in my book at least) is for generated code, where you are
+++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
+++ * hides some indirect calls, but is always referring to the input stream. This is
+++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
+++ * the runtime interfaces without changing the generated code too often, without
+++ * confusing the reader of the generated output, who may not wish to know the gory
+++ * details of the interface inheritance.
+++ */
+++
+++#define CTX ctx
+++
+++/* Aids in accessing scopes for grammar programmers
+++ */
+++#undef SCOPE_TYPE
+++#undef SCOPE_STACK
+++#undef SCOPE_TOP
+++#define SCOPE_TYPE(scope) pRSPParser_##scope##_SCOPE
+++#define SCOPE_STACK(scope) pRSPParser_##scope##Stack
+++#define SCOPE_TOP(scope) ctx->pRSPParser_##scope##Top
+++#define SCOPE_SIZE(scope) ctx->pRSPParser_##scope##Stack_limit
+++#define SCOPE_INSTANCE(scope, i) (ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
+++
+++/* Macros for accessing things in the parser
+++ */
+++
+++#undef PARSER
+++#undef RECOGNIZER
+++#undef HAVEPARSEDRULE
+++#undef MEMOIZE
+++#undef INPUT
+++#undef STRSTREAM
+++#undef HASEXCEPTION
+++#undef EXCEPTION
+++#undef MATCHT
+++#undef MATCHANYT
+++#undef FOLLOWSTACK
+++#undef FOLLOWPUSH
+++#undef FOLLOWPOP
+++#undef PRECOVER
+++#undef PREPORTERROR
+++#undef LA
+++#undef LT
+++#undef CONSTRUCTEX
+++#undef CONSUME
+++#undef MARK
+++#undef REWIND
+++#undef REWINDLAST
+++#undef PERRORRECOVERY
+++#undef HASFAILED
+++#undef FAILEDFLAG
+++#undef RECOVERFROMMISMATCHEDSET
+++#undef RECOVERFROMMISMATCHEDELEMENT
+++#undef INDEX
+++#undef ADAPTOR
+++#undef SEEK
+++#undef RULEMEMO
+++#undef DBG
+++
+++#define PARSER ctx->pParser
+++#define RECOGNIZER PARSER->rec
+++#define PSRSTATE RECOGNIZER->state
+++#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
+++#define MEMOIZE(ri,si) RECOGNIZER->memoize(RECOGNIZER, ri, si)
+++#define INPUT PARSER->tstream
+++#define STRSTREAM INPUT
+++#define ISTREAM INPUT->istream
+++#define INDEX() ISTREAM->index(INPUT->istream)
+++#define HASEXCEPTION() (PSRSTATE->error == ANTLR3_TRUE)
+++#define EXCEPTION PSRSTATE->exception
+++#define MATCHT(t, fs) RECOGNIZER->match(RECOGNIZER, t, fs)
+++#define MATCHANYT() RECOGNIZER->matchAny(RECOGNIZER)
+++#define FOLLOWSTACK PSRSTATE->following
+++#define FOLLOWPUSH(x) FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
+++#define FOLLOWPOP() FOLLOWSTACK->pop(FOLLOWSTACK)
+++#define PRECOVER() RECOGNIZER->recover(RECOGNIZER)
+++#define PREPORTERROR() RECOGNIZER->reportError(RECOGNIZER)
+++#define LA(n) INPUT->istream->_LA(ISTREAM, n)
+++#define LT(n) INPUT->_LT(INPUT, n)
+++#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER)
+++#define CONSUME() ISTREAM->consume(ISTREAM)
+++#define MARK() ISTREAM->mark(ISTREAM)
+++#define REWIND(m) ISTREAM->rewind(ISTREAM, m)
+++#define REWINDLAST() ISTREAM->rewindLast(ISTREAM)
+++#define SEEK(n) ISTREAM->seek(ISTREAM, n)
+++#define PERRORRECOVERY PSRSTATE->errorRecovery
+++#define FAILEDFLAG PSRSTATE->failed
+++#define HASFAILED() (FAILEDFLAG == ANTLR3_TRUE)
+++#define BACKTRACKING PSRSTATE->backtracking
+++#define RECOVERFROMMISMATCHEDSET(s) RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
+++#define RECOVERFROMMISMATCHEDELEMENT(e) RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
+++#define ADAPTOR ctx->adaptor
+++#define RULEMEMO PSRSTATE->ruleMemo
+++#define DBG RECOGNIZER->debugger
+++
+++#define TOKTEXT(tok, txt) tok, (pANTLR3_UINT8)txt
+++
+++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
+++ * then for the present you must use different names for your defines as these are hard coded
+++ * in the code generator. It would be better not to use such names internally, and maybe
+++ * we can change this in a forthcoming release. I deliberately do not #undef these
+++ * here as this will at least give you a redefined error somewhere if they clash.
+++ */
+++#define UP ANTLR3_TOKEN_UP
+++#define DOWN ANTLR3_TOKEN_DOWN
+++#define EOR ANTLR3_TOKEN_EOR
+++#define INVALID ANTLR3_TOKEN_INVALID
+++
+++
+++/* =============================================================================
+++ * Functions to create and destroy scopes. First come the rule scopes, followed
+++ * by the global declared scopes.
+++ */
+++
+++
+++
+++/* ============================================================================= */
+++
+++/* =============================================================================
+++ * Start of recognizer
+++ */
+++
+++
+++
+++/** \brief Table of all token names in symbolic order, mainly used for
+++ * error reporting.
+++ */
+++pANTLR3_UINT8 RSPParserTokenNames[30+4]
+++ = {
+++ (pANTLR3_UINT8) "<invalid>", /* String to print to indicate an invalid token */
+++ (pANTLR3_UINT8) "<EOR>",
+++ (pANTLR3_UINT8) "<DOWN>",
+++ (pANTLR3_UINT8) "<UP>",
+++ (pANTLR3_UINT8) "NEWLINE",
+++ (pANTLR3_UINT8) "OR",
+++ (pANTLR3_UINT8) "AND",
+++ (pANTLR3_UINT8) "LPAR",
+++ (pANTLR3_UINT8) "RPAR",
+++ (pANTLR3_UINT8) "FIELD",
+++ (pANTLR3_UINT8) "STR",
+++ (pANTLR3_UINT8) "NOT",
+++ (pANTLR3_UINT8) "EQUAL",
+++ (pANTLR3_UINT8) "INCLUDES",
+++ (pANTLR3_UINT8) "STARTSW",
+++ (pANTLR3_UINT8) "ENDSW",
+++ (pANTLR3_UINT8) "INT",
+++ (pANTLR3_UINT8) "LESS",
+++ (pANTLR3_UINT8) "GREATER",
+++ (pANTLR3_UINT8) "LTE",
+++ (pANTLR3_UINT8) "GTE",
+++ (pANTLR3_UINT8) "BEFORE",
+++ (pANTLR3_UINT8) "AFTER",
+++ (pANTLR3_UINT8) "DATE",
+++ (pANTLR3_UINT8) "TODAY",
+++ (pANTLR3_UINT8) "DAY",
+++ (pANTLR3_UINT8) "WEEK",
+++ (pANTLR3_UINT8) "MONTH",
+++ (pANTLR3_UINT8) "YEAR",
+++ (pANTLR3_UINT8) "QUOTE",
+++ (pANTLR3_UINT8) "WS",
+++ (pANTLR3_UINT8) "DIGIT19",
+++ (pANTLR3_UINT8) "DIGIT09",
+++ (pANTLR3_UINT8) "ESCAPED"
+++ };
+++
+++
+++
+++// Forward declare the locally static matching functions we have generated.
+++//
+++static RSPParser_query_return query (pRSPParser ctx);
+++static RSPParser_expr_return expr (pRSPParser ctx);
+++static RSPParser_aexpr_return aexpr (pRSPParser ctx);
+++static RSPParser_crit_return crit (pRSPParser ctx);
+++static RSPParser_strcrit_return strcrit (pRSPParser ctx);
+++static RSPParser_strop_return strop (pRSPParser ctx);
+++static RSPParser_intcrit_return intcrit (pRSPParser ctx);
+++static RSPParser_intop_return intop (pRSPParser ctx);
+++static RSPParser_datecrit_return datecrit (pRSPParser ctx);
+++static RSPParser_dateop_return dateop (pRSPParser ctx);
+++static RSPParser_datespec_return datespec (pRSPParser ctx);
+++static RSPParser_dateref_return dateref (pRSPParser ctx);
+++static RSPParser_dateintval_return dateintval (pRSPParser ctx);
+++static void RSPParserFree(pRSPParser ctx);
+++/* For use in tree output where we are accumulating rule labels via label += ruleRef
+++ * we need a function that knows how to free a return scope when the list is destroyed.
+++ * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
+++ */
+++static void ANTLR3_CDECL freeScope(void * scope)
+++{
+++ ANTLR3_FREE(scope);
+++}
+++
+++/** \brief Name of the grammar file that generated this code
+++ */
+++static const char fileName[] = "RSP.g";
+++
+++/** \brief Return the name of the grammar file that generated this code.
+++ */
+++static const char * getGrammarFileName()
+++{
+++ return fileName;
+++}
+++/** \brief Create a new RSPParser parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pRSPParser
+++RSPParserNew (pANTLR3_COMMON_TOKEN_STREAM instream)
+++{
+++ // See if we can create a new parser with the standard constructor
+++ //
+++ return RSPParserNewSSD(instream, NULL);
+++}
+++
+++/** \brief Create a new RSPParser parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pRSPParser
+++RSPParserNewSSD (pANTLR3_COMMON_TOKEN_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
+++{
+++ pRSPParser ctx; /* Context structure we will build and return */
+++
+++ ctx = (pRSPParser) ANTLR3_CALLOC(1, sizeof(RSPParser));
+++
+++ if (ctx == NULL)
+++ {
+++ // Failed to allocate memory for parser context
+++ //
+++ return NULL;
+++ }
+++
+++ /* -------------------------------------------------------------------
+++ * Memory for basic structure is allocated, now to fill in
+++ * the base ANTLR3 structures. We initialize the function pointers
+++ * for the standard ANTLR3 parser function set, but upon return
+++ * from here, the programmer may set the pointers to provide custom
+++ * implementations of each function.
+++ *
+++ * We don't use the macros defined in RSPParser.h here, in order that you can get a sense
+++ * of what goes where.
+++ */
+++
+++ /* Create a base parser/recognizer, using the supplied token stream
+++ */
+++ ctx->pParser = antlr3ParserNewStream(ANTLR3_SIZE_HINT, instream->tstream, state);
+++ /* Install the implementation of our RSPParser interface
+++ */
+++ ctx->query = query;
+++ ctx->expr = expr;
+++ ctx->aexpr = aexpr;
+++ ctx->crit = crit;
+++ ctx->strcrit = strcrit;
+++ ctx->strop = strop;
+++ ctx->intcrit = intcrit;
+++ ctx->intop = intop;
+++ ctx->datecrit = datecrit;
+++ ctx->dateop = dateop;
+++ ctx->datespec = datespec;
+++ ctx->dateref = dateref;
+++ ctx->dateintval = dateintval;
+++ ctx->free = RSPParserFree;
+++ ctx->getGrammarFileName = getGrammarFileName;
+++
+++ /* Install the scope pushing methods.
+++ */
+++ ADAPTOR = ANTLR3_TREE_ADAPTORNew(instream->tstream->tokenSource->strFactory);
+++ ctx->vectors = antlr3VectorFactoryNew(0);
+++
+++
+++
+++ /* Install the token table
+++ */
+++ PSRSTATE->tokenNames = RSPParserTokenNames;
+++
+++
+++ /* Return the newly built parser to the caller
+++ */
+++ return ctx;
+++}
+++
+++/** Free the parser resources
+++ */
+++ static void
+++ RSPParserFree(pRSPParser ctx)
+++ {
+++ /* Free any scope memory
+++ */
+++
+++ ctx->vectors->close(ctx->vectors);
+++ /* We created the adaptor so we must free it
+++ */
+++ ADAPTOR->free(ADAPTOR);
+++ // Free this parser
+++ //
+++ ctx->pParser->free(ctx->pParser);
+++ ANTLR3_FREE(ctx);
+++
+++ /* Everything is released, so we can return
+++ */
+++ return;
+++ }
+++
+++/** Return token names used by this parser
+++ *
+++ * The returned pointer is used as an index into the token names table (using the token
+++ * number as the index).
+++ *
+++ * \return Pointer to first char * in the table.
+++ */
+++static pANTLR3_UINT8 *getTokenNames()
+++{
+++ return RSPParserTokenNames;
+++}
+++
+++
+++/* Declare the bitsets
+++ */
+++
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_query42 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_query42_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000010) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_query42 = { FOLLOW_expr_in_query42_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NEWLINE_in_query44 */
+++static ANTLR3_BITWORD FOLLOW_NEWLINE_in_query44_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000000) };
+++static ANTLR3_BITSET_LIST FOLLOW_NEWLINE_in_query44 = { FOLLOW_NEWLINE_in_query44_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_EOF_in_query47 */
+++static ANTLR3_BITWORD FOLLOW_EOF_in_query47_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_EOF_in_query47 = { FOLLOW_EOF_in_query47_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_aexpr_in_expr63 */
+++static ANTLR3_BITWORD FOLLOW_aexpr_in_expr63_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000022) };
+++static ANTLR3_BITSET_LIST FOLLOW_aexpr_in_expr63 = { FOLLOW_aexpr_in_expr63_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OR_in_expr66 */
+++static ANTLR3_BITWORD FOLLOW_OR_in_expr66_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000280) };
+++static ANTLR3_BITSET_LIST FOLLOW_OR_in_expr66 = { FOLLOW_OR_in_expr66_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_aexpr_in_expr69 */
+++static ANTLR3_BITWORD FOLLOW_aexpr_in_expr69_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000022) };
+++static ANTLR3_BITSET_LIST FOLLOW_aexpr_in_expr69 = { FOLLOW_aexpr_in_expr69_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_crit_in_aexpr81 */
+++static ANTLR3_BITWORD FOLLOW_crit_in_aexpr81_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000042) };
+++static ANTLR3_BITSET_LIST FOLLOW_crit_in_aexpr81 = { FOLLOW_crit_in_aexpr81_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AND_in_aexpr84 */
+++static ANTLR3_BITWORD FOLLOW_AND_in_aexpr84_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000280) };
+++static ANTLR3_BITSET_LIST FOLLOW_AND_in_aexpr84 = { FOLLOW_AND_in_aexpr84_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_crit_in_aexpr87 */
+++static ANTLR3_BITWORD FOLLOW_crit_in_aexpr87_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000042) };
+++static ANTLR3_BITSET_LIST FOLLOW_crit_in_aexpr87 = { FOLLOW_crit_in_aexpr87_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAR_in_crit99 */
+++static ANTLR3_BITWORD FOLLOW_LPAR_in_crit99_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000280) };
+++static ANTLR3_BITSET_LIST FOLLOW_LPAR_in_crit99 = { FOLLOW_LPAR_in_crit99_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expr_in_crit101 */
+++static ANTLR3_BITWORD FOLLOW_expr_in_crit101_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000100) };
+++static ANTLR3_BITSET_LIST FOLLOW_expr_in_crit101 = { FOLLOW_expr_in_crit101_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAR_in_crit103 */
+++static ANTLR3_BITWORD FOLLOW_RPAR_in_crit103_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_RPAR_in_crit103 = { FOLLOW_RPAR_in_crit103_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strcrit_in_crit114 */
+++static ANTLR3_BITWORD FOLLOW_strcrit_in_crit114_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_strcrit_in_crit114 = { FOLLOW_strcrit_in_crit114_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intcrit_in_crit119 */
+++static ANTLR3_BITWORD FOLLOW_intcrit_in_crit119_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_intcrit_in_crit119 = { FOLLOW_intcrit_in_crit119_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_datecrit_in_crit124 */
+++static ANTLR3_BITWORD FOLLOW_datecrit_in_crit124_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_datecrit_in_crit124 = { FOLLOW_datecrit_in_crit124_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_strcrit134 */
+++static ANTLR3_BITWORD FOLLOW_FIELD_in_strcrit134_bits[] = { ANTLR3_UINT64_LIT(0x000000000000F000) };
+++static ANTLR3_BITSET_LIST FOLLOW_FIELD_in_strcrit134 = { FOLLOW_FIELD_in_strcrit134_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strop_in_strcrit136 */
+++static ANTLR3_BITWORD FOLLOW_strop_in_strcrit136_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000400) };
+++static ANTLR3_BITSET_LIST FOLLOW_strop_in_strcrit136 = { FOLLOW_strop_in_strcrit136_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_strcrit138 */
+++static ANTLR3_BITWORD FOLLOW_STR_in_strcrit138_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_STR_in_strcrit138 = { FOLLOW_STR_in_strcrit138_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_strcrit155 */
+++static ANTLR3_BITWORD FOLLOW_FIELD_in_strcrit155_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000800) };
+++static ANTLR3_BITSET_LIST FOLLOW_FIELD_in_strcrit155 = { FOLLOW_FIELD_in_strcrit155_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NOT_in_strcrit157 */
+++static ANTLR3_BITWORD FOLLOW_NOT_in_strcrit157_bits[] = { ANTLR3_UINT64_LIT(0x000000000000F000) };
+++static ANTLR3_BITSET_LIST FOLLOW_NOT_in_strcrit157 = { FOLLOW_NOT_in_strcrit157_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_strop_in_strcrit159 */
+++static ANTLR3_BITWORD FOLLOW_strop_in_strcrit159_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000400) };
+++static ANTLR3_BITSET_LIST FOLLOW_strop_in_strcrit159 = { FOLLOW_strop_in_strcrit159_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_strcrit161 */
+++static ANTLR3_BITWORD FOLLOW_STR_in_strcrit161_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_STR_in_strcrit161 = { FOLLOW_STR_in_strcrit161_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_strop0 */
+++static ANTLR3_BITWORD FOLLOW_set_in_strop0_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_set_in_strop0 = { FOLLOW_set_in_strop0_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_intcrit211 */
+++static ANTLR3_BITWORD FOLLOW_FIELD_in_intcrit211_bits[] = { ANTLR3_UINT64_LIT(0x00000000001E1000) };
+++static ANTLR3_BITSET_LIST FOLLOW_FIELD_in_intcrit211 = { FOLLOW_FIELD_in_intcrit211_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intop_in_intcrit213 */
+++static ANTLR3_BITWORD FOLLOW_intop_in_intcrit213_bits[] = { ANTLR3_UINT64_LIT(0x0000000000010000) };
+++static ANTLR3_BITSET_LIST FOLLOW_intop_in_intcrit213 = { FOLLOW_intop_in_intcrit213_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_intcrit215 */
+++static ANTLR3_BITWORD FOLLOW_INT_in_intcrit215_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_INT_in_intcrit215 = { FOLLOW_INT_in_intcrit215_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_intcrit232 */
+++static ANTLR3_BITWORD FOLLOW_FIELD_in_intcrit232_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000800) };
+++static ANTLR3_BITSET_LIST FOLLOW_FIELD_in_intcrit232 = { FOLLOW_FIELD_in_intcrit232_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NOT_in_intcrit234 */
+++static ANTLR3_BITWORD FOLLOW_NOT_in_intcrit234_bits[] = { ANTLR3_UINT64_LIT(0x00000000001E1000) };
+++static ANTLR3_BITSET_LIST FOLLOW_NOT_in_intcrit234 = { FOLLOW_NOT_in_intcrit234_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_intop_in_intcrit236 */
+++static ANTLR3_BITWORD FOLLOW_intop_in_intcrit236_bits[] = { ANTLR3_UINT64_LIT(0x0000000000010000) };
+++static ANTLR3_BITSET_LIST FOLLOW_intop_in_intcrit236 = { FOLLOW_intop_in_intcrit236_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_intcrit238 */
+++static ANTLR3_BITWORD FOLLOW_INT_in_intcrit238_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_INT_in_intcrit238 = { FOLLOW_INT_in_intcrit238_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_intop0 */
+++static ANTLR3_BITWORD FOLLOW_set_in_intop0_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_set_in_intop0 = { FOLLOW_set_in_intop0_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_FIELD_in_datecrit292 */
+++static ANTLR3_BITWORD FOLLOW_FIELD_in_datecrit292_bits[] = { ANTLR3_UINT64_LIT(0x0000000000600000) };
+++static ANTLR3_BITSET_LIST FOLLOW_FIELD_in_datecrit292 = { FOLLOW_FIELD_in_datecrit292_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateop_in_datecrit294 */
+++static ANTLR3_BITWORD FOLLOW_dateop_in_datecrit294_bits[] = { ANTLR3_UINT64_LIT(0x0000000001810000) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateop_in_datecrit294 = { FOLLOW_dateop_in_datecrit294_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_datespec_in_datecrit296 */
+++static ANTLR3_BITWORD FOLLOW_datespec_in_datecrit296_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_datespec_in_datecrit296 = { FOLLOW_datespec_in_datecrit296_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_dateop0 */
+++static ANTLR3_BITWORD FOLLOW_set_in_dateop0_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_set_in_dateop0 = { FOLLOW_set_in_dateop0_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateref_in_datespec331 */
+++static ANTLR3_BITWORD FOLLOW_dateref_in_datespec331_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateref_in_datespec331 = { FOLLOW_dateref_in_datespec331_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_datespec336 */
+++static ANTLR3_BITWORD FOLLOW_INT_in_datespec336_bits[] = { ANTLR3_UINT64_LIT(0x000000001E000000) };
+++static ANTLR3_BITSET_LIST FOLLOW_INT_in_datespec336 = { FOLLOW_INT_in_datespec336_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateintval_in_datespec338 */
+++static ANTLR3_BITWORD FOLLOW_dateintval_in_datespec338_bits[] = { ANTLR3_UINT64_LIT(0x0000000000600000) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateintval_in_datespec338 = { FOLLOW_dateintval_in_datespec338_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateop_in_datespec340 */
+++static ANTLR3_BITWORD FOLLOW_dateop_in_datespec340_bits[] = { ANTLR3_UINT64_LIT(0x0000000001800000) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateop_in_datespec340 = { FOLLOW_dateop_in_datespec340_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateref_in_datespec342 */
+++static ANTLR3_BITWORD FOLLOW_dateref_in_datespec342_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateref_in_datespec342 = { FOLLOW_dateref_in_datespec342_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_dateref0 */
+++static ANTLR3_BITWORD FOLLOW_set_in_dateref0_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_set_in_dateref0 = { FOLLOW_set_in_dateref0_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_dateintval0 */
+++static ANTLR3_BITWORD FOLLOW_set_in_dateintval0_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_set_in_dateintval0 = { FOLLOW_set_in_dateintval0_bits, 1 };
+++
+++
+++
+++
+++/* ==============================================
+++ * Parsing rules
+++ */
+++/**
+++ * $ANTLR start query
+++ * RSP.g:27:1: query : expr ( NEWLINE )? EOF -> expr ;
+++ */
+++static RSPParser_query_return
+++query(pRSPParser ctx)
+++{
+++ RSPParser_query_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN NEWLINE2;
+++ pANTLR3_COMMON_TOKEN EOF3;
+++ RSPParser_expr_return expr1;
+++ #undef RETURN_TYPE_expr1
+++ #define RETURN_TYPE_expr1 RSPParser_expr_return
+++
+++ pANTLR3_BASE_TREE NEWLINE2_tree;
+++ pANTLR3_BASE_TREE EOF3_tree;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_NEWLINE;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_EOF;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_expr;
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ NEWLINE2 = NULL;
+++ EOF3 = NULL;
+++ expr1.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ NEWLINE2_tree = NULL;
+++ EOF3_tree = NULL;
+++
+++ stream_NEWLINE = NULL;
+++ #define CREATE_stream_NEWLINE if (stream_NEWLINE == NULL) {stream_NEWLINE = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token NEWLINE"); }
+++ stream_EOF = NULL;
+++ #define CREATE_stream_EOF if (stream_EOF == NULL) {stream_EOF = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token EOF"); }
+++ stream_expr = NULL;
+++ #define CREATE_stream_expr if (stream_expr == NULL) {stream_expr = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule expr"); }
+++
+++ retval.tree = NULL;
+++ {
+++ // RSP.g:27:7: ( expr ( NEWLINE )? EOF -> expr )
+++ // RSP.g:27:9: expr ( NEWLINE )? EOF
+++ {
+++ FOLLOWPUSH(FOLLOW_expr_in_query42);
+++ expr1=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulequeryEx;
+++ }
+++
+++ CREATE_stream_expr; stream_expr->add(stream_expr, expr1.tree, NULL);
+++
+++ // RSP.g:27:14: ( NEWLINE )?
+++ {
+++ int alt1=2;
+++ switch ( LA(1) )
+++ {
+++ case NEWLINE:
+++ {
+++ alt1=1;
+++ }
+++ break;
+++ }
+++
+++ switch (alt1)
+++ {
+++ case 1:
+++ // RSP.g:27:14: NEWLINE
+++ {
+++ NEWLINE2 = (pANTLR3_COMMON_TOKEN) MATCHT(NEWLINE, &FOLLOW_NEWLINE_in_query44);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulequeryEx;
+++ }
+++
+++ CREATE_stream_NEWLINE; stream_NEWLINE->add(stream_NEWLINE, NEWLINE2, NULL);
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ EOF3 = (pANTLR3_COMMON_TOKEN) MATCHT(EOF, &FOLLOW_EOF_in_query47);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulequeryEx;
+++ }
+++
+++ CREATE_stream_EOF; stream_EOF->add(stream_EOF, EOF3, NULL);
+++
+++
+++
+++ /* AST REWRITE
+++ * elements : expr
+++ * token labels :
+++ * rule labels : retval
+++ * token list labels :
+++ * rule list labels :
+++ */
+++ {
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
+++
+++ stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
+++
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ retval.tree = root_0;
+++ // 27:28: -> expr
+++ {
+++ ADAPTOR->addChild(ADAPTOR, root_0, stream_expr == NULL ? NULL : stream_expr->nextTree(stream_expr));
+++
+++ }
+++
+++ retval.tree = root_0; // set result root
+++ if (stream_retval != NULL) stream_retval->free(stream_retval);
+++
+++
+++ }
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulequeryEx; /* Prevent compiler warnings */
+++ rulequeryEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++ if (stream_NEWLINE != NULL) stream_NEWLINE->free(stream_NEWLINE);
+++ if (stream_EOF != NULL) stream_EOF->free(stream_EOF);
+++ if (stream_expr != NULL) stream_expr->free(stream_expr);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end query */
+++
+++/**
+++ * $ANTLR start expr
+++ * RSP.g:30:1: expr : aexpr ( OR aexpr )* ;
+++ */
+++static RSPParser_expr_return
+++expr(pRSPParser ctx)
+++{
+++ RSPParser_expr_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN OR5;
+++ RSPParser_aexpr_return aexpr4;
+++ #undef RETURN_TYPE_aexpr4
+++ #define RETURN_TYPE_aexpr4 RSPParser_aexpr_return
+++
+++ RSPParser_aexpr_return aexpr6;
+++ #undef RETURN_TYPE_aexpr6
+++ #define RETURN_TYPE_aexpr6 RSPParser_aexpr_return
+++
+++ pANTLR3_BASE_TREE OR5_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ OR5 = NULL;
+++ aexpr4.tree = NULL;
+++
+++ aexpr6.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ OR5_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // RSP.g:30:6: ( aexpr ( OR aexpr )* )
+++ // RSP.g:30:8: aexpr ( OR aexpr )*
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_aexpr_in_expr63);
+++ aexpr4=aexpr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, aexpr4.tree);
+++
+++ // RSP.g:30:14: ( OR aexpr )*
+++
+++ for (;;)
+++ {
+++ int alt2=2;
+++ switch ( LA(1) )
+++ {
+++ case OR:
+++ {
+++ alt2=1;
+++ }
+++ break;
+++
+++ }
+++
+++ switch (alt2)
+++ {
+++ case 1:
+++ // RSP.g:30:15: OR aexpr
+++ {
+++ OR5 = (pANTLR3_COMMON_TOKEN) MATCHT(OR, &FOLLOW_OR_in_expr66);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ OR5_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, OR5));
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, OR5_tree, root_0));
+++
+++ FOLLOWPUSH(FOLLOW_aexpr_in_expr69);
+++ aexpr6=aexpr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, aexpr6.tree);
+++
+++ }
+++ break;
+++
+++ default:
+++ goto loop2; /* break out of the loop */
+++ break;
+++ }
+++ }
+++ loop2: ; /* Jump out to here if this rule does not match */
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleexprEx; /* Prevent compiler warnings */
+++ ruleexprEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end expr */
+++
+++/**
+++ * $ANTLR start aexpr
+++ * RSP.g:33:1: aexpr : crit ( AND crit )* ;
+++ */
+++static RSPParser_aexpr_return
+++aexpr(pRSPParser ctx)
+++{
+++ RSPParser_aexpr_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN AND8;
+++ RSPParser_crit_return crit7;
+++ #undef RETURN_TYPE_crit7
+++ #define RETURN_TYPE_crit7 RSPParser_crit_return
+++
+++ RSPParser_crit_return crit9;
+++ #undef RETURN_TYPE_crit9
+++ #define RETURN_TYPE_crit9 RSPParser_crit_return
+++
+++ pANTLR3_BASE_TREE AND8_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ AND8 = NULL;
+++ crit7.tree = NULL;
+++
+++ crit9.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ AND8_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // RSP.g:33:7: ( crit ( AND crit )* )
+++ // RSP.g:33:9: crit ( AND crit )*
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_crit_in_aexpr81);
+++ crit7=crit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleaexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, crit7.tree);
+++
+++ // RSP.g:33:14: ( AND crit )*
+++
+++ for (;;)
+++ {
+++ int alt3=2;
+++ switch ( LA(1) )
+++ {
+++ case AND:
+++ {
+++ alt3=1;
+++ }
+++ break;
+++
+++ }
+++
+++ switch (alt3)
+++ {
+++ case 1:
+++ // RSP.g:33:15: AND crit
+++ {
+++ AND8 = (pANTLR3_COMMON_TOKEN) MATCHT(AND, &FOLLOW_AND_in_aexpr84);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleaexprEx;
+++ }
+++
+++ AND8_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, AND8));
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, AND8_tree, root_0));
+++
+++ FOLLOWPUSH(FOLLOW_crit_in_aexpr87);
+++ crit9=crit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleaexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, crit9.tree);
+++
+++ }
+++ break;
+++
+++ default:
+++ goto loop3; /* break out of the loop */
+++ break;
+++ }
+++ }
+++ loop3: ; /* Jump out to here if this rule does not match */
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleaexprEx; /* Prevent compiler warnings */
+++ ruleaexprEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end aexpr */
+++
+++/**
+++ * $ANTLR start crit
+++ * RSP.g:36:1: crit : ( LPAR expr RPAR -> expr | strcrit | intcrit | datecrit );
+++ */
+++static RSPParser_crit_return
+++crit(pRSPParser ctx)
+++{
+++ RSPParser_crit_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN LPAR10;
+++ pANTLR3_COMMON_TOKEN RPAR12;
+++ RSPParser_expr_return expr11;
+++ #undef RETURN_TYPE_expr11
+++ #define RETURN_TYPE_expr11 RSPParser_expr_return
+++
+++ RSPParser_strcrit_return strcrit13;
+++ #undef RETURN_TYPE_strcrit13
+++ #define RETURN_TYPE_strcrit13 RSPParser_strcrit_return
+++
+++ RSPParser_intcrit_return intcrit14;
+++ #undef RETURN_TYPE_intcrit14
+++ #define RETURN_TYPE_intcrit14 RSPParser_intcrit_return
+++
+++ RSPParser_datecrit_return datecrit15;
+++ #undef RETURN_TYPE_datecrit15
+++ #define RETURN_TYPE_datecrit15 RSPParser_datecrit_return
+++
+++ pANTLR3_BASE_TREE LPAR10_tree;
+++ pANTLR3_BASE_TREE RPAR12_tree;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_RPAR;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_LPAR;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_expr;
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ LPAR10 = NULL;
+++ RPAR12 = NULL;
+++ expr11.tree = NULL;
+++
+++ strcrit13.tree = NULL;
+++
+++ intcrit14.tree = NULL;
+++
+++ datecrit15.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ LPAR10_tree = NULL;
+++ RPAR12_tree = NULL;
+++
+++ stream_RPAR = NULL;
+++ #define CREATE_stream_RPAR if (stream_RPAR == NULL) {stream_RPAR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token RPAR"); }
+++ stream_LPAR = NULL;
+++ #define CREATE_stream_LPAR if (stream_LPAR == NULL) {stream_LPAR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token LPAR"); }
+++ stream_expr = NULL;
+++ #define CREATE_stream_expr if (stream_expr == NULL) {stream_expr = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule expr"); }
+++
+++ retval.tree = NULL;
+++ {
+++ {
+++ // RSP.g:36:6: ( LPAR expr RPAR -> expr | strcrit | intcrit | datecrit )
+++
+++ ANTLR3_UINT32 alt4;
+++
+++ alt4=4;
+++
+++ switch ( LA(1) )
+++ {
+++ case LPAR:
+++ {
+++ alt4=1;
+++ }
+++ break;
+++ case FIELD:
+++ {
+++ switch ( LA(2) )
+++ {
+++ case NOT:
+++ {
+++ switch ( LA(3) )
+++ {
+++ case EQUAL:
+++ {
+++ switch ( LA(4) )
+++ {
+++ case STR:
+++ {
+++ alt4=2;
+++ }
+++ break;
+++ case INT:
+++ {
+++ alt4=3;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 8;
+++
+++
+++ goto rulecritEx;
+++ }
+++
+++ }
+++ break;
+++ case INCLUDES:
+++ case STARTSW:
+++ case ENDSW:
+++ {
+++ alt4=2;
+++ }
+++ break;
+++ case LESS:
+++ case GREATER:
+++ case LTE:
+++ case GTE:
+++ {
+++ alt4=3;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 3;
+++
+++
+++ goto rulecritEx;
+++ }
+++
+++ }
+++ break;
+++ case EQUAL:
+++ {
+++ switch ( LA(3) )
+++ {
+++ case INT:
+++ {
+++ alt4=3;
+++ }
+++ break;
+++ case STR:
+++ {
+++ alt4=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 4;
+++
+++
+++ goto rulecritEx;
+++ }
+++
+++ }
+++ break;
+++ case BEFORE:
+++ case AFTER:
+++ {
+++ alt4=4;
+++ }
+++ break;
+++ case LESS:
+++ case GREATER:
+++ case LTE:
+++ case GTE:
+++ {
+++ alt4=3;
+++ }
+++ break;
+++ case INCLUDES:
+++ case STARTSW:
+++ case ENDSW:
+++ {
+++ alt4=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 2;
+++
+++
+++ goto rulecritEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto rulecritEx;
+++ }
+++
+++ switch (alt4)
+++ {
+++ case 1:
+++ // RSP.g:36:8: LPAR expr RPAR
+++ {
+++ LPAR10 = (pANTLR3_COMMON_TOKEN) MATCHT(LPAR, &FOLLOW_LPAR_in_crit99);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ CREATE_stream_LPAR; stream_LPAR->add(stream_LPAR, LPAR10, NULL);
+++
+++ FOLLOWPUSH(FOLLOW_expr_in_crit101);
+++ expr11=expr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ CREATE_stream_expr; stream_expr->add(stream_expr, expr11.tree, NULL);
+++ RPAR12 = (pANTLR3_COMMON_TOKEN) MATCHT(RPAR, &FOLLOW_RPAR_in_crit103);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ CREATE_stream_RPAR; stream_RPAR->add(stream_RPAR, RPAR12, NULL);
+++
+++
+++
+++ /* AST REWRITE
+++ * elements : expr
+++ * token labels :
+++ * rule labels : retval
+++ * token list labels :
+++ * rule list labels :
+++ */
+++ {
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
+++
+++ stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
+++
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ retval.tree = root_0;
+++ // 36:25: -> expr
+++ {
+++ ADAPTOR->addChild(ADAPTOR, root_0, stream_expr == NULL ? NULL : stream_expr->nextTree(stream_expr));
+++
+++ }
+++
+++ retval.tree = root_0; // set result root
+++ if (stream_retval != NULL) stream_retval->free(stream_retval);
+++
+++
+++ }
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:37:4: strcrit
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_strcrit_in_crit114);
+++ strcrit13=strcrit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, strcrit13.tree);
+++
+++ }
+++ break;
+++ case 3:
+++ // RSP.g:38:4: intcrit
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_intcrit_in_crit119);
+++ intcrit14=intcrit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, intcrit14.tree);
+++
+++ }
+++ break;
+++ case 4:
+++ // RSP.g:39:4: datecrit
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_datecrit_in_crit124);
+++ datecrit15=datecrit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, datecrit15.tree);
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulecritEx; /* Prevent compiler warnings */
+++ rulecritEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++ if (stream_RPAR != NULL) stream_RPAR->free(stream_RPAR);
+++ if (stream_LPAR != NULL) stream_LPAR->free(stream_LPAR);
+++ if (stream_expr != NULL) stream_expr->free(stream_expr);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end crit */
+++
+++/**
+++ * $ANTLR start strcrit
+++ * RSP.g:42:1: strcrit : ( FIELD strop STR -> ^( strop FIELD STR ) | FIELD NOT strop STR -> ^( NOT ^( strop FIELD STR ) ) );
+++ */
+++static RSPParser_strcrit_return
+++strcrit(pRSPParser ctx)
+++{
+++ RSPParser_strcrit_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN FIELD16;
+++ pANTLR3_COMMON_TOKEN STR18;
+++ pANTLR3_COMMON_TOKEN FIELD19;
+++ pANTLR3_COMMON_TOKEN NOT20;
+++ pANTLR3_COMMON_TOKEN STR22;
+++ RSPParser_strop_return strop17;
+++ #undef RETURN_TYPE_strop17
+++ #define RETURN_TYPE_strop17 RSPParser_strop_return
+++
+++ RSPParser_strop_return strop21;
+++ #undef RETURN_TYPE_strop21
+++ #define RETURN_TYPE_strop21 RSPParser_strop_return
+++
+++ pANTLR3_BASE_TREE FIELD16_tree;
+++ pANTLR3_BASE_TREE STR18_tree;
+++ pANTLR3_BASE_TREE FIELD19_tree;
+++ pANTLR3_BASE_TREE NOT20_tree;
+++ pANTLR3_BASE_TREE STR22_tree;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_STR;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_FIELD;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_NOT;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_strop;
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ FIELD16 = NULL;
+++ STR18 = NULL;
+++ FIELD19 = NULL;
+++ NOT20 = NULL;
+++ STR22 = NULL;
+++ strop17.tree = NULL;
+++
+++ strop21.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ FIELD16_tree = NULL;
+++ STR18_tree = NULL;
+++ FIELD19_tree = NULL;
+++ NOT20_tree = NULL;
+++ STR22_tree = NULL;
+++
+++ stream_STR = NULL;
+++ #define CREATE_stream_STR if (stream_STR == NULL) {stream_STR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token STR"); }
+++ stream_FIELD = NULL;
+++ #define CREATE_stream_FIELD if (stream_FIELD == NULL) {stream_FIELD = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token FIELD"); }
+++ stream_NOT = NULL;
+++ #define CREATE_stream_NOT if (stream_NOT == NULL) {stream_NOT = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token NOT"); }
+++ stream_strop = NULL;
+++ #define CREATE_stream_strop if (stream_strop == NULL) {stream_strop = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule strop"); }
+++
+++ retval.tree = NULL;
+++ {
+++ {
+++ // RSP.g:42:9: ( FIELD strop STR -> ^( strop FIELD STR ) | FIELD NOT strop STR -> ^( NOT ^( strop FIELD STR ) ) )
+++
+++ ANTLR3_UINT32 alt5;
+++
+++ alt5=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case FIELD:
+++ {
+++ switch ( LA(2) )
+++ {
+++ case NOT:
+++ {
+++ alt5=2;
+++ }
+++ break;
+++ case EQUAL:
+++ case INCLUDES:
+++ case STARTSW:
+++ case ENDSW:
+++ {
+++ alt5=1;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 5;
+++ EXCEPTION->state = 1;
+++
+++
+++ goto rulestrcritEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 5;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto rulestrcritEx;
+++ }
+++
+++ switch (alt5)
+++ {
+++ case 1:
+++ // RSP.g:42:11: FIELD strop STR
+++ {
+++ FIELD16 = (pANTLR3_COMMON_TOKEN) MATCHT(FIELD, &FOLLOW_FIELD_in_strcrit134);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++ CREATE_stream_FIELD; stream_FIELD->add(stream_FIELD, FIELD16, NULL);
+++
+++ FOLLOWPUSH(FOLLOW_strop_in_strcrit136);
+++ strop17=strop(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++ CREATE_stream_strop; stream_strop->add(stream_strop, strop17.tree, NULL);
+++ STR18 = (pANTLR3_COMMON_TOKEN) MATCHT(STR, &FOLLOW_STR_in_strcrit138);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++ CREATE_stream_STR; stream_STR->add(stream_STR, STR18, NULL);
+++
+++
+++
+++ /* AST REWRITE
+++ * elements : strop, STR, FIELD
+++ * token labels :
+++ * rule labels : retval
+++ * token list labels :
+++ * rule list labels :
+++ */
+++ {
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
+++
+++ stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
+++
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ retval.tree = root_0;
+++ // 42:29: -> ^( strop FIELD STR )
+++ {
+++ // RSP.g:42:32: ^( strop FIELD STR )
+++ {
+++ pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_strop == NULL ? NULL : stream_strop->nextNode(stream_strop), root_1));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_1, stream_FIELD == NULL ? NULL : stream_FIELD->nextNode(stream_FIELD));
+++ ADAPTOR->addChild(ADAPTOR, root_1, stream_STR == NULL ? NULL : stream_STR->nextNode(stream_STR));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, root_1);
+++ }
+++
+++ }
+++
+++ retval.tree = root_0; // set result root
+++ if (stream_retval != NULL) stream_retval->free(stream_retval);
+++
+++
+++ }
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:43:4: FIELD NOT strop STR
+++ {
+++ FIELD19 = (pANTLR3_COMMON_TOKEN) MATCHT(FIELD, &FOLLOW_FIELD_in_strcrit155);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++ CREATE_stream_FIELD; stream_FIELD->add(stream_FIELD, FIELD19, NULL);
+++
+++ NOT20 = (pANTLR3_COMMON_TOKEN) MATCHT(NOT, &FOLLOW_NOT_in_strcrit157);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++ CREATE_stream_NOT; stream_NOT->add(stream_NOT, NOT20, NULL);
+++
+++ FOLLOWPUSH(FOLLOW_strop_in_strcrit159);
+++ strop21=strop(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++ CREATE_stream_strop; stream_strop->add(stream_strop, strop21.tree, NULL);
+++ STR22 = (pANTLR3_COMMON_TOKEN) MATCHT(STR, &FOLLOW_STR_in_strcrit161);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulestrcritEx;
+++ }
+++
+++ CREATE_stream_STR; stream_STR->add(stream_STR, STR22, NULL);
+++
+++
+++
+++ /* AST REWRITE
+++ * elements : NOT, strop, STR, FIELD
+++ * token labels :
+++ * rule labels : retval
+++ * token list labels :
+++ * rule list labels :
+++ */
+++ {
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
+++
+++ stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
+++
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ retval.tree = root_0;
+++ // 43:25: -> ^( NOT ^( strop FIELD STR ) )
+++ {
+++ // RSP.g:43:28: ^( NOT ^( strop FIELD STR ) )
+++ {
+++ pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_NOT == NULL ? NULL : stream_NOT->nextNode(stream_NOT), root_1));
+++
+++ // RSP.g:43:34: ^( strop FIELD STR )
+++ {
+++ pANTLR3_BASE_TREE root_2 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ root_2 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_strop == NULL ? NULL : stream_strop->nextNode(stream_strop), root_2));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_2, stream_FIELD == NULL ? NULL : stream_FIELD->nextNode(stream_FIELD));
+++ ADAPTOR->addChild(ADAPTOR, root_2, stream_STR == NULL ? NULL : stream_STR->nextNode(stream_STR));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_1, root_2);
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, root_1);
+++ }
+++
+++ }
+++
+++ retval.tree = root_0; // set result root
+++ if (stream_retval != NULL) stream_retval->free(stream_retval);
+++
+++
+++ }
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulestrcritEx; /* Prevent compiler warnings */
+++ rulestrcritEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++ if (stream_STR != NULL) stream_STR->free(stream_STR);
+++ if (stream_FIELD != NULL) stream_FIELD->free(stream_FIELD);
+++ if (stream_NOT != NULL) stream_NOT->free(stream_NOT);
+++ if (stream_strop != NULL) stream_strop->free(stream_strop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end strcrit */
+++
+++/**
+++ * $ANTLR start strop
+++ * RSP.g:46:1: strop : ( EQUAL | INCLUDES | STARTSW | ENDSW );
+++ */
+++static RSPParser_strop_return
+++strop(pRSPParser ctx)
+++{
+++ RSPParser_strop_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN set23;
+++
+++ pANTLR3_BASE_TREE set23_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ set23 = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ set23_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // RSP.g:46:7: ( EQUAL | INCLUDES | STARTSW | ENDSW )
+++ // RSP.g:
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ set23=(pANTLR3_COMMON_TOKEN)LT(1);
+++ if ( ((LA(1) >= EQUAL) && (LA(1) <= ENDSW)) )
+++ {
+++ CONSUME();
+++ ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set23)));
+++ PERRORRECOVERY=ANTLR3_FALSE;
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++ EXCEPTION->expectingSet = &FOLLOW_set_in_strop0;
+++ RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_strop0); goto rulestropEx;
+++ }
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulestropEx; /* Prevent compiler warnings */
+++ rulestropEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end strop */
+++
+++/**
+++ * $ANTLR start intcrit
+++ * RSP.g:52:1: intcrit : ( FIELD intop INT -> ^( intop FIELD INT ) | FIELD NOT intop INT -> ^( NOT ^( intop FIELD INT ) ) );
+++ */
+++static RSPParser_intcrit_return
+++intcrit(pRSPParser ctx)
+++{
+++ RSPParser_intcrit_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN FIELD24;
+++ pANTLR3_COMMON_TOKEN INT26;
+++ pANTLR3_COMMON_TOKEN FIELD27;
+++ pANTLR3_COMMON_TOKEN NOT28;
+++ pANTLR3_COMMON_TOKEN INT30;
+++ RSPParser_intop_return intop25;
+++ #undef RETURN_TYPE_intop25
+++ #define RETURN_TYPE_intop25 RSPParser_intop_return
+++
+++ RSPParser_intop_return intop29;
+++ #undef RETURN_TYPE_intop29
+++ #define RETURN_TYPE_intop29 RSPParser_intop_return
+++
+++ pANTLR3_BASE_TREE FIELD24_tree;
+++ pANTLR3_BASE_TREE INT26_tree;
+++ pANTLR3_BASE_TREE FIELD27_tree;
+++ pANTLR3_BASE_TREE NOT28_tree;
+++ pANTLR3_BASE_TREE INT30_tree;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_FIELD;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_INT;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_NOT;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_intop;
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ FIELD24 = NULL;
+++ INT26 = NULL;
+++ FIELD27 = NULL;
+++ NOT28 = NULL;
+++ INT30 = NULL;
+++ intop25.tree = NULL;
+++
+++ intop29.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ FIELD24_tree = NULL;
+++ INT26_tree = NULL;
+++ FIELD27_tree = NULL;
+++ NOT28_tree = NULL;
+++ INT30_tree = NULL;
+++
+++ stream_FIELD = NULL;
+++ #define CREATE_stream_FIELD if (stream_FIELD == NULL) {stream_FIELD = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token FIELD"); }
+++ stream_INT = NULL;
+++ #define CREATE_stream_INT if (stream_INT == NULL) {stream_INT = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token INT"); }
+++ stream_NOT = NULL;
+++ #define CREATE_stream_NOT if (stream_NOT == NULL) {stream_NOT = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token NOT"); }
+++ stream_intop = NULL;
+++ #define CREATE_stream_intop if (stream_intop == NULL) {stream_intop = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule intop"); }
+++
+++ retval.tree = NULL;
+++ {
+++ {
+++ // RSP.g:52:9: ( FIELD intop INT -> ^( intop FIELD INT ) | FIELD NOT intop INT -> ^( NOT ^( intop FIELD INT ) ) )
+++
+++ ANTLR3_UINT32 alt6;
+++
+++ alt6=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case FIELD:
+++ {
+++ switch ( LA(2) )
+++ {
+++ case NOT:
+++ {
+++ alt6=2;
+++ }
+++ break;
+++ case EQUAL:
+++ case LESS:
+++ case GREATER:
+++ case LTE:
+++ case GTE:
+++ {
+++ alt6=1;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 6;
+++ EXCEPTION->state = 1;
+++
+++
+++ goto ruleintcritEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 6;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleintcritEx;
+++ }
+++
+++ switch (alt6)
+++ {
+++ case 1:
+++ // RSP.g:52:11: FIELD intop INT
+++ {
+++ FIELD24 = (pANTLR3_COMMON_TOKEN) MATCHT(FIELD, &FOLLOW_FIELD_in_intcrit211);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++ CREATE_stream_FIELD; stream_FIELD->add(stream_FIELD, FIELD24, NULL);
+++
+++ FOLLOWPUSH(FOLLOW_intop_in_intcrit213);
+++ intop25=intop(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++ CREATE_stream_intop; stream_intop->add(stream_intop, intop25.tree, NULL);
+++ INT26 = (pANTLR3_COMMON_TOKEN) MATCHT(INT, &FOLLOW_INT_in_intcrit215);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++ CREATE_stream_INT; stream_INT->add(stream_INT, INT26, NULL);
+++
+++
+++
+++ /* AST REWRITE
+++ * elements : intop, INT, FIELD
+++ * token labels :
+++ * rule labels : retval
+++ * token list labels :
+++ * rule list labels :
+++ */
+++ {
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
+++
+++ stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
+++
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ retval.tree = root_0;
+++ // 52:29: -> ^( intop FIELD INT )
+++ {
+++ // RSP.g:52:32: ^( intop FIELD INT )
+++ {
+++ pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_intop == NULL ? NULL : stream_intop->nextNode(stream_intop), root_1));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_1, stream_FIELD == NULL ? NULL : stream_FIELD->nextNode(stream_FIELD));
+++ ADAPTOR->addChild(ADAPTOR, root_1, stream_INT == NULL ? NULL : stream_INT->nextNode(stream_INT));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, root_1);
+++ }
+++
+++ }
+++
+++ retval.tree = root_0; // set result root
+++ if (stream_retval != NULL) stream_retval->free(stream_retval);
+++
+++
+++ }
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:53:4: FIELD NOT intop INT
+++ {
+++ FIELD27 = (pANTLR3_COMMON_TOKEN) MATCHT(FIELD, &FOLLOW_FIELD_in_intcrit232);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++ CREATE_stream_FIELD; stream_FIELD->add(stream_FIELD, FIELD27, NULL);
+++
+++ NOT28 = (pANTLR3_COMMON_TOKEN) MATCHT(NOT, &FOLLOW_NOT_in_intcrit234);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++ CREATE_stream_NOT; stream_NOT->add(stream_NOT, NOT28, NULL);
+++
+++ FOLLOWPUSH(FOLLOW_intop_in_intcrit236);
+++ intop29=intop(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++ CREATE_stream_intop; stream_intop->add(stream_intop, intop29.tree, NULL);
+++ INT30 = (pANTLR3_COMMON_TOKEN) MATCHT(INT, &FOLLOW_INT_in_intcrit238);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintcritEx;
+++ }
+++
+++ CREATE_stream_INT; stream_INT->add(stream_INT, INT30, NULL);
+++
+++
+++
+++ /* AST REWRITE
+++ * elements : INT, FIELD, intop, NOT
+++ * token labels :
+++ * rule labels : retval
+++ * token list labels :
+++ * rule list labels :
+++ */
+++ {
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
+++
+++ stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
+++
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ retval.tree = root_0;
+++ // 53:25: -> ^( NOT ^( intop FIELD INT ) )
+++ {
+++ // RSP.g:53:28: ^( NOT ^( intop FIELD INT ) )
+++ {
+++ pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_NOT == NULL ? NULL : stream_NOT->nextNode(stream_NOT), root_1));
+++
+++ // RSP.g:53:34: ^( intop FIELD INT )
+++ {
+++ pANTLR3_BASE_TREE root_2 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ root_2 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_intop == NULL ? NULL : stream_intop->nextNode(stream_intop), root_2));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_2, stream_FIELD == NULL ? NULL : stream_FIELD->nextNode(stream_FIELD));
+++ ADAPTOR->addChild(ADAPTOR, root_2, stream_INT == NULL ? NULL : stream_INT->nextNode(stream_INT));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_1, root_2);
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, root_1);
+++ }
+++
+++ }
+++
+++ retval.tree = root_0; // set result root
+++ if (stream_retval != NULL) stream_retval->free(stream_retval);
+++
+++
+++ }
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleintcritEx; /* Prevent compiler warnings */
+++ ruleintcritEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++ if (stream_FIELD != NULL) stream_FIELD->free(stream_FIELD);
+++ if (stream_INT != NULL) stream_INT->free(stream_INT);
+++ if (stream_NOT != NULL) stream_NOT->free(stream_NOT);
+++ if (stream_intop != NULL) stream_intop->free(stream_intop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end intcrit */
+++
+++/**
+++ * $ANTLR start intop
+++ * RSP.g:56:1: intop : ( EQUAL | LESS | GREATER | LTE | GTE );
+++ */
+++static RSPParser_intop_return
+++intop(pRSPParser ctx)
+++{
+++ RSPParser_intop_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN set31;
+++
+++ pANTLR3_BASE_TREE set31_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ set31 = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ set31_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // RSP.g:56:7: ( EQUAL | LESS | GREATER | LTE | GTE )
+++ // RSP.g:
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ set31=(pANTLR3_COMMON_TOKEN)LT(1);
+++ if ( LA(1) == EQUAL || ((LA(1) >= LESS) && (LA(1) <= GTE)) )
+++ {
+++ CONSUME();
+++ ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set31)));
+++ PERRORRECOVERY=ANTLR3_FALSE;
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++ EXCEPTION->expectingSet = &FOLLOW_set_in_intop0;
+++ RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_intop0); goto ruleintopEx;
+++ }
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleintopEx; /* Prevent compiler warnings */
+++ ruleintopEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end intop */
+++
+++/**
+++ * $ANTLR start datecrit
+++ * RSP.g:63:1: datecrit : FIELD dateop datespec -> ^( dateop FIELD datespec ) ;
+++ */
+++static RSPParser_datecrit_return
+++datecrit(pRSPParser ctx)
+++{
+++ RSPParser_datecrit_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN FIELD32;
+++ RSPParser_dateop_return dateop33;
+++ #undef RETURN_TYPE_dateop33
+++ #define RETURN_TYPE_dateop33 RSPParser_dateop_return
+++
+++ RSPParser_datespec_return datespec34;
+++ #undef RETURN_TYPE_datespec34
+++ #define RETURN_TYPE_datespec34 RSPParser_datespec_return
+++
+++ pANTLR3_BASE_TREE FIELD32_tree;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_FIELD;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_datespec;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_dateop;
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ FIELD32 = NULL;
+++ dateop33.tree = NULL;
+++
+++ datespec34.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ FIELD32_tree = NULL;
+++
+++ stream_FIELD = NULL;
+++ #define CREATE_stream_FIELD if (stream_FIELD == NULL) {stream_FIELD = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token FIELD"); }
+++ stream_datespec = NULL;
+++ #define CREATE_stream_datespec if (stream_datespec == NULL) {stream_datespec = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule datespec"); }
+++ stream_dateop = NULL;
+++ #define CREATE_stream_dateop if (stream_dateop == NULL) {stream_dateop = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule dateop"); }
+++
+++ retval.tree = NULL;
+++ {
+++ // RSP.g:63:9: ( FIELD dateop datespec -> ^( dateop FIELD datespec ) )
+++ // RSP.g:63:11: FIELD dateop datespec
+++ {
+++ FIELD32 = (pANTLR3_COMMON_TOKEN) MATCHT(FIELD, &FOLLOW_FIELD_in_datecrit292);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatecritEx;
+++ }
+++
+++ CREATE_stream_FIELD; stream_FIELD->add(stream_FIELD, FIELD32, NULL);
+++
+++ FOLLOWPUSH(FOLLOW_dateop_in_datecrit294);
+++ dateop33=dateop(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatecritEx;
+++ }
+++
+++ CREATE_stream_dateop; stream_dateop->add(stream_dateop, dateop33.tree, NULL);
+++ FOLLOWPUSH(FOLLOW_datespec_in_datecrit296);
+++ datespec34=datespec(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatecritEx;
+++ }
+++
+++ CREATE_stream_datespec; stream_datespec->add(stream_datespec, datespec34.tree, NULL);
+++
+++
+++ /* AST REWRITE
+++ * elements : datespec, FIELD, dateop
+++ * token labels :
+++ * rule labels : retval
+++ * token list labels :
+++ * rule list labels :
+++ */
+++ {
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
+++
+++ stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
+++
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ retval.tree = root_0;
+++ // 63:34: -> ^( dateop FIELD datespec )
+++ {
+++ // RSP.g:63:37: ^( dateop FIELD datespec )
+++ {
+++ pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_dateop == NULL ? NULL : stream_dateop->nextNode(stream_dateop), root_1));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_1, stream_FIELD == NULL ? NULL : stream_FIELD->nextNode(stream_FIELD));
+++ ADAPTOR->addChild(ADAPTOR, root_1, stream_datespec == NULL ? NULL : stream_datespec->nextTree(stream_datespec));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, root_1);
+++ }
+++
+++ }
+++
+++ retval.tree = root_0; // set result root
+++ if (stream_retval != NULL) stream_retval->free(stream_retval);
+++
+++
+++ }
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledatecritEx; /* Prevent compiler warnings */
+++ ruledatecritEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++ if (stream_FIELD != NULL) stream_FIELD->free(stream_FIELD);
+++ if (stream_datespec != NULL) stream_datespec->free(stream_datespec);
+++ if (stream_dateop != NULL) stream_dateop->free(stream_dateop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end datecrit */
+++
+++/**
+++ * $ANTLR start dateop
+++ * RSP.g:66:1: dateop : ( BEFORE | AFTER );
+++ */
+++static RSPParser_dateop_return
+++dateop(pRSPParser ctx)
+++{
+++ RSPParser_dateop_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN set35;
+++
+++ pANTLR3_BASE_TREE set35_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ set35 = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ set35_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // RSP.g:66:8: ( BEFORE | AFTER )
+++ // RSP.g:
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ set35=(pANTLR3_COMMON_TOKEN)LT(1);
+++ if ( ((LA(1) >= BEFORE) && (LA(1) <= AFTER)) )
+++ {
+++ CONSUME();
+++ ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set35)));
+++ PERRORRECOVERY=ANTLR3_FALSE;
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++ EXCEPTION->expectingSet = &FOLLOW_set_in_dateop0;
+++ RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_dateop0); goto ruledateopEx;
+++ }
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledateopEx; /* Prevent compiler warnings */
+++ ruledateopEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end dateop */
+++
+++/**
+++ * $ANTLR start datespec
+++ * RSP.g:70:1: datespec : ( dateref | INT dateintval dateop dateref -> ^( dateop dateref INT dateintval ) );
+++ */
+++static RSPParser_datespec_return
+++datespec(pRSPParser ctx)
+++{
+++ RSPParser_datespec_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN INT37;
+++ RSPParser_dateref_return dateref36;
+++ #undef RETURN_TYPE_dateref36
+++ #define RETURN_TYPE_dateref36 RSPParser_dateref_return
+++
+++ RSPParser_dateintval_return dateintval38;
+++ #undef RETURN_TYPE_dateintval38
+++ #define RETURN_TYPE_dateintval38 RSPParser_dateintval_return
+++
+++ RSPParser_dateop_return dateop39;
+++ #undef RETURN_TYPE_dateop39
+++ #define RETURN_TYPE_dateop39 RSPParser_dateop_return
+++
+++ RSPParser_dateref_return dateref40;
+++ #undef RETURN_TYPE_dateref40
+++ #define RETURN_TYPE_dateref40 RSPParser_dateref_return
+++
+++ pANTLR3_BASE_TREE INT37_tree;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_INT;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_dateintval;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_dateref;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_dateop;
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ INT37 = NULL;
+++ dateref36.tree = NULL;
+++
+++ dateintval38.tree = NULL;
+++
+++ dateop39.tree = NULL;
+++
+++ dateref40.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ INT37_tree = NULL;
+++
+++ stream_INT = NULL;
+++ #define CREATE_stream_INT if (stream_INT == NULL) {stream_INT = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token INT"); }
+++ stream_dateintval = NULL;
+++ #define CREATE_stream_dateintval if (stream_dateintval == NULL) {stream_dateintval = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule dateintval"); }
+++ stream_dateref = NULL;
+++ #define CREATE_stream_dateref if (stream_dateref == NULL) {stream_dateref = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule dateref"); }
+++ stream_dateop = NULL;
+++ #define CREATE_stream_dateop if (stream_dateop == NULL) {stream_dateop = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule dateop"); }
+++
+++ retval.tree = NULL;
+++ {
+++ {
+++ // RSP.g:70:9: ( dateref | INT dateintval dateop dateref -> ^( dateop dateref INT dateintval ) )
+++
+++ ANTLR3_UINT32 alt7;
+++
+++ alt7=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case DATE:
+++ case TODAY:
+++ {
+++ alt7=1;
+++ }
+++ break;
+++ case INT:
+++ {
+++ alt7=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 7;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruledatespecEx;
+++ }
+++
+++ switch (alt7)
+++ {
+++ case 1:
+++ // RSP.g:70:11: dateref
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_dateref_in_datespec331);
+++ dateref36=dateref(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, dateref36.tree);
+++
+++ }
+++ break;
+++ case 2:
+++ // RSP.g:71:4: INT dateintval dateop dateref
+++ {
+++ INT37 = (pANTLR3_COMMON_TOKEN) MATCHT(INT, &FOLLOW_INT_in_datespec336);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++ CREATE_stream_INT; stream_INT->add(stream_INT, INT37, NULL);
+++
+++ FOLLOWPUSH(FOLLOW_dateintval_in_datespec338);
+++ dateintval38=dateintval(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++ CREATE_stream_dateintval; stream_dateintval->add(stream_dateintval, dateintval38.tree, NULL);
+++ FOLLOWPUSH(FOLLOW_dateop_in_datespec340);
+++ dateop39=dateop(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++ CREATE_stream_dateop; stream_dateop->add(stream_dateop, dateop39.tree, NULL);
+++ FOLLOWPUSH(FOLLOW_dateref_in_datespec342);
+++ dateref40=dateref(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatespecEx;
+++ }
+++
+++ CREATE_stream_dateref; stream_dateref->add(stream_dateref, dateref40.tree, NULL);
+++
+++
+++ /* AST REWRITE
+++ * elements : INT, dateintval, dateop, dateref
+++ * token labels :
+++ * rule labels : retval
+++ * token list labels :
+++ * rule list labels :
+++ */
+++ {
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
+++
+++ stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
+++
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ retval.tree = root_0;
+++ // 71:34: -> ^( dateop dateref INT dateintval )
+++ {
+++ // RSP.g:71:37: ^( dateop dateref INT dateintval )
+++ {
+++ pANTLR3_BASE_TREE root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ root_1 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, stream_dateop == NULL ? NULL : stream_dateop->nextNode(stream_dateop), root_1));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_1, stream_dateref == NULL ? NULL : stream_dateref->nextTree(stream_dateref));
+++ ADAPTOR->addChild(ADAPTOR, root_1, stream_INT == NULL ? NULL : stream_INT->nextNode(stream_INT));
+++ ADAPTOR->addChild(ADAPTOR, root_1, stream_dateintval == NULL ? NULL : stream_dateintval->nextTree(stream_dateintval));
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, root_1);
+++ }
+++
+++ }
+++
+++ retval.tree = root_0; // set result root
+++ if (stream_retval != NULL) stream_retval->free(stream_retval);
+++
+++
+++ }
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledatespecEx; /* Prevent compiler warnings */
+++ ruledatespecEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++ if (stream_INT != NULL) stream_INT->free(stream_INT);
+++ if (stream_dateintval != NULL) stream_dateintval->free(stream_dateintval);
+++ if (stream_dateref != NULL) stream_dateref->free(stream_dateref);
+++ if (stream_dateop != NULL) stream_dateop->free(stream_dateop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end datespec */
+++
+++/**
+++ * $ANTLR start dateref
+++ * RSP.g:74:1: dateref : ( DATE | TODAY );
+++ */
+++static RSPParser_dateref_return
+++dateref(pRSPParser ctx)
+++{
+++ RSPParser_dateref_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN set41;
+++
+++ pANTLR3_BASE_TREE set41_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ set41 = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ set41_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // RSP.g:74:9: ( DATE | TODAY )
+++ // RSP.g:
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ set41=(pANTLR3_COMMON_TOKEN)LT(1);
+++ if ( ((LA(1) >= DATE) && (LA(1) <= TODAY)) )
+++ {
+++ CONSUME();
+++ ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set41)));
+++ PERRORRECOVERY=ANTLR3_FALSE;
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++ EXCEPTION->expectingSet = &FOLLOW_set_in_dateref0;
+++ RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_dateref0); goto ruledaterefEx;
+++ }
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledaterefEx; /* Prevent compiler warnings */
+++ ruledaterefEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end dateref */
+++
+++/**
+++ * $ANTLR start dateintval
+++ * RSP.g:78:1: dateintval : ( DAY | WEEK | MONTH | YEAR );
+++ */
+++static RSPParser_dateintval_return
+++dateintval(pRSPParser ctx)
+++{
+++ RSPParser_dateintval_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN set42;
+++
+++ pANTLR3_BASE_TREE set42_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ set42 = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ set42_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // RSP.g:79:2: ( DAY | WEEK | MONTH | YEAR )
+++ // RSP.g:
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ set42=(pANTLR3_COMMON_TOKEN)LT(1);
+++ if ( ((LA(1) >= DAY) && (LA(1) <= YEAR)) )
+++ {
+++ CONSUME();
+++ ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set42)));
+++ PERRORRECOVERY=ANTLR3_FALSE;
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++ EXCEPTION->expectingSet = &FOLLOW_set_in_dateintval0;
+++ RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_dateintval0); goto ruledateintvalEx;
+++ }
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledateintvalEx; /* Prevent compiler warnings */
+++ ruledateintvalEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end dateintval */
+++/* End of parsing rules
+++ * ==============================================
+++ */
+++
+++/* ==============================================
+++ * Syntactic predicates
+++ */
+++/* End of syntactic predicates
+++ * ==============================================
+++ */
+++
+++
+++
+++
+++
+++
+++/* End of code
+++ * =============================================================================
+++ */
++diff --git a/src/pregen/RSPParser.h b/src/pregen/RSPParser.h
++new file mode 100644
++index 0000000..4b3bbfe
++--- /dev/null
+++++ b/src/pregen/RSPParser.h
++@@ -0,0 +1,365 @@
+++/** \file
+++ * This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : RSP.g
+++ * - On : 2015-06-27 19:05:18
+++ * - for the parser : RSPParserParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++ * The parser RSPParser has the callable functions (rules) shown below,
+++ * which will invoke the code for the associated rule in the source grammar
+++ * assuming that the input stream is pointing to a token/text stream that could begin
+++ * this rule.
+++ *
+++ * For instance if you call the first (topmost) rule in a parser grammar, you will
+++ * get the results of a full parse, but calling a rule half way through the grammar will
+++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
+++ * in editors and so on.
+++ *
+++ * The parser entry points are called indirectly (by function pointer to function) via
+++ * a parser context typedef pRSPParser, which is returned from a call to RSPParserNew().
+++ *
+++ * The methods in pRSPParser are as follows:
+++ *
+++ * - RSPParser_query_return pRSPParser->query(pRSPParser)
+++ * - RSPParser_expr_return pRSPParser->expr(pRSPParser)
+++ * - RSPParser_aexpr_return pRSPParser->aexpr(pRSPParser)
+++ * - RSPParser_crit_return pRSPParser->crit(pRSPParser)
+++ * - RSPParser_strcrit_return pRSPParser->strcrit(pRSPParser)
+++ * - RSPParser_strop_return pRSPParser->strop(pRSPParser)
+++ * - RSPParser_intcrit_return pRSPParser->intcrit(pRSPParser)
+++ * - RSPParser_intop_return pRSPParser->intop(pRSPParser)
+++ * - RSPParser_datecrit_return pRSPParser->datecrit(pRSPParser)
+++ * - RSPParser_dateop_return pRSPParser->dateop(pRSPParser)
+++ * - RSPParser_datespec_return pRSPParser->datespec(pRSPParser)
+++ * - RSPParser_dateref_return pRSPParser->dateref(pRSPParser)
+++ * - RSPParser_dateintval_return pRSPParser->dateintval(pRSPParser)
+++ *
+++ * The return type for any particular rule is of course determined by the source
+++ * grammar file.
+++ */
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++#ifndef _RSPParser_H
+++#define _RSPParser_H
+++/* =============================================================================
+++ * Standard antlr3 C runtime definitions
+++ */
+++#include <antlr3.h>
+++
+++/* End of standard antlr 3 runtime definitions
+++ * =============================================================================
+++ */
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++// Forward declare the context typedef so that we can use it before it is
+++// properly defined. Delegators and delegates (from import statements) are
+++// interdependent and their context structures contain pointers to each other
+++// C only allows such things to be declared if you pre-declare the typedef.
+++//
+++typedef struct RSPParser_Ctx_struct RSPParser, * pRSPParser;
+++
+++
+++
+++#ifdef ANTLR3_WINDOWS
+++// Disable: Unreferenced parameter, - Rules with parameters that are not used
+++// constant conditional, - ANTLR realizes that a prediction is always true (synpred usually)
+++// initialized but unused variable - tree rewrite variables declared but not needed
+++// Unreferenced local variable - lexer rule declares but does not always use _type
+++// potentially unitialized variable used - retval always returned from a rule
+++// unreferenced local function has been removed - susually getTokenNames or freeScope, they can go without warnigns
+++//
+++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
+++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
+++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
+++// this is a matter of orthogonality hence I disable that one.
+++//
+++#pragma warning( disable : 4100 )
+++#pragma warning( disable : 4101 )
+++#pragma warning( disable : 4127 )
+++#pragma warning( disable : 4189 )
+++#pragma warning( disable : 4505 )
+++#pragma warning( disable : 4701 )
+++#endif
+++typedef struct RSPParser_query_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_query_return;
+++
+++typedef struct RSPParser_expr_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_expr_return;
+++
+++typedef struct RSPParser_aexpr_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_aexpr_return;
+++
+++typedef struct RSPParser_crit_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_crit_return;
+++
+++typedef struct RSPParser_strcrit_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_strcrit_return;
+++
+++typedef struct RSPParser_strop_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_strop_return;
+++
+++typedef struct RSPParser_intcrit_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_intcrit_return;
+++
+++typedef struct RSPParser_intop_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_intop_return;
+++
+++typedef struct RSPParser_datecrit_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_datecrit_return;
+++
+++typedef struct RSPParser_dateop_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_dateop_return;
+++
+++typedef struct RSPParser_datespec_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_datespec_return;
+++
+++typedef struct RSPParser_dateref_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_dateref_return;
+++
+++typedef struct RSPParser_dateintval_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ RSPParser_dateintval_return;
+++
+++
+++
+++/** Context tracking structure for RSPParser
+++ */
+++struct RSPParser_Ctx_struct
+++{
+++ /** Built in ANTLR3 context tracker contains all the generic elements
+++ * required for context tracking.
+++ */
+++ pANTLR3_PARSER pParser;
+++
+++
+++ RSPParser_query_return (*query) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_expr_return (*expr) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_aexpr_return (*aexpr) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_crit_return (*crit) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_strcrit_return (*strcrit) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_strop_return (*strop) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_intcrit_return (*intcrit) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_intop_return (*intop) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_datecrit_return (*datecrit) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_dateop_return (*dateop) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_datespec_return (*datespec) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_dateref_return (*dateref) (struct RSPParser_Ctx_struct * ctx);
+++ RSPParser_dateintval_return (*dateintval) (struct RSPParser_Ctx_struct * ctx);
+++ // Delegated rules
+++ const char * (*getGrammarFileName)();
+++ void (*free) (struct RSPParser_Ctx_struct * ctx);
+++ /* @headerFile.members() */
+++ pANTLR3_BASE_TREE_ADAPTOR adaptor;
+++ pANTLR3_VECTOR_FACTORY vectors;
+++ /* End @headerFile.members() */
+++};
+++
+++// Function protoypes for the constructor functions that external translation units
+++// such as delegators and delegates may wish to call.
+++//
+++ANTLR3_API pRSPParser RSPParserNew (pANTLR3_COMMON_TOKEN_STREAM instream);
+++ANTLR3_API pRSPParser RSPParserNewSSD (pANTLR3_COMMON_TOKEN_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
+++
+++/** Symbolic definitions of all the tokens that the parser will work with.
+++ * \{
+++ *
+++ * Antlr will define EOF, but we can't use that as it it is too common in
+++ * in C header files and that would be confusing. There is no way to filter this out at the moment
+++ * so we just undef it here for now. That isn't the value we get back from C recognizers
+++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
+++ */
+++#ifdef EOF
+++#undef EOF
+++#endif
+++#ifdef Tokens
+++#undef Tokens
+++#endif
+++#define STARTSW 14
+++#define WEEK 26
+++#define TODAY 24
+++#define YEAR 28
+++#define ENDSW 15
+++#define GTE 20
+++#define BEFORE 21
+++#define DAY 25
+++#define INT 16
+++#define NOT 11
+++#define AFTER 22
+++#define AND 6
+++#define EOF -1
+++#define LTE 19
+++#define MONTH 27
+++#define DIGIT19 31
+++#define INCLUDES 13
+++#define STR 10
+++#define QUOTE 29
+++#define WS 30
+++#define GREATER 18
+++#define NEWLINE 4
+++#define LPAR 7
+++#define EQUAL 12
+++#define OR 5
+++#define LESS 17
+++#define RPAR 8
+++#define FIELD 9
+++#define ESCAPED 33
+++#define DATE 23
+++#define DIGIT09 32
+++#ifdef EOF
+++#undef EOF
+++#define EOF ANTLR3_TOKEN_EOF
+++#endif
+++
+++#ifndef TOKENSOURCE
+++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
+++#endif
+++
+++/* End of token definitions for RSPParser
+++ * =============================================================================
+++ */
+++/** \} */
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif
+++
+++/* END - Note:Keep extra line feed to satisfy UNIX systems */
++diff --git a/src/pregen/SMARTPL.u b/src/pregen/SMARTPL.u
++new file mode 100644
++index 0000000..2a66bf3
++--- /dev/null
+++++ b/src/pregen/SMARTPL.u
++@@ -0,0 +1,6 @@
+++SMARTPLParser.c : SMARTPL.g
+++./SMARTPL.tokens : SMARTPL.g
+++SMARTPLParser.h : SMARTPL.g
+++SMARTPLLexer.c : SMARTPL.g
+++SMARTPLLexer.h : SMARTPL.g
+++ANTLR_PRODUCTS += SMARTPLParser.c ./SMARTPL.tokens SMARTPLParser.h SMARTPLLexer.c SMARTPLLexer.h
++\ No newline at end of file
++diff --git a/src/pregen/SMARTPL2SQL.c b/src/pregen/SMARTPL2SQL.c
++new file mode 100644
++index 0000000..c435f37
++--- /dev/null
+++++ b/src/pregen/SMARTPL2SQL.c
++@@ -0,0 +1,1649 @@
+++/** \file
+++ * This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : SMARTPL2SQL.g
+++ * - On : 2015-06-27 19:05:21
+++ * - for the tree parser : SMARTPL2SQLTreeParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++*/
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++
+++/* =============================================================================
+++ * This is what the grammar programmer asked us to put at the top of every file.
+++ */
+++
+++ #include <stdio.h>
+++ #include <stdlib.h>
+++ #include <string.h>
+++ #include <limits.h>
+++ #include <errno.h>
+++ #include <time.h>
+++ #include <sqlite3.h>
+++
+++ #include "logger.h"
+++ #include "db.h"
+++
+++/* End of Header action.
+++ * =============================================================================
+++ */
+++/* -----------------------------------------
+++ * Include the ANTLR3 generated header file.
+++ */
+++#include "SMARTPL2SQL.h"
+++/* ----------------------------------------- */
+++
+++
+++
+++
+++
+++/* MACROS that hide the C interface implementations from the
+++ * generated code, which makes it a little more understandable to the human eye.
+++ * I am very much against using C pre-processor macros for function calls and bits
+++ * of code as you cannot see what is happening when single stepping in debuggers
+++ * and so on. The exception (in my book at least) is for generated code, where you are
+++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
+++ * hides some indirect calls, but is always referring to the input stream. This is
+++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
+++ * the runtime interfaces without changing the generated code too often, without
+++ * confusing the reader of the generated output, who may not wish to know the gory
+++ * details of the interface inheritance.
+++ */
+++
+++#define CTX ctx
+++
+++/* Aids in accessing scopes for grammar programmers
+++ */
+++#undef SCOPE_TYPE
+++#undef SCOPE_STACK
+++#undef SCOPE_TOP
+++#define SCOPE_TYPE(scope) pSMARTPL2SQL_##scope##_SCOPE
+++#define SCOPE_STACK(scope) pSMARTPL2SQL_##scope##Stack
+++#define SCOPE_TOP(scope) ctx->pSMARTPL2SQL_##scope##Top
+++#define SCOPE_SIZE(scope) ctx->pSMARTPL2SQL_##scope##Stack_limit
+++#define SCOPE_INSTANCE(scope, i) (ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
+++
+++/* Macros for accessing things in the parser
+++ */
+++
+++#undef PARSER
+++#undef RECOGNIZER
+++#undef HAVEPARSEDRULE
+++#undef INPUT
+++#undef STRSTREAM
+++#undef HASEXCEPTION
+++#undef EXCEPTION
+++#undef MATCHT
+++#undef MATCHANYT
+++#undef FOLLOWSTACK
+++#undef FOLLOWPUSH
+++#undef FOLLOWPOP
+++#undef PRECOVER
+++#undef PREPORTERROR
+++#undef LA
+++#undef LT
+++#undef CONSTRUCTEX
+++#undef CONSUME
+++#undef MARK
+++#undef REWIND
+++#undef REWINDLAST
+++#undef PERRORRECOVERY
+++#undef HASFAILED
+++#undef FAILEDFLAG
+++#undef RECOVERFROMMISMATCHEDSET
+++#undef RECOVERFROMMISMATCHEDELEMENT
+++#undef BACKTRACKING
+++#undef ADAPTOR
+++#undef RULEMEMO
+++#undef SEEK
+++#undef INDEX
+++#undef DBG
+++
+++#define PARSER ctx->pTreeParser
+++#define RECOGNIZER PARSER->rec
+++#define PSRSTATE RECOGNIZER->state
+++#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
+++#define INPUT PARSER->ctnstream
+++#define ISTREAM INPUT->tnstream->istream
+++#define STRSTREAM INPUT->tnstream
+++#define HASEXCEPTION() (PSRSTATE->error == ANTLR3_TRUE)
+++#define EXCEPTION PSRSTATE->exception
+++#define MATCHT(t, fs) RECOGNIZER->match(RECOGNIZER, t, fs)
+++#define MATCHANYT() RECOGNIZER->matchAny(RECOGNIZER)
+++#define FOLLOWSTACK PSRSTATE->following
+++#define FOLLOWPUSH(x) FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
+++#define FOLLOWPOP() FOLLOWSTACK->pop(FOLLOWSTACK)
+++#define PRECOVER() RECOGNIZER->recover(RECOGNIZER)
+++#define PREPORTERROR() RECOGNIZER->reportError(RECOGNIZER)
+++#define LA(n) ISTREAM->_LA(ISTREAM, n)
+++#define LT(n) INPUT->tnstream->_LT(INPUT->tnstream, n)
+++#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER)
+++#define CONSUME() ISTREAM->consume(ISTREAM)
+++#define MARK() ISTREAM->mark(ISTREAM)
+++#define REWIND(m) ISTREAM->rewind(ISTREAM, m)
+++#define REWINDLAST() ISTREAM->rewindLast(ISTREAM)
+++#define PERRORRECOVERY PSRSTATE->errorRecovery
+++#define FAILEDFLAG PSRSTATE->failed
+++#define HASFAILED() (FAILEDFLAG == ANTLR3_TRUE)
+++#define BACKTRACKING PSRSTATE->backtracking
+++#define RECOVERFROMMISMATCHEDSET(s) RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
+++#define RECOVERFROMMISMATCHEDELEMENT(e) RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
+++#define ADAPTOR INPUT->adaptor
+++#define RULEMEMO PSRSTATE->ruleMemo
+++#define SEEK(n) ISTREAM->seek(ISTREAM, n)
+++#define INDEX() ISTREAM->index(ISTREAM)
+++#define DBG RECOGNIZER->debugger
+++
+++
+++#define TOKTEXT(tok, txt) tok, (pANTLR3_UINT8)txt
+++
+++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
+++ * then for the present you must use different names for your defines as these are hard coded
+++ * in the code generator. It would be better not to use such names internally, and maybe
+++ * we can change this in a forthcoming release. I deliberately do not #undef these
+++ * here as this will at least give you a redefined error somewhere if they clash.
+++ */
+++#define UP ANTLR3_TOKEN_UP
+++#define DOWN ANTLR3_TOKEN_DOWN
+++#define EOR ANTLR3_TOKEN_EOR
+++#define INVALID ANTLR3_TOKEN_INVALID
+++
+++
+++/* =============================================================================
+++ * Functions to create and destroy scopes. First come the rule scopes, followed
+++ * by the global declared scopes.
+++ */
+++
+++
+++
+++/* ============================================================================= */
+++
+++/* =============================================================================
+++ * Start of recognizer
+++ */
+++
+++
+++
+++/** \brief Table of all token names in symbolic order, mainly used for
+++ * error reporting.
+++ */
+++pANTLR3_UINT8 SMARTPL2SQLTokenNames[28+4]
+++ = {
+++ (pANTLR3_UINT8) "<invalid>", /* String to print to indicate an invalid token */
+++ (pANTLR3_UINT8) "<EOR>",
+++ (pANTLR3_UINT8) "<DOWN>",
+++ (pANTLR3_UINT8) "<UP>",
+++ (pANTLR3_UINT8) "STR",
+++ (pANTLR3_UINT8) "OR",
+++ (pANTLR3_UINT8) "AND",
+++ (pANTLR3_UINT8) "NOT",
+++ (pANTLR3_UINT8) "LPAR",
+++ (pANTLR3_UINT8) "RPAR",
+++ (pANTLR3_UINT8) "STRTAG",
+++ (pANTLR3_UINT8) "INCLUDES",
+++ (pANTLR3_UINT8) "IS",
+++ (pANTLR3_UINT8) "INTTAG",
+++ (pANTLR3_UINT8) "INTBOOL",
+++ (pANTLR3_UINT8) "INT",
+++ (pANTLR3_UINT8) "DATETAG",
+++ (pANTLR3_UINT8) "AFTER",
+++ (pANTLR3_UINT8) "BEFORE",
+++ (pANTLR3_UINT8) "ENUMTAG",
+++ (pANTLR3_UINT8) "ENUMVAL",
+++ (pANTLR3_UINT8) "DATE",
+++ (pANTLR3_UINT8) "AGO",
+++ (pANTLR3_UINT8) "DATINTERVAL",
+++ (pANTLR3_UINT8) "GREATER",
+++ (pANTLR3_UINT8) "GREATEREQUAL",
+++ (pANTLR3_UINT8) "LESS",
+++ (pANTLR3_UINT8) "LESSEQUAL",
+++ (pANTLR3_UINT8) "EQUAL",
+++ (pANTLR3_UINT8) "WHITESPACE",
+++ (pANTLR3_UINT8) "'{'",
+++ (pANTLR3_UINT8) "'}'"
+++ };
+++
+++
+++
+++// Forward declare the locally static matching functions we have generated.
+++//
+++static SMARTPL2SQL_playlist_return playlist (pSMARTPL2SQL ctx);
+++static pANTLR3_STRING expression (pSMARTPL2SQL ctx);
+++static int dateval (pSMARTPL2SQL ctx);
+++static int interval (pSMARTPL2SQL ctx);
+++static void SMARTPL2SQLFree(pSMARTPL2SQL ctx);
+++/* For use in tree output where we are accumulating rule labels via label += ruleRef
+++ * we need a function that knows how to free a return scope when the list is destroyed.
+++ * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
+++ */
+++static void ANTLR3_CDECL freeScope(void * scope)
+++{
+++ ANTLR3_FREE(scope);
+++}
+++
+++/** \brief Name of the grammar file that generated this code
+++ */
+++static const char fileName[] = "SMARTPL2SQL.g";
+++
+++/** \brief Return the name of the grammar file that generated this code.
+++ */
+++static const char * getGrammarFileName()
+++{
+++ return fileName;
+++}
+++/** \brief Create a new SMARTPL2SQL parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pSMARTPL2SQL
+++SMARTPL2SQLNew (pANTLR3_COMMON_TREE_NODE_STREAM instream)
+++{
+++ // See if we can create a new parser with the standard constructor
+++ //
+++ return SMARTPL2SQLNewSSD(instream, NULL);
+++}
+++
+++/** \brief Create a new SMARTPL2SQL parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pSMARTPL2SQL
+++SMARTPL2SQLNewSSD (pANTLR3_COMMON_TREE_NODE_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
+++{
+++ pSMARTPL2SQL ctx; /* Context structure we will build and return */
+++
+++ ctx = (pSMARTPL2SQL) ANTLR3_CALLOC(1, sizeof(SMARTPL2SQL));
+++
+++ if (ctx == NULL)
+++ {
+++ // Failed to allocate memory for parser context
+++ //
+++ return NULL;
+++ }
+++
+++ /* -------------------------------------------------------------------
+++ * Memory for basic structure is allocated, now to fill in
+++ * the base ANTLR3 structures. We initialize the function pointers
+++ * for the standard ANTLR3 parser function set, but upon return
+++ * from here, the programmer may set the pointers to provide custom
+++ * implementations of each function.
+++ *
+++ * We don't use the macros defined in SMARTPL2SQL.h here, in order that you can get a sense
+++ * of what goes where.
+++ */
+++
+++ /* Create a base Tree parser/recognizer, using the supplied tree node stream
+++ */
+++ ctx->pTreeParser = antlr3TreeParserNewStream(ANTLR3_SIZE_HINT, instream, state);
+++ /* Install the implementation of our SMARTPL2SQL interface
+++ */
+++ ctx->playlist = playlist;
+++ ctx->expression = expression;
+++ ctx->dateval = dateval;
+++ ctx->interval = interval;
+++ ctx->free = SMARTPL2SQLFree;
+++ ctx->getGrammarFileName = getGrammarFileName;
+++
+++ /* Install the scope pushing methods.
+++ */
+++
+++
+++
+++
+++
+++ /* Install the token table
+++ */
+++ PSRSTATE->tokenNames = SMARTPL2SQLTokenNames;
+++
+++
+++ /* Return the newly built parser to the caller
+++ */
+++ return ctx;
+++}
+++
+++/** Free the parser resources
+++ */
+++ static void
+++ SMARTPL2SQLFree(pSMARTPL2SQL ctx)
+++ {
+++ /* Free any scope memory
+++ */
+++
+++
+++ // Free this parser
+++ //
+++ ctx->pTreeParser->free(ctx->pTreeParser);
+++ ANTLR3_FREE(ctx);
+++
+++ /* Everything is released, so we can return
+++ */
+++ return;
+++ }
+++
+++/** Return token names used by this tree parser
+++ *
+++ * The returned pointer is used as an index into the token names table (using the token
+++ * number as the index).
+++ *
+++ * \return Pointer to first char * in the table.
+++ */
+++static pANTLR3_UINT8 *getTokenNames()
+++{
+++ return SMARTPL2SQLTokenNames;
+++}
+++
+++
+++
+++
+++/* Declare the bitsets
+++ */
+++
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_playlist66 */
+++static ANTLR3_BITWORD FOLLOW_STR_in_playlist66_bits[] = { ANTLR3_UINT64_LIT(0x0000000040000000) };
+++static ANTLR3_BITSET_LIST FOLLOW_STR_in_playlist66 = { FOLLOW_STR_in_playlist66_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_30_in_playlist68 */
+++static ANTLR3_BITWORD FOLLOW_30_in_playlist68_bits[] = { ANTLR3_UINT64_LIT(0x00000000000924E0) };
+++static ANTLR3_BITSET_LIST FOLLOW_30_in_playlist68 = { FOLLOW_30_in_playlist68_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_playlist74 */
+++static ANTLR3_BITWORD FOLLOW_expression_in_playlist74_bits[] = { ANTLR3_UINT64_LIT(0x0000000080000000) };
+++static ANTLR3_BITSET_LIST FOLLOW_expression_in_playlist74 = { FOLLOW_expression_in_playlist74_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_31_in_playlist76 */
+++static ANTLR3_BITWORD FOLLOW_31_in_playlist76_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_31_in_playlist76 = { FOLLOW_31_in_playlist76_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NOT_in_expression101 */
+++static ANTLR3_BITWORD FOLLOW_NOT_in_expression101_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_NOT_in_expression101 = { FOLLOW_NOT_in_expression101_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression107 */
+++static ANTLR3_BITWORD FOLLOW_expression_in_expression107_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_expression_in_expression107 = { FOLLOW_expression_in_expression107_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AND_in_expression118 */
+++static ANTLR3_BITWORD FOLLOW_AND_in_expression118_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_AND_in_expression118 = { FOLLOW_AND_in_expression118_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression124 */
+++static ANTLR3_BITWORD FOLLOW_expression_in_expression124_bits[] = { ANTLR3_UINT64_LIT(0x00000000000924E0) };
+++static ANTLR3_BITSET_LIST FOLLOW_expression_in_expression124 = { FOLLOW_expression_in_expression124_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression130 */
+++static ANTLR3_BITWORD FOLLOW_expression_in_expression130_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_expression_in_expression130 = { FOLLOW_expression_in_expression130_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OR_in_expression141 */
+++static ANTLR3_BITWORD FOLLOW_OR_in_expression141_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000004) };
+++static ANTLR3_BITSET_LIST FOLLOW_OR_in_expression141 = { FOLLOW_OR_in_expression141_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression147 */
+++static ANTLR3_BITWORD FOLLOW_expression_in_expression147_bits[] = { ANTLR3_UINT64_LIT(0x00000000000924E0) };
+++static ANTLR3_BITSET_LIST FOLLOW_expression_in_expression147 = { FOLLOW_expression_in_expression147_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression153 */
+++static ANTLR3_BITWORD FOLLOW_expression_in_expression153_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000008) };
+++static ANTLR3_BITSET_LIST FOLLOW_expression_in_expression153 = { FOLLOW_expression_in_expression153_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STRTAG_in_expression163 */
+++static ANTLR3_BITWORD FOLLOW_STRTAG_in_expression163_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000800) };
+++static ANTLR3_BITSET_LIST FOLLOW_STRTAG_in_expression163 = { FOLLOW_STRTAG_in_expression163_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INCLUDES_in_expression165 */
+++static ANTLR3_BITWORD FOLLOW_INCLUDES_in_expression165_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000010) };
+++static ANTLR3_BITSET_LIST FOLLOW_INCLUDES_in_expression165 = { FOLLOW_INCLUDES_in_expression165_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_expression167 */
+++static ANTLR3_BITWORD FOLLOW_STR_in_expression167_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_STR_in_expression167 = { FOLLOW_STR_in_expression167_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STRTAG_in_expression176 */
+++static ANTLR3_BITWORD FOLLOW_STRTAG_in_expression176_bits[] = { ANTLR3_UINT64_LIT(0x0000000000001000) };
+++static ANTLR3_BITSET_LIST FOLLOW_STRTAG_in_expression176 = { FOLLOW_STRTAG_in_expression176_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_IS_in_expression178 */
+++static ANTLR3_BITWORD FOLLOW_IS_in_expression178_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000010) };
+++static ANTLR3_BITSET_LIST FOLLOW_IS_in_expression178 = { FOLLOW_IS_in_expression178_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_expression180 */
+++static ANTLR3_BITWORD FOLLOW_STR_in_expression180_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_STR_in_expression180 = { FOLLOW_STR_in_expression180_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INTTAG_in_expression189 */
+++static ANTLR3_BITWORD FOLLOW_INTTAG_in_expression189_bits[] = { ANTLR3_UINT64_LIT(0x0000000000004000) };
+++static ANTLR3_BITSET_LIST FOLLOW_INTTAG_in_expression189 = { FOLLOW_INTTAG_in_expression189_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INTBOOL_in_expression191 */
+++static ANTLR3_BITWORD FOLLOW_INTBOOL_in_expression191_bits[] = { ANTLR3_UINT64_LIT(0x0000000000008000) };
+++static ANTLR3_BITSET_LIST FOLLOW_INTBOOL_in_expression191 = { FOLLOW_INTBOOL_in_expression191_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_expression193 */
+++static ANTLR3_BITWORD FOLLOW_INT_in_expression193_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_INT_in_expression193 = { FOLLOW_INT_in_expression193_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATETAG_in_expression202 */
+++static ANTLR3_BITWORD FOLLOW_DATETAG_in_expression202_bits[] = { ANTLR3_UINT64_LIT(0x0000000000020000) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATETAG_in_expression202 = { FOLLOW_DATETAG_in_expression202_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AFTER_in_expression204 */
+++static ANTLR3_BITWORD FOLLOW_AFTER_in_expression204_bits[] = { ANTLR3_UINT64_LIT(0x0000000000208000) };
+++static ANTLR3_BITSET_LIST FOLLOW_AFTER_in_expression204 = { FOLLOW_AFTER_in_expression204_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateval_in_expression206 */
+++static ANTLR3_BITWORD FOLLOW_dateval_in_expression206_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateval_in_expression206 = { FOLLOW_dateval_in_expression206_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATETAG_in_expression215 */
+++static ANTLR3_BITWORD FOLLOW_DATETAG_in_expression215_bits[] = { ANTLR3_UINT64_LIT(0x0000000000040000) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATETAG_in_expression215 = { FOLLOW_DATETAG_in_expression215_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_BEFORE_in_expression217 */
+++static ANTLR3_BITWORD FOLLOW_BEFORE_in_expression217_bits[] = { ANTLR3_UINT64_LIT(0x0000000000208000) };
+++static ANTLR3_BITSET_LIST FOLLOW_BEFORE_in_expression217 = { FOLLOW_BEFORE_in_expression217_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateval_in_expression219 */
+++static ANTLR3_BITWORD FOLLOW_dateval_in_expression219_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateval_in_expression219 = { FOLLOW_dateval_in_expression219_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_ENUMTAG_in_expression228 */
+++static ANTLR3_BITWORD FOLLOW_ENUMTAG_in_expression228_bits[] = { ANTLR3_UINT64_LIT(0x0000000000001000) };
+++static ANTLR3_BITSET_LIST FOLLOW_ENUMTAG_in_expression228 = { FOLLOW_ENUMTAG_in_expression228_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_IS_in_expression230 */
+++static ANTLR3_BITWORD FOLLOW_IS_in_expression230_bits[] = { ANTLR3_UINT64_LIT(0x0000000000100000) };
+++static ANTLR3_BITSET_LIST FOLLOW_IS_in_expression230 = { FOLLOW_IS_in_expression230_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_ENUMVAL_in_expression232 */
+++static ANTLR3_BITWORD FOLLOW_ENUMVAL_in_expression232_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_ENUMVAL_in_expression232 = { FOLLOW_ENUMVAL_in_expression232_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATE_in_dateval257 */
+++static ANTLR3_BITWORD FOLLOW_DATE_in_dateval257_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATE_in_dateval257 = { FOLLOW_DATE_in_dateval257_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_interval_in_dateval266 */
+++static ANTLR3_BITWORD FOLLOW_interval_in_dateval266_bits[] = { ANTLR3_UINT64_LIT(0x0000000000040000) };
+++static ANTLR3_BITSET_LIST FOLLOW_interval_in_dateval266 = { FOLLOW_interval_in_dateval266_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_BEFORE_in_dateval268 */
+++static ANTLR3_BITWORD FOLLOW_BEFORE_in_dateval268_bits[] = { ANTLR3_UINT64_LIT(0x0000000000200000) };
+++static ANTLR3_BITSET_LIST FOLLOW_BEFORE_in_dateval268 = { FOLLOW_BEFORE_in_dateval268_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATE_in_dateval270 */
+++static ANTLR3_BITWORD FOLLOW_DATE_in_dateval270_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATE_in_dateval270 = { FOLLOW_DATE_in_dateval270_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_interval_in_dateval279 */
+++static ANTLR3_BITWORD FOLLOW_interval_in_dateval279_bits[] = { ANTLR3_UINT64_LIT(0x0000000000020000) };
+++static ANTLR3_BITSET_LIST FOLLOW_interval_in_dateval279 = { FOLLOW_interval_in_dateval279_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AFTER_in_dateval281 */
+++static ANTLR3_BITWORD FOLLOW_AFTER_in_dateval281_bits[] = { ANTLR3_UINT64_LIT(0x0000000000200000) };
+++static ANTLR3_BITSET_LIST FOLLOW_AFTER_in_dateval281 = { FOLLOW_AFTER_in_dateval281_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATE_in_dateval283 */
+++static ANTLR3_BITWORD FOLLOW_DATE_in_dateval283_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATE_in_dateval283 = { FOLLOW_DATE_in_dateval283_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_interval_in_dateval292 */
+++static ANTLR3_BITWORD FOLLOW_interval_in_dateval292_bits[] = { ANTLR3_UINT64_LIT(0x0000000000400000) };
+++static ANTLR3_BITSET_LIST FOLLOW_interval_in_dateval292 = { FOLLOW_interval_in_dateval292_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AGO_in_dateval294 */
+++static ANTLR3_BITWORD FOLLOW_AGO_in_dateval294_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_AGO_in_dateval294 = { FOLLOW_AGO_in_dateval294_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_interval318 */
+++static ANTLR3_BITWORD FOLLOW_INT_in_interval318_bits[] = { ANTLR3_UINT64_LIT(0x0000000000800000) };
+++static ANTLR3_BITSET_LIST FOLLOW_INT_in_interval318 = { FOLLOW_INT_in_interval318_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATINTERVAL_in_interval320 */
+++static ANTLR3_BITWORD FOLLOW_DATINTERVAL_in_interval320_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATINTERVAL_in_interval320 = { FOLLOW_DATINTERVAL_in_interval320_bits, 1 };
+++
+++
+++
+++
+++/* ==============================================
+++ * Parsing rules
+++ */
+++/**
+++ * $ANTLR start playlist
+++ * SMARTPL2SQL.g:43:1: playlist returns [ pANTLR3_STRING title, pANTLR3_STRING query ] : STR '{' e= expression '}' ;
+++ */
+++static SMARTPL2SQL_playlist_return
+++playlist(pSMARTPL2SQL ctx)
+++{
+++ SMARTPL2SQL_playlist_return retval;
+++
+++ pANTLR3_BASE_TREE STR1;
+++ pANTLR3_STRING e;
+++ #undef RETURN_TYPE_e
+++ #define RETURN_TYPE_e pANTLR3_STRING
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ retval.title= NULL; retval.query= NULL;
+++ STR1 = NULL;
+++ e = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ {
+++ // SMARTPL2SQL.g:45:2: ( STR '{' e= expression '}' )
+++ // SMARTPL2SQL.g:45:4: STR '{' e= expression '}'
+++ {
+++ STR1 = (pANTLR3_BASE_TREE) MATCHT(STR, &FOLLOW_STR_in_playlist66);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleplaylistEx;
+++ }
+++
+++ MATCHT(30, &FOLLOW_30_in_playlist68);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleplaylistEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expression_in_playlist74);
+++ e=expression(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleplaylistEx;
+++ }
+++
+++ MATCHT(31, &FOLLOW_31_in_playlist76);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleplaylistEx;
+++ }
+++
+++ {
+++
+++ pANTLR3_UINT8 val;
+++ val = (STR1->getText(STR1))->toUTF8((STR1->getText(STR1)))->chars;
+++ val++;
+++ val[strlen((const char *)val) - 1] = '\0';
+++
+++ retval.title= (STR1->getText(STR1))->factory->newRaw((STR1->getText(STR1))->factory);
+++ retval.title->append8(retval.title, (const char *)val);
+++
+++ retval.query= e->factory->newRaw(e->factory);
+++ retval.query->append8(retval.query, "(");
+++ retval.query->appendS(retval.query, e);
+++ retval.query->append8(retval.query, ")");
+++
+++ }
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleplaylistEx; /* Prevent compiler warnings */
+++ ruleplaylistEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end playlist */
+++
+++/**
+++ * $ANTLR start expression
+++ * SMARTPL2SQL.g:62:1: expression returns [ pANTLR3_STRING result ] : ( ^( NOT a= expression ) | ^( AND a= expression b= expression ) | ^( OR a= expression b= expression ) | STRTAG INCLUDES STR | STRTAG IS STR | INTTAG INTBOOL INT | DATETAG AFTER dateval | DATETAG BEFORE dateval | ENUMTAG IS ENUMVAL );
+++ */
+++static pANTLR3_STRING
+++expression(pSMARTPL2SQL ctx)
+++{
+++ pANTLR3_STRING result = NULL;
+++
+++ pANTLR3_BASE_TREE STR2;
+++ pANTLR3_BASE_TREE STRTAG3;
+++ pANTLR3_BASE_TREE STR4;
+++ pANTLR3_BASE_TREE STRTAG5;
+++ pANTLR3_BASE_TREE INTTAG6;
+++ pANTLR3_BASE_TREE INTBOOL7;
+++ pANTLR3_BASE_TREE INT8;
+++ pANTLR3_BASE_TREE DATETAG10;
+++ pANTLR3_BASE_TREE DATETAG12;
+++ pANTLR3_BASE_TREE ENUMTAG13;
+++ pANTLR3_BASE_TREE ENUMVAL14;
+++ pANTLR3_STRING a;
+++ #undef RETURN_TYPE_a
+++ #define RETURN_TYPE_a pANTLR3_STRING
+++
+++ pANTLR3_STRING b;
+++ #undef RETURN_TYPE_b
+++ #define RETURN_TYPE_b pANTLR3_STRING
+++
+++ int dateval9;
+++ #undef RETURN_TYPE_dateval9
+++ #define RETURN_TYPE_dateval9 int
+++
+++ int dateval11;
+++ #undef RETURN_TYPE_dateval11
+++ #define RETURN_TYPE_dateval11 int
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ result= NULL;
+++ STR2 = NULL;
+++ STRTAG3 = NULL;
+++ STR4 = NULL;
+++ STRTAG5 = NULL;
+++ INTTAG6 = NULL;
+++ INTBOOL7 = NULL;
+++ INT8 = NULL;
+++ DATETAG10 = NULL;
+++ DATETAG12 = NULL;
+++ ENUMTAG13 = NULL;
+++ ENUMVAL14 = NULL;
+++ a = NULL;
+++ b = NULL;
+++ dateval9 = 0;
+++ dateval11 = 0;
+++
+++ {
+++ {
+++ // SMARTPL2SQL.g:64:2: ( ^( NOT a= expression ) | ^( AND a= expression b= expression ) | ^( OR a= expression b= expression ) | STRTAG INCLUDES STR | STRTAG IS STR | INTTAG INTBOOL INT | DATETAG AFTER dateval | DATETAG BEFORE dateval | ENUMTAG IS ENUMVAL )
+++
+++ ANTLR3_UINT32 alt1;
+++
+++ alt1=9;
+++
+++ switch ( LA(1) )
+++ {
+++ case NOT:
+++ {
+++ alt1=1;
+++ }
+++ break;
+++ case AND:
+++ {
+++ alt1=2;
+++ }
+++ break;
+++ case OR:
+++ {
+++ alt1=3;
+++ }
+++ break;
+++ case STRTAG:
+++ {
+++ switch ( LA(2) )
+++ {
+++ case INCLUDES:
+++ {
+++ alt1=4;
+++ }
+++ break;
+++ case IS:
+++ {
+++ alt1=5;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 4;
+++
+++
+++ goto ruleexpressionEx;
+++ }
+++
+++ }
+++ break;
+++ case INTTAG:
+++ {
+++ alt1=6;
+++ }
+++ break;
+++ case DATETAG:
+++ {
+++ switch ( LA(2) )
+++ {
+++ case AFTER:
+++ {
+++ alt1=7;
+++ }
+++ break;
+++ case BEFORE:
+++ {
+++ alt1=8;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 6;
+++
+++
+++ goto ruleexpressionEx;
+++ }
+++
+++ }
+++ break;
+++ case ENUMTAG:
+++ {
+++ alt1=9;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleexpressionEx;
+++ }
+++
+++ switch (alt1)
+++ {
+++ case 1:
+++ // SMARTPL2SQL.g:64:4: ^( NOT a= expression )
+++ {
+++ MATCHT(NOT, &FOLLOW_NOT_in_expression101);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expression_in_expression107);
+++ a=expression(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ {
+++
+++ result= a->factory->newRaw(a->factory);
+++ result->append8(result, "NOT(");
+++ result->appendS(result, a);
+++ result->append8(result, ")");
+++
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL2SQL.g:71:4: ^( AND a= expression b= expression )
+++ {
+++ MATCHT(AND, &FOLLOW_AND_in_expression118);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expression_in_expression124);
+++ a=expression(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expression_in_expression130);
+++ b=expression(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ {
+++
+++ result= a->factory->newRaw(a->factory);
+++ result->append8(result, "(");
+++ result->appendS(result, a);
+++ result->append8(result, " AND ");
+++ result->appendS(result, b);
+++ result->append8(result, ")");
+++
+++ }
+++
+++ }
+++ break;
+++ case 3:
+++ // SMARTPL2SQL.g:80:4: ^( OR a= expression b= expression )
+++ {
+++ MATCHT(OR, &FOLLOW_OR_in_expression141);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_DOWN, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expression_in_expression147);
+++ a=expression(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_expression_in_expression153);
+++ b=expression(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++
+++ MATCHT(ANTLR3_TOKEN_UP, NULL);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ {
+++
+++ result= a->factory->newRaw(a->factory);
+++ result->append8(result, "(");
+++ result->appendS(result, a);
+++ result->append8(result, " OR ");
+++ result->appendS(result, b);
+++ result->append8(result, ")");
+++
+++ }
+++
+++ }
+++ break;
+++ case 4:
+++ // SMARTPL2SQL.g:89:4: STRTAG INCLUDES STR
+++ {
+++ STRTAG3 = (pANTLR3_BASE_TREE) MATCHT(STRTAG, &FOLLOW_STRTAG_in_expression163);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ MATCHT(INCLUDES, &FOLLOW_INCLUDES_in_expression165);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ STR2 = (pANTLR3_BASE_TREE) MATCHT(STR, &FOLLOW_STR_in_expression167);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ {
+++
+++ pANTLR3_UINT8 val;
+++ val = (STR2->getText(STR2))->toUTF8((STR2->getText(STR2)))->chars;
+++ val++;
+++ val[strlen((const char *)val) - 1] = '\0';
+++
+++ result= (STR2->getText(STR2))->factory->newRaw((STR2->getText(STR2))->factory);
+++ result->append8(result, "f.");
+++ result->appendS(result, (STRTAG3->getText(STRTAG3))->toUTF8((STRTAG3->getText(STRTAG3))));
+++ result->append8(result, " LIKE '%");
+++ result->append8(result, sqlite3_mprintf("%q", (const char *)val));
+++ result->append8(result, "%'");
+++
+++ }
+++
+++ }
+++ break;
+++ case 5:
+++ // SMARTPL2SQL.g:103:4: STRTAG IS STR
+++ {
+++ STRTAG5 = (pANTLR3_BASE_TREE) MATCHT(STRTAG, &FOLLOW_STRTAG_in_expression176);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ MATCHT(IS, &FOLLOW_IS_in_expression178);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ STR4 = (pANTLR3_BASE_TREE) MATCHT(STR, &FOLLOW_STR_in_expression180);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ {
+++
+++ pANTLR3_UINT8 val;
+++ val = (STR4->getText(STR4))->toUTF8((STR4->getText(STR4)))->chars;
+++ val++;
+++ val[strlen((const char *)val) - 1] = '\0';
+++
+++ result= (STR4->getText(STR4))->factory->newRaw((STR4->getText(STR4))->factory);
+++ result->append8(result, "f.");
+++ result->appendS(result, (STRTAG5->getText(STRTAG5))->toUTF8((STRTAG5->getText(STRTAG5))));
+++ result->append8(result, " LIKE '");
+++ result->append8(result, sqlite3_mprintf("%q", (const char *)val));
+++ result->append8(result, "'");
+++
+++ }
+++
+++ }
+++ break;
+++ case 6:
+++ // SMARTPL2SQL.g:117:4: INTTAG INTBOOL INT
+++ {
+++ INTTAG6 = (pANTLR3_BASE_TREE) MATCHT(INTTAG, &FOLLOW_INTTAG_in_expression189);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ INTBOOL7 = (pANTLR3_BASE_TREE) MATCHT(INTBOOL, &FOLLOW_INTBOOL_in_expression191);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ INT8 = (pANTLR3_BASE_TREE) MATCHT(INT, &FOLLOW_INT_in_expression193);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ {
+++
+++ result= (INTTAG6->getText(INTTAG6))->factory->newRaw((INTTAG6->getText(INTTAG6))->factory);
+++ result->append8(result, "f.");
+++ result->appendS(result, (INTTAG6->getText(INTTAG6))->toUTF8((INTTAG6->getText(INTTAG6))));
+++ result->append8(result, " ");
+++ result->appendS(result, (INTBOOL7->getText(INTBOOL7))->toUTF8((INTBOOL7->getText(INTBOOL7))));
+++ result->append8(result, " ");
+++ result->appendS(result, (INT8->getText(INT8))->toUTF8((INT8->getText(INT8))));
+++
+++ }
+++
+++ }
+++ break;
+++ case 7:
+++ // SMARTPL2SQL.g:127:4: DATETAG AFTER dateval
+++ {
+++ DATETAG10 = (pANTLR3_BASE_TREE) MATCHT(DATETAG, &FOLLOW_DATETAG_in_expression202);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ MATCHT(AFTER, &FOLLOW_AFTER_in_expression204);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_dateval_in_expression206);
+++ dateval9=dateval(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ {
+++
+++ char str[15];
+++ sprintf(str, "%d", dateval9);
+++
+++ result= (DATETAG10->getText(DATETAG10))->factory->newRaw((DATETAG10->getText(DATETAG10))->factory);
+++ result->append8(result, "f.");
+++ result->appendS(result, (DATETAG10->getText(DATETAG10))->toUTF8((DATETAG10->getText(DATETAG10))));
+++ result->append8(result, " > ");
+++ result->append8(result, str);
+++
+++ }
+++
+++ }
+++ break;
+++ case 8:
+++ // SMARTPL2SQL.g:138:4: DATETAG BEFORE dateval
+++ {
+++ DATETAG12 = (pANTLR3_BASE_TREE) MATCHT(DATETAG, &FOLLOW_DATETAG_in_expression215);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ MATCHT(BEFORE, &FOLLOW_BEFORE_in_expression217);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_dateval_in_expression219);
+++ dateval11=dateval(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ {
+++
+++ char str[15];
+++ sprintf(str, "%d", dateval11);
+++
+++ result= (DATETAG12->getText(DATETAG12))->factory->newRaw((DATETAG12->getText(DATETAG12))->factory);
+++ result->append8(result, "f.");
+++ result->appendS(result, (DATETAG12->getText(DATETAG12))->toUTF8((DATETAG12->getText(DATETAG12))));
+++ result->append8(result, " > ");
+++ result->append8(result, str);
+++
+++ }
+++
+++ }
+++ break;
+++ case 9:
+++ // SMARTPL2SQL.g:149:4: ENUMTAG IS ENUMVAL
+++ {
+++ ENUMTAG13 = (pANTLR3_BASE_TREE) MATCHT(ENUMTAG, &FOLLOW_ENUMTAG_in_expression228);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ MATCHT(IS, &FOLLOW_IS_in_expression230);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ ENUMVAL14 = (pANTLR3_BASE_TREE) MATCHT(ENUMVAL, &FOLLOW_ENUMVAL_in_expression232);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ {
+++
+++ pANTLR3_UINT8 tag;
+++ pANTLR3_UINT8 val;
+++ char str[20];
+++
+++ sprintf(str, "1=1");
+++
+++ tag = (ENUMTAG13->getText(ENUMTAG13))->chars;
+++ val = (ENUMVAL14->getText(ENUMVAL14))->chars;
+++ if (strcmp((char *)tag, "media_kind") == 0)
+++ {
+++ if (strcmp((char *)val, "music") == 0)
+++ {
+++ sprintf(str, "f.media_kind = %d", MEDIA_KIND_MUSIC);
+++ }
+++ else if (strcmp((char *)val, "movie") == 0)
+++ {
+++ sprintf(str, "f.media_kind = %d", MEDIA_KIND_MOVIE);
+++ }
+++ else if (strcmp((char *)val, "podcast") == 0)
+++ {
+++ sprintf(str, "f.media_kind = %d", MEDIA_KIND_PODCAST);
+++ }
+++ else if (strcmp((char *)val, "audiobook") == 0)
+++ {
+++ sprintf(str, "f.media_kind = %d", MEDIA_KIND_AUDIOBOOK);
+++ }
+++ else if (strcmp((char *)val, "tvshow") == 0)
+++ {
+++ sprintf(str, "f.media_kind = %d", MEDIA_KIND_TVSHOW);
+++ }
+++ }
+++ else if (strcmp((char *)tag, "data_kind") == 0)
+++ {
+++ if (strcmp((char *)val, "file") == 0)
+++ {
+++ sprintf(str, "f.data_kind = %d", DATA_KIND_FILE);
+++ }
+++ else if (strcmp((char *)val, "url") == 0)
+++ {
+++ sprintf(str, "f.data_kind = %d", DATA_KIND_URL);
+++ }
+++ else if (strcmp((char *)val, "spotify") == 0)
+++ {
+++ sprintf(str, "f.data_kind = %d", DATA_KIND_SPOTIFY);
+++ }
+++ else if (strcmp((char *)val, "pipe") == 0)
+++ {
+++ sprintf(str, "f.data_kind = %d", DATA_KIND_PIPE);
+++ }
+++ }
+++
+++ result= (ENUMTAG13->getText(ENUMTAG13))->factory->newRaw((ENUMTAG13->getText(ENUMTAG13))->factory);
+++ result->append8(result, str);
+++
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleexpressionEx; /* Prevent compiler warnings */
+++ ruleexpressionEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return result;
+++}
+++/* $ANTLR end expression */
+++
+++/**
+++ * $ANTLR start dateval
+++ * SMARTPL2SQL.g:207:1: dateval returns [ int result ] : ( DATE | interval BEFORE DATE | interval AFTER DATE | interval AGO );
+++ */
+++static int
+++dateval(pSMARTPL2SQL ctx)
+++{
+++ int result = 0;
+++
+++ pANTLR3_BASE_TREE DATE15;
+++ pANTLR3_BASE_TREE DATE16;
+++ pANTLR3_BASE_TREE DATE18;
+++ int interval17;
+++ #undef RETURN_TYPE_interval17
+++ #define RETURN_TYPE_interval17 int
+++
+++ int interval19;
+++ #undef RETURN_TYPE_interval19
+++ #define RETURN_TYPE_interval19 int
+++
+++ int interval20;
+++ #undef RETURN_TYPE_interval20
+++ #define RETURN_TYPE_interval20 int
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ result= 0;
+++ DATE15 = NULL;
+++ DATE16 = NULL;
+++ DATE18 = NULL;
+++ interval17 = 0;
+++ interval19 = 0;
+++ interval20 = 0;
+++
+++ {
+++ {
+++ // SMARTPL2SQL.g:209:2: ( DATE | interval BEFORE DATE | interval AFTER DATE | interval AGO )
+++
+++ ANTLR3_UINT32 alt2;
+++
+++ alt2=4;
+++
+++ switch ( LA(1) )
+++ {
+++ case DATE:
+++ {
+++ alt2=1;
+++ }
+++ break;
+++ case INT:
+++ {
+++ switch ( LA(2) )
+++ {
+++ case DATINTERVAL:
+++ {
+++ switch ( LA(3) )
+++ {
+++ case AGO:
+++ {
+++ alt2=4;
+++ }
+++ break;
+++ case BEFORE:
+++ {
+++ alt2=2;
+++ }
+++ break;
+++ case AFTER:
+++ {
+++ alt2=3;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 2;
+++ EXCEPTION->state = 3;
+++
+++
+++ goto ruledatevalEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 2;
+++ EXCEPTION->state = 2;
+++
+++
+++ goto ruledatevalEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 2;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruledatevalEx;
+++ }
+++
+++ switch (alt2)
+++ {
+++ case 1:
+++ // SMARTPL2SQL.g:209:4: DATE
+++ {
+++ DATE15 = (pANTLR3_BASE_TREE) MATCHT(DATE, &FOLLOW_DATE_in_dateval257);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ {
+++
+++ pANTLR3_UINT8 datval;
+++
+++ datval = (DATE15->getText(DATE15))->chars;
+++
+++ if (strcmp((char *)datval, "today") == 0)
+++ {
+++ result= time(NULL);
+++ }
+++ else if (strcmp((char *)datval, "yesterday") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600;
+++ }
+++ else if (strcmp((char *)datval, "last week") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600 * 7;
+++ }
+++ else if (strcmp((char *)datval, "last month") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600 * 30;
+++ }
+++ else if (strcmp((char *)datval, "last year") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600 * 365;
+++ }
+++ else
+++ {
+++ struct tm tm;
+++ char year[5];
+++ char month[3];
+++ char day[3];
+++
+++ memset((void*)&tm,0,sizeof(tm));
+++ memset(year, 0, sizeof(year));
+++ memset(month, 0, sizeof(month));
+++ memset(day, 0, sizeof(day));
+++
+++ strncpy(year, (const char *)datval, 4);
+++ strncpy(month, (const char *)datval + 5, 2);
+++ strncpy(day, (const char *)datval + 8, 2);
+++
+++ tm.tm_year = atoi(year) - 1900;
+++ tm.tm_mon = atoi(month) - 1;
+++ tm.tm_mday = atoi(day);
+++
+++ result= mktime(&tm);
+++ }
+++
+++ }
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL2SQL.g:258:4: interval BEFORE DATE
+++ {
+++ FOLLOWPUSH(FOLLOW_interval_in_dateval266);
+++ interval17=interval(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ MATCHT(BEFORE, &FOLLOW_BEFORE_in_dateval268);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ DATE16 = (pANTLR3_BASE_TREE) MATCHT(DATE, &FOLLOW_DATE_in_dateval270);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ {
+++
+++ pANTLR3_UINT8 datval;
+++
+++ datval = (DATE16->getText(DATE16))->chars;
+++
+++ if (strcmp((char *)datval, "yesterday") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600;
+++ }
+++ else if (strcmp((char *)datval, "last week") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600 * 7;
+++ }
+++ else if (strcmp((char *)datval, "last month") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600 * 30;
+++ }
+++ else if (strcmp((char *)datval, "last year") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600 * 365;
+++ }
+++ else
+++ {
+++ result= time(NULL);
+++ }
+++
+++ result= result - interval17;
+++
+++ }
+++
+++ }
+++ break;
+++ case 3:
+++ // SMARTPL2SQL.g:287:4: interval AFTER DATE
+++ {
+++ FOLLOWPUSH(FOLLOW_interval_in_dateval279);
+++ interval19=interval(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ MATCHT(AFTER, &FOLLOW_AFTER_in_dateval281);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ DATE18 = (pANTLR3_BASE_TREE) MATCHT(DATE, &FOLLOW_DATE_in_dateval283);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ {
+++
+++ pANTLR3_UINT8 datval;
+++
+++ datval = (DATE18->getText(DATE18))->chars;
+++
+++ if (strcmp((char *)datval, "yesterday") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600;
+++ }
+++ else if (strcmp((char *)datval, "last week") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600 * 7;
+++ }
+++ else if (strcmp((char *)datval, "last month") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600 * 30;
+++ }
+++ else if (strcmp((char *)datval, "last year") == 0)
+++ {
+++ result= time(NULL) - 24 * 3600 * 365;
+++ }
+++ else
+++ {
+++ result= time(NULL);
+++ }
+++
+++ result= result + interval19;
+++
+++ }
+++
+++ }
+++ break;
+++ case 4:
+++ // SMARTPL2SQL.g:316:4: interval AGO
+++ {
+++ FOLLOWPUSH(FOLLOW_interval_in_dateval292);
+++ interval20=interval(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ MATCHT(AGO, &FOLLOW_AGO_in_dateval294);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ {
+++
+++ result= time(NULL) - interval20;
+++
+++ }
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledatevalEx; /* Prevent compiler warnings */
+++ ruledatevalEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return result;
+++}
+++/* $ANTLR end dateval */
+++
+++/**
+++ * $ANTLR start interval
+++ * SMARTPL2SQL.g:322:1: interval returns [ int result ] : INT DATINTERVAL ;
+++ */
+++static int
+++interval(pSMARTPL2SQL ctx)
+++{
+++ int result = 0;
+++
+++ pANTLR3_BASE_TREE INT21;
+++ pANTLR3_BASE_TREE DATINTERVAL22;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ result= 0;
+++ INT21 = NULL;
+++ DATINTERVAL22 = NULL;
+++
+++ {
+++ // SMARTPL2SQL.g:324:2: ( INT DATINTERVAL )
+++ // SMARTPL2SQL.g:324:4: INT DATINTERVAL
+++ {
+++ INT21 = (pANTLR3_BASE_TREE) MATCHT(INT, &FOLLOW_INT_in_interval318);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintervalEx;
+++ }
+++
+++ DATINTERVAL22 = (pANTLR3_BASE_TREE) MATCHT(DATINTERVAL, &FOLLOW_DATINTERVAL_in_interval320);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintervalEx;
+++ }
+++
+++ {
+++
+++ pANTLR3_UINT8 interval;
+++
+++ result= atoi((const char *)(INT21->getText(INT21))->chars);
+++ interval = (DATINTERVAL22->getText(DATINTERVAL22))->chars;
+++
+++ if (strcmp((char *)interval, "days") == 0)
+++ {
+++ result= result * 24 * 3600;
+++ }
+++ else if (strcmp((char *)interval, "weeks") == 0)
+++ {
+++ result= result * 24 * 3600 * 7;
+++ }
+++ else if (strcmp((char *)interval, "months") == 0)
+++ {
+++ result= result * 24 * 3600 * 30;
+++ }
+++ else if (strcmp((char *)interval, "weeks") == 0)
+++ {
+++ result= result * 24 * 3600 * 365;
+++ }
+++ else
+++ {
+++ result= 0;
+++ }
+++
+++ }
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleintervalEx; /* Prevent compiler warnings */
+++ ruleintervalEx: ;
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ }
+++
+++
+++ return result;
+++}
+++/* $ANTLR end interval */
+++/* End of parsing rules
+++ * ==============================================
+++ */
+++
+++/* ==============================================
+++ * Syntactic predicates
+++ */
+++/* End of syntactic predicates
+++ * ==============================================
+++ */
+++
+++
+++
+++
+++
+++
+++/* End of code
+++ * =============================================================================
+++ */
++diff --git a/src/pregen/SMARTPL2SQL.h b/src/pregen/SMARTPL2SQL.h
++new file mode 100644
++index 0000000..322e8fd
++--- /dev/null
+++++ b/src/pregen/SMARTPL2SQL.h
++@@ -0,0 +1,220 @@
+++/** \file
+++ * This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : SMARTPL2SQL.g
+++ * - On : 2015-06-27 19:05:21
+++ * - for the tree parser : SMARTPL2SQLTreeParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++ * The tree parser SMARTPL2SQL has the callable functions (rules) shown below,
+++ * which will invoke the code for the associated rule in the source grammar
+++ * assuming that the input stream is pointing to a token/text stream that could begin
+++ * this rule.
+++ *
+++ * For instance if you call the first (topmost) rule in a parser grammar, you will
+++ * get the results of a full parse, but calling a rule half way through the grammar will
+++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
+++ * in editors and so on.
+++ *
+++ * The parser entry points are called indirectly (by function pointer to function) via
+++ * a parser context typedef pSMARTPL2SQL, which is returned from a call to SMARTPL2SQLNew().
+++ *
+++ * The methods in pSMARTPL2SQL are as follows:
+++ *
+++ * - SMARTPL2SQL_playlist_return pSMARTPL2SQL->playlist(pSMARTPL2SQL)
+++ * - pANTLR3_STRING pSMARTPL2SQL->expression(pSMARTPL2SQL)
+++ * - int pSMARTPL2SQL->dateval(pSMARTPL2SQL)
+++ * - int pSMARTPL2SQL->interval(pSMARTPL2SQL)
+++ *
+++ * The return type for any particular rule is of course determined by the source
+++ * grammar file.
+++ */
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++#ifndef _SMARTPL2SQL_H
+++#define _SMARTPL2SQL_H
+++/* =============================================================================
+++ * Standard antlr3 C runtime definitions
+++ */
+++#include <antlr3.h>
+++
+++/* End of standard antlr 3 runtime definitions
+++ * =============================================================================
+++ */
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++// Forward declare the context typedef so that we can use it before it is
+++// properly defined. Delegators and delegates (from import statements) are
+++// interdependent and their context structures contain pointers to each other
+++// C only allows such things to be declared if you pre-declare the typedef.
+++//
+++typedef struct SMARTPL2SQL_Ctx_struct SMARTPL2SQL, * pSMARTPL2SQL;
+++
+++
+++
+++ #include <stdio.h>
+++ #include <stdlib.h>
+++ #include <string.h>
+++ #include <limits.h>
+++ #include <errno.h>
+++ #include <time.h>
+++ #include <sqlite3.h>
+++
+++ #include "logger.h"
+++ #include "db.h"
+++
+++
+++#ifdef ANTLR3_WINDOWS
+++// Disable: Unreferenced parameter, - Rules with parameters that are not used
+++// constant conditional, - ANTLR realizes that a prediction is always true (synpred usually)
+++// initialized but unused variable - tree rewrite variables declared but not needed
+++// Unreferenced local variable - lexer rule declares but does not always use _type
+++// potentially unitialized variable used - retval always returned from a rule
+++// unreferenced local function has been removed - susually getTokenNames or freeScope, they can go without warnigns
+++//
+++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
+++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
+++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
+++// this is a matter of orthogonality hence I disable that one.
+++//
+++#pragma warning( disable : 4100 )
+++#pragma warning( disable : 4101 )
+++#pragma warning( disable : 4127 )
+++#pragma warning( disable : 4189 )
+++#pragma warning( disable : 4505 )
+++#pragma warning( disable : 4701 )
+++#endif
+++typedef struct SMARTPL2SQL_playlist_return_struct
+++{
+++ pANTLR3_BASE_TREE start;
+++ pANTLR3_BASE_TREE stop;
+++ pANTLR3_STRING title;
+++ pANTLR3_STRING query;
+++}
+++ SMARTPL2SQL_playlist_return;
+++
+++
+++
+++/** Context tracking structure for SMARTPL2SQL
+++ */
+++struct SMARTPL2SQL_Ctx_struct
+++{
+++ /** Built in ANTLR3 context tracker contains all the generic elements
+++ * required for context tracking.
+++ */
+++ pANTLR3_TREE_PARSER pTreeParser;
+++
+++
+++ SMARTPL2SQL_playlist_return (*playlist) (struct SMARTPL2SQL_Ctx_struct * ctx);
+++ pANTLR3_STRING (*expression) (struct SMARTPL2SQL_Ctx_struct * ctx);
+++ int (*dateval) (struct SMARTPL2SQL_Ctx_struct * ctx);
+++ int (*interval) (struct SMARTPL2SQL_Ctx_struct * ctx);
+++ // Delegated rules
+++ const char * (*getGrammarFileName)();
+++ void (*free) (struct SMARTPL2SQL_Ctx_struct * ctx);
+++
+++};
+++
+++// Function protoypes for the constructor functions that external translation units
+++// such as delegators and delegates may wish to call.
+++//
+++ANTLR3_API pSMARTPL2SQL SMARTPL2SQLNew (pANTLR3_COMMON_TREE_NODE_STREAM instream);
+++ANTLR3_API pSMARTPL2SQL SMARTPL2SQLNewSSD (pANTLR3_COMMON_TREE_NODE_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
+++
+++/** Symbolic definitions of all the tokens that the tree parser will work with.
+++ * \{
+++ *
+++ * Antlr will define EOF, but we can't use that as it it is too common in
+++ * in C header files and that would be confusing. There is no way to filter this out at the moment
+++ * so we just undef it here for now. That isn't the value we get back from C recognizers
+++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
+++ */
+++#ifdef EOF
+++#undef EOF
+++#endif
+++#ifdef Tokens
+++#undef Tokens
+++#endif
+++#define INTBOOL 14
+++#define STRTAG 10
+++#define AGO 22
+++#define WHITESPACE 29
+++#define GREATEREQUAL 25
+++#define BEFORE 18
+++#define DATETAG 16
+++#define INT 15
+++#define NOT 7
+++#define AFTER 17
+++#define AND 6
+++#define EOF -1
+++#define INCLUDES 11
+++#define STR 4
+++#define T__30 30
+++#define T__31 31
+++#define GREATER 24
+++#define LPAR 8
+++#define ENUMTAG 19
+++#define IS 12
+++#define ENUMVAL 20
+++#define EQUAL 28
+++#define OR 5
+++#define LESS 26
+++#define RPAR 9
+++#define DATE 21
+++#define LESSEQUAL 27
+++#define INTTAG 13
+++#define DATINTERVAL 23
+++#ifdef EOF
+++#undef EOF
+++#define EOF ANTLR3_TOKEN_EOF
+++#endif
+++
+++#ifndef TOKENSOURCE
+++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
+++#endif
+++
+++/* End of token definitions for SMARTPL2SQL
+++ * =============================================================================
+++ */
+++/** \} */
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif
+++
+++/* END - Note:Keep extra line feed to satisfy UNIX systems */
++diff --git a/src/pregen/SMARTPL2SQL.u b/src/pregen/SMARTPL2SQL.u
++new file mode 100644
++index 0000000..85567d1
++--- /dev/null
+++++ b/src/pregen/SMARTPL2SQL.u
++@@ -0,0 +1,5 @@
+++SMARTPL2SQL.g: SMARTPL.tokens
+++SMARTPL2SQL.c : SMARTPL2SQL.g
+++./SMARTPL2SQL.tokens : SMARTPL2SQL.g
+++SMARTPL2SQL.h : SMARTPL2SQL.g
+++ANTLR_PRODUCTS += SMARTPL2SQL.c ./SMARTPL2SQL.tokens SMARTPL2SQL.h
++\ No newline at end of file
++diff --git a/src/pregen/SMARTPLLexer.c b/src/pregen/SMARTPLLexer.c
++new file mode 100644
++index 0000000..9ea1a83
++--- /dev/null
+++++ b/src/pregen/SMARTPLLexer.c
++@@ -0,0 +1,4168 @@
+++/** \file
+++ * This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : SMARTPL.g
+++ * - On : 2015-06-27 19:05:15
+++ * - for the lexer : SMARTPLLexerLexer *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++*/
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++/* -----------------------------------------
+++ * Include the ANTLR3 generated header file.
+++ */
+++#include "SMARTPLLexer.h"
+++/* ----------------------------------------- */
+++
+++
+++/** String literals used by SMARTPLLexer that we must do things like MATCHS() with.
+++ * C will normally just lay down 8 bit characters, and you can use L"xxx" to
+++ * get wchar_t, but wchar_t is 16 bits on Windows, which is not UTF32 and so
+++ * we perform this little trick of defining the literals as arrays of UINT32
+++ * and passing in the address of these.
+++ */
+++static ANTLR3_UCHAR lit_1[] = { 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_2[] = { 0x61, 0x6C, 0x62, 0x75, 0x6D, 0x5F, 0x61, 0x72, 0x74, 0x69, 0x73, 0x74, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_3[] = { 0x61, 0x6C, 0x62, 0x75, 0x6D, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_4[] = { 0x74, 0x69, 0x74, 0x6C, 0x65, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_5[] = { 0x67, 0x65, 0x6E, 0x72, 0x65, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_6[] = { 0x63, 0x6F, 0x6D, 0x70, 0x6F, 0x73, 0x65, 0x72, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_7[] = { 0x70, 0x61, 0x74, 0x68, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_8[] = { 0x74, 0x79, 0x70, 0x65, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_9[] = { 0x67, 0x72, 0x6F, 0x75, 0x70, 0x69, 0x6E, 0x67, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_10[] = { 0x70, 0x6C, 0x61, 0x79, 0x5F, 0x63, 0x6F, 0x75, 0x6E, 0x74, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_11[] = { 0x72, 0x61, 0x74, 0x69, 0x6E, 0x67, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_12[] = { 0x79, 0x65, 0x61, 0x72, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_13[] = { 0x63, 0x6F, 0x6D, 0x70, 0x69, 0x6C, 0x61, 0x74, 0x69, 0x6F, 0x6E, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_14[] = { 0x74, 0x69, 0x6D, 0x65, 0x5F, 0x61, 0x64, 0x64, 0x65, 0x64, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_15[] = { 0x74, 0x69, 0x6D, 0x65, 0x5F, 0x70, 0x6C, 0x61, 0x79, 0x65, 0x64, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_16[] = { 0x64, 0x61, 0x74, 0x61, 0x5F, 0x6B, 0x69, 0x6E, 0x64, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_17[] = { 0x6D, 0x65, 0x64, 0x69, 0x61, 0x5F, 0x6B, 0x69, 0x6E, 0x64, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_18[] = { 0x69, 0x6E, 0x63, 0x6C, 0x75, 0x64, 0x65, 0x73, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_19[] = { 0x69, 0x73, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_20[] = { 0x3E, 0x3D, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_21[] = { 0x3C, 0x3D, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_22[] = { 0x61, 0x66, 0x74, 0x65, 0x72, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_23[] = { 0x62, 0x65, 0x66, 0x6F, 0x72, 0x65, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_24[] = { 0x61, 0x67, 0x6F, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_25[] = { 0x41, 0x4E, 0x44, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_26[] = { 0x61, 0x6E, 0x64, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_27[] = { 0x4F, 0x52, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_28[] = { 0x6F, 0x72, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_29[] = { 0x4E, 0x4F, 0x54, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_30[] = { 0x6E, 0x6F, 0x74, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_31[] = { 0x74, 0x6F, 0x64, 0x61, 0x79, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_32[] = { 0x79, 0x65, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61, 0x79, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_33[] = { 0x6C, 0x61, 0x73, 0x74, 0x20, 0x77, 0x65, 0x65, 0x6B, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_34[] = { 0x6C, 0x61, 0x73, 0x74, 0x20, 0x6D, 0x6F, 0x6E, 0x74, 0x68, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_35[] = { 0x6C, 0x61, 0x73, 0x74, 0x20, 0x79, 0x65, 0x61, 0x72, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_36[] = { 0x64, 0x61, 0x79, 0x73, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_37[] = { 0x77, 0x65, 0x65, 0x6B, 0x73, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_38[] = { 0x6D, 0x6F, 0x6E, 0x74, 0x68, 0x73, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_39[] = { 0x79, 0x65, 0x61, 0x72, 0x73, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_40[] = { 0x6D, 0x75, 0x73, 0x69, 0x63, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_41[] = { 0x6D, 0x6F, 0x76, 0x69, 0x65, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_42[] = { 0x70, 0x6F, 0x64, 0x63, 0x61, 0x73, 0x74, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_43[] = { 0x61, 0x75, 0x64, 0x69, 0x6F, 0x62, 0x6F, 0x6F, 0x6B, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_44[] = { 0x74, 0x76, 0x73, 0x68, 0x6F, 0x77, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_45[] = { 0x66, 0x69, 0x6C, 0x65, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_46[] = { 0x75, 0x72, 0x6C, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_47[] = { 0x73, 0x70, 0x6F, 0x74, 0x69, 0x66, 0x79, ANTLR3_STRING_TERMINATOR};
+++static ANTLR3_UCHAR lit_48[] = { 0x70, 0x69, 0x70, 0x65, ANTLR3_STRING_TERMINATOR};
+++
+++
+++
+++
+++/* MACROS that hide the C interface implementations from the
+++ * generated code, which makes it a little more understandable to the human eye.
+++ * I am very much against using C pre-processor macros for function calls and bits
+++ * of code as you cannot see what is happening when single stepping in debuggers
+++ * and so on. The exception (in my book at least) is for generated code, where you are
+++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
+++ * hides some indirect calls, but is always referring to the input stream. This is
+++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
+++ * the runtime interfaces without changing the generated code too often, without
+++ * confusing the reader of the generated output, who may not wish to know the gory
+++ * details of the interface inheritance.
+++ */
+++
+++#define CTX ctx
+++
+++/* Aids in accessing scopes for grammar programmers
+++ */
+++#undef SCOPE_TYPE
+++#undef SCOPE_STACK
+++#undef SCOPE_TOP
+++#define SCOPE_TYPE(scope) pSMARTPLLexer_##scope##_SCOPE
+++#define SCOPE_STACK(scope) pSMARTPLLexer_##scope##Stack
+++#define SCOPE_TOP(scope) ctx->pSMARTPLLexer_##scope##Top
+++#define SCOPE_SIZE(scope) ctx->pSMARTPLLexer_##scope##Stack_limit
+++#define SCOPE_INSTANCE(scope, i) (ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
+++
+++
+++/* Macros for accessing things in a lexer
+++ */
+++#undef LEXER
+++#undef RECOGNIZER
+++#undef RULEMEMO
+++#undef GETCHARINDEX
+++#undef GETLINE
+++#undef GETCHARPOSITIONINLINE
+++#undef EMIT
+++#undef EMITNEW
+++#undef MATCHC
+++#undef MATCHS
+++#undef MATCHRANGE
+++#undef LTOKEN
+++#undef HASFAILED
+++#undef FAILEDFLAG
+++#undef INPUT
+++#undef STRSTREAM
+++#undef LA
+++#undef HASEXCEPTION
+++#undef EXCEPTION
+++#undef CONSTRUCTEX
+++#undef CONSUME
+++#undef LRECOVER
+++#undef MARK
+++#undef REWIND
+++#undef REWINDLAST
+++#undef BACKTRACKING
+++#undef MATCHANY
+++#undef MEMOIZE
+++#undef HAVEPARSEDRULE
+++#undef GETTEXT
+++#undef INDEX
+++#undef SEEK
+++#undef PUSHSTREAM
+++#undef POPSTREAM
+++#undef SETTEXT
+++#undef SETTEXT8
+++
+++#define LEXER ctx->pLexer
+++#define RECOGNIZER LEXER->rec
+++#define LEXSTATE RECOGNIZER->state
+++#define TOKSOURCE LEXSTATE->tokSource
+++#define GETCHARINDEX() LEXER->getCharIndex(LEXER)
+++#define GETLINE() LEXER->getLine(LEXER)
+++#define GETTEXT() LEXER->getText(LEXER)
+++#define GETCHARPOSITIONINLINE() LEXER->getCharPositionInLine(LEXER)
+++#define EMIT() LEXSTATE->type = _type; LEXER->emit(LEXER)
+++#define EMITNEW(t) LEXER->emitNew(LEXER, t)
+++#define MATCHC(c) LEXER->matchc(LEXER, c)
+++#define MATCHS(s) LEXER->matchs(LEXER, s)
+++#define MATCHRANGE(c1,c2) LEXER->matchRange(LEXER, c1, c2)
+++#define MATCHANY() LEXER->matchAny(LEXER)
+++#define LTOKEN LEXSTATE->token
+++#define HASFAILED() (LEXSTATE->failed == ANTLR3_TRUE)
+++#define BACKTRACKING LEXSTATE->backtracking
+++#define FAILEDFLAG LEXSTATE->failed
+++#define INPUT LEXER->input
+++#define STRSTREAM INPUT
+++#define ISTREAM INPUT->istream
+++#define INDEX() ISTREAM->index(ISTREAM)
+++#define SEEK(n) ISTREAM->seek(ISTREAM, n)
+++#define EOF_TOKEN &(LEXSTATE->tokSource->eofToken)
+++#define HASEXCEPTION() (LEXSTATE->error == ANTLR3_TRUE)
+++#define EXCEPTION LEXSTATE->exception
+++#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER)
+++#define LRECOVER() LEXER->recover(LEXER)
+++#define MARK() ISTREAM->mark(ISTREAM)
+++#define REWIND(m) ISTREAM->rewind(ISTREAM, m)
+++#define REWINDLAST() ISTREAM->rewindLast(ISTREAM)
+++#define MEMOIZE(ri,si) RECOGNIZER->memoize(RECOGNIZER, ri, si)
+++#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
+++#define PUSHSTREAM(str) LEXER->pushCharStream(LEXER, str)
+++#define POPSTREAM() LEXER->popCharStream(LEXER)
+++#define SETTEXT(str) LEXSTATE->text = str
+++#define SKIP() LEXSTATE->token = &(TOKSOURCE->skipToken)
+++#define USER1 LEXSTATE->user1
+++#define USER2 LEXSTATE->user2
+++#define USER3 LEXSTATE->user3
+++#define CUSTOM LEXSTATE->custom
+++#define RULEMEMO LEXSTATE->ruleMemo
+++#define DBG RECOGNIZER->debugger
+++
+++/* If we have been told we can rely on the standard 8 bit or 16 bit input
+++ * stream, then we can define our macros to use the direct pointers
+++ * in the input object, which is much faster than indirect calls. This
+++ * is really only significant to lexers with a lot of fragment rules (which
+++ * do not place LA(1) in a temporary at the moment) and even then
+++ * only if there is a lot of input (order of say 1M or so).
+++ */
+++#if defined(ANTLR3_INLINE_INPUT_ASCII) || defined(ANTLR3_INLINE_INPUT_UTF16)
+++
+++# ifdef ANTLR3_INLINE_INPUT_ASCII
+++
+++/* 8 bit "ASCII" (actually any 8 bit character set) */
+++
+++# define NEXTCHAR ((pANTLR3_UINT8)(INPUT->nextChar))
+++# define DATAP ((pANTLR3_UINT8)(INPUT->data))
+++
+++# else
+++
+++# define NEXTCHAR ((pANTLR3_UINT16)(INPUT->nextChar))
+++# define DATAP ((pANTLR3_UINT16)(INPUT->data))
+++
+++# endif
+++
+++# define LA(n) ((NEXTCHAR + n) > (DATAP + INPUT->sizeBuf) ? ANTLR3_CHARSTREAM_EOF : (ANTLR3_UCHAR)(*(NEXTCHAR + n - 1)))
+++# define CONSUME() \
+++{ \
+++ if (NEXTCHAR < (DATAP + INPUT->sizeBuf)) \
+++ { \
+++ INPUT->charPositionInLine++; \
+++ if ((ANTLR3_UCHAR)(*NEXTCHAR) == INPUT->newlineChar) \
+++ { \
+++ INPUT->line++; \
+++ INPUT->charPositionInLine = 0; \
+++ INPUT->currentLine = (void *)(NEXTCHAR + 1); \
+++ } \
+++ INPUT->nextChar = (void *)(NEXTCHAR + 1); \
+++ } \
+++}
+++
+++#else
+++
+++// Pick up the input character by calling the input stream implementation.
+++//
+++#define CONSUME() INPUT->istream->consume(INPUT->istream)
+++#define LA(n) INPUT->istream->_LA(INPUT->istream, n)
+++
+++#endif
+++#define TOKTEXT(tok, txt) tok, (pANTLR3_UINT8)txt
+++
+++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
+++ * then for the present you must use different names for your defines as these are hard coded
+++ * in the code generator. It would be better not to use such names internally, and maybe
+++ * we can change this in a forthcoming release. I deliberately do not #undef these
+++ * here as this will at least give you a redefined error somewhere if they clash.
+++ */
+++#define UP ANTLR3_TOKEN_UP
+++#define DOWN ANTLR3_TOKEN_DOWN
+++#define EOR ANTLR3_TOKEN_EOR
+++#define INVALID ANTLR3_TOKEN_INVALID
+++
+++
+++/* =============================================================================
+++ * Functions to create and destroy scopes. First come the rule scopes, followed
+++ * by the global declared scopes.
+++ */
+++
+++
+++
+++/* ============================================================================= */
+++
+++/* =============================================================================
+++ * Start of recognizer
+++ */
+++
+++
+++/* Forward declare the locally static matching functions we have generated and any predicate functions.
+++ */
+++static ANTLR3_INLINE void mT__30 (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mT__31 (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mSTRTAG (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mINTTAG (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mDATETAG (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mENUMTAG (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mINCLUDES (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mIS (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mINTBOOL (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mGREATER (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mGREATEREQUAL (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mLESS (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mLESSEQUAL (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mEQUAL (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mAFTER (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mBEFORE (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mAGO (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mAND (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mOR (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mNOT (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mLPAR (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mRPAR (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mDATE (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mDATINTERVAL (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mENUMVAL (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mSTR (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mINT (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mWHITESPACE (pSMARTPLLexer ctx);
+++static ANTLR3_INLINE void mTokens (pSMARTPLLexer ctx);
+++static void SMARTPLLexerFree(pSMARTPLLexer ctx);
+++
+++/* =========================================================================
+++ * Lexer matching rules end.
+++ * =========================================================================
+++ */
+++
+++
+++
+++static void
+++SMARTPLLexerFree (pSMARTPLLexer ctx)
+++{
+++ LEXER->free(LEXER);
+++
+++ ANTLR3_FREE(ctx);
+++}
+++
+++/** \brief Name of the grammar file that generated this code
+++ */
+++static const char fileName[] = "SMARTPL.g";
+++
+++/** \brief Return the name of the grammar file that generated this code.
+++ */
+++static const char * getGrammarFileName()
+++{
+++ return fileName;
+++}
+++
+++/** \brief Create a new lexer called SMARTPLLexer
+++ *
+++ * \param[in] instream Pointer to an initialized input stream
+++ * \return
+++ * - Success pSMARTPLLexer initialized for the lex start
+++ * - Fail NULL
+++ */
+++ANTLR3_API pSMARTPLLexer SMARTPLLexerNew
+++(pANTLR3_INPUT_STREAM instream)
+++{
+++ // See if we can create a new lexer with the standard constructor
+++ //
+++ return SMARTPLLexerNewSSD(instream, NULL);
+++}
+++
+++/** \brief Create a new lexer called SMARTPLLexer
+++ *
+++ * \param[in] instream Pointer to an initialized input stream
+++ * \param[state] state Previously created shared recognizer stat
+++ * \return
+++ * - Success pSMARTPLLexer initialized for the lex start
+++ * - Fail NULL
+++ */
+++ANTLR3_API pSMARTPLLexer SMARTPLLexerNewSSD
+++(pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
+++{
+++ pSMARTPLLexer ctx; // Context structure we will build and return
+++
+++ ctx = (pSMARTPLLexer) ANTLR3_CALLOC(1, sizeof(SMARTPLLexer));
+++
+++ if (ctx == NULL)
+++ {
+++ // Failed to allocate memory for lexer context
+++ return NULL;
+++ }
+++
+++ /* -------------------------------------------------------------------
+++ * Memory for basic structure is allocated, now to fill in
+++ * in base ANTLR3 structures. We initialize the function pointers
+++ * for the standard ANTLR3 lexer function set, but upon return
+++ * from here, the programmer may set the pointers to provide custom
+++ * implementations of each function.
+++ *
+++ * We don't use the macros defined in SMARTPLLexer.h here so you can get a sense
+++ * of what goes where.
+++ */
+++
+++ /* Create a base lexer, using the supplied input stream
+++ */
+++ ctx->pLexer = antlr3LexerNewStream(ANTLR3_SIZE_HINT, instream, state);
+++
+++ /* Check that we allocated the memory correctly
+++ */
+++ if (ctx->pLexer == NULL)
+++ {
+++ ANTLR3_FREE(ctx);
+++ return NULL;
+++ }
+++ /* Install the implementation of our SMARTPLLexer interface
+++ */
+++ ctx->mT__30 = mT__30;
+++ ctx->mT__31 = mT__31;
+++ ctx->mSTRTAG = mSTRTAG;
+++ ctx->mINTTAG = mINTTAG;
+++ ctx->mDATETAG = mDATETAG;
+++ ctx->mENUMTAG = mENUMTAG;
+++ ctx->mINCLUDES = mINCLUDES;
+++ ctx->mIS = mIS;
+++ ctx->mINTBOOL = mINTBOOL;
+++ ctx->mGREATER = mGREATER;
+++ ctx->mGREATEREQUAL = mGREATEREQUAL;
+++ ctx->mLESS = mLESS;
+++ ctx->mLESSEQUAL = mLESSEQUAL;
+++ ctx->mEQUAL = mEQUAL;
+++ ctx->mAFTER = mAFTER;
+++ ctx->mBEFORE = mBEFORE;
+++ ctx->mAGO = mAGO;
+++ ctx->mAND = mAND;
+++ ctx->mOR = mOR;
+++ ctx->mNOT = mNOT;
+++ ctx->mLPAR = mLPAR;
+++ ctx->mRPAR = mRPAR;
+++ ctx->mDATE = mDATE;
+++ ctx->mDATINTERVAL = mDATINTERVAL;
+++ ctx->mENUMVAL = mENUMVAL;
+++ ctx->mSTR = mSTR;
+++ ctx->mINT = mINT;
+++ ctx->mWHITESPACE = mWHITESPACE;
+++ ctx->mTokens = mTokens;
+++
+++ /** When the nextToken() call is made to this lexer's pANTLR3_TOKEN_SOURCE
+++ * it will call mTokens() in this generated code, and will pass it the ctx
+++ * pointer of this lexer, not the context of the base lexer, so store that now.
+++ */
+++ ctx->pLexer->ctx = ctx;
+++
+++ /**Install the token matching function
+++ */
+++ ctx->pLexer->mTokens = (void (*) (void *))(mTokens);
+++
+++ ctx->getGrammarFileName = getGrammarFileName;
+++ ctx->free = SMARTPLLexerFree;
+++
+++
+++
+++
+++
+++ /* Return the newly built lexer to the caller
+++ */
+++ return ctx;
+++}
+++
+++
+++/* =========================================================================
+++ * Functions to match the lexer grammar defined tokens from the input stream
+++ */
+++
+++// Comes from: 7:7: ( '{' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start T__30
+++ *
+++ * Looks to match the characters the constitute the token T__30
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mT__30(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = T__30;
+++
+++
+++ // SMARTPL.g:7:7: ( '{' )
+++ // SMARTPL.g:7:9: '{'
+++ {
+++ MATCHC('{');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleT__30Ex;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleT__30Ex; /* Prevent compiler warnings */
+++ ruleT__30Ex: ;
+++
+++}
+++// $ANTLR end T__30
+++
+++// Comes from: 8:7: ( '}' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start T__31
+++ *
+++ * Looks to match the characters the constitute the token T__31
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mT__31(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = T__31;
+++
+++
+++ // SMARTPL.g:8:7: ( '}' )
+++ // SMARTPL.g:8:9: '}'
+++ {
+++ MATCHC('}');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleT__31Ex;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleT__31Ex; /* Prevent compiler warnings */
+++ ruleT__31Ex: ;
+++
+++}
+++// $ANTLR end T__31
+++
+++// Comes from: 56:9: ( 'artist' | 'album_artist' | 'album' | 'title' | 'genre' | 'composer' | 'path' | 'type' | 'grouping' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start STRTAG
+++ *
+++ * Looks to match the characters the constitute the token STRTAG
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mSTRTAG(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = STRTAG;
+++
+++
+++ {
+++ // SMARTPL.g:56:9: ( 'artist' | 'album_artist' | 'album' | 'title' | 'genre' | 'composer' | 'path' | 'type' | 'grouping' )
+++
+++ ANTLR3_UINT32 alt1;
+++
+++ alt1=9;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'a':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'r':
+++ {
+++ alt1=1;
+++ }
+++ break;
+++ case 'l':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'b':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'u':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 'm':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case '_':
+++ {
+++ alt1=2;
+++ }
+++ break;
+++
+++ default:
+++ alt1=3;}
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 13;
+++
+++
+++ goto ruleSTRTAGEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 12;
+++
+++
+++ goto ruleSTRTAGEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 7;
+++
+++
+++ goto ruleSTRTAGEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 1;
+++
+++
+++ goto ruleSTRTAGEx;
+++ }
+++
+++ }
+++ break;
+++ case 't':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'i':
+++ {
+++ alt1=4;
+++ }
+++ break;
+++ case 'y':
+++ {
+++ alt1=8;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 2;
+++
+++
+++ goto ruleSTRTAGEx;
+++ }
+++
+++ }
+++ break;
+++ case 'g':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'e':
+++ {
+++ alt1=5;
+++ }
+++ break;
+++ case 'r':
+++ {
+++ alt1=9;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 3;
+++
+++
+++ goto ruleSTRTAGEx;
+++ }
+++
+++ }
+++ break;
+++ case 'c':
+++ {
+++ alt1=6;
+++ }
+++ break;
+++ case 'p':
+++ {
+++ alt1=7;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 1;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleSTRTAGEx;
+++ }
+++
+++ switch (alt1)
+++ {
+++ case 1:
+++ // SMARTPL.g:56:11: 'artist'
+++ {
+++ MATCHS(lit_1);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTRTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:57:6: 'album_artist'
+++ {
+++ MATCHS(lit_2);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTRTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // SMARTPL.g:58:6: 'album'
+++ {
+++ MATCHS(lit_3);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTRTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 4:
+++ // SMARTPL.g:59:6: 'title'
+++ {
+++ MATCHS(lit_4);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTRTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 5:
+++ // SMARTPL.g:60:6: 'genre'
+++ {
+++ MATCHS(lit_5);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTRTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 6:
+++ // SMARTPL.g:61:6: 'composer'
+++ {
+++ MATCHS(lit_6);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTRTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 7:
+++ // SMARTPL.g:62:6: 'path'
+++ {
+++ MATCHS(lit_7);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTRTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 8:
+++ // SMARTPL.g:63:6: 'type'
+++ {
+++ MATCHS(lit_8);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTRTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 9:
+++ // SMARTPL.g:64:6: 'grouping'
+++ {
+++ MATCHS(lit_9);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTRTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleSTRTAGEx; /* Prevent compiler warnings */
+++ ruleSTRTAGEx: ;
+++
+++}
+++// $ANTLR end STRTAG
+++
+++// Comes from: 67:9: ( 'play_count' | 'rating' | 'year' | 'compilation' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start INTTAG
+++ *
+++ * Looks to match the characters the constitute the token INTTAG
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mINTTAG(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = INTTAG;
+++
+++
+++ {
+++ // SMARTPL.g:67:9: ( 'play_count' | 'rating' | 'year' | 'compilation' )
+++
+++ ANTLR3_UINT32 alt2;
+++
+++ alt2=4;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'p':
+++ {
+++ alt2=1;
+++ }
+++ break;
+++ case 'r':
+++ {
+++ alt2=2;
+++ }
+++ break;
+++ case 'y':
+++ {
+++ alt2=3;
+++ }
+++ break;
+++ case 'c':
+++ {
+++ alt2=4;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 2;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleINTTAGEx;
+++ }
+++
+++ switch (alt2)
+++ {
+++ case 1:
+++ // SMARTPL.g:67:11: 'play_count'
+++ {
+++ MATCHS(lit_10);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:68:6: 'rating'
+++ {
+++ MATCHS(lit_11);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // SMARTPL.g:69:6: 'year'
+++ {
+++ MATCHS(lit_12);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 4:
+++ // SMARTPL.g:70:6: 'compilation'
+++ {
+++ MATCHS(lit_13);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleINTTAGEx; /* Prevent compiler warnings */
+++ ruleINTTAGEx: ;
+++
+++}
+++// $ANTLR end INTTAG
+++
+++// Comes from: 73:10: ( 'time_added' | 'time_played' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start DATETAG
+++ *
+++ * Looks to match the characters the constitute the token DATETAG
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mDATETAG(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = DATETAG;
+++
+++
+++ {
+++ // SMARTPL.g:73:10: ( 'time_added' | 'time_played' )
+++
+++ ANTLR3_UINT32 alt3;
+++
+++ alt3=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case 't':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'i':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'm':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case '_':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case 'a':
+++ {
+++ alt3=1;
+++ }
+++ break;
+++ case 'p':
+++ {
+++ alt3=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 5;
+++
+++
+++ goto ruleDATETAGEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 4;
+++
+++
+++ goto ruleDATETAGEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 3;
+++
+++
+++ goto ruleDATETAGEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 2;
+++
+++
+++ goto ruleDATETAGEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 1;
+++
+++
+++ goto ruleDATETAGEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleDATETAGEx;
+++ }
+++
+++ switch (alt3)
+++ {
+++ case 1:
+++ // SMARTPL.g:73:12: 'time_added'
+++ {
+++ MATCHS(lit_14);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATETAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:74:6: 'time_played'
+++ {
+++ MATCHS(lit_15);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATETAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleDATETAGEx; /* Prevent compiler warnings */
+++ ruleDATETAGEx: ;
+++
+++}
+++// $ANTLR end DATETAG
+++
+++// Comes from: 77:10: ( 'data_kind' | 'media_kind' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start ENUMTAG
+++ *
+++ * Looks to match the characters the constitute the token ENUMTAG
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mENUMTAG(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = ENUMTAG;
+++
+++
+++ {
+++ // SMARTPL.g:77:10: ( 'data_kind' | 'media_kind' )
+++
+++ ANTLR3_UINT32 alt4;
+++
+++ alt4=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'd':
+++ {
+++ alt4=1;
+++ }
+++ break;
+++ case 'm':
+++ {
+++ alt4=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleENUMTAGEx;
+++ }
+++
+++ switch (alt4)
+++ {
+++ case 1:
+++ // SMARTPL.g:77:12: 'data_kind'
+++ {
+++ MATCHS(lit_16);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENUMTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:78:6: 'media_kind'
+++ {
+++ MATCHS(lit_17);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENUMTAGEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleENUMTAGEx; /* Prevent compiler warnings */
+++ ruleENUMTAGEx: ;
+++
+++}
+++// $ANTLR end ENUMTAG
+++
+++// Comes from: 81:10: ( 'includes' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start INCLUDES
+++ *
+++ * Looks to match the characters the constitute the token INCLUDES
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mINCLUDES(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = INCLUDES;
+++
+++
+++ // SMARTPL.g:81:10: ( 'includes' )
+++ // SMARTPL.g:81:12: 'includes'
+++ {
+++ MATCHS(lit_18);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINCLUDESEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleINCLUDESEx; /* Prevent compiler warnings */
+++ ruleINCLUDESEx: ;
+++
+++}
+++// $ANTLR end INCLUDES
+++
+++// Comes from: 84:6: ( 'is' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start IS
+++ *
+++ * Looks to match the characters the constitute the token IS
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mIS(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = IS;
+++
+++
+++ // SMARTPL.g:84:6: ( 'is' )
+++ // SMARTPL.g:84:8: 'is'
+++ {
+++ MATCHS(lit_19);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleISEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleISEx; /* Prevent compiler warnings */
+++ ruleISEx: ;
+++
+++}
+++// $ANTLR end IS
+++
+++// Comes from: 87:10: ( ( GREATER | GREATEREQUAL | LESS | LESSEQUAL | EQUAL ) )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start INTBOOL
+++ *
+++ * Looks to match the characters the constitute the token INTBOOL
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mINTBOOL(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = INTBOOL;
+++
+++
+++ // SMARTPL.g:87:10: ( ( GREATER | GREATEREQUAL | LESS | LESSEQUAL | EQUAL ) )
+++ // SMARTPL.g:87:12: ( GREATER | GREATEREQUAL | LESS | LESSEQUAL | EQUAL )
+++ {
+++
+++ // SMARTPL.g:87:12: ( GREATER | GREATEREQUAL | LESS | LESSEQUAL | EQUAL )
+++ {
+++ int alt5=5;
+++ switch ( LA(1) )
+++ {
+++ case '>':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case '=':
+++ {
+++ alt5=2;
+++ }
+++ break;
+++
+++ default:
+++ alt5=1;}
+++
+++ }
+++ break;
+++ case '<':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case '=':
+++ {
+++ alt5=4;
+++ }
+++ break;
+++
+++ default:
+++ alt5=3;}
+++
+++ }
+++ break;
+++ case '=':
+++ {
+++ alt5=5;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 5;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleINTBOOLEx;
+++ }
+++
+++ switch (alt5)
+++ {
+++ case 1:
+++ // SMARTPL.g:87:13: GREATER
+++ {
+++ /* 87:13: GREATER */
+++ mGREATER(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTBOOLEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:87:21: GREATEREQUAL
+++ {
+++ /* 87:21: GREATEREQUAL */
+++ mGREATEREQUAL(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTBOOLEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // SMARTPL.g:87:34: LESS
+++ {
+++ /* 87:34: LESS */
+++ mLESS(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTBOOLEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 4:
+++ // SMARTPL.g:87:39: LESSEQUAL
+++ {
+++ /* 87:39: LESSEQUAL */
+++ mLESSEQUAL(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTBOOLEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 5:
+++ // SMARTPL.g:87:49: EQUAL
+++ {
+++ /* 87:49: EQUAL */
+++ mEQUAL(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTBOOLEx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleINTBOOLEx; /* Prevent compiler warnings */
+++ ruleINTBOOLEx: ;
+++
+++}
+++// $ANTLR end INTBOOL
+++
+++// Comes from: 91:10: ( '>' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start GREATER
+++ *
+++ * Looks to match the characters the constitute the token GREATER
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mGREATER(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++
+++ // SMARTPL.g:91:10: ( '>' )
+++ // SMARTPL.g:91:12: '>'
+++ {
+++ MATCHC('>');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleGREATEREx;
+++ }
+++
+++
+++ }
+++
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleGREATEREx; /* Prevent compiler warnings */
+++ ruleGREATEREx: ;
+++
+++}
+++// $ANTLR end GREATER
+++
+++// Comes from: 95:13: ( '>=' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start GREATEREQUAL
+++ *
+++ * Looks to match the characters the constitute the token GREATEREQUAL
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mGREATEREQUAL(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++
+++ // SMARTPL.g:95:13: ( '>=' )
+++ // SMARTPL.g:95:15: '>='
+++ {
+++ MATCHS(lit_20);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleGREATEREQUALEx;
+++ }
+++
+++
+++
+++ }
+++
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleGREATEREQUALEx; /* Prevent compiler warnings */
+++ ruleGREATEREQUALEx: ;
+++
+++}
+++// $ANTLR end GREATEREQUAL
+++
+++// Comes from: 99:7: ( '<' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start LESS
+++ *
+++ * Looks to match the characters the constitute the token LESS
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mLESS(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++
+++ // SMARTPL.g:99:7: ( '<' )
+++ // SMARTPL.g:99:9: '<'
+++ {
+++ MATCHC('<');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleLESSEx;
+++ }
+++
+++
+++ }
+++
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleLESSEx; /* Prevent compiler warnings */
+++ ruleLESSEx: ;
+++
+++}
+++// $ANTLR end LESS
+++
+++// Comes from: 103:11: ( '<=' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start LESSEQUAL
+++ *
+++ * Looks to match the characters the constitute the token LESSEQUAL
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mLESSEQUAL(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++
+++ // SMARTPL.g:103:11: ( '<=' )
+++ // SMARTPL.g:103:13: '<='
+++ {
+++ MATCHS(lit_21);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleLESSEQUALEx;
+++ }
+++
+++
+++
+++ }
+++
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleLESSEQUALEx; /* Prevent compiler warnings */
+++ ruleLESSEQUALEx: ;
+++
+++}
+++// $ANTLR end LESSEQUAL
+++
+++// Comes from: 107:8: ( '=' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start EQUAL
+++ *
+++ * Looks to match the characters the constitute the token EQUAL
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mEQUAL(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++
+++ // SMARTPL.g:107:8: ( '=' )
+++ // SMARTPL.g:107:10: '='
+++ {
+++ MATCHC('=');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleEQUALEx;
+++ }
+++
+++
+++ }
+++
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleEQUALEx; /* Prevent compiler warnings */
+++ ruleEQUALEx: ;
+++
+++}
+++// $ANTLR end EQUAL
+++
+++// Comes from: 110:8: ( 'after' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start AFTER
+++ *
+++ * Looks to match the characters the constitute the token AFTER
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mAFTER(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = AFTER;
+++
+++
+++ // SMARTPL.g:110:8: ( 'after' )
+++ // SMARTPL.g:110:10: 'after'
+++ {
+++ MATCHS(lit_22);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleAFTEREx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleAFTEREx; /* Prevent compiler warnings */
+++ ruleAFTEREx: ;
+++
+++}
+++// $ANTLR end AFTER
+++
+++// Comes from: 113:9: ( 'before' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start BEFORE
+++ *
+++ * Looks to match the characters the constitute the token BEFORE
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mBEFORE(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = BEFORE;
+++
+++
+++ // SMARTPL.g:113:9: ( 'before' )
+++ // SMARTPL.g:113:11: 'before'
+++ {
+++ MATCHS(lit_23);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleBEFOREEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleBEFOREEx; /* Prevent compiler warnings */
+++ ruleBEFOREEx: ;
+++
+++}
+++// $ANTLR end BEFORE
+++
+++// Comes from: 116:7: ( 'ago' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start AGO
+++ *
+++ * Looks to match the characters the constitute the token AGO
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mAGO(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = AGO;
+++
+++
+++ // SMARTPL.g:116:7: ( 'ago' )
+++ // SMARTPL.g:116:9: 'ago'
+++ {
+++ MATCHS(lit_24);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleAGOEx;
+++ }
+++
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleAGOEx; /* Prevent compiler warnings */
+++ ruleAGOEx: ;
+++
+++}
+++// $ANTLR end AGO
+++
+++// Comes from: 119:7: ( 'AND' | 'and' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start AND
+++ *
+++ * Looks to match the characters the constitute the token AND
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mAND(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = AND;
+++
+++
+++ {
+++ // SMARTPL.g:119:7: ( 'AND' | 'and' )
+++
+++ ANTLR3_UINT32 alt6;
+++
+++ alt6=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'A':
+++ {
+++ alt6=1;
+++ }
+++ break;
+++ case 'a':
+++ {
+++ alt6=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 6;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleANDEx;
+++ }
+++
+++ switch (alt6)
+++ {
+++ case 1:
+++ // SMARTPL.g:119:9: 'AND'
+++ {
+++ MATCHS(lit_25);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleANDEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:120:6: 'and'
+++ {
+++ MATCHS(lit_26);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleANDEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleANDEx; /* Prevent compiler warnings */
+++ ruleANDEx: ;
+++
+++}
+++// $ANTLR end AND
+++
+++// Comes from: 123:6: ( 'OR' | 'or' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start OR
+++ *
+++ * Looks to match the characters the constitute the token OR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mOR(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = OR;
+++
+++
+++ {
+++ // SMARTPL.g:123:6: ( 'OR' | 'or' )
+++
+++ ANTLR3_UINT32 alt7;
+++
+++ alt7=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'O':
+++ {
+++ alt7=1;
+++ }
+++ break;
+++ case 'o':
+++ {
+++ alt7=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 7;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleOREx;
+++ }
+++
+++ switch (alt7)
+++ {
+++ case 1:
+++ // SMARTPL.g:123:8: 'OR'
+++ {
+++ MATCHS(lit_27);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleOREx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:124:6: 'or'
+++ {
+++ MATCHS(lit_28);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleOREx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleOREx; /* Prevent compiler warnings */
+++ ruleOREx: ;
+++
+++}
+++// $ANTLR end OR
+++
+++// Comes from: 127:7: ( 'NOT' | 'not' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start NOT
+++ *
+++ * Looks to match the characters the constitute the token NOT
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mNOT(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = NOT;
+++
+++
+++ {
+++ // SMARTPL.g:127:7: ( 'NOT' | 'not' )
+++
+++ ANTLR3_UINT32 alt8;
+++
+++ alt8=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'N':
+++ {
+++ alt8=1;
+++ }
+++ break;
+++ case 'n':
+++ {
+++ alt8=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 8;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleNOTEx;
+++ }
+++
+++ switch (alt8)
+++ {
+++ case 1:
+++ // SMARTPL.g:127:9: 'NOT'
+++ {
+++ MATCHS(lit_29);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleNOTEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:128:6: 'not'
+++ {
+++ MATCHS(lit_30);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleNOTEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleNOTEx; /* Prevent compiler warnings */
+++ ruleNOTEx: ;
+++
+++}
+++// $ANTLR end NOT
+++
+++// Comes from: 131:7: ( '(' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start LPAR
+++ *
+++ * Looks to match the characters the constitute the token LPAR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mLPAR(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = LPAR;
+++
+++
+++ // SMARTPL.g:131:7: ( '(' )
+++ // SMARTPL.g:131:9: '('
+++ {
+++ MATCHC('(');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleLPAREx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleLPAREx; /* Prevent compiler warnings */
+++ ruleLPAREx: ;
+++
+++}
+++// $ANTLR end LPAR
+++
+++// Comes from: 134:7: ( ')' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start RPAR
+++ *
+++ * Looks to match the characters the constitute the token RPAR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mRPAR(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = RPAR;
+++
+++
+++ // SMARTPL.g:134:7: ( ')' )
+++ // SMARTPL.g:134:9: ')'
+++ {
+++ MATCHC(')');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleRPAREx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleRPAREx; /* Prevent compiler warnings */
+++ ruleRPAREx: ;
+++
+++}
+++// $ANTLR end RPAR
+++
+++// Comes from: 137:7: ( ( '0' .. '9' ) ( '0' .. '9' ) ( '0' .. '9' ) ( '0' .. '9' ) '-' ( '0' .. '1' ) ( '0' .. '9' ) '-' ( '0' .. '3' ) ( '0' .. '9' ) | 'today' | 'yesterday' | 'last week' | 'last month' | 'last year' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start DATE
+++ *
+++ * Looks to match the characters the constitute the token DATE
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mDATE(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = DATE;
+++
+++
+++ {
+++ // SMARTPL.g:137:7: ( ( '0' .. '9' ) ( '0' .. '9' ) ( '0' .. '9' ) ( '0' .. '9' ) '-' ( '0' .. '1' ) ( '0' .. '9' ) '-' ( '0' .. '3' ) ( '0' .. '9' ) | 'today' | 'yesterday' | 'last week' | 'last month' | 'last year' )
+++
+++ ANTLR3_UINT32 alt9;
+++
+++ alt9=6;
+++
+++ switch ( LA(1) )
+++ {
+++ case '0':
+++ case '1':
+++ case '2':
+++ case '3':
+++ case '4':
+++ case '5':
+++ case '6':
+++ case '7':
+++ case '8':
+++ case '9':
+++ {
+++ alt9=1;
+++ }
+++ break;
+++ case 't':
+++ {
+++ alt9=2;
+++ }
+++ break;
+++ case 'y':
+++ {
+++ alt9=3;
+++ }
+++ break;
+++ case 'l':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'a':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 's':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 't':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case ' ':
+++ {
+++ switch ( LA(6) )
+++ {
+++ case 'w':
+++ {
+++ alt9=4;
+++ }
+++ break;
+++ case 'm':
+++ {
+++ alt9=5;
+++ }
+++ break;
+++ case 'y':
+++ {
+++ alt9=6;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 9;
+++ EXCEPTION->state = 8;
+++
+++
+++ goto ruleDATEEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 9;
+++ EXCEPTION->state = 7;
+++
+++
+++ goto ruleDATEEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 9;
+++ EXCEPTION->state = 6;
+++
+++
+++ goto ruleDATEEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 9;
+++ EXCEPTION->state = 5;
+++
+++
+++ goto ruleDATEEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 9;
+++ EXCEPTION->state = 4;
+++
+++
+++ goto ruleDATEEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 9;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleDATEEx;
+++ }
+++
+++ switch (alt9)
+++ {
+++ case 1:
+++ // SMARTPL.g:137:9: ( '0' .. '9' ) ( '0' .. '9' ) ( '0' .. '9' ) ( '0' .. '9' ) '-' ( '0' .. '1' ) ( '0' .. '9' ) '-' ( '0' .. '3' ) ( '0' .. '9' )
+++ {
+++ // SMARTPL.g:137:9: ( '0' .. '9' )
+++ // SMARTPL.g:137:10: '0' .. '9'
+++ {
+++ MATCHRANGE('0', '9');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++
+++ // SMARTPL.g:137:19: ( '0' .. '9' )
+++ // SMARTPL.g:137:20: '0' .. '9'
+++ {
+++ MATCHRANGE('0', '9');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++
+++ // SMARTPL.g:137:29: ( '0' .. '9' )
+++ // SMARTPL.g:137:30: '0' .. '9'
+++ {
+++ MATCHRANGE('0', '9');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++
+++ // SMARTPL.g:137:39: ( '0' .. '9' )
+++ // SMARTPL.g:137:40: '0' .. '9'
+++ {
+++ MATCHRANGE('0', '9');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++
+++ MATCHC('-');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++ // SMARTPL.g:137:52: ( '0' .. '1' )
+++ // SMARTPL.g:137:53: '0' .. '1'
+++ {
+++ MATCHRANGE('0', '1');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++
+++ // SMARTPL.g:137:62: ( '0' .. '9' )
+++ // SMARTPL.g:137:63: '0' .. '9'
+++ {
+++ MATCHRANGE('0', '9');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++
+++ MATCHC('-');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++ // SMARTPL.g:137:75: ( '0' .. '3' )
+++ // SMARTPL.g:137:76: '0' .. '3'
+++ {
+++ MATCHRANGE('0', '3');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++
+++ // SMARTPL.g:137:85: ( '0' .. '9' )
+++ // SMARTPL.g:137:86: '0' .. '9'
+++ {
+++ MATCHRANGE('0', '9');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++ }
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:138:6: 'today'
+++ {
+++ MATCHS(lit_31);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // SMARTPL.g:139:6: 'yesterday'
+++ {
+++ MATCHS(lit_32);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 4:
+++ // SMARTPL.g:140:6: 'last week'
+++ {
+++ MATCHS(lit_33);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 5:
+++ // SMARTPL.g:141:6: 'last month'
+++ {
+++ MATCHS(lit_34);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 6:
+++ // SMARTPL.g:142:6: 'last year'
+++ {
+++ MATCHS(lit_35);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATEEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleDATEEx; /* Prevent compiler warnings */
+++ ruleDATEEx: ;
+++
+++}
+++// $ANTLR end DATE
+++
+++// Comes from: 145:13: ( 'days' | 'weeks' | 'months' | 'years' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start DATINTERVAL
+++ *
+++ * Looks to match the characters the constitute the token DATINTERVAL
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mDATINTERVAL(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = DATINTERVAL;
+++
+++
+++ {
+++ // SMARTPL.g:145:13: ( 'days' | 'weeks' | 'months' | 'years' )
+++
+++ ANTLR3_UINT32 alt10;
+++
+++ alt10=4;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'd':
+++ {
+++ alt10=1;
+++ }
+++ break;
+++ case 'w':
+++ {
+++ alt10=2;
+++ }
+++ break;
+++ case 'm':
+++ {
+++ alt10=3;
+++ }
+++ break;
+++ case 'y':
+++ {
+++ alt10=4;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 10;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleDATINTERVALEx;
+++ }
+++
+++ switch (alt10)
+++ {
+++ case 1:
+++ // SMARTPL.g:145:15: 'days'
+++ {
+++ MATCHS(lit_36);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATINTERVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:146:6: 'weeks'
+++ {
+++ MATCHS(lit_37);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATINTERVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // SMARTPL.g:147:6: 'months'
+++ {
+++ MATCHS(lit_38);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATINTERVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 4:
+++ // SMARTPL.g:148:6: 'years'
+++ {
+++ MATCHS(lit_39);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleDATINTERVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleDATINTERVALEx; /* Prevent compiler warnings */
+++ ruleDATINTERVALEx: ;
+++
+++}
+++// $ANTLR end DATINTERVAL
+++
+++// Comes from: 151:10: ( 'music' | 'movie' | 'podcast' | 'audiobook' | 'tvshow' | 'file' | 'url' | 'spotify' | 'pipe' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start ENUMVAL
+++ *
+++ * Looks to match the characters the constitute the token ENUMVAL
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mENUMVAL(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = ENUMVAL;
+++
+++
+++ {
+++ // SMARTPL.g:151:10: ( 'music' | 'movie' | 'podcast' | 'audiobook' | 'tvshow' | 'file' | 'url' | 'spotify' | 'pipe' )
+++
+++ ANTLR3_UINT32 alt11;
+++
+++ alt11=9;
+++
+++ switch ( LA(1) )
+++ {
+++ case 'm':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'u':
+++ {
+++ alt11=1;
+++ }
+++ break;
+++ case 'o':
+++ {
+++ alt11=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 11;
+++ EXCEPTION->state = 1;
+++
+++
+++ goto ruleENUMVALEx;
+++ }
+++
+++ }
+++ break;
+++ case 'p':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'o':
+++ {
+++ alt11=3;
+++ }
+++ break;
+++ case 'i':
+++ {
+++ alt11=9;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 11;
+++ EXCEPTION->state = 2;
+++
+++
+++ goto ruleENUMVALEx;
+++ }
+++
+++ }
+++ break;
+++ case 'a':
+++ {
+++ alt11=4;
+++ }
+++ break;
+++ case 't':
+++ {
+++ alt11=5;
+++ }
+++ break;
+++ case 'f':
+++ {
+++ alt11=6;
+++ }
+++ break;
+++ case 'u':
+++ {
+++ alt11=7;
+++ }
+++ break;
+++ case 's':
+++ {
+++ alt11=8;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 11;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleENUMVALEx;
+++ }
+++
+++ switch (alt11)
+++ {
+++ case 1:
+++ // SMARTPL.g:151:12: 'music'
+++ {
+++ MATCHS(lit_40);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENUMVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:152:6: 'movie'
+++ {
+++ MATCHS(lit_41);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENUMVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // SMARTPL.g:153:6: 'podcast'
+++ {
+++ MATCHS(lit_42);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENUMVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 4:
+++ // SMARTPL.g:154:6: 'audiobook'
+++ {
+++ MATCHS(lit_43);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENUMVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 5:
+++ // SMARTPL.g:155:6: 'tvshow'
+++ {
+++ MATCHS(lit_44);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENUMVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 6:
+++ // SMARTPL.g:156:6: 'file'
+++ {
+++ MATCHS(lit_45);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENUMVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 7:
+++ // SMARTPL.g:157:6: 'url'
+++ {
+++ MATCHS(lit_46);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENUMVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 8:
+++ // SMARTPL.g:158:6: 'spotify'
+++ {
+++ MATCHS(lit_47);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENUMVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++ case 9:
+++ // SMARTPL.g:159:6: 'pipe'
+++ {
+++ MATCHS(lit_48);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleENUMVALEx;
+++ }
+++
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleENUMVALEx; /* Prevent compiler warnings */
+++ ruleENUMVALEx: ;
+++
+++}
+++// $ANTLR end ENUMVAL
+++
+++// Comes from: 162:7: ( '\"' (~ ( '\"' ) )+ '\"' )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start STR
+++ *
+++ * Looks to match the characters the constitute the token STR
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mSTR(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = STR;
+++
+++
+++ // SMARTPL.g:162:7: ( '\"' (~ ( '\"' ) )+ '\"' )
+++ // SMARTPL.g:162:9: '\"' (~ ( '\"' ) )+ '\"'
+++ {
+++ MATCHC('"');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTREx;
+++ }
+++
+++ // SMARTPL.g:162:13: (~ ( '\"' ) )+
+++ {
+++ int cnt12=0;
+++
+++ for (;;)
+++ {
+++ int alt12=2;
+++ {
+++ /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
+++ */
+++ int LA12_0 = LA(1);
+++ if ( (((LA12_0 >= 0x0000) && (LA12_0 <= '!')) || ((LA12_0 >= '#') && (LA12_0 <= 0xFFFF))) )
+++ {
+++ alt12=1;
+++ }
+++
+++ }
+++ switch (alt12)
+++ {
+++ case 1:
+++ // SMARTPL.g:162:13: ~ ( '\"' )
+++ {
+++ if ( ((LA(1) >= 0x0000) && (LA(1) <= '!')) || ((LA(1) >= '#') && (LA(1) <= 0xFFFF)) )
+++ {
+++ CONSUME();
+++
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++
+++ LRECOVER(); goto ruleSTREx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ default:
+++
+++ if ( cnt12 >= 1 )
+++ {
+++ goto loop12;
+++ }
+++ /* mismatchedSetEx()
+++ */
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;
+++
+++
+++ goto ruleSTREx;
+++ }
+++ cnt12++;
+++ }
+++ loop12: ; /* Jump to here if this rule does not match */
+++ }
+++ MATCHC('"');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleSTREx;
+++ }
+++
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleSTREx; /* Prevent compiler warnings */
+++ ruleSTREx: ;
+++
+++}
+++// $ANTLR end STR
+++
+++// Comes from: 165:7: ( ( '0' .. '9' )+ )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start INT
+++ *
+++ * Looks to match the characters the constitute the token INT
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mINT(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = INT;
+++
+++
+++ // SMARTPL.g:165:7: ( ( '0' .. '9' )+ )
+++ // SMARTPL.g:165:9: ( '0' .. '9' )+
+++ {
+++ // SMARTPL.g:165:9: ( '0' .. '9' )+
+++ {
+++ int cnt13=0;
+++
+++ for (;;)
+++ {
+++ int alt13=2;
+++ switch ( LA(1) )
+++ {
+++ case '0':
+++ case '1':
+++ case '2':
+++ case '3':
+++ case '4':
+++ case '5':
+++ case '6':
+++ case '7':
+++ case '8':
+++ case '9':
+++ {
+++ alt13=1;
+++ }
+++ break;
+++
+++ }
+++
+++ switch (alt13)
+++ {
+++ case 1:
+++ // SMARTPL.g:165:10: '0' .. '9'
+++ {
+++ MATCHRANGE('0', '9');
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleINTEx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ default:
+++
+++ if ( cnt13 >= 1 )
+++ {
+++ goto loop13;
+++ }
+++ /* mismatchedSetEx()
+++ */
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;
+++
+++
+++ goto ruleINTEx;
+++ }
+++ cnt13++;
+++ }
+++ loop13: ; /* Jump to here if this rule does not match */
+++ }
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleINTEx; /* Prevent compiler warnings */
+++ ruleINTEx: ;
+++
+++}
+++// $ANTLR end INT
+++
+++// Comes from: 168:12: ( ( '\\t' | ' ' | '\\r' | '\\n' | '\\u000C' ) )
+++/** \brief Lexer rule generated by ANTLR3
+++ *
+++ * $ANTLR start WHITESPACE
+++ *
+++ * Looks to match the characters the constitute the token WHITESPACE
+++ * from the attached input stream.
+++ *
+++ *
+++ * \remark
+++ * - lexer->error == ANTLR3_TRUE if an exception was thrown.
+++ */
+++static ANTLR3_INLINE
+++void mWHITESPACE(pSMARTPLLexer ctx)
+++{
+++ ANTLR3_UINT32 _type;
+++
+++ _type = WHITESPACE;
+++
+++
+++ // SMARTPL.g:168:12: ( ( '\\t' | ' ' | '\\r' | '\\n' | '\\u000C' ) )
+++ // SMARTPL.g:168:14: ( '\\t' | ' ' | '\\r' | '\\n' | '\\u000C' )
+++ {
+++ if ( ((LA(1) >= '\t') && (LA(1) <= '\n')) || ((LA(1) >= '\f') && (LA(1) <= '\r')) || LA(1) == ' ' )
+++ {
+++ CONSUME();
+++
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++
+++ LRECOVER(); goto ruleWHITESPACEEx;
+++ }
+++
+++ {
+++ LEXSTATE->channel = HIDDEN;
+++ }
+++
+++ }
+++
+++ LEXSTATE->type = _type;
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleWHITESPACEEx; /* Prevent compiler warnings */
+++ ruleWHITESPACEEx: ;
+++
+++}
+++// $ANTLR end WHITESPACE
+++
+++/** This is the entry point in to the lexer from an object that
+++ * wants to generate the next token, such as a pCOMMON_TOKEN_STREAM
+++ */
+++static void
+++mTokens(pSMARTPLLexer ctx)
+++{
+++ {
+++ // SMARTPL.g:1:8: ( T__30 | T__31 | STRTAG | INTTAG | DATETAG | ENUMTAG | INCLUDES | IS | INTBOOL | AFTER | BEFORE | AGO | AND | OR | NOT | LPAR | RPAR | DATE | DATINTERVAL | ENUMVAL | STR | INT | WHITESPACE )
+++
+++ ANTLR3_UINT32 alt14;
+++
+++ alt14=23;
+++
+++ switch ( LA(1) )
+++ {
+++ case '{':
+++ {
+++ alt14=1;
+++ }
+++ break;
+++ case '}':
+++ {
+++ alt14=2;
+++ }
+++ break;
+++ case 'a':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'l':
+++ case 'r':
+++ {
+++ alt14=3;
+++ }
+++ break;
+++ case 'f':
+++ {
+++ alt14=10;
+++ }
+++ break;
+++ case 'g':
+++ {
+++ alt14=12;
+++ }
+++ break;
+++ case 'n':
+++ {
+++ alt14=13;
+++ }
+++ break;
+++ case 'u':
+++ {
+++ alt14=20;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 3;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 't':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'i':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 't':
+++ {
+++ alt14=3;
+++ }
+++ break;
+++ case 'm':
+++ {
+++ alt14=5;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 28;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'y':
+++ {
+++ alt14=3;
+++ }
+++ break;
+++ case 'o':
+++ {
+++ alt14=18;
+++ }
+++ break;
+++ case 'v':
+++ {
+++ alt14=20;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 4;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'g':
+++ {
+++ alt14=3;
+++ }
+++ break;
+++ case 'c':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'o':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'm':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'p':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 'o':
+++ {
+++ alt14=3;
+++ }
+++ break;
+++ case 'i':
+++ {
+++ alt14=4;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 42;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 39;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 29;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 6;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'p':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'a':
+++ {
+++ alt14=3;
+++ }
+++ break;
+++ case 'l':
+++ {
+++ alt14=4;
+++ }
+++ break;
+++ case 'i':
+++ case 'o':
+++ {
+++ alt14=20;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 7;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'r':
+++ {
+++ alt14=4;
+++ }
+++ break;
+++ case 'y':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'e':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'a':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case 'r':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case 's':
+++ {
+++ alt14=19;
+++ }
+++ break;
+++
+++ default:
+++ alt14=4;}
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 40;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 's':
+++ {
+++ alt14=18;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 30;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 9;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'd':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'a':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 't':
+++ {
+++ alt14=6;
+++ }
+++ break;
+++ case 'y':
+++ {
+++ alt14=19;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 31;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 10;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'm':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'e':
+++ {
+++ alt14=6;
+++ }
+++ break;
+++ case 'o':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case 'n':
+++ {
+++ alt14=19;
+++ }
+++ break;
+++ case 'v':
+++ {
+++ alt14=20;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 33;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'u':
+++ {
+++ alt14=20;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 11;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case 'i':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case 'n':
+++ {
+++ alt14=7;
+++ }
+++ break;
+++ case 's':
+++ {
+++ alt14=8;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 12;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ }
+++ break;
+++ case '<':
+++ case '=':
+++ case '>':
+++ {
+++ alt14=9;
+++ }
+++ break;
+++ case 'b':
+++ {
+++ alt14=11;
+++ }
+++ break;
+++ case 'A':
+++ {
+++ alt14=13;
+++ }
+++ break;
+++ case 'O':
+++ case 'o':
+++ {
+++ alt14=14;
+++ }
+++ break;
+++ case 'N':
+++ case 'n':
+++ {
+++ alt14=15;
+++ }
+++ break;
+++ case '(':
+++ {
+++ alt14=16;
+++ }
+++ break;
+++ case ')':
+++ {
+++ alt14=17;
+++ }
+++ break;
+++ case '0':
+++ case '1':
+++ case '2':
+++ case '3':
+++ case '4':
+++ case '5':
+++ case '6':
+++ case '7':
+++ case '8':
+++ case '9':
+++ {
+++ switch ( LA(2) )
+++ {
+++ case '0':
+++ case '1':
+++ case '2':
+++ case '3':
+++ case '4':
+++ case '5':
+++ case '6':
+++ case '7':
+++ case '8':
+++ case '9':
+++ {
+++ switch ( LA(3) )
+++ {
+++ case '0':
+++ case '1':
+++ case '2':
+++ case '3':
+++ case '4':
+++ case '5':
+++ case '6':
+++ case '7':
+++ case '8':
+++ case '9':
+++ {
+++ switch ( LA(4) )
+++ {
+++ case '0':
+++ case '1':
+++ case '2':
+++ case '3':
+++ case '4':
+++ case '5':
+++ case '6':
+++ case '7':
+++ case '8':
+++ case '9':
+++ {
+++ switch ( LA(5) )
+++ {
+++ case '-':
+++ {
+++ alt14=18;
+++ }
+++ break;
+++
+++ default:
+++ alt14=22;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt14=22;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt14=22;}
+++
+++ }
+++ break;
+++
+++ default:
+++ alt14=22;}
+++
+++ }
+++ break;
+++ case 'l':
+++ {
+++ alt14=18;
+++ }
+++ break;
+++ case 'w':
+++ {
+++ alt14=19;
+++ }
+++ break;
+++ case 'f':
+++ case 's':
+++ case 'u':
+++ {
+++ alt14=20;
+++ }
+++ break;
+++ case '"':
+++ {
+++ alt14=21;
+++ }
+++ break;
+++ case '\t':
+++ case '\n':
+++ case '\f':
+++ case '\r':
+++ case ' ':
+++ {
+++ alt14=23;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 14;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruleTokensEx;
+++ }
+++
+++ switch (alt14)
+++ {
+++ case 1:
+++ // SMARTPL.g:1:10: T__30
+++ {
+++ /* 1:10: T__30 */
+++ mT__30(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:1:16: T__31
+++ {
+++ /* 1:16: T__31 */
+++ mT__31(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // SMARTPL.g:1:22: STRTAG
+++ {
+++ /* 1:22: STRTAG */
+++ mSTRTAG(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 4:
+++ // SMARTPL.g:1:29: INTTAG
+++ {
+++ /* 1:29: INTTAG */
+++ mINTTAG(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 5:
+++ // SMARTPL.g:1:36: DATETAG
+++ {
+++ /* 1:36: DATETAG */
+++ mDATETAG(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 6:
+++ // SMARTPL.g:1:44: ENUMTAG
+++ {
+++ /* 1:44: ENUMTAG */
+++ mENUMTAG(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 7:
+++ // SMARTPL.g:1:52: INCLUDES
+++ {
+++ /* 1:52: INCLUDES */
+++ mINCLUDES(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 8:
+++ // SMARTPL.g:1:61: IS
+++ {
+++ /* 1:61: IS */
+++ mIS(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 9:
+++ // SMARTPL.g:1:64: INTBOOL
+++ {
+++ /* 1:64: INTBOOL */
+++ mINTBOOL(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 10:
+++ // SMARTPL.g:1:72: AFTER
+++ {
+++ /* 1:72: AFTER */
+++ mAFTER(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 11:
+++ // SMARTPL.g:1:78: BEFORE
+++ {
+++ /* 1:78: BEFORE */
+++ mBEFORE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 12:
+++ // SMARTPL.g:1:85: AGO
+++ {
+++ /* 1:85: AGO */
+++ mAGO(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 13:
+++ // SMARTPL.g:1:89: AND
+++ {
+++ /* 1:89: AND */
+++ mAND(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 14:
+++ // SMARTPL.g:1:93: OR
+++ {
+++ /* 1:93: OR */
+++ mOR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 15:
+++ // SMARTPL.g:1:96: NOT
+++ {
+++ /* 1:96: NOT */
+++ mNOT(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 16:
+++ // SMARTPL.g:1:100: LPAR
+++ {
+++ /* 1:100: LPAR */
+++ mLPAR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 17:
+++ // SMARTPL.g:1:105: RPAR
+++ {
+++ /* 1:105: RPAR */
+++ mRPAR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 18:
+++ // SMARTPL.g:1:110: DATE
+++ {
+++ /* 1:110: DATE */
+++ mDATE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 19:
+++ // SMARTPL.g:1:115: DATINTERVAL
+++ {
+++ /* 1:115: DATINTERVAL */
+++ mDATINTERVAL(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 20:
+++ // SMARTPL.g:1:127: ENUMVAL
+++ {
+++ /* 1:127: ENUMVAL */
+++ mENUMVAL(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 21:
+++ // SMARTPL.g:1:135: STR
+++ {
+++ /* 1:135: STR */
+++ mSTR(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 22:
+++ // SMARTPL.g:1:139: INT
+++ {
+++ /* 1:139: INT */
+++ mINT(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++ case 23:
+++ // SMARTPL.g:1:143: WHITESPACE
+++ {
+++ /* 1:143: WHITESPACE */
+++ mWHITESPACE(ctx );
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleTokensEx;
+++ }
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++
+++
+++ goto ruleTokensEx; /* Prevent compiler warnings */
+++ruleTokensEx: ;
+++}
+++
+++/* =========================================================================
+++ * Lexer matching rules end.
+++ * =========================================================================
+++ */
+++/* End of Lexer code
+++ * ================================================
+++ * ================================================
+++ */
+++
+++
+++/* End of code
+++ * =============================================================================
+++ */
++diff --git a/src/pregen/SMARTPLLexer.h b/src/pregen/SMARTPLLexer.h
++new file mode 100644
++index 0000000..9d73721
++--- /dev/null
+++++ b/src/pregen/SMARTPLLexer.h
++@@ -0,0 +1,248 @@
+++/** \file
+++ * This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : SMARTPL.g
+++ * - On : 2015-06-27 19:05:15
+++ * - for the lexer : SMARTPLLexerLexer *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++ * The lexer SMARTPLLexer has the callable functions (rules) shown below,
+++ * which will invoke the code for the associated rule in the source grammar
+++ * assuming that the input stream is pointing to a token/text stream that could begin
+++ * this rule.
+++ *
+++ * For instance if you call the first (topmost) rule in a parser grammar, you will
+++ * get the results of a full parse, but calling a rule half way through the grammar will
+++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
+++ * in editors and so on.
+++ *
+++ * The parser entry points are called indirectly (by function pointer to function) via
+++ * a parser context typedef pSMARTPLLexer, which is returned from a call to SMARTPLLexerNew().
+++ *
+++ * As this is a generated lexer, it is unlikely you will call it 'manually'. However
+++ * the methods are provided anyway.
+++ * * The methods in pSMARTPLLexer are as follows:
+++ *
+++ * - void pSMARTPLLexer->T__30(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->T__31(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->STRTAG(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->INTTAG(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->DATETAG(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->ENUMTAG(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->INCLUDES(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->IS(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->INTBOOL(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->GREATER(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->GREATEREQUAL(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->LESS(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->LESSEQUAL(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->EQUAL(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->AFTER(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->BEFORE(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->AGO(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->AND(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->OR(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->NOT(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->LPAR(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->RPAR(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->DATE(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->DATINTERVAL(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->ENUMVAL(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->STR(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->INT(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->WHITESPACE(pSMARTPLLexer)
+++ * - void pSMARTPLLexer->Tokens(pSMARTPLLexer)
+++ *
+++ * The return type for any particular rule is of course determined by the source
+++ * grammar file.
+++ */
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++#ifndef _SMARTPLLexer_H
+++#define _SMARTPLLexer_H
+++/* =============================================================================
+++ * Standard antlr3 C runtime definitions
+++ */
+++#include <antlr3.h>
+++
+++/* End of standard antlr 3 runtime definitions
+++ * =============================================================================
+++ */
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++// Forward declare the context typedef so that we can use it before it is
+++// properly defined. Delegators and delegates (from import statements) are
+++// interdependent and their context structures contain pointers to each other
+++// C only allows such things to be declared if you pre-declare the typedef.
+++//
+++typedef struct SMARTPLLexer_Ctx_struct SMARTPLLexer, * pSMARTPLLexer;
+++
+++
+++
+++#ifdef ANTLR3_WINDOWS
+++// Disable: Unreferenced parameter, - Rules with parameters that are not used
+++// constant conditional, - ANTLR realizes that a prediction is always true (synpred usually)
+++// initialized but unused variable - tree rewrite variables declared but not needed
+++// Unreferenced local variable - lexer rule declares but does not always use _type
+++// potentially unitialized variable used - retval always returned from a rule
+++// unreferenced local function has been removed - susually getTokenNames or freeScope, they can go without warnigns
+++//
+++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
+++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
+++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
+++// this is a matter of orthogonality hence I disable that one.
+++//
+++#pragma warning( disable : 4100 )
+++#pragma warning( disable : 4101 )
+++#pragma warning( disable : 4127 )
+++#pragma warning( disable : 4189 )
+++#pragma warning( disable : 4505 )
+++#pragma warning( disable : 4701 )
+++#endif
+++
+++/** Context tracking structure for SMARTPLLexer
+++ */
+++struct SMARTPLLexer_Ctx_struct
+++{
+++ /** Built in ANTLR3 context tracker contains all the generic elements
+++ * required for context tracking.
+++ */
+++ pANTLR3_LEXER pLexer;
+++
+++
+++ void (*mT__30) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mT__31) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mSTRTAG) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mINTTAG) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mDATETAG) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mENUMTAG) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mINCLUDES) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mIS) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mINTBOOL) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mGREATER) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mGREATEREQUAL) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mLESS) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mLESSEQUAL) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mEQUAL) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mAFTER) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mBEFORE) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mAGO) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mAND) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mOR) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mNOT) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mLPAR) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mRPAR) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mDATE) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mDATINTERVAL) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mENUMVAL) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mSTR) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mINT) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mWHITESPACE) (struct SMARTPLLexer_Ctx_struct * ctx);
+++ void (*mTokens) (struct SMARTPLLexer_Ctx_struct * ctx); const char * (*getGrammarFileName)();
+++ void (*free) (struct SMARTPLLexer_Ctx_struct * ctx);
+++
+++};
+++
+++// Function protoypes for the constructor functions that external translation units
+++// such as delegators and delegates may wish to call.
+++//
+++ANTLR3_API pSMARTPLLexer SMARTPLLexerNew (pANTLR3_INPUT_STREAM instream);
+++ANTLR3_API pSMARTPLLexer SMARTPLLexerNewSSD (pANTLR3_INPUT_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
+++
+++/** Symbolic definitions of all the tokens that the lexer will work with.
+++ * \{
+++ *
+++ * Antlr will define EOF, but we can't use that as it it is too common in
+++ * in C header files and that would be confusing. There is no way to filter this out at the moment
+++ * so we just undef it here for now. That isn't the value we get back from C recognizers
+++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
+++ */
+++#ifdef EOF
+++#undef EOF
+++#endif
+++#ifdef Tokens
+++#undef Tokens
+++#endif
+++#define INTBOOL 14
+++#define STRTAG 10
+++#define AGO 22
+++#define WHITESPACE 29
+++#define GREATEREQUAL 25
+++#define BEFORE 18
+++#define DATETAG 16
+++#define INT 15
+++#define NOT 7
+++#define AFTER 17
+++#define AND 6
+++#define EOF -1
+++#define INCLUDES 11
+++#define STR 4
+++#define T__30 30
+++#define T__31 31
+++#define GREATER 24
+++#define LPAR 8
+++#define ENUMTAG 19
+++#define IS 12
+++#define ENUMVAL 20
+++#define EQUAL 28
+++#define OR 5
+++#define LESS 26
+++#define RPAR 9
+++#define DATE 21
+++#define LESSEQUAL 27
+++#define INTTAG 13
+++#define DATINTERVAL 23
+++#ifdef EOF
+++#undef EOF
+++#define EOF ANTLR3_TOKEN_EOF
+++#endif
+++
+++#ifndef TOKENSOURCE
+++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
+++#endif
+++
+++/* End of token definitions for SMARTPLLexer
+++ * =============================================================================
+++ */
+++/** \} */
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif
+++
+++/* END - Note:Keep extra line feed to satisfy UNIX systems */
++diff --git a/src/pregen/SMARTPLParser.c b/src/pregen/SMARTPLParser.c
++new file mode 100644
++index 0000000..afe9f99
++--- /dev/null
+++++ b/src/pregen/SMARTPLParser.c
++@@ -0,0 +1,1812 @@
+++/** \file
+++ * This C source file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : SMARTPL.g
+++ * - On : 2015-06-27 19:05:15
+++ * - for the parser : SMARTPLParserParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++*/
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++/* -----------------------------------------
+++ * Include the ANTLR3 generated header file.
+++ */
+++#include "SMARTPLParser.h"
+++/* ----------------------------------------- */
+++
+++
+++
+++
+++
+++/* MACROS that hide the C interface implementations from the
+++ * generated code, which makes it a little more understandable to the human eye.
+++ * I am very much against using C pre-processor macros for function calls and bits
+++ * of code as you cannot see what is happening when single stepping in debuggers
+++ * and so on. The exception (in my book at least) is for generated code, where you are
+++ * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
+++ * hides some indirect calls, but is always referring to the input stream. This is
+++ * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
+++ * the runtime interfaces without changing the generated code too often, without
+++ * confusing the reader of the generated output, who may not wish to know the gory
+++ * details of the interface inheritance.
+++ */
+++
+++#define CTX ctx
+++
+++/* Aids in accessing scopes for grammar programmers
+++ */
+++#undef SCOPE_TYPE
+++#undef SCOPE_STACK
+++#undef SCOPE_TOP
+++#define SCOPE_TYPE(scope) pSMARTPLParser_##scope##_SCOPE
+++#define SCOPE_STACK(scope) pSMARTPLParser_##scope##Stack
+++#define SCOPE_TOP(scope) ctx->pSMARTPLParser_##scope##Top
+++#define SCOPE_SIZE(scope) ctx->pSMARTPLParser_##scope##Stack_limit
+++#define SCOPE_INSTANCE(scope, i) (ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))
+++
+++/* Macros for accessing things in the parser
+++ */
+++
+++#undef PARSER
+++#undef RECOGNIZER
+++#undef HAVEPARSEDRULE
+++#undef MEMOIZE
+++#undef INPUT
+++#undef STRSTREAM
+++#undef HASEXCEPTION
+++#undef EXCEPTION
+++#undef MATCHT
+++#undef MATCHANYT
+++#undef FOLLOWSTACK
+++#undef FOLLOWPUSH
+++#undef FOLLOWPOP
+++#undef PRECOVER
+++#undef PREPORTERROR
+++#undef LA
+++#undef LT
+++#undef CONSTRUCTEX
+++#undef CONSUME
+++#undef MARK
+++#undef REWIND
+++#undef REWINDLAST
+++#undef PERRORRECOVERY
+++#undef HASFAILED
+++#undef FAILEDFLAG
+++#undef RECOVERFROMMISMATCHEDSET
+++#undef RECOVERFROMMISMATCHEDELEMENT
+++#undef INDEX
+++#undef ADAPTOR
+++#undef SEEK
+++#undef RULEMEMO
+++#undef DBG
+++
+++#define PARSER ctx->pParser
+++#define RECOGNIZER PARSER->rec
+++#define PSRSTATE RECOGNIZER->state
+++#define HAVEPARSEDRULE(r) RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
+++#define MEMOIZE(ri,si) RECOGNIZER->memoize(RECOGNIZER, ri, si)
+++#define INPUT PARSER->tstream
+++#define STRSTREAM INPUT
+++#define ISTREAM INPUT->istream
+++#define INDEX() ISTREAM->index(INPUT->istream)
+++#define HASEXCEPTION() (PSRSTATE->error == ANTLR3_TRUE)
+++#define EXCEPTION PSRSTATE->exception
+++#define MATCHT(t, fs) RECOGNIZER->match(RECOGNIZER, t, fs)
+++#define MATCHANYT() RECOGNIZER->matchAny(RECOGNIZER)
+++#define FOLLOWSTACK PSRSTATE->following
+++#define FOLLOWPUSH(x) FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
+++#define FOLLOWPOP() FOLLOWSTACK->pop(FOLLOWSTACK)
+++#define PRECOVER() RECOGNIZER->recover(RECOGNIZER)
+++#define PREPORTERROR() RECOGNIZER->reportError(RECOGNIZER)
+++#define LA(n) INPUT->istream->_LA(ISTREAM, n)
+++#define LT(n) INPUT->_LT(INPUT, n)
+++#define CONSTRUCTEX() RECOGNIZER->exConstruct(RECOGNIZER)
+++#define CONSUME() ISTREAM->consume(ISTREAM)
+++#define MARK() ISTREAM->mark(ISTREAM)
+++#define REWIND(m) ISTREAM->rewind(ISTREAM, m)
+++#define REWINDLAST() ISTREAM->rewindLast(ISTREAM)
+++#define SEEK(n) ISTREAM->seek(ISTREAM, n)
+++#define PERRORRECOVERY PSRSTATE->errorRecovery
+++#define FAILEDFLAG PSRSTATE->failed
+++#define HASFAILED() (FAILEDFLAG == ANTLR3_TRUE)
+++#define BACKTRACKING PSRSTATE->backtracking
+++#define RECOVERFROMMISMATCHEDSET(s) RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
+++#define RECOVERFROMMISMATCHEDELEMENT(e) RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
+++#define ADAPTOR ctx->adaptor
+++#define RULEMEMO PSRSTATE->ruleMemo
+++#define DBG RECOGNIZER->debugger
+++
+++#define TOKTEXT(tok, txt) tok, (pANTLR3_UINT8)txt
+++
+++/* The 4 tokens defined below may well clash with your own #defines or token types. If so
+++ * then for the present you must use different names for your defines as these are hard coded
+++ * in the code generator. It would be better not to use such names internally, and maybe
+++ * we can change this in a forthcoming release. I deliberately do not #undef these
+++ * here as this will at least give you a redefined error somewhere if they clash.
+++ */
+++#define UP ANTLR3_TOKEN_UP
+++#define DOWN ANTLR3_TOKEN_DOWN
+++#define EOR ANTLR3_TOKEN_EOR
+++#define INVALID ANTLR3_TOKEN_INVALID
+++
+++
+++/* =============================================================================
+++ * Functions to create and destroy scopes. First come the rule scopes, followed
+++ * by the global declared scopes.
+++ */
+++
+++
+++
+++/* ============================================================================= */
+++
+++/* =============================================================================
+++ * Start of recognizer
+++ */
+++
+++
+++
+++/** \brief Table of all token names in symbolic order, mainly used for
+++ * error reporting.
+++ */
+++pANTLR3_UINT8 SMARTPLParserTokenNames[28+4]
+++ = {
+++ (pANTLR3_UINT8) "<invalid>", /* String to print to indicate an invalid token */
+++ (pANTLR3_UINT8) "<EOR>",
+++ (pANTLR3_UINT8) "<DOWN>",
+++ (pANTLR3_UINT8) "<UP>",
+++ (pANTLR3_UINT8) "STR",
+++ (pANTLR3_UINT8) "OR",
+++ (pANTLR3_UINT8) "AND",
+++ (pANTLR3_UINT8) "NOT",
+++ (pANTLR3_UINT8) "LPAR",
+++ (pANTLR3_UINT8) "RPAR",
+++ (pANTLR3_UINT8) "STRTAG",
+++ (pANTLR3_UINT8) "INCLUDES",
+++ (pANTLR3_UINT8) "IS",
+++ (pANTLR3_UINT8) "INTTAG",
+++ (pANTLR3_UINT8) "INTBOOL",
+++ (pANTLR3_UINT8) "INT",
+++ (pANTLR3_UINT8) "DATETAG",
+++ (pANTLR3_UINT8) "AFTER",
+++ (pANTLR3_UINT8) "BEFORE",
+++ (pANTLR3_UINT8) "ENUMTAG",
+++ (pANTLR3_UINT8) "ENUMVAL",
+++ (pANTLR3_UINT8) "DATE",
+++ (pANTLR3_UINT8) "AGO",
+++ (pANTLR3_UINT8) "DATINTERVAL",
+++ (pANTLR3_UINT8) "GREATER",
+++ (pANTLR3_UINT8) "GREATEREQUAL",
+++ (pANTLR3_UINT8) "LESS",
+++ (pANTLR3_UINT8) "LESSEQUAL",
+++ (pANTLR3_UINT8) "EQUAL",
+++ (pANTLR3_UINT8) "WHITESPACE",
+++ (pANTLR3_UINT8) "'{'",
+++ (pANTLR3_UINT8) "'}'"
+++ };
+++
+++
+++
+++// Forward declare the locally static matching functions we have generated.
+++//
+++static SMARTPLParser_playlist_return playlist (pSMARTPLParser ctx);
+++static SMARTPLParser_expression_return expression (pSMARTPLParser ctx);
+++static SMARTPLParser_aexpr_return aexpr (pSMARTPLParser ctx);
+++static SMARTPLParser_nexpr_return nexpr (pSMARTPLParser ctx);
+++static SMARTPLParser_crit_return crit (pSMARTPLParser ctx);
+++static SMARTPLParser_dateval_return dateval (pSMARTPLParser ctx);
+++static SMARTPLParser_interval_return interval (pSMARTPLParser ctx);
+++static void SMARTPLParserFree(pSMARTPLParser ctx);
+++/* For use in tree output where we are accumulating rule labels via label += ruleRef
+++ * we need a function that knows how to free a return scope when the list is destroyed.
+++ * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
+++ */
+++static void ANTLR3_CDECL freeScope(void * scope)
+++{
+++ ANTLR3_FREE(scope);
+++}
+++
+++/** \brief Name of the grammar file that generated this code
+++ */
+++static const char fileName[] = "SMARTPL.g";
+++
+++/** \brief Return the name of the grammar file that generated this code.
+++ */
+++static const char * getGrammarFileName()
+++{
+++ return fileName;
+++}
+++/** \brief Create a new SMARTPLParser parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pSMARTPLParser
+++SMARTPLParserNew (pANTLR3_COMMON_TOKEN_STREAM instream)
+++{
+++ // See if we can create a new parser with the standard constructor
+++ //
+++ return SMARTPLParserNewSSD(instream, NULL);
+++}
+++
+++/** \brief Create a new SMARTPLParser parser and return a context for it.
+++ *
+++ * \param[in] instream Pointer to an input stream interface.
+++ *
+++ * \return Pointer to new parser context upon success.
+++ */
+++ANTLR3_API pSMARTPLParser
+++SMARTPLParserNewSSD (pANTLR3_COMMON_TOKEN_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
+++{
+++ pSMARTPLParser ctx; /* Context structure we will build and return */
+++
+++ ctx = (pSMARTPLParser) ANTLR3_CALLOC(1, sizeof(SMARTPLParser));
+++
+++ if (ctx == NULL)
+++ {
+++ // Failed to allocate memory for parser context
+++ //
+++ return NULL;
+++ }
+++
+++ /* -------------------------------------------------------------------
+++ * Memory for basic structure is allocated, now to fill in
+++ * the base ANTLR3 structures. We initialize the function pointers
+++ * for the standard ANTLR3 parser function set, but upon return
+++ * from here, the programmer may set the pointers to provide custom
+++ * implementations of each function.
+++ *
+++ * We don't use the macros defined in SMARTPLParser.h here, in order that you can get a sense
+++ * of what goes where.
+++ */
+++
+++ /* Create a base parser/recognizer, using the supplied token stream
+++ */
+++ ctx->pParser = antlr3ParserNewStream(ANTLR3_SIZE_HINT, instream->tstream, state);
+++ /* Install the implementation of our SMARTPLParser interface
+++ */
+++ ctx->playlist = playlist;
+++ ctx->expression = expression;
+++ ctx->aexpr = aexpr;
+++ ctx->nexpr = nexpr;
+++ ctx->crit = crit;
+++ ctx->dateval = dateval;
+++ ctx->interval = interval;
+++ ctx->free = SMARTPLParserFree;
+++ ctx->getGrammarFileName = getGrammarFileName;
+++
+++ /* Install the scope pushing methods.
+++ */
+++ ADAPTOR = ANTLR3_TREE_ADAPTORNew(instream->tstream->tokenSource->strFactory);
+++ ctx->vectors = antlr3VectorFactoryNew(0);
+++
+++
+++
+++ /* Install the token table
+++ */
+++ PSRSTATE->tokenNames = SMARTPLParserTokenNames;
+++
+++
+++ /* Return the newly built parser to the caller
+++ */
+++ return ctx;
+++}
+++
+++/** Free the parser resources
+++ */
+++ static void
+++ SMARTPLParserFree(pSMARTPLParser ctx)
+++ {
+++ /* Free any scope memory
+++ */
+++
+++ ctx->vectors->close(ctx->vectors);
+++ /* We created the adaptor so we must free it
+++ */
+++ ADAPTOR->free(ADAPTOR);
+++ // Free this parser
+++ //
+++ ctx->pParser->free(ctx->pParser);
+++ ANTLR3_FREE(ctx);
+++
+++ /* Everything is released, so we can return
+++ */
+++ return;
+++ }
+++
+++/** Return token names used by this parser
+++ *
+++ * The returned pointer is used as an index into the token names table (using the token
+++ * number as the index).
+++ *
+++ * \return Pointer to first char * in the table.
+++ */
+++static pANTLR3_UINT8 *getTokenNames()
+++{
+++ return SMARTPLParserTokenNames;
+++}
+++
+++
+++/* Declare the bitsets
+++ */
+++
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_playlist42 */
+++static ANTLR3_BITWORD FOLLOW_STR_in_playlist42_bits[] = { ANTLR3_UINT64_LIT(0x0000000040000000) };
+++static ANTLR3_BITSET_LIST FOLLOW_STR_in_playlist42 = { FOLLOW_STR_in_playlist42_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_30_in_playlist44 */
+++static ANTLR3_BITWORD FOLLOW_30_in_playlist44_bits[] = { ANTLR3_UINT64_LIT(0x0000000000092580) };
+++static ANTLR3_BITSET_LIST FOLLOW_30_in_playlist44 = { FOLLOW_30_in_playlist44_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_playlist46 */
+++static ANTLR3_BITWORD FOLLOW_expression_in_playlist46_bits[] = { ANTLR3_UINT64_LIT(0x0000000080000000) };
+++static ANTLR3_BITSET_LIST FOLLOW_expression_in_playlist46 = { FOLLOW_expression_in_playlist46_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_31_in_playlist48 */
+++static ANTLR3_BITWORD FOLLOW_31_in_playlist48_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000000) };
+++static ANTLR3_BITSET_LIST FOLLOW_31_in_playlist48 = { FOLLOW_31_in_playlist48_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_EOF_in_playlist50 */
+++static ANTLR3_BITWORD FOLLOW_EOF_in_playlist50_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_EOF_in_playlist50 = { FOLLOW_EOF_in_playlist50_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_aexpr_in_expression62 */
+++static ANTLR3_BITWORD FOLLOW_aexpr_in_expression62_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000022) };
+++static ANTLR3_BITSET_LIST FOLLOW_aexpr_in_expression62 = { FOLLOW_aexpr_in_expression62_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_OR_in_expression65 */
+++static ANTLR3_BITWORD FOLLOW_OR_in_expression65_bits[] = { ANTLR3_UINT64_LIT(0x0000000000092580) };
+++static ANTLR3_BITSET_LIST FOLLOW_OR_in_expression65 = { FOLLOW_OR_in_expression65_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_aexpr_in_expression68 */
+++static ANTLR3_BITWORD FOLLOW_aexpr_in_expression68_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000022) };
+++static ANTLR3_BITSET_LIST FOLLOW_aexpr_in_expression68 = { FOLLOW_aexpr_in_expression68_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_nexpr_in_aexpr83 */
+++static ANTLR3_BITWORD FOLLOW_nexpr_in_aexpr83_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000042) };
+++static ANTLR3_BITSET_LIST FOLLOW_nexpr_in_aexpr83 = { FOLLOW_nexpr_in_aexpr83_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AND_in_aexpr86 */
+++static ANTLR3_BITWORD FOLLOW_AND_in_aexpr86_bits[] = { ANTLR3_UINT64_LIT(0x0000000000092580) };
+++static ANTLR3_BITSET_LIST FOLLOW_AND_in_aexpr86 = { FOLLOW_AND_in_aexpr86_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_nexpr_in_aexpr89 */
+++static ANTLR3_BITWORD FOLLOW_nexpr_in_aexpr89_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000042) };
+++static ANTLR3_BITSET_LIST FOLLOW_nexpr_in_aexpr89 = { FOLLOW_nexpr_in_aexpr89_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_NOT_in_nexpr104 */
+++static ANTLR3_BITWORD FOLLOW_NOT_in_nexpr104_bits[] = { ANTLR3_UINT64_LIT(0x0000000000092580) };
+++static ANTLR3_BITSET_LIST FOLLOW_NOT_in_nexpr104 = { FOLLOW_NOT_in_nexpr104_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_crit_in_nexpr107 */
+++static ANTLR3_BITWORD FOLLOW_crit_in_nexpr107_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_crit_in_nexpr107 = { FOLLOW_crit_in_nexpr107_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_crit_in_nexpr114 */
+++static ANTLR3_BITWORD FOLLOW_crit_in_nexpr114_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_crit_in_nexpr114 = { FOLLOW_crit_in_nexpr114_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAR_in_crit127 */
+++static ANTLR3_BITWORD FOLLOW_LPAR_in_crit127_bits[] = { ANTLR3_UINT64_LIT(0x0000000000092580) };
+++static ANTLR3_BITSET_LIST FOLLOW_LPAR_in_crit127 = { FOLLOW_LPAR_in_crit127_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_crit129 */
+++static ANTLR3_BITWORD FOLLOW_expression_in_crit129_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000200) };
+++static ANTLR3_BITSET_LIST FOLLOW_expression_in_crit129 = { FOLLOW_expression_in_crit129_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAR_in_crit131 */
+++static ANTLR3_BITWORD FOLLOW_RPAR_in_crit131_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_RPAR_in_crit131 = { FOLLOW_RPAR_in_crit131_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STRTAG_in_crit142 */
+++static ANTLR3_BITWORD FOLLOW_STRTAG_in_crit142_bits[] = { ANTLR3_UINT64_LIT(0x0000000000001800) };
+++static ANTLR3_BITSET_LIST FOLLOW_STRTAG_in_crit142 = { FOLLOW_STRTAG_in_crit142_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_crit144 */
+++static ANTLR3_BITWORD FOLLOW_set_in_crit144_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000010) };
+++static ANTLR3_BITSET_LIST FOLLOW_set_in_crit144 = { FOLLOW_set_in_crit144_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_STR_in_crit150 */
+++static ANTLR3_BITWORD FOLLOW_STR_in_crit150_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_STR_in_crit150 = { FOLLOW_STR_in_crit150_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INTTAG_in_crit157 */
+++static ANTLR3_BITWORD FOLLOW_INTTAG_in_crit157_bits[] = { ANTLR3_UINT64_LIT(0x0000000000004000) };
+++static ANTLR3_BITSET_LIST FOLLOW_INTTAG_in_crit157 = { FOLLOW_INTTAG_in_crit157_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INTBOOL_in_crit159 */
+++static ANTLR3_BITWORD FOLLOW_INTBOOL_in_crit159_bits[] = { ANTLR3_UINT64_LIT(0x0000000000008000) };
+++static ANTLR3_BITSET_LIST FOLLOW_INTBOOL_in_crit159 = { FOLLOW_INTBOOL_in_crit159_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_crit161 */
+++static ANTLR3_BITWORD FOLLOW_INT_in_crit161_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_INT_in_crit161 = { FOLLOW_INT_in_crit161_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATETAG_in_crit168 */
+++static ANTLR3_BITWORD FOLLOW_DATETAG_in_crit168_bits[] = { ANTLR3_UINT64_LIT(0x0000000000060000) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATETAG_in_crit168 = { FOLLOW_DATETAG_in_crit168_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_crit170 */
+++static ANTLR3_BITWORD FOLLOW_set_in_crit170_bits[] = { ANTLR3_UINT64_LIT(0x0000000000208000) };
+++static ANTLR3_BITSET_LIST FOLLOW_set_in_crit170 = { FOLLOW_set_in_crit170_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_dateval_in_crit176 */
+++static ANTLR3_BITWORD FOLLOW_dateval_in_crit176_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_dateval_in_crit176 = { FOLLOW_dateval_in_crit176_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_ENUMTAG_in_crit183 */
+++static ANTLR3_BITWORD FOLLOW_ENUMTAG_in_crit183_bits[] = { ANTLR3_UINT64_LIT(0x0000000000001000) };
+++static ANTLR3_BITSET_LIST FOLLOW_ENUMTAG_in_crit183 = { FOLLOW_ENUMTAG_in_crit183_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_IS_in_crit185 */
+++static ANTLR3_BITWORD FOLLOW_IS_in_crit185_bits[] = { ANTLR3_UINT64_LIT(0x0000000000100000) };
+++static ANTLR3_BITSET_LIST FOLLOW_IS_in_crit185 = { FOLLOW_IS_in_crit185_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_ENUMVAL_in_crit187 */
+++static ANTLR3_BITWORD FOLLOW_ENUMVAL_in_crit187_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_ENUMVAL_in_crit187 = { FOLLOW_ENUMVAL_in_crit187_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATE_in_dateval200 */
+++static ANTLR3_BITWORD FOLLOW_DATE_in_dateval200_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATE_in_dateval200 = { FOLLOW_DATE_in_dateval200_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_interval_in_dateval207 */
+++static ANTLR3_BITWORD FOLLOW_interval_in_dateval207_bits[] = { ANTLR3_UINT64_LIT(0x0000000000040000) };
+++static ANTLR3_BITSET_LIST FOLLOW_interval_in_dateval207 = { FOLLOW_interval_in_dateval207_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_BEFORE_in_dateval209 */
+++static ANTLR3_BITWORD FOLLOW_BEFORE_in_dateval209_bits[] = { ANTLR3_UINT64_LIT(0x0000000000200000) };
+++static ANTLR3_BITSET_LIST FOLLOW_BEFORE_in_dateval209 = { FOLLOW_BEFORE_in_dateval209_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATE_in_dateval211 */
+++static ANTLR3_BITWORD FOLLOW_DATE_in_dateval211_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATE_in_dateval211 = { FOLLOW_DATE_in_dateval211_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_interval_in_dateval218 */
+++static ANTLR3_BITWORD FOLLOW_interval_in_dateval218_bits[] = { ANTLR3_UINT64_LIT(0x0000000000020000) };
+++static ANTLR3_BITSET_LIST FOLLOW_interval_in_dateval218 = { FOLLOW_interval_in_dateval218_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AFTER_in_dateval220 */
+++static ANTLR3_BITWORD FOLLOW_AFTER_in_dateval220_bits[] = { ANTLR3_UINT64_LIT(0x0000000000200000) };
+++static ANTLR3_BITSET_LIST FOLLOW_AFTER_in_dateval220 = { FOLLOW_AFTER_in_dateval220_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATE_in_dateval222 */
+++static ANTLR3_BITWORD FOLLOW_DATE_in_dateval222_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATE_in_dateval222 = { FOLLOW_DATE_in_dateval222_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_interval_in_dateval229 */
+++static ANTLR3_BITWORD FOLLOW_interval_in_dateval229_bits[] = { ANTLR3_UINT64_LIT(0x0000000000400000) };
+++static ANTLR3_BITSET_LIST FOLLOW_interval_in_dateval229 = { FOLLOW_interval_in_dateval229_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_AGO_in_dateval231 */
+++static ANTLR3_BITWORD FOLLOW_AGO_in_dateval231_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_AGO_in_dateval231 = { FOLLOW_AGO_in_dateval231_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_INT_in_interval243 */
+++static ANTLR3_BITWORD FOLLOW_INT_in_interval243_bits[] = { ANTLR3_UINT64_LIT(0x0000000000800000) };
+++static ANTLR3_BITSET_LIST FOLLOW_INT_in_interval243 = { FOLLOW_INT_in_interval243_bits, 1 };
+++/** Bitset defining follow set for error recovery in rule state: FOLLOW_DATINTERVAL_in_interval245 */
+++static ANTLR3_BITWORD FOLLOW_DATINTERVAL_in_interval245_bits[] = { ANTLR3_UINT64_LIT(0x0000000000000002) };
+++static ANTLR3_BITSET_LIST FOLLOW_DATINTERVAL_in_interval245 = { FOLLOW_DATINTERVAL_in_interval245_bits, 1 };
+++
+++
+++
+++
+++/* ==============================================
+++ * Parsing rules
+++ */
+++/**
+++ * $ANTLR start playlist
+++ * SMARTPL.g:27:1: playlist : STR '{' expression '}' EOF ;
+++ */
+++static SMARTPLParser_playlist_return
+++playlist(pSMARTPLParser ctx)
+++{
+++ SMARTPLParser_playlist_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN STR1;
+++ pANTLR3_COMMON_TOKEN char_literal2;
+++ pANTLR3_COMMON_TOKEN char_literal4;
+++ pANTLR3_COMMON_TOKEN EOF5;
+++ SMARTPLParser_expression_return expression3;
+++ #undef RETURN_TYPE_expression3
+++ #define RETURN_TYPE_expression3 SMARTPLParser_expression_return
+++
+++ pANTLR3_BASE_TREE STR1_tree;
+++ pANTLR3_BASE_TREE char_literal2_tree;
+++ pANTLR3_BASE_TREE char_literal4_tree;
+++ pANTLR3_BASE_TREE EOF5_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ STR1 = NULL;
+++ char_literal2 = NULL;
+++ char_literal4 = NULL;
+++ EOF5 = NULL;
+++ expression3.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ STR1_tree = NULL;
+++ char_literal2_tree = NULL;
+++ char_literal4_tree = NULL;
+++ EOF5_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // SMARTPL.g:27:10: ( STR '{' expression '}' EOF )
+++ // SMARTPL.g:27:12: STR '{' expression '}' EOF
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ STR1 = (pANTLR3_COMMON_TOKEN) MATCHT(STR, &FOLLOW_STR_in_playlist42);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleplaylistEx;
+++ }
+++
+++ STR1_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, STR1));
+++ ADAPTOR->addChild(ADAPTOR, root_0, STR1_tree);
+++
+++ char_literal2 = (pANTLR3_COMMON_TOKEN) MATCHT(30, &FOLLOW_30_in_playlist44);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleplaylistEx;
+++ }
+++
+++ char_literal2_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, char_literal2));
+++ ADAPTOR->addChild(ADAPTOR, root_0, char_literal2_tree);
+++
+++ FOLLOWPUSH(FOLLOW_expression_in_playlist46);
+++ expression3=expression(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleplaylistEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, expression3.tree);
+++ char_literal4 = (pANTLR3_COMMON_TOKEN) MATCHT(31, &FOLLOW_31_in_playlist48);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleplaylistEx;
+++ }
+++
+++ char_literal4_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, char_literal4));
+++ ADAPTOR->addChild(ADAPTOR, root_0, char_literal4_tree);
+++
+++ EOF5 = (pANTLR3_COMMON_TOKEN) MATCHT(EOF, &FOLLOW_EOF_in_playlist50);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleplaylistEx;
+++ }
+++
+++ EOF5_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, EOF5));
+++ ADAPTOR->addChild(ADAPTOR, root_0, EOF5_tree);
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleplaylistEx; /* Prevent compiler warnings */
+++ ruleplaylistEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end playlist */
+++
+++/**
+++ * $ANTLR start expression
+++ * SMARTPL.g:30:1: expression : aexpr ( OR aexpr )* ;
+++ */
+++static SMARTPLParser_expression_return
+++expression(pSMARTPLParser ctx)
+++{
+++ SMARTPLParser_expression_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN OR7;
+++ SMARTPLParser_aexpr_return aexpr6;
+++ #undef RETURN_TYPE_aexpr6
+++ #define RETURN_TYPE_aexpr6 SMARTPLParser_aexpr_return
+++
+++ SMARTPLParser_aexpr_return aexpr8;
+++ #undef RETURN_TYPE_aexpr8
+++ #define RETURN_TYPE_aexpr8 SMARTPLParser_aexpr_return
+++
+++ pANTLR3_BASE_TREE OR7_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ OR7 = NULL;
+++ aexpr6.tree = NULL;
+++
+++ aexpr8.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ OR7_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // SMARTPL.g:30:12: ( aexpr ( OR aexpr )* )
+++ // SMARTPL.g:30:14: aexpr ( OR aexpr )*
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_aexpr_in_expression62);
+++ aexpr6=aexpr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, aexpr6.tree);
+++
+++ // SMARTPL.g:30:20: ( OR aexpr )*
+++
+++ for (;;)
+++ {
+++ int alt1=2;
+++ switch ( LA(1) )
+++ {
+++ case OR:
+++ {
+++ alt1=1;
+++ }
+++ break;
+++
+++ }
+++
+++ switch (alt1)
+++ {
+++ case 1:
+++ // SMARTPL.g:30:21: OR aexpr
+++ {
+++ OR7 = (pANTLR3_COMMON_TOKEN) MATCHT(OR, &FOLLOW_OR_in_expression65);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ OR7_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, OR7));
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, OR7_tree, root_0));
+++
+++ FOLLOWPUSH(FOLLOW_aexpr_in_expression68);
+++ aexpr8=aexpr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleexpressionEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, aexpr8.tree);
+++
+++ }
+++ break;
+++
+++ default:
+++ goto loop1; /* break out of the loop */
+++ break;
+++ }
+++ }
+++ loop1: ; /* Jump out to here if this rule does not match */
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleexpressionEx; /* Prevent compiler warnings */
+++ ruleexpressionEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end expression */
+++
+++/**
+++ * $ANTLR start aexpr
+++ * SMARTPL.g:33:1: aexpr : nexpr ( AND nexpr )* ;
+++ */
+++static SMARTPLParser_aexpr_return
+++aexpr(pSMARTPLParser ctx)
+++{
+++ SMARTPLParser_aexpr_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN AND10;
+++ SMARTPLParser_nexpr_return nexpr9;
+++ #undef RETURN_TYPE_nexpr9
+++ #define RETURN_TYPE_nexpr9 SMARTPLParser_nexpr_return
+++
+++ SMARTPLParser_nexpr_return nexpr11;
+++ #undef RETURN_TYPE_nexpr11
+++ #define RETURN_TYPE_nexpr11 SMARTPLParser_nexpr_return
+++
+++ pANTLR3_BASE_TREE AND10_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ AND10 = NULL;
+++ nexpr9.tree = NULL;
+++
+++ nexpr11.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ AND10_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // SMARTPL.g:33:8: ( nexpr ( AND nexpr )* )
+++ // SMARTPL.g:33:10: nexpr ( AND nexpr )*
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_nexpr_in_aexpr83);
+++ nexpr9=nexpr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleaexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, nexpr9.tree);
+++
+++ // SMARTPL.g:33:16: ( AND nexpr )*
+++
+++ for (;;)
+++ {
+++ int alt2=2;
+++ switch ( LA(1) )
+++ {
+++ case AND:
+++ {
+++ alt2=1;
+++ }
+++ break;
+++
+++ }
+++
+++ switch (alt2)
+++ {
+++ case 1:
+++ // SMARTPL.g:33:17: AND nexpr
+++ {
+++ AND10 = (pANTLR3_COMMON_TOKEN) MATCHT(AND, &FOLLOW_AND_in_aexpr86);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleaexprEx;
+++ }
+++
+++ AND10_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, AND10));
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, AND10_tree, root_0));
+++
+++ FOLLOWPUSH(FOLLOW_nexpr_in_aexpr89);
+++ nexpr11=nexpr(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleaexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, nexpr11.tree);
+++
+++ }
+++ break;
+++
+++ default:
+++ goto loop2; /* break out of the loop */
+++ break;
+++ }
+++ }
+++ loop2: ; /* Jump out to here if this rule does not match */
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleaexprEx; /* Prevent compiler warnings */
+++ ruleaexprEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end aexpr */
+++
+++/**
+++ * $ANTLR start nexpr
+++ * SMARTPL.g:36:1: nexpr : ( NOT crit | crit );
+++ */
+++static SMARTPLParser_nexpr_return
+++nexpr(pSMARTPLParser ctx)
+++{
+++ SMARTPLParser_nexpr_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN NOT12;
+++ SMARTPLParser_crit_return crit13;
+++ #undef RETURN_TYPE_crit13
+++ #define RETURN_TYPE_crit13 SMARTPLParser_crit_return
+++
+++ SMARTPLParser_crit_return crit14;
+++ #undef RETURN_TYPE_crit14
+++ #define RETURN_TYPE_crit14 SMARTPLParser_crit_return
+++
+++ pANTLR3_BASE_TREE NOT12_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ NOT12 = NULL;
+++ crit13.tree = NULL;
+++
+++ crit14.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ NOT12_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ {
+++ // SMARTPL.g:36:8: ( NOT crit | crit )
+++
+++ ANTLR3_UINT32 alt3;
+++
+++ alt3=2;
+++
+++ switch ( LA(1) )
+++ {
+++ case NOT:
+++ {
+++ alt3=1;
+++ }
+++ break;
+++ case LPAR:
+++ case STRTAG:
+++ case INTTAG:
+++ case DATETAG:
+++ case ENUMTAG:
+++ {
+++ alt3=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 3;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto rulenexprEx;
+++ }
+++
+++ switch (alt3)
+++ {
+++ case 1:
+++ // SMARTPL.g:36:10: NOT crit
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ NOT12 = (pANTLR3_COMMON_TOKEN) MATCHT(NOT, &FOLLOW_NOT_in_nexpr104);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulenexprEx;
+++ }
+++
+++ NOT12_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, NOT12));
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->becomeRoot(ADAPTOR, NOT12_tree, root_0));
+++
+++ FOLLOWPUSH(FOLLOW_crit_in_nexpr107);
+++ crit13=crit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulenexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, crit13.tree);
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:37:6: crit
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_crit_in_nexpr114);
+++ crit14=crit(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulenexprEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, crit14.tree);
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulenexprEx; /* Prevent compiler warnings */
+++ rulenexprEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end nexpr */
+++
+++/**
+++ * $ANTLR start crit
+++ * SMARTPL.g:40:1: crit : ( LPAR expression RPAR -> expression | STRTAG ( INCLUDES | IS ) STR | INTTAG INTBOOL INT | DATETAG ( AFTER | BEFORE ) dateval | ENUMTAG IS ENUMVAL );
+++ */
+++static SMARTPLParser_crit_return
+++crit(pSMARTPLParser ctx)
+++{
+++ SMARTPLParser_crit_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN LPAR15;
+++ pANTLR3_COMMON_TOKEN RPAR17;
+++ pANTLR3_COMMON_TOKEN STRTAG18;
+++ pANTLR3_COMMON_TOKEN set19;
+++ pANTLR3_COMMON_TOKEN STR20;
+++ pANTLR3_COMMON_TOKEN INTTAG21;
+++ pANTLR3_COMMON_TOKEN INTBOOL22;
+++ pANTLR3_COMMON_TOKEN INT23;
+++ pANTLR3_COMMON_TOKEN DATETAG24;
+++ pANTLR3_COMMON_TOKEN set25;
+++ pANTLR3_COMMON_TOKEN ENUMTAG27;
+++ pANTLR3_COMMON_TOKEN IS28;
+++ pANTLR3_COMMON_TOKEN ENUMVAL29;
+++ SMARTPLParser_expression_return expression16;
+++ #undef RETURN_TYPE_expression16
+++ #define RETURN_TYPE_expression16 SMARTPLParser_expression_return
+++
+++ SMARTPLParser_dateval_return dateval26;
+++ #undef RETURN_TYPE_dateval26
+++ #define RETURN_TYPE_dateval26 SMARTPLParser_dateval_return
+++
+++ pANTLR3_BASE_TREE LPAR15_tree;
+++ pANTLR3_BASE_TREE RPAR17_tree;
+++ pANTLR3_BASE_TREE STRTAG18_tree;
+++ pANTLR3_BASE_TREE set19_tree;
+++ pANTLR3_BASE_TREE STR20_tree;
+++ pANTLR3_BASE_TREE INTTAG21_tree;
+++ pANTLR3_BASE_TREE INTBOOL22_tree;
+++ pANTLR3_BASE_TREE INT23_tree;
+++ pANTLR3_BASE_TREE DATETAG24_tree;
+++ pANTLR3_BASE_TREE set25_tree;
+++ pANTLR3_BASE_TREE ENUMTAG27_tree;
+++ pANTLR3_BASE_TREE IS28_tree;
+++ pANTLR3_BASE_TREE ENUMVAL29_tree;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_RPAR;
+++ pANTLR3_REWRITE_RULE_TOKEN_STREAM stream_LPAR;
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_expression;
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ LPAR15 = NULL;
+++ RPAR17 = NULL;
+++ STRTAG18 = NULL;
+++ set19 = NULL;
+++ STR20 = NULL;
+++ INTTAG21 = NULL;
+++ INTBOOL22 = NULL;
+++ INT23 = NULL;
+++ DATETAG24 = NULL;
+++ set25 = NULL;
+++ ENUMTAG27 = NULL;
+++ IS28 = NULL;
+++ ENUMVAL29 = NULL;
+++ expression16.tree = NULL;
+++
+++ dateval26.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ LPAR15_tree = NULL;
+++ RPAR17_tree = NULL;
+++ STRTAG18_tree = NULL;
+++ set19_tree = NULL;
+++ STR20_tree = NULL;
+++ INTTAG21_tree = NULL;
+++ INTBOOL22_tree = NULL;
+++ INT23_tree = NULL;
+++ DATETAG24_tree = NULL;
+++ set25_tree = NULL;
+++ ENUMTAG27_tree = NULL;
+++ IS28_tree = NULL;
+++ ENUMVAL29_tree = NULL;
+++
+++ stream_RPAR = NULL;
+++ #define CREATE_stream_RPAR if (stream_RPAR == NULL) {stream_RPAR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token RPAR"); }
+++ stream_LPAR = NULL;
+++ #define CREATE_stream_LPAR if (stream_LPAR == NULL) {stream_LPAR = antlr3RewriteRuleTOKENStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token LPAR"); }
+++ stream_expression = NULL;
+++ #define CREATE_stream_expression if (stream_expression == NULL) {stream_expression = antlr3RewriteRuleSubtreeStreamNewAE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"rule expression"); }
+++
+++ retval.tree = NULL;
+++ {
+++ {
+++ // SMARTPL.g:40:7: ( LPAR expression RPAR -> expression | STRTAG ( INCLUDES | IS ) STR | INTTAG INTBOOL INT | DATETAG ( AFTER | BEFORE ) dateval | ENUMTAG IS ENUMVAL )
+++
+++ ANTLR3_UINT32 alt4;
+++
+++ alt4=5;
+++
+++ switch ( LA(1) )
+++ {
+++ case LPAR:
+++ {
+++ alt4=1;
+++ }
+++ break;
+++ case STRTAG:
+++ {
+++ alt4=2;
+++ }
+++ break;
+++ case INTTAG:
+++ {
+++ alt4=3;
+++ }
+++ break;
+++ case DATETAG:
+++ {
+++ alt4=4;
+++ }
+++ break;
+++ case ENUMTAG:
+++ {
+++ alt4=5;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 4;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto rulecritEx;
+++ }
+++
+++ switch (alt4)
+++ {
+++ case 1:
+++ // SMARTPL.g:40:9: LPAR expression RPAR
+++ {
+++ LPAR15 = (pANTLR3_COMMON_TOKEN) MATCHT(LPAR, &FOLLOW_LPAR_in_crit127);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ CREATE_stream_LPAR; stream_LPAR->add(stream_LPAR, LPAR15, NULL);
+++
+++ FOLLOWPUSH(FOLLOW_expression_in_crit129);
+++ expression16=expression(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ CREATE_stream_expression; stream_expression->add(stream_expression, expression16.tree, NULL);
+++ RPAR17 = (pANTLR3_COMMON_TOKEN) MATCHT(RPAR, &FOLLOW_RPAR_in_crit131);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ CREATE_stream_RPAR; stream_RPAR->add(stream_RPAR, RPAR17, NULL);
+++
+++
+++
+++ /* AST REWRITE
+++ * elements : expression
+++ * token labels :
+++ * rule labels : retval
+++ * token list labels :
+++ * rule list labels :
+++ */
+++ {
+++ pANTLR3_REWRITE_RULE_SUBTREE_STREAM stream_retval;
+++
+++ stream_retval=antlr3RewriteRuleSubtreeStreamNewAEE(ADAPTOR, RECOGNIZER, (pANTLR3_UINT8)"token retval", retval.tree != NULL ? retval.tree : NULL);
+++
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++ retval.tree = root_0;
+++ // 40:30: -> expression
+++ {
+++ ADAPTOR->addChild(ADAPTOR, root_0, stream_expression == NULL ? NULL : stream_expression->nextTree(stream_expression));
+++
+++ }
+++
+++ retval.tree = root_0; // set result root
+++ if (stream_retval != NULL) stream_retval->free(stream_retval);
+++
+++
+++ }
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:41:6: STRTAG ( INCLUDES | IS ) STR
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ STRTAG18 = (pANTLR3_COMMON_TOKEN) MATCHT(STRTAG, &FOLLOW_STRTAG_in_crit142);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ STRTAG18_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, STRTAG18));
+++ ADAPTOR->addChild(ADAPTOR, root_0, STRTAG18_tree);
+++
+++ set19=(pANTLR3_COMMON_TOKEN)LT(1);
+++ if ( ((LA(1) >= INCLUDES) && (LA(1) <= IS)) )
+++ {
+++ CONSUME();
+++ ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set19)));
+++ PERRORRECOVERY=ANTLR3_FALSE;
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++ EXCEPTION->expectingSet = &FOLLOW_set_in_crit144;
+++ RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_crit144); goto rulecritEx;
+++ }
+++
+++ STR20 = (pANTLR3_COMMON_TOKEN) MATCHT(STR, &FOLLOW_STR_in_crit150);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ STR20_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, STR20));
+++ ADAPTOR->addChild(ADAPTOR, root_0, STR20_tree);
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // SMARTPL.g:42:6: INTTAG INTBOOL INT
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ INTTAG21 = (pANTLR3_COMMON_TOKEN) MATCHT(INTTAG, &FOLLOW_INTTAG_in_crit157);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ INTTAG21_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, INTTAG21));
+++ ADAPTOR->addChild(ADAPTOR, root_0, INTTAG21_tree);
+++
+++ INTBOOL22 = (pANTLR3_COMMON_TOKEN) MATCHT(INTBOOL, &FOLLOW_INTBOOL_in_crit159);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ INTBOOL22_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, INTBOOL22));
+++ ADAPTOR->addChild(ADAPTOR, root_0, INTBOOL22_tree);
+++
+++ INT23 = (pANTLR3_COMMON_TOKEN) MATCHT(INT, &FOLLOW_INT_in_crit161);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ INT23_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, INT23));
+++ ADAPTOR->addChild(ADAPTOR, root_0, INT23_tree);
+++
+++
+++ }
+++ break;
+++ case 4:
+++ // SMARTPL.g:43:6: DATETAG ( AFTER | BEFORE ) dateval
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ DATETAG24 = (pANTLR3_COMMON_TOKEN) MATCHT(DATETAG, &FOLLOW_DATETAG_in_crit168);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ DATETAG24_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, DATETAG24));
+++ ADAPTOR->addChild(ADAPTOR, root_0, DATETAG24_tree);
+++
+++ set25=(pANTLR3_COMMON_TOKEN)LT(1);
+++ if ( ((LA(1) >= AFTER) && (LA(1) <= BEFORE)) )
+++ {
+++ CONSUME();
+++ ADAPTOR->addChild(ADAPTOR, root_0, (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, set25)));
+++ PERRORRECOVERY=ANTLR3_FALSE;
+++ }
+++ else
+++ {
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_MISMATCHED_SET_EXCEPTION;
+++ EXCEPTION->name = (void *)ANTLR3_MISMATCHED_SET_NAME;
+++ EXCEPTION->expectingSet = &FOLLOW_set_in_crit170;
+++ RECOVERFROMMISMATCHEDSET(&FOLLOW_set_in_crit170); goto rulecritEx;
+++ }
+++
+++ FOLLOWPUSH(FOLLOW_dateval_in_crit176);
+++ dateval26=dateval(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, dateval26.tree);
+++
+++ }
+++ break;
+++ case 5:
+++ // SMARTPL.g:44:6: ENUMTAG IS ENUMVAL
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ ENUMTAG27 = (pANTLR3_COMMON_TOKEN) MATCHT(ENUMTAG, &FOLLOW_ENUMTAG_in_crit183);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ ENUMTAG27_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, ENUMTAG27));
+++ ADAPTOR->addChild(ADAPTOR, root_0, ENUMTAG27_tree);
+++
+++ IS28 = (pANTLR3_COMMON_TOKEN) MATCHT(IS, &FOLLOW_IS_in_crit185);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ IS28_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, IS28));
+++ ADAPTOR->addChild(ADAPTOR, root_0, IS28_tree);
+++
+++ ENUMVAL29 = (pANTLR3_COMMON_TOKEN) MATCHT(ENUMVAL, &FOLLOW_ENUMVAL_in_crit187);
+++ if (HASEXCEPTION())
+++ {
+++ goto rulecritEx;
+++ }
+++
+++ ENUMVAL29_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, ENUMVAL29));
+++ ADAPTOR->addChild(ADAPTOR, root_0, ENUMVAL29_tree);
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto rulecritEx; /* Prevent compiler warnings */
+++ rulecritEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++ if (stream_RPAR != NULL) stream_RPAR->free(stream_RPAR);
+++ if (stream_LPAR != NULL) stream_LPAR->free(stream_LPAR);
+++ if (stream_expression != NULL) stream_expression->free(stream_expression);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end crit */
+++
+++/**
+++ * $ANTLR start dateval
+++ * SMARTPL.g:47:1: dateval : ( DATE | interval BEFORE DATE | interval AFTER DATE | interval AGO );
+++ */
+++static SMARTPLParser_dateval_return
+++dateval(pSMARTPLParser ctx)
+++{
+++ SMARTPLParser_dateval_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN DATE30;
+++ pANTLR3_COMMON_TOKEN BEFORE32;
+++ pANTLR3_COMMON_TOKEN DATE33;
+++ pANTLR3_COMMON_TOKEN AFTER35;
+++ pANTLR3_COMMON_TOKEN DATE36;
+++ pANTLR3_COMMON_TOKEN AGO38;
+++ SMARTPLParser_interval_return interval31;
+++ #undef RETURN_TYPE_interval31
+++ #define RETURN_TYPE_interval31 SMARTPLParser_interval_return
+++
+++ SMARTPLParser_interval_return interval34;
+++ #undef RETURN_TYPE_interval34
+++ #define RETURN_TYPE_interval34 SMARTPLParser_interval_return
+++
+++ SMARTPLParser_interval_return interval37;
+++ #undef RETURN_TYPE_interval37
+++ #define RETURN_TYPE_interval37 SMARTPLParser_interval_return
+++
+++ pANTLR3_BASE_TREE DATE30_tree;
+++ pANTLR3_BASE_TREE BEFORE32_tree;
+++ pANTLR3_BASE_TREE DATE33_tree;
+++ pANTLR3_BASE_TREE AFTER35_tree;
+++ pANTLR3_BASE_TREE DATE36_tree;
+++ pANTLR3_BASE_TREE AGO38_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ DATE30 = NULL;
+++ BEFORE32 = NULL;
+++ DATE33 = NULL;
+++ AFTER35 = NULL;
+++ DATE36 = NULL;
+++ AGO38 = NULL;
+++ interval31.tree = NULL;
+++
+++ interval34.tree = NULL;
+++
+++ interval37.tree = NULL;
+++
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ DATE30_tree = NULL;
+++ BEFORE32_tree = NULL;
+++ DATE33_tree = NULL;
+++ AFTER35_tree = NULL;
+++ DATE36_tree = NULL;
+++ AGO38_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ {
+++ // SMARTPL.g:47:10: ( DATE | interval BEFORE DATE | interval AFTER DATE | interval AGO )
+++
+++ ANTLR3_UINT32 alt5;
+++
+++ alt5=4;
+++
+++ switch ( LA(1) )
+++ {
+++ case DATE:
+++ {
+++ alt5=1;
+++ }
+++ break;
+++ case INT:
+++ {
+++ switch ( LA(2) )
+++ {
+++ case DATINTERVAL:
+++ {
+++ switch ( LA(3) )
+++ {
+++ case AGO:
+++ {
+++ alt5=4;
+++ }
+++ break;
+++ case AFTER:
+++ {
+++ alt5=3;
+++ }
+++ break;
+++ case BEFORE:
+++ {
+++ alt5=2;
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 5;
+++ EXCEPTION->state = 3;
+++
+++
+++ goto ruledatevalEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 5;
+++ EXCEPTION->state = 2;
+++
+++
+++ goto ruledatevalEx;
+++ }
+++
+++ }
+++ break;
+++
+++ default:
+++ CONSTRUCTEX();
+++ EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+++ EXCEPTION->message = (void *)"";
+++ EXCEPTION->decisionNum = 5;
+++ EXCEPTION->state = 0;
+++
+++
+++ goto ruledatevalEx;
+++ }
+++
+++ switch (alt5)
+++ {
+++ case 1:
+++ // SMARTPL.g:47:12: DATE
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ DATE30 = (pANTLR3_COMMON_TOKEN) MATCHT(DATE, &FOLLOW_DATE_in_dateval200);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ DATE30_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, DATE30));
+++ ADAPTOR->addChild(ADAPTOR, root_0, DATE30_tree);
+++
+++
+++ }
+++ break;
+++ case 2:
+++ // SMARTPL.g:48:6: interval BEFORE DATE
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_interval_in_dateval207);
+++ interval31=interval(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, interval31.tree);
+++ BEFORE32 = (pANTLR3_COMMON_TOKEN) MATCHT(BEFORE, &FOLLOW_BEFORE_in_dateval209);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ BEFORE32_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, BEFORE32));
+++ ADAPTOR->addChild(ADAPTOR, root_0, BEFORE32_tree);
+++
+++ DATE33 = (pANTLR3_COMMON_TOKEN) MATCHT(DATE, &FOLLOW_DATE_in_dateval211);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ DATE33_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, DATE33));
+++ ADAPTOR->addChild(ADAPTOR, root_0, DATE33_tree);
+++
+++
+++ }
+++ break;
+++ case 3:
+++ // SMARTPL.g:49:6: interval AFTER DATE
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_interval_in_dateval218);
+++ interval34=interval(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, interval34.tree);
+++ AFTER35 = (pANTLR3_COMMON_TOKEN) MATCHT(AFTER, &FOLLOW_AFTER_in_dateval220);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ AFTER35_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, AFTER35));
+++ ADAPTOR->addChild(ADAPTOR, root_0, AFTER35_tree);
+++
+++ DATE36 = (pANTLR3_COMMON_TOKEN) MATCHT(DATE, &FOLLOW_DATE_in_dateval222);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ DATE36_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, DATE36));
+++ ADAPTOR->addChild(ADAPTOR, root_0, DATE36_tree);
+++
+++
+++ }
+++ break;
+++ case 4:
+++ // SMARTPL.g:50:6: interval AGO
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ FOLLOWPUSH(FOLLOW_interval_in_dateval229);
+++ interval37=interval(ctx);
+++
+++ FOLLOWPOP();
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ ADAPTOR->addChild(ADAPTOR, root_0, interval37.tree);
+++ AGO38 = (pANTLR3_COMMON_TOKEN) MATCHT(AGO, &FOLLOW_AGO_in_dateval231);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruledatevalEx;
+++ }
+++
+++ AGO38_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, AGO38));
+++ ADAPTOR->addChild(ADAPTOR, root_0, AGO38_tree);
+++
+++
+++ }
+++ break;
+++
+++ }
+++ }
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruledatevalEx; /* Prevent compiler warnings */
+++ ruledatevalEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end dateval */
+++
+++/**
+++ * $ANTLR start interval
+++ * SMARTPL.g:53:1: interval : INT DATINTERVAL ;
+++ */
+++static SMARTPLParser_interval_return
+++interval(pSMARTPLParser ctx)
+++{
+++ SMARTPLParser_interval_return retval;
+++
+++ pANTLR3_BASE_TREE root_0;
+++
+++ pANTLR3_COMMON_TOKEN INT39;
+++ pANTLR3_COMMON_TOKEN DATINTERVAL40;
+++
+++ pANTLR3_BASE_TREE INT39_tree;
+++ pANTLR3_BASE_TREE DATINTERVAL40_tree;
+++
+++ /* Initialize rule variables
+++ */
+++
+++
+++ root_0 = NULL;
+++
+++ INT39 = NULL;
+++ DATINTERVAL40 = NULL;
+++ retval.start = LT(1); retval.stop = retval.start;
+++
+++ INT39_tree = NULL;
+++ DATINTERVAL40_tree = NULL;
+++
+++
+++ retval.tree = NULL;
+++ {
+++ // SMARTPL.g:53:10: ( INT DATINTERVAL )
+++ // SMARTPL.g:53:12: INT DATINTERVAL
+++ {
+++ root_0 = (pANTLR3_BASE_TREE)(ADAPTOR->nilNode(ADAPTOR));
+++
+++ INT39 = (pANTLR3_COMMON_TOKEN) MATCHT(INT, &FOLLOW_INT_in_interval243);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintervalEx;
+++ }
+++
+++ INT39_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, INT39));
+++ ADAPTOR->addChild(ADAPTOR, root_0, INT39_tree);
+++
+++ DATINTERVAL40 = (pANTLR3_COMMON_TOKEN) MATCHT(DATINTERVAL, &FOLLOW_DATINTERVAL_in_interval245);
+++ if (HASEXCEPTION())
+++ {
+++ goto ruleintervalEx;
+++ }
+++
+++ DATINTERVAL40_tree = (pANTLR3_BASE_TREE)(ADAPTOR->create(ADAPTOR, DATINTERVAL40));
+++ ADAPTOR->addChild(ADAPTOR, root_0, DATINTERVAL40_tree);
+++
+++
+++ }
+++
+++ }
+++
+++
+++ // This is where rules clean up and exit
+++ //
+++ goto ruleintervalEx; /* Prevent compiler warnings */
+++ ruleintervalEx: ;
+++ retval.stop = LT(-1);
+++
+++ retval.stop = LT(-1);
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->rulePostProcessing(ADAPTOR, root_0));
+++ ADAPTOR->setTokenBoundaries(ADAPTOR, retval.tree, retval.start, retval.stop);
+++
+++ if (HASEXCEPTION())
+++ {
+++ PREPORTERROR();
+++ PRECOVER();
+++ retval.tree = (pANTLR3_BASE_TREE)(ADAPTOR->errorNode(ADAPTOR, INPUT, retval.start, LT(-1), EXCEPTION));
+++ }
+++
+++
+++ return retval;
+++}
+++/* $ANTLR end interval */
+++/* End of parsing rules
+++ * ==============================================
+++ */
+++
+++/* ==============================================
+++ * Syntactic predicates
+++ */
+++/* End of syntactic predicates
+++ * ==============================================
+++ */
+++
+++
+++
+++
+++
+++
+++/* End of code
+++ * =============================================================================
+++ */
++diff --git a/src/pregen/SMARTPLParser.h b/src/pregen/SMARTPLParser.h
++new file mode 100644
++index 0000000..5360136
++--- /dev/null
+++++ b/src/pregen/SMARTPLParser.h
++@@ -0,0 +1,285 @@
+++/** \file
+++ * This C header file was generated by $ANTLR version 3.2 debian-7ubuntu3
+++ *
+++ * - From the grammar source file : SMARTPL.g
+++ * - On : 2015-06-27 19:05:15
+++ * - for the parser : SMARTPLParserParser *
+++ * Editing it, at least manually, is not wise.
+++ *
+++ * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
+++ *
+++ *
+++ * The parser SMARTPLParser has the callable functions (rules) shown below,
+++ * which will invoke the code for the associated rule in the source grammar
+++ * assuming that the input stream is pointing to a token/text stream that could begin
+++ * this rule.
+++ *
+++ * For instance if you call the first (topmost) rule in a parser grammar, you will
+++ * get the results of a full parse, but calling a rule half way through the grammar will
+++ * allow you to pass part of a full token stream to the parser, such as for syntax checking
+++ * in editors and so on.
+++ *
+++ * The parser entry points are called indirectly (by function pointer to function) via
+++ * a parser context typedef pSMARTPLParser, which is returned from a call to SMARTPLParserNew().
+++ *
+++ * The methods in pSMARTPLParser are as follows:
+++ *
+++ * - SMARTPLParser_playlist_return pSMARTPLParser->playlist(pSMARTPLParser)
+++ * - SMARTPLParser_expression_return pSMARTPLParser->expression(pSMARTPLParser)
+++ * - SMARTPLParser_aexpr_return pSMARTPLParser->aexpr(pSMARTPLParser)
+++ * - SMARTPLParser_nexpr_return pSMARTPLParser->nexpr(pSMARTPLParser)
+++ * - SMARTPLParser_crit_return pSMARTPLParser->crit(pSMARTPLParser)
+++ * - SMARTPLParser_dateval_return pSMARTPLParser->dateval(pSMARTPLParser)
+++ * - SMARTPLParser_interval_return pSMARTPLParser->interval(pSMARTPLParser)
+++ *
+++ * The return type for any particular rule is of course determined by the source
+++ * grammar file.
+++ */
+++// [The "BSD licence"]
+++// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+++// http://www.temporal-wave.com
+++// http://www.linkedin.com/in/jimidle
+++//
+++// All rights reserved.
+++//
+++// Redistribution and use in source and binary forms, with or without
+++// modification, are permitted provided that the following conditions
+++// are met:
+++// 1. Redistributions of source code must retain the above copyright
+++// notice, this list of conditions and the following disclaimer.
+++// 2. Redistributions in binary form must reproduce the above copyright
+++// notice, this list of conditions and the following disclaimer in the
+++// documentation and/or other materials provided with the distribution.
+++// 3. The name of the author may not be used to endorse or promote products
+++// derived from this software without specific prior written permission.
+++//
+++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+++// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+++// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+++// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+++// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+++// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+++// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+++// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+++// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+++// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++
+++#ifndef _SMARTPLParser_H
+++#define _SMARTPLParser_H
+++/* =============================================================================
+++ * Standard antlr3 C runtime definitions
+++ */
+++#include <antlr3.h>
+++
+++/* End of standard antlr 3 runtime definitions
+++ * =============================================================================
+++ */
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++// Forward declare the context typedef so that we can use it before it is
+++// properly defined. Delegators and delegates (from import statements) are
+++// interdependent and their context structures contain pointers to each other
+++// C only allows such things to be declared if you pre-declare the typedef.
+++//
+++typedef struct SMARTPLParser_Ctx_struct SMARTPLParser, * pSMARTPLParser;
+++
+++
+++
+++#ifdef ANTLR3_WINDOWS
+++// Disable: Unreferenced parameter, - Rules with parameters that are not used
+++// constant conditional, - ANTLR realizes that a prediction is always true (synpred usually)
+++// initialized but unused variable - tree rewrite variables declared but not needed
+++// Unreferenced local variable - lexer rule declares but does not always use _type
+++// potentially unitialized variable used - retval always returned from a rule
+++// unreferenced local function has been removed - susually getTokenNames or freeScope, they can go without warnigns
+++//
+++// These are only really displayed at warning level /W4 but that is the code ideal I am aiming at
+++// and the codegen must generate some of these warnings by necessity, apart from 4100, which is
+++// usually generated when a parser rule is given a parameter that it does not use. Mostly though
+++// this is a matter of orthogonality hence I disable that one.
+++//
+++#pragma warning( disable : 4100 )
+++#pragma warning( disable : 4101 )
+++#pragma warning( disable : 4127 )
+++#pragma warning( disable : 4189 )
+++#pragma warning( disable : 4505 )
+++#pragma warning( disable : 4701 )
+++#endif
+++typedef struct SMARTPLParser_playlist_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ SMARTPLParser_playlist_return;
+++
+++typedef struct SMARTPLParser_expression_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ SMARTPLParser_expression_return;
+++
+++typedef struct SMARTPLParser_aexpr_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ SMARTPLParser_aexpr_return;
+++
+++typedef struct SMARTPLParser_nexpr_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ SMARTPLParser_nexpr_return;
+++
+++typedef struct SMARTPLParser_crit_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ SMARTPLParser_crit_return;
+++
+++typedef struct SMARTPLParser_dateval_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ SMARTPLParser_dateval_return;
+++
+++typedef struct SMARTPLParser_interval_return_struct
+++{
+++ /** Generic return elements for ANTLR3 rules that are not in tree parsers or returning trees
+++ */
+++ pANTLR3_COMMON_TOKEN start;
+++ pANTLR3_COMMON_TOKEN stop;
+++ pANTLR3_BASE_TREE tree;
+++
+++}
+++ SMARTPLParser_interval_return;
+++
+++
+++
+++/** Context tracking structure for SMARTPLParser
+++ */
+++struct SMARTPLParser_Ctx_struct
+++{
+++ /** Built in ANTLR3 context tracker contains all the generic elements
+++ * required for context tracking.
+++ */
+++ pANTLR3_PARSER pParser;
+++
+++
+++ SMARTPLParser_playlist_return (*playlist) (struct SMARTPLParser_Ctx_struct * ctx);
+++ SMARTPLParser_expression_return (*expression) (struct SMARTPLParser_Ctx_struct * ctx);
+++ SMARTPLParser_aexpr_return (*aexpr) (struct SMARTPLParser_Ctx_struct * ctx);
+++ SMARTPLParser_nexpr_return (*nexpr) (struct SMARTPLParser_Ctx_struct * ctx);
+++ SMARTPLParser_crit_return (*crit) (struct SMARTPLParser_Ctx_struct * ctx);
+++ SMARTPLParser_dateval_return (*dateval) (struct SMARTPLParser_Ctx_struct * ctx);
+++ SMARTPLParser_interval_return (*interval) (struct SMARTPLParser_Ctx_struct * ctx);
+++ // Delegated rules
+++ const char * (*getGrammarFileName)();
+++ void (*free) (struct SMARTPLParser_Ctx_struct * ctx);
+++ /* @headerFile.members() */
+++ pANTLR3_BASE_TREE_ADAPTOR adaptor;
+++ pANTLR3_VECTOR_FACTORY vectors;
+++ /* End @headerFile.members() */
+++};
+++
+++// Function protoypes for the constructor functions that external translation units
+++// such as delegators and delegates may wish to call.
+++//
+++ANTLR3_API pSMARTPLParser SMARTPLParserNew (pANTLR3_COMMON_TOKEN_STREAM instream);
+++ANTLR3_API pSMARTPLParser SMARTPLParserNewSSD (pANTLR3_COMMON_TOKEN_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state);
+++
+++/** Symbolic definitions of all the tokens that the parser will work with.
+++ * \{
+++ *
+++ * Antlr will define EOF, but we can't use that as it it is too common in
+++ * in C header files and that would be confusing. There is no way to filter this out at the moment
+++ * so we just undef it here for now. That isn't the value we get back from C recognizers
+++ * anyway. We are looking for ANTLR3_TOKEN_EOF.
+++ */
+++#ifdef EOF
+++#undef EOF
+++#endif
+++#ifdef Tokens
+++#undef Tokens
+++#endif
+++#define INTBOOL 14
+++#define STRTAG 10
+++#define AGO 22
+++#define WHITESPACE 29
+++#define GREATEREQUAL 25
+++#define BEFORE 18
+++#define DATETAG 16
+++#define INT 15
+++#define NOT 7
+++#define AFTER 17
+++#define AND 6
+++#define EOF -1
+++#define INCLUDES 11
+++#define STR 4
+++#define T__30 30
+++#define T__31 31
+++#define GREATER 24
+++#define LPAR 8
+++#define ENUMTAG 19
+++#define IS 12
+++#define ENUMVAL 20
+++#define EQUAL 28
+++#define OR 5
+++#define LESS 26
+++#define RPAR 9
+++#define DATE 21
+++#define LESSEQUAL 27
+++#define DATINTERVAL 23
+++#define INTTAG 13
+++#ifdef EOF
+++#undef EOF
+++#define EOF ANTLR3_TOKEN_EOF
+++#endif
+++
+++#ifndef TOKENSOURCE
+++#define TOKENSOURCE(lxr) lxr->pLexer->rec->state->tokSource
+++#endif
+++
+++/* End of token definitions for SMARTPLParser
+++ * =============================================================================
+++ */
+++/** \} */
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif
+++
+++/* END - Note:Keep extra line feed to satisfy UNIX systems */
+diff --git a/feeds/packages/sound/lame/Makefile b/feeds/packages/sound/lame/Makefile
+new file mode 100644
+index 0000000..e7057e5
+--- /dev/null
++++ b/feeds/packages/sound/lame/Makefile
+@@ -0,0 +1,85 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++# blogic@openwrt.org
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lame
++PKG_VERSION:=3.99.5
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/lame
++PKG_MD5SUM:=84835b313d4a8b68f5349816d33e07ce
++PKG_FIXUP:=autoreconf
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=LGPL-2.0
++PKG_LICENSE_FILES:=COPYING LICENSE
++
++include $(INCLUDE_DIR)/package.mk
++
++PKG_INSTALL=1
++
++define Package/lame/Default
++ SECTION:=sound
++ CATEGORY:=Sound
++ URL:=http://sourceforge.net/projects/lame
++ DEPENDS:=@BUILD_PATENTED
++endef
++
++define Package/lame
++$(call Package/lame/Default)
++ TITLE:=lame
++ MENU:=1
++ DEPENDS += +libncurses
++endef
++
++define Package/lame/description
++lame mp3 encoder
++endef
++
++define Package/lame-lib
++$(call Package/lame/Default)
++ TITLE:=lame-lib
++endef
++
++define Package/lame-lib/description
++lame mp3 encoder libs
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --disable-nasm \
++ )
++endef
++
++
++define Package/lame/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/lame $(1)/usr/bin/
++endef
++
++define Package/lame-lib/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib*so* $(1)/usr/lib/
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/lame
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/include/lame/*.h \
++ $(1)/usr/include/lame/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.{la,so*} \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,lame-lib))
++$(eval $(call BuildPackage,lame))
+diff --git a/feeds/packages/sound/lame/patches/001-automake-compat.patch b/feeds/packages/sound/lame/patches/001-automake-compat.patch
+new file mode 100644
+index 0000000..8857ad7
+--- /dev/null
++++ b/feeds/packages/sound/lame/patches/001-automake-compat.patch
+@@ -0,0 +1,33 @@
++--- a/configure.in
+++++ b/configure.in
++@@ -393,7 +393,7 @@ CONFIG_MATH_LIB="${USE_LIBM}"
++
++ dnl configure use of features
++
++-AM_PATH_GTK(1.2.0, HAVE_GTK="yes", HAVE_GTK="no")
+++HAVE_GTK="no"
++
++ dnl ElectricFence malloc debugging
++ AC_MSG_CHECKING(use of ElectricFence malloc debugging)
++--- a/frontend/Makefile.am
+++++ b/frontend/Makefile.am
++@@ -35,7 +35,7 @@ lame_SOURCES = lame_main.c $(common_sour
++ mp3rtp_SOURCES = mp3rtp.c rtp.c $(common_sources)
++ mp3x_SOURCES = mp3x.c gtkanal.c gpkplotting.c $(common_sources)
++
++-CFLAGS = @CFLAGS@ @GTK_CFLAGS@ @FRONTEND_CFLAGS@ @SNDFILE_CFLAGS@
+++CFLAGS = @CFLAGS@ @FRONTEND_CFLAGS@ @SNDFILE_CFLAGS@
++ LDFLAGS = @LDFLAGS@ @FRONTEND_LDFLAGS@ @SNDFILE_LIBS@
++
++ INCLUDES = -I$(top_srcdir)/libmp3lame -I$(top_srcdir)/include -I$(top_builddir)
++--- a/frontend/Makefile.in
+++++ b/frontend/Makefile.in
++@@ -99,7 +99,7 @@ AUTOMAKE = @AUTOMAKE@
++ AWK = @AWK@
++ CC = @CC@
++ CCDEPMODE = @CCDEPMODE@
++-CFLAGS = @CFLAGS@ @GTK_CFLAGS@ @FRONTEND_CFLAGS@ @SNDFILE_CFLAGS@
+++CFLAGS = @CFLAGS@ @FRONTEND_CFLAGS@ @SNDFILE_CFLAGS@
++ CONFIG_DEFS = @CONFIG_DEFS@
++ CONFIG_MATH_LIB = @CONFIG_MATH_LIB@
++ CPP = @CPP@
+diff --git a/feeds/packages/sound/madplay/Makefile b/feeds/packages/sound/madplay/Makefile
+new file mode 100644
+index 0000000..f0a1ef0
+--- /dev/null
++++ b/feeds/packages/sound/madplay/Makefile
+@@ -0,0 +1,85 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=madplay
++PKG_VERSION:=0.15.2b
++PKG_RELEASE:=5
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/mad \
++ ftp://ftp.mars.org/pub/mpeg/
++PKG_MD5SUM:=6814b47ceaa99880c754c5195aa1aac1
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Simon Peter <probono@puredarwin.org>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/madplay/default
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+libid3tag +libmad $(INTL_DEPENDS) $(2)
++ TITLE:=MPEG audio player in fixed point - $(1)
++ VARIANT:=$(1)
++ URL:=http://sourceforge.net/projects/mad
++endef
++
++Package/madplay-alsa=$(call Package/madplay/default,alsa,+alsa-lib)
++Package/madplay=$(call Package/madplay/default,oss)
++
++define Package/madplay/description
++ MAD is an MPEG audio decoder. It currently only supports the MPEG 1
++ standard, but fully implements all three audio layers (Layer I, Layer II,
++ and Layer III, the latter often colloquially known as MP3.). There is also
++ full support for ID3 tags.
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --enable-shared \
++ --disable-static \
++ --disable-debugging \
++ --disable-profiling \
++ --disable-experimental \
++ --without-libiconv-prefix \
++ --without-libintl-prefix \
++ --without-esd \
++ , \
++ LIBS="-lz" \
++ )
++endef
++
++ifeq ($(BUILD_VARIANT),alsa)
++ CONFIGURE_ARGS += \
++ --without-oss \
++ --with-alsa
++endif
++
++ifeq ($(BUILD_VARIANT),oss)
++ CONFIGURE_ARGS += \
++ --without-alsa
++endif
++
++define Package/madplay/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/madplay $(1)/usr/bin/
++endef
++
++define Package/madplay-alsa/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/madplay $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,madplay-alsa))
++$(eval $(call BuildPackage,madplay))
+diff --git a/feeds/packages/sound/madplay/patches/0001-switch-to-new-alsa-api.patch b/feeds/packages/sound/madplay/patches/0001-switch-to-new-alsa-api.patch
+new file mode 100644
+index 0000000..60d7bd3
+--- /dev/null
++++ b/feeds/packages/sound/madplay/patches/0001-switch-to-new-alsa-api.patch
+@@ -0,0 +1,173 @@
++Switch madplay to the new API. This is done thanks to a patch written
++by Micha Nelissen <micha@neli.hopto.org> and available at
++http://article.gmane.org/gmane.comp.audio.mad.devel/729.
++
++--- madplay-0.15.2b/audio_alsa.c 2008-10-18 15:10:16.000000000 +0200
+++++ madplay-0.15.2b/audio_alsa.c.new 2008-10-18 15:03:27.000000000 +0200
++@@ -28,31 +28,30 @@
++
++ #include <errno.h>
++
++-#define ALSA_PCM_OLD_HW_PARAMS_API
++-#define ALSA_PCM_OLD_SW_PARAMS_API
++ #include <alsa/asoundlib.h>
++
++ #include <mad.h>
++
++ #include "audio.h"
++
++-char *buf = NULL;
++-int paused = 0;
+++#define BUFFER_TIME_MAX 500000
++
++-int rate = -1;
++-int channels = -1;
++-int bitdepth = -1;
++-int sample_size = -1;
++-
++-int buffer_time = 500000;
++-int period_time = 100000;
++-char *defaultdev = "plughw:0,0";
+++unsigned char *buf = NULL;
+++int paused = 0;
+++
+++unsigned int rate = 0;
+++unsigned int channels = -1;
+++unsigned int bitdepth = -1;
+++unsigned int sample_size = -1;
+++
+++unsigned int buffer_time;
+++unsigned int period_time;
+++char *defaultdev = "plughw:0,0";
++
++ snd_pcm_hw_params_t *alsa_hwparams;
++ snd_pcm_sw_params_t *alsa_swparams;
++
++-snd_pcm_sframes_t buffer_size;
++-snd_pcm_sframes_t period_size;
+++snd_pcm_uframes_t buffer_size;
++
++ snd_pcm_format_t alsa_format = -1;
++ snd_pcm_access_t alsa_access = SND_PCM_ACCESS_MMAP_INTERLEAVED;
++@@ -66,14 +65,20 @@
++ snd_pcm_hw_params_t *params,
++ snd_pcm_access_t access)
++ {
++- int err, dir;
++-
+++ int err;
+++
++ /* choose all parameters */
++ err = snd_pcm_hw_params_any(handle,params);
++ if (err < 0) {
++ printf("Access type not available for playback: %s\n", snd_strerror(err));
++ return err;
++ }
+++ /* set the access type */
+++ err = snd_pcm_hw_params_set_access(handle, params, alsa_access);
+++ if (err < 0) {
+++ printf("Sample format not available for playback: %s\n", snd_strerror(err));
+++ return err;
+++ }
++ /* set the sample format */
++ err = snd_pcm_hw_params_set_format(handle, params, alsa_format);
++ if (err < 0) {
++@@ -87,29 +92,38 @@
++ return err;
++ }
++ /* set the stream rate */
++- err = snd_pcm_hw_params_set_rate_near(handle, params, rate, 0);
+++ err = snd_pcm_hw_params_set_rate(handle, params, rate, 0);
++ if (err < 0) {
++ printf("Rate %iHz not available for playback: %s\n", rate, snd_strerror(err));
++ return err;
++ }
++- if (err != rate) {
++- printf("Rate doesn't match (requested %iHz, get %iHz)\n", rate, err);
++- return -EINVAL;
++- }
+++ err = snd_pcm_hw_params_get_buffer_time_max(params, &buffer_time, NULL);
+++ if (err < 0) {
+++ printf("Unable to retrieve buffer time: %s\n", snd_strerror(err));
+++ return err;
+++ }
+++ if (buffer_time > BUFFER_TIME_MAX)
+++ buffer_time = BUFFER_TIME_MAX;
++ /* set buffer time */
++- err = snd_pcm_hw_params_set_buffer_time_near(handle, params, buffer_time, &dir);
+++ err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, 0);
++ if (err < 0) {
++ printf("Unable to set buffer time %i for playback: %s\n", buffer_time, snd_strerror(err));
++ return err;
++ }
++- buffer_size = snd_pcm_hw_params_get_buffer_size(params);
+++ if (period_time * 4 > buffer_time)
+++ period_time = buffer_time / 4;
++ /* set period time */
++- err = snd_pcm_hw_params_set_period_time_near(handle, params, period_time, &dir);
+++ err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, NULL);
++ if (err < 0) {
++ printf("Unable to set period time %i for playback: %s\n", period_time, snd_strerror(err));
++ return err;
++ }
++- period_size = snd_pcm_hw_params_get_period_size(params, &dir);
+++ /* retrieve buffer size */
+++ err = snd_pcm_hw_params_get_buffer_size(params, &buffer_size);
+++ if (err < 0) {
+++ printf("Unable to retrieve buffer size: %s\n", snd_strerror(err));
+++ return err;
+++ }
++ /* write the parameters to device */
++ err = snd_pcm_hw_params(handle, params);
++ if (err < 0) {
++@@ -123,6 +137,7 @@
++ int set_swparams(snd_pcm_t *handle,
++ snd_pcm_sw_params_t *params)
++ {
+++ unsigned int start_threshold;
++ int err;
++
++ /* get current swparams */
++@@ -136,13 +151,7 @@
++ if (err < 0) {
++ printf("Unable to set start threshold mode for playback: %s\n", snd_strerror(err));
++ return err;
++- }
++- /* allow transfer when at least period_size samples can be processed */
++- err = snd_pcm_sw_params_set_avail_min(handle, params, period_size);
++- if (err < 0) {
++- printf("Unable to set avail min for playback: %s\n", snd_strerror(err));
++- return err;
++- }
+++ }
++ /* align all transfers to 1 samples */
++ err = snd_pcm_sw_params_set_xfer_align(handle, params, 1);
++ if (err < 0) {
++@@ -190,7 +199,7 @@
++ rate = config->speed;
++
++ if ( bitdepth == 0 )
++- config->precision = bitdepth = 32;
+++ config->precision = bitdepth = 16;
++
++ switch (bitdepth)
++ {
++@@ -241,7 +250,7 @@
++ return -1;
++ }
++
++- buf = malloc(buffer_size);
+++ buf = malloc(buffer_size * sample_size);
++ if (buf == NULL) {
++ audio_error="unable to allocate output buffer table";
++ return -1;
++@@ -279,7 +288,7 @@
++ int play(struct audio_play *play)
++ {
++ int err, len;
++- char *ptr;
+++ unsigned char *ptr;
++
++ ptr = buf;
++ len = play->nsamples;
++
+diff --git a/feeds/packages/sound/madplay/patches/010-use_correct_shell.patch b/feeds/packages/sound/madplay/patches/010-use_correct_shell.patch
+new file mode 100644
+index 0000000..c8eb2a3
+--- /dev/null
++++ b/feeds/packages/sound/madplay/patches/010-use_correct_shell.patch
+@@ -0,0 +1,30 @@
++--- a/intl/Makefile.in
+++++ b/intl/Makefile.in
++@@ -19,7 +19,7 @@
++ PACKAGE = @PACKAGE@
++ VERSION = @VERSION@
++
++-SHELL = /bin/sh
+++SHELL = @SHELL@
++
++ srcdir = @srcdir@
++ top_srcdir = @top_srcdir@
++@@ -56,6 +56,7 @@ DEFS = -DLOCALEDIR=\"$(localedir)\" -DLO
++ -DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO_XMALLOC \
++ -Dset_relocation_prefix=libintl_set_relocation_prefix \
++ -Drelocate=libintl_relocate \
+++-DINSTALLPREFIX=\"$(prefix)\" \
++ -DDEPENDS_ON_LIBICONV=1 @DEFS@
++ CPPFLAGS = @CPPFLAGS@
++ CFLAGS = @CFLAGS@
++--- a/po/Makefile.in.in
+++++ b/po/Makefile.in.in
++@@ -13,7 +13,7 @@
++ PACKAGE = @PACKAGE@
++ VERSION = @VERSION@
++
++-SHELL = /bin/sh
+++SHELL = @SHELL@
++ @SET_MAKE@
++
++ srcdir = @srcdir@
+diff --git a/feeds/packages/sound/mocp/Makefile b/feeds/packages/sound/mocp/Makefile
+new file mode 100644
+index 0000000..bef28d2
+--- /dev/null
++++ b/feeds/packages/sound/mocp/Makefile
+@@ -0,0 +1,66 @@
++#
++# Copyright (C) 2011-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=moc
++PKG_VERSION:=2.5.0
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://ftp.daper.net/pub/soft/moc/stable/
++PKG_MD5SUM:=18e3a979b67091bfee4b62217908c473
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/moc
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+libcurl +BUILD_PATENTED:libmad +libvorbis $(ICONV_DEPENDS) +alsa-lib +libid3tag +libflac +libsamplerate +PACKAGE_libncursesw:libncursesw +!PACKAGE_libncursesw:libncurses +libffmpeg +libltdl +libmagic +faad2 +libdb47
++ TITLE:=Music On Console
++ URL:=http://moc.daper.net/
++endef
++
++define Package/moc/description
++ MOC (music on console) is a console audio player for LINUX/UNIX designed to be powerful and easy to use.
++endef
++
++TARGET_CFLAGS+=-D_GNU_SOURCE
++
++TARGET_CPPFLAGS+=-P
++
++CONFIGURE_ARGS+= \
++ $(if $(CONFIG_BUILD_PATENTED),,--without-mp3) \
++ --enable-shared \
++ --disable-static \
++ --disable-debug \
++ --without-speex \
++ --without-samplerate \
++ --without-curl \
++ --without-flac \
++ --without-musepack \
++ --without-rcc \
++ $(if $(CONFIG_PACKAGE_libncursesw),--with-ncursesw --without-ncurses,--with-ncurses --without-ncursesw) \
++ --with-bdb-dir="$(STAGING_DIR)/usr"
++
++define Package/moc/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mocp $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib/moc/decoder_plugins
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/moc/decoder_plugins/*.so $(1)/usr/lib/moc/decoder_plugins
++endef
++
++$(eval $(call BuildPackage,moc))
+diff --git a/feeds/packages/sound/mpc/Makefile b/feeds/packages/sound/mpc/Makefile
+new file mode 100644
+index 0000000..3109b1c
+--- /dev/null
++++ b/feeds/packages/sound/mpc/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mpc
++PKG_VERSION:=0.27
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.musicpd.org/download/mpc/0
++PKG_MD5SUM:=d9430db9b9d7fb1eadbe4d13e8d97c66
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mpc
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+libmpdclient
++ TITLE:=Music Player Daemon Console Client
++ URL:=http://www.musicpd.org/
++endef
++
++define Package/mpc/description
++ MPD is a music player supporting flac, mp3 and ogg files.
++ It is typically controlled over a network using one of it's many
++ clients including mpc(console), gmpc(gnome), phpmp(php) etc.
++ this is MPC
++endef
++
++define Build/Configure
++$(call Build/Configure/Default, \
++ --disable-iconv \
++)
++endef
++
++define Build/Compile
++$(call Build/Compile/Default,\
++ CFLAGS="$(TARGET_CFLAGS) -std=gnu99" \
++ prefix="/usr" \
++ all \
++)
++endef
++
++define Package/mpc/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/mpc $(1)/usr/bin/
++ $(INSTALL_BIN) ./files/pls-handler.sh $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,mpc))
+diff --git a/feeds/packages/sound/mpc/files/pls-handler.sh b/feeds/packages/sound/mpc/files/pls-handler.sh
+new file mode 100644
+index 0000000..9394417
+--- /dev/null
++++ b/feeds/packages/sound/mpc/files/pls-handler.sh
+@@ -0,0 +1,5 @@
++#!/usr/bin/env sh
++echo parameter: file.pls
++mpc clear
++grep '^File[0-9]*' $1 | sed -e 's/^File[0-9]*=//' | mpc add
++mpc play
+\ No newline at end of file
+diff --git a/feeds/packages/sound/mpd/Makefile b/feeds/packages/sound/mpd/Makefile
+new file mode 100644
+index 0000000..52e2228
+--- /dev/null
++++ b/feeds/packages/sound/mpd/Makefile
+@@ -0,0 +1,225 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mpd
++PKG_VERSION:=0.19.10
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://www.musicpd.org/download/mpd/0.19/
++PKG_MD5SUM:=da4bc3e47afd0faf9e7a67168e012102
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_BUILD_PARALLEL:=1
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_IPV6 \
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/mpd/Default
++ SECTION:=sound
++ CATEGORY:=Sound
++ TITLE:=Music Player Daemon
++ URL:=http://www.musicpd.org/
++ DEPENDS:= +glib2 +libcurl +libpthread +libmpdclient +libstdcpp $(ICONV_DEPENDS) \
++ +libflac +BUILD_PATENTED:libmad +libvorbisidec +AUDIO_SUPPORT:alsa-lib \
++ +boost +boost-container +libexpat
++endef
++
++define Package/mpd/Default/description
++ Music Player Daemon (MPD) is a flexible, powerful, server-side
++ application for playing music. It is typically controlled over a
++ network using one of it's many clients including mpc (console),
++ gmpc (gnome), phpmp (php), etc...
++endef
++
++define Package/mpd-full
++$(call Package/mpd/Default)
++ TITLE+= (full)
++ DEPENDS+= \
++ +libaudiofile +BUILD_PATENTED:libfaad2 +libffmpeg +libid3tag \
++ +libmms +libogg +libsndfile +libvorbis +libupnp
++ PROVIDES:=mpd
++ VARIANT:=full
++endef
++
++define Package/mpd-full/description
++$(call Package/mpd/Default/description)
++ .
++ This package contains a full-blown Music Player Daemon.
++endef
++
++define Package/mpd-full/conffiles
++/etc/mpd.conf
++endef
++
++define Package/mpd-mini
++$(call Package/mpd/Default)
++ TITLE+= (mini)
++ PROVIDES:=mpd
++ VARIANT:=mini
++endef
++
++define Package/mpd-mini/description
++$(call Package/mpd/Default/description)
++ .
++ This package contains a minimal Music Player Daemon, with support for
++ only Flac, MP3 & OGG media types & only file: & http: protocols.
++endef
++
++define Package/mpd-mini/conffiles
++/etc/mpd.conf
++endef
++
++define Package/mpd-avahi-service
++$(call Package/mpd/Default)
++ TITLE+= (Avahi service)
++ DEPENDS+=+avahi-daemon
++endef
++
++define Package/mpd-avahi-service/description
++$(call Package/mpd/Default/description)
++ .
++ This package contains the service definition for announcing the
++ Music Player Daemon service via mDNS/DNS-SD.
++endef
++
++define Package/mpd-avahi-service/conffiles
++/etc/avahi/services/mpd.service
++endef
++
++CONFIGURE_ARGS += \
++ $(call autoconf_bool,CONFIG_IPV6,ipv6) \
++ --disable-debug \
++ --disable-documentation \
++ --disable-test \
++ --disable-werror \
++ \
++ --disable-ao \
++ --disable-bzip2 \
++ --disable-fluidsynth \
++ --disable-gme \
++ --enable-inotify \
++ --disable-icu \
++ --disable-eventfd \
++ --disable-iso9660 \
++ --disable-jack \
++ --disable-lame-encoder \
++ --disable-libwrap \
++ --disable-lsr \
++ --disable-mikmod \
++ --disable-modplug \
++ --disable-mpc \
++ --disable-mpg123 \
++ --disable-openal \
++ --disable-opus \
++ --disable-pulse \
++ --disable-sidplay \
++ --disable-solaris-output \
++ --disable-sqlite \
++ --disable-twolame-encoder \
++ --enable-wave-encoder \
++ --disable-wavpack \
++ --disable-wildmidi \
++ --disable-zzip \
++ --with-zeroconf=no \
++ \
++ --enable-curl \
++ --enable-flac \
++ --enable-httpd-output \
++ $(call autoconf_bool,CONFIG_BUILD_PATENTED,mad) \
++ $(call autoconf_bool,CONFIG_AUDIO_SUPPORT,alsa) \
++ --enable-tcp \
++ --enable-un \
++
++CONFIGURE_VARS += \
++ FLAC_CFLAGS="$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include/FLAC" \
++ FLAC_LIBS="$(TARGET_LDFLAGS) -lFLAC" \
++ $(if $(CONFIG_BUILD_PATENTED),MAD_CFLAGS="$(TARGET_CFLAGS)") \
++ $(if $(CONFIG_BUILD_PATENTED),MAD_LIBS="$(TARGET_LDFLAGS) -lmad") \
++
++TARGET_LDFLAGS += -Wl,-rpath-link=$(STAGING_DIR)/usr/lib $(if $(ICONV_FULL),-liconv)
++
++ifeq ($(BUILD_VARIANT),full)
++
++ CONFIGURE_ARGS += \
++ --enable-upnp \
++ $(call autoconf_bool,CONFIG_BUILD_PATENTED,aac) \
++ --enable-audiofile \
++ --enable-fifo \
++ --enable-ffmpeg \
++ --enable-id3 \
++ --enable-lastfm \
++ --enable-mms \
++ --enable-oggflac \
++ --enable-pipe-output \
++ --enable-recorder-output \
++ --disable-shout \
++ --enable-sndfile \
++ --enable-vorbis \
++ --disable-vorbis-encoder \
++ --with-faad="$(STAGING_DIR)/usr" \
++ --with-tremor=yes \
++
++endif
++
++ifeq ($(BUILD_VARIANT),mini)
++
++ # oggflac is not compatible with tremor
++ CONFIGURE_ARGS += \
++ --disable-upnp \
++ --disable-aac \
++ --disable-audiofile \
++ --disable-fifo \
++ --disable-ffmpeg \
++ --disable-id3 \
++ --disable-mms \
++ --disable-pipe-output \
++ --disable-recorder-output \
++ --disable-shout \
++ --disable-sndfile \
++ --disable-vorbis \
++ --disable-vorbis-encoder \
++ --with-tremor=yes \
++
++endif
++
++define Package/mpd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mpd $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/doc/mpdconf.example $(1)/etc/mpd.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/mpd.init $(1)/etc/init.d/mpd
++endef
++
++define Package/mpd-full/install
++$(call Package/mpd/install,$1)
++endef
++
++define Package/mpd-mini/install
++$(call Package/mpd/install,$1)
++endef
++
++define Package/mpd-avahi-service/install
++ $(INSTALL_DIR) $(1)/etc/avahi/services
++ $(INSTALL_DATA) ./files/mpd.service $(1)/etc/avahi/services/
++endef
++
++$(eval $(call BuildPackage,mpd-full))
++$(eval $(call BuildPackage,mpd-mini))
++$(eval $(call BuildPackage,mpd-avahi-service))
+diff --git a/feeds/packages/sound/mpd/files/mpd.init b/feeds/packages/sound/mpd/files/mpd.init
+new file mode 100644
+index 0000000..55cb515
+--- /dev/null
++++ b/feeds/packages/sound/mpd/files/mpd.init
+@@ -0,0 +1,26 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007-2014 OpenWrt.org
++
++START=93
++
++USE_PROCD=1
++
++PROG=/usr/bin/mpd
++CONFIGFILE=/etc/mpd.conf
++NICEPRIO=-10
++
++#TODO: Add uci config - nice, config
++
++start_service() {
++ #create mpd directories from config
++ local pld=`grep ^playlist_directory "$CONFIGFILE" | cut -d "\"" -f 2 | sed "s/~/\/root/g"`
++ if [ ! -d $pld ]; then
++ mkdir -m 0755 -p $pld
++ fi
++
++ procd_open_instance
++ procd_set_param command "$PROG" --no-daemon "$CONFIGFILE"
++ # Give MPD some real-time priority
++ procd_set_param nice "$NICEPRIO"
++ procd_close_instance
++}
+diff --git a/feeds/packages/sound/mpd/files/mpd.service b/feeds/packages/sound/mpd/files/mpd.service
+new file mode 100644
+index 0000000..a545f24
+--- /dev/null
++++ b/feeds/packages/sound/mpd/files/mpd.service
+@@ -0,0 +1,9 @@
++<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
++<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
++<service-group>
++ <name replace-wildcards="yes">%h</name>
++ <service>
++ <type>_mpd._tcp</type>
++ <port>6600</port>
++ </service>
++</service-group>
+diff --git a/feeds/packages/sound/mpd/patches/210-support_raw_pcm_streams.patch b/feeds/packages/sound/mpd/patches/210-support_raw_pcm_streams.patch
+new file mode 100644
+index 0000000..2c94c26
+--- /dev/null
++++ b/feeds/packages/sound/mpd/patches/210-support_raw_pcm_streams.patch
+@@ -0,0 +1,10 @@
++--- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx
+++++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx
++@@ -765,6 +765,7 @@ static const char *const ffmpeg_mime_typ
++ "audio/qcelp",
++ "audio/vorbis",
++ "audio/vorbis+ogg",
+++ "audio/wav",
++ "audio/x-8svx",
++ "audio/x-16sv",
++ "audio/x-aac",
+diff --git a/feeds/packages/sound/mpd/patches/220-handle_slow_server_stream_startup.patch b/feeds/packages/sound/mpd/patches/220-handle_slow_server_stream_startup.patch
+new file mode 100644
+index 0000000..15c51f8
+--- /dev/null
++++ b/feeds/packages/sound/mpd/patches/220-handle_slow_server_stream_startup.patch
+@@ -0,0 +1,16 @@
++--- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx
+++++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx
++@@ -458,6 +458,13 @@ ffmpeg_probe(Decoder *decoder, InputStre
++
++ unsigned char buffer[BUFFER_SIZE];
++ size_t nbytes = decoder_read(decoder, is, buffer, BUFFER_SIZE);
+++
+++ if ((nbytes > 0) && (nbytes < 1024))
+++ {
+++ // Gobble some more data if header is small
+++ nbytes += decoder_read(decoder, is, buffer + nbytes, BUFFER_SIZE - nbytes);
+++ }
+++
++ if (nbytes <= PADDING || !is.LockRewind(IgnoreError()))
++ return nullptr;
++
+diff --git a/feeds/packages/sound/mpg123/Makefile b/feeds/packages/sound/mpg123/Makefile
+new file mode 100644
+index 0000000..60697c0
+--- /dev/null
++++ b/feeds/packages/sound/mpg123/Makefile
+@@ -0,0 +1,101 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mpg123
++PKG_VERSION:=1.22.3
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.mpg123.de/download/
++PKG_MD5SUM:=fca857bc5ad0d2070cd38bd5f0f85f1c
++PKG_MAINTAINER:=Zoltan HERPAI <wigyori@uid0.hu>
++
++PKG_FIXUP:=libtool
++
++PKG_LICENSE:=LGPL-2.1 GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mpg123/Default
++ URL:=http://www.mpg123.de
++ DEPENDS:=@BUILD_PATENTED
++endef
++
++define Package/libmpg123
++ $(call Package/mpg123/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=fast console mpeg audio decoder library
++ DEPENDS:=+libltdl
++endef
++
++define Package/mpg123
++ $(call Package/mpg123/Default)
++ SECTION:=sound
++ CATEGORY:=Sound
++ TITLE:=fast console mpeg audio player
++ DEPENDS+=+libmpg123 +alsa-lib
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --enable-shared \
++ --enable-static \
++ --with-cpu=generic_nofpu \
++ --with-default-audio=alsa \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/include/mpg123.h \
++ $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libmpg123.{la,a,so*} \
++ $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/mpg123
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/mpg123/* \
++ $(1)/usr/lib/mpg123
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libmpg123.pc \
++ $(1)/usr/lib/pkgconfig
++endef
++
++define Package/libmpg123/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libmpg123.so* \
++ $(1)/usr/lib/
++endef
++
++define Package/mpg123/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/mpg123{,-id3dump,-strip} \
++ $(PKG_INSTALL_DIR)/usr/bin/out123
++ $(1)/usr/bin
++
++ $(INSTALL_DIR) $(1)/usr/lib/mpg123
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/mpg123/* \
++ $(1)/usr/lib/mpg123
++endef
++
++$(eval $(call BuildPackage,libmpg123))
++$(eval $(call BuildPackage,mpg123))
+diff --git a/feeds/packages/sound/pianod/Makefile b/feeds/packages/sound/pianod/Makefile
+new file mode 100644
+index 0000000..86a5b3a
+--- /dev/null
++++ b/feeds/packages/sound/pianod/Makefile
+@@ -0,0 +1,110 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pianod
++PKG_VERSION:=174
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://deviousfish.com/Downloads/pianod/
++PKG_MD5SUM:=cca2143e4a5301dea8c0cb9fcbd20881
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=MIT VARIOUS
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/pianod
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+libao +libfaad2 +libmad +libpolarssl +libjson-c +libgcrypt +libpthread
++ TITLE:=Pandora radio daemon
++ USERID:=pianod=88:pianod=88
++ URL:=http://deviousfish.com/pianod/
++endef
++
++define Package/pianod/description
++ pianod is a Pandora music player client with line-oriented and Websocket control interfaces.
++ A simple protocol makes for easy clients, mix scripting, integration with a
++ home automation system, use as multiple-user music system for home or office.
++ Documentation and configuration information can be found at:
++ http://deviousfish.com/pianod/
++endef
++
++define Package/pianod-client
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+pianod
++ TITLE:=Pandora radio daemon WebUI
++ URL:=http://deviousfish.com/pianod/
++endef
++
++define Package/pianod-client/description
++ Web client UI and remote player viewer for pianod
++ Examples --- (Note: The viewer.* files need not be on the pianod host)
++ Main interface: http://pianod-host:4446/pianod
++ Remote viewer: file:///<path>/viewer.html?server=pianod-host:4446 --or--
++ http://pianod-host:4446/pianod/viewer.html?server=pianod-host:4446
++endef
++
++CONFIGURE_ARGS+= --with-polarssl
++
++PIANOD_CLIENT:=pianod-client-compiled-51.tar.gz
++
++define Download/pianod-client
++ URL:=$(PKG_SOURCE_URL)
++ FILE:=$(PIANOD_CLIENT)
++ MD5SUM:=abbdee5627bcee6a00c8304da8b4e2e7
++endef
++
++define Package/pianod/conffiles
++/etc/pianod/startscript
++/etc/pianod/users
++endef
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ ifneq ($(CONFIG_PACKAGE_pianod-client),)
++ $(eval $(call Download,pianod-client))
++ mkdir -p $(PKG_BUILD_DIR)/pianod-client
++ $(TAR) -xf $(DL_DIR)/$(PIANOD_CLIENT) --strip=1 -C $(PKG_BUILD_DIR)/pianod-client
++ endif
++endef
++
++define Package/pianod-client/Configure
++endef
++
++define Package/pianod-client/Compile
++endef
++
++define Package/pianod/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/pianod $(1)/usr/bin/
++# These scripts need ksh (install mksh and link)
++# $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/piano $(1)/usr/bin/
++# $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/runmix $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/etc/pianod
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/contrib/startscript-example $(1)/etc/pianod/startscript
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/pianod.init $(1)/etc/init.d/pianod
++endef
++
++define Package/pianod-client/install
++ $(INSTALL_DIR) $(1)/www/pianod
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/pianod-client/*.{html,js,gif,jpeg,css} $(1)/www/pianod/
++endef
++
++$(eval $(call BuildPackage,pianod))
++$(eval $(call BuildPackage,pianod-client))
+diff --git a/feeds/packages/sound/pianod/files/pianod.init b/feeds/packages/sound/pianod/files/pianod.init
+new file mode 100644
+index 0000000..b232944
+--- /dev/null
++++ b/feeds/packages/sound/pianod/files/pianod.init
+@@ -0,0 +1,42 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++NAME=pianod
++START=95
++
++USE_PROCD=1
++
++PD_USER=$NAME
++PD_STARTSCRIPT=/etc/$NAME/startscript
++PD_PASSWDFILE=/etc/$NAME/users
++PD_WEBUI=/www/$NAME
++
++start_service() {
++ # Take group ownership of audio devices
++ chown root:$NAME /dev/snd/* /dev/mixer /dev/dsp
++ chmod 664 /dev/snd/* /dev/mixer /dev/dsp
++
++ procd_open_instance
++
++ procd_set_param command "/usr/bin/$NAME"
++
++ procd_append_param command -n $PD_USER
++ procd_append_param command -i "$PD_STARTSCRIPT"
++ procd_append_param command -u "$PD_PASSWDFILE"
++ [ -d "$PD_WEBUI" ] && procd_append_param command -c "$PD_WEBUI"
++ # No HTTPS support without certificates
++ procd_append_param command -s 0
++
++ procd_close_instance
++}
++
++# Wait for service to exit and release sockets
++reload_service() {
++ stop
++ sleep 2
++ start
++}
++
++restart() {
++ reload_service
++}
+diff --git a/feeds/packages/sound/pianod/patches/010-Configure_add_SSL_options.patch b/feeds/packages/sound/pianod/patches/010-Configure_add_SSL_options.patch
+new file mode 100644
+index 0000000..2c26779
+--- /dev/null
++++ b/feeds/packages/sound/pianod/patches/010-Configure_add_SSL_options.patch
+@@ -0,0 +1,42 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -31,8 +31,6 @@ AC_CHECK_LIB([pthread], [pthread_create]
++ # with it, but don't consider it an error.
++ # PKG_CHECK_MODULES only validates that pkg-config returns stuff; it doesn't
++ # validate that these are correct, so check lib to make sure they're right.
++-PKG_CHECK_MODULES([gnutls], [gnutls],,
++- [AC_MSG_WARN([No pkg-config for libgnutls])])
++ PKG_CHECK_MODULES([ao], [ao],,
++ [AC_MSG_WARN([No pkg-config for libao])])
++ PKG_CHECK_MODULES([mad], [mad],,
++@@ -42,12 +40,28 @@ PKG_CHECK_MODULES([json], [json-c],,
++ [PKG_CHECK_MODULES([json], [json0],,
++ [AC_MSG_WARN([No pkg-config for json-c (aka libjson0, libjson)])])])])
++
+++
++ # Network communication stuff:
++ AC_CHECK_LIB([gcrypt], [gcry_cipher_open],,
++ [AC_MSG_ERROR([Cannot find required library: libgcrypt],1)])
++-AC_CHECK_LIB([gnutls], [gnutls_record_recv],,
+++# Check for SSL option
+++AC_ARG_WITH(polarssl, [ --with-polarssl Build waitress with PolarSSL (default GNUTLS)], [
+++ AC_MSG_RESULT(>>Using PolarSSL)
+++ HAS_POLARSSL=1
+++ AC_DEFINE([USE_POLARSSL], 1, [Build for PolarSSL])
+++ PKG_CHECK_MODULES([polarssl], [polarssl],,
+++ [AC_MSG_WARN([No pkg-config for libpolarssl])])
+++ AC_CHECK_LIB([polarssl], [ssl_set_session],,
+++ [AC_MSG_ERROR([Cannot find required library: libpolarssl (aka polarssl)],1)])] )
+++AM_CONDITIONAL([USE_POLARSSL],[test "x$HAS_POLARSSL" = "x1"])
+++
+++if test "x$HAS_POLARSSL" != x1 ; then
+++ PKG_CHECK_MODULES([gnutls], [gnutls],,
+++ [AC_MSG_WARN([No pkg-config for libgnutls])])
+++ AC_CHECK_LIB([gnutls], [gnutls_record_recv],,
++ [AC_MSG_ERROR([Cannot find required library: libgnutls (aka gnutls)],1)])
++-AC_CHECK_FUNCS(gnutls_transport_set_int2 gnutls_sec_param_to_pk_bits)
+++ AC_CHECK_FUNCS(gnutls_transport_set_int2 gnutls_sec_param_to_pk_bits)
+++fi
++
++ # Bloody json library may be linked via -ljson, or -ljson-c depending on
++ # the platform. Try both.
+diff --git a/feeds/packages/sound/pianod/patches/020-Use_package_config_h_for_all_modules.patch b/feeds/packages/sound/pianod/patches/020-Use_package_config_h_for_all_modules.patch
+new file mode 100644
+index 0000000..25569cc
+--- /dev/null
++++ b/feeds/packages/sound/pianod/patches/020-Use_package_config_h_for_all_modules.patch
+@@ -0,0 +1,59 @@
++--- a/src/libpiano/config.h
+++++ /dev/null
++@@ -1 +0,0 @@
++-#define PACKAGE "libpiano"
++--- a/src/libwaitress/config.h
+++++ /dev/null
++@@ -1 +0,0 @@
++-#define PACKAGE "libwaitress"
++--- a/src/libpiano/piano.h
+++++ b/src/libpiano/piano.h
++@@ -39,6 +39,8 @@ THE SOFTWARE.
++ * http://pan-do-ra-api.wikia.com
++ */
++
+++#define LIBPIANO_NAME "libpiano"
+++
++ #define PIANO_RPC_HOST "tuner.pandora.com"
++ #define PIANO_RPC_PATH "/services/json/?"
++
++--- a/src/libwaitress/waitress.c
+++++ b/src/libwaitress/waitress.c
++@@ -922,14 +922,14 @@ static WaitressReturn_t WaitressSendRequ
++ if (WaitressProxyEnabled (waith) && !waith->url.tls) {
++ snprintf (buf, WAITRESS_BUFFER_SIZE,
++ "%s http://%s:%s/%s HTTP/" WAITRESS_HTTP_VERSION "\r\n"
++- "Host: %s\r\nUser-Agent: " PACKAGE "\r\nConnection: Close\r\n",
+++ "Host: %s\r\nUser-Agent: " LIBWAITRESS_NAME "\r\nConnection: Close\r\n",
++ (waith->method == WAITRESS_METHOD_GET ? "GET" : "POST"),
++ waith->url.host,
++ WaitressDefaultPort (&waith->url), path, waith->url.host);
++ } else {
++ snprintf (buf, WAITRESS_BUFFER_SIZE,
++ "%s /%s HTTP/" WAITRESS_HTTP_VERSION "\r\n"
++- "Host: %s\r\nUser-Agent: " PACKAGE "\r\nConnection: Close\r\n",
+++ "Host: %s\r\nUser-Agent: " LIBWAITRESS_NAME "\r\nConnection: Close\r\n",
++ (waith->method == WAITRESS_METHOD_GET ? "GET" : "POST"),
++ path, waith->url.host);
++ }
++--- a/src/libwaitress/waitress.h
+++++ b/src/libwaitress/waitress.h
++@@ -29,6 +29,8 @@ THE SOFTWARE.
++ #include <stdbool.h>
++ #include <gnutls/gnutls.h>
++
+++#define LIBWAITRESS_NAME "libwaitress"
+++
++ #define WAITRESS_BUFFER_SIZE 10*1024
++
++ typedef enum {
++--- a/src/libpiano/request.c
+++++ b/src/libpiano/request.c
++@@ -40,6 +40,7 @@ THE SOFTWARE.
++ #include <stdio.h>
++ #include <string.h>
++ /* needed for urlencode */
+++#include <config.h>
++ #include <waitress.h>
++
++ #include "piano.h"
+diff --git a/feeds/packages/sound/pianod/patches/030-Waitress_add_polarssl_variant.patch b/feeds/packages/sound/pianod/patches/030-Waitress_add_polarssl_variant.patch
+new file mode 100644
+index 0000000..ad27e9b
+--- /dev/null
++++ b/feeds/packages/sound/pianod/patches/030-Waitress_add_polarssl_variant.patch
+@@ -0,0 +1,333 @@
++--- a/src/libwaitress/waitress.h
+++++ b/src/libwaitress/waitress.h
++@@ -27,7 +27,12 @@ THE SOFTWARE.
++ #include <stdlib.h>
++ #include <unistd.h>
++ #include <stdbool.h>
+++
+++#if defined(USE_POLARSSL)
+++typedef struct _polarssl_ctx polarssl_ctx;
+++#else
++ #include <gnutls/gnutls.h>
+++#endif
++
++ #define LIBWAITRESS_NAME "libwaitress"
++
++@@ -102,8 +107,9 @@ typedef struct {
++ WaitressUrl_t url;
++ WaitressUrl_t proxy;
++
+++#if !defined(USE_POLARSSL)
++ gnutls_certificate_credentials_t tlsCred;
++-
+++#endif
++ /* per-request data */
++ struct {
++ int sockfd;
++@@ -121,7 +127,11 @@ typedef struct {
++ WaitressReturn_t (*read) (void *, char *, const size_t, size_t *);
++ WaitressReturn_t (*write) (void *, const char *, const size_t);
++
+++#if defined(USE_POLARSSL)
+++ polarssl_ctx* sslCtx;
+++#else
++ gnutls_session_t tlsSession;
+++#endif
++ } request;
++ } WaitressHandle_t;
++
++--- a/src/pianod.c
+++++ b/src/pianod.c
++@@ -531,8 +531,11 @@ static bool initialize_libraries (APPSTA
++ gcry_check_version (NULL);
++ gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
++ gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
+++
+++#if !defined(USE_POLARSSL)
++ int crystatus = gnutls_global_init ();
++ if (crystatus == GNUTLS_E_SUCCESS) {
+++#endif
++ PianoReturn_t status = PianoInit (&app->ph, app->settings.partnerUser, app->settings.partnerPassword,
++ app->settings.device, app->settings.inkey, app->settings.outkey);
++ if (status == PIANO_RET_OK) {
++@@ -545,11 +548,13 @@ static bool initialize_libraries (APPSTA
++ } else {
++ flog (LOG_ERROR, "initialize_libraries: PianoInit: %s", PianoErrorToStr (status));
++ }
+++#if !defined(USE_POLARSSL)
++ gnutls_global_deinit ();
++ } else {
++ flog (LOG_ERROR, "initialize_libraries: gnutls_global_init: %s", gcry_strerror (crystatus));
++
++ }
+++#endif
++ return false;
++ }
++
++@@ -728,7 +733,9 @@ int main (int argc, char **argv) {
++ PianoDestroyPlaylist (app.song_history);
++ PianoDestroyPlaylist (app.playlist);
++ WaitressFree (&app.waith);
+++#if !defined(USE_POLARSSL)
++ gnutls_global_deinit ();
+++#endif
++ settings_destroy (&app.settings);
++ }
++
++--- a/src/libwaitress/waitress.c
+++++ b/src/libwaitress/waitress.c
++@@ -41,11 +41,33 @@ THE SOFTWARE.
++ #include <assert.h>
++ #include <stdint.h>
++
++-#include <gnutls/x509.h>
++
++ #include "config.h"
++ #include "waitress.h"
++
+++#if defined(USE_POLARSSL)
+++
+++#include <polarssl/ssl.h>
+++#include <polarssl/entropy.h>
+++#include <polarssl/ctr_drbg.h>
+++#include <polarssl/x509.h>
+++#include <polarssl/sha1.h>
+++
+++struct _polarssl_ctx
+++{
+++ ssl_context ssl;
+++ ssl_session session;
+++ entropy_context entrophy;
+++ ctr_drbg_context rnd;
+++};
+++
+++#else
+++
+++// Use gnutls by default (USE_POLARSSL not defined)
+++#include <gnutls/x509.h>
+++
+++#endif
+++
++ #define strcaseeq(a,b) (strcasecmp(a,b) == 0)
++ #define WAITRESS_HTTP_VERSION "1.1"
++
++@@ -56,6 +78,13 @@ typedef struct {
++
++ static WaitressReturn_t WaitressReceiveHeaders (WaitressHandle_t *, size_t *);
++
+++// gnutls wants (void *) and polarssl want (unsigned char *)
+++#if defined(USE_POLARSSL)
+++#define BUFFER_CAST unsigned char
+++#else
+++#define BUFFER_CAST void
+++#endif
+++
++ #define READ_RET(buf, count, size) \
++ if ((wRet = waith->request.read (waith, buf, count, size)) != \
++ WAITRESS_RET_OK) { \
++@@ -444,7 +473,7 @@ static int WaitressPollLoop (int fd, sho
++ * @param write count bytes
++ * @return number of written bytes or -1 on error
++ */
++-static ssize_t WaitressPollWrite (void *data, const void *buf, size_t count) {
+++static ssize_t WaitressPollWrite (void *data, const BUFFER_CAST *buf, size_t count) {
++ int pollres = -1;
++ ssize_t retSize;
++ WaitressHandle_t *waith = data;
++@@ -478,13 +507,20 @@ static WaitressReturn_t WaitressOrdinary
++ return waith->request.readWriteRet;
++ }
++
++-static WaitressReturn_t WaitressGnutlsWrite (void *data, const char *buf,
+++static WaitressReturn_t WaitressTlsWrite (void *data, const char *buf,
++ const size_t size) {
++ WaitressHandle_t *waith = data;
+++#if defined(USE_POLARSSL)
+++
+++ if (ssl_write (&waith->request.sslCtx->ssl, buf, size) < 0) {
+++ return WAITRESS_RET_TLS_WRITE_ERR;
+++ }
+++#else
++
++ if (gnutls_record_send (waith->request.tlsSession, buf, size) < 0) {
++ return WAITRESS_RET_TLS_WRITE_ERR;
++ }
+++#endif
++ return waith->request.readWriteRet;
++ }
++
++@@ -494,7 +530,7 @@ static WaitressReturn_t WaitressGnutlsWr
++ * @param buffer size
++ * @return number of read bytes or -1 on error
++ */
++-static ssize_t WaitressPollRead (void *data, void *buf, size_t count) {
+++static ssize_t WaitressPollRead (void *data, BUFFER_CAST *buf, size_t count) {
++ int pollres = -1;
++ ssize_t retSize;
++ WaitressHandle_t *waith = data;
++@@ -531,16 +567,34 @@ static WaitressReturn_t WaitressOrdinary
++ return waith->request.readWriteRet;
++ }
++
++-static WaitressReturn_t WaitressGnutlsRead (void *data, char *buf,
+++static WaitressReturn_t WaitressTlsRead (void *data, char *buf,
++ const size_t size, size_t *retSize) {
++ WaitressHandle_t *waith = data;
++
+++#if defined(USE_POLARSSL)
+++ int ret;
+++
+++ *retSize = 0;
+++ waith->request.readWriteRet = WAITRESS_RET_OK;
+++ ret = ssl_read (&waith->request.sslCtx->ssl, buf, size);
+++
+++ if (ret < 0) {
+++ if (ret != POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY) {
+++ waith->request.readWriteRet = WAITRESS_RET_TLS_READ_ERR;
+++ }
+++
+++ return waith->request.readWriteRet;
+++ }
+++
+++ *retSize = ret;
+++#else
++ ssize_t ret = gnutls_record_recv (waith->request.tlsSession, buf, size);
++ if (ret < 0) {
++ return WAITRESS_RET_TLS_READ_ERR;
++ } else {
++ *retSize = ret;
++ }
+++#endif
++ return waith->request.readWriteRet;
++ }
++
++@@ -727,10 +781,28 @@ static int WaitressParseStatusline (cons
++ /* verify server certificate
++ */
++ static WaitressReturn_t WaitressTlsVerify (const WaitressHandle_t *waith) {
+++
+++#if defined(USE_POLARSSL)
+++ unsigned char fingerprint[20];
+++
+++ const x509_crt* cert = ssl_get_peer_cert (&waith->request.sslCtx->ssl);
+++
+++ if (NULL == cert) {
+++ return WAITRESS_RET_TLS_HANDSHAKE_ERR;
+++ }
+++
+++ sha1 (cert->raw.p, cert->raw.len, fingerprint);
+++
+++ if (memcmp (fingerprint, waith->tlsFingerprint, sizeof (fingerprint)) != 0) {
+++ return WAITRESS_RET_TLS_FINGERPRINT_MISMATCH;
+++ }
+++
+++#else
++ gnutls_session_t session = waith->request.tlsSession;
++ unsigned int certListSize;
++ const gnutls_datum_t *certList;
++ gnutls_x509_crt_t cert;
+++ char fingerprint[20];
++
++ if (gnutls_certificate_type_get (session) != GNUTLS_CRT_X509) {
++ return WAITRESS_RET_TLS_HANDSHAKE_ERR;
++@@ -750,7 +822,6 @@ static WaitressReturn_t WaitressTlsVerif
++ return WAITRESS_RET_TLS_HANDSHAKE_ERR;
++ }
++
++- char fingerprint[20];
++ size_t fingerprintSize = sizeof (fingerprint);
++ if (gnutls_x509_crt_get_fingerprint (cert, GNUTLS_DIG_SHA1, fingerprint,
++ &fingerprintSize) != 0) {
++@@ -763,7 +834,7 @@ static WaitressReturn_t WaitressTlsVerif
++ }
++
++ gnutls_x509_crt_deinit (cert);
++-
+++#endif
++ return WAITRESS_RET_OK;
++ }
++
++@@ -880,6 +951,12 @@ static WaitressReturn_t WaitressConnect
++ }
++ }
++
+++#if defined(USE_POLARSSL)
+++ ssl_set_hostname (&waith->request.sslCtx->ssl, waith->url.host);
+++ if (ssl_handshake (&waith->request.sslCtx->ssl) != 0) {
+++ return WAITRESS_RET_TLS_HANDSHAKE_ERR;
+++ }
+++#else
++ /* Ignore return code as connection will likely still succeed */
++ gnutls_server_name_set (waith->request.tlsSession, GNUTLS_NAME_DNS,
++ waith->url.host, strlen (waith->url.host));
++@@ -887,14 +964,15 @@ static WaitressReturn_t WaitressConnect
++ if (gnutls_handshake (waith->request.tlsSession) != GNUTLS_E_SUCCESS) {
++ return WAITRESS_RET_TLS_HANDSHAKE_ERR;
++ }
+++#endif
++
++ if ((wRet = WaitressTlsVerify (waith)) != WAITRESS_RET_OK) {
++ return wRet;
++ }
++
++ /* now we can talk encrypted */
++- waith->request.read = WaitressGnutlsRead;
++- waith->request.write = WaitressGnutlsWrite;
+++ waith->request.read = WaitressTlsRead;
+++ waith->request.write = WaitressTlsWrite;
++ }
++
++ return WAITRESS_RET_OK;
++@@ -1120,6 +1198,21 @@ WaitressReturn_t WaitressFetchCall (Wait
++ waith->request.contentLengthKnown = false;
++
++ if (waith->url.tls) {
+++#if defined(USE_POLARSSL)
+++ waith->request.sslCtx = calloc (1, sizeof(polarssl_ctx));
+++
+++ entropy_init (&waith->request.sslCtx->entrophy);
+++ ctr_drbg_init (&waith->request.sslCtx->rnd, entropy_func, &waith->request.sslCtx->entrophy, "libwaitress", 11);
+++ ssl_init (&waith->request.sslCtx->ssl);
+++
+++ ssl_set_endpoint (&waith->request.sslCtx->ssl, SSL_IS_CLIENT);
+++ ssl_set_authmode (&waith->request.sslCtx->ssl, SSL_VERIFY_NONE);
+++ ssl_set_rng (&waith->request.sslCtx->ssl, ctr_drbg_random, &waith->request.sslCtx->rnd);
+++ ssl_set_session (&waith->request.sslCtx->ssl, &waith->request.sslCtx->session);
+++ ssl_set_bio (&waith->request.sslCtx->ssl,
+++ WaitressPollRead, waith,
+++ WaitressPollWrite, waith);
+++#else
++ gnutls_init (&waith->request.tlsSession, GNUTLS_CLIENT);
++ gnutls_set_default_priority (waith->request.tlsSession);
++
++@@ -1137,6 +1230,7 @@ WaitressReturn_t WaitressFetchCall (Wait
++ WaitressPollRead);
++ gnutls_transport_set_push_function (waith->request.tlsSession,
++ WaitressPollWrite);
+++#endif
++ }
++
++ /* buffer is required for connect already */
++@@ -1148,15 +1242,22 @@ WaitressReturn_t WaitressFetchCall (Wait
++ if ((wRet = WaitressSendRequest (waith)) == WAITRESS_RET_OK) {
++ wRet = WaitressReceiveResponse (waith);
++ }
+++#if !defined(USE_POLARSSL)
++ if (waith->url.tls) {
++ gnutls_bye (waith->request.tlsSession, GNUTLS_SHUT_RDWR);
++ }
+++#endif
++ }
++
++ /* cleanup */
++ if (waith->url.tls) {
+++#if defined(USE_POLARSSL)
+++ ssl_free (&waith->request.sslCtx->ssl);
+++ free (waith->request.sslCtx);
+++#else
++ gnutls_deinit (waith->request.tlsSession);
++ gnutls_certificate_free_credentials (waith->tlsCred);
+++#endif
++ }
++ if (waith->request.sockfd != -1) {
++ close (waith->request.sockfd);
+diff --git a/feeds/packages/sound/portaudio/Makefile b/feeds/packages/sound/portaudio/Makefile
+new file mode 100644
+index 0000000..ffa5cfb
+--- /dev/null
++++ b/feeds/packages/sound/portaudio/Makefile
+@@ -0,0 +1,70 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=portaudio
++PKG_VERSION:=19_20140130
++PKG_RELEASE:=1
++
++PKG_SOURCE:=pa_stable_v$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=http://www.portaudio.com/archives/
++PKG_MD5SUM:=7f220406902af9dca009668e198cbd23
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=LICENSE.txt
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/portaudio
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+alsa-lib +libpthread +librt
++ TITLE:=Portable cross-platform audio I/O
++ URL:=http://www.portaudio.com/
++endef
++
++define Package/portaudio/description
++ PortAudio is a free, cross-platform, open-source, audio I/O library. It lets
++ you write simple audio programs in 'C' or C++ that will compile and run on many
++ platforms including Windows, Macintosh OS X, and Unix (OSS/ALSA). It is
++ intended to promote the exchange of audio software between developers on
++ different platforms. Many applications use PortAudio for Audio I/O.
++endef
++
++CONFIGURE_ARGS+= \
++ --with-alsa \
++ --without-asihpi \
++ --without-jack \
++ --with-oss \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/portaudio.h \
++ $(PKG_INSTALL_DIR)/usr/include/pa_linux_alsa.h \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libportaudio.{a,so*} \
++ $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/portaudio-*.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/portaudio/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libportaudio.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,portaudio))
+diff --git a/feeds/packages/sound/pulseaudio/Makefile b/feeds/packages/sound/pulseaudio/Makefile
+new file mode 100644
+index 0000000..d14f056
+--- /dev/null
++++ b/feeds/packages/sound/pulseaudio/Makefile
+@@ -0,0 +1,195 @@
++#
++# Copyright (C) 2011-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pulseaudio
++PKG_VERSION:=7.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://freedesktop.org/software/pulseaudio/releases/
++PKG_MD5SUM:=09668b660ffb32f2639cfd6fdc9d3b37
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=GPL LICENSE
++
++PKG_BUILD_DEPENDS:=intltool/host
++
++PKG_FIXUP:=autoreconf
++PKG_USE_MIPS16:=0
++
++PKG_INSTALL = 1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/pulseaudio/Default
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+libspeexdsp +libsndfile +libltdl +libpthread \
++ +librt +alsa-lib +libopenssl +libwrap +libcap $(ICONV_DEPENDS) $(INTL_DEPENDS)
++ TITLE:=Network sound server
++ MAINTAINER:=Peter Wagner <tripolar@gmx.at>
++ URL:=http://www.pulseaudio.org
++ PROVIDES:=pulseaudio
++ USERID:=pulse=51:pulse=51
++endef
++
++define Package/pulseaudio-daemon
++ $(call Package/pulseaudio/Default)
++ DEPENDS+= +libjson-c
++endef
++
++define Package/pulseaudio/Default/description
++ PulseAudio (formerly Polypaudio) is a cross-platform, networked sound server.
++endef
++
++define Package/pulseaudio-daemon/description
++ $(call Package/pulseaudio/Default/description)
++endef
++
++define Package/pulseaudio-daemon/conffiles
++/etc/pulse/client.conf
++/etc/pulse/daemon.conf
++/etc/pulse/default.pa
++/etc/pulse/system.pa
++endef
++
++define Package/pulseaudio-tools
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+libsndfile +pulseaudio
++ TITLE:=Tools for Pulseaudio
++ URL:=http://www.pulseaudio.org
++endef
++
++define Package/pulseaudio-profiles
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=pulseaudio
++ TITLE:=Profiles for Pulseaudio
++ URL:=http://www.pulseaudio.org
++endef
++
++CONFIGURE_ARGS += \
++ --with-system-user=pulse \
++ --with-system-group=pulse \
++ --with-access-group=audio \
++ --with-database=simple \
++ --enable-alsa \
++ --disable-hal \
++ --disable-gconf \
++ --disable-nls \
++ --disable-manpages \
++ --enable-oss-output \
++ --disable-oss-wrapper \
++ --disable-samplerate \
++ --disable-per-user-esound-socket \
++ --disable-solaris \
++ --disable-gtk2 \
++ --disable-glib2 \
++ --disable-jack \
++ --disable-asyncns \
++ --disable-lirc \
++ --disable-bluez \
++ --disable-udev \
++ --without-fftw \
++ --disable-avahi \
++ --disable-dbus
++
++CONFIGURE_VARS += \
++ PKG_CONFIG_LIBDIR="$(STAGING_DIR)/usr/lib/pkgconfig"
++
++#SUPP_LIBS:=-L$(INTL_PREFIX)/lib -L$(ICONV_PREFIX)/lib
++TARGET_CFLAGS += -std=gnu99
++
++define Build/InstallDev
++ $(INSTALL_DIR) \
++ $(1)/usr/lib/pkgconfig \
++ $(1)/usr/include/pulse \
++ $(1)/usr/lib \
++ $(1)/usr/lib/pulseaudio
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/pulse/* \
++ $(1)/usr/include/pulse
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/*.pc \
++ $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.so* \
++ $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pulseaudio/* \
++ $(1)/usr/lib/pulseaudio/
++endef
++
++define Package/pulseaudio-daemon/install
++ $(INSTALL_DIR) \
++ $(1)/etc/pulse \
++ $(1)/etc/init.d \
++ $(1)/usr/bin \
++ $(1)/usr/lib \
++ $(1)/usr/lib/pulseaudio \
++ $(1)/usr/lib/pulse-$(PKG_VERSION)/modules
++
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/pulseaudio \
++ $(1)/usr/bin/pulseaudio
++
++ $(INSTALL_BIN) \
++ ./files/pulseaudio.init \
++ $(1)/etc/init.d/pulseaudio
++
++ $(INSTALL_CONF) \
++ $(PKG_INSTALL_DIR)/etc/pulse/* \
++ $(1)/etc/pulse
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/*.so* \
++ $(1)/usr/lib/
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pulseaudio/* \
++ $(1)/usr/lib/pulseaudio/
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pulse-$(PKG_VERSION)/modules/lib*.so \
++ $(1)/usr/lib/
++
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pulse-$(PKG_VERSION)/modules/module*.so \
++ $(1)/usr/lib/pulse-$(PKG_VERSION)/modules/
++
++ chmod -R 0644 $(1)/etc/pulse/*
++endef
++
++define Package/pulseaudio-tools/install
++ $(INSTALL_DIR) \
++ $(1)/usr/bin
++
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/pa* \
++ $(1)/usr/bin/
++endef
++
++define Package/pulseaudio-profiles/install
++ $(INSTALL_DIR) \
++ $(1)/usr/share/pulseaudio/alsa-mixer/paths \
++ $(1)/usr/share/pulseaudio/alsa-mixer/profile-sets
++
++ $(INSTALL_CONF) \
++ $(PKG_INSTALL_DIR)/usr/share/pulseaudio/alsa-mixer/paths/* \
++ $(1)/usr/share/pulseaudio/alsa-mixer/paths
++
++ $(INSTALL_CONF) \
++ $(PKG_INSTALL_DIR)/usr/share/pulseaudio/alsa-mixer/profile-sets/* \
++ $(1)/usr/share/pulseaudio/alsa-mixer/profile-sets
++endef
++
++$(eval $(call BuildPackage,pulseaudio-daemon))
++$(eval $(call BuildPackage,pulseaudio-tools))
++$(eval $(call BuildPackage,pulseaudio-profiles))
+diff --git a/feeds/packages/sound/pulseaudio/files/pulseaudio.init b/feeds/packages/sound/pulseaudio/files/pulseaudio.init
+new file mode 100644
+index 0000000..1262b94
+--- /dev/null
++++ b/feeds/packages/sound/pulseaudio/files/pulseaudio.init
+@@ -0,0 +1,29 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2011 OpenWrt.org
++
++START=65
++STOP=65
++
++USE_PROCD=1
++PROG=/usr/bin/pulseaudio
++
++start_service() {
++ [ -d /var/run/pulse ] || {
++ mkdir -m 0755 -p /var/run/pulse
++ chmod 0750 /var/run/pulse
++ chown pulse:pulse /var/run/pulse
++ }
++ [ -d /var/lib/pulse ] || {
++ mkdir -m 0755 -p /var/lib/pulse
++ chmod 0750 /var/lib/pulse
++ chown pulse:pulse /var/lib/pulse
++ }
++
++ chown root:pulse /dev/snd/* /dev/mixer /dev/dsp
++ chmod 664 /dev/snd/* /dev/mixer /dev/dsp
++
++ procd_open_instance
++ procd_set_param command $PROG --system --disallow-exit --disallow-module-loading --disable-shm --exit-idle-time=-1 --realtime=false
++ procd_close_instance
++}
++
+diff --git a/feeds/packages/sound/pulseaudio/patches/001-no_default_64mb_alloc.patch b/feeds/packages/sound/pulseaudio/patches/001-no_default_64mb_alloc.patch
+new file mode 100644
+index 0000000..8dd000b
+--- /dev/null
++++ b/feeds/packages/sound/pulseaudio/patches/001-no_default_64mb_alloc.patch
+@@ -0,0 +1,11 @@
++--- a/src/pulsecore/memblock.c
+++++ b/src/pulsecore/memblock.c
++@@ -55,7 +55,7 @@
++ * stored in SHM and our OS does not commit the memory before we use
++ * it for the first time. */
++ #define PA_MEMPOOL_SLOTS_MAX 1024
++-#define PA_MEMPOOL_SLOT_SIZE (64*1024)
+++#define PA_MEMPOOL_SLOT_SIZE 64
++
++ #define PA_MEMEXPORT_SLOTS_MAX 128
++
+diff --git a/feeds/packages/sound/pulseaudio/patches/002-xlocale.patch b/feeds/packages/sound/pulseaudio/patches/002-xlocale.patch
+new file mode 100644
+index 0000000..ef3ee91
+--- /dev/null
++++ b/feeds/packages/sound/pulseaudio/patches/002-xlocale.patch
+@@ -0,0 +1,12 @@
++diff --git a/pulsecore/core-util.c b/pulsecore/core-util.c
++index ba31221..824368a 100644
++--- a/src/pulsecore/core-util.c
+++++ b/src/pulsecore/core-util.c
++@@ -54,7 +54,6 @@
++
++ #ifdef HAVE_STRTOD_L
++ #include <locale.h>
++-#include <xlocale.h>
++ #endif
++
++ #ifdef HAVE_SCHED_H
+diff --git a/feeds/packages/sound/shairplay/Makefile b/feeds/packages/sound/shairplay/Makefile
+new file mode 100644
+index 0000000..81ba7b6
+--- /dev/null
++++ b/feeds/packages/sound/shairplay/Makefile
+@@ -0,0 +1,50 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=shairplay
++PKG_VERSION:=2015-09-29
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/juhovh/shairplay.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=498bc5bcdd305e04721f94a04b9f26a7da72673f
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/shairplay
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+libao +libavahi-compat-libdnssd +libltdl +libpthread
++ TITLE:=Shairplay
++endef
++
++define Package/shairplay/description
++ Free portable AirPlay server implementation similar to ShairPort.
++endef
++
++define Package/shairplay/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/shairplay $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/share/shairplay
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/airport.key $(1)/usr/share/shairplay/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) files/shairplay.init $(1)/etc/init.d/shairplay
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) files/shairplay.config $(1)/etc/config/shairplay
++endef
++
++$(eval $(call BuildPackage,shairplay))
+diff --git a/feeds/packages/sound/shairplay/files/shairplay.config b/feeds/packages/sound/shairplay/files/shairplay.config
+new file mode 100644
+index 0000000..6e1f939
+--- /dev/null
++++ b/feeds/packages/sound/shairplay/files/shairplay.config
+@@ -0,0 +1,10 @@
++config shairplay main
++ option disabled '1'
++ option respawn '1'
++ option apname 'AirPlay'
++ option port '5000'
++ option password ''
++ option hwaddr ''
++ option ao_driver 'oss'
++ option ao_devicename ''
++ option ao_deviceid ''
+diff --git a/feeds/packages/sound/shairplay/files/shairplay.init b/feeds/packages/sound/shairplay/files/shairplay.init
+new file mode 100644
+index 0000000..093a168
+--- /dev/null
++++ b/feeds/packages/sound/shairplay/files/shairplay.init
+@@ -0,0 +1,51 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=90
++USE_PROCD=1
++
++append_arg() {
++ local cfg="$1"
++ local var="$2"
++ local opt="$3"
++ local def="$4"
++ local val
++
++ config_get val "$cfg" "$var"
++ [ -n "$val" -o -n "$def" ] && procd_append_param command $opt="${val:-$def}"
++}
++
++start_instance() {
++ local cfg="$1"
++ local aux
++
++ config_get_bool aux "$cfg" 'disabled' '0'
++ [ "$aux" = 1 ] && return 1
++
++ procd_open_instance
++
++ procd_set_param command /usr/bin/shairplay
++
++ append_arg "$cfg" apname "--apname" "AirPlay"
++ append_arg "$cfg" port "--server_port"
++ append_arg "$cfg" password "--password"
++ append_arg "$cfg" hwaddr "--hwaddr"
++
++ append_arg "$cfg" ao_driver "--ao_driver"
++ append_arg "$cfg" ao_devicename "--ao_devicename"
++ append_arg "$cfg" ao_deviceid "--ao_deviceid"
++
++ config_get_bool aux "$cfg" 'respawn' '0'
++ [ "$aux" = 1 ] && procd_set_param respawn
++
++ procd_close_instance
++}
++
++service_triggers() {
++ procd_add_reload_trigger "shairplay"
++}
++
++start_service() {
++ config_load shairplay
++ config_foreach start_instance shairplay
++}
+diff --git a/feeds/packages/sound/shairplay/patches/001-key_file_dir.patch b/feeds/packages/sound/shairplay/patches/001-key_file_dir.patch
+new file mode 100644
+index 0000000..3c5e3a5
+--- /dev/null
++++ b/feeds/packages/sound/shairplay/patches/001-key_file_dir.patch
+@@ -0,0 +1,11 @@
++--- a/src/shairplay.c
+++++ b/src/shairplay.c
++@@ -346,7 +346,7 @@ main(int argc, char *argv[])
++ raop_cbs.audio_destroy = audio_destroy;
++ raop_cbs.audio_set_volume = audio_set_volume;
++
++- raop = raop_init_from_keyfile(10, &raop_cbs, "airport.key", NULL);
+++ raop = raop_init_from_keyfile(10, &raop_cbs, "/usr/share/shairplay/airport.key", NULL);
++ if (raop == NULL) {
++ fprintf(stderr, "Could not initialize the RAOP service\n");
++ fprintf(stderr, "Please make sure the airport.key file is in the current directory.\n");
+diff --git a/feeds/packages/sound/shairplay/patches/002-libavahi-compat-dnssd.patch b/feeds/packages/sound/shairplay/patches/002-libavahi-compat-dnssd.patch
+new file mode 100644
+index 0000000..ff70e24
+--- /dev/null
++++ b/feeds/packages/sound/shairplay/patches/002-libavahi-compat-dnssd.patch
+@@ -0,0 +1,11 @@
++--- a/src/lib/dnssd.c
+++++ b/src/lib/dnssd.c
++@@ -167,7 +167,7 @@ dnssd_init(int *error)
++ return NULL;
++ }
++ #elif USE_LIBDL
++- dnssd->module = dlopen("libdns_sd.so", RTLD_LAZY);
+++ dnssd->module = dlopen("libdns_sd.so.1", RTLD_LAZY);
++ if (!dnssd->module) {
++ if (error) *error = DNSSD_ERROR_LIBNOTFOUND;
++ free(dnssd);
+diff --git a/feeds/packages/sound/shairplay/patches/003-fix_big-endian.patch b/feeds/packages/sound/shairplay/patches/003-fix_big-endian.patch
+new file mode 100644
+index 0000000..4db204e
+--- /dev/null
++++ b/feeds/packages/sound/shairplay/patches/003-fix_big-endian.patch
+@@ -0,0 +1,11 @@
++--- a/src/lib/alac/alac.c
+++++ b/src/lib/alac/alac.c
++@@ -29,7 +29,7 @@
++ *
++ */
++
++-static const int host_bigendian = 0;
+++#define host_bigendian (htonl(42) == 42)
++
++ #include <stdio.h>
++ #include <stdlib.h>
+diff --git a/feeds/packages/sound/shairport-sync/Makefile b/feeds/packages/sound/shairport-sync/Makefile
+new file mode 100644
+index 0000000..4d98052
+--- /dev/null
++++ b/feeds/packages/sound/shairport-sync/Makefile
+@@ -0,0 +1,102 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++# updated to work with latest source from abrasive
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=shairport-sync
++PKG_VERSION:=2.6
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/mikebrady/shairport-sync.git
++PKG_SOURCE_VERSION:=$(PKG_VERSION)
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>, Mike Brady <mikebrady@eircom.net>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_SOURCE_SUBDIR)
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING LICENSES shairport.c
++
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++CONFIGURE_ARGS+= \
++ --with-alsa \
++ --with-avahi \
++ --with-soxr \
++ --with-metadata
++
++ifeq ($(BUILD_VARIANT),openssl)
++ CONFIGURE_ARGS+= --with-ssl=openssl
++endif
++ifeq ($(BUILD_VARIANT),polarssl)
++ CONFIGURE_ARGS+= --with-ssl=polarssl
++endif
++
++define Package/shairport-sync/default
++ SECTION:=sound
++ CATEGORY:=Sound
++ TITLE:=iPhone/iTunes/AirPlay/Quicktime Player compatible Audio Player
++ DEPENDS:=@AUDIO_SUPPORT +libpthread +libavahi-client +alsa-lib +libconfig +libdaemon +libsoxr +libpopt
++ URL:=http://github.com/mikebrady/shairport-sync
++endef
++
++define Package/shairport-sync-openssl
++ $(Package/shairport-sync/default)
++ TITLE+= (openssl)
++ DEPENDS+= +PACKAGE_shairport-sync-openssl:libopenssl
++ VARIANT:=openssl
++endef
++
++define Package/shairport-sync-polarssl
++ $(Package/shairport-sync/default)
++ TITLE+= (polarssl)
++ DEPENDS+= +PACKAGE_shairport-sync-polarssl:libpolarssl
++ VARIANT:=polarssl
++ DEFAULT_VARIANT:=1
++endef
++
++define Package/shairport-sync/default/description
++ Shairport Sync plays audio from iTunes and AirPlay sources, including
++ iOS devices, Quicktime Player and third party sources such as forkedDaapd.
++ Audio played by a Shairport Sync-powered device stays synchronised with the source
++ and hence with similar devices playing the same source.
++ Thus, for example, synchronised multi-room audio is possible without difficulty.
++ (Hence the name Shairport Sync, BTW.)
++ Shairport Sync does not support AirPlay video or photo streaming.
++ Ensure Kernel Modules > Sound Support > kmod-sound-core is selected.
++ Also select kmod-usb-audio if you want to use USB-connected sound cards.
++endef
++Package/shairport-sync-openssl/description = $(Package/shairport-sync/default/description)
++Package/shairport-sync-polarssl/description = $(Package/shairport-sync/default/description)
++
++define Package/shairport-sync/default/conffiles
++/etc/shairport-sync.conf
++endef
++Package/shairport-sync-openssl/conffiles = $(Package/shairport-sync/default/conffiles)
++Package/shairport-sync-polarssl/conffiles = $(Package/shairport-sync/default/conffiles)
++
++define Package/shairport-sync/default/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/shairport-sync $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/scripts/shairport-sync.conf $(1)/etc/shairport-sync.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/shairport-sync.init $(1)/etc/init.d/shairport-sync
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/shairport-sync.config $(1)/etc/config/shairport-sync
++endef
++Package/shairport-sync-openssl/install = $(Package/shairport-sync/default/install)
++Package/shairport-sync-polarssl/install = $(Package/shairport-sync/default/install)
++
++$(eval $(call BuildPackage,shairport-sync-openssl))
++$(eval $(call BuildPackage,shairport-sync-polarssl))
+diff --git a/feeds/packages/sound/shairport-sync/files/shairport-sync.config b/feeds/packages/sound/shairport-sync/files/shairport-sync.config
+new file mode 100644
+index 0000000..0640bde
+--- /dev/null
++++ b/feeds/packages/sound/shairport-sync/files/shairport-sync.config
+@@ -0,0 +1,54 @@
++# Use your own config file
++config shairport-sync 'shairport_sync_file'
++ option disabled '1'
++ option respawn '1'
++ option conf_custom '1'
++ option conf_file '/etc/shairport-sync.conf'
++
++# Use OpenWrt UCI config
++config shairport-sync 'shairport_sync'
++ option disabled '1'
++ option respawn '1'
++ # General
++ option name 'Shairport-Sync'
++ option password ''
++ option interpolation '' # basic/soxr
++ option output_backend '' # alsa/pipe/stdout/ao/dummy/pulse/sndio
++ option mdns_backend '' # avahi/external-avahi/dns-sd/external-dns-sd/tinysvcmdns
++ option port '' # 5000
++ option udp_port_base '' # 6001
++ option udp_port_range '' # 100
++ option statistics '' # no/yes
++ option drift '' # 88
++ option resync_threshold '' # 2205
++ option log_verbosity '' # 0/1/2/3
++ option ignore_volume_control '' # no/yes
++ option volume_range_db '' # 30 to 150
++ # Latencies
++ option latencies_default '' # 88200
++ option latencies_itunes '' # 99400
++ option latencies_airplay '' # 88200
++ option latencies_forked_daapd '' # 99400
++ # Metadata
++ option metadata_enabled '' # no/yes
++ option metadata_cover_art '' # no/yes
++ option metadata_pipe_name '' # /tmp/shairport-sync-metadata
++ # Session Control
++ option sesctl_run_before_play_begins '' # /etc/shairport-sync-start.sh
++ option sesctl_run_after_play_ends '' # /etc/shairport-sync-stop.sh
++ option sesctl_wait_for_completion '' # no/yes
++ option sesctl_session_interruption '' # no/yes
++ option sesctl_session_timeout '' # 120
++ # ALSA
++ option alsa_output_device '' # default
++ option alsa_mixer_control_name '' # PCM
++ option alsa_mixer_device '' # default
++ option alsa_latency_offset '' # 0
++ option alsa_buffer_length '' # 6615
++ # Pipe
++ option pipe_name '' # /tmp/shairport-sync-audio
++ option pipe_latency_offset '' # 0
++ option pipe_buffer_length '' # 44100
++ # Stdout
++ option stdout_latency_offset '' # 0
++ option stdout_buffer_length '' # 44100
+diff --git a/feeds/packages/sound/shairport-sync/files/shairport-sync.init b/feeds/packages/sound/shairport-sync/files/shairport-sync.init
+new file mode 100644
+index 0000000..ac4b589
+--- /dev/null
++++ b/feeds/packages/sound/shairport-sync/files/shairport-sync.init
+@@ -0,0 +1,135 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=99
++USE_PROCD=1
++
++append_num() {
++ local cfg="$1"
++ local file="$2"
++ local var="$3"
++ local opt="$4"
++ local def="$5"
++ local val
++
++ config_get val "$cfg" "$var"
++ [ -n "$val" -o -n "$def" ] && echo -e "\t$opt = ${val:-$def};" >> $file
++}
++append_str() {
++ local cfg="$1"
++ local file="$2"
++ local var="$3"
++ local opt="$4"
++ local def="$5"
++ local val
++
++ config_get val "$cfg" "$var"
++ [ -n "$val" -o -n "$def" ] && echo -e "\t$opt = \"${val:-$def}\";" >> $file
++}
++
++start_instance() {
++ local cfg=$1
++ local conf_custom conf_file aux
++
++ config_get_bool aux "$cfg" 'disabled' '0'
++ [ "$aux" = 1 ] && return 1
++
++ config_get_bool conf_custom "$cfg" 'conf_custom' '0'
++ config_get conf_file "$cfg" "conf_file"
++ if [ $conf_custom -ne 1 ] && [ ! -n "$conf_file" ]; then
++ mkdir -p /var/etc
++ conf_file="/var/etc/shairport-sync-${cfg}.conf"
++
++ echo -e "// Automatically generated from UCI config\n" > $conf_file
++
++ # General
++ echo -e "general =" >> $conf_file
++ echo -e "{" >> $conf_file
++ append_str "$cfg" "$conf_file" name "name"
++ append_str "$cfg" "$conf_file" password "password"
++ append_str "$cfg" "$conf_file" interpolation "interpolation"
++ append_str "$cfg" "$conf_file" output_backend "output_backend"
++ append_str "$cfg" "$conf_file" mdns_backend "mdns_backend"
++ append_num "$cfg" "$conf_file" port "port"
++ append_num "$cfg" "$conf_file" udp_port_base "udp_port_base"
++ append_num "$cfg" "$conf_file" udp_port_range "udp_port_range"
++ append_str "$cfg" "$conf_file" statistics "statistics"
++ append_num "$cfg" "$conf_file" drift "drift"
++ append_num "$cfg" "$conf_file" resync_threshold "resync_threshold"
++ append_num "$cfg" "$conf_file" log_verbosity "log_verbosity"
++ append_str "$cfg" "$conf_file" ignore_volume_control "ignore_volume_control"
++ append_num "$cfg" "$conf_file" volume_range_db "volume_range_db"
++ echo -e "};\n" >> $conf_file
++
++ # Latencies
++ echo -e "latencies =" >> $conf_file
++ echo -e "{" >> $conf_file
++ append_num "$cfg" "$conf_file" latencies_default "default"
++ append_num "$cfg" "$conf_file" latencies_itunes "itunes"
++ append_num "$cfg" "$conf_file" latencies_airplay "airplay"
++ append_num "$cfg" "$conf_file" latencies_forked_daapd "forkedDaapd"
++ echo -e "};\n" >> $conf_file
++
++ # Metadata
++ echo -e "metadata =" >> $conf_file
++ echo -e "{" >> $conf_file
++ append_str "$cfg" "$conf_file" metadata_enabled "enabled"
++ append_str "$cfg" "$conf_file" metadata_cover_art "include_cover_art"
++ append_str "$cfg" "$conf_file" metadata_pipe_name "pipe_name"
++ echo -e "};\n" >> $conf_file
++
++ # Session control
++ echo -e "sessioncontrol =" >> $conf_file
++ echo -e "{" >> $conf_file
++ append_str "$cfg" "$conf_file" sesctl_run_before_play_begins "run_this_before_play_begins"
++ append_str "$cfg" "$conf_file" sesctl_run_after_play_ends "run_this_after_play_ends"
++ append_str "$cfg" "$conf_file" sesctl_wait_for_completion "wait_for_completion"
++ append_str "$cfg" "$conf_file" sesctl_session_interruption "allow_session_interruption"
++ append_num "$cfg" "$conf_file" sesctl_session_timeout "session_timeout"
++ echo -e "};\n" >> $conf_file
++
++ # Alsa audio back end
++ echo -e "alsa =" >> $conf_file
++ echo -e "{" >> $conf_file
++ append_str "$cfg" "$conf_file" alsa_output_device "output_device"
++ append_str "$cfg" "$conf_file" alsa_mixer_control_name "mixer_control_name"
++ append_str "$cfg" "$conf_file" alsa_mixer_device "mixer_device"
++ append_num "$cfg" "$conf_file" alsa_latency_offset "audio_backend_latency_offset"
++ append_num "$cfg" "$conf_file" alsa_buffer_length "audio_backend_buffer_desired_length"
++ echo -e "};\n" >> $conf_file
++
++ # Pipe audio back end
++ echo -e "pipe =" >> $conf_file
++ echo -e "{" >> $conf_file
++ append_str "$cfg" "$conf_file" pipe_name "name"
++ append_num "$cfg" "$conf_file" pipe_latency_offset "audio_backend_latency_offset"
++ append_num "$cfg" "$conf_file" pipe_buffer_length "audio_backend_buffer_desired_length"
++ echo -e "};\n" >> $conf_file
++
++ # Stdout audio back end
++ echo -e "stdout =" >> $conf_file
++ echo -e "{" >> $conf_file
++ append_num "$cfg" "$conf_file" stdout_latency_offset "audio_backend_latency_offset"
++ append_num "$cfg" "$conf_file" stdout_buffer_length "audio_backend_buffer_desired_length"
++ echo -e "};\n" >> $conf_file
++ fi
++
++ procd_open_instance
++
++ procd_set_param command /usr/bin/shairport-sync
++ procd_append_param command -c $conf_file
++
++ config_get_bool aux "$cfg" 'respawn' '0'
++ [ "$aux" = 1 ] && procd_set_param respawn
++
++ procd_close_instance
++}
++
++service_triggers() {
++ procd_add_reload_trigger "shairport-sync"
++}
++
++start_service() {
++ config_load shairport-sync
++ config_foreach start_instance shairport-sync
++}
+diff --git a/feeds/packages/sound/shairport/Makefile b/feeds/packages/sound/shairport/Makefile
+new file mode 100644
+index 0000000..aeb63f7
+--- /dev/null
++++ b/feeds/packages/sound/shairport/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=shairport
++PKG_VERSION:=2014-10-28
++PKG_RELEASE:=2
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/abrasive/shairport.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=d679d19a4bd66cc220dabfd23ad748c34e95995c
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=LICENSES
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/shairport
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+libpthread +libopenssl +libavahi-client +alsa-lib
++ TITLE:=ShairPort AirPort Express emulator (un-maintained)
++endef
++
++define Package/shairport/description
++ This program emulates an AirPort Express for the purpose of streaming
++ music from iTunes and compatible iPods. It implements a server for the
++ Apple RAOP protocol.
++ ShairPort does not support AirPlay v2 (video and photo streaming).
++
++ It supports multiple simultaneous streams, if your audio output chain
++ (as detected by libao) does so.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++LIBS:=-lm -lcrypto -lpthread -lavahi-common -lavahi-client -lasound
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS) $(LIBS)"
++
++define Package/shairport/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/shairport $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) files/shairport.init $(1)/etc/init.d/shairport
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) files/shairport.config $(1)/etc/config/shairport
++endef
++
++$(eval $(call BuildPackage,shairport))
+diff --git a/feeds/packages/sound/shairport/files/shairport.config b/feeds/packages/sound/shairport/files/shairport.config
+new file mode 100644
+index 0000000..9b2165a
+--- /dev/null
++++ b/feeds/packages/sound/shairport/files/shairport.config
+@@ -0,0 +1,36 @@
++config shairport main
++ option disabled '1'
++ option respawn '1'
++ option bname 'AirPort'
++ option password ''
++ option port '5002'
++ option buffer ''
++ option log_file ''
++ option err_file ''
++ option meta_dir ''
++ option cmd_start ''
++ option cmd_stop ''
++ option cmd_wait '0'
++ option audio_output 'alsa'
++ option mdns 'avahi'
++
++ # options for alsa output
++ option output_dev ''
++ option mixer_dev ''
++ option mixer_type ''
++ option mixer_control ''
++ option mixer_index ''
++
++ # options for ao output
++ option ao_driver ''
++ option ao_name ''
++ option ao_id ''
++ option ao_options ''
++
++ # options for pipe output
++ option output_fifo ''
++
++ # options for pulse output
++ option pulse_server ''
++ option pulse_sink ''
++ option pulse_appname ''
+diff --git a/feeds/packages/sound/shairport/files/shairport.init b/feeds/packages/sound/shairport/files/shairport.init
+new file mode 100644
+index 0000000..341ff6f
+--- /dev/null
++++ b/feeds/packages/sound/shairport/files/shairport.init
+@@ -0,0 +1,104 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2013-2014 OpenWrt.org
++
++START=94
++USE_PROCD=1
++
++append_arg() {
++ local cfg="$1"
++ local var="$2"
++ local opt="$3"
++ local def="$4"
++ local val
++
++ config_get val "$cfg" "$var"
++ [ -n "$val" -o -n "$def" ] && procd_append_param command $opt "${val:-$def}"
++}
++
++append_bool() {
++ local cfg="$1"
++ local var="$2"
++ local opt="$3"
++ local def="$4"
++ local val
++
++ config_get_bool val "$cfg" "$var" "$def"
++ [ "$val" = 1 ] && procd_append_param command "$opt"
++}
++
++start_instance() {
++ local cfg="$1"
++ local ao dev aux
++
++ config_get_bool aux "$cfg" 'disabled' '0'
++ [ "$aux" = 1 ] && return 1
++
++ procd_open_instance
++
++ procd_set_param command /usr/bin/shairport
++
++ append_arg "$cfg" bname "-a" "AirPort"
++ append_arg "$cfg" log_file "-l"
++ append_arg "$cfg" err_file "-e"
++ append_arg "$cfg" meta_dir "-M"
++ append_arg "$cfg" buffer "-b"
++ append_arg "$cfg" port "-p"
++ append_arg "$cfg" password "-k"
++ append_arg "$cfg" mdns "-m"
++
++ append_arg "$cfg" cmd_start "-B"
++ append_arg "$cfg" cmd_stop "-E"
++ append_bool "$cfg" cmd_wait "-w"
++
++ append_arg "$cfg" audio_output "-o"
++
++ config_get ao "$cfg" audio_output ""
++ if [ "$ao" = "alsa" ]; then
++ config_get dev "$cfg" output_dev ""
++ if [ -n "$dev" ]; then
++ procd_append_param command "--"
++ append_arg "$cfg" output_dev "-d"
++ append_arg "$cfg" mixer_dev "-m"
++ append_arg "$cfg" mixer_type "-t"
++ append_arg "$cfg" mixer_control "-c"
++ append_arg "$cfg" mixer_index "-i"
++ fi
++ elif [ "$ao" = "ao" ]; then
++ config_get dev "$cfg" ao_driver ""
++ if [ -n "$dev" ]; then
++ procd_append_param command "--"
++ append_arg "$cfg" ao_driver "-d"
++ append_arg "$cfg" ao_id "-i"
++ append_arg "$cfg" ao_name "-n"
++ append_arg "$cfg" ao_options "-o"
++ fi
++ elif [ "$ao" = "pipe" ]; then
++ config_get dev "$cfg" output_fifo ""
++ if [ -n "$dev" ]; then
++ procd_append_param command "--"
++ append_arg "$cfg" output_fifo ""
++ fi
++ elif [ "$ao" = "pulse" ]; then
++ config_get dev "$cfg" pulse_server ""
++ if [ -n "$dev" ]; then
++ procd_append_param command "--"
++ append_arg "$cfg" pulse_server "-a"
++ append_arg "$cfg" pulse_sink "-s"
++ append_arg "$cfg" pulse_appname "-n"
++ fi
++ fi
++
++ config_get_bool aux "$cfg" 'respawn' '0'
++ [ "$aux" = 1 ] && procd_set_param respawn
++
++ procd_close_instance
++}
++
++service_triggers() {
++ procd_add_reload_trigger "shairport"
++}
++
++start_service() {
++ config_load shairport
++ config_foreach start_instance shairport
++}
+diff --git a/feeds/packages/sound/shairport/patches/001-disable_pulseaudio.patch b/feeds/packages/sound/shairport/patches/001-disable_pulseaudio.patch
+new file mode 100644
+index 0000000..7f0407e
+--- /dev/null
++++ b/feeds/packages/sound/shairport/patches/001-disable_pulseaudio.patch
+@@ -0,0 +1,12 @@
++--- a/configure
+++++ b/configure
++@@ -59,7 +59,7 @@ do_pkg_config()
++
++ do_pkg_config OpenSSL openssl
++-do_pkg_config libao ao CONFIG_AO
++-do_pkg_config PulseAudio libpulse-simple CONFIG_PULSE
+++#do_pkg_config libao ao CONFIG_AO
+++#do_pkg_config PulseAudio libpulse-simple CONFIG_PULSE
++ do_pkg_config ALSA alsa CONFIG_ALSA
++ do_pkg_config Avahi\ client avahi-client CONFIG_AVAHI
++
+diff --git a/feeds/packages/sound/shine/Makefile b/feeds/packages/sound/shine/Makefile
+new file mode 100644
+index 0000000..d13cff6
+--- /dev/null
++++ b/feeds/packages/sound/shine/Makefile
+@@ -0,0 +1,64 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=shine
++PKG_VERSION:=3.1.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/savonet/shine/releases/download/$(PKG_VERSION)/
++PKG_MD5SUM:=fcad8108335f4b051b303fbdf3fca3fe
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_USE_MIPS16:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/shine
++ SECTION:=sound
++ CATEGORY:=Sound
++ TITLE:=Super fast fixed-point MP3 encoder
++ URL:=https://github.com/savonet/shine
++endef
++
++define Package/shine/description
++ savonet/shine is a blazing fast mp3 encoding library implemented in fixed-point
++ arithmetic. The library can thus be used to perform super fast mp3 encoding on
++ architectures without a FPU, such as armel, etc.. It is also, however, also
++ super fast on architectures with a FPU!
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/shine \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libshine.{a,so*} \
++ $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/shine.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/shine/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/shineenc $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libshine.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,shine))
+diff --git a/feeds/packages/sound/shine/patches/001-fix_mips64_bswap.patch b/feeds/packages/sound/shine/patches/001-fix_mips64_bswap.patch
+new file mode 100644
+index 0000000..8c42297
+--- /dev/null
++++ b/feeds/packages/sound/shine/patches/001-fix_mips64_bswap.patch
+@@ -0,0 +1,11 @@
++--- a/src/bin/wave.c
+++++ b/src/bin/wave.c
++@@ -168,7 +168,7 @@ unsigned char wave_open(const char *fnam
++ }
++
++ #ifdef SHINE_BIG_ENDIAN
++-#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
+++#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))
++ #define bswap_16(x) __builtin_bswap16(x)
++ #else
++ #define bswap_16(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
+diff --git a/feeds/packages/sound/sox/Makefile b/feeds/packages/sound/sox/Makefile
+new file mode 100644
+index 0000000..eda080f
+--- /dev/null
++++ b/feeds/packages/sound/sox/Makefile
+@@ -0,0 +1,89 @@
++#
++# Copyright (C) 2008 David Cooper <dave@kupesoft.com>
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sox
++PKG_VERSION:=14.4.1
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@SF/sox
++PKG_MD5SUM:=ff9ca6aca972549de0e80e8e30ed379c
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++PKG_LICENSE:=LGPL-2.1 GPL-2.0
++PKG_LICENSE_FILES:=COPYING LICENSE.LGPL LICENSE.GPL
++
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_LDFLAGS+= \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib
++
++define Package/sox
++ SECTION:=sound
++ CATEGORY:=Sound
++ DEPENDS:=+BUILD_PATENTED:lame-lib +BUILD_PATENTED:libmad +BUILD_PATENTED:libid3tag \
++ +libvorbis +libvorbisidec +alsa-lib +libsndfile +libflac \
++ +libmagic +libpng +libffmpeg
++ TITLE:=Sox is a general purpose sound converter/player/recorder
++ URL:=http://sox.sourceforge.net/
++endef
++
++define Package/sox/description
++ SoX is a command line utility that can convert various formats
++ of computer audio files in to other formats. It can also apply
++ various effects to these sound files during the conversion.
++ As an added bonus, SoX can play and record audio files on
++ several unix-style platforms.
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --without-oss \
++ --without-ao \
++ --with-alsa \
++ --without-libltdl \
++ --with-ogg \
++ --with-flac \
++ --with-ffmpeg \
++ --without-amr-wb \
++ --without-amr-nb \
++ --without-samplerate \
++ --without-ladspa \
++ --$(if $(CONFIG_BUILD_PATENTED),with-mad,without-mad) \
++ --$(if $(CONFIG_BUILD_PATENTED),with-lame,without-lame) \
++ --$(if $(CONFIG_BUILD_PATENTED),with-id3tag,without-id3tag) \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libsox.{a,so*,la} \
++ $(1)/usr/lib/
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/* \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/sox/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/{play,rec,sox} $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsox.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,sox))
+diff --git a/feeds/packages/sound/sox/patches/001-cross_compile.patch b/feeds/packages/sound/sox/patches/001-cross_compile.patch
+new file mode 100644
+index 0000000..7996ece
+--- /dev/null
++++ b/feeds/packages/sound/sox/patches/001-cross_compile.patch
+@@ -0,0 +1,22 @@
++--- a/src/Makefile.am
+++++ b/src/Makefile.am
++@@ -144,7 +144,7 @@ EXTRA_DIST = monkey.wav optional-fmts.am
++ CMakeLists.txt soxconfig.h.cmake \
++ tests.sh testall.sh tests.bat testall.bat test-comments
++
++-all: sox$(EXEEXT) play rec soxi sox_sample_test$(EXEEXT) example0$(EXEEXT) example1$(EXEEXT) example2$(EXEEXT) example3$(EXEEXT) example4$(EXEEXT) example5$(EXEEXT)
+++all: sox$(EXEEXT) play rec
++
++ play rec: sox$(EXEEXT)
++ if test "$(PLAYRECLINKS)" = "yes"; then \
++--- sox-14.4.1/src/Makefile.in
+++++ sox-14.4.1/src/Makefile.in
++@@ -2904,7 +2904,7 @@
++ uninstall-libLTLIBRARIES uninstall-pkglibLTLIBRARIES
++
++
++-all: sox$(EXEEXT) play rec soxi sox_sample_test$(EXEEXT) example0$(EXEEXT) example1$(EXEEXT) example2$(EXEEXT) example3$(EXEEXT) example4$(EXEEXT) example5$(EXEEXT)
+++all: sox$(EXEEXT) play rec
++
++ play rec: sox$(EXEEXT)
++ if test "$(PLAYRECLINKS)" = "yes"; then \
+diff --git a/feeds/packages/sound/sox/patches/010-fix_uclibc_build_issue.patch b/feeds/packages/sound/sox/patches/010-fix_uclibc_build_issue.patch
+new file mode 100644
+index 0000000..06454cd
+--- /dev/null
++++ b/feeds/packages/sound/sox/patches/010-fix_uclibc_build_issue.patch
+@@ -0,0 +1,19 @@
++--- sox-14.4.1.orig/src/formats.c
+++++ sox-14.4.1/src/formats.c
++@@ -409,7 +409,7 @@ static void UNUSED rewind_pipe(FILE * fp
++ #if defined _FSTDIO || defined _NEWLIB_VERSION || defined __APPLE__
++ fp->_p -= PIPE_AUTO_DETECT_SIZE;
++ fp->_r += PIPE_AUTO_DETECT_SIZE;
++-#elif defined __GLIBC__
+++#elif defined __GLIBC__ && ! defined __UCLIBC__
++ fp->_IO_read_ptr = fp->_IO_read_base;
++ #elif defined _MSC_VER || defined _WIN32 || defined _WIN64 || defined _ISO_STDIO_ISO_H
++ fp->_ptr = fp->_base;
++@@ -417,7 +417,6 @@ static void UNUSED rewind_pipe(FILE * fp
++ /* To fix this #error, either simply remove the #error line and live without
++ * file-type detection with pipes, or add support for your compiler in the
++ * lines above. Test with cat monkey.wav | ./sox --info - */
++- #error FIX NEEDED HERE
++ #define NO_REWIND_PIPE
++ (void)fp;
++ #endif
+diff --git a/feeds/packages/sound/sox/patches/020-ffmpeg-0.11.patch b/feeds/packages/sound/sox/patches/020-ffmpeg-0.11.patch
+new file mode 100644
+index 0000000..61f6e23
+--- /dev/null
++++ b/feeds/packages/sound/sox/patches/020-ffmpeg-0.11.patch
+@@ -0,0 +1,129 @@
++--- a/configure
+++++ b/configure
++@@ -15825,9 +15825,9 @@
++ cat >>confdefs.h <<_ACEOF
++ #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
++ _ACEOF
++- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for av_open_input_file in -lavformat" >&5
++-$as_echo_n "checking for av_open_input_file in -lavformat... " >&6; }
++-if ${ac_cv_lib_avformat_av_open_input_file+:} false; then :
+++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for avformat_open_input in -lavformat" >&5
+++$as_echo_n "checking for avformat_open_input in -lavformat... " >&6; }
+++if ${ac_cv_lib_avformat_avformat_open_input+:} false; then :
++ $as_echo_n "(cached) " >&6
++ else
++ ac_check_lib_save_LIBS=$LIBS
++@@ -15841,27 +15841,27 @@
++ #ifdef __cplusplus
++ extern "C"
++ #endif
++-char av_open_input_file ();
+++char avformat_open_input ();
++ int
++ main ()
++ {
++-return av_open_input_file ();
+++return avformat_open_input ();
++ ;
++ return 0;
++ }
++ _ACEOF
++ if ac_fn_c_try_link "$LINENO"; then :
++- ac_cv_lib_avformat_av_open_input_file=yes
+++ ac_cv_lib_avformat_avformat_open_input=yes
++ else
++- ac_cv_lib_avformat_av_open_input_file=no
+++ ac_cv_lib_avformat_avformat_open_input=no
++ fi
++ rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ LIBS=$ac_check_lib_save_LIBS
++ fi
++-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avformat_av_open_input_file" >&5
++-$as_echo "$ac_cv_lib_avformat_av_open_input_file" >&6; }
++-if test "x$ac_cv_lib_avformat_av_open_input_file" = xyes; then :
+++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_avformat_avformat_open_input" >&5
+++$as_echo "$ac_cv_lib_avformat_avformat_open_input" >&6; }
+++if test "x$ac_cv_lib_avformat_avformat_open_input" = xyes; then :
++ for ac_header in libavcodec/avcodec.h ffmpeg/avcodec.h
++ do :
++ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
++diff -Naur sox-14.4.0-orig/src/ffmpeg.c sox-14.4.0/src/ffmpeg.c
++--- sox-14.4.0-orig/src/ffmpeg.c 2012-06-12 00:35:53.459027469 -0400
+++++ sox-14.4.0/src/ffmpeg.c 2012-06-12 00:36:26.539028545 -0400
++@@ -93,7 +93,7 @@
++ #if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0)
++ enc->error_resilience = 1;
++ #else
++- enc->error_recognition = 1;
+++ enc->err_recognition = 1;
++ #endif
++
++ if (!codec || avcodec_open(enc, codec) < 0)
++@@ -157,7 +157,7 @@
++ static int startread(sox_format_t * ft)
++ {
++ priv_t * ffmpeg = (priv_t *)ft->priv;
++- AVFormatParameters params;
+++ AVDictionary *params;
++ int ret;
++ int i;
++
++@@ -172,7 +172,7 @@
++
++ /* Open file and get format */
++ memset(&params, 0, sizeof(params));
++- if ((ret = av_open_input_file(&ffmpeg->ctxt, ft->filename, NULL, 0, &params)) < 0) {
+++ if ((ret = avformat_open_input(&ffmpeg->ctxt, ft->filename, NULL, &params)) < 0) {
++ lsx_fail("ffmpeg cannot open file for reading: %s (code %d)", ft->filename, ret);
++ return SOX_EOF;
++ }
++@@ -231,7 +231,7 @@
++ /* If input buffer empty, read more data */
++ if (ffmpeg->audio_buf_index * 2 >= ffmpeg->audio_buf_size) {
++ if ((ret = av_read_frame(ffmpeg->ctxt, pkt)) < 0 &&
++- (ret == AVERROR_EOF || url_ferror(ffmpeg->ctxt->pb)))
+++ (ret == AVERROR_EOF || ffmpeg->ctxt->pb->error))
++ break;
++ ffmpeg->audio_buf_size = audio_decode_frame(ffmpeg, ffmpeg->audio_buf_aligned, AVCODEC_MAX_AUDIO_FRAME_SIZE);
++ ffmpeg->audio_buf_index = 0;
++@@ -373,13 +373,6 @@
++ return SOX_EOF;
++ }
++
++- /* set the output parameters (must be done even if no
++- parameters). */
++- if (av_set_parameters(ffmpeg->ctxt, NULL) < 0) {
++- lsx_fail("ffmpeg invalid output format parameters");
++- return SOX_EOF;
++- }
++-
++ /* Next line for debugging */
++ /* dump_format(ffmpeg->ctxt, 0, ft->filename, 1); */
++
++@@ -391,14 +384,14 @@
++
++ /* open the output file, if needed */
++ if (!(ffmpeg->fmt->flags & AVFMT_NOFILE)) {
++- if (url_fopen(&ffmpeg->ctxt->pb, ft->filename, URL_WRONLY) < 0) {
+++ if (avio_open(&ffmpeg->ctxt->pb, ft->filename, AVIO_FLAG_WRITE) < 0) {
++ lsx_fail("ffmpeg could not open `%s'", ft->filename);
++ return SOX_EOF;
++ }
++ }
++
++ /* write the stream header, if any */
++- av_write_header(ffmpeg->ctxt);
+++ avformat_write_header(ffmpeg->ctxt, NULL);
++
++ return SOX_SUCCESS;
++ }
++@@ -478,7 +471,7 @@
++ #if (LIBAVFORMAT_VERSION_INT < 0x340000)
++ url_fclose(&ffmpeg->ctxt->pb);
++ #else
++- url_fclose(ffmpeg->ctxt->pb);
+++ avio_close(ffmpeg->ctxt->pb);
++ #endif
++ }
++
+diff --git a/feeds/packages/sound/sox/patches/020-ffmpeg-2.x.patch b/feeds/packages/sound/sox/patches/020-ffmpeg-2.x.patch
+new file mode 100644
+index 0000000..44e7ebb
+--- /dev/null
++++ b/feeds/packages/sound/sox/patches/020-ffmpeg-2.x.patch
+@@ -0,0 +1,72 @@
++--- a/src/ffmpeg.c
+++++ b/src/ffmpeg.c
++@@ -50,6 +50,10 @@
++ #include <ctype.h>
++ #include "ffmpeg.h"
++
+++#ifndef AVCODEC_MAX_AUDIO_FRAME_SIZE
+++#define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000
+++#endif
+++
++ #ifndef CODEC_TYPE_AUDIO
++ #define CODEC_TYPE_AUDIO AVMEDIA_TYPE_AUDIO
++ #endif
++@@ -96,7 +100,7 @@ static int stream_component_open(priv_t
++ enc->err_recognition = 1;
++ #endif
++
++- if (!codec || avcodec_open(enc, codec) < 0)
+++ if (!codec || avcodec_open2(enc, codec, NULL) < 0)
++ return -1;
++ if (enc->codec_type != AVMEDIA_TYPE_AUDIO) {
++ lsx_fail("ffmpeg CODEC %x is not an audio CODEC", enc->codec_type);
++@@ -178,7 +182,7 @@ static int startread(sox_format_t * ft)
++ }
++
++ /* Get CODEC parameters */
++- if ((ret = av_find_stream_info(ffmpeg->ctxt)) < 0) {
+++ if ((ret = avformat_find_stream_info(ffmpeg->ctxt, NULL)) < 0) {
++ lsx_fail("ffmpeg could not find CODEC parameters for %s", ft->filename);
++ return SOX_EOF;
++ }
++@@ -256,7 +260,7 @@ static int stopread(sox_format_t * ft)
++ if (ffmpeg->audio_stream >= 0)
++ stream_component_close(ffmpeg, ffmpeg->audio_stream);
++ if (ffmpeg->ctxt) {
++- av_close_input_file(ffmpeg->ctxt);
+++ avformat_close_input(&ffmpeg->ctxt);
++ ffmpeg->ctxt = NULL; /* safety */
++ }
++
++@@ -267,16 +271,21 @@ static int stopread(sox_format_t * ft)
++ /*
++ * add an audio output stream
++ */
+++#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(54, 28, 0)
+++static AVStream *add_audio_stream(sox_format_t * ft, AVFormatContext *oc, enum AVCodecID codec_id)
+++#else
++ static AVStream *add_audio_stream(sox_format_t * ft, AVFormatContext *oc, enum CodecID codec_id)
+++#endif
++ {
++ AVCodecContext *c;
++ AVStream *st;
++
++- st = av_new_stream(oc, 1);
+++ st = avformat_new_stream(oc, NULL);
++ if (!st) {
++ lsx_fail("ffmpeg could not alloc stream");
++ return NULL;
++ }
+++ st->id = 1;
++
++ c = st->codec;
++ c->codec_id = codec_id;
++@@ -306,7 +315,7 @@ static int open_audio(priv_t * ffmpeg, A
++ }
++
++ /* open it */
++- if (avcodec_open(c, codec) < 0) {
+++ if (avcodec_open2(c, codec, NULL) < 0) {
++ lsx_fail("ffmpeg could not open CODEC");
++ return SOX_EOF;
++ }
+diff --git a/feeds/packages/sound/squeezelite/Makefile b/feeds/packages/sound/squeezelite/Makefile
+new file mode 100644
+index 0000000..8a1274c
+--- /dev/null
++++ b/feeds/packages/sound/squeezelite/Makefile
+@@ -0,0 +1,146 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=squeezelite
++PKG_VERSION:=1.8
++PKG_RELEASE=1
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=LICENSE.txt
++PKG_MAINTAINER:= Ted Hess <thess@kitschensync.net>
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://code.google.com/p/squeezelite/
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=8b8dfe6918ebe45ade5f3d9b68d453d7b8128d99
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_BUILD_DEPENDS:=libflac libvorbis libmad libfaad2 SQUEEZELITE_WMA:libffmpeg-audio-dec
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/squeezelite/default
++ SECTION:=sound
++ CATEGORY:=Sound
++ TITLE:=Headless squeezebox emulator
++ PROVIDES:=squeezelite
++ URL:=https://code.google.com/p/squeezelite/
++ DEPENDS:= +alsa-lib +SQUEEZELITE_RESAMPLE:libsoxr
++ MENU:=1
++endef
++
++define Package/squeezelite-full
++ $(call Package/squeezelite/default)
++ TITLE+= (full)
++ DEPENDS+= +libflac +libvorbis +libmad +libfaad2 \
++ +SQUEEZELITE_WMA:libffmpeg-audio-dec
++ VARIANT:=full
++endef
++
++define Package/squeezelite-mini
++ $(call Package/squeezelite/default)
++ TITLE+= (minimal)
++ VARIANT:=mini
++endef
++
++define Package/squeezelite/config/default
++
++ config SQUEEZELITE_WMA
++ bool "WMA/ALAC decode support"
++ help
++ Include WMA and ALAC decoding using ffmpeg
++ default n
++
++ config SQUEEZELITE_RESAMPLE
++ bool "Resample support"
++ help
++ Include support for resampling using libsoxr
++ default n
++
++ config SQUEEZELITE_DSD
++ bool "DSD playback over PCM (DoP)"
++ help
++ Include support for DSD over PCM for compatible DAC"
++ default n
++endef
++
++define Package/squeezelite-full/config
++ if PACKAGE_squeezelite-full
++ $(call Package/squeezelite/config/default)
++ endif
++endef
++
++define Package/squeezelite-mini/config
++ if PACKAGE_squeezelite-mini
++ $(call Package/squeezelite/config/default)
++ endif
++endef
++
++define Package/squeezelite/description/default
++ Squeezelite is a small headless squeezebox emulator for linux using alsa audio output
++ It is aimed at supporting high quality audio at multiple sample rates including
++ 44.1/48/88.2/96/176.4/192k/352.8/384kHz
++ Supported codecs: mp3, flac, ogg, aac, (wma and alac via ffmpeg)
++ Native support for PCM builtin
++ Optional support of DSD playback via PCM for DoP capable DAC
++ Optional resampling to match sound device
++endef
++
++define Package/squeezelite/description
++ $(call Package/squeezelite/description/default)
++ .
++ This package has all the audio codecs compiled in.
++endef
++
++define Package/squeezelite-mini/description
++ $(call Package/squeezelite/description/default)
++ .
++ This package will dynamically load installed codecs.
++endef
++
++#ifeq ($(CONFIG_SQUEEZELITE_WMA),y)
++# PKG_BUILD_DEPENDS+= libffmpeg-audio-dec
++#endif
++
++TARGET_CFLAGS+= -Wall -fPIC -O2 -DSELFPIPE
++
++ifeq ($(CONFIG_SQUEEZELITE_WMA),y)
++ TARGET_CFLAGS+= -DFFMPEG
++endif
++
++ifeq ($(CONFIG_SQUEEZELITE_DSD),y)
++ TARGET_CFLAGS+= -DDSD
++endif
++
++ifeq ($(CONFIG_SQUEEZELITE_RESAMPLE),y)
++ TARGET_CFLAGS+= -DRESAMPLE
++endif
++
++TARGET_LDFLAGS+= -lasound -lpthread -lm -lrt
++
++ifeq ($(BUILD_VARIANT),full)
++ TARGET_CFLAGS+= -DLINKALL
++endif
++
++define Package/squeezelite/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/squeezelite $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/squeezelite.init $(1)/etc/init.d/squeezelite
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/squeezelite.conf $(1)/etc/config/squeezelite
++endef
++
++Package/squeezelite-mini/install=$(Package/squeezelite/install)
++Package/squeezelite-full/install=$(Package/squeezelite/install)
++
++$(eval $(call BuildPackage,squeezelite-mini))
++$(eval $(call BuildPackage,squeezelite-full))
+diff --git a/feeds/packages/sound/squeezelite/files/squeezelite.conf b/feeds/packages/sound/squeezelite/files/squeezelite.conf
+new file mode 100644
+index 0000000..57d1b73
+--- /dev/null
++++ b/feeds/packages/sound/squeezelite/files/squeezelite.conf
+@@ -0,0 +1,12 @@
++
++config options 'options'
++ option name 'SqueezeWrt'
++ option model_name 'SqueezeLite'
++ option close_delay '0'
++ option priority '0'
++ option max_sr '0'
++ option device 'hw:0,0'
++ option decoder_auto_conf '1'
++ option dsd_over_pcm '0'
++ option ircontrol '0'
++ option enabled '1'
+diff --git a/feeds/packages/sound/squeezelite/files/squeezelite.init b/feeds/packages/sound/squeezelite/files/squeezelite.init
+new file mode 100644
+index 0000000..3fa008f
+--- /dev/null
++++ b/feeds/packages/sound/squeezelite/files/squeezelite.init
+@@ -0,0 +1,134 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=99
++STOP=1
++
++USE_PROCD=1
++PROG=/usr/bin/squeezelite
++
++#
++# Auto config checks for existing codec installations if not specified in config
++# Explicit disable (override) by setting appropriate "decode_xxx" in config
++#
++checkcodec() {
++ config_get_bool auto_conf options "decoder_auto_conf" 1
++ config_get_bool codec options "$1" $auto_conf
++
++ if [ $codec -ne 0 ] ; then
++ if [ $auto_conf -eq 0 ] ; then
++ #force use requested
++ echo "$4"
++ else
++ if [ -e "/usr/lib/${2}" ] ; then
++ # Use codec (it exists)
++ echo "$4"
++ else
++ #exclude non-existant
++ if [ -z "$4" ] ; then
++ echo "-e $3"
++ else
++ echo "$4,$3"
++ fi
++ fi
++ fi
++ else
++ # explicitly excluded
++ if [ -z "$4" ] ; then
++ echo "-e $3"
++ else
++ echo "$4,$3"
++ fi
++ fi
++}
++
++make_cmdline() {
++ cmdline=""
++
++ config_get name options name "SqueezeWrt"
++ cmdline="$cmdline -n $name"
++
++ config_get model_name options model_name "SqueezeLite"
++ cmdline="$cmdline -M $model_name"
++
++ config_get device options device ""
++ [ -n $device ] && cmdline="$cmdline -o $device"
++
++ config_get alsa_buffer options alsa_buffer 200
++ [ $alsa_buffer -eq 0 ] && alsa_buffer="200"
++
++ config_get alsa_period options alsa_period 4
++ [ $alsa_period -eq 0 ] && alsa_period="4"
++
++ config_get alsa_format options alsa_format 16
++ [ $alsa_format = "0" ] && alsa_format="16"
++
++ config_get alsa_mmap options alsa_mmap 0
++ cmdline="$cmdline -a $alsa_buffer:$alsa_period:$alsa_format:$alsa_mmap"
++
++ config_get stream_bufsiz options stream_bufsiz 2048
++ config_get out_bufsiz options out_bufsiz 3763
++ cmdline="$cmdline -b $stream_bufsiz:$out_bufsiz"
++
++ config_get max_sr options max_sr 0
++ if [ $max_sr -ne 0 ] ; then
++ max_sr="-r $max_sr"
++
++ config_get sr_delay options sr_delay 0
++ [ $sr_delay -ne 0 ] && max_sr="$max_sr:$sr_delay"
++ cmdline="$cmdline $max_sr"
++ fi
++
++
++ config_get close_delay options close_delay 0
++ [ $close_delay -ne 0 ] && cmdline="$cmdline -C $close_delay"
++
++ config_get server_addr options server_addr ""
++ if [ -n "$server_addr" ] ; then
++ config_get server_port options server_port 3483
++ cmdline="$cmdline -s $server_addr:$server_port"
++ fi
++
++ config_get priority options priority 0
++ [ $priority -ne 0 ] && cmdline="$cmdline -p $priority"
++
++ #
++ # ***NOTE: codec lib names are in squeezelite.h (set decode_auto_conf to 0 to ignore)
++ #
++ local excl_codecs=""
++ excl_codecs=`checkcodec decode_flac "libFLAC.so.8" flac "$excl_codecs"`
++ excl_codecs=`checkcodec decode_mp3 "libmad.so.0" mp3 "$excl_codecs"`
++ excl_codecs=`checkcodec decode_aac "libfaad.so.2" aac "$excl_codecs"`
++ excl_codecs=`checkcodec decode_ogg "libvorbisfile.so.3" ogg "$excl_codecs"`
++ excl_codecs=`checkcodec decode_wma_alac "libavcodec.so.56" wma,alac "$excl_codecs"`
++ cmdline="$cmdline $excl_codecs"
++
++ config_get dop options dsd_over_pcm 0
++ [ $dop -eq 1 ] && cmdline="$cmdline -D"
++}
++
++start_service() {
++ config_load squeezelite
++
++ config_get_bool enabled options 'enabled' 0
++ [ $enabled -eq 0 ] && return
++
++ # Build command params
++ make_cmdline
++
++ procd_open_instance
++ logger -t 'squeezelite' "$cmdline"
++ procd_set_param command "$PROG" $cmdline
++ procd_close_instance
++}
++
++# Wait for service to exit and release sockets
++reload_service() {
++ stop
++ sleep 2
++ start
++}
++
++restart() {
++ reload_service
++}
+diff --git a/feeds/packages/sound/squeezelite/patches/005-respect_LDFLAGS.patch b/feeds/packages/sound/squeezelite/patches/005-respect_LDFLAGS.patch
+new file mode 100644
+index 0000000..d8df7ca
+--- /dev/null
++++ b/feeds/packages/sound/squeezelite/patches/005-respect_LDFLAGS.patch
+@@ -0,0 +1,56 @@
++From 1c53ed7db5b49ebf347efe65dbf9b740f9d54557 Mon Sep 17 00:00:00 2001
++From: Carlo Landmeter <clandmeter@gmail.com>
++Date: Tue, 31 Mar 2015 09:52:53 +0000
++Subject: [PATCH] respect LDFLAGS
++
++---
++ Makefile | 17 +++++++++--------
++ 1 file changed, 9 insertions(+), 8 deletions(-)
++
++--- a/Makefile
+++++ b/Makefile
++@@ -1,6 +1,7 @@
++ # Cross compile support - create a Makefile which defines these three variables and then includes this Makefile...
++-CFLAGS ?= -Wall -fPIC -O2 $(OPTS)
++-LDFLAGS ?= -lasound -lpthread -lm -lrt
+++CFLAGS ?= -Wall -O2
+++CFLAGS += -fPIC $(OPTS)
+++LIBS ?= -lasound -lpthread -lm -lrt
++ EXECUTABLE ?= squeezelite
++
++ # passing one or more of these in $(OPTS) enables optional feature inclusion
++@@ -52,20 +53,20 @@ endif
++
++ # add optional link options
++ ifneq (,$(findstring $(OPT_LINKALL), $(CFLAGS)))
++- LDFLAGS += $(LINKALL)
+++ LIBS += $(LINKALL)
++ ifneq (,$(findstring $(OPT_FF), $(CFLAGS)))
++- LDFLAGS += $(LINKALL_FF)
+++ LIBS += $(LINKALL_FF)
++ endif
++ ifneq (,$(findstring $(OPT_RESAMPLE), $(CFLAGS)))
++- LDFLAGS += $(LINKALL_RESAMPLE)
+++ LIBS += $(LINKALL_RESAMPLE)
++ endif
++ ifneq (,$(findstring $(OPT_IR), $(CFLAGS)))
++- LDFLAGS += $(LINKALL_IR)
+++ LIBS += $(LINKALL_IR)
++ endif
++ else
++ # if not LINKALL and linux add LINK_LINUX
++ ifeq ($(UNAME), Linux)
++- LDFLAGS += $(LINK_LINUX)
+++ LIBS += $(LINK_LINUX)
++ endif
++ endif
++
++@@ -74,7 +75,7 @@ OBJECTS = $(SOURCES:.c=.o)
++ all: $(EXECUTABLE)
++
++ $(EXECUTABLE): $(OBJECTS)
++- $(CC) $(OBJECTS) $(LDFLAGS) -o $@
+++ $(CC) $(OBJECTS) $(LDFLAGS) $(LIBS) -o $@
++
++ $(OBJECTS): $(DEPS)
++
+diff --git a/feeds/packages/sound/squeezelite/patches/010-wait_for_nonzero_mac.patch b/feeds/packages/sound/squeezelite/patches/010-wait_for_nonzero_mac.patch
+new file mode 100644
+index 0000000..69d4f34
+--- /dev/null
++++ b/feeds/packages/sound/squeezelite/patches/010-wait_for_nonzero_mac.patch
+@@ -0,0 +1,30 @@
++--- a/main.c
+++++ b/main.c
++@@ -187,6 +187,17 @@ static void sighandler(int signum) {
++ signal(signum, SIG_DFL);
++ }
++
+++// Waits for nonzero MAC
+++static void get_nonzero_mac(u8_t mac[], u32_t timeout_ms) {
+++ u32_t wait_timeout = gettime_ms() + timeout_ms;
+++ do{
+++ get_mac(mac);
+++ if ((mac[0]+mac[1]+mac[2]+mac[3]+mac[4]+mac[5]) != 0) {
+++ break;
+++ }
+++ }while(wait_timeout > gettime_ms());
+++}
+++
++ int main(int argc, char **argv) {
++ char *server = NULL;
++ char *output_device = "default";
++@@ -240,7 +251,8 @@ int main(int argc, char **argv) {
++ #define MAXCMDLINE 512
++ char cmdline[MAXCMDLINE] = "";
++
++- get_mac(mac);
+++ // Waits for nonzero MAC
+++ get_nonzero_mac(mac,10000);
++
++ for (i = 0; i < argc && (strlen(argv[i]) + strlen(cmdline) + 2 < MAXCMDLINE); i++) {
++ strcat(cmdline, argv[i]);
+diff --git a/feeds/packages/sound/squeezelite/patches/020-no_mpg123.patch b/feeds/packages/sound/squeezelite/patches/020-no_mpg123.patch
+new file mode 100644
+index 0000000..c3eb5d0
+--- /dev/null
++++ b/feeds/packages/sound/squeezelite/patches/020-no_mpg123.patch
+@@ -0,0 +1,83 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -15,7 +15,7 @@ OPT_IR = -DIR
++ SOURCES = \
++ main.c slimproto.c buffer.c stream.c utils.c \
++ output.c output_alsa.c output_pa.c output_stdout.c output_pack.c decode.c \
++- flac.c pcm.c mad.c vorbis.c faad.c mpg.c
+++ flac.c pcm.c mad.c vorbis.c faad.c
++
++ SOURCES_DSD = dsd.c dop.c dsd2pcm/dsd2pcm.c
++ SOURCES_FF = ffmpeg.c
++@@ -25,7 +25,7 @@ SOURCES_IR = ir.c
++
++ LINK_LINUX = -ldl
++
++-LINKALL = -lFLAC -lmad -lvorbisfile -lfaad -lmpg123
+++LINKALL = -lFLAC -lmad -lvorbisfile -lfaad
++ LINKALL_FF = -lavcodec -lavformat -lavutil
++ LINKALL_RESAMPLE = -lsoxr
++ LINKALL_IR = -llirc_client
++--- a/decode.c
+++++ b/decode.c
++@@ -146,8 +146,8 @@ void decode_init(log_level level, const
++ // try mad then mpg for mp3 unless command line option passed
++ if (!(strstr(exclude_codecs, "mp3") || strstr(exclude_codecs, "mad")) &&
++ (!include_codecs || strstr(include_codecs, "mp3") || strstr(include_codecs, "mad"))) codecs[i] = register_mad();
++- if (!(strstr(exclude_codecs, "mp3") || strstr(exclude_codecs, "mpg")) && !codecs[i] &&
++- (!include_codecs || strstr(include_codecs, "mp3") || strstr(include_codecs, "mpg"))) codecs[i] = register_mpg();
+++// if (!(strstr(exclude_codecs, "mp3") || strstr(exclude_codecs, "mpg")) && !codecs[i] &&
+++// (!include_codecs || strstr(include_codecs, "mp3") || strstr(include_codecs, "mpg"))) codecs[i] = register_mpg();
++
++ mutex_create(decode.mutex);
++
++--- a/main.c
+++++ b/main.c
++@@ -35,7 +35,8 @@
++ #else
++ #define CODECS_DSD ""
++ #endif
++-#define CODECS_MP3 " (mad,mpg for specific mp3 codec)"
+++//#define CODECS_MP3 " (mad,mpg for specific mp3 codec)"
+++#define CODECS_MP3 " (mad for specific mp3 codec)"
++
++ #define CODECS CODECS_BASE CODECS_FF CODECS_DSD CODECS_MP3
++
++--- a/squeezelite.h
+++++ b/squeezelite.h
++@@ -140,7 +140,7 @@
++ #if LINUX
++ #define LIBFLAC "libFLAC.so.8"
++ #define LIBMAD "libmad.so.0"
++-#define LIBMPG "libmpg123.so.0"
+++//#define LIBMPG "libmpg123.so.0"
++ #define LIBVORBIS "libvorbisfile.so.3"
++ #define LIBTREMOR "libvorbisidec.so.1"
++ #define LIBFAAD "libfaad.so.2"
++@@ -154,7 +154,7 @@
++ #if OSX
++ #define LIBFLAC "libFLAC.8.dylib"
++ #define LIBMAD "libmad.0.dylib"
++-#define LIBMPG "libmpg123.0.dylib"
+++//#define LIBMPG "libmpg123.0.dylib"
++ #define LIBVORBIS "libvorbisfile.3.dylib"
++ #define LIBTREMOR "libvorbisidec.1.dylib"
++ #define LIBFAAD "libfaad.2.dylib"
++@@ -167,7 +167,7 @@
++ #if WIN
++ #define LIBFLAC "libFLAC.dll"
++ #define LIBMAD "libmad-0.dll"
++-#define LIBMPG "libmpg123-0.dll"
+++//#define LIBMPG "libmpg123-0.dll"
++ #define LIBVORBIS "libvorbisfile.dll"
++ #define LIBTREMOR "libvorbisidec.dll"
++ #define LIBFAAD "libfaad2.dll"
++@@ -180,7 +180,7 @@
++ #if FREEBSD
++ #define LIBFLAC "libFLAC.so.11"
++ #define LIBMAD "libmad.so.2"
++-#define LIBMPG "libmpg123.so.0"
+++//#define LIBMPG "libmpg123.so.0"
++ #define LIBVORBIS "libvorbisfile.so.6"
++ #define LIBTREMOR "libvorbisidec.so.1"
++ #define LIBFAAD "libfaad.so.2"
+diff --git a/feeds/packages/sound/squeezelite/patches/030-fix_musl_compatibilty.patch b/feeds/packages/sound/squeezelite/patches/030-fix_musl_compatibilty.patch
+new file mode 100644
+index 0000000..86e5260
+--- /dev/null
++++ b/feeds/packages/sound/squeezelite/patches/030-fix_musl_compatibilty.patch
+@@ -0,0 +1,14 @@
++--- a/output_alsa.c
+++++ b/output_alsa.c
++@@ -862,8 +862,11 @@ void output_init_alsa(log_level level, c
++ LOG_INFO("memory locked");
++ }
++
+++#ifdef M_TRIM_THRESHOLD
+++ // mallopt is not defined in musl libc
++ mallopt(M_TRIM_THRESHOLD, -1);
++ mallopt(M_MMAP_MAX, 0);
+++#endif
++
++ touch_memory(silencebuf, MAX_SILENCE_FRAMES * BYTES_PER_FRAME);
++ touch_memory(outputbuf->buf, outputbuf->size);
+diff --git a/feeds/packages/sound/squeezelite/patches/040-clear_dynlink_errors.patch b/feeds/packages/sound/squeezelite/patches/040-clear_dynlink_errors.patch
+new file mode 100644
+index 0000000..1571572
+--- /dev/null
++++ b/feeds/packages/sound/squeezelite/patches/040-clear_dynlink_errors.patch
+@@ -0,0 +1,105 @@
++--- a/faad.c
+++++ b/faad.c
++@@ -593,6 +593,8 @@ static bool load_faad() {
++ return false;
++ }
++
+++ err = dlerror(); // Reset previous dynamic linking error string (if there was)
+++
++ a->NeAACDecGetCurrentConfiguration = dlsym(handle, "NeAACDecGetCurrentConfiguration");
++ a->NeAACDecSetConfiguration = dlsym(handle, "NeAACDecSetConfiguration");
++ a->NeAACDecOpen = dlsym(handle, "NeAACDecOpen");
++--- a/ffmpeg.c
+++++ b/ffmpeg.c
++@@ -590,6 +590,8 @@ static bool load_ff() {
++ return false;
++ }
++
+++ err = dlerror(); // Reset previous dynamic linking error string (if there was)
+++
++ sprintf(name, LIBAVFORMAT, LIBAVFORMAT_VERSION_MAJOR);
++ handle_format = dlopen(name, RTLD_NOW);
++ if (!handle_format) {
++--- a/flac.c
+++++ b/flac.c
++@@ -241,6 +241,8 @@ static bool load_flac() {
++ return false;
++ }
++
+++ err = dlerror(); // Reset previous dynamic linking error string (if there was)
+++
++ f->FLAC__StreamDecoderErrorStatusString = dlsym(handle, "FLAC__StreamDecoderErrorStatusString");
++ f->FLAC__StreamDecoderStateString = dlsym(handle, "FLAC__StreamDecoderStateString");
++ f->FLAC__stream_decoder_new = dlsym(handle, "FLAC__stream_decoder_new");
++--- a/ir.c
+++++ b/ir.c
++@@ -167,10 +167,10 @@ static void *ir_thread() {
++ UNLOCK_I;
++ wake_controller();
++ }
++-
+++
++ free(code);
++ }
++-
+++
++ return 0;
++ }
++
++@@ -184,6 +184,8 @@ static bool load_lirc() {
++ return false;
++ }
++
+++ err = dlerror(); // Reset previous dynamic linking error string (if there was)
+++
++ i->lirc_init = dlsym(handle, "lirc_init");
++ i->lirc_deinit = dlsym(handle, "lirc_deinit");
++ i->lirc_readconfig = dlsym(handle, "lirc_readconfig");
++--- a/mad.c
+++++ b/mad.c
++@@ -364,7 +364,9 @@ static bool load_mad() {
++ LOG_INFO("dlerror: %s", dlerror());
++ return false;
++ }
++-
+++
+++ err = dlerror(); // Reset previous dynamic linking error string (if there was)
+++
++ m->mad_stream_init = dlsym(handle, "mad_stream_init");
++ m->mad_frame_init = dlsym(handle, "mad_frame_init");
++ m->mad_synth_init = dlsym(handle, "mad_synth_init");
++--- a/mpg.c
+++++ b/mpg.c
++@@ -221,7 +221,9 @@ static bool load_mpg() {
++ LOG_INFO("dlerror: %s", dlerror());
++ return false;
++ }
++-
+++
+++ err = dlerror(); // Reset previous dynamic linking error string (if there was)
+++
++ m->mpg123_init = dlsym(handle, "mpg123_init");
++ m->mpg123_feature = dlsym(handle, "mpg123_feature");
++ m->mpg123_rates = dlsym(handle, "mpg123_rates");
++--- a/resample.c
+++++ b/resample.c
++@@ -250,6 +250,8 @@ static bool load_soxr(void) {
++ return false;
++ }
++
+++ err = dlerror(); // Reset previous dynamic linking error string (if there was)
+++
++ r->soxr_io_spec = dlsym(handle, "soxr_io_spec");
++ r->soxr_quality_spec = dlsym(handle, "soxr_quality_spec");
++ r->soxr_create = dlsym(handle, "soxr_create");
++--- a/vorbis.c
+++++ b/vorbis.c
++@@ -286,6 +286,8 @@ static bool load_vorbis() {
++ }
++ }
++
+++ err = dlerror(); // Reset previous dynamic linking error string (if there was)
+++
++ v->ov_read = tremor ? NULL : dlsym(handle, "ov_read");
++ v->ov_read_tremor = tremor ? dlsym(handle, "ov_read") : NULL;
++ v->ov_info = dlsym(handle, "ov_info");
+diff --git a/feeds/packages/sound/svox/Makefile b/feeds/packages/sound/svox/Makefile
+new file mode 100644
+index 0000000..43c2b13
+--- /dev/null
++++ b/feeds/packages/sound/svox/Makefile
+@@ -0,0 +1,61 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=svox
++PKG_VERSION:=1.0+git20130326
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).orig.tar.gz
++PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/non-free/s/svox
++PKG_MD5SUM:=df4bf610ff4273b420e80ff64af93130
++
++PKG_MAINTAINER:=Alessandro Di Marco <dmr@ethzero.com>
++PKG_LICENSE:=Apache-2.0
++PKG_LICENSE_FILES:=
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/svox
++ TITLE:=SVOX PicoTTS text-to-speech engine
++ SECTION:=sound
++ CATEGORY:=Sound
++ URL:=https://android.googlesource.com/platform/external/svox/
++ DEPENDS:=+libpopt
++endef
++
++define Package/svox/description
++ SVOX is an embedded speech technology company founded in 2000 and
++ headquartered in Zurich, Switzerland. SVOX was acquired by Nuance
++ Communications in 2011. Company's products included Automated Speech
++ Recognition (ASR), Text-to-Speech (TTS) and Speech Dialog systems,
++ with customers mostly being manufacturers and system integrators in
++ automotive and mobile device industries.
++ SVOX TTS technology is characterized by natural and clear sound as well
++ as unique polyglot capability - the same voice can speak multiple
++ languages like a native speaker.
++endef
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ mv $(PKG_BUILD_DIR)/pico/* $(PKG_BUILD_DIR)
++endef
++
++define Package/svox/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/pico2wave $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libttspico.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/share/pico/lang
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/pico/lang/* $(1)/usr/share/pico/lang/
++endef
++
++$(eval $(call BuildPackage,svox))
+diff --git a/feeds/packages/sound/svox/patches/0001-autoconf-building-of-library-using-libtool.patch b/feeds/packages/sound/svox/patches/0001-autoconf-building-of-library-using-libtool.patch
+new file mode 100644
+index 0000000..73c76bb
+--- /dev/null
++++ b/feeds/packages/sound/svox/patches/0001-autoconf-building-of-library-using-libtool.patch
+@@ -0,0 +1,113 @@
++From 9fe1aa475b2667446b081623abc5c6f6083a76e6 Mon Sep 17 00:00:00 2001
++From: Mathieu Parent <math.parent@gmail.com>
++Date: Sat, 24 Oct 2009 17:03:37 +0200
++Subject: [PATCH 1/7] autoconf building of library (using libtool)
++
++---
++ pico/Makefile.am | 36 ++++++++++++++++++++++++++++++++++++
++ pico/autogen.sh | 36 ++++++++++++++++++++++++++++++++++++
++ pico/configure.in | 16 ++++++++++++++++
++ 3 files changed, 88 insertions(+), 0 deletions(-)
++ create mode 100644 pico/Makefile.am
++ create mode 100755 pico/autogen.sh
++ create mode 100644 pico/configure.in
++
++--- /dev/null
+++++ b/pico/Makefile.am
++@@ -0,0 +1,36 @@
+++## Makefile.am -- Process this file with automake to produce Makefile.in
+++
+++ACLOCAL_AMFLAGS = -I m4
+++
+++lib_LTLIBRARIES = libttspico.la
+++libttspico_la_SOURCES = \
+++ lib/picoacph.c \
+++ lib/picoapi.c \
+++ lib/picobase.c \
+++ lib/picocep.c \
+++ lib/picoctrl.c \
+++ lib/picodata.c \
+++ lib/picodbg.c \
+++ lib/picoextapi.c \
+++ lib/picofftsg.c \
+++ lib/picokdbg.c \
+++ lib/picokdt.c \
+++ lib/picokfst.c \
+++ lib/picoklex.c \
+++ lib/picoknow.c \
+++ lib/picokpdf.c \
+++ lib/picokpr.c \
+++ lib/picoktab.c \
+++ lib/picoos.c \
+++ lib/picopal.c \
+++ lib/picopam.c \
+++ lib/picopr.c \
+++ lib/picorsrc.c \
+++ lib/picosa.c \
+++ lib/picosig.c \
+++ lib/picosig2.c \
+++ lib/picospho.c \
+++ lib/picotok.c \
+++ lib/picotrns.c \
+++ lib/picowa.c
+++
++--- /dev/null
+++++ b/pico/autogen.sh
++@@ -0,0 +1,38 @@
+++#!/bin/sh
+++
+++#created by aclocal
+++rm -rf autom4te.cache
+++rm -f aclocal.m4
+++
+++#created by libtoolize
+++rm -rf m4
+++mkdir m4
+++rm -f ltmain.sh
+++
+++#created by autoconf
+++rm -f configure
+++
+++#created by automake
+++rm -f install-sh missing depcomp Makefile.in config.guess config.sub
+++rm -f INSTALL COPYING compile
+++
+++#created by ./configure
+++rm -rf .deps
+++rm -f Makefile config.log config.status libtool
+++
+++if [ "$1" = "clean" ]; then
+++ exit
+++fi
+++
+++IPATHS="-I lib"
+++
+++libtoolize
+++aclocal $IPATHS
+++automake --add-missing
+++autoconf $IPATHS
+++
+++rm -rf autom4te.cache
+++
+++echo "Now run ./configure and then make."
+++exit 0
+++
++--- /dev/null
+++++ b/pico/configure.in
++@@ -0,0 +1,16 @@
+++dnl Process this file with autoconf to produce a configure script.
+++
+++AC_PREREQ(2.59)
+++
+++AC_INIT([svox], [1.0], [math.parent@gmail.com])
+++
+++AM_INIT_AUTOMAKE([1.9 foreign])
+++
+++AC_PROG_CC
+++LT_INIT
+++AC_PROG_LIBTOOL
+++
+++AC_CONFIG_FILES([Makefile])
+++AC_OUTPUT
+++
+++AC_CONFIG_MACRO_DIR([m4])
+diff --git a/feeds/packages/sound/svox/patches/0002-gitignore-for-autotools-files.patch b/feeds/packages/sound/svox/patches/0002-gitignore-for-autotools-files.patch
+new file mode 100644
+index 0000000..df57df7
+--- /dev/null
++++ b/feeds/packages/sound/svox/patches/0002-gitignore-for-autotools-files.patch
+@@ -0,0 +1,51 @@
++From b56b0a4bdf3e11271caab744f532cb055c517b51 Mon Sep 17 00:00:00 2001
++From: Mathieu Parent <math.parent@gmail.com>
++Date: Sat, 24 Oct 2009 17:12:42 +0200
++Subject: [PATCH 2/7] gitignore for autotools files
++
++---
++ pico/.gitignore | 32 ++++++++++++++++++++++++++++++++
++ 1 files changed, 32 insertions(+), 0 deletions(-)
++ create mode 100644 pico/.gitignore
++
++diff --git a/pico/.gitignore b/pico/.gitignore
++new file mode 100644
++index 0000000..4235569
++--- /dev/null
+++++ b/pico/.gitignore
++@@ -0,0 +1,32 @@
+++#created by aclocal
+++autom4te.cache
+++aclocal.m4
+++
+++#created by libtoolize
+++m4
+++ltmain.sh
+++
+++#created by autoconf
+++configure
+++
+++#created by automake
+++install-sh
+++missing
+++depcomp
+++Makefile.in
+++config.guess
+++config.sub
+++
+++#created by ./configure
+++.deps
+++Makefile
+++config.log
+++config.status
+++libtool
+++
+++#created by make
+++*.o
+++*.lo
+++.libs
+++libttspico.la
+++
++--
++1.7.1
++
+diff --git a/feeds/packages/sound/svox/patches/0003-pico2wave-Convert-text-to-.wav-using-svox-text-to-sp.patch b/feeds/packages/sound/svox/patches/0003-pico2wave-Convert-text-to-.wav-using-svox-text-to-sp.patch
+new file mode 100644
+index 0000000..8ef4757
+--- /dev/null
++++ b/feeds/packages/sound/svox/patches/0003-pico2wave-Convert-text-to-.wav-using-svox-text-to-sp.patch
+@@ -0,0 +1,399 @@
++From 8bec80dccc9f4fe147a500486813f4e89a0d56d8 Mon Sep 17 00:00:00 2001
++From: Mathieu Parent <math.parent@gmail.com>
++Date: Sun, 25 Oct 2009 15:19:01 +0100
++Subject: [PATCH 3/7] pico2wave: Convert text to .wav using svox text-to-speech system.
++
++---
++ pico/.gitignore | 1 +
++ pico/Makefile.am | 7 +
++ pico/bin/pico2wave.c | 341 ++++++++++++++++++++++++++++++++++++++++++++++++++
++ pico/configure.in | 3 +
++ 4 files changed, 352 insertions(+), 0 deletions(-)
++ create mode 100644 pico/bin/pico2wave.c
++
++diff --git a/pico/.gitignore b/pico/.gitignore
++index 4235569..a110298 100644
++--- a/pico/.gitignore
+++++ b/pico/.gitignore
++@@ -29,4 +29,5 @@ libtool
++ *.lo
++ .libs
++ libttspico.la
+++pico2wave
++
++diff --git a/pico/Makefile.am b/pico/Makefile.am
++index 6d8a10c..0d9472d 100644
++--- a/pico/Makefile.am
+++++ b/pico/Makefile.am
++@@ -34,3 +34,10 @@ libttspico_la_SOURCES = \
++ lib/picotrns.c \
++ lib/picowa.c
++
+++bin_PROGRAMS = pico2wave
+++pico2wave_SOURCES = \
+++ bin/pico2wave.c
+++pico2wave_LDADD = \
+++ libttspico.la -lm -lpopt
+++pico2wave_CFLAGS = -Wall -I lib
+++
++diff --git a/pico/bin/pico2wave.c b/pico/bin/pico2wave.c
++new file mode 100644
++index 0000000..0c035a7
++--- /dev/null
+++++ b/pico/bin/pico2wave.c
++@@ -0,0 +1,341 @@
+++/* pico2wave.c
+++
+++ * Copyright (C) 2009 Mathieu Parent <math.parent@gmail.com>
+++ *
+++ * Licensed under the Apache License, Version 2.0 (the "License");
+++ * you may not use this file except in compliance with the License.
+++ * You may obtain a copy of the License at
+++ *
+++ * http://www.apache.org/licenses/LICENSE-2.0
+++ *
+++ * Unless required by applicable law or agreed to in writing, software
+++ * distributed under the License is distributed on an "AS IS" BASIS,
+++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+++ * See the License for the specific language governing permissions and
+++ * limitations under the License.
+++ *
+++ * Convert text to .wav using svox text-to-speech system.
+++ *
+++ */
+++
+++
+++#include <popt.h>
+++#include <stdio.h>
+++#include <stdlib.h>
+++#include <string.h>
+++
+++#include <picoapi.h>
+++#include <picoapid.h>
+++#include <picoos.h>
+++
+++
+++/* adaptation layer defines */
+++#define PICO_MEM_SIZE 2500000
+++#define DummyLen 100000000
+++
+++/* string constants */
+++#define MAX_OUTBUF_SIZE 128
+++const char * PICO_LINGWARE_PATH = "./lang/";
+++const char * PICO_VOICE_NAME = "PicoVoice";
+++
+++/* supported voices
+++ Pico does not seperately specify the voice and locale. */
+++const char * picoSupportedLangIso3[] = { "eng", "eng", "deu", "spa", "fra", "ita" };
+++const char * picoSupportedCountryIso3[] = { "USA", "GBR", "DEU", "ESP", "FRA", "ITA" };
+++const char * picoSupportedLang[] = { "en-US", "en-GB", "de-DE", "es-ES", "fr-FR", "it-IT" };
+++const char * picoInternalLang[] = { "en-US", "en-GB", "de-DE", "es-ES", "fr-FR", "it-IT" };
+++const char * picoInternalTaLingware[] = { "en-US_ta.bin", "en-GB_ta.bin", "de-DE_ta.bin", "es-ES_ta.bin", "fr-FR_ta.bin", "it-IT_ta.bin" };
+++const char * picoInternalSgLingware[] = { "en-US_lh0_sg.bin", "en-GB_kh0_sg.bin", "de-DE_gl0_sg.bin", "es-ES_zl0_sg.bin", "fr-FR_nk0_sg.bin", "it-IT_cm0_sg.bin" };
+++const char * picoInternalUtppLingware[] = { "en-US_utpp.bin", "en-GB_utpp.bin", "de-DE_utpp.bin", "es-ES_utpp.bin", "fr-FR_utpp.bin", "it-IT_utpp.bin" };
+++const int picoNumSupportedVocs = 6;
+++
+++/* adapation layer global variables */
+++void * picoMemArea = NULL;
+++pico_System picoSystem = NULL;
+++pico_Resource picoTaResource = NULL;
+++pico_Resource picoSgResource = NULL;
+++pico_Resource picoUtppResource = NULL;
+++pico_Engine picoEngine = NULL;
+++pico_Char * picoTaFileName = NULL;
+++pico_Char * picoSgFileName = NULL;
+++pico_Char * picoUtppFileName = NULL;
+++pico_Char * picoTaResourceName = NULL;
+++pico_Char * picoSgResourceName = NULL;
+++pico_Char * picoUtppResourceName = NULL;
+++int picoSynthAbort = 0;
+++
+++
+++int main(int argc, const char *argv[]) {
+++ char * wavefile = NULL;
+++ char * lang = "en-US";
+++ int langIndex = -1, langIndexTmp = -1;
+++ char * text;
+++ int8_t * buffer;
+++ size_t bufferSize = 256;
+++
+++ /* Parsing options */
+++ poptContext optCon; /* context for parsing command-line options */
+++ int opt; /* used for argument parsing */
+++
+++ struct poptOption optionsTable[] = {
+++ { "wave", 'w', POPT_ARG_STRING, &wavefile, 0,
+++ "Write output to this WAV file (extension SHOULD be .wav)", "filename.wav" },
+++ { "lang", 'l', POPT_ARG_STRING | POPT_ARGFLAG_SHOW_DEFAULT, &lang, 0,
+++ "Language", "lang" },
+++ POPT_AUTOHELP
+++ POPT_TABLEEND
+++ };
+++ optCon = poptGetContext(NULL, argc, argv, optionsTable, POPT_CONTEXT_POSIXMEHARDER);
+++ poptSetOtherOptionHelp(optCon, "<words>");
+++
+++ /* Reporting about invalid extra options */
+++ while ((opt = poptGetNextOpt(optCon)) != -1) {
+++ switch (opt) {
+++ default:
+++ fprintf(stderr, "Invalid option %s: %s\n",
+++ poptBadOption(optCon, 0), poptStrerror(opt));
+++ poptPrintHelp(optCon, stderr, 0);
+++ exit(1);
+++ }
+++ }
+++
+++ /* Mandatory option: --wave */
+++ if(!wavefile) {
+++ fprintf(stderr, "Mandatory option: %s\n\n",
+++ "--wave=filename.wav");
+++ poptPrintHelp(optCon, stderr, 0);
+++ exit(1);
+++ }
+++ /* option: --lang */
+++ for(langIndexTmp =0; langIndexTmp<picoNumSupportedVocs; langIndexTmp++) {
+++ if(!strcmp(picoSupportedLang[langIndexTmp], lang)) {
+++ langIndex = langIndexTmp;
+++ break;
+++ }
+++ }
+++ if(langIndex == -1) {
+++ fprintf(stderr, "Unknown language: %s\nValid languages:\n",
+++ lang);
+++ for(langIndexTmp =0; langIndexTmp<picoNumSupportedVocs; langIndexTmp++) {
+++ fprintf(stderr, "%s\n", picoSupportedLang[langIndexTmp]);
+++ }
+++ lang = "en-US";
+++ fprintf(stderr, "\n");
+++ poptPrintHelp(optCon, stderr, 0);
+++ exit(1);
+++ }
+++
+++ /* Remaining argument is <words> */
+++ const char **extra_argv;
+++ extra_argv = poptGetArgs(optCon);
+++ if(extra_argv) {
+++ text = (char *) &(*extra_argv)[0];
+++ } else {
+++ //TODO: stdin not supported yet.
+++ fprintf(stderr, "Missing argument: %s\n\n",
+++ "<words>");
+++ poptPrintHelp(optCon, stderr, 0);
+++ exit(1);
+++ }
+++
+++ poptFreeContext(optCon);
+++
+++ buffer = malloc( bufferSize );
+++
+++ int ret, getstatus;
+++ pico_Char * inp = NULL;
+++ pico_Char * local_text = NULL;
+++ short outbuf[MAX_OUTBUF_SIZE/2];
+++ pico_Int16 bytes_sent, bytes_recv, text_remaining, out_data_type;
+++ pico_Retstring outMessage;
+++
+++ picoSynthAbort = 0;
+++
+++ picoMemArea = malloc( PICO_MEM_SIZE );
+++ if((ret = pico_initialize( picoMemArea, PICO_MEM_SIZE, &picoSystem ))) {
+++ pico_getSystemStatusMessage(picoSystem, ret, outMessage);
+++ fprintf(stderr, "Cannot initialize pico (%i): %s\n", ret, outMessage);
+++ goto terminate;
+++ }
+++
+++ /* Load the text analysis Lingware resource file. */
+++ picoTaFileName = (pico_Char *) malloc( PICO_MAX_DATAPATH_NAME_SIZE + PICO_MAX_FILE_NAME_SIZE );
+++ strcpy((char *) picoTaFileName, PICO_LINGWARE_PATH);
+++ strcat((char *) picoTaFileName, (const char *) picoInternalTaLingware[langIndex]);
+++ if((ret = pico_loadResource( picoSystem, picoTaFileName, &picoTaResource ))) {
+++ pico_getSystemStatusMessage(picoSystem, ret, outMessage);
+++ fprintf(stderr, "Cannot load text analysis resource file (%i): %s\n", ret, outMessage);
+++ goto unloadTaResource;
+++ }
+++
+++ /* Load the signal generation Lingware resource file. */
+++ picoSgFileName = (pico_Char *) malloc( PICO_MAX_DATAPATH_NAME_SIZE + PICO_MAX_FILE_NAME_SIZE );
+++ strcpy((char *) picoSgFileName, PICO_LINGWARE_PATH);
+++ strcat((char *) picoSgFileName, (const char *) picoInternalSgLingware[langIndex]);
+++ if((ret = pico_loadResource( picoSystem, picoSgFileName, &picoSgResource ))) {
+++ pico_getSystemStatusMessage(picoSystem, ret, outMessage);
+++ fprintf(stderr, "Cannot load signal generation Lingware resource file (%i): %s\n", ret, outMessage);
+++ goto unloadSgResource;
+++ }
+++
+++ /* Load the utpp Lingware resource file if exists - NOTE: this file is optional
+++ and is currently not used. Loading is only attempted for future compatibility.
+++ If this file is not present the loading will still succeed. //
+++ picoUtppFileName = (pico_Char *) malloc( PICO_MAX_DATAPATH_NAME_SIZE + PICO_MAX_FILE_NAME_SIZE );
+++ strcpy((char *) picoUtppFileName, PICO_LINGWARE_PATH);
+++ strcat((char *) picoUtppFileName, (const char *) picoInternalUtppLingware[langIndex]);
+++ ret = pico_loadResource( picoSystem, picoUtppFileName, &picoUtppResource );
+++ pico_getSystemStatusMessage(picoSystem, ret, outMessage);
+++ printf("pico_loadResource: %i: %s\n", ret, outMessage);
+++ */
+++
+++ /* Get the text analysis resource name. */
+++ picoTaResourceName = (pico_Char *) malloc( PICO_MAX_RESOURCE_NAME_SIZE );
+++ if((ret = pico_getResourceName( picoSystem, picoTaResource, (char *) picoTaResourceName ))) {
+++ pico_getSystemStatusMessage(picoSystem, ret, outMessage);
+++ fprintf(stderr, "Cannot get the text analysis resource name (%i): %s\n", ret, outMessage);
+++ goto unloadUtppResource;
+++ }
+++
+++ /* Get the signal generation resource name. */
+++ picoSgResourceName = (pico_Char *) malloc( PICO_MAX_RESOURCE_NAME_SIZE );
+++ if((ret = pico_getResourceName( picoSystem, picoSgResource, (char *) picoSgResourceName ))) {
+++ pico_getSystemStatusMessage(picoSystem, ret, outMessage);
+++ fprintf(stderr, "Cannot get the signal generation resource name (%i): %s\n", ret, outMessage);
+++ goto unloadUtppResource;
+++ }
+++
+++
+++ /* Create a voice definition. */
+++ if((ret = pico_createVoiceDefinition( picoSystem, (const pico_Char *) PICO_VOICE_NAME ))) {
+++ pico_getSystemStatusMessage(picoSystem, ret, outMessage);
+++ fprintf(stderr, "Cannot create voice definition (%i): %s\n", ret, outMessage);
+++ goto unloadUtppResource;
+++ }
+++
+++ /* Add the text analysis resource to the voice. */
+++ if((ret = pico_addResourceToVoiceDefinition( picoSystem, (const pico_Char *) PICO_VOICE_NAME, picoTaResourceName ))) {
+++ pico_getSystemStatusMessage(picoSystem, ret, outMessage);
+++ fprintf(stderr, "Cannot add the text analysis resource to the voice (%i): %s\n", ret, outMessage);
+++ goto unloadUtppResource;
+++ }
+++
+++ /* Add the signal generation resource to the voice. */
+++ if((ret = pico_addResourceToVoiceDefinition( picoSystem, (const pico_Char *) PICO_VOICE_NAME, picoSgResourceName ))) {
+++ pico_getSystemStatusMessage(picoSystem, ret, outMessage);
+++ fprintf(stderr, "Cannot add the signal generation resource to the voice (%i): %s\n", ret, outMessage);
+++ goto unloadUtppResource;
+++ }
+++
+++ /* Create a new Pico engine. */
+++ if((ret = pico_newEngine( picoSystem, (const pico_Char *) PICO_VOICE_NAME, &picoEngine ))) {
+++ pico_getSystemStatusMessage(picoSystem, ret, outMessage);
+++ fprintf(stderr, "Cannot create a new pico engine (%i): %s\n", ret, outMessage);
+++ goto disposeEngine;
+++ }
+++
+++ local_text = (pico_Char *) text ;
+++ text_remaining = strlen((const char *) local_text) + 1;
+++
+++ inp = (pico_Char *) local_text;
+++
+++ size_t bufused = 0;
+++
+++ picoos_Common common = (picoos_Common) pico_sysGetCommon(picoSystem);
+++
+++ picoos_SDFile sdOutFile = NULL;
+++
+++ picoos_bool done = TRUE;
+++ if(TRUE != (done = picoos_sdfOpenOut(common, &sdOutFile,
+++ (picoos_char *) wavefile, SAMPLE_FREQ_16KHZ, PICOOS_ENC_LIN)))
+++ {
+++ fprintf(stderr, "Cannot open output wave file\n");
+++ ret = 1;
+++ goto disposeEngine;
+++ }
+++
+++ /* synthesis loop */
+++ while (text_remaining) {
+++ /* Feed the text into the engine. */
+++ if((ret = pico_putTextUtf8( picoEngine, inp, text_remaining, &bytes_sent ))) {
+++ pico_getSystemStatusMessage(picoSystem, ret, outMessage);
+++ fprintf(stderr, "Cannot put Text (%i): %s\n", ret, outMessage);
+++ goto disposeEngine;
+++ }
+++
+++ text_remaining -= bytes_sent;
+++ inp += bytes_sent;
+++
+++ do {
+++ if (picoSynthAbort) {
+++ goto disposeEngine;
+++ }
+++ /* Retrieve the samples and add them to the buffer. */
+++ getstatus = pico_getData( picoEngine, (void *) outbuf,
+++ MAX_OUTBUF_SIZE, &bytes_recv, &out_data_type );
+++ if((getstatus !=PICO_STEP_BUSY) && (getstatus !=PICO_STEP_IDLE)){
+++ pico_getSystemStatusMessage(picoSystem, getstatus, outMessage);
+++ fprintf(stderr, "Cannot get Data (%i): %s\n", getstatus, outMessage);
+++ goto disposeEngine;
+++ }
+++ if (bytes_recv) {
+++ if ((bufused + bytes_recv) <= bufferSize) {
+++ memcpy(buffer+bufused, (int8_t *) outbuf, bytes_recv);
+++ bufused += bytes_recv;
+++ } else {
+++ done = picoos_sdfPutSamples(
+++ sdOutFile,
+++ bufused / 2,
+++ (picoos_int16*) (buffer));
+++ bufused = 0;
+++ memcpy(buffer, (int8_t *) outbuf, bytes_recv);
+++ bufused += bytes_recv;
+++ }
+++ }
+++ } while (PICO_STEP_BUSY == getstatus);
+++ /* This chunk of synthesis is finished; pass the remaining samples. */
+++ if (!picoSynthAbort) {
+++ done = picoos_sdfPutSamples(
+++ sdOutFile,
+++ bufused / 2,
+++ (picoos_int16*) (buffer));
+++ }
+++ picoSynthAbort = 0;
+++ }
+++
+++ if(TRUE != (done = picoos_sdfCloseOut(common, &sdOutFile)))
+++ {
+++ fprintf(stderr, "Cannot close output wave file\n");
+++ ret = 1;
+++ goto disposeEngine;
+++ }
+++
+++disposeEngine:
+++ if (picoEngine) {
+++ pico_disposeEngine( picoSystem, &picoEngine );
+++ pico_releaseVoiceDefinition( picoSystem, (pico_Char *) PICO_VOICE_NAME );
+++ picoEngine = NULL;
+++ }
+++unloadUtppResource:
+++ if (picoUtppResource) {
+++ pico_unloadResource( picoSystem, &picoUtppResource );
+++ picoUtppResource = NULL;
+++ }
+++unloadSgResource:
+++ if (picoSgResource) {
+++ pico_unloadResource( picoSystem, &picoSgResource );
+++ picoSgResource = NULL;
+++ }
+++unloadTaResource:
+++ if (picoTaResource) {
+++ pico_unloadResource( picoSystem, &picoTaResource );
+++ picoTaResource = NULL;
+++ }
+++terminate:
+++ if (picoSystem) {
+++ pico_terminate(&picoSystem);
+++ picoSystem = NULL;
+++ }
+++ exit(ret);
+++}
+++
++diff --git a/pico/configure.in b/pico/configure.in
++index 0afb56d..349eb1d 100644
++--- a/pico/configure.in
+++++ b/pico/configure.in
++@@ -14,3 +14,6 @@ AC_CONFIG_FILES([Makefile])
++ AC_OUTPUT
++
++ AC_CONFIG_MACRO_DIR([m4])
+++
+++AC_CHECK_LIB(popt, poptGetContext)
+++
++--
++1.7.1
++
+diff --git a/feeds/packages/sound/svox/patches/0004-add-header-files.patch b/feeds/packages/sound/svox/patches/0004-add-header-files.patch
+new file mode 100644
+index 0000000..f057308
+--- /dev/null
++++ b/feeds/packages/sound/svox/patches/0004-add-header-files.patch
+@@ -0,0 +1,59 @@
++From 0866cb3f7cfe4b8bae1edc8d0dbf18c85e9ca74f Mon Sep 17 00:00:00 2001
++From: Mathieu Parent <math.parent@gmail.com>
++Date: Tue, 27 Oct 2009 18:29:45 +0100
++Subject: [PATCH 4/7] add header files
++
++---
++ pico/Makefile.am | 36 ++++++++++++++++++++++++++++++++++++
++ 1 files changed, 36 insertions(+), 0 deletions(-)
++
++diff --git a/pico/Makefile.am b/pico/Makefile.am
++index 0d9472d..9151042 100644
++--- a/pico/Makefile.am
+++++ b/pico/Makefile.am
++@@ -34,6 +34,42 @@ libttspico_la_SOURCES = \
++ lib/picotrns.c \
++ lib/picowa.c
++
+++libttspico_ladir = $(includedir)
+++libttspico_la_HEADERS = \
+++ lib/picoacph.h \
+++ lib/picoapid.h \
+++ lib/picoapi.h \
+++ lib/picobase.h \
+++ lib/picocep.h \
+++ lib/picoctrl.h \
+++ lib/picodata.h \
+++ lib/picodbg.h \
+++ lib/picodefs.h \
+++ lib/picodsp.h \
+++ lib/picoextapi.h \
+++ lib/picofftsg.h \
+++ lib/picokdbg.h \
+++ lib/picokdt.h \
+++ lib/picokfst.h \
+++ lib/picoklex.h \
+++ lib/picoknow.h \
+++ lib/picokpdf.h \
+++ lib/picokpr.h \
+++ lib/picoktab.h \
+++ lib/picoos.h \
+++ lib/picopal.h \
+++ lib/picopam.h \
+++ lib/picopltf.h \
+++ lib/picopr.h \
+++ lib/picorsrc.h \
+++ lib/picosa.h \
+++ lib/picosig2.h \
+++ lib/picosig.h \
+++ lib/picospho.h \
+++ lib/picotok.h \
+++ lib/picotrns.h \
+++ lib/picowa.h
+++
++ bin_PROGRAMS = pico2wave
++ pico2wave_SOURCES = \
++ bin/pico2wave.c
++--
++1.7.1
++
+diff --git a/feeds/packages/sound/svox/patches/0005-Install-lang-files.patch b/feeds/packages/sound/svox/patches/0005-Install-lang-files.patch
+new file mode 100644
+index 0000000..95344e3
+--- /dev/null
++++ b/feeds/packages/sound/svox/patches/0005-Install-lang-files.patch
+@@ -0,0 +1,32 @@
++From 486b9f924bdf38f5f213feed2631060b44024c11 Mon Sep 17 00:00:00 2001
++From: Mathieu Parent <math.parent@gmail.com>
++Date: Tue, 27 Oct 2009 23:06:46 +0100
++Subject: [PATCH 5/7] Install lang files
++
++---
++ pico/Makefile.am | 9 +++++++++
++ 1 files changed, 9 insertions(+), 0 deletions(-)
++
++diff --git a/pico/Makefile.am b/pico/Makefile.am
++index 9151042..8898050 100644
++--- a/pico/Makefile.am
+++++ b/pico/Makefile.am
++@@ -70,6 +70,15 @@ libttspico_la_HEADERS = \
++ lib/picotrns.h \
++ lib/picowa.h
++
+++picolangdir = $(datadir)/pico/lang
+++picolang_DATA = \
+++ lang/de-DE*.bin \
+++ lang/en-GB*.bin \
+++ lang/en-US*.bin \
+++ lang/es-ES*.bin \
+++ lang/fr-FR*.bin \
+++ lang/it-IT*.bin
+++
++ bin_PROGRAMS = pico2wave
++ pico2wave_SOURCES = \
++ bin/pico2wave.c
++--
++1.7.1
++
+diff --git a/feeds/packages/sound/svox/patches/0006-Set-picolangdir.patch b/feeds/packages/sound/svox/patches/0006-Set-picolangdir.patch
+new file mode 100644
+index 0000000..1ec646d
+--- /dev/null
++++ b/feeds/packages/sound/svox/patches/0006-Set-picolangdir.patch
+@@ -0,0 +1,40 @@
++From 0102d423b79de7af982c8d4619d816f95a9b9278 Mon Sep 17 00:00:00 2001
++From: Mathieu Parent <math.parent@gmail.com>
++Date: Thu, 29 Oct 2009 23:55:19 +0100
++Subject: [PATCH 6/7] Set picolangdir
++
++---
++ pico/Makefile.am | 2 +-
++ pico/bin/pico2wave.c | 4 ++++
++ 2 files changed, 5 insertions(+), 1 deletions(-)
++
++diff --git a/pico/Makefile.am b/pico/Makefile.am
++index 8898050..a19c42a 100644
++--- a/pico/Makefile.am
+++++ b/pico/Makefile.am
++@@ -84,5 +84,5 @@ pico2wave_SOURCES = \
++ bin/pico2wave.c
++ pico2wave_LDADD = \
++ libttspico.la -lm -lpopt
++-pico2wave_CFLAGS = -Wall -I lib
+++pico2wave_CFLAGS = -Wall -Dpicolangdir=\"$(picolangdir)\" -I lib
++
++diff --git a/pico/bin/pico2wave.c b/pico/bin/pico2wave.c
++index 0c035a7..ec7ab79 100644
++--- a/pico/bin/pico2wave.c
+++++ b/pico/bin/pico2wave.c
++@@ -35,7 +35,11 @@
++
++ /* string constants */
++ #define MAX_OUTBUF_SIZE 128
+++#ifdef picolangdir
+++const char * PICO_LINGWARE_PATH = picolangdir "/";
+++#else
++ const char * PICO_LINGWARE_PATH = "./lang/";
+++#endif
++ const char * PICO_VOICE_NAME = "PicoVoice";
++
++ /* supported voices
++--
++1.7.1
++
+diff --git a/feeds/packages/sound/svox/patches/0008-64bits.patch b/feeds/packages/sound/svox/patches/0008-64bits.patch
+new file mode 100644
+index 0000000..883a42e
+--- /dev/null
++++ b/feeds/packages/sound/svox/patches/0008-64bits.patch
+@@ -0,0 +1,26 @@
++Description: fix execution on 64bit archs
++Bug: http://code.google.com/p/android/issues/detail?id=12224
++Author: Samuel Thibault <sthibault@debian.org>
++
++--- svox/pico/lib/picoapi.c.original 2010-10-25 19:06:57.000000000 +0200
+++++ svox/pico/lib/picoapi.c 2010-10-25 19:07:18.000000000 +0200
++@@ -90,7 +90,7 @@
++ status = PICO_ERR_NULLPTR_ACCESS;
++ } else {
++ byte_ptr_t rest_mem;
++- picoos_uint32 rest_mem_size;
+++ picoos_objsize_t rest_mem_size;
++ pico_System sys;
++ picoos_MemoryManager sysMM;
++ picoos_ExceptionManager sysEM;
++--- svox/pico/lib/picosig2.c.original 2010-10-26 00:17:18.000000000 +0200
+++++ svox/pico/lib/picosig2.c 2010-10-26 00:17:19.000000000 +0200
++@@ -568,7 +568,7 @@
++ for (nI = 1; nI < m1; nI++) {
++ XXr[nI] = c1[nI] << shift;
++ }
++- i = sizeof(picoos_int32) * (PICODSP_FFTSIZE + 1 - m1);
+++ i = sizeof(picoos_int32) * (PICODSP_FFTSIZE - m1);
++ picoos_mem_set(XXr + m1, 0, i);
++ dfct_nmf(m4, XXr); /* DFCT directly in fixed point */
++
+diff --git a/feeds/packages/sound/svox/patches/0009-Fix-link-order.patch b/feeds/packages/sound/svox/patches/0009-Fix-link-order.patch
+new file mode 100644
+index 0000000..bcf3870
+--- /dev/null
++++ b/feeds/packages/sound/svox/patches/0009-Fix-link-order.patch
+@@ -0,0 +1,21 @@
++Index: svox-1.0+git20130326/pico/Makefile.am
++===================================================================
++--- svox-1.0+git20130326.orig/pico/Makefile.am 2013-11-12 12:37:05.939979854 -0500
+++++ svox-1.0+git20130326/pico/Makefile.am 2013-11-12 13:00:52.336945041 -0500
++@@ -70,6 +70,8 @@
++ lib/picotrns.h \
++ lib/picowa.h
++
+++libttspico_la_LIBADD = -lm
+++
++ picolangdir = $(datadir)/pico/lang
++ picolang_DATA = \
++ lang/de-DE*.bin \
++@@ -83,6 +85,6 @@
++ pico2wave_SOURCES = \
++ bin/pico2wave.c
++ pico2wave_LDADD = \
++- libttspico.la -lm -lpopt
+++ libttspico.la -lpopt
++ pico2wave_CFLAGS = -Wall -Dpicolangdir=\"$(picolangdir)\" -I lib
++
+diff --git a/feeds/packages/sound/svox/patches/0010-platform.patch b/feeds/packages/sound/svox/patches/0010-platform.patch
+new file mode 100644
+index 0000000..ff76f75
+--- /dev/null
++++ b/feeds/packages/sound/svox/patches/0010-platform.patch
+@@ -0,0 +1,30 @@
++--- a/pico/lib/picopltf.h
+++++ b/pico/lib/picopltf.h
++@@ -39,6 +39,8 @@
++ #define PICO_MacOSX 5 /* Macintosh OS X */
++ #define PICO_Linux 7 /* Linux */
++
+++#define PICO_GENERIC 99 /* Generic */
+++
++ /* * definition of current platform ***/
++ #if !defined(PICO_PLATFORM)
++ #if defined(_WIN32)
++@@ -48,7 +50,7 @@
++ #elif defined(linux) || defined(__linux__) || defined(__linux)
++ #define PICO_PLATFORM PICO_Linux
++ #else
++-#error PICO_PLATFORM not defined
+++#define PICO_PLATFORM PICO_GENERIC
++ #endif
++ #endif /* !defined(PICO_PLATFORM) */
++
++@@ -64,7 +66,8 @@
++ #define PICO_PLATFORM_STRING "UnknownPlatform"
++ #endif
++
++-#if (PICO_PLATFORM == PICO_MacOSX)
+++#include <endian.h>
+++#if __BYTE_ORDER == __BIG_ENDIAN
++ #define PICO_ENDIANNESS ENDIANNESS_BIG
++ #else
++ #define PICO_ENDIANNESS ENDIANNESS_LITTLE
+diff --git a/feeds/packages/sound/svox/patches/0011-subdir.patch b/feeds/packages/sound/svox/patches/0011-subdir.patch
+new file mode 100644
+index 0000000..fa9e91f
+--- /dev/null
++++ b/feeds/packages/sound/svox/patches/0011-subdir.patch
+@@ -0,0 +1,12 @@
++diff -urN a/pico/configure.in b/pico/configure.in
++--- a/pico/configure.in 2015-01-21 18:59:39.604452795 +0100
+++++ b/pico/configure.in 2015-01-21 19:00:53.288777298 +0100
++@@ -4,7 +4,7 @@
++
++ AC_INIT([svox], [1.0], [math.parent@gmail.com])
++
++-AM_INIT_AUTOMAKE([1.9 foreign])
+++AM_INIT_AUTOMAKE([1.9 foreign subdir-objects])
++
++ AC_PROG_CC
++ LT_INIT
+diff --git a/feeds/packages/sound/svox/patches/0012-no-headers.patch b/feeds/packages/sound/svox/patches/0012-no-headers.patch
+new file mode 100644
+index 0000000..edf4d04
+--- /dev/null
++++ b/feeds/packages/sound/svox/patches/0012-no-headers.patch
+@@ -0,0 +1,46 @@
++diff -urN a/pico/Makefile.am b/pico/Makefile.am
++--- a/pico/Makefile.am 2015-01-22 01:33:21.470895431 +0100
+++++ b/pico/Makefile.am 2015-01-22 01:36:03.042228475 +0100
++@@ -34,42 +34,6 @@
++ lib/picotrns.c \
++ lib/picowa.c
++
++-libttspico_ladir = $(includedir)
++-libttspico_la_HEADERS = \
++- lib/picoacph.h \
++- lib/picoapid.h \
++- lib/picoapi.h \
++- lib/picobase.h \
++- lib/picocep.h \
++- lib/picoctrl.h \
++- lib/picodata.h \
++- lib/picodbg.h \
++- lib/picodefs.h \
++- lib/picodsp.h \
++- lib/picoextapi.h \
++- lib/picofftsg.h \
++- lib/picokdbg.h \
++- lib/picokdt.h \
++- lib/picokfst.h \
++- lib/picoklex.h \
++- lib/picoknow.h \
++- lib/picokpdf.h \
++- lib/picokpr.h \
++- lib/picoktab.h \
++- lib/picoos.h \
++- lib/picopal.h \
++- lib/picopam.h \
++- lib/picopltf.h \
++- lib/picopr.h \
++- lib/picorsrc.h \
++- lib/picosa.h \
++- lib/picosig2.h \
++- lib/picosig.h \
++- lib/picospho.h \
++- lib/picotok.h \
++- lib/picotrns.h \
++- lib/picowa.h
++-
++ libttspico_la_LIBADD = -lm
++
++ picolangdir = $(datadir)/pico/lang
+diff --git a/feeds/packages/sound/upmpdcli/Config.in b/feeds/packages/sound/upmpdcli/Config.in
+new file mode 100644
+index 0000000..fe32722
+--- /dev/null
++++ b/feeds/packages/sound/upmpdcli/Config.in
+@@ -0,0 +1,17 @@
++config PACKAGE_UPMPDCLI_SCCTL
++ bool "scctl command for configuring SongCast receivers"
++ default no
++ depends on PACKAGE_upmpdcli
++ help
++ Installs the scctl command. See the following link for more info:
++ http://www.lesbonscomptes.com/upmpdcli/scmulti.html
++
++config PACKAGE_UPMPDCLI_SC_WEB_INTERFACE
++ bool "SongCast web server and associated files (depends on python)"
++ default no
++ depends on PACKAGE_upmpdcli
++ select PACKAGE_python
++ select PACKAGE_UPMPDCLI_SCCTL
++ help
++ Installs the SongCast web interface and web server. See the following
++ link for more info: http://www.lesbonscomptes.com/upmpdcli/scmulti.html
+diff --git a/feeds/packages/sound/upmpdcli/Makefile b/feeds/packages/sound/upmpdcli/Makefile
+new file mode 100644
+index 0000000..42b98fa
+--- /dev/null
++++ b/feeds/packages/sound/upmpdcli/Makefile
+@@ -0,0 +1,63 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=upmpdcli
++PKG_VERSION:=0.11.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.lesbonscomptes.com/upmpdcli/downloads
++PKG_MD5SUM:=40eb2a1988ca367a690fb2506e0f73c1
++PKG_MAINTAINER:=Petko Bordjukov <bordjukov@gmail.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/upmpdcli
++ SECTION:=sound
++ CATEGORY:=Sound
++ URL:=http://www.lesbonscomptes.com/upmpdcli
++ DEPENDS+= +libupnpp +libmpdclient
++ TITLE:=A UPnP front-end to MPD, the Music Player Daemon
++ USERID:=upmpdcli=89:upmpdcli=89
++ MENU:=1
++endef
++
++define Package/upmpdcli/description
++upmpdcli implements an UPnP Media Renderer, using MPD to perform the real work.
++endef
++
++define Package/upmpdcli/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/upmpdcli/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/upmpdcli.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/upmpdcli.config $(1)/etc/config/upmpdcli
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/upmpdcli $(1)/usr/bin/
++ifeq ($(CONFIG_PACKAGE_UPMPDCLI_SCCTL),y)
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/scctl $(1)/usr/bin/
++endif
++ $(INSTALL_DIR) $(1)/usr/share/upmpdcli
++ifneq ($(CONFIG_PACKAGE_UPMPDCLI_SC_WEB_INTERFACE),y)
++ $(RM) -rf $(PKG_INSTALL_DIR)/usr/share/upmpdcli/web
++endif
++ $(CP) -r $(PKG_INSTALL_DIR)/usr/share/upmpdcli $(1)/usr/share/
++ $(INSTALL_DATA) ./files/upmpdcli.png $(1)/usr/share/upmpdcli/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/upmpdcli.init $(1)/etc/init.d/upmpdcli
++endef
++
++$(eval $(call BuildPackage,upmpdcli))
+diff --git a/feeds/packages/sound/upmpdcli/files/upmpdcli.config b/feeds/packages/sound/upmpdcli/files/upmpdcli.config
+new file mode 100644
+index 0000000..56b0ba3
+--- /dev/null
++++ b/feeds/packages/sound/upmpdcli/files/upmpdcli.config
+@@ -0,0 +1,15 @@
++config upmpdcli lan
++ option interface 'br-lan'
++# option friendly_name 'upmpdcli'
++# option mpd_host '127.0.0.1'
++# option mpd_port '6600'
++# option upmpd_port '0'
++# option config '/etc/upmpdcli.conf'
++
++# Add additional interfaces
++#
++#config upmpdcli wifi
++# option interface 'wlan0'
++
++#config upmpdcli wan
++# option interface 'eth0'
+diff --git a/feeds/packages/sound/upmpdcli/files/upmpdcli.init b/feeds/packages/sound/upmpdcli/files/upmpdcli.init
+new file mode 100644
+index 0000000..6c69209
+--- /dev/null
++++ b/feeds/packages/sound/upmpdcli/files/upmpdcli.init
+@@ -0,0 +1,51 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++NAME=upmpdcli
++START=95
++
++UPMPD_BIN=/usr/bin/${NAME}
++
++USE_PROCD=1
++
++append_arg() {
++ local cfg="$1"
++ local var="$2"
++ local opt="$3"
++ local def="$4"
++ local val
++
++ config_get val "$cfg" "$var"
++ [ -n "$val" -o -n "$def" ] && procd_append_param command $opt "${val:-$def}"
++}
++
++start_instance() {
++ local cfg="$1"
++ local interface
++
++ procd_open_instance
++
++ procd_set_param command "${UPMPD_BIN}"
++
++# config_get interface "$cfg" interface
++# procd_add_reload_interface_trigger $interface
++
++ append_arg "$cfg" interface "-i"
++ append_arg "$cfg" mpd_host "-h"
++ append_arg "$cfg" mpd_port "-p"
++ append_arg "$cfg" upmpd_port "-P"
++
++ append_arg "$cfg" config "-c"
++ append_arg "$cfg" friendly_name "-f"
++
++ procd_close_instance
++}
++
++service_triggers() {
++ procd_add_reload_trigger "${NAME}"
++}
++
++start_service() {
++ config_load ${NAME}
++ config_foreach start_instance ${NAME}
++}
+diff --git a/feeds/packages/sound/upmpdcli/files/upmpdcli.png b/feeds/packages/sound/upmpdcli/files/upmpdcli.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..ba50c644635a16c0e6de170ca53052f7928cd3d4
+GIT binary patch
+literal 1640
+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
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/packages/sound/upmpdcli/patches/010-Add_icon_config.patch b/feeds/packages/sound/upmpdcli/patches/010-Add_icon_config.patch
+new file mode 100644
+index 0000000..9b1ca6d
+--- /dev/null
++++ b/feeds/packages/sound/upmpdcli/patches/010-Add_icon_config.patch
+@@ -0,0 +1,9 @@
++--- a/src/upmpdcli.conf
+++++ b/src/upmpdcli.conf
++@@ -53,3 +53,6 @@ ohmetapersist = 1
++ # Path to the sc2mpd if it is not in /usr/bin and the location is not in
++ # the PATH for the init scripts.
++ #sc2mpd = /usr/bin/sc2mpd
+++
+++# Icon for MPD UPnP interface
+++iconpath = /usr/share/upmpdcli/upmpdcli.png
+diff --git a/feeds/packages/utils/acl/Makefile b/feeds/packages/utils/acl/Makefile
+new file mode 100644
+index 0000000..8f3ea7d
+--- /dev/null
++++ b/feeds/packages/utils/acl/Makefile
+@@ -0,0 +1,88 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=acl
++PKG_REV:=62ce6354ef5a8eb5644908748f79c8cd18474d4c
++PKG_VERSION:=20140812
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=git://git.sv.gnu.org/acl.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
++
++PKG_LICENSE:=LGPL-2.1 GPL-2.0
++PKG_LICENSE_FILES:=doc/COPYING doc/COPYING.LGPL
++
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/acl/Default
++ TITLE:=Access control list (ACL) manipulation
++ URL:=http://savannah.nongnu.org/projects/acl
++ SUBMENU:=Filesystem
++endef
++
++define Package/acl/Default/description
++ Access control list support
++endef
++
++define Package/acl
++$(call Package/acl/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+=utils
++ DEPENDS:=+libacl
++endef
++
++define Package/libacl
++$(call Package/acl/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+=library
++ DEPENDS:=+libattr
++endef
++
++define Package/libacl/description
++$(call Package/acl/Default/description)
++ This package provides libacl
++endef
++
++define Package/acl/description
++$(call Package/acl/Default/description)
++ This package provides ACL manipulation utilities
++ - chacl
++ - getfacl
++ - setfacl
++endef
++
++CONFIGURE_ARGS += --enable-static --enable-shared
++
++define Package/acl/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++define Package/libacl/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
++endef
++
++define Build/InstallDev
++ mkdir -p $(1)/usr/include
++ mkdir -p $(1)/usr/lib/pkgconfig
++ $(CP) -r $(PKG_INSTALL_DIR)/usr/{include,lib} $(1)/usr/
++endef
++
++$(eval $(call BuildPackage,acl))
++$(eval $(call BuildPackage,libacl))
+diff --git a/feeds/packages/utils/acl/patches/100-no-gettext_configure.patch b/feeds/packages/utils/acl/patches/100-no-gettext_configure.patch
+new file mode 100644
+index 0000000..e7b419e
+--- /dev/null
++++ b/feeds/packages/utils/acl/patches/100-no-gettext_configure.patch
+@@ -0,0 +1,21 @@
++diff --git a/configure.ac b/configure.ac
++index 2182e81..4836b3d 100644
++--- a/configure.ac
+++++ b/configure.ac
++@@ -31,9 +31,6 @@ AC_FUNC_GCC_VISIBILITY
++ AM_PROG_AR
++ LT_INIT
++
++-AM_GNU_GETTEXT_VERSION([0.18.2])
++-AM_GNU_GETTEXT([external])
++-
++ AC_ARG_ENABLE([debug],
++ [AS_HELP_STRING([--enable-debug], [Enable extra debugging])])
++ AS_IF([test "x$enable_debug" = "xyes"],
++@@ -61,6 +58,5 @@ AC_CONFIG_COMMANDS([include/sys],
++ AC_CONFIG_FILES([
++ libacl.pc
++ Makefile
++- po/Makefile.in
++ ])
++ AC_OUTPUT
+diff --git a/feeds/packages/utils/acl/patches/101-no-gettext_autogen.patch b/feeds/packages/utils/acl/patches/101-no-gettext_autogen.patch
+new file mode 100644
+index 0000000..1fad67a
+--- /dev/null
++++ b/feeds/packages/utils/acl/patches/101-no-gettext_autogen.patch
+@@ -0,0 +1,9 @@
++diff --git a/autogen.sh b/autogen.sh
++index a98a3c5..982aff1 100755
++--- a/autogen.sh
+++++ b/autogen.sh
++@@ -1,4 +1,2 @@
++ #!/bin/sh -ex
++-po/update-potfiles
++-autopoint --force
++ exec autoreconf -f -i
+diff --git a/feeds/packages/utils/acl/patches/102-no-gettext_Makefile.patch b/feeds/packages/utils/acl/patches/102-no-gettext_Makefile.patch
+new file mode 100644
+index 0000000..d7e7377
+--- /dev/null
++++ b/feeds/packages/utils/acl/patches/102-no-gettext_Makefile.patch
+@@ -0,0 +1,13 @@
++diff --git a/Makefile.am b/Makefile.am
++index 47d2a4e..d02ee91 100644
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -3,8 +3,6 @@ ACLOCAL_AMFLAGS = -I m4
++ EXTRA_DIST = \
++ exports
++
++-SUBDIRS = po
++-
++ AM_CPPFLAGS = \
++ -I$(top_builddir)/include \
++ -I$(top_srcdir)/include \
+diff --git a/feeds/packages/utils/acpid/Makefile b/feeds/packages/utils/acpid/Makefile
+new file mode 100644
+index 0000000..d542712
+--- /dev/null
++++ b/feeds/packages/utils/acpid/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2012-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=acpid
++PKG_VERSION:=2.0.25
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@SF/acpid2
++PKG_MD5SUM:=69bb0cc4a0a89eb2dfecc4851087f568
++PKG_MAINTAINER:=Thomas Heil<heil@terminal-consulting.de>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/acpid
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=The ACPI Daemon (acpid) With Netlink Support
++ URL:=http://tedfelix.com/linux/acpid-netlink.html
++ DEPENDS:=@(TARGET_x86||TARGET_x86_64) +kmod-input-evdev
++endef
++
++define Package/acpid/description
++ The ACPI Daemon (acpid) With Netlink Support
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ CC="$(TARGET_CC)" \
++ LD="$(TARGET_CC)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ all
++endef
++
++define Package/acpid/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/acpid $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/acpi_listen $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/acpi/events
++ $(INSTALL_CONF) ./files/default $(1)/etc/acpi/events/default
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_CONF) ./files/acpid.init $(1)/etc/init.d/acpid
++ chmod 0750 $(1)/etc/init.d/acpid
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/input/
++ $(INSTALL_CONF) ./files/acpid.hotplug $(1)/etc/hotplug.d/input/
++endef
++
++define Package/acpid/postinst
++#!/bin/sh
++[ -n "$${IPKG_INSTROOT}" ] || {
++ echo "waiting for input devices to come up"
++ /etc/init.d/acpid enable
++ sleep 5
++ /etc/init.d/acpid start
++ echo "please try the power button"
++ exit 0
++}
++endef
++
++$(eval $(call BuildPackage,acpid))
+diff --git a/feeds/packages/utils/acpid/files/acpid.hotplug b/feeds/packages/utils/acpid/files/acpid.hotplug
+new file mode 100644
+index 0000000..6e08d01
+--- /dev/null
++++ b/feeds/packages/utils/acpid/files/acpid.hotplug
+@@ -0,0 +1,7 @@
++#!/bin/sh
++
++. /lib/functions.sh
++
++if [ "$ACTION" = add ] && [ "$DEVICENAME" = event0 ]; then
++ ( /etc/init.d/acpid/stop; sleep 3; /usr/sbin/acpid )&
++fi
+diff --git a/feeds/packages/utils/acpid/files/acpid.init b/feeds/packages/utils/acpid/files/acpid.init
+new file mode 100644
+index 0000000..3365aa0
+--- /dev/null
++++ b/feeds/packages/utils/acpid/files/acpid.init
+@@ -0,0 +1,25 @@
++#!/bin/ash /etc/rc.common
++# Copyright (C) 2009-2010 OpenWrt.org
++
++START=99
++STOP=80
++
++ACPID_BIN="/usr/sbin/acpid"
++ACPID_PID="/var/run/acpid.pid"
++
++start() {
++ [ -x "$ACPID_BIN" ] || return 1
++ start-stop-daemon -S -x $ACPID_BIN -p $ACPID_PID
++}
++
++boot() {
++ # Do nothing on boot
++ [ -x "$ACPID_BIN" ] || return 1
++ start-stop-daemon -S -x $ACPID_BIN -p $ACPID_PID
++ exit 0
++}
++
++stop() {
++ service_kill ${ACPID_BIN##*/} $ACPID_PID
++ rm -f $ACPID_PID
++}
+diff --git a/feeds/packages/utils/acpid/files/default b/feeds/packages/utils/acpid/files/default
+new file mode 100644
+index 0000000..cf8d9a3
+--- /dev/null
++++ b/feeds/packages/utils/acpid/files/default
+@@ -0,0 +1,5 @@
++# This is a sample ACPID configuration
++
++event=button/power.*
++action=/sbin/poweroff
++
+diff --git a/feeds/packages/utils/acpid/patches/002-dont-use-isfdtype.patch b/feeds/packages/utils/acpid/patches/002-dont-use-isfdtype.patch
+new file mode 100644
+index 0000000..cd4e062
+--- /dev/null
++++ b/feeds/packages/utils/acpid/patches/002-dont-use-isfdtype.patch
+@@ -0,0 +1,21 @@
++Partially roll back upstream commit 4711119089e1ad08dad206f4fded68f1972fdeed
++since released versions of uClibc don't support isfdtype().
++
++Signed-off-by: Gustavo Zaarias <gustavo@zacarias.com.ar>
++
++Index: acpid-2.0.23/sock.c
++===================================================================
++--- acpid-2.0.23.orig/sock.c
+++++ acpid-2.0.23/sock.c
++@@ -53,7 +53,10 @@ int non_root_clients;
++ int
++ is_socket(int fd)
++ {
++- return (isfdtype(fd, S_IFSOCK) == 1);
+++ int v;
+++ socklen_t l = sizeof(int);
+++
+++ return (getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&v, &l) == 0);
++ }
++
++ /* accept a new client connection */
+diff --git a/feeds/packages/utils/alsa-utils/Makefile b/feeds/packages/utils/alsa-utils/Makefile
+new file mode 100644
+index 0000000..44ff097
+--- /dev/null
++++ b/feeds/packages/utils/alsa-utils/Makefile
+@@ -0,0 +1,93 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=alsa-utils
++PKG_VERSION:=1.0.29
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=ftp://ftp.alsa-project.org/pub/utils/ \
++ http://alsa.cybermirror.org/utils/
++PKG_MD5SUM:=6b289bf874c4c9a63f4b3973093dd404
++PKG_INSTALL:=1
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/alsa-utils
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+alsa-lib +libncurses +libpthread
++ TITLE:=ALSA (Advanced Linux Sound Architecture) utilities
++ URL:=http://www.alsa-project.org/
++endef
++
++define Package/alsa-utils-seq
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+alsa-lib +libpthread
++ TITLE:=ALSA sequencer utilities
++ URL:=http://www.alsa-project.org/
++endef
++
++define Package/alsa-utils-tests
++ $(call Package/alsa-utils/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=ALSA utilities test data (adds ~1.3M to image)
++ DEPENDS:=+alsa-lib +libpthread
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --disable-rpath \
++ --disable-alsatest \
++ --disable-xmlto \
++ , \
++ ac_cv_prog_ncurses5_config=no \
++ ac_cv_prog_ncursesw5_config=no \
++ )
++endef
++
++define Package/alsa-utils/install
++ $(INSTALL_DIR) $(1)/usr/{s,}bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/amixer $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/alsamixer $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/aplay $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/arecord $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/alsactl $(1)/usr/sbin/
++
++ $(INSTALL_DIR) $(1)/usr/share/alsa/init
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/share/alsa/init/* \
++ $(1)/usr/share/alsa/init/
++endef
++
++define Package/alsa-utils-seq/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/aconnect $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/amidi $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/aplaymidi $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/arecordmidi $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/aseqdump $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/aseqnet $(1)/usr/bin/
++endef
++
++define Package/alsa-utils-tests/install
++ $(INSTALL_DIR) $(1)/usr/{s,}bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/speaker-test $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/share/sounds/alsa
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/share/sounds/alsa/* \
++ $(1)/usr/share/sounds/alsa/
++endef
++
++$(eval $(call BuildPackage,alsa-utils))
++$(eval $(call BuildPackage,alsa-utils-seq))
++$(eval $(call BuildPackage,alsa-utils-tests))
+diff --git a/feeds/packages/utils/alsa-utils/patches/100-uClibc-compat.patch b/feeds/packages/utils/alsa-utils/patches/100-uClibc-compat.patch
+new file mode 100644
+index 0000000..987c9b8
+--- /dev/null
++++ b/feeds/packages/utils/alsa-utils/patches/100-uClibc-compat.patch
+@@ -0,0 +1,23 @@
++--- a/alsamixer/volume_mapping.c
+++++ b/alsamixer/volume_mapping.c
++@@ -114,9 +114,9 @@ static double get_normalized_volume(snd_
++ if (use_linear_dB_scale(min, max))
++ return (value - min) / (double)(max - min);
++
++- normalized = exp10((value - max) / 6000.0);
+++ normalized = pow(10, (value - max) / 6000.0);
++ if (min != SND_CTL_TLV_DB_GAIN_MUTE) {
++- min_norm = exp10((min - max) / 6000.0);
+++ min_norm = pow(10, (min - max) / 6000.0);
++ normalized = (normalized - min_norm) / (1 - min_norm);
++ }
++
++@@ -149,7 +149,7 @@ static int set_normalized_volume(snd_mix
++ }
++
++ if (min != SND_CTL_TLV_DB_GAIN_MUTE) {
++- min_norm = exp10((min - max) / 6000.0);
+++ min_norm = pow(10, (min - max) / 6000.0);
++ volume = volume * (1 - min_norm) + min_norm;
++ }
++ value = lrint_dir(6000.0 * log10(volume), dir) + max;
+diff --git a/feeds/packages/utils/attr/Makefile b/feeds/packages/utils/attr/Makefile
+new file mode 100644
+index 0000000..80da9cc
+--- /dev/null
++++ b/feeds/packages/utils/attr/Makefile
+@@ -0,0 +1,93 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=attr
++PKG_REV:=c252ef434219891f616d891b46aad6b06efdd185
++PKG_VERSION:=20150220
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=git://git.sv.gnu.org/attr.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
++
++PKG_LICENSE:=LGPL-2.1 GPL-2.0
++PKG_LICENSE_FILES:=doc/COPYING doc/COPYING.LGPL
++
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/attr/Default
++ TITLE:=Extended attributes (xattr) manipulation
++ URL:=http://savannah.nongnu.org/projects/attr
++ SUBMENU:=Filesystem
++endef
++
++define Package/attr/Default/description
++ Extended attributes support
++endef
++
++define Package/attr
++$(call Package/attr/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+=utils
++ DEPENDS:=+libattr
++endef
++
++define Package/libattr
++$(call Package/attr/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+=library
++endef
++
++define Package/libattr/description
++$(call Package/attr/Default/description)
++ This package provides libattr
++endef
++
++define Package/attr/description
++$(call Package/attr/Default/description)
++ This package provides xattr manipulation utilities
++ - attr
++ - getfattr
++ - setfattr
++endef
++
++CONFIGURE_ARGS += --enable-static --enable-shared
++
++define Package/attr/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++define Package/libattr/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_INSTALL_DIR)/etc $(1)/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/*.so* $(1)/usr/lib/
++endef
++
++define Package/attr/conffiles
++/etc/xattr.conf
++endef
++
++define Build/InstallDev
++ mkdir -p $(1)/usr/include
++ mkdir -p $(1)/usr/lib/pkgconfig
++ $(CP) -r $(PKG_INSTALL_DIR)/usr/{include,lib} $(1)/usr/
++endef
++
++$(eval $(call BuildPackage,attr))
++$(eval $(call BuildPackage,libattr))
+diff --git a/feeds/packages/utils/attr/patches/100-no-gettext_configure.patch b/feeds/packages/utils/attr/patches/100-no-gettext_configure.patch
+new file mode 100644
+index 0000000..2e8b4f4
+--- /dev/null
++++ b/feeds/packages/utils/attr/patches/100-no-gettext_configure.patch
+@@ -0,0 +1,21 @@
++diff --git a/configure.ac b/configure.ac
++index 8a1ca39..ceee757 100644
++--- a/configure.ac
+++++ b/configure.ac
++@@ -33,9 +33,6 @@ AC_FUNC_ALLOCA
++ AM_PROG_AR
++ LT_INIT
++
++-AM_GNU_GETTEXT_VERSION([0.18.2])
++-AM_GNU_GETTEXT([external])
++-
++ dnl Most people get these man(2) pages from the system now.
++ AC_ARG_ENABLE([man2],
++ [AS_HELP_STRING([--enable-man2], [Install man(2) pages])])
++@@ -59,6 +56,5 @@ AC_CONFIG_COMMANDS([include/attr],
++ AC_CONFIG_FILES([
++ libattr.pc
++ Makefile
++- po/Makefile.in
++ ])
++ AC_OUTPUT
+diff --git a/feeds/packages/utils/attr/patches/101-no-gettext_autogen.patch b/feeds/packages/utils/attr/patches/101-no-gettext_autogen.patch
+new file mode 100644
+index 0000000..1fad67a
+--- /dev/null
++++ b/feeds/packages/utils/attr/patches/101-no-gettext_autogen.patch
+@@ -0,0 +1,9 @@
++diff --git a/autogen.sh b/autogen.sh
++index a98a3c5..982aff1 100755
++--- a/autogen.sh
+++++ b/autogen.sh
++@@ -1,4 +1,2 @@
++ #!/bin/sh -ex
++-po/update-potfiles
++-autopoint --force
++ exec autoreconf -f -i
+diff --git a/feeds/packages/utils/attr/patches/102-no-gettext_Makefile.patch b/feeds/packages/utils/attr/patches/102-no-gettext_Makefile.patch
+new file mode 100644
+index 0000000..76c8dcd
+--- /dev/null
++++ b/feeds/packages/utils/attr/patches/102-no-gettext_Makefile.patch
+@@ -0,0 +1,13 @@
++diff --git a/Makefile.am b/Makefile.am
++index a3e8353..381bb55 100644
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -3,8 +3,6 @@ ACLOCAL_AMFLAGS = -I m4
++ EXTRA_DIST = \
++ exports
++
++-SUBDIRS = po
++-
++ AM_CPPFLAGS = \
++ -I$(top_builddir)/include \
++ -I$(top_srcdir)/include \
+diff --git a/feeds/packages/utils/avrdude/Makefile b/feeds/packages/utils/avrdude/Makefile
+new file mode 100644
+index 0000000..08f37c0
+--- /dev/null
++++ b/feeds/packages/utils/avrdude/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=avrdude
++PKG_VERSION:=6.1
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://download.savannah.gnu.org/releases/avrdude
++PKG_MD5SUM:=9db8c25b935d34234b9b1ba16ad55fd5
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/avrdude
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=AVR Downloader/UploaDEr
++ URL:=http://www.nongnu.org/avrdude/
++ DEPENDS:=+libncurses +libreadline +libusb-compat +libftdi1 +libelf1
++endef
++
++define Package/avrdude/description
++ AVRDUDE is a full featured program for programming Atmel's AVR CPU's.
++endef
++
++CONFIGURE_ARGS+= \
++ --disable-doc \
++ --disable-parport \
++ --enable-linuxgpio \
++
++TARGET_CFLAGS+= \
++ -D_GNU_SOURCE \
++
++define Package/avrdude/conffiles
++/etc/avrdude.conf
++endef
++
++define Package/avrdude/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/avrdude.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/avrdude $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,avrdude))
+diff --git a/feeds/packages/utils/avrdude/patches/010-configure-fixups.patch b/feeds/packages/utils/avrdude/patches/010-configure-fixups.patch
+new file mode 100644
+index 0000000..b945ecb
+--- /dev/null
++++ b/feeds/packages/utils/avrdude/patches/010-configure-fixups.patch
+@@ -0,0 +1,18 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -35,6 +35,7 @@ AC_CONFIG_HEADERS(ac_cfg.h)
++
++ # Checks for programs.
++ AC_PROG_CC
+++AC_PROG_CPP
++ AC_PROG_INSTALL
++ AC_PROG_SED
++ AC_PROG_YACC
++@@ -183,6 +184,7 @@ fi
++ AC_SUBST(LIBPTHREAD, $LIBPTHREAD)
++ # Checks for header files.
++ AC_CHECK_HEADERS([limits.h stdlib.h string.h])
+++AC_CHECK_HEADERS([inttypes.h stdint.h])
++ AC_CHECK_HEADERS([fcntl.h sys/ioctl.h sys/time.h termios.h unistd.h])
++ AC_CHECK_HEADERS([ddk/hidsdi.h],,,[#include <windows.h>
++ #include <setupapi.h>])
+diff --git a/feeds/packages/utils/avrdude/patches/100-musl-compat.patch b/feeds/packages/utils/avrdude/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..6baedc0
+--- /dev/null
++++ b/feeds/packages/utils/avrdude/patches/100-musl-compat.patch
+@@ -0,0 +1,60 @@
++--- a/dfu.h
+++++ b/dfu.h
++@@ -25,6 +25,7 @@
++
++ #ifdef HAVE_LIBUSB
++ #if defined(HAVE_USB_H)
+++# include <sys/types.h>
++ # include <usb.h>
++ #elif defined(HAVE_LUSB0_USB_H)
++ # include <lusb0_usb.h>
++--- a/pickit2.c
+++++ b/pickit2.c
++@@ -50,6 +50,7 @@
++ #include <string.h>
++ #include <inttypes.h>
++ #include <unistd.h>
+++#include <sys/types.h>
++
++ #include "avrdude.h"
++ #include "avr.h"
++--- a/ser_avrdoper.c
+++++ b/ser_avrdoper.c
++@@ -248,6 +248,7 @@ static int usbGetReport(union filedescri
++ /* ------------------------------------------------------------------------ */
++
++ #if defined(HAVE_USB_H)
+++# include <sys/types.h>
++ # include <usb.h>
++ #elif defined(HAVE_LUSB0_USB_H)
++ # include <lusb0_usb.h>
++--- a/usbtiny.c
+++++ b/usbtiny.c
++@@ -41,6 +41,7 @@
++
++ #if defined(HAVE_LIBUSB) // we use LIBUSB to talk to the board
++ #if defined(HAVE_USB_H)
+++# include <sys/types.h>
++ # include <usb.h>
++ #elif defined(HAVE_LUSB0_USB_H)
++ # include <lusb0_usb.h>
++--- a/usbasp.c
+++++ b/usbasp.c
++@@ -54,6 +54,7 @@
++ # endif
++ #else
++ # if defined(HAVE_USB_H)
+++# include <sys/types.h>
++ # include <usb.h>
++ # elif defined(HAVE_LUSB0_USB_H)
++ # include <lusb0_usb.h>
++--- a/usb_libusb.c
+++++ b/usb_libusb.c
++@@ -36,6 +36,7 @@
++ #include <sys/time.h>
++
++ #if defined(HAVE_USB_H)
+++# include <sys/types.h>
++ # include <usb.h>
++ #elif defined(HAVE_LUSB0_USB_H)
++ # include <lusb0_usb.h>
+diff --git a/feeds/packages/utils/bandwidthd/Makefile b/feeds/packages/utils/bandwidthd/Makefile
+new file mode 100644
+index 0000000..6ef14e5
+--- /dev/null
++++ b/feeds/packages/utils/bandwidthd/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bandwidthd
++PKG_VERSION:=2.0.1
++PKG_RELEASE:=4
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=@SF/bandwidthd
++PKG_MD5SUM:=aa79aad7bd489fd2cae1f7dc086ca8b6
++
++PKG_MAINTAINER:=Jean-Michel Lacroix <lacroix@lepine-lacroix.info>
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bandwidthd
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Bandwidthd
++ URL:=http://bandwidthd.sourceforge.net/
++ DEPENDS:=+libgd +libpcap
++endef
++
++define Package/bandwidthd/daemon
++ This package contains bandwidthd a bandwith tracking utility.
++endef
++
++CONFIGURE_ARGS += \
++ ac_cv_file__sw_lib=no \
++ ac_cv_file__sw_include=no \
++ ac_cv_file__usr_pkg_lib=no \
++ ac_cv_file__usr_pkg_include=no \
++ ac_cv_file__usr_local_pgsql_lib=no \
++ ac_cv_file__usr_local_pgsql_include=no \
++ ac_cv_lib_pq_PQconnectdb=no \
++
++EXTRA_CFLAGS+= $(TARGET_CPPFLAGS)
++EXTRA_LDFLAGS+= $(TARGET_LDFLAGS) -Wl,-rpath-link,$(STAGING_DIR)/usr/lib
++
++define Package/bandwidthd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bandwidthd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/bandwidthd.config $(1)/etc/config/bandwidthd
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/bandwidthd.init $(1)/etc/init.d/bandwidthd
++ $(INSTALL_DIR) $(1)/www
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/htdocs/legend.gif $(1)/www/
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/htdocs/logo.gif $(1)/www/
++endef
++
++define Package/bandwidthd/conffiles
++/etc/config/bandwidthd
++endef
++
++$(eval $(call BuildPackage,bandwidthd))
+diff --git a/feeds/packages/utils/bandwidthd/files/bandwidthd.config b/feeds/packages/utils/bandwidthd/files/bandwidthd.config
+new file mode 100644
+index 0000000..4bb18cf
+--- /dev/null
++++ b/feeds/packages/utils/bandwidthd/files/bandwidthd.config
+@@ -0,0 +1,11 @@
++config bandwidthd
++ option dev br-lan
++ option subnets "192.168.0.0/16 10.0.0.0/8 172.16.0.0/12"
++ option skip_intervals 0
++ option graph_cutoff 1024
++ option promiscuous true
++ option output_cdf false
++ option recover_cdf false
++ option filter ip
++ option graph true
++ option meta_refresh 150
+diff --git a/feeds/packages/utils/bandwidthd/files/bandwidthd.init b/feeds/packages/utils/bandwidthd/files/bandwidthd.init
+new file mode 100644
+index 0000000..6483daa
+--- /dev/null
++++ b/feeds/packages/utils/bandwidthd/files/bandwidthd.init
+@@ -0,0 +1,88 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008-2011 OpenWrt.org
++
++START=99
++
++config_cb() {
++ local cfg_type="$1"
++ local cfg_name="$2"
++
++ case "$cfg_type" in
++ bandwidthd)
++ append cfgs "$cfg_name"
++ ;;
++ esac
++}
++
++export_bool() {
++ local option="$1"
++ local section="$2"
++ local _loctmp
++ config_get_bool _loctmp "$section" "$option"
++ if [ -n "$_loctmp" ]; then
++ conffile="${conffile}$option "
++ if [ 1 -eq "$_loctmp" ]; then
++ conffile="${conffile}true"
++ else
++ conffile="${conffile}false"
++ fi
++ conffile="${conffile}\n"
++ fi
++}
++
++export_number() {
++ local option="$1"
++ local section="$2"
++ local _loctmp
++ config_get _loctmp "$section" "$option"
++ if [ -n "$_loctmp" ]; then
++ conffile="${conffile}$option ${_loctmp}\n"
++ fi
++}
++
++export_string() {
++ local option="$1"
++ local section="$2"
++ local _loctmp
++ config_get _loctmp "$section" "$option"
++ if [ -n "$_loctmp" ]; then
++ conffile="${conffile}$option \"${_loctmp}\"\n"
++ fi
++}
++
++start() {
++ local subnet conffile
++
++ [ -d /tmp/bandwidthd ] || mkdir -p /tmp/bandwidthd && cp /www/legend.gif /www/logo.gif /tmp/bandwidthd/
++ [ -e /htdocs ] || ln -s /tmp/bandwidthd /htdocs
++ [ -e /www/bandwidthd ] || ln -s /tmp/bandwidthd /www/bandwidthd
++ rm -f /tmp/bandwidthd.conf
++ touch /tmp/bandwidthd.conf
++ [ -e /etc/bandwidthd.conf ] || ln -s /tmp/bandwidthd.conf /etc/bandwidthd.conf
++
++
++ config_load bandwidthd
++ for cfg in $cfgs; do
++ config_get subnets $cfg subnets
++ for subnet in $subnets; do
++ conffile="${conffile}subnet ${subnet}\n"
++ done
++ export_string dev $cfg
++ export_number skip_intervals $cfg
++ export_number graph_cutoff $cfg
++ export_bool promiscuous $cfg
++ export_bool output_cdf $cfg
++ export_bool recover_cdf $cfg
++ export_string filter $cfg
++ export_bool graph $cfg
++ export_number meta_refresh $cfg
++ [ -n "$conffile" ] && echo -e "$conffile" >>/tmp/bandwidthd.conf
++ unset conffile
++ done
++ cd /
++ service_start /usr/sbin/bandwidthd
++}
++
++stop() {
++ service_stop /usr/sbin/bandwidthd
++}
+diff --git a/feeds/packages/utils/bandwidthd/files/logo.gif b/feeds/packages/utils/bandwidthd/files/logo.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..7b17cc6cbc70b45aa4b21bcf6bb3f6d6462760e7
+GIT binary patch
+literal 7573
+zcmYLq2{@GB7ymm8hS1AcvovGNl6?&^Gj`c!DU`8iDP&*A5<_+(`&hE?TT;qSB1@9B
+zLe@l5AvAw|fB*mUKhJaSIp;m+^EvOi_qos2($Q3q$J0Wyfdk;5kjVh-H?_1=c6i~d
+zk^esE1wJ8@$?VN~BO@b%3BI!!Ok82xhYugf<WNF(b6N8%1F`|#_J!G%?Id#2$b}1e
+zH7{O`eOmVP+<W=bDWRF2%#Oukw+jp9n_PEycgbXFPqOD#_q>zc-Dj@`MrKx}rO7v<
+zLZr#kuV<Gjw~_q({Hv?0pKNVMva{7m(Fv9P?g=$F2xZL!vtuAA;hBtTHoZx{`SIh&
+zvKQ}0$RjgLU#rMfQQOJi_kSbDrB}CqtPu#m#>Qk`*p5g`M@B|^HJ1vJh0@EO9ew&l
+zCSL%_Aen5=L&9Uom@abHf{_uK+;nho5KWFYH#euHrS(g%S4@bhudiPtukF^?V>}D#
+zW(95%GkOPJXE%=^$OyG<BirV*8&Nfa%~s6J<ZN;_nv7lz58q5q<{i+PA<vvq5=gJO
+zhH+ZWfx+b9k>+O6z?ik&1EHu8C$du;xeXwn?Q?d+vtI8<&thIQWi=0HXJ=2MP(`MP
+z{waGW{xN43^_3X_&NRcD^}mDpw_N_i2s{!w^w++A=zn%5WaYCM0FVIHzvNjR;Y=ZC
+zF2ofHfZtF2OOF@<pR<~O`VYq@_di_pS*%vO;r|c&PyS)>noDOf=06|!d>W1euz&%e
+z{vYSRn!K|j?K2$hncqNW1kBmC{B6%T{{6>4UTX`r|7!mq59%N2j2{}-3(<R%)BVpT
+zjPn)%XO{0@h6?~(5J-UL%(uheb@0FA;N#*T>VD7po|u9=5<s2xyXdv#KMBzT{;ACI
+z|7Jk^-x<`;V($C@n*jkZ0c>aW|Lgs)@BbI|Idvf5jIVT_83;MEAu-x#n@=YH>rwE3
+zbN9#9fqyaj2>u`N^1t=poxmW-00V+kyMfdlg+K~h4>c6^#)7=MdD@M|{SVosT^EKL
+zO9qosYVn*pO{K5X1x>50UpGB@lO<t4oTt-VHkzw&e{12{cpsq<)^7A!r=?<|L_1wr
+ze*;-zTJ8{bIbXN6>V35(yIkn7FJ`*lwzsDg!jv#mW%XR~>Ki%qY@w5vtLMb@id8FY
+zd0HcfrTzoaJ$~Ryutn{y+zT{<w_eQjek5|7WQLAdNEyW$-lA+gx!*JR5@)E{7Siry
+zH&DTTF+Xi37D{Cb3JxjU^u9ApRo-{&s9!s7F?3IJB$b~kl5@afpdmz~N^No6pO?07
+z8pZZD969|v_;@9Sr?OXsELIHfzOz^5<+i?HbE?M4vj>)bG%F5)AKYJC*DkE~-9G0L
+zYZ1))j8G6@j6g@9ljRgF2u4s77o!bY4`8fJPKVdAjIKkoln9%RqFAVYcQ*AQwNGJ4
+zu<g@W9F=xV1cuAoHww#>^cWw0AyT^}iRq6*3P>+D0I1zzs+=)K36coc4I(idev*PM
+z?0#N0uWvk}HkLrg&TOWD>;Qe~6Gv;FFOJ##-U2ZgX4LnnSR9RylZ6AV4;55ar9U<s
+zSr#~+lXq%SfeTgP7r;4i3xhCS7R(3S`jy91?hUUsQ_}PNwl>RYM!MMHq%cK1yvR<=
+zwK7kWkY8SWlicQ7S?4`{r>3cCZmYT=tb3MK=QDp)db?l$11PI@CcL75S=O!j?ben<
+zZDuG9q`n3>|GtJ~B9dM1tzI>A@piz42kr4X)ne7?Rf$|T8a{vHVgoMHxbF-d|9JFo
+zf#~`Y)wD7&*$qvI;zH;VDX`k8u09O;W=u*P_vB{@?70Ai!7y0A&aR;+D1$FRlzJNV
+zrLn6wm`ZC7ee81QR)+>`uo%IqA8|i6JI5SK%V%^~uw`LPa{uTD2G2A_;THfW42G#8
+zJ+ea#s})iJCK}T6JCWt3eM9QcTE2jgcYdQI^}@PLn7lTf1ePs8yJ-R{Z6*`V;rm@3
+zA@s9D)Chs_?1CWi(cQA|?W{(BVfD|ew}m*IZ@IW^u4OPD?^u4wFv#f^7KlCK3TuB?
+zoOSolW<`13pRJ1Yw|~Ai48CmNbTkwjU!nA^Yya{{y!7}R!qVVqwOwQiuGwK#VDy8o
+z(gqBXfS^u)PFdVL{WarUfBJjDfA{p@bFBE^!!KF){vK_V*Z=*q{dD*5fqBC?mP!ah
+zI5<6AuP6UKIXHV!09q12rQHR+@ST9rBSBf&kcE~B5g<8%1b>Jt9M}6E$u>gLG5?LE
+z3zCS$B6_G~d%Cw1jHG##mn=JQC}x$?Xfb6SyZ|rjz(N8+#SKr}>MbABrz3zRc2i2U
+zM6i*xQFQx6!^pNY&NV(~#Bw3hUz>qV6HX_7G}n`{kwvBWg-XW7xO>|4X)b0Ddz`xr
+z(Lgb#)AhxJI?KI2&<A4+bdEjPsR<SDfgFu^9Z`fsnUi#i?;~9+YxH{x&6Fb8Mt2Gg
+z!aT-_1l&8KFfZ|*Y!#G=)T+CdmNyl}zgG<0zCmf$(Glqw!(YpG^x!%%gyyLV#W1z6
+zcZO^CDp63UMo-u_z3u0h^2?ymxs5IB)W}k@6!m7Rz*Xv7KbnR<g!Me&rTIc-M{A0e
+zh|YIq{6h6^8-?wmE>)zC&du8^!;pZtv~<ySX+;<=28l85c1EQ&PNJh-^QA&+8puXV
+zf?~bSTgEUK)R!saeAJUt8Hv*5%2Xa_L|3nrqp6hmP3?t`Yt0D;mz-FCz2OeB1?A`+
+zN*H+&%BMUyWiVdEL3?W9)*LhT^`J8zsja=YJP}Qjair+B_x<UTT~Kw|3Di%#z*G$P
+z(wUMvk|EN+j0WUCr=xMTV+scWpollA>ab-otZD0FRLylY+aW_-ep=7ik`K!KYQ=j4
+zzrhfO_i_@!xtO#qt!wB9DaJXB58BBXfc7y!d+<f?RhuGOtgowq_#S*bJo8@a34r(c
+z>O?!;5ObcdO;3q!h<z>t9eUMWLvSdCql)DjRhLk67&{ERjCniA{ku7c;wy2vcwl&~
+z4XrDf97HJuI`MR!fAivzL*00#h5_-}@JXa_p^~WkFDZ+fNq&n`ej6H_BI~(O8vl3C
+z>MRvC9(PEI8#&EZZ`!Rtf7BvY@e+V&dY8fTOm+=t<}1G|@;?LU8wiQPj3P`sT}{`%
+zZ}G`1_hAh*O5fx~F`zofMj!cG<+{DE7+4xvN@{JL&xzC;k=;x^>=QJQ+|nCSY%~+~
+zLVj!@My=yV_1Om4UM_6&ZC}adyw7&tyaD$u#vfdbNE(!S%bBb?D7iFyIAqC*=&3ML
+zjkw;9wiswS<xF#o@d-rVHrIZPlyZvBm_<2j?q{~1q{y)Ljlv`LF<;zQWus=_`rnl<
+z=zrlXbuc>;u7b!H;@psDof{7_kYQ#W-OyC}Gm(<iQhG^$Q`hRx<m0z3W%8q&1{|wY
+ze}1%7Xw_!a2Bc0^7_{m~+GEYg&;Ps^UNXLJtN-=p{NB^Hx2<&|Ig>WWe?Iv2$~MH-
+zg0!C4*z}l{hQ!2eo3V!3RP(mF!c+Br^$0jk9{z!{=(iY`BEcfZhi!LU2BxNL5zvGS
+z{_Tss54Ph384nQ^R>eCIvtvwpknk;~MUNQU-~5Rt*RHS4q}GmH;O~?jz4&g(O#dJl
+zt>gas1B>U^a?c`17KlCJf&ucSn3HV%oy7FwS?MIhAc=eKPjM1o=N_fJH)I|>hddt%
+zfx=sA92O3AVp1q6Pa-5~JtOQ9%X|ExiVYE>4uoGyz+d{qO{3(FsluJxB)!wE7@u8J
+z(!*aiv%{ucC+0z+v%UuWmE?Ms0IbxTq>N}J7=%JAK)LI{k<GqDiu&pXyxVTF1F4?y
+z>iRj7kYzqEfwKMVVVM(VxB#~nwYFq}3N}OxTmAi!B~An-$ByXo6cKRJWpz$*c8(2-
+z7{v|cHK8heRK?#P2^R0Zijt#7$HHJ37sTeN_jbnpm>*e&Ar^{-WgjDNNp)HbvGn=w
+zL`nE8X;GKDGokns4!8F%EaSH6q;{w~LlPj(`Uk69ET~20<X_xjUm?GOA0&`3od$iy
+zeiS#_W@D;CIG#T}O&co~(S)6wK<O6WySu_FJs3uTxPFvH2=H?C>mkrQ4zq^v-2I~I
+z^4&C(!IeVNjIy0TPGgXQdtCw#nGP<o<C@Hw)xfcJ6upMfxCN6w6x#R12N>`<HWR*W
+zd;3+7kdy?P&PbRagMJ*%RWl`Y8x>-+By^R?rHT;7DxmX=eW3?JbR={I(}T2$=nwqt
+z3r*2^MGp#oMF048&0Zlo4-H$ji`H(p$-_x&EJL@7{d7(I-~&jNUJ6=<pm=`p6BScH
+zI~X+Mwlo-gz$hK6tv?w7MpO`>=m^6lICRg<>j|1I7Et=dR1~A3vJU~@=?7N$M+SiY
+zmP9~}PuB!Si$}p+m_$GGsbT`AoxLfrreP60x1-!A*ZlU41p>SLVQK6XsWLBF;}M^U
+z241}6079q%76N}KHN3$TKBV+x{b5YETf$JRuskvJ!1!KsBt4WM#Y?ERWTOAfM=ufj
+zUS7PZ{h_1x!|4sybjJWKUqQP25AFJs`YaPl@vwj*+54B+iI+^CsU=#cn!;Z*w<F>|
+zYy^EhOb%KNC$JjReh8!4OR(uyKc-^35CFO%!l<5kbZ43fHNe@AkTw`lr}-jRAUhR4
+zVQBpd{{|DK4tRT2TAl~wzXJT>NuX>@TUH18XK@`03FoeWcV{e?H!QRwgc|YIP^T!E
+z1oX~^5X&sHMg?Ftqi;GZbnDRfNW*WD=k|?k1FP3jI7?xZ3QK$?npMJYW|hxg$jH}m
+zlh5XcXc-Re;0ZZ2gBJAp7+BccsuU6T%vd&ti+2fmTk`p|GrpB%5UfByGy~13Blg<w
+z!n~9Z1=$^tlyLcMTB3$_iu!GS&;Wx@Ap$Y`b^#4COi~m&a$2{2<<g8P89qq(N<^xe
+zfjkQ6KT;V`tUno|9<YN0ZyR~1c>$&paqKwCI3fuBoE^{zc{XIm*_&h9tkAWe$BU!H
+zbjg&ODjU9&%PWG}l;i{$;e5yOhAWDOyt!eia$*8<ra(S4HX<;CW4-)-=L2tb>SUS>
+zpMeKZD4xoXkPXF?5P*Wtb!B*?9PG}eN@p()63oNV;Z@X?01!@%LRm``&Brom#(;S%
+z3b9CKRr6xC0a=k0VCM)a=m|r1$uhLzQ%dYASL`aHN~%gqs(K5WO%+?4p|<12FalJv
+zA(b`LUTYc@7%w$YWO`-laJ4Ngqq|VN8ycDZ<XRW}e0omxN=YITNZv0gNyooHDw_Ur
+zAR`AzEHODC#7?MK`3NgVpJOi<R34C19#mzEj=@U~l<BRN-{~l&+p^a!voGL<nvf{s
+z*eLCE?U8%7J;>rDWO?*Wf1R6B2+5m*5Ww0VD1%j1@K(jDRq<xxU4rZj;{i&7Lv&lg
+z%#8y2Ob60%l|+m}tzvbyX?5XEMbe+@B3GbCu_i#GW+14>&>ooNtt!>68Humy$*CE+
+zS@UYEW^$|MeNOG5Yt3uj+Buq<kGi!VY3eS^)fLjzly%sv4p*tJRb5Z7mK(rd9I$O}
+zmiv)fU4*nZ?6unyviGTSIL69-pOe|DRA`^G=U1%$vsDFSxJPzkw9<5rl52bz%i_$e
+z<jiX296#X1Ip26IvoX4@@uEmm;94WUTT_T;lh7MSlt`oKag(r>W1n2Jj8(H-aI->g
+zv*Pn+<@sin<7Ny;3r?v;-Ks@1xJ5g+MfZ7&-h7L}af=a0tBF!;f)kWpyVWunqwm#v
+zW4;y0V0pCBYWGH!6j5p)+_r<|s*P!Lzs7#*<>^7@c<PRo@DzFK_mG)WM&AGVQ&UJ@
+z$njIfrKbd?c3E_Lba1-_zMc5IU8JZzfdk6~!Y;brNji2-ReC0U%rZ`S=TWX}PA-y<
+zaF_KuTkf$-zLIOHmB-NlX3o4LiBfH1BCl$?<G@LJCKI!`-jV3nk(>FvwVG|z0<&BG
+z+$=W{vFD-QU1=xz;?;9D*#-(|OL*UNmvWA~%6knr(4C_XFQ|P`eR<<f`85-DNCJgF
+zL1?d2e95aiS9K%TeIOV#pJQw-XSs`FHqP{iHBcoAU7*W;DNa=VCUU2o<DU3Znkoa#
+z`zga6<EMNKU6+@_;q8gJejNdWjFhxY@^P=m-@3G2T<Q{mbR&h5v;8_sguG_3Ue={7
+z*7Kk(pC-qpAg+T~%0(R9OWkG1FDbDvFYn3T0`IfF21WC7#bCYCkRFYt3-qWc6O-7a
+z*;h%Lj;Dcz=esNSOBtWfGV^KS^6=MVvkDdD`*=7RxiOE|rX$zTz3L3&q7oE(ml@>p
+zREN$n8lB`SScA(}{UVat#!vc#e2D^l@dgPD+@H19o%*&phEAjhFGBq3vy;z3t}>4>
+zVgX7H45cImr3driNm0t*?E9J2j8UAaI+fC7^vP?==uR%LSBcgc=One1<B)rA2KzP!
+z#W@GqvCtCER1L=N_e4y>Hp8)3hhG-5zNRbhaz8<@k8R?5hqd&J5ga8Jl96EGfB|G0
+zUNK`Km06Y?wxePU@cC_~#RSN!%M6n*APerJ-PVIFEKj7C-ZpE$-rOcEYQFJz90udx
+zE?ZmDr@q-RhJ6+U`93E;4`HHDfr+N{<uE?<RfGHt?3x(?>93;oWbz%=VYg^aIco&Y
+zUj-acI0=VBn<dWP%V5h8vxpw}DeKa^p$T5t<ZlbYrFJd0L@tMhiK+^|Yrfz}!oU^d
+zB;Kb39<=O#<aykz!np0!HCEJzXD!JLqoKUs08g#iI6EtUA~4RLh)#>RNX;aD1H5v?
+zWWx3CuJk+TyQxK{iK{kz>?Ba_^YteQx!m~{-lJ*U8?0QlEco1PUs2Gs6K$wz&o2~6
+z6)|nt%`eK;-_D*s5%?h>^@9yVTbU(aMLT$<HY3*hgZulmoNuYg+31Tw-4qI-S*T>0
+z=tXu9FPk4}a}_L(wqWr$xrAC4r^VTXSUn9!3fjhy6-%Zjs{mdYrR`_R%0=cz=NTUU
+zg+9?63GZjgrB=u$svbI6f2|qf`-d<hAQ<bd0M4soXGUv#DBrzT^@3AGEGR!&ct6VA
+zTpL!Km>Y>3U&aqm<A=Uf^pVfiCLw!ZR9<mVD*43zPqaE_Nuuly1TTT{iPXSF2t5=9
+zaMiOJz#;j!Y&lWmP}FC!5xVI#G>krMN#z~YWW*wibKBBSn894>L(7LkA4`i^3`|Zn
+zY3d?Vai0+QPf8FjD$%K~(O|>G#F+>$l`FuxTcF6t*Sm|%Lz`Cjq`znwfLdbxeB4Y%
+zoNNfAEY9_8p`RXT1JIxjG#2Z_><m%Vv0PJ026#U$;a8|4Rs!~Ar=vl&9bQW2b*jdX
+z;U}^jT=OB{ScMzF0I}@MMoK8dJ<~dt<7?qTkc%q3RzB|Ggs>4imCu<G&q7qdtWcCz
+z6X<L){%1uxxMq@keRZ(tV;rYOnBH4r>D^U0z7t_PcFB?bJ_^*4{$h<5tmMkpu}?2c
+z3O@(=+WB_aQ6<7>lvq^5SDXu~ewbI^o2T`76Pm=z^CjtO;}l(``%|_zRSO>DS9k+3
+z<~^e9Z}&nU1(@dHQ>JchYpbmF6nrt9z)cE>X^_DDoz0rZ<JT5eI$wZDyN8xPl7>z?
+z&HFT;TK4G9d6?d!LJ(wK@v!4%Rx_zfTpQ-=D%%L^@9Fg0uW7$kzu0j_iG_PUr%2s=
+zoIe1K7<aGP9e)8@EHMAw>0=q)GtXfE%~lcbv536O&SsS3ni^a$#*QU?RGr9MOOj(D
+z@31BBZ@=6jXC#eLOnA78am%JatVobM4ci+(My$Jowss0{_x8JlB|>it$i{KOJ(K0h
+z{f%|J4k;G}1ld35^SnEhwI(b5a(`i8XyvdlQhKtv*#|a$;|;5MAMf&Q_+&%qfkssF
+zZz#i>tKpm?4sx_K7|^5e<tjjV<xrPqHErj|!R2oJ*iY!5f5_PO!M^MmS0u7YkdpbJ
+z>fWK$Z2`j+D5VA*KJf&xF%<i^x4wqA01xi1N!KSHW;O~^79O9wfeV`dNh1FgmX{`2
+zz+ZUmjwT5m{oT%N?76~Yv?R)lj$986`{rmzRU)fDEt96xa_T@ot9EY=nhJ1x!#Yg0
+z5)DAI<@hcF)Ab4dmvZ6<Ac^^m5fcD8)dM_xF)?&h1RXYp2<lj7D(wVq9yLf3*VVAg
+zDG_ie9ZH|2>#@nIZl<W2Feas>pXssK4Y3x>RJ{};+}m7+C^2Lh>k#&nZ%cy5pcphW
+z(F<aTh?YjgXfnGnVQKgn!NWdbqvFgcwjTN^uM}#iGSyxl^ALrhRh$thae76dD7o38
+z4|VlnDy?-42a~364x_6{E+PYg2b#2F(21hA2l4_}nMVDo!&$V|mhHwpvv_Xl{8`7+
+z3(;4JCALyS84#V^ecscQJreGV0)%V!Vv!%M&Ik49?!)Nk8|<YswM%4TdUcTY#Xh$h
+z_x*MjJMG~USB~}zryA4G2hRoJ=oy-o+?7sbgK9c^nZ%QTp&O{X>y!CkYp%}3@1jni
+zmZ&O@X_IpiVjB;IpX@c@TyU{<9Em-<a$g$MGC4u<DwrK_RP&=PlyNVOu^Le<nmb`j
+zmGwNXQHG--{(KjUo1QBSAn%_~XfQ`LXtVEWOH{(WN4y#)+l`EQ&V_s1_x}QidpiZM
+zerY0K%jHCz7sz28=20(>WMr&kwCS;@xpbVf+!-_FCS1hM)yJUybS5Wqut7IkvXVEH
+z*Yj0{U>7d{U8g}2mKttO4)Lz*rd4QPq9Ymh=w_rBJrWF%t|BQv|AAU#-10$*TR58W
+zXAh{8%Ayh!i1Ac6JHDZq!W6sI;Y@TriKV|uK#7u-&zor7`*XHa*ZXx{bYtqCOB)qC
+zT%VF>e{MNlOwr*Y0=R|eWK57xT85}mZ}QJ66t78Sz2<%1x-qE}y3(fQY^KaoB;+y!
+z8_sJdW@^B0<cjy0TRgGDXH`Achf)`43sTf&T1LhJJw`2EQB1xqpX}#pBFnF)j%JdL
+z;(UJ22&Z>)2CfpVm8HIDG&+hn`0ZKZALP3w9XJ=oW@g#s$ExIPc&E$x8|O!%OkO5`
+z%b2x%<m+DfDdVQ5x#MFlzt{8)H|!wPGH>rDN3}j~KmSghee}iv(f#iuooLP{IZpM4
+zVhyWd?CJpBo1KI}r`}UjMX!EV=NDds7e8fhzI1kY=2m<9(e!H_e~*&2hsD|j-tK3}
+zD{j^LpK_NQ&6*;qKg_;NwjW~Mee5)1zjLw=g#d)D^j!nNdH2|J@`JbQ#k^hTo$uxO
+zuNB4?1g<~WQJz>*nqFK{-)~!Z`Zbx{sgZm9_eFnZHfA|axJp9x=fIGBf!MaMyfWGG
+zEp;dIJ5kt@iy%=PUJ#z5^)h$jo<DFn@m=M2+wY}&-kMUVlX$AGKK<lK);`;3mn#$?
+zx<)47-`qMP#y0&<1jB@+mx=?*MVEiMg-PzC-e4?ysy%iig5I2mJ~qv5gmeL_a69mU
+zf;tb&1W}8V2TDs)7x-%wrw!-XO*-sDnJ^H|FY_?xA~eMOCLWsnv}5a6(3J9KNN`lQ
+zXKfVh6Aju!X(`*YWGM_@l4^|e$XH=o*Y1<unIIx0U{C|kNV%W8C=nlO9^|Z2u3!^?
+zk^?oL1&_`nBPssO41|F6>mdy}&2)w%2OKUg#h5!SJyn@s_-gjBPE%7_UHJ>X%aSI#
+z@Qk#~rx~jP7Fjx`a#C5OlP7{vI>Y$ilUdd3PM4CO={d^nr}o$I%XkRsy9&I^u5wtD
+zZjKvuYxB+`$&|@G-5m9LIhnJ(?R0tUwZ2bVdj2k7xzdV|;r&e0{NH(wl3vf=28JPX
+zKEYiu6pBWXEK?*Z4Hq19hf$2&RMGhdF6#V>#_{G;#jO1<nz9|nNq$o$7b)&&Ybcte
+NWlog}&>;Y&{{v&Vf3W}n
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/packages/utils/bandwidthd/patches/010-dont-add-host-paths.patch b/feeds/packages/utils/bandwidthd/patches/010-dont-add-host-paths.patch
+new file mode 100644
+index 0000000..59a5737
+--- /dev/null
++++ b/feeds/packages/utils/bandwidthd/patches/010-dont-add-host-paths.patch
+@@ -0,0 +1,36 @@
++diff --git a/configure b/configure
++index 4c2546e..e516137 100755
++--- a/configure
+++++ b/configure
++@@ -2439,11 +2439,6 @@ if test -n "$x_libraries" && test "x$x_libraries" != xNONE ; then
++ LDFLAGS="$LDFLAGS -L$x_libraries"
++ fi
++
++-# May be equired for BSD
++-LDFLAGS="$LDFLAGS -L/usr/local/lib"
++-
++-CPPFLAGS="$CPPFLAGS -I/usr/local/include"
++-
++ #Check for Darwin sw directory
++ echo "$as_me:2448: checking for /sw/lib" >&5
++ echo $ECHO_N "checking for /sw/lib... $ECHO_C" >&6
++@@ -2505,9 +2500,6 @@ fi
++ fi
++ echo "$as_me:2506: result: $ac_cv_file__usr_pkg_lib" >&5
++ echo "${ECHO_T}$ac_cv_file__usr_pkg_lib" >&6
++-if test $ac_cv_file__usr_pkg_lib = yes; then
++- LDFLAGS="$LDFLAGS -L/usr/pkg/lib"
++-fi
++
++ echo "$as_me:2512: checking for /usr/pkg/include" >&5
++ echo $ECHO_N "checking for /usr/pkg/include... $ECHO_C" >&6
++@@ -3092,9 +3084,6 @@ fi
++ fi
++ echo "$as_me:3093: result: $ac_cv_file__usr_local_pgsql_lib" >&5
++ echo "${ECHO_T}$ac_cv_file__usr_local_pgsql_lib" >&6
++-if test $ac_cv_file__usr_local_pgsql_lib = yes; then
++- LDFLAGS="$LDFLAGS -L/usr/local/pgsql/lib"
++-fi
++
++ echo "$as_me:3099: checking for /usr/local/pgsql/include" >&5
++ echo $ECHO_N "checking for /usr/local/pgsql/include... $ECHO_C" >&6
+diff --git a/feeds/packages/utils/bandwidthd/patches/100-fix_config_file_location b/feeds/packages/utils/bandwidthd/patches/100-fix_config_file_location
+new file mode 100644
+index 0000000..ae44cd2
+--- /dev/null
++++ b/feeds/packages/utils/bandwidthd/patches/100-fix_config_file_location
+@@ -0,0 +1,31 @@
++--- bandwidthd-2.0.1/bandwidthd.c.orig 2008-05-09 10:06:37.000000000 -0500
+++++ bandwidthd-2.0.1/bandwidthd.c 2008-05-09 10:32:54.000000000 -0500
++@@ -255,22 +255,22 @@
++
++ openlog("bandwidthd", LOG_CONS, LOG_DAEMON);
++
++- if (stat("./etc/bandwidthd.conf", &StatBuf))
+++ if (stat("/etc/bandwidthd.conf", &StatBuf))
++ {
++ chdir(INSTALL_DIR);
++- if (stat("./etc/bandwidthd.conf", &StatBuf))
+++ if (stat("/etc/bandwidthd.conf", &StatBuf))
++ {
++- printf("Cannot find ./etc/bandwidthd.conf or %s/etc/bandwidthd.conf\n", INSTALL_DIR);
++- syslog(LOG_ERR, "Cannot find ./etc/bandwidthd.conf or %s/etc/bandwidthd.conf", INSTALL_DIR);
+++ printf("Cannot find /etc/bandwidthd.conf or %s/etc/bandwidthd.conf\n", INSTALL_DIR);
+++ syslog(LOG_ERR, "Cannot find /etc/bandwidthd.conf or %s/etc/bandwidthd.conf", INSTALL_DIR);
++ exit(1);
++ }
++ }
++
++- bdconfig_in = fopen("./etc/bandwidthd.conf", "rt");
+++ bdconfig_in = fopen("/etc/bandwidthd.conf", "rt");
++ if (!bdconfig_in)
++ {
++ syslog(LOG_ERR, "Cannot open bandwidthd.conf");
++- printf("Cannot open ./etc/bandwidthd.conf\n");
+++ printf("Cannot open /etc/bandwidthd.conf\n");
++ exit(1);
++ }
++ bdconfig_parse();
+diff --git a/feeds/packages/utils/banhosts/Makefile b/feeds/packages/utils/banhosts/Makefile
+new file mode 100644
+index 0000000..0087a6f
+--- /dev/null
++++ b/feeds/packages/utils/banhosts/Makefile
+@@ -0,0 +1,40 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=banhostlist
++PKG_VERSION:=1
++PKG_RELEASE:=1
++
++PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_MAINTAINER:=Matteo Croce <matteo@openwrt.org>
++PKG_LICENCE:=GPL-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/banhostlist
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=List of advertising domains
++ URL:=http://winhelp2002.mvps.org/
++endef
++
++define Package/banhostlist/description
++List of domains serving advertising and malicious content to easily block them
++endef
++
++
++define Build/Compile/Default
++endef
++
++define Package/banhostlist/install
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
++ $(INSTALL_BIN) ./files/updatebanhost $(1)/etc/hotplug.d/iface/80-banhosts
++endef
++
++$(eval $(call BuildPackage,banhostlist))
+diff --git a/feeds/packages/utils/banhosts/files/updatebanhost b/feeds/packages/utils/banhosts/files/updatebanhost
+new file mode 100644
+index 0000000..a00d9cb
+--- /dev/null
++++ b/feeds/packages/utils/banhosts/files/updatebanhost
+@@ -0,0 +1,19 @@
++#!/bin/sh
++
++file=/tmp/banhost
++
++gethosts() {
++ logger -t "banhost[$$]" "Update $file"
++ wget -qO- http://winhelp2002.mvps.org/hosts.txt |awk 'BEGIN{printf "0.0.0.0"}/^0\.0\.0\.0/{printf " "$2}END{exit(!FNR)}' >$file || exit 1
++ echo -n $time >$file.time
++ exec killall -HUP dnsmasq
++}
++
++if [ "$ACTION" = ifup -a "$INTERFACE" = wan ]; then
++ read time </proc/uptime
++ time=${time%%.*}
++
++ [ -f $file -a -f $file.time ] || gethosts
++ read oldtime <$file.time
++ [ $((time - oldtime)) -lt 604800 ] || gethosts
++fi
+diff --git a/feeds/packages/utils/bash/Makefile b/feeds/packages/utils/bash/Makefile
+new file mode 100644
+index 0000000..b424c24
+--- /dev/null
++++ b/feeds/packages/utils/bash/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++BASE_VERSION:=4.3
++
++PKG_NAME:=bash
++PKG_VERSION:=$(BASE_VERSION).42
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(BASE_VERSION).tar.gz
++PKG_SOURCE_URL:=@GNU/bash
++PKG_MD5SUM:=81348932d5da294953e15d4814c74dd1
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BASE_VERSION)
++
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Marcel Denia <naoir@gmx.net>
++
++PKG_CHECK_FORMAT_SECURITY:=0
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bash
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=The GNU Bourne Again SHell
++ DEPENDS:=+libncurses
++ URL:=http://www.gnu.org/software/bash/
++endef
++
++define Package/bash/description
++ Bash is an sh-compatible command language interpreter that executes
++ commands read from the standard input or from a file. Bash also
++ incorporates useful features from the Korn and C shells (ksh and csh).
++endef
++
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --without-bash-malloc \
++ --bindir=/bin \
++ )
++endef
++
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)/builtins LDFLAGS_FOR_BUILD= mkbuiltins
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ SHELL="/bin/bash" \
++ all install
++endef
++
++define Package/bash/postinst
++#!/bin/sh
++grep bash $${IPKG_INSTROOT}/etc/shells || \
++ echo "/bin/bash" >> $${IPKG_INSTROOT}/etc/shells
++ echo "/bin/rbash" >> $${IPKG_INSTROOT}/etc/shells
++endef
++
++define Package/bash/install
++ $(INSTALL_DIR) $(1)/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/bin/bash $(1)/bin/
++ ln -sf bash $(1)/bin/rbash
++endef
++
++
++$(eval $(call BuildPackage,bash))
+diff --git a/feeds/packages/utils/bash/patches/001-compile-fix.patch b/feeds/packages/utils/bash/patches/001-compile-fix.patch
+new file mode 100644
+index 0000000..7efa97b
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/001-compile-fix.patch
+@@ -0,0 +1,15 @@
++--- a/execute_cmd.c
+++++ b/execute_cmd.c
++@@ -2369,7 +2369,11 @@ execute_pipeline (command, asynchronous,
++ /* If the `lastpipe' option is set with shopt, and job control is not
++ enabled, execute the last element of non-async pipelines in the
++ current shell environment. */
++- if (lastpipe_opt && job_control == 0 && asynchronous == 0 && pipe_out == NO_PIPE && prev > 0)
+++ if (lastpipe_opt &&
+++#if defined(JOB_CONTROL)
+++ job_control == 0 &&
+++#endif
+++ asynchronous == 0 && pipe_out == NO_PIPE && prev > 0)
++ {
++ lstdin = move_to_high_fd (0, 1, -1);
++ if (lstdin > 0)
+diff --git a/feeds/packages/utils/bash/patches/002-force-internal-readline.patch b/feeds/packages/utils/bash/patches/002-force-internal-readline.patch
+new file mode 100644
+index 0000000..050e476
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/002-force-internal-readline.patch
+@@ -0,0 +1,24 @@
++--- a/configure
+++++ b/configure
++@@ -5430,8 +5430,7 @@ if test $opt_readline = yes; then
++ # static version specified as -llibname to override the
++ # dynamic version
++ case "${host_os}" in
++- darwin[89]*|darwin10*) READLINE_LIB='${READLINE_LIBRARY}' ;;
++- *) READLINE_LIB=-lreadline ;;
+++ *) READLINE_LIB='${READLINE_LIBRARY}' ;;
++ esac
++ fi
++ else
++--- a/configure.ac
+++++ b/configure.ac
++@@ -578,8 +578,7 @@ if test $opt_readline = yes; then
++ # static version specified as -llibname to override the
++ # dynamic version
++ case "${host_os}" in
++- darwin[[89]]*|darwin10*) READLINE_LIB='${READLINE_LIBRARY}' ;;
++- *) READLINE_LIB=-lreadline ;;
+++ *) READLINE_LIB='${READLINE_LIBRARY}' ;;
++ esac
++ fi
++ else
+diff --git a/feeds/packages/utils/bash/patches/101-upstream-bash43-001.patch b/feeds/packages/utils/bash/patches/101-upstream-bash43-001.patch
+new file mode 100644
+index 0000000..3231273
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/101-upstream-bash43-001.patch
+@@ -0,0 +1,49 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-001
++
++Bug-Reported-by: NBaH <nbah@sfr.fr>
++Bug-Reference-ID: <ler0b5$iu9$1@speranza.aioe.org>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00092.html
++
++Bug-Description:
++
++A missing check for a valid option prevented `test -R' from working. There
++is another problem that causes bash to look up the wrong variable name when
++processing the argument to `test -R'.
++
++Patch (apply with `patch -p0'):
++
++--- a/test.c
+++++ b/test.c
++@@ -646,8 +646,8 @@ unary_test (op, arg)
++ return (v && invisible_p (v) == 0 && var_isset (v) ? TRUE : FALSE);
++
++ case 'R':
++- v = find_variable (arg);
++- return (v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v) ? TRUE : FALSE);
+++ v = find_variable_noref (arg);
+++ return ((v && invisible_p (v) == 0 && var_isset (v) && nameref_p (v)) ? TRUE : FALSE);
++ }
++
++ /* We can't actually get here, but this shuts up gcc. */
++@@ -723,6 +723,7 @@ test_unop (op)
++ case 'o': case 'p': case 'r': case 's': case 't':
++ case 'u': case 'v': case 'w': case 'x': case 'z':
++ case 'G': case 'L': case 'O': case 'S': case 'N':
+++ case 'R':
++ return (1);
++ }
++
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 0
+++#define PATCHLEVEL 1
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/102-upstream-bash43-002.patch b/feeds/packages/utils/bash/patches/102-upstream-bash43-002.patch
+new file mode 100644
+index 0000000..35421e8
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/102-upstream-bash43-002.patch
+@@ -0,0 +1,49 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-002
++
++Bug-Reported-by: Moe Tunes <moetunes42@gmail.com>
++Bug-Reference-ID: <53103F49.3070100@gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00086.html
++
++Bug-Description:
++
++A change to save state while running the DEBUG trap caused pipelines to hang
++on systems which need process group synchronization while building pipelines.
++
++Patch (apply with `patch -p0'):
++
++--- a/trap.c
+++++ b/trap.c
++@@ -920,7 +920,8 @@ _run_trap_internal (sig, tag)
++ subst_assign_varlist = 0;
++
++ #if defined (JOB_CONTROL)
++- save_pipeline (1); /* XXX only provides one save level */
+++ if (sig != DEBUG_TRAP) /* run_debug_trap does this */
+++ save_pipeline (1); /* XXX only provides one save level */
++ #endif
++
++ /* If we're in a function, make sure return longjmps come here, too. */
++@@ -940,7 +941,8 @@ _run_trap_internal (sig, tag)
++ trap_exit_value = last_command_exit_value;
++
++ #if defined (JOB_CONTROL)
++- restore_pipeline (1);
+++ if (sig != DEBUG_TRAP) /* run_debug_trap does this */
+++ restore_pipeline (1);
++ #endif
++
++ subst_assign_varlist = save_subst_varlist;
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 1
+++#define PATCHLEVEL 2
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/103-upstream-bash43-003.patch b/feeds/packages/utils/bash/patches/103-upstream-bash43-003.patch
+new file mode 100644
+index 0000000..7c9e56b
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/103-upstream-bash43-003.patch
+@@ -0,0 +1,39 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-003
++
++Bug-Reported-by: Anatol Pomozov <anatol.pomozov@gmail.com>
++Bug-Reference-ID: <CAOMFOmXy3mT2So5GQ5F-smCVArQuAeBwZ2QKzgCtMeXJoDeYOQ@mail.gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-readline/2014-03/msg00010.html
++
++Bug-Description:
++
++When in callback mode, some readline commands can cause readline to seg
++fault by passing invalid contexts to callback functions.
++
++Patch (apply with `patch -p0'):
++
++--- a/lib/readline/readline.c
+++++ b/lib/readline/readline.c
++@@ -744,7 +744,8 @@ _rl_dispatch_callback (cxt)
++ r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ));
++
++ RL_CHECK_SIGNALS ();
++- if (r == 0) /* success! */
+++ /* We only treat values < 0 specially to simulate recursion. */
+++ if (r >= 0 || (r == -1 && (cxt->flags & KSEQ_SUBSEQ) == 0)) /* success! or failure! */
++ {
++ _rl_keyseq_chain_dispose ();
++ RL_UNSETSTATE (RL_STATE_MULTIKEY);
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 2
+++#define PATCHLEVEL 3
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/104-upstream-bash43-004.patch b/feeds/packages/utils/bash/patches/104-upstream-bash43-004.patch
+new file mode 100644
+index 0000000..40ac35f
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/104-upstream-bash43-004.patch
+@@ -0,0 +1,38 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-004
++
++Bug-Reported-by: Daan van Rossum <daan@flash.uchicago.edu>
++Bug-Reference-ID: <20140307072523.GA14250@flash.uchicago.edu>
++Bug-Reference-URL:
++
++Bug-Description:
++
++The `.' command in vi mode cannot undo multi-key commands beginning with
++`c', `d', and `y' (command plus motion specifier).
++
++Patch (apply with `patch -p0'):
++
++--- a/lib/readline/readline.c
+++++ b/lib/readline/readline.c
++@@ -965,7 +965,7 @@ _rl_dispatch_subseq (key, map, got_subse
++ #if defined (VI_MODE)
++ if (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap &&
++ key != ANYOTHERKEY &&
++- rl_key_sequence_length == 1 && /* XXX */
+++ _rl_dispatching_keymap == vi_movement_keymap &&
++ _rl_vi_textmod_command (key))
++ _rl_vi_set_last (key, rl_numeric_arg, rl_arg_sign);
++ #endif
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 3
+++#define PATCHLEVEL 4
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/105-upstream-bash43-005.patch b/feeds/packages/utils/bash/patches/105-upstream-bash43-005.patch
+new file mode 100644
+index 0000000..1cc5473
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/105-upstream-bash43-005.patch
+@@ -0,0 +1,50 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-005
++
++Bug-Reported-by: David Sines <dave.gma@googlemail.com>
++Bug-Reference-ID: <CAO3BAa_CK_Rgkhdfzs+NJ4KFYdB9qW3pvXQK0xLCi6GMmDU8bw@mail.gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00037.html
++
++Bug-Description:
++
++When in Posix mode, bash did not correctly interpret the ANSI-C-style
++$'...' quoting mechanism when performing pattern substitution word
++expansions within double quotes.
++
++Patch (apply with `patch -p0'):
++
++--- a/parse.y
+++++ b/parse.y
++@@ -3398,7 +3398,7 @@ parse_matched_pair (qc, open, close, len
++ within a double-quoted ${...} construct "an even number of
++ unescaped double-quotes or single-quotes, if any, shall occur." */
++ /* This was changed in Austin Group Interp 221 */
++- if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
+++ if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
++ continue;
++
++ /* Could also check open == '`' if we want to parse grouping constructs
++--- a/y.tab.c
+++++ b/y.tab.c
++@@ -5710,7 +5710,7 @@ parse_matched_pair (qc, open, close, len
++ within a double-quoted ${...} construct "an even number of
++ unescaped double-quotes or single-quotes, if any, shall occur." */
++ /* This was changed in Austin Group Interp 221 */
++- if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
+++ if MBTEST(posixly_correct && shell_compatibility_level > 41 && dolbrace_state != DOLBRACE_QUOTE && dolbrace_state != DOLBRACE_QUOTE2 && (flags & P_DQUOTE) && (flags & P_DOLBRACE) && ch == '\'')
++ continue;
++
++ /* Could also check open == '`' if we want to parse grouping constructs
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 4
+++#define PATCHLEVEL 5
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/106-upstream-bash43-006.patch b/feeds/packages/utils/bash/patches/106-upstream-bash43-006.patch
+new file mode 100644
+index 0000000..c5f52b1
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/106-upstream-bash43-006.patch
+@@ -0,0 +1,39 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-006
++
++Bug-Reported-by: Eduardo A . Bustamante Lopez <dualbus@gmail.com>
++Bug-Reference-ID: <20140228170013.GA16015@dualbus.me>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-02/msg00091.html
++
++Bug-Description:
++
++A shell that started with job control active but was not interactive left
++the terminal in the wrong process group when exiting, causing its parent
++shell to get a stop signal when it attempted to read from the terminal.
++
++Patch (apply with `patch -p0'):
++
++--- a/jobs.c
+++++ b/jobs.c
++@@ -4374,7 +4374,7 @@ without_job_control ()
++ void
++ end_job_control ()
++ {
++- if (interactive_shell) /* XXX - should it be interactive? */
+++ if (interactive_shell || job_control) /* XXX - should it be just job_control? */
++ {
++ terminate_stopped_jobs ();
++
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 5
+++#define PATCHLEVEL 6
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/107-upstream-bash43-007.patch b/feeds/packages/utils/bash/patches/107-upstream-bash43-007.patch
+new file mode 100644
+index 0000000..8578bd4
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/107-upstream-bash43-007.patch
+@@ -0,0 +1,45 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-007
++
++Bug-Reported-by: geir.hauge@gmail.com
++Bug-Reference-ID: <20140318093650.B181C1C5B0B@gina.itea.ntnu.no>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00095.html
++
++Bug-Description:
++
++Using compound assignments for associative arrays like
++
++assoc=( [x]= [y]=bar )
++
++left the value corresponding to the key `x' NULL. This caused subsequent
++lookups to interpret it as unset.
++
++Patch (apply with `patch -p0'):
++
++--- a/arrayfunc.c
+++++ b/arrayfunc.c
++@@ -597,6 +597,11 @@ assign_compound_array_list (var, nlist,
++ if (assoc_p (var))
++ {
++ val = expand_assignment_string_to_string (val, 0);
+++ if (val == 0)
+++ {
+++ val = (char *)xmalloc (1);
+++ val[0] = '\0'; /* like do_assignment_internal */
+++ }
++ free_val = 1;
++ }
++
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 6
+++#define PATCHLEVEL 7
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/108-upstream-bash43-008.patch b/feeds/packages/utils/bash/patches/108-upstream-bash43-008.patch
+new file mode 100644
+index 0000000..2402021
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/108-upstream-bash43-008.patch
+@@ -0,0 +1,148 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-008
++
++Bug-Reported-by: Stephane Chazelas <stephane.chazelas@gmail.com>
++Bug-Reference-ID: <20140318135901.GB22158@chaz.gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00098.html
++
++Bug-Description:
++
++Some extended glob patterns incorrectly matched filenames with a leading
++dot, regardless of the setting of the `dotglob' option.
++
++Patch (apply with `patch -p0'):
++
++--- a/lib/glob/gmisc.c
+++++ b/lib/glob/gmisc.c
++@@ -210,6 +210,7 @@ extglob_pattern_p (pat)
++ case '+':
++ case '!':
++ case '@':
+++ case '?':
++ return (pat[1] == LPAREN);
++ default:
++ return 0;
++--- a/lib/glob/glob.c
+++++ b/lib/glob/glob.c
++@@ -179,42 +179,50 @@ extglob_skipname (pat, dname, flags)
++ char *pat, *dname;
++ int flags;
++ {
++- char *pp, *pe, *t;
++- int n, r;
+++ char *pp, *pe, *t, *se;
+++ int n, r, negate;
++
+++ negate = *pat == '!';
++ pp = pat + 2;
++- pe = pp + strlen (pp) - 1; /*(*/
++- if (*pe != ')')
++- return 0;
++- if ((t = strchr (pp, '|')) == 0) /* easy case first */
+++ se = pp + strlen (pp) - 1; /* end of string */
+++ pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */
+++ /* we should check for invalid extglob pattern here */
+++ /* if pe != se we have more of the pattern at the end of the extglob
+++ pattern. Check the easy case first ( */
+++ if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0)
++ {
++ *pe = '\0';
+++#if defined (HANDLE_MULTIBYTE)
+++ r = mbskipname (pp, dname, flags);
+++#else
++ r = skipname (pp, dname, flags); /*(*/
+++#endif
++ *pe = ')';
++ return r;
++ }
+++
+++ /* check every subpattern */
++ while (t = glob_patscan (pp, pe, '|'))
++ {
++ n = t[-1];
++ t[-1] = '\0';
+++#if defined (HANDLE_MULTIBYTE)
+++ r = mbskipname (pp, dname, flags);
+++#else
++ r = skipname (pp, dname, flags);
+++#endif
++ t[-1] = n;
++ if (r == 0) /* if any pattern says not skip, we don't skip */
++ return r;
++ pp = t;
++ } /*(*/
++
++- if (pp == pe) /* glob_patscan might find end of pattern */
+++ /* glob_patscan might find end of pattern */
+++ if (pp == se)
++ return r;
++
++- *pe = '\0';
++-# if defined (HANDLE_MULTIBYTE)
++- r = mbskipname (pp, dname, flags); /*(*/
++-# else
++- r = skipname (pp, dname, flags); /*(*/
++-# endif
++- *pe = ')';
++- return r;
+++ /* but if it doesn't then we didn't match a leading dot */
+++ return 0;
++ }
++ #endif
++
++@@ -277,20 +285,23 @@ wextglob_skipname (pat, dname, flags)
++ int flags;
++ {
++ #if EXTENDED_GLOB
++- wchar_t *pp, *pe, *t, n;
++- int r;
+++ wchar_t *pp, *pe, *t, n, *se;
+++ int r, negate;
++
+++ negate = *pat == L'!';
++ pp = pat + 2;
++- pe = pp + wcslen (pp) - 1; /*(*/
++- if (*pe != L')')
++- return 0;
++- if ((t = wcschr (pp, L'|')) == 0)
+++ se = pp + wcslen (pp) - 1; /*(*/
+++ pe = glob_patscan_wc (pp, se, 0);
+++
+++ if (pe == se && *pe == ')' && (t = wcschr (pp, L'|')) == 0)
++ {
++ *pe = L'\0';
++ r = wchkname (pp, dname); /*(*/
++ *pe = L')';
++ return r;
++ }
+++
+++ /* check every subpattern */
++ while (t = glob_patscan_wc (pp, pe, '|'))
++ {
++ n = t[-1];
++@@ -305,10 +316,8 @@ wextglob_skipname (pat, dname, flags)
++ if (pp == pe) /* glob_patscan_wc might find end of pattern */
++ return r;
++
++- *pe = L'\0';
++- r = wchkname (pp, dname); /*(*/
++- *pe = L')';
++- return r;
+++ /* but if it doesn't then we didn't match a leading dot */
+++ return 0;
++ #else
++ return (wchkname (pat, dname));
++ #endif
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 7
+++#define PATCHLEVEL 8
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/109-upstream-bash43-009.patch b/feeds/packages/utils/bash/patches/109-upstream-bash43-009.patch
+new file mode 100644
+index 0000000..f222bd6
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/109-upstream-bash43-009.patch
+@@ -0,0 +1,51 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-009
++
++Bug-Reported-by: Matthias Klose <doko@debian.org>
++Bug-Reference-ID: <53346FC8.6090005@debian.org>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00171.html
++
++Bug-Description:
++
++There is a problem with unsigned sign extension when attempting to reallocate
++the input line when it is fewer than 3 characters long and there has been a
++history expansion. The sign extension causes the shell to not reallocate the
++line, which results in a segmentation fault when it writes past the end.
++
++Patch (apply with `patch -p0'):
++
++--- a/parse.y
+++++ b/parse.y
++@@ -2424,7 +2424,7 @@ shell_getc (remove_quoted_newline)
++ not already end in an EOF character. */
++ if (shell_input_line_terminator != EOF)
++ {
++- if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3)
+++ if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size))
++ shell_input_line = (char *)xrealloc (shell_input_line,
++ 1 + (shell_input_line_size += 2));
++
++--- a/y.tab.c
+++++ b/y.tab.c
++@@ -4736,7 +4736,7 @@ shell_getc (remove_quoted_newline)
++ not already end in an EOF character. */
++ if (shell_input_line_terminator != EOF)
++ {
++- if (shell_input_line_size < SIZE_MAX && shell_input_line_len > shell_input_line_size - 3)
+++ if (shell_input_line_size < SIZE_MAX-3 && (shell_input_line_len+3 > shell_input_line_size))
++ shell_input_line = (char *)xrealloc (shell_input_line,
++ 1 + (shell_input_line_size += 2));
++
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 8
+++#define PATCHLEVEL 9
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/110-upstream-bash43-010.patch b/feeds/packages/utils/bash/patches/110-upstream-bash43-010.patch
+new file mode 100644
+index 0000000..22d9f1b
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/110-upstream-bash43-010.patch
+@@ -0,0 +1,145 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-010
++
++Bug-Reported-by: Albert Shih <Albert.Shih@obspm.fr>
++Bug-Reference-ID: Wed, 5 Mar 2014 23:01:40 +0100
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00028.html
++
++Bug-Description:
++
++Patch (apply with `patch -p0'):
++
++This patch changes the behavior of programmable completion to compensate
++for two assumptions made by the bash-completion package. Bash-4.3 changed
++to dequote the argument to programmable completion only under certain
++circumstances, to make the behavior of compgen more consistent when run
++from the command line -- closer to the behavior when run by a shell function
++run as part of programmable completion. Bash-completion can pass quoted
++arguments to compgen when the original word to be completed was not quoted,
++expecting programmable completion to dequote the word before attempting
++completion.
++
++This patch fixes two cases:
++
++1. An empty string that bash-completion passes to compgen as a quoted null
++ string ('').
++
++2. An unquoted word that bash-completion quotes using single quotes or
++ backslashes before passing it to compgen.
++
++In these cases, since readline did not detect a quote character in the original
++word to be completed, bash-4.3
++
++--- a/externs.h
+++++ b/externs.h
++@@ -324,6 +324,7 @@ extern char *sh_un_double_quote __P((cha
++ extern char *sh_backslash_quote __P((char *, const char *, int));
++ extern char *sh_backslash_quote_for_double_quotes __P((char *));
++ extern int sh_contains_shell_metas __P((char *));
+++extern int sh_contains_quotes __P((char *));
++
++ /* declarations for functions defined in lib/sh/spell.c */
++ extern int spname __P((char *, char *));
++--- a/lib/sh/shquote.c
+++++ b/lib/sh/shquote.c
++@@ -311,3 +311,17 @@ sh_contains_shell_metas (string)
++
++ return (0);
++ }
+++
+++int
+++sh_contains_quotes (string)
+++ char *string;
+++{
+++ char *s;
+++
+++ for (s = string; s && *s; s++)
+++ {
+++ if (*s == '\'' || *s == '"' || *s == '\\')
+++ return 1;
+++ }
+++ return 0;
+++}
++--- a/pcomplete.c
+++++ b/pcomplete.c
++@@ -183,6 +183,7 @@ ITEMLIST it_variables = { LIST_DYNAMIC,
++
++ COMPSPEC *pcomp_curcs;
++ const char *pcomp_curcmd;
+++const char *pcomp_curtxt;
++
++ #ifdef DEBUG
++ /* Debugging code */
++@@ -753,6 +754,32 @@ pcomp_filename_completion_function (text
++ quoted strings. */
++ dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
++ }
+++ /* Intended to solve a mismatched assumption by bash-completion. If
+++ the text to be completed is empty, but bash-completion turns it into
+++ a quoted string ('') assuming that this code will dequote it before
+++ calling readline, do the dequoting. */
+++ else if (iscompgen && iscompleting &&
+++ pcomp_curtxt && *pcomp_curtxt == 0 &&
+++ text && (*text == '\'' || *text == '"') && text[1] == text[0] && text[2] == 0 &&
+++ rl_filename_dequoting_function)
+++ dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
+++ /* Another mismatched assumption by bash-completion. If compgen is being
+++ run as part of bash-completion, and the argument to compgen is not
+++ the same as the word originally passed to the programmable completion
+++ code, dequote the argument if it has quote characters. It's an
+++ attempt to detect when bash-completion is quoting its filename
+++ argument before calling compgen. */
+++ /* We could check whether gen_shell_function_matches is in the call
+++ stack by checking whether the gen-shell-function-matches tag is in
+++ the unwind-protect stack, but there's no function to do that yet.
+++ We could simply check whether we're executing in a function by
+++ checking variable_context, and may end up doing that. */
+++ else if (iscompgen && iscompleting && rl_filename_dequoting_function &&
+++ pcomp_curtxt && text &&
+++ STREQ (pcomp_curtxt, text) == 0 &&
+++ variable_context &&
+++ sh_contains_quotes (text)) /* guess */
+++ dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
++ else
++ dfn = savestring (text);
++ }
++@@ -1522,7 +1549,7 @@ gen_progcomp_completions (ocmd, cmd, wor
++ COMPSPEC **lastcs;
++ {
++ COMPSPEC *cs, *oldcs;
++- const char *oldcmd;
+++ const char *oldcmd, *oldtxt;
++ STRINGLIST *ret;
++
++ cs = progcomp_search (ocmd);
++@@ -1545,14 +1572,17 @@ gen_progcomp_completions (ocmd, cmd, wor
++
++ oldcs = pcomp_curcs;
++ oldcmd = pcomp_curcmd;
+++ oldtxt = pcomp_curtxt;
++
++ pcomp_curcs = cs;
++ pcomp_curcmd = cmd;
+++ pcomp_curtxt = word;
++
++ ret = gen_compspec_completions (cs, cmd, word, start, end, foundp);
++
++ pcomp_curcs = oldcs;
++ pcomp_curcmd = oldcmd;
+++ pcomp_curtxt = oldtxt;
++
++ /* We need to conditionally handle setting *retryp here */
++ if (retryp)
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 9
+++#define PATCHLEVEL 10
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/111-upstream-bash43-011.patch b/feeds/packages/utils/bash/patches/111-upstream-bash43-011.patch
+new file mode 100644
+index 0000000..b4c181a
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/111-upstream-bash43-011.patch
+@@ -0,0 +1,40 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-011
++
++Bug-Reported-by: Egmont Koblinger <egmont@gmail.com>
++Bug-Reference-ID: <CAGWcZk+bU5Jo1M+tutGvL-250UBE9DXjpeJVofYJSFcqFEVfMg@mail.gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-03/msg00153.html
++
++Bug-Description:
++
++The signal handling changes to bash and readline (to avoid running any code
++in a signal handler context) cause the cursor to be placed on the wrong
++line of a multi-line command after a ^C interrupts editing.
++
++Patch (apply with `patch -p0'):
++
++--- a/lib/readline/display.c
+++++ b/lib/readline/display.c
++@@ -2677,7 +2677,8 @@ _rl_clean_up_for_exit ()
++ {
++ if (_rl_echoing_p)
++ {
++- _rl_move_vert (_rl_vis_botlin);
+++ if (_rl_vis_botlin > 0) /* minor optimization plus bug fix */
+++ _rl_move_vert (_rl_vis_botlin);
++ _rl_vis_botlin = 0;
++ fflush (rl_outstream);
++ rl_restart_output (1, 0);
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 10
+++#define PATCHLEVEL 11
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/112-upstream-bash43-012.patch b/feeds/packages/utils/bash/patches/112-upstream-bash43-012.patch
+new file mode 100644
+index 0000000..8fd2ea6
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/112-upstream-bash43-012.patch
+@@ -0,0 +1,38 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-012
++
++Bug-Reported-by: Eduardo A. Bustamante López<dualbus@gmail.com>
++Bug-Reference-ID: <5346B54C.4070205@case.edu>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00051.html
++
++Bug-Description:
++
++When a SIGCHLD trap runs a command containing a shell builtin while
++a script is running `wait' to wait for all running children to complete,
++the SIGCHLD trap will not be run once for each child that terminates.
++
++Patch (apply with `patch -p0'):
++
++--- a/jobs.c
+++++ b/jobs.c
++@@ -3597,6 +3597,7 @@ run_sigchld_trap (nchild)
++ unwind_protect_int (jobs_list_frozen);
++ unwind_protect_pointer (the_pipeline);
++ unwind_protect_pointer (subst_assign_varlist);
+++ unwind_protect_pointer (this_shell_builtin);
++
++ /* We have to add the commands this way because they will be run
++ in reverse order of adding. We don't want maybe_set_sigchld_trap ()
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 11
+++#define PATCHLEVEL 12
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/113-upstream-bash43-013.patch b/feeds/packages/utils/bash/patches/113-upstream-bash43-013.patch
+new file mode 100644
+index 0000000..63c6c1e
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/113-upstream-bash43-013.patch
+@@ -0,0 +1,52 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-013
++
++Bug-Reported-by: <Trond.Endrestol@ximalas.info>
++Bug-Reference-ID: <alpine.BSF.2.03.1404192114310.1973@enterprise.ximalas.info>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00069.html
++
++Bug-Description:
++
++Using reverse-i-search when horizontal scrolling is enabled does not redisplay
++the entire line containing the successful search results.
++
++Patch (apply with `patch -p0'):
++--- a/lib/readline/display.c
+++++ b/lib/readline/display.c
++@@ -1637,7 +1637,7 @@ update_line (old, new, current_line, oma
++ /* If we are changing the number of invisible characters in a line, and
++ the spot of first difference is before the end of the invisible chars,
++ lendiff needs to be adjusted. */
++- if (current_line == 0 && !_rl_horizontal_scroll_mode &&
+++ if (current_line == 0 && /* !_rl_horizontal_scroll_mode && */
++ current_invis_chars != visible_wrap_offset)
++ {
++ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
++@@ -1825,8 +1825,13 @@ update_line (old, new, current_line, oma
++ else
++ _rl_last_c_pos += bytes_to_insert;
++
+++ /* XXX - we only want to do this if we are at the end of the line
+++ so we move there with _rl_move_cursor_relative */
++ if (_rl_horizontal_scroll_mode && ((oe-old) > (ne-new)))
++- goto clear_rest_of_line;
+++ {
+++ _rl_move_cursor_relative (ne-new, new);
+++ goto clear_rest_of_line;
+++ }
++ }
++ }
++ /* Otherwise, print over the existing material. */
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 12
+++#define PATCHLEVEL 13
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/114-upstream-bash43-014.patch b/feeds/packages/utils/bash/patches/114-upstream-bash43-014.patch
+new file mode 100644
+index 0000000..99e16b9
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/114-upstream-bash43-014.patch
+@@ -0,0 +1,95 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-014
++
++Bug-Reported-by: Greg Wooledge <wooledg@eeg.ccf.org>
++Bug-Reference-ID: <20140418202123.GB7660@eeg.ccf.org>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/help-bash/2014-04/msg00004.html
++
++Bug-Description:
++
++Under certain circumstances, $@ is expanded incorrectly in contexts where
++word splitting is not performed.
++
++Patch (apply with `patch -p0'):
++--- a/subst.c
+++++ b/subst.c
++@@ -3248,8 +3248,10 @@ cond_expand_word (w, special)
++ if (w->word == 0 || w->word[0] == '\0')
++ return ((char *)NULL);
++
+++ expand_no_split_dollar_star = 1;
++ w->flags |= W_NOSPLIT2;
++ l = call_expand_word_internal (w, 0, 0, (int *)0, (int *)0);
+++ expand_no_split_dollar_star = 0;
++ if (l)
++ {
++ if (special == 0) /* LHS */
++@@ -7847,6 +7849,10 @@ param_expand (string, sindex, quoted, ex
++ We also want to make sure that splitting is done no matter what --
++ according to POSIX.2, this expands to a list of the positional
++ parameters no matter what IFS is set to. */
+++ /* XXX - what to do when in a context where word splitting is not
+++ performed? Even when IFS is not the default, posix seems to imply
+++ that we behave like unquoted $* ? Maybe we should use PF_NOSPLIT2
+++ here. */
++ temp = string_list_dollar_at (list, (pflags & PF_ASSIGNRHS) ? (quoted|Q_DOUBLE_QUOTES) : quoted);
++
++ tflag |= W_DOLLARAT;
++@@ -8816,6 +8822,7 @@ finished_with_string:
++ else
++ {
++ char *ifs_chars;
+++ char *tstring;
++
++ ifs_chars = (quoted_dollar_at || has_dollar_at) ? ifs_value : (char *)NULL;
++
++@@ -8830,11 +8837,36 @@ finished_with_string:
++ regardless of what else has happened to IFS since the expansion. */
++ if (split_on_spaces)
++ list = list_string (istring, " ", 1); /* XXX quoted == 1? */
+++ /* If we have $@ (has_dollar_at != 0) and we are in a context where we
+++ don't want to split the result (W_NOSPLIT2), and we are not quoted,
+++ we have already separated the arguments with the first character of
+++ $IFS. In this case, we want to return a list with a single word
+++ with the separator possibly replaced with a space (it's what other
+++ shells seem to do).
+++ quoted_dollar_at is internal to this function and is set if we are
+++ passed an argument that is unquoted (quoted == 0) but we encounter a
+++ double-quoted $@ while expanding it. */
+++ else if (has_dollar_at && quoted_dollar_at == 0 && ifs_chars && quoted == 0 && (word->flags & W_NOSPLIT2))
+++ {
+++ /* Only split and rejoin if we have to */
+++ if (*ifs_chars && *ifs_chars != ' ')
+++ {
+++ list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1);
+++ tstring = string_list (list);
+++ }
+++ else
+++ tstring = istring;
+++ tword = make_bare_word (tstring);
+++ if (tstring != istring)
+++ free (tstring);
+++ goto set_word_flags;
+++ }
++ else if (has_dollar_at && ifs_chars)
++ list = list_string (istring, *ifs_chars ? ifs_chars : " ", 1);
++ else
++ {
++ tword = make_bare_word (istring);
+++set_word_flags:
++ if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (quoted_state == WHOLLY_QUOTED))
++ tword->flags |= W_QUOTED;
++ if (word->flags & W_ASSIGNMENT)
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 13
+++#define PATCHLEVEL 14
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/115-upstream-bash43-015.patch b/feeds/packages/utils/bash/patches/115-upstream-bash43-015.patch
+new file mode 100644
+index 0000000..ae8be2d
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/115-upstream-bash43-015.patch
+@@ -0,0 +1,48 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-015
++
++Bug-Reported-by: Clark Wang <dearvoid@gmail.com>
++Bug-Reference-ID: <CADv8-og2TOSoabXeNVXVGaXN3tEMHnYVq1rwOLe5meaRPSGRig@mail.gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00095.html
++
++Bug-Description:
++
++When completing directory names, the directory name is dequoted twice.
++This causes problems for directories with single and double quotes in
++their names.
++
++Patch (apply with `patch -p0'):
++--- a/bashline.c
+++++ b/bashline.c
++@@ -4167,9 +4167,16 @@ bash_directory_completion_matches (text)
++ int qc;
++
++ qc = rl_dispatching ? rl_completion_quote_character : 0;
++- dfn = bash_dequote_filename ((char *)text, qc);
+++ /* If rl_completion_found_quote != 0, rl_completion_matches will call the
+++ filename dequoting function, causing the directory name to be dequoted
+++ twice. */
+++ if (rl_dispatching && rl_completion_found_quote == 0)
+++ dfn = bash_dequote_filename ((char *)text, qc);
+++ else
+++ dfn = (char *)text;
++ m1 = rl_completion_matches (dfn, rl_filename_completion_function);
++- free (dfn);
+++ if (dfn != text)
+++ free (dfn);
++
++ if (m1 == 0 || m1[0] == 0)
++ return m1;
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 14
+++#define PATCHLEVEL 15
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/116-upstream-bash43-016.patch b/feeds/packages/utils/bash/patches/116-upstream-bash43-016.patch
+new file mode 100644
+index 0000000..3ce37f6
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/116-upstream-bash43-016.patch
+@@ -0,0 +1,121 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-016
++
++Bug-Reported-by: Pierre Gaston <pierre.gaston@gmail.com>
++Bug-Reference-ID: <CAPSX3sTCD61k1VQLJ5r-LWzEt+e7Xc-fxXmwn2u8EA5gJJej8Q@mail.gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00100.html
++
++Bug-Description:
++
++An extended glob pattern containing a slash (`/') causes the globbing code
++to misinterpret it as a directory separator.
++
++Patch (apply with `patch -p0'):
++--- a/lib/glob/glob.c
+++++ b/lib/glob/glob.c
++@@ -123,6 +123,8 @@ static char **glob_dir_to_array __P((cha
++ extern char *glob_patscan __P((char *, char *, int));
++ extern wchar_t *glob_patscan_wc __P((wchar_t *, wchar_t *, int));
++
+++extern char *glob_dirscan __P((char *, int));
+++
++ /* Compile `glob_loop.c' for single-byte characters. */
++ #define CHAR unsigned char
++ #define INT int
++@@ -187,6 +189,9 @@ extglob_skipname (pat, dname, flags)
++ se = pp + strlen (pp) - 1; /* end of string */
++ pe = glob_patscan (pp, se, 0); /* end of extglob pattern (( */
++ /* we should check for invalid extglob pattern here */
+++ if (pe == 0)
+++ return 0;
+++
++ /* if pe != se we have more of the pattern at the end of the extglob
++ pattern. Check the easy case first ( */
++ if (pe == se && *pe == ')' && (t = strchr (pp, '|')) == 0)
++@@ -1015,7 +1020,7 @@ glob_filename (pathname, flags)
++ {
++ char **result;
++ unsigned int result_size;
++- char *directory_name, *filename, *dname;
+++ char *directory_name, *filename, *dname, *fn;
++ unsigned int directory_len;
++ int free_dirname; /* flag */
++ int dflags;
++@@ -1031,6 +1036,18 @@ glob_filename (pathname, flags)
++
++ /* Find the filename. */
++ filename = strrchr (pathname, '/');
+++#if defined (EXTENDED_GLOB)
+++ if (filename && extended_glob)
+++ {
+++ fn = glob_dirscan (pathname, '/');
+++#if DEBUG_MATCHING
+++ if (fn != filename)
+++ fprintf (stderr, "glob_filename: glob_dirscan: fn (%s) != filename (%s)\n", fn ? fn : "(null)", filename);
+++#endif
+++ filename = fn;
+++ }
+++#endif
+++
++ if (filename == NULL)
++ {
++ filename = pathname;
++--- a/lib/glob/gmisc.c
+++++ b/lib/glob/gmisc.c
++@@ -42,6 +42,8 @@
++ #define WLPAREN L'('
++ #define WRPAREN L')'
++
+++extern char *glob_patscan __P((char *, char *, int));
+++
++ /* Return 1 of the first character of WSTRING could match the first
++ character of pattern WPAT. Wide character version. */
++ int
++@@ -375,3 +377,34 @@ bad_bracket:
++
++ return matlen;
++ }
+++
+++/* Skip characters in PAT and return the final occurrence of DIRSEP. This
+++ is only called when extended_glob is set, so we have to skip over extglob
+++ patterns x(...) */
+++char *
+++glob_dirscan (pat, dirsep)
+++ char *pat;
+++ int dirsep;
+++{
+++ char *p, *d, *pe, *se;
+++
+++ d = pe = se = 0;
+++ for (p = pat; p && *p; p++)
+++ {
+++ if (extglob_pattern_p (p))
+++ {
+++ if (se == 0)
+++ se = p + strlen (p) - 1;
+++ pe = glob_patscan (p + 2, se, 0);
+++ if (pe == 0)
+++ continue;
+++ else if (*pe == 0)
+++ break;
+++ p = pe - 1; /* will do increment above */
+++ continue;
+++ }
+++ if (*p == dirsep)
+++ d = p;
+++ }
+++ return d;
+++}
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 15
+++#define PATCHLEVEL 16
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/117-upstream-bash43-017.patch b/feeds/packages/utils/bash/patches/117-upstream-bash43-017.patch
+new file mode 100644
+index 0000000..9c7eecc
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/117-upstream-bash43-017.patch
+@@ -0,0 +1,41 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-017
++
++Bug-Reported-by: Dan Douglas <ormaaj@gmail.com>
++Bug-Reference-ID: <7781746.RhfoTROLxF@smorgbox>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-05/msg00026.html
++
++Bug-Description:
++
++The code that creates local variables should not clear the `invisible'
++attribute when returning an existing local variable. Let the code that
++actually assigns a value clear it.
++
++Patch (apply with `patch -p0'):
++--- a/variables.c
+++++ b/variables.c
++@@ -2197,10 +2197,7 @@ make_local_variable (name)
++ /* local foo; local foo; is a no-op. */
++ old_var = find_variable (name);
++ if (old_var && local_p (old_var) && old_var->context == variable_context)
++- {
++- VUNSETATTR (old_var, att_invisible); /* XXX */
++- return (old_var);
++- }
+++ return (old_var);
++
++ was_tmpvar = old_var && tempvar_p (old_var);
++ /* If we're making a local variable in a shell function, the temporary env
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 16
+++#define PATCHLEVEL 17
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/118-upstream-bash43-018.patch b/feeds/packages/utils/bash/patches/118-upstream-bash43-018.patch
+new file mode 100644
+index 0000000..095ca93
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/118-upstream-bash43-018.patch
+@@ -0,0 +1,38 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-018
++
++Bug-Reported-by: Geir Hauge <geir.hauge@gmail.com>
++Bug-Reference-ID: <CAO-BiTLOvfPXDypg61jcBausADrxUKJejakV2WTWP26cW0=rgA@mail.gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-05/msg00040.html
++
++Bug-Description:
++
++When assigning an array variable using the compound assignment syntax,
++but using `declare' with the rhs of the compound assignment quoted, the
++shell did not mark the variable as visible after successfully performing
++the assignment.
++
++Patch (apply with `patch -p0'):
++--- a/arrayfunc.c
+++++ b/arrayfunc.c
++@@ -179,6 +179,7 @@ bind_array_var_internal (entry, ind, key
++ array_insert (array_cell (entry), ind, newval);
++ FREE (newval);
++
+++ VUNSETATTR (entry, att_invisible); /* no longer invisible */
++ return (entry);
++ }
++
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 17
+++#define PATCHLEVEL 18
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/119-upstream-bash43-019.patch b/feeds/packages/utils/bash/patches/119-upstream-bash43-019.patch
+new file mode 100644
+index 0000000..2d0fa44
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/119-upstream-bash43-019.patch
+@@ -0,0 +1,75 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-019
++
++Bug-Reported-by: John Lenton
++Bug-Reference-ID:
++Bug-Reference-URL: https://bugs.launchpad.net/ubuntu/+source/bash/+bug/1317476
++
++Bug-Description:
++
++The -t timeout option to `read' does not work when the -e option is used.
++
++Patch (apply with `patch -p0'):
++
++--- a/lib/readline/input.c
+++++ b/lib/readline/input.c
++@@ -534,8 +534,16 @@ rl_getc (stream)
++ return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
++ else if (_rl_caught_signal == SIGHUP || _rl_caught_signal == SIGTERM)
++ return (RL_ISSTATE (RL_STATE_READCMD) ? READERR : EOF);
+++ /* keyboard-generated signals of interest */
++ else if (_rl_caught_signal == SIGINT || _rl_caught_signal == SIGQUIT)
++ RL_CHECK_SIGNALS ();
+++ /* non-keyboard-generated signals of interest */
+++ else if (_rl_caught_signal == SIGALRM
+++#if defined (SIGVTALRM)
+++ || _rl_caught_signal == SIGVTALRM
+++#endif
+++ )
+++ RL_CHECK_SIGNALS ();
++
++ if (rl_signal_event_hook)
++ (*rl_signal_event_hook) ();
++--- a/builtins/read.def
+++++ b/builtins/read.def
++@@ -442,7 +442,10 @@ read_builtin (list)
++ add_unwind_protect (reset_alarm, (char *)NULL);
++ #if defined (READLINE)
++ if (edit)
++- add_unwind_protect (reset_attempted_completion_function, (char *)NULL);
+++ {
+++ add_unwind_protect (reset_attempted_completion_function, (char *)NULL);
+++ add_unwind_protect (bashline_reset_event_hook, (char *)NULL);
+++ }
++ #endif
++ falarm (tmsec, tmusec);
++ }
++@@ -1021,6 +1024,7 @@ edit_line (p, itext)
++
++ old_attempted_completion_function = rl_attempted_completion_function;
++ rl_attempted_completion_function = (rl_completion_func_t *)NULL;
+++ bashline_set_event_hook ();
++ if (itext)
++ {
++ old_startup_hook = rl_startup_hook;
++@@ -1032,6 +1036,7 @@ edit_line (p, itext)
++
++ rl_attempted_completion_function = old_attempted_completion_function;
++ old_attempted_completion_function = (rl_completion_func_t *)NULL;
+++ bashline_reset_event_hook ();
++
++ if (ret == 0)
++ return ret;
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 18
+++#define PATCHLEVEL 19
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/120-upstream-bash43-020.patch b/feeds/packages/utils/bash/patches/120-upstream-bash43-020.patch
+new file mode 100644
+index 0000000..abf0c30
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/120-upstream-bash43-020.patch
+@@ -0,0 +1,93 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-020
++
++Bug-Reported-by: Jared Yanovich <slovichon@gmail.com>
++Bug-Reference-ID: <20140417073654.GB26875@nightderanger.psc.edu>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-04/msg00065.html
++
++Bug-Description:
++
++When PS2 contains a command substitution, here-documents entered in an
++interactive shell can sometimes cause a segmentation fault.
++
++Patch (apply with `patch -p0'):
++
++--- a/shell.h
+++++ b/shell.h
++@@ -168,7 +168,8 @@ typedef struct _sh_parser_state_t {
++ /* flags state affecting the parser */
++ int expand_aliases;
++ int echo_input_at_read;
++-
+++ int need_here_doc;
+++
++ } sh_parser_state_t;
++
++ typedef struct _sh_input_line_state_t {
++--- a/parse.y
+++++ b/parse.y
++@@ -2642,7 +2642,7 @@ gather_here_documents ()
++ int r;
++
++ r = 0;
++- while (need_here_doc)
+++ while (need_here_doc > 0)
++ {
++ parser_state |= PST_HEREDOC;
++ make_here_document (redir_stack[r++], line_number);
++@@ -6075,6 +6075,7 @@ save_parser_state (ps)
++
++ ps->expand_aliases = expand_aliases;
++ ps->echo_input_at_read = echo_input_at_read;
+++ ps->need_here_doc = need_here_doc;
++
++ ps->token = token;
++ ps->token_buffer_size = token_buffer_size;
++@@ -6123,6 +6124,7 @@ restore_parser_state (ps)
++
++ expand_aliases = ps->expand_aliases;
++ echo_input_at_read = ps->echo_input_at_read;
+++ need_here_doc = ps->need_here_doc;
++
++ FREE (token);
++ token = ps->token;
++--- a/y.tab.c
+++++ b/y.tab.c
++@@ -4954,7 +4954,7 @@ gather_here_documents ()
++ int r;
++
++ r = 0;
++- while (need_here_doc)
+++ while (need_here_doc > 0)
++ {
++ parser_state |= PST_HEREDOC;
++ make_here_document (redir_stack[r++], line_number);
++@@ -8387,6 +8387,7 @@ save_parser_state (ps)
++
++ ps->expand_aliases = expand_aliases;
++ ps->echo_input_at_read = echo_input_at_read;
+++ ps->need_here_doc = need_here_doc;
++
++ ps->token = token;
++ ps->token_buffer_size = token_buffer_size;
++@@ -8435,6 +8436,7 @@ restore_parser_state (ps)
++
++ expand_aliases = ps->expand_aliases;
++ echo_input_at_read = ps->echo_input_at_read;
+++ need_here_doc = ps->need_here_doc;
++
++ FREE (token);
++ token = ps->token;
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 19
+++#define PATCHLEVEL 20
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/121-upstream-bash43-021.patch b/feeds/packages/utils/bash/patches/121-upstream-bash43-021.patch
+new file mode 100644
+index 0000000..b7367a0
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/121-upstream-bash43-021.patch
+@@ -0,0 +1,46 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-021
++
++Bug-Reported-by: Jared Yanovich <slovichon@gmail.com>
++Bug-Reference-ID: <20140625225019.GJ17044@nightderanger.psc.edu>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00070.html
++
++Bug-Description:
++
++When the readline `revert-all-at-newline' option is set, pressing newline
++when the current line is one retrieved from history results in a double free
++and a segmentation fault.
++
++Patch (apply with `patch -p0'):
++
++--- a/lib/readline/misc.c
+++++ b/lib/readline/misc.c
++@@ -461,6 +461,7 @@ _rl_revert_all_lines ()
++ saved_undo_list = 0;
++ /* Set up rl_line_buffer and other variables from history entry */
++ rl_replace_from_history (entry, 0); /* entry->line is now current */
+++ entry->data = 0; /* entry->data is now current undo list */
++ /* Undo all changes to this history entry */
++ while (rl_undo_list)
++ rl_do_undo ();
++@@ -468,7 +469,6 @@ _rl_revert_all_lines ()
++ the timestamp. */
++ FREE (entry->line);
++ entry->line = savestring (rl_line_buffer);
++- entry->data = 0;
++ }
++ entry = previous_history ();
++ }
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 20
+++#define PATCHLEVEL 21
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/122-upstream-bash43-022.patch b/feeds/packages/utils/bash/patches/122-upstream-bash43-022.patch
+new file mode 100644
+index 0000000..1ee8f13
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/122-upstream-bash43-022.patch
+@@ -0,0 +1,47 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-022
++
++Bug-Reported-by: scorp.dev.null@gmail.com
++Bug-Reference-ID: <E1WxXw8-0007iE-Bi@pcm14>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00061.html
++
++Bug-Description:
++
++Using nested pipelines within loops with the `lastpipe' option set can result
++in a segmentation fault.
++
++Patch (apply with `patch -p0'):
++
++--- a/execute_cmd.c
+++++ b/execute_cmd.c
++@@ -2413,7 +2413,16 @@ execute_pipeline (command, asynchronous,
++ #endif
++ lstdin = wait_for (lastpid);
++ #if defined (JOB_CONTROL)
++- exec_result = job_exit_status (lastpipe_jid);
+++ /* If wait_for removes the job from the jobs table, use result of last
+++ command as pipeline's exit status as usual. The jobs list can get
+++ frozen and unfrozen at inconvenient times if there are multiple pipelines
+++ running simultaneously. */
+++ if (INVALID_JOB (lastpipe_jid) == 0)
+++ exec_result = job_exit_status (lastpipe_jid);
+++ else if (pipefail_opt)
+++ exec_result = exec_result | lstdin; /* XXX */
+++ /* otherwise we use exec_result */
+++
++ #endif
++ unfreeze_jobs_list ();
++ }
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 21
+++#define PATCHLEVEL 22
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/123-upstream-bash43-023.patch b/feeds/packages/utils/bash/patches/123-upstream-bash43-023.patch
+new file mode 100644
+index 0000000..8684c13
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/123-upstream-bash43-023.patch
+@@ -0,0 +1,78 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-023
++
++Bug-Reported-by: Tim Friske <me@timfriske.com>
++Bug-Reference-ID: <CAM1RzOcOR9zzC2i+aeES6LtbHNHoOV+0pZEYPrqxv_QAii-RXA@mail.gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00056.html
++
++Bug-Description:
++
++Bash does not correctly parse process substitution constructs that contain
++unbalanced parentheses as part of the contained command.
++
++Patch (apply with `patch -p0'):
++
++--- a/subst.h
+++++ b/subst.h
++@@ -82,7 +82,7 @@ extern char *extract_arithmetic_subst __
++ /* Extract the <( or >( construct in STRING, and return a new string.
++ Start extracting at (SINDEX) as if we had just seen "<(".
++ Make (SINDEX) get the position just after the matching ")". */
++-extern char *extract_process_subst __P((char *, char *, int *));
+++extern char *extract_process_subst __P((char *, char *, int *, int));
++ #endif /* PROCESS_SUBSTITUTION */
++
++ /* Extract the name of the variable to bind to from the assignment string. */
++--- a/subst.c
+++++ b/subst.c
++@@ -1192,12 +1192,18 @@ extract_arithmetic_subst (string, sindex
++ Start extracting at (SINDEX) as if we had just seen "<(".
++ Make (SINDEX) get the position of the matching ")". */ /*))*/
++ char *
++-extract_process_subst (string, starter, sindex)
+++extract_process_subst (string, starter, sindex, xflags)
++ char *string;
++ char *starter;
++ int *sindex;
+++ int xflags;
++ {
+++#if 0
++ return (extract_delimited_string (string, sindex, starter, "(", ")", SX_COMMAND));
+++#else
+++ xflags |= (no_longjmp_on_fatal_error ? SX_NOLONGJMP : 0);
+++ return (xparse_dolparen (string, string+*sindex, sindex, xflags));
+++#endif
++ }
++ #endif /* PROCESS_SUBSTITUTION */
++
++@@ -1785,7 +1791,7 @@ skip_to_delim (string, start, delims, fl
++ si = i + 2;
++ if (string[si] == '\0')
++ CQ_RETURN(si);
++- temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si);
+++ temp = extract_process_subst (string, (c == '<') ? "<(" : ">(", &si, 0);
++ free (temp); /* no SX_ALLOC here */
++ i = si;
++ if (string[i] == '\0')
++@@ -8249,7 +8255,7 @@ add_string:
++ else
++ t_index = sindex + 1; /* skip past both '<' and LPAREN */
++
++- temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index); /*))*/
+++ temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index, 0); /*))*/
++ sindex = t_index;
++
++ /* If the process substitution specification is `<()', we want to
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 22
+++#define PATCHLEVEL 23
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/124-upstream-bash43-024.patch b/feeds/packages/utils/bash/patches/124-upstream-bash43-024.patch
+new file mode 100644
+index 0000000..7941455
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/124-upstream-bash43-024.patch
+@@ -0,0 +1,45 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-024
++
++Bug-Reported-by: Corentin Peuvrel <cpeuvrel@pom-monitoring.com>
++Bug-Reference-ID: <53CE9E5D.6050203@pom-monitoring.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-07/msg00021.html
++
++Bug-Description:
++
++Indirect variable references do not work correctly if the reference
++variable expands to an array reference using a subscript other than 0
++(e.g., foo='bar[1]' ; echo ${!foo}).
++
++Patch (apply with `patch -p0'):
++
++--- a/subst.c
+++++ b/subst.c
++@@ -7374,7 +7374,13 @@ parameter_brace_expand (string, indexp,
++ }
++
++ if (want_indir)
++- tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at);
+++ {
+++ tdesc = parameter_brace_expand_indir (name + 1, var_is_special, quoted, quoted_dollar_atp, contains_dollar_at);
+++ /* Turn off the W_ARRAYIND flag because there is no way for this function
+++ to return the index we're supposed to be using. */
+++ if (tdesc && tdesc->flags)
+++ tdesc->flags &= ~W_ARRAYIND;
+++ }
++ else
++ tdesc = parameter_brace_expand_word (name, var_is_special, quoted, PF_IGNUNBOUND|(pflags&(PF_NOSPLIT2|PF_ASSIGNRHS)), &ind);
++
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 23
+++#define PATCHLEVEL 24
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/125-upstream-bash43-025.patch b/feeds/packages/utils/bash/patches/125-upstream-bash43-025.patch
+new file mode 100644
+index 0000000..6b2ef4b
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/125-upstream-bash43-025.patch
+@@ -0,0 +1,110 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-025
++
++Bug-Reported-by: Stephane Chazelas <stephane.chazelas@gmail.com>
++Bug-Reference-ID:
++Bug-Reference-URL:
++
++Bug-Description:
++
++Under certain circumstances, bash will execute user code while processing the
++environment for exported function definitions.
++
++Patch (apply with `patch -p0'):
++
++--- a/builtins/common.h
+++++ b/builtins/common.h
++@@ -33,6 +33,8 @@
++ #define SEVAL_RESETLINE 0x010
++ #define SEVAL_PARSEONLY 0x020
++ #define SEVAL_NOLONGJMP 0x040
+++#define SEVAL_FUNCDEF 0x080 /* only allow function definitions */
+++#define SEVAL_ONECMD 0x100 /* only allow a single command */
++
++ /* Flags for describe_command, shared between type.def and command.def */
++ #define CDESC_ALL 0x001 /* type -a */
++--- a/builtins/evalstring.c
+++++ b/builtins/evalstring.c
++@@ -308,6 +308,14 @@ parse_and_execute (string, from_file, fl
++ {
++ struct fd_bitmap *bitmap;
++
+++ if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)
+++ {
+++ internal_warning ("%s: ignoring function definition attempt", from_file);
+++ should_jump_to_top_level = 0;
+++ last_result = last_command_exit_value = EX_BADUSAGE;
+++ break;
+++ }
+++
++ bitmap = new_fd_bitmap (FD_BITMAP_SIZE);
++ begin_unwind_frame ("pe_dispose");
++ add_unwind_protect (dispose_fd_bitmap, bitmap);
++@@ -368,6 +376,9 @@ parse_and_execute (string, from_file, fl
++ dispose_command (command);
++ dispose_fd_bitmap (bitmap);
++ discard_unwind_frame ("pe_dispose");
+++
+++ if (flags & SEVAL_ONECMD)
+++ break;
++ }
++ }
++ else
++--- a/variables.c
+++++ b/variables.c
++@@ -358,13 +358,11 @@ initialize_shell_variables (env, privmod
++ temp_string[char_index] = ' ';
++ strcpy (temp_string + char_index + 1, string);
++
++- if (posixly_correct == 0 || legal_identifier (name))
++- parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
++-
++- /* Ancient backwards compatibility. Old versions of bash exported
++- functions like name()=() {...} */
++- if (name[char_index - 1] == ')' && name[char_index - 2] == '(')
++- name[char_index - 2] = '\0';
+++ /* Don't import function names that are invalid identifiers from the
+++ environment, though we still allow them to be defined as shell
+++ variables. */
+++ if (legal_identifier (name))
+++ parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
++
++ if (temp_var = find_function (name))
++ {
++@@ -381,10 +379,6 @@ initialize_shell_variables (env, privmod
++ last_command_exit_value = 1;
++ report_error (_("error importing function definition for `%s'"), name);
++ }
++-
++- /* ( */
++- if (name[char_index - 1] == ')' && name[char_index - 2] == '\0')
++- name[char_index - 2] = '('; /* ) */
++ }
++ #if defined (ARRAY_VARS)
++ # if ARRAY_EXPORT
++--- a/subst.c
+++++ b/subst.c
++@@ -8047,7 +8047,9 @@ comsub:
++
++ goto return0;
++ }
++- else if (var = find_variable_last_nameref (temp1))
+++ else if (var && (invisible_p (var) || var_isset (var) == 0))
+++ temp = (char *)NULL;
+++ else if ((var = find_variable_last_nameref (temp1)) && var_isset (var) && invisible_p (var) == 0)
++ {
++ temp = nameref_cell (var);
++ #if defined (ARRAY_VARS)
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 24
+++#define PATCHLEVEL 25
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/126-upstream-bash43-026.patch b/feeds/packages/utils/bash/patches/126-upstream-bash43-026.patch
+new file mode 100644
+index 0000000..e9535be
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/126-upstream-bash43-026.patch
+@@ -0,0 +1,54 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-026
++
++Bug-Reported-by: Tavis Ormandy <taviso@cmpxchg8b.com>
++Bug-Reference-ID:
++Bug-Reference-URL: http://twitter.com/taviso/statuses/514887394294652929
++
++Bug-Description:
++
++Under certain circumstances, bash can incorrectly save a lookahead character and
++return it on a subsequent call, even when reading a new line.
++
++Patch (apply with `patch -p0'):
++
++--- a/parse.y
+++++ b/parse.y
++@@ -2953,6 +2953,8 @@ reset_parser ()
++ FREE (word_desc_to_read);
++ word_desc_to_read = (WORD_DESC *)NULL;
++
+++ eol_ungetc_lookahead = 0;
+++
++ current_token = '\n'; /* XXX */
++ last_read_token = '\n';
++ token_to_read = '\n';
++--- a/y.tab.c
+++++ b/y.tab.c
++@@ -5265,6 +5265,8 @@ reset_parser ()
++ FREE (word_desc_to_read);
++ word_desc_to_read = (WORD_DESC *)NULL;
++
+++ eol_ungetc_lookahead = 0;
+++
++ current_token = '\n'; /* XXX */
++ last_read_token = '\n';
++ token_to_read = '\n';
++@@ -8539,4 +8541,3 @@ set_line_mbstate ()
++ }
++ }
++ #endif /* HANDLE_MULTIBYTE */
++-
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 25
+++#define PATCHLEVEL 26
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/127-upstream-bash43-027.patch b/feeds/packages/utils/bash/patches/127-upstream-bash43-027.patch
+new file mode 100644
+index 0000000..6e8a51a
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/127-upstream-bash43-027.patch
+@@ -0,0 +1,176 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-027
++
++Bug-Reported-by: Florian Weimer <fweimer@redhat.com>
++Bug-Reference-ID:
++Bug-Reference-URL:
++
++Bug-Description:
++
++This patch changes the encoding bash uses for exported functions to avoid
++clashes with shell variables and to avoid depending only on an environment
++variable's contents to determine whether or not to interpret it as a shell
++function.
++
++Patch (apply with `patch -p0'):
++
++--- a/variables.c
+++++ b/variables.c
++@@ -83,6 +83,11 @@
++
++ #define ifsname(s) ((s)[0] == 'I' && (s)[1] == 'F' && (s)[2] == 'S' && (s)[3] == '\0')
++
+++#define BASHFUNC_PREFIX "BASH_FUNC_"
+++#define BASHFUNC_PREFLEN 10 /* == strlen(BASHFUNC_PREFIX */
+++#define BASHFUNC_SUFFIX "%%"
+++#define BASHFUNC_SUFFLEN 2 /* == strlen(BASHFUNC_SUFFIX) */
+++
++ extern char **environ;
++
++ /* Variables used here and defined in other files. */
++@@ -279,7 +284,7 @@ static void push_temp_var __P((PTR_T));
++ static void propagate_temp_var __P((PTR_T));
++ static void dispose_temporary_env __P((sh_free_func_t *));
++
++-static inline char *mk_env_string __P((const char *, const char *));
+++static inline char *mk_env_string __P((const char *, const char *, int));
++ static char **make_env_array_from_var_list __P((SHELL_VAR **));
++ static char **make_var_export_array __P((VAR_CONTEXT *));
++ static char **make_func_export_array __P((void));
++@@ -349,22 +354,33 @@ initialize_shell_variables (env, privmod
++
++ /* If exported function, define it now. Don't import functions from
++ the environment in privileged mode. */
++- if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
+++ if (privmode == 0 && read_but_dont_execute == 0 &&
+++ STREQN (BASHFUNC_PREFIX, name, BASHFUNC_PREFLEN) &&
+++ STREQ (BASHFUNC_SUFFIX, name + char_index - BASHFUNC_SUFFLEN) &&
+++ STREQN ("() {", string, 4))
++ {
+++ size_t namelen;
+++ char *tname; /* desired imported function name */
+++
+++ namelen = char_index - BASHFUNC_PREFLEN - BASHFUNC_SUFFLEN;
+++
+++ tname = name + BASHFUNC_PREFLEN; /* start of func name */
+++ tname[namelen] = '\0'; /* now tname == func name */
+++
++ string_length = strlen (string);
++- temp_string = (char *)xmalloc (3 + string_length + char_index);
+++ temp_string = (char *)xmalloc (namelen + string_length + 2);
++
++- strcpy (temp_string, name);
++- temp_string[char_index] = ' ';
++- strcpy (temp_string + char_index + 1, string);
+++ memcpy (temp_string, tname, namelen);
+++ temp_string[namelen] = ' ';
+++ memcpy (temp_string + namelen + 1, string, string_length + 1);
++
++ /* Don't import function names that are invalid identifiers from the
++ environment, though we still allow them to be defined as shell
++ variables. */
++- if (legal_identifier (name))
++- parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
+++ if (absolute_program (tname) == 0 && (posixly_correct == 0 || legal_identifier (tname)))
+++ parse_and_execute (temp_string, tname, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);
++
++- if (temp_var = find_function (name))
+++ if (temp_var = find_function (tname))
++ {
++ VSETATTR (temp_var, (att_exported|att_imported));
++ array_needs_making = 1;
++@@ -377,8 +393,11 @@ initialize_shell_variables (env, privmod
++ array_needs_making = 1;
++ }
++ last_command_exit_value = 1;
++- report_error (_("error importing function definition for `%s'"), name);
+++ report_error (_("error importing function definition for `%s'"), tname);
++ }
+++
+++ /* Restore original suffix */
+++ tname[namelen] = BASHFUNC_SUFFIX[0];
++ }
++ #if defined (ARRAY_VARS)
++ # if ARRAY_EXPORT
++@@ -2954,7 +2973,7 @@ assign_in_env (word, flags)
++ var->context = variable_context; /* XXX */
++
++ INVALIDATE_EXPORTSTR (var);
++- var->exportstr = mk_env_string (name, value);
+++ var->exportstr = mk_env_string (name, value, 0);
++
++ array_needs_making = 1;
++
++@@ -3852,21 +3871,42 @@ merge_temporary_env ()
++ /* **************************************************************** */
++
++ static inline char *
++-mk_env_string (name, value)
+++mk_env_string (name, value, isfunc)
++ const char *name, *value;
+++ int isfunc;
++ {
++- int name_len, value_len;
++- char *p;
+++ size_t name_len, value_len;
+++ char *p, *q;
++
++ name_len = strlen (name);
++ value_len = STRLEN (value);
++- p = (char *)xmalloc (2 + name_len + value_len);
++- strcpy (p, name);
++- p[name_len] = '=';
+++
+++ /* If we are exporting a shell function, construct the encoded function
+++ name. */
+++ if (isfunc && value)
+++ {
+++ p = (char *)xmalloc (BASHFUNC_PREFLEN + name_len + BASHFUNC_SUFFLEN + value_len + 2);
+++ q = p;
+++ memcpy (q, BASHFUNC_PREFIX, BASHFUNC_PREFLEN);
+++ q += BASHFUNC_PREFLEN;
+++ memcpy (q, name, name_len);
+++ q += name_len;
+++ memcpy (q, BASHFUNC_SUFFIX, BASHFUNC_SUFFLEN);
+++ q += BASHFUNC_SUFFLEN;
+++ }
+++ else
+++ {
+++ p = (char *)xmalloc (2 + name_len + value_len);
+++ memcpy (p, name, name_len);
+++ q = p + name_len;
+++ }
+++
+++ q[0] = '=';
++ if (value && *value)
++- strcpy (p + name_len + 1, value);
+++ memcpy (q + 1, value, value_len + 1);
++ else
++- p[name_len + 1] = '\0';
+++ q[1] = '\0';
+++
++ return (p);
++ }
++
++@@ -3952,7 +3992,7 @@ make_env_array_from_var_list (vars)
++ /* Gee, I'd like to get away with not using savestring() if we're
++ using the cached exportstr... */
++ list[list_index] = USE_EXPORTSTR ? savestring (value)
++- : mk_env_string (var->name, value);
+++ : mk_env_string (var->name, value, function_p (var));
++
++ if (USE_EXPORTSTR == 0)
++ SAVE_EXPORTSTR (var, list[list_index]);
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 26
+++#define PATCHLEVEL 27
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/128-upstream-bash43-028.patch b/feeds/packages/utils/bash/patches/128-upstream-bash43-028.patch
+new file mode 100644
+index 0000000..b4b1b6d
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/128-upstream-bash43-028.patch
+@@ -0,0 +1,1526 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-028
++
++Bug-Reported-by: Florian Weimer <fweimer@redhat.com>
++Bug-Reference-ID:
++Bug-Reference-URL:
++
++Bug-Description:
++
++There are two local buffer overflows in parse.y that can cause the shell
++to dump core when given many here-documents attached to a single command
++or many nested loops.
++
++Patch (apply with `patch -p0'):
++
++--- a/parse.y
+++++ b/parse.y
++@@ -168,6 +168,9 @@ static char *read_a_line __P((int));
++
++ static int reserved_word_acceptable __P((int));
++ static int yylex __P((void));
+++
+++static void push_heredoc __P((REDIRECT *));
+++static char *mk_alexpansion __P((char *));
++ static int alias_expand_token __P((char *));
++ static int time_command_acceptable __P((void));
++ static int special_case_tokens __P((char *));
++@@ -265,7 +268,9 @@ int parser_state;
++
++ /* Variables to manage the task of reading here documents, because we need to
++ defer the reading until after a complete command has been collected. */
++-static REDIRECT *redir_stack[10];
+++#define HEREDOC_MAX 16
+++
+++static REDIRECT *redir_stack[HEREDOC_MAX];
++ int need_here_doc;
++
++ /* Where shell input comes from. History expansion is performed on each
++@@ -307,7 +312,7 @@ static int global_extglob;
++ or `for WORD' begins. This is a nested command maximum, since the array
++ index is decremented after a case, select, or for command is parsed. */
++ #define MAX_CASE_NEST 128
++-static int word_lineno[MAX_CASE_NEST];
+++static int word_lineno[MAX_CASE_NEST+1];
++ static int word_top = -1;
++
++ /* If non-zero, it is the token that we want read_token to return
++@@ -520,42 +525,42 @@ redirection: '>' WORD
++ source.dest = 0;
++ redir.filename = $2;
++ $$ = make_redirection (source, r_reading_until, redir, 0);
++- redir_stack[need_here_doc++] = $$;
+++ push_heredoc ($$);
++ }
++ | NUMBER LESS_LESS WORD
++ {
++ source.dest = $1;
++ redir.filename = $3;
++ $$ = make_redirection (source, r_reading_until, redir, 0);
++- redir_stack[need_here_doc++] = $$;
+++ push_heredoc ($$);
++ }
++ | REDIR_WORD LESS_LESS WORD
++ {
++ source.filename = $1;
++ redir.filename = $3;
++ $$ = make_redirection (source, r_reading_until, redir, REDIR_VARASSIGN);
++- redir_stack[need_here_doc++] = $$;
+++ push_heredoc ($$);
++ }
++ | LESS_LESS_MINUS WORD
++ {
++ source.dest = 0;
++ redir.filename = $2;
++ $$ = make_redirection (source, r_deblank_reading_until, redir, 0);
++- redir_stack[need_here_doc++] = $$;
+++ push_heredoc ($$);
++ }
++ | NUMBER LESS_LESS_MINUS WORD
++ {
++ source.dest = $1;
++ redir.filename = $3;
++ $$ = make_redirection (source, r_deblank_reading_until, redir, 0);
++- redir_stack[need_here_doc++] = $$;
+++ push_heredoc ($$);
++ }
++ | REDIR_WORD LESS_LESS_MINUS WORD
++ {
++ source.filename = $1;
++ redir.filename = $3;
++ $$ = make_redirection (source, r_deblank_reading_until, redir, REDIR_VARASSIGN);
++- redir_stack[need_here_doc++] = $$;
+++ push_heredoc ($$);
++ }
++ | LESS_LESS_LESS WORD
++ {
++@@ -2636,6 +2641,21 @@ yylex ()
++ which allow ESAC to be the next one read. */
++ static int esacs_needed_count;
++
+++static void
+++push_heredoc (r)
+++ REDIRECT *r;
+++{
+++ if (need_here_doc >= HEREDOC_MAX)
+++ {
+++ last_command_exit_value = EX_BADUSAGE;
+++ need_here_doc = 0;
+++ report_syntax_error (_("maximum here-document count exceeded"));
+++ reset_parser ();
+++ exit_shell (last_command_exit_value);
+++ }
+++ redir_stack[need_here_doc++] = r;
+++}
+++
++ void
++ gather_here_documents ()
++ {
++--- a/y.tab.c
+++++ b/y.tab.c
++@@ -168,7 +168,7 @@
++
++
++ /* Copy the first part of user declarations. */
++-#line 21 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 21 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++
++ #include "config.h"
++
++@@ -319,6 +319,9 @@ static char *read_a_line __P((int));
++
++ static int reserved_word_acceptable __P((int));
++ static int yylex __P((void));
+++
+++static void push_heredoc __P((REDIRECT *));
+++static char *mk_alexpansion __P((char *));
++ static int alias_expand_token __P((char *));
++ static int time_command_acceptable __P((void));
++ static int special_case_tokens __P((char *));
++@@ -416,7 +419,9 @@ int parser_state;
++
++ /* Variables to manage the task of reading here documents, because we need to
++ defer the reading until after a complete command has been collected. */
++-static REDIRECT *redir_stack[10];
+++#define HEREDOC_MAX 16
+++
+++static REDIRECT *redir_stack[HEREDOC_MAX];
++ int need_here_doc;
++
++ /* Where shell input comes from. History expansion is performed on each
++@@ -458,7 +463,7 @@ static int global_extglob;
++ or `for WORD' begins. This is a nested command maximum, since the array
++ index is decremented after a case, select, or for command is parsed. */
++ #define MAX_CASE_NEST 128
++-static int word_lineno[MAX_CASE_NEST];
+++static int word_lineno[MAX_CASE_NEST+1];
++ static int word_top = -1;
++
++ /* If non-zero, it is the token that we want read_token to return
++@@ -492,7 +497,7 @@ static REDIRECTEE redir;
++
++ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
++ typedef union YYSTYPE
++-#line 324 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 329 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ WORD_DESC *word; /* the word that we read. */
++ int number; /* the number that we read. */
++@@ -503,7 +508,7 @@ typedef union YYSTYPE
++ PATTERN_LIST *pattern;
++ }
++ /* Line 193 of yacc.c. */
++-#line 507 "y.tab.c"
+++#line 512 "y.tab.c"
++ YYSTYPE;
++ # define yystype YYSTYPE /* obsolescent; will be withdrawn */
++ # define YYSTYPE_IS_DECLARED 1
++@@ -516,7 +521,7 @@ typedef union YYSTYPE
++
++
++ /* Line 216 of yacc.c. */
++-#line 520 "y.tab.c"
+++#line 525 "y.tab.c"
++
++ #ifdef short
++ # undef short
++@@ -886,23 +891,23 @@ static const yytype_int8 yyrhs[] =
++ /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
++ static const yytype_uint16 yyrline[] =
++ {
++- 0, 377, 377, 388, 397, 412, 422, 424, 428, 434,
++- 440, 446, 452, 458, 464, 470, 476, 482, 488, 494,
++- 500, 506, 512, 518, 525, 532, 539, 546, 553, 560,
++- 566, 572, 578, 584, 590, 596, 602, 608, 614, 620,
++- 626, 632, 638, 644, 650, 656, 662, 668, 674, 680,
++- 686, 692, 700, 702, 704, 708, 712, 723, 725, 729,
++- 731, 733, 749, 751, 755, 757, 759, 761, 763, 765,
++- 767, 769, 771, 773, 775, 779, 784, 789, 794, 799,
++- 804, 809, 814, 821, 826, 831, 836, 843, 848, 853,
++- 858, 863, 868, 875, 880, 885, 892, 895, 898, 902,
++- 904, 935, 942, 947, 964, 969, 986, 993, 995, 997,
++- 1002, 1006, 1010, 1014, 1016, 1018, 1022, 1023, 1027, 1029,
++- 1031, 1033, 1037, 1039, 1041, 1043, 1045, 1047, 1051, 1053,
++- 1062, 1070, 1071, 1077, 1078, 1085, 1089, 1091, 1093, 1100,
++- 1102, 1104, 1108, 1109, 1112, 1114, 1116, 1120, 1121, 1130,
++- 1143, 1159, 1174, 1176, 1178, 1185, 1188, 1192, 1194, 1200,
++- 1206, 1223, 1243, 1245, 1268, 1272, 1274, 1276
+++ 0, 382, 382, 393, 402, 417, 427, 429, 433, 439,
+++ 445, 451, 457, 463, 469, 475, 481, 487, 493, 499,
+++ 505, 511, 517, 523, 530, 537, 544, 551, 558, 565,
+++ 571, 577, 583, 589, 595, 601, 607, 613, 619, 625,
+++ 631, 637, 643, 649, 655, 661, 667, 673, 679, 685,
+++ 691, 697, 705, 707, 709, 713, 717, 728, 730, 734,
+++ 736, 738, 754, 756, 760, 762, 764, 766, 768, 770,
+++ 772, 774, 776, 778, 780, 784, 789, 794, 799, 804,
+++ 809, 814, 819, 826, 831, 836, 841, 848, 853, 858,
+++ 863, 868, 873, 880, 885, 890, 897, 900, 903, 907,
+++ 909, 940, 947, 952, 969, 974, 991, 998, 1000, 1002,
+++ 1007, 1011, 1015, 1019, 1021, 1023, 1027, 1028, 1032, 1034,
+++ 1036, 1038, 1042, 1044, 1046, 1048, 1050, 1052, 1056, 1058,
+++ 1067, 1075, 1076, 1082, 1083, 1090, 1094, 1096, 1098, 1105,
+++ 1107, 1109, 1113, 1114, 1117, 1119, 1121, 1125, 1126, 1135,
+++ 1148, 1164, 1179, 1181, 1183, 1190, 1193, 1197, 1199, 1205,
+++ 1211, 1228, 1248, 1250, 1273, 1277, 1279, 1281
++ };
++ #endif
++
++@@ -2093,7 +2098,7 @@ yyreduce:
++ switch (yyn)
++ {
++ case 2:
++-#line 378 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 383 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ /* Case of regular command. Discard the error
++ safety net,and return the command just parsed. */
++@@ -2107,7 +2112,7 @@ yyreduce:
++ break;
++
++ case 3:
++-#line 389 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 394 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ /* Case of regular command, but not a very
++ interesting one. Return a NULL command. */
++@@ -2119,7 +2124,7 @@ yyreduce:
++ break;
++
++ case 4:
++-#line 398 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 403 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ /* Error during parsing. Return NULL command. */
++ global_command = (COMMAND *)NULL;
++@@ -2137,7 +2142,7 @@ yyreduce:
++ break;
++
++ case 5:
++-#line 413 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 418 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ /* Case of EOF seen by itself. Do ignoreeof or
++ not. */
++@@ -2148,17 +2153,17 @@ yyreduce:
++ break;
++
++ case 6:
++-#line 423 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 428 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
++ break;
++
++ case 7:
++-#line 425 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 430 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.word_list) = make_word_list ((yyvsp[(2) - (2)].word), (yyvsp[(1) - (2)].word_list)); }
++ break;
++
++ case 8:
++-#line 429 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 434 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2167,7 +2172,7 @@ yyreduce:
++ break;
++
++ case 9:
++-#line 435 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 440 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2176,7 +2181,7 @@ yyreduce:
++ break;
++
++ case 10:
++-#line 441 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 446 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2185,7 +2190,7 @@ yyreduce:
++ break;
++
++ case 11:
++-#line 447 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 452 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2194,7 +2199,7 @@ yyreduce:
++ break;
++
++ case 12:
++-#line 453 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 458 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2203,7 +2208,7 @@ yyreduce:
++ break;
++
++ case 13:
++-#line 459 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 464 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2212,7 +2217,7 @@ yyreduce:
++ break;
++
++ case 14:
++-#line 465 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 470 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2221,7 +2226,7 @@ yyreduce:
++ break;
++
++ case 15:
++-#line 471 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 476 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2230,7 +2235,7 @@ yyreduce:
++ break;
++
++ case 16:
++-#line 477 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 482 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2239,7 +2244,7 @@ yyreduce:
++ break;
++
++ case 17:
++-#line 483 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 488 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2248,7 +2253,7 @@ yyreduce:
++ break;
++
++ case 18:
++-#line 489 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 494 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2257,7 +2262,7 @@ yyreduce:
++ break;
++
++ case 19:
++-#line 495 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 500 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2266,7 +2271,7 @@ yyreduce:
++ break;
++
++ case 20:
++-#line 501 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 506 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2275,7 +2280,7 @@ yyreduce:
++ break;
++
++ case 21:
++-#line 507 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 512 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2284,7 +2289,7 @@ yyreduce:
++ break;
++
++ case 22:
++-#line 513 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 518 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2293,67 +2298,67 @@ yyreduce:
++ break;
++
++ case 23:
++-#line 519 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 524 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++ (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0);
++- redir_stack[need_here_doc++] = (yyval.redirect);
+++ push_heredoc ((yyval.redirect));
++ }
++ break;
++
++ case 24:
++-#line 526 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 531 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++ (yyval.redirect) = make_redirection (source, r_reading_until, redir, 0);
++- redir_stack[need_here_doc++] = (yyval.redirect);
+++ push_heredoc ((yyval.redirect));
++ }
++ break;
++
++ case 25:
++-#line 533 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 538 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++ (yyval.redirect) = make_redirection (source, r_reading_until, redir, REDIR_VARASSIGN);
++- redir_stack[need_here_doc++] = (yyval.redirect);
+++ push_heredoc ((yyval.redirect));
++ }
++ break;
++
++ case 26:
++-#line 540 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 545 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++ (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0);
++- redir_stack[need_here_doc++] = (yyval.redirect);
+++ push_heredoc ((yyval.redirect));
++ }
++ break;
++
++ case 27:
++-#line 547 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 552 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++ (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, 0);
++- redir_stack[need_here_doc++] = (yyval.redirect);
+++ push_heredoc ((yyval.redirect));
++ }
++ break;
++
++ case 28:
++-#line 554 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 559 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++ (yyval.redirect) = make_redirection (source, r_deblank_reading_until, redir, REDIR_VARASSIGN);
++- redir_stack[need_here_doc++] = (yyval.redirect);
+++ push_heredoc ((yyval.redirect));
++ }
++ break;
++
++ case 29:
++-#line 561 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 566 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2362,7 +2367,7 @@ yyreduce:
++ break;
++
++ case 30:
++-#line 567 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 572 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2371,7 +2376,7 @@ yyreduce:
++ break;
++
++ case 31:
++-#line 573 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 578 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2380,7 +2385,7 @@ yyreduce:
++ break;
++
++ case 32:
++-#line 579 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 584 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 0;
++ redir.dest = (yyvsp[(2) - (2)].number);
++@@ -2389,7 +2394,7 @@ yyreduce:
++ break;
++
++ case 33:
++-#line 585 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 590 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.dest = (yyvsp[(3) - (3)].number);
++@@ -2398,7 +2403,7 @@ yyreduce:
++ break;
++
++ case 34:
++-#line 591 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 596 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.dest = (yyvsp[(3) - (3)].number);
++@@ -2407,7 +2412,7 @@ yyreduce:
++ break;
++
++ case 35:
++-#line 597 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 602 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 1;
++ redir.dest = (yyvsp[(2) - (2)].number);
++@@ -2416,7 +2421,7 @@ yyreduce:
++ break;
++
++ case 36:
++-#line 603 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 608 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.dest = (yyvsp[(3) - (3)].number);
++@@ -2425,7 +2430,7 @@ yyreduce:
++ break;
++
++ case 37:
++-#line 609 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 614 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.dest = (yyvsp[(3) - (3)].number);
++@@ -2434,7 +2439,7 @@ yyreduce:
++ break;
++
++ case 38:
++-#line 615 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 620 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2443,7 +2448,7 @@ yyreduce:
++ break;
++
++ case 39:
++-#line 621 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 626 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2452,7 +2457,7 @@ yyreduce:
++ break;
++
++ case 40:
++-#line 627 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 632 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2461,7 +2466,7 @@ yyreduce:
++ break;
++
++ case 41:
++-#line 633 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 638 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2470,7 +2475,7 @@ yyreduce:
++ break;
++
++ case 42:
++-#line 639 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 644 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2479,7 +2484,7 @@ yyreduce:
++ break;
++
++ case 43:
++-#line 645 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 650 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2488,7 +2493,7 @@ yyreduce:
++ break;
++
++ case 44:
++-#line 651 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 656 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 1;
++ redir.dest = 0;
++@@ -2497,7 +2502,7 @@ yyreduce:
++ break;
++
++ case 45:
++-#line 657 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 662 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.dest = 0;
++@@ -2506,7 +2511,7 @@ yyreduce:
++ break;
++
++ case 46:
++-#line 663 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 668 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.dest = 0;
++@@ -2515,7 +2520,7 @@ yyreduce:
++ break;
++
++ case 47:
++-#line 669 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 674 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 0;
++ redir.dest = 0;
++@@ -2524,7 +2529,7 @@ yyreduce:
++ break;
++
++ case 48:
++-#line 675 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 680 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.dest = 0;
++@@ -2533,7 +2538,7 @@ yyreduce:
++ break;
++
++ case 49:
++-#line 681 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 686 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.dest = 0;
++@@ -2542,7 +2547,7 @@ yyreduce:
++ break;
++
++ case 50:
++-#line 687 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 692 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2551,7 +2556,7 @@ yyreduce:
++ break;
++
++ case 51:
++-#line 693 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 698 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2560,29 +2565,29 @@ yyreduce:
++ break;
++
++ case 52:
++-#line 701 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 706 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
++ break;
++
++ case 53:
++-#line 703 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 708 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
++ break;
++
++ case 54:
++-#line 705 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 710 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.element).redirect = (yyvsp[(1) - (1)].redirect); (yyval.element).word = 0; }
++ break;
++
++ case 55:
++-#line 709 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 714 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.redirect) = (yyvsp[(1) - (1)].redirect);
++ }
++ break;
++
++ case 56:
++-#line 713 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 718 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ register REDIRECT *t;
++
++@@ -2594,27 +2599,27 @@ yyreduce:
++ break;
++
++ case 57:
++-#line 724 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 729 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_simple_command ((yyvsp[(1) - (1)].element), (COMMAND *)NULL); }
++ break;
++
++ case 58:
++-#line 726 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 731 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_simple_command ((yyvsp[(2) - (2)].element), (yyvsp[(1) - (2)].command)); }
++ break;
++
++ case 59:
++-#line 730 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 735 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = clean_simple_command ((yyvsp[(1) - (1)].command)); }
++ break;
++
++ case 60:
++-#line 732 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 737 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 61:
++-#line 734 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 739 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ COMMAND *tc;
++
++@@ -2633,72 +2638,72 @@ yyreduce:
++ break;
++
++ case 62:
++-#line 750 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 755 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 63:
++-#line 752 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 757 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 64:
++-#line 756 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 761 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 65:
++-#line 758 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 763 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 66:
++-#line 760 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 765 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_while_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
++ break;
++
++ case 67:
++-#line 762 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 767 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_until_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
++ break;
++
++ case 68:
++-#line 764 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 769 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 69:
++-#line 766 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 771 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 70:
++-#line 768 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 773 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 71:
++-#line 770 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 775 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 72:
++-#line 772 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 777 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 73:
++-#line 774 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 779 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 74:
++-#line 776 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 781 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 75:
++-#line 780 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 785 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2706,7 +2711,7 @@ yyreduce:
++ break;
++
++ case 76:
++-#line 785 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 790 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2714,7 +2719,7 @@ yyreduce:
++ break;
++
++ case 77:
++-#line 790 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 795 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2722,7 +2727,7 @@ yyreduce:
++ break;
++
++ case 78:
++-#line 795 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 800 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2730,7 +2735,7 @@ yyreduce:
++ break;
++
++ case 79:
++-#line 800 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 805 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2738,7 +2743,7 @@ yyreduce:
++ break;
++
++ case 80:
++-#line 805 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 810 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2746,7 +2751,7 @@ yyreduce:
++ break;
++
++ case 81:
++-#line 810 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 815 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2754,7 +2759,7 @@ yyreduce:
++ break;
++
++ case 82:
++-#line 815 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 820 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2762,7 +2767,7 @@ yyreduce:
++ break;
++
++ case 83:
++-#line 822 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 827 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
++ if (word_top > 0) word_top--;
++@@ -2770,7 +2775,7 @@ yyreduce:
++ break;
++
++ case 84:
++-#line 827 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 832 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
++ if (word_top > 0) word_top--;
++@@ -2778,7 +2783,7 @@ yyreduce:
++ break;
++
++ case 85:
++-#line 832 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 837 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
++ if (word_top > 0) word_top--;
++@@ -2786,7 +2791,7 @@ yyreduce:
++ break;
++
++ case 86:
++-#line 837 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 842 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
++ if (word_top > 0) word_top--;
++@@ -2794,7 +2799,7 @@ yyreduce:
++ break;
++
++ case 87:
++-#line 844 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 849 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2802,7 +2807,7 @@ yyreduce:
++ break;
++
++ case 88:
++-#line 849 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 854 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2810,7 +2815,7 @@ yyreduce:
++ break;
++
++ case 89:
++-#line 854 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 859 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2818,7 +2823,7 @@ yyreduce:
++ break;
++
++ case 90:
++-#line 859 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 864 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2826,7 +2831,7 @@ yyreduce:
++ break;
++
++ case 91:
++-#line 864 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 869 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2834,7 +2839,7 @@ yyreduce:
++ break;
++
++ case 92:
++-#line 869 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 874 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2842,7 +2847,7 @@ yyreduce:
++ break;
++
++ case 93:
++-#line 876 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 881 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (PATTERN_LIST *)NULL, word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2850,7 +2855,7 @@ yyreduce:
++ break;
++
++ case 94:
++-#line 881 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 886 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_case_command ((yyvsp[(2) - (7)].word), (yyvsp[(5) - (7)].pattern), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2858,7 +2863,7 @@ yyreduce:
++ break;
++
++ case 95:
++-#line 886 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 891 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (yyvsp[(5) - (6)].pattern), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2866,27 +2871,27 @@ yyreduce:
++ break;
++
++ case 96:
++-#line 893 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 898 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_function_def ((yyvsp[(1) - (5)].word), (yyvsp[(5) - (5)].command), function_dstart, function_bstart); }
++ break;
++
++ case 97:
++-#line 896 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 901 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_function_def ((yyvsp[(2) - (6)].word), (yyvsp[(6) - (6)].command), function_dstart, function_bstart); }
++ break;
++
++ case 98:
++-#line 899 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 904 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_function_def ((yyvsp[(2) - (4)].word), (yyvsp[(4) - (4)].command), function_dstart, function_bstart); }
++ break;
++
++ case 99:
++-#line 903 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 908 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 100:
++-#line 905 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 910 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ COMMAND *tc;
++
++@@ -2918,7 +2923,7 @@ yyreduce:
++ break;
++
++ case 101:
++-#line 936 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 941 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_subshell_command ((yyvsp[(2) - (3)].command));
++ (yyval.command)->flags |= CMD_WANT_SUBSHELL;
++@@ -2926,7 +2931,7 @@ yyreduce:
++ break;
++
++ case 102:
++-#line 943 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 948 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_coproc_command ("COPROC", (yyvsp[(2) - (2)].command));
++ (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
++@@ -2934,7 +2939,7 @@ yyreduce:
++ break;
++
++ case 103:
++-#line 948 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 953 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ COMMAND *tc;
++
++@@ -2954,7 +2959,7 @@ yyreduce:
++ break;
++
++ case 104:
++-#line 965 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 970 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_coproc_command ((yyvsp[(2) - (3)].word)->word, (yyvsp[(3) - (3)].command));
++ (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
++@@ -2962,7 +2967,7 @@ yyreduce:
++ break;
++
++ case 105:
++-#line 970 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 975 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ COMMAND *tc;
++
++@@ -2982,7 +2987,7 @@ yyreduce:
++ break;
++
++ case 106:
++-#line 987 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 992 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = make_coproc_command ("COPROC", clean_simple_command ((yyvsp[(2) - (2)].command)));
++ (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
++@@ -2990,117 +2995,117 @@ yyreduce:
++ break;
++
++ case 107:
++-#line 994 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 999 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (COMMAND *)NULL); }
++ break;
++
++ case 108:
++-#line 996 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1001 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (7)].command), (yyvsp[(4) - (7)].command), (yyvsp[(6) - (7)].command)); }
++ break;
++
++ case 109:
++-#line 998 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1003 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(5) - (6)].command)); }
++ break;
++
++ case 110:
++-#line 1003 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1008 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_group_command ((yyvsp[(2) - (3)].command)); }
++ break;
++
++ case 111:
++-#line 1007 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1012 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_arith_command ((yyvsp[(1) - (1)].word_list)); }
++ break;
++
++ case 112:
++-#line 1011 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1016 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(2) - (3)].command); }
++ break;
++
++ case 113:
++-#line 1015 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1020 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (4)].command), (yyvsp[(4) - (4)].command), (COMMAND *)NULL); }
++ break;
++
++ case 114:
++-#line 1017 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1022 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(6) - (6)].command)); }
++ break;
++
++ case 115:
++-#line 1019 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1024 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (yyvsp[(5) - (5)].command)); }
++ break;
++
++ case 117:
++-#line 1024 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1029 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyvsp[(2) - (2)].pattern)->next = (yyvsp[(1) - (2)].pattern); (yyval.pattern) = (yyvsp[(2) - (2)].pattern); }
++ break;
++
++ case 118:
++-#line 1028 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1033 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (yyvsp[(4) - (4)].command)); }
++ break;
++
++ case 119:
++-#line 1030 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1035 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (COMMAND *)NULL); }
++ break;
++
++ case 120:
++-#line 1032 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1037 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (yyvsp[(5) - (5)].command)); }
++ break;
++
++ case 121:
++-#line 1034 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1039 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (COMMAND *)NULL); }
++ break;
++
++ case 122:
++-#line 1038 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1043 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
++ break;
++
++ case 123:
++-#line 1040 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1045 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
++ break;
++
++ case 124:
++-#line 1042 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1047 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
++ break;
++
++ case 125:
++-#line 1044 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1049 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
++ break;
++
++ case 126:
++-#line 1046 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1051 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_TESTNEXT; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
++ break;
++
++ case 127:
++-#line 1048 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1053 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_TESTNEXT; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
++ break;
++
++ case 128:
++-#line 1052 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1057 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
++ break;
++
++ case 129:
++-#line 1054 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1059 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.word_list) = make_word_list ((yyvsp[(3) - (3)].word), (yyvsp[(1) - (3)].word_list)); }
++ break;
++
++ case 130:
++-#line 1063 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1068 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = (yyvsp[(2) - (2)].command);
++ if (need_here_doc)
++@@ -3109,14 +3114,14 @@ yyreduce:
++ break;
++
++ case 132:
++-#line 1072 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1077 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = (yyvsp[(2) - (2)].command);
++ }
++ break;
++
++ case 134:
++-#line 1079 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1084 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ if ((yyvsp[(1) - (3)].command)->type == cm_connection)
++ (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (COMMAND *)NULL, '&');
++@@ -3126,17 +3131,17 @@ yyreduce:
++ break;
++
++ case 136:
++-#line 1090 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1095 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
++ break;
++
++ case 137:
++-#line 1092 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1097 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
++ break;
++
++ case 138:
++-#line 1094 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1099 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ if ((yyvsp[(1) - (4)].command)->type == cm_connection)
++ (yyval.command) = connect_async_list ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '&');
++@@ -3146,37 +3151,37 @@ yyreduce:
++ break;
++
++ case 139:
++-#line 1101 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1106 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
++ break;
++
++ case 140:
++-#line 1103 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1108 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
++ break;
++
++ case 141:
++-#line 1105 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1110 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 144:
++-#line 1113 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1118 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.number) = '\n'; }
++ break;
++
++ case 145:
++-#line 1115 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1120 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.number) = ';'; }
++ break;
++
++ case 146:
++-#line 1117 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1122 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.number) = yacc_EOF; }
++ break;
++
++ case 149:
++-#line 1131 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1136 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = (yyvsp[(1) - (1)].command);
++ if (need_here_doc)
++@@ -3192,7 +3197,7 @@ yyreduce:
++ break;
++
++ case 150:
++-#line 1144 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1149 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ if ((yyvsp[(1) - (2)].command)->type == cm_connection)
++ (yyval.command) = connect_async_list ((yyvsp[(1) - (2)].command), (COMMAND *)NULL, '&');
++@@ -3211,7 +3216,7 @@ yyreduce:
++ break;
++
++ case 151:
++-#line 1160 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1165 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ (yyval.command) = (yyvsp[(1) - (2)].command);
++ if (need_here_doc)
++@@ -3227,17 +3232,17 @@ yyreduce:
++ break;
++
++ case 152:
++-#line 1175 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1180 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
++ break;
++
++ case 153:
++-#line 1177 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1182 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
++ break;
++
++ case 154:
++-#line 1179 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1184 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ if ((yyvsp[(1) - (3)].command)->type == cm_connection)
++ (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), '&');
++@@ -3247,22 +3252,22 @@ yyreduce:
++ break;
++
++ case 155:
++-#line 1186 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1191 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), ';'); }
++ break;
++
++ case 156:
++-#line 1189 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1194 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 157:
++-#line 1193 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1198 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 158:
++-#line 1195 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1200 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ if ((yyvsp[(2) - (2)].command))
++ (yyvsp[(2) - (2)].command)->flags ^= CMD_INVERT_RETURN; /* toggle */
++@@ -3271,7 +3276,7 @@ yyreduce:
++ break;
++
++ case 159:
++-#line 1201 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1206 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ if ((yyvsp[(2) - (2)].command))
++ (yyvsp[(2) - (2)].command)->flags |= (yyvsp[(1) - (2)].number);
++@@ -3280,7 +3285,7 @@ yyreduce:
++ break;
++
++ case 160:
++-#line 1207 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1212 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ ELEMENT x;
++
++@@ -3300,7 +3305,7 @@ yyreduce:
++ break;
++
++ case 161:
++-#line 1224 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1229 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ ELEMENT x;
++
++@@ -3321,12 +3326,12 @@ yyreduce:
++ break;
++
++ case 162:
++-#line 1244 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1249 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '|'); }
++ break;
++
++ case 163:
++-#line 1246 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1251 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ {
++ /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */
++ COMMAND *tc;
++@@ -3352,28 +3357,28 @@ yyreduce:
++ break;
++
++ case 164:
++-#line 1269 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1274 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 165:
++-#line 1273 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1278 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.number) = CMD_TIME_PIPELINE; }
++ break;
++
++ case 166:
++-#line 1275 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1280 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
++ break;
++
++ case 167:
++-#line 1277 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1282 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++ { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
++ break;
++
++
++ /* Line 1267 of yacc.c. */
++-#line 3377 "y.tab.c"
+++#line 3382 "y.tab.c"
++ default: break;
++ }
++ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
++@@ -3587,7 +3592,7 @@ yyreturn:
++ }
++
++
++-#line 1279 "/usr/homes/chet/src/bash/src/parse.y"
+++#line 1284 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
++
++
++ /* Initial size to allocate for tokens, and the
++@@ -4948,6 +4953,21 @@ yylex ()
++ which allow ESAC to be the next one read. */
++ static int esacs_needed_count;
++
+++static void
+++push_heredoc (r)
+++ REDIRECT *r;
+++{
+++ if (need_here_doc >= HEREDOC_MAX)
+++ {
+++ last_command_exit_value = EX_BADUSAGE;
+++ need_here_doc = 0;
+++ report_syntax_error (_("maximum here-document count exceeded"));
+++ reset_parser ();
+++ exit_shell (last_command_exit_value);
+++ }
+++ redir_stack[need_here_doc++] = r;
+++}
+++
++ void
++ gather_here_documents ()
++ {
++@@ -8541,3 +8561,4 @@ set_line_mbstate ()
++ }
++ }
++ #endif /* HANDLE_MULTIBYTE */
+++
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 27
+++#define PATCHLEVEL 28
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/129-upstream-bash43-029.patch b/feeds/packages/utils/bash/patches/129-upstream-bash43-029.patch
+new file mode 100644
+index 0000000..be82403
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/129-upstream-bash43-029.patch
+@@ -0,0 +1,50 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-029
++
++Bug-Reported-by: Michal Zalewski <lcamtuf@coredump.cx>
++Bug-Reference-ID:
++Bug-Reference-URL:
++
++Bug-Description:
++
++When bash is parsing a function definition that contains a here-document
++delimited by end-of-file (or end-of-string), it leaves the closing delimiter
++uninitialized. This can result in an invalid memory access when the parsed
++function is later copied.
++
++Patch (apply with `patch -p0'):
++
++--- a/make_cmd.c
+++++ b/make_cmd.c
++@@ -692,6 +692,7 @@ make_redirection (source, instruction, d
++ /* First do the common cases. */
++ temp->redirector = source;
++ temp->redirectee = dest_and_filename;
+++ temp->here_doc_eof = 0;
++ temp->instruction = instruction;
++ temp->flags = 0;
++ temp->rflags = flags;
++--- a/copy_cmd.c
+++++ b/copy_cmd.c
++@@ -126,7 +126,7 @@ copy_redirect (redirect)
++ {
++ case r_reading_until:
++ case r_deblank_reading_until:
++- new_redirect->here_doc_eof = savestring (redirect->here_doc_eof);
+++ new_redirect->here_doc_eof = redirect->here_doc_eof ? savestring (redirect->here_doc_eof) : 0;
++ /*FALLTHROUGH*/
++ case r_reading_string:
++ case r_appending_to:
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 28
+++#define PATCHLEVEL 29
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/130-upstream-bash43-030.patch b/feeds/packages/utils/bash/patches/130-upstream-bash43-030.patch
+new file mode 100644
+index 0000000..0eadc5c
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/130-upstream-bash43-030.patch
+@@ -0,0 +1,1396 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-030
++
++Bug-Reported-by: Michal Zalewski <lcamtuf@coredump.cx>
++Bug-Reference-ID:
++Bug-Reference-URL:
++
++Bug-Description:
++
++A combination of nested command substitutions and function importing from
++the environment can cause bash to execute code appearing in the environment
++variable value following the function definition.
++
++Patch (apply with `patch -p0'):
++
++--- a/builtins/evalstring.c
+++++ b/builtins/evalstring.c
++@@ -308,12 +308,25 @@ parse_and_execute (string, from_file, fl
++ {
++ struct fd_bitmap *bitmap;
++
++- if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)
+++ if (flags & SEVAL_FUNCDEF)
++ {
++- internal_warning ("%s: ignoring function definition attempt", from_file);
++- should_jump_to_top_level = 0;
++- last_result = last_command_exit_value = EX_BADUSAGE;
++- break;
+++ char *x;
+++
+++ /* If the command parses to something other than a straight
+++ function definition, or if we have not consumed the entire
+++ string, or if the parser has transformed the function
+++ name (as parsing will if it begins or ends with shell
+++ whitespace, for example), reject the attempt */
+++ if (command->type != cm_function_def ||
+++ ((x = parser_remaining_input ()) && *x) ||
+++ (STREQ (from_file, command->value.Function_def->name->word) == 0))
+++ {
+++ internal_warning (_("%s: ignoring function definition attempt"), from_file);
+++ should_jump_to_top_level = 0;
+++ last_result = last_command_exit_value = EX_BADUSAGE;
+++ reset_parser ();
+++ break;
+++ }
++ }
++
++ bitmap = new_fd_bitmap (FD_BITMAP_SIZE);
++@@ -378,7 +391,10 @@ parse_and_execute (string, from_file, fl
++ discard_unwind_frame ("pe_dispose");
++
++ if (flags & SEVAL_ONECMD)
++- break;
+++ {
+++ reset_parser ();
+++ break;
+++ }
++ }
++ }
++ else
++--- a/parse.y
+++++ b/parse.y
++@@ -2538,6 +2538,16 @@ shell_ungetc (c)
++ eol_ungetc_lookahead = c;
++ }
++
+++char *
+++parser_remaining_input ()
+++{
+++ if (shell_input_line == 0)
+++ return 0;
+++ if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len)
+++ return '\0'; /* XXX */
+++ return (shell_input_line + shell_input_line_index);
+++}
+++
++ #ifdef INCLUDE_UNUSED
++ /* Back the input pointer up by one, effectively `ungetting' a character. */
++ static void
++@@ -4027,8 +4037,8 @@ xparse_dolparen (base, string, indp, fla
++ reset_parser ();
++ /* reset_parser clears shell_input_line and associated variables */
++ restore_input_line_state (&ls);
++- if (interactive)
++- token_to_read = 0;
+++
+++ token_to_read = 0;
++
++ /* Need to find how many characters parse_and_execute consumed, update
++ *indp, if flags != 0, copy the portion of the string parsed into RET
++--- a/shell.h
+++++ b/shell.h
++@@ -180,6 +180,8 @@ typedef struct _sh_input_line_state_t {
++ } sh_input_line_state_t;
++
++ /* Let's try declaring these here. */
+++extern char *parser_remaining_input __P((void));
+++
++ extern sh_parser_state_t *save_parser_state __P((sh_parser_state_t *));
++ extern void restore_parser_state __P((sh_parser_state_t *));
++
++--- a/y.tab.c
+++++ b/y.tab.c
++@@ -168,7 +168,7 @@
++
++
++ /* Copy the first part of user declarations. */
++-#line 21 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 21 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++
++ #include "config.h"
++
++@@ -497,7 +497,7 @@ static REDIRECTEE redir;
++
++ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
++ typedef union YYSTYPE
++-#line 329 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 329 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ WORD_DESC *word; /* the word that we read. */
++ int number; /* the number that we read. */
++@@ -2098,7 +2098,7 @@ yyreduce:
++ switch (yyn)
++ {
++ case 2:
++-#line 383 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 383 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ /* Case of regular command. Discard the error
++ safety net,and return the command just parsed. */
++@@ -2112,7 +2112,7 @@ yyreduce:
++ break;
++
++ case 3:
++-#line 394 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 394 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ /* Case of regular command, but not a very
++ interesting one. Return a NULL command. */
++@@ -2124,7 +2124,7 @@ yyreduce:
++ break;
++
++ case 4:
++-#line 403 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 403 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ /* Error during parsing. Return NULL command. */
++ global_command = (COMMAND *)NULL;
++@@ -2142,7 +2142,7 @@ yyreduce:
++ break;
++
++ case 5:
++-#line 418 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 418 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ /* Case of EOF seen by itself. Do ignoreeof or
++ not. */
++@@ -2153,17 +2153,17 @@ yyreduce:
++ break;
++
++ case 6:
++-#line 428 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 428 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
++ break;
++
++ case 7:
++-#line 430 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 430 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.word_list) = make_word_list ((yyvsp[(2) - (2)].word), (yyvsp[(1) - (2)].word_list)); }
++ break;
++
++ case 8:
++-#line 434 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 434 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2172,7 +2172,7 @@ yyreduce:
++ break;
++
++ case 9:
++-#line 440 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 440 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2181,7 +2181,7 @@ yyreduce:
++ break;
++
++ case 10:
++-#line 446 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 446 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2190,7 +2190,7 @@ yyreduce:
++ break;
++
++ case 11:
++-#line 452 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 452 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2199,7 +2199,7 @@ yyreduce:
++ break;
++
++ case 12:
++-#line 458 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 458 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2208,7 +2208,7 @@ yyreduce:
++ break;
++
++ case 13:
++-#line 464 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 464 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2217,7 +2217,7 @@ yyreduce:
++ break;
++
++ case 14:
++-#line 470 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 470 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2226,7 +2226,7 @@ yyreduce:
++ break;
++
++ case 15:
++-#line 476 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 476 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2235,7 +2235,7 @@ yyreduce:
++ break;
++
++ case 16:
++-#line 482 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 482 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2244,7 +2244,7 @@ yyreduce:
++ break;
++
++ case 17:
++-#line 488 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 488 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2253,7 +2253,7 @@ yyreduce:
++ break;
++
++ case 18:
++-#line 494 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 494 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2262,7 +2262,7 @@ yyreduce:
++ break;
++
++ case 19:
++-#line 500 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 500 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2271,7 +2271,7 @@ yyreduce:
++ break;
++
++ case 20:
++-#line 506 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 506 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2280,7 +2280,7 @@ yyreduce:
++ break;
++
++ case 21:
++-#line 512 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 512 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2289,7 +2289,7 @@ yyreduce:
++ break;
++
++ case 22:
++-#line 518 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 518 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2298,7 +2298,7 @@ yyreduce:
++ break;
++
++ case 23:
++-#line 524 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 524 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2308,7 +2308,7 @@ yyreduce:
++ break;
++
++ case 24:
++-#line 531 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 531 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2318,7 +2318,7 @@ yyreduce:
++ break;
++
++ case 25:
++-#line 538 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 538 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2328,7 +2328,7 @@ yyreduce:
++ break;
++
++ case 26:
++-#line 545 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 545 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2338,7 +2338,7 @@ yyreduce:
++ break;
++
++ case 27:
++-#line 552 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 552 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2348,7 +2348,7 @@ yyreduce:
++ break;
++
++ case 28:
++-#line 559 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 559 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2358,7 +2358,7 @@ yyreduce:
++ break;
++
++ case 29:
++-#line 566 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 566 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2367,7 +2367,7 @@ yyreduce:
++ break;
++
++ case 30:
++-#line 572 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 572 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2376,7 +2376,7 @@ yyreduce:
++ break;
++
++ case 31:
++-#line 578 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 578 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2385,7 +2385,7 @@ yyreduce:
++ break;
++
++ case 32:
++-#line 584 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 584 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 0;
++ redir.dest = (yyvsp[(2) - (2)].number);
++@@ -2394,7 +2394,7 @@ yyreduce:
++ break;
++
++ case 33:
++-#line 590 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 590 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.dest = (yyvsp[(3) - (3)].number);
++@@ -2403,7 +2403,7 @@ yyreduce:
++ break;
++
++ case 34:
++-#line 596 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 596 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.dest = (yyvsp[(3) - (3)].number);
++@@ -2412,7 +2412,7 @@ yyreduce:
++ break;
++
++ case 35:
++-#line 602 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 602 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 1;
++ redir.dest = (yyvsp[(2) - (2)].number);
++@@ -2421,7 +2421,7 @@ yyreduce:
++ break;
++
++ case 36:
++-#line 608 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 608 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.dest = (yyvsp[(3) - (3)].number);
++@@ -2430,7 +2430,7 @@ yyreduce:
++ break;
++
++ case 37:
++-#line 614 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 614 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.dest = (yyvsp[(3) - (3)].number);
++@@ -2439,7 +2439,7 @@ yyreduce:
++ break;
++
++ case 38:
++-#line 620 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 620 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 0;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2448,7 +2448,7 @@ yyreduce:
++ break;
++
++ case 39:
++-#line 626 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 626 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2457,7 +2457,7 @@ yyreduce:
++ break;
++
++ case 40:
++-#line 632 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 632 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2466,7 +2466,7 @@ yyreduce:
++ break;
++
++ case 41:
++-#line 638 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 638 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2475,7 +2475,7 @@ yyreduce:
++ break;
++
++ case 42:
++-#line 644 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 644 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2484,7 +2484,7 @@ yyreduce:
++ break;
++
++ case 43:
++-#line 650 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 650 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.filename = (yyvsp[(3) - (3)].word);
++@@ -2493,7 +2493,7 @@ yyreduce:
++ break;
++
++ case 44:
++-#line 656 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 656 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 1;
++ redir.dest = 0;
++@@ -2502,7 +2502,7 @@ yyreduce:
++ break;
++
++ case 45:
++-#line 662 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 662 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.dest = 0;
++@@ -2511,7 +2511,7 @@ yyreduce:
++ break;
++
++ case 46:
++-#line 668 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 668 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.dest = 0;
++@@ -2520,7 +2520,7 @@ yyreduce:
++ break;
++
++ case 47:
++-#line 674 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 674 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 0;
++ redir.dest = 0;
++@@ -2529,7 +2529,7 @@ yyreduce:
++ break;
++
++ case 48:
++-#line 680 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 680 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = (yyvsp[(1) - (3)].number);
++ redir.dest = 0;
++@@ -2538,7 +2538,7 @@ yyreduce:
++ break;
++
++ case 49:
++-#line 686 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 686 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.filename = (yyvsp[(1) - (3)].word);
++ redir.dest = 0;
++@@ -2547,7 +2547,7 @@ yyreduce:
++ break;
++
++ case 50:
++-#line 692 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 692 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2556,7 +2556,7 @@ yyreduce:
++ break;
++
++ case 51:
++-#line 698 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 698 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ source.dest = 1;
++ redir.filename = (yyvsp[(2) - (2)].word);
++@@ -2565,29 +2565,29 @@ yyreduce:
++ break;
++
++ case 52:
++-#line 706 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 706 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
++ break;
++
++ case 53:
++-#line 708 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 708 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.element).word = (yyvsp[(1) - (1)].word); (yyval.element).redirect = 0; }
++ break;
++
++ case 54:
++-#line 710 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 710 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.element).redirect = (yyvsp[(1) - (1)].redirect); (yyval.element).word = 0; }
++ break;
++
++ case 55:
++-#line 714 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 714 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.redirect) = (yyvsp[(1) - (1)].redirect);
++ }
++ break;
++
++ case 56:
++-#line 718 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 718 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ register REDIRECT *t;
++
++@@ -2599,27 +2599,27 @@ yyreduce:
++ break;
++
++ case 57:
++-#line 729 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 729 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_simple_command ((yyvsp[(1) - (1)].element), (COMMAND *)NULL); }
++ break;
++
++ case 58:
++-#line 731 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 731 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_simple_command ((yyvsp[(2) - (2)].element), (yyvsp[(1) - (2)].command)); }
++ break;
++
++ case 59:
++-#line 735 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 735 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = clean_simple_command ((yyvsp[(1) - (1)].command)); }
++ break;
++
++ case 60:
++-#line 737 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 737 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 61:
++-#line 739 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 739 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ COMMAND *tc;
++
++@@ -2638,72 +2638,72 @@ yyreduce:
++ break;
++
++ case 62:
++-#line 755 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 755 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 63:
++-#line 757 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 757 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 64:
++-#line 761 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 761 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 65:
++-#line 763 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 763 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 66:
++-#line 765 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 765 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_while_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
++ break;
++
++ case 67:
++-#line 767 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 767 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_until_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command)); }
++ break;
++
++ case 68:
++-#line 769 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 769 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 69:
++-#line 771 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 771 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 70:
++-#line 773 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 773 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 71:
++-#line 775 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 775 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 72:
++-#line 777 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 777 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 73:
++-#line 779 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 779 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 74:
++-#line 781 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 781 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 75:
++-#line 785 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 785 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2711,7 +2711,7 @@ yyreduce:
++ break;
++
++ case 76:
++-#line 790 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 790 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2719,7 +2719,7 @@ yyreduce:
++ break;
++
++ case 77:
++-#line 795 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 795 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2727,7 +2727,7 @@ yyreduce:
++ break;
++
++ case 78:
++-#line 800 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 800 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2735,7 +2735,7 @@ yyreduce:
++ break;
++
++ case 79:
++-#line 805 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 805 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2743,7 +2743,7 @@ yyreduce:
++ break;
++
++ case 80:
++-#line 810 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 810 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2751,7 +2751,7 @@ yyreduce:
++ break;
++
++ case 81:
++-#line 815 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 815 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2759,7 +2759,7 @@ yyreduce:
++ break;
++
++ case 82:
++-#line 820 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 820 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_for_command ((yyvsp[(2) - (9)].word), (WORD_LIST *)NULL, (yyvsp[(8) - (9)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2767,7 +2767,7 @@ yyreduce:
++ break;
++
++ case 83:
++-#line 827 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 827 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
++ if (word_top > 0) word_top--;
++@@ -2775,7 +2775,7 @@ yyreduce:
++ break;
++
++ case 84:
++-#line 832 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 832 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_arith_for_command ((yyvsp[(2) - (7)].word_list), (yyvsp[(6) - (7)].command), arith_for_lineno);
++ if (word_top > 0) word_top--;
++@@ -2783,7 +2783,7 @@ yyreduce:
++ break;
++
++ case 85:
++-#line 837 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 837 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
++ if (word_top > 0) word_top--;
++@@ -2791,7 +2791,7 @@ yyreduce:
++ break;
++
++ case 86:
++-#line 842 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 842 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_arith_for_command ((yyvsp[(2) - (5)].word_list), (yyvsp[(4) - (5)].command), arith_for_lineno);
++ if (word_top > 0) word_top--;
++@@ -2799,7 +2799,7 @@ yyreduce:
++ break;
++
++ case 87:
++-#line 849 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 849 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2807,7 +2807,7 @@ yyreduce:
++ break;
++
++ case 88:
++-#line 854 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 854 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (6)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(5) - (6)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2815,7 +2815,7 @@ yyreduce:
++ break;
++
++ case 89:
++-#line 859 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 859 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2823,7 +2823,7 @@ yyreduce:
++ break;
++
++ case 90:
++-#line 864 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 864 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (7)].word), add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), (yyvsp[(6) - (7)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2831,7 +2831,7 @@ yyreduce:
++ break;
++
++ case 91:
++-#line 869 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 869 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2839,7 +2839,7 @@ yyreduce:
++ break;
++
++ case 92:
++-#line 874 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 874 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_select_command ((yyvsp[(2) - (10)].word), REVERSE_LIST ((yyvsp[(5) - (10)].word_list), WORD_LIST *), (yyvsp[(9) - (10)].command), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2847,7 +2847,7 @@ yyreduce:
++ break;
++
++ case 93:
++-#line 881 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 881 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (PATTERN_LIST *)NULL, word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2855,7 +2855,7 @@ yyreduce:
++ break;
++
++ case 94:
++-#line 886 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 886 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_case_command ((yyvsp[(2) - (7)].word), (yyvsp[(5) - (7)].pattern), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2863,7 +2863,7 @@ yyreduce:
++ break;
++
++ case 95:
++-#line 891 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 891 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_case_command ((yyvsp[(2) - (6)].word), (yyvsp[(5) - (6)].pattern), word_lineno[word_top]);
++ if (word_top > 0) word_top--;
++@@ -2871,27 +2871,27 @@ yyreduce:
++ break;
++
++ case 96:
++-#line 898 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 898 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_function_def ((yyvsp[(1) - (5)].word), (yyvsp[(5) - (5)].command), function_dstart, function_bstart); }
++ break;
++
++ case 97:
++-#line 901 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 901 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_function_def ((yyvsp[(2) - (6)].word), (yyvsp[(6) - (6)].command), function_dstart, function_bstart); }
++ break;
++
++ case 98:
++-#line 904 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 904 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_function_def ((yyvsp[(2) - (4)].word), (yyvsp[(4) - (4)].command), function_dstart, function_bstart); }
++ break;
++
++ case 99:
++-#line 908 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 908 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 100:
++-#line 910 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 910 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ COMMAND *tc;
++
++@@ -2923,7 +2923,7 @@ yyreduce:
++ break;
++
++ case 101:
++-#line 941 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 941 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_subshell_command ((yyvsp[(2) - (3)].command));
++ (yyval.command)->flags |= CMD_WANT_SUBSHELL;
++@@ -2931,7 +2931,7 @@ yyreduce:
++ break;
++
++ case 102:
++-#line 948 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 948 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_coproc_command ("COPROC", (yyvsp[(2) - (2)].command));
++ (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
++@@ -2939,7 +2939,7 @@ yyreduce:
++ break;
++
++ case 103:
++-#line 953 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 953 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ COMMAND *tc;
++
++@@ -2959,7 +2959,7 @@ yyreduce:
++ break;
++
++ case 104:
++-#line 970 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 970 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_coproc_command ((yyvsp[(2) - (3)].word)->word, (yyvsp[(3) - (3)].command));
++ (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
++@@ -2967,7 +2967,7 @@ yyreduce:
++ break;
++
++ case 105:
++-#line 975 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 975 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ COMMAND *tc;
++
++@@ -2987,7 +2987,7 @@ yyreduce:
++ break;
++
++ case 106:
++-#line 992 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 992 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = make_coproc_command ("COPROC", clean_simple_command ((yyvsp[(2) - (2)].command)));
++ (yyval.command)->flags |= CMD_WANT_SUBSHELL|CMD_COPROC_SUBSHELL;
++@@ -2995,117 +2995,117 @@ yyreduce:
++ break;
++
++ case 107:
++-#line 999 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 999 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (COMMAND *)NULL); }
++ break;
++
++ case 108:
++-#line 1001 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1001 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (7)].command), (yyvsp[(4) - (7)].command), (yyvsp[(6) - (7)].command)); }
++ break;
++
++ case 109:
++-#line 1003 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1003 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(5) - (6)].command)); }
++ break;
++
++ case 110:
++-#line 1008 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1008 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_group_command ((yyvsp[(2) - (3)].command)); }
++ break;
++
++ case 111:
++-#line 1012 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1012 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_arith_command ((yyvsp[(1) - (1)].word_list)); }
++ break;
++
++ case 112:
++-#line 1016 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1016 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(2) - (3)].command); }
++ break;
++
++ case 113:
++-#line 1020 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1020 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (4)].command), (yyvsp[(4) - (4)].command), (COMMAND *)NULL); }
++ break;
++
++ case 114:
++-#line 1022 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1022 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (6)].command), (yyvsp[(4) - (6)].command), (yyvsp[(6) - (6)].command)); }
++ break;
++
++ case 115:
++-#line 1024 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1024 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = make_if_command ((yyvsp[(2) - (5)].command), (yyvsp[(4) - (5)].command), (yyvsp[(5) - (5)].command)); }
++ break;
++
++ case 117:
++-#line 1029 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1029 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyvsp[(2) - (2)].pattern)->next = (yyvsp[(1) - (2)].pattern); (yyval.pattern) = (yyvsp[(2) - (2)].pattern); }
++ break;
++
++ case 118:
++-#line 1033 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1033 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (yyvsp[(4) - (4)].command)); }
++ break;
++
++ case 119:
++-#line 1035 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1035 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.pattern) = make_pattern_list ((yyvsp[(2) - (4)].word_list), (COMMAND *)NULL); }
++ break;
++
++ case 120:
++-#line 1037 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1037 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (yyvsp[(5) - (5)].command)); }
++ break;
++
++ case 121:
++-#line 1039 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1039 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.pattern) = make_pattern_list ((yyvsp[(3) - (5)].word_list), (COMMAND *)NULL); }
++ break;
++
++ case 122:
++-#line 1043 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1043 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
++ break;
++
++ case 123:
++-#line 1045 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1045 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
++ break;
++
++ case 124:
++-#line 1047 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1047 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
++ break;
++
++ case 125:
++-#line 1049 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1049 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_FALLTHROUGH; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
++ break;
++
++ case 126:
++-#line 1051 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1051 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyvsp[(1) - (2)].pattern)->flags |= CASEPAT_TESTNEXT; (yyval.pattern) = (yyvsp[(1) - (2)].pattern); }
++ break;
++
++ case 127:
++-#line 1053 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1053 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyvsp[(2) - (3)].pattern)->flags |= CASEPAT_TESTNEXT; (yyvsp[(2) - (3)].pattern)->next = (yyvsp[(1) - (3)].pattern); (yyval.pattern) = (yyvsp[(2) - (3)].pattern); }
++ break;
++
++ case 128:
++-#line 1057 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1057 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.word_list) = make_word_list ((yyvsp[(1) - (1)].word), (WORD_LIST *)NULL); }
++ break;
++
++ case 129:
++-#line 1059 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1059 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.word_list) = make_word_list ((yyvsp[(3) - (3)].word), (yyvsp[(1) - (3)].word_list)); }
++ break;
++
++ case 130:
++-#line 1068 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1068 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = (yyvsp[(2) - (2)].command);
++ if (need_here_doc)
++@@ -3114,14 +3114,14 @@ yyreduce:
++ break;
++
++ case 132:
++-#line 1077 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1077 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = (yyvsp[(2) - (2)].command);
++ }
++ break;
++
++ case 134:
++-#line 1084 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1084 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ if ((yyvsp[(1) - (3)].command)->type == cm_connection)
++ (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (COMMAND *)NULL, '&');
++@@ -3131,17 +3131,17 @@ yyreduce:
++ break;
++
++ case 136:
++-#line 1095 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1095 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
++ break;
++
++ case 137:
++-#line 1097 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1097 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
++ break;
++
++ case 138:
++-#line 1099 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1099 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ if ((yyvsp[(1) - (4)].command)->type == cm_connection)
++ (yyval.command) = connect_async_list ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '&');
++@@ -3151,37 +3151,37 @@ yyreduce:
++ break;
++
++ case 139:
++-#line 1106 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1106 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
++ break;
++
++ case 140:
++-#line 1108 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1108 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), ';'); }
++ break;
++
++ case 141:
++-#line 1110 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1110 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 144:
++-#line 1118 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1118 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.number) = '\n'; }
++ break;
++
++ case 145:
++-#line 1120 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1120 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.number) = ';'; }
++ break;
++
++ case 146:
++-#line 1122 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1122 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.number) = yacc_EOF; }
++ break;
++
++ case 149:
++-#line 1136 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1136 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = (yyvsp[(1) - (1)].command);
++ if (need_here_doc)
++@@ -3197,7 +3197,7 @@ yyreduce:
++ break;
++
++ case 150:
++-#line 1149 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1149 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ if ((yyvsp[(1) - (2)].command)->type == cm_connection)
++ (yyval.command) = connect_async_list ((yyvsp[(1) - (2)].command), (COMMAND *)NULL, '&');
++@@ -3216,7 +3216,7 @@ yyreduce:
++ break;
++
++ case 151:
++-#line 1165 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1165 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ (yyval.command) = (yyvsp[(1) - (2)].command);
++ if (need_here_doc)
++@@ -3232,17 +3232,17 @@ yyreduce:
++ break;
++
++ case 152:
++-#line 1180 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1180 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), AND_AND); }
++ break;
++
++ case 153:
++-#line 1182 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1182 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), OR_OR); }
++ break;
++
++ case 154:
++-#line 1184 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1184 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ if ((yyvsp[(1) - (3)].command)->type == cm_connection)
++ (yyval.command) = connect_async_list ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), '&');
++@@ -3252,22 +3252,22 @@ yyreduce:
++ break;
++
++ case 155:
++-#line 1191 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1191 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (3)].command), (yyvsp[(3) - (3)].command), ';'); }
++ break;
++
++ case 156:
++-#line 1194 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1194 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 157:
++-#line 1198 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1198 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 158:
++-#line 1200 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1200 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ if ((yyvsp[(2) - (2)].command))
++ (yyvsp[(2) - (2)].command)->flags ^= CMD_INVERT_RETURN; /* toggle */
++@@ -3276,7 +3276,7 @@ yyreduce:
++ break;
++
++ case 159:
++-#line 1206 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1206 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ if ((yyvsp[(2) - (2)].command))
++ (yyvsp[(2) - (2)].command)->flags |= (yyvsp[(1) - (2)].number);
++@@ -3285,7 +3285,7 @@ yyreduce:
++ break;
++
++ case 160:
++-#line 1212 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1212 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ ELEMENT x;
++
++@@ -3305,7 +3305,7 @@ yyreduce:
++ break;
++
++ case 161:
++-#line 1229 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1229 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ ELEMENT x;
++
++@@ -3326,12 +3326,12 @@ yyreduce:
++ break;
++
++ case 162:
++-#line 1249 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1249 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = command_connect ((yyvsp[(1) - (4)].command), (yyvsp[(4) - (4)].command), '|'); }
++ break;
++
++ case 163:
++-#line 1251 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1251 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ {
++ /* Make cmd1 |& cmd2 equivalent to cmd1 2>&1 | cmd2 */
++ COMMAND *tc;
++@@ -3357,22 +3357,22 @@ yyreduce:
++ break;
++
++ case 164:
++-#line 1274 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1274 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.command) = (yyvsp[(1) - (1)].command); }
++ break;
++
++ case 165:
++-#line 1278 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1278 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.number) = CMD_TIME_PIPELINE; }
++ break;
++
++ case 166:
++-#line 1280 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1280 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
++ break;
++
++ case 167:
++-#line 1282 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1282 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++ { (yyval.number) = CMD_TIME_PIPELINE|CMD_TIME_POSIX; }
++ break;
++
++@@ -3592,7 +3592,7 @@ yyreturn:
++ }
++
++
++-#line 1284 "/usr/src/local/chet/src/bash/bash-4.3.28/parse.y"
+++#line 1284 "/usr/src/local/bash/bash-4.3-patched/parse.y"
++
++
++ /* Initial size to allocate for tokens, and the
++@@ -4850,6 +4850,16 @@ shell_ungetc (c)
++ eol_ungetc_lookahead = c;
++ }
++
+++char *
+++parser_remaining_input ()
+++{
+++ if (shell_input_line == 0)
+++ return 0;
+++ if (shell_input_line_index < 0 || shell_input_line_index >= shell_input_line_len)
+++ return '\0'; /* XXX */
+++ return (shell_input_line + shell_input_line_index);
+++}
+++
++ #ifdef INCLUDE_UNUSED
++ /* Back the input pointer up by one, effectively `ungetting' a character. */
++ static void
++@@ -6339,8 +6349,8 @@ xparse_dolparen (base, string, indp, fla
++ reset_parser ();
++ /* reset_parser clears shell_input_line and associated variables */
++ restore_input_line_state (&ls);
++- if (interactive)
++- token_to_read = 0;
+++
+++ token_to_read = 0;
++
++ /* Need to find how many characters parse_and_execute consumed, update
++ *indp, if flags != 0, copy the portion of the string parsed into RET
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 29
+++#define PATCHLEVEL 30
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/131-upstream-bash43-031.patch b/feeds/packages/utils/bash/patches/131-upstream-bash43-031.patch
+new file mode 100644
+index 0000000..a22cb07
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/131-upstream-bash43-031.patch
+@@ -0,0 +1,96 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-031
++
++Bug-Reported-by: lolilolicon <lolilolicon@gmail.com>
++Bug-Reference-ID: <CAMtVo_Nz=32Oq=zWTb6=+8gUNXOo2rRvud1W4oPnA-cgVk_ZqQ@mail.gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-08/msg00139.html
++
++Bug-Description:
++
++The new nameref assignment functionality introduced in bash-4.3 did not perform
++enough validation on the variable value and would create variables with
++invalid names.
++
++Patch (apply with `patch -p0'):
++
++--- a/subst.h
+++++ b/subst.h
++@@ -47,6 +47,7 @@
++ #define ASS_MKASSOC 0x0004
++ #define ASS_MKGLOBAL 0x0008 /* force global assignment */
++ #define ASS_NAMEREF 0x0010 /* assigning to nameref variable */
+++#define ASS_FROMREF 0x0020 /* assigning from value of nameref variable */
++
++ /* Flags for the string extraction functions. */
++ #define SX_NOALLOC 0x0001 /* just skip; don't return substring */
++--- a/variables.c
+++++ b/variables.c
++@@ -2516,10 +2516,27 @@ bind_variable_internal (name, value, tab
++ HASH_TABLE *table;
++ int hflags, aflags;
++ {
++- char *newval;
+++ char *newname, *newval;
++ SHELL_VAR *entry;
+++#if defined (ARRAY_VARS)
+++ arrayind_t ind;
+++ char *subp;
+++ int sublen;
+++#endif
++
+++ newname = 0;
+++#if defined (ARRAY_VARS)
+++ if ((aflags & ASS_FROMREF) && (hflags & HASH_NOSRCH) == 0 && valid_array_reference (name))
+++ {
+++ newname = array_variable_name (name, &subp, &sublen);
+++ if (newname == 0)
+++ return (SHELL_VAR *)NULL; /* XXX */
+++ entry = hash_lookup (newname, table);
+++ }
+++ else
+++#endif
++ entry = (hflags & HASH_NOSRCH) ? (SHELL_VAR *)NULL : hash_lookup (name, table);
+++
++ /* Follow the nameref chain here if this is the global variables table */
++ if (entry && nameref_p (entry) && (invisible_p (entry) == 0) && table == global_variables->table)
++ {
++@@ -2550,6 +2567,16 @@ bind_variable_internal (name, value, tab
++ var_setvalue (entry, make_variable_value (entry, value, 0));
++ }
++ }
+++#if defined (ARRAY_VARS)
+++ else if (entry == 0 && newname)
+++ {
+++ entry = make_new_array_variable (newname); /* indexed array by default */
+++ if (entry == 0)
+++ return entry;
+++ ind = array_expand_index (name, subp, sublen);
+++ bind_array_element (entry, ind, value, aflags);
+++ }
+++#endif
++ else if (entry == 0)
++ {
++ entry = make_new_variable (name, table);
++@@ -2670,7 +2697,8 @@ bind_variable (name, value, flags)
++ normal. */
++ if (nameref_cell (nv) == 0)
++ return (bind_variable_internal (nv->name, value, nvc->table, 0, flags));
++- return (bind_variable_internal (nameref_cell (nv), value, nvc->table, 0, flags));
+++ /* XXX - bug here with ref=array[index] */
+++ return (bind_variable_internal (nameref_cell (nv), value, nvc->table, 0, flags|ASS_FROMREF));
++ }
++ else
++ v = nv;
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 30
+++#define PATCHLEVEL 31
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/132-upstream-bash43-032.patch b/feeds/packages/utils/bash/patches/132-upstream-bash43-032.patch
+new file mode 100644
+index 0000000..96a86c9
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/132-upstream-bash43-032.patch
+@@ -0,0 +1,42 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-032
++
++Bug-Reported-by: crispusfairbairn@gmail.com
++Bug-Reference-ID: <b5e499f7-3b98-408d-9f94-c0387580e73a@googlegroups.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-09/msg00013.html
++
++Bug-Description:
++
++When bash is running in Posix mode, it allows signals -- including SIGCHLD --
++to interrupt the `wait' builtin, as Posix requires. However, the interrupt
++causes bash to not run a SIGCHLD trap for all exited children. This patch
++fixes the issue and restores the documented behavior in Posix mode.
++
++Patch (apply with `patch -p0'):
++
++--- a/jobs.c
+++++ b/jobs.c
++@@ -3339,7 +3339,9 @@ itrace("waitchld: waitpid returns %d blo
++ if (posixly_correct && this_shell_builtin && this_shell_builtin == wait_builtin)
++ {
++ interrupt_immediately = 0;
++- trap_handler (SIGCHLD); /* set pending_traps[SIGCHLD] */
+++ /* This was trap_handler (SIGCHLD) but that can lose traps if
+++ children_exited > 1 */
+++ queue_sigchld_trap (children_exited);
++ wait_signal_received = SIGCHLD;
++ /* If we're in a signal handler, let CHECK_WAIT_INTR pick it up;
++ run_pending_traps will call run_sigchld_trap later */
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 31
+++#define PATCHLEVEL 32
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/133-upstream-bash43-033.patch b/feeds/packages/utils/bash/patches/133-upstream-bash43-033.patch
+new file mode 100644
+index 0000000..6210b5e
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/133-upstream-bash43-033.patch
+@@ -0,0 +1,201 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-033
++
++Bug-Reported-by: mickael9@gmail.com, Jan Rome <jan.rome@gmail.com>
++Bug-Reference-ID: <20140907224046.382ED3610CC@mickael-laptop.localdomain>,
++ <540D661D.50908@gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-09/msg00029.html
++ http://lists.gnu.org/archive/html/bug-bash/2014-09/msg00030.html
++
++Bug-Description:
++
++Bash does not clean up the terminal state in all cases where bash or
++readline modifies it and bash is subsequently terminated by a fatal signal.
++This happens when the `read' builtin modifies the terminal settings, both
++when readline is active and when it is not. It occurs most often when a script
++installs a trap that exits on a signal without re-sending the signal to itself.
++
++Patch (apply with `patch -p0'):
++
++--- a/shell.c
+++++ b/shell.c
++@@ -73,6 +73,7 @@
++ #endif
++
++ #if defined (READLINE)
+++# include <readline/readline.h>
++ # include "bashline.h"
++ #endif
++
++@@ -909,6 +910,14 @@ exit_shell (s)
++ fflush (stdout); /* XXX */
++ fflush (stderr);
++
+++ /* Clean up the terminal if we are in a state where it's been modified. */
+++#if defined (READLINE)
+++ if (RL_ISSTATE (RL_STATE_TERMPREPPED) && rl_deprep_term_function)
+++ (*rl_deprep_term_function) ();
+++#endif
+++ if (read_tty_modified ())
+++ read_tty_cleanup ();
+++
++ /* Do trap[0] if defined. Allow it to override the exit status
++ passed to us. */
++ if (signal_is_trapped (0))
++--- a/builtins/read.def
+++++ b/builtins/read.def
++@@ -140,10 +140,12 @@ static void reset_alarm __P((void));
++ procenv_t alrmbuf;
++ int sigalrm_seen;
++
++-static int reading;
+++static int reading, tty_modified;
++ static SigHandler *old_alrm;
++ static unsigned char delim;
++
+++static struct ttsave termsave;
+++
++ /* In all cases, SIGALRM just sets a flag that we check periodically. This
++ avoids problems with the semi-tricky stuff we do with the xfree of
++ input_string at the top of the unwind-protect list (see below). */
++@@ -188,7 +190,6 @@ read_builtin (list)
++ struct stat tsb;
++ SHELL_VAR *var;
++ TTYSTRUCT ttattrs, ttset;
++- struct ttsave termsave;
++ #if defined (ARRAY_VARS)
++ WORD_LIST *alist;
++ #endif
++@@ -221,7 +222,7 @@ read_builtin (list)
++ USE_VAR(ps2);
++ USE_VAR(lastsig);
++
++- sigalrm_seen = reading = 0;
+++ sigalrm_seen = reading = tty_modified = 0;
++
++ i = 0; /* Index into the string that we are reading. */
++ raw = edit = 0; /* Not reading raw input by default. */
++@@ -438,6 +439,8 @@ read_builtin (list)
++ retval = 128+SIGALRM;
++ goto assign_vars;
++ }
+++ if (interactive_shell == 0)
+++ initialize_terminating_signals ();
++ old_alrm = set_signal_handler (SIGALRM, sigalrm);
++ add_unwind_protect (reset_alarm, (char *)NULL);
++ #if defined (READLINE)
++@@ -482,7 +485,10 @@ read_builtin (list)
++ i = silent ? ttfd_cbreak (fd, &ttset) : ttfd_onechar (fd, &ttset);
++ if (i < 0)
++ sh_ttyerror (1);
+++ tty_modified = 1;
++ add_unwind_protect ((Function *)ttyrestore, (char *)&termsave);
+++ if (interactive_shell == 0)
+++ initialize_terminating_signals ();
++ }
++ }
++ else if (silent) /* turn off echo but leave term in canonical mode */
++@@ -497,7 +503,10 @@ read_builtin (list)
++ if (i < 0)
++ sh_ttyerror (1);
++
+++ tty_modified = 1;
++ add_unwind_protect ((Function *)ttyrestore, (char *)&termsave);
+++ if (interactive_shell == 0)
+++ initialize_terminating_signals ();
++ }
++
++ /* This *must* be the top unwind-protect on the stack, so the manipulation
++@@ -588,6 +597,8 @@ read_builtin (list)
++ }
++ else
++ lastsig = 0;
+++ if (terminating_signal && tty_modified)
+++ ttyrestore (&termsave); /* fix terminal before exiting */
++ CHECK_TERMSIG;
++ eof = 1;
++ break;
++@@ -978,6 +989,20 @@ ttyrestore (ttp)
++ struct ttsave *ttp;
++ {
++ ttsetattr (ttp->fd, ttp->attrs);
+++ tty_modified = 0;
+++}
+++
+++void
+++read_tty_cleanup ()
+++{
+++ if (tty_modified)
+++ ttyrestore (&termsave);
+++}
+++
+++int
+++read_tty_modified ()
+++{
+++ return (tty_modified);
++ }
++
++ #if defined (READLINE)
++--- a/builtins/common.h
+++++ b/builtins/common.h
++@@ -122,6 +122,10 @@ extern void bash_logout __P((void));
++ /* Functions from getopts.def */
++ extern void getopts_reset __P((int));
++
+++/* Functions from read.def */
+++extern void read_tty_cleanup __P((void));
+++extern int read_tty_modified __P((void));
+++
++ /* Functions from set.def */
++ extern int minus_o_option_value __P((char *));
++ extern void list_minus_o_opts __P((int, int));
++--- a/bashline.c
+++++ b/bashline.c
++@@ -202,6 +202,7 @@ extern int current_command_line_count, s
++ extern int last_command_exit_value;
++ extern int array_needs_making;
++ extern int posixly_correct, no_symbolic_links;
+++extern int sigalrm_seen;
++ extern char *current_prompt_string, *ps1_prompt;
++ extern STRING_INT_ALIST word_token_alist[];
++ extern sh_builtin_func_t *last_shell_builtin, *this_shell_builtin;
++@@ -4208,8 +4209,9 @@ bash_event_hook ()
++ {
++ /* If we're going to longjmp to top_level, make sure we clean up readline.
++ check_signals will call QUIT, which will eventually longjmp to top_level,
++- calling run_interrupt_trap along the way. */
++- if (interrupt_state)
+++ calling run_interrupt_trap along the way. The check for sigalrm_seen is
+++ to clean up the read builtin's state. */
+++ if (terminating_signal || interrupt_state || sigalrm_seen)
++ rl_cleanup_after_signal ();
++ bashline_reset_event_hook ();
++ check_signals_and_traps (); /* XXX */
++--- a/sig.c
+++++ b/sig.c
++@@ -532,8 +532,10 @@ termsig_sighandler (sig)
++ #if defined (READLINE)
++ /* Set the event hook so readline will call it after the signal handlers
++ finish executing, so if this interrupted character input we can get
++- quick response. */
++- if (interactive_shell && interactive && no_line_editing == 0)
+++ quick response. If readline is active or has modified the terminal we
+++ need to set this no matter what the signal is, though the check for
+++ RL_STATE_TERMPREPPED is possibly redundant. */
+++ if (RL_ISSTATE (RL_STATE_SIGHANDLER) || RL_ISSTATE (RL_STATE_TERMPREPPED))
++ bashline_set_event_hook ();
++ #endif
++
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 32
+++#define PATCHLEVEL 33
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/134-upstream-bash43-034.patch b/feeds/packages/utils/bash/patches/134-upstream-bash43-034.patch
+new file mode 100644
+index 0000000..d3c4f8f
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/134-upstream-bash43-034.patch
+@@ -0,0 +1,74 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-034
++
++Bug-Reported-by: Dreamcat4 <dreamcat4@gmail.com>
++Bug-Reference-ID: <CAN39uTpAEs2GFu4ebC_SfSVMRTh-DJ9YanrY4BZZ3OO+CCHjng@mail.gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-05/msg00001.html
++
++Bug-Description:
++
++If neither the -f nor -v options is supplied to unset, and a name argument is
++found to be a function and unset, subsequent name arguments are not treated as
++variables before attempting to unset a function by that name.
++
++Patch (apply with `patch -p0'):
++
++--- a/builtins/set.def
+++++ b/builtins/set.def
++@@ -751,9 +751,11 @@ unset_builtin (list)
++ WORD_LIST *list;
++ {
++ int unset_function, unset_variable, unset_array, opt, nameref, any_failed;
+++ int global_unset_func, global_unset_var;
++ char *name;
++
++ unset_function = unset_variable = unset_array = nameref = any_failed = 0;
+++ global_unset_func = global_unset_var = 0;
++
++ reset_internal_getopt ();
++ while ((opt = internal_getopt (list, "fnv")) != -1)
++@@ -761,10 +763,10 @@ unset_builtin (list)
++ switch (opt)
++ {
++ case 'f':
++- unset_function = 1;
+++ global_unset_func = 1;
++ break;
++ case 'v':
++- unset_variable = 1;
+++ global_unset_var = 1;
++ break;
++ case 'n':
++ nameref = 1;
++@@ -777,7 +779,7 @@ unset_builtin (list)
++
++ list = loptend;
++
++- if (unset_function && unset_variable)
+++ if (global_unset_func && global_unset_var)
++ {
++ builtin_error (_("cannot simultaneously unset a function and a variable"));
++ return (EXECUTION_FAILURE);
++@@ -795,6 +797,9 @@ unset_builtin (list)
++
++ name = list->word->word;
++
+++ unset_function = global_unset_func;
+++ unset_variable = global_unset_var;
+++
++ #if defined (ARRAY_VARS)
++ unset_array = 0;
++ if (!unset_function && valid_array_reference (name))
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 33
+++#define PATCHLEVEL 34
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/135-upstream-bash43-035.patch b/feeds/packages/utils/bash/patches/135-upstream-bash43-035.patch
+new file mode 100644
+index 0000000..4e614ce
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/135-upstream-bash43-035.patch
+@@ -0,0 +1,48 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-035
++
++Bug-Reported-by: <romerox.adrian@gmail.com>
++Bug-Reference-ID: <CABV5r3zhPXmSKUe9uedeGc5YFBM2njJ1iVmY2h5neWdQpDBQug@mail.gmail.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-08/msg00045.html
++
++Bug-Description:
++
++A locale with a long name can trigger a buffer overflow and core dump. This
++applies on systems that do not have locale_charset in libc, are not using
++GNU libiconv, and are not using the libintl that ships with bash in lib/intl.
++
++Patch (apply with `patch -p0'):
++
++--- a/lib/sh/unicode.c
+++++ b/lib/sh/unicode.c
++@@ -78,13 +78,15 @@ stub_charset ()
++ s = strrchr (locale, '.');
++ if (s)
++ {
++- strcpy (charsetbuf, s+1);
+++ strncpy (charsetbuf, s+1, sizeof (charsetbuf) - 1);
+++ charsetbuf[sizeof (charsetbuf) - 1] = '\0';
++ t = strchr (charsetbuf, '@');
++ if (t)
++ *t = 0;
++ return charsetbuf;
++ }
++- strcpy (charsetbuf, locale);
+++ strncpy (charsetbuf, locale, sizeof (charsetbuf) - 1);
+++ charsetbuf[sizeof (charsetbuf) - 1] = '\0';
++ return charsetbuf;
++ }
++ #endif
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 34
+++#define PATCHLEVEL 35
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/136-upstream-bash43-036.patch b/feeds/packages/utils/bash/patches/136-upstream-bash43-036.patch
+new file mode 100644
+index 0000000..198b662
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/136-upstream-bash43-036.patch
+@@ -0,0 +1,48 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-036
++
++Bug-Reported-by: emanuelczirai@cryptolab.net
++Bug-Reference-ID: <f962e4f556da5ebfadaf7afe9c78a8cb@cryptolab.net>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-02/msg00071.html
++
++Bug-Description:
++
++When evaluating and setting integer variables, and the assignment fails to
++create a variable (for example, when performing an operation on an array
++variable with an invalid subscript), bash attempts to dereference a null
++pointer, causing a segmentation violation.
++
++Patch (apply with `patch -p0'):
++
++--- a/variables.c
+++++ b/variables.c
++@@ -2833,10 +2833,12 @@ bind_int_variable (lhs, rhs)
++ #endif
++ v = bind_variable (lhs, rhs, 0);
++
++- if (v && isint)
++- VSETATTR (v, att_integer);
++-
++- VUNSETATTR (v, att_invisible);
+++ if (v)
+++ {
+++ if (isint)
+++ VSETATTR (v, att_integer);
+++ VUNSETATTR (v, att_invisible);
+++ }
++
++ return (v);
++ }
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 35
+++#define PATCHLEVEL 36
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/137-upstream-bash43-037.patch b/feeds/packages/utils/bash/patches/137-upstream-bash43-037.patch
+new file mode 100644
+index 0000000..946e9fe
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/137-upstream-bash43-037.patch
+@@ -0,0 +1,38 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-037
++
++Bug-Reported-by: Greg Wooledge <wooledg@eeg.ccf.org>
++Bug-Reference-ID: <20150204144240.GN13956@eeg.ccf.org>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-02/msg00007.html
++
++Bug-Description:
++
++If an associative array uses `@' or `*' as a subscript, `declare -p' produces
++output that cannot be reused as input.
++
++Patch (apply with `patch -p0'):
++
++--- a/assoc.c
+++++ b/assoc.c
++@@ -436,6 +436,8 @@ assoc_to_assign (hash, quoted)
++ #if 1
++ if (sh_contains_shell_metas (tlist->key))
++ istr = sh_double_quote (tlist->key);
+++ else if (ALL_ELEMENT_SUB (tlist->key[0]) && tlist->key[1] == '\0')
+++ istr = sh_double_quote (tlist->key);
++ else
++ istr = tlist->key;
++ #else
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 36
+++#define PATCHLEVEL 37
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/138-upstream-bash43-038.patch b/feeds/packages/utils/bash/patches/138-upstream-bash43-038.patch
+new file mode 100644
+index 0000000..9857847
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/138-upstream-bash43-038.patch
+@@ -0,0 +1,67 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-038
++
++Bug-Reported-by: worley@alum.mit.edu (Dale R. Worley)
++Bug-Reference-ID: <201406100051.s5A0pCeB014978@hobgoblin.ariadne.com>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2014-06/msg00028.html
++
++Bug-Description:
++
++There are a number of instances where `time' is not recognized as a reserved
++word when the shell grammar says it should be.
++
++Patch (apply with `patch -p0'):
++
++--- a/parse.y
+++++ b/parse.y
++@@ -2818,11 +2818,16 @@ time_command_acceptable ()
++ case AND_AND:
++ case OR_OR:
++ case '&':
+++ case WHILE:
++ case DO:
+++ case UNTIL:
+++ case IF:
++ case THEN:
+++ case ELIF:
++ case ELSE:
++ case '{': /* } */
++- case '(': /* ) */
+++ case '(': /* )( */
+++ case ')': /* only valid in case statement */
++ case BANG: /* ! time pipeline */
++ case TIME: /* time time pipeline */
++ case TIMEOPT: /* time -p time pipeline */
++--- a/y.tab.c
+++++ b/y.tab.c
++@@ -5130,11 +5130,16 @@ time_command_acceptable ()
++ case AND_AND:
++ case OR_OR:
++ case '&':
+++ case WHILE:
++ case DO:
+++ case UNTIL:
+++ case IF:
++ case THEN:
+++ case ELIF:
++ case ELSE:
++ case '{': /* } */
++- case '(': /* ) */
+++ case '(': /* )( */
+++ case ')': /* only valid in case statement */
++ case BANG: /* ! time pipeline */
++ case TIME: /* time time pipeline */
++ case TIMEOPT: /* time -p time pipeline */
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 37
+++#define PATCHLEVEL 38
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/139-upstream-bash43-039.patch b/feeds/packages/utils/bash/patches/139-upstream-bash43-039.patch
+new file mode 100644
+index 0000000..f8ad363
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/139-upstream-bash43-039.patch
+@@ -0,0 +1,52 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-039
++
++Bug-Reported-by: SN <poczta-sn@gazeta.pl>
++Bug-Reference-ID: <54E2554C.205@gazeta.pl>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-02/msg00060.html
++
++Bug-Description:
++
++Using the output of `declare -p' when run in a function can result in variables
++that are invisible to `declare -p'. This problem occurs when an assignment
++builtin such as `declare' receives a quoted compound array assignment as one of
++its arguments.
++
++Patch (apply with `patch -p0'):
++
++--- a/arrayfunc.c
+++++ b/arrayfunc.c
++@@ -404,6 +404,9 @@ assign_array_var_from_word_list (var, li
++ (*var->assign_func) (var, l->word->word, i, 0);
++ else
++ array_insert (a, i, l->word->word);
+++
+++ VUNSETATTR (var, att_invisible); /* no longer invisible */
+++
++ return var;
++ }
++
++@@ -634,6 +637,10 @@ assign_array_var_from_string (var, value
++
++ if (nlist)
++ dispose_words (nlist);
+++
+++ if (var)
+++ VUNSETATTR (var, att_invisible); /* no longer invisible */
+++
++ return (var);
++ }
++
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 38
+++#define PATCHLEVEL 39
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/140-upstream-bash43-040.patch b/feeds/packages/utils/bash/patches/140-upstream-bash43-040.patch
+new file mode 100644
+index 0000000..a329d37
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/140-upstream-bash43-040.patch
+@@ -0,0 +1,38 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-040
++
++Bug-Reported-by: Jean Delvare <jdelvare@suse.de>
++Bug-Reference-ID: <20150609180231.5f463695@endymion.delvare>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-06/msg00033.html
++
++Bug-Description:
++
++There is a memory leak that occurs when bash expands an array reference on
++the rhs of an assignment statement.
++
++Patch (apply with `patch -p0'):
++
++--- a/subst.c
+++++ b/subst.c
++@@ -5782,7 +5782,7 @@ expand_arrayref:
++ /* XXX - does this leak if name[@] or name[*]? */
++ if (pflags & PF_ASSIGNRHS)
++ {
++- temp = array_variable_name (name, &tt, (int *)0);
+++ var = array_variable_part (name, &tt, (int *)0);
++ if (ALL_ELEMENT_SUB (tt[0]) && tt[1] == ']')
++ temp = array_value (name, quoted|Q_DOUBLE_QUOTES, 0, &atype, &ind);
++ else
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 39
+++#define PATCHLEVEL 40
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/141-upstream-bash43-041.patch b/feeds/packages/utils/bash/patches/141-upstream-bash43-041.patch
+new file mode 100644
+index 0000000..75fdace
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/141-upstream-bash43-041.patch
+@@ -0,0 +1,67 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-041
++
++Bug-Reported-by: Hanno Böck <hanno@hboeck.de>
++Bug-Reference-ID: <20150623131106.6f111da9@pc1>, <20150707004640.0e61d2f9@pc1>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-06/msg00089.html,
++ http://lists.gnu.org/archive/html/bug-bash/2015-07/msg00018.html
++
++Bug-Description:
++
++There are several out-of-bounds read errors that occur when completing command
++lines where assignment statements appear before the command name. The first
++two appear only when programmable completion is enabled; the last one only
++happens when listing possible completions.
++
++Patch (apply with `patch -p0'):
++
++--- a/bashline.c
+++++ b/bashline.c
++@@ -1468,10 +1468,23 @@ attempt_shell_completion (text, start, e
++
++ os = start;
++ n = 0;
+++ was_assignment = 0;
++ s = find_cmd_start (os);
++ e = find_cmd_end (end);
++ do
++ {
+++ /* Don't read past the end of rl_line_buffer */
+++ if (s > rl_end)
+++ {
+++ s1 = s = e1;
+++ break;
+++ }
+++ /* Or past point if point is within an assignment statement */
+++ else if (was_assignment && s > rl_point)
+++ {
+++ s1 = s = e1;
+++ break;
+++ }
++ /* Skip over assignment statements preceding a command name. If we
++ don't find a command name at all, we can perform command name
++ completion. If we find a partial command name, we should perform
++--- a/lib/readline/complete.c
+++++ b/lib/readline/complete.c
++@@ -689,6 +689,8 @@ printable_part (pathname)
++
++ if (temp == 0 || *temp == '\0')
++ return (pathname);
+++ else if (temp[1] == 0 && temp == pathname)
+++ return (pathname);
++ /* If the basename is NULL, we might have a pathname like '/usr/src/'.
++ Look for a previous slash and, if one is found, return the portion
++ following that slash. If there's no previous slash, just return the
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 40
+++#define PATCHLEVEL 41
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/142-upstream-bash43-042.patch b/feeds/packages/utils/bash/patches/142-upstream-bash43-042.patch
+new file mode 100644
+index 0000000..bf1546b
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/142-upstream-bash43-042.patch
+@@ -0,0 +1,50 @@
++ BASH PATCH REPORT
++ =================
++
++Bash-Release: 4.3
++Patch-ID: bash43-042
++
++Bug-Reported-by: Nathan Neulinger <nneul@neulinger.org>
++Bug-Reference-ID: <558EFDF2.7060402@neulinger.org>
++Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2015-06/msg00096.html
++
++Bug-Description:
++
++There is a problem when parsing command substitutions containing `case'
++commands within pipelines that causes the parser to not correctly identify
++the end of the command substitution.
++
++Patch (apply with `patch -p0'):
++
++--- a/parse.y
+++++ b/parse.y
++@@ -3708,6 +3708,8 @@ eof_error:
++ /*itrace("parse_comsub:%d: lex_inword -> 1 ch = `%c' (%d)", line_number, ch, __LINE__);*/
++ tflags |= LEX_INWORD;
++ lex_wlen = 0;
+++ if (tflags & LEX_RESWDOK)
+++ lex_rwlen = 0;
++ }
++ }
++
++--- a/y.tab.c
+++++ b/y.tab.c
++@@ -6020,6 +6020,8 @@ eof_error:
++ /*itrace("parse_comsub:%d: lex_inword -> 1 ch = `%c' (%d)", line_number, ch, __LINE__);*/
++ tflags |= LEX_INWORD;
++ lex_wlen = 0;
+++ if (tflags & LEX_RESWDOK)
+++ lex_rwlen = 0;
++ }
++ }
++
++--- a/patchlevel.h
+++++ b/patchlevel.h
++@@ -25,6 +25,6 @@
++ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
++ looks for to find the patch level (for the sccs version string). */
++
++-#define PATCHLEVEL 41
+++#define PATCHLEVEL 42
++
++ #endif /* _PATCHLEVEL_H_ */
+diff --git a/feeds/packages/utils/bash/patches/900-no_doc.patch b/feeds/packages/utils/bash/patches/900-no_doc.patch
+new file mode 100644
+index 0000000..3e7be42
+--- /dev/null
++++ b/feeds/packages/utils/bash/patches/900-no_doc.patch
+@@ -0,0 +1,13 @@
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -741,10 +741,8 @@ reconfig: force
++ # $(MAKE) -f $(srcdir)/Makefile $(MFLAGS) srcdir=$(srcdir)
++
++ doc documentation: force
++- @(cd $(DOCDIR) ; $(MAKE) $(MFLAGS) )
++
++ info dvi ps: force
++- @(cd $(DOCDIR) ; $(MAKE) $(MFLAGS) CFLAGS='$(CCFLAGS)' $@ )
++
++ force:
++
+diff --git a/feeds/packages/utils/bc/Makefile b/feeds/packages/utils/bc/Makefile
+new file mode 100644
+index 0000000..900fd3e
+--- /dev/null
++++ b/feeds/packages/utils/bc/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bc
++PKG_VERSION:=1.06.95
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).orig.tar.gz
++PKG_SOURCE_URL:=ftp://ftp.debian.org/debian/pool/main/b/bc
++PKG_MD5SUM:=24d0831812d8262b6cac8316b0bac483
++
++PKG_MAINTAINER:=Bruno Randolf <br1@einfach.org>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bc/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ URL:=http://packages.debian.org/bc
++endef
++
++define Package/bc
++ $(call Package/bc/Default)
++ TITLE:=Arbitrary precision calculator language
++ DEPENDS:=+libreadline +libncurses
++endef
++
++define Package/bc/description
++ bc is a language that supports arbitrary precision numbers with
++ interactive execution of statements.
++endef
++
++define Package/dc
++ $(call Package/bc/Default)
++ TITLE:=Arbitrary precision reverse-polish calculator
++ DEPENDS:=bc
++endef
++
++define Package/dc/description
++ dc is a reverse-polish desk calculator which supports unlimited
++ precision arithmetic.
++endef
++
++CONFIGURE_ARGS += --with-readline
++
++define Package/bc/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bc/bc $(1)/usr/bin/
++endef
++
++define Package/dc/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/dc/dc $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,bc))
++$(eval $(call BuildPackage,dc))
+diff --git a/feeds/packages/utils/bc/patches/001-disable-doc.patch b/feeds/packages/utils/bc/patches/001-disable-doc.patch
+new file mode 100644
+index 0000000..a6ecd6e
+--- /dev/null
++++ b/feeds/packages/utils/bc/patches/001-disable-doc.patch
+@@ -0,0 +1,21 @@
++--- bc-1.06.95/Makefile.in 2010-07-03 10:48:13.422725147 +0000
+++++ bc-1.06.95/Makefile.in 2010-07-03 10:50:09.714725197 +0000
++@@ -149,7 +149,7 @@
++ sharedstatedir = @sharedstatedir@
++ sysconfdir = @sysconfdir@
++ target_alias = @target_alias@
++-SUBDIRS = lib bc dc doc
+++SUBDIRS = lib bc dc
++ MAINTAINERCLEANFILES = aclocal.m4 config.h.in configure Makefile.in \
++ stamp-h $(distdir).tar.gz h/number.h depcomp missing
++
++--- bc-1.06.95/Makefile.am 2010-07-03 10:48:32.522725037 +0000
+++++ bc-1.06.95/Makefile.am 2010-07-03 10:48:38.114725024 +0000
++@@ -1,6 +1,6 @@
++ ## Process this file with automake to produce Makefile.in
++
++-SUBDIRS = lib bc dc doc
+++SUBDIRS = lib bc dc
++
++ MAINTAINERCLEANFILES = aclocal.m4 config.h.in configure Makefile.in \
++ stamp-h $(distdir).tar.gz h/number.h depcomp missing
+diff --git a/feeds/packages/utils/bluelog/Makefile b/feeds/packages/utils/bluelog/Makefile
+new file mode 100644
+index 0000000..2fe10d8
+--- /dev/null
++++ b/feeds/packages/utils/bluelog/Makefile
+@@ -0,0 +1,92 @@
++#
++# Copyright (C) 2012-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bluelog
++PKG_VERSION:=1.1.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=ftp://ftp.digifail.com/software/bluelog
++PKG_MD5SUM:=614d0fe65bae68acff1d33d9f86e4805
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bluelog/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Bluetooth scanner and logger
++ URL:=http://www.digifail.com/software/bluelog.shtml
++ DEPENDS:=+bluez-libs +kmod-bluetooth
++endef
++
++define Package/bluelog/Default/description
++ Bluelog is a simple Bluetooth scanner designed to tell you how many
++ discoverable devices there are in an area as quickly as possible. It is
++ intended to be used as a site survey tool, identifying the number of possible
++ Bluetooth targets there are in the surrounding environment.
++endef
++
++define Package/bluelog
++ $(call Package/bluelog/Default)
++endef
++
++define Package/bluelog/description
++ $(call Package/bluelog/Default/description)
++endef
++
++define Package/bluelog-live
++ $(call Package/bluelog/Default)
++ TITLE+= (live output)
++ DEPENDS+= bluelog
++endef
++
++define Package/bluelog-live/description
++ $(call Package/bluelog/Default/description)
++ This package contains the files for "Bluelog Live", an optional mode of
++ Bluelog which creates a real-time webpage of discovered Bluetooth devices.
++endef
++
++TARGET_CFLAGS += -DOPENWRT
++
++MAKE_FLAGS += \
++ LIBS="$(TARGET_LDFLAGS) -lbluetooth -lm"
++
++define Package/bluelog/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/bluelog $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/bluelog.init $(1)/etc/init.d/bluelog
++endef
++
++define Package/bluelog-live/install
++ $(INSTALL_DIR) $(1)/www/bluelog
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/bluelog/*.html $(1)/www/bluelog/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/share/bluelog/openwrt.css \
++ $(1)/www/bluelog/style.css
++ $(INSTALL_DIR) $(1)/www/bluelog/images
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/share/bluelog/images/digifail_logo.png \
++ $(PKG_INSTALL_DIR)/usr/share/bluelog/images/email.png \
++ $(PKG_INSTALL_DIR)/usr/share/bluelog/images/favicon.png \
++ $(PKG_INSTALL_DIR)/usr/share/bluelog/images/openwrt_logo.png \
++ $(PKG_INSTALL_DIR)/usr/share/bluelog/images/qrcontact.png \
++ $(1)/www/bluelog/images/
++ $(INSTALL_DIR) $(1)/www/cgi-bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/bluelog/cgi-bin/* $(1)/www/cgi-bin/
++endef
++
++$(eval $(call BuildPackage,bluelog))
++$(eval $(call BuildPackage,bluelog-live))
+diff --git a/feeds/packages/utils/bluelog/files/bluelog.init b/feeds/packages/utils/bluelog/files/bluelog.init
+new file mode 100644
+index 0000000..efae288
+--- /dev/null
++++ b/feeds/packages/utils/bluelog/files/bluelog.init
+@@ -0,0 +1,13 @@
++#!/bin/sh /etc/rc.common
++
++START=65
++
++SERVICE_DAEMONIZE=1
++
++start() {
++ service_start /usr/bin/bluelog
++}
++
++stop() {
++ service_stop /usr/bin/bluelog
++}
+diff --git a/feeds/packages/utils/bluez/Makefile b/feeds/packages/utils/bluez/Makefile
+new file mode 100644
+index 0000000..e7b5048
+--- /dev/null
++++ b/feeds/packages/utils/bluez/Makefile
+@@ -0,0 +1,159 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bluez
++PKG_VERSION:=5.33
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@KERNEL/linux/bluetooth/
++PKG_MD5SUM:=78782dc33d9a8b6344c4cc1af70c8a98
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/bluez/Default
++ TITLE:=Bluetooth
++ URL:=http://www.bluez.org/
++endef
++
++define Package/bluez-examples
++$(call Package/bluez/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= python example apps
++ DEPENDS:=+python
++endef
++
++define Package/bluez-examples/description
++ contains many examples apps for bluetooth, requiring python
++endef
++
++define Package/bluez-libs
++$(call Package/bluez/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= library
++ DEPENDS:=+libpthread +kmod-bluetooth
++endef
++
++define Package/bluez-utils
++$(call Package/bluez/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= utilities
++ DEPENDS:=+bluez-libs +libpthread +librt +glib2 +libncurses +libreadline $(INTL_DEPENDS) $(ICONV_DEPENDS)
++endef
++
++define Package/bluez-daemon
++$(call Package/bluez/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= daemon
++ DEPENDS:=+bluez-libs +bluez-utils +dbus +libical $(INTL_DEPENDS) $(ICONV_DEPENDS)
++endef
++
++define Package/bluez-daemon/conffiles
++/etc/bluetooth/main.conf
++/etc/bluetooth/network.conf
++/etc/bluetooth/input.conf
++/etc/bluetooth/proximity.conf
++/etc/config/bluetooth
++endef
++
++CONFIGURE_ARGS += \
++ --enable-static \
++ --enable-shared \
++ --enable-client \
++ --enable-datafiles \
++ --enable-experimental \
++ --enable-library \
++ --enable-monitor \
++ --enable-obex \
++ --enable-threads \
++ --enable-tools \
++ --disable-android \
++ --disable-cups \
++ --disable-manpages \
++ --disable-sixaxis \
++ --disable-systemd \
++ --disable-test \
++ --disable-udev \
++
++TARGET_CPPFLAGS += \
++ -D_GNU_SOURCE
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/bluetooth $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libbluetooth.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/bluez.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/bluez-examples/install
++ $(INSTALL_DIR) $(1)/usr/bin/bluez
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/test/* $(1)/usr/bin/bluez/
++endef
++
++define Package/bluez-libs/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libbluetooth.so.* $(1)/usr/lib/
++endef
++
++define Package/bluez-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/bccmd $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/bluemoon $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/btmon $(1)/usr/bin/
++ $(CP) $(PKG_BUILD_DIR)/tools/btmgmt $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/ciptool $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/hciattach $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/hciconfig $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/hcidump $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/hcitool $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/hex2hcd $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/l2ping $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/l2test $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/rctest $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/rfcomm $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/sdptool $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/attrib/gatttool $(1)/usr/bin/
++endef
++
++define Package/bluez-daemon/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/bluetooth/bluetoothd $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/bluetoothctl $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/bluetooth/obexd $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/bluetooth.config $(1)/etc/config/bluetooth
++ $(INSTALL_DIR) $(1)/etc/dbus-1/system.d/
++ $(INSTALL_DATA) ./files/bluetooth.dbus $(1)/etc/dbus-1/system.d/bluetooth.conf
++ $(INSTALL_DIR) $(1)/etc/bluetooth
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/main.conf $(1)/etc/bluetooth/main.conf
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/profiles/network/network.conf $(1)/etc/bluetooth/network.conf
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/profiles/input/input.conf $(1)/etc/bluetooth/input.conf
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/profiles/proximity/proximity.conf $(1)/etc/bluetooth/proximity.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/bluetoothd.init $(1)/etc/init.d/bluetoothd
++endef
++
++$(eval $(call BuildPackage,bluez-examples))
++$(eval $(call BuildPackage,bluez-libs))
++$(eval $(call BuildPackage,bluez-utils))
++$(eval $(call BuildPackage,bluez-daemon))
+diff --git a/feeds/packages/utils/bluez/files/bluetooth.config b/feeds/packages/utils/bluez/files/bluetooth.config
+new file mode 100644
+index 0000000..6f23617
+--- /dev/null
++++ b/feeds/packages/utils/bluez/files/bluetooth.config
+@@ -0,0 +1,15 @@
++config bluetoothd
++# option config /etc/bluetooth/main.conf
++ option enabled 1
++
++config hciattach
++ option initspeed 115200
++ option tty ttyS1
++ option type csr
++ option speed 115200
++ option flow noflow
++ option enabled 0
++
++config rfcomm
++# option config /etc/bluetooth/rfcomm.conf
++ option enabled 0
+diff --git a/feeds/packages/utils/bluez/files/bluetooth.dbus b/feeds/packages/utils/bluez/files/bluetooth.dbus
+new file mode 100644
+index 0000000..88545fa
+--- /dev/null
++++ b/feeds/packages/utils/bluez/files/bluetooth.dbus
+@@ -0,0 +1,37 @@
++<!-- This configuration file specifies the required security policies
++ for Bluetooth core daemon to work. -->
++
++<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
++ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
++<busconfig>
++
++ <!-- ../system.conf have denied everything, so we just punch some holes -->
++
++ <policy user="root">
++ <allow own="org.bluez"/>
++ </policy>
++
++ <policy at_console="true">
++ <allow send_path="/"/>
++ <allow send_path="/org/bluez"/>
++
++ <allow send_destination="org.bluez.Manager"/>
++ <allow receive_sender="org.bluez.Manager"/>
++
++ <allow send_destination="org.bluez.Adapter"/>
++ <allow receive_sender="org.bluez.Adapter"/>
++
++ <allow send_destination="org.bluez.Device"/>
++ <allow receive_sender="org.bluez.Device"/>
++
++ <allow send_destination="org.bluez.Service"/>
++ <allow receive_sender="org.bluez.Service"/>
++
++ <allow send_destination="org.bluez.Database"/>
++ <allow receive_sender="org.bluez.Database"/>
++
++ <allow send_destination="org.bluez.Security"/>
++ <allow receive_sender="org.bluez.Security"/>
++ </policy>
++
++</busconfig>
+diff --git a/feeds/packages/utils/bluez/files/bluetoothd.init b/feeds/packages/utils/bluez/files/bluetoothd.init
+new file mode 100644
+index 0000000..75f4d96
+--- /dev/null
++++ b/feeds/packages/utils/bluez/files/bluetoothd.init
+@@ -0,0 +1,13 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007 OpenWrt.org
++
++#start after dbus (60)
++START=62
++USE_PROCD=1
++PROG=/usr/bin/bluetoothd
++
++start_service() {
++ procd_open_instance
++ procd_set_param command "$PROG" -n
++ procd_close_instance
++}
+diff --git a/feeds/packages/utils/bluez/files/givepin b/feeds/packages/utils/bluez/files/givepin
+new file mode 100644
+index 0000000..e52a338
+--- /dev/null
++++ b/feeds/packages/utils/bluez/files/givepin
+@@ -0,0 +1,14 @@
++#!/bin/sh
++
++# Write bluetooth PIN number here:
++pin=
++
++if [ -z "$pin" ]; then
++ msg="Set bluetooth PIN in file $0"
++ logger -p user.err "$msg"
++ for i in /dev/pts/* ; do
++ [ -w $i ] && echo "$msg" > $i
++ done
++else
++ echo "PIN:$pin"
++fi
+diff --git a/feeds/packages/utils/bluez/patches/200-uart-speed.patch b/feeds/packages/utils/bluez/patches/200-uart-speed.patch
+new file mode 100644
+index 0000000..ebe0153
+--- /dev/null
++++ b/feeds/packages/utils/bluez/patches/200-uart-speed.patch
+@@ -0,0 +1,40 @@
++--- a/tools/hciattach.c
+++++ b/tools/hciattach.c
++@@ -101,20 +101,37 @@ int uart_speed(int s)
++ return B230400;
++ case 460800:
++ return B460800;
+++/* FIX: Not all platform support this high serial speed
+++ claudyus84 @gamil.com
+++*/
+++#ifdef B500000
++ case 500000:
++ return B500000;
+++#endif
+++#ifdef B576000
++ case 576000:
++ return B576000;
+++#endif
+++#ifdef B921600
++ case 921600:
++ return B921600;
+++#endif
+++#ifdef B1000000
++ case 1000000:
++ return B1000000;
+++#endif
+++#ifdef B1152000
++ case 1152000:
++ return B1152000;
+++#endif
+++#ifdef B1500000
++ case 1500000:
++ return B1500000;
+++#endif
+++#ifdef B2000000
++ case 2000000:
++ return B2000000;
+++#endif
++ #ifdef B2500000
++ case 2500000:
++ return B2500000;
+diff --git a/feeds/packages/utils/bluez/patches/201-readline.patch b/feeds/packages/utils/bluez/patches/201-readline.patch
+new file mode 100644
+index 0000000..3d6ffae
+--- /dev/null
++++ b/feeds/packages/utils/bluez/patches/201-readline.patch
+@@ -0,0 +1,48 @@
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -2405,7 +2405,7 @@ unit_tests = $(am__append_32) unit/test-
++ @CLIENT_TRUE@ monitor/uuid.h monitor/uuid.c
++
++ @CLIENT_TRUE@client_bluetoothctl_LDADD = gdbus/libgdbus-internal.la @GLIB_LIBS@ @DBUS_LIBS@ \
++-@CLIENT_TRUE@ -lreadline
+++@CLIENT_TRUE@ -lreadline -lncurses
++
++ @MONITOR_TRUE@monitor_btmon_SOURCES = monitor/main.c monitor/bt.h \
++ @MONITOR_TRUE@ monitor/display.h monitor/display.c \
++@@ -2651,13 +2651,13 @@ unit_tests = $(am__append_32) unit/test-
++ @READLINE_TRUE@ client/display.h
++
++ @READLINE_TRUE@attrib_gatttool_LDADD = lib/libbluetooth-internal.la \
++-@READLINE_TRUE@ src/libshared-glib.la @GLIB_LIBS@ -lreadline
+++@READLINE_TRUE@ src/libshared-glib.la @GLIB_LIBS@ -lreadline -lncurses
++
++ @READLINE_TRUE@tools_obex_client_tool_SOURCES = $(gobex_sources) $(btio_sources) \
++ @READLINE_TRUE@ tools/obex-client-tool.c
++
++ @READLINE_TRUE@tools_obex_client_tool_LDADD = lib/libbluetooth-internal.la \
++-@READLINE_TRUE@ @GLIB_LIBS@ -lreadline
+++@READLINE_TRUE@ @GLIB_LIBS@ -lreadline -lncurses
++
++ @READLINE_TRUE@tools_obex_server_tool_SOURCES = $(gobex_sources) $(btio_sources) \
++ @READLINE_TRUE@ tools/obex-server-tool.c
++@@ -2667,17 +2667,17 @@ unit_tests = $(am__append_32) unit/test-
++ @READLINE_TRUE@ client/display.h client/display.c
++
++ @READLINE_TRUE@tools_bluetooth_player_LDADD = gdbus/libgdbus-internal.la \
++-@READLINE_TRUE@ @GLIB_LIBS@ @DBUS_LIBS@ -lreadline
+++@READLINE_TRUE@ @GLIB_LIBS@ @DBUS_LIBS@ -lreadline -lncurses
++
++ @READLINE_TRUE@tools_obexctl_SOURCES = tools/obexctl.c \
++ @READLINE_TRUE@ client/display.h client/display.c
++
++ @READLINE_TRUE@tools_obexctl_LDADD = gdbus/libgdbus-internal.la \
++-@READLINE_TRUE@ @GLIB_LIBS@ @DBUS_LIBS@ -lreadline
+++@READLINE_TRUE@ @GLIB_LIBS@ @DBUS_LIBS@ -lreadline -lncurses
++
++ @READLINE_TRUE@tools_btmgmt_SOURCES = tools/btmgmt.c src/uuid-helper.c client/display.c
++ @READLINE_TRUE@tools_btmgmt_LDADD = lib/libbluetooth-internal.la src/libshared-mainloop.la \
++-@READLINE_TRUE@ -lreadline
+++@READLINE_TRUE@ -lreadline -lncurses
++
++ @EXPERIMENTAL_TRUE@tools_gatt_service_SOURCES = tools/gatt-service.c
++ @EXPERIMENTAL_TRUE@tools_gatt_service_LDADD = @GLIB_LIBS@ @DBUS_LIBS@ gdbus/libgdbus-internal.la
+diff --git a/feeds/packages/utils/btrfs-progs/Makefile b/feeds/packages/utils/btrfs-progs/Makefile
+new file mode 100644
+index 0000000..12513e1
+--- /dev/null
++++ b/feeds/packages/utils/btrfs-progs/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=btrfs-progs
++PKG_VERSION:=3.19.1
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@KERNEL/linux/kernel/people/kdave/btrfs-progs/
++PKG_MD5SUM:=ec3b3c99df18633ddc9e41f0680c5a51
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-v$(PKG_VERSION)
++
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++PKG_BUILD_DEPENDS:=libacl
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/btrfs-progs
++ SECTION:=utils
++ CATEGORY:=Utilities
++ SUBMENU:=Filesystem
++ DEPENDS:=+libattr +libuuid +zlib +libblkid +liblzo +libpthread
++ TITLE:=Btrfs filesystems utilities
++ URL:=http://btrfs.wiki.kernel.org/
++endef
++
++define Package/btrfs-progs/description
++ Btrfs is a new copy on write filesystem for Linux aimed at implementing
++ advanced features while focusing on fault tolerance, repair and easy
++ administration. Initially developed by Oracle, Btrfs is licensed under the
++ GPL and open for contribution from anyone.
++endef
++
++progs = btrfs btrfs-debug-tree btrfs-find-root btrfs-image btrfs-map-logical \
++ btrfs-show-super btrfstune btrfs-zero-log fsck.btrfs mkfs.btrfs
++
++CONFIGURE_ARGS += \
++ --disable-backtrace \
++ --disable-convert \
++ --disable-documentation
++
++define Package/btrfs-progs/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/libbtrfs.so* $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(addprefix $(PKG_INSTALL_DIR)/usr/bin/, $(progs)) $(1)/usr/bin/
++ $(LN) btrfs $(1)/usr/bin/btrfsck
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/btrfs-scan.init $(1)/etc/init.d/btrfs-scan
++endef
++
++$(eval $(call BuildPackage,btrfs-progs))
+diff --git a/feeds/packages/utils/btrfs-progs/files/btrfs-scan.init b/feeds/packages/utils/btrfs-progs/files/btrfs-scan.init
+new file mode 100644
+index 0000000..762e0b8
+--- /dev/null
++++ b/feeds/packages/utils/btrfs-progs/files/btrfs-scan.init
+@@ -0,0 +1,9 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=19
++
++start() {
++ grep -q btrfs /proc/filesystems && /usr/bin/btrfs device scan
++}
++
+diff --git a/feeds/packages/utils/btrfs-progs/patches/001-fix-xattr-h-include-location.patch b/feeds/packages/utils/btrfs-progs/patches/001-fix-xattr-h-include-location.patch
+new file mode 100644
+index 0000000..aff5585
+--- /dev/null
++++ b/feeds/packages/utils/btrfs-progs/patches/001-fix-xattr-h-include-location.patch
+@@ -0,0 +1,79 @@
++Index: btrfs-progs-v3.19.1/mkfs.c
++===================================================================
++--- btrfs-progs-v3.19.1.orig/mkfs.c
+++++ btrfs-progs-v3.19.1/mkfs.c
++@@ -31,7 +31,7 @@
++ #include <getopt.h>
++ #include <uuid/uuid.h>
++ #include <ctype.h>
++-#include <sys/xattr.h>
+++#include <attr/xattr.h>
++ #include <limits.h>
++ #include <linux/limits.h>
++ #include <blkid/blkid.h>
++Index: btrfs-progs-v3.19.1/props.c
++===================================================================
++--- btrfs-progs-v3.19.1.orig/props.c
+++++ btrfs-progs-v3.19.1/props.c
++@@ -17,7 +17,7 @@
++ #include <sys/stat.h>
++ #include <sys/ioctl.h>
++ #include <sys/types.h>
++-#include <sys/xattr.h>
+++#include <attr/xattr.h>
++ #include <fcntl.h>
++ #include <unistd.h>
++
++Index: btrfs-progs-v3.19.1/cmds-receive.c
++===================================================================
++--- btrfs-progs-v3.19.1.orig/cmds-receive.c
+++++ btrfs-progs-v3.19.1/cmds-receive.c
++@@ -34,7 +34,7 @@
++ #include <sys/ioctl.h>
++ #include <sys/time.h>
++ #include <sys/types.h>
++-#include <sys/xattr.h>
+++#include <attr/xattr.h>
++ #include <uuid/uuid.h>
++
++ #include "ctree.h"
++Index: btrfs-progs-v3.19.1/cmds-restore.c
++===================================================================
++--- btrfs-progs-v3.19.1.orig/cmds-restore.c
+++++ btrfs-progs-v3.19.1/cmds-restore.c
++@@ -32,7 +32,7 @@
++ #include <regex.h>
++ #include <getopt.h>
++ #include <sys/types.h>
++-#include <sys/xattr.h>
+++#include <attr/xattr.h>
++
++ #include "ctree.h"
++ #include "disk-io.h"
++Index: btrfs-progs-v3.19.1/Makefile.in
++===================================================================
++--- btrfs-progs-v3.19.1.orig/Makefile.in
+++++ btrfs-progs-v3.19.1/Makefile.in
++@@ -21,7 +21,7 @@ CFLAGS = @CFLAGS@ \
++ LDFLAGS = @LDFLAGS@ \
++ -rdynamic
++
++-LIBS = @UUID_LIBS@ @BLKID_LIBS@ @ZLIB_LIBS@ @LZO2_LIBS@ -L. -pthread
+++LIBS = @ATTR_LIBS@ @UUID_LIBS@ @BLKID_LIBS@ @ZLIB_LIBS@ @LZO2_LIBS@ -L. -pthread
++ LIBBTRFS_LIBS = $(LIBS)
++
++ # Static compilation flags
++Index: btrfs-progs-v3.19.1/configure.ac
++===================================================================
++--- btrfs-progs-v3.19.1.orig/configure.ac
+++++ btrfs-progs-v3.19.1/configure.ac
++@@ -115,6 +115,9 @@ dnl
++ dnl The default PKG_CHECK_MODULES() action-if-not-found is end the
++ dnl execution with error. The static libs are optional.
++
+++PKG_CHECK_MODULES(ATTR, [libattr])
+++PKG_STATIC(BLKID_LIBS_STATIC, [libattr])
+++
++ PKG_CHECK_MODULES(BLKID, [blkid])
++ PKG_STATIC(BLKID_LIBS_STATIC, [blkid])
++
+diff --git a/feeds/packages/utils/canutils/Makefile b/feeds/packages/utils/canutils/Makefile
+new file mode 100644
+index 0000000..58ae762
+--- /dev/null
++++ b/feeds/packages/utils/canutils/Makefile
+@@ -0,0 +1,116 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=canutils
++PKG_RELEASE=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/linux-can/can-utils
++PKG_SOURCE_VERSION:=0e3ff3b3157e456d4b6343f5d4b42ef692bce538
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION)
++
++PKG_MAINTAINER:=Anton Glukhov <anton.a.glukhov@gmail.com>
++PKG_LICENSE:=GPL-2.0+
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++FILES:=canbusload can-calc-bit-timing candump \
++ cangen cangw canplayer cansniffer cansend
++
++define Package/canutils/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ URL:=https://github.com/linux-can/can-utils
++ TITLE:=CAN userspace utilities and tools
++endef
++
++define Package/canutils
++ $(call Package/canutils/Default)
++ MENU:=1
++endef
++
++define Package/canutils-log-conversion
++ $(call Package/canutils/Default)
++ TITLE:=canutils log conversion
++ DEPENDS:=canutils
++endef
++
++define PartGen
++define Package/canutils-$(1)
++ $(call Package/canutils/Default)
++ TITLE:=$(1) tool from canutils
++ DEPENDS:=canutils
++endef
++endef
++
++$(foreach file,$(FILES),$(eval $(call PartGen,$(file))))
++
++define Package/canutils/install
++endef
++
++define Package/canutils-log-conversion/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/asc2log $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/log2asc $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/log2long $(1)/usr/bin/
++endef
++
++define PartInstall
++define Package/canutils-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/bin
++ $(INSTALL_BIN) \
++ $(PKG_BUILD_DIR)/$(1) \
++ $$(1)/usr/bin/
++endef
++endef
++
++define Package/canutils-log-conversion/description
++asc2log - convert ASC logfile to compact CAN frame logfile.
++log2asc - convert compact CAN frame logfile to ASC logfile.
++log2long - convert compact CAN frame representation into user readable.
++endef
++
++define Package/canutils-canbusload/description
++canbusload - display the load percentage of can buses.
++endef
++
++define Package/canutils-can-calc-bit-timing/description
++can-calc-bit-timing - calculate hw bittiming for supported can chips.
++endef
++
++define Package/canutils-candump/description
++candump - dumps can frames to terminal, logfile or another can device,
++with optional filtering.
++endef
++
++define Package/canutils-cangen/description
++cangen - CAN frames generator for testing purposes.
++endef
++
++define Package/canutils-cangw/description
++cangw - manage PF_CAN netlink gateway.
++endef
++
++define Package/canutils-canplayer/description
++canplayer - replay a compact CAN frame logfile to CAN devices.
++endef
++
++define Package/canutils-cansend/description
++cansend - simple command line tool to send CAN-frames via CAN_RAW sockets.
++endef
++
++$(foreach file,$(FILES),$(eval $(call PartInstall,$(file))))
++
++$(eval $(call BuildPackage,canutils))
++$(eval $(call BuildPackage,canutils-log-conversion))
++$(foreach file,$(FILES),$(eval $(call BuildPackage,canutils-$(file))))
+diff --git a/feeds/packages/utils/ccid/Makefile b/feeds/packages/utils/ccid/Makefile
+new file mode 100644
+index 0000000..67d6703
+--- /dev/null
++++ b/feeds/packages/utils/ccid/Makefile
+@@ -0,0 +1,52 @@
++#
++# Copyright (C) 2009-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ccid
++PKG_VERSION:=1.4.20
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://alioth.debian.org/frs/download.php/file/4140
++PKG_MD5SUM:=a73c203cfe27e684850df73630065738
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=libtool
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ccid
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libusb-1.0 +libpcsclite
++ TITLE:=Generic USB CCID smart card reader driver
++ URL:=http://pcsclite.alioth.debian.org/ccid.html
++endef
++
++define Package/ccid/description
++ Generic USB CCID (Chip/Smart Card Interface Devices) driver and ICCD
++ (Integrated Circuit(s) Card Devices).
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++TARGET_LDFLAGS += "-lpthread"
++
++CONFIGURE_ARGS += \
++ --enable-embedded \
++ --enable-usbdropdir=/usr/lib/pcsc/drivers
++
++define Package/ccid/install
++ $(INSTALL_DIR) $(1)/usr/lib/pcsc
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pcsc/drivers $(1)/usr/lib/pcsc/
++endef
++
++$(eval $(call BuildPackage,ccid))
+diff --git a/feeds/packages/utils/ccrypt/Makefile b/feeds/packages/utils/ccrypt/Makefile
+new file mode 100644
+index 0000000..2419ab7
+--- /dev/null
++++ b/feeds/packages/utils/ccrypt/Makefile
+@@ -0,0 +1,39 @@
++#
++# Copyright (C) 2009-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ccrypt
++PKG_VERSION:=1.10
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/ccrypt
++PKG_MD5SUM:=44ddd763465c254df83f5d38851d04d7
++PKG_MAINTAINER:=Hannu Nyman <hannu.nyman@iki.fi>
++PKG_LICENSE:=GPLv2+
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ccrypt
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=ccrypt is a utility for encrypting and decrypting files and streams
++ URL:=http://ccrypt.sourceforge.net/
++endef
++
++define Package/ccrypt/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ccrypt $(1)/usr/bin/
++ ln -s ccrypt $(1)/usr/bin/ccencrypt
++ ln -s ccrypt $(1)/usr/bin/ccdecrypt
++ ln -s ccrypt $(1)/usr/bin/ccat
++endef
++
++$(eval $(call BuildPackage,ccrypt))
+diff --git a/feeds/packages/utils/ccrypt/patches/001-no-intl.patch b/feeds/packages/utils/ccrypt/patches/001-no-intl.patch
+new file mode 100644
+index 0000000..4ac9abb
+--- /dev/null
++++ b/feeds/packages/utils/ccrypt/patches/001-no-intl.patch
+@@ -0,0 +1,89 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -123,17 +123,6 @@ AC_MSG_RESULT($UINT32_TYPE)
++ AC_DEFINE_UNQUOTED(UINT32_TYPE,$UINT32_TYPE,unsigned 32 bit integer type)
++
++ dnl ----------------------------------------------------------------------
++-dnl Internationalization
++-
++-GETTEXT_PACKAGE=ccrypt
++-AC_SUBST(GETTEXT_PACKAGE)
++-AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Package name for gettext])
++-
++-AM_GNU_GETTEXT
++-AM_GNU_GETTEXT_VERSION([0.14.3])
++-IT_PO_SUBDIR(po)
++-
++-dnl ----------------------------------------------------------------------
++ dnl Libtool (needed by intl/)
++
++ LT_INIT
++@@ -153,9 +142,7 @@ AC_SUBST(TAR)
++ dnl ----------------------------------------------------------------------
++ AC_CONFIG_FILES([doc/ccrypt.1
++ doc/ccguess.1
++- po/Makefile.in
++ m4/Makefile
++- intl/Makefile
++ Makefile
++ src/Makefile
++ emacs/Makefile
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -4,7 +4,7 @@
++
++ ## Process this file with automake to produce Makefile.in
++
++-SUBDIRS = m4 po intl src emacs doc check
+++SUBDIRS = m4 src emacs doc check
++
++ EXTRA_DIST = m4/ChangeLog config.rpath README-WIN
++
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -36,7 +36,7 @@ host_triplet = @host@
++ subdir = .
++ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
++ $(srcdir)/Makefile.in $(srcdir)/config.h.in \
++- $(top_srcdir)/configure $(top_srcdir)/intl/Makefile.in \
+++ $(top_srcdir)/configure \
++ ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS config.guess \
++ config.rpath config.sub depcomp elisp-comp install-sh \
++ ltmain.sh missing mkinstalldirs
++@@ -66,7 +66,7 @@ am__CONFIG_DISTCLEAN_FILES = config.stat
++ configure.lineno config.status.lineno
++ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
++ CONFIG_HEADER = config.h
++-CONFIG_CLEAN_FILES = intl/Makefile
+++CONFIG_CLEAN_FILES =
++ CONFIG_CLEAN_VPATH_FILES =
++ SOURCES =
++ DIST_SOURCES =
++@@ -277,7 +277,7 @@ target_alias = @target_alias@
++ top_build_prefix = @top_build_prefix@
++ top_builddir = @top_builddir@
++ top_srcdir = @top_srcdir@
++-SUBDIRS = m4 po intl src emacs doc check
+++SUBDIRS = m4 src emacs doc check
++ EXTRA_DIST = m4/ChangeLog config.rpath README-WIN
++ ACLOCAL_AMFLAGS = -I m4
++ all: config.h
++--- a/src/Makefile.am
+++++ b/src/Makefile.am
++@@ -56,4 +56,4 @@ uninstall-local:
++ # internationalization stuff
++ localedir = $(datadir)/locale
++ INCLUDES = -I../intl -I$(top_srcdir)/intl -DLOCALEDIR=\"$(localedir)\"
++-LIBS = @LIBINTL@ @LIBS@
+++LIBS = @LIBS@
++--- a/src/Makefile.in
+++++ b/src/Makefile.in
++@@ -159,7 +159,7 @@ LDFLAGS = @LDFLAGS@
++ LIBICONV = @LIBICONV@
++ LIBINTL = @LIBINTL@
++ LIBOBJS = @LIBOBJS@
++-LIBS = @LIBINTL@ @LIBS@
+++LIBS = @LIBS@
++ LIBTOOL = @LIBTOOL@
++ LIPO = @LIPO@
++ LN_S = @LN_S@
+diff --git a/feeds/packages/utils/cmdpad/Makefile b/feeds/packages/utils/cmdpad/Makefile
+new file mode 100644
+index 0000000..5b9f52d
+--- /dev/null
++++ b/feeds/packages/utils/cmdpad/Makefile
+@@ -0,0 +1,61 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=cmdpad
++PKG_VERSION:=0.0.3
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=@SF/cmdpad
++PKG_MD5SUM:=6633b2354b7f23f9cd8e2bfb6e735965
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=doc/COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/cmdpad
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=execute commands when a key is pressed, released or hold down
++ URL:=http://cmdpad.sourceforge.net/index.php
++endef
++
++CONFIGURE_ARGS += \
++ --enable-static \
++ --enable-shared
++
++define Package/cmdpad/description
++ cmdpad - execute commands when a key is pressed, released or hold down.
++ Should be started from /etc/rc or /etc/rc.local. To run it as deamon you
++ need to start it with '&'. All logs are printed to standard out and standard
++ error (to write the log to disk use cmdpad > /var/log/cmdpad). Cmdpad
++ searches for /etc/cmdpad.conf and load the key bindings. Then wait for
++ key event and check each command to see if it should be run.
++endef
++
++MAKE_FLAGS += \
++ $(TARGET_CONFIGURE_OPTS) \
++ $(1)
++
++define Package/cmdpad/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/cmdpad $(1)/usr/sbin/
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/src/cmdpad.conf $(1)/etc/
++ $(INSTALL_BIN) ./files/cmdpad.init $(1)/etc/init.d/cmdpad
++endef
++
++define Package/cmdpad/conffiles
++/etc/cmdpad.conf
++endef
++
++$(eval $(call BuildPackage,cmdpad))
+diff --git a/feeds/packages/utils/cmdpad/files/cmdpad.init b/feeds/packages/utils/cmdpad/files/cmdpad.init
+new file mode 100644
+index 0000000..f612033
+--- /dev/null
++++ b/feeds/packages/utils/cmdpad/files/cmdpad.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007-2011 OpenWrt.org
++
++START=93
++
++SSD_DAEMONIZE=1
++
++start() {
++ service_start /usr/sbin/cmdpad --quiet
++}
++
++stop() {
++ service_stop /usr/sbin/cmdpad
++}
+diff --git a/feeds/packages/utils/cmdpad/patches/100-Makefile.patch b/feeds/packages/utils/cmdpad/patches/100-Makefile.patch
+new file mode 100644
+index 0000000..61a6c8f
+--- /dev/null
++++ b/feeds/packages/utils/cmdpad/patches/100-Makefile.patch
+@@ -0,0 +1,35 @@
++--- cmdpad-0.0.3/src/Makefile.orig 2008-01-05 23:29:44.000000000 +0100
+++++ cmdpad-0.0.3/src/Makefile 2008-01-05 23:30:23.000000000 +0100
++@@ -5,25 +5,25 @@
++ TOP=..
++ include $(TOP)/Makefile.common
++
++-INCLUDE= -I/usr/include
++-LIBS= -L/usr/lib -lc
++-CFLAGS= -g3
++-LDFLAGS= -Xlinker -Map -Xlinker $(PROG).map #,--stack,16Mb
+++#INCLUDE= -I/usr/include
+++#LIBS= -L/usr/lib -lc
+++#CFLAGS= -g3
+++#LDFLAGS= -Xlinker -Map -Xlinker $(PROG).map #,--stack,16Mb
++ OBJ= main.o command.o parse.o
++ SCRIPTS= *.sh
++
++ build: $(PROG)
++
++ $(PROG): $(OBJ)
++- gcc -o $(PROG) $(OBJ) $(LIBS) $(LDFLAGS)
+++ $(GCC) -o $(PROG) $(OBJ) $(LIBS) $(LDFLAGS)
++ @echo "==============================================="
++ @echo "edit $(PROG).conf file to set default preferences"
++
++ %.o : %.c
++- gcc $(CFLAGS) -D__COPYLEFT__='$(COPYLEFT)' -c $<
+++ $(GCC) $(CFLAGS) -D__COPYLEFT__='$(COPYLEFT)' -c $<
++
++ %.o : %.c %.h
++- gcc $(CFLAGS) -D__COPYLEFT__='$(COPYLEFT)' -c $<
+++ $(GCC) $(CFLAGS) -D__COPYLEFT__='$(COPYLEFT)' -c $<
++
++ distclean clean:
++ rm $(PROG) *~ *.o -vf
+diff --git a/feeds/packages/utils/cmdpad/patches/120-kernel26-compat.patch b/feeds/packages/utils/cmdpad/patches/120-kernel26-compat.patch
+new file mode 100644
+index 0000000..eb7beeb
+--- /dev/null
++++ b/feeds/packages/utils/cmdpad/patches/120-kernel26-compat.patch
+@@ -0,0 +1,15 @@
++--- cmdpad-0.0.3/src/parse.orig 2008-01-05 23:55:32.000000000 +0100
+++++ cmdpad-0.0.3/src/parse.c 2008-01-05 23:56:07.000000000 +0100
++@@ -289,6 +289,12 @@
++ pchEventDevice = strdup( pchValue) ;
++ return 1 ;
++ }
+++ if( (pchValue != NULL) &&
+++ (strncmp( pchValue, "/dev/event", 6) == 0) )
+++ {
+++ pchEventDevice = strdup( pchValue) ;
+++ return 1 ;
+++ }
++ printf( "Option 'device' expects a /dev/input/eventX argument\n");
++ return -1 ;
++ }
+diff --git a/feeds/packages/utils/cmdpad/patches/130-no_zombie.patch b/feeds/packages/utils/cmdpad/patches/130-no_zombie.patch
+new file mode 100644
+index 0000000..aa4fc6a
+--- /dev/null
++++ b/feeds/packages/utils/cmdpad/patches/130-no_zombie.patch
+@@ -0,0 +1,18 @@
++--- cmdpad-0.0.3/src/command.c.orig 2003-03-29 17:54:12.000000000 +0100
+++++ cmdpad-0.0.3/src/command.c 2008-01-12 05:41:22.000000000 +0100
++@@ -68,6 +68,7 @@
++
++ void exec( char * command)
++ {
+++ int status;
++ if( fork() == 0) {
++ char ** tmp ;
++ int i ;
++@@ -88,6 +89,7 @@
++ perror( "ERROR: execv") ;
++ exit( 1) ;
++ } // end if( fork())
+++ wait(&status);
++ }
++
++ int getNumberofEntry()
+diff --git a/feeds/packages/utils/cmdpad/patches/140-compile_fix.patch b/feeds/packages/utils/cmdpad/patches/140-compile_fix.patch
+new file mode 100644
+index 0000000..c7a9bb3
+--- /dev/null
++++ b/feeds/packages/utils/cmdpad/patches/140-compile_fix.patch
+@@ -0,0 +1,11 @@
++--- a/src/parse.c
+++++ b/src/parse.c
++@@ -125,7 +125,7 @@ int readCommandLine( int argc, char *arg
++
++ d2printf( "command line command %s found\n", pchCommandTranslations[ iCmd+1]) ;
++
++- vsnprintf( achCommand, sizeof( achCommand),
+++ snprintf( achCommand, sizeof( achCommand),
++ pchCommandTranslations[ iCmd+1],
++ &argv[ i+1]) ;
++
+diff --git a/feeds/packages/utils/collectd/Makefile b/feeds/packages/utils/collectd/Makefile
+new file mode 100644
+index 0000000..280c868
+--- /dev/null
++++ b/feeds/packages/utils/collectd/Makefile
+@@ -0,0 +1,348 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=collectd
++PKG_VERSION:=5.5.0
++PKG_RELEASE:=5
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://collectd.org/files/
++PKG_MD5SUM:=c39305ef5514b44238b0d31f77e29e6a
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=aclocal.m4 libltdl/aclocal.m4
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++PKG_USE_MIPS16:=0
++
++COLLECTD_PLUGINS_DISABLED:= \
++ amqp \
++ apple_sensors \
++ aquaero \
++ barometer \
++ battery \
++ ceph \
++ cgroups \
++ cpufreq \
++ curl_json \
++ curl_xml \
++ dbi \
++ drbd \
++ ethstat \
++ fhcount \
++ genericjmx \
++ gmond \
++ hddtemp \
++ ipc \
++ ipmi \
++ ipvs \
++ java \
++ log_logstash \
++ lvm \
++ lpar \
++ mbmon \
++ md \
++ memcachec \
++ memcached \
++ mic \
++ monitorus \
++ multimeter \
++ netapp \
++ nfs \
++ notify_desktop \
++ notify_email \
++ numa \
++ nut \
++ openldap \
++ openvz \
++ oracle \
++ perl \
++ pf \
++ pinba \
++ python \
++ redis \
++ routeros \
++ rrdcached \
++ serial \
++ sigrok \
++ smart \
++ statsd \
++ swap \
++ tape \
++ tokyotyrant \
++ turbostat \
++ uuid \
++ varnish \
++ virt \
++ vserver \
++ write_kafka \
++ write_log \
++ write_mongodb \
++ write_redis \
++ write_riemann \
++ write_sensu \
++ write_tsdb \
++ xmms \
++ zfs_arc \
++ zookeeper
++
++COLLECTD_PLUGINS_SELECTED:= \
++ apache \
++ apcups \
++ ascent \
++ bind \
++ conntrack \
++ contextswitch \
++ cpu \
++ csv \
++ curl \
++ df \
++ disk \
++ dns \
++ email \
++ entropy \
++ exec \
++ filecount \
++ fscache \
++ interface \
++ iptables \
++ irq \
++ iwinfo \
++ load \
++ logfile \
++ madwifi \
++ memory \
++ modbus \
++ mysql \
++ netlink \
++ network \
++ nginx \
++ ntpd \
++ olsrd \
++ onewire \
++ openvpn \
++ ping \
++ postgresql \
++ powerdns \
++ processes \
++ protocols \
++ rrdtool \
++ sensors \
++ snmp \
++ syslog \
++ table \
++ tail \
++ tcpconns \
++ teamspeak2 \
++ ted \
++ thermal \
++ unixsock \
++ uptime \
++ users \
++ vmem \
++ wireless \
++ write_graphite \
++ write_http \
++
++PKG_CONFIG_DEPENDS:= \
++ $(patsubst %,CONFIG_PACKAGE_collectd-mod-%,$(subst _,-,$(COLLECTD_PLUGINS_SELECTED))) \
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++define Package/collectd/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Lightweight system statistics collection daemon
++ URL:=http://verplant.org/collectd/
++endef
++
++define Package/collectd
++$(call Package/collectd/Default)
++ DEPENDS:= +libpthread +zlib +libltdl +libip4tc
++ MENU:=1
++endef
++
++define Package/collectd/description
++ collectd is a small daemon which collects system information periodically
++ and provides mechanismns to store the values in a variety of ways.
++endef
++
++ifneq ($(CONFIG_avr32),)
++ TARGET_CFLAGS += -fsigned-char
++endif
++
++# common configure args
++CONFIGURE_ARGS+= \
++ --disable-debug \
++ --enable-daemon \
++ --with-nan-emulation \
++ --with-perl-bindings= \
++ --without-libgcrypt
++
++CONFIGURE_VARS+= \
++ CFLAGS="$$$$CFLAGS $(FPIC)" \
++ LDFLAGS="$$$$LDFLAGS -lm -lz" \
++ KERNEL_DIR="$(LINUX_DIR)" \
++
++CONFIGURE_PLUGIN= \
++ $(foreach m, $(1), \
++ $(if $(CONFIG_PACKAGE_collectd-mod-$(subst _,-,$(m))),--enable-$(m),--disable-$(m)) \
++ )
++
++CONFIGURE_ARGS+= \
++ $(call CONFIGURE_PLUGIN,$(COLLECTD_PLUGINS_SELECTED)) \
++ $(call CONFIGURE_PLUGIN,$(COLLECTD_PLUGINS_DISABLED)) \
++
++# exception: mod-ascent needs libxml2
++ifneq ($(CONFIG_PACKAGE_collectd-mod-ascent),)
++ CONFIGURE_VARS+= \
++ CPPFLAGS="$$$$CPPFLAGS -I$(STAGING_DIR)/usr/include/libxml2"
++endif
++
++ifneq ($(CONFIG_BIG_ENDIAN),)
++ CONFIGURE_ARGS+= --with-fp-layout=endianflip
++else
++ CONFIGURE_ARGS+= --with-fp-layout=nothing
++endif
++
++ifneq ($(CONFIG_PACKAGE_collectd-mod-postgresql),)
++ CONFIGURE_ARGS+= --with-libpq="$(STAGING_DIR)/usr/"
++endif
++
++ifneq ($(CONFIG_PACKAGE_collectd-mod-mysql),)
++ CONFIGURE_ARGS+= --with-libmysql="$(STAGING_DIR)/usr/"
++endif
++
++# exception: mod-netlink needs libnetlink from iproute
++ifneq ($(CONFIG_PACKAGE_collectd-mod-netlink),)
++ CONFIGURE_ARGS+= --with-libnetlink="$(STAGING_DIR)/usr"
++endif
++
++# exception: mod-modbus needs libmodbus
++ifneq ($(CONFIG_PACKAGE_collectd-mod-modbus),)
++ CONFIGURE_ARGS+= --with-libmodbus="$(STAGING_DIR)/usr"
++endif
++
++# exception: mod-onewire needs libow-capi
++ifneq ($(CONFIG_PACKAGE_collectd-mod-onewire),)
++ CONFIGURE_ARGS+= --with-libowcapi="$(STAGING_DIR)/usr"
++endif
++
++# exception: mod-rrdtool needs rrdtool-1.0.x
++ifneq ($(CONFIG_PACKAGE_collectd-mod-rrdtool),)
++ CONFIGURE_ARGS+= --with-librrd="$(STAGING_DIR)/usr/lib/rrdtool-1.0"
++endif
++
++define Package/collectd/conffiles
++/etc/collectd.conf
++endef
++
++define Package/collectd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/collectd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/share/collectd
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/collectd/types.db $(1)/usr/share/collectd/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) ./files/collectd.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/collectd.init $(1)/etc/init.d/collectd
++ $(INSTALL_DIR) $(1)/etc/collectd/conf.d
++endef
++
++# 1: plugin name
++# 2: plugin title/description
++# 3: files
++# 4: extra dependency
++define BuildPlugin
++
++ PKG_CONFIG_DEPENDS+= CONFIG_PACKAGE_collectd-mod-$(1)
++
++ define Package/collectd-mod-$(1)
++ $$(call Package/collectd/Default)
++ TITLE:=$(2) plugin
++ DEPENDS:= collectd $(4)
++ endef
++
++ define Package/collectd-mod-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/collectd
++ for m in $(3); do \
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/collectd/$$$$$$$${m}.so \
++ $$(1)/usr/lib/collectd/ ; \
++ done
++ endef
++
++ $$(eval $$(call BuildPackage,collectd-mod-$(1)))
++
++endef
++
++$(eval $(call BuildPackage,collectd))
++
++#$(eval $(call BuildPlugin,NAME,DESCRIPTION,FILES,DEPENDENCIES))
++$(eval $(call BuildPlugin,apache,apache status input,apache,+PACKAGE_collectd-mod-apache:libcurl))
++$(eval $(call BuildPlugin,apcups,apcups status input,apcups,))
++$(eval $(call BuildPlugin,ascent,ascent status input,ascent,+PACKAGE_collectd-mod-ascent:libcurl +PACKAGE_collectd-mod-ascent:libxml2))
++$(eval $(call BuildPlugin,bind,BIND server/zone input,bind,+PACKAGE_collectd-mod-bind:libcurl +PACKAGE_collectd-mod-bind:libxml2))
++$(eval $(call BuildPlugin,conntrack,connection tracking table size input,conntrack,))
++$(eval $(call BuildPlugin,contextswitch,context switch input,contextswitch,))
++$(eval $(call BuildPlugin,cpu,CPU input,cpu,))
++$(eval $(call BuildPlugin,csv,CSV output,csv,))
++$(eval $(call BuildPlugin,curl,cURL input,curl,+PACKAGE_collectd-mod-curl:libcurl))
++#$(eval $(call BuildPlugin,dbi,relational database input,dbi,+PACKAGE_collectd-mod-dbi:libdbi))
++$(eval $(call BuildPlugin,df,disk space input,df,))
++$(eval $(call BuildPlugin,disk,disk usage/timing input,disk,))
++$(eval $(call BuildPlugin,dns,DNS traffic input,dns,+PACKAGE_collectd-mod-dns:libpcap))
++$(eval $(call BuildPlugin,email,email output,email,))
++$(eval $(call BuildPlugin,entropy,Entropy amount input,entropy,))
++$(eval $(call BuildPlugin,exec,process exec input,exec,))
++$(eval $(call BuildPlugin,filecount,file count input,filecount,))
++$(eval $(call BuildPlugin,fscache,file-system based caching framework input,fscache,))
++$(eval $(call BuildPlugin,interface,network interfaces input,interface,))
++$(eval $(call BuildPlugin,iptables,iptables status input,iptables,+PACKAGE_collectd-mod-iptables:iptables +libiptc))
++$(eval $(call BuildPlugin,irq,interrupt usage input,irq,))
++$(eval $(call BuildPlugin,iwinfo,libiwinfo wireless statistics,iwinfo,+PACKAGE_collectd-mod-iwinfo:libiwinfo))
++$(eval $(call BuildPlugin,load,system load input,load,))
++$(eval $(call BuildPlugin,logfile,log files output,logfile,))
++$(eval $(call BuildPlugin,madwifi,MadWifi status input,madwifi,))
++#$(eval $(call BuildPlugin,mysql,MySQL status input,mysql,+PACKAGE_collectd-mod-mysql:libmysqlclient-r))
++$(eval $(call BuildPlugin,memory,physical memory usage input,memory,))
++$(eval $(call BuildPlugin,modbus,read variables through libmodbus,modbus,+PACKAGE_collectd-mod-modbus:libmodbus))
++$(eval $(call BuildPlugin,netlink,netlink input,netlink,+PACKAGE_collectd-mod-netlink:libmnl))
++$(eval $(call BuildPlugin,network,network input/output,network))
++$(eval $(call BuildPlugin,nginx,nginx status input,nginx,+PACKAGE_collectd-mod-nginx:libcurl))
++$(eval $(call BuildPlugin,ntpd,NTP daemon status input,ntpd,))
++#$(eval $(call BuildPlugin,nut,UPS monitoring input,nut,+PACKAGE_collectd-mod-nut:nut))
++$(eval $(call BuildPlugin,olsrd,OLSRd status input,olsrd,))
++$(eval $(call BuildPlugin,onewire,onewire sensor input,onewire,+PACKAGE_collectd-mod-onewire:libow-capi @BROKEN))
++$(eval $(call BuildPlugin,openvpn,OpenVPN traffic/compression input,openvpn,))
++$(eval $(call BuildPlugin,ping,ping status input,ping,+PACKAGE_collectd-mod-ping:liboping))
++$(eval $(call BuildPlugin,postgresql,PostgreSQL status input,postgresql,+PACKAGE_collectd-mod-postgresql:libpq))
++$(eval $(call BuildPlugin,powerdns,PowerDNS server status input,powerdns,))
++$(eval $(call BuildPlugin,processes,process status input,processes,))
++$(eval $(call BuildPlugin,protocols,network protocols input,protocols,))
++$(eval $(call BuildPlugin,rrdtool,RRDtool output,rrdtool,+PACKAGE_collectd-mod-rrdtool:librrd1))
++$(eval $(call BuildPlugin,sensors,lm_sensors input,sensors,+PACKAGE_collectd-mod-sensors:libsensors))
++$(eval $(call BuildPlugin,snmp,SNMP input,snmp,+PACKAGE_collectd-mod-snmp:libnetsnmp))
++$(eval $(call BuildPlugin,syslog,syslog output,syslog,))
++$(eval $(call BuildPlugin,tail,tail input,tail,))
++$(eval $(call BuildPlugin,table,table-like structured file input,table,))
++$(eval $(call BuildPlugin,teamspeak2,TeamSpeak2 input,teamspeak2,))
++$(eval $(call BuildPlugin,ted,The Energy Detective input,ted,@((!TARGET_avr32)||BROKEN))) # fails on avr32 because of warnings treated as errors
++$(eval $(call BuildPlugin,tcpconns,TCP connection tracking input,tcpconns,))
++$(eval $(call BuildPlugin,thermal,system temperatures input,thermal,))
++$(eval $(call BuildPlugin,unixsock,unix socket output,unixsock,))
++$(eval $(call BuildPlugin,uptime,uptime status input,uptime,))
++$(eval $(call BuildPlugin,users,user logged in status input,users,))
++$(eval $(call BuildPlugin,vmem,virtual memory usage input,vmem,))
++$(eval $(call BuildPlugin,wireless,wireless status input,wireless,))
++$(eval $(call BuildPlugin,write-graphite,Carbon/Graphite output,write_graphite,+PACKAGE_collectd-mod-write-graphite:libpthread))
++$(eval $(call BuildPlugin,write-http,HTTP POST output,write_http,+PACKAGE_collectd-mod-write-http:libcurl))
+diff --git a/feeds/packages/utils/collectd/files/collectd.conf b/feeds/packages/utils/collectd/files/collectd.conf
+new file mode 100644
+index 0000000..3afbfad
+--- /dev/null
++++ b/feeds/packages/utils/collectd/files/collectd.conf
+@@ -0,0 +1,39 @@
++# Config file for collectd. More info: https://collectd.org/
++# Note: Luci statistics will generate a new config and overwrite this file.
++
++#Hostname "localhost"
++#FQDNLookup true
++BaseDir "/var/run/collectd"
++Include "/etc/collectd/conf.d"
++PIDFile "/var/run/collectd.pid"
++PluginDir "/usr/lib/collectd"
++TypesDB "/usr/share/collectd/types.db"
++Interval 30
++ReadThreads 2
++
++LoadPlugin interface
++LoadPlugin load
++#LoadPlugin ping
++LoadPlugin rrdtool
++
++<Plugin rrdtool>
++ DataDir "/tmp/rrd"
++ RRARows 100
++ RRASingle true
++ RRATimespan 3600
++ RRATimespan 86400
++ RRATimespan 604800
++ RRATimespan 2678400
++ RRATimespan 31622400
++</Plugin>
++
++<Plugin interface>
++ IgnoreSelected false
++ Interface "br-lan"
++</Plugin>
++
++#<Plugin ping>
++# Host "host.foo.bar"
++# Interval 30
++# TTL 127
++#</Plugin>
+diff --git a/feeds/packages/utils/collectd/files/collectd.init b/feeds/packages/utils/collectd/files/collectd.init
+new file mode 100644
+index 0000000..8204c38
+--- /dev/null
++++ b/feeds/packages/utils/collectd/files/collectd.init
+@@ -0,0 +1,15 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=80
++
++SERVICE_USE_PID=1
++
++start() {
++ mkdir -m 0755 -p /var/lib/collectd
++ service_start /usr/sbin/collectd
++}
++
++stop() {
++ service_stop /usr/sbin/collectd
++}
+diff --git a/feeds/packages/utils/collectd/patches/001-undefined-AM_PATH_LIBGCRYPT.patch b/feeds/packages/utils/collectd/patches/001-undefined-AM_PATH_LIBGCRYPT.patch
+new file mode 100644
+index 0000000..0e01744
+--- /dev/null
++++ b/feeds/packages/utils/collectd/patches/001-undefined-AM_PATH_LIBGCRYPT.patch
+@@ -0,0 +1,4 @@
++--- /dev/null
+++++ b/fake-am_path_libgcrypt.m4
++@@ -0,0 +1 @@
+++AC_DEFUN([AM_PATH_LIBGCRYPT],[:])
+diff --git a/feeds/packages/utils/collectd/patches/003-remove-werror.patch b/feeds/packages/utils/collectd/patches/003-remove-werror.patch
+new file mode 100644
+index 0000000..c81f209
+--- /dev/null
++++ b/feeds/packages/utils/collectd/patches/003-remove-werror.patch
+@@ -0,0 +1,22 @@
++--- a/src/Makefile.am
+++++ b/src/Makefile.am
++@@ -7,7 +7,7 @@ SUBDIRS += daemon
++ PLUGIN_LDFLAGS = -module -avoid-version -export-symbols-regex '\<module_register\>'
++
++ if COMPILER_IS_GCC
++-AM_CFLAGS = -Wall -Werror
+++AM_CFLAGS = -Wall
++ endif
++
++ AM_CPPFLAGS = -I$(srcdir)/daemon
++--- a/src/libcollectdclient/Makefile.am
+++++ b/src/libcollectdclient/Makefile.am
++@@ -1,7 +1,7 @@
++ AUTOMAKE_OPTIONS = foreign no-dependencies
++
++ if COMPILER_IS_GCC
++-AM_CFLAGS = -Wall -Werror
+++AM_CFLAGS = -Wall
++ endif
++
++ pkginclude_HEADERS = collectd/client.h collectd/network.h collectd/network_buffer.h collectd/lcc_features.h
+diff --git a/feeds/packages/utils/collectd/patches/100-rrdtool-add-rrasingle-option.patch b/feeds/packages/utils/collectd/patches/100-rrdtool-add-rrasingle-option.patch
+new file mode 100644
+index 0000000..e9059d5
+--- /dev/null
++++ b/feeds/packages/utils/collectd/patches/100-rrdtool-add-rrasingle-option.patch
+@@ -0,0 +1,57 @@
++--- a/src/rrdtool.c
+++++ b/src/rrdtool.c
++@@ -82,6 +82,7 @@ static const char *config_keys[] =
++ "HeartBeat",
++ "RRARows",
++ "RRATimespan",
+++ "RRASingle",
++ "XFF",
++ "WritesPerSecond",
++ "RandomTimeout"
++@@ -103,6 +104,8 @@ static rrdcreate_config_t rrdcreate_conf
++ /* timespans = */ NULL,
++ /* timespans_num = */ 0,
++
+++ /* rrasingle = */ 0,
+++
++ /* consolidation_functions = */ NULL,
++ /* consolidation_functions_num = */ 0,
++
++@@ -1093,6 +1096,14 @@ static int rrd_config (const char *key,
++
++ free (value_copy);
++ }
+++ else if (strcasecmp ("RRASingle", key) == 0)
+++ {
+++ if (IS_TRUE (value))
+++ {
+++ rrdcreate_config.rrasingle = 1;
+++ NOTICE ("rrdtool plugin: RRASingle = true: creating only AVERAGE RRAs");
+++ }
+++ }
++ else if (strcasecmp ("XFF", key) == 0)
++ {
++ double tmp = atof (value);
++--- a/src/utils_rrdcreate.c
+++++ b/src/utils_rrdcreate.c
++@@ -217,6 +217,9 @@ static int rra_get (char ***ret, const v
++ rts_num = rra_timespans_num;
++ }
++
+++ if (cfg->rrasingle)
+++ rra_types_num = 1;
+++
++ rra_max = rts_num * rra_types_num;
++
++ if ((rra_def = (char **) malloc ((rra_max + 1) * sizeof (char *))) == NULL)
++--- a/src/utils_rrdcreate.h
+++++ b/src/utils_rrdcreate.h
++@@ -41,6 +41,8 @@ struct rrdcreate_config_s
++ int *timespans;
++ size_t timespans_num;
++
+++ int rrasingle;
+++
++ char **consolidation_functions;
++ size_t consolidation_functions_num;
++
+diff --git a/feeds/packages/utils/collectd/patches/140-fix-fqdnlookup.patch b/feeds/packages/utils/collectd/patches/140-fix-fqdnlookup.patch
+new file mode 100644
+index 0000000..660b87d
+--- /dev/null
++++ b/feeds/packages/utils/collectd/patches/140-fix-fqdnlookup.patch
+@@ -0,0 +1,11 @@
++--- a/src/daemon/configfile.c
+++++ b/src/daemon/configfile.c
++@@ -109,7 +109,7 @@ static cf_global_option_t cf_global_opti
++ {"BaseDir", NULL, PKGLOCALSTATEDIR},
++ {"PIDFile", NULL, PIDFILE},
++ {"Hostname", NULL, NULL},
++- {"FQDNLookup", NULL, "true"},
+++ {"FQDNLookup", NULL, "false"},
++ {"Interval", NULL, NULL},
++ {"ReadThreads", NULL, "5"},
++ {"WriteThreads", NULL, "5"},
+diff --git a/feeds/packages/utils/collectd/patches/200-fix-git-describe-error.patch b/feeds/packages/utils/collectd/patches/200-fix-git-describe-error.patch
+new file mode 100644
+index 0000000..5aa48dc
+--- /dev/null
++++ b/feeds/packages/utils/collectd/patches/200-fix-git-describe-error.patch
+@@ -0,0 +1,11 @@
++--- a/version-gen.sh
+++++ b/version-gen.sh
++@@ -2,7 +2,7 @@
++
++ DEFAULT_VERSION="5.5.0.git"
++
++-VERSION="`git describe 2> /dev/null | grep collectd | sed -e 's/^collectd-//'`"
+++#VERSION="`git describe 2> /dev/null | grep collectd | sed -e 's/^collectd-//'`"
++
++ if test -z "$VERSION"; then
++ VERSION="$DEFAULT_VERSION"
+diff --git a/feeds/packages/utils/collectd/patches/300-delay-first-read-cycle.patch b/feeds/packages/utils/collectd/patches/300-delay-first-read-cycle.patch
+new file mode 100644
+index 0000000..9a60cc4
+--- /dev/null
++++ b/feeds/packages/utils/collectd/patches/300-delay-first-read-cycle.patch
+@@ -0,0 +1,12 @@
++--- a/src/daemon/plugin.c
+++++ b/src/daemon/plugin.c
++@@ -1149,7 +1149,7 @@ static int plugin_insert_read (read_func
++ int status;
++ llentry_t *le;
++
++- rf->rf_next_read = cdtime ();
+++ rf->rf_next_read = cdtime () + (cdtime_t) 1073741824; //delay first read 1s
++ rf->rf_effective_interval = rf->rf_interval;
++
++ pthread_mutex_lock (&read_lock);
++
+diff --git a/feeds/packages/utils/collectd/patches/400-fix-olsrd-get-all.patch b/feeds/packages/utils/collectd/patches/400-fix-olsrd-get-all.patch
+new file mode 100644
+index 0000000..1dc6c58
+--- /dev/null
++++ b/feeds/packages/utils/collectd/patches/400-fix-olsrd-get-all.patch
+@@ -0,0 +1,11 @@
++--- a/src/olsrd.c
+++++ b/src/olsrd.c
++@@ -658,7 +658,7 @@ static int olsrd_read (void) /* {{{ */
++ if (fh == NULL)
++ return (-1);
++
++- fputs ("\r\n", fh);
+++ fputs ("/all \r\n", fh);
++ fflush (fh);
++
++ while (fgets (buffer, sizeof (buffer), fh) != NULL)
+diff --git a/feeds/packages/utils/collectd/patches/500-upstream-parallel-build-fix.patch b/feeds/packages/utils/collectd/patches/500-upstream-parallel-build-fix.patch
+new file mode 100644
+index 0000000..a10fbbb
+--- /dev/null
++++ b/feeds/packages/utils/collectd/patches/500-upstream-parallel-build-fix.patch
+@@ -0,0 +1,17 @@
++Backport of 780e6a76021a240e95007a04b723d827120afa95
++Subject: [PATCH] build: add libavltree, libcommon & libheap dependencies
++
++Otherwise it can break on very parallel builds since collectd link time
++arrives before one or more of these were built.
++
++--- a/src/daemon/Makefile.am
+++++ b/src/daemon/Makefile.am
++@@ -49,7 +49,7 @@ collectd_CPPFLAGS = $(AM_CPPFLAGS) $(LT
++ collectd_CFLAGS = $(AM_CFLAGS)
++ collectd_LDFLAGS = -export-dynamic
++ collectd_LDADD = libavltree.la libcommon.la libheap.la -lm
++-collectd_DEPENDENCIES =
+++collectd_DEPENDENCIES = libavltree.la libcommon.la libheap.la
++
++ # Link to these libraries..
++ if BUILD_WITH_LIBRT
+diff --git a/feeds/packages/utils/collectd/patches/900-add-iwinfo-plugin.patch b/feeds/packages/utils/collectd/patches/900-add-iwinfo-plugin.patch
+new file mode 100644
+index 0000000..6b36b9a
+--- /dev/null
++++ b/feeds/packages/utils/collectd/patches/900-add-iwinfo-plugin.patch
+@@ -0,0 +1,276 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -589,6 +589,9 @@ AC_CHECK_HEADERS(net/pfvar.h,
++ have_termios_h="no"
++ AC_CHECK_HEADERS(termios.h, [have_termios_h="yes"])
++
+++# For the iwinfo plugin
+++AC_CHECK_LIB(iwinfo, iwinfo_backend, [with_iwinfo="yes"], [with_iwinfo="no (libiwinfo not found)"], [])
+++
++ # For the turbostat plugin
++ have_asm_msrindex_h="no"
++ AC_CHECK_HEADERS(asm/msr-index.h, [have_asm_msrindex_h="yes"])
++@@ -5171,6 +5174,7 @@ plugin_interface="no"
++ plugin_ipmi="no"
++ plugin_ipvs="no"
++ plugin_irq="no"
+++plugin_iwinfo="no"
++ plugin_load="no"
++ plugin_log_logstash="no"
++ plugin_memory="no"
++@@ -5562,6 +5566,7 @@ AC_PLUGIN([ipmi], [$plugin_ipmi],
++ AC_PLUGIN([iptables], [$with_libiptc], [IPTables rule counters])
++ AC_PLUGIN([ipvs], [$plugin_ipvs], [IPVS connection statistics])
++ AC_PLUGIN([irq], [$plugin_irq], [IRQ statistics])
+++AC_PLUGIN([iwinfo], [$with_iwinfo], [Common iwinfo wireless statistics])
++ AC_PLUGIN([java], [$with_java], [Embed the Java Virtual Machine])
++ AC_PLUGIN([load], [$plugin_load], [System load])
++ AC_PLUGIN([logfile], [yes], [File logging plugin])
++@@ -5891,6 +5896,7 @@ Configuration:
++ oracle . . . . . . . $with_oracle
++ protobuf-c . . . . . $have_protoc_c
++ python . . . . . . . $with_python
+++ iwinfo . . . . . . . $with_iwinfo
++
++ Features:
++ daemon mode . . . . . $enable_daemon
++@@ -5940,6 +5946,7 @@ Configuration:
++ iptables . . . . . . $enable_iptables
++ ipvs . . . . . . . . $enable_ipvs
++ irq . . . . . . . . . $enable_irq
+++ iwinfo . . . . . . . $enable_iwinfo
++ java . . . . . . . . $enable_java
++ load . . . . . . . . $enable_load
++ logfile . . . . . . . $enable_logfile
++--- a/src/collectd.conf.in
+++++ b/src/collectd.conf.in
++@@ -128,6 +128,7 @@
++ #@BUILD_PLUGIN_IPMI_TRUE@LoadPlugin ipmi
++ #@BUILD_PLUGIN_IPVS_TRUE@LoadPlugin ipvs
++ #@BUILD_PLUGIN_IRQ_TRUE@LoadPlugin irq
+++#@BUILD_PLUGIN_IWINFO_TRUE@LoadPlugin iwinfo
++ #@BUILD_PLUGIN_JAVA_TRUE@LoadPlugin java
++ @BUILD_PLUGIN_LOAD_TRUE@@BUILD_PLUGIN_LOAD_TRUE@LoadPlugin load
++ #@BUILD_PLUGIN_LPAR_TRUE@LoadPlugin lpar
++@@ -582,6 +583,12 @@
++ # IgnoreSelected true
++ #</Plugin>
++
+++#<Plugin iwinfo>
+++# Interface "ath0"
+++# Interface "ra0"
+++# Interface "wlan0"
+++#</Plugin>
+++
++ #<Plugin java>
++ # JVMArg "-verbose:jni"
++ # JVMArg "-Djava.class.path=@prefix@/share/collectd/java/collectd-api.jar"
++--- a/src/collectd.conf.pod
+++++ b/src/collectd.conf.pod
++@@ -2572,6 +2572,27 @@ and all other interrupts are collected.
++
++ =back
++
+++=head2 Plugin C<iwinfo>
+++
+++=over 4
+++
+++=item B<Interface> I<Interface>
+++
+++Select this interface. By default all detected wireless interfaces will be
+++collected. For a more detailed description see B<IgnoreSelected> below.
+++
+++=item B<IgnoreSelected> I<true>|I<false>
+++
+++If no configuration if given, the B<iwinfo>-plugin will collect data from all
+++detected wireless interfaces. You can use the B<Interface>-option to pick the
+++interfaces you're interested in. Sometimes, however, it's easier/preferred to
+++collect all interfaces I<except> a few ones. This option enables you to do
+++that: By setting B<IgnoreSelected> to I<true> the effect of B<Interface> is
+++inverted: All selected interfaces are ignored and all other interfaces are
+++collected.
+++
+++=back
+++
++ =head2 Plugin C<java>
++
++ The I<Java> plugin makes it possible to write extensions for collectd in Java.
++--- /dev/null
+++++ b/src/iwinfo.c
++@@ -0,0 +1,150 @@
+++/**
+++ * collectd - src/iwinfo.c
+++ * Copyright (C) 2011 Jo-Philipp Wich
+++ *
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License as published by the
+++ * Free Software Foundation; only version 2 of the License is applicable.
+++ *
+++ * This program is distributed in the hope that it will be useful, but
+++ * WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+++ * General Public License for more details.
+++ *
+++ * You should have received a copy of the GNU General Public License along
+++ * with this program; if not, write to the Free Software Foundation, Inc.,
+++ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+++ **/
+++
+++#include "collectd.h"
+++#include "common.h"
+++#include "plugin.h"
+++#include "utils_ignorelist.h"
+++
+++#include <stdint.h>
+++#include <iwinfo.h>
+++
+++#define PROCNETDEV "/proc/net/dev"
+++
+++static const char *config_keys[] = {
+++ "Interface",
+++ "IgnoreSelected"
+++};
+++static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
+++
+++static ignorelist_t *ignorelist = NULL;
+++
+++static int iwinfo_config(const char *key, const char *value)
+++{
+++ if (ignorelist == NULL)
+++ ignorelist = ignorelist_create(1);
+++
+++ if (ignorelist == NULL)
+++ return 1;
+++
+++ if (strcasecmp(key, "Interface") == 0)
+++ ignorelist_add(ignorelist, value);
+++ else if (strcasecmp(key, "IgnoreSelected") == 0)
+++ ignorelist_set_invert(ignorelist, IS_TRUE(value) ? 0 : 1);
+++ else
+++ return -1;
+++
+++ return 0;
+++}
+++
+++static void iwinfo_submit(const char *ifname, const char *type, int value)
+++{
+++ value_t values[1];
+++ value_list_t vl = VALUE_LIST_INIT;
+++
+++ values[0].gauge = value;
+++
+++ vl.values = values;
+++ vl.values_len = 1;
+++
+++ sstrncpy(vl.host, hostname_g, sizeof(vl.host));
+++ sstrncpy(vl.plugin, "iwinfo", sizeof(vl.plugin));
+++ sstrncpy(vl.plugin_instance, ifname, sizeof(vl.plugin_instance));
+++ sstrncpy(vl.type, type, sizeof(vl.type));
+++ /*sstrncpy(vl.type_instance, "", sizeof(vl.type_instance));*/
+++
+++ plugin_dispatch_values(&vl);
+++}
+++
+++static void iwinfo_process(const char *ifname)
+++{
+++ int val;
+++ char buf[IWINFO_BUFSIZE];
+++ const struct iwinfo_ops *iw = iwinfo_backend(ifname);
+++
+++ /* does appear to be a wifi iface */
+++ if (iw)
+++ {
+++ if (iw->bitrate(ifname, &val))
+++ val = 0;
+++ iwinfo_submit(ifname, "bitrate", val * 1000);
+++
+++ if (iw->signal(ifname, &val))
+++ val = 0;
+++ iwinfo_submit(ifname, "signal_power", val);
+++
+++ if (iw->noise(ifname, &val))
+++ val = 0;
+++ iwinfo_submit(ifname, "signal_noise", val);
+++
+++ if (iw->quality(ifname, &val))
+++ val = 0;
+++ iwinfo_submit(ifname, "signal_quality", val);
+++
+++ if (iw->assoclist(ifname, buf, &val))
+++ val = 0;
+++ iwinfo_submit(ifname, "stations",
+++ val / sizeof(struct iwinfo_assoclist_entry));
+++ }
+++
+++ iwinfo_finish();
+++}
+++
+++static int iwinfo_read(void)
+++{
+++ char line[1024];
+++ char ifname[128];
+++ FILE *f;
+++
+++ f = fopen(PROCNETDEV, "r");
+++ if (f == NULL)
+++ {
+++ char err[1024];
+++ WARNING("iwinfo: Unable to open " PROCNETDEV ": %s",
+++ sstrerror(errno, err, sizeof(err)));
+++ return -1;
+++ }
+++
+++ while (fgets(line, sizeof(line), f))
+++ {
+++ if (!strchr(line, ':'))
+++ continue;
+++
+++ if (!sscanf(line, " %127[^:]", ifname))
+++ continue;
+++
+++ if (ignorelist_match(ignorelist, ifname))
+++ continue;
+++
+++ if (strstr(ifname, "mon.") || strstr(ifname, ".sta") ||
+++ strstr(ifname, "tmp.") || strstr(ifname, "wifi"))
+++ continue;
+++
+++ iwinfo_process(ifname);
+++ }
+++
+++ fclose(f);
+++
+++ return 0;
+++}
+++
+++void module_register(void)
+++{
+++ plugin_register_config("iwinfo", iwinfo_config, config_keys, config_keys_num);
+++ plugin_register_read("iwinfo", iwinfo_read);
+++}
++--- a/src/Makefile.am
+++++ b/src/Makefile.am
++@@ -459,6 +459,13 @@ irq_la_SOURCES = irq.c \
++ irq_la_LDFLAGS = $(PLUGIN_LDFLAGS)
++ endif
++
+++if BUILD_PLUGIN_IWINFO
+++pkglib_LTLIBRARIES += iwinfo.la
+++iwinfo_la_SOURCES = iwinfo.c utils_ignorelist.c utils_ignorelist.h
+++iwinfo_la_LDFLAGS = -module -avoid-version
+++iwinfo_la_LIBADD = -liwinfo
+++endif
+++
++ if BUILD_PLUGIN_JAVA
++ pkglib_LTLIBRARIES += java.la
++ java_la_SOURCES = java.c
++--- a/src/types.db
+++++ b/src/types.db
++@@ -227,6 +227,7 @@ voltage value:GAUGE:U:U
++ vs_memory value:GAUGE:0:9223372036854775807
++ vs_processes value:GAUGE:0:65535
++ vs_threads value:GAUGE:0:65535
+++stations value:GAUGE:0:256
++
++ #
++ # Legacy types
+diff --git a/feeds/packages/utils/collectd/patches/920-fix-ping-droprate.patch b/feeds/packages/utils/collectd/patches/920-fix-ping-droprate.patch
+new file mode 100644
+index 0000000..6cbdcda
+--- /dev/null
++++ b/feeds/packages/utils/collectd/patches/920-fix-ping-droprate.patch
+@@ -0,0 +1,11 @@
++--- a/src/ping.c
+++++ b/src/ping.c
++@@ -656,7 +656,7 @@ static int ping_read (void) /* {{{ */
++ / ((double) (pkg_recv * (pkg_recv - 1))));
++
++ /* Calculate drop rate. */
++- droprate = ((double) (pkg_sent - pkg_recv)) / ((double) pkg_sent);
+++ droprate = ((double) (pkg_sent - pkg_recv)) * 100 / ((double) pkg_sent);
++
++ submit (hl->host, "ping", latency_average);
++ submit (hl->host, "ping_stddev", latency_stddev);
+diff --git a/feeds/packages/utils/coreutils/Makefile b/feeds/packages/utils/coreutils/Makefile
+new file mode 100644
+index 0000000..3b9f17d
+--- /dev/null
++++ b/feeds/packages/utils/coreutils/Makefile
+@@ -0,0 +1,116 @@
++#
++# Copyright (C) 2008-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=coreutils
++PKG_VERSION:=8.23
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@GNU/coreutils
++PKG_MD5SUM:=abed135279f87ad6762ce57ff6d89c41
++PKG_BUILD_DEPENDS:=libpthread
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++COREUTILS_APPLETS := \
++ base64 basename cat chcon chgrp chmod chown chroot cksum comm cp csplit \
++ cut date dd dir dircolors dirname du echo env expand expr factor \
++ false fmt fold groups head hostid id install join kill link ln logname \
++ ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc od paste \
++ pathchk pinky pr printenv printf ptx pwd readlink realpath rm rmdir \
++ runcon seq sha1sum sha224sum sha256sum sha384sum sha512sum shred \
++ shuf sleep sort split stat stdbuf stty sum sync tac tail tee test \
++ timeout touch tr true truncate tsort tty uname unexpand uniq unlink \
++ uptime users vdir wc who whoami yes
++
++DEPENDS_sort = +libpthread
++DEPENDS_timeout = +librt
++DEPENDS_expr = +libgmp
++DEPENDS_factor = +libgmp
++DEPENDS_cp = +libacl
++DEPENDS_dir = +libacl
++DEPENDS_install = +libacl
++DEPENDS_ls = +libacl
++DEPENDS_mv = +libacl
++DEPENDS_vdir = +libacl
++
++define Package/coreutils/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=The GNU core utilities
++ URL:=http://www.gnu.org/software/coreutils/
++endef
++
++define Package/coreutils
++ $(call Package/coreutils/Default)
++ TITLE:=The GNU core utilities
++ MENU:=1
++endef
++
++define Package/coreutils/description
++ Full versions of standard GNU utilities. Normally, you would not use this
++ package, since the functionality in BusyBox is more than sufficient and
++ smaller.
++endef
++
++define GenPlugin
++ define Package/$(1)
++ $(call Package/coreutils/Default)
++ DEPENDS:=coreutils $(DEPENDS_$(2))
++ TITLE:=Utility $(2) from the GNU core utilities
++ endef
++
++ define Package/$(1)/description
++ Full version of standard GNU $(2) utility. Normally, you would not use this
++ package, since the functionality in BusyBox is more than sufficient.
++ endef
++endef
++
++$(foreach a,$(COREUTILS_APPLETS),$(eval $(call GenPlugin,coreutils-$(a),$(a))))
++
++CONFIGURE_VARS += \
++ gl_cv_func_mbrtowc_incomplete_state=yes \
++ gl_cv_func_mbrtowc_retval=yes \
++ gl_cv_func_wcrtomb_retval=yes
++
++ifneq ($(CONFIG_USE_UCLIBC),)
++ CONFIGURE_VARS += \
++ ac_cv_type_pthread_spinlock_t=$(if $(filter 0.9.30% 0.9.2% 0.9.31%,$(call qstrip,$(CONFIG_UCLIBC_VERSION))),no,yes)
++endif
++
++CONFIGURE_ARGS += \
++ --disable-xattr \
++ --enable-install-program=su
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ SHELL="/bin/bash" \
++ all install
++endef
++
++define Package/coreutils/install
++ true
++endef
++
++define BuildPlugin
++ define Package/$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(2) $$(1)/usr/bin/
++ endef
++
++ $$(eval $$(call BuildPackage,$(1)))
++endef
++
++$(eval $(call BuildPackage,coreutils))
++
++$(foreach a,$(COREUTILS_APPLETS),$(eval $(call BuildPlugin,coreutils-$(a),$(a))))
+diff --git a/feeds/packages/utils/coreutils/patches/001-no_docs_man_tests.patch b/feeds/packages/utils/coreutils/patches/001-no_docs_man_tests.patch
+new file mode 100644
+index 0000000..60f2df2
+--- /dev/null
++++ b/feeds/packages/utils/coreutils/patches/001-no_docs_man_tests.patch
+@@ -0,0 +1,89 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -17,7 +17,7 @@
++
++ ALL_RECURSIVE_TARGETS =
++
++-SUBDIRS = po . gnulib-tests
+++SUBDIRS = po
++
++ changelog_etc = \
++ ChangeLog-2005 \
++@@ -213,6 +213,4 @@ AM_CPPFLAGS = -Ilib -I$(top_srcdir)/lib
++
++ include $(top_srcdir)/lib/local.mk
++ include $(top_srcdir)/src/local.mk
++-include $(top_srcdir)/doc/local.mk
++-include $(top_srcdir)/man/local.mk
++-include $(top_srcdir)/tests/local.mk
+++
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -159,8 +159,7 @@ build_triplet = @build@
++ host_triplet = @host@
++ DIST_COMMON = $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk \
++ $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk \
++- $(top_srcdir)/src/single-binary.mk $(top_srcdir)/doc/local.mk \
++- $(top_srcdir)/man/local.mk $(top_srcdir)/tests/local.mk \
+++ $(top_srcdir)/src/single-binary.mk \
++ INSTALL NEWS README AUTHORS ChangeLog $(srcdir)/Makefile.in \
++ $(srcdir)/Makefile.am $(top_srcdir)/configure \
++ $(am__configure_deps) $(top_srcdir)/lib/config.hin ABOUT-NLS \
++@@ -2276,11 +2275,7 @@ RECURSIVE_TARGETS = all-recursive check-
++ install-ps-recursive install-recursive installcheck-recursive \
++ installdirs-recursive pdf-recursive ps-recursive \
++ tags-recursive uninstall-recursive
++-am__can_run_installinfo = \
++- case $$AM_UPDATE_INFO_DIR in \
++- n|no|NO) false;; \
++- *) (install-info --version) >/dev/null 2>&1;; \
++- esac
+++am__can_run_installinfo = false
++ am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
++ am__vpath_adj = case $$p in \
++ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
++@@ -2606,7 +2601,7 @@ EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
++ EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
++ ERRNO_H = @ERRNO_H@
++ EXEEXT = @EXEEXT@
++-EXTRA_MANS = @EXTRA_MANS@
+++EXTRA_MANS =
++ FLOAT_H = @FLOAT_H@
++ FNMATCH_H = @FNMATCH_H@
++ GETADDRINFO_LIB = @GETADDRINFO_LIB@
++@@ -3820,7 +3815,7 @@ libexecdir = @libexecdir@
++ lispdir = @lispdir@
++ localedir = @localedir@
++ localstatedir = @localstatedir@
++-man1_MANS = @man1_MANS@
+++man1_MANS =
++ mandir = @mandir@
++ mkdir_p = @mkdir_p@
++ oldincludedir = @oldincludedir@
++@@ -3843,7 +3838,7 @@ top_build_prefix = @top_build_prefix@
++ top_builddir = @top_builddir@
++ top_srcdir = @top_srcdir@
++ ALL_RECURSIVE_TARGETS = distcheck-hook check-root
++-SUBDIRS = po . gnulib-tests
+++SUBDIRS = po
++ changelog_etc = \
++ ChangeLog-2005 \
++ ChangeLog-2006 \
++@@ -5767,7 +5762,7 @@ all: $(BUILT_SOURCES)
++ .SUFFIXES: .1 .c .dvi .log .o .obj .pl .pl$(EXEEXT) .ps .sed .sh .sh$(EXEEXT) .sin .trs .x .xpl .xpl$(EXEEXT) .y
++ am--refresh: Makefile
++ @:
++-$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(top_srcdir)/doc/local.mk $(top_srcdir)/man/local.mk $(top_srcdir)/tests/local.mk $(am__configure_deps)
+++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(am__configure_deps)
++ @for dep in $?; do \
++ case '$(am__configure_deps)' in \
++ *$$dep*) \
++@@ -5790,7 +5785,7 @@ Makefile: $(srcdir)/Makefile.in $(top_bu
++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
++ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
++ esac;
++-$(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk $(top_srcdir)/doc/local.mk $(top_srcdir)/man/local.mk $(top_srcdir)/tests/local.mk:
+++$(top_srcdir)/lib/local.mk $(srcdir)/lib/gnulib.mk $(top_srcdir)/src/local.mk $(srcdir)/src/cu-progs.mk $(top_srcdir)/src/single-binary.mk:
++
++ $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
++ $(SHELL) ./config.status --recheck
+diff --git a/feeds/packages/utils/coreutils/patches/002-fix_compile_with_uclibc.patch b/feeds/packages/utils/coreutils/patches/002-fix_compile_with_uclibc.patch
+new file mode 100644
+index 0000000..94187e4
+--- /dev/null
++++ b/feeds/packages/utils/coreutils/patches/002-fix_compile_with_uclibc.patch
+@@ -0,0 +1,12 @@
++--- a/lib/pthread.in.h
+++++ b/lib/pthread.in.h
++@@ -252,6 +252,9 @@ pthread_mutex_unlock (pthread_mutex_t *m
++
++ /* Approximate spinlocks with mutexes. */
++
+++#ifdef __UCLIBC__
+++#define pthread_spinlock_t original_pthread_spinlock_t
+++#endif
++ typedef pthread_mutex_t pthread_spinlock_t;
++
++ _GL_PTHREAD_INLINE int
+diff --git a/feeds/packages/utils/crelay/Makefile b/feeds/packages/utils/crelay/Makefile
+new file mode 100644
+index 0000000..04fa0ae
+--- /dev/null
++++ b/feeds/packages/utils/crelay/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=crelay
++PKG_VERSION:=0.9
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/ondrej1024/crelay
++PKG_SOURCE_VERSION:=V$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/crelay
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=USB relay remote control daemon
++ URL:=http://github.com/ondrej1024/crelay
++ DEPENDS:=+libftdi1 +hidapi +libusb-1.0
++endef
++
++define Package/crelay/description
++ crelay is used to control different relay cards in a unified manner. It provides
++ several interfaces for controlling the relays locally or remotely by a web browser
++ or a smartphone. The card which is detected first will be used. A WebUI control is
++ availble on port 8000 (default)
++ .
++ Currently supported relay cards:
++ - Conrad USB 4-channel relay card
++ - Sainsmart USB 4-channel relay card
++ - Generic GPIO relays
++ - HID API compatible relay card
++endef
++
++define Build/Configure
++endef
++
++TARGET_CFLAGS+= \
++ -D_GNU_SOURCE \
++ -I$(STAGING_DIR)/usr/include/libftdi1 \
++ -I$(STAGING_DIR)/usr/include/hidapi
++
++TARGET_LDFLAGS+= $(if $(ICONV_FULL),-liconv)
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)/src \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS) $(EXTRA_LDFLAGS)"
++endef
++
++define Package/crelay/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/crelay $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/crelay.init $(1)/etc/init.d/crelay
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/conf/crelay.conf $(1)/etc
++endef
++
++$(eval $(call BuildPackage,crelay))
+diff --git a/feeds/packages/utils/crelay/files/crelay.init b/feeds/packages/utils/crelay/files/crelay.init
+new file mode 100644
+index 0000000..e003961
+--- /dev/null
++++ b/feeds/packages/utils/crelay/files/crelay.init
+@@ -0,0 +1,21 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++NAME=crelay
++START=93
++
++PROG=/usr/bin/${NAME}
++
++USE_PROCD=1
++
++# Custom relay labels (for Web GUI) are defined in /etc/crelay.conf
++
++start_service() {
++ procd_open_instance
++
++ procd_set_param command "$PROG"
++ # daemon mode (not daemonized) - starts HTTP server
++ procd_append_param command -d
++
++ procd_close_instance
++}
+diff --git a/feeds/packages/utils/crelay/patches/010-link_with_ftdi1.patch b/feeds/packages/utils/crelay/patches/010-link_with_ftdi1.patch
+new file mode 100644
+index 0000000..bc4ff1e
+--- /dev/null
++++ b/feeds/packages/utils/crelay/patches/010-link_with_ftdi1.patch
+@@ -0,0 +1,11 @@
++--- a/src/Makefile
+++++ b/src/Makefile
++@@ -45,7 +45,7 @@ endif
++ #ifdef DRV_SAINSMART
++ ifeq ($(DRV_SAINSMART), y)
++ SRC += relay_drv_sainsmart.c
++-LIBS += -lftdi
+++LIBS += -lftdi1
++ OPTS += -DDRV_SAINSMART
++ endif
++ #ifdef DRV_HIDAPI
+diff --git a/feeds/packages/utils/crelay/patches/020-link_using_LDFLAGS.patch b/feeds/packages/utils/crelay/patches/020-link_using_LDFLAGS.patch
+new file mode 100644
+index 0000000..9154b08
+--- /dev/null
++++ b/feeds/packages/utils/crelay/patches/020-link_using_LDFLAGS.patch
+@@ -0,0 +1,11 @@
++--- a/src/Makefile
+++++ b/src/Makefile
++@@ -61,7 +61,7 @@ all: $(BIN)
++
++ $(BIN): $(OBJ)
++ @echo "[Link $(BIN)] with libs $(LIBS)"
++- @$(CC) -o $(BIN) $(OBJ) $(LIBS)
+++ @$(CC) -o $(BIN) $(OBJ) $(LDFLAGS) $(LIBS)
++
++ .c.o:
++ @echo "[Compile $<]"
+diff --git a/feeds/packages/utils/cryptodev-linux/Makefile b/feeds/packages/utils/cryptodev-linux/Makefile
+new file mode 100644
+index 0000000..507cf4f
+--- /dev/null
++++ b/feeds/packages/utils/cryptodev-linux/Makefile
+@@ -0,0 +1,75 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++# $Id$
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=cryptodev-linux
++PKG_VERSION:=1.7
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://download.gna.org/cryptodev-linux/
++PKG_MD5SUM:=0b63b3481cf2c90386b35f057481d36b
++
++PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++CRYPTODEV_AUTOLOAD:= \
++ cryptodev
++
++define KernelPackage/cryptodev
++ SUBMENU:=Cryptographic API modules
++ DEFAULT:=m if ALL
++ TITLE:=Driver for cryptographic acceleration
++ URL:=http://cryptodev-linux.org/
++ MAINTAINER:=Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
++ VERSION:=$(LINUX_VERSION)+$(PKG_VERSION)-$(BOARD)-$(PKG_RELEASE)
++ DEPENDS:=+kmod-crypto-core +kmod-crypto-authenc +kmod-crypto-hash
++ FILES:= \
++ $(PKG_BUILD_DIR)/cryptodev.$(LINUX_KMOD_SUFFIX)
++ AUTOLOAD:=$(call AutoLoad,50,$(CRYPTODEV_AUTOLOAD))
++endef
++
++define KernelPackage/cryptodev/description
++ This is a driver for that allows to use the Linux kernel supported
++ hardware ciphers by user-space applications.
++endef
++
++CRYPTODEV_MAKEOPTS= -C $(PKG_BUILD_DIR) \
++ PATH="$(TARGET_PATH)" \
++ ARCH="$(LINUX_KARCH)" \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ TOOLPREFIX="$(KERNEL_CROSS)" \
++ TOOLPATH="$(KERNEL_CROSS)" \
++ KERNEL_DIR="$(LINUX_DIR)" \
++ LDOPTS=" " \
++ DOMULTI=1
++
++define Build/Compile/cryptodev
++ $(MAKE) $(CRYPTODEV_MAKEOPTS)
++endef
++
++define Build/Compile
++ $(call Build/Compile/cryptodev)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/include/crypto
++ $(CP) $(PKG_BUILD_DIR)/crypto/cryptodev.h $(STAGING_DIR)/usr/include/crypto/
++endef
++
++define KernelPackage/cryptodev/install
++ $(INSTALL_DIR) $(1)/etc/modules.d
++ $(INSTALL_DATA) ./files/cryptodev.modules $(1)/etc/modules.d/80-cryptodev
++ $(INSTALL_DIR) $(1)/lib/modules/$(LINUX_VERSION)
++ $(INSTALL_DIR) $(1)/usr/sbin
++endef
++
++$(eval $(call KernelPackage,cryptodev))
+diff --git a/feeds/packages/utils/cryptodev-linux/files/cryptodev.modules b/feeds/packages/utils/cryptodev-linux/files/cryptodev.modules
+new file mode 100644
+index 0000000..fb39fcd
+--- /dev/null
++++ b/feeds/packages/utils/cryptodev-linux/files/cryptodev.modules
+@@ -0,0 +1 @@
++cryptodev
+diff --git a/feeds/packages/utils/cryptodev-linux/patches/001-no-get-unused-fd.patch b/feeds/packages/utils/cryptodev-linux/patches/001-no-get-unused-fd.patch
+new file mode 100644
+index 0000000..e3308bb
+--- /dev/null
++++ b/feeds/packages/utils/cryptodev-linux/patches/001-no-get-unused-fd.patch
+@@ -0,0 +1,13 @@
++Index: cryptodev-linux-1.7/ioctl.c
++===================================================================
++--- cryptodev-linux-1.7.orig/ioctl.c
+++++ cryptodev-linux-1.7/ioctl.c
++@@ -546,7 +546,7 @@ static int
++ clonefd(struct file *filp)
++ {
++ int ret;
++- ret = get_unused_fd();
+++ ret = get_unused_fd_flags(0);
++ if (ret >= 0) {
++ get_file(filp);
++ fd_install(ret, filp);
+diff --git a/feeds/packages/utils/cryptsetup/Makefile b/feeds/packages/utils/cryptsetup/Makefile
+new file mode 100644
+index 0000000..fb7fc12
+--- /dev/null
++++ b/feeds/packages/utils/cryptsetup/Makefile
+@@ -0,0 +1,78 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=cryptsetup
++PKG_VERSION:=1.6.7
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0+ LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING COPYING.LGPL
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@KERNEL/linux/utils/cryptsetup/v1.6
++PKG_MD5SUM:=918406eb5d2e2f5a7348c432ea9b1473
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_LDFLAGS+=-Wl,-rpath-link=$(STAGING_DIR)/usr/lib
++
++define Package/cryptsetup/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Cryptsetup
++ DEPENDS:=+libblkid +libuuid +libpopt +lvm2 +libdevmapper +@KERNEL_DIRECT_IO
++ URL:=http://code.google.com/p/cryptsetup/
++endef
++
++define Package/cryptsetup
++$(call Package/cryptsetup/Default)
++ DEPENDS+=+libgcrypt
++ VARIANT:=gcrypt
++endef
++
++define Package/cryptsetup-openssl
++$(call Package/cryptsetup/Default)
++ TITLE+= (with openssl support)
++ DEPENDS+=+libopenssl
++ VARIANT:=openssl
++endef
++
++define Package/cryptsetup/Default/description
++ Cryptsetup-luks
++endef
++
++define Package/cryptsetup/description
++$(call Package/cryptsetup/Default/description)
++linked against libgcrypt
++endef
++
++
++define Package/cryptsetup-openssl/description
++$(call Package/cryptsetup/Default/description)
++linked against openssl
++endef
++
++ifeq ($(BUILD_VARIANT),openssl)
++CONFIGURE_ARGS+= \
++ --with-crypto_backend=openssl
++endif
++
++define Package/cryptsetup/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_BUILD_DIR)/src/.libs/cryptsetup $(1)/usr/sbin
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/lib/.libs/libcryptsetup.so* $(1)/usr/lib
++endef
++
++Package/cryptsetup-openssl/install = $(Package/cryptsetup/install)
++
++$(eval $(call BuildPackage,cryptsetup))
++$(eval $(call BuildPackage,cryptsetup-openssl))
+diff --git a/feeds/packages/utils/dbus/Makefile b/feeds/packages/utils/dbus/Makefile
+new file mode 100644
+index 0000000..15e3436
+--- /dev/null
++++ b/feeds/packages/utils/dbus/Makefile
+@@ -0,0 +1,214 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++# Make sure to also update the dbus-x package
++PKG_NAME:=dbus
++PKG_VERSION:=1.10.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://dbus.freedesktop.org/releases/dbus/
++PKG_MD5SUM:=5af6297348107a906c8449817a728b3b
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=AFL-2.1
++
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_LDFLAGS+= \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib \
++
++define Package/dbus/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Simple interprocess messaging system
++ URL:=http://dbus.freedesktop.org/
++endef
++
++define Package/dbus/Default/description
++ D-Bus is a message bus system, a simple way for applications to talk to one
++ another. In addition to interprocess communication, D-Bus helps coordinate
++ process lifecycle; it makes it simple and reliable to code a "single instance"
++ application or daemon, and to launch applications and daemons on demand when
++ their services are needed.
++endef
++
++define Package/libdbus
++$(call Package/dbus/Default)
++ CATEGORY:=Libraries
++ TITLE+= (library)
++ DEPENDS:= +libpthread
++endef
++
++define Package/libdbus/Description
++$(call Package/dbus/Default/description)
++ This package contains the D-Bus shared library.
++endef
++
++define Package/dbus
++$(call Package/dbus/Default)
++ TITLE+= (daemon)
++ DEPENDS:= +libexpat +libdbus
++endef
++
++define Package/dbus/Description
++$(call Package/dbus/Default/description)
++ This package contains the D-Bus daemon.
++endef
++
++define Package/dbus-utils
++$(call Package/dbus/Default)
++ TITLE+= (utilities)
++ DEPENDS:= dbus
++endef
++
++define Package/dbus-utils/Description
++$(call Package/dbus/Default/description)
++ This package contains D-Bus utilities.
++endef
++
++
++define Build/Prepare
++ $(Build/Prepare/Default)
++ $(SED) 's/-Wl,--gc-sections/--gc-sections/' $(PKG_BUILD_DIR)/configure
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-abstract-sockets \
++ --disable-ansi \
++ --disable-asserts \
++ --disable-console-owner-file \
++ --disable-doxygen-docs \
++ --disable-compiler_coverage \
++ --disable-selinux \
++ --disable-tests \
++ --disable-verbose-mode \
++ --disable-xml-docs \
++ --with-xml="expat" \
++ --with-dbus-user=root \
++ --with-dbus-daemondir="/usr/sbin" \
++ --with-system-socket="/var/run/dbus/system_bus_socket" \
++ --with-system-pid-file="/var/run/dbus.pid" \
++ --without-x \
++ --libexecdir=/usr/lib/dbus-1
++
++CONFIGURE_VARS+= \
++ ac_cv_have_abstract_sockets="yes" \
++ ac_cv_lib_expat_XML_ParserCreate_MM="yes" \
++
++HOST_CONFIGURE_ARGS+= \
++ --enable-shared \
++ --enable-static \
++ --disable-abstract-sockets \
++ --disable-ansi \
++ --disable-asserts \
++ --disable-console-owner-file \
++ --disable-docygen-docs \
++ --disable-compiler_coverage \
++ --disable-selinux \
++ --disable-tests \
++ --disable-verbose-mode \
++ --disable-xml-docs \
++ --with-dbus-user=root \
++ --with-dbus-daemondir="$(STAGIND_DIR_HOST)/bin" \
++ --with-system-socket="$(STAGING_DIR_HOST)/var/run/dbus/system_bus_socket" \
++ --with-system-pid-file="$(STAGING_DIR_HOST)/var/run/dbus.pid" \
++ --without-x \
++ --libexecdir="$(STAGING_DIR_HOST)/lib/dbus-1"
++
++HOST_CONFIGURE_VARS+= \
++ ac_cv_have_abstract_sockets="yes" \
++ ac_cv_lib_expat_XML_ParserCreate_MM="yes" \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/dbus-1.0 \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib/dbus-1.0/include/dbus/
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/dbus-1.0/include/dbus/*.h \
++ $(1)/usr/lib/dbus-1.0/include/dbus/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/libdbus-1.{so*,la,a} \
++ $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/dbus-1.0 \
++ $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(INSTALL_DATA) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/dbus-1.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/dbus/conffiles
++/etc/dbus-1/session.conf
++/etc/dbus-1/system.conf
++endef
++
++define Package/libdbus/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/libdbus-1.so.* \
++ $(1)/usr/lib/
++endef
++
++define Package/dbus/install
++ $(INSTALL_DIR) $(1)/usr/share
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/share/dbus-1 \
++ $(1)/usr/share/
++
++ $(INSTALL_DIR) $(1)/usr/lib/dbus-1
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/lib/dbus-1/dbus-daemon-launch-helper \
++ $(1)/usr/lib/dbus-1/
++
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/sbin/dbus-daemon \
++ $(1)/usr/sbin/
++
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/dbus-uuidgen \
++ $(1)/usr/bin/
++
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/dbus-launch \
++ $(1)/usr/bin/dbus-launch.real
++ $(INSTALL_BIN) \
++ ./files/dbus-launch \
++ $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) \
++ ./files/dbus.init \
++ $(1)/etc/init.d/dbus
++endef
++
++define Package/dbus-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/dbus-{send,monitor,cleanup-sockets} \
++ $(1)/usr/bin/
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,libdbus))
++$(eval $(call BuildPackage,dbus))
++$(eval $(call BuildPackage,dbus-utils))
+diff --git a/feeds/packages/utils/dbus/files/dbus-launch b/feeds/packages/utils/dbus/files/dbus-launch
+new file mode 100644
+index 0000000..7c3f922
+--- /dev/null
++++ b/feeds/packages/utils/dbus/files/dbus-launch
+@@ -0,0 +1,12 @@
++#!/bin/sh
++#
++# Simple wrapper script which allows us to build dbus without general x support
++# If an application needs x support in dbus-launch it has to depend on the
++# dbus-launch-x package. The script is used to prefer dbus-launch with x over
++# the dbus-lauch without x.
++
++if [ -f /usr/bin/dbus-launch-x ]; then
++ exec /usr/bin/dbus-launch-x $@
++else
++ exec /usr/bin/dbus-launch.real $@
++fi
+diff --git a/feeds/packages/utils/dbus/files/dbus.init b/feeds/packages/utils/dbus/files/dbus.init
+new file mode 100644
+index 0000000..4294083
+--- /dev/null
++++ b/feeds/packages/utils/dbus/files/dbus.init
+@@ -0,0 +1,17 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007-2011 OpenWrt.org
++
++START=60
++
++SERVICE_PID_FILE=/var/run/dbus.pid
++
++start() {
++ mkdir -m 0755 -p /var/lib/dbus
++ mkdir -m 0755 -p /var/run/dbus
++ [ -x /usr/bin/dbus-uuidgen ] && /usr/bin/dbus-uuidgen --ensure
++ service_start /usr/sbin/dbus-daemon --system
++}
++
++stop() {
++ service_stop /usr/sbin/dbus-daemon && rm $SERVICE_PID_FILE
++}
+diff --git a/feeds/packages/utils/dbus/patches/100-fix-poll-select.patch b/feeds/packages/utils/dbus/patches/100-fix-poll-select.patch
+new file mode 100644
+index 0000000..64f6525
+--- /dev/null
++++ b/feeds/packages/utils/dbus/patches/100-fix-poll-select.patch
+@@ -0,0 +1,13 @@
++Index: dbus-1.9.4/tools/tool-common.c
++===================================================================
++--- dbus-1.9.4.orig/tools/tool-common.c
+++++ dbus-1.9.4/tools/tool-common.c
++@@ -29,6 +29,8 @@
++ #include <string.h>
++ #include <time.h>
++
+++#include <sys/select.h>
+++
++ #ifdef DBUS_WIN
++ #include <windows.h>
++ #endif
+diff --git a/feeds/packages/utils/dfu-programmer/Makefile b/feeds/packages/utils/dfu-programmer/Makefile
+new file mode 100644
+index 0000000..153c69f
+--- /dev/null
++++ b/feeds/packages/utils/dfu-programmer/Makefile
+@@ -0,0 +1,45 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dfu-programmer
++PKG_VERSION:=0.7.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.sourceforge.net/project/dfu-programmer/dfu-programmer/$(PKG_VERSION)/
++PKG_MD5SUM:=98641b0a7cf1cc8c8be3584d5552f6d8
++
++PKG_MAINTAINER:=Stefan Hellermann <stefan@the2masters.de>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/dfu-programmer
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=USB programmer for Atmel microcontrollers
++ URL:=http://dfu-programmer.github.io/
++ DEPENDS:=+libusb-1.0
++endef
++
++define Package/dfu-programmer/description
++ dfu-programmer is a Device Firmware Update (DFU) based USB programmer
++ for Atmel chips with a USB bootloader.
++endef
++
++define Package/dfu-programmer/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/$(PKG_NAME) $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,dfu-programmer))
+diff --git a/feeds/packages/utils/dmidecode/Makefile b/feeds/packages/utils/dmidecode/Makefile
+new file mode 100644
+index 0000000..2dda5a0
+--- /dev/null
++++ b/feeds/packages/utils/dmidecode/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dmidecode
++PKG_VERSION:=3.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://download.savannah.gnu.org/releases/dmidecode
++PKG_MD5SUM:=be7501ad0f844e875976b96106afaa3c
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/dmidecode
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=@(TARGET_x86||TARGET_x86_64)
++ TITLE:=Displays BIOS informations.
++ URL:=http://www.nongnu.org/dmidecode/
++endef
++
++define Package/dmidecode/description
++ Dmidecode reports information about your system's hardware
++ as described in your system BIOS according to the SMBIOS/DMI
++ standard.
++endef
++
++MAKE_FLAGS += \
++ prefix="/usr"
++
++define Package/dmidecode/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/$(PKG_NAME) $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,dmidecode))
+diff --git a/feeds/packages/utils/dosfstools/Makefile b/feeds/packages/utils/dosfstools/Makefile
+new file mode 100644
+index 0000000..41483f2
+--- /dev/null
++++ b/feeds/packages/utils/dosfstools/Makefile
+@@ -0,0 +1,109 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dosfstools
++PKG_VERSION:=3.0.27
++PKG_RELEASE:=1
++
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_MAINTAINER:=David Bonnes <david.bonnes@gmail.com>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://daniel-baumann.ch/files/software/dosfstools \
++ http://fossies.org/linux/misc
++PKG_MD5SUM:=2e31e7bdf92998e41ed17de505a4a552
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/dosfstools/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ URL:=http://www.daniel-baumann.ch/software/dosfstools/
++ SUBMENU:=Filesystem
++ DEPENDS:=$(ICONV_DEPENDS)
++endef
++
++define Package/dosfsck
++ $(call Package/dosfstools/Default)
++ TITLE:=fsck (fsck.fat) utility from dosfstools
++endef
++
++define Package/dosfslabel
++ $(call Package/dosfstools/Default)
++ TITLE:=fslabel (fatlabel) utility from dosfstools
++endef
++
++define Package/mkdosfs
++ $(call Package/dosfstools/Default)
++ TITLE:=mkfs (mkfs.fat) utility from dosfstools
++endef
++
++define Package/dosfsck/description
++ Utilities to create and check MS-DOS FAT filesystems.
++ (fsck.vfat and fsck.fat for checking integrity of FAT volumes)
++endef
++
++define Package/dosfslabel/description
++ Utilities to create and check MS-DOS FAT filesystems.
++ (fatlabel for reading and writing labels of FAT volumes)
++endef
++
++define Package/mkdosfs/description
++ Utilities to create and check MS-DOS FAT filesystems.
++ (mkfs.vfat and mkfs.fat for creating FAT volumes)
++endef
++
++LDFLAGS+=$(ICONV_LDFLAGS)
++LDLIBS+=-liconv
++
++define Build/Configure
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ OPTFLAGS="$(TARGET_CFLAGS) -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE" \
++ PREFIX="/usr" \
++ SBINDIR="/usr/sbin" \
++ LDFLAGS="$(LDFLAGS)" \
++ LDLIBS="$(LDLIBS)" \
++ all
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ OPTFLAGS="$(TARGET_CFLAGS) -D_FILE_OFFSET_BITS=64" \
++ PREFIX="$(PKG_INSTALL_DIR)/usr" \
++ SBINDIR="$(PKG_INSTALL_DIR)/usr/sbin" \
++ install-bin
++endef
++
++define Package/dosfsck/install
++ $(INSTALL_DIR) $(1)/lib/functions/fsck
++ $(INSTALL_DATA) ./files/dosfsck.sh $(1)/lib/functions/fsck/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/fsck.fat $(1)/usr/sbin/
++ (cd $(1)/usr/sbin; ln -sf fsck.fat fsck.msdos; ln -sf fsck.fat fsck.vfat; ln -sf fsck.fat dosfsck)
++endef
++
++define Package/dosfslabel/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/fatlabel $(1)/usr/sbin/
++endef
++
++define Package/mkdosfs/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/mkfs.fat $(1)/usr/sbin/
++ (cd $(1)/usr/sbin; ln -sf mkfs.fat mkfs.msdos; ln -sf mkfs.fat mkfs.vfat)
++endef
++
++$(eval $(call BuildPackage,dosfsck))
++$(eval $(call BuildPackage,dosfslabel))
++$(eval $(call BuildPackage,mkdosfs))
+diff --git a/feeds/packages/utils/dosfstools/files/dosfsck.sh b/feeds/packages/utils/dosfstools/files/dosfsck.sh
+new file mode 100644
+index 0000000..bcc29b9
+--- /dev/null
++++ b/feeds/packages/utils/dosfstools/files/dosfsck.sh
+@@ -0,0 +1,30 @@
++#!/bin/sh
++# Copyright 2010 Vertical Communications
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++fsck_dosfsck() {
++ dosfsck -p "$device" 2>&1 | logger -t "fstab: dosfsck ($device)"
++ local status="$?"
++ case "$status" in
++ 0|1) ;; #success
++ 2) reboot;;
++ 4) echo "dosfsck ($device): Warning! Uncorrected errors."| logger -t fstab
++ return 1
++ ;;
++ *) echo "dosfsck ($device): Error $status. Check not complete."| logger -t fstab;;
++ esac
++ return 0
++}
++
++fsck_dos() {
++ fsck_dosfsck "$@"
++}
++
++fsck_vfat() {
++ fsck_dosfsck "$@"
++}
++
++append libmount_known_fsck "dos"
++append libmount_known_fsck "vfat"
+diff --git a/feeds/packages/utils/dump1090/Makefile b/feeds/packages/utils/dump1090/Makefile
+new file mode 100644
+index 0000000..74acd12
+--- /dev/null
++++ b/feeds/packages/utils/dump1090/Makefile
+@@ -0,0 +1,75 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dump1090
++PKG_VERSION:=2015-10-08
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/mutability/dump1090.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=c55c71b57cf34e90d95afd52449a05a4b6dbda03
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING LICENSE
++
++PKG_BUILD_DEPENDS:=librtlsdr
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/dump1090/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Mode S decoder for the Realtek RTL2832U
++ URL:=https://github.com/mutability/dump1090
++ DEPENDS:=+libpthread
++endef
++
++define Package/dump1090
++ $(call Package/dump1090/Default)
++ TITLE+= (dump1090)
++ DEPENDS+= +librtlsdr
++endef
++
++define Package/view1090
++ $(call Package/dump1090/Default)
++ TITLE+= (view1090)
++endef
++
++define Package/dump1090/description
++ Dump1090 is a Mode S decoder specifically designed for RTLSDR devices.
++endef
++
++define Package/view1090/description
++ View1090 is a Mode S messages viewer for dump1090 devices.
++endef
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS)"
++
++define Package/dump1090/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) files/dump1090.init $(1)/etc/init.d/dump1090
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) files/dump1090.config $(1)/etc/config/dump1090
++ $(INSTALL_DIR) $(1)/usr/share/dump1090
++ $(CP) $(PKG_BUILD_DIR)/public_html/* $(1)/usr/share/dump1090
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/dump1090 $(1)/usr/bin
++endef
++
++define Package/view1090/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/view1090 $(1)/usr/bin
++endef
++
++$(eval $(call BuildPackage,dump1090))
++$(eval $(call BuildPackage,view1090))
+diff --git a/feeds/packages/utils/dump1090/files/dump1090.config b/feeds/packages/utils/dump1090/files/dump1090.config
+new file mode 100644
+index 0000000..8fd6d42
+--- /dev/null
++++ b/feeds/packages/utils/dump1090/files/dump1090.config
+@@ -0,0 +1,53 @@
++config dump1090 main
++ option disabled '1'
++ option respawn '1'
++ option device_index ''
++ option gain ''
++ option enable_agc '0'
++ option freq ''
++ option ifile ''
++ option iformat ''
++ option throttle '0'
++ option raw '0'
++ option net '1'
++ option modeac '0'
++ option net_beast '0'
++ option net_only '0'
++ option net_bind_address ''
++ option net_http_port '8080'
++ option net_ri_port ''
++ option net_ro_port ''
++ option net_sbs_port ''
++ option net_bi_port ''
++ option net_bo_port ''
++ option net_fatsv_port ''
++ option net_ro_size ''
++ option net_ro_interval ''
++ option net_heartbeat ''
++ option net_buffer ''
++ option net_verbatim '0'
++ option forward_mlat '0'
++ option lat ''
++ option lon ''
++ option max_range ''
++ option fix '0'
++ option no_fix '0'
++ option no_crc_check '0'
++ option phase_enhance '0'
++ option agressive '0'
++ option mlat '0'
++ option stats '0'
++ option stats_range '0'
++ option stats_every ''
++ option onlyaddr '0'
++ option metric '0'
++ option snip ''
++ option debug ''
++ option ppm ''
++ option html_dir '/usr/share/dump1090'
++ option write_json ''
++ option write_json_every ''
++ option json_location_accuracy ''
++ option oversample '0'
++ option dcfilter '0'
++ option measure_noise '0'
+diff --git a/feeds/packages/utils/dump1090/files/dump1090.init b/feeds/packages/utils/dump1090/files/dump1090.init
+new file mode 100644
+index 0000000..8a3e2b2
+--- /dev/null
++++ b/feeds/packages/utils/dump1090/files/dump1090.init
+@@ -0,0 +1,106 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014-2015 OpenWrt.org
++
++START=90
++STOP=10
++USE_PROCD=1
++
++append_arg() {
++ local cfg="$1"
++ local var="$2"
++ local opt="$3"
++ local def="$4"
++ local val
++
++ config_get val "$cfg" "$var"
++ [ -n "$val" -o -n "$def" ] && procd_append_param command $opt "${val:-$def}"
++}
++
++append_bool() {
++ local cfg="$1"
++ local var="$2"
++ local opt="$3"
++ local def="$4"
++ local val
++
++ config_get_bool val "$cfg" "$var" "$def"
++ [ "$val" = 1 ] && procd_append_param command "$opt"
++}
++
++start_instance() {
++ local cfg="$1"
++ local aux
++
++ config_get_bool aux "$cfg" 'disabled' '0'
++ [ "$aux" = 1 ] && return 1
++
++ procd_open_instance
++
++ procd_set_param command /usr/bin/dump1090
++ procd_append_param command "--quiet"
++
++ append_arg "$cfg" device_index "--device-index"
++ append_arg "$cfg" gain "--gain"
++ append_bool "$cfg" enable_agc "--enable-agc"
++ append_arg "$cfg" freq "--freq"
++ append_arg "$cfg" ifile "--ifile"
++ append_arg "$cfg" iformat "--iformat"
++ append_bool "$cfg" throttle "--throttle"
++ append_bool "$cfg" raw "--raw"
++ append_bool "$cfg" net "--net"
++ append_bool "$cfg" modeac "--modeac"
++ append_bool "$cfg" net_beast "--net-beast"
++ append_bool "$cfg" net_only "--net-only"
++ append_arg "$cfg" net_bind_address "--net-bind-address"
++ append_arg "$cfg" net_http_port "--net-http-port"
++ append_arg "$cfg" net_ri_port "--net-ri-port"
++ append_arg "$cfg" net_ro_port "--net-ro-port"
++ append_arg "$cfg" net_sbs_port "--net-sbs-port"
++ append_arg "$cfg" net_bi_port "--net-bi-port"
++ append_arg "$cfg" net_bo_port "--net-bo-port"
++ append_arg "$cfg" net_fatsv_port "net-fatsv-port"
++ append_arg "$cfg" net_ro_size "--net-ro-size"
++ append_arg "$cfg" net_ro_interval "--net-ro-interval"
++ append_arg "$cfg" net_heartbeat "--net-heartbeat"
++ append_arg "$cfg" net_buffer "--net-buffer"
++ append_bool "$cfg" net_verbatim "--net-verbatim"
++ append_bool "$cfg" forward_mlat "--forward-mlat"
++ append_arg "$cfg" lat "--lat"
++ append_arg "$cfg" lon "--lon"
++ append_arg "$cfg" max_range "--max-range"
++ append_bool "$cfg" fix "--fix"
++ append_bool "$cfg" no_fix "--no-fix"
++ append_bool "$cfg" no_crc_check "--no-crc-check"
++ append_bool "$cfg" phase_enhance "--phase-enhance"
++ append_bool "$cfg" agressive "--agressive"
++ append_bool "$cfg" mlat "--mlat"
++ append_bool "$cfg" stats "--stats"
++ append_bool "$cfg" stats_range "--stats-range"
++ append_arg "$cfg" stats_every "--stats-every"
++ append_bool "$cfg" onlyaddr "--onlyaddr"
++ append_bool "$cfg" metric "--metric"
++ append_arg "$cfg" snip "--snip"
++ append_arg "$cfg" debug "--debug"
++ append_arg "$cfg" ppm "--ppm"
++ append_arg "$cfg" html_dir "--html-dir"
++ append_arg "$cfg" write_json "--write-json"
++ append_arg "$cfg" write_json_every "write-json-every"
++ append_arg "$cfg" json_location_accuracy "--json-location-accuracy"
++ append_bool "$cfg" oversample "--oversample"
++ append_bool "$cfg" dcfilter "--dcfilter"
++ append_bool "$cfg" measure_noise "--measure-noise"
++
++ config_get_bool aux "$cfg" 'respawn' '0'
++ [ "$aux" = 1 ] && procd_set_param respawn
++
++ procd_close_instance
++}
++
++service_triggers() {
++ procd_add_reload_trigger "dump1090"
++}
++
++start_service() {
++ config_load dump1090
++ config_foreach start_instance dump1090
++}
+diff --git a/feeds/packages/utils/f2fs-tools/Config.in b/feeds/packages/utils/f2fs-tools/Config.in
+new file mode 100644
+index 0000000..0c7ecab
+--- /dev/null
++++ b/feeds/packages/utils/f2fs-tools/Config.in
+@@ -0,0 +1,25 @@
++menu "Configuration"
++ depends on PACKAGE_f2fs-tools
++
++config F2FS_UTILS_f2fstat
++ bool "Install f2fstat utility"
++ default y
++
++config F2FS_UTILS_fibmap_f2fs
++ bool "Install fibmap.f2fs utility"
++ default y
++
++config F2FS_UTILS_fsck_f2fs
++ bool "Install fsck.f2fs utility"
++ default y
++
++config F2FS_UTILS_dump_f2fs
++ bool "Install dump.f2fs utility"
++ select F2FS_UTILS_fsck_f2fs
++ default y
++
++config F2FS_UTILS_mkfs_f2fs
++ bool "Install mkfs.f2fs utility"
++ default y
++
++endmenu
+diff --git a/feeds/packages/utils/f2fs-tools/Makefile b/feeds/packages/utils/f2fs-tools/Makefile
+new file mode 100644
+index 0000000..62d5155
+--- /dev/null
++++ b/feeds/packages/utils/f2fs-tools/Makefile
+@@ -0,0 +1,89 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=f2fs-tools
++PKG_VERSION:=1.4.0
++PKG_RELEASE:=1
++
++PKG_LICENSE:=GPLv2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://git.kernel.org/cgit/linux/kernel/git/jaegeuk/f2fs-tools.git/snapshot/
++PKG_MD5SUM:=be9bfdddf3e5fd5e701a88d0b388dc26
++
++PKG_FIXUP:=autoreconf
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/f2fs-tools
++ SECTION:=utils
++ CATEGORY:=Utilities
++ SUBMENU:=Filesystem
++ TITLE:=Tools for Flash-Friendly File System (F2FS)
++ DEPENDS:=+libuuid +libf2fs
++ URL:=http://git.kernel.org/cgit/linux/kernel/git/jaegeuk/f2fs-tools.git
++ MENU:=1
++endef
++
++define Package/libf2fs
++ $(call Package/lxc/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Library for Flash-Friendly File System (F2FS) tools
++ DEPENDS:=
++endef
++
++define Package/f2fs-tools/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/libf2fs/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libf2fs.so* $(1)/usr/lib/
++endef
++
++define Package/f2fs-tools/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++
++ifeq ($(CONFIG_F2FS_UTILS_f2fstat),y)
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/sbin/f2fstat $(1)/usr/sbin
++endif
++
++ifeq ($(CONFIG_F2FS_UTILS_fibmap_f2fs),y)
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/sbin/fibmap.f2fs $(1)/usr/sbin
++endif
++
++ifeq ($(CONFIG_F2FS_UTILS_fsck_f2fs),y)
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/sbin/fsck.f2fs $(1)/usr/sbin
++endif
++
++ifeq ($(CONFIG_F2FS_UTILS_dump_f2fs),y)
++ ln -s /usr/sbin/fsck.f2fs $(1)/usr/sbin/dump.f2fs
++endif
++
++ifeq ($(CONFIG_F2FS_UTILS_mkfs_f2fs),y)
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/sbin/mkfs.f2fs $(1)/usr/sbin
++endif
++
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_BUILD_DIR)/include/*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libf2fs.so* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libf2fs.a $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libf2fs))
++$(eval $(call BuildPackage,f2fs-tools))
+diff --git a/feeds/packages/utils/f2fs-tools/patches/001-compile.patch b/feeds/packages/utils/f2fs-tools/patches/001-compile.patch
+new file mode 100644
+index 0000000..2ff6ee8
+--- /dev/null
++++ b/feeds/packages/utils/f2fs-tools/patches/001-compile.patch
+@@ -0,0 +1,19 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -20,14 +20,9 @@ AC_DEFINE([F2FS_MINOR_VERSION], m4_bpats
++ [\([0-9]*\).\([0-9]*\)\(\w\|\W\)*], [\2]),
++ [Minor version for f2fs-tools])
++
++-AC_CHECK_FILE(.git,
++- AC_DEFINE([F2FS_TOOLS_DATE],
++- "m4_bpatsubst(f2fs_tools_gitdate,
++- [\([0-9-]*\)\(\w\|\W\)*], [\1])",
++- [f2fs-tools date based on Git commits]),
++- AC_DEFINE([F2FS_TOOLS_DATE],
+++AC_DEFINE([F2FS_TOOLS_DATE],
++ "f2fs_tools_date",
++- [f2fs-tools date based on Source releases]))
+++ [f2fs-tools date based on Source releases])
++
++ AC_CONFIG_SRCDIR([config.h.in])
++ AC_CONFIG_HEADER([config.h])
+diff --git a/feeds/packages/utils/f2fs-tools/patches/010-include-byteswap-h.patch b/feeds/packages/utils/f2fs-tools/patches/010-include-byteswap-h.patch
+new file mode 100644
+index 0000000..b8c9ff3
+--- /dev/null
++++ b/feeds/packages/utils/f2fs-tools/patches/010-include-byteswap-h.patch
+@@ -0,0 +1,10 @@
++--- a/include/f2fs_fs.h
+++++ b/include/f2fs_fs.h
++@@ -12,6 +12,7 @@
++ #include <inttypes.h>
++ #include <linux/types.h>
++ #include <sys/types.h>
+++#include <byteswap.h>
++
++ #ifdef HAVE_CONFIG_H
++ #include <config.h>
+diff --git a/feeds/packages/utils/flashrom/Makefile b/feeds/packages/utils/flashrom/Makefile
+new file mode 100644
+index 0000000..e6e38b4
+--- /dev/null
++++ b/feeds/packages/utils/flashrom/Makefile
+@@ -0,0 +1,109 @@
++#
++# Copyright (C) 2010-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=flashrom
++PKG_VERSION:=0.9.8
++PKG_RELEASE:=5
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://download.flashrom.org/releases
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_MD5SUM:=ac513076b63ab7eb411a7694bb8f6fda
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_SOURCE_SUBDIR)
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include flashrom.mk
++
++TARGET_CFLAGS+= \
++ -std=gnu89
++
++MAKE_FLAGS+= \
++ PREFIX="/usr"
++
++define Package/flashrom/default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=FlashROM Utility
++ URL:=http://www.flashrom.org/
++endef
++
++define Package/flashrom
++ $(Package/flashrom/default)
++ TITLE+= (full)
++ DEPENDS+= \
++ +(PACKAGE_flashrom&&(TARGET_x86||TARGET_x86_64)):dmidecode \
++ +PACKAGE_flashrom:libftdi \
++ +PACKAGE_flashrom:libusb-compat \
++ +PACKAGE_flashrom:pciutils
++ VARIANT:=full
++ DEFAULT_VARIANT:=1
++endef
++
++define Package/flashrom-pci
++ $(Package/flashrom/default)
++ TITLE+= (pci)
++ DEPENDS+= \
++ +(PACKAGE_flashrom-pci&&(TARGET_x86||TARGET_x86_64)):dmidecode \
++ +PACKAGE_flashrom-pci:pciutils
++ VARIANT:=pci
++endef
++
++define Package/flashrom-spi
++ $(Package/flashrom/default)
++ TITLE+= (spi)
++ VARIANT:=spi
++endef
++
++define Package/flashrom-usb
++ $(Package/flashrom/default)
++ TITLE+= (usb)
++ DEPENDS+= \
++ +PACKAGE_flashrom-usb:libftdi \
++ +PACKAGE_flashrom-usb:libusb-compat
++ VARIANT:=usb
++endef
++
++define Package/flashrom/default/description
++ flashrom is an utility for identifying, reading, writing, verifying
++ and erasing flash chips. It's often used to flash BIOS/EFI/coreboot
++ /firmware images.
++endef
++Package/flashrom/description = $(Package/flashrom/default/description)
++Package/flashrom-pci/description = $(Package/flashrom/default/description)
++Package/flashrom-spi/description = $(Package/flashrom/default/description)
++Package/flashrom-usb/description = $(Package/flashrom/default/description)
++
++define Package/flashrom/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/flashrom $(1)/usr/sbin/flashrom
++endef
++define Package/flashrom-pci/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/flashrom $(1)/usr/sbin/flashrom-pci
++endef
++define Package/flashrom-spi/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/flashrom $(1)/usr/sbin/flashrom-spi
++endef
++define Package/flashrom-usb/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/flashrom $(1)/usr/sbin/flashrom-usb
++endef
++
++$(eval $(call BuildPackage,flashrom))
++$(eval $(call BuildPackage,flashrom-pci))
++$(eval $(call BuildPackage,flashrom-spi))
++$(eval $(call BuildPackage,flashrom-usb))
+diff --git a/feeds/packages/utils/flashrom/flashrom.mk b/feeds/packages/utils/flashrom/flashrom.mk
+new file mode 100644
+index 0000000..0ca82b6
+--- /dev/null
++++ b/feeds/packages/utils/flashrom/flashrom.mk
+@@ -0,0 +1,88 @@
++# Flashrom variants
++
++define DefaultProgrammer
++ MAKE_FLAGS += CONFIG_DEFAULT_PROGRAMMER=PROGRAMMER_$(1)
++endef
++define DefineConfig
++ MAKE_FLAGS += NEED_$(1)=$(2)
++endef
++define DefineProgrammer
++ # Selecting invalid programmers will fail
++ # Only disable unwanted programmers and keep the default ones
++ ifeq ($(2),no)
++ MAKE_FLAGS += CONFIG_$(1)=$(2)
++ endif
++endef
++
++ifeq ($(BUILD_VARIANT),full)
++ $(eval $(call DefaultProgrammer,LINUX_SPI))
++ FLASHROM_BASIC := yes
++ FLASHROM_FTDI := yes
++ FLASHROM_PCI := yes
++ FLASHROM_SERIAL := yes
++ FLASHROM_USB := yes
++endif
++ifeq ($(BUILD_VARIANT),pci)
++ $(eval $(call DefaultProgrammer,INTERNAL))
++ FLASHROM_BASIC := yes
++ FLASHROM_FTDI := no
++ FLASHROM_PCI := yes
++ FLASHROM_SERIAL := no
++ FLASHROM_USB := no
++endif
++ifeq ($(BUILD_VARIANT),spi)
++ $(eval $(call DefaultProgrammer,LINUX_SPI))
++ FLASHROM_BASIC := yes
++ FLASHROM_FTDI := no
++ FLASHROM_PCI := no
++ FLASHROM_SERIAL := no
++ FLASHROM_USB := no
++endif
++ifeq ($(BUILD_VARIANT),usb)
++ $(eval $(call DefaultProgrammer,SERPROG))
++ FLASHROM_BASIC := yes
++ FLASHROM_FTDI := yes
++ FLASHROM_PCI := no
++ FLASHROM_SERIAL := yes
++ FLASHROM_USB := yes
++endif
++
++# Misc
++$(eval $(call DefineProgrammer,LINUX_SPI,$(FLASHROM_BASIC)))
++#$(eval $(call DefineProgrammer,MSTARDDC_SPI,$(FLASHROM_BASIC)))
++$(eval $(call DefineProgrammer,DUMMY,$(FLASHROM_BASIC)))
++
++# FTDI
++$(eval $(call DefineConfig,FTDI,$(FLASHROM_FTDI)))
++$(eval $(call DefineProgrammer,FT2232_SPI,$(FLASHROM_FTDI)))
++$(eval $(call DefineProgrammer,USBBLASTER_SPI,$(FLASHROM_FTDI)))
++
++# PCI
++$(eval $(call DefineConfig,PCI,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,INTERNAL,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,RAYER_SPI,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,NIC3COM,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,GFXNVIDIA,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,SATASII,$(FLASHROM_PCI)))
++#$(eval $(call DefineProgrammer,ATAHPT,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,ATAVIA,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,IT8212,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,DRKAISER,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,NICREALTEK,$(FLASHROM_PCI)))
++#$(eval $(call DefineProgrammer,NICNATSEMI,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,NICINTEL,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,NICINTEL_SPI,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,NICINTEL_EEPROM,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,OGP_SPI,$(FLASHROM_PCI)))
++$(eval $(call DefineProgrammer,SATAMV,$(FLASHROM_PCI)))
++
++# Serial
++$(eval $(call DefineConfig,SERIAL,$(FLASHROM_SERIAL)))
++$(eval $(call DefineProgrammer,SERPROG,$(FLASHROM_SERIAL)))
++$(eval $(call DefineProgrammer,PONY_SPI,$(FLASHROM_SERIAL)))
++$(eval $(call DefineProgrammer,BUSPIRATE_SPI,$(FLASHROM_SERIAL)))
++
++# USB
++$(eval $(call DefineConfig,USB,$(FLASHROM_USB)))
++$(eval $(call DefineProgrammer,PICKIT2_SPI,$(FLASHROM_USB)))
++#$(eval $(call DefineProgrammer,DEDIPROG,$(FLASHROM_USB)))
+diff --git a/feeds/packages/utils/flashrom/patches/0001-fix_internal_bitbang.patch b/feeds/packages/utils/flashrom/patches/0001-fix_internal_bitbang.patch
+new file mode 100644
+index 0000000..376d6b2
+--- /dev/null
++++ b/feeds/packages/utils/flashrom/patches/0001-fix_internal_bitbang.patch
+@@ -0,0 +1,11 @@
++--- a/programmer.h
+++++ b/programmer.h
++@@ -557,7 +557,7 @@ enum spi_controller {
++ #if CONFIG_DEDIPROG == 1
++ SPI_CONTROLLER_DEDIPROG,
++ #endif
++-#if CONFIG_OGP_SPI == 1 || CONFIG_NICINTEL_SPI == 1 || CONFIG_RAYER_SPI == 1 || CONFIG_PONY_SPI == 1 || (CONFIG_INTERNAL == 1 && (defined(__i386__) || defined(__x86_64__)))
+++#if CONFIG_OGP_SPI == 1 || CONFIG_NICINTEL_SPI == 1 || CONFIG_RAYER_SPI == 1 || CONFIG_PONY_SPI == 1 || CONFIG_INTERNAL == 1
++ SPI_CONTROLLER_BITBANG,
++ #endif
++ #if CONFIG_LINUX_SPI == 1
+diff --git a/feeds/packages/utils/flashrom/patches/0002-fix-musl-compatibility.patch b/feeds/packages/utils/flashrom/patches/0002-fix-musl-compatibility.patch
+new file mode 100644
+index 0000000..b52f8b2
+--- /dev/null
++++ b/feeds/packages/utils/flashrom/patches/0002-fix-musl-compatibility.patch
+@@ -0,0 +1,12 @@
++diff -uprN a/linux_spi.c b/linux_spi.c
++--- a/linux_spi.c 2015-06-17 20:50:36.492963100 +0200
+++++ b/linux_spi.c 2015-06-17 20:50:00.444860800 +0200
++@@ -22,7 +22,7 @@
++ #include <stdio.h>
++ #include <string.h>
++ #include <stdlib.h>
++-#include <sys/fcntl.h>
+++#include <fcntl.h>
++ #include <errno.h>
++ #include <ctype.h>
++ #include <unistd.h>
+diff --git a/feeds/packages/utils/gammu/Makefile b/feeds/packages/utils/gammu/Makefile
+new file mode 100644
+index 0000000..e31d390
+--- /dev/null
++++ b/feeds/packages/utils/gammu/Makefile
+@@ -0,0 +1,72 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++# 2014-2015 Vitaly Protsko
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gammu
++PKG_VERSION:=1.36.6
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://dl.cihar.com/gammu/releases/
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_MD5SUM:=9047f0598602144a99153f5e61104529
++PKG_MAINTAINER:=Vitaly Protsko <villy@sft.ru>
++PKG_LICENCE:=GPL-2.0
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/gammu
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Cell phone/modem SMS and control tool
++ URL:=http://dl.cihar.com/gammu/releases/
++ DEPENDS:=+libpthread +libcurl +glib2 $(ICONV_DEPENDS) $(INTL_DEPENDS)
++ DEPENDS+=+PACKAGE_python:python +PACKAGE_bluez-libs:bluez-libs
++ DEPENDS+=+PACKAGE_libmysqlclient:libmysqlclient +PACKAGE_unixodbc:unixodbc +PACKAGE_libpq:libpq
++ DEPENDS+=+PACKAGE_libusb-1.0:libusb-1.0
++endef
++
++CMAKE_OPTIONS += -DWITH_LibDBI:BOOL=OFF
++ifneq ($(INTL_FULL),)
++CMAKE_OPTIONS += -DLIBINTL_INCLUDE_DIRS:PATH=$(INTL_PREFIX)/include
++CMAKE_OPTIONS += -DLIBINTL_LIBRARIES:STRING=intl
++endif
++ifneq ($(ICONV_FULL),)
++CMAKE_OPTIONS += -DDISABLE_ICONV=OFF
++CMAKE_OPTIONS += -DICONV_INCLUDE_DIRS:PATH=$(ICONV_PREFIX)/include
++CMAKE_OPTIONS += -DICONV_LIBRARIES:STRING=iconv
++endif
++
++define Build/InstallDev
++ mkdir -p $(1)/usr/include
++ $(CP) -r $(PKG_INSTALL_DIR)/usr/include/gammu $(1)/usr/include/
++ mkdir -p $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib$(LIB_SUFFIX)/lib{Gammu*,gsmsd*} $(1)/usr/lib/
++endef
++
++define Package/gammu/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/gammu $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/gammu-{smsd,smsd-inject,smsd-monitor} $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib$(LIB_SUFFIX)/lib{Gammu*,gsmsd*} $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/gammu $(1)/etc/config/gammu
++ $(INSTALL_BIN) ./files/gammu.init $(1)/etc/init.d/gammu
++endef
++
++define Package/gammu/conffiles
++/etc/config/gammu
++endef
++
++$(eval $(call BuildPackage,gammu))
+diff --git a/feeds/packages/utils/gammu/files/gammu b/feeds/packages/utils/gammu/files/gammu
+new file mode 100644
+index 0000000..d05fb25
+--- /dev/null
++++ b/feeds/packages/utils/gammu/files/gammu
+@@ -0,0 +1,5 @@
++config daemon default
++ option enabled 0
++ option device /dev/ttyUSB0
++ option connection at
++ option logfile syslog
+diff --git a/feeds/packages/utils/gammu/files/gammu.init b/feeds/packages/utils/gammu/files/gammu.init
+new file mode 100755
+index 0000000..6a391d4
+--- /dev/null
++++ b/feeds/packages/utils/gammu/files/gammu.init
+@@ -0,0 +1,116 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 villy@sft.ru
++
++START=98
++
++USE_PROCD=1
++PROG=/usr/bin/gammu-smsd
++CONFPFX=/var/gammu
++
++start_instance() {
++ local conf="$1"
++ local item
++ local conffile="$CONFPFX-$conf.conf"
++
++ config_get_bool item "$conf" enabled 0
++ [ $item = 0 ] && return
++
++ echo -e "; dont edit. instead look into /etc/config/gammu\n[gammu]\n" > $conffile
++
++ config_get item "$conf" device
++ [ -z "$item" ] && return
++ echo "device = $item" >> $conffile
++
++ config_get item "$conf" connection
++ [ -z "$item" ] && return
++ echo "connection = $item" >> $conffile
++
++ config_get item "$conf" logfile
++ [ -z "$item" ] && item=syslog
++ echo "logfile = $item" >> $conffile
++
++ echo -e "\n[smsd]\nphoneid = $conf\nservice = files\nlogfile = $item" >> $conffile
++ echo -e "checkbattery = 0\nhangupcalls = 1" >> $conffile
++
++ config_get item "$conf" pin
++ [ -n "$item" ] && echo "pin = $item" >> $conffile
++
++ config_get item "$conf" phonecode
++ [ -n "$item" ] && echo "phonecode = $item" >> $conffile
++
++ config_get item "$conf" send
++ [ -n "$item" ] && echo "send = $item" >> $conffile
++
++ config_get item "$conf" receive
++ [ -n "$item" ] && echo "receive = $item" >> $conffile
++
++ config_get item "$conf" timeout
++ [ -n "$item" ] && echo "commtimeout = $item" >> $conffile
++
++ config_get item "$conf" sleep
++ [ -n "$item" ] && echo "loopsleep = $item" >> $conffile
++
++ config_get item "$conf" report
++ [ -n "$item" ] && echo "deliveryreport = $item" >> $conffile
++
++ config_get item "$conf" onreceive
++ [ -n "$item" ] && echo "runonreceive = $item" >> $conffile
++
++ config_get item "$conf" onerror
++ [ -n "$item" ] && echo "runonfailure = $item" >> $conffile
++
++ config_get item "$conf" spool
++ [ -z "$item" ] && item=/var/sms
++ [ ! -d $item ] && {
++ mkdir $item
++ mkdir $item/inbox
++ mkdir $item/outbox
++ mkdir $item/sent
++ mkdir $item/error
++ }
++ echo -e "inboxpath = $item/inbox/\noutboxpath = $item/outbox/" >> $conffile
++ echo -e "sentsmspath = $item/sent/\nerrorsmspath = $item/error/" >> $conffile
++
++ config_get item "$conf" allow
++ [ -n "$item" ] && {
++ local data
++ local allowfile=$CONFPFX-$conf.allow
++ for data in $item ; do
++ echo $data >> $allowfile
++ done
++
++ echo "includenumbersfile = $allowfile" >> $conffile
++ }
++
++ config_get item "$conf" deny
++ [ -n "$item" ] && {
++ local data
++ local denyfile=$CONFPFX-$conf.deny
++ for data in $item ; do
++ echo $data >> $denyfile
++ done
++
++ echo "excludenumbersfile = $denyfile" >> $conffile
++ }
++
++ procd_open_instance
++
++ config_get_bool item "$conf" respawn 0
++ [ $item != 0 ] && procd_set_param respawn
++
++ procd_set_param command $PROG --config=$conffile
++
++ config_get item "$conf" pidfile
++ [ -n "$item" ] && procd_append_param command --pid=$item
++
++ procd_close_instance
++}
++
++start_service() {
++ config_load gammu
++ config_foreach start_instance daemon
++}
++
++service_triggers() {
++ procd_add_reload_trigger "gammu"
++}
+diff --git a/feeds/packages/utils/gammu/patches/001-iconv-disabling-option.patch b/feeds/packages/utils/gammu/patches/001-iconv-disabling-option.patch
+new file mode 100644
+index 0000000..91abfe7
+--- /dev/null
++++ b/feeds/packages/utils/gammu/patches/001-iconv-disabling-option.patch
+@@ -0,0 +1,51 @@
++--- a/cmake/FindIconv.cmake
+++++ b/cmake/FindIconv.cmake
++@@ -34,9 +34,9 @@ string(REGEX REPLACE "(.*)/include/?" "\
++
++ FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv c HINTS "${ICONV_INCLUDE_BASE_DIR}/lib" PATHS /opt/local/lib)
++
++-IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+++IF(NOT DISABLE_ICONV AND ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
++ SET(ICONV_FOUND TRUE)
++-ENDIF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
+++ENDIF(NOT DISABLE_ICONV AND ICONV_INCLUDE_DIR AND ICONV_LIBRARIES)
++
++ set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR})
++ set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES})
++--- a/configure
+++++ b/configure
++@@ -31,6 +31,7 @@ Usage: ./configure [options]
++ --enable-backup enable backup support
++ --enable-win32 enable mingw crosscomilation
++ --enable-protection enable compile time protections
+++--disable-iconv disable iconv support
++ --with-python=<path> path to Python interpreter
++ --without-gnapplet disable installation of gnapplet
++ --without-completion disable installation of bash completion script
++@@ -57,6 +58,7 @@ CMAKE_PROTECTION=
++ CMAKE_PYTHON=
++ CMAKE_GNAP=
++ CMAKE_COMPLETE=
+++CMAKE_ICONV=
++
++ # process command line
++ while [ "$#" -gt 0 ] ; do
++@@ -94,6 +96,12 @@ while [ "$#" -gt 0 ] ; do
++ --disable-protection)
++ CMAKE_PROTECTION="-DENABLE_PROTECTION=OFF"
++ ;;
+++ --enable-iconv)
+++ CMAKE_ICONV="-DDISABLE_ICONV=OFF"
+++ ;;
+++ --disable-iconv)
+++ CMAKE_ICONV="-DDISABLE_ICONV=ON"
+++ ;;
++ --enable-debug)
++ CMAKE_DEBUG="-DCMAKE_BUILD_TYPE=Debug"
++ ;;
++@@ -142,4 +150,4 @@ fi
++ cd "$BUILD_DIR"
++
++ # invoke cmake to do configuration
++-cmake $SOURCE_DIR $CMAKE_PREFIX $CMAKE_SHARED $CMAKE_DEBUG $CMAKE_BACKUP $CMAKE_CROSS $CMAKE_PROTECTION $CMAKE_PYTHON $CMAKE_GNAP $CMAKE_COMPLETE
+++cmake $SOURCE_DIR $CMAKE_PREFIX $CMAKE_SHARED $CMAKE_DEBUG $CMAKE_BACKUP $CMAKE_CROSS $CMAKE_PROTECTION $CMAKE_PYTHON $CMAKE_GNAP $CMAKE_COMPLETE $CMAKE_ICONV
+diff --git a/feeds/packages/utils/gammu/patches/002-no-fstack-protector.patch b/feeds/packages/utils/gammu/patches/002-no-fstack-protector.patch
+new file mode 100644
+index 0000000..ec0badf
+--- /dev/null
++++ b/feeds/packages/utils/gammu/patches/002-no-fstack-protector.patch
+@@ -0,0 +1,11 @@
++--- a/CMakeLists.txt
+++++ b/CMakeLists.txt
++@@ -537,8 +537,6 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMP
++ # MACRO_TUNE_LINKER("-pie")
++ # These do not work on Windows right now
++ if (NOT WIN32)
++- # Stack protector
++- MACRO_TUNE_COMPILER("-fstack-protector")
++ # Mark code read only
++ MACRO_TUNE_LINKER("-Wl,-zrelro")
++ endif (NOT WIN32)
+diff --git a/feeds/packages/utils/gammu/patches/003-cmake-cross-toolchain.patch b/feeds/packages/utils/gammu/patches/003-cmake-cross-toolchain.patch
+new file mode 100644
+index 0000000..cfacf11
+--- /dev/null
++++ b/feeds/packages/utils/gammu/patches/003-cmake-cross-toolchain.patch
+@@ -0,0 +1,43 @@
++--- /dev/null
+++++ b/cmake/Toolchain-cross.cmake
++@@ -0,0 +1,5 @@
+++# search for programs in the build host directories
+++SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+++# for libraries and headers in the target directories
+++SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+++SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
++--- a/configure
+++++ b/configure
++@@ -25,6 +25,7 @@ Usage: ./configure [options]
++
++ --help|-h shows this help
++ --prefix=<path> installation prefix
+++--cross-root=<path> cross-compilation prefix
++ --enable-shared enables shared build
++ --enable-debug enables debug build
++ --enable-tiger enables Mac OS X 10.4 (Tiger) build
++@@ -50,6 +51,7 @@ SOURCE_DIR=`pwd`
++
++ # cmake parameters
++ CMAKE_PREFIX=
+++CMAKE_ROOT=
++ CMAKE_SHARED=
++ CMAKE_DEBUG=
++ CMAKE_BACKUP=
++@@ -69,6 +71,10 @@ while [ "$#" -gt 0 ] ; do
++ --prefix=*)
++ CMAKE_PREFIX="-DCMAKE_INSTALL_PREFIX=${1##--prefix=}"
++ ;;
+++ --cross-root=*)
+++ CMAKE_ROOT="-DCMAKE_TOOLCHAIN_FILE=$SOURCE_DIR/cmake/Toolchain-cross.cmake"
+++ echo "SET(CMAKE_FIND_ROOT_PATH ${1##--cross-root=})" >> $SOURCE_DIR/cmake/Toolchain-cross.cmake
+++ ;;
++ --with-python=*)
++ CMAKE_PYTHON="-DBUILD_PYTHON=${1##--with-python=}"
++ ;;
++@@ -150,4 +156,4 @@ fi
++ cd "$BUILD_DIR"
++
++ # invoke cmake to do configuration
++-cmake $SOURCE_DIR $CMAKE_PREFIX $CMAKE_SHARED $CMAKE_DEBUG $CMAKE_BACKUP $CMAKE_CROSS $CMAKE_PROTECTION $CMAKE_PYTHON $CMAKE_GNAP $CMAKE_COMPLETE $CMAKE_ICONV
+++cmake $SOURCE_DIR $CMAKE_ROOT $CMAKE_PREFIX $CMAKE_SHARED $CMAKE_DEBUG $CMAKE_BACKUP $CMAKE_CROSS $CMAKE_PROTECTION $CMAKE_PYTHON $CMAKE_GNAP $CMAKE_COMPLETE $CMAKE_ICONV
+diff --git a/feeds/packages/utils/gammu/patches/004-cmake_libdbi_optional.patch b/feeds/packages/utils/gammu/patches/004-cmake_libdbi_optional.patch
+new file mode 100644
+index 0000000..c1e6728
+--- /dev/null
++++ b/feeds/packages/utils/gammu/patches/004-cmake_libdbi_optional.patch
+@@ -0,0 +1,34 @@
++--- a/configure
+++++ b/configure
++@@ -36,6 +36,7 @@ Usage: ./configure [options]
++ --with-python=<path> path to Python interpreter
++ --without-gnapplet disable installation of gnapplet
++ --without-completion disable installation of bash completion script
+++--without-libdbi disable libdbi support
++
++ All enable params have their disable counterparts.
++
++@@ -61,6 +62,7 @@ CMAKE_PYTHON=
++ CMAKE_GNAP=
++ CMAKE_COMPLETE=
++ CMAKE_ICONV=
+++CMAKE_LIBDBI=
++
++ # process command line
++ while [ "$#" -gt 0 ] ; do
++@@ -120,6 +122,9 @@ while [ "$#" -gt 0 ] ; do
++ --without-completion)
++ CMAKE_COMPLETE="-DINSTALL_BASH_COMPLETION=OFF"
++ ;;
+++ --without-libdbi)
+++ CMAKE_LIBDBI="-DWITH_LibDBI=OFF"
+++ ;;
++ --build=*)
++ ;;
++ --disable-dependency-tracking)
++@@ -156,4 +161,4 @@ fi
++ cd "$BUILD_DIR"
++
++ # invoke cmake to do configuration
++-cmake $SOURCE_DIR $CMAKE_ROOT $CMAKE_PREFIX $CMAKE_SHARED $CMAKE_DEBUG $CMAKE_BACKUP $CMAKE_CROSS $CMAKE_PROTECTION $CMAKE_PYTHON $CMAKE_GNAP $CMAKE_COMPLETE $CMAKE_ICONV
+++cmake $SOURCE_DIR $CMAKE_ROOT $CMAKE_PREFIX $CMAKE_SHARED $CMAKE_DEBUG $CMAKE_BACKUP $CMAKE_CROSS $CMAKE_PROTECTION $CMAKE_PYTHON $CMAKE_GNAP $CMAKE_COMPLETE $CMAKE_ICONV $CMAKE_LIBDBI
+diff --git a/feeds/packages/utils/gammu/patches/010-utils-shell-fix.patch b/feeds/packages/utils/gammu/patches/010-utils-shell-fix.patch
+new file mode 100644
+index 0000000..d1b3ec3
+--- /dev/null
++++ b/feeds/packages/utils/gammu/patches/010-utils-shell-fix.patch
+@@ -0,0 +1,16 @@
++--- a/utils/gammu-config
+++++ b/utils/gammu-config
++@@ -1,4 +1,4 @@
++-#!/bin/bash
+++#!/bin/sh
++ # Gammu configuration generator
++ # Copyright (C) 2003 - 2009 Michal Cihar <michal@cihar.com>
++ # vim: expandtab sw=4 ts=4 sts=4:
++--- a/utils/jadmaker
+++++ b/utils/jadmaker
++@@ -1,4 +1,4 @@
++-#!/bin/bash
+++#!/bin/sh
++ # JAD file generator
++ # Copyright © 2008 - 2009 Michal Čihař <michal@cihar.com>
++ # vim: expandtab sw=4 ts=4 sts=4:
+diff --git a/feeds/packages/utils/gnupg/Makefile b/feeds/packages/utils/gnupg/Makefile
+new file mode 100644
+index 0000000..c96fbc3
+--- /dev/null
++++ b/feeds/packages/utils/gnupg/Makefile
+@@ -0,0 +1,69 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gnupg
++PKG_VERSION:=1.4.19
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=ftp://ftp.franken.de/pub/crypt/mirror/ftp.gnupg.org/gcrypt/gnupg \
++ ftp://ftp.gnupg.org/gcrypt/gnupg
++PKG_MD5SUM:=3af4ab5b3113b3e28d3551ecf9600785
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/gnupg
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+zlib +libncurses +libreadline
++ TITLE:=GNU privacy guard - a free PGP replacement
++ URL:=http://www.gnupg.org/
++endef
++
++define Package/gnupg/description
++ GnuPG is GNU's tool for secure communication and data storage.
++ It can be used to encrypt data and to create digital signatures.
++ It includes an advanced key management facility and is compliant
++ with the proposed OpenPGP Internet standard as described in RFC2440.
++ .
++ GnuPG does not use any patented algorithms so it cannot be compatible
++ with PGP2 because it uses IDEA (which is patented worldwide).
++endef
++
++CONFIGURE_ARGS += \
++ --disable-rpath \
++ --disable-asm \
++ --disable-gnupg-iconv \
++ --disable-card-support \
++ --disable-agent-support \
++ --disable-bzip2 \
++ --disable-exec \
++ --disable-ldap \
++ --disable-hkp \
++ --disable-finger \
++ --disable-ftp \
++ --disable-dns-srv \
++ --enable-fake-curl \
++ --disable-regex \
++
++MAKE_FLAGS += \
++ SUBDIRS="m4 intl zlib util mpi cipher tools g10 keyserver ${checks}" \
++
++define Package/gnupg/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/gpg $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,gnupg))
+diff --git a/feeds/packages/utils/gpsd/Makefile b/feeds/packages/utils/gpsd/Makefile
+new file mode 100644
+index 0000000..df67cf8
+--- /dev/null
++++ b/feeds/packages/utils/gpsd/Makefile
+@@ -0,0 +1,144 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=gpsd
++PKG_VERSION:=3.15
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://download-mirror.savannah.gnu.org/releases/gpsd/
++PKG_MD5SUM:=afd79b87337fadf38ee2a7c4314dac79
++
++PKG_MAINTAINER:=Pushpal Sidhu <psidhu@gateworks.com>
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_DEPENDS:=libncurses libusb-1.0
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/scons.mk
++
++define Package/gpsd/Default
++ DEPENDS:=+librt +libncurses
++ URL:=http://catb.org/gpsd/
++endef
++
++define Package/gpsd/Default/description
++ gpsd is a userland daemon acting as a translator between GPS and AIS receivers
++ and their clients. gpsd listens on port 2947 for clients requesting
++ position/time/velocity information. The receivers are expected to generate
++ position information in a well-known format -- as NMEA-0183 sentences, SiRF
++ binary, Rockwell binary, Garmin binary format, or other vendor binary
++ protocols. gpsd takes this information from the GPS and translates it into
++ something uniform and easier to understand for clients.
++endef
++
++define Package/gpsd
++ $(call Package/gpsd/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS+= +libgps +libusb-1.0
++ TITLE:=An interface daemon for GPS receivers
++endef
++
++define Package/gpsd/conffiles
++/etc/config/gpsd
++endef
++
++define Package/gpsd/description
++ $(call Package/gpsd/Default/description)
++ This package contains the GPS daemon.
++endef
++
++define Package/gpsd-clients
++ $(call Package/gpsd/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS+= +libgps +libncurses +libusb-1.0
++ TITLE:=GPS tools and clients
++endef
++
++define Package/gpsd-clients/description
++ $(call Package/gpsd/Default/description)
++ This package contains auxiliary tools and example clients for monitoring and
++ testing the GPS daemon.
++endef
++
++define Package/libgps
++ $(call Package/gpsd/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS+= +libcap
++ TITLE:=C service library for communicating with the GPS daemon
++endef
++
++define Package/libgps/description
++ $(call Package/gpsd/Default/description)
++ This package contains the libgps library.
++endef
++
++SCONS_OPTIONS += \
++ dbus_export=no \
++ tsip=no \
++ fv18=no \
++ tripmate=no \
++ earthmate=no \
++ itrax=no \
++ navcom=no \
++ ubx=no \
++ evermore=no \
++ ntrip=no \
++ libgpsmm=no \
++ libQgpsmm=no \
++ bluez=no \
++ strip=no \
++ python=no \
++ implicit_link=no \
++ chrpath=no
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/gps.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgps*.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libgps*.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/gpsd/install
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/gpsd.config $(1)/etc/config/gpsd
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/gpsd.init $(1)/etc/init.d/gpsd
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/usb
++ $(INSTALL_DATA) ./files/gpsd.hotplug $(1)/etc/hotplug.d/usb/20-gpsd
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/gpsd $(1)/usr/sbin/
++endef
++
++define Package/gpsd-clients/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/cgps \
++ $(PKG_INSTALL_DIR)/usr/bin/gps{ctl,decode,mon,pipe} \
++ $(PKG_INSTALL_DIR)/usr/bin/gpxlogger \
++ $(PKG_INSTALL_DIR)/usr/bin/lcdgps \
++ $(1)/usr/bin/
++endef
++
++define Package/libgps/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libgps.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,gpsd))
++$(eval $(call BuildPackage,gpsd-clients))
++$(eval $(call BuildPackage,libgps))
+diff --git a/feeds/packages/utils/gpsd/files/gpsd.config b/feeds/packages/utils/gpsd/files/gpsd.config
+new file mode 100644
+index 0000000..ef19202
+--- /dev/null
++++ b/feeds/packages/utils/gpsd/files/gpsd.config
+@@ -0,0 +1,5 @@
++config gpsd core
++ option device "/dev/ttyUSB0"
++ option port "2947"
++ option listen_globally "false"
++ option enabled "true"
+diff --git a/feeds/packages/utils/gpsd/files/gpsd.hotplug b/feeds/packages/utils/gpsd/files/gpsd.hotplug
+new file mode 100644
+index 0000000..fc15dda
+--- /dev/null
++++ b/feeds/packages/utils/gpsd/files/gpsd.hotplug
+@@ -0,0 +1,16 @@
++case "$ACTION" in
++ add)
++ # start process
++ # only pl2303 devices are handled
++ if [ "$PRODUCT" = "67b/2303/300" ] && [ "$TYPE" = "0/0/0" ] && [ "$INTERFACE" = "255/0/0" ]; then
++ sleep 3 && /etc/init.d/gpsd start
++ fi
++ ;;
++ remove)
++ # stop process
++ # only pl2303 devices are handled
++ if [ "$PRODUCT" = "67b/2303/300" ] && [ "$TYPE" = "0/0/0" ] && [ "$INTERFACE" = "255/0/0" ]; then
++ /etc/init.d/gpsd stop
++ fi
++ ;;
++esac
+diff --git a/feeds/packages/utils/gpsd/files/gpsd.init b/feeds/packages/utils/gpsd/files/gpsd.init
+new file mode 100644
+index 0000000..96cee78
+--- /dev/null
++++ b/feeds/packages/utils/gpsd/files/gpsd.init
+@@ -0,0 +1,32 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2011 OpenWrt.org
++START=50
++
++NAME=gpsd
++PIDF=/var/run/$NAME.pid
++PROG=/usr/sbin/$NAME
++
++start() {
++ config_load gpsd
++ config_get device core device
++ config_get port core port
++ config_get_bool listen_globally core listen_globally
++ config_get_bool enabled core enabled
++ [ "$enabled" != "1" ] && exit
++ logger -t "$NAME" "Starting..."
++ [ ! -c "$device" ] && {
++ logger -t "$NAME" "Unable to find device $device. Exiting."
++ exit 1
++ }
++ [ "$listen_globally" != "0" ] && append args "-G"
++ $PROG -n -P $PIDF -S $port $args $device
++}
++
++stop() {
++ logger -t "$NAME" "Stopping..."
++ [ -f "$PIDF" ] && {
++ read PID < "$PIDF"
++ kill -9 $PID
++ rm $PIDF
++ }
++}
+diff --git a/feeds/packages/utils/gpsd/patches/0001-Remove-a-BSD-ism.patch b/feeds/packages/utils/gpsd/patches/0001-Remove-a-BSD-ism.patch
+new file mode 100644
+index 0000000..55004ab
+--- /dev/null
++++ b/feeds/packages/utils/gpsd/patches/0001-Remove-a-BSD-ism.patch
+@@ -0,0 +1,42 @@
++From 95c99f69e026e8c57aecba545e51c97f3b284e75 Mon Sep 17 00:00:00 2001
++From: "Gary E. Miller" <gem@rellim.com>
++Date: Tue, 23 Jun 2015 14:36:26 -0700
++Subject: [PATCH] Remove a BSD-ism.
++
++CTRL('L') is a BSD-ism. CTRL() is defined in sys/ttydefaults.h
++which does not always exist. Instead of adding scons tests for
++needing CTRL() and its include files just replace with a simple
++constant.
++
++Needed for musl and found by Baruch Siach <baruch@tkos.co.il>
++---
++ gpsmon.c | 6 +++++-
++ 1 file changed, 5 insertions(+), 1 deletion(-)
++
++diff --git a/gpsmon.c b/gpsmon.c
++index c3001c8..58c8300 100644
++--- a/gpsmon.c
+++++ b/gpsmon.c
++@@ -583,6 +583,9 @@ static void select_packet_monitor(struct gps_device_t *device)
++ (void)wnoutrefresh(devicewin);
++ }
++
+++/* Control-L character */
+++#define CTRL_L 0x0C
+++
++ static char *curses_get_command(void)
++ /* char-by-char nonblocking input, return accumulated command line on \n */
++ {
++@@ -591,7 +594,8 @@ static char *curses_get_command(void)
++ int c;
++
++ c = wgetch(cmdwin);
++- if (c == CTRL('L')) {
+++ if (CTRL_L == c) {
+++ /* ^L is to repaint the screen */
++ (void)clearok(stdscr, true);
++ if (active != NULL && (*active)->initialize != NULL)
++ (void)(*active)->initialize();
++--
++2.6.0
++
+diff --git a/feeds/packages/utils/grep/Makefile b/feeds/packages/utils/grep/Makefile
+new file mode 100644
+index 0000000..c4703bc
+--- /dev/null
++++ b/feeds/packages/utils/grep/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2010-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=grep
++PKG_VERSION:=2.21
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@GNU/grep
++PKG_MD5SUM:=43c48064d6409862b8a850db83c8038a
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Julen Landa Alustiza <julen@zokormazo.info>
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS+=--std=gnu99
++
++define Package/grep
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=grep search utility - full version
++ DEPENDS:=+libpcre
++ URL:=http://www.gnu.org/software/grep/
++endef
++
++define Package/grep/description
++The grep command searches one or more input files for lines
++containing a match to a specified pattern. By default, grep
++prints the matching lines.
++endef
++
++define Package/grep/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/grep $(1)/usr/bin/grep
++endef
++
++define Package/grep/postinst
++#!/bin/sh
++[ -L "$${IPKG_INSTROOT}/bin/grep" ] && rm -f "$${IPKG_INSTROOT}/bin/grep"
++exit 0
++endef
++
++define Package/grep/prerm
++$${IPKG_INSTROOT}/bin/busybox grep -h 2>&1 | grep -q BusyBox && \
++ln -sf busybox $${IPKG_INSTROOT}/bin/grep
++exit 0
++endef
++
++$(eval $(call BuildPackage,grep))
+diff --git a/feeds/packages/utils/grep/patches/0001-grep-F-fix-a-heap-buffer-read-overrun.patch b/feeds/packages/utils/grep/patches/0001-grep-F-fix-a-heap-buffer-read-overrun.patch
+new file mode 100644
+index 0000000..df70359
+--- /dev/null
++++ b/feeds/packages/utils/grep/patches/0001-grep-F-fix-a-heap-buffer-read-overrun.patch
+@@ -0,0 +1,15 @@
++diff --git a/src/kwset.c b/src/kwset.c
++index 4003c8d..376f7c3 100644
++--- a/src/kwset.c
+++++ b/src/kwset.c
++@@ -643,6 +643,8 @@ bmexec_trans (kwset_t kwset, char const *text, size_t size)
++ if (! tp)
++ return -1;
++ tp++;
+++ if (ep <= tp)
+++ break;
++ }
++ }
++ }
++--
++cgit v0.9.0.2
+diff --git a/feeds/packages/utils/hamlib/Makefile b/feeds/packages/utils/hamlib/Makefile
+new file mode 100644
+index 0000000..dec78f6
+--- /dev/null
++++ b/feeds/packages/utils/hamlib/Makefile
+@@ -0,0 +1,529 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=hamlib
++PKG_VERSION:=1.2.15.3
++PKG_RELEASE:=3
++PKG_MD5SUM:=3cad8987e995a00e5e9d360e2be0eb43
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/hamlib
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=COPYING
++
++PKG_MAINTAINER:=Vasilis Tsiligiannis <acinonyx@openwrt.gr>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/hamlib/Default
++ TITLE:=Ham Radio Control
++ URL:=http://hamlib.sourceforge.net
++endef
++
++define Package/hamlib/Default/description
++ Ham Radio Control Libraries is a development effort to provide a consistent
++ interface for programmers wanting to incorporate radio control in their
++ programs.
++endef
++
++define Package/hamlib
++ $(call Package/hamlib/Default)
++ TITLE+= utilities
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libpthread +libhamlib
++endef
++
++define Package/hamlib/description
++ $(call Package/hamlib/Default/description)
++
++ This package contains the utilities and daemons.
++endef
++
++define Package/libhamlib/Default
++ $(call Package/hamlib/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= shared library
++endef
++
++define Package/libhamlib
++ $(call Package/libhamlib/Default)
++ DEPENDS:=+libusb-1.0 +libltdl
++ MENU:=1
++endef
++
++define Package/libhamlib/description
++ $(call Package/hamlib/Default/description)
++
++ This package contains the hamlib shared library.
++endef
++
++define Package/hamlib-adat
++ $(call Package/libhamlib/Default)
++ TITLE:= for ADAT
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-alinco
++ $(call Package/libhamlib/Default)
++ TITLE:= for Alinco
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-amsat
++ $(call Package/libhamlib/Default)
++ TITLE:= for AMSAT
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-aor
++ $(call Package/libhamlib/Default)
++ TITLE:= for AOR
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-ars
++ $(call Package/libhamlib/Default)
++ TITLE:= for ARS
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-celestron
++ $(call Package/libhamlib/Default)
++ TITLE:= for Celestron
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-drake
++ $(call Package/libhamlib/Default)
++ TITLE:= for Drake
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-dummy
++ $(call Package/libhamlib/Default)
++ TITLE:= for dummy
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-easycomm
++ $(call Package/libhamlib/Default)
++ TITLE:= for EasyComm
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-flexradio
++ $(call Package/libhamlib/Default)
++ TITLE:= for FlexRadio
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-fodtrack
++ $(call Package/libhamlib/Default)
++ TITLE:= for FodTrack
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-gs232a
++ $(call Package/libhamlib/Default)
++ TITLE:= for GS-232A
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-heathkit
++ $(call Package/libhamlib/Default)
++ TITLE:= for Heathkit
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-icom
++ $(call Package/libhamlib/Default)
++ TITLE:= for ICOM
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-jrc
++ $(call Package/libhamlib/Default)
++ TITLE:= for JRC
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-kachina
++ $(call Package/libhamlib/Default)
++ TITLE:= for Kachina
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-kenwood
++ $(call Package/libhamlib/Default)
++ TITLE:= for Kenwood
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-kit
++ $(call Package/libhamlib/Default)
++ TITLE:= for kits
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-lowe
++ $(call Package/libhamlib/Default)
++ TITLE:= for Lowe
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-m2
++ $(call Package/libhamlib/Default)
++ TITLE:= for M2
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-pcr
++ $(call Package/libhamlib/Default)
++ TITLE:= for PCR
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-prm80
++ $(call Package/libhamlib/Default)
++ TITLE:= for PRM80
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-racal
++ $(call Package/libhamlib/Default)
++ TITLE:= for Racal
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-rft
++ $(call Package/libhamlib/Default)
++ TITLE:= for RFT
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-rotorez
++ $(call Package/libhamlib/Default)
++ TITLE:= for Rotor-EZ
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-rs
++ $(call Package/libhamlib/Default)
++ TITLE:= for R&S
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-sartek
++ $(call Package/libhamlib/Default)
++ TITLE:= for SARtek
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-skanti
++ $(call Package/libhamlib/Default)
++ TITLE:= for Skanti
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-spid
++ $(call Package/libhamlib/Default)
++ TITLE:= for SPID
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-tapr
++ $(call Package/libhamlib/Default)
++ TITLE:= for TAPR
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-tentec
++ $(call Package/libhamlib/Default)
++ TITLE:= for TenTec
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-ts7400
++ $(call Package/libhamlib/Default)
++ TITLE:= for TS-7400
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-tuner
++ $(call Package/libhamlib/Default)
++ TITLE:= for Video for Linux tuner
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-uniden
++ $(call Package/libhamlib/Default)
++ TITLE:= for Uniden
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-wj
++ $(call Package/libhamlib/Default)
++ TITLE:= for Watkins - Johnson
++ DEPENDS:=libhamlib
++endef
++
++define Package/hamlib-yaesu
++ $(call Package/libhamlib/Default)
++ TITLE:= for Yaesu
++ DEPENDS:=libhamlib
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/hamlib/*.h $(1)/usr/include/hamlib
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libhamlib.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/hamlib.pc $(1)/usr/lib/pkgconfig/
++endef
++
++CONFIGURE_ARGS+= \
++ --without-cxx-binding \
++ --without-winradio \
++ --without-rpc-backends \
++ --with-pic \
++
++define Package/hamlib/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/{rig,rot}* $(1)/usr/bin/
++endef
++
++define Package/libhamlib/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libhamlib.so* $(1)/usr/lib/
++endef
++
++define Package/hamlib-adat/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-adat.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-alinco/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-alinco.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-amsat/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-amsat.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-aor/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-aor.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-ars/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-ars.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-celestron/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-celestron.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-drake/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-drake.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-dummy/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-dummy.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-easycomm/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-easycomm.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-flexradio/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-flexradio.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-fodtrack/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-fodtrack.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-gs232a/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-gs232a.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-heathkit/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-heathkit.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-icom/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-icom.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-jrc/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-jrc.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-kachina/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-kachina.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-kenwood/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-kenwood.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-kit/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-kit.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-lowe/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-lowe.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-m2/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-m2.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-pcr/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-pcr.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-prm80/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-prm80.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-racal/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-racal.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-rft/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-rft.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-rotorez/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-rotorez.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-rs/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-rs.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-sartek/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-sartek.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-skanti/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-skanti.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-spid/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-spid.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-tapr/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-tapr.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-tentec/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-tentec.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-ts7400/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-ts7400.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-tuner/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-tuner.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-uniden/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-uniden.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-wj/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-wj.so* $(1)/usr/lib/hamlib
++endef
++
++define Package/hamlib-yaesu/install
++ $(INSTALL_DIR) $(1)/usr/lib/hamlib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/hamlib/hamlib-yaesu.so* $(1)/usr/lib/hamlib
++endef
++
++$(eval $(call BuildPackage,hamlib))
++$(eval $(call BuildPackage,libhamlib))
++$(eval $(call BuildPackage,hamlib-adat))
++$(eval $(call BuildPackage,hamlib-alinco))
++$(eval $(call BuildPackage,hamlib-amsat))
++$(eval $(call BuildPackage,hamlib-aor))
++$(eval $(call BuildPackage,hamlib-ars))
++$(eval $(call BuildPackage,hamlib-celestron))
++$(eval $(call BuildPackage,hamlib-drake))
++$(eval $(call BuildPackage,hamlib-dummy))
++$(eval $(call BuildPackage,hamlib-easycomm))
++$(eval $(call BuildPackage,hamlib-flexradio))
++$(eval $(call BuildPackage,hamlib-fodtrack))
++$(eval $(call BuildPackage,hamlib-gs232a))
++$(eval $(call BuildPackage,hamlib-heathkit))
++$(eval $(call BuildPackage,hamlib-icom))
++$(eval $(call BuildPackage,hamlib-jrc))
++$(eval $(call BuildPackage,hamlib-kachina))
++$(eval $(call BuildPackage,hamlib-kenwood))
++$(eval $(call BuildPackage,hamlib-kit))
++$(eval $(call BuildPackage,hamlib-lowe))
++$(eval $(call BuildPackage,hamlib-m2))
++$(eval $(call BuildPackage,hamlib-pcr))
++$(eval $(call BuildPackage,hamlib-prm80))
++$(eval $(call BuildPackage,hamlib-racal))
++$(eval $(call BuildPackage,hamlib-rft))
++$(eval $(call BuildPackage,hamlib-rotorez))
++$(eval $(call BuildPackage,hamlib-rs))
++$(eval $(call BuildPackage,hamlib-sartek))
++$(eval $(call BuildPackage,hamlib-skanti))
++$(eval $(call BuildPackage,hamlib-spid))
++$(eval $(call BuildPackage,hamlib-tapr))
++$(eval $(call BuildPackage,hamlib-tentec))
++$(eval $(call BuildPackage,hamlib-ts7400))
++$(eval $(call BuildPackage,hamlib-tuner))
++$(eval $(call BuildPackage,hamlib-uniden))
++$(eval $(call BuildPackage,hamlib-wj))
++$(eval $(call BuildPackage,hamlib-yaesu))
++
+diff --git a/feeds/packages/utils/hamlib/patches/100-override-autoconf-detection.patch b/feeds/packages/utils/hamlib/patches/100-override-autoconf-detection.patch
+new file mode 100644
+index 0000000..284cc3b
+--- /dev/null
++++ b/feeds/packages/utils/hamlib/patches/100-override-autoconf-detection.patch
+@@ -0,0 +1,30 @@
++Index: hamlib-1.2.15.3/configure.ac
++===================================================================
++--- hamlib-1.2.15.3.orig/configure.ac 2012-11-01 22:27:27.000000000 +0100
+++++ hamlib-1.2.15.3/configure.ac 2014-06-15 09:34:25.557966205 +0200
++@@ -234,12 +234,12 @@
++ "You need a C99 compliant C compiler that supports struct/array intializers."
++ "Have you considered GCC lately?.")]);
++
++-dnl libxml2 required rigmem xml support
++-PKG_CHECK_MODULES([LIBXML2], [libxml-2.0],
++- [AC_DEFINE(HAVE_XML2,[1],[Define if libxml2 is available])],
++- [AC_MSG_WARN([libxml-2.0 pkg-config not found, XML support will be disabled])])
+++#dnl libxml2 required rigmem xml support
+++#PKG_CHECK_MODULES([LIBXML2], [libxml-2.0],
+++# [AC_DEFINE(HAVE_XML2,[1],[Define if libxml2 is available])],
+++# [AC_MSG_WARN([libxml-2.0 pkg-config not found, XML support will be disabled])])
++ AC_SUBST(LIBXML2_LIBS)
++ AC_SUBST(LIBXML2_CFLAGS)
++
++ dnl Check if libgd-dev is installed, so we can enable rigmatrix
++
++@@ -406,7 +406,7 @@
++ AM_CONDITIONAL(HAVE_USRP, test x"${cf_with_usrp}" = "xyes")
++
++
++-PKG_CHECK_MODULES(LIBUSB, libusb >= 0.1, ,
+++PKG_CHECK_MODULES(LIBUSB, libusb >= 1.0, ,
++ [AC_MSG_WARN([libusb pkg-config not found, USB backends will be disabled])])
++ CFLAGS="${CFLAGS} ${LIBUSB_CFLAGS}"
++ CXXFLAGS="${CXXFLAGS} ${LIBUSB_CFLAGS}"
+diff --git a/feeds/packages/utils/haserl/Config.in b/feeds/packages/utils/haserl/Config.in
+new file mode 100644
+index 0000000..e5fb90d
+--- /dev/null
++++ b/feeds/packages/utils/haserl/Config.in
+@@ -0,0 +1,35 @@
++if PACKAGE_haserl
++
++ config HASERL_with_lua
++ bool
++ default n
++
++ comment "Lua support"
++
++ config HASERL_shell_luac
++ bool
++ prompt "Support --shell=luac"
++ select HASERL_with_lua
++ default n
++ help
++ haserl(1):
++ The luac "shell" is a precompiled lua chunk, so interactive
++ editing and testing of scripts is not possible. However,
++ haserl can be compiled with luac support only, and this
++ allows lua support even in a small memory environment. All
++ haserl lua features listed above are still available. (If
++ luac is the only shell built into haserl, the
++ haserl.loadfile is disabled, as the haserl parser is not
++ compiled in.)
++
++ config HASERL_shell_lua
++ bool
++ prompt "Support --shell=lua"
++ select HASERL_with_lua
++ default n
++ help
++ haserl(1):
++ If compiled with lua support, --shell=lua will enable lua as the
++ script language instead of bash shell.
++
++endif
+diff --git a/feeds/packages/utils/haserl/Makefile b/feeds/packages/utils/haserl/Makefile
+new file mode 100644
+index 0000000..1d58625
+--- /dev/null
++++ b/feeds/packages/utils/haserl/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=haserl
++PKG_VERSION:=0.9.35
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/haserl
++PKG_MD5SUM:=918f0b4f6cec0b438c8b5c78f2989010
++PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_HASERL_with_lua \
++ CONFIG_HASERL_shell_luac \
++ CONFIG_HASERL_shell_lua \
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/haserl
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=A CGI wrapper to embed shell scripts in HTML documents
++ URL:=http://haserl.sourceforge.net/
++ MENU:=1
++ DEPENDS:= +HASERL_with_lua:liblua
++endef
++
++define Package/haserl/config
++ source "$(SOURCE)/Config.in"
++endef
++
++ifeq ($(CONFIG_HASERL_with_lua),y)
++ CONFIGURE_ARGS+=--with-lua
++ TARGET_LDFLAGS += -ldl
++endif
++ifneq ($(CONFIG_HASERL_shell_lua),y)
++ CONFIGURE_ARGS+=--disable-luashell
++endif
++ifneq ($(CONFIG_HASERL_shell_luac),y)
++ CONFIGURE_ARGS+=--disable-luacshell
++endif
++
++define Package/haserl/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/haserl $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,haserl))
+diff --git a/feeds/packages/utils/haserl/patches/100-replace-lua2c-with-sed.patch b/feeds/packages/utils/haserl/patches/100-replace-lua2c-with-sed.patch
+new file mode 100644
+index 0000000..4626a02
+--- /dev/null
++++ b/feeds/packages/utils/haserl/patches/100-replace-lua2c-with-sed.patch
+@@ -0,0 +1,82 @@
++diff --git a/src/Makefile.in b/src/Makefile.in
++index 31d45f7..d249f67 100644
++--- a/src/Makefile.in
+++++ b/src/Makefile.in
++@@ -86,7 +86,6 @@ POST_INSTALL = :
++ NORMAL_UNINSTALL = :
++ PRE_UNINSTALL = :
++ POST_UNINSTALL = :
++-@USE_LUA_TRUE@noinst_PROGRAMS = lua2c$(EXEEXT)
++ @INCLUDE_LUASHELL_TRUE@@USE_LUA_TRUE@am__append_1 = h_lua.c h_lua.h
++ @INCLUDE_LUACSHELL_TRUE@@USE_LUA_TRUE@am__append_2 = h_luac.c h_luac.h
++ bin_PROGRAMS = haserl$(EXEEXT)
++@@ -124,9 +123,6 @@ am__DEPENDENCIES_1 =
++ haserl_DEPENDENCIES = $(am__DEPENDENCIES_1)
++ haserl_LINK = $(CCLD) $(haserl_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
++ $(LDFLAGS) -o $@
++-lua2c_SOURCES = lua2c.c
++-lua2c_OBJECTS = lua2c.$(OBJEXT)
++-lua2c_LDADD = $(LDADD)
++ AM_V_P = $(am__v_P_@AM_V@)
++ am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
++ am__v_P_0 = false
++@@ -159,8 +155,8 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
++ am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
++ am__v_CCLD_0 = @echo " CCLD " $@;
++ am__v_CCLD_1 =
++-SOURCES = $(haserl_SOURCES) $(nodist_haserl_SOURCES) lua2c.c
++-DIST_SOURCES = $(am__haserl_SOURCES_DIST) lua2c.c
+++SOURCES = $(haserl_SOURCES) $(nodist_haserl_SOURCES)
+++DIST_SOURCES = $(am__haserl_SOURCES_DIST)
++ am__can_run_installinfo = \
++ case $$AM_UPDATE_INFO_DIR in \
++ n|no|NO) false;; \
++@@ -284,7 +280,7 @@ target_alias = @target_alias@
++ top_build_prefix = @top_build_prefix@
++ top_builddir = @top_builddir@
++ top_srcdir = @top_srcdir@
++-EXTRA_DIST = haserl_lualib.lua lua2c.c
+++EXTRA_DIST = haserl_lualib.lua
++
++ # Not strictly required, but we explicitly do not distribute the generated inc file
++ nodist_haserl_SOURCES = haserl_lualib.inc
++@@ -396,10 +392,6 @@ haserl$(EXEEXT): $(haserl_OBJECTS) $(haserl_DEPENDENCIES) $(EXTRA_haserl_DEPENDE
++ @rm -f haserl$(EXEEXT)
++ $(AM_V_CCLD)$(haserl_LINK) $(haserl_OBJECTS) $(haserl_LDADD) $(LIBS)
++
++-@USE_LUA_FALSE@lua2c$(EXEEXT): $(lua2c_OBJECTS) $(lua2c_DEPENDENCIES) $(EXTRA_lua2c_DEPENDENCIES)
++-@USE_LUA_FALSE@ @rm -f lua2c$(EXEEXT)
++-@USE_LUA_FALSE@ $(AM_V_CCLD)$(LINK) $(lua2c_OBJECTS) $(lua2c_LDADD) $(LIBS)
++-
++ mostlyclean-compile:
++ -rm -f *.$(OBJEXT)
++
++@@ -416,7 +408,6 @@ distclean-compile:
++ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/haserl-haserl.Po@am__quote@
++ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/haserl-rfc2388.Po@am__quote@
++ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/haserl-sliding_buffer.Po@am__quote@
++-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lua2c.Po@am__quote@
++
++ .c.o:
++ @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
++@@ -770,17 +761,13 @@ uninstall-am: uninstall-binPROGRAMS
++ .PRECIOUS: Makefile
++
++
++-# lua2c_LIBS ?= -llua -ldl -lm
++-@USE_LUA_TRUE@lua2c_LDFLAGS ?= -Wl,-E
++-@USE_LUA_TRUE@lua2c: lua2c.c
++-@USE_LUA_TRUE@ $(CC_FOR_BUILD) $(CFLAGS) $(LUA_CFLAGS) $(LDFLAGS) $(lua2c_LDFLAGS) \
++-@USE_LUA_TRUE@ -o $@ $^ $(LIBS) $(LUA_LIBS)
++
++-@USE_LUA_TRUE@haserl_lualib.inc : haserl_lualib.lua lua2c
++-@USE_LUA_TRUE@ if ! ./lua2c haserl_lualib haserl_lualib.lua >$@; then \
+++@USE_LUA_TRUE@haserl_lualib.inc : haserl_lualib.lua
+++@USE_LUA_TRUE@ if ! sed -re '/--\[\[/,/\]\]--/d; s/[[:space:]]*--.*//g; s/^[[:space:]]*//g; /^$$/d; s/ (=+) /\1/g; s/,[[:space:]]*/,/g; s/ ([()])/\1/g; s/key/k/g; s/value/v/g; s/^/"/; s/$$/\\n"/' haserl_lualib.lua >$@.tmp; then \
++ @USE_LUA_TRUE@ rm $@; \
++ @USE_LUA_TRUE@ exit 1 ;\
++ @USE_LUA_TRUE@ fi
+++@USE_LUA_TRUE@ { echo "static const char haserl_lualib[] = "; cat $@.tmp; echo ";"; rm $@.tmp; } >$@
++
++ @USE_LUA_TRUE@h_lua_common.c : haserl_lualib.inc
++
+diff --git a/feeds/packages/utils/haserl/patches/101-adjust-script-size.patch b/feeds/packages/utils/haserl/patches/101-adjust-script-size.patch
+new file mode 100644
+index 0000000..a4b7d9a
+--- /dev/null
++++ b/feeds/packages/utils/haserl/patches/101-adjust-script-size.patch
+@@ -0,0 +1,11 @@
++--- a/src/h_lua_common.c 2013-09-20 23:35:19.000000000 +0300
+++++ b/src/h_lua_common.c 2014-05-03 19:27:43.000000000 +0300
++@@ -79,7 +79,7 @@
++
++ /* and load our haserl library */
++ if (luaL_loadbuffer
++- (lua_vm, (const char *) &haserl_lualib, sizeof (haserl_lualib),
+++ (lua_vm, (const char *) haserl_lualib, sizeof(haserl_lualib)-1,
++ "luascript.lua") || lua_pcall (lua_vm, 0, 0, 0))
++ {
++ die_with_message (NULL, NULL,
+diff --git a/feeds/packages/utils/haveged/Makefile b/feeds/packages/utils/haveged/Makefile
+new file mode 100644
+index 0000000..f020384
+--- /dev/null
++++ b/feeds/packages/utils/haveged/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=haveged
++PKG_VERSION:=1.9.1
++PKG_RELEASE:=5
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.issihosts.com/$(PKG_NAME) \
++ http://pkgs.fedoraproject.org/repo/pkgs/haveged/haveged-1.9.1.tar.gz/015ff58cd10607db0e0de60aeca2f5f8/
++PKG_MD5SUM:=015ff58cd10607db0e0de60aeca2f5f8
++PKG_LICENSE:=GPLv3
++
++PKG_MAINTAINER:=Hannu Nyman <hannu.nyman@iki.fi>
++
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/haveged/template
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Feeds the kernel entropy pool by timing CPU loops.
++ URL:=http://www.issihosts.com/haveged/
++endef
++
++define Package/haveged
++ $(call Package/haveged/template)
++ DEPENDS:=+libhavege
++endef
++
++define Package/libhavege
++ $(call Package/haveged/template)
++ TITLE:=Library for haveged
++endef
++
++CONFIGURE_ARGS+= \
++ --enable-daemon=yes \
++ --enable-threads=no \
++ --enable-olt=no
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_BUILD_DIR)/src/havege.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/src/.libs/libhavege.{a,so*} $(1)/usr/lib/
++endef
++
++define Package/haveged/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/haveged.init $(1)/etc/init.d/haveged
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/.libs/haveged $(1)/usr/sbin/
++endef
++
++define Package/libhavege/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/src/.libs/libhavege.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,haveged))
++$(eval $(call BuildPackage,libhavege))
+diff --git a/feeds/packages/utils/haveged/files/haveged.init b/feeds/packages/utils/haveged/files/haveged.init
+new file mode 100644
+index 0000000..113d64f
+--- /dev/null
++++ b/feeds/packages/utils/haveged/files/haveged.init
+@@ -0,0 +1,16 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2012 OpenWrt.org
++
++START=13
++
++HAVEGED_THRESHOLD=1024
++HAVEGED_DCACHE=32
++HAVEGED_ICACHE=32
++
++start() {
++ service_start /usr/sbin/haveged -w $HAVEGED_THRESHOLD -d $HAVEGED_DCACHE -i $HAVEGED_ICACHE -v 1
++}
++
++stop() {
++ service_stop /usr/sbin/haveged
++}
+diff --git a/feeds/packages/utils/hd-idle/Makefile b/feeds/packages/utils/hd-idle/Makefile
+new file mode 100644
+index 0000000..aa22284
+--- /dev/null
++++ b/feeds/packages/utils/hd-idle/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=hd-idle
++PKG_VERSION:=1.04
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=Lim Guo Wei <limguowei@gmail.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=@SF/$(PKG_NAME)
++PKG_MD5SUM:=41e52e669fc59fa82ee0c2bcce1336d3
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/hd-idle
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Another idle-daemon for attached hard drives
++ SUBMENU:=disc
++ URL:=http://hd-idle.sourceforge.net/
++endef
++
++define Package/hd-idle/description
++ hd-idle is a utility program for spinning-down external disks after a period of idle time.
++endef
++
++define Build/Compile
++ $(TARGET_CC) $(TARGET_CFLAGS) -o $(PKG_BUILD_DIR)/$(PKG_NAME) $(PKG_BUILD_DIR)/$(PKG_NAME).c
++endef
++
++define Package/hd-idle/conffiles
++/etc/config/hd-idle
++endef
++
++define Package/hd-idle/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/$(PKG_NAME).config $(1)/etc/config/$(PKG_NAME)
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/$(PKG_NAME).init $(1)/etc/init.d/$(PKG_NAME)
++endef
++
++$(eval $(call BuildPackage,hd-idle))
+diff --git a/feeds/packages/utils/hd-idle/files/hd-idle.config b/feeds/packages/utils/hd-idle/files/hd-idle.config
+new file mode 100644
+index 0000000..dbbd358
+--- /dev/null
++++ b/feeds/packages/utils/hd-idle/files/hd-idle.config
+@@ -0,0 +1,5 @@
++config 'hd-idle'
++ option 'disk' 'sda'
++ option 'enabled' '0'
++ option 'idle_time_unit' 'minutes'
++ option 'idle_time_interval' '10'
+diff --git a/feeds/packages/utils/hd-idle/files/hd-idle.init b/feeds/packages/utils/hd-idle/files/hd-idle.init
+new file mode 100644
+index 0000000..b8ce5cf
+--- /dev/null
++++ b/feeds/packages/utils/hd-idle/files/hd-idle.init
+@@ -0,0 +1,79 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008-2011 OpenWrt.org
++
++START=50
++
++append_bool() {
++ local section="$1"
++ local option="$2"
++ local value="$3"
++ local _val
++ config_get_bool _val "$section" "$option" '0'
++ [ "$_val" -gt 0 ] && append args "$3"
++}
++
++append_string() {
++ local section="$1"
++ local option="$2"
++ local value="$3"
++ local _val
++ config_get _val "$section" "$option"
++ [ -n "$_val" ] && append args "$3 $_val"
++}
++
++compute_seconds() {
++ local interval="$1"
++ local unit="$2"
++
++ if [ -z "$interval" ]
++ then
++ interval=10
++ fi
++
++ if [ -z "$unit" ]
++ then
++ unit="minutes"
++ fi
++
++ # compute interval in seconds
++ case "$unit" in
++ "days" )
++ interval_seconds=$(($interval*60*60*24))
++ ;;
++ "hours" )
++ interval_seconds=$(($interval*60*60))
++ ;;
++ "minutes" )
++ interval_seconds=$(($interval*60))
++ ;;
++ "seconds" )
++ interval_seconds=$interval
++ ;;
++ * )
++ # default is minutes
++ interval_seconds=$(($interval*60))
++ ;;
++ esac
++
++ echo $interval_seconds
++}
++
++start_service() {
++ local section="$1"
++ args=""
++ config_get "interval" "$section" "idle_time_interval"
++ config_get "unit" "$section" "idle_time_unit"
++ append_string "$section" "disk" "-a"
++ config_get_bool "enabled" "$section" "enabled" '1'
++ [ "$enabled" -gt 0 ] || return 1
++ service_start /usr/bin/hd-idle $args -i "$(compute_seconds $interval $unit)"
++}
++
++start() {
++ config_load "hd-idle"
++ config_foreach start_service "hd-idle"
++}
++
++stop() {
++ service_stop /usr/bin/hd-idle
++}
+diff --git a/feeds/packages/utils/hdparm/Makefile b/feeds/packages/utils/hdparm/Makefile
+new file mode 100644
+index 0000000..fabc464
+--- /dev/null
++++ b/feeds/packages/utils/hdparm/Makefile
+@@ -0,0 +1,42 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=hdparm
++PKG_VERSION:=9.48
++PKG_RELEASE:=1
++PKG_USE_MIPS16:=0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/$(PKG_NAME)
++PKG_MD5SUM:=213efdbe7471fad3408198918e164354
++PKG_MAINTAINER:=Richard Kunze <richard.kunze@web.de>
++PKG_LICENSE:=BSD-Style Open Source License
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS+=-D_GNU_SOURCE
++
++define Package/hdparm
++ SECTION:=utils
++ CATEGORY:=Utilities
++ SUBMENU:=disc
++ TITLE:=Hard disk drive configuration utilitity
++ URL:=http://sourceforge.net/projects/hdparm/
++endef
++
++define Package/hdparm/description
++ get/set SATA/IDE device parameters
++endef
++
++define Package/hdparm/install
++ $(INSTALL_DIR) $(1)/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/sbin
++endef
++
++$(eval $(call BuildPackage,hdparm))
+diff --git a/feeds/packages/utils/hfsprogs/Makefile b/feeds/packages/utils/hfsprogs/Makefile
+new file mode 100644
+index 0000000..9c44a35
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/Makefile
+@@ -0,0 +1,81 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=hfsprogs
++PKG_VERSION:=332.25
++PKG_RELEASE:=1
++
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_MAINTAINER:=Florian Fainelli <florian@openwrt.org>
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).orig.tar.gz
++PKG_SOURCE_URL:=http://archive.ubuntu.com/ubuntu/pool/universe/h/$(PKG_NAME)
++PKG_BUILD_DIR:=$(BUILD_DIR)/diskdev_cmds-$(PKG_VERSION)
++PKG_MD5SUM:=261c3de5ec0dcf5244e3f60d79c1d6f1
++PKG_LICENSE:=APSL 2.0
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/hfsprogs/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ SUBMENU:=Filesystem
++ DEPENDS:=+libopenssl
++endef
++
++define Package/hfsfsck
++ $(call Package/hfsprogs/Default)
++ TITLE:=fsck (fsck.hfs) utility from hfsprogs
++endef
++
++define Package/mkhfs
++ $(call Package/hfsprogs/Default)
++ TITLE:=mkfs (mkfs.hfs) utility from hfsprogs
++endef
++
++define Package/hfsfsck/description
++ Utilities to create and check HFS/HFS+ filesystems.
++ (fsck.hfs and fsck.hfsplus for checking integrity of HFS/HFS+ volumes)
++endef
++
++define Package/mkhfs/description
++ Utilities to create and check HFS/HFS+ filesystems.
++ (mkfs.hfs and mkfs.hfsplus for creating HFS/HFS+ volumes)
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ -f Makefile.lnx \
++ $(TARGET_CONFIGURE_OPTS) \
++ CFLAGS+="$(TARGET_CFLAGS) -I$(PKG_BUILD_DIR)/include -DDEBUG_BUILD=0 -D_FILE_OFFSET_BITS=64 -D LINUX=1 -D BSD=1" \
++ all
++endef
++
++define Package/hfsfsck/install
++ $(INSTALL_DIR) $(1)/lib/functions/fsck
++ $(INSTALL_DATA) ./files/hfsfsck.sh $(1)/lib/functions/fsck/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/fsck_hfs.tproj/fsck_hfs $(1)/usr/sbin/fsck.hfsplus
++ (cd $(1)/usr/sbin; ln -sf fsck.hfsplus fsck.hfs;)
++endef
++
++define Package/mkhfs/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/newfs_hfs.tproj/newfs_hfs $(1)/usr/sbin/mkfs.hfsplus
++ (cd $(1)/usr/sbin; ln -sf mkfs.hfsplus mkfs.hfs;)
++endef
++
++$(eval $(call BuildPackage,hfsfsck))
++$(eval $(call BuildPackage,mkhfs))
+diff --git a/feeds/packages/utils/hfsprogs/files/hfsfsck.sh b/feeds/packages/utils/hfsprogs/files/hfsfsck.sh
+new file mode 100644
+index 0000000..8bcd2c1
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/files/hfsfsck.sh
+@@ -0,0 +1,30 @@
++#!/bin/sh
++# Copyright 2015 OpenWrt.org
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++fsck_hfsfsck() {
++ hfsfsck "$device" 2>&1 | logger -t "fstab: hfsfsck ($device)"
++ local status="$?"
++ case "$status" in
++ 0) ;; #success
++ 4) reboot;;
++ 8) echo "hfsfsck ($device): Warning! Uncorrected errors."| logger -t fstab
++ return 1
++ ;;
++ *) echo "hfsfsck ($device): Error $status. Check not complete."| logger -t fstab;;
++ esac
++ return 0
++}
++
++fsck_hfs() {
++ fsck_hfsfsck "$@"
++}
++
++fsck_hfsplus() {
++ fsck_hfsfsck "$@"
++}
++
++append libmount_known_fsck "hfs"
++append libmount_known_fsck "hfsplus"
+diff --git a/feeds/packages/utils/hfsprogs/patches/0001-Create-short-Makefiles-for-Debian.patch b/feeds/packages/utils/hfsprogs/patches/0001-Create-short-Makefiles-for-Debian.patch
+new file mode 100644
+index 0000000..a8c4193
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0001-Create-short-Makefiles-for-Debian.patch
+@@ -0,0 +1,93 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 24 Oct 2013 01:11:21 -0200
++Subject: Create short Makefiles for Debian
++
++Create short Makefiles for compiling just the necessary parts for a
++Debian-based (and possibly other distributions) HFS+ filesystem
++utilities.
++---
++ Makefile.lnx | 8 ++++++++
++ fsck_hfs.tproj/Makefile.lnx | 16 ++++++++++++++++
++ fsck_hfs.tproj/dfalib/Makefile.lnx | 15 +++++++++++++++
++ newfs_hfs.tproj/Makefile.lnx | 12 ++++++++++++
++ 4 files changed, 51 insertions(+)
++ create mode 100644 Makefile.lnx
++ create mode 100644 fsck_hfs.tproj/Makefile.lnx
++ create mode 100644 fsck_hfs.tproj/dfalib/Makefile.lnx
++ create mode 100644 newfs_hfs.tproj/Makefile.lnx
++
++diff --git a/Makefile.lnx b/Makefile.lnx
++new file mode 100644
++index 0000000..687d1e7
++--- /dev/null
+++++ b/Makefile.lnx
++@@ -0,0 +1,8 @@
+++CC := gcc
+++CFLAGS += -I$(PWD)/include -DDEBUG_BUILD=0 -D_FILE_OFFSET_BITS=64 -D LINUX=1 -D BSD=1
+++SUBDIRS := newfs_hfs.tproj fsck_hfs.tproj
+++
+++all clean:
+++ for d in $(SUBDIRS); do $(MAKE) -C $$d -f Makefile.lnx $@; done
+++
+++export CC CFLAGS
++diff --git a/fsck_hfs.tproj/Makefile.lnx b/fsck_hfs.tproj/Makefile.lnx
++new file mode 100644
++index 0000000..977d7e8
++--- /dev/null
+++++ b/fsck_hfs.tproj/Makefile.lnx
++@@ -0,0 +1,16 @@
+++CFILES = fsck_hfs.c strings.c utilities.c cache.c fsck_debug.c
+++OFILES = $(CFILES:.c=.o)
+++
+++all: fsck_hfs
+++
+++fsck_hfs: $(OFILES) dfalib/libdfa.a
+++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OFILES) dfalib/libdfa.a
+++
+++dfalib/libdfa.a: FORCE
+++ $(MAKE) -C dfalib -f Makefile.lnx CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" libdfa.a
+++
+++clean:
+++ $(RM) fsck_hfs $(OFILES)
+++ $(MAKE) -C dfalib -f Makefile.lnx clean
+++
+++.PHONY : FORCE clean
++diff --git a/fsck_hfs.tproj/dfalib/Makefile.lnx b/fsck_hfs.tproj/dfalib/Makefile.lnx
++new file mode 100644
++index 0000000..8c07196
++--- /dev/null
+++++ b/fsck_hfs.tproj/dfalib/Makefile.lnx
++@@ -0,0 +1,15 @@
+++CFILES = hfs_endian.c BlockCache.c\
+++ BTree.c BTreeAllocate.c BTreeMiscOps.c \
+++ BTreeNodeOps.c BTreeScanner.c BTreeTreeOps.c\
+++ CatalogCheck.c HardLinkCheck.c\
+++ SBTree.c SControl.c SVerify1.c SVerify2.c\
+++ SRepair.c SRebuildCatalogBTree.c\
+++ SUtils.c SKeyCompare.c SDevice.c SExtents.c SAllocate.c\
+++ SCatalog.c SStubs.c VolumeBitmapCheck.c
+++OFILES = $(CFILES:.c=.o)
+++
+++libdfa.a: $(OFILES)
+++ ar rc $@ $?
+++
+++clean:
+++ $(RM) $(OFILES) libdfa.a
++diff --git a/newfs_hfs.tproj/Makefile.lnx b/newfs_hfs.tproj/Makefile.lnx
++new file mode 100644
++index 0000000..58e6700
++--- /dev/null
+++++ b/newfs_hfs.tproj/Makefile.lnx
++@@ -0,0 +1,12 @@
+++CFILES = hfs_endian.c makehfs.c newfs_hfs.c
+++OFILES = $(CFILES:.c=.o)
+++
+++all: newfs_hfs
+++
+++newfs_hfs: $(OFILES)
+++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OFILES) -lcrypto
+++
+++clean:
+++ $(RM) newfs_hfs $(OFILES)
+++
+++.PHONY : FORCE clean
+diff --git a/feeds/packages/utils/hfsprogs/patches/0002-Add-exclude-Darwin-specific-code.patch b/feeds/packages/utils/hfsprogs/patches/0002-Add-exclude-Darwin-specific-code.patch
+new file mode 100644
+index 0000000..0046c36
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0002-Add-exclude-Darwin-specific-code.patch
+@@ -0,0 +1,1407 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 24 Oct 2013 01:11:21 -0200
++Subject: Add/exclude Darwin-specific code
++
++Modify some of the files so that they can be compiled without the
++Apple owned frameworks in a Debian system (and possibly others).
++---
++ fsck_hfs.tproj/cache.c | 4 ++
++ fsck_hfs.tproj/dfalib/BTree.c | 2 +
++ fsck_hfs.tproj/dfalib/BlockCache.c | 3 +
++ fsck_hfs.tproj/dfalib/SBTree.c | 2 +
++ fsck_hfs.tproj/dfalib/SDevice.c | 92 ++++++++++++++++++++---------
++ fsck_hfs.tproj/dfalib/SKeyCompare.c | 2 +
++ fsck_hfs.tproj/dfalib/SRepair.c | 2 +
++ fsck_hfs.tproj/dfalib/SRuntime.h | 7 ++-
++ fsck_hfs.tproj/dfalib/SUtils.c | 5 +-
++ fsck_hfs.tproj/dfalib/SVerify2.c | 7 +++
++ fsck_hfs.tproj/dfalib/Scavenger.h | 11 +++-
++ fsck_hfs.tproj/dfalib/hfs_endian.c | 4 ++
++ fsck_hfs.tproj/dfalib/hfs_endian.h | 7 ++-
++ fsck_hfs.tproj/fsck_hfs.c | 61 +++++++++++++++----
++ fsck_hfs.tproj/utilities.c | 8 ++-
++ include/missing.h | 115 ++++++++++++++++++++++++++++++++++++
++ newfs_hfs.tproj/hfs_endian.c | 5 ++
++ newfs_hfs.tproj/hfs_endian.h | 5 ++
++ newfs_hfs.tproj/makehfs.c | 72 ++++++++++++++++------
++ newfs_hfs.tproj/newfs_hfs.c | 74 ++++++++++++++++++++---
++ newfs_hfs.tproj/newfs_hfs.h | 26 ++++----
++ 21 files changed, 429 insertions(+), 85 deletions(-)
++ create mode 100644 include/missing.h
++
++diff --git a/fsck_hfs.tproj/cache.c b/fsck_hfs.tproj/cache.c
++index be46195..527088a 100644
++--- a/fsck_hfs.tproj/cache.c
+++++ b/fsck_hfs.tproj/cache.c
++@@ -26,7 +26,11 @@
++ #include <stdlib.h>
++ #include <sys/mman.h>
++ #include <sys/stat.h>
+++#if LINUX
+++#include "missing.h"
+++#else
++ #include <sys/types.h>
+++#endif /* __LINUX__ */
++ #include <sys/uio.h>
++ #include <unistd.h>
++ #include <string.h>
++diff --git a/fsck_hfs.tproj/dfalib/BTree.c b/fsck_hfs.tproj/dfalib/BTree.c
++index edd8301..7ad9fe0 100644
++--- a/fsck_hfs.tproj/dfalib/BTree.c
+++++ b/fsck_hfs.tproj/dfalib/BTree.c
++@@ -1705,7 +1705,9 @@ OSStatus BTGetInformation (SFCB *filePtr,
++ UInt16 version,
++ BTreeInfoRec *info )
++ {
+++#if !LINUX
++ #pragma unused (version)
+++#endif
++
++ BTreeControlBlockPtr btreePtr;
++
++diff --git a/fsck_hfs.tproj/dfalib/BlockCache.c b/fsck_hfs.tproj/dfalib/BlockCache.c
++index 1bb952f..e3a28a2 100644
++--- a/fsck_hfs.tproj/dfalib/BlockCache.c
+++++ b/fsck_hfs.tproj/dfalib/BlockCache.c
++@@ -20,6 +20,9 @@
++ * @APPLE_LICENSE_HEADER_END@
++ */
++
+++#if LINUX
+++#include "missing.h"
+++#endif
++ #include "SRuntime.h"
++ #include "Scavenger.h"
++ #include "../cache.h"
++diff --git a/fsck_hfs.tproj/dfalib/SBTree.c b/fsck_hfs.tproj/dfalib/SBTree.c
++index 2fbcd1d..cd81b13 100644
++--- a/fsck_hfs.tproj/dfalib/SBTree.c
+++++ b/fsck_hfs.tproj/dfalib/SBTree.c
++@@ -322,7 +322,9 @@ ErrorExit:
++ OSStatus
++ SetEndOfForkProc ( SFCB *filePtr, FSSize minEOF, FSSize maxEOF )
++ {
+++#if !LINUX
++ #pragma unused (maxEOF)
+++#endif
++
++ OSStatus result;
++ UInt32 actualSectorsAdded;
++diff --git a/fsck_hfs.tproj/dfalib/SDevice.c b/fsck_hfs.tproj/dfalib/SDevice.c
++index bf6f61c..9a46023 100644
++--- a/fsck_hfs.tproj/dfalib/SDevice.c
+++++ b/fsck_hfs.tproj/dfalib/SDevice.c
++@@ -2,7 +2,7 @@
++ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
++ *
++ * @APPLE_LICENSE_HEADER_START@
++- *
+++ *
++ * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
++ * Reserved. This file contains Original Code and/or Modifications of
++ * Original Code as defined in and that are subject to the Apple Public
++@@ -10,7 +10,7 @@
++ * except in compliance with the License. Please obtain a copy of the
++ * License at http://www.apple.com/publicsource and read it before using
++ * this file.
++- *
+++ *
++ * The Original Code and all software distributed under the License are
++ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
++ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
++@@ -18,7 +18,7 @@
++ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
++ * License for the specific language governing rights and limitations
++ * under the License."
++- *
+++ *
++ * @APPLE_LICENSE_HEADER_END@
++ */
++ #include "SRuntime.h"
++@@ -28,33 +28,71 @@
++ #include <unistd.h>
++ #include <errno.h>
++ #include <sys/ioctl.h>
++-
+++#if LINUX
+++#include <fcntl.h>
+++#include <sys/stat.h>
+++#else
++ #include <IOKit/storage/IOMediaBSDClient.h>
++-
+++#endif /* LINUX */
++ #else
++-
++ #include <Files.h>
++ #include <Device.h>
++ #include <Disks.h>
++
++ #endif
++
++-
++ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
++ {
++ #if BSD
++ UInt64 devBlockCount = 0;
++ int devBlockSize = 0;
+++#if LINUX
+++ struct stat stbuf;
+++
+++ devBlockSize = 512;
++
+++#ifndef BLKGETSIZE
+++#define BLKGETSIZE _IO(0x12,96)
+++#endif
+++#ifndef BLKGETSIZE64
+++#define BLKGETSIZE64 _IOR(0x12,114,size_t)
+++#endif
+++ if (fstat(driveRefNum, &stbuf) < 0){
+++ printf("Error: %s\n", strerror(errno));
+++ return(-1);
+++ }
+++
+++ if (S_ISREG(stbuf.st_mode)) {
+++ devBlockCount = stbuf.st_size / 512;
+++ }
+++ else if (S_ISBLK(stbuf.st_mode)) {
+++ unsigned long size;
+++ u_int64_t size64;
+++ if (!ioctl(driveRefNum, BLKGETSIZE64, &size64))
+++ devBlockCount = size64 / 512;
+++ else if (!ioctl(driveRefNum, BLKGETSIZE, &size))
+++ devBlockCount = size;
+++ else{
+++ printf("Error: %s\n", strerror(errno));
+++ return(-1);
+++ }
+++
+++ }
+++ else{
+++ printf("Device is not a block device");
+++ return(-1);
+++ }
+++#elif BSD
++ if (ioctl(driveRefNum, DKIOCGETBLOCKCOUNT, &devBlockCount) < 0) {
++ printf("ioctl(DKIOCGETBLOCKCOUNT) for fd %d: %s\n", driveRefNum, strerror(errno));
++ return (-1);
++ }
++-
+++
++ if (ioctl(driveRefNum, DKIOCGETBLOCKSIZE, &devBlockSize) < 0) {
++ printf("ioctl(DKIOCGETBLOCKSIZE) for fd %d: %s\n", driveRefNum, strerror(errno));
++ return (-1);
++ }
+++#endif /* BSD */
++
++ if (devBlockSize != 512) {
++ *numBlocks = (devBlockCount * (UInt64)devBlockSize) / 512;
++@@ -70,24 +108,24 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
++ {
++ /* return format list status code */
++ kFmtLstCode = 6,
++-
+++
++ /* reference number of .SONY driver */
++ kSonyRefNum = 0xfffb,
++-
+++
++ /* values returned by DriveStatus in DrvSts.twoSideFmt */
++ kSingleSided = 0,
++ kDoubleSided = -1,
++ kSingleSidedSize = 800, /* 400K */
++ kDoubleSidedSize = 1600, /* 800K */
++-
+++
++ /* values in DrvQEl.qType */
++ kWordDrvSiz = 0,
++ kLongDrvSiz = 1,
++-
+++
++ /* more than enough formatListRecords */
++ kMaxFormatListRecs = 16
++ };
++-
+++
++ ParamBlockRec pb;
++ FormatListRec formatListRecords[kMaxFormatListRecs];
++ DrvSts status;
++@@ -95,22 +133,22 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
++ OSErr result;
++ unsigned long blocks = 0;
++
++-
+++
++ /* Attempt to get the drive's format list. */
++ /* (see the Technical Note "What Your Sony Drives For You") */
++-
+++
++ pb.cntrlParam.ioVRefNum = driveQElementPtr->dQDrive;
++ pb.cntrlParam.ioCRefNum = driveQElementPtr->dQRefNum;
++ pb.cntrlParam.csCode = kFmtLstCode;
++ pb.cntrlParam.csParam[0] = kMaxFormatListRecs;
++ *(long *)&pb.cntrlParam.csParam[1] = (long)&formatListRecords[0];
++-
+++
++ result = PBStatusSync(&pb);
++-
+++
++ if ( result == noErr )
++ {
++ /* The drive supports ReturnFormatList status call. */
++-
+++
++ /* Get the current disk's size. */
++ for( formatListRecIndex = 0;
++ formatListRecIndex < pb.cntrlParam.csParam[0];
++@@ -131,7 +169,7 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
++ else if ( driveQElementPtr->dQRefNum == (short)kSonyRefNum )
++ {
++ /* The drive is a non-SuperDrive floppy which only supports 400K and 800K disks */
++-
+++
++ result = DriveStatus(driveQElementPtr->dQDrive, &status);
++ if ( result == noErr )
++ {
++@@ -140,11 +178,11 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
++ case kSingleSided:
++ blocks = kSingleSidedSize;
++ break;
++-
+++
++ case kDoubleSided:
++ blocks = kDoubleSidedSize;
++ break;
++-
+++
++ default: // This should never happen
++ result = paramErr;
++ break;
++@@ -155,20 +193,20 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
++ {
++ /* The drive is not a floppy and it doesn't support ReturnFormatList */
++ /* so use the dQDrvSz field(s) */
++-
+++
++ result = noErr; /* reset result */
++-
+++
++ switch ( driveQElementPtr->qType )
++ {
++ case kWordDrvSiz:
++ blocks = driveQElementPtr->dQDrvSz;
++ break;
++-
+++
++ case kLongDrvSiz:
++ blocks = ((unsigned long)driveQElementPtr->dQDrvSz2 << 16) +
++ driveQElementPtr->dQDrvSz;
++ break;
++-
+++
++ default: // This should never happen
++ result = paramErr;
++ break;
++@@ -177,7 +215,7 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
++
++ *numBlocks = blocks;
++ *blockSize = 512;
++-
+++
++ return( result );
++ #endif
++ }
++@@ -188,7 +226,7 @@ OSErr DeviceRead(int device, int drive, void* buffer, SInt64 offset, UInt32 reqB
++ #if BSD
++ off_t seek_off;
++ ssize_t nbytes;
++-
+++
++ *actBytes = 0;
++
++ seek_off = lseek(device, offset, SEEK_SET);
++diff --git a/fsck_hfs.tproj/dfalib/SKeyCompare.c b/fsck_hfs.tproj/dfalib/SKeyCompare.c
++index 46e145f..18d99c5 100644
++--- a/fsck_hfs.tproj/dfalib/SKeyCompare.c
+++++ b/fsck_hfs.tproj/dfalib/SKeyCompare.c
++@@ -454,7 +454,9 @@ SInt32 CompareExtentKeysPlus( const HFSPlusExtentKey *searchKey, const HFSPlusEx
++ * The name portion of the key is compared using a 16-bit binary comparison.
++ * This is called from the b-tree code.
++ */
+++#if !LINUX
++ __private_extern__
+++#endif
++ SInt32
++ CompareAttributeKeys(const AttributeKey *searchKey, const AttributeKey *trialKey)
++ {
++diff --git a/fsck_hfs.tproj/dfalib/SRepair.c b/fsck_hfs.tproj/dfalib/SRepair.c
++index 01c1a10..8eb759c 100644
++--- a/fsck_hfs.tproj/dfalib/SRepair.c
+++++ b/fsck_hfs.tproj/dfalib/SRepair.c
++@@ -1617,7 +1617,9 @@ Output:
++
++ static OSErr FixWrapperExtents( SGlobPtr GPtr, RepairOrderPtr p )
++ {
+++#if !LINUX
++ #pragma unused (p)
+++#endif
++
++ OSErr err;
++ HFSMasterDirectoryBlock *mdb;
++diff --git a/fsck_hfs.tproj/dfalib/SRuntime.h b/fsck_hfs.tproj/dfalib/SRuntime.h
++index 646917b..770e3ef 100644
++--- a/fsck_hfs.tproj/dfalib/SRuntime.h
+++++ b/fsck_hfs.tproj/dfalib/SRuntime.h
++@@ -27,8 +27,11 @@
++ #define __SRUNTIME__
++
++ #if BSD
++-
+++#if LINUX
+++#include "missing.h"
+++#else
++ #include <sys/types.h>
+++#endif
++ #include <stdlib.h>
++ #include <string.h>
++ #include <stdio.h>
++@@ -91,10 +94,12 @@ typedef const unsigned char * ConstStr255Param;
++
++ typedef u_int32_t HFSCatalogNodeID;
++
+++#if !LINUX
++ enum {
++ false = 0,
++ true = 1
++ };
+++#endif
++
++ /* OS error codes */
++ enum {
++diff --git a/fsck_hfs.tproj/dfalib/SUtils.c b/fsck_hfs.tproj/dfalib/SUtils.c
++index 72035f0..6e9253e 100644
++--- a/fsck_hfs.tproj/dfalib/SUtils.c
+++++ b/fsck_hfs.tproj/dfalib/SUtils.c
++@@ -380,7 +380,8 @@ void InvalidateCalculatedVolumeBitMap( SGlobPtr GPtr )
++ // GPtr->realVCB Real in-memory vcb
++ //------------------------------------------------------------------------------
++
++-#if !BSD
+++#if BSD
+++#if !LINUX
++ OSErr GetVolumeFeatures( SGlobPtr GPtr )
++ {
++ OSErr err;
++@@ -418,7 +419,7 @@ OSErr GetVolumeFeatures( SGlobPtr GPtr )
++ return( noErr );
++ }
++ #endif
++-
+++#endif
++
++
++ /*-------------------------------------------------------------------------------
++diff --git a/fsck_hfs.tproj/dfalib/SVerify2.c b/fsck_hfs.tproj/dfalib/SVerify2.c
++index 6a47935..c68f3d8 100644
++--- a/fsck_hfs.tproj/dfalib/SVerify2.c
+++++ b/fsck_hfs.tproj/dfalib/SVerify2.c
++@@ -32,7 +32,9 @@
++ */
++
++ #include <sys/ioctl.h>
+++#if !LINUX
++ #include <sys/disk.h>
+++#endif
++
++ #include "BTree.h"
++ #include "BTreePrivate.h"
++@@ -1354,8 +1356,13 @@ OSErr CompareVolumeHeader( SGlobPtr GPtr, HFSPlusVolumeHeader *volumeHeader )
++ * clump size for read-only media is irrelevant we skip the clump size
++ * check to avoid non useful warnings.
++ */
+++#if LINUX
+++ // FIXME
+++ isWriteable = 1;
+++#else
++ isWriteable = 0;
++ ioctl( GPtr->DrvNum, DKIOCISWRITABLE, &isWriteable );
+++#endif
++ if ( isWriteable != 0 &&
++ volumeHeader->catalogFile.clumpSize != vcb->vcbCatalogFile->fcbClumpSize ) {
++ PrintError(GPtr, E_InvalidClumpSize, 0);
++diff --git a/fsck_hfs.tproj/dfalib/Scavenger.h b/fsck_hfs.tproj/dfalib/Scavenger.h
++index cf53970..edb3a80 100644
++--- a/fsck_hfs.tproj/dfalib/Scavenger.h
+++++ b/fsck_hfs.tproj/dfalib/Scavenger.h
++@@ -37,11 +37,16 @@
++ #include "../fsck_debug.h"
++
++ #include <assert.h>
+++#if LINUX
+++#define XATTR_MAXNAMELEN 127
+++#include <limits.h>
+++#else
++ #include <sys/xattr.h>
++ #include <sys/acl.h>
++ #include <sys/kauth.h>
++-#include <sys/errno.h>
++ #include <sys/syslimits.h>
+++#endif
+++#include <sys/errno.h>
++
++ #ifdef __cplusplus
++ extern "C" {
++@@ -1465,4 +1470,8 @@ extern int AllocateContigBitmapBits (SVCB *vcb, UInt32 numBlocks, UInt32 *actua
++ };
++ #endif
++
+++/* #if LINUX
+++#undef XATTR_MAXNAMELEN
+++#endif */
+++
++ #endif /* __SCAVENGER__ */
++diff --git a/fsck_hfs.tproj/dfalib/hfs_endian.c b/fsck_hfs.tproj/dfalib/hfs_endian.c
++index 7fa5385..69500c1 100755
++--- a/fsck_hfs.tproj/dfalib/hfs_endian.c
+++++ b/fsck_hfs.tproj/dfalib/hfs_endian.c
++@@ -31,7 +31,11 @@
++ #include <sys/types.h>
++ #include <sys/stat.h>
++
+++#if LINUX
+++#include "missing.h"
+++#else
++ #include <architecture/byte_order.h>
+++#endif
++ #include <hfs/hfs_format.h>
++
++ #include "Scavenger.h"
++diff --git a/fsck_hfs.tproj/dfalib/hfs_endian.h b/fsck_hfs.tproj/dfalib/hfs_endian.h
++index 52d0c3a..0763d9d 100755
++--- a/fsck_hfs.tproj/dfalib/hfs_endian.h
+++++ b/fsck_hfs.tproj/dfalib/hfs_endian.h
++@@ -27,9 +27,14 @@
++ *
++ * This file prototypes endian swapping routines for the HFS/HFS Plus
++ * volume format.
++- */
+++*/
++ #include <hfs/hfs_format.h>
+++#if LINUX
+++#include <endian.h>
+++#include <byteswap.h>
+++#else
++ #include <architecture/byte_order.h>
+++#endif
++ #include "SRuntime.h"
++
++ /*********************/
++diff --git a/fsck_hfs.tproj/fsck_hfs.c b/fsck_hfs.tproj/fsck_hfs.c
++index 90532fd..f1a18bd 100644
++--- a/fsck_hfs.tproj/fsck_hfs.c
+++++ b/fsck_hfs.tproj/fsck_hfs.c
++@@ -24,10 +24,14 @@
++ #include <sys/types.h>
++ #include <sys/stat.h>
++ #include <sys/param.h>
+++#if !LINUX
++ #include <sys/ucred.h>
+++#endif
++ #include <sys/mount.h>
++ #include <sys/ioctl.h>
+++#if !LINUX
++ #include <sys/disk.h>
+++#endif
++
++ #include <hfs/hfs_mount.h>
++
++@@ -195,8 +199,12 @@ main(argc, argv)
++ if (guiControl)
++ debug = 0; /* debugging is for command line only */
++
+++#if LINUX
+++// FIXME
+++#else
++ if (signal(SIGINT, SIG_IGN) != SIG_IGN)
++ (void)signal(SIGINT, catch);
+++#endif
++
++ if (argc < 1) {
++ (void) fprintf(stderr, "%s: missing special-device\n", progname);
++@@ -218,7 +226,9 @@ checkfilesys(char * filesys)
++ int chkLev, repLev, logLev;
++ int blockDevice_fd, canWrite;
++ char *unraw, *mntonname;
+++#if !LINUX
++ struct statfs *fsinfo;
+++#endif
++ int fs_fd=-1; // fd to the root-dir of the fs we're checking (only w/lfag == 1)
++
++ flags = 0;
++@@ -227,7 +237,9 @@ checkfilesys(char * filesys)
++ canWrite = 0;
++ unraw = NULL;
++ mntonname = NULL;
++-
+++#if LINUX
+++ // FIXME
+++#else
++ if (lflag) {
++ result = getmntinfo(&fsinfo, MNT_NOWAIT);
++
++@@ -257,10 +269,10 @@ checkfilesys(char * filesys)
++ }
++ }
++ }
++-
+++#endif
++ if (debug && preen)
++ pwarn("starting\n");
++-
+++
++ if (setup( filesys, &blockDevice_fd, &canWrite ) == 0) {
++ if (preen)
++ pfatal("CAN'T CHECK FILE SYSTEM.");
++@@ -278,7 +290,7 @@ checkfilesys(char * filesys)
++ repLev = kMajorRepairs;
++ logLev = kVerboseLog;
++
++- if (yflag)
+++ if (yflag)
++ repLev = kMajorRepairs;
++
++ if (quick) {
++@@ -298,16 +310,16 @@ checkfilesys(char * filesys)
++
++ if (nflag)
++ repLev = kNeverRepair;
++-
+++
++ if ( rebuildCatalogBtree ) {
++ chkLev = kPartialCheck;
++ repLev = kForceRepairs; // this will force rebuild of catalog B-Tree file
++ }
++-
+++
++ /*
++ * go check HFS volume...
++ */
++- result = CheckHFS( fsreadfd, fswritefd, chkLev, repLev, logLev,
+++ result = CheckHFS( fsreadfd, fswritefd, chkLev, repLev, logLev,
++ guiControl, lostAndFoundMode, canWrite, &fsmodified );
++ if (!hotroot) {
++ ckfini(1);
++@@ -330,6 +342,9 @@ checkfilesys(char * filesys)
++ }
++ }
++ } else {
+++#if LINUX
+++ // FIXME
+++#else
++ struct statfs stfs_buf;
++ /*
++ * Check to see if root is mounted read-write.
++@@ -339,19 +354,25 @@ checkfilesys(char * filesys)
++ else
++ flags = 0;
++ ckfini(flags & MNT_RDONLY);
+++#endif
++ }
++
++ /* XXX free any allocated memory here */
++
++ if (hotroot && fsmodified) {
+++#if !LINUX
++ struct hfs_mount_args args;
+++#endif
++ /*
++ * We modified the root. Do a mount update on
++ * it, unless it is read-write, so we can continue.
++ */
++ if (!preen)
++ printf("\n***** FILE SYSTEM WAS MODIFIED *****\n");
++- if (flags & MNT_RDONLY) {
+++#if LINUX
+++ // FIXME
+++#else
+++ if (flags & MNT_RDONLY) {
++ bzero(&args, sizeof(args));
++ flags |= MNT_UPDATE | MNT_RELOAD;
++ if (mount("hfs", "/", flags, &args) == 0) {
++@@ -359,6 +380,7 @@ checkfilesys(char * filesys)
++ goto ExitThisRoutine;
++ }
++ }
+++#endif
++ if (!preen)
++ printf("\n***** REBOOT NOW *****\n");
++ sync();
++@@ -367,7 +389,7 @@ checkfilesys(char * filesys)
++ }
++
++ result = (result == 0) ? 0 : EEXIT;
++-
+++
++ ExitThisRoutine:
++ if (lflag) {
++ fcntl(fs_fd, F_THAW_FS, NULL);
++@@ -401,16 +423,18 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
++ fswritefd = -1;
++ *blockDevice_fdPtr = -1;
++ *canWritePtr = 0;
++-
+++
++ if (stat(dev, &statb) < 0) {
++ printf("Can't stat %s: %s\n", dev, strerror(errno));
++ return (0);
++ }
+++#if !LINUX
++ if ((statb.st_mode & S_IFMT) != S_IFCHR) {
++ pfatal("%s is not a character device", dev);
++ if (reply("CONTINUE") == 0)
++ return (0);
++ }
+++#endif
++ if ((fsreadfd = open(dev, O_RDONLY)) < 0) {
++ printf("Can't open %s: %s\n", dev, strerror(errno));
++ return (0);
++@@ -419,7 +443,7 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
++ /* attempt to get write access to the block device and if not check if volume is */
++ /* mounted read-only. */
++ getWriteAccess( dev, blockDevice_fdPtr, canWritePtr );
++-
+++
++ if (preen == 0 && !guiControl)
++ printf("** %s", dev);
++ if (nflag || (fswritefd = open(dev, O_WRONLY)) < 0) {
++@@ -433,10 +457,14 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
++ printf("\n");
++
++ /* Get device block size to initialize cache */
+++#if LINUX
+++ devBlockSize = 512;
+++#else
++ if (ioctl(fsreadfd, DKIOCGETBLOCKSIZE, &devBlockSize) < 0) {
++ pfatal ("Can't get device block size\n");
++ return (0);
++ }
+++#endif
++
++ /* calculate the cache block size and total blocks */
++ if (CalculateCacheSize(userCacheSize, &cacheBlockSize, &cacheTotalBlocks, debug) != 0) {
++@@ -463,11 +491,15 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
++
++ static void getWriteAccess( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
++ {
+++#if !LINUX
++ int i;
++ int myMountsCount;
+++#endif
++ void * myPtr;
++ char * myCharPtr;
+++#if !LINUX
++ struct statfs * myBufPtr;
+++#endif
++ void * myNamePtr;
++
++ myPtr = NULL;
++@@ -490,6 +522,9 @@ static void getWriteAccess( char *dev, int *blockDevice_fdPtr, int *canWritePtr
++ }
++
++ // get count of mounts then get the info for each
+++#if LINUX
+++ // FIXME
+++#else
++ myMountsCount = getfsstat( NULL, 0, MNT_NOWAIT );
++ if ( myMountsCount < 0 )
++ goto ExitThisRoutine;
++@@ -513,8 +548,8 @@ static void getWriteAccess( char *dev, int *blockDevice_fdPtr, int *canWritePtr
++ }
++ myBufPtr++;
++ }
++- *canWritePtr = 1; // single user will get us here, f_mntfromname is not /dev/diskXXXX
++-
+++#endif
+++ *canWritePtr = 1; // single user will get us here, f_mntfromname is not /dev/diskXXXX
++ ExitThisRoutine:
++ if ( myPtr != NULL )
++ free( myPtr );
++diff --git a/fsck_hfs.tproj/utilities.c b/fsck_hfs.tproj/utilities.c
++index ee41bef..8e1cd77 100644
++--- a/fsck_hfs.tproj/utilities.c
+++++ b/fsck_hfs.tproj/utilities.c
++@@ -183,12 +183,14 @@ retry:
++ printf("Can't stat %s\n", raw);
++ return (origname);
++ }
+++#if !LINUX
++ if ((stchar.st_mode & S_IFMT) == S_IFCHR) {
++ return (raw);
++ } else {
++ printf("%s is not a character device\n", raw);
++ return (origname);
++ }
+++#endif
++ } else if ((stblock.st_mode & S_IFMT) == S_IFCHR && !retried) {
++ newname = unrawname(newname);
++ retried++;
++@@ -214,7 +216,11 @@ rawname(char *name)
++ *dp = 0;
++ (void)strcpy(rawbuf, name);
++ *dp = '/';
++- (void)strcat(rawbuf, "/r");
+++#if LINUX
+++ (void)strcat(rawbuf, "/");
+++#else
+++ (void)strcat(rawbuf,"/r");
+++#endif
++ (void)strcat(rawbuf, &dp[1]);
++
++ return (rawbuf);
++diff --git a/include/missing.h b/include/missing.h
++new file mode 100644
++index 0000000..0a859c4
++--- /dev/null
+++++ b/include/missing.h
++@@ -0,0 +1,114 @@
+++#ifndef _MISSING_H_
+++#define _MISSING_H_
+++
+++#include <endian.h>
+++#include <byteswap.h>
+++#include <errno.h>
+++#include <stdint.h>
+++#include <string.h>
+++
+++#define MAXBSIZE (256 * 4096)
+++
+++#ifndef true
+++#define true 1
+++#endif
+++#ifndef false
+++#define false 0
+++#endif
+++
+++/* Mac types */
+++
+++/* 8 Bit */
+++#ifndef UInt8
+++#define UInt8 uint8_t
+++#endif
+++#ifndef u_int8_t
+++#define u_int8_t UInt8
+++#endif
+++#ifndef SInt8
+++#define SInt8 int8_t
+++#endif
+++
+++/* 16 Bit */
+++#ifndef UInt16
+++#define UInt16 uint16_t
+++#endif
+++#ifndef u_int16_t
+++#define u_int16_t UInt16
+++#endif
+++#ifndef SInt16
+++#define SInt16 int16_t
+++#endif
+++
+++/* 32 Bit */
+++#ifndef UInt32
+++#define UInt32 uint32_t
+++#endif
+++#ifndef u_int32_t
+++#define u_int32_t UInt32
+++#endif
+++#ifndef SInt32
+++#define SInt32 int32_t
+++#endif
+++
+++/* 64 Bit */
+++#ifndef UInt64
+++#define UInt64 uint64_t
+++#endif
+++#ifndef u_int64_t
+++#define u_int64_t UInt64
+++#endif
+++#ifndef SInt64
+++#define SInt64 int64_t
+++#endif
+++
+++#define UniChar u_int16_t
+++#define Boolean u_int8_t
+++
+++#define UF_NODUMP 0x00000001
+++
+++/* syslimits.h */
+++#define NAME_MAX 255
+++
+++/* Byteswap stuff */
+++#define NXSwapHostLongToBig(x) cpu_to_be64(x)
+++#define NXSwapBigShortToHost(x) be16_to_cpu(x)
+++#define OSSwapBigToHostInt16(x) be16_to_cpu(x)
+++#define NXSwapBigLongToHost(x) be32_to_cpu(x)
+++#define OSSwapBigToHostInt32(x) be32_to_cpu(x)
+++#define NXSwapBigLongLongToHost(x) be64_to_cpu(x)
+++#define OSSwapBigToHostInt64(x) be64_to_cpu(x)
+++
+++#if __BYTE_ORDER == __LITTLE_ENDIAN
+++/* Big Endian Swaps */
+++#ifndef be16_to_cpu
+++#define be16_to_cpu(x) bswap_16(x)
+++#endif
+++#ifndef be32_to_cpu
+++#define be32_to_cpu(x) bswap_32(x)
+++#endif
+++#ifndef be64_to_cpu
+++#define be64_to_cpu(x) bswap_64(x)
+++#endif
+++#ifndef cpu_to_be64
+++#define cpu_to_be64(x) bswap_64(x)
+++#endif
+++#elif __BYTE_ORDER == __BIG_ENDIAN
+++/* Big endian doesn't swap */
+++#ifndef be16_to_cpu
+++#define be16_to_cpu(x) (x)
+++#endif
+++#ifndef be32_to_cpu
+++#define be32_to_cpu(x) (x)
+++#endif
+++#ifndef be64_to_cpu
+++#define be64_to_cpu(x) (x)
+++#endif
+++#ifndef cpu_to_be64
+++#define cpu_to_be64(x) (x)
+++#endif
+++#endif
+++
+++#define KAUTH_FILESEC_XATTR "com.apple.system.Security"
+++
+++#endif
++diff --git a/newfs_hfs.tproj/hfs_endian.c b/newfs_hfs.tproj/hfs_endian.c
++index 117b7f8..fdf7353 100644
++--- a/newfs_hfs.tproj/hfs_endian.c
+++++ b/newfs_hfs.tproj/hfs_endian.c
++@@ -30,7 +30,12 @@
++ #include <sys/types.h>
++ #include <sys/stat.h>
++
+++#if LINUX
+++#include "missing.h"
+++#else
++ #include <architecture/byte_order.h>
+++#endif
+++
++ #include <hfs/hfs_format.h>
++
++ #include "hfs_endian.h"
++diff --git a/newfs_hfs.tproj/hfs_endian.h b/newfs_hfs.tproj/hfs_endian.h
++index 8d9d01d..5c7ff57 100644
++--- a/newfs_hfs.tproj/hfs_endian.h
+++++ b/newfs_hfs.tproj/hfs_endian.h
++@@ -29,7 +29,12 @@
++ * volume format.
++ */
++ #include <hfs/hfs_format.h>
+++#if LINUX
+++#include <endian.h>
+++#include <byteswap.h>
+++#else
++ #include <architecture/byte_order.h>
+++#endif
++
++ /*********************/
++ /* BIG ENDIAN Macros */
++diff --git a/newfs_hfs.tproj/makehfs.c b/newfs_hfs.tproj/makehfs.c
++index 085222f..7609779 100644
++--- a/newfs_hfs.tproj/makehfs.c
+++++ b/newfs_hfs.tproj/makehfs.c
++@@ -31,10 +31,16 @@
++ #include <sys/param.h>
++ #include <sys/types.h>
++ #include <sys/time.h>
+++#if LINUX
+++#include <time.h>
+++#include "missing.h"
+++#endif
++ #include <sys/errno.h>
++ #include <sys/stat.h>
++ #include <sys/sysctl.h>
+++#if !LINUX
++ #include <sys/vmmeter.h>
+++#endif
++
++ #include <err.h>
++ #include <errno.h>
++@@ -47,13 +53,14 @@
++
++ #include <openssl/sha.h>
++
+++#if !LINUX
++ #include <architecture/byte_order.h>
++
++ #include <CoreFoundation/CFString.h>
++ #include <CoreFoundation/CFStringEncodingExt.h>
++
++ extern Boolean _CFStringGetFileSystemRepresentation(CFStringRef string, UInt8 *buffer, CFIndex maxBufLen);
++-
+++#endif
++
++ #include <hfs/hfs_format.h>
++ #include <hfs/hfs_mount.h>
++@@ -129,7 +136,9 @@ static UInt32 Largest __P((UInt32 a, UInt32 b, UInt32 c, UInt32 d ));
++ static void MarkBitInAllocationBuffer __P((HFSPlusVolumeHeader *header,
++ UInt32 allocationBlock, void* sectorBuffer, UInt32 *sector));
++
+++#if !LINUX
++ static UInt32 GetDefaultEncoding();
+++#endif
++
++ static UInt32 UTCToLocal __P((UInt32 utcTime));
++
++@@ -158,11 +167,14 @@ void SETOFFSET (void *buffer, UInt16 btNodeSize, SInt16 recOffset, SInt16 vecOff
++
++ #define ROUNDUP(x, u) (((x) % (u) == 0) ? (x) : ((x)/(u) + 1) * (u))
++
++-#define ENCODING_TO_BIT(e) \
+++#if LINUX
+++#define ENCODING_TO_BIT(e) (e)
+++#else
+++#define ENCODING_TO_BIT(e)
++ ((e) < 48 ? (e) : \
++ ((e) == kCFStringEncodingMacUkrainian ? 48 : \
++ ((e) == kCFStringEncodingMacFarsi ? 49 : 0)))
++-
+++#endif
++ /*
++ * make_hfs
++ *
++@@ -528,6 +540,7 @@ InitMDB(hfsparams_t *defaults, UInt32 driveBlocks, HFS_MDB *mdbp)
++ * Map UTF-8 input into a Mac encoding.
++ * On conversion errors "untitled" is used as a fallback.
++ */
+++#if !LINUX
++ {
++ UniChar unibuf[kHFSMaxVolumeNameChars];
++ CFStringRef cfstr;
++@@ -553,7 +566,11 @@ InitMDB(hfsparams_t *defaults, UInt32 driveBlocks, HFS_MDB *mdbp)
++ bcopy(&mdbp->drVN[1], defaults->volumeName, mdbp->drVN[0]);
++ defaults->volumeName[mdbp->drVN[0]] = '\0';
++ }
+++#endif
++ /* Save the encoding hint in the Finder Info (field 4). */
+++ mdbp->drVN[0] = strlen(defaults->volumeName);
+++ bcopy(defaults->volumeName,&mdbp->drVN[1],mdbp->drVN[0]);
+++
++ mdbp->drFndrInfo[4] = SET_HFS_TEXT_ENCODING(defaults->encodingHint);
++
++ mdbp->drWrCnt = kWriteSeqNum;
++@@ -1100,9 +1117,11 @@ InitCatalogRoot_HFSPlus(const hfsparams_t *dp, const HFSPlusVolumeHeader *header
++ UInt16 nodeSize;
++ SInt16 offset;
++ UInt32 unicodeBytes;
+++#if !LINUX
++ UInt8 canonicalName[256];
++ CFStringRef cfstr;
++ Boolean cfOK;
+++#endif
++ int index = 0;
++
++ nodeSize = dp->catalogNodeSize;
++@@ -1122,7 +1141,9 @@ InitCatalogRoot_HFSPlus(const hfsparams_t *dp, const HFSPlusVolumeHeader *header
++ * First record is always the root directory...
++ */
++ ckp = (HFSPlusCatalogKey *)((UInt8 *)buffer + offset);
++-
+++#if LINUX
+++ ConvertUTF8toUnicode(dp->volumeName, sizeof(ckp->nodeName.unicode), ckp->nodeName.unicode, &ckp->nodeName.length);
+++#else
++ /* Use CFString functions to get a HFSPlus Canonical name */
++ cfstr = CFStringCreateWithCString(kCFAllocatorDefault, (char *)dp->volumeName, kCFStringEncodingUTF8);
++ cfOK = _CFStringGetFileSystemRepresentation(cfstr, canonicalName, sizeof(canonicalName));
++@@ -1139,6 +1160,7 @@ InitCatalogRoot_HFSPlus(const hfsparams_t *dp, const HFSPlusVolumeHeader *header
++ dp->volumeName, kDefaultVolumeNameStr);
++ }
++ CFRelease(cfstr);
+++#endif
++ ckp->nodeName.length = SWAP_BE16 (ckp->nodeName.length);
++
++ unicodeBytes = sizeof(UniChar) * SWAP_BE16 (ckp->nodeName.length);
++@@ -1821,15 +1843,15 @@ WriteBuffer(const DriveInfo *driveInfo, UInt64 startingSector, UInt32 byteCount,
++ off_t sector;
++
++ if ((byteCount % driveInfo->sectorSize) != 0)
++- errx(1, "WriteBuffer: byte count %ld is not sector size multiple", byteCount);
+++ errx(1, "WriteBuffer: byte count %i is not sector size multiple", byteCount);
++
++ sector = driveInfo->sectorOffset + startingSector;
++
++ if (lseek(driveInfo->fd, sector * driveInfo->sectorSize, SEEK_SET) < 0)
++- err(1, "seek (sector %qd)", sector);
+++ err(1, "seek (sector %lld)", sector);
++
++ if (write(driveInfo->fd, buffer, byteCount) != byteCount)
++- err(1, "write (sector %qd, %ld bytes)", sector, byteCount);
+++ err(1, "write (sector %lld, %i bytes)", sector, byteCount);
++ }
++
++
++@@ -1913,7 +1935,7 @@ DivideAndRoundUp(UInt32 numerator, UInt32 denominator)
++ return quotient;
++ }
++
++-
+++#if !LINUX
++ #define __kCFUserEncodingFileName ("/.CFUserTextEncoding")
++
++ static UInt32
++@@ -1939,7 +1961,7 @@ GetDefaultEncoding()
++ }
++ return 0;
++ }
++-
+++#endif
++
++ static int
++ ConvertUTF8toUnicode(const UInt8* source, UInt32 bufsize, UniChar* unibuf,
++@@ -2006,6 +2028,9 @@ ConvertUTF8toUnicode(const UInt8* source, UInt32 bufsize, UniChar* unibuf,
++ static int
++ getencodinghint(unsigned char *name)
++ {
+++#if LINUX
+++ return(0);
+++#else
++ int mib[3];
++ size_t buflen = sizeof(int);
++ struct vfsconf vfc;
++@@ -2023,7 +2048,8 @@ getencodinghint(unsigned char *name)
++ return (hint);
++ error:
++ hint = GetDefaultEncoding();
++- return (hint);
+++ return (0);
+++#endif
++ }
++
++
++@@ -2034,12 +2060,14 @@ void GenerateVolumeUUID(VolumeUUID *newVolumeID) {
++ unsigned char digest[20];
++ time_t now;
++ clock_t uptime;
++- int mib[2];
++- int sysdata;
++- char sysctlstring[128];
++ size_t datalen;
++ double sysloadavg[3];
+++#if !LINUX
+++ int sysdata;
+++ int mib[2];
+++ char sysctlstring[128];
++ struct vmtotal sysvmtotal;
+++#endif
++
++ do {
++ /* Initialize the SHA-1 context for processing: */
++@@ -2052,52 +2080,58 @@ void GenerateVolumeUUID(VolumeUUID *newVolumeID) {
++ SHA1_Update(&context, &uptime, sizeof(uptime));
++
++ /* The kernel's boot time: */
+++#if !LINUX
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_BOOTTIME;
++ datalen = sizeof(sysdata);
++ sysctl(mib, 2, &sysdata, &datalen, NULL, 0);
++ SHA1_Update(&context, &sysdata, datalen);
++-
+++#endif
++ /* The system's host id: */
+++#if !LINUX
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_HOSTID;
++ datalen = sizeof(sysdata);
++ sysctl(mib, 2, &sysdata, &datalen, NULL, 0);
++ SHA1_Update(&context, &sysdata, datalen);
++-
+++#endif
++ /* The system's host name: */
+++#if !LINUX
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_HOSTNAME;
++ datalen = sizeof(sysctlstring);
++ sysctl(mib, 2, sysctlstring, &datalen, NULL, 0);
++ SHA1_Update(&context, sysctlstring, datalen);
++-
+++#endif
++ /* The running kernel's OS release string: */
+++#if !LINUX
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_OSRELEASE;
++ datalen = sizeof(sysctlstring);
++ sysctl(mib, 2, sysctlstring, &datalen, NULL, 0);
++ SHA1_Update(&context, sysctlstring, datalen);
++-
+++#endif
++ /* The running kernel's version string: */
+++#if !LINUX
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_VERSION;
++ datalen = sizeof(sysctlstring);
++ sysctl(mib, 2, sysctlstring, &datalen, NULL, 0);
++ SHA1_Update(&context, sysctlstring, datalen);
++-
+++#endif
++ /* The system's load average: */
++ datalen = sizeof(sysloadavg);
++ getloadavg(sysloadavg, 3);
++ SHA1_Update(&context, &sysloadavg, datalen);
++
++ /* The system's VM statistics: */
+++#if !LINUX
++ mib[0] = CTL_VM;
++ mib[1] = VM_METER;
++ datalen = sizeof(sysvmtotal);
++ sysctl(mib, 2, &sysvmtotal, &datalen, NULL, 0);
++ SHA1_Update(&context, &sysvmtotal, datalen);
++-
+++#endif
++ /* The current GMT (26 ASCII characters): */
++ time(&now);
++ strncpy(randomInputBuffer, asctime(gmtime(&now)), 26); /* "Mon Mar 27 13:46:26 2000" */
++diff --git a/newfs_hfs.tproj/newfs_hfs.c b/newfs_hfs.tproj/newfs_hfs.c
++index c4176a9..bf2ed21 100644
++--- a/newfs_hfs.tproj/newfs_hfs.c
+++++ b/newfs_hfs.tproj/newfs_hfs.c
++@@ -38,8 +38,13 @@
++ #include <sys/mount.h>
++ #include <sys/param.h>
++ #include <sys/stat.h>
+++#if LINUX
+++#include <time.h>
+++#endif
++
+++#if !LINUX
++ #include <IOKit/storage/IOMediaBSDClient.h>
+++#endif
++
++ #include <hfs/hfs_format.h>
++ #include "newfs_hfs.h"
++@@ -73,7 +78,9 @@ static void usage __P((void));
++
++ char *progname;
++ char gVolumeName[kHFSPlusMaxFileNameChars + 1] = {kDefaultVolumeNameStr};
+++#if !LINUX
++ char rawdevice[MAXPATHLEN];
+++#endif
++ char blkdevice[MAXPATHLEN];
++ UInt32 gBlockSize = 0;
++ UInt32 gNextCNID = kHFSFirstUserCatalogNodeID;
++@@ -158,8 +165,10 @@ main(argc, argv)
++ extern int optind;
++ int ch;
++ int forceHFS;
+++#if !LINUX
++ char *cp, *special;
++ struct statfs *mp;
+++#endif
++ int n;
++
++ if ((progname = strrchr(*argv, '/')))
++@@ -260,16 +269,19 @@ main(argc, argv)
++ usage();
++ }
++
++- argc -= optind;
++- argv += optind;
+++ argc -= optind;
+++ argv += optind;
++
++- if (gPartitionSize != 0) {
++- if (argc != 0)
++- usage();
++- } else {
++- if (argc != 1)
++- usage();
+++ if (gPartitionSize != 0) {
+++ if (argc != 0)
+++ usage();
+++ } else {
+++ if (argc != 1)
+++ usage();
++
+++#if LINUX
+++ (void) sprintf(blkdevice, "%s", argv[0]);
+++#else
++ special = argv[0];
++ cp = strrchr(special, '/');
++ if (cp != 0)
++@@ -278,6 +290,7 @@ main(argc, argv)
++ special++;
++ (void) sprintf(rawdevice, "%sr%s", _PATH_DEV, special);
++ (void) sprintf(blkdevice, "%s%s", _PATH_DEV, special);
+++#endif
++ }
++
++ if (forceHFS && gJournaled) {
++@@ -301,6 +314,9 @@ main(argc, argv)
++ /*
++ * Check if target device is aready mounted
++ */
+++#if LINUX
+++ // FIXME
+++#else
++ n = getmntinfo(&mp, MNT_NOWAIT);
++ if (n == 0)
++ fatal("%s: getmntinfo: %s", blkdevice, strerror(errno));
++@@ -310,15 +326,20 @@ main(argc, argv)
++ fatal("%s is mounted on %s", blkdevice, mp->f_mntonname);
++ ++mp;
++ }
+++#endif
++ }
++
++- if (hfs_newfs(rawdevice, forceHFS, true) < 0) {
+++ if (hfs_newfs(blkdevice, forceHFS, true) < 0) {
+++#if LINUX
+++ err(1, NULL);
+++#else
++ /* On ENXIO error use the block device (to get de-blocking) */
++ if (errno == ENXIO) {
++ if (hfs_newfs(blkdevice, forceHFS, false) < 0)
++ err(1, NULL);
++ } else
++ err(1, NULL);
+++#endif
++ }
++
++ exit(0);
++@@ -506,7 +527,9 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
++ int fso = 0;
++ int retval = 0;
++ hfsparams_t defaults = {0};
+++#if !LINUX
++ u_int64_t maxSectorsPerIO;
+++#endif
++
++ if (gPartitionSize) {
++ dip.sectorSize = kBytesPerSector;
++@@ -526,6 +549,34 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
++
++ if (fstat( fso, &stbuf) < 0)
++ fatal("%s: %s", device, strerror(errno));
+++#if LINUX
+++ dip.sectorSize = 512;
+++ dip.sectorsPerIO = 256;
+++
+++# ifndef BLKGETSIZE
+++# define BLKGETSIZE _IO(0x12,96)
+++# endif
+++
+++# ifndef BLKGETSIZE64
+++# define BLKGETSIZE64 _IOR(0x12,114,size_t)
+++# endif
+++
+++ if (S_ISREG(stbuf.st_mode)) {
+++ dip.totalSectors = stbuf.st_size / 512;
+++ }
+++ else if (S_ISBLK(stbuf.st_mode)) {
+++ unsigned long size;
+++ u_int64_t size64;
+++ if (!ioctl(fso, BLKGETSIZE64, &size64))
+++ dip.totalSectors = size64 / 512;
+++ else if (!ioctl(fso, BLKGETSIZE, &size))
+++ dip.totalSectors = size;
+++ else
+++ fatal("%s: %s", device, strerror(errno));
+++ }
+++ else
+++ fatal("%s: is not a block device", device);
+++#else
++
++ if (ioctl(fso, DKIOCGETBLOCKCOUNT, &dip.totalSectors) < 0)
++ fatal("%s: %s", device, strerror(errno));
++@@ -537,11 +588,14 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
++ dip.sectorsPerIO = (128 * 1024) / dip.sectorSize; /* use 128K as default */
++ else
++ dip.sectorsPerIO = MIN(maxSectorsPerIO, (1024 * 1024) / dip.sectorSize);
+++#endif
+++
++ /*
++ * The make_hfs code currentlydoes 512 byte sized I/O.
++ * If the sector size is bigger than 512, start over
++ * using the block device (to get de-blocking).
++ */
+++#if !LINUX
++ if (dip.sectorSize != kBytesPerSector) {
++ if (isRaw) {
++ close(fso);
++@@ -556,7 +610,9 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
++ dip.sectorSize = kBytesPerSector;
++ }
++ }
+++#endif
++ }
+++
++ dip.sectorOffset = 0;
++ time(&createtime);
++
++diff --git a/newfs_hfs.tproj/newfs_hfs.h b/newfs_hfs.tproj/newfs_hfs.h
++index 968ff10..5680a34 100644
++--- a/newfs_hfs.tproj/newfs_hfs.h
+++++ b/newfs_hfs.tproj/newfs_hfs.h
++@@ -19,8 +19,12 @@
++ *
++ * @APPLE_LICENSE_HEADER_END@
++ */
++-
+++
+++#if LINUX
+++#include "missing.h"
+++#else
++ #include <CoreFoundation/CFBase.h>
+++#endif
++
++ /*
++ * Mac OS Finder flags
++@@ -122,33 +126,33 @@ enum {
++ #define kDTDF_FileID 16
++ #define kDTDF_Name "Desktop DF"
++ #define kDTDF_Chars 10
++-#define kDTDF_Type 'DTFL'
++-#define kDTDF_Creator 'DMGR'
+++#define kDTDF_Type 0x4454464C /* 'DTFL' */
+++#define kDTDF_Creator 0x444D4752 /* 'DMGR' */
++
++ #define kDTDB_FileID 17
++ #define kDTDB_Name "Desktop DB"
++ #define kDTDB_Chars 10
++-#define kDTDB_Type 'BTFL'
++-#define kDTDB_Creator 'DMGR'
+++#define kDTDB_Type 0x4254464C /* 'BTFL' */
+++#define kDTDB_Creator 0x444D4752 /* 'DMGR' */
++ #define kDTDB_Size 1024
++
++ #define kReadMe_FileID 18
++ #define kReadMe_Name "ReadMe"
++ #define kReadMe_Chars 6
++-#define kReadMe_Type 'ttro'
++-#define kReadMe_Creator 'ttxt'
+++#define kReadMe_Type 0x7474726F /* 'ttro' */
+++#define kReadMe_Creator 0x74747974 /* 'ttxt' */
++
++ #define kFinder_FileID 19
++ #define kFinder_Name "Finder"
++ #define kFinder_Chars 6
++-#define kFinder_Type 'FNDR'
++-#define kFinder_Creator 'MACS'
+++#define kFinder_Type 0x464E4452 /* 'FNDR' */
+++#define kFinder_Creator 0x4D414353 /* 'MACS' */
++
++ #define kSystem_FileID 20
++ #define kSystem_Name "System"
++ #define kSystem_Chars 6
++-#define kSystem_Type 'zsys'
++-#define kSystem_Creator 'MACS'
+++#define kSystem_Type 0x7A737973 /* 'zsys' */
+++#define kSystem_Creator 0x4D414353 /* 'MACS' */
++
++
++
+diff --git a/feeds/packages/utils/hfsprogs/patches/0003-Add-helper-include-files-absent-from-the-upstream-pa.patch b/feeds/packages/utils/hfsprogs/patches/0003-Add-helper-include-files-absent-from-the-upstream-pa.patch
+new file mode 100644
+index 0000000..003f844
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0003-Add-helper-include-files-absent-from-the-upstream-pa.patch
+@@ -0,0 +1,1024 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 24 Oct 2013 01:11:21 -0200
++Subject: Add helper include files absent from the upstream package
++
++Add some include files from an Apple system that contain the definition of
++the data structures used by the programs that manipulate the filesystems.
++---
++ include/bitstring.h | 164 +++++++++++
++ include/hfs/hfs_format.h | 689 +++++++++++++++++++++++++++++++++++++++++++++
++ include/hfs/hfs_mount.h | 78 +++++
++ include/sys/appleapiopts.h | 52 ++++
++ 4 files changed, 983 insertions(+)
++ create mode 100644 include/bitstring.h
++ create mode 100644 include/hfs/hfs_format.h
++ create mode 100644 include/hfs/hfs_mount.h
++ create mode 100644 include/sys/appleapiopts.h
++
++diff --git a/include/bitstring.h b/include/bitstring.h
++new file mode 100644
++index 0000000..fbecfbe
++--- /dev/null
+++++ b/include/bitstring.h
++@@ -0,0 +1,164 @@
+++/*
+++ * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+++ *
+++ * @APPLE_LICENSE_HEADER_START@
+++ *
+++ * The contents of this file constitute Original Code as defined in and
+++ * are subject to the Apple Public Source License Version 1.1 (the
+++ * "License"). You may not use this file except in compliance with the
+++ * License. Please obtain a copy of the License at
+++ * http://www.apple.com/publicsource and read it before using this file.
+++ *
+++ * This Original Code and all software distributed under the License are
+++ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+++ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+++ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
+++ * License for the specific language governing rights and limitations
+++ * under the License.
+++ *
+++ * @APPLE_LICENSE_HEADER_END@
+++ */
+++/*
+++ * Copyright (c) 1989, 1993
+++ * The Regents of the University of California. All rights reserved.
+++ *
+++ * This code is derived from software contributed to Berkeley by
+++ * Paul Vixie.
+++ *
+++ * Redistribution and use in source and binary forms, with or without
+++ * modification, are permitted provided that the following conditions
+++ * are met:
+++ * 1. Redistributions of source code must retain the above copyright
+++ * notice, this list of conditions and the following disclaimer.
+++ * 2. Redistributions in binary form must reproduce the above copyright
+++ * notice, this list of conditions and the following disclaimer in the
+++ * documentation and/or other materials provided with the distribution.
+++ * 3. All advertising materials mentioning features or use of this software
+++ * must display the following acknowledgement:
+++ * This product includes software developed by the University of
+++ * California, Berkeley and its contributors.
+++ * 4. Neither the name of the University nor the names of its contributors
+++ * may be used to endorse or promote products derived from this software
+++ * without specific prior written permission.
+++ *
+++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+++ * SUCH DAMAGE.
+++ *
+++ * @(#)bitstring.h 8.1 (Berkeley) 7/19/93
+++ */
+++
+++#ifndef _BITSTRING_H_
+++#define _BITSTRING_H_
+++
+++typedef unsigned char bitstr_t;
+++
+++/* internal macros */
+++ /* byte of the bitstring bit is in */
+++#define _bit_byte(bit) \
+++ ((bit) >> 3)
+++
+++ /* mask for the bit within its byte */
+++#define _bit_mask(bit) \
+++ (1 << ((bit)&0x7))
+++
+++/* external macros */
+++ /* bytes in a bitstring of nbits bits */
+++#define bitstr_size(nbits) \
+++ ((((nbits) - 1) >> 3) + 1)
+++
+++ /* allocate a bitstring */
+++#define bit_alloc(nbits) \
+++ (bitstr_t *)calloc(1, \
+++ (unsigned int)bitstr_size(nbits) * sizeof(bitstr_t))
+++
+++ /* allocate a bitstring on the stack */
+++#define bit_decl(name, nbits) \
+++ (name)[bitstr_size(nbits)]
+++
+++ /* is bit N of bitstring name set? */
+++#define bit_test(name, bit) \
+++ ((name)[_bit_byte(bit)] & _bit_mask(bit))
+++
+++ /* set bit N of bitstring name */
+++#define bit_set(name, bit) \
+++ (name)[_bit_byte(bit)] |= _bit_mask(bit)
+++
+++ /* clear bit N of bitstring name */
+++#define bit_clear(name, bit) \
+++ (name)[_bit_byte(bit)] &= ~_bit_mask(bit)
+++
+++ /* clear bits start ... stop in bitstring */
+++#define bit_nclear(name, start, stop) { \
+++ register bitstr_t *_name = name; \
+++ register int _start = start, _stop = stop; \
+++ register int _startbyte = _bit_byte(_start); \
+++ register int _stopbyte = _bit_byte(_stop); \
+++ if (_startbyte == _stopbyte) { \
+++ _name[_startbyte] &= ((0xff >> (8 - (_start&0x7))) | \
+++ (0xff << ((_stop&0x7) + 1))); \
+++ } else { \
+++ _name[_startbyte] &= 0xff >> (8 - (_start&0x7)); \
+++ while (++_startbyte < _stopbyte) \
+++ _name[_startbyte] = 0; \
+++ _name[_stopbyte] &= 0xff << ((_stop&0x7) + 1); \
+++ } \
+++}
+++
+++ /* set bits start ... stop in bitstring */
+++#define bit_nset(name, start, stop) { \
+++ register bitstr_t *_name = name; \
+++ register int _start = start, _stop = stop; \
+++ register int _startbyte = _bit_byte(_start); \
+++ register int _stopbyte = _bit_byte(_stop); \
+++ if (_startbyte == _stopbyte) { \
+++ _name[_startbyte] |= ((0xff << (_start&0x7)) & \
+++ (0xff >> (7 - (_stop&0x7)))); \
+++ } else { \
+++ _name[_startbyte] |= 0xff << ((_start)&0x7); \
+++ while (++_startbyte < _stopbyte) \
+++ _name[_startbyte] = 0xff; \
+++ _name[_stopbyte] |= 0xff >> (7 - (_stop&0x7)); \
+++ } \
+++}
+++
+++ /* find first bit clear in name */
+++#define bit_ffc(name, nbits, value) { \
+++ register bitstr_t *_name = name; \
+++ register int _byte, _nbits = nbits; \
+++ register int _stopbyte = _bit_byte(_nbits), _value = -1; \
+++ for (_byte = 0; _byte <= _stopbyte; ++_byte) \
+++ if (_name[_byte] != 0xff) { \
+++ _value = _byte << 3; \
+++ for (_stopbyte = _name[_byte]; (_stopbyte&0x1); \
+++ ++_value, _stopbyte >>= 1); \
+++ break; \
+++ } \
+++ *(value) = _value; \
+++}
+++
+++ /* find first bit set in name */
+++#define bit_ffs(name, nbits, value) { \
+++ register bitstr_t *_name = name; \
+++ register int _byte, _nbits = nbits; \
+++ register int _stopbyte = _bit_byte(_nbits), _value = -1; \
+++ for (_byte = 0; _byte <= _stopbyte; ++_byte) \
+++ if (_name[_byte]) { \
+++ _value = _byte << 3; \
+++ for (_stopbyte = _name[_byte]; !(_stopbyte&0x1); \
+++ ++_value, _stopbyte >>= 1); \
+++ break; \
+++ } \
+++ *(value) = _value; \
+++}
+++
+++#endif /* !_BITSTRING_H_ */
++diff --git a/include/hfs/hfs_format.h b/include/hfs/hfs_format.h
++new file mode 100644
++index 0000000..d820329
++--- /dev/null
+++++ b/include/hfs/hfs_format.h
++@@ -0,0 +1,689 @@
+++/*
+++ * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved.
+++ *
+++ * @APPLE_LICENSE_HEADER_START@
+++ *
+++ * The contents of this file constitute Original Code as defined in and
+++ * are subject to the Apple Public Source License Version 1.1 (the
+++ * "License"). You may not use this file except in compliance with the
+++ * License. Please obtain a copy of the License at
+++ * http://www.apple.com/publicsource and read it before using this file.
+++ *
+++ * This Original Code and all software distributed under the License are
+++ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+++ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+++ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
+++ * License for the specific language governing rights and limitations
+++ * under the License.
+++ *
+++ * @APPLE_LICENSE_HEADER_END@
+++ */
+++#ifndef __HFS_FORMAT__
+++#define __HFS_FORMAT__
+++
+++#include "missing.h"
+++
+++#include <sys/appleapiopts.h>
+++
+++/*
+++ * hfs_format.c
+++ *
+++ * This file describes the on-disk format for HFS and HFS Plus volumes.
+++ * The HFS Plus volume format is desciibed in detail in Apple Technote 1150.
+++ *
+++ * http://developer.apple.com/technotes/tn/tn1150.html
+++ *
+++ */
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++/* some on-disk hfs structures have 68K alignment (misaligned) */
+++
+++#define PACKED_S __attribute__((packed))
+++
+++/* Signatures used to differentiate between HFS and HFS Plus volumes */
+++enum {
+++ kHFSSigWord = 0x4244, /* 'BD' in ASCII */
+++ kHFSPlusSigWord = 0x482B, /* 'H+' in ASCII */
+++ kHFSXSigWord = 0x4858, /* 'HX' in ASCII */
+++
+++ kHFSPlusVersion = 0x0004, /* 'H+' volumes are version 4 only */
+++ kHFSXVersion = 0x0005, /* 'HX' volumes start with version 5 */
+++
+++ kHFSPlusMountVersion = 0x31302E30, /* '10.0' for Mac OS X */
+++ kHFSJMountVersion = 0x4846534a, /* 'HFSJ' for journaled HFS+ on OS X */
+++ kFSKMountVersion = 0x46534b21 /* 'FSK!' for failed journal replay */
+++}PACKED_S;
+++
+++
+++#if 1
+++/*
+++ * Mac OS X has a special directory for linked and unlinked files (HFS Plus only).
+++ * This directory and its contents are never exported from the filesystem under
+++ * Mac OS X.
+++ *
+++ * To make this folder name sort last, it has embedded null prefix.
+++ * (0xC0, 0x80 in UTF-8)
+++ */
+++#define HFSPLUSMETADATAFOLDER "\xC0\x80\xC0\x80\xC0\x80\xC0\x80HFS+ Private Data"
+++
+++/*
+++ * Files in the HFS Private Data folder have one of the following prefixes
+++ * followed by a decimal number (no leading zeros). For indirect nodes this
+++ * number is a 32 bit random number. For unlinked (deleted) files that are
+++ * still open, the number is the file ID for that file.
+++ *
+++ * e.g. iNode7182000 and temp3296
+++ */
+++#define HFS_INODE_PREFIX "iNode"
+++#define HFS_DELETE_PREFIX "temp"
+++
+++#endif /* __APPLE_API_PRIVATE */
+++
+++/*
+++ * Indirect link files (hard links) have the following type/creator.
+++ */
+++enum {
+++ kHardLinkFileType = 0x686C6E6B, /* 'hlnk' */
+++ kHFSPlusCreator = 0x6866732B /* 'hfs+' */
+++}PACKED_S;
+++
+++
+++#ifndef _HFSUNISTR255_DEFINED_
+++#define _HFSUNISTR255_DEFINED_
+++/* Unicode strings are used for HFS Plus file and folder names */
+++struct HFSUniStr255 {
+++ u_int16_t length; /* number of unicode characters */
+++ u_int16_t unicode[255]; /* unicode characters */
+++} PACKED_S;
+++typedef struct HFSUniStr255 HFSUniStr255;
+++typedef const HFSUniStr255 *ConstHFSUniStr255Param;
+++#endif /* _HFSUNISTR255_DEFINED_ */
+++
+++enum {
+++ kHFSMaxVolumeNameChars = 27,
+++ kHFSMaxFileNameChars = 31,
+++ kHFSPlusMaxFileNameChars = 255
+++}PACKED_S;
+++
+++
+++/* Extent overflow file data structures */
+++
+++/* HFS Extent key */
+++struct HFSExtentKey {
+++ u_int8_t keyLength; /* length of key, excluding this field */
+++ u_int8_t forkType; /* 0 = data fork, FF = resource fork */
+++ u_int32_t fileID; /* file ID */
+++ u_int16_t startBlock; /* first file allocation block number in this extent */
+++}PACKED_S;
+++typedef struct HFSExtentKey HFSExtentKey;
+++
+++/* HFS Plus Extent key */
+++struct HFSPlusExtentKey {
+++ u_int16_t keyLength; /* length of key, excluding this field */
+++ u_int8_t forkType; /* 0 = data fork, FF = resource fork */
+++ u_int8_t pad; /* make the other fields align on 32-bit boundary */
+++ u_int32_t fileID; /* file ID */
+++ u_int32_t startBlock; /* first file allocation block number in this extent */
+++}PACKED_S;
+++typedef struct HFSPlusExtentKey HFSPlusExtentKey;
+++
+++/* Number of extent descriptors per extent record */
+++enum {
+++ kHFSExtentDensity = 3,
+++ kHFSPlusExtentDensity = 8
+++}PACKED_S;
+++
+++/* HFS extent descriptor */
+++struct HFSExtentDescriptor {
+++ u_int16_t startBlock; /* first allocation block */
+++ u_int16_t blockCount; /* number of allocation blocks */
+++}PACKED_S;
+++typedef struct HFSExtentDescriptor HFSExtentDescriptor;
+++
+++/* HFS Plus extent descriptor */
+++struct HFSPlusExtentDescriptor {
+++ u_int32_t startBlock; /* first allocation block */
+++ u_int32_t blockCount; /* number of allocation blocks */
+++}PACKED_S;
+++typedef struct HFSPlusExtentDescriptor HFSPlusExtentDescriptor;
+++
+++/* HFS extent record */
+++typedef HFSExtentDescriptor HFSExtentRecord[3];
+++
+++/* HFS Plus extent record */
+++typedef HFSPlusExtentDescriptor HFSPlusExtentRecord[8];
+++
+++
+++/* Finder information */
+++struct FndrFileInfo {
+++ u_int32_t fdType; /* file type */
+++ u_int32_t fdCreator; /* file creator */
+++ u_int16_t fdFlags; /* Finder flags */
+++ struct {
+++ int16_t v; /* file's location */
+++ int16_t h;
+++ } PACKED_S fdLocation;
+++ int16_t opaque;
+++}PACKED_S;
+++typedef struct FndrFileInfo FndrFileInfo;
+++
+++struct FndrDirInfo {
+++ struct { /* folder's window rectangle */
+++ int16_t top;
+++ int16_t left;
+++ int16_t bottom;
+++ int16_t right;
+++ }PACKED_S frRect;
+++ unsigned short frFlags; /* Finder flags */
+++ struct {
+++ u_int16_t v; /* folder's location */
+++ u_int16_t h;
+++ }PACKED_S frLocation;
+++ int16_t opaque;
+++}PACKED_S;
+++typedef struct FndrDirInfo FndrDirInfo;
+++
+++struct FndrOpaqueInfo {
+++ int8_t opaque[16];
+++}PACKED_S;
+++typedef struct FndrOpaqueInfo FndrOpaqueInfo;
+++
+++
+++/* HFS Plus Fork data info - 80 bytes */
+++struct HFSPlusForkData {
+++ u_int64_t logicalSize; /* fork's logical size in bytes */
+++ u_int32_t clumpSize; /* fork's clump size in bytes */
+++ u_int32_t totalBlocks; /* total blocks used by this fork */
+++ HFSPlusExtentRecord extents; /* initial set of extents */
+++}PACKED_S;
+++typedef struct HFSPlusForkData HFSPlusForkData;
+++
+++
+++/* Mac OS X has 16 bytes worth of "BSD" info.
+++ *
+++ * Note: Mac OS 9 implementations and applications
+++ * should preserve, but not change, this information.
+++ */
+++struct HFSPlusBSDInfo {
+++ u_int32_t ownerID; /* user or group ID of file/folder owner */
+++ u_int32_t groupID; /* additional user of group ID */
+++ u_int8_t adminFlags; /* super-user changeable flags */
+++ u_int8_t ownerFlags; /* owner changeable flags */
+++ u_int16_t fileMode; /* file type and permission bits */
+++ union {
+++ u_int32_t iNodeNum; /* indirect node number (hard links only) */
+++ u_int32_t linkCount; /* links that refer to this indirect node */
+++ u_int32_t rawDevice; /* special file device (FBLK and FCHR only) */
+++ }PACKED_S special;
+++}PACKED_S;
+++typedef struct HFSPlusBSDInfo HFSPlusBSDInfo;
+++
+++
+++/* Catalog file data structures */
+++
+++enum {
+++ kHFSRootParentID = 1, /* Parent ID of the root folder */
+++ kHFSRootFolderID = 2, /* Folder ID of the root folder */
+++ kHFSExtentsFileID = 3, /* File ID of the extents file */
+++ kHFSCatalogFileID = 4, /* File ID of the catalog file */
+++ kHFSBadBlockFileID = 5, /* File ID of the bad allocation block file */
+++ kHFSAllocationFileID = 6, /* File ID of the allocation file (HFS Plus only) */
+++ kHFSStartupFileID = 7, /* File ID of the startup file (HFS Plus only) */
+++ kHFSAttributesFileID = 8, /* File ID of the attribute file (HFS Plus only) */
+++ kHFSRepairCatalogFileID = 14, /* Used when rebuilding Catalog B-tree */
+++ kHFSBogusExtentFileID = 15, /* Used for exchanging extents in extents file */
+++ kHFSFirstUserCatalogNodeID = 16
+++}PACKED_S;
+++
+++/* HFS catalog key */
+++struct HFSCatalogKey {
+++ u_int8_t keyLength; /* key length (in bytes) */
+++ u_int8_t reserved; /* reserved (set to zero) */
+++ u_int32_t parentID; /* parent folder ID */
+++ u_int8_t nodeName[kHFSMaxFileNameChars + 1]; /* catalog node name */
+++}PACKED_S;
+++typedef struct HFSCatalogKey HFSCatalogKey;
+++
+++/* HFS Plus catalog key */
+++struct HFSPlusCatalogKey {
+++ u_int16_t keyLength; /* key length (in bytes) */
+++ u_int32_t parentID; /* parent folder ID */
+++ HFSUniStr255 nodeName; /* catalog node name */
+++}PACKED_S;
+++typedef struct HFSPlusCatalogKey HFSPlusCatalogKey;
+++
+++/* Catalog record types */
+++enum {
+++ /* HFS Catalog Records */
+++ kHFSFolderRecord = 0x0100, /* Folder record */
+++ kHFSFileRecord = 0x0200, /* File record */
+++ kHFSFolderThreadRecord = 0x0300, /* Folder thread record */
+++ kHFSFileThreadRecord = 0x0400, /* File thread record */
+++
+++ /* HFS Plus Catalog Records */
+++ kHFSPlusFolderRecord = 1, /* Folder record */
+++ kHFSPlusFileRecord = 2, /* File record */
+++ kHFSPlusFolderThreadRecord = 3, /* Folder thread record */
+++ kHFSPlusFileThreadRecord = 4 /* File thread record */
+++}PACKED_S;
+++
+++
+++/* Catalog file record flags */
+++enum {
+++ kHFSFileLockedBit = 0x0000, /* file is locked and cannot be written to */
+++ kHFSFileLockedMask = 0x0001,
+++
+++ kHFSThreadExistsBit = 0x0001, /* a file thread record exists for this file */
+++ kHFSThreadExistsMask = 0x0002,
+++
+++ kHFSHasAttributesBit = 0x0002, /* object has extended attributes */
+++ kHFSHasAttributesMask = 0x0004,
+++
+++ kHFSHasSecurityBit = 0x0003, /* object has security data (ACLs) */
+++ kHFSHasSecurityMask = 0x0008
+++}PACKED_S;
+++
+++
+++/* HFS catalog folder record - 70 bytes */
+++struct HFSCatalogFolder {
+++ int16_t recordType; /* == kHFSFolderRecord */
+++ u_int16_t flags; /* folder flags */
+++ u_int16_t valence; /* folder valence */
+++ u_int32_t folderID; /* folder ID */
+++ u_int32_t createDate; /* date and time of creation */
+++ u_int32_t modifyDate; /* date and time of last modification */
+++ u_int32_t backupDate; /* date and time of last backup */
+++ FndrDirInfo userInfo; /* Finder information */
+++ FndrOpaqueInfo finderInfo; /* additional Finder information */
+++ u_int32_t reserved[4]; /* reserved - initialized as zero */
+++}PACKED_S;
+++typedef struct HFSCatalogFolder HFSCatalogFolder;
+++
+++/* HFS Plus catalog folder record - 88 bytes */
+++struct HFSPlusCatalogFolder {
+++ int16_t recordType; /* == kHFSPlusFolderRecord */
+++ u_int16_t flags; /* file flags */
+++ u_int32_t valence; /* folder's valence (limited to 2^16 in Mac OS) */
+++ u_int32_t folderID; /* folder ID */
+++ u_int32_t createDate; /* date and time of creation */
+++ u_int32_t contentModDate; /* date and time of last content modification */
+++ u_int32_t attributeModDate; /* date and time of last attribute modification */
+++ u_int32_t accessDate; /* date and time of last access (MacOS X only) */
+++ u_int32_t backupDate; /* date and time of last backup */
+++ HFSPlusBSDInfo bsdInfo; /* permissions (for MacOS X) */
+++ FndrDirInfo userInfo; /* Finder information */
+++ FndrOpaqueInfo finderInfo; /* additional Finder information */
+++ u_int32_t textEncoding; /* hint for name conversions */
+++ u_int32_t attrBlocks; /* cached count of attribute data blocks */
+++}PACKED_S;
+++typedef struct HFSPlusCatalogFolder HFSPlusCatalogFolder;
+++
+++/* HFS catalog file record - 102 bytes */
+++struct HFSCatalogFile {
+++ int16_t recordType; /* == kHFSFileRecord */
+++ u_int8_t flags; /* file flags */
+++ int8_t fileType; /* file type (unused ?) */
+++ FndrFileInfo userInfo; /* Finder information */
+++ u_int32_t fileID; /* file ID */
+++ u_int16_t dataStartBlock; /* not used - set to zero */
+++ int32_t dataLogicalSize; /* logical EOF of data fork */
+++ int32_t dataPhysicalSize; /* physical EOF of data fork */
+++ u_int16_t rsrcStartBlock; /* not used - set to zero */
+++ int32_t rsrcLogicalSize; /* logical EOF of resource fork */
+++ int32_t rsrcPhysicalSize; /* physical EOF of resource fork */
+++ u_int32_t createDate; /* date and time of creation */
+++ u_int32_t modifyDate; /* date and time of last modification */
+++ u_int32_t backupDate; /* date and time of last backup */
+++ FndrOpaqueInfo finderInfo; /* additional Finder information */
+++ u_int16_t clumpSize; /* file clump size (not used) */
+++ HFSExtentRecord dataExtents; /* first data fork extent record */
+++ HFSExtentRecord rsrcExtents; /* first resource fork extent record */
+++ u_int32_t reserved; /* reserved - initialized as zero */
+++}PACKED_S;
+++typedef struct HFSCatalogFile HFSCatalogFile;
+++
+++/* HFS Plus catalog file record - 248 bytes */
+++struct HFSPlusCatalogFile {
+++ int16_t recordType; /* == kHFSPlusFileRecord */
+++ u_int16_t flags; /* file flags */
+++ u_int32_t reserved1; /* reserved - initialized as zero */
+++ u_int32_t fileID; /* file ID */
+++ u_int32_t createDate; /* date and time of creation */
+++ u_int32_t contentModDate; /* date and time of last content modification */
+++ u_int32_t attributeModDate; /* date and time of last attribute modification */
+++ u_int32_t accessDate; /* date and time of last access (MacOS X only) */
+++ u_int32_t backupDate; /* date and time of last backup */
+++ HFSPlusBSDInfo bsdInfo; /* permissions (for MacOS X) */
+++ FndrFileInfo userInfo; /* Finder information */
+++ FndrOpaqueInfo finderInfo; /* additional Finder information */
+++ u_int32_t textEncoding; /* hint for name conversions */
+++ u_int32_t attrBlocks; /* cached count of attribute data blocks */
+++
+++ /* Note: these start on double long (64 bit) boundry */
+++ HFSPlusForkData dataFork; /* size and block data for data fork */
+++ HFSPlusForkData resourceFork; /* size and block data for resource fork */
+++}PACKED_S;
+++typedef struct HFSPlusCatalogFile HFSPlusCatalogFile;
+++
+++/* HFS catalog thread record - 46 bytes */
+++struct HFSCatalogThread {
+++ int16_t recordType; /* == kHFSFolderThreadRecord or kHFSFileThreadRecord */
+++ int32_t reserved[2]; /* reserved - initialized as zero */
+++ u_int32_t parentID; /* parent ID for this catalog node */
+++ u_int8_t nodeName[kHFSMaxFileNameChars + 1]; /* name of this catalog node */
+++}PACKED_S;
+++typedef struct HFSCatalogThread HFSCatalogThread;
+++
+++/* HFS Plus catalog thread record -- 264 bytes */
+++struct HFSPlusCatalogThread {
+++ int16_t recordType; /* == kHFSPlusFolderThreadRecord or kHFSPlusFileThreadRecord */
+++ int16_t reserved; /* reserved - initialized as zero */
+++ u_int32_t parentID; /* parent ID for this catalog node */
+++ HFSUniStr255 nodeName; /* name of this catalog node (variable length) */
+++}PACKED_S;
+++typedef struct HFSPlusCatalogThread HFSPlusCatalogThread;
+++
+++#ifdef __APPLE_API_UNSTABLE
+++/*
+++ These are the types of records in the attribute B-tree. The values were
+++ chosen so that they wouldn't conflict with the catalog record types.
+++*/
+++enum {
+++ kHFSPlusAttrInlineData = 0x10, /* if size < kAttrOverflowSize */
+++ kHFSPlusAttrForkData = 0x20, /* if size >= kAttrOverflowSize */
+++ kHFSPlusAttrExtents = 0x30 /* overflow extents for large attributes */
+++}PACKED_S;
+++
+++
+++/*
+++ HFSPlusAttrForkData
+++ For larger attributes, whose value is stored in allocation blocks.
+++ If the attribute has more than 8 extents, there will be additonal
+++ records (of type HFSPlusAttrExtents) for this attribute.
+++*/
+++struct HFSPlusAttrForkData {
+++ u_int32_t recordType; /* == kHFSPlusAttrForkData*/
+++ u_int32_t reserved;
+++ HFSPlusForkData theFork; /* size and first extents of value*/
+++}PACKED_S;
+++typedef struct HFSPlusAttrForkData HFSPlusAttrForkData;
+++
+++/*
+++ HFSPlusAttrExtents
+++ This record contains information about overflow extents for large,
+++ fragmented attributes.
+++*/
+++struct HFSPlusAttrExtents {
+++ u_int32_t recordType; /* == kHFSPlusAttrExtents*/
+++ u_int32_t reserved;
+++ HFSPlusExtentRecord extents; /* additional extents*/
+++}PACKED_S;
+++typedef struct HFSPlusAttrExtents HFSPlusAttrExtents;
+++
+++/*
+++ * Atrributes B-tree Data Record
+++ *
+++ * For small attributes, whose entire value is stored
+++ * within a single B-tree record.
+++ */
+++struct HFSPlusAttrData {
+++ u_int32_t recordType; /* == kHFSPlusAttrInlineData */
+++ u_int32_t reserved[2];
+++ u_int32_t attrSize; /* size of attribute data in bytes */
+++ u_int8_t attrData[2]; /* variable length */
+++}PACKED_S;
+++typedef struct HFSPlusAttrData HFSPlusAttrData;
+++
+++
+++/* HFSPlusAttrInlineData is obsolete use HFSPlusAttrData instead */
+++struct HFSPlusAttrInlineData {
+++ u_int32_t recordType;
+++ u_int32_t reserved;
+++ u_int32_t logicalSize;
+++ u_int8_t userData[2];
+++}PACKED_S;
+++typedef struct HFSPlusAttrInlineData HFSPlusAttrInlineData;
+++
+++
+++/* A generic Attribute Record*/
+++union HFSPlusAttrRecord {
+++ u_int32_t recordType;
+++ HFSPlusAttrInlineData inlineData; /* NOT USED */
+++ HFSPlusAttrData attrData;
+++ HFSPlusAttrForkData forkData;
+++ HFSPlusAttrExtents overflowExtents;
+++}PACKED_S;
+++typedef union HFSPlusAttrRecord HFSPlusAttrRecord;
+++
+++/* Attribute key */
+++enum { kHFSMaxAttrNameLen = 127 };
+++struct HFSPlusAttrKey {
+++ u_int16_t keyLength; /* key length (in bytes) */
+++ u_int16_t pad; /* set to zero */
+++ u_int32_t fileID; /* file associated with attribute */
+++ u_int32_t startBlock; /* first attribue allocation block number for extents */
+++ u_int16_t attrNameLen; /* number of unicode characters */
+++ u_int16_t attrName[127]; /* attribute name (Unicode) */
+++}PACKED_S;
+++typedef struct HFSPlusAttrKey HFSPlusAttrKey;
+++
+++#define kHFSPlusAttrKeyMaximumLength (sizeof(HFSPlusAttrKey) - sizeof(u_int16_t))
+++#define kHFSPlusAttrKeyMinimumLength (kHFSPlusAttrKeyMaximumLength - (127 * sizeof(u_int16_t)))
+++
+++#endif /* __APPLE_API_UNSTABLE */
+++
+++
+++/* Key and node lengths */
+++enum {
+++ kHFSPlusExtentKeyMaximumLength = sizeof(HFSPlusExtentKey) - sizeof(u_int16_t),
+++ kHFSExtentKeyMaximumLength = sizeof(HFSExtentKey) - sizeof(u_int8_t),
+++ kHFSPlusCatalogKeyMaximumLength = sizeof(HFSPlusCatalogKey) - sizeof(u_int16_t),
+++ kHFSPlusCatalogKeyMinimumLength = kHFSPlusCatalogKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(u_int16_t),
+++ kHFSCatalogKeyMaximumLength = sizeof(HFSCatalogKey) - sizeof(u_int8_t),
+++ kHFSCatalogKeyMinimumLength = kHFSCatalogKeyMaximumLength - (kHFSMaxFileNameChars + 1) + sizeof(u_int8_t),
+++ kHFSPlusCatalogMinNodeSize = 4096,
+++ kHFSPlusExtentMinNodeSize = 512,
+++ kHFSPlusAttrMinNodeSize = 4096
+++}PACKED_S;
+++
+++/* HFS and HFS Plus volume attribute bits */
+++enum {
+++ /* Bits 0-6 are reserved (always cleared by MountVol call) */
+++ kHFSVolumeHardwareLockBit = 7, /* volume is locked by hardware */
+++ kHFSVolumeUnmountedBit = 8, /* volume was successfully unmounted */
+++ kHFSVolumeSparedBlocksBit = 9, /* volume has bad blocks spared */
+++ kHFSVolumeNoCacheRequiredBit = 10, /* don't cache volume blocks (i.e. RAM or ROM disk) */
+++ kHFSBootVolumeInconsistentBit = 11, /* boot volume is inconsistent (System 7.6 and later) */
+++ kHFSCatalogNodeIDsReusedBit = 12,
+++ kHFSVolumeJournaledBit = 13, /* this volume has a journal on it */
+++ kHFSVolumeInconsistentBit = 14, /* serious inconsistencies detected at runtime */
+++ kHFSVolumeSoftwareLockBit = 15, /* volume is locked by software */
+++
+++ kHFSVolumeHardwareLockMask = 1 << kHFSVolumeHardwareLockBit,
+++ kHFSVolumeUnmountedMask = 1 << kHFSVolumeUnmountedBit,
+++ kHFSVolumeSparedBlocksMask = 1 << kHFSVolumeSparedBlocksBit,
+++ kHFSVolumeNoCacheRequiredMask = 1 << kHFSVolumeNoCacheRequiredBit,
+++ kHFSBootVolumeInconsistentMask = 1 << kHFSBootVolumeInconsistentBit,
+++ kHFSCatalogNodeIDsReusedMask = 1 << kHFSCatalogNodeIDsReusedBit,
+++ kHFSVolumeJournaledMask = 1 << kHFSVolumeJournaledBit,
+++ kHFSVolumeInconsistentMask = 1 << kHFSVolumeInconsistentBit,
+++ kHFSVolumeSoftwareLockMask = 1 << kHFSVolumeSoftwareLockBit,
+++ kHFSMDBAttributesMask = 0x8380
+++}PACKED_S;
+++
+++
+++/* HFS Master Directory Block - 162 bytes */
+++/* Stored at sector #2 (3rd sector) and second-to-last sector. */
+++struct HFSMasterDirectoryBlock {
+++ u_int16_t drSigWord; /* == kHFSSigWord */
+++ u_int32_t drCrDate; /* date and time of volume creation */
+++ u_int32_t drLsMod; /* date and time of last modification */
+++ u_int16_t drAtrb; /* volume attributes */
+++ u_int16_t drNmFls; /* number of files in root folder */
+++ u_int16_t drVBMSt; /* first block of volume bitmap */
+++ u_int16_t drAllocPtr; /* start of next allocation search */
+++ u_int16_t drNmAlBlks; /* number of allocation blocks in volume */
+++ u_int32_t drAlBlkSiz; /* size (in bytes) of allocation blocks */
+++ u_int32_t drClpSiz; /* default clump size */
+++ u_int16_t drAlBlSt; /* first allocation block in volume */
+++ u_int32_t drNxtCNID; /* next unused catalog node ID */
+++ u_int16_t drFreeBks; /* number of unused allocation blocks */
+++ u_int8_t drVN[kHFSMaxVolumeNameChars + 1]; /* volume name */
+++ u_int32_t drVolBkUp; /* date and time of last backup */
+++ u_int16_t drVSeqNum; /* volume backup sequence number */
+++ u_int32_t drWrCnt; /* volume write count */
+++ u_int32_t drXTClpSiz; /* clump size for extents overflow file */
+++ u_int32_t drCTClpSiz; /* clump size for catalog file */
+++ u_int16_t drNmRtDirs; /* number of directories in root folder */
+++ u_int32_t drFilCnt; /* number of files in volume */
+++ u_int32_t drDirCnt; /* number of directories in volume */
+++ u_int32_t drFndrInfo[8]; /* information used by the Finder */
+++ u_int16_t drEmbedSigWord; /* embedded volume signature (formerly drVCSize) */
+++ HFSExtentDescriptor drEmbedExtent; /* embedded volume location and size (formerly drVBMCSize and drCtlCSize) */
+++ u_int32_t drXTFlSize; /* size of extents overflow file */
+++ HFSExtentRecord drXTExtRec; /* extent record for extents overflow file */
+++ u_int32_t drCTFlSize; /* size of catalog file */
+++ HFSExtentRecord drCTExtRec; /* extent record for catalog file */
+++}PACKED_S;
+++typedef struct HFSMasterDirectoryBlock HFSMasterDirectoryBlock;
+++
+++
+++#ifdef __APPLE_API_UNSTABLE
+++#define SET_HFS_TEXT_ENCODING(hint) \
+++ (0x656e6300 | ((hint) & 0xff))
+++#define GET_HFS_TEXT_ENCODING(hint) \
+++ (((hint) & 0xffffff00) == 0x656e6300 ? (hint) & 0x000000ff : 0xffffffffU)
+++#endif /* __APPLE_API_UNSTABLE */
+++
+++
+++/* HFS Plus Volume Header - 512 bytes */
+++/* Stored at sector #2 (3rd sector) and second-to-last sector. */
+++struct HFSPlusVolumeHeader {
+++ u_int16_t signature; /* == kHFSPlusSigWord */
+++ u_int16_t version; /* == kHFSPlusVersion */
+++ u_int32_t attributes; /* volume attributes */
+++ u_int32_t lastMountedVersion; /* implementation version which last mounted volume */
+++ u_int32_t journalInfoBlock; /* block addr of journal info (if volume is journaled, zero otherwise) */
+++
+++ u_int32_t createDate; /* date and time of volume creation */
+++ u_int32_t modifyDate; /* date and time of last modification */
+++ u_int32_t backupDate; /* date and time of last backup */
+++ u_int32_t checkedDate; /* date and time of last disk check */
+++
+++ u_int32_t fileCount; /* number of files in volume */
+++ u_int32_t folderCount; /* number of directories in volume */
+++
+++ u_int32_t blockSize; /* size (in bytes) of allocation blocks */
+++ u_int32_t totalBlocks; /* number of allocation blocks in volume (includes this header and VBM*/
+++ u_int32_t freeBlocks; /* number of unused allocation blocks */
+++
+++ u_int32_t nextAllocation; /* start of next allocation search */
+++ u_int32_t rsrcClumpSize; /* default resource fork clump size */
+++ u_int32_t dataClumpSize; /* default data fork clump size */
+++ u_int32_t nextCatalogID; /* next unused catalog node ID */
+++
+++ u_int32_t writeCount; /* volume write count */
+++ u_int64_t encodingsBitmap; /* which encodings have been use on this volume */
+++
+++ u_int8_t finderInfo[32]; /* information used by the Finder */
+++
+++ HFSPlusForkData allocationFile; /* allocation bitmap file */
+++ HFSPlusForkData extentsFile; /* extents B-tree file */
+++ HFSPlusForkData catalogFile; /* catalog B-tree file */
+++ HFSPlusForkData attributesFile; /* extended attributes B-tree file */
+++ HFSPlusForkData startupFile; /* boot file (secondary loader) */
+++}PACKED_S;
+++typedef struct HFSPlusVolumeHeader HFSPlusVolumeHeader;
+++
+++
+++/* B-tree structures */
+++
+++enum BTreeKeyLimits{
+++ kMaxKeyLength = 520
+++}PACKED_S;
+++
+++union BTreeKey{
+++ u_int8_t length8;
+++ u_int16_t length16;
+++ u_int8_t rawData [kMaxKeyLength+2];
+++}PACKED_S;
+++typedef union BTreeKey BTreeKey;
+++
+++/* BTNodeDescriptor -- Every B-tree node starts with these fields. */
+++struct BTNodeDescriptor {
+++ u_int32_t fLink; /* next node at this level*/
+++ u_int32_t bLink; /* previous node at this level*/
+++ int8_t kind; /* kind of node (leaf, index, header, map)*/
+++ u_int8_t height; /* zero for header, map; child is one more than parent*/
+++ u_int16_t numRecords; /* number of records in this node*/
+++ u_int16_t reserved; /* reserved - initialized as zero */
+++}PACKED_S;
+++typedef struct BTNodeDescriptor BTNodeDescriptor;
+++
+++/* Constants for BTNodeDescriptor kind */
+++enum {
+++ kBTLeafNode = -1,
+++ kBTIndexNode = 0,
+++ kBTHeaderNode = 1,
+++ kBTMapNode = 2
+++}PACKED_S;
+++
+++/* BTHeaderRec -- The first record of a B-tree header node */
+++struct BTHeaderRec {
+++ u_int16_t treeDepth; /* maximum height (usually leaf nodes) */
+++ u_int32_t rootNode; /* node number of root node */
+++ u_int32_t leafRecords; /* number of leaf records in all leaf nodes */
+++ u_int32_t firstLeafNode; /* node number of first leaf node */
+++ u_int32_t lastLeafNode; /* node number of last leaf node */
+++ u_int16_t nodeSize; /* size of a node, in bytes */
+++ u_int16_t maxKeyLength; /* reserved */
+++ u_int32_t totalNodes; /* total number of nodes in tree */
+++ u_int32_t freeNodes; /* number of unused (free) nodes in tree */
+++ u_int16_t reserved1; /* unused */
+++ u_int32_t clumpSize; /* reserved */
+++ u_int8_t btreeType; /* reserved */
+++ u_int8_t keyCompareType; /* Key string Comparison Type */
+++ u_int32_t attributes; /* persistent attributes about the tree */
+++ u_int32_t reserved3[16]; /* reserved */
+++}PACKED_S;
+++typedef struct BTHeaderRec BTHeaderRec;
+++
+++/* Constants for BTHeaderRec attributes */
+++enum {
+++ kBTBadCloseMask = 0x00000001, /* reserved */
+++ kBTBigKeysMask = 0x00000002, /* key length field is 16 bits */
+++ kBTVariableIndexKeysMask = 0x00000004 /* keys in index nodes are variable length */
+++}PACKED_S;
+++
+++
+++/* Catalog Key Name Comparison Type */
+++enum {
+++ kHFSCaseFolding = 0xCF, /* case folding (case-insensitive) */
+++ kHFSBinaryCompare = 0xBC /* binary compare (case-sensitive) */
+++}PACKED_S;
+++
+++/* JournalInfoBlock - Structure that describes where our journal lives */
+++struct JournalInfoBlock {
+++ u_int32_t flags;
+++ u_int32_t device_signature[8]; // signature used to locate our device.
+++ u_int64_t offset; // byte offset to the journal on the device
+++ u_int64_t size; // size in bytes of the journal
+++ u_int32_t reserved[32];
+++}PACKED_S;
+++typedef struct JournalInfoBlock JournalInfoBlock;
+++
+++enum {
+++ kJIJournalInFSMask = 0x00000001,
+++ kJIJournalOnOtherDeviceMask = 0x00000002,
+++ kJIJournalNeedInitMask = 0x00000004
+++}PACKED_S;
+++
+++#ifdef __cplusplus
+++}
+++#endif
+++
+++#endif /* __HFS_FORMAT__ */
++diff --git a/include/hfs/hfs_mount.h b/include/hfs/hfs_mount.h
++new file mode 100644
++index 0000000..ad729f2
++--- /dev/null
+++++ b/include/hfs/hfs_mount.h
++@@ -0,0 +1,78 @@
+++/*
+++ * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved.
+++ *
+++ * @APPLE_LICENSE_HEADER_START@
+++ *
+++ * The contents of this file constitute Original Code as defined in and
+++ * are subject to the Apple Public Source License Version 1.1 (the
+++ * "License"). You may not use this file except in compliance with the
+++ * License. Please obtain a copy of the License at
+++ * http://www.apple.com/publicsource and read it before using this file.
+++ *
+++ * This Original Code and all software distributed under the License are
+++ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+++ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+++ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
+++ * License for the specific language governing rights and limitations
+++ * under the License.
+++ *
+++ * @APPLE_LICENSE_HEADER_END@
+++ */
+++/*
+++ * Copyright (c) 1997-2002 Apple Computer, Inc. All Rights Reserved
+++ *
+++ */
+++
+++#ifndef _HFS_MOUNT_H_
+++#define _HFS_MOUNT_H_
+++
+++#include <sys/appleapiopts.h>
+++
+++#include <sys/mount.h>
+++#include <sys/time.h>
+++
+++/*
+++ * Arguments to mount HFS-based filesystems
+++ */
+++
+++#define OVERRIDE_UNKNOWN_PERMISSIONS 0
+++
+++#define UNKNOWNUID ((uid_t)99)
+++#define UNKNOWNGID ((gid_t)99)
+++#define UNKNOWNPERMISSIONS (S_IRWXU | S_IROTH | S_IXOTH) /* 705 */
+++
+++#ifdef __APPLE_API_UNSTABLE
+++struct hfs_mount_args {
+++#ifndef KERNEL
+++ char *fspec; /* block special device to mount */
+++#endif
+++ uid_t hfs_uid; /* uid that owns hfs files (standard HFS only) */
+++ gid_t hfs_gid; /* gid that owns hfs files (standard HFS only) */
+++ mode_t hfs_mask; /* mask to be applied for hfs perms (standard HFS only) */
+++ u_int32_t hfs_encoding; /* encoding for this volume (standard HFS only) */
+++ struct timezone hfs_timezone; /* user time zone info (standard HFS only) */
+++ int flags; /* mounting flags, see below */
+++ int journal_tbuffer_size; /* size in bytes of the journal transaction buffer */
+++ int journal_flags; /* flags to pass to journal_open/create */
+++ int journal_disable; /* don't use journaling (potentially dangerous) */
+++};
+++
+++#define HFSFSMNT_NOXONFILES 0x1 /* disable execute permissions for files */
+++#define HFSFSMNT_WRAPPER 0x2 /* mount HFS wrapper (if it exists) */
+++#define HFSFSMNT_EXTENDED_ARGS 0x4 /* indicates new fields after "flags" are valid */
+++
+++/*
+++ * Sysctl values for HFS
+++ */
+++#define HFS_ENCODINGBIAS 1 /* encoding matching CJK bias */
+++#define HFS_EXTEND_FS 2
+++#define HFS_ENCODINGHINT 3 /* guess encoding for string */
+++#define HFS_ENABLE_JOURNALING 0x082969
+++#define HFS_DISABLE_JOURNALING 0x031272
+++#define HFS_GET_JOURNAL_INFO 0x6a6e6c69
+++#define HFS_SET_PKG_EXTENSIONS 0x121031
+++
+++#endif /* __APPLE_API_UNSTABLE */
+++
+++#endif /* ! _HFS_MOUNT_H_ */
++diff --git a/include/sys/appleapiopts.h b/include/sys/appleapiopts.h
++new file mode 100644
++index 0000000..4d2061f
++--- /dev/null
+++++ b/include/sys/appleapiopts.h
++@@ -0,0 +1,52 @@
+++/*
+++ * Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
+++ *
+++ * @APPLE_LICENSE_HEADER_START@
+++ *
+++ * The contents of this file constitute Original Code as defined in and
+++ * are subject to the Apple Public Source License Version 1.1 (the
+++ * "License"). You may not use this file except in compliance with the
+++ * License. Please obtain a copy of the License at
+++ * http://www.apple.com/publicsource and read it before using this file.
+++ *
+++ * This Original Code and all software distributed under the License are
+++ * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+++ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+++ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+++ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
+++ * License for the specific language governing rights and limitations
+++ * under the License.
+++ *
+++ * @APPLE_LICENSE_HEADER_END@
+++ */
+++
+++#ifndef __SYS_APPLEAPIOPTS_H__
+++#define __SYS_APPLEAPIOPTS_H__
+++
+++
+++#ifndef __APPLE_API_STANDARD
+++#define __APPLE_API_STANDARD
+++#endif /* __APPLE_API_STANDARD */
+++
+++#ifndef __APPLE_API_STABLE
+++#define __APPLE_API_STABLE
+++#endif /* __APPLE_API_STABLE */
+++
+++#ifndef __APPLE_API_STRICT_CONFORMANCE
+++
+++#ifndef __APPLE_API_EVOLVING
+++#define __APPLE_API_EVOLVING
+++#endif /* __APPLE_API_EVOLVING */
+++
+++#ifndef __APPLE_API_UNSTABLE
+++#define __APPLE_API_UNSTABLE
+++#endif /* __APPLE_API_UNSTABLE */
+++
+++#ifndef __APPLE_API_OBSOLETE
+++#define __APPLE_API_OBSOLETE
+++#endif /* __APPLE_API_OBSOLETE */
+++
+++#endif /* __APPLE_API_STRICT_CONFORMANCE */
+++
+++#endif /* __SYS_APPLEAPIOPTS_H__ */
+++
+diff --git a/feeds/packages/utils/hfsprogs/patches/0004-Fix-compilation-on-64-bit-arches.patch b/feeds/packages/utils/hfsprogs/patches/0004-Fix-compilation-on-64-bit-arches.patch
+new file mode 100644
+index 0000000..57f6011
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0004-Fix-compilation-on-64-bit-arches.patch
+@@ -0,0 +1,131 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 24 Oct 2013 01:11:21 -0200
++Subject: Fix compilation on 64-bit arches
++
++---
++ fsck_hfs.tproj/dfalib/BTreePrivate.h | 5 ++++-
++ fsck_hfs.tproj/dfalib/SControl.c | 8 ++++----
++ fsck_hfs.tproj/dfalib/SVerify1.c | 14 +++++++-------
++ fsck_hfs.tproj/dfalib/hfs_endian.c | 2 +-
++ 4 files changed, 16 insertions(+), 13 deletions(-)
++
++diff --git a/fsck_hfs.tproj/dfalib/BTreePrivate.h b/fsck_hfs.tproj/dfalib/BTreePrivate.h
++index 058c75b..2fc2f28 100644
++--- a/fsck_hfs.tproj/dfalib/BTreePrivate.h
+++++ b/fsck_hfs.tproj/dfalib/BTreePrivate.h
++@@ -104,6 +104,9 @@ typedef enum {
++
++ ///////////////////////////////////// Types /////////////////////////////////////
++
+++// Forward declaration from Scavenger.h
+++struct BTreeExtensionsRec;
+++
++ typedef struct BTreeControlBlock { // fields specific to BTree CBs
++
++ UInt8 keyCompareType; /* Key string Comparison Type */
++@@ -144,7 +147,7 @@ typedef struct BTreeControlBlock { // fields specific to BTree CBs
++ UInt32 numPossibleHints; // Looks like a formated hint
++ UInt32 numValidHints; // Hint used to find correct record.
++
++- UInt32 refCon; // Used by DFA to point to private data.
+++ struct BTreeExtensionsRec *refCon; // Used by DFA to point to private data.
++ SFCB *fcbPtr; // fcb of btree file
++
++ } BTreeControlBlock, *BTreeControlBlockPtr;
++diff --git a/fsck_hfs.tproj/dfalib/SControl.c b/fsck_hfs.tproj/dfalib/SControl.c
++index 37eb242..4ce9e16 100644
++--- a/fsck_hfs.tproj/dfalib/SControl.c
+++++ b/fsck_hfs.tproj/dfalib/SControl.c
++@@ -1034,7 +1034,7 @@ static int ScavTerm( SGlobPtr GPtr )
++ btcbP = (BTreeControlBlock*)fcbP->fcbBtree;
++ if ( btcbP != nil)
++ {
++- if( btcbP->refCon != (UInt32)nil )
+++ if( btcbP->refCon != nil )
++ {
++ if(((BTreeExtensionsRec*)btcbP->refCon)->BTCBMPtr != nil)
++ {
++@@ -1043,13 +1043,13 @@ static int ScavTerm( SGlobPtr GPtr )
++ }
++ DisposeMemory( (Ptr)btcbP->refCon );
++ err = MemError();
++- btcbP->refCon = (UInt32)nil;
+++ btcbP->refCon = nil;
++ }
++
++ fcbP = GPtr->calculatedCatalogFCB; // release catalog BTree bit map
++ btcbP = (BTreeControlBlock*)fcbP->fcbBtree;
++
++- if( btcbP->refCon != (UInt32)nil )
+++ if( btcbP->refCon != nil )
++ {
++ if(((BTreeExtensionsRec*)btcbP->refCon)->BTCBMPtr != nil)
++ {
++@@ -1058,7 +1058,7 @@ static int ScavTerm( SGlobPtr GPtr )
++ }
++ DisposeMemory( (Ptr)btcbP->refCon );
++ err = MemError();
++- btcbP->refCon = (UInt32)nil;
+++ btcbP->refCon = nil;
++ }
++ }
++ }
++diff --git a/fsck_hfs.tproj/dfalib/SVerify1.c b/fsck_hfs.tproj/dfalib/SVerify1.c
++index c272d4d..a273bf3 100644
++--- a/fsck_hfs.tproj/dfalib/SVerify1.c
+++++ b/fsck_hfs.tproj/dfalib/SVerify1.c
++@@ -789,8 +789,8 @@ OSErr CreateExtentsBTreeControlBlock( SGlobPtr GPtr )
++ //
++ // set up our DFA extended BTCB area. Will we have enough memory on all HFS+ volumes.
++ //
++- btcb->refCon = (UInt32) AllocateClearMemory( sizeof(BTreeExtensionsRec) ); // allocate space for our BTCB extensions
++- if ( btcb->refCon == (UInt32) nil ) {
+++ btcb->refCon = AllocateClearMemory( sizeof(BTreeExtensionsRec) ); // allocate space for our BTCB extensions
+++ if ( btcb->refCon == nil ) {
++ err = R_NoMem;
++ goto exit;
++ }
++@@ -1144,8 +1144,8 @@ OSErr CreateCatalogBTreeControlBlock( SGlobPtr GPtr )
++ // set up our DFA extended BTCB area. Will we have enough memory on all HFS+ volumes.
++ //
++
++- btcb->refCon = (UInt32) AllocateClearMemory( sizeof(BTreeExtensionsRec) ); // allocate space for our BTCB extensions
++- if ( btcb->refCon == (UInt32)nil ) {
+++ btcb->refCon = AllocateClearMemory( sizeof(BTreeExtensionsRec) ); // allocate space for our BTCB extensions
+++ if ( btcb->refCon == nil ) {
++ err = R_NoMem;
++ goto exit;
++ }
++@@ -1779,8 +1779,8 @@ OSErr CreateAttributesBTreeControlBlock( SGlobPtr GPtr )
++ //
++ // set up our DFA extended BTCB area. Will we have enough memory on all HFS+ volumes.
++ //
++- btcb->refCon = (UInt32) AllocateClearMemory( sizeof(BTreeExtensionsRec) ); // allocate space for our BTCB extensions
++- if ( btcb->refCon == (UInt32)nil ) {
+++ btcb->refCon = AllocateClearMemory( sizeof(BTreeExtensionsRec) ); // allocate space for our BTCB extensions
+++ if ( btcb->refCon == nil ) {
++ err = R_NoMem;
++ goto exit;
++ }
++@@ -1793,7 +1793,7 @@ OSErr CreateAttributesBTreeControlBlock( SGlobPtr GPtr )
++ }
++ else
++ {
++- if ( btcb->refCon == (UInt32)nil ) {
+++ if ( btcb->refCon == nil ) {
++ err = R_NoMem;
++ goto exit;
++ }
++diff --git a/fsck_hfs.tproj/dfalib/hfs_endian.c b/fsck_hfs.tproj/dfalib/hfs_endian.c
++index 69500c1..3cc9eb4 100755
++--- a/fsck_hfs.tproj/dfalib/hfs_endian.c
+++++ b/fsck_hfs.tproj/dfalib/hfs_endian.c
++@@ -437,7 +437,7 @@ hfs_swap_HFSPlusBTInternalNode (
++ BTNodeDescriptor *srcDesc = src->buffer;
++ UInt16 *srcOffs = (UInt16 *)((char *)src->buffer + (src->blockSize - (srcDesc->numRecords * sizeof (UInt16))));
++ char *nextRecord; /* Points to start of record following current one */
++- UInt32 i;
+++ int i;
++ UInt32 j;
++
++ if (fileID == kHFSExtentsFileID) {
+diff --git a/feeds/packages/utils/hfsprogs/patches/0005-Remove-Apple-specific-p-from-strings.patch b/feeds/packages/utils/hfsprogs/patches/0005-Remove-Apple-specific-p-from-strings.patch
+new file mode 100644
+index 0000000..318fd60
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0005-Remove-Apple-specific-p-from-strings.patch
+@@ -0,0 +1,291 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 24 Oct 2013 01:11:21 -0200
++Subject: Remove (Apple-specific?) \p from strings
++
++Modify the way that debug messages are sent to the user, by eliminating one
++character of them.
++---
++ fsck_hfs.tproj/dfalib/BTreeTreeOps.c | 48 ++++++++++++++++++------------------
++ fsck_hfs.tproj/dfalib/SBTree.c | 14 +++++------
++ 2 files changed, 31 insertions(+), 31 deletions(-)
++
++diff --git a/fsck_hfs.tproj/dfalib/BTreeTreeOps.c b/fsck_hfs.tproj/dfalib/BTreeTreeOps.c
++index b812b14..37fb170 100644
++--- a/fsck_hfs.tproj/dfalib/BTreeTreeOps.c
+++++ b/fsck_hfs.tproj/dfalib/BTreeTreeOps.c
++@@ -223,7 +223,7 @@ OSStatus SearchTree (BTreeControlBlockPtr btreePtr,
++ //
++ if (curNodeNum == 0)
++ {
++-// Panic("\pSearchTree: curNodeNum is zero!");
+++ Panic("SearchTree: curNodeNum is zero!");
++ err = fsBTInvalidNodeErr;
++ goto ErrorExit;
++ }
++@@ -433,7 +433,7 @@ OSStatus InsertLevel (BTreeControlBlockPtr btreePtr,
++ M_ExitOnError (err);
++
++ if ( DEBUG_BUILD && updateParent && newRoot )
++- DebugStr("\p InsertLevel: New root from primary key, update from secondary key...");
+++ DebugStr("InsertLevel: New root from primary key, update from secondary key...");
++ }
++
++ //////////////////////// Update Parent(s) ///////////////////////////////
++@@ -448,7 +448,7 @@ OSStatus InsertLevel (BTreeControlBlockPtr btreePtr,
++
++ secondaryKey = nil;
++
++- PanicIf ( (level == btreePtr->treeDepth), "\p InsertLevel: unfinished insert!?");
+++ PanicIf ( (level == btreePtr->treeDepth), "InsertLevel: unfinished insert!?");
++
++ ++level;
++
++@@ -456,7 +456,7 @@ OSStatus InsertLevel (BTreeControlBlockPtr btreePtr,
++ index = treePathTable [level].index;
++ parentNodeNum = treePathTable [level].node;
++
++- PanicIf ( parentNodeNum == 0, "\p InsertLevel: parent node is zero!?");
+++ PanicIf ( parentNodeNum == 0, "InsertLevel: parent node is zero!?");
++
++ err = GetNode (btreePtr, parentNodeNum, &parentNode); // released as target node in next level up
++ M_ExitOnError (err);
++@@ -470,7 +470,7 @@ OSStatus InsertLevel (BTreeControlBlockPtr btreePtr,
++ {
++ //¥¥Êdebug: check if ptr == targetNodeNum
++ GetRecordByIndex (btreePtr, parentNode.buffer, index, &keyPtr, &recPtr, &recSize);
++- PanicIf( (*(UInt32 *) recPtr) != targetNodeNum, "\p InsertLevel: parent ptr doesn't match target node!");
+++ PanicIf( (*(UInt32 *) recPtr) != targetNodeNum, "InsertLevel: parent ptr doesn't match target node!");
++
++ // need to delete and re-insert this parent key/ptr
++ // we delete it here and it gets re-inserted in the
++@@ -532,7 +532,7 @@ ErrorExit:
++ (void) ReleaseNode (btreePtr, targetNode);
++ (void) ReleaseNode (btreePtr, &siblingNode);
++
++- Panic ("\p InsertLevel: an error occured!");
+++ Panic ("InsertLevel: an error occured!");
++
++ return err;
++
++@@ -566,7 +566,7 @@ static OSErr InsertNode (BTreeControlBlockPtr btreePtr,
++
++ *rootSplit = false;
++
++- PanicIf ( targetNode->buffer == siblingNode->buffer, "\p InsertNode: targetNode == siblingNode, huh?");
+++ PanicIf ( targetNode->buffer == siblingNode->buffer, "InsertNode: targetNode == siblingNode, huh?");
++
++ leftNodeNum = ((NodeDescPtr) targetNode->buffer)->bLink;
++ rightNodeNum = ((NodeDescPtr) targetNode->buffer)->fLink;
++@@ -606,7 +606,7 @@ static OSErr InsertNode (BTreeControlBlockPtr btreePtr,
++
++ if ( leftNodeNum > 0 )
++ {
++- PanicIf ( siblingNode->buffer != nil, "\p InsertNode: siblingNode already aquired!");
+++ PanicIf ( siblingNode->buffer != nil, "InsertNode: siblingNode already aquired!");
++
++ if ( siblingNode->buffer == nil )
++ {
++@@ -614,7 +614,7 @@ static OSErr InsertNode (BTreeControlBlockPtr btreePtr,
++ M_ExitOnError (err);
++ }
++
++- PanicIf ( ((NodeDescPtr) siblingNode->buffer)->fLink != nodeNum, "\p InsertNode, RotateLeft: invalid sibling link!" );
+++ PanicIf ( ((NodeDescPtr) siblingNode->buffer)->fLink != nodeNum, "InsertNode, RotateLeft: invalid sibling link!" );
++
++ if ( !key->skipRotate ) // are rotates allowed?
++ {
++@@ -703,7 +703,7 @@ OSStatus DeleteTree (BTreeControlBlockPtr btreePtr,
++
++ targetNodeNum = treePathTable[level].node;
++ targetNodePtr = targetNode->buffer;
++- PanicIf (targetNodePtr == nil, "\pDeleteTree: targetNode has nil buffer!");
+++ PanicIf (targetNodePtr == nil, "DeleteTree: targetNode has nil buffer!");
++
++ DeleteRecord (btreePtr, targetNodePtr, index);
++
++@@ -797,7 +797,7 @@ OSStatus DeleteTree (BTreeControlBlockPtr btreePtr,
++
++ //¥¥Êdebug: check if ptr == targetNodeNum
++ GetRecordByIndex (btreePtr, parentNode.buffer, index, &keyPtr, &recPtr, &recSize);
++- PanicIf( (*(UInt32 *) recPtr) != targetNodeNum, "\p DeleteTree: parent ptr doesn't match targetNodeNum!!");
+++ PanicIf( (*(UInt32 *) recPtr) != targetNodeNum, " DeleteTree: parent ptr doesn't match targetNodeNum!!");
++
++ // need to delete and re-insert this parent key/ptr
++ DeleteRecord (btreePtr, parentNode.buffer, index);
++@@ -1018,7 +1018,7 @@ static OSStatus RotateLeft (BTreeControlBlockPtr btreePtr,
++ keyPtr, keyLength, recPtr, recSize);
++ if ( !didItFit )
++ {
++- Panic ("\pRotateLeft: InsertKeyRecord (left) returned false!");
+++ Panic ("RotateLeft: InsertKeyRecord (left) returned false!");
++ err = fsBTBadRotateErr;
++ goto ErrorExit;
++ }
++@@ -1031,7 +1031,7 @@ static OSStatus RotateLeft (BTreeControlBlockPtr btreePtr,
++ didItFit = RotateRecordLeft (btreePtr, leftNode, rightNode);
++ if ( !didItFit )
++ {
++- Panic ("\pRotateLeft: RotateRecordLeft returned false!");
+++ Panic ("RotateLeft: RotateRecordLeft returned false!");
++ err = fsBTBadRotateErr;
++ goto ErrorExit;
++ }
++@@ -1048,7 +1048,7 @@ static OSStatus RotateLeft (BTreeControlBlockPtr btreePtr,
++ keyPtr, keyLength, recPtr, recSize);
++ if ( !didItFit )
++ {
++- Panic ("\pRotateLeft: InsertKeyRecord (right) returned false!");
+++ Panic ("RotateLeft: InsertKeyRecord (right) returned false!");
++ err = fsBTBadRotateErr;
++ goto ErrorExit;
++ }
++@@ -1117,7 +1117,7 @@ static OSStatus SplitLeft (BTreeControlBlockPtr btreePtr,
++ right = rightNode->buffer;
++ left = leftNode->buffer;
++
++- PanicIf ( right->bLink != 0 && left == 0, "\p SplitLeft: left sibling missing!?" );
+++ PanicIf ( right->bLink != 0 && left == 0, " SplitLeft: left sibling missing!?" );
++
++ //¥¥ type should be kLeafNode or kIndexNode
++
++@@ -1240,8 +1240,8 @@ static OSStatus AddNewRootNode (BTreeControlBlockPtr btreePtr,
++ Boolean didItFit;
++ UInt16 keyLength;
++
++- PanicIf (leftNode == nil, "\pAddNewRootNode: leftNode == nil");
++- PanicIf (rightNode == nil, "\pAddNewRootNode: rightNode == nil");
+++ PanicIf (leftNode == nil, "AddNewRootNode: leftNode == nil");
+++ PanicIf (rightNode == nil, "AddNewRootNode: rightNode == nil");
++
++
++ /////////////////////// Initialize New Root Node ////////////////////////////
++@@ -1264,7 +1264,7 @@ static OSStatus AddNewRootNode (BTreeControlBlockPtr btreePtr,
++ didItFit = InsertKeyRecord ( btreePtr, rootNode.buffer, 0, keyPtr, keyLength,
++ (UInt8 *) &rightNode->bLink, 4 );
++
++- PanicIf ( !didItFit, "\pAddNewRootNode:InsertKeyRecord failed for left index record");
+++ PanicIf ( !didItFit, "AddNewRootNode:InsertKeyRecord failed for left index record");
++
++
++ //////////////////// Insert Right Node Index Record /////////////////////////
++@@ -1275,7 +1275,7 @@ static OSStatus AddNewRootNode (BTreeControlBlockPtr btreePtr,
++ didItFit = InsertKeyRecord ( btreePtr, rootNode.buffer, 1, keyPtr, keyLength,
++ (UInt8 *) &leftNode->fLink, 4 );
++
++- PanicIf ( !didItFit, "\pAddNewRootNode:InsertKeyRecord failed for right index record");
+++ PanicIf ( !didItFit, "AddNewRootNode:InsertKeyRecord failed for right index record");
++
++
++ #if DEBUG_TREEOPS
++@@ -1355,7 +1355,7 @@ static OSStatus SplitRight (BTreeControlBlockPtr btreePtr,
++ }
++ rightPtr = rightNodePtr->buffer;
++
++- PanicIf ( leftPtr->fLink != 0 && rightPtr == 0, "\p SplitRight: right sibling missing!?" );
+++ PanicIf ( leftPtr->fLink != 0 && rightPtr == 0, "SplitRight: right sibling missing!?" );
++
++ //¥¥ type should be kLeafNode or kIndexNode
++
++@@ -1557,7 +1557,7 @@ static OSStatus RotateRight (BTreeControlBlockPtr btreePtr,
++ keyPtr, keyLength, recPtr, recSize);
++ if ( !didItFit )
++ {
++- Panic ("\pRotateRight: InsertKeyRecord (left) returned false!");
+++ Panic ("RotateRight: InsertKeyRecord (left) returned false!");
++ err = fsBTBadRotateErr;
++ goto ErrorExit;
++ }
++@@ -1572,7 +1572,7 @@ static OSStatus RotateRight (BTreeControlBlockPtr btreePtr,
++ didItFit = RotateRecordRight( btreePtr, leftNodePtr, rightNodePtr );
++ if ( !didItFit )
++ {
++- Panic ("\pRotateRight: RotateRecordRight returned false!");
+++ Panic ("RotateRight: RotateRecordRight returned false!");
++ err = fsBTBadRotateErr;
++ goto ErrorExit;
++ }
++@@ -1583,7 +1583,7 @@ static OSStatus RotateRight (BTreeControlBlockPtr btreePtr,
++ keyPtr, keyLength, recPtr, recSize);
++ if ( !didItFit )
++ {
++- Panic ("\pRotateRight: InsertKeyRecord (left) returned false!");
+++ Panic ("RotateRight: InsertKeyRecord (left) returned false!");
++ err = fsBTBadRotateErr;
++ goto ErrorExit;
++ }
++@@ -1607,7 +1607,7 @@ static OSStatus RotateRight (BTreeControlBlockPtr btreePtr,
++ keyPtr, keyLength, recPtr, recSize);
++ if ( !didItFit )
++ {
++- Panic ("\pRotateRight: InsertKeyRecord (right) returned false!");
+++ Panic ("RotateRight: InsertKeyRecord (right) returned false!");
++ err = fsBTBadRotateErr;
++ goto ErrorExit;
++ }
++diff --git a/fsck_hfs.tproj/dfalib/SBTree.c b/fsck_hfs.tproj/dfalib/SBTree.c
++index cd81b13..eeb4e8c 100644
++--- a/fsck_hfs.tproj/dfalib/SBTree.c
+++++ b/fsck_hfs.tproj/dfalib/SBTree.c
++@@ -103,7 +103,7 @@ OSErr SearchBTreeRecord(SFCB *fcb, const void* key, UInt32 hint, void* foundKey,
++ CopyMemory(&resultIterator->key, foundKey, CalcKeySize(btcb, &resultIterator->key)); //¥¥ warning, this could overflow user's buffer!!!
++
++ if ( DEBUG_BUILD && !ValidHFSRecord(data, btcb, *dataSize) )
++- DebugStr("\pSearchBTreeRecord: bad record?");
+++ DebugStr("SearchBTreeRecord: bad record?");
++ }
++
++ ErrorExit:
++@@ -211,7 +211,7 @@ OSErr GetBTreeRecord(SFCB *fcb, SInt16 selectionIndex, void* key, void* data, UI
++ CopyMemory(&iterator->key, key, CalcKeySize(btcb, &iterator->key)); //¥¥ warning, this could overflow user's buffer!!!
++
++ if ( DEBUG_BUILD && !ValidHFSRecord(data, btcb, *dataSize) )
++- DebugStr("\pGetBTreeRecord: bad record?");
+++ DebugStr("GetBTreeRecord: bad record?");
++
++ }
++
++@@ -243,7 +243,7 @@ OSErr InsertBTreeRecord(SFCB *fcb, const void* key, const void* data, UInt16 dat
++ CopyMemory(key, &iterator.key, CalcKeySize(btcb, (BTreeKey *) key)); //¥¥ should we range check against maxkeylen?
++
++ if ( DEBUG_BUILD && !ValidHFSRecord(data, btcb, dataSize) )
++- DebugStr("\pInsertBTreeRecord: bad record?");
+++ DebugStr("InsertBTreeRecord: bad record?");
++
++ result = BTInsertRecord( fcb, &iterator, &btRecord, dataSize );
++
++@@ -305,7 +305,7 @@ OSErr ReplaceBTreeRecord(SFCB *fcb, const void* key, UInt32 hint, void *newData,
++ CopyMemory(key, &iterator.key, CalcKeySize(btcb, (BTreeKey *) key)); //¥¥ should we range check against maxkeylen?
++
++ if ( DEBUG_BUILD && !ValidHFSRecord(newData, btcb, dataSize) )
++- DebugStr("\pReplaceBTreeRecord: bad record?");
+++ DebugStr("ReplaceBTreeRecord: bad record?");
++
++ result = BTReplaceRecord( fcb, &iterator, &btRecord, dataSize );
++
++@@ -344,7 +344,7 @@ SetEndOfForkProc ( SFCB *filePtr, FSSize minEOF, FSSize maxEOF )
++ else
++ {
++ if ( DEBUG_BUILD )
++- DebugStr("\pSetEndOfForkProc: minEOF is smaller than current size!");
+++ DebugStr("SetEndOfForkProc: minEOF is smaller than current size!");
++ return -1;
++ }
++
++@@ -370,7 +370,7 @@ SetEndOfForkProc ( SFCB *filePtr, FSSize minEOF, FSSize maxEOF )
++ // Make sure we got at least as much space as we needed
++ //
++ if (filePtr->fcbLogicalSize < minEOF) {
++- Panic("\pSetEndOfForkProc: disk too full to extend B-tree file");
+++ Panic("SetEndOfForkProc: disk too full to extend B-tree file");
++ return dskFulErr;
++ }
++
++@@ -442,7 +442,7 @@ static OSErr CheckBTreeKey(const BTreeKey *key, const BTreeControlBlock *btcb)
++ if ( (keyLen < 6) || (keyLen > btcb->maxKeyLength) )
++ {
++ if ( DEBUG_BUILD )
++- DebugStr("\pCheckBTreeKey: bad key length!");
+++ DebugStr("CheckBTreeKey: bad key length!");
++ return fsBTInvalidKeyLengthErr;
++ }
++
+diff --git a/feeds/packages/utils/hfsprogs/patches/0006-Adjust-types-for-printing.patch b/feeds/packages/utils/hfsprogs/patches/0006-Adjust-types-for-printing.patch
+new file mode 100644
+index 0000000..09efbb6
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0006-Adjust-types-for-printing.patch
+@@ -0,0 +1,37 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 24 Oct 2013 01:11:21 -0200
++Subject: Adjust types for printing
++
++Try to address the issues of a given integral type having different sizes
++in 32 and 64-bit architectures.
++---
++ fsck_hfs.tproj/dfalib/SControl.c | 2 +-
++ fsck_hfs.tproj/dfalib/hfs_endian.c | 2 +-
++ 2 files changed, 2 insertions(+), 2 deletions(-)
++
++diff --git a/fsck_hfs.tproj/dfalib/SControl.c b/fsck_hfs.tproj/dfalib/SControl.c
++index 4ce9e16..8b03ece 100644
++--- a/fsck_hfs.tproj/dfalib/SControl.c
+++++ b/fsck_hfs.tproj/dfalib/SControl.c
++@@ -776,7 +776,7 @@ static int ScavSetUp( SGlob *GPtr)
++ pointer = (ScavStaticStructures *) AllocateClearMemory( sizeof(ScavStaticStructures) );
++ if ( pointer == nil ) {
++ if ( GPtr->logLevel >= kDebugLog ) {
++- printf( "\t error %d - could not allocate %ld bytes of memory \n",
+++ printf( "\t error %d - could not allocate %i bytes of memory \n",
++ R_NoMem, sizeof(ScavStaticStructures) );
++ }
++ return( R_NoMem );
++diff --git a/fsck_hfs.tproj/dfalib/hfs_endian.c b/fsck_hfs.tproj/dfalib/hfs_endian.c
++index 3cc9eb4..6ca2ac1 100755
++--- a/fsck_hfs.tproj/dfalib/hfs_endian.c
+++++ b/fsck_hfs.tproj/dfalib/hfs_endian.c
++@@ -563,7 +563,7 @@ hfs_swap_HFSPlusBTInternalNode (
++ /* Make sure name length is consistent with key length */
++ if (keyLength < sizeof(srcKey->parentID) + sizeof(srcKey->nodeName.length) +
++ srcKey->nodeName.length*sizeof(srcKey->nodeName.unicode[0])) {
++- if (debug) printf("hfs_swap_HFSPlusBTInternalNode: catalog record #%d keyLength=%d expected=%lu\n",
+++ if (debug) printf("hfs_swap_HFSPlusBTInternalNode: catalog record #%d keyLength=%d expected=%i\n",
++ srcDesc->numRecords-i, keyLength, sizeof(srcKey->parentID) + sizeof(srcKey->nodeName.length) +
++ srcKey->nodeName.length*sizeof(srcKey->nodeName.unicode[0]));
++ WriteError(fcb->fcbVolume->vcbGPtr, E_KeyLen, fcb->fcbFileID, src->blockNum);
+diff --git a/feeds/packages/utils/hfsprogs/patches/0007-Fix-path-for-HFS-wrapper-block.patch b/feeds/packages/utils/hfsprogs/patches/0007-Fix-path-for-HFS-wrapper-block.patch
+new file mode 100644
+index 0000000..f92bb22
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0007-Fix-path-for-HFS-wrapper-block.patch
+@@ -0,0 +1,23 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 24 Oct 2013 01:11:21 -0200
++Subject: Fix path for HFS wrapper block
++
++Fix the installation of the HFS wrapper block to be compliant in Linux
++systems (since it is arch independent).
++---
++ newfs_hfs.tproj/makehfs.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/newfs_hfs.tproj/makehfs.c b/newfs_hfs.tproj/makehfs.c
++index 7609779..2233ef7 100644
++--- a/newfs_hfs.tproj/makehfs.c
+++++ b/newfs_hfs.tproj/makehfs.c
++@@ -70,7 +70,7 @@ extern Boolean _CFStringGetFileSystemRepresentation(CFStringRef string, UInt8 *b
++ #include "readme.h"
++
++
++-#define HFS_BOOT_DATA "/usr/share/misc/hfsbootdata"
+++#define HFS_BOOT_DATA "/usr/share/hfsprogs/hfsbootdata"
++
++ #define HFS_JOURNAL_FILE ".journal"
++ #define HFS_JOURNAL_INFO ".journal_info_block"
+diff --git a/feeds/packages/utils/hfsprogs/patches/0008-Provide-command-line-option-a.patch b/feeds/packages/utils/hfsprogs/patches/0008-Provide-command-line-option-a.patch
+new file mode 100644
+index 0000000..366dbbc
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0008-Provide-command-line-option-a.patch
+@@ -0,0 +1,40 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 24 Oct 2013 01:11:21 -0200
++Subject: Provide command line option -a
++
++Create a new command line option (-a) for the fsck.hfsplus that has the same
++behavior that the -p option has, for greater compatibility with other tools.
++---
++ fsck_hfs.tproj/fsck_hfs.c | 5 +++--
++ 1 file changed, 3 insertions(+), 2 deletions(-)
++
++diff --git a/fsck_hfs.tproj/fsck_hfs.c b/fsck_hfs.tproj/fsck_hfs.c
++index f1a18bd..6117698 100644
++--- a/fsck_hfs.tproj/fsck_hfs.c
+++++ b/fsck_hfs.tproj/fsck_hfs.c
++@@ -104,7 +104,7 @@ main(argc, argv)
++ else
++ progname = *argv;
++
++- while ((ch = getopt(argc, argv, "c:D:dfglm:npqruy")) != EOF) {
+++ while ((ch = getopt(argc, argv, "c:D:dfglm:napqruy")) != EOF) {
++ switch (ch) {
++ case 'c':
++ /* Cache size to use in fsck_hfs */
++@@ -169,6 +169,7 @@ main(argc, argv)
++ yflag = 0;
++ break;
++
+++ case 'a':
++ case 'p':
++ preen++;
++ break;
++@@ -572,7 +573,7 @@ usage()
++ (void) fprintf(stderr, " l = live fsck (lock down and test-only)\n");
++ (void) fprintf(stderr, " m arg = octal mode used when creating lost+found directory \n");
++ (void) fprintf(stderr, " n = assume a no response \n");
++- (void) fprintf(stderr, " p = just fix normal inconsistencies \n");
+++ (void) fprintf(stderr, " p, a = just fix normal inconsistencies \n");
++ (void) fprintf(stderr, " q = quick check returns clean, dirty, or failure \n");
++ (void) fprintf(stderr, " r = rebuild catalog btree \n");
++ (void) fprintf(stderr, " u = usage \n");
+diff --git a/feeds/packages/utils/hfsprogs/patches/0009-Rename-dprintf-to-dbg_printf.patch b/feeds/packages/utils/hfsprogs/patches/0009-Rename-dprintf-to-dbg_printf.patch
+new file mode 100644
+index 0000000..23f8518
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0009-Rename-dprintf-to-dbg_printf.patch
+@@ -0,0 +1,187 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 24 Oct 2013 01:11:21 -0200
++Subject: Rename dprintf to dbg_printf
++
++---
++ fsck_hfs.tproj/dfalib/SRepair.c | 18 +++++++++---------
++ fsck_hfs.tproj/dfalib/SVerify1.c | 6 +++---
++ fsck_hfs.tproj/fsck_debug.c | 10 +++++-----
++ fsck_hfs.tproj/fsck_debug.h | 10 +++++-----
++ 4 files changed, 22 insertions(+), 22 deletions(-)
++
++diff --git a/fsck_hfs.tproj/dfalib/SRepair.c b/fsck_hfs.tproj/dfalib/SRepair.c
++index 8eb759c..89c12d6 100644
++--- a/fsck_hfs.tproj/dfalib/SRepair.c
+++++ b/fsck_hfs.tproj/dfalib/SRepair.c
++@@ -1825,13 +1825,13 @@ static OSErr FixAttrSize(SGlobPtr GPtr, RepairOrderPtr p)
++ result = BTSearchRecord(GPtr->calculatedAttributesFCB, &iterator,
++ kInvalidMRUCacheKey, &btRecord, &recSize, &iterator);
++ if (result) {
++- dprintf (d_error|d_xattr, "%s: Cannot find attribute record (err = %d)\n", __FUNCTION__, result);
+++ dbg_printf (d_error|d_xattr, "%s: Cannot find attribute record (err = %d)\n", __FUNCTION__, result);
++ goto out;
++ }
++
++ /* We should only get record of type kHFSPlusAttrForkData */
++ if (record.recordType != kHFSPlusAttrForkData) {
++- dprintf (d_error|d_xattr, "%s: Record found is not attribute fork data\n", __FUNCTION__);
+++ dbg_printf (d_error|d_xattr, "%s: Record found is not attribute fork data\n", __FUNCTION__);
++ result = btNotFound;
++ goto out;
++ }
++@@ -1862,7 +1862,7 @@ static OSErr FixAttrSize(SGlobPtr GPtr, RepairOrderPtr p)
++ result = BTReplaceRecord(GPtr->calculatedAttributesFCB, &iterator,
++ &btRecord, recSize);
++ if (result) {
++- dprintf (d_error|d_xattr, "%s: Cannot replace attribute record (err=%d)\n", __FUNCTION__, result);
+++ dbg_printf (d_error|d_xattr, "%s: Cannot replace attribute record (err=%d)\n", __FUNCTION__, result);
++ goto out;
++ }
++ }
++@@ -2058,7 +2058,7 @@ del_overflow_extents:
++
++ /* Delete the extent record */
++ err = DeleteBTreeRecord(GPtr->calculatedExtentsFCB, &extentKey);
++- dprintf (d_info, "%s: Deleting extent overflow for fileID=%u, forkType=%u, startBlock=%u\n", __FUNCTION__, fileID, forkType, foundStartBlock);
+++ dbg_printf (d_info, "%s: Deleting extent overflow for fileID=%u, forkType=%u, startBlock=%u\n", __FUNCTION__, fileID, forkType, foundStartBlock);
++ if (err) {
++ goto create_symlink;
++ }
++@@ -3227,12 +3227,12 @@ static OSErr MoveExtent(SGlobPtr GPtr, ExtentInfo *extentInfo)
++ &extentData, &recordSize, &foundExtentIndex);
++ foundLocation = extentsBTree;
++ if (err != noErr) {
++- dprintf (d_error|d_overlap, "%s: No matching extent record found in extents btree for fileID = %d (err=%d)\n", __FUNCTION__, extentInfo->fileID, err);
+++ dbg_printf (d_error|d_overlap, "%s: No matching extent record found in extents btree for fileID = %d (err=%d)\n", __FUNCTION__, extentInfo->fileID, err);
++ goto out;
++ }
++ } else {
++ /* No more extents exist for this file */
++- dprintf (d_error|d_overlap, "%s: No matching extent record found for fileID = %d\n", __FUNCTION__, extentInfo->fileID);
+++ dbg_printf (d_error|d_overlap, "%s: No matching extent record found for fileID = %d\n", __FUNCTION__, extentInfo->fileID);
++ goto out;
++ }
++ }
++@@ -3241,7 +3241,7 @@ static OSErr MoveExtent(SGlobPtr GPtr, ExtentInfo *extentInfo)
++ err = CopyDiskBlocks(GPtr, extentInfo->startBlock, extentInfo->blockCount,
++ extentInfo->newStartBlock);
++ if (err != noErr) {
++- dprintf (d_error|d_overlap, "%s: Error in copying disk blocks for fileID = %d (err=%d)\n", __FUNCTION__, extentInfo->fileID, err);
+++ dbg_printf (d_error|d_overlap, "%s: Error in copying disk blocks for fileID = %d (err=%d)\n", __FUNCTION__, extentInfo->fileID, err);
++ goto out;
++ }
++
++@@ -3260,7 +3260,7 @@ static OSErr MoveExtent(SGlobPtr GPtr, ExtentInfo *extentInfo)
++
++ }
++ if (err != noErr) {
++- dprintf (d_error|d_overlap, "%s: Error in updating extent record for fileID = %d (err=%d)\n", __FUNCTION__, extentInfo->fileID, err);
+++ dbg_printf (d_error|d_overlap, "%s: Error in updating extent record for fileID = %d (err=%d)\n", __FUNCTION__, extentInfo->fileID, err);
++ goto out;
++ }
++
++@@ -3491,7 +3491,7 @@ static OSErr SearchExtentInAttributeBT(SGlobPtr GPtr, ExtentInfo *extentInfo,
++ result = BTSearchRecord(GPtr->calculatedAttributesFCB, &iterator,
++ kInvalidMRUCacheKey, &btRecord, recordSize, &iterator);
++ if (result) {
++- dprintf (d_error|d_overlap, "%s: Error finding attribute record (err=%d) for fileID = %d, attrname = %d\n", __FUNCTION__, result, extentInfo->fileID, extentInfo->attrname);
+++ dbg_printf (d_error|d_overlap, "%s: Error finding attribute record (err=%d) for fileID = %d, attrname = %d\n", __FUNCTION__, result, extentInfo->fileID, extentInfo->attrname);
++ goto out;
++ }
++
++diff --git a/fsck_hfs.tproj/dfalib/SVerify1.c b/fsck_hfs.tproj/dfalib/SVerify1.c
++index a273bf3..39bda5c 100644
++--- a/fsck_hfs.tproj/dfalib/SVerify1.c
+++++ b/fsck_hfs.tproj/dfalib/SVerify1.c
++@@ -2157,9 +2157,9 @@ CheckAttributeRecord(SGlobPtr GPtr, const HFSPlusAttrKey *key, const HFSPlusAttr
++
++ if (doDelete == true) {
++ result = DeleteBTreeRecord(GPtr->calculatedAttributesFCB, key);
++- dprintf (d_info|d_xattr, "%s: Deleting attribute %s for fileID %d, type = %d\n", __FUNCTION__, attrname, key->fileID, rec->recordType);
+++ dbg_printf (d_info|d_xattr, "%s: Deleting attribute %s for fileID %d, type = %d\n", __FUNCTION__, attrname, key->fileID, rec->recordType);
++ if (result) {
++- dprintf (d_error|d_xattr, "%s: Error in deleting record for %s for fileID %d, type = %d\n", __FUNCTION__, attrname, key->fileID, rec->recordType);
+++ dbg_printf (d_error|d_xattr, "%s: Error in deleting record for %s for fileID %d, type = %d\n", __FUNCTION__, attrname, key->fileID, rec->recordType);
++ }
++
++ /* Set flags to mark header and map dirty */
++@@ -3034,7 +3034,7 @@ OSErr CheckFileExtents( SGlobPtr GPtr, UInt32 fileNumber, UInt8 forkType,
++ // checkout the extent record first
++ err = ChkExtRec( GPtr, extents, &lastExtentIndex );
++ if (err != noErr) {
++- dprintf (d_info, "%s: Bad extent for fileID %u in extent %u for startblock %u\n", __FUNCTION__, fileNumber, lastExtentIndex, blockCount);
+++ dbg_printf (d_info, "%s: Bad extent for fileID %u in extent %u for startblock %u\n", __FUNCTION__, fileNumber, lastExtentIndex, blockCount);
++
++ /* Stop verification if bad extent is found for system file or EA */
++ if ((fileNumber < kHFSFirstUserCatalogNodeID) ||
++diff --git a/fsck_hfs.tproj/fsck_debug.c b/fsck_hfs.tproj/fsck_debug.c
++index 1be3fc5..77e8e51 100644
++--- a/fsck_hfs.tproj/fsck_debug.c
+++++ b/fsck_hfs.tproj/fsck_debug.c
++@@ -25,18 +25,18 @@
++ #include <stdio.h>
++ #include <stdarg.h>
++
++-/* Current debug level of fsck_hfs for printing messages via dprintf */
+++/* Current debug level of fsck_hfs for printing messages via dbg_printf */
++ unsigned long cur_debug_level;
++
++-/* Function: dprintf
+++/* Function: dbg_printf
++ *
++ * Description: Debug function similar to printf except the first parameter
++- * which indicates the type of message to be printed by dprintf. Based on
+++ * which indicates the type of message to be printed by dbg_printf. Based on
++ * current debug level and the type of message, the function decides
++ * whether to print the message or not.
++ *
++ * Each unique message type has a bit assigned to it. The message type
++- * passed to dprintf can be one or combination (OR-ed value) of pre-defined
+++ * passed to dbg_printf can be one or combination (OR-ed value) of pre-defined
++ * debug message types. Only the messages whose type have one or more similar
++ * bits set in comparison with current global debug level are printed.
++ *
++@@ -56,7 +56,7 @@ unsigned long cur_debug_level;
++ * Output:
++ * Nothing
++ */
++-void dprintf (unsigned long type, char *fmt, ...)
+++void dbg_printf (unsigned long type, char *fmt, ...)
++ {
++ if (cur_debug_level & type) {
++ va_list ap;
++diff --git a/fsck_hfs.tproj/fsck_debug.h b/fsck_hfs.tproj/fsck_debug.h
++index 81e3932..cb1b9be 100644
++--- a/fsck_hfs.tproj/fsck_debug.h
+++++ b/fsck_hfs.tproj/fsck_debug.h
++@@ -36,18 +36,18 @@ enum debug_message_type {
++ d_overlap = 0x0020 /* Overlap extents related messages */
++ };
++
++-/* Current debug level of fsck_hfs for printing messages via dprintf */
+++/* Current debug level of fsck_hfs for printing messages via dbg_printf */
++ extern unsigned long cur_debug_level;
++
++-/* Function: dprintf
+++/* Function: dbg_printf
++ *
++ * Description: Debug function similar to printf except the first parameter
++- * which indicates the type of message to be printed by dprintf. Based on
+++ * which indicates the type of message to be printed by dbg_printf. Based on
++ * current debug level and the type of message, the function decides
++ * whether to print the message or not.
++ *
++ * Each unique message type has a bit assigned to it. The message type
++- * passed to dprintf can be one or combination (OR-ed value) of pre-defined
+++ * passed to dbg_printf can be one or combination (OR-ed value) of pre-defined
++ * debug message types. Only the messages whose type have one or more similar
++ * bits set in comparison with current global debug level are printed.
++ *
++@@ -67,6 +67,6 @@ extern unsigned long cur_debug_level;
++ * Output:
++ * Nothing
++ */
++-extern void dprintf (unsigned long message_type, char *format, ...);
+++extern void dbg_printf (unsigned long message_type, char *format, ...);
++
++ #endif /* __FSCK_DEBUG__ */
+diff --git a/feeds/packages/utils/hfsprogs/patches/0010-Rename-custom-macro-nil-with-NULL.patch b/feeds/packages/utils/hfsprogs/patches/0010-Rename-custom-macro-nil-with-NULL.patch
+new file mode 100644
+index 0000000..354b4ff
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0010-Rename-custom-macro-nil-with-NULL.patch
+@@ -0,0 +1,1319 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 24 Oct 2013 01:11:21 -0200
++Subject: Rename custom macro nil with NULL
++
++---
++ fsck_hfs.tproj/dfalib/BTree.c | 142 +++++++++++++++++-----------------
++ fsck_hfs.tproj/dfalib/BTreeAllocate.c | 14 ++--
++ fsck_hfs.tproj/dfalib/BTreeMiscOps.c | 26 +++----
++ fsck_hfs.tproj/dfalib/BTreeNodeOps.c | 30 +++----
++ fsck_hfs.tproj/dfalib/BTreeTreeOps.c | 38 ++++-----
++ fsck_hfs.tproj/dfalib/SControl.c | 56 +++++++-------
++ fsck_hfs.tproj/dfalib/SRepair.c | 6 +-
++ fsck_hfs.tproj/dfalib/SUtils.c | 6 +-
++ fsck_hfs.tproj/dfalib/SVerify1.c | 32 ++++----
++ fsck_hfs.tproj/dfalib/SVerify2.c | 4 +-
++ 10 files changed, 177 insertions(+), 177 deletions(-)
++
++diff --git a/fsck_hfs.tproj/dfalib/BTree.c b/fsck_hfs.tproj/dfalib/BTree.c
++index 7ad9fe0..c0c8744 100644
++--- a/fsck_hfs.tproj/dfalib/BTree.c
+++++ b/fsck_hfs.tproj/dfalib/BTree.c
++@@ -163,21 +163,21 @@ OSStatus BTInitialize (FCB *filePtr,
++
++ ////////////////////// Preliminary Error Checking ///////////////////////////
++
++- headerNode.buffer = nil;
+++ headerNode.buffer = NULL;
++
++- if (pathPtr == nil) return paramErr;
+++ if (pathPtr == NULL) return paramErr;
++
++ setEndOfForkProc = pathPtr->agentPtr->agent.setEndOfForkProc;
++ setBlockSizeProc = pathPtr->agentPtr->agent.setBlockSizeProc;
++
++- if (pathPtr->agentPtr->agent.getBlockProc == nil) return E_NoGetBlockProc;
++- if (pathPtr->agentPtr->agent.releaseBlockProc == nil) return E_NoReleaseBlockProc;
++- if (setEndOfForkProc == nil) return E_NoSetEndOfForkProc;
++- if (setBlockSizeProc == nil) return E_NoSetBlockSizeProc;
+++ if (pathPtr->agentPtr->agent.getBlockProc == NULL) return E_NoGetBlockProc;
+++ if (pathPtr->agentPtr->agent.releaseBlockProc == NULL) return E_NoReleaseBlockProc;
+++ if (setEndOfForkProc == NULL) return E_NoSetEndOfForkProc;
+++ if (setBlockSizeProc == NULL) return E_NoSetBlockSizeProc;
++
++ forkPtr = pathPtr->path.forkPtr;
++
++- if (forkPtr->fork.btreePtr != nil) return fsBTrFileAlreadyOpenErr;
+++ if (forkPtr->fork.btreePtr != NULL) return fsBTrFileAlreadyOpenErr;
++
++ if ((maxKeyLength == 0) ||
++ (maxKeyLength > kMaxKeyLength)) return fsBTInvalidKeyLengthErr;
++@@ -209,7 +209,7 @@ OSStatus BTInitialize (FCB *filePtr,
++ //////////////////////// Allocate Control Block /////////////////////////////
++
++ M_RESIDENT_ALLOCATE_FIXED_CLEAR( &btreePtr, sizeof( BTreeControlBlock ), kFSBTreeControlBlockType );
++- if (btreePtr == nil)
+++ if (btreePtr == NULL)
++ {
++ err = memFullErr;
++ goto ErrorExit;
++@@ -220,7 +220,7 @@ OSStatus BTInitialize (FCB *filePtr,
++ btreePtr->flags = 0;
++ btreePtr->attributes = 0;
++ btreePtr->forkPtr = forkPtr;
++- btreePtr->keyCompareProc = nil;
+++ btreePtr->keyCompareProc = NULL;
++ btreePtr->keyDescPtr = keyDescPtr;
++ btreePtr->btreeType = btreeType;
++ btreePtr->treeDepth = 0;
++@@ -282,7 +282,7 @@ OSStatus BTInitialize (FCB *filePtr,
++
++ ///////////////////// Copy Key Descriptor To Header /////////////////////////
++ #if SupportsKeyDescriptors
++- if (keyDescPtr != nil)
+++ if (keyDescPtr != NULL)
++ {
++ err = CheckKeyDescriptor (keyDescPtr, maxKeyLength);
++ M_ExitOnError (err);
++@@ -309,7 +309,7 @@ OSStatus BTInitialize (FCB *filePtr,
++ err = UpdateHeader (btreePtr);
++ M_ExitOnError (err);
++
++- pathPtr->path.forkPtr->fork.btreePtr = nil;
+++ pathPtr->path.forkPtr->fork.btreePtr = NULL;
++ M_RESIDENT_DEALLOCATE_FIXED( btreePtr, sizeof( BTreeControlBlock ), kFSBTreeControlBlockType );
++
++ return noErr;
++@@ -320,7 +320,7 @@ OSStatus BTInitialize (FCB *filePtr,
++ ErrorExit:
++
++ (void) ReleaseNode (btreePtr, &headerNode);
++- if (btreePtr != nil)
+++ if (btreePtr != NULL)
++ M_RESIDENT_DEALLOCATE_FIXED( btreePtr, sizeof( BTreeControlBlock ), kFSBTreeControlBlockType );
++
++ return err;
++@@ -342,7 +342,7 @@ Input: filePtr - pointer to file to open as a B-tree
++ setEndOfForkProc - pointer to client's SetEOF function
++
++ Result: noErr - success
++- paramErr - required ptr was nil
+++ paramErr - required ptr was NULL
++ fsBTInvalidFileErr -
++ memFullErr -
++ != noErr - failure
++@@ -364,16 +364,16 @@ OSStatus BTOpenPath (SFCB *filePtr,
++
++ ////////////////////// Preliminary Error Checking ///////////////////////////
++
++- if ( filePtr == nil ||
++- getBlockProc == nil ||
++- releaseBlockProc == nil ||
++- setEndOfForkProc == nil ||
++- setBlockSizeProc == nil )
+++ if (filePtr == NULL ||
+++ getBlockProc == NULL ||
+++ releaseBlockProc == NULL ||
+++ setEndOfForkProc == NULL ||
+++ setBlockSizeProc == NULL)
++ {
++ return paramErr;
++ }
++
++- if ( filePtr->fcbBtree != nil ) // already has a BTreeCB
+++ if (filePtr->fcbBtree != NULL) // already has a BTreeCB
++ return noErr;
++
++ // is file large enough to contain header node?
++@@ -384,7 +384,7 @@ OSStatus BTOpenPath (SFCB *filePtr,
++ //////////////////////// Allocate Control Block /////////////////////////////
++
++ btreePtr = (BTreeControlBlock*) AllocateClearMemory( sizeof( BTreeControlBlock ) );
++- if (btreePtr == nil)
+++ if (btreePtr == NULL)
++ {
++ Panic ("\pBTOpen: no memory for btreePtr.");
++ return memFullErr;
++@@ -397,7 +397,7 @@ OSStatus BTOpenPath (SFCB *filePtr,
++
++ /////////////////////////// Read Header Node ////////////////////////////////
++
++- nodeRec.buffer = nil; // so we can call ReleaseNode
+++ nodeRec.buffer = NULL; // so we can call ReleaseNode
++
++ btreePtr->fcbPtr = filePtr;
++ filePtr->fcbBtree = (void *) btreePtr; // attach btree cb to file
++@@ -487,7 +487,7 @@ OSStatus BTOpenPath (SFCB *filePtr,
++
++ ////////////////////////// Get Key Descriptor ///////////////////////////////
++ #if SupportsKeyDescriptors
++- if ( keyCompareProc == nil ) // if no key compare proc then get key descriptor
+++ if (keyCompareProc == NULL) // if no key compare proc then get key descriptor
++ {
++ err = GetKeyDescriptor (btreePtr, nodeRec.buffer); //¥¥ it should check amount of memory allocated...
++ M_ExitOnError (err);
++@@ -499,7 +499,7 @@ OSStatus BTOpenPath (SFCB *filePtr,
++ else
++ #endif
++ {
++- btreePtr->keyDescPtr = nil; // clear it so we don't dispose garbage later
+++ btreePtr->keyDescPtr = NULL; // clear it so we don't dispose garbage later
++ }
++
++ err = ReleaseNode (btreePtr, &nodeRec);
++@@ -528,7 +528,7 @@ OSStatus BTOpenPath (SFCB *filePtr,
++
++ ErrorExit:
++
++- filePtr->fcbBtree = nil;
+++ filePtr->fcbBtree = NULL;
++ (void) ReleaseNode (btreePtr, &nodeRec);
++ DisposeMemory( btreePtr );
++
++@@ -567,7 +567,7 @@ OSStatus BTClosePath (SFCB *filePtr)
++
++ btreePtr = (BTreeControlBlockPtr) filePtr->fcbBtree;
++
++- if (btreePtr == nil)
+++ if (btreePtr == NULL)
++ return fsBTInvalidFileErr;
++
++ ////////////////////// Check for other BTree Paths //////////////////////////
++@@ -603,14 +603,14 @@ OSStatus BTClosePath (SFCB *filePtr)
++ M_ExitOnError (err);
++
++ #if SupportsKeyDescriptors
++- if (btreePtr->keyDescPtr != nil) // deallocate keyDescriptor, if any
+++ if (btreePtr->keyDescPtr != NULL) // deallocate keyDescriptor, if any
++ {
++ DisposeMemory( btreePtr->keyDescPtr );
++ }
++ #endif
++
++ DisposeMemory( btreePtr );
++- filePtr->fcbBtree = nil;
+++ filePtr->fcbBtree = NULL;
++
++ // LogEndTime(kTraceCloseBTree, noErr);
++
++@@ -643,7 +643,7 @@ Function: Search for position in B*Tree indicated by searchKey. If a valid node
++
++ Input: pathPtr - pointer to path for BTree file.
++ searchKey - pointer to search key to match.
++- hintPtr - pointer to hint (may be nil)
+++ hintPtr - pointer to hint (may be NULL)
++
++ Output: record - pointer to BufferDescriptor containing record
++ recordLen - length of data at recordPtr
++@@ -678,14 +678,14 @@ OSStatus BTSearchRecord (SFCB *filePtr,
++
++ // LogStartTime(kTraceSearchBTree);
++
++- if (filePtr == nil) return paramErr;
++- if (searchIterator == nil) return paramErr;
+++ if (filePtr == NULL) return paramErr;
+++ if (searchIterator == NULL) return paramErr;
++
++ btreePtr = (BTreeControlBlockPtr) filePtr->fcbBtree;
++- if (btreePtr == nil) return fsBTInvalidFileErr;
+++ if (btreePtr == NULL) return fsBTInvalidFileErr;
++
++ #if SupportsKeyDescriptors
++- if (btreePtr->keyCompareProc == nil) // CheckKey if we using Key Descriptor
+++ if (btreePtr->keyCompareProc == NULL) // CheckKey if we using Key Descriptor
++ {
++ err = CheckKey (&searchIterator->key, btreePtr->keyDescPtr, btreePtr->maxKeyLength);
++ M_ExitOnError (err);
++@@ -775,9 +775,9 @@ OSStatus BTSearchRecord (SFCB *filePtr,
++ //¥¥ Should check for errors! Or BlockMove could choke on recordPtr!!!
++ GetRecordByIndex (btreePtr, node.buffer, index, &keyPtr, &recordPtr, &len);
++
++- if (recordLen != nil) *recordLen = len;
+++ if (recordLen != NULL) *recordLen = len;
++
++- if (record != nil)
+++ if (record != NULL)
++ {
++ ByteCount recordSize;
++
++@@ -794,7 +794,7 @@ OSStatus BTSearchRecord (SFCB *filePtr,
++
++ /////////////////////// Success - Update Iterator ///////////////////////////
++
++- if (resultIterator != nil)
+++ if (resultIterator != NULL)
++ {
++ resultIterator->hint.writeCount = btreePtr->writeCount;
++ resultIterator->hint.nodeNum = nodeNum;
++@@ -825,10 +825,10 @@ OSStatus BTSearchRecord (SFCB *filePtr,
++
++ ErrorExit:
++
++- if (recordLen != nil)
+++ if (recordLen != NULL)
++ *recordLen = 0;
++
++- if (resultIterator != nil)
+++ if (resultIterator != NULL)
++ {
++ resultIterator->hint.writeCount = 0;
++ resultIterator->hint.nodeNum = 0;
++@@ -892,18 +892,18 @@ OSStatus BTIterateRecord (SFCB *filePtr,
++
++ ////////////////////////// Priliminary Checks ///////////////////////////////
++
++- left.buffer = nil;
++- right.buffer = nil;
++- node.buffer = nil;
+++ left.buffer = NULL;
+++ right.buffer = NULL;
+++ node.buffer = NULL;
++
++
++- if (filePtr == nil)
+++ if (filePtr == NULL)
++ {
++ return paramErr;
++ }
++
++ btreePtr = (BTreeControlBlockPtr) filePtr->fcbBtree;
++- if (btreePtr == nil)
+++ if (btreePtr == NULL)
++ {
++ return fsBTInvalidFileErr; //¥¥ handle properly
++ }
++@@ -968,7 +968,7 @@ OSStatus BTIterateRecord (SFCB *filePtr,
++ }
++ else
++ {
++- if (left.buffer == nil)
+++ if (left.buffer == NULL)
++ {
++ nodeNum = ((NodeDescPtr) node.buffer)->bLink;
++ if ( nodeNum > 0)
++@@ -981,13 +981,13 @@ OSStatus BTIterateRecord (SFCB *filePtr,
++ }
++ }
++ // Before we stomp on "right", we'd better release it if needed
++- if (right.buffer != nil) {
+++ if (right.buffer != NULL) {
++ err = ReleaseNode(btreePtr, &right);
++ M_ExitOnError(err);
++ }
++ right = node;
++ node = left;
++- left.buffer = nil;
+++ left.buffer = NULL;
++ index = ((NodeDescPtr) node.buffer)->numRecords -1;
++ }
++ }
++@@ -1012,7 +1012,7 @@ OSStatus BTIterateRecord (SFCB *filePtr,
++ }
++ else
++ {
++- if (right.buffer == nil)
+++ if (right.buffer == NULL)
++ {
++ nodeNum = ((NodeDescPtr) node.buffer)->fLink;
++ if ( nodeNum > 0)
++@@ -1025,13 +1025,13 @@ OSStatus BTIterateRecord (SFCB *filePtr,
++ }
++ }
++ // Before we stomp on "left", we'd better release it if needed
++- if (left.buffer != nil) {
+++ if (left.buffer != NULL) {
++ err = ReleaseNode(btreePtr, &left);
++ M_ExitOnError(err);
++ }
++ left = node;
++ node = right;
++- right.buffer = nil;
+++ right.buffer = NULL;
++ index = 0;
++ }
++ }
++@@ -1054,9 +1054,9 @@ CopyData:
++ err = GetRecordByIndex (btreePtr, node.buffer, index, &keyPtr, &recordPtr, &len);
++ M_ExitOnError (err);
++
++- if (recordLen != nil) *recordLen = len;
+++ if (recordLen != NULL) *recordLen = len;
++
++- if (record != nil)
+++ if (record != NULL)
++ {
++ ByteCount recordSize;
++
++@@ -1069,7 +1069,7 @@ CopyData:
++ CopyMemory (recordPtr, record->bufferAddress, len);
++ }
++
++- if (iterator != nil) // first & last do not require iterator
+++ if (iterator != NULL) // first & last do not require iterator
++ {
++ iterator->hint.writeCount = btreePtr->writeCount;
++ iterator->hint.nodeNum = nodeNum;
++@@ -1089,13 +1089,13 @@ CopyData:
++ err = ReleaseNode (btreePtr, &node);
++ M_ExitOnError (err);
++
++- if (left.buffer != nil)
+++ if (left.buffer != NULL)
++ {
++ err = ReleaseNode (btreePtr, &left);
++ M_ExitOnError (err);
++ }
++
++- if (right.buffer != nil)
+++ if (right.buffer != NULL)
++ {
++ err = ReleaseNode (btreePtr, &right);
++ M_ExitOnError (err);
++@@ -1113,10 +1113,10 @@ ErrorExit:
++ (void) ReleaseNode (btreePtr, &node);
++ (void) ReleaseNode (btreePtr, &right);
++
++- if (recordLen != nil)
+++ if (recordLen != NULL)
++ *recordLen = 0;
++
++- if (iterator != nil)
+++ if (iterator != NULL)
++ {
++ iterator->hint.writeCount = 0;
++ iterator->hint.nodeNum = 0;
++@@ -1157,7 +1157,7 @@ OSStatus BTInsertRecord (SFCB *filePtr,
++
++ ////////////////////////// Priliminary Checks ///////////////////////////////
++
++- nodeRec.buffer = nil; // so we can call ReleaseNode
+++ nodeRec.buffer = NULL; // so we can call ReleaseNode
++
++ err = CheckInsertParams (filePtr, iterator, record, recordLen);
++ if (err != noErr)
++@@ -1317,7 +1317,7 @@ OSStatus BTSetRecord (SFCB *filePtr,
++
++ ////////////////////////// Priliminary Checks ///////////////////////////////
++
++- nodeRec.buffer = nil; // so we can call ReleaseNode
+++ nodeRec.buffer = NULL; // so we can call ReleaseNode
++
++ err = CheckInsertParams (filePtr, iterator, record, recordLen);
++ if (err != noErr)
++@@ -1506,7 +1506,7 @@ OSStatus BTReplaceRecord (SFCB *filePtr,
++
++ ////////////////////////// Priliminary Checks ///////////////////////////////
++
++- nodeRec.buffer = nil; // so we can call ReleaseNode
+++ nodeRec.buffer = NULL; // so we can call ReleaseNode
++
++ err = CheckInsertParams (filePtr, iterator, record, recordLen);
++ if (err != noErr)
++@@ -1645,20 +1645,20 @@ OSStatus BTDeleteRecord (SFCB *filePtr,
++
++ ////////////////////////// Priliminary Checks ///////////////////////////////
++
++- nodeRec.buffer = nil; // so we can call ReleaseNode
+++ nodeRec.buffer = NULL; // so we can call ReleaseNode
++
++- M_ReturnErrorIf (filePtr == nil, paramErr);
++- M_ReturnErrorIf (iterator == nil, paramErr);
+++ M_ReturnErrorIf (filePtr == NULL, paramErr);
+++ M_ReturnErrorIf (iterator == NULL, paramErr);
++
++ btreePtr = (BTreeControlBlockPtr) filePtr->fcbBtree;
++- if (btreePtr == nil)
+++ if (btreePtr == NULL)
++ {
++ err = fsBTInvalidFileErr;
++ goto ErrorExit;
++ }
++
++ #if SupportsKeyDescriptors
++- if (btreePtr->keyDescPtr != nil)
+++ if (btreePtr->keyDescPtr != NULL)
++ {
++ err = CheckKey (&iterator->key, btreePtr->keyDescPtr, btreePtr->maxKeyLength);
++ M_ExitOnError (err);
++@@ -1712,12 +1712,12 @@ OSStatus BTGetInformation (SFCB *filePtr,
++ BTreeControlBlockPtr btreePtr;
++
++
++- M_ReturnErrorIf (filePtr == nil, paramErr);
+++ M_ReturnErrorIf (filePtr == NULL, paramErr);
++
++ btreePtr = (BTreeControlBlockPtr) filePtr->fcbBtree;
++
++- M_ReturnErrorIf (btreePtr == nil, fsBTInvalidFileErr);
++- M_ReturnErrorIf (info == nil, paramErr);
+++ M_ReturnErrorIf (btreePtr == NULL, fsBTInvalidFileErr);
+++ M_ReturnErrorIf (info == NULL, paramErr);
++
++ //¥¥ check version?
++
++@@ -1730,7 +1730,7 @@ OSStatus BTGetInformation (SFCB *filePtr,
++ info->keyDescriptor = btreePtr->keyDescPtr; //¥¥ this won't do at all...
++ info->reserved = 0;
++
++- if (btreePtr->keyDescPtr == nil)
+++ if (btreePtr->keyDescPtr == NULL)
++ info->keyDescLength = 0;
++ else
++ info->keyDescLength = (UInt32) btreePtr->keyDescPtr->length;
++@@ -1762,11 +1762,11 @@ OSStatus BTFlushPath (SFCB *filePtr)
++
++ // LogStartTime(kTraceFlushBTree);
++
++- M_ReturnErrorIf (filePtr == nil, paramErr);
+++ M_ReturnErrorIf (filePtr == NULL, paramErr);
++
++ btreePtr = (BTreeControlBlockPtr) filePtr->fcbBtree;
++
++- M_ReturnErrorIf (btreePtr == nil, fsBTInvalidFileErr);
+++ M_ReturnErrorIf (btreePtr == NULL, fsBTInvalidFileErr);
++
++ err = UpdateHeader (btreePtr);
++
++@@ -1788,13 +1788,13 @@ Input: iterator - pointer to BTreeIterator
++ Output: iterator - iterator with the hint.nodeNum cleared
++
++ Result: noErr - success
++- paramErr - iterator == nil
+++ paramErr - iterator == NULL
++ -------------------------------------------------------------------------------*/
++
++
++ OSStatus BTInvalidateHint (BTreeIterator *iterator )
++ {
++- if (iterator == nil)
+++ if (iterator == NULL)
++ return paramErr;
++
++ iterator->hint.nodeNum = 0;
++diff --git a/fsck_hfs.tproj/dfalib/BTreeAllocate.c b/fsck_hfs.tproj/dfalib/BTreeAllocate.c
++index 485d867..02bdd8d 100644
++--- a/fsck_hfs.tproj/dfalib/BTreeAllocate.c
+++++ b/fsck_hfs.tproj/dfalib/BTreeAllocate.c
++@@ -83,7 +83,7 @@ OSStatus AllocateNode (BTreeControlBlockPtr btreePtr, UInt32 *nodeNum)
++
++
++ nodeNumber = 0; // first node number of header map record
++- node.buffer = nil; // clear node.buffer to get header node
+++ node.buffer = NULL; // clear node.buffer to get header node
++ // - and for ErrorExit
++
++ while (true)
++@@ -192,7 +192,7 @@ OSStatus FreeNode (BTreeControlBlockPtr btreePtr, UInt32 nodeNum)
++
++ //////////////////////////// Find Map Record ////////////////////////////////
++ nodeIndex = 0; // first node number of header map record
++- node.buffer = nil; // invalidate node.buffer to get header node
+++ node.buffer = NULL; // invalidate node.buffer to get header node
++
++ while (nodeNum >= nodeIndex)
++ {
++@@ -278,8 +278,8 @@ OSStatus ExtendBTree (BTreeControlBlockPtr btreePtr,
++ nodeSize = btreePtr->nodeSize;
++ filePtr = btreePtr->fcbPtr;
++
++- mapNode.buffer = nil;
++- newNode.buffer = nil;
+++ mapNode.buffer = NULL;
+++ newNode.buffer = NULL;
++
++ mapNodeRecSize = nodeSize - sizeof(BTNodeDescriptor) - 6; // 2 bytes of free space (see note)
++
++@@ -448,7 +448,7 @@ ErrorExit:
++ Routine: GetMapNode - Get the next map node and pointer to the map record.
++
++ Function: Given a BlockDescriptor to a map node in nodePtr, GetMapNode releases
++- it and gets the next node. If nodePtr->buffer is nil, then the header
+++ it and gets the next node. If nodePtr->buffer is NULL, then the header
++ node is retrieved.
++
++
++@@ -474,7 +474,7 @@ OSStatus GetMapNode (BTreeControlBlockPtr btreePtr,
++ UInt16 mapIndex;
++ UInt32 nextNodeNum;
++
++- if (nodePtr->buffer != nil) // if iterator is valid...
+++ if (nodePtr->buffer != NULL) // if iterator is valid...
++ {
++ nextNodeNum = ((NodeDescPtr)nodePtr->buffer)->fLink;
++ if (nextNodeNum == 0)
++@@ -521,7 +521,7 @@ ErrorExit:
++
++ (void) ReleaseNode (btreePtr, nodePtr);
++
++- *mapPtr = nil;
+++ *mapPtr = NULL;
++ *mapSize = 0;
++
++ return err;
++diff --git a/fsck_hfs.tproj/dfalib/BTreeMiscOps.c b/fsck_hfs.tproj/dfalib/BTreeMiscOps.c
++index 7c9edca..997f34b 100644
++--- a/fsck_hfs.tproj/dfalib/BTreeMiscOps.c
+++++ b/fsck_hfs.tproj/dfalib/BTreeMiscOps.c
++@@ -236,13 +236,13 @@ OSStatus FindIteratorPosition (BTreeControlBlockPtr btreePtr,
++ // assume index points to UInt16
++ // assume foundRecord points to Boolean
++
++- left->buffer = nil;
++- middle->buffer = nil;
++- right->buffer = nil;
+++ left->buffer = NULL;
+++ middle->buffer = NULL;
+++ right->buffer = NULL;
++
++ foundIt = false;
++
++- if (iterator == nil) // do we have an iterator?
+++ if (iterator == NULL) // do we have an iterator?
++ {
++ err = fsBTInvalidIteratorErr;
++ goto ErrorExit;
++@@ -250,7 +250,7 @@ OSStatus FindIteratorPosition (BTreeControlBlockPtr btreePtr,
++
++ #if SupportsKeyDescriptors
++ //¥¥ verify iterator key (change CheckKey to take btreePtr instead of keyDescPtr?)
++- if (btreePtr->keyDescPtr != nil)
+++ if (btreePtr->keyDescPtr != NULL)
++ {
++ err = CheckKey (&iterator->key, btreePtr->keyDescPtr, btreePtr->maxKeyLength );
++ M_ExitOnError (err);
++@@ -309,7 +309,7 @@ OSStatus FindIteratorPosition (BTreeControlBlockPtr btreePtr,
++ {
++ *right = *middle;
++ *middle = *left;
++- left->buffer = nil;
+++ left->buffer = NULL;
++ index = leftIndex;
++
++ goto SuccessfulExit;
++@@ -330,7 +330,7 @@ OSStatus FindIteratorPosition (BTreeControlBlockPtr btreePtr,
++ {
++ *right = *middle;
++ *middle = *left;
++- left->buffer = nil;
+++ left->buffer = NULL;
++ index = leftIndex;
++
++ goto SuccessfulExit;
++@@ -363,7 +363,7 @@ OSStatus FindIteratorPosition (BTreeControlBlockPtr btreePtr,
++ {
++ *left = *middle;
++ *middle = *right;
++- right->buffer = nil;
+++ right->buffer = NULL;
++ index = rightIndex;
++
++ goto SuccessfulExit;
++@@ -427,15 +427,15 @@ OSStatus CheckInsertParams (SFCB *filePtr,
++ {
++ BTreeControlBlockPtr btreePtr;
++
++- if (filePtr == nil) return paramErr;
+++ if (filePtr == NULL) return paramErr;
++
++ btreePtr = (BTreeControlBlockPtr) filePtr->fcbBtree;
++- if (btreePtr == nil) return fsBTInvalidFileErr;
++- if (iterator == nil) return paramErr;
++- if (record == nil) return paramErr;
+++ if (btreePtr == NULL) return fsBTInvalidFileErr;
+++ if (iterator == NULL) return paramErr;
+++ if (record == NULL) return paramErr;
++
++ #if SupportsKeyDescriptors
++- if (btreePtr->keyDescPtr != nil)
+++ if (btreePtr->keyDescPtr != NULL)
++ {
++ OSStatus err;
++
++diff --git a/fsck_hfs.tproj/dfalib/BTreeNodeOps.c b/fsck_hfs.tproj/dfalib/BTreeNodeOps.c
++index da07cc7..ef2bd7b 100644
++--- a/fsck_hfs.tproj/dfalib/BTreeNodeOps.c
+++++ b/fsck_hfs.tproj/dfalib/BTreeNodeOps.c
++@@ -105,7 +105,7 @@ Function: Gets an existing BTree node from FS Agent and verifies it.
++ Input: btreePtr - pointer to BTree control block
++ nodeNum - number of node to request
++
++-Output: nodePtr - pointer to beginning of node (nil if error)
+++Output: nodePtr - pointer to beginning of node (NULL if error)
++
++ Result:
++ noErr - success
++@@ -139,7 +139,7 @@ OSStatus GetNode (BTreeControlBlockPtr btreePtr,
++ if (err != noErr)
++ {
++ Panic ("\pGetNode: getNodeProc returned error.");
++- nodePtr->buffer = nil;
+++ nodePtr->buffer = NULL;
++ goto ErrorExit;
++ }
++ ++btreePtr->numGetNodes;
++@@ -156,8 +156,8 @@ OSStatus GetNode (BTreeControlBlockPtr btreePtr,
++ return noErr;
++
++ ErrorExit:
++- nodePtr->buffer = nil;
++- nodePtr->blockHeader = nil;
+++ nodePtr->buffer = NULL;
+++ nodePtr->blockHeader = NULL;
++
++ // LogEndTime(kTraceGetNode, err);
++
++@@ -176,7 +176,7 @@ Function: Gets a new BTree node from FS Agent and initializes it to an empty
++ Input: btreePtr - pointer to BTree control block
++ nodeNum - number of node to request
++
++-Output: returnNodePtr - pointer to beginning of node (nil if error)
+++Output: returnNodePtr - pointer to beginning of node (NULL if error)
++
++ Result: noErr - success
++ != noErr - failure
++@@ -203,7 +203,7 @@ OSStatus GetNewNode (BTreeControlBlockPtr btreePtr,
++ if (err != noErr)
++ {
++ Panic ("\pGetNewNode: getNodeProc returned error.");
++- returnNodePtr->buffer = nil;
+++ returnNodePtr->buffer = NULL;
++ return err;
++ }
++ ++btreePtr->numGetNewNodes;
++@@ -248,7 +248,7 @@ OSStatus ReleaseNode (BTreeControlBlockPtr btreePtr,
++
++ err = noErr;
++
++- if (nodePtr->buffer != nil)
+++ if (nodePtr->buffer != NULL)
++ {
++ /*
++ * The nodes must remain in the cache as big endian!
++@@ -267,8 +267,8 @@ OSStatus ReleaseNode (BTreeControlBlockPtr btreePtr,
++ ++btreePtr->numReleaseNodes;
++ }
++
++- nodePtr->buffer = nil;
++- nodePtr->blockHeader = nil;
+++ nodePtr->buffer = NULL;
+++ nodePtr->blockHeader = NULL;
++
++ // LogEndTime(kTraceReleaseNode, err);
++
++@@ -299,7 +299,7 @@ OSStatus TrashNode (BTreeControlBlockPtr btreePtr,
++
++ err = noErr;
++
++- if (nodePtr->buffer != nil)
+++ if (nodePtr->buffer != NULL)
++ {
++ releaseNodeProc = btreePtr->releaseBlockProc;
++ err = releaseNodeProc (btreePtr->fcbPtr,
++@@ -309,8 +309,8 @@ OSStatus TrashNode (BTreeControlBlockPtr btreePtr,
++ ++btreePtr->numReleaseNodes;
++ }
++
++- nodePtr->buffer = nil;
++- nodePtr->blockHeader = nil;
+++ nodePtr->buffer = NULL;
+++ nodePtr->blockHeader = NULL;
++
++ return err;
++ }
++@@ -338,7 +338,7 @@ OSStatus UpdateNode (BTreeControlBlockPtr btreePtr,
++
++ err = noErr;
++
++- if (nodePtr->buffer != nil) //¥¥ why call UpdateNode if nil ?!?
+++ if (nodePtr->buffer != NULL) //¥¥ why call UpdateNode if NULL ?!?
++ {
++ // LogStartTime(kTraceReleaseNode);
++ err = hfs_swap_BTNode(nodePtr, btreePtr->fcbPtr, kSwapBTNodeHostToBig);
++@@ -358,8 +358,8 @@ OSStatus UpdateNode (BTreeControlBlockPtr btreePtr,
++ ++btreePtr->numUpdateNodes;
++ }
++
++- nodePtr->buffer = nil;
++- nodePtr->blockHeader = nil;
+++ nodePtr->buffer = NULL;
+++ nodePtr->blockHeader = NULL;
++
++ return noErr;
++
++diff --git a/fsck_hfs.tproj/dfalib/BTreeTreeOps.c b/fsck_hfs.tproj/dfalib/BTreeTreeOps.c
++index 37fb170..73e1fda 100644
++--- a/fsck_hfs.tproj/dfalib/BTreeTreeOps.c
+++++ b/fsck_hfs.tproj/dfalib/BTreeTreeOps.c
++@@ -177,7 +177,7 @@ Output: nodeNum - number of the node containing the key position
++
++ Result: noErr - key found, index is record index
++ fsBTRecordNotFoundErr - key not found, index is insert index
++- fsBTEmptyErr - key not found, return params are nil
+++ fsBTEmptyErr - key not found, return params are NULL
++ otherwise - catastrophic failure (GetNode/ReleaseNode failed)
++ -------------------------------------------------------------------------------*/
++
++@@ -321,8 +321,8 @@ ReleaseAndExit:
++ ErrorExit:
++
++ *nodeNum = 0;
++- nodePtr->buffer = nil;
++- nodePtr->blockHeader = nil;
+++ nodePtr->buffer = NULL;
+++ nodePtr->blockHeader = NULL;
++ *returnIndex = 0;
++
++ return err;
++@@ -354,7 +354,7 @@ OSStatus InsertTree ( BTreeControlBlockPtr btreePtr,
++ primaryKey.replacingKey = replacingKey;
++ primaryKey.skipRotate = false;
++
++- err = InsertLevel (btreePtr, treePathTable, &primaryKey, nil,
+++ err = InsertLevel (btreePtr, treePathTable, &primaryKey, NULL,
++ targetNode, index, level, insertNode );
++
++ return err;
++@@ -385,7 +385,7 @@ OSStatus InsertLevel (BTreeControlBlockPtr btreePtr,
++ #if defined(applec) && !defined(__SC__)
++ PanicIf ((level == 1) && (((NodeDescPtr)targetNode->buffer)->kind != kBTLeafNode), "\P InsertLevel: non-leaf at level 1! ");
++ #endif
++- siblingNode.buffer = nil;
+++ siblingNode.buffer = NULL;
++ targetNodeNum = treePathTable [level].node;
++
++ insertParent = false;
++@@ -420,7 +420,7 @@ OSStatus InsertLevel (BTreeControlBlockPtr btreePtr,
++
++ ////// process second insert (if any) //////
++
++- if ( secondaryKey != nil )
+++ if (secondaryKey != NULL)
++ {
++ Boolean temp;
++
++@@ -446,7 +446,7 @@ OSStatus InsertLevel (BTreeControlBlockPtr btreePtr,
++ UInt8 * recPtr;
++ UInt16 recSize;
++
++- secondaryKey = nil;
+++ secondaryKey = NULL;
++
++ PanicIf ( (level == btreePtr->treeDepth), "InsertLevel: unfinished insert!?");
++
++@@ -606,9 +606,9 @@ static OSErr InsertNode (BTreeControlBlockPtr btreePtr,
++
++ if ( leftNodeNum > 0 )
++ {
++- PanicIf ( siblingNode->buffer != nil, "InsertNode: siblingNode already aquired!");
+++ PanicIf(siblingNode->buffer != NULL, "InsertNode: siblingNode already aquired!");
++
++- if ( siblingNode->buffer == nil )
+++ if (siblingNode->buffer == NULL)
++ {
++ err = GetNode (btreePtr, leftNodeNum, siblingNode); // will be released by caller or a split below
++ M_ExitOnError (err);
++@@ -703,7 +703,7 @@ OSStatus DeleteTree (BTreeControlBlockPtr btreePtr,
++
++ targetNodeNum = treePathTable[level].node;
++ targetNodePtr = targetNode->buffer;
++- PanicIf (targetNodePtr == nil, "DeleteTree: targetNode has nil buffer!");
+++ PanicIf (targetNodePtr == NULL, "DeleteTree: targetNode has NULL buffer!");
++
++ DeleteRecord (btreePtr, targetNodePtr, index);
++
++@@ -766,7 +766,7 @@ OSStatus DeleteTree (BTreeControlBlockPtr btreePtr,
++ deleteRequired = false;
++ updateRequired = false;
++
++- if ( targetNode->buffer == nil ) // then root was freed and the btree is empty
+++ if (targetNode->buffer == NULL) // then root was freed and the btree is empty
++ {
++ btreePtr->rootNode = 0;
++ btreePtr->treeDepth = 0;
++@@ -1124,7 +1124,7 @@ static OSStatus SplitLeft (BTreeControlBlockPtr btreePtr,
++ if ( (right->height == 1) && (right->kind != kBTLeafNode) )
++ return fsBTInvalidNodeErr;
++
++- if ( left != nil )
+++ if (left != NULL)
++ {
++ if ( left->fLink != rightNodeNum )
++ return fsBTInvalidNodeErr; //¥¥ E_BadSibling ?
++@@ -1145,7 +1145,7 @@ static OSStatus SplitLeft (BTreeControlBlockPtr btreePtr,
++
++ /////////////// Update Forward Link In Original Left Node ///////////////////
++
++- if ( left != nil )
+++ if (left != NULL)
++ {
++ left->fLink = newNodeNum;
++ err = UpdateNode (btreePtr, leftNode);
++@@ -1240,8 +1240,8 @@ static OSStatus AddNewRootNode (BTreeControlBlockPtr btreePtr,
++ Boolean didItFit;
++ UInt16 keyLength;
++
++- PanicIf (leftNode == nil, "AddNewRootNode: leftNode == nil");
++- PanicIf (rightNode == nil, "AddNewRootNode: rightNode == nil");
+++ PanicIf (leftNode == NULL, "AddNewRootNode: leftNode == NULL");
+++ PanicIf (rightNode == NULL, "AddNewRootNode: rightNode == NULL");
++
++
++ /////////////////////// Initialize New Root Node ////////////////////////////
++@@ -1362,7 +1362,7 @@ static OSStatus SplitRight (BTreeControlBlockPtr btreePtr,
++ if ( (leftPtr->height == 1) && (leftPtr->kind != kBTLeafNode) )
++ return fsBTInvalidNodeErr;
++
++- if ( rightPtr != nil )
+++ if (rightPtr != NULL)
++ {
++ if ( rightPtr->bLink != nodeNum )
++ return fsBTInvalidNodeErr; //¥¥ E_BadSibling ?
++@@ -1382,7 +1382,7 @@ static OSStatus SplitRight (BTreeControlBlockPtr btreePtr,
++
++ /////////////// Update backward Link In Original Right Node ///////////////////
++
++- if ( rightPtr != nil )
+++ if (rightPtr != NULL)
++ {
++ rightPtr->bLink = newNodeNum;
++ err = UpdateNode (btreePtr, rightNodePtr);
++@@ -1739,7 +1739,7 @@ static int DoKeyCheck( NodeDescPtr nodeP, BTreeControlBlock *btcb )
++ UInt16 keyLength;
++ KeyPtr keyPtr;
++ UInt8 *dataPtr;
++- KeyPtr prevkeyP = nil;
+++ KeyPtr prevkeyP = NULL;
++
++
++ if ( nodeP->numRecords == 0 )
++@@ -1766,7 +1766,7 @@ static int DoKeyCheck( NodeDescPtr nodeP, BTreeControlBlock *btcb )
++ return( -1 );
++ }
++
++- if ( prevkeyP != nil )
+++ if (prevkeyP != NULL)
++ {
++ if ( CompareKeys( (BTreeControlBlockPtr)btcb, prevkeyP, keyPtr ) >= 0 )
++ {
++diff --git a/fsck_hfs.tproj/dfalib/SControl.c b/fsck_hfs.tproj/dfalib/SControl.c
++index 8b03ece..d3145e0 100644
++--- a/fsck_hfs.tproj/dfalib/SControl.c
+++++ b/fsck_hfs.tproj/dfalib/SControl.c
++@@ -82,7 +82,7 @@ CheckHFS( int fsReadRef, int fsWriteRef, int checkLevel, int repairLevel,
++ {
++ SGlob dataArea; // Allocate the scav globals
++ short temp;
++- FileIdentifierTable *fileIdentifierTable = nil;
+++ FileIdentifierTable *fileIdentifierTable = NULL;
++ OSErr err = noErr;
++ OSErr scavError = 0;
++ int scanCount = 0;
++@@ -228,7 +228,7 @@ DoAgain:
++ }
++
++ // Set up structures for post processing
++- if ( (autoRepair == true) && (dataArea.fileIdentifierTable != nil) )
+++ if ((autoRepair == true) && (dataArea.fileIdentifierTable != NULL))
++ {
++ // *repairInfo = *repairInfo | kVolumeHadOverlappingExtents; // Report back that volume has overlapping extents
++ fileIdentifierTable = (FileIdentifierTable *) AllocateMemory( GetHandleSize( (Handle) dataArea.fileIdentifierTable ) );
++@@ -239,7 +239,7 @@ DoAgain:
++ //
++ // Post processing
++ //
++- if ( fileIdentifierTable != nil )
+++ if (fileIdentifierTable != NULL)
++ {
++ DisposeMemory( fileIdentifierTable );
++ }
++@@ -682,7 +682,7 @@ short CheckForStop( SGlob *GPtr )
++
++ //if ( ((ticks - 10) > GPtr->lastTickCount) || (dfaStage == kAboutToRepairStage) ) // To reduce cursor flicker on fast machines, call through on a timed interval
++ //{
++- if ( GPtr->userCancelProc != nil )
+++ if (GPtr->userCancelProc != NULL)
++ {
++ UInt64 progress = 0;
++ Boolean progressChanged;
++@@ -761,7 +761,7 @@ static int ScavSetUp( SGlob *GPtr)
++ short ioRefNum;
++ #endif
++
++- GPtr->MinorRepairsP = nil;
+++ GPtr->MinorRepairsP = NULL;
++
++ GPtr->itemsProcessed = 0;
++ GPtr->lastProgress = 0;
++@@ -774,7 +774,7 @@ static int ScavSetUp( SGlob *GPtr)
++ ScavStaticStructures *pointer;
++
++ pointer = (ScavStaticStructures *) AllocateClearMemory( sizeof(ScavStaticStructures) );
++- if ( pointer == nil ) {
+++ if (pointer == NULL) {
++ if ( GPtr->logLevel >= kDebugLog ) {
++ printf( "\t error %d - could not allocate %i bytes of memory \n",
++ R_NoMem, sizeof(ScavStaticStructures) );
++@@ -831,7 +831,7 @@ static int ScavSetUp( SGlob *GPtr)
++ // Save current value of vcbWrCnt, to detect modifications to volume by other apps etc
++ if ( GPtr->volumeFeatures & volumeIsMountedMask )
++ {
++- FlushVol( nil, GPtr->realVCB->vcbVRefNum ); // Ask HFS to update all changes to disk
+++ FlushVol(NULL, GPtr->realVCB->vcbVRefNum); // Ask HFS to update all changes to disk
++ GPtr->wrCnt = GPtr->realVCB->vcbWrCnt; // Remember write count after writing changes
++ }
++ #endif
++@@ -949,7 +949,7 @@ static int ScavSetUp( SGlob *GPtr)
++
++ // Keep a valid file id list for HFS volumes
++ GPtr->validFilesList = (UInt32**)NewHandle( 0 );
++- if ( GPtr->validFilesList == nil ) {
+++ if (GPtr->validFilesList == NULL) {
++ if ( GPtr->logLevel >= kDebugLog ) {
++ printf( "\t error %d - could not allocate file ID list \n", R_NoMem );
++ }
++@@ -995,17 +995,17 @@ static int ScavTerm( SGlobPtr GPtr )
++
++ (void) BitMapCheckEnd();
++
++- while( (rP = GPtr->MinorRepairsP) != nil ) // loop freeing leftover (undone) repair orders
+++ while((rP = GPtr->MinorRepairsP) != NULL) // loop freeing leftover (undone) repair orders
++ {
++ GPtr->MinorRepairsP = rP->link; // (in case repairs were not made)
++ DisposeMemory(rP);
++ err = MemError();
++ }
++
++- if( GPtr->validFilesList != nil )
+++ if (GPtr->validFilesList != NULL)
++ DisposeHandle( (Handle) GPtr->validFilesList );
++
++- if( GPtr->overlappedExtents != nil ) {
+++ if (GPtr->overlappedExtents != NULL) {
++ extentsTableH = GPtr->overlappedExtents;
++
++ /* Overlapped extents list also allocated memory for attribute name */
++@@ -1021,44 +1021,44 @@ static int ScavTerm( SGlobPtr GPtr )
++ DisposeHandle( (Handle) GPtr->overlappedExtents );
++ }
++
++- if( GPtr->fileIdentifierTable != nil )
+++ if (GPtr->fileIdentifierTable != NULL)
++ DisposeHandle( (Handle) GPtr->fileIdentifierTable );
++
++- if( GPtr->calculatedVCB == nil ) // already freed?
+++ if (GPtr->calculatedVCB == NULL) // already freed?
++ return( noErr );
++
++ // If the FCB's and BTCB's have been set up, dispose of them
++ fcbP = GPtr->calculatedExtentsFCB; // release extent file BTree bit map
++- if ( fcbP != nil )
+++ if (fcbP != NULL)
++ {
++ btcbP = (BTreeControlBlock*)fcbP->fcbBtree;
++- if ( btcbP != nil)
+++ if (btcbP != NULL)
++ {
++- if( btcbP->refCon != nil )
+++ if (btcbP->refCon != NULL)
++ {
++- if(((BTreeExtensionsRec*)btcbP->refCon)->BTCBMPtr != nil)
+++ if (((BTreeExtensionsRec*)btcbP->refCon)->BTCBMPtr != NULL)
++ {
++ DisposeMemory(((BTreeExtensionsRec*)btcbP->refCon)->BTCBMPtr);
++ err = MemError();
++ }
++ DisposeMemory( (Ptr)btcbP->refCon );
++ err = MemError();
++- btcbP->refCon = nil;
+++ btcbP->refCon = NULL;
++ }
++
++ fcbP = GPtr->calculatedCatalogFCB; // release catalog BTree bit map
++ btcbP = (BTreeControlBlock*)fcbP->fcbBtree;
++
++- if( btcbP->refCon != nil )
+++ if (btcbP->refCon != NULL)
++ {
++- if(((BTreeExtensionsRec*)btcbP->refCon)->BTCBMPtr != nil)
+++ if (((BTreeExtensionsRec*)btcbP->refCon)->BTCBMPtr != NULL)
++ {
++ DisposeMemory(((BTreeExtensionsRec*)btcbP->refCon)->BTCBMPtr);
++ err = MemError();
++ }
++ DisposeMemory( (Ptr)btcbP->refCon );
++ err = MemError();
++- btcbP->refCon = nil;
+++ btcbP->refCon = NULL;
++ }
++ }
++ }
++@@ -1066,7 +1066,7 @@ static int ScavTerm( SGlobPtr GPtr )
++ DisposeMemory( GPtr->calculatedVCB ); // Release our block of data structures
++ err = MemError();
++
++- GPtr->calculatedVCB = nil;
+++ GPtr->calculatedVCB = NULL;
++
++ return( noErr );
++ }
++@@ -1113,7 +1113,7 @@ Boolean IsBlueBoxSharedDrive ( DrvQElPtr dqPtr )
++ // Now look at the name of the Driver name. If it is .BlueBoxShared keep it out of the list of available disks.
++ driverDCtlHandle = GetDCtlEntry(dqPtr->dQRefNum);
++ driverDCtlPtr = *driverDCtlHandle;
++- if((((driverDCtlPtr->dCtlFlags) & Is_Native_Mask) == 0) && (driverDCtlPtr->dCtlDriver != nil))
+++ if((((driverDCtlPtr->dCtlFlags) & Is_Native_Mask) == 0) && (driverDCtlPtr->dCtlDriver != NULL))
++ {
++ if (((driverDCtlPtr->dCtlFlags) & Is_Ram_Based_Mask) == 0)
++ {
++@@ -1127,19 +1127,19 @@ Boolean IsBlueBoxSharedDrive ( DrvQElPtr dqPtr )
++
++ }
++ driverName = (StringPtr)&(drvrHeaderPtr->drvrName);
++- if (!(IdenticalString(driverName,blueBoxSharedDriverName,nil)))
+++ if (!(IdenticalString(driverName,blueBoxSharedDriverName,NULL)))
++ {
++ return( true );
++ }
++
++ // Special case for the ".Sony" floppy driver which might be accessed in Shared mode inside the Blue Box
++ // Test its "where" string instead of the driver name.
++- if (!(IdenticalString(driverName,sonyDriverName,nil)))
+++ if (!(IdenticalString(driverName,sonyDriverName,NULL)))
++ {
++ CntrlParam paramBlock;
++
++- paramBlock.ioCompletion = nil;
++- paramBlock.ioNamePtr = nil;
+++ paramBlock.ioCompletion = NULL;
+++ paramBlock.ioNamePtr = NULL;
++ paramBlock.ioVRefNum = dqPtr->dQDrive;
++ paramBlock.ioCRefNum = dqPtr->dQRefNum;
++ paramBlock.csCode = kDriveIcon; // return physical icon
++@@ -1152,7 +1152,7 @@ Boolean IsBlueBoxSharedDrive ( DrvQElPtr dqPtr )
++
++ iconAndStringRecPtr = * (IconAndStringRecPtr*) & paramBlock.csParam;
++ whereStringPtr = (StringPtr) & iconAndStringRecPtr->string;
++- if (!(IdenticalString(whereStringPtr,blueBoxFloppyWhereString,nil)))
+++ if (!(IdenticalString(whereStringPtr,blueBoxFloppyWhereString,NULL)))
++ {
++ return( true );
++ }
++diff --git a/fsck_hfs.tproj/dfalib/SRepair.c b/fsck_hfs.tproj/dfalib/SRepair.c
++index 89c12d6..b261c37 100644
++--- a/fsck_hfs.tproj/dfalib/SRepair.c
+++++ b/fsck_hfs.tproj/dfalib/SRepair.c
++@@ -844,7 +844,7 @@ static int DelFThd( SGlobPtr GPtr, UInt32 fid ) // the file ID
++
++ isHFSPlus = VolumeObjectIsHFSPlus( );
++
++- BuildCatalogKey( fid, (const CatalogName*) nil, isHFSPlus, &key );
+++ BuildCatalogKey(fid, NULL, isHFSPlus, &key);
++ result = SearchBTreeRecord( GPtr->calculatedCatalogFCB, &key, kNoHint, &foundKey, &record, &recSize, &hint );
++
++ if ( result ) return ( IntError( GPtr, result ) );
++@@ -910,7 +910,7 @@ static OSErr FixDirThread( SGlobPtr GPtr, UInt32 did ) // the dir ID
++
++ isHFSPlus = VolumeObjectIsHFSPlus( );
++
++- BuildCatalogKey( did, (const CatalogName*) nil, isHFSPlus, &key );
+++ BuildCatalogKey(did, NULL, isHFSPlus, &key);
++ result = SearchBTreeRecord( GPtr->calculatedCatalogFCB, &key, kNoHint, &foundKey, &record, &recSize, &hint );
++
++ if ( result )
++@@ -2171,7 +2171,7 @@ static OSErr FixOrphanedFiles ( SGlobPtr GPtr )
++ }
++
++ //-- Build the key for the file thread
++- BuildCatalogKey( cNodeID, nil, isHFSPlus, &key );
+++ BuildCatalogKey(cNodeID, NULL, isHFSPlus, &key);
++
++ err = SearchBTreeRecord( GPtr->calculatedCatalogFCB, &key, kNoHint,
++ &tempKey, &threadRecord, &recordSize, &hint2 );
++diff --git a/fsck_hfs.tproj/dfalib/SUtils.c b/fsck_hfs.tproj/dfalib/SUtils.c
++index 6e9253e..491afbf 100644
++--- a/fsck_hfs.tproj/dfalib/SUtils.c
+++++ b/fsck_hfs.tproj/dfalib/SUtils.c
++@@ -395,11 +395,11 @@ OSErr GetVolumeFeatures( SGlobPtr GPtr )
++ err = GetVCBDriveNum( &GPtr->realVCB, GPtr->DrvNum );
++ ReturnIfError( err );
++
++- if ( GPtr->realVCB != nil )
+++ if (GPtr->realVCB != NULL)
++ {
++ GPtr->volumeFeatures |= volumeIsMountedMask;
++
++- pb.ioParam.ioNamePtr = nil;
+++ pb.ioParam.ioNamePtr = NULL;
++ pb.ioParam.ioVRefNum = GPtr->realVCB->vcbVRefNum;
++ pb.ioParam.ioBuffer = (Ptr) &buffer;
++ pb.ioParam.ioReqCount = sizeof( buffer );
++@@ -2282,7 +2282,7 @@ void print_prime_buckets(PrimeBuckets *cur);
++ * 4. btreetye - can be kHFSPlusCatalogRecord or kHFSPlusAttributeRecord
++ * indicates which btree prime number bucket should be incremented
++ *
++- * Output: nil
+++ * Output: NULL
++ */
++ void RecordXAttrBits(SGlobPtr GPtr, UInt16 flags, HFSCatalogNodeID fileid, UInt16 btreetype)
++ {
++diff --git a/fsck_hfs.tproj/dfalib/SVerify1.c b/fsck_hfs.tproj/dfalib/SVerify1.c
++index 39bda5c..c33155f 100644
++--- a/fsck_hfs.tproj/dfalib/SVerify1.c
+++++ b/fsck_hfs.tproj/dfalib/SVerify1.c
++@@ -790,13 +790,13 @@ OSErr CreateExtentsBTreeControlBlock( SGlobPtr GPtr )
++ // set up our DFA extended BTCB area. Will we have enough memory on all HFS+ volumes.
++ //
++ btcb->refCon = AllocateClearMemory( sizeof(BTreeExtensionsRec) ); // allocate space for our BTCB extensions
++- if ( btcb->refCon == nil ) {
+++ if (btcb->refCon == NULL) {
++ err = R_NoMem;
++ goto exit;
++ }
++ size = (btcb->totalNodes + 7) / 8; // size of BTree bit map
++ ((BTreeExtensionsRec*)btcb->refCon)->BTCBMPtr = AllocateClearMemory(size); // get precleared bitmap
++- if ( ((BTreeExtensionsRec*)btcb->refCon)->BTCBMPtr == nil )
+++ if (((BTreeExtensionsRec*)btcb->refCon)->BTCBMPtr == NULL)
++ {
++ err = R_NoMem;
++ goto exit;
++@@ -1145,13 +1145,13 @@ OSErr CreateCatalogBTreeControlBlock( SGlobPtr GPtr )
++ //
++
++ btcb->refCon = AllocateClearMemory( sizeof(BTreeExtensionsRec) ); // allocate space for our BTCB extensions
++- if ( btcb->refCon == nil ) {
+++ if (btcb->refCon == NULL) {
++ err = R_NoMem;
++ goto exit;
++ }
++ size = (btcb->totalNodes + 7) / 8; // size of BTree bit map
++ ((BTreeExtensionsRec*)btcb->refCon)->BTCBMPtr = AllocateClearMemory(size); // get precleared bitmap
++- if ( ((BTreeExtensionsRec*)btcb->refCon)->BTCBMPtr == nil )
+++ if (((BTreeExtensionsRec*)btcb->refCon)->BTCBMPtr == NULL)
++ {
++ err = R_NoMem;
++ goto exit;
++@@ -1339,7 +1339,7 @@ OSErr CatHChk( SGlobPtr GPtr )
++
++ //¥¥ Can we ignore this part by just taking advantage of setting the selCode = 0x8001;
++ {
++- BuildCatalogKey( 1, (const CatalogName *)nil, isHFSPlus, &key );
+++ BuildCatalogKey(1, NULL, isHFSPlus, &key);
++ result = SearchBTreeRecord( GPtr->calculatedCatalogFCB, &key, kNoHint, &foundKey, &threadRecord, &recSize, &hint );
++
++ GPtr->TarBlock = hint; /* set target block */
++@@ -1443,7 +1443,7 @@ OSErr CatHChk( SGlobPtr GPtr )
++ /*
++ * Find thread record
++ */
++- BuildCatalogKey( dprP->directoryID, (const CatalogName *) nil, isHFSPlus, &key );
+++ BuildCatalogKey(dprP->directoryID, NULL, isHFSPlus, &key);
++ result = SearchBTreeRecord( GPtr->calculatedCatalogFCB, &key, kNoHint, &foundKey, &threadRecord, &recSize, &hint );
++ if ( result != noErr ) {
++ char idStr[16];
++@@ -1780,26 +1780,26 @@ OSErr CreateAttributesBTreeControlBlock( SGlobPtr GPtr )
++ // set up our DFA extended BTCB area. Will we have enough memory on all HFS+ volumes.
++ //
++ btcb->refCon = AllocateClearMemory( sizeof(BTreeExtensionsRec) ); // allocate space for our BTCB extensions
++- if ( btcb->refCon == nil ) {
+++ if (btcb->refCon == NULL) {
++ err = R_NoMem;
++ goto exit;
++ }
++
++ if (btcb->totalNodes == 0)
++ {
++- ((BTreeExtensionsRec*)btcb->refCon)->BTCBMPtr = nil;
+++ ((BTreeExtensionsRec*)btcb->refCon)->BTCBMPtr = NULL;
++ ((BTreeExtensionsRec*)btcb->refCon)->BTCBMSize = 0;
++ ((BTreeExtensionsRec*)btcb->refCon)->realFreeNodeCount = 0;
++ }
++ else
++ {
++- if ( btcb->refCon == nil ) {
+++ if (btcb->refCon == NULL) {
++ err = R_NoMem;
++ goto exit;
++ }
++ size = (btcb->totalNodes + 7) / 8; // size of BTree bit map
++ ((BTreeExtensionsRec*)btcb->refCon)->BTCBMPtr = AllocateClearMemory(size); // get precleared bitmap
++- if ( ((BTreeExtensionsRec*)btcb->refCon)->BTCBMPtr == nil )
+++ if (((BTreeExtensionsRec*)btcb->refCon)->BTCBMPtr == NULL)
++ {
++ err = R_NoMem;
++ goto exit;
++@@ -2358,7 +2358,7 @@ static OSErr RcdMDBEmbededVolDescriptionErr( SGlobPtr GPtr, OSErr type, HFSMaste
++ RcdError( GPtr, type ); // first, record the error
++
++ p = AllocMinorRepairOrder( GPtr, sizeof(EmbededVolDescription) ); // get the node
++- if ( p == nil ) return( R_NoMem );
+++ if (p == NULL) return( R_NoMem );
++
++ p->type = type; // save error info
++ desc = (EmbededVolDescription *) &(p->name);
++@@ -2397,7 +2397,7 @@ static OSErr RcdInvalidWrapperExtents( SGlobPtr GPtr, OSErr type )
++ RcdError( GPtr, type ); // first, record the error
++
++ p = AllocMinorRepairOrder( GPtr, 0 ); // get the node
++- if ( p == nil ) return( R_NoMem );
+++ if (p == NULL) return( R_NoMem );
++
++ p->type = type; // save error info
++
++@@ -3029,7 +3029,7 @@ OSErr CheckFileExtents( SGlobPtr GPtr, UInt32 fileNumber, UInt8 forkType,
++ foundBadExtent = false;
++ lastExtentIndex = GPtr->numExtents;
++
++- while ( (extents != nil) && (err == noErr) )
+++ while ((extents != NULL) && (err == noErr))
++ {
++ // checkout the extent record first
++ err = ChkExtRec( GPtr, extents, &lastExtentIndex );
++@@ -3105,7 +3105,7 @@ OSErr CheckFileExtents( SGlobPtr GPtr, UInt32 fileNumber, UInt8 forkType,
++ if ( err == btNotFound )
++ {
++ err = noErr; // no more extent records
++- extents = nil;
+++ extents = NULL;
++ break;
++ }
++ else if ( err != noErr )
++@@ -3121,7 +3121,7 @@ OSErr CheckFileExtents( SGlobPtr GPtr, UInt32 fileNumber, UInt8 forkType,
++ if ( err == btNotFound )
++ {
++ err = noErr; // no more extent records
++- extents = nil;
+++ extents = NULL;
++ break;
++ }
++ else if ( err != noErr )
++@@ -3205,7 +3205,7 @@ static OSErr AddExtentToOverlapList( SGlobPtr GPtr, HFSCatalogNodeID fileNumber,
++ }
++
++ // If it's uninitialized
++- if ( GPtr->overlappedExtents == nil )
+++ if (GPtr->overlappedExtents == NULL)
++ {
++ GPtr->overlappedExtents = (ExtentsTable **) NewHandleClear( sizeof(ExtentsTable) );
++ extentsTableH = GPtr->overlappedExtents;
++diff --git a/fsck_hfs.tproj/dfalib/SVerify2.c b/fsck_hfs.tproj/dfalib/SVerify2.c
++index c68f3d8..da1a982 100644
++--- a/fsck_hfs.tproj/dfalib/SVerify2.c
+++++ b/fsck_hfs.tproj/dfalib/SVerify2.c
++@@ -1013,7 +1013,7 @@ static int BTKeyChk( SGlobPtr GPtr, NodeDescPtr nodeP, BTreeControlBlock *btcb )
++ UInt16 keyLength;
++ KeyPtr keyPtr;
++ UInt8 *dataPtr;
++- KeyPtr prevkeyP = nil;
+++ KeyPtr prevkeyP = NULL;
++
++
++ if ( nodeP->numRecords == 0 )
++@@ -1044,7 +1044,7 @@ static int BTKeyChk( SGlobPtr GPtr, NodeDescPtr nodeP, BTreeControlBlock *btcb )
++ return( E_KeyLen );
++ }
++
++- if ( prevkeyP != nil )
+++ if (prevkeyP != NULL)
++ {
++ if ( CompareKeys( (BTreeControlBlockPtr)btcb, prevkeyP, keyPtr ) >= 0 )
++ {
+diff --git a/feeds/packages/utils/hfsprogs/patches/0011-Fix-types.patch b/feeds/packages/utils/hfsprogs/patches/0011-Fix-types.patch
+new file mode 100644
+index 0000000..88c049f
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0011-Fix-types.patch
+@@ -0,0 +1,71 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 24 Oct 2013 01:11:22 -0200
++Subject: Fix types
++
++---
++ fsck_hfs.tproj/cache.c | 30 ++++++++++++++++--------------
++ 1 file changed, 16 insertions(+), 14 deletions(-)
++
++diff --git a/fsck_hfs.tproj/cache.c b/fsck_hfs.tproj/cache.c
++index 527088a..540fa0b 100644
++--- a/fsck_hfs.tproj/cache.c
+++++ b/fsck_hfs.tproj/cache.c
++@@ -961,20 +961,21 @@ int CacheLookup (Cache_t *cache, uint64_t off, Tag_t **tag)
++ */
++ int CacheRawRead (Cache_t *cache, uint64_t off, uint32_t len, void *buf)
++ {
++- uint64_t result;
+++ off_t result1;
+++ ssize_t result2;
++
++ /* Both offset and length must be multiples of the device block size */
++ if (off % cache->DevBlockSize) return (EINVAL);
++ if (len % cache->DevBlockSize) return (EINVAL);
++
++ /* Seek to the position */
++- result = lseek (cache->FD_R, off, SEEK_SET);
++- if (result < 0) return (errno);
++- if (result != off) return (ENXIO);
+++ result1 = lseek(cache->FD_R, off, SEEK_SET);
+++ if (result1 < 0) return (errno);
+++ if (result1 != off) return (ENXIO);
++ /* Read into the buffer */
++- result = read (cache->FD_R, buf, len);
++- if (result < 0) return (errno);
++- if (result == 0) return (ENXIO);
+++ result2 = read(cache->FD_R, buf, len);
+++ if (result2 < 0) return (errno);
+++ if (result2 == 0) return (ENXIO);
++
++ /* Update counters */
++ cache->DiskRead++;
++@@ -989,21 +990,22 @@ int CacheRawRead (Cache_t *cache, uint64_t off, uint32_t len, void *buf)
++ */
++ int CacheRawWrite (Cache_t *cache, uint64_t off, uint32_t len, void *buf)
++ {
++- uint64_t result;
+++ off_t result1;
+++ ssize_t result2;
++
++ /* Both offset and length must be multiples of the device block size */
++ if (off % cache->DevBlockSize) return (EINVAL);
++ if (len % cache->DevBlockSize) return (EINVAL);
++
++ /* Seek to the position */
++- result = lseek (cache->FD_W, off, SEEK_SET);
++- if (result < 0) return (errno);
++- if (result != off) return (ENXIO);
+++ result1 = lseek (cache->FD_W, off, SEEK_SET);
+++ if (result1 < 0) return (errno);
+++ if (result1 != off) return (ENXIO);
++
++ /* Write into the buffer */
++- result = write (cache->FD_W, buf, len);
++- if (result < 0) return (errno);
++- if (result == 0) return (ENXIO);
+++ result2 = write (cache->FD_W, buf, len);
+++ if (result2 < 0) return (errno);
+++ if (result2 == 0) return (ENXIO);
++
++ /* Update counters */
++ cache->DiskWrite++;
+diff --git a/feeds/packages/utils/hfsprogs/patches/0012-Fix-mkfs-not-creating-UUIDs-for-new-filesystems.patch b/feeds/packages/utils/hfsprogs/patches/0012-Fix-mkfs-not-creating-UUIDs-for-new-filesystems.patch
+new file mode 100644
+index 0000000..883a7b7
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0012-Fix-mkfs-not-creating-UUIDs-for-new-filesystems.patch
+@@ -0,0 +1,50 @@
++From: Matthew Garrett <mjg59@codon.org.uk>
++Date: Thu, 24 Oct 2013 01:11:22 -0200
++Subject: Fix mkfs not creating UUIDs for new filesystems.
++MIME-Version: 1.0
++Content-Type: text/plain; charset=UTF-8
++Content-Transfer-Encoding: 8bit
++
++Fix mkfs not creating UUIDs for new filesystems.
++
++Thanks to Lars Noodén for reporting the bug at
++ <https://bugs.launchpad.net/bugs/737002>.
++
++This closes LP: #737002.
++---
++ include/missing.h | 8 +++++++-
++ 1 file changed, 7 insertions(+), 1 deletion(-)
++
++diff --git a/include/missing.h b/include/missing.h
++index 0a859c4..f50e8fb 100644
++--- a/include/missing.h
+++++ b/include/missing.h
++@@ -72,7 +72,7 @@
++ #define NAME_MAX 255
++
++ /* Byteswap stuff */
++-#define NXSwapHostLongToBig(x) cpu_to_be64(x)
+++#define NXSwapHostLongToBig(x) cpu_to_be32(x)
++ #define NXSwapBigShortToHost(x) be16_to_cpu(x)
++ #define OSSwapBigToHostInt16(x) be16_to_cpu(x)
++ #define NXSwapBigLongToHost(x) be32_to_cpu(x)
++@@ -88,6 +88,9 @@
++ #ifndef be32_to_cpu
++ #define be32_to_cpu(x) bswap_32(x)
++ #endif
+++#ifndef cpu_to_be32
+++#define cpu_to_be32(x) bswap_32(x)
+++#endif
++ #ifndef be64_to_cpu
++ #define be64_to_cpu(x) bswap_64(x)
++ #endif
++@@ -102,6 +105,9 @@
++ #ifndef be32_to_cpu
++ #define be32_to_cpu(x) (x)
++ #endif
+++#ifndef cpu_to_be32
+++#define cpu_to_be32(x) (x)
+++#endif
++ #ifndef be64_to_cpu
++ #define be64_to_cpu(x) (x)
++ #endif
+diff --git a/feeds/packages/utils/hfsprogs/patches/0013-Fix-manpages.patch b/feeds/packages/utils/hfsprogs/patches/0013-Fix-manpages.patch
+new file mode 100644
+index 0000000..d78083b
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0013-Fix-manpages.patch
+@@ -0,0 +1,157 @@
++From: =?UTF-8?q?Rog=C3=A9rio=20Theodoro=20de=20Brito?= <rbrito@ime.usp.br>
++Date: Thu, 25 Nov 2010 00:00:00 -0200
++Subject: Fix manpages
++MIME-Version: 1.0
++Content-Type: text/plain; charset=UTF-8
++Content-Transfer-Encoding: 8bit
++
++Remove typos, references in the "See also" sections of the manpages to
++commands that are not available in Debian systems (and, quite probably,
++other systems too) and non-Linux specific comments.
++
++Authored also by Christoph Hellwig <hch@lst.de> and "A. Costa" <agcosta@gis.net>
++
++Bug-Debian: http://bugs.debian.org/598714
++Bug-Debian: http://bugs.debian.org/575201
++Forwarded: no
++Reviewed-by: Rogério Theodoro de Brito <rbrito@ime.usp.br>
++---
++ fsck_hfs.tproj/fsck_hfs.8 | 18 +++++++-----------
++ newfs_hfs.tproj/newfs_hfs.8 | 23 ++++++++---------------
++ 2 files changed, 15 insertions(+), 26 deletions(-)
++
++diff --git a/fsck_hfs.tproj/fsck_hfs.8 b/fsck_hfs.tproj/fsck_hfs.8
++index aec9949..0bc804d 100644
++--- a/fsck_hfs.tproj/fsck_hfs.8
+++++ b/fsck_hfs.tproj/fsck_hfs.8
++@@ -19,18 +19,18 @@
++ .Dt FSCK_HFS 8
++ .Os "Mac OS X"
++ .Sh NAME
++-.Nm fsck_hfs
+++.Nm fsck.hfs
++ .Nd HFS file system consistency check
++ .Sh SYNOPSIS
++-.Nm fsck_hfs
+++.Nm fsck.hfs
++ .Fl q
++ .Op Fl df
++ .Ar special ...
++-.Nm fsck_hfs
+++.Nm fsck.hfs
++ .Fl p
++ .Op Fl df
++ .Ar special ...
++-.Nm fsck_hfs
+++.Nm fsck.hfs
++ .Op Fl n | y | r
++ .Op Fl dfgl
++ .Op Fl m Ar mode
++@@ -52,9 +52,7 @@ The second form of
++ preens the specified file systems.
++ It is normally started by
++ .Xr fsck 8
++-run from
++-.Pa /etc/rc.boot
++-during automatic reboot, when a HFS file system is detected.
+++during systen boot, when a HFS file system is detected.
++ When preening file systems,
++ .Nm
++ will fix common inconsistencies for file systems that were not
++@@ -105,9 +103,9 @@ to check and repair journaled HFS+ file systems.
++ .It Fl g
++ Causes
++ .Nm
++-to generate it's output strings in GUI format.
+++to generate its output strings in GUI format.
++ This option is used when another application with a graphical user interface
++-(like Mac OS X Disk Utility) is envoking the
+++(like Mac OS X Disk Utility) is invoking the
++ .Nm
++ tool.
++ .It Fl l
++@@ -144,8 +142,6 @@ specified file system for a new catalog file and if there is no damage
++ to the leaf nodes in the existing catalog file.
++ .El
++ .Pp
++-Because of inconsistencies between the block device and the buffer cache,
++-the raw device should always be used.
++ .Sh SEE ALSO
++ .Xr fsck 8
++ .Sh BUGS
++diff --git a/newfs_hfs.tproj/newfs_hfs.8 b/newfs_hfs.tproj/newfs_hfs.8
++index d002cc9..fe91962 100644
++--- a/newfs_hfs.tproj/newfs_hfs.8
+++++ b/newfs_hfs.tproj/newfs_hfs.8
++@@ -19,10 +19,10 @@
++ .Dt NEWFS_HFS 8
++ .Os "Mac OS X"
++ .Sh NAME
++-.Nm newfs_hfs
+++.Nm mkfs.hfs
++ .Nd construct a new HFS Plus file system
++ .Sh SYNOPSIS
++-.Nm newfs_hfs
+++.Nm mkfs.hfs
++ .Op Fl N Ar [partition-size]
++ .Op Fl U Ar uid
++ .Op Fl G Ar gid
++@@ -37,19 +37,13 @@
++ .Op Fl v Ar volume-name
++ .Ar special
++ .Sh DESCRIPTION
++-.Nm Newfs_hfs
+++.Nm mkfs.hfs
++ builds an HFS Plus file system on the specified special device.
++-Before running
++-.Nm newfs_hfs
++-the disk should be partitioned using the
++-.Em Disk Utility
++-application or
++-.Xr pdisk 8 .
++ .Pp
++ The file system default parameters are calculated based on
++ the size of the disk partition. Typically the defaults are
++ reasonable, however
++-.Nm newfs_hfs
+++.Nm mkfs.hfs
++ has several options to allow the defaults to be selectively overridden.
++ The options are as follows:
++ .Bl -tag -width Fl
++@@ -66,7 +60,7 @@ Set the group of the file system's root directory to
++ Specify the access permissions mask for the file system's root directory.
++ .It Fl h
++ Creates a legacy HFS format filesystem. This option
++-is not recomended for file systems that will be
+++is not recommended for file systems that will be
++ primarily used with Mac OS X or Darwin.
++ .It Fl s
++ Creates a case-sensitive HFS Plus filesystem. By
++@@ -93,7 +87,7 @@ sizes are specified with the
++ option followed by a comma
++ separated list of the form arg=blocks.
++ .Pp
++-Example: -c c=5000,e=500
+++Example: \-c c=5000,e=500
++ .Bl -tag -width Fl
++ .It Em a=blocks
++ Set the attribute file clump size.
++@@ -126,7 +120,7 @@ the form arg=bytes. The
++ size must be a power of two and no larger than
++ 32768 bytes.
++ .Pp
++-Example: -n c=8192,e=4096
+++Example: \-n c=8192,e=4096
++ .Bl -tag -width Fl
++ .It Em a=bytes
++ Set the attribute b-tree node size.
++@@ -139,8 +133,7 @@ Set the extent overflow b-tree node size.
++ Volume name (file system name) in ascii or UTF-8 format.
++ .El
++ .Sh SEE ALSO
++-.Xr mount 8 ,
++-.Xr pdisk 8
+++.Xr mount 8
++ .Sh HISTORY
++ The
++ .Nm
+diff --git a/feeds/packages/utils/hfsprogs/patches/0014-uClibc_no_loadavg.patch b/feeds/packages/utils/hfsprogs/patches/0014-uClibc_no_loadavg.patch
+new file mode 100644
+index 0000000..48649ba
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0014-uClibc_no_loadavg.patch
+@@ -0,0 +1,15 @@
++--- diskdev_cmds-332.25/newfs_hfs.tproj/makehfs.c 2015-03-27 21:58:04.163171675 -0700
+++++ hfsprogs-332.25/newfs_hfs.tproj/makehfs.c 2015-03-27 21:56:03.687175020 -0700
++@@ -2119,10 +2119,12 @@
++ sysctl(mib, 2, sysctlstring, &datalen, NULL, 0);
++ SHA1_Update(&context, sysctlstring, datalen);
++ #endif
+++#ifndef __UCLIBC__
++ /* The system's load average: */
++ datalen = sizeof(sysloadavg);
++ getloadavg(sysloadavg, 3);
++ SHA1_Update(&context, &sysloadavg, datalen);
+++#endif
++
++ /* The system's VM statistics: */
++ #if !LINUX
+diff --git a/feeds/packages/utils/hfsprogs/patches/0015-sysctl-only-on-glibc.patch b/feeds/packages/utils/hfsprogs/patches/0015-sysctl-only-on-glibc.patch
+new file mode 100644
+index 0000000..b71290f
+--- /dev/null
++++ b/feeds/packages/utils/hfsprogs/patches/0015-sysctl-only-on-glibc.patch
+@@ -0,0 +1,91 @@
++--- a/newfs_hfs.tproj/makehfs.c
+++++ b/newfs_hfs.tproj/makehfs.c
++@@ -37,7 +37,9 @@
++ #endif
++ #include <sys/errno.h>
++ #include <sys/stat.h>
+++#ifdef __GLIBC__
++ #include <sys/sysctl.h>
+++#endif
++ #if !LINUX
++ #include <sys/vmmeter.h>
++ #endif
++@@ -2039,6 +2041,7 @@ getencodinghint(unsigned char *name)
++ if (getvfsbyname("hfs", &vfc) < 0)
++ goto error;
++
+++#ifdef __GLIBC__
++ mib[0] = CTL_VFS;
++ mib[1] = vfc.vfc_typenum;
++ mib[2] = HFS_ENCODINGHINT;
++@@ -2046,6 +2049,7 @@ getencodinghint(unsigned char *name)
++ if (sysctl(mib, 3, &hint, &buflen, name, strlen((char *)name) + 1) < 0)
++ goto error;
++ return (hint);
+++#endif
++ error:
++ hint = GetDefaultEncoding();
++ return (0);
++@@ -2062,7 +2066,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
++ clock_t uptime;
++ size_t datalen;
++ double sysloadavg[3];
++-#if !LINUX
+++#if !LINUX && defined(__GLIBC__)
++ int sysdata;
++ int mib[2];
++ char sysctlstring[128];
++@@ -2080,7 +2084,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
++ SHA1_Update(&context, &uptime, sizeof(uptime));
++
++ /* The kernel's boot time: */
++-#if !LINUX
+++#if !LINUX && defined(__GLIBC__)
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_BOOTTIME;
++ datalen = sizeof(sysdata);
++@@ -2088,7 +2092,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
++ SHA1_Update(&context, &sysdata, datalen);
++ #endif
++ /* The system's host id: */
++-#if !LINUX
+++#if !LINUX && defined(__GLIBC__)
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_HOSTID;
++ datalen = sizeof(sysdata);
++@@ -2096,7 +2100,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
++ SHA1_Update(&context, &sysdata, datalen);
++ #endif
++ /* The system's host name: */
++-#if !LINUX
+++#if !LINUX && defined(__GLIBC__)
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_HOSTNAME;
++ datalen = sizeof(sysctlstring);
++@@ -2104,7 +2108,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
++ SHA1_Update(&context, sysctlstring, datalen);
++ #endif
++ /* The running kernel's OS release string: */
++-#if !LINUX
+++#if !LINUX && defined(__GLIBC__)
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_OSRELEASE;
++ datalen = sizeof(sysctlstring);
++@@ -2112,7 +2116,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
++ SHA1_Update(&context, sysctlstring, datalen);
++ #endif
++ /* The running kernel's version string: */
++-#if !LINUX
+++#if !LINUX && defined(__GLIBC__)
++ mib[0] = CTL_KERN;
++ mib[1] = KERN_VERSION;
++ datalen = sizeof(sysctlstring);
++@@ -2127,7 +2131,7 @@ void GenerateVolumeUUID(VolumeUUID *newV
++ #endif
++
++ /* The system's VM statistics: */
++-#if !LINUX
+++#if !LINUX && defined(__GLIBC__)
++ mib[0] = CTL_VM;
++ mib[1] = VM_METER;
++ datalen = sizeof(sysvmtotal);
+diff --git a/feeds/packages/utils/hub-ctrl/Makefile b/feeds/packages/utils/hub-ctrl/Makefile
+new file mode 100644
+index 0000000..48cca4d
+--- /dev/null
++++ b/feeds/packages/utils/hub-ctrl/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=hub-ctrl
++PKG_VERSION:=1.0
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/codazoda/hub-ctrl.c.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=3eef0240fac90067d081551e9f73dfa741d94a9e
++PKG_LICENSE:=GPL-2.0+
++
++PKG_MAINTAINER:=Simon Peter <probono@puredarwin.org>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/hub-ctrl
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Control USB power on a port by port basis
++ URL:=https://github.com/codazoda/hub-ctrl.c
++ DEPENDS:=+libusb-compat
++endef
++
++define Package/hub-ctrl/description
++ Control USB power on a port by port basis on some USB hubs.
++ This only works on USB hubs that have the hardware necessary
++ to allow software controlled power switching.
++ Most hubs DO NOT include the hardware.
++endef
++
++define Build/Compile
++ $(TARGET_CC) $(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include \
++ -L$(STAGING_DIR)/usr/lib -lusb \
++ -o $(PKG_BUILD_DIR)/hub-ctrl $(PKG_BUILD_DIR)/hub-ctrl.c
++endef
++
++define Package/hub-ctrl/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/hub-ctrl $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,hub-ctrl))
+diff --git a/feeds/packages/utils/i2c-tools/Makefile b/feeds/packages/utils/i2c-tools/Makefile
+new file mode 100644
+index 0000000..d77dbd5
+--- /dev/null
++++ b/feeds/packages/utils/i2c-tools/Makefile
+@@ -0,0 +1,93 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=i2c-tools
++PKG_VERSION:=3.1.2
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://dl.lm-sensors.org/i2c-tools/releases/
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_MD5SUM:=7104a1043d11a5e2c7b131614eb1b962
++
++PKG_BUILD_PARALLEL:=1
++PKG_BUILD_DEPENDS:=PACKAGE_python-smbus:python
++
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++$(call include_mk, python-package.mk)
++
++define Package/i2c/Default
++ URL:=http://lm-sensors.org/wiki/I2CTools
++ TITLE:=I2C
++endef
++
++define Package/i2c-tools
++ $(call Package/i2c/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+=tools for Linux
++endef
++
++define Package/python-smbus
++ $(call Package/i2c/Default)
++ SUBMENU:=Python
++ SECTION:=lang
++ CATEGORY:=Languages
++ TITLE:=Python bindings for the SMBUS
++ DEPENDS:=+python-light
++endef
++
++define Package/i2c-tools/description
++ This package contains an heterogeneous set of I2C tools for Linux. These tools
++ were originally part of the lm-sensors package.
++endef
++
++define Package/python-smbus/description
++ This package contain the python bindings for Linux SMBus access through i2c-dev.
++endef
++
++TARGET_CPPFLAGS += -I$(PKG_BUILD_DIR)/include
++
++ifdef CONFIG_PACKAGE_python-smbus
++ define Build/Compile/python-smbus
++ $(if $(Build/Compile/PyMod),,@echo Python packaging code not found.; false)
++ $(call Build/Compile/PyMod,./py-smbus/, \
++ install --prefix="$(PKG_INSTALL_DIR)/usr", \
++ )
++ endef
++endif
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ LINUX="$(LINUX_DIR)" \
++ CC="$(TARGET_CC)" \
++ STAGING_DIR="$(STAGING_DIR)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ CFLAGS="$(TARGET_CFLAGS)"
++ $(Build/Compile/python-smbus)
++endef
++
++define Package/i2c-tools/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/i2cdetect $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/i2cdump $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/i2cset $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/i2cget $(1)/usr/sbin/
++endef
++
++define PyPackage/python-smbus/filespec
+++|$(PYTHON_PKG_DIR)/smbus.so
++endef
++
++$(eval $(call BuildPackage,i2c-tools))
++$(eval $(call PyPackage,python-smbus))
++$(eval $(call BuildPackage,python-smbus))
+diff --git a/feeds/packages/utils/joe/Makefile b/feeds/packages/utils/joe/Makefile
+new file mode 100644
+index 0000000..fb02cab
+--- /dev/null
++++ b/feeds/packages/utils/joe/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++# changes by David Kuehling <dvdkhlng TA gmx TOD de>:
++#
++# - include support for all emulation modes jmacs jpico etc.
++# - see patches/002-builtinrc.patch
++#
++# changes by Vitaly Prosko <villy TA sft TOD ru>:
++#
++# - updated for new build system rules
++# - added static joerc config - no more defaults for native mode
++# - got maintenance role
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=joe
++PKG_VERSION:=4.1
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=@SF/joe-editor
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=b8c9ab4295e3208ddbbaa9c1141564f9
++PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_MAINTAINER:=Vitaly Protsko <villy@sft.ru>
++PKG_LICENCE:=GPL-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/joe
++ SECTION:=utils
++ CATEGORY:=Utilities
++ SUBMENU:=Editors
++ TITLE:=JOE - Joes own editor
++ URL:=http://sourceforge.net/projects/joe-editor/
++ DEPENDS:=+libncurses
++endef
++
++define Package/joe/description
++Joe is world-famous Wordstar like text editor, that also features
++Emacs and Pico emulation
++endef
++
++define Package/joe/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/joe/joe $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/joe
++ $(INSTALL_CONF) ./files/joerc $(1)/etc/joe/joerc
++endef
++
++define Package/joe/conffiles
++/etc/joe/joerc
++endef
++
++$(eval $(call BuildPackage,joe))
+diff --git a/feeds/packages/utils/joe/files/joerc b/feeds/packages/utils/joe/files/joerc
+new file mode 100644
+index 0000000..2c42bee
+--- /dev/null
++++ b/feeds/packages/utils/joe/files/joerc
+@@ -0,0 +1,649 @@
++
++-asis
++-nobackups
++-nonotice
++-noxon
++-notite
++-assume_color
++-assume_256color
++-guess_non_utf8
++-guess_crlf
++-guess_indent
++-menu_above
++-transpose
++-joe_state
++-restore
++-mouse
++-joexterm
++-search_prompting
++-lmsg \i%k%T%W%I%X %n %m%y%R %M %x
++-rmsg %S Row %r Col %c %t Ctrl-K H for help
++-highlight
++-istep 2
++
++ :include ftyperc
++
++:defmenu root
++mode,"overwrite",rtn T Overtype %Zoverwrite%
++mode,"hex",rtn % % Hex edit mode
++mode,"autoindent",rtn I Autoindent %Zautoindent%
++mode,"wordwrap",rtn W Word wrap %Zwordwrap%
++mode,"tab",rtn D Tab width %Ztab%
++mode,"lmargin",rtn L Left margin %Zlmargin%
++mode,"rmargin",rtn R Right margin %Zrmargin%
++mode,"square",rtn X Rectangle mode %Zsquare%
++mode,"indentc",rtn % % Indent char %Zindentc%
++mode,"istep",rtn % % Indent step %Zistep%
++mode,"highlight",rtn H Highlighting %Zhighlight%
++mode,"crlf",rtn Z CR-LF (MS-DOS) %Zcrlf%
++mode,"linums",rtn N Line numbers %Zlinums%
++mode,"beep",rtn B Beep %Zbeep%
++mode,"rdonly",rtn O Read only %Zrdonly%
++ mode,"syntax",rtn Y Syntax
++mode,"encoding",rtn E Encoding
++mode,"asis",rtn % % Meta chars as-is
++mode,"language",rtn V Language
++mode,"picture",rtn P picture %Zpicture%
++menu,"more-options",rtn % % More options...
++
++:defmenu more-options
++menu,"^G",rtn % % ^G options
++menu,"search",rtn % % search options
++menu,"paragraph",rtn % % paragraph options
++menu,"file",rtn % % file options
++menu,"menu",rtn % % menu options
++menu,"global",rtn % % global options
++menu,"cursor",rtn % % cursor options
++menu,"marking",rtn % % marking options
++menu,"tab",rtn % % tab/indent options
++
++:defmenu menu
++mode,"menu_explorer",rtn % % Menu explorer %Zmenu_explorer%
++mode,"menu_above",rtn % % Menu position %Zmenu_above%
++mode,"menu_jump",rtn % % Jump into menu %Zmenu_jump%
++mode,"transpose",rtn % % Transpose menus %Ztranspose%
++
++:defmenu ^G
++mode,"single_quoted",rtn % % ^G ignores '...' %Zsingle_quoted%
++mode,"no_double_quoted",rtn % % ^G no ignore "..." %Zno_double_quoted%
++mode,"c_comment",rtn % % ^G ignores /*...*/ %Zc_comment%
++mode,"cpp_comment",rtn % % ^G ignores //... %Zcpp_comment%
++mode,"pound_comment",rtn % % ^G ignores #... %Zpound_comment%
++mode,"vhdl_comment",rtn % % ^G ignores --... %Zvhdl_comment%
++mode,"semi_comment",rtn % % ^G ignores ;... %Zsemi_comment%
++mode,"tex_comment",rtn % % ^G ignores %... %Ztex_comment%
++mode,"text_delimiters",rtn % % Text delimiters %Ztext_delimiters%
++
++:defmenu search
++mode,"icase",rtn % % Case insensitivity %Zicase%
++mode,"wrap",rtn % % Search wraps %Zwrap%
++mode,"search_prompting",rtn % % Search prompting %Zsearch_prompting%
++mode,"csmode",rtn % % Continued search %Zcsmode%
++
++:defmenu paragraph
++mode,"french",rtn % % French spacing %Zfrench%
++mode,"flowed",rtn % % Flowed text %Zflowed%
++mode,"cpara",rtn % % Paragraph indent chars %Zcpara%
++
++:defmenu file
++mode,"restore",rtn % % Restore cursor %Zrestore%
++mode,"guess_crlf",rtn % % Auto detect CR-LF %Zguess_crlf%
++mode,"guess_indent",rtn % % Guess indent %Zguess_indent%
++mode,"guess_non_utf8",rtn % % Guess non-UTF-8 %Zguess_non_utf8%
++mode,"guess_utf8",rtn % % Guess UTF-8 %Zguess_utf8%
++mode,"force",rtn % % Force last NL %Zforce%
++mode,"nobackup",rtn % % No backup %Znobackup%
++
++:defmenu global
++mode,"nolocks",rtn % % Disable locks %Znolocks%
++mode,"nobackups",rtn % % Disable backups %Znobackups%
++mode,"nomodcheck",rtn % % Disable mtime check %Znomodcheck%
++mode,"nocurdir",rtn % % Disable current dir %Znocurdir%
++mode,"exask",rtn % % Exit ask %Zexask%
++mode,"nosta",rtn % % Disable status line %Znosta%
++mode,"keepup",rtn % % Fast status line %Zkeepup%
++mode,"break_hardlinks",rtn % % Break hard links %Zbreak_hardlinks%
++mode,"break_links",rtn % % Break links %Zbreak_links%
++mode,"joe_state",rtn % % Joe_state file %Zjoe_state%
++mode,"undo_keep",rtn % % No. undo records %Zundo_keep%
++mode,"backpath",rtn % % Path to backup files %Zbackpath%
++
++:defmenu cursor
++mode,"pg",rtn % % No. PgUp/PgDn lines %Zpg%
++mode,"mid",rtn C Center on scroll %Zmid%
++mode,"floatmouse",rtn % % Click past end %Zfloatmouse%
++mode,"rtbutton",rtn % % Right button %Zrtbutton%
++
++:defmenu marking
++mode,"autoswap",rtn % % Autoswap mode %Zautoswap%
++mode,"marking",rtn % % Marking %Zmarking%
++mode,"lightoff",rtn % % Auto unmask %Zlightoff%
++
++:defmenu tab
++mode,"smarthome",rtn % % Smart home key %Zsmarthome%
++mode,"smartbacks",rtn % % Smart backspace %Zsmartbacks%
++mode,"indentfirst",rtn % % To indent first %Zindentfirst%
++mode,"purify",rtn % % Clean up indents %Zpurify%
++mode,"spaces",rtn % % No tabs %Zspaces%
++
++{Basic
++\i Help Screen \|turn off with ^KH more help with ESC . (^[.) \i
++\i \i\|\uCURSOR\u \|\uGO TO\u \|\uBLOCK\u \|\uDELETE\u \|\uMISC\u \|\uEXIT\u \|\i \i
++\i \i\|^B left ^F right \|^U prev. screen \|^KB begin \|^D char. \|^KJ reformat \|^KX save \|\i \i
++\i \i\|^P up ^N down \|^V next screen \|^KK end \|^Y line \|^KA center \|^C abort \|\i \i
++\i \i\|^Z previous word \|^A beg. of line \|^KM move \|^W >word \|^T options \|^KZ shell \|\i \i
++\i \i\|^X next word \|^E end of line \|^KC copy \|^O word< \|^R refresh \|\uFILE\u \|\i \i
++\i \i\|\uSEARCH\u \|^KU top of file \|^KW file \|^J >line \|\uSPELL\u \|^KE edit \|\i \i
++\i \i\|^KF find text \|^KV end of file \|^KY delete \|^_ undo \|^[N word \|^KR insert\|\i \i
++\i \i\|^L find next \|^KL to line No. \|^K/ filter \|^^ redo \|^[L file \|^KD save \|\i \i
++}
++
++{Windows
++\i Help Screen \|turn off with ^KH prev. screen ^[, next screen ^[. \i
++\i \i\|^KO Split the window in half \|^KE Load file into window \|\i \i
++\i \i\|^KG Make current window bigger \|^KT Make current window smaller \|\i \i
++\i \i\|^KN Go to the window below \|^KP Go to the window above \|\i \i
++\i \i\|^[V Switch to next buffer \|^[U Switch to previous buffer \|\i \i
++\i \i\|^C Eliminate the current window \|^KI Show all windows / Show one window\|\i \i
++}
++
++{Advanced
++\i Help Screen \|turn off with ^KH prev. screen ^[, next screen ^[. \i
++\i \i\|\uMACROS\u \|\uMISC\u \|\uSCROLL\u \|\uSHELL\u \|\uGOTO\u \|\uI-SEARCH\u \|\i \i
++\i \i\|^K[ 0-9 Record \|^K SPACE status \|^[W Up \|^K' Window \|^[B To ^KB \|^[R Backwards\|\i \i
++\i \i\|^K] Stop \|^K\\ Repeat \|^[Z Down \|^[! Command \|^[K To ^KK \|^[S Forwards \|\i \i
++\i \i\|^K 0-9 Play \|\uINSERT\u \|^K< Left \|\uQUOTE\u \|\uDELETE\u \|\uBOOKMARKS\u \|\i \i
++\i \i\|^K? Query \|^] split line \|^K> Right \|^[' Ctrl- \|^[Y yank \|^[ 0-9 Goto \|\i \i
++\i \i\|^[D Dump \|^SPACE ins space\| \|^\\ Meta- \|^[O line< \|^[^[ Set \|\i \i
++}
++
++{Programs
++\i Help Screen \|turn off with ^KH prev. screen ^[, next screen ^[. \i
++\i \i\|\uGOTO\u \|\uINDENT\u \|\uCOMPILING\u \uQUICK\u \|\i \i
++\i \i\|^G Matching ( [ { \|^K, less \|^[C Compile & parse ^G find word under cursor \|\i \i
++\i \i\|^K- Previous place \|^K. more \|^[G Grep & parse ^[ENTER complete word \|\i \i
++\i \i\|^K= Next place \|\uFILE\u \|^[= To next error ^[Y paste deleted text \|\i \i
++\i \i\|^K; Tags file search \|^K ` \|^[- To prev. error ^[^Y cycle through deleted \|\i \i
++\i \i\| \| revert \|^[ SP Jump to error \|\i \i
++}
++
++{Search
++\i Help Screen \|turn off with ^KH prev. screen ^[, next screen ^[. \i
++\i \iSpecial search sequences: \|\i \i
++\i \i \\^ \\$ matches beg./end of line \\? match any single char \|\i \i
++\i \i \\< \\> matches beg./end of word \\* match 0 or more chars \|\i \i
++\i \i \\c matches balanced C expression \\\\ matches a \\ \|\i \i
++\i \i \\[..] matches one of a set \\n matches a newline \|\i \i
++\i \i \\+ matches 0 or more of the character which follows the \\+ \|\i \i
++\i \iSpecial replace sequences: \|\i \i
++\i \i \\& replaced with text which matched search string \|\i \i
++\i \i \\0 - 9 replaced with text which matched Nth \\*, \\?, \\c, \\+, or \\[..] \|\i \i
++\i \i \\\\ replaced with \\ \\n replaced with newline \|\i \i
++}
++
++{SearchOptions
++\i Help Screen \|turn off with ^KH prev. screen ^[, next screen ^[. \i
++\i \iSearch options: \|\i \i
++\i \i r Replace \|\i \i
++\i \i k Restrict search to highlighted block, which can be rectangular \|\i \i
++\i \i b Search backward instead of forward \|\i \i
++\i \i i Ignore case \|\i \i
++\i \i a Search across all loaded files \|\i \i
++\i \i e Search across all files in Grep or Compile error list \|\i \i
++\i \i w Wrap to beginning of file for this search \|\i \i
++\i \i n Do not wrap to beginning of file for this search \|\i \i
++\i \i nnn Perform exaclty nnn replacements \|\i \i
++}
++
++{Math
++\i Help Screen \|turn off with ^KH prev. screen ^[, next screen ^[. \i
++\i \i \uCOMMANDS\u (hit ESC m for math) \uFUNCTIONS\u \|\i \i
++\i \i hex hex display mode sin cos tab asin acos atan \|\i \i
++\i \i dec decimal mode sinh cosh tanh asinh acosh atanh \|\i \i
++\i \i ins type result into file sqrt cbrt exp ln log \|\i \i
++\i \i eval evaluate block int floor ceil abs erg ergc \|\i \i
++\i \i 0xff enter number in hex joe(..macro..) - runs an editor macro \|\i \i
++\i \i 3e-4 floating point decimal \uBLOCK\u \|\i \i
++\i \i a=10 assign a variable sum cnt Sum, count \|\i \i
++\i \i 2+3:ins multiple commands avg dev Average, std. deviation \|\i \i
++\i \i e pi constants \uOPERATORS\u \|\i \i
++\i \i ans previous result ! ^ * / % + - < <= > >= == != && || ? :\|\i \i
++}
++
++{Names
++\i Help Screen \|turn off with ^KH prev. screen ^[, next screen ^[. \i
++\i \i Hit TAB at file name prompts to generate menu of file names \|\i \i
++\i \i Or use up/down keys to access history of previously entered names \|\i \i
++\i \i Special file names: \|\i \i
++\i \i !command Pipe in/out of a shell command \|\i \i
++\i \i >>filename Append to a file \|\i \i
++\i \i - Read/Write to/from standard I/O \|\i \i
++\i \i filename,START,SIZE Read/Write a part of a file/device \|\i \i
++\i \i Give START/SIZE in decimal (255), octal (0377) or hex (0xFF) \|\i \i
++}
++
++{Joe
++\i Help Screen \|turn off with ^KH prev. screen ^[, next screen ^[. \i
++\i \i Send bug reports to: http://sourceforge.net/projects/joe-editor \|\i \i
++\i \i \|\i \i
++\i \i default joerc file is here /etc/joe/joerc \|\i \i
++\i \i default syntax and i18n files are here /usr/share/joe \|\i \i
++\i \i additional documentation can be found here /usr/share/doc/joe \|\i \i
++}
++
++{CharTable
++\i Help Screen \|turn off with ^KH prev. screen ^[, \i
++\i \i\| Dec \u 0123 4567 8901 2345 0123 4567 8901 2345 \u Dec \|\i \i
++\i \i\| | | \|\i \i
++\i \i\| 0 | \u@ABC\u \uDEFG\u \uHIJK\u \uLMNO\u \i\u@ABC\u\i \i\uDEFG\u\i \i\uHIJK\u\i \i\uLMNO\u\i | 128 \|\i \i
++\i \i\| 16 | \uPQRS\u \uTUVW\u \uXYZ[\u \u\\]^_\u \i\uPQRS\u\i \i\uTUVW\u\i \i\uXYZ[\u\i \i\u\\]^_\u\i | 144 \|\i \i
++\i \i\| 32 | !"# $%&' ()*+ ,-./  ¡¢£ ¤¥¦§ ¨©ª« ¬­®¯ | 160 \|\i \i
++\i \i\| 48 | 0123 4567 89:; <=>? °±²³ ´µ¶· ¸¹º» ¼½¾¿ | 176 \|\i \i
++\i \i\| 64 | @ABC DEFG HIJK LMNO ÀÁÂÃ ÄÅÆÇ ÈÉÊË ÌÍÎÏ | 192 \|\i \i
++\i \i\| 80 | PQRS TUVW XYZ[ \\]^_ ÐÑÒÓ ÔÕÖ× ØÙÚÛ ÜÝÞß | 208 \|\i \i
++\i \i\| 96 | `abc defg hijk lmno àáâã äåæç èéêë ìíîï | 224 \|\i \i
++\i \i\| 112 | pqrs tuvw xyz{ |}~ ðñòó ôõö÷ øùúû üýþÿ | 240 \|\i \i
++}
++
++:windows Bindings common to all windows
++type ^@ TO ÿ
++abort ^C
++abort ^K Q
++abort ^K ^Q
++abort ^K q
++arg ^K \
++explode ^K I
++explode ^K ^I
++explode ^K i
++help ^K H
++help ^K ^H
++help ^K h
++hnext ^[ .
++hprev ^[ ,
++math ^[ m
++math ^[ M
++msg ^[ h
++msg ^[ H
++msg ^[ ^H
++nextw ^K N
++nextw ^K ^N
++nextw ^K n
++pgdn .kN
++pgdn ^V
++pgdn ^[ [ 6 ~
++pgup .kP
++pgup ^U
++pgup ^[ [ 5 ~
++play ^K 0 TO 9
++prevw ^K P
++prevw ^K ^P
++prevw ^K p
++query ^K ?
++record ^K [
++retype ^R
++rtn ^M
++shell ^K Z
++shell ^K ^Z
++shell ^K z
++stop ^K ]
++
++defmdown MDOWN
++defmup MUP
++defmdrag MDRAG
++defm2down M2DOWN
++defm2up M2UP
++defm2drag M2DRAG
++defm3down M3DOWN
++defm3up M3UP
++defm3drag M3DRAG
++
++xtmouse ^[ [ M
++
++if,"char==65",then,"it's an A",else,"it's not an a",endif ^[ q
++
++:main Text editing window
++:inherit windows
++
++:def ispellfile filt,"cat >ispell.tmp;ispell ispell.tmp </dev/tty >/dev/tty;cat ispell.tmp;/bin/rm ispell.tmp",rtn,retype
++:def ispellword psh,nextword,markk,prevword,markb,filt,"cat >ispell.tmp;ispell ispell.tmp </dev/tty >/dev/tty;tr -d <ispell.tmp '\\012';/bin/rm ispell.tmp",rtn,retype,nextword
++
++:def aspellfile filt,"SPLTMP=ispell.tmp;cat >$SPLTMP;aspell --lang=",language,".",charset," -x -c $SPLTMP </dev/tty >/dev/tty;cat $SPLTMP;/bin/rm $SPLTMP",rtn,retype
++:def aspellword psh,nextword,markk,prevword,markb,filt,"SPLTMP=ispell.tmp;cat >$SPLTMP;aspell --lang=",language,".",charset," -x -c $SPLTMP </dev/tty >/dev/tty;tr -d <$SPLTMP '\\012';/bin/rm $SPLTMP",rtn,retype,nextword
++
++aspellfile ^[ l
++aspellword ^[ n
++
++:def compile mwind!,mfit!,querysave,query,scratch,"* Build Log *",rtn,bof,markb,eof," ",markk,blkdel,build
++
++:def grep_find mwind!,mfit!,scratch,"* Grep Log *",rtn,bof,markb,eof," ",markk,blkdel,grep
++
++:def man scratch,"* Man Page *",rtn,bof,markb,eof," ",markk,blkdel," ",ltarw,run,"man -P cat -S 2:3 "
++
++paste ^[ ] 5 2 ;
++
++insc ^[ [ 2 ~
++insc ^[ [ L
++
++delch ^[ [ 3 ~
++
++pgup ^[ [ I
++
++pgdn ^[ [ G
++
++home ^[ [ 1 ~
++home ^[ [ H
++home ^[ O H
++home ^[ [ 7 ~
++
++eol ^[ [ 4 ~
++eol ^[ [ F
++eol ^[ O F
++eol ^[ [ 8 ~
++
++rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 1 ; 5 C
++rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 5 C
++rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ O c
++
++ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 1 ; 5 D
++ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 5 D
++ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ O d
++
++uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 1 ; 5 A
++uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 5 A
++uparw,dnarw,begin_marking,uparw,toggle_marking ^[ O a
++
++dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 1 ; 5 B
++dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 5 B
++dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ O b
++
++blkdel,nmark ^[ [ 3 ; 5 -
++blkdel,nmark ^[ [ 3 ; 5 ~
++
++yank ^[ [ 2 ; 5 -
++yank ^[ [ 2 ; 5 ~
++
++delbol ^[ o
++delbol ^[ ^O
++dnslide ^[ z
++dnslide ^[ Z
++dnslide ^[ ^Z
++dnslide,dnslide,dnslide,dnslide MWDOWN
++compile ^[ c
++compile ^[ C
++compile ^[ ^C
++grep_find ^[ g
++grep_find ^[ G
++grep_find ^[ ^G
++execmd ^[ x
++execmd ^[ X
++execmd ^[ ^X
++finish ^[ ^I
++finish ^[ ^M
++mwind,mfit,jump,bol ^[ SP
++isrch ^[ s
++isrch ^[ S
++isrch ^[ ^S
++notmod ^[ ~
++mwind,mfit,prevw,nxterr ^[ =
++parserr ^[ e
++parserr ^[ E
++parserr ^[ ^E
++mwind,mfit,prevw,prverr ^[ -
++rsrch ^[ r
++rsrch ^[ R
++rsrch ^[ ^R
++run ^[ !
++tomarkb ^[ b
++tomarkb ^[ ^B
++tomarkk ^[ k
++tomarkk ^[ ^K
++tomarkk ^[ K
++txt ^[ i
++txt ^[ I
++upslide ^[ w
++upslide ^[ ^W
++upslide ^[ W
++upslide,upslide,upslide,upslide MWUP
++yank ^[ y
++yankpop ^[ ^Y
++yank ^[ Y
++
++insc ^@
++
++nbuf ^[ v
++nbuf ^[ V
++nbuf ^[ ^V
++pbuf ^[ u
++pbuf ^[ U
++pbuf ^[ ^U
++
++quote8 ^\
++quote ^[ '
++quote ^Q
++
++backs ^?
++backs ^H
++backw ^O
++bknd ^K '
++blkcpy ^K C
++blkcpy ^K ^C
++blkcpy ^K c
++blkdel ^K Y
++blkdel ^K ^Y
++blkdel ^K y
++blkmove ^K M
++blkmove ^K ^M
++blkmove ^K m
++blksave ^K W
++blksave ^K ^W
++blksave ^K w
++bof ^K U
++bof ^K ^U
++bof ^K u
++home .kh
++home ^A
++center ^K A
++center ^K ^A
++center ^K a
++crawll ^K <
++crawlr ^K >
++delch .kD
++delch ^D
++deleol ^J
++dellin ^Y
++delw ^W
++dnarw .kd
++dnarw ^N
++dnarw ^[ O B
++dnarw ^[ [ B
++edit ^K E
++edit ^K ^E
++edit ^K e
++eof ^K V
++eof ^K ^V
++eof ^K v
++eol .kH
++eol .@7
++eol ^E
++exsave ^K X
++exsave ^K ^X
++exsave ^K x
++ffirst ^K F
++ffirst ^K ^F
++ffirst ^K f
++filt ^K /
++fnext ^L
++fmtblk ^K J
++fmtblk ^K ^J
++fmtblk ^K j
++gomark ^[ 0 TO 9
++groww ^K G
++groww ^K ^G
++groww ^K g
++insc .kI
++insf ^K R
++insf ^K ^R
++insf ^K r
++lindent ^K ,
++line ^K L
++line ^K ^L
++line ^K l
++ltarw .kl
++ltarw ^B
++ltarw ^[ O D
++ltarw ^[ [ D
++macros ^[ d
++macros ^[ ^D
++markb ^K B
++markb ^K ^B
++markb ^K b
++markk ^K K
++markk ^K ^K
++markk ^K k
++menu,"root",rtn ^T
++nextpos ^K =
++nextword ^X
++open ^]
++prevpos ^K -
++prevword ^Z
++reload ^K `
++redo ^^
++rindent ^K .
++rtarw .kr
++rtarw ^F
++rtarw ^[ O C
++rtarw ^[ [ C
++run ^K !
++save ^K D
++save ^K S
++save ^K ^D
++save ^K ^S
++save ^K d
++save ^K s
++setmark ^[ ^[
++shrinkw ^K T
++shrinkw ^K ^T
++shrinkw ^K t
++splitw ^K O
++splitw ^K ^O
++splitw ^K o
++stat ^K SP
++tag ^K ;
++tomatch ^G
++undo ^_
++uparw .ku
++uparw ^P
++uparw ^[ O A
++uparw ^[ [ A
++
++:prompt Prompt windows
++:inherit main
++if,"byte>size",then,complete,complete,else,delch,endif ^D
++complete ^I
++dnarw,eol .kd
++dnarw,eol ^N
++dnarw,eol ^[ O B
++dnarw,eol ^[ [ B
++uparw,eol .ku
++uparw,eol ^P
++uparw,eol ^[ O A
++uparw,eol ^[ [ A
++
++:menu Selection menus
++:inherit windows
++
++pgupmenu ^[ [ I
++
++pgdnmenu ^[ [ G
++
++bolmenu ^[ [ 1 ~
++bolmenu ^[ [ H
++bolmenu ^[ O H
++bolmenu ^[ [ 7 ~
++
++eolmenu ^[ [ 4 ~
++eolmenu ^[ [ F
++eolmenu ^[ O F
++eolmenu ^[ [ 8 ~
++
++abort ^[ ^[
++backsmenu ^?
++backsmenu ^H
++bofmenu ^K U
++bofmenu ^K ^U
++bofmenu ^K u
++bolmenu .kh
++bolmenu ^A
++dnarwmenu .kd
++dnarwmenu ^N
++dnarwmenu ^[ [ B
++dnarwmenu ^[ O B
++dnarwmenu MWDOWN
++eofmenu ^K V
++eofmenu ^K ^V
++eofmenu ^K v
++eolmenu .kH
++eolmenu ^E
++ltarwmenu .kl
++ltarwmenu ^B
++ltarwmenu ^[ [ D
++ltarwmenu ^[ O D
++pgdnmenu .kN
++pgdnmenu ^V
++pgdnmenu ^[ [ 6 ~
++pgupmenu .kP
++pgupmenu ^U
++pgupmenu ^[ [ 5 ~
++rtarwmenu .kr
++rtarwmenu ^F
++rtarwmenu ^[ [ C
++rtarwmenu ^[ O C
++rtn SP
++rtn ^I
++rtn ^K H
++rtn ^K h
++rtn ^K ^H
++tabmenu ^I
++uparwmenu .ku
++uparwmenu ^P
++uparwmenu ^[ [ A
++uparwmenu ^[ O A
++uparwmenu MWUP
++defm2down M2DOWN
++
++:query Single-key query window
++:inherit windows
++
++:querya Single-key query window for quoting
++type ^@ TO ÿ
++
++:querysr Search & replace query window
++type ^@ TO ÿ
++
++:shell Input to shell windows
++:inherit main
++"" ^C Abort
++"" ^D Eof
++" " ^I Tab
++"" ^H Backspace
++" " ^M Return
++"" ^? Backspace
++
++:vtshell Input to ANSI shell windows
++:inherit main
++""  [ A
++"" .ku
++""  [ B
++"" .kd
++""  [ C
++"" .kr
++""  [ D
++"" .kl
++"" ^A BOL for bash
++"" ^C Abort
++"" ^D Eof
++"" ^E EOL for bash
++" " ^I Tab
++"" ^H Backspace
++" " ^M Return
++"" ^? Backspace
+diff --git a/feeds/packages/utils/kmod/Makefile b/feeds/packages/utils/kmod/Makefile
+new file mode 100644
+index 0000000..96769aa
+--- /dev/null
++++ b/feeds/packages/utils/kmod/Makefile
+@@ -0,0 +1,93 @@
++#
++# Copyright (C) 2015 Jeff Waugh
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=kmod
++PKG_VERSION:=20
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=https://www.kernel.org/pub/linux/utils/kernel/kmod/
++PKG_MD5SUM:=d6f4fef718a50bd88080de6a43bc64d8
++PKG_MAINTAINER:=Jeff Waugh <jdub@bethesignal.org>
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING
++PKG_FIXUP:=autoreconf
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++CONFIGURE_ARGS += --with-zlib
++
++define Package/kmod/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Linux kernel module handling
++ URL:=https://www.kernel.org/pub/linux/utils/kernel/kmod/
++ DEPENDS:=+zlib
++endef
++
++
++define Package/kmod
++$(call Package/kmod/Default)
++ TITLE+= (tools)
++endef
++
++define Package/kmod/description
++Linux kernel module handling
++ kmod is a set of tools to handle common tasks with Linux kernel modules like
++ insert, remove, list, check properties, resolve dependencies and aliases.
++endef
++
++LEGACY_BINARIES:= \
++ depmod \
++ insmod \
++ lsmod \
++ modinfo \
++ modprobe \
++ rmmod
++
++define Package/kmod/install
++ $(INSTALL_DIR) $(1)/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/kmod $(1)/sbin
++
++ for b in $(LEGACY_BINARIES); do \
++ ln -sf kmod $(1)/sbin/$$$$b ; \
++ done
++endef
++
++
++define Package/libkmod
++$(call Package/kmod/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= (library)
++endef
++
++define Package/libkmod/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libkmod.so.* $(1)/usr/lib/
++endef
++
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include $(1)/usr/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libkmod.{so*,la} $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libkmod.pc $(1)/usr/lib/pkgconfig/
++endef
++
++
++$(eval $(call BuildPackage,kmod))
++$(eval $(call BuildPackage,libkmod))
+diff --git a/feeds/packages/utils/kmod/patches/001-fix_pkgconfig_file.patch b/feeds/packages/utils/kmod/patches/001-fix_pkgconfig_file.patch
+new file mode 100644
+index 0000000..1891078
+--- /dev/null
++++ b/feeds/packages/utils/kmod/patches/001-fix_pkgconfig_file.patch
+@@ -0,0 +1,22 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -35,9 +35,6 @@ SED_PROCESS = \
++ -e 's,@zlib_LIBS\@,${zlib_LIBS},g' \
++ < $< > $@ || rm $@
++
++-%.pc: %.pc.in Makefile
++- $(SED_PROCESS)
++-
++ LIBKMOD_CURRENT=4
++ LIBKMOD_REVISION=9
++ LIBKMOD_AGE=2
++--- a/configure.ac
+++++ b/configure.ac
++@@ -221,6 +221,7 @@ AC_CONFIG_HEADERS(config.h)
++ AC_CONFIG_FILES([
++ Makefile
++ man/Makefile
+++ libkmod/libkmod.pc
++ libkmod/docs/Makefile
++ libkmod/docs/version.xml
++ ])
+diff --git a/feeds/packages/utils/lcd4linux/Config.in b/feeds/packages/utils/lcd4linux/Config.in
+new file mode 100644
+index 0000000..1410f2b
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/Config.in
+@@ -0,0 +1,490 @@
++if PACKAGE_lcd4linux-custom
++
++config LCD4LINUX_CUSTOM_NEEDS_libdbus
++ bool
++
++#config LCD4LINUX_CUSTOM_NEEDS_libftdi
++# bool
++
++config LCD4LINUX_CUSTOM_NEEDS_libgd
++ bool
++
++config LCD4LINUX_CUSTOM_NEEDS_libiconv
++ bool
++
++config LCD4LINUX_CUSTOM_NEEDS_libjpeg
++ bool
++
++config LCD4LINUX_CUSTOM_NEEDS_libmpdclient
++ bool
++
++config LCD4LINUX_CUSTOM_NEEDS_libmysqlclient
++ bool
++
++config LCD4LINUX_CUSTOM_NEEDS_libncurses
++ bool
++
++config LCD4LINUX_CUSTOM_NEEDS_libnmeap
++ bool
++
++config LCD4LINUX_CUSTOM_NEEDS_libsqlite3
++ bool
++
++config LCD4LINUX_CUSTOM_NEEDS_libusb
++ bool
++
++#config LCD4LINUX_CUSTOM_NEEDS_libX11
++# bool
++
++config LCD4LINUX_CUSTOM_NEEDS_ppp
++ bool
++
++config LCD4LINUX_CUSTOM_NEEDS_python
++ bool
++
++
++comment "Drivers ---"
++
++config LCD4LINUX_CUSTOM_DRIVER_ASTUSB
++ bool
++ prompt "ASTUSB"
++
++config LCD4LINUX_CUSTOM_DRIVER_BeckmannEgle
++ bool
++ prompt "BeckmannEgle"
++
++config LCD4LINUX_CUSTOM_DRIVER_BWCT
++ bool
++ prompt "BWCT"
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_CrystalFontz
++ bool
++ prompt "CrystalFontz"
++
++config LCD4LINUX_CUSTOM_DRIVER_Curses
++ bool
++ prompt "Curses"
++ select LCD4LINUX_CUSTOM_NEEDS_libncurses
++
++config LCD4LINUX_CUSTOM_DRIVER_Cwlinux
++ bool
++ prompt "Cwlinux"
++
++config LCD4LINUX_CUSTOM_DRIVER_D4D
++ bool
++ prompt "D4D"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++
++config LCD4LINUX_CUSTOM_DRIVER_dpf
++ bool
++ prompt "dpf"
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++
++config LCD4LINUX_CUSTOM_DRIVER_EA232graphic
++ bool
++ prompt "EA232graphic"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++
++config LCD4LINUX_CUSTOM_DRIVER_EFN
++ bool
++ prompt "EFN"
++
++config LCD4LINUX_CUSTOM_DRIVER_FutabaVFD
++ bool
++ prompt "FutabaVFD"
++
++config LCD4LINUX_CUSTOM_DRIVER_FW8888
++ bool
++ prompt "FW8888"
++
++config LCD4LINUX_CUSTOM_DRIVER_G15
++ bool
++ prompt "G15"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_GLCD2USB
++ bool
++ prompt "GLCD2USB"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_HD44780
++ bool
++ prompt "HD44780"
++ depends on BROKEN
++
++config LCD4LINUX_CUSTOM_DRIVER_HD44780-I2C
++ bool
++ prompt "HD44780-I2C"
++ depends on BROKEN
++
++config LCD4LINUX_CUSTOM_DRIVER_IRLCD
++ bool
++ prompt "IRLCD"
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_LCD2USB
++ bool
++ prompt "LCD2USB"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_LCDLinux
++ bool
++ prompt "LCDLinux"
++ depends on BROKEN
++
++config LCD4LINUX_CUSTOM_DRIVER_LCDTerm
++ bool
++ prompt "LCDTerm"
++
++config LCD4LINUX_CUSTOM_DRIVER_LEDMatrix
++ bool
++ prompt "LEDMatrix"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++
++config LCD4LINUX_CUSTOM_DRIVER_LPH7508
++ bool
++ prompt "LPH7508"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++
++config LCD4LINUX_CUSTOM_DRIVER_LUIse
++ bool
++ prompt "LUIse"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++ #select LCD4LINUX_CUSTOM_NEEDS_libluise
++ depends on BROKEN
++
++config LCD4LINUX_CUSTOM_DRIVER_LW_ABP
++ bool
++ prompt "LW_ABP"
++
++config LCD4LINUX_CUSTOM_DRIVER_M50530
++ bool
++ prompt "M50530"
++
++config LCD4LINUX_CUSTOM_DRIVER_MatrixOrbital
++ bool
++ prompt "MatrixOrbital"
++
++config LCD4LINUX_CUSTOM_DRIVER_MatrixOrbitalGX
++ bool
++ prompt "MatrixOrbitalGX"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_mdm166a
++ bool
++ prompt "mdm166a"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++
++config LCD4LINUX_CUSTOM_DRIVER_MilfordInstruments
++ bool
++ prompt "MilfordInstruments"
++
++config LCD4LINUX_CUSTOM_DRIVER_Newhaven
++ bool
++ prompt "Newhaven"
++
++config LCD4LINUX_CUSTOM_DRIVER_Noritake
++ bool
++ prompt "Noritake"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++
++config LCD4LINUX_CUSTOM_DRIVER_NULL
++ bool
++ prompt "NULL"
++ default y
++
++config LCD4LINUX_CUSTOM_DRIVER_Pertelian
++ bool
++ prompt "Pertelian"
++
++config LCD4LINUX_CUSTOM_DRIVER_PHAnderson
++ bool
++ prompt "PHAnderson"
++
++config LCD4LINUX_CUSTOM_DRIVER_PICGraphic
++ bool
++ prompt "PICGraphic"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++
++config LCD4LINUX_CUSTOM_DRIVER_picoLCD
++ bool
++ prompt "picoLCD"
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_picoLCDGraphic
++ bool
++ prompt "picoLCDGraphic"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_PNG
++ bool
++ prompt "PNG"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++
++config LCD4LINUX_CUSTOM_DRIVER_PPM
++ bool
++ prompt "PPM"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++
++config LCD4LINUX_CUSTOM_DRIVER_RouterBoard
++ bool
++ prompt "RouterBoard"
++ depends on TARGET_rb532
++
++config LCD4LINUX_CUSTOM_DRIVER_SamsungSPF
++ bool
++ prompt "SamsungSPF"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++ select LCD4LINUX_CUSTOM_NEEDS_libjpeg
++
++config LCD4LINUX_CUSTOM_DRIVER_serdisplib
++ bool
++ prompt "serdisplib"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++ select LCD4LINUX_CUSTOM_NEEDS_serdisplib
++
++config LCD4LINUX_CUSTOM_DRIVER_ShuttleVFD
++ bool
++ prompt "ShuttleVFD"
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_SimpleLCD
++ bool
++ prompt "SimpleLCD"
++
++config LCD4LINUX_CUSTOM_DRIVER_st2205
++ bool
++ prompt "st2205"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++ select LCD4LINUX_CUSTOM_NEEDS_st2205tool
++
++config LCD4LINUX_CUSTOM_DRIVER_T6963
++ bool
++ prompt "T6963"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++
++config LCD4LINUX_CUSTOM_DRIVER_TeakLCM
++ bool
++ prompt "TeakLCM"
++
++config LCD4LINUX_CUSTOM_DRIVER_TEW673GRU
++ bool
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++ depends on TARGET_ar71xx
++ default TARGET_ar71xx
++
++config LCD4LINUX_CUSTOM_DRIVER_Trefon
++ bool
++ prompt "Trefon"
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++#config LCD4LINUX_CUSTOM_DRIVER_ULA200
++# bool
++# prompt "ULA200"
++# select LCD4LINUX_CUSTOM_NEEDS_libftdi
++# select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_USBHUB
++ bool
++ prompt "USBHUB"
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_USBLCD
++ bool
++ prompt "USBLCD"
++ select LCD4LINUX_CUSTOM_NEEDS_libusb
++
++config LCD4LINUX_CUSTOM_DRIVER_VNC
++ bool
++ prompt "VNC"
++ select LCD4LINUX_CUSTOM_NEEDS_libgd
++ select LCD4LINUX_CUSTOM_NEEDS_libvncserver
++
++config LCD4LINUX_CUSTOM_DRIVER_WincorNixdorf
++ bool
++ prompt "WincorNixdorf"
++
++#config LCD4LINUX_CUSTOM_DRIVER_X11
++# bool
++# prompt "X11"
++# select LCD4LINUX_CUSTOM_NEEDS_libgd
++# select LCD4LINUX_CUSTOM_NEEDS_libX11
++
++
++comment "Plugins ---"
++
++config LCD4LINUX_CUSTOM_PLUGIN_apm
++ bool
++ prompt "apm"
++
++config LCD4LINUX_CUSTOM_PLUGIN_asterisk
++ bool
++ prompt "asterisk"
++
++config LCD4LINUX_CUSTOM_PLUGIN_button_exec
++ bool
++ prompt "button_exec"
++
++config LCD4LINUX_CUSTOM_PLUGIN_cpuinfo
++ bool
++ prompt "cpuinfo"
++ default y
++
++config LCD4LINUX_CUSTOM_PLUGIN_dbus
++ bool
++ prompt "dbus"
++ select LCD4LINUX_CUSTOM_NEEDS_libdbus
++
++config LCD4LINUX_CUSTOM_PLUGIN_diskstats
++ bool
++ prompt "diskstats"
++
++config LCD4LINUX_CUSTOM_PLUGIN_dvb
++ bool
++ prompt "dvb"
++
++config LCD4LINUX_CUSTOM_PLUGIN_event
++ bool
++ prompt "event"
++
++config LCD4LINUX_CUSTOM_PLUGIN_exec
++ bool
++ prompt "exec"
++
++config LCD4LINUX_CUSTOM_PLUGIN_fifo
++ bool
++ prompt "fifo"
++
++config LCD4LINUX_CUSTOM_PLUGIN_file
++ bool
++ prompt "file"
++
++config LCD4LINUX_CUSTOM_PLUGIN_gps
++ bool
++ prompt "gps"
++ select LCD4LINUX_CUSTOM_NEEDS_libnmeap
++
++config LCD4LINUX_CUSTOM_PLUGIN_hddtemp
++ bool
++ prompt "hddtemp"
++
++config LCD4LINUX_CUSTOM_PLUGIN_huawei
++ bool
++ prompt "huawei"
++
++config LCD4LINUX_CUSTOM_PLUGIN_i2c_sensors
++ bool
++ prompt "i2c_sensors"
++
++config LCD4LINUX_CUSTOM_PLUGIN_iconv
++ bool
++ prompt "iconv"
++ select LCD4LINUX_CUSTOM_NEEDS_libiconv
++
++config LCD4LINUX_CUSTOM_PLUGIN_imon
++ bool
++ prompt "imon"
++
++config LCD4LINUX_CUSTOM_PLUGIN_isdn
++ bool
++ prompt "isdn"
++
++config LCD4LINUX_CUSTOM_PLUGIN_kvv
++ bool
++ prompt "kvv"
++
++config LCD4LINUX_CUSTOM_PLUGIN_loadavg
++ bool
++ prompt "loadavg"
++ default y
++
++config LCD4LINUX_CUSTOM_PLUGIN_meminfo
++ bool
++ prompt "meminfo"
++ default y
++
++config LCD4LINUX_CUSTOM_PLUGIN_mpd
++ bool
++ prompt "mpd"
++ select LCD4LINUX_CUSTOM_NEEDS_libmpdclient
++
++config LCD4LINUX_CUSTOM_PLUGIN_mpris_dbus
++ bool
++ prompt "mpris_dbus"
++ select LCD4LINUX_CUSTOM_NEEDS_libdbus
++
++config LCD4LINUX_CUSTOM_PLUGIN_mysql
++ bool
++ prompt "mysql"
++ select LCD4LINUX_CUSTOM_NEEDS_libmysqlclient
++
++config LCD4LINUX_CUSTOM_PLUGIN_netdev
++ bool
++ prompt "netdev"
++
++config LCD4LINUX_CUSTOM_PLUGIN_netinfo
++ bool
++ prompt "netinfo"
++
++config LCD4LINUX_CUSTOM_PLUGIN_pop3
++ bool
++ prompt "pop3"
++
++config LCD4LINUX_CUSTOM_PLUGIN_ppp
++ bool
++ prompt "ppp"
++ select LCD4LINUX_CUSTOM_NEEDS_ppp
++
++config LCD4LINUX_CUSTOM_PLUGIN_proc_stat
++ bool
++ prompt "proc_stat"
++ default y
++
++#config LCD4LINUX_CUSTOM_PLUGIN_python
++# bool
++# prompt "python"
++# select LCD4LINUX_CUSTOM_NEEDS_python
++
++config LCD4LINUX_CUSTOM_PLUGIN_qnaplog
++ bool
++ prompt "qnaplog"
++ select LCD4LINUX_CUSTOM_NEEDS_libsqlite3
++
++config LCD4LINUX_CUSTOM_PLUGIN_seti
++ bool
++ prompt "seti"
++
++config LCD4LINUX_CUSTOM_PLUGIN_statfs
++ bool
++ prompt "statfs"
++
++config LCD4LINUX_CUSTOM_PLUGIN_uname
++ bool
++ prompt "uname"
++
++config LCD4LINUX_CUSTOM_PLUGIN_uptime
++ bool
++ prompt "uptime"
++ default y
++
++config LCD4LINUX_CUSTOM_PLUGIN_w1retap
++ bool
++ prompt "w1retap"
++
++config LCD4LINUX_CUSTOM_PLUGIN_wireless
++ bool
++ prompt "wireless"
++ depends on BROKEN
++
++config LCD4LINUX_CUSTOM_PLUGIN_xmms
++ bool
++ prompt "xmms"
++
++endif
+diff --git a/feeds/packages/utils/lcd4linux/Makefile b/feeds/packages/utils/lcd4linux/Makefile
+new file mode 100644
+index 0000000..626795b
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/Makefile
+@@ -0,0 +1,309 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lcd4linux
++PKG_REV:=1203
++PKG_VERSION:=r$(PKG_REV)
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://ssl.bulix.org/svn/lcd4linux/trunk/
++PKG_SOURCE_SUBDIR:=lcd4linux-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_PROTO:=svn
++
++LCD4LINUX_DRIVERS:= \
++ ASTUSB \
++ BeckmannEgle \
++ BWCT \
++ CrystalFontz \
++ Curses \
++ Cwlinux \
++ D4D \
++ DPF \
++ EA232graphic \
++ EFN \
++ FutabaVFD \
++ FW8888 \
++ G15 \
++ GLCD2USB \
++ IRLCD \
++ $(if $(CONFIG_BROKEN),HD44780) \
++ $(if $(CONFIG_BROKEN),HD44780-I2C) \
++ LCD2USB \
++ $(if $(CONFIG_BROKEN),LCDLinux) \
++ LCDTerm \
++ LEDMatrix \
++ LPH7508 \
++ $(if $(CONFIG_BROKEN),LUIse) \
++ LW_ABP \
++ M50530 \
++ MatrixOrbital \
++ MatrixOrbitalGX \
++ MilfordInstruments \
++ Newhaven \
++ Noritake \
++ NULL \
++ Pertelian \
++ PHAnderson \
++ PICGraphic \
++ picoLCD \
++ picoLCDGraphic \
++ PNG \
++ PPM \
++ $(if $(CONFIG_TARGET_rb532),RouterBoard) \
++ $(if $(CONFIG_BROKEN),SamsungSPF) \
++ ShuttleVFD \
++ SimpleLCD \
++ st2205 \
++ T6963 \
++ TeakLCM \
++ $(if $(CONFIG_TARGET_ar71xx),TEW673GRU) \
++ Trefon \
++ USBHUB \
++ USBLCD \
++ VNC \
++ WincorNixdorf \
++# ULA200 \
++# X11 \
++
++LCD4LINUX_PLUGINS:= \
++ apm \
++ asterisk \
++ button_exec \
++ cpuinfo \
++ dbus \
++ diskstats \
++ dvb \
++ event \
++ exec \
++ fifo \
++ file \
++ gps \
++ hddtemp \
++ huawei \
++ i2c_sensors \
++ iconv \
++ imon \
++ isdn \
++ kvv \
++ loadavg \
++ netdev \
++ netinfo \
++ meminfo \
++ mpd \
++ mpris_dbus \
++ mysql \
++ netdev \
++ pop3 \
++ ppp \
++ proc_stat \
++ qnaplog \
++ seti \
++ statfs \
++ uname \
++ uptime \
++ w1retap \
++ $(if $(CONFIG_BROKEN),wireless) \
++ xmms \
++# python \
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_BUILD_DEPENDS:= \
++ libdbus \
++ libgd \
++ libmpdclient \
++ libmysqlclient \
++ libncurses \
++ libnmeap \
++ libsqlite3 \
++ ppp \
++# libftdi \
++# libX11 \
++# python \
++
++PKG_CONFIG_DEPENDS:= \
++ $(patsubst %,CONFIG_LCD4LINUX_CUSTOM_DRIVER_%,$(LCD4LINUX_DRIVERS)) \
++ $(patsubst %,CONFIG_LCD4LINUX_CUSTOM_PLUGIN_%,$(LCD4LINUX_PLUGINS)) \
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/lcd4linux/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ PKG_MAINTAINER:=Jonathan McCrohan <jmccrohan@gmail.com>
++ TITLE:=LCD display utility
++ URL:=http://lcd4linux.bulix.org/
++endef
++
++define Package/lcd4linux/Default/description
++ LCD4Linux is a small program that grabs information from the kernel and
++ some subsystems and displays it on an external liquid crystal display.
++endef
++
++
++define Package/lcd4linux-custom
++$(call Package/lcd4linux/Default)
++ DEPENDS:= \
++ +LCD4LINUX_CUSTOM_NEEDS_libdbus:libdbus \
++ +LCD4LINUX_CUSTOM_NEEDS_libgd:libgd \
++ $(if $(ICONV_FULL),+LCD4LINUX_CUSTOM_NEEDS_libiconv:libiconv-full) \
++ +LCD4LINUX_CUSTOM_NEEDS_libjpeg:libjpeg \
++ +LCD4LINUX_CUSTOM_NEEDS_libmpdclient:libmpdclient \
++ +LCD4LINUX_CUSTOM_NEEDS_libmysqlclient:libmysqlclient \
++ +LCD4LINUX_CUSTOM_NEEDS_libncurses:libncurses \
++ +LCD4LINUX_CUSTOM_NEEDS_libsqlite3:libsqlite3 \
++ +LCD4LINUX_CUSTOM_NEEDS_libusb:libusb-compat \
++# +LCD4LINUX_CUSTOM_NEEDS_libftdi:libftdi \
++# +LCD4LINUX_CUSTOM_NEEDS_libX11:libX11 \
++# +LCD4LINUX_CUSTOM_NEEDS_python:python
++ MENU:=1
++ PROVIDES:=lcd4linux
++ VARIANT=custom
++endef
++
++define Package/lcd4linux-custom/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/lcd4linux-custom/description
++$(call Package/lcd4linux/Default/description)
++ .
++ This package contains a customized version of LCD4Linux.
++endef
++
++
++define Package/lcd4linux-full
++$(call Package/lcd4linux/Default)
++ DEPENDS:= @DEVEL \
++ +libdbus \
++ +libgd \
++ $(if $(ICONV_FULL),+libiconv-full) \
++ +libmpdclient \
++ +libmysqlclient \
++ +libncurses \
++ +libsqlite3 \
++ +libusb-compat \
++# +libftdi \
++# +libX11 \
++# +python
++ PROVIDES:=lcd4linux
++ VARIANT=full
++endef
++
++define Package/lcd4linux-full/description
++$(call Package/lcd4linux/Default/description)
++ .
++ This package contains a version of LCD4Linux built with all supported
++ drivers and plugins.
++endef
++
++
++CONFIGURE_ARGS+= \
++ --disable-rpath \
++
++EXTRA_LDFLAGS+= -Wl,-rpath-link,$(STAGING_DIR)/usr/lib
++
++ifeq ($(BUILD_VARIANT),custom)
++
++ LCD4LINUX_CUSTOM_DRIVERS:= $(strip $(foreach c, $(LCD4LINUX_DRIVERS), \
++ $(if $(CONFIG_LCD4LINUX_CUSTOM_DRIVER_$(c)),$(c),) \
++ ))
++ ifeq ($(LCD4LINUX_CUSTOM_DRIVERS),)
++ LCD4LINUX_CUSTOM_DRIVERS:=Sample
++ endif
++
++ LCD4LINUX_CUSTOM_PLUGINS:= $(strip $(foreach c, $(LCD4LINUX_PLUGINS), \
++ $(if $(CONFIG_LCD4LINUX_CUSTOM_PLUGIN_$(c)),$(c)) \
++ ))
++ ifeq ($(LCD4LINUX_CUSTOM_PLUGINS),)
++ LCD4LINUX_CUSTOM_PLUGINS:=sample
++ endif
++
++ CONFIGURE_ARGS+= \
++ --with-drivers="$(LCD4LINUX_CUSTOM_DRIVERS)" \
++ --with-plugins="$(LCD4LINUX_CUSTOM_PLUGINS)" \
++
++ ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libiconv),)
++ CONFIGURE_ARGS+= --with-libiconv-prefix="$(ICONV_PREFIX)"
++ else
++ CONFIGURE_ARGS+= --without-libiconv-prefix
++ endif
++
++ ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libmysqlclient),)
++ EXTRA_LDFLAGS+= -L$(STAGING_DIR)/usr/lib/mysql
++ endif
++
++# ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_python),)
++# CONFIGURE_ARGS+= --with-python
++# else
++ CONFIGURE_ARGS+= --without-python
++# endif
++
++# ifneq ($(CONFIG_LCD4LINUX_CUSTOM_NEEDS_libX11),)
++# CONFIGURE_ARGS+= --with-x
++# else
++ CONFIGURE_ARGS+= --without-x
++# endif
++
++endif
++
++ifeq ($(BUILD_VARIANT),full)
++
++ LCD4LINUX_FULL_DRIVERS:= $(strip $(foreach c, $(LCD4LINUX_DRIVERS), \
++ $(c) \
++ ))
++
++ LCD4LINUX_FULL_PLUGINS:= $(strip $(foreach c, $(LCD4LINUX_PLUGINS), \
++ $(c) \
++ ))
++
++ CONFIGURE_ARGS+= \
++ --with-drivers="$(LCD4LINUX_FULL_DRIVERS)" \
++ --with-plugins="$(LCD4LINUX_FULL_PLUGINS)" \
++ --with-libiconv-prefix="$(ICONV_PREFIX)" \
++ --without-python \
++ --without-x \
++
++ EXTRA_LDFLAGS+= -L$(STAGING_DIR)/usr/lib/mysql
++
++endif
++
++
++define Package/lcd4linux/conffiles
++/etc/lcd4linux.conf
++endef
++
++define Package/lcd4linux/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/lcd4linux $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/lcd4linux.conf.sample $(1)/etc/lcd4linux.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/lcd4linux.init $(1)/etc/init.d/lcd4linux
++ $(SED) "s|^\(Display 'GLCD2USB'\)|#\1|g" \
++ -e "s|^\(Layout 'TestLayer'\)|#\1|g" \
++ -e "s|^#\(Display 'Image'\)|\1|g" \
++ -e "s|^#\(Layout 'Default'\)|\1|g" \
++ $(1)/etc/lcd4linux.conf
++endef
++
++Package/lcd4linux-custom/conffiles = $(Package/lcd4linux/conffiles)
++Package/lcd4linux-custom/install = $(Package/lcd4linux/install)
++
++Package/lcd4linux-full/conffiles = $(Package/lcd4linux/conffiles)
++Package/lcd4linux-full/install = $(Package/lcd4linux/install)
++
++$(eval $(call BuildPackage,lcd4linux-custom))
++$(eval $(call BuildPackage,lcd4linux-full))
+diff --git a/feeds/packages/utils/lcd4linux/files/lcd4linux.init b/feeds/packages/utils/lcd4linux/files/lcd4linux.init
+new file mode 100644
+index 0000000..25033f3
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/files/lcd4linux.init
+@@ -0,0 +1,15 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007-2015 OpenWrt.org
++
++START=98
++
++SERVICE_USE_PID=1
++
++start() {
++ service_start /usr/bin/lcd4linux -o /tmp/lcd4linux.png -q
++}
++
++stop() {
++ service_stop /usr/bin/lcd4linux
++}
++
+diff --git a/feeds/packages/utils/lcd4linux/patches/100-drv_RouterBoard.patch b/feeds/packages/utils/lcd4linux/patches/100-drv_RouterBoard.patch
+new file mode 100644
+index 0000000..9780f5a
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/patches/100-drv_RouterBoard.patch
+@@ -0,0 +1,11 @@
++--- a/drv_RouterBoard.c
+++++ b/drv_RouterBoard.c
++@@ -106,7 +106,7 @@
++ #include <string.h>
++ #include <errno.h>
++ #include <unistd.h>
++-#include <sys/io.h>
+++#include <asm/io.h>
++
++ #include "debug.h"
++ #include "cfg.h"
+diff --git a/feeds/packages/utils/lcd4linux/patches/110-uclibc-logarithm-fix.patch b/feeds/packages/utils/lcd4linux/patches/110-uclibc-logarithm-fix.patch
+new file mode 100644
+index 0000000..8f6d861
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/patches/110-uclibc-logarithm-fix.patch
+@@ -0,0 +1,11 @@
++--- a/plugin_netinfo.c
+++++ b/plugin_netinfo.c
++@@ -264,7 +264,7 @@ static void my_netmask_short(RESULT * re
++ sin = get_netmask(arg1);
++ if (NULL != sin) {
++ logval = (long double) (get_netmask(arg1)->sin_addr.s_addr);
++- netlen = (int) rint(log2l(logval) / log2l(2.0));
+++ netlen = (int) rint(log2f(logval) / log2f(2.0));
++ qprintf(value, sizeof(value), "/%d", netlen);
++ } else {
++ qprintf(value, sizeof(value), "/?");
+diff --git a/feeds/packages/utils/lcd4linux/patches/120-remove-as-needed-linker-option.patch b/feeds/packages/utils/lcd4linux/patches/120-remove-as-needed-linker-option.patch
+new file mode 100644
+index 0000000..b5e56fe
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/patches/120-remove-as-needed-linker-option.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -18,7 +18,7 @@ ACLOCAL_AMFLAGS=-I m4
++ # use this for lots of warnings
++ #AM_CFLAGS = -D_GNU_SOURCE -std=c99 -m64 -Wall -W -pedantic -Wno-variadic-macros -fno-strict-aliasing
++
++-lcd4linux_LDFLAGS ="-Wl,--as-needed"
+++lcd4linux_LDFLAGS =
++ lcd4linux_LDADD = @DRIVERS@ @PLUGINS@ @DRVLIBS@ @PLUGINLIBS@
++ lcd4linux_DEPENDENCIES = @DRIVERS@ @PLUGINS@
++
+diff --git a/feeds/packages/utils/lcd4linux/patches/140-no_repnop_T6963.patch b/feeds/packages/utils/lcd4linux/patches/140-no_repnop_T6963.patch
+new file mode 100644
+index 0000000..85be2c3
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/patches/140-no_repnop_T6963.patch
+@@ -0,0 +1,22 @@
++--- a/drv_T6963.c
+++++ b/drv_T6963.c
++@@ -114,7 +114,9 @@ static void drv_T6_status1(void)
++ /* wait for STA0=1 and STA1=1 */
++ n = 0;
++ do {
+++#if 0
++ rep_nop();
+++#endif
++ if (++n > 1000) {
++ debug("hang in status1");
++ bug = 1;
++@@ -150,7 +152,9 @@ static void drv_T6_status2(void)
++ /* wait for STA3=1 */
++ n = 0;
++ do {
+++#if 0
++ rep_nop();
+++#endif
++ if (++n > 1000) {
++ debug("hang in status2");
++ bug = 1;
+diff --git a/feeds/packages/utils/lcd4linux/patches/150-addlibmpdclient.patch b/feeds/packages/utils/lcd4linux/patches/150-addlibmpdclient.patch
+new file mode 100644
+index 0000000..0e51f67
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/patches/150-addlibmpdclient.patch
+@@ -0,0 +1,2624 @@
++--- /dev/null
+++++ b/libmpdclient.c
++@@ -0,0 +1,1957 @@
+++/* libmpdclient
+++ (c)2003-2006 by Warren Dukes (warren.dukes@gmail.com)
+++ This project's homepage is: http://www.musicpd.org
+++
+++ Redistribution and use in source and binary forms, with or without
+++ modification, are permitted provided that the following conditions
+++ are met:
+++
+++ - Redistributions of source code must retain the above copyright
+++ notice, this list of conditions and the following disclaimer.
+++
+++ - Redistributions in binary form must reproduce the above copyright
+++ notice, this list of conditions and the following disclaimer in the
+++ documentation and/or other materials provided with the distribution.
+++
+++ - Neither the name of the Music Player Daemon nor the names of its
+++ contributors may be used to endorse or promote products derived from
+++ this software without specific prior written permission.
+++
+++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+++ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+++ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+++ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
+++ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+++ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+++ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+++ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+++ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+++ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+++ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++*/
+++
+++#include "libmpdclient.h"
+++
+++#include <errno.h>
+++#include <ctype.h>
+++#include <sys/types.h>
+++#include <stdio.h>
+++#include <sys/param.h>
+++#include <string.h>
+++#include <unistd.h>
+++#include <stdlib.h>
+++#include <fcntl.h>
+++#include <limits.h>
+++
+++#ifdef WIN32
+++# include <ws2tcpip.h>
+++# include <winsock.h>
+++#else
+++# include <netinet/in.h>
+++# include <arpa/inet.h>
+++# include <sys/socket.h>
+++# include <netdb.h>
+++#endif
+++
+++/* (bits+1)/3 (plus the sign character) */
+++#define INTLEN ((sizeof(int) * CHAR_BIT + 1) / 3 + 1)
+++#define LONGLONGLEN ((sizeof(long long) * CHAR_BIT + 1) / 3 + 1)
+++
+++#define COMMAND_LIST 1
+++#define COMMAND_LIST_OK 2
+++
+++#ifndef MPD_NO_GAI
+++# ifdef AI_ADDRCONFIG
+++# define MPD_HAVE_GAI
+++# endif
+++#endif
+++
+++#ifndef MSG_DONTWAIT
+++# define MSG_DONTWAIT 0
+++#endif
+++
+++#ifdef WIN32
+++# define SELECT_ERRNO_IGNORE (errno == WSAEINTR || errno == WSAEINPROGRESS)
+++# define SENDRECV_ERRNO_IGNORE SELECT_ERRNO_IGNORE
+++#else
+++# define SELECT_ERRNO_IGNORE (errno == EINTR)
+++# define SENDRECV_ERRNO_IGNORE (errno == EINTR || errno == EAGAIN)
+++# define winsock_dll_error(c) 0
+++# define closesocket(s) close(s)
+++# define WSACleanup() do { /* nothing */ } while (0)
+++#endif
+++
+++#ifdef WIN32
+++static int winsock_dll_error(mpd_Connection * connection)
+++{
+++ WSADATA wsaData;
+++ if ((WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0 || LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
+++ strcpy(connection->errorStr, "Could not find usable WinSock DLL.");
+++ connection->error = MPD_ERROR_SYSTEM;
+++ return 1;
+++ }
+++ return 0;
+++}
+++
+++static int do_connect_fail(mpd_Connection * connection, const struct sockaddr *serv_addr, int addrlen)
+++{
+++ int iMode = 1; /* 0 = blocking, else non-blocking */
+++ ioctlsocket(connection->sock, FIONBIO, (u_long FAR *) & iMode);
+++ return (connect(connection->sock, serv_addr, addrlen) == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK);
+++}
+++#else /* !WIN32 (sane operating systems) */
+++static int do_connect_fail(mpd_Connection * connection, const struct sockaddr *serv_addr, int addrlen)
+++{
+++ int flags = fcntl(connection->sock, F_GETFL, 0);
+++ fcntl(connection->sock, F_SETFL, flags | O_NONBLOCK);
+++ return (connect(connection->sock, serv_addr, addrlen) < 0 && errno != EINPROGRESS);
+++}
+++#endif /* !WIN32 */
+++
+++#ifdef MPD_HAVE_GAI
+++static int mpd_connect(mpd_Connection * connection, const char *host, int port, float timeout)
+++{
+++ int error;
+++ char service[INTLEN + 1];
+++ struct addrinfo hints;
+++ struct addrinfo *res = NULL;
+++ struct addrinfo *addrinfo = NULL;
+++
+++ /**
+++ * Setup hints
+++ */
+++ hints.ai_flags = AI_ADDRCONFIG;
+++ hints.ai_family = PF_UNSPEC;
+++ hints.ai_socktype = SOCK_STREAM;
+++ hints.ai_protocol = IPPROTO_TCP;
+++ hints.ai_addrlen = 0;
+++ hints.ai_addr = NULL;
+++ hints.ai_canonname = NULL;
+++ hints.ai_next = NULL;
+++
+++ snprintf(service, sizeof(service), "%i", port);
+++
+++ error = getaddrinfo(host, service, &hints, &addrinfo);
+++
+++ if (error) {
+++ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "host \"%s\" not found: %s", host, gai_strerror(error));
+++ connection->error = MPD_ERROR_UNKHOST;
+++ return -1;
+++ }
+++
+++ for (res = addrinfo; res; res = res->ai_next) {
+++ /* create socket */
+++ connection->sock = socket(res->ai_family, SOCK_STREAM, res->ai_protocol);
+++ if (connection->sock < 0) {
+++ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "problems creating socket: %s", strerror(errno));
+++ connection->error = MPD_ERROR_SYSTEM;
+++ freeaddrinfo(addrinfo);
+++ return -1;
+++ }
+++
+++ mpd_setConnectionTimeout(connection, timeout);
+++
+++ /* connect stuff */
+++ if (do_connect_fail(connection, res->ai_addr, res->ai_addrlen)) {
+++ /* try the next address family */
+++ closesocket(connection->sock);
+++ connection->sock = -1;
+++ continue;
+++ }
+++ }
+++
+++ freeaddrinfo(addrinfo);
+++
+++ if (connection->sock < 0) {
+++ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH,
+++ "problems connecting to \"%s\" on port %i: %s", host, port, strerror(errno));
+++ connection->error = MPD_ERROR_CONNPORT;
+++
+++ return -1;
+++ }
+++
+++ return 0;
+++}
+++#else /* !MPD_HAVE_GAI */
+++static int mpd_connect(mpd_Connection * connection, const char *host, int port, float timeout)
+++{
+++ struct hostent *he;
+++ struct sockaddr *dest;
+++ int destlen;
+++ struct sockaddr_in sin;
+++
+++ if (!(he = gethostbyname(host))) {
+++ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "host \"%s\" not found", host);
+++ connection->error = MPD_ERROR_UNKHOST;
+++ return -1;
+++ }
+++
+++ memset(&sin, 0, sizeof(struct sockaddr_in));
+++ /*dest.sin_family = he->h_addrtype; */
+++ sin.sin_family = AF_INET;
+++ sin.sin_port = htons(port);
+++
+++ switch (he->h_addrtype) {
+++ case AF_INET:
+++ memcpy((char *) &sin.sin_addr.s_addr, (char *) he->h_addr, he->h_length);
+++ dest = (struct sockaddr *) &sin;
+++ destlen = sizeof(struct sockaddr_in);
+++ break;
+++ default:
+++ strcpy(connection->errorStr, "address type is not IPv4");
+++ connection->error = MPD_ERROR_SYSTEM;
+++ return -1;
+++ break;
+++ }
+++
+++ if ((connection->sock = socket(dest->sa_family, SOCK_STREAM, 0)) < 0) {
+++ strcpy(connection->errorStr, "problems creating socket");
+++ connection->error = MPD_ERROR_SYSTEM;
+++ return -1;
+++ }
+++
+++ mpd_setConnectionTimeout(connection, timeout);
+++
+++ /* connect stuff */
+++ if (do_connect_fail(connection, dest, destlen)) {
+++ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH,
+++ "problems connecting to \"%s\" on port" " %i", host, port);
+++ connection->error = MPD_ERROR_CONNPORT;
+++ return -1;
+++ }
+++
+++ return 0;
+++}
+++#endif /* !MPD_HAVE_GAI */
+++
+++char *mpdTagItemKeys[MPD_TAG_NUM_OF_ITEM_TYPES] = {
+++ "Artist",
+++ "Album",
+++ "Title",
+++ "Track",
+++ "Name",
+++ "Genre",
+++ "Date",
+++ "Composer",
+++ "Performer",
+++ "Comment",
+++ "Disc",
+++ "Filename",
+++ "Any"
+++};
+++
+++static char *mpd_sanitizeArg(const char *arg)
+++{
+++ size_t i;
+++ char *ret;
+++ register const char *c;
+++ register char *rc;
+++
+++ /* instead of counting in that loop above, just
+++ * use a bit more memory and half running time
+++ */
+++ ret = malloc(strlen(arg) * 2 + 1);
+++
+++ c = arg;
+++ rc = ret;
+++ for (i = strlen(arg) + 1; i != 0; --i) {
+++ if (*c == '"' || *c == '\\')
+++ *rc++ = '\\';
+++ *(rc++) = *(c++);
+++ }
+++
+++ return ret;
+++}
+++
+++static mpd_ReturnElement *mpd_newReturnElement(const char *name, const char *value)
+++{
+++ mpd_ReturnElement *ret = malloc(sizeof(mpd_ReturnElement));
+++
+++ ret->name = strdup(name);
+++ ret->value = strdup(value);
+++
+++ return ret;
+++}
+++
+++static void mpd_freeReturnElement(mpd_ReturnElement * re)
+++{
+++ free(re->name);
+++ free(re->value);
+++ free(re);
+++}
+++
+++void mpd_setConnectionTimeout(mpd_Connection * connection, float timeout)
+++{
+++ connection->timeout.tv_sec = (int) timeout;
+++ connection->timeout.tv_usec = (int) (timeout * 1e6 - connection->timeout.tv_sec * 1000000 + 0.5);
+++}
+++
+++static int mpd_parseWelcome(mpd_Connection * connection, const char *host, int port, char *rt, char *output)
+++{
+++ char *tmp;
+++ char *test;
+++ int i;
+++
+++ if (strncmp(output, MPD_WELCOME_MESSAGE, strlen(MPD_WELCOME_MESSAGE))) {
+++ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH,
+++ "mpd not running on port %i on host \"%s\"", port, host);
+++ connection->error = MPD_ERROR_NOTMPD;
+++ return 1;
+++ }
+++
+++ tmp = &output[strlen(MPD_WELCOME_MESSAGE)];
+++
+++ for (i = 0; i < 3; i++) {
+++ if (tmp)
+++ connection->version[i] = strtol(tmp, &test, 10);
+++
+++ if (!tmp || (test[0] != '.' && test[0] != '\0')) {
+++ snprintf(connection->errorStr,
+++ MPD_ERRORSTR_MAX_LENGTH,
+++ "error parsing version number at " "\"%s\"", &output[strlen(MPD_WELCOME_MESSAGE)]);
+++ connection->error = MPD_ERROR_NOTMPD;
+++ return 1;
+++ }
+++ tmp = ++test;
+++ }
+++
+++ return 0;
+++}
+++
+++mpd_Connection *mpd_newConnection(const char *host, int port, float timeout)
+++{
+++ int err;
+++ char *rt;
+++ char *output = NULL;
+++ mpd_Connection *connection = malloc(sizeof(mpd_Connection));
+++ struct timeval tv;
+++ fd_set fds;
+++ strcpy(connection->buffer, "");
+++ connection->buflen = 0;
+++ connection->bufstart = 0;
+++ strcpy(connection->errorStr, "");
+++ connection->error = 0;
+++ connection->doneProcessing = 0;
+++ connection->commandList = 0;
+++ connection->listOks = 0;
+++ connection->doneListOk = 0;
+++ connection->returnElement = NULL;
+++ connection->request = NULL;
+++
+++ if (winsock_dll_error(connection))
+++ return connection;
+++
+++ if (mpd_connect(connection, host, port, timeout) < 0)
+++ return connection;
+++
+++ while (!(rt = strstr(connection->buffer, "\n"))) {
+++ tv.tv_sec = connection->timeout.tv_sec;
+++ tv.tv_usec = connection->timeout.tv_usec;
+++ FD_ZERO(&fds);
+++ FD_SET(connection->sock, &fds);
+++ if ((err = select(connection->sock + 1, &fds, NULL, NULL, &tv)) == 1) {
+++ int readed;
+++ readed = recv(connection->sock,
+++ &(connection->buffer[connection->buflen]), MPD_BUFFER_MAX_LENGTH - connection->buflen, 0);
+++ if (readed <= 0) {
+++ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH,
+++ "problems getting a response from" " \"%s\" on port %i : %s", host, port, strerror(errno));
+++ connection->error = MPD_ERROR_NORESPONSE;
+++ return connection;
+++ }
+++ connection->buflen += readed;
+++ connection->buffer[connection->buflen] = '\0';
+++ } else if (err < 0) {
+++ if (SELECT_ERRNO_IGNORE)
+++ continue;
+++ snprintf(connection->errorStr,
+++ MPD_ERRORSTR_MAX_LENGTH, "problems connecting to \"%s\" on port" " %i", host, port);
+++ connection->error = MPD_ERROR_CONNPORT;
+++ return connection;
+++ } else {
+++ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH,
+++ "timeout in attempting to get a response from" " \"%s\" on port %i", host, port);
+++ connection->error = MPD_ERROR_NORESPONSE;
+++ return connection;
+++ }
+++ }
+++
+++ *rt = '\0';
+++ output = strdup(connection->buffer);
+++ strcpy(connection->buffer, rt + 1);
+++ connection->buflen = strlen(connection->buffer);
+++
+++ if (mpd_parseWelcome(connection, host, port, rt, output) == 0)
+++ connection->doneProcessing = 1;
+++
+++ free(output);
+++
+++ return connection;
+++}
+++
+++void mpd_clearError(mpd_Connection * connection)
+++{
+++ connection->error = 0;
+++ connection->errorStr[0] = '\0';
+++}
+++
+++void mpd_closeConnection(mpd_Connection * connection)
+++{
+++ closesocket(connection->sock);
+++ if (connection->returnElement)
+++ free(connection->returnElement);
+++ if (connection->request)
+++ free(connection->request);
+++ free(connection);
+++ WSACleanup();
+++}
+++
+++static void mpd_executeCommand(mpd_Connection * connection, char *command)
+++{
+++ int ret;
+++ struct timeval tv;
+++ fd_set fds;
+++ char *commandPtr = command;
+++ int commandLen = strlen(command);
+++
+++ if (!connection->doneProcessing && !connection->commandList) {
+++ strcpy(connection->errorStr, "not done processing current command");
+++ connection->error = 1;
+++ return;
+++ }
+++
+++ mpd_clearError(connection);
+++
+++ FD_ZERO(&fds);
+++ FD_SET(connection->sock, &fds);
+++ tv.tv_sec = connection->timeout.tv_sec;
+++ tv.tv_usec = connection->timeout.tv_usec;
+++
+++ while ((ret = select(connection->sock + 1, NULL, &fds, NULL, &tv) == 1) || (ret == -1 && SELECT_ERRNO_IGNORE)) {
+++ ret = send(connection->sock, commandPtr, commandLen, MSG_DONTWAIT);
+++ if (ret <= 0) {
+++ if (SENDRECV_ERRNO_IGNORE)
+++ continue;
+++ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "problems giving command \"%s\"", command);
+++ connection->error = MPD_ERROR_SENDING;
+++ return;
+++ } else {
+++ commandPtr += ret;
+++ commandLen -= ret;
+++ }
+++
+++ if (commandLen <= 0)
+++ break;
+++ }
+++
+++ if (commandLen > 0) {
+++ perror("");
+++ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "timeout sending command \"%s\"", command);
+++ connection->error = MPD_ERROR_TIMEOUT;
+++ return;
+++ }
+++
+++ if (!connection->commandList)
+++ connection->doneProcessing = 0;
+++ else if (connection->commandList == COMMAND_LIST_OK) {
+++ connection->listOks++;
+++ }
+++}
+++
+++static void mpd_getNextReturnElement(mpd_Connection * connection)
+++{
+++ char *output = NULL;
+++ char *rt = NULL;
+++ char *name = NULL;
+++ char *value = NULL;
+++ fd_set fds;
+++ struct timeval tv;
+++ char *tok = NULL;
+++ int readed;
+++ char *bufferCheck = NULL;
+++ int err;
+++ int pos;
+++
+++ if (connection->returnElement)
+++ mpd_freeReturnElement(connection->returnElement);
+++ connection->returnElement = NULL;
+++
+++ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
+++ strcpy(connection->errorStr, "already done processing current command");
+++ connection->error = 1;
+++ return;
+++ }
+++
+++ bufferCheck = connection->buffer + connection->bufstart;
+++ while (connection->bufstart >= connection->buflen || !(rt = strchr(bufferCheck, '\n'))) {
+++ if (connection->buflen >= MPD_BUFFER_MAX_LENGTH) {
+++ memmove(connection->buffer,
+++ connection->buffer + connection->bufstart, connection->buflen - connection->bufstart + 1);
+++ connection->buflen -= connection->bufstart;
+++ connection->bufstart = 0;
+++ }
+++ if (connection->buflen >= MPD_BUFFER_MAX_LENGTH) {
+++ strcpy(connection->errorStr, "buffer overrun");
+++ connection->error = MPD_ERROR_BUFFEROVERRUN;
+++ connection->doneProcessing = 1;
+++ connection->doneListOk = 0;
+++ return;
+++ }
+++ bufferCheck = connection->buffer + connection->buflen;
+++ tv.tv_sec = connection->timeout.tv_sec;
+++ tv.tv_usec = connection->timeout.tv_usec;
+++ FD_ZERO(&fds);
+++ FD_SET(connection->sock, &fds);
+++ if ((err = select(connection->sock + 1, &fds, NULL, NULL, &tv) == 1)) {
+++ readed = recv(connection->sock,
+++ connection->buffer + connection->buflen,
+++ MPD_BUFFER_MAX_LENGTH - connection->buflen, MSG_DONTWAIT);
+++ if (readed < 0 && SENDRECV_ERRNO_IGNORE) {
+++ continue;
+++ }
+++ if (readed <= 0) {
+++ strcpy(connection->errorStr, "connection" " closed");
+++ connection->error = MPD_ERROR_CONNCLOSED;
+++ connection->doneProcessing = 1;
+++ connection->doneListOk = 0;
+++ return;
+++ }
+++ connection->buflen += readed;
+++ connection->buffer[connection->buflen] = '\0';
+++ } else if (err < 0 && SELECT_ERRNO_IGNORE)
+++ continue;
+++ else {
+++ strcpy(connection->errorStr, "connection timeout");
+++ connection->error = MPD_ERROR_TIMEOUT;
+++ connection->doneProcessing = 1;
+++ connection->doneListOk = 0;
+++ return;
+++ }
+++ }
+++
+++ *rt = '\0';
+++ output = connection->buffer + connection->bufstart;
+++ connection->bufstart = rt - connection->buffer + 1;
+++
+++ if (strcmp(output, "OK") == 0) {
+++ if (connection->listOks > 0) {
+++ strcpy(connection->errorStr, "expected more list_OK's");
+++ connection->error = 1;
+++ }
+++ connection->listOks = 0;
+++ connection->doneProcessing = 1;
+++ connection->doneListOk = 0;
+++ return;
+++ }
+++
+++ if (strcmp(output, "list_OK") == 0) {
+++ if (!connection->listOks) {
+++ strcpy(connection->errorStr, "got an unexpected list_OK");
+++ connection->error = 1;
+++ } else {
+++ connection->doneListOk = 1;
+++ connection->listOks--;
+++ }
+++ return;
+++ }
+++
+++ if (strncmp(output, "ACK", strlen("ACK")) == 0) {
+++ char *test;
+++ char *needle;
+++ int val;
+++
+++ strcpy(connection->errorStr, output);
+++ connection->error = MPD_ERROR_ACK;
+++ connection->errorCode = MPD_ACK_ERROR_UNK;
+++ connection->errorAt = MPD_ERROR_AT_UNK;
+++ connection->doneProcessing = 1;
+++ connection->doneListOk = 0;
+++
+++ needle = strchr(output, '[');
+++ if (!needle)
+++ return;
+++ val = strtol(needle + 1, &test, 10);
+++ if (*test != '@')
+++ return;
+++ connection->errorCode = val;
+++ val = strtol(test + 1, &test, 10);
+++ if (*test != ']')
+++ return;
+++ connection->errorAt = val;
+++ return;
+++ }
+++
+++ tok = strchr(output, ':');
+++ if (!tok)
+++ return;
+++ pos = tok - output;
+++ value = ++tok;
+++ name = output;
+++ name[pos] = '\0';
+++
+++ if (value[0] == ' ') {
+++ connection->returnElement = mpd_newReturnElement(name, &(value[1]));
+++ } else {
+++ snprintf(connection->errorStr, MPD_ERRORSTR_MAX_LENGTH, "error parsing: %s:%s", name, value);
+++ connection->error = 1;
+++ }
+++}
+++
+++void mpd_finishCommand(mpd_Connection * connection)
+++{
+++ while (!connection->doneProcessing) {
+++ if (connection->doneListOk)
+++ connection->doneListOk = 0;
+++ mpd_getNextReturnElement(connection);
+++ }
+++}
+++
+++static void mpd_finishListOkCommand(mpd_Connection * connection)
+++{
+++ while (!connection->doneProcessing && connection->listOks && !connection->doneListOk) {
+++ mpd_getNextReturnElement(connection);
+++ }
+++}
+++
+++int mpd_nextListOkCommand(mpd_Connection * connection)
+++{
+++ mpd_finishListOkCommand(connection);
+++ if (!connection->doneProcessing)
+++ connection->doneListOk = 0;
+++ if (connection->listOks == 0 || connection->doneProcessing)
+++ return -1;
+++ return 0;
+++}
+++
+++void mpd_sendStatusCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "status\n");
+++}
+++
+++mpd_Status *mpd_getStatus(mpd_Connection * connection)
+++{
+++ mpd_Status *status;
+++
+++ /*mpd_executeCommand(connection,"status\n");
+++
+++ if(connection->error) return NULL; */
+++
+++ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
+++ return NULL;
+++ }
+++
+++ if (!connection->returnElement)
+++ mpd_getNextReturnElement(connection);
+++
+++ status = malloc(sizeof(mpd_Status));
+++ status->volume = -1;
+++ status->repeat = 0;
+++ status->random = 0;
+++ status->playlist = -1;
+++ status->playlistLength = -1;
+++ status->state = -1;
+++ status->song = 0;
+++ status->songid = 0;
+++ status->elapsedTime = 0;
+++ status->totalTime = 0;
+++ status->bitRate = 0;
+++ status->sampleRate = 0;
+++ status->bits = 0;
+++ status->channels = 0;
+++ status->crossfade = -1;
+++ status->error = NULL;
+++ status->updatingDb = 0;
+++
+++ if (connection->error) {
+++ free(status);
+++ return NULL;
+++ }
+++ while (connection->returnElement) {
+++ mpd_ReturnElement *re = connection->returnElement;
+++ if (strcmp(re->name, "volume") == 0) {
+++ status->volume = atoi(re->value);
+++ } else if (strcmp(re->name, "repeat") == 0) {
+++ status->repeat = atoi(re->value);
+++ } else if (strcmp(re->name, "random") == 0) {
+++ status->random = atoi(re->value);
+++ } else if (strcmp(re->name, "playlist") == 0) {
+++ status->playlist = strtol(re->value, NULL, 10);
+++ } else if (strcmp(re->name, "playlistlength") == 0) {
+++ status->playlistLength = atoi(re->value);
+++ } else if (strcmp(re->name, "bitrate") == 0) {
+++ status->bitRate = atoi(re->value);
+++ } else if (strcmp(re->name, "state") == 0) {
+++ if (strcmp(re->value, "play") == 0) {
+++ status->state = MPD_STATUS_STATE_PLAY;
+++ } else if (strcmp(re->value, "stop") == 0) {
+++ status->state = MPD_STATUS_STATE_STOP;
+++ } else if (strcmp(re->value, "pause") == 0) {
+++ status->state = MPD_STATUS_STATE_PAUSE;
+++ } else {
+++ status->state = MPD_STATUS_STATE_UNKNOWN;
+++ }
+++ } else if (strcmp(re->name, "song") == 0) {
+++ status->song = atoi(re->value);
+++ } else if (strcmp(re->name, "songid") == 0) {
+++ status->songid = atoi(re->value);
+++ } else if (strcmp(re->name, "time") == 0) {
+++ char *tok = strchr(re->value, ':');
+++ /* the second strchr below is a safety check */
+++ if (tok && (strchr(tok, 0) > (tok + 1))) {
+++ /* atoi stops at the first non-[0-9] char: */
+++ status->elapsedTime = atoi(re->value);
+++ status->totalTime = atoi(tok + 1);
+++ }
+++ } else if (strcmp(re->name, "error") == 0) {
+++ status->error = strdup(re->value);
+++ } else if (strcmp(re->name, "xfade") == 0) {
+++ status->crossfade = atoi(re->value);
+++ } else if (strcmp(re->name, "updating_db") == 0) {
+++ status->updatingDb = atoi(re->value);
+++ } else if (strcmp(re->name, "audio") == 0) {
+++ char *tok = strchr(re->value, ':');
+++ if (tok && (strchr(tok, 0) > (tok + 1))) {
+++ status->sampleRate = atoi(re->value);
+++ status->bits = atoi(++tok);
+++ tok = strchr(tok, ':');
+++ if (tok && (strchr(tok, 0) > (tok + 1)))
+++ status->channels = atoi(tok + 1);
+++ }
+++ }
+++
+++ mpd_getNextReturnElement(connection);
+++ if (connection->error) {
+++ free(status);
+++ return NULL;
+++ }
+++ }
+++
+++ if (connection->error) {
+++ free(status);
+++ return NULL;
+++ } else if (status->state < 0) {
+++ strcpy(connection->errorStr, "state not found");
+++ connection->error = 1;
+++ free(status);
+++ return NULL;
+++ }
+++
+++ return status;
+++}
+++
+++void mpd_freeStatus(mpd_Status * status)
+++{
+++ if (status->error)
+++ free(status->error);
+++ free(status);
+++}
+++
+++void mpd_sendStatsCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "stats\n");
+++}
+++
+++mpd_Stats *mpd_getStats(mpd_Connection * connection)
+++{
+++ mpd_Stats *stats;
+++
+++ /*mpd_executeCommand(connection,"stats\n");
+++
+++ if(connection->error) return NULL; */
+++
+++ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
+++ return NULL;
+++ }
+++
+++ if (!connection->returnElement)
+++ mpd_getNextReturnElement(connection);
+++
+++ stats = malloc(sizeof(mpd_Stats));
+++ stats->numberOfArtists = 0;
+++ stats->numberOfAlbums = 0;
+++ stats->numberOfSongs = 0;
+++ stats->uptime = 0;
+++ stats->dbUpdateTime = 0;
+++ stats->playTime = 0;
+++ stats->dbPlayTime = 0;
+++
+++ if (connection->error) {
+++ free(stats);
+++ return NULL;
+++ }
+++ while (connection->returnElement) {
+++ mpd_ReturnElement *re = connection->returnElement;
+++ if (strcmp(re->name, "artists") == 0) {
+++ stats->numberOfArtists = atoi(re->value);
+++ } else if (strcmp(re->name, "albums") == 0) {
+++ stats->numberOfAlbums = atoi(re->value);
+++ } else if (strcmp(re->name, "songs") == 0) {
+++ stats->numberOfSongs = atoi(re->value);
+++ } else if (strcmp(re->name, "uptime") == 0) {
+++ stats->uptime = strtol(re->value, NULL, 10);
+++ } else if (strcmp(re->name, "db_update") == 0) {
+++ stats->dbUpdateTime = strtol(re->value, NULL, 10);
+++ } else if (strcmp(re->name, "playtime") == 0) {
+++ stats->playTime = strtol(re->value, NULL, 10);
+++ } else if (strcmp(re->name, "db_playtime") == 0) {
+++ stats->dbPlayTime = strtol(re->value, NULL, 10);
+++ }
+++
+++ mpd_getNextReturnElement(connection);
+++ if (connection->error) {
+++ free(stats);
+++ return NULL;
+++ }
+++ }
+++
+++ if (connection->error) {
+++ free(stats);
+++ return NULL;
+++ }
+++
+++ return stats;
+++}
+++
+++void mpd_freeStats(mpd_Stats * stats)
+++{
+++ free(stats);
+++}
+++
+++mpd_SearchStats *mpd_getSearchStats(mpd_Connection * connection)
+++{
+++ mpd_SearchStats *stats;
+++ mpd_ReturnElement *re;
+++
+++ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
+++ return NULL;
+++ }
+++
+++ if (!connection->returnElement)
+++ mpd_getNextReturnElement(connection);
+++
+++ if (connection->error)
+++ return NULL;
+++
+++ stats = malloc(sizeof(mpd_SearchStats));
+++ stats->numberOfSongs = 0;
+++ stats->playTime = 0;
+++
+++ while (connection->returnElement) {
+++ re = connection->returnElement;
+++
+++ if (strcmp(re->name, "songs") == 0) {
+++ stats->numberOfSongs = atoi(re->value);
+++ } else if (strcmp(re->name, "playtime") == 0) {
+++ stats->playTime = strtol(re->value, NULL, 10);
+++ }
+++
+++ mpd_getNextReturnElement(connection);
+++ if (connection->error) {
+++ free(stats);
+++ return NULL;
+++ }
+++ }
+++
+++ if (connection->error) {
+++ free(stats);
+++ return NULL;
+++ }
+++
+++ return stats;
+++}
+++
+++void mpd_freeSearchStats(mpd_SearchStats * stats)
+++{
+++ free(stats);
+++}
+++
+++static void mpd_initSong(mpd_Song * song)
+++{
+++ song->file = NULL;
+++ song->artist = NULL;
+++ song->album = NULL;
+++ song->track = NULL;
+++ song->title = NULL;
+++ song->name = NULL;
+++ song->date = NULL;
+++ /* added by Qball */
+++ song->genre = NULL;
+++ song->composer = NULL;
+++ song->performer = NULL;
+++ song->disc = NULL;
+++ song->comment = NULL;
+++
+++ song->time = MPD_SONG_NO_TIME;
+++ song->pos = MPD_SONG_NO_NUM;
+++ song->id = MPD_SONG_NO_ID;
+++}
+++
+++static void mpd_finishSong(mpd_Song * song)
+++{
+++ if (song->file)
+++ free(song->file);
+++ if (song->artist)
+++ free(song->artist);
+++ if (song->album)
+++ free(song->album);
+++ if (song->title)
+++ free(song->title);
+++ if (song->track)
+++ free(song->track);
+++ if (song->name)
+++ free(song->name);
+++ if (song->date)
+++ free(song->date);
+++ if (song->genre)
+++ free(song->genre);
+++ if (song->composer)
+++ free(song->composer);
+++ if (song->disc)
+++ free(song->disc);
+++ if (song->comment)
+++ free(song->comment);
+++}
+++
+++mpd_Song *mpd_newSong(void)
+++{
+++ mpd_Song *ret = malloc(sizeof(mpd_Song));
+++
+++ mpd_initSong(ret);
+++
+++ return ret;
+++}
+++
+++void mpd_freeSong(mpd_Song * song)
+++{
+++ mpd_finishSong(song);
+++ free(song);
+++}
+++
+++mpd_Song *mpd_songDup(mpd_Song * song)
+++{
+++ mpd_Song *ret = mpd_newSong();
+++
+++ if (song->file)
+++ ret->file = strdup(song->file);
+++ if (song->artist)
+++ ret->artist = strdup(song->artist);
+++ if (song->album)
+++ ret->album = strdup(song->album);
+++ if (song->title)
+++ ret->title = strdup(song->title);
+++ if (song->track)
+++ ret->track = strdup(song->track);
+++ if (song->name)
+++ ret->name = strdup(song->name);
+++ if (song->date)
+++ ret->date = strdup(song->date);
+++ if (song->genre)
+++ ret->genre = strdup(song->genre);
+++ if (song->composer)
+++ ret->composer = strdup(song->composer);
+++ if (song->disc)
+++ ret->disc = strdup(song->disc);
+++ if (song->comment)
+++ ret->comment = strdup(song->comment);
+++ ret->time = song->time;
+++ ret->pos = song->pos;
+++ ret->id = song->id;
+++
+++ return ret;
+++}
+++
+++static void mpd_initDirectory(mpd_Directory * directory)
+++{
+++ directory->path = NULL;
+++}
+++
+++static void mpd_finishDirectory(mpd_Directory * directory)
+++{
+++ if (directory->path)
+++ free(directory->path);
+++}
+++
+++mpd_Directory *mpd_newDirectory(void)
+++{
+++ mpd_Directory *directory = malloc(sizeof(mpd_Directory));;
+++
+++ mpd_initDirectory(directory);
+++
+++ return directory;
+++}
+++
+++void mpd_freeDirectory(mpd_Directory * directory)
+++{
+++ mpd_finishDirectory(directory);
+++
+++ free(directory);
+++}
+++
+++mpd_Directory *mpd_directoryDup(mpd_Directory * directory)
+++{
+++ mpd_Directory *ret = mpd_newDirectory();
+++
+++ if (directory->path)
+++ ret->path = strdup(directory->path);
+++
+++ return ret;
+++}
+++
+++static void mpd_initPlaylistFile(mpd_PlaylistFile * playlist)
+++{
+++ playlist->path = NULL;
+++}
+++
+++static void mpd_finishPlaylistFile(mpd_PlaylistFile * playlist)
+++{
+++ if (playlist->path)
+++ free(playlist->path);
+++}
+++
+++mpd_PlaylistFile *mpd_newPlaylistFile(void)
+++{
+++ mpd_PlaylistFile *playlist = malloc(sizeof(mpd_PlaylistFile));
+++
+++ mpd_initPlaylistFile(playlist);
+++
+++ return playlist;
+++}
+++
+++void mpd_freePlaylistFile(mpd_PlaylistFile * playlist)
+++{
+++ mpd_finishPlaylistFile(playlist);
+++ free(playlist);
+++}
+++
+++mpd_PlaylistFile *mpd_playlistFileDup(mpd_PlaylistFile * playlist)
+++{
+++ mpd_PlaylistFile *ret = mpd_newPlaylistFile();
+++
+++ if (playlist->path)
+++ ret->path = strdup(playlist->path);
+++
+++ return ret;
+++}
+++
+++static void mpd_initInfoEntity(mpd_InfoEntity * entity)
+++{
+++ entity->info.directory = NULL;
+++}
+++
+++static void mpd_finishInfoEntity(mpd_InfoEntity * entity)
+++{
+++ if (entity->info.directory) {
+++ if (entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) {
+++ mpd_freeDirectory(entity->info.directory);
+++ } else if (entity->type == MPD_INFO_ENTITY_TYPE_SONG) {
+++ mpd_freeSong(entity->info.song);
+++ } else if (entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) {
+++ mpd_freePlaylistFile(entity->info.playlistFile);
+++ }
+++ }
+++}
+++
+++mpd_InfoEntity *mpd_newInfoEntity(void)
+++{
+++ mpd_InfoEntity *entity = malloc(sizeof(mpd_InfoEntity));
+++
+++ mpd_initInfoEntity(entity);
+++
+++ return entity;
+++}
+++
+++void mpd_freeInfoEntity(mpd_InfoEntity * entity)
+++{
+++ mpd_finishInfoEntity(entity);
+++ free(entity);
+++}
+++
+++static void mpd_sendInfoCommand(mpd_Connection * connection, char *command)
+++{
+++ mpd_executeCommand(connection, command);
+++}
+++
+++mpd_InfoEntity *mpd_getNextInfoEntity(mpd_Connection * connection)
+++{
+++ mpd_InfoEntity *entity = NULL;
+++
+++ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
+++ return NULL;
+++ }
+++
+++ if (!connection->returnElement)
+++ mpd_getNextReturnElement(connection);
+++
+++ if (connection->returnElement) {
+++ if (strcmp(connection->returnElement->name, "file") == 0) {
+++ entity = mpd_newInfoEntity();
+++ entity->type = MPD_INFO_ENTITY_TYPE_SONG;
+++ entity->info.song = mpd_newSong();
+++ entity->info.song->file = strdup(connection->returnElement->value);
+++ } else if (strcmp(connection->returnElement->name, "directory") == 0) {
+++ entity = mpd_newInfoEntity();
+++ entity->type = MPD_INFO_ENTITY_TYPE_DIRECTORY;
+++ entity->info.directory = mpd_newDirectory();
+++ entity->info.directory->path = strdup(connection->returnElement->value);
+++ } else if (strcmp(connection->returnElement->name, "playlist") == 0) {
+++ entity = mpd_newInfoEntity();
+++ entity->type = MPD_INFO_ENTITY_TYPE_PLAYLISTFILE;
+++ entity->info.playlistFile = mpd_newPlaylistFile();
+++ entity->info.playlistFile->path = strdup(connection->returnElement->value);
+++ } else if (strcmp(connection->returnElement->name, "cpos") == 0) {
+++ entity = mpd_newInfoEntity();
+++ entity->type = MPD_INFO_ENTITY_TYPE_SONG;
+++ entity->info.song = mpd_newSong();
+++ entity->info.song->pos = atoi(connection->returnElement->value);
+++ } else {
+++ connection->error = 1;
+++ strcpy(connection->errorStr, "problem parsing song info");
+++ return NULL;
+++ }
+++ } else
+++ return NULL;
+++
+++ mpd_getNextReturnElement(connection);
+++ while (connection->returnElement) {
+++ mpd_ReturnElement *re = connection->returnElement;
+++
+++ if (strcmp(re->name, "file") == 0)
+++ return entity;
+++ else if (strcmp(re->name, "directory") == 0)
+++ return entity;
+++ else if (strcmp(re->name, "playlist") == 0)
+++ return entity;
+++ else if (strcmp(re->name, "cpos") == 0)
+++ return entity;
+++
+++ if (entity->type == MPD_INFO_ENTITY_TYPE_SONG && strlen(re->value)) {
+++ if (!entity->info.song->artist && strcmp(re->name, "Artist") == 0) {
+++ entity->info.song->artist = strdup(re->value);
+++ } else if (!entity->info.song->album && strcmp(re->name, "Album") == 0) {
+++ entity->info.song->album = strdup(re->value);
+++ } else if (!entity->info.song->title && strcmp(re->name, "Title") == 0) {
+++ entity->info.song->title = strdup(re->value);
+++ } else if (!entity->info.song->track && strcmp(re->name, "Track") == 0) {
+++ entity->info.song->track = strdup(re->value);
+++ } else if (!entity->info.song->name && strcmp(re->name, "Name") == 0) {
+++ entity->info.song->name = strdup(re->value);
+++ } else if (entity->info.song->time == MPD_SONG_NO_TIME && strcmp(re->name, "Time") == 0) {
+++ entity->info.song->time = atoi(re->value);
+++ } else if (entity->info.song->pos == MPD_SONG_NO_NUM && strcmp(re->name, "Pos") == 0) {
+++ entity->info.song->pos = atoi(re->value);
+++ } else if (entity->info.song->id == MPD_SONG_NO_ID && strcmp(re->name, "Id") == 0) {
+++ entity->info.song->id = atoi(re->value);
+++ } else if (!entity->info.song->date && strcmp(re->name, "Date") == 0) {
+++ entity->info.song->date = strdup(re->value);
+++ } else if (!entity->info.song->genre && strcmp(re->name, "Genre") == 0) {
+++ entity->info.song->genre = strdup(re->value);
+++ } else if (!entity->info.song->composer && strcmp(re->name, "Composer") == 0) {
+++ entity->info.song->composer = strdup(re->value);
+++ } else if (!entity->info.song->performer && strcmp(re->name, "Performer") == 0) {
+++ entity->info.song->performer = strdup(re->value);
+++ } else if (!entity->info.song->disc && strcmp(re->name, "Disc") == 0) {
+++ entity->info.song->disc = strdup(re->value);
+++ } else if (!entity->info.song->comment && strcmp(re->name, "Comment") == 0) {
+++ entity->info.song->comment = strdup(re->value);
+++ }
+++ } else if (entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) {
+++ } else if (entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) {
+++ }
+++
+++ mpd_getNextReturnElement(connection);
+++ }
+++
+++ return entity;
+++}
+++
+++static char *mpd_getNextReturnElementNamed(mpd_Connection * connection, const char *name)
+++{
+++ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
+++ return NULL;
+++ }
+++
+++ mpd_getNextReturnElement(connection);
+++ while (connection->returnElement) {
+++ mpd_ReturnElement *re = connection->returnElement;
+++
+++ if (strcmp(re->name, name) == 0)
+++ return strdup(re->value);
+++ mpd_getNextReturnElement(connection);
+++ }
+++
+++ return NULL;
+++}
+++
+++char *mpd_getNextTag(mpd_Connection * connection, int type)
+++{
+++ if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES || type == MPD_TAG_ITEM_ANY)
+++ return NULL;
+++ if (type == MPD_TAG_ITEM_FILENAME)
+++ return mpd_getNextReturnElementNamed(connection, "file");
+++ return mpd_getNextReturnElementNamed(connection, mpdTagItemKeys[type]);
+++}
+++
+++char *mpd_getNextArtist(mpd_Connection * connection)
+++{
+++ return mpd_getNextReturnElementNamed(connection, "Artist");
+++}
+++
+++char *mpd_getNextAlbum(mpd_Connection * connection)
+++{
+++ return mpd_getNextReturnElementNamed(connection, "Album");
+++}
+++
+++void mpd_sendPlaylistInfoCommand(mpd_Connection * connection, int songPos)
+++{
+++ int len = strlen("playlistinfo") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "playlistinfo \"%i\"\n", songPos);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendPlaylistIdCommand(mpd_Connection * connection, int id)
+++{
+++ int len = strlen("playlistid") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "playlistid \"%i\"\n", id);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendPlChangesCommand(mpd_Connection * connection, long long playlist)
+++{
+++ int len = strlen("plchanges") + 2 + LONGLONGLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "plchanges \"%lld\"\n", playlist);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendPlChangesPosIdCommand(mpd_Connection * connection, long long playlist)
+++{
+++ int len = strlen("plchangesposid") + 2 + LONGLONGLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "plchangesposid \"%lld\"\n", playlist);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendListallCommand(mpd_Connection * connection, const char *dir)
+++{
+++ char *sDir = mpd_sanitizeArg(dir);
+++ int len = strlen("listall") + 2 + strlen(sDir) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "listall \"%s\"\n", sDir);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++ free(sDir);
+++}
+++
+++void mpd_sendListallInfoCommand(mpd_Connection * connection, const char *dir)
+++{
+++ char *sDir = mpd_sanitizeArg(dir);
+++ int len = strlen("listallinfo") + 2 + strlen(sDir) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "listallinfo \"%s\"\n", sDir);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++ free(sDir);
+++}
+++
+++void mpd_sendLsInfoCommand(mpd_Connection * connection, const char *dir)
+++{
+++ char *sDir = mpd_sanitizeArg(dir);
+++ int len = strlen("lsinfo") + 2 + strlen(sDir) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "lsinfo \"%s\"\n", sDir);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++ free(sDir);
+++}
+++
+++void mpd_sendCurrentSongCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "currentsong\n");
+++}
+++
+++void mpd_sendSearchCommand(mpd_Connection * connection, int table, const char *str)
+++{
+++ mpd_startSearch(connection, 0);
+++ mpd_addConstraintSearch(connection, table, str);
+++ mpd_commitSearch(connection);
+++}
+++
+++void mpd_sendFindCommand(mpd_Connection * connection, int table, const char *str)
+++{
+++ mpd_startSearch(connection, 1);
+++ mpd_addConstraintSearch(connection, table, str);
+++ mpd_commitSearch(connection);
+++}
+++
+++void mpd_sendListCommand(mpd_Connection * connection, int table, const char *arg1)
+++{
+++ char st[10];
+++ int len;
+++ char *string;
+++ if (table == MPD_TABLE_ARTIST)
+++ strcpy(st, "artist");
+++ else if (table == MPD_TABLE_ALBUM)
+++ strcpy(st, "album");
+++ else {
+++ connection->error = 1;
+++ strcpy(connection->errorStr, "unknown table for list");
+++ return;
+++ }
+++ if (arg1) {
+++ char *sanitArg1 = mpd_sanitizeArg(arg1);
+++ len = strlen("list") + 1 + strlen(sanitArg1) + 2 + strlen(st) + 3;
+++ string = malloc(len);
+++ snprintf(string, len, "list %s \"%s\"\n", st, sanitArg1);
+++ free(sanitArg1);
+++ } else {
+++ len = strlen("list") + 1 + strlen(st) + 2;
+++ string = malloc(len);
+++ snprintf(string, len, "list %s\n", st);
+++ }
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendAddCommand(mpd_Connection * connection, const char *file)
+++{
+++ char *sFile = mpd_sanitizeArg(file);
+++ int len = strlen("add") + 2 + strlen(sFile) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "add \"%s\"\n", sFile);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++ free(sFile);
+++}
+++
+++int mpd_sendAddIdCommand(mpd_Connection * connection, const char *file)
+++{
+++ int retval = -1;
+++ char *sFile = mpd_sanitizeArg(file);
+++ int len = strlen("addid") + 2 + strlen(sFile) + 3;
+++ char *string = malloc(len);
+++
+++ snprintf(string, len, "addid \"%s\"\n", sFile);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++ free(sFile);
+++
+++ string = mpd_getNextReturnElementNamed(connection, "Id");
+++ if (string) {
+++ retval = atoi(string);
+++ free(string);
+++ }
+++
+++ return retval;
+++}
+++
+++void mpd_sendDeleteCommand(mpd_Connection * connection, int songPos)
+++{
+++ int len = strlen("delete") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "delete \"%i\"\n", songPos);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendDeleteIdCommand(mpd_Connection * connection, int id)
+++{
+++ int len = strlen("deleteid") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "deleteid \"%i\"\n", id);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendSaveCommand(mpd_Connection * connection, const char *name)
+++{
+++ char *sName = mpd_sanitizeArg(name);
+++ int len = strlen("save") + 2 + strlen(sName) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "save \"%s\"\n", sName);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++ free(sName);
+++}
+++
+++void mpd_sendLoadCommand(mpd_Connection * connection, const char *name)
+++{
+++ char *sName = mpd_sanitizeArg(name);
+++ int len = strlen("load") + 2 + strlen(sName) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "load \"%s\"\n", sName);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++ free(sName);
+++}
+++
+++void mpd_sendRmCommand(mpd_Connection * connection, const char *name)
+++{
+++ char *sName = mpd_sanitizeArg(name);
+++ int len = strlen("rm") + 2 + strlen(sName) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "rm \"%s\"\n", sName);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++ free(sName);
+++}
+++
+++void mpd_sendRenameCommand(mpd_Connection * connection, const char *from, const char *to)
+++{
+++ char *sFrom = mpd_sanitizeArg(from);
+++ char *sTo = mpd_sanitizeArg(to);
+++ int len = strlen("rename") + 2 + strlen(sFrom) + 3 + strlen(sTo) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "rename \"%s\" \"%s\"\n", sFrom, sTo);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++ free(sFrom);
+++ free(sTo);
+++}
+++
+++void mpd_sendShuffleCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "shuffle\n");
+++}
+++
+++void mpd_sendClearCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "clear\n");
+++}
+++
+++void mpd_sendPlayCommand(mpd_Connection * connection, int songPos)
+++{
+++ int len = strlen("play") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "play \"%i\"\n", songPos);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendPlayIdCommand(mpd_Connection * connection, int id)
+++{
+++ int len = strlen("playid") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "playid \"%i\"\n", id);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendStopCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "stop\n");
+++}
+++
+++void mpd_sendPauseCommand(mpd_Connection * connection, int pauseMode)
+++{
+++ int len = strlen("pause") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "pause \"%i\"\n", pauseMode);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendNextCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "next\n");
+++}
+++
+++void mpd_sendMoveCommand(mpd_Connection * connection, int from, int to)
+++{
+++ int len = strlen("move") + 2 + INTLEN + 3 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "move \"%i\" \"%i\"\n", from, to);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendMoveIdCommand(mpd_Connection * connection, int id, int to)
+++{
+++ int len = strlen("moveid") + 2 + INTLEN + 3 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "moveid \"%i\" \"%i\"\n", id, to);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendSwapCommand(mpd_Connection * connection, int song1, int song2)
+++{
+++ int len = strlen("swap") + 2 + INTLEN + 3 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "swap \"%i\" \"%i\"\n", song1, song2);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendSwapIdCommand(mpd_Connection * connection, int id1, int id2)
+++{
+++ int len = strlen("swapid") + 2 + INTLEN + 3 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "swapid \"%i\" \"%i\"\n", id1, id2);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendSeekCommand(mpd_Connection * connection, int song, int time)
+++{
+++ int len = strlen("seek") + 2 + INTLEN + 3 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "seek \"%i\" \"%i\"\n", song, time);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendSeekIdCommand(mpd_Connection * connection, int id, int time)
+++{
+++ int len = strlen("seekid") + 2 + INTLEN + 3 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "seekid \"%i\" \"%i\"\n", id, time);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendUpdateCommand(mpd_Connection * connection, char *path)
+++{
+++ char *sPath = mpd_sanitizeArg(path);
+++ int len = strlen("update") + 2 + strlen(sPath) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "update \"%s\"\n", sPath);
+++ mpd_sendInfoCommand(connection, string);
+++ free(string);
+++ free(sPath);
+++}
+++
+++int mpd_getUpdateId(mpd_Connection * connection)
+++{
+++ char *jobid;
+++ int ret = 0;
+++
+++ jobid = mpd_getNextReturnElementNamed(connection, "updating_db");
+++ if (jobid) {
+++ ret = atoi(jobid);
+++ free(jobid);
+++ }
+++
+++ return ret;
+++}
+++
+++void mpd_sendPrevCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "previous\n");
+++}
+++
+++void mpd_sendRepeatCommand(mpd_Connection * connection, int repeatMode)
+++{
+++ int len = strlen("repeat") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "repeat \"%i\"\n", repeatMode);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode)
+++{
+++ int len = strlen("random") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "random \"%i\"\n", randomMode);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange)
+++{
+++ int len = strlen("setvol") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "setvol \"%i\"\n", volumeChange);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendVolumeCommand(mpd_Connection * connection, int volumeChange)
+++{
+++ int len = strlen("volume") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "volume \"%i\"\n", volumeChange);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendCrossfadeCommand(mpd_Connection * connection, int seconds)
+++{
+++ int len = strlen("crossfade") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "crossfade \"%i\"\n", seconds);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendPasswordCommand(mpd_Connection * connection, const char *pass)
+++{
+++ char *sPass = mpd_sanitizeArg(pass);
+++ int len = strlen("password") + 2 + strlen(sPass) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "password \"%s\"\n", sPass);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++ free(sPass);
+++}
+++
+++void mpd_sendCommandListBegin(mpd_Connection * connection)
+++{
+++ if (connection->commandList) {
+++ strcpy(connection->errorStr, "already in command list mode");
+++ connection->error = 1;
+++ return;
+++ }
+++ connection->commandList = COMMAND_LIST;
+++ mpd_executeCommand(connection, "command_list_begin\n");
+++}
+++
+++void mpd_sendCommandListOkBegin(mpd_Connection * connection)
+++{
+++ if (connection->commandList) {
+++ strcpy(connection->errorStr, "already in command list mode");
+++ connection->error = 1;
+++ return;
+++ }
+++ connection->commandList = COMMAND_LIST_OK;
+++ mpd_executeCommand(connection, "command_list_ok_begin\n");
+++ connection->listOks = 0;
+++}
+++
+++void mpd_sendCommandListEnd(mpd_Connection * connection)
+++{
+++ if (!connection->commandList) {
+++ strcpy(connection->errorStr, "not in command list mode");
+++ connection->error = 1;
+++ return;
+++ }
+++ connection->commandList = 0;
+++ mpd_executeCommand(connection, "command_list_end\n");
+++}
+++
+++void mpd_sendOutputsCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "outputs\n");
+++}
+++
+++mpd_OutputEntity *mpd_getNextOutput(mpd_Connection * connection)
+++{
+++ mpd_OutputEntity *output = NULL;
+++
+++ if (connection->doneProcessing || (connection->listOks && connection->doneListOk)) {
+++ return NULL;
+++ }
+++
+++ if (connection->error)
+++ return NULL;
+++
+++ output = malloc(sizeof(mpd_OutputEntity));
+++ output->id = -10;
+++ output->name = NULL;
+++ output->enabled = 0;
+++
+++ if (!connection->returnElement)
+++ mpd_getNextReturnElement(connection);
+++
+++ while (connection->returnElement) {
+++ mpd_ReturnElement *re = connection->returnElement;
+++ if (strcmp(re->name, "outputid") == 0) {
+++ if (output != NULL && output->id >= 0)
+++ return output;
+++ output->id = atoi(re->value);
+++ } else if (strcmp(re->name, "outputname") == 0) {
+++ output->name = strdup(re->value);
+++ } else if (strcmp(re->name, "outputenabled") == 0) {
+++ output->enabled = atoi(re->value);
+++ }
+++
+++ mpd_getNextReturnElement(connection);
+++ if (connection->error) {
+++ free(output);
+++ return NULL;
+++ }
+++
+++ }
+++
+++ return output;
+++}
+++
+++void mpd_sendEnableOutputCommand(mpd_Connection * connection, int outputId)
+++{
+++ int len = strlen("enableoutput") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "enableoutput \"%i\"\n", outputId);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_sendDisableOutputCommand(mpd_Connection * connection, int outputId)
+++{
+++ int len = strlen("disableoutput") + 2 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "disableoutput \"%i\"\n", outputId);
+++ mpd_executeCommand(connection, string);
+++ free(string);
+++}
+++
+++void mpd_freeOutputElement(mpd_OutputEntity * output)
+++{
+++ free(output->name);
+++ free(output);
+++}
+++
+++/**
+++ * mpd_sendNotCommandsCommand
+++ * odd naming, but it gets the not allowed commands
+++ */
+++
+++void mpd_sendNotCommandsCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "notcommands\n");
+++}
+++
+++/**
+++ * mpd_sendCommandsCommand
+++ * odd naming, but it gets the allowed commands
+++ */
+++void mpd_sendCommandsCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "commands\n");
+++}
+++
+++/**
+++ * Get the next returned command
+++ */
+++char *mpd_getNextCommand(mpd_Connection * connection)
+++{
+++ return mpd_getNextReturnElementNamed(connection, "command");
+++}
+++
+++void mpd_sendUrlHandlersCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "urlhandlers\n");
+++}
+++
+++char *mpd_getNextHandler(mpd_Connection * connection)
+++{
+++ return mpd_getNextReturnElementNamed(connection, "handler");
+++}
+++
+++void mpd_sendTagTypesCommand(mpd_Connection * connection)
+++{
+++ mpd_executeCommand(connection, "tagtypes\n");
+++}
+++
+++char *mpd_getNextTagType(mpd_Connection * connection)
+++{
+++ return mpd_getNextReturnElementNamed(connection, "tagtype");
+++}
+++
+++void mpd_startSearch(mpd_Connection * connection, int exact)
+++{
+++ if (connection->request) {
+++ strcpy(connection->errorStr, "search already in progress");
+++ connection->error = 1;
+++ return;
+++ }
+++
+++ if (exact)
+++ connection->request = strdup("find");
+++ else
+++ connection->request = strdup("search");
+++}
+++
+++void mpd_startStatsSearch(mpd_Connection * connection)
+++{
+++ if (connection->request) {
+++ strcpy(connection->errorStr, "search already in progress");
+++ connection->error = 1;
+++ return;
+++ }
+++
+++ connection->request = strdup("count");
+++}
+++
+++void mpd_startPlaylistSearch(mpd_Connection * connection, int exact)
+++{
+++ if (connection->request) {
+++ strcpy(connection->errorStr, "search already in progress");
+++ connection->error = 1;
+++ return;
+++ }
+++
+++ if (exact)
+++ connection->request = strdup("playlistfind");
+++ else
+++ connection->request = strdup("playlistsearch");
+++}
+++
+++void mpd_startFieldSearch(mpd_Connection * connection, int type)
+++{
+++ char *strtype;
+++ int len;
+++
+++ if (connection->request) {
+++ strcpy(connection->errorStr, "search already in progress");
+++ connection->error = 1;
+++ return;
+++ }
+++
+++ if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES) {
+++ strcpy(connection->errorStr, "invalid type specified");
+++ connection->error = 1;
+++ return;
+++ }
+++
+++ strtype = mpdTagItemKeys[type];
+++
+++ len = 5 + strlen(strtype) + 1;
+++ connection->request = malloc(len);
+++
+++ snprintf(connection->request, len, "list %c%s", tolower(strtype[0]), strtype + 1);
+++}
+++
+++void mpd_addConstraintSearch(mpd_Connection * connection, int type, const char *name)
+++{
+++ char *strtype;
+++ char *arg;
+++ int len;
+++ char *string;
+++
+++ if (!connection->request) {
+++ strcpy(connection->errorStr, "no search in progress");
+++ connection->error = 1;
+++ return;
+++ }
+++
+++ if (type < 0 || type >= MPD_TAG_NUM_OF_ITEM_TYPES) {
+++ strcpy(connection->errorStr, "invalid type specified");
+++ connection->error = 1;
+++ return;
+++ }
+++
+++ if (name == NULL) {
+++ strcpy(connection->errorStr, "no name specified");
+++ connection->error = 1;
+++ return;
+++ }
+++
+++ string = strdup(connection->request);
+++ strtype = mpdTagItemKeys[type];
+++ arg = mpd_sanitizeArg(name);
+++
+++ len = strlen(string) + 1 + strlen(strtype) + 2 + strlen(arg) + 2;
+++ connection->request = realloc(connection->request, len);
+++ snprintf(connection->request, len, "%s %c%s \"%s\"", string, tolower(strtype[0]), strtype + 1, arg);
+++
+++ free(string);
+++ free(arg);
+++}
+++
+++void mpd_commitSearch(mpd_Connection * connection)
+++{
+++ int len;
+++
+++ if (!connection->request) {
+++ strcpy(connection->errorStr, "no search in progress");
+++ connection->error = 1;
+++ return;
+++ }
+++
+++ len = strlen(connection->request) + 2;
+++ connection->request = realloc(connection->request, len);
+++ connection->request[len - 2] = '\n';
+++ connection->request[len - 1] = '\0';
+++ mpd_sendInfoCommand(connection, connection->request);
+++
+++ free(connection->request);
+++ connection->request = NULL;
+++}
+++
+++/**
+++ * @param connection a MpdConnection
+++ * @param path the path to the playlist.
+++ *
+++ * List the content, with full metadata, of a stored playlist.
+++ *
+++ */
+++void mpd_sendListPlaylistInfoCommand(mpd_Connection * connection, char *path)
+++{
+++ char *arg = mpd_sanitizeArg(path);
+++ int len = strlen("listplaylistinfo") + 2 + strlen(arg) + 3;
+++ char *query = malloc(len);
+++ snprintf(query, len, "listplaylistinfo \"%s\"\n", arg);
+++ mpd_sendInfoCommand(connection, query);
+++ free(arg);
+++ free(query);
+++}
+++
+++/**
+++ * @param connection a MpdConnection
+++ * @param path the path to the playlist.
+++ *
+++ * List the content of a stored playlist.
+++ *
+++ */
+++void mpd_sendListPlaylistCommand(mpd_Connection * connection, char *path)
+++{
+++ char *arg = mpd_sanitizeArg(path);
+++ int len = strlen("listplaylist") + 2 + strlen(arg) + 3;
+++ char *query = malloc(len);
+++ snprintf(query, len, "listplaylist \"%s\"\n", arg);
+++ mpd_sendInfoCommand(connection, query);
+++ free(arg);
+++ free(query);
+++}
+++
+++void mpd_sendPlaylistClearCommand(mpd_Connection * connection, char *path)
+++{
+++ char *sPath = mpd_sanitizeArg(path);
+++ int len = strlen("playlistclear") + 2 + strlen(sPath) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "playlistclear \"%s\"\n", sPath);
+++ mpd_executeCommand(connection, string);
+++ free(sPath);
+++ free(string);
+++}
+++
+++void mpd_sendPlaylistAddCommand(mpd_Connection * connection, char *playlist, char *path)
+++{
+++ char *sPlaylist = mpd_sanitizeArg(playlist);
+++ char *sPath = mpd_sanitizeArg(path);
+++ int len = strlen("playlistadd") + 2 + strlen(sPlaylist) + 3 + strlen(sPath) + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "playlistadd \"%s\" \"%s\"\n", sPlaylist, sPath);
+++ mpd_executeCommand(connection, string);
+++ free(sPlaylist);
+++ free(sPath);
+++ free(string);
+++}
+++
+++void mpd_sendPlaylistMoveCommand(mpd_Connection * connection, char *playlist, int from, int to)
+++{
+++ char *sPlaylist = mpd_sanitizeArg(playlist);
+++ int len = strlen("playlistmove") + 2 + strlen(sPlaylist) + 3 + INTLEN + 3 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "playlistmove \"%s\" \"%i\" \"%i\"\n", sPlaylist, from, to);
+++ mpd_executeCommand(connection, string);
+++ free(sPlaylist);
+++ free(string);
+++}
+++
+++void mpd_sendPlaylistDeleteCommand(mpd_Connection * connection, char *playlist, int pos)
+++{
+++ char *sPlaylist = mpd_sanitizeArg(playlist);
+++ int len = strlen("playlistdelete") + 2 + strlen(sPlaylist) + 3 + INTLEN + 3;
+++ char *string = malloc(len);
+++ snprintf(string, len, "playlistdelete \"%s\" \"%i\"\n", sPlaylist, pos);
+++ mpd_executeCommand(connection, string);
+++ free(sPlaylist);
+++ free(string);
+++}
++--- /dev/null
+++++ b/libmpdclient.h
++@@ -0,0 +1,661 @@
+++/* libmpdclient
+++ (c)2003-2006 by Warren Dukes (warren.dukes@gmail.com)
+++ This project's homepage is: http://www.musicpd.org
+++
+++ Redistribution and use in source and binary forms, with or without
+++ modification, are permitted provided that the following conditions
+++ are met:
+++
+++ - Redistributions of source code must retain the above copyright
+++ notice, this list of conditions and the following disclaimer.
+++
+++ - Redistributions in binary form must reproduce the above copyright
+++ notice, this list of conditions and the following disclaimer in the
+++ documentation and/or other materials provided with the distribution.
+++
+++ - Neither the name of the Music Player Daemon nor the names of its
+++ contributors may be used to endorse or promote products derived from
+++ this software without specific prior written permission.
+++
+++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+++ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+++ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+++ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
+++ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+++ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+++ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+++ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+++ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+++ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+++ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+++*/
+++
+++#ifndef LIBMPDCLIENT_H
+++#define LIBMPDCLIENT_H
+++
+++#ifdef WIN32
+++# define __W32API_USE_DLLIMPORT__ 1
+++#endif
+++
+++#include <sys/time.h>
+++#include <stdarg.h>
+++#define MPD_BUFFER_MAX_LENGTH 50000
+++#define MPD_ERRORSTR_MAX_LENGTH 1000
+++#define MPD_WELCOME_MESSAGE "OK MPD "
+++
+++#define MPD_ERROR_TIMEOUT 10 /* timeout trying to talk to mpd */
+++#define MPD_ERROR_SYSTEM 11 /* system error */
+++#define MPD_ERROR_UNKHOST 12 /* unknown host */
+++#define MPD_ERROR_CONNPORT 13 /* problems connecting to port on host */
+++#define MPD_ERROR_NOTMPD 14 /* mpd not running on port at host */
+++#define MPD_ERROR_NORESPONSE 15 /* no response on attempting to connect */
+++#define MPD_ERROR_SENDING 16 /* error sending command */
+++#define MPD_ERROR_CONNCLOSED 17 /* connection closed by mpd */
+++#define MPD_ERROR_ACK 18 /* ACK returned! */
+++#define MPD_ERROR_BUFFEROVERRUN 19 /* Buffer was overrun! */
+++
+++#define MPD_ACK_ERROR_UNK -1
+++#define MPD_ERROR_AT_UNK -1
+++
+++#define MPD_ACK_ERROR_NOT_LIST 1
+++#define MPD_ACK_ERROR_ARG 2
+++#define MPD_ACK_ERROR_PASSWORD 3
+++#define MPD_ACK_ERROR_PERMISSION 4
+++#define MPD_ACK_ERROR_UNKNOWN_CMD 5
+++
+++#define MPD_ACK_ERROR_NO_EXIST 50
+++#define MPD_ACK_ERROR_PLAYLIST_MAX 51
+++#define MPD_ACK_ERROR_SYSTEM 52
+++#define MPD_ACK_ERROR_PLAYLIST_LOAD 53
+++#define MPD_ACK_ERROR_UPDATE_ALREADY 54
+++#define MPD_ACK_ERROR_PLAYER_SYNC 55
+++#define MPD_ACK_ERROR_EXIST 56
+++
+++#ifdef __cplusplus
+++extern "C" {
+++#endif
+++
+++ typedef enum mpd_TagItems {
+++ MPD_TAG_ITEM_ARTIST,
+++ MPD_TAG_ITEM_ALBUM,
+++ MPD_TAG_ITEM_TITLE,
+++ MPD_TAG_ITEM_TRACK,
+++ MPD_TAG_ITEM_NAME,
+++ MPD_TAG_ITEM_GENRE,
+++ MPD_TAG_ITEM_DATE,
+++ MPD_TAG_ITEM_COMPOSER,
+++ MPD_TAG_ITEM_PERFORMER,
+++ MPD_TAG_ITEM_COMMENT,
+++ MPD_TAG_ITEM_DISC,
+++ MPD_TAG_ITEM_FILENAME,
+++ MPD_TAG_ITEM_ANY,
+++ MPD_TAG_NUM_OF_ITEM_TYPES
+++ } mpd_TagItems;
+++
+++ extern char *mpdTagItemKeys[MPD_TAG_NUM_OF_ITEM_TYPES];
+++
+++/* internal stuff don't touch this struct */
+++ typedef struct _mpd_ReturnElement {
+++ char *name;
+++ char *value;
+++ } mpd_ReturnElement;
+++
+++/* mpd_Connection
+++ * holds info about connection to mpd
+++ * use error, and errorStr to detect errors
+++ */
+++ typedef struct _mpd_Connection {
+++ /* use this to check the version of mpd */
+++ int version[3];
+++ /* IMPORTANT, you want to get the error messages from here */
+++ char errorStr[MPD_ERRORSTR_MAX_LENGTH + 1];
+++ int errorCode;
+++ int errorAt;
+++ /* this will be set to MPD_ERROR_* if there is an error, 0 if not */
+++ int error;
+++ /* DON'T TOUCH any of the rest of this stuff */
+++ int sock;
+++ char buffer[MPD_BUFFER_MAX_LENGTH + 1];
+++ int buflen;
+++ int bufstart;
+++ int doneProcessing;
+++ int listOks;
+++ int doneListOk;
+++ int commandList;
+++ mpd_ReturnElement *returnElement;
+++ struct timeval timeout;
+++ char *request;
+++ } mpd_Connection;
+++
+++/* mpd_newConnection
+++ * use this to open a new connection
+++ * you should use mpd_closeConnection, when your done with the connection,
+++ * even if an error has occurred
+++ * _timeout_ is the connection timeout period in seconds
+++ */
+++ mpd_Connection *mpd_newConnection(const char *host, int port, float timeout);
+++
+++ void mpd_setConnectionTimeout(mpd_Connection * connection, float timeout);
+++
+++/* mpd_closeConnection
+++ * use this to close a connection and free'ing subsequent memory
+++ */
+++ void mpd_closeConnection(mpd_Connection * connection);
+++
+++/* mpd_clearError
+++ * clears error
+++ */
+++ void mpd_clearError(mpd_Connection * connection);
+++
+++/* STATUS STUFF */
+++
+++/* use these with status.state to determine what state the player is in */
+++#define MPD_STATUS_STATE_UNKNOWN 0
+++#define MPD_STATUS_STATE_STOP 1
+++#define MPD_STATUS_STATE_PLAY 2
+++#define MPD_STATUS_STATE_PAUSE 3
+++
+++/* us this with status.volume to determine if mpd has volume support */
+++#define MPD_STATUS_NO_VOLUME -1
+++
+++/* mpd_Status
+++ * holds info return from status command
+++ */
+++ typedef struct mpd_Status {
+++ /* 0-100, or MPD_STATUS_NO_VOLUME when there is no volume support */
+++ int volume;
+++ /* 1 if repeat is on, 0 otherwise */
+++ int repeat;
+++ /* 1 if random is on, 0 otherwise */
+++ int random;
+++ /* playlist length */
+++ int playlistLength;
+++ /* playlist, use this to determine when the playlist has changed */
+++ long long playlist;
+++ /* use with MPD_STATUS_STATE_* to determine state of player */
+++ int state;
+++ /* crossfade setting in seconds */
+++ int crossfade;
+++ /* if a song is currently selected (always the case when state is
+++ * PLAY or PAUSE), this is the position of the currently
+++ * playing song in the playlist, beginning with 0
+++ */
+++ int song;
+++ /* Song ID of the currently selected song */
+++ int songid;
+++ /* time in seconds that have elapsed in the currently playing/paused
+++ * song
+++ */
+++ int elapsedTime;
+++ /* length in seconds of the currently playing/paused song */
+++ int totalTime;
+++ /* current bit rate in kbs */
+++ int bitRate;
+++ /* audio sample rate */
+++ unsigned int sampleRate;
+++ /* audio bits */
+++ int bits;
+++ /* audio channels */
+++ int channels;
+++ /* 1 if mpd is updating, 0 otherwise */
+++ int updatingDb;
+++ /* error */
+++ char *error;
+++ } mpd_Status;
+++
+++ void mpd_sendStatusCommand(mpd_Connection * connection);
+++
+++/* mpd_getStatus
+++ * returns status info, be sure to free it with mpd_freeStatus()
+++ * call this after mpd_sendStatusCommand()
+++ */
+++ mpd_Status *mpd_getStatus(mpd_Connection * connection);
+++
+++/* mpd_freeStatus
+++ * free's status info malloc'd and returned by mpd_getStatus
+++ */
+++ void mpd_freeStatus(mpd_Status * status);
+++
+++ typedef struct _mpd_Stats {
+++ int numberOfArtists;
+++ int numberOfAlbums;
+++ int numberOfSongs;
+++ unsigned long uptime;
+++ unsigned long dbUpdateTime;
+++ unsigned long playTime;
+++ unsigned long dbPlayTime;
+++ } mpd_Stats;
+++
+++ typedef struct _mpd_SearchStats {
+++ int numberOfSongs;
+++ unsigned long playTime;
+++ } mpd_SearchStats;
+++
+++ void mpd_sendStatsCommand(mpd_Connection * connection);
+++
+++ mpd_Stats *mpd_getStats(mpd_Connection * connection);
+++
+++ void mpd_freeStats(mpd_Stats * stats);
+++
+++ mpd_SearchStats *mpd_getSearchStats(mpd_Connection * connection);
+++
+++ void mpd_freeSearchStats(mpd_SearchStats * stats);
+++
+++/* SONG STUFF */
+++
+++#define MPD_SONG_NO_TIME -1
+++#define MPD_SONG_NO_NUM -1
+++#define MPD_SONG_NO_ID -1
+++
+++/* mpd_Song
+++ * for storing song info returned by mpd
+++ */
+++ typedef struct _mpd_Song {
+++ /* filename of song */
+++ char *file;
+++ /* artist, maybe NULL if there is no tag */
+++ char *artist;
+++ /* title, maybe NULL if there is no tag */
+++ char *title;
+++ /* album, maybe NULL if there is no tag */
+++ char *album;
+++ /* track, maybe NULL if there is no tag */
+++ char *track;
+++ /* name, maybe NULL if there is no tag; it's the name of the current
+++ * song, f.e. the icyName of the stream */
+++ char *name;
+++ /* date */
+++ char *date;
+++
+++ /* added by qball */
+++ /* Genre */
+++ char *genre;
+++ /* Composer */
+++ char *composer;
+++ /* Performer */
+++ char *performer;
+++ /* Disc */
+++ char *disc;
+++ /* Comment */
+++ char *comment;
+++
+++ /* length of song in seconds, check that it is not MPD_SONG_NO_TIME */
+++ int time;
+++ /* if plchanges/playlistinfo/playlistid used, is the position of the
+++ * song in the playlist */
+++ int pos;
+++ /* song id for a song in the playlist */
+++ int id;
+++ } mpd_Song;
+++
+++/* mpd_newSong
+++ * use to allocate memory for a new mpd_Song
+++ * file, artist, etc all initialized to NULL
+++ * if your going to assign values to file, artist, etc
+++ * be sure to malloc or strdup the memory
+++ * use mpd_freeSong to free the memory for the mpd_Song, it will also
+++ * free memory for file, artist, etc, so don't do it yourself
+++ */
+++ mpd_Song *mpd_newSong(void);
+++
+++/* mpd_freeSong
+++ * use to free memory allocated by mpd_newSong
+++ * also it will free memory pointed to by file, artist, etc, so be careful
+++ */
+++ void mpd_freeSong(mpd_Song * song);
+++
+++/* mpd_songDup
+++ * works like strDup, but for a mpd_Song
+++ */
+++ mpd_Song *mpd_songDup(mpd_Song * song);
+++
+++/* DIRECTORY STUFF */
+++
+++/* mpd_Directory
+++ * used to store info fro directory (right now that just the path)
+++ */
+++ typedef struct _mpd_Directory {
+++ char *path;
+++ } mpd_Directory;
+++
+++/* mpd_newDirectory
+++ * allocates memory for a new directory
+++ * use mpd_freeDirectory to free this memory
+++ */
+++ mpd_Directory *mpd_newDirectory(void);
+++
+++/* mpd_freeDirectory
+++ * used to free memory allocated with mpd_newDirectory, and it frees
+++ * path of mpd_Directory, so be careful
+++ */
+++ void mpd_freeDirectory(mpd_Directory * directory);
+++
+++/* mpd_directoryDup
+++ * works like strdup, but for mpd_Directory
+++ */
+++ mpd_Directory *mpd_directoryDup(mpd_Directory * directory);
+++
+++/* PLAYLISTFILE STUFF */
+++
+++/* mpd_PlaylistFile
+++ * stores info about playlist file returned by lsinfo
+++ */
+++ typedef struct _mpd_PlaylistFile {
+++ char *path;
+++ } mpd_PlaylistFile;
+++
+++/* mpd_newPlaylistFile
+++ * allocates memory for new mpd_PlaylistFile, path is set to NULL
+++ * free this memory with mpd_freePlaylistFile
+++ */
+++ mpd_PlaylistFile *mpd_newPlaylistFile(void);
+++
+++/* mpd_freePlaylist
+++ * free memory allocated for freePlaylistFile, will also free
+++ * path, so be careful
+++ */
+++ void mpd_freePlaylistFile(mpd_PlaylistFile * playlist);
+++
+++/* mpd_playlistFileDup
+++ * works like strdup, but for mpd_PlaylistFile
+++ */
+++ mpd_PlaylistFile *mpd_playlistFileDup(mpd_PlaylistFile * playlist);
+++
+++/* INFO ENTITY STUFF */
+++
+++/* the type of entity returned from one of the commands that generates info
+++ * use in conjunction with mpd_InfoEntity.type
+++ */
+++#define MPD_INFO_ENTITY_TYPE_DIRECTORY 0
+++#define MPD_INFO_ENTITY_TYPE_SONG 1
+++#define MPD_INFO_ENTITY_TYPE_PLAYLISTFILE 2
+++
+++/* mpd_InfoEntity
+++ * stores info on stuff returned info commands
+++ */
+++ typedef struct mpd_InfoEntity {
+++ /* the type of entity, use with MPD_INFO_ENTITY_TYPE_* to determine
+++ * what this entity is (song, directory, etc...)
+++ */
+++ int type;
+++ /* the actual data you want, mpd_Song, mpd_Directory, etc */
+++ union {
+++ mpd_Directory *directory;
+++ mpd_Song *song;
+++ mpd_PlaylistFile *playlistFile;
+++ } info;
+++ } mpd_InfoEntity;
+++
+++ mpd_InfoEntity *mpd_newInfoEntity(void);
+++
+++ void mpd_freeInfoEntity(mpd_InfoEntity * entity);
+++
+++/* INFO COMMANDS AND STUFF */
+++
+++/* use this function to loop over after calling Info/Listall functions */
+++ mpd_InfoEntity *mpd_getNextInfoEntity(mpd_Connection * connection);
+++
+++/* fetches the currently seeletect song (the song referenced by status->song
+++ * and status->songid*/
+++ void mpd_sendCurrentSongCommand(mpd_Connection * connection);
+++
+++/* songNum of -1, means to display the whole list */
+++ void mpd_sendPlaylistInfoCommand(mpd_Connection * connection, int songNum);
+++
+++/* songId of -1, means to display the whole list */
+++ void mpd_sendPlaylistIdCommand(mpd_Connection * connection, int songId);
+++
+++/* use this to get the changes in the playlist since version _playlist_ */
+++ void mpd_sendPlChangesCommand(mpd_Connection * connection, long long playlist);
+++
+++/**
+++ * @param connection: A valid and connected mpd_Connection.
+++ * @param playlist: The playlist version you want the diff with.
+++ * A more bandwidth efficient version of the mpd_sendPlChangesCommand.
+++ * It only returns the pos+id of the changes song.
+++ */
+++ void mpd_sendPlChangesPosIdCommand(mpd_Connection * connection, long long playlist);
+++
+++/* recursivel fetches all songs/dir/playlists in "dir* (no metadata is
+++ * returned) */
+++ void mpd_sendListallCommand(mpd_Connection * connection, const char *dir);
+++
+++/* same as sendListallCommand, but also metadata is returned */
+++ void mpd_sendListallInfoCommand(mpd_Connection * connection, const char *dir);
+++
+++/* non-recursive version of ListallInfo */
+++ void mpd_sendLsInfoCommand(mpd_Connection * connection, const char *dir);
+++
+++#define MPD_TABLE_ARTIST MPD_TAG_ITEM_ARTIST
+++#define MPD_TABLE_ALBUM MPD_TAG_ITEM_ALBUM
+++#define MPD_TABLE_TITLE MPD_TAG_ITEM_TITLE
+++#define MPD_TABLE_FILENAME MPD_TAG_ITEM_FILENAME
+++
+++ void mpd_sendSearchCommand(mpd_Connection * connection, int table, const char *str);
+++
+++ void mpd_sendFindCommand(mpd_Connection * connection, int table, const char *str);
+++
+++/* LIST TAG COMMANDS */
+++
+++/* use this function fetch next artist entry, be sure to free the returned
+++ * string. NULL means there are no more. Best used with sendListArtists
+++ */
+++ char *mpd_getNextArtist(mpd_Connection * connection);
+++
+++ char *mpd_getNextAlbum(mpd_Connection * connection);
+++
+++ char *mpd_getNextTag(mpd_Connection * connection, int type);
+++
+++/* list artist or albums by artist, arg1 should be set to the artist if
+++ * listing albums by a artist, otherwise NULL for listing all artists or albums
+++ */
+++ void mpd_sendListCommand(mpd_Connection * connection, int table, const char *arg1);
+++
+++/* SIMPLE COMMANDS */
+++
+++ void mpd_sendAddCommand(mpd_Connection * connection, const char *file);
+++
+++ int mpd_sendAddIdCommand(mpd_Connection * connection, const char *file);
+++
+++ void mpd_sendDeleteCommand(mpd_Connection * connection, int songNum);
+++
+++ void mpd_sendDeleteIdCommand(mpd_Connection * connection, int songNum);
+++
+++ void mpd_sendSaveCommand(mpd_Connection * connection, const char *name);
+++
+++ void mpd_sendLoadCommand(mpd_Connection * connection, const char *name);
+++
+++ void mpd_sendRmCommand(mpd_Connection * connection, const char *name);
+++
+++ void mpd_sendRenameCommand(mpd_Connection * connection, const char *from, const char *to);
+++
+++ void mpd_sendShuffleCommand(mpd_Connection * connection);
+++
+++ void mpd_sendClearCommand(mpd_Connection * connection);
+++
+++/* use this to start playing at the beginning, useful when in random mode */
+++#define MPD_PLAY_AT_BEGINNING -1
+++
+++ void mpd_sendPlayCommand(mpd_Connection * connection, int songNum);
+++
+++ void mpd_sendPlayIdCommand(mpd_Connection * connection, int songNum);
+++
+++ void mpd_sendStopCommand(mpd_Connection * connection);
+++
+++ void mpd_sendPauseCommand(mpd_Connection * connection, int pauseMode);
+++
+++ void mpd_sendNextCommand(mpd_Connection * connection);
+++
+++ void mpd_sendPrevCommand(mpd_Connection * connection);
+++
+++ void mpd_sendMoveCommand(mpd_Connection * connection, int from, int to);
+++
+++ void mpd_sendMoveIdCommand(mpd_Connection * connection, int from, int to);
+++
+++ void mpd_sendSwapCommand(mpd_Connection * connection, int song1, int song2);
+++
+++ void mpd_sendSwapIdCommand(mpd_Connection * connection, int song1, int song2);
+++
+++ void mpd_sendSeekCommand(mpd_Connection * connection, int song, int time);
+++
+++ void mpd_sendSeekIdCommand(mpd_Connection * connection, int song, int time);
+++
+++ void mpd_sendRepeatCommand(mpd_Connection * connection, int repeatMode);
+++
+++ void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode);
+++
+++ void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange);
+++
+++/* WARNING: don't use volume command, its depreacted */
+++ void mpd_sendVolumeCommand(mpd_Connection * connection, int volumeChange);
+++
+++ void mpd_sendCrossfadeCommand(mpd_Connection * connection, int seconds);
+++
+++ void mpd_sendUpdateCommand(mpd_Connection * connection, char *path);
+++
+++/* returns the update job id, call this after a update command*/
+++ int mpd_getUpdateId(mpd_Connection * connection);
+++
+++ void mpd_sendPasswordCommand(mpd_Connection * connection, const char *pass);
+++
+++/* after executing a command, when your done with it to get its status
+++ * (you want to check connection->error for an error)
+++ */
+++ void mpd_finishCommand(mpd_Connection * connection);
+++
+++/* command list stuff, use this to do things like add files very quickly */
+++ void mpd_sendCommandListBegin(mpd_Connection * connection);
+++
+++ void mpd_sendCommandListOkBegin(mpd_Connection * connection);
+++
+++ void mpd_sendCommandListEnd(mpd_Connection * connection);
+++
+++/* advance to the next listOk
+++ * returns 0 if advanced to the next list_OK,
+++ * returns -1 if it advanced to an OK or ACK */
+++ int mpd_nextListOkCommand(mpd_Connection * connection);
+++
+++ typedef struct _mpd_OutputEntity {
+++ int id;
+++ char *name;
+++ int enabled;
+++ } mpd_OutputEntity;
+++
+++ void mpd_sendOutputsCommand(mpd_Connection * connection);
+++
+++ mpd_OutputEntity *mpd_getNextOutput(mpd_Connection * connection);
+++
+++ void mpd_sendEnableOutputCommand(mpd_Connection * connection, int outputId);
+++
+++ void mpd_sendDisableOutputCommand(mpd_Connection * connection, int outputId);
+++
+++ void mpd_freeOutputElement(mpd_OutputEntity * output);
+++
+++/**
+++ * @param connection a #mpd_Connection
+++ *
+++ * Queries mpd for the allowed commands
+++ */
+++ void mpd_sendCommandsCommand(mpd_Connection * connection);
+++
+++/**
+++ * @param connection a #mpd_Connection
+++ *
+++ * Queries mpd for the not allowed commands
+++ */
+++ void mpd_sendNotCommandsCommand(mpd_Connection * connection);
+++
+++/**
+++ * @param connection a #mpd_Connection
+++ *
+++ * returns the next supported command.
+++ *
+++ * @returns a string, needs to be free'ed
+++ */
+++ char *mpd_getNextCommand(mpd_Connection * connection);
+++
+++ void mpd_sendUrlHandlersCommand(mpd_Connection * connection);
+++
+++ char *mpd_getNextHandler(mpd_Connection * connection);
+++
+++ void mpd_sendTagTypesCommand(mpd_Connection * connection);
+++
+++ char *mpd_getNextTagType(mpd_Connection * connection);
+++
+++/**
+++ * @param connection a MpdConnection
+++ * @param path the path to the playlist.
+++ *
+++ * List the content, with full metadata, of a stored playlist.
+++ *
+++ */
+++ void mpd_sendListPlaylistInfoCommand(mpd_Connection * connection, char *path);
+++
+++/**
+++ * @param connection a MpdConnection
+++ * @param path the path to the playlist.
+++ *
+++ * List the content of a stored playlist.
+++ *
+++ */
+++ void mpd_sendListPlaylistCommand(mpd_Connection * connection, char *path);
+++
+++/**
+++ * @param connection a #mpd_Connection
+++ * @param exact if to match exact
+++ *
+++ * starts a search, use mpd_addConstraintSearch to add
+++ * a constraint to the search, and mpd_commitSearch to do the actual search
+++ */
+++ void mpd_startSearch(mpd_Connection * connection, int exact);
+++
+++/**
+++ * @param connection a #mpd_Connection
+++ * @param type
+++ * @param name
+++ */
+++ void mpd_addConstraintSearch(mpd_Connection * connection, int type, const char *name);
+++
+++/**
+++ * @param connection a #mpd_Connection
+++ */
+++ void mpd_commitSearch(mpd_Connection * connection);
+++
+++/**
+++ * @param connection a #mpd_Connection
+++ * @param type The type to search for
+++ *
+++ * starts a search for fields... f.e. get a list of artists would be:
+++ * @code
+++ * mpd_startFieldSearch(connection, MPD_TAG_ITEM_ARTIST);
+++ * mpd_commitSearch(connection);
+++ * @endcode
+++ *
+++ * or get a list of artist in genre "jazz" would be:
+++ * @code
+++ * mpd_startFieldSearch(connection, MPD_TAG_ITEM_ARTIST);
+++ * mpd_addConstraintSearch(connection, MPD_TAG_ITEM_GENRE, "jazz")
+++ * mpd_commitSearch(connection);
+++ * @endcode
+++ *
+++ * mpd_startSearch will return a list of songs (and you need mpd_getNextInfoEntity)
+++ * this one will return a list of only one field (the one specified with type) and you need
+++ * mpd_getNextTag to get the results
+++ */
+++ void mpd_startFieldSearch(mpd_Connection * connection, int type);
+++
+++ void mpd_startPlaylistSearch(mpd_Connection * connection, int exact);
+++
+++ void mpd_startStatsSearch(mpd_Connection * connection);
+++
+++ void mpd_sendPlaylistClearCommand(mpd_Connection * connection, char *path);
+++
+++ void mpd_sendPlaylistAddCommand(mpd_Connection * connection, char *playlist, char *path);
+++
+++ void mpd_sendPlaylistMoveCommand(mpd_Connection * connection, char *playlist, int from, int to);
+++
+++ void mpd_sendPlaylistDeleteCommand(mpd_Connection * connection, char *playlist, int pos);
+++#ifdef __cplusplus
+++}
+++#endif
+++#endif
+diff --git a/feeds/packages/utils/lcd4linux/patches/160-uinput_defs.patch b/feeds/packages/utils/lcd4linux/patches/160-uinput_defs.patch
+new file mode 100644
+index 0000000..44b24b3
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/patches/160-uinput_defs.patch
+@@ -0,0 +1,24 @@
++--- a/drv_G15.c
+++++ b/drv_G15.c
++@@ -42,6 +42,7 @@
++
++ #include <usb.h>
++ #include <fcntl.h>
+++#include <linux/version.h>
++ #include <linux/input.h>
++ #include <linux/uinput.h>
++
++@@ -269,8 +270,13 @@ void drv_G15_initKeyHandling(char *devic
++ }
++ memset(&device, 0, sizeof(device));
++ strncpy(device.name, "G15 Keys", UINPUT_MAX_NAME_SIZE);
+++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++ device.id.bustype = BUS_USB;
++ device.id.version = 4;
+++#else
+++ device.idbus = BUS_USB;
+++ device.idversion = 4;
+++#endif
++
++ ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);
++
+diff --git a/feeds/packages/utils/lcd4linux/patches/170-add-generic-spidev-driver.patch b/feeds/packages/utils/lcd4linux/patches/170-add-generic-spidev-driver.patch
+new file mode 100644
+index 0000000..4cd53d6
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/patches/170-add-generic-spidev-driver.patch
+@@ -0,0 +1,195 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -71,6 +71,8 @@ drv_generic_i2c.c \
++ drv_generic_i2c.h \
++ drv_generic_keypad.c \
++ drv_generic_keypad.h \
+++drv_generic_spidev.c \
+++drv_generic_spidev.h \
++ drv_ASTUSB.c \
++ drv_BeckmannEgle.c \
++ drv_BWCT.c \
++--- /dev/null
+++++ b/drv_generic_spidev.c
++@@ -0,0 +1,89 @@
+++/* $Id$
+++ * $URL$
+++ *
+++ * generic driver helper for displays connected via SPI bus
+++ *
+++ * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is part of LCD4Linux.
+++ *
+++ * LCD4Linux is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License as published by
+++ * the Free Software Foundation; either version 2, or (at your option)
+++ * any later version.
+++ *
+++ * LCD4Linux is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU General Public License for more details.
+++ *
+++ * You should have received a copy of the GNU General Public License
+++ * along with this program; if not, write to the Free Software
+++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+++ *
+++ */
+++
+++#include "config.h"
+++
+++#include <stdlib.h>
+++#include <stdio.h>
+++#include <string.h>
+++#include <errno.h>
+++#include <unistd.h>
+++#include <fcntl.h>
+++#include <sys/types.h>
+++#include <sys/ioctl.h>
+++
+++#include "debug.h"
+++#include "qprintf.h"
+++#include "cfg.h"
+++#include "drv_generic_spidev.h"
+++
+++static char *generic_spidev_section = "";
+++static char *generic_spidev_driver = "";
+++static int generic_spidev_fd;
+++
+++int drv_generic_spidev_open(const char *section, const char *driver)
+++{
+++ char *spidev;
+++
+++ udelay_init();
+++
+++ generic_spidev_section = (char *) section;
+++ generic_spidev_driver = (char *) driver;
+++
+++ spidev = cfg_get(generic_spidev_section, "Port", NULL);
+++
+++ info("%s: initializing SPI device %s", generic_spidev_driver, spidev);
+++ generic_spidev_fd = open(spidev, O_WRONLY);
+++ if (generic_spidev_fd < 0) {
+++ error("%s: unable to open SPI device %s!\n", generic_spidev_driver, spidev);
+++ goto exit_error;
+++ }
+++
+++ return 0;
+++
+++ exit_error:
+++ free(spidev);
+++ return -1;
+++}
+++
+++int drv_generic_spidev_close(void)
+++{
+++ close(generic_spidev_fd);
+++ return 0;
+++}
+++
+++int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr)
+++{
+++ int ret;
+++
+++ ret = ioctl(generic_spidev_fd, SPI_IOC_MESSAGE(count), tr);
+++ if (ret < count) {
+++ error("%s: can't send SPI message! (%s)\n",
+++ generic_spidev_driver, strerror(errno));
+++ return -1;
+++ }
+++
+++ return 0;
+++}
++--- /dev/null
+++++ b/drv_generic_spidev.h
++@@ -0,0 +1,54 @@
+++/* $Id$
+++ * $URL$
+++ *
+++ * generic driver helper for displays connected via SPI bus
+++ *
+++ * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
+++ * Copyright (C) 2012 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
+++ *
+++ * This file is part of LCD4Linux.
+++ *
+++ * LCD4Linux is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License as published by
+++ * the Free Software Foundation; either version 2, or (at your option)
+++ * any later version.
+++ *
+++ * LCD4Linux is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU General Public License for more details.
+++ *
+++ * You should have received a copy of the GNU General Public License
+++ * along with this program; if not, write to the Free Software
+++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+++ *
+++ */
+++
+++/*
+++ *
+++ * exported fuctions:
+++ *
+++ * int drv_generic_spidev_open (const char *section, const char *driver)
+++ * reads 'Port' entry from config and opens
+++ * the SPI device
+++ * returns 0 if ok, -1 on failure
+++ *
+++ * int drv_generic_spidev_close (void)
+++ * closes SPI device
+++ * returns 0 if ok, -1 on failure
+++ *
+++ * void drv_generic_spidev_transfer (int count, struct spi_ioc_transfer *tr)
+++ * transfer data to/from the SPI device
+++ *
+++ */
+++
+++#ifndef _DRV_GENERIC_SPIDEV_H_
+++#define _DRV_GENERIC_SPIDEV_H_
+++
+++#include <linux/spi/spidev.h>
+++
+++int drv_generic_spidev_open(const char *section, const char *driver);
+++int drv_generic_spidev_close(void);
+++int drv_generic_spidev_transfer(const int count, struct spi_ioc_transfer *tr);
+++
+++#endif /* _DRV_GENERIC_SPIDEV_H_ */
++--- a/drivers.m4
+++++ b/drivers.m4
++@@ -301,6 +301,7 @@ PARPORT="no"
++ SERIAL="no"
++ I2C="no"
++ KEYPAD="no"
+++SPIDEV="no"
++
++ # generic libraries
++ LIBUSB="no"
++@@ -936,6 +937,12 @@ if test "$LIBJPEG" = "yes"; then
++ DRVLIBS="$DRVLIBS -ljpeg"
++ fi
++
+++# generic spidev driver
+++if test "$SPIDEV" = "yes"; then
+++ DRIVERS="$DRIVERS drv_generic_spidev.o"
+++ AC_DEFINE(WITH_SPIDEV, 1, [SPIDEV driver])
+++fi
+++
++ # libusb
++ if test "$LIBUSB" = "yes"; then
++ DRVLIBS="$DRVLIBS -lusb"
++--- a/configure.ac
+++++ b/configure.ac
++@@ -115,6 +115,9 @@ AC_ARG_WITH(outb,
++
++ AC_CHECK_HEADERS([asm/io.h] [linux/parport.h linux/ppdev.h], [has_parport="true"], [has_parport="false"])
++
+++# check for spidev
+++AC_CHECK_HEADERS([linux/spi/spidev.h], [has_spidev="true"], [has_spidev="false"])
+++
++ # drivers
++ sinclude(drivers.m4)
++
+diff --git a/feeds/packages/utils/lcd4linux/patches/171-allow-to-specify-drv_generic_graphic_real_clear.patch b/feeds/packages/utils/lcd4linux/patches/171-allow-to-specify-drv_generic_graphic_real_clear.patch
+new file mode 100644
+index 0000000..5a26643
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/patches/171-allow-to-specify-drv_generic_graphic_real_clear.patch
+@@ -0,0 +1,45 @@
++--- a/drv_generic_graphic.c
+++++ b/drv_generic_graphic.c
++@@ -24,7 +24,7 @@
++ *
++ */
++
++-/*
+++/*
++ *
++ * exported functions:
++ *
++@@ -98,6 +98,9 @@ static int INVERTED = 0;
++ /* must be implemented by the real driver */
++ void (*drv_generic_graphic_real_blit) () = NULL;
++
+++/* can be implemented by the real driver */
+++void (*drv_generic_graphic_real_clear) () = NULL;
+++
++
++ /****************************************/
++ /*** generic Framebuffer stuff ***/
++@@ -691,7 +694,10 @@ int drv_generic_graphic_clear(void)
++ for (i = 0; i < LCOLS * LROWS; i++)
++ drv_generic_graphic_FB[l][i] = NO_COL;
++
++- drv_generic_graphic_blit(0, 0, LROWS, LCOLS);
+++ if (drv_generic_graphic_real_clear)
+++ drv_generic_graphic_real_clear(NO_COL);
+++ else
+++ drv_generic_graphic_blit(0, 0, LROWS, LCOLS);
++
++ return 0;
++ }
++--- a/drv_generic_graphic.h
+++++ b/drv_generic_graphic.h
++@@ -40,6 +40,9 @@ extern RGBA NO_COL; /* no color (comple
++ /* these functions must be implemented by the real driver */
++ extern void (*drv_generic_graphic_real_blit) (const int row, const int col, const int height, const int width);
++
+++/* these functions can be implemented by the real driver */
+++void (*drv_generic_graphic_real_clear) (const RGBA rgba);
+++
++ /* helper function to get pixel color or gray value */
++ extern RGBA drv_generic_graphic_rgb(const int row, const int col);
++ extern unsigned char drv_generic_graphic_gray(const int row, const int col);
+diff --git a/feeds/packages/utils/lcd4linux/patches/172-add-TEW673GRU-driver.patch b/feeds/packages/utils/lcd4linux/patches/172-add-TEW673GRU-driver.patch
+new file mode 100644
+index 0000000..428465c
+--- /dev/null
++++ b/feeds/packages/utils/lcd4linux/patches/172-add-TEW673GRU-driver.patch
+@@ -0,0 +1,552 @@
++--- a/drivers.m4
+++++ b/drivers.m4
++@@ -39,7 +39,7 @@ AC_ARG_WITH(
++ [ Newhaven, Noritake, NULL, Pertelian, PHAnderson,]
++ [ PICGraphic, picoLCD, picoLCDGraphic, PNG, PPM, RouterBoard,]
++ [ Sample, SamsungSPF, serdisplib, ShuttleVFD, SimpleLCD, st2205, T6963,]
++- [ TeakLCM, Trefon, ULA200, USBHUB, USBLCD, VNC, WincorNixdorf, X11],
+++ [ TeakLCM, TEW673GRU, Trefon, ULA200, USBHUB, USBLCD, VNC, WincorNixdorf, X11],
++ drivers=$withval,
++ drivers=all
++ )
++@@ -107,6 +107,7 @@ for driver in $drivers; do
++ SHUTTLEVFD="yes"
++ SIMPLELCD="yes"
++ T6963="yes"
+++ TEW673GRU="yes"
++ TeakLCM="yes"
++ Trefon="yes"
++ ULA200="yes"
++@@ -260,6 +261,9 @@ for driver in $drivers; do
++ TeakLCM)
++ TeakLCM=$val
++ ;;
+++ TEW673GRU)
+++ TEW673GRU=$val
+++ ;;
++ Trefon)
++ Trefon=$val
++ ;;
++@@ -797,6 +801,18 @@ if test "$TeakLCM" = "yes"; then
++ AC_DEFINE(WITH_TEAK_LCM,1,[TeakLCM driver])
++ fi
++
+++if test "$TEW673GRU" = "yes"; then
+++ if test "$has_spidev" = "true"; then
+++ GRAPHIC="yes"
+++ TEXT="yes"
+++ SPIDEV="yes"
+++ DRIVERS="$DRIVERS drv_TEW673GRU.o"
+++ AC_DEFINE(WITH_TEW673GRU,1,[TEW673GRU driver])
+++ else
+++ AC_MSG_WARN(linux/spi/spidev.h not found: TEW673GRU driver disabled)
+++ fi
+++fi
+++
++ if test "$Trefon" = "yes"; then
++ if test "$has_usb" = "true"; then
++ TEXT="yes"
++--- a/drv.c
+++++ b/drv.c
++@@ -92,6 +92,7 @@ extern DRIVER drv_serdisplib;
++ extern DRIVER drv_ShuttleVFD;
++ extern DRIVER drv_SimpleLCD;
++ extern DRIVER drv_T6963;
+++extern DRIVER drv_TEW673GRU;
++ extern DRIVER drv_TeakLCM;
++ extern DRIVER drv_Trefon;
++ extern DRIVER drv_ula200;
++@@ -248,6 +249,9 @@ DRIVER *Driver[] = {
++ #ifdef WITH_TEAK_LCM
++ &drv_TeakLCM,
++ #endif
+++#ifdef WITH_TEW673GRU
+++ &drv_TEW673GRU,
+++#endif
++ #ifdef WITH_TREFON
++ &drv_Trefon,
++ #endif
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -119,6 +119,7 @@ drv_ShuttleVFD.c \
++ drv_SimpleLCD.c \
++ drv_T6963.c \
++ drv_TeakLCM.c \
+++drv_TEW673GRU.c \
++ drv_Trefon.c \
++ drv_ula200.c \
++ drv_USBHUB.c \
++--- /dev/null
+++++ b/drv_TEW673GRU.c
++@@ -0,0 +1,457 @@
+++/* $Id$
+++ * $URL$
+++ *
+++ * TRENDnet TEW673GRU LCD4linux driver
+++ *
+++ * Copyright (C) 2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * based on the Sample driver which is:
+++ * Copyright (C) 2005 Michael Reinelt <michael@reinelt.co.at>
+++ * Copyright (C) 2005, 2006, 2007 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
+++ *
+++ * This file is part of LCD4Linux.
+++ *
+++ * LCD4Linux is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License as published by
+++ * the Free Software Foundation; either version 2, or (at your option)
+++ * any later version.
+++ *
+++ * LCD4Linux is distributed in the hope that it will be useful,
+++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+++ * GNU General Public License for more details.
+++ *
+++ * You should have received a copy of the GNU General Public License
+++ * along with this program; if not, write to the Free Software
+++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+++ *
+++ */
+++
+++/*
+++ * exported fuctions:
+++ *
+++ * struct DRIVER drv_TEW673GRU
+++ */
+++
+++#include "config.h"
+++
+++#include <stdlib.h>
+++#include <stdio.h>
+++#include <unistd.h>
+++#include <string.h>
+++#include <errno.h>
+++
+++#include "debug.h"
+++#include "cfg.h"
+++#include "qprintf.h"
+++#include "udelay.h"
+++#include "plugin.h"
+++#include "widget.h"
+++#include "widget_text.h"
+++#include "widget_icon.h"
+++#include "widget_bar.h"
+++#include "drv.h"
+++
+++#include "drv_generic_text.h"
+++#include "drv_generic_graphic.h"
+++#include "drv_generic_spidev.h"
+++
+++#ifdef WITH_DMALLOC
+++#include <dmalloc.h>
+++#endif
+++
+++#define TEW673GRU_NUM_COLS 220
+++#define TEW673GRU_NUM_ROWS 176
+++#define TEW673GRU_BPP 2 /* bytes per pixel */
+++
+++#define TEW673GRU_CMD_SIZE 9
+++#define TEW673GRU_NUM_ROW_BYTES (TEW673GRU_NUM_COLS * TEW673GRU_BPP)
+++
+++enum {
+++ CMD_SHOW_STRING = 49,
+++ CMD_SHOW_IMAGE_DIR = 52,
+++ CMD_SCREEN_COLOR = 54,
+++};
+++
+++static char Name[] = "TEW673GRU";
+++
+++static char *drv_TEW673GRU_FB;
+++static long FB_SIZE;
+++static int MODE;
+++
+++static unsigned int RGBAto16(RGBA rgb)
+++{
+++ return (((rgb.R >> 3) << 11) | ((rgb.G >> 2) << 5) | (rgb.B >> 3));
+++}
+++
+++static unsigned char color_msb(unsigned int color)
+++{
+++ return color >> 8;
+++}
+++
+++static unsigned char color_lsb(unsigned int color)
+++{
+++ return color & 0xff;
+++}
+++
+++static void drv_TEW673GRU_hw_clear(const unsigned int color)
+++{
+++ unsigned char cmd[TEW673GRU_CMD_SIZE];
+++ struct spi_ioc_transfer tr[1];
+++
+++ memset(tr, '\0', sizeof(tr));
+++ memset(cmd, '\0', sizeof(cmd));
+++
+++ cmd[0] = CMD_SCREEN_COLOR;
+++ cmd[7] = color_msb(color);
+++ cmd[8] = color_lsb(color);
+++
+++ tr[0].tx_buf = (unsigned long) cmd;
+++ tr[0].len = sizeof(cmd);
+++
+++ drv_generic_spidev_transfer(1, tr);
+++}
+++
+++static void drv_TEW673GRU_hw_send_row(const int row, const int col, const char *data, const int width)
+++{
+++ unsigned char cmd[TEW673GRU_CMD_SIZE];
+++ struct spi_ioc_transfer tr[2];
+++ int datasize;
+++
+++ memset(tr, '\0', sizeof(tr));
+++ memset(cmd, '\0', sizeof(cmd));
+++
+++ datasize = width * TEW673GRU_BPP;
+++
+++ cmd[0] = CMD_SHOW_IMAGE_DIR;
+++ cmd[1] = col;
+++ cmd[2] = col + width;
+++ cmd[3] = row;
+++ cmd[4] = row;
+++ cmd[5] = datasize >> 8;
+++ cmd[6] = datasize & 0xff;
+++
+++ tr[0].tx_buf = (unsigned long) cmd;
+++ tr[0].len = sizeof(cmd);
+++ tr[1].tx_buf = (unsigned long) data;
+++ tr[1].len = datasize;
+++
+++ drv_generic_spidev_transfer(2, tr);
+++}
+++
+++static void drv_TEW673GRU_hw_write_string(const int row, const int col, const char *data, const int datasize)
+++{
+++ unsigned char cmd[TEW673GRU_CMD_SIZE];
+++ struct spi_ioc_transfer tr[2];
+++ unsigned char len;
+++
+++ memset(tr, '\0', sizeof(tr));
+++ memset(cmd, '\0', sizeof(cmd));
+++
+++ len = datasize & 0xff;
+++ cmd[0] = CMD_SHOW_STRING;
+++ cmd[1] = col;
+++ cmd[2] = col + (XRES * len);
+++ cmd[3] = row;
+++ cmd[4] = row + YRES;
+++ cmd[7] = 0;
+++ cmd[8] = len;
+++
+++ tr[0].tx_buf = (unsigned long) cmd;
+++ tr[0].len = sizeof(cmd);
+++ tr[1].tx_buf = (unsigned long) data;
+++ tr[1].len = datasize;
+++
+++ drv_generic_spidev_transfer(2, tr);
+++}
+++
+++static void drv_TEW673GRU_FB_set_pixel(const int col, const unsigned int color)
+++{
+++ int pos;
+++
+++ pos = col * TEW673GRU_BPP;
+++ drv_TEW673GRU_FB[pos] = color_msb(color);
+++ drv_TEW673GRU_FB[pos + 1] = color_lsb(color);
+++}
+++
+++static void drv_TEW673GRU_blit(const int row, const int col, const int height, const int width)
+++{
+++ int r, c;
+++
+++ debug("%s: update area r:%d c:%d w:%d h:%d", Name, row, col, height, width);
+++
+++ for (r = row; r < row + height; r++) {
+++ for (c = col; c < col + width; c++) {
+++ unsigned int color;
+++ RGBA rgb;
+++
+++ rgb = drv_generic_graphic_rgb(r, c);
+++ color = RGBAto16(rgb);
+++ drv_TEW673GRU_FB_set_pixel(c, color);
+++ }
+++
+++ if (width) {
+++ char *data;
+++
+++ data = &drv_TEW673GRU_FB[col * TEW673GRU_BPP];
+++ drv_TEW673GRU_hw_send_row(r, col, data, width);
+++ udelay(100 + width * 50);
+++ }
+++ }
+++}
+++
+++static void drv_TEW673GRU_clear(RGBA rgba)
+++{
+++ unsigned int color;
+++
+++ color = RGBAto16(rgba);
+++ drv_TEW673GRU_hw_clear(color);
+++}
+++
+++static void drv_TEW673GRU_write(const int row, const int col, const char *data, const int len)
+++{
+++ int i;
+++
+++ for (i = 0; i < len; i++) {
+++ drv_TEW673GRU_hw_write_string(row * YRES, (col + i) * XRES, " ", 1);
+++ udelay(10000);
+++ drv_TEW673GRU_hw_write_string(row * YRES, 2 + (col + i) * XRES, " ", 1);
+++ udelay(10000);
+++ drv_TEW673GRU_hw_write_string(row * YRES, (col + i) * XRES, &data[i], 1);
+++ udelay(10000);
+++ }
+++}
+++
+++static int drv_TEW673GRU_open(const char *section)
+++{
+++ int err;
+++
+++ err = drv_generic_spidev_open(section, Name);
+++ if (err < 0)
+++ return err;
+++
+++ return 0;
+++}
+++
+++static int drv_TEW673GRU_close(void)
+++{
+++ drv_generic_spidev_close();
+++ return 0;
+++}
+++
+++static void drv_TEW673GRU_clear_screen(void)
+++{
+++ if (MODE) {
+++ drv_generic_graphic_clear();
+++ } else {
+++ memset(drv_TEW673GRU_FB, ' ', FB_SIZE);
+++ drv_TEW673GRU_hw_clear(0x0000);
+++ }
+++}
+++
+++static int drv_TEW673GRU_init_font(const char *section)
+++{
+++ char *font;
+++ int ret = -1;
+++
+++ font = cfg_get(section, "Font", "6x8");
+++ if (font == NULL) {
+++ error("%s: no '%s.Font' entry from %s", Name, section, cfg_source());
+++ goto out;
+++ }
+++
+++ if (*font == '\0') {
+++ error("%s: invalid '%s.Font' entry in %s", Name, section, cfg_source());
+++ goto out_free;
+++ }
+++
+++ XRES = -1;
+++ YRES = -1;
+++ if (sscanf(font, "%dx%d", &XRES, &YRES) != 2 ||
+++ XRES < 1 ||
+++ YRES < 1) {
+++ error("%s: bad Font '%s' from %s", Name, font, cfg_source());
+++ goto out_free;
+++ }
+++
+++ if (XRES != 6 && YRES != 8) {
+++ error("%s: bad Font '%s' from %s (only 6x8 at the moment)",
+++ Name, font, cfg_source());
+++ goto out_free;
+++ }
+++
+++ error("%s: font '%s' selected", Name, font);
+++
+++ ret = 0;
+++
+++out_free:
+++ free(font);
+++out:
+++ return ret;
+++}
+++
+++static int drv_TEW673GRU_start(const char *section)
+++{
+++ int ret;
+++
+++ DCOLS = TEW673GRU_NUM_COLS;
+++ DROWS = TEW673GRU_NUM_ROWS;
+++
+++ if (MODE) {
+++ ret = drv_TEW673GRU_init_font(section);
+++ if (ret)
+++ goto err;
+++
+++ FB_SIZE = DCOLS * TEW673GRU_BPP;
+++ } else {
+++ XRES = 10;
+++ YRES = 16;
+++ DCOLS = DCOLS / XRES;
+++ DROWS = DROWS / YRES;
+++
+++ FB_SIZE = DCOLS * DROWS;
+++ }
+++
+++ if (FB_SIZE) {
+++ drv_TEW673GRU_FB = malloc(FB_SIZE);
+++ if (drv_TEW673GRU_FB == NULL) {
+++ error("%s: framebuffer could not be allocated", Name);
+++ goto err;
+++ }
+++ }
+++
+++ ret = drv_TEW673GRU_open(section);
+++ if (ret < 0)
+++ goto err_free;
+++
+++ if (MODE == 0)
+++ drv_TEW673GRU_clear_screen();
+++
+++ return 0;
+++
+++ err_free:
+++ if (drv_TEW673GRU_FB)
+++ free(drv_TEW673GRU_FB);
+++ err:
+++ return -1;
+++}
+++
+++static int drv_TEW673GRU_greet(const char *msg1, const char *msg2)
+++{
+++ if (MODE)
+++ return drv_generic_graphic_greet(msg1, msg2);
+++
+++ return drv_generic_text_greet(msg1, msg2);
+++}
+++
+++
+++/****************************************/
+++/*** widget callbacks ***/
+++/****************************************/
+++
+++
+++/* using drv_generic_text_draw(W) */
+++/* using drv_generic_text_icon_draw(W) */
+++/* using drv_generic_text_bar_draw(W) */
+++/* using drv_generic_gpio_draw(W) */
+++
+++
+++/****************************************/
+++/*** exported functions ***/
+++/****************************************/
+++
+++int drv_TEW673GRU_list(void)
+++{
+++ printf("TEW673GRU driver");
+++ return 0;
+++}
+++
+++int drv_TEW673GRU_init(const char *section, const int quiet)
+++{
+++ WIDGET_CLASS wc;
+++ int ret;
+++
+++ cfg_number(section, "Mode", 0, 0, 1, &MODE);
+++
+++ if (MODE) {
+++ drv_generic_graphic_real_blit = drv_TEW673GRU_blit;
+++ drv_generic_graphic_real_clear = drv_TEW673GRU_clear;
+++ } else {
+++ drv_generic_text_real_write = drv_TEW673GRU_write;
+++ }
+++
+++ ret = drv_TEW673GRU_start(section);
+++ if (ret)
+++ return ret;
+++
+++ if (MODE) {
+++ ret = drv_generic_graphic_init(section, Name);
+++ if (ret)
+++ return ret;
+++ } else {
+++ ret = drv_generic_text_init(section, Name);
+++ if (ret)
+++ return ret;
+++
+++ ret = drv_generic_text_icon_init();
+++ if (ret != 0)
+++ return ret;
+++
+++ ret = drv_generic_text_bar_init(1);
+++ if (ret != 0)
+++ return ret;
+++
+++ drv_generic_text_bar_add_segment(0, 0, 255, ' ');
+++ drv_generic_text_bar_add_segment(255, 255, 255, '#');
+++
+++ wc = Widget_Text;
+++ wc.draw = drv_generic_text_draw;
+++ widget_register(&wc);
+++
+++ wc = Widget_Icon;
+++ wc.draw = drv_generic_text_icon_draw;
+++ widget_register(&wc);
+++
+++ wc = Widget_Bar;
+++ wc.draw = drv_generic_text_bar_draw;
+++ widget_register(&wc);
+++ }
+++
+++ if (!quiet) {
+++ char buffer[40];
+++ qprintf(buffer, sizeof(buffer), "%s %dx%d", Name, DCOLS, DROWS);
+++ drv_TEW673GRU_greet(buffer, "www.openwrt.org");
+++ sleep(3);
+++ drv_TEW673GRU_clear_screen();
+++ }
+++
+++ return 0;
+++}
+++
+++int drv_TEW673GRU_quit(const int quiet)
+++{
+++
+++ info("%s: shutting down.", Name);
+++
+++ drv_TEW673GRU_clear_screen();
+++
+++ if (!quiet)
+++ drv_TEW673GRU_greet("goodbye!", NULL);
+++
+++ if (MODE)
+++ drv_generic_graphic_quit();
+++ else
+++ drv_generic_text_quit();
+++
+++ debug("closing connection");
+++ drv_TEW673GRU_close();
+++
+++ return (0);
+++}
+++
+++DRIVER drv_TEW673GRU = {
+++ .name = Name,
+++ .list = drv_TEW673GRU_list,
+++ .init = drv_TEW673GRU_init,
+++ .quit = drv_TEW673GRU_quit,
+++};
++--- a/lcd4linux.conf.sample
+++++ b/lcd4linux.conf.sample
++@@ -581,6 +581,11 @@ Display FutabaVFD {
++ }
++ }
++
+++Display TEW673GRU {
+++ Driver 'TEW673GRU'
+++ Font '6x8'
+++ Port '/dev/spidev1.0'
+++}
++
++ #Plugin KVV {
++ # StationID '12_701'
+diff --git a/feeds/packages/utils/less/Makefile b/feeds/packages/utils/less/Makefile
+new file mode 100644
+index 0000000..2e79e8e
+--- /dev/null
++++ b/feeds/packages/utils/less/Makefile
+@@ -0,0 +1,93 @@
++#
++# Copyright (C) 2010-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=less
++PKG_VERSION:=481
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.greenwoodsoftware.com/less
++PKG_MD5SUM:=50ef46065c65257141a7340123527767
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Julen Landa Alustiza <julen@zokormazo.info>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/less/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Pager program similar to more
++ URL:=http://www.greenwoodsoftware.com/less/
++endef
++
++define Package/less/Default/description
++ Full version of GNU less utility
++endef
++
++define Package/less
++ $(call Package/less/Default)
++ DEPENDS:=+libncurses
++ VARIANT:=narrow
++endef
++
++define Package/less/description
++ $(call Package/less/Default/description)
++endef
++
++define Package/less-wide
++ $(call Package/less/Default)
++ TITLE+= (Unicode)
++ DEPENDS:=+libncursesw
++ VARIANT:=wide
++endef
++
++define Package/less-wide/description
++ $(call Package/less/Default/description)
++ This package contains the Unicode enabled version of less.
++endef
++
++ifeq ($(BUILD_VARIANT),narrow)
++ CONFIGURE_VARS += \
++ ac_cv_lib_ncursesw_initscr=no
++endif
++
++ifeq ($(BUILD_VARIANT),wide)
++ CONFIGURE_VARS += \
++ ac_cv_lib_ncursesw_initscr=yes
++endif
++
++define Package/less/install
++ $(INSTALL_DIR) $(1)/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/less $(1)/bin/less
++endef
++
++define Package/less/postinst
++#!/bin/sh
++[ -L "$${IPKG_INSTROOT}/usr/bin/less" ] && rm -f "$${IPKG_INSTROOT}/usr/bin/less"
++exit 0
++endef
++
++define Package/less/postrm
++#!/bin/sh
++/bin/busybox less -h 2>&1 | grep -q BusyBox && ln -sf ../../bin/busybox /usr/bin/less
++exit 0
++endef
++
++Package/less-wide/install = $(Package/less/install)
++Package/less-wide/postinst = $(Package/less/postinst)
++Package/less-wide/postrm = $(Package/less/postrm)
++
++$(eval $(call BuildPackage,less))
++$(eval $(call BuildPackage,less-wide))
+diff --git a/feeds/packages/utils/lm-sensors/Makefile b/feeds/packages/utils/lm-sensors/Makefile
+new file mode 100644
+index 0000000..4dcea0c
+--- /dev/null
++++ b/feeds/packages/utils/lm-sensors/Makefile
+@@ -0,0 +1,116 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lm-sensors
++PKG_VERSION:=3.3.5
++PKG_RELEASE:=2
++
++PKG_SOURCE:=lm_sensors-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://dl.lm-sensors.org/lm-sensors/releases
++PKG_MD5SUM:=da506dedceb41822e64865f6ba34828a
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++PKG_LICENSE:=GPL-2.0+ LGPL-2.1+
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/lm_sensors-$(PKG_VERSION)
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/lm-sensors/Default
++ DEPENDS:=+sysfsutils
++ URL:=http://www.lm-sensors.org/
++endef
++
++define Package/lm-sensors
++ $(call Package/lm-sensors/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=lm-sensors
++ DEPENDS+=+libsensors
++endef
++
++define Package/lm-sensors-detect
++ $(call Package/lm-sensors/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=lm-sensors-detect
++ DEPENDS+=+lm-sensors +perl +perlbase-essential +perlbase-fcntl +perlbase-file +perlbase-xsloader
++endef
++
++define Package/libsensors
++ $(call Package/lm-sensors/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libsensors
++endef
++
++define Package/lm-sensors/description
++ utility to read hardware sensor data
++endef
++
++define Package/lm-sensors-detect/description
++ script to autodetect sensor hardware
++endef
++
++define Package/libsensors/description
++ lm-sensors libraries
++endef
++
++define Package/lm-sensors/conffiles
++/etc/sensors.conf
++endef
++
++define Build/Compile
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ KERNELVERSION="$(LINUX_VERSION)" \
++ LINUX="$(LINUX_DIR)" \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ CPPFLAGS="$(TARGET_CPPFLAGS)" \
++ STAGING_DIR="$(STAGING_DIR)" \
++ PREFIX="/usr" \
++ MACHINE="$(ARCH)" \
++ EXLDFLAGS="" \
++ user
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/sensors
++ $(CP) \
++ $(PKG_BUILD_DIR)/lib/sensors.h \
++ $(1)/usr/include/sensors
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_BUILD_DIR)/lib/libsensors.{a,so*} \
++ $(1)/usr/lib
++endef
++
++define Package/lm-sensors/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/prog/sensors/sensors $(1)/usr/sbin
++ifeq ($(ARCH),i386)
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) ./files/sensors.conf $(1)/etc/sensors.conf
++endif
++endef
++
++define Package/lm-sensors-detect/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/prog/detect/sensors-detect $(1)/usr/sbin
++endef
++
++define Package/libsensors/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/lib/libsensors.so* $(1)/usr/lib
++endef
++
++$(eval $(call BuildPackage,lm-sensors))
++$(eval $(call BuildPackage,lm-sensors-detect))
++$(eval $(call BuildPackage,libsensors))
+diff --git a/feeds/packages/utils/lm-sensors/files/sensors.conf b/feeds/packages/utils/lm-sensors/files/sensors.conf
+new file mode 100644
+index 0000000..505b9d9
+--- /dev/null
++++ b/feeds/packages/utils/lm-sensors/files/sensors.conf
+@@ -0,0 +1,117 @@
++chip "pc87366-*"
++
++# Soekris net4801 configuration
++
++# Written by Henrik Brix Andersen <henrik@brixandersen.dk>
++# Latest version can be found at http://www.brixandersen.dk/
++
++# The configuration is partly based on the PC87366 datasheet and
++# partly borrowed from the env4801 utility by Poul-Henning
++# Kamp <phk@phk.freebsd.dk>
++
++# Datasheet: http://www.winbond.com/PDF/APCsheet/PC87366.pdf
++# env4801: http://phk.freebsd.dk/soekris/env4801/
++
++
++# Voltage inputs
++ ignore vid
++
++ # Unknown
++ # label in0 "avi0"
++ ignore in0
++
++
++ # Core Voltage, +2.0V
++ label in1 "VCORE"
++ set in1_min 1.9
++ set in1_max 2.1
++
++
++ # VCC, +5.0V
++ label in2 "VCC"
++ compute in2 @*2, @/2
++
++
++ # Power Supply Input, +6.0V - +28.0V
++ label in3 "VPWR"
++ compute in3 @*20.1, @/20.1
++ set in3_min 6.0
++ set in3_max 28.0
++
++
++ # +12V
++ label in4 "+12V"
++ compute in4 @*4.83, @/4.83
++ set in4_min 11
++ set in4_max 13
++
++
++ # -12V
++ label in5 "-12V"
++ # If in10 on your net4801 doesn't have the 3.3V reference, use this
++ # compute line instead:
++ # compute in5 (@-3.3)*19.2+3.3, (@-3.3)/19.2+3.3
++ compute in5 (@-in10)*19.2+in10, (@-in10)/19.2+in10
++ set in5_min -13
++ set in5_max -11
++
++
++ # GND, 0V
++ label in6 "GND"
++ set in6_min 0
++ set in6_max 0
++
++
++ # Standby Voltage, +3.3V
++ # Internally divided by 2
++ label in7 "Vsb"
++ compute in7 @*2, @/2
++ set in7_min 3.0
++ set in7_max 3.6
++
++
++ # Supply Voltage, +3.3V
++ # Internally divided by 2
++ label in8 "Vdd"
++ compute in8 @*2, @/2
++ set in8_min 3.0
++ set in8_max 3.6
++
++
++ # Battery Backup Supply Voltage, +3.0V
++ label in9 "Vbat"
++ set in9_min 2.4
++ set in9_max 3.6
++
++
++ # Analog Supply Voltage, +3.3V
++ # Internally divided by 2
++ label in10 "AVdd"
++ compute in10 @*2, @/2
++ set in10_min 3.0
++ set in10_max 3.6
++
++
++# Temperature inputs
++ ignore temp1
++ ignore temp2
++
++ # PC87366 Internal Temperature
++ # PC87366 Recommended Operating Conditions: 0 - 70C
++ # SC1100 Recommended Operating Conditions: 0 - 85C
++ label temp3 "Temp"
++ label temp3_crit "Critical"
++ set temp3_min 0
++ set temp3_max 70
++ set temp3_crit 85
++
++
++ ignore temp4
++ ignore temp5
++ ignore temp6
++
++
++# Fan inputs
++ ignore fan1
++ ignore fan2
++ ignore fan3
+diff --git a/feeds/packages/utils/lm-sensors/patches/100-musl-compat.patch b/feeds/packages/utils/lm-sensors/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..1cd82ab
+--- /dev/null
++++ b/feeds/packages/utils/lm-sensors/patches/100-musl-compat.patch
+@@ -0,0 +1,44 @@
++--- a/prog/dump/isadump.c
+++++ b/prog/dump/isadump.c
++@@ -38,7 +38,7 @@
++
++
++ /* To keep glibc2 happy */
++-#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ >= 0
+++#if !defined(__UCLIBC__)
++ #include <sys/io.h>
++ #else
++ #include <asm/io.h>
++--- a/prog/dump/isaset.c
+++++ b/prog/dump/isaset.c
++@@ -34,7 +34,7 @@
++
++
++ /* To keep glibc2 happy */
++-#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ >= 0
+++#if !defined(__UCLIBC__)
++ #include <sys/io.h>
++ #else
++ #include <asm/io.h>
++--- a/prog/dump/superio.c
+++++ b/prog/dump/superio.c
++@@ -21,7 +21,7 @@
++
++ #include <stdlib.h>
++
++-#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ >= 0
+++#if !defined(__UCLIBC__)
++ #include <sys/io.h>
++ #else
++ #include <asm/io.h>
++--- a/prog/dump/util.c
+++++ b/prog/dump/util.c
++@@ -12,7 +12,7 @@
++ #include "util.h"
++
++ /* To keep glibc2 happy */
++-#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ >= 0
+++#if !defined(__UCLIBC__)
++ #include <sys/io.h>
++ #else
++ #include <asm/io.h>
+diff --git a/feeds/packages/utils/lsof/Makefile b/feeds/packages/utils/lsof/Makefile
+new file mode 100644
+index 0000000..c891344
+--- /dev/null
++++ b/feeds/packages/utils/lsof/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=lsof
++PKG_VERSION:=4.89
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://www.mirrorservice.org/sites/lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ ftp://ftp.fu-berlin.de/pub/unix/tools/lsof
++PKG_MD5SUM:=1b9cd34f3fb86856a125abbf2be3a386
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)_$(PKG_VERSION)
++PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
++PKG_LICENSE:=Unique
++PKG_LICENSE_FILES:=00README
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_LDFLAGS += $(LIBRPC)
++
++define Package/lsof
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=$(LIBRPC_DEPENDS)
++ TITLE:=LiSt Open Files - a diagnostic tool
++ URL:=http://people.freebsd.org/~abe/
++endef
++
++ifneq ($(CONFIG_IPV6),n)
++ LINUX_CLIB_IPV6=-DHASIPv6
++else
++ LINUX_CLIB_IPV6=
++endif
++
++define Build/Prepare
++ $(PKG_UNPACK)
++ (cd $(PKG_BUILD_DIR) && tar -xf $(PKG_NAME)_$(PKG_VERSION)_src.tar && mv $(PKG_NAME)_$(PKG_VERSION)_src/* .)
++ $(Build/Patch)
++endef
++
++define Build/Configure
++ cd $(PKG_BUILD_DIR); \
++ LINUX_CLIB="-DGLIBCV=2 $(LINUX_CLIB_IPV6)" \
++ LSOF_CC="$(TARGET_CC)" \
++ LSOF_VSTR="$(LINUX_VERSION)" \
++ LSOF_CFGF="$(TARGET_CFLAGS)" \
++ LSOF_CFGL="$(TARGET_LDFLAGS)" \
++ LSOF_AR="$(TARGET_CROSS)ar cr" \
++ LSOF_RANLIB="$(TARGET_CROSS)ranlib" \
++ ./Configure -n linux
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR)
++endef
++
++define Package/lsof/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lsof $(1)/usr/bin
++endef
++
++$(eval $(call BuildPackage,lsof))
+diff --git a/feeds/packages/utils/lsof/patches/001-lsof_makefile.patch b/feeds/packages/utils/lsof/patches/001-lsof_makefile.patch
+new file mode 100644
+index 0000000..eb2b735
+--- /dev/null
++++ b/feeds/packages/utils/lsof/patches/001-lsof_makefile.patch
+@@ -0,0 +1,13 @@
++--- a/lib/Makefile.skel
+++++ b/lib/Makefile.skel
++@@ -21,8 +21,8 @@ OBJ= ckkv.o cvfs.o dvch.o fino.o isfn.o
++ all: ${LIB}
++
++ ${LIB}: ${OBJ}
++- ${AR}
++- ${RANLIB}
+++ ${AR} ${LIB} ${OBJ}
+++ ${RANLIB} ${LIB}
++
++ clean: FRC
++ rm -f ${LIB} ${OBJ} errs Makefile.bak a.out core
+diff --git a/feeds/packages/utils/lsof/patches/002-lsof_noportmap.patch b/feeds/packages/utils/lsof/patches/002-lsof_noportmap.patch
+new file mode 100644
+index 0000000..d0e8889
+--- /dev/null
++++ b/feeds/packages/utils/lsof/patches/002-lsof_noportmap.patch
+@@ -0,0 +1,18 @@
++--- a/print.c
+++++ b/print.c
++@@ -161,6 +161,7 @@ endnm(sz)
++ static void
++ fill_portmap()
++ {
+++#if !defined __UCLIBC__ || (defined __UCLIBC__ && defined __UCLIBC_HAS_RPC__)
++ char buf[128], *cp, *nm;
++ CLIENT *c;
++ int h, port, pr;
++@@ -279,6 +280,7 @@ fill_portmap()
++ Pth[pr][h] = pt;
++ }
++ clnt_destroy(c);
+++#endif
++ }
++ #endif /* !defined(HASNORPC_H) */
++
+diff --git a/feeds/packages/utils/lsof/patches/003-lsof_selinux.patch b/feeds/packages/utils/lsof/patches/003-lsof_selinux.patch
+new file mode 100644
+index 0000000..f3168e5
+--- /dev/null
++++ b/feeds/packages/utils/lsof/patches/003-lsof_selinux.patch
+@@ -0,0 +1,13 @@
++diff --git a/Configure b/Configure
++index e4a25a2..3a6e78b 100755
++--- a/Configure
+++++ b/Configure
++@@ -2923,7 +2923,7 @@ return(0); }
++ LSOF_TMP1=1
++ fi # }
++ fi # }
++- if test $LSOF_TMP1 -eq 1 # {
+++ if test 0 -eq 1 # {
++ then
++ LSOF_CFGF="$LSOF_CFGF -DHASSELINUX"
++ LSOF_CFGL="$LSOF_CFGL -lselinux"
+diff --git a/feeds/packages/utils/lsof/patches/004-lsof_ccv.patch b/feeds/packages/utils/lsof/patches/004-lsof_ccv.patch
+new file mode 100644
+index 0000000..e2f162b
+--- /dev/null
++++ b/feeds/packages/utils/lsof/patches/004-lsof_ccv.patch
+@@ -0,0 +1,14 @@
++diff --git a/Configure b/Configure
++index 3a6e78b..a2946c6 100755
++--- a/Configure
+++++ b/Configure
++@@ -2788,6 +2788,9 @@ LOCKF_OWNER4
++ if test "X$LSOF_CC" = "X" # {
++ then
++ LSOF_CC=cc
+++ fi # }
+++ if test "X$LSOF_CCV" = "X" # {
+++ then
++ LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
++ fi # }
++ if test "X$LINUX_CONF_CC" = "X" # {
+diff --git a/feeds/packages/utils/luci-app-lxc/Makefile b/feeds/packages/utils/luci-app-lxc/Makefile
+new file mode 100644
+index 0000000..f08d81e
+--- /dev/null
++++ b/feeds/packages/utils/luci-app-lxc/Makefile
+@@ -0,0 +1,68 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-app-lxc
++PKG_RELEASE:=20141012
++
++PKG_LICENSE:=Apache-2.0
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luci-app-lxc
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=3. Applications
++ TITLE:=LXC management Web UI
++ DEPENDS:=+luci-mod-admin-full +lxc +lxc-create +liblxc +rpcd-mod-lxc
++ MAINTAINER:=Petar Koretic <petar.koretic@sartura.hr>
++endef
++
++define Package/luci-app-lxc/description
++ This package will install LXC management Web UI.
++endef
++
++define Build/Prepare
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/luci-app-lxc/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
++ $(INSTALL_BIN) \
++ ./files/controller/lxc.lua \
++ $(1)/usr/lib/lua/luci/controller/
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/
++ $(INSTALL_DATA) \
++ ./files/view/lxc.htm \
++ $(1)/usr/lib/lua/luci/view/
++
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/
++ $(INSTALL_BIN) \
++ ./files/model/cbi/lxc.lua \
++ $(1)/usr/lib/lua/luci/model/cbi/
++
++ $(INSTALL_DIR) $(1)/etc/config/
++ $(INSTALL_DATA) \
++ ./files/lxc.config \
++ $(1)/etc/config/lxc
++
++ $(INSTALL_DIR) $(1)/www
++ $(CP) -R \
++ ./files/www/* \
++ $(1)/www
++endef
++
++$(eval $(call BuildPackage,luci-app-lxc))
+diff --git a/feeds/packages/utils/luci-app-lxc/files/controller/lxc.lua b/feeds/packages/utils/luci-app-lxc/files/controller/lxc.lua
+new file mode 100644
+index 0000000..f3f5d07
+--- /dev/null
++++ b/feeds/packages/utils/luci-app-lxc/files/controller/lxc.lua
+@@ -0,0 +1,125 @@
++--[[
++
++LuCI LXC module
++
++Copyright (C) 2014, Cisco Systems, Inc.
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Author: Petar Koretic <petar.koretic@sartura.hr>
++
++]]--
++
++module("luci.controller.lxc", package.seeall)
++
++require "ubus"
++local conn = ubus.connect()
++if not conn then
++ error("Failed to connect to ubus")
++end
++
++
++function fork_exec(command)
++ local pid = nixio.fork()
++ if pid > 0 then
++ return
++ elseif pid == 0 then
++ -- change to root dir
++ nixio.chdir("/")
++
++ -- patch stdin, out, err to /dev/null
++ local null = nixio.open("/dev/null", "w+")
++ if null then
++ nixio.dup(null, nixio.stderr)
++ nixio.dup(null, nixio.stdout)
++ nixio.dup(null, nixio.stdin)
++ if null:fileno() > 2 then
++ null:close()
++ end
++ end
++
++ -- replace with target command
++ nixio.exec("/bin/sh", "-c", command)
++ end
++end
++
++function index()
++ page = node("admin", "services", "lxc")
++ page.target = cbi("lxc")
++ page.title = _("LXC Containers")
++ page.order = 70
++
++ page = entry({"admin", "services", "lxc_create"}, call("lxc_create"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "services", "lxc_action"}, call("lxc_action"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "services", "lxc_configuration_get"}, call("lxc_configuration_get"), nil)
++ page.leaf = true
++
++ page = entry({"admin", "services", "lxc_configuration_set"}, call("lxc_configuration_set"), nil)
++ page.leaf = true
++
++end
++
++function lxc_create(lxc_name, lxc_template)
++ luci.http.prepare_content("text/plain")
++
++ local uci = require("uci").cursor()
++
++ local url = uci:get("lxc", "lxc", "url")
++
++ if not pcall(dofile, "/etc/openwrt_release") then
++ return luci.http.write("1")
++ end
++
++ local target = _G.DISTRIB_TARGET:match('([^/]+)')
++
++ local data = conn:call("lxc", "create", { name = lxc_name, template = "download", args = { "--server", url, "--no-validate", "--dist", lxc_template, "--release", "bb", "--arch", target } } )
++
++ luci.http.write(data)
++end
++
++function lxc_action(lxc_action, lxc_name)
++ luci.http.prepare_content("application/json")
++
++ local data, ec = conn:call("lxc", lxc_action, lxc_name and { name = lxc_name} or {} )
++
++ luci.http.write_json(ec and {} or data)
++end
++
++function lxc_configuration_get(lxc_name)
++ luci.http.prepare_content("text/plain")
++
++ local f = io.open("/lxc/" .. lxc_name .. "/config", "r")
++ local content = f:read("*all")
++ f:close()
++
++ luci.http.write(content)
++end
++
++function lxc_configuration_set(lxc_name)
++ luci.http.prepare_content("text/plain")
++
++ local lxc_configuration = luci.http.formvalue("lxc_configuration")
++
++ if lxc_configuration == nil then
++ return luci.http.write("1")
++ end
++
++ local f, err = io.open("/lxc/" .. lxc_name .. "/config","w+")
++ if not f then
++ return luci.http.write("2")
++ end
++
++ f:write(lxc_configuration)
++ f:close()
++
++ luci.http.write("0")
++end
++
+diff --git a/feeds/packages/utils/luci-app-lxc/files/lxc.config b/feeds/packages/utils/luci-app-lxc/files/lxc.config
+new file mode 100644
+index 0000000..5572c73
+--- /dev/null
++++ b/feeds/packages/utils/luci-app-lxc/files/lxc.config
+@@ -0,0 +1,6 @@
++#
++# lxc uci configuration
++#
++
++config lxc 'lxc'
++ option url 'virtualwrt.org/containers/'
+diff --git a/feeds/packages/utils/luci-app-lxc/files/model/cbi/lxc.lua b/feeds/packages/utils/luci-app-lxc/files/model/cbi/lxc.lua
+new file mode 100644
+index 0000000..ac0fdff
+--- /dev/null
++++ b/feeds/packages/utils/luci-app-lxc/files/model/cbi/lxc.lua
+@@ -0,0 +1,31 @@
++--[[
++
++LuCI LXC module
++
++Copyright (C) 2014, Cisco Systems, Inc.
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Author: Petar Koretic <petar.koretic@sartura.hr>
++
++]]--
++
++local fs = require "nixio.fs"
++
++m = Map("lxc", translate("LXC Containers"))
++
++if fs.access("/etc/config/lxc") then
++ m:section(SimpleSection).template = "lxc"
++
++ s = m:section(TypedSection, "lxc", translate("Options"))
++ s.anonymous = true
++ s.addremove = false
++
++ s:option(Value, "url", translate("Containers URL"))
++end
++
++return m
+diff --git a/feeds/packages/utils/luci-app-lxc/files/view/lxc.htm b/feeds/packages/utils/luci-app-lxc/files/view/lxc.htm
+new file mode 100644
+index 0000000..1376968
+--- /dev/null
++++ b/feeds/packages/utils/luci-app-lxc/files/view/lxc.htm
+@@ -0,0 +1,441 @@
++<%#
++
++LuCI LXC module
++
++Copyright (C) 2014, Cisco Systems, Inc.
++
++Licensed under the Apache License, Version 2.0 (the "License");
++you may not use this file except in compliance with the License.
++You may obtain a copy of the License at
++
++ http://www.apache.org/licenses/LICENSE-2.0
++
++Author: Petar Koretic <petar.koretic@sartura.hr>
++
++-%>
++
++<fieldset class="cbi-section">
++ <legend><%:Available Containers%></legend>
++ <div class="cbi-section-node">
++ <table id="t_lxc_list" class="cbi-section-table">
++ <tr class="cbi-section-table-titles">
++ <th class="cbi-section-table-cell"><%:Name%></th>
++ <th class="cbi-section-table-cell"><%:Status%></th>
++ <th class="cbi-section-table-cell"><%:Actions%></th>
++ </tr>
++ </table>
++ </div>
++</fieldset>
++
++<fieldset class="cbi-section">
++ <span id="lxc-list-output"></span>
++</fieldset>
++
++<hr/>
++<fieldset class="cbi-section">
++ <legend><%:Create New Container%></legend>
++ <div class="cbi-section-node">
++ <table id="t_lxc_create" class="cbi-section-table">
++ <tr class="cbi-section-table-titles">
++ <th class="cbi-section-table-cell"><%:Name%></th>
++ <th class="cbi-section-table-cell"><%:Template%></th>
++ <th class="cbi-section-table-cell"><%:Actions%></th>
++ </tr>
++ <tr id="tr_holder">
++ <td>
++ <input type="text" id="tx_name" placeholder="<%:Enter new name%>" value='' />
++ </td>
++ <td>
++ <select id="s_template" class="cbi-input-select cbi-button">
++ <option value="openwrt">OpenWrt</option>
++ </select>
++ </td>
++ <td>
++ <input type="button" id="bt_create" value="<%:Create%>" onclick="lxc_create(tr_holder)" class="cbi-button cbi-button-add" />
++ <span id="lxc-add-loader" style="display:inline-block; width:16px; height:16px; margin:0 5px"></span>
++ </td>
++ </tr>
++ </table>
++ </div>
++</fieldset>
++
++<fieldset class="cbi-section">
++ <span id="lxc-add-output"></span>
++</fieldset>
++
++<hr/>
++
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript">//<![CDATA[
++
++ window.img = { "red" : "<%=resource%>/cbi/red.gif", "green" : "<%=resource%>/cbi/green.gif", "purple" : "<%=resource%>/cbi/purple.gif" }
++ window.states = { "STOPPED" : "red", "RUNNING" : "green", "FROZEN" : "purple"}
++
++ var t_lxc_list = document.getElementById('t_lxc_list');
++ var loader_html = '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" width="16" height="16" style="vertical-align:middle" /> ';
++ var timeout_msg = 0
++ var output_list = document.getElementById("lxc-list-output")
++ var output_add = document.getElementById("lxc-add-output")
++ var loader_add = document.getElementById("lxc-add-loader")
++
++ function lxc_create(tr)
++ {
++ var lxc_name = tr.querySelector("#tx_name").value.trim()
++ var lxc_template = tr.querySelector("#s_template").value
++ var bt_create = tr.querySelector("#bt_create")
++
++ if (t_lxc_list.querySelector("[data-id='" + lxc_name + "']") != null)
++ return info_message(output_add, "Container with that name already exists!", 4000)
++
++ bt_create.disabled = true
++ output_add.innerHTML = ''
++
++ if (!lxc_name || !lxc_name.length)
++ {
++ bt_create.disabled = false
++ return info_message(output_add, "Name cannot be empty!", 4000)
++ }
++
++ loading(loader_add)
++
++ new XHR().get('<%=luci.dispatcher.build_url("admin", "services")%>/lxc_create/' + '%h/%h'.format(lxc_name, lxc_template) , null,
++ function(x)
++ {
++ bt_create.disabled = false
++ loading(loader_add, 0)
++
++ if (!x)
++ info_message(output_add, "Container creation failed!")
++ })
++ }
++
++ function lxc_create_template(lxc_name, lxc_state)
++ {
++ var info_row = t_lxc_list.querySelector("#empty")
++ if (info_row)
++ t_lxc_list.deleteRow(1)
++
++ var actions = ''
++ actions += '<input type="button" onclick="action_handler(this)" data-action="start" value="<%:Start%>" class="cbi-button cbi-button-apply" />'
++ actions+= '<input type="button" onclick="action_handler(this)" data-action="stop" value="<%:Stop%>" class="cbi-button cbi-button-reset" />'
++ actions+= '<input type="button" onclick="action_handler(this)" data-action="destroy" value="<%:Delete%>" class="cbi-button cbi-button-remove" />'
++ actions+= ' <select class="cbi-input-select cbi-button" onchange="action_more_handler(this)">\
++ <option selected disabled>more</option>\
++ <option>configure</option>\
++ <option>freeze</option>\
++ <option>unfreeze</option>\
++ <option>reboot</option>\
++ </select>'
++ actions+= '<span data-loader style="display:inline-block; width:16px; height:16px; margin:0 5px"></span>'
++
++ var row = t_lxc_list.insertRow(-1)
++ var cell = row.insertCell(-1)
++ cell.innerHTML = '%q%h%q'.format("<strong>", lxc_name, "</strong>")
++ cell.width = "30%"
++ cell.setAttribute("data-id", lxc_name)
++
++ cell = row.insertCell(-1)
++ cell.width = "20%"
++ cell.innerHTML = "<img src='"+window.img[lxc_state]+"'/>"
++
++ cell = row.insertCell(-1)
++ cell.width = "50%"
++ cell.innerHTML = actions
++ }
++
++ function action_handler(self)
++ {
++ var action = self.getAttribute("data-action");
++
++ var bt_action = self
++ var lxc_name = self.parentNode.parentNode.children[0].getAttribute('data-id')
++ var status_img = self.parentNode.parentNode.querySelector('img')
++ var loader = self.parentNode.querySelector('[data-loader]')
++
++ bt_action.disabled = true
++
++ if (action == "stop")
++ {
++ loading(loader)
++
++ new XHR().get('<%=luci.dispatcher.build_url("admin", "services")%>/lxc_action/' + '%h/%h'.format(action, lxc_name), null,
++ function(x, ec)
++ {
++ loading(loader, 0)
++ bt_action.disabled = false
++
++ if (!x || ec)
++ return info_message(output_list,"Action failed!")
++
++ set_status(status_img, "red")
++
++ });
++ }
++
++ else if (action == "start")
++ {
++ loading(loader)
++
++ new XHR().get('<%=luci.dispatcher.build_url("admin", "services")%>/lxc_action/' + '%h/%h'.format(action, lxc_name), null,
++ function(x, data)
++ {
++ loading(loader, 0)
++ bt_action.disabled = false
++
++ //FIXME: uncomment after fixing 'lxc-start'
++ if (!x /*|| ec */)
++ return info_message(output_list,"Action failed!")
++
++ //FIXME: uncomment after fixing 'lxc-start'
++ //set_status(status_img, "green")
++ });
++ }
++
++ else if (action == "destroy")
++ {
++ if (!confirm("This will completely remove LXC container from the disk. Are you sure? (container will be stopped if running)"))
++ return
++
++ loading(loader)
++
++ new XHR().get('<%=luci.dispatcher.build_url("admin", "services")%>/lxc_action/' + '%h/%h'.format(action, lxc_name), null,
++ function(x, ec)
++ {
++ loading(loader, 0)
++ bt_action.disabled = false
++
++ if (!x || ec)
++ return info_message(output_list,"Action failed!")
++
++ var row = self.parentNode.parentNode
++ row.parentNode.removeChild(row)
++
++ });
++ }
++ }
++
++ function lxc_configure_handler(self)
++ {
++ var td = self.parentNode
++ var textarea = td.querySelector('[data-id]')
++ var lxc_name = textarea.getAttribute('data-id')
++ var lxc_configuration = textarea.value
++
++ new XHR().post('<%=luci.dispatcher.build_url("admin", "services")%>/lxc_configuration_set/' + lxc_name, "lxc_configuration=" + encodeURIComponent(lxc_configuration) ,
++ function(x)
++ {
++ if (!x || x.responseText != "0")
++ return info_message(output_list,"Action failed!")
++
++ info_message(output_list,"LXC configuration updated")
++ var row = td.parentNode
++ row.parentNode.removeChild(row)
++ })
++ }
++
++ function lxc_rename_template(lxc_name)
++ {
++ var h = '\
++ <input data-id="'+ lxc_name + '" type="text" placeholder="Enter new name" /> \
++ <input data-id="bt_confirm" onclick="lxc_rename_handler(this)" type="button" class="cbi-button" value="Confirm" />'
++
++ return h
++ }
++
++ function lxc_configure_template(lxc_name, lxc_configuration)
++ {
++ var h = '\
++ <textarea data-id="'+ lxc_name + '" rows="20" style="width:100%">'+ lxc_configuration +'</textarea> \
++ <input data-id="bt_confirm" onclick="lxc_configure_handler(this)" type="button" class="cbi-button" value="Confirm" />'
++
++ return h
++ }
++
++ function action_more_handler(self)
++ {
++ var lxc_name = self.parentNode.parentNode.querySelector('[data-id]').getAttribute('data-id')
++ var loader = self.parentNode.parentNode.querySelector('[data-loader]')
++
++ var option = self.options[self.selectedIndex].text
++
++ self.value = "more"
++
++ switch (option)
++ {
++ case "configure":
++ var tr = document.createElement('tr')
++ var row = self.parentNode.parentNode
++ var next_row = row.nextSibling
++ if (next_row && next_row.getAttribute('data-action') !== null)
++ row.parentNode.removeChild(next_row)
++
++ new XHR().get('<%=luci.dispatcher.build_url("admin", "services")%>/lxc_configuration_get/' + lxc_name, null,
++ function(x)
++ {
++ tr.innerHTML="<td colspan='" + row.cells.length + "'>" + lxc_configure_template(lxc_name, x.responseText) + "</td>"
++ tr.setAttribute('data-action','')
++ row.parentNode.insertBefore(tr, row.nextSibling)
++ })
++
++ break
++
++ case "freeze":
++ var tr = self.parentNode.parentNode
++ var img = tr.querySelector('img')
++ if(img.getAttribute('src') != window.img["green"])
++ return info_message(output_list,"Container is not running!")
++
++ loading(loader)
++ new XHR().get('<%=luci.dispatcher.build_url("admin", "services")%>/lxc_action/' + '%h/%h'.format(option, lxc_name), null,
++ function(x, ec)
++ {
++ loading(loader, 0)
++ if (!x || ec)
++ return info_message(output_list,"Action failed!")
++
++ set_status(img, "purple")
++ })
++
++ break
++
++ case "unfreeze":
++ var tr = self.parentNode.parentNode
++ var img = tr.querySelector('img')
++
++ if(img.getAttribute('src') != window.img["purple"])
++ return info_message(output_list,"Container is not frozen!")
++
++ loading(loader)
++ new XHR().get('<%=luci.dispatcher.build_url("admin", "services")%>/lxc_action/' + '%h/%h'.format(option, lxc_name), null,
++ function(x, ec)
++ {
++ loading(loader, 0)
++ if (!x || ec)
++ return info_message(output_list,"Action failed!")
++
++ set_status(img, "green")
++ })
++
++ break
++
++ case "reboot":
++ var tr = self.parentNode.parentNode
++ var img = tr.querySelector('img')
++ if(img.getAttribute('src') != window.img["green"])
++ return info_message(output_list,"Container is not running!")
++
++ if (!confirm("Are you sure?"))
++ return
++
++ loading(loader)
++ new XHR().get('<%=luci.dispatcher.build_url("admin", "services")%>/lxc_action/' + '%h/%h'.format(option, lxc_name), null,
++ function(x, ec)
++ {
++ loading(loader, 0)
++ if (!x || ec)
++ return info_message(output_list,"Action failed!")
++
++ info_message(output_list,"LXC rebooted")
++ })
++ break
++ }
++
++ }
++
++ function set_empty(t_lxc_list)
++ {
++ if (document.getElementById('empty') !== null)
++ return
++
++ var row_count = t_lxc_list.rows.length;
++ while(--row_count) t_lxc_list.deleteRow(row_count);
++
++ var row = t_lxc_list.insertRow(-1);
++ row.id = 'empty'
++ var cell = row.insertCell(0);
++ cell.colSpan = 4;
++ cell.innerHTML = '<em><br />There are no containers available yet.</em>';
++ }
++
++ function lxc_list_update()
++ {
++ XHR.poll(4, '<%=luci.dispatcher.build_url("admin", "services")%>/lxc_action/list', null,
++ function(x, data)
++ {
++ if (!x) return;
++
++ var lxc_count = Object.keys(data).length
++ if (!data || !lxc_count)
++ return set_empty(t_lxc_list)
++
++ if (document.getElementById('empty') !== null)
++ t_lxc_list.deleteRow(1);
++
++ var lxcs = t_lxc_list.querySelectorAll('td[data-id]')
++ var lxc_name_table = {}
++ for (var i = 0, len = lxcs.length; i < len; i++)
++ {
++ var lxc_name = lxcs[i].getAttribute('data-id')
++ if (!(lxc_name in data))
++ {
++ var row = t_lxc_list.querySelector("[data-id='" + lxc_name + "']").parentNode
++ row.parentNode.removeChild(row)
++ continue
++ }
++
++ lxc_name_table[lxc_name] = lxcs[i].parentNode.querySelector('img')
++ }
++
++ for(var key in data)
++ {
++ var lxc_name = key
++ var state = window.states[data[key]]
++
++ if (!(lxc_name in lxc_name_table))
++ lxc_create_template(lxc_name, state)
++
++ else if (state != get_status(lxc_name_table[lxc_name]))
++ set_status(lxc_name_table[lxc_name], state)
++ }
++
++ })
++ }
++
++ function loading(elem, state)
++ {
++ state = (typeof state === 'undefined') ? 1 : state
++
++ if (state === 1)
++ elem.innerHTML = loader_html
++ else
++ setTimeout(function() { elem.innerHTML = ''}, 1000)
++ }
++
++ function set_status(elem, state)
++ {
++ state = (typeof state === 'undefined') ? 1 : state
++
++ setTimeout(function() { elem.setAttribute('src', window.img[state])}, 300)
++ }
++
++ function get_status(elem)
++ {
++ var src = elem.getAttribute('src')
++
++ for (var i in img)
++ {
++ if (img[i] == src)
++ return i
++ }
++ }
++
++ function info_message(output, msg, timeout)
++ {
++ timeout = timeout || 3000
++ output.innerHTML = msg
++ clearTimeout(timeout_msg)
++ timeout_msg = setTimeout(function(){ output.innerHTML=""}, timeout);
++ }
++
++ lxc_list_update()
++//]]></script>
+diff --git a/feeds/packages/utils/luci-app-lxc/files/www/luci-static/resources/cbi/green.gif b/feeds/packages/utils/luci-app-lxc/files/www/luci-static/resources/cbi/green.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..d09febf1273b9a20ed89f69b19c9837c325b6db2
+GIT binary patch
+literal 310
+zcmV-60m=SHNk%w1VG;lm0K^{vZ~bkE`i3IOOtAj1%l^tt)@2&AVF&*PSoufY_~E|k
+z)JgwHS>#<B{~2}AqJ8O#A^#yh|2{6|G?V|5N&7n`{~R&@B@+J+KH^8f`M^}}P&u`P
+zg7SbT=_dgH0RR90A^8LW0018VEC2ui01^Na000HE;3tY1r*)miWn=p#W-uf~sU|KV
+ztwisa62d648yJn5<A5W<eI9^-bV9941AxaTg8_KIU@#{0U@RhwbYz`AM-Yrh0a0l{
+z?v2aEj&C3e0tg2l9tVblhlB?R0)c~skdcav1sWHUm>w4z1r7`qnUWO@4hjMkkD&(?
+z0tz3V7O9d47M&sq1`M&7v<wDL9|{Hq6crbS7Znr*2Cgj$4#OG<2%H8Ez%B|78wLg&
+Ir7j@=J5RTB3jhEB
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/packages/utils/luci-app-lxc/files/www/luci-static/resources/cbi/purple.gif b/feeds/packages/utils/luci-app-lxc/files/www/luci-static/resources/cbi/purple.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..f0d68cc8b2c8e78ee3d8948f67fcb9e1c15f8e94
+GIT binary patch
+literal 317
+zcmV-D0mA-ANk%w1VG;lm0K^{v>e%u0>iE{m+T+XZwTj1<W~juJ*}aU?t%bbFn%-YE
+zZOftF+Pvs;MS;$x;iHPH>Er9cj@j0><j|?%#h%s4tkt!ezkODUqkOU4!0GSd^^jtr
+zu9LUFiPyb`*8l(iA^8LW0018VEC2ui01^Na000HL;3tY2vqaItXk+^YW(EWSkg0*I
+z9g^nL0UzVQ5(NkhfKsDu0vLqcM=}{?2G}h2I+1(;NQs0&E@v2GD4;@_I2;rAVgYx<
+zDHX)Rz)$c|eS8KB2n7xu9v&TwiHnGe4h0*BiItX>9S$296cLx79uX8676b;Mmj(nD
+z0vijDs2vL%0v{X*39y$P2?!h_5Df&mpS%PO5F-K&7<&<m5rY^FwJi`27o-k*7#9!8
+PE+PWh3JTuUBOw4gzwCq@
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/packages/utils/luci-app-lxc/files/www/luci-static/resources/cbi/red.gif b/feeds/packages/utils/luci-app-lxc/files/www/luci-static/resources/cbi/red.gif
+new file mode 100644
+index 0000000000000000000000000000000000000000..c1b39bbedb72c8265531985640df71d761c5f902
+GIT binary patch
+literal 320
+zcmV-G0l)r7Nk%w1VG;lm0K@<Q{Ck!DyU6`GTK8da{VG-Z-s9RqVgD3G$~I5`)7$-p
+znES}l{cnoYcZ&a2ckH~z|3z)%T4w)~sQ;a@|FFN?8$<p}aQ`4p!W=sMQ)%czWVIJJ
+z-*}Gy7e@aOLjV8&A^8LV00000EC2ui01^Na000HO;3tX!09_XZ1Y`RZfTaXU5hxZ=
+zxC;R+i-a%%1P~UZ0zpA(2A+W?MM2no01SzC!tH7$48SL#Q82=QG#blLXi5Wz#X+|~
+zAoIFo0MHBwfC7Lhfq(=98WjT_9v%lB2a%5ljU59Oij0k$oRyab0~ej69v1@!91#Mf
+zodOXY4+t5WtQ{E$4<D%lw4EKU93ll6s=bXDt{7Gy3&a@$7abkQ84(yrEd>n-5d+>4
+S5eN;-E)Uxq8{)YwApkob^ml{+
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/packages/utils/lvm2/Makefile b/feeds/packages/utils/lvm2/Makefile
+new file mode 100644
+index 0000000..04be414
+--- /dev/null
++++ b/feeds/packages/utils/lvm2/Makefile
+@@ -0,0 +1,95 @@
++#
++# Copyright (C) 2009-2010 Stefan Monnier
++# Copyright (C) 2011-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v3+.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=LVM2
++PKG_VERSION:=2.02.132
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0 LGPL-2.1
++
++PKG_SOURCE:=$(PKG_NAME).$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=ftp://sources.redhat.com/pub/lvm2
++PKG_MD5SUM:=80af5af726949bbbb2aceb15b24b7d20
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME).$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libdevmapper
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=The Linux Kernel Device Mapper userspace library
++ URL:=http://sourceware.org/dm/
++ DEPENDS:=+kmod-dm +libpthread
++endef
++
++define Package/libdevmapper/description
++ The device-mapper is a component of the 2.6 linux kernel that supports logical
++ volume management. It is required by LVM2 and EVMS.
++endef
++
++define Package/lvm2
++ SECTION:=utils
++ CATEGORY:=Utilities
++ SUBMENU:=disc
++ TITLE:=The Linux Logical Volume Manager
++ URL:=http://sourceware.org/lvm2/
++ DEPENDS:=+libdevmapper +libblkid +libreadline +libncurses
++endef
++
++define Package/lvm2/description
++ LVM2 refers to a new userspace toolset that provide logical volume management
++ facilities on linux. It is reasonably backwards-compatible with the original
++ LVM toolset.
++endef
++
++CONFIGURE_ARGS += --disable-o_direct
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS) $(FPIC)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/include/libdevmapper.h $(1)/usr/include
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libdevmapper.so* $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_BUILD_DIR)/libdm/libdevmapper.pc $(1)/usr/lib/pkgconfig
++endef
++
++define Package/libdevmapper/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libdevmapper.so.* $(1)/usr/lib
++endef
++
++define Package/lvm2/install
++ $(INSTALL_DIR) $(1)/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/lvm $(1)/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/dmsetup $(1)/sbin
++ $(INSTALL_DIR) $(1)/etc/lvm
++ $(SED) '/^[[:space:]]*\(#\|$$$$\)/d; /cache_dir/s@.*@ cache_dir = "/tmp/lvm/cache"@' $(PKG_INSTALL_DIR)/etc/lvm/lvm.conf
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/lvm/lvm.conf $(1)/etc/lvm/
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/lvm/lvmlocal.conf $(1)/etc/lvm/
++ $(INSTALL_DIR) $(1)/etc/lvm/profile
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/lvm/profile/* $(1)/etc/lvm/profile/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/lvm2.init $(1)/etc/init.d/lvm2
++ $(FIND) $(PKG_INSTALL_DIR)/usr/sbin/ -type l -exec $(CP) -a {} $(1)/sbin/ \;
++endef
++
++define Package/lvm2/conffiles
++/etc/lvm/lvm.conf
++endef
++
++$(eval $(call BuildPackage,libdevmapper))
++$(eval $(call BuildPackage,lvm2))
+diff --git a/feeds/packages/utils/lvm2/files/lvm2.init b/feeds/packages/utils/lvm2/files/lvm2.init
+new file mode 100644
+index 0000000..4faf5d5
+--- /dev/null
++++ b/feeds/packages/utils/lvm2/files/lvm2.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009 Stefan Monnier
++START=15
++
++start () {
++ mkdir -p /tmp/lvm/cache
++ /sbin/lvm vgscan --ignorelockingfailure --mknodes || :
++ /sbin/lvm vgchange -aly --ignorelockingfailure || return 2
++}
++
++stop () {
++ mkdir -p /tmp/lvm/cache
++ /sbin/lvm vgchange -aln --ignorelockingfailure || return 2
++}
+diff --git a/feeds/packages/utils/lvm2/patches/000-compile.patch b/feeds/packages/utils/lvm2/patches/000-compile.patch
+new file mode 100644
+index 0000000..9fa1c1d
+--- /dev/null
++++ b/feeds/packages/utils/lvm2/patches/000-compile.patch
+@@ -0,0 +1,11 @@
++--- a/make.tmpl.in
+++++ b/make.tmpl.in
++@@ -19,7 +19,7 @@ SHELL = /bin/sh
++
++ # Allow environment to override any built-in default value for CC.
++ # If there is a built-in default, CC is NOT set to @CC@ here.
++-CC ?= @CC@
+++CC = @CC@
++
++ # If $(CC) holds the usual built-in default value of 'cc' then replace it with
++ # the configured value.
+diff --git a/feeds/packages/utils/lvm2/patches/001-include_fix.patch b/feeds/packages/utils/lvm2/patches/001-include_fix.patch
+new file mode 100644
+index 0000000..09d2db9
+--- /dev/null
++++ b/feeds/packages/utils/lvm2/patches/001-include_fix.patch
+@@ -0,0 +1,11 @@
++--- a/lib/device/dev-type.c
+++++ b/lib/device/dev-type.c
++@@ -22,7 +22,7 @@
++ #include <ctype.h>
++
++ #ifdef BLKID_WIPING_SUPPORT
++-#include <blkid.h>
+++#include <blkid/blkid.h>
++ #endif
++
++ #ifdef UDEV_SYNC_SUPPORT
+diff --git a/feeds/packages/utils/lvm2/patches/002-const-stdio.patch b/feeds/packages/utils/lvm2/patches/002-const-stdio.patch
+new file mode 100644
+index 0000000..c26232d
+--- /dev/null
++++ b/feeds/packages/utils/lvm2/patches/002-const-stdio.patch
+@@ -0,0 +1,54 @@
++--- a/lib/commands/toolcontext.c
+++++ b/lib/commands/toolcontext.c
++@@ -1740,8 +1740,10 @@ struct cmd_context *create_toolcontext(u
++ unsigned set_filters)
++ {
++ struct cmd_context *cmd;
+++#if defined(__GLIBC__) && !defined(VALGRIND_POOL)
++ FILE *new_stream;
++ int flags;
+++#endif
++
++ #ifdef M_MMAP_MAX
++ mallopt(M_MMAP_MAX, 0);
++@@ -1777,7 +1779,7 @@ struct cmd_context *create_toolcontext(u
++ /* FIXME Make this configurable? */
++ reset_lvm_errno(1);
++
++-#ifndef VALGRIND_POOL
+++#if defined(__GLIBC__) && !defined(VALGRIND_POOL)
++ /* Set in/out stream buffering before glibc */
++ if (set_buffering) {
++ /* Allocate 2 buffers */
++@@ -2160,7 +2162,7 @@ void destroy_toolcontext(struct cmd_cont
++ if (cmd->libmem)
++ dm_pool_destroy(cmd->libmem);
++
++-#ifndef VALGRIND_POOL
+++#if defined(__GLIBC__) && !defined(VALGRIND_POOL)
++ if (cmd->linebuffer) {
++ /* Reset stream buffering to defaults */
++ if (is_valid_fd(STDIN_FILENO) &&
++--- a/tools/lvmcmdline.c
+++++ b/tools/lvmcmdline.c
++@@ -1741,6 +1741,7 @@ int lvm_split(char *str, int *argc, char
++ /* Make sure we have always valid filedescriptors 0,1,2 */
++ static int _check_standard_fds(void)
++ {
+++#ifdef __GLIBC__
++ int err = is_valid_fd(STDERR_FILENO);
++
++ if (!is_valid_fd(STDIN_FILENO) &&
++@@ -1767,6 +1768,12 @@ static int _check_standard_fds(void)
++ strerror(errno));
++ return 0;
++ }
+++#else
+++ if (!is_valid_fd(STDERR_FILENO) ||
+++ !is_valid_fd(STDOUT_FILENO) ||
+++ !is_valid_fd(STDIN_FILENO))
+++ return 0;
+++#endif
++
++ return 1;
++ }
+diff --git a/feeds/packages/utils/lvm2/patches/003-no-mallinfo.patch b/feeds/packages/utils/lvm2/patches/003-no-mallinfo.patch
+new file mode 100644
+index 0000000..be9a662
+--- /dev/null
++++ b/feeds/packages/utils/lvm2/patches/003-no-mallinfo.patch
+@@ -0,0 +1,45 @@
++--- a/lib/mm/memlock.c
+++++ b/lib/mm/memlock.c
++@@ -161,12 +161,15 @@ static void _allocate_memory(void)
++ * memory on free(), this is good enough for our purposes.
++ */
++ while (missing > 0) {
+++#ifdef __GLIBC__
++ struct mallinfo inf = mallinfo();
++ hblks = inf.hblks;
+++#endif
++
++ if ((areas[area] = malloc(_size_malloc_tmp)))
++ _touch_memory(areas[area], _size_malloc_tmp);
++
+++#ifdef __GLIBC__
++ inf = mallinfo();
++
++ if (hblks < inf.hblks) {
++@@ -176,9 +179,12 @@ static void _allocate_memory(void)
++ free(areas[area]);
++ _size_malloc_tmp /= 2;
++ } else {
+++#endif
++ ++ area;
++ missing -= _size_malloc_tmp;
+++#ifdef __GLIBC__
++ }
+++#endif
++
++ if (area == max_areas && missing > 0) {
++ /* Too bad. Warn the user and proceed, as things are
++@@ -467,8 +473,13 @@ static void _lock_mem(struct cmd_context
++ * will not block memory locked thread
++ * Note: assuming _memlock_count_daemon is updated before _memlock_count
++ */
+++#ifdef __GLIBC__
++ _use_mlockall = _memlock_count_daemon ? 1 :
++ find_config_tree_bool(cmd, activation_use_mlockall_CFG, NULL);
+++#else
+++ /* always use mlockall on musl */
+++ _use_mlockall = 1;
+++#endif
++
++ if (!_use_mlockall) {
++ if (!*_procselfmaps &&
+diff --git a/feeds/packages/utils/lxc/Config.in b/feeds/packages/utils/lxc/Config.in
+new file mode 100644
+index 0000000..618fde0
+--- /dev/null
++++ b/feeds/packages/utils/lxc/Config.in
+@@ -0,0 +1,37 @@
++menu "Configuration"
++ depends on PACKAGE_lxc
++
++config LXC_KERNEL_OPTIONS
++ bool "Enable kernel support for LXC"
++ default n
++ select KERNEL_CGROUPS
++ select KERNEL_NAMESPACES
++ select KERNEL_LXC_MISC
++ help
++ Select needed kernel options for LXC related utilities. Options
++ include cgroups, namespaces and other miscellaneous options. These
++ options unfortunately can not be installed as a module.
++
++config LXC_BUSYBOX_OPTIONS
++ bool "Enable busybox support for lxc-create tool"
++ default n
++ select BUSYBOX_CUSTOM
++ select BUSYBOX_CONFIG_HAVE_DOT_CONFIG
++ select BUSYBOX_CONFIG_FEATURE_SEAMLESS_XZ
++ select BUSYBOX_CONFIG_FEATURE_TAR_LONG_OPTIONS
++ select BUSYBOX_CONFIG_UNXZ
++ select BUSYBOX_CONFIG_XZ
++ select BUSYBOX_CONFIG_GETOPT
++ select BUSYBOX_CONFIG_FEATURE_GETOPT_LONG
++ help
++ Select needed busybox options for lxc-create utility. This include XZ tar
++ compression, long option support for tar and built-in getopt support.
++
++config LXC_SECCOMP
++ bool "Enable support for seccomp in LXC"
++ default KERNEL_SECCOMP
++ help
++ Build LXC with support for seccomp filters.
++ Select libseccomp which also pulls-in the needed kernel features.
++
++endmenu
+diff --git a/feeds/packages/utils/lxc/Makefile b/feeds/packages/utils/lxc/Makefile
+new file mode 100644
+index 0000000..de9cecf
+--- /dev/null
++++ b/feeds/packages/utils/lxc/Makefile
+@@ -0,0 +1,255 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=lxc
++PKG_VERSION:=1.1.3
++PKG_RELEASE:=1
++
++PKG_LICENSE:=LGPL-2.1+ BSD-2-Clause GPL-2.0
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://linuxcontainers.org/downloads/lxc/
++PKG_MD5SUM:=197abb5a28ab0b689c737eb1951023fb
++
++PKG_BUILD_DEPENDS:=lua
++PKG_BUILD_PARALLEL:=1
++
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++LXC_APPLETS_BIN += \
++ attach autostart cgroup clone config console create destroy device \
++ execute freeze info monitor snapshot start stop unfreeze unshare \
++ usernsexec wait
++
++LXC_APPLETS_LIB += \
++ monitord user-nic
++
++LXC_SCRIPTS += \
++ checkconfig ls top
++
++DEPENDS_APPLETS = +libpthread +libcap +liblxc
++
++DEPENDS_create = +lxc-configs +lxc-hooks +lxc-templates
++DEPENDS_ls = +lxc-config
++DEPENDS_top = +lxc-lua +luafilesystem @BROKEN
++
++
++define Package/lxc/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=LXC userspace tools
++ URL:=http://lxc.sourceforge.net/
++endef
++
++define Package/lxc
++ $(call Package/lxc/Default)
++ MENU:=1
++endef
++
++define Package/lxc/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/lxc/description
++ LXC is the userspace control package for Linux Containers, a lightweight
++ virtual system mechanism sometimes described as "chroot on steroids".
++endef
++
++define Package/lxc-common
++ $(call Package/lxc/Default)
++ TITLE:=LXC common files
++ DEPENDS:= lxc
++endef
++
++define Package/lxc-hooks
++ $(call Package/lxc/Default)
++ TITLE:=LXC virtual machine hooks
++ DEPENDS:= lxc
++endef
++
++define Package/lxc-templates
++ $(call Package/lxc/Default)
++ TITLE:=LXC virtual machine templates
++ DEPENDS:= lxc
++endef
++
++define Package/lxc-configs
++ $(call Package/lxc/Default)
++ TITLE:=LXC virtual machine common config files
++ DEPENDS:= lxc
++endef
++
++define Package/liblxc
++ $(call Package/lxc/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=LXC userspace library
++ DEPENDS:= lxc +libcap +libpthread +LXC_SECCOMP:libseccomp
++endef
++
++define Package/lxc-lua
++ $(call Package/lxc/Default)
++ TITLE:=LXC Lua bindings
++ DEPENDS:= lxc +liblua +liblxc +luafilesystem
++endef
++
++define Package/lxc-init
++ $(call Package/lxc/Default)
++ TITLE:=LXC Lua bindings
++ DEPENDS:= lxc +liblxc
++endef
++
++CONFIGURE_ARGS += \
++ --disable-apparmor \
++ --disable-doc \
++ --disable-examples \
++ --enable-lua=yes \
++ --with-lua-pc="$(STAGING_DIR)/usr/lib/pkgconfig/lua.pc"
++
++ifeq ($(CONFIG_LXC_SECCOMP),y)
++CONFIGURE_ARGS += --enable-seccomp
++else
++CONFIGURE_ARGS += --disable-seccomp
++endif
++
++MAKE_FLAGS += \
++ LUA_INSTALL_CMOD="/usr/lib/lua" \
++ LUA_INSTALL_LMOD="/usr/lib/lua"
++
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/lxc/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/lxc/* \
++ $(1)/usr/include/lxc/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/liblxc.so* \
++ $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/lxc.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++
++define Package/lxc/install
++ true
++endef
++
++define Package/lxc-common/conffiles
++/etc/lxc/default.conf
++/etc/lxc/lxc.conf
++endef
++
++define Package/lxc-common/install
++ $(INSTALL_DIR) $(1)/usr/lib/lxc/rootfs
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/lxc/rootfs/README \
++ $(1)/usr/lib/lxc/rootfs/
++
++ $(INSTALL_DIR) $(1)/usr/share/lxc
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/share/lxc/lxc.functions \
++ $(1)/usr/share/lxc/
++
++ $(INSTALL_DIR) $(1)/etc/lxc/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/etc/lxc/default.conf \
++ $(1)/etc/lxc/default.conf
++
++ $(INSTALL_DIR) $(1)/etc/lxc/
++ $(CP) \
++ ./files/lxc.conf \
++ $(1)/etc/lxc/lxc.conf
++
++ $(INSTALL_DIR) $(1)/lxc/
++endef
++
++define Package/lxc-hooks/install
++ $(INSTALL_DIR) $(1)/usr/share/lxc/hooks
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/share/lxc/hooks/* \
++ $(1)/usr/share/lxc/hooks/
++endef
++
++define Package/lxc-templates/install
++ $(INSTALL_DIR) $(1)/usr/share/lxc/templates/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/share/lxc/templates/lxc-* \
++ $(1)/usr/share/lxc/templates/
++endef
++
++define Package/lxc-configs/install
++ $(INSTALL_DIR) $(1)/usr/share/lxc/config/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/share/lxc/config/* \
++ $(1)/usr/share/lxc/config/
++endef
++
++define Package/liblxc/install
++ $(INSTALL_DIR) $(1)/usr/lib/
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/liblxc.so* \
++ $(1)/usr/lib/
++endef
++
++define Package/lxc-lua/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/share/lua/5.1/lxc.lua \
++ $(1)/usr/lib/lua/
++ $(INSTALL_DIR) $(1)/usr/lib/lua/lxc
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/lua/5.1/lxc/core.so \
++ $(1)/usr/lib/lua/lxc/
++endef
++
++define Package/lxc-init/install
++ $(INSTALL_DIR) $(1)/sbin
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/sbin/init.lxc \
++ $(1)/sbin/
++endef
++
++define GenPlugin
++ define Package/lxc-$(1)
++ $(call Package/lxc/Default)
++ TITLE:=Utility lxc-$(1) from the LXC userspace tools
++ DEPENDS:= lxc +lxc-common $(2) $(DEPENDS_$(1))
++ endef
++
++ define Package/lxc-$(1)/install
++ $(INSTALL_DIR) $$(1)$(3)
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)$(3)/lxc-$(1) \
++ $$(1)$(3)/
++ endef
++
++ $$(eval $$(call BuildPackage,lxc-$(1)))
++endef
++
++
++$(eval $(call BuildPackage,lxc))
++$(eval $(call BuildPackage,lxc-common))
++$(eval $(call BuildPackage,lxc-hooks))
++$(eval $(call BuildPackage,lxc-configs))
++$(eval $(call BuildPackage,lxc-templates))
++$(eval $(call BuildPackage,liblxc))
++$(eval $(call BuildPackage,lxc-lua))
++$(eval $(call BuildPackage,lxc-init))
++$(foreach u,$(LXC_APPLETS_BIN),$(eval $(call GenPlugin,$(u),$(DEPENDS_APPLETS),"/usr/bin")))
++$(foreach u,$(LXC_APPLETS_LIB),$(eval $(call GenPlugin,$(u),$(DEPENDS_APPLETS),"/usr/lib/lxc")))
++$(foreach u,$(LXC_SCRIPTS),$(eval $(call GenPlugin,$(u),,"/usr/bin")))
+diff --git a/feeds/packages/utils/lxc/files/lxc.conf b/feeds/packages/utils/lxc/files/lxc.conf
+new file mode 100644
+index 0000000..3b77baa
+--- /dev/null
++++ b/feeds/packages/utils/lxc/files/lxc.conf
+@@ -0,0 +1 @@
++lxc.lxcpath = /lxc
+diff --git a/feeds/packages/utils/lxc/patches/010-compile.patch b/feeds/packages/utils/lxc/patches/010-compile.patch
+new file mode 100644
+index 0000000..6f12c38
+--- /dev/null
++++ b/feeds/packages/utils/lxc/patches/010-compile.patch
+@@ -0,0 +1,33 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -31,30 +31,6 @@ AC_CANONICAL_HOST
++ AM_PROG_CC_C_O
++ AC_GNU_SOURCE
++
++-# Detect the distribution. This is used for the default configuration and
++-# for some distro-specific build options.
++-AC_MSG_CHECKING([host distribution])
++-AC_ARG_WITH(distro, AS_HELP_STRING([--with-distro=DISTRO], [Specify the Linux distribution to target: One of redhat, oracle, centos, fedora, suse, gentoo, debian, arch, slackware, paldo, openmandriva or pardus.]))
++-if type lsb_release >/dev/null 2>&1 && test "z$with_distro" = "z"; then
++- with_distro=`lsb_release -is`
++-fi
++-if test "z$with_distro" = "z"; then
++- AC_CHECK_FILE(/etc/redhat-release,with_distro="redhat")
++- AC_CHECK_FILE(/etc/oracle-release,with_distro="oracle")
++- AC_CHECK_FILE(/etc/centos-release,with_distro="centos")
++- AC_CHECK_FILE(/etc/fedora-release,with_distro="fedora")
++- AC_CHECK_FILE(/etc/SuSE-release,with_distro="suse")
++- AC_CHECK_FILE(/etc/gentoo-release,with_distro="gentoo")
++- AC_CHECK_FILE(/etc/debian_version,with_distro="debian")
++- AC_CHECK_FILE(/etc/arch-release,with_distro="arch")
++- AC_CHECK_FILE(/etc/slackware-version,with_distro="slackware")
++- AC_CHECK_FILE(/etc/frugalware-release,with_distro="frugalware")
++- AC_CHECK_FILE(/etc/mandrakelinux-release, with_distro="openmandriva")
++- AC_CHECK_FILE(/etc/mandriva-release,with_distro="openmandriva")
++- AC_CHECK_FILE(/etc/pardus-release,with_distro="pardus")
++-fi
++-with_distro=`echo ${with_distro} | tr '[[:upper:]]' '[[:lower:]]'`
++-
++ if test "z$with_distro" = "z"; then
++ with_distro="unknown"
++ fi
+diff --git a/feeds/packages/utils/lxc/patches/015-getline.patch b/feeds/packages/utils/lxc/patches/015-getline.patch
+new file mode 100644
+index 0000000..e2f002a
+--- /dev/null
++++ b/feeds/packages/utils/lxc/patches/015-getline.patch
+@@ -0,0 +1,15 @@
++--- a/src/lxc/utils.h
+++++ b/src/lxc/utils.h
++@@ -44,11 +44,7 @@ extern char *get_rundir(void);
++ extern const char *lxc_global_config_value(const char *option_name);
++
++ /* Define getline() if missing from the C library */
++-#ifndef HAVE_GETLINE
++-#ifdef HAVE_FGETLN
++-#include <../include/getline.h>
++-#endif
++-#endif
+++#include "../include/getline.h"
++
++ /* Define setns() if missing from the C library */
++ #ifndef HAVE_SETNS
+diff --git a/feeds/packages/utils/lxc/patches/020-lxc-checkconfig.patch b/feeds/packages/utils/lxc/patches/020-lxc-checkconfig.patch
+new file mode 100644
+index 0000000..272f76b
+--- /dev/null
++++ b/feeds/packages/utils/lxc/patches/020-lxc-checkconfig.patch
+@@ -0,0 +1,20 @@
++--- a/src/lxc/lxc-checkconfig.in
+++++ b/src/lxc/lxc-checkconfig.in
++@@ -4,6 +4,17 @@
++ : ${CONFIG:=/proc/config.gz}
++ : ${GREP:=zgrep}
++ : ${MODNAME:=configs}
+++: ${ZGREP:=zgrep}
+++: ${GUNZIP:=gunzip}
+++
+++if [ -z $(which $ZGREP) ] && ! [ -z $(which $GUNZIP) ] && [ -x $(which $GUNZIP) ] && [ -f $CONFIG ] && [ "$CONFIG" == "/proc/config.gz" ] ; then
+++
+++ CONFIG_NEW="/tmp/config-$(uname -r)"
+++ $GUNZIP -c $CONFIG > $CONFIG_NEW
+++ CONFIG=$CONFIG_NEW
+++
+++ GREP=grep
+++fi
++
++ SETCOLOR_SUCCESS="printf \\033[1;32m"
++ SETCOLOR_FAILURE="printf \\033[1;31m"
+diff --git a/feeds/packages/utils/lxc/patches/025-remove-unsupported-option.patch b/feeds/packages/utils/lxc/patches/025-remove-unsupported-option.patch
+new file mode 100644
+index 0000000..cb0a9f0
+--- /dev/null
++++ b/feeds/packages/utils/lxc/patches/025-remove-unsupported-option.patch
+@@ -0,0 +1,19 @@
++--- a/templates/lxc-download.in
+++++ b/templates/lxc-download.in
++@@ -494,15 +494,7 @@ fi
++ # Unpack the rootfs
++ echo "Unpacking the rootfs"
++
++-EXCLUDES=""
++-excludelist=$(relevant_file excludes)
++-if [ -f "${excludelist}" ]; then
++- while read line; do
++- EXCLUDES="$EXCLUDES --exclude=$line"
++- done < $excludelist
++-fi
++-
++-tar --anchored ${EXCLUDES} --numeric-owner -xpJf \
+++tar --numeric-owner -xpJf \
++ ${LXC_CACHE_PATH}/rootfs.tar.xz -C ${LXC_ROOTFS}
++
++ mkdir -p ${LXC_ROOTFS}/dev/pts/
+diff --git a/feeds/packages/utils/lxc/patches/030-lxc-download.patch b/feeds/packages/utils/lxc/patches/030-lxc-download.patch
+new file mode 100644
+index 0000000..295bae0
+--- /dev/null
++++ b/feeds/packages/utils/lxc/patches/030-lxc-download.patch
+@@ -0,0 +1,43 @@
++--- a/templates/lxc-download.in
+++++ b/templates/lxc-download.in
++@@ -39,7 +39,7 @@ DOWNLOAD_LIST_IMAGES="false"
++ DOWNLOAD_MODE="system"
++ DOWNLOAD_READY_GPG="false"
++ DOWNLOAD_RELEASE=
++-DOWNLOAD_SERVER="images.linuxcontainers.org"
+++DOWNLOAD_SERVER="virtualwrt.org/containers/"
++ DOWNLOAD_SHOW_GPG_WARNING="true"
++ DOWNLOAD_SHOW_HTTP_WARNING="true"
++ DOWNLOAD_TARGET="system"
++@@ -257,14 +257,6 @@ for bin in tar xz wget; do
++ fi
++ done
++
++-# Check for GPG
++-if [ "$DOWNLOAD_VALIDATE" = "true" ]; then
++- if ! type gpg >/dev/null 2>&1; then
++- echo "ERROR: Missing recommended tool: gpg" 1>&2
++- echo "You can workaround this by using --no-validate." 1>&2
++- exit 1
++- fi
++-fi
++
++ # Check that we have all variables we need
++ if [ -z "$LXC_NAME" ] || [ -z "$LXC_PATH" ] || [ -z "$LXC_ROOTFS" ]; then
++@@ -456,16 +448,9 @@ if [ "$DOWNLOAD_USE_CACHE" = "false" ];
++ echo "Downloading the rootfs"
++ download_file $DOWNLOAD_URL/rootfs.tar.xz \
++ ${DOWNLOAD_TEMP}/rootfs.tar.xz normal
++- download_sig $DOWNLOAD_URL/rootfs.tar.xz.asc \
++- ${DOWNLOAD_TEMP}/rootfs.tar.xz.asc normal
++- gpg_validate ${DOWNLOAD_TEMP}/rootfs.tar.xz.asc
++-
++ echo "Downloading the metadata"
++ download_file $DOWNLOAD_URL/meta.tar.xz \
++ ${DOWNLOAD_TEMP}/meta.tar.xz normal
++- download_sig $DOWNLOAD_URL/meta.tar.xz.asc \
++- ${DOWNLOAD_TEMP}/meta.tar.xz.asc normal
++- gpg_validate ${DOWNLOAD_TEMP}/meta.tar.xz.asc
++
++ if [ -d $LXC_CACHE_PATH ]; then
++ rm -Rf $LXC_CACHE_PATH
+diff --git a/feeds/packages/utils/lxc/patches/035-fix-undefined-lfd.patch b/feeds/packages/utils/lxc/patches/035-fix-undefined-lfd.patch
+new file mode 100644
+index 0000000..6b57e26
+--- /dev/null
++++ b/feeds/packages/utils/lxc/patches/035-fix-undefined-lfd.patch
+@@ -0,0 +1,12 @@
++--- a/src/lxc/bdev.c
+++++ b/src/lxc/bdev.c
++@@ -1936,3 +1936,3 @@ static int loop_mount(struct bdev *bdev)
++ {
++- int lfd, ffd = -1, ret = -1;
+++ int lfd = -1, ffd = -1, ret = -1;
++ struct loop_info64 lo;
++@@ -1974,3 +1974,3 @@ out:
++ if (ret < 0) {
++- close(lfd);
+++ if (lfd > -1) close(lfd);
++ bdev->lofd = -1;
+diff --git a/feeds/packages/utils/macchanger/Makefile b/feeds/packages/utils/macchanger/Makefile
+new file mode 100644
+index 0000000..2bfcbbf
+--- /dev/null
++++ b/feeds/packages/utils/macchanger/Makefile
+@@ -0,0 +1,45 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=macchanger
++PKG_VERSION:=1.7.0
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/alobbs/macchanger/releases/download/$(PKG_VERSION)/
++PKG_MD5SUM:=ca56f16142914337391dac91603eb332
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/macchanger
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=utility for viewing/manipulating the MAC address
++ URL:=https://github.com/alobbs/macchanger/
++endef
++
++define Package/macchanger/description
++ This is a GNU/Linux utility for viewing/manipulating the MAC address
++ of network interfaces.
++endef
++
++define Package/macchanger/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/macchanger $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/share
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/macchanger $(1)/usr/share/
++endef
++
++$(eval $(call BuildPackage,macchanger))
+diff --git a/feeds/packages/utils/macchanger/patches/0001-fix-build-with-musl.patch b/feeds/packages/utils/macchanger/patches/0001-fix-build-with-musl.patch
+new file mode 100644
+index 0000000..4a30d55
+--- /dev/null
++++ b/feeds/packages/utils/macchanger/patches/0001-fix-build-with-musl.patch
+@@ -0,0 +1,13 @@
++Index: macchanger-1.7.0/src/netinfo.c
++===================================================================
++--- macchanger-1.7.0.orig/src/netinfo.c
+++++ macchanger-1.7.0/src/netinfo.c
++@@ -113,7 +113,7 @@ mc_net_info_get_permanent_mac (const net
++ epa->size = IFHWADDRLEN;
++
++ memcpy(&req, &(net->dev), sizeof(struct ifreq));
++- req.ifr_data = (caddr_t)epa;
+++ req.ifr_data = (char *)epa;
++
++ if (ioctl(net->sock, SIOCETHTOOL, &req) < 0) {
++ perror ("[ERROR] Could not read permanent MAC");
+diff --git a/feeds/packages/utils/mbtools/Makefile b/feeds/packages/utils/mbtools/Makefile
+new file mode 100644
+index 0000000..109adc6
+--- /dev/null
++++ b/feeds/packages/utils/mbtools/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mbtools
++
++PKG_VERSION:=2014-10-29
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/webstack/mbtools
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=149e9c69cec180f18cf8781cf5285b97352bf719
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++
++PKG_FIXUP:=autoreconf
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENSE
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/mbtools
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Modbus tools
++ DEPENDS:=+glib2 +libmodbus $(INTL_DEPENDS)
++endef
++
++define Package/mbtools/description
++ Modbus tools based on libmodbus to log data fetched by a master/client or
++ received by a slave/server (writing of registers). mbcollect is able to act
++ as client or server (in TCP or RTU)
++endef
++
++ifneq ($(INTL_FULL),)
++TARGET_LDFLAGS += \
++ -L$(INTL_PREFIX)/lib \
++ -Wl,-rpath-link=$(STAGING_DIR)/usr/lib
++
++endif
++
++define Package/mbtools/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mbrecorder $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mbcollect $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/src/mbcollect.ini $(1)/etc
++endef
++
++$(eval $(call BuildPackage,mbtools))
+diff --git a/feeds/packages/utils/mbtools/patches/100-fix-unit-test-server-return-value.patch b/feeds/packages/utils/mbtools/patches/100-fix-unit-test-server-return-value.patch
+new file mode 100644
+index 0000000..1ad7c12
+--- /dev/null
++++ b/feeds/packages/utils/mbtools/patches/100-fix-unit-test-server-return-value.patch
+@@ -0,0 +1,10 @@
++Index: mbtools-2014-10-29/tests/unit-test-server.c
++===================================================================
++--- mbtools-2014-10-29.orig/tests/unit-test-server.c
+++++ mbtools-2014-10-29/tests/unit-test-server.c
++@@ -117,4 +117,5 @@ int main(int argc, char *argv[])
++ }
++ printf("Quit the loop: %s\n", modbus_strerror(errno));
++ signal_handler(0);
+++ return 0;
++ }
+diff --git a/feeds/packages/utils/mc/Config.in b/feeds/packages/utils/mc/Config.in
+new file mode 100644
+index 0000000..1445aa1
+--- /dev/null
++++ b/feeds/packages/utils/mc/Config.in
+@@ -0,0 +1,60 @@
++menu "Configuration"
++ depends on PACKAGE_mc
++
++config MC_DIFFVIEWER
++ bool "Enable internal diff viewer"
++ default n
++ help
++ This option enables the built-in diff viewer.
++ Disabled by default.
++
++config MC_EDITOR
++ bool "Enable internal editor"
++ default n
++ help
++ This option enables the built-in file editor.
++ Disabled by default.
++
++config MC_SUBSHELL
++ bool "Enable concurrent subshell"
++ default n
++ help
++ This option enables concurrent subshell support.
++ Disabled by default.
++
++config MC_LARGEFILE
++ bool "Enable largefile support"
++ default n
++ help
++ This option enables support for large files (> 2 GB).
++ Disabled by default.
++
++config MC_BACKGROUND
++ bool "Enable background operations"
++ default n
++ help
++ This option enables support for background operations which
++ allow to perform some tasks such as copying files in a
++ separate background process. Background code is known
++ to be less stable than the rest of the code.
++ Disabled by default.
++
++config MC_CHARSET
++ bool "Enable charset support"
++ default n
++ help
++ This option adds support for selecting character set of the text in
++ the internal viewer and editor and converting it on the fly.
++ The implementation is currently incomplete.
++ Disabled by default.
++
++config MC_VFS
++ bool "Enable virtual filesystem support"
++ default n
++ help
++ This option enables the Virtual File System switch code to get
++ transparent access to the following file systems:
++ cpio, tar, fish, sfs, ftp, sftp, extfs, smb.
++ Disabled by default.
++
++endmenu
+diff --git a/feeds/packages/utils/mc/Makefile b/feeds/packages/utils/mc/Makefile
+new file mode 100644
+index 0000000..ab8cd1b
+--- /dev/null
++++ b/feeds/packages/utils/mc/Makefile
+@@ -0,0 +1,122 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mc
++PKG_VERSION:=4.8.14
++PKG_RELEASE:=1.3
++PKG_MAINTAINER:=Dirk Brenken <dibdot@gmail.com>
++PKG_LICENSE:=GPL-3.0+
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://ftp.midnight-commander.org/
++PKG_MD5SUM:=fbdaddb9edcf8925dcf3231331a8720b
++
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++
++PKG_CONFIG_DEPENDS := \
++ CONFIG_PACKAGE_MC \
++ CONFIG_MC_DIFFVIEWER \
++ CONFIG_MC_EDITOR \
++ CONFIG_MC_SUBSHELL \
++ CONFIG_MC_LARGEFILE \
++ CONFIG_MC_BACKGROUND \
++ CONFIG_MC_CHARSET \
++ CONFIG_MC_VFS
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/mc
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+glib2 +libncurses +libmount +MC_VFS:libssh2 $(LIBRPC_DEPENDS) $(ICONV_DEPENDS)
++ TITLE:=Midnight Commander - a powerful visual file manager
++ URL:=http://www.midnight-commander.org/
++ MENU:=1
++endef
++
++define Package/mc/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/mc/description
++ GNU Midnight Commander is a visual file manager,
++ licensed under GNU General Public License and therefore qualifies as Free Software.
++ It's a feature rich full-screen text mode application that allows you to copy,
++ move and delete files and whole directory trees, search for files
++ and run commands in the subshell. Internal viewer and editor are included.
++endef
++
++CONFIGURE_ARGS += \
++ --disable-doxygen-doc \
++ --with-screen=ncurses \
++ --without-gpm-mouse \
++ --without-x \
++
++CONFIGURE_VARS += \
++ ac_cv_search_addwstr=no \
++
++ifeq ($(CONFIG_MC_DIFFVIEWER),)
++CONFIGURE_ARGS += \
++ --without-diff-viewer
++endif
++
++ifeq ($(CONFIG_MC_EDITOR),)
++CONFIGURE_ARGS += \
++ --without-internal-edit
++endif
++
++ifeq ($(CONFIG_MC_SUBSHELL),)
++CONFIGURE_ARGS += \
++ --without-subshell
++endif
++
++ifeq ($(CONFIG_MC_LARGEFILE),)
++CONFIGURE_ARGS += \
++ --disable-largefile
++endif
++
++ifeq ($(CONFIG_MC_BACKGROUND),)
++CONFIGURE_ARGS += \
++ --disable-background
++endif
++
++ifeq ($(CONFIG_MC_CHARSET),)
++CONFIGURE_ARGS += \
++ --disable-charset
++endif
++
++ifeq ($(CONFIG_MC_VFS),)
++CONFIGURE_ARGS += \
++ --disable-vfs
++endif
++
++define Package/mc/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/mc $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/etc/mc
++ifeq ($(CONFIG_MC_DIFFVIEWER),y)
++ ln -sf mc $(1)/usr/bin/mcdiff
++endif
++ifeq ($(CONFIG_MC_EDITOR),y)
++ ln -sf mc $(1)/usr/bin/mcedit
++endif
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/misc/mc.menu $(1)/etc/mc
++ $(INSTALL_DIR) $(1)/etc/mc/skins
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/misc/skins/default.ini $(1)/etc/mc/skins
++ $(INSTALL_DIR) $(1)/root/.mc/cedit/Syntax
++endef
++
++define Package/mc/conffiles
++/etc/mc/mc.menu
++/etc/mc/skins/default.ini
++endef
++
++$(eval $(call BuildPackage,mc))
+diff --git a/feeds/packages/utils/minicom/Makefile b/feeds/packages/utils/minicom/Makefile
+new file mode 100644
+index 0000000..b588993
+--- /dev/null
++++ b/feeds/packages/utils/minicom/Makefile
+@@ -0,0 +1,46 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=minicom
++PKG_VERSION:=2.7
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://alioth.debian.org/frs/download.php/file/3977/
++PKG_MD5SUM:=7044ca3e291268c33294f171d426dc2d
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/nls.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/minicom
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=$(ICONV_DEPENDS) $(INTL_DEPENDS) +libncurses
++ TITLE:=Terminal emulation program
++ URL:=http://alioth.debian.org/projects/minicom/
++ SUBMENU:=Terminal
++endef
++
++define Package/minicom/conffiles
++/etc/minirc.dfl
++endef
++
++define Package/minicom/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/$(PKG_NAME) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ascii-xfr $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,minicom))
+diff --git a/feeds/packages/utils/minicom/patches/100-fix_iconv_include.patch b/feeds/packages/utils/minicom/patches/100-fix_iconv_include.patch
+new file mode 100644
+index 0000000..88190fa
+--- /dev/null
++++ b/feeds/packages/utils/minicom/patches/100-fix_iconv_include.patch
+@@ -0,0 +1,12 @@
++--- a/src/minicom.c
+++++ b/src/minicom.c
++@@ -31,7 +31,9 @@
++ #include <getopt.h>
++ #include <wchar.h>
++ #include <wctype.h>
+++#ifdef HAVE_ICONV
++ #include <iconv.h>
+++#endif
++ #include <limits.h>
++
++ #define EXTERN
+diff --git a/feeds/packages/utils/minicom/patches/101-fix_music_includes.patch b/feeds/packages/utils/minicom/patches/101-fix_music_includes.patch
+new file mode 100644
+index 0000000..a74d123
+--- /dev/null
++++ b/feeds/packages/utils/minicom/patches/101-fix_music_includes.patch
+@@ -0,0 +1,14 @@
++--- a/src/dial.c
+++++ b/src/dial.c
++@@ -39,11 +39,9 @@
++ #include "intl.h"
++
++ #ifdef VC_MUSIC
++-# if defined(__GLIBC__)
++ # include <sys/ioctl.h>
++ # include <sys/kd.h>
++ # include <sys/time.h>
++-# endif
++ #endif
++
++ enum { CURRENT_VERSION = 6 };
+diff --git a/feeds/packages/utils/minicom/patches/102-fix_musl_compatibility.patch b/feeds/packages/utils/minicom/patches/102-fix_musl_compatibility.patch
+new file mode 100644
+index 0000000..4524b22
+--- /dev/null
++++ b/feeds/packages/utils/minicom/patches/102-fix_musl_compatibility.patch
+@@ -0,0 +1,13 @@
++--- a/src/getsdir.h
+++++ b/src/getsdir.h
++@@ -24,6 +24,10 @@
++
++ #include <dirent.h>
++
+++#ifndef MAXNAMLEN
+++#define MAXNAMLEN 255
+++#endif
+++
++ typedef struct dirEntry { /* structure of data item */
++ char fname[MAXNAMLEN + 1]; /* filename + terminating null */
++ time_t time; /* last modification date */
+diff --git a/feeds/packages/utils/mksh/Makefile b/feeds/packages/utils/mksh/Makefile
+new file mode 100644
+index 0000000..89380a9
+--- /dev/null
++++ b/feeds/packages/utils/mksh/Makefile
+@@ -0,0 +1,89 @@
++#
++# Copyright (C) 2007-2011 OpenWrt.org
++# Copyright (c) 2009-2014 Thorsten Glaser <tg@mirbsd.org>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mksh
++PKG_VERSION:=50d
++PKG_RELEASE:=1
++
++PKG_MAINTAINER:=Thorsten Glaser <tg@mirbsd.org>
++PKG_LICENSE:=MirOS
++
++PKG_SOURCE:=$(PKG_NAME)-R$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=http://www.mirbsd.org/MirOS/dist/mir/mksh
++PKG_MD5SUM:=1c3882c07a760b23df1ad94ad0b4ed2e
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mksh
++ SECTION:=shells
++ CATEGORY:=Base system
++ TITLE:=MirBSD Korn Shell
++ DEPENDS:=$(DEP)
++ URL:=http://mirbsd.de/mksh
++endef
++
++define Package/mksh/description
++mksh is the MirBSD enhanced version of the Public Domain Korn
++shell (pdksh), a Bourne-compatible shell which is largely si-
++milar to the original AT&T Korn shell; mksh is the only pdksh
++derivate currently being actively developed. It includes bug
++fixes and feature improvements, in order to produce a modern,
++robust shell good for interactive and especially script use.
++mksh has UTF-8 support (in substring operations and the Emacs
++editing mode) and - while R50 corresponds to OpenBSD 5.5-cur-
++rent ksh (without GNU bash-like PS1 and fancy character clas-
++ses) - adheres to SUSv4 and is much more robust. The code has
++been cleaned up and simplified, bugs fixed, standards compli-
++ance added, and several enhancements (for extended compatibi-
++lity to other modern shells - as well as a couple of its own)
++are available. It has sensible defaults as usual with BSD.
++endef
++
++define Build/Compile
++ # -DMKSH_SMALL=1 ⇒ reduce functionality quite a lot
++ # -DMKSH_ASSUME_UTF8=0 ⇒ never automatically enable
++ # UTF-8 mode, neither use setlocale/nl_langinfo
++ # nor look at $LC_* and $LANG (not recommended)
++ # -DMKSH_BINSHPOSIX ⇒ enable POSIX mode if called as sh
++ #XXX maybe change to -DMKSH_ASSUME_UTF8=1 now (which
++ #XXX is always assume UTF-8 mode)
++ # HAVE_CAN_FSTACKPROTECTORALL=0 ⇒ nuke libssp dependency
++ # HAVE_CAN_FSTACKPROTECTORSTRONG=0 ⇒ same, for gcc 4.9+
++ cd $(PKG_BUILD_DIR); \
++ CC="$(TARGET_CC)" \
++ TARGET_OS="$(shell uname -s)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ CPPFLAGS="-DMKSH_SMALL=1 -DMKSH_ASSUME_UTF8=0 -DMKSH_BINSHPOSIX" \
++ HAVE_CAN_FSTACKPROTECTORALL=0 \
++ HAVE_CAN_FSTACKPROTECTORSTRONG=0 \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ $(BASH) Build.sh -Q -r -c lto
++endef
++
++define Package/mksh/postinst
++#!/bin/sh
++grep mksh $${IPKG_INSTROOT}/etc/shells || \
++ echo "/bin/mksh" >> $${IPKG_INSTROOT}/etc/shells
++endef
++
++define Package/mksh/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/dot.mkshrc $(1)/etc/mkshrc
++ $(INSTALL_DIR) $(1)/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/mksh $(1)/bin/
++endef
++
++define Package/mksh/conffiles
++/etc/mkshrc
++endef
++
++$(eval $(call BuildPackage,mksh))
+diff --git a/feeds/packages/utils/mksh/patches/100-dot_mkshrc b/feeds/packages/utils/mksh/patches/100-dot_mkshrc
+new file mode 100644
+index 0000000..a7bf840
+--- /dev/null
++++ b/feeds/packages/utils/mksh/patches/100-dot_mkshrc
+@@ -0,0 +1,50 @@
++From 23712cea8e2a623fd952eb781df0011c501703d0 Mon Sep 17 00:00:00 2001
++From: Thorsten Glaser <tg@mirbsd.org>
++Date: Thu, 25 Jul 2013 22:07:33 +0200
++Subject: [PATCH] Make default mkshrc file suitable for OpenWrt environment:
++
++* Part of the FreeWRT patches:
++ - no hostname(1)
++ - ls(1) has no -o option
++* OpenWrt and FreeWRT-1.0 fix:
++ - since this is not ~/.mkshrc make sure subshells find it
++---
++ dot.mkshrc | 10 +++++++---
++ 1 file changed, 7 insertions(+), 3 deletions(-)
++
++diff --git a/dot.mkshrc b/dot.mkshrc
++index 233a10c..caf482c 100644
++--- a/dot.mkshrc
+++++ b/dot.mkshrc
++@@ -28,8 +28,8 @@ case $KSH_VERSION in
++ *) return 0 ;;
++ esac
++
++-PS1='#'; (( USER_ID )) && PS1='$'; [[ ${HOSTNAME:=$(ulimit -c 0; hostname -s \
++- 2>/dev/null)} = *([ ]|localhost) ]] && HOSTNAME=$(ulimit -c 0; hostname \
+++PS1='#'; (( USER_ID )) && PS1='$'; [[ ${HOSTNAME:=$(</proc/sys/kernel/hostname
+++ )} = *([ ]|localhost) ]] && HOSTNAME=$(ulimit -c 0; hostname \
++ 2>/dev/null); : ${EDITOR:=/bin/ed} ${HOSTNAME:=nil} ${TERM:=vt100}
++ : ${MKSH:=$(whence -p mksh)}; PS4='[$EPOCHREALTIME] '; PS1=$'\001\r''${|
++ local e=$?
++@@ -50,7 +50,7 @@ unalias ls
++ alias l='ls -F'
++ alias la='l -a'
++ alias ll='l -l'
++-alias lo='l -alo'
+++alias lo='l -al'
++ alias doch='sudo mksh -c "$(fc -ln -1)"'
++ whence -p rot13 >/dev/null || alias rot13='tr \
++ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \
++@@ -402,4 +402,8 @@ alias cls='print -n \\033c'
++
++ unset p
++
+++# we need this in OpenWrt for subshells that are not login shells
+++: ${ENV=/etc/mkshrc}
+++[[ -z $ENV ]] || export ENV
+++
++ : place customisations above this line
++--
++2.1.1
++
+diff --git a/feeds/packages/utils/mktorrent/Makefile b/feeds/packages/utils/mktorrent/Makefile
+new file mode 100644
+index 0000000..2e23e23
+--- /dev/null
++++ b/feeds/packages/utils/mktorrent/Makefile
+@@ -0,0 +1,41 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mktorrent
++PKG_VERSION:=1.0
++PKG_RELEASE:=1
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.sourceforge.net/$(PKG_NAME)/
++PKG_MD5SUM:=0da00209da96a0dc39efbb6eb5b4d8ff
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mktorrent
++ SUBMENU:=BitTorrent
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=mktorrent
++ URL:=http://mktorrent.sourceforge.net/
++endef
++
++define Package/mktorrent/Description
++ mktorrent is a simple command line utility to create BitTorrent metainfo files.
++endef
++
++
++define Package/mktorrent/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/mktorrent $(1)/usr/bin
++endef
++
++$(eval $(call BuildPackage,mktorrent))
+diff --git a/feeds/packages/utils/mmc-utils/Makefile b/feeds/packages/utils/mmc-utils/Makefile
+new file mode 100644
+index 0000000..00a0531
+--- /dev/null
++++ b/feeds/packages/utils/mmc-utils/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mmc-utils
++PKG_VERSION=2015-05-01-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=2
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc-utils.git
++PKG_SOURCE_VERSION:=d0b46442b50794217e53b2455c1344c548d9d088
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=
++
++PKG_MAINTAINER:=Michael Heimpold <mhei@heimpold.de>
++
++PKG_BUILD_PARALLEL:=1
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mmc-utils
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Userspace tools for MMC/SD devices
++ URL:=http://git.kernel.org/cgit/linux/kernel/git/cjb/mmc-utils.git
++endef
++
++define Package/mmc-utils/description
++ This package contains the userspace mmc utils, the userspace
++ counterpart to the Linux MMC/SD subsystem.
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2" \
++ mmc
++endef
++
++define Package/mmc-utils/install
++ $(INSTALL_DIR) $(1)/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/mmc $(1)/sbin
++endef
++
++$(eval $(call BuildPackage,mmc-utils))
+diff --git a/feeds/packages/utils/mmc-utils/patches/001-properly-set-fortify-source-in-makefile.patch b/feeds/packages/utils/mmc-utils/patches/001-properly-set-fortify-source-in-makefile.patch
+new file mode 100644
+index 0000000..1a20813
+--- /dev/null
++++ b/feeds/packages/utils/mmc-utils/patches/001-properly-set-fortify-source-in-makefile.patch
+@@ -0,0 +1,9 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -1,5 +1,5 @@
++ CC ?= gcc
++-AM_CFLAGS = -D_FILE_OFFSET_BITS=64 -D_FORTIFY_SOURCE=2
+++AM_CFLAGS = -D_FILE_OFFSET_BITS=64
++ CFLAGS ?= -g -O2
++ objects = \
++ mmc.o \
+diff --git a/feeds/packages/utils/mpack/Makefile b/feeds/packages/utils/mpack/Makefile
+new file mode 100644
+index 0000000..c2b77eb
+--- /dev/null
++++ b/feeds/packages/utils/mpack/Makefile
+@@ -0,0 +1,45 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mpack
++PKG_VERSION:=1.6
++PKG_RELEASE:=1
++PKG_LICENSE:=NLPL
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://ftp.andrew.cmu.edu/pub/mpack/
++PKG_MD5SUM:=a70fa5afa76539a9afb70b9d81568fe8
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mpack
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=mpack/munpack MIME format mail messages
++ URL:=http://ftp.andrew.cmu.edu/pub/mpack/
++ MAINTAINER:=Dmitry V. Zimin <pfzim@mail.ru>
++endef
++
++define Package/mpack/description
++ Mpack and munpack are utilities for encoding and decoding
++ (respectively) binary files in MIME (Multipurpose Internet Mail
++ Extensions) format mail messages. For compatibility with older forms
++ of transferring binary files, the munpack program can also decode
++ messages in split-uuencoded format.
++endef
++
++define Package/mpack/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,mpack))
++
+diff --git a/feeds/packages/utils/mysql/Makefile b/feeds/packages/utils/mysql/Makefile
+new file mode 100644
+index 0000000..11d47d5
+--- /dev/null
++++ b/feeds/packages/utils/mysql/Makefile
+@@ -0,0 +1,189 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/uclibc++.mk
++
++PKG_NAME:=mysql
++PKG_VERSION:=5.1.73
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=\
++ http://mysql.he.net/Downloads/MySQL-5.1/ \
++ http://www.linorg.usp.br/mysql/Downloads/MySQL-5.1/ \
++ http://www.mirrorservice.org/sites/ftp.mysql.com/Downloads/MySQL-5.1/ \
++ http://mirror.switch.ch/ftp/mirror/mysql/Downloads/MySQL-5.1/
++
++PKG_MD5SUM:=887f869bcc757957067b9198f707f32f
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++PKG_LICENSE:=GPL-2.0
++
++PKG_BUILD_DEPENDS:=libncurses libreadline
++PKG_BUILD_PARALLEL:=1
++PKG_USE_MIPS16:=0
++
++PKG_FIXUP:=libtool
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libmysqlclient/Default
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=$(CXX_DEPENDS) +zlib
++ TITLE:=MySQL client library
++ URL:=http://dev.mysql.com/
++endef
++
++define Package/mysql-server
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libmysqlclient +libpthread +libncursesw +libreadline
++ TITLE:=MySQL Server
++ URL:=http://dev.mysql.com/
++ SUBMENU:=database
++endef
++
++define Package/libmysqlclient
++ $(call Package/libmysqlclient/Default)
++endef
++
++define Package/libmysqlclient-r
++ $(call Package/libmysqlclient/Default)
++ TITLE += threadsafe
++ DEPENDS+= +libpthread
++endef
++
++ifneq ($(CONFIG_USE_UCLIBCXX),)
++ TARGET_CXX=g++-uc
++endif
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --enable-thread-safe-client \
++ --disable-assembler \
++ --with-pthread \
++ --with-server \
++ --without-mysqlmanager \
++ --with-mysqld-user=root \
++ --with-unix-socket-path=/tmp \
++ --without-libwrap \
++ --with-low-memory \
++ --without-embedded-server \
++ --without-query-cache \
++ --without-ssl \
++ --without-docs \
++ --without-man \
++ --without-readline \
++ --without-debug \
++ --with-named-thread-libs=-lpthread
++
++CONFIGURE_VARS += \
++ mysql_cv_compress=yes \
++ mysql_cv_gethostname_style=glibc2 \
++ mysql_cv_gcc_atomic_builtins=yes \
++ mysql_cv_gcc_atomic_builtins_pthread_t=yes \
++ ac_cv_c_stack_direction=-1
++
++define Build/Compile
++ +$(MAKE) $(PKG_JOBS) -C "$(PKG_BUILD_DIR)" \
++ SUBDIRS="include" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ SUBDIRS="include" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ install
++ g++ -I $(PKG_BUILD_DIR)/include \
++ -o $(PKG_BUILD_DIR)/sql/gen_lex_hash \
++ $(PKG_BUILD_DIR)/sql/gen_lex_hash.cc
++ +$(MAKE) $(PKG_JOBS) -C "$(PKG_BUILD_DIR)/libmysql" \
++ CC="g++" \
++ CFLAGS="$(HOST_CFLAGS)" \
++ CPPFLAGS="$(HOST_CFLAGS)" \
++ LDFLAGS="$(HOST_LDFLAGS)" \
++ conf_to_src
++ +$(MAKE) $(PKG_JOBS) -C "$(PKG_BUILD_DIR)" \
++ SUBDIRS="libmysql" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ SUBDIRS="libmysql" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ install
++ +$(MAKE) $(PKG_JOBS) -C "$(PKG_BUILD_DIR)" \
++ SUBDIRS="libmysql_r" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ SUBDIRS="libmysql_r" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ install
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ SUBDIRS="scripts" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ bin_SCRIPTS="mysql_config" \
++ install
++ +$(MAKE) $(PKG_JOBS) -C "$(PKG_BUILD_DIR)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ install
++endef
++
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(2)/bin $(1)/usr/bin $(1)/usr/include $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mysql_config $(1)/usr/bin/
++ ln -sf $(STAGING_DIR)/usr/bin/mysql_config $(2)/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/mysql $(1)/usr/include/
++ # NOTE: needed for MySQL-Python
++ $(CP) $(PKG_BUILD_DIR)/include/mysqld_error.h $(1)/usr/include/mysql/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/mysql $(1)/usr/lib/
++ rm -f $(1)/usr/lib/mysql/libmysqlclient.la
++endef
++
++define Package/libmysqlclient/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/mysql/libmysqlclient.so.* $(1)/usr/lib/
++endef
++define Package/libmysqlclient-r/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/mysql/libmysqlclient_r.so.* $(1)/usr/lib/
++endef
++
++define Package/mysql-server/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mysql $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/mysqld $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/myisamchk $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mysqladmin $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mysqldump $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mysql_install_db $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/my_print_defaults $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) files/mysqld.init $(1)/etc/init.d/mysqld
++ $(INSTALL_CONF) conf/my.cnf $(1)/etc/
++ $(INSTALL_DIR) $(1)/usr/share/mysql
++ $(INSTALL_DIR) $(1)/usr/share/mysql/english
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/share/mysql/english/errmsg.sys $(1)/usr/share/mysql/english
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/share/mysql/fill_help_tables.sql $(1)/usr/share/mysql/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/share/mysql/mysql_system_tables.sql $(1)/usr/share/mysql/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/share/mysql/mysql_system_tables_data.sql $(1)/usr/share/mysql/
++endef
++
++define Package/mysql-server/conffiles
++/etc/my.cnf
++endef
++
++$(eval $(call BuildPackage,mysql-server))
++$(eval $(call BuildPackage,libmysqlclient))
++$(eval $(call BuildPackage,libmysqlclient-r))
+diff --git a/feeds/packages/utils/mysql/conf/my.cnf b/feeds/packages/utils/mysql/conf/my.cnf
+new file mode 100644
+index 0000000..ec2ade2
+--- /dev/null
++++ b/feeds/packages/utils/mysql/conf/my.cnf
+@@ -0,0 +1,54 @@
++[client]
++port = 3306
++socket = /var/run/mysqld.sock
++
++[mysqld]
++user = root
++socket = /var/run/mysqld.sock
++port = 3306
++basedir = /usr
++
++############ Don't put this on the NAND #############
++# Figure out where you are going to put the databases
++# And run mysql_install_db --force
++datadir = /mnt/data/mysql/
++
++######### This should also not go on the NAND #######
++tmpdir = /mnt/data/tmp/
++
++skip-external-locking
++
++bind-address = 127.0.0.1
++
++# Fine Tuning
++key_buffer = 16M
++max_allowed_packet = 16M
++thread_stack = 192K
++thread_cache_size = 8
++
++# Here you can see queries with especially long duration
++#log_slow_queries = /var/log/mysql/mysql-slow.log
++#long_query_time = 2
++#log-queries-not-using-indexes
++
++# The following can be used as easy to replay backup logs or for replication.
++#server-id = 1
++#log_bin = /var/log/mysql/mysql-bin.log
++#expire_logs_days = 10
++#max_binlog_size = 100M
++#binlog_do_db = include_database_name
++#binlog_ignore_db = include_database_name
++
++
++[mysqldump]
++quick
++quote-names
++max_allowed_packet = 16M
++
++[mysql]
++#no-auto-rehash # faster start of mysql but no tab completition
++
++[isamchk]
++key_buffer = 16M
++
++
+diff --git a/feeds/packages/utils/mysql/files/mysqld.init b/feeds/packages/utils/mysql/files/mysqld.init
+new file mode 100644
+index 0000000..eec96c0
+--- /dev/null
++++ b/feeds/packages/utils/mysql/files/mysqld.init
+@@ -0,0 +1,30 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2010-2011 OpenWrt.org
++
++START=95
++STOP=10
++
++SERVICE_DAEMONIZE=1
++SERVICE_WRITE_PID=1
++SERVICE_STOP_TIME=9
++
++error() {
++ echo "${initscript}:" "$@" 1>&2
++}
++
++start() {
++ local datadir=$(sed -n -e "s/^[[:space:]]*datadir[[:space:]]*=[[:space:]\"']*\([^[:space:]\"']*\)[[:space:]\"']*/\1/p" /etc/my.cnf)
++ if [ ! -d "$datadir" ]; then
++ error "Error: datadir '$datadir' in /etc/my.cnf doesn't exist"
++ return 1
++ fi
++ if [ ! -f "$datadir/mysql/tables_priv.MYD" ]; then
++ error "Error: I didn't detect a privileges table, you might need to run mysql_install_db --force to initialize the system tables"
++ return 1
++ fi
++ service_start /usr/bin/mysqld
++}
++
++stop() {
++ service_stop /usr/bin/mysqld
++}
+diff --git a/feeds/packages/utils/mysql/patches/100-fix_hostname.patch b/feeds/packages/utils/mysql/patches/100-fix_hostname.patch
+new file mode 100644
+index 0000000..faedc27
+--- /dev/null
++++ b/feeds/packages/utils/mysql/patches/100-fix_hostname.patch
+@@ -0,0 +1,11 @@
++--- a/scripts/mysql_install_db.sh
+++++ b/scripts/mysql_install_db.sh
++@@ -322,7 +322,7 @@ then
++ fi
++
++ # Try to determine the hostname
++-hostname=`@HOSTNAME@`
+++hostname=`cat /proc/sys/kernel/hostname`
++
++ # Check if hostname is valid
++ if test "$cross_bootstrap" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
+diff --git a/feeds/packages/utils/mysql/patches/110-cross_compile.patch b/feeds/packages/utils/mysql/patches/110-cross_compile.patch
+new file mode 100644
+index 0000000..85d2591
+--- /dev/null
++++ b/feeds/packages/utils/mysql/patches/110-cross_compile.patch
+@@ -0,0 +1,179 @@
++--- a/storage/innodb_plugin/plug.in
+++++ b/storage/innodb_plugin/plug.in
++@@ -56,10 +56,8 @@ MYSQL_PLUGIN_ACTIONS(innodb_plugin, [
++ esac
++ AC_SUBST(INNODB_DYNAMIC_CFLAGS)
++
++- AC_MSG_CHECKING(whether GCC atomic builtins are available)
++- # either define HAVE_IB_GCC_ATOMIC_BUILTINS or not
++- AC_TRY_RUN(
++- [
+++ AC_CACHE_CHECK([whether GCC atomic builtins are available],
+++ [mysql_cv_gcc_atomic_builtins], [AC_TRY_RUN([
++ int main()
++ {
++ long x;
++@@ -96,21 +94,18 @@ MYSQL_PLUGIN_ACTIONS(innodb_plugin, [
++
++ return(0);
++ }
++- ],
++- [
++- AC_DEFINE([HAVE_IB_GCC_ATOMIC_BUILTINS], [1],
++- [GCC atomic builtins are available])
++- AC_MSG_RESULT(yes)
++- ],
++- [
++- AC_MSG_RESULT(no)
++- ]
++- )
+++ ], [mysql_cv_gcc_atomic_builtins=yes],
+++ [mysql_cv_gcc_atomic_builtins=no],
+++ [mysql_cv_gcc_atomic_builtins=no])])
+++
+++ if test "x$mysql_cv_gcc_atomic_builtins" = xyes; then
+++ AC_DEFINE(HAVE_IB_GCC_ATOMIC_BUILTINS, 1,
+++ [Define to 1 if compiler provides atomic builtins.])
+++ fi
++
++- AC_MSG_CHECKING(whether pthread_t can be used by GCC atomic builtins)
++- # either define HAVE_IB_ATOMIC_PTHREAD_T_GCC or not
++- AC_TRY_RUN(
++- [
+++
+++ AC_CACHE_CHECK([whether pthread_t can be used by GCC atomic builtins],
+++ [mysql_cv_gcc_atomic_builtins_pthread_t], [AC_TRY_RUN([
++ #include <pthread.h>
++ #include <string.h>
++
++@@ -127,16 +122,14 @@ MYSQL_PLUGIN_ACTIONS(innodb_plugin, [
++
++ return(0);
++ }
++- ],
++- [
++- AC_DEFINE([HAVE_IB_ATOMIC_PTHREAD_T_GCC], [1],
++- [pthread_t can be used by GCC atomic builtins])
++- AC_MSG_RESULT(yes)
++- ],
++- [
++- AC_MSG_RESULT(no)
++- ]
++- )
+++ ], [mysql_cv_gcc_atomic_builtins_pthread_t=yes],
+++ [mysql_cv_gcc_atomic_builtins_pthread_t=no],
+++ [mysql_cv_gcc_atomic_builtins_pthread_t=no])])
+++
+++ if test "x$mysql_cv_gcc_atomic_builtins_pthread_t" = xyes; then
+++ AC_DEFINE(HAVE_IB_ATOMIC_PTHREAD_T_GCC, 1,
+++ [Define to 1 if pthread_t can be used by GCC atomic builtins])
+++ fi
++
++ AC_MSG_CHECKING(whether Solaris libc atomic functions are available)
++ # Define HAVE_IB_SOLARIS_ATOMICS if _all_ of the following
++@@ -156,7 +149,6 @@ MYSQL_PLUGIN_ACTIONS(innodb_plugin, [
++ AC_DEFINE([HAVE_IB_SOLARIS_ATOMICS], [1],
++ [Define to 1 if Solaris libc atomic functions are available]
++ )
++- fi
++
++ AC_MSG_CHECKING(whether pthread_t can be used by Solaris libc atomic functions)
++ # either define HAVE_IB_ATOMIC_PTHREAD_T_SOLARIS or not
++@@ -230,6 +222,8 @@ MYSQL_PLUGIN_ACTIONS(innodb_plugin, [
++ AC_MSG_RESULT(no)
++ ]
++ )
+++ fi
+++
++ ])
++
++ # vim: set ft=config:
++--- a/sql/gen_lex_hash.cc
+++++ b/sql/gen_lex_hash.cc
++@@ -344,55 +344,6 @@ void print_find_structs()
++ }
++
++
++-static void usage(int version)
++-{
++- printf("%s Ver 3.6 Distrib %s, for %s (%s)\n",
++- my_progname, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE);
++- if (version)
++- return;
++- puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
++- puts("This program generates a perfect hashing function for the sql_lex.cc");
++- printf("Usage: %s [OPTIONS]\n\n", my_progname);
++- my_print_help(my_long_options);
++-}
++-
++-
++-extern "C" my_bool
++-get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
++- char *argument __attribute__((unused)))
++-{
++- switch(optid) {
++- case 'V':
++- usage(1);
++- exit(0);
++- case 'I':
++- case '?':
++- usage(0);
++- exit(0);
++- case '#':
++- DBUG_PUSH(argument ? argument : default_dbug_option);
++- break;
++- }
++- return 0;
++-}
++-
++-
++-static int get_options(int argc, char **argv)
++-{
++- int ho_error;
++-
++- if ((ho_error= handle_options(&argc, &argv, my_long_options, get_one_option)))
++- exit(ho_error);
++-
++- if (argc >= 1)
++- {
++- usage(0);
++- exit(1);
++- }
++- return(0);
++-}
++-
++-
++ int check_dup_symbols(SYMBOL *s1, SYMBOL *s2)
++ {
++ if (s1->length!=s2->length || strncmp(s1->name,s2->name,s1->length))
++@@ -443,12 +394,6 @@ int check_duplicates()
++
++ int main(int argc,char **argv)
++ {
++- MY_INIT(argv[0]);
++- DBUG_PROCESS(argv[0]);
++-
++- if (get_options(argc,(char **) argv))
++- exit(1);
++-
++ /* Broken up to indicate that it's not advice to you, gentle reader. */
++ printf("/*\n\n Do " "not " "edit " "this " "file " "directly!\n\n*/\n");
++
++@@ -549,7 +494,6 @@ static SYMBOL *get_hash_symbol(const cha
++ }\n\
++ }\n"
++ );
++- my_end(0);
++ exit(0);
++ }
++
++--- a/sql/Makefile.am
+++++ b/sql/Makefile.am
++@@ -26,7 +26,6 @@ INCLUDES = @ZLIB_INCLUDES@ \
++ WRAPLIBS= @WRAPLIBS@
++ SUBDIRS = share
++ libexec_PROGRAMS = mysqld
++-EXTRA_PROGRAMS = gen_lex_hash
++ bin_PROGRAMS = mysql_tzinfo_to_sql
++
++ noinst_LTLIBRARIES= libndb.la \
+diff --git a/feeds/packages/utils/mysql/patches/120-bison-compat.patch b/feeds/packages/utils/mysql/patches/120-bison-compat.patch
+new file mode 100644
+index 0000000..6c9ac94
+--- /dev/null
++++ b/feeds/packages/utils/mysql/patches/120-bison-compat.patch
+@@ -0,0 +1,3290 @@
++--- a/sql/sql_lex.cc
+++++ b/sql/sql_lex.cc
++@@ -775,14 +775,13 @@ bool consume_comment(Lex_input_stream *l
++ (which can't be followed by a signed number)
++ */
++
++-int MYSQLlex(void *arg, void *yythd)
+++int MYSQLlex(void *arg, THD *thd)
++ {
++ reg1 uchar c= 0;
++ bool comment_closed;
++ int tokval, result_state;
++ uint length;
++ enum my_lex_states state;
++- THD *thd= (THD *)yythd;
++ Lex_input_stream *lip= & thd->m_parser_state->m_lip;
++ LEX *lex= thd->lex;
++ YYSTYPE *yylval=(YYSTYPE*) arg;
++--- a/sql/sql_lex.h
+++++ b/sql/sql_lex.h
++@@ -2072,7 +2072,7 @@ extern void lex_init(void);
++ extern void lex_free(void);
++ extern void lex_start(THD *thd);
++ extern void lex_end(LEX *lex);
++-extern int MYSQLlex(void *arg, void *yythd);
+++extern int MYSQLlex(void *arg, THD *thd);
++
++ extern void trim_whitespace(CHARSET_INFO *cs, LEX_STRING *str);
++
++--- a/sql/sql_parse.cc
+++++ b/sql/sql_parse.cc
++@@ -8012,7 +8012,7 @@ bool check_host_name(LEX_STRING *str)
++ }
++
++
++-extern int MYSQLparse(void *thd); // from sql_yacc.cc
+++extern int MYSQLparse(THD *thd); // from sql_yacc.cc
++
++
++ /**
++--- a/sql/sql_yacc.yy
+++++ b/sql/sql_yacc.yy
++@@ -25,17 +25,15 @@
++ %{
++ /* thd is passed as an argument to yyparse(), and subsequently to yylex().
++ ** The type will be void*, so it must be cast to (THD*) when used.
++-** Use the YYTHD macro for this.
+++** Use the thd macro for this.
++ */
++-#define YYPARSE_PARAM yythd
++-#define YYLEX_PARAM yythd
++-#define YYTHD ((THD *)yythd)
++-#define YYLIP (& YYTHD->m_parser_state->m_lip)
+++#define YYLIP (& thd->m_parser_state->m_lip)
+++#define YYPS (& thd->m_parser_state->m_yacc)
++
++ #define MYSQL_YACC
++ #define YYINITDEPTH 100
++ #define YYMAXDEPTH 3200 /* Because of 64K stack */
++-#define Lex (YYTHD->lex)
+++#define Lex (thd->lex)
++ #define Select Lex->current_select
++ #include "mysql_priv.h"
++ #include "slave.h"
++@@ -64,7 +62,7 @@ const LEX_STRING null_lex_str= {0,0};
++ ulong val= *(F); \
++ if (my_yyoverflow((B), (D), &val)) \
++ { \
++- yyerror((char*) (A)); \
+++ yyerror(current_thd, (char*) (A)); \
++ return 2; \
++ } \
++ else \
++@@ -76,7 +74,7 @@ const LEX_STRING null_lex_str= {0,0};
++ #define MYSQL_YYABORT \
++ do \
++ { \
++- LEX::cleanup_lex_after_parse_error(YYTHD);\
+++ LEX::cleanup_lex_after_parse_error(thd); \
++ YYABORT; \
++ } while (0)
++
++@@ -159,10 +157,8 @@ void my_parse_error(const char *s)
++ to abort from the parser.
++ */
++
++-void MYSQLerror(const char *s)
+++void MYSQLerror(THD *thd, const char *s)
++ {
++- THD *thd= current_thd;
++-
++ /*
++ Restore the original LEX if it was replaced when parsing
++ a stored procedure. We must ensure that a parsing error
++@@ -675,7 +671,10 @@ static bool add_create_index (LEX *lex,
++ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
++ %}
++
++-%pure_parser /* We have threads */
+++/* We have threads */
+++%define api.pure
+++%parse-param { THD *thd }
+++%lex-param { THD *thd }
++ /*
++ Currently there are 169 shift/reduce conflicts.
++ We should not introduce new conflicts any more.
++@@ -1516,7 +1515,6 @@ rule: <-- starts at col 1
++ query:
++ END_OF_INPUT
++ {
++- THD *thd= YYTHD;
++ if (!thd->bootstrap &&
++ (!(thd->lex->select_lex.options & OPTION_FOUND_COMMENT)))
++ {
++@@ -1530,7 +1528,7 @@ query:
++ {
++ Lex_input_stream *lip = YYLIP;
++
++- if ((YYTHD->client_capabilities & CLIENT_MULTI_QUERIES) &&
+++ if ((thd->client_capabilities & CLIENT_MULTI_QUERIES) &&
++ ! lip->stmt_prepare_mode &&
++ ! lip->eof())
++ {
++@@ -1626,7 +1624,6 @@ statement:
++ deallocate:
++ deallocate_or_drop PREPARE_SYM ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ lex->sql_command= SQLCOM_DEALLOCATE_PREPARE;
++ lex->prepared_stmt_name= $3;
++@@ -1641,7 +1638,6 @@ deallocate_or_drop:
++ prepare:
++ PREPARE_SYM ident FROM prepare_src
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ lex->sql_command= SQLCOM_PREPARE;
++ lex->prepared_stmt_name= $2;
++@@ -1651,14 +1647,12 @@ prepare:
++ prepare_src:
++ TEXT_STRING_sys
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ lex->prepared_stmt_code= $1;
++ lex->prepared_stmt_code_is_varref= FALSE;
++ }
++ | '@' ident_or_text
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ lex->prepared_stmt_code= $2;
++ lex->prepared_stmt_code_is_varref= TRUE;
++@@ -1668,7 +1662,6 @@ prepare_src:
++ execute:
++ EXECUTE_SYM ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ lex->sql_command= SQLCOM_EXECUTE;
++ lex->prepared_stmt_name= $2;
++@@ -1826,7 +1819,6 @@ master_file_def:
++ create:
++ CREATE opt_table_options TABLE_SYM opt_if_not_exists table_ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ lex->sql_command= SQLCOM_CREATE_TABLE;
++ if (!lex->select_lex.add_table_to_list(thd, $5, NULL,
++@@ -1844,13 +1836,13 @@ create:
++ }
++ create2
++ {
++- LEX *lex= YYTHD->lex;
+++ LEX *lex= thd->lex;
++ lex->current_select= &lex->select_lex;
++ if ((lex->create_info.used_fields & HA_CREATE_USED_ENGINE) &&
++ !lex->create_info.db_type)
++ {
++- lex->create_info.db_type= ha_default_handlerton(YYTHD);
++- push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN,
+++ lex->create_info.db_type= ha_default_handlerton(thd);
+++ push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
++ ER_WARN_USING_OTHER_HANDLER,
++ ER(ER_WARN_USING_OTHER_HANDLER),
++ ha_resolve_storage_engine_name(lex->create_info.db_type),
++@@ -1979,7 +1971,6 @@ server_option:
++ event_tail:
++ remember_name EVENT_SYM opt_if_not_exists sp_name
++ {
++- THD *thd= YYTHD;
++ LEX *lex=Lex;
++
++ lex->stmt_definition_begin= $1;
++@@ -2046,7 +2037,7 @@ opt_ev_status:
++ ev_starts:
++ /* empty */
++ {
++- Item *item= new (YYTHD->mem_root) Item_func_now_local();
+++ Item *item= new (thd->mem_root) Item_func_now_local();
++ if (item == NULL)
++ MYSQL_YYABORT;
++ Lex->event_parse_data->item_starts= item;
++@@ -2096,7 +2087,6 @@ opt_ev_comment:
++
++ ev_sql_stmt:
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ Lex_input_stream *lip= YYLIP;
++
++@@ -2139,7 +2129,6 @@ ev_sql_stmt:
++ }
++ ev_sql_stmt_inner
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++
++ /* return back to the original memory root ASAP */
++@@ -2198,11 +2187,10 @@ sp_name:
++ $$= new sp_name($1, $3, true);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++- $$->init_qname(YYTHD);
+++ $$->init_qname(thd);
++ }
++ | ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ LEX_STRING db;
++ if (check_routine_name(&$1))
++@@ -2272,7 +2260,7 @@ call:
++ lex->sql_command= SQLCOM_CALL;
++ lex->spname= $2;
++ lex->value_list.empty();
++- sp_add_used_routine(lex, YYTHD, $2, TYPE_ENUM_PROCEDURE);
+++ sp_add_used_routine(lex, thd, $2, TYPE_ENUM_PROCEDURE);
++ }
++ opt_sp_cparam_list {}
++ ;
++@@ -2345,7 +2333,7 @@ sp_fdparam:
++ (enum enum_field_types)$3,
++ sp_param_in);
++
++- if (lex->sphead->fill_field_definition(YYTHD, lex,
+++ if (lex->sphead->fill_field_definition(thd, lex,
++ (enum enum_field_types) $3,
++ &spvar->field_def))
++ {
++@@ -2382,7 +2370,7 @@ sp_pdparam:
++ (enum enum_field_types)$4,
++ (sp_param_mode_t)$1);
++
++- if (lex->sphead->fill_field_definition(YYTHD, lex,
+++ if (lex->sphead->fill_field_definition(thd, lex,
++ (enum enum_field_types) $4,
++ &spvar->field_def))
++ {
++@@ -2445,13 +2433,12 @@ sp_decl:
++ {
++ LEX *lex= Lex;
++
++- lex->sphead->reset_lex(YYTHD);
+++ lex->sphead->reset_lex(thd);
++ lex->spcont->declare_var_boundary($2);
++ }
++ type
++ sp_opt_default
++ {
++- THD *thd= YYTHD;
++ LEX *lex= Lex;
++ sp_pcontext *pctx= lex->spcont;
++ uint num_vars= pctx->context_var_count();
++@@ -2477,7 +2464,7 @@ sp_decl:
++ spvar->type= var_type;
++ spvar->dflt= dflt_value_item;
++
++- if (lex->sphead->fill_field_definition(YYTHD, lex, var_type,
+++ if (lex->sphead->fill_field_definition(thd, lex, var_type,
++ &spvar->field_def))
++ {
++ MYSQL_YYABORT;
++@@ -2501,7 +2488,7 @@ sp_decl:
++ }
++
++ pctx->declare_var_boundary(0);
++- if (lex->sphead->restore_lex(YYTHD))
+++ if (lex->sphead->restore_lex(thd))
++ MYSQL_YYABORT;
++ $$.vars= $2;
++ $$.conds= $$.hndlrs= $$.curs= 0;
++@@ -2516,7 +2503,7 @@ sp_decl:
++ my_error(ER_SP_DUP_COND, MYF(0), $2.str);
++ MYSQL_YYABORT;
++ }
++- if(YYTHD->lex->spcont->push_cond(&$2, $5))
+++ if(thd->lex->spcont->push_cond(&$2, $5))
++ MYSQL_YYABORT;
++ $$.vars= $$.hndlrs= $$.curs= 0;
++ $$.conds= 1;
++@@ -2602,7 +2589,7 @@ sp_decl:
++
++ sp_cursor_stmt:
++ {
++- Lex->sphead->reset_lex(YYTHD);
+++ Lex->sphead->reset_lex(thd);
++ }
++ select
++ {
++@@ -2618,7 +2605,7 @@ sp_cursor_stmt:
++ }
++ lex->sp_lex_in_use= TRUE;
++ $$= lex;
++- if (lex->sphead->restore_lex(YYTHD))
+++ if (lex->sphead->restore_lex(thd))
++ MYSQL_YYABORT;
++ }
++ ;
++@@ -2662,7 +2649,7 @@ sp_hcond_element:
++ sp_cond:
++ ulong_num
++ { /* mysql errno */
++- $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t));
+++ $$= (sp_cond_type_t *)thd->alloc(sizeof(sp_cond_type_t));
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ $$->type= sp_cond_type_t::number;
++@@ -2675,7 +2662,7 @@ sp_cond:
++ my_error(ER_SP_BAD_SQLSTATE, MYF(0), $3.str);
++ MYSQL_YYABORT;
++ }
++- $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t));
+++ $$= (sp_cond_type_t *) thd->alloc(sizeof(sp_cond_type_t));
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ $$->type= sp_cond_type_t::state;
++@@ -2705,21 +2692,21 @@ sp_hcond:
++ }
++ | SQLWARNING_SYM /* SQLSTATEs 01??? */
++ {
++- $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t));
+++ $$= (sp_cond_type_t *) thd->alloc(sizeof(sp_cond_type_t));
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ $$->type= sp_cond_type_t::warning;
++ }
++ | not FOUND_SYM /* SQLSTATEs 02??? */
++ {
++- $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t));
+++ $$= (sp_cond_type_t *) thd->alloc(sizeof(sp_cond_type_t));
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ $$->type= sp_cond_type_t::notfound;
++ }
++ | SQLEXCEPTION_SYM /* All other SQLSTATEs */
++ {
++- $$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t));
+++ $$= (sp_cond_type_t *) thd->alloc(sizeof(sp_cond_type_t));
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ $$->type= sp_cond_type_t::exception;
++@@ -2789,7 +2776,6 @@ sp_proc_stmt_if:
++
++ sp_proc_stmt_statement:
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ Lex_input_stream *lip= YYLIP;
++
++@@ -2798,7 +2784,6 @@ sp_proc_stmt_statement:
++ }
++ statement
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ Lex_input_stream *lip= YYLIP;
++ sp_head *sp= lex->sphead;
++@@ -2845,7 +2830,7 @@ sp_proc_stmt_statement:
++
++ sp_proc_stmt_return:
++ RETURN_SYM
++- { Lex->sphead->reset_lex(YYTHD); }
+++ { Lex->sphead->reset_lex(thd); }
++ expr
++ {
++ LEX *lex= Lex;
++@@ -2867,7 +2852,7 @@ sp_proc_stmt_return:
++ MYSQL_YYABORT;
++ sp->m_flags|= sp_head::HAS_RETURN;
++ }
++- if (sp->restore_lex(YYTHD))
+++ if (sp->restore_lex(thd))
++ MYSQL_YYABORT;
++ }
++ ;
++@@ -3094,7 +3079,7 @@ sp_fetch_list:
++ ;
++
++ sp_if:
++- { Lex->sphead->reset_lex(YYTHD); }
+++ { Lex->sphead->reset_lex(thd); }
++ expr THEN_SYM
++ {
++ LEX *lex= Lex;
++@@ -3108,7 +3093,7 @@ sp_if:
++ sp->add_cont_backpatch(i) ||
++ sp->add_instr(i))
++ MYSQL_YYABORT;
++- if (sp->restore_lex(YYTHD))
+++ if (sp->restore_lex(thd))
++ MYSQL_YYABORT;
++ }
++ sp_proc_stmts1
++@@ -3147,7 +3132,7 @@ simple_case_stmt:
++ {
++ LEX *lex= Lex;
++ case_stmt_action_case(lex);
++- lex->sphead->reset_lex(YYTHD); /* For expr $3 */
+++ lex->sphead->reset_lex(thd); /* For expr $3 */
++ }
++ expr
++ {
++@@ -3156,7 +3141,7 @@ simple_case_stmt:
++ MYSQL_YYABORT;
++
++ /* For expr $3 */
++- if (lex->sphead->restore_lex(YYTHD))
+++ if (lex->sphead->restore_lex(thd))
++ MYSQL_YYABORT;
++ }
++ simple_when_clause_list
++@@ -3198,7 +3183,7 @@ searched_when_clause_list:
++ simple_when_clause:
++ WHEN_SYM
++ {
++- Lex->sphead->reset_lex(YYTHD); /* For expr $3 */
+++ Lex->sphead->reset_lex(thd); /* For expr $3 */
++ }
++ expr
++ {
++@@ -3208,7 +3193,7 @@ simple_when_clause:
++ if (case_stmt_action_when(lex, $3, true))
++ MYSQL_YYABORT;
++ /* For expr $3 */
++- if (lex->sphead->restore_lex(YYTHD))
+++ if (lex->sphead->restore_lex(thd))
++ MYSQL_YYABORT;
++ }
++ THEN_SYM
++@@ -3223,7 +3208,7 @@ simple_when_clause:
++ searched_when_clause:
++ WHEN_SYM
++ {
++- Lex->sphead->reset_lex(YYTHD); /* For expr $3 */
+++ Lex->sphead->reset_lex(thd); /* For expr $3 */
++ }
++ expr
++ {
++@@ -3231,7 +3216,7 @@ searched_when_clause:
++ if (case_stmt_action_when(lex, $3, false))
++ MYSQL_YYABORT;
++ /* For expr $3 */
++- if (lex->sphead->restore_lex(YYTHD))
+++ if (lex->sphead->restore_lex(thd))
++ MYSQL_YYABORT;
++ }
++ THEN_SYM
++@@ -3395,7 +3380,7 @@ sp_unlabeled_control:
++ MYSQL_YYABORT;
++ }
++ | WHILE_SYM
++- { Lex->sphead->reset_lex(YYTHD); }
+++ { Lex->sphead->reset_lex(thd); }
++ expr DO_SYM
++ {
++ LEX *lex= Lex;
++@@ -3409,7 +3394,7 @@ sp_unlabeled_control:
++ sp->new_cont_backpatch(i) ||
++ sp->add_instr(i))
++ MYSQL_YYABORT;
++- if (sp->restore_lex(YYTHD))
+++ if (sp->restore_lex(thd))
++ MYSQL_YYABORT;
++ }
++ sp_proc_stmts1 END WHILE_SYM
++@@ -3424,7 +3409,7 @@ sp_unlabeled_control:
++ lex->sphead->do_cont_backpatch();
++ }
++ | REPEAT_SYM sp_proc_stmts1 UNTIL_SYM
++- { Lex->sphead->reset_lex(YYTHD); }
+++ { Lex->sphead->reset_lex(thd); }
++ expr END REPEAT_SYM
++ {
++ LEX *lex= Lex;
++@@ -3436,7 +3421,7 @@ sp_unlabeled_control:
++ if (i == NULL ||
++ lex->sphead->add_instr(i))
++ MYSQL_YYABORT;
++- if (lex->sphead->restore_lex(YYTHD))
+++ if (lex->sphead->restore_lex(thd))
++ MYSQL_YYABORT;
++ /* We can shortcut the cont_backpatch here */
++ i->m_cont_dest= ip+1;
++@@ -3859,7 +3844,6 @@ create2:
++ create3 {}
++ | LIKE table_ident
++ {
++- THD *thd= YYTHD;
++ TABLE_LIST *src_table;
++ LEX *lex= thd->lex;
++
++@@ -3873,7 +3857,6 @@ create2:
++ }
++ | '(' LIKE table_ident ')'
++ {
++- THD *thd= YYTHD;
++ TABLE_LIST *src_table;
++ LEX *lex= thd->lex;
++
++@@ -4342,7 +4325,6 @@ part_bit_expr:
++ bit_expr
++ {
++ Item *part_expr= $1;
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ Name_resolution_context *context= &lex->current_select->context;
++ TABLE_LIST *save_list= context->table_list;
++@@ -4364,7 +4346,7 @@ part_bit_expr:
++ my_error(ER_PARTITION_FUNCTION_IS_NOT_ALLOWED, MYF(0));
++ MYSQL_YYABORT;
++ }
++- if (part_expr->fix_fields(YYTHD, (Item**)0) ||
+++ if (part_expr->fix_fields(thd, (Item**)0) ||
++ ((context->table_list= save_list), FALSE) ||
++ (!part_expr->const_item()) ||
++ (!lex->safe_to_cache_query))
++@@ -4629,7 +4611,7 @@ create_table_option:
++ | TYPE_SYM opt_equal storage_engines
++ {
++ Lex->create_info.db_type= $3;
++- WARN_DEPRECATED(yythd, "6.0", "TYPE=storage_engine",
+++ WARN_DEPRECATED(thd, "6.0", "TYPE=storage_engine",
++ "'ENGINE=storage_engine'");
++ Lex->create_info.used_fields|= HA_CREATE_USED_ENGINE;
++ }
++@@ -4791,19 +4773,19 @@ default_collation:
++ storage_engines:
++ ident_or_text
++ {
++- plugin_ref plugin= ha_resolve_by_name(YYTHD, &$1);
+++ plugin_ref plugin= ha_resolve_by_name(thd, &$1);
++
++ if (plugin)
++ $$= plugin_data(plugin, handlerton*);
++ else
++ {
++- if (YYTHD->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION)
+++ if (thd->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION)
++ {
++ my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), $1.str);
++ MYSQL_YYABORT;
++ }
++ $$= 0;
++- push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN,
+++ push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
++ ER_UNKNOWN_STORAGE_ENGINE,
++ ER(ER_UNKNOWN_STORAGE_ENGINE),
++ $1.str);
++@@ -4815,7 +4797,7 @@ known_storage_engines:
++ ident_or_text
++ {
++ plugin_ref plugin;
++- if ((plugin= ha_resolve_by_name(YYTHD, &$1)))
+++ if ((plugin= ha_resolve_by_name(thd, &$1)))
++ $$= plugin_data(plugin, handlerton*);
++ else
++ {
++@@ -5043,7 +5025,7 @@ type:
++ {
++ char buff[sizeof("YEAR()") + MY_INT64_NUM_DECIMAL_DIGITS + 1];
++ my_snprintf(buff, sizeof(buff), "YEAR(%lu)", length);
++- push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_NOTE,
+++ push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
++ ER_WARN_DEPRECATED_SYNTAX,
++ ER(ER_WARN_DEPRECATED_SYNTAX),
++ buff, "YEAR(4)");
++@@ -5057,7 +5039,7 @@ type:
++ { $$=MYSQL_TYPE_TIME; }
++ | TIMESTAMP opt_field_length
++ {
++- if (YYTHD->variables.sql_mode & MODE_MAXDB)
+++ if (thd->variables.sql_mode & MODE_MAXDB)
++ $$=MYSQL_TYPE_DATETIME;
++ else
++ {
++@@ -5189,7 +5171,7 @@ int_type:
++ real_type:
++ REAL
++ {
++- $$= YYTHD->variables.sql_mode & MODE_REAL_AS_FLOAT ?
+++ $$= thd->variables.sql_mode & MODE_REAL_AS_FLOAT ?
++ MYSQL_TYPE_FLOAT : MYSQL_TYPE_DOUBLE;
++ }
++ | DOUBLE_SYM
++@@ -5263,7 +5245,7 @@ attribute:
++ | DEFAULT now_or_signed_literal { Lex->default_value=$2; }
++ | ON UPDATE_SYM NOW_SYM optional_braces
++ {
++- Item *item= new (YYTHD->mem_root) Item_func_now_local();
+++ Item *item= new (thd->mem_root) Item_func_now_local();
++ if (item == NULL)
++ MYSQL_YYABORT;
++ Lex->on_update_value= item;
++@@ -5312,7 +5294,7 @@ attribute:
++ now_or_signed_literal:
++ NOW_SYM optional_braces
++ {
++- $$= new (YYTHD->mem_root) Item_func_now_local();
+++ $$= new (thd->mem_root) Item_func_now_local();
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -5673,7 +5655,6 @@ string_list:
++ alter:
++ ALTER opt_ignore TABLE_SYM table_ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ lex->name.str= 0;
++ lex->name.length= 0;
++@@ -5799,7 +5780,7 @@ alter:
++ Event_parse_data.
++ */
++
++- if (!(Lex->event_parse_data= Event_parse_data::new_instance(YYTHD)))
+++ if (!(Lex->event_parse_data= Event_parse_data::new_instance(thd)))
++ MYSQL_YYABORT;
++ Lex->event_parse_data->identifier= $4;
++
++@@ -6192,7 +6173,6 @@ alter_list_item:
++ {
++ if (!$4)
++ {
++- THD *thd= YYTHD;
++ $4= thd->variables.collation_database;
++ }
++ $5= $5 ? $5 : $4;
++@@ -6556,7 +6536,7 @@ keycache_list:
++ assign_to_keycache:
++ table_ident cache_keys_spec
++ {
++- if (!Select->add_table_to_list(YYTHD, $1, NULL, 0, TL_READ,
+++ if (!Select->add_table_to_list(thd, $1, NULL, 0, TL_READ,
++ Select->pop_index_hints()))
++ MYSQL_YYABORT;
++ }
++@@ -6585,7 +6565,7 @@ preload_list:
++ preload_keys:
++ table_ident cache_keys_spec opt_ignore_leaves
++ {
++- if (!Select->add_table_to_list(YYTHD, $1, NULL, $3, TL_READ,
+++ if (!Select->add_table_to_list(thd, $1, NULL, $3, TL_READ,
++ Select->pop_index_hints()))
++ MYSQL_YYABORT;
++ }
++@@ -6593,7 +6573,7 @@ preload_keys:
++
++ cache_keys_spec:
++ {
++- Lex->select_lex.alloc_index_hints(YYTHD);
+++ Lex->select_lex.alloc_index_hints(thd);
++ Select->set_index_hint_type(INDEX_HINT_USE,
++ global_system_variables.old_mode ?
++ INDEX_HINT_MASK_JOIN :
++@@ -6813,7 +6793,6 @@ select_item_list:
++ | select_item
++ | '*'
++ {
++- THD *thd= YYTHD;
++ Item *item= new (thd->mem_root)
++ Item_field(&thd->lex->current_select->context,
++ NULL, NULL, "*");
++@@ -6828,7 +6807,6 @@ select_item_list:
++ select_item:
++ remember_name select_item2 remember_end select_alias
++ {
++- THD *thd= YYTHD;
++ DBUG_ASSERT($1 < $3);
++
++ if (add_item_to_list(thd, $2))
++@@ -6929,7 +6907,7 @@ expr:
++ else
++ {
++ /* X OR Y */
++- $$ = new (YYTHD->mem_root) Item_cond_or($1, $3);
+++ $$ = new (thd->mem_root) Item_cond_or($1, $3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -6937,7 +6915,7 @@ expr:
++ | expr XOR expr %prec XOR
++ {
++ /* XOR is a proprietary extension */
++- $$ = new (YYTHD->mem_root) Item_cond_xor($1, $3);
+++ $$ = new (thd->mem_root) Item_cond_xor($1, $3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -6979,50 +6957,50 @@ expr:
++ else
++ {
++ /* X AND Y */
++- $$ = new (YYTHD->mem_root) Item_cond_and($1, $3);
+++ $$ = new (thd->mem_root) Item_cond_and($1, $3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ }
++ | NOT_SYM expr %prec NOT_SYM
++ {
++- $$= negate_expression(YYTHD, $2);
+++ $$= negate_expression(thd, $2);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bool_pri IS TRUE_SYM %prec IS
++ {
++- $$= new (YYTHD->mem_root) Item_func_istrue($1);
+++ $$= new (thd->mem_root) Item_func_istrue($1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bool_pri IS not TRUE_SYM %prec IS
++ {
++- $$= new (YYTHD->mem_root) Item_func_isnottrue($1);
+++ $$= new (thd->mem_root) Item_func_isnottrue($1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bool_pri IS FALSE_SYM %prec IS
++ {
++- $$= new (YYTHD->mem_root) Item_func_isfalse($1);
+++ $$= new (thd->mem_root) Item_func_isfalse($1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bool_pri IS not FALSE_SYM %prec IS
++ {
++- $$= new (YYTHD->mem_root) Item_func_isnotfalse($1);
+++ $$= new (thd->mem_root) Item_func_isnotfalse($1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bool_pri IS UNKNOWN_SYM %prec IS
++ {
++- $$= new (YYTHD->mem_root) Item_func_isnull($1);
+++ $$= new (thd->mem_root) Item_func_isnull($1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bool_pri IS not UNKNOWN_SYM %prec IS
++ {
++- $$= new (YYTHD->mem_root) Item_func_isnotnull($1);
+++ $$= new (thd->mem_root) Item_func_isnotnull($1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7032,19 +7010,19 @@ expr:
++ bool_pri:
++ bool_pri IS NULL_SYM %prec IS
++ {
++- $$= new (YYTHD->mem_root) Item_func_isnull($1);
+++ $$= new (thd->mem_root) Item_func_isnull($1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bool_pri IS not NULL_SYM %prec IS
++ {
++- $$= new (YYTHD->mem_root) Item_func_isnotnull($1);
+++ $$= new (thd->mem_root) Item_func_isnotnull($1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bool_pri EQUAL_SYM predicate %prec EQUAL_SYM
++ {
++- $$= new (YYTHD->mem_root) Item_func_equal($1,$3);
+++ $$= new (thd->mem_root) Item_func_equal($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7066,13 +7044,12 @@ bool_pri:
++ predicate:
++ bit_expr IN_SYM '(' subselect ')'
++ {
++- $$= new (YYTHD->mem_root) Item_in_subselect($1, $4);
+++ $$= new (thd->mem_root) Item_in_subselect($1, $4);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr not IN_SYM '(' subselect ')'
++ {
++- THD *thd= YYTHD;
++ Item *item= new (thd->mem_root) Item_in_subselect($1, $5);
++ if (item == NULL)
++ MYSQL_YYABORT;
++@@ -7082,7 +7059,7 @@ predicate:
++ }
++ | bit_expr IN_SYM '(' expr ')'
++ {
++- $$= handle_sql2003_note184_exception(YYTHD, $1, true, $4);
+++ $$= handle_sql2003_note184_exception(thd, $1, true, $4);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7090,13 +7067,13 @@ predicate:
++ {
++ $6->push_front($4);
++ $6->push_front($1);
++- $$= new (YYTHD->mem_root) Item_func_in(*$6);
+++ $$= new (thd->mem_root) Item_func_in(*$6);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr not IN_SYM '(' expr ')'
++ {
++- $$= handle_sql2003_note184_exception(YYTHD, $1, false, $5);
+++ $$= handle_sql2003_note184_exception(thd, $1, false, $5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7104,7 +7081,7 @@ predicate:
++ {
++ $7->push_front($5);
++ $7->push_front($1);
++- Item_func_in *item = new (YYTHD->mem_root) Item_func_in(*$7);
+++ Item_func_in *item = new (thd->mem_root) Item_func_in(*$7);
++ if (item == NULL)
++ MYSQL_YYABORT;
++ item->negate();
++@@ -7112,14 +7089,14 @@ predicate:
++ }
++ | bit_expr BETWEEN_SYM bit_expr AND_SYM predicate
++ {
++- $$= new (YYTHD->mem_root) Item_func_between($1,$3,$5);
+++ $$= new (thd->mem_root) Item_func_between($1,$3,$5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr not BETWEEN_SYM bit_expr AND_SYM predicate
++ {
++ Item_func_between *item;
++- item= new (YYTHD->mem_root) Item_func_between($1,$4,$6);
+++ item= new (thd->mem_root) Item_func_between($1,$4,$6);
++ if (item == NULL)
++ MYSQL_YYABORT;
++ item->negate();
++@@ -7127,42 +7104,42 @@ predicate:
++ }
++ | bit_expr SOUNDS_SYM LIKE bit_expr
++ {
++- Item *item1= new (YYTHD->mem_root) Item_func_soundex($1);
++- Item *item4= new (YYTHD->mem_root) Item_func_soundex($4);
+++ Item *item1= new (thd->mem_root) Item_func_soundex($1);
+++ Item *item4= new (thd->mem_root) Item_func_soundex($4);
++ if ((item1 == NULL) || (item4 == NULL))
++ MYSQL_YYABORT;
++- $$= new (YYTHD->mem_root) Item_func_eq(item1, item4);
+++ $$= new (thd->mem_root) Item_func_eq(item1, item4);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr LIKE simple_expr opt_escape
++ {
++- $$= new (YYTHD->mem_root) Item_func_like($1,$3,$4,Lex->escape_used);
+++ $$= new (thd->mem_root) Item_func_like($1,$3,$4,Lex->escape_used);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr not LIKE simple_expr opt_escape
++ {
++- Item *item= new (YYTHD->mem_root) Item_func_like($1,$4,$5,
+++ Item *item= new (thd->mem_root) Item_func_like($1,$4,$5,
++ Lex->escape_used);
++ if (item == NULL)
++ MYSQL_YYABORT;
++- $$= new (YYTHD->mem_root) Item_func_not(item);
+++ $$= new (thd->mem_root) Item_func_not(item);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr REGEXP bit_expr
++ {
++- $$= new (YYTHD->mem_root) Item_func_regex($1,$3);
+++ $$= new (thd->mem_root) Item_func_regex($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr not REGEXP bit_expr
++ {
++- Item *item= new (YYTHD->mem_root) Item_func_regex($1,$4);
+++ Item *item= new (thd->mem_root) Item_func_regex($1,$4);
++ if (item == NULL)
++ MYSQL_YYABORT;
++- $$= negate_expression(YYTHD, item);
+++ $$= negate_expression(thd, item);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7172,85 +7149,85 @@ predicate:
++ bit_expr:
++ bit_expr '|' bit_expr %prec '|'
++ {
++- $$= new (YYTHD->mem_root) Item_func_bit_or($1,$3);
+++ $$= new (thd->mem_root) Item_func_bit_or($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr '&' bit_expr %prec '&'
++ {
++- $$= new (YYTHD->mem_root) Item_func_bit_and($1,$3);
+++ $$= new (thd->mem_root) Item_func_bit_and($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr SHIFT_LEFT bit_expr %prec SHIFT_LEFT
++ {
++- $$= new (YYTHD->mem_root) Item_func_shift_left($1,$3);
+++ $$= new (thd->mem_root) Item_func_shift_left($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr SHIFT_RIGHT bit_expr %prec SHIFT_RIGHT
++ {
++- $$= new (YYTHD->mem_root) Item_func_shift_right($1,$3);
+++ $$= new (thd->mem_root) Item_func_shift_right($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr '+' bit_expr %prec '+'
++ {
++- $$= new (YYTHD->mem_root) Item_func_plus($1,$3);
+++ $$= new (thd->mem_root) Item_func_plus($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr '-' bit_expr %prec '-'
++ {
++- $$= new (YYTHD->mem_root) Item_func_minus($1,$3);
+++ $$= new (thd->mem_root) Item_func_minus($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr '+' INTERVAL_SYM expr interval %prec '+'
++ {
++- $$= new (YYTHD->mem_root) Item_date_add_interval($1,$4,$5,0);
+++ $$= new (thd->mem_root) Item_date_add_interval($1,$4,$5,0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr '-' INTERVAL_SYM expr interval %prec '-'
++ {
++- $$= new (YYTHD->mem_root) Item_date_add_interval($1,$4,$5,1);
+++ $$= new (thd->mem_root) Item_date_add_interval($1,$4,$5,1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr '*' bit_expr %prec '*'
++ {
++- $$= new (YYTHD->mem_root) Item_func_mul($1,$3);
+++ $$= new (thd->mem_root) Item_func_mul($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr '/' bit_expr %prec '/'
++ {
++- $$= new (YYTHD->mem_root) Item_func_div($1,$3);
+++ $$= new (thd->mem_root) Item_func_div($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr '%' bit_expr %prec '%'
++ {
++- $$= new (YYTHD->mem_root) Item_func_mod($1,$3);
+++ $$= new (thd->mem_root) Item_func_mod($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr DIV_SYM bit_expr %prec DIV_SYM
++ {
++- $$= new (YYTHD->mem_root) Item_func_int_div($1,$3);
+++ $$= new (thd->mem_root) Item_func_int_div($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr MOD_SYM bit_expr %prec MOD_SYM
++ {
++- $$= new (YYTHD->mem_root) Item_func_mod($1,$3);
+++ $$= new (thd->mem_root) Item_func_mod($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | bit_expr '^' bit_expr
++ {
++- $$= new (YYTHD->mem_root) Item_func_bit_xor($1,$3);
+++ $$= new (thd->mem_root) Item_func_bit_xor($1,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7299,7 +7276,6 @@ simple_expr:
++ | function_call_conflict
++ | simple_expr COLLATE_SYM ident_or_text %prec NEG
++ {
++- THD *thd= YYTHD;
++ Item *i1= new (thd->mem_root) Item_string($3.str,
++ $3.length,
++ thd->charset());
++@@ -7315,7 +7291,7 @@ simple_expr:
++ | sum_expr
++ | simple_expr OR_OR_SYM simple_expr
++ {
++- $$= new (YYTHD->mem_root) Item_func_concat($1, $3);
+++ $$= new (thd->mem_root) Item_func_concat($1, $3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7325,25 +7301,25 @@ simple_expr:
++ }
++ | '-' simple_expr %prec NEG
++ {
++- $$= new (YYTHD->mem_root) Item_func_neg($2);
+++ $$= new (thd->mem_root) Item_func_neg($2);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | '~' simple_expr %prec NEG
++ {
++- $$= new (YYTHD->mem_root) Item_func_bit_neg($2);
+++ $$= new (thd->mem_root) Item_func_bit_neg($2);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | not2 simple_expr %prec NEG
++ {
++- $$= negate_expression(YYTHD, $2);
+++ $$= negate_expression(thd, $2);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | '(' subselect ')'
++ {
++- $$= new (YYTHD->mem_root) Item_singlerow_subselect($2);
+++ $$= new (thd->mem_root) Item_singlerow_subselect($2);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7352,20 +7328,20 @@ simple_expr:
++ | '(' expr ',' expr_list ')'
++ {
++ $4->push_front($2);
++- $$= new (YYTHD->mem_root) Item_row(*$4);
+++ $$= new (thd->mem_root) Item_row(*$4);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | ROW_SYM '(' expr ',' expr_list ')'
++ {
++ $5->push_front($3);
++- $$= new (YYTHD->mem_root) Item_row(*$5);
+++ $$= new (thd->mem_root) Item_row(*$5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | EXISTS '(' subselect ')'
++ {
++- $$= new (YYTHD->mem_root) Item_exists_subselect($3);
+++ $$= new (thd->mem_root) Item_exists_subselect($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7374,7 +7350,7 @@ simple_expr:
++ | MATCH ident_list_arg AGAINST '(' bit_expr fulltext_options ')'
++ {
++ $2->push_front($5);
++- Item_func_match *i1= new (YYTHD->mem_root) Item_func_match(*$2, $6);
+++ Item_func_match *i1= new (thd->mem_root) Item_func_match(*$2, $6);
++ if (i1 == NULL)
++ MYSQL_YYABORT;
++ Select->add_ftfunc_to_list(i1);
++@@ -7382,7 +7358,7 @@ simple_expr:
++ }
++ | BINARY simple_expr %prec NEG
++ {
++- $$= create_func_cast(YYTHD, $2, ITEM_CAST_CHAR, NULL, NULL,
+++ $$= create_func_cast(thd, $2, ITEM_CAST_CHAR, NULL, NULL,
++ &my_charset_bin);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++@@ -7390,27 +7366,27 @@ simple_expr:
++ | CAST_SYM '(' expr AS cast_type ')'
++ {
++ LEX *lex= Lex;
++- $$= create_func_cast(YYTHD, $3, $5, lex->length, lex->dec,
+++ $$= create_func_cast(thd, $3, $5, lex->length, lex->dec,
++ lex->charset);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | CASE_SYM opt_expr when_list opt_else END
++ {
++- $$= new (YYTHD->mem_root) Item_func_case(* $3, $2, $4 );
+++ $$= new (thd->mem_root) Item_func_case(* $3, $2, $4 );
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | CONVERT_SYM '(' expr ',' cast_type ')'
++ {
++- $$= create_func_cast(YYTHD, $3, $5, Lex->length, Lex->dec,
+++ $$= create_func_cast(thd, $3, $5, Lex->length, Lex->dec,
++ Lex->charset);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | CONVERT_SYM '(' expr USING charset_name ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_conv_charset($3,$5);
+++ $$= new (thd->mem_root) Item_func_conv_charset($3,$5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7423,14 +7399,14 @@ simple_expr:
++ my_error(ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str);
++ MYSQL_YYABORT;
++ }
++- $$= new (YYTHD->mem_root) Item_default_value(Lex->current_context(),
+++ $$= new (thd->mem_root) Item_default_value(Lex->current_context(),
++ $3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | VALUES '(' simple_ident_nospvar ')'
++ {
++- $$= new (YYTHD->mem_root) Item_insert_value(Lex->current_context(),
+++ $$= new (thd->mem_root) Item_insert_value(Lex->current_context(),
++ $3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++@@ -7438,7 +7414,7 @@ simple_expr:
++ | INTERVAL_SYM expr interval '+' expr %prec INTERVAL_SYM
++ /* we cannot put interval before - */
++ {
++- $$= new (YYTHD->mem_root) Item_date_add_interval($5,$2,$3,0);
+++ $$= new (thd->mem_root) Item_date_add_interval($5,$2,$3,0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7453,19 +7429,19 @@ simple_expr:
++ function_call_keyword:
++ CHAR_SYM '(' expr_list ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_char(*$3);
+++ $$= new (thd->mem_root) Item_func_char(*$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | CHAR_SYM '(' expr_list USING charset_name ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_char(*$3, $5);
+++ $$= new (thd->mem_root) Item_func_char(*$3, $5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | CURRENT_USER optional_braces
++ {
++- $$= new (YYTHD->mem_root) Item_func_current_user(Lex->current_context());
+++ $$= new (thd->mem_root) Item_func_current_user(Lex->current_context());
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->set_stmt_unsafe();
++@@ -7473,31 +7449,30 @@ function_call_keyword:
++ }
++ | DATE_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_date_typecast($3);
+++ $$= new (thd->mem_root) Item_date_typecast($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | DAY_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_dayofmonth($3);
+++ $$= new (thd->mem_root) Item_func_dayofmonth($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | HOUR_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_hour($3);
+++ $$= new (thd->mem_root) Item_func_hour($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | INSERT '(' expr ',' expr ',' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_insert($3,$5,$7,$9);
+++ $$= new (thd->mem_root) Item_func_insert($3,$5,$7,$9);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | INTERVAL_SYM '(' expr ',' expr ')' %prec INTERVAL_SYM
++ {
++- THD *thd= YYTHD;
++ List<Item> *list= new (thd->mem_root) List<Item>;
++ if (list == NULL)
++ MYSQL_YYABORT;
++@@ -7512,7 +7487,6 @@ function_call_keyword:
++ }
++ | INTERVAL_SYM '(' expr ',' expr ',' expr_list ')' %prec INTERVAL_SYM
++ {
++- THD *thd= YYTHD;
++ $7->push_front($5);
++ $7->push_front($3);
++ Item_row *item= new (thd->mem_root) Item_row(*$7);
++@@ -7524,103 +7498,103 @@ function_call_keyword:
++ }
++ | LEFT '(' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_left($3,$5);
+++ $$= new (thd->mem_root) Item_func_left($3,$5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | MINUTE_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_minute($3);
+++ $$= new (thd->mem_root) Item_func_minute($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | MONTH_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_month($3);
+++ $$= new (thd->mem_root) Item_func_month($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | RIGHT '(' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_right($3,$5);
+++ $$= new (thd->mem_root) Item_func_right($3,$5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | SECOND_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_second($3);
+++ $$= new (thd->mem_root) Item_func_second($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TIME_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_time_typecast($3);
+++ $$= new (thd->mem_root) Item_time_typecast($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TIMESTAMP '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_datetime_typecast($3);
+++ $$= new (thd->mem_root) Item_datetime_typecast($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TIMESTAMP '(' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_add_time($3, $5, 1, 0);
+++ $$= new (thd->mem_root) Item_func_add_time($3, $5, 1, 0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TRIM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_trim($3);
+++ $$= new (thd->mem_root) Item_func_trim($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TRIM '(' LEADING expr FROM expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_ltrim($6,$4);
+++ $$= new (thd->mem_root) Item_func_ltrim($6,$4);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TRIM '(' TRAILING expr FROM expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_rtrim($6,$4);
+++ $$= new (thd->mem_root) Item_func_rtrim($6,$4);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TRIM '(' BOTH expr FROM expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_trim($6,$4);
+++ $$= new (thd->mem_root) Item_func_trim($6,$4);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TRIM '(' LEADING FROM expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_ltrim($5);
+++ $$= new (thd->mem_root) Item_func_ltrim($5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TRIM '(' TRAILING FROM expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_rtrim($5);
+++ $$= new (thd->mem_root) Item_func_rtrim($5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TRIM '(' BOTH FROM expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_trim($5);
+++ $$= new (thd->mem_root) Item_func_trim($5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TRIM '(' expr FROM expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_trim($5,$3);
+++ $$= new (thd->mem_root) Item_func_trim($5,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | USER '(' ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_user();
+++ $$= new (thd->mem_root) Item_func_user();
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->set_stmt_unsafe();
++@@ -7628,7 +7602,7 @@ function_call_keyword:
++ }
++ | YEAR_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_year($3);
+++ $$= new (thd->mem_root) Item_func_year($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7649,34 +7623,34 @@ function_call_keyword:
++ function_call_nonkeyword:
++ ADDDATE_SYM '(' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_date_add_interval($3, $5,
+++ $$= new (thd->mem_root) Item_date_add_interval($3, $5,
++ INTERVAL_DAY, 0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | ADDDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')'
++ {
++- $$= new (YYTHD->mem_root) Item_date_add_interval($3, $6, $7, 0);
+++ $$= new (thd->mem_root) Item_date_add_interval($3, $6, $7, 0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | CURDATE optional_braces
++ {
++- $$= new (YYTHD->mem_root) Item_func_curdate_local();
+++ $$= new (thd->mem_root) Item_func_curdate_local();
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->safe_to_cache_query=0;
++ }
++ | CURTIME optional_braces
++ {
++- $$= new (YYTHD->mem_root) Item_func_curtime_local();
+++ $$= new (thd->mem_root) Item_func_curtime_local();
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->safe_to_cache_query=0;
++ }
++ | CURTIME '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_curtime_local($3);
+++ $$= new (thd->mem_root) Item_func_curtime_local($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->safe_to_cache_query=0;
++@@ -7684,83 +7658,83 @@ function_call_nonkeyword:
++ | DATE_ADD_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')'
++ %prec INTERVAL_SYM
++ {
++- $$= new (YYTHD->mem_root) Item_date_add_interval($3,$6,$7,0);
+++ $$= new (thd->mem_root) Item_date_add_interval($3,$6,$7,0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | DATE_SUB_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')'
++ %prec INTERVAL_SYM
++ {
++- $$= new (YYTHD->mem_root) Item_date_add_interval($3,$6,$7,1);
+++ $$= new (thd->mem_root) Item_date_add_interval($3,$6,$7,1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | EXTRACT_SYM '(' interval FROM expr ')'
++ {
++- $$=new (YYTHD->mem_root) Item_extract( $3, $5);
+++ $$=new (thd->mem_root) Item_extract( $3, $5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | GET_FORMAT '(' date_time_type ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_get_format($3, $5);
+++ $$= new (thd->mem_root) Item_func_get_format($3, $5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | NOW_SYM optional_braces
++ {
++- $$= new (YYTHD->mem_root) Item_func_now_local();
+++ $$= new (thd->mem_root) Item_func_now_local();
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->safe_to_cache_query=0;
++ }
++ | NOW_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_now_local($3);
+++ $$= new (thd->mem_root) Item_func_now_local($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->safe_to_cache_query=0;
++ }
++ | POSITION_SYM '(' bit_expr IN_SYM expr ')'
++ {
++- $$ = new (YYTHD->mem_root) Item_func_locate($5,$3);
+++ $$ = new (thd->mem_root) Item_func_locate($5,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | SUBDATE_SYM '(' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_date_add_interval($3, $5,
+++ $$= new (thd->mem_root) Item_date_add_interval($3, $5,
++ INTERVAL_DAY, 1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | SUBDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')'
++ {
++- $$= new (YYTHD->mem_root) Item_date_add_interval($3, $6, $7, 1);
+++ $$= new (thd->mem_root) Item_date_add_interval($3, $6, $7, 1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | SUBSTRING '(' expr ',' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_substr($3,$5,$7);
+++ $$= new (thd->mem_root) Item_func_substr($3,$5,$7);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | SUBSTRING '(' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_substr($3,$5);
+++ $$= new (thd->mem_root) Item_func_substr($3,$5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | SUBSTRING '(' expr FROM expr FOR_SYM expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_substr($3,$5,$7);
+++ $$= new (thd->mem_root) Item_func_substr($3,$5,$7);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | SUBSTRING '(' expr FROM expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_substr($3,$5);
+++ $$= new (thd->mem_root) Item_func_substr($3,$5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7775,9 +7749,9 @@ function_call_nonkeyword:
++ */
++ Lex->set_stmt_unsafe();
++ if (global_system_variables.sysdate_is_now == 0)
++- $$= new (YYTHD->mem_root) Item_func_sysdate_local();
+++ $$= new (thd->mem_root) Item_func_sysdate_local();
++ else
++- $$= new (YYTHD->mem_root) Item_func_now_local();
+++ $$= new (thd->mem_root) Item_func_now_local();
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->safe_to_cache_query=0;
++@@ -7785,42 +7759,42 @@ function_call_nonkeyword:
++ | SYSDATE '(' expr ')'
++ {
++ if (global_system_variables.sysdate_is_now == 0)
++- $$= new (YYTHD->mem_root) Item_func_sysdate_local($3);
+++ $$= new (thd->mem_root) Item_func_sysdate_local($3);
++ else
++- $$= new (YYTHD->mem_root) Item_func_now_local($3);
+++ $$= new (thd->mem_root) Item_func_now_local($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->safe_to_cache_query=0;
++ }
++ | TIMESTAMP_ADD '(' interval_time_stamp ',' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_date_add_interval($7,$5,$3,0);
+++ $$= new (thd->mem_root) Item_date_add_interval($7,$5,$3,0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TIMESTAMP_DIFF '(' interval_time_stamp ',' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_timestamp_diff($5,$7,$3);
+++ $$= new (thd->mem_root) Item_func_timestamp_diff($5,$7,$3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | UTC_DATE_SYM optional_braces
++ {
++- $$= new (YYTHD->mem_root) Item_func_curdate_utc();
+++ $$= new (thd->mem_root) Item_func_curdate_utc();
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->safe_to_cache_query=0;
++ }
++ | UTC_TIME_SYM optional_braces
++ {
++- $$= new (YYTHD->mem_root) Item_func_curtime_utc();
+++ $$= new (thd->mem_root) Item_func_curtime_utc();
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->safe_to_cache_query=0;
++ }
++ | UTC_TIMESTAMP_SYM optional_braces
++ {
++- $$= new (YYTHD->mem_root) Item_func_now_utc();
+++ $$= new (thd->mem_root) Item_func_now_utc();
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->safe_to_cache_query=0;
++@@ -7835,62 +7809,61 @@ function_call_nonkeyword:
++ function_call_conflict:
++ ASCII_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_ascii($3);
+++ $$= new (thd->mem_root) Item_func_ascii($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | CHARSET '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_charset($3);
+++ $$= new (thd->mem_root) Item_func_charset($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | COALESCE '(' expr_list ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_coalesce(* $3);
+++ $$= new (thd->mem_root) Item_func_coalesce(* $3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | COLLATION_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_collation($3);
+++ $$= new (thd->mem_root) Item_func_collation($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | DATABASE '(' ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_database();
+++ $$= new (thd->mem_root) Item_func_database();
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ Lex->safe_to_cache_query=0;
++ }
++ | IF '(' expr ',' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_if($3,$5,$7);
+++ $$= new (thd->mem_root) Item_func_if($3,$5,$7);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | MICROSECOND_SYM '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_microsecond($3);
+++ $$= new (thd->mem_root) Item_func_microsecond($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | MOD_SYM '(' expr ',' expr ')'
++ {
++- $$ = new (YYTHD->mem_root) Item_func_mod($3, $5);
+++ $$ = new (thd->mem_root) Item_func_mod($3, $5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | OLD_PASSWORD '(' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_old_password($3);
+++ $$= new (thd->mem_root) Item_func_old_password($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | PASSWORD '(' expr ')'
++ {
++- THD *thd= YYTHD;
++ Item* i1;
++ if (thd->variables.old_passwords)
++ i1= new (thd->mem_root) Item_func_old_password($3);
++@@ -7902,31 +7875,30 @@ function_call_conflict:
++ }
++ | QUARTER_SYM '(' expr ')'
++ {
++- $$ = new (YYTHD->mem_root) Item_func_quarter($3);
+++ $$ = new (thd->mem_root) Item_func_quarter($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | REPEAT_SYM '(' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_repeat($3,$5);
+++ $$= new (thd->mem_root) Item_func_repeat($3,$5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | REPLACE '(' expr ',' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_replace($3,$5,$7);
+++ $$= new (thd->mem_root) Item_func_replace($3,$5,$7);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TRUNCATE_SYM '(' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_round($3,$5,1);
+++ $$= new (thd->mem_root) Item_func_round($3,$5,1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | WEEK_SYM '(' expr ')'
++ {
++- THD *thd= YYTHD;
++ Item *i1= new (thd->mem_root) Item_int((char*) "0",
++ thd->variables.default_week_format,
++ 1);
++@@ -7938,7 +7910,7 @@ function_call_conflict:
++ }
++ | WEEK_SYM '(' expr ',' expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_func_week($3,$5);
+++ $$= new (thd->mem_root) Item_func_week($3,$5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -7960,52 +7932,52 @@ function_call_conflict:
++ geometry_function:
++ CONTAINS_SYM '(' expr ',' expr ')'
++ {
++- $$= GEOM_NEW(YYTHD,
+++ $$= GEOM_NEW(thd,
++ Item_func_spatial_rel($3, $5,
++ Item_func::SP_CONTAINS_FUNC));
++ }
++ | GEOMETRYCOLLECTION '(' expr_list ')'
++ {
++- $$= GEOM_NEW(YYTHD,
+++ $$= GEOM_NEW(thd,
++ Item_func_spatial_collection(* $3,
++ Geometry::wkb_geometrycollection,
++ Geometry::wkb_point));
++ }
++ | LINESTRING '(' expr_list ')'
++ {
++- $$= GEOM_NEW(YYTHD,
+++ $$= GEOM_NEW(thd,
++ Item_func_spatial_collection(* $3,
++ Geometry::wkb_linestring,
++ Geometry::wkb_point));
++ }
++ | MULTILINESTRING '(' expr_list ')'
++ {
++- $$= GEOM_NEW(YYTHD,
+++ $$= GEOM_NEW(thd,
++ Item_func_spatial_collection(* $3,
++ Geometry::wkb_multilinestring,
++ Geometry::wkb_linestring));
++ }
++ | MULTIPOINT '(' expr_list ')'
++ {
++- $$= GEOM_NEW(YYTHD,
+++ $$= GEOM_NEW(thd,
++ Item_func_spatial_collection(* $3,
++ Geometry::wkb_multipoint,
++ Geometry::wkb_point));
++ }
++ | MULTIPOLYGON '(' expr_list ')'
++ {
++- $$= GEOM_NEW(YYTHD,
+++ $$= GEOM_NEW(thd,
++ Item_func_spatial_collection(* $3,
++ Geometry::wkb_multipolygon,
++ Geometry::wkb_polygon));
++ }
++ | POINT_SYM '(' expr ',' expr ')'
++ {
++- $$= GEOM_NEW(YYTHD, Item_func_point($3,$5));
+++ $$= GEOM_NEW(thd, Item_func_point($3,$5));
++ }
++ | POLYGON '(' expr_list ')'
++ {
++- $$= GEOM_NEW(YYTHD,
+++ $$= GEOM_NEW(thd,
++ Item_func_spatial_collection(* $3,
++ Geometry::wkb_polygon,
++ Geometry::wkb_linestring));
++@@ -8043,7 +8015,6 @@ function_call_generic:
++ }
++ opt_udf_expr_list ')'
++ {
++- THD *thd= YYTHD;
++ Create_func *builder;
++ Item *item= NULL;
++
++@@ -8097,7 +8068,6 @@ function_call_generic:
++ }
++ | ident '.' ident '(' opt_expr_list ')'
++ {
++- THD *thd= YYTHD;
++ Create_qfunc *builder;
++ Item *item= NULL;
++
++@@ -8161,7 +8131,7 @@ opt_udf_expr_list:
++ udf_expr_list:
++ udf_expr
++ {
++- $$= new (YYTHD->mem_root) List<Item>;
+++ $$= new (thd->mem_root) List<Item>;
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ $$->push_back($1);
++@@ -8194,7 +8164,7 @@ udf_expr:
++ remember_name we may get quoted or escaped names.
++ */
++ else if ($2->type() != Item::FIELD_ITEM)
++- $2->set_name($1, (uint) ($3 - $1), YYTHD->charset());
+++ $2->set_name($1, (uint) ($3 - $1), thd->charset());
++ $$= $2;
++ }
++ ;
++@@ -8202,46 +8172,46 @@ udf_expr:
++ sum_expr:
++ AVG_SYM '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_avg($3);
+++ $$= new (thd->mem_root) Item_sum_avg($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | AVG_SYM '(' DISTINCT in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_avg_distinct($4);
+++ $$= new (thd->mem_root) Item_sum_avg_distinct($4);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | BIT_AND '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_and($3);
+++ $$= new (thd->mem_root) Item_sum_and($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | BIT_OR '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_or($3);
+++ $$= new (thd->mem_root) Item_sum_or($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | BIT_XOR '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_xor($3);
+++ $$= new (thd->mem_root) Item_sum_xor($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | COUNT_SYM '(' opt_all '*' ')'
++ {
++- Item *item= new (YYTHD->mem_root) Item_int((int32) 0L,1);
+++ Item *item= new (thd->mem_root) Item_int((int32) 0L,1);
++ if (item == NULL)
++ MYSQL_YYABORT;
++- $$= new (YYTHD->mem_root) Item_sum_count(item);
+++ $$= new (thd->mem_root) Item_sum_count(item);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | COUNT_SYM '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_count($3);
+++ $$= new (thd->mem_root) Item_sum_count($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -8251,13 +8221,13 @@ sum_expr:
++ { Select->in_sum_expr--; }
++ ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_count_distinct(* $5);
+++ $$= new (thd->mem_root) Item_sum_count_distinct(* $5);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | MIN_SYM '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_min($3);
+++ $$= new (thd->mem_root) Item_sum_min($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -8268,55 +8238,55 @@ sum_expr:
++ */
++ | MIN_SYM '(' DISTINCT in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_min($4);
+++ $$= new (thd->mem_root) Item_sum_min($4);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | MAX_SYM '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_max($3);
+++ $$= new (thd->mem_root) Item_sum_max($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | MAX_SYM '(' DISTINCT in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_max($4);
+++ $$= new (thd->mem_root) Item_sum_max($4);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | STD_SYM '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_std($3, 0);
+++ $$= new (thd->mem_root) Item_sum_std($3, 0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | VARIANCE_SYM '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_variance($3, 0);
+++ $$= new (thd->mem_root) Item_sum_variance($3, 0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | STDDEV_SAMP_SYM '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_std($3, 1);
+++ $$= new (thd->mem_root) Item_sum_std($3, 1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | VAR_SAMP_SYM '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_variance($3, 1);
+++ $$= new (thd->mem_root) Item_sum_variance($3, 1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | SUM_SYM '(' in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_sum($3);
+++ $$= new (thd->mem_root) Item_sum_sum($3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | SUM_SYM '(' DISTINCT in_sum_expr ')'
++ {
++- $$= new (YYTHD->mem_root) Item_sum_sum_distinct($4);
+++ $$= new (thd->mem_root) Item_sum_sum_distinct($4);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -8328,7 +8298,7 @@ sum_expr:
++ {
++ SELECT_LEX *sel= Select;
++ sel->in_sum_expr--;
++- $$= new (YYTHD->mem_root)
+++ $$= new (thd->mem_root)
++ Item_func_group_concat(Lex->current_context(), $3, $5,
++ sel->gorder_list, $7);
++ if ($$ == NULL)
++@@ -8357,7 +8327,7 @@ variable_aux:
++ ident_or_text SET_VAR expr
++ {
++ Item_func_set_user_var *item;
++- $$= item= new (YYTHD->mem_root) Item_func_set_user_var($1, $3);
+++ $$= item= new (thd->mem_root) Item_func_set_user_var($1, $3);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ LEX *lex= Lex;
++@@ -8366,7 +8336,7 @@ variable_aux:
++ }
++ | ident_or_text
++ {
++- $$= new (YYTHD->mem_root) Item_func_get_user_var($1);
+++ $$= new (thd->mem_root) Item_func_get_user_var($1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ LEX *lex= Lex;
++@@ -8380,7 +8350,7 @@ variable_aux:
++ my_parse_error(ER(ER_SYNTAX_ERROR));
++ MYSQL_YYABORT;
++ }
++- if (!($$= get_system_var(YYTHD, $2, $3, $4)))
+++ if (!($$= get_system_var(thd, $2, $3, $4)))
++ MYSQL_YYABORT;
++ if (!((Item_func_get_system_var*) $$)->is_written_to_binlog())
++ Lex->set_stmt_unsafe();
++@@ -8395,7 +8365,7 @@ opt_distinct:
++ opt_gconcat_separator:
++ /* empty */
++ {
++- $$= new (YYTHD->mem_root) String(",", 1, &my_charset_latin1);
+++ $$= new (thd->mem_root) String(",", 1, &my_charset_latin1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -8422,9 +8392,9 @@ opt_gorder_clause:
++
++ gorder_list:
++ gorder_list ',' order_ident order_dir
++- { if (add_gorder_to_list(YYTHD, $3,(bool) $4)) MYSQL_YYABORT; }
+++ { if (add_gorder_to_list(thd, $3,(bool) $4)) MYSQL_YYABORT; }
++ | order_ident order_dir
++- { if (add_gorder_to_list(YYTHD, $1,(bool) $2)) MYSQL_YYABORT; }
+++ { if (add_gorder_to_list(thd, $1,(bool) $2)) MYSQL_YYABORT; }
++ ;
++
++ in_sum_expr:
++@@ -8477,7 +8447,7 @@ opt_expr_list:
++ expr_list:
++ expr
++ {
++- $$= new (YYTHD->mem_root) List<Item>;
+++ $$= new (thd->mem_root) List<Item>;
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ $$->push_back($1);
++@@ -8497,7 +8467,7 @@ ident_list_arg:
++ ident_list:
++ simple_ident
++ {
++- $$= new (YYTHD->mem_root) List<Item>;
+++ $$= new (thd->mem_root) List<Item>;
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ $$->push_back($1);
++@@ -8595,7 +8565,7 @@ join_table:
++ {
++ MYSQL_YYABORT_UNLESS($1 && $3);
++ /* Change the current name resolution context to a local context. */
++- if (push_new_name_resolution_context(YYTHD, $1, $3))
+++ if (push_new_name_resolution_context(thd, $1, $3))
++ MYSQL_YYABORT;
++ Select->parsing_place= IN_ON;
++ }
++@@ -8610,7 +8580,7 @@ join_table:
++ {
++ MYSQL_YYABORT_UNLESS($1 && $3);
++ /* Change the current name resolution context to a local context. */
++- if (push_new_name_resolution_context(YYTHD, $1, $3))
+++ if (push_new_name_resolution_context(thd, $1, $3))
++ MYSQL_YYABORT;
++ Select->parsing_place= IN_ON;
++ }
++@@ -8640,7 +8610,7 @@ join_table:
++ {
++ MYSQL_YYABORT_UNLESS($1 && $5);
++ /* Change the current name resolution context to a local context. */
++- if (push_new_name_resolution_context(YYTHD, $1, $5))
+++ if (push_new_name_resolution_context(thd, $1, $5))
++ MYSQL_YYABORT;
++ Select->parsing_place= IN_ON;
++ }
++@@ -8676,7 +8646,7 @@ join_table:
++ {
++ MYSQL_YYABORT_UNLESS($1 && $5);
++ /* Change the current name resolution context to a local context. */
++- if (push_new_name_resolution_context(YYTHD, $1, $5))
+++ if (push_new_name_resolution_context(thd, $1, $5))
++ MYSQL_YYABORT;
++ Select->parsing_place= IN_ON;
++ }
++@@ -8724,7 +8694,7 @@ table_factor:
++ }
++ table_ident opt_table_alias opt_key_definition
++ {
++- if (!($$= Select->add_table_to_list(YYTHD, $2, $3,
+++ if (!($$= Select->add_table_to_list(thd, $2, $3,
++ Select->get_table_join_options(),
++ Lex->lock_option,
++ Select->pop_index_hints())))
++@@ -8922,7 +8892,7 @@ index_hints_list:
++
++ opt_index_hints_list:
++ /* empty */
++- | { Select->alloc_index_hints(YYTHD); } index_hints_list
+++ | { Select->alloc_index_hints(thd); } index_hints_list
++ ;
++
++ opt_key_definition:
++@@ -8931,15 +8901,15 @@ opt_key_definition:
++ ;
++
++ opt_key_usage_list:
++- /* empty */ { Select->add_index_hint(YYTHD, NULL, 0); }
+++ /* empty */ { Select->add_index_hint(thd, NULL, 0); }
++ | key_usage_list {}
++ ;
++
++ key_usage_element:
++ ident
++- { Select->add_index_hint(YYTHD, $1.str, $1.length); }
+++ { Select->add_index_hint(thd, $1.str, $1.length); }
++ | PRIMARY_SYM
++- { Select->add_index_hint(YYTHD, (char *)"PRIMARY", 7); }
+++ { Select->add_index_hint(thd, (char *)"PRIMARY", 7); }
++ ;
++
++ key_usage_list:
++@@ -8952,7 +8922,7 @@ using_list:
++ {
++ if (!($$= new List<String>))
++ MYSQL_YYABORT;
++- String *s= new (YYTHD->mem_root) String((const char *) $1.str,
+++ String *s= new (thd->mem_root) String((const char *) $1.str,
++ $1.length,
++ system_charset_info);
++ if (s == NULL)
++@@ -8961,7 +8931,7 @@ using_list:
++ }
++ | using_list ',' ident
++ {
++- String *s= new (YYTHD->mem_root) String((const char *) $3.str,
+++ String *s= new (thd->mem_root) String((const char *) $3.str,
++ $3.length,
++ system_charset_info);
++ if (s == NULL)
++@@ -9002,7 +8972,7 @@ interval_time_stamp:
++ implementation without changing its
++ resolution.
++ */
++- WARN_DEPRECATED(yythd, VER_CELOSIA, "FRAC_SECOND", "MICROSECOND");
+++ WARN_DEPRECATED(thd, VER_CELOSIA, "FRAC_SECOND", "MICROSECOND");
++ }
++ ;
++
++@@ -9086,7 +9056,6 @@ opt_escape:
++ }
++ | /* empty */
++ {
++- THD *thd= YYTHD;
++ Lex->escape_used= FALSE;
++ $$= ((thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) ?
++ new (thd->mem_root) Item_string("", 0, &my_charset_latin1) :
++@@ -9107,9 +9076,9 @@ group_clause:
++
++ group_list:
++ group_list ',' order_ident order_dir
++- { if (add_group_to_list(YYTHD, $3,(bool) $4)) MYSQL_YYABORT; }
+++ { if (add_group_to_list(thd, $3,(bool) $4)) MYSQL_YYABORT; }
++ | order_ident order_dir
++- { if (add_group_to_list(YYTHD, $1,(bool) $2)) MYSQL_YYABORT; }
+++ { if (add_group_to_list(thd, $1,(bool) $2)) MYSQL_YYABORT; }
++ ;
++
++ olap_opt:
++@@ -9156,7 +9125,6 @@ alter_order_list:
++ alter_order_item:
++ simple_ident_nospvar order_dir
++ {
++- THD *thd= YYTHD;
++ bool ascending= ($2 == 1) ? true : false;
++ if (add_order_to_list(thd, $1, ascending))
++ MYSQL_YYABORT;
++@@ -9209,9 +9177,9 @@ order_clause:
++
++ order_list:
++ order_list ',' order_ident order_dir
++- { if (add_order_to_list(YYTHD, $3,(bool) $4)) MYSQL_YYABORT; }
+++ { if (add_order_to_list(thd, $3,(bool) $4)) MYSQL_YYABORT; }
++ | order_ident order_dir
++- { if (add_order_to_list(YYTHD, $1,(bool) $2)) MYSQL_YYABORT; }
+++ { if (add_order_to_list(thd, $1,(bool) $2)) MYSQL_YYABORT; }
++ ;
++
++ order_dir:
++@@ -9271,19 +9239,19 @@ limit_option:
++ }
++ | ULONGLONG_NUM
++ {
++- $$= new (YYTHD->mem_root) Item_uint($1.str, $1.length);
+++ $$= new (thd->mem_root) Item_uint($1.str, $1.length);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | LONG_NUM
++ {
++- $$= new (YYTHD->mem_root) Item_uint($1.str, $1.length);
+++ $$= new (thd->mem_root) Item_uint($1.str, $1.length);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | NUM
++ {
++- $$= new (YYTHD->mem_root) Item_uint($1.str, $1.length);
+++ $$= new (thd->mem_root) Item_uint($1.str, $1.length);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -9365,7 +9333,7 @@ procedure_clause:
++ lex->proc_list.elements=0;
++ lex->proc_list.first=0;
++ lex->proc_list.next= &lex->proc_list.first;
++- Item_field *item= new (YYTHD->mem_root)
+++ Item_field *item= new (thd->mem_root)
++ Item_field(&lex->current_select->context,
++ NULL, NULL, $2.str);
++ if (item == NULL)
++@@ -9390,8 +9358,6 @@ procedure_list2:
++ procedure_item:
++ remember_name expr remember_end
++ {
++- THD *thd= YYTHD;
++-
++ if (add_proc_to_list(thd, $2))
++ MYSQL_YYABORT;
++ if (!$2->name)
++@@ -9560,7 +9526,6 @@ drop:
++ }
++ | DROP FUNCTION_SYM if_exists ident '.' ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ sp_name *spname;
++ if ($4.str && check_db_name(&$4))
++@@ -9583,7 +9548,6 @@ drop:
++ }
++ | DROP FUNCTION_SYM if_exists ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ LEX_STRING db= {0, 0};
++ sp_name *spname;
++@@ -9664,7 +9628,7 @@ table_list:
++ table_name:
++ table_ident
++ {
++- if (!Select->add_table_to_list(YYTHD, $1, NULL, TL_OPTION_UPDATING))
+++ if (!Select->add_table_to_list(thd, $1, NULL, TL_OPTION_UPDATING))
++ MYSQL_YYABORT;
++ }
++ ;
++@@ -9677,7 +9641,7 @@ table_alias_ref_list:
++ table_alias_ref:
++ table_ident_opt_wild
++ {
++- if (!Select->add_table_to_list(YYTHD, $1, NULL,
+++ if (!Select->add_table_to_list(thd, $1, NULL,
++ TL_OPTION_UPDATING | TL_OPTION_ALIAS,
++ Lex->lock_option ))
++ MYSQL_YYABORT;
++@@ -9868,7 +9832,7 @@ expr_or_default:
++ expr { $$= $1;}
++ | DEFAULT
++ {
++- $$= new (YYTHD->mem_root) Item_default_value(Lex->current_context());
+++ $$= new (thd->mem_root) Item_default_value(Lex->current_context());
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -9922,7 +9886,7 @@ update_list:
++ update_elem:
++ simple_ident_nospvar equal expr_or_default
++ {
++- if (add_item_to_list(YYTHD, $1) || add_value_to_list(YYTHD, $3))
+++ if (add_item_to_list(thd, $1) || add_value_to_list(thd, $3))
++ MYSQL_YYABORT;
++ }
++ ;
++@@ -9965,7 +9929,7 @@ delete:
++ single_multi:
++ FROM table_ident
++ {
++- if (!Select->add_table_to_list(YYTHD, $2, NULL, TL_OPTION_UPDATING,
+++ if (!Select->add_table_to_list(thd, $2, NULL, TL_OPTION_UPDATING,
++ Lex->lock_option))
++ MYSQL_YYABORT;
++ }
++@@ -9998,7 +9962,7 @@ table_wild_one:
++ Table_ident *ti= new Table_ident($1);
++ if (ti == NULL)
++ MYSQL_YYABORT;
++- if (!Select->add_table_to_list(YYTHD,
+++ if (!Select->add_table_to_list(thd,
++ ti,
++ $3,
++ TL_OPTION_UPDATING | TL_OPTION_ALIAS,
++@@ -10007,10 +9971,10 @@ table_wild_one:
++ }
++ | ident '.' ident opt_wild opt_table_alias
++ {
++- Table_ident *ti= new Table_ident(YYTHD, $1, $3, 0);
+++ Table_ident *ti= new Table_ident(thd, $1, $3, 0);
++ if (ti == NULL)
++ MYSQL_YYABORT;
++- if (!Select->add_table_to_list(YYTHD,
+++ if (!Select->add_table_to_list(thd,
++ ti,
++ $5,
++ TL_OPTION_UPDATING | TL_OPTION_ALIAS,
++@@ -10130,7 +10094,7 @@ show_param:
++ {
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_DATABASES;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_SCHEMATA))
+++ if (prepare_schema_table(thd, lex, 0, SCH_SCHEMATA))
++ MYSQL_YYABORT;
++ }
++ | opt_full TABLES opt_db wild_and_where
++@@ -10138,7 +10102,7 @@ show_param:
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_TABLES;
++ lex->select_lex.db= $3;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_TABLE_NAMES))
+++ if (prepare_schema_table(thd, lex, 0, SCH_TABLE_NAMES))
++ MYSQL_YYABORT;
++ }
++ | opt_full TRIGGERS_SYM opt_db wild_and_where
++@@ -10146,7 +10110,7 @@ show_param:
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_TRIGGERS;
++ lex->select_lex.db= $3;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_TRIGGERS))
+++ if (prepare_schema_table(thd, lex, 0, SCH_TRIGGERS))
++ MYSQL_YYABORT;
++ }
++ | EVENTS_SYM opt_db wild_and_where
++@@ -10154,7 +10118,7 @@ show_param:
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_EVENTS;
++ lex->select_lex.db= $2;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_EVENTS))
+++ if (prepare_schema_table(thd, lex, 0, SCH_EVENTS))
++ MYSQL_YYABORT;
++ }
++ | TABLE_SYM STATUS_SYM opt_db wild_and_where
++@@ -10162,7 +10126,7 @@ show_param:
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_TABLE_STATUS;
++ lex->select_lex.db= $3;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_TABLES))
+++ if (prepare_schema_table(thd, lex, 0, SCH_TABLES))
++ MYSQL_YYABORT;
++ }
++ | OPEN_SYM TABLES opt_db wild_and_where
++@@ -10170,22 +10134,22 @@ show_param:
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_OPEN_TABLES;
++ lex->select_lex.db= $3;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_OPEN_TABLES))
+++ if (prepare_schema_table(thd, lex, 0, SCH_OPEN_TABLES))
++ MYSQL_YYABORT;
++ }
++ | opt_full PLUGIN_SYM
++ {
++ LEX *lex= Lex;
++- WARN_DEPRECATED(yythd, "6.0", "SHOW PLUGIN", "'SHOW PLUGINS'");
+++ WARN_DEPRECATED(thd, "6.0", "SHOW PLUGIN", "'SHOW PLUGINS'");
++ lex->sql_command= SQLCOM_SHOW_PLUGINS;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_PLUGINS))
+++ if (prepare_schema_table(thd, lex, 0, SCH_PLUGINS))
++ MYSQL_YYABORT;
++ }
++ | PLUGINS_SYM
++ {
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_PLUGINS;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_PLUGINS))
+++ if (prepare_schema_table(thd, lex, 0, SCH_PLUGINS))
++ MYSQL_YYABORT;
++ }
++ | ENGINE_SYM known_storage_engines show_engine_param
++@@ -10198,7 +10162,7 @@ show_param:
++ lex->sql_command= SQLCOM_SHOW_FIELDS;
++ if ($5)
++ $4->change_db($5);
++- if (prepare_schema_table(YYTHD, lex, $4, SCH_COLUMNS))
+++ if (prepare_schema_table(thd, lex, $4, SCH_COLUMNS))
++ MYSQL_YYABORT;
++ }
++ | NEW_SYM MASTER_SYM FOR_SYM SLAVE
++@@ -10233,7 +10197,7 @@ show_param:
++ lex->sql_command= SQLCOM_SHOW_KEYS;
++ if ($4)
++ $3->change_db($4);
++- if (prepare_schema_table(YYTHD, lex, $3, SCH_STATISTICS))
+++ if (prepare_schema_table(thd, lex, $3, SCH_STATISTICS))
++ MYSQL_YYABORT;
++ }
++ | COLUMN_SYM TYPES_SYM
++@@ -10245,15 +10209,15 @@ show_param:
++ {
++ LEX *lex=Lex;
++ lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES;
++- WARN_DEPRECATED(yythd, "6.0", "SHOW TABLE TYPES", "'SHOW [STORAGE] ENGINES'");
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_ENGINES))
+++ WARN_DEPRECATED(thd, "6.0", "SHOW TABLE TYPES", "'SHOW [STORAGE] ENGINES'");
+++ if (prepare_schema_table(thd, lex, 0, SCH_ENGINES))
++ MYSQL_YYABORT;
++ }
++ | opt_storage ENGINES_SYM
++ {
++ LEX *lex=Lex;
++ lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_ENGINES))
+++ if (prepare_schema_table(thd, lex, 0, SCH_ENGINES))
++ MYSQL_YYABORT;
++ }
++ | AUTHORS_SYM
++@@ -10285,7 +10249,7 @@ show_param:
++ {
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_PROFILE;
++- if (prepare_schema_table(YYTHD, lex, NULL, SCH_PROFILES) != 0)
+++ if (prepare_schema_table(thd, lex, NULL, SCH_PROFILES) != 0)
++ YYABORT;
++ }
++ | opt_var_type STATUS_SYM wild_and_where
++@@ -10293,7 +10257,7 @@ show_param:
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_STATUS;
++ lex->option_type= $1;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_STATUS))
+++ if (prepare_schema_table(thd, lex, 0, SCH_STATUS))
++ MYSQL_YYABORT;
++ }
++ | INNOBASE_SYM STATUS_SYM
++@@ -10301,24 +10265,24 @@ show_param:
++ LEX *lex= Lex;
++ lex->sql_command = SQLCOM_SHOW_ENGINE_STATUS;
++ if (!(lex->create_info.db_type=
++- ha_resolve_by_legacy_type(YYTHD, DB_TYPE_INNODB)))
+++ ha_resolve_by_legacy_type(thd, DB_TYPE_INNODB)))
++ {
++ my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), "InnoDB");
++ MYSQL_YYABORT;
++ }
++- WARN_DEPRECATED(yythd, "6.0", "SHOW INNODB STATUS", "'SHOW ENGINE INNODB STATUS'");
+++ WARN_DEPRECATED(thd, "6.0", "SHOW INNODB STATUS", "'SHOW ENGINE INNODB STATUS'");
++ }
++ | MUTEX_SYM STATUS_SYM
++ {
++ LEX *lex= Lex;
++ lex->sql_command = SQLCOM_SHOW_ENGINE_MUTEX;
++ if (!(lex->create_info.db_type=
++- ha_resolve_by_legacy_type(YYTHD, DB_TYPE_INNODB)))
+++ ha_resolve_by_legacy_type(thd, DB_TYPE_INNODB)))
++ {
++ my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), "InnoDB");
++ MYSQL_YYABORT;
++ }
++- WARN_DEPRECATED(yythd, "6.0", "SHOW MUTEX STATUS", "'SHOW ENGINE INNODB MUTEX'");
+++ WARN_DEPRECATED(thd, "6.0", "SHOW MUTEX STATUS", "'SHOW ENGINE INNODB MUTEX'");
++ }
++ | opt_full PROCESSLIST_SYM
++ { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;}
++@@ -10327,21 +10291,21 @@ show_param:
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_VARIABLES;
++ lex->option_type= $1;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_VARIABLES))
+++ if (prepare_schema_table(thd, lex, 0, SCH_VARIABLES))
++ MYSQL_YYABORT;
++ }
++ | charset wild_and_where
++ {
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_CHARSETS;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_CHARSETS))
+++ if (prepare_schema_table(thd, lex, 0, SCH_CHARSETS))
++ MYSQL_YYABORT;
++ }
++ | COLLATION_SYM wild_and_where
++ {
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_COLLATIONS;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_COLLATIONS))
+++ if (prepare_schema_table(thd, lex, 0, SCH_COLLATIONS))
++ MYSQL_YYABORT;
++ }
++ | GRANTS
++@@ -10371,7 +10335,7 @@ show_param:
++ {
++ LEX *lex= Lex;
++ lex->sql_command = SQLCOM_SHOW_CREATE;
++- if (!lex->select_lex.add_table_to_list(YYTHD, $3, NULL,0))
+++ if (!lex->select_lex.add_table_to_list(thd, $3, NULL,0))
++ MYSQL_YYABORT;
++ lex->only_view= 0;
++ lex->create_info.storage_media= HA_SM_DEFAULT;
++@@ -10380,7 +10344,7 @@ show_param:
++ {
++ LEX *lex= Lex;
++ lex->sql_command = SQLCOM_SHOW_CREATE;
++- if (!lex->select_lex.add_table_to_list(YYTHD, $3, NULL, 0))
+++ if (!lex->select_lex.add_table_to_list(thd, $3, NULL, 0))
++ MYSQL_YYABORT;
++ lex->only_view= 1;
++ }
++@@ -10416,14 +10380,14 @@ show_param:
++ {
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_STATUS_PROC;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES))
+++ if (prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))
++ MYSQL_YYABORT;
++ }
++ | FUNCTION_SYM STATUS_SYM wild_and_where
++ {
++ LEX *lex= Lex;
++ lex->sql_command= SQLCOM_SHOW_STATUS_FUNC;
++- if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES))
+++ if (prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))
++ MYSQL_YYABORT;
++ }
++ | PROCEDURE CODE_SYM sp_name
++@@ -10501,7 +10465,7 @@ wild_and_where:
++ /* empty */
++ | LIKE TEXT_STRING_sys
++ {
++- Lex->wild= new (YYTHD->mem_root) String($2.str, $2.length,
+++ Lex->wild= new (thd->mem_root) String($2.str, $2.length,
++ system_charset_info);
++ if (Lex->wild == NULL)
++ MYSQL_YYABORT;
++@@ -10525,7 +10489,7 @@ describe:
++ lex->sql_command= SQLCOM_SHOW_FIELDS;
++ lex->select_lex.db= 0;
++ lex->verbose= 0;
++- if (prepare_schema_table(YYTHD, lex, $2, SCH_COLUMNS))
+++ if (prepare_schema_table(thd, lex, $2, SCH_COLUMNS))
++ MYSQL_YYABORT;
++ }
++ opt_describe_column {}
++@@ -10554,7 +10518,7 @@ opt_describe_column:
++ | text_string { Lex->wild= $1; }
++ | ident
++ {
++- Lex->wild= new (YYTHD->mem_root) String((const char*) $1.str,
+++ Lex->wild= new (thd->mem_root) String((const char*) $1.str,
++ $1.length,
++ system_charset_info);
++ if (Lex->wild == NULL)
++@@ -10697,7 +10661,6 @@ use:
++ load:
++ LOAD DATA_SYM
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++
++ if (lex->sphead)
++@@ -10711,7 +10674,7 @@ load:
++ | LOAD TABLE_SYM table_ident FROM MASTER_SYM
++ {
++ LEX *lex=Lex;
++- WARN_DEPRECATED(yythd, "6.0", "LOAD TABLE FROM MASTER",
+++ WARN_DEPRECATED(thd, "6.0", "LOAD TABLE FROM MASTER",
++ "MySQL Administrator (mysqldump, mysql)");
++ if (lex->sphead)
++ {
++@@ -10719,7 +10682,7 @@ load:
++ MYSQL_YYABORT;
++ }
++ lex->sql_command = SQLCOM_LOAD_MASTER_TABLE;
++- if (!Select->add_table_to_list(YYTHD, $3, NULL, TL_OPTION_UPDATING))
+++ if (!Select->add_table_to_list(thd, $3, NULL, TL_OPTION_UPDATING))
++ MYSQL_YYABORT;
++ }
++ ;
++@@ -10739,7 +10702,7 @@ load_data:
++ opt_duplicate INTO TABLE_SYM table_ident
++ {
++ LEX *lex=Lex;
++- if (!Select->add_table_to_list(YYTHD, $9, NULL, TL_OPTION_UPDATING,
+++ if (!Select->add_table_to_list(thd, $9, NULL, TL_OPTION_UPDATING,
++ lex->lock_option))
++ MYSQL_YYABORT;
++ lex->field_list.empty();
++@@ -10754,7 +10717,7 @@ load_data:
++ | FROM MASTER_SYM
++ {
++ Lex->sql_command = SQLCOM_LOAD_MASTER_DATA;
++- WARN_DEPRECATED(yythd, "6.0", "LOAD DATA FROM MASTER",
+++ WARN_DEPRECATED(thd, "6.0", "LOAD DATA FROM MASTER",
++ "mysqldump or future "
++ "BACKUP/RESTORE DATABASE facility");
++ }
++@@ -10872,7 +10835,7 @@ field_or_var:
++ simple_ident_nospvar {$$= $1;}
++ | '@' ident_or_text
++ {
++- $$= new (YYTHD->mem_root) Item_user_var_as_out_param($2);
+++ $$= new (thd->mem_root) Item_user_var_as_out_param($2);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -10889,7 +10852,6 @@ text_literal:
++ TEXT_STRING
++ {
++ LEX_STRING tmp;
++- THD *thd= YYTHD;
++ CHARSET_INFO *cs_con= thd->variables.collation_connection;
++ CHARSET_INFO *cs_cli= thd->variables.character_set_client;
++ uint repertoire= thd->lex->text_string_is_7bit &&
++@@ -10915,7 +10877,7 @@ text_literal:
++ uint repertoire= Lex->text_string_is_7bit ?
++ MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30;
++ DBUG_ASSERT(my_charset_is_ascii_based(national_charset_info));
++- $$= new (YYTHD->mem_root) Item_string($1.str, $1.length,
+++ $$= new (thd->mem_root) Item_string($1.str, $1.length,
++ national_charset_info,
++ DERIVATION_COERCIBLE,
++ repertoire);
++@@ -10924,7 +10886,7 @@ text_literal:
++ }
++ | UNDERSCORE_CHARSET TEXT_STRING
++ {
++- Item_string *str= new (YYTHD->mem_root) Item_string($2.str,
+++ Item_string *str= new (thd->mem_root) Item_string($2.str,
++ $2.length, $1);
++ if (str == NULL)
++ MYSQL_YYABORT;
++@@ -10943,7 +10905,7 @@ text_literal:
++ If the string has been pure ASCII so far,
++ check the new part.
++ */
++- CHARSET_INFO *cs= YYTHD->variables.collation_connection;
+++ CHARSET_INFO *cs= thd->variables.collation_connection;
++ item->collation.repertoire|= my_string_repertoire(cs,
++ $2.str,
++ $2.length);
++@@ -10954,15 +10916,15 @@ text_literal:
++ text_string:
++ TEXT_STRING_literal
++ {
++- $$= new (YYTHD->mem_root) String($1.str,
+++ $$= new (thd->mem_root) String($1.str,
++ $1.length,
++- YYTHD->variables.collation_connection);
+++ thd->variables.collation_connection);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | HEX_NUM
++ {
++- Item *tmp= new (YYTHD->mem_root) Item_hex_string($1.str, $1.length);
+++ Item *tmp= new (thd->mem_root) Item_hex_string($1.str, $1.length);
++ if (tmp == NULL)
++ MYSQL_YYABORT;
++ /*
++@@ -10974,7 +10936,7 @@ text_string:
++ }
++ | BIN_NUM
++ {
++- Item *tmp= new (YYTHD->mem_root) Item_bin_string($1.str, $1.length);
+++ Item *tmp= new (thd->mem_root) Item_bin_string($1.str, $1.length);
++ if (tmp == NULL)
++ MYSQL_YYABORT;
++ /*
++@@ -10989,7 +10951,6 @@ text_string:
++ param_marker:
++ PARAM_MARKER
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ Lex_input_stream *lip= YYLIP;
++ Item_param *item;
++@@ -11022,38 +10983,38 @@ literal:
++ | NUM_literal { $$ = $1; }
++ | NULL_SYM
++ {
++- $$ = new (YYTHD->mem_root) Item_null();
+++ $$ = new (thd->mem_root) Item_null();
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ YYLIP->next_state= MY_LEX_OPERATOR_OR_IDENT;
++ }
++ | FALSE_SYM
++ {
++- $$= new (YYTHD->mem_root) Item_int((char*) "FALSE",0,1);
+++ $$= new (thd->mem_root) Item_int((char*) "FALSE",0,1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | TRUE_SYM
++ {
++- $$= new (YYTHD->mem_root) Item_int((char*) "TRUE",1,1);
+++ $$= new (thd->mem_root) Item_int((char*) "TRUE",1,1);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | HEX_NUM
++ {
++- $$ = new (YYTHD->mem_root) Item_hex_string($1.str, $1.length);
+++ $$ = new (thd->mem_root) Item_hex_string($1.str, $1.length);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | BIN_NUM
++ {
++- $$= new (YYTHD->mem_root) Item_bin_string($1.str, $1.length);
+++ $$= new (thd->mem_root) Item_bin_string($1.str, $1.length);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | UNDERSCORE_CHARSET HEX_NUM
++ {
++- Item *tmp= new (YYTHD->mem_root) Item_hex_string($2.str, $2.length);
+++ Item *tmp= new (thd->mem_root) Item_hex_string($2.str, $2.length);
++ if (tmp == NULL)
++ MYSQL_YYABORT;
++ /*
++@@ -11064,7 +11025,7 @@ literal:
++ String *str= tmp->val_str((String*) 0);
++
++ Item_string *item_str;
++- item_str= new (YYTHD->mem_root)
+++ item_str= new (thd->mem_root)
++ Item_string(NULL, /* name will be set in select_item */
++ str ? str->ptr() : "",
++ str ? str->length() : 0,
++@@ -11082,7 +11043,7 @@ literal:
++ }
++ | UNDERSCORE_CHARSET BIN_NUM
++ {
++- Item *tmp= new (YYTHD->mem_root) Item_bin_string($2.str, $2.length);
+++ Item *tmp= new (thd->mem_root) Item_bin_string($2.str, $2.length);
++ if (tmp == NULL)
++ MYSQL_YYABORT;
++ /*
++@@ -11093,7 +11054,7 @@ literal:
++ String *str= tmp->val_str((String*) 0);
++
++ Item_string *item_str;
++- item_str= new (YYTHD->mem_root)
+++ item_str= new (thd->mem_root)
++ Item_string(NULL, /* name will be set in select_item */
++ str ? str->ptr() : "",
++ str ? str->length() : 0,
++@@ -11117,7 +11078,7 @@ NUM_literal:
++ NUM
++ {
++ int error;
++- $$= new (YYTHD->mem_root)
+++ $$= new (thd->mem_root)
++ Item_int($1.str,
++ (longlong) my_strtoll10($1.str, NULL, &error),
++ $1.length);
++@@ -11127,7 +11088,7 @@ NUM_literal:
++ | LONG_NUM
++ {
++ int error;
++- $$= new (YYTHD->mem_root)
+++ $$= new (thd->mem_root)
++ Item_int($1.str,
++ (longlong) my_strtoll10($1.str, NULL, &error),
++ $1.length);
++@@ -11136,23 +11097,23 @@ NUM_literal:
++ }
++ | ULONGLONG_NUM
++ {
++- $$= new (YYTHD->mem_root) Item_uint($1.str, $1.length);
+++ $$= new (thd->mem_root) Item_uint($1.str, $1.length);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | DECIMAL_NUM
++ {
++- $$= new (YYTHD->mem_root) Item_decimal($1.str, $1.length,
++- YYTHD->charset());
++- if (($$ == NULL) || (YYTHD->is_error()))
+++ $$= new (thd->mem_root) Item_decimal($1.str, $1.length,
+++ thd->charset());
+++ if (($$ == NULL) || (thd->is_error()))
++ {
++ MYSQL_YYABORT;
++ }
++ }
++ | FLOAT_NUM
++ {
++- $$= new (YYTHD->mem_root) Item_float($1.str, $1.length);
++- if (($$ == NULL) || (YYTHD->is_error()))
+++ $$= new (thd->mem_root) Item_float($1.str, $1.length);
+++ if (($$ == NULL) || (thd->is_error()))
++ {
++ MYSQL_YYABORT;
++ }
++@@ -11172,7 +11133,7 @@ table_wild:
++ ident '.' '*'
++ {
++ SELECT_LEX *sel= Select;
++- $$= new (YYTHD->mem_root) Item_field(Lex->current_context(),
+++ $$= new (thd->mem_root) Item_field(Lex->current_context(),
++ NullS, $1.str, "*");
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++@@ -11180,7 +11141,6 @@ table_wild:
++ }
++ | ident '.' ident '.' '*'
++ {
++- THD *thd= YYTHD;
++ SELECT_LEX *sel= Select;
++ const char* schema= thd->client_capabilities & CLIENT_NO_SCHEMA ?
++ NullS : $1.str;
++@@ -11200,7 +11160,6 @@ order_ident:
++ simple_ident:
++ ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ Lex_input_stream *lip= YYLIP;
++ sp_variable_t *spv;
++@@ -11251,7 +11210,6 @@ simple_ident:
++ simple_ident_nospvar:
++ ident
++ {
++- THD *thd= YYTHD;
++ SELECT_LEX *sel=Select;
++ if ((sel->parsing_place != IN_HAVING) ||
++ (sel->get_in_sum_expr() > 0))
++@@ -11273,7 +11231,6 @@ simple_ident_nospvar:
++ simple_ident_q:
++ ident '.' ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++
++ /*
++@@ -11352,7 +11309,6 @@ simple_ident_q:
++ }
++ | '.' ident '.' ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ SELECT_LEX *sel= lex->current_select;
++ if (sel->no_table_names_allowed)
++@@ -11377,7 +11333,6 @@ simple_ident_q:
++ }
++ | ident '.' ident '.' ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ SELECT_LEX *sel= lex->current_select;
++ const char* schema= (thd->client_capabilities & CLIENT_NO_SCHEMA ?
++@@ -11445,7 +11400,7 @@ table_ident:
++ }
++ | ident '.' ident
++ {
++- $$= new Table_ident(YYTHD, $1,$3,0);
+++ $$= new Table_ident(thd, $1,$3,0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -11467,7 +11422,7 @@ table_ident_opt_wild:
++ }
++ | ident '.' ident opt_wild
++ {
++- $$= new Table_ident(YYTHD, $1,$3,0);
+++ $$= new Table_ident(thd, $1,$3,0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -11477,7 +11432,7 @@ table_ident_nodb:
++ ident
++ {
++ LEX_STRING db={(char*) any_db,3};
++- $$= new Table_ident(YYTHD, db,$1,0);
+++ $$= new Table_ident(thd, db,$1,0);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -11487,8 +11442,6 @@ IDENT_sys:
++ IDENT { $$= $1; }
++ | IDENT_QUOTED
++ {
++- THD *thd= YYTHD;
++-
++ if (thd->charset_is_system_charset)
++ {
++ CHARSET_INFO *cs= system_charset_info;
++@@ -11516,8 +11469,6 @@ IDENT_sys:
++ TEXT_STRING_sys:
++ TEXT_STRING
++ {
++- THD *thd= YYTHD;
++-
++ if (thd->charset_is_system_charset)
++ $$= $1;
++ else
++@@ -11532,8 +11483,6 @@ TEXT_STRING_sys:
++ TEXT_STRING_literal:
++ TEXT_STRING
++ {
++- THD *thd= YYTHD;
++-
++ if (thd->charset_is_collation_connection)
++ $$= $1;
++ else
++@@ -11548,8 +11497,6 @@ TEXT_STRING_literal:
++ TEXT_STRING_filesystem:
++ TEXT_STRING
++ {
++- THD *thd= YYTHD;
++-
++ if (thd->charset_is_character_set_filesystem)
++ $$= $1;
++ else
++@@ -11566,7 +11513,6 @@ ident:
++ IDENT_sys { $$=$1; }
++ | keyword
++ {
++- THD *thd= YYTHD;
++ $$.str= thd->strmake($1.str, $1.length);
++ if ($$.str == NULL)
++ MYSQL_YYABORT;
++@@ -11578,7 +11524,6 @@ label_ident:
++ IDENT_sys { $$=$1; }
++ | keyword_sp
++ {
++- THD *thd= YYTHD;
++ $$.str= thd->strmake($1.str, $1.length);
++ if ($$.str == NULL)
++ MYSQL_YYABORT;
++@@ -11595,7 +11540,6 @@ ident_or_text:
++ user:
++ ident_or_text
++ {
++- THD *thd= YYTHD;
++ if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user))))
++ MYSQL_YYABORT;
++ $$->user = $1;
++@@ -11609,7 +11553,6 @@ user:
++ }
++ | ident_or_text '@' ident_or_text
++ {
++- THD *thd= YYTHD;
++ if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user))))
++ MYSQL_YYABORT;
++ $$->user = $1; $$->host=$3;
++@@ -11628,7 +11571,7 @@ user:
++ }
++ | CURRENT_USER optional_braces
++ {
++- if (!($$=(LEX_USER*) YYTHD->alloc(sizeof(st_lex_user))))
+++ if (!($$=(LEX_USER*) thd->alloc(sizeof(st_lex_user))))
++ MYSQL_YYABORT;
++ /*
++ empty LEX_USER means current_user and
++@@ -11991,7 +11934,6 @@ option_value_list:
++
++ option_type_value:
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ Lex_input_stream *lip= YYLIP;
++
++@@ -12022,7 +11964,6 @@ option_type_value:
++ }
++ ext_option_value
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ Lex_input_stream *lip= YYLIP;
++
++@@ -12105,7 +12046,6 @@ ext_option_value:
++ sys_option_value:
++ option_type internal_variable_name equal set_expr_or_default
++ {
++- THD *thd= YYTHD;
++ LEX *lex= Lex;
++ LEX_STRING *name= &$2.base_name;
++
++@@ -12117,7 +12057,7 @@ sys_option_value:
++ my_parse_error(ER(ER_SYNTAX_ERROR));
++ MYSQL_YYABORT;
++ }
++- if (set_trigger_new_row(YYTHD, name, $4))
+++ if (set_trigger_new_row(thd, name, $4))
++ MYSQL_YYABORT;
++ }
++ else if ($2.var)
++@@ -12147,7 +12087,6 @@ sys_option_value:
++ }
++ | option_type TRANSACTION_SYM ISOLATION LEVEL_SYM isolation_types
++ {
++- THD *thd= YYTHD;
++ LEX *lex=Lex;
++ lex->option_type= $1;
++ Item *item= new (thd->mem_root) Item_int((int32) $5);
++@@ -12167,7 +12106,7 @@ option_value:
++ '@' ident_or_text equal expr
++ {
++ Item_func_set_user_var *item;
++- item= new (YYTHD->mem_root) Item_func_set_user_var($2, $4);
+++ item= new (thd->mem_root) Item_func_set_user_var($2, $4);
++ if (item == NULL)
++ MYSQL_YYABORT;
++ set_var_user *var= new set_var_user(item);
++@@ -12177,7 +12116,6 @@ option_value:
++ }
++ | '@' '@' opt_var_ident_type internal_variable_name equal set_expr_or_default
++ {
++- THD *thd= YYTHD;
++ struct sys_var_with_base tmp= $4;
++ /* Lookup if necessary: must be a system variable. */
++ if (tmp.var == NULL)
++@@ -12190,7 +12128,6 @@ option_value:
++ }
++ | charset old_or_new_charset_name_or_default
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ CHARSET_INFO *cs2;
++ cs2= $2 ? $2: global_system_variables.character_set_client;
++@@ -12238,7 +12175,6 @@ option_value:
++ }
++ | PASSWORD equal text_or_password
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ LEX_USER *user;
++ sp_pcontext *spc= lex->spcont;
++@@ -12278,7 +12214,6 @@ option_value:
++ internal_variable_name:
++ ident
++ {
++- THD *thd= YYTHD;
++ sp_pcontext *spc= thd->lex->spcont;
++ sp_variable_t *spv;
++
++@@ -12337,7 +12272,7 @@ internal_variable_name:
++ }
++ else
++ {
++- sys_var *tmp=find_sys_var(YYTHD, $3.str, $3.length);
+++ sys_var *tmp=find_sys_var(thd, $3.str, $3.length);
++ if (!tmp)
++ MYSQL_YYABORT;
++ if (!tmp->is_struct())
++@@ -12348,7 +12283,7 @@ internal_variable_name:
++ }
++ | DEFAULT '.' ident
++ {
++- sys_var *tmp=find_sys_var(YYTHD, $3.str, $3.length);
+++ sys_var *tmp=find_sys_var(thd, $3.str, $3.length);
++ if (!tmp)
++ MYSQL_YYABORT;
++ if (!tmp->is_struct())
++@@ -12370,16 +12305,16 @@ text_or_password:
++ TEXT_STRING { $$=$1.str;}
++ | PASSWORD '(' TEXT_STRING ')'
++ {
++- $$= $3.length ? YYTHD->variables.old_passwords ?
++- Item_func_old_password::alloc(YYTHD, $3.str, $3.length) :
++- Item_func_password::alloc(YYTHD, $3.str, $3.length) :
+++ $$= $3.length ? thd->variables.old_passwords ?
+++ Item_func_old_password::alloc(thd, $3.str, $3.length) :
+++ Item_func_password::alloc(thd, $3.str, $3.length) :
++ $3.str;
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | OLD_PASSWORD '(' TEXT_STRING ')'
++ {
++- $$= $3.length ? Item_func_old_password::alloc(YYTHD, $3.str,
+++ $$= $3.length ? Item_func_old_password::alloc(thd, $3.str,
++ $3.length) :
++ $3.str;
++ if ($$ == NULL)
++@@ -12393,19 +12328,19 @@ set_expr_or_default:
++ | DEFAULT { $$=0; }
++ | ON
++ {
++- $$=new (YYTHD->mem_root) Item_string("ON", 2, system_charset_info);
+++ $$=new (thd->mem_root) Item_string("ON", 2, system_charset_info);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | ALL
++ {
++- $$=new (YYTHD->mem_root) Item_string("ALL", 3, system_charset_info);
+++ $$=new (thd->mem_root) Item_string("ALL", 3, system_charset_info);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++ | BINARY
++ {
++- $$=new (YYTHD->mem_root) Item_string("binary", 6, system_charset_info);
+++ $$=new (thd->mem_root) Item_string("binary", 6, system_charset_info);
++ if ($$ == NULL)
++ MYSQL_YYABORT;
++ }
++@@ -12443,7 +12378,7 @@ table_lock:
++ table_ident opt_table_alias lock_option
++ {
++ thr_lock_type lock_type= (thr_lock_type) $3;
++- if (!Select->add_table_to_list(YYTHD, $1, $2, 0, lock_type))
+++ if (!Select->add_table_to_list(thd, $1, $2, 0, lock_type))
++ MYSQL_YYABORT;
++ /* If table is to be write locked, protect from a impending GRL. */
++ if (lock_type >= TL_WRITE_ALLOW_WRITE)
++@@ -12514,7 +12449,7 @@ handler:
++ lex->expr_allows_subselect= FALSE;
++ lex->sql_command = SQLCOM_HA_READ;
++ lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */
++- Item *one= new (YYTHD->mem_root) Item_int((int32) 1);
+++ Item *one= new (thd->mem_root) Item_int((int32) 1);
++ if (one == NULL)
++ MYSQL_YYABORT;
++ lex->current_select->select_limit= one;
++@@ -12836,10 +12771,10 @@ grant_user:
++ $$=$1; $1->password=$4;
++ if ($4.length)
++ {
++- if (YYTHD->variables.old_passwords)
+++ if (thd->variables.old_passwords)
++ {
++ char *buff=
++- (char *) YYTHD->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH_323+1);
+++ (char *) thd->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH_323+1);
++ if (buff == NULL)
++ MYSQL_YYABORT;
++ my_make_scrambled_password_323(buff, $4.str, $4.length);
++@@ -12849,7 +12784,7 @@ grant_user:
++ else
++ {
++ char *buff=
++- (char *) YYTHD->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH+1);
+++ (char *) thd->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH+1);
++ if (buff == NULL)
++ MYSQL_YYABORT;
++ my_make_scrambled_password(buff, $4.str, $4.length);
++@@ -12881,7 +12816,7 @@ column_list:
++ column_list_id:
++ ident
++ {
++- String *new_str = new (YYTHD->mem_root) String((const char*) $1.str,$1.length,system_charset_info);
+++ String *new_str = new (thd->mem_root) String((const char*) $1.str,$1.length,system_charset_info);
++ if (new_str == NULL)
++ MYSQL_YYABORT;
++ List_iterator <LEX_COLUMN> iter(Lex->columns);
++@@ -12981,14 +12916,14 @@ opt_work:
++
++ opt_chain:
++ /* empty */
++- { $$= (YYTHD->variables.completion_type == 1); }
+++ { $$= (thd->variables.completion_type == 1); }
++ | AND_SYM NO_SYM CHAIN_SYM { $$=0; }
++ | AND_SYM CHAIN_SYM { $$=1; }
++ ;
++
++ opt_release:
++ /* empty */
++- { $$= (YYTHD->variables.completion_type == 2); }
+++ { $$= (thd->variables.completion_type == 2); }
++ | RELEASE_SYM { $$=1; }
++ | NO_SYM RELEASE_SYM { $$=0; }
++ ;
++@@ -13102,7 +13037,6 @@ union_opt:
++
++ union_order_or_limit:
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ DBUG_ASSERT(lex->current_select->linkage != GLOBAL_OPTIONS_TYPE);
++ SELECT_LEX *sel= lex->current_select;
++@@ -13118,7 +13052,6 @@ union_order_or_limit:
++ }
++ order_or_limit
++ {
++- THD *thd= YYTHD;
++ thd->lex->current_select->no_table_names_allowed= 0;
++ thd->where= "";
++ }
++@@ -13255,14 +13188,14 @@ no_definer:
++ from older master servers (i.e. to create non-suid trigger in this
++ case).
++ */
++- YYTHD->lex->definer= 0;
+++ thd->lex->definer= 0;
++ }
++ ;
++
++ definer:
++ DEFINER_SYM EQ user
++ {
++- YYTHD->lex->definer= get_current_user(YYTHD, $3);
+++ thd->lex->definer= get_current_user(thd, $3);
++ }
++ ;
++
++@@ -13307,7 +13240,6 @@ view_suid:
++ view_tail:
++ view_suid VIEW_SYM table_ident
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ lex->sql_command= SQLCOM_CREATE_VIEW;
++ /* first table in list is target VIEW name */
++@@ -13347,7 +13279,6 @@ view_select:
++ }
++ view_select_aux view_check_option
++ {
++- THD *thd= YYTHD;
++ LEX *lex= Lex;
++ uint len= YYLIP->get_cpp_ptr() - lex->create_view_select.str;
++ void *create_view_select= thd->memdup(lex->create_view_select.str, len);
++@@ -13403,7 +13334,6 @@ trigger_tail:
++ EACH_SYM
++ ROW_SYM
++ { /* $15 */
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ Lex_input_stream *lip= YYLIP;
++ sp_head *sp;
++@@ -13437,8 +13367,8 @@ trigger_tail:
++ sp_head *sp= lex->sphead;
++
++ lex->sql_command= SQLCOM_CREATE_TRIGGER;
++- sp->set_stmt_end(YYTHD);
++- sp->restore_thd_mem_root(YYTHD);
+++ sp->set_stmt_end(thd);
+++ sp->restore_thd_mem_root(thd);
++
++ if (sp->is_not_allowed_in_function("trigger"))
++ MYSQL_YYABORT;
++@@ -13448,7 +13378,7 @@ trigger_tail:
++ sp_proc_stmt alternatives are not saving/restoring LEX, so
++ lex->query_tables can be wiped out.
++ */
++- if (!lex->select_lex.add_table_to_list(YYTHD, $9,
+++ if (!lex->select_lex.add_table_to_list(thd, $9,
++ (LEX_STRING*) 0,
++ TL_OPTION_UPDATING,
++ TL_IGNORE))
++@@ -13466,7 +13396,6 @@ udf_tail:
++ AGGREGATE_SYM remember_name FUNCTION_SYM ident
++ RETURNS_SYM udf_type SONAME_SYM TEXT_STRING_sys
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ if (is_native_function(thd, & $4))
++ {
++@@ -13484,7 +13413,6 @@ udf_tail:
++ | remember_name FUNCTION_SYM ident
++ RETURNS_SYM udf_type SONAME_SYM TEXT_STRING_sys
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ if (is_native_function(thd, & $3))
++ {
++@@ -13507,7 +13435,6 @@ sf_tail:
++ sp_name /* $3 */
++ '(' /* $4 */
++ { /* $5 */
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ Lex_input_stream *lip= YYLIP;
++ sp_head *sp;
++@@ -13565,7 +13492,7 @@ sf_tail:
++ MYSQL_YYABORT;
++ }
++
++- if (sp->fill_field_definition(YYTHD, lex,
+++ if (sp->fill_field_definition(thd, lex,
++ (enum enum_field_types) $11,
++ &sp->m_return_field_def))
++ MYSQL_YYABORT;
++@@ -13574,7 +13501,6 @@ sf_tail:
++ }
++ sp_c_chistics /* $13 */
++ { /* $14 */
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ Lex_input_stream *lip= YYLIP;
++
++@@ -13583,7 +13509,6 @@ sf_tail:
++ }
++ sp_proc_stmt /* $15 */
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++ sp_head *sp= lex->sphead;
++
++@@ -13654,10 +13579,10 @@ sp_tail:
++ sp= new sp_head();
++ if (sp == NULL)
++ MYSQL_YYABORT;
++- sp->reset_thd_mem_root(YYTHD);
+++ sp->reset_thd_mem_root(thd);
++ sp->init(lex);
++ sp->m_type= TYPE_ENUM_PROCEDURE;
++- sp->init_sp_name(YYTHD, $3);
+++ sp->init_sp_name(thd, $3);
++
++ lex->sphead= sp;
++ }
++@@ -13672,7 +13597,6 @@ sp_tail:
++ sp_pdparam_list
++ ')'
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++
++ lex->sphead->m_param_end= YYLIP->get_cpp_tok_start();
++@@ -13680,7 +13604,6 @@ sp_tail:
++ }
++ sp_c_chistics
++ {
++- THD *thd= YYTHD;
++ LEX *lex= thd->lex;
++
++ lex->sphead->m_chistics= &lex->sp_chistics;
++@@ -13691,9 +13614,9 @@ sp_tail:
++ LEX *lex= Lex;
++ sp_head *sp= lex->sphead;
++
++- sp->set_stmt_end(YYTHD);
+++ sp->set_stmt_end(thd);
++ lex->sql_command= SQLCOM_CREATE_PROCEDURE;
++- sp->restore_thd_mem_root(YYTHD);
+++ sp->restore_thd_mem_root(thd);
++ }
++ ;
++
++@@ -13730,21 +13653,21 @@ xid:
++ text_string
++ {
++ MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE);
++- if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID))))
+++ if (!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))
++ MYSQL_YYABORT;
++ Lex->xid->set(1L, $1->ptr(), $1->length(), 0, 0);
++ }
++ | text_string ',' text_string
++ {
++ MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE && $3->length() <= MAXBQUALSIZE);
++- if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID))))
+++ if (!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))
++ MYSQL_YYABORT;
++ Lex->xid->set(1L, $1->ptr(), $1->length(), $3->ptr(), $3->length());
++ }
++ | text_string ',' text_string ',' ulong_num
++ {
++ MYSQL_YYABORT_UNLESS($1->length() <= MAXGTRIDSIZE && $3->length() <= MAXBQUALSIZE);
++- if (!(Lex->xid=(XID *)YYTHD->alloc(sizeof(XID))))
+++ if (!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))
++ MYSQL_YYABORT;
++ Lex->xid->set($5, $1->ptr(), $1->length(), $3->ptr(), $3->length());
++ }
+diff --git a/feeds/packages/utils/nano/Makefile b/feeds/packages/utils/nano/Makefile
+new file mode 100644
+index 0000000..ce63c88
+--- /dev/null
++++ b/feeds/packages/utils/nano/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=nano
++PKG_VERSION:=2.4.2
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.nano-editor.org/dist/v2.4
++PKG_MD5SUM:=ce6968992fec4283c17984b53554168b
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/nano
++ SUBMENU:=Editors
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=An enhanced clone of the Pico text editor
++ URL:=http://www.nano-editor.org/
++ MAINTAINER:=Jonathan Bennett <JBennett@incomsystems.biz>
++ DEPENDS:=+libncurses
++endef
++
++define Package/nano/description
++ GNU nano (Nano's ANOther editor, or Not ANOther editor) is an enhanced clone
++ of the Pico text editor.
++endef
++
++CONFIGURE_ARGS += \
++ --enable-tiny \
++ --disable-glibtest \
++ --disable-utf8 \
++ --without-slang \
++ --disable-color \
++
++CONFIGURE_VARS += \
++ ac_cv_header_regex_h=no \
++
++define Package/nano/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/$(PKG_NAME) $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,nano))
++
+diff --git a/feeds/packages/utils/ncdu/Makefile b/feeds/packages/utils/ncdu/Makefile
+new file mode 100644
+index 0000000..39f6b78
+--- /dev/null
++++ b/feeds/packages/utils/ncdu/Makefile
+@@ -0,0 +1,49 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ncdu
++PKG_VERSION:=1.11
++PKG_RELEASE=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://dev.yorhel.nl/download
++PKG_MD5SUM:=9e44240a5356b029f05f0e70a63c4d12
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++PKG_LICENSE:=MIT
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ncdu
++ SUBMENU:=Filesystem
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libncurses
++ TITLE:=ncurses disk usage viewer
++ MAINTAINER:=Charles Lehner <celehner1@gmail.com>
++ URL:=http://dev.yorhel.nl/ncdu
++endef
++
++define Package/ncdu/description
++ Ncdu is a ncurses-based du viewer. It provides a fast and easy-to-use
++ interface through famous du utility. It allows one to browse through the
++ directories and show percentages of disk usage with ncurses library.
++endef
++
++CONFIGURE_ARGS += --with-ncurses
++
++define Package/ncdu/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ncdu $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,ncdu))
+diff --git a/feeds/packages/utils/ncdu/patches/010-add_sys_wait.patch b/feeds/packages/utils/ncdu/patches/010-add_sys_wait.patch
+new file mode 100644
+index 0000000..dfc0611
+--- /dev/null
++++ b/feeds/packages/utils/ncdu/patches/010-add_sys_wait.patch
+@@ -0,0 +1,10 @@
++--- a/src/shell.c
+++++ b/src/shell.c
++@@ -33,6 +33,7 @@
++ #include <stdlib.h>
++ #include <unistd.h>
+++#include <sys/wait.h>
++
++ void shell_draw() {
++ char *full_path;
++ int res;
+diff --git a/feeds/packages/utils/ntfs-3g/Makefile b/feeds/packages/utils/ntfs-3g/Makefile
+new file mode 100644
+index 0000000..07708c6
+--- /dev/null
++++ b/feeds/packages/utils/ntfs-3g/Makefile
+@@ -0,0 +1,233 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ntfs-3g
++PKG_RELEASE:=1
++
++PKG_VERSION:=2015.3.14
++PKG_SOURCE:=$(PKG_NAME)_ntfsprogs-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=http://www.tuxera.com/opensource/
++PKG_MD5SUM:=8cd57768310e3b2be39b3191d808e241
++
++PKG_LICENSE:=GPL-2.0 LGPL-2.0
++PKG_LICENSE_FILES:=COPYING COPYING.LIB
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++# release contains fuseext/int hint
++PKG_RELEASE:=$(PKG_RELEASE)$(if $(CONFIG_PACKAGE_NTFS-3G_USE_LIBFUSE),-fuseext,-fuseint)
++
++# define build dir, respect fuseext/int
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-$(PKG_RELEASE)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ntfs-3g/common
++ SECTION:=utils
++ CATEGORY:=Utilities
++ URL:=http://www.tuxera.com
++ SUBMENU:=Filesystem
++ TITLE:=Stable Read/Write NTFS Driver
++endef
++
++define Package/ntfs-3g
++ $(call Package/ntfs-3g/common)
++ DEPENDS+= +kmod-fuse +PACKAGE_NTFS-3G_USE_LIBFUSE:libfuse +libpthread
++endef
++
++define Package/ntfs-3g/description
++ Ntfs-3g is a NTFS driver, which can create, remove, rename,
++ move files, directories, hard links, and streams. It can read
++ and write files, including streams and sparse files. It can
++ handle special files like symbolic links, devices, and FIFOs.
++ Moreover it can also read transparently compressed files.
++
++ Contains:
++ - ntfs-3g
++ - ntfs-3g.probe
++ - mount.ntfs-3g (symlink to ntfs-3g)
++
++endef
++
++define Package/ntfs-3g/config
++config PACKAGE_NTFS-3G_USE_LIBFUSE
++ bool "use external FUSE library, selects package libfuse"
++ depends on PACKAGE_ntfs-3g
++ ---help---
++ Ntfs-3g by default uses a minimalized lite version of FUSE.
++ If libfuse is part of your filesystem anyway (because of sshfs, owfs
++ etc.) it makes sense to activate this option and save some kilobytes
++ of space.
++
++endef
++
++define Package/ntfs-3g-low
++ $(call Package/ntfs-3g/common)
++ TITLE:=lowntfs-3g (alternative using the fuse low-level interface)
++ DEPENDS+= +ntfs-3g
++endef
++
++define Package/ntfs-3g-low/description
++ Contains:
++ - lowntfs-3g
++ - mount.lowntfs-3g (symlink to lowntfs-3g)
++
++ A driver variant using the fuse low-level interface missing some of the
++ enhanced functionality for streams or the like. You might want to check:
++ http://www.tuxera.com/community/ntfs-3g-manual/
++
++endef
++
++define Package/ntfs-3g-utils
++ $(call Package/ntfs-3g/common)
++ TITLE:=ntfs-3g utilities (extra)
++ DEPENDS+= +ntfs-3g
++endef
++
++define Package/ntfs-3g-utils/description
++ Additional ntfs-3g utilities. Not included by default for size
++ considerations.
++
++ Currently:
++ - ntfs-3g.secaudit
++ - ntfs-3g.usermap
++endef
++
++define Package/ntfsprogs_ntfs-3g/description
++ Suite of NTFS utilities for doing neat things with NTFS.
++ Contains:
++ - mkntfs - Create an NTFS filesystem.
++ - ntfscat - Dump a file's content to the standard output.
++ - ntfsclone - Efficiently clone, backup, restore or rescue NTFS.
++ - ntfscluster - Locate the files which use the given sectors or clusters.
++ - ntfscmp - Compare two NTFS filesystems and tell the differences.
++ - ntfscp - Copy a file to an NTFS volume.
++ - ntfsfix - Check and fix some common errors, clear the LogFile.
++ - ntfsinfo - Show information about NTFS or one of the files or directories within it.
++ - ntfslabel - Show, or set, an NTFS filesystem's volume label.
++ - ntfsls - List information about files in a directory residing on an NTFS.
++ - ntfsresize - Resize NTFS without losing data.
++ - ntfsundelete - Recover deleted files from NTFS.
++endef
++
++define Package/ntfsprogs_ntfs-3g
++ $(call Package/ntfs-3g/common)
++ TITLE:=ntfsprogs (ntfs-3g)
++ DEPENDS+= +ntfs-3g +libgcrypt +libuuid
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --with-uuid
++
++# configure/make according selection
++ifdef CONFIG_PACKAGE_NTFS-3G_USE_LIBFUSE
++ CONFIGURE_ARGS += --with-fuse=external
++ TARGET_CPPFLAGS:=-I$(STAGING_DIR)/usr/include/fuse $(TARGET_CPPFLAGS)
++else
++ CONFIGURE_ARGS += --with-fuse=internal
++ TARGET_CPPFLAGS:=-I../include/fuse-lite $(TARGET_CPPFLAGS)
++endif
++
++# enable disable ntfsprogs
++ifneq ($(CONFIG_PACKAGE_ntfsprogs_ntfs-3g)$(SDK)$(DEVELOPER),)
++ CONFIGURE_ARGS += --enable-ntfsprogs
++else
++ CONFIGURE_ARGS += --disable-ntfsprogs
++endif
++
++# redefine prepare to extract to our build dir
++# apply patches
++define Build/Prepare
++ rm -rf $(PKG_BUILD_DIR)/
++ mkdir -p $(PKG_BUILD_DIR)/
++ $(TAR) -xzf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_BUILD_DIR) --strip 1
++ $(Build/Patch)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/ntfs-3g $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libntfs-3g.{la,a,so*} $(1)/usr/lib/
++endef
++
++define Package/ntfs-3g/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ntfs-3g{,.probe} $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libntfs-3g.so.* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/sbin
++ $(CP) $(PKG_INSTALL_DIR)/sbin/mount.ntfs-3g $(1)/sbin/
++endef
++
++define Package/ntfs-3g/postinst
++#!/bin/sh
++FILE="$${IPKG_INSTROOT}/etc/filesystems"
++ID="ntfs-3g"
++
++if ! [ -f '/etc/filesystems' ]; then
++ echo "Create '$$FILE'."
++ touch "$$FILE"
++fi
++
++if ! grep -q -e '^ntfs-3g$$' "$$FILE"; then
++ echo "Add '$$ID' to known filesystems."
++ echo "$$ID" >> "$$FILE"
++fi
++
++endef
++
++define Package/ntfs-3g-low/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/lowntfs-3g $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/sbin
++ $(CP) $(PKG_INSTALL_DIR)/sbin/mount.lowntfs-3g $(1)/sbin/
++endef
++
++define Package/ntfs-3g-low/postinst
++#!/bin/sh
++FILE="$${IPKG_INSTROOT}/etc/filesystems"
++ID="lowntfs-3g"
++
++if ! [ -f '/etc/filesystems' ]; then
++ echo "Create '$$FILE'."
++ touch "$$FILE"
++fi
++
++if ! grep -q -e '^ntfs-3g$$' "$$FILE"; then
++ echo "Add '$$ID' to known filesystems."
++ echo "$$ID" >> "$$FILE"
++fi
++
++endef
++
++define Package/ntfs-3g-utils/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ntfs-3g.secaudit $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ntfs-3g.usermap $(1)/usr/bin
++endef
++
++define Package/ntfsprogs_ntfs-3g/install
++ $(INSTALL_DIR) $(1)/sbin
++ $(CP) $(PKG_INSTALL_DIR)/sbin/mkfs.ntfs $(1)/sbin/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(FIND) $(PKG_INSTALL_DIR)/usr/bin/ -type f ! -regex '.*[^/]*ntfs-3g[^/]*' -exec $(INSTALL_BIN) {} $(1)/usr/bin/ \;
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/* $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,ntfs-3g))
++$(eval $(call BuildPackage,ntfs-3g-low))
++$(eval $(call BuildPackage,ntfs-3g-utils))
++$(eval $(call BuildPackage,ntfsprogs_ntfs-3g))
+diff --git a/feeds/packages/utils/ntfs-3g/patches/001-fuseint-fix-path-mounted-on-musl.patch b/feeds/packages/utils/ntfs-3g/patches/001-fuseint-fix-path-mounted-on-musl.patch
+new file mode 100644
+index 0000000..577c89b
+--- /dev/null
++++ b/feeds/packages/utils/ntfs-3g/patches/001-fuseint-fix-path-mounted-on-musl.patch
+@@ -0,0 +1,30 @@
++Index: ntfs-3g-2014.2.15-1-fuseint/libfuse-lite/fusermount.c
++===================================================================
++--- ntfs-3g-2014.2.15-1-fuseint.orig/libfuse-lite/fusermount.c
+++++ ntfs-3g-2014.2.15-1-fuseint/libfuse-lite/fusermount.c
++@@ -36,6 +36,10 @@
++
++ #define FUSE_DEV_NEW "/dev/fuse"
++
+++#ifndef _PATH_MOUNTED
+++#define _PATH_MOUNTED "/proc/mounts"
+++#endif
+++
++ #ifndef MS_DIRSYNC
++ #define MS_DIRSYNC 128
++ #endif
++Index: ntfs-3g-2014.2.15-1-fuseint/libfuse-lite/mount_util.c
++===================================================================
++--- ntfs-3g-2014.2.15-1-fuseint.orig/libfuse-lite/mount_util.c
+++++ ntfs-3g-2014.2.15-1-fuseint/libfuse-lite/mount_util.c
++@@ -255,6 +255,10 @@ int fuse_mnt_check_fuseblk(void)
++
++ #else /* __SOLARIS__ */
++
+++#ifndef _PATH_MOUNTED
+++#define _PATH_MOUNTED "/proc/mounts"
+++#endif /* _PATH_MOUNTED */
+++
++ static int mtab_needs_update(const char *mnt)
++ {
++ int res;
+diff --git a/feeds/packages/utils/open-plc-utils/Makefile b/feeds/packages/utils/open-plc-utils/Makefile
+new file mode 100644
+index 0000000..1017ee8
+--- /dev/null
++++ b/feeds/packages/utils/open-plc-utils/Makefile
+@@ -0,0 +1,107 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=open-plc-utils
++PKG_VERSION:=2015-09-21
++PKG_RELEASE:=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/qca/open-plc-utils.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=885a1b7e2e663b5ab8797db6d40a0318131fdf18
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_MAINTAINER:=Florian Fainelli <florian@openwrt.org>
++
++PKG_LICENSE:=ISC
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/open-plc-utils/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Qualcomm Atheros Power Line Communication utilities
++ URL:=https://github.com/qca/open-plc-utils/blob/master/README
++endef
++
++define Package/open-plc-utils
++ $(call Package/open-plc-utils/Default)
++ MENU:=1
++endef
++
++define GenPlugin
++ define Package/$(addprefix open-plc-utils-,$(1))
++ $(call Package/open-plc-utils/Default)
++ DEPENDS:=open-plc-utils
++ TITLE:=Utility $(2) from the Open PLC utilities
++ endef
++
++ define Package/$(addprefix open-plc-utils-,$(1))/description
++ Utility $(2) from the Open PLC utilities package.
++ endef
++endef
++
++OPEN_PLC_UTILS_APPS:=efbu efeu efru efsu edru edsu nics \
++ hpavkey hpavkeys rkey mac2pw mac2pwd \
++ mdioblock mdioblock2 mdiodump mdiogen \
++ hpav mme \
++ chknvm chknvm2 nvmsplit nvmmerge \
++ chkpib chkpib2 setpib getpib modpib pib2xml \
++ pibcomp pibdump pibruin xml2pib psin psout pskey \
++ psgraph psnotch pibrump \
++ int6k int6kboot int6keth int6kf int6khost \
++ int64host int6kid int6klist int6klog int6kmdio \
++ int6kmdio2 int6kmod int6kstat int6ktest int6krate \
++ int6krule int6ktone int6kwait CMEncrypt sada \
++ coqos_add coqos_info coqos_man coqos_mod coqos_rel \
++ mdustats ampboot amphost ampID amplist amprate \
++ ampstat amptest amptool amptone ampwait \
++ plcboot plchost plcID plclist plcrate plcrule \
++ plcstat plctest plctool plctone \
++ plcwait plchostd plcget plcset plcotst plcfwd \
++ plcdevs plclog plcmdio16 plcmdio32 \
++ config2cfg sdram \
++ int6kuart int6kbaud ttysig ptsctl weeder ttysend \
++ ttyrecv ttycat int6kdetect
++
++$(foreach a,$(OPEN_PLC_UTILS_APPS),$(eval $(call GenPlugin,$(a))))
++
++ifdef CONFIG_USE_MUSL
++ TARGET_CFLAGS += -D__UCLIBC__
++endif
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ EXTRA_CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_CFLAGS) $(TARGET_LDFLAGS)" \
++ CROSS="$(TARGET_CROSS)" \
++ ROOTFS="$(PKG_INSTALL_DIR)" \
++ OWNER="$(shell id -u $(shell whoami))" \
++ GROUP="$(shell id -g $(shell whoami))" \
++ all install
++endef
++
++define Package/open-plc-utils/install
++endef
++
++define BuildPlugin
++ define Package/$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/local/bin/$(subst open-plc-utils-,,$(1)) \
++ $$(1)/usr/bin/
++ endef
++
++ $$(eval $$(call BuildPackage,$(1)))
++endef
++
++$(eval $(call BuildPackage,open-plc-utils))
++$(foreach a,$(OPEN_PLC_UTILS_APPS),$(eval $(call BuildPlugin,open-plc-utils-$(a))))
+diff --git a/feeds/packages/utils/open-plc-utils/patches/100-musl-compat.patch b/feeds/packages/utils/open-plc-utils/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..c20c0a1
+--- /dev/null
++++ b/feeds/packages/utils/open-plc-utils/patches/100-musl-compat.patch
+@@ -0,0 +1,33 @@
++--- a/ether/readpacket.c
+++++ b/ether/readpacket.c
++@@ -70,6 +70,10 @@
++ #include <memory.h>
++ #include <errno.h>
++
+++#if defined (__linux__)
+++#include <poll.h>
+++#endif
+++
++ #include "../ether/channel.h"
++ #include "../tools/memory.h"
++ #include "../tools/error.h"
++@@ -95,8 +99,6 @@ ssize_t readpacket (struct channel const
++
++ #elif defined (__linux__)
++
++-#include <sys/poll.h>
++-
++ struct pollfd pollfd =
++ {
++ channel->fd,
++--- a/serial/serial.c
+++++ b/serial/serial.c
++@@ -69,6 +69,8 @@
++
++ #if defined (WIN32)
++ #include <Windows.h>
+++#else
+++#include <sys/select.h>
++ #endif
++
++ /*====================================================================*
+diff --git a/feeds/packages/utils/open2300/Makefile b/feeds/packages/utils/open2300/Makefile
+new file mode 100644
+index 0000000..2354610
+--- /dev/null
++++ b/feeds/packages/utils/open2300/Makefile
+@@ -0,0 +1,67 @@
++#
++# Copyright (C) 2010 segal.ubi.pt
++# Copyright (C) 2014 nunojpg@gmail.com
++# Copyright (C) 2015 dev@localnet.hu
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=open2300
++PKG_VERSION:=1.12
++PKG_RELEASE:=5
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_SOURCE_PROTO:=svn
++PKG_SOURCE_URL:=http://www.lavrsen.dk/svn/open2300/trunk
++PKG_SOURCE_VERSION:=r12
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_CHECK_FORMAT_SECURITY:=0
++
++PKG_MAINTAINER:=Gabor SZOLLOSI <dev@localnet.hu>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/open2300
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=WS23XX weather station utilities
++ URL:=http://www.lavrsen.dk/foswiki/bin/view/Open2300
++endef
++
++define Package/open2300/description
++ This is an utility suite used to communicate with and collect data from a WS23XX wheather station.
++endef
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) -DVERSION=\"$(PKG_VERSION)\""
++
++define Package/open2300/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bin2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/cw2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/dump2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/fetch2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/histlog2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/history2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/interval2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/light2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/log2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/minmax2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/open2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/wu2300 $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/xml2300 $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) ./files/open2300.conf $(1)/etc/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib2300.so.1.11 $(1)/usr/lib/
++ ln -sf /usr/lib/lib2300.so.1.11 $(1)/usr/lib/lib2300.so
++endef
++
++$(eval $(call BuildPackage,open2300))
+diff --git a/feeds/packages/utils/open2300/files/open2300.conf b/feeds/packages/utils/open2300/files/open2300.conf
+new file mode 100644
+index 0000000..6414b49
+--- /dev/null
++++ b/feeds/packages/utils/open2300/files/open2300.conf
+@@ -0,0 +1,65 @@
++# open2300.conf
++#
++# Configuration files for open2300 weather station tools
++#
++# Default locations in which the programs will search for this file:
++# Programs search in this sequence:
++# 1. Path to config file including filename given as parameter (not supported by all tools)
++# 2. ./open2300.conf (current working directory)
++# 3. /jffs/etc/open2300.conf (typical DD-WRT location)
++# 4. /etc/open2300.conf (typical Linux location)
++#
++# All names are case sensitive!!!
++
++
++# Set to your serial port and time zone
++# For Windows use COM1, COM2, COM2 etc
++# For Linux use /dev/ttyS0, /dev/ttyS1 etc
++
++SERIAL_DEVICE /dev/tts/1 # /dev/ttyS0, /dev/ttyS1, COM1, COM2 etc
++TIMEZONE 1 # Hours Relative to UTC. East is positive, west is negative
++
++
++# Units of measure (set them to your preference)
++# The units of measure are ignored by wu2300 and cw2300 because both requires specific units
++
++WIND_SPEED m/s # select MPH (miles/hour), m/s, or km/h
++TEMPERATURE C # Select C or F
++RAIN mm # Select mm or IN
++PRESSURE hPa # Select hPa, mb or INHG
++
++
++#### Citizens Weather variables (used only by cw2300)
++# Format for latitude is
++# [2 digit degrees][2 digit minutes].[2 decimals minutes - NOT seconds][N for north or S for south]
++# Format for longitude is
++# [3 digit degrees][2 digit minutes].[2 decimals minutes - NOT seconds][E for east or W for west]
++# Use leading zeros to get the format ####.##N (lat) and #####.##E (long)
++
++CITIZEN_WEATHER_ID CW0000 # CW0000 should be replaced by HAM call or actual CW number
++CITIZEN_WEATHER_LATITUDE 5540.12N # DDMM.mmN or S - example 55 deg, 40.23 minutes north
++CITIZEN_WEATHER_LONGITUDE 01224.60E # DDDMM.mmE or W - example 12 deg, 24.60 minutes east
++
++APRS_SERVER rotate.aprs.net 14580 # These are the APRS servers and ports for
++APRS_SERVER first.aprs.net 14580 # Citizens Weather reporting.
++APRS_SERVER second.aprs.net 14580 # They they are tried in the entered order
++APRS_SERVER third.aprs.net 14580 # you may enter up to 5 alternate servers
++
++
++#### WEATHER UNDERGROUND variables (used only by wu2300)
++
++WEATHER_UNDERGROUND_ID WUID # ID received from Weather Underground
++WEATHER_UNDERGROUND_PASSWORD WUPASSWORD # Password for Weather Underground
++
++
++### MYSQL Settings (only used by mysql2300)
++
++#MYSQL_HOST localhost # Localhost or IP address/host name
++#MYSQL_USERNAME open2300 # Name of the MySQL user that has access to the database
++#MYSQL_PASSWORD mysql2300 # Password for the MySQL user
++#MYSQL_DATABASE open2300 # Named of your database
++#MYSQL_PORT 0 # TCP/IP Port number. Zero means default
++
++#PGSQL_CONNECT hostaddr='127.0.0.1'dbname='open2300'user='postgres'password='sql' # Connection string
++#PGSQL_TABLE weather # Table name
++#PGSQL_STATION open2300 # Unique station id
+diff --git a/feeds/packages/utils/open2300/patches/001-crosscompile.patch b/feeds/packages/utils/open2300/patches/001-crosscompile.patch
+new file mode 100644
+index 0000000..0953047
+--- /dev/null
++++ b/feeds/packages/utils/open2300/patches/001-crosscompile.patch
+@@ -0,0 +1,139 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -15,87 +15,82 @@
++ prefix = /usr/local
++ exec_prefix = ${prefix}
++ bindir = ${exec_prefix}/bin
+++libdir = ${prefix}/lib
++
++ #########################################
++
++ CC = gcc
++-OBJ = open2300.o rw2300.o linux2300.o win2300.o
++-LOGOBJ = log2300.o rw2300.o linux2300.o win2300.o
++-FETCHOBJ = fetch2300.o rw2300.o linux2300.o win2300.o
++-WUOBJ = wu2300.o rw2300.o linux2300.o win2300.o
++-CWOBJ = cw2300.o rw2300.o linux2300.o win2300.o
++-DUMPOBJ = dump2300.o rw2300.o linux2300.o win2300.o
++-HISTOBJ = history2300.o rw2300.o linux2300.o win2300.o
++-HISTLOGOBJ = histlog2300.o rw2300.o linux2300.o win2300.o
++-DUMPBINOBJ = bin2300.o rw2300.o linux2300.o win2300.o
++-XMLOBJ = xml2300.o rw2300.o linux2300.o win2300.o
++-PGSQLOBJ = pgsql2300.o rw2300.o linux2300.o win2300.o
++-LIGHTOBJ = light2300.o rw2300.o linux2300.o win2300.o
++-INTERVALOBJ = interval2300.o rw2300.o linux2300.o win2300.o
++-MINMAXOBJ = minmax2300.o rw2300.o linux2300.o win2300.o
++-MYSQLHISTLOGOBJ = mysqlhistlog2300.o rw2300.o linux2300.o win2300.o
+++LIB = lib2300
+++LIB_C = rw2300.c linux2300.c
+++LIBOBJ = rw2300.o linux2300.o
++
++ VERSION = 1.11
++
++ CFLAGS = -Wall -O3 -DVERSION=\"$(VERSION)\"
++-CC_LDFLAGS = -lm
++-CC_WINFLAG =
++-# For Windows - comment the two line above and un-comment the two lines below.
++-#CC_LDFLAGS = -lm -lwsock32
++-#CC_WINFLAG = -mwindows
+++CC_LDFLAGS = -L. -lm -l2300
+++LFLAGS = -shared -Wl,-soname
++ INSTALL = install
+++MAKE_EXEC = $(CC) $(CFLAGS) $@.c -o $@ $(CC_LDFLAGS)
++
++ ####### Build rules
++
++-all: open2300 dump2300 log2300 fetch2300 wu2300 cw2300 history2300 histlog2300 bin2300 xml2300 light2300 interval2300 minmax2300 mysql2300 mysqlhistlog2300
+++all: open2300 dump2300 log2300 fetch2300 wu2300 cw2300 history2300 histlog2300 bin2300 xml2300 light2300 interval2300 minmax2300 #mysql2300 mysqlhistlog2300
++
++-open2300 : $(OBJ)
++- $(CC) $(CFLAGS) -o $@ $(OBJ) $(CC_LDFLAGS)
++-
++-dump2300 : $(DUMPOBJ)
++- $(CC) $(CFLAGS) -o $@ $(DUMPOBJ) $(CC_LDFLAGS)
+++lib2300 :
+++ $(CC) -c -fPIC $(CFLAGS) $(LIB_C)
+++ $(CC) $(LFLAGS),$@.so -o $@.so.$(VERSION) $(LIBOBJ)
+++ ln -sf $@.so.$(VERSION) $@.so
+++
+++open2300 : $(LIB)
+++ $(MAKE_EXEC)
++
++-log2300 : $(LOGOBJ)
++- $(CC) $(CFLAGS) -o $@ $(LOGOBJ) $(CC_LDFLAGS) $(CC_WINFLAG)
+++dump2300 : $(LIB)
+++ $(MAKE_EXEC)
++
++-fetch2300 : $(FETCHOBJ)
++- $(CC) $(CFLAGS) -o $@ $(FETCHOBJ) $(CC_LDFLAGS)
+++log2300 : $(LIB)
+++ $(MAKE_EXEC)
++
++-wu2300 : $(WUOBJ)
++- $(CC) $(CFLAGS) -o $@ $(WUOBJ) $(CC_LDFLAGS) $(CC_WINFLAG)
+++fetch2300 : $(LIB)
+++ $(MAKE_EXEC)
+++
+++srv2300 : $(LIB)
+++ $(MAKE_EXEC)
+++
+++wu2300 : $(LIB)
+++ $(MAKE_EXEC)
++
++-cw2300 : $(CWOBJ)
++- $(CC) $(CFLAGS) -o $@ $(CWOBJ) $(CC_LDFLAGS) $(CC_WINFLAG)
+++cw2300 : $(LIB)
+++ $(MAKE_EXEC)
++
++-history2300 : $(HISTOBJ)
++- $(CC) $(CFLAGS) -o $@ $(HISTOBJ) $(CC_LDFLAGS)
+++history2300 : $(LIB)
+++ $(MAKE_EXEC)
++
++-histlog2300 : $(HISTLOGOBJ)
++- $(CC) $(CFLAGS) -o $@ $(HISTLOGOBJ) $(CC_LDFLAGS) $(CC_WINFLAG)
+++histlog2300 : $(LIB)
+++ $(MAKE_EXEC)
++
++-bin2300 : $(DUMPBINOBJ)
++- $(CC) $(CFLAGS) -o $@ $(DUMPBINOBJ) $(CC_LDFLAGS)
+++bin2300 : $(LIB)
+++ $(MAKE_EXEC)
++
++-xml2300 : $(XMLOBJ)
++- $(CC) $(CFLAGS) -o $@ $(XMLOBJ) $(CC_LDFLAGS) $(CC_WINFLAG)
+++xml2300 : $(LIB)
+++ $(MAKE_EXEC)
++
++-mysql2300:
++- $(CC) $(CFLAGS) -o mysql2300 mysql2300.c rw2300.c linux2300.c $(CC_LDFLAGS) $(CC_WINFLAG) -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
+++mysql2300: $(LIB)
+++ $(CC) $(CFLAGS) $@.c -o $@ -I/usr/include/mysql -L/usr/lib/mysql $(CC_LDFLAGS) -lmysqlclient
++
++-pgsql2300: $(PGSQLOBJ)
++- $(CC) $(CFLAGS) -o $@ $(PGSQLOBJ) $(CC_LDFLAGS) $(CC_WINFLAG) -I/usr/include/pgsql -L/usr/lib/pgsql -lpq
+++pgsql2300: $(LIB)
+++ $(CC) $(CFLAGS) $@.c -o $@ -I/usr/include/pgsql -L/usr/lib/pgsql $(CC_LDFLAGS) -lpq
++
++-light2300: $(LIGHTOBJ)
++- $(CC) $(CFLAGS) -o $@ $(LIGHTOBJ) $(CC_LDFLAGS)
+++light2300: $(LIB)
+++ $(MAKE_EXEC)
++
++-interval2300: $(INTERVALOBJ)
++- $(CC) $(CFLAGS) -o $@ $(INTERVALOBJ) $(CC_LDFLAGS)
+++interval2300: $(LIB)
+++ $(MAKE_EXEC)
++
++-minmax2300: $(MINMAXOBJ)
++- $(CC) $(CFLAGS) -o $@ $(MINMAXOBJ) $(CC_LDFLAGS) $(CC_WINFLAG)
+++minmax2300: $(LIB)
+++ $(MAKE_EXEC)
++
++-mysqlhistlog2300 :
++- $(CC) $(CFLAGS) -o mysqlhistlog2300 mysqlhistlog2300.c rw2300.c linux2300.c $(CC_LDFLAGS) $(CC_WINFLAG) -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
+++mysqlhistlog2300 : $(LIB)
+++ $(CC) $(CFLAGS) $@.c -o $@ -I/usr/include/mysql -L/usr/lib/mysql $(CC_LDFLAGS) -lmysqlclient
++
++
++ install:
+diff --git a/feeds/packages/utils/openobex/Makefile b/feeds/packages/utils/openobex/Makefile
+new file mode 100644
+index 0000000..f03b96d
+--- /dev/null
++++ b/feeds/packages/utils/openobex/Makefile
+@@ -0,0 +1,89 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=openobex
++PKG_VERSION:=1.7.1
++PKG_RELEASE:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)-Source
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-Source.tar.gz
++PKG_SOURCE_URL:=@SF/openobex
++PKG_MD5SUM:=3181bfed9cb7db591605391068cb0085
++
++PKG_LICENSE:=GPL-2.0+ LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/openobex/Default
++ TITLE:=Open Source impl of the OBject EXchange protocol
++ URL:=https://www.gitorious.org/openobex
++endef
++
++define Package/openobex
++$(call Package/openobex/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= (meta)
++ DEPENDS:=+openobex-apps +libopenobex
++endef
++
++define Package/openobex-apps
++$(call Package/openobex/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= (apps)
++ DEPENDS:=+libopenobex +bluez-libs
++endef
++
++define Package/libopenobex
++$(call Package/openobex/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= (library)
++ DEPENDS:=+libusb-1.0
++endef
++
++CMAKE_OPTIONS += \
++ -DBUILD_DOCUMENTATION:BOOL=OFF \
++
++MAKE_FLAGS += \
++ openobex openobex-apps \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/openobex $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libopenobex.so* $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/apps/lib/libopenobex-apps-common.a $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/openobex.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/openobex/install
++ :
++endef
++
++define Package/openobex-apps/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/* $(1)/usr/sbin/
++endef
++
++define Package/libopenobex/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libopenobex.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,openobex))
++$(eval $(call BuildPackage,openobex-apps))
++$(eval $(call BuildPackage,libopenobex))
+diff --git a/feeds/packages/utils/openobex/patches/001-cxx.patch b/feeds/packages/utils/openobex/patches/001-cxx.patch
+new file mode 100644
+index 0000000..650458f
+--- /dev/null
++++ b/feeds/packages/utils/openobex/patches/001-cxx.patch
+@@ -0,0 +1,10 @@
++--- a/CMakeLists.txt
+++++ b/CMakeLists.txt
++@@ -1,6 +1,6 @@
++ cmake_minimum_required ( VERSION 2.8.5 FATAL_ERROR )
++
++-project ( openobex C )
+++project ( openobex C CXX )
++
++ #
++ # The project version
+diff --git a/feeds/packages/utils/openocd/Makefile b/feeds/packages/utils/openocd/Makefile
+new file mode 100644
+index 0000000..c72818c
+--- /dev/null
++++ b/feeds/packages/utils/openocd/Makefile
+@@ -0,0 +1,79 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=openocd
++PKG_VERSION:=v0.9.0
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://git.code.sf.net/p/openocd/code
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_MAINTAINER:=Paul Fertser <fercerpav@gmail.com>
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++define Package/openocd
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=OpenOCD Utility
++ URL:=http://openocd.sf.net/
++ DEPENDS:=+libusb-1.0 +libusb-compat +libftdi1 +hidapi
++endef
++
++define Package/openocd/description
++OpenOCD provides on-chip programming and debugging support with a
++layered architecture of JTAG interface and TAP support including:
++
++- (X)SVF playback to faciliate automated boundary scan and FPGA/CPLD
++ programming;
++- debug target support (e.g. ARM, MIPS): single-stepping,
++ breakpoints/watchpoints, gprof profiling, etc;
++- flash chip drivers (e.g. CFI, NAND, internal flash);
++- embedded TCL interpreter for easy scripting.
++
++Several network interfaces are available for interacting with OpenOCD:
++telnet, TCL, and GDB. The GDB server enables OpenOCD to function as a
++"remote target" for source-level debugging of embedded systems using
++the GNU GDB program (and the others who talk GDB protocol, e.g. IDA
++Pro).
++endef
++
++CONFIGURE_ARGS += \
++ --prefix="/usr" \
++ --disable-werror \
++ MAKEINFO=true \
++ --enable-dummy \
++ --enable-sysfsgpio \
++ --enable-usb_blaster_libftdi \
++ --enable-openjtag_ftdi \
++ --enable-presto_libftdi
++
++define Build/Compile
++ +$(MAKE_VARS) \
++ $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/$(MAKE_PATH)
++endef
++
++define Package/openocd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/share/openocd
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/openocd $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/openocd/scripts $(1)/usr/share/openocd
++endef
++
++$(eval $(call BuildPackage,openocd))
+diff --git a/feeds/packages/utils/opensc/Makefile b/feeds/packages/utils/opensc/Makefile
+new file mode 100644
+index 0000000..adb249f
+--- /dev/null
++++ b/feeds/packages/utils/opensc/Makefile
+@@ -0,0 +1,227 @@
++#
++# Copyright (C) 2011-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=opensc
++PKG_VERSION:=20150513
++PKG_RELEASE:=1
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/OpenSC/OpenSC.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=a09ca246a797230c14bc33a34f2dddc4a4dbff40
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_BUILD_DEPENDS:=+libpcsclite
++PKG_FIXUP:=libtool
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libopensc
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=OpenSC libraries for smart cards
++ URL:=https://github.com/OpenSC/OpenSC/wiki
++ DEPENDS:=+libopenssl +libpthread
++ MENU:=1
++endef
++
++define Package/libopensc/description
++ OpenSC provides a set of libraries and utilities to work with smart cards.
++ Its main focus is on cards that support cryptographic operations, and
++ facilitate their use in security applications such as authentication,
++ mail encryption and digital signatures.
++endef
++
++define Package/libopensc-pkcs11
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=OpenSC - PKCS11 provider
++ URL:=https://github.com/OpenSC/OpenSC/wiki
++ DEPENDS:=libopensc
++endef
++
++define Package/libopensc-pkcs11/description
++ OpenSC PKCS#11 provider
++endef
++
++define Package/libpkcs11-spy
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=PKCS11 spying wrapper
++ URL:=https://github.com/OpenSC/OpenSC/wiki
++ DEPENDS:=+libopenssl +libpthread
++endef
++
++define Package/libpkcs11-spy/dscription
++ PKCS#11 spying wrapper
++endef
++
++define Package/opensc-utils
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=OpenSC - tools for smart cards
++ URL:=https://github.com/OpenSC/OpenSC/wiki
++ DEPENDS:=+libopensc
++ MENU:=1
++endef
++
++define Package/opensc-utils/description
++ OpenSC utilities
++endef
++
++define ToolGen
++define Package/opensc-utils-$(subst _,-,$(firstword $(subst :, ,$(1))))
++ TITLE:=$(firstword $(subst :, ,$(1))) utility from opensc
++ URL:=https://github.com/OpenSC/OpenSC/wiki
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=opensc-utils $(wordlist 2,$(words $(subst :, ,$(1))),$(subst :, ,$(1)))
++endef
++endef
++
++define ProfileGen
++define Package/libopensc-profile-$(subst _,-,$(firstword $(subst :, ,$(1))))
++ TITLE:=$(firstword $(subst :, ,$(1))) card profile for opensc
++ URL:=https://github.com/OpenSC/OpenSC/wiki
++ SECTION:=lib
++ CATEGORY:=Libraries
++ DEPENDS:=libopensc
++endef
++endef
++
++TOOLS:= \
++ cardos-tool \
++ cryptoflex-tool \
++ dnie-tool \
++ eidenv \
++ iasecc-tool \
++ netkey-tool \
++ openpgp-tool \
++ opensc-tool \
++ opensc-explorer:+libncurses:+libreadline \
++ piv-tool \
++ pkcs11-tool \
++ pkcs15-crypt \
++ pkcs15-init \
++ pkcs15-tool \
++ sc-hsm-tool \
++ westcos-tool
++
++PROFILES:= \
++ asepcos \
++ authentic \
++ cardos \
++ cyberflex \
++ entersafe \
++ epass2003 \
++ flex \
++ gpk \
++ ias_adele_admin1 \
++ ias_adele_admin2 \
++ ias_adele_common \
++ iasecc_admin_eid \
++ iasecc_generic_oberthur \
++ iasecc_generic_pki \
++ iasecc \
++ incrypto34 \
++ jcop \
++ miocos \
++ muscle \
++ myeid \
++ oberthur \
++ openpgp \
++ pkcs15 \
++ rutoken_ecp \
++ rutoken \
++ sc-hsm \
++ setcos \
++ starcos \
++ westcos
++
++$(foreach file,$(TOOLS),$(eval $(call ToolGen,$(file))))
++$(foreach file,$(PROFILES),$(eval $(call ProfileGen,$(file))))
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libopensc.{a,so}* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsmm-local.{a,so}* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/opensc-pkcs11.so $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkcs11-spy.so $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkcs11
++ $(LN) ../pkcs11-spy.so $(1)/usr/lib/pkcs11/
++ $(LN) ../opensc-pkcs11.so $(1)/usr/lib/pkcs11/
++ $(INSTALL_DIR) $(1)/usr/share/opensc
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/opensc/* $(1)/usr/share/opensc/
++endef
++
++define Package/libopensc/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libopensc.so* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsmm-local.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/etc
++ $(CP) $(PKG_INSTALL_DIR)/etc/opensc.conf $(1)/etc/
++endef
++
++define Package/libopensc-pkcs11/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/opensc-pkcs11.so $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkcs11
++ $(LN) ../opensc-pkcs11.so $(1)/usr/lib/pkcs11/
++endef
++
++define Package/libpkcs11-spy/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkcs11-spy.so $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkcs11
++ $(LN) ../pkcs11-spy.so $(1)/usr/lib/pkcs11/
++endef
++
++define Package/opensc-card-profiles
++ $(INSTALL_DIR) $(1)/usr/share/opensc
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/opensc/* $(1)/usr/share/opensc/
++endef
++
++define Package/opensc-utils/install
++ true
++endef
++
++define ToolInstall
++define Package/opensc-utils-$(subst _,-,$(firstword $(subst :, ,$(1))))/install
++ $(INSTALL_DIR) $$(1)/usr/bin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/bin/$(firstword $(subst :, ,$(1))) \
++ $$(1)/usr/bin/
++endef
++endef
++
++define ProfileInstall
++define Package/libopensc-profile-$(subst _,-,$(firstword $(subst :, ,$(1))))/install
++ $(INSTALL_DIR) $$(1)/usr/share/opensc
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/share/opensc/$(firstword $(subst :, ,$(1))).profile \
++ $$(1)/usr/share/opensc
++endef
++endef
++
++$(foreach file,$(TOOLS),$(eval $(call ToolInstall,$(file))))
++$(foreach file,$(PROFILES),$(eval $(call ProfileInstall,$(file))))
++
++$(eval $(call BuildPackage,libopensc))
++$(eval $(call BuildPackage,libopensc-pkcs11))
++$(eval $(call BuildPackage,libpkcs11-spy))
++
++$(eval $(call BuildPackage,opensc-utils))
++$(foreach file,$(TOOLS),$(eval $(call BuildPackage,opensc-utils-$(subst _,-,$(firstword $(subst :, ,$(file)))))))
++$(foreach file,$(PROFILES),$(eval $(call BuildPackage,libopensc-profile-$(subst _,-,$(firstword $(subst :, ,$(file)))))))
+diff --git a/feeds/packages/utils/opensc/patches/0001-OpenPGP-Detect-and-support-Gnuk-Token.patch b/feeds/packages/utils/opensc/patches/0001-OpenPGP-Detect-and-support-Gnuk-Token.patch
+new file mode 100644
+index 0000000..3bd03a6
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0001-OpenPGP-Detect-and-support-Gnuk-Token.patch
+@@ -0,0 +1,255 @@
++From 471b40173b73f213ee72bf05735abf3357658197 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Wed, 20 Feb 2013 11:54:30 +0700
++Subject: [PATCH 01/26] OpenPGP: Detect and support Gnuk Token.
++
++http://www.fsij.org/gnuk/
++---
++ src/libopensc/card-openpgp.c | 61 ++++++++++++++++++++++++++++++++++----------
++ src/libopensc/cards.h | 1 +
++ src/tools/openpgp-tool.c | 7 ++++-
++ 3 files changed, 55 insertions(+), 14 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -45,6 +45,7 @@
++ static struct sc_atr_table pgp_atrs[] = {
++ { "3b:fa:13:00:ff:81:31:80:45:00:31:c1:73:c0:01:00:00:90:00:b1", NULL, "OpenPGP card v1.0/1.1", SC_CARD_TYPE_OPENPGP_V1, 0, NULL },
++ { "3b:da:18:ff:81:b1:fe:75:1f:03:00:31:c5:73:c0:01:40:00:90:00:0c", NULL, "CryptoStick v1.2 (OpenPGP v2.0)", SC_CARD_TYPE_OPENPGP_V2, 0, NULL },
+++ { "3b:da:11:ff:81:b1:fe:55:1f:03:00:31:84:73:80:01:80:00:90:00:e4", NULL, "Gnuk v1.0.x (OpenPGP v2.0)", SC_CARD_TYPE_OPENPGP_GNUK, 0, NULL },
++ { NULL, NULL, NULL, 0, 0, NULL }
++ };
++
++@@ -309,6 +310,8 @@ pgp_init(sc_card_t *card)
++ int r;
++ struct blob *child = NULL;
++
+++ LOG_FUNC_CALLED(card->ctx);
+++
++ priv = calloc (1, sizeof *priv);
++ if (!priv)
++ return SC_ERROR_OUT_OF_MEMORY;
++@@ -317,11 +320,11 @@ pgp_init(sc_card_t *card)
++ card->cla = 0x00;
++
++ /* set pointer to correct list of card objects */
++- priv->pgp_objects = (card->type == SC_CARD_TYPE_OPENPGP_V2)
+++ priv->pgp_objects = (card->type == SC_CARD_TYPE_OPENPGP_V2 || card->type == SC_CARD_TYPE_OPENPGP_GNUK)
++ ? pgp2_objects : pgp1_objects;
++
++ /* set detailed card version */
++- priv->bcd_version = (card->type == SC_CARD_TYPE_OPENPGP_V2)
+++ priv->bcd_version = (card->type == SC_CARD_TYPE_OPENPGP_V2 || card->type == SC_CARD_TYPE_OPENPGP_GNUK)
++ ? OPENPGP_CARD_2_0 : OPENPGP_CARD_1_1;
++
++ /* select application "OpenPGP" */
++@@ -436,7 +439,8 @@ pgp_get_card_features(sc_card_t *card)
++ if ((pgp_get_blob(card, blob73, 0x00c0, &blob) >= 0) &&
++ (blob->data != NULL) && (blob->len > 0)) {
++ /* in v2.0 bit 0x04 in first byte means "algorithm attributes changeable */
++- if ((blob->data[0] & 0x04) && (card->type == SC_CARD_TYPE_OPENPGP_V2))
+++ if ((blob->data[0] & 0x04) &&
+++ (card->type == SC_CARD_TYPE_OPENPGP_V2 || card->type == SC_CARD_TYPE_OPENPGP_GNUK))
++ priv->ext_caps |= EXT_CAP_ALG_ATTR_CHANGEABLE;
++ /* bit 0x08 in first byte means "support for private use DOs" */
++ if (blob->data[0] & 0x08)
++@@ -453,7 +457,8 @@ pgp_get_card_features(sc_card_t *card)
++ priv->ext_caps |= EXT_CAP_GET_CHALLENGE;
++ }
++ /* in v2.0 bit 0x80 in first byte means "support Secure Messaging" */
++- if ((blob->data[0] & 0x80) && (card->type == SC_CARD_TYPE_OPENPGP_V2))
+++ if ((blob->data[0] & 0x80) &&
+++ (card->type == SC_CARD_TYPE_OPENPGP_V2 || card->type == SC_CARD_TYPE_OPENPGP_GNUK))
++ priv->ext_caps |= EXT_CAP_SM;
++
++ if ((priv->bcd_version >= OPENPGP_CARD_2_0) && (blob->len >= 10)) {
++@@ -1065,12 +1070,18 @@ static int
++ pgp_get_pubkey(sc_card_t *card, unsigned int tag, u8 *buf, size_t buf_len)
++ {
++ sc_apdu_t apdu;
+++ u8 apdu_case = SC_APDU_CASE_4;
++ u8 idbuf[2];
++ int r;
++
++ sc_log(card->ctx, "called, tag=%04x\n", tag);
++
++- sc_format_apdu(card, &apdu, SC_APDU_CASE_4, 0x47, 0x81, 0);
+++ /* With Gnuk token, force to use short APDU */
+++ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK) {
+++ apdu_case = SC_APDU_CASE_4_SHORT;
+++ }
+++
+++ sc_format_apdu(card, &apdu, apdu_case, 0x47, 0x81, 0);
++ apdu.lc = 2;
++ apdu.data = ushort2bebytes(idbuf, tag);
++ apdu.datalen = 2;
++@@ -1162,6 +1173,7 @@ pgp_put_data(sc_card_t *card, unsigned i
++ u8 ins = 0xDA;
++ u8 p1 = tag >> 8;
++ u8 p2 = tag & 0xFF;
+++ u8 apdu_case = SC_APDU_CASE_3;
++ int r;
++
++ LOG_FUNC_CALLED(card->ctx);
++@@ -1203,13 +1215,17 @@ pgp_put_data(sc_card_t *card, unsigned i
++
++ /* Build APDU */
++ if (buf != NULL && buf_len > 0) {
++- sc_format_apdu(card, &apdu, SC_APDU_CASE_3, ins, p1, p2);
+++ /* Force short APDU for Gnuk */
+++ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK) {
+++ apdu_case = SC_APDU_CASE_3_SHORT;
+++ }
+++ sc_format_apdu(card, &apdu, apdu_case, ins, p1, p2);
++
++ /* if card/reader does not support extended APDUs, but chaining, then set it */
++ if (((card->caps & SC_CARD_CAP_APDU_EXT) == 0) && (priv->ext_caps & EXT_CAP_CHAINING))
++ apdu.flags |= SC_APDU_FLAGS_CHAINING;
++
++- apdu.data = buf;
+++ apdu.data = (u8 *)buf;
++ apdu.datalen = buf_len;
++ apdu.lc = buf_len;
++ }
++@@ -1336,6 +1352,7 @@ pgp_compute_signature(sc_card_t *card, c
++ struct pgp_priv_data *priv = DRVDATA(card);
++ sc_security_env_t *env = &priv->sec_env;
++ sc_apdu_t apdu;
+++ u8 apdu_case = SC_APDU_CASE_4;
++ int r;
++
++ LOG_FUNC_CALLED(card->ctx);
++@@ -1344,14 +1361,19 @@ pgp_compute_signature(sc_card_t *card, c
++ LOG_TEST_RET(card->ctx, SC_ERROR_INVALID_ARGUMENTS,
++ "invalid operation");
++
+++ /* Force short APDU for Gnuk Token */
+++ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK) {
+++ apdu_case = SC_APDU_CASE_4_SHORT;
+++ }
+++
++ switch (env->key_ref[0]) {
++ case 0x00: /* signature key */
++ /* PSO SIGNATURE */
++- sc_format_apdu(card, &apdu, SC_APDU_CASE_4, 0x2A, 0x9E, 0x9A);
+++ sc_format_apdu(card, &apdu, apdu_case, 0x2A, 0x9E, 0x9A);
++ break;
++ case 0x02: /* authentication key */
++ /* INTERNAL AUTHENTICATE */
++- sc_format_apdu(card, &apdu, SC_APDU_CASE_4, 0x88, 0, 0);
+++ sc_format_apdu(card, &apdu, apdu_case, 0x88, 0, 0);
++ break;
++ case 0x01:
++ default:
++@@ -1360,7 +1382,7 @@ pgp_compute_signature(sc_card_t *card, c
++ }
++
++ apdu.lc = data_len;
++- apdu.data = data;
+++ apdu.data = (u8 *)data;
++ apdu.datalen = data_len;
++ apdu.le = ((outlen >= 256) && !(card->caps & SC_CARD_CAP_APDU_EXT)) ? 256 : outlen;
++ apdu.resp = out;
++@@ -1384,6 +1406,7 @@ pgp_decipher(sc_card_t *card, const u8 *
++ struct pgp_priv_data *priv = DRVDATA(card);
++ sc_security_env_t *env = &priv->sec_env;
++ sc_apdu_t apdu;
+++ u8 apdu_case = SC_APDU_CASE_4;
++ u8 *temp = NULL;
++ int r;
++
++@@ -1408,7 +1431,7 @@ pgp_decipher(sc_card_t *card, const u8 *
++ case 0x01: /* Decryption key */
++ case 0x02: /* authentication key */
++ /* PSO DECIPHER */
++- sc_format_apdu(card, &apdu, SC_APDU_CASE_4, 0x2A, 0x80, 0x86);
+++ sc_format_apdu(card, &apdu, apdu_case, 0x2A, 0x80, 0x86);
++ break;
++ case 0x00: /* signature key */
++ default:
++@@ -1417,8 +1440,13 @@ pgp_decipher(sc_card_t *card, const u8 *
++ "invalid key reference");
++ }
++
+++ /* Gnuk only supports short APDU, so we need to use command chaining */
+++ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK) {
+++ apdu.flags |= SC_APDU_FLAGS_CHAINING;
+++ }
+++
++ apdu.lc = inlen;
++- apdu.data = in;
+++ apdu.data = (u8 *)in;
++ apdu.datalen = inlen;
++ apdu.le = ((outlen >= 256) && !(card->caps & SC_CARD_CAP_APDU_EXT)) ? 256 : outlen;
++ apdu.resp = out;
++@@ -1802,6 +1830,11 @@ static int pgp_gen_key(sc_card_t *card,
++ LOG_FUNC_RETURN(card->ctx, SC_ERROR_INVALID_ARGUMENTS);
++ }
++
+++ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && key_info->modulus_len != 2048) {
+++ sc_log(card->ctx, "Gnuk does not support other key length than 2048.");
+++ LOG_FUNC_RETURN(card->ctx, SC_ERROR_INVALID_ARGUMENTS);
+++ }
+++
++ /* Set attributes for new-generated key */
++ r = pgp_update_new_algo_attr(card, key_info);
++ LOG_TEST_RET(card->ctx, r, "Cannot set attributes for new-generated key");
++@@ -1809,7 +1842,9 @@ static int pgp_gen_key(sc_card_t *card,
++ /* Test whether we will need extended APDU. 1900 is an
++ * arbitrary modulus length which for sure fits into a short APDU.
++ * This idea is borrowed from GnuPG code. */
++- if (card->caps & SC_CARD_CAP_APDU_EXT && key_info->modulus_len > 1900) {
+++ if (card->caps & SC_CARD_CAP_APDU_EXT
+++ && key_info->modulus_len > 1900
+++ && card->type != SC_CARD_TYPE_OPENPGP_GNUK) {
++ /* We won't store to apdu variable yet, because it will be reset in
++ * sc_format_apdu() */
++ apdu_le = card->max_recv_size;
++Index: opensc-20150513/src/libopensc/cards.h
++===================================================================
++--- opensc-20150513.orig/src/libopensc/cards.h
+++++ opensc-20150513/src/libopensc/cards.h
++@@ -105,6 +105,7 @@ enum {
++ SC_CARD_TYPE_OPENPGP_BASE = 9000,
++ SC_CARD_TYPE_OPENPGP_V1,
++ SC_CARD_TYPE_OPENPGP_V2,
+++ SC_CARD_TYPE_OPENPGP_GNUK,
++
++ /* jcop driver */
++ SC_CARD_TYPE_JCOP_BASE = 10000,
++Index: opensc-20150513/src/tools/openpgp-tool.c
++===================================================================
++--- opensc-20150513.orig/src/tools/openpgp-tool.c
+++++ opensc-20150513/src/tools/openpgp-tool.c
++@@ -33,6 +33,7 @@
++ #include "libopensc/cards.h"
++ #include "libopensc/cardctl.h"
++ #include "libopensc/errors.h"
+++#include "libopensc/log.h"
++ #include "util.h"
++ #include "libopensc/log.h"
++
++@@ -396,6 +397,8 @@ int do_genkey(sc_card_t *card, u8 key_id
++ sc_path_t path;
++ sc_file_t *file;
++
+++ LOG_FUNC_CALLED(card->ctx);
+++
++ if (key_id < 1 || key_id > 3) {
++ printf("Unknown key ID %d.\n", key_id);
++ return 1;
++@@ -487,8 +490,10 @@ int main(int argc, char **argv)
++
++ /* check card type */
++ if ((card->type != SC_CARD_TYPE_OPENPGP_V1) &&
++- (card->type != SC_CARD_TYPE_OPENPGP_V2)) {
+++ (card->type != SC_CARD_TYPE_OPENPGP_V2) &&
+++ (card->type != SC_CARD_TYPE_OPENPGP_GNUK)) {
++ util_error("not an OpenPGP card");
+++ sc_log(card->ctx, "Card type %X", card->type);
++ exit_status = EXIT_FAILURE;
++ goto out;
++ }
+diff --git a/feeds/packages/utils/opensc/patches/0002-OpenPGP-Add-Gnuk-in-pkcs15-emulation-layer.patch b/feeds/packages/utils/opensc/patches/0002-OpenPGP-Add-Gnuk-in-pkcs15-emulation-layer.patch
+new file mode 100644
+index 0000000..2514c16
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0002-OpenPGP-Add-Gnuk-in-pkcs15-emulation-layer.patch
+@@ -0,0 +1,47 @@
++From 00a2c08c9125103ee0bff9af9e7ff42c5cdc14fe Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Fri, 12 Apr 2013 17:24:00 +0700
++Subject: [PATCH 02/26] OpenPGP: Add Gnuk in pkcs15 emulation layer.
++
++---
++ src/libopensc/pkcs15-openpgp.c | 6 ++++--
++ src/libopensc/pkcs15-syn.c | 1 +
++ 2 files changed, 5 insertions(+), 2 deletions(-)
++
++Index: opensc-20150513/src/libopensc/pkcs15-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/pkcs15-openpgp.c
+++++ opensc-20150513/src/libopensc/pkcs15-openpgp.c
++@@ -153,7 +153,8 @@ sc_pkcs15emu_openpgp_init(sc_pkcs15_card
++ u8 c4data[10];
++ u8 c5data[70];
++ int r, i;
++- const pgp_pin_cfg_t *pin_cfg = (card->type == SC_CARD_TYPE_OPENPGP_V2) ? pin_cfg_v2 : pin_cfg_v1;
+++ const pgp_pin_cfg_t *pin_cfg = (card->type == SC_CARD_TYPE_OPENPGP_V2 || card->type == SC_CARD_TYPE_OPENPGP_GNUK)
+++ ? pin_cfg_v2 : pin_cfg_v1;
++ sc_path_t path;
++ sc_file_t *file;
++
++@@ -365,7 +366,8 @@ failed: sc_debug(card->ctx, SC_LOG_DEBUG
++
++ static int openpgp_detect_card(sc_pkcs15_card_t *p15card)
++ {
++- if (p15card->card->type == SC_CARD_TYPE_OPENPGP_V1 || p15card->card->type == SC_CARD_TYPE_OPENPGP_V2)
+++ if (p15card->card->type == SC_CARD_TYPE_OPENPGP_V1 || p15card->card->type == SC_CARD_TYPE_OPENPGP_V2
+++ || p15card->card->type == SC_CARD_TYPE_OPENPGP_GNUK)
++ return SC_SUCCESS;
++ else
++ return SC_ERROR_WRONG_CARD;
++Index: opensc-20150513/src/libopensc/pkcs15-syn.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/pkcs15-syn.c
+++++ opensc-20150513/src/libopensc/pkcs15-syn.c
++@@ -117,6 +117,7 @@ int sc_pkcs15_is_emulation_only(sc_card_
++ case SC_CARD_TYPE_GEMSAFEV1_PTEID:
++ case SC_CARD_TYPE_OPENPGP_V1:
++ case SC_CARD_TYPE_OPENPGP_V2:
+++ case SC_CARD_TYPE_OPENPGP_GNUK:
++ case SC_CARD_TYPE_SC_HSM:
++ case SC_CARD_TYPE_DNIE_BASE:
++ case SC_CARD_TYPE_DNIE_BLANK:
+diff --git a/feeds/packages/utils/opensc/patches/0003-OpenPGP-Include-private-DO-to-filesystem-at-driver-i.patch b/feeds/packages/utils/opensc/patches/0003-OpenPGP-Include-private-DO-to-filesystem-at-driver-i.patch
+new file mode 100644
+index 0000000..49fce82
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0003-OpenPGP-Include-private-DO-to-filesystem-at-driver-i.patch
+@@ -0,0 +1,27 @@
++From 2d348b60ab8c22791b56f291600954abd716a791 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Fri, 22 Mar 2013 17:37:16 +0700
++Subject: [PATCH 03/26] OpenPGP: Include private DO to filesystem at driver
++ initialization.
++
++In old implementation, the DOs which their access is restricted by
++PIN (like DOs 0101 -> 0104) were excluded from the fake filesystem,
++leading to that we cannot read their data later, even if we verified PIN.
++---
++ src/libopensc/card-openpgp.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -365,7 +365,7 @@ pgp_init(sc_card_t *card)
++
++ /* Populate MF - add matching blobs listed in the pgp_objects table. */
++ for (info = priv->pgp_objects; (info != NULL) && (info->id > 0); info++) {
++- if (((info->access & READ_MASK) == READ_ALWAYS) &&
+++ if (((info->access & READ_MASK) != READ_NEVER) &&
++ (info->get_fn != NULL)) {
++ child = pgp_new_blob(card, priv->mf, info->id, sc_file_new());
++
+diff --git a/feeds/packages/utils/opensc/patches/0004-PKCS15-OpenPGP-Declare-DATA-objects.patch b/feeds/packages/utils/opensc/patches/0004-PKCS15-OpenPGP-Declare-DATA-objects.patch
+new file mode 100644
+index 0000000..619ea8c
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0004-PKCS15-OpenPGP-Declare-DATA-objects.patch
+@@ -0,0 +1,79 @@
++From fda9b6dd088e734de372fc85c091f88e8607bc2e Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Tue, 26 Feb 2013 17:37:16 +0700
++Subject: [PATCH 04/26] PKCS15-OpenPGP: Declare DATA objects.
++
++Begin to support read/write DATA object for PKCS-OpenPGP binding.
++This object is used by TrueCrypt.
++---
++ src/libopensc/pkcs15-openpgp.c | 35 +++++++++++++++++++++++++++++++++++
++ 1 file changed, 35 insertions(+)
++
++Index: opensc-20150513/src/libopensc/pkcs15-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/pkcs15-openpgp.c
+++++ opensc-20150513/src/libopensc/pkcs15-openpgp.c
++@@ -34,6 +34,7 @@
++ #include "log.h"
++
++ int sc_pkcs15emu_openpgp_init_ex(sc_pkcs15_card_t *, sc_pkcs15emu_opt_t *);
+++static int sc_pkcs15emu_openpgp_add_data(sc_pkcs15_card_t *);
++
++
++ #define PGP_USER_PIN_FLAGS (SC_PKCS15_PIN_FLAG_CASE_SENSITIVE \
++@@ -43,6 +44,8 @@ int sc_pkcs15emu_openpgp_init_ex(sc_pkcs
++ | SC_PKCS15_PIN_FLAG_UNBLOCK_DISABLED \
++ | SC_PKCS15_PIN_FLAG_SO_PIN)
++
+++#define PGP_NUM_PRIVDO 4
+++
++ typedef struct _pgp_pin_cfg {
++ const char *label;
++ int reference;
++@@ -357,6 +360,9 @@ sc_pkcs15emu_openpgp_init(sc_pkcs15_card
++ goto failed;
++ }
++
+++ /* PKCS#15 DATA object from OpenPGP private DOs */
+++ r = sc_pkcs15emu_openpgp_add_data(p15card);
+++
++ return 0;
++
++ failed: sc_debug(card->ctx, SC_LOG_DEBUG_NORMAL, "Failed to initialize OpenPGP emulation: %s\n",
++@@ -364,6 +370,35 @@ failed: sc_debug(card->ctx, SC_LOG_DEBUG
++ return r;
++ }
++
+++static int
+++sc_pkcs15emu_openpgp_add_data(sc_pkcs15_card_t *p15card)
+++{
+++ sc_context_t *ctx = p15card->card->ctx;
+++ int i, r;
+++
+++ LOG_FUNC_CALLED(ctx);
+++ /* There is 4 private DO from 0101 to 0104 */
+++ for (i = 1; i <= PGP_NUM_PRIVDO; i++) {
+++ sc_pkcs15_data_info_t dat_info;
+++ sc_pkcs15_object_t dat_obj;
+++ char name[8];
+++ char path[9];
+++ memset(&dat_info, 0, sizeof(dat_info));
+++ memset(&dat_obj, 0, sizeof(dat_obj));
+++
+++ sprintf(name, "PrivDO%d", i);
+++ sprintf(path, "3F00010%d", i);
+++
+++ sc_format_path(path, &dat_info.path);
+++ strlcpy(dat_obj.label, name, sizeof(dat_obj.label));
+++ strlcpy(dat_info.app_label, name, sizeof(dat_info.app_label));
+++
+++ sc_log(ctx, "Add %s data object", name);
+++ r = sc_pkcs15emu_add_data_object(p15card, &dat_obj, &dat_info);
+++ }
+++ LOG_FUNC_RETURN(ctx, r);
+++}
+++
++ static int openpgp_detect_card(sc_pkcs15_card_t *p15card)
++ {
++ if (p15card->card->type == SC_CARD_TYPE_OPENPGP_V1 || p15card->card->type == SC_CARD_TYPE_OPENPGP_V2
+diff --git a/feeds/packages/utils/opensc/patches/0005-OpenPGP-Support-erasing-reset-card.patch b/feeds/packages/utils/opensc/patches/0005-OpenPGP-Support-erasing-reset-card.patch
+new file mode 100644
+index 0000000..aa3c9d3
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0005-OpenPGP-Support-erasing-reset-card.patch
+@@ -0,0 +1,169 @@
++From 6d138f0199575516bfaad18cbbafcfa2ee61e58f Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Mon, 4 Mar 2013 11:28:08 +0700
++Subject: [PATCH 05/26] OpenPGP: Support erasing (reset) card.
++
++Command: openpgp-tool --erase
++---
++ src/libopensc/card-openpgp.c | 64 ++++++++++++++++++++++++++++++++++++++++++++
++ src/tools/openpgp-tool.c | 22 ++++++++++++++-
++ 2 files changed, 85 insertions(+), 1 deletion(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -2206,6 +2206,66 @@ out:
++
++ #endif /* ENABLE_OPENSSL */
++
+++/**
+++ * Erase card
+++ **/
+++static int pgp_erase_card(sc_card_t *card)
+++{
+++ sc_context_t *ctx = card->ctx;
+++ u8 *apdustring[10] = {
+++ "00:20:00:81:08:40:40:40:40:40:40:40:40",
+++ "00:20:00:81:08:40:40:40:40:40:40:40:40",
+++ "00:20:00:81:08:40:40:40:40:40:40:40:40",
+++ "00:20:00:81:08:40:40:40:40:40:40:40:40",
+++ "00:20:00:83:08:40:40:40:40:40:40:40:40",
+++ "00:20:00:83:08:40:40:40:40:40:40:40:40",
+++ "00:20:00:83:08:40:40:40:40:40:40:40:40",
+++ "00:20:00:83:08:40:40:40:40:40:40:40:40",
+++ "00:e6:00:00",
+++ "00:44:00:00"
+++ };
+++ u8 buf[SC_MAX_APDU_BUFFER_SIZE];
+++ u8 rbuf[SC_MAX_APDU_BUFFER_SIZE];
+++ sc_apdu_t apdu;
+++ size_t len0;
+++ int commandsnum = 10;
+++ int i, r;
+++
+++ LOG_FUNC_CALLED(ctx);
+++
+++ /* Check card version */
+++ if (card->type != SC_CARD_TYPE_OPENPGP_V2) {
+++ sc_log(ctx, "Card is not OpenPGP v2");
+++ LOG_FUNC_RETURN(ctx, SC_ERROR_NO_CARD_SUPPORT);
+++ }
+++ sc_log(ctx, "Card is OpenPGP v2. Erase card.");
+++
+++ /* Iterate over 10 commands above */
+++ for (i = 0; i < commandsnum; i++) {
+++ /* Convert the string to binary array */
+++ len0 = sizeof(buf);
+++ sc_hex_to_bin(apdustring[i], buf, &len0);
+++ printf("Sending: ");
+++ for (r = 0; r < len0; r++)
+++ printf("%02X ", buf[r]);
+++ printf("\n");
+++
+++ /* Build APDU from binary array */
+++ r = sc_bytes2apdu(card->ctx, buf, len0, &apdu);
+++ if (r) {
+++ sc_log(ctx, "Failed to build APDU");
+++ LOG_FUNC_RETURN(ctx, SC_ERROR_INTERNAL);
+++ }
+++ apdu.resp = rbuf;
+++ apdu.resplen = sizeof(rbuf);
+++
+++ /* Send APDU to card */
+++ r = sc_transmit_apdu(card, &apdu);
+++ LOG_TEST_RET(ctx, r, "Transmiting APDU failed");
+++ }
+++ LOG_FUNC_RETURN(ctx, r);
+++}
+++
++ /* ABI: card ctl: perform special card-specific operations */
++ static int pgp_card_ctl(sc_card_t *card, unsigned long cmd, void *ptr)
++ {
++@@ -2232,6 +2292,10 @@ static int pgp_card_ctl(sc_card_t *card,
++ LOG_FUNC_RETURN(card->ctx, r);
++ break;
++ #endif /* ENABLE_OPENSSL */
+++ case SC_CARDCTL_ERASE_CARD:
+++ r = pgp_erase_card(card);
+++ LOG_FUNC_RETURN(card->ctx, r);
+++ break;
++ }
++
++ LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_SUPPORTED);
++Index: opensc-20150513/src/tools/openpgp-tool.c
++===================================================================
++--- opensc-20150513.orig/src/tools/openpgp-tool.c
+++++ opensc-20150513/src/tools/openpgp-tool.c
++@@ -78,6 +78,7 @@ static int opt_pin = 0;
++ static const char *pin = NULL;
++ static int opt_dump_do = 0;
++ static u8 do_dump_idx;
+++static int opt_erase = 0;
++
++ static const char *app_name = "openpgp-tool";
++
++@@ -94,6 +95,7 @@ static const struct option options[] = {
++ { "help", no_argument, NULL, 'h' },
++ { "verbose", no_argument, NULL, 'v' },
++ { "version", no_argument, NULL, 'V' },
+++ { "erase", no_argument, NULL, 'E' },
++ { "verify", required_argument, NULL, OPT_VERIFY },
++ { "pin", required_argument, NULL, OPT_PIN },
++ { "do", required_argument, NULL, 'd' },
++@@ -113,6 +115,7 @@ static const char *option_help[] = {
++ /* h */ "Print this help message",
++ /* v */ "Verbose operation. Use several times to enable debug output.",
++ /* V */ "Show version number",
+++/* E */ "Erase (reset) the card",
++ "Verify PIN (CHV1, CHV2, CHV3...)",
++ "PIN string",
++ /* d */ "Dump private data object number <arg> (i.e. PRIVATE-DO-<arg>)"
++@@ -232,7 +235,7 @@ static int decode_options(int argc, char
++ {
++ int c;
++
++- while ((c = getopt_long(argc, argv,"r:x:CUG:L:hwvVd:", options, (int *) 0)) != EOF) {
+++ while ((c = getopt_long(argc, argv,"r:x:CUG:L:hwvVd:E", options, (int *) 0)) != EOF) {
++ switch (c) {
++ case 'r':
++ opt_reader = optarg;
++@@ -294,6 +297,8 @@ static int decode_options(int argc, char
++ do_dump_idx = optarg[0] - '0';
++ opt_dump_do++;
++ actions++;
+++ case 'E':
+++ opt_erase++;
++ break;
++ default:
++ util_print_usage_and_die(app_name, options, option_help, NULL);
++@@ -452,6 +457,18 @@ int do_verify(sc_card_t *card, char *typ
++ return r;
++ }
++
+++int do_erase(sc_card_t *card)
+++{
+++ int r;
+++ /* Check card version */
+++ if (card->type != SC_CARD_TYPE_OPENPGP_V2) {
+++ printf("Do not erase card which is not OpenPGP v2\n");
+++ }
+++ printf("Erase card\n");
+++ r = sc_card_ctl(card, SC_CARDCTL_ERASE_CARD, NULL);
+++ return r;
+++}
+++
++ int main(int argc, char **argv)
++ {
++ sc_context_t *ctx = NULL;
++@@ -531,6 +548,9 @@ int main(int argc, char **argv)
++ exit(EXIT_FAILURE);
++ }
++
+++ if (opt_erase)
+++ exit_status != do_erase(card);
+++
++ out:
++ sc_unlock(card);
++ sc_disconnect_card(card);
+diff --git a/feeds/packages/utils/opensc/patches/0006-openpgp-tool-Support-deleting-key-in-Gnuk.patch b/feeds/packages/utils/opensc/patches/0006-openpgp-tool-Support-deleting-key-in-Gnuk.patch
+new file mode 100644
+index 0000000..4286e46
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0006-openpgp-tool-Support-deleting-key-in-Gnuk.patch
+@@ -0,0 +1,205 @@
++From 469b6567d9adc4af6f49fa65534162673060454d Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Mon, 4 Mar 2013 18:13:03 +0700
++Subject: [PATCH 06/26] openpgp-tool: Support deleting key in Gnuk.
++
++---
++ src/tools/openpgp-tool.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++
++ 1 file changed, 142 insertions(+)
++
++Index: opensc-20150513/src/tools/openpgp-tool.c
++===================================================================
++--- opensc-20150513.orig/src/tools/openpgp-tool.c
+++++ opensc-20150513/src/tools/openpgp-tool.c
++@@ -41,6 +41,7 @@
++ #define OPT_PRETTY 257
++ #define OPT_VERIFY 258
++ #define OPT_PIN 259
+++#define OPT_DELKEY 260
++
++ /* define structures */
++ struct ef_name_map {
++@@ -79,6 +80,7 @@ static const char *pin = NULL;
++ static int opt_dump_do = 0;
++ static u8 do_dump_idx;
++ static int opt_erase = 0;
+++static int opt_delkey = 0;
++
++ static const char *app_name = "openpgp-tool";
++
++@@ -98,6 +100,7 @@ static const struct option options[] = {
++ { "erase", no_argument, NULL, 'E' },
++ { "verify", required_argument, NULL, OPT_VERIFY },
++ { "pin", required_argument, NULL, OPT_PIN },
+++ { "del-key", required_argument, NULL, OPT_DELKEY },
++ { "do", required_argument, NULL, 'd' },
++ { NULL, 0, NULL, 0 }
++ };
++@@ -118,6 +121,7 @@ static const char *option_help[] = {
++ /* E */ "Erase (reset) the card",
++ "Verify PIN (CHV1, CHV2, CHV3...)",
++ "PIN string",
+++ "Delete key (1, 2, 3 or all)",
++ /* d */ "Dump private data object number <arg> (i.e. PRIVATE-DO-<arg>)"
++ };
++
++@@ -300,6 +304,14 @@ static int decode_options(int argc, char
++ case 'E':
++ opt_erase++;
++ break;
+++ case OPT_DELKEY:
+++ opt_delkey++;
+++ if (strcmp(optarg, "all") != 0) /* Arg string is not 'all' */
+++ key_id = optarg[0] - '0';
+++ else /* Arg string is 'all' */
+++ key_id = 'a';
+++ actions++;
+++ break;
++ default:
++ util_print_usage_and_die(app_name, options, option_help, NULL);
++ }
++@@ -457,6 +469,133 @@ int do_verify(sc_card_t *card, char *typ
++ return r;
++ }
++
+++/**
+++ * Delete key, for Gnuk.
+++ **/
+++int delete_key_gnuk(sc_card_t *card, u8 key_id)
+++{
+++ sc_context_t *ctx = card->ctx;
+++ int r = SC_SUCCESS;
+++ u8 *data = NULL;
+++
+++ /* Delete fingerprint */
+++ sc_log(ctx, "Delete fingerprints");
+++ r |= sc_put_data(card, 0xC6 + key_id, NULL, 0);
+++ /* Delete creation time */
+++ sc_log(ctx, "Delete creation time");
+++ r |= sc_put_data(card, 0xCD + key_id, NULL, 0);
+++
+++ /* Rewrite Extended Header List */
+++ sc_log(ctx, "Rewrite Extended Header List");
+++
+++ if (key_id == 1)
+++ data = "\x4D\x02\xB6";
+++ else if (key_id == 2)
+++ data = "\x4D\x02\xB8";
+++ else if (key_id == 3)
+++ data = "\x4D\x02\xA4";
+++ else
+++ return SC_ERROR_INVALID_ARGUMENTS;
+++
+++ r |= sc_put_data(card, 0x4D, data, strlen(data) + 1);
+++ return r;
+++}
+++
+++/**
+++ * Delete key, for OpenPGP card.
+++ * This function is not complete and is reserved for future version (> 2) of OpenPGP card.
+++ **/
+++int delete_key_openpgp(sc_card_t *card, u8 key_id)
+++{
+++ sc_context_t *ctx = card->ctx;
+++ char *del_fingerprint = "00:DA:00:C6:14:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00";
+++ char *del_creationtime = "00:DA:00:CD:04:00:00:00:00";
+++ /* We need to replace the 4th byte later */
+++ char *apdustring = NULL;
+++ u8 buf[SC_MAX_APDU_BUFFER_SIZE];
+++ u8 rbuf[SC_MAX_APDU_BUFFER_SIZE];
+++ sc_apdu_t apdu;
+++ size_t len0;
+++ int i;
+++ int r = SC_SUCCESS;
+++
+++ for (i = 0; i < 2; i++) {
+++ if (i == 0) /* Reset fingerprint */
+++ apdustring = del_fingerprint;
+++ else /* Reset creation time */
+++ apdustring = del_creationtime;
+++ /* Convert the string to binary array */
+++ len0 = sizeof(buf);
+++ sc_hex_to_bin(apdustring, buf, &len0);
+++
+++ /* Replace DO tag, subject to key ID */
+++ buf[3] = buf[3] + key_id;
+++
+++ /* Build APDU from binary array */
+++ r = sc_bytes2apdu(card->ctx, buf, len0, &apdu);
+++ if (r) {
+++ sc_log(ctx, "Failed to build APDU");
+++ LOG_FUNC_RETURN(ctx, SC_ERROR_INTERNAL);
+++ }
+++ apdu.resp = rbuf;
+++ apdu.resplen = sizeof(rbuf);
+++
+++ /* Send APDU to card */
+++ r = sc_transmit_apdu(card, &apdu);
+++ LOG_TEST_RET(ctx, r, "Transmiting APDU failed");
+++ }
+++ /* TODO: Rewrite Extended Header List.
+++ * Not support by OpenGPG v2 yet */
+++ LOG_FUNC_RETURN(ctx, r);
+++}
+++
+++int delete_key(sc_card_t *card, u8 key_id)
+++{
+++ sc_context_t *ctx = card->ctx;
+++ int r;
+++
+++ LOG_FUNC_CALLED(ctx);
+++ /* Check key ID */
+++ if (key_id < 1 || key_id > 3) {
+++ sc_log(ctx, "Invalid key ID %d", key_id);
+++ LOG_FUNC_RETURN(ctx, SC_ERROR_INVALID_ARGUMENTS);
+++ }
+++
+++ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK)
+++ r = delete_key_gnuk(card, key_id);
+++ else
+++ r = delete_key_openpgp(card, key_id);
+++
+++ LOG_FUNC_RETURN(ctx, r);
+++}
+++
+++int do_delete_key(sc_card_t *card, u8 key_id)
+++{
+++ sc_context_t *ctx = card->ctx;
+++ int r = SC_SUCCESS;
+++
+++ /* Currently, only Gnuk supports deleting keys */
+++ if (card->type != SC_CARD_TYPE_OPENPGP_GNUK) {
+++ printf("Only Gnuk supports deleting keys. General OpenPGP doesn't.");
+++ return SC_ERROR_NOT_SUPPORTED;
+++ }
+++
+++ if (key_id < 1 || (key_id > 3 && key_id != 'a')) {
+++ printf("Error: Invalid key id %d", key_id);
+++ return SC_ERROR_INVALID_ARGUMENTS;
+++ }
+++ if (key_id == 1 || key_id == 'a') {
+++ r |= delete_key(card, 1);
+++ }
+++ if (key_id == 2 || key_id == 'a') {
+++ r |= delete_key(card, 2);
+++ }
+++ if (key_id == 3 || key_id == 'a') {
+++ r |= delete_key(card, 3);
+++ }
+++ return r;
+++}
+++
++ int do_erase(sc_card_t *card)
++ {
++ int r;
++@@ -548,6 +687,9 @@ int main(int argc, char **argv)
++ exit(EXIT_FAILURE);
++ }
++
+++ if (opt_delkey)
+++ exit_status != do_delete_key(card, key_id);
+++
++ if (opt_erase)
++ exit_status != do_erase(card);
++
+diff --git a/feeds/packages/utils/opensc/patches/0007-OpenPGP-Correct-building-Extended-Header-List-when-i.patch b/feeds/packages/utils/opensc/patches/0007-OpenPGP-Correct-building-Extended-Header-List-when-i.patch
+new file mode 100644
+index 0000000..f5b2cc0
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0007-OpenPGP-Correct-building-Extended-Header-List-when-i.patch
+@@ -0,0 +1,24 @@
++From d210faa377bcec63876f84b82540b110ede16e57 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Mon, 4 Mar 2013 18:14:51 +0700
++Subject: [PATCH 07/26] OpenPGP: Correct building Extended Header List when
++ importing keys.
++
++---
++ src/libopensc/card-openpgp.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -1988,7 +1988,7 @@ pgp_build_extended_header_list(sc_card_t
++ u8 *p = NULL;
++ u8 *components[] = {key_info->e, key_info->p, key_info->q, key_info->n};
++ size_t componentlens[] = {key_info->e_len, key_info->p_len, key_info->q_len, key_info->n_len};
++- unsigned int componenttags[] = {0x91, 0x92, 0x93, 0x95};
+++ unsigned int componenttags[] = {0x91, 0x92, 0x93, 0x97};
++ char *componentnames[] = {
++ "public exponent",
++ "prime p",
+diff --git a/feeds/packages/utils/opensc/patches/0008-OpenPGP-Read-some-empty-DOs-from-Gnuk.patch b/feeds/packages/utils/opensc/patches/0008-OpenPGP-Read-some-empty-DOs-from-Gnuk.patch
+new file mode 100644
+index 0000000..9d942d0
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0008-OpenPGP-Read-some-empty-DOs-from-Gnuk.patch
+@@ -0,0 +1,55 @@
++From df98874784a77c96a7a1be54412a02a53fdd3a3e Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Mon, 25 Mar 2013 11:58:38 +0700
++Subject: [PATCH 08/26] OpenPGP: Read some empty DOs from Gnuk.
++
++In Gnuk, some empty DOs are returned as not exist, instead of existing with empty value.
++So, we will consider them exist in driver.
++---
++ src/libopensc/card-openpgp.c | 25 +++++++++++++++++++++++++
++ 1 file changed, 25 insertions(+)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -823,6 +823,23 @@ pgp_get_blob(sc_card_t *card, struct blo
++ }
++ }
++
+++ /* This part is for "NOT FOUND" cases */
+++
+++ /* Special case:
+++ * Gnuk does not have default value for children of DO 65 (DOs 5B, 5F2D, 5F35)
+++ * So, if these blob was not found, we create it. */
+++ if (blob->id == 0x65 && (id == 0x5B || id == 0x5F2D || id == 0x5F35)) {
+++ sc_log(card->ctx, "Create blob %X under %X", id, blob->id);
+++ child = pgp_new_blob(card, blob, id, sc_file_new());
+++ if (child) {
+++ pgp_set_blob(child, NULL, 0);
+++ *ret = child;
+++ return SC_SUCCESS;
+++ }
+++ else
+++ sc_log(card->ctx, "Not enough memory to create blob for DO %X");
+++ }
+++
++ return SC_ERROR_FILE_NOT_FOUND;
++ }
++
++@@ -1157,6 +1174,14 @@ pgp_get_data(sc_card_t *card, unsigned i
++ LOG_TEST_RET(card->ctx, r, "APDU transmit failed");
++
++ r = sc_check_sw(card, apdu.sw1, apdu.sw2);
+++
+++ /* For Gnuk card, if there is no certificate, it returns error instead of empty data.
+++ * So, for this case, we ignore error and consider success */
+++ if (r == SC_ERROR_DATA_OBJECT_NOT_FOUND && card->type == SC_CARD_TYPE_OPENPGP_GNUK
+++ && (tag == DO_CERT || tag == 0x0101 || tag == 0x0102 || tag == 0x0103 || tag == 0x0104)) {
+++ r = SC_SUCCESS;
+++ apdu.resplen = 0;
+++ }
++ LOG_TEST_RET(card->ctx, r, "Card returned error");
++
++ LOG_FUNC_RETURN(card->ctx, apdu.resplen);
+diff --git a/feeds/packages/utils/opensc/patches/0009-PKCS15-OpenPGP-Do-not-show-empty-DO-in-pkcs15-emu_in.patch b/feeds/packages/utils/opensc/patches/0009-PKCS15-OpenPGP-Do-not-show-empty-DO-in-pkcs15-emu_in.patch
+new file mode 100644
+index 0000000..16431a4
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0009-PKCS15-OpenPGP-Do-not-show-empty-DO-in-pkcs15-emu_in.patch
+@@ -0,0 +1,50 @@
++From 42adc35954e18e24f253f710b16d850d1872bce5 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Wed, 27 Mar 2013 11:38:42 +0700
++Subject: [PATCH 09/26] PKCS15-OpenPGP: Do not show empty DO in pkcs15
++ emu_init.
++
++---
++ src/libopensc/pkcs15-openpgp.c | 18 ++++++++++++++++++
++ 1 file changed, 18 insertions(+)
++
++Index: opensc-20150513/src/libopensc/pkcs15-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/pkcs15-openpgp.c
+++++ opensc-20150513/src/libopensc/pkcs15-openpgp.c
++@@ -383,16 +383,34 @@ sc_pkcs15emu_openpgp_add_data(sc_pkcs15_
++ sc_pkcs15_object_t dat_obj;
++ char name[8];
++ char path[9];
+++ u8 content[254];
++ memset(&dat_info, 0, sizeof(dat_info));
++ memset(&dat_obj, 0, sizeof(dat_obj));
++
++ sprintf(name, "PrivDO%d", i);
++ sprintf(path, "3F00010%d", i);
++
+++ /* Check if the DO can be read.
+++ * We won't expose pkcs15 DATA object if DO is empty.
+++ */
+++ r = read_file(p15card->card, path, content, sizeof(content));
+++ if (r <= 0 ) {
+++ sc_log(ctx, "Cannot read DO 010%d or there is no data in it", i);
+++ /* Skip */
+++ continue;
+++ }
++ sc_format_path(path, &dat_info.path);
++ strlcpy(dat_obj.label, name, sizeof(dat_obj.label));
++ strlcpy(dat_info.app_label, name, sizeof(dat_info.app_label));
++
+++ /* Add DATA object to slot protected by PIN2 (PW1 with Ref 0x82) */
+++ dat_obj.flags = SC_PKCS15_CO_FLAG_PRIVATE | SC_PKCS15_CO_FLAG_MODIFIABLE;
+++ dat_obj.auth_id.len = 1;
+++ if (i == 1 || i == 3)
+++ dat_obj.auth_id.value[0] = 2;
+++ else
+++ dat_obj.auth_id.value[0] = 3;
+++
++ sc_log(ctx, "Add %s data object", name);
++ r = sc_pkcs15emu_add_data_object(p15card, &dat_obj, &dat_info);
++ }
+diff --git a/feeds/packages/utils/opensc/patches/0010-PKCS15-OpenPGP-Allow-to-store-data-to-pkcs15-data-ob.patch b/feeds/packages/utils/opensc/patches/0010-PKCS15-OpenPGP-Allow-to-store-data-to-pkcs15-data-ob.patch
+new file mode 100644
+index 0000000..afcf9d5
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0010-PKCS15-OpenPGP-Allow-to-store-data-to-pkcs15-data-ob.patch
+@@ -0,0 +1,88 @@
++From f085e6a5f386875b5b071ef3bf115e4d9bb33bdb Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Wed, 27 Mar 2013 11:39:33 +0700
++Subject: [PATCH 10/26] PKCS15-OpenPGP: Allow to store data to pkcs15 data
++ object.
++
++Only one DO is supported now.
++---
++ src/libopensc/pkcs15-openpgp.c | 2 +-
++ src/pkcs15init/pkcs15-openpgp.c | 38 +++++++++++++++++++++++++++++++++++++-
++ 2 files changed, 38 insertions(+), 2 deletions(-)
++
++Index: opensc-20150513/src/libopensc/pkcs15-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/pkcs15-openpgp.c
+++++ opensc-20150513/src/libopensc/pkcs15-openpgp.c
++@@ -395,7 +395,7 @@ sc_pkcs15emu_openpgp_add_data(sc_pkcs15_
++ */
++ r = read_file(p15card->card, path, content, sizeof(content));
++ if (r <= 0 ) {
++- sc_log(ctx, "Cannot read DO 010%d or there is no data in it", i);
+++ sc_log(ctx, "No data get from DO 010%d", i);
++ /* Skip */
++ continue;
++ }
++Index: opensc-20150513/src/pkcs15init/pkcs15-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/pkcs15init/pkcs15-openpgp.c
+++++ opensc-20150513/src/pkcs15init/pkcs15-openpgp.c
++@@ -236,13 +236,16 @@ static int openpgp_emu_update_tokeninfo(
++ }
++
++ static int openpgp_store_data(struct sc_pkcs15_card *p15card, struct sc_profile *profile,
++- struct sc_pkcs15_object *obj, struct sc_pkcs15_der *content,
+++ struct sc_pkcs15_object *obj, struct sc_pkcs15_der *content,
++ struct sc_path *path)
++ {
++ sc_card_t *card = p15card->card;
+++ sc_context_t *ctx = card->ctx;
++ sc_file_t *file;
++ sc_pkcs15_cert_info_t *cinfo;
++ sc_pkcs15_id_t *cid;
+++ sc_pkcs15_data_info_t *dinfo;
+++ u8 buf[254];
++ int r;
++
++ LOG_FUNC_CALLED(card->ctx);
++@@ -282,6 +285,39 @@ static int openpgp_store_data(struct sc_
++ content->len, 0);
++ break;
++
+++ case SC_PKCS15_TYPE_DATA_OBJECT:
+++ dinfo = (sc_pkcs15_data_info_t *) obj->data;
+++ /* dinfo->app_label contains filename */
+++ sc_log(ctx, "===== App label %s", dinfo->app_label);
+++ /* Currently, we only support DO 0101. The reason is that when initializing this
+++ * pkcs15 emulation, PIN authentication is not applied and we can expose only this DO,
+++ * which is "read always".
+++ * If we support other DOs, they will not be exposed, and not helpful to user.
+++ * I haven't found a way to refresh the list of exposed DOs after verifying PIN yet.
+++ * http://sourceforge.net/mailarchive/message.php?msg_id=30646373
+++ **/
+++ sc_log(ctx, "About to write to DO 0101");
+++ sc_format_path("0101", path);
+++ r = sc_select_file(card, path, &file);
+++ LOG_TEST_RET(card->ctx, r, "Cannot select private DO");
+++ r = sc_read_binary(card, 0, buf, sizeof(buf), 0);
+++ if (r < 0) {
+++ sc_log(ctx, "Cannot read DO 0101");
+++ break;
+++ }
+++ if (r > 0) {
+++ sc_log(ctx, "DO 0101 is full.");
+++ r = SC_ERROR_TOO_MANY_OBJECTS;
+++ break;
+++ }
+++ r = sc_pkcs15init_authenticate(profile, p15card, file, SC_AC_OP_UPDATE);
+++ if (r >= 0 && content->len) {
+++ r = sc_update_binary(p15card->card, 0,
+++ (const unsigned char *) content->value,
+++ content->len, 0);
+++ }
+++ break;
+++
++ default:
++ r = SC_ERROR_NOT_IMPLEMENTED;
++ }
+diff --git a/feeds/packages/utils/opensc/patches/0011-OpenPGP-Provide-enough-buffer-to-read-pubkey-from-Gn.patch b/feeds/packages/utils/opensc/patches/0011-OpenPGP-Provide-enough-buffer-to-read-pubkey-from-Gn.patch
+new file mode 100644
+index 0000000..a4c5262
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0011-OpenPGP-Provide-enough-buffer-to-read-pubkey-from-Gn.patch
+@@ -0,0 +1,84 @@
++From 752f8981bed49a98d3592ead3aa50e743318dea8 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Fri, 5 Apr 2013 17:18:50 +0700
++Subject: [PATCH 11/26] OpenPGP: Provide enough buffer to read pubkey from
++ Gnuk.
++
++---
++ src/libopensc/card-openpgp.c | 28 +++++++++++++++++++++++-----
++ 1 file changed, 23 insertions(+), 5 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -265,7 +265,12 @@ static struct do_info pgp2_objects[] =
++
++ /* The DO holding X.509 certificate is constructed but does not contain child DO.
++ * We should notice this when building fake file system later. */
++-#define DO_CERT 0x7f21
+++#define DO_CERT 0x7f21
+++/* Maximum length for response buffer when reading pubkey. This value is calculated with
+++ * 4096-bit key length */
+++#define MAXLEN_RESP_PUBKEY 527
+++/* Gnuk only support 1 key length (2048 bit) */
+++#define MAXLEN_RESP_PUBKEY_GNUK 271
++
++ #define DRVDATA(card) ((struct pgp_priv_data *) ((card)->drv_data))
++ struct pgp_priv_data {
++@@ -739,6 +744,14 @@ pgp_read_blob(sc_card_t *card, struct bl
++ u8 buffer[2048];
++ size_t buf_len = (card->caps & SC_CARD_CAP_APDU_EXT)
++ ? sizeof(buffer) : 256;
+++
+++ /* Buffer length for Gnuk pubkey */
+++ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK &&
+++ (blob->id == 0xa400 || blob->id == 0xb600 || blob->id == 0xb800
+++ || blob->id == 0xa401 || blob->id == 0xb601 || blob->id == 0xb801)) {
+++ buf_len = MAXLEN_RESP_PUBKEY_GNUK;
+++ }
+++
++ int r = blob->info->get_fn(card, blob->id, buffer, buf_len);
++
++ if (r < 0) { /* an error occurred */
++@@ -1836,6 +1849,7 @@ static int pgp_gen_key(sc_card_t *card,
++ u8 apdu_case;
++ u8 *apdu_data;
++ size_t apdu_le;
+++ size_t resplen = 0;
++ int r = SC_SUCCESS;
++
++ LOG_FUNC_CALLED(card->ctx);
++@@ -1876,23 +1890,27 @@ static int pgp_gen_key(sc_card_t *card,
++ apdu_case = SC_APDU_CASE_4_EXT;
++ }
++ else {
++- apdu_le = 256;
++ apdu_case = SC_APDU_CASE_4_SHORT;
+++ apdu_le = 256;
+++ resplen = MAXLEN_RESP_PUBKEY;
+++ }
+++ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK) {
+++ resplen = MAXLEN_RESP_PUBKEY_GNUK;
++ }
++
++ /* Prepare APDU */
++- sc_format_apdu(card, &apdu, apdu_case, 0x47, 0x80, 0);
+++ sc_format_apdu(card, &apdu, apdu_case, 0x47, 0x80, 0);
++ apdu.data = apdu_data;
++ apdu.datalen = 2; /* Data = B600 */
++ apdu.lc = 2;
++ apdu.le = apdu_le;
++
++ /* Buffer to receive response */
++- apdu.resp = calloc(apdu.le, 1);
+++ apdu.resplen = (resplen > 0) ? resplen : apdu_le;
+++ apdu.resp = calloc(apdu.resplen, 1);
++ if (apdu.resp == NULL) {
++ LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_ENOUGH_MEMORY);
++ }
++- apdu.resplen = apdu.le;
++
++ /* Send */
++ sc_log(card->ctx, "Waiting for the card to generate key...");
+diff --git a/feeds/packages/utils/opensc/patches/0012-OpenPGP-Support-write-certificate-for-Gnuk.patch b/feeds/packages/utils/opensc/patches/0012-OpenPGP-Support-write-certificate-for-Gnuk.patch
+new file mode 100644
+index 0000000..40c0c85
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0012-OpenPGP-Support-write-certificate-for-Gnuk.patch
+@@ -0,0 +1,217 @@
++From 5110ae3ba33d165c43ea5eca8f929a82d81cb3fe Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Thu, 11 Apr 2013 11:47:51 +0700
++Subject: [PATCH 12/26] OpenPGP: Support write certificate for Gnuk.
++
++---
++ src/libopensc/card-openpgp.c | 158 +++++++++++++++++++++++++++++++++----------
++ 1 file changed, 123 insertions(+), 35 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -735,6 +735,8 @@ pgp_iterate_blobs(struct blob *blob, int
++ static int
++ pgp_read_blob(sc_card_t *card, struct blob *blob)
++ {
+++ struct pgp_priv_data *priv = DRVDATA (card);
+++
++ if (blob->data != NULL)
++ return SC_SUCCESS;
++ if (blob->info == NULL)
++@@ -745,6 +747,11 @@ pgp_read_blob(sc_card_t *card, struct bl
++ size_t buf_len = (card->caps & SC_CARD_CAP_APDU_EXT)
++ ? sizeof(buffer) : 256;
++
+++ /* Buffer length for certificate */
+++ if (blob->id == DO_CERT && priv->max_cert_size > 0) {
+++ buf_len = MIN(priv->max_cert_size, sizeof(buffer));
+++ }
+++
++ /* Buffer length for Gnuk pubkey */
++ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK &&
++ (blob->id == 0xa400 || blob->id == 0xb600 || blob->id == 0xb800
++@@ -1200,49 +1207,75 @@ pgp_get_data(sc_card_t *card, unsigned i
++ LOG_FUNC_RETURN(card->ctx, apdu.resplen);
++ }
++
++-/* ABI: PUT DATA */
++-static int
++-pgp_put_data(sc_card_t *card, unsigned int tag, const u8 *buf, size_t buf_len)
+++
+++/* Internal: Write certificate for Gnuk */
+++static int gnuk_write_certificate(sc_card_t *card, const u8 *buf, size_t length)
++ {
+++ sc_context_t *ctx = card->ctx;
+++ size_t i = 0;
++ sc_apdu_t apdu;
+++ u8 *part;
+++ size_t plen;
+++ int r = SC_SUCCESS;
+++
+++ LOG_FUNC_CALLED(ctx);
+++
+++ /* If null data is passed, delete certificate */
+++ if (buf == NULL || length == 0) {
+++ sc_format_apdu(card, &apdu, SC_APDU_CASE_1, 0xD6, 0x85, 0);
+++ r = sc_transmit_apdu(card, &apdu);
+++ LOG_TEST_RET(card->ctx, r, "APDU transmit failed");
+++ /* Check response */
+++ r = sc_check_sw(card, apdu.sw1, apdu.sw2);
+++ LOG_FUNC_RETURN(card->ctx, length);
+++ }
+++
+++ /* Ref: gnuk_put_binary_libusb.py and gnuk_token.py in Gnuk source tree */
+++ /* Split data to segments of 256 bytes. Send each segment via command chaining,
+++ * with particular P1 byte for each segment */
+++ while (i*256 < length) {
+++ part = (u8 *)buf + i*256;
+++ plen = MIN(length - i*256, 256);
+++
+++ sc_log(card->ctx, "Write part %d from offset 0x%X, len %d", i+1, part, plen);
+++
+++ if (i == 0) {
+++ sc_format_apdu(card, &apdu, SC_APDU_CASE_3_SHORT, 0xD6, 0x85, 0);
+++ }
+++ else {
+++ sc_format_apdu(card, &apdu, SC_APDU_CASE_3_SHORT, 0xD6, i, 0);
+++ }
+++ apdu.flags |= SC_APDU_FLAGS_CHAINING;
+++ apdu.data = part;
+++ apdu.datalen = apdu.lc = plen;
+++
+++ r = sc_transmit_apdu(card, &apdu);
+++ LOG_TEST_RET(card->ctx, r, "APDU transmit failed");
+++ /* Check response */
+++ r = sc_check_sw(card, apdu.sw1, apdu.sw2);
+++ LOG_TEST_RET(card->ctx, r, "UPDATE BINARY returned error");
+++
+++ /* To next part */
+++ i++;
+++ }
+++ LOG_FUNC_RETURN(card->ctx, length);
+++}
+++
+++
+++/* Internal: Use PUT DATA command to write */
+++static int
+++pgp_put_data_plain(sc_card_t *card, unsigned int tag, const u8 *buf, size_t buf_len)
+++{
++ struct pgp_priv_data *priv = DRVDATA(card);
++- struct blob *affected_blob = NULL;
++- struct do_info *dinfo = NULL;
+++ sc_context_t *ctx = card->ctx;
+++ sc_apdu_t apdu;
++ u8 ins = 0xDA;
++ u8 p1 = tag >> 8;
++ u8 p2 = tag & 0xFF;
++ u8 apdu_case = SC_APDU_CASE_3;
++ int r;
++
++- LOG_FUNC_CALLED(card->ctx);
++-
++- /* Check if the tag is writable */
++- affected_blob = pgp_find_blob(card, tag);
++-
++- /* Non-readable DOs have no represented blob, we have to check from pgp_get_info_by_tag */
++- if (affected_blob == NULL)
++- dinfo = pgp_get_info_by_tag(card, tag);
++- else
++- dinfo = affected_blob->info;
++-
++- if (dinfo == NULL) {
++- sc_log(card->ctx, "The DO %04X does not exist.", tag);
++- LOG_FUNC_RETURN(card->ctx, SC_ERROR_INVALID_ARGUMENTS);
++- }
++- else if ((dinfo->access & WRITE_MASK) == WRITE_NEVER) {
++- sc_log(card->ctx, "DO %04X is not writable.", tag);
++- LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_ALLOWED);
++- }
++-
++- /* Check data size.
++- * We won't check other DOs than 7F21 (certificate), because their capacity
++- * is hard-codded and may change in various version of the card. If we check here,
++- * the driver may be sticked to a limit version number of card.
++- * 7F21 size is soft-coded, so we can check it. */
++- if (tag == DO_CERT && buf_len > priv->max_cert_size) {
++- sc_log(card->ctx, "Data size %ld exceeds DO size limit %ld.", buf_len, priv->max_cert_size);
++- LOG_FUNC_RETURN(card->ctx, SC_ERROR_WRONG_LENGTH);
++- }
+++ LOG_FUNC_CALLED(ctx);
++
++ /* Extended Header list (004D DO) needs a variant of PUT DATA command */
++ if (tag == 0x004D) {
++@@ -1268,15 +1301,70 @@ pgp_put_data(sc_card_t *card, unsigned i
++ apdu.lc = buf_len;
++ }
++ else {
+++ /* This case is to empty DO */
++ sc_format_apdu(card, &apdu, SC_APDU_CASE_1, ins, p1, p2);
++ }
++
++ /* Send APDU to card */
++ r = sc_transmit_apdu(card, &apdu);
++- LOG_TEST_RET(card->ctx, r, "APDU transmit failed");
+++ LOG_TEST_RET(ctx, r, "APDU transmit failed");
++ /* Check response */
++ r = sc_check_sw(card, apdu.sw1, apdu.sw2);
++
+++ if (r < 0)
+++ LOG_FUNC_RETURN(ctx, r);
+++
+++ LOG_FUNC_RETURN(ctx, buf_len);
+++}
+++
+++/* ABI: PUT DATA */
+++static int
+++pgp_put_data(sc_card_t *card, unsigned int tag, const u8 *buf, size_t buf_len)
+++{
+++ struct pgp_priv_data *priv = DRVDATA(card);
+++ struct blob *affected_blob = NULL;
+++ struct do_info *dinfo = NULL;
+++ int r;
+++
+++ LOG_FUNC_CALLED(card->ctx);
+++
+++ /* Check if the tag is writable */
+++ if (priv->current->id != tag)
+++ affected_blob = pgp_find_blob(card, tag);
+++
+++ /* Non-readable DOs have no represented blob, we have to check from pgp_get_info_by_tag */
+++ if (affected_blob == NULL)
+++ dinfo = pgp_get_info_by_tag(card, tag);
+++ else
+++ dinfo = affected_blob->info;
+++
+++ if (dinfo == NULL) {
+++ sc_log(card->ctx, "The DO %04X does not exist.", tag);
+++ LOG_FUNC_RETURN(card->ctx, SC_ERROR_INVALID_ARGUMENTS);
+++ }
+++ else if ((dinfo->access & WRITE_MASK) == WRITE_NEVER) {
+++ sc_log(card->ctx, "DO %04X is not writable.", tag);
+++ LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_ALLOWED);
+++ }
+++
+++ /* Check data size.
+++ * We won't check other DOs than 7F21 (certificate), because their capacity
+++ * is hard-codded and may change in various version of the card. If we check here,
+++ * the driver may be sticked to a limit version number of card.
+++ * 7F21 size is soft-coded, so we can check it. */
+++ if (tag == DO_CERT && buf_len > priv->max_cert_size) {
+++ sc_log(card->ctx, "Data size %ld exceeds DO size limit %ld.", buf_len, priv->max_cert_size);
+++ LOG_FUNC_RETURN(card->ctx, SC_ERROR_WRONG_LENGTH);
+++ }
+++
+++ if (tag == DO_CERT && card->type == SC_CARD_TYPE_OPENPGP_GNUK) {
+++ /* Gnuk need a special way to write certificate. */
+++ r = gnuk_write_certificate(card, buf, buf_len);
+++ }
+++ else {
+++ r = pgp_put_data_plain(card, tag, buf, buf_len);
+++ }
+++
++ /* Instruct more in case of error */
++ if (r == SC_ERROR_SECURITY_STATUS_NOT_SATISFIED) {
++ sc_debug(card->ctx, SC_LOG_DEBUG_VERBOSE, "Please verify PIN first.");
+diff --git a/feeds/packages/utils/opensc/patches/0013-pkcs15-openpgp-Change-to-sc_put_data-instead-of-sc_u.patch b/feeds/packages/utils/opensc/patches/0013-pkcs15-openpgp-Change-to-sc_put_data-instead-of-sc_u.patch
+new file mode 100644
+index 0000000..c785a0d
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0013-pkcs15-openpgp-Change-to-sc_put_data-instead-of-sc_u.patch
+@@ -0,0 +1,28 @@
++From 7823e836e8279c8d77786d8f10ffaa83cf50bf1d Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Wed, 10 Apr 2013 18:35:58 +0700
++Subject: [PATCH 13/26] pkcs15-openpgp: Change to sc_put_data instead of
++ sc_update_binary when writing certificate.
++
++---
++ src/pkcs15init/pkcs15-openpgp.c | 5 ++---
++ 1 file changed, 2 insertions(+), 3 deletions(-)
++
++Index: opensc-20150513/src/pkcs15init/pkcs15-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/pkcs15init/pkcs15-openpgp.c
+++++ opensc-20150513/src/pkcs15init/pkcs15-openpgp.c
++@@ -279,10 +279,9 @@ static int openpgp_store_data(struct sc_
++ r = sc_select_file(card, path, &file);
++ LOG_TEST_RET(card->ctx, r, "Cannot select cert file");
++ r = sc_pkcs15init_authenticate(profile, p15card, file, SC_AC_OP_UPDATE);
+++ sc_log(card->ctx, "Data to write is %d long", content->len);
++ if (r >= 0 && content->len)
++- r = sc_update_binary(p15card->card, 0,
++- (const unsigned char *) content->value,
++- content->len, 0);
+++ r = sc_put_data(p15card->card, 0x7F21, (const unsigned char *) content->value, content->len);
++ break;
++
++ case SC_PKCS15_TYPE_DATA_OBJECT:
+diff --git a/feeds/packages/utils/opensc/patches/0014-OpenPGP-Overcome-the-restriction-of-even-data-length.patch b/feeds/packages/utils/opensc/patches/0014-OpenPGP-Overcome-the-restriction-of-even-data-length.patch
+new file mode 100644
+index 0000000..884e4fa
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0014-OpenPGP-Overcome-the-restriction-of-even-data-length.patch
+@@ -0,0 +1,50 @@
++From 3ff1f7234abb4c42273adedbe06d9e7f9f3a5f9d Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Thu, 11 Apr 2013 16:18:31 +0700
++Subject: [PATCH 14/26] OpenPGP: Overcome the restriction of even data length
++ of Gnuk.
++
++When write certificate with odd length to Gnuk, we add zero padding to make it even.
++---
++ src/libopensc/card-openpgp.c | 20 ++++++++++++++++++--
++ 1 file changed, 18 insertions(+), 2 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -1216,6 +1216,10 @@ static int gnuk_write_certificate(sc_car
++ sc_apdu_t apdu;
++ u8 *part;
++ size_t plen;
+++ /* Two round_ variables below are to build APDU data
+++ * with even length for Gnuk */
+++ u8 roundbuf[256];
+++ size_t roundlen = 0;
++ int r = SC_SUCCESS;
++
++ LOG_FUNC_CALLED(ctx);
++@@ -1246,8 +1250,20 @@ static int gnuk_write_certificate(sc_car
++ sc_format_apdu(card, &apdu, SC_APDU_CASE_3_SHORT, 0xD6, i, 0);
++ }
++ apdu.flags |= SC_APDU_FLAGS_CHAINING;
++- apdu.data = part;
++- apdu.datalen = apdu.lc = plen;
+++
+++ /* If the last part has odd length, we add zero padding to make it even.
+++ * Gnuk does not allow data with odd length */
+++ if (plen < 256 && (plen % 2) != 0) {
+++ roundlen = plen + 1;
+++ memset(roundbuf, 0, roundlen);
+++ memcpy(roundbuf, part, plen);
+++ apdu.data = roundbuf;
+++ apdu.datalen = apdu.lc = roundlen;
+++ }
+++ else {
+++ apdu.data = part;
+++ apdu.datalen = apdu.lc = plen;
+++ }
++
++ r = sc_transmit_apdu(card, &apdu);
++ LOG_TEST_RET(card->ctx, r, "APDU transmit failed");
+diff --git a/feeds/packages/utils/opensc/patches/0015-OpenPGP-Delete-key-as-file-for-Gnuk.patch b/feeds/packages/utils/opensc/patches/0015-OpenPGP-Delete-key-as-file-for-Gnuk.patch
+new file mode 100644
+index 0000000..e9ac9d3
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0015-OpenPGP-Delete-key-as-file-for-Gnuk.patch
+@@ -0,0 +1,89 @@
++From 9af45c4cf052e3a6059a3004082f9ee3d2b3b2bf Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Fri, 12 Apr 2013 15:33:31 +0700
++Subject: [PATCH 15/26] OpenPGP: Delete key as file, for Gnuk.
++
++---
++ src/libopensc/card-openpgp.c | 51 +++++++++++++++++++++++++++++++++++++++++++-
++ 1 file changed, 50 insertions(+), 1 deletion(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -2448,6 +2448,44 @@ static int pgp_card_ctl(sc_card_t *card,
++ LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_SUPPORTED);
++ }
++
+++
+++/* Internal: Delete key */
+++static int
+++gnuk_delete_key(sc_card_t *card, u8 key_id)
+++{
+++ sc_context_t *ctx = card->ctx;
+++ int r = SC_SUCCESS;
+++ u8 *data = NULL;
+++
+++ LOG_FUNC_CALLED(ctx);
+++
+++ /* Delete fingerprint */
+++ sc_log(ctx, "Delete fingerprints");
+++ r = pgp_put_data(card, 0xC6 + key_id, NULL, 0);
+++ LOG_TEST_RET(ctx, r, "Failed to delete fingerprints");
+++ /* Delete creation time */
+++ sc_log(ctx, "Delete creation time");
+++ r = pgp_put_data(card, 0xCD + key_id, NULL, 0);
+++ LOG_TEST_RET(ctx, r, "Failed to delete creation time");
+++
+++ /* Rewrite Extended Header List */
+++ sc_log(ctx, "Rewrite Extended Header List");
+++
+++ if (key_id == 1)
+++ data = "\x4D\x02\xB6";
+++ else if (key_id == 2)
+++ data = "\x4D\x02\xB8";
+++ else if (key_id == 3)
+++ data = "\x4D\x02\xA4";
+++ else
+++ LOG_FUNC_RETURN(ctx, SC_ERROR_INVALID_ARGUMENTS);
+++
+++ r = pgp_put_data(card, 0x4D, data, strlen(data) + 1);
+++
+++ LOG_FUNC_RETURN(ctx, r);
+++}
+++
+++
++ /* ABI: DELETE FILE */
++ static int
++ pgp_delete_file(sc_card_t *card, const sc_path_t *path)
++@@ -2455,6 +2493,7 @@ pgp_delete_file(sc_card_t *card, const s
++ struct pgp_priv_data *priv = DRVDATA(card);
++ struct blob *blob;
++ sc_file_t *file;
+++ u8 key_id;
++ int r;
++
++ LOG_FUNC_CALLED(card->ctx);
++@@ -2470,10 +2509,20 @@ pgp_delete_file(sc_card_t *card, const s
++ if (blob == priv->mf)
++ LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_SUPPORTED);
++
++- if (file->id == 0xB601 || file->id == 0xB801 || file->id == 0xA401) {
+++ if (card->type != SC_CARD_TYPE_OPENPGP_GNUK &&
+++ (file->id == 0xB601 || file->id == 0xB801 || file->id == 0xA401)) {
++ /* These tags are just symbolic. We don't really delete it. */
++ r = SC_SUCCESS;
++ }
+++ else if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && file->id == 0xB601) {
+++ r = gnuk_delete_key(card, 1);
+++ }
+++ else if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && file->id == 0xB801) {
+++ r = gnuk_delete_key(card, 2);
+++ }
+++ else if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && file->id == 0xA401) {
+++ r = gnuk_delete_key(card, 3);
+++ }
++ else {
++ /* call pgp_put_data() with zero-sized NULL-buffer to zap the DO contents */
++ r = pgp_put_data(card, file->id, NULL, 0);
+diff --git a/feeds/packages/utils/opensc/patches/0016-OpenPGP-Correct-parameter-checking.patch b/feeds/packages/utils/opensc/patches/0016-OpenPGP-Correct-parameter-checking.patch
+new file mode 100644
+index 0000000..3f80a06
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0016-OpenPGP-Correct-parameter-checking.patch
+@@ -0,0 +1,44 @@
++From ee23d262768e7e54ed0fc554bc0b869c65868ace Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Tue, 16 Apr 2013 10:19:34 +0700
++Subject: [PATCH 16/26] OpenPGP: Correct parameter checking.
++
++---
++ src/libopensc/card-openpgp.c | 9 +++++++--
++ 1 file changed, 7 insertions(+), 2 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -1231,6 +1231,8 @@ static int gnuk_write_certificate(sc_car
++ LOG_TEST_RET(card->ctx, r, "APDU transmit failed");
++ /* Check response */
++ r = sc_check_sw(card, apdu.sw1, apdu.sw2);
+++ if (r < 0)
+++ LOG_FUNC_RETURN(card->ctx, r);
++ LOG_FUNC_RETURN(card->ctx, length);
++ }
++
++@@ -2459,6 +2461,11 @@ gnuk_delete_key(sc_card_t *card, u8 key_
++
++ LOG_FUNC_CALLED(ctx);
++
+++ if (key_id < 1 || key_id > 3) {
+++ sc_log(ctx, "Key ID %d is invalid. Should be 1, 2 or 3.", key_id);
+++ LOG_FUNC_RETURN(ctx, SC_ERROR_INVALID_ARGUMENTS);
+++ }
+++
++ /* Delete fingerprint */
++ sc_log(ctx, "Delete fingerprints");
++ r = pgp_put_data(card, 0xC6 + key_id, NULL, 0);
++@@ -2477,8 +2484,6 @@ gnuk_delete_key(sc_card_t *card, u8 key_
++ data = "\x4D\x02\xB8";
++ else if (key_id == 3)
++ data = "\x4D\x02\xA4";
++- else
++- LOG_FUNC_RETURN(ctx, SC_ERROR_INVALID_ARGUMENTS);
++
++ r = pgp_put_data(card, 0x4D, data, strlen(data) + 1);
++
+diff --git a/feeds/packages/utils/opensc/patches/0017-OpenPGP-Make-code-neater.patch b/feeds/packages/utils/opensc/patches/0017-OpenPGP-Make-code-neater.patch
+new file mode 100644
+index 0000000..25a23e2
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0017-OpenPGP-Make-code-neater.patch
+@@ -0,0 +1,36 @@
++From f4aec38233010953cea72c367bccc71c3687b2f1 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Tue, 16 Apr 2013 16:02:17 +0700
++Subject: [PATCH 17/26] OpenPGP: Make code neater
++
++---
++ src/libopensc/card-openpgp.c | 8 ++------
++ 1 file changed, 2 insertions(+), 6 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -1230,10 +1230,7 @@ static int gnuk_write_certificate(sc_car
++ r = sc_transmit_apdu(card, &apdu);
++ LOG_TEST_RET(card->ctx, r, "APDU transmit failed");
++ /* Check response */
++- r = sc_check_sw(card, apdu.sw1, apdu.sw2);
++- if (r < 0)
++- LOG_FUNC_RETURN(card->ctx, r);
++- LOG_FUNC_RETURN(card->ctx, length);
+++ LOG_TEST_RET(card->ctx, sc_check_sw(card, apdu.sw1, apdu.sw2), "Certificate writing failed");
++ }
++
++ /* Ref: gnuk_put_binary_libusb.py and gnuk_token.py in Gnuk source tree */
++@@ -1270,8 +1267,7 @@ static int gnuk_write_certificate(sc_car
++ r = sc_transmit_apdu(card, &apdu);
++ LOG_TEST_RET(card->ctx, r, "APDU transmit failed");
++ /* Check response */
++- r = sc_check_sw(card, apdu.sw1, apdu.sw2);
++- LOG_TEST_RET(card->ctx, r, "UPDATE BINARY returned error");
+++ LOG_TEST_RET(card->ctx, sc_check_sw(card, apdu.sw1, apdu.sw2), "UPDATE BINARY returned error");
++
++ /* To next part */
++ i++;
+diff --git a/feeds/packages/utils/opensc/patches/0018-Move-declaration-to-top-of-block.patch b/feeds/packages/utils/opensc/patches/0018-Move-declaration-to-top-of-block.patch
+new file mode 100644
+index 0000000..2d617b5
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0018-Move-declaration-to-top-of-block.patch
+@@ -0,0 +1,31 @@
++From c84c84169f7a73eab27f6a9b13b77432baa5c3f8 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Wed, 8 May 2013 16:51:21 +0700
++Subject: [PATCH 18/26] Move declaration to top of block.
++
++---
++ src/libopensc/card-openpgp.c | 3 ++-
++ 1 file changed, 2 insertions(+), 1 deletion(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -746,6 +746,7 @@ pgp_read_blob(sc_card_t *card, struct bl
++ u8 buffer[2048];
++ size_t buf_len = (card->caps & SC_CARD_CAP_APDU_EXT)
++ ? sizeof(buffer) : 256;
+++ int r = SC_SUCCESS;
++
++ /* Buffer length for certificate */
++ if (blob->id == DO_CERT && priv->max_cert_size > 0) {
++@@ -759,7 +760,7 @@ pgp_read_blob(sc_card_t *card, struct bl
++ buf_len = MAXLEN_RESP_PUBKEY_GNUK;
++ }
++
++- int r = blob->info->get_fn(card, blob->id, buffer, buf_len);
+++ r = blob->info->get_fn(card, blob->id, buffer, buf_len);
++
++ if (r < 0) { /* an error occurred */
++ blob->status = r;
+diff --git a/feeds/packages/utils/opensc/patches/0019-OpenPGP-Make-indentation-consistent-space-tab.patch b/feeds/packages/utils/opensc/patches/0019-OpenPGP-Make-indentation-consistent-space-tab.patch
+new file mode 100644
+index 0000000..6130fa4
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0019-OpenPGP-Make-indentation-consistent-space-tab.patch
+@@ -0,0 +1,179 @@
++From c6abf7976f64be5191dc80fecdbcb07daab7a2e0 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Sun, 3 Nov 2013 01:45:56 +0800
++Subject: [PATCH 19/26] OpenPGP: Make indentation consistent (space -> tab).
++
++---
++ src/libopensc/card-openpgp.c | 22 ++++++++---------
++ src/tools/openpgp-tool.c | 56 ++++++++++++++++++++++----------------------
++ 2 files changed, 39 insertions(+), 39 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -194,12 +194,12 @@ static struct do_info pgp1_objects[] =
++ { 0x5f35, SIMPLE, READ_ALWAYS | WRITE_PIN3, NULL, sc_put_data },
++ { 0x5f50, SIMPLE, READ_ALWAYS | WRITE_PIN3, sc_get_data, sc_put_data },
++ { 0x7f49, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, NULL, NULL },
++- { 0xa400, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
++- { 0xa401, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++- { 0xb600, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
++- { 0xb601, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++- { 0xb800, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
++- { 0xb801, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { 0xa400, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
+++ { 0xa401, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { 0xb600, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
+++ { 0xb601, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { 0xb800, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
+++ { 0xb801, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++ { 0, 0, 0, NULL, NULL },
++ };
++
++@@ -255,11 +255,11 @@ static struct do_info pgp2_objects[] =
++ /* The 0xA401, 0xB601, 0xB801 are just symbolic, it does not represent any real DO.
++ * However, their R/W access condition may block the process of importing key in pkcs15init.
++ * So we set their accesses condition as WRITE_PIN3 (writable). */
++- { 0xa401, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++- { 0xb600, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
++- { 0xb601, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++- { 0xb800, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
++- { 0xb801, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { 0xa401, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { 0xb600, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
+++ { 0xb601, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { 0xb800, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
+++ { 0xb801, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++ { 0, 0, 0, NULL, NULL },
++ };
++
++Index: opensc-20150513/src/tools/openpgp-tool.c
++===================================================================
++--- opensc-20150513.orig/src/tools/openpgp-tool.c
+++++ opensc-20150513/src/tools/openpgp-tool.c
++@@ -37,11 +37,11 @@
++ #include "util.h"
++ #include "libopensc/log.h"
++
++-#define OPT_RAW 256
++-#define OPT_PRETTY 257
++-#define OPT_VERIFY 258
++-#define OPT_PIN 259
++-#define OPT_DELKEY 260
+++#define OPT_RAW 256
+++#define OPT_PRETTY 257
+++#define OPT_VERIFY 258
+++#define OPT_PIN 259
+++#define OPT_DELKEY 260
++
++ /* define structures */
++ struct ef_name_map {
++@@ -142,10 +142,10 @@ static const struct ef_name_map openpgp_
++ static void show_version(void)
++ {
++ fprintf(stderr,
++- "openpgp-tool - OpenPGP card utility version " PACKAGE_VERSION "\n"
++- "\n"
++- "Copyright (c) 2012 Peter Marschall <peter@adpm.de>\n"
++- "Licensed under LGPL v2\n");
+++ "openpgp-tool - OpenPGP card utility version " PACKAGE_VERSION "\n"
+++ "\n"
+++ "Copyright (c) 2012 Peter Marschall <peter@adpm.de>\n"
+++ "Licensed under LGPL v2\n");
++ }
++
++
++@@ -176,16 +176,16 @@ static char *prettify_language(char *str
++ {
++ if (str != NULL) {
++ switch (strlen(str)) {
++- case 8: memmove(str+7, str+6, 1+strlen(str+6));
+++ case 8: memmove(str+7, str+6, 1+strlen(str+6));
++ str[6] = ',';
++ /* fall through */
++- case 6: memmove(str+5, str+4, 1+strlen(str+4));
+++ case 6: memmove(str+5, str+4, 1+strlen(str+4));
++ str[4] = ',';
++ /* fall through */
++- case 4: memmove(str+3, str+2, 1+strlen(str+2));
+++ case 4: memmove(str+3, str+2, 1+strlen(str+2));
++ str[2] = ',';
++ /* fall through */
++- case 2: return str;
+++ case 2: return str;
++ }
++ }
++ return NULL;
++@@ -197,10 +197,10 @@ static char *prettify_gender(char *str)
++ {
++ if (str != NULL) {
++ switch (*str) {
++- case '0': return "unknown";
++- case '1': return "male";
++- case '2': return "female";
++- case '9': return "not applicable";
+++ case '0': return "unknown";
+++ case '1': return "male";
+++ case '2': return "female";
+++ case '9': return "not applicable";
++ }
++ }
++ return NULL;
++@@ -218,7 +218,7 @@ static void display_data(const struct ef
++ char *envvar;
++
++ envvar = malloc(strlen(mapping->env_name) +
++- strlen(value) + 2);
+++ strlen(value) + 2);
++ if (envvar != NULL) {
++ strcpy(envvar, mapping->env_name);
++ strcat(envvar, "=");
++@@ -344,20 +344,20 @@ static int do_userinfo(sc_card_t *card)
++ if (!count)
++ continue;
++
++- if (count > (int)sizeof(buf) - 1) {
+++ if (count > (int)sizeof(buf) - 1) {
++ fprintf(stderr, "Too small buffer to read the OpenPGP data\n");
++ return EXIT_FAILURE;
++ }
++-
++- r = sc_read_binary(card, 0, buf, count, 0);
++- if (r < 0) {
+++
+++ r = sc_read_binary(card, 0, buf, count, 0);
+++ if (r < 0) {
++ fprintf(stderr, "%s: read failed - %s\n", openpgp_data[i].ef, sc_strerror(r));
++ return EXIT_FAILURE;
++- }
++- if (r != count) {
++- fprintf(stderr, "%s: expecting %d, got only %d bytes\n", openpgp_data[i].ef, count, r);
+++ }
+++ if (r != count) {
+++ fprintf(stderr, "%s: expecting %d, got only %d bytes\n", openpgp_data[i].ef, count, r);
++ return EXIT_FAILURE;
++- }
+++ }
++
++ buf[count] = '\0';
++
++@@ -628,7 +628,7 @@ int main(int argc, char **argv)
++ r = sc_context_create(&ctx, &ctx_param);
++ if (r) {
++ util_fatal("failed to establish context: %s\n",
++- sc_strerror(r));
+++ sc_strerror(r));
++ return EXIT_FAILURE;
++ }
++
++@@ -640,7 +640,7 @@ int main(int argc, char **argv)
++ r = util_connect_card(ctx, &card, opt_reader, opt_wait, verbose);
++ if (r) {
++ util_fatal("failed to connect to card: %s\n",
++- sc_strerror(r));
+++ sc_strerror(r));
++ return EXIT_FAILURE;
++ }
++
+diff --git a/feeds/packages/utils/opensc/patches/0020-OpenPGP-Don-t-use-sc_log-in-openpgp-tool.patch b/feeds/packages/utils/opensc/patches/0020-OpenPGP-Don-t-use-sc_log-in-openpgp-tool.patch
+new file mode 100644
+index 0000000..dbd7bc0
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0020-OpenPGP-Don-t-use-sc_log-in-openpgp-tool.patch
+@@ -0,0 +1,81 @@
++From 9acf5c1ad7d8a32b472203d3bd8860ea2cbde0e7 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Sun, 3 Nov 2013 02:53:35 +0800
++Subject: [PATCH 20/26] OpenPGP: Don't use sc_log in openpgp-tool.
++
++---
++ src/tools/openpgp-tool.c | 21 +++++++++++----------
++ 1 file changed, 11 insertions(+), 10 deletions(-)
++
++Index: opensc-20150513/src/tools/openpgp-tool.c
++===================================================================
++--- opensc-20150513.orig/src/tools/openpgp-tool.c
+++++ opensc-20150513/src/tools/openpgp-tool.c
++@@ -414,8 +414,6 @@ int do_genkey(sc_card_t *card, u8 key_id
++ sc_path_t path;
++ sc_file_t *file;
++
++- LOG_FUNC_CALLED(card->ctx);
++-
++ if (key_id < 1 || key_id > 3) {
++ printf("Unknown key ID %d.\n", key_id);
++ return 1;
++@@ -479,14 +477,14 @@ int delete_key_gnuk(sc_card_t *card, u8
++ u8 *data = NULL;
++
++ /* Delete fingerprint */
++- sc_log(ctx, "Delete fingerprints");
+++ fprintf(stdout, "Delete fingerprints");
++ r |= sc_put_data(card, 0xC6 + key_id, NULL, 0);
++ /* Delete creation time */
++- sc_log(ctx, "Delete creation time");
+++ fprintf(stdout, "Delete creation time");
++ r |= sc_put_data(card, 0xCD + key_id, NULL, 0);
++
++ /* Rewrite Extended Header List */
++- sc_log(ctx, "Rewrite Extended Header List");
+++ fprintf(stdout, "Rewrite Extended Header List");
++
++ if (key_id == 1)
++ data = "\x4D\x02\xB6";
++@@ -534,15 +532,18 @@ int delete_key_openpgp(sc_card_t *card,
++ /* Build APDU from binary array */
++ r = sc_bytes2apdu(card->ctx, buf, len0, &apdu);
++ if (r) {
++- sc_log(ctx, "Failed to build APDU");
++- LOG_FUNC_RETURN(ctx, SC_ERROR_INTERNAL);
+++ fprintf(stderr, "Failed to build APDU: %s\n", sc_strerror(r));
+++ return r;
++ }
++ apdu.resp = rbuf;
++ apdu.resplen = sizeof(rbuf);
++
++ /* Send APDU to card */
++ r = sc_transmit_apdu(card, &apdu);
++- LOG_TEST_RET(ctx, r, "Transmiting APDU failed");
+++ if (r) {
+++ fprintf(stderr, "Transmiting APDU failed: %s\n", sc_strerror(r));
+++ return r;
+++ }
++ }
++ /* TODO: Rewrite Extended Header List.
++ * Not support by OpenGPG v2 yet */
++@@ -557,7 +558,7 @@ int delete_key(sc_card_t *card, u8 key_i
++ LOG_FUNC_CALLED(ctx);
++ /* Check key ID */
++ if (key_id < 1 || key_id > 3) {
++- sc_log(ctx, "Invalid key ID %d", key_id);
+++ fprintf(stderr, "Invalid key ID %d", key_id);
++ LOG_FUNC_RETURN(ctx, SC_ERROR_INVALID_ARGUMENTS);
++ }
++
++@@ -649,7 +650,7 @@ int main(int argc, char **argv)
++ (card->type != SC_CARD_TYPE_OPENPGP_V2) &&
++ (card->type != SC_CARD_TYPE_OPENPGP_GNUK)) {
++ util_error("not an OpenPGP card");
++- sc_log(card->ctx, "Card type %X", card->type);
+++ fprintf(stderr, "Card type %X\n", card->type);
++ exit_status = EXIT_FAILURE;
++ goto out;
++ }
+diff --git a/feeds/packages/utils/opensc/patches/0021-OpenPGP-Don-t-reimplement-gnuk_delete_key-in-openpgp.patch b/feeds/packages/utils/opensc/patches/0021-OpenPGP-Don-t-reimplement-gnuk_delete_key-in-openpgp.patch
+new file mode 100644
+index 0000000..c84ef8e
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0021-OpenPGP-Don-t-reimplement-gnuk_delete_key-in-openpgp.patch
+@@ -0,0 +1,109 @@
++From 0fdbf868976172486af210accafbab163452ff78 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Sun, 3 Nov 2013 11:26:25 +0800
++Subject: [PATCH 21/26] OpenPGP: Don't reimplement gnuk_delete_key in
++ openpgp-tool.
++
++---
++ src/tools/openpgp-tool.c | 64 ++++++------------------------------------------
++ 1 file changed, 8 insertions(+), 56 deletions(-)
++
++Index: opensc-20150513/src/tools/openpgp-tool.c
++===================================================================
++--- opensc-20150513.orig/src/tools/openpgp-tool.c
+++++ opensc-20150513/src/tools/openpgp-tool.c
++@@ -468,38 +468,6 @@ int do_verify(sc_card_t *card, char *typ
++ }
++
++ /**
++- * Delete key, for Gnuk.
++- **/
++-int delete_key_gnuk(sc_card_t *card, u8 key_id)
++-{
++- sc_context_t *ctx = card->ctx;
++- int r = SC_SUCCESS;
++- u8 *data = NULL;
++-
++- /* Delete fingerprint */
++- fprintf(stdout, "Delete fingerprints");
++- r |= sc_put_data(card, 0xC6 + key_id, NULL, 0);
++- /* Delete creation time */
++- fprintf(stdout, "Delete creation time");
++- r |= sc_put_data(card, 0xCD + key_id, NULL, 0);
++-
++- /* Rewrite Extended Header List */
++- fprintf(stdout, "Rewrite Extended Header List");
++-
++- if (key_id == 1)
++- data = "\x4D\x02\xB6";
++- else if (key_id == 2)
++- data = "\x4D\x02\xB8";
++- else if (key_id == 3)
++- data = "\x4D\x02\xA4";
++- else
++- return SC_ERROR_INVALID_ARGUMENTS;
++-
++- r |= sc_put_data(card, 0x4D, data, strlen(data) + 1);
++- return r;
++-}
++-
++-/**
++ * Delete key, for OpenPGP card.
++ * This function is not complete and is reserved for future version (> 2) of OpenPGP card.
++ **/
++@@ -547,32 +515,13 @@ int delete_key_openpgp(sc_card_t *card,
++ }
++ /* TODO: Rewrite Extended Header List.
++ * Not support by OpenGPG v2 yet */
++- LOG_FUNC_RETURN(ctx, r);
++-}
++-
++-int delete_key(sc_card_t *card, u8 key_id)
++-{
++- sc_context_t *ctx = card->ctx;
++- int r;
++-
++- LOG_FUNC_CALLED(ctx);
++- /* Check key ID */
++- if (key_id < 1 || key_id > 3) {
++- fprintf(stderr, "Invalid key ID %d", key_id);
++- LOG_FUNC_RETURN(ctx, SC_ERROR_INVALID_ARGUMENTS);
++- }
++-
++- if (card->type == SC_CARD_TYPE_OPENPGP_GNUK)
++- r = delete_key_gnuk(card, key_id);
++- else
++- r = delete_key_openpgp(card, key_id);
++-
++- LOG_FUNC_RETURN(ctx, r);
+++ return r;
++ }
++
++ int do_delete_key(sc_card_t *card, u8 key_id)
++ {
++ sc_context_t *ctx = card->ctx;
+++ sc_path_t path;
++ int r = SC_SUCCESS;
++
++ /* Currently, only Gnuk supports deleting keys */
++@@ -586,13 +535,16 @@ int do_delete_key(sc_card_t *card, u8 ke
++ return SC_ERROR_INVALID_ARGUMENTS;
++ }
++ if (key_id == 1 || key_id == 'a') {
++- r |= delete_key(card, 1);
+++ sc_format_path("B601", &path);
+++ r |= sc_delete_file(card, &path);
++ }
++ if (key_id == 2 || key_id == 'a') {
++- r |= delete_key(card, 2);
+++ sc_format_path("B801", &path);
+++ r |= sc_delete_file(card, &path);
++ }
++ if (key_id == 3 || key_id == 'a') {
++- r |= delete_key(card, 3);
+++ sc_format_path("A401", &path);
+++ r |= sc_delete_file(card, &path);
++ }
++ return r;
++ }
+diff --git a/feeds/packages/utils/opensc/patches/0022-OpenPGP-Use-directly-binary-array-of-APDUs-for-ERASE.patch b/feeds/packages/utils/opensc/patches/0022-OpenPGP-Use-directly-binary-array-of-APDUs-for-ERASE.patch
+new file mode 100644
+index 0000000..20c66ef
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0022-OpenPGP-Use-directly-binary-array-of-APDUs-for-ERASE.patch
+@@ -0,0 +1,84 @@
++From 0cd2a488d86006bb2740a4e73e7a0d859e1bf33c Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Sun, 13 Jul 2014 17:37:59 +0800
++Subject: [PATCH 22/26] OpenPGP: Use directly binary array of APDUs for ERASE
++ command.
++
++I used a string presentation before and it needed an extra conversion step.
++---
++ src/libopensc/card-openpgp.c | 47 +++++++++++++++++++++++---------------------
++ 1 file changed, 25 insertions(+), 22 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -2358,24 +2358,27 @@ out:
++ static int pgp_erase_card(sc_card_t *card)
++ {
++ sc_context_t *ctx = card->ctx;
++- u8 *apdustring[10] = {
++- "00:20:00:81:08:40:40:40:40:40:40:40:40",
++- "00:20:00:81:08:40:40:40:40:40:40:40:40",
++- "00:20:00:81:08:40:40:40:40:40:40:40:40",
++- "00:20:00:81:08:40:40:40:40:40:40:40:40",
++- "00:20:00:83:08:40:40:40:40:40:40:40:40",
++- "00:20:00:83:08:40:40:40:40:40:40:40:40",
++- "00:20:00:83:08:40:40:40:40:40:40:40:40",
++- "00:20:00:83:08:40:40:40:40:40:40:40:40",
++- "00:e6:00:00",
++- "00:44:00:00"
+++ /* Special series of commands to erase OpenPGP card,
+++ * according to https://www.crypto-stick.com/en/faq
+++ * (How to reset a Crypto Stick? question).
+++ * Gnuk is known not to support this feature. */
+++ u8 apdu_binaries[10][13] = {
+++ {0, 0x20, 0, 0x81, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
+++ {0, 0x20, 0, 0x81, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
+++ {0, 0x20, 0, 0x81, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
+++ {0, 0x20, 0, 0x81, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
+++ {0, 0x20, 0, 0x83, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
+++ {0, 0x20, 0, 0x83, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
+++ {0, 0x20, 0, 0x83, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
+++ {0, 0x20, 0, 0x83, 0x08, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
+++ {0, 0xe6, 0, 0},
+++ {0, 0x44, 0, 0}
++ };
+++ u8 apdu_lens[10] = {13, 13, 13, 13, 13, 13, 13, 13, 4, 4};
++ u8 buf[SC_MAX_APDU_BUFFER_SIZE];
++ u8 rbuf[SC_MAX_APDU_BUFFER_SIZE];
++ sc_apdu_t apdu;
++- size_t len0;
++- int commandsnum = 10;
++- int i, r;
+++ int i, l, r;
++
++ LOG_FUNC_CALLED(ctx);
++
++@@ -2387,17 +2390,17 @@ static int pgp_erase_card(sc_card_t *car
++ sc_log(ctx, "Card is OpenPGP v2. Erase card.");
++
++ /* Iterate over 10 commands above */
++- for (i = 0; i < commandsnum; i++) {
++- /* Convert the string to binary array */
++- len0 = sizeof(buf);
++- sc_hex_to_bin(apdustring[i], buf, &len0);
++- printf("Sending: ");
++- for (r = 0; r < len0; r++)
++- printf("%02X ", buf[r]);
+++ for (i = 0; i < sizeof(apdu_lens); i++) {
+++ /* Length of the binary array of the current command */
+++ l = apdu_lens[i];
+++ /* Print the command to console */
+++ printf("Sending %d: ", i);
+++ for (r = 0; r < l; r++)
+++ printf("%02X ", apdu_binaries[i][r]);
++ printf("\n");
++
++ /* Build APDU from binary array */
++- r = sc_bytes2apdu(card->ctx, buf, len0, &apdu);
+++ r = sc_bytes2apdu(card->ctx, apdu_binaries[i], l, &apdu);
++ if (r) {
++ sc_log(ctx, "Failed to build APDU");
++ LOG_FUNC_RETURN(ctx, SC_ERROR_INTERNAL);
+diff --git a/feeds/packages/utils/opensc/patches/0023-OpenPGP-Rename-private-blob-type-to-avoid-confusing-.patch b/feeds/packages/utils/opensc/patches/0023-OpenPGP-Rename-private-blob-type-to-avoid-confusing-.patch
+new file mode 100644
+index 0000000..1eedf5f
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0023-OpenPGP-Rename-private-blob-type-to-avoid-confusing-.patch
+@@ -0,0 +1,336 @@
++From 6f56ea4cfc52323002d818731a50a31e863b6843 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Sun, 13 Jul 2014 19:41:36 +0800
++Subject: [PATCH 23/26] OpenPGP: Rename private "blob" type to avoid confusing
++ with variable name.
++
++This name has been used for both data type and variable name of that
++type.
++---
++ src/libopensc/card-openpgp.c | 96 ++++++++++++++++++++++----------------------
++ 1 file changed, 49 insertions(+), 47 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -113,9 +113,9 @@ enum _card_state {
++ CARD_STATE_ACTIVATED = 0x05
++ };
++
++-struct blob {
++- struct blob * next; /* pointer to next sibling */
++- struct blob * parent; /* pointer to parent */
+++typedef struct pgp_blob {
+++ struct pgp_blob * next; /* pointer to next sibling */
+++ struct pgp_blob * parent; /* pointer to parent */
++ struct do_info *info;
++
++ sc_file_t * file;
++@@ -124,8 +124,8 @@ struct blob {
++
++ unsigned char * data;
++ unsigned int len;
++- struct blob * files; /* pointer to 1st child */
++-};
+++ struct pgp_blob * files; /* pointer to 1st child */
+++} pgp_blob_t;
++
++ struct do_info {
++ unsigned int id; /* ID of the DO in question */
++@@ -143,12 +143,12 @@ struct do_info {
++
++ static int pgp_get_card_features(sc_card_t *card);
++ static int pgp_finish(sc_card_t *card);
++-static void pgp_iterate_blobs(struct blob *, int, void (*func)());
+++static void pgp_iterate_blobs(pgp_blob_t *, int, void (*func)());
++
++-static int pgp_get_blob(sc_card_t *card, struct blob *blob,
++- unsigned int id, struct blob **ret);
++-static struct blob * pgp_new_blob(sc_card_t *, struct blob *, unsigned int, sc_file_t *);
++-static void pgp_free_blob(struct blob *);
+++static int pgp_get_blob(sc_card_t *card, pgp_blob_t *blob,
+++ unsigned int id, pgp_blob_t **ret);
+++static pgp_blob_t * pgp_new_blob(sc_card_t *, pgp_blob_t *, unsigned int, sc_file_t *);
+++static void pgp_free_blob(pgp_blob_t *);
++ static int pgp_get_pubkey(sc_card_t *, unsigned int,
++ u8 *, size_t);
++ static int pgp_get_pubkey_pem(sc_card_t *, unsigned int,
++@@ -274,8 +274,8 @@ static struct do_info pgp2_objects[] =
++
++ #define DRVDATA(card) ((struct pgp_priv_data *) ((card)->drv_data))
++ struct pgp_priv_data {
++- struct blob * mf;
++- struct blob * current; /* currently selected file */
+++ pgp_blob_t * mf;
+++ pgp_blob_t * current; /* currently selected file */
++
++ enum _version bcd_version;
++ struct do_info *pgp_objects;
++@@ -313,7 +313,7 @@ pgp_init(sc_card_t *card)
++ sc_file_t *file = NULL;
++ struct do_info *info;
++ int r;
++- struct blob *child = NULL;
+++ pgp_blob_t *child = NULL;
++
++ LOG_FUNC_CALLED(card->ctx);
++
++@@ -397,7 +397,7 @@ pgp_get_card_features(sc_card_t *card)
++ unsigned char *hist_bytes = card->atr.value;
++ size_t atr_len = card->atr.len;
++ size_t i = 0;
++- struct blob *blob, *blob6e, *blob73;
+++ pgp_blob_t *blob, *blob6e, *blob73;
++
++ /* parse card capabilities from historical bytes */
++ while ((i < atr_len) && (hist_bytes[i] != 0x73))
++@@ -534,7 +534,7 @@ pgp_finish(sc_card_t *card)
++
++ /* internal: fill a blob's data */
++ static int
++-pgp_set_blob(struct blob *blob, const u8 *data, size_t len)
+++pgp_set_blob(pgp_blob_t *blob, const u8 *data, size_t len)
++ {
++ if (blob->data)
++ free(blob->data);
++@@ -628,16 +628,16 @@ pgp_attach_acl(sc_card_t *card, sc_file_
++ }
++
++ /* internal: append a blob to the list of children of a given parent blob */
++-static struct blob *
++-pgp_new_blob(sc_card_t *card, struct blob *parent, unsigned int file_id,
+++static pgp_blob_t *
+++pgp_new_blob(sc_card_t *card, pgp_blob_t *parent, unsigned int file_id,
++ sc_file_t *file)
++ {
++- struct blob *blob = NULL;
+++ pgp_blob_t *blob = NULL;
++
++ if (file == NULL)
++ return NULL;
++
++- if ((blob = calloc(1, sizeof(struct blob))) != NULL) {
+++ if ((blob = calloc(1, sizeof(pgp_blob_t))) != NULL) {
++ struct pgp_priv_data *priv = DRVDATA (card);
++ struct do_info *info;
++
++@@ -651,7 +651,7 @@ pgp_new_blob(sc_card_t *card, struct blo
++ blob->parent = parent;
++
++ if (parent != NULL) {
++- struct blob **p;
+++ pgp_blob_t **p;
++
++ /* set file's path = parent's path + file's id */
++ blob->file->path = parent->file->path;
++@@ -689,11 +689,11 @@ pgp_new_blob(sc_card_t *card, struct blo
++
++ /* internal: free a blob including its content */
++ static void
++-pgp_free_blob(struct blob *blob)
+++pgp_free_blob(pgp_blob_t *blob)
++ {
++ if (blob) {
++ if (blob->parent) {
++- struct blob **p;
+++ pgp_blob_t **p;
++
++ /* remove blob from list of parent's children */
++ for (p = &blob->parent->files; *p != NULL && *p != blob; p = &(*p)->next)
++@@ -713,14 +713,14 @@ pgp_free_blob(struct blob *blob)
++
++ /* internal: iterate through the blob tree, calling a function for each blob */
++ static void
++-pgp_iterate_blobs(struct blob *blob, int level, void (*func)())
+++pgp_iterate_blobs(pgp_blob_t *blob, int level, void (*func)())
++ {
++ if (blob) {
++ if (level > 0) {
++- struct blob *child = blob->files;
+++ pgp_blob_t *child = blob->files;
++
++ while (child != NULL) {
++- struct blob *next = child->next;
+++ pgp_blob_t *next = child->next;
++
++ pgp_iterate_blobs(child, level-1, func);
++ child = next;
++@@ -733,7 +733,7 @@ pgp_iterate_blobs(struct blob *blob, int
++
++ /* internal: read a blob's contents from card */
++ static int
++-pgp_read_blob(sc_card_t *card, struct blob *blob)
+++pgp_read_blob(sc_card_t *card, pgp_blob_t *blob)
++ {
++ struct pgp_priv_data *priv = DRVDATA (card);
++
++@@ -780,7 +780,7 @@ pgp_read_blob(sc_card_t *card, struct bl
++ * The OpenPGP card has a TLV encoding according ASN.1 BER-encoding rules.
++ */
++ static int
++-pgp_enumerate_blob(sc_card_t *card, struct blob *blob)
+++pgp_enumerate_blob(sc_card_t *card, pgp_blob_t *blob)
++ {
++ const u8 *in;
++ int r;
++@@ -797,7 +797,7 @@ pgp_enumerate_blob(sc_card_t *card, stru
++ unsigned int cla, tag, tmptag;
++ size_t len;
++ const u8 *data = in;
++- struct blob *new;
+++ pgp_blob_t *new;
++
++ r = sc_asn1_read_tag(&data, blob->len - (in - blob->data),
++ &cla, &tag, &len);
++@@ -827,10 +827,10 @@ pgp_enumerate_blob(sc_card_t *card, stru
++
++ /* internal: find a blob by ID below a given parent, filling its contents when necessary */
++ static int
++-pgp_get_blob(sc_card_t *card, struct blob *blob, unsigned int id,
++- struct blob **ret)
+++pgp_get_blob(sc_card_t *card, pgp_blob_t *blob, unsigned int id,
+++ pgp_blob_t **ret)
++ {
++- struct blob *child;
+++ pgp_blob_t *child;
++ int r;
++
++ if ((r = pgp_enumerate_blob(card, blob)) < 0)
++@@ -866,10 +866,10 @@ pgp_get_blob(sc_card_t *card, struct blo
++
++ /* Internal: search recursively for a blob by ID below a given root */
++ static int
++-pgp_seek_blob(sc_card_t *card, struct blob *root, unsigned int id,
++- struct blob **ret)
+++pgp_seek_blob(sc_card_t *card, pgp_blob_t *root, unsigned int id,
+++ pgp_blob_t **ret)
++ {
++- struct blob *child;
+++ pgp_blob_t *child;
++ int r;
++
++ if ((r = pgp_get_blob(card, root, id, ret)) == 0)
++@@ -891,11 +891,11 @@ pgp_seek_blob(sc_card_t *card, struct bl
++ }
++
++ /* internal: find a blob by tag - pgp_seek_blob with optimizations */
++-static struct blob *
+++static pgp_blob_t *
++ pgp_find_blob(sc_card_t *card, unsigned int tag)
++ {
++ struct pgp_priv_data *priv = DRVDATA(card);
++- struct blob *blob = NULL;
+++ pgp_blob_t *blob = NULL;
++ int r;
++
++ /* Check if current selected blob is which we want to test*/
++@@ -949,7 +949,7 @@ static int
++ pgp_select_file(sc_card_t *card, const sc_path_t *path, sc_file_t **ret)
++ {
++ struct pgp_priv_data *priv = DRVDATA(card);
++- struct blob *blob;
+++ pgp_blob_t *blob;
++ unsigned int path_start = 0;
++ unsigned int n;
++ sc_path_t dummy_path;
++@@ -1030,7 +1030,7 @@ static int
++ pgp_list_files(sc_card_t *card, u8 *buf, size_t buflen)
++ {
++ struct pgp_priv_data *priv = DRVDATA(card);
++- struct blob *blob;
+++ pgp_blob_t *blob;
++ unsigned int k;
++ int r;
++
++@@ -1066,7 +1066,7 @@ pgp_read_binary(sc_card_t *card, unsigne
++ u8 *buf, size_t count, unsigned long flags)
++ {
++ struct pgp_priv_data *priv = DRVDATA(card);
++- struct blob *blob;
+++ pgp_blob_t *blob;
++ int r;
++
++ LOG_FUNC_CALLED(card->ctx);
++@@ -1142,7 +1142,7 @@ static int
++ pgp_get_pubkey_pem(sc_card_t *card, unsigned int tag, u8 *buf, size_t buf_len)
++ {
++ struct pgp_priv_data *priv = DRVDATA(card);
++- struct blob *blob, *mod_blob, *exp_blob;
+++ pgp_blob_t *blob, *mod_blob, *exp_blob;
++ sc_pkcs15_pubkey_t pubkey;
++ u8 *data;
++ size_t len;
++@@ -1337,7 +1337,7 @@ static int
++ pgp_put_data(sc_card_t *card, unsigned int tag, const u8 *buf, size_t buf_len)
++ {
++ struct pgp_priv_data *priv = DRVDATA(card);
++- struct blob *affected_blob = NULL;
+++ pgp_blob_t *affected_blob = NULL;
++ struct do_info *dinfo = NULL;
++ int r;
++
++@@ -1611,7 +1611,7 @@ static int
++ pgp_update_new_algo_attr(sc_card_t *card, sc_cardctl_openpgp_keygen_info_t *key_info)
++ {
++ struct pgp_priv_data *priv = DRVDATA(card);
++- struct blob *algo_blob;
+++ pgp_blob_t *algo_blob;
++ unsigned int old_modulus_len; /* Measured in bit */
++ unsigned int old_exponent_len;
++ const unsigned int tag = 0x00C0 | key_info->keytype;
++@@ -1716,7 +1716,7 @@ pgp_calculate_and_store_fingerprint(sc_c
++ u8 *p; /* Use this pointer to set fp_buffer content */
++ size_t pk_packet_len;
++ unsigned int tag;
++- struct blob *fpseq_blob;
+++ pgp_blob_t *fpseq_blob;
++ u8 *newdata;
++ int r;
++
++@@ -1805,7 +1805,7 @@ pgp_update_pubkey_blob(sc_card_t *card,
++ u8* exponent, size_t exponent_len, u8 key_id)
++ {
++ struct pgp_priv_data *priv = DRVDATA(card);
++- struct blob *pk_blob;
+++ pgp_blob_t *pk_blob;
++ unsigned int blob_id;
++ sc_pkcs15_pubkey_t pubkey;
++ u8 *data = NULL;
++@@ -1947,6 +1947,8 @@ static int pgp_update_card_algorithms(sc
++ **/
++ static int pgp_gen_key(sc_card_t *card, sc_cardctl_openpgp_keygen_info_t *key_info)
++ {
+++ struct pgp_priv_data *priv = DRVDATA(card);
+++ pgp_blob_t *algo_blob;
++ sc_apdu_t apdu;
++ /* Temporary variables to hold APDU params */
++ u8 apdu_case;
++@@ -2143,7 +2145,7 @@ pgp_build_extended_header_list(sc_card_t
++ };
++ size_t comp_to_add = 3;
++ size_t req_e_len = 0; /* The exponent length specified in Algorithm Attributes */
++- struct blob *alat_blob;
+++ pgp_blob_t *alat_blob;
++ u8 i;
++ int r;
++
++@@ -2496,7 +2498,7 @@ static int
++ pgp_delete_file(sc_card_t *card, const sc_path_t *path)
++ {
++ struct pgp_priv_data *priv = DRVDATA(card);
++- struct blob *blob;
+++ pgp_blob_t *blob;
++ sc_file_t *file;
++ u8 key_id;
++ int r;
++@@ -2546,7 +2548,7 @@ pgp_update_binary(sc_card_t *card, unsig
++ const u8 *buf, size_t count, unsigned long flags)
++ {
++ struct pgp_priv_data *priv = DRVDATA(card);
++- struct blob *blob = priv->current;
+++ pgp_blob_t *blob = priv->current;
++ int r = SC_SUCCESS;
++
++ LOG_FUNC_CALLED(card->ctx);
+diff --git a/feeds/packages/utils/opensc/patches/0024-OpenPGP-Fix-crash-after-accessing-inexistent-file.patch b/feeds/packages/utils/opensc/patches/0024-OpenPGP-Fix-crash-after-accessing-inexistent-file.patch
+new file mode 100644
+index 0000000..22ae5f4
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0024-OpenPGP-Fix-crash-after-accessing-inexistent-file.patch
+@@ -0,0 +1,38 @@
++From 8a87a4ee9107f250254d5c93c6fd62224c400ce7 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Mon, 14 Jul 2014 01:30:28 +0800
++Subject: [PATCH 24/26] OpenPGP: Fix crash after accessing inexistent file.
++
++---
++ src/libopensc/card-openpgp.c | 3 ---
++ 1 file changed, 3 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -981,7 +981,6 @@ pgp_select_file(sc_card_t *card, const s
++ * So we set its size to be the same as max certificate size the card supports. */
++ (*ret)->size = priv->max_cert_size;
++ }
++- priv->current = NULL;
++ LOG_FUNC_RETURN(card->ctx, SC_SUCCESS);
++ }
++
++@@ -998,7 +997,6 @@ pgp_select_file(sc_card_t *card, const s
++ /* This file ID is refered when importing key&certificate via pkcs15init, like above.
++ * We pretend to successfully find this inexistent file. */
++ if (id == 0x4402 || id == 0x5f48) {
++- priv->current = NULL;
++ if (ret == NULL)
++ /* No need to return file */
++ LOG_FUNC_RETURN(card->ctx, SC_SUCCESS);
++@@ -1010,7 +1008,6 @@ pgp_select_file(sc_card_t *card, const s
++ }
++
++ if (r < 0) { /* failure */
++- priv->current = NULL;
++ LOG_FUNC_RETURN(card->ctx, r);
++ }
++ }
+diff --git a/feeds/packages/utils/opensc/patches/0025-Replace-hardcode.patch b/feeds/packages/utils/opensc/patches/0025-Replace-hardcode.patch
+new file mode 100644
+index 0000000..002bec3
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0025-Replace-hardcode.patch
+@@ -0,0 +1,145 @@
++From da70a41383e2ab81fbcc89fb1067f5a189e0fb97 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Sun, 9 Nov 2014 15:58:40 +0700
++Subject: [PATCH 25/26] Replace hardcode.
++
++---
++ src/libopensc/card-openpgp.c | 72 +++++++++++++++++++++++++-------------------
++ 1 file changed, 41 insertions(+), 31 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -154,6 +154,24 @@ static int pgp_get_pubkey(sc_card_t *,
++ static int pgp_get_pubkey_pem(sc_card_t *, unsigned int,
++ u8 *, size_t);
++
+++/* The DO holding X.509 certificate is constructed but does not contain child DO.
+++ * We should notice this when building fake file system later. */
+++#define DO_CERT 0x7f21
+++/* Control Reference Template of private keys. Ref: Section 4.3.3.7 of OpenPGP card v2 spec.
+++ * Here we seen it as DO just for convenient */
+++#define DO_SIGN 0xb600
+++#define DO_ENCR 0xb800
+++#define DO_AUTH 0xa400
+++/* These DO does not exist. They are defined and used just for ease of implementation */
+++#define DO_SIGN_SYM 0xb601
+++#define DO_ENCR_SYM 0xb801
+++#define DO_AUTH_SYM 0xa401
+++/* Maximum length for response buffer when reading pubkey. This value is calculated with
+++ * 4096-bit key length */
+++#define MAXLEN_RESP_PUBKEY 527
+++/* Gnuk only support 1 key length (2048 bit) */
+++#define MAXLEN_RESP_PUBKEY_GNUK 271
+++
++ static struct do_info pgp1_objects[] = { /* OpenPGP card spec 1.1 */
++ { 0x004f, SIMPLE, READ_ALWAYS | WRITE_NEVER, NULL, NULL },
++ { 0x005b, SIMPLE, READ_ALWAYS | WRITE_PIN3, NULL, sc_put_data },
++@@ -194,12 +212,12 @@ static struct do_info pgp1_objects[] =
++ { 0x5f35, SIMPLE, READ_ALWAYS | WRITE_PIN3, NULL, sc_put_data },
++ { 0x5f50, SIMPLE, READ_ALWAYS | WRITE_PIN3, sc_get_data, sc_put_data },
++ { 0x7f49, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, NULL, NULL },
++- { 0xa400, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
++- { 0xa401, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++- { 0xb600, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
++- { 0xb601, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++- { 0xb800, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
++- { 0xb801, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { DO_AUTH, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
+++ { DO_AUTH_SYM, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { DO_SIGN, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
+++ { DO_SIGN_SYM, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { DO_ENCR, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
+++ { DO_ENCR_SYM, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++ { 0, 0, 0, NULL, NULL },
++ };
++
++@@ -248,30 +266,21 @@ static struct do_info pgp2_objects[] =
++ { 0x5f52, SIMPLE, READ_ALWAYS | WRITE_NEVER, sc_get_data, NULL },
++ /* The 7F21 is constructed DO in spec, but in practice, its content can be retrieved
++ * as simple DO (no need to parse TLV). */
++- { 0x7f21, SIMPLE, READ_ALWAYS | WRITE_PIN3, sc_get_data, sc_put_data },
+++ { DO_CERT, SIMPLE, READ_ALWAYS | WRITE_PIN3, sc_get_data, sc_put_data },
++ { 0x7f48, CONSTRUCTED, READ_NEVER | WRITE_NEVER, NULL, NULL },
++ { 0x7f49, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, NULL, NULL },
++- { 0xa400, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
+++ { DO_AUTH, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
++ /* The 0xA401, 0xB601, 0xB801 are just symbolic, it does not represent any real DO.
++ * However, their R/W access condition may block the process of importing key in pkcs15init.
++ * So we set their accesses condition as WRITE_PIN3 (writable). */
++- { 0xa401, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++- { 0xb600, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
++- { 0xb601, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++- { 0xb800, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
++- { 0xb801, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { DO_AUTH_SYM, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { DO_SIGN, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
+++ { DO_SIGN_SYM, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
+++ { DO_ENCR, CONSTRUCTED, READ_ALWAYS | WRITE_NEVER, pgp_get_pubkey, NULL },
+++ { DO_ENCR_SYM, SIMPLE, READ_ALWAYS | WRITE_PIN3, pgp_get_pubkey_pem, NULL },
++ { 0, 0, 0, NULL, NULL },
++ };
++
++-/* The DO holding X.509 certificate is constructed but does not contain child DO.
++- * We should notice this when building fake file system later. */
++-#define DO_CERT 0x7f21
++-/* Maximum length for response buffer when reading pubkey. This value is calculated with
++- * 4096-bit key length */
++-#define MAXLEN_RESP_PUBKEY 527
++-/* Gnuk only support 1 key length (2048 bit) */
++-#define MAXLEN_RESP_PUBKEY_GNUK 271
++-
++ #define DRVDATA(card) ((struct pgp_priv_data *) ((card)->drv_data))
++ struct pgp_priv_data {
++ pgp_blob_t * mf;
++@@ -755,8 +764,9 @@ pgp_read_blob(sc_card_t *card, pgp_blob_
++
++ /* Buffer length for Gnuk pubkey */
++ if (card->type == SC_CARD_TYPE_OPENPGP_GNUK &&
++- (blob->id == 0xa400 || blob->id == 0xb600 || blob->id == 0xb800
++- || blob->id == 0xa401 || blob->id == 0xb601 || blob->id == 0xb801)) {
+++ (blob->id == DO_AUTH || blob->id == DO_SIGN || blob->id == DO_ENCR
+++ || blob->id == DO_AUTH_SYM || blob->id == DO_SIGN_SYM
+++ || blob->id == DO_ENCR_SYM)) {
++ buf_len = MAXLEN_RESP_PUBKEY_GNUK;
++ }
++
++@@ -1812,11 +1822,11 @@ pgp_update_pubkey_blob(sc_card_t *card,
++ LOG_FUNC_CALLED(card->ctx);
++
++ if (key_id == SC_OPENPGP_KEY_SIGN)
++- blob_id = 0xB601;
+++ blob_id = DO_SIGN_SYM;
++ else if (key_id == SC_OPENPGP_KEY_ENCR)
++- blob_id = 0xB801;
+++ blob_id = DO_ENCR_SYM;
++ else if (key_id == SC_OPENPGP_KEY_AUTH)
++- blob_id = 0xA401;
+++ blob_id = DO_AUTH_SYM;
++ else {
++ sc_log(card->ctx, "Unknown key id %X.", key_id);
++ LOG_FUNC_RETURN(card->ctx, SC_ERROR_INVALID_ARGUMENTS);
++@@ -2514,17 +2524,17 @@ pgp_delete_file(sc_card_t *card, const s
++ LOG_FUNC_RETURN(card->ctx, SC_ERROR_NOT_SUPPORTED);
++
++ if (card->type != SC_CARD_TYPE_OPENPGP_GNUK &&
++- (file->id == 0xB601 || file->id == 0xB801 || file->id == 0xA401)) {
+++ (file->id == DO_SIGN_SYM || file->id == DO_ENCR_SYM || file->id == DO_AUTH_SYM)) {
++ /* These tags are just symbolic. We don't really delete it. */
++ r = SC_SUCCESS;
++ }
++- else if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && file->id == 0xB601) {
+++ else if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && file->id == DO_SIGN_SYM) {
++ r = gnuk_delete_key(card, 1);
++ }
++- else if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && file->id == 0xB801) {
+++ else if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && file->id == DO_ENCR_SYM) {
++ r = gnuk_delete_key(card, 2);
++ }
++- else if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && file->id == 0xA401) {
+++ else if (card->type == SC_CARD_TYPE_OPENPGP_GNUK && file->id == DO_AUTH_SYM) {
++ r = gnuk_delete_key(card, 3);
++ }
++ else {
+diff --git a/feeds/packages/utils/opensc/patches/0026-hardcode-defines-for-DO-s.patch b/feeds/packages/utils/opensc/patches/0026-hardcode-defines-for-DO-s.patch
+new file mode 100644
+index 0000000..6931aa6
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0026-hardcode-defines-for-DO-s.patch
+@@ -0,0 +1,50 @@
++From b9dae832db54b206a15bcc12e290cef50f31c3d0 Mon Sep 17 00:00:00 2001
++From: george <ggkitsas@yahoo.com>
++Date: Tue, 11 Nov 2014 16:16:15 +0100
++Subject: [PATCH 26/26] hardcode->defines for DO's
++
++---
++ src/libopensc/card-openpgp.c | 16 ++++++++++++++--
++ 1 file changed, 14 insertions(+), 2 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -166,6 +166,18 @@ static int pgp_get_pubkey_pem(sc_card_t
++ #define DO_SIGN_SYM 0xb601
++ #define DO_ENCR_SYM 0xb801
++ #define DO_AUTH_SYM 0xa401
+++/* Private DO's */
+++#define DO_PRIV1 0x0101
+++#define DO_PRIV2 0x0102
+++#define DO_PRIV3 0x0103
+++#define DO_PRIV4 0x0104
+++/* Cardholder information DO's */
+++#define DO_CARDHOLDER 0x65
+++#define DO_NAME 0x5b
+++#define DO_LANG_PREF 0x5f2d
+++#define DO_SEX 0x5f35
+++
+++
++ /* Maximum length for response buffer when reading pubkey. This value is calculated with
++ * 4096-bit key length */
++ #define MAXLEN_RESP_PUBKEY 527
++@@ -859,7 +871,7 @@ pgp_get_blob(sc_card_t *card, pgp_blob_t
++ /* Special case:
++ * Gnuk does not have default value for children of DO 65 (DOs 5B, 5F2D, 5F35)
++ * So, if these blob was not found, we create it. */
++- if (blob->id == 0x65 && (id == 0x5B || id == 0x5F2D || id == 0x5F35)) {
+++ if (blob->id == DO_CARDHOLDER && (id == DO_NAME || id == DO_LANG_PREF || id == DO_SEX)) {
++ sc_log(card->ctx, "Create blob %X under %X", id, blob->id);
++ child = pgp_new_blob(card, blob, id, sc_file_new());
++ if (child) {
++@@ -1206,7 +1218,7 @@ pgp_get_data(sc_card_t *card, unsigned i
++ /* For Gnuk card, if there is no certificate, it returns error instead of empty data.
++ * So, for this case, we ignore error and consider success */
++ if (r == SC_ERROR_DATA_OBJECT_NOT_FOUND && card->type == SC_CARD_TYPE_OPENPGP_GNUK
++- && (tag == DO_CERT || tag == 0x0101 || tag == 0x0102 || tag == 0x0103 || tag == 0x0104)) {
+++ && (tag == DO_CERT || tag == DO_PRIV1 || tag == DO_PRIV2 || tag == DO_PRIV3 || tag == DO_PRIV4)) {
++ r = SC_SUCCESS;
++ apdu.resplen = 0;
++ }
+diff --git a/feeds/packages/utils/opensc/patches/0027-OpenPGP-Remove-unused-variables-and-fix-type-cast.patch b/feeds/packages/utils/opensc/patches/0027-OpenPGP-Remove-unused-variables-and-fix-type-cast.patch
+new file mode 100644
+index 0000000..742f76a
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0027-OpenPGP-Remove-unused-variables-and-fix-type-cast.patch
+@@ -0,0 +1,82 @@
++From 99b5cb53e1da2f0d7692f28dceff8485d4b74daf Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Wed, 10 Dec 2014 03:59:54 +0800
++Subject: [PATCH 1/2] OpenPGP: Remove unused variables and fix type cast.
++
++---
++ src/libopensc/card-openpgp.c | 10 +++-------
++ src/tools/openpgp-tool.c | 4 +---
++ 2 files changed, 4 insertions(+), 10 deletions(-)
++
++Index: opensc-20150513/src/libopensc/card-openpgp.c
++===================================================================
++--- opensc-20150513.orig/src/libopensc/card-openpgp.c
+++++ opensc-20150513/src/libopensc/card-openpgp.c
++@@ -1966,8 +1966,6 @@ static int pgp_update_card_algorithms(sc
++ **/
++ static int pgp_gen_key(sc_card_t *card, sc_cardctl_openpgp_keygen_info_t *key_info)
++ {
++- struct pgp_priv_data *priv = DRVDATA(card);
++- pgp_blob_t *algo_blob;
++ sc_apdu_t apdu;
++ /* Temporary variables to hold APDU params */
++ u8 apdu_case;
++@@ -2396,10 +2394,9 @@ static int pgp_erase_card(sc_card_t *car
++ {0, 0x44, 0, 0}
++ };
++ u8 apdu_lens[10] = {13, 13, 13, 13, 13, 13, 13, 13, 4, 4};
++- u8 buf[SC_MAX_APDU_BUFFER_SIZE];
++ u8 rbuf[SC_MAX_APDU_BUFFER_SIZE];
++ sc_apdu_t apdu;
++- int i, l, r;
+++ u8 i, l, r;
++
++ LOG_FUNC_CALLED(ctx);
++
++@@ -2478,7 +2475,7 @@ gnuk_delete_key(sc_card_t *card, u8 key_
++ {
++ sc_context_t *ctx = card->ctx;
++ int r = SC_SUCCESS;
++- u8 *data = NULL;
+++ char *data = NULL;
++
++ LOG_FUNC_CALLED(ctx);
++
++@@ -2506,7 +2503,7 @@ gnuk_delete_key(sc_card_t *card, u8 key_
++ else if (key_id == 3)
++ data = "\x4D\x02\xA4";
++
++- r = pgp_put_data(card, 0x4D, data, strlen(data) + 1);
+++ r = pgp_put_data(card, 0x4D, (const u8 *)data, strlen((const char *)data) + 1);
++
++ LOG_FUNC_RETURN(ctx, r);
++ }
++@@ -2519,7 +2516,6 @@ pgp_delete_file(sc_card_t *card, const s
++ struct pgp_priv_data *priv = DRVDATA(card);
++ pgp_blob_t *blob;
++ sc_file_t *file;
++- u8 key_id;
++ int r;
++
++ LOG_FUNC_CALLED(card->ctx);
++Index: opensc-20150513/src/tools/openpgp-tool.c
++===================================================================
++--- opensc-20150513.orig/src/tools/openpgp-tool.c
+++++ opensc-20150513/src/tools/openpgp-tool.c
++@@ -473,7 +473,6 @@ int do_verify(sc_card_t *card, char *typ
++ **/
++ int delete_key_openpgp(sc_card_t *card, u8 key_id)
++ {
++- sc_context_t *ctx = card->ctx;
++ char *del_fingerprint = "00:DA:00:C6:14:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00";
++ char *del_creationtime = "00:DA:00:CD:04:00:00:00:00";
++ /* We need to replace the 4th byte later */
++@@ -520,7 +519,6 @@ int delete_key_openpgp(sc_card_t *card,
++
++ int do_delete_key(sc_card_t *card, u8 key_id)
++ {
++- sc_context_t *ctx = card->ctx;
++ sc_path_t path;
++ int r = SC_SUCCESS;
++
+diff --git a/feeds/packages/utils/opensc/patches/0028-openpgp-tool-Fix-wrong-operator.patch b/feeds/packages/utils/opensc/patches/0028-openpgp-tool-Fix-wrong-operator.patch
+new file mode 100644
+index 0000000..e423e17
+--- /dev/null
++++ b/feeds/packages/utils/opensc/patches/0028-openpgp-tool-Fix-wrong-operator.patch
+@@ -0,0 +1,28 @@
++From c71a453ff1e19721a9245b8a2d637eabd9f12e54 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Nguy=E1=BB=85n=20H=E1=BB=93ng=20Qu=C3=A2n?=
++ <ng.hong.quan@gmail.com>
++Date: Thu, 11 Dec 2014 12:51:15 +0800
++Subject: [PATCH 2/2] openpgp-tool: Fix wrong operator
++
++Used "!=" instead of "|="
++---
++ src/tools/openpgp-tool.c | 4 ++--
++ 1 file changed, 2 insertions(+), 2 deletions(-)
++
++Index: opensc-20150513/src/tools/openpgp-tool.c
++===================================================================
++--- opensc-20150513.orig/src/tools/openpgp-tool.c
+++++ opensc-20150513/src/tools/openpgp-tool.c
++@@ -639,10 +639,10 @@ int main(int argc, char **argv)
++ }
++
++ if (opt_delkey)
++- exit_status != do_delete_key(card, key_id);
+++ exit_status |= do_delete_key(card, key_id);
++
++ if (opt_erase)
++- exit_status != do_erase(card);
+++ exit_status |= do_erase(card);
++
++ out:
++ sc_unlock(card);
+diff --git a/feeds/packages/utils/opus-tools/Makefile b/feeds/packages/utils/opus-tools/Makefile
+new file mode 100644
+index 0000000..e53b843
+--- /dev/null
++++ b/feeds/packages/utils/opus-tools/Makefile
+@@ -0,0 +1,47 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=opus-tools
++PKG_VERSION:=0.1.9
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.xiph.org/releases/opus/
++PKG_MD5SUM:=20682e4d8d1ae9ec5af3cf43e808b8cb
++
++PKG_LICENSE:=BSD-2-Clause
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/opus-tools
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libogg +libopus
++ TITLE:=OPUS Codec tools
++ URL:=http://opus-codec.org/
++endef
++
++define Package/opus-tools/description
++ This package provides command-line utilities to encode, inspect, and decode
++ .opus files.
++endef
++
++CONFIGURE_ARGS += \
++ --without-flac \
++
++define Package/opus-tools/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/opus{dec,enc,info} $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,opus-tools))
+diff --git a/feeds/packages/utils/owfs/Makefile b/feeds/packages/utils/owfs/Makefile
+new file mode 100644
+index 0000000..bec087f
+--- /dev/null
++++ b/feeds/packages/utils/owfs/Makefile
+@@ -0,0 +1,248 @@
++#
++# Copyright (C) 2008-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=owfs
++PKG_VERSION:=2.9p5
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/$(PKG_NAME)
++PKG_MD5SUM:=b5c20998e8ffc6fa3974daef99c02402
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++PKG_LICENSE:=GPL-2.0
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++#
++# templates
++#
++
++define Package/$(PKG_NAME)/Default
++ TITLE:=OWFS (1-Wire File System)
++ URL:=http://owfs.sourceforge.net/
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Filesystem
++endef
++
++define Package/$(PKG_NAME)/Default/description
++ OWFS is a suite of programs that designed to make the 1-wire bus and its
++ devices easily accessible. The underlying priciple is to create a virtual
++ filesystem, with the unique ID being the directory, and the individual
++ properties of the device are represented as simple files that can be read
++ and written.
++
++ Details of the individual slave or master design are hidden behind a
++ consistent interface. The goal is to provide an easy set of tools for a
++ software designer to create monitoring or control applications. There are
++ some performance enhancements in the implementation, including data caching,
++ parallel access to bus masters, and aggregation of device communication.
++ Still the fundemental goal has been ease of use, flexibility and correctness
++ rather than speed.
++endef
++
++define Package/owfs/Server
++ $(call Package/owfs/Default)
++ DEPENDS:=+libow +libpthread
++endef
++
++define Package/owfs/Library
++ $(call Package/owfs/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++endef
++
++define Package/owfs/Utility
++ $(call Package/owfs/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libow
++endef
++
++#
++# shared libraries
++#
++
++define Package/libow
++ $(call Package/owfs/Library)
++ DEPENDS:=+libusb-compat +libpthread
++ TITLE:=OWFS - common shared library
++endef
++
++define Package/libow/description
++ $(call Package/$(PKG_NAME)/Default/description)
++
++ This package contains the OWFS library.
++endef
++
++define Package/libow-capi
++ $(call Package/owfs/Library)
++ DEPENDS:=+libow
++ TITLE:=OWFS - C-API library
++endef
++
++define Package/libow-capi/description
++ $(call Package/$(PKG_NAME)/Default/description)
++
++ This package contains the OWFS C-API library.
++endef
++
++#
++# utilities
++#
++
++define Package/owshell
++ $(call Package/owfs/Utility)
++ TITLE:=OWFS - shell utilities
++ DEPENDS+= +USE_UCLIBC:librpc
++endef
++
++define Package/owshell/description
++ $(call Package/$(PKG_NAME)/Default/description)
++
++ This package contains the OWFS shell utilities.
++endef
++
++define Package/owfs
++ $(call Package/owfs/Utility)
++ # libfuse depends on kmod-fuse, no need to declare dependency
++ DEPENDS+= +libfuse +fuse-utils
++ TITLE:=OWFS - fuse file system
++endef
++
++define Package/owfs/description
++ $(call Package/$(PKG_NAME)/Default/description)
++
++ This package contains the OWFS fuse filesystem.
++endef
++
++#
++# network daemons
++#
++
++define Package/owhttpd
++ $(call Package/owfs/Server)
++ TITLE:=OWFS - http server
++endef
++
++define Package/owhttpd/description
++ $(call Package/$(PKG_NAME)/Default/description)
++
++ This package contains the OWFS http server.
++endef
++
++define Package/owftpd
++ $(call Package/owfs/Server)
++ TITLE:=OWFS - ftp server
++endef
++
++define Package/owftpd/description
++ $(call Package/$(PKG_NAME)/Default/description)
++
++ This package contains the OWFS ftp server.
++endef
++
++define Package/owserver
++ $(call Package/owfs/Server)
++ TITLE:=OWFS - network server
++endef
++
++define Package/owserver/description
++ $(call Package/$(PKG_NAME)/Default/description)
++
++ This package contains the OWFS network server.
++endef
++
++CONFIGURE_ARGS += \
++ --enable-owftpd \
++ --enable-owserver \
++ --enable-owhttpd \
++ --enable-owfs \
++ --with-fuseinclude="$(STAGING_DIR)/usr/include" \
++ --with-fuselib="$(STAGING_DIR)/usr/lib" \
++ --enable-shared \
++ --enable-zero \
++ --disable-parport \
++ --disable-ownet \
++ --disable-owpython \
++ --disable-owphp \
++ --disable-owtcl \
++ --disable-swig \
++
++CONFIGURE_VARS += \
++ LDFLAGS="$(TARGET_LDFLAGS) -Wl,-rpath-link=$(STAGING_DIR)/usr/lib -Wl,-rpath-link=$(TOOLCHAIN_DIR)/usr/lib" \
++ lt_cv_sys_lib_dlsearch_path_spec="$(STAGING_DIR)/lib $(STAGING_DIR)/usr/lib" \
++ lt_cv_sys_lib_search_path_spec="$(STAGING_DIR)/lib $(STAGING_DIR)/usr/lib" \
++ shrext_cmds=".so" \
++
++MAKE_FLAGS += \
++ CC="$(TARGET_CC)" \
++ HOST_CPU="$(PKGARCH)"
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/ow{capi,fs_config}.h $(STAGING_DIR)/usr/include/
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libow{,capi}*.so* $(STAGING_DIR)/usr/lib/
++endef
++
++define Package/owfs/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/owfs $(1)/usr/bin/
++endef
++
++define Package/owshell/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/owget $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/owread $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/owwrite $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/owdir $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/owpresent $(1)/usr/bin/
++endef
++
++
++define Package/owserver/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/owserver $(1)/usr/bin/
++endef
++
++define Package/owhttpd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/owhttpd $(1)/usr/bin/
++endef
++
++define Package/owftpd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/owftpd $(1)/usr/bin/
++endef
++
++
++define Package/libow/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libow-*.so.* $(1)/usr/lib/
++endef
++
++define Package/libow-capi/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libowcapi-*.so.* $(1)/usr/lib/
++endef
++
++
++$(eval $(call BuildPackage,owfs))
++$(eval $(call BuildPackage,owshell))
++
++$(eval $(call BuildPackage,owserver))
++$(eval $(call BuildPackage,owhttpd))
++$(eval $(call BuildPackage,owftpd))
++
++$(eval $(call BuildPackage,libow))
++$(eval $(call BuildPackage,libow-capi))
+diff --git a/feeds/packages/utils/pciutils/Makefile b/feeds/packages/utils/pciutils/Makefile
+new file mode 100644
+index 0000000..3cfc125
+--- /dev/null
++++ b/feeds/packages/utils/pciutils/Makefile
+@@ -0,0 +1,72 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pciutils
++PKG_VERSION:=3.4.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@KERNEL/software/utils/pciutils
++PKG_MD5SUM:=46674cdbf2f72e4cfef75fea1b1ec5c8
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_USE_MIPS16:=0
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/pciutils
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Linux PCI Utilities
++ URL:=http://mj.ucw.cz/pciutils.shtml
++ DEPENDS:=+libkmod +zlib
++endef
++
++define Package/pciutils/description
++ contains collection of programs for inspecting and manipulating configuration
++ of PCI devices
++endef
++
++define Package/pciutils/postinst
++#!/bin/sh
++[ -z "$${IPKG_INSTROOT}" ] || \
++(cd $${PKG_ROOT}/usr/share; $${PKG_ROOT}/usr/sbin/update-pciids; rm pci.ids.gz.old)
++exit 0
++endef
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include" \
++ PREFIX="/usr" \
++ HOST="$(GNU_TARGET_NAME)" \
++ ZLIB="yes"
++
++ifneq ($(CONFIG_USE_GLIBC),)
++TARGET_LDFLAGS += -lresolv
++endif
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/lib/libpci.a $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/include/pci
++ $(CP) $(foreach i,pci.h config.h header.h types.h, \
++ $(PKG_BUILD_DIR)/lib/$(i)) $(1)/usr/include/pci
++endef
++
++define Package/pciutils/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/{lspci,setpci,update-pciids} $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/share
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/pci.ids.gz $(1)/usr/share/
++endef
++
++$(eval $(call BuildPackage,pciutils))
+diff --git a/feeds/packages/utils/pciutils/patches/100-remove-no-timestamping.patch b/feeds/packages/utils/pciutils/patches/100-remove-no-timestamping.patch
+new file mode 100644
+index 0000000..93bc85f
+--- /dev/null
++++ b/feeds/packages/utils/pciutils/patches/100-remove-no-timestamping.patch
+@@ -0,0 +1,11 @@
++--- a/update-pciids.sh
+++++ b/update-pciids.sh
++@@ -33,7 +33,7 @@ if which curl >/dev/null 2>&1 ; then
++ DL="curl -o $DEST.new $SRC"
++ ${quiet} && DL="$DL -s -S"
++ elif which wget >/dev/null 2>&1 ; then
++- DL="wget --no-timestamping -O $DEST.new $SRC"
+++ DL="wget -O $DEST.new $SRC"
++ ${quiet} && DL="$DL -q"
++ elif which lynx >/dev/null 2>&1 ; then
++ DL="eval lynx -source $SRC >$DEST.new"
+diff --git a/feeds/packages/utils/pciutils/patches/101-no-strip.patch b/feeds/packages/utils/pciutils/patches/101-no-strip.patch
+new file mode 100644
+index 0000000..610a755
+--- /dev/null
++++ b/feeds/packages/utils/pciutils/patches/101-no-strip.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -111,7 +111,7 @@ distclean: clean
++ install: all
++ # -c is ignored on Linux, but required on FreeBSD
++ $(DIRINSTALL) -m 755 $(DESTDIR)$(SBINDIR) $(DESTDIR)$(IDSDIR) $(DESTDIR)$(MANDIR)/man8 $(DESTDIR)$(MANDIR)/man7
++- $(INSTALL) -c -m 755 $(STRIP) lspci setpci $(DESTDIR)$(SBINDIR)
+++ $(INSTALL) -c -m 755 lspci setpci $(DESTDIR)$(SBINDIR)
++ $(INSTALL) -c -m 755 update-pciids $(DESTDIR)$(SBINDIR)
++ $(INSTALL) -c -m 644 $(PCI_IDS) $(DESTDIR)$(IDSDIR)
++ $(INSTALL) -c -m 644 lspci.8 setpci.8 update-pciids.8 $(DESTDIR)$(MANDIR)/man8
+diff --git a/feeds/packages/utils/pciutils/patches/102-compressed-ids.patch b/feeds/packages/utils/pciutils/patches/102-compressed-ids.patch
+new file mode 100644
+index 0000000..9b31938
+--- /dev/null
++++ b/feeds/packages/utils/pciutils/patches/102-compressed-ids.patch
+@@ -0,0 +1,31 @@
++--- a/update-pciids.sh
+++++ b/update-pciids.sh
++@@ -6,9 +6,8 @@ set -e
++ SRC="http://pci-ids.ucw.cz/v2.2/pci.ids"
++ DEST=pci.ids
++ PCI_COMPRESSED_IDS=
++-GREP=grep
++
++-# if pci.ids is read-only (because the filesystem is read-only),
+++# if pci.ids.gz is read-only (because the filesystem is read-only),
++ # then just skip this whole process.
++ if ! touch ${DEST} >/dev/null 2>&1 ; then
++ ${quiet} || echo "${DEST} is read-only, exiting." 1>&2
++@@ -18,7 +17,7 @@ fi
++ if [ "$PCI_COMPRESSED_IDS" = 1 ] ; then
++ DECOMP="cat"
++ SRC="$SRC.gz"
++- GREP=zgrep
+++ DEST="$DEST.gz"
++ elif which bzip2 >/dev/null 2>&1 ; then
++ DECOMP="bzip2 -d"
++ SRC="$SRC.bz2"
++@@ -53,7 +52,7 @@ if ! $DECOMP <$DEST.new >$DEST.neww ; th
++ exit 1
++ fi
++
++-if ! $GREP >/dev/null "^C " $DEST.neww ; then
+++if ! zcat $DEST.neww | grep >/dev/null "^C " ; then
++ echo >&2 "update-pciids: missing class info, probably truncated file"
++ exit 1
++ fi
+diff --git a/feeds/packages/utils/pciutils/patches/103-relative-path-ids.patch b/feeds/packages/utils/pciutils/patches/103-relative-path-ids.patch
+new file mode 100644
+index 0000000..c6d6906
+--- /dev/null
++++ b/feeds/packages/utils/pciutils/patches/103-relative-path-ids.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -88,7 +88,7 @@ lspci: LDLIBS+=$(LIBKMOD_LIBS)
++ ls-kernel.o: CFLAGS+=$(LIBKMOD_CFLAGS)
++
++ update-pciids: update-pciids.sh
++- sed <$< >$@ "s@^DEST=.*@DEST=$(IDSDIR)/$(PCI_IDS)@;s@^PCI_COMPRESSED_IDS=.*@PCI_COMPRESSED_IDS=$(PCI_COMPRESSED_IDS)@"
+++ sed <$< >$@ "s@^PCI_COMPRESSED_IDS=.*@PCI_COMPRESSED_IDS=$(PCI_COMPRESSED_IDS)@"
++ chmod +x $@
++
++ # The example of use of libpci
+diff --git a/feeds/packages/utils/pciutils/patches/104-resolv.patch b/feeds/packages/utils/pciutils/patches/104-resolv.patch
+new file mode 100644
+index 0000000..c38d1cf
+--- /dev/null
++++ b/feeds/packages/utils/pciutils/patches/104-resolv.patch
+@@ -0,0 +1,11 @@
++--- a/lib/configure
+++++ b/lib/configure
++@@ -57,7 +57,7 @@ echo >>$c "#define PCI_OS_`echo $sys | t
++ echo >$m 'WITH_LIBS='
++
++ echo_n "Looking for access methods..."
++-LIBRESOLV=-lresolv
+++LIBRESOLV=
++ LIBEXT=so
++
++ case $sys in
+diff --git a/feeds/packages/utils/pciutils/patches/105-fix-host.patch b/feeds/packages/utils/pciutils/patches/105-fix-host.patch
+new file mode 100644
+index 0000000..8df4b8c
+--- /dev/null
++++ b/feeds/packages/utils/pciutils/patches/105-fix-host.patch
+@@ -0,0 +1,11 @@
++--- a/lib/configure
+++++ b/lib/configure
++@@ -44,7 +44,7 @@ if [ -z "$HOST" ] ; then
++ fi
++ [ -n "$RELEASE" ] && rel="${RELEASE}"
++ # CAVEAT: tr on Solaris is a bit weird and the extra [] is otherwise harmless.
++-host=`echo $HOST | sed -e 's/^\([^-]*\)-\([^-]*\)-\([^-]*\)-\([^-]*\)$/\1-\3/' -e 's/^\([^-]*\)-\([^-]*\)-\([^-]*\)$/\1-\2/' -e 's/^\([^-]*\)-\([^-]*\)$/\1--\2/' | tr '[A-Z]' '[a-z]'`
+++host=`echo $HOST | sed -e 's/^\([^-]*\)-\([^-]*\)-\([^-]*\)-\([^-]*\)$/\1-\3/' -e 's/^\([^-]*\)-\([^-]*\)$/\1--\2/' | tr '[A-Z]' '[a-z]'`
++ cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
++ sys=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
++ echo " $host $rel $cpu $sys"
+diff --git a/feeds/packages/utils/pcsc-lite/Makefile b/feeds/packages/utils/pcsc-lite/Makefile
+new file mode 100644
+index 0000000..6f47351
+--- /dev/null
++++ b/feeds/packages/utils/pcsc-lite/Makefile
+@@ -0,0 +1,101 @@
++#
++# Copyright (C) 2009-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pcsc-lite
++PKG_VERSION:=1.8.14
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=https://alioth.debian.org/frs/download.php/file/4138
++PKG_MD5SUM:=439b2c8892f502e39e5b8997a7ae01ed
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/pcsc-lite/Default
++ TITLE:=Middleware to access a smart card using SCard API (PC/SC).
++ URL:=http://pcsclite.alioth.debian.org/
++endef
++
++define Package/pcsc-lite/Default/description
++ The purpose of PC/SC Lite is to provide a Windows(R) SCard
++ interface in a very small form factor for communicating to
++ smart cards and smart cards readers.
++endef
++
++define Package/libpcsclite
++ $(call Package/pcsc-lite/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= (library)
++ DEPENDS:=+libusb-1.0 +libpthread +librt
++endef
++
++define Package/libpcsclite/description
++ $(call Package/pcsc-lite/Default/description)
++ .
++ This package contains the PC/SC shared library.
++endef
++
++define Package/pcscd
++ $(call Package/pcsc-lite/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= (daemon)
++ DEPENDS:=+libpcsclite
++endef
++
++define Package/pcscd/description
++ $(call Package/pcsc-lite/Default/description)
++ .
++ This package contains the PC/SC daemon.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++TARGET_LDFLAGS += -lpthread
++
++CONFIGURE_ARGS += \
++ --disable-libudev \
++ --enable-libusb \
++ --enable-static \
++ --enable-usbdropdir=/usr/lib/pcsc/drivers
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/PCSC
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/PCSC/* $(1)/usr/include/PCSC/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcsclite.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libpcsclite.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libpcsclite/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpcsclite.so.* $(1)/usr/lib/
++endef
++
++define Package/pcscd/conffiles
++/etc/reader.conf.d/reader.conf
++endef
++
++define Package/pcscd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/pcscd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/pcscd.init $(1)/etc/init.d/pcscd
++ $(INSTALL_DIR) $(1)/etc/reader.conf.d
++endef
++
++$(eval $(call BuildPackage,libpcsclite))
++$(eval $(call BuildPackage,pcscd))
+diff --git a/feeds/packages/utils/pcsc-lite/files/pcscd.init b/feeds/packages/utils/pcsc-lite/files/pcscd.init
+new file mode 100644
+index 0000000..9a7a905
+--- /dev/null
++++ b/feeds/packages/utils/pcsc-lite/files/pcscd.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2011 OpenWrt.org
++
++START=50
++
++SERVICE_PID_FILE=/var/run/pcscd/pcscd.pid
++
++start() {
++ service_start /usr/sbin/pcscd
++}
++
++stop() {
++ service_stop /usr/sbin/pcscd
++}
+diff --git a/feeds/packages/utils/picocom/Makefile b/feeds/packages/utils/picocom/Makefile
+new file mode 100644
+index 0000000..31a1ad6
+--- /dev/null
++++ b/feeds/packages/utils/picocom/Makefile
+@@ -0,0 +1,46 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=picocom
++PKG_VERSION:=1.7
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://picocom.googlecode.com/files
++PKG_MD5SUM:=8eaba1d31407e8408674d6e57af447ef
++
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=GPL-2.0+
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/picocom
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=A minimal dumb-terminal emulation program
++ URL:=http://code.google.com/p/picocom/
++ SUBMENU:=Terminal
++endef
++
++define Package/picocom/description
++ minimal dumb-terminal emulation program
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS) \
++ CFLAGS="$(TARGET_CFLAGS)" LDFLAGS="$(TARGET_LDFLAGS)" \
++ picocom
++endef
++
++define Package/picocom/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/picocom $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,picocom))
+diff --git a/feeds/packages/utils/picocom/patches/100-musl-compat.patch b/feeds/packages/utils/picocom/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..5f7d750
+--- /dev/null
++++ b/feeds/packages/utils/picocom/patches/100-musl-compat.patch
+@@ -0,0 +1,17 @@
++Index: picocom-1.7/term.c
++===================================================================
++--- picocom-1.7.orig/term.c
+++++ picocom-1.7/term.c
++@@ -33,10 +33,11 @@
++ #include <string.h>
++ #include <errno.h>
++ #include <unistd.h>
++-#ifdef __linux__
+++#if defined(__linux__) && (defined(__GLIBC__) || defined(__UCLIBC__))
++ #include <termio.h>
++ #else
++ #include <termios.h>
+++#include <sys/ioctl.h>
++ #endif /* of __linux__ */
++
++ #include "term.h"
+diff --git a/feeds/packages/utils/pps-tools/Makefile b/feeds/packages/utils/pps-tools/Makefile
+new file mode 100644
+index 0000000..91918e5
+--- /dev/null
++++ b/feeds/packages/utils/pps-tools/Makefile
+@@ -0,0 +1,49 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pps-tools
++PKG_VERSION:=2014-08-01
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/ago/pps-tools
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=0deb9c7e135e9380a6d09e9d2e938a146bb698c8
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++
++PKG_MAINTAINER := Zoltan HERPAI <wigyori@uid0.hu>
++PKG_LICENSE:=GPL-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/pps-tools
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=PPS-tools
++endef
++
++define Package/pps-tools/description
++ Userland tools for GPS and DCF-77 Clock syncronization. PPS support in Kernel must be enabled.
++endef
++
++TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_BUILD_DIR)/timepps.h $(1)/usr/include/
++endef
++
++define Package/pps-tools/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ppsctl $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ppstest $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ppswatch $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,pps-tools))
+diff --git a/feeds/packages/utils/procps-ng/Makefile b/feeds/packages/utils/procps-ng/Makefile
+new file mode 100644
+index 0000000..f5e3cfb
+--- /dev/null
++++ b/feeds/packages/utils/procps-ng/Makefile
+@@ -0,0 +1,97 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=procps-ng
++PKG_VERSION:=3.3.11
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING COPYING.LIB
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://gitlab.com/procps-ng/procps.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=de985eced583f18df273146b110491b0f7404aab
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++CONFIGURE_ARGS += --enable-skill
++
++PROCPS_APPLETS := \
++ free kill pgrep pkill pmap ps pwdx skill slabtop \
++ snice tload top uptime vmstat w watch
++
++define Package/procps-ng/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libncurses
++ TITLE:=procps-ng utilities
++ URL:=https://gitlab.com/procps-ng/procps
++ MAINTAINER:=Gergely Kiss <mail.gery@gmail.com>
++endef
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); echo "$(PKG_VERSION)" > "$(PKG_BUILD_DIR)/.tarball-version"; ./autogen.sh );
++ $(call Build/Configure/Default)
++endef
++
++define Package/procps-ng
++ $(call Package/procps-ng/Default)
++ MENU:=1
++endef
++
++define Package/procps-ng/description
++ procps is a set of command line and full-screen utilities that provide information out of the pseudo-filesystem
++ most commonly located at /proc. This filesystem provides a simple interface to the kernel data structures.
++ The programs of procps generally concentrate on the structures that describe the processess running on the system.
++
++ NOTE: some utilities provided by procps-ng packages (ps, uptime, kill, ...) are installed as busybox applets, by default.
++ Conflicting applets should be removed from the build to avoid file conflicts.
++endef
++
++define GenPlugin
++ define Package/$(1)
++ $(call Package/procps-ng/Default)
++ DEPENDS:=procps-ng
++ TITLE:=Applet $(2) from the procps-ng package
++ DEFAULT:=y
++ endef
++
++ define Package/$(1)/description
++ Installs the applet $(2).
++ endef
++endef
++
++$(foreach a,$(PROCPS_APPLETS),$(eval $(call GenPlugin,procps-ng-$(a),$(a))))
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ CPPFLAGS="$(TARGET_CPPFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++
++define Package/procps-ng/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/libprocps.so* $(1)/usr/lib/
++endef
++
++define BuildPlugin
++ define Package/$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(2) $$(1)/usr/bin/
++ endef
++
++ $$(eval $$(call BuildPackage,$(1)))
++endef
++
++$(foreach a,$(PROCPS_APPLETS),$(eval $(call BuildPlugin,procps-ng-$(a),$(a))))
++$(eval $(call BuildPackage,procps-ng))
+diff --git a/feeds/packages/utils/pv/Makefile b/feeds/packages/utils/pv/Makefile
+new file mode 100644
+index 0000000..cbe44e5
+--- /dev/null
++++ b/feeds/packages/utils/pv/Makefile
+@@ -0,0 +1,46 @@
++#
++# Copyright (C) 2008 David Cooper
++# Copyright (C) 2008-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pv
++PKG_VERSION:=1.5.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.ivarch.com/programs/sources/
++PKG_MD5SUM:=efe8e9e4cad5f3264a32258a63bf2c8e
++PKG_LICENSE:=Artistic-2.0
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/pv
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Shell pipeline element to meter data passing through
++ URL:=http://www.ivarch.com/programs/pv.shtml
++endef
++
++define Package/pv/description
++ Pipe Viewer is a terminal-based tool for monitoring the progress of data
++ through a pipeline. It can be inserted into any normal pipeline between
++ two processes to give a visual indication of how quickly data is passing
++ through, how long it has taken, how near to completion it is, and an
++ estimate of how long it will be until completion.
++endef
++
++define Package/pv/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/pv $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,pv))
++
+diff --git a/feeds/packages/utils/rng-tools/Makefile b/feeds/packages/utils/rng-tools/Makefile
+new file mode 100644
+index 0000000..8ec18c2
+--- /dev/null
++++ b/feeds/packages/utils/rng-tools/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2011-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=rng-tools
++PKG_VERSION:=5
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/gkernel/rng-tools/$(PKG_VERSION)/
++PKG_MD5SUM:=6726cdc6fae1f5122463f24ae980dd68
++PKG_LICENSE:=GPLv2
++PKG_MAINTAINER:=Hannu Nyman <hannu.nyman@iki.fi>
++
++PKG_FIXUP:=autoreconf
++
++PKG_BUILD_DEPENDS:=USE_UCLIBC:argp-standalone USE_MUSL:argp-standalone
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/rng-tools
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Daemon for adding entropy to kernel entropy pool
++ URL:=http://sourceforge.net/projects/gkernel/
++endef
++
++ifdef CONFIG_USE_UCLIBC
++CONFIGURE_VARS += \
++ LIBS="-largp"
++endif
++
++ifdef CONFIG_USE_MUSL
++CONFIGURE_VARS += \
++ LIBS="-largp"
++endif
++
++CONFIGURE_ARGS += \
++ --without-libgcrypt
++
++define Package/rng-tools/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/rngd.init $(1)/etc/init.d/rngd
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/rngtest $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/rngd $(1)/sbin/
++endef
++
++$(eval $(call BuildPackage,rng-tools))
+diff --git a/feeds/packages/utils/rng-tools/files/rngd.init b/feeds/packages/utils/rng-tools/files/rngd.init
+new file mode 100644
+index 0000000..805559c
+--- /dev/null
++++ b/feeds/packages/utils/rng-tools/files/rngd.init
+@@ -0,0 +1,16 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2011-2014 OpenWrt.org
++
++START=98
++
++RNGD_INTERVAL=30
++RNGD_AMOUNT=4000
++RNGD_DEVICE="/dev/urandom"
++
++start() {
++ service_start /sbin/rngd -r $RNGD_DEVICE -W $RNGD_AMOUNT
++}
++
++stop() {
++ service_stop /sbin/rngd
++}
+diff --git a/feeds/packages/utils/rpcd-mod-lxc/Makefile b/feeds/packages/utils/rpcd-mod-lxc/Makefile
+new file mode 100644
+index 0000000..154336b
+--- /dev/null
++++ b/feeds/packages/utils/rpcd-mod-lxc/Makefile
+@@ -0,0 +1,37 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=rpcd-mod-lxc
++PKG_RELEASE=20141012
++
++PKG_LICENSE:=ISC
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/rpcd-mod-lxc
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=LXC rpcd module
++ DEPENDS:=+rpcd +liblxc
++ MAINTAINER:=Luka Perkov <luka@openwrt.org>
++endef
++
++define Build/Prepare
++ $(CP) ./files/* $(PKG_BUILD_DIR)/
++endef
++
++define Package/rpcd-mod-lxc/install
++ $(INSTALL_DIR) $(1)/usr/lib/rpcd
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/lxc.so $(1)/usr/lib/rpcd/
++endef
++
++$(eval $(call BuildPackage,rpcd-mod-lxc))
+diff --git a/feeds/packages/utils/rpcd-mod-lxc/files/CMakeLists.txt b/feeds/packages/utils/rpcd-mod-lxc/files/CMakeLists.txt
+new file mode 100644
+index 0000000..4a728a0
+--- /dev/null
++++ b/feeds/packages/utils/rpcd-mod-lxc/files/CMakeLists.txt
+@@ -0,0 +1,19 @@
++cmake_minimum_required(VERSION 2.6)
++PROJECT(rpcd-mod-lxc)
++ADD_DEFINITIONS(-Os -Wall -Werror --std=gnu99 -Wmissing-declarations)
++
++INCLUDE_DIRECTORIES(include)
++FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)
++
++SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
++SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib)
++
++SET(SOURCES lxc.c)
++
++ADD_LIBRARY(rpcd-mod-lxc SHARED ${SOURCES})
++
++FIND_LIBRARY(lxc NAMES lxc liblxc)
++TARGET_LINK_LIBRARIES(rpcd-mod-lxc ${lxc})
++
++SET_TARGET_PROPERTIES(rpcd-mod-lxc PROPERTIES OUTPUT_NAME lxc PREFIX "")
++INSTALL(TARGETS rpcd-mod-lxc LIBRARY DESTINATION lib)
+diff --git a/feeds/packages/utils/rpcd-mod-lxc/files/lxc.c b/feeds/packages/utils/rpcd-mod-lxc/files/lxc.c
+new file mode 100644
+index 0000000..0d52f16
+--- /dev/null
++++ b/feeds/packages/utils/rpcd-mod-lxc/files/lxc.c
+@@ -0,0 +1,504 @@
++/*
++ * rpcd-lxc-plugin
++ *
++ * Copyright (C) 2014 Cisco Systems, Inc.
++ * Author: Luka Perkov <luka@openwrt.org>
++ *
++ * Permission to use, copy, modify, and/or distribute this software for any
++ * purpose with or without fee is hereby granted, provided that the above
++ * copyright notice and this permission notice appear in all copies.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
++ */
++
++#include <libubus.h>
++
++#include <lxc/lxccontainer.h>
++
++#include <rpcd/plugin.h>
++
++static struct blob_buf buf;
++
++struct rpc_lxc {
++ /* ubus options */
++ char *name;
++ char *config;
++ /* lxc container */
++ struct lxc_container *container;
++};
++
++enum {
++ RPC_LXC_NAME,
++ RPC_LXC_CONFIG,
++ __RPC_LXC_MAX,
++};
++
++enum {
++ RPC_LXC_SHUTDOWN_NAME,
++ RPC_LXC_SHUTDOWN_CONFIG,
++ RPC_LXC_SHUTDOWN_TIMEOUT,
++ __RPC_LXC_SHUTDOWN_MAX,
++};
++
++enum {
++ RPC_LXC_RENAME_NAME,
++ RPC_LXC_RENAME_CONFIG,
++ RPC_LXC_RENAME_NEWNAME,
++ __RPC_LXC_RENAME_MAX,
++};
++
++enum {
++ RPC_LXC_CREATE_NAME,
++ RPC_LXC_CREATE_CONFIG,
++ RPC_LXC_CREATE_TEMPLATE,
++ RPC_LXC_CREATE_FLAGS,
++ RPC_LXC_CREATE_ARGS,
++ __RPC_LXC_CREATE_MAX,
++};
++
++static const struct blobmsg_policy rpc_lxc_min_policy[__RPC_LXC_MAX] = {
++ [RPC_LXC_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING },
++ [RPC_LXC_CONFIG] = { .name = "config", .type = BLOBMSG_TYPE_STRING },
++};
++
++static const struct blobmsg_policy rpc_lxc_shutdown_policy[__RPC_LXC_SHUTDOWN_MAX] = {
++ [RPC_LXC_SHUTDOWN_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING },
++ [RPC_LXC_SHUTDOWN_CONFIG] = { .name = "config", .type = BLOBMSG_TYPE_STRING },
++ [RPC_LXC_SHUTDOWN_TIMEOUT] = { .name = "timeout", .type = BLOBMSG_TYPE_INT32 },
++};
++
++static const struct blobmsg_policy rpc_lxc_rename_policy[__RPC_LXC_RENAME_MAX] = {
++ [RPC_LXC_RENAME_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING },
++ [RPC_LXC_RENAME_CONFIG] = { .name = "config", .type = BLOBMSG_TYPE_STRING },
++ [RPC_LXC_RENAME_NEWNAME] = { .name = "newname", .type = BLOBMSG_TYPE_STRING },
++};
++
++static const struct blobmsg_policy rpc_lxc_create_policy[__RPC_LXC_CREATE_MAX] = {
++ [RPC_LXC_CREATE_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING },
++ [RPC_LXC_CREATE_CONFIG] = { .name = "config", .type = BLOBMSG_TYPE_STRING },
++ [RPC_LXC_CREATE_TEMPLATE] = { .name = "template", .type = BLOBMSG_TYPE_STRING },
++ [RPC_LXC_CREATE_FLAGS] = { .name = "flags", .type = BLOBMSG_TYPE_INT32 },
++ [RPC_LXC_CREATE_ARGS] = { .name = "args", .type = BLOBMSG_TYPE_ARRAY },
++};
++
++static struct rpc_lxc *
++rpc_lxc_init(struct blob_attr *tb[__RPC_LXC_MAX])
++{
++ struct rpc_lxc *l = NULL;
++
++ l = calloc(1, sizeof(struct rpc_lxc));
++ if (!l) return NULL;
++
++ if (tb[RPC_LXC_NAME]) {
++ l->name = blobmsg_data(tb[RPC_LXC_NAME]);
++ } else {
++ goto error;
++ }
++
++ if (tb[RPC_LXC_CONFIG]) {
++ l->config = blobmsg_data(tb[RPC_LXC_CONFIG]);
++ } else {
++ l->config = NULL;
++ }
++
++ l->container = lxc_container_new(l->name, l->config);
++ if (!l->container) {
++ goto error;
++ }
++
++ return l;
++error:
++ free(l);
++ return NULL;
++}
++
++static void
++rpc_lxc_done(struct rpc_lxc *l)
++{
++ if (l) {
++ lxc_container_put(l->container);
++ free(l);
++ }
++
++ return;
++}
++
++static int
++rpc_lxc_start(struct ubus_context *ctx, struct ubus_object *obj,
++ struct ubus_request_data *req, const char *method,
++ struct blob_attr *msg)
++{
++ struct blob_attr *tb[__RPC_LXC_MAX];
++ struct rpc_lxc *l = NULL;
++ int rc;
++
++ blobmsg_parse(rpc_lxc_min_policy, __RPC_LXC_MAX, tb, blob_data(msg), blob_len(msg));
++
++ l = rpc_lxc_init(tb);
++ if (!l) return UBUS_STATUS_INVALID_ARGUMENT;
++
++ if (l->container->is_running(l->container)) {
++ rc = UBUS_STATUS_UNKNOWN_ERROR;
++ goto out;
++ }
++
++ if (!l->container->start(l->container, 0, NULL)) {
++ rc = UBUS_STATUS_INVALID_ARGUMENT;
++ goto out;
++ }
++
++ rc = UBUS_STATUS_OK;
++out:
++ rpc_lxc_done(l);
++ return rc;
++}
++
++
++static int
++rpc_lxc_reboot(struct ubus_context *ctx, struct ubus_object *obj,
++ struct ubus_request_data *req, const char *method,
++ struct blob_attr *msg)
++{
++ struct blob_attr *tb[__RPC_LXC_MAX];
++ struct rpc_lxc *l = NULL;
++ int rc;
++
++ blobmsg_parse(rpc_lxc_min_policy, __RPC_LXC_MAX, tb, blob_data(msg), blob_len(msg));
++
++ l = rpc_lxc_init(tb);
++ if (!l) return UBUS_STATUS_INVALID_ARGUMENT;
++
++ if (!l->container->is_running(l->container)) {
++ rc = UBUS_STATUS_UNKNOWN_ERROR;
++ goto out;
++ }
++
++ if (!l->container->reboot(l->container)) {
++ rc = UBUS_STATUS_INVALID_ARGUMENT;
++ goto out;
++ }
++
++ rc = UBUS_STATUS_OK;
++out:
++ rpc_lxc_done(l);
++ return rc;
++}
++
++static int
++rpc_lxc_shutdown(struct ubus_context *ctx, struct ubus_object *obj,
++ struct ubus_request_data *req, const char *method,
++ struct blob_attr *msg)
++{
++ struct blob_attr *tb[__RPC_LXC_SHUTDOWN_MAX];
++ struct rpc_lxc *l = NULL;
++ int rc;
++
++ blobmsg_parse(rpc_lxc_shutdown_policy, __RPC_LXC_SHUTDOWN_MAX, tb, blob_data(msg), blob_len(msg));
++
++ l = rpc_lxc_init(tb);
++ if (!l) return UBUS_STATUS_INVALID_ARGUMENT;
++
++ if (!l->container->is_running(l->container)) {
++ rc = UBUS_STATUS_UNKNOWN_ERROR;
++ goto out;
++ }
++
++ /* define default timeout */
++ int timeout = 30;
++ if (tb[RPC_LXC_SHUTDOWN_TIMEOUT]) {
++ timeout = blobmsg_get_u32(tb[RPC_LXC_SHUTDOWN_TIMEOUT]);
++ }
++
++ if (!l->container->shutdown(l->container, timeout)) {
++ rc = UBUS_STATUS_UNKNOWN_ERROR;
++ goto out;
++ }
++
++ rc = UBUS_STATUS_OK;
++out:
++ rpc_lxc_done(l);
++ return rc;
++}
++
++static int
++rpc_lxc_stop(struct ubus_context *ctx, struct ubus_object *obj,
++ struct ubus_request_data *req, const char *method,
++ struct blob_attr *msg)
++{
++ struct blob_attr *tb[__RPC_LXC_MAX];
++ struct rpc_lxc *l = NULL;
++ int rc;
++
++ blobmsg_parse(rpc_lxc_min_policy, __RPC_LXC_MAX, tb, blob_data(msg), blob_len(msg));
++
++ l = rpc_lxc_init(tb);
++ if (!l) return UBUS_STATUS_INVALID_ARGUMENT;
++
++ if (!l->container->is_running(l->container)) {
++ rc = UBUS_STATUS_UNKNOWN_ERROR;
++ goto out;
++ }
++
++ if (!l->container->stop(l->container)) {
++ rc = UBUS_STATUS_INVALID_ARGUMENT;
++ goto out;
++ }
++
++ rc = UBUS_STATUS_OK;
++out:
++ rpc_lxc_done(l);
++ return rc;
++}
++
++static int
++rpc_lxc_freeze(struct ubus_context *ctx, struct ubus_object *obj,
++ struct ubus_request_data *req, const char *method,
++ struct blob_attr *msg)
++{
++ struct blob_attr *tb[__RPC_LXC_MAX];
++ struct rpc_lxc *l = NULL;
++ int rc;
++
++ blobmsg_parse(rpc_lxc_min_policy, __RPC_LXC_MAX, tb, blob_data(msg), blob_len(msg));
++
++ l = rpc_lxc_init(tb);
++ if (!l) return UBUS_STATUS_INVALID_ARGUMENT;
++
++ if (!l->container->is_running(l->container)) {
++ rc = UBUS_STATUS_UNKNOWN_ERROR;
++ goto out;
++ }
++
++ if (!l->container->freeze(l->container)) {
++ rc = UBUS_STATUS_INVALID_ARGUMENT;
++ goto out;
++ }
++
++ rc = UBUS_STATUS_OK;
++out:
++ rpc_lxc_done(l);
++ return rc;
++}
++
++static int
++rpc_lxc_unfreeze(struct ubus_context *ctx, struct ubus_object *obj,
++ struct ubus_request_data *req, const char *method,
++ struct blob_attr *msg)
++{
++ struct blob_attr *tb[__RPC_LXC_MAX];
++ struct rpc_lxc *l = NULL;
++ int rc;
++
++ blobmsg_parse(rpc_lxc_min_policy, __RPC_LXC_MAX, tb, blob_data(msg), blob_len(msg));
++
++ l = rpc_lxc_init(tb);
++ if (!l) return UBUS_STATUS_INVALID_ARGUMENT;
++
++ if (!l->container->is_running(l->container)) {
++ rc = UBUS_STATUS_UNKNOWN_ERROR;
++ goto out;
++ }
++
++ if (!l->container->unfreeze(l->container)) {
++ rc = UBUS_STATUS_INVALID_ARGUMENT;
++ goto out;
++ }
++
++ rc = UBUS_STATUS_OK;
++out:
++ rpc_lxc_done(l);
++ return rc;
++}
++
++static int
++rpc_lxc_rename(struct ubus_context *ctx, struct ubus_object *obj,
++ struct ubus_request_data *req, const char *method,
++ struct blob_attr *msg)
++{
++ struct blob_attr *tb[__RPC_LXC_RENAME_MAX];
++ struct rpc_lxc *l = NULL;
++ int rc;
++
++ blobmsg_parse(rpc_lxc_rename_policy, __RPC_LXC_RENAME_MAX, tb, blob_data(msg), blob_len(msg));
++
++ l = rpc_lxc_init(tb);
++ if (!l) return UBUS_STATUS_INVALID_ARGUMENT;
++
++ if (!tb[RPC_LXC_RENAME_NEWNAME]) {
++ rc = UBUS_STATUS_INVALID_ARGUMENT;
++ goto out;
++ }
++
++ if (l->container->is_running(l->container)) {
++ rc = UBUS_STATUS_UNKNOWN_ERROR;
++ goto out;
++ }
++
++ char *newname = blobmsg_data(tb[RPC_LXC_RENAME_NEWNAME]);
++ if (!newname || !l->container->rename(l->container, newname)) {
++ rc = UBUS_STATUS_INVALID_ARGUMENT;
++ goto out;
++ }
++
++ rc = UBUS_STATUS_OK;
++out:
++ rpc_lxc_done(l);
++ return rc;
++}
++
++static int
++rpc_lxc_create(struct ubus_context *ctx, struct ubus_object *obj,
++ struct ubus_request_data *req, const char *method,
++ struct blob_attr *msg)
++{
++ struct blob_attr *tb[__RPC_LXC_CREATE_MAX];
++ struct rpc_lxc *l = NULL;
++ int rc;
++
++ char *template = "none";
++ int flags = 0;
++ char **args = NULL;
++
++ blobmsg_parse(rpc_lxc_create_policy, __RPC_LXC_CREATE_MAX, tb, blob_data(msg), blob_len(msg));
++
++ l = rpc_lxc_init(tb);
++ if (!l) return UBUS_STATUS_INVALID_ARGUMENT;
++
++ if (tb[RPC_LXC_CREATE_TEMPLATE])
++ template = blobmsg_data(tb[RPC_LXC_CREATE_TEMPLATE]);
++
++ if (tb[RPC_LXC_CREATE_FLAGS])
++ flags = blobmsg_get_u32(tb[RPC_LXC_CREATE_FLAGS]);
++
++ if (tb[RPC_LXC_CREATE_ARGS]) {
++ struct blob_attr *cur;
++ int num, rem;
++
++ num = blobmsg_check_array(tb[RPC_LXC_CREATE_ARGS], BLOBMSG_TYPE_STRING);
++
++ // trailing NULL is needed
++ args = calloc(num + 1, sizeof(char *));
++ if (!args) {
++ rc = UBUS_STATUS_UNKNOWN_ERROR;
++ goto out;
++ }
++
++ num = 0;
++ blobmsg_for_each_attr(cur, tb[RPC_LXC_CREATE_ARGS], rem)
++ {
++ if (blobmsg_type(cur) != BLOBMSG_TYPE_STRING)
++ continue;
++
++ args[num++] = (char *) blobmsg_data(cur);
++ }
++ }
++
++ if (!l->container->create(l->container, template, NULL, NULL, flags, args)) {
++ rc = UBUS_STATUS_INVALID_ARGUMENT;
++ goto out;
++ }
++
++ rc = UBUS_STATUS_OK;
++out:
++ rpc_lxc_done(l);
++ free(args);
++ return rc;
++}
++
++static int
++rpc_lxc_destroy(struct ubus_context *ctx, struct ubus_object *obj,
++ struct ubus_request_data *req, const char *method,
++ struct blob_attr *msg)
++{
++ struct blob_attr *tb[__RPC_LXC_MAX];
++ struct rpc_lxc *l = NULL;
++ int rc;
++
++ blobmsg_parse(rpc_lxc_min_policy, __RPC_LXC_MAX, tb, blob_data(msg), blob_len(msg));
++
++ l = rpc_lxc_init(tb);
++ if (!l) return UBUS_STATUS_INVALID_ARGUMENT;
++
++ if (l->container->is_running(l->container)) {
++ rc = UBUS_STATUS_UNKNOWN_ERROR;
++ goto out;
++ }
++
++ if (!l->container->destroy(l->container)) {
++ rc = UBUS_STATUS_INVALID_ARGUMENT;
++ goto out;
++ }
++
++ rc = UBUS_STATUS_OK;
++out:
++ rpc_lxc_done(l);
++ return rc;
++}
++
++static int
++rpc_lxc_list(struct ubus_context *ctx, struct ubus_object *obj,
++ struct ubus_request_data *req, const char *method,
++ struct blob_attr *msg)
++{
++
++ blob_buf_init(&buf, 0);
++
++ int rc;
++ char **names;
++ struct lxc_container **cret;
++
++ rc = list_all_containers(NULL, &names, &cret);
++ if (rc == -1)
++ return UBUS_STATUS_UNKNOWN_ERROR;
++
++ for (int i = 0; i < rc; i++) {
++ struct lxc_container *c = cret[i];
++ blobmsg_add_string(&buf, names[i], c->state(c));
++
++ free(names[i]);
++ lxc_container_put(c);
++ }
++
++ ubus_send_reply(ctx, req, buf.head);
++
++ return UBUS_STATUS_OK;
++}
++
++static int
++rpc_lxc_api_init(const struct rpc_daemon_ops *o, struct ubus_context *ctx)
++{
++ static const struct ubus_method lxc_methods[] = {
++ UBUS_METHOD("start", rpc_lxc_start, rpc_lxc_min_policy),
++ UBUS_METHOD("reboot", rpc_lxc_reboot, rpc_lxc_min_policy),
++ UBUS_METHOD("shutdown", rpc_lxc_shutdown, rpc_lxc_shutdown_policy),
++ UBUS_METHOD("stop", rpc_lxc_stop, rpc_lxc_min_policy),
++ UBUS_METHOD("freeze", rpc_lxc_freeze, rpc_lxc_min_policy),
++ UBUS_METHOD("unfreeze", rpc_lxc_unfreeze, rpc_lxc_min_policy),
++ UBUS_METHOD("rename", rpc_lxc_rename, rpc_lxc_rename_policy),
++ UBUS_METHOD("create", rpc_lxc_create, rpc_lxc_create_policy),
++ UBUS_METHOD("destroy", rpc_lxc_destroy, rpc_lxc_min_policy),
++ UBUS_METHOD_NOARG("list", rpc_lxc_list),
++ };
++
++ static struct ubus_object_type lxc_type =
++ UBUS_OBJECT_TYPE("luci-rpc-lxc", lxc_methods);
++
++ static struct ubus_object obj = {
++ .name = "lxc",
++ .type = &lxc_type,
++ .methods = lxc_methods,
++ .n_methods = ARRAY_SIZE(lxc_methods),
++ };
++
++ return ubus_add_object(ctx, &obj);
++}
++
++struct rpc_plugin rpc_plugin = {
++ .init = rpc_lxc_api_init
++};
+diff --git a/feeds/packages/utils/rrdtool1/Makefile b/feeds/packages/utils/rrdtool1/Makefile
+new file mode 100644
+index 0000000..98c0235
+--- /dev/null
++++ b/feeds/packages/utils/rrdtool1/Makefile
+@@ -0,0 +1,133 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=rrdtool1
++PKG_VERSION:=1.0.50
++PKG_RELEASE:=2
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/rrdtool-$(PKG_VERSION)
++PKG_SOURCE:=rrdtool-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:= \
++ http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.0.x \
++ http://www.fastmirrors.org/rrdtool/rrdtool-1.0.x \
++ ftp://ftp.sunet.se/pub/network/monitoring/rrdtool/rrdtool-1.0.x
++PKG_MD5SUM:=c466e2e7df95fa8e318e46437da87686
++PKG_MAINTAINER:=Jo-Philipp Wich <jow@openwrt.org>
++
++PKG_FIXUP:=autoreconf
++PKG_CHECK_FORMAT_SECURITY:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/rrdtool1/Default
++ TITLE:=Round Robin Database (RRD)
++ URL:=http://oss.oetiker.ch/rrdtool/
++endef
++
++define Package/rrdtool1/description/Default
++ RRD is the Acronym for Round Robin Database. RRD is a system to store and
++ display time-series data (i.e. network bandwidth, machine-room temperature,
++ server load average). It stores the data in a very compact way that will
++ not expand over time, and it presents useful graphs by processing the data
++ to enforce a certain data density. It can be used either via simple wrapper
++ scripts (from shell or Perl) or via frontends that poll network devices and
++ put friendly user interface on it.
++
++ This is version 1.0.x with cgilib-0.4, gd1.3 and libpng-1.0.9 linked into
++ librrd.so. The library is much smaller compared to the 1.2.x version with
++ separate dynamic linked libraries.
++endef
++
++define Package/librrd1
++$(call Package/rrdtool1/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+zlib
++ TITLE+= management library
++endef
++
++define Package/librrd1/description
++$(call Package/rrdtool1/description/Default)
++ This package contains a shared library, used by other programs.
++endef
++
++define Package/rrdcgi1
++$(call Package/rrdtool1/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+librrd1
++ TITLE+= CGI graphing tool
++endef
++
++define Package/rrdcgi1/description
++$(call Package/rrdtool1/description/Default)
++ This package contains the rrdcgi tool used to create web pages containing
++ RRD graphs based on templates.
++endef
++
++define Package/rrdtool1
++$(call Package/rrdtool1/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+librrd1
++ TITLE+= management tools
++endef
++
++define Package/rrdtool1/description
++$(call Package/rrdtool1/description/Default)
++ This package contains command line tools used to manage RRDs.
++endef
++
++TARGET_CFLAGS += $(FPIC) --std=c99
++
++CONFIGURE_ARGS += \
++ $(DISABLE_NLS) \
++ --enable-shared=yes \
++ --enable-static=yes \
++ --disable-rpath \
++ --with-gnu-ld \
++ --enable-local-zlib
++
++CONFIGURE_VARS += \
++ ac_cv_path_PERL=no \
++ rd_cv_ieee_works=yes \
++ shrext_cmds=".so"
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ shrext_cmds=".so" \
++ all install
++endef
++
++define Package/rrdtool1/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/rrd{tool,update} $(1)/usr/bin/
++endef
++
++define Package/rrdcgi1/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/rrdcgi $(1)/usr/bin/
++endef
++
++define Package/librrd1/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/librrd.so.* $(1)/usr/lib/
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/lib/rrdtool-1.0/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/rrd.h $(1)/usr/lib/rrdtool-1.0/include/
++ $(INSTALL_DIR) $(1)/usr/lib/rrdtool-1.0/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/librrd.{a,so*} $(1)/usr/lib/rrdtool-1.0/lib/
++endef
++
++$(eval $(call BuildPackage,librrd1))
++$(eval $(call BuildPackage,rrdcgi1))
++$(eval $(call BuildPackage,rrdtool1))
+diff --git a/feeds/packages/utils/rrdtool1/patches/001-no_ordering_cd_joke.patch b/feeds/packages/utils/rrdtool1/patches/001-no_ordering_cd_joke.patch
+new file mode 100644
+index 0000000..442fe49
+--- /dev/null
++++ b/feeds/packages/utils/rrdtool1/patches/001-no_ordering_cd_joke.patch
+@@ -0,0 +1,21 @@
++diff -urN rrdtool-1.0.50/configure rrdtool-1.0.50.new/configure
++--- rrdtool-1.0.50/configure 2005-04-25 22:48:09.000000000 +0200
+++++ rrdtool-1.0.50.new/configure 2009-03-09 17:25:38.000000000 +0100
++@@ -24873,17 +24873,12 @@
++ echo "${ECHO_T}and out again" >&6
++
++ echo $ECHO_N "ordering CD from http://people.ee.ethz.ch/~oetiker/wish $ac_c" 1>&6
++-sleep 1
++ echo $ECHO_N ".$ac_c" 1>&6
++-sleep 2
++ echo $ECHO_N ".$ac_c" 1>&6
++-sleep 1
++ echo $ECHO_N ".$ac_c" 1>&6
++-sleep 3
++ echo $ECHO_N ".$ac_c" 1>&6
++ echo $ECHO_N ".$ac_c" 1>&6
++ echo $ECHO_N ".$ac_c" 1>&6
++-sleep 2
++ echo "$as_me:$LINENO: result: just kidding ;-)" >&5
++ echo "${ECHO_T} just kidding ;-)" >&6
++ echo
+diff --git a/feeds/packages/utils/rrdtool1/patches/002-no_timezone.patch b/feeds/packages/utils/rrdtool1/patches/002-no_timezone.patch
+new file mode 100644
+index 0000000..07564b4
+--- /dev/null
++++ b/feeds/packages/utils/rrdtool1/patches/002-no_timezone.patch
+@@ -0,0 +1,24 @@
++--- a/src/rrd_tool.c
+++++ b/src/rrd_tool.c
++@@ -225,11 +225,8 @@
++ struct rusage myusage;
++ struct timeval starttime;
++ struct timeval currenttime;
++- struct timezone tz;
++
++- tz.tz_minuteswest =0;
++- tz.tz_dsttime=0;
++- gettimeofday(&starttime,&tz);
+++ gettimeofday(&starttime,NULL);
++ #endif
++
++ while (fgets(aLine, sizeof(aLine)-1, stdin)){
++@@ -252,7 +249,7 @@
++
++ #if HAVE_GETRUSAGE
++ getrusage(RUSAGE_SELF,&myusage);
++- gettimeofday(&currenttime,&tz);
+++ gettimeofday(&currenttime,NULL);
++ printf("OK u:%1.2f s:%1.2f r:%1.2f\n",
++ (double)myusage.ru_utime.tv_sec+
++ (double)myusage.ru_utime.tv_usec/1000000.0,
+diff --git a/feeds/packages/utils/rrdtool1/patches/020-x86-float-cast.patch b/feeds/packages/utils/rrdtool1/patches/020-x86-float-cast.patch
+new file mode 100644
+index 0000000..5b8a662
+--- /dev/null
++++ b/feeds/packages/utils/rrdtool1/patches/020-x86-float-cast.patch
+@@ -0,0 +1,13 @@
++Index: rrdtool-1.0.50/src/rrd_format.h
++===================================================================
++--- rrdtool-1.0.50.orig/src/rrd_format.h
+++++ rrdtool-1.0.50/src/rrd_format.h
++@@ -20,7 +20,7 @@
++
++ #define RRD_COOKIE "RRD"
++ #define RRD_VERSION "0001"
++-#define FLOAT_COOKIE 8.642135E130
+++#define FLOAT_COOKIE ((double)8.642135E130)
++
++ #if defined(WIN32)
++ #define DNAN ((double)fmod(0.0,0.0))
+diff --git a/feeds/packages/utils/rrdtool1/patches/030-pod2man-stderr.patch b/feeds/packages/utils/rrdtool1/patches/030-pod2man-stderr.patch
+new file mode 100644
+index 0000000..feadf3a
+--- /dev/null
++++ b/feeds/packages/utils/rrdtool1/patches/030-pod2man-stderr.patch
+@@ -0,0 +1,11 @@
++--- rrdtool-1.0.50/doc/Makefile.am.orig 2013-11-16 11:44:50.940231208 -0500
+++++ rrdtool-1.0.50/doc/Makefile.am 2013-11-16 11:45:09.802229483 -0500
++@@ -35,7 +35,7 @@
++ all-local: link txt man html
++
++ .pod.1 .pm.1 .pl.1:
++- pod2man --release=$(VERSION) --center=RRDtool $< > $@
+++ pod2man --stderr --release=$(VERSION) --center=RRDtool $< > $@
++
++ .1.txt:
++ @NROFF@ -man -Tlp $< > $@ || echo @NROFF@ failed > $@
+diff --git a/feeds/packages/utils/rtklib/Makefile b/feeds/packages/utils/rtklib/Makefile
+new file mode 100644
+index 0000000..a48b15b
+--- /dev/null
++++ b/feeds/packages/utils/rtklib/Makefile
+@@ -0,0 +1,96 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=rtklib
++PKG_VERSION:=2.4.2_p11
++PKG_RELEASE:=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/nunojpg/RTKLIB.git
++PKG_SOURCE_VERSION:=df578f4d6708ae0b648c254d168882285d0053cc
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_LICENSE:=BSD-2-Clause
++
++PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/rtklib/default
++ SUBMENU:=RTKLIB Suite
++ SECTION:=utils
++ CATEGORY:=Utilities
++ URL:=http://www.rtklib.com/
++ DEPENDS:=+libpthread +librt
++endef
++
++define Package/convbin
++$(call Package/rtklib/default)
++ TITLE:=RINEX Converter
++endef
++
++define Package/pos2kml
++$(call Package/rtklib/default)
++ TITLE:=Solution to KML converter
++endef
++
++define Package/rnx2rtkp
++$(call Package/rtklib/default)
++ TITLE:=Post-Processing Analysis
++endef
++
++define Package/rtkrcv
++$(call Package/rtklib/default)
++ TITLE:=Real-Time Positioning
++endef
++
++define Package/str2str
++$(call Package/rtklib/default)
++ TITLE:=Communication Server
++endef
++
++define Build/Compile
++ rm -rf $(PKG_INSTALL_DIR)
++ mkdir -p $(PKG_INSTALL_DIR)
++ $(MAKE) -C $(PKG_BUILD_DIR)/app/convbin/gcc CC="$(TARGET_CC) $(TARGET_CFLAGS)"
++ $(MAKE) -C $(PKG_BUILD_DIR)/app/pos2kml/gcc CC="$(TARGET_CC) $(TARGET_CFLAGS)"
++ $(MAKE) -C $(PKG_BUILD_DIR)/app/rnx2rtkp/gcc CC="$(TARGET_CC) $(TARGET_CFLAGS)"
++ $(MAKE) -C $(PKG_BUILD_DIR)/app/rtkrcv/gcc CC="$(TARGET_CC) $(TARGET_CFLAGS)"
++ $(MAKE) -C $(PKG_BUILD_DIR)/app/str2str/gcc CC="$(TARGET_CC) $(TARGET_CFLAGS)"
++endef
++
++define Package/convbin/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/app/convbin/gcc/convbin $(1)/usr/bin/
++endef
++
++define Package/pos2kml/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/app/pos2kml/gcc/pos2kml $(1)/usr/bin/
++endef
++
++define Package/rnx2rtkp/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/app/rnx2rtkp/gcc/rnx2rtkp $(1)/usr/bin/
++endef
++
++define Package/rtkrcv/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/app/rtkrcv/gcc/rtkrcv $(1)/usr/bin/
++endef
++
++define Package/str2str/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/app/str2str/gcc/str2str $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,convbin))
++$(eval $(call BuildPackage,pos2kml))
++$(eval $(call BuildPackage,rnx2rtkp))
++$(eval $(call BuildPackage,rtkrcv))
++$(eval $(call BuildPackage,str2str))
+diff --git a/feeds/packages/utils/rtl-ais/Makefile b/feeds/packages/utils/rtl-ais/Makefile
+new file mode 100644
+index 0000000..ed8ddd4
+--- /dev/null
++++ b/feeds/packages/utils/rtl-ais/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=rtl-ais
++PKG_VERSION:=20150722
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/dgiardini/rtl-ais.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=b805be0164475e58a73b57763a8cbbf8a2bd0ded
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/rtl-ais
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=rtl-sdr AIS dual channel tuner
++ DEPENDS:=+libpthread +librtlsdr
++ URL:=https://github.com/dgiardini/rtl-ais
++endef
++
++define Package/rtl-ais/description
++ rtl_ais uses a rtl2832u dvb-t dongle to tune AIS (Automatic Identification
++ System) used on ships and by vessel traffic services
++endef
++
++define Package/rtl-ais/conffiles
++/etc/config/rtl_ais
++endef
++
++define Package/rtl-ais/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/rtl_ais $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/rtl_ais.init $(1)/etc/init.d/rtl_ais
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/uci_rtl_ais $(1)/etc/config/rtl_ais
++endef
++
++$(eval $(call BuildPackage,rtl-ais))
+diff --git a/feeds/packages/utils/rtl-ais/files/rtl_ais.init b/feeds/packages/utils/rtl-ais/files/rtl_ais.init
+new file mode 100644
+index 0000000..15269b0
+--- /dev/null
++++ b/feeds/packages/utils/rtl-ais/files/rtl_ais.init
+@@ -0,0 +1,19 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=99
++
++USE_PROCD=1
++PROG=/usr/bin/rtl_ais
++
++start_service() {
++ enabled="$(uci_get rtl_ais @rtl_ais[0] enabled 0)"
++ ppm="$(uci_get rtl_ais @rtl_ais[0] ppm 0)"
++
++ [ "$enabled" != "1" ] && return
++
++ procd_open_instance
++ procd_set_param command "$PROG" -p "$ppm"
++ procd_set_param respawn
++ procd_close_instance
++}
+diff --git a/feeds/packages/utils/rtl-ais/files/uci_rtl_ais b/feeds/packages/utils/rtl-ais/files/uci_rtl_ais
+new file mode 100644
+index 0000000..1b5f1ec
+--- /dev/null
++++ b/feeds/packages/utils/rtl-ais/files/uci_rtl_ais
+@@ -0,0 +1,3 @@
++config rtl_ais
++ option enabled 0
++ option ppm 0
+diff --git a/feeds/packages/utils/rtl-sdr/Makefile b/feeds/packages/utils/rtl-sdr/Makefile
+new file mode 100644
+index 0000000..c716fb2
+--- /dev/null
++++ b/feeds/packages/utils/rtl-sdr/Makefile
+@@ -0,0 +1,92 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=rtl-sdr
++PKG_VERSION:=0.5.3-20150608-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://git.osmocom.org/rtl-sdr.git
++PKG_SOURCE_VERSION:=e3c03f738f5aef4dc51e2b741fbdb542b9cc1bb1
++
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++PKG_BUILD_PARALLEL:=1
++
++CMAKE_INSTALL:=1
++
++PKG_LICENSE:=GPLv2
++PKG_LICENSE_FILES:=COPYING
++
++PKG_MAINTAINER:=Vasilis Tsiligiannis <b_tsiligiannis@silverton.gr>
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/rtl-sdr/Default
++ TITLE:=Software Defined Radio with Realtek RTL2832U
++ URL:=http://sdr.osmocom.org/trac/wiki/rtl-sdr
++endef
++
++define Package/rtl-sdr/Default/description
++ rtl-sdr allows DVB-T dongles based on the Realtek RTL2832U to be used as
++ an inexpensive SDR.
++endef
++
++define Package/rtl-sdr
++ $(call Package/rtl-sdr/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+librt +libpthread +librtlsdr
++endef
++
++define Package/rtl-sdr/description
++ $(call Package/rtl-sdr/Default/description)
++
++ This package contains the utilities and daemons.
++endef
++
++define Package/librtlsdr
++ $(call Package/rtl-sdr/Default)
++ TITLE+= shared library
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= library
++ DEPENDS:=+libusb-1.0
++endef
++
++define Package/librtlsdr/description
++ $(call Package/rtl-sdr/Default/description)
++
++ This package contains the librtlsdr shared library.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/librtlsdr.so* $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/librtlsdr.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/rtl-sdr/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/rtl_* $(1)/usr/bin/
++endef
++
++define Package/librtlsdr/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/librtlsdr.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,rtl-sdr))
++$(eval $(call BuildPackage,librtlsdr))
+diff --git a/feeds/packages/utils/sane-backends/Makefile b/feeds/packages/utils/sane-backends/Makefile
+new file mode 100644
+index 0000000..ffed673
+--- /dev/null
++++ b/feeds/packages/utils/sane-backends/Makefile
+@@ -0,0 +1,357 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sane-backends
++PKG_VERSION:=1.0.25
++PKG_RELEASE:=1
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://fossies.org/linux/misc \
++ https://alioth.debian.org/frs/download.php/file/4146/
++PKG_MD5SUM:=f9ed5405b3c12f07c6ca51ee60225fe7
++PKG_MAINTAINER:=Luiz Angelo Daros de Luca <luizluca@gmail.com>
++PKG_LICENSE:=GPL-2.0 GPL-2.0+
++PKG_LICENSE_FILES:=COPYING LICENSE
++
++PKG_FIXUP:=autoreconf
++PKG_REMOVE_FILES:=aclocal.m4
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++SANE_BACKENDS:=
++
++define Package/sane-backends/Default
++ TITLE:=Scanner Access Now Easy
++ URL:=http://www.sane-project.org/
++endef
++
++define Package/sane-backends/Default/description
++ SANE (Scanner Access Now Easy) is a universal scanner interface.
++endef
++
++define Package/sane-backends
++$(call Package/sane-backends/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= (drivers)
++ DEPENDS:=+ALL:sane-backends-all
++endef
++
++define Package/sane-backends/description
++$(call Package/sane-backends/Default/description)
++.
++This
++endef
++
++define Package/sane-backends/config
++ menu "Select SANE backends"
++ depends on PACKAGE_sane-backends
++
++
++ config PACKAGE_sane-backends-all
++ depends on PACKAGE_sane-backends
++ prompt "Include all SANE backends (sane-backends-all)"
++
++ comment "Modules"
++
++$(foreach backend,$(SANE_BACKENDS), \
++ $(eval \
++ $(call Package/Default)
++ $(call Package/sane-$(backend))
++ )\
++ config PACKAGE_sane-$(backend)
++ prompt "$(TITLE)"
++ $(foreach config_dep,\
++ $(filter @%,
++ $(foreach v, $(DEPENDS), $(if $(findstring :,$v),,$v))
++ ),\
++ depends on $(strip $(subst @,,$(config_dep)))
++ )
++)
++ endmenu
++
++endef
++
++# returns conditional dependency on sane backend
++# 1: backend name
++#
++# If there is no config deps on $(1), returns +sane-$(1).
++# Otherwise, +(CONFIG1&&CONFIG2&&..):sane-$(1)
++define SaneBackendDependency
++ $(eval \
++ $(call Package/Default)
++ $(call Package/sane-$(1))
++ FILTER_CONFIG:=$$(strip \
++ $$(foreach config_dep, \
++ $$(filter @%, \
++ $$(foreach v, \
++ $$(DEPENDS), \
++ $$(if $$(findstring :,$$v),,$$v) \
++ ) \
++ ), \
++ $$(subst @,,$$(config_dep)) \
++ ) \
++ )
++ ifneq (,$$(FILTER_CONFIG))
++ FILTER_CONFIG:=($$(subst $$(space),&&,$$(FILTER_CONFIG))):
++ endif
++ ) \
++ +$(FILTER_CONFIG)sane-$(1)
++endef
++
++define Package/sane-backends-all
++$(call Package/sane-backends/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= (all backends)
++ DEPENDS:=$(foreach backend,$(SANE_BACKENDS),$(strip $(call SaneBackendDependency,$(backend))))
++ HIDDEN:=1
++endef
++
++define Package/sane-backends/description
++$(call Package/sane-backends/Default/description)
++.
++Metapackage for selecting all SANE Backends
++endef
++
++define Package/sane-daemon
++$(call Package/sane-backends/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libsane
++ TITLE+= (network daemon)
++endef
++
++define Package/sane-daemon/description
++$(call Package/sane-backends/Default/description)
++This package contains the SANE daemon.
++endef
++
++define Package/libsane
++ $(call Package/sane-backends/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libusb-compat
++ TITLE+= (libraries)
++endef
++
++define Package/libsane/description
++$(call Package/sane-backends/Default/description)
++This package contains the SANE shared libraries.
++endef
++
++define Package/sane-frontends
++ $(call Package/sane-backends/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libsane +libjpeg +libpng
++ TITLE+= (frontends)
++endef
++
++define Package/sane-frontends/description
++$(call Package/sane-backends/Default/description)
++This package contains the SANE frontends.
++endef
++
++TARGET_LDFLAGS += \
++ -Wl,-rpath-link $(STAGING_DIR)/usr/lib \
++ -Wl,-rpath-link $(PKG_BUILD_DIR)/backend/.libs
++
++CONFIGURE_ARGS+= \
++ --enable-shared \
++ --enable-static \
++ --disable-translations \
++ --disable-latex \
++ --without-gphoto2 \
++ --without-snmp
++
++CONFIGURE_VARS+= \
++ ac_cv_func_mmap_fixed_mapped="yes" \
++
++define Build/Configure
++ mkdir -p $(PKG_BUILD_DIR)/backend/.libs
++ $(Build/Configure/Default)
++endef
++
++define Package/libsane/install
++ $(INSTALL_DIR) $(1)/usr/lib/sane/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsane.so.* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/sane/libsane-dll.so.* $(1)/usr/lib/sane/
++ $(INSTALL_DIR) $(1)/etc/sane.d/dll.d
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/sane.d/dll.conf $(1)/etc/sane.d/
++endef
++
++define Package/libsane/conffiles
++/etc/sane.d/dll.conf
++endef
++
++define Package/sane-daemon/install
++ $(INSTALL_DIR) $(1)/etc/sane.d
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/sane.d/saned.conf $(1)/etc/sane.d/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/* $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/xinetd.d
++ $(CP) ./files/xinet.d_sane-port $(1)/etc/xinetd.d/sane-port
++endef
++
++define Package/sane-daemon/conffiles
++/etc/sane.d/saned.conf
++endef
++
++define Package/sane-frontends/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++define Package/sane-backends-all/install
++ /bin/true
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/sane $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsane.{a,so*} $(1)/usr/lib/
++endef
++
++# 1: short name
++# 2: description
++# 3: dependencies on other packages
++define SaneBackend
++ SANE_BACKENDS+= $(1)
++
++ define Package/sane-$(1)
++ $(call Package/sane-backends/Default)
++ TITLE:=SANE backend (sane-$(1)) for $(2)
++ DEPENDS+= +libsane $(3)
++ HIDDEN:=1
++ endef
++
++ define Package/sane-$(1)/description
++ $(call Package/sane-backends/Default/description)
++.
++This package contains the SANE backend for $(2).
++ endef
++
++ define Package/sane-$(1)/install
++ if [ -f "$(PKG_INSTALL_DIR)/etc/sane.d/$(1).conf" ]; then \
++ $(INSTALL_DIR) $$(1)/etc/sane.d ; \
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/sane.d/$(1).conf $$(1)/etc/sane.d/; \
++ fi
++ $(INSTALL_DIR) $$(1)/usr/lib/sane
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/sane/libsane-$(1).so.* $$(1)/usr/lib/sane/
++ if [ -d "$(PKG_INSTALL_DIR)/usr/share/sane/$(1)" ]; then \
++ $(INSTALL_DIR) $$(1)/usr/share/sane/ ; \
++ $(CP) -a $(PKG_INSTALL_DIR)/usr/share/sane/$(1) $$(1)/usr/share/sane/ ; \
++ fi
++ endef
++
++ define Package/sane-$(1)/conffiles
++ /etc/sane.d/$(1).conf
++ endef
++
++ $$(eval $$(call BuildPackage,sane-$(1)))
++endef
++
++$(eval $(call BuildPackage,libsane))
++$(eval $(call BuildPackage,sane-daemon))
++$(eval $(call SaneBackend,abaton,Abaton flatbed scanners))
++$(eval $(call SaneBackend,agfafocus,AGFA Focus flatbed scanners))
++$(eval $(call SaneBackend,apple,Apple flatbed scanners))
++$(eval $(call SaneBackend,artec,Artec flatbed scanners))
++$(eval $(call SaneBackend,artec_eplus48u,Artec E+ 48U and re-badged models))
++$(eval $(call SaneBackend,as6e,Artec AS6E parallel port interface scanner))
++$(eval $(call SaneBackend,avision,Avision and Avision OEM scanners and possibly more flatbed and film scanners))
++$(eval $(call SaneBackend,bh,Bell+Howell Copiscan II series document scanners))
++$(eval $(call SaneBackend,canon,Canon SCSI scanners))
++$(eval $(call SaneBackend,canon630u,the Canon 630u USB flatbed scanner))
++$(eval $(call SaneBackend,canon_dr,Canon DR-series scanners))
++# Depends on libieee1284
++#$(eval $(call SaneBackend,canon_pp,Canon CanoScan Parallel Port flatbed scanners,+libieee1284))
++$(eval $(call SaneBackend,cardscan,Corex CardScan usb scanners))
++$(eval $(call SaneBackend,coolscan,Nikon film-scanners))
++$(eval $(call SaneBackend,coolscan2,Nikon Coolscan film scanners))
++$(eval $(call SaneBackend,coolscan3,Nikon Coolscan film scanners))
++$(eval $(call SaneBackend,dc210,Kodak DC210 Digital Camera,+libjpeg))
++$(eval $(call SaneBackend,dc240,Kodak DC240 Digital Camera,+libjpeg))
++$(eval $(call SaneBackend,dc25,Kodak DC20/DC25 Digital Cameras))
++$(eval $(call SaneBackend,dell1600n_net,Dell 1600n,+libtiff))
++$(eval $(call SaneBackend,dmc,Polaroid Digital Microscope Camera))
++$(eval $(call SaneBackend,epjitsu,Epson-based Fujitsu USB scanners))
++$(eval $(call SaneBackend,epson,EPSON scanners))
++$(eval $(call SaneBackend,epsonds,EPSON scanners,+libjpeg)) ####
++$(eval $(call SaneBackend,epson2,EPSON scanners))
++$(eval $(call SaneBackend,fujitsu,Fujitsu flatbed and ADF scanners))
++$(eval $(call SaneBackend,genesys,GL646 GL841 GL843 GL847 and GL124 based USB flatbed scanners))
++#$(eval $(call SaneBackend,gphoto2,digital cameras supported by gphoto2,+libjpeg))
++$(eval $(call SaneBackend,gt68xx,GT-68XX based USB flatbed scanners))
++$(eval $(call SaneBackend,hp,HP ScanJet scanners))
++$(eval $(call SaneBackend,hp3500,Hewlett-Packard ScanJet 3500 series scanners))
++$(eval $(call SaneBackend,hp3900,RTS8822 chipset based scanners,+libtiff))
++$(eval $(call SaneBackend,hp4200,Hewlett-Packard 4200 scanners))
++$(eval $(call SaneBackend,hp5400,Hewlett-Packard 54XX scanners))
++$(eval $(call SaneBackend,hp5590,Hewlett-Packard 4500C/4570C/5500C/5550C/5590/7650 Workgroup/Document scanners))
++$(eval $(call SaneBackend,hpljm1005,Hewlett-Packard LaserJet M1005 MFP Scanner))
++# Depends on libieee1284
++#$(eval $(call SaneBackend,hpsj5s,HP ScanJet 5S sheet-fed scanner,+libieee1284))
++$(eval $(call SaneBackend,hs2p,Ricoh SCSI flatbed/ADF scanners))
++$(eval $(call SaneBackend,ibm,IBM and Ricoh SCSI flatbed scanners))
++$(eval $(call SaneBackend,kodak,big Kodak flatbed and ADF scanners))
++$(eval $(call SaneBackend,kodakaio,Kodak aio printer / scanners))
++$(eval $(call SaneBackend,kvs20xx,Panasonic KV-S20xxC USB/SCSI ADF scanners))
++$(eval $(call SaneBackend,kvs40xx,Panasonic KV-S40xxC USB/SCSI ADF scanners))
++$(eval $(call SaneBackend,kvs1025,Panasonic KV-S102xC USB ADF scanners))
++$(eval $(call SaneBackend,leo,LEO Technologies scanners))
++$(eval $(call SaneBackend,lexmark,Lexmark X1100/X1200 Series scanners))
++$(eval $(call SaneBackend,ma1509,Mustek BearPaw 1200F USB scanner))
++$(eval $(call SaneBackend,magicolor,KONICA MINOLTA magicolor scanners))
++$(eval $(call SaneBackend,matsushita,Panasonic KV-SS high speed scanners))
++$(eval $(call SaneBackend,microtek,Microtek scanners))
++$(eval $(call SaneBackend,microtek2,Microtek scanners with SCSI-2 command set))
++$(eval $(call SaneBackend,mustek,Mustek SCSI flatbed scanners and some other devices))
++# Depends on libieee1284
++#$(eval $(call SaneBackend,mustek_pp,Mustek parallel port flatbed scanners,+libieee1284))
++$(eval $(call SaneBackend,mustek_usb,Mustek USB flatbed scanners))
++$(eval $(call SaneBackend,mustek_usb2,SQ113 based USB flatbed scanners))
++$(eval $(call SaneBackend,nec,NEC scanners))
++$(eval $(call SaneBackend,net,network backend))
++$(eval $(call SaneBackend,niash,scanners based on the NIASH chipset))
++$(eval $(call SaneBackend,p5,the Primax PagePartner))
++$(eval $(call SaneBackend,pie,PIE Devcom and AdLib SCSI flatbed scanners))
++$(eval $(call SaneBackend,pieusb,PIE Devcom and AdLib SCSI flatbed scanners)) #####
++$(eval $(call SaneBackend,pixma,Canon Multi-Function Printers and CanoScan Scanners))
++$(eval $(call SaneBackend,plustek,LM983[1/2/3] based USB flatbed scanners))
++$(eval $(call SaneBackend,plustek_pp,Plustek parallel port flatbed scanners))
++$(eval $(call SaneBackend,qcam,Connectix QuickCam cameras,@(TARGET_x86||TARGET_x86_64)))
++$(eval $(call SaneBackend,ricoh,Ricoh flatbed scanners))
++$(eval $(call SaneBackend,rts8891,rts8891 based scanners))
++$(eval $(call SaneBackend,s9036,Siemens 9036 flatbed scanners))
++$(eval $(call SaneBackend,sceptre,SCEPTRE scanners))
++$(eval $(call SaneBackend,sharp,SHARP scanners))
++$(eval $(call SaneBackend,sm3600,Microtek scanners with M011 USB chip))
++$(eval $(call SaneBackend,sm3840,Microtek scanners with SCAN08 USB chip))
++$(eval $(call SaneBackend,snapscan,AGFA SnapScan flatbed scanners))
++$(eval $(call SaneBackend,sp15c,Fujitsu ScanPartner 15C flatbed scanner))
++$(eval $(call SaneBackend,st400,Siemens ST/Highscan flatbed scanners))
++$(eval $(call SaneBackend,stv680,STV680 cameras))
++$(eval $(call SaneBackend,tamarack,Tamarack flatbed scanners))
++$(eval $(call SaneBackend,teco1,TECO / RELISYS scanners))
++$(eval $(call SaneBackend,teco2,TECO / RELISYS scanners))
++$(eval $(call SaneBackend,teco3,TECO / RELISYS scanners))
++$(eval $(call SaneBackend,test,testing frontends))
++$(eval $(call SaneBackend,u12,Plustek USB flatbed scanners based on older parport designs))
++$(eval $(call SaneBackend,umax,UMAX scanners))
++$(eval $(call SaneBackend,umax1220u,the UMAX Astra 1220U and similar scanners))
++$(eval $(call SaneBackend,umax_pp,Umax Astra parallel port flatbed scanners))
++$(eval $(call SaneBackend,v4l,Video for Linux API,+libv4l +libjpeg))
++$(eval $(call SaneBackend,xerox_mfp,Xerox Phaser 3200MFP device))
++$(eval $(call BuildPackage,sane-backends))
++$(eval $(call BuildPackage,sane-backends-all))
++$(eval $(call BuildPackage,sane-frontends))
+diff --git a/feeds/packages/utils/sane-backends/files/xinet.d_sane-port b/feeds/packages/utils/sane-backends/files/xinet.d_sane-port
+new file mode 100644
+index 0000000..9119973
+--- /dev/null
++++ b/feeds/packages/utils/sane-backends/files/xinet.d_sane-port
+@@ -0,0 +1,14 @@
++# default: off
++# description: The saned provides scanner service via the network. \
++# Applications like kooka, xsane or xscanimage can use the remote \
++# scanner.
++service sane-port
++{
++ socket_type = stream
++ port = 6566
++ wait = no
++ user = root
++ group = root
++ server = /usr/sbin/saned
++ disable = yes
++}
+diff --git a/feeds/packages/utils/sane-backends/patches/002-remove-uneeded.patch b/feeds/packages/utils/sane-backends/patches/002-remove-uneeded.patch
+new file mode 100644
+index 0000000..8348058
+--- /dev/null
++++ b/feeds/packages/utils/sane-backends/patches/002-remove-uneeded.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -400,7 +400,7 @@ target_alias = @target_alias@
++ top_build_prefix = @top_build_prefix@
++ top_builddir = @top_builddir@
++ top_srcdir = @top_srcdir@
++-SUBDIRS = include lib sanei backend frontend tools doc po testsuite
+++SUBDIRS = include lib sanei backend frontend
++ DIST_SUBDIRS = include lib sanei backend frontend tools doc po japi testsuite
++ dist_doc_DATA = AUTHORS ChangeLog COPYING LICENSE NEWS PROBLEMS PROJECTS \
++ README README.aix README.beos README.darwin README.djpeg README.freebsd \
+diff --git a/feeds/packages/utils/sane-backends/patches/020-fix_pieusb.patch b/feeds/packages/utils/sane-backends/patches/020-fix_pieusb.patch
+new file mode 100644
+index 0000000..ae97040
+--- /dev/null
++++ b/feeds/packages/utils/sane-backends/patches/020-fix_pieusb.patch
+@@ -0,0 +1,16 @@
++--- a/backend/pieusb_buffer.c
+++++ b/backend/pieusb_buffer.c
++@@ -104,11 +104,13 @@
++
++ /* When creating the release backend, make complains about unresolved external
++ * le16toh, although it finds the include <endian.h> */
+++#ifndef le16toh
++ #if __BYTE_ORDER == __LITTLE_ENDIAN
++ #define le16toh(x) (x)
++ #else
++ #define le16toh(x) __bswap_16 (x)
++ #endif
+++#endif
++
++ static void buffer_update_read_index(struct Pieusb_Read_Buffer* buffer, int increment);
++
+diff --git a/feeds/packages/utils/sane-backends/patches/030-musl.patch b/feeds/packages/utils/sane-backends/patches/030-musl.patch
+new file mode 100644
+index 0000000..7f0a5a2
+--- /dev/null
++++ b/feeds/packages/utils/sane-backends/patches/030-musl.patch
+@@ -0,0 +1,73 @@
++--- a/include/sane/sanei_udp.h
+++++ b/include/sane/sanei_udp.h
++@@ -27,6 +27,9 @@
++ #include <netinet/in.h>
++ #include <netdb.h>
++ #endif
+++#ifdef HAVE_SYS_TYPES_H
+++#include <sys/types.h>
+++#endif
++
++ extern SANE_Status sanei_udp_open(const char *host, int port, int *fdp);
++ extern SANE_Status sanei_udp_open_broadcast(int *fdp);
++--- a/backend/kvs20xx_cmd.h
+++++ b/backend/kvs20xx_cmd.h
++@@ -9,6 +9,10 @@
++ Panasonic KV-S20xx USB-SCSI scanners.
++ */
++
+++#ifdef HAVE_SYS_TYPES_H
+++#include <sys/types.h>
+++#endif
+++
++ #define COMMAND_BLOCK 1
++ #define DATA_BLOCK 2
++ #define RESPONSE_BLOCK 3
++--- a/backend/kvs40xx.h
+++++ b/backend/kvs40xx.h
++@@ -10,6 +10,9 @@
++
++ #include "../include/sane/config.h"
++ #include <semaphore.h>
+++#ifdef HAVE_SYS_TYPES_H
+++#include <sys/types.h>
+++#endif
++
++ #undef BACKEND_NAME
++ #define BACKEND_NAME kvs40xx
++--- a/backend/hp5400.c
+++++ b/backend/hp5400.c
++@@ -67,6 +67,9 @@
++ #include <stdlib.h> /* malloc, free */
++ #include <string.h> /* memcpy */
++ #include <stdio.h>
+++#ifdef HAVE_SYS_TYPES_H
+++#include <sys/types.h>
+++#endif
++
++
++ #define HP5400_CONFIG_FILE "hp5400.conf"
++--- a/backend/hp5590.c
+++++ b/backend/hp5590.c
++@@ -48,6 +48,9 @@
++ #include <stdio.h>
++ #include <string.h>
++ #include <unistd.h>
+++#ifdef HAVE_SYS_TYPES_H
+++#include <sys/types.h>
+++#endif
++
++ #include "../include/sane/sane.h"
++ #define BACKEND_NAME hp5590
++--- a/backend/epsonds-io.c
+++++ b/backend/epsonds-io.c
++@@ -16,6 +16,9 @@
++ #include "sane/config.h"
++ #include <ctype.h>
++ #include <unistd.h> /* sleep */
+++#ifdef HAVE_SYS_TYPES_H
+++#include <sys/types.h>
+++#endif
++
++ #include "epsonds.h"
++ #include "epsonds-io.h"
+diff --git a/feeds/packages/utils/sane-backends/patches/031-fix_uclibc.patch b/feeds/packages/utils/sane-backends/patches/031-fix_uclibc.patch
+new file mode 100644
+index 0000000..b7495a5
+--- /dev/null
++++ b/feeds/packages/utils/sane-backends/patches/031-fix_uclibc.patch
+@@ -0,0 +1,38 @@
++--- a/configure.in
+++++ b/configure.in
++@@ -279,6 +279,9 @@ dnl ************************************
++ dnl Checks for library functions
++ dnl ***********************************************************************
++
+++dnl Check mkostemp (missing in uclibc)
+++AC_CHECK_FUNC(mkostemp)
+++
++ dnl Define SOCKET_LIB, NSL_LIB, BIND_LIB, and RESOLV_LIB when required
++ dnl for functions we use.
++ AC_CHECK_FUNC(gethostbyaddr,, [AC_CHECK_LIB(bind, gethostbyaddr, BIND_LIB="-lbind")])
++--- a/include/sane/config.h.in
+++++ b/include/sane/config.h.in
++@@ -207,6 +207,9 @@
++ /* Define to 1 if you have the `mkdir' function. */
++ #undef HAVE_MKDIR
++
+++/* Define to 1 if you have a working `mkostemp' function. */
+++#undef HAVE_MKOSTEMP
+++
++ /* Define to 1 if you have a working `mmap' system call. */
++ #undef HAVE_MMAP
++
++--- a/backend/pieusb_buffer.c
+++++ b/backend/pieusb_buffer.c
++@@ -112,6 +112,11 @@
++ #endif
++ #endif
++
+++#ifndef HAVE_MKOSTEMP
+++/* uclibc might not implement mkostemp GNU extension */
+++#define mkostemp(template, flags) mkstemp(template)
+++#endif
+++
++ static void buffer_update_read_index(struct Pieusb_Read_Buffer* buffer, int increment);
++
++ /* READER */
+diff --git a/feeds/packages/utils/sane-backends/patches/050-remove_linked_libs_for_unused_preload.patch b/feeds/packages/utils/sane-backends/patches/050-remove_linked_libs_for_unused_preload.patch
+new file mode 100644
+index 0000000..bb01dd9
+--- /dev/null
++++ b/feeds/packages/utils/sane-backends/patches/050-remove_linked_libs_for_unused_preload.patch
+@@ -0,0 +1,11 @@
++--- a/backend/Makefile.am
+++++ b/backend/Makefile.am
++@@ -1142,7 +1142,7 @@ EXTRA_DIST += dll.aliases
++ nodist_libsane_la_SOURCES = dll-s.c
++ libsane_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dll
++ libsane_la_LDFLAGS = $(DIST_LIBS_LDFLAGS)
++-libsane_la_LIBADD = $(COMMON_LIBS) @PRELOADABLE_BACKENDS_ENABLED@ libdll_preload.la sane_strstatus.lo ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_pv8630.lo ../sanei/sanei_pp.lo ../sanei/sanei_thread.lo ../sanei/sanei_lm983x.lo ../sanei/sanei_access.lo ../sanei/sanei_net.lo ../sanei/sanei_wire.lo ../sanei/sanei_codec_bin.lo ../sanei/sanei_pa4s2.lo ../sanei/sanei_ab306.lo ../sanei/sanei_pio.lo ../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo ../sanei/sanei_magic.lo $(DL_LIBS) $(LIBV4L_LIBS) $(MATH_LIB) $(IEEE1284_LIBS) $(TIFF_LIBS) $(JPEG_LIBS) $(GPHOTO2_LIBS) $(SOCKET_LIBS) $(USB_LIBS) $(AVAHI_LIBS) $(SCSI_LIBS) $(PTHREAD_LIBS) $(RESMGR_LIBS)
+++libsane_la_LIBADD = $(COMMON_LIBS) @PRELOADABLE_BACKENDS_ENABLED@ libdll_preload.la sane_strstatus.lo ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_pv8630.lo ../sanei/sanei_pp.lo ../sanei/sanei_thread.lo ../sanei/sanei_lm983x.lo ../sanei/sanei_access.lo ../sanei/sanei_net.lo ../sanei/sanei_wire.lo ../sanei/sanei_codec_bin.lo ../sanei/sanei_pa4s2.lo ../sanei/sanei_ab306.lo ../sanei/sanei_pio.lo ../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo ../sanei/sanei_magic.lo $(DL_LIBS) $(MATH_LIB) $(IEEE1284_LIBS) $(SOCKET_LIBS) $(USB_LIBS) $(PTHREAD_LIBS) $(RESMGR_LIBS)
++
++ # WARNING: Automake is getting this wrong so have to do it ourselves.
++ libsane_la_DEPENDENCIES = $(COMMON_LIBS) @PRELOADABLE_BACKENDS_ENABLED@ libdll_preload.la sane_strstatus.lo ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_pv8630.lo ../sanei/sanei_pp.lo ../sanei/sanei_thread.lo ../sanei/sanei_lm983x.lo ../sanei/sanei_access.lo ../sanei/sanei_net.lo ../sanei/sanei_wire.lo ../sanei/sanei_codec_bin.lo ../sanei/sanei_pa4s2.lo ../sanei/sanei_ab306.lo ../sanei/sanei_pio.lo ../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo ../sanei/sanei_magic.lo @SANEI_SANEI_JPEG_LO@
+diff --git a/feeds/packages/utils/screen/Makefile b/feeds/packages/utils/screen/Makefile
+new file mode 100644
+index 0000000..80524d3
+--- /dev/null
++++ b/feeds/packages/utils/screen/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=screen
++PKG_VERSION:=4.3.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@GNU/screen
++PKG_MD5SUM:=5bb3b0ff2674e29378c31ad3411170ad
++
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/screen
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libncurses
++ TITLE:=Full-screen terminal window manager
++ URL:=http://www.gnu.org/software/screen/
++ MAINTAINER:=Etienne CHAMPETIER <champetier.etienne@gmail.com>
++endef
++
++define Package/screen/description
++ Screen is a full-screen window manager that multiplexes a physical
++ terminal between several processes, typically interactive shells.
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default,\
++ --with-sys-screenrc=/etc/screenrc \
++ )
++ # XXX: memmove() works well with overlapped memory areas
++ echo "#define USEMEMMOVE 1" >>$(PKG_BUILD_DIR)/config.h
++endef
++
++define Package/screen/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/screen $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) ./files/etc/screenrc $(1)/etc/screenrc
++endef
++
++define Package/screen/conffiles
++/etc/screenrc
++endef
++
++$(eval $(call BuildPackage,screen))
+diff --git a/feeds/packages/utils/screen/files/etc/screenrc b/feeds/packages/utils/screen/files/etc/screenrc
+new file mode 100644
+index 0000000..3337674
+--- /dev/null
++++ b/feeds/packages/utils/screen/files/etc/screenrc
+@@ -0,0 +1 @@
++startup_message off
+diff --git a/feeds/packages/utils/screen/patches/100-cross_compile_fix.patch b/feeds/packages/utils/screen/patches/100-cross_compile_fix.patch
+new file mode 100644
+index 0000000..d9662b4
+--- /dev/null
++++ b/feeds/packages/utils/screen/patches/100-cross_compile_fix.patch
+@@ -0,0 +1,64 @@
++--- a/configure
+++++ b/configure
++@@ -414,7 +414,7 @@ as_fn_error ()
++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
++ fi
++ $as_echo "$as_me: error: $2" >&2
++- as_fn_exit $as_status
+++ # as_fn_exit $as_status
++ } # as_fn_error
++
++ if expr a : '\(a\)' >/dev/null 2>&1 &&
++@@ -5942,8 +5942,6 @@ else
++ fi
++ rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++-test -f /lib/libsec.a || test -f /usr/lib/libsec.a && LIBS="$LIBS -lsec"
++-test -f /lib/libshadow.a || test -f /usr/lib/libshadow.a && LIBS="$LIBS -lshadow"
++ oldlibs="$LIBS"
++ LIBS="$LIBS -lsun"
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking IRIX sun library..." >&5
++@@ -7024,7 +7022,7 @@ as_fn_error ()
++ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
++ fi
++ $as_echo "$as_me: error: $2" >&2
++- as_fn_exit $as_status
+++ # as_fn_exit $as_status
++ } # as_fn_error
++
++
++--- a/pty.c
+++++ b/pty.c
++@@ -39,9 +39,9 @@
++ #endif
++
++ /* for solaris 2.1, Unixware (SVR4.2) and possibly others */
++-#ifdef HAVE_STROPTS_H
++-# include <sys/stropts.h>
++-#endif
+++//#ifdef HAVE_STROPTS_H
+++//# include <sys/stropts.h>
+++//#endif
++
++ #if defined(sun) && defined(LOCKPTY) && !defined(TIOCEXCL)
++ # include <sys/ttold.h>
++--- a/sched.h
+++++ b/sched.h
++@@ -27,6 +27,11 @@
++ * $Id$ GNU
++ */
++
+++#ifndef __SCHED_H
+++#define __SCHED_H
+++
+++#include <sys/time.h>
+++
++ struct event
++ {
++ struct event *next;
++@@ -46,3 +51,5 @@ struct event
++ #define EV_READ 1
++ #define EV_WRITE 2
++ #define EV_ALWAYS 3
+++
+++#endif
+diff --git a/feeds/packages/utils/screen/patches/110-do_not_add_srcdir_to_include_path.patch b/feeds/packages/utils/screen/patches/110-do_not_add_srcdir_to_include_path.patch
+new file mode 100644
+index 0000000..50d00b8
+--- /dev/null
++++ b/feeds/packages/utils/screen/patches/110-do_not_add_srcdir_to_include_path.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -79,7 +79,7 @@ screen: $(OFILES)
++ $(CC) $(LDFLAGS) -o $@ $(OFILES) $(LIBS)
++
++ .c.o:
++- $(CC) -c -I. -I$(srcdir) $(M_CFLAGS) $(CPPFLAGS) $(DEFS) \
+++ $(CC) -c $(M_CFLAGS) $(CPPFLAGS) $(DEFS) \
++ $(OPTIONS) $(CFLAGS) $<
++
++ install_bin: .version screen
+diff --git a/feeds/packages/utils/screen/patches/200-musl-compat.patch b/feeds/packages/utils/screen/patches/200-musl-compat.patch
+new file mode 100644
+index 0000000..cd783bd
+--- /dev/null
++++ b/feeds/packages/utils/screen/patches/200-musl-compat.patch
+@@ -0,0 +1,57 @@
++--- a/configure
+++++ b/configure
++@@ -4155,44 +4155,6 @@ fi
++ rm -f conftest*
++
++
++-oldlibs="$LIBS"
++-LIBS="$LIBS -lelf"
++-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking SVR4..." >&5
++-$as_echo "$as_me: checking SVR4..." >&6;}
++-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++-/* end confdefs.h. */
++-#include <utmpx.h>
++-
++-int
++-main ()
++-{
++-
++- ;
++- return 0;
++-}
++-_ACEOF
++-if ac_fn_c_try_link "$LINENO"; then :
++- ac_fn_c_check_header_mongrel "$LINENO" "dwarf.h" "ac_cv_header_dwarf_h" "$ac_includes_default"
++-if test "x$ac_cv_header_dwarf_h" = xyes; then :
++- $as_echo "#define SVR4 1" >>confdefs.h
++- $as_echo "#define BUGGYGETLOGIN 1" >>confdefs.h
++-
++-else
++- ac_fn_c_check_header_mongrel "$LINENO" "elf.h" "ac_cv_header_elf_h" "$ac_includes_default"
++-if test "x$ac_cv_header_elf_h" = xyes; then :
++- $as_echo "#define SVR4 1" >>confdefs.h
++- $as_echo "#define BUGGYGETLOGIN 1" >>confdefs.h
++-
++-fi
++-
++-
++-fi
++-
++-
++-
++-else
++- LIBS="$oldlibs"
++-fi
++ rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext conftest.$ac_ext
++ for ac_header in stropts.h string.h strings.h
++--- a/utmp.c
+++++ b/utmp.c
++@@ -33,6 +33,7 @@
++ #include "config.h"
++ #include "screen.h"
++ #include "extern.h"
+++#include "os.h"
++
++ #ifdef HAVE_UTEMPTER
++ #include <utempter.h>
+diff --git a/feeds/packages/utils/serialconsole/Makefile b/feeds/packages/utils/serialconsole/Makefile
+new file mode 100644
+index 0000000..fa336ac
+--- /dev/null
++++ b/feeds/packages/utils/serialconsole/Makefile
+@@ -0,0 +1,40 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sc
++PKG_VERSION:=0.95
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/serialconsole/sc
++PKG_MD5SUM:=4fe58576a5bddb9f1fb3dcfc6410b885
++PKG_MAINTAINER:=Stefan Bethke <stb@lassitu.de>
++
++PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/serialconsole
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Serial Console - minimal terminal program
++ URL:=http://sourceforge.net/projects/serialconsole/
++endef
++
++define Package/serialconsole/description
++serialconsole (sc) is a minimal terminal program allowing to use one machine
++to access the serial console of another machine.
++endef
++
++define Package/serialconsole/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/sc $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,serialconsole))
+diff --git a/feeds/packages/utils/shadow/Makefile b/feeds/packages/utils/shadow/Makefile
+new file mode 100644
+index 0000000..d56be82
+--- /dev/null
++++ b/feeds/packages/utils/shadow/Makefile
+@@ -0,0 +1,146 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=shadow
++PKG_VERSION:=4.2.1
++PKG_RELEASE:=5
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://pkg-shadow.alioth.debian.org/releases
++PKG_MD5SUM:=2bfafe7d4962682d31b5eba65dba4fc8
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=BSD-3-Clause
++
++PKG_FIXUP:=autoreconf
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++SHADOW_APPLETS := \
++ chage groupadd groupdel groupmod groups passwd su \
++ useradd userdel usermod
++
++CONFIGURE_ARGS += \
++ --without-audit \
++ --without-libpam \
++ --without-selinux \
++ --without-acl \
++ --without-attr \
++ --without-tcb \
++ --without-nscd \
++ --disable-subordinate-ids \
++
++define Package/shadow/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=The PLD Linux shadow utilities
++ URL:=http://pkg-shadow.alioth.debian.org/
++endef
++
++define Package/shadow
++ $(call Package/shadow/Default)
++ TITLE+= (all)
++ DEPENDS:=$(foreach u,$(SHADOW_APPLETS),+shadow-$(u))
++ HIDDEN:=1
++endef
++
++define Package/shadow/description
++ Full versions of standard shadow utilities. Normally, you would not
++ use this package, since the functionality in BusyBox is more than
++ sufficient and much smaller.
++endef
++
++define Package/shadow/install
++ true
++endef
++
++define Package/shadow-utils
++ $(call Package/shadow/Default)
++endef
++
++define Package/shadow-utils/config
++ menu "Select shadow utilities"
++ depends on PACKAGE_shadow-utils
++
++ config shadow-all
++ bool "Include all PLD shadow utilities"
++ select PACKAGE_shadow
++ default y
++
++ comment "Utilities"
++
++ $(foreach u,$(SHADOW_APPLETS), \
++ config PACKAGE_shadow-$(u)
++ prompt "Full PLD version of $(u) utility"
++
++ )
++
++ endmenu
++
++endef
++
++Package/shadow-utils/description = $(Package/shadow/description)
++
++define Package/shadow-common
++ $(call Package/shadow/Default)
++ TITLE:=Shared definitions for the PLD Linux shadow utilities
++ DEPENDS:=$(ICONV_DEPENDS) $(INTL_DEPENDS)
++ HIDDEN:=1
++endef
++
++define GenPlugin
++ define Package/shadow-$(1)
++ $(call Package/shadow/Default)
++ TITLE:=Utility $(1) from the PLD Linux shadow utilities
++ DEPENDS:=+shadow-common
++ HIDDEN:=1
++ endef
++
++ define Package/shadow-$(1)/description
++ Full version of standard $(1) utility. Normally, you would not use this
++ package, since the functionality in BusyBox is more than sufficient.
++ endef
++endef
++
++$(foreach u,$(SHADOW_APPLETS),$(eval $(call GenPlugin,$(u))))
++
++define Package/shadow-common/conffiles
++/etc/login.defs
++endef
++
++define Package/shadow-common/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/login.defs $(1)/etc/
++endef
++
++define Package/shadow-utils/install
++ true
++endef
++
++define BuildPlugin
++ define Package/shadow-$(1)/install
++ [ -x "$(PKG_INSTALL_DIR)/usr/sbin/$(1)" ] && { \
++ $(INSTALL_DIR) $$(1)/usr/sbin; \
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/$(1) $$(1)/usr/sbin/; \
++ } || { \
++ $(INSTALL_DIR) $$(1)/usr/bin; \
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/$(1) $$(1)/usr/bin/; \
++ }
++ endef
++
++ $$(eval $$(call BuildPackage,shadow-$(1)))
++endef
++
++$(foreach u,$(SHADOW_APPLETS),$(eval $(call BuildPlugin,$(u))))
++
++$(eval $(call BuildPackage,shadow-utils))
++$(eval $(call BuildPackage,shadow-common))
++$(eval $(call BuildPackage,shadow))
+diff --git a/feeds/packages/utils/shadow/patches/001-busybox_ash.patch b/feeds/packages/utils/shadow/patches/001-busybox_ash.patch
+new file mode 100644
+index 0000000..a16dad2
+--- /dev/null
++++ b/feeds/packages/utils/shadow/patches/001-busybox_ash.patch
+@@ -0,0 +1,11 @@
++--- a/etc/login.defs
+++++ b/etc/login.defs
++@@ -111,7 +111,7 @@ NOLOGINS_FILE /etc/nologin
++ # command as "-su". If not defined, then ps(1) will display the
++ # name of the shell actually being run, e.g. something like "-sh".
++ #
++-SU_NAME su
+++#SU_NAME su
++
++ #
++ # *REQUIRED*
+diff --git a/feeds/packages/utils/shadow/patches/002-disable-ruser-lookup.patch b/feeds/packages/utils/shadow/patches/002-disable-ruser-lookup.patch
+new file mode 100644
+index 0000000..a7ef1f7
+--- /dev/null
++++ b/feeds/packages/utils/shadow/patches/002-disable-ruser-lookup.patch
+@@ -0,0 +1,10 @@
++--- a/configure.in
+++++ b/configure.in
++@@ -197,7 +197,6 @@ dnl XXX - quick hack, should disappear b
++ AC_DEFINE(USE_SYSLOG, 1, [Define to use syslog().])
++ if test "$ac_cv_func_ruserok" = "yes"; then
++ AC_DEFINE(RLOGIN, 1, [Define if login should support the -r flag for rlogind.])
++- AC_DEFINE(RUSEROK, 0, [Define to the ruserok() "success" return value (0 or 1).])
++ fi
++
++ AC_ARG_ENABLE(shadowgrp,
+diff --git a/feeds/packages/utils/shadow/patches/003-fix-disabling-subids.patch b/feeds/packages/utils/shadow/patches/003-fix-disabling-subids.patch
+new file mode 100644
+index 0000000..bbc65c7
+--- /dev/null
++++ b/feeds/packages/utils/shadow/patches/003-fix-disabling-subids.patch
+@@ -0,0 +1,32 @@
++--- a/src/usermod.c
+++++ b/src/usermod.c
++@@ -1361,6 +1361,7 @@ static void process_flags (int argc, cha
++ exit (E_UID_IN_USE);
++ }
++
+++#ifdef ENABLE_SUBIDS
++ if ( (vflg || Vflg)
++ && !is_sub_uid) {
++ fprintf (stderr,
++@@ -1376,6 +1377,7 @@ static void process_flags (int argc, cha
++ Prog, sub_gid_dbname (), "-w", "-W");
++ exit (E_USAGE);
++ }
+++#endif
++ }
++
++ /*
++--- a/src/Makefile.am
+++++ b/src/Makefile.am
++@@ -52,7 +52,10 @@ usbin_PROGRAMS = \
++ noinst_PROGRAMS = id sulogin
++
++ suidbins = su
++-suidubins = chage chfn chsh expiry gpasswd newgrp passwd newuidmap newgidmap
+++suidubins = chage chfn chsh expiry gpasswd newgrp passwd
+++if ENABLE_SUBIDS
+++ suidubins += newuidmap newgidmap
+++endif
++ if ACCT_TOOLS_SETUID
++ suidubins += chage chgpasswd chpasswd groupadd groupdel groupmod newusers useradd userdel usermod
++ endif
+diff --git a/feeds/packages/utils/shadow/patches/004-fix-su-controoling-term.patch b/feeds/packages/utils/shadow/patches/004-fix-su-controoling-term.patch
+new file mode 100644
+index 0000000..4c130c7
+--- /dev/null
++++ b/feeds/packages/utils/shadow/patches/004-fix-su-controoling-term.patch
+@@ -0,0 +1,16 @@
++--- a/src/su.c
+++++ b/src/su.c
++@@ -1090,8 +1090,12 @@
++
++ if (fd >= 0) {
++ err = ioctl (fd, TIOCNOTTY, (char *) 0);
+++ if (-1 == err && ENOTTY == errno) {
+++ /* There are no controlling terminal already */
+++ err = 0;
+++ }
++ (void) close (fd);
++- } else if (ENXIO == errno) {
+++ } else if (ENXIO == errno || EACCES == errno) {
++ /* There are no controlling terminal already */
++ err = 0;
++ }
+diff --git a/feeds/packages/utils/sispmctl/Makefile b/feeds/packages/utils/sispmctl/Makefile
+new file mode 100644
+index 0000000..ad6c1e3
+--- /dev/null
++++ b/feeds/packages/utils/sispmctl/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2008-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sispmctl
++PKG_VERSION:=3.1+20120206
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=5ff4a05a5bcb6a64a9d6f77fed47014512f66b11
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=git://git.code.sf.net/p/sispmctl/git
++PKG_MAINTAINER:=Richard Kunze <richard.kunze@web.de>
++PKG_LICENSE:=GPL-2.0+
++
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/sispmctl
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Silver Shield PM Control for Linux
++ URL:=http://sispmctl.sourceforge.net/
++ DEPENDS:=+libusb-compat
++endef
++
++define Package/sispmctl/description
++ The sispmctl tool can control Gembird SIS-PM Silver Shield
++ programmable power outlet strips (also known under the name
++ Revolt Intelli-Plug) from the command line.
++ .
++ It can be used to switch on or off any of the programmable
++ power sockets of the SIS-PM via USB. It can also show the
++ current status of each power socket, and it can handle
++ multiple SIS-PM devices, too.
++endef
++
++TARGET_CFLAGS += -D_GNU_SOURCE
++CONFIGURE_ARGS += \
++ --enable-webless \
++ --disable-dependency-tracking
++
++define Package/sispmctl/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(PKG_NAME) $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,sispmctl))
+diff --git a/feeds/packages/utils/sispmctl/patches/001-fix-includes.patch b/feeds/packages/utils/sispmctl/patches/001-fix-includes.patch
+new file mode 100644
+index 0000000..218e22e
+--- /dev/null
++++ b/feeds/packages/utils/sispmctl/patches/001-fix-includes.patch
+@@ -0,0 +1,25 @@
++--- a/src/sispm_ctl.c
+++++ b/src/sispm_ctl.c
++@@ -33,6 +33,7 @@
++ #include <stdlib.h>
++ #include <unistd.h>
++ #include <time.h>
+++#include <sys/types.h>
++ #include <usb.h>
++ #include <assert.h>
++ #include "sispm_ctl.h"
++--- a/src/main.c
+++++ b/src/main.c
++@@ -34,11 +34,11 @@
++ #define __USE_XOPEN
++ #include <time.h>
++ #include <signal.h>
++-#include <usb.h>
++ #include <assert.h>
++ #include <getopt.h>
++ #include <sys/types.h>
++ #include <sys/socket.h>
+++#include <usb.h>
++
++ #include <fcntl.h>
++
+diff --git a/feeds/packages/utils/smartmontools/Makefile b/feeds/packages/utils/smartmontools/Makefile
+new file mode 100644
+index 0000000..3632fca
+--- /dev/null
++++ b/feeds/packages/utils/smartmontools/Makefile
+@@ -0,0 +1,91 @@
++#
++# Copyright (C) 2006-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/uclibc++.mk
++
++PKG_NAME:=smartmontools
++PKG_VERSION:=6.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/smartmontools
++PKG_MD5SUM:=56812c8312fd123ed40ef65afde1049e
++PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/smartmontools/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=$(CXX_DEPENDS)
++ TITLE:=S.M.A.R.T Monitoring
++ URL:=http://smartmontools.sourceforge.net/
++endef
++
++define Package/smartmontools
++ $(call Package/smartmontools/Default)
++ TITLE+= Tool
++endef
++
++define Package/smartmontools/description
++ smartmontools contains utility programs (smartctl) to
++ control/monitor storage systems using the Self-Monitoring, Analysis
++ and Reporting Technology System (S.M.A.R.T.) built into most modern
++ ATA and SCSI disks. It is derived from smartsuite.
++endef
++
++define Package/smartd
++ $(call Package/smartmontools/Default)
++ TITLE+= Daemon
++endef
++
++define Package/smartd/description
++ smartmontools contains utility programs (smartd) to
++ control/monitor storage systems using the Self-Monitoring, Analysis
++ and Reporting Technology System (S.M.A.R.T.) built into most modern
++ ATA and SCSI disks. It is derived from smartsuite.
++endef
++
++# uses GNU configure
++
++CONFIGURE_VARS += \
++ CXXFLAGS="$$$$CXXFLAGS -fno-builtin -fno-rtti -nostdinc++" \
++ CPPFLAGS="$$$$CPPFLAGS -I$(STAGING_DIR)/usr/include/uClibc++ -I$(LINUX_DIR)/include" \
++ LDFLAGS="$$$$LDFLAGS" \
++ LIBS="-nodefaultlibs -lc -luClibc++ -lm $(LIBGCC_S) -lc" \
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ BUILD_INFO='"(localbuild)"' \
++ LD="$(TARGET_CXX)"
++endef
++
++define Package/smartmontools/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/smartctl $(1)/usr/sbin/
++endef
++
++define Package/smartd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/smartd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) ./files/smartd.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/smartd.init $(1)/etc/init.d/smartd
++endef
++
++define Package/smartd/conffiles
++/etc/smartd.conf
++endef
++
++$(eval $(call BuildPackage,smartmontools))
++$(eval $(call BuildPackage,smartd))
+diff --git a/feeds/packages/utils/smartmontools/files/smartd.conf b/feeds/packages/utils/smartmontools/files/smartd.conf
+new file mode 100644
+index 0000000..0740fcf
+--- /dev/null
++++ b/feeds/packages/utils/smartmontools/files/smartd.conf
+@@ -0,0 +1 @@
++/dev/hdb -H
+diff --git a/feeds/packages/utils/smartmontools/files/smartd.init b/feeds/packages/utils/smartmontools/files/smartd.init
+new file mode 100644
+index 0000000..f1453f2
+--- /dev/null
++++ b/feeds/packages/utils/smartmontools/files/smartd.init
+@@ -0,0 +1,16 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=95
++
++start() {
++ service_start /usr/sbin/smartd -q never
++}
++
++stop() {
++ service_stop /usr/sbin/smartd
++}
++
++reload() {
++ service_reload /usr/sbin/smartd
++}
+diff --git a/feeds/packages/utils/smstools3/Makefile b/feeds/packages/utils/smstools3/Makefile
+new file mode 100644
+index 0000000..d2499a7
+--- /dev/null
++++ b/feeds/packages/utils/smstools3/Makefile
+@@ -0,0 +1,74 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=smstools3
++PKG_VERSION:=3.1.15
++PKG_RELEASE:=2
++
++PKG_MAINTAINER:=Gérald Kerma <dreagle@doukki.net>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_PARALLEL:=0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://smstools3.kekekasvi.com/packages/
++PKG_MD5SUM:=0241ef60e646fac1a06254a848e61ed7
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
++PKG_BUILD_DEPENDS:=libiconv-full iconv
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/smstools3
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=SMS Server Tools 3
++ DEPENDS:=+libiconv-full +iconv
++ URL:=http://smstools3.kekekasvi.com/
++endef
++
++define Package/smstools3/description
++ The SMS Server Tools 3 is a SMS Gateway software which can send and receive
++ short messages through GSM modems and mobile phones.
++endef
++
++TARGET_CFLAGS = -D NUMBER_OF_MODEMS=1
++TARGET_CFLAGS += -D USE_ICONV
++TARGET_CFLAGS += -D DISABLE_INET_SOCKET
++TARGET_CFLAGS += -W -Wall
++TARGET_CFLAGS += -D_FILE_OFFSET_BITS=64
++
++TARGET_LDFLAGS += -liconv
++
++BINDIR=/usr/local/bin
++
++define Build/Compile
++ $(MAKE) -C "$(PKG_BUILD_DIR)/src" \
++ CC="$(TARGET_CC)" \
++ CFLAGS='$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS) \
++ -I"$(STAGING_DIR)/usr/lib/libiconv-full/include"' \
++ LFLAGS='$(TARGET_LDFLAGS) $(EXTRA_LDFLAGS) -L"$(STAGING_DIR)/usr/lib/libiconv-full/lib"' \
++ all
++endef
++
++define Package/smstools3/install
++ $(INSTALL_DIR) $(1)/$(BINDIR)
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/smsd $(1)/$(BINDIR)/smsd
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/sendsms $(1)/$(BINDIR)/sendsms
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/sms2html $(1)/$(BINDIR)/sms2html
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/sms2unicode $(1)/$(BINDIR)/sms2unicode
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/unicode2sms $(1)/$(BINDIR)/unicode2sms
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_DATA) -m 0755 ./files/smstools3.init $(1)/etc/init.d/smstools3
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DATA) -m 0755 ./files/smstools3.conf $(1)/etc/smsd.conf
++endef
++
++$(eval $(call BuildPackage,smstools3))
+diff --git a/feeds/packages/utils/smstools3/files/smstools3.conf b/feeds/packages/utils/smstools3/files/smstools3.conf
+new file mode 100644
+index 0000000..c8732e3
+--- /dev/null
++++ b/feeds/packages/utils/smstools3/files/smstools3.conf
+@@ -0,0 +1,20 @@
++#
++# Description: Main configuration file for the smsd
++#
++
++devices = GSM1
++incoming = /var/spool/sms/incoming
++outgoing = /var/spool/sms/outgoing
++checked = /var/spool/sms/checked
++failed = /var/spool/sms/failed
++sent = /var/spool/sms/sent
++receive_before_send = no
++autosplit = 3
++
++[GSM1]
++init = AT+CPMS="ME","ME","ME"
++device = /dev/ttyUSB0
++incoming = yes
++pin = 0000
++baudrate = 9600
++
+diff --git a/feeds/packages/utils/smstools3/files/smstools3.init b/feeds/packages/utils/smstools3/files/smstools3.init
+new file mode 100644
+index 0000000..1638c60
+--- /dev/null
++++ b/feeds/packages/utils/smstools3/files/smstools3.init
+@@ -0,0 +1,152 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++# smsd initscript openwrt mod
++
++START=99
++STOP=99
++
++EXTRA_COMMANDS="status"
++EXTRA_HELP=" status View pid and service status "
++
++# Set USER and GROUP, if necessary:
++USER=""
++GROUP=""
++
++# If an unpriviledged user is selected, make sure that next two
++# files are writable by that user:
++PIDFILE="/var/run/smsd.pid"
++INFOFILE="/var/run/smsd.working"
++# Logfile can also be defined in here:
++LOGFILE="/var/log/smsd.log"
++
++DAEMON=/usr/local/bin/smsd
++# A program which turns power off for couple of seconds:
++RESETMODEMS=/usr/local/bin/smsd_resetmodems
++NAME=smsd
++PSOPT=""
++
++# Set/edit this before starting service !!!!!
++WRT_SPOOL=/var/spool
++
++# Maximum time to stop smsd, after that it gets killed hardly:
++MAXWAIT=45
++
++boot() {
++ start
++}
++
++start() {
++ test -x $DAEMON || exit 0
++
++ echo "Creating minimum spool directories"
++ mkdir -p $WRT_SPOOL
++ mkdir -p $WRT_SPOOL/sms
++ mkdir -p $WRT_SPOOL/sms/incoming
++ mkdir -p $WRT_SPOOL/sms/outgoing
++ mkdir -p $WRT_SPOOL/sms/checked
++ mkdir -p $WRT_SPOOL/sms/failed
++ mkdir -p $WRT_SPOOL/sms/sent
++
++ echo -n "Starting SMS Daemon: "
++ MSG="."
++ ARGS="-n MAINPROCESS -p$PIDFILE -i$INFOFILE"
++ [ "x$USER" != x ] && ARGS="$ARGS -u$USER"
++ [ "x$GROUP" != x ] && ARGS="$ARGS -g$GROUP"
++ [ "x$LOGFILE" != x ] && ARGS="$ARGS -l$LOGFILE"
++ PID=`cat $PIDFILE 2>/dev/null`
++ if [ "x$PID" != x ]; then
++ if kill -0 $PID 2>/dev/null; then
++ MSG=" already running ($PID)."
++ else
++ PID=""
++ fi
++ fi
++ if [ "x$PID" = x ]; then
++ if ps $PSOPT | grep $NAME | grep -v grep >/dev/null; then
++ MSG=" already running."
++ else
++ $DAEMON $ARGS
++ sleep 1
++ PIDS=`ps $PSOPT | grep $NAME | grep -v grep`
++ [ "x$PIDS" = x ] && MSG=" failed."
++ fi
++ fi
++ echo "$NAME$MSG"
++}
++
++stop() {
++ if ps $PSOPT | grep $NAME | grep -v grep >/dev/null; then
++ PID=`cat $PIDFILE 2>/dev/null`
++ if [ "x$PID" != x ]; then
++ P=`kill -0 $PID 2>/dev/null`
++ [ "x$P" != x ] && PID=""
++ fi
++ if [ "x$PID" != x ]; then
++ kill $PID
++ else
++ kill `ps $PSOPT | grep $NAME | grep -v grep | awk '{print $1}'` >/dev/null 2>&1
++ fi
++ sleep 1
++ if ps $PSOPT | grep $NAME | grep -v grep >/dev/null; then
++ echo "Allowing $NAME to terminate gracefully within $MAXWAIT seconds"
++ infofound=0
++ dots=0
++ seconds=0
++ while ps $PSOPT | grep $NAME | grep -v grep >/dev/null; do
++ if [ $infofound -lt 1 ]; then
++ if [ -f $INFOFILE ]; then
++ infofound=1
++ if [ $dots -gt 0 ]; then
++ echo ""
++ dots=0
++ fi
++ $ECHO -n "$NAME is currently "
++ cat $INFOFILE
++ echo "Time counting is now disabled and we will wait until this job is complete."
++ fi
++ fi
++ [ $infofound -lt 1 ] && seconds=`expr $seconds + 1`
++ echo -n "."
++ dots=`expr $dots + 1`
++ if [ "$seconds" -ge $MAXWAIT ]; then
++ if [ $dots -gt 0 ]; then
++ echo ""
++ dots=0
++ fi
++ echo "Timeout occured, killing $NAME hardly."
++ kill -9 `ps $PSOPT | grep $NAME | grep -v grep | awk '{print $1}'` >/dev/null 2>&1
++ [ -f $PIDFILE ] && rm $PIDFILE
++ seconds=0
++ fi
++ sleep 1
++ done
++ [ $dots -gt 0 ] && echo ""
++ #echo "$NAME is stopped."
++ fi
++ fi
++}
++
++restart() {
++ stop
++ start
++}
++
++
++status() {
++ PID=$(cat $PIDFILE)
++
++ test -e $PIDFILE
++ if [ $? == 0 ]; then
++ echo $NAME " running! pid $PID"
++ else
++ echo $NAME " not running !!!"
++ fi
++}
++
++reset() {
++ $0 stop
++ [ -f "$RESETMODEMS" ] && "$RESETMODEMS"
++ sleep 30
++ $0 start
++}
++
+diff --git a/feeds/packages/utils/smstools3/patches/001-smsd.patch b/feeds/packages/utils/smstools3/patches/001-smsd.patch
+new file mode 100644
+index 0000000..6761661
+--- /dev/null
++++ b/feeds/packages/utils/smstools3/patches/001-smsd.patch
+@@ -0,0 +1,13 @@
++--- a/src/smsd.c 2010-09-21 13:47:48.000000000 +0300
+++++ b/src/smsd.c 2013-03-05 05:26:26.000000000 +0300
++@@ -5200,8 +5200,8 @@
++ int result = 1;
++ char *cmd;
++ char *p;
++- char answer[500];
++- char buffer[600];
+++ char answer[1024];
+++ char buffer[1024];
++ int fd;
++ int log_retry = 3;
++ int i;
+diff --git a/feeds/packages/utils/smstools3/patches/002-Makefile.patch b/feeds/packages/utils/smstools3/patches/002-Makefile.patch
+new file mode 100644
+index 0000000..a8445ef
+--- /dev/null
++++ b/feeds/packages/utils/smstools3/patches/002-Makefile.patch
+@@ -0,0 +1,12 @@
++--- a/src/Makefile 2014-12-20 18:33:55.654252867 +0100
+++++ b/src/Makefile 2014-12-20 18:31:10.241359741 +0100
++@@ -43,7 +43,7 @@
++
++ ifneq (,$(findstring SOLARIS,$(CFLAGS)))
++ ifeq (,$(findstring DISABLE_INET_SOCKET,$(CFLAGS)))
++-override LFLAGS += -lsocket -lnsl
+++ override LFLAGS += -lsocket -lnsl
++ endif
++ endif
++
++
+diff --git a/feeds/packages/utils/sockread/Makefile b/feeds/packages/utils/sockread/Makefile
+new file mode 100644
+index 0000000..d3c15d4
+--- /dev/null
++++ b/feeds/packages/utils/sockread/Makefile
+@@ -0,0 +1,35 @@
++#
++# This software is licensed under the CC0-1.0 license.
++#
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sockread
++PKG_VERSION:=1.0
++PKG_RELEASE:=1
++PKG_LICENSE:=CC0-1.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/sockread
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=sockread
++ MAINTAINER:=Moritz Warning <moritzwarning@web.de>
++endef
++
++define Package/sockread/description
++ sockread writes and reads data from a Unix domain socket
++ represented as a special file on the file system.
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++ $(CP) ./src/* $(PKG_BUILD_DIR)/
++endef
++
++define Package/sockread/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/sockread $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,sockread))
+diff --git a/feeds/packages/utils/sockread/src/Makefile b/feeds/packages/utils/sockread/src/Makefile
+new file mode 100644
+index 0000000..fe4f8a7
+--- /dev/null
++++ b/feeds/packages/utils/sockread/src/Makefile
+@@ -0,0 +1,11 @@
++CC ?= gcc
++CFLAGS ?= -O2 -Wall -pedantic
++CFLAGS += -std=gnu99
++
++.PHONY: clean
++
++sockread:
++ $(CC) $(CFLAGS) main.c -o sockread
++
++clean:
++ rm -f sockread
+diff --git a/feeds/packages/utils/sockread/src/main.c b/feeds/packages/utils/sockread/src/main.c
+new file mode 100644
+index 0000000..06c21de
+--- /dev/null
++++ b/feeds/packages/utils/sockread/src/main.c
+@@ -0,0 +1,63 @@
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <stddef.h>
++#include <unistd.h>
++#include <sys/socket.h>
++#include <sys/un.h>
++
++int main(int argc, char *argv[]) {
++ char buf[1024];
++ ssize_t r;
++
++ if (argc != 2) {
++ fprintf(stderr, "Write to and read from a Unix domain socket.\n\nUsage: %s <socket>\n", argv[0]);
++ return 1;
++ }
++
++ size_t addrlen = strlen(argv[1]);
++
++ /* Allocate enough space for arbitrary-length paths */
++ char addrbuf[offsetof(struct sockaddr_un, sun_path) + addrlen + 1];
++ memset(addrbuf, 0, sizeof(addrbuf));
++
++ struct sockaddr_un *addr = (struct sockaddr_un *)addrbuf;
++ addr->sun_family = AF_UNIX;
++ memcpy(addr->sun_path, argv[1], addrlen+1);
++
++ int fd = socket(AF_UNIX, SOCK_STREAM, 0);
++ if (fd < 0) {
++ fprintf(stderr, "Failed to create socket: %s\n", strerror(errno));
++ return 1;
++ }
++
++ if (connect(fd, (struct sockaddr*)addr, sizeof(addrbuf)) < 0) {
++ fprintf(stderr, "Can't connect to `%s': %s\n", argv[1], strerror(errno));
++ return 1;
++ }
++
++ /* Check if stdin refers to a terminal */
++ if (!isatty(fileno(stdin))) {
++ /* Read from stdin and write to socket */
++ while (0 < (r = fread(buf, 1, sizeof(buf), stdin))) {
++ send(fd, buf, r, 0);
++ }
++ }
++
++ /* Read from socket and write to stdout */
++ while (1) {
++ r = recv(fd, buf, sizeof(buf), 0);
++ if (r < 0) {
++ fprintf(stderr, "read: %s\n", strerror(errno));
++ return 1;
++ }
++
++ if (r == 0)
++ return 0;
++
++ fwrite(buf, r, 1, stdout);
++ }
++
++ return 0;
++}
+diff --git a/feeds/packages/utils/spi-tools/Makefile b/feeds/packages/utils/spi-tools/Makefile
+new file mode 100644
+index 0000000..ca4da88
+--- /dev/null
++++ b/feeds/packages/utils/spi-tools/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=spi-tools
++PKG_VERSION:=1
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/cpb-/spi-tools.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=cc6a41fdcec60610703ba6db488c621c64952898
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/spi-tools
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Command line SPI tools
++endef
++
++EXTRA_CFLAGS+=-DVERSION=\"$(PKG_SOURCE_VERSION)\"
++
++define Build/Compile
++ cd $(PKG_BUILD_DIR) ; \
++ $(TARGET_CC) $(TARGET_CFLAGS) $(EXTRA_CFLAGS) -Wall -Werror -o spi-config src/spi-config.c ; \
++ $(TARGET_CC) $(TARGET_CFLAGS) $(EXTRA_CFLAGS) -Wall -Werror -o spi-pipe src/spi-pipe.c
++endef
++
++define Package/spi-tools/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/spi-config $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/spi-pipe $(1)/usr/bin
++endef
++
++$(eval $(call BuildPackage,spi-tools))
+diff --git a/feeds/packages/utils/stm32flash/Makefile b/feeds/packages/utils/stm32flash/Makefile
+new file mode 100644
+index 0000000..c1f6b9b
+--- /dev/null
++++ b/feeds/packages/utils/stm32flash/Makefile
+@@ -0,0 +1,40 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=stm32flash
++PKG_VERSION:=0.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://releases.stm32flash.googlecode.com/git
++PKG_MD5SUM:=ec9b5c8bae67f9a489786546d088bd14
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
++PKG_MAINTAINER:=Christian Pointner <equinox@spreadspace.org>
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=gpl-2.0.txt
++include $(INCLUDE_DIR)/package.mk
++
++define Package/stm32flash
++ SECTION:=utils
++ CATEGORY:=Utilities
++ URL:=http://code.google.com/p/stm32flash/
++ TITLE:=Firmware flash tool for STM32's serial bootloader
++endef
++
++define Package/stm32flash/description
++ This tool can be used to burn firmware images to STM32 ARM processors
++ using the built-in serial bootloader.
++endef
++
++define Package/stm32flash/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/stm32flash $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,stm32flash))
+diff --git a/feeds/packages/utils/stoken/Makefile b/feeds/packages/utils/stoken/Makefile
+new file mode 100644
+index 0000000..7fcbdad
+--- /dev/null
++++ b/feeds/packages/utils/stoken/Makefile
+@@ -0,0 +1,77 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=stoken
++PKG_VERSION:=0.8
++PKG_REV:=c4d79ffbf5053e44be4b64da22b1b7fb6a51daf2
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/cernekee/stoken.git
++
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_REV).tar.gz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_MAINTAINER:=Florian Fainelli <florian@openwrt.org>
++PKG_LICENSE:=LGPL-2.1
++PKG_INSTALL:=1
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++
++PKG_FIXUP:=autoreconf
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/stoken/Default
++ TITLE:=stoken is a tokencode generator compatible with RSA SecurID 128-bit (AES)
++ URL:=http://sourceforge.net/p/stoken/
++ DEPENDS:= +libxml2 +libnettle
++endef
++
++define Package/stoken
++ $(call Package/stoken/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libstoken
++ MENU:=1
++endef
++
++define Package/stoken/description
++ stoken is a tokencode generator compatible with RSA SecurID 128-bit (AES). This package contains the cli
++endef
++
++define Package/libstoken
++ $(call Package/stoken/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++endef
++
++CONFIGURE_ARGS += \
++ --with-nettle
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libstoken*.{la,a,so*} $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/stoken.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/stoken/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/stoken $(1)/usr/bin/
++endef
++
++define Package/libstoken/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libstoken*.so* $(1)/usr/lib
++endef
++
++$(eval $(call BuildPackage,stoken))
++$(eval $(call BuildPackage,libstoken))
+diff --git a/feeds/packages/utils/sumo/Makefile b/feeds/packages/utils/sumo/Makefile
+new file mode 100644
+index 0000000..eb1360c
+--- /dev/null
++++ b/feeds/packages/utils/sumo/Makefile
+@@ -0,0 +1,61 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sumo
++PKG_VERSION:=0.24.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-src-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/sumo
++PKG_MD5SUM:=5522dffc71ecf636b02dc6bdea7e569d
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++CONFIGURE_ARGS += \
++ --with-xerces=$(STAGING_DIR)/usr \
++ --disable-debug \
++ --disable-dependency-tracking \
++ --disable-silent-rules
++
++define Package/sumo
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=SUMO - Simulation of Urban MObility
++ URL:=http://sumo-sim.org/
++ DEPENDS:=+libstdcpp +libxerces-c
++endef
++
++define Package/sumo/description
++ SUMO is a free and open traffic simulation suite which is available since 2001.
++ SUMO allows modelling of intermodal traffic systems including road vehicles,
++ public transport and pedestrians. Included with SUMO is a wealth of supporting
++ tools which handle tasks such as route finding, visualization, network import
++ and emission calculation. SUMO can be enhanced with custom models and provides
++ various APIs to remotely control the simulation.
++endef
++
++define Package/sumo/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/{activitygen,dfrouter,duarouter,emissionsDrivingCycle,emissionsMap,jtrrouter,marouter,netconvert,netgenerate,od2trips,polyconvert,TraCITestClient} $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sumo $(1)/usr/bin/sumo-bin
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) files/sumo.sh $(1)/usr/sbin/sumo
++ $(INSTALL_DIR) $(1)/usr/share/sumo
++ $(CP) $(PKG_BUILD_DIR)/data $(1)/usr/share/sumo/
++endef
++
++$(eval $(call BuildPackage,sumo))
+diff --git a/feeds/packages/utils/sumo/files/sumo.sh b/feeds/packages/utils/sumo/files/sumo.sh
+new file mode 100644
+index 0000000..0f0af4d
+--- /dev/null
++++ b/feeds/packages/utils/sumo/files/sumo.sh
+@@ -0,0 +1,6 @@
++#!/bin/sh
++# Copyright (C) 2015 OpenWrt.org
++
++SUMO_HOME=/usr/share/sumo sumo-bin $@
++
++exit $?
+diff --git a/feeds/packages/utils/sumo/patches/100-configure_fix.patch b/feeds/packages/utils/sumo/patches/100-configure_fix.patch
+new file mode 100644
+index 0000000..6fff18c
+--- /dev/null
++++ b/feeds/packages/utils/sumo/patches/100-configure_fix.patch
+@@ -0,0 +1,14 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -13,11 +13,6 @@ AC_LANG([C++])
++
++ dnl the debug check has to be made before the program checks
++ dnl because it modifies CXXFLAGS
++-if test x$CXX = xclang++; then
++- CXXFLAGS="-msse2 $CXXFLAGS"
++-else
++- CXXFLAGS="-msse2 -mfpmath=sse $CXXFLAGS"
++-fi
++ AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug],[enable sumo debugging code [default=no].])])
++ if test x$enable_debug = xyes; then
++ AC_DEFINE(_DEBUG, 1, [Define to 1 in order to enable sumo debugging code.])
+diff --git a/feeds/packages/utils/swig/Makefile b/feeds/packages/utils/swig/Makefile
+new file mode 100644
+index 0000000..7b9c4f0
+--- /dev/null
++++ b/feeds/packages/utils/swig/Makefile
+@@ -0,0 +1,39 @@
++#
++# Copyright (C) 2006-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=swig
++PKG_VERSION:=3.0.7
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/$(PKG_NAME)
++PKG_MD5SUM:=7fff46c84b8c630ede5b0f0827e3d90a
++PKG_INSTALL:=1
++
++PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILE:=LICENSE
++
++include $(INCLUDE_DIR)/host-build.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/swig
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=swig binding generator
++ BUILDONLY:=1
++endef
++
++HOST_CONFIGURE_ARGS+= \
++ --without-pcre
++
++define Package/swig/description
++ tool that generates bindings for various languages
++endef
++
++$(eval $(call HostBuild))
++$(eval $(call BuildPackage,swig))
+diff --git a/feeds/packages/utils/sysstat/Makefile b/feeds/packages/utils/sysstat/Makefile
+new file mode 100644
+index 0000000..3e9457b
+--- /dev/null
++++ b/feeds/packages/utils/sysstat/Makefile
+@@ -0,0 +1,66 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sysstat
++PKG_VERSION:=11.0.4
++PKG_RELEASE:=2
++
++PKG_LICENSE:=GPL-2.0
++PKG_MAINTAINER:=Marko Ratkaj <marko.ratkaj@sartura.hr>
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://perso.orange.fr/sebastien.godard/
++PKG_MD5SUM:=df1ed75656eb06320088d54247f0e803
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/sysstat
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Sysstat performance monitoring tools
++ URL:=http://pagesperso-orange.fr/sebastien.godard/index.html
++endef
++
++define Package/sysstat/description
++ The sysstat utilities are a collection of performance monitoring tools for
++ Linux. These include sar, sadf, mpstat, iostat, pidstat and sa tools.
++endef
++
++define Package/sysstat/conffiles
++/etc/sysstat/sysstat.ioconf
++/etc/sysstat/sysstat
++endef
++
++CONFIGURE_VARS+= \
++ sa_lib_dir="/usr/lib/sysstat" \
++ sa_dir="/var/log/sysstat" \
++ conf_dir="/etc/sysstat"
++
++CONFIGURE_ARGS+= \
++ --disable-documentation \
++ --disable-largefile \
++ --disable-sensors \
++ --disable-nls
++
++define Package/sysstat/install
++ $(INSTALL_DIR) $(1)/usr/lib/sysstat
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/sysstat/{sadc,sa1,sa2} $(1)/usr/lib/sysstat/
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/{sar,sadf,iostat,mpstat,pidstat} $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/sysstat
++ $(INSTALL_CONF) $(PKG_INSTALL_DIR)/etc/sysstat/sysstat.ioconf $(1)/etc/sysstat/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/sysstat.config $(1)/etc/config/sysstat
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/sysstat.init $(1)/etc/init.d/sysstat
++endef
++
++$(eval $(call BuildPackage,sysstat))
+diff --git a/feeds/packages/utils/sysstat/files/sysstat.config b/feeds/packages/utils/sysstat/files/sysstat.config
+new file mode 100644
+index 0000000..638b379
+--- /dev/null
++++ b/feeds/packages/utils/sysstat/files/sysstat.config
+@@ -0,0 +1,7 @@
++config sysstat 'sysstat'
++ option log_history '7'
++ option compressafter '10'
++ option sadc_options ''
++ option sa_dir '/var/log/sysstat'
++ option zip 'xz'
++ option enabled 'true'
+diff --git a/feeds/packages/utils/sysstat/files/sysstat.init b/feeds/packages/utils/sysstat/files/sysstat.init
+new file mode 100755
+index 0000000..a819000
+--- /dev/null
++++ b/feeds/packages/utils/sysstat/files/sysstat.init
+@@ -0,0 +1,49 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2015 OpenWrt.org
++
++START=90
++STOP=10
++
++USE_PROCD=1
++PROG=/usr/lib/sysstat/sadc
++SYSSTAT_CFG="/etc/sysstat/sysstat"
++
++validate_sysstat_section() {
++ uci_validate_section sysstat sysstat "${1}" \
++ 'log_history:uinteger' \
++ 'compressafter:uinteger' \
++ 'sadc_options:string' \
++ 'sa_dir:string' \
++ 'zip:string' \
++ 'enabled:string'
++}
++
++start_service() {
++
++ local log_history compressafter sadc_options sa_dir zip enabled
++
++ validate_sysstat_section sysstat || {
++ echo "validation failed"
++ return 1
++ }
++
++ [ -d /var/log/sysstat ] || mkdir -p /var/log/sysstat
++
++ echo "HISTORY=$log_history" > $SYSSTAT_CFG
++ echo "COMPRESSAFTER=$compressafter" >> $SYSSTAT_CFG
++ echo "SADC_OPTIONS=\"$sadc_options\"" >> $SYSSTAT_CFG
++ echo "SA_DIR=\"$sa_dir\"" >> $SYSSTAT_CFG
++ echo "ZIP=\"$zip\"" >> $SYSSTAT_CFG
++ echo "ENABLED=\"$enabled\"" >> $SYSSTAT_CFG
++
++ procd_open_instance
++ procd_set_param command $PROG -S DISK -F -L -
++ procd_set_param file $SYSSTAT_CFG
++ procd_close_instance
++}
++
++service_triggers()
++{
++ procd_add_reload_trigger "sysstat"
++ procd_add_validation validate_sysstat_section
++}
+diff --git a/feeds/packages/utils/sysstat/patches/100-musl-compat.patch b/feeds/packages/utils/sysstat/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..06c7813
+--- /dev/null
++++ b/feeds/packages/utils/sysstat/patches/100-musl-compat.patch
+@@ -0,0 +1,30 @@
++--- a/sa_common.c
+++++ b/sa_common.c
++@@ -28,6 +28,7 @@
++ #include <dirent.h>
++ #include <fcntl.h>
++ #include <libgen.h>
+++#include <limits.h>
++ #include <sys/types.h>
++ #include <sys/stat.h>
++
++--- a/common.c
+++++ b/common.c
++@@ -30,6 +30,7 @@
++ #include <dirent.h>
++ #include <ctype.h>
++ #include <libgen.h>
+++#include <limits.h>
++
++ #include "version.h"
++ #include "common.h"
++--- a/ioconf.c
+++++ b/ioconf.c
++@@ -27,6 +27,7 @@
++ #include <errno.h>
++ #include <dirent.h>
++ #include <sys/stat.h>
+++#include <sys/types.h>
++
++ #include "ioconf.h"
++ #include "common.h"
+diff --git a/feeds/packages/utils/tar/Makefile b/feeds/packages/utils/tar/Makefile
+new file mode 100644
+index 0000000..02d796b
+--- /dev/null
++++ b/feeds/packages/utils/tar/Makefile
+@@ -0,0 +1,64 @@
++#
++# Copyright (C) 2008-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tar
++PKG_VERSION:=1.28
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=@GNU/$(PKG_NAME)
++PKG_MD5SUM:=8f32b2bc1ed7ddf4cf4e4a39711341b0
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tar
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+bzip2 +libacl +libattr
++ TITLE:=GNU tar
++ URL:=http://www.gnu.org/software/tar/
++endef
++
++define Package/tar/description
++ Tar is a program for packaging a set of files as a
++ single archive in tar format.
++endef
++
++define Package/tar/postinst
++#!/bin/sh
++if [ -e $${IPKG_INSTROOT}/bin/tar ]; then
++ rm -r $${IPKG_INSTROOT}/bin/tar;
++fi
++ln -sf /usr/bin/tar $${IPKG_INSTROOT}/bin/tar
++endef
++
++define Package/tar/postrm
++#!/bin/sh
++rm $${IPKG_INSTROOT}/bin/tar
++ln -s busybox $${IPKG_INSTROOT}/bin/tar
++$${IPKG_INSTROOT}/bin/tar 2>&1 | grep 'applet not found' > /dev/null 2>&1 && rm $${IPKG_INSTROOT}/bin/tar
++exit 0
++endef
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDLAGS)"
++
++define Package/tar/install
++ $(INSTALL_DIR) $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(PKG_NAME) $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,tar))
+diff --git a/feeds/packages/utils/taskwarrior/Makefile b/feeds/packages/utils/taskwarrior/Makefile
+new file mode 100644
+index 0000000..a417a45
+--- /dev/null
++++ b/feeds/packages/utils/taskwarrior/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=taskwarrior
++PKG_VERSION:=2.4.4
++PKG_RELEASE:=1
++
++PKG_LICENSE:=MIT
++
++PKG_SOURCE:=task-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.taskwarrior.org/download/
++PKG_MD5SUM:=517450c4a23a5842df3e9905b38801b3
++PKG_MAINTAINER:=Luka Perkov <luka@openwrt.org>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/task-$(PKG_VERSION)
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/taskwarrior
++ TITLE:=taskwarrior
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libstdcpp +libuuid +libgnutls
++ URL:=http://taskwarrior.org/
++endef
++
++TARGET_LDFLAGS += -ldl
++
++define Package/taskwarrior/description
++ taskwarrior is a command-line todo list manager
++endef
++
++define Package/taskwarrior/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/task $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,taskwarrior))
+diff --git a/feeds/packages/utils/tcsh/Makefile b/feeds/packages/utils/tcsh/Makefile
+new file mode 100644
+index 0000000..52d4b51
+--- /dev/null
++++ b/feeds/packages/utils/tcsh/Makefile
+@@ -0,0 +1,59 @@
++#
++# Copyright (C) 2011-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tcsh
++PKG_VERSION:=6.19.00
++PKG_RELEASE:=4
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:= \
++ http://ftp.funet.fi/pub/mirrors/ftp.astron.com/pub/tcsh/ \
++ http://ftp.funet.fi/pub/mirrors/ftp.astron.com/pub/tcsh/old/ \
++ ftp://ftp.astron.com/pub/tcsh/ \
++ ftp://ftp.astron.com/pub/tcsh/old
++PKG_MD5SUM:=f5f854833578647795bc906dd4bcb5d5
++PKG_LICENSE:=BSD-4-Clause-UC
++PKG_LICENSE_FILES:=Copyright
++
++PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tcsh
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Enhanced Berkeley UNIX C shell
++ DEPENDS:=+libncurses
++ URL:=http://www.tcsh.org/
++endef
++
++define Package/tcsh/description
++ Tcsh is an enhanced, but completely compatible
++ version of the Berkeley UNIX C shell (csh). It
++ is a command language interpreter usable both
++ as an interactive login shell and a shell
++ script command processor. It includes a
++ command-line editor, programmable word
++ completion, spelling correction, a history
++ mechanism, job control and a C-like syntax.
++endef
++
++define Package/tcsh/postinst
++#!/bin/sh
++grep tcsh $${IPKG_INSTROOT}/etc/shells || \
++ echo "/bin/tcsh" >> $${IPKG_INSTROOT}/etc/shells
++ echo "/bin/csh" >> $${IPKG_INSTROOT}/etc/shells
++endef
++
++define Package/tcsh/install
++ $(INSTALL_DIR) $(1)/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/tcsh $(1)/bin/
++ ln -sf tcsh $(1)/bin/csh
++endef
++
++$(eval $(call BuildPackage,tcsh))
+diff --git a/feeds/packages/utils/tcsh/patches/001-gethost b/feeds/packages/utils/tcsh/patches/001-gethost
+new file mode 100644
+index 0000000..b05e155
+--- /dev/null
++++ b/feeds/packages/utils/tcsh/patches/001-gethost
+@@ -0,0 +1,11 @@
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -449,7 +449,7 @@ pure:$(P) ${OBJS}
++
++ gethost: gethost.c sh.err.h tc.const.h sh.h
++ rm -f gethost
++- ${CC_FOR_GETHOST} -o gethost ${CPPFLAGS} ${CFLAGS} $(srcdir)/gethost.c
+++ ${CC_FOR_GETHOST} -o gethost ${CPPFLAGS} $(srcdir)/gethost.c
++
++ tc.defs.c: gethost host.defs
++ @rm -f $@.tmp
+diff --git a/feeds/packages/utils/tcsh/patches/001-sysmalloc.patch b/feeds/packages/utils/tcsh/patches/001-sysmalloc.patch
+new file mode 100644
+index 0000000..99d0e3f
+--- /dev/null
++++ b/feeds/packages/utils/tcsh/patches/001-sysmalloc.patch
+@@ -0,0 +1,14 @@
++--- a/config_f.h
+++++ b/config_f.h
++@@ -135,11 +135,7 @@
++ * This can be much slower and no memory statistics will be
++ * provided.
++ */
++-#if defined(__MACHTEN__) || defined(PURIFY) || defined(MALLOC_TRACE) || defined(_OSD_POSIX) || defined(__MVS__) || defined (__CYGWIN__) || defined(__GLIBC__) || defined(__OpenBSD__) || defined(__APPLE__)
++ # define SYSMALLOC
++-#else
++-# undef SYSMALLOC
++-#endif
++
++ /*
++ * USE_ACCESS Use access(2) rather than stat(2) when POSIX is defined.
+diff --git a/feeds/packages/utils/tcsh/patches/100-musl-compat.patch b/feeds/packages/utils/tcsh/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..29ebcfc
+--- /dev/null
++++ b/feeds/packages/utils/tcsh/patches/100-musl-compat.patch
+@@ -0,0 +1,11 @@
++--- a/sh.proc.c
+++++ b/sh.proc.c
++@@ -48,7 +48,7 @@ RCSID("$tcsh: sh.proc.c,v 3.127 2015/02/
++ #endif /* aiws */
++
++ #if defined(_BSD) || (defined(IRIS4D) && __STDC__) || defined(__lucid) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)
++-# if !defined(__ANDROID__)
+++# if !(defined(__ANDROID__) || (defined(__linux__) && !defined(__GLIBC__)))
++ # define BSDWAIT
++ # endif
++ #endif /* _BSD || (IRIS4D && __STDC__) || __lucid || glibc */
+diff --git a/feeds/packages/utils/tmux/Makefile b/feeds/packages/utils/tmux/Makefile
+new file mode 100644
+index 0000000..30fed85
+--- /dev/null
++++ b/feeds/packages/utils/tmux/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tmux
++PKG_VERSION:=2.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=https://github.com/tmux/tmux/releases/download/$(PKG_VERSION)
++PKG_MD5SUM:=9fb6b443392c3978da5d599f1e814eaa
++PKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>
++
++PKG_LICENSE:=ISC
++PKG_LICENSE_FILES:=COPYING
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tmux
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Terminal multiplexer
++ DEPENDS:=+libncurses +libevent2 +libpthread +librt
++ URL:=http://tmux.sourceforge.net/
++endef
++
++define Package/tmux/description
++ tmux is a modern, BSD-licensed alternative to GNU screen.
++endef
++
++MAKE_FLAGS += \
++ PREFIX="/usr" \
++ PLATFORM="linux"
++
++define Package/tmux/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/tmux $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,tmux))
+diff --git a/feeds/packages/utils/tmux/patches/100-b64_ntop-conflict.patch b/feeds/packages/utils/tmux/patches/100-b64_ntop-conflict.patch
+new file mode 100644
+index 0000000..6350f5b
+--- /dev/null
++++ b/feeds/packages/utils/tmux/patches/100-b64_ntop-conflict.patch
+@@ -0,0 +1,35 @@
++--- a/compat.h
+++++ b/compat.h
++@@ -230,7 +230,9 @@ int daemon(int, int);
++ #ifndef HAVE_B64_NTOP
++ /* b64_ntop.c */
++ #undef b64_ntop /* for Cygwin */
++-int b64_ntop(const char *, size_t, char *, size_t);
+++int local_b64_ntop(const char *, size_t, char *, size_t);
+++#else
+++#define local_b64_ntop b64_ntop
++ #endif
++
++ #ifndef HAVE_FORKPTY
++--- a/tty.c
+++++ b/tty.c
++@@ -1070,7 +1070,7 @@ tty_cmd_setselection(struct tty *tty, co
++ off = 4 * ((ctx->num + 2) / 3) + 1; /* storage for base64 */
++ buf = xmalloc(off);
++
++- b64_ntop(ctx->ptr, ctx->num, buf, off);
+++ local_b64_ntop(ctx->ptr, ctx->num, buf, off);
++ tty_putcode_ptr2(tty, TTYC_MS, "", buf);
++
++ free(buf);
++--- a/compat/b64_ntop.c
+++++ b/compat/b64_ntop.c
++@@ -122,7 +122,7 @@ static const char Pad64 = '=';
++ */
++
++ int
++-b64_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize) {
+++local_b64_ntop(uint8_t const *src, size_t srclength, char *target, size_t targsize) {
++ size_t datalength = 0;
++ uint8_t input[3];
++ uint8_t output[4];
+diff --git a/feeds/packages/utils/tracertools/Makefile b/feeds/packages/utils/tracertools/Makefile
+new file mode 100644
+index 0000000..8d95a9c
+--- /dev/null
++++ b/feeds/packages/utils/tracertools/Makefile
+@@ -0,0 +1,42 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=tracertools
++PKG_VERSION:=20150916
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++PKG_LICENSE:=GPL-3.0
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/dangowrt/tracertools.git
++PKG_SOURCE_VERSION:=7dba3342fedfd04eb7b0d9941971726fde948ec0
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/tracertools
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Tracer MPPT monitoring and control tools
++endef
++
++define Package/tracertools/description
++ Tools for the Tracer MPPT solar charge controller.
++endef
++
++define Package/tracertools/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/tracerstat $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,tracertools))
+diff --git a/feeds/packages/utils/triggerhappy/Makefile b/feeds/packages/utils/triggerhappy/Makefile
+new file mode 100644
+index 0000000..5b365cd
+--- /dev/null
++++ b/feeds/packages/utils/triggerhappy/Makefile
+@@ -0,0 +1,58 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=triggerhappy
++PKG_VERSION:=0.3.4
++PKG_REV:=649bf670a012558393d7c41f3660d0a017edd982
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=git://github.com/wertarbyte/triggerhappy
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/triggerhappy
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=handle input events and run configured programs
++ URL:=http://github.com/wertarbyte/triggerhappy
++endef
++
++define Package/triggerhappy/description
++ triggerhappy - handle input events and run configured programs
++ The daemon thd can handle hotplugged input devices and is configured through
++ simple configuration files in /etc/triggerhappy/triggers.d/.
++endef
++
++MAKE_FLAGS += \
++ $(TARGET_CONFIGURE_OPTS) \
++ $(1)
++
++define Package/triggerhappy/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_DIR) $(1)/etc/triggerhappy
++ $(INSTALL_DIR) $(1)/etc/triggerhappy/triggers.d/
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/input/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/thd $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/th-cmd $(1)/usr/sbin
++ $(INSTALL_BIN) ./files/triggerhappy.init $(1)/etc/init.d/triggerhappy
++ $(INSTALL_BIN) ./files/triggerhappy.hotplug $(1)/etc/hotplug.d/input/10-triggerhappy
++ $(INSTALL_BIN) ./files/triggerhappy-example.conf $(1)/etc/triggerhappy/triggers.d/example.conf
++endef
++
++$(eval $(call BuildPackage,triggerhappy))
+diff --git a/feeds/packages/utils/triggerhappy/files/triggerhappy-example.conf b/feeds/packages/utils/triggerhappy/files/triggerhappy-example.conf
+new file mode 100644
+index 0000000..3a8017a
+--- /dev/null
++++ b/feeds/packages/utils/triggerhappy/files/triggerhappy-example.conf
+@@ -0,0 +1,14 @@
++# This is an example configuration for the triggerhappy daemon (thd)
++# please note that every file to be processed must end in ".conf"
++#
++# To view a list of supported event codes, use "thd --listevents" or
++# "thd --dump /dev/input/event*"
++#
++# Format:
++# <eventcode> <value> <command>
++#
++# values for key events are 1 (pressed), 0 (released) or 2 (held)
++#
++## control an mpd instance
++# KEY_NEXTSONG 1 /usr/bin/mpc next
++# KEY_PREVSONG 1 /usr/bin/mpc prev
+diff --git a/feeds/packages/utils/triggerhappy/files/triggerhappy.hotplug b/feeds/packages/utils/triggerhappy/files/triggerhappy.hotplug
+new file mode 100644
+index 0000000..78ad349
+--- /dev/null
++++ b/feeds/packages/utils/triggerhappy/files/triggerhappy.hotplug
+@@ -0,0 +1,15 @@
++#!/bin/sh
++THD_SOCKET=/tmp/triggerhappy.socket
++[ -S "$THD_SOCKET" ] || exit
++
++case "$ACTION" in
++ add)
++ DEVICE="/dev/$DEVNAME"
++ [ -c "$DEVICE" ] || exit
++ # offer device to triggerhappy daemon
++ /usr/sbin/th-cmd --socket "$THD_SOCKET" --add "$DEVICE"
++ ;;
++ remove)
++ # nothing to do
++ ;;
++esac
+diff --git a/feeds/packages/utils/triggerhappy/files/triggerhappy.init b/feeds/packages/utils/triggerhappy/files/triggerhappy.init
+new file mode 100644
+index 0000000..e846d29
+--- /dev/null
++++ b/feeds/packages/utils/triggerhappy/files/triggerhappy.init
+@@ -0,0 +1,10 @@
++#!/bin/sh /etc/rc.common
++START=93
++
++start() {
++ /usr/sbin/thd --socket /tmp/triggerhappy.socket --triggers /etc/triggerhappy/triggers.d/ --daemon /dev/input/event*
++}
++
++stop() {
++ /usr/sbin/th-cmd --socket /tmp/triggerhappy.socket --quit
++}
+diff --git a/feeds/packages/utils/triggerhappy/patches/100-fix-LINUX_INPUT_H.patch b/feeds/packages/utils/triggerhappy/patches/100-fix-LINUX_INPUT_H.patch
+new file mode 100644
+index 0000000..13ecd8c
+--- /dev/null
++++ b/feeds/packages/utils/triggerhappy/patches/100-fix-LINUX_INPUT_H.patch
+@@ -0,0 +1,11 @@
++--- a/Makefile
+++++ b/Makefile
++@@ -10,7 +10,7 @@ THCMD_COMPS := th-cmd cmdsocket
++
++ MAKEDEPEND = $(CC) -M -MG $(CPPFLAGS) -o $*.d $<
++
++-LINUX_INPUT_H := $(shell echo '\#include <linux/input.h>' | $(CC) $(CPPFLAGS) -M -E - | awk 'NR==1 {print $$2}')
+++LINUX_INPUT_H := $(shell for i in `echo | $(CC) $(CPPFLAGS) -M -E -include 'linux/input.h' -`; do test -f "$$i" && echo "$$i" && break; done)
++
++ all: thd th-cmd man
++
+diff --git a/feeds/packages/utils/unrar/Makefile b/feeds/packages/utils/unrar/Makefile
+new file mode 100644
+index 0000000..156abd2
+--- /dev/null
++++ b/feeds/packages/utils/unrar/Makefile
+@@ -0,0 +1,75 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=unrar
++PKG_VERSION:=5.3.7
++PKG_RELEASE:=1
++
++PKG_SOURCE:=unrarsrc-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.rarlab.com/rar
++PKG_MD5SUM:=668f8de87b74d9fa7037d3d487200149
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=UnRAR
++PKG_LICENSE_FILES:=license.txt
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/unrar
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/unrar/Default
++ TITLE:=UnRAR
++ SUBMENU:=Compression
++ URL:=http://www.rarlab.com/
++ DEPENDS:=$(CXX_DEPENDS) +libpthread
++endef
++
++define Package/unrar
++$(call Package/unrar/Default)
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE+= (application)
++endef
++
++define Package/libunrar
++$(call Package/unrar/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE+= (library)
++endef
++
++define Package/unrar/description
++ UnRAR is an application that can decompress files and archives created using
++ the RAR compression scheme
++endef
++
++define Package/libunrar/description
++ UnRAR library is a shared library that provides file extraction from RAR
++ archives
++endef
++
++define Build/Compile
++ $(call Build/Compile/Default,unrar)
++ $(call Build/Compile/Default,lib)
++endef
++
++define Package/unrar/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/bin/unrar $(1)/usr/bin/
++endef
++
++define Package/libunrar/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/libunrar.so $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,unrar))
++$(eval $(call BuildPackage,libunrar))
+diff --git a/feeds/packages/utils/unrar/patches/100-makefile_fixes.patch b/feeds/packages/utils/unrar/patches/100-makefile_fixes.patch
+new file mode 100644
+index 0000000..ca82e13
+--- /dev/null
++++ b/feeds/packages/utils/unrar/patches/100-makefile_fixes.patch
+@@ -0,0 +1,18 @@
++--- a/makefile
+++++ b/makefile
++@@ -2,12 +2,12 @@
++ # Makefile for UNIX - unrar
++
++ # Linux using GCC
++-CXX=g++
++-CXXFLAGS=-O2
+++#CXX=g++
+++#CXXFLAGS=-O2
++ LIBFLAGS=-fPIC
++ DEFINES=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -DRAR_SMP
++ STRIP=strip
++-LDFLAGS=-pthread
+++LDFLAGS=-lpthread
++ DESTDIR=/usr
++
++ # Linux using LCC
+diff --git a/feeds/packages/utils/unzip/Makefile b/feeds/packages/utils/unzip/Makefile
+new file mode 100644
+index 0000000..112b3f4
+--- /dev/null
++++ b/feeds/packages/utils/unzip/Makefile
+@@ -0,0 +1,65 @@
++#
++# Copyright (C) 2006-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=unzip
++PKG_REV:=60
++PKG_VERSION:=6.0
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)$(PKG_REV).tar.gz
++PKG_SOURCE_URL:=@SF/infozip
++PKG_MD5SUM:=62b490407489521db863b523a7f86375
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=BSD-4-Clause
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/unzip$(PKG_REV)
++PKG_CHECK_FORMAT_SECURITY:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/unzip
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=
++ TITLE:=De-archiver for .zip files
++ URL:=http://infozip.sourceforge.net/UnZip.html
++ SUBMENU:=Compression
++endef
++
++define Package/unzip/description
++ InfoZIP's unzip program. With the exception of multi-volume archives
++ (ie, .ZIP files that are split across several disks using PKZIP's /& option),
++ this can handle any file produced either by PKZIP, or the corresponding
++ InfoZIP zip program.
++endef
++
++define Build/Configure
++endef
++
++TARGET_CFLAGS += -DNO_LCHMOD -DLARGE_FILE_SUPPORT
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) -f unix/Makefile unzips \
++ $(TARGET_CONFIGURE_OPTS) \
++ prefix="$(PKG_INSTALL_DIR)/usr" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ CF="$(TARGET_CFLAGS) -O $(TARGET_CPPFLAGS) -I. -DUNIX" \
++ CC="$(TARGET_CC)" \
++ LD="$(TARGET_CC) $(TARGET_LDFLAGS)" \
++ install
++endef
++
++define Package/unzip/install
++ $(INSTALL_DIR) $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,unzip))
+diff --git a/feeds/packages/utils/unzip/patches/001-CVE-2014-8139-crc-overflow.patch b/feeds/packages/utils/unzip/patches/001-CVE-2014-8139-crc-overflow.patch
+new file mode 100644
+index 0000000..5cae41f
+--- /dev/null
++++ b/feeds/packages/utils/unzip/patches/001-CVE-2014-8139-crc-overflow.patch
+@@ -0,0 +1,49 @@
++--- a/extract.c
+++++ b/extract.c
++@@ -1,5 +1,5 @@
++ /*
++- Copyright (c) 1990-2009 Info-ZIP. All rights reserved.
+++ Copyright (c) 1990-2014 Info-ZIP. All rights reserved.
++
++ See the accompanying file LICENSE, version 2009-Jan-02 or later
++ (the contents of which are also included in unzip.h) for terms of use.
++@@ -298,6 +298,8 @@ char ZCONST Far TruncNTSD[] =
++ #ifndef SFX
++ static ZCONST char Far InconsistEFlength[] = "bad extra-field entry:\n \
++ EF block length (%u bytes) exceeds remaining EF data (%u bytes)\n";
+++ static ZCONST char Far TooSmallEBlength[] = "bad extra-field entry:\n \
+++ EF block length (%u bytes) invalid (< %d)\n";
++ static ZCONST char Far InvalidComprDataEAs[] =
++ " invalid compressed data for EAs\n";
++ # if (defined(WIN32) && defined(NTSD_EAS))
++@@ -2023,7 +2025,8 @@ static int TestExtraField(__G__ ef, ef_l
++ ebID = makeword(ef);
++ ebLen = (unsigned)makeword(ef+EB_LEN);
++
++- if (ebLen > (ef_len - EB_HEADSIZE)) {
+++ if (ebLen > (ef_len - EB_HEADSIZE))
+++ {
++ /* Discovered some extra field inconsistency! */
++ if (uO.qflag)
++ Info(slide, 1, ((char *)slide, "%-22s ",
++@@ -2158,11 +2161,19 @@ static int TestExtraField(__G__ ef, ef_l
++ }
++ break;
++ case EF_PKVMS:
++- if (makelong(ef+EB_HEADSIZE) !=
+++ if (ebLen < 4)
+++ {
+++ Info(slide, 1,
+++ ((char *)slide, LoadFarString(TooSmallEBlength),
+++ ebLen, 4));
+++ }
+++ else if (makelong(ef+EB_HEADSIZE) !=
++ crc32(CRCVAL_INITIAL, ef+(EB_HEADSIZE+4),
++ (extent)(ebLen-4)))
+++ {
++ Info(slide, 1, ((char *)slide,
++ LoadFarString(BadCRC_EAs)));
+++ }
++ break;
++ case EF_PKW32:
++ case EF_PKUNIX:
+diff --git a/feeds/packages/utils/unzip/patches/002-CVE-2014-8140-test-compr-eb.patch b/feeds/packages/utils/unzip/patches/002-CVE-2014-8140-test-compr-eb.patch
+new file mode 100644
+index 0000000..fd4ef00
+--- /dev/null
++++ b/feeds/packages/utils/unzip/patches/002-CVE-2014-8140-test-compr-eb.patch
+@@ -0,0 +1,23 @@
++--- a/extract.c
+++++ b/extract.c
++@@ -2232,10 +2232,17 @@ static int test_compr_eb(__G__ eb, eb_si
++ if (compr_offset < 4) /* field is not compressed: */
++ return PK_OK; /* do nothing and signal OK */
++
+++ /* Return no/bad-data error status if any problem is found:
+++ * 1. eb_size is too small to hold the uncompressed size
+++ * (eb_ucsize). (Else extract eb_ucsize.)
+++ * 2. eb_ucsize is zero (invalid). 2014-12-04 SMS.
+++ * 3. eb_ucsize is positive, but eb_size is too small to hold
+++ * the compressed data header.
+++ */
++ if ((eb_size < (EB_UCSIZE_P + 4)) ||
++- ((eb_ucsize = makelong(eb+(EB_HEADSIZE+EB_UCSIZE_P))) > 0L &&
++- eb_size <= (compr_offset + EB_CMPRHEADLEN)))
++- return IZ_EF_TRUNC; /* no compressed data! */
+++ ((eb_ucsize = makelong( eb+ (EB_HEADSIZE+ EB_UCSIZE_P))) == 0L) ||
+++ ((eb_ucsize > 0L) && (eb_size <= (compr_offset + EB_CMPRHEADLEN))))
+++ return IZ_EF_TRUNC; /* no/bad compressed data! */
++
++ if (
++ #ifdef INT_16BIT
+diff --git a/feeds/packages/utils/unzip/patches/003-CVE-2014-8141-getzip64data.patch b/feeds/packages/utils/unzip/patches/003-CVE-2014-8141-getzip64data.patch
+new file mode 100644
+index 0000000..ca52e19
+--- /dev/null
++++ b/feeds/packages/utils/unzip/patches/003-CVE-2014-8141-getzip64data.patch
+@@ -0,0 +1,133 @@
++--- a/fileio.c
+++++ b/fileio.c
++@@ -176,6 +176,8 @@ static ZCONST char Far FilenameTooLongTr
++ #endif
++ static ZCONST char Far ExtraFieldTooLong[] =
++ "warning: extra field too long (%d). Ignoring...\n";
+++static ZCONST char Far ExtraFieldCorrupt[] =
+++ "warning: extra field (type: 0x%04x) corrupt. Continuing...\n";
++
++ #ifdef WINDLL
++ static ZCONST char Far DiskFullQuery[] =
++@@ -2295,7 +2297,12 @@ int do_string(__G__ length, option) /*
++ if (readbuf(__G__ (char *)G.extra_field, length) == 0)
++ return PK_EOF;
++ /* Looks like here is where extra fields are read */
++- getZip64Data(__G__ G.extra_field, length);
+++ if (getZip64Data(__G__ G.extra_field, length) != PK_COOL)
+++ {
+++ Info(slide, 0x401, ((char *)slide,
+++ LoadFarString( ExtraFieldCorrupt), EF_PKSZ64));
+++ error = PK_WARN;
+++ }
++ #ifdef UNICODE_SUPPORT
++ G.unipath_filename = NULL;
++ if (G.UzO.U_flag < 2) {
++--- a/process.c
+++++ b/process.c
++@@ -1,5 +1,5 @@
++ /*
++- Copyright (c) 1990-2009 Info-ZIP. All rights reserved.
+++ Copyright (c) 1990-2014 Info-ZIP. All rights reserved.
++
++ See the accompanying file LICENSE, version 2009-Jan-02 or later
++ (the contents of which are also included in unzip.h) for terms of use.
++@@ -1888,48 +1888,82 @@ int getZip64Data(__G__ ef_buf, ef_len)
++ and a 4-byte version of disk start number.
++ Sets both local header and central header fields. Not terribly clever,
++ but it means that this procedure is only called in one place.
+++
+++ 2014-12-05 SMS.
+++ Added checks to ensure that enough data are available before calling
+++ makeint64() or makelong(). Replaced various sizeof() values with
+++ simple ("4" or "8") constants. (The Zip64 structures do not depend
+++ on our variable sizes.) Error handling is crude, but we should now
+++ stay within the buffer.
++ ---------------------------------------------------------------------------*/
++
+++#define Z64FLGS 0xffff
+++#define Z64FLGL 0xffffffff
+++
++ if (ef_len == 0 || ef_buf == NULL)
++ return PK_COOL;
++
++ Trace((stderr,"\ngetZip64Data: scanning extra field of length %u\n",
++ ef_len));
++
++- while (ef_len >= EB_HEADSIZE) {
+++ while (ef_len >= EB_HEADSIZE)
+++ {
++ eb_id = makeword(EB_ID + ef_buf);
++ eb_len = makeword(EB_LEN + ef_buf);
++
++- if (eb_len > (ef_len - EB_HEADSIZE)) {
++- /* discovered some extra field inconsistency! */
+++ if (eb_len > (ef_len - EB_HEADSIZE))
+++ {
+++ /* Extra block length exceeds remaining extra field length. */
++ Trace((stderr,
++ "getZip64Data: block length %u > rest ef_size %u\n", eb_len,
++ ef_len - EB_HEADSIZE));
++ break;
++ }
++- if (eb_id == EF_PKSZ64) {
++-
+++ if (eb_id == EF_PKSZ64)
+++ {
++ int offset = EB_HEADSIZE;
++
++- if (G.crec.ucsize == 0xffffffff || G.lrec.ucsize == 0xffffffff){
++- G.lrec.ucsize = G.crec.ucsize = makeint64(offset + ef_buf);
++- offset += sizeof(G.crec.ucsize);
+++ if ((G.crec.ucsize == Z64FLGL) || (G.lrec.ucsize == Z64FLGL))
+++ {
+++ if (offset+ 8 > ef_len)
+++ return PK_ERR;
+++
+++ G.crec.ucsize = G.lrec.ucsize = makeint64(offset + ef_buf);
+++ offset += 8;
++ }
++- if (G.crec.csize == 0xffffffff || G.lrec.csize == 0xffffffff){
++- G.csize = G.lrec.csize = G.crec.csize = makeint64(offset + ef_buf);
++- offset += sizeof(G.crec.csize);
+++
+++ if ((G.crec.csize == Z64FLGL) || (G.lrec.csize == Z64FLGL))
+++ {
+++ if (offset+ 8 > ef_len)
+++ return PK_ERR;
+++
+++ G.csize = G.crec.csize = G.lrec.csize = makeint64(offset + ef_buf);
+++ offset += 8;
++ }
++- if (G.crec.relative_offset_local_header == 0xffffffff){
+++
+++ if (G.crec.relative_offset_local_header == Z64FLGL)
+++ {
+++ if (offset+ 8 > ef_len)
+++ return PK_ERR;
+++
++ G.crec.relative_offset_local_header = makeint64(offset + ef_buf);
++- offset += sizeof(G.crec.relative_offset_local_header);
+++ offset += 8;
++ }
++- if (G.crec.disk_number_start == 0xffff){
+++
+++ if (G.crec.disk_number_start == Z64FLGS)
+++ {
+++ if (offset+ 4 > ef_len)
+++ return PK_ERR;
+++
++ G.crec.disk_number_start = (zuvl_t)makelong(offset + ef_buf);
++- offset += sizeof(G.crec.disk_number_start);
+++ offset += 4;
++ }
+++#if 0
+++ break; /* Expect only one EF_PKSZ64 block. */
+++#endif /* 0 */
++ }
++
++- /* Skip this extra field block */
+++ /* Skip this extra field block. */
++ ef_buf += (eb_len + EB_HEADSIZE);
++ ef_len -= (eb_len + EB_HEADSIZE);
++ }
+diff --git a/feeds/packages/utils/unzip/patches/004-CVE-2014-9636-test-compr-eb.patch b/feeds/packages/utils/unzip/patches/004-CVE-2014-9636-test-compr-eb.patch
+new file mode 100644
+index 0000000..3bba996
+--- /dev/null
++++ b/feeds/packages/utils/unzip/patches/004-CVE-2014-9636-test-compr-eb.patch
+@@ -0,0 +1,25 @@
++--- a/extract.c
+++++ b/extract.c
++@@ -2228,6 +2228,7 @@ static int test_compr_eb(__G__ eb, eb_si
++ ulg eb_ucsize;
++ uch *eb_ucptr;
++ int r;
+++ ush eb_compr_method;
++
++ if (compr_offset < 4) /* field is not compressed: */
++ return PK_OK; /* do nothing and signal OK */
++@@ -2244,6 +2245,14 @@ static int test_compr_eb(__G__ eb, eb_si
++ ((eb_ucsize > 0L) && (eb_size <= (compr_offset + EB_CMPRHEADLEN))))
++ return IZ_EF_TRUNC; /* no/bad compressed data! */
++
+++ /* 2014-11-03 Michal Zalewski, SMS.
+++ * For STORE method, compressed and uncompressed sizes must agree.
+++ * http://www.info-zip.org/phpBB3/viewtopic.php?f=7&t=450
+++ */
+++ eb_compr_method = makeword( eb + (EB_HEADSIZE + compr_offset));
+++ if ((eb_compr_method == STORED) && (eb_size - compr_offset != eb_ucsize))
+++ return PK_ERR;
+++
++ if (
++ #ifdef INT_16BIT
++ (((ulg)(extent)eb_ucsize) != eb_ucsize) ||
+diff --git a/feeds/packages/utils/unzip/patches/005-CVE-2015-7696-heap-overflow.patch b/feeds/packages/utils/unzip/patches/005-CVE-2015-7696-heap-overflow.patch
+new file mode 100644
+index 0000000..df758a1
+--- /dev/null
++++ b/feeds/packages/utils/unzip/patches/005-CVE-2015-7696-heap-overflow.patch
+@@ -0,0 +1,21 @@
++--- a/crypt.c
+++++ b/crypt.c
++@@ -465,7 +465,17 @@ int decrypt(__G__ passwrd)
++ GLOBAL(pInfo->encrypted) = FALSE;
++ defer_leftover_input(__G);
++ for (n = 0; n < RAND_HEAD_LEN; n++) {
++- b = NEXTBYTE;
+++ /* 2012-11-23 SMS. (OUSPG report.)
+++ * Quit early if compressed size < HEAD_LEN. The resulting
+++ * error message ("unable to get password") could be improved,
+++ * but it's better than trying to read nonexistent data, and
+++ * then continuing with a negative G.csize. (See
+++ * fileio.c:readbyte()).
+++ */
+++ if ((b = NEXTBYTE) == (ush)EOF)
+++ {
+++ return PK_ERR;
+++ }
++ h[n] = (uch)b;
++ Trace((stdout, " (%02x)", h[n]));
++ }
+diff --git a/feeds/packages/utils/unzip/patches/006-CVE-2015-7697-infinite-loop.patch b/feeds/packages/utils/unzip/patches/006-CVE-2015-7697-infinite-loop.patch
+new file mode 100644
+index 0000000..a8376b2
+--- /dev/null
++++ b/feeds/packages/utils/unzip/patches/006-CVE-2015-7697-infinite-loop.patch
+@@ -0,0 +1,15 @@
++--- a/extract.c
+++++ b/extract.c
++@@ -2728,6 +2728,12 @@ __GDEF
++ int repeated_buf_err;
++ bz_stream bstrm;
++
+++ if (G.incnt <= 0 && G.csize <= 0L) {
+++ /* avoid an infinite loop */
+++ Trace((stderr, "UZbunzip2() got empty input\n"));
+++ return 2;
+++ }
+++
++ #if (defined(DLL) && !defined(NO_SLIDE_REDIR))
++ if (G.redirect_slide)
++ wsize = G.redirect_size, redirSlide = G.redirect_buffer;
+diff --git a/feeds/packages/utils/unzip/patches/007-integer-underflow-csiz_decrypted.patch b/feeds/packages/utils/unzip/patches/007-integer-underflow-csiz_decrypted.patch
+new file mode 100644
+index 0000000..738ea52
+--- /dev/null
++++ b/feeds/packages/utils/unzip/patches/007-integer-underflow-csiz_decrypted.patch
+@@ -0,0 +1,21 @@
++--- a/extract.c
+++++ b/extract.c
++@@ -1257,8 +1257,17 @@ static int extract_or_test_entrylist(__G
++ if (G.lrec.compression_method == STORED) {
++ zusz_t csiz_decrypted = G.lrec.csize;
++
++- if (G.pInfo->encrypted)
+++ if (G.pInfo->encrypted) {
+++ if (csiz_decrypted <= 12) {
+++ /* handle the error now to prevent unsigned overflow */
+++ Info(slide, 0x401, ((char *)slide,
+++ LoadFarStringSmall(ErrUnzipNoFile),
+++ LoadFarString(InvalidComprData),
+++ LoadFarStringSmall2(Inflate)));
+++ return PK_ERR;
+++ }
++ csiz_decrypted -= 12;
+++ }
++ if (G.lrec.ucsize != csiz_decrypted) {
++ Info(slide, 0x401, ((char *)slide,
++ LoadFarStringSmall2(WrnStorUCSizCSizDiff),
+diff --git a/feeds/packages/utils/usbmuxd/Makefile b/feeds/packages/utils/usbmuxd/Makefile
+new file mode 100644
+index 0000000..239c84b
+--- /dev/null
++++ b/feeds/packages/utils/usbmuxd/Makefile
+@@ -0,0 +1,52 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=usbmuxd
++PKG_VERSION:=1.1.1
++PKG_RELEASE:=3
++PKG_SOURCE_PROTO:=git
++
++PKG_MAINTAINER:=Lukasz Baj <l.baj@radytek.com>
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING.GPLv2
++
++PKG_SOURCE_URL:=https://github.com/libimobiledevice/usbmuxd.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=4bd7cd0d28e7f5920de51470b863f3aeee00409d
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/usbmuxd
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=USB multiplexing daemon
++ URL:=http://www.libimobiledevice.org/
++ DEPENDS:=+librt +libusb-1.0 +libusbmuxd +libopenssl +libimobiledevice
++endef
++
++define Package/usbmuxd/description
++ This daemon is in charge of multiplexing connections over USB to an iPhone or
++ iPod touch. To users, it means you can sync your music, contacts, photos, etc.
++ over USB. To developers, it means you can connect to any listening localhost
++ socket on the device. usbmuxd is not used for tethering data transfer, which
++ uses a dedicated USB interface as a virtual network device.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Package/usbmuxd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/usbmuxd $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,usbmuxd))
+diff --git a/feeds/packages/utils/uvcdynctrl/Makefile b/feeds/packages/utils/uvcdynctrl/Makefile
+new file mode 100644
+index 0000000..7ab033c
+--- /dev/null
++++ b/feeds/packages/utils/uvcdynctrl/Makefile
+@@ -0,0 +1,87 @@
++#
++# Copyright (C) 2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=uvcdynctrl
++PKG_VERSION:=0.2.4
++
++PKG_SOURCE:=libwebcam-src-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/libwebcam
++PKG_MD5SUM:=31dbb5713e95a699c5fc4dbe1493f764
++PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/libwebcam-src-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/uvcdynctrl
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libwebcam +PACKAGE_UVCDYNCTRL_UDEV_RULE:udev
++ TITLE:=Manage dynamic controls in uvcvideo
++ URL:=http://sourceforge.net/projects/libwebcam/
++ MENU:=1
++endef
++
++define Package/uvcdynctrl/description
++ The webcam-tools package contains the following two components:
++ - libwebcam: Webcam Library (LGPL)
++ - uvcdynctrl: Manage dynamic controls in uvcvideo (GPL)
++endef
++
++define Package/uvcdynctrl/config
++config PACKAGE_UVCDYNCTRL_UDEV_RULE
++ bool "uvcdynctrl udev rule, selects udev"
++ depends on PACKAGE_uvcdynctrl
++ default no
++ help
++ Installs an udev rule to load uvcdynctrl with dynamic controls
++ from xml files in /usr/share/uvcdynctrl when a webcam is attached.
++endef
++
++define Package/libwebcam
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libxml2 +libiconv-full
++ TITLE:=Webcam library
++ URL:=http://sourceforge.net/projects/libwebcam/
++endef
++
++define Package/libwebcam/description
++ $(call Package/uvcdynctrl/description)
++endef
++
++TARGET_CFLAGS += -I$(STAGING_DIR)/usr/lib/libiconv-full/include -liconv
++TARGET_LDFLAGS += -L$(STAGING_DIR)/usr/lib/libiconv-full/lib
++
++define Package/uvcdynctrl/install
++ $(INSTALL_DIR) $(1)/usr/{bin,share}
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/uvcdynctrl* $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/uvcdynctrl/ $(1)/usr/share/
++
++ifeq ($(CONFIG_PACKAGE_UVCDYNCTRL_UDEV_RULE),y)
++ $(INSTALL_DIR) $(1)/lib/udev/rules.d
++ $(CP) $(PKG_INSTALL_DIR)/lib/udev/rules.d/*.rules $(1)/lib/udev/rules.d/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/lib/udev/uvcdynctrl $(1)/lib/udev/
++endif
++endef
++
++define Package/libwebcam/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libwebcam.so* $(1)/usr/lib/
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/{include,lib}
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libwebcam.{a,so*} $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,uvcdynctrl))
++$(eval $(call BuildPackage,libwebcam))
+diff --git a/feeds/packages/utils/vim/Makefile b/feeds/packages/utils/vim/Makefile
+new file mode 100644
+index 0000000..2e9f96a
+--- /dev/null
++++ b/feeds/packages/utils/vim/Makefile
+@@ -0,0 +1,194 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=vim
++PKG_VERSION:=7.4
++PKG_RELEASE:=3
++VIMVER:=74
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=ftp://ftp.vim.org/pub/vim/unix/
++PKG_MD5SUM:=607e135c559be642f210094ad023dc65
++PKG_MAINTAINER:=Marko Ratkaj <marko.ratkaj@sartura.hr>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)$(VIMVER)
++PKG_BUILD_PARALLEL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/vim/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libncurses
++ TITLE:=Vi IMproved - enhanced vi editor
++ URL:=http://www.vim.org/
++ SUBMENU:=Editors
++endef
++
++define Package/vim
++ $(call Package/vim/Default)
++ TITLE+= (Tiny)
++endef
++
++define Package/vim-full
++ $(call Package/vim/Default)
++ TITLE+= (Normal)
++endef
++
++define Package/vim-runtime
++ $(call Package/vim/Default)
++ TITLE+= (runtime files)
++endef
++
++define Package/vim-help
++ $(call Package/vim/Default)
++ TITLE+= (help files)
++endef
++
++define Package/xxd
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=make a hexdump or do the reverse
++ URL:=http://www.vim.org/
++endef
++
++define Package/vim-full/conffiles
++/usr/share/vim/vimrc
++/root/.vimrc
++endef
++
++define Package/vim/conffiles
++/usr/share/vim/vimrc
++/root/.vimrc
++endef
++
++define Package/vim/description
++ Vim is an almost compatible version of the UNIX editor Vi.
++ (Tiny build)
++endef
++
++define Package/vim-full/description
++ Vim is an almost compatible version of the UNIX editor Vi.
++ (Normal build)
++endef
++
++define Package/vim-runtime/description
++ Vim is an almost compatible version of the UNIX editor Vi.
++ (Runtime files)
++endef
++
++define Package/vim-help/description
++ Vim is an almost compatible version of the UNIX editor Vi.
++ (Help files)
++endef
++
++define Package/xxd/description
++ xxd creates a hex dump of a given file or standard input, it can also convert
++ a hex dump back to its original binary form.
++endef
++
++CONFIGURE_ARGS += \
++ --disable-gui \
++ --disable-gtktest \
++ --disable-xim \
++ --without-x \
++ --disable-netbeans \
++ --disable-cscope \
++ --disable-gpm \
++ --disable-acl \
++ --with-tlib=ncurses
++
++CONFIGURE_VARS += \
++ vim_cv_getcwd_broken=no \
++ vim_cv_memmove_handles_overlap=yes \
++ vim_cv_stat_ignores_slash=yes \
++ vim_cv_tgetent=zero \
++ vim_cv_terminfo=yes \
++ vim_cv_toupper_broken=no \
++ vim_cv_tty_group=root \
++ vim_cv_tty_mode=0620
++
++ifneq ($(CONFIG_PACKAGE_vim),)
++define Build/Compile/vim
++ $(call Build/Configure/Default, \
++ --with-features=tiny \
++ --disable-multibyte \
++ )
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" all
++ $(CP) $(PKG_BUILD_DIR)/src/$(PKG_NAME) $(PKG_BUILD_DIR)/vim_tiny
++endef
++endif
++
++ifneq ($(CONFIG_PACKAGE_vim-full),)
++define Build/Compile/vim-full
++ $(call Build/Configure/Default, \
++ --with-features=normal \
++ --enable-multibyte \
++ )
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" all
++ $(CP) $(PKG_BUILD_DIR)/src/$(PKG_NAME) $(PKG_BUILD_DIR)/vim_normal
++endef
++endif
++
++ifneq ($(CONFIG_PACKAGE_xxd),)
++define Build/Compile/xxd
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) \
++ DESTDIR="$(PKG_INSTALL_DIR)" all
++endef
++endif
++
++define Build/Compile/vim-runtime
++ $(MAKE) -C $(PKG_BUILD_DIR)/src DESTDIR="$(PKG_INSTALL_DIR)" installrtbase
++ (cd $(PKG_INSTALL_DIR) && tar -cf $(PKG_BUILD_DIR)/docs.tar ./usr/share/vim/vim$(VIMVER)/doc)
++ rm -rf $(PKG_INSTALL_DIR)/usr/share/vim/vim$(VIMVER)/doc
++ rm -rf $(PKG_INSTALL_DIR)/usr/man
++endef
++
++define Build/Compile
++$(call Build/Compile/vim)
++$(call Build/Compile/vim-full)
++$(call Build/Compile/vim-runtime)
++$(call Build/Compile/xxd)
++endef
++
++define Package/vim/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/vim_tiny $(1)/usr/bin/vim
++ $(INSTALL_DIR) $(1)/usr/share/vim
++ $(INSTALL_CONF) ./files/vimrc $(1)/usr/share/vim/
++endef
++
++define Package/vim-full/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/vim_normal $(1)/usr/bin/vim
++ $(INSTALL_DIR) $(1)/usr/share/vim
++ $(INSTALL_CONF) ./files/vimrc.full $(1)/usr/share/vim/vimrc
++endef
++
++define Package/vim-runtime/install
++ $(CP) $(PKG_INSTALL_DIR)/* $(1)
++ rm -rf $(1)/usr/share/vim/vim$(VIMVER)/doc
++endef
++
++define Package/vim-help/install
++ tar -C $(1) -xf $(PKG_BUILD_DIR)/docs.tar
++endef
++
++define Package/xxd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/xxd/xxd $(1)/usr/bin
++endef
++
++$(eval $(call BuildPackage,vim))
++$(eval $(call BuildPackage,vim-full))
++$(eval $(call BuildPackage,vim-runtime))
++$(eval $(call BuildPackage,vim-help))
++$(eval $(call BuildPackage,xxd))
+diff --git a/feeds/packages/utils/vim/files/vimrc b/feeds/packages/utils/vim/files/vimrc
+new file mode 100644
+index 0000000..b8cea29
+--- /dev/null
++++ b/feeds/packages/utils/vim/files/vimrc
+@@ -0,0 +1,12 @@
++set showcmd " show (partial) command in status line
++set showmatch " show matching brackets
++set incsearch " incremental search
++set autowrite " automatically save before commands like :next and :make
++set nocompatible " use vim defaults instead of 100% vi compatibility
++set backspace=indent,eol,start " more powerful backspacing
++set autoindent " always set autoindenting on
++set linebreak " don't wrap words by default
++set textwidth=0 " don't wrap lines by default
++set ruler " show the cursor position all the time
++
++set backupskip+=/etc/crontabs.* " fix crontab -e
+diff --git a/feeds/packages/utils/vim/files/vimrc.full b/feeds/packages/utils/vim/files/vimrc.full
+new file mode 100644
+index 0000000..99f737e
+--- /dev/null
++++ b/feeds/packages/utils/vim/files/vimrc.full
+@@ -0,0 +1,30 @@
++set showcmd " show (partial) command in status line
++set showmatch " show matching brackets
++set incsearch " incremental search
++set autowrite " automatically save before commands like :next and :make
++set nocompatible " use Vim defaults instead of 100% vi compatibility
++set backspace=indent,eol,start " more powerful backspacing
++set autoindent " always set autoindenting on
++set linebreak " don't wrap words by default
++set textwidth=0 " don't wrap lines by default
++set ruler " show the cursor position all the time
++
++set backupskip+=/etc/crontabs.* " fix crontab -e
++
++if filereadable(expand("$VIMRUNTIME/syntax/synload.vim"))
++ syntax on
++endif
++if has("syntax") && &term =~ "xterm"
++ set t_Co=8
++ if has("terminfo")
++ set t_Sf=<Esc>[3%p1%dm
++ set t_Sb=<Esc>[4%p1%dm
++ else
++ set t_Sf=<Esc>[3%dm
++ set t_Sb=<Esc>[4%dm
++ endif
++endif
++
++" Uncomment out for line and/or relative numberig
++" set number
++" set rnu
+diff --git a/feeds/packages/utils/vim/patches/001-compile.patch b/feeds/packages/utils/vim/patches/001-compile.patch
+new file mode 100644
+index 0000000..6740f1a
+--- /dev/null
++++ b/feeds/packages/utils/vim/patches/001-compile.patch
+@@ -0,0 +1,41 @@
++--- a/src/auto/configure
+++++ b/src/auto/configure
++@@ -12294,37 +12294,8 @@ _ACEOF
++
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking uint32_t is 32 bits" >&5
++ $as_echo_n "checking uint32_t is 32 bits... " >&6; }
++-if test "$cross_compiling" = yes; then :
++- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot check uint32_t when cross-compiling." >&5
++-$as_echo "$as_me: WARNING: cannot check uint32_t when cross-compiling." >&2;}
++-else
++- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++-/* end confdefs.h. */
++-
++-#ifdef HAVE_STDINT_H
++-# include <stdint.h>
++-#endif
++-#ifdef HAVE_INTTYPES_H
++-# include <inttypes.h>
++-#endif
++-main() {
++- uint32_t nr1 = (uint32_t)-1;
++- uint32_t nr2 = (uint32_t)0xffffffffUL;
++- if (sizeof(uint32_t) != 4 || nr1 != 0xffffffffUL || nr2 + 1 != 0) exit(1);
++- exit(0);
++-}
++-_ACEOF
++-if ac_fn_c_try_run "$LINENO"; then :
++- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: assuming ok" >&5
++ $as_echo "ok" >&6; }
++-else
++- as_fn_error "WRONG! uint32_t not defined correctly." "$LINENO" 5
++-fi
++-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
++- conftest.$ac_objext conftest.beam conftest.$ac_ext
++-fi
++-
++-
++
++ bcopy_test_prog='
++ #include "confdefs.h"
+diff --git a/feeds/packages/utils/vim/patches/002-remove_helptags_generation.patch b/feeds/packages/utils/vim/patches/002-remove_helptags_generation.patch
+new file mode 100644
+index 0000000..051c8da
+--- /dev/null
++++ b/feeds/packages/utils/vim/patches/002-remove_helptags_generation.patch
+@@ -0,0 +1,10 @@
++--- a/runtime/doc/Makefile
+++++ b/runtime/doc/Makefile
++@@ -310,7 +310,6 @@ all: tags vim.man evim.man vimdiff.man v
++ # Use Vim to generate the tags file. Can only be used when Vim has been
++ # compiled and installed. Supports multiple languages.
++ vimtags: $(DOCS)
++- $(VIMEXE) -u NONE -esX -c "helptags ++t ." -c quit
++
++ # Use "doctags" to generate the tags file. Only works for English!
++ tags: doctags $(DOCS)
+diff --git a/feeds/packages/utils/watchcat/Makefile b/feeds/packages/utils/watchcat/Makefile
+new file mode 100644
+index 0000000..7459794
+--- /dev/null
++++ b/feeds/packages/utils/watchcat/Makefile
+@@ -0,0 +1,45 @@
++#
++# Copyright (C) 2010 segal.di.ubi.pt
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=watchcat
++PKG_VERSION:=1
++PKG_RELEASE:=5
++
++PKG_MAINTAINER:=Roger D <rogerdammit@gmail.com>
++PKG_LICENSE:=GPL-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/watchcat
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Enable the configuration of programed reboots
++endef
++
++define Package/watchcat/description
++Allows to configure a periodically reboot, or after loosing internet connectivity. Configured trough UCI /etc/config/system.
++endef
++
++define Package/watchcat/conffiles
++/etc/config/system
++endef
++
++define Build/Compile
++endef
++
++define Package/watchcat/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/initd_watchcat $(1)/etc/init.d/watchcat
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) ./files/watchcat.sh $(1)/usr/bin/watchcat.sh
++ $(INSTALL_DIR) $(1)/etc/uci-defaults
++ $(INSTALL_BIN) ./files/uci_defaults_watchcat $(1)/etc/uci-defaults/50-watchcat
++endef
++
++$(eval $(call BuildPackage,watchcat))
+diff --git a/feeds/packages/utils/watchcat/files/initd_watchcat b/feeds/packages/utils/watchcat/files/initd_watchcat
+new file mode 100644
+index 0000000..36e353f
+--- /dev/null
++++ b/feeds/packages/utils/watchcat/files/initd_watchcat
+@@ -0,0 +1,108 @@
++#!/bin/sh /etc/rc.common
++
++START=97
++
++PIDFILE="/tmp/run/watchcat"
++
++append_string() {
++ local varname="$1"; local add="$2"; local separator="${3:- }"; local actual
++ eval "actual=\$$varname"
++
++ new="${actual:+$actual$separator}$add"
++ eval "$varname=\$new"
++}
++
++timetoseconds() {
++ local time=$1
++ unset seconds
++
++ { [ "$time" -ge 1 ] 2> /dev/null && seconds="$time"; } || \
++ { [ "${time%s}" -ge 1 ] 2> /dev/null && seconds="${time%s}"; } || \
++ { [ "${time%m}" -ge 1 ] 2> /dev/null && seconds=$((${time%m}*60)); } || \
++ { [ "${time%h}" -ge 1 ] 2> /dev/null && seconds=$((${time%h}*3600)); } || \
++ { [ "${time%d}" -ge 1 ] 2> /dev/null && seconds=$((${time%d}*86400)); }
++}
++
++load_watchcat() {
++ config_get period $1 period
++ config_get mode $1 mode "allways"
++ config_get pinghosts $1 pinghosts "8.8.8.8"
++ config_get pingperiod $1 pingperiod
++ config_get forcedelay $1 forcedelay "0"
++
++ error=""
++
++ timetoseconds "$period"
++ period="$seconds"
++ [ "$period" -ge 1 ] \
++ || append_string "error" 'period is not a valid time value (ex: "30"; "4m"; "6h"; "2d")' "; "
++ [ "$mode" = "allways" -o "$mode" = "ping" ] \
++ || append_string "error" "mode must be 'allways' or 'ping'" "; "
++ [ -n "$pinghosts" -o "$mode" = "allways" ] \
++ || append_string "error" "pinghosts must be set when in 'ping' mode" "; "
++ [ "$mode" = "ping" ] && {
++ if [ -n "$pingperiod" ]
++ then
++ timetoseconds "$pingperiod"
++ pingperiod="$seconds"
++ if [ "$pingperiod" -ge 0 ]
++ then
++ [ "$pingperiod" -le "$period" ] \
++ || append_string "error" "pingperiod must be less than period" "; "
++ else
++ append_string "error" 'pingperiod is not a valid time value (ex: "30"; "4m"; "6h"; "2d")' "; "
++ fi
++ else
++ pingperiod="$((period/20))"
++ fi
++ }
++ [ "$pingperiod" -lt "$period" -o "$mode" = "allways" ] \
++ || append_string "error" "pingperiod is not recognized" "; "
++ [ "$forcedelay" -ge 0 ] \
++ || append_string "error" "forcedelay must be a integer greater or equal than 0, where 0 means disabled" "; "
++
++ [ -n "$error" ] && { logger -p user.err -t "watchcat" "reboot program $1 not started - $error"; return; }
++
++ if [ "$mode" = "allways" ]
++ then
++ /usr/bin/watchcat.sh "allways" "$period" "$forcedelay" &
++ logger -p user.info -t "wathchat" "started task (mode=$mode;period=$period;forcedelay=$forcedelay)"
++ else
++ /usr/bin/watchcat.sh "period" "$period" "$forcedelay" "$pinghosts" "$pingperiod" &
++ logger -p user.info -t "wathchat" "started task (mode=$mode;period=$period;pinghosts=$pinghosts;pingperiod=$pingperiod;forcedelay=$forcedelay)"
++ fi
++
++ echo $! >> "${PIDFILE}.pids"
++}
++
++stop() {
++ if [ -f "${PIDFILE}.pids" ]
++ then
++ logger -p user.info -t "watchcat" "stopping all tasks"
++
++ while read pid
++ do
++ kill "$pid"
++ done < "${PIDFILE}.pids"
++
++ rm "${PIDFILE}.pids"
++
++ logger -p user.info -t "watchcat" "all tasks stopped"
++ else
++ logger -p user.info -t "watchcat" "no tasks running"
++ fi
++}
++
++start() {
++ [ -f "${PIDFILE}.pids" ] && stop
++
++ config_load system
++ if [ -n "$(uci show system.@watchcat[0])" ] # at least one watchcat section exists
++ then
++ logger -p user.info -t "watchcat" "starting all tasks"
++ config_foreach load_watchcat watchcat
++ logger -p user.info -t "watchcat" "all tasks started"
++ else
++ logger -p user.info -t "watchcat" "no tasks defined"
++ fi
++}
+diff --git a/feeds/packages/utils/watchcat/files/uci_defaults_watchcat b/feeds/packages/utils/watchcat/files/uci_defaults_watchcat
+new file mode 100644
+index 0000000..49def81
+--- /dev/null
++++ b/feeds/packages/utils/watchcat/files/uci_defaults_watchcat
+@@ -0,0 +1,10 @@
++#!/bin/sh
++
++uci -q show system.@watchcat[0] || {
++ uci add system watchcat
++ uci set system.@watchcat[0].period=6h
++ uci set system.@watchcat[0].mode=ping
++ uci set system.@watchcat[0].pinghosts=8.8.8.8
++ uci set system.@watchcat[0].forcedelay=30
++ uci commit
++}
+diff --git a/feeds/packages/utils/watchcat/files/watchcat.sh b/feeds/packages/utils/watchcat/files/watchcat.sh
+new file mode 100644
+index 0000000..304ef27
+--- /dev/null
++++ b/feeds/packages/utils/watchcat/files/watchcat.sh
+@@ -0,0 +1,74 @@
++#!/bin/sh
++#
++# Copyright (C) 2010 segal.di.ubi.pt
++#
++# This is free software, licensed under the GNU General Public License v2.
++#
++
++mode="$1"
++
++shutdown_now() {
++ local forcedelay="$1"
++
++ reboot &
++
++ [ "$forcedelay" -ge 1 ] && {
++ sleep "$forcedelay"
++
++ echo b > /proc/sysrq-trigger # Will immediately reboot the system without syncing or unmounting your disks.
++ }
++}
++
++watchcat_allways() {
++ local period="$1"; local forcedelay="$2"
++
++ sleep "$period" && shutdown_now "$forcedelay"
++}
++
++watchcat_ping() {
++ local period="$1"; local forcedelay="$2"; local pinghosts="$3"; local pingperiod="$4"
++
++ time_now="$(cat /proc/uptime)"
++ time_now="${time_now%%.*}"
++ time_lastcheck="$time_now"
++ time_lastcheck_withinternet="$time_now"
++
++ while true
++ do
++ # account for the time ping took to return. With a ping time of 5s, ping might take more than that, so it is important to avoid even more delay.
++ time_now="$(cat /proc/uptime)"
++ time_now="${time_now%%.*}"
++ time_diff="$((time_now-time_lastcheck))"
++
++ [ "$time_diff" -lt "$pingperiod" ] && {
++ sleep_time="$((pingperiod-time_diff))"
++ sleep "$sleep_time"
++ }
++
++ time_now="$(cat /proc/uptime)"
++ time_now="${time_now%%.*}"
++ time_lastcheck="$time_now"
++
++ for host in "$pinghosts"
++ do
++ if ping -c 1 "$host" &> /dev/null
++ then
++ time_lastcheck_withinternet="$time_now"
++ else
++ time_diff="$((time_now-time_lastcheck_withinternet))"
++ logger -p daemon.info -t "watchcat[$$]" "no internet connectivity for $time_diff seconds. Reseting when reaching $period"
++ fi
++ done
++
++ time_diff="$((time_now-time_lastcheck_withinternet))"
++ [ "$time_diff" -ge "$period" ] && shutdown_now "$forcedelay"
++
++ done
++}
++
++ if [ "$mode" = "allways" ]
++ then
++ watchcat_allways "$2" "$3"
++ else
++ watchcat_ping "$2" "$3" "$4" "$5"
++ fi
+diff --git a/feeds/packages/utils/wifitoggle/Makefile b/feeds/packages/utils/wifitoggle/Makefile
+new file mode 100644
+index 0000000..182f1db
+--- /dev/null
++++ b/feeds/packages/utils/wifitoggle/Makefile
+@@ -0,0 +1,45 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++# Copyright (C) 2010 segal.di.ubi.pt
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=wifitoggle
++PKG_VERSION:=1
++PKG_RELEASE:=4
++PKG_LICENSE:=GPL-2.0+
++
++PKG_MAINTAINER:=Nuno Goncalves <nunojpg@gmail.com>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/wifitoggle
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Script to toggle Wi-Fi with a button and UCI config
++endef
++
++define Package/wifitoggle/description
++Very versatile script to toggle Wi-Fi with a button. Allows to set
++timeouts, persist changes after boot, and set LEDs according to the state.
++endef
++
++define Package/wifitoggle/conffiles
++/etc/config/wifitoggle
++endef
++
++define Build/Compile
++endef
++
++define Package/wifitoggle/install
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/button
++ $(INSTALL_BIN) ./files/wifitoggle.hotplug $(1)/etc/hotplug.d/button/50-wifitoggle
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/wifitoggle.config $(1)/etc/config/wifitoggle
++endef
++
++$(eval $(call BuildPackage,wifitoggle))
+diff --git a/feeds/packages/utils/wifitoggle/files/wifitoggle.config b/feeds/packages/utils/wifitoggle/files/wifitoggle.config
+new file mode 100755
+index 0000000..f3bec29
+--- /dev/null
++++ b/feeds/packages/utils/wifitoggle/files/wifitoggle.config
+@@ -0,0 +1,11 @@
++config wifitoggle
++ option button 'wps'
++
++ option persistent '0'
++ option timer '600'
++
++ option led_sysfs 'wrt160nl:amber:wps'
++ option led_enable_trigger 'timer'
++ option led_enable_delayon '500'
++ option led_enable_delayoff '500'
++ option led_disable_default '0'
+diff --git a/feeds/packages/utils/wifitoggle/files/wifitoggle.hotplug b/feeds/packages/utils/wifitoggle/files/wifitoggle.hotplug
+new file mode 100755
+index 0000000..d66db3f
+--- /dev/null
++++ b/feeds/packages/utils/wifitoggle/files/wifitoggle.hotplug
+@@ -0,0 +1,172 @@
++# /bin/sh
++
++setled() {
++ if [ -e /sys/class/leds/${led_sysfs}/brightness ]
++ then
++ [ $led_default -eq 1 ] && echo 1 >/sys/class/leds/${led_sysfs}/brightness
++ [ $led_default -eq 1 ] || echo 0 >/sys/class/leds/${led_sysfs}/brightness
++
++ echo $led_trigger > /sys/class/leds/${led_sysfs}/trigger
++
++ [ "$led_trigger" == "netdev" -a -n "$led_dev" ] && {
++ echo $led_dev > /sys/class/leds/${led_sysfs}/device_name
++ echo $led_mode > /sys/class/leds/${led_sysfs}/mode
++ }
++
++ [ "$led_trigger" == "timer" ] && {
++ [ -n "$led_delayon" ] && echo $led_delayon > /sys/class/leds/${led_sysfs}/delay_on
++ [ -n "$led_delayoff" ] && echo $led_delayoff > /sys/class/leds/${led_sysfs}/delay_off
++ }
++ else
++ logger -p user.err -t "wifitoggle" "led: ${led_sysfs} not found"
++ fi
++}
++
++load_wireless() {
++ disabled="$(uci get wireless.${1}.disabled)"
++}
++
++save_wireless() {
++ [ "$device" = "all" -o "$device" = "${1}" ] && {
++ uci set "wireless.${1}.disabled=$disabled"
++ }
++}
++
++setwifi() {
++ setled
++
++ config_load wireless
++ config_foreach save_wireless wifi-device
++
++ if ubus list network.wireless >/dev/null 2>/dev/null; then
++ ubus call network reload
++ else
++ wifi
++ fi
++}
++
++
++save_system() {
++ config_get sysfs $1 sysfs
++ [ "$sysfs" = "$led_sysfs" ] && {
++ uci set "system.${1}.trigger=$led_trigger"
++ uci set "system.${1}.dev=$led_dev"
++ uci set "system.${1}.mode=$led_mode"
++ uci set "system.${1}.default=$led_default"
++ uci set "system.${1}.delayon=$led_delayon"
++ uci set "system.${1}.delayoff=$led_delayoff"
++
++ ledset=1
++ }
++}
++
++commit_changes() {
++ ledset=""
++
++ config_load system
++ config_foreach save_system led
++
++ [ "$ledset" -eq 1 ] || {
++ section=$(uci add system led)
++ uci set "system.${section}.sysfs=$led_sysfs"
++ uci set "system.${section}.trigger=$led_trigger"
++ uci set "system.${section}.dev=$led_dev"
++ uci set "system.${section}.mode=$led_mode"
++ uci set "system.${section}.default=$led_default"
++ uci set "system.${section}.delayon=$led_delayon"
++ uci set "system.${section}.delayoff=$led_delayoff"
++ }
++
++ uci commit
++}
++
++enable() {
++
++ led_trigger="$led_enable_trigger"
++ led_trigger="$led_enable_trigger"
++ led_dev="$led_enable_dev"
++ led_mode="$led_enable_mode"
++ led_default="$led_enable_default"
++ led_delayon="$led_enable_delayon"
++ led_delayoff="$led_enable_delayoff"
++ disabled=0
++
++ setwifi
++
++ [ "$timer" -le 0 -a "$persistent" -eq 1 ] && commit_changes
++
++ logger -p user.info -t "wifitoggle" "device($device) enabled"
++
++ [ "$timer" -gt 0 ] && {
++ sleep "$timer" && disable && rm /tmp/run/wirelesstoggle_${1}.pid &
++ echo $! > /tmp/run/wirelesstoggle_${1}.pid
++ logger -p user.info -t "wifitoggle" "auto-disable timer started($timer seconds)"
++ }
++}
++
++disable() {
++
++ led_trigger="$led_disable_trigger"
++ led_trigger="$led_disable_trigger"
++ led_dev="$led_disable_dev"
++ led_mode="$led_disable_mode"
++ led_default="$led_disable_default"
++ led_delayon="$led_disable_delayon"
++ led_delayoff="$led_disable_delayoff"
++ disabled=1
++
++ setwifi
++
++ [ "$timer" -le 0 -a "$persistent" -eq 1 ] && commit_changes
++
++ logger -p user.info -t "wifitoggle" "device($device) disabled"
++}
++
++
++load_wifitoggle() {
++ config_get device $1 device "all"
++ config_get button $1 button "wps"
++ config_get action $1 action "pressed"
++ config_get_bool persistent $1 persistent "0"
++ config_get timer $1 timer "0"
++
++ config_get led_sysfs $1 led_sysfs
++
++ config_get led_enable_trigger $1 led_enable_trigger "none"
++ config_get led_enable_dev $1 led_enable_dev
++ config_get led_enable_mode $1 led_enable_mode "link"
++ config_get_bool led_enable_default $1 led_enable_default "1"
++ config_get led_enable_delayon $1 led_enable_delayon
++ config_get led_enable_delayoff $1 led_enable_delayoff
++
++ config_get led_disable_trigger $1 led_disable_trigger "none"
++ config_get led_disable_dev $1 led_disable_dev
++ config_get led_disable_mode $1 led_disable_mode "link"
++ config_get_bool led_disable_default $1 led_disable_default "0"
++ config_get led_disable_delayon $1 led_disable_delayon
++ config_get led_disable_delayoff $1 led_disable_delayoff
++
++ [ "$ACTION" = "$action" -a "$BUTTON" = "$button" ] && {
++
++ [ -f /tmp/run/wirelesstoggle_${1}.pid ] && read PID < /tmp/run/wirelesstoggle_${1}.pid && kill $PID && rm /tmp/run/wirelesstoggle_${1}.pid
++
++ if [ "$device" = "all" ]
++ then
++ config_load wireless
++ config_foreach load_wireless wifi-device
++ else
++ disabled="$(uci get wireless."$device".disabled)"
++ fi
++
++
++ if [ "$disabled" = "1" ]
++ then
++ enable $1
++ else
++ disable
++ fi
++ }
++}
++
++config_load wifitoggle
++config_foreach load_wifitoggle wifitoggle
+diff --git a/feeds/packages/utils/xz/Makefile b/feeds/packages/utils/xz/Makefile
+new file mode 100644
+index 0000000..373140d
+--- /dev/null
++++ b/feeds/packages/utils/xz/Makefile
+@@ -0,0 +1,116 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=xz
++PKG_VERSION:=5.2.1
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://tukaani.org/xz
++PKG_MD5SUM:=d484910b26fec5aff99ee66350589e29
++
++PKG_LICENSE:=Public-Domain LGPL-2.1+ GPL-2.0+ GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/xz/Default
++ SUBMENU:=Compression
++ SECTION:=utils
++ CATEGORY:=Utilities
++ URL:=http://tukaani.org/xz
++endef
++
++define Package/xz-utils
++$(call Package/xz/Default)
++ TITLE:=XZ Utils (meta)
++ MENU:=1
++endef
++
++define Package/liblzma
++$(call Package/xz/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libpthread
++ TITLE:=liblzma library from XZ Utils
++endef
++
++# $(1): package name & command in /usr/bin/
++# $(2): package dependencies
++# $(3): symbolic links to $(1) in /usr/bin/
++define BuildSubPackage
++
++ define Package/$(1)
++ $(call Package/xz/Default)
++ DEPENDS:=xz-utils $(2)
++ TITLE:=$(1) utility from XZ Utils
++ endef
++
++ define Package/$(1)/description
++ Contains: $(1) $(3)
++ endef
++
++ define Package/$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/bin
++ $(CP) $(foreach f,$(1) $(3),$(PKG_INSTALL_DIR)/usr/bin/$(f)) $$(1)/usr/bin/
++ endef
++
++ $$(eval $$(call BuildPackage,$(1)))
++endef
++
++
++CONFIGURE_ARGS += \
++ --enable-small \
++ --enable-assume-ram=4 \
++ --disable-assembler \
++ --disable-werror \
++
++# API uses "restrict" keyword introduced in C99 standard
++TARGET_CFLAGS += \
++ -std=c99 \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/include/lzma{,.h} \
++ $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/liblzma.{a,so*} \
++ $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/liblzma.pc \
++ $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/xz-utils/install
++ true
++endef
++
++define Package/liblzma/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/liblzma.so.* $(1)/usr/lib/
++endef
++
++
++$(eval $(call BuildPackage,xz-utils))
++$(eval $(call BuildPackage,liblzma))
++$(eval $(call BuildSubPackage,lzmadec, +liblzma,))
++$(eval $(call BuildSubPackage,lzmainfo, +liblzma,))
++$(eval $(call BuildSubPackage,xz, +liblzma, lzcat lzma unlzma unxz xzcat))
++$(eval $(call BuildSubPackage,xzdec, +liblzma,))
++$(eval $(call BuildSubPackage,xzdiff, +bash +xz, lzcmp lzdiff xzcmp))
++$(eval $(call BuildSubPackage,xzgrep, +bash +xz, lzegrep lzfgrep lzgrep xzegrep xzfgrep))
++$(eval $(call BuildSubPackage,xzless, +bash +xz, lzless))
++$(eval $(call BuildSubPackage,xzmore, +bash +xz, lzmore))
+diff --git a/feeds/packages/utils/yunbridge/Makefile b/feeds/packages/utils/yunbridge/Makefile
+new file mode 100644
+index 0000000..ae49232
+--- /dev/null
++++ b/feeds/packages/utils/yunbridge/Makefile
+@@ -0,0 +1,48 @@
++#
++# Copyright (C) 2006-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=yunbridge
++PKG_VERSION:=160
++
++PKG_RELEASE=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/arduino/YunBridge.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=f2042052115e71ad2c91f77e78d21db8275fcdd6
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_MAINTAINER:=John Crispin <blogic@openwrt.org>
++PKG_LICENSE:=GPL-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/yunbridge
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=Arduino YUN bridge library
++ URL:=http://arduino.cc/
++ DEPENDS:=+python
++endef
++
++define Package/yunbridge/description
++ Arduino YUN bridge library
++endef
++
++define Build/Compile
++ true
++endef
++
++define Package/yunbridge/install
++ mkdir -p $(1)/usr/lib/python2.7/bridge
++ $(CP) $(PKG_BUILD_DIR)/bridge/*.py $(1)/usr/lib/python2.7/bridge/
++ $(CP) ./files/* $(1)
++endef
++
++$(eval $(call BuildPackage,yunbridge))
+diff --git a/feeds/packages/utils/yunbridge/files/etc/config/yunbridge b/feeds/packages/utils/yunbridge/files/etc/config/yunbridge
+new file mode 100644
+index 0000000..fe8dd28
+--- /dev/null
++++ b/feeds/packages/utils/yunbridge/files/etc/config/yunbridge
+@@ -0,0 +1,6 @@
++config bridge config
++ option socket_timeout 5
++ option secure_rest_api false
++
++ # remove this line to activae the yunbridge
++ option disabled 1
+diff --git a/feeds/packages/utils/yunbridge/files/etc/init.d/yunbridge b/feeds/packages/utils/yunbridge/files/etc/init.d/yunbridge
+new file mode 100755
+index 0000000..4b48220
+--- /dev/null
++++ b/feeds/packages/utils/yunbridge/files/etc/init.d/yunbridge
+@@ -0,0 +1,22 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2013 OpenWrt.org
++
++# start after and stop before networking
++START=20
++STOP=89
++
++USE_PROCD=1
++
++service_triggers()
++{
++ procd_add_reload_trigger "yunbridge"
++}
++
++start_service()
++{
++ [ "$(uci -q get yunbridge.config.disabled)" = "1" ] && return 0
++ procd_open_instance
++ procd_set_param command "/sbin/yunbridge"
++ procd_set_param respawn
++ procd_close_instance
++}
+diff --git a/feeds/packages/utils/yunbridge/files/sbin/yunbridge b/feeds/packages/utils/yunbridge/files/sbin/yunbridge
+new file mode 100755
+index 0000000..c8e4812
+--- /dev/null
++++ b/feeds/packages/utils/yunbridge/files/sbin/yunbridge
+@@ -0,0 +1,6 @@
++#!/bin/sh
++stty -F /dev/ttyS0 2500000 clocal cread cs8 -cstopb -parenb
++exec < /dev/ttyS0
++exec > /dev/ttyS0
++exec 2> /dev/ttyS0
++askfirst bin/ash --login
+diff --git a/feeds/packages/utils/yunbridge/files/usr/bin/pretty-wifi-info.lua b/feeds/packages/utils/yunbridge/files/usr/bin/pretty-wifi-info.lua
+new file mode 100755
+index 0000000..d91817a
+--- /dev/null
++++ b/feeds/packages/utils/yunbridge/files/usr/bin/pretty-wifi-info.lua
+@@ -0,0 +1,75 @@
++#!/usr/bin/lua
++
++local function get_basic_net_info(network, iface, accumulator)
++ local net = network:get_network(iface)
++ local device = net and net:get_interface()
++
++ if device then
++ accumulator["uptime"] = net:uptime()
++ accumulator["iface"] = device:name()
++ accumulator["mac"] = device:mac()
++ accumulator["rx_bytes"] = device:rx_bytes()
++ accumulator["tx_bytes"] = device:tx_bytes()
++ accumulator["ipaddrs"] = {}
++
++ for _, ipaddr in ipairs(device:ipaddrs()) do
++ accumulator.ipaddrs[#accumulator.ipaddrs + 1] = {
++ addr = ipaddr:host():string(),
++ netmask = ipaddr:mask():string()
++ }
++ end
++ end
++end
++
++local function get_wifi_info(network, iface, accumulator)
++ local net = network:get_wifinet(iface)
++
++ if net then
++ local dev = net:get_device()
++ if dev then
++ accumulator["mode"] = net:active_mode()
++ accumulator["ssid"] = net:active_ssid()
++ accumulator["encryption"] = net:active_encryption()
++ accumulator["quality"] = net:signal_percent()
++ end
++ end
++end
++
++local function collect_wifi_info()
++ local network = require"luci.model.network".init()
++ local accumulator = {}
++ get_basic_net_info(network, "lan", accumulator)
++ get_wifi_info(network, "wlan0", accumulator)
++ return accumulator
++end
++
++local info = collect_wifi_info()
++
++print("Current WiFi configuration")
++if info.ssid then
++ print("SSID: " .. info.ssid)
++end
++if info.mode then
++ print("Mode: " .. info.mode)
++end
++if info.quality then
++ print("Signal: " .. info.quality .. "%")
++end
++if info.encryption then
++ print("Encryption method: " .. info.encryption)
++end
++if info.iface then
++ print("Interface name: " .. info.iface)
++end
++if info.uptime then
++ print("Active for: " .. math.floor(info.uptime / 60) .. " minutes")
++end
++if #info.ipaddrs > 0 then
++ print("IP address: " .. info.ipaddrs[1].addr .. "/" .. info.ipaddrs[1].netmask)
++end
++if info.mac then
++ print("MAC address: " .. info.mac)
++end
++if info.rx_bytes and info.tx_bytes then
++ print("RX/TX: " .. math.floor(info.rx_bytes / 1024) .. "/" .. math.floor(info.tx_bytes / 1024) .. " KBs")
++end
+diff --git a/feeds/packages/utils/yunbridge/files/usr/lib/lua/luci/controller/arduino/index.lua b/feeds/packages/utils/yunbridge/files/usr/lib/lua/luci/controller/arduino/index.lua
+new file mode 100644
+index 0000000..8d3b7eb
+--- /dev/null
++++ b/feeds/packages/utils/yunbridge/files/usr/lib/lua/luci/controller/arduino/index.lua
+@@ -0,0 +1,414 @@
++--[[
++This file is part of YunWebUI.
++
++YunWebUI is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 2 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program; if not, write to the Free Software
++Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++
++As a special exception, you may use this file as part of a free software
++library without restriction. Specifically, if other files instantiate
++templates or use macros or inline functions from this file, or you compile
++this file and link it with other files to produce an executable, this
++file does not by itself cause the resulting executable to be covered by
++the GNU General Public License. This exception does not however
++invalidate any other reasons why the executable file might be covered by
++the GNU General Public License.
++
++Copyright 2013 Arduino LLC (http://www.arduino.cc/)
++]]
++
++module("luci.controller.arduino.index", package.seeall)
++
++local function not_nil_or_empty(value)
++ return value and value ~= ""
++end
++
++local function get_first(cursor, config, type, option)
++ return cursor:get_first(config, type, option)
++end
++
++local function set_first(cursor, config, type, option, value)
++ cursor:foreach(config, type, function(s)
++ if s[".type"] == type then
++ cursor:set(config, s[".name"], option, value)
++ end
++ end)
++end
++
++
++local function to_key_value(s)
++ local parts = luci.util.split(s, ":")
++ parts[1] = luci.util.trim(parts[1])
++ parts[2] = luci.util.trim(parts[2])
++ return parts[1], parts[2]
++end
++
++function http_error(code, text)
++ luci.http.prepare_content("text/plain")
++ luci.http.status(code)
++ if text then
++ luci.http.write(text)
++ end
++end
++
++function index()
++ function luci.dispatcher.authenticator.arduinoauth(validator, accs, default)
++ require("luci.controller.arduino.index")
++
++ local user = luci.http.formvalue("username")
++ local pass = luci.http.formvalue("password")
++ local basic_auth = luci.http.getenv("HTTP_AUTHORIZATION")
++
++ if user and validator(user, pass) then
++ return user
++ end
++
++ if basic_auth and basic_auth ~= "" then
++ local decoded_basic_auth = nixio.bin.b64decode(string.sub(basic_auth, 7))
++ user = string.sub(decoded_basic_auth, 0, string.find(decoded_basic_auth, ":") - 1)
++ pass = string.sub(decoded_basic_auth, string.find(decoded_basic_auth, ":") + 1)
++ end
++
++ if user then
++ if #pass ~= 64 and validator(user, pass) then
++ return user
++ elseif #pass == 64 then
++ local uci = luci.model.uci.cursor()
++ uci:load("yunbridge")
++ local stored_encrypted_pass = uci:get_first("yunbridge", "bridge", "password")
++ if pass == stored_encrypted_pass then
++ return user
++ end
++ end
++ end
++
++ luci.http.header("WWW-Authenticate", "Basic realm=\"yunbridge\"")
++ luci.http.status(401)
++
++ return false
++ end
++
++ local function make_entry(path, target, title, order)
++ local page = entry(path, target, title, order)
++ page.leaf = true
++ return page
++ end
++
++ -- web panel
++ local webpanel = entry({ "webpanel" }, alias("webpanel", "go_to_homepage"), _("%s Web Panel") % luci.sys.hostname(), 10)
++ webpanel.sysauth = "root"
++ webpanel.sysauth_authenticator = "arduinoauth"
++
++ make_entry({ "webpanel", "go_to_homepage" }, call("go_to_homepage"), nil)
++
++ --api security level
++ local uci = luci.model.uci.cursor()
++ uci:load("yunbridge")
++ local secure_rest_api = uci:get_first("yunbridge", "bridge", "secure_rest_api")
++ local rest_api_sysauth = false
++ if secure_rest_api == "true" then
++ rest_api_sysauth = webpanel.sysauth
++ end
++
++ --storage api
++ local data_api = node("data")
++ data_api.sysauth = rest_api_sysauth
++ data_api.sysauth_authenticator = webpanel.sysauth_authenticator
++ make_entry({ "data", "get" }, call("storage_send_request"), nil).sysauth = rest_api_sysauth
++ make_entry({ "data", "put" }, call("storage_send_request"), nil).sysauth = rest_api_sysauth
++ make_entry({ "data", "delete" }, call("storage_send_request"), nil).sysauth = rest_api_sysauth
++ local mailbox_api = node("mailbox")
++ mailbox_api.sysauth = rest_api_sysauth
++ mailbox_api.sysauth_authenticator = webpanel.sysauth_authenticator
++ make_entry({ "mailbox" }, call("build_bridge_mailbox_request"), nil).sysauth = rest_api_sysauth
++
++ --plain socket endpoint
++ local plain_socket_endpoint = make_entry({ "arduino" }, call("board_plain_socket"), nil)
++ plain_socket_endpoint.sysauth = rest_api_sysauth
++ plain_socket_endpoint.sysauth_authenticator = webpanel.sysauth_authenticator
++end
++
++function go_to_homepage()
++ luci.http.redirect("/index.html")
++end
++
++local function build_bridge_request(command, params)
++
++ local bridge_request = {
++ command = command
++ }
++
++ if command == "raw" then
++ params = table.concat(params, "/")
++ if not_nil_or_empty(params) then
++ bridge_request["data"] = params
++ end
++ return bridge_request
++ end
++
++ if command == "get" then
++ if not_nil_or_empty(params[1]) then
++ bridge_request["key"] = params[1]
++ end
++ return bridge_request
++ end
++
++ if command == "put" and not_nil_or_empty(params[1]) and params[2] then
++ bridge_request["key"] = params[1]
++ bridge_request["value"] = params[2]
++ return bridge_request
++ end
++
++ if command == "delete" and not_nil_or_empty(params[1]) then
++ bridge_request["key"] = params[1]
++ return bridge_request
++ end
++
++ return nil
++end
++
++local function extract_jsonp_param(query_string)
++ if not not_nil_or_empty(query_string) then
++ return nil
++ end
++
++ local qs_parts = string.split(query_string, "&")
++ for idx, value in ipairs(qs_parts) do
++ if string.find(value, "jsonp") == 1 or string.find(value, "callback") == 1 then
++ return string.sub(value, string.find(value, "=") + 1)
++ end
++ end
++end
++
++local function parts_after(url_part)
++ local url = luci.http.getenv("PATH_INFO")
++ local url_after_part = string.find(url, "/", string.find(url, url_part) + 1)
++ if not url_after_part then
++ return {}
++ end
++ return luci.util.split(string.sub(url, url_after_part + 1), "/")
++end
++
++function storage_send_request()
++ local method = luci.http.getenv("REQUEST_METHOD")
++ local jsonp_callback = extract_jsonp_param(luci.http.getenv("QUERY_STRING"))
++ local parts = parts_after("data")
++ local command = parts[1]
++ if not command or command == "" then
++ luci.http.status(404)
++ return
++ end
++ local params = {}
++ for idx, param in ipairs(parts) do
++ if idx > 1 and not_nil_or_empty(param) then
++ table.insert(params, param)
++ end
++ end
++
++ -- TODO check method?
++ local bridge_request = build_bridge_request(command, params)
++ if not bridge_request then
++ luci.http.status(403)
++ return
++ end
++
++ local uci = luci.model.uci.cursor()
++ uci:load("yunbridge")
++ local socket_timeout = uci:get_first("yunbridge", "bridge", "socket_timeout", 5)
++
++ local sock, code, msg = nixio.connect("127.0.0.1", 5700)
++ if not sock then
++ code = code or ""
++ msg = msg or ""
++ http_error(500, "nil socket, " .. code .. " " .. msg)
++ return
++ end
++
++ sock:setopt("socket", "sndtimeo", socket_timeout)
++ sock:setopt("socket", "rcvtimeo", socket_timeout)
++ sock:setopt("tcp", "nodelay", 1)
++
++ local json = require("luci.json")
++
++ sock:write(json.encode(bridge_request))
++ sock:writeall("\n")
++
++ local response_text = {}
++ while true do
++ local bytes = sock:recv(4096)
++ if bytes and #bytes > 0 then
++ table.insert(response_text, bytes)
++ end
++
++ local json_response = json.decode(table.concat(response_text))
++ if json_response then
++ sock:close()
++ luci.http.status(200)
++ if jsonp_callback then
++ luci.http.prepare_content("application/javascript")
++ luci.http.write(jsonp_callback)
++ luci.http.write("(")
++ luci.http.write_json(json_response)
++ luci.http.write(");")
++ else
++ luci.http.prepare_content("application/json")
++ luci.http.write(json.encode(json_response))
++ end
++ return
++ end
++
++ if not bytes or #response_text == 0 then
++ sock:close()
++ http_error(500, "Empty response")
++ return
++ end
++ end
++
++ sock:close()
++end
++
++function board_plain_socket()
++ local function send_response(response_text, jsonp_callback)
++ if not response_text then
++ luci.http.status(500)
++ return
++ end
++
++ local rows = luci.util.split(response_text, "\r\n")
++ if #rows == 1 or string.find(rows[1], "Status") ~= 1 then
++ luci.http.prepare_content("text/plain")
++ luci.http.status(200)
++ luci.http.write(response_text)
++ return
++ end
++
++ local body_start_at_idx = -1
++ local content_type = "text/plain"
++ for idx, row in ipairs(rows) do
++ if row == "" then
++ body_start_at_idx = idx
++ break
++ end
++
++ local key, value = to_key_value(row)
++ if string.lower(key) == "status" then
++ luci.http.status(tonumber(value))
++ elseif string.lower(key) == "content-type" then
++ content_type = value
++ else
++ luci.http.header(key, value)
++ end
++ end
++
++ local response_body = table.concat(rows, "\r\n", body_start_at_idx + 1)
++ if content_type == "application/json" and jsonp_callback then
++ local json = require("luci.json")
++ luci.http.prepare_content("application/javascript")
++ luci.http.write(jsonp_callback)
++ luci.http.write("(")
++ luci.http.write_json(json.decode(response_body))
++ luci.http.write(");")
++ else
++ luci.http.prepare_content(content_type)
++ luci.http.write(response_body)
++ end
++ end
++
++ local method = luci.http.getenv("REQUEST_METHOD")
++ local jsonp_callback = extract_jsonp_param(luci.http.getenv("QUERY_STRING"))
++ local parts = parts_after("arduino")
++ local params = {}
++ for idx, param in ipairs(parts) do
++ if not_nil_or_empty(param) then
++ table.insert(params, param)
++ end
++ end
++
++ if #params == 0 then
++ luci.http.status(404)
++ return
++ end
++
++ params = table.concat(params, "/")
++
++ local uci = luci.model.uci.cursor()
++ uci:load("yunbridge")
++ local socket_timeout = uci:get_first("yunbridge", "bridge", "socket_timeout", 5)
++
++ local sock, code, msg = nixio.connect("127.0.0.1", 5555)
++ if not sock then
++ code = code or ""
++ msg = msg or ""
++ http_error(500, "Could not connect to YunServer " .. code .. " " .. msg)
++ return
++ end
++
++ sock:setopt("socket", "sndtimeo", socket_timeout)
++ sock:setopt("socket", "rcvtimeo", socket_timeout)
++ sock:setopt("tcp", "nodelay", 1)
++
++ sock:write(params)
++ sock:writeall("\r\n")
++
++ local response_text = sock:readall()
++ sock:close()
++
++ send_response(response_text, jsonp_callback)
++end
++
++function build_bridge_mailbox_request()
++ local method = luci.http.getenv("REQUEST_METHOD")
++ local jsonp_callback = extract_jsonp_param(luci.http.getenv("QUERY_STRING"))
++ local parts = parts_after("mailbox")
++ local params = {}
++ for idx, param in ipairs(parts) do
++ if not_nil_or_empty(param) then
++ table.insert(params, param)
++ end
++ end
++
++ if #params == 0 then
++ luci.http.status(400)
++ return
++ end
++
++ local bridge_request = build_bridge_request("raw", params)
++ if not bridge_request then
++ luci.http.status(403)
++ return
++ end
++
++ local uci = luci.model.uci.cursor()
++ uci:load("yunbridge")
++ local socket_timeout = uci:get_first("yunbridge", "bridge", "socket_timeout", 5)
++
++ local sock, code, msg = nixio.connect("127.0.0.1", 5700)
++ if not sock then
++ code = code or ""
++ msg = msg or ""
++ http_error(500, "nil socket, " .. code .. " " .. msg)
++ return
++ end
++
++ sock:setopt("socket", "sndtimeo", socket_timeout)
++ sock:setopt("socket", "rcvtimeo", socket_timeout)
++ sock:setopt("tcp", "nodelay", 1)
++
++ local json = require("luci.json")
++
++ sock:write(json.encode(bridge_request))
++ sock:writeall("\n")
++ sock:close()
++
++ luci.http.status(200)
++end
+diff --git a/feeds/packages/utils/yunbridge/files/usr/lib/lua/luci/sha256.lua b/feeds/packages/utils/yunbridge/files/usr/lib/lua/luci/sha256.lua
+new file mode 100644
+index 0000000..b5e2dea
+--- /dev/null
++++ b/feeds/packages/utils/yunbridge/files/usr/lib/lua/luci/sha256.lua
+@@ -0,0 +1,199 @@
++--
++-- Code merged by gravityscore at http://pastebin.com/gsFrNjbt
++--
++-- Adaptation of the Secure Hashing Algorithm (SHA-244/256)
++-- Found Here: http://lua-users.org/wiki/SecureHashAlgorithm
++--
++-- Using an adapted version of the bit library
++-- Found Here: https://bitbucket.org/Boolsheet/bslf/src/1ee664885805/bit.lua
++--
++
++module("luci.sha256", package.seeall)
++
++local MOD = 2 ^ 32
++local MODM = MOD - 1
++
++local function memoize(f)
++ local mt = {}
++ local t = setmetatable({}, mt)
++ function mt:__index(k)
++ local v = f(k)
++ t[k] = v
++ return v
++ end
++
++ return t
++end
++
++local function make_bitop_uncached(t, m)
++ local function bitop(a, b)
++ local res, p = 0, 1
++ while a ~= 0 and b ~= 0 do
++ local am, bm = a % m, b % m
++ res = res + t[am][bm] * p
++ a = (a - am) / m
++ b = (b - bm) / m
++ p = p * m
++ end
++ res = res + (a + b) * p
++ return res
++ end
++
++ return bitop
++end
++
++local function make_bitop(t)
++ local op1 = make_bitop_uncached(t, 2 ^ 1)
++ local op2 = memoize(function(a) return memoize(function(b) return op1(a, b) end) end)
++ return make_bitop_uncached(op2, 2 ^ (t.n or 1))
++end
++
++local bxor1 = make_bitop({ [0] = { [0] = 0, [1] = 1 }, [1] = { [0] = 1, [1] = 0 }, n = 4 })
++
++local function bxor(a, b, c, ...)
++ local z = nil
++ if b then
++ a = a % MOD
++ b = b % MOD
++ z = bxor1(a, b)
++ if c then z = bxor(z, c, ...) end
++ return z
++ elseif a then return a % MOD
++ else return 0
++ end
++end
++
++local function band(a, b, c, ...)
++ local z
++ if b then
++ a = a % MOD
++ b = b % MOD
++ z = ((a + b) - bxor1(a, b)) / 2
++ if c then z = bit32_band(z, c, ...) end
++ return z
++ elseif a then return a % MOD
++ else return MODM
++ end
++end
++
++local function bnot(x) return (-1 - x) % MOD end
++
++local function rshift1(a, disp)
++ if disp < 0 then return lshift(a, -disp) end
++ return math.floor(a % 2 ^ 32 / 2 ^ disp)
++end
++
++local function rshift(x, disp)
++ if disp > 31 or disp < -31 then return 0 end
++ return rshift1(x % MOD, disp)
++end
++
++local function lshift(a, disp)
++ if disp < 0 then return rshift(a, -disp) end
++ return (a * 2 ^ disp) % 2 ^ 32
++end
++
++local function rrotate(x, disp)
++ x = x % MOD
++ disp = disp % 32
++ local low = band(x, 2 ^ disp - 1)
++ return rshift(x, disp) + lshift(low, 32 - disp)
++end
++
++local k = {
++ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
++ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
++ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
++ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
++ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
++ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
++ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
++ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
++ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
++ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
++ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
++ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
++ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
++ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
++ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
++ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
++}
++
++local function str2hexa(s)
++ return (string.gsub(s, ".", function(c) return string.format("%02x", string.byte(c)) end))
++end
++
++local function num2s(l, n)
++ local s = ""
++ for i = 1, n do
++ local rem = l % 256
++ s = string.char(rem) .. s
++ l = (l - rem) / 256
++ end
++ return s
++end
++
++local function s232num(s, i)
++ local n = 0
++ for i = i, i + 3 do n = n * 256 + string.byte(s, i) end
++ return n
++end
++
++local function preproc(msg, len)
++ local extra = 64 - ((len + 9) % 64)
++ len = num2s(8 * len, 8)
++ msg = msg .. "\128" .. string.rep("\0", extra) .. len
++ assert(#msg % 64 == 0)
++ return msg
++end
++
++local function initH256(H)
++ H[1] = 0x6a09e667
++ H[2] = 0xbb67ae85
++ H[3] = 0x3c6ef372
++ H[4] = 0xa54ff53a
++ H[5] = 0x510e527f
++ H[6] = 0x9b05688c
++ H[7] = 0x1f83d9ab
++ H[8] = 0x5be0cd19
++ return H
++end
++
++local function digestblock(msg, i, H)
++ local w = {}
++ for j = 1, 16 do w[j] = s232num(msg, i + (j - 1) * 4) end
++ for j = 17, 64 do
++ local v = w[j - 15]
++ local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3))
++ v = w[j - 2]
++ w[j] = w[j - 16] + s0 + w[j - 7] + bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10))
++ end
++
++ local a, b, c, d, e, f, g, h = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8]
++ for i = 1, 64 do
++ local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22))
++ local maj = bxor(band(a, b), band(a, c), band(b, c))
++ local t2 = s0 + maj
++ local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25))
++ local ch = bxor(band(e, f), band(bnot(e), g))
++ local t1 = h + s1 + ch + k[i] + w[i]
++ h, g, f, e, d, c, b, a = g, f, e, d + t1, c, b, a, t1 + t2
++ end
++
++ H[1] = band(H[1] + a)
++ H[2] = band(H[2] + b)
++ H[3] = band(H[3] + c)
++ H[4] = band(H[4] + d)
++ H[5] = band(H[5] + e)
++ H[6] = band(H[6] + f)
++ H[7] = band(H[7] + g)
++ H[8] = band(H[8] + h)
++end
++
++function sha256(msg)
++ msg = preproc(msg, #msg)
++ local H = initH256({})
++ for i = 1, #msg, 64 do digestblock(msg, i, H) end
++ return str2hexa(num2s(H[1], 4) .. num2s(H[2], 4) .. num2s(H[3], 4) .. num2s(H[4], 4) ..
++ num2s(H[5], 4) .. num2s(H[6], 4) .. num2s(H[7], 4) .. num2s(H[8], 4))
++end
+\ No newline at end of file
+diff --git a/feeds/packages/utils/yunbridge/patches/000-scripts.patch b/feeds/packages/utils/yunbridge/patches/000-scripts.patch
+new file mode 100644
+index 0000000..46f21bd
+--- /dev/null
++++ b/feeds/packages/utils/yunbridge/patches/000-scripts.patch
+@@ -0,0 +1,18 @@
++--- a/bridge/packet.py
+++++ b/bridge/packet.py
++@@ -93,12 +93,12 @@
++
++ def run(self, data):
++ if data[0] != 'X':
++- call(['/usr/bin/blink-start', '100'])
+++ #call(['/usr/bin/blink-start', '100'])
++ return chr(1)
++ if data[1:4] != '100':
++- call(['/usr/bin/blink-start', '100'])
+++ #call(['/usr/bin/blink-start', '100'])
++ return chr(2)
++- call(['/usr/bin/blink-stop'])
+++ #call(['/usr/bin/blink-stop'])
++ return chr(0) + '160' # send the actual bridge version
++
++ class PacketReader:
+diff --git a/feeds/packages/utils/zile/Makefile b/feeds/packages/utils/zile/Makefile
+new file mode 100644
+index 0000000..512057c
+--- /dev/null
++++ b/feeds/packages/utils/zile/Makefile
+@@ -0,0 +1,49 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=zile
++PKG_VERSION:=2.3.24
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@GNU/zile
++PKG_MD5SUM:=fe77d801ba69e0fb9b4914a04b9ff506
++PKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>
++
++PKG_LICENSE:=GPL-3.0+
++PKG_LICENSE_FILES:=COPYING
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/zile
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=+libncursesw
++ TITLE:=very small emacs-like editor
++ URL:=http://www.gnu.org/software/zile/
++ SUBMENU:=Editors
++endef
++
++define Package/zile/description
++ Zile is a small Emacs clone. Zile is a customizable, self-documenting
++ real-time display editor. Zile was written to be as similar as possible
++ to Emacs; every Emacs user should feel at home with Zile.
++endef
++
++CONFIGURE_VARS += \
++ gl_cv_func_getopt_gnu=yes
++
++define Package/zile/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/$(PKG_NAME) $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,zile))
+diff --git a/feeds/packages/utils/zip/Makefile b/feeds/packages/utils/zip/Makefile
+new file mode 100644
+index 0000000..dcbc703
+--- /dev/null
++++ b/feeds/packages/utils/zip/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=zip
++PKG_REV:=30
++PKG_VERSION:=3.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)$(PKG_REV).tar.gz
++PKG_SOURCE_URL:=@SF/infozip
++PKG_MD5SUM:=7b74551e63f8ee6aab6fbc86676c0d37
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=BSD-4-Clause
++PKG_LICENSE_FILES:=LICENSE
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/zip$(PKG_REV)
++PKG_CHECK_FORMAT_SECURITY:=0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/zip
++ SECTION:=utils
++ CATEGORY:=Utilities
++ DEPENDS:=
++ TITLE:=Archiver for .zip files
++ URL:=http://infozip.sourceforge.net/Zip.html
++ SUBMENU:=Compression
++endef
++
++define Package/zip/description
++ This is InfoZIP's zip program. It produces files that are fully
++ compatible with the popular PKZIP program; however, the command line
++ options are not identical. In other words, the end result is the same,
++ but the methods differ.
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) -f unix/Makefile generic \
++ prefix="$(PKG_INSTALL_DIR)/usr" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ CC="$(TARGET_CC) $(TARGET_CFLAGS) -O $(TARGET_CPPFLAGS) -I. -DUNIX" \
++ LD="$(TARGET_CC) $(TARGET_LDFLAGS)" \
++ IZ_BZIP2="no" \
++ install
++endef
++
++define Package/zip/install
++ $(INSTALL_DIR) $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/* $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,zip))
+diff --git a/feeds/packages/utils/zoneinfo/Makefile b/feeds/packages/utils/zoneinfo/Makefile
+new file mode 100644
+index 0000000..09b4f58
+--- /dev/null
++++ b/feeds/packages/utils/zoneinfo/Makefile
+@@ -0,0 +1,242 @@
++#
++# Copyright (C) 2007-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++# Author: Michael Geddes
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=zoneinfo
++PKG_VERSION:=2015g
++PKG_VERSION_CODE:=2015g
++PKG_RELEASE:=1
++
++#As i couldn't find real license used "Public Domain"
++#as referense to http://www.iana.org/time-zones/repository/tz-link.html
++PKG_LICENSE:=Public Domain
++
++PKG_SOURCE:=tzdata$(PKG_VERSION).tar.gz
++PKG_SOURCE_CODE:=tzcode$(PKG_VERSION_CODE).tar.gz
++PKG_SOURCE_URL:=http://www.iana.org/time-zones/repository/releases
++PKG_MD5SUM:=8d46e8b225b9a04c75f5c39636435ad6
++
++include $(INCLUDE_DIR)/package.mk
++
++define Download/tzcode
++ FILE=$(PKG_SOURCE_CODE)
++ URL=$(PKG_SOURCE_URL)
++ MD5SUM:=a2c47d908a6426f530efb1393cf1cd06
++endef
++
++$(eval $(call Download,tzcode))
++
++define Package/zoneinfo/Default
++ SUBMENU:=zoneinfo
++ TITLE:=Zone Information
++ SECTION:=utils
++ CATEGORY:=Utilities
++ MAINTAINER=Vladimir Ulrich <admin@evl.su>
++endef
++
++define Package/zoneinfo-core
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (core)
++endef
++
++define Package/zoneinfo-simple
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (simple)
++endef
++
++define Package/zoneinfo-africa
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (Africa)
++endef
++
++define Package/zoneinfo-northamerica
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (NorthAmerica)
++endef
++
++define Package/zoneinfo-southamerica
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (SouthAmerica)
++endef
++
++define Package/zoneinfo-poles
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (Arctic, Antarctic)
++endef
++
++define Package/zoneinfo-asia
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (Asia)
++endef
++
++define Package/zoneinfo-atlantic
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (Atlantic)
++endef
++
++define Package/zoneinfo-australia-nz
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (Australia-NZ)
++endef
++
++define Package/zoneinfo-pacific
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (Pacific)
++endef
++
++define Package/zoneinfo-europe
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (Europe)
++endef
++
++define Package/zoneinfo-india
++$(call Package/zoneinfo/Default)
++ TITLE:=Zone Information (India)
++endef
++
++define Build/Prepare
++ (cd $(PKG_BUILD_DIR) && tar -xzf $(DL_DIR)/$(PKG_SOURCE_CODE) && tar -xzf $(DL_DIR)/$(PKG_SOURCE))
++endef
++
++define Build/Compile
++ CFLAGS="$(HOST_CFLAGS)" \
++ $(MAKE) -C $(PKG_BUILD_DIR) -f Makefile \
++ $(HOST_CONFIGURE_OPTS) \
++ CC="$(HOSTCC)" \
++ LD="\$$$$(CC)" \
++ CPPFLAGS="$(HOST_CPPFLAGS)" \
++ LDFLAGS="$(HOST_LDFLAGS)" \
++ TOPDIR="$(PKG_INSTALL_DIR)" \
++ TZDIR="$(PKG_INSTALL_DIR)/zoneinfo" \
++ install
++endef
++
++define Package/zoneinfo-core/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo
++ for i in \
++ CET CST6CDT EET EST EST5EDT GB-Eire Eire \
++ GB GMT GMT+0 GMT-0 GMT0 Greenwich \
++ HST MET MST MST7MDT \
++ PRC PST8PDT ROC ROK UCT UTC \
++ Universal W-SU WET Zulu Etc/* zone.tab ; do \
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/$$$$i \
++ $(1)/usr/share/zoneinfo ; \
++ done
++endef
++
++define Package/zoneinfo-simple/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo
++ for i in Pacific/Honolulu \
++ America/Anchorage America/Los_Angeles America/Denver \
++ America/Chicago America/New_York America/Caracas \
++ America/Sao_Paulo Europe/London Europe/Paris \
++ Africa/Cairo Europe/Moscow Asia/Dubai \
++ Asia/Karachi Asia/Dhaka Asia/Bankok \
++ Asia/Hong_Kong Asia/Tokyo Australia/Darwin \
++ Australia/Adelaide Australia/Brisbane Australia/Sydney \
++ Australia/Perth Pacific/Noumea ; do \
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/$$$$i \
++ $(1)/usr/share/zoneinfo ; \
++ done
++endef
++
++define Package/zoneinfo-africa/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo/Africa
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/Africa/* \
++ $(1)/usr/share/zoneinfo/Africa
++endef
++
++define Package/zoneinfo-northamerica/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo
++ for i in US America Canada Mexico Cuba Jamaica Navajo ; do \
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/$$$$i \
++ $(1)/usr/share/zoneinfo ; \
++ done
++ rm -rf $(1)/usr/share/zoneinfo/America/Argentina
++endef
++
++define Package/zoneinfo-southamerica/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo
++ for i in Brazil Chile ; do \
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/$$$$i \
++ $(1)/usr/share/zoneinfo ; \
++ done
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo/America/Argentina
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/America/Argentina/* \
++ $(1)/usr/share/zoneinfo/America/Argentina
++endef
++
++define Package/zoneinfo-poles/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo
++ for i in Antarctica Arctic ; do \
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/$$$$i \
++ $(1)/usr/share/zoneinfo ; \
++ done
++endef
++
++define Package/zoneinfo-asia/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo
++ for i in Asia Japan Singapore Hongkong ; do \
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/$$$$i \
++ $(1)/usr/share/zoneinfo ; \
++ done
++endef
++
++define Package/zoneinfo-atlantic/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo
++ for i in Atlantic Iceland ; do \
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/$$$$i \
++ $(1)/usr/share/zoneinfo ; \
++ done
++endef
++
++define Package/zoneinfo-australia-nz/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo
++ for i in NZ NZ-CHAT Australia ; do \
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/$$$$i \
++ $(1)/usr/share/zoneinfo ; \
++ done
++endef
++
++define Package/zoneinfo-pacific/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo
++ for i in Pacific Kwajalein ; do \
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/$$$$i \
++ $(1)/usr/share/zoneinfo ; \
++ done
++endef
++
++define Package/zoneinfo-europe/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo
++ for i in Europe Portugal Poland ; do \
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/$$$$i \
++ $(1)/usr/share/zoneinfo ; \
++ done
++endef
++
++define Package/zoneinfo-india/install
++ $(INSTALL_DIR) $(1)/usr/share/zoneinfo
++ for i in Indian ; do \
++ $(CP) $(PKG_INSTALL_DIR)/zoneinfo/$$$$i \
++ $(1)/usr/share/zoneinfo ; \
++ done
++endef
++
++$(eval $(call BuildPackage,zoneinfo-simple))
++$(eval $(call BuildPackage,zoneinfo-core))
++$(eval $(call BuildPackage,zoneinfo-africa))
++$(eval $(call BuildPackage,zoneinfo-northamerica))
++$(eval $(call BuildPackage,zoneinfo-southamerica))
++$(eval $(call BuildPackage,zoneinfo-poles))
++$(eval $(call BuildPackage,zoneinfo-asia))
++$(eval $(call BuildPackage,zoneinfo-atlantic))
++$(eval $(call BuildPackage,zoneinfo-australia-nz))
++$(eval $(call BuildPackage,zoneinfo-pacific))
++$(eval $(call BuildPackage,zoneinfo-europe))
++$(eval $(call BuildPackage,zoneinfo-india))
+diff --git a/feeds/packages/utils/zsh/Makefile b/feeds/packages/utils/zsh/Makefile
+new file mode 100644
+index 0000000..19a909c
+--- /dev/null
++++ b/feeds/packages/utils/zsh/Makefile
+@@ -0,0 +1,82 @@
++#
++# Copyright (C) 2013-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=zsh
++PKG_VERSION:=5.1.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=@SF/zsh
++PKG_MD5SUM:=0e8ea3313300277a04cee80836507bae
++PKG_MAINTAINER:=Vadim A. Misbakh-Soloviov <openwrt-zsh@mva.name>
++PKG_LICENSE:=ZSH
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/zsh
++ SECTION:=utils
++ CATEGORY:=Utilities
++ TITLE:=The Z shell
++ DEPENDS:=+libncurses +libncursesw +libpcre +librt
++ URL:=http://www.zsh.org/
++endef
++
++define Package/zsh/description
++ Zsh is a UNIX command interpreter (shell) usable as an interactive
++ login shell and as a shell script command processor. Of the standard
++ shells, zsh most closely resembles ksh but includes many enhancements.
++ Zsh has command line editing, builtin spelling correction, programmable
++ command completion, shell functions (with autoloading), a history
++ mechanism, and a host of other features.
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --bindir=/bin \
++ --disable-etcdir \
++ --disable-gdbm \
++ --enable-pcre \
++ --enable-multibyte \
++ --enable-function-subdirs \
++ --with-tcsetpgrp \
++ --with-term-lib="ncursesw", \
++ zsh_cv_sys_nis=no \
++ zsh_cv_sys_nis_plus=no \
++ )
++ # Do not install these functions:
++ $(SED) 's, Completion/AIX/\*/\*,,g' $(PKG_BUILD_DIR)/config.modules
++ $(SED) 's, Completion/BSD/\*/\*,,g' $(PKG_BUILD_DIR)/config.modules
++ $(SED) 's, Completion/Cygwin/\*/\*,,g' $(PKG_BUILD_DIR)/config.modules
++ $(SED) 's, Completion/Darwin/\*/\*,,g' $(PKG_BUILD_DIR)/config.modules
++ $(SED) 's, Completion/Debian/\*/\*,,g' $(PKG_BUILD_DIR)/config.modules
++ $(SED) 's, Completion/Mandriva/\*/\*,,g' $(PKG_BUILD_DIR)/config.modules
++ $(SED) 's, Completion/Redhat/\*/\*,,g' $(PKG_BUILD_DIR)/config.modules
++ $(SED) 's, Completion/Solaris/\*/\*,,g' $(PKG_BUILD_DIR)/config.modules
++ $(SED) 's, Completion/X/\*/\*,,g' $(PKG_BUILD_DIR)/config.modules
++ $(SED) 's, Completion/openSUSE/\*/\*,,g' $(PKG_BUILD_DIR)/config.modules
++ # After mucking with 'config.modules', one must call
++ $(MAKE) -C $(PKG_BUILD_DIR) DESTDIR="$(PKG_INSTALL_DIR)" prep
++endef
++
++define Package/zsh/postinst
++#!/bin/sh
++grep zsh $${IPKG_INSTROOT}/etc/shells || \
++ echo "/bin/zsh" >> $${IPKG_INSTROOT}/etc/shells
++endef
++
++define Package/zsh/install
++ $(INSTALL_DIR) $(1)/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/bin/zsh $(1)/bin/
++ $(INSTALL_DIR) $(1)/usr/share/zsh/$(PKG_VERSION)
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/zsh/$(PKG_VERSION)/* $(1)/usr/share/zsh/$(PKG_VERSION)/
++endef
++
++$(eval $(call BuildPackage,zsh))
+diff --git a/feeds/routing/MAINTAINERS b/feeds/routing/MAINTAINERS
+new file mode 100644
+index 0000000..4d8f5e2
+--- /dev/null
++++ b/feeds/routing/MAINTAINERS
+@@ -0,0 +1,25 @@
++# _______ ________ __
++# | |.-----.-----.-----.| | | |.----.| |_
++# | - || _ | -__| || | | || _|| _|
++# |_______|| __|_____|__|__||________||__| |____|
++# |__| W I R E L E S S F R E E D O M
++#
++# People listed here are managing the OpenWrt routing feed,
++# use alphabetical order when updating the list.
++
++Axel "axn" Neumann <neumann@cgws.de>
++Baptiste Jonglez <bjonglez@illyse.org>
++Bastian Bittorf <bittorf@bluebottle.com>
++Corinna "Elektra" Aichele <onelektra@gmx.net>
++Gabriel Kerneis <gabriel@kerneis.info>
++Gui Iribarren <gui@altermundi.net>
++Jo-Philipp Wich <jow@openwrt.org>
++Luka Perkov <luka@openwrt.org>
++Marek Lindner <mareklindner@neomailbox.ch>
++Moritz Warning <moritzwarning@web.de>
++Nicolás Echániz <nicoechaniz@altermundi.net>
++Pau Escrich <pau@dabax.net>
++Saverio Proto <zioproto@gmail.com>
++Simon Wunderlich <sw@simonwunderlich.de>
++Steven Barth <cyrus@openwrt.org>
++Vasilis "acinonyx" Tsiligiannis <acinonyx@openwrt.gr>
+diff --git a/feeds/routing/README b/feeds/routing/README
+new file mode 100644
+index 0000000..72b7fcc
+--- /dev/null
++++ b/feeds/routing/README
+@@ -0,0 +1,18 @@
++This is an OpenWrt package feed containing community maintained routing packages.
++
++To use these packages, add the following line to the feeds.conf
++in the OpenWrt buildroot:
++
++ src-git routing git://github.com/openwrt-routing/packages.git
++
++Update the feed:
++
++ ./scripts/feeds update routing
++
++Activate the package:
++
++ ./scripts/feeds install -a -p routing
++
++The routing packages should now appear in menuconfig.
++
++
+diff --git a/feeds/routing/ahcpd/Makefile b/feeds/routing/ahcpd/Makefile
+new file mode 100644
+index 0000000..d4f8744
+--- /dev/null
++++ b/feeds/routing/ahcpd/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2007-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ahcpd
++PKG_VERSION:=0.53
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/files/
++PKG_MD5SUM:=a1a610bf20965aa522cd766bf3d5829a
++PKG_LICENSE:=MIT
++
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ahcpd
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Ad-Hoc Configuration Protocol daemon
++ URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/ahcp/
++ MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
++ DEPENDS:=+kmod-ipv6 +ip +librt
++endef
++
++define Package/ahcpd/description
++ Ahcpd is a daemon for configuring an IPv6 network using the Ad-Hoc
++ Configuration Protocol (AHCP). AHCP is designed for wireless mesh
++ networks, where IPv6 autoconfiguration and DHCPv6 do not work, but may
++ also be used on wired networks.
++endef
++
++define Package/ahcpd/conffiles
++/etc/config/ahcpd
++endef
++
++MAKE_FLAGS += \
++ EXTRA_DEFINES="$(TARGET_CFLAGS)"
++
++define Package/ahcpd/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/etc/ahcp
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ahcp-config.sh $(1)/etc/ahcp/
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ahcpd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/ahcpd.config $(1)/etc/config/ahcpd
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/ahcpd.init $(1)/etc/init.d/ahcpd
++endef
++
++$(eval $(call BuildPackage,ahcpd))
+diff --git a/feeds/routing/ahcpd/files/ahcpd.config b/feeds/routing/ahcpd/files/ahcpd.config
+new file mode 100644
+index 0000000..0996251
+--- /dev/null
++++ b/feeds/routing/ahcpd/files/ahcpd.config
+@@ -0,0 +1,32 @@
++package ahcpd
++
++config ahcpd
++ # Choose ahcp mode: client (default), server or forwarder
++ ## option 'mode' 'client'
++ # Uncomment the following lines to enable ahcpd on the desired
++ # interfaces.
++ ## list 'interface' 'lan'
++ ## list 'interface' 'wlan'
++
++ # The following only makes sense in 'server' mode.
++ # Tweak to suit your needs.
++ ## list 'prefix' 'fde6:20f5:c9ac:358::/64'
++ ## list 'prefix' '192.168.4.128/25'
++ ## list 'name_server' 'fde6:20f5:c9ac:358::1'
++ ## list 'name_server' '192.168.4.1'
++ ## list 'ntp_server' '192.168.4.2'
++ ## option 'lease_dir' '/var/lib/leases'
++
++ # option 'id_file' '/var/lib/ahcp-unique-id'
++ # option 'log_file' '/var/log/ahcpd.log'
++ # The configuration file is not necessary since you can configure
++ # everything from this file. But still, you might prefer using it.
++ ## option 'conf_file' '/etc/ahcp/ahcp.conf'
++
++ # option 'multicast_address' 'ff02::cca6:c0f9:e182:5359'
++ # option 'port' '5359'
++ # option 'ipv4_only' 'false'
++ # option 'ipv6_only' 'false'
++ # option 'lease_time' '3666'
++ # option 'debug' '1'
++
+diff --git a/feeds/routing/ahcpd/files/ahcpd.init b/feeds/routing/ahcpd/files/ahcpd.init
+new file mode 100644
+index 0000000..dee21c4
+--- /dev/null
++++ b/feeds/routing/ahcpd/files/ahcpd.init
+@@ -0,0 +1,109 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007-2011 OpenWrt.org
++
++START=71
++
++SERVICE_USE_PID=1
++
++EXTRA_COMMANDS="status"
++EXTRA_HELP=" status Print ahcpd's status to the log file."
++
++append_bool() {
++ local section="$1"
++ local option="$2"
++ local value="$3"
++ local _loctmp
++ config_get_bool _loctmp "$section" "$option" 0
++ [ "$_loctmp" -gt 0 ] && append args "$value"
++}
++
++append_parm() {
++ local section="$1"
++ local option="$2"
++ local switch="$3"
++ local _loctmp
++ config_get _loctmp "$section" "$option"
++ [ -z "$_loctmp" ] && return 0
++ append args "$switch $_loctmp"
++}
++
++append_stmt() {
++ local name="$1"
++ local switch="$2"
++ append args "-C '$switch $name'"
++}
++
++append_opt_stmt() {
++ local section="$1"
++ local option="$2"
++ local switch="$3"
++ local _loctmp
++ config_get _loctmp "$section" "$option"
++ [ -z "$_loctmp" ] && return 0
++ append args "-C '$switch $_loctmp'"
++}
++
++ahcp_addif() {
++ local ifname=$(uci_get_state network "$1" ifname "$1")
++ append interfaces "$ifname"
++}
++
++ahcp_server() {
++ local cfg="$1"
++
++ append_opt_stmt "$cfg" 'mode' 'mode'
++ append_opt_stmt "$cfg" 'lease_dir' 'lease-dir'
++ config_list_foreach "$cfg" 'prefix' append_stmt 'prefix'
++ config_list_foreach "$cfg" 'name_server' append_stmt 'name-server'
++ config_list_foreach "$cfg" 'ntp_server' append_stmt 'ntp-server'
++
++ append_parm "$cfg" 'id_file' '-i'
++ append_parm "$cfg" 'log_file' '-L'
++}
++
++ahcp_config() {
++ local cfg="$1"
++ local interface
++ local _loctmp
++
++ config_list_foreach "$cfg" 'interface' ahcp_addif
++
++ # Add interfaces with "option proto ahcp" in /etc/config/network
++ # (only for client mode)
++ config_get _loctmp "$cfg" "mode"
++ if [ -z "$_loctmp" -o "$_loctmp" = "client" ]; then
++ for interface in $(uci -P /var/state show network|grep proto=ahcp|cut -d. -f2); do
++ ahcp_addif $interface
++ done
++ fi
++
++ append_bool "$cfg" 'ipv4_only' '-4'
++ append_bool "$cfg" 'ipv6_only' '-6'
++ append_bool "$cfg" 'no_dns' '-N'
++
++ append_parm "$cfg" 'multicast_address' '-m'
++ append_parm "$cfg" 'port' '-p'
++ append_parm "$cfg" 'lease_time' '-t'
++ append_parm "$cfg" 'debug' '-d'
++ append_parm "$cfg" 'conf_file' '-c'
++ append_parm "$cfg" 'script' '-s'
++}
++
++start() {
++ mkdir -p /var/lib
++ config_load ahcpd
++ unset args
++ unset interfaces
++ config_foreach ahcp_config ahcpd
++ config_foreach ahcp_server ahcpd
++ [ -z "$interfaces" ] && return 0
++ eval "service_start /usr/sbin/ahcpd -D $args $interfaces"
++}
++
++stop() {
++ service_stop /usr/sbin/ahcpd
++}
++
++status() {
++ SERVICE_SIG="USR1" service_signal /usr/sbin/ahcpd
++}
+diff --git a/feeds/routing/alfred/Config.in b/feeds/routing/alfred/Config.in
+new file mode 100644
+index 0000000..97f9ea2
+--- /dev/null
++++ b/feeds/routing/alfred/Config.in
+@@ -0,0 +1,22 @@
++config ALFRED_NEEDS_lua
++ bool
++
++config ALFRED_NEEDS_libgps
++ bool
++
++config PACKAGE_ALFRED_VIS
++ bool "enable vis server for alfred"
++ depends on PACKAGE_alfred
++ default y
++
++config PACKAGE_ALFRED_BATHOSTS
++ bool "enable autogeneration of /etc/bat-hosts"
++ depends on PACKAGE_alfred
++ select ALFRED_NEEDS_lua
++ default n
++
++config PACKAGE_ALFRED_GPSD
++ bool "enable gpsd service for alfred"
++ depends on PACKAGE_alfred
++ select ALFRED_NEEDS_libgps
++ default n
+diff --git a/feeds/routing/alfred/Makefile b/feeds/routing/alfred/Makefile
+new file mode 100644
+index 0000000..8f49b5a
+--- /dev/null
++++ b/feeds/routing/alfred/Makefile
+@@ -0,0 +1,87 @@
++#
++# Copyright (C) 2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++#
++# The latest alfred git hash in PKG_REV can be obtained from http://git.open-mesh.org/alfred.git
++#
++PKG_NAME:=alfred
++PKG_VERSION:=2015.1
++PKG_RELEASE:=0
++PKG_MD5SUM:=fcce70cd8da764ee91c8cd2cbfa14362
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
++PKG_LICENSE:=GPL-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++init-y := alfred
++
++define Package/alfred
++ URL:=http://www.open-mesh.org/
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=A.L.F.R.E.D. - Almighty Lightweight Fact Remote Exchange Daemon
++ DEPENDS:= +libc +kmod-ipv6 +librt \
++ +ALFRED_NEEDS_lua:lua \
++ +ALFRED_NEEDS_libgps:libgps
++endef
++
++define Package/alfred/description
++alfred is a user space daemon for distributing arbitrary local information over
++the mesh/network in a decentralized fashion. This data can be anything which
++appears to be useful - originally designed to replace the batman-adv
++visualization (vis), you may distribute hostnames, phone books, administration
++information, DNS information, the local weather forecast ...
++
++alfred runs as daemon in the background of the system. A user may insert
++information by using the alfred binary on the command line, or use special
++programs to communicate with alfred (done via unix sockets). alfred then takes
++care of distributing the local information to other alfred servers on other
++nodes. This is done via IPv6 link-local multicast, and does not require any
++configuration. A user can request data from alfred, and will receive the
++information available from all alfred servers in the network.
++endef
++
++define Package/alfred/conffiles
++/etc/config/alfred
++endef
++
++define Package/alfred/config
++ source "$(SOURCE)/Config.in"
++endef
++
++MAKE_ALFRED_FLAGS=\
++ CONFIG_ALFRED_VIS=$(if $(CONFIG_PACKAGE_ALFRED_VIS),y,n) \
++ CONFIG_ALFRED_GPSD=$(if $(CONFIG_PACKAGE_ALFRED_GPSD),y,n) \
++ CONFIG_ALFRED_CAPABILITIES=n
++
++TARGET_CFLAGS += -ffunction-sections -fdata-sections -flto
++TARGET_LDFLAGS += -Wl,--gc-sections -fuse-linker-plugin
++
++define Build/Compile
++ CFLAGS="$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_FLAGS) $(MAKE_ALFRED_FLAGS) all
++endef
++
++define Package/alfred/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ cp -fpR $(PKG_BUILD_DIR)/alfred $(1)/usr/sbin/
++ [ "x$(CONFIG_PACKAGE_ALFRED_VIS)" == "xy" ] && cp -fpR $(PKG_BUILD_DIR)/vis/batadv-vis $(1)/usr/sbin/ ; true
++ [ "x$(CONFIG_PACKAGE_ALFRED_GPSD)" == "xy" ] && cp -fpR $(PKG_BUILD_DIR)/gpsd/alfred-gpsd $(1)/usr/sbin/ ; true
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/alfred.init $(1)/etc/init.d/alfred
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/alfred.config $(1)/etc/config/alfred
++ $(INSTALL_DIR) $(1)/etc/alfred
++ [ "x$(CONFIG_PACKAGE_ALFRED_BATHOSTS)" == "xy" ] && $(INSTALL_BIN) ./files/bat-hosts.lua $(1)/etc/alfred/bat-hosts.lua ; true
++endef
++
++$(eval $(call BuildPackage,alfred))
+diff --git a/feeds/routing/alfred/files/alfred.config b/feeds/routing/alfred/files/alfred.config
+new file mode 100644
+index 0000000..9d3fff6
+--- /dev/null
++++ b/feeds/routing/alfred/files/alfred.config
+@@ -0,0 +1,8 @@
++config 'alfred' 'alfred'
++ option interface 'br-lan'
++ option mode 'master'
++ option batmanif 'bat0'
++ option start_vis '1'
++ option run_facters '1'
++# REMOVE THIS LINE TO ENABLE ALFRED
++ option disabled '1'
+diff --git a/feeds/routing/alfred/files/alfred.init b/feeds/routing/alfred/files/alfred.init
+new file mode 100755
+index 0000000..5ce06c0
+--- /dev/null
++++ b/feeds/routing/alfred/files/alfred.init
+@@ -0,0 +1,118 @@
++#!/bin/sh /etc/rc.common
++
++#
++# Copyright (C) 2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++START=99
++STOP=99
++alfred_args=""
++vis_args=""
++facters_dir="/etc/alfred"
++pid_file_alfred="/var/run/alfred.pid"
++pid_file_vis="/var/run/batadv-vis.pid"
++enable=0
++vis_enable=0
++SERVICE_DAEMONIZE=1
++SERVICE_WRITE_PID=1
++
++wait_for_dir()
++{
++ local ifce="$1" dir="$2"
++
++ if ! [ -d "$dir" ] ; then
++ timeout=30
++ echo "${initscript}: waiting $timeout secs for $ifce interface..."
++ for i in $(seq $timeout); do
++ sleep 1
++ [ -d "$dir" ] && break
++ if [ $i == $timeout ] ; then
++ echo "${initscript}: $ifce not detected, alfred not starting."
++ exit 1
++ fi
++ done
++ fi
++}
++
++alfred_start()
++{
++ local args=""
++ local section="$1"
++ local disabled interface mode
++
++ # check if section is disabled
++ config_get_bool disabled "$section" disabled 0
++ [ $disabled = 0 ] || return 1
++
++ args=""
++
++ config_get interface "$section" interface
++ append args "-i $interface"
++
++ config_get mode "$section" mode
++ [ "$mode" = "master" ] && append args "-m"
++
++ config_get batmanif "$section" batmanif
++ append args "-b $batmanif"
++
++ if [ "$batmanif" != "none" ]; then
++ wait_for_dir "$batmanif" "/sys/class/net/$batmanif/mesh"
++ fi
++
++ wait_for_dir "$interface" "/sys/class/net/$interface/"
++
++ append alfred_args "$args"
++ enable=1
++
++ config_get_bool start_vis "$section" start_vis 0
++ if [ "$start_vis" = 1 ] && [ -x /usr/sbin/batadv-vis ]; then
++ vis_enable=1
++ append vis_args "-i $batmanif -s"
++ fi
++
++ config_get_bool run_facters "$section" run_facters 0
++
++ return 0
++}
++
++start()
++{
++ config_load "alfred"
++ config_foreach alfred_start alfred
++
++ if [ "$enable" = "0" ]; then
++ exit 0
++ fi
++
++ echo "${initscript}: starting alfred"
++ SERVICE_PID_FILE="$pid_file_alfred"
++ service_start /usr/sbin/alfred ${alfred_args}
++
++ if [ "$vis_enable" = "1" ]; then
++ echo "${initscript}: starting batadv-vis"
++ SERVICE_PID_FILE="$pid_file_vis"
++ service_start /usr/sbin/batadv-vis ${vis_args}
++ fi
++
++ if [ "$run_facters" = "1" ]; then
++ ( for file in $facters_dir/* ; do [ -x $file ] && $file ; done )
++ if ! ( grep -q "for file in $facters_dir/\* ; do " /etc/crontabs/root 2>/dev/null ) ; then
++ echo "*/5 * * * * ( for file in $facters_dir/* ; do [ -x \$file ] && \$file ; done )" >> /etc/crontabs/root
++ /etc/init.d/cron enable
++ /etc/init.d/cron restart
++ fi
++ fi
++}
++
++stop()
++{
++ SERVICE_PID_FILE="$pid_file_alfred"
++ service_stop /usr/sbin/alfred
++ SERVICE_PID_FILE="$pid_file_vis"
++ [ -x /usr/sbin/batadv-vis ] && service_stop /usr/sbin/batadv-vis
++ sed "\|for file in $facters_dir/\* ; do |d" -i /etc/crontabs/root
++ /etc/init.d/cron restart
++}
+diff --git a/feeds/routing/alfred/files/bat-hosts.lua b/feeds/routing/alfred/files/bat-hosts.lua
+new file mode 100644
+index 0000000..8648caf
+--- /dev/null
++++ b/feeds/routing/alfred/files/bat-hosts.lua
+@@ -0,0 +1,107 @@
++#!/usr/bin/lua
++
++local type_id = 64 -- bat-hosts
++
++function get_hostname()
++ local hostfile = io.open("/proc/sys/kernel/hostname", "r")
++ local ret_string = hostfile:read()
++ hostfile:close()
++ return ret_string
++end
++
++function get_interfaces_names()
++ local ret = {}
++
++ for name in io.popen("ls -1 /sys/class/net/"):lines() do
++ table.insert(ret, name)
++ end
++
++ return ret
++end
++
++function get_interface_address(name)
++ local addressfile = io.open("/sys/class/net/"..name.."/address", "r")
++ local ret_string = addressfile:read()
++ addressfile:close()
++ return ret_string
++end
++
++
++local function generate_bat_hosts()
++-- get hostname and interface macs/names
++-- then return a table containing valid bat-hosts lines
++ local n, i
++ local ifaces, ret = {}, {}
++
++ local hostname = get_hostname()
++
++ for n, i in ipairs(get_interfaces_names()) do
++ local address = get_interface_address(i)
++ if not ifaces[address] then ifaces[address] = i end
++ end
++
++ for mac, iname in pairs(ifaces) do
++ if mac:match("^%x%x:%x%x:%x%x:%x%x:%x%x:%x%x$") and not mac:match("00:00:00:00:00:00") then
++ table.insert(ret, mac.." "..hostname.."_"..iname.."\n")
++ end
++ end
++
++ return ret
++end
++
++local function publish_bat_hosts()
++-- pass a raw chunk of data to alfred
++ local fd = io.popen("alfred -s " .. type_id, "w")
++ if fd then
++ local ret = generate_bat_hosts()
++ if ret then
++ fd:write(table.concat(ret))
++ end
++ fd:close()
++ end
++end
++
++local function write_bat_hosts(rows)
++ local content = { "### /tmp/bat-hosts generated by alfred-bat-hosts\n",
++ "### /!\\ This file is overwritten every 5 minutes /!\\\n",
++ "### (To keep manual changes, replace /etc/bat-hosts symlink with a static file)\n" }
++
++ -- merge the chunks from all nodes, de-escaping newlines
++ for _, row in ipairs(rows) do
++ local node, value = unpack(row)
++ table.insert(content, "# Node ".. node .. "\n")
++ table.insert(content, value:gsub("\x0a", "\n") .. "\n")
++ end
++
++ -- write parsed content down to disk
++ local fd = io.open("/tmp/bat-hosts", "w")
++ if fd then
++ fd:write(table.concat(content))
++ fd:close()
++ end
++
++ -- try to make a symlink in /etc pointing to /tmp,
++ -- if it exists, ln will do nothing.
++ os.execute("ln -ns /tmp/bat-hosts /etc/bat-hosts 2>/dev/null")
++end
++
++local function receive_bat_hosts()
++-- read raw chunks from alfred, convert them to a nested table and call write_bat_hosts
++ local fd = io.popen("alfred -r " .. type_id)
++ --[[ this command returns something like
++ { "54:e6:fc:b9:cb:37", "00:11:22:33:44:55 ham_wlan0\x0a00:22:33:22:33:22 ham_eth0\x0a" },
++ { "90:f6:52:bb:ec:57", "00:22:33:22:33:23 spam\x0a" },
++ ]]--
++
++ if fd then
++ local output = fd:read("*a")
++ if output then
++ assert(loadstring("rows = {" .. output .. "}"))()
++ write_bat_hosts(rows)
++ end
++ fd:close()
++ end
++end
++
++publish_bat_hosts()
++receive_bat_hosts()
+diff --git a/feeds/routing/babel-pinger/Makefile b/feeds/routing/babel-pinger/Makefile
+new file mode 100644
+index 0000000..40e7b1a
+--- /dev/null
++++ b/feeds/routing/babel-pinger/Makefile
+@@ -0,0 +1,41 @@
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=babel-pinger
++PKG_VERSION:=0.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/files/
++PKG_MD5SUM:=40d4931986913f5f8d9b5b70abf6fda5
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/babel-pinger
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE:=Babel-pinger
++ URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/babel/
++ MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
++ DEPENDS:=+librt
++endef
++
++define Package/babel-pinger/description
++ Babel-pinger is a hack to export a default route into Babel for people
++ using DHCP to configure their routers rather than speaking to their
++ upstream provider with a proper routing protocol.
++endef
++
++MAKE_FLAGS+= \
++ CFLAGS="$(TARGET_CFLAGS)" \
++
++define Package/babel-pinger/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/babel-pinger $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,babel-pinger))
+diff --git a/feeds/routing/babeld/Makefile b/feeds/routing/babeld/Makefile
+new file mode 100644
+index 0000000..ec1d247
+--- /dev/null
++++ b/feeds/routing/babeld/Makefile
+@@ -0,0 +1,61 @@
++#
++# Copyright (C) 2007-2009 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=babeld
++PKG_VERSION:=1.6.1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/files/
++PKG_MD5SUM:=74290f6c3678f314c79bdc0ab99d9f22
++PKG_LICENSE:=MIT
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/babeld
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE:=A loop-free distance-vector routing protocol
++ URL:=http://www.pps.univ-paris-diderot.fr/~jch/software/babel/
++ MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
++ DEPENDS:=+kmod-ipv6
++endef
++
++define Package/babeld/description
++ Babel is a loop-avoiding distance-vector routing protocol roughly based
++ on DSDV and AODV, but with provisions for link cost estimation and
++ redistribution of routes from other routing protocols.
++ While it is optimised for wireless mesh networks, Babel will also work
++ efficiently on wired networks. It will generate between 1.2 and 2.4 times
++ the amount of routing traffic that RIPng would generate, while
++ never counting to infinity.
++endef
++
++define Package/babeld/conffiles
++/etc/babeld.conf
++/etc/config/babeld
++endef
++
++MAKE_FLAGS+= \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LDLIBS="" \
++
++define Package/babeld/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/babeld $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) ./files/babeld.conf $(1)/etc/
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/babeld.config $(1)/etc/config/babeld
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/babeld.init $(1)/etc/init.d/babeld
++endef
++
++$(eval $(call BuildPackage,babeld))
+diff --git a/feeds/routing/babeld/files/babeld.conf b/feeds/routing/babeld/files/babeld.conf
+new file mode 100644
+index 0000000..746139d
+--- /dev/null
++++ b/feeds/routing/babeld/files/babeld.conf
+@@ -0,0 +1,38 @@
++# babel config file
++#
++# This config file simply documents sample entries.
++# "redistribute" means: redistribute routes from other routing protocols
++# into babel. "local" means addresses assigned to local interfaces.
++#
++# You do not need to edit this file: you can use /etc/config/babeld
++# instead (sections "interface" and "filter"). Both files can be used
++# simultaneously (the rules of this file are executed first).
++
++# the default rules are:
++#
++## redistribute local
++## redistribute deny
++#
++# this says, redistribute local addresses but no other routes
++
++
++# redistribute IPv4 default route into babel
++## redistribute local ip 0.0.0.0/0 le 0 metric 128
++
++# same but for IPv6
++## redistribute local ip ::/0 le 0 metric 128
++
++
++# don't redistribute all local addresses, only selected ones
++# after the first line, the "deny" rules kicks in. After the "deny"
++# no redistribute local rules are going to match
++## redistribute local ip 192.160.4.0/24
++## redistribute local deny
++
++
++# Babel refuses to redistribute routes with a protocol number of "boot";
++# this is standard practice, and means that you cannot easily
++# redistribute the default route installed by dhcp. It is however
++# possible to redistribute such route by explicitly specifying "proto 3"
++# on the redistribute line.
++## redistribute ip 0.0.0.0/0 le 0 proto 3 metric 128
+diff --git a/feeds/routing/babeld/files/babeld.config b/feeds/routing/babeld/files/babeld.config
+new file mode 100644
+index 0000000..0073f73
+--- /dev/null
++++ b/feeds/routing/babeld/files/babeld.config
+@@ -0,0 +1,75 @@
++package babeld
++
++# Babeld reads options from the following files (the last one takes precedence
++# if an option is defined in several places):
++# - the file defined by the option conf_file (default: /etc/babeld.conf),
++# - *.conf files in the directory defined by conf_dir (default: /tmp/babel.d/),
++# - this UCI configuration file.
++
++# See "man babeld" for all available options ("Global options").
++# Important: remember to use '_' instead of '-' in option names.
++config general
++ # option 'random_id' 'true'
++ # option 'debug' '1'
++ # option 'local_port' '33123'
++ # option 'log_file' '/var/log/babeld.log'
++ ## Enable ipv6-subtrees by default since OpenWrt should ship with a
++ ## recent enough kernel for it to work.
++ option 'ipv6_subtrees' 'true'
++ # list 'import_table' '42'
++ # list 'import_table' '100'
++ ## Alternative configuration file and directory.
++ ## See comment at the top of this file for more details.
++ # option 'conf_file' '/etc/babeld.conf'
++ # option 'conf_dir' '/tmp/babel.d/'
++
++config interface
++ ## Remove this line to enable babeld on this interface
++ option 'ignore' 'true'
++ ## You can use aliases (like lan, wlan) or real names (like eth0.0).
++ ## If you use an alias, it must be already defined when babeld starts.
++ ## Otherwise, the name is taken literally and the interface can be
++ ## brought up later (useful for tunnels for instance).
++ option 'ifname' 'wlan'
++ ## You can set options, see babeld man page ("Interface configuration")
++ # option 'rxcost' '256'
++ # option 'hello_interval' '1'
++
++config interface
++ option 'ignore' 'true'
++ ## Physical interface name
++ option 'ifname' 'tun-example'
++ # option 'max_rtt_penalty' '90'
++
++# A config interface without "option ifname" will set default options
++# for all interfaces. Interface-specific configuration always overrides
++# default configuration.
++config interface
++ # option 'enable_timestamps' 'true'
++ # option 'update_interval' '30'
++
++
++# A filter consists of a type ('in', 'out' or 'redistribute'), an action
++# ('allow', 'deny' or 'metric xxx') and a set of selectors ('ip', 'eq',
++# etc.). See babeld man page ("Filtering rules") for more details.
++# Here is a sample filter wich redistributes the default route if its
++# protocol number is "boot", e.g. when it installed by dhcp. It is
++# disabled by default.
++config filter
++ option 'ignore' 'true'
++ # Type
++ option 'type' 'redistribute'
++ # Selectors: ip, eq, le, ge, src_ip, src_eq, src_le, src_ge, neigh, id,
++ # proto, local, if.
++ option 'ip' '0.0.0.0/0'
++ option 'eq' '0'
++ option 'proto' '3'
++ # Action (one of: allow, deny, metric XXX, src-prefix XXX).
++ option 'action' 'metric 128'
++
++# Notice that the 'local' selector is a boolean.
++config filter
++ option 'ignore' 'true'
++ option 'type' 'redistribute'
++ option 'local' 'true'
++ # No action means "allow"
+diff --git a/feeds/routing/babeld/files/babeld.init b/feeds/routing/babeld/files/babeld.init
+new file mode 100755
+index 0000000..21ae4be
+--- /dev/null
++++ b/feeds/routing/babeld/files/babeld.init
+@@ -0,0 +1,260 @@
++#!/bin/sh /etc/rc.common
++
++. $IPKG_INSTROOT/lib/functions/network.sh
++
++START=70
++
++pidfile='/var/run/babeld.pid'
++CONFIGFILE='/var/etc/babeld.conf'
++OTHERCONFIGFILE="/etc/babeld.conf"
++OTHERCONFIGDIR="/tmp/babeld.d/"
++EXTRA_COMMANDS="status"
++EXTRA_HELP=" status Dump Babel's table to the log file."
++
++# Options to ignore for the global section (old options that are translated
++# for backward compatibility with old configuration files)
++ignored_options="carrier_sense assume_wireless no_split_horizon random_router_id multicast_address port hello_interval wired_hello_interval smoothing_half_time duplication_priority local_server conf_file conf_dir"
++
++# Append a line to the configuration file
++cfg_append() {
++ local value="$1"
++ echo "$value" >> $CONFIGFILE
++}
++
++cfg_append_option() {
++ local section="$1"
++ local option="$2"
++ local value
++ config_get value "$section" "$option"
++ # babeld convention for options is '-', not '_'
++ [ -n "$value" ] && cfg_append "${option//_/-} $value"
++}
++
++# Append to the "$buffer" variable
++append_ifname() {
++ local section="$1"
++ local option="$2"
++ local switch="$3"
++ local _name
++ config_get _name "$section" "$option"
++ [ -z "$_name" ] && return 0
++ local ifname=$(uci_get_state network "$_name" ifname "$_name")
++ append buffer "$switch $ifname"
++}
++
++append_bool() {
++ local section="$1"
++ local option="$2"
++ local value="$3"
++ local _loctmp
++ config_get_bool _loctmp "$section" "$option" 0
++ [ "$_loctmp" -gt 0 ] && append buffer "$value"
++}
++
++append_parm() {
++ local section="$1"
++ local option="$2"
++ local switch="$3"
++ local _loctmp
++ config_get _loctmp "$section" "$option"
++ [ -z "$_loctmp" ] && return 0
++ append buffer "$switch $_loctmp"
++}
++
++
++# Provides backward compatibility for old option names in the global section.
++translate_option() {
++ local section="$1"
++ local old_option="$2"
++ local new_option="$3"
++ local _value
++ config_get _value "$section" "$old_option"
++ [ -z "$_value" ] && return
++ cfg_append "${new_option//_/-} $_value"
++}
++
++translate_bool() {
++ local section="$1"
++ local old_option="$2"
++ local new_option="$3"
++ local _bool
++ local _value
++ config_get_bool _bool "$section" "$old_option" 0
++ [ "$_bool" -eq 0 ] && return
++ cfg_append "${new_option//_/-} true"
++}
++
++# Adds a new interface section for setting default interface options.
++add_default_option() {
++ local option="$1"
++ local value="$2"
++ cfg_append "default ${option//_/-} $value"
++}
++
++# Global 'hello_interval' and 'wired_hello_interval' options are ignored,
++# because they have no direct equivalent: you should use
++# interface-specific settings.
++parse_old_global_options() {
++ local section="$1"
++ translate_bool "$section" 'carrier_sense' 'link_detect'
++ translate_bool "$section" 'random_router_id' 'random_id'
++ translate_option "$section" 'multicast_address' 'protocol_group'
++ translate_option "$section" 'port' 'protocol_port'
++ translate_option "$section" 'local_server' 'local_port'
++ translate_option "$section" 'smoothing_half_time' 'smoothing_half_life'
++ translate_option "$section" 'duplication_priority' 'allow_duplicates'
++ # These two global options are turned into default interface options.
++ local _bool
++ config_get_bool _bool "$section" 'assume_wireless' 0
++ [ "$_bool" -eq 1 ] && add_default_option "wired" "false"
++ config_get_bool _bool "$section" 'no_split_horizon' 0
++ [ "$_bool" -eq 1 ] && add_default_option "split_horizon" "false"
++ # Configure alternative configuration file and directory
++ local conf_file
++ config_get conf_file "$section" "conf_file"
++ [ -n "$conf_file" ] && OTHERCONFIGFILE="$conf_file"
++ local conf_dir
++ config_get conf_dir "$section" "conf_dir"
++ [ -n "$conf_dir" ] && OTHERCONFIGDIR="$conf_dir"
++}
++
++babel_filter() {
++ local cfg="$1"
++ local _loctmp
++
++ local _ignored
++ config_get_bool _ignored "$cfg" 'ignore' 0
++ [ "$_ignored" -eq 1 ] && return 0
++
++ unset buffer
++ append_parm "$cfg" 'type' ''
++
++ append_bool "$cfg" 'local' 'local'
++
++ append_parm "$cfg" 'ip' 'ip'
++ append_parm "$cfg" 'eq' 'eq'
++ append_parm "$cfg" 'le' 'le'
++ append_parm "$cfg" 'ge' 'ge'
++ append_parm "$cfg" 'src_ip' 'src-ip'
++ append_parm "$cfg" 'src_eq' 'src-eq'
++ append_parm "$cfg" 'src_le' 'src-le'
++ append_parm "$cfg" 'src_ge' 'src-ge'
++ append_parm "$cfg" 'neigh' 'neigh'
++ append_parm "$cfg" 'id' 'id'
++ append_parm "$cfg" 'proto' 'proto'
++
++ append_ifname "$cfg" 'if' 'if'
++
++ append_parm "$cfg" 'action' ''
++
++ cfg_append "$buffer"
++}
++
++# Only one of babeld's options is allowed multiple times, "import-table".
++# We just append it multiple times.
++list_cb() {
++ option_cb "$@"
++}
++
++babel_config_cb() {
++ local type="$1"
++ local section="$2"
++ case "$type" in
++ "general")
++ option_cb() {
++ local option="$1"
++ local value="$2"
++ # Ignore old options
++ list_contains ignored_options "$option" && return
++ # Skip lists. They will be taken care of by list_cb
++ test "${option#*_ITEM}" != "$option" && return
++ test "${option#*_LENGTH}" != "$option" && return
++ cfg_append "${option//_/-} $value"
++ }
++ ;;
++ "interface")
++ local _ifname
++ config_get _ifname "$section" 'ifname'
++ # Backward compatibility: try to use the section name
++ # if no "option ifname" was used.
++ [ -z "$_ifname" -a "${section:0:3}" != "cfg" ] && _ifname="$section"
++ # Try to resolve the logical interface name
++ unset interface
++ network_get_device interface "$_ifname" || interface="$_ifname"
++ option_cb() {
++ local option="$1"
++ local value="$2"
++ local _interface
++ # "option ifname" is a special option, don't actually
++ # generate configuration for it.
++ [ "$option" = "ifname" ] && return
++ [ -n "$interface" ] && _interface="interface $interface" || _interface="default"
++ cfg_append "$_interface ${option//_/-} $value"
++ }
++ # Handle ignore options.
++ local _ignored
++ # This works because we loaded the whole configuration
++ # beforehand (see config_load below).
++ config_get_bool _ignored "$section" 'ignore' 0
++ if [ "$_ignored" -eq 1 ]
++ then
++ option_cb() { return; }
++ else
++ # Also include an empty "interface $interface" statement,
++ # so that babeld operates on this interface.
++ [ -n "$interface" ] && cfg_append "interface $interface"
++ fi
++ ;;
++ *)
++ # Don't use reset_cb, this would also reset config_cb
++ option_cb() { return; }
++ ;;
++ esac
++}
++
++start() {
++ mkdir -p /var/lib
++ mkdir -p /var/etc
++ mkdir -p $OTHERCONFIGDIR
++
++ # Start by emptying the generated config file
++ >"$CONFIGFILE"
++ # Import dynamic config files
++ for f in $OTHERCONFIGDIR/*.conf; do
++ [ -f "$f" ] && cat $f >> $CONFIGFILE
++ done
++ # First load the whole config file, without callbacks, so that we are
++ # aware of all "ignore" options in the second pass.
++ config_load babeld
++ # Parse general and interface sections thanks to the "config_cb()"
++ # callback. This allows to loop over all options without having to
++ # know their name in advance.
++ config_cb() { babel_config_cb "$@"; }
++ config_load babeld
++ # Backward compatibility
++ config_foreach parse_old_global_options general
++ # Parse filters separately, since we know which options we expect
++ config_foreach babel_filter filter
++ # Using multiple config files is supported since babeld 1.5.1
++ /usr/sbin/babeld -D -I "$pidfile" -c "$OTHERCONFIGFILE" -c "$CONFIGFILE"
++ # Wait for the pidfile to appear
++ for i in 1 2
++ do
++ [ -f "$pidfile" ] || sleep 1
++ done
++ [ -f "$pidfile" ] || (echo "Failed to start babeld"; exit 42)
++}
++
++stop() {
++ [ -f "$pidfile" ] && kill $(cat $pidfile)
++ # avoid race-condition on restart: wait for
++ # babeld to die for real.
++ [ -f "$pidfile" ] && sleep 1
++ [ -f "$pidfile" ] && sleep 1
++ [ -f "$pidfile" ] && sleep 1
++ [ -f "$pidfile" ] && exit 42
++}
++
++status() {
++ [ -f "$pidfile" ] && kill -USR1 $(cat $pidfile)
++}
+diff --git a/feeds/routing/batctl/Makefile b/feeds/routing/batctl/Makefile
+new file mode 100644
+index 0000000..8cf2d17
+--- /dev/null
++++ b/feeds/routing/batctl/Makefile
+@@ -0,0 +1,80 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=batctl
++
++PKG_VERSION:=2015.1
++PKG_RELEASE:=1
++PKG_MD5SUM:=3db00af0b3cf55136babe06aa666e15f
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
++PKG_LICENSE:=GPL-2.0
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/batctl
++ URL:=http://www.open-mesh.org/
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+kmod-batman-adv +libnl-tiny +libc
++ TITLE:=B.A.T.M.A.N. Advanced user space configuration tool batctl
++ MAINTAINER:=Marek Lindner <mareklindner@neomailbox.ch>
++endef
++
++define Package/batctl/description
++batctl is a more intuitive managment utility for B.A.T.M.A.N.-Advanced.
++It is an easier method for configuring batman-adv and provides some
++additional tools for debugging as well. This package builds
++version $(PKG_VERSION) of the user space utility.
++endef
++
++# The linker can identify unused sections of a binary when each symbol is stored
++# in a separate section. This mostly removes unused linker sections and reduces
++# the size by ~3% on mipsel.
++
++TARGET_CFLAGS += -ffunction-sections -fdata-sections
++TARGET_LDFLAGS += -Wl,--gc-sections
++
++# Link-time optimization allows to move parts of the optimization from the single
++# source file to the global source view. This is done by emitting the GIMPLE
++# representation in each object file and analyzing it again during the link step.
++
++TARGET_CFLAGS += -flto
++TARGET_LDFLAGS += -fuse-linker-plugin
++
++MAKE_BATCTL_ENV += \
++ CPPFLAGS="$(TARGET_CPPFLAGS)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ LIBNL_NAME="libnl-tiny"
++
++MAKE_BATCTL_ARGS += \
++ REVISION="$(PKG_BATCTL_SHORTREV)" \
++ CC="$(TARGET_CC)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ batctl install
++
++
++define Build/Compile
++ $(MAKE_BATCTL_ENV) $(MAKE) -C "$(PKG_BUILD_DIR)" $(MAKE_BATCTL_ARGS)
++endef
++
++define Build/Clean
++ rm -rf $(BUILD_DIR)/$(PKG_NAME)/
++endef
++
++define Package/batctl/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/batctl $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,batctl))
+diff --git a/feeds/routing/batman-adv/Config.in b/feeds/routing/batman-adv/Config.in
+new file mode 100644
+index 0000000..86fc795
+--- /dev/null
++++ b/feeds/routing/batman-adv/Config.in
+@@ -0,0 +1,26 @@
++
++config KMOD_BATMAN_ADV_DEBUG_LOG
++ bool "enable verbose debug logging"
++ depends on PACKAGE_kmod-batman-adv
++ default n
++
++config KMOD_BATMAN_ADV_BLA
++ bool "enable bridge loop avoidance"
++ depends on PACKAGE_kmod-batman-adv
++ default y
++
++config KMOD_BATMAN_ADV_DAT
++ bool "enable distributed arp table"
++ depends on PACKAGE_kmod-batman-adv
++ default y
++
++config KMOD_BATMAN_ADV_MCAST
++ bool "enable multicast transmission optimization"
++ depends on PACKAGE_kmod-batman-adv
++ default y
++
++config KMOD_BATMAN_ADV_NC
++ bool "enable network coding [requires promisc mode support]"
++ depends on PACKAGE_kmod-batman-adv
++ default n
++
+diff --git a/feeds/routing/batman-adv/Makefile b/feeds/routing/batman-adv/Makefile
+new file mode 100644
+index 0000000..7e43de4
+--- /dev/null
++++ b/feeds/routing/batman-adv/Makefile
+@@ -0,0 +1,88 @@
++#
++# Copyright (C) 2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++# $Id: Makefile 5624 2006-11-23 00:29:07Z nbd $
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=batman-adv
++
++PKG_VERSION:=2015.1
++PKG_RELEASE:=1
++PKG_MD5SUM:=45f98d315b4290dc208e01190193c514
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
++PKG_LICENSE:=GPL-2.0
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++define KernelPackage/batman-adv
++ URL:=http://www.open-mesh.org/
++ MAINTAINER:=Marek Lindner <mareklindner@neomailbox.ch>
++ SUBMENU:=Network Support
++ DEPENDS:=+KMOD_BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-crypto-core +kmod-crypto-crc32c +kmod-lib-crc32c
++ TITLE:=B.A.T.M.A.N. Adv
++ FILES:=$(PKG_BUILD_DIR)/net/batman-adv/batman-adv.$(LINUX_KMOD_SUFFIX)
++ AUTOLOAD:=$(call AutoLoad,50,batman-adv)
++endef
++
++define KernelPackage/batman-adv/description
++B.A.T.M.A.N. advanced is a kernel module which allows to
++build layer 2 mesh networks. This package builds
++version $(PKG_VERSION) of the kernel module.
++endef
++
++define KernelPackage/batman-adv/config
++ source "$(SOURCE)/Config.in"
++endef
++
++define Package/kmod-batman-adv/conffiles
++/etc/config/batman-adv
++endef
++
++MAKE_BATMAN_ADV_ARGS += \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ KERNELPATH="$(LINUX_DIR)" \
++ ARCH="$(LINUX_KARCH)" \
++ PATH="$(TARGET_PATH)" \
++ SUBDIRS="$(PKG_BUILD_DIR)" \
++ PWD="$(PKG_BUILD_DIR)" \
++ LINUX_VERSION="$(LINUX_VERSION)" \
++ CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_KMOD_BATMAN_ADV_DEBUG_LOG),y,n) \
++ CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_KMOD_BATMAN_ADV_BLA),y,n) \
++ CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_KMOD_BATMAN_ADV_DAT),y,n) \
++ CONFIG_BATMAN_ADV_MCAST=$(if $(CONFIG_KMOD_BATMAN_ADV_MCAST),y,n) \
++ CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_KMOD_BATMAN_ADV_NC),y,n) \
++ REVISION="" all
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ $(SED) '/#define _NET_BATMAN_ADV_MAIN_H_/a\#undef CONFIG_MODULE_STRIPPED' \
++ $(PKG_BUILD_DIR)/net/batman-adv/main.h
++endef
++
++define Build/Compile
++ $(MAKE) -C "$(PKG_BUILD_DIR)" $(MAKE_BATMAN_ADV_ARGS)
++endef
++
++define Build/Clean
++ rm -rf $(BUILD_DIR)/$(PKG_NAME)/
++endef
++
++define KernelPackage/batman-adv/install
++ $(INSTALL_DIR) $(1)/etc/config $(1)/etc/hotplug.d/net $(1)/etc/hotplug.d/iface $(1)/lib/batman-adv $(1)/usr/sbin $(1)/lib/netifd/proto
++ $(INSTALL_DATA) ./files/etc/config/batman-adv $(1)/etc/config
++ $(INSTALL_DATA) ./files/lib/batman-adv/config.sh $(1)/lib/batman-adv
++ $(INSTALL_BIN) ./files/etc/hotplug.d/net/99-batman-adv $(1)/etc/hotplug.d/net
++ $(INSTALL_BIN) ./files/lib/netifd/proto/batadv.sh $(1)/lib/netifd/proto
++ $(INSTALL_BIN) ./files/lib/netifd/proto/batadv_vlan.sh $(1)/lib/netifd/proto
++endef
++
++$(eval $(call KernelPackage,batman-adv))
+diff --git a/feeds/routing/batman-adv/files/etc/config/batman-adv b/feeds/routing/batman-adv/files/etc/config/batman-adv
+new file mode 100644
+index 0000000..f38855e
+--- /dev/null
++++ b/feeds/routing/batman-adv/files/etc/config/batman-adv
+@@ -0,0 +1,22 @@
++
++config 'mesh' 'bat0'
++ option 'aggregated_ogms'
++ option 'ap_isolation'
++ option 'bonding'
++ option 'fragmentation'
++ option 'gw_bandwidth'
++ option 'gw_mode'
++ option 'gw_sel_class'
++ option 'log_level'
++ option 'orig_interval'
++ option 'vis_mode'
++ option 'bridge_loop_avoidance'
++ option 'distributed_arp_table'
++ option 'multicast_mode'
++ option 'network_coding'
++ option 'hop_penalty'
++ option 'isolation_mark'
++
++# yet another batX instance
++# config 'mesh' 'bat5'
++# option 'interfaces' 'second_mesh'
+diff --git a/feeds/routing/batman-adv/files/etc/hotplug.d/net/99-batman-adv b/feeds/routing/batman-adv/files/etc/hotplug.d/net/99-batman-adv
+new file mode 100644
+index 0000000..f0c391f
+--- /dev/null
++++ b/feeds/routing/batman-adv/files/etc/hotplug.d/net/99-batman-adv
+@@ -0,0 +1,12 @@
++#!/bin/sh
++
++. /lib/batman-adv/config.sh
++
++bat_load_module
++config_load batman-adv
++
++case "$ACTION" in
++ add)
++ [ -d /sys/class/net/$INTERFACE/mesh/ ] && bat_config "$INTERFACE"
++ ;;
++esac
+diff --git a/feeds/routing/batman-adv/files/lib/batman-adv/config.sh b/feeds/routing/batman-adv/files/lib/batman-adv/config.sh
+new file mode 100644
+index 0000000..1429a43
+--- /dev/null
++++ b/feeds/routing/batman-adv/files/lib/batman-adv/config.sh
+@@ -0,0 +1,53 @@
++#!/bin/sh
++
++bat_load_module()
++{
++ [ -d "/sys/module/batman_adv/" ] && return
++
++ . /lib/functions.sh
++ load_modules /etc/modules.d/*-crc16 /etc/modules.d/*-crypto* /etc/modules.d/*-lib-crc* /etc/modules.d/*-batman-adv*
++}
++
++bat_config()
++{
++ local mesh="$1"
++ local aggregated_ogms ap_isolation bonding bridge_loop_avoidance distributed_arp_table fragmentation
++ local gw_bandwidth gw_mode gw_sel_class isolation_mark hop_penalty multicast_mode network_coding log_level
++ local orig_interval vis_mode
++
++ config_get aggregated_ogms "$mesh" aggregated_ogms
++ config_get ap_isolation "$mesh" ap_isolation
++ config_get bonding "$mesh" bonding
++ config_get bridge_loop_avoidance "$mesh" bridge_loop_avoidance
++ config_get distributed_arp_table "$mesh" distributed_arp_table
++ config_get fragmentation "$mesh" fragmentation
++ config_get gw_bandwidth "$mesh" gw_bandwidth
++ config_get gw_mode "$mesh" gw_mode
++ config_get gw_sel_class "$mesh" gw_sel_class
++ config_get hop_penalty "$mesh" hop_penalty
++ config_get isolation_mark "$mesh" isolation_mark
++ config_get multicast_mode "$mesh" multicast_mode
++ config_get network_coding "$mesh" network_coding
++ config_get log_level "$mesh" log_level
++ config_get orig_interval "$mesh" orig_interval
++ config_get vis_mode "$mesh" vis_mode
++
++ [ ! -f "/sys/class/net/$mesh/mesh/orig_interval" ] && echo "batman-adv mesh $mesh does not exist - check your interface configuration" && return 1
++
++ [ -n "$aggregate_ogms" ] && echo $aggregate_ogms > /sys/class/net/$mesh/mesh/aggregate_ogms
++ [ -n "$ap_isolation" ] && echo $ap_isolation > /sys/class/net/$mesh/mesh/ap_isolation
++ [ -n "$bonding" ] && echo $bonding > /sys/class/net/$mesh/mesh/bonding
++ [ -n "$bridge_loop_avoidance" ] && echo $bridge_loop_avoidance > /sys/class/net/$mesh/mesh/bridge_loop_avoidance 2>&-
++ [ -n "$distributed_arp_table" ] && echo $distributed_arp_table > /sys/class/net/$mesh/mesh/distributed_arp_table 2>&-
++ [ -n "$fragmentation" ] && echo $fragmentation > /sys/class/net/$mesh/mesh/fragmentation
++ [ -n "$gw_bandwidth" ] && echo $gw_bandwidth > /sys/class/net/$mesh/mesh/gw_bandwidth
++ [ -n "$gw_mode" ] && echo $gw_mode > /sys/class/net/$mesh/mesh/gw_mode
++ [ -n "$gw_sel_class" ] && echo $gw_sel_class > /sys/class/net/$mesh/mesh/gw_sel_class
++ [ -n "$hop_penalty" ] && echo $hop_penalty > /sys/class/net/$mesh/mesh/hop_penalty
++ [ -n "$isolation_mark" ] && echo $isolation_mark > /sys/class/net/$mesh/mesh/isolation_mark
++ [ -n "$multicast_mode" ] && echo $multicast_mode > /sys/class/net/$mesh/mesh/multicast_mode 2>&-
++ [ -n "$network_coding" ] && echo $network_coding > /sys/class/net/$mesh/mesh/network_coding 2>&-
++ [ -n "$log_level" ] && echo $log_level > /sys/class/net/$mesh/mesh/log_level 2>&-
++ [ -n "$orig_interval" ] && echo $orig_interval > /sys/class/net/$mesh/mesh/orig_interval
++ [ -n "$vis_mode" ] && echo $vis_mode > /sys/class/net/$mesh/mesh/vis_mode
++}
+diff --git a/feeds/routing/batman-adv/files/lib/netifd/proto/batadv.sh b/feeds/routing/batman-adv/files/lib/netifd/proto/batadv.sh
+new file mode 100644
+index 0000000..632a209
+--- /dev/null
++++ b/feeds/routing/batman-adv/files/lib/netifd/proto/batadv.sh
+@@ -0,0 +1,30 @@
++#!/bin/sh
++
++. /lib/functions.sh
++. ../netifd-proto.sh
++init_proto "$@"
++
++proto_batadv_init_config() {
++ proto_config_add_string "mesh"
++}
++
++proto_batadv_setup() {
++ local config="$1"
++ local iface="$2"
++
++ local mesh
++ json_get_vars mesh
++
++ echo "$mesh" > "/sys/class/net/$iface/batman_adv/mesh_iface"
++ proto_init_update "$iface" 1
++ proto_send_update "$config"
++}
++
++proto_batadv_teardown() {
++ local config="$1"
++ local iface="$2"
++
++ echo "none" > "/sys/class/net/$iface/batman_adv/mesh_iface" || true
++}
++
++add_protocol batadv
+diff --git a/feeds/routing/batman-adv/files/lib/netifd/proto/batadv_vlan.sh b/feeds/routing/batman-adv/files/lib/netifd/proto/batadv_vlan.sh
+new file mode 100644
+index 0000000..85002c3
+--- /dev/null
++++ b/feeds/routing/batman-adv/files/lib/netifd/proto/batadv_vlan.sh
+@@ -0,0 +1,29 @@
++#!/bin/sh
++
++. /lib/functions.sh
++. ../netifd-proto.sh
++init_proto "$@"
++
++proto_batadv_vlan_init_config() {
++ proto_config_add_string "ap_isolation"
++}
++
++proto_batadv_vlan_setup() {
++ local config="$1"
++ local iface="$2"
++
++ # VLAN specific variables
++ local device="${iface%.*}"
++ local vid="${iface#*.}"
++
++ # batadv_vlan options
++ local ap_isolation
++
++ json_get_vars ap_isolation
++
++ echo "$ap_isolation" > "/sys/class/net/${device}/mesh/vlan${vid}/ap_isolation"
++ proto_init_update "$iface" 1
++ proto_send_update "$config"
++}
++
++add_protocol batadv_vlan
+diff --git a/feeds/routing/batman-adv/patches/0001-batman-adv-don-t-access-unregistered-net_device-obje.patch b/feeds/routing/batman-adv/patches/0001-batman-adv-don-t-access-unregistered-net_device-obje.patch
+new file mode 100644
+index 0000000..75da6fb
+--- /dev/null
++++ b/feeds/routing/batman-adv/patches/0001-batman-adv-don-t-access-unregistered-net_device-obje.patch
+@@ -0,0 +1,46 @@
++From 958aafba93c7e408237298c5b2c5d7c3e318402c Mon Sep 17 00:00:00 2001
++From: Antonio Quartulli <antonio@meshcoding.com>
++Date: Tue, 4 Aug 2015 22:26:19 +0200
++Subject: [PATCH 1/9] batman-adv: don't access unregistered net_device object
++
++In batadv_hardif_disable_interface() there is a call to
++batadv_softif_destroy_sysfs() which in turns invokes
++unregister_netdevice() on the soft_iface.
++After this point we cannot rely on the soft_iface object
++anymore because it might get free'd by the netdev periodic
++routine at any time.
++
++For this reason the netdev_upper_dev_unlink(.., soft_iface) call
++is moved before the invocation of batadv_softif_destroy_sysfs() so
++that we can be sure that the soft_iface object is still valid.
++
++Signed-off-by: Antonio Quartulli <antonio@meshcoding.com>
++Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
++---
++ net/batman-adv/hard-interface.c | 3 ++-
++ 1 file changed, 2 insertions(+), 1 deletion(-)
++
++diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
++index f4a15d2..0565b20 100644
++--- a/net/batman-adv/hard-interface.c
+++++ b/net/batman-adv/hard-interface.c
++@@ -528,6 +528,8 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
++ batadv_purge_outstanding_packets(bat_priv, hard_iface);
++ dev_put(hard_iface->soft_iface);
++
+++ netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface);
+++
++ /* nobody uses this interface anymore */
++ if (!bat_priv->num_ifaces) {
++ batadv_gw_check_client_stop(bat_priv);
++@@ -536,7 +538,6 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
++ batadv_softif_destroy_sysfs(hard_iface->soft_iface);
++ }
++
++- netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface);
++ hard_iface->soft_iface = NULL;
++ batadv_hardif_free_ref(hard_iface);
++
++--
++2.5.0
++
+diff --git a/feeds/routing/batman-adv/patches/0002-batman-adv-Add-lower-layer-needed_-head-tail-room-to.patch b/feeds/routing/batman-adv/patches/0002-batman-adv-Add-lower-layer-needed_-head-tail-room-to.patch
+new file mode 100644
+index 0000000..681c4b2
+--- /dev/null
++++ b/feeds/routing/batman-adv/patches/0002-batman-adv-Add-lower-layer-needed_-head-tail-room-to.patch
+@@ -0,0 +1,101 @@
++From e2b4301f4e2d3695ed2024880d2295223cb2f857 Mon Sep 17 00:00:00 2001
++From: Sven Eckelmann <sven@narfation.org>
++Date: Fri, 7 Aug 2015 19:28:42 +0200
++Subject: [PATCH 2/9] batman-adv: Add lower layer needed_(head|tail)room to own
++ ones
++
++The maximum of hard_header_len and maximum of all needed_(head|tail)room of
++all slave interfaces of a batman-adv device must be used to define the
++batman-adv device needed_(head|tail)room. This is required to avoid too
++small buffer problems when these slave devices try to send the encapsulated
++packet in a tx path without the possibility to resize the skbuff.
++
++Signed-off-by: Sven Eckelmann <sven@narfation.org>
++Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
++---
++ net/batman-adv/hard-interface.c | 41 +++++++++++++++++++++++++++++++++++++++++
++ net/batman-adv/soft-interface.c | 2 --
++ 2 files changed, 41 insertions(+), 2 deletions(-)
++
++diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
++index 0565b20..f11345e 100644
++--- a/net/batman-adv/hard-interface.c
+++++ b/net/batman-adv/hard-interface.c
++@@ -252,6 +252,44 @@ static void batadv_check_known_mac_addr(const struct net_device *net_dev)
++ rcu_read_unlock();
++ }
++
+++/**
+++ * batadv_hardif_recalc_extra_skbroom() - Recalculate skbuff extra head/tailroom
+++ * @soft_iface: netdev struct of the mesh interface
+++ */
+++static void batadv_hardif_recalc_extra_skbroom(struct net_device *soft_iface)
+++{
+++ const struct batadv_hard_iface *hard_iface;
+++ unsigned short lower_header_len = ETH_HLEN;
+++ unsigned short lower_headroom = 0;
+++ unsigned short lower_tailroom = 0;
+++ unsigned short needed_headroom;
+++
+++ rcu_read_lock();
+++ list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
+++ if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
+++ continue;
+++
+++ if (hard_iface->soft_iface != soft_iface)
+++ continue;
+++
+++ lower_header_len = max_t(unsigned short, lower_header_len,
+++ hard_iface->net_dev->hard_header_len);
+++
+++ lower_headroom = max_t(unsigned short, lower_headroom,
+++ hard_iface->net_dev->needed_headroom);
+++
+++ lower_tailroom = max_t(unsigned short, lower_tailroom,
+++ hard_iface->net_dev->needed_tailroom);
+++ }
+++ rcu_read_unlock();
+++
+++ needed_headroom = lower_headroom + (lower_header_len - ETH_HLEN);
+++ needed_headroom += batadv_max_header_len();
+++
+++ soft_iface->needed_headroom = needed_headroom;
+++ soft_iface->needed_tailroom = lower_tailroom;
+++}
+++
++ int batadv_hardif_min_mtu(struct net_device *soft_iface)
++ {
++ struct batadv_priv *bat_priv = netdev_priv(soft_iface);
++@@ -474,6 +512,8 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
++ "Not using interface %s (retrying later): interface not active\n",
++ hard_iface->net_dev->name);
++
+++ batadv_hardif_recalc_extra_skbroom(soft_iface);
+++
++ /* begin scheduling originator messages on that interface */
++ batadv_schedule_bat_ogm(hard_iface);
++
++@@ -529,6 +569,7 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
++ dev_put(hard_iface->soft_iface);
++
++ netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface);
+++ batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface);
++
++ /* nobody uses this interface anymore */
++ if (!bat_priv->num_ifaces) {
++diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
++index 51cda3a..10f6448 100644
++--- a/net/batman-adv/soft-interface.c
+++++ b/net/batman-adv/soft-interface.c
++@@ -947,8 +947,6 @@ static void batadv_softif_init_early(struct net_device *dev)
++ * have not been initialized yet
++ */
++ dev->mtu = ETH_DATA_LEN;
++- /* reserve more space in the skbuff for our header */
++- dev->hard_header_len = batadv_max_header_len();
++
++ /* generate random address */
++ eth_hw_addr_random(dev);
++--
++2.5.0
++
+diff --git a/feeds/routing/batman-adv/patches/0003-batman-adv-Fix-memory-leak-on-tt-add-with-invalid-vl.patch b/feeds/routing/batman-adv/patches/0003-batman-adv-Fix-memory-leak-on-tt-add-with-invalid-vl.patch
+new file mode 100644
+index 0000000..8fc5f64
+--- /dev/null
++++ b/feeds/routing/batman-adv/patches/0003-batman-adv-Fix-memory-leak-on-tt-add-with-invalid-vl.patch
+@@ -0,0 +1,43 @@
++From dba67bc80fbfe6a28fc3c1141cca1c556ab7e499 Mon Sep 17 00:00:00 2001
++From: Sven Eckelmann <sven@narfation.org>
++Date: Tue, 18 Aug 2015 13:37:01 +0200
++Subject: [PATCH 3/9] batman-adv: Fix memory leak on tt add with invalid vlan
++
++The object tt_local is allocated with kmalloc and not initialized when the
++function batadv_tt_local_add checks for the vlan. But this function can
++only cleanup the object when the (not yet initialized) reference counter of
++the object is 1. This is unlikely and thus the object would leak when the
++vlan could not be found.
++
++Instead the uninitialized object tt_local has to be freed manually and the
++pointer has to set to NULL to avoid calling the function which would try to
++decrement the reference counter of the not existing object.
++
++CID: 1316518
++Fixes: 354136bcc3c4 ("batman-adv: fix kernel crash due to missing NULL checks")
++Signed-off-by: Sven Eckelmann <sven@narfation.org>
++Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
++---
++ net/batman-adv/translation-table.c | 5 ++++-
++ 1 file changed, 4 insertions(+), 1 deletion(-)
++
++diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
++index 7986ec5..39283ff 100644
++--- a/net/batman-adv/translation-table.c
+++++ b/net/batman-adv/translation-table.c
++@@ -595,8 +595,11 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
++ /* increase the refcounter of the related vlan */
++ vlan = batadv_softif_vlan_get(bat_priv, vid);
++ if (WARN(!vlan, "adding TT local entry %pM to non-existent VLAN %d",
++- addr, BATADV_PRINT_VID(vid)))
+++ addr, BATADV_PRINT_VID(vid))) {
+++ kfree(tt_local);
+++ tt_local = NULL;
++ goto out;
+++ }
++
++ batadv_dbg(BATADV_DBG_TT, bat_priv,
++ "Creating new local tt entry: %pM (vid: %d, ttvn: %d)\n",
++--
++2.5.0
++
+diff --git a/feeds/routing/batman-adv/patches/0004-batman-adv-Remove-unnecessary-braces-for-test_bit-in.patch b/feeds/routing/batman-adv/patches/0004-batman-adv-Remove-unnecessary-braces-for-test_bit-in.patch
+new file mode 100644
+index 0000000..afe66a6
+--- /dev/null
++++ b/feeds/routing/batman-adv/patches/0004-batman-adv-Remove-unnecessary-braces-for-test_bit-in.patch
+@@ -0,0 +1,32 @@
++From af3558688698479a56034f0fcbca164be2052aa8 Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Linus=20L=C3=BCssing?= <linus.luessing@c0d3.blue>
++Date: Fri, 14 Aug 2015 17:23:48 +0200
++Subject: [PATCH 4/9] batman-adv: Remove unnecessary braces for test_bit() in
++ DAT
++MIME-Version: 1.0
++Content-Type: text/plain; charset=UTF-8
++Content-Transfer-Encoding: 8bit
++
++Fixes: de466678 ("batman-adv: Fix broken DAT capability check")
++Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
++Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
++---
++ net/batman-adv/distributed-arp-table.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c
++index 1caf7d2..63243a3 100644
++--- a/net/batman-adv/distributed-arp-table.c
+++++ b/net/batman-adv/distributed-arp-table.c
++@@ -453,7 +453,7 @@ static bool batadv_is_orig_node_eligible(struct batadv_dat_candidate *res,
++ int j;
++
++ /* check if orig node candidate is running DAT */
++- if (!(test_bit(BATADV_ORIG_CAPA_HAS_DAT, &candidate->capabilities)))
+++ if (!test_bit(BATADV_ORIG_CAPA_HAS_DAT, &candidate->capabilities))
++ goto out;
++
++ /* Check if this node has already been selected... */
++--
++2.5.0
++
+diff --git a/feeds/routing/batman-adv/patches/0005-batman-adv-Remove-unnecessary-braces-for-test_bit-in.patch b/feeds/routing/batman-adv/patches/0005-batman-adv-Remove-unnecessary-braces-for-test_bit-in.patch
+new file mode 100644
+index 0000000..eecbdcd
+--- /dev/null
++++ b/feeds/routing/batman-adv/patches/0005-batman-adv-Remove-unnecessary-braces-for-test_bit-in.patch
+@@ -0,0 +1,32 @@
++From 5abaf07b4c24ab2d7bd9b0c0de946b1ee5e946ff Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Linus=20L=C3=BCssing?= <linus.luessing@c0d3.blue>
++Date: Fri, 14 Aug 2015 17:23:49 +0200
++Subject: [PATCH 5/9] batman-adv: Remove unnecessary braces for test_bit() in
++ NC
++MIME-Version: 1.0
++Content-Type: text/plain; charset=UTF-8
++Content-Transfer-Encoding: 8bit
++
++Fixes: dfb27e75 ("batman-adv: Fix broken NC capability check")
++Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
++Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
++---
++ net/batman-adv/network-coding.c | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c
++index 55a0b28..1a1f7e6 100644
++--- a/net/batman-adv/network-coding.c
+++++ b/net/batman-adv/network-coding.c
++@@ -894,7 +894,7 @@ void batadv_nc_update_nc_node(struct batadv_priv *bat_priv,
++ goto out;
++
++ /* check if orig node is network coding enabled */
++- if (!(test_bit(BATADV_ORIG_CAPA_HAS_NC, &orig_node->capabilities)))
+++ if (!test_bit(BATADV_ORIG_CAPA_HAS_NC, &orig_node->capabilities))
++ goto out;
++
++ /* accept ogms from 'good' neighbors and single hop neighbors */
++--
++2.5.0
++
+diff --git a/feeds/routing/batman-adv/patches/0006-batman-adv-Remove-unnecessary-braces-for-test_bit-in.patch b/feeds/routing/batman-adv/patches/0006-batman-adv-Remove-unnecessary-braces-for-test_bit-in.patch
+new file mode 100644
+index 0000000..a4b4292
+--- /dev/null
++++ b/feeds/routing/batman-adv/patches/0006-batman-adv-Remove-unnecessary-braces-for-test_bit-in.patch
+@@ -0,0 +1,41 @@
++From d126204d0471e0972142697f36364443a0bbc9cc Mon Sep 17 00:00:00 2001
++From: =?UTF-8?q?Linus=20L=C3=BCssing?= <linus.luessing@c0d3.blue>
++Date: Fri, 14 Aug 2015 17:23:50 +0200
++Subject: [PATCH 6/9] batman-adv: Remove unnecessary braces for test_bit() in
++ MCAST
++MIME-Version: 1.0
++Content-Type: text/plain; charset=UTF-8
++Content-Transfer-Encoding: 8bit
++
++Fixes: 1798ad3f ("batman-adv: Fix broken MCAST capability check")
++Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
++Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
++---
++ net/batman-adv/multicast.c | 4 ++--
++ 1 file changed, 2 insertions(+), 2 deletions(-)
++
++diff --git a/net/batman-adv/multicast.c b/net/batman-adv/multicast.c
++index 8bdd69f..4541f08 100644
++--- a/net/batman-adv/multicast.c
+++++ b/net/batman-adv/multicast.c
++@@ -740,7 +740,7 @@ static void batadv_mcast_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,
++ * is a completely new orig_node no need to decrease the counter.
++ */
++ if (orig_mcast_enabled &&
++- !(test_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capabilities))) {
+++ !test_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capabilities)) {
++ if (orig_initialized)
++ atomic_dec(&bat_priv->mcast.num_disabled);
++ set_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capabilities);
++@@ -798,7 +798,7 @@ void batadv_mcast_purge_orig(struct batadv_orig_node *orig)
++
++ spin_lock_bh(&orig->mcast_handler_lock);
++
++- if (!(test_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capabilities)) &&
+++ if (!test_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capabilities) &&
++ test_bit(BATADV_ORIG_CAPA_HAS_MCAST, &orig->capa_initialized))
++ atomic_dec(&bat_priv->mcast.num_disabled);
++
++--
++2.5.0
++
+diff --git a/feeds/routing/batman-adv/patches/0007-batman-adv-fix-speedy-join-for-DAT-cache-replies.patch b/feeds/routing/batman-adv/patches/0007-batman-adv-fix-speedy-join-for-DAT-cache-replies.patch
+new file mode 100644
+index 0000000..d88508a
+--- /dev/null
++++ b/feeds/routing/batman-adv/patches/0007-batman-adv-fix-speedy-join-for-DAT-cache-replies.patch
+@@ -0,0 +1,58 @@
++From 2decb5f1fef1484f1b7319aaf2f36b5492d8d943 Mon Sep 17 00:00:00 2001
++From: Simon Wunderlich <sw@simonwunderlich.de>
++Date: Wed, 2 Sep 2015 20:09:54 +0200
++Subject: [PATCH 7/9] batman-adv: fix speedy join for DAT cache replies
++
++DAT Cache replies are answered on behalf of other clients which are not
++connected to the answering originator. Therefore, we shouldn't add these
++clients to the answering originators TT table through speed join to
++avoid bogus entries.
++
++Reported-by: Alessandro Bolletta <alessandro@mediaspot.net>
++Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
++Acked-by: Antonio Quartulli <antonio@meshcoding.com>
++Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
++---
++ net/batman-adv/routing.c | 19 +++++++++++++++----
++ 1 file changed, 15 insertions(+), 4 deletions(-)
++
++diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
++index c360c0c..96b5daa 100644
++--- a/net/batman-adv/routing.c
+++++ b/net/batman-adv/routing.c
++@@ -836,6 +836,7 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
++ uint8_t *orig_addr;
++ struct batadv_orig_node *orig_node = NULL;
++ int check, hdr_size = sizeof(*unicast_packet);
+++ enum batadv_subtype subtype;
++ bool is4addr;
++
++ unicast_packet = (struct batadv_unicast_packet *)skb->data;
++@@ -863,10 +864,20 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
++ /* packet for me */
++ if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
++ if (is4addr) {
++- batadv_dat_inc_counter(bat_priv,
++- unicast_4addr_packet->subtype);
++- orig_addr = unicast_4addr_packet->src;
++- orig_node = batadv_orig_hash_find(bat_priv, orig_addr);
+++ subtype = unicast_4addr_packet->subtype;
+++ batadv_dat_inc_counter(bat_priv, subtype);
+++
+++ /* Only payload data should be considered for speedy
+++ * join. For example, DAT also uses unicast 4addr
+++ * types, but those packets should not be considered
+++ * for speedy join, since the clients do not actually
+++ * reside at the sending originator.
+++ */
+++ if (subtype == BATADV_P_DATA) {
+++ orig_addr = unicast_4addr_packet->src;
+++ orig_node = batadv_orig_hash_find(bat_priv,
+++ orig_addr);
+++ }
++ }
++
++ if (batadv_dat_snoop_incoming_arp_request(bat_priv, skb,
++--
++2.5.0
++
+diff --git a/feeds/routing/batman-adv/patches/0008-batman-adv-avoid-keeping-false-temporary-entry.patch b/feeds/routing/batman-adv/patches/0008-batman-adv-avoid-keeping-false-temporary-entry.patch
+new file mode 100644
+index 0000000..0e7dbab
+--- /dev/null
++++ b/feeds/routing/batman-adv/patches/0008-batman-adv-avoid-keeping-false-temporary-entry.patch
+@@ -0,0 +1,51 @@
++From 4a73d7438dfb60c7ac82758875292bc14f363b45 Mon Sep 17 00:00:00 2001
++From: Simon Wunderlich <sw@simonwunderlich.de>
++Date: Wed, 2 Sep 2015 20:09:55 +0200
++Subject: [PATCH 8/9] batman-adv: avoid keeping false temporary entry
++
++In the case when a temporary entry is added first and a proper tt entry
++is added after that, the temporary tt entry is kept in the orig list.
++However the temporary flag is removed at this point, and therefore the
++purge function can not find this temporary entry anymore.
++
++Therefore, remove the previous temp entry before adding the new proper
++one.
++
++This case can happen if a client behind a given originator moves before
++the TT announcement is sent out. Other than that, this case can also be
++created by bogus or malicious payload frames for VLANs which are not
++existent on the sending originator.
++
++Reported-by: Alessandro Bolletta <alessandro@mediaspot.net>
++Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
++Acked-by: Antonio Quartulli <antonio@meshcoding.com>
++Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
++---
++ net/batman-adv/translation-table.c | 10 ++++++++--
++ 1 file changed, 8 insertions(+), 2 deletions(-)
++
++diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
++index 39283ff..9ac1a46 100644
++--- a/net/batman-adv/translation-table.c
+++++ b/net/batman-adv/translation-table.c
++@@ -1419,9 +1419,15 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
++ }
++
++ /* if the client was temporary added before receiving the first
++- * OGM announcing it, we have to clear the TEMP flag
+++ * OGM announcing it, we have to clear the TEMP flag. Also,
+++ * remove the previous temporary orig node and re-add it
+++ * if required. If the orig entry changed, the new one which
+++ * is a non-temporary entry is preferred.
++ */
++- common->flags &= ~BATADV_TT_CLIENT_TEMP;
+++ if (common->flags & BATADV_TT_CLIENT_TEMP) {
+++ batadv_tt_global_del_orig_list(tt_global_entry);
+++ common->flags &= ~BATADV_TT_CLIENT_TEMP;
+++ }
++
++ /* the change can carry possible "attribute" flags like the
++ * TT_CLIENT_WIFI, therefore they have to be copied in the
++--
++2.5.0
++
+diff --git a/feeds/routing/batman-adv/patches/0009-batman-adv-detect-local-excess-vlans-in-TT-request.patch b/feeds/routing/batman-adv/patches/0009-batman-adv-detect-local-excess-vlans-in-TT-request.patch
+new file mode 100644
+index 0000000..66e0dcf
+--- /dev/null
++++ b/feeds/routing/batman-adv/patches/0009-batman-adv-detect-local-excess-vlans-in-TT-request.patch
+@@ -0,0 +1,55 @@
++From 2dd1d9f06ac1208b1921aa90d479c3940bc70b4f Mon Sep 17 00:00:00 2001
++From: Simon Wunderlich <sw@simonwunderlich.de>
++Date: Wed, 2 Sep 2015 20:09:56 +0200
++Subject: [PATCH 9/9] batman-adv: detect local excess vlans in TT request
++
++If the local representation of the global TT table of one originator has
++more VLAN entries than the respective TT update, there is some
++inconsistency present. By detecting and reporting this inconsistency,
++the global table gets updated and the excess VLAN will get removed in
++the process.
++
++Reported-by: Alessandro Bolletta <alessandro@mediaspot.net>
++Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
++Acked-by: Antonio Quartulli <antonio@meshcoding.com>
++Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
++---
++ net/batman-adv/translation-table.c | 14 +++++++++++++-
++ 1 file changed, 13 insertions(+), 1 deletion(-)
++
++diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
++index 9ac1a46..7e4657e 100644
++--- a/net/batman-adv/translation-table.c
+++++ b/net/batman-adv/translation-table.c
++@@ -2394,8 +2394,8 @@ static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node,
++ {
++ struct batadv_tvlv_tt_vlan_data *tt_vlan_tmp;
++ struct batadv_orig_node_vlan *vlan;
+++ int i, orig_num_vlan;
++ uint32_t crc;
++- int i;
++
++ /* check if each received CRC matches the locally stored one */
++ for (i = 0; i < num_vlan; i++) {
++@@ -2421,6 +2421,18 @@ static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node,
++ return false;
++ }
++
+++ /* check if any excess VLANs exist locally for the originator
+++ * which are not mentioned in the TVLV from the originator.
+++ */
+++ rcu_read_lock();
+++ orig_num_vlan = 0;
+++ list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list)
+++ orig_num_vlan++;
+++ rcu_read_unlock();
+++
+++ if (orig_num_vlan > num_vlan)
+++ return false;
+++
++ return true;
++ }
++
++--
++2.5.0
++
+diff --git a/feeds/routing/batmand/Makefile b/feeds/routing/batmand/Makefile
+new file mode 100644
+index 0000000..a807650
+--- /dev/null
++++ b/feeds/routing/batmand/Makefile
+@@ -0,0 +1,153 @@
++#
++# Copyright (C) 2008-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=batmand
++PKG_REV:=1439
++PKG_VERSION:=r$(PKG_REV)
++PKG_RELEASE:=2
++PKG_EXTRA_CFLAGS=-DDEBUG_MALLOC -DMEMORY_USAGE -DPROFILE_DATA -DREVISION_VERSION=\"\ rv$(PKG_REV)\"
++
++PKG_SOURCE_PROTO:=svn
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_SUBDIR:=$(if $(PKG_BRANCH),$(PKG_BRANCH),$(PKG_NAME))-$(PKG_VERSION)
++PKG_SOURCE_URL:=http://downloads.open-mesh.org/svn/batman/trunk/
++PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
++PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++PKG_LICENSE:=GPL-2.0
++
++PKG_KMOD_BUILD_DIR:=$(PKG_BUILD_DIR)/batman/linux/modules
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/batmand/Default
++ URL:=http://www.open-mesh.org/
++ MAINTAINER:=Marek Lindner <lindner_marek@yahoo.de>
++endef
++
++define Package/batmand
++$(call Package/batmand/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ DEPENDS:=+libpthread +kmod-tun
++ TITLE:=B.A.T.M.A.N. layer 3 routing daemon
++endef
++
++define Package/batmand/description
++B.A.T.M.A.N. layer 3 routing daemon
++endef
++
++define Package/vis
++$(call Package/batmand/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ DEPENDS:=+libpthread
++ TITLE:=visualization server for B.A.T.M.A.N. layer 3
++endef
++
++define Package/vis/description
++visualization server for B.A.T.M.A.N. layer 3
++endef
++
++define KernelPackage/batgat
++$(call Package/batmand/Default)
++ SUBMENU:=Network Support
++ DEPENDS:=+batmand @BROKEN
++ TITLE:=B.A.T.M.A.N. gateway module
++ FILES:=$(PKG_KMOD_BUILD_DIR)/batgat.$(LINUX_KMOD_SUFFIX)
++ AUTOLOAD:=$(call AutoLoad,50,batgat)
++endef
++
++
++define KernelPackage/batgat/description
++Kernel gateway module for B.A.T.M.A.N. for better tunnel performance
++endef
++
++MAKE_BATMAND_ARGS += \
++ EXTRA_CFLAGS='$(TARGET_CFLAGS) $(PKG_EXTRA_CFLAGS)' \
++ CCFLAGS="$(TARGET_CFLAGS)" \
++ OFLAGS="$(TARGET_CFLAGS)" \
++ REVISION="$(PKG_REV)" \
++ CC="$(TARGET_CC)" \
++ NODEBUG=1 \
++ UNAME="Linux" \
++ INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
++ STRIP="/bin/true" \
++ batmand install
++
++MAKE_VIS_ARGS += \
++ EXTRA_CFLAGS='$(TARGET_CFLAGS) $(PKG_EXTRA_CFLAGS)' \
++ CCFLAGS="$(TARGET_CFLAGS)" \
++ OFLAGS="$(TARGET_CFLAGS)" \
++ REVISION="$(PKG_REV)" \
++ CC="$(TARGET_CC)" \
++ NODEBUG=1 \
++ UNAME="Linux" \
++ INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
++ STRIP="/bin/true" \
++ vis install
++
++MAKE_BATGAT_ARGS += \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ ARCH="$(LINUX_KARCH)" \
++ PATH="$(TARGET_PATH)" \
++ SUBDIRS="$(PKG_KMOD_BUILD_DIR)" \
++ LINUX_VERSION="$(LINUX_VERSION)" \
++ REVISION="$(PKG_REV)" modules
++
++
++define Build/Configure
++endef
++
++ifneq ($(DEVELOPER)$(CONFIG_PACKAGE_batmand),)
++ BUILD_BATMAND := $(MAKE) -C $(PKG_BUILD_DIR)/batman $(MAKE_BATMAND_ARGS)
++endif
++
++ifneq ($(DEVELOPER)$(CONFIG_PACKAGE_vis),)
++ BUILD_VIS := $(MAKE) -C $(PKG_BUILD_DIR)/vis $(MAKE_VIS_ARGS)
++endif
++
++ifneq ($(DEVELOPER)$(CONFIG_PACKAGE_kmod-batgat),)
++ BUILD_BATGAT := $(MAKE) -C "$(LINUX_DIR)" $(MAKE_BATGAT_ARGS)
++endif
++
++define Build/Compile
++ $(BUILD_BATMAND)
++ $(BUILD_VIS)
++ cp $(PKG_KMOD_BUILD_DIR)/Makefile.kbuild $(PKG_KMOD_BUILD_DIR)/Makefile
++ $(BUILD_BATGAT)
++endef
++
++define Package/batmand/install
++ $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/batmand $(1)/usr/sbin/
++ $(INSTALL_BIN) ./files/etc/init.d/batmand $(1)/etc/init.d
++ $(INSTALL_DATA) ./files/etc/config/batmand $(1)/etc/config
++endef
++
++define Package/batmand/conffiles
++/etc/config/batmand
++endef
++
++define Package/vis/install
++ $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/vis $(1)/usr/sbin/
++ $(INSTALL_BIN) ./files/etc/init.d/vis $(1)/etc/init.d
++ $(INSTALL_DATA) ./files/etc/config/vis $(1)/etc/config
++endef
++
++define Package/vis/conffiles
++/etc/config/vis
++endef
++
++$(eval $(call BuildPackage,batmand))
++$(eval $(call BuildPackage,vis))
++$(eval $(call KernelPackage,batgat))
+diff --git a/feeds/routing/batmand/files/etc/config/batmand b/feeds/routing/batmand/files/etc/config/batmand
+new file mode 100644
+index 0000000..6d1f3be
+--- /dev/null
++++ b/feeds/routing/batmand/files/etc/config/batmand
+@@ -0,0 +1,12 @@
++config batmand general
++ option interface ath0
++ option hna
++ option gateway_class
++ option originator_interval
++ option preferred_gateway
++ option routing_class
++ option visualisation_srv
++ option policy_routing_script
++ option disable_client_nat
++ option disable_aggregation
++
+diff --git a/feeds/routing/batmand/files/etc/config/vis b/feeds/routing/batmand/files/etc/config/vis
+new file mode 100644
+index 0000000..6d30023
+--- /dev/null
++++ b/feeds/routing/batmand/files/etc/config/vis
+@@ -0,0 +1,3 @@
++config vis general
++ option interface ath0
++
+diff --git a/feeds/routing/batmand/files/etc/init.d/batmand b/feeds/routing/batmand/files/etc/init.d/batmand
+new file mode 100644
+index 0000000..403e9f3
+--- /dev/null
++++ b/feeds/routing/batmand/files/etc/init.d/batmand
+@@ -0,0 +1,66 @@
++#!/bin/sh /etc/rc.common
++START=90
++
++start () {
++ interface=$(uci get batmand.general.interface)
++ if [ "$interface" = "" ]; then
++ echo $1 Error, you must specify at least a network interface
++ exit
++ fi
++ hnas=$(uci get batmand.general.hna)
++ gateway_class=$(uci get batmand.general.gateway_class)
++ originator_interval=$(uci get batmand.general.originator_interval)
++ preferred_gateway=$(uci get batmand.general.preferred_gateway)
++ routing_class=$(uci get batmand.general.routing_class)
++ visualisation_srv=$(uci get batmand.general.visualisation_srv)
++ policy_routing_script=$(uci get batmand.general.policy_routing_script)
++ disable_client_nat=$(uci get batmand.general.disable_client_nat)
++ disable_aggregation=$(uci get batmand.general.disable_aggregation)
++ batman_args=""
++
++ for hna in $hnas
++ do
++ batman_args=${batman_args}'-a '$hna' '
++ done
++
++ if [ $gateway_class ]; then
++ batman_args=${batman_args}'-g '$gateway_class' '
++ fi
++
++ if [ $originator_interval ]; then
++ batman_args=${batman_args}'-o '$originator_interval' '
++ fi
++
++ if [ $preferred_gateway ]; then
++ batman_args=${batman_args}'-p '$preferred_gateway' '
++ fi
++
++ if [ $routing_class ]; then
++ batman_args=${batman_args}'-r '$routing_class' '
++ fi
++
++ if [ $visualisation_srv ]; then
++ batman_args=${batman_args}'-s '$visualisation_srv' '
++ fi
++
++ if [ $policy_routing_script ]; then
++ batman_args=${batman_args}'--policy-routing-script '$policy_routing_script' '
++ fi
++
++ if [ $disable_client_nat ]; then
++ batman_args=${batman_args}'--disable-client-nat '
++ fi
++
++ if [ $disable_aggregation ]; then
++ batman_args=${batman_args}'--disable-aggregation '
++ fi
++
++ batman_args=${batman_args}$interface
++ batmand $batman_args >/dev/null 2>&1
++}
++
++stop () {
++ killall batmand
++}
++
++
+diff --git a/feeds/routing/batmand/files/etc/init.d/vis b/feeds/routing/batmand/files/etc/init.d/vis
+new file mode 100644
+index 0000000..ef18eb7
+--- /dev/null
++++ b/feeds/routing/batmand/files/etc/init.d/vis
+@@ -0,0 +1,19 @@
++#!/bin/sh /etc/rc.common
++START=90
++
++start () {
++ interface=$(uci get vis.general.interface)
++ if [ "$interface" = "" ]; then
++ echo $1 Error, you must specify at least a network interface
++ exit
++ fi
++ vis_args=$interface
++
++ vis $vis_args >/dev/null 2>&1
++}
++
++stop () {
++ killall vis
++}
++
++
+diff --git a/feeds/routing/batmand/patches/100-2.6.36.patch b/feeds/routing/batmand/patches/100-2.6.36.patch
+new file mode 100644
+index 0000000..566c23b
+--- /dev/null
++++ b/feeds/routing/batmand/patches/100-2.6.36.patch
+@@ -0,0 +1,47 @@
++---
++ batman/linux/modules/gateway.c | 19 +++++++++++++++++++
++ 1 file changed, 19 insertions(+)
++
++--- batmand-r1439.orig/batman/linux/modules/gateway.c
+++++ batmand-r1439/batman/linux/modules/gateway.c
++@@ -29,6 +29,7 @@ static struct class *batman_class;
++ static int batgat_open(struct inode *inode, struct file *filp);
++ static int batgat_release(struct inode *inode, struct file *file);
++ static int batgat_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg );
+++static long batgat_ioctl_unlocked(struct file *file, unsigned int cmd, unsigned long arg );
++
++
++ static void udp_data_ready(struct sock *sk, int len);
++@@ -53,7 +54,11 @@ static int proc_clients_read(char *buf,
++ static struct file_operations fops = {
++ .open = batgat_open,
++ .release = batgat_release,
+++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
+++ .unlocked_ioctl = batgat_ioctl_unlocked,
+++#else
++ .ioctl = batgat_ioctl,
+++#endif
++ };
++
++
++@@ -166,6 +171,20 @@ static int batgat_release(struct inode *
++ }
++
++
+++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
+++#include <linux/smp_lock.h>
+++static long batgat_ioctl_unlocked(struct file *file, unsigned int cmd, unsigned long arg )
+++{
+++ int ret;
+++
+++ lock_kernel();
+++ ret = batgat_ioctl(file->f_path.dentry->d_inode, file, cmd, arg);
+++ unlock_kernel();
+++
+++ return ret;
+++}
+++#endif
+++
++ static int batgat_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg )
++ {
++ uint8_t tmp_ip[4];
+diff --git a/feeds/routing/bird-openwrt/DOCUMENTATION b/feeds/routing/bird-openwrt/DOCUMENTATION
+new file mode 100644
+index 0000000..a55e271
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/DOCUMENTATION
+@@ -0,0 +1,531 @@
++---------------------------------------------------------------------
++
++Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++BGP/Bird integration with OpenWRT
++
++This program is free software: you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation, either version 3 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++---------------------------------------------------------------------
++
++*** Original documentation for BIRD Daemon can be found here: http://bird.network.cz/?get_doc
++*** Some interesting examples are placed in BIRD daemon Gitlab page: https://gitlab.labs.nic.cz/labs/bird/wikis/home
++*** If you want to add new options to bird*-openwrt packages,
++*** feel free to make a pull request it in: https://github.com/openwrt-routing/packages/bird-openwrt
++*** or email me and ask for it: eloicaso@openmailbox.org
++
++- Options used in /etc/config/birdX -
++
++---------------------------------------------------------------------
++CONFIGURATION SECTION 1: 'bird'
++---------------------------------------------------------------------
++
++Example
++--
++config bird 'bird'
++ option use_UCI_config '1'
++ option UCI_config_file '/tmp/bird4.conf'
++--
++
++* use_UCI_config: Boolean
++This option allows you to use UCI configuration translation file instead of the original Bird one. If true/1, birdX init.d script will use the translation placed in "UCI_config_file". Otherwise, it will use the default "/etc/birdX.conf" configuration.
++[Hint] This could be used to allow multiple configurations and swap them easily.
++Default: 0
++
++* UCI_config_file: String (File path)
++This option sets where will be placed the translation of the UCI configuration file.
++Default: /tmp/birdX.conf
++
++
++
++---------------------------------------------------------------------
++CONFIGURATION SECTION 2: 'global NAME'
++---------------------------------------------------------------------
++
++Example
++--
++config global 'global'
++ option log_file '/tmp/bird4.log'
++ option log 'all'
++ option debug 'off'
++ option router_id '172.16.1.6'
++--
++
++* log_file: String (File path)
++This option sets the path of the file used to save Bird Log and Debug's information.
++Default: /tmp/birdX.log
++
++* log: String/Enumeration (all/off, info, warning, error, fatal, debug, trace, remote, auth, bug)
++This option allows you to set which information you want to save in the
++[HINT] Use the enumeration like: { info, waning, error }
++Default: all
++
++* debug: String/Enumeration ( all/off, states, routes, filters, interfaces, events, packets)
++This option allows you to set which debug information will be saved in the "log_file" file.
++[HINT] Use the enumeration like: { info, waning, error }
++Default: off
++
++* router_id: IP Address
++This option sets which will be the Router ID. Usually is the lowest IP address (not loopback) among the existing interfaces.
++[HINT] In IPv4 this field is optional. In IPv6 is mandatory.
++
++* listen_bgp_addr: IP Address
++This option sets the IP address that Bird BGP instances will listen by default.
++Default: 0.0.0.0
++
++* listen_bgp_port: Integer (Port)
++This option sets the port that Bird BGP instances will listen by default.
++Default: 179
++
++[IPv6 only]
++* listen_bgp_dual: Boolean
++This option sets if Bird6 BGP instances will listen only to IPv6 or IPv4/6 BGP routes.
++
++
++
++---------------------------------------------------------------------
++CONFIGURATION SECTION 3: 'table'
++---------------------------------------------------------------------
++
++Example
++--
++config table
++ option name 'aux'
++--
++
++* name: String
++This option allows you to set the name of the auxiliar kernel tables used for Bird.
++
++
++
++---------------------------------------------------------------------
++CONFIGURATION SECTION 4: 'kernel NAME'
++---------------------------------------------------------------------
++
++Example
++--
++config kernel kernel1
++ option table 'aux'
++ option import 'all'
++ option export 'all'
++ option kernel_table '100'
++ option scan_time '10'
++ option learn '1'
++ option persist '0'
++ option disabled '0'
++--
++
++* table: String
++Set an auxiliary table for the current kernel routing instance. This table MUST exist as a SECTION 3 instance.
++[HINT] If there is an Kernel protocol instance that uses the "main" kernel table (not using table/kernel_table options), this should be included before the rest of Kernel instances (which will use auxiliary tables).
++
++* import: String/Filter function
++This option delimits which routes coming from other protocols will be accepted. This option allows filters in different manners:
++1. All/none: allows to import all the routes or none of them.
++2. Filter name: [import 'bgp_filter_in'] the protocol will use the filter with the Filter name. (Needs an existing filter declared in the UCI configuration file)
++
++* export: String/Filter function
++This option delimits which routes going out from the protocol. This option allows filters in different manners:
++1. All/none: allows to export all the routes or none of them.
++2. Filter name: [export 'bgp_filter_out'] the protocol will use the filter with the 'Filter name'. (Needs an existing filter declared in the UCI configuration file)
++
++* kernel_table: Integer
++This option sets the identification number of the Kernel table that will be used instead of the main one.
++Default: main table (254)
++
++* scan_time: Integer
++This option sets the time between checks to the selected kernel table.
++
++* learn: Boolean
++Set if the kernel table will add the routes from other routing protocols or the system administrator.
++
++* persist: Boolean
++Set if Bird Daemon will save the known routes when exiting or if it will clean the routing table.
++
++* disable: Boolean
++This option sets if the protocol will be used or dismissed.
++Default: 0
++
++
++
++---------------------------------------------------------------------
++CONFIGURATION SECTION 5: 'device NAME'
++---------------------------------------------------------------------
++
++Example
++--
++config device device1
++ option scan_time '10'
++ option disabled '0'
++--
++
++* scan_time: Integer
++This option sets the time between checks to the selected kernel table.
++
++* disable: Boolean
++This option sets if the protocol will be used or dismissed.
++Default: 0
++
++
++
++CONFIGURATION SECTION 6: 'static NAME'
++
++Example
++--
++config static static1
++ option table 'aux'
++ option disabled '0'
++--
++
++* table: String
++Set an auxiliary table for the current static instance. This table MUST exist as a SECTION 3 instance.
++[HINT] If there is an static instance that uses the "main" kernel table (not using table/kernel_table options), this should be included before the rest of static instances (which will use auxiliary tables).
++
++* disable: Boolean
++This option sets if the protocol will be used or dismissed.
++Default: 0
++
++
++
++---------------------------------------------------------------------
++CONFIGURATION SECTION 7 & 8: 'bgp NAME' & 'bgp_template NAME'
++---------------------------------------------------------------------
++
++This section merges two different configuration sections: bgp instances and templates. The first one is the basic bgp configuration part and the second one is the template used to minimize the number of options written in the configuration file. Both configuration sections has the same options, but when Bird found duplicities, the bgp instance has priority over the template.
++
++Examples
++
++-- instance --
++config bgp bgp1
++ option template 'bgp_common'
++ option description 'Description of the BGP instance'
++ option neighbor_address '172.16.1.5'
++ option neighbor_as '65530'
++ option source_address '172.16.1.6'
++ option next_hop_self '0'
++ option next_hop_keep '0'
++ option rr_client '1'
++ option rr_cluster_id '172.16.1.6'
++--
++-- template --
++config bgp_template bgp_common
++ option table 'aux'
++ option import 'all'
++ option export 'all'
++ option local_address '172.16.1.6'
++ option local_as '65001'
++ option import_limit '100'
++ option import_limit_action 'warn'
++ option export_limit '100'
++ option export_limit_action 'warn'
++ option receive_limit '100'
++ option receive_limit_action 'warn'
++ option disabled '0'
++--
++
++* template: String
++This option states the template used for current BGP instance. This template MUST exist as a SECTION 8 instance.
++
++* description: String
++This option allows to add a description of the bgp instance and its function
++
++* local_addr: IP address
++This optional option allows to set the IP source of our Autonomous System (AS).
++
++* local_as: Integer
++This option allows to set the identification number of our AS number. This option is mandatory for each BGP instance.
++
++* neighbor_addr: IP address
++Each BGP instance has a neighbor connected to. This option allows to set its IP address
++
++* neighbor_as: Integer
++Each BGP instance has a neighbor connected to. This option allows to set its AS ID.
++
++* next_hop_self: Boolean
++If this option is true, BGP protocol will avoid to calculate the next hop and always advertise own "Router id" IP .
++Default: 0
++
++* next_hop_keep: Boolean
++If this option is true, BGP will always use the received next_hop information to redirect the route.
++Default: 0
++
++* rr_client: Boolean
++IF this option is true, the router will be set as Route Reflector and will treat the rest of the routers as RR clients.
++Default: 0
++
++* rr_cluster_id: Integer
++This option sets the identification number of the RR cluster. All the nodes in a cluster needs this option and share the same number.
++Default: Router id
++
++* import_limit: Integer
++This option sets the limit of routes that a protocol can import until take the action indicated in the import_limit_action.
++import_limit also counts filtered routes (even dropped).
++Default: 0 (no limit)
++
++* import_limit_action: String
++This option allows to decide the action to take when reached the limit of imported routes.
++Actions are: warn, block, restart, disable
++
++* export_limit: Integer
++This option sets the limit of routes that a protocol can export until take the action indicated in the export_limit_action.
++Default: 0 (no limit)
++
++* export_limit_action: String
++This option allows to decide the action to take when reached the limit of exported routes.
++Actions are: warn, block, restart, disable
++
++* receive_limit: Integer
++This option sets the limit of routes that a protocol can receive until take the action indicated in the receive_limit_action. receive_limit only counts accepted routes from the protocol.
++Default: 0 (no limit)
++
++* receive_limit_action: String
++This option allows to decide the action to take when reached the limit of received routes.
++Actions are: warn, block, restart, disable
++
++* disable: Boolean
++This option sets if the protocol will be used or dismissed.
++Default: 0
++
++
++
++---------------------------------------------------------------------
++CONFIGURATION SECTION 9: 'route'
++---------------------------------------------------------------------
++
++Example
++--
++config route
++ option instance 'static1'
++ option type 'router'
++ option prefix '192.168.9.0/24'
++ option via '10.99.105.159'
++
++config route
++ option instance 'static1'
++ option type 'special'
++ option prefix '192.168.2.0/24'
++ option attribute 'unreachable'
++
++config route
++ option instance 'static1'
++ option type 'iface'
++ option prefix '192.168.3.0/24'
++ option iface 'mgmt0'
++
++config route
++ option instance 'static1'
++ option type 'recursive'
++ option prefix '192.168.4.0/24'
++ option ip '192.168.1.1'
++
++config route
++ option instance 'static1'
++ option type 'multipath'
++ option prefix '192.168.30.0/24'
++ list l_via '172.16.1.5'
++ list l_via '172.16.1.6'
++--
++
++* instance: String
++This option indicates the route that the static protocol instance will apply.
++
++* type: String
++This option states the type of route that will be applied. Also defines the options available for it.
++Types are: 'router', 'special', 'iface', 'recursive' or 'multipath'.
++
++* prefix: IP address/network
++This option allows to define the network that you want to define.
++
++[router only]
++* via: IP Address
++This option indicates the IP address of the neighbor router where the routes will pass through.
++
++[special only]
++* attribute: String
++This option will mark the behaviour of the route.
++Attribures are: 'blackhole', 'unreachable' or 'prohibit'.
++
++[iface only]
++* iface: String
++This option indicates the interface used to redirect the BGP routes. Careful, the interface MUST exist, or Bird will fail to start.
++
++[recursive only]
++* ip: IP address
++This option states the IP address which the next hop will depend on.
++
++[multipath only][This is a list, not an option. Use it as in the example, or check the UCI configuration documentation.]
++* l_via: IP address
++This list of IPs specifies the list (following the sequence) of routers that the route will follow as next hops.
++
++
++
++---------------------------------------------------------------------
++CONFIGURATION SECTION 10: 'filter NAME'
++---------------------------------------------------------------------
++
++Filters are written in separated files. Its syntax can be found in http://bird.network.cz/?get_doc&f=bird-5.html
++The content of each filter file is copied in the birdX.conf file without checking its syntax.
++
++Example
++--
++config filter 'firstFilter'
++ option type 'bgp'
++ option instance 'bgp1'
++ option file_path '/var/filters/f1'
++--
++
++* type: String
++The type indicates to which routing protocol is the filter directed to. Currently only BGP is available.
++
++* instance: String
++This option indicates the filter that the routing protocol instance will apply.
++
++* file_path: String (File path)
++This option specifies the path to the filter file to be used in the routing protocol.
++
++
++
++---------------------------------------------------------------------
++COMPLETE CONFIGURATION EXAMPLE:
++---------------------------------------------------------------------
++
++config bird 'bird'
++ option use_UCI_config '1'
++ #Caution! Enabling this option, Bird will translate this
++ #UCI file and use it instead of /etc/bird4.conf
++ option UCI_config_file '/tmp/bird4.conf'
++ #If you enable useUCIconfig, UCIconfigFile will be Bird's
++ #configuration file location.
++
++config global 'global'
++ option log_file '/tmp/bird4.log'
++ option log 'all'
++ option debug 'off'
++ option router_id '172.16.1.6'
++
++config table
++ option name 'aux'
++
++config kernel kernel1
++ option table 'aux'
++ option import 'all'
++ option export 'all'
++ option kernel_table '100'
++ option scan_time '10'
++ option learn '1'
++ option persist '0'
++ option disabled '0'
++
++config device device1
++ option scan_time '10'
++ option disabled '0'
++
++config static static1
++ option table 'aux'
++ option disabled '0'
++
++config bgp bgp1
++ option template 'bgp_common'
++ option description 'Description of the BGP instance'
++ option neighbor_address '172.16.1.5'
++ option neighbor_as '65530'
++ option source_address '172.16.1.6'
++ option next_hop_self '0'
++ option next_hop_keep '0'
++ option rr_client '1'
++ option rr_cluster_id '172.16.1.6'
++
++config bgp_template bgp_common
++ option table 'aux'
++ option import 'all'
++ option export 'all'
++ option local_address '172.16.1.6'
++ option local_as '65001'
++ option import_limit '100'
++ option import_limit_action 'warn'
++ option export_limit '100'
++ option export_limit_action 'warn'
++ option receive_limit '100'
++ option receive_limit_action 'warn'
++ option disabled '0'
++
++#config ospf ospf1
++# option cfg1583compat '1'
++#
++#config ospf_area '0.0.0.0'
++# option instance 'ospf1'
++# option stub '0'
++#
++#config ospf_interface '*'
++# option area '0.0.0.0'
++# option cost '100'
++# option type 'broadcast'
++# option hello '5'
++# option password '1'
++#
++#config ospf_password '1'
++# option authentication 'cryptographic'
++# option passphrase '1234'
++#
++#config ospf_networks
++# option area '0.0.0.0'
++# list prefix '10.0.0.0/24'
++#
++#config ospf_hidden_networks
++# option area '0.0.0.0'
++# option prefix '12.0.0.0/24'
++#
++#config ospf_stubnet '11.0.0.0/24'
++# option area '0.0.0.0'
++# option hidden '0'
++# option summary '0'
++# option cost '101'
++#
++
++config route
++ option instance 'static1'
++ option type 'router'
++ option prefix '192.168.9.0/24'
++ option via '10.99.105.159'
++
++config route
++ option instance 'static1'
++ option type 'special'
++ option prefix '192.168.2.0/24'
++ option attribute 'unreachable'
++
++config route
++ option instance 'static1'
++ option type 'iface'
++ option prefix '192.168.3.0/24'
++ option iface 'mgmt0'
++
++config route
++ option instance 'static1'
++ option type 'recursive'
++ option prefix '192.168.4.0/24'
++ option ip '192.168.1.1'
++
++config route
++ option instance 'static1'
++ option type 'multipath'
++ option prefix '192.168.30.0/24'
++ list l_via '172.16.1.5'
++ list l_via '172.16.1.6'
++
++config filter 'firstFilter'
++ option type 'bgp'
++ option instance 'bgp1'
++ option file_path '/var/filters/f1'
++
++
+diff --git a/feeds/routing/bird-openwrt/bird4-openwrt/Makefile b/feeds/routing/bird-openwrt/bird4-openwrt/Makefile
+new file mode 100644
+index 0000000..1e488b3
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird4-openwrt/Makefile
+@@ -0,0 +1,91 @@
++# Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++# BGP/Bird integration with OpenWRT and QMP
++#
++# This program is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++BIRD:=bird4
++PKG_NAME:=$(BIRD)-openwrt
++PKG_RELEASE:=0.2
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++PKG_LICENSE:=GPL-3.0+
++uci:=$(BIRD)-uci
++luci:=luci-app-$(BIRD)
++
++
++include $(INCLUDE_DIR)/package.mk
++
++define Build/Prepare
++endef
++define Build/Compile
++endef
++
++define Package/$(uci)
++ TITLE:=The BIRD UCI module
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
++ URL:=https://github.com/eloicaso/bird4-openwrt/
++ DEPENDS:=+$(BIRD) +libuci +uci
++endef
++
++define Package/$(uci)/description
++$(BIRD) UCI integration module
++endef
++
++define Package/$(uci)/install
++ $(INSTALL_DIR) $(1)/etc/$(BIRD)/init.d
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_BIN) ./src/init.d/$(BIRD) $(1)/etc/$(BIRD)/init.d/
++ $(CP) ./src/uci-defaults/$(uci)-install-init.d $(1)/etc/$(BIRD)/init.d/
++ $(CP) ./src/config/$(BIRD) $(1)/etc/config/
++endef
++
++define Package/$(uci)/postinst
++#!/bin/sh
++if [ -z $${IPKG_INSTROOT} ]; then
++ ( . /etc/bird4/init.d/bird4-uci-install-init.d ) && rm -f /etc/bird4/init.d/bird4-uci-install-init.d
++fi
++endef
++
++$(eval $(call BuildPackage,$(uci)))
++
++
++
++define Package/$(luci)
++ TITLE:=LuCI support for $(BIRD)
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=3. Applications
++ MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
++ URL:=https://github.com/eloicaso/bird4-openwrt/
++ DEPENDS:=+$(BIRD)-uci +luci-base
++endef
++
++define Package/$(luci)/description
++$(BIRD) application for LuCI
++endef
++
++define Package/$(luci)/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
++ $(CP) ./src/model/* $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
++ $(CP) ./src/controller/* $(1)/usr/lib/lua/luci/controller/
++endef
++
++$(eval $(call BuildPackage,$(luci)))
+diff --git a/feeds/routing/bird-openwrt/bird4-openwrt/src/config/bird4 b/feeds/routing/bird-openwrt/bird4-openwrt/src/config/bird4
+new file mode 100644
+index 0000000..5bfc372
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird4-openwrt/src/config/bird4
+@@ -0,0 +1,67 @@
++config bird 'bird'
++ option use_UCI_config '1'
++ #Caution! Enabling this option, Bird will translate this
++ #UCI file and use it instead of /etc/bird4.conf
++ option UCI_config_file '/tmp/bird4.conf'
++ #If you enable useUCIconfig, UCIconfigFile will be Bird's
++ #configuration file location.
++
++config global 'global'
++ option log_file '/tmp/bird4.log'
++ option log 'all'
++ option debug 'off'
++ option router_id '172.16.1.6'
++
++config table
++ option name 'aux'
++
++config kernel kernel1
++ option table 'aux'
++ option import 'all'
++ option export 'all'
++ option kernel_table '100'
++ option scan_time '10'
++ option learn '1'
++ option persist '0'
++ option disabled '0'
++
++config device device1
++ option scan_time '10'
++ option disabled '0'
++
++config static static1
++ option table 'aux'
++ option disabled '0'
++
++config bgp bgp1
++ option template 'bgp_common'
++ option description 'Description of the BGP instance'
++ option neighbor_address '172.16.1.5'
++ option neighbor_as '65530'
++ option source_address '172.16.1.6'
++ option next_hop_self '0'
++ option next_hop_keep '0'
++ option rr_client '1'
++ option rr_cluster_id '172.16.1.6'
++
++config bgp_template bgp_common
++ option table 'aux'
++ option import 'all'
++ option export 'all'
++ option local_address '172.16.1.6'
++ option local_as '65001'
++ option import_limit '100'
++ option import_limit_action 'warn'
++ option export_limit '100'
++ option export_limit_action 'warn'
++ option receive_limit '100'
++ option receive_limit_action 'warn'
++ option disabled '0'
++
++config route
++ option instance 'static1'
++ option type 'router'
++ option prefix '192.168.9.0/24'
++ option via '10.99.105.159'
++
++
+diff --git a/feeds/routing/bird-openwrt/bird4-openwrt/src/controller/bird4.lua b/feeds/routing/bird-openwrt/bird4-openwrt/src/controller/bird4.lua
+new file mode 100644
+index 0000000..7b2c56d
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird4-openwrt/src/controller/bird4.lua
+@@ -0,0 +1,27 @@
++--[[
++Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++BGP/Bird integration with OpenWRT and QMP
++
++This program is free software: you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation, either version 3 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program. If not, see <http://www.gnu.org/licenses/>.
++--]]
++
++module("luci.controller.bird4", package.seeall)
++
++function index()
++ entry({"admin","network","bird4"}, cbi("bird4/overview"), "Bird4", 0).dependent=false
++ entry({"admin","network","bird4","overview"}, cbi("bird4/overview"), "Overview", 1).dependent=false
++ entry({"admin","network","bird4","proto_general"}, cbi("bird4/gen_proto"), "General protocols", 3).dependent=false
++ entry({"admin","network","bird4","proto_bgp"}, cbi("bird4/bgp_proto"), "BGP Protocol", 4).dependent=false
++end
++
+diff --git a/feeds/routing/bird-openwrt/bird4-openwrt/src/init.d/bird4 b/feeds/routing/bird-openwrt/bird4-openwrt/src/init.d/bird4
+new file mode 100755
+index 0000000..8732c16
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird4-openwrt/src/init.d/bird4
+@@ -0,0 +1,411 @@
++#!/bin/sh /etc/rc.common
++
++# Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++# BGP/Bird integration with OpenWRT and QMP
++#
++# This program is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++#
++
++BIRD="bird4"
++BIRD_CONFIG="/etc/$BIRD.conf"
++
++START=99
++STOP=10
++
++SERVICE_DAEMONIZE=1
++SERVICE_USE_PID=1
++SERVICE_PID_FILE="/var/run/$BIRD.pid"
++
++BIRD_BIN="/usr/sbin/$BIRD"
++
++
++# Function: writeToConfig $1
++# $1 string.
++# Allows to write in the $BIRD_CONFIG file, the string $1. This function does not check the $1 string.
++# Example: writeToConfig "value: $N"
++writeToConfig() {
++ echo "$1" >> $BIRD_CONFIG
++}
++
++# Function: write $1 $2
++# $1 string. $2 string.
++# This function checks if $2 is empty. If not, it writes the string $1 in the $BIRD_CONFIG file.
++# Use write function to check if $1, value found inside $2, is not empty and can be written in the configuration file.
++# Example: N=""; write "value: $N" $N;
++write() {
++ [ -n "$2" ] && writeToConfig "$1"
++}
++
++#Function: write_bool $1 $2
++# $1 string; $2 boolean
++# This function checks if $2 is true or false and write the $1 string into $BIRD_CONFIG file.
++# The function writes a # before the $2 string if its false.
++# Example: local N=0; write_bool $N
++write_bool() {
++ [ "$2" == 0 ] && writeToConfig "# $1;" || writeToConfig " $1;"
++}
++
++# Function: get $1 $2
++# $1 string. $2 string
++# This function uses the external UCI function "config_get $result $section $option" to obtain a string value from UCI config file.
++# To use this function, use the same name of the UCI option for the variable.
++# Example: UCI (option id 'abcd'); local id; get id $section
++get() {
++ config_get $1 $2 $1
++}
++
++# Function: get_bool $1 $2
++# $1 boolean. $2 string
++# This function uses the external UCI function "config_get_bool $result $section $option" to obtain a boolean value from UCI config file.
++# To use this function, use the same name of the UCI option for the variable $1.
++# Example: UCI (option use_ipv6 '1'); local use_ipv6; get use_ipv6 $section
++get_bool() {
++ config_get_bool $1 $2 $1
++}
++
++# Function: multipath_list $1
++# $1 string
++# This function writes the $1 string in the multipath routes.
++multipath_list() {
++ write " via $1" $1
++}
++
++# Function: prepare_tables $1
++# $1 string
++# This function gets each "table" section in the UCI configuration and sets each option in the bird4.conf file.
++# $1 is set as the ID of the current UCI table section
++prepare_tables() {
++ local section="$1"; local name
++ get name $section
++ write "table $name;" $name
++}
++
++# Function: prepare_global $1
++# $1 string
++# This function gets each "global" section in the UCI configuration and sets each option in the bird4.conf file.
++# $1 is set as the ID of the current UCI global section. prepare_global is the first configuration set in the bird4.conf and removes the old file.
++prepare_global () {
++ local section="$1"
++ local log_file; local log; local debug; local router_id; local table
++
++ # Remove old configuration file
++ rm -f "$BIRD_CONFIG"
++
++ get log_file $section
++ get log $section
++ get debug $section
++ get router_id $section
++ get table $section
++
++ # First line of the NEW configuration file
++ echo "#Bird4 configuration using UCI:" > $BIRD_CONFIG
++ writeToConfig " "
++ [ -n "$log_file" -a -n "$log" ] && writeToConfig 'log "'$log_file'" '$log';'
++ write "debug protocols $debug;" $debug
++ writeToConfig " "
++ writeToConfig "#Router ID"
++ write "router id $router_id;" $router_id
++ writeToConfig " "
++ writeToConfig "#Secondary tables"
++ config_foreach prepare_tables 'table'
++ writeToConfig " "
++}
++
++# Function: prepare_routes $1
++# $1 string
++# This function gets each "route" section in the UCI configuration and sets each option in the bird4.conf file.
++# $1 is set as the ID of the current UCI route section. Each type of route has its own treatment.
++prepare_routes() {
++ local instance; local prefix; local via; local type
++ local section="$1"
++ local protoInstance="$2"
++ get instance $section
++
++ if [ "$instance" = "$protoInstance" ]; then
++ get type $section
++ case "$type" in
++ "router")
++ get prefix $section
++ get via $section
++ [ -n "$prefix" -a -n "$via" ] && writeToConfig " route $prefix via $via;"
++ ;;
++ "special")
++ get prefix $section
++ get attribute $section
++ [ -n "$prefix" -a -n "$attribute" ] && writeToConfig " route $prefix $attribute;"
++ ;;
++ "iface")
++ get prefix $section
++ get iface $section
++ [ -n "$prefix" -a -n "$iface" ] && writeToConfig ' route '$prefix' via "'$iface'";'
++ ;;
++ "multipath")
++ get prefix $section
++ write " route $prefix multipath" $prefix
++ config_list_foreach $section l_via multipath_list
++ writeToConfig " ;"
++ ;;
++ esac
++ fi
++}
++
++# Function: prepare_kernel $1
++# $1 string
++# This function gets each "kernel" protocol section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI kernel section.
++prepare_kernel() {
++ local section="$1"
++ write "#$section configuration:" $section
++ local disabled; local table; local kernel_table; local import; local export; local scan_time; local persist; local learn
++ get_bool disabled $section
++ get table $section
++ get import $section
++ get export $section
++ get scan_time $section
++ get kernel_table $section
++ get learn $section
++ get persist $section
++ writeToConfig "protocol kernel {"
++ write_bool disabled $disabled
++ write " table $table;" $table
++ write " kernel table $kernel_table;" $kernel_table
++ write_bool learn $learn
++ write_bool persist $persist
++ write " scan time $scan_time;" $scan_time
++ write " import $import;" $import
++ write " export $export;" $export
++ writeToConfig "}"
++ writeToConfig " "
++}
++
++# Function: prepare_static $1
++# $1 string
++# This function gets each "static" protocol section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI static section.
++prepare_static() {
++ local section="$1"
++ local disabled
++ get disabled $section
++ if [ "$disabled" -eq 0 ]; then
++ local table
++ get table $section
++ writeToConfig "#$section configration:" $section
++ writeToConfig "protocol static {"
++ write " table $table;" $table
++ config_foreach prepare_routes 'route' $section
++ writeToConfig "}"
++ writeToConfig " "
++ fi
++}
++
++# Function: prepare_device $1
++# $1 string
++# This function gets each "device" protocol section in the UCI configuration and sets each option in the bird4.conf file.
++# $1 is set as the ID of the current UCI device section.
++prepare_device() {
++ local section="$1"
++ local disabled; local scan_time
++ get disabled $section
++ get scan_time $section
++ write "#$section configuration:" $section
++ writeToConfig "protocol device {"
++ write_bool disabled $disabled
++ write " scan time $scan_time;" $scan_time
++ writeToConfig "}"
++ writeToConfig " "
++}
++
++# Function: prepare_bgp_template $1
++# $1 string
++# This function gets each "bgp_template" protocol section in the UCI configuration and sets each option in the bird4.conf file.
++# $1 is set as the ID of the current UCI bgp_template section.
++# Careful! Template options will be replaced by "instance" options if there is any match.
++prepare_bgp_template() {
++ local section="$1"
++ local disabled; local table; local import; local export; local local_address; local local_as; local neighbor_address; local neighbor_as; local source_address; local next_hop_self; local next_hop_keep; local rr_client; local rr_cluster_id; local import_limit; local import_limit_action; local export_limit; local export_limit_action; local receive_limit; local receive_limit_action
++ get_bool disabled $section
++ get_bool next_hop_self $section
++ get_bool next_hop_keep $section
++ get table $section
++ get import $section
++ get export $section
++ get local_address $section
++ get local_as $section
++ get rr_client $section
++ get rr_cluster_id $section
++ get import_limit $section
++ get import_limit_action $section
++ get export_limit $section
++ get export_limit_action $section
++ get receive_limit $section
++ get receive_limit_action $section
++ get neighbor_address $section
++ get neighbor_as $section
++
++ writeToConfig "#$section template:"
++ writeToConfig "template bgp $section {"
++ [ -n "$disabled" ] && write_bool disabled $disabled
++ write " table $table;" $table
++ write " local as $local_as;" $local_as
++ write " source address $local_address;" $local_address
++ write " import $import;" $import
++ write " export $export;" $export
++ if [ -n "$next_hop_self" ]; then
++ [ "$next_hop_self" = "1" ] && writeToConfig " next hop self;" || writeToConfig "# next hop self;"
++ fi
++ if [ -n "$next_hop_keep" ]; then
++ [ "$next_hop_keep" = "1" ] && writeToConfig " next hop keep;" || writeToConfig "# next hop keep;"
++ fi
++ [ "$rr_client" = "1" ] && writeToConfig " rr client;" || writeToConfig "# rr client;"
++ write " rr cluster id $rr_cluster_id;" $rr_cluster_id
++ if [ -n "$import_limit" -a "$import_limit" > "0" ]; then
++ [ -z "$import_limit_action" ] && $import_limit_action = "warn"
++ writeToConfig " import limit $import_limit action $import_limit_action;"
++ fi
++ if [ -n "$export_limit" -a "$export_limit" > "0" ]; then
++ [ -z "$export_limit_action" ] && $export_limit_action = "warn"
++ writeToConfig " export limit $export_limit action $export_limit_action;"
++ fi
++ if [ -n "$receive_limit" -a "$receive_limit" > "0" ]; then
++ [ -z "$receive_limit_action" ] && $receive_limit_action = "warn"
++ writeToConfig " receive limit $receive_limit action $receive_limit_action;"
++ fi
++ [ -n "$neighbor_address" -a -n "$neighbor_as" ] && writeToConfig " neighbor $neighbor_address as $neighbor_as;"
++ writeToConfig "}"
++ writeToConfig " "
++}
++
++# Function: prepare_bgp $1
++# $1 string
++# This function gets each "bgp" protocol section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI bgp section.
++# Careful! The options set in bgp instances overlap bgp_template ones.
++prepare_bgp() {
++ local section="$1"
++ local disabled; local table; local template; local description; local import; local export; local local_address; local local_as; local neighbor_address; local neighbor_as; local rr_client; local rr_cluster_id; local import_limit; local import_limit_action; local export_limit; local export_limit_action; local receive_limit; local receive_limit_action
++ get disabled $section
++ get table $section
++ get template $section
++ get description $section
++ get import $section
++ get export $section
++ get local_address $section
++ get local_as $section
++ get rr_client $section
++ get rr_cluster_id $section
++ get import_limit $section
++ get import_limit_action $section
++ get export_limit $section
++ get export_limit_action $section
++ get receive_limit $section
++ get receive_limit_action $section
++ get neighbor_address $section
++ get neighbor_as $section
++
++ writeToConfig "#$section configuration:"
++ [ -n "$template" ] && writeToConfig "protocol bgp $section from $template {" || writeToConfig "protocol bgp $section {"
++ [ -n "$disabled" ] && write_bool disabled $disabled
++ write " table $table;" $table
++ # [ -n "$description" ] && writeToConfig ' description "'$description'";'
++ write " local as $local_as;" $local_as
++ write " source address $local_address;" $local_address
++ write " import $import;" $import
++ write " export $export;" $export
++ if [ -n "$next_hop_self" ]; then
++ [ "$next_hop_self" = "1" ] && writeToConfig " next hop self;" || writeToConfig "# next hop self;"
++ fi
++ if [ -n "$next_hop_keep" ]; then
++ [ "$next_hop_keep" = "1" ] && writeToConfig " next hop keep;" || writeToConfig "# next hop keep;"
++ fi
++ [ "$rr_client" = "1" ] && writeToConfig " rr client;" || writeToConfig "# rr client;"
++ write " rr cluster id $rr_cluster_id;" $rr_cluster_id
++ if [ -n "$import_limit" -a "$import_limit" > "0" ]; then
++ [ -z "$import_limit_action" ] && $import_limit_action = "warn"
++ writeToConfig " import limit $import_limit action $import_limit_action;"
++ fi
++ if [ -n "$export_limit" -a "$export_limit" > "0" ]; then
++ [ -z "$export_limit_action" ] && $export_limit_action = "warn"
++ writeToConfig " export limit $export_limit action $export_limit_action;"
++ fi
++ if [ -n "$receive_limit" -a "$receive_limit" > "0" ]; then
++ [ -z "$receive_limit_action" ] && $receive_limit_action = "warn"
++ writeToConfig " receive limit $receive_limit action $receive_limit_action;"
++ fi
++ [ -n "$neighbor_address" -a -n "$neighbor_as" ] && writeToConfig " neighbor $neighbor_address as $neighbor_as;"
++ writeToConfig "}"
++ writeToConfig " "
++}
++
++# Function: prepare_bgp_filters $1
++# $1 string
++# This function gets each "bgp_filter" protocol section in the UCI configuration and sets each option in the bird4.conf file.
++# $1 is set as the ID of the current UCI bgp_filter section.
++# This function checks if the filter file exists and, in that case, it writes its content to the configuration file.
++prepare_bgp_filters() {
++ local section="$1"
++ local type
++ local file_path
++ get type $section
++ get file_path $section
++ if [ -e "$file_path" ]; then
++ local filter_content=`cat $file_path`
++ if [ -n "$type" -a "$type" = "bgp" ]; then
++ writeToConfig "#Filter $section:"
++ writeToConfig "${filter_content}"
++ writeToConfig " "
++ fi
++ fi
++}
++
++start() {
++ config_load bird4
++ local use_UCI_config
++ get use_UCI_config 'bird'
++
++ if [ -z "$use_UCI_config" -o "$use_UCI_config" = "0" ]; then
++ service_start $BIRD_BIN -d -c $BIRD_CONFIG -P $SERVICE_PID_FILE
++ else
++ #Set Bird4 configuration location:
++ local UCI_config_File
++ get UCI_config_File 'bird'
++ BIRD_CONFIG=${UCI_config_File:-/tmp/bird4.conf}
++ #Setup the basic configuration
++ prepare_global 'global'
++ config_foreach prepare_kernel 'kernel'
++ config_foreach prepare_static 'static'
++ config_foreach prepare_device 'device'
++ #config_foreach prepare_direct 'direct'
++
++ #Setup the protocols configuration (currently BGP only)
++ config_foreach prepare_bgp_template 'bgp_template'
++ config_foreach prepare_bgp 'bgp'
++ config_foreach prepare_bgp_filters 'filter'
++ #Start the service
++ service_start $BIRD_BIN -d -c $BIRD_CONFIG -P $SERVICE_PID_FILE
++ fi
++}
++
++stop() {
++ service_stop $BIRD_BIN
++}
++
++restart() {
++ stop
++ start
++}
++
++
++reload() {
++ service_reload $BIRD_BIN
++}
+diff --git a/feeds/routing/bird-openwrt/bird4-openwrt/src/model/bgp_proto.lua b/feeds/routing/bird-openwrt/bird4-openwrt/src/model/bgp_proto.lua
+new file mode 100644
+index 0000000..f546cbb
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird4-openwrt/src/model/bgp_proto.lua
+@@ -0,0 +1,239 @@
++--[[
++Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++BGP/Bird integration with OpenWRT and QMP
++
++This program is free software: you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation, either version 3 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program. If not, see <http://www.gnu.org/licenses/>.
++--]]
++
++require("luci.sys")
++local http = require "luci.http"
++local uci = require "luci.model.uci"
++local uciout = uci.cursor()
++
++m=Map("bird4", "Bird4 BGP protocol's configuration")
++
++tab_templates = {}
++uciout:foreach('bird4', 'bgp_template', function (s)
++ local name = s[".name"]
++ if (name ~= nil) then
++ table.insert(tab_templates, name)
++ end
++end)
++
++-- Section BGP Templates
++
++sect_templates = m:section(TypedSection, "bgp_template", "BGP Templates", "Configuration of the templates used in BGP instances.")
++sect_templates.addremove = true
++sect_templates.anonymous = false
++
++disabled = sect_templates:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
++disabled.optional=true
++table = sect_templates:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
++table.optional=true
++uciout:foreach("bird4", "table",
++ function (s)
++ table:value(s.name)
++ end)
++table:value("")
++
++import = sect_templates:option(Value, "import", "Import","")
++import.optional=true
++export = sect_templates:option(Value, "export", "Export", "")
++export.optional=true
++
++source_addr = sect_templates:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
++source_addr.optional = true
++
++description = sect_templates:option(TextValue, "description", "Description", "Description of the current BGP instance")
++description.optional = true
++
++next_hop_self = sect_templates:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
++next_hop_self.default = nil
++next_hop_self.optional = true
++
++next_hop_keep = sect_templates:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
++next_hop_keep.default = nil
++next_hop_keep.optional = true
++
++rr_client = sect_templates:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
++rr_client.default = nil
++rr_client.optional = true
++
++rr_cluster_id = sect_templates:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
++rr_cluster_id.optional = true
++
++import_limit = sect_templates:option(Value, "import_limit", "Routes import limit", "Specify an import route limit. By default is disabled '0'")
++import_limit.default= "0"
++import_limit.optional = true
++
++import_limit_action = sect_templates:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
++import_limit_action:value("warn")
++import_limit_action:value("block")
++import_limit_action:value("disable")
++import_limit_action:value("restart")
++import_limit_action.default = "warn"
++import_limit_action.optional = true
++
++export_limit = sect_templates:option(Value, "export_limit", "Routes export limit", "Specify an export route limit. By default is disabled '0'")
++export_limit.default="0"
++export_limit.optional = true
++
++export_limit_action = sect_templates:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
++export_limit_action:value("warn")
++export_limit_action:value("block")
++export_limit_action:value("disable")
++export_limit_action:value("restart")
++export_limit_action.default = "warn"
++export_limit_action.optional = true
++
++receive_limit = sect_templates:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit. By default is disabled '0'")
++receive_limit.default="0"
++receive_limit.optional = true
++
++receive_limit_action = sect_templates:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
++receive_limit_action:value("warn")
++receive_limit_action:value("block")
++receive_limit_action:value("disable")
++receive_limit_action:value("restart")
++receive_limit_action.default = "warn"
++receive_limit_action.optional = true
++
++
++local_address = sect_templates:option(Value, "local_address", "Local BGP address", "")
++local_address.optional=true
++local_as = sect_templates:option(Value, "local_as", "Local AS", "")
++local_as.optional=true
++
++-- Section BGP Instances:
++
++sect_instances = m:section(TypedSection, "bgp", "BGP Instances", "Configuration of the BGP protocol instances")
++sect_instances.addremove = true
++sect_instances.anonymous = false
++
++templates = sect_instances:option(ListValue, "template", "Templates", "Available BGP templates")
++
++uciout:foreach("bird4", "bgp_template",
++ function(s)
++ templates:value(s[".name"])
++ end)
++templates:value("")
++
++source_addr = sect_instances:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
++source_addr.optional = true
++
++description = sect_instances:option(TextValue, "description", "Description", "Description of the current BGP instance")
++description.optional = true
++
++next_hop_self = sect_instances:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
++next_hop_self.default = nil
++next_hop_self.optional = true
++
++next_hop_keep = sect_instances:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
++next_hop_keep.default = nil
++next_hop_keep.optional = true
++
++rr_client = sect_instances:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
++rr_client.default = nil
++rr_client.optional = true
++
++rr_cluster_id = sect_instances:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
++rr_cluster_id.optional = true
++
++import_limit = sect_instances:option(Value, "import_limit", "Routes import limit", "Specify an import route limit. By default is disabled '0'")
++import_limit.default="0"
++import_limit.optional = true
++
++import_limit_action = sect_instances:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
++import_limit_action:value("warn")
++import_limit_action:value("block")
++import_limit_action:value("disable")
++import_limit_action:value("restart")
++import_limit_action.default = "warn"
++import_limit_action.optional = true
++
++export_limit = sect_instances:option(Value, "export_limit", "Routes export limit", "Specify an export route limit. By default is disabled '0'")
++export_limit.default="0"
++export_limit.optional = true
++
++export_limit_action = sect_instances:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
++export_limit_action:value("warn")
++export_limit_action:value("block")
++export_limit_action:value("disable")
++export_limit_action:value("restart")
++export_limit_action.default = "warn"
++export_limit_action.optional = true
++
++receive_limit = sect_instances:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit. By default is disabled '0'")
++receive_limit.default="0"
++receive_limit.optional = true
++
++receive_limit_action = sect_instances:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
++receive_limit_action:value("warn")
++receive_limit_action:value("block")
++receive_limit_action:value("disable")
++receive_limit_action:value("restart")
++receive_limit_action.default = "warn"
++receive_limit_action.optional = true
++
++
++neighbor_address = sect_instances:option(Value, "neighbor_address", "Neighbor IP Address", "")
++neighbor_as = sect_instances:option(Value, "neighbor_as", "Neighbor AS", "")
++
++disabled = sect_instances:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
++disabled.optional=true
++disabled.default=nil
++table = sect_instances:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
++table.optional=true
++uciout:foreach("bird4", "table",
++ function (s)
++ table:value(s.name)
++ end)
++table:value("")
++
++import = sect_instances:option(Value, "import", "Import","")
++import.optional=true
++export = sect_instances:option(Value, "export", "Export", "")
++export.optional=true
++local_address = sect_instances:option(Value, "local_address", "Local BGP address", "")
++local_address.optional=true
++local_as = sect_instances:option(Value, "local_as", "Local AS", "")
++local_as.optional=true
++
++-- Section BGP Filters
++
++sect_filters = m:section(TypedSection, "filter", "BGP Filters", "Filters of the BGP instances")
++sect_filters.addremove = true
++sect_filters.anonymous = false
++sect_filters:depends("type", "bgp")
++
++instance = sect_filters:option(ListValue, "instance", "BGP instance", "Filter's BGP instance")
++instance:depends("type", "bgp")
++
++uciout:foreach("bird4", "bgp",
++ function (s)
++ instance:value(s[".name"])
++ end)
++
++type = sect_filters:option(Value, "type", "Filter type", "")
++type.default = "bgp"
++
++path = sect_filters:option(Value, "file_path", "Filter's file path", "Path to the Filter's file")
++path:depends("type", "bgp")
++
++function m.on_commit(self,map)
++ luci.sys.call('/etc/init.d/bird4 stop; /etc/init.d/bird4 start')
++end
++
++return m
++
+diff --git a/feeds/routing/bird-openwrt/bird4-openwrt/src/model/gen_proto.lua b/feeds/routing/bird-openwrt/bird4-openwrt/src/model/gen_proto.lua
+new file mode 100644
+index 0000000..91dc470
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird4-openwrt/src/model/gen_proto.lua
+@@ -0,0 +1,200 @@
++--[[
++Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++BGP/Bird integration with OpenWRT and QMP
++
++This program is free software: you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation, either version 3 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program. If not, see <http://www.gnu.org/licenses/>.
++--]]
++
++require("luci.sys")
++local http = require "luci.http"
++local uci = require "luci.model.uci"
++local uciout = uci.cursor()
++
++m=Map("bird4", "Bird4 general protocol's configuration.")
++
++-- Optional parameters lists
++local protoptions = {
++ {["name"]="table", ["help"]="Auxiliar table for routing", ["depends"]={"static","kernel"}},
++ {["name"]="import", ["help"]="Set if the protocol must import routes", ["depends"]={"kernel"}},
++ {["name"]="export", ["help"]="Set if the protocol must export routes", ["depends"]={"kernel"}},
++ {["name"]="scan_time", ["help"]="Time between scans", ["depends"]={"kernel","device"}},
++ {["name"]="kernel_table", ["help"]="Set which table must be used as auxiliar kernel table", ["depends"]={"kernel"}},
++ {["name"]="learn", ["help"]="Learn routes", ["depends"]={"kernel"}},
++ {["name"]="persist", ["help"]="Store routes. After a restart, routes will be still configured", ["depends"]={"kernel"}}
++}
++
++local routeroptions = {
++ {["name"]="prefix",["help"]="",["depends"]={"router","special","iface","multipath","recursive"}},
++ {["name"]="via",["help"]="",["depends"]={"router","multipath"}},
++ {["name"]="attribute",["help"]="",["depends"]={"special"}},
++ {["name"]="iface",["help"]="",["depends"]={"iface"}},
++ {["name"]="ip",["help"]="",["depends"]={"recursive"}}
++}
++
++--
++-- KERNEL PROTOCOL
++--
++
++sect_kernel_protos = m:section(TypedSection, "kernel", "Kernel options", "Configuration of the kernel protocols. First Instance MUST be Primary table (no table or kernel_table fields).")
++sect_kernel_protos.addremove = true
++sect_kernel_protos.anonymous = false
++
++-- Default kernel parameters
++
++disabled = sect_kernel_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
++disabled.default=0
++
++-- Optional parameters
++for _,o in ipairs(protoptions) do
++ if o.name ~= nil then
++ for _, d in ipairs(o.depends) do
++ if d == "kernel" then
++ if o.name == "learn" or o.name == "persist" then
++ value = sect_kernel_protos:option(Flag, o.name, translate(o.name), translate(o.help))
++ elseif o.name == "table" then
++ value = sect_kernel_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
++ uciout:foreach("bird4", "table",
++ function (s)
++ value:value(s.name)
++ end)
++ value:value("")
++ else
++ value = sect_kernel_protos:option(Value, o.name, translate(o.name), translate(o.help))
++ end
++ value.optional = true
++ value.rmempty = true
++ end
++ end
++
++ end
++end
++
++--
++-- DEVICE PROTOCOL
++--
++
++sect_device_protos = m:section(TypedSection, "device", "Device options", "Configuration of the device protocols.")
++sect_device_protos.addremove = true
++sect_device_protos.anonymous = false
++
++-- Default kernel parameters
++
++disabled = sect_device_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
++disabled.default=0
++
++-- Optional parameters
++for _,o in ipairs(protoptions) do
++ if o.name ~= nil then
++ for _, d in ipairs(o.depends) do
++ if d == "device" then
++ value = sect_device_protos:option(Value, o.name, translate(o.name), translate(o.help))
++ value.optional = true
++ value.rmempty = true
++ end
++ end
++ end
++end
++
++--
++-- STATIC PROTOCOL
++--
++
++sect_static_protos = m:section(TypedSection, "static", "Static options", "Configuration of the static protocols.")
++sect_static_protos.addremove = true
++sect_static_protos.anonymous = false
++
++-- Default kernel parameters
++
++disabled = sect_static_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
++disabled.default=0
++
++-- Optional parameters
++for _,o in ipairs(protoptions) do
++ if o.name ~= nil then
++ for _, d in ipairs(o.depends) do
++ if d == "static" then
++ if o.name == "table" then
++ value = sect_static_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
++ uciout:foreach("bird4", "table",
++ function (s)
++ value:value(s.name)
++ end)
++ value:value("")
++ else
++ value = sect_static_protos:option(Value, o.name, translate(o.name), translate(o.help))
++ end
++ value.optional = true
++ value.rmempty = true
++ end
++ end
++ end
++end
++
++--
++-- ROUTES FOR STATIC PROTOCOL
++--
++
++
++sect_routes = m:section(TypedSection, "route", "Routes configuration", "Configuration of the routes used in static protocols.")
++sect_routes.addremove = true
++sect_routes.anonymous = true
++
++instance = sect_routes:option(ListValue, "instance", "Route instance", "")
++i = 0
++
++uciout:foreach("bird4", "static",
++ function (s)
++ instance:value(s[".name"])
++ end)
++
++prefix = sect_routes:option(Value, "prefix", "Route prefix", "")
++
++type = sect_routes:option(ListValue, "type", "Type of route", "")
++type:value("router")
++type:value("special")
++type:value("iface")
++type:value("recursive")
++type:value("multipath")
++
++valueVia = sect_routes:option(Value, "via", "Via", "")
++valueVia.optional = false
++valueVia:depends("type", "router")
++valueVia.datatype = "ip4addr"
++
++listVia = sect_routes:option(DynamicList, "l_via", "Via", "")
++listVia:depends("type", "multipath")
++listVia.optional=false
++listVia.datatype = "ip4addr"
++
++attribute = sect_routes:option(Value, "attribute", "Attribute", "Types are: unreachable, prohibit and blackhole")
++attribute:depends("type", "special")
++
++iface = sect_routes:option(ListValue, "iface", "Interface", "")
++iface:depends("type", "iface")
++
++uciout:foreach("wireless", "wifi-iface",
++ function(section)
++ iface:value(section[".name"])
++ end)
++
++ip = sect_routes:option(Value, "ip", "IP address", "")
++ip:depends("type", "ip")
++ip.datatype = [[ or"ip4addr", "ip6addr" ]]
++
++function m.on_commit(self,map)
++ luci.sys.call('/etc/init.d/bird4 stop; /etc/init.d/bird4 start')
++end
++
++return m
++
+diff --git a/feeds/routing/bird-openwrt/bird4-openwrt/src/model/overview.lua b/feeds/routing/bird-openwrt/bird4-openwrt/src/model/overview.lua
+new file mode 100644
+index 0000000..5db66eb
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird4-openwrt/src/model/overview.lua
+@@ -0,0 +1,77 @@
++--[[
++Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++BGP/Bird integration with OpenWRT and QMP
++
++This program is free software: you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation, either version 3 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program. If not, see <http://www.gnu.org/licenses/>.
++]]--
++
++require("luci.sys")
++local http = require "luci.http"
++local uci = require "luci.model.uci"
++local uciout = uci.cursor()
++
++m=Map("bird4", "Bird4 UCI configuration helper", "")
++
++-- Named section: "bird"
++
++s_bird_uci = m:section(NamedSection, "bird", "bird", "Bird4 file settings", "")
++s_bird_uci.addremove = False
++
++uuc = s_bird_uci:option(Flag, "use_UCI_config", "Use UCI configuration", "Use UCI configuration instead of the /etc/bird4.conf file")
++
++ucf = s_bird_uci:option(Value, "UCI_config_File", "UCI File", "Specify the file to place the UCI-translated configuration")
++ucf.default = "/tmp/bird4.conf"
++
++-- Named Section: "table"
++
++s_bird_table = m:section(TypedSection, "table", "Tables configuration", "Configuration of the tables used in the protocols")
++s_bird_table.addremove = true
++s_bird_table.anonymous = true
++
++name = s_bird_table:option(Value, "name", "Table name", "Descriptor ID of the table")
++
++-- Named section: "global"
++
++s_bird_global = m:section(NamedSection, "global", "global", "Global options", "Basic Bird4 settings")
++s_bird_global.addremove = False
++
++id = s_bird_global:option(Value, "router_id", "Router ID", "Identification number of the router. By default, is the router's IP.")
++
++lf = s_bird_global:option(Value, "log_file", "Log File", "File used to store log related data.")
++
++l = s_bird_global:option(MultiValue, "log", "Log", "Set which elements do you want to log.")
++l:value("all", "All")
++l:value("info", "Info")
++l:value("warning","Warning")
++l:value("error","Error")
++l:value("fatal","Fatal")
++l:value("debug","Debug")
++l:value("trace","Trace")
++l:value("remote","Remote")
++l:value("auth","Auth")
++
++d = s_bird_global:option(MultiValue, "debug", "Debug", "Set which elements do you want to debug.")
++d:value("all", "All")
++d:value("states","States")
++d:value("routes","Routes")
++d:value("filters","Filters")
++d:value("interfaces","Interfaces")
++d:value("events","Events")
++d:value("packets","Packets")
++
++function m.on_commit(self,map)
++ luci.sys.call('/etc/init.d/bird4 stop; /etc/init.d/bird4 start')
++end
++
++return m
+diff --git a/feeds/routing/bird-openwrt/bird4-openwrt/src/uci-defaults/bird4-uci-install-init.d b/feeds/routing/bird-openwrt/bird4-openwrt/src/uci-defaults/bird4-uci-install-init.d
+new file mode 100644
+index 0000000..e58a2cf
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird4-openwrt/src/uci-defaults/bird4-uci-install-init.d
+@@ -0,0 +1,7 @@
++#!/bin/sh
++
++EXC=`mount -t overlayfs | grep overlayfs -c`
++
++[ $EXC > 0 ] && rm -r /etc/init.d/bird4 || mv /etc/init.d/bird4 /etc/bird4/init.d/bird4.orig
++
++ln -s /etc/bird4/init.d/bird4 /etc/init.d/bird4
+diff --git a/feeds/routing/bird-openwrt/bird6-openwrt/Makefile b/feeds/routing/bird-openwrt/bird6-openwrt/Makefile
+new file mode 100644
+index 0000000..74c2423
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird6-openwrt/Makefile
+@@ -0,0 +1,92 @@
++# Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++# BGP/Bird integration with OpenWRT and QMP
++#
++# This program is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++BIRD:=bird6
++PKG_NAME:=$(BIRD)-openwrt
++PKG_RELEASE:=0.2
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++PKG_LICENSE:=GPL-3.0+
++uci:=$(BIRD)-uci
++luci:=luci-app-$(BIRD)
++
++
++include $(INCLUDE_DIR)/package.mk
++
++define Build/Prepare
++endef
++define Build/Compile
++endef
++
++define Package/$(uci)
++ TITLE:=The BIRD UCI module
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
++ URL:=https://github.com/eloicaso/bird6-openwrt/
++ DEPENDS:=+$(BIRD) +libuci +uci
++endef
++
++define Package/$(uci)/description
++$(BIRD) UCI integration module
++endef
++
++define Package/$(uci)/install
++ $(INSTALL_DIR) $(1)/etc/$(BIRD)/init.d
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_BIN) ./src/init.d/$(BIRD) $(1)/etc/$(BIRD)/init.d/
++ $(CP) ./src/uci-defaults/$(uci)-install-init.d $(1)/etc/$(BIRD)/init.d/
++ $(CP) ./src/config/$(BIRD) $(1)/etc/config/
++endef
++
++define Package/$(uci)/postinst
++#!/bin/sh
++if [ -z $${IPKG_INSTROOT} ]; then
++ ( . /etc/bird6/init.d/bird6-uci-install-init.d ) && rm -f /etc/bird6/init.d/bird6-uci-install-init.d
++fi
++endef
++
++
++$(eval $(call BuildPackage,$(uci)))
++
++
++
++define Package/$(luci)
++ TITLE:=LuCI support for $(BIRD)
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=3. Applications
++ MAINTAINER:=Eloi Carbo <eloicaso@openmailbox.org>
++ URL:=https://github.com/eloicaso/bird6-openwrt/
++ DEPENDS:=+$(BIRD)-uci +luci-base
++endef
++
++define Package/$(luci)/description
++$(BIRD) application for LuCI
++endef
++
++define Package/$(luci)/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller/
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
++ $(CP) ./src/model/* $(1)/usr/lib/lua/luci/model/cbi/$(BIRD)/
++ $(CP) ./src/controller/* $(1)/usr/lib/lua/luci/controller/
++endef
++
++$(eval $(call BuildPackage,$(luci)))
+diff --git a/feeds/routing/bird-openwrt/bird6-openwrt/src/config/bird6 b/feeds/routing/bird-openwrt/bird6-openwrt/src/config/bird6
+new file mode 100644
+index 0000000..134b44f
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird6-openwrt/src/config/bird6
+@@ -0,0 +1,80 @@
++config bird 'bird'
++ option use_UCI_config '1'
++ #Caution! Enabling this option, Bird will translate this
++ #UCI file and use it instead of /etc/bird6.conf
++
++ option UCI_config_file '/tmp/bird6.conf'
++ #If you enable useUCIconfig, UCIconfigFile will be Bird's
++ #configuration file location.
++
++config global 'global'
++ option log_file '/tmp/bird6.log'
++ option log 'all'
++ option debug 'off'
++ option router_id 'fc00::1:5'
++ option listen_bgp_addr 'fc00::1:5'
++ option listen_bgp_port '179'
++ option listen_bgp_dual '1'
++
++config table
++ option name 'aux'
++
++config kernel kernel1
++ option table 'aux'
++ option import 'all'
++ option export 'all'
++ option kernel_table '100'
++ option scan_time '10'
++ option learn '1'
++ option persist '0'
++ option disabled '0'
++
++config device device1
++ option scan_time '10'
++ option disabled '0'
++
++config static static1
++ option table 'aux'
++ option disabled '0'
++
++config bgp bgp1
++ option template 'bgp_common'
++ option description 'Description of the BGP instance'
++ option neighbor_address 'fc00::1:5'
++ option neighbor_as '65530'
++ option next_hop_self '0'
++ option next_hop_keep '0'
++ option rr_client '1'
++ option rr_cluster_id 'fc00::1:5'
++
++config bgp_template bgp_common
++ option table 'aux'
++ option import 'all'
++ option export 'all'
++ option local_address '2001:B30:1000:19::2'
++ option local_as '65001'
++ option import_limit '100'
++ option import_limit_action 'warn'
++ option export_limit '100'
++ option export_limit_action 'warn'
++ option receive_limit '100'
++ option receive_limit_action 'warn'
++ option disabled '0'
++
++config route
++ option instance 'static1'
++ option type 'router'
++ option prefix '2001:db8:0:f103::/64'
++ option via 'fe80::225:90ff:fe97:a718'
++
++config route
++ option instance 'static1'
++ option type 'special'
++ option prefix '2001:db8:0:f101::/128'
++ option attribute 'unreachable'
++
++config route
++ option instance 'static1'
++ option type 'iface'
++ option prefix '2001:db8:0:f101::1111/128'
++ option iface 'eth0'
+diff --git a/feeds/routing/bird-openwrt/bird6-openwrt/src/controller/bird6.lua b/feeds/routing/bird-openwrt/bird6-openwrt/src/controller/bird6.lua
+new file mode 100644
+index 0000000..5ee2729
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird6-openwrt/src/controller/bird6.lua
+@@ -0,0 +1,27 @@
++--[[
++Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++BGP/Bird integration with OpenWRT and QMP
++
++This program is free software: you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation, either version 3 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program. If not, see <http://www.gnu.org/licenses/>.
++--]]
++
++module("luci.controller.bird6", package.seeall)
++
++function index()
++ entry({"admin","network","bird6"}, cbi("bird6/overview"), "Bird6", 1).dependent=false
++ entry({"admin","network","bird6","overview"}, cbi("bird6/overview"), "Overview", 2).dependent=false
++ entry({"admin","network","bird6","proto_general"}, cbi("bird6/gen_proto"), "General protocols", 3).dependent=false
++ entry({"admin","network","bird6","proto_bgp"}, cbi("bird6/bgp_proto"), "BGP Protocol", 4).dependent=false
++end
++
+diff --git a/feeds/routing/bird-openwrt/bird6-openwrt/src/init.d/bird6 b/feeds/routing/bird-openwrt/bird6-openwrt/src/init.d/bird6
+new file mode 100755
+index 0000000..ed99d27
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird6-openwrt/src/init.d/bird6
+@@ -0,0 +1,421 @@
++#!/bin/sh /etc/rc.common
++
++# Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++# BGP/Bird integration with OpenWRT and QMP
++#
++# This program is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 3 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++#
++
++BIRD="bird6"
++BIRD_CONFIG="/etc/$BIRD.conf"
++
++START=99
++STOP=10
++
++SERVICE_DAEMONIZE=1
++SERVICE_USE_PID=1
++SERVICE_PID_FILE="/var/run/$BIRD.pid"
++
++BIRD_BIN="/usr/sbin/$BIRD"
++
++
++# Function: writeToConfig $1
++# $1 string.
++# Allows to write in the $BIRD_CONFIG file, the string $1. This function does not check the $1 string.
++# Example: writeToConfig "value: $N"
++writeToConfig() {
++ echo "$1" >> $BIRD_CONFIG
++}
++
++# Function: write $1 $2
++# $1 string. $2 string.
++# This function checks if $2 is empty. If not, it writes the string $1 in the $BIRD_CONFIG file.
++# Use write function to check if $1, value found inside $2, is not empty and can be written in the configuration file.
++# Example:
++N=""; write "value: $N" $N;
++write() {
++ [ -n "$2" ] && writeToConfig "$1"
++}
++
++#Function: write_bool $1 $2
++# $1 string; $2 boolean
++# This function checks if $2 is true or false and write the $1 string into $BIRD_CONFIG file.
++# The function writes a # before the $2 string if its false.
++# Example: local N=0; write_bool $N
++write_bool() {
++ [ "$2" == 0 ] && writeToConfig "# $1;" || writeToConfig " $1;"
++}
++
++# Function: get $1 $2
++# $1 string. $2 string
++# This function uses the external UCI function "config_get $result $section $option" to obtain a string value from UCI config file.
++# To use this function, use the same name of the UCI option for the variable.
++# Example: UCI (option id 'abcd'); local id; get id $section
++get() {
++ config_get $1 $2 $1
++}
++
++# Function: get_bool $1 $2
++# $1 boolean. $2 string
++# This function uses the external UCI function "config_get_bool $result $section $option" to obtain a boolean value from UCI config file.
++# To use this function, use the same name of the UCI option for the variable $1.
++# Example: UCI (option use_ipv6 '1'); local use_ipv6; get use_ipv6 $section
++get_bool() {
++ config_get_bool $1 $2 $1
++}
++
++# Function: multipath_list $1
++# $1 string
++# This function writes the $1 string in the multipath routes.
++multipath_list() {
++ write " via $1" $1
++}
++
++# Function: prepare_tables $1
++# $1 string
++# This function gets each "table" section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI table section
++prepare_tables() {
++ local section="$1"; local name
++ get name $section
++ write "table $name;" $name
++}
++
++# Function: prepare_global $1
++# $1 string
++# This function gets each "global" section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI global section. prepare_global is the first configuration set in the bird6.conf and removes the old file.
++prepare_global () {
++ local section="$1"
++ local log_file; local log; local debug; local router_id; local table; local listen_bgp_addr; local listen_bgp_port; local listen_bgp_dual
++
++ # Remove old configuration file
++ rm -f "$BIRD_CONFIG"
++
++ get log_file $section
++ get log $section
++ get debug $section
++ get router_id $section
++ get table $section
++ get listen_bgp_addr $section
++ get listen_bgp_port $section
++ get listen_bgp_dual $section
++
++ # First line of the NEW configuration file
++ echo "#Bird6 configuration using UCI:" > $BIRD_CONFIG
++ writeToConfig " "
++ [ -n "$log_file" -a -n "$log" ] && writeToConfig 'log "'$log_file'" '$log';'
++ write "debug protocols $debug;" $debug
++ writeToConfig " "
++ writeToConfig "#Router ID"
++ write "router id $router_id;" $router_id
++ writeToConfig " "
++ writeToConfig "#Secondary tables"
++ config_foreach prepare_tables 'table'
++ if [ -n "$listen_bgp_dual" -o "$listen_bgp_dual" = "0" ]; then
++ writeToConfig "listen bgp $listen_bgp_addr $listen_bgp_port v6only;"
++ else
++ writeToConfig "listen bgp $listen_bgp_addr $listen_bgp_port dual;"
++ fi
++ writeToConfig " "
++}
++
++# Function: prepare_routes $1
++# $1 string
++# This function gets each "route" section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI route section. Each type of route has its own treatment.
++prepare_routes() {
++ local instance; local prefix; local via; local type
++ local section="$1"
++ local protoInstance="$2"
++ get instance $section
++
++ if [ "$instance" = "$protoInstance" ]; then
++ get type $section
++ case "$type" in
++ "router")
++ get prefix $section
++ get via $section
++ [ -n "$prefix" -a -n "$via" ] && writeToConfig " route $prefix via $via;"
++ ;;
++ "special")
++ get prefix $section
++ get attribute $section
++ [ -n "$prefix" -a -n "$attribute" ] && writeToConfig " route $prefix $attribute;"
++ ;;
++ "iface")
++ get prefix $section
++ get iface $section
++ [ -n "$prefix" -a -n "$iface" ] && writeToConfig ' route '$prefix' via "'$iface'";'
++ ;;
++ "multipath")
++ get prefix $section
++ write " route $prefix multipath" $prefix
++ config_list_foreach $section l_via multipath_list
++ writeToConfig " ;"
++ ;;
++ esac
++ fi
++}
++
++# Function: prepare_kernel $1
++# $1 string
++# This function gets each "kernel" protocol section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI kernel section.
++prepare_kernel() {
++ local section="$1"
++ write "#$section configuration:" $section
++ local disabled; local table; local kernel_table; local import; local export; local scan_time; local persist; local learn
++ get_bool disabled $section
++ get table $section
++ get import $section
++ get export $section
++ get scan_time $section
++ get kernel_table $section
++ get learn $section
++ get persist $section
++ writeToConfig "protocol kernel {"
++ write_bool disabled $disabled
++ write " table $table;" $table
++ write " kernel table $kernel_table;" $kernel_table
++ write_bool learn $learn
++ write_bool persist $persist
++ write " scan time $scan_time;" $scan_time
++ write " import $import;" $import
++ write " export $export;" $export
++ writeToConfig "}"
++ writeToConfig " "
++}
++
++# Function: prepare_static $1
++# $1 string
++# This function gets each "static" protocol section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI static section.
++prepare_static() {
++ local section="$1"
++ local disabled
++ get disabled $section
++ if [ "$disabled" -eq 0 ]; then
++ local table
++ get table $section
++ writeToConfig "#$section configration:" $section
++ writeToConfig "protocol static {"
++ write " table $table;" $table
++ config_foreach prepare_routes 'route' $section
++ writeToConfig "}"
++ writeToConfig " "
++ fi
++}
++
++# Function: prepare_device $1
++# $1 string
++# This function gets each "device" protocol section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI device section.
++prepare_device() {
++ local section="$1"
++ local disabled; local scan_time
++ get disabled $section
++ get scan_time $section
++ write "#$section configuration:" $section
++ writeToConfig "protocol device {"
++ write_bool disabled $disabled
++ write " scan time $scan_time;" $scan_time
++ writeToConfig "}"
++ writeToConfig " "
++}
++
++# Function: prepare_bgp_template $1
++# $1 string
++# This function gets each "bgp_template" protocol section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI bgp_template section.
++# Careful! Template options will be replaced by "instance" options if there is any match.
++prepare_bgp_template() {
++ local section="$1"
++ local disabled; local table; local import; local export; local local_address; local local_as; local neighbor_address; local neighbor_as; local source_address; local next_hop_self; local next_hop_keep; local rr_client; local rr_cluster_id; local import_limit; local import_limit_action; local export_limit; local export_limit_action; local receive_limit; local receive_limit_action
++ get_bool disabled $section
++ get_bool next_hop_self $section
++ get_bool next_hop_keep $section
++ get table $section
++ get import $section
++ get export $section
++ get local_address $section
++ get local_as $section
++ get rr_client $section
++ get rr_cluster_id $section
++ get import_limit $section
++ get import_limit_action $section
++ get export_limit $section
++ get export_limit_action $section
++ get receive_limit $section
++ get receive_limit_action $section
++ get neighbor_address $section
++ get neighbor_as $section
++
++ writeToConfig "#$section template:"
++ writeToConfig "template bgp $section {"
++ [ -n "$disabled" ] && write_bool disabled $disabled
++ write " table $table;" $table
++ write " local as $local_as;" $local_as
++ write " source address $local_address;" $local_address
++ write " import $import;" $import
++ write " export $export;" $export
++ if [ -n "$next_hop_self" ]; then
++ [ "$next_hop_self" = "1" ] && writeToConfig " next hop self;" || writeToConfig "# next hop self;"
++ fi
++ if [ -n "$next_hop_keep" ]; then
++ [ "$next_hop_keep" = "1" ] && writeToConfig " next hop keep;" || writeToConfig "# next hop keep;"
++ fi
++ [ "$rr_client" = "1" ] && writeToConfig " rr client;" || writeToConfig "# rr client;"
++ write " rr cluster id $rr_cluster_id;" $rr_cluster_id
++ if [ -n "$import_limit" -a "$import_limit" > "0" ]; then
++ [ -z "$import_limit_action" ] && $import_limit_action = "warn"
++ writeToConfig " import limit $import_limit action $import_limit_action;"
++ fi
++ if [ -n "$export_limit" -a "$export_limit" > "0" ]; then
++ [ -z "$export_limit_action" ] && $export_limit_action = "warn"
++ writeToConfig " export limit $export_limit action $export_limit_action;"
++ fi
++ if [ -n "$receive_limit" -a "$receive_limit" > "0" ]; then
++ [ -z "$receive_limit_action" ] && $receive_limit_action = "warn"
++ writeToConfig " receive limit $receive_limit action $receive_limit_action;"
++ fi
++ [ -n "$neighbor_address" -a -n "$neighbor_as" ] && writeToConfig " neighbor $neighbor_address as $neighbor_as;"
++ writeToConfig "}"
++ writeToConfig " "
++}
++
++# Function: prepare_bgp $1
++# $1 string
++# This function gets each "bgp" protocol section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI bgp section.
++# Careful! The options set in bgp instances overlap bgp_template ones.
++prepare_bgp() {
++ local section="$1"
++ local disabled; local table; local template; local description; local import; local export; local local_address; local local_as; local neighbor_address; local neighbor_as; local rr_client; local rr_cluster_id; local import_limit; local import_limit_action; local export_limit; local export_limit_action; local receive_limit; local receive_limit_action
++ get disabled $section
++ get table $section
++ get template $section
++ get description $section
++ get import $section
++ get export $section
++ get local_address $section
++ get local_as $section
++ get rr_client $section
++ get rr_cluster_id $section
++ get import_limit $section
++ get import_limit_action $section
++ get export_limit $section
++ get export_limit_action $section
++ get receive_limit $section
++ get receive_limit_action $section
++ get neighbor_address $section
++ get neighbor_as $section
++
++ writeToConfig "#$section configuration:"
++ [ -n "$template" ] && writeToConfig "protocol bgp $section from $template {" || writeToConfig "protocol bgp $section {"
++ [ -n "$disabled" ] && write_bool disabled $disabled
++ write " table $table;" $table
++ # [ -n "$description" ] && writeToConfig ' description "'$description'";'
++ write " local as $local_as;" $local_as
++ write " source address $local_address;" $local_address
++ write " import $import;" $import
++ write " export $export;" $export
++ if [ -n "$next_hop_self" ]; then
++ [ "$next_hop_self" = "1" ] && writeToConfig " next hop self;" || writeToConfig "# next hop self;"
++ fi
++ if [ -n "$next_hop_keep" ]; then
++ [ "$next_hop_keep" = "1" ] && writeToConfig " next hop keep;" || writeToConfig "# next hop keep;"
++ fi
++ [ "$rr_client" = "1" ] && writeToConfig " rr client;" || writeToConfig "# rr client;"
++ write " rr cluster id $rr_cluster_id;" $rr_cluster_id
++ if [ -n "$import_limit" -a "$import_limit" > "0" ]; then
++ [ -z "$import_limit_action" ] && $import_limit_action = "warn"
++ writeToConfig " import limit $import_limit action $import_limit_action;"
++ fi
++ if [ -n "$export_limit" -a "$export_limit" > "0" ]; then
++ [ -z "$export_limit_action" ] && $export_limit_action = "warn"
++ writeToConfig " export limit $export_limit action $export_limit_action;"
++ fi
++ if [ -n "$receive_limit" -a "$receive_limit" > "0" ]; then
++ [ -z "$receive_limit_action" ] && $receive_limit_action = "warn"
++ writeToConfig " receive limit $receive_limit action $receive_limit_action;"
++ fi
++ [ -n "$neighbor_address" -a -n "$neighbor_as" ] && writeToConfig " neighbor $neighbor_address as $neighbor_as;"
++ writeToConfig "}"
++ writeToConfig " "
++}
++
++# Function: prepare_bgp_filters $1
++# $1 string
++# This function gets each "bgp_filter" protocol section in the UCI configuration and sets each option in the bird6.conf file.
++# $1 is set as the ID of the current UCI bgp_filter section.
++# This function checks if the filter file exists and, in that case, it writes its content to the configuration file.
++prepare_bgp_filters() {
++ local section="$1"
++ local type
++ local file_path
++ get type $section
++ get file_path $section
++ if [ -e "$file_path" ]; then
++ local filter_content=`cat $file_path`
++ if [ -n "$type" -a "$type" = "bgp" ]; then
++ writeToConfig "#Filter $section:"
++ writeToConfig "${filter_content}"
++ writeToConfig " "
++ fi
++ fi
++}
++
++
++start() {
++ config_load bird6
++ local use_UCI_config
++ get use_UCI_config 'bird'
++
++ if [ -z "$use_UCI_config" -o "$use_UCI_config" = "0" ]; then
++ service_start $BIRD_BIN -d -c $BIRD_CONFIG -P $SERVICE_PID_FILE
++ else
++ #Set Bird6 configuration location:
++ local UCI_config_File
++ get UCI_config_File 'bird'
++ BIRD_CONFIG=${UCI_config_File:-/tmp/bird6.conf}
++ #Setup the basic configuration
++ prepare_global 'global'
++ config_foreach prepare_kernel 'kernel'
++ config_foreach prepare_static 'static'
++ config_foreach prepare_device 'device'
++ #config_foreach prepare_direct 'direct'
++
++ #Setup the protocols configuration (currently BGP only)
++ config_foreach prepare_bgp_template 'bgp_template'
++ config_foreach prepare_bgp 'bgp'
++ config_foreach prepare_bgp_filters 'filter'
++ #Start the service
++ service_start $BIRD_BIN -d -c $BIRD_CONFIG -P $SERVICE_PID_FILE
++ fi
++}
++
++stop() {
++ service_stop $BIRD_BIN
++}
++
++restart() {
++ stop
++ start
++}
++
++
++reload() {
++ service_reload $BIRD_BIN
++}
+diff --git a/feeds/routing/bird-openwrt/bird6-openwrt/src/model/bgp_proto.lua b/feeds/routing/bird-openwrt/bird6-openwrt/src/model/bgp_proto.lua
+new file mode 100644
+index 0000000..e243fa6
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird6-openwrt/src/model/bgp_proto.lua
+@@ -0,0 +1,237 @@
++--[[
++Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++BGP/Bird integration with OpenWRT and QMP
++
++This program is free software: you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation, either version 3 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program. If not, see <http://www.gnu.org/licenses/>.
++--]]
++
++require("luci.sys")
++local http = require "luci.http"
++local uci = require "luci.model.uci"
++local uciout = uci.cursor()
++
++m=Map("bird6", "Bird6 BGP protocol's configuration")
++
++tab_templates = {}
++uciout:foreach('bird6', 'bgp_template', function (s)
++ local name = s[".name"]
++ if (name ~= nil) then
++ table.insert(tab_templates, name)
++ end
++end)
++
++-- Section BGP Templates
++
++sect_templates = m:section(TypedSection, "bgp_template", "BGP Templates", "Configuration of the templates used in BGP instances.")
++sect_templates.addremove = true
++sect_templates.anonymous = false
++
++disabled = sect_templates:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
++disabled.optional=true
++table = sect_templates:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
++table.optional=true
++uciout:foreach("bird6", "table",
++ function (s)
++ table:value(s.name)
++ end)
++table:value("")
++
++import = sect_templates:option(Value, "import", "Import","")
++import.optional=true
++export = sect_templates:option(Value, "export", "Export", "")
++export.optional=true
++
++source_addr = sect_templates:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
++source_addr.optional = true
++
++description = sect_templates:option(TextValue, "description", "Description", "Description of the current BGP instance")
++description.optional = true
++
++next_hop_self = sect_templates:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
++next_hop_self.default = nil
++next_hop_self.optional = true
++
++next_hop_keep = sect_templates:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
++next_hop_keep.default = nil
++next_hop_keep.optional = true
++
++rr_client = sect_templates:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
++rr_client.default = nil
++rr_client.optional = true
++
++rr_cluster_id = sect_templates:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
++rr_cluster_id.optional = true
++
++import_limit = sect_templates:option(Value, "import_limit", "Routes import limit", "Specify an import route limit. By default is disabled '0'")
++import_limit.default= "0"
++import_limit.optional = true
++
++import_limit_action = sect_templates:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
++import_limit_action:value("warn")
++import_limit_action:value("block")
++import_limit_action:value("disable")
++import_limit_action:value("restart")
++import_limit_action.default = "warn"
++import_limit_action.optional = true
++
++export_limit = sect_templates:option(Value, "export_limit", "Routes export limit", "Specify an export route limit. By default is disabled '0'")
++export_limit.default="0"
++export_limit.optional = true
++
++export_limit_action = sect_templates:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
++export_limit_action:value("warn")
++export_limit_action:value("block")
++export_limit_action:value("disable")
++export_limit_action:value("restart")
++export_limit_action.default = "warn"
++export_limit_action.optional = true
++
++receive_limit = sect_templates:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit. By default is disabled '0'")
++receive_limit.default="0"
++receive_limit.optional = true
++
++receive_limit_action = sect_templates:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
++receive_limit_action:value("warn")
++receive_limit_action:value("block")
++receive_limit_action:value("disable")
++receive_limit_action:value("restart")
++receive_limit_action.default = "warn"
++receive_limit_action.optional = true
++
++local_address = sect_templates:option(Value, "local_address", "Local BGP address", "")
++local_address.optional=true
++local_as = sect_templates:option(Value, "local_as", "Local AS", "")
++local_as.optional=true
++
++-- Section BGP Instances:
++
++sect_instances = m:section(TypedSection, "bgp", "BGP Instances", "Configuration of the BGP protocol instances")
++sect_instances.addremove = true
++sect_instances.anonymous = false
++
++templates = sect_instances:option(ListValue, "template", "Templates", "Available BGP templates")
++
++uciout:foreach("bird6", "bgp_template",
++ function(s)
++ templates:value(s[".name"])
++ end)
++templates:value("")
++neighbor_address = sect_instances:option(Value, "neighbor_address", "Neighbor IP Address", "")
++neighbor_as = sect_instances:option(Value, "neighbor_as", "Neighbor AS", "")
++
++disabled = sect_instances:option(Flag, "disabled", "Disabled", "Enable/Disable BGP Protocol")
++disabled.optional=true
++disabled.default=nil
++table = sect_instances:option(ListValue, "table", "Table", "Set the table used for BGP Routing")
++table.optional=true
++uciout:foreach("bird6", "table",
++ function (s)
++ table:value(s.name)
++ end)
++table:value("")
++
++description = sect_instances:option(TextValue, "description", "Description", "Description of the current BGP instance")
++description.optional = true
++
++import = sect_instances:option(Value, "import", "Import","")
++import.optional=true
++export = sect_instances:option(Value, "export", "Export", "")
++export.optional=true
++
++source_addr = sect_instances:option(Value, "source_address", "Source Address", "Source address for BGP routing. By default uses Router ID")
++source_addr.optional = true
++
++local_address = sect_instances:option(Value, "local_address", "Local BGP address", "")
++local_address.optional=true
++local_as = sect_instances:option(Value, "local_as", "Local AS", "")
++local_as.optional=true
++
++next_hop_self = sect_instances:option(Flag, "next_hop_self", "Next hop self", "Avoid next hop calculation and advertise own source address as next hop")
++next_hop_self.default = nil
++next_hop_self.optional = true
++
++next_hop_keep = sect_instances:option(Flag, "next_hop_keep", "Next hop keep", "Forward the received Next Hop attribute event in situations where the local address should be used instead, like subneting")
++next_hop_keep.default = nil
++next_hop_keep.optional = true
++
++rr_client = sect_instances:option(Flag, "rr_client", "Route Reflector server", "This router serves as a Route Reflector server and treats neighbors as clients")
++rr_client.default = nil
++rr_client.optional = true
++
++rr_cluster_id = sect_instances:option(Value, "rr_cluster_id", "Route Reflector Cluster ID", "Identificator of the RR cluster. By default uses the Router ID")
++rr_cluster_id.optional = true
++
++import_limit = sect_instances:option(Value, "import_limit", "Routes import limit", "Specify an import route limit. By default is disabled '0'")
++import_limit.default="0"
++import_limit.optional = true
++
++import_limit_action = sect_instances:option(ListValue, "import_limit_action", "Routes import limit action", "Action to take when import routes limit ir reached")
++import_limit_action:value("warn")
++import_limit_action:value("block")
++import_limit_action:value("disable")
++import_limit_action:value("restart")
++import_limit_action.default = "warn"
++import_limit_action.optional = true
++
++export_limit = sect_instances:option(Value, "export_limit", "Routes export limit", "Specify an export route limit. By default is disabled '0'")
++export_limit.default="0"
++export_limit.optional = true
++
++export_limit_action = sect_instances:option(ListValue, "export_limit_action", "Routes export limit action", "Action to take when export routes limit is reached")
++export_limit_action:value("warn")
++export_limit_action:value("block")
++export_limit_action:value("disable")
++export_limit_action:value("restart")
++export_limit_action.default = "warn"
++export_limit_action.optional = true
++
++receive_limit = sect_instances:option(Value, "receive_limit", "Routes received limit", "Specify a received route limit. By default is disabled '0'")
++receive_limit.default="0"
++receive_limit.optional = true
++
++receive_limit_action = sect_instances:option(ListValue, "receive_limit_action", "Routes received limit action", "Action to take when received routes limit is reached")
++receive_limit_action:value("warn")
++receive_limit_action:value("block")
++receive_limit_action:value("disable")
++receive_limit_action:value("restart")
++receive_limit_action.default = "warn"
++receive_limit_action.optional = true
++
++-- Section BGP Filters
++
++sect_filters = m:section(TypedSection, "filter", "BGP Filters", "Filters of the BGP instances")
++sect_filters.addremove = true
++sect_filters.anonymous = false
++sect_filters:depends("type", "bgp")
++
++instance = sect_filters:option(ListValue, "instance", "BGP instance", "Filter's BGP instance")
++instance:depends("type", "bgp")
++
++uciout:foreach("bird6", "bgp",
++ function (s)
++ instance:value(s[".name"])
++ end)
++
++type = sect_filters:option(Value, "type", "Filter type", "")
++type.default = "bgp"
++
++path = sect_filters:option(Value, "file_path", "Filter's file path", "Path to the Filter's file")
++path:depends("type", "bgp")
++
++function m.on_commit(self,map)
++ luci.sys.call('/etc/init.d/bird6 stop; /etc/init.d/bird6 start')
++end
++
++return m
++
+diff --git a/feeds/routing/bird-openwrt/bird6-openwrt/src/model/gen_proto.lua b/feeds/routing/bird-openwrt/bird6-openwrt/src/model/gen_proto.lua
+new file mode 100644
+index 0000000..5299a5b
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird6-openwrt/src/model/gen_proto.lua
+@@ -0,0 +1,201 @@
++--[[
++Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++BGP/Bird integration with OpenWRT and QMP
++
++This program is free software: you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation, either version 3 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program. If not, see <http://www.gnu.org/licenses/>.
++--]]
++
++require("luci.sys")
++local http = require "luci.http"
++local uci = require "luci.model.uci"
++local uciout = uci.cursor()
++
++m=Map("bird6", "Bird6 general protocol's configuration.")
++
++-- Optional parameters lists
++local protoptions = {
++ {["name"]="table", ["help"]="Auxiliar table for routing", ["depends"]={"static","kernel"}},
++ {["name"]="import", ["help"]="Set if the protocol must import routes", ["depends"]={"kernel"}},
++ {["name"]="export", ["help"]="Set if the protocol must export routes", ["depends"]={"kernel"}},
++ {["name"]="scan_time", ["help"]="Time between scans", ["depends"]={"kernel","device"}},
++ {["name"]="kernel_table", ["help"]="Set which table must be used as auxiliar kernel table", ["depends"]={"kernel"}},
++ {["name"]="learn", ["help"]="Learn routes", ["depends"]={"kernel"}},
++ {["name"]="persist", ["help"]="Store routes. After a restart, routes will be still configured", ["depends"]={"kernel"}}
++}
++
++local routeroptions = {
++ {["name"]="prefix",["help"]="",["depends"]={"router","special","iface","multipath","recursive"}},
++ {["name"]="via",["help"]="",["depends"]={"router","multipath"}},
++ {["name"]="attribute",["help"]="",["depends"]={"special"}},
++ {["name"]="iface",["help"]="",["depends"]={"iface"}},
++ {["name"]="ip",["help"]="",["depends"]={"recursive"}}
++}
++
++--
++-- KERNEL PROTOCOL
++--
++
++sect_kernel_protos = m:section(TypedSection, "kernel", "Kernel options", "Configuration of the kernel protocols. First Instance MUST be Primary table (no table or kernel_table fields).")
++sect_kernel_protos.addremove = true
++sect_kernel_protos.anonymous = false
++
++-- Default kernel parameters
++
++disabled = sect_kernel_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
++disabled.default=0
++
++-- Optional parameters
++for _,o in ipairs(protoptions) do
++ if o.name ~= nil then
++ for _, d in ipairs(o.depends) do
++ if d == "kernel" then
++ if o.name == "learn" or o.name == "persist" then
++ value = sect_kernel_protos:option(Flag, o.name, translate(o.name), translate(o.help))
++ elseif o.name == "table" then
++ value = sect_kernel_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
++ uciout:foreach("bird6", "table",
++ function (s)
++ value:value(s.name)
++ end)
++ value:value("")
++ else
++ value = sect_kernel_protos:option(Value, o.name, translate(o.name), translate(o.help))
++ end
++ value.optional = true
++ value.rmempty = true
++ end
++ end
++
++ end
++end
++
++--
++-- DEVICE PROTOCOL
++--
++
++sect_device_protos = m:section(TypedSection, "device", "Device options", "Configuration of the device protocols.")
++sect_device_protos.addremove = true
++sect_device_protos.anonymous = false
++
++-- Default kernel parameters
++
++disabled = sect_device_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
++disabled.default=0
++
++-- Optional parameters
++for _,o in ipairs(protoptions) do
++ if o.name ~= nil then
++ for _, d in ipairs(o.depends) do
++ if d == "device" then
++ value = sect_device_protos:option(Value, o.name, translate(o.name), translate(o.help))
++ value.optional = true
++ value.rmempty = true
++ end
++ end
++ end
++end
++
++--
++-- STATIC PROTOCOL
++--
++
++sect_static_protos = m:section(TypedSection, "static", "Static options", "Configuration of the static protocols.")
++sect_static_protos.addremove = true
++sect_static_protos.anonymous = false
++
++-- Default kernel parameters
++
++disabled = sect_static_protos:option(Flag, "disabled", "Disabled", "If this option is true, the protocol will not be configured.")
++disabled.default=0
++
++-- Optional parameters
++for _,o in ipairs(protoptions) do
++ if o.name ~= nil then
++ for _, d in ipairs(o.depends) do
++ if d == "static" then
++ if o.name == "table" then
++ value = sect_static_protos:option(ListValue, o.name, translate(o.name), translate(o.help))
++ uciout:foreach("bird6", "table",
++ function (s)
++ value:value(s.name)
++ end)
++ value:value("")
++ else
++ value = sect_static_protos:option(Value, o.name, translate(o.name), translate(o.help))
++ end
++ value.optional = true
++ value.rmempty = true
++ end
++ end
++ end
++end
++
++--
++-- ROUTES FOR STATIC PROTOCOL
++--
++
++
++sect_routes = m:section(TypedSection, "route", "Routes configuration", "Configuration of the routes used in static protocols.")
++sect_routes.addremove = true
++sect_routes.anonymous = true
++
++instance = sect_routes:option(ListValue, "instance", "Route instance", "")
++i = 0
++
++uciout:foreach("bird6", "static",
++ function (s)
++ instance:value(s[".name"])
++ end)
++
++prefix = sect_routes:option(Value, "prefix", "Route prefix", "")
++prefix.datatype = "ip6prefix"
++
++type = sect_routes:option(ListValue, "type", "Type of route", "")
++type:value("router")
++type:value("special")
++type:value("iface")
++type:value("recursive")
++type:value("multipath")
++
++valueVia = sect_routes:option(Value, "via", "Via", "")
++valueVia.optional = false
++valueVia:depends("type", "router")
++valueVia.datatype = "ip6addr"
++
++listVia = sect_routes:option(DynamicList, "l_via", "Via", "")
++listVia:depends("type", "multipath")
++listVia.optional=false
++listVia.datatype = "ip6addr"
++
++attribute = sect_routes:option(Value, "attribute", "Attribute", "Types are: unreachable, prohibit and blackhole")
++attribute:depends("type", "special")
++
++iface = sect_routes:option(ListValue, "iface", "Interface", "")
++iface:depends("type", "iface")
++
++uciout:foreach("wireless", "wifi-iface",
++ function(section)
++ iface:value(section[".name"])
++ end)
++
++ip = sect_routes:option(Value, "ip", "IP address", "")
++ip:depends("type", "ip")
++ip.datatype = [[ or"ip4addr", "ip6addr" ]]
++
++function m.on_commit(self,map)
++ luci.sys.call('/etc/init.d/bird6 stop; /etc/init.d/bird6 start')
++end
++
++return m
++
+diff --git a/feeds/routing/bird-openwrt/bird6-openwrt/src/model/overview.lua b/feeds/routing/bird-openwrt/bird6-openwrt/src/model/overview.lua
+new file mode 100644
+index 0000000..cb85b60
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird6-openwrt/src/model/overview.lua
+@@ -0,0 +1,87 @@
++--[[
++Copyright (C) 2014 - Eloi Carbó Solé (GSoC2014)
++BGP/Bird integration with OpenWRT and QMP
++
++This program is free software: you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation, either version 3 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program. If not, see <http://www.gnu.org/licenses/>.
++]]--
++
++require("luci.sys")
++local http = require "luci.http"
++local uci = require "luci.model.uci"
++local uciout = uci.cursor()
++
++m=Map("bird6", "Bird6 UCI configuration helper", "")
++
++-- Named section: "bird"
++
++s_bird_uci = m:section(NamedSection, "bird", "bird", "Bird6 file settings", "")
++s_bird_uci.addremove = False
++
++uuc = s_bird_uci:option(Flag, "use_UCI_config", "Use UCI configuration", "Use UCI configuration instead of the /etc/bird6.conf file")
++
++ucf = s_bird_uci:option(Value, "UCI_config_File", "UCI File", "Specify the file to place the UCI-translated configuration")
++ucf.default = "/tmp/bird6.conf"
++
++-- Named Section: "table"
++
++s_bird_table = m:section(TypedSection, "table", "Tables configuration", "Configuration of the tables used in the protocols")
++s_bird_table.addremove = true
++s_bird_table.anonymous = true
++
++name = s_bird_table:option(Value, "name", "Table name", "Descriptor ID of the table")
++
++-- Named section: "global"
++
++s_bird_global = m:section(NamedSection, "global", "global", "Global options", "Basic Bird6 settings")
++s_bird_global.addremove = False
++
++id = s_bird_global:option(Value, "router_id", "Router ID", "Identification number of the router. By default, is the router's IP.")
++
++lf = s_bird_global:option(Value, "log_file", "Log File", "File used to store log related data.")
++
++l = s_bird_global:option(MultiValue, "log", "Log", "Set which elements do you want to log.")
++l:value("all", "All")
++l:value("info", "Info")
++l:value("warning","Warning")
++l:value("error","Error")
++l:value("fatal","Fatal")
++l:value("debug","Debug")
++l:value("trace","Trace")
++l:value("remote","Remote")
++l:value("auth","Auth")
++
++d = s_bird_global:option(MultiValue, "debug", "Debug", "Set which elements do you want to debug.")
++d:value("all", "All")
++d:value("states","States")
++d:value("routes","Routes")
++d:value("filters","Filters")
++d:value("interfaces","Interfaces")
++d:value("events","Events")
++d:value("packets","Packets")
++
++listen_addr = s_bird_global:option(Value, "listen_bgp_addr", "BGP Address", "Set the Addres that BGP will listen to.")
++listen_addr.optional = true
++
++listen_port = s_bird_global:option(Value, "listen_bgp_port", "BGP Port", "Set the port that BGP will listen to.")
++listen_port.optional = true
++
++listen_dual = s_bird_global:option(Flag, "listen_bgp_dual", "BGP Dual/ipv6", "Set if BGP connections will listen ipv6 only 'ipv6only' or both ipv4/6 'dual' routes")
++listen_dual.optional = true
++
++
++function m.on_commit(self,map)
++ luci.sys.call('/etc/init.d/bird6 stop; /etc/init.d/bird6 start')
++end
++
++return m
+diff --git a/feeds/routing/bird-openwrt/bird6-openwrt/src/uci-defaults/bird6-uci-install-init.d b/feeds/routing/bird-openwrt/bird6-openwrt/src/uci-defaults/bird6-uci-install-init.d
+new file mode 100644
+index 0000000..95c4944
+--- /dev/null
++++ b/feeds/routing/bird-openwrt/bird6-openwrt/src/uci-defaults/bird6-uci-install-init.d
+@@ -0,0 +1,7 @@
++#!/bin/sh
++
++EXC=`mount -t overlayfs | grep overlayfs -c`
++
++[ $EXC > 0 ] && rm -r /etc/init.d/bird6 || mv /etc/init.d/bird6 /etc/bird6/init.d/bird6.orig
++
++ln -s /etc/bird6/init.d/bird6 /etc/init.d/bird6
+diff --git a/feeds/routing/bird/Makefile b/feeds/routing/bird/Makefile
+new file mode 100644
+index 0000000..04c43ef
+--- /dev/null
++++ b/feeds/routing/bird/Makefile
+@@ -0,0 +1,214 @@
++#
++# Copyright (C) 2009-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bird
++PKG_VERSION:=1.5.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=bird-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=ftp://bird.network.cz/pub/bird
++PKG_MD5SUM:=330bde6372afa106abfe5a9737e471c1
++PKG_BUILD_DEPENDS:=libncurses libreadline
++PKG_MAINTAINER:=Ãlvaro Fernández Rojas <noltari@gmail.com>
++
++PKG_LICENSE:=GPL-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bird/Default
++ TITLE:=The BIRD Internet Routing Daemon
++ URL:=http://bird.network.cz/
++ DEPENDS:=+libpthread
++endef
++
++define Package/birdc/Default
++ TITLE:=The BIRD command-line client
++ URL:=http://bird.network.cz/
++ DEPENDS:= +libreadline +libncurses
++endef
++
++define Package/birdcl/Default
++ TITLE:=The BIRD lightweight command-line client
++ URL:=http://bird.network.cz/
++endef
++
++define Package/bird/Default/description1
++BIRD is an internet routing daemon which manages TCP/IP routing tables
++with support of modern routing protocols, easy to use configuration
++interface and powerful route filtering language. It is lightweight and
++efficient and therefore appropriate for small embedded routers.
++
++endef
++
++define Package/bird/Default/description2
++In BGP, BIRD supports communities, multiprotocol extensions, MD5
++authentication, 32bit AS numbers and could act as a route server or a
++route reflector. BIRD also supports multiple RIBs, multiple kernel
++routing tables and redistribution between the protocols with a powerful
++configuration syntax.
++
++endef
++
++define Package/bird/Default/description3
++This is a BIRD command-line client. It is used to send commands to BIRD,
++commands can perform simple actions such as enabling/disabling of
++protocols, telling BIRD to show various information, telling it to show
++a routing table filtered by a filter, or asking BIRD to reconfigure.
++
++Unless you can't afford dependency on ncurses and readline, you
++should install BIRD command-line client together with BIRD.
++
++endef
++
++define Package/bird/Default/description4
++This is a BIRD lightweight command-line client. It is used to send commands to BIRD,
++commands can perform simple actions such as enabling/disabling of
++protocols, telling BIRD to show various information, telling it to show
++a routing table filtered by a filter, or asking BIRD to reconfigure.
++
++endef
++
++define Package/bird4
++$(call Package/bird/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE+= (IPv4)
++endef
++
++define Package/birdc4
++$(call Package/birdc/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE+= (IPv4)
++ DEPENDS+= +bird4
++endef
++
++define Package/birdcl4
++$(call Package/birdcl/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE+= (IPv4)
++ DEPENDS+= +bird4
++endef
++
++define Package/bird6
++$(call Package/bird/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE+= (IPv6)
++endef
++
++define Package/birdc6
++$(call Package/birdc/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE+= (IPv6)
++ DEPENDS+= +bird6
++endef
++
++define Package/birdcl6
++$(call Package/birdcl/Default)
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE+= (IPv6)
++ DEPENDS+= +bird6
++endef
++
++define Package/bird4/description
++$(call Package/bird/Default/description1)
++This is IPv4 version of BIRD, it supports OSPFv2, RIPv2 and BGP
++protocols.
++
++$(call Package/bird/Default/description2)
++endef
++
++define Package/birdc4/description
++$(call Package/bird/Default/description1)
++$(call Package/bird/Default/description3)
++endef
++
++define Package/birdcl4/description
++$(call Package/bird/Default/description1)
++$(call Package/bird/Default/description4)
++endef
++
++define Package/bird6/description
++$(call Package/bird/Default/description1)
++This is IPv6 version of BIRD, it supports OSPFv3, RIPng and BGP
++protocols.
++
++$(call Package/bird/Default/description2)
++endef
++
++define Package/birdc6/description
++$(call Package/bird/Default/description1)
++$(call Package/bird/Default/description3)
++endef
++
++define Package/birdcl6/description
++$(call Package/bird/Default/description1)
++$(call Package/bird/Default/description4)
++endef
++
++CONFIGURE_ARGS += --with-linux-headers="$(LINUX_DIR)"
++
++TARGET_CFLAGS+=-std=gnu89
++
++define Build/Template
++
++$(STAMP_BUILT)-$(2): $(STAMP_PREPARED)
++ $(call Build/Configure/Default,$(3))
++ $(call Build/Compile/Default,)
++ ( cd $(PKG_BUILD_DIR); mv -f bird bird$(2); mv -f birdc birdc$(2); mv -f birdcl birdcl$(2) )
++ -$(MAKE) -C $(PKG_BUILD_DIR) clean
++ touch $$@
++
++$(STAMP_BUILT): $(STAMP_BUILT)-$(2)
++
++define Package/bird$(2)/install
++ $(INSTALL_DIR) $$(1)/usr/sbin
++ $(INSTALL_BIN) $$(PKG_BUILD_DIR)/bird$(2) $$(1)/usr/sbin/
++ $(INSTALL_DIR) $$(1)/etc
++ $(INSTALL_DATA) ./files/bird$(2).conf $$(1)/etc/
++ $(INSTALL_DIR) $$(1)/etc/init.d
++ $(INSTALL_BIN) ./files/bird$(2).init $$(1)/etc/init.d/bird$(2)
++
++endef
++
++define Package/bird$(2)/conffiles
++/etc/bird$(2).conf
++endef
++
++define Package/birdc$(2)/install
++ $(INSTALL_DIR) $$(1)/usr/sbin
++ $(INSTALL_BIN) $$(PKG_BUILD_DIR)/birdc$(2) $$(1)/usr/sbin/
++endef
++
++define Package/birdcl$(2)/install
++ $(INSTALL_DIR) $$(1)/usr/sbin
++ $(INSTALL_BIN) $$(PKG_BUILD_DIR)/birdcl$(2) $$(1)/usr/sbin/
++endef
++
++endef
++
++
++$(eval $(call Build/Template,bird4,4, --disable-ipv6))
++$(eval $(call Build/Template,bird6,6, --enable-ipv6))
++
++$(eval $(call BuildPackage,bird4))
++$(eval $(call BuildPackage,birdc4))
++$(eval $(call BuildPackage,birdcl4))
++$(eval $(call BuildPackage,bird6))
++$(eval $(call BuildPackage,birdc6))
++$(eval $(call BuildPackage,birdcl6))
+diff --git a/feeds/routing/bird/files/bird4.conf b/feeds/routing/bird/files/bird4.conf
+new file mode 100644
+index 0000000..8616a0a
+--- /dev/null
++++ b/feeds/routing/bird/files/bird4.conf
+@@ -0,0 +1,121 @@
++
++# THIS CONFIG FILE IS NOT A COMPLETE DOCUMENTATION
++# PLEASE LOOK IN THE BIRD DOCUMENTATION FOR MORE INFO
++
++# However, most of options used here are just for example
++# and will be removed in real-life configs.
++
++log syslog all;
++
++# Override router ID
++#router id 192.168.0.1;
++
++# Turn on global debugging of all protocols
++#debug protocols all;
++
++
++# Define a route filter...
++# filter test_filter {
++# if net ~ 10.0.0.0/16 then accept;
++# else reject;
++# }
++
++# The direct protocol automatically generates device routes to all network
++# interfaces. Can exist in as many instances as you wish if you want to
++# populate multiple routing tables with device routes. Because device routes
++# are handled by Linux kernel, this protocol is usually not needed.
++# protocol direct {
++# interface "*"; # Restrict network interfaces it works with
++# }
++
++# This pseudo-protocol performs synchronization between BIRD's routing
++# tables and the kernel. You can run multiple instances of the kernel
++# protocol and synchronize different kernel tables with different BIRD tables.
++protocol kernel {
++# learn; # Learn all alien routes from the kernel
++# persist; # Don't remove routes on bird shutdown
++ scan time 20; # Scan kernel routing table every 20 seconds
++# import none; # Default is import all
++# export all; # Default is export none
++}
++
++# This pseudo-protocol watches all interface up/down events.
++protocol device {
++ scan time 10; # Scan interfaces every 10 seconds
++}
++
++# Static routes (again, there can be multiple instances, so that you
++# can disable/enable various groups of static routes on the fly).
++protocol static {
++# export all; # Default is export none
++# route 0.0.0.0/0 via 62.168.0.13;
++# route 10.0.0.0/8 reject;
++# route 192.168.0.0/16 reject;
++}
++
++
++#protocol rip {
++# disabled;
++# import all;
++# export all;
++# export filter test_filter;
++
++# port 1520;
++# period 7;
++# infinity 16;
++# garbage time 60;
++# interface "*" { mode broadcast; };
++# honor neighbor;
++# honor always;
++# honor never;
++# authentication none;
++#}
++
++
++#protocol ospf {
++# disabled;
++# import all;
++# export all;
++# export where source = RTS_STATIC;
++
++# area 0 {
++# interface "eth*" {
++# cost 10;
++# hello 3;
++# retransmit 2;
++# wait 5;
++# dead 20;
++# type broadcast;
++# authentication simple;
++# password "pass";
++# };
++# };
++#}
++
++
++#protocol bgp {
++# disabled;
++# import all;
++# export all;
++# export where source = RTS_STATIC;
++
++# local as 65000;
++# neighbor 192.168.1.1 as 65001;
++# multihop 20 via 192.168.2.1;
++
++# hold time 240;
++# startup hold time 240;
++# connect retry time 120;
++# keepalive time 80; # defaults to hold time / 3
++# start delay time 5; # How long do we wait before initial connect
++# error wait time 60, 300;# Minimum and maximum time we wait after an error (when consecutive
++# # errors occur, we increase the delay exponentially ...
++# error forget time 300; # ... until this timeout expires)
++# disable after error; # Disable the protocol automatically when an error occurs
++# next hop self; # Disable next hop processing and always advertise our local address as nexthop
++# source address 62.168.0.14; # What local address we use for the TCP connection
++# password "secret" # Password used for MD5 authentication
++# rr client; # I am a route reflector and the neighor is my client
++# rr cluster id 1.0.0.1 # Use this value for cluster id instead of my router id
++# };
++#}
+diff --git a/feeds/routing/bird/files/bird4.init b/feeds/routing/bird/files/bird4.init
+new file mode 100644
+index 0000000..a1a1be2
+--- /dev/null
++++ b/feeds/routing/bird/files/bird4.init
+@@ -0,0 +1,26 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2010-2014 OpenWrt.org
++
++BIRD="bird4"
++
++START=99
++STOP=10
++
++SERVICE_DAEMONIZE=1
++SERVICE_USE_PID=1
++SERVICE_PID_FILE="/var/run/$BIRD.pid"
++
++BIRD_BIN="/usr/sbin/$BIRD"
++BIRD_CONF="/etc/$BIRD.conf"
++
++start() {
++ service_start $BIRD_BIN -d -c $BIRD_CONF -P $SERVICE_PID_FILE
++}
++
++stop() {
++ service_stop $BIRD_BIN
++}
++
++reload() {
++ service_reload $BIRD_BIN
++}
+diff --git a/feeds/routing/bird/files/bird6.conf b/feeds/routing/bird/files/bird6.conf
+new file mode 100644
+index 0000000..8616a0a
+--- /dev/null
++++ b/feeds/routing/bird/files/bird6.conf
+@@ -0,0 +1,121 @@
++
++# THIS CONFIG FILE IS NOT A COMPLETE DOCUMENTATION
++# PLEASE LOOK IN THE BIRD DOCUMENTATION FOR MORE INFO
++
++# However, most of options used here are just for example
++# and will be removed in real-life configs.
++
++log syslog all;
++
++# Override router ID
++#router id 192.168.0.1;
++
++# Turn on global debugging of all protocols
++#debug protocols all;
++
++
++# Define a route filter...
++# filter test_filter {
++# if net ~ 10.0.0.0/16 then accept;
++# else reject;
++# }
++
++# The direct protocol automatically generates device routes to all network
++# interfaces. Can exist in as many instances as you wish if you want to
++# populate multiple routing tables with device routes. Because device routes
++# are handled by Linux kernel, this protocol is usually not needed.
++# protocol direct {
++# interface "*"; # Restrict network interfaces it works with
++# }
++
++# This pseudo-protocol performs synchronization between BIRD's routing
++# tables and the kernel. You can run multiple instances of the kernel
++# protocol and synchronize different kernel tables with different BIRD tables.
++protocol kernel {
++# learn; # Learn all alien routes from the kernel
++# persist; # Don't remove routes on bird shutdown
++ scan time 20; # Scan kernel routing table every 20 seconds
++# import none; # Default is import all
++# export all; # Default is export none
++}
++
++# This pseudo-protocol watches all interface up/down events.
++protocol device {
++ scan time 10; # Scan interfaces every 10 seconds
++}
++
++# Static routes (again, there can be multiple instances, so that you
++# can disable/enable various groups of static routes on the fly).
++protocol static {
++# export all; # Default is export none
++# route 0.0.0.0/0 via 62.168.0.13;
++# route 10.0.0.0/8 reject;
++# route 192.168.0.0/16 reject;
++}
++
++
++#protocol rip {
++# disabled;
++# import all;
++# export all;
++# export filter test_filter;
++
++# port 1520;
++# period 7;
++# infinity 16;
++# garbage time 60;
++# interface "*" { mode broadcast; };
++# honor neighbor;
++# honor always;
++# honor never;
++# authentication none;
++#}
++
++
++#protocol ospf {
++# disabled;
++# import all;
++# export all;
++# export where source = RTS_STATIC;
++
++# area 0 {
++# interface "eth*" {
++# cost 10;
++# hello 3;
++# retransmit 2;
++# wait 5;
++# dead 20;
++# type broadcast;
++# authentication simple;
++# password "pass";
++# };
++# };
++#}
++
++
++#protocol bgp {
++# disabled;
++# import all;
++# export all;
++# export where source = RTS_STATIC;
++
++# local as 65000;
++# neighbor 192.168.1.1 as 65001;
++# multihop 20 via 192.168.2.1;
++
++# hold time 240;
++# startup hold time 240;
++# connect retry time 120;
++# keepalive time 80; # defaults to hold time / 3
++# start delay time 5; # How long do we wait before initial connect
++# error wait time 60, 300;# Minimum and maximum time we wait after an error (when consecutive
++# # errors occur, we increase the delay exponentially ...
++# error forget time 300; # ... until this timeout expires)
++# disable after error; # Disable the protocol automatically when an error occurs
++# next hop self; # Disable next hop processing and always advertise our local address as nexthop
++# source address 62.168.0.14; # What local address we use for the TCP connection
++# password "secret" # Password used for MD5 authentication
++# rr client; # I am a route reflector and the neighor is my client
++# rr cluster id 1.0.0.1 # Use this value for cluster id instead of my router id
++# };
++#}
+diff --git a/feeds/routing/bird/files/bird6.init b/feeds/routing/bird/files/bird6.init
+new file mode 100644
+index 0000000..6156fb2
+--- /dev/null
++++ b/feeds/routing/bird/files/bird6.init
+@@ -0,0 +1,26 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2010-2014 OpenWrt.org
++
++BIRD="bird6"
++
++START=99
++STOP=10
++
++SERVICE_DAEMONIZE=1
++SERVICE_USE_PID=1
++SERVICE_PID_FILE="/var/run/$BIRD.pid"
++
++BIRD_BIN="/usr/sbin/$BIRD"
++BIRD_CONF="/etc/$BIRD.conf"
++
++start() {
++ service_start $BIRD_BIN -d -c $BIRD_CONF -P $SERVICE_PID_FILE
++}
++
++stop() {
++ service_stop $BIRD_BIN
++}
++
++reload() {
++ service_reload $BIRD_BIN
++}
+diff --git a/feeds/routing/bmx6/Makefile b/feeds/routing/bmx6/Makefile
+new file mode 100644
+index 0000000..425c298
+--- /dev/null
++++ b/feeds/routing/bmx6/Makefile
+@@ -0,0 +1,156 @@
++# Copyright (C) 2011 Fundacio Privada per a la Xarxa Oberta, Lliure i Neutral guifi.net
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License along
++# with this program; if not, write to the Free Software Foundation, Inc.,
++# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# The full GNU General Public License is included in this distribution in
++# the file called "COPYING".
++#
++# Contibutors:
++# Axel Neumann, Simó Albert i Beltran, Pau Escrich
++#
++
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bmx6
++
++PKG_SOURCE_PROTO:=git
++
++#PKG_SOURCE_URL:=git://bmx6.net/bmx6.git
++PKG_SOURCE_URL:=git://github.com/axn/bmx6.git
++
++PKG_REV:=2a87b770d3f9c254e3927dc159e2f425f2e0e83a
++PKG_VERSION:=r2015080701
++PKG_RELEASE:=4
++PKG_LICENSE:=GPL-2.0
++
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++
++include $(INCLUDE_DIR)/package.mk
++
++
++TARGET_CFLAGS += $(FPIC)
++
++MAKE_ARGS += \
++ EXTRA_CFLAGS="$(TARGET_CFLAGS) -I. -I$(STAGING_DIR)/usr/include -DNO_DEBUG_ALL -DNO_DEBUG_DUMP" \
++ EXTRA_LDFLAGS="-L$(STAGING_DIR)/usr/lib " \
++ GIT_REV="$(PKG_REV)" \
++ CC="$(TARGET_CC)" \
++ INSTALL_DIR="$(PKG_INSTALL_DIR)" \
++ STRIP="/bin/false" \
++ build_all
++
++define Package/bmx6/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE:=BMX6 layer 3 routing daemon
++ URL:=http://bmx6.net/
++ MAINTAINER:=Axel Neumann <neumann@cgws.de>
++ DEPENDS:=+kmod-ip6-tunnel +kmod-iptunnel6 +kmod-tun
++endef
++
++define Package/bmx6/description
++BMX6 layer 3 routing daemon supporting IPv4, IPv6, and IPv4 over IPv6
++endef
++
++define Package/bmx6
++ $(call Package/bmx6/Default)
++ MENU:=1
++endef
++
++define Package/bmx6-uci-config
++ $(call Package/bmx6/Default)
++ DEPENDS:=bmx6 +libuci
++ TITLE:=configuration plugin based on uci (recommended!)
++endef
++
++define Package/bmx6-json
++ $(call Package/bmx6/Default)
++ DEPENDS:=bmx6 +libjson-c
++ TITLE:=json plugin based on json-c
++endef
++
++define Package/bmx6-sms
++ $(call Package/bmx6/Default)
++ DEPENDS:=bmx6
++ TITLE:=sms plugin
++endef
++
++#define Package/bmx6-quagga
++# $(call Package/bmx6/Default)
++# DEPENDS:=bmx6 +qmp-quagga @BROKEN
++# TITLE:=bmx6 quagga plugin to redistribute/export routes (needs manet/bmx6 patched quagga 0.99.21)
++#endef
++
++define Package/bmx6-table
++ $(call Package/bmx6/Default)
++ DEPENDS:=bmx6
++ TITLE:=bmx6 table plugin to automatic announce routing-table routes via ip6ip tunnels
++endef
++
++define Build/Configure
++ mkdir -p $(PKG_INSTALL_DIR)
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_ARGS)
++endef
++
++define Package/bmx6/install
++ $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bmx6 $(1)/usr/sbin/bmx6
++endef
++
++define Package/bmx6-uci-config/conffiles
++/etc/config/bmx6
++endef
++
++define Package/bmx6-uci-config/install
++ $(INSTALL_DIR) $(1)/usr/lib $(1)/etc/config $(1)/etc/init.d
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_uci_config/bmx6_config.so $(1)/usr/lib/bmx6_config.so
++ $(INSTALL_BIN) ./files/etc/init.d/bmx6 $(1)/etc/init.d/bmx6
++ $(INSTALL_DATA) ./files/etc/config/bmx6 $(1)/etc/config/bmx6
++endef
++
++define Package/bmx6-json/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_json/bmx6_json.so $(1)/usr/lib/bmx6_json.so
++endef
++
++define Package/bmx6-sms/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_sms/bmx6_sms.so $(1)/usr/lib/bmx6_sms.so
++endef
++
++define Package/bmx6-table/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_table/bmx6_table.so $(1)/usr/lib/bmx6_table.so
++endef
++
++#define Package/bmx6-quagga/install
++# $(INSTALL_DIR) $(1)/usr/lib
++# $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_quagga/bmx6_quagga.so $(1)/usr/lib/bmx6_quagga.so
++#endef
++
++$(eval $(call BuildPackage,bmx6))
++$(eval $(call BuildPackage,bmx6-uci-config))
++$(eval $(call BuildPackage,bmx6-json))
++$(eval $(call BuildPackage,bmx6-sms))
++#$(eval $(call BuildPackage,bmx6-quagga))
++$(eval $(call BuildPackage,bmx6-table))
+diff --git a/feeds/routing/bmx6/files/etc/config/bmx6 b/feeds/routing/bmx6/files/etc/config/bmx6
+new file mode 100644
+index 0000000..884fd12
+--- /dev/null
++++ b/feeds/routing/bmx6/files/etc/config/bmx6
+@@ -0,0 +1,82 @@
++
++# for more information:
++# http://bmx6.net/projects/bmx6/wiki
++# options execute: bmx6 --help
++
++config 'bmx6' 'general'
++# option 'runtimeDir' '/var/run/bmx6'
++# option 'tun4Address' '10.202.0.116/32'
++# option 'tun4Address' '10.254.10.0/32'
++# option 'tun6Address' '2012:0:0:1000::1/64'
++
++#config 'ipVersion' 'ipVersion'
++# option 'ipVersion' '6' # default is 4
++# option 'throwRules' '0'
++
++
++#config 'plugin'
++# option 'plugin' 'bmx6_config.so'
++
++
++
++#config 'plugin'
++# option 'plugin' 'bmx6_json.so'
++
++
++
++#config 'plugin'
++# option 'plugin' 'bmx6_sms.so'
++
++
++config 'dev' 'mesh_1'
++ option 'dev' 'eth0.12'
++
++config 'dev' 'mesh_2'
++ option 'dev' 'ath0.12'
++
++
++
++#config 'hna' 'my_global_prefix'
++# option 'hna' '2012:0:0:74:0:0:0:0/64'
++
++
++#config 'tunOut'
++# option 'tunOut' 'ip6'
++# option 'network' '2012::/16'
++# option 'exportDistance' '0'
++
++#config 'tunOut'
++# option 'tunOut' 'ip4'
++# option 'network' '10.254.0.0/16'
++# option 'exportDistance' '0' # requires quagga plugin !
++# option 'minPrefixLen' '27'
++
++
++
++#config 'plugin'
++# option 'plugin' 'bmx6_quagga.so'
++
++
++
++#config 'redistribute'
++# option 'redistribute' 'ospf6'
++# option 'network' '10.0.0.0/8'
++# option 'minPrefixLen' '10'
++# option 'bandwidth' '10000000'
++# option 'ospf6' '1'
++# option 'aggregatePrefixLen' '16'
++
++#config 'redistribute'
++# option 'redistribute' 'bgp'
++# option 'network' '0.0.0.0/0'
++# option 'minPrefixLen' '0'
++# option 'maxPrefixLen' '24'
++# option 'bandwidth' '10000000'
++# option 'bgp' '1'
++# option 'aggregatePrefixLen' '8'
++
++
++
++
++
++
+diff --git a/feeds/routing/bmx6/files/etc/init.d/bmx6 b/feeds/routing/bmx6/files/etc/init.d/bmx6
+new file mode 100755
+index 0000000..cb2d5b3
+--- /dev/null
++++ b/feeds/routing/bmx6/files/etc/init.d/bmx6
+@@ -0,0 +1,41 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2011 Fundacio Privada per a la Xarxa Oberta, Lliure i Neutral guifi.net
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License along
++# with this program; if not, write to the Free Software Foundation, Inc.,
++# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# The full GNU General Public License is included in this distribution in
++# the file called "COPYING".
++
++START=91
++
++BIN=/usr/sbin/bmx6
++CONF=/etc/config/bmx6
++PID=/var/run/bmx6/pid
++
++
++start() {
++ cd /root/
++ while pgrep -f mac80211.sh ; do sleep 1; done
++ ulimit -c 20000
++ $BIN -f $CONF -d0 > /dev/null &
++}
++
++stop() {
++ start-stop-daemon -p $PID -K
++}
++
++restart() {
++ stop; sleep 3; start
++}
+diff --git a/feeds/routing/bmx6/patches/001-json-c.patch b/feeds/routing/bmx6/patches/001-json-c.patch
+new file mode 100644
+index 0000000..5d29dae
+--- /dev/null
++++ b/feeds/routing/bmx6/patches/001-json-c.patch
+@@ -0,0 +1,13 @@
++Index: bmx6-r2014112401/lib/bmx6_json/json.c
++===================================================================
++--- bmx6-r2014112401.orig/lib/bmx6_json/json.c
+++++ bmx6-r2014112401/lib/bmx6_json/json.c
++@@ -27,7 +27,7 @@
++ #include <unistd.h>
++ #include <fcntl.h>
++ #include <stdint.h>
++-#include <json/json.h>
+++#include <json-c/json.h>
++ //#include <dirent.h>
++ //#include <sys/inotify.h>
++
+diff --git a/feeds/routing/bmx7/Makefile b/feeds/routing/bmx7/Makefile
+new file mode 100644
+index 0000000..d402dfd
+--- /dev/null
++++ b/feeds/routing/bmx7/Makefile
+@@ -0,0 +1,178 @@
++# Copyright (C) 2011 Fundacio Privada per a la Xarxa Oberta, Lliure i Neutral guifi.net
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License along
++# with this program; if not, write to the Free Software Foundation, Inc.,
++# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# The full GNU General Public License is included in this distribution in
++# the file called "COPYING".
++#
++# Contibutors:
++# Axel Neumann, Simó Albert i Beltran, Pau Escrich
++#
++
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bmx7
++
++PKG_SOURCE_PROTO:=git
++
++#PKG_SOURCE_URL:=file:///usr/src/bmx6/bmx6.git
++#PKG_SOURCE_URL:=git://bmx6.net/bmx6.git
++PKG_SOURCE_URL:=git://github.com/axn/bmx6.git
++
++PKG_REV:=0ea28331abfca5ebd6fa6788505cfed073ae1005
++PKG_VERSION:=r2015101201
++PKG_RELEASE:=4
++PKG_LICENSE:=GPL-2.0
++
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS += $(FPIC)
++
++MAKE_ARGS += \
++ EXTRA_CFLAGS="$(TARGET_CFLAGS) -I. -I$(STAGING_DIR)/usr/include -DCRYPTLIB=POLARSSL_1_3_4 -DCORE_LIMIT=20000 -DTRAFFIC_DUMP -DNO_TRACE_FUNCTION_CALLS" \
++ EXTRA_LDFLAGS="$(TARGET_LDFLAGS) -L$(STAGING_DIR)/usr/lib " \
++ GIT_REV="$(PKG_REV)" \
++ CC="$(TARGET_CC)" \
++ INSTALL_DIR="$(PKG_INSTALL_DIR)" \
++ build_all
++
++define Package/bmx7/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE:=BMX7 layer 3 routing daemon
++ URL:=http://bmx6.net/
++ MAINTAINER:=Axel Neumann <neumann@cgws.de>
++ DEPENDS:=+zlib +libpolarssl @!bmx6
++endef
++
++define Package/bmx7/description
++BMX7 layer 3 routing daemon supporting IPv6, and IPv4 over IPv6
++endef
++
++define Package/bmx7
++ $(call Package/bmx7/Default)
++ MENU:=1
++endef
++
++define Package/bmx7-uci-config
++ $(call Package/bmx7/Default)
++ DEPENDS:=bmx7 +libuci
++ TITLE:=configuration plugin based on uci (recommended!)
++endef
++
++define Package/bmx7-json
++ $(call Package/bmx7/Default)
++ DEPENDS:=bmx7 +libjson-c
++ TITLE:=json plugin based on json-c
++endef
++
++define Package/bmx7-sms
++ $(call Package/bmx7/Default)
++ DEPENDS:=bmx7
++ TITLE:=sms plugin
++endef
++
++define Package/bmx7-tun
++ $(call Package/bmx7/Default)
++ DEPENDS:=bmx7 +kmod-ip6-tunnel +kmod-iptunnel6 +kmod-tun
++ TITLE:=ipip-based tunnel plugin (recommended!)
++endef
++
++#define Package/bmx7-quagga
++# $(call Package/bmx7/Default)
++# DEPENDS:=bmx7 +bmx7-tun +qmp-quagga @BROKEN
++# TITLE:=bmx7 quagga plugin to redistribute/export routes (needs manet/bmx patched quagga 0.99.21)
++#endef
++
++define Package/bmx7-table
++ $(call Package/bmx7/Default)
++ DEPENDS:=bmx7 +bmx7-tun
++ TITLE:=plugin to announce routes from tables via tunnels
++endef
++
++define Build/Configure
++ mkdir -p $(PKG_INSTALL_DIR)
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) $(MAKE_ARGS)
++endef
++
++define Package/bmx7/install
++ $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/bmx6 $(1)/usr/sbin/bmx6
++endef
++
++define Package/bmx7/postinst
++#!/bin/sh
++# # check if we are on real system
++if [ -z "$${IPKG_INSTROOT}" ]; then
++ if [ -f /etc/sysupgrade.conf ] && ! grep bmx6 /etc/sysupgrade.conf; then
++ echo /etc/bmx6 >> /etc/sysupgrade.conf
++ fi
++fi
++endef
++
++
++define Package/bmx7-uci-config/conffiles
++/etc/config/bmx6
++endef
++
++define Package/bmx7-uci-config/install
++ $(INSTALL_DIR) $(1)/usr/lib $(1)/etc/config $(1)/etc/init.d
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_uci_config/bmx6_config.so $(1)/usr/lib/bmx6_config.so
++ $(INSTALL_BIN) ./files/etc/init.d/bmx6 $(1)/etc/init.d/bmx6
++ $(INSTALL_DATA) ./files/etc/config/bmx6 $(1)/etc/config/bmx6
++endef
++
++define Package/bmx7-json/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_json/bmx6_json.so $(1)/usr/lib/bmx6_json.so
++endef
++
++define Package/bmx7-sms/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_sms/bmx6_sms.so $(1)/usr/lib/bmx6_sms.so
++endef
++
++define Package/bmx7-tun/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_tun/bmx6_tun.so $(1)/usr/lib/bmx6_tun.so
++endef
++
++define Package/bmx7-table/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_table/bmx6_table.so $(1)/usr/lib/bmx6_table.so
++endef
++
++#define Package/bmx7-quagga/install
++# $(INSTALL_DIR) $(1)/usr/lib
++# $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmx6_quagga/bmx6_quagga.so $(1)/usr/lib/bmx6_quagga.so
++#endef
++
++$(eval $(call BuildPackage,bmx7))
++$(eval $(call BuildPackage,bmx7-uci-config))
++$(eval $(call BuildPackage,bmx7-json))
++$(eval $(call BuildPackage,bmx7-sms))
++#$(eval $(call BuildPackage,bmx7-quagga))
++$(eval $(call BuildPackage,bmx7-table))
++$(eval $(call BuildPackage,bmx7-tun))
+diff --git a/feeds/routing/bmx7/files/etc/config/bmx6 b/feeds/routing/bmx7/files/etc/config/bmx6
+new file mode 100644
+index 0000000..26d691c
+--- /dev/null
++++ b/feeds/routing/bmx7/files/etc/config/bmx6
+@@ -0,0 +1,55 @@
++
++# for more information:
++# http://bmx6.net/projects/bmx6/wiki
++# options execute: bmx6 --help
++
++config 'bmx6' 'general'
++# option 'runtimeDir' '/var/run/bmx6'
++
++
++#config 'plugin'
++# option 'plugin' 'bmx6_config.so'
++
++#config 'plugin'
++# option 'plugin' 'bmx6_json.so'
++
++
++#config 'plugin'
++# option 'plugin' 'bmx6_sms.so'
++
++
++config 'dev' 'mesh_1'
++ option 'dev' 'br-lan'
++
++config 'dev' 'mesh_2'
++ option 'dev' 'wlan0'
++
++
++
++#config 'plugin'
++# option 'plugin' 'bmx6_tun.so'
++
++#config 'plugin'
++# option 'plugin' 'bmx6_table.so'
++
++
++#config 'tunDev' default
++# option 'tunDev' 'default'
++# option 'tun6Address' '2012:0:0:6666::1/64'
++# option 'tun4Address' '10.66.66.1/24'
++
++
++#config 'tunOut'
++# option 'tunOut' 'ip6'
++# option 'network' '2012::/16'
++# option 'exportDistance' '0'
++
++#config 'tunOut'
++# option 'tunOut' 'ip4'
++# option 'network' '10.0.0.0/9'
++# option 'minPrefixLen' '27'
++
++
++
++
++
+diff --git a/feeds/routing/bmx7/files/etc/init.d/bmx6 b/feeds/routing/bmx7/files/etc/init.d/bmx6
+new file mode 100755
+index 0000000..cb2d5b3
+--- /dev/null
++++ b/feeds/routing/bmx7/files/etc/init.d/bmx6
+@@ -0,0 +1,41 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2011 Fundacio Privada per a la Xarxa Oberta, Lliure i Neutral guifi.net
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License along
++# with this program; if not, write to the Free Software Foundation, Inc.,
++# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# The full GNU General Public License is included in this distribution in
++# the file called "COPYING".
++
++START=91
++
++BIN=/usr/sbin/bmx6
++CONF=/etc/config/bmx6
++PID=/var/run/bmx6/pid
++
++
++start() {
++ cd /root/
++ while pgrep -f mac80211.sh ; do sleep 1; done
++ ulimit -c 20000
++ $BIN -f $CONF -d0 > /dev/null &
++}
++
++stop() {
++ start-stop-daemon -p $PID -K
++}
++
++restart() {
++ stop; sleep 3; start
++}
+diff --git a/feeds/routing/bmx7/patches/001-json-c.patch b/feeds/routing/bmx7/patches/001-json-c.patch
+new file mode 100644
+index 0000000..5d29dae
+--- /dev/null
++++ b/feeds/routing/bmx7/patches/001-json-c.patch
+@@ -0,0 +1,13 @@
++Index: bmx6-r2014112401/lib/bmx6_json/json.c
++===================================================================
++--- bmx6-r2014112401.orig/lib/bmx6_json/json.c
+++++ bmx6-r2014112401/lib/bmx6_json/json.c
++@@ -27,7 +27,7 @@
++ #include <unistd.h>
++ #include <fcntl.h>
++ #include <stdint.h>
++-#include <json/json.h>
+++#include <json-c/json.h>
++ //#include <dirent.h>
++ //#include <sys/inotify.h>
++
+diff --git a/feeds/routing/cjdns/Makefile b/feeds/routing/cjdns/Makefile
+new file mode 100644
+index 0000000..9acc3cc
+--- /dev/null
++++ b/feeds/routing/cjdns/Makefile
+@@ -0,0 +1,146 @@
++#
++# Copyright (C) 2014,2015 Hyperboria.net
++#
++# You may redistribute this program and/or modify it under the terms of
++# the GNU General Public License as published by the Free Software Foundation,
++# either version 3 of the License, or (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=cjdns
++PKG_VERSION:=0.16
++PKG_RELEASE:=16
++
++PKG_SOURCE_URL:=https://github.com/hyperboria/cjdns.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=b2484c8c1a695a103db9e75b7b4445252ff053d6
++PKG_LICENSE:=GPL-3.0
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION)
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++
++define Package/cjdns
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE:=Encrypted near-zero-conf mesh routing protocol
++ URL:=https://github.com/hyperboria/cjdns
++ MAINTAINER:=Lars Gierth <larsg@systemli.org>
++ DEPENDS:=+kmod-tun +kmod-ipv6 +libnl-tiny +libpthread +librt \
++ +libuci-lua +lua-bencode +dkjson +luasocket +lua-sha2
++endef
++
++define Package/cjdns/description
++ Cjdns implements an encrypted IPv6 network using public-key cryptography \
++ for address allocation and a distributed hash table for routing. \
++ This provides near-zero-configuration networking, and prevents many \
++ of the security and scalability issues that plague existing networks.
++endef
++
++define Package/cjdns-tests
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE:=cjdns test cases
++ URL:=https://github.com/hyperboria/cjdns
++ MAINTAINER:=Lars Gierth <larsg@systemli.org>
++ DEPENDS:=+libpthread +librt
++endef
++
++define Package/cjdns-test/description
++ cjdns test cases
++endef
++
++define Build/Configure
++endef
++
++PKG_DO_VARS:=
++
++ifneq ($(CONFIG_KERNEL_SECCOMP_FILTER),y)
++PKG_DO_VARS+= Seccomp_NO=1
++endif
++
++ifneq ($(CONFIG_USE_UCLIBC),)
++PKG_DO_VARS+= UCLIBC=1
++endif
++
++define Build/Compile
++ CROSS="true" \
++ CC="$(TARGET_CC)" \
++ AR="$(TARGET_AR)" \
++ RANLIB="$(TARGET_RANLIB)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ SYSTEM="linux" \
++ TARGET_ARCH="$(CONFIG_ARCH)" \
++ SSP_SUPPORT="$(CONFIG_SSP_SUPPORT)" \
++ GYP_ADDITIONAL_ARGS="-f make-linux" \
++ $(PKG_DO_VARS) \
++ $(PKG_BUILD_DIR)/do
++endef
++
++define Package/cjdns/install
++ $(INSTALL_DIR) \
++ $(1)/usr/sbin \
++ $(1)/usr/bin \
++ $(1)/etc/config \
++ $(1)/etc/init.d \
++ $(1)/etc/uci-defaults \
++ $(1)/usr/lib/lua/cjdns
++
++ $(INSTALL_BIN) \
++ ./files/cjdrouteconf \
++ $(1)/usr/bin
++
++ $(INSTALL_BIN) \
++ $(PKG_BUILD_DIR)/cjdroute \
++ $(1)/usr/sbin
++
++ $(INSTALL_BIN) \
++ $(PKG_BUILD_DIR)/publictoip6 \
++ $(1)/usr/bin
++
++ $(INSTALL_BIN) \
++ ./files/cjdns.init \
++ $(1)/etc/init.d/cjdns
++
++ $(INSTALL_BIN) \
++ ./files/cjdns.defaults \
++ $(1)/etc/uci-defaults/cjdns
++
++ $(CP) \
++ ./lua/cjdns/* \
++ $(1)/usr/lib/lua/cjdns
++endef
++
++define Package/cjdns/postinst
++#!/bin/sh
++if [ -z $${IPKG_INSTROOT} ] ; then
++ ( . /etc/uci-defaults/cjdns ) && rm -f /etc/uci-defaults/cjdns
++ # TODO: we should have an 'Enable' button instead
++ /etc/init.d/cjdns enabled || /etc/init.d/cjdns enable
++ exit 0
++fi
++endef
++
++define Package/cjdns-tests/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) \
++ $(PKG_BUILD_DIR)/build_linux/test_testcjdroute_c \
++ $(1)/usr/bin
++endef
++
++$(eval $(call BuildPackage,cjdns))
++$(eval $(call BuildPackage,cjdns-tests))
+diff --git a/feeds/routing/cjdns/files/cjdns.defaults b/feeds/routing/cjdns/files/cjdns.defaults
+new file mode 100644
+index 0000000..f2baf6d
+--- /dev/null
++++ b/feeds/routing/cjdns/files/cjdns.defaults
+@@ -0,0 +1,127 @@
++#!/bin/sh
++
++# if there is an existing config, our work is already done
++uci get cjdns.cjdns.ipv6 >/dev/null 2>&1
++if [ $? -ne 0 ]; then
++
++ # register commit handler
++ uci -q batch <<-EOF >/dev/null
++ delete ucitrack.@cjdns[-1]
++ add ucitrack cjdns
++ set ucitrack.@cjdns[-1].init=cjdns
++ commit ucitrack
++EOF
++
++ # generate configuration
++ touch /etc/config/cjdns
++ cjdroute --genconf | cjdroute --cleanconf | cjdrouteconf set
++
++ # make sure config is present (might fail for any reason)
++ uci get cjdns.cjdns.ipv6 >/dev/null 2>&1
++ if [ $? -ne 0 ]; then
++ exit 1
++ fi
++
++ # enable auto-peering on ethernet interface lan, if existing
++ uci get network.lan | grep interface >/dev/null 2>&1
++ if [ $? -eq 0 ]; then
++ uci get network.lan.type | grep bridge >/dev/null 2>&1
++ if [ $? -eq 0 ]; then
++ # most routers will set up an ethernet bridge for the lan
++ ifname="br-lan"
++ else
++ # docker containers don't have permission to create bridges by default,
++ # so we bind to the underlying interface instead (likely eth0)
++ ifname=`uci get network.lan.ifname`
++ fi
++ uci -q batch <<-EOF >/dev/null
++ add cjdns eth_interface
++ set cjdns.@eth_interface[-1].beacon=2
++ set cjdns.@eth_interface[-1].bind=$ifname
++EOF
++ fi
++ # set the tun interface name
++ uci set cjdns.cjdns.tun_device=tuncjdns
++
++ # create the network interface
++ uci -q batch <<-EOF >/dev/null
++ set network.cjdns=interface
++ set network.cjdns.ifname=tuncjdns
++ set network.cjdns.proto=none
++EOF
++
++ # firewall rules by @dangowrt -- thanks <3
++
++ # create the firewall zone
++ uci -q batch <<-EOF >/dev/null
++ add firewall zone
++ set firewall.@zone[-1].name=cjdns
++ add_list firewall.@zone[-1].network=cjdns
++ set firewall.@zone[-1].input=REJECT
++ set firewall.@zone[-1].output=ACCEPT
++ set firewall.@zone[-1].forward=REJECT
++ set firewall.@zone[-1].conntrack=1
++ set firewall.@zone[-1].family=ipv6
++EOF
++
++ # allow ICMP from cjdns zone, e.g. ping6
++ uci -q batch <<-EOF >/dev/null
++ add firewall rule
++ set firewall.@rule[-1].name='Allow-ICMPv6-cjdns'
++ set firewall.@rule[-1].src=cjdns
++ set firewall.@rule[-1].proto=icmp
++ add_list firewall.@rule[-1].icmp_type=echo-request
++ add_list firewall.@rule[-1].icmp_type=echo-reply
++ add_list firewall.@rule[-1].icmp_type=destination-unreachable
++ add_list firewall.@rule[-1].icmp_type=packet-too-big
++ add_list firewall.@rule[-1].icmp_type=time-exceeded
++ add_list firewall.@rule[-1].icmp_type=bad-header
++ add_list firewall.@rule[-1].icmp_type=unknown-header-type
++ set firewall.@rule[-1].limit='1000/sec'
++ set firewall.@rule[-1].family=ipv6
++ set firewall.@rule[-1].target=ACCEPT
++EOF
++
++ # allow SSH from cjdns zone, needs to be explicitly enabled
++ uci -q batch <<-EOF >/dev/null
++ add firewall rule
++ set firewall.@rule[-1].enabled=0
++ set firewall.@rule[-1].name='Allow-SSH-cjdns'
++ set firewall.@rule[-1].src=cjdns
++ set firewall.@rule[-1].proto=tcp
++ set firewall.@rule[-1].dest_port=22
++ set firewall.@rule[-1].target=ACCEPT
++EOF
++
++ # allow LuCI access from cjdns zone, needs to be explicitly enabled
++ uci -q batch <<-EOF >/dev/null
++ add firewall rule
++ set firewall.@rule[-1].enabled=0
++ set firewall.@rule[-1].name='Allow-HTTP-cjdns'
++ set firewall.@rule[-1].src=cjdns
++ set firewall.@rule[-1].proto=tcp
++ set firewall.@rule[-1].dest_port=80
++ set firewall.@rule[-1].target=ACCEPT
++EOF
++
++ # allow UDP peering from wan zone, if it exists
++ uci show network.wan >/dev/null 2>&1
++ if [ $? -eq 0 ]; then
++ peeringPort=`uci get cjdns.@udp_interface[0].port`
++ uci -q batch <<-EOF >/dev/null
++ add firewall rule
++ set firewall.@rule[-1].name='Allow-cjdns-wan'
++ set firewall.@rule[-1].src=wan
++ set firewall.@rule[-1].proto=udp
++ set firewall.@rule[-1].dest_port=$peeringPort
++ set firewall.@rule[-1].target=ACCEPT
++EOF
++ fi
++
++ uci commit cjdns
++ uci commit firewall
++ uci commit network
++
++fi
++
++exit 0
+diff --git a/feeds/routing/cjdns/files/cjdns.init b/feeds/routing/cjdns/files/cjdns.init
+new file mode 100755
+index 0000000..b6371d7
+--- /dev/null
++++ b/feeds/routing/cjdns/files/cjdns.init
+@@ -0,0 +1,32 @@
++#!/bin/sh /etc/rc.common
++
++START=90
++STOP=85
++
++USE_PROCD=1
++
++start_service()
++{
++ [ -f /etc/uci-defaults/cjdns ] && ( . /etc/uci-defaults/cjdns )
++
++ procd_open_instance
++ procd_set_param respawn
++ procd_set_param command /bin/ash -c "cjdrouteconf get | tee /tmp/etc/cjdroute.conf | cjdroute --nobg | logger -t cjdns"
++ procd_close_instance
++}
++
++stop_service()
++{
++ killall cjdroute
++}
++
++reload_service()
++{
++ # cat /tmp/etc/cjdroute.conf | cjdrouteconf reload
++ restart
++}
++
++service_triggers()
++{
++ procd_add_reload_trigger cjdns
++}
+diff --git a/feeds/routing/cjdns/files/cjdrouteconf b/feeds/routing/cjdns/files/cjdrouteconf
+new file mode 100755
+index 0000000..fa5e073
+--- /dev/null
++++ b/feeds/routing/cjdns/files/cjdrouteconf
+@@ -0,0 +1,30 @@
++#!/usr/bin/env lua
++
++dkjson = require("dkjson")
++cjdns = require("cjdns")
++require("cjdns/uci")
++
++function help()
++ print("JSON interface to /etc/config/cjdns\n\nExamples: \
++ cjdrouteconf get > /tmp/etc/cjdroute.conf \
++ cat /tmp/etc/cjdroute.conf | cjdrouteconf set \
++ uci changes \
++ cjdrouteconf get | cjdroute")
++end
++
++if arg[1] == "get" then
++ local json = dkjson.encode(cjdns.uci.get(), { indent = true })
++ print(json)
++elseif arg[1] == "set" then
++ local json = io.stdin:read("*a")
++ local obj, pos, err = dkjson.decode(json, 1, nil)
++
++ if obj then
++ cjdns.uci.set(obj)
++ else
++ print("dkjson: " .. err .. " (try cjdroute --cleanconf)")
++ os.exit(1)
++ end
++else
++ help()
++end
+diff --git a/feeds/routing/cjdns/lua/cjdns/admin.lua b/feeds/routing/cjdns/lua/cjdns/admin.lua
+new file mode 100644
+index 0000000..2bb58d2
+--- /dev/null
++++ b/feeds/routing/cjdns/lua/cjdns/admin.lua
+@@ -0,0 +1,105 @@
++-- Cjdns admin module for Lua
++-- Written by Philip Horger
++
++common = require 'cjdns/common'
++
++AdminInterface = {}
++AdminInterface.__index = AdminInterface
++common.AdminInterface = AdminInterface
++
++function AdminInterface.new(properties)
++ properties = properties or {}
++
++ properties.host = properties.host or "127.0.0.1"
++ properties.port = properties.port or 11234
++ properties.password = properties.password or nil
++ properties.config = properties.config or common.ConfigFile.new("/etc/cjdroute.conf", false)
++ properties.timeout = properties.timeout or 2
++
++ properties.udp = common.UDPInterface.new(properties)
++
++ return setmetatable(properties, AdminInterface)
++end
++
++function AdminInterface:send(object)
++ local bencoded, err = bencode.encode(object)
++ if err then
++ return nil, err
++ end
++
++ local sock_obj = assert(socket.udp())
++ sock_obj:settimeout(self.timeout)
++
++ local _, err = sock_obj:sendto(bencoded, self.host, self.port)
++ if err then
++ return nil, err
++ end
++
++ return sock_obj
++end
++
++function AdminInterface:recv(sock_obj)
++ local retrieved, err = sock_obj:receive()
++ if not retrieved then
++ return nil, "ai:recv > " .. err
++ end
++ local bencoded, err = bencode.decode(retrieved)
++ if bencoded then
++ return bencoded
++ else
++ return nil, "ai:recv > " .. err
++ end
++end
++
++function AdminInterface:call(request)
++ local sock_obj, err = self:send(request)
++ if err then
++ return nil, "ai:call > " .. err
++ end
++
++ return self:recv(sock_obj)
++end
++
++function AdminInterface:getCookie()
++ local cookie_response, err = self:call({ q = "cookie" })
++ if not cookie_response then
++ return nil, "ai:getCookie > " .. err
++ end
++ return cookie_response.cookie
++end
++
++function AdminInterface:auth(request)
++ local funcname = request.q
++ local args = {}
++ for k, v in pairs(request) do
++ args[k] = v
++ end
++
++ -- Step 1: Get cookie
++ local cookie, err = self:getCookie()
++ if err then
++ return nil, err
++ end
++
++ -- Step 2: Calculate hash1 (password + cookie)
++ local plaintext1 = self.password .. cookie
++ local hash1 = sha2.sha256hex(plaintext1)
++
++ -- Step 3: Calculate hash2 (intermediate stage request)
++ local request = {
++ q = "auth",
++ aq = funcname,
++ args = args,
++ hash = hash1,
++ cookie = cookie
++ }
++ local plaintext2, err = bencode.encode(request)
++ if err then
++ return nil, err
++ end
++ local hash2 = sha2.sha256hex(plaintext2)
++
++ -- Step 4: Update hash in request, then ship it out
++ request.hash = hash2
++ return self:call(request)
++end
+diff --git a/feeds/routing/cjdns/lua/cjdns/common.lua b/feeds/routing/cjdns/lua/cjdns/common.lua
+new file mode 100644
+index 0000000..45f7dad
+--- /dev/null
++++ b/feeds/routing/cjdns/lua/cjdns/common.lua
+@@ -0,0 +1,7 @@
++-- Cjdns admin module for Lua
++-- Written by Philip Horger
++
++-- This table is preserved over multiple imports, and collects
++-- submodules import-by-import via init.lua.
++
++return {}
+diff --git a/feeds/routing/cjdns/lua/cjdns/init.lua b/feeds/routing/cjdns/lua/cjdns/init.lua
+new file mode 100644
+index 0000000..32abbfc
+--- /dev/null
++++ b/feeds/routing/cjdns/lua/cjdns/init.lua
+@@ -0,0 +1,12 @@
++-- Cjdns admin module for Lua
++-- Written by Philip Horger
++
++bencode = require "bencode" -- https://bitbucket.org/wilhelmy/lua-bencode/
++dkjson = require "dkjson" -- http://dkolf.de/src/dkjson-lua.fsl/home
++socket = require "socket" -- http://w3.impa.br/~diego/software/luasocket/
++sha2 = require "sha2" -- https://code.google.com/p/sha2/
++
++require "cjdns/admin"
++require "cjdns/udp"
++
++return require "cjdns/common"
+diff --git a/feeds/routing/cjdns/lua/cjdns/uci.lua b/feeds/routing/cjdns/lua/cjdns/uci.lua
+new file mode 100644
+index 0000000..0127f44
+--- /dev/null
++++ b/feeds/routing/cjdns/lua/cjdns/uci.lua
+@@ -0,0 +1,289 @@
++common = require("cjdns/common")
++uci = require("uci")
++
++UCI = {}
++common.uci = UCI
++
++--- Return the configuration defaults as a table suitable for JSON output
++--
++-- Mostly taken from cjdroute --genconf
++-- @return table with configuration defaults
++function UCI.defaults()
++ return {
++ security = {
++ { setuser = "nobody", keepNetAdmin = 1 },
++ { chroot = "/var/run/" },
++ { nofiles = 0 },
++ { noforks = 1 },
++ { seccomp = 0 },
++ { setupComplete = 1 }
++ },
++ router = {
++ ipTunnel = { outgoingConnections = {}, allowedConnections = {} },
++ interface = { type = "TUNInterface" }
++ },
++ interfaces = { UDPInterface = {}, ETHInterface = {} },
++ authorizedPasswords = {},
++ logging = { logTo = "stdout" }
++ }
++end
++
++--- Return the cjdns configuration as a table suitable for JSON output
++--
++-- Iterates over cjdns, eth_interface, udp_interface, eth_peer, udp_peer,
++-- and password sections. Doesn't include IPTunnel related options yet.
++-- @return table with cjdns configuration
++function UCI.get()
++ local obj = UCI.defaults()
++
++ local cursor = uci.cursor()
++
++ local config = cursor:get_all("cjdns", "cjdns")
++ if not config then return obj end
++
++ obj.ipv6 = config.ipv6
++ obj.publicKey = config.public_key
++ obj.privateKey = config.private_key
++ obj.admin = {
++ bind = config.admin_address .. ":" .. config.admin_port,
++ password = config.admin_password }
++
++ if config.tun_device and string.len(config.tun_device) > 0 then
++ obj.router.interface.tunDevice = config.tun_device
++ end
++
++ for i,section in pairs(obj.security) do
++ if type(section.seccomp) == "number" then
++ obj.security[i].seccomp = tonumber(config.seccomp)
++ end
++ end
++
++ cursor:foreach("cjdns", "iptunnel_outgoing", function(outgoing)
++ table.insert(obj.router.ipTunnel.outgoingConnections, outgoing.public_key)
++ end)
++
++ cursor:foreach("cjdns", "iptunnel_allowed", function(allowed)
++ entry = { publicKey = allowed.public_key }
++ if allowed.ipv4 then
++ entry["ip4Address"] = allowed.ipv4
++ end
++ if allowed.ipv6 then
++ entry["ip6Address"] = allowed.ipv6
++ end
++ table.insert(obj.router.ipTunnel.allowedConnections, entry)
++ end)
++
++ cursor:foreach("cjdns", "eth_interface", function(eth_interface)
++ table.insert(obj.interfaces.ETHInterface, {
++ bind = eth_interface.bind,
++ beacon = tonumber(eth_interface.beacon),
++ connectTo = {}
++ })
++ end)
++
++ cursor:foreach("cjdns", "udp_interface", function(udp_interface)
++ table.insert(obj.interfaces.UDPInterface, {
++ bind = udp_interface.address .. ":" .. udp_interface.port,
++ connectTo = {}
++ })
++ end)
++
++ cursor:foreach("cjdns", "eth_peer", function(eth_peer)
++ if not eth_peer.address == "" then
++ local i = tonumber(eth_peer.interface)
++ obj.interfaces.ETHInterface[i].connectTo[eth_peer.address] = {
++ publicKey = eth_peer.public_key,
++ password = eth_peer.password
++ }
++ end
++ end)
++
++ cursor:foreach("cjdns", "udp_peer", function(udp_peer)
++ local bind = udp_peer.address .. ":" .. udp_peer.port
++ local i = tonumber(udp_peer.interface)
++ obj.interfaces.UDPInterface[i].connectTo[bind] = {
++ user = udp_peer.user,
++ publicKey = udp_peer.public_key,
++ password = udp_peer.password
++ }
++ end)
++
++ cursor:foreach("cjdns", "password", function(password)
++ table.insert(obj.authorizedPasswords, {
++ password = password.password,
++ user = password.user,
++ contact = password.contact
++ })
++ end)
++
++ return obj
++end
++
++--- Parse and save updated configuration from JSON input
++--
++-- Transforms general settings, ETHInterface, UDPInterface, connectTo, and
++-- authorizedPasswords fields into UCI sections, and replaces the UCI config's
++-- contents with them.
++-- @param table JSON input
++-- @return Boolean whether saving succeeded
++function UCI.set(obj)
++ local cursor = uci.cursor()
++
++ for i, section in pairs(cursor:get_all("cjdns")) do
++ cursor:delete("cjdns", section[".name"])
++ end
++
++ local admin_address, admin_port = string.match(obj.admin.bind, "^(.*):(.*)$")
++ UCI.cursor_section(cursor, "cjdns", "cjdns", "cjdns", {
++ ipv6 = obj.ipv6,
++ public_key = obj.publicKey,
++ private_key = obj.privateKey,
++ admin_password = obj.admin.password,
++ admin_address = admin_address,
++ admin_port = admin_port
++ })
++
++ if obj.router.interface.tunDevice then
++ UCI.cursor_section(cursor, "cjdns", "cjdns", "cjdns", {
++ tun_device = tostring(obj.router.interface.tunDevice)
++ })
++ end
++
++ if obj.security then
++ for i,section in pairs(obj.security) do
++ for key,value in pairs(section) do
++ if key == "seccomp" then
++ UCI.cursor_section(cursor, "cjdns", "cjdns", "cjdns", {
++ seccomp = tonumber(value)
++ })
++ end
++ end
++ end
++ end
++
++ if obj.router.ipTunnel.outgoingConnections then
++ for i,public_key in pairs(obj.router.ipTunnel.outgoingConnections) do
++ UCI.cursor_section(cursor, "cjdns", "iptunnel_outgoing", nil, {
++ public_key = public_key
++ })
++ end
++ end
++
++ if obj.router.ipTunnel.allowedConnections then
++ for i,allowed in pairs(obj.router.ipTunnel.allowedConnections) do
++ entry = { public_key = allowed.publicKey }
++ if allowed.ip4Address then
++ entry["ipv4"] = allowed.ip4Address
++ end
++ if allowed.ip6Address then
++ entry["ipv6"] = allowed.ip6Address
++ end
++
++ UCI.cursor_section(cursor, "cjdns", "iptunnel_allowed", nil, entry)
++ end
++ end
++
++ if obj.interfaces.ETHInterface then
++ for i,interface in pairs(obj.interfaces.ETHInterface) do
++ UCI.cursor_section(cursor, "cjdns", "eth_interface", nil, {
++ bind = interface.bind,
++ beacon = tostring(interface.beacon)
++ })
++
++ if interface.connectTo then
++ for peer_address,peer in pairs(interface.connectTo) do
++ UCI.cursor_section(cursor, "cjdns", "eth_peer", nil, {
++ interface = i,
++ address = peer_address,
++ public_key = peer.publicKey,
++ password = peer.password
++ })
++ end
++ end
++ end
++ end
++
++ if obj.interfaces.UDPInterface then
++ for i,interface in pairs(obj.interfaces.UDPInterface) do
++ local address, port = string.match(interface.bind, "^(.*):(.*)$")
++ UCI.cursor_section(cursor, "cjdns", "udp_interface", nil, {
++ address = address,
++ port = port
++ })
++
++ if interface.connectTo then
++ for peer_bind,peer in pairs(interface.connectTo) do
++ local peer_address, peer_port = string.match(peer_bind, "^(.*):(.*)$")
++ UCI.cursor_section(cursor, "cjdns", "udp_peer", nil, {
++ interface = i,
++ address = peer_address,
++ port = peer_port,
++ user = peer.user,
++ public_key = peer.publicKey,
++ password = peer.password
++ })
++ end
++ end
++ end
++ end
++
++ if obj.authorizedPasswords then
++ for i,password in pairs(obj.authorizedPasswords) do
++ local user = password.user
++ if not user or string.len(user) == 0 then
++ user = "user-" .. UCI.random_string(6)
++ end
++
++ UCI.cursor_section(cursor, "cjdns", "password", nil, {
++ password = password.password,
++ user = user,
++ contact = password.contact
++ })
++ end
++ end
++
++ return cursor:save("cjdns")
++end
++
++--- Simple backport of Cursor:section from luci.model.uci
++--
++-- Backport reason: we don't wanna depend on LuCI.
++-- @param Cursor the UCI cursor to operate on
++-- @param string name of the config
++-- @param string type of the section
++-- @param string name of the section (optional)
++-- @param table config values
++function UCI.cursor_section(cursor, config, type, section, values)
++ if section then
++ cursor:set(config, section, type)
++ else
++ section = cursor:add("cjdns", type)
++ end
++
++ for k,v in pairs(values) do
++ cursor:set(config, section, k, v)
++ end
++end
++
++function UCI.makeInterface()
++ local cursor = uci.cursor()
++
++ local config = cursor:get_all("cjdns", "cjdns")
++ if not config then return nil end
++
++ return common.AdminInterface.new({
++ host = config.admin_address,
++ port = config.admin_port,
++ password = config.admin_password,
++ config = UCI.get(),
++ timeout = 2
++ })
++end
++
++function UCI.random_string(length)
++ -- tr -cd 'A-Za-z0-9' < /dev/urandom
++ local urandom = io.popen("tr -cd 'A-Za-z0-9' 2> /dev/null < /dev/urandom", "r")
++ local string = urandom:read(length)
++ urandom:close()
++ return string
++end
+diff --git a/feeds/routing/cjdns/lua/cjdns/udp.lua b/feeds/routing/cjdns/lua/cjdns/udp.lua
+new file mode 100644
+index 0000000..9dd5901
+--- /dev/null
++++ b/feeds/routing/cjdns/lua/cjdns/udp.lua
+@@ -0,0 +1,102 @@
++-- Cjdns admin module for Lua
++-- Written by Philip Horger
++
++common = require 'cjdns/common'
++
++UDPInterface = {}
++UDPInterface.__index = UDPInterface
++common.UDPInterface = UDPInterface
++
++function UDPInterface.new(ai, config, ptype)
++ properties = {
++ ai = ai,
++ config = config or ai.config,
++ ptype = ptype or "ai"
++ }
++
++ return setmetatable(properties, UDPInterface)
++end
++
++function UDPInterface:call(name, args)
++ local func = self[name .. "_" .. self.ptype]
++ return func(self, unpack(args))
++end
++
++function UDPInterface:newBind(...)
++ return self:call("newBind", arg)
++end
++
++function UDPInterface:beginConnection(...)
++ return self:call("beginConnection", arg)
++end
++
++function UDPInterface:newBind_ai(address)
++ local response, err = self.ai:auth({
++ q = "UDPInterface_new",
++ bindAddress = address
++ })
++ if not response then
++ return nil, err
++ elseif response.error ~= "none" then
++ return nil, response.error
++ elseif response.interfaceNumber then
++ return response.interfaceNumber
++ else
++ return nil, "bad response format"
++ end
++end
++
++function UDPInterface:newBind_config(address)
++ local udpif = self.config.contents.interfaces.UDPInterface
++ local new_interface = {
++ bind = address,
++ connectTo = {}
++ }
++ table.insert(udpif, new_interface)
++ return (#udpif - 1), new_interface
++end
++
++function UDPInterface:newBind_perm(...)
++ return
++ self:newBind_config(unpack(arg)),
++ self:newBind_ai(unpack(arg))
++end
++
++function UDPInterface:beginConnection_ai(pubkey, addr, password, interface)
++ local request = {
++ q = "UDPInterface_beginConnection",
++ publicKey = pubkey,
++ address = addr,
++ password = password
++ }
++ if interface then
++ request.interfaceNumber = interface
++ end
++
++ local response, err = self.ai:auth(request)
++ if not response then
++ return nil, err
++ elseif response.error == "none" then
++ -- Unfortunately, no real success indicator either.
++ return "No error"
++ else
++ return nil, response.error
++ end
++end
++
++function UDPInterface:beginConnection_config(pubkey, addr, password, interface)
++ local udpif = self.config.contents.interfaces.UDPInterface
++ local connections = udpif[(interface or 0) + 1].connectTo
++ local this_conn = {
++ password = password,
++ publicKey = pubkey
++ }
++ connections[addr] = this_conn
++ return this_conn -- allows adding metadata fields afterwards
++end
++
++function UDPInterface:beginConnection_perm(...)
++ return
++ self:beginConnection_config(unpack(arg)),
++ self:beginConnection_ai(unpack(arg))
++end
+diff --git a/feeds/routing/hnetd/Makefile b/feeds/routing/hnetd/Makefile
+new file mode 100644
+index 0000000..89953f4
+--- /dev/null
++++ b/feeds/routing/hnetd/Makefile
+@@ -0,0 +1,163 @@
++#
++# Copyright (C) 2012-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=hnetd
++PKG_SOURCE_VERSION:=a67835f479ca9d756128c3554e8d4c21feb03b1f
++PKG_VERSION:=2015-09-29-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/sbyx/hnetd.git
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=GPL-2.0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++# Spammy debug builds for now
++CMAKE_OPTIONS += -DL_LEVEL=7
++
++# OpenWRT target
++CMAKE_OPTIONS += -DBACKEND=openwrt
++
++ifeq ($(BUILD_VARIANT),openssl)
++CMAKE_OPTIONS += -DDTLS_OPENSSL=1
++endif
++
++define Package/hnetd/Default
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=HNCP Homenet daemon - $(2)
++ URL:=https://github.com/sbyx/hnetd
++ DEPENDS:=+odhcpd +odhcp6c +netifd $(3)
++ DEPENDS+=+@IPV6
++ VARIANT:=$1
++endef
++
++Package/hnetd-nossl=$(call Package/hnetd/Default,nossl,no authentication)
++Package/hnetd-openssl=$(call Package/hnetd/Default,openssl,authentication via OpenSSL,+libopenssl)
++
++define Package/hnet-full
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=HNCP Homenet metapackage
++ URL:=https://github.com/sbyx/hnetd
++ DEPENDS:=+hnetd-nossl +luci-app-hnet +ip
++ # Routing
++ DEPENDS+=+babeld
++ # Service discovery
++ DEPENDS+=+ohybridproxy +zonestitcher
++ # Distributed PCP support
++ DEPENDS+=+miniupnpd +minimalist-pcproxy
++endef
++
++define Package/hnet-full-secure
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=HNCP Homenet metapackage (w/ SSL)
++ URL:=https://github.com/sbyx/hnetd
++ DEPENDS:=+hnetd-openssl +luci-app-hnet +ip
++ # Routing
++ DEPENDS+=+babeld
++ # Service discovery
++ DEPENDS+=+ohybridproxy +zonestitcher
++ # Distributed PCP support
++ DEPENDS+=+miniupnpd +minimalist-pcproxy
++endef
++
++define Package/hnet-full-l2tp
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=HNCP Homenet metapackage (w/ L2TP)
++ URL:=https://github.com/sbyx/hnetd
++ DEPENDS:=+hnetd-nossl +luci-app-hnet +ip-full +kmod-l2tp-eth
++ # Routing
++ DEPENDS+=+babeld
++ # Service discovery
++ DEPENDS+=+ohybridproxy +zonestitcher
++ # Distributed PCP support
++ DEPENDS+=+miniupnpd +minimalist-pcproxy
++endef
++
++define Package/luci-app-hnet
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=3. Applications
++ TITLE:=HNCP Homenet configuration and visualization
++# DEPENDS:=+hnetd
++# TBD - how to express dependency on 'some' hnetd?
++endef
++
++define Package/hnetd-$(BUILD_VARIANT)/description
++This package provides a daemon which implementats distributed prefix assignment
++and service discovery for a home network consisting of multiple routers
++connected to multiple service providers. It provides a netifd protocol "hnet"
++for use in /etc/config/network.
++endef
++
++define Package/hnetd-$(BUILD_VARIANT)/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/hnetd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/lib/netifd/proto
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/openwrt/hnet.sh $(1)/lib/netifd/proto
++ ln -s hnetd $(1)/usr/sbin/hnet-ifresolve
++ ln -s hnetd $(1)/usr/sbin/hnet-trust
++ ln -s hnetd $(1)/usr/sbin/hnet-dump
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/hnetd.init $(1)/etc/init.d/hnetd
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/hnet.config $(1)/etc/config/hnet
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/generic/ohp.script $(1)/usr/sbin/hnetd-ohp-script
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/generic/ddz.script $(1)/usr/sbin/hnetd-ddz-script
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/generic/pcp.script $(1)/usr/sbin/hnetd-pcp-script
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/generic/hnetd-routing $(1)/usr/sbin/hnetd-routing
++ $(INSTALL_DIR) $(1)/etc/uci-defaults
++ $(INSTALL_BIN) ./files/hnetd.defaults $(1)/etc/uci-defaults/x-hnetd.defaults
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/generic/multicast.script $(1)/usr/sbin/hnet-multicast
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/openwrt/autowifi.script $(1)/usr/sbin/autowifi
++endef
++
++define Package/hnet-full/install
++ true
++endef
++
++define Package/hnet-full-secure/install
++ true
++endef
++
++define Package/hnet-full-l2tp/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/generic/tunnel.script $(1)/usr/sbin/hnetd-tunnel
++endef
++
++define Package/luci-app-hnet/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci
++ $(INSTALL_DIR) $(1)/www
++ $(CP) -R $(PKG_BUILD_DIR)/openwrt/luci/luasrc/* $(1)/usr/lib/lua/luci/
++ $(CP) -R $(PKG_BUILD_DIR)/openwrt/luci/htdocs/* $(1)/www/
++endef
++
++define Package/hnetd-$(BUILD_VARIANT)/postinst
++#!/bin/sh
++[ -n "$${IPKG_INSTROOT}" ] || {
++ (. /etc/uci-defaults/x-hnetd.defaults) && rm -f /etc/uci-defaults/x-hnetd.defaults
++ [ -x /etc/init.d/dnsmasq ] && /etc/init.d/dnsmasq restart
++ /etc/init.d/hnetd enable
++ /etc/init.d/hnetd start
++}
++endef
++
++$(eval $(call BuildPackage,hnetd-nossl))
++$(eval $(call BuildPackage,hnetd-openssl))
++$(eval $(call BuildPackage,hnet-full))
++$(eval $(call BuildPackage,hnet-full-secure))
++$(eval $(call BuildPackage,hnet-full-l2tp))
++$(eval $(call BuildPackage,luci-app-hnet))
+diff --git a/feeds/routing/hnetd/files/hnet.config b/feeds/routing/hnetd/files/hnet.config
+new file mode 100644
+index 0000000..aba765f
+--- /dev/null
++++ b/feeds/routing/hnetd/files/hnet.config
+@@ -0,0 +1,28 @@
++config security security
++# Simplest security mode:
++# option password foo
++# Trust consensus and CA-based share these options:
++# option certificate_file /etc/hnetd-cert.pem
++# option private_key_file /etc/hnetd-key.pem
++# Then to enable trust consensus:
++# option trust_store /etc/hnetd-trust.dat
++# Or CA-based authentication:
++# option trust_certificate_file /etc/ca-cert.pem
++
++config pa pa
++# option ip4prefix 10.0.0.0/8
++# option ulaprefix fd12:3456:789A::/48
++# option ulamode off
++# option persistent_store /etc/hnet-pa.store
++
++config sd sd
++# option router_name openwrt
++# option domain_name home.
++
++
++# Wifi allows for very basic wifi autoconfiguration
++# Warning: This feature is unstable
++config wifi wifi
++# option enable 0
++# option ssid ssidtest
++# option password test
+diff --git a/feeds/routing/hnetd/files/hnetd.defaults b/feeds/routing/hnetd/files/hnetd.defaults
+new file mode 100644
+index 0000000..5ca7388
+--- /dev/null
++++ b/feeds/routing/hnetd/files/hnetd.defaults
+@@ -0,0 +1,12 @@
++#!/bin/sh
++
++# Why we tune dnsmasq?
++# localservice=0 => other hnetd instances can query for local names
++# boguspriv=0 => allow reverse resolution of RFC1918 w/o local hosts entries
++
++uci batch <<EOF
++set dhcp.odhcpd.maindhcp=1
++set dhcp.@dnsmasq[0].localservice=0
++set dhcp.@dnsmasq[0].boguspriv=0
++commit dhcp
++EOF
+diff --git a/feeds/routing/hnetd/files/hnetd.init b/feeds/routing/hnetd/files/hnetd.init
+new file mode 100644
+index 0000000..3ca2c2e
+--- /dev/null
++++ b/feeds/routing/hnetd/files/hnetd.init
+@@ -0,0 +1,124 @@
++#!/bin/sh /etc/rc.common
++
++# XXX - is there something that should cause reload? or can we just
++# use info from netifd and let it handle dynamic changes? let's hope
++# so..
++
++START=90
++STOP=10
++USE_PROCD=1
++
++DNSMASQ_DIR=/tmp/dnsmasq.d
++DNSMASQ_SCRIPT=/etc/init.d/dnsmasq
++OHP_SCRIPT=/usr/sbin/hnetd-ohp-script
++OHP_BINARY=/usr/sbin/ohybridproxy
++DDZ_SCRIPT=/usr/sbin/hnetd-ddz-script
++DDZ_BINARY=/usr/sbin/zonestitcher
++PCP_SCRIPT=/usr/sbin/hnetd-pcp-script
++PCP_BINARY=/usr/sbin/minimalist-pcproxy
++MULTICAST_SCRIPT=/usr/sbin/hnet-multicast
++WIFI_SCRIPT=/usr/sbin/autowifi
++
++start_service() {
++ . /lib/functions.sh
++ . /lib/functions/network.sh
++ config_load hnet
++
++ mkdir -p $DNSMASQ_DIR
++ procd_open_instance
++ procd_set_param command /usr/sbin/hnetd
++
++ # SD parts are here (make configurable?)
++ if [ -f $OHP_BINARY -a -f $DNSMASQ_SCRIPT ]
++ then
++ mkdir -p $DNSMASQ_DIR
++ procd_append_param command -d $DNSMASQ_SCRIPT
++ procd_append_param command -f $DNSMASQ_DIR/hnet.conf
++ procd_append_param command -o $OHP_SCRIPT
++ HOSTNAME=`cat /proc/sys/kernel/hostname`
++ if [ -n "$HOSTNAME" ]
++ then
++ procd_append_param command -n "$HOSTNAME"
++ fi
++ if [ -f $DDZ_BINARY ]
++ then
++ procd_append_param command -z $DDZ_SCRIPT
++ fi
++ fi
++
++ # Enable multicast if present and installed
++ if [ -f "$MULTICAST_SCRIPT" ]
++ then
++ $MULTICAST_SCRIPT status && procd_append_param command -M "$MULTICAST_SCRIPT"
++ fi
++
++ config_get enableval wifi enable
++ if [ -f "$WIFI_SCRIPT" -a "$enableval" = "1" ]; then
++ wifiopt=$WIFI_SCRIPT
++ config_get ssidval wifi ssid
++ config_get passval wifi password
++ if [ -n "$ssidval" -a -n "$passval" ]; then
++ wifiopt=${wifiopt},${ssidval}:${passval}
++ fi
++ procd_append_param command -w "$wifiopt"
++ fi
++
++ # Enable PCP, if it's present
++ if [ -f $PCP_BINARY -a -f $PCP_SCRIPT ]
++ then
++ procd_append_param command -c $PCP_SCRIPT
++ fi
++
++ # State file
++ config_get val pa persistent_store
++ procd_append_param command -s ${val:-/tmp/hnetd.pa_state}
++
++ # Routing script
++ procd_append_param command -r /usr/sbin/hnetd-routing
++
++ [ -x /usr/sbin/hnetd-tunnel ] && \
++ procd_append_param command -t /usr/sbin/hnetd-tunnel
++
++ # Prefix assignment (pa)
++ config_get val pa ip4prefix
++ [ -n "$val" ] && procd_append_param command --ip4prefix $val
++
++ config_get val pa ulaprefix
++ [ -n "$val" ] && procd_append_param command --ulaprefix $val
++
++ config_get val pa ulamode
++ [ -n "$val" ] && procd_append_param command --ulamode $val
++
++ # Service discovery (sd)
++ config_get val sd router_name
++ [ -n "$val" ] && procd_append_param command -n $val
++
++ config_get val sd domain_name
++ [ -n "$val" ] && procd_append_param command -m $val
++
++ # Security (needs security-enabled build)
++ config_get val security password
++ [ -n "$val" ] && procd_append_param command --password $val
++
++ config_get val security certificate_file
++ [ -n "$val" ] && procd_append_param command --certificate $val
++
++ config_get val security private_key_file
++ [ -n "$val" ] && procd_append_param command --privatekey $val
++
++ config_get val security trust_store
++ [ -n "$val" ] && procd_append_param command --trust $val
++
++ config_get val security trust_certificate_file
++ [ -n "$val" ] && procd_append_param command --verify-path $val
++
++ # For more verbose logging, uncomment this:
++ #procd_append_param command --loglevel 7
++
++ procd_set_param respawn
++ procd_close_instance
++}
++
++service_triggers() {
++ procd_add_reload_trigger "hnet"
++}
+diff --git a/feeds/routing/luci-app-bmx6/COPYING b/feeds/routing/luci-app-bmx6/COPYING
+new file mode 100644
+index 0000000..d511905
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/COPYING
+@@ -0,0 +1,339 @@
++ GNU GENERAL PUBLIC LICENSE
++ Version 2, June 1991
++
++ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ Everyone is permitted to copy and distribute verbatim copies
++ of this license document, but changing it is not allowed.
++
++ Preamble
++
++ The licenses for most software are designed to take away your
++freedom to share and change it. By contrast, the GNU General Public
++License is intended to guarantee your freedom to share and change free
++software--to make sure the software is free for all its users. This
++General Public License applies to most of the Free Software
++Foundation's software and to any other program whose authors commit to
++using it. (Some other Free Software Foundation software is covered by
++the GNU Lesser General Public License instead.) You can apply it to
++your programs, too.
++
++ When we speak of free software, we are referring to freedom, not
++price. Our General Public Licenses are designed to make sure that you
++have the freedom to distribute copies of free software (and charge for
++this service if you wish), that you receive source code or can get it
++if you want it, that you can change the software or use pieces of it
++in new free programs; and that you know you can do these things.
++
++ To protect your rights, we need to make restrictions that forbid
++anyone to deny you these rights or to ask you to surrender the rights.
++These restrictions translate to certain responsibilities for you if you
++distribute copies of the software, or if you modify it.
++
++ For example, if you distribute copies of such a program, whether
++gratis or for a fee, you must give the recipients all the rights that
++you have. You must make sure that they, too, receive or can get the
++source code. And you must show them these terms so they know their
++rights.
++
++ We protect your rights with two steps: (1) copyright the software, and
++(2) offer you this license which gives you legal permission to copy,
++distribute and/or modify the software.
++
++ Also, for each author's protection and ours, we want to make certain
++that everyone understands that there is no warranty for this free
++software. If the software is modified by someone else and passed on, we
++want its recipients to know that what they have is not the original, so
++that any problems introduced by others will not reflect on the original
++authors' reputations.
++
++ Finally, any free program is threatened constantly by software
++patents. We wish to avoid the danger that redistributors of a free
++program will individually obtain patent licenses, in effect making the
++program proprietary. To prevent this, we have made it clear that any
++patent must be licensed for everyone's free use or not licensed at all.
++
++ The precise terms and conditions for copying, distribution and
++modification follow.
++
++ GNU GENERAL PUBLIC LICENSE
++ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
++
++ 0. This License applies to any program or other work which contains
++a notice placed by the copyright holder saying it may be distributed
++under the terms of this General Public License. The "Program", below,
++refers to any such program or work, and a "work based on the Program"
++means either the Program or any derivative work under copyright law:
++that is to say, a work containing the Program or a portion of it,
++either verbatim or with modifications and/or translated into another
++language. (Hereinafter, translation is included without limitation in
++the term "modification".) Each licensee is addressed as "you".
++
++Activities other than copying, distribution and modification are not
++covered by this License; they are outside its scope. The act of
++running the Program is not restricted, and the output from the Program
++is covered only if its contents constitute a work based on the
++Program (independent of having been made by running the Program).
++Whether that is true depends on what the Program does.
++
++ 1. You may copy and distribute verbatim copies of the Program's
++source code as you receive it, in any medium, provided that you
++conspicuously and appropriately publish on each copy an appropriate
++copyright notice and disclaimer of warranty; keep intact all the
++notices that refer to this License and to the absence of any warranty;
++and give any other recipients of the Program a copy of this License
++along with the Program.
++
++You may charge a fee for the physical act of transferring a copy, and
++you may at your option offer warranty protection in exchange for a fee.
++
++ 2. You may modify your copy or copies of the Program or any portion
++of it, thus forming a work based on the Program, and copy and
++distribute such modifications or work under the terms of Section 1
++above, provided that you also meet all of these conditions:
++
++ a) You must cause the modified files to carry prominent notices
++ stating that you changed the files and the date of any change.
++
++ b) You must cause any work that you distribute or publish, that in
++ whole or in part contains or is derived from the Program or any
++ part thereof, to be licensed as a whole at no charge to all third
++ parties under the terms of this License.
++
++ c) If the modified program normally reads commands interactively
++ when run, you must cause it, when started running for such
++ interactive use in the most ordinary way, to print or display an
++ announcement including an appropriate copyright notice and a
++ notice that there is no warranty (or else, saying that you provide
++ a warranty) and that users may redistribute the program under
++ these conditions, and telling the user how to view a copy of this
++ License. (Exception: if the Program itself is interactive but
++ does not normally print such an announcement, your work based on
++ the Program is not required to print an announcement.)
++
++These requirements apply to the modified work as a whole. If
++identifiable sections of that work are not derived from the Program,
++and can be reasonably considered independent and separate works in
++themselves, then this License, and its terms, do not apply to those
++sections when you distribute them as separate works. But when you
++distribute the same sections as part of a whole which is a work based
++on the Program, the distribution of the whole must be on the terms of
++this License, whose permissions for other licensees extend to the
++entire whole, and thus to each and every part regardless of who wrote it.
++
++Thus, it is not the intent of this section to claim rights or contest
++your rights to work written entirely by you; rather, the intent is to
++exercise the right to control the distribution of derivative or
++collective works based on the Program.
++
++In addition, mere aggregation of another work not based on the Program
++with the Program (or with a work based on the Program) on a volume of
++a storage or distribution medium does not bring the other work under
++the scope of this License.
++
++ 3. You may copy and distribute the Program (or a work based on it,
++under Section 2) in object code or executable form under the terms of
++Sections 1 and 2 above provided that you also do one of the following:
++
++ a) Accompany it with the complete corresponding machine-readable
++ source code, which must be distributed under the terms of Sections
++ 1 and 2 above on a medium customarily used for software interchange; or,
++
++ b) Accompany it with a written offer, valid for at least three
++ years, to give any third party, for a charge no more than your
++ cost of physically performing source distribution, a complete
++ machine-readable copy of the corresponding source code, to be
++ distributed under the terms of Sections 1 and 2 above on a medium
++ customarily used for software interchange; or,
++
++ c) Accompany it with the information you received as to the offer
++ to distribute corresponding source code. (This alternative is
++ allowed only for noncommercial distribution and only if you
++ received the program in object code or executable form with such
++ an offer, in accord with Subsection b above.)
++
++The source code for a work means the preferred form of the work for
++making modifications to it. For an executable work, complete source
++code means all the source code for all modules it contains, plus any
++associated interface definition files, plus the scripts used to
++control compilation and installation of the executable. However, as a
++special exception, the source code distributed need not include
++anything that is normally distributed (in either source or binary
++form) with the major components (compiler, kernel, and so on) of the
++operating system on which the executable runs, unless that component
++itself accompanies the executable.
++
++If distribution of executable or object code is made by offering
++access to copy from a designated place, then offering equivalent
++access to copy the source code from the same place counts as
++distribution of the source code, even though third parties are not
++compelled to copy the source along with the object code.
++
++ 4. You may not copy, modify, sublicense, or distribute the Program
++except as expressly provided under this License. Any attempt
++otherwise to copy, modify, sublicense or distribute the Program is
++void, and will automatically terminate your rights under this License.
++However, parties who have received copies, or rights, from you under
++this License will not have their licenses terminated so long as such
++parties remain in full compliance.
++
++ 5. You are not required to accept this License, since you have not
++signed it. However, nothing else grants you permission to modify or
++distribute the Program or its derivative works. These actions are
++prohibited by law if you do not accept this License. Therefore, by
++modifying or distributing the Program (or any work based on the
++Program), you indicate your acceptance of this License to do so, and
++all its terms and conditions for copying, distributing or modifying
++the Program or works based on it.
++
++ 6. Each time you redistribute the Program (or any work based on the
++Program), the recipient automatically receives a license from the
++original licensor to copy, distribute or modify the Program subject to
++these terms and conditions. You may not impose any further
++restrictions on the recipients' exercise of the rights granted herein.
++You are not responsible for enforcing compliance by third parties to
++this License.
++
++ 7. If, as a consequence of a court judgment or allegation of patent
++infringement or for any other reason (not limited to patent issues),
++conditions are imposed on you (whether by court order, agreement or
++otherwise) that contradict the conditions of this License, they do not
++excuse you from the conditions of this License. If you cannot
++distribute so as to satisfy simultaneously your obligations under this
++License and any other pertinent obligations, then as a consequence you
++may not distribute the Program at all. For example, if a patent
++license would not permit royalty-free redistribution of the Program by
++all those who receive copies directly or indirectly through you, then
++the only way you could satisfy both it and this License would be to
++refrain entirely from distribution of the Program.
++
++If any portion of this section is held invalid or unenforceable under
++any particular circumstance, the balance of the section is intended to
++apply and the section as a whole is intended to apply in other
++circumstances.
++
++It is not the purpose of this section to induce you to infringe any
++patents or other property right claims or to contest validity of any
++such claims; this section has the sole purpose of protecting the
++integrity of the free software distribution system, which is
++implemented by public license practices. Many people have made
++generous contributions to the wide range of software distributed
++through that system in reliance on consistent application of that
++system; it is up to the author/donor to decide if he or she is willing
++to distribute software through any other system and a licensee cannot
++impose that choice.
++
++This section is intended to make thoroughly clear what is believed to
++be a consequence of the rest of this License.
++
++ 8. If the distribution and/or use of the Program is restricted in
++certain countries either by patents or by copyrighted interfaces, the
++original copyright holder who places the Program under this License
++may add an explicit geographical distribution limitation excluding
++those countries, so that distribution is permitted only in or among
++countries not thus excluded. In such case, this License incorporates
++the limitation as if written in the body of this License.
++
++ 9. The Free Software Foundation may publish revised and/or new versions
++of the General Public License from time to time. Such new versions will
++be similar in spirit to the present version, but may differ in detail to
++address new problems or concerns.
++
++Each version is given a distinguishing version number. If the Program
++specifies a version number of this License which applies to it and "any
++later version", you have the option of following the terms and conditions
++either of that version or of any later version published by the Free
++Software Foundation. If the Program does not specify a version number of
++this License, you may choose any version ever published by the Free Software
++Foundation.
++
++ 10. If you wish to incorporate parts of the Program into other free
++programs whose distribution conditions are different, write to the author
++to ask for permission. For software which is copyrighted by the Free
++Software Foundation, write to the Free Software Foundation; we sometimes
++make exceptions for this. Our decision will be guided by the two goals
++of preserving the free status of all derivatives of our free software and
++of promoting the sharing and reuse of software generally.
++
++ NO WARRANTY
++
++ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
++FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
++OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
++PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
++OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
++TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
++PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
++REPAIR OR CORRECTION.
++
++ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
++REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
++INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
++OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
++TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
++YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
++PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
++POSSIBILITY OF SUCH DAMAGES.
++
++ END OF TERMS AND CONDITIONS
++
++ How to Apply These Terms to Your New Programs
++
++ If you develop a new program, and you want it to be of the greatest
++possible use to the public, the best way to achieve this is to make it
++free software which everyone can redistribute and change under these terms.
++
++ To do so, attach the following notices to the program. It is safest
++to attach them to the start of each source file to most effectively
++convey the exclusion of warranty; and each file should have at least
++the "copyright" line and a pointer to where the full notice is found.
++
++ <one line to give the program's name and a brief idea of what it does.>
++ Copyright (C) <year> <name of author>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++Also add information on how to contact you by electronic and paper mail.
++
++If the program is interactive, make it output a short notice like this
++when it starts in an interactive mode:
++
++ Gnomovision version 69, Copyright (C) year name of author
++ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
++ This is free software, and you are welcome to redistribute it
++ under certain conditions; type `show c' for details.
++
++The hypothetical commands `show w' and `show c' should show the appropriate
++parts of the General Public License. Of course, the commands you use may
++be called something other than `show w' and `show c'; they could even be
++mouse-clicks or menu items--whatever suits your program.
++
++You should also get your employer (if you work as a programmer) or your
++school, if any, to sign a "copyright disclaimer" for the program, if
++necessary. Here is a sample; alter the names:
++
++ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
++ `Gnomovision' (which makes passes at compilers) written by James Hacker.
++
++ <signature of Ty Coon>, 1 April 1989
++ Ty Coon, President of Vice
++
++This General Public License does not permit incorporating your program into
++proprietary programs. If your program is a subroutine library, you may
++consider it more useful to permit linking proprietary applications with the
++library. If this is what you want to do, use the GNU Lesser General
++Public License instead of this License.
+diff --git a/feeds/routing/luci-app-bmx6/Makefile b/feeds/routing/luci-app-bmx6/Makefile
+new file mode 100644
+index 0000000..ec69d2d
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/Makefile
+@@ -0,0 +1,62 @@
++# Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License along
++# with this program; if not, write to the Free Software Foundation, Inc.,
++# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# The full GNU General Public License is included in this distribution in
++# the file called "COPYING".
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-app-bmx6
++PKG_RELEASE:=3
++
++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
++PKG_LICENSE:=GPL-2.0+
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luci-app-bmx6
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=3. Applications
++ TITLE:= bmx6 configuration, status and visualization module
++ DEPENDS:=+luci-lib-json +luci-mod-admin-full +luci-lib-httpclient +bmx6
++ MAINTAINER:= Pau Escrich <p4u@dabax.net>
++endef
++
++define Package/luci-app-bmx6/description
++ bmx6 web application (status and configuration) for LuCi web interface
++endef
++
++define Package/luci-app-bmx6/conffiles
++ /etc/config/luci-bmx6
++endef
++
++define Build/Prepare
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/luci-app-bmx6/install
++ $(CP) ./files/* $(1)/
++ chmod 755 $(1)/www/cgi-bin/bmx6-info
++endef
++
++$(eval $(call BuildPackage,luci-app-bmx6))
++
+diff --git a/feeds/routing/luci-app-bmx6/files/etc/config/luci-bmx6 b/feeds/routing/luci-app-bmx6/files/etc/config/luci-bmx6
+new file mode 100644
+index 0000000..df1e715
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/etc/config/luci-bmx6
+@@ -0,0 +1,7 @@
++config 'bmx6' 'luci'
++ option ignore '0'
++ option place 'admin network BMX6'
++ #option place 'qmp Mesh'
++ option position '3'
++ #option json 'http://127.0.0.1/cgi-bin/bmx6-info?'
++ option json 'exec:/www/cgi-bin/bmx6-info -s'
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/controller/bmx6.lua b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/controller/bmx6.lua
+new file mode 100644
+index 0000000..5842fc9
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/controller/bmx6.lua
+@@ -0,0 +1,277 @@
++--[[
++ Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++ Contributors Jo-Philipp Wich <xm@subsignal.org>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++ The full GNU General Public License is included in this distribution in
++ the file called "COPYING".
++--]]
++
++local bmx6json = require("luci.model.bmx6json")
++
++module("luci.controller.bmx6", package.seeall)
++
++function index()
++ local place = {}
++ local ucim = require "luci.model.uci"
++ local uci = ucim.cursor()
++
++ -- checking if ignore is on
++ if uci:get("luci-bmx6","luci","ignore") == "1" then
++ return nil
++ end
++
++ -- getting value from uci database
++ local uci_place = uci:get("luci-bmx6","luci","place")
++
++ -- default values
++ if uci_place == nil then
++ place = {"bmx6"}
++ else
++ local util = require "luci.util"
++ place = util.split(uci_place," ")
++ end
++
++ -- getting position of menu
++ local uci_position = uci:get("luci-bmx6","luci","position")
++
++ ---------------------------
++ -- Starting with the pages
++ ---------------------------
++
++ --- status (default)
++ entry(place,call("action_nodes_j"),place[#place],tonumber(uci_position))
++
++ table.insert(place,"Status")
++ entry(place,call("action_status_j"),"Status",0)
++ table.remove(place)
++
++ --- nodes
++ table.insert(place,"Nodes")
++ entry(place,call("action_nodes_j"),"Nodes",1)
++ table.remove(place)
++
++ --- links
++ table.insert(place,"Links")
++ entry(place,call("action_links"),"Links",2).leaf = true
++ table.remove(place)
++
++ -- Tunnels
++ table.insert(place,"Tunnels")
++ entry(place,call("action_tunnels_j"), "Tunnels", 3).leaf = true
++ table.remove(place)
++
++ --- Chat
++ table.insert(place,"Chat")
++ entry(place,call("action_chat"),"Chat",5)
++ table.remove(place)
++
++ --- Graph
++ table.insert(place,"Graph")
++ entry(place, template("bmx6/graph"), "Graph",4)
++ table.remove(place)
++
++ --- Topology (hidden)
++ table.insert(place,"topology")
++ entry(place, call("action_topology"), nil)
++ table.remove(place)
++
++ --- configuration (CBI)
++ table.insert(place,"Configuration")
++ entry(place, cbi("bmx6/main"), "Configuration",6).dependent=false
++
++ table.insert(place,"General")
++ entry(place, cbi("bmx6/main"), "General",1)
++ table.remove(place)
++
++ table.insert(place,"Advanced")
++ entry(place, cbi("bmx6/advanced"), "Advanced",5)
++ table.remove(place)
++
++ table.insert(place,"Interfaces")
++ entry(place, cbi("bmx6/interfaces"), "Interfaces",2)
++ table.remove(place)
++
++ table.insert(place,"Tunnels")
++ entry(place, cbi("bmx6/tunnels"), "Tunnels",3)
++ table.remove(place)
++
++ table.insert(place,"Plugins")
++ entry(place, cbi("bmx6/plugins"), "Plugins",6)
++ table.remove(place)
++
++ table.insert(place,"HNAv6")
++ entry(place, cbi("bmx6/hna"), "HNAv6",4)
++ table.remove(place)
++
++ table.remove(place)
++
++end
++
++function action_status_j()
++ luci.template.render("bmx6/status_j", {})
++end
++
++
++function action_nodes_j()
++ local http = require "luci.http"
++ local link_non_js = "/cgi-bin/luci" .. http.getenv("PATH_INFO") .. '/nodes_nojs'
++
++ luci.template.render("bmx6/nodes_j", {link_non_js=link_non_js})
++end
++
++function action_gateways_j()
++ luci.template.render("bmx6/gateways_j", {})
++end
++
++function action_tunnels_j()
++ luci.template.render("bmx6/tunnels_j", {})
++end
++
++function action_links(host)
++ local links = bmx6json.get("links", host)
++ local devlinks = {}
++ local _,l
++
++ if links ~= nil then
++ links = links.links
++ for _,l in ipairs(links) do
++ devlinks[l.viaDev] = {}
++ end
++ for _,l in ipairs(links) do
++ l.name = luci.util.split(l.name,'.')[1]
++ table.insert(devlinks[l.viaDev],l)
++ end
++ end
++
++ luci.template.render("bmx6/links", {links=devlinks})
++end
++
++function action_topology()
++ local originators = bmx6json.get("originators/all")
++ local o,i,l,i2
++ local first = true
++ local topology = '[ '
++ local cache = '/tmp/bmx6-topology.json'
++ local offset = 60
++
++ local cachefd = io.open(cache,r)
++ local update = false
++
++ if cachefd ~= nil then
++ local lastupdate = tonumber(cachefd:read("*line")) or 0
++ if os.time() >= lastupdate + offset then
++ update = true
++ else
++ topology = cachefd:read("*all")
++ end
++ cachefd:close()
++ end
++
++ if cachefd == nil or update then
++ for i,o in ipairs(originators) do
++ local links = bmx6json.get("links",o.primaryIp)
++ if links then
++ if first then
++ first = false
++ else
++ topology = topology .. ', '
++ end
++
++ topology = topology .. '{ "name": "%s", "links": [' %o.name
++
++ local first2 = true
++
++ for i2,l in ipairs(links.links) do
++ if first2 then
++ first2 = false
++ else
++ topology = topology .. ', '
++ end
++ name = l.name or l.llocalIp or "unknown"
++ topology = topology .. '{ "name": "%s", "rxRate": %s, "txRate": %s }'
++ %{ name, l.rxRate, l.txRate }
++
++ end
++
++ topology = topology .. ']}'
++ end
++
++ end
++
++ topology = topology .. ' ]'
++
++ -- Upgrading the content of the cache file
++ cachefd = io.open(cache,'w+')
++ cachefd:write(os.time()..'\n')
++ cachefd:write(topology)
++ cachefd:close()
++ end
++
++ luci.http.prepare_content("application/json")
++ luci.http.write(topology)
++end
++
++
++function action_chat()
++ local sms_dir = "/var/run/bmx6/sms"
++ local rcvd_dir = sms_dir .. "/rcvdSms"
++ local send_file = sms_dir .. "/sendSms/chat"
++ local sms_list = bmx6json.get("rcvdSms")
++ local sender = ""
++ local sms_file = ""
++ local chat = {}
++ local to_send = nil
++ local sent = ""
++ local fd = nil
++
++ if luci.sys.call("test -d " .. sms_dir) ~= 0 then
++ luci.template.render("bmx6/error", {txt="sms plugin disabled or some problem with directory " .. sms_dir})
++ return nil
++ end
++
++ sms_list = luci.util.split(luci.util.exec("ls "..rcvd_dir.."/*:chat"))
++
++ for _,sms_path in ipairs(sms_list) do
++ if #sms_path > #rcvd_dir then
++ sms_file = luci.util.split(sms_path,'/')
++ sms_file = sms_file[#sms_file]
++ sender = luci.util.split(sms_file,':')[1]
++
++ -- Trying to clean the name
++ if string.find(sender,".") ~= nil then
++ sender = luci.util.split(sender,".")[1]
++ end
++
++ fd = io.open(sms_path,"r")
++ chat[sender] = fd:read()
++ fd:close()
++ end
++ end
++
++ to_send = luci.http.formvalue("toSend")
++ if to_send ~= nil and #to_send > 1 then
++ fd = io.open(send_file,"w")
++ fd:write(to_send)
++ fd:close()
++ sent = to_send
++ else
++ sent = luci.util.exec("cat "..send_file)
++ end
++
++ luci.template.render("bmx6/chat", {chat=chat,sent=sent})
++end
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/bmx6json.lua b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/bmx6json.lua
+new file mode 100644
+index 0000000..dfe9ab1
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/bmx6json.lua
+@@ -0,0 +1,219 @@
++--[[
++ Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++ Contributors Jo-Philipp Wich <xm@subsignal.org>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++ The full GNU General Public License is included in this distribution in
++ the file called "COPYING".
++--]]
++
++local ltn12 = require("luci.ltn12")
++local json = require("luci.json")
++local util = require("luci.util")
++local uci = require("luci.model.uci")
++local sys = require("luci.sys")
++local template = require("luci.template")
++local http = require("luci.http")
++local string = require("string")
++local table = require("table")
++local nixio = require("nixio")
++local nixiofs = require("nixio.fs")
++local ipairs = ipairs
++
++module "luci.model.bmx6json"
++
++-- Returns a LUA object from bmx6 JSON daemon
++
++function get(field, host)
++ local url
++ if host ~= nil then
++ if host:match(":") then
++ url = 'http://[%s]/cgi-bin/bmx6-info?' % host
++ else
++ url = 'http://%s/cgi-bin/bmx6-info?' % host
++ end
++ else
++ url = uci.cursor():get("luci-bmx6","luci","json")
++ end
++
++ if url == nil then
++ print_error("bmx6 json url not configured, cannot fetch bmx6 daemon data",true)
++ return nil
++ end
++
++ local json_url = util.split(url,":")
++ local raw = ""
++
++ if json_url[1] == "http" then
++ raw,err = wget(url..field,1000)
++ else
++
++ if json_url[1] == "exec" then
++ raw = sys.exec(json_url[2]..' '..field)
++ else
++ print_error("bmx6 json url not recognized, cannot fetch bmx6 daemon data. Use http: or exec:",true)
++ return nil
++ end
++
++ end
++
++ local data = nil
++
++ if raw and raw:len() > 10 then
++ local decoder = json.Decoder()
++ ltn12.pump.all(ltn12.source.string(raw), decoder:sink())
++ data = decoder:get()
++-- else
++-- print_error("Cannot get data from bmx6 daemon",true)
++-- return nil
++ end
++
++ return data
++end
++
++function print_error(txt,popup)
++ util.perror(txt)
++ sys.call("logger -t bmx6json " .. txt)
++
++ if popup then
++ http.write('<script type="text/javascript">alert("Some error detected, please check it: '..txt..'");</script>')
++ else
++ http.write("<h1>Dammit! some error detected</h1>")
++ http.write("bmx6-luci: " .. txt)
++ http.write('<p><FORM><INPUT TYPE="BUTTON" VALUE="Go Back" ONCLICK="history.go(-1)"></FORM></p>')
++ end
++
++end
++
++function text2html(txt)
++ txt = string.gsub(txt,"<","{")
++ txt = string.gsub(txt,">","}")
++ txt = util.striptags(txt)
++ return txt
++end
++
++
++function wget(url, timeout)
++ local rfd, wfd = nixio.pipe()
++ local pid = nixio.fork()
++ if pid == 0 then
++ rfd:close()
++ nixio.dup(wfd, nixio.stdout)
++
++ local candidates = { "/usr/bin/wget", "/bin/wget" }
++ local _, bin
++ for _, bin in ipairs(candidates) do
++ if nixiofs.access(bin, "x") then
++ nixio.exec(bin, "-q", "-O", "-", url)
++ end
++ end
++ return
++ else
++ wfd:close()
++ rfd:setblocking(false)
++
++ local buffer = { }
++ local err1, err2
++
++ while true do
++ local ready = nixio.poll({{ fd = rfd, events = nixio.poll_flags("in") }}, timeout)
++ if not ready then
++ nixio.kill(pid, nixio.const.SIGKILL)
++ err1 = "timeout"
++ break
++ end
++
++ local rv = rfd:read(4096)
++ if rv then
++ -- eof
++ if #rv == 0 then
++ break
++ end
++
++ buffer[#buffer+1] = rv
++ else
++ -- error
++ if nixio.errno() ~= nixio.const.EAGAIN and
++ nixio.errno() ~= nixio.const.EWOULDBLOCK then
++ err1 = "error"
++ err2 = nixio.errno()
++ end
++ end
++ end
++
++ nixio.waitpid(pid, "nohang")
++ if not err1 then
++ return table.concat(buffer)
++ else
++ return nil, err1, err2
++ end
++ end
++end
++
++function getOptions(name)
++ -- Getting json and Checking if bmx6-json is avaiable
++ local options = get("options")
++ if options == nil or options.OPTIONS == nil then
++ m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
++ return nil
++ else
++ options = options.OPTIONS
++ end
++
++ -- Filtering by the option name
++ local i,_
++ local namedopt = nil
++ if name ~= nil then
++ for _,i in ipairs(options) do
++ if i.name == name and i.CHILD_OPTIONS ~= nil then
++ namedopt = i.CHILD_OPTIONS
++ break
++ end
++ end
++ end
++
++ return namedopt
++end
++
++-- Rturns a help string formated to be used in HTML scope
++function getHtmlHelp(opt)
++ if opt == nil then return nil end
++
++ local help = ""
++ if opt.help ~= nil then
++ help = text2html(opt.help)
++ end
++ if opt.syntax ~= nil then
++ help = help .. "<br/><b>Syntax: </b>" .. text2html(opt.syntax)
++ end
++
++ return help
++end
++
++function testandreload()
++ local test = sys.call('bmx6 -c --test > /tmp/bmx6-luci.err.tmp')
++ if test ~= 0 then
++ return sys.exec("cat /tmp/bmx6-luci.err.tmp")
++ end
++
++ local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
++ if err ~= 0 then
++ return sys.exec("cat /tmp/bmx6-luci.err.tmp")
++ end
++
++ return nil
++end
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/advanced.lua b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/advanced.lua
+new file mode 100644
+index 0000000..c254899
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/advanced.lua
+@@ -0,0 +1,75 @@
++--[[
++ Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++ The full GNU General Public License is included in this distribution in
++ the file called "COPYING".
++--]]
++
++m = Map("bmx6", "bmx6")
++
++local bmx6json = require("luci.model.bmx6json")
++local util = require("luci.util")
++local http = require("luci.http")
++local sys = require("luci.sys")
++
++local options = bmx6json.get("options")
++if options == nil or options.OPTIONS == nil then
++ m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
++ options = {}
++else
++ options = options.OPTIONS
++end
++
++local general = m:section(NamedSection,"general","bmx6")
++general.addremove = true
++
++local name = ""
++local help = ""
++local value = nil
++local _,o
++
++for _,o in ipairs(options) do
++ if o.name ~= nil and o.CHILD_OPTIONS == nil and o.configurable == 1 then
++ help = ""
++ name = o.name
++
++ if o.help ~= nil then
++ help = bmx6json.text2html(o.help)
++ end
++
++ if o.syntax ~= nil then
++ help = help .. "<br/><strong>Syntax: </strong>" .. bmx6json.text2html(o.syntax)
++ end
++
++ if o.def ~= nil then
++ help = help .. "<strong> Default: </strong>" .. o.def
++ end
++
++ value = general:option(Value,name,name,help)
++
++ end
++end
++
++function m.on_commit(self,map)
++ local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
++ if err ~= 0 then
++ m.message = sys.exec("cat /tmp/bmx6-luci.err.tmp")
++ end
++end
++
++return m
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/hna.lua b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/hna.lua
+new file mode 100644
+index 0000000..db98ae6
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/hna.lua
+@@ -0,0 +1,47 @@
++--[[
++ Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++ The full GNU General Public License is included in this distribution in
++ the file called "COPYING".
++--]]
++
++local sys = require("luci.sys")
++
++m = Map("bmx6", "bmx6")
++
++local hna = m:section(TypedSection,"unicastHna","IPv6 HNA")
++hna.addremove = true
++hna.anonymous = true
++local hna_option = hna:option(Value,"unicastHna", "IPv6 Host Network Announcement. Syntax <NETADDR>/<PREFIX>")
++
++--function hna_option:validate(value)
++-- local err = sys.call('bmx6 -c --test -a ' .. value)
++-- if err ~= 0 then
++-- return nil
++-- end
++-- return value
++--end
++
++function m.on_commit(self,map)
++ local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
++ if err ~= 0 then
++ m.message = sys.exec("cat /tmp/bmx6-luci.err.tmp")
++ end
++end
++
++return m
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/interfaces.lua b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/interfaces.lua
+new file mode 100644
+index 0000000..fb1261b
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/interfaces.lua
+@@ -0,0 +1,77 @@
++--[[
++ Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++ The full GNU General Public License is included in this distribution in
++ the file called "COPYING".
++--]]
++
++local sys = require("luci.sys")
++local bmx6json = require("luci.model.bmx6json")
++local m = Map("bmx6", "bmx6")
++
++local eth_int = sys.net.devices()
++local interfaces = m:section(TypedSection,"dev","Devices","")
++interfaces.addremove = true
++interfaces.anonymous = true
++
++local intlv = interfaces:option(ListValue,"dev","Device")
++
++for _,i in ipairs(eth_int) do
++ intlv:value(i,i)
++end
++
++-- Getting json and looking for device section
++local json = bmx6json.get("options")
++
++if json == nil or json.OPTIONS == nil then
++ m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
++ json = {}
++else
++ json = json.OPTIONS
++end
++
++local dev = {}
++for _,j in ipairs(json) do
++ if j.name == "dev" and j.CHILD_OPTIONS ~= nil then
++ dev = j.CHILD_OPTIONS
++ break
++ end
++end
++
++local help = ""
++local name = ""
++
++for _,o in ipairs(dev) do
++ if o.name ~= nil then
++ help = ""
++ name = o.name
++ if o.help ~= nil then
++ help = bmx6json.text2html(o.help)
++ end
++
++ if o.syntax ~= nil then
++ help = help .. "<br/><strong>Syntax: </strong>" .. bmx6json.text2html(o.syntax)
++ end
++
++ value = interfaces:option(Value,name,name,help)
++ value.optional = true
++ end
++end
++
++
++return m
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/main.lua b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/main.lua
+new file mode 100644
+index 0000000..d4e0745
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/main.lua
+@@ -0,0 +1,104 @@
++--[[
++ Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++ The full GNU General Public License is included in this distribution in
++ the file called "COPYING".
++--]]
++
++local sys = require("luci.sys")
++local bmx6json = require("luci.model.bmx6json")
++
++m = Map("bmx6", "bmx6")
++
++-- Getting json and Checking if bmx6-json is avaiable
++local options = bmx6json.get("options")
++if options == nil or options.OPTIONS == nil then
++ m.message = "bmx6-json plugin is not running or some mistake in luci-bmx6 configuration, check /etc/config/luci-bmx6"
++else
++ options = options.OPTIONS
++end
++
++-- Getting a list of interfaces
++local eth_int = luci.sys.net.devices()
++
++local tunDev = m:section(TypedSection,"tunDev",translate("Tunnel device"),translate("Define incoming ipip tunnel interface name"))
++tunDev.addremove = true
++tunDev.anonymous = true
++tunDev:option(Value,"tunDev",translate("Name"),translate("Name for the tunnel network device"))
++tunDev:option(Value,"tun4Address", translate("IPv4 address/length"),translate("Specify default IPv4 tunnel address and announced range (ex. 10.1.2.3/24)"))
++tunDev:option(Value,"tun6Address", translate("IPv6 address/length"),translate("Specify default IPv6 tunnel address and announced range (ex. 2012:0:0:123:0:0:0:1/64)"))
++
++-- IP section
++local ipV = m:section(NamedSection,"ipVersion","ipVersion",translate("Miscellaneous IP options"))
++ipV.addremove = false
++local lipv = ipV:option(ListValue,"ipVersion",translate("IP version"))
++lipv:value("6","6")
++lipv.default = "6"
++
++-- rest of ip options are optional, getting them from json
++local ipoptions = {}
++for _,o in ipairs(options) do
++ if o.name == "ipVersion" and o.CHILD_OPTIONS ~= nil then
++ ipoptions = o.CHILD_OPTIONS
++ break
++ end
++end
++
++local help = ""
++local name = ""
++local value = nil
++
++for _,o in ipairs(ipoptions) do
++ if o.name ~= nil then
++ help = ""
++ name = o.name
++ if o.help ~= nil then
++ help = bmx6json.text2html(o.help)
++ end
++
++ if o.syntax ~= nil then
++ help = help .. "<br/><strong>Syntax: </strong>" .. bmx6json.text2html(o.syntax)
++ end
++
++ if o.def ~= nil then
++ help = help .. "<br/><strong> Default: </strong>" .. bmx6json.text2html(o.def)
++ end
++
++ value = ipV:option(Value,name,name,help)
++ value.optional = true
++ end
++end
++
++-- Interfaces section
++local interfaces = m:section(TypedSection,"dev",translate("Devices"),translate("Network devices to mesh with"))
++interfaces.addremove = true
++interfaces.anonymous = true
++local intlv = interfaces:option(ListValue,"dev",translate("Device"))
++
++for _,i in ipairs(eth_int) do
++ intlv:value(i,i)
++end
++
++function m.on_commit(self,map)
++ local err = sys.call('bmx6 -c --configReload > /tmp/bmx6-luci.err.tmp')
++ if err ~= 0 then
++ m.message = sys.exec("cat /tmp/bmx6-luci.err.tmp")
++ end
++end
++
++return m
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/plugins.lua b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/plugins.lua
+new file mode 100644
+index 0000000..518864e
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/plugins.lua
+@@ -0,0 +1,50 @@
++--[[
++ Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++ The full GNU General Public License is included in this distribution in
++ the file called "COPYING".
++--]]
++local sys = require("luci.sys")
++
++m = Map("bmx6", "bmx6")
++plugins_dir = {"/usr/lib/","/var/lib","/lib"}
++
++plugin = m:section(TypedSection,"plugin","Plugin")
++plugin.addremove = true
++plugin.anonymous = true
++plv = plugin:option(ListValue,"plugin", "Plugin")
++
++for _,d in ipairs(plugins_dir) do
++ pl = luci.sys.exec("cd "..d..";ls bmx6_*")
++ if #pl > 6 then
++ for _,v in ipairs(luci.util.split(pl,"\n")) do
++ plv:value(v,v)
++ end
++ end
++end
++
++
++function m.on_commit(self,map)
++ local err = sys.call('/etc/init.d/bmx6 restart')
++ if err ~= 0 then
++ m.message = sys.exec("Cannot restart bmx6")
++ end
++end
++
++
++return m
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/tunnels.lua b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/tunnels.lua
+new file mode 100644
+index 0000000..92b14fc
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/model/cbi/bmx6/tunnels.lua
+@@ -0,0 +1,70 @@
++--[[
++ Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++ The full GNU General Public License is included in this distribution in
++ the file called "COPYING".
++--]]
++
++local sys = require("luci.sys")
++local bmx6json = require("luci.model.bmx6json")
++
++m = Map("bmx6", "bmx6")
++
++-- tunOut
++local tunnelsOut = m:section(TypedSection,"tunOut",translate("Networks to fetch"),translate("Gateways announcements to fetch"))
++tunnelsOut.addremove = true
++tunnelsOut.anonymous = true
++tunnelsOut:option(Value,"tunOut","Name")
++tunnelsOut:option(Value,"network", translate("Network to fetch"))
++
++local tunoptions = bmx6json.getOptions("tunOut")
++local _,o
++for _,o in ipairs(tunoptions) do
++ if o.name ~= nil and o.name ~= "network" then
++ help = bmx6json.getHtmlHelp(o)
++ value = tunnelsOut:option(Value,o.name,o.name,help)
++ value.optional = true
++ end
++end
++
++
++-- tunOut
++local tunnelsIn = m:section(TypedSection,"tunIn",translate("Networks to offer"),translate("Gateways to announce in the network"))
++tunnelsIn.addremove = true
++tunnelsIn.anonymous = true
++tunnelsIn:option(Value,"tunIn","Name")
++tunnelsIn:option(Value,"network", translate("Network to offer"))
++
++local tunInoptions = bmx6json.getOptions("tunIn")
++local _,o
++for _,o in ipairs(tunInoptions) do
++ if o.name ~= nil and o.name ~= "network" then
++ help = bmx6json.getHtmlHelp(o)
++ value = tunnelsIn:option(Value,o.name,o.name,help)
++ value.optional = true
++ end
++end
++
++function m.on_commit(self,map)
++ --Not working. If test returns error the changes are still commited
++ local msg = bmx6json.testandreload()
++ if msg ~= nil then
++ m.message = msg
++ end
++end
++
++return m
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/admin_status/index/neighbours_simple.htm b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/admin_status/index/neighbours_simple.htm
+new file mode 100644
+index 0000000..97d6e0e
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/admin_status/index/neighbours_simple.htm
+@@ -0,0 +1,108 @@
++<script type="text/javascript">//<![CDATA[
++
++ XHR.poll(5, '/cgi-bin/bmx6-info', { '$neighbours': '' },
++ function(x, st)
++ {
++ var originators = st.neighbours[0].originators;
++ var descriptions = st.neighbours[1].descriptions;
++
++ var tb = document.getElementById('descriptions_table');
++
++ if ( originators.length != descriptions.length )
++ {
++ var tr = tb.insertRow(-1);
++ tr.className = 'cbi-section-table-row';
++ var td = tr.insertCell(-1);
++ td.colSpan = 7;
++ td.innerHTML = '<em><br /><%:Some problem with JSON: lenght of originators and descriptions different. %></em>';
++ return 1;
++ }
++
++ if ( originators && descriptions && tb)
++ {
++ /* clear all rows */
++ while( tb.rows.length > 1 )
++ tb.deleteRow(1);
++
++ for( var i = 0; i < descriptions.length; i++ )
++ {
++ var tr = tb.insertRow(-1);
++ tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
++ tr.insertCell(-1).innerHTML = descriptions[i].DESC_ADV.globalId.replace(/\.[^\.]+$/,"");
++
++ var extensions = descriptions[i].DESC_ADV.extensions;
++
++ //Looking for the extensions
++ var hna6 = [];
++ for( var e = 0; e < extensions.length; e++)
++ {
++ if( extensions[e].HNA6_EXTENSION )
++ {
++ hna6 = extensions[e].HNA6_EXTENSION;
++ break;
++ }
++ }
++
++ //Adding first HNA with prefix=128 as main address
++ var ipstxt = '';
++ var address;
++ var prefix;
++
++ for( var e = 0; e < hna6.length; e++ )
++ {
++ address = hna6[e].address;
++ prefix = hna6[e].prefixlen;
++ if ( prefix == '128' )
++ {
++ ipstxt += address;
++ break;
++ }
++ }
++
++ tr.insertCell(-1).innerHTML = ipstxt;
++
++ tr.insertCell(-1).innerHTML = originators[i].viaDev;
++ tr.insertCell(-1).innerHTML = originators[i].metric;
++ tr.insertCell(-1).innerHTML = originators[i].lastDesc;
++ tr.insertCell(-1).innerHTML = originators[i].lastRef;
++ tr.insertCell(-1).innerHTML = originators[i].blocked;
++
++ }
++
++ if( tb.rows.length == 1 )
++ {
++ var tr = tb.insertRow(-1);
++ tr.className = 'cbi-section-table-row';
++
++ var td = tr.insertCell(-1);
++ td.colSpan = 7;
++ td.innerHTML = '<em><br /><%:There are no nodes available.%></em>';
++ }
++ }
++ }
++ );
++//]]></script>
++
++<div class="cbi-map">
++
++<fieldset class="cbi-section">
++ <legend><%:Mesh nodes%></legend>
++ <table class="cbi-section-table" id="descriptions_table">
++ <tr class="cbi-section-table-titles">
++ <th class="cbi-section-table-cell"><%:Hostname%></th>
++ <th class="cbi-section-table-cell"><%:Primary IP%></th>
++ <th class="cbi-section-table-cell"><%:Via Device%></th>
++ <th class="cbi-section-table-cell"><%:Metric%></th>
++ <th class="cbi-section-table-cell"><%:Last Desc%></th>
++ <th class="cbi-section-table-cell"><%:Last Ref%></th>
++ <th class="cbi-section-table-cell"><%:Blocked%></th>
++ </tr>
++ <tr class="cbi-section-table-row">
++ <td colspan="7"><em><br /><%:Collecting data...%></em></td>
++ </tr>
++ </table>
++</fieldset>
++
++</div>
++
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/chat.htm b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/chat.htm
+new file mode 100644
+index 0000000..8e25b11
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/chat.htm
+@@ -0,0 +1,35 @@
++<%+header%>
++<meta http-equiv="refresh" content="60" />
++<h2><a id="content" name="content"><%:Chat%></a></h2>
++<p>This is sms a chat where all bmx6 nodes can participate. The data is replayed using routing packets, so there is a limit of 2040 bytes. Use it only to send short messages.</p>
++<p>Each participant can only send one sms at same time.</p>
++<br />
++
++<strong>Received SMS</strong>
++<br />
++<pre style="background-color:#dadbe6;">
++<% for orig,sms in pairs(chat) do %>
++ <u><%=orig%></u>:<%=sms%>
++<% end %>
++</pre>
++
++<form action=".">
++ <input type="submit" value="refresh" />
++</form>
++
++<br />
++
++<form action="." method="post">
++ <input type="text" name="toSend" />
++ <input type="submit" value="send sms" />
++</form>
++
++<br />
++<table>
++ <tr>
++ <td><strong>Your last sms: </strong></td>
++ <td><pre><%=sent%></pre></td>
++ </tr>
++</table>
++<%+footer%>
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/error.htm b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/error.htm
+new file mode 100644
+index 0000000..78de7b9
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/error.htm
+@@ -0,0 +1,10 @@
++<%+header%>
++<h2><a id="content" name="content"><%:ERROR%></a></h2>
++<strong>Some error has occurred</strong>
++<br />
++<pre>
++ <%=txt%>
++</pre>
++<br />
++<%+footer%>
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/gateways_j.htm b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/gateways_j.htm
+new file mode 100644
+index 0000000..12bfcd4
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/gateways_j.htm
+@@ -0,0 +1,120 @@
++<%+header%>
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++
++<script type="text/javascript">//<![CDATA[
++
++ var displayExtraInfo = function ( id ) {
++
++ document.getElementById('extra-info').innerHTML = document.getElementById(id).innerHTML;
++ }
++ XHR.poll(5, '/cgi-bin/bmx6-info', { 'descriptions/all': '' },
++ function(x, st)
++ {
++ var tb = document.getElementById('descriptions_table');
++ var rowcount = 0;
++ var tunicon = "<%=resource%>/icons/tunnel.png";
++ /* clear all rows */
++ while( tb.rows.length > 1 ) tb.deleteRow(1);
++
++ for ( var k in st )
++ {
++ var description = st[k].DESC_ADV;
++ var tun4in6;
++
++ for ( var k in description.extensions )
++ {
++ var value = description.extensions[k];
++
++ if ( value.TUN4IN6_NET_EXTENSION )
++ {
++ tun4in6 = value.TUN4IN6_NET_EXTENSION;
++ break;
++ }
++ }
++
++ if ( tun4in6 )
++ {
++ var nodename = description.globalId.replace(/\..+$/,'');
++
++ for( var i = 0; i < tun4in6.length; i++ )
++ {
++ var tr = tb.insertRow(-1);
++ var network = tun4in6[i].network;
++ var network_len = tun4in6[i].networklen;
++ var network_bw = tun4in6[i].bandwidth;
++
++ if ( network_len >= 32 ) continue;
++
++ tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((rowcount++ % 2) + 1);
++ tr.insertCell(-1).innerHTML = String.format('<a href="/cgi-bin/bmx6control?function=gwselect&amp;node=%s"><img src="%s" /></a>',nodename,tunicon);
++ tr.insertCell(-1).innerHTML = nodename;
++ tr.insertCell(-1).innerHTML = network + '/' + network_len;
++ tr.insertCell(-1).innerHTML = network_bw;
++
++
++ }
++
++ 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 gateways announced in the network.%></em>';
++ }
++ }
++ }
++ }
++ );
++//]]></script>
++
++<style>
++
++ div.hideme{
++ display: none;
++ }
++
++ div.info{
++ background: #FFF;
++ border: solid 1px;
++ height: 80px;
++ display: block;
++ overflow: auto;
++ }
++
++ div.inforow{
++ text-align:left;
++ display:inline-block;
++ width:20%;
++ margin:5px;
++ vertical-align:top;
++
++ }
++
++#extra-info ul { list-style: none outside none; margin-left: 0em; }
++
++</style>
++<div class="cbi-map">
++
++<h2>Originators</h2>
++<div class="cbi-map-descr"></div>
++<fieldset class="cbi-section">
++ <legend><%:Mesh gateways%></legend>
++ <table class="cbi-section-table" id="descriptions_table">
++ <tr class="cbi-section-table-titles">
++ <th class="cbi-section-table-cell"></th>
++ <th class="cbi-section-table-cell"><%:Node%></th>
++ <th class="cbi-section-table-cell"><%:Network%></th>
++ <th class="cbi-section-table-cell"><%:Bandwidth%></th>
++ </tr>
++ <tr class="cbi-section-table-row">
++ <td colspan="4"><em><br /><%:Collecting data...%></em></td>
++ </tr>
++ </table>
++</fieldset>
++
++</div>
++
++<%+footer%>
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/graph.htm b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/graph.htm
+new file mode 100644
+index 0000000..401e932
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/graph.htm
+@@ -0,0 +1,110 @@
++<%#
++Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++Contributors Jo-Philip
++
++This program is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 2 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License along
++with this program; if not, write to the Free Software Foundation, Inc.,
++51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++The full GNU General Public License is included in this distribution in
++the file called "COPYING".
++-%>
++
++<%
++ luci.http.prepare_content("text/html")
++
++ local location = { unpack(luci.dispatcher.context.path) }
++ location[#location] = "topology"
++%>
++
++<%+header%>
++
++<script type="text/javascript" src="<%=resource%>/bmx6/js/raphael-min.js"></script>
++<script type="text/javascript" src="<%=resource%>/bmx6/js/dracula_graffle.js"></script>
++<script type="text/javascript" src="<%=resource%>/bmx6/js/jquery-1.4.2.min.js"></script>
++<script type="text/javascript" src="<%=resource%>/bmx6/js/dracula_graph.js"></script>
++
++<button id="redraw" onclick="redraw();">&nbsp redraw &nbsp</button>
++
++<div id="wait" style="text-align: center">
++<br /><br />
++<img src="<%=resource%>/icons/loading.gif" />
++<%:Collecting data...%>
++
++</div>
++
++<div id="canvas" style="min-width:800px; min-height:800px"></div>
++
++<script type="text/javascript">//<![CDATA[
++ var redraw;
++
++ XHR.get('<%=luci.dispatcher.build_url(unpack(location))%>', null,
++ function(x, data)
++ {
++ var g = new Graph();
++ var seen = { };
++
++ for (var i = 0; i < (data.length); i++)
++ {
++ // node->node
++ if (data[i].name)
++ {
++ for (var j = 0; j < (data[i].links.length); j++)
++ {
++ var key = (data[i].name < data[i].links[j].name)
++ ? data[i].name + '|' + data[i].links[j].name
++ : data[i].links[j].name + '|' + data[i].name;
++
++ var rxRate = data[i].links[j].rxRate;
++ var txRate = data[i].links[j].txRate;
++
++ if (!seen[key] && rxRate>0 && txRate>0)
++ {
++ g.addEdge(data[i].name, data[i].links[j].name,
++ { label: rxRate + '/' + txRate,
++ directed: false, stroke: '#aaaaaa', fill: '#ffffff',
++ 'label-style': { 'font-size': 8 }});
++ seen[key] = true;
++ }
++ }
++ }
++ //g.addEdge(data[i].router, data[i].neighbor,
++ // { label: data[i].label, directed: true, stroke: '#aaaaaa' });
++ // node->leaf
++ //else if (data[i].router && data[i].gateway)
++ // g.addEdge(data[i].router, data[i].gateway,
++ // { label: 'leaf', stroke: '#cccccc' });
++ }
++
++ var canvas = document.getElementById('canvas');
++
++ var layouter = new Graph.Layout.Spring(g);
++ layouter.layout();
++
++ var divwait = document.getElementById("wait");
++ divwait.parentNode.removeChild(divwait);
++
++ var renderer = new Graph.Renderer.Raphael(canvas.id, g, canvas.offsetWidth, canvas.offsetHeight);
++ renderer.draw();
++
++ redraw = function() {
++ layouter.layout();
++ renderer.draw();
++ }
++
++ }
++ );
++//]]></script>
++
++
++<%+footer%>
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/links.htm b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/links.htm
+new file mode 100644
+index 0000000..77b9ed1
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/links.htm
+@@ -0,0 +1,55 @@
++<%+header%>
++<meta http-equiv="refresh" content="10" />
++<h2><a id="content" name="content"><%:Links%></a></h2>
++<br />
++<div id="links" style="position:relative;padding-left:2px">
++
++<% for j,d in pairs(links) do %>
++
++ <table>
++ <tr>
++ <td><img src="/luci-static/resources/bmx6/wifi.png"/></td>
++ <td><strong><%=j%></strong></td>
++ </tr>
++ </table>
++
++ <div style="display:table">
++
++<% for i,l in ipairs(d) do %>
++ <div id="link" style="background-color:#dadbe9;left:50px;width:300px;margin:10px;float:left;position:relative">
++ <table>
++ <tr><th colspan="2">
++ <span style="color:grey;font-weight:700;text-align:left;">
++ <%=l.name%>
++ <br />
++ </span>
++ </th></tr>
++ <tr>
++ <td><img src="/luci-static/resources/bmx6/link.png"/></td>
++ <td>
++ <ul>
++ <li>Local IP: <a href="[<%=l.llocalIp%>]"><%=l.llocalIp%></a></li>
++ <li>Device: <%=l.viaDev%></li>
++ <li>Rate (rx/tx):
++ <% if l.rxRate+l.txRate < 120 then %>
++ <span style="color:red;">
++ <% else %>
++ <span style="color:green;">
++ <% end %>
++ <%=l.rxRate%>/<%=l.txRate%>
++ </span>
++ </li>
++ <li>Routes: <%=l.routes%></li>
++ </ul>
++ </td>
++ </tr>
++ </table>
++ </div>
++<% end %>
++</div>
++<% end %>
++</div>
++
++<br />
++<br />
++<%+footer%>
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/nodes_j.htm b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/nodes_j.htm
+new file mode 100644
+index 0000000..8ebd5ee
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/nodes_j.htm
+@@ -0,0 +1,204 @@
++<%#
++ Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++ Contributors Lluis Esquerda <eskerda@gmail.com>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++ The full GNU General Public License is included in this distribution in
++ the file called "COPYING".
++-%>
++
++<%+header%>
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript" src="<%=resource%>/bmx6/js/polling.js"></script>
++
++
++<style>
++
++ div.hideme{
++ display: none;
++ }
++
++ div.info{
++ background: #FFF;
++ border: solid 0px;
++ height: 90px;
++ display: block;
++ overflow: auto;
++ }
++
++ div.inforow{
++ text-align:left;
++ display:inline-block;
++ width:20%;
++ margin:5px;
++ vertical-align:top;
++
++ }
++
++#extra-info ul { list-style: none outside none; margin-left: 0em; }
++
++</style>
++<div class="cbi-map">
++
++<h2>Node originators</h2>
++<div class="cbi-map-descr"></div>
++<div id="extra-info" class="info">
++ <br />
++ <center>
++ Click icon <img src="<%=resource%>/bmx6/world.png" /> to see individual node information
++ </center>
++</div>
++<fieldset class="cbi-section">
++ <legend><%:Mesh nodes%></legend>
++ <table class="cbi-section-table" id="descriptions_table">
++ <tr class="cbi-section-table-titles">
++ <th class="cbi-section-table-cell"></th>
++ <th class="cbi-section-table-cell"><%:Hostname%></th>
++ <th class="cbi-section-table-cell"><%:Primary IP%></th>
++ <th class="cbi-section-table-cell"><%:Via Device%></th>
++ <th class="cbi-section-table-cell"><%:Metric%></th>
++ <th class="cbi-section-table-cell"><%:Last Desc%></th>
++ <th class="cbi-section-table-cell"><%:Last Ref%></th>
++ <th class="cbi-section-table-cell"><%:Blocked%></th>
++ </tr>
++ <tr class="cbi-section-table-row">
++ <td colspan="8"><br /><center><em><%:Collecting data...%></em></center></td>
++ </tr>
++ </table>
++</fieldset>
++
++</div>
++
++<script type="text/javascript">//<![CDATA[
++ var displayExtraInfo = function ( id ) {
++ document.getElementById('extra-info').innerHTML = document.getElementById(id).innerHTML;
++ }
++
++ new TablePooler(5,"/cgi-bin/bmx6-info", {'$neighbours':''}, "descriptions_table", function(st){
++ var infoicon = "<%=resource%>/bmx6/world_small.png";
++ var nodeicon = "<%=resource%>/bmx6/world.png";
++ var originators = st.neighbours[0].originators;
++ var descriptions = st.neighbours[1].descriptions;
++ var res = Array();
++ var error = "";
++
++ if ( originators.length != descriptions.length )
++ {
++ error = '<em><br /><%:Some problem with JSON: lenght of originators and descriptions differs. %> \
++ <%: Please perform a cache flush from a console it this persists: bmx6 -c --flushAll %></em>';
++ res.push([[error,7]]);
++ return res;
++ }
++
++ for ( var i = 0; i < descriptions.length; i++ ){
++ var nodename = descriptions[i].DESC_ADV.globalId.replace(/\.[^\.]+$/,"");
++ var extensions = descriptions[i].DESC_ADV.extensions;
++ //var extrainfo = '<a onclick="displayExtraInfo(\'ip-' + i + '\')"><img src="' + infoicon + '" / ></a>';
++ var extrainfo_link = '<a onclick="displayExtraInfo(\'ip-' + i + '\')">' + '<img src="' + infoicon + '" />' + '</a>';
++ // Looking for the extensions
++ var hna6 = [];
++ var tun4in6 = [];
++ var tun6in6 = [];
++
++ for( var e = 0; e < extensions.length; e++)
++ {
++ if( extensions[e].HNA6_EXTENSION )
++ hna6 = extensions[e].HNA6_EXTENSION;
++ if ( extensions[e].TUN4IN6_NET_EXTENSION )
++ tun4in6 = extensions[e].TUN4IN6_NET_EXTENSION;
++ tun6in6 = extensions[e].TUN6IN6_NET_EXTENSION;
++ }
++
++ // Gateways
++ var gateways = '<ul>';
++ if ( typeof(tun4in6) !== "undefined" && tun4in6 !== null )
++ for ( var t = 0; t < tun4in6.length; t++)
++ {
++ if ( tun4in6[t].networklen == "32" )
++ gateways += '<li><a href="http://' + tun4in6[t].network + '">' + tun4in6[t].network + '</a></li>';
++ else
++ gateways += "<li>"+tun4in6[t].network+'/'+tun4in6[t].networklen + ' | ' + tun4in6[t].bandwidth+'</li>';
++ }
++
++ if ( typeof(tun6in6) !== "undefined" && tun6in6 !== null )
++ for ( var t = 0; t < tun6in6.length; t++)
++ {
++ if ( tun6in6[t].networklen == "128" )
++ gateways += '<li><a href="http://' + tun6in6[t].network + '">' + tun6in6[t].network + '</a></li>';
++ else
++ gateways += "<li>"+tun6in6[t].network+'/'+tun6in6[t].networklen + ' | ' + tun6in6[t].bandwidth+'</li>';
++ }
++
++ gateways += '</ul>';
++
++ //Adding HNAs with prefix=128 as main address
++ var ipstxt = '';
++ var address;
++ var first = 1;
++ var ipstxt_hidden = '<ul>';
++ var hna6list = '<ul>';
++ var extrainfo = "";
++
++ for( var e = 0; e < hna6.length; e++ )
++ {
++ address = hna6[e].address;
++ prefix = hna6[e].prefixlen;
++ if ( prefix == '128' )
++ {
++ if (first)
++ {
++ ipstxt += address;
++ ipstxt_hidden += '<li><a href="http://['+address+']" >'+address+"</a></li>";
++ first = 0;
++ }
++ else {
++ ipstxt_hidden += '<li><a href="http://['+address+']" >'+address+"</a></li>";
++ }
++ }
++ else {
++ hna6list += '<li>'+address+'/'+prefix+'</li>';
++ }
++ }
++ hna6list += '</ul>';
++ ipstxt_hidden += '</ul>';
++
++ extrainfo = '<div id="ip-'+ i +'" class="hideme">'
++ + "<div class='inforow'>"
++ + "<h4>" + nodename + '</h4>\n' + '<img src="' + nodeicon + '" />'+ "</div>"
++
++ + "<div class='inforow'>"
++ + "<h5>Available IPs</h5>\n"
++ + ipstxt_hidden + "</div>\n"
++
++ + "<div class='inforow'>"
++ + "<h5>Gateways announced</h5>\n"
++ + gateways + "</div>\n"
++
++ + "<div class='inforow'>"
++ + "<h5>Networks announced</h5>\n"
++ + hna6list + "</div>\n"
++ + "\n</div>";
++
++ res.push([extrainfo_link,nodename, ipstxt, originators[i].viaDev, originators[i].metric,
++ originators[i].lastDesc, originators[i].lastRef, originators[i].blocked, extrainfo]);
++
++ }
++ return res;
++ });
++//]]></script>
++
++<%+footer%>
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/status_j.htm b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/status_j.htm
+new file mode 100644
+index 0000000..bf21106
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/status_j.htm
+@@ -0,0 +1,88 @@
++<%+header%>
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript" src="<%=resource%>/bmx6/js/polling.js"></script>
++
++
++<style>
++
++ div.hideme{
++ display: none;
++ }
++
++ div.info{
++ background: #FFF;
++ border: solid 1px;
++ height: 80px;
++ display: block;
++ overflow: auto;
++ }
++
++ div.inforow{
++ text-align:left;
++ display:inline-block;
++ width:20%;
++ margin:5px;
++ vertical-align:top;
++
++ }
++
++#extra-info ul { list-style: none outside none; margin-left: 0em; }
++
++</style>
++<div class="cbi-map">
++<center>
++<img src="<%=resource%>/bmx6/bmx6logo.png" />
++<br />
++<br />
++a mesh routing protocol for Linux devices.<br />
++Visit <a href="http://bmx6.net">bmx6.net</a> for more info.
++<br />
++<br />
++</center>
++
++<h2>status</h2>
++<div class="cbi-map-descr"></div>
++<fieldset class="cbi-section">
++ <legend><%:status%></legend>
++ <table class="cbi-section-table" id="status_table">
++ <tr class="cbi-section-table-titles">
++ <th class="cbi-section-table-cell"><%:Version%></th>
++ <th class="cbi-section-table-cell"><%:Primary IP%></th>
++ <th class="cbi-section-table-cell"><%:Tun6Address%></th>
++ <th class="cbi-section-table-cell"><%:Tun4Address%></th>
++ <th class="cbi-section-table-cell"><%:Uptime%></th>
++ <th class="cbi-section-table-cell"><%:Cpu load%></th>
++ <th class="cbi-section-table-cell"><%:Nodes seen%></th>
++ </tr>
++ <tr class="cbi-section-table-row">
++ <td colspan="7"><em><br /><%:Collecting data...%></em></td>
++ </tr>
++ </table>
++</fieldset>
++
++</div>
++
++<script type="text/javascript">//<![CDATA[
++ new TablePooler(5,"/cgi-bin/bmx6-info", {'$info':''}, "status_table", function(st){
++ var res = Array();
++ var sta = st.info[0].status;
++ var ifaces = st.info[1].interfaces;
++
++ res.push([sta.version+'/'+sta.compat,sta.primaryIp,sta.tun6Address,
++ sta.tun4Address,sta.uptime,sta.cpu,sta.nodes]);
++ res.push(['<br/>','','','','','','',''])
++ res.push(['','','','','','','',''])
++ res.push(['<b>Interface Name</b>','<b>State</b>','<b>Type</b>','<b>Rate</b>','<b>Local IP</b>','<b>Global IP</b>','<b>is Primary</b>'])
++
++ for ( var i = 0; i < ifaces.length; i++)
++ {
++ res.push([ifaces[i].devName,ifaces[i].state,ifaces[i].type,ifaces[i].rateMin+"/"+ifaces[i].rateMax,
++ ifaces[i].llocalIp,ifaces[i].globalIp,ifaces[i].primary],'');
++ }
++
++ return res;
++ });
++//]]></script>
++
++<%+footer%>
++
+diff --git a/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/tunnels_j.htm b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/tunnels_j.htm
+new file mode 100644
+index 0000000..92b22a9
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/usr/lib/lua/luci/view/bmx6/tunnels_j.htm
+@@ -0,0 +1,106 @@
++<%#
++ Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++ Contributors Lluis Esquerda <eskerda@gmail.com>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++ The full GNU General Public License is included in this distribution in
++ the file called "COPYING".
++-%>
++
++
++<%+header%>
++<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
++<script type="text/javascript" src="<%=resource%>/bmx6/js/polling.js"></script>
++
++
++<style>
++
++ div.hideme{
++ display: none;
++ }
++
++ div.info{
++ background: #FFF;
++ border: solid 1px;
++ height: 80px;
++ display: block;
++ overflow: auto;
++ }
++
++ div.inforow{
++ text-align:left;
++ display:inline-block;
++ width:20%;
++ margin:5px;
++ vertical-align:top;
++
++ }
++
++#extra-info ul { list-style: none outside none; margin-left: 0em; }
++
++</style>
++<div class="cbi-map">
++
++<h2>Gateways tunnel announcements</h2>
++<div class="cbi-map-descr"></div>
++<fieldset class="cbi-section">
++ <legend><%:Mesh gateways%></legend>
++ <table class="cbi-section-table" id="descriptions_table">
++ <tr class="cbi-section-table-titles">
++ <th class="cbi-section-table-cell"></th>
++ <th class="cbi-section-table-cell"><%:Tunnel%></th>
++ <th class="cbi-section-table-cell"><%:Node%></th>
++ <th class="cbi-section-table-cell"><%:Network%></th>
++ <th class="cbi-section-table-cell"><%:Bandwidth%></th>
++ <th class="cbi-section-table-cell"><%:SearchNet%></th>
++ <th class="cbi-section-table-cell"><%:Path Metric%></th>
++ <th class="cbi-section-table-cell"><%:Tun metric%></th>
++ <th class="cbi-section-table-cell"><%:Rating%></th>
++ <th class="cbi-section-table-cell"><%:Src%></th>
++ <th class="cbi-section-table-cell"><%:Search id%></th>
++ </tr>
++ <tr class="cbi-section-table-row">
++ <td colspan="10"><em><br /><%:Collecting data...%></em></td>
++ </tr>
++ </table>
++</fieldset>
++
++</div>
++
++<script type="text/javascript">//<![CDATA[
++ new TablePooler(5,"/cgi-bin/bmx6-info", {'$tunnels':''}, "descriptions_table", function(st){
++ var tunicon = "<%=resource%>/icons/tunnel.png";
++ var tunicon_dis = "<%=resource%>/icons/tunnel_disabled.png";
++ var applyicon = "<%=resource%>/cbi/apply.gif";
++ var res = Array();
++ for ( var k in st.tunnels ){
++ var tunnel = st.tunnels[k];
++ var nodename = tunnel.remoteName.replace(/\..+$/,'');
++ var advnet = tunnel.advNet;
++ var status = '<img src="'+tunicon_dis+'"/>';
++
++ if ( tunnel.tunName != "---" ) status = '<img src="'+tunicon+'"/>';
++ if ( advnet == "0.0.0.0/0" ) advnet = "<b>Internet</b>";
++
++ res.push([status, tunnel.name, nodename, advnet, tunnel.advBw, tunnel.net,
++ tunnel.pathMtc, tunnel.tunMtc, tunnel.rating, tunnel.srcIngress, tunnel.id]);
++ }
++ return res;
++ });
++//]]></script>
++
++<%+footer%>
++
+diff --git a/feeds/routing/luci-app-bmx6/files/www/cgi-bin/bmx6-info b/feeds/routing/luci-app-bmx6/files/www/cgi-bin/bmx6-info
+new file mode 100644
+index 0000000..5263081
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/www/cgi-bin/bmx6-info
+@@ -0,0 +1,119 @@
++#!/bin/sh
++# Copyright (C) 2011 Pau Escrich
++# Contributors Jo-Philipp Wich <xm@subsignal.org>
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation; either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License along
++# with this program; if not, write to the Free Software Foundation, Inc.,
++# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++#
++# The full GNU General Public License is included in this distribution in
++# the file called "COPYING".
++#
++# This script gives information about bmx6
++# Can be executed from a linux shell: ./bmx6-info -s links
++# Or from web interfae (with cgi enabled): http://host/cgi-bin/bmx6-info?links
++# If you ask for a directory you wil get the directory contents in JSON forman
++
++BMX6_DIR="$(uci get bmx6.general.runtimeDir 2>/dev/null)" || BMX6_DIR="/var/run/bmx6/json"
++
++#Checking if shell mode or cgi-bin mode
++if [ "$1" == "-s" ]; then
++ QUERY="$2"
++else
++ QUERY="${QUERY_STRING%%=*}"
++ echo "Content-type: application/json"
++ echo ""
++
++fi
++
++check_path() {
++ [ -d "$1" ] && path=$(cd $1; pwd)
++ [ -f "$1" ] && path=$(cd $1/..; pwd)
++ [ $(echo "$path" | grep -c "^$BMX6_DIR") -ne 1 ] && exit 1
++}
++
++print_query() {
++ # If the query is a directory
++ [ -d "$BMX6_DIR/$1" ] &&
++ {
++ # If /all has not been specified
++ [ -z "$QALL" ] &&
++ {
++ total=$(ls $BMX6_DIR/$1 | wc -w)
++ i=1
++ echo -n "{ \"$1\": [ "
++ for f in $(ls $BMX6_DIR/$1); do
++ echo -n "{ \"name\": \"$f\" }"
++ [ $i -lt $total ] && echo -n ','
++ i=$(( $i + 1 ))
++ done
++ echo -n " ] }"
++
++ # If /all has been specified, printing all the files together
++ } || {
++ comma=""
++ echo -n "[ "
++ for entry in "$BMX6_DIR/$1/"*; do
++ [ -f "$entry" ] &&
++ {
++ ${comma:+echo "$comma"}
++ tr -d '\n' < "$entry"
++ comma=","
++ }
++ done
++ echo -n " ]"
++ }
++ }
++
++ # If the query is a file, just printing the file
++ [ -f "$BMX6_DIR/$1" ] && cat "$BMX6_DIR/$1";
++}
++
++if [ "${QUERY##*/}" == "all" ]; then
++ QUERY="${QUERY%/all}"
++ QALL=1
++fi
++
++if [ "$QUERY" == '$info' ]; then
++ echo '{ "info": [ '
++ print_query status
++ echo -n ","
++ print_query interfaces
++ echo "] }"
++fi
++
++if [ "$QUERY" == '$neighbours' ]; then
++ QALL=1
++ echo '{ "neighbours": [ '
++ echo '{ "originators": '
++ print_query originators
++ echo '}, '
++ echo '{ "descriptions": '
++ print_query descriptions
++ echo "} ] }"
++ exit 0
++
++else if [ "$QUERY" == '$tunnels' ]; then
++ bmx6 -c --jshow tunnels /r=0
++ exit 0
++
++else
++ check_path "$BMX6_DIR/$QUERY"
++ print_query $QUERY
++ exit 0
++fi
++fi
++
++ls -1F "$BMX6_DIR"
++exit 0
++
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/bmx6logo.png b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/bmx6logo.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..12f752624ec550c23ad914ed6a78b7bd45483483
+GIT binary patch
+literal 4986
+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
+Ef|tr=bpQYW
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/Curry-1.0.1.js b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/Curry-1.0.1.js
+new file mode 100644
+index 0000000..f5aa0f9
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/Curry-1.0.1.js
+@@ -0,0 +1,29 @@
++/**
++ * Curry - Function currying
++ * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
++ * Licensed under BSD (http://www.opensource.org/licenses/bsd-license.php)
++ * Date: 10/4/2008
++ *
++ * @author Ariel Flesler
++ * @version 1.0.1
++ */
++
++function curry( fn ){
++ return function(){
++ var args = curry.args(arguments),
++ master = arguments.callee,
++ self = this;
++
++ return args.length >= fn.length ? fn.apply(self,args) : function(){
++ return master.apply( self, args.concat(curry.args(arguments)) );
++ };
++ };
++};
++
++curry.args = function( args ){
++ return Array.prototype.slice.call(args);
++};
++
++Function.prototype.curry = function(){
++ return curry(this);
++};
+\ No newline at end of file
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/dracula_graffle.js b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/dracula_graffle.js
+new file mode 100644
+index 0000000..ddf171d
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/dracula_graffle.js
+@@ -0,0 +1,106 @@
++/**
++ * Originally grabbed from the official RaphaelJS Documentation
++ * http://raphaeljs.com/graffle.html
++ * Adopted (arrows) and commented by Philipp Strathausen http://blog.ameisenbar.de
++ * Licenced under the MIT licence.
++ */
++
++/**
++ * Usage:
++ * connect two shapes
++ * parameters:
++ * source shape [or connection for redrawing],
++ * target shape,
++ * style with { fg : linecolor, bg : background color, directed: boolean }
++ * returns:
++ * connection { draw = function() }
++ */
++Raphael.fn.connection = function (obj1, obj2, style) {
++ var selfRef = this;
++ /* create and return new connection */
++ var edge = {/*
++ from : obj1,
++ to : obj2,
++ style : style,*/
++ draw : function() {
++ /* get bounding boxes of target and source */
++ var bb1 = obj1.getBBox();
++ var bb2 = obj2.getBBox();
++ var off1 = 0;
++ var off2 = 0;
++ /* coordinates for potential connection coordinates from/to the objects */
++ var p = [
++ {x: bb1.x + bb1.width / 2, y: bb1.y - off1}, /* NORTH 1 */
++ {x: bb1.x + bb1.width / 2, y: bb1.y + bb1.height + off1}, /* SOUTH 1 */
++ {x: bb1.x - off1, y: bb1.y + bb1.height / 2}, /* WEST 1 */
++ {x: bb1.x + bb1.width + off1, y: bb1.y + bb1.height / 2}, /* EAST 1 */
++ {x: bb2.x + bb2.width / 2, y: bb2.y - off2}, /* NORTH 2 */
++ {x: bb2.x + bb2.width / 2, y: bb2.y + bb2.height + off2}, /* SOUTH 2 */
++ {x: bb2.x - off2, y: bb2.y + bb2.height / 2}, /* WEST 2 */
++ {x: bb2.x + bb2.width + off2, y: bb2.y + bb2.height / 2} /* EAST 2 */
++ ];
++
++ /* distances between objects and according coordinates connection */
++ var d = {}, dis = [];
++
++ /*
++ * find out the best connection coordinates by trying all possible ways
++ */
++ /* loop the first object's connection coordinates */
++ for (var i = 0; i < 4; i++) {
++ /* loop the seond object's connection coordinates */
++ for (var j = 4; j < 8; j++) {
++ var dx = Math.abs(p[i].x - p[j].x),
++ dy = Math.abs(p[i].y - p[j].y);
++ if ((i == j - 4) || (((i != 3 && j != 6) || p[i].x < p[j].x) && ((i != 2 && j != 7) || p[i].x > p[j].x) && ((i != 0 && j != 5) || p[i].y > p[j].y) && ((i != 1 && j != 4) || p[i].y < p[j].y))) {
++ dis.push(dx + dy);
++ d[dis[dis.length - 1].toFixed(3)] = [i, j];
++ }
++ }
++ }
++ var res = dis.length == 0 ? [0, 4] : d[Math.min.apply(Math, dis).toFixed(3)];
++ /* bezier path */
++ var x1 = p[res[0]].x,
++ y1 = p[res[0]].y,
++ x4 = p[res[1]].x,
++ y4 = p[res[1]].y,
++ dx = Math.max(Math.abs(x1 - x4) / 2, 10),
++ dy = Math.max(Math.abs(y1 - y4) / 2, 10),
++ x2 = [x1, x1, x1 - dx, x1 + dx][res[0]].toFixed(3),
++ y2 = [y1 - dy, y1 + dy, y1, y1][res[0]].toFixed(3),
++ x3 = [0, 0, 0, 0, x4, x4, x4 - dx, x4 + dx][res[1]].toFixed(3),
++ y3 = [0, 0, 0, 0, y1 + dy, y1 - dy, y4, y4][res[1]].toFixed(3);
++ /* assemble path and arrow */
++ var path = ["M", x1.toFixed(3), y1.toFixed(3), "C", x2, y2, x3, y3, x4.toFixed(3), y4.toFixed(3)].join(",");
++ /* arrow */
++ if(style && style.directed) {
++ /* magnitude, length of the last path vector */
++ var mag = Math.sqrt((y4 - y3) * (y4 - y3) + (x4 - x3) * (x4 - x3));
++ /* vector normalisation to specified length */
++ var norm = function(x,l){return (-x*(l||5)/mag);};
++ /* calculate array coordinates (two lines orthogonal to the path vector) */
++ var arr = [
++ {x:(norm(x4-x3)+norm(y4-y3)+x4).toFixed(3), y:(norm(y4-y3)+norm(x4-x3)+y4).toFixed(3)},
++ {x:(norm(x4-x3)-norm(y4-y3)+x4).toFixed(3), y:(norm(y4-y3)-norm(x4-x3)+y4).toFixed(3)}
++ ];
++ path = path + ",M"+arr[0].x+","+arr[0].y+",L"+x4+","+y4+",L"+arr[1].x+","+arr[1].y;
++ }
++ /* function to be used for moving existent path(s), e.g. animate() or attr() */
++ var move = "attr";
++ /* applying path(s) */
++ edge.fg && edge.fg[move]({path:path})
++ || (edge.fg = selfRef.path(path).attr({stroke: style && style.stroke || "#000", fill: "none"}).toBack());
++ edge.bg && edge.bg[move]({path:path})
++ || style && style.fill && (edge.bg = style.fill.split && selfRef.path(path).attr({stroke: style.fill.split("|")[0], fill: "none", "stroke-width": style.fill.split("|")[1] || 3}).toBack());
++ /* setting label */
++ style && style.label
++ && (edge.label && edge.label.attr({x:(x1+x4)/2, y:(y1+y4)/2})
++ || (edge.label = selfRef.text((x1+x4)/2, (y1+y4)/2, style.label).attr({fill: "#000", "font-size": style["font-size"] || "12px"})));
++ style && style.label && style["label-style"] && edge.label && edge.label.attr(style["label-style"]);
++ style && style.callback && style.callback(edge);
++ }
++ }
++ edge.draw();
++ return edge;
++};
++//Raphael.prototype.set.prototype.dodo=function(){console.log("works");};
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/dracula_graph.js b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/dracula_graph.js
+new file mode 100644
+index 0000000..f3e43e1
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/dracula_graph.js
+@@ -0,0 +1,527 @@
++/*
++ * Dracula Graph Layout and Drawing Framework 0.0.3alpha
++ * (c) 2010 Philipp Strathausen <strathausen@gmail.com>, http://strathausen.eu
++ * Contributions by Jake Stothard <stothardj@gmail.com>.
++ *
++ * based on the Graph JavaScript framework, version 0.0.1
++ * (c) 2006 Aslak Hellesoy <aslak.hellesoy@gmail.com>
++ * (c) 2006 Dave Hoover <dave.hoover@gmail.com>
++ *
++ * Ported from Graph::Layouter::Spring in
++ * http://search.cpan.org/~pasky/Graph-Layderer-0.02/
++ * The algorithm is based on a spring-style layouter of a Java-based social
++ * network tracker PieSpy written by Paul Mutton <paul@jibble.org>.
++ *
++ * This code is freely distributable under the MIT license. Commercial use is
++ * hereby granted without any cost or restriction.
++ *
++ * Links:
++ *
++ * Graph Dracula JavaScript Framework:
++ * http://graphdracula.net
++ *
++ /*--------------------------------------------------------------------------*/
++
++/*
++ * Edge Factory
++ */
++var AbstractEdge = function() {
++}
++AbstractEdge.prototype = {
++ hide: function() {
++ this.connection.fg.hide();
++ this.connection.bg && this.bg.connection.hide();
++ }
++};
++var EdgeFactory = function() {
++ this.template = new AbstractEdge();
++ this.template.style = new Object();
++ this.template.style.directed = false;
++ this.template.weight = 1;
++};
++EdgeFactory.prototype = {
++ build: function(source, target) {
++ var e = jQuery.extend(true, {}, this.template);
++ e.source = source;
++ e.target = target;
++ return e;
++ }
++};
++
++/*
++ * Graph
++ */
++var Graph = function() {
++ this.nodes = {};
++ this.edges = [];
++ this.snapshots = []; // previous graph states TODO to be implemented
++ this.edgeFactory = new EdgeFactory();
++};
++Graph.prototype = {
++ /*
++ * add a node
++ * @id the node's ID (string or number)
++ * @content (optional, dictionary) can contain any information that is
++ * being interpreted by the layout algorithm or the graph
++ * representation
++ */
++ addNode: function(id, content) {
++ /* testing if node is already existing in the graph */
++ if(this.nodes[id] == undefined) {
++ this.nodes[id] = new Graph.Node(id, content);
++ }
++ return this.nodes[id];
++ },
++
++ addEdge: function(source, target, style) {
++ var s = this.addNode(source);
++ var t = this.addNode(target);
++ var edge = this.edgeFactory.build(s, t);
++ jQuery.extend(edge.style,style);
++ s.edges.push(edge);
++ this.edges.push(edge);
++ // NOTE: Even directed edges are added to both nodes.
++ t.edges.push(edge);
++ },
++
++ /* TODO to be implemented
++ * Preserve a copy of the graph state (nodes, positions, ...)
++ * @comment a comment describing the state
++ */
++ snapShot: function(comment) {
++ /* FIXME
++ var graph = new Graph();
++ graph.nodes = jQuery.extend(true, {}, this.nodes);
++ graph.edges = jQuery.extend(true, {}, this.edges);
++ this.snapshots.push({comment: comment, graph: graph});
++ */
++ },
++ removeNode: function(id) {
++ delete this.nodes[id];
++ for(var i = 0; i < this.edges.length; i++) {
++ if (this.edges[i].source.id == id || this.edges[i].target.id == id) {
++ this.edges.splice(i, 1);
++ i--;
++ }
++ }
++ }
++};
++
++/*
++ * Node
++ */
++Graph.Node = function(id, node){
++ node = node || {};
++ node.id = id;
++ node.edges = [];
++ node.hide = function() {
++ this.hidden = true;
++ this.shape && this.shape.hide(); /* FIXME this is representation specific code and should be elsewhere */
++ for(i in this.edges)
++ (this.edges[i].source.id == id || this.edges[i].target == id) && this.edges[i].hide && this.edges[i].hide();
++ };
++ node.show = function() {
++ this.hidden = false;
++ this.shape && this.shape.show();
++ for(i in this.edges)
++ (this.edges[i].source.id == id || this.edges[i].target == id) && this.edges[i].show && this.edges[i].show();
++ };
++ return node;
++};
++Graph.Node.prototype = {
++};
++
++/*
++ * Renderer base class
++ */
++Graph.Renderer = {};
++
++/*
++ * Renderer implementation using RaphaelJS
++ */
++Graph.Renderer.Raphael = function(element, graph, width, height) {
++ this.width = width || 400;
++ this.height = height || 400;
++ var selfRef = this;
++ this.r = Raphael(element, this.width, this.height);
++ this.radius = 40; /* max dimension of a node */
++ this.graph = graph;
++ this.mouse_in = false;
++
++ /* TODO default node rendering function */
++ if(!this.graph.render) {
++ this.graph.render = function() {
++ return;
++ }
++ }
++
++ /*
++ * Dragging
++ */
++ this.isDrag = false;
++ this.dragger = function (e) {
++ this.dx = e.clientX;
++ this.dy = e.clientY;
++ selfRef.isDrag = this;
++ this.set && this.set.animate({"fill-opacity": .1}, 200) && this.set.toFront();
++ e.preventDefault && e.preventDefault();
++ };
++
++ var d = document.getElementById(element);
++ d.onmousemove = function (e) {
++ e = e || window.event;
++ if (selfRef.isDrag) {
++ var bBox = selfRef.isDrag.set.getBBox();
++ // TODO round the coordinates here (eg. for proper image representation)
++ var newX = e.clientX - selfRef.isDrag.dx + (bBox.x + bBox.width / 2);
++ var newY = e.clientY - selfRef.isDrag.dy + (bBox.y + bBox.height / 2);
++ /* prevent shapes from being dragged out of the canvas */
++ var clientX = e.clientX - (newX < 20 ? newX - 20 : newX > selfRef.width - 20 ? newX - selfRef.width + 20 : 0);
++ var clientY = e.clientY - (newY < 20 ? newY - 20 : newY > selfRef.height - 20 ? newY - selfRef.height + 20 : 0);
++ selfRef.isDrag.set.translate(clientX - Math.round(selfRef.isDrag.dx), clientY - Math.round(selfRef.isDrag.dy));
++ // console.log(clientX - Math.round(selfRef.isDrag.dx), clientY - Math.round(selfRef.isDrag.dy));
++ for (var i in selfRef.graph.edges) {
++ selfRef.graph.edges[i].connection && selfRef.graph.edges[i].connection.draw();
++ }
++ //selfRef.r.safari();
++ selfRef.isDrag.dx = clientX;
++ selfRef.isDrag.dy = clientY;
++ }
++ };
++ d.onmouseup = function () {
++ selfRef.isDrag && selfRef.isDrag.set.animate({"fill-opacity": .6}, 500);
++ selfRef.isDrag = false;
++ };
++ this.draw();
++};
++Graph.Renderer.Raphael.prototype = {
++ translate: function(point) {
++ return [
++ (point[0] - this.graph.layoutMinX) * this.factorX + this.radius,
++ (point[1] - this.graph.layoutMinY) * this.factorY + this.radius
++ ];
++ },
++
++ rotate: function(point, length, angle) {
++ var dx = length * Math.cos(angle);
++ var dy = length * Math.sin(angle);
++ return [point[0]+dx, point[1]+dy];
++ },
++
++ draw: function() {
++ this.factorX = (this.width - 2 * this.radius) / (this.graph.layoutMaxX - this.graph.layoutMinX);
++ this.factorY = (this.height - 2 * this.radius) / (this.graph.layoutMaxY - this.graph.layoutMinY);
++ for (i in this.graph.nodes) {
++ this.drawNode(this.graph.nodes[i]);
++ }
++ for (var i = 0; i < this.graph.edges.length; i++) {
++ this.drawEdge(this.graph.edges[i]);
++ }
++ },
++
++ drawNode: function(node) {
++ var point = this.translate([node.layoutPosX, node.layoutPosY]);
++ node.point = point;
++
++ /* if node has already been drawn, move the nodes */
++ if(node.shape) {
++ var oBBox = node.shape.getBBox();
++ var opoint = { x: oBBox.x + oBBox.width / 2, y: oBBox.y + oBBox.height / 2};
++ node.shape.translate(Math.round(point[0] - opoint.x), Math.round(point[1] - opoint.y));
++ this.r.safari();
++ return node;
++ }/* else, draw new nodes */
++
++ var shape;
++
++ /* if a node renderer function is provided by the user, then use it
++ or the default render function instead */
++ if(!node.render) {
++ node.render = function(r, node) {
++ /* the default node drawing */
++ var color = Raphael.getColor();
++ var ellipse = r.ellipse(0, 0, 30, 20).attr({fill: color, stroke: color, "stroke-width": 2});
++ /* set DOM node ID */
++ ellipse.node.id = node.label || node.id;
++ shape = r.set().
++ push(ellipse).
++ push(r.text(0, 30, node.label || node.id));
++ return shape;
++ }
++ }
++ /* or check for an ajax representation of the nodes */
++ if(node.shapes) {
++ // TODO ajax representation evaluation
++ }
++
++ shape = node.render(this.r, node).hide();
++
++ shape.attr({"fill-opacity": .6});
++ /* re-reference to the node an element belongs to, needed for dragging all elements of a node */
++ shape.items.forEach(function(item){ item.set = shape; item.node.style.cursor = "move"; });
++ shape.mousedown(this.dragger);
++
++ var box = shape.getBBox();
++ shape.translate(Math.round(point[0]-(box.x+box.width/2)),Math.round(point[1]-(box.y+box.height/2)))
++ //console.log(box,point);
++ node.hidden || shape.show();
++ node.shape = shape;
++ },
++ drawEdge: function(edge) {
++ /* if this edge already exists the other way around and is undirected */
++ if(edge.backedge)
++ return;
++ if(edge.source.hidden || edge.target.hidden) {
++ edge.connection && edge.connection.fg.hide() | edge.connection.bg && edge.connection.bg.hide();
++ return;
++ }
++ /* if edge already has been drawn, only refresh the edge */
++ if(!edge.connection) {
++ edge.style && edge.style.callback && edge.style.callback(edge); // TODO move this somewhere else
++ edge.connection = this.r.connection(edge.source.shape, edge.target.shape, edge.style);
++ return;
++ }
++ //FIXME showing doesn't work well
++ edge.connection.fg.show();
++ edge.connection.bg && edge.connection.bg.show();
++ edge.connection.draw();
++ }
++};
++Graph.Layout = {};
++Graph.Layout.Spring = function(graph) {
++ this.graph = graph;
++ this.iterations = 500;
++ this.maxRepulsiveForceDistance = 6;
++ this.k = 2;
++ this.c = 0.01;
++ this.maxVertexMovement = 0.5;
++ this.layout();
++};
++Graph.Layout.Spring.prototype = {
++ layout: function() {
++ this.layoutPrepare();
++ for (var i = 0; i < this.iterations; i++) {
++ this.layoutIteration();
++ }
++ this.layoutCalcBounds();
++ },
++
++ layoutPrepare: function() {
++ for (i in this.graph.nodes) {
++ var node = this.graph.nodes[i];
++ node.layoutPosX = 0;
++ node.layoutPosY = 0;
++ node.layoutForceX = 0;
++ node.layoutForceY = 0;
++ }
++
++ },
++
++ layoutCalcBounds: function() {
++ var minx = Infinity, maxx = -Infinity, miny = Infinity, maxy = -Infinity;
++
++ for (i in this.graph.nodes) {
++ var x = this.graph.nodes[i].layoutPosX;
++ var y = this.graph.nodes[i].layoutPosY;
++
++ if(x > maxx) maxx = x;
++ if(x < minx) minx = x;
++ if(y > maxy) maxy = y;
++ if(y < miny) miny = y;
++ }
++
++ this.graph.layoutMinX = minx;
++ this.graph.layoutMaxX = maxx;
++ this.graph.layoutMinY = miny;
++ this.graph.layoutMaxY = maxy;
++ },
++
++ layoutIteration: function() {
++ // Forces on nodes due to node-node repulsions
++
++ var prev = new Array();
++ for(var c in this.graph.nodes) {
++ var node1 = this.graph.nodes[c];
++ for (var d in prev) {
++ var node2 = this.graph.nodes[prev[d]];
++ this.layoutRepulsive(node1, node2);
++
++ }
++ prev.push(c);
++ }
++
++ // Forces on nodes due to edge attractions
++ for (var i = 0; i < this.graph.edges.length; i++) {
++ var edge = this.graph.edges[i];
++ this.layoutAttractive(edge);
++ }
++
++ // Move by the given force
++ for (i in this.graph.nodes) {
++ var node = this.graph.nodes[i];
++ var xmove = this.c * node.layoutForceX;
++ var ymove = this.c * node.layoutForceY;
++
++ var max = this.maxVertexMovement;
++ if(xmove > max) xmove = max;
++ if(xmove < -max) xmove = -max;
++ if(ymove > max) ymove = max;
++ if(ymove < -max) ymove = -max;
++
++ node.layoutPosX += xmove;
++ node.layoutPosY += ymove;
++ node.layoutForceX = 0;
++ node.layoutForceY = 0;
++ }
++ },
++
++ layoutRepulsive: function(node1, node2) {
++ if (typeof node1 == 'undefined' || typeof node2 == 'undefined')
++ return;
++ var dx = node2.layoutPosX - node1.layoutPosX;
++ var dy = node2.layoutPosY - node1.layoutPosY;
++ var d2 = dx * dx + dy * dy;
++ if(d2 < 0.01) {
++ dx = 0.1 * Math.random() + 0.1;
++ dy = 0.1 * Math.random() + 0.1;
++ var d2 = dx * dx + dy * dy;
++ }
++ var d = Math.sqrt(d2);
++ if(d < this.maxRepulsiveForceDistance) {
++ var repulsiveForce = this.k * this.k / d;
++ node2.layoutForceX += repulsiveForce * dx / d;
++ node2.layoutForceY += repulsiveForce * dy / d;
++ node1.layoutForceX -= repulsiveForce * dx / d;
++ node1.layoutForceY -= repulsiveForce * dy / d;
++ }
++ },
++
++ layoutAttractive: function(edge) {
++ var node1 = edge.source;
++ var node2 = edge.target;
++
++ var dx = node2.layoutPosX - node1.layoutPosX;
++ var dy = node2.layoutPosY - node1.layoutPosY;
++ var d2 = dx * dx + dy * dy;
++ if(d2 < 0.01) {
++ dx = 0.1 * Math.random() + 0.1;
++ dy = 0.1 * Math.random() + 0.1;
++ var d2 = dx * dx + dy * dy;
++ }
++ var d = Math.sqrt(d2);
++ if(d > this.maxRepulsiveForceDistance) {
++ d = this.maxRepulsiveForceDistance;
++ d2 = d * d;
++ }
++ var attractiveForce = (d2 - this.k * this.k) / this.k;
++ if(edge.attraction == undefined) edge.attraction = 1;
++ attractiveForce *= Math.log(edge.attraction) * 0.5 + 1;
++
++ node2.layoutForceX -= attractiveForce * dx / d;
++ node2.layoutForceY -= attractiveForce * dy / d;
++ node1.layoutForceX += attractiveForce * dx / d;
++ node1.layoutForceY += attractiveForce * dy / d;
++ }
++};
++
++Graph.Layout.Ordered = function(graph, order) {
++ this.graph = graph;
++ this.order = order;
++ this.layout();
++};
++Graph.Layout.Ordered.prototype = {
++ layout: function() {
++ this.layoutPrepare();
++ this.layoutCalcBounds();
++ },
++
++ layoutPrepare: function(order) {
++ for (i in this.graph.nodes) {
++ var node = this.graph.nodes[i];
++ node.layoutPosX = 0;
++ node.layoutPosY = 0;
++ }
++ var counter = 0;
++ for (i in this.order) {
++ var node = this.order[i];
++ node.layoutPosX = counter;
++ node.layoutPosY = Math.random();
++ counter++;
++ }
++ },
++
++ layoutCalcBounds: function() {
++ var minx = Infinity, maxx = -Infinity, miny = Infinity, maxy = -Infinity;
++
++ for (i in this.graph.nodes) {
++ var x = this.graph.nodes[i].layoutPosX;
++ var y = this.graph.nodes[i].layoutPosY;
++
++ if(x > maxx) maxx = x;
++ if(x < minx) minx = x;
++ if(y > maxy) maxy = y;
++ if(y < miny) miny = y;
++ }
++
++ this.graph.layoutMinX = minx;
++ this.graph.layoutMaxX = maxx;
++
++ this.graph.layoutMinY = miny;
++ this.graph.layoutMaxY = maxy;
++ }
++};
++
++/*
++ * usefull JavaScript extensions,
++ */
++
++function log(a) {console.log&&console.log(a);}
++
++/*
++ * Raphael Tooltip Plugin
++ * - attaches an element as a tooltip to another element
++ *
++ * Usage example, adding a rectangle as a tooltip to a circle:
++ *
++ * paper.circle(100,100,10).tooltip(paper.rect(0,0,20,30));
++ *
++ * If you want to use more shapes, you'll have to put them into a set.
++ *
++ */
++Raphael.el.tooltip = function (tp) {
++ this.tp = tp;
++ this.tp.o = {x: 0, y: 0};
++ this.tp.hide();
++ this.hover(
++ function(event){
++ this.mousemove(function(event){
++ this.tp.translate(event.clientX -
++ this.tp.o.x,event.clientY - this.tp.o.y);
++ this.tp.o = {x: event.clientX, y: event.clientY};
++ });
++ this.tp.show().toFront();
++ },
++ function(event){
++ this.tp.hide();
++ this.unmousemove();
++ });
++ return this;
++};
++
++/* For IE */
++if (!Array.prototype.forEach)
++{
++ Array.prototype.forEach = function(fun /*, thisp*/)
++ {
++ var len = this.length;
++ if (typeof fun != "function")
++ throw new TypeError();
++
++ var thisp = arguments[1];
++ for (var i = 0; i < len; i++)
++ {
++ if (i in this)
++ fun.call(thisp, this[i], i, this);
++ }
++ };
++}
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/jquery-1.4.2.min.js b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/jquery-1.4.2.min.js
+new file mode 100644
+index 0000000..7c24308
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/jquery-1.4.2.min.js
+@@ -0,0 +1,154 @@
++/*!
++ * jQuery JavaScript Library v1.4.2
++ * http://jquery.com/
++ *
++ * Copyright 2010, John Resig
++ * Dual licensed under the MIT or GPL Version 2 licenses.
++ * http://jquery.org/license
++ *
++ * Includes Sizzle.js
++ * http://sizzlejs.com/
++ * Copyright 2010, The Dojo Foundation
++ * Released under the MIT, BSD, and GPL Licenses.
++ *
++ * Date: Sat Feb 13 22:33:48 2010 -0500
++ */
++(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
++e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
++j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
++"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
++true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
++Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
++(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
++a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
++"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
++function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
++c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
++L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
++"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
++a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
++d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
++a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
++!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
++true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
++var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
++parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
++false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
++s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
++applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
++else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
++a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
++w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
++cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
++i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
++" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
++this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
++e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
++c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
++a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
++function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
++k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
++C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
++null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
++e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
++f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
++if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
++fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
++d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
++"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
++a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
++isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
++{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
++if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
++e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
++"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
++d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
++!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
++toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
++u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.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".split(" "),
++function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
++if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
++e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
++t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
++g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
++for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
++1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
++CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
++relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
++l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
++h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
++CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
++g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
++text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
++setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
++h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
++m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
++"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
++h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
++!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
++h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
++q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
++if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
++(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
++function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
++gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
++c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
++{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
++"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
++d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
++a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
++1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
++a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
++c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
++wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
++prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
++this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
++return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
++""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
++this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
++u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
++1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
++return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
++""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
++c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
++c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
++function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
++Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
++"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
++a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
++a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
++"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
++serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
++function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
++global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
++e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
++"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
++false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
++false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
++c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
++d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
++g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
++1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
++"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
++if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
++this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
++"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
++animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
++j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
++this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
++"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
++c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
++this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
++this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
++e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
++c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
++function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
++this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
++k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
++f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
++a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
++c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
++d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
++f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
++"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
++e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/polling.js b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/polling.js
+new file mode 100644
+index 0000000..8f81443
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/polling.js
+@@ -0,0 +1,81 @@
++/*
++ Copyright (C) 2011 Pau Escrich <pau@dabax.net>
++ Contributors Lluis Esquerda <eskerda@gmail.com>
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++ The full GNU General Public License is included in this distribution in
++ the file called "COPYING".
++*/
++
++
++/*
++ Table pooler is a function to easy call XHR poller.
++
++ new TablePooler(5,"/cgi-bin/bmx6-info", {'status':''}, "status_table", function(st){
++ var table = Array()
++ table.push(st.first,st.second)
++ return table
++ }
++ Parameters are:
++ polling_time: time between pollings
++ json_url: the json url to fetch the data
++ json_call: the json call
++ output_table_id: the table where javascript will put the data
++ callback_function: the function that will be executed each polling_time
++
++ The callback_function must return an array of arrays (matrix).
++ In the code st is the data obtained from the json call
++*/
++
++ function TablePooler (time, jsonurl, getparams, table_id, callback) {
++ this.table = document.getElementById(table_id);
++ this.callback = callback;
++ this.jsonurl = jsonurl;
++ this.getparams = getparams;
++ this.time = time;
++
++ this.clear = function(){
++ /* clear all rows */
++ while( this.table.rows.length > 1 ) this.table.deleteRow(1);
++ }
++ this.start = function(){
++ XHR.poll(this.time, this.jsonurl, this.getparams, function(x, st){
++ var data = this.callback(st);
++ var content, tr, td;
++ this.clear();
++ for (var i = 0; i < data.length; i++){
++ tr = this.table.insertRow(-1);
++ tr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
++
++ for (var j = 0; j < data[i].length; j++){
++ td = tr.insertCell(-1);
++ if (data[i][j].length == 2) {
++ td.colSpan = data[i][j][1];
++ content = data[i][j][0];
++ }
++ else content = data[i][j];
++ td.innerHTML = content;
++ }
++ }
++ }.bind(this));
++ }
++
++
++ this.start();
++ }
++
++
++
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/raphael-min.js b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/raphael-min.js
+new file mode 100644
+index 0000000..8718b5b
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/js/raphael-min.js
+@@ -0,0 +1,7 @@
++/*
++ * Raphael 1.3.1 - JavaScript Vector Library
++ *
++ * Copyright (c) 2008 - 2009 Dmitry Baranovskiy (http://raphaeljs.com)
++ * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
++ */
++Raphael=(function(){var a=/[, ]+/,aO=/^(circle|rect|path|ellipse|text|image)$/,L=document,au=window,l={was:"Raphael" in au,is:au.Raphael},an=function(){if(an.is(arguments[0],"array")){var d=arguments[0],e=w[aW](an,d.splice(0,3+an.is(d[0],al))),S=e.set();for(var R=0,a0=d[m];R<a0;R++){var E=d[R]||{};aO.test(E.type)&&S[f](e[E.type]().attr(E));}return S;}return w[aW](an,arguments);},aT=function(){},aL="appendChild",aW="apply",aS="concat",at="",am=" ",z="split",F="click dblclick mousedown mousemove mouseout mouseover mouseup"[z](am),Q="hasOwnProperty",az="join",m="length",aY="prototype",aZ=String[aY].toLowerCase,ab=Math,g=ab.max,aI=ab.min,al="number",aA="toString",aw=Object[aY][aA],aQ={},aM=ab.pow,f="push",aU=/^(?=[\da-f]$)/,c=/^url\(['"]?([^\)]+)['"]?\)$/i,x=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgb\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|rgb\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\)|hs[bl]\(\s*([\d\.]+\s*,\s*[\d\.]+\s*,\s*[\d\.]+)\s*\)|hs[bl]\(\s*([\d\.]+%\s*,\s*[\d\.]+%\s*,\s*[\d\.]+%)\s*\))\s*$/i,O=ab.round,v="setAttribute",W=parseFloat,G=parseInt,aN=String[aY].toUpperCase,j={"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rotation:0,rx:0,ry:0,scale:"1 1",src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",translation:"0 0",width:0,x:0,y:0},Z={along:"along","clip-rect":"csv",cx:al,cy:al,fill:"colour","fill-opacity":al,"font-size":al,height:al,opacity:al,path:"path",r:al,rotation:"csv",rx:al,ry:al,scale:"csv",stroke:"colour","stroke-opacity":al,"stroke-width":al,translation:"csv",width:al,x:al,y:al},aP="replace";an.version="1.3.1";an.type=(au.SVGAngle||L.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML");if(an.type=="VML"){var ag=document.createElement("div");ag.innerHTML="<!--[if vml]><br><br><![endif]-->";if(ag.childNodes[m]!=2){return null;}}an.svg=!(an.vml=an.type=="VML");aT[aY]=an[aY];an._id=0;an._oid=0;an.fn={};an.is=function(e,d){d=aZ.call(d);return((d=="object"||d=="undefined")&&typeof e==d)||(e==null&&d=="null")||aZ.call(aw.call(e).slice(8,-1))==d;};an.setWindow=function(d){au=d;L=au.document;};var aD=function(e){if(an.vml){var d=/^\s+|\s+$/g;aD=aj(function(R){var S;R=(R+at)[aP](d,at);try{var a0=new ActiveXObject("htmlfile");a0.write("<body>");a0.close();S=a0.body;}catch(a2){S=createPopup().document.body;}var i=S.createTextRange();try{S.style.color=R;var a1=i.queryCommandValue("ForeColor");a1=((a1&255)<<16)|(a1&65280)|((a1&16711680)>>>16);return"#"+("000000"+a1[aA](16)).slice(-6);}catch(a2){return"none";}});}else{var E=L.createElement("i");E.title="Rapha\xebl Colour Picker";E.style.display="none";L.body[aL](E);aD=aj(function(i){E.style.color=i;return L.defaultView.getComputedStyle(E,at).getPropertyValue("color");});}return aD(e);};an.hsb2rgb=aj(function(a3,a1,a7){if(an.is(a3,"object")&&"h" in a3&&"s" in a3&&"b" in a3){a7=a3.b;a1=a3.s;a3=a3.h;}var R,S,a8;if(a7==0){return{r:0,g:0,b:0,hex:"#000"};}if(a3>1||a1>1||a7>1){a3/=255;a1/=255;a7/=255;}var a0=~~(a3*6),a4=(a3*6)-a0,E=a7*(1-a1),e=a7*(1-(a1*a4)),a9=a7*(1-(a1*(1-a4)));R=[a7,e,E,E,a9,a7,a7][a0];S=[a9,a7,a7,e,E,E,a9][a0];a8=[E,E,a9,a7,a7,e,E][a0];R*=255;S*=255;a8*=255;var a5={r:R,g:S,b:a8},d=(~~R)[aA](16),a2=(~~S)[aA](16),a6=(~~a8)[aA](16);d=d[aP](aU,"0");a2=a2[aP](aU,"0");a6=a6[aP](aU,"0");a5.hex="#"+d+a2+a6;return a5;},an);an.rgb2hsb=aj(function(d,e,a1){if(an.is(d,"object")&&"r" in d&&"g" in d&&"b" in d){a1=d.b;e=d.g;d=d.r;}if(an.is(d,"string")){var a3=an.getRGB(d);d=a3.r;e=a3.g;a1=a3.b;}if(d>1||e>1||a1>1){d/=255;e/=255;a1/=255;}var a0=g(d,e,a1),i=aI(d,e,a1),R,E,S=a0;if(i==a0){return{h:0,s:0,b:a0};}else{var a2=(a0-i);E=a2/a0;if(d==a0){R=(e-a1)/a2;}else{if(e==a0){R=2+((a1-d)/a2);}else{R=4+((d-e)/a2);}}R/=6;R<0&&R++;R>1&&R--;}return{h:R,s:E,b:S};},an);var aE=/,?([achlmqrstvxz]),?/gi;an._path2string=function(){return this.join(",")[aP](aE,"$1");};function aj(E,e,d){function i(){var R=Array[aY].slice.call(arguments,0),a0=R[az]("\u25ba"),S=i.cache=i.cache||{},a1=i.count=i.count||[];if(S[Q](a0)){return d?d(S[a0]):S[a0];}a1[m]>=1000&&delete S[a1.shift()];a1[f](a0);S[a0]=E[aW](e,R);return d?d(S[a0]):S[a0];}return i;}an.getRGB=aj(function(d){if(!d||!!((d=d+at).indexOf("-")+1)){return{r:-1,g:-1,b:-1,hex:"none",error:1};}if(d=="none"){return{r:-1,g:-1,b:-1,hex:"none"};}!(({hs:1,rg:1})[Q](d.substring(0,2))||d.charAt()=="#")&&(d=aD(d));var S,i,E,a2,a3,a0=d.match(x);if(a0){if(a0[2]){a2=G(a0[2].substring(5),16);E=G(a0[2].substring(3,5),16);i=G(a0[2].substring(1,3),16);}if(a0[3]){a2=G((a3=a0[3].charAt(3))+a3,16);E=G((a3=a0[3].charAt(2))+a3,16);i=G((a3=a0[3].charAt(1))+a3,16);}if(a0[4]){a0=a0[4][z](/\s*,\s*/);i=W(a0[0]);E=W(a0[1]);a2=W(a0[2]);}if(a0[5]){a0=a0[5][z](/\s*,\s*/);i=W(a0[0])*2.55;E=W(a0[1])*2.55;a2=W(a0[2])*2.55;}if(a0[6]){a0=a0[6][z](/\s*,\s*/);i=W(a0[0]);E=W(a0[1]);a2=W(a0[2]);return an.hsb2rgb(i,E,a2);}if(a0[7]){a0=a0[7][z](/\s*,\s*/);i=W(a0[0])*2.55;E=W(a0[1])*2.55;a2=W(a0[2])*2.55;return an.hsb2rgb(i,E,a2);}a0={r:i,g:E,b:a2};var e=(~~i)[aA](16),R=(~~E)[aA](16),a1=(~~a2)[aA](16);e=e[aP](aU,"0");R=R[aP](aU,"0");a1=a1[aP](aU,"0");a0.hex="#"+e+R+a1;return a0;}return{r:-1,g:-1,b:-1,hex:"none",error:1};},an);an.getColor=function(e){var i=this.getColor.start=this.getColor.start||{h:0,s:1,b:e||0.75},d=this.hsb2rgb(i.h,i.s,i.b);i.h+=0.075;if(i.h>1){i.h=0;i.s-=0.2;i.s<=0&&(this.getColor.start={h:0,s:1,b:i.b});}return d.hex;};an.getColor.reset=function(){delete this.start;};an.parsePathString=aj(function(d){if(!d){return null;}var i={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},e=[];if(an.is(d,"array")&&an.is(d[0],"array")){e=av(d);}if(!e[m]){(d+at)[aP](/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,function(R,E,a1){var a0=[],S=aZ.call(E);a1[aP](/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,function(a3,a2){a2&&a0[f](+a2);});while(a0[m]>=i[S]){e[f]([E][aS](a0.splice(0,i[S])));if(!i[S]){break;}}});}e[aA]=an._path2string;return e;});an.findDotsAtSegment=function(e,d,be,bc,a0,R,a2,a1,a8){var a6=1-a8,a5=aM(a6,3)*e+aM(a6,2)*3*a8*be+a6*3*a8*a8*a0+aM(a8,3)*a2,a3=aM(a6,3)*d+aM(a6,2)*3*a8*bc+a6*3*a8*a8*R+aM(a8,3)*a1,ba=e+2*a8*(be-e)+a8*a8*(a0-2*be+e),a9=d+2*a8*(bc-d)+a8*a8*(R-2*bc+d),bd=be+2*a8*(a0-be)+a8*a8*(a2-2*a0+be),bb=bc+2*a8*(R-bc)+a8*a8*(a1-2*R+bc),a7=(1-a8)*e+a8*be,a4=(1-a8)*d+a8*bc,E=(1-a8)*a0+a8*a2,i=(1-a8)*R+a8*a1,S=(90-ab.atan((ba-bd)/(a9-bb))*180/ab.PI);(ba>bd||a9<bb)&&(S+=180);return{x:a5,y:a3,m:{x:ba,y:a9},n:{x:bd,y:bb},start:{x:a7,y:a4},end:{x:E,y:i},alpha:S};};var U=aj(function(a5){if(!a5){return{x:0,y:0,width:0,height:0};}a5=H(a5);var a2=0,a1=0,R=[],e=[],E;for(var S=0,a4=a5[m];S<a4;S++){E=a5[S];if(E[0]=="M"){a2=E[1];a1=E[2];R[f](a2);e[f](a1);}else{var a0=aC(a2,a1,E[1],E[2],E[3],E[4],E[5],E[6]);R=R[aS](a0.min.x,a0.max.x);e=e[aS](a0.min.y,a0.max.y);a2=E[5];a1=E[6];}}var d=aI[aW](0,R),a3=aI[aW](0,e);return{x:d,y:a3,width:g[aW](0,R)-d,height:g[aW](0,e)-a3};}),av=function(a0){var E=[];if(!an.is(a0,"array")||!an.is(a0&&a0[0],"array")){a0=an.parsePathString(a0);}for(var e=0,R=a0[m];e<R;e++){E[e]=[];for(var d=0,S=a0[e][m];d<S;d++){E[e][d]=a0[e][d];}}E[aA]=an._path2string;return E;},ad=aj(function(R){if(!an.is(R,"array")||!an.is(R&&R[0],"array")){R=an.parsePathString(R);}var a4=[],a6=0,a5=0,a9=0,a8=0,E=0;if(R[0][0]=="M"){a6=R[0][1];a5=R[0][2];a9=a6;a8=a5;E++;a4[f](["M",a6,a5]);}for(var a1=E,ba=R[m];a1<ba;a1++){var d=a4[a1]=[],a7=R[a1];if(a7[0]!=aZ.call(a7[0])){d[0]=aZ.call(a7[0]);switch(d[0]){case"a":d[1]=a7[1];d[2]=a7[2];d[3]=a7[3];d[4]=a7[4];d[5]=a7[5];d[6]=+(a7[6]-a6).toFixed(3);d[7]=+(a7[7]-a5).toFixed(3);break;case"v":d[1]=+(a7[1]-a5).toFixed(3);break;case"m":a9=a7[1];a8=a7[2];default:for(var a0=1,a2=a7[m];a0<a2;a0++){d[a0]=+(a7[a0]-((a0%2)?a6:a5)).toFixed(3);}}}else{d=a4[a1]=[];if(a7[0]=="m"){a9=a7[1]+a6;a8=a7[2]+a5;}for(var S=0,e=a7[m];S<e;S++){a4[a1][S]=a7[S];}}var a3=a4[a1][m];switch(a4[a1][0]){case"z":a6=a9;a5=a8;break;case"h":a6+=+a4[a1][a3-1];break;case"v":a5+=+a4[a1][a3-1];break;default:a6+=+a4[a1][a3-2];a5+=+a4[a1][a3-1];}}a4[aA]=an._path2string;return a4;},0,av),r=aj(function(R){if(!an.is(R,"array")||!an.is(R&&R[0],"array")){R=an.parsePathString(R);}var a3=[],a5=0,a4=0,a8=0,a7=0,E=0;if(R[0][0]=="M"){a5=+R[0][1];a4=+R[0][2];a8=a5;a7=a4;E++;a3[0]=["M",a5,a4];}for(var a1=E,a9=R[m];a1<a9;a1++){var d=a3[a1]=[],a6=R[a1];if(a6[0]!=aN.call(a6[0])){d[0]=aN.call(a6[0]);switch(d[0]){case"A":d[1]=a6[1];d[2]=a6[2];d[3]=a6[3];d[4]=a6[4];d[5]=a6[5];d[6]=+(a6[6]+a5);d[7]=+(a6[7]+a4);break;case"V":d[1]=+a6[1]+a4;break;case"H":d[1]=+a6[1]+a5;break;case"M":a8=+a6[1]+a5;a7=+a6[2]+a4;default:for(var a0=1,a2=a6[m];a0<a2;a0++){d[a0]=+a6[a0]+((a0%2)?a5:a4);}}}else{for(var S=0,e=a6[m];S<e;S++){a3[a1][S]=a6[S];}}switch(d[0]){case"Z":a5=a8;a4=a7;break;case"H":a5=d[1];break;case"V":a4=d[1];break;default:a5=a3[a1][a3[a1][m]-2];a4=a3[a1][a3[a1][m]-1];}}a3[aA]=an._path2string;return a3;},null,av),aX=function(e,E,d,i){return[e,E,d,i,d,i];},aK=function(e,E,a0,R,d,i){var S=1/3,a1=2/3;return[S*e+a1*a0,S*E+a1*R,S*d+a1*a0,S*i+a1*R,d,i];},K=function(a9,bE,bi,bg,ba,a4,S,a8,bD,bb){var R=ab.PI,bf=R*120/180,d=R/180*(+ba||0),bm=[],bj,bA=aj(function(bF,bI,i){var bH=bF*ab.cos(i)-bI*ab.sin(i),bG=bF*ab.sin(i)+bI*ab.cos(i);return{x:bH,y:bG};});if(!bb){bj=bA(a9,bE,-d);a9=bj.x;bE=bj.y;bj=bA(a8,bD,-d);a8=bj.x;bD=bj.y;var e=ab.cos(R/180*ba),a6=ab.sin(R/180*ba),bo=(a9-a8)/2,bn=(bE-bD)/2;bi=g(bi,ab.abs(bo));bg=g(bg,ab.abs(bn));var by=(bo*bo)/(bi*bi)+(bn*bn)/(bg*bg);if(by>1){bi=ab.sqrt(by)*bi;bg=ab.sqrt(by)*bg;}var E=bi*bi,br=bg*bg,bt=(a4==S?-1:1)*ab.sqrt(ab.abs((E*br-E*bn*bn-br*bo*bo)/(E*bn*bn+br*bo*bo))),bd=bt*bi*bn/bg+(a9+a8)/2,bc=bt*-bg*bo/bi+(bE+bD)/2,a3=ab.asin(((bE-bc)/bg).toFixed(7)),a2=ab.asin(((bD-bc)/bg).toFixed(7));a3=a9<bd?R-a3:a3;a2=a8<bd?R-a2:a2;a3<0&&(a3=R*2+a3);a2<0&&(a2=R*2+a2);if(S&&a3>a2){a3=a3-R*2;}if(!S&&a2>a3){a2=a2-R*2;}}else{a3=bb[0];a2=bb[1];bd=bb[2];bc=bb[3];}var a7=a2-a3;if(ab.abs(a7)>bf){var be=a2,bh=a8,a5=bD;a2=a3+bf*(S&&a2>a3?1:-1);a8=bd+bi*ab.cos(a2);bD=bc+bg*ab.sin(a2);bm=K(a8,bD,bi,bg,ba,0,S,bh,a5,[a2,be,bd,bc]);}a7=a2-a3;var a1=ab.cos(a3),bC=ab.sin(a3),a0=ab.cos(a2),bB=ab.sin(a2),bp=ab.tan(a7/4),bs=4/3*bi*bp,bq=4/3*bg*bp,bz=[a9,bE],bx=[a9+bs*bC,bE-bq*a1],bw=[a8+bs*bB,bD-bq*a0],bu=[a8,bD];bx[0]=2*bz[0]-bx[0];bx[1]=2*bz[1]-bx[1];if(bb){return[bx,bw,bu][aS](bm);}else{bm=[bx,bw,bu][aS](bm)[az]()[z](",");var bk=[];for(var bv=0,bl=bm[m];bv<bl;bv++){bk[bv]=bv%2?bA(bm[bv-1],bm[bv],d).y:bA(bm[bv],bm[bv+1],d).x;}return bk;}},M=function(e,d,E,i,a2,a1,a0,S,a3){var R=1-a3;return{x:aM(R,3)*e+aM(R,2)*3*a3*E+R*3*a3*a3*a2+aM(a3,3)*a0,y:aM(R,3)*d+aM(R,2)*3*a3*i+R*3*a3*a3*a1+aM(a3,3)*S};},aC=aj(function(i,d,R,E,a9,a8,a5,a2){var a7=(a9-2*R+i)-(a5-2*a9+R),a4=2*(R-i)-2*(a9-R),a1=i-R,a0=(-a4+ab.sqrt(a4*a4-4*a7*a1))/2/a7,S=(-a4-ab.sqrt(a4*a4-4*a7*a1))/2/a7,a3=[d,a2],a6=[i,a5],e;ab.abs(a0)>1000000000000&&(a0=0.5);ab.abs(S)>1000000000000&&(S=0.5);if(a0>0&&a0<1){e=M(i,d,R,E,a9,a8,a5,a2,a0);a6[f](e.x);a3[f](e.y);}if(S>0&&S<1){e=M(i,d,R,E,a9,a8,a5,a2,S);a6[f](e.x);a3[f](e.y);}a7=(a8-2*E+d)-(a2-2*a8+E);a4=2*(E-d)-2*(a8-E);a1=d-E;a0=(-a4+ab.sqrt(a4*a4-4*a7*a1))/2/a7;S=(-a4-ab.sqrt(a4*a4-4*a7*a1))/2/a7;ab.abs(a0)>1000000000000&&(a0=0.5);ab.abs(S)>1000000000000&&(S=0.5);if(a0>0&&a0<1){e=M(i,d,R,E,a9,a8,a5,a2,a0);a6[f](e.x);a3[f](e.y);}if(S>0&&S<1){e=M(i,d,R,E,a9,a8,a5,a2,S);a6[f](e.x);a3[f](e.y);}return{min:{x:aI[aW](0,a6),y:aI[aW](0,a3)},max:{x:g[aW](0,a6),y:g[aW](0,a3)}};}),H=aj(function(a9,a4){var R=r(a9),a5=a4&&r(a4),a6={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},d={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},a0=function(ba,bb){var i,bc;if(!ba){return["C",bb.x,bb.y,bb.x,bb.y,bb.x,bb.y];}!(ba[0] in {T:1,Q:1})&&(bb.qx=bb.qy=null);switch(ba[0]){case"M":bb.X=ba[1];bb.Y=ba[2];break;case"A":ba=["C"][aS](K[aW](0,[bb.x,bb.y][aS](ba.slice(1))));break;case"S":i=bb.x+(bb.x-(bb.bx||bb.x));bc=bb.y+(bb.y-(bb.by||bb.y));ba=["C",i,bc][aS](ba.slice(1));break;case"T":bb.qx=bb.x+(bb.x-(bb.qx||bb.x));bb.qy=bb.y+(bb.y-(bb.qy||bb.y));ba=["C"][aS](aK(bb.x,bb.y,bb.qx,bb.qy,ba[1],ba[2]));break;case"Q":bb.qx=ba[1];bb.qy=ba[2];ba=["C"][aS](aK(bb.x,bb.y,ba[1],ba[2],ba[3],ba[4]));break;case"L":ba=["C"][aS](aX(bb.x,bb.y,ba[1],ba[2]));break;case"H":ba=["C"][aS](aX(bb.x,bb.y,ba[1],bb.y));break;case"V":ba=["C"][aS](aX(bb.x,bb.y,bb.x,ba[1]));break;case"Z":ba=["C"][aS](aX(bb.x,bb.y,bb.X,bb.Y));break;}return ba;},e=function(ba,bb){if(ba[bb][m]>7){ba[bb].shift();var bc=ba[bb];while(bc[m]){ba.splice(bb++,0,["C"][aS](bc.splice(0,6)));}ba.splice(bb,1);a7=g(R[m],a5&&a5[m]||0);}},E=function(be,bd,bb,ba,bc){if(be&&bd&&be[bc][0]=="M"&&bd[bc][0]!="M"){bd.splice(bc,0,["M",ba.x,ba.y]);bb.bx=0;bb.by=0;bb.x=be[bc][1];bb.y=be[bc][2];a7=g(R[m],a5&&a5[m]||0);}};for(var a2=0,a7=g(R[m],a5&&a5[m]||0);a2<a7;a2++){R[a2]=a0(R[a2],a6);e(R,a2);a5&&(a5[a2]=a0(a5[a2],d));a5&&e(a5,a2);E(R,a5,a6,d,a2);E(a5,R,d,a6,a2);var a1=R[a2],a8=a5&&a5[a2],S=a1[m],a3=a5&&a8[m];a6.x=a1[S-2];a6.y=a1[S-1];a6.bx=W(a1[S-4])||a6.x;a6.by=W(a1[S-3])||a6.y;d.bx=a5&&(W(a8[a3-4])||d.x);d.by=a5&&(W(a8[a3-3])||d.y);d.x=a5&&a8[a3-2];d.y=a5&&a8[a3-1];}return a5?[R,a5]:R;},null,av),p=aj(function(a4){var a3=[];for(var a0=0,a5=a4[m];a0<a5;a0++){var e={},a2=a4[a0].match(/^([^:]*):?([\d\.]*)/);e.color=an.getRGB(a2[1]);if(e.color.error){return null;}e.color=e.color.hex;a2[2]&&(e.offset=a2[2]+"%");a3[f](e);}for(var a0=1,a5=a3[m]-1;a0<a5;a0++){if(!a3[a0].offset){var E=W(a3[a0-1].offset||0),R=0;for(var S=a0+1;S<a5;S++){if(a3[S].offset){R=a3[S].offset;break;}}if(!R){R=100;S=a5;}R=W(R);var a1=(R-E)/(S-a0+1);for(;a0<S;a0++){E+=a1;a3[a0].offset=E+"%";}}}return a3;}),ao=function(){var i,e,R,E,d;if(an.is(arguments[0],"string")||an.is(arguments[0],"object")){if(an.is(arguments[0],"string")){i=L.getElementById(arguments[0]);}else{i=arguments[0];}if(i.tagName){if(arguments[1]==null){return{container:i,width:i.style.pixelWidth||i.offsetWidth,height:i.style.pixelHeight||i.offsetHeight};}else{return{container:i,width:arguments[1],height:arguments[2]};}}}else{if(an.is(arguments[0],al)&&arguments[m]>3){return{container:1,x:arguments[0],y:arguments[1],width:arguments[2],height:arguments[3]};}}},aG=function(d,i){var e=this;for(var E in i){if(i[Q](E)&&!(E in d)){switch(typeof i[E]){case"function":(function(R){d[E]=d===e?R:function(){return R[aW](e,arguments);};})(i[E]);break;case"object":d[E]=d[E]||{};aG.call(this,d[E],i[E]);break;default:d[E]=i[E];break;}}}},ak=function(d,e){d==e.top&&(e.top=d.prev);d==e.bottom&&(e.bottom=d.next);d.next&&(d.next.prev=d.prev);d.prev&&(d.prev.next=d.next);},Y=function(d,e){if(e.top===d){return;}ak(d,e);d.next=null;d.prev=e.top;e.top.next=d;e.top=d;},k=function(d,e){if(e.bottom===d){return;}ak(d,e);d.next=e.bottom;d.prev=null;e.bottom.prev=d;e.bottom=d;},A=function(e,d,i){ak(e,i);d==i.top&&(i.top=e);d.next&&(d.next.prev=e);e.next=d.next;e.prev=d;d.next=e;},aq=function(e,d,i){ak(e,i);d==i.bottom&&(i.bottom=e);d.prev&&(d.prev.next=e);e.prev=d.prev;d.prev=e;e.next=d;},s=function(d){return function(){throw new Error("Rapha\xebl: you are calling to method \u201c"+d+"\u201d of removed object");};},ar=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/;if(an.svg){aT[aY].svgns="http://www.w3.org/2000/svg";aT[aY].xlink="http://www.w3.org/1999/xlink";var O=function(d){return +d+(~~d===d)*0.5;},V=function(S){for(var e=0,E=S[m];e<E;e++){if(aZ.call(S[e][0])!="a"){for(var d=1,R=S[e][m];d<R;d++){S[e][d]=O(S[e][d]);}}else{S[e][6]=O(S[e][6]);S[e][7]=O(S[e][7]);}}return S;},aJ=function(i,d){if(d){for(var e in d){if(d[Q](e)){i[v](e,d[e]);}}}else{return L.createElementNS(aT[aY].svgns,i);}};an[aA]=function(){return"Your browser supports SVG.\nYou are running Rapha\xebl "+this.version;};var q=function(d,E){var e=aJ("path");E.canvas&&E.canvas[aL](e);var i=new ax(e,E);i.type="path";aa(i,{fill:"none",stroke:"#000",path:d});return i;};var b=function(E,a7,d){var a4="linear",a1=0.5,S=0.5,a9=E.style;a7=(a7+at)[aP](ar,function(bb,i,bc){a4="radial";if(i&&bc){a1=W(i);S=W(bc);var ba=((S>0.5)*2-1);aM(a1-0.5,2)+aM(S-0.5,2)>0.25&&(S=ab.sqrt(0.25-aM(a1-0.5,2))*ba+0.5)&&S!=0.5&&(S=S.toFixed(5)-0.00001*ba);}return at;});a7=a7[z](/\s*\-\s*/);if(a4=="linear"){var a0=a7.shift();a0=-W(a0);if(isNaN(a0)){return null;}var R=[0,0,ab.cos(a0*ab.PI/180),ab.sin(a0*ab.PI/180)],a6=1/(g(ab.abs(R[2]),ab.abs(R[3]))||1);R[2]*=a6;R[3]*=a6;if(R[2]<0){R[0]=-R[2];R[2]=0;}if(R[3]<0){R[1]=-R[3];R[3]=0;}}var a3=p(a7);if(!a3){return null;}var e=aJ(a4+"Gradient");e.id="r"+(an._id++)[aA](36);aJ(e,a4=="radial"?{fx:a1,fy:S}:{x1:R[0],y1:R[1],x2:R[2],y2:R[3]});d.defs[aL](e);for(var a2=0,a8=a3[m];a2<a8;a2++){var a5=aJ("stop");aJ(a5,{offset:a3[a2].offset?a3[a2].offset:!a2?"0%":"100%","stop-color":a3[a2].color||"#fff"});e[aL](a5);}aJ(E,{fill:"url(#"+e.id+")",opacity:1,"fill-opacity":1});a9.fill=at;a9.opacity=1;a9.fillOpacity=1;return 1;};var N=function(e){var d=e.getBBox();aJ(e.pattern,{patternTransform:an.format("translate({0},{1})",d.x,d.y)});};var aa=function(a6,bf){var a9={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},bb=a6.node,a7=a6.attrs,a3=a6.rotate(),S=function(bm,bl){bl=a9[aZ.call(bl)];if(bl){var bj=bm.attrs["stroke-width"]||"1",bh={round:bj,square:bj,butt:0}[bm.attrs["stroke-linecap"]||bf["stroke-linecap"]]||0,bk=[];var bi=bl[m];while(bi--){bk[bi]=bl[bi]*bj+((bi%2)?1:-1)*bh;}aJ(bb,{"stroke-dasharray":bk[az](",")});}};bf[Q]("rotation")&&(a3=bf.rotation);var a2=(a3+at)[z](a);if(!(a2.length-1)){a2=null;}else{a2[1]=+a2[1];a2[2]=+a2[2];}W(a3)&&a6.rotate(0,true);for(var ba in bf){if(bf[Q](ba)){if(!j[Q](ba)){continue;}var a8=bf[ba];a7[ba]=a8;switch(ba){case"rotation":a6.rotate(a8,true);break;case"href":case"title":case"target":var bd=bb.parentNode;if(aZ.call(bd.tagName)!="a"){var E=aJ("a");bd.insertBefore(E,bb);E[aL](bb);bd=E;}bd.setAttributeNS(a6.paper.xlink,ba,a8);break;case"cursor":bb.style.cursor=a8;break;case"clip-rect":var e=(a8+at)[z](a);if(e[m]==4){a6.clip&&a6.clip.parentNode.parentNode.removeChild(a6.clip.parentNode);var i=aJ("clipPath"),bc=aJ("rect");i.id="r"+(an._id++)[aA](36);aJ(bc,{x:e[0],y:e[1],width:e[2],height:e[3]});i[aL](bc);a6.paper.defs[aL](i);aJ(bb,{"clip-path":"url(#"+i.id+")"});a6.clip=bc;}if(!a8){var be=L.getElementById(bb.getAttribute("clip-path")[aP](/(^url\(#|\)$)/g,at));be&&be.parentNode.removeChild(be);aJ(bb,{"clip-path":at});delete a6.clip;}break;case"path":if(a8&&a6.type=="path"){a7.path=V(r(a8));aJ(bb,{d:a7.path});}break;case"width":bb[v](ba,a8);if(a7.fx){ba="x";a8=a7.x;}else{break;}case"x":if(a7.fx){a8=-a7.x-(a7.width||0);}case"rx":if(ba=="rx"&&a6.type=="rect"){break;}case"cx":a2&&(ba=="x"||ba=="cx")&&(a2[1]+=a8-a7[ba]);bb[v](ba,O(a8));a6.pattern&&N(a6);break;case"height":bb[v](ba,a8);if(a7.fy){ba="y";a8=a7.y;}else{break;}case"y":if(a7.fy){a8=-a7.y-(a7.height||0);}case"ry":if(ba=="ry"&&a6.type=="rect"){break;}case"cy":a2&&(ba=="y"||ba=="cy")&&(a2[2]+=a8-a7[ba]);bb[v](ba,O(a8));a6.pattern&&N(a6);break;case"r":if(a6.type=="rect"){aJ(bb,{rx:a8,ry:a8});}else{bb[v](ba,a8);}break;case"src":if(a6.type=="image"){bb.setAttributeNS(a6.paper.xlink,"href",a8);}break;case"stroke-width":bb.style.strokeWidth=a8;bb[v](ba,a8);if(a7["stroke-dasharray"]){S(a6,a7["stroke-dasharray"]);}break;case"stroke-dasharray":S(a6,a8);break;case"translation":var a0=(a8+at)[z](a);a0[0]=+a0[0]||0;a0[1]=+a0[1]||0;if(a2){a2[1]+=a0[0];a2[2]+=a0[1];}t.call(a6,a0[0],a0[1]);break;case"scale":var a0=(a8+at)[z](a);a6.scale(+a0[0]||1,+a0[1]||+a0[0]||1,+a0[2]||null,+a0[3]||null);break;case"fill":var R=(a8+at).match(c);if(R){var i=aJ("pattern"),a5=aJ("image");i.id="r"+(an._id++)[aA](36);aJ(i,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1});aJ(a5,{x:0,y:0});a5.setAttributeNS(a6.paper.xlink,"href",R[1]);i[aL](a5);var bg=L.createElement("img");bg.style.cssText="position:absolute;left:-9999em;top-9999em";bg.onload=function(){aJ(i,{width:this.offsetWidth,height:this.offsetHeight});aJ(a5,{width:this.offsetWidth,height:this.offsetHeight});L.body.removeChild(this);a6.paper.safari();};L.body[aL](bg);bg.src=R[1];a6.paper.defs[aL](i);bb.style.fill="url(#"+i.id+")";aJ(bb,{fill:"url(#"+i.id+")"});a6.pattern=i;a6.pattern&&N(a6);break;}if(!an.getRGB(a8).error){delete bf.gradient;delete a7.gradient;!an.is(a7.opacity,"undefined")&&an.is(bf.opacity,"undefined")&&aJ(bb,{opacity:a7.opacity});!an.is(a7["fill-opacity"],"undefined")&&an.is(bf["fill-opacity"],"undefined")&&aJ(bb,{"fill-opacity":a7["fill-opacity"]});}else{if((({circle:1,ellipse:1})[Q](a6.type)||(a8+at).charAt()!="r")&&b(bb,a8,a6.paper)){a7.gradient=a8;a7.fill="none";break;}}case"stroke":bb[v](ba,an.getRGB(a8).hex);break;case"gradient":(({circle:1,ellipse:1})[Q](a6.type)||(a8+at).charAt()!="r")&&b(bb,a8,a6.paper);break;case"opacity":case"fill-opacity":if(a7.gradient){var d=L.getElementById(bb.getAttribute("fill")[aP](/^url\(#|\)$/g,at));if(d){var a1=d.getElementsByTagName("stop");a1[a1[m]-1][v]("stop-opacity",a8);}break;}default:ba=="font-size"&&(a8=G(a8,10)+"px");var a4=ba[aP](/(\-.)/g,function(bh){return aN.call(bh.substring(1));});bb.style[a4]=a8;bb[v](ba,a8);break;}}}D(a6,bf);if(a2){a6.rotate(a2.join(am));}else{W(a3)&&a6.rotate(a3,true);}};var h=1.2;var D=function(d,R){if(d.type!="text"||!(R[Q]("text")||R[Q]("font")||R[Q]("font-size")||R[Q]("x")||R[Q]("y"))){return;}var a3=d.attrs,e=d.node,a5=e.firstChild?G(L.defaultView.getComputedStyle(e.firstChild,at).getPropertyValue("font-size"),10):10;if(R[Q]("text")){a3.text=R.text;while(e.firstChild){e.removeChild(e.firstChild);}var E=(R.text+at)[z]("\n");for(var S=0,a4=E[m];S<a4;S++){if(E[S]){var a1=aJ("tspan");S&&aJ(a1,{dy:a5*h,x:a3.x});a1[aL](L.createTextNode(E[S]));e[aL](a1);}}}else{var E=e.getElementsByTagName("tspan");for(var S=0,a4=E[m];S<a4;S++){S&&aJ(E[S],{dy:a5*h,x:a3.x});}}aJ(e,{y:a3.y});var a0=d.getBBox(),a2=a3.y-(a0.y+a0.height/2);a2&&isFinite(a2)&&aJ(e,{y:a3.y+a2});};var ax=function(e,d){var E=0,i=0;this[0]=e;this.id=an._oid++;this.node=e;e.raphael=this;this.paper=d;this.attrs=this.attrs||{};this.transformations=[];this._={tx:0,ty:0,rt:{deg:0,cx:0,cy:0},sx:1,sy:1};!d.bottom&&(d.bottom=this);this.prev=d.top;d.top&&(d.top.next=this);d.top=this;this.next=null;};ax[aY].rotate=function(e,d,E){if(this.removed){return this;}if(e==null){if(this._.rt.cx){return[this._.rt.deg,this._.rt.cx,this._.rt.cy][az](am);}return this._.rt.deg;}var i=this.getBBox();e=(e+at)[z](a);if(e[m]-1){d=W(e[1]);E=W(e[2]);}e=W(e[0]);if(d!=null){this._.rt.deg=e;}else{this._.rt.deg+=e;}(E==null)&&(d=null);this._.rt.cx=d;this._.rt.cy=E;d=d==null?i.x+i.width/2:d;E=E==null?i.y+i.height/2:E;if(this._.rt.deg){this.transformations[0]=an.format("rotate({0} {1} {2})",this._.rt.deg,d,E);this.clip&&aJ(this.clip,{transform:an.format("rotate({0} {1} {2})",-this._.rt.deg,d,E)});}else{this.transformations[0]=at;this.clip&&aJ(this.clip,{transform:at});}aJ(this.node,{transform:this.transformations[az](am)});return this;};ax[aY].hide=function(){!this.removed&&(this.node.style.display="none");return this;};ax[aY].show=function(){!this.removed&&(this.node.style.display="");return this;};ax[aY].remove=function(){if(this.removed){return;}ak(this,this.paper);this.node.parentNode.removeChild(this.node);for(var d in this){delete this[d];}this.removed=true;};ax[aY].getBBox=function(){if(this.removed){return this;}if(this.type=="path"){return U(this.attrs.path);}if(this.node.style.display=="none"){this.show();var E=true;}var a1={};try{a1=this.node.getBBox();}catch(S){}finally{a1=a1||{};}if(this.type=="text"){a1={x:a1.x,y:Infinity,width:0,height:0};for(var d=0,R=this.node.getNumberOfChars();d<R;d++){var a0=this.node.getExtentOfChar(d);(a0.y<a1.y)&&(a1.y=a0.y);(a0.y+a0.height-a1.y>a1.height)&&(a1.height=a0.y+a0.height-a1.y);(a0.x+a0.width-a1.x>a1.width)&&(a1.width=a0.x+a0.width-a1.x);}}E&&this.hide();return a1;};ax[aY].attr=function(){if(this.removed){return this;}if(arguments[m]==0){var R={};for(var E in this.attrs){if(this.attrs[Q](E)){R[E]=this.attrs[E];}}this._.rt.deg&&(R.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(R.scale=this.scale());R.gradient&&R.fill=="none"&&(R.fill=R.gradient)&&delete R.gradient;return R;}if(arguments[m]==1&&an.is(arguments[0],"string")){if(arguments[0]=="translation"){return t.call(this);}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}if(arguments[0]=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient){return this.attrs.gradient;}return this.attrs[arguments[0]];}if(arguments[m]==1&&an.is(arguments[0],"array")){var d={};for(var e in arguments[0]){if(arguments[0][Q](e)){d[arguments[0][e]]=this.attrs[arguments[0][e]];}}return d;}if(arguments[m]==2){var S={};S[arguments[0]]=arguments[1];aa(this,S);}else{if(arguments[m]==1&&an.is(arguments[0],"object")){aa(this,arguments[0]);}}return this;};ax[aY].toFront=function(){if(this.removed){return this;}this.node.parentNode[aL](this.node);var d=this.paper;d.top!=this&&Y(this,d);return this;};ax[aY].toBack=function(){if(this.removed){return this;}if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);k(this,this.paper);var d=this.paper;}return this;};ax[aY].insertAfter=function(d){if(this.removed){return this;}var e=d.node;if(e.nextSibling){e.parentNode.insertBefore(this.node,e.nextSibling);}else{e.parentNode[aL](this.node);}A(this,d,this.paper);return this;};ax[aY].insertBefore=function(d){if(this.removed){return this;}var e=d.node;e.parentNode.insertBefore(this.node,e);aq(this,d,this.paper);return this;};var P=function(e,d,S,R){d=O(d);S=O(S);var E=aJ("circle");e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={cx:d,cy:S,r:R,fill:"none",stroke:"#000"};i.type="circle";aJ(E,i.attrs);return i;};var aF=function(i,d,a1,e,S,a0){d=O(d);a1=O(a1);var R=aJ("rect");i.canvas&&i.canvas[aL](R);var E=new ax(R,i);E.attrs={x:d,y:a1,width:e,height:S,r:a0||0,rx:a0||0,ry:a0||0,fill:"none",stroke:"#000"};E.type="rect";aJ(R,E.attrs);return E;};var ai=function(e,d,a0,S,R){d=O(d);a0=O(a0);var E=aJ("ellipse");e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={cx:d,cy:a0,rx:S,ry:R,fill:"none",stroke:"#000"};i.type="ellipse";aJ(E,i.attrs);return i;};var o=function(i,a0,d,a1,e,S){var R=aJ("image");aJ(R,{x:d,y:a1,width:e,height:S,preserveAspectRatio:"none"});R.setAttributeNS(i.xlink,"href",a0);i.canvas&&i.canvas[aL](R);var E=new ax(R,i);E.attrs={x:d,y:a1,width:e,height:S,src:a0};E.type="image";return E;};var X=function(e,d,S,R){var E=aJ("text");aJ(E,{x:d,y:S,"text-anchor":"middle"});e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={x:d,y:S,"text-anchor":"middle",text:R,font:j.font,stroke:"none",fill:"#000"};i.type="text";aa(i,i.attrs);return i;};var aV=function(e,d){this.width=e||this.width;this.height=d||this.height;this.canvas[v]("width",this.width);this.canvas[v]("height",this.height);return this;};var w=function(){var E=ao[aW](null,arguments),i=E&&E.container,e=E.x,a0=E.y,R=E.width,d=E.height;if(!i){throw new Error("SVG container not found.");}var S=aJ("svg");R=R||512;d=d||342;aJ(S,{xmlns:"http://www.w3.org/2000/svg",version:1.1,width:R,height:d});if(i==1){S.style.cssText="position:absolute;left:"+e+"px;top:"+a0+"px";L.body[aL](S);}else{if(i.firstChild){i.insertBefore(S,i.firstChild);}else{i[aL](S);}}i=new aT;i.width=R;i.height=d;i.canvas=S;aG.call(i,i,an.fn);i.clear();return i;};aT[aY].clear=function(){var d=this.canvas;while(d.firstChild){d.removeChild(d.firstChild);}this.bottom=this.top=null;(this.desc=aJ("desc"))[aL](L.createTextNode("Created with Rapha\xebl"));d[aL](this.desc);d[aL](this.defs=aJ("defs"));};aT[aY].remove=function(){this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var d in this){this[d]=s(d);}};}if(an.vml){var aH=function(a8){var a5=/[ahqstv]/ig,a0=r;(a8+at).match(a5)&&(a0=H);a5=/[clmz]/g;if(a0==r&&!(a8+at).match(a5)){var e={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},R=/([clmz]),?([^clmz]*)/gi,S=/-?[^,\s-]+/g;var a4=(a8+at)[aP](R,function(a9,bb,i){var ba=[];i[aP](S,function(bc){ba[f](O(bc));});return e[bb]+ba;});return a4;}var a6=a0(a8),E,a4=[],d;for(var a2=0,a7=a6[m];a2<a7;a2++){E=a6[a2];d=aZ.call(a6[a2][0]);d=="z"&&(d="x");for(var a1=1,a3=E[m];a1<a3;a1++){d+=O(E[a1])+(a1!=a3-1?",":at);}a4[f](d);}return a4[az](am);};an[aA]=function(){return"Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl "+this.version;};var q=function(d,S){var E=ah("group");E.style.cssText="position:absolute;left:0;top:0;width:"+S.width+"px;height:"+S.height+"px";E.coordsize=S.coordsize;E.coordorigin=S.coordorigin;var i=ah("shape"),e=i.style;e.width=S.width+"px";e.height=S.height+"px";i.coordsize=this.coordsize;i.coordorigin=this.coordorigin;E[aL](i);var R=new ax(i,E,S);R.isAbsolute=true;R.type="path";R.path=[];R.Path=at;d&&aa(R,{fill:"none",stroke:"#000",path:d});S.canvas[aL](E);return R;};var aa=function(a3,a8){a3.attrs=a3.attrs||{};var a6=a3.node,a9=a3.attrs,a0=a6.style,E,bd=a3;for(var a1 in a8){if(a8[Q](a1)){a9[a1]=a8[a1];}}a8.href&&(a6.href=a8.href);a8.title&&(a6.title=a8.title);a8.target&&(a6.target=a8.target);a8.cursor&&(a0.cursor=a8.cursor);if(a8.path&&a3.type=="path"){a9.path=a8.path;a6.path=aH(a9.path);}if(a8.rotation!=null){a3.rotate(a8.rotation,true);}if(a8.translation){E=(a8.translation+at)[z](a);t.call(a3,E[0],E[1]);if(a3._.rt.cx!=null){a3._.rt.cx+=+E[0];a3._.rt.cy+=+E[1];a3.setBox(a3.attrs,E[0],E[1]);}}if(a8.scale){E=(a8.scale+at)[z](a);a3.scale(+E[0]||1,+E[1]||+E[0]||1,+E[2]||null,+E[3]||null);}if("clip-rect" in a8){var d=(a8["clip-rect"]+at)[z](a);if(d[m]==4){d[2]=+d[2]+(+d[0]);d[3]=+d[3]+(+d[1]);var a2=a6.clipRect||L.createElement("div"),bc=a2.style,S=a6.parentNode;bc.clip=an.format("rect({1}px {2}px {3}px {0}px)",d);if(!a6.clipRect){bc.position="absolute";bc.top=0;bc.left=0;bc.width=a3.paper.width+"px";bc.height=a3.paper.height+"px";S.parentNode.insertBefore(a2,S);a2[aL](S);a6.clipRect=a2;}}if(!a8["clip-rect"]){a6.clipRect&&(a6.clipRect.style.clip=at);}}if(a3.type=="image"&&a8.src){a6.src=a8.src;}if(a3.type=="image"&&a8.opacity){a6.filterOpacity=" progid:DXImageTransform.Microsoft.Alpha(opacity="+(a8.opacity*100)+")";a0.filter=(a6.filterMatrix||at)+(a6.filterOpacity||at);}a8.font&&(a0.font=a8.font);a8["font-family"]&&(a0.fontFamily='"'+a8["font-family"][z](",")[0][aP](/^['"]+|['"]+$/g,at)+'"');a8["font-size"]&&(a0.fontSize=a8["font-size"]);a8["font-weight"]&&(a0.fontWeight=a8["font-weight"]);a8["font-style"]&&(a0.fontStyle=a8["font-style"]);if(a8.opacity!=null||a8["stroke-width"]!=null||a8.fill!=null||a8.stroke!=null||a8["stroke-width"]!=null||a8["stroke-opacity"]!=null||a8["fill-opacity"]!=null||a8["stroke-dasharray"]!=null||a8["stroke-miterlimit"]!=null||a8["stroke-linejoin"]!=null||a8["stroke-linecap"]!=null){a6=a3.shape||a6;var a7=(a6.getElementsByTagName("fill")&&a6.getElementsByTagName("fill")[0]),ba=false;!a7&&(ba=a7=ah("fill"));if("fill-opacity" in a8||"opacity" in a8){var e=((+a9["fill-opacity"]+1||2)-1)*((+a9.opacity+1||2)-1);e<0&&(e=0);e>1&&(e=1);a7.opacity=e;}a8.fill&&(a7.on=true);if(a7.on==null||a8.fill=="none"){a7.on=false;}if(a7.on&&a8.fill){var i=a8.fill.match(c);if(i){a7.src=i[1];a7.type="tile";}else{a7.color=an.getRGB(a8.fill).hex;a7.src=at;a7.type="solid";if(an.getRGB(a8.fill).error&&(bd.type in {circle:1,ellipse:1}||(a8.fill+at).charAt()!="r")&&b(bd,a8.fill)){a9.fill="none";a9.gradient=a8.fill;}}}ba&&a6[aL](a7);var R=(a6.getElementsByTagName("stroke")&&a6.getElementsByTagName("stroke")[0]),bb=false;!R&&(bb=R=ah("stroke"));if((a8.stroke&&a8.stroke!="none")||a8["stroke-width"]||a8["stroke-opacity"]!=null||a8["stroke-dasharray"]||a8["stroke-miterlimit"]||a8["stroke-linejoin"]||a8["stroke-linecap"]){R.on=true;}(a8.stroke=="none"||R.on==null||a8.stroke==0||a8["stroke-width"]==0)&&(R.on=false);R.on&&a8.stroke&&(R.color=an.getRGB(a8.stroke).hex);var e=((+a9["stroke-opacity"]+1||2)-1)*((+a9.opacity+1||2)-1),a4=(W(a8["stroke-width"])||1)*0.75;e<0&&(e=0);e>1&&(e=1);a8["stroke-width"]==null&&(a4=a9["stroke-width"]);a8["stroke-width"]&&(R.weight=a4);a4&&a4<1&&(e*=a4)&&(R.weight=1);R.opacity=e;a8["stroke-linejoin"]&&(R.joinstyle=a8["stroke-linejoin"]||"miter");R.miterlimit=a8["stroke-miterlimit"]||8;a8["stroke-linecap"]&&(R.endcap=a8["stroke-linecap"]=="butt"?"flat":a8["stroke-linecap"]=="square"?"square":"round");if(a8["stroke-dasharray"]){var a5={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};R.dashstyle=a5[Q](a8["stroke-dasharray"])?a5[a8["stroke-dasharray"]]:at;}bb&&a6[aL](R);}if(bd.type=="text"){var a0=bd.paper.span.style;a9.font&&(a0.font=a9.font);a9["font-family"]&&(a0.fontFamily=a9["font-family"]);a9["font-size"]&&(a0.fontSize=a9["font-size"]);a9["font-weight"]&&(a0.fontWeight=a9["font-weight"]);a9["font-style"]&&(a0.fontStyle=a9["font-style"]);bd.node.string&&(bd.paper.span.innerHTML=(bd.node.string+at)[aP](/</g,"&#60;")[aP](/&/g,"&#38;")[aP](/\n/g,"<br>"));bd.W=a9.w=bd.paper.span.offsetWidth;bd.H=a9.h=bd.paper.span.offsetHeight;bd.X=a9.x;bd.Y=a9.y+O(bd.H/2);switch(a9["text-anchor"]){case"start":bd.node.style["v-text-align"]="left";bd.bbx=O(bd.W/2);break;case"end":bd.node.style["v-text-align"]="right";bd.bbx=-O(bd.W/2);break;default:bd.node.style["v-text-align"]="center";break;}}};var b=function(d,a1){d.attrs=d.attrs||{};var a2=d.attrs,a4=d.node.getElementsByTagName("fill"),S="linear",a0=".5 .5";d.attrs.gradient=a1;a1=(a1+at)[aP](ar,function(a6,a7,i){S="radial";if(a7&&i){a7=W(a7);i=W(i);aM(a7-0.5,2)+aM(i-0.5,2)>0.25&&(i=ab.sqrt(0.25-aM(a7-0.5,2))*((i>0.5)*2-1)+0.5);a0=a7+am+i;}return at;});a1=a1[z](/\s*\-\s*/);if(S=="linear"){var e=a1.shift();e=-W(e);if(isNaN(e)){return null;}}var R=p(a1);if(!R){return null;}d=d.shape||d.node;a4=a4[0]||ah("fill");if(R[m]){a4.on=true;a4.method="none";a4.type=(S=="radial")?"gradientradial":"gradient";a4.color=R[0].color;a4.color2=R[R[m]-1].color;var a5=[];for(var E=0,a3=R[m];E<a3;E++){R[E].offset&&a5[f](R[E].offset+am+R[E].color);}a4.colors&&(a4.colors.value=a5[m]?a5[az](","):"0% "+a4.color);if(S=="radial"){a4.focus="100%";a4.focussize=a0;a4.focusposition=a0;}else{a4.angle=(270-e)%360;}}return 1;};var ax=function(R,a0,d){var S=0,i=0,e=0,E=1;this[0]=R;this.id=an._oid++;this.node=R;R.raphael=this;this.X=0;this.Y=0;this.attrs={};this.Group=a0;this.paper=d;this._={tx:0,ty:0,rt:{deg:0},sx:1,sy:1};!d.bottom&&(d.bottom=this);this.prev=d.top;d.top&&(d.top.next=this);d.top=this;this.next=null;};ax[aY].rotate=function(e,d,i){if(this.removed){return this;}if(e==null){if(this._.rt.cx){return[this._.rt.deg,this._.rt.cx,this._.rt.cy][az](am);}return this._.rt.deg;}e=(e+at)[z](a);if(e[m]-1){d=W(e[1]);i=W(e[2]);}e=W(e[0]);if(d!=null){this._.rt.deg=e;}else{this._.rt.deg+=e;}i==null&&(d=null);this._.rt.cx=d;this._.rt.cy=i;this.setBox(this.attrs,d,i);this.Group.style.rotation=this._.rt.deg;return this;};ax[aY].setBox=function(bb,e,d){if(this.removed){return this;}var a5=this.Group.style,R=(this.shape&&this.shape.style)||this.node.style;bb=bb||{};for(var a9 in bb){if(bb[Q](a9)){this.attrs[a9]=bb[a9];}}e=e||this._.rt.cx;d=d||this._.rt.cy;var a7=this.attrs,a1,a0,a2,ba;switch(this.type){case"circle":a1=a7.cx-a7.r;a0=a7.cy-a7.r;a2=ba=a7.r*2;break;case"ellipse":a1=a7.cx-a7.rx;a0=a7.cy-a7.ry;a2=a7.rx*2;ba=a7.ry*2;break;case"rect":case"image":a1=+a7.x;a0=+a7.y;a2=a7.width||0;ba=a7.height||0;break;case"text":this.textpath.v=["m",O(a7.x),", ",O(a7.y-2),"l",O(a7.x)+1,", ",O(a7.y-2)][az](at);a1=a7.x-O(this.W/2);a0=a7.y-this.H/2;a2=this.W;ba=this.H;break;case"path":if(!this.attrs.path){a1=0;a0=0;a2=this.paper.width;ba=this.paper.height;}else{var a8=U(this.attrs.path);a1=a8.x;a0=a8.y;a2=a8.width;ba=a8.height;}break;default:a1=0;a0=0;a2=this.paper.width;ba=this.paper.height;break;}e=(e==null)?a1+a2/2:e;d=(d==null)?a0+ba/2:d;var E=e-this.paper.width/2,a4=d-this.paper.height/2;if(this.type=="path"||this.type=="text"){(a5.left!=E+"px")&&(a5.left=E+"px");(a5.top!=a4+"px")&&(a5.top=a4+"px");this.X=this.type=="text"?a1:-E;this.Y=this.type=="text"?a0:-a4;this.W=a2;this.H=ba;(R.left!=-E+"px")&&(R.left=-E+"px");(R.top!=-a4+"px")&&(R.top=-a4+"px");}else{(a5.left!=E+"px")&&(a5.left=E+"px");(a5.top!=a4+"px")&&(a5.top=a4+"px");this.X=a1;this.Y=a0;this.W=a2;this.H=ba;(a5.width!=this.paper.width+"px")&&(a5.width=this.paper.width+"px");(a5.height!=this.paper.height+"px")&&(a5.height=this.paper.height+"px");(R.left!=a1-E+"px")&&(R.left=a1-E+"px");(R.top!=a0-a4+"px")&&(R.top=a0-a4+"px");(R.width!=a2+"px")&&(R.width=a2+"px");(R.height!=ba+"px")&&(R.height=ba+"px");var S=(+bb.r||0)/aI(a2,ba);if(this.type=="rect"&&this.arcsize.toFixed(4)!=S.toFixed(4)&&(S||this.arcsize)){var a6=ah("roundrect"),bc={},a9=0,a3=this.events&&this.events[m];a6.arcsize=S;a6.raphael=this;this.Group[aL](a6);this.Group.removeChild(this.node);this[0]=this.node=a6;this.arcsize=S;for(var a9 in a7){bc[a9]=a7[a9];}delete bc.scale;this.attr(bc);if(this.events){for(;a9<a3;a9++){this.events[a9].unbind=ae(this.node,this.events[a9].name,this.events[a9].f,this);}}}}};ax[aY].hide=function(){!this.removed&&(this.Group.style.display="none");return this;};ax[aY].show=function(){!this.removed&&(this.Group.style.display="block");return this;};ax[aY].getBBox=function(){if(this.removed){return this;}if(this.type=="path"){return U(this.attrs.path);}return{x:this.X+(this.bbx||0),y:this.Y,width:this.W,height:this.H};};ax[aY].remove=function(){if(this.removed){return;}ak(this,this.paper);this.node.parentNode.removeChild(this.node);this.Group.parentNode.removeChild(this.Group);this.shape&&this.shape.parentNode.removeChild(this.shape);for(var d in this){delete this[d];}this.removed=true;};ax[aY].attr=function(){if(this.removed){return this;}if(arguments[m]==0){var E={};for(var e in this.attrs){if(this.attrs[Q](e)){E[e]=this.attrs[e];}}this._.rt.deg&&(E.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(E.scale=this.scale());E.gradient&&E.fill=="none"&&(E.fill=E.gradient)&&delete E.gradient;return E;}if(arguments[m]==1&&an.is(arguments[0],"string")){if(arguments[0]=="translation"){return t.call(this);}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}if(arguments[0]=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient){return this.attrs.gradient;}return this.attrs[arguments[0]];}if(this.attrs&&arguments[m]==1&&an.is(arguments[0],"array")){var d={};for(var e=0,R=arguments[0][m];e<R;e++){d[arguments[0][e]]=this.attrs[arguments[0][e]];}return d;}var S;if(arguments[m]==2){S={};S[arguments[0]]=arguments[1];}arguments[m]==1&&an.is(arguments[0],"object")&&(S=arguments[0]);if(S){if(S.text&&this.type=="text"){this.node.string=S.text;}aa(this,S);if(S.gradient&&(({circle:1,ellipse:1})[Q](this.type)||(S.gradient+at).charAt()!="r")){b(this,S.gradient);}(this.type!="path"||this._.rt.deg)&&this.setBox(this.attrs);}return this;};ax[aY].toFront=function(){!this.removed&&this.Group.parentNode[aL](this.Group);this.paper.top!=this&&Y(this,this.paper);return this;};ax[aY].toBack=function(){if(this.removed){return this;}if(this.Group.parentNode.firstChild!=this.Group){this.Group.parentNode.insertBefore(this.Group,this.Group.parentNode.firstChild);k(this,this.paper);}return this;};ax[aY].insertAfter=function(d){if(this.removed){return this;}if(d.Group.nextSibling){d.Group.parentNode.insertBefore(this.Group,d.Group.nextSibling);}else{d.Group.parentNode[aL](this.Group);}A(this,d,this.paper);return this;};ax[aY].insertBefore=function(d){if(this.removed){return this;}d.Group.parentNode.insertBefore(this.Group,d.Group);aq(this,d,this.paper);return this;};var P=function(e,d,a1,S){var R=ah("group"),a0=ah("oval"),i=a0.style;R.style.cssText="position:absolute;left:0;top:0;width:"+e.width+"px;height:"+e.height+"px";R.coordsize=e.coordsize;R.coordorigin=e.coordorigin;R[aL](a0);var E=new ax(a0,R,e);E.type="circle";aa(E,{stroke:"#000",fill:"none"});E.attrs.cx=d;E.attrs.cy=a1;E.attrs.r=S;E.setBox({x:d-S,y:a1-S,width:S*2,height:S*2});e.canvas[aL](R);return E;},aF=function(e,a1,a0,a2,E,d){var R=ah("group"),i=ah("roundrect"),a3=(+d||0)/(aI(a2,E));R.style.cssText="position:absolute;left:0;top:0;width:"+e.width+"px;height:"+e.height+"px";R.coordsize=e.coordsize;R.coordorigin=e.coordorigin;R[aL](i);i.arcsize=a3;var S=new ax(i,R,e);S.type="rect";aa(S,{stroke:"#000"});S.arcsize=a3;S.setBox({x:a1,y:a0,width:a2,height:E,r:d});e.canvas[aL](R);return S;},ai=function(d,a2,a1,i,e){var R=ah("group"),E=ah("oval"),a0=E.style;R.style.cssText="position:absolute;left:0;top:0;width:"+d.width+"px;height:"+d.height+"px";R.coordsize=d.coordsize;R.coordorigin=d.coordorigin;R[aL](E);var S=new ax(E,R,d);S.type="ellipse";aa(S,{stroke:"#000"});S.attrs.cx=a2;S.attrs.cy=a1;S.attrs.rx=i;S.attrs.ry=e;S.setBox({x:a2-i,y:a1-e,width:i*2,height:e*2});d.canvas[aL](R);return S;},o=function(e,d,a2,a1,a3,E){var R=ah("group"),i=ah("image"),a0=i.style;R.style.cssText="position:absolute;left:0;top:0;width:"+e.width+"px;height:"+e.height+"px";R.coordsize=e.coordsize;R.coordorigin=e.coordorigin;i.src=d;R[aL](i);var S=new ax(i,R,e);S.type="image";S.attrs.src=d;S.attrs.x=a2;S.attrs.y=a1;S.attrs.w=a3;S.attrs.h=E;S.setBox({x:a2,y:a1,width:a3,height:E});e.canvas[aL](R);return S;},X=function(e,a2,a1,a3){var R=ah("group"),E=ah("shape"),a0=E.style,a4=ah("path"),d=a4.style,i=ah("textpath");R.style.cssText="position:absolute;left:0;top:0;width:"+e.width+"px;height:"+e.height+"px";R.coordsize=e.coordsize;R.coordorigin=e.coordorigin;a4.v=an.format("m{0},{1}l{2},{1}",O(a2),O(a1),O(a2)+1);a4.textpathok=true;a0.width=e.width;a0.height=e.height;i.string=a3+at;i.on=true;E[aL](i);E[aL](a4);R[aL](E);var S=new ax(i,R,e);S.shape=E;S.textpath=a4;S.type="text";S.attrs.text=a3;S.attrs.x=a2;S.attrs.y=a1;S.attrs.w=1;S.attrs.h=1;aa(S,{font:j.font,stroke:"none",fill:"#000"});S.setBox();e.canvas[aL](R);return S;},aV=function(i,d){var e=this.canvas.style;i==+i&&(i+="px");d==+d&&(d+="px");e.width=i;e.height=d;e.clip="rect(0 "+i+" "+d+" 0)";return this;},ah;L.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!L.namespaces.rvml&&L.namespaces.add("rvml","urn:schemas-microsoft-com:vml");ah=function(d){return L.createElement("<rvml:"+d+' class="rvml">');};}catch(af){ah=function(d){return L.createElement("<"+d+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');};}var w=function(){var i=ao[aW](null,arguments),d=i.container,a2=i.height,a3,e=i.width,a1=i.x,a0=i.y;if(!d){throw new Error("VML container not found.");}var R=new aT,S=R.canvas=L.createElement("div"),E=S.style;e=e||512;a2=a2||342;e==+e&&(e+="px");a2==+a2&&(a2+="px");R.width=1000;R.height=1000;R.coordsize="1000 1000";R.coordorigin="0 0";R.span=L.createElement("span");R.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";S[aL](R.span);E.cssText=an.format("width:{0};height:{1};position:absolute;clip:rect(0 {0} {1} 0);overflow:hidden",e,a2);if(d==1){L.body[aL](S);E.left=a1+"px";E.top=a0+"px";}else{d.style.width=e;d.style.height=a2;if(d.firstChild){d.insertBefore(S,d.firstChild);}else{d[aL](S);}}aG.call(R,R,an.fn);return R;};aT[aY].clear=function(){this.canvas.innerHTML=at;this.span=L.createElement("span");this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";this.canvas[aL](this.span);this.bottom=this.top=null;};aT[aY].remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var d in this){this[d]=s(d);}};}if((/^Apple|^Google/).test(navigator.vendor)&&!(navigator.userAgent.indexOf("Version/4.0")+1)){aT[aY].safari=function(){var d=this.rect(-99,-99,this.width+99,this.height+99);setTimeout(function(){d.remove();});};}else{aT[aY].safari=function(){};}var ae=(function(){if(L.addEventListener){return function(R,i,e,d){var E=function(S){return e.call(d,S);};R.addEventListener(i,E,false);return function(){R.removeEventListener(i,E,false);return true;};};}else{if(L.attachEvent){return function(S,E,i,e){var R=function(a0){return i.call(e,a0||au.event);};S.attachEvent("on"+E,R);var d=function(){S.detachEvent("on"+E,R);return true;};return d;};}}})();for(var ac=F[m];ac--;){(function(d){ax[aY][d]=function(e){if(an.is(e,"function")){this.events=this.events||[];this.events.push({name:d,f:e,unbind:ae(this.shape||this.node,d,e,this)});}return this;};ax[aY]["un"+d]=function(E){var i=this.events,e=i[m];while(e--){if(i[e].name==d&&i[e].f==E){i[e].unbind();i.splice(e,1);!i.length&&delete this.events;return this;}}return this;};})(F[ac]);}ax[aY].hover=function(e,d){return this.mouseover(e).mouseout(d);};ax[aY].unhover=function(e,d){return this.unmouseover(e).unmouseout(d);};aT[aY].circle=function(d,i,e){return P(this,d||0,i||0,e||0);};aT[aY].rect=function(d,R,e,i,E){return aF(this,d||0,R||0,e||0,i||0,E||0);};aT[aY].ellipse=function(d,E,i,e){return ai(this,d||0,E||0,i||0,e||0);};aT[aY].path=function(d){d&&!an.is(d,"string")&&!an.is(d[0],"array")&&(d+=at);return q(an.format[aW](an,arguments),this);};aT[aY].image=function(E,d,R,e,i){return o(this,E||"about:blank",d||0,R||0,e||0,i||0);};aT[aY].text=function(d,i,e){return X(this,d||0,i||0,e||at);};aT[aY].set=function(d){arguments[m]>1&&(d=Array[aY].splice.call(arguments,0,arguments[m]));return new T(d);};aT[aY].setSize=aV;aT[aY].top=aT[aY].bottom=null;aT[aY].raphael=an;function u(){return this.x+am+this.y;}ax[aY].scale=function(a6,a5,E,e){if(a6==null&&a5==null){return{x:this._.sx,y:this._.sy,toString:u};}a5=a5||a6;!+a5&&(a5=a6);var ba,a8,a9,a7,bm=this.attrs;if(a6!=0){var a4=this.getBBox(),a1=a4.x+a4.width/2,R=a4.y+a4.height/2,bl=a6/this._.sx,bk=a5/this._.sy;E=(+E||E==0)?E:a1;e=(+e||e==0)?e:R;var a3=~~(a6/ab.abs(a6)),a0=~~(a5/ab.abs(a5)),be=this.node.style,bo=E+(a1-E)*bl,bn=e+(R-e)*bk;switch(this.type){case"rect":case"image":var a2=bm.width*a3*bl,bd=bm.height*a0*bk;this.attr({height:bd,r:bm.r*aI(a3*bl,a0*bk),width:a2,x:bo-a2/2,y:bn-bd/2});break;case"circle":case"ellipse":this.attr({rx:bm.rx*a3*bl,ry:bm.ry*a0*bk,r:bm.r*aI(a3*bl,a0*bk),cx:bo,cy:bn});break;case"path":var bg=ad(bm.path),bh=true;for(var bj=0,bc=bg[m];bj<bc;bj++){var bf=bg[bj],bi,S=aN.call(bf[0]);if(S=="M"&&bh){continue;}else{bh=false;}if(S=="A"){bf[bg[bj][m]-2]*=bl;bf[bg[bj][m]-1]*=bk;bf[1]*=a3*bl;bf[2]*=a0*bk;bf[5]=+(a3+a0?!!+bf[5]:!+bf[5]);}else{if(S=="H"){for(bi=1,jj=bf[m];bi<jj;bi++){bf[bi]*=bl;}}else{if(S=="V"){for(bi=1,jj=bf[m];bi<jj;bi++){bf[bi]*=bk;}}else{for(bi=1,jj=bf[m];bi<jj;bi++){bf[bi]*=(bi%2)?bl:bk;}}}}}var d=U(bg),ba=bo-d.x-d.width/2,a8=bn-d.y-d.height/2;bg[0][1]+=ba;bg[0][2]+=a8;this.attr({path:bg});break;}if(this.type in {text:1,image:1}&&(a3!=1||a0!=1)){if(this.transformations){this.transformations[2]="scale("[aS](a3,",",a0,")");this.node[v]("transform",this.transformations[az](am));ba=(a3==-1)?-bm.x-(a2||0):bm.x;a8=(a0==-1)?-bm.y-(bd||0):bm.y;this.attr({x:ba,y:a8});bm.fx=a3-1;bm.fy=a0-1;}else{this.node.filterMatrix=" progid:DXImageTransform.Microsoft.Matrix(M11="[aS](a3,", M12=0, M21=0, M22=",a0,", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')");be.filter=(this.node.filterMatrix||at)+(this.node.filterOpacity||at);}}else{if(this.transformations){this.transformations[2]=at;this.node[v]("transform",this.transformations[az](am));bm.fx=0;bm.fy=0;}else{this.node.filterMatrix=at;be.filter=(this.node.filterMatrix||at)+(this.node.filterOpacity||at);}}bm.scale=[a6,a5,E,e][az](am);this._.sx=a6;this._.sy=a5;}return this;};ax[aY].clone=function(){var d=this.attr();delete d.scale;delete d.translation;return this.paper[this.type]().attr(d);};var aB=function(d,e){return function(a9,S,a0){a9=H(a9);var a5,a4,E,a1,R="",a8={},a6,a3=0;for(var a2=0,a7=a9.length;a2<a7;a2++){E=a9[a2];if(E[0]=="M"){a5=+E[1];a4=+E[2];}else{a1=n(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6]);if(a3+a1>S){if(e&&!a8.start){a6=an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],(S-a3)/a1);R+=["C",a6.start.x,a6.start.y,a6.m.x,a6.m.y,a6.x,a6.y];if(a0){return R;}a8.start=R;R=["M",a6.x,a6.y+"C",a6.n.x,a6.n.y,a6.end.x,a6.end.y,E[5],E[6]][az]();a3+=a1;a5=+E[5];a4=+E[6];continue;}if(!d&&!e){a6=an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],(S-a3)/a1);return{x:a6.x,y:a6.y,alpha:a6.alpha};}}a3+=a1;a5=+E[5];a4=+E[6];}R+=E;}a8.end=R;a6=d?a3:e?a8:an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],1);a6.alpha&&(a6={x:a6.x,y:a6.y,alpha:a6.alpha});return a6;};},n=aj(function(E,d,a0,S,a6,a5,a4,a3){var R={x:0,y:0},a2=0;for(var a1=0;a1<1.01;a1+=0.01){var e=M(E,d,a0,S,a6,a5,a4,a3,a1);a1&&(a2+=ab.sqrt(aM(R.x-e.x,2)+aM(R.y-e.y,2)));R=e;}return a2;});var ap=aB(1),C=aB(),J=aB(0,1);ax[aY].getTotalLength=function(){if(this.type!="path"){return;}return ap(this.attrs.path);};ax[aY].getPointAtLength=function(d){if(this.type!="path"){return;}return C(this.attrs.path,d);};ax[aY].getSubpath=function(i,e){if(this.type!="path"){return;}if(ab.abs(this.getTotalLength()-e)<0.000001){return J(this.attrs.path,i).end;}var d=J(this.attrs.path,e,1);return i?J(d,i).end:d;};an.easing_formulas={linear:function(d){return d;},"<":function(d){return aM(d,3);},">":function(d){return aM(d-1,3)+1;},"<>":function(d){d=d*2;if(d<1){return aM(d,3)/2;}d-=2;return(aM(d,3)+2)/2;},backIn:function(e){var d=1.70158;return e*e*((d+1)*e-d);},backOut:function(e){e=e-1;var d=1.70158;return e*e*((d+1)*e+d)+1;},elastic:function(i){if(i==0||i==1){return i;}var e=0.3,d=e/4;return aM(2,-10*i)*ab.sin((i-d)*(2*ab.PI)/e)+1;},bounce:function(E){var e=7.5625,i=2.75,d;if(E<(1/i)){d=e*E*E;}else{if(E<(2/i)){E-=(1.5/i);d=e*E*E+0.75;}else{if(E<(2.5/i)){E-=(2.25/i);d=e*E*E+0.9375;}else{E-=(2.625/i);d=e*E*E+0.984375;}}}return d;}};var I={length:0},aR=function(){var a2=+new Date;for(var be in I){if(be!="length"&&I[Q](be)){var bj=I[be];if(bj.stop){delete I[be];I[m]--;continue;}var a0=a2-bj.start,bb=bj.ms,ba=bj.easing,bf=bj.from,a7=bj.diff,E=bj.to,a6=bj.t,a9=bj.prev||0,a1=bj.el,R=bj.callback,a8={},d;if(a0<bb){var S=an.easing_formulas[ba]?an.easing_formulas[ba](a0/bb):a0/bb;for(var bc in bf){if(bf[Q](bc)){switch(Z[bc]){case"along":d=S*bb*a7[bc];E.back&&(d=E.len-d);var bd=C(E[bc],d);a1.translate(a7.sx-a7.x||0,a7.sy-a7.y||0);a7.x=bd.x;a7.y=bd.y;a1.translate(bd.x-a7.sx,bd.y-a7.sy);E.rot&&a1.rotate(a7.r+bd.alpha,bd.x,bd.y);break;case"number":d=+bf[bc]+S*bb*a7[bc];break;case"colour":d="rgb("+[B(O(bf[bc].r+S*bb*a7[bc].r)),B(O(bf[bc].g+S*bb*a7[bc].g)),B(O(bf[bc].b+S*bb*a7[bc].b))][az](",")+")";break;case"path":d=[];for(var bh=0,a5=bf[bc][m];bh<a5;bh++){d[bh]=[bf[bc][bh][0]];for(var bg=1,bi=bf[bc][bh][m];bg<bi;bg++){d[bh][bg]=+bf[bc][bh][bg]+S*bb*a7[bc][bh][bg];}d[bh]=d[bh][az](am);}d=d[az](am);break;case"csv":switch(bc){case"translation":var a4=a7[bc][0]*(a0-a9),a3=a7[bc][1]*(a0-a9);a6.x+=a4;a6.y+=a3;d=a4+am+a3;break;case"rotation":d=+bf[bc][0]+S*bb*a7[bc][0];bf[bc][1]&&(d+=","+bf[bc][1]+","+bf[bc][2]);break;case"scale":d=[+bf[bc][0]+S*bb*a7[bc][0],+bf[bc][1]+S*bb*a7[bc][1],(2 in E[bc]?E[bc][2]:at),(3 in E[bc]?E[bc][3]:at)][az](am);break;case"clip-rect":d=[];var bh=4;while(bh--){d[bh]=+bf[bc][bh]+S*bb*a7[bc][bh];}break;}break;}a8[bc]=d;}}a1.attr(a8);a1._run&&a1._run.call(a1);}else{if(E.along){var bd=C(E.along,E.len*!E.back);a1.translate(a7.sx-(a7.x||0)+bd.x-a7.sx,a7.sy-(a7.y||0)+bd.y-a7.sy);E.rot&&a1.rotate(a7.r+bd.alpha,bd.x,bd.y);}(a6.x||a6.y)&&a1.translate(-a6.x,-a6.y);E.scale&&(E.scale=E.scale+at);a1.attr(E);delete I[be];I[m]--;a1.in_animation=null;an.is(R,"function")&&R.call(a1);}bj.prev=a0;}}an.svg&&a1&&a1.paper.safari();I[m]&&setTimeout(aR);},B=function(d){return d>255?255:(d<0?0:d);},t=function(d,i){if(d==null){return{x:this._.tx,y:this._.ty,toString:u};}this._.tx+=+d;this._.ty+=+i;switch(this.type){case"circle":case"ellipse":this.attr({cx:+d+this.attrs.cx,cy:+i+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+d+this.attrs.x,y:+i+this.attrs.y});break;case"path":var e=ad(this.attrs.path);e[0][1]+=+d;e[0][2]+=+i;this.attr({path:e});break;}return this;};ax[aY].animateWith=function(e,i,d,R,E){I[e.id]&&(i.start=I[e.id].start);return this.animate(i,d,R,E);};ax[aY].animateAlong=ay();ax[aY].animateAlongBack=ay(1);function ay(d){return function(E,i,e,S){var R={back:d};an.is(e,"function")?(S=e):(R.rot=e);E&&E.constructor==ax&&(E=E.attrs.path);E&&(R.along=E);return this.animate(R,i,S);};}ax[aY].onAnimation=function(d){this._run=d||0;return this;};ax[aY].animate=function(be,a5,a4,E){if(an.is(a4,"function")||!a4){E=a4||null;}var a9={},e={},a2={};for(var a6 in be){if(be[Q](a6)){if(Z[Q](a6)){a9[a6]=this.attr(a6);(a9[a6]==null)&&(a9[a6]=j[a6]);e[a6]=be[a6];switch(Z[a6]){case"along":var bc=ap(be[a6]),a7=C(be[a6],bc*!!be.back),R=this.getBBox();a2[a6]=bc/a5;a2.tx=R.x;a2.ty=R.y;a2.sx=a7.x;a2.sy=a7.y;e.rot=be.rot;e.back=be.back;e.len=bc;be.rot&&(a2.r=W(this.rotate())||0);break;case"number":a2[a6]=(e[a6]-a9[a6])/a5;break;case"colour":a9[a6]=an.getRGB(a9[a6]);var a8=an.getRGB(e[a6]);a2[a6]={r:(a8.r-a9[a6].r)/a5,g:(a8.g-a9[a6].g)/a5,b:(a8.b-a9[a6].b)/a5};break;case"path":var S=H(a9[a6],e[a6]);a9[a6]=S[0];var a3=S[1];a2[a6]=[];for(var bb=0,a1=a9[a6][m];bb<a1;bb++){a2[a6][bb]=[0];for(var ba=1,bd=a9[a6][bb][m];ba<bd;ba++){a2[a6][bb][ba]=(a3[bb][ba]-a9[a6][bb][ba])/a5;}}break;case"csv":var d=(be[a6]+at)[z](a),a0=(a9[a6]+at)[z](a);switch(a6){case"translation":a9[a6]=[0,0];a2[a6]=[d[0]/a5,d[1]/a5];break;case"rotation":a9[a6]=(a0[1]==d[1]&&a0[2]==d[2])?a0:[0,d[1],d[2]];a2[a6]=[(d[0]-a9[a6][0])/a5,0,0];break;case"scale":be[a6]=d;a9[a6]=(a9[a6]+at)[z](a);a2[a6]=[(d[0]-a9[a6][0])/a5,(d[1]-a9[a6][1])/a5,0,0];break;case"clip-rect":a9[a6]=(a9[a6]+at)[z](a);a2[a6]=[];var bb=4;while(bb--){a2[a6][bb]=(d[bb]-a9[a6][bb])/a5;}break;}e[a6]=d;}}}}this.stop();this.in_animation=1;I[this.id]={start:be.start||+new Date,ms:a5,easing:a4,from:a9,diff:a2,to:e,el:this,callback:E,t:{x:0,y:0}};++I[m]==1&&aR();return this;};ax[aY].stop=function(){I[this.id]&&I[m]--;delete I[this.id];return this;};ax[aY].translate=function(d,e){return this.attr({translation:d+" "+e});};ax[aY][aA]=function(){return"Rapha\xebl\u2019s object";};an.ae=I;var T=function(d){this.items=[];this[m]=0;if(d){for(var e=0,E=d[m];e<E;e++){if(d[e]&&(d[e].constructor==ax||d[e].constructor==T)){this[this.items[m]]=this.items[this.items[m]]=d[e];this[m]++;}}}};T[aY][f]=function(){var R,d;for(var e=0,E=arguments[m];e<E;e++){R=arguments[e];if(R&&(R.constructor==ax||R.constructor==T)){d=this.items[m];this[d]=this.items[d]=R;this[m]++;}}return this;};T[aY].pop=function(){delete this[this[m]--];return this.items.pop();};for(var y in ax[aY]){if(ax[aY][Q](y)){T[aY][y]=(function(d){return function(){for(var e=0,E=this.items[m];e<E;e++){this.items[e][d][aW](this.items[e],arguments);}return this;};})(y);}}T[aY].attr=function(e,a0){if(e&&an.is(e,"array")&&an.is(e[0],"object")){for(var d=0,S=e[m];d<S;d++){this.items[d].attr(e[d]);}}else{for(var E=0,R=this.items[m];E<R;E++){this.items[E].attr[aW](this.items[E],arguments);}}return this;};T[aY].animate=function(S,e,a2,a1){(an.is(a2,"function")||!a2)&&(a1=a2||null);var d=this.items[m],E=d,a0=this,R;a1&&(R=function(){!--d&&a1.call(a0);});this.items[--E].animate(S,e,a2||R,R);while(E--){this.items[E].animateWith(this.items[d-1],S,e,a2||R,R);}return this;};T[aY].insertAfter=function(e){var d=this.items[m];while(d--){this.items[d].insertAfter(e);}return this;};T[aY].getBBox=function(){var d=[],a0=[],e=[],R=[];for(var E=this.items[m];E--;){var S=this.items[E].getBBox();d[f](S.x);a0[f](S.y);e[f](S.x+S.width);R[f](S.y+S.height);}d=aI[aW](0,d);a0=aI[aW](0,a0);return{x:d,y:a0,width:g[aW](0,e)-d,height:g[aW](0,R)-a0};};an.registerFont=function(e){if(!e.face){return e;}this.fonts=this.fonts||{};var E={w:e.w,face:{},glyphs:{}},i=e.face["font-family"];for(var a0 in e.face){if(e.face[Q](a0)){E.face[a0]=e.face[a0];}}if(this.fonts[i]){this.fonts[i][f](E);}else{this.fonts[i]=[E];}if(!e.svg){E.face["units-per-em"]=G(e.face["units-per-em"],10);for(var R in e.glyphs){if(e.glyphs[Q](R)){var S=e.glyphs[R];E.glyphs[R]={w:S.w,k:{},d:S.d&&"M"+S.d[aP](/[mlcxtrv]/g,function(a1){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a1]||"M";})+"z"};if(S.k){for(var d in S.k){if(S[Q](d)){E.glyphs[R].k[d]=S.k[d];}}}}}}return e;};aT[aY].getFont=function(a2,a3,e,R){R=R||"normal";e=e||"normal";a3=+a3||{normal:400,bold:700,lighter:300,bolder:800}[a3]||400;var S=an.fonts[a2];if(!S){var E=new RegExp("(^|\\s)"+a2[aP](/[^\w\d\s+!~.:_-]/g,at)+"(\\s|$)","i");for(var d in an.fonts){if(an.fonts[Q](d)){if(E.test(d)){S=an.fonts[d];break;}}}}var a0;if(S){for(var a1=0,a4=S[m];a1<a4;a1++){a0=S[a1];if(a0.face["font-weight"]==a3&&(a0.face["font-style"]==e||!a0.face["font-style"])&&a0.face["font-stretch"]==R){break;}}}return a0;};aT[aY].print=function(R,E,d,a1,a2,bb){bb=bb||"middle";var a7=this.set(),ba=(d+at)[z](at),a8=0,a4=at,bc;an.is(a1,"string")&&(a1=this.getFont(a1));if(a1){bc=(a2||16)/a1.face["units-per-em"];var e=a1.face.bbox.split(a),a0=+e[0],a3=+e[1]+(bb=="baseline"?e[3]-e[1]+(+a1.face.descent):(e[3]-e[1])/2);for(var a6=0,S=ba[m];a6<S;a6++){var a5=a6&&a1.glyphs[ba[a6-1]]||{},a9=a1.glyphs[ba[a6]];a8+=a6?(a5.w||a1.w)+(a5.k&&a5.k[ba[a6]]||0):0;a9&&a9.d&&a7[f](this.path(a9.d).attr({fill:"#000",stroke:"none",translation:[a8,0]}));}a7.scale(bc,bc,a0,a3).translate(R-a0,E-a3);}return a7;};an.format=function(i){var e=an.is(arguments[1],"array")?[0][aS](arguments[1]):arguments,d=/\{(\d+)\}/g;i&&an.is(i,"string")&&e[m]-1&&(i=i[aP](d,function(R,E){return e[++E]==null?at:e[E];}));return i||at;};an.ninja=function(){var d=Raphael;if(l.was){Raphael=l.is;}else{delete Raphael;}return d;};an.el=ax[aY];return an;})();
+\ No newline at end of file
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/link.png b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/link.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..58977ffbb2f76f4fa7eab89c4d833c024c4a9da3
+GIT binary patch
+literal 2910
+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
+IM6N<$g2srGw*UYD
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/style.css b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/style.css
+new file mode 100644
+index 0000000..d8191a7
+--- /dev/null
++++ b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/style.css
+@@ -0,0 +1,22 @@
++ table {
++ width:90%;
++ border-top:1px solid #e5eaf8;
++ border-right:1px solid #e5eaf8;
++ margin:1em auto;
++ border-collapse:collapse;
++ }
++
++ td {
++ color:#678197;
++ border-bottom:1px solid #e6eff8;
++ border-left:1px solid #e6eff8;
++ padding:.3em 1em;
++ text-align:center;
++ }
++ th {
++ background:#f4f9fe;
++ text-align:center;
++ font:bold 1.2em/2em Century Gothic,Trebuchet MS,Arial,Helvetica,sans-serif;
++ color:#66a3d3;
++ }
++
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/wifi.png b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/wifi.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..4195b0872f4813e5bf5911b3b8179d29b823c76a
+GIT binary patch
+literal 3551
+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
+ZVr7ts0F<z`ogK3bfLhvFl$zbR`yb1?kH!E1
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/world.png b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/world.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..29b53c957ebf3b58cb2948dac35e3fd1dd616345
+GIT binary patch
+literal 1885
+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
+XJC$YshjJ?x00000NkvXXu0mjf;7FEt
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/world_small.png b/feeds/routing/luci-app-bmx6/files/www/luci-static/resources/bmx6/world_small.png
+new file mode 100644
+index 0000000000000000000000000000000000000000..f5f31056c65084460d38d309afba7a848d37caf0
+GIT binary patch
+literal 923
+zcmV;M17!S(P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00006VoOIv0RI60
+z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru+zby494Y{9=1c$p11L#E
+zK~y-)ZIjDuTy-49KfgOO_s&f3OeTzDW>SkJX=+>gNTc|mwMr`$#Fi=*>c*`IiVOb*
+z7cL4eT!~w8rzqHf+NeZmlaQ%NNSfwh(>x}LnVCDU`<i?2+@GtIfH}J_obQLTI7e`R
+zidE|!$8KfyWIFHIfzZ0tQfRiFu2}4c!CbPv-z)YXcbAq`TR%Kvn(pO%PZyp8NKlmy
+zEib^b+V;5~ZRpwV<nrE+vLEnIGux~=&gDXnE{#eP%eJr`2g7nmr(&`p5{Y{|&eGII
+z<>UVWzP`IXKfdiobEy>7sw<jiNW+v=Odq2a;qiKdLeddyZB>r0+Fu!7XW$9o-h=Y{
+zJAQD|a7vMx6+;>UY&Shh)he#nBApQsPYA7BM^8Xg%TU~MZvjLBexBa=aDKPWwRd0T
+z!OXe{qYAqXlR`dApt?-XZW6RZqH8fs8E0{ROUlFQwb`v&CJHb<w;GsHm9fcHLf7K>
+zsRB+IVQivET-5;;K>$_+m#Apkbsla;z3+dk$OwSl`_czb<)7(auR0{-8j}-C=v_H#
+zb(7P>$M8bI#Qg<I|CVulXtjK-Mx$evH*Q4%4hc(2*CwWF6sH!DUYp+DG>a=6{Ql<@
+z`Ft;@hh9KLTkMqU*i|WYO^Vls2ZSP}6xT1FNMCw!kh!tHFpU<r889+3P9~kj_XOo?
+zg+K1x!KnDm%|7PQ(u^pi5~a^>TyYd3g#6;88*i`AF5tEr(sNDPjwyW~79Xx~X6P(V
+zt%WK&H0w1fU6T_z!Oe@uZwn#X3V<p^`MoR8e@kOiD7!mh#4?3qnfT2Xi&GQ4a`p@-
+zpF2ul_aO!~I6rt~@%n{hp8!PmiuBz#U;emNb~=CGpT6Y!0a6C2kq|W!(tjk6SKFZ{
+zu87x96*`}PdiCi8w{W}o$eLI-lA}M3%39SBNnIzG%~IN0XXxegD5{j_hWbQ*F7fNt
+z;iGRpDbk))f?o!5iMLWW-yjlI@m(K32#6;yARQMi9upejTuf1>4@>|swPtrUJxA8-
+xrf_W!O;2Jqnq)Hxvgwr4*PStYvJrpJ{~uzmj|OZihQ9y+002ovPDHLkV1ltKp)CLa
+
+literal 0
+HcmV?d00001
+
+diff --git a/feeds/routing/luci-app-cjdns/Makefile b/feeds/routing/luci-app-cjdns/Makefile
+new file mode 100644
+index 0000000..793b4ec
+--- /dev/null
++++ b/feeds/routing/luci-app-cjdns/Makefile
+@@ -0,0 +1,54 @@
++#
++# Copyright (C) 2014,2015 Hyperboria.net
++#
++# You may redistribute this program and/or modify it under the terms of
++# the GNU General Public License as published by the Free Software Foundation,
++# either version 3 of the License, or (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=luci-app-cjdns
++PKG_VERSION:=1.3
++PKG_RELEASE:=5
++
++PKG_LICENSE:=GPL-3.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/luci-app-cjdns
++ SECTION:=luci
++ CATEGORY:=LuCI
++ SUBMENU:=3. Applications
++ TITLE:=Encrypted near-zero-conf mesh routing protocol
++ URL:=https://github.com/hyperboria/cjdns
++ MAINTAINER:=Lars Gierth <larsg@systemli.org>
++ DEPENDS:=+cjdns +luci-base
++endef
++
++define Package/luci-app-cjdns/description
++ This package allows you to configure and inspect cjdns networking using LuCI.
++
++ Cjdns implements an encrypted IPv6 network using public-key cryptography
++ for address allocation and a distributed hash table for routing.
++ This provides near-zero-configuration networking, and prevents many
++ of the security and scalability issues that plague existing networks.
++endef
++
++define Build/Compile
++endef
++
++define Package/luci-app-cjdns/install
++ $(INSTALL_DIR) $(1)/usr/lib/lua/luci
++ $(CP) ./luasrc/* $(1)/usr/lib/lua/luci
++endef
++
++$(eval $(call BuildPackage,luci-app-cjdns))
+diff --git a/feeds/routing/luci-app-cjdns/luasrc/controller/cjdns.lua b/feeds/routing/luci-app-cjdns/luasrc/controller/cjdns.lua
+new file mode 100644
+index 0000000..63644cb
+--- /dev/null
++++ b/feeds/routing/luci-app-cjdns/luasrc/controller/cjdns.lua
+@@ -0,0 +1,105 @@
++module("luci.controller.cjdns", package.seeall)
++
++cjdns = require "cjdns/init"
++dkjson = require "dkjson"
++
++function index()
++ if not nixio.fs.access("/etc/config/cjdns") then
++ return
++ end
++
++ entry({"admin", "services", "cjdns"},
++ cbi("cjdns/overview"), _("cjdns")).dependent = true
++
++ entry({"admin", "services", "cjdns", "overview"},
++ cbi("cjdns/overview"), _("Overview"), 1).leaf = false
++
++ entry({"admin", "services", "cjdns", "peering"},
++ cbi("cjdns/peering"), _("Peers"), 2).leaf = false
++
++ entry({"admin", "services", "cjdns", "iptunnel"},
++ cbi("cjdns/iptunnel"), _("IP Tunnel"), 3).leaf = false
++
++ entry({"admin", "services", "cjdns", "settings"},
++ cbi("cjdns/settings"), _("Settings"), 4).leaf = false
++
++ entry({"admin", "services", "cjdns", "cjdrouteconf"},
++ cbi("cjdns/cjdrouteconf"), _("cjdroute.conf"), 5).leaf = false
++
++ entry({"admin", "services", "cjdns", "peers"}, call("act_peers")).leaf = true
++ entry({"admin", "services", "cjdns", "ping"}, call("act_ping")).leaf = true
++end
++
++function act_peers()
++ require("cjdns/uci")
++ admin = cjdns.uci.makeInterface()
++
++ local page = 0
++ local peers = {}
++
++ while page do
++ local response, err = admin:auth({
++ q = "InterfaceController_peerStats",
++ page = page
++ })
++
++ if err or response.error then
++ luci.http.status(502, "Bad Gateway")
++ luci.http.prepare_content("application/json")
++ luci.http.write_json({ err = err, response = response })
++ return
++ end
++
++ for i,peer in pairs(response.peers) do
++ peer.ipv6 = publictoip6(peer.publicKey)
++ if peer.user == nil then
++ peer.user = ''
++ uci.cursor():foreach("cjdns", "udp_peer", function(udp_peer)
++ if peer.publicKey == udp_peer.public_key then
++ peer.user = udp_peer.user
++ end
++ end)
++ end
++ peers[#peers + 1] = peer
++ end
++
++ if response.more then
++ page = page + 1
++ else
++ page = nil
++ end
++ end
++
++ luci.http.status(200, "OK")
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(peers)
++end
++
++function act_ping()
++ require("cjdns/uci")
++ admin = cjdns.uci.makeInterface()
++
++ local response, err = admin:auth({
++ q = "SwitchPinger_ping",
++ path = luci.http.formvalue("label"),
++ timeout = tonumber(luci.http.formvalue("timeout"))
++ })
++
++ if err or response.error then
++ luci.http.status(502, "Bad Gateway")
++ luci.http.prepare_content("application/json")
++ luci.http.write_json({ err = err, response = response })
++ return
++ end
++
++ luci.http.status(200, "OK")
++ luci.http.prepare_content("application/json")
++ luci.http.write_json(response)
++end
++
++function publictoip6(publicKey)
++ local process = io.popen("/usr/bin/publictoip6 " .. publicKey, "r")
++ local ipv6 = process:read()
++ process:close()
++ return ipv6
++end
+diff --git a/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/cjdrouteconf.lua b/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/cjdrouteconf.lua
+new file mode 100644
+index 0000000..00e9ae0
+--- /dev/null
++++ b/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/cjdrouteconf.lua
+@@ -0,0 +1,32 @@
++m = Map("cjdns", translate("cjdns"),
++ translate("Implements an encrypted IPv6 network using public-key \
++ cryptography for address allocation and a distributed hash table for \
++ routing. This provides near-zero-configuration networking, and prevents \
++ many of the security and scalability issues that plague existing \
++ networks."))
++
++dkjson = require("dkjson")
++cjdns = require("cjdns")
++require("cjdns/uci")
++
++local f = SimpleForm("cjdrouteconf", translate("Edit cjdroute.conf"),
++ translate("JSON interface to what's /etc/cjdroute.conf on other systems. \
++ Will be parsed and written to UCI by <code>cjdrouteconf set</code>."))
++
++local o = f:field(Value, "_cjdrouteconf")
++o.template = "cbi/tvalue"
++o.rows = 25
++
++function o.cfgvalue(self, section)
++ return dkjson.encode(cjdns.uci.get(), { indent = true })
++end
++
++function o.write(self, section, value)
++ local obj, pos, err = dkjson.decode(value, 1, nil)
++
++ if obj then
++ cjdns.uci.set(obj)
++ end
++end
++
++return f
+diff --git a/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/iptunnel.lua b/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/iptunnel.lua
+new file mode 100644
+index 0000000..02b37dd
+--- /dev/null
++++ b/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/iptunnel.lua
+@@ -0,0 +1,46 @@
++uci = require "luci.model.uci"
++cursor = uci:cursor_state()
++
++m = Map("cjdns", translate("cjdns"),
++ translate("Implements an encrypted IPv6 network using public-key \
++ cryptography for address allocation and a distributed hash table for \
++ routing. This provides near-zero-configuration networking, and prevents \
++ many of the security and scalability issues that plague existing \
++ networks."))
++
++m.on_after_commit = function(self)
++ os.execute("/etc/init.d/cjdns restart")
++end
++
++-- Outgoing
++outgoing = m:section(TypedSection, "iptunnel_outgoing", translate("Outgoing IP Tunnel Connections"),
++ translate("Enter the public keys of the nodes that will provide Internet access."))
++outgoing.anonymous = true
++outgoing.addremove = true
++outgoing.template = "cbi/tblsection"
++
++outgoing:option(Value, "public_key", translate("Public Key")).size = 55
++
++-- Allowed
++allowed = m:section(TypedSection, "iptunnel_allowed", translate("Allowed IP Tunnel Connections"),
++ translate("Enter the public key of the node you will provide Internet access to, along with the \
++ IPv4 and/or IPv6 address you will assign them."))
++allowed.anonymous = true
++allowed.addremove = true
++
++public_key = allowed:option(Value, "public_key", translate("Public Key"))
++public_key.template = "cjdns/value"
++public_key.size = 55
++
++ipv4 = allowed:option(Value, "ipv4", translate("IPv4"))
++ipv4.template = "cjdns/value"
++ipv4.datatype = 'ipaddr'
++ipv4.size = 55
++
++ipv6 = allowed:option(Value, "ipv6", translate("IPv6"),
++ translate("IPv6 addresses should be entered <em>without</em> brackets here, e.g. <code>2001:123:ab::10</code>."))
++ipv6.template = "cjdns/value"
++ipv6.datatype = 'ip6addr'
++ipv6.size = 55
++
++return m
+diff --git a/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/overview.lua b/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/overview.lua
+new file mode 100644
+index 0000000..efa3a03
+--- /dev/null
++++ b/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/overview.lua
+@@ -0,0 +1,10 @@
++m = Map("cjdns", translate("cjdns"),
++ translate("Implements an encrypted IPv6 network using public-key \
++ cryptography for address allocation and a distributed hash table for \
++ routing. This provides near-zero-configuration networking, and prevents \
++ many of the security and scalability issues that plague existing \
++ networks."))
++
++m:section(SimpleSection).template = "cjdns/status"
++
++return m
+diff --git a/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/peering.lua b/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/peering.lua
+new file mode 100644
+index 0000000..2b1fc1b
+--- /dev/null
++++ b/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/peering.lua
+@@ -0,0 +1,73 @@
++uci = require "luci.model.uci"
++cursor = uci:cursor_state()
++
++cjdns = require("cjdns")
++require("cjdns/uci")
++
++m = Map("cjdns", translate("cjdns"),
++ translate("Implements an encrypted IPv6 network using public-key \
++ cryptography for address allocation and a distributed hash table for \
++ routing. This provides near-zero-configuration networking, and prevents \
++ many of the security and scalability issues that plague existing \
++ networks."))
++
++m.on_after_commit = function(self)
++ os.execute("/etc/init.d/cjdns restart")
++end
++
++-- Authorized Passwords
++passwords = m:section(TypedSection, "password", translate("Authorized Passwords"),
++ translate("Anyone offering one of the these passwords will be allowed to peer with you on the existing UDP and Ethernet interfaces."))
++passwords.anonymous = true
++passwords.addremove = true
++passwords.template = "cbi/tblsection"
++
++passwords:option(Value, "user", translate("User/Name"),
++ translate("Must be unique.")
++).default = "user-" .. cjdns.uci.random_string(6)
++passwords:option(Value, "contact", translate("Contact"), translate("Optional, for out-of-band communication."))
++passwords:option(Value, "password", translate("Password"),
++ translate("Hand out to your peer, in accordance with the peering best practices of the network.")
++).default = cjdns.uci.random_string(32)
++
++-- UDP Peers
++udp_peers = m:section(TypedSection, "udp_peer", translate("Outgoing UDP Peers"),
++ translate("For peering via public IP networks, the peer handed you their Public Key and IP address/port along with a password. IPv6 addresses should be entered with square brackets, like so: <code>[2001::1]</code>."))
++udp_peers.anonymous = true
++udp_peers.addremove = true
++udp_peers.template = "cbi/tblsection"
++udp_peers:option(Value, "user", translate("User/Name")).datatype = "string"
++
++udp_interface = udp_peers:option(Value, "interface", translate("UDP interface"))
++local index = 1
++for i,section in pairs(cursor:get_all("cjdns")) do
++ if section[".type"] == "udp_interface" then
++ udp_interface:value(index, section.address .. ":" .. section.port)
++ end
++end
++udp_interface.default = 1
++udp_peers:option(Value, "address", translate("IP address"))
++udp_peers:option(Value, "port", translate("Port")).datatype = "portrange"
++udp_peers:option(Value, "public_key", translate("Public key"))
++udp_peers:option(Value, "password", translate("Password"))
++
++-- Ethernet Peers
++eth_peers = m:section(TypedSection, "eth_peer", translate("Outgoing Ethernet Peers"),
++ translate("For peering via local Ethernet networks, the peer handed you their Public Key and MAC address along with a password."))
++eth_peers.anonymous = true
++eth_peers.addremove = true
++eth_peers.template = "cbi/tblsection"
++
++eth_interface = eth_peers:option(Value, "interface", translate("Ethernet interface"))
++local index = 1
++for i,section in pairs(cursor:get_all("cjdns")) do
++ if section[".type"] == "eth_interface" then
++ eth_interface:value(index, section.bind)
++ end
++end
++eth_interface.default = 1
++eth_peers:option(Value, "address", translate("MAC address")).datatype = "macaddr"
++eth_peers:option(Value, "public_key", translate("Public key"))
++eth_peers:option(Value, "password", translate("Password"))
++
++return m
+diff --git a/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/settings.lua b/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/settings.lua
+new file mode 100644
+index 0000000..d188915
+--- /dev/null
++++ b/feeds/routing/luci-app-cjdns/luasrc/model/cbi/cjdns/settings.lua
+@@ -0,0 +1,67 @@
++m = Map("cjdns", translate("cjdns"),
++ translate("Implements an encrypted IPv6 network using public-key \
++ cryptography for address allocation and a distributed hash table for \
++ routing. This provides near-zero-configuration networking, and prevents \
++ many of the security and scalability issues that plague existing \
++ networks."))
++
++m.on_after_commit = function(self)
++ os.execute("/etc/init.d/cjdns restart")
++end
++
++s = m:section(NamedSection, "cjdns", nil, translate("Settings"))
++s.addremove = false
++
++-- Identity
++s:tab("identity", translate("Identity"))
++node6 = s:taboption("identity", Value, "ipv6", translate("IPv6 address"),
++ translate("This node's IPv6 address within the cjdns network."))
++node6.datatype = "ip6addr"
++pbkey = s:taboption("identity", Value, "public_key", translate("Public key"),
++ translate("Used for packet encryption and authentication."))
++pbkey.datatype = "string"
++prkey = s:taboption("identity", Value, "private_key", translate("Private key"),
++ translate("Keep this private. When compromised, generate a new keypair and IPv6."))
++prkey.datatype = "string"
++
++-- Admin Interface
++s:tab("admin", translate("Admin API"), translate("The Admin API can be used by other applications or services to configure and inspect cjdns' routing and peering.<br/><br/>Documentation: <a href=\"https://github.com/cjdelisle/cjdns/tree/master/admin#cjdns-admin-api\">admin/README.md</a>"))
++aip = s:taboption("admin", Value, "admin_address", translate("IP Address"),
++ translate("IPv6 addresses should be entered like so: <code>[2001::1]</code>."))
++apt = s:taboption("admin", Value, "admin_port", translate("Port"))
++apt.datatype = "port"
++apw = s:taboption("admin", Value, "admin_password", translate("Password"))
++apw.datatype = "string"
++
++-- Security
++s:tab("security", translate("Security"), translate("Functionality related to hardening the cjdroute process."))
++s:taboption("security", Flag, "seccomp", translate("SecComp sandboxing"))
++
++-- UDP Interfaces
++udp_interfaces = m:section(TypedSection, "udp_interface", translate("UDP Interfaces"),
++ translate("These interfaces allow peering via public IP networks, such as the Internet, or many community-operated wireless networks. IPv6 addresses should be entered with square brackets, like so: <code>[2001::1]</code>."))
++udp_interfaces.anonymous = true
++udp_interfaces.addremove = true
++udp_interfaces.template = "cbi/tblsection"
++
++udp_address = udp_interfaces:option(Value, "address", translate("IP Address"))
++udp_address.placeholder = "0.0.0.0"
++udp_interfaces:option(Value, "port", translate("Port")).datatype = "portrange"
++
++-- Ethernet Interfaces
++eth_interfaces = m:section(TypedSection, "eth_interface", translate("Ethernet Interfaces"),
++ translate("These interfaces allow peering via local Ethernet networks, such as home or office networks, or phone tethering. If an interface name is set to \"all\" each available device will be used."))
++eth_interfaces.anonymous = true
++eth_interfaces.addremove = true
++eth_interfaces.template = "cbi/tblsection"
++
++eth_bind = eth_interfaces:option(Value, "bind", translate("Network Interface"))
++eth_bind.placeholder = "br-lan"
++eth_beacon = eth_interfaces:option(Value, "beacon", translate("Beacon Mode"))
++eth_beacon:value(0, translate("0 -- Disabled"))
++eth_beacon:value(1, translate("1 -- Accept beacons"))
++eth_beacon:value(2, translate("2 -- Accept and send beacons"))
++eth_beacon.default = 2
++eth_beacon.datatype = "integer(range(0,2))"
++
++return m
+diff --git a/feeds/routing/luci-app-cjdns/luasrc/view/admin_status/index/cjdns.htm b/feeds/routing/luci-app-cjdns/luasrc/view/admin_status/index/cjdns.htm
+new file mode 100644
+index 0000000..58c3843
+--- /dev/null
++++ b/feeds/routing/luci-app-cjdns/luasrc/view/admin_status/index/cjdns.htm
+@@ -0,0 +1 @@
++<%+cjdns/status%>
+diff --git a/feeds/routing/luci-app-cjdns/luasrc/view/cjdns/status.htm b/feeds/routing/luci-app-cjdns/luasrc/view/cjdns/status.htm
+new file mode 100644
+index 0000000..9d43e85
+--- /dev/null
++++ b/feeds/routing/luci-app-cjdns/luasrc/view/cjdns/status.htm
+@@ -0,0 +1,116 @@
++<script type="text/javascript">//<![CDATA[
++
++ var peersURI = '<%=luci.dispatcher.build_url("admin", "services", "cjdns", "peers")%>';
++ var updatePeers = function(x, peers) {
++ var table = document.getElementById('cjdns-peerings');
++ while (table.rows.length > 1) {
++ table.deleteRow(1);
++ }
++
++ if ((peers) && ((peers.err) || (typeof peers.length === 'undefined'))) {
++ var errpeer = (peers.err)
++ ? 'Socket Error: unable to connect to Admin API'
++ : 'No active peers';
++ var row = table.insertRow(-1);
++ row.className = 'cbi-section-table-row';
++ var cell = row.insertCell(-1);
++ cell.colSpan = 7;
++ cell.textContent = errpeer;
++ return;
++ };
++
++ peers.forEach(function(peer, i) {
++ if (peer.user == null) {
++ var user = '';
++ } else if (peer.user == 'Local Peers') {
++ var user = 'beacon';
++ } else {
++ var user = peer.user;
++ }
++
++ if (peer.isIncoming === 0) {
++ var interface = 'outgoing';
++ } else {
++ var interface = 'incoming';
++ }
++
++ var status = interface + ', ' + peer.state.toLowerCase();
++
++ if (peer.version === 0) {
++ var version = '-';
++ } else {
++ var version = 'v' + peer.version;
++ }
++
++ var rxtx = lbbytes(peer.bytesIn) + ' / ' + lbbytes(peer.bytesOut);
++
++ var row = table.insertRow(-1);
++ row.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);
++ row.insertCell(-1).textContent = user;
++ row.insertCell(-1).textContent = peer.ipv6;
++ row.insertCell(-1).textContent = status;
++ row.insertCell(-1).textContent = version;
++ row.insertCell(-1).textContent = rxtx;
++ var latencyCell = row.insertCell(-1);
++ latencyCell.textContent = 'waiting';
++
++ var pingURI = '<%=luci.dispatcher.build_url("admin", "services", "cjdns", "ping")%>';
++ var timeout = 2000;
++ XHR.get(pingURI, { label: peer.switchLabel, timeout: timeout }, function(x, pong) {
++ var pongrsp = ((pong.err == "ai:recv > timeout") || (pong == "undefined") || (pong.ms >= timeout))
++ ? '> ' + timeout + ' ms'
++ : pong.ms + ' ms';
++ latencyCell.textContent = pongrsp;
++ })
++ });
++
++ };
++
++ XHR.get(peersURI, null, updatePeers);
++ XHR.poll(5, peersURI, null, updatePeers);
++
++//]]></script>
++
++<script type="text/javascript">
++<%# Author: [GitHub/75lb] -%>
++//<![CDATA[
++function lbbytes (bytes){
++
++ var kilobyte = 1024,
++ megabyte = kilobyte * 1024,
++ gigabyte = megabyte * 1024,
++ terabyte = gigabyte * 1024;
++
++ if ((bytes >= 0) && (bytes < kilobyte)) {
++ return bytes + " B";
++ } else if ((bytes >= kilobyte) && (bytes < megabyte)) {
++ return (bytes / kilobyte).toFixed(2) + " KB";
++ } else if ((bytes >= megabyte) && (bytes < gigabyte)) {
++ return (bytes / megabyte).toFixed(2) + " MB";
++ } else if ((bytes >= gigabyte) && (bytes < terabyte)) {
++ return (bytes / gigabyte).toFixed(2) + " GB";
++ } else if (bytes >= terabyte) {
++ return (bytes / terabyte).toFixed(2) + " TB";
++ } else {
++ return bytes + " B";
++ }
++};
++//]]>
++</script>
++
++<fieldset class="cbi-section">
++ <legend>Active cjdns peers</legend>
++ <table class="cbi-section-table" id="cjdns-peerings">
++ <tr class="cbi-section-table-titles">
++ <th class="cbi-section-table-cell">User/Name</th>
++ <th class="cbi-section-table-cell">IPv6</th>
++ <th class="cbi-section-table-cell">Status</th>
++ <th class="cbi-section-table-cell">Version</th>
++ <th class="cbi-section-table-cell">Rx / Tx</th>
++ <th class="cbi-section-table-cell">Latency</th>
++ </tr>
++ <tr class="cbi-section-table-row">
++ <td colspan="7">Querying Admin API</td>
++ </tr>
++ </table>
++</fieldset>
+diff --git a/feeds/routing/luci-app-cjdns/luasrc/view/cjdns/value.htm b/feeds/routing/luci-app-cjdns/luasrc/view/cjdns/value.htm
+new file mode 100644
+index 0000000..d1e54bb
+--- /dev/null
++++ b/feeds/routing/luci-app-cjdns/luasrc/view/cjdns/value.htm
+@@ -0,0 +1,35 @@
++<%+cbi/valueheader%>
++ <input type="<%=self.password and 'password" class="cbi-input-password' or 'text" class="cbi-input-text' %>" onchange="cbi_d_update(this.id)"<%=
++ attr("name", cbid) .. attr("id", cbid) .. attr("value", self:cfgvalue(section) or self.default) ..
++ ifattr(self.size, "size") .. ifattr(self.placeholder, "placeholder")
++ %> style="width: auto" />
++ <% if self.password then %><img src="<%=resource%>/cbi/reload.gif" style="vertical-align:middle" title="<%:Reveal/hide password%>" onclick="var e = document.getElementById('<%=cbid%>'); e.type = (e.type=='password') ? 'text' : 'password';" /><% end %>
++ <% if #self.keylist > 0 or self.datatype then -%>
++ <script type="text/javascript">//<![CDATA[
++ <% if #self.keylist > 0 then -%>
++ cbi_combobox_init('<%=cbid%>', {
++ <%-
++ for i, k in ipairs(self.keylist) do
++ -%>
++ <%-=string.format("%q", k) .. ":" .. string.format("%q", self.vallist[i])-%>
++ <%-if i<#self.keylist then-%>,<%-end-%>
++ <%-
++ end
++ -%>
++ }, '<%- if not self.rmempty and not self.optional then -%>
++ <%-: -- Please choose -- -%>
++ <%- elseif self.placeholder then -%>
++ <%-= pcdata(self.placeholder) -%>
++ <%- end -%>', '
++ <%- if self.combobox_manual then -%>
++ <%-=self.combobox_manual-%>
++ <%- else -%>
++ <%-: -- custom -- -%>
++ <%- end -%>');
++ <%- end %>
++ <% if self.datatype then -%>
++ cbi_validate_field('<%=cbid%>', <%=tostring((self.optional or self.rmempty) == true)%>, '<%=self.datatype:gsub("'", "\\'")%>');
++ <%- end %>
++ //]]></script>
++ <% end -%>
++<%+cbi/valuefooter%>
+diff --git a/feeds/routing/mcproxy/Makefile b/feeds/routing/mcproxy/Makefile
+new file mode 100644
+index 0000000..c155055
+--- /dev/null
++++ b/feeds/routing/mcproxy/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mcproxy
++PKG_SOURCE_VERSION:=b7bd2d0809a0d1f177181c361b9a6c83e193b79a
++PKG_VERSION:=2014-12-31-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=3
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/mcproxy/mcproxy.git
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=GPL-2.0+
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/mcproxy
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE:=Multicast Proxy for IGMP/MLD
++ URL:=http://mcproxy.realmv6.org
++ DEPENDS:=+libpthread +libstdcpp @(!GCC_VERSION_4_4&&!GCC_VERSION_4_6)
++endef
++
++define Package/mcproxy/description
++ mcproxy is a free & open source implementation of the IGMP/MLD proxy function (see RFC 4605) for Linux systems.
++ It operates on the kernel tables for multicast routing and allows for multiple instantiations,
++ as well as dynamically changing downstream interfaces.
++endef
++
++define Package/mcproxy/conffiles
++/etc/mcproxy.conf
++/etc/config/mcproxy
++endef
++
++define Package/mcproxy/install
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) ./files/mcproxy.conf $(1)/etc/mcproxy.conf
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/mcproxy.config $(1)/etc/config/mcproxy
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/mcproxy.init $(1)/etc/init.d/mcproxy
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/mcproxy-bin $(1)/usr/sbin/mcproxy
++endef
++
++$(eval $(call BuildPackage,mcproxy))
+diff --git a/feeds/routing/mcproxy/files/mcproxy.conf b/feeds/routing/mcproxy/files/mcproxy.conf
+new file mode 100644
+index 0000000..936cdda
+--- /dev/null
++++ b/feeds/routing/mcproxy/files/mcproxy.conf
+@@ -0,0 +1,68 @@
++######################################
++##-- mcproxy configuration script --##
++######################################
++
++# Protocol: IGMPv1|IGMPv2|IGMPv3 (IPv4) - MLDv1|MLDv2 (IPv6)
++protocol IGMPv3;
++
++###########################################
++
++# Proxy Instance: upstream ==> downstream
++pinstance A: ap a1 ==> ap a2;
++pinstance B: bp b1 ==> bp b2;
++
++###########################################
++
++# Tables
++table allways {
++ (*|*)
++};
++
++table piA_peering_ifs {
++ ap(*|*)
++};
++
++table piA_upstreams {
++ a1(*|*)
++};
++
++table piB_peering_ifs {
++ bp(*|*)
++};
++
++table piB_upstreams {
++ b1(*|*)
++};
++
++###########################################
++
++# Instance Behaviour
++pinstance A upstream * in rulematching mutex 10; #or 25ms (u4)
++#pinstance A upstream * out rulematching all; #default
++
++pinstance A upstream ap out blacklist table allways; #(u1)
++#pinstance A upstream ap in whitelist table {(*|*)}; #default (u2, u3)
++
++pinstance A upstream a1 out blacklist table piA_peering_ifs; #(u3_1)
++#pinstance A upstream a1 in whitelist table {(*|*)}; #default
++
++pinstance A downstream ap in blacklist table allways; #(d1)
++pinstance A downstream ap out blacklist table piA_upstreams; #(d2, d2_1, d3, d4)
++
++#pinstance A downstream a2 in whitelist table {(*|*)}; #default
++#pinstance A downstream a2 out whitelist table {(*|*)}; #default
++
++pinstance B upstream * in rulematching mutex 10; #or 25ms (u4)
++#pinstance B upstream * out rulematching all; #default
++
++pinstance B upstream bp out blacklist table allways; #(u1)
++#pinstance B upstream bp in whitelist table {(*|*)}; #default (u2, u3)
++
++pinstance B upstream b1 out blacklist table piB_peering_ifs; #(u3_1)
++#pinstance b upstream b1 in whitelist table {(*|*)}; #default
++
++pinstance B downstream bp in blacklist table allways; #(d1)
++pinstance B downstream bp out blacklist table piB_upstreams; #(d2, d2_1, d3, d4)
++
++#pinstance B downstream b2 in whitelist table {(*|*)}; #default
++#pinstance B downstream b2 out whitelist table {(*|*)}; #default
+diff --git a/feeds/routing/mcproxy/files/mcproxy.config b/feeds/routing/mcproxy/files/mcproxy.config
+new file mode 100644
+index 0000000..10cc410
+--- /dev/null
++++ b/feeds/routing/mcproxy/files/mcproxy.config
+@@ -0,0 +1,231 @@
++# Use your own MCProxy config file
++config mcproxy 'mcproxy_file'
++ option disabled '1'
++ option respawn '1'
++ option file '/etc/mcproxy.conf'
++
++# Use OpenWrt UCI config
++config mcproxy 'mcproxy'
++ option disabled '1'
++ option respawn '1'
++ option protocol 'IGMPv3'
++
++###########################################
++
++# Simple configuration examples
++
++config instance
++ option disabled '1'
++ option name 'proxy1'
++ list upstream 'eth1'
++ list downstream 'eth0.2'
++
++config instance
++ option disabled '1'
++ option name 'proxy2'
++ list upstream 'eth0.2'
++ list downstream 'eth0.4'
++ list downstream 'br-lan'
++
++config instance
++ option disabled '1'
++ option name 'proxy3'
++ list upstream 'eth1.2'
++ list upstream 'eth1.4'
++ list downstream 'eth0.1'
++
++###########################################
++
++# Advanced configuration example
++
++config instance
++ option name 'A'
++ list upstream 'ap'
++ list upstream 'a1'
++ list downstream 'ap'
++ list downstream 'a2'
++
++config instance
++ option name 'B'
++ list upstream 'bp'
++ list upstream 'b1'
++ list downstream 'bp'
++ list downstream 'b2'
++
++config table
++ option name 'allways'
++ list entries '(*|*)'
++
++config table
++ option name 'piA_peering_ifs'
++ list entries 'ap(*|*)'
++
++config table
++ option name 'piA_upstreams'
++ list entries 'a1(*|*)'
++
++config table
++ option name 'piB_peering_ifs'
++ list entries 'bp(*|*)'
++
++config table
++ option name 'piB_upstreams'
++ list entries 'b1(*|*)'
++
++config behaviour
++ option instance 'A'
++ option section 'upstream'
++ option interface '*'
++ option direction 'in'
++ option rulematching 'mutex 10'
++
++config behaviour
++ option disabled '1'
++ option instance 'A'
++ option section 'upstream'
++ option interface '*'
++ option direction 'out'
++ option rulematching 'all'
++
++config behaviour
++ option instance 'A'
++ option section 'upstream'
++ option interface 'ap'
++ option direction 'out'
++ option table 'allways'
++
++config behaviour
++ option disabled '1'
++ option instance 'A'
++ option section 'upstream'
++ option interface 'ap'
++ option direction 'in'
++ option whitelist '1'
++ option table '{(*|*)}'
++
++config behaviour
++ option instance 'A'
++ option section 'upstream'
++ option interface 'a1'
++ option direction 'out'
++ option table 'piA_peering_ifs'
++
++config behaviour
++ option disabled '1'
++ option instance 'A'
++ option section 'upstream'
++ option interface 'a1'
++ option direction 'in'
++ option whitelist '1'
++ option table '{(*|*)}'
++
++config behaviour
++ option instance 'A'
++ option section 'downstream'
++ option interface 'ap'
++ option direction 'in'
++ option table 'allways'
++
++config behaviour
++ option instance 'A'
++ option section 'downstream'
++ option interface 'ap'
++ option direction 'out'
++ option table 'piA_upstreams'
++
++config behaviour
++ option disabled '1'
++ option instance 'A'
++ option section 'downstream'
++ option interface 'a2'
++ option direction 'in'
++ option whitelist '1'
++ option table '{(*|*)}'
++
++config behaviour
++ option disabled '1'
++ option instance 'A'
++ option section 'downstream'
++ option interface 'a2'
++ option direction 'out'
++ option whitelist '1'
++ option table '{(*|*)}'
++
++config behaviour
++ option instance 'B'
++ option section 'upstream'
++ option interface '*'
++ option direction 'in'
++ option rulematching 'mutex 10'
++
++config behaviour
++ option disabled '1'
++ option instance 'B'
++ option section 'upstream'
++ option interface '*'
++ option direction 'out'
++ option rulematching 'all'
++
++config behaviour
++ option instance 'B'
++ option section 'upstream'
++ option interface 'bp'
++ option direction 'out'
++ option table 'allways'
++
++config behaviour
++ option disabled '1'
++ option instance 'B'
++ option section 'upstream'
++ option interface 'bp'
++ option direction 'in'
++ option whitelist '1'
++ option table '{(*|*)}'
++
++config behaviour
++ option instance 'B'
++ option section 'upstream'
++ option interface 'b1'
++ option direction 'out'
++ option table 'piB_peering_ifs'
++
++config behaviour
++ option disabled '1'
++ option instance 'B'
++ option section 'upstream'
++ option interface 'b1'
++ option direction 'in'
++ option whitelist '1'
++ option table '{(*|*)}'
++
++config behaviour
++ option instance 'B'
++ option section 'downstream'
++ option interface 'bp'
++ option direction 'in'
++ option table 'allways'
++
++config behaviour
++ option instance 'B'
++ option section 'downstream'
++ option interface 'bp'
++ option direction 'out'
++ option table 'piB_upstreams'
++
++config behaviour
++ option disabled '1'
++ option instance 'B'
++ option section 'downstream'
++ option interface 'b2'
++ option direction 'in'
++ option whitelist '1'
++ option table '{(*|*)}'
++
++config behaviour
++ option disabled '1'
++ option instance 'B'
++ option section 'downstream'
++ option interface 'b2'
++ option direction 'out'
++ option whitelist '1'
++ option table '{(*|*)}'
+diff --git a/feeds/routing/mcproxy/files/mcproxy.init b/feeds/routing/mcproxy/files/mcproxy.init
+new file mode 100644
+index 0000000..60e4c87
+--- /dev/null
++++ b/feeds/routing/mcproxy/files/mcproxy.init
+@@ -0,0 +1,184 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014-2015 OpenWrt.org
++
++START=99
++USE_PROCD=1
++
++mcproxy_handle_instances() {
++ local instance="$1"
++ local conf_file="$2"
++ local disabled
++ local pre=""
++ local name
++ local upstreams
++ local downstreams
++
++ config_get_bool disabled "$instance" 'disabled' '0'
++ config_get name "$instance" "name" "$instance"
++ config_get upstreams "$instance" "upstream"
++ config_get downstreams "$instance" "downstream"
++
++ if [ $disabled -eq 1 ]; then
++ pre="# "
++ fi
++
++ local str_up=""
++ if [ -n "$upstreams" ]; then
++ local upstream
++ for upstream in $upstreams; do
++ str_up="$str_up \"$upstream\""
++ done
++ fi
++
++ local str_down=""
++ if [ -n "$downstreams" ]; then
++ local downstream
++ for downstream in $downstreams; do
++ str_down="$str_down \"$downstream\""
++ done
++ fi
++
++ if [ ! -z $downstream ]; then
++ echo -e "${pre}pinstance ${name}:${str_up} ==>${str_down};\n" >> $conf_file
++ fi
++}
++
++# mcproxy_list_table <var> <section> <option>
++mcproxy_list_table() {
++ local val
++ local len
++ local _buffer
++ local c=1
++
++ config_get len "$2" "${3}_LENGTH"
++ [ -z "$len" ] && return 0
++ while [ $c -le "$len" ]; do
++ config_get val "$2" "${3}_ITEM$c"
++ append _buffer "\t${val}\n"
++ c="$(($c + 1))"
++ done
++
++ export "${1}=${_buffer}";
++}
++
++mcproxy_handle_tables() {
++ local table="$1"
++ local conf_file="$2"
++ local name
++ local entries
++
++ config_get name "$table" "name" ""
++ mcproxy_list_table entries "$table" "entries"
++
++ if [ ! -z $name ] && [ ! -z $table ]; then
++ echo -e "table $name {\n${entries}};\n" >> $conf_file
++ fi
++}
++
++mcproxy_handle_behaviour() {
++ local behaviour="$1"
++ local conf_file="$2"
++ local disabled
++ local pre=""
++ local instance
++ local section
++ local interface
++ local direction
++ local rulematching
++ local table
++
++ config_get_bool disabled "$behaviour" 'disabled' '0'
++ config_get instance "$behaviour" "instance"
++ config_get section "$behaviour" "section" "upstream"
++ config_get interface "$behaviour" "interface" "*"
++ config_get direction "$behaviour" "direction" "in"
++ config_get rulematching "$behaviour" "rulematching"
++ config_get table "$behaviour" "table"
++
++ if [ -z $instance ]; then
++ return 1
++ fi
++
++ local rule_table
++ if [ ! -z $rulematching ]; then
++ rule_table="rulematching $rulematching"
++ elif [ ! -z $table ]; then
++ local whitelist
++ local list
++
++ config_get_bool whitelist "$behaviour" 'whitelist' '0'
++ if [ $whitelist -eq 1 ]; then
++ list="whitelist"
++ else
++ list="blacklist"
++ fi
++
++ rule_table="$list table $table"
++ else
++ rule_table="rulematching all"
++ fi
++
++ if [ $disabled -eq 1 ]; then
++ pre="# "
++ fi
++
++ echo -e "${pre}pinstance $instance $section \"$interface\" $direction $rule_table;\n" >> $conf_file
++}
++
++mcproxy_network_trigger() {
++ procd_add_interface_trigger "interface.*" "$1" /etc/init.d/mcproxy restart
++}
++mcproxy_handle_network() {
++ local instance="$1"
++
++ config_list_foreach "$instance" upstream mcproxy_network_trigger
++ config_list_foreach "$instance" downstream mcproxy_network_trigger
++}
++
++start_instance() {
++ local cfg="$1"
++ local aux
++ local conf_file
++
++ config_get_bool aux "$cfg" 'disabled' '0'
++ [ "$aux" = 1 ] && return 1
++
++ config_get conf_file "$cfg" "file"
++ if [ ! -n "$conf_file" ]; then
++ mkdir -p /var/etc
++ conf_file="/var/etc/mcproxy_${cfg}.conf"
++
++ local protocol
++ config_get protocol "$cfg" "protocol" "IGMPv3"
++ echo -e "protocol ${protocol};\n" > $conf_file
++
++ config_foreach mcproxy_handle_instances instance $conf_file
++ config_foreach mcproxy_handle_tables table $conf_file
++ config_foreach mcproxy_handle_behaviour behaviour $conf_file
++ fi
++
++ procd_open_instance
++
++ procd_set_param command /usr/sbin/mcproxy
++ procd_append_param command -f $conf_file
++
++ config_get_bool aux "$cfg" 'respawn' '0'
++ [ "$aux" = 1 ] && procd_set_param respawn
++
++ procd_open_trigger
++ config_foreach mcproxy_handle_network instance
++ procd_close_trigger
++
++ procd_close_instance
++}
++
++service_triggers() {
++ procd_open_trigger
++ procd_add_config_trigger "config.change" "mcproxy" /etc/init.d/mcproxy restart
++ procd_close_trigger
++}
++
++start_service() {
++ config_load mcproxy
++ config_foreach start_instance mcproxy
++}
+diff --git a/feeds/routing/mcproxy/patches/0001-add-cmake.patch b/feeds/routing/mcproxy/patches/0001-add-cmake.patch
+new file mode 100644
+index 0000000..69bfa36
+--- /dev/null
++++ b/feeds/routing/mcproxy/patches/0001-add-cmake.patch
+@@ -0,0 +1,54 @@
++--- /dev/null
+++++ b/CMakeLists.txt
++@@ -0,0 +1,51 @@
+++cmake_minimum_required(VERSION 2.8)
+++
+++# Project Definition
+++project(mcproxy CXX)
+++set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
+++set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11")
+++add_definitions(-Wall -Wextra -pedantic)
+++include_directories(${CMAKE_SOURCE_DIR}/mcproxy)
+++
+++
+++add_executable(mcproxy-bin mcproxy/src/main.cpp
+++ mcproxy/src/hamcast_logging.cpp
+++ #utils
+++ mcproxy/src/utils/mc_socket.cpp
+++ mcproxy/src/utils/addr_storage.cpp
+++ mcproxy/src/utils/mroute_socket.cpp
+++ mcproxy/src/utils/if_prop.cpp
+++ mcproxy/src/utils/reverse_path_filter.cpp
+++ #proxy
+++ mcproxy/src/proxy/proxy.cpp
+++ mcproxy/src/proxy/sender.cpp
+++ mcproxy/src/proxy/receiver.cpp
+++ mcproxy/src/proxy/mld_receiver.cpp
+++ mcproxy/src/proxy/igmp_receiver.cpp
+++ mcproxy/src/proxy/mld_sender.cpp
+++ mcproxy/src/proxy/igmp_sender.cpp
+++ mcproxy/src/proxy/proxy_instance.cpp
+++ mcproxy/src/proxy/routing.cpp
+++ mcproxy/src/proxy/worker.cpp
+++ mcproxy/src/proxy/timing.cpp
+++ mcproxy/src/proxy/check_if.cpp
+++ mcproxy/src/proxy/check_kernel.cpp
+++ mcproxy/src/proxy/membership_db.cpp
+++ mcproxy/src/proxy/querier.cpp
+++ mcproxy/src/proxy/timers_values.cpp
+++ mcproxy/src/proxy/interfaces.cpp
+++ mcproxy/src/proxy/def.cpp
+++ mcproxy/src/proxy/simple_mc_proxy_routing.cpp
+++ mcproxy/src/proxy/simple_routing_data.cpp
+++ #parser
+++ mcproxy/src/parser/scanner.cpp
+++ mcproxy/src/parser/token.cpp
+++ mcproxy/src/parser/configuration.cpp
+++ mcproxy/src/parser/parser.cpp
+++ mcproxy/src/parser/interface.cpp
+++)
+++target_link_libraries(mcproxy-bin pthread)
+++
+++# Installation
+++install(TARGETS mcproxy-bin DESTINATION bin/)
+++
+diff --git a/feeds/routing/mcproxy/patches/0002-rm-stoi.patch b/feeds/routing/mcproxy/patches/0002-rm-stoi.patch
+new file mode 100644
+index 0000000..a25c9fb
+--- /dev/null
++++ b/feeds/routing/mcproxy/patches/0002-rm-stoi.patch
+@@ -0,0 +1,40 @@
++--- a/mcproxy/src/parser/parser.cpp
+++++ b/mcproxy/src/parser/parser.cpp
++@@ -126,7 +126,7 @@ void parser::parse_instance_definition(i
++ get_next_token();
++ if (m_current_token.get_type() == TT_STRING) {
++ try {
++- table_number = std::stoi(m_current_token.get_string());
+++ table_number = atoi(m_current_token.get_string().c_str());
++ user_selected_table_number = true;
++ } catch (std::logic_error e) {
++ HC_LOG_ERROR("failed to parse line " << m_current_line << " table number: " << table_number << " is not a number");
++@@ -299,7 +299,7 @@ std::unique_ptr<addr_match> parser::pars
++ get_next_token();
++ if (m_current_token.get_type() == TT_STRING) {
++ try {
++- unsigned int prefix = std::stoi(m_current_token.get_string());
+++ unsigned int prefix = atoi(m_current_token.get_string().c_str());
++ if (prefix > 128) {
++ throw;
++ }
++@@ -561,7 +561,7 @@ void parser::parse_interface_rule_match_
++ get_next_token();
++ if (m_current_token.get_type() == TT_STRING) {
++ try {
++- int tmp_timeout = std::stoi(m_current_token.get_string());
+++ int tmp_timeout = atoi(m_current_token.get_string().c_str());
++ timeout = std::chrono::milliseconds(tmp_timeout);
++ } catch (...) {
++ error_notification();
++--- a/mcproxy/src/utils/addr_storage.cpp
+++++ b/mcproxy/src/utils/addr_storage.cpp
++@@ -298,7 +298,7 @@ addr_storage& addr_storage::set_port(uin
++
++ addr_storage& addr_storage::set_port(const std::string& port)
++ {
++- set_port(std::stoi(port.c_str()));
+++ set_port(atoi(port.c_str()));
++ return *this;
++ }
++
+diff --git a/feeds/routing/mcproxy/patches/0003-add-sourcefilter.patch b/feeds/routing/mcproxy/patches/0003-add-sourcefilter.patch
+new file mode 100644
+index 0000000..2f64975
+--- /dev/null
++++ b/feeds/routing/mcproxy/patches/0003-add-sourcefilter.patch
+@@ -0,0 +1,181 @@
++--- a/mcproxy/src/utils/mc_socket.cpp
+++++ b/mcproxy/src/utils/mc_socket.cpp
++@@ -37,6 +37,10 @@
++ #include <numeric>
++ #include <unistd.h>
++
+++#ifndef __GLIBC__
+++#include "sourcefilter.cpp"
+++#endif /* __GLIBC__ */
+++
++ std::string ipAddrResolver(std::string ipAddr)
++ {
++ std::string str[][2] = {
++--- /dev/null
+++++ b/mcproxy/src/utils/sourcefilter.cpp
++@@ -0,0 +1,165 @@
+++/* Get source filter. Linux version.
+++ Copyright (C) 2004-2014 Free Software Foundation, Inc.
+++ This file is part of the GNU C Library.
+++ Contributed by Ulrich Drepper <drepper@redhat.com>, 2004.
+++
+++ The GNU C Library is free software; you can redistribute it and/or
+++ modify it under the terms of the GNU Lesser General Public
+++ License as published by the Free Software Foundation; either
+++ version 2.1 of the License, or (at your option) any later version.
+++
+++ The GNU C Library is distributed in the hope that it will be useful,
+++ but WITHOUT ANY WARRANTY; without even the implied warranty of
+++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+++ Lesser General Public License for more details.
+++
+++ You should have received a copy of the GNU Lesser General Public
+++ License along with the GNU C Library; if not, see
+++ <http://www.gnu.org/licenses/>. */
+++
+++#include <assert.h>
+++#include <errno.h>
+++#include <stdlib.h>
+++#include <string.h>
+++#include <stdint.h>
+++#include <netinet/in.h>
+++#include <netpacket/packet.h>
+++#include <sys/param.h>
+++#include <sys/socket.h>
+++
+++static const struct
+++{
+++ int sol;
+++ int af;
+++ socklen_t size;
+++} sol_map[] =
+++ {
+++ /* Sort the array according to importance of the protocols. Add
+++ more protocols when they become available. */
+++ { SOL_IP, AF_INET, sizeof (struct sockaddr_in) },
+++ { SOL_IPV6, AF_INET6, sizeof (struct sockaddr_in6) },
+++ { SOL_PACKET, AF_PACKET, sizeof (struct sockaddr_ll) }
+++ };
+++#define NSOL_MAP (sizeof (sol_map) / sizeof (sol_map[0]))
+++
+++
+++/* Try to determine the socket level value. Ideally both side and
+++ family are set. But sometimes only the size is correct and the
+++ family value might be bogus. Loop over the array entries and look
+++ for a perfect match or the first match based on size. */
+++static int
+++__get_sol (int af, socklen_t len)
+++{
+++ int first_size_sol = -1;
+++
+++ for (size_t cnt = 0; cnt < NSOL_MAP; ++cnt)
+++ {
+++ /* Just a test so that we make sure the special value used to
+++ signal the "we have so far no socket level value" is OK. */
+++ assert (sol_map[cnt].sol != -1);
+++
+++ if (len == sol_map[cnt].size)
+++ {
+++ /* The size matches, which is a requirement. If the family
+++ matches, too, we have a winner. Otherwise we remember the
+++ socket level value for this protocol if it is the first
+++ match. */
+++ if (af == sol_map[cnt].af)
+++ /* Bingo! */
+++ return sol_map[cnt].sol;
+++
+++ if (first_size_sol == -1)
+++ first_size_sol = sol_map[cnt].sol;
+++ }
+++ }
+++
+++ return first_size_sol;
+++}
+++
+++
+++int
+++getsourcefilter (int s, uint32_t interface, const struct sockaddr *group,
+++ socklen_t grouplen, uint32_t *fmode, uint32_t *numsrc,
+++ struct sockaddr_storage *slist)
+++{
+++ /* We have to create an struct ip_msfilter object which we can pass
+++ to the kernel. */
+++ socklen_t needed = GROUP_FILTER_SIZE (*numsrc);
+++ struct group_filter *gf;
+++ gf = (struct group_filter *) malloc (needed);
+++ if (gf == NULL)
+++ return -1;
+++
+++ gf->gf_interface = interface;
+++ memcpy (&gf->gf_group, group, grouplen);
+++ gf->gf_numsrc = *numsrc;
+++
+++ /* We need to provide the appropriate socket level value. */
+++ int result;
+++ int sol = __get_sol (group->sa_family, grouplen);
+++ if (sol == -1)
+++ {
+++ errno = EINVAL;
+++ result = -1;
+++ }
+++ else
+++ {
+++ result = getsockopt (s, sol, MCAST_MSFILTER, gf, &needed);
+++
+++ /* If successful, copy the results to the places the caller wants
+++ them in. */
+++ if (result == 0)
+++ {
+++ *fmode = gf->gf_fmode;
+++ memcpy (slist, gf->gf_slist,
+++ MIN (*numsrc, gf->gf_numsrc)
+++ * sizeof (struct sockaddr_storage));
+++ *numsrc = gf->gf_numsrc;
+++ }
+++ }
+++
+++ int save_errno = errno;
+++ free (gf);
+++ errno = save_errno;
+++
+++ return result;
+++}
+++
+++
+++int
+++setsourcefilter (int s, uint32_t interface, const struct sockaddr *group,
+++ socklen_t grouplen, uint32_t fmode, uint32_t numsrc,
+++ const struct sockaddr_storage *slist)
+++{
+++ /* We have to create an struct ip_msfilter object which we can pass
+++ to the kernel. */
+++ size_t needed = GROUP_FILTER_SIZE (numsrc);
+++
+++ struct group_filter *gf;
+++ gf = (struct group_filter *) malloc (needed);
+++ if (gf == NULL)
+++ return -1;
+++
+++ gf->gf_interface = interface;
+++ memcpy (&gf->gf_group, group, grouplen);
+++ gf->gf_fmode = fmode;
+++ gf->gf_numsrc = numsrc;
+++ memcpy (gf->gf_slist, slist, numsrc * sizeof (struct sockaddr_storage));
+++
+++ /* We need to provide the appropriate socket level value. */
+++ int result;
+++ int sol = __get_sol (group->sa_family, grouplen);
+++ if (sol == -1)
+++ {
+++ errno = EINVAL;
+++ result = -1;
+++ }
+++ else
+++ result = setsockopt (s, sol, MCAST_MSFILTER, gf, needed);
+++
+++ int save_errno = errno;
+++ free (gf);
+++ errno = save_errno;
+++
+++ return result;
+++}
+diff --git a/feeds/routing/mcproxy/patches/0004-add-defs.patch b/feeds/routing/mcproxy/patches/0004-add-defs.patch
+new file mode 100644
+index 0000000..a1105c9
+--- /dev/null
++++ b/feeds/routing/mcproxy/patches/0004-add-defs.patch
+@@ -0,0 +1,11 @@
++--- a/mcproxy/src/utils/mc_socket.cpp
+++++ b/mcproxy/src/utils/mc_socket.cpp
++@@ -38,6 +38,8 @@
++ #include <unistd.h>
++
++ #ifndef __GLIBC__
+++#define IP_MULTICAST_ALL 49
+++
++ #include "sourcefilter.cpp"
++ #endif /* __GLIBC__ */
++
+diff --git a/feeds/routing/minimalist-pcproxy/Makefile b/feeds/routing/minimalist-pcproxy/Makefile
+new file mode 100644
+index 0000000..d0c2f06
+--- /dev/null
++++ b/feeds/routing/minimalist-pcproxy/Makefile
+@@ -0,0 +1,57 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=minimalist-pcproxy
++PKG_SOURCE_VERSION:=2d6d1b0b0a3b79a9b4a9b0a7606a84600a967bcb
++PKG_VERSION:=2015-01-12-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/fingon/minimalist-pcproxy.git
++PKG_MAINTAINER:=Markus Stenberg <fingon@iki.fi>
++PKG_LICENSE:=GPL-2.0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++define Package/minimalist-pcproxy
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=Lightweight PCP proxy
++ URL:=https://github.com/fingon/minimalist-pcproxy
++ DEPENDS:=+libubox +@IPV6
++endef
++
++define Package/minimalist-pcproxy/description
++This package contains a daemon which can be used to forward
++PCP (Port Control Protocol - RFC6887) requests requests to PCP remote servers.
++
++In and of itself, it is not very useful, but combined with hnetd+miniupnpd
++it allows for control of NAT forwarding and firewall pinholes from multiple
++hops away.
++endef
++
++define Package/minimalist-pcproxy/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/minimalist-pcproxy $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/uci-defaults
++ $(INSTALL_BIN) ./files/minimalist-pcproxy.defaults $(1)/etc/uci-defaults/x-minimalist-pcproxy.defaults
++endef
++
++define Package/minimalist-pcproxy/postinst
++#!/bin/sh
++[ -n "$${IPKG_INSTROOT}" ] || {
++ (. /etc/uci-defaults/x-minimalist-pcproxy.defaults) && rm -f /etc/uci-defaults/x-minimalist-pcproxy.defaults
++}
++exit 0
++endef
++
++$(eval $(call BuildPackage,minimalist-pcproxy))
+diff --git a/feeds/routing/minimalist-pcproxy/files/minimalist-pcproxy.defaults b/feeds/routing/minimalist-pcproxy/files/minimalist-pcproxy.defaults
+new file mode 100644
+index 0000000..7537f8a
+--- /dev/null
++++ b/feeds/routing/minimalist-pcproxy/files/minimalist-pcproxy.defaults
+@@ -0,0 +1,16 @@
++#!/bin/sh
++
++if [ `uci -q get upnpd.config._pcproxy_configured` = "1" ]
++then
++ exit
++fi
++
++uci batch <<EOF
++set upnpd.config.enable_upnp=0
++set upnpd.config.pcp_allow_thirdparty=1
++set upnpd.config.internal_iface=loopback
++set upnpd.config.ipv6_listening_ip=::1
++set upnpd.config.external_zone=wan
++set upnpd.config._pcproxy_configured=1
++commit upnpd
++EOF
+diff --git a/feeds/routing/miniupnpd/Makefile b/feeds/routing/miniupnpd/Makefile
+new file mode 100644
+index 0000000..de3f006
+--- /dev/null
++++ b/feeds/routing/miniupnpd/Makefile
+@@ -0,0 +1,70 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=miniupnpd
++PKG_VERSION:=1.9.20150922
++PKG_RELEASE:=1
++
++PKG_SOURCE_URL:=http://miniupnp.free.fr/files
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_MD5SUM:=b25f163d2a5e7adf25b15e1935032332
++
++PKG_MAINTAINER:=Markus Stenberg <fingon@iki.fi>
++PKG_LICENSE:=BSD-3-Clause
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/miniupnpd
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+iptables +libip4tc +IPV6:libip6tc +IPV6:ip6tables
++ TITLE:=Lightweight UPnP IGD, NAT-PMP & PCP daemon
++ SUBMENU:=Firewall
++ URL:=http://miniupnp.free.fr/
++endef
++
++define Package/miniupnpd/conffiles
++/etc/config/upnpd
++endef
++
++define Package/miniupnpd/postinst
++#!/bin/sh
++
++if [ -z "$$IPKG_INSTROOT" ]; then
++ ( . /etc/uci-defaults/99-miniupnpd )
++ rm -f /etc/uci-defaults/99-miniupnpd
++fi
++
++exit 0
++endef
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ echo "OpenWrt" | tr \(\)\ _ >$(PKG_BUILD_DIR)/os.openwrt
++endef
++
++MAKE_FLAGS += \
++ TEST=0 \
++ LIBS="" \
++ CC="$(TARGET_CC) -DIPTABLES_143 -lip4tc $(if $(CONFIG_IPV6),-lip6tc)" \
++ CONFIG_OPTIONS="$(if $(CONFIG_IPV6),--ipv6) --leasefile" \
++ -f Makefile.linux \
++ miniupnpd
++
++define Package/miniupnpd/install
++ $(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d $(1)/etc/config $(1)/etc/uci-defaults $(1)/etc/hotplug.d/iface $(1)/usr/share/miniupnpd
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/miniupnpd $(1)/usr/sbin/miniupnpd
++ $(INSTALL_BIN) ./files/miniupnpd.init $(1)/etc/init.d/miniupnpd
++ $(INSTALL_CONF) ./files/upnpd.config $(1)/etc/config/upnpd
++ $(INSTALL_DATA) ./files/miniupnpd.hotplug $(1)/etc/hotplug.d/iface/50-miniupnpd
++ $(INSTALL_DATA) ./files/miniupnpd.defaults $(1)/etc/uci-defaults/99-miniupnpd
++ $(INSTALL_DATA) ./files/firewall.include $(1)/usr/share/miniupnpd/firewall.include
++endef
++
++$(eval $(call BuildPackage,miniupnpd))
+diff --git a/feeds/routing/miniupnpd/files/firewall.include b/feeds/routing/miniupnpd/files/firewall.include
+new file mode 100644
+index 0000000..818af9d
+--- /dev/null
++++ b/feeds/routing/miniupnpd/files/firewall.include
+@@ -0,0 +1,55 @@
++#!/bin/sh
++# miniupnpd integration for firewall3
++
++IP6TABLES=/usr/sbin/ip6tables
++
++iptables -t filter -N MINIUPNPD 2>/dev/null
++iptables -t nat -N MINIUPNPD 2>/dev/null
++
++[ -x $IP6TABLES ] && $IP6TABLES -t filter -N MINIUPNPD 2>/dev/null
++
++. /lib/functions/network.sh
++
++ADDED=0
++
++add_extzone_rules() {
++ local ext_zone=$1
++
++ [ -z "$ext_zone" ] && return
++
++ # IPv4 - due to NAT, need to add both to nat and filter table
++ iptables -t filter -I zone_${ext_zone}_forward -j MINIUPNPD
++ iptables -t nat -I zone_${ext_zone}_prerouting -j MINIUPNPD
++
++ # IPv6 if available - filter only
++ [ -x $IP6TABLES ] && {
++ $IP6TABLES -t filter -I zone_${ext_zone}_forward -j MINIUPNPD
++ }
++ ADDED=$(($ADDED + 1))
++}
++
++# By default, user configuration is king.
++
++for ext_iface in $(uci -q get upnpd.config.external_iface); do
++ add_extzone_rules $(fw3 -q network "$ext_iface")
++done
++
++add_extzone_rules $(uci -q get upnpd.config.external_zone)
++
++[ ! $ADDED = 0 ] && exit 0
++
++
++# If really nothing is available, resort to network_find_wan{,6} and
++# assume external interfaces all have same firewall zone.
++
++# (This heuristic may fail horribly, in case of e.g. multihoming, so
++# please set external_zone in that case!)
++
++network_find_wan wan_iface
++network_find_wan6 wan6_iface
++
++for ext_iface in $wan_iface $wan6_iface; do
++ # fw3 -q network fails on sub-interfaces => map to device first
++ network_get_device ext_device $ext_iface
++ add_extzone_rules $(fw3 -q device "$ext_device")
++done
+diff --git a/feeds/routing/miniupnpd/files/miniupnpd.defaults b/feeds/routing/miniupnpd/files/miniupnpd.defaults
+new file mode 100644
+index 0000000..7271389
+--- /dev/null
++++ b/feeds/routing/miniupnpd/files/miniupnpd.defaults
+@@ -0,0 +1,13 @@
++#!/bin/sh
++
++uci -q batch <<-EOT
++ delete firewall.miniupnpd
++ set firewall.miniupnpd=include
++ set firewall.miniupnpd.type=script
++ set firewall.miniupnpd.path=/usr/share/miniupnpd/firewall.include
++ set firewall.miniupnpd.family=any
++ set firewall.miniupnpd.reload=1
++ commit firewall
++EOT
++
++exit 0
+diff --git a/feeds/routing/miniupnpd/files/miniupnpd.hotplug b/feeds/routing/miniupnpd/files/miniupnpd.hotplug
+new file mode 100644
+index 0000000..65bc500
+--- /dev/null
++++ b/feeds/routing/miniupnpd/files/miniupnpd.hotplug
+@@ -0,0 +1,41 @@
++#!/bin/sh
++
++/etc/init.d/miniupnpd enabled || exit 0
++
++. /lib/functions/service.sh
++
++# If miniupnpd is not running:
++# - check on _any_ event (even updates may contribute to network_find_wan*)
++
++# If miniupnpd _is_ running:
++# - check only on ifup (otherwise lease updates etc would cause
++# miniupnpd state loss)
++
++[ ! "$ACTION" = "ifup" ] && service_check /usr/sbin/miniupnpd && exit 0
++
++local iface
++local ifname
++local tmpconf="/var/etc/miniupnpd.conf"
++local extiface=$(uci get upnpd.config.external_iface)
++local extzone=$(uci get upnpd.config.external_zone)
++
++. /lib/functions/network.sh
++
++for iface in $(uci get upnpd.config.internal_iface); do
++ network_get_device device $iface
++ [ "$DEVICE" = "$device" ] && /etc/init.d/miniupnpd restart && exit 0
++done
++
++
++if [ -z "$extiface" ] ; then
++ # manual external zone (if dynamically find interfaces
++ # belonging to it) overrides network_find_wan*
++ if [ -n "$extzone" ] ; then
++ ifname=$(fw3 -q zone $extzone | head -1)
++ fi
++ [ -n "$extiface" ] || network_find_wan extiface
++ [ -n "$extiface" ] || network_find_wan6 extiface
++fi
++
++[ -n "$ifname" ] || network_get_device ifname ${extiface}
++grep -q "ext_ifname=$ifname" $tmpconf || /etc/init.d/miniupnpd restart
+diff --git a/feeds/routing/miniupnpd/files/miniupnpd.init b/feeds/routing/miniupnpd/files/miniupnpd.init
+new file mode 100644
+index 0000000..79def5d
+--- /dev/null
++++ b/feeds/routing/miniupnpd/files/miniupnpd.init
+@@ -0,0 +1,208 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2014 OpenWrt.org
++
++START=95
++STOP=15
++
++SERVICE_USE_PID=1
++
++upnpd_get_port_range() {
++ local _var="$1"; shift
++ local _val
++
++ config_get _val "$@"
++
++ case "$_val" in
++ [0-9]*[:-][0-9]*)
++ export -n -- "${_var}_start=${_val%%[:-]*}"
++ export -n -- "${_var}_end=${_val##*[:-]}"
++ ;;
++ [0-9]*)
++ export -n -- "${_var}_start=$_val"
++ export -n -- "${_var}_end="
++ ;;
++ esac
++}
++
++conf_rule_add() {
++ local cfg="$1"
++ local tmpconf="$2"
++ local action external_port_start external_port_end int_addr
++ local internal_port_start internal_port_end
++
++ config_get action "$cfg" action "deny" # allow or deny
++ upnpd_get_port_range "ext" "$cfg" ext_ports "0-65535" # external ports: x, x-y, x:y
++ config_get int_addr "$cfg" int_addr "0.0.0.0/0" # ip or network and subnet mask (internal)
++ upnpd_get_port_range "int" "$cfg" int_ports "0-65535" # internal ports: x, x-y, x:y or range
++
++ # Make a single IP IP/32 so that miniupnpd.conf can use it.
++ case "$int_addr" in
++ */*) ;;
++ *) int_addr="$int_addr/32" ;;
++ esac
++
++ echo "${action} ${ext_start}${ext_end:+-}${ext_end} ${int_addr} ${int_start}${int_end:+-}${int_end}" >>$tmpconf
++}
++
++upnpd_write_bool() {
++ local opt="$1"
++ local def="${2:-0}"
++ local alt="$3"
++ local val
++
++ config_get_bool val config "$opt" "$def"
++ if [ "$val" -eq 0 ]; then
++ echo "${alt:-$opt}=no" >> $tmpconf
++ else
++ echo "${alt:-$opt}=yes" >> $tmpconf
++ fi
++}
++
++boot() {
++ return
++}
++
++start() {
++ config_load "upnpd"
++ local extiface intiface upload download logging secure enabled natpmp
++ local extip port usesysuptime conffile serial_number model_number
++ local uuid notify_interval presentation_url enable_upnp
++ local upnp_lease_file clean_ruleset_threshold clean_ruleset_interval
++ local ipv6_listening_ip
++
++ config_get extiface config external_iface
++ config_get extzone config external_zone
++ config_get intiface config internal_iface
++ config_get extip config external_ip
++ config_get port config port 5000
++ config_get upload config upload
++ config_get download config download
++ config_get_bool logging config log_output 0
++ config_get conffile config config_file
++ config_get serial_number config serial_number
++ config_get model_number config model_number
++ config_get uuid config uuid
++ config_get notify_interval config notify_interval
++ config_get presentation_url config presentation_url
++ config_get upnp_lease_file config upnp_lease_file
++ config_get clean_ruleset_threshold config clean_ruleset_threshold
++ config_get clean_ruleset_interval config clean_ruleset_interval
++ config_get ipv6_listening_ip config ipv6_listening_ip
++
++ local args
++
++ . /lib/functions/network.sh
++
++ local ifname
++
++ # manual external interface overrides everything
++ if [ -z "$extiface" ] ; then
++ # manual external zone (if dynamically find interfaces
++ # belonging to it) overrides network_find_wan*
++ if [ -n "$extzone" ] ; then
++ ifname=$(fw3 -q zone $extzone | head -1)
++ fi
++ [ -n "$extiface" ] || network_find_wan extiface
++ [ -n "$extiface" ] || network_find_wan6 extiface
++ fi
++
++ [ -n "$ifname" ] || network_get_device ifname ${extiface}
++
++ if [ -n "$conffile" ]; then
++ args="-f $conffile"
++ else
++ local tmpconf="/var/etc/miniupnpd.conf"
++ args="-f $tmpconf"
++ mkdir -p /var/etc
++
++ echo "ext_ifname=$ifname" >$tmpconf
++
++ [ -n "$extip" ] && \
++ echo "ext_ip=$extip" >>$tmpconf
++
++ local iface
++ for iface in ${intiface:-lan}; do
++ local device
++ network_get_device device "$iface" && {
++ echo "listening_ip=$device" >>$tmpconf
++ }
++ done
++
++ [ "$port" != "auto" ] && \
++ echo "port=$port" >>$tmpconf
++
++ config_load "upnpd"
++ upnpd_write_bool enable_natpmp 1
++ upnpd_write_bool enable_upnp 1
++ upnpd_write_bool secure_mode 1
++ upnpd_write_bool pcp_allow_thirdparty 0
++ upnpd_write_bool system_uptime 1
++
++ [ -n "$upnp_lease_file" ] && \
++ echo "lease_file=$upnp_lease_file" >>$tmpconf
++
++ [ -n "$upload" -a -n "$download" ] && {
++ echo "bitrate_down=$(($download * 1024 * 8))" >>$tmpconf
++ echo "bitrate_up=$(($upload * 1024 * 8))" >>$tmpconf
++ }
++
++ [ -n "${presentation_url}" ] && \
++ echo "presentation_url=${presentation_url}" >>$tmpconf
++
++ [ -n "${notify_interval}" ] && \
++ echo "notify_interval=${notify_interval}" >>$tmpconf
++
++ [ -n "${clean_ruleset_threshold}" ] && \
++ echo "clean_ruleset_threshold=${clean_ruleset_threshold}" >>$tmpconf
++
++ [ -n "${clean_ruleset_interval}" ] && \
++ echo "clean_ruleset_interval=${clean_ruleset_interval}" >>$tmpconf
++
++ [ -n "${ipv6_listening_ip}" ] && \
++ echo "ipv6_listening_ip=${ipv6_listening_ip}" >>$tmpconf
++
++ [ -z "$uuid" ] && {
++ uuid="$(cat /proc/sys/kernel/random/uuid)"
++ uci set upnpd.config.uuid=$uuid
++ uci commit upnpd
++ }
++
++ [ "$uuid" = "nocli" ] || \
++ echo "uuid=$uuid" >>$tmpconf
++
++ [ -n "${serial_number}" ] && \
++ echo "serial=${serial_number}" >>$tmpconf
++
++ [ -n "${model_number}" ] && \
++ echo "model_number=${model_number}" >>$tmpconf
++
++ config_foreach conf_rule_add perm_rule "$tmpconf"
++ fi
++
++
++ if [ -n "$ifname" ]; then
++ # start firewall
++ iptables -L MINIUPNPD >/dev/null 2>/dev/null || fw3 reload
++
++ if [ "$logging" = "1" ]; then
++ SERVICE_DAEMONIZE=1 \
++ service_start /usr/sbin/miniupnpd $args -d
++ else
++ SERVICE_DAEMONIZE= \
++ service_start /usr/sbin/miniupnpd $args
++ fi
++ else
++ logger -t "upnp daemon" "external interface not found, not starting"
++ fi
++}
++
++stop() {
++ service_stop /usr/sbin/miniupnpd
++
++ iptables -t nat -F MINIUPNPD 2>/dev/null
++ iptables -t filter -F MINIUPNPD 2>/dev/null
++
++ [ -x /usr/sbin/ip6tables ] && {
++ ip6tables -t filter -F MINIUPNPD 2>/dev/null
++ }
++}
+diff --git a/feeds/routing/miniupnpd/files/upnpd.config b/feeds/routing/miniupnpd/files/upnpd.config
+new file mode 100644
+index 0000000..56cde57
+--- /dev/null
++++ b/feeds/routing/miniupnpd/files/upnpd.config
+@@ -0,0 +1,26 @@
++config upnpd config
++ option enable_natpmp 1
++ option enable_upnp 1
++ option secure_mode 1
++ option log_output 0
++ option download 1024
++ option upload 512
++ #by default, looked up dynamically from ubus
++ #option external_iface wan
++ option internal_iface lan
++ option port 5000
++ option upnp_lease_file /var/upnp.leases
++
++config perm_rule
++ option action allow
++ option ext_ports 1024-65535
++ option int_addr 0.0.0.0/0 # Does not override secure_mode
++ option int_ports 1024-65535
++ option comment "Allow high ports"
++
++config perm_rule
++ option action deny
++ option ext_ports 0-65535
++ option int_addr 0.0.0.0/0
++ option int_ports 0-65535
++ option comment "Default deny"
+diff --git a/feeds/routing/miniupnpd/patches/100-no-ssl.patch b/feeds/routing/miniupnpd/patches/100-no-ssl.patch
+new file mode 100644
+index 0000000..343e615
+--- /dev/null
++++ b/feeds/routing/miniupnpd/patches/100-no-ssl.patch
+@@ -0,0 +1,12 @@
++--- a/Makefile.linux
+++++ b/Makefile.linux
++@@ -147,7 +147,8 @@ LDLIBS += $(shell $(PKG_CONFIG) --static
++ LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l libnetfilter_conntrack)
++ endif # ($(TEST),1)
++
++-LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l libssl)
+++# n/a - we don't enable https server for IGD v2 anyway
+++#LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l libssl)
++
++ TESTUPNPDESCGENOBJS = testupnpdescgen.o upnpdescgen.o
++
+diff --git a/feeds/routing/miniupnpd/patches/102-ipv6-ext-port.patch b/feeds/routing/miniupnpd/patches/102-ipv6-ext-port.patch
+new file mode 100644
+index 0000000..fdb2af4
+--- /dev/null
++++ b/feeds/routing/miniupnpd/patches/102-ipv6-ext-port.patch
+@@ -0,0 +1,10 @@
++--- a/pcpserver.c
+++++ b/pcpserver.c
++@@ -1004,6 +1004,7 @@ static int CreatePCPMap_NAT(pcp_info_t *
++ timestamp);
++ if (r < 0)
++ return PCP_ERR_NO_RESOURCES;
+++ pcp_msg_info->ext_port = pcp_msg_info->int_port;
++ return PCP_SUCCESS;
++ }
++
+diff --git a/feeds/routing/miniupnpd/patches/103-no-ipv6-autodetection.patch b/feeds/routing/miniupnpd/patches/103-no-ipv6-autodetection.patch
+new file mode 100644
+index 0000000..61c023a
+--- /dev/null
++++ b/feeds/routing/miniupnpd/patches/103-no-ipv6-autodetection.patch
+@@ -0,0 +1,27 @@
++The miniupnpd makefile tries to autodetect iptables capabilities.
++This will incorrectly detect capabilities such as ipv6 support even though it is disabled for the target build.
++
++As the OpenWRT buildsystem already passes the right compile flags, we can skip the autodetection.
++
++
++--- a/netfilter/Makefile
+++++ b/netfilter/Makefile
++@@ -38,8 +38,6 @@ endif
++ endif
++ endif
++
++-LIBS += /lib/libip4tc.so /lib/libip6tc.so
++-
++ all: iptcrdr.o testiptcrdr iptpinhole.o \
++ testiptcrdr_peer testiptcrdr_dscp test_nfct_get
++ # testiptpinhole
++--- a/Makefile.linux
+++++ b/Makefile.linux
++@@ -70,7 +70,6 @@ CPPFLAGS += -DIPTABLES_143
++ endif
++
++ CFLAGS += $(shell $(PKG_CONFIG) --cflags libiptc)
++-LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l libiptc)
++ LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-L libiptc)
++ LDFLAGS += $(shell $(PKG_CONFIG) --libs-only-other libiptc)
++ else
+diff --git a/feeds/routing/mrd6/Makefile b/feeds/routing/mrd6/Makefile
+new file mode 100644
+index 0000000..a20ea26
+--- /dev/null
++++ b/feeds/routing/mrd6/Makefile
+@@ -0,0 +1,80 @@
++#
++# Copyright (C) 2006-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=mrd6
++PKG_SOURCE_VERSION:=c805eb33255dbc0b6647d463c6c67d1c9d3105a0
++PKG_VERSION:=2013-11-30-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/hugosantos/mrd6.git
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=GPL-2.0+
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++PKG_BUILD_PARALLEL:=1
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/mrd6
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=IPv6 multicast routing daemon
++ URL:=http://fivebits.net/proj/mrd6
++ DEPENDS:=@IPV6 +libstdcpp
++endef
++
++define Package/mrd6/description
++ Multicast is becoming a major component in next generation networks, used
++ in several scenarios, from video broadcasting to multimedia conferencing.
++ In order to be implemented, new technology needs supporting hardware and
++ software across a set of devices and systems. MRD6 is an implementation of
++ a modular IPv6 Multicast Routing Framework for the Linux operating system
++ and provides MLDv2 (as well as MLDv1), PIM-SM and MBGP support.
++endef
++
++MRD6_MAKEFLAGS:= \
++ $(TARGET_CONFIGURE_OPTS) \
++ OPTIMIZE=yes \
++ SPACE_OPTIMIZE=yes \
++ FULL_STATIC=no \
++ CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS) -DNO_INET6_OPTION -fno-builtin -fno-rtti" \
++ LDFLAGS="$(TARGET_LDFLAGS) -ldl -lm" \
++ MODULE_CXX="\$$$$(CC) -shared \$$$$(CXXFLAGS) \$$$$(LDFLAGS)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ PREFIX="/usr"
++
++define Build/Compile
++ +$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)/src $(MRD6_MAKEFLAGS) all
++endef
++
++define Build/Install
++ $(MAKE) -C $(PKG_BUILD_DIR)/src $(MRD6_MAKEFLAGS) install
++endef
++
++define Package/mrd6/conffiles
++/etc/mrd6.conf
++endef
++
++define Package/mrd6/install
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_CONF) ./files/mrd6.conf $(1)/etc
++ $(INSTALL_BIN) ./files/mrd6.init $(1)/etc/init.d/mrd6
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/mrd $(1)/usr/sbin/mrd6
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mrd6sh $(1)/usr/bin/mrd6sh
++ $(INSTALL_DIR) $(1)/usr/lib/mrd6
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/mrd6/bgp.so $(1)/usr/lib/mrd6/bgp.so
++endef
++
++$(eval $(call BuildPackage,mrd6))
+diff --git a/feeds/routing/mrd6/files/mrd6.conf b/feeds/routing/mrd6/files/mrd6.conf
+new file mode 100644
+index 0000000..e3ad78a
+--- /dev/null
++++ b/feeds/routing/mrd6/files/mrd6.conf
+@@ -0,0 +1,14 @@
++log {
++ attach stderr normal;
++ attach default "/var/log/mrd6.log" message_err;
++}
++
++//interfaces disable br-lan; // Should be vlan0 + eth1 but Linux bridge seems broken for multicast
++//interfaces disable eth0; // Interface to internal bridge
++//handle-proper-bridge = true; // use ETH_P_ALL to see all packets on wrt54g
++
++// The default configured RP is m6bone's Renater RP.
++// Change this according to your setup
++
++groups ff00::/8 pim rp = 2001:660:3007:300:1::;
++
+diff --git a/feeds/routing/mrd6/files/mrd6.init b/feeds/routing/mrd6/files/mrd6.init
+new file mode 100644
+index 0000000..2481840
+--- /dev/null
++++ b/feeds/routing/mrd6/files/mrd6.init
+@@ -0,0 +1,13 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2011 OpenWrt.org
++
++START=50
++
++start() {
++ service_start /usr/sbin/mrd6 -f /etc/mrd6.conf -D
++}
++
++stop() {
++ service_stop /usr/sbin/mrd6
++}
++
+diff --git a/feeds/routing/mrd6/patches/002-missing_netlink_defs.patch b/feeds/routing/mrd6/patches/002-missing_netlink_defs.patch
+new file mode 100644
+index 0000000..28ab711
+--- /dev/null
++++ b/feeds/routing/mrd6/patches/002-missing_netlink_defs.patch
+@@ -0,0 +1,58 @@
++Index: mrd6-0.9.5/include/mrdpriv/linux/netlink_missing_defs.h
++===================================================================
++--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++++ mrd6-0.9.5/include/mrdpriv/linux/netlink_missing_defs.h 2007-09-21 13:19:06.000000000 +0200
++@@ -0,0 +1,41 @@
+++#include <linux/version.h>
+++
+++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
+++
+++#include <linux/if_link.h>
+++#include <linux/if_addr.h>
+++#include <linux/neighbour.h>
+++
+++#ifndef IFA_RTA
+++#define IFA_RTA(r) \
+++ ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
+++#endif
+++#ifndef IFA_PAYLOAD
+++#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifaddrmsg))
+++#endif
+++
+++#ifndef IFLA_RTA
+++#define IFLA_RTA(r) \
+++ ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
+++#endif
+++#ifndef IFLA_PAYLOAD
+++#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
+++#endif
+++
+++#ifndef NDA_RTA
+++#define NDA_RTA(r) \
+++ ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg))))
+++#endif
+++#ifndef NDA_PAYLOAD
+++#define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg))
+++#endif
+++
+++#ifndef NDTA_RTA
+++#define NDTA_RTA(r) \
+++ ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndtmsg))))
+++#endif
+++#ifndef NDTA_PAYLOAD
+++#define NDTA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndtmsg))
+++#endif
+++
+++#endif
++Index: mrd6-0.9.5/src/linux/linux_unicast_route.cpp
++===================================================================
++--- mrd6-0.9.5.orig/src/linux/linux_unicast_route.cpp 2007-09-21 13:19:05.000000000 +0200
+++++ mrd6-0.9.5/src/linux/linux_unicast_route.cpp 2007-09-21 13:19:06.000000000 +0200
++@@ -23,6 +23,7 @@
++ */
++
++ #include <mrdpriv/linux/unicast_route.h>
+++#include <mrdpriv/linux/netlink_missing_defs.h>
++
++ #include <mrd/mrd.h>
++ #include <mrd/interface.h>
+diff --git a/feeds/routing/mrd6/patches/101-Accept-default-routes-without-RTA_DST.patch b/feeds/routing/mrd6/patches/101-Accept-default-routes-without-RTA_DST.patch
+new file mode 100644
+index 0000000..660e707
+--- /dev/null
++++ b/feeds/routing/mrd6/patches/101-Accept-default-routes-without-RTA_DST.patch
+@@ -0,0 +1,34 @@
++From b70c7d519ddd178b76d89bca7d3fe1fd186af862 Mon Sep 17 00:00:00 2001
++From: Oryon <pierre@darou.fr>
++Date: Tue, 11 Mar 2014 12:12:07 +0100
++Subject: [PATCH 1/2] Accept default routes without RTA_DST
++
++---
++ src/linux/linux_unicast_route.cpp | 4 ++--
++ 1 file changed, 2 insertions(+), 2 deletions(-)
++
++diff --git a/src/linux/linux_unicast_route.cpp b/src/linux/linux_unicast_route.cpp
++index 331a7a0..7919cc2 100644
++--- a/src/linux/linux_unicast_route.cpp
+++++ b/src/linux/linux_unicast_route.cpp
++@@ -334,7 +334,7 @@ void linux_unicast_router::handle_route_event(bool isnew, nlmsghdr *hdr) {
++ netlink_msg::parse_rtatable(tb, RTA_MAX, RTM_RTA(NLMSG_DATA(hdr)),
++ hdr->nlmsg_len - NLMSG_LENGTH(sizeof(rtmsg)));
++
++- if (tb[RTA_DST]) {
+++ //if (tb[RTA_DST]) { /* Accept default routes */
++ lookup_result res;
++
++ parse_prefix_rec(tb, msg->r.rtm_dst_len,
++@@ -360,7 +360,7 @@ void linux_unicast_router::handle_route_event(bool isnew, nlmsghdr *hdr) {
++ }
++
++ prefix_changed(isnew, res);
++- }
+++ //}
++ }
++
++ void linux_unicast_router::handle_intf_event(bool isnew, nlmsghdr *hdr) {
++--
++1.9.0
++
+diff --git a/feeds/routing/mrd6/patches/102-Metric-should-be-more-important-than-distance.patch b/feeds/routing/mrd6/patches/102-Metric-should-be-more-important-than-distance.patch
+new file mode 100644
+index 0000000..359f671
+--- /dev/null
++++ b/feeds/routing/mrd6/patches/102-Metric-should-be-more-important-than-distance.patch
+@@ -0,0 +1,38 @@
++From 46093914a5f95f50c9aef088b7172d6774d204cb Mon Sep 17 00:00:00 2001
++From: Oryon <pierre@darou.fr>
++Date: Tue, 11 Mar 2014 16:03:58 +0100
++Subject: [PATCH 2/2] Metric should be more important than distance at lookup
++
++---
++ src/mrib.cpp | 10 +++++-----
++ 1 file changed, 5 insertions(+), 5 deletions(-)
++
++diff --git a/src/mrib.cpp b/src/mrib.cpp
++index e51fed7..707d601 100644
++--- a/src/mrib.cpp
+++++ b/src/mrib.cpp
++@@ -327,16 +327,16 @@ mrib_def::mrib_node *mrib_def::prefix_lookup_y(const inet6_addr &source) const {
++ void mrib_def::insert_prefix_in_node(mrib_node *n, prefix *p) {
++ prefix *curr = n->head, *prev = 0;
++
++- /* first check the proper place based on distance */
++- while (curr && curr->distance < p->distance) {
+++ /* first check the proper place based on metric */
+++ while (curr && curr->metric < p->metric) {
++ prev = curr;
++ curr = curr->next;
++ }
++
++- if (prev && prev->distance == p->distance) {
++- /* if distance matches, take metric into place */
+++ if (prev && prev->metric == p->metric) {
+++ /* if metric matches, take distance into place */
++ curr = prev;
++- while (curr && curr->metric <= p->metric) {
+++ while (curr && curr->distance <= p->distance) {
++ prev = curr;
++ curr = curr->next;
++ }
++--
++1.9.0
++
+diff --git a/feeds/routing/nat46/Makefile b/feeds/routing/nat46/Makefile
+new file mode 100644
+index 0000000..65b92c2
+--- /dev/null
++++ b/feeds/routing/nat46/Makefile
+@@ -0,0 +1,79 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=nat46
++PKG_VERSION:=6
++PKG_RELEASE:=$(PKG_SOURCE_VERSION)
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_URL:=https://github.com/ayourtch/nat46.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=8ff2ae59ec9840a7b8b45f976c51cae80abe0226
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=GPL-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/map-t
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+map +kmod-nat46
++ TITLE:=MAP-T configuration support
++endef
++
++define Package/464xlat
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+kmod-nat46
++ TITLE:=464xlat CLAT support
++endef
++
++define KernelPackage/nat46
++ DEPENDS:=+kmod-ipv6
++ TITLE:=Stateless NAT46 translation kernel module
++ SECTION:=kernel
++ SUBMENU:=Network Support
++ FILES:=$(PKG_BUILD_DIR)/nat46/modules/nat46.ko
++ AUTOLOAD:=$(call AutoLoad,33,nat46)
++endef
++
++include $(INCLUDE_DIR)/kernel-defaults.mk
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ $(CP) ./src/* $(PKG_BUILD_DIR)/
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ CC="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS) -Wall" \
++ LDFLAGS="$(TARGET_LDFLAGS)"
++ $(MAKE) $(KERNEL_MAKEOPTS) SUBDIRS="$(PKG_BUILD_DIR)/nat46/modules" \
++ MODFLAGS="-DMODULE -mlong-calls" \
++ EXTRA_CFLAGS="-DNAT46_VERSION=\\\"$(PKG_SOURCE_VERSION)\\\"" \
++ modules
++endef
++
++define Package/map-t/install
++ true
++endef
++
++define Package/464xlat/install
++ $(INSTALL_DIR) $(1)/lib/netifd/proto
++ $(INSTALL_BIN) ./files/464xlat.sh $(1)/lib/netifd/proto/464xlat.sh
++ $(INSTALL_DIR) $(1)/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/464xlatcfg $(1)/sbin
++endef
++
++$(eval $(call KernelPackage,nat46))
++$(eval $(call BuildPackage,map-t))
++$(eval $(call BuildPackage,464xlat))
+diff --git a/feeds/routing/nat46/files/464xlat.sh b/feeds/routing/nat46/files/464xlat.sh
+new file mode 100755
+index 0000000..2ec1094
+--- /dev/null
++++ b/feeds/routing/nat46/files/464xlat.sh
+@@ -0,0 +1,92 @@
++#!/bin/sh
++# 464xlat.sh - 464xlat CLAT
++#
++# Copyright (c) 2015 Steven Barth <cyrus@openwrt.org>
++#
++# This program is free software; you can redistribute it and/or modify
++# it under the terms of the GNU General Public License version 2
++# as published by the Free Software Foundation
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++
++[ -n "$INCLUDE_ONLY" ] || {
++ . /lib/functions.sh
++ . /lib/functions/network.sh
++ . ../netifd-proto.sh
++ init_proto "$@"
++}
++
++proto_464xlat_setup() {
++ local cfg="$1"
++ local iface="$2"
++ local link="464-$cfg"
++
++ local ip6addr ip6prefix tunlink zone
++ json_get_vars ip6addr ip6prefix tunlink zone
++
++ [ -z "$zone" ] && zone="wan"
++
++ ( proto_add_host_dependency "$cfg" "::" "$tunlink" )
++
++ if [ -z "$tunlink" ] && ! network_find_wan6 tunlink; then
++ proto_notify_error "$cfg" "NO_WAN_LINK"
++ return
++ fi
++ network_get_device tundev "$tunlink"
++
++ ip6addr=$(464xlatcfg "$link" "$tundev" "$ip6prefix" 192.0.0.1 $ip6addr)
++ if [ -z "$ip6addr" ]; then
++ proto_notify_error "$cfg" "CLAT_CONFIG_FAILED"
++ return
++ fi
++
++ proto_init_update "$link" 1
++ proto_add_ipv4_route "0.0.0.0" 0 "" "" 2048
++ proto_add_ipv6_route $ip6addr 128 "" "" "" "" 128
++
++ proto_add_data
++ [ "$zone" != "-" ] && json_add_string zone "$zone"
++
++ json_add_array firewall
++ json_add_object ""
++ json_add_string type nat
++ json_add_string target SNAT
++ json_add_string family inet
++ json_add_string snat_ip 192.0.0.1
++ json_close_object
++ json_add_object ""
++ json_add_string type rule
++ json_add_string family inet6
++ json_add_string proto all
++ json_add_string direction in
++ json_add_string dest "$zone"
++ json_add_string src "$zone"
++ json_add_string src_ip $ip6addr
++ json_add_string target ACCEPT
++ json_close_object
++ json_close_array
++ proto_close_data
++
++ proto_send_update "$cfg"
++}
++
++proto_464xlat_teardown() {
++ 464xlatcfg "464-$1"
++}
++
++proto_464xlat_init_config() {
++ no_device=1
++ available=1
++
++ proto_config_add_string "ip6prefix"
++ proto_config_add_string "ip6addr"
++ proto_config_add_string "tunlink"
++ proto_config_add_string "zone"
++}
++
++[ -n "$INCLUDE_ONLY" ] || {
++ add_protocol 464xlat
++}
+diff --git a/feeds/routing/nat46/src/464xlatcfg.c b/feeds/routing/nat46/src/464xlatcfg.c
+new file mode 100644
+index 0000000..f184616
+--- /dev/null
++++ b/feeds/routing/nat46/src/464xlatcfg.c
+@@ -0,0 +1,148 @@
++/* 464xlatcfg.c
++ *
++ * Copyright (c) 2015 Steven Barth <cyrus@openwrt.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2
++ * as published by the Free Software Foundation
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ */
++
++#include <netinet/icmp6.h>
++#include <netinet/in.h>
++#include <sys/socket.h>
++#include <arpa/inet.h>
++#include <net/if.h>
++#include <unistd.h>
++#include <stdlib.h>
++#include <signal.h>
++#include <stdio.h>
++#include <netdb.h>
++
++static void sighandler(__attribute__((unused)) int signal)
++{
++}
++
++int main(int argc, const char *argv[])
++{
++ char buf[INET6_ADDRSTRLEN], prefix[INET6_ADDRSTRLEN + 4];
++ int pid;
++
++ if (argc <= 1) {
++ fprintf(stderr, "Usage: %s <name> [ifname] [ipv6prefix] [ipv4addr] [ipv6addr]\n", argv[0]);
++ return 1;
++ }
++
++ snprintf(buf, sizeof(buf), "/var/run/%s.pid", argv[1]);
++ FILE *fp = fopen(buf, "r");
++ if (fp) {
++ fscanf(fp, "%d", &pid);
++ kill(pid, SIGTERM);
++ unlink(buf);
++ fclose(fp);
++ }
++
++ if (!argv[2])
++ return 0;
++
++ if (!argv[3] || !argv[4] || !(fp = fopen(buf, "wx")))
++ return 1;
++
++ signal(SIGTERM, sighandler);
++
++ prefix[sizeof(prefix) - 1] = 0;
++ strncpy(prefix, argv[3], sizeof(prefix) - 1);
++
++ if (!prefix[0]) {
++ struct addrinfo hints = { .ai_family = AF_INET6 }, *res;
++ if (getaddrinfo("ipv4only.arpa", NULL, &hints, &res) || !res) {
++ sleep(3);
++ if (getaddrinfo("ipv4only.arpa", NULL, &hints, &res) || !res)
++ return 2;
++ }
++
++ struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)res->ai_addr;
++ inet_ntop(AF_INET6, &sin6->sin6_addr, prefix, sizeof(prefix) - 4);
++ strcat(prefix, "/96");
++ freeaddrinfo(res);
++ }
++
++ int i = 0;
++ int sock;
++ struct sockaddr_in6 saddr;
++
++ do {
++ socklen_t saddrlen = sizeof(saddr);
++ struct icmp6_filter filt;
++
++ sock = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
++ ICMP6_FILTER_SETBLOCKALL(&filt);
++ setsockopt(sock, IPPROTO_ICMPV6, ICMP6_FILTER, &filt, sizeof(filt));
++ setsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, argv[2], strlen(argv[2]));
++ memset(&saddr, 0, sizeof(saddr));
++ saddr.sin6_family = AF_INET6;
++ saddr.sin6_addr.s6_addr32[0] = htonl(0x2001);
++ saddr.sin6_addr.s6_addr32[1] = htonl(0xdb8);
++ if (connect(sock, (struct sockaddr*)&saddr, sizeof(saddr)) ||
++ getsockname(sock, (struct sockaddr*)&saddr, &saddrlen))
++ return 3;
++
++ if (!IN6_IS_ADDR_LINKLOCAL(&saddr.sin6_addr) || argv[5])
++ break;
++
++ close(sock);
++ sleep(3);
++ i++;
++ } while (i < 3);
++
++ struct ipv6_mreq mreq = {saddr.sin6_addr, if_nametoindex(argv[2])};
++ if (!argv[5]) {
++ if (IN6_IS_ADDR_LINKLOCAL(&mreq.ipv6mr_multiaddr))
++ return 5;
++
++ srandom(mreq.ipv6mr_multiaddr.s6_addr32[0] ^ mreq.ipv6mr_multiaddr.s6_addr32[1] ^
++ mreq.ipv6mr_multiaddr.s6_addr32[2] ^ mreq.ipv6mr_multiaddr.s6_addr32[3]);
++ mreq.ipv6mr_multiaddr.s6_addr32[2] = random();
++ mreq.ipv6mr_multiaddr.s6_addr32[3] = random();
++ } else if (inet_pton(AF_INET6, argv[5], &mreq.ipv6mr_multiaddr) != 1) {
++ return 1;
++ }
++
++ if (setsockopt(sock, SOL_IPV6, IPV6_JOIN_ANYCAST, &mreq, sizeof(mreq)))
++ return 3;
++
++ inet_ntop(AF_INET6, &mreq.ipv6mr_multiaddr, buf, sizeof(buf));
++ fputs(buf, stdout);
++ fputc('\n', stdout);
++ fflush(stdout);
++
++ FILE *nat46 = fopen("/proc/net/nat46/control", "w");
++ if (!nat46 || fprintf(nat46, "add %s\nconfig %s local.style NONE local.v4 %s/32 local.v6 %s/128 "
++ "remote.style RFC6052 remote.v6 %s\n", argv[1], argv[1], argv[4], buf, prefix) < 0 ||
++ fclose(nat46))
++ return 4;
++
++ if (!(pid = fork())) {
++ fclose(fp);
++ fclose(stdin);
++ fclose(stdout);
++ fclose(stderr);
++ chdir("/");
++ setsid();
++ pause();
++
++ nat46 = fopen("/proc/net/nat46/control", "w");
++ if (nat46) {
++ fprintf(nat46, "del %s\n", argv[1]);
++ fclose(nat46);
++ }
++ } else {
++ fprintf(fp, "%d\n", pid);
++ }
++
++ return 0;
++}
+diff --git a/feeds/routing/nat46/src/Makefile b/feeds/routing/nat46/src/Makefile
+new file mode 100644
+index 0000000..3950a6b
+--- /dev/null
++++ b/feeds/routing/nat46/src/Makefile
+@@ -0,0 +1,8 @@
++all: 464xlatcfg
++
++464xlatcfg: 464xlatcfg.c
++ $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $<
++
++clean:
++ rm -f 464xlatcfg
++
+diff --git a/feeds/routing/ndppd/Makefile b/feeds/routing/ndppd/Makefile
+new file mode 100644
+index 0000000..ebc764c
+--- /dev/null
++++ b/feeds/routing/ndppd/Makefile
+@@ -0,0 +1,70 @@
++#
++# Copyright (C) 2007-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ndppd
++PKG_VERSION:=0.2.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++
++# Latest release
++PKG_SOURCE_URL:=http://www.priv.nu/projects/ndppd/files/
++PKG_MD5SUM:=d6f3243bb7fc04c8085371c9acddc50e
++PKG_LICENSE:=GPL-3.0+
++
++# Development snapshot
++#PKG_SOURCE_URL=git://github.com/Tuhox/ndppd.git
++#PKG_SOURCE_VERSION=master
++#PKG_SOURCE_SUBDIR=$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/ndppd
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=NDP Proxy Daemon
++ URL:=http://www.priv.nu/projects/ndppd/
++ MAINTAINER:=Gabriel Kerneis <gabriel@kerneis.info>
++ DEPENDS:=+kmod-ipv6 $(CXX_DEPENDS)
++endef
++
++define Package/ndppd/description
++ ndppd, or NDP Proxy Daemon, is a daemon that proxies NDP (Neighbor Discovery
++ Protocol) messages between interfaces. ndppd currently only supports Neighbor
++ Solicitation Messages and Neighbor Advertisement Messages.
++
++ The ndp_proxy provided by Linux doesn't support listing proxies, and only hosts
++ are supported. No subnets. ndppd solves this by listening for Neighbor
++ Solicitation messages on an interface, then query the internal interfaces for
++ that target IP before finally sending a Neighbor Advertisement message.
++endef
++
++define Package/ndppd/conffiles
++/etc/ndppd.conf
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ CXX="$(TARGET_CXX)" \
++ CXXFLAGS="$(TARGET_CXXFLAGS) -std=c++0x -fno-rtti" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ LIBS="-lc" \
++ ndppd
++endef
++
++define Package/ndppd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ndppd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/ndppd.init $(1)/etc/init.d/ndppd
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/ndppd.conf-dist $(1)/etc/ndppd.conf
++endef
++
++$(eval $(call BuildPackage,ndppd))
+diff --git a/feeds/routing/ndppd/files/ndppd.init b/feeds/routing/ndppd/files/ndppd.init
+new file mode 100644
+index 0000000..4cf0e8a
+--- /dev/null
++++ b/feeds/routing/ndppd/files/ndppd.init
+@@ -0,0 +1,16 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2007-2011 OpenWrt.org
++
++START=90
++
++SERVICE_USE_PID=1
++SERVICE_PID_FILE=/var/run/ndppd.pid
++
++start() {
++ mkdir -p /var/run
++ service_start /usr/sbin/ndppd -p $SERVICE_PID_FILE -d
++}
++
++stop() {
++ service_stop /usr/sbin/ndppd
++}
+diff --git a/feeds/routing/ndppd/patches/0001-Fix-issue-2-ndppd-d-monizes-too-early.patch b/feeds/routing/ndppd/patches/0001-Fix-issue-2-ndppd-d-monizes-too-early.patch
+new file mode 100644
+index 0000000..dad23f5
+--- /dev/null
++++ b/feeds/routing/ndppd/patches/0001-Fix-issue-2-ndppd-d-monizes-too-early.patch
+@@ -0,0 +1,53 @@
++From 00da8bf7bab88a3827af4110fb27df9cde542e32 Mon Sep 17 00:00:00 2001
++From: Daniel Adolfsson <daniel@priv.nu>
++Date: Tue, 12 Feb 2013 13:25:22 +0100
++Subject: [PATCH] =?UTF-8?q?Fix=20issue=20#2=20-=20ndppd=20d=C3=A6monizes=20t?=
++ =?UTF-8?q?oo=20early?=
++MIME-Version: 1.0
++Content-Type: text/plain; charset=UTF-8
++Content-Transfer-Encoding: 8bit
++
++---
++ src/ndppd.cc | 18 ++++++++----------
++ 1 file changed, 8 insertions(+), 10 deletions(-)
++
++diff --git a/src/ndppd.cc b/src/ndppd.cc
++index 6ac19e8..20ced6f 100644
++--- a/src/ndppd.cc
+++++ b/src/ndppd.cc
++@@ -201,15 +201,6 @@ int main(int argc, char* argv[], char* env[])
++ }
++ }
++
++- if (daemon) {
++- logger::syslog(true);
++-
++- if (daemonize() < 0) {
++- logger::error() << "Failed to daemonize process";
++- return 1;
++- }
++- }
++-
++ if (!pidfile.empty()) {
++ std::ofstream pf;
++ pf.open(pidfile.c_str(), std::ios::out | std::ios::trunc);
++@@ -225,8 +216,15 @@ int main(int argc, char* argv[], char* env[])
++
++ if (!configure(config_path))
++ return -1;
+++
+++ if (daemon) {
+++ logger::syslog(true);
++
++- //route::load("/proc/net/ipv6_route");
+++ if (daemonize() < 0) {
+++ logger::error() << "Failed to daemonize process";
+++ return 1;
+++ }
+++ }
++
++ // Time stuff.
++
++--
++1.7.10.4
++
+diff --git a/feeds/routing/nodogsplash/Makefile b/feeds/routing/nodogsplash/Makefile
+new file mode 100644
+index 0000000..11fa5fc
+--- /dev/null
++++ b/feeds/routing/nodogsplash/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=nodogsplash
++PKG_FIXUP:=autoreconf
++PKG_VERSION:=0.9_beta9.9.9
++PKG_RELEASE:=6
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=git://github.com/nodogsplash/nodogsplash.git
++PKG_SOURCE_VERSION:=v0.9_beta9.9.9
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_BUILD_PARALLEL:=1
++PKG_LICENSE:=GPL-2.0+
++
++include $(INCLUDE_DIR)/package.mk
++
++
++define Package/nodogsplash
++ SUBMENU:=Captive Portals
++ SECTION:=net
++ CATEGORY:=Network
++ DEPENDS:=+libpthread +iptables-mod-ipopt
++ TITLE:=Open public network gateway daemon
++ URL:=https://github.com/nodogsplash/nodogsplash
++endef
++
++define Package/nodogsplash/description
++ Nodogsplash offers a simple way to open a free hotspot providing
++ restricted access to an internet connection.
++endef
++
++define Package/nodogsplash/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/nodogsplash $(1)/usr/bin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ndsctl $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) files/nodogsplash.init $(1)/etc/init.d/nodogsplash
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) files/nodogsplash.config $(1)/etc/config/nodogsplash
++
++ $(INSTALL_DIR) $(1)/etc/$(PKG_NAME)/htdocs/images
++ $(CP) $(PKG_BUILD_DIR)/resources/splash.html $(1)/etc/$(PKG_NAME)/htdocs/
++ $(CP) $(PKG_BUILD_DIR)/resources/infoskel.html $(1)/etc/$(PKG_NAME)/htdocs/
++ $(CP) $(PKG_BUILD_DIR)/resources/splash.jpg $(1)/etc/$(PKG_NAME)/htdocs/images/
++endef
++
++define Package/nodogsplash/conffiles
++/etc/nodogsplash/nodogsplash.conf
++endef
++
++$(eval $(call BuildPackage,nodogsplash))
+diff --git a/feeds/routing/nodogsplash/files/nodogsplash.config b/feeds/routing/nodogsplash/files/nodogsplash.config
+new file mode 100644
+index 0000000..dbefeb4
+--- /dev/null
++++ b/feeds/routing/nodogsplash/files/nodogsplash.config
+@@ -0,0 +1,39 @@
++config instance
++ # Set to 1 to enable nodogsplash
++ option enabled 0
++
++ # Use plain configuration file as well
++ #option config '/etc/nodogsplash/nodogsplash.conf'
++ option network 'lan'
++ option gatewayname 'OpenWrt Nodogsplash'
++ option maxclients '250'
++ option idletimeout '1200'
++
++ # Your router may have several interfaces, and you
++ # probably want to keep them private from the network/gatewayinterface.
++ # If so, you should block the entire subnets on those interfaces, e.g.:
++ list authenticated_users 'block to 192.168.0.0/16'
++ list authenticated_users 'block to 10.0.0.0/8'
++
++ # Typical ports you will probably want to open up.
++ list authenticated_users 'allow tcp port 22'
++ list authenticated_users 'allow tcp port 53'
++ list authenticated_users 'allow udp port 53'
++ list authenticated_users 'allow tcp port 80'
++ list authenticated_users 'allow tcp port 443'
++
++ # For preauthenticated users to resolve IP addresses in their
++ # initial request not using the router itself as a DNS server,
++ list preauthenticated_users 'allow tcp port 53'
++ list preauthenticated_users 'allow udp port 53'
++
++ # Allow ports for SSH/Telnet/DNS/DHCP/HTTP/HTTPS
++ list users_to_router 'allow tcp port 22'
++ list users_to_router 'allow tcp port 23'
++ list users_to_router 'allow tcp port 53'
++ list users_to_router 'allow udp port 53'
++ list users_to_router 'allow udp port 67'
++ list users_to_router 'allow tcp port 80'
++ list users_to_router 'allow tcp port 443'
++
++ # See https://github.com/nodogsplash for a full list of available options.
+diff --git a/feeds/routing/nodogsplash/files/nodogsplash.init b/feeds/routing/nodogsplash/files/nodogsplash.init
+new file mode 100755
+index 0000000..0712fa9
+--- /dev/null
++++ b/feeds/routing/nodogsplash/files/nodogsplash.init
+@@ -0,0 +1,396 @@
++#!/bin/sh /etc/rc.common
++#
++# description: Startup/shutdown script for nodogsplash captive portal
++#
++# Alexander Couzens <lynxis@fe80.eu> 2014
++# P. Kube 2007
++#
++# (Based on wifidog startup script
++# Date : 2004-08-25
++# Version : 1.0
++# Comment by that author: Could be better, but it's working as expected)
++#
++
++START=95
++STOP=95
++
++USE_PROCD=1
++
++IPT=/usr/sbin/iptables
++WD_DIR=/usr/bin
++# -s -d 5 runs in background, with level 5 (not so verbose) messages to syslog
++# -f -d 7 runs in foreground, with level 7 (verbose) debug messages to terminal
++OPTIONS="-s -f -d 5"
++CONFIGFILE="/tmp/invalid_nodogsplash.conf"
++
++# nolog(loglevel message ...)
++nolog() {
++ local level=$1
++ shift
++ logger -s -t nodogsplash -p daemon.$level $@
++}
++
++# append_config_option_map <cfgfile> <uci_cfg_obj> <option_name> <config_counterpart> [<optional default>]
++# append "$config_counterpart $value" to cfgfile if option_name exists
++# e.g. append_config_option "$CONFIGFILE" "$cfg" bind_address BindAddress 0.0.0.0
++# will append "BindAddress 192.168.1.1" if uci bind_address is '192.168.1.1'
++append_config_option_map() {
++ local val=""
++ local config_file="$1"
++ local cfg="$2"
++ local option_name="$3"
++ local config_counterpart="$4"
++ local default="$5"
++ config_get val "$cfg" "$option_name" "$default"
++ [ -n "$val" ] && echo "$config_counterpart $val" >> $config_file
++}
++
++# append_config_option <cfgfile> <uci_cfg_obj> <option_name> [<optional default>]
++# append "$option_name $value" to cfgfile if option_name exists
++# e.g. append_config_option "$CONFIGFILE" "$cfg" bind_address 0.0.0.0
++# will append "bind_address 192.168.1.1" if uci bind_address is '192.168.1.1'
++# if uci bind_address is unset append "bind_address 0.0.0.0"
++append_config_option() {
++ local val=""
++ local config_file="$1"
++ local cfg="$2"
++ local option_name="$3"
++ local default="$4"
++ config_get val "$cfg" "$option_name" "$default"
++ [ -n "$val" ] && echo "$option_name $val" >> $config_file
++}
++
++setup_user_authentication() {
++ local cfg="$1"
++ local val
++
++ config_get_bool val "$cfg" authenticate_immediately 0
++ [ $val -gt 0 ] && echo "AuthenticateImmediately yes" >> $CONFIGFILE
++
++ config_get val "$cfg" username
++ if [ -n "$val" ] ; then
++ echo "UsernameAuthentication" >> $CONFIGFILE
++ echo "Username $val" >> $CONFIGFILE
++ fi
++
++ config_get val "$cfg" password
++ if [ -n "$val" ] ; then
++ echo "PasswordAuthentication" >> $CONFIGFILE
++ echo "Password $val" >> $CONFIGFILE
++ fi
++}
++
++setup_mac_lists() {
++ local cfg="$1"
++ local MAC=""
++ local val
++
++ append_mac() {
++ append MAC "$1" ","
++ }
++
++ config_get val "$cfg" macmechanism
++ if [ -z "$val" ] ; then
++ # check if we have AllowedMACList or BlockedMACList defined they will be ignored
++ config_get val "$cfg" allowedmac
++ if [ -n "$val" ] ; then
++ echo "Ignoring allowedmac - macmechanism not \"allow\"" >&2
++ fi
++
++ config_get val "$cfg" blockedmac
++ if [ -n "$val" ] ; then
++ echo "Ignoring blockedmac - macmechanism not \"block\"" >&2
++ fi
++ elif [ "$val" == "allow" ] ; then
++ MAC=""
++ config_list_foreach "$cfg" allowedmac append_mac
++ echo "AllowedMACList $MAC" >> $CONFIGFILE
++ elif [ "$val" == "block" ] ; then
++ MAC=""
++ config_list_foreach "$cfg" blockedmac append_mac
++ echo "BlockedMACList $MAC" >> $CONFIGFILE
++ else
++ nolog error "$cfg Invalid macmechanism '$val' - allow or block are valid."
++ return 1
++ fi
++ MAC=""
++ config_list_foreach "$cfg" trustedmac append_mac
++ [ -n "$MAC" ] && echo "TrustedMACList $MAC" >> $CONFIGFILE
++}
++
++setup_firewall() {
++ local cfg="$1"
++ local uciname
++ local val
++
++ append_firewall() {
++ echo " FirewallRule $1" >> $CONFIGFILE
++ }
++
++ for rule in $(echo authenticated-users preauthenticated-users users-to-router trusted-users trusted-users-to-router)
++ do
++ uci_name=${rule//-/_}
++ # uci does not allow - dashes
++ echo "FirewallRuleSet $rule {" >> $CONFIGFILE
++ config_list_foreach "$cfg" ${uci_name} append_firewall
++ echo "}" >> $CONFIGFILE
++ config_get val "$cfg" policy_${uci_name}
++ [ -n "$val" ] && echo "EmptyRuleSetPolicy $rule $val" >> $CONFIGFILE
++ done
++}
++
++generate_uci_config() {
++ local cfg="$1"
++ local val
++ local ifname
++ local download
++ local upload
++
++ CONFIGFILE="/tmp/etc/nodogsplash_$cfg.conf"
++
++ echo "# auto-generated config file from /etc/config/nodogsplash" > $CONFIGFILE
++
++ config_get val "$cfg" config
++ if [ -n "$val" ] ; then
++ if [ -f "$val" ] ; then
++ nolog error "Configuration file '$file' doesn't exist"
++ return 0
++ fi
++ cat $val > CONFIGFILE
++ fi
++
++ config_get val "$cfg" network
++ if [ -n "$val" ] ; then
++ if ! network_get_device ifname "$val" ; then
++ nolog error "$cfg can not find ifname for network '$val'"
++ return 1
++ fi
++ fi
++
++ config_get val "$cfg" gatewayinterface
++ if [ -n "$val" ] ; then
++ if [ -n "$ifname" ] ; then
++ nolog error "$cfg cannot use both option network and gatewayinterface"
++ return 1
++ fi
++ ifname="$val"
++ fi
++
++ if [ -z "$ifname" ] ; then
++ nolog error "$cfg option network or gatewayinterface missing"
++ return 1
++ fi
++
++ echo "GatewayInterface $ifname" >> $CONFIGFILE
++
++ append_config_option "$CONFIGFILE" "$cfg" gatewayname
++ append_config_option "$CONFIGFILE" "$cfg" gatewayaddress
++ append_config_option "$CONFIGFILE" "$cfg" gatewayport
++ append_config_option "$CONFIGFILE" "$cfg" maxclients
++ append_config_option "$CONFIGFILE" "$cfg" webroot
++ append_config_option "$CONFIGFILE" "$cfg" debuglevel
++ append_config_option "$CONFIGFILE" "$cfg" splashpage
++ append_config_option "$CONFIGFILE" "$cfg" pagesdir
++ append_config_option "$CONFIGFILE" "$cfg" checkinterval
++ append_config_option "$CONFIGFILE" "$cfg" syslogfacility
++ append_config_option "$CONFIGFILE" "$cfg" gatewayiprange
++ append_config_option "$CONFIGFILE" "$cfg" imagedir
++ append_config_option "$CONFIGFILE" "$cfg" redirecturl
++ append_config_option "$CONFIGFILE" "$cfg" clientidletimeout
++ append_config_option "$CONFIGFILE" "$cfg" clientforcetimeout
++ append_config_option "$CONFIGFILE" "$cfg" gatewayiprange
++ append_config_option "$CONFIGFILE" "$cfg" passwordattempts
++ append_config_option "$CONFIGFILE" "$cfg" macmechanism
++ append_config_option "$CONFIGFILE" "$cfg" uploadlimit
++ append_config_option "$CONFIGFILE" "$cfg" downloadlimit
++ append_config_option "$CONFIGFILE" "$cfg" remoteauthenticatoraction
++ append_config_option "$CONFIGFILE" "$cfg" enablepreauth
++ append_config_option "$CONFIGFILE" "$cfg" binvoucher
++ append_config_option "$CONFIGFILE" "$cfg" forcevoucher
++ append_config_option "$CONFIGFILE" "$cfg" passwordauthentication
++ append_config_option "$CONFIGFILE" "$cfg" usernameauthentication
++ append_config_option "$CONFIGFILE" "$cfg" passwordattempts
++ append_config_option "$CONFIGFILE" "$cfg" username
++ append_config_option "$CONFIGFILE" "$cfg" password
++ append_config_option "$CONFIGFILE" "$cfg" authenticateimmediately
++ append_config_option "$CONFIGFILE" "$cfg" decongesthttpdthreads
++ append_config_option "$CONFIGFILE" "$cfg" httpdthreadthreshold
++ append_config_option "$CONFIGFILE" "$cfg" httpdthreaddelayms
++ append_config_option "$CONFIGFILE" "$cfg" fw_mark_authenticated
++ append_config_option "$CONFIGFILE" "$cfg" fw_mark_trusted
++ append_config_option "$CONFIGFILE" "$cfg" fw_mark_blocked
++
++ config_get download "$cfg" downloadlimit
++ config_get upload "$cfg" uploadlimit
++ [ -n "$upload" -o -n "$download" ] && echo "TrafficControl yes" >> $CONFIGFILE
++
++ setup_mac_lists "$cfg"
++ setup_user_authentication "$cfg"
++ setup_firewall "$cfg"
++}
++
++# setup configuration and start instance
++create_instance() {
++ local cfg="$1"
++ local manual_config
++ local val
++
++ config_get_bool val "$cfg" enabled 0
++ [ $val -gt 0 ] || return 0
++
++ generate_uci_config "$cfg"
++
++ if ! test_module ; then
++ logger -s -t nodogsplash -p daemon.error "nodogsplash is missing some kernel modules"
++ fi
++
++ procd_open_instance $cfg
++ procd_set_param command /usr/bin/nodogsplash -c $CONFIGFILE $OPTIONS
++ procd_set_param respawn
++ procd_set_param file $CONFIGFILE
++ procd_close_instance
++}
++
++start_service() {
++ include /lib/functions
++
++ mkdir -p /tmp/etc/
++ config_load nodogsplash
++
++ config_foreach create_instance instance
++}
++
++stop_service() {
++ # nodogsplash doesn't exit fast enought, when procd terminates it.
++ # otherwise procd will restart nodogsplash twice. first time starting nodogsplash fails, second time it succeeds
++ sleep 1
++}
++
++status() {
++ $WD_DIR/ndsctl status
++}
++
++# Test if we got all modules loaded
++test_module() {
++ ### Test ipt_mark with iptables
++ test_ipt_mark () {
++ ($IPT -A FORWARD -m mark --mark 2 -j ACCEPT 2>&1) > /dev/null
++ IPTABLES_OK=$?
++ if [ "$IPTABLES_OK" -eq 0 ]; then
++ ($IPT -D FORWARD -m mark --mark 2 -j ACCEPT 2>&1) > /dev/null
++ return 0
++ else
++ return 1
++ fi
++ }
++
++ ### Test ipt_mac with iptables
++ test_ipt_mac () {
++ ($IPT -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j ACCEPT 2>&1) > /dev/null
++ IPTABLES_OK=$?
++ if [ "$IPTABLES_OK" -eq 0 ]; then
++ ($IPT -D INPUT -m mac --mac-source 00:00:00:00:00:00 -j ACCEPT 2>&1) > /dev/null
++ return 0
++ else
++ return 1
++ fi
++ }
++
++ ### Test ipt_IMQ with iptables
++ test_ipt_IMQ () {
++ ($IPT -t mangle -A PREROUTING -j IMQ --todev 0 2>&1) > /dev/null
++ IPTABLES_OK=$?
++ if [ "$IPTABLES_OK" -eq 0 ]; then
++ ($IPT -t mangle -D PREROUTING -j IMQ --todev 0 2>&1) > /dev/null
++ return 0
++ else
++ return 1
++ fi
++ }
++
++ ### Test imq with ip
++ test_imq () {
++ (ip link set imq0 up 2>&1) > /dev/null
++ IMQ0_OK=$?
++ (ip link set imq1 up 2>&1) > /dev/null
++ IMQ1_OK=$?
++ if [ "$IMQ0_OK" -eq 0 -a "$IMQ1_OK" -eq 0 ]; then
++ (ip link set imq0 down 2>&1) > /dev/null
++ (ip link set imq1 down 2>&1) > /dev/null
++ return 0
++ else
++ return 1
++ fi
++ }
++
++ ### Test sch_htb with tc; requires imq0
++ test_sch_htb () {
++ (tc qdisc del dev imq0 root 2>&1) > /dev/null
++ (tc qdisc add dev imq0 root htb 2>&1) > /dev/null
++ TC_OK=$?
++ if [ "$TC_OK" -eq 0 ]; then
++ (tc qdisc del dev imq0 root 2>&1) > /dev/null
++ return 0
++ else
++ return 1
++ fi
++ }
++
++ ### Find a module on disk
++ module_exists () {
++ EXIST=$(find /lib/modules/`uname -r` -name $1.*o 2> /dev/null)
++ if [ -n "$EXIST" ]; then
++ return 0
++ else
++ return 1
++ fi
++ }
++
++ ### Test if a module is in memory
++ module_in_memory () {
++ MODULE=$(lsmod | grep $1 | awk '{print $1}')
++ if [ "$MODULE" = "$1" ]; then
++ return 0
++ else
++ return 1
++ fi
++ }
++
++ ### Test functionality of a module; load if necessary
++ do_module_tests () {
++ echo " Testing module $1 $2"
++ "test_$1"
++ if [ $? -ne 0 ]; then
++ echo " Module $1 $2 needed"
++ echo " Scanning disk for $1 module"
++ module_exists $1
++ if [ $? -ne 0 ]; then
++ echo " $1 module missing: please install it"
++ exit 1
++ else
++ echo " $1 exists, trying to load"
++ insmod $1 $2 > /dev/null
++ if [ $? -ne 0 ]; then
++ echo " Error: insmod $1 $2 failed"
++ exit 1
++ else
++ echo " $1 $2 loaded successfully"
++ fi
++ fi
++ else
++ echo " $1 is working"
++ fi
++ }
++
++ echo " Testing required modules"
++
++ do_module_tests "ipt_mac"
++ do_module_tests "ipt_mark"
++
++ # test for imq modules, only if TrafficControl is enabled in conf
++ if ( grep -q -E '^[[:space:]]*TrafficControl[[:space:]]+(yes|true|1)' "$CONFIGFILE" ) ; then
++ do_module_tests "imq" "numdevs=2"
++ do_module_tests "ipt_IMQ"
++ do_module_tests "sch_htb"
++ fi
++}
+diff --git a/feeds/routing/nodogsplash/patches/100-musl-compat.patch b/feeds/routing/nodogsplash/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..bb186bc
+--- /dev/null
++++ b/feeds/routing/nodogsplash/patches/100-musl-compat.patch
+@@ -0,0 +1,43 @@
++--- a/src/client_list.c
+++++ b/src/client_list.c
++@@ -36,7 +36,7 @@
++ #include <pthread.h>
++ #include <sys/wait.h>
++ #include <sys/types.h>
++-#include <sys/unistd.h>
+++#include <unistd.h>
++
++ #include <string.h>
++
++--- a/src/firewall.c
+++++ b/src/firewall.c
++@@ -37,7 +37,7 @@
++ #include <pthread.h>
++ #include <sys/wait.h>
++ #include <sys/types.h>
++-#include <sys/unistd.h>
+++#include <unistd.h>
++
++ #include <string.h>
++
++--- a/src/util.c
+++++ b/src/util.c
++@@ -38,7 +38,7 @@
++ #include <pthread.h>
++ #include <sys/wait.h>
++ #include <sys/types.h>
++-#include <sys/unistd.h>
+++#include <unistd.h>
++ #include <netinet/in.h>
++ #include <sys/ioctl.h>
++ #include <arpa/inet.h>
++--- a/libhttpd/protocol.c
+++++ b/libhttpd/protocol.c
++@@ -25,6 +25,7 @@
++ #include <sys/types.h>
++ #include <sys/stat.h>
++ #include <time.h>
+++#include <fcntl.h>
++
++ #if defined(_WIN32)
++ #else
+diff --git a/feeds/routing/ohybridproxy/Makefile b/feeds/routing/ohybridproxy/Makefile
+new file mode 100644
+index 0000000..fd99c3e
+--- /dev/null
++++ b/feeds/routing/ohybridproxy/Makefile
+@@ -0,0 +1,74 @@
++#
++# Copyright (C) 2012-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ohybridproxy
++PKG_SOURCE_VERSION:=b14767d48225aad9ea56ff3e5d6883550e0cf249
++PKG_VERSION:=2015-09-29-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/sbyx/ohybridproxy.git
++PKG_MAINTAINER:=Steven Barth <cyrus@openwrt.org>
++PKG_LICENSE:=GPL-2.0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++# Spammy debug builds for now
++CMAKE_OPTIONS += -DL_LEVEL=7
++
++define Package/ohybridproxy
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ TITLE:=mdns/dns hybrid-proxy
++ URL:=https://github.com/sbyx/ohybridproxy
++ DEPENDS+=+libubox +mdnsd
++endef
++
++define Package/ohybridproxy/description
++ This package provides a statically configured daemon for translating DNS
++ requests to Multicast DNS and back again.
++endef
++
++define Package/ohybridproxy/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ohybridproxy $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/config/
++ $(INSTALL_DATA) ./files/ohybridproxy.config $(1)/etc/config/ohybridproxy
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) ./files/ohybridproxy.init $(1)/etc/init.d/ohybridproxy
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
++ $(INSTALL_DATA) ./files/ohybridproxy.hotplug $(1)/etc/hotplug.d/iface/ohybridproxy
++endef
++
++$(eval $(call BuildPackage,ohybridproxy))
++
++define Package/zonestitcher
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=IP Addresses and Names
++ TITLE:=dynamically combine multiple DNS zones into one
++ URL:=https://github.com/sbyx/ohybridproxy
++ DEPENDS+=+libubox
++endef
++
++define Package/zonestitcher/description
++ This package provides a statically configured daemon for translating DNS
++ requests to Multicast DNS and back again.
++endef
++
++define Package/zonestitcher/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/zonestitcher $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,zonestitcher))
+diff --git a/feeds/routing/ohybridproxy/files/ohybridproxy.config b/feeds/routing/ohybridproxy/files/ohybridproxy.config
+new file mode 100644
+index 0000000..b8d0dd0
+--- /dev/null
++++ b/feeds/routing/ohybridproxy/files/ohybridproxy.config
+@@ -0,0 +1,7 @@
++config main main
++ option host '::'
++ option port '53'
++
++#config interface
++# option interface lan
++# option domain lan.home.
+diff --git a/feeds/routing/ohybridproxy/files/ohybridproxy.hotplug b/feeds/routing/ohybridproxy/files/ohybridproxy.hotplug
+new file mode 100644
+index 0000000..39090df
+--- /dev/null
++++ b/feeds/routing/ohybridproxy/files/ohybridproxy.hotplug
+@@ -0,0 +1,4 @@
++#!/bin/sh
++/etc/init.d/ohybridproxy enabled || exit 0
++[ "$ACTION" = ifupdate ] && exit 0
++/etc/init.d/ohybridproxy restart
+diff --git a/feeds/routing/ohybridproxy/files/ohybridproxy.init b/feeds/routing/ohybridproxy/files/ohybridproxy.init
+new file mode 100755
+index 0000000..568303d
+--- /dev/null
++++ b/feeds/routing/ohybridproxy/files/ohybridproxy.init
+@@ -0,0 +1,50 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2009-2014 OpenWrt.org
++
++START=60
++STOP=10
++USE_PROCD=1
++
++HAS_IFACES=
++
++service_triggers()
++{
++ procd_add_reload_trigger "ohybridproxy"
++}
++
++ohp_interface()
++{
++ local section="$1"
++ config_get interface "$section" interface
++ config_get domain "$section" domain
++
++ [ -n "$interface" ] && network_get_device interface "$interface"
++ if [ -n "$interface" -a -n "$domain" ]; then
++ procd_append_param command "$interface=$domain"
++ HAS_IFACES=1
++ fi
++}
++
++start_service()
++{
++ . /lib/functions.sh
++ . /lib/functions/network.sh
++
++ procd_open_instance
++ procd_set_param command /usr/sbin/ohybridproxy
++
++ config_load ohybridproxy
++
++ config_get val main host
++ [ -n "$val" ] && procd_append_param command -a "${val}"
++
++ config_get val main port
++ [ -n "$val" ] && procd_append_param command -p "${val}"
++
++ config_foreach ohp_interface interface
++
++ [ "$HAS_IFACES" = 1 ] || return 0
++
++ procd_close_instance
++}
++
+diff --git a/feeds/routing/olsrd/Makefile b/feeds/routing/olsrd/Makefile
+new file mode 100644
+index 0000000..26b7de5
+--- /dev/null
++++ b/feeds/routing/olsrd/Makefile
+@@ -0,0 +1,298 @@
++#
++# Copyright (C) 2009-2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=olsrd
++PKG_VERSION:=0.9.0.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.olsr.org/releases/0.9
++
++PKG_MD5SUM:=fa5cf15c29c7ebd9b8425267676c7865
++PKG_BUILD_PARALLEL:=1
++PKG_LICENSE:=BSD-3-Clause
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS += $(FPIC)
++
++define Package/olsrd/template
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ MAINTAINER:=Saverio Proto <zioproto@gmail.com>
++ TITLE:=OLSR (Optimized Link State Routing) daemon
++ URL:=http://www.olsr.org/
++endef
++
++define Package/olsrd
++ $(call Package/olsrd/template)
++ MENU:=1
++ DEPENDS:=+libpthread
++endef
++
++define Package/olsrd/conffiles
++/etc/config/olsrd
++/etc/config/olsrd6
++endef
++
++define Package/olsrd-mod-arprefresh
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Kernel ARP cache refresh plugin
++endef
++
++define Package/olsrd-mod-dot-draw
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Dot topology information plugin
++endef
++
++define Package/olsrd-mod-bmf
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd +kmod-tun
++ TITLE:=Basic multicast forwarding plugin
++endef
++
++define Package/olsrd-mod-dyn-gw
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Dynamic internet gateway plugin
++endef
++
++define Package/olsrd-mod-dyn-gw-plain
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Dynamic internet gateway plain plugin
++endef
++
++define Package/olsrd-mod-httpinfo
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Small informative web server plugin
++endef
++
++define Package/olsrd-mod-jsoninfo
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Small informative plugin with JSON output
++endef
++
++define Package/olsrd-mod-mdns
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=MDNS/Zeroconf/Bonjour packet distribution
++endef
++
++define Package/olsrd-mod-nameservice
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Lightweight hostname resolver plugin
++endef
++
++define Package/olsrd-mod-p2pd
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Peer to Peer Discovery plugin
++endef
++
++
++define Package/olsrd-mod-pgraph
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=output network topology for pgraph
++endef
++
++define Package/olsrd-mod-pud
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Position Update Distribution plugin
++endef
++
++define Package/olsrd-mod-quagga
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Quagga plugin
++endef
++
++define Package/olsrd-mod-secure
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Message signing plugin to secure routing domain
++endef
++
++define Package/olsrd-mod-sgwdynspeed
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Smart Gateway dynamic speed plugin
++endef
++
++define Package/olsrd-mod-txtinfo
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Small informative web server plugin
++endef
++
++define Package/olsrd-mod-watchdog
++ $(call Package/olsrd/template)
++ DEPENDS:=olsrd
++ TITLE:=Watchdog plugin
++endef
++
++define Package/olsrd-mod-pud/conffiles
++/etc/olsrd.d/olsrd.pud.position.conf
++endef
++
++define Package/olsrd-mod-secure/conffiles
++/etc/olsrd.d/olsrd_secure_key
++endef
++
++define Package/olsrd-mod-sgwdynspeed/conffiles
++/etc/olsrd.d/olsrd.sgw.speed.conf
++endef
++
++MAKE_FLAGS+= \
++ NO_DEBUG_MESSAGES=1 \
++ OS="linux" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ STRIP="true" \
++ INSTALL_LIB="true" \
++ SUBDIRS="arprefresh bmf dot_draw dyn_gw dyn_gw_plain httpinfo jsoninfo mdns nameservice p2pd pgraph pud quagga secure sgwdynspeed txtinfo watchdog"
++
++define Build/Compile
++ $(call Build/Compile/Default,all)
++ $(call Build/Compile/Default,libs)
++endef
++
++define Package/olsrd/install
++ $(INSTALL_DIR) $(1)/lib/functions
++ $(INSTALL_DATA) ./files/olsrd.init $(1)/lib/functions/olsrd.sh
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DATA) ./files/olsrd.config $(1)/etc/config/olsrd
++ $(INSTALL_DATA) ./files/olsrd6.config $(1)/etc/config/olsrd6
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/olsrd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/olsrd4.init $(1)/etc/init.d/olsrd
++ $(INSTALL_BIN) ./files/olsrd6.init $(1)/etc/init.d/olsrd6
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
++ $(INSTALL_BIN) ./files/olsrd.hotplug.sh $(1)/etc/hotplug.d/iface/50-olsrd
++endef
++
++define Package/olsrd-mod-arprefresh/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/arprefresh/olsrd_arprefresh.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-dot-draw/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/dot_draw/olsrd_dot_draw.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-bmf/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/bmf/olsrd_bmf.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-dyn-gw/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/dyn_gw/olsrd_dyn_gw.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-dyn-gw-plain/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/dyn_gw_plain/olsrd_dyn_gw_plain.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-httpinfo/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/httpinfo/olsrd_httpinfo.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-jsoninfo/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/jsoninfo/olsrd_jsoninfo.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-mdns/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/mdns/olsrd_mdns.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-nameservice/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/nameservice/olsrd_nameservice.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-p2pd/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/p2pd/olsrd_p2pd.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-pgraph/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/pgraph/olsrd_pgraph.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-pud/install
++ $(INSTALL_DIR) $(1)/etc/olsrd.d
++ $(CP) ./files/olsrd.pud.position.conf $(1)/etc/olsrd.d/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/pud/nmealib/lib/libnmea.so $(1)/usr/lib/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/pud/wireformat/lib/libOlsrdPudWireFormat.so $(1)/usr/lib/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/pud/olsrd_pud.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-quagga/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/quagga/olsrd_quagga.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-secure/install
++ $(INSTALL_DIR) $(1)/etc/olsrd.d
++ $(CP) ./files/olsrd_secure_key $(1)/etc/olsrd.d/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/secure/olsrd_secure.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-sgwdynspeed/install
++ $(INSTALL_DIR) $(1)/etc/olsrd.d
++ $(CP) ./files/olsrd.sgw.speed.conf $(1)/etc/olsrd.d/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/sgwdynspeed/olsrd_sgwdynspeed.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-txtinfo/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/txtinfo/olsrd_txtinfo.so.* $(1)/usr/lib/
++endef
++
++define Package/olsrd-mod-watchdog/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/lib/watchdog/olsrd_watchdog.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,olsrd))
++$(eval $(call BuildPackage,olsrd-mod-arprefresh))
++$(eval $(call BuildPackage,olsrd-mod-dot-draw))
++$(eval $(call BuildPackage,olsrd-mod-bmf))
++$(eval $(call BuildPackage,olsrd-mod-dyn-gw))
++$(eval $(call BuildPackage,olsrd-mod-dyn-gw-plain))
++$(eval $(call BuildPackage,olsrd-mod-httpinfo))
++$(eval $(call BuildPackage,olsrd-mod-jsoninfo))
++$(eval $(call BuildPackage,olsrd-mod-mdns))
++$(eval $(call BuildPackage,olsrd-mod-nameservice))
++$(eval $(call BuildPackage,olsrd-mod-p2pd))
++$(eval $(call BuildPackage,olsrd-mod-pgraph))
++$(eval $(call BuildPackage,olsrd-mod-pud))
++$(eval $(call BuildPackage,olsrd-mod-quagga))
++$(eval $(call BuildPackage,olsrd-mod-secure))
++$(eval $(call BuildPackage,olsrd-mod-sgwdynspeed))
++$(eval $(call BuildPackage,olsrd-mod-txtinfo))
++$(eval $(call BuildPackage,olsrd-mod-watchdog))
+diff --git a/feeds/routing/olsrd/files/olsrd.config b/feeds/routing/olsrd/files/olsrd.config
+new file mode 100644
+index 0000000..f4ddfd0
+--- /dev/null
++++ b/feeds/routing/olsrd/files/olsrd.config
+@@ -0,0 +1,24 @@
++config olsrd
++ # uncomment the following line to use a custom config file instead:
++ #option config_file '/etc/olsrd.conf'
++
++config LoadPlugin
++ option library 'olsrd_arprefresh.so.0.1'
++
++config LoadPlugin
++ option library 'olsrd_dyn_gw.so.0.5'
++
++config LoadPlugin
++ option library 'olsrd_httpinfo.so.0.1'
++ option port '1978'
++ list Net '0.0.0.0 0.0.0.0'
++
++config LoadPlugin
++ option library 'olsrd_nameservice.so.0.3'
++
++config LoadPlugin
++ option library 'olsrd_txtinfo.so.0.1'
++ option accept '0.0.0.0'
++
++config Interface
++ list interface 'wlan'
+diff --git a/feeds/routing/olsrd/files/olsrd.hotplug.sh b/feeds/routing/olsrd/files/olsrd.hotplug.sh
+new file mode 100755
+index 0000000..99e834e
+--- /dev/null
++++ b/feeds/routing/olsrd/files/olsrd.hotplug.sh
+@@ -0,0 +1,71 @@
++#!/bin/sh
++
++olsrd_list_configured_interfaces()
++{
++ local i=0
++ local interface
++
++ while interface="$( uci -q get $OLSRD.@Interface[$i].interface )"; do {
++ case "$( uci -q get $OLSRD.@Interface[$i].ignore )" in
++ 1|on|true|enabled|yes)
++ # is disabled
++ ;;
++ *)
++ echo "$interface" # e.g. 'lan'
++ ;;
++ esac
++
++ i=$(( $i + 1 ))
++ } done
++}
++
++olsrd_interface_already_in_config()
++{
++ # e.g.: 'Interface "eth0.1" "eth0.2" "wlan0"'
++ if grep -s ^'Interface ' '/var/etc/$OLSRD.conf' | grep -q "\"$DEVICE\""; then
++ logger -t olsrd_hotplug -p daemon.debug "[OK] already_active: '$INTERFACE' => '$DEVICE'"
++ return 0
++ else
++ logger -t olsrd_hotplug -p daemon.info "[OK] ifup: '$INTERFACE' => '$DEVICE'"
++ return 1
++ fi
++}
++
++olsrd_interface_needs_adding()
++{
++ local interface
++
++ # likely and cheap operation:
++ olsrd_interface_already_in_config && return 1
++
++ for interface in $(olsrd_list_configured_interfaces); do {
++ [ "$interface" = "$INTERFACE" ] && {
++ olsrd_interface_already_in_config || return 0
++ }
++ } done
++
++ logger -t olsrd_hotplug -p daemon.debug "[OK] interface '$INTERFACE' => '$DEVICE' not used for $OLSRD"
++ return 1
++}
++
++case "$ACTION" in
++ ifup)
++ # only work after the first normal startup
++ # also: no need to test, if enabled
++ OLSRD=olsrd
++ [ -e "/var/etc/$OLSRD.conf" ] && {
++ # INTERFACE = e.g. 'wlanadhocRADIO1' or 'cfg144d8f'
++ # DEVICE = e.g. 'wlan1-1'
++ olsrd_interface_needs_adding && {
++ . /etc/rc.common /etc/init.d/$OLSRD restart
++ }
++ }
++
++ OLSRD=olsrd6
++ [ -e "/var/etc/$OLSRD.conf" ] && {
++ olsrd_interface_needs_adding && {
++ . /etc/rc.common /etc/init.d/$OLSRD restart
++ }
++ }
++ ;;
++esac
+diff --git a/feeds/routing/olsrd/files/olsrd.init b/feeds/routing/olsrd/files/olsrd.init
+new file mode 100644
+index 0000000..3ced911
+--- /dev/null
++++ b/feeds/routing/olsrd/files/olsrd.init
+@@ -0,0 +1,854 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008-2013 OpenWrt.org
++
++START=65
++
++SERVICE_DAEMONIZE=1
++SERVICE_WRITE_PID=1
++
++OLSRD_OLSRD_SCHEMA='ignore:internal config_file:internal DebugLevel=0 AllowNoInt=yes'
++OLSRD_IPCCONNECT_SCHEMA='ignore:internal Host:list Net:list2'
++OLSRD_LOADPLUGIN_SCHEMA='ignore:internal library:internal Host4:list Net4:list2 Host:list Net:list2 Host6:list Net6:list2 Ping:list redistribute:list NonOlsrIf:list name:list lat lon latlon_infile HNA:list2 hosts:list2 ipv6only:bool'
++OLSRD_INTERFACE_SCHEMA='ignore:internal interface:internal AutoDetectChanges:bool LinkQualityMult:list2'
++OLSRD_INTERFACE_DEFAULTS_SCHEMA='AutoDetectChanges:bool'
++
++T=' '
++N='
++'
++#6and4: backward compatibility - it MUST be different from /etc/init.d/olsrd6 PID variable
++PID6=/var/run/olsrd6and4.pid
++
++log() {
++ logger -t olsrd -p daemon.info -s "${initscript}: $@"
++}
++
++error() {
++ logger -t olsrd -p daemon.err -s "${initscript}: ERROR: $@"
++}
++
++warn() {
++ logger -t olsrd -p daemon.warn -s "${initscript}: WARNING: $@"
++}
++
++validate_varname() {
++ local varname="$1"
++ [ -z "$varname" -o "$varname" != "${varname%%[!A-Za-z0-9_]*}" ] && return 1
++ return 0
++}
++
++validate_olsrd_option() {
++ local str="$1"
++ [ -z "$str" -o "$str" != "${str%%[! 0-9A-Za-z.%/|:_-]*}" ] && return 1
++ return 0
++}
++
++system_config() {
++ local cfg="$1"
++ local cfgt hostname latlon oldIFS
++
++ config_get cfgt "$cfg" TYPE
++
++ if [ "$cfgt" = "system" ]; then
++ config_get hostname "$cfg" hostname
++ hostname="${hostname:-OpenWrt}"
++ SYSTEM_HOSTNAME="$hostname"
++ fi
++
++ if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then
++ config_get latlon "$cfg" latlon
++ oldIFS="$IFS"; IFS=" ${T}${N},"; set -- $latlon; IFS="$oldIFS"
++ SYSTEM_LAT="$1"
++ SYSTEM_LON="$2"
++ fi
++
++ if [ -z "$SYSTEM_LAT" -o -z "$SYSTEM_LON" ]; then
++ config_get latlon "$cfg" latitude
++ SYSTEM_LAT="$latlon"
++ config_get latlon "$cfg" longitude
++ SYSTEM_LON="$latlon"
++ fi
++}
++
++olsrd_find_config_file() {
++ local cfg="$1"
++ validate_varname "$cfg" || return 0
++
++ config_get_bool ignore "$cfg" ignore 0
++ [ "$ignore" -ne 0 ] && return 0
++ config_get OLSRD_CONFIG_FILE "$cfg" config_file
++
++ return 0
++}
++
++warning_invalid_value() {
++ local funcname="warning_invalid_value"
++ local package="$1"
++ validate_varname "$package" || package=
++ local config="$2"
++ validate_varname "$config" || config=
++ local option="$3"
++ validate_varname "$option" || option=
++
++ if [ -n "$package" -a -n "$config" ]; then
++ log "$funcname() in option '$package.$config${option:+.}$option', skipped"
++ else
++ log "$funcname() skipped"
++ fi
++
++ return 0
++}
++
++olsrd_write_option() {
++ local param="$1"
++ local cfg="$2"
++ validate_varname "$cfg" || return 1
++ local option="$3"
++ validate_varname "$option" || return 1
++ local value="$4"
++ local option_type="$5"
++
++ if [ "$option_type" = bool ]; then
++ case "$value" in
++ 1|on|true|enabled|yes) value=yes;;
++ 0|off|false|disabled|no) value=no;;
++ *) warning_invalid_value olsrd "$cfg" "$option"; return 1;;
++ esac
++ fi
++
++ if ! validate_olsrd_option "$value"; then
++ warning_invalid_value olsrd "$cfg" "$option"
++ return 1
++ fi
++
++ if [ "$value" != "${value%%[G-Zg-z_-]*}" ]; then
++ if [ "$option" != "Ip6AddrType" -a "$option" != "LinkQualityMult" -a "$value" != "yes" -a "$value" != "no" ]; then
++ value="\"$value\""
++ fi
++ fi
++
++ echo -n "${N}$param$option $value"
++
++ return 0
++}
++
++olsrd_write_plparam() {
++ local funcname="olsrd_write_plparam"
++ local param="$1"
++ local cfg="$2"
++ validate_varname "$cfg" || return 1
++ local option="$3"
++ validate_varname "$option" || return 1
++ local value="$4"
++ local option_type="$5"
++ local _option oldIFS
++
++ if [ "$option_type" = bool ]; then
++ case "$value" in
++ 1|on|true|enabled|yes) value=yes;;
++ 0|off|false|disabled|no) value=no;;
++ *) warning_invalid_value olsrd "$cfg" "$option"; return 1;;
++ esac
++ fi
++
++ if ! validate_olsrd_option "$value"; then
++ warning_invalid_value olsrd "$cfg" "$option"
++ return 1
++ fi
++
++ oldIFS="$IFS"
++ IFS='-_'
++ set -- $option
++ option="$*"
++ IFS="$oldIFS"
++ _option="$option"
++
++ if [ "$option" = 'hosts' ]; then
++ set -- $value
++ option="$1"
++ shift
++ value="$*"
++ fi
++
++ if [ "$option" = 'NonOlsrIf' ]; then
++ if validate_varname "$value"; then
++ if network_get_device ifname "$value"; then
++ log "$funcname() Info: mdns Interface '$value' ifname '$ifname' found"
++ else
++ log "$funcname() Warning: mdns Interface '$value' not found, skipped"
++ fi
++ else
++ warning_invalid_value olsrd "$cfg" "NonOlsrIf"
++ fi
++ [ -z "$ifname" ] || value=$ifname
++ fi
++
++ echo -n "${N}${param}PlParam \"$option\" \"$value\""
++
++ return 0
++}
++
++config_update_schema() {
++ local schema_varname="$1"
++ validate_varname "$schema_varname" || return 1
++ local command="$2"
++ validate_varname "$command" || return 1
++ local option="$3"
++ validate_varname "$option" || return 1
++ local value="$4"
++ local schema
++ local cur_option
++
++ case "$varname" in
++ *_LENGTH) return 0;;
++ *_ITEM*) return 0;;
++ esac
++
++ eval "export -n -- \"schema=\${$schema_varname}\""
++
++ for cur_option in $schema; do
++ [ "${cur_option%%[:=]*}" = "$option" ] && return 0
++ done
++
++ if [ "$command" = list ]; then
++ set -- $value
++ if [ "$#" -ge "3" ]; then
++ schema_entry="$option:list3"
++ elif [ "$#" -ge "2" ]; then
++ schema_entry="$option:list2"
++ else
++ schema_entry="$option:list"
++ fi
++ else
++ schema_entry="$option"
++ fi
++
++ append "$schema_varname" "$schema_entry"
++
++ return 0
++}
++
++config_write_options() {
++ local funcname="config_write_options"
++ local schema="$1"
++ local cfg="$2"
++ validate_varname "$cfg" || return 1
++ local write_func="$3"
++ [ -z "$write_func" ] && output_func=echo
++ local write_param="$4"
++
++ local schema_entry option option_length option_type default value list_size list_item list_value i position speed oldIFS
++ local list_speed_vars="HelloInterval HelloValidityTime TcInterval TcValidityTime MidInterval MidValidityTime HnaInterval HnaValidityTime"
++
++ get_value_for_entry()
++ {
++ local schema_entry="$1"
++
++ default="${schema_entry#*[=]}"
++ [ "$default" = "$schema_entry" ] && default=
++ option="${schema_entry%%[=]*}"
++
++ oldIFS="$IFS"; IFS=':'; set -- $option; IFS="$oldIFS"
++ option="$1"
++ option_type="$2"
++
++ validate_varname "$option" || return 1
++ [ -z "$option_type" ] || validate_varname "$option_type" || return 1
++ [ "$option_type" = internal ] && return 1
++
++ config_get value "$cfg" "$option"
++ [ "$option" = "speed" ] && return 1
++
++ return 0
++ }
++
++ already_in_schema()
++ {
++ case " $schema " in
++ *" $1 "*)
++ return 0
++ ;;
++ *)
++ return 1
++ ;;
++ esac
++ }
++
++ already_in_schema "speed" && {
++ get_value_for_entry "speed"
++
++ if [ 2>/dev/null $value -gt 0 -a $value -le 20 ]; then
++ speed="$value"
++ else
++ log "$funcname() Warning: invalid speed-value: '$value' - allowed integers: 1...20, fallback to 6"
++ speed=6
++ fi
++
++ for schema_entry in $list_speed_vars; do {
++ already_in_schema "$schema_entry" || schema="$schema $schema_entry"
++ } done
++ }
++
++ for schema_entry in $schema; do
++ if [ -n "$speed" ]; then # like sven-ola freifunk firmware fff-1.7.4
++ case "$schema_entry" in
++ HelloInterval)
++ value="$(( $speed / 2 + 1 )).0"
++ ;;
++ HelloValidityTime)
++ value="$(( $speed * 25 )).0"
++ ;;
++ TcInterval) # todo: not fisheye? -> $(( $speed * 2 ))
++ value=$(( $speed / 2 ))
++ [ $value -eq 0 ] && value=1
++ value="$value.0"
++ ;;
++ TcValidityTime)
++ value="$(( $speed * 100 )).0"
++ ;;
++ MidInterval)
++ value="$(( $speed * 5 )).0"
++ ;;
++ MidValidityTime)
++ value="$(( $speed * 100 )).0"
++ ;;
++ HnaInterval)
++ value="$(( $speed * 2 )).0"
++ ;;
++ HnaValidityTime)
++ value="$(( $speed * 25 )).0"
++ ;;
++ *)
++ get_value_for_entry "$schema_entry" || continue
++ ;;
++ esac
++
++ is_speed_var()
++ {
++ case " $list_speed_vars " in
++ *" $1 "*)
++ return 0
++ ;;
++ *)
++ return 1
++ ;;
++ esac
++ }
++
++ is_speed_var "$schema_entry" && option="$schema_entry"
++ else
++ get_value_for_entry "$schema_entry" || continue
++ fi
++
++ if [ -z "$value" ]; then
++ oldIFS="$IFS"; IFS='+'; set -- $default; IFS="$oldIFS"
++ value=$*
++ elif [ "$value" = '-' -a -n "$default" ]; then
++ continue
++ fi
++
++ [ -z "$value" ] && continue
++
++ case "$option_type" in
++ list) list_size=1;;
++ list2) list_size=2;;
++ list3) list_size=3;;
++ *) list_size=0;;
++ esac
++
++ if [ "$list_size" -gt 0 ]; then
++ config_get option_length "$cfg" "${option}_LENGTH"
++ if [ -n "$option_length" ]; then
++ i=1
++ while [ "$i" -le "$option_length" ]; do
++ config_get list_value "$cfg" "${option}_ITEM$i"
++ "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break
++ i=$((i + 1))
++ done
++ else
++ list_value=
++ i=0
++ for list_item in $value; do
++ append "list_value" "$list_item"
++ i=$((i + 1))
++ position=$((i % list_size))
++ if [ "$position" -eq 0 ]; then
++ "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type" || break
++ list_value=
++ fi
++ done
++ [ "$position" -ne 0 ] && "$write_func" "$write_param" "$cfg" "$option" "$list_value" "$option_type"
++ fi
++ else
++ "$write_func" "$write_param" "$cfg" "$option" "$value" "$option_type"
++ fi
++ done
++
++ return 0
++}
++
++olsrd_write_olsrd() {
++ local cfg="$1"
++ validate_varname "$cfg" || return 0
++ local ignore
++
++ config_get_bool ignore "$cfg" ignore 0
++ [ "$ignore" -ne 0 ] && return 0
++
++ [ "$OLSRD_COUNT" -gt 0 ] && return 0
++
++ config_get ipversion "$cfg" IpVersion
++ if [ "$UCI_CONF_NAME" == "olsrd6" ]; then
++ OLSRD_OLSRD_SCHEMA="$OLSRD_OLSRD_SCHEMA IpVersion=6"
++ if [ "$ipversion" = "6and4" ]; then
++ error "IpVersion 6and4 not supported in olsrd6"
++ return 1
++ fi
++ else
++ if [ "$ipversion" = "6and4" ]; then
++ OLSRD_IPVERSION_6AND4=1
++ config_set "$cfg" IpVersion '6'
++ fi
++ fi
++ config_get smartgateway "$cfg" SmartGateway
++ config_get smartgatewayuplink "$cfg" SmartGatewayUplink
++
++ config_write_options "$OLSRD_OLSRD_SCHEMA" "$cfg" olsrd_write_option
++ echo
++ OLSRD_COUNT=$((OLSRD_COUNT + 1))
++ return 0
++}
++
++olsrd_write_ipcconnect() {
++ local cfg="$1"
++ validate_varname "$cfg" || return 0
++ local ignore
++
++ config_get_bool ignore "$cfg" ignore 0
++ [ "$ignore" -ne 0 ] && return 0
++
++ [ "$IPCCONNECT_COUNT" -gt 0 ] && return 0
++
++ echo -n "${N}IpcConnect${N}{"
++ config_write_options "$OLSRD_IPCCONNECT_SCHEMA" "$cfg" olsrd_write_option "${T}"
++ echo "${N}}"
++ IPCCONNECT_COUNT=$((IPCCONNECT_COUNT + 1))
++
++ return 0
++}
++
++olsrd_write_hna4() {
++ local cfg="$1"
++ validate_varname "$cfg" || return 0
++ local ignore
++
++ config_get_bool ignore "$cfg" ignore 0
++ [ "$ignore" -ne 0 ] && return 0
++
++ config_get netaddr "$cfg" netaddr
++ if ! validate_olsrd_option "$netaddr"; then
++ warning_invalid_value olsrd "$cfg" "netaddr"
++ return 0
++ fi
++
++ config_get netmask "$cfg" netmask
++ if ! validate_olsrd_option "$netmask"; then
++ warning_invalid_value olsrd "$cfg" "netmask"
++ return 0
++ fi
++
++ [ "$HNA4_COUNT" -le 0 ] && echo -n "${N}Hna4${N}{"
++ echo -n "${N}${T}${T}$netaddr $netmask"
++ HNA4_COUNT=$((HNA4_COUNT + 1))
++
++ return 0
++}
++
++olsrd_write_hna6() {
++ local cfg="$1"
++ validate_varname "$cfg" || return 0
++ local ignore
++
++ config_get_bool ignore "$cfg" ignore 0
++ [ "$ignore" -ne 0 ] && return 0
++
++ config_get netaddr "$cfg" netaddr
++ if ! validate_olsrd_option "$netaddr"; then
++ warning_invalid_value olsrd "$cfg" "netaddr"
++ return 0
++ fi
++
++ config_get prefix "$cfg" prefix
++ if ! validate_olsrd_option "$prefix"; then
++ warning_invalid_value olsrd "$cfg" "prefix"
++ return 0
++ fi
++
++ [ "$HNA6_COUNT" -le 0 ] && echo -n "${N}Hna6${N}{"
++ echo -n "${N}${T}${T}$netaddr $prefix"
++ HNA6_COUNT=$((HNA6_COUNT + 1))
++
++ return 0
++}
++
++olsrd_write_loadplugin() {
++ local funcname="olsrd_write_loadplugin"
++ local cfg="$1"
++ validate_varname "$cfg" || return 0
++ local ignore
++ local name
++ local suffix
++ local lat
++ local lon
++ local latlon_infile
++
++ config_get_bool ignore "$cfg" ignore 0
++ [ "$ignore" -ne 0 ] && return 0
++
++ config_get library "$cfg" library
++ if ! validate_olsrd_option "$library"; then
++ warning_invalid_value olsrd "$cfg" "library"
++ return 0
++ fi
++ if ! [ -x "/lib/$library" -o -x "/usr/lib/$library" -o -x "/usr/local/lib/$library" ]; then
++ log "$funcname() Warning: Plugin library '$library' not found, skipped"
++ return 0
++ fi
++
++ case "$library" in
++ olsrd_nameservice.*)
++ config_get name "$cfg" name
++ [ -z "$name" ] && config_set "$cfg" name $SYSTEM_HOSTNAME
++
++ config_get suffix "$cfg" suffix
++ [ -z "$suffix" ] && config_set "$cfg" suffix '.olsr'
++
++ config_get lat "$cfg" lat
++ config_get lon "$cfg" lon
++ config_get latlon_infile "$cfg" latlon_infile
++ if [ \( -z "$lat" -o -z "$lat" \) -a -z "$latlon_infile" ]; then
++ if [ -f '/var/run/latlon.txt' ]; then
++ config_set "$cfg" lat ''
++ config_set "$cfg" lon ''
++ config_set "$cfg" latlon_infile '/var/run/latlon.txt'
++ else
++ config_set "$cfg" lat "$SYSTEM_LAT"
++ config_set "$cfg" lon "$SYSTEM_LON"
++ fi
++ fi
++
++ for f in latlon_file hosts_file services_file resolv_file macs_file; do
++ config_get $f "$cfg" $f
++ done
++
++ [ -z "$latlon_file" ] && config_set "$cfg" latlon_file '/var/run/latlon.js'
++ ;;
++ olsrd_watchdog.*)
++ config_get wd_file "$cfg" file
++ ;;
++ esac
++
++ echo -n "${N}LoadPlugin \"$library\"${N}{"
++ config_write_options "$OLSRD_LOADPLUGIN_SCHEMA" "$cfg" olsrd_write_plparam "${T}"
++ echo "${N}}"
++
++ return 0
++}
++
++olsrd_write_interface() {
++ local funcname="olsrd_write_interface"
++ local cfg="$1"
++ validate_varname "$cfg" || return 0
++ local ignore
++ local interfaces
++ local interface
++ local ifnames
++
++ config_get_bool ignore "$cfg" ignore 0
++ [ "$ignore" -ne 0 ] && return 0
++
++ ifnames=
++ config_get interfaces "$cfg" interface
++
++ for interface in $interfaces; do
++ if validate_varname "$interface"; then
++ if network_get_device IFNAME "$interface"; then
++ ifnames="$ifnames \"$IFNAME\""
++ ifsglobal="$ifsglobal $IFNAME"
++ elif network_get_physdev IFNAME "$interface"; then
++ local proto="$(uci -q get network.${interface}.proto)"
++ if [ "$proto" = "static" -o "$proto" = "none" ]; then
++ ifnames="$ifnames \"$IFNAME\""
++ ifsglobal="$ifsglobal $IFNAME"
++ fi
++ else
++ log "$funcname() Warning: Interface '$interface' not found, skipped"
++ fi
++ else
++ warning_invalid_value olsrd "$cfg" "interface"
++ fi
++ done
++
++ [ -z "$ifnames" ] && return 0
++
++ echo -n "${N}Interface$ifnames${N}{"
++ config_write_options "$OLSRD_INTERFACE_SCHEMA" "$cfg" olsrd_write_option "${T}"
++ echo "${N}}"
++ INTERFACES_COUNT=$((INTERFACES_COUNT + 1))
++
++ return 0
++}
++
++olsrd_write_interface_defaults() {
++ local cfg="$1"
++ validate_varname "$cfg" || return 0
++
++ echo -n "${N}InterfaceDefaults$ifnames${N}{"
++ config_write_options "$OLSRD_INTERFACE_DEFAULTS_SCHEMA" "$cfg" olsrd_write_option "${T}"
++ echo "${N}}"
++
++ return 1
++}
++
++olsrd_update_schema() {
++ local command="$1"
++ validate_varname "$command" || return 0
++ local varname="$2"
++ validate_varname "$varname" || return 0
++ local value="$3"
++ local cfg="$CONFIG_SECTION"
++ local cfgt
++ local cur_varname
++
++ config_get cfgt "$cfg" TYPE
++ case "$cfgt" in
++ olsrd) config_update_schema OLSRD_OLSRD_SCHEMA "$command" "$varname" "$value";;
++ IpcConnect) config_update_schema OLSRD_IPCCONNECT_SCHEMA "$command" "$varname" "$value";;
++ LoadPlugin) config_update_schema OLSRD_LOADPLUGIN_SCHEMA "$command" "$varname" "$value";;
++ Interface) config_update_schema OLSRD_INTERFACE_SCHEMA "$command" "$varname" "$value";;
++ InterfaceDefaults) config_update_schema OLSRD_INTERFACE_DEFAULTS_SCHEMA "$command" "$varname" "$value";;
++ esac
++
++ return 0
++}
++
++olsrd_write_config() {
++ OLSRD_IPVERSION_6AND4=0
++ OLSRD_COUNT=0
++ config_foreach olsrd_write_olsrd olsrd
++ IPCCONNECT_COUNT=0
++ config_foreach olsrd_write_ipcconnect IpcConnect
++ HNA4_COUNT=0
++ config_foreach olsrd_write_hna4 Hna4
++ [ "$HNA4_COUNT" -gt 0 ] && echo "${N}}"
++ HNA6_COUNT=0
++ config_foreach olsrd_write_hna6 Hna6
++ [ "$HNA6_COUNT" -gt 0 ] && echo "${N}}"
++ config_foreach olsrd_write_loadplugin LoadPlugin
++ INTERFACES_COUNT=0
++ config_foreach olsrd_write_interface_defaults InterfaceDefaults
++ config_foreach olsrd_write_interface Interface
++ echo
++
++ return 0
++}
++
++get_wan_ifnames()
++{
++ local wanifnames word catch_next
++
++ which ip >/dev/null || return 1
++
++ set -- $( ip route list exact 0.0.0.0/0 table all )
++ for word in $*; do
++ case "$word" in
++ dev)
++ catch_next="true"
++ ;;
++ *)
++ [ -n "$catch_next" ] && {
++ case "$wanifnames" in
++ *" $word "*)
++ ;;
++ *)
++ wanifnames="$wanifnames $word "
++ ;;
++ esac
++
++ catch_next=
++ }
++ ;;
++ esac
++ done
++
++ echo "$wanifnames"
++}
++
++olsrd_setup_smartgw_rules() {
++ local funcname="olsrd_setup_smartgw_rules"
++ # Check if ipip is installed
++ [ -e /etc/modules.d/[0-9]*-ipip ] || {
++ log "$funcname() Warning: kmod-ipip is missing. SmartGateway will not work until you install it."
++ return 1
++ }
++
++ local wanifnames="$( get_wan_ifnames )"
++
++ if [ -z "$wanifnames" ]; then
++ nowan=1
++ else
++ nowan=0
++ fi
++
++ IP4T=$(which iptables)
++ IP6T=$(which ip6tables)
++
++ # Delete smartgw firewall rules first
++ for IPT in $IP4T $IP6T; do
++ while $IPT -D forwarding_rule -o tnl_+ -j ACCEPT 2> /dev/null; do :;done
++ for IFACE in $wanifnames; do
++ while $IPT -D forwarding_rule -i tunl0 -o $IFACE -j ACCEPT 2> /dev/null; do :; done
++ done
++ for IFACE in $ifsglobal; do
++ while $IPT -D input_rule -i $IFACE -p 4 -j ACCEPT 2> /dev/null; do :; done
++ done
++ done
++ while $IP4T -t nat -D postrouting_rule -o tnl_+ -j MASQUERADE 2> /dev/null; do :;done
++
++ if [ "$smartgateway" == "yes" ]; then
++ log "$funcname() Notice: Inserting firewall rules for SmartGateway"
++ if [ ! "$smartgatewayuplink" == "none" ]; then
++ if [ "$smartgatewayuplink" == "ipv4" ]; then
++ # Allow everything to be forwarded to tnl_+ and use NAT for it
++ $IP4T -I forwarding_rule -o tnl_+ -j ACCEPT
++ $IP4T -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
++ # Allow forwarding from tunl0 to (all) wan-interfaces
++ if [ "$nowan"="0" ]; then
++ for IFACE in $wanifnames; do
++ $IP4T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
++ done
++ fi
++ # Allow incoming ipip on all olsr-interfaces
++ for IFACE in $ifsglobal; do
++ $IP4T -I input_rule -i $IFACE -p 4 -j ACCEPT
++ done
++ elif [ "$smartgatewayuplink" == "ipv6" ]; then
++ $IP6T -I forwarding_rule -o tnl_+ -j ACCEPT
++ if [ "$nowan"="0" ]; then
++ for IFACE in $wanifnames; do
++ $IP6T -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
++ done
++ fi
++ for IFACE in $ifsglobal; do
++ $IP6T -I input_rule -i $IFACE -p 4 -j ACCEPT
++ done
++ else
++ $IP4T -t nat -I postrouting_rule -o tnl_+ -j MASQUERADE
++ for IPT in $IP4T $IP6T; do
++ $IPT -I forwarding_rule -o tnl_+ -j ACCEPT
++ if [ "$nowan"="0" ]; then
++ for IFACE in $wanifnames; do
++ $IPT -A forwarding_rule -i tunl0 -o $IFACE -j ACCEPT
++ done
++ fi
++ for IFACE in $ifsglobal; do
++ $IPT -I input_rule -i $IFACE -p 4 -j ACCEPT
++ done
++ done
++ fi
++ fi
++ fi
++}
++
++start() {
++ SYSTEM_HOSTNAME=
++ SYSTEM_LAT=
++ SYSTEM_LON=
++ config_load system
++ config_foreach system_config system
++
++ option_cb() {
++ olsrd_update_schema "option" "$@"
++ }
++
++ list_cb() {
++ olsrd_update_schema "list" "$@"
++ }
++
++ . /lib/functions/network.sh
++
++ config_load $UCI_CONF_NAME
++ reset_cb
++
++ OLSRD_CONFIG_FILE=
++ config_foreach olsrd_find_config_file olsrd
++
++ if [ -z "$OLSRD_CONFIG_FILE" ]; then
++ mkdir -p -- /var/etc/
++ olsrd_write_config > /var/etc/$UCI_CONF_NAME.conf || return 1
++ if [ "$INTERFACES_COUNT" -gt 0 -a "$OLSRD_COUNT" -gt 0 ]; then
++ OLSRD_CONFIG_FILE=/var/etc/$UCI_CONF_NAME.conf
++ fi
++ fi
++
++ [ -z "$OLSRD_CONFIG_FILE" ] && return 1
++
++ #6and4: backward compatibility
++ local bindv6only='0'
++ if [ "$OLSRD_IPVERSION_6AND4" -ne 0 ]; then
++ warn "IpVersion 6and4 is deprecated and will be removed in future!"
++ warn "You must use /etc/config/olsrd and /etc/init.d/olsrd for IPv4"
++ warn " /etc/config/olsrd6 and /etc/init.d/olsrd6 for IPv6"
++
++ bindv6only="$(sysctl -n net.ipv6.bindv6only)"
++ sysctl -w net.ipv6.bindv6only=1 > /dev/null
++ sed -e '/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/d' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv6
++ sed -e 's/^IpVersion[ ][ ]*6$/IpVersion 4/' -e 's/^\t\t[A-Fa-f0-9.:]*[:][A-Fa-f0-9.:]*[ ][0-9]*$//' < "$OLSRD_CONFIG_FILE" > /var/etc/olsrd.conf.ipv4
++ rm $OLSRD_CONFIG_FILE
++
++ # some filenames should get the suffix .ipv6
++ for file in $latlon_file $hosts_file $services_file $resolv_file $macs_file $wd_file;do
++ f=$(echo $file|sed 's/\//\\\//g')
++ sed -i "s/$f/$f.ipv6/g" /var/etc/olsrd.conf.ipv6
++ done
++
++ SERVICE_PID_FILE="$PID6"
++ if service_check /usr/sbin/olsrd; then
++ error "there is already an IPv6 instance of olsrd running (pid: '$(cat $PID6)'), not starting."
++ else
++ service_start /usr/sbin/olsrd -f /var/etc/olsrd.conf.ipv6 -nofork
++ fi
++
++ SERVICE_PID_FILE="$PID"
++ if service_check /usr/sbin/olsrd; then
++ error "there is already an IPv4 instance of olsrd running (pid: '$(cat $PID)'), not starting."
++ else
++ service_start /usr/sbin/olsrd -f /var/etc/olsrd.conf.ipv4 -nofork
++ fi
++
++ sleep 3
++ sysctl -w net.ipv6.bindv6only="$bindv6only" > /dev/null
++ else
++ SERVICE_PID_FILE="$PID"
++ if service_check /usr/sbin/olsrd; then
++ error "there is already an instance of $UCI_CONF_NAME running (pid: '$(cat $PID)'), not starting."
++ return 1
++ else
++ service_start /usr/sbin/olsrd -f "$OLSRD_CONFIG_FILE" -nofork
++ sleep 1
++ service_check /usr/sbin/olsrd || {
++ log "startup-error: check via: '/usr/sbin/olsrd -f \"$OLSRD_CONFIG_FILE\" -nofork'"
++ }
++ fi
++ fi
++
++ olsrd_setup_smartgw_rules
++}
++
++stop() {
++ SERVICE_PID_FILE="$PID"
++ service_stop /usr/sbin/olsrd
++
++ #6and4: backward compatibility
++ SERVICE_PID_FILE="$PID6"
++ service_stop /usr/sbin/olsrd
++}
+diff --git a/feeds/routing/olsrd/files/olsrd.pud.position.conf b/feeds/routing/olsrd/files/olsrd.pud.position.conf
+new file mode 100644
+index 0000000..0ab0fb7
+--- /dev/null
++++ b/feeds/routing/olsrd/files/olsrd.pud.position.conf
+@@ -0,0 +1,51 @@
++#
++# OLSrd PUD plugin position configuration file
++#
++
++# GPS operating mode.
++# Values : bad, 2d, 3d
++# Default: bad
++# Note : a value of 'bad' will make the resulting position information invalid
++# (the mask will indicate that all other information is not present)
++#fix = bad
++
++# GPS quality indicator.
++# Values : bad, low, mid, high
++# Default: high
++#sig = high
++
++# HDOP (Horizontal Dilution Of Precision)
++# Values : floating point value
++# Default: 0.0
++# Note : From HDOP, VDOP and PDOP are determined: VDOP = HDOP, and PDOP = sqrt(2) * HDOP.
++#hdop = 0.0
++
++# Latitude
++# Values : floating point value
++# Unit is NMEA like latitude: ddmm.sssss (d=degrees, m=minutes, s=seconds)
++# Default: 0000.00000
++#lat = 0000.00000
++
++# Longitude
++# Values: floating point value
++# Unit is NMEA like longitude: dddmm.sssss (d=degrees, m=minutes, s=seconds)
++# Default: 00000.00000
++#lon = 00000.00000
++
++# Elevation
++# Values: floating point value
++# Unit is meters above the mean sea level (geoid)
++# Default: 0.0
++#elv = 0.0
++
++# Speed
++# Values: floating point value
++# Unit is over the ground in kph
++# Default: 0.0
++#speed = 0.0
++
++# Direction/Track
++# Values: floating point value
++# Unit is (compass) degrees
++# Default: 0.0
++#direction = 0.0
+diff --git a/feeds/routing/olsrd/files/olsrd.sgw.speed.conf b/feeds/routing/olsrd/files/olsrd.sgw.speed.conf
+new file mode 100644
+index 0000000..ae795d8
+--- /dev/null
++++ b/feeds/routing/olsrd/files/olsrd.sgw.speed.conf
+@@ -0,0 +1,14 @@
++#
++# OLSrd Smart Gateway uplink speed configuration file
++#
++
++
++#
++# Upstream speed in kilobit/s
++# Default: 128
++#upstream=128
++
++#
++# Downstream speed in kilobit/s
++# Default: 1024
++#downstream=1024
+diff --git a/feeds/routing/olsrd/files/olsrd4.init b/feeds/routing/olsrd/files/olsrd4.init
+new file mode 100644
+index 0000000..718b3e0
+--- /dev/null
++++ b/feeds/routing/olsrd/files/olsrd4.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008-2013 OpenWrt.org
++
++. $IPKG_INSTROOT/lib/functions/olsrd.sh
++
++START=65
++
++SERVICE_DAEMONIZE=1
++SERVICE_WRITE_PID=1
++
++CONF=/var/etc/olsrd.conf
++PID=/var/run/olsrd.pid
++
++UCI_CONF_NAME=olsrd
+diff --git a/feeds/routing/olsrd/files/olsrd6.config b/feeds/routing/olsrd/files/olsrd6.config
+new file mode 100644
+index 0000000..37349e4
+--- /dev/null
++++ b/feeds/routing/olsrd/files/olsrd6.config
+@@ -0,0 +1,11 @@
++config olsrd
++ # uncomment the following line to use a custom config file instead:
++ #option config_file '/etc/olsrd6.conf'
++
++config LoadPlugin
++ option library 'olsrd_txtinfo.so.0.1'
++ option accept '::'
++ option port '2007'
++
++config Interface
++ list interface 'wlan'
+diff --git a/feeds/routing/olsrd/files/olsrd6.init b/feeds/routing/olsrd/files/olsrd6.init
+new file mode 100644
+index 0000000..1dcc4a0
+--- /dev/null
++++ b/feeds/routing/olsrd/files/olsrd6.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008-2013 OpenWrt.org
++
++. $IPKG_INSTROOT/lib/functions/olsrd.sh
++
++START=65
++
++SERVICE_DAEMONIZE=1
++SERVICE_WRITE_PID=1
++
++CONF=/var/etc/olsrd6.conf
++PID=/var/run/olsrd6.pid
++
++UCI_CONF_NAME=olsrd6
+diff --git a/feeds/routing/olsrd/files/olsrd_secure_key b/feeds/routing/olsrd/files/olsrd_secure_key
+new file mode 100644
+index 0000000..4a7d725
+--- /dev/null
++++ b/feeds/routing/olsrd/files/olsrd_secure_key
+@@ -0,0 +1 @@
++1234567890123456
+\ No newline at end of file
+diff --git a/feeds/routing/oonf-dlep-proxy/Makefile b/feeds/routing/oonf-dlep-proxy/Makefile
+new file mode 100644
+index 0000000..ed9a52f
+--- /dev/null
++++ b/feeds/routing/oonf-dlep-proxy/Makefile
+@@ -0,0 +1,67 @@
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=oonf-dlep-proxy
++PKG_VERSION:=0.9.2
++PKG_REV:=d1780791bd449f578a37a2b3103682169d9a01a9
++PKG_RELEASE:=$(PKG_REV)
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://olsr.org/git/oonf.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++
++CMAKE_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++CMAKE_OPTIONS=-D OONF_NO_WERROR:Bool=true \
++ -D OONF_LOGGING_LEVEL:String=debug \
++ -D OONF_NO_TESTING:Bool=true \
++ -D UCI:Bool=true \
++ -D OONF_APP_DEFAULT_CFG_HANDLER:String=uci \
++ -D OONF_STATIC_PLUGINS:String="class;clock;interface;layer2;packet_socket;socket;stream_socket;telnet;timer;viewer;os_clock;os_socket;os_interface;os_system;nl80211_listener;layer2info;systeminfo;cfg_uciloader;cfg_compact;dlep_proxy" \
++ -D OONF_LIB_GIT:String=v$(PKG_VERSION)-archive \
++ -D OONF_VERSION:String=$(PKG_VERSION) \
++ -D INSTALL_LIB_DIR:Path=lib/oonf \
++ -D INSTALL_INCLUDE_DIR:Path=include/oonf \
++ -D INSTALL_CMAKE_DIR:Path=lib/oonf \
++ -D CMAKE_PREFIX_PATH=$(STAGING_DIR)/usr
++
++define Package/oonf-git/template
++ SECTION:=net
++ CATEGORY:=Network
++ MAINTAINER:=Henning Rogge <hrogge@gmail.com>
++ SUBMENU:=OLSR.org network framework
++ URL:=http://www.olsr.org/
++endef
++
++define Package/oonf-dlep-proxy
++ $(call Package/oonf-git/template)
++ TITLE:= Build DLEP Radio+Router Agent
++ DEPENDS:=+librt +libnl-tiny +libuci +oonf-init-scripts
++ VERSION:=$(PKG_VERSION)
++endef
++
++Build/Compile=$(call Build/Compile/Default,dlep_radio_static)
++Build/Install=
++
++define Build/Install
++ $(INSTALL_BIN) -D $(PKG_BUILD_DIR)/$(MAKE_PATH)/dlep_radio_static $(PKG_INSTALL_DIR)/usr/sbin/dlep_proxy;
++endef
++
++TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include -I${STAGING_DIR}/usr/include/libnl-tiny
++
++define Package/oonf-dlep-proxy/install
++ $(INSTALL_BIN) -D $(PKG_BUILD_DIR)/dlep_radio_static $(1)/usr/sbin/dlep_proxy
++ $(INSTALL_BIN) -D ./files/dlep_proxy.init $(1)/etc/init.d/dlep_proxy
++ $(INSTALL_BIN) -D ./files/dlep_proxy.hotplug $(1)/etc/hotplug.d/iface/50-dlep_proxy
++ $(INSTALL_DATA) -D ./files/dlep_proxy.uci $(1)/etc/config/dlep_proxy
++endef
++
++define Package/oonf-dlep-proxy/conffiles
++/etc/config/dlep_proxy
++endef
++
++$(eval $(call BuildPackage,oonf-dlep-proxy))
+diff --git a/feeds/routing/oonf-dlep-proxy/files/dlep_proxy.hotplug b/feeds/routing/oonf-dlep-proxy/files/dlep_proxy.hotplug
+new file mode 100755
+index 0000000..3ebe1b7
+--- /dev/null
++++ b/feeds/routing/oonf-dlep-proxy/files/dlep_proxy.hotplug
+@@ -0,0 +1,5 @@
++#!/bin/sh
++
++DAEMON='dlep_proxy'
++
++. /lib/functions/oonf_hotplug.sh
+diff --git a/feeds/routing/oonf-dlep-proxy/files/dlep_proxy.init b/feeds/routing/oonf-dlep-proxy/files/dlep_proxy.init
+new file mode 100755
+index 0000000..c47ff84
+--- /dev/null
++++ b/feeds/routing/oonf-dlep-proxy/files/dlep_proxy.init
+@@ -0,0 +1,6 @@
++#!/bin/sh /etc/rc.common
++
++START=82
++DAEMON='dlep_proxy'
++
++. /lib/functions/oonf_init.sh
+diff --git a/feeds/routing/oonf-dlep-proxy/files/dlep_proxy.uci b/feeds/routing/oonf-dlep-proxy/files/dlep_proxy.uci
+new file mode 100644
+index 0000000..72a4d7d
+--- /dev/null
++++ b/feeds/routing/oonf-dlep-proxy/files/dlep_proxy.uci
+@@ -0,0 +1,24 @@
++config global
++ option 'failfast' 'no'
++ option 'pidfile' '/var/run/dlep_proxy.pid'
++ option 'lockfile' '/var/lock/dlep_proxy'
++
++config log
++ option 'syslog' 'true'
++ option 'stderr' 'true'
++# option 'file' '/var/log/dlep_proxy.log'
++# option 'info' 'all'
++# option 'debug' 'all'
++
++config telnet
++# option 'port' '2009'
++
++#config dlep_radio
++# list 'name' 'eth0'
++# option 'datapath_if' 'eth1'
++# option 'not_proxied' 'false'
++# option 'proxied' 'true'
++
++#config dlep-router
++# list 'name' 'eth0'
++# option 'datapath_if' 'eth0'
+diff --git a/feeds/routing/oonf-dlep-radio/Makefile b/feeds/routing/oonf-dlep-radio/Makefile
+new file mode 100644
+index 0000000..aedf2da
+--- /dev/null
++++ b/feeds/routing/oonf-dlep-radio/Makefile
+@@ -0,0 +1,67 @@
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=oonf-dlep-radio
++PKG_VERSION:=0.9.2
++PKG_REV:=d1780791bd449f578a37a2b3103682169d9a01a9
++PKG_RELEASE:=$(PKG_REV)
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://olsr.org/git/oonf.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++
++CMAKE_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++CMAKE_OPTIONS=-D OONF_NO_WERROR:Bool=true \
++ -D OONF_LOGGING_LEVEL:String=debug \
++ -D OONF_NO_TESTING:Bool=true \
++ -D UCI:Bool=true \
++ -D OONF_APP_DEFAULT_CFG_HANDLER:String=uci \
++ -D OONF_STATIC_PLUGINS:String="class;clock;interface;layer2;packet_socket;socket;stream_socket;telnet;timer;viewer;os_clock;os_socket;os_interface;os_system;nl80211_listener;layer2info;systeminfo;cfg_uciloader;cfg_compact;dlep_radio" \
++ -D OONF_LIB_GIT:String=v$(PKG_VERSION)-archive \
++ -D OONF_VERSION:String=$(PKG_VERSION) \
++ -D INSTALL_LIB_DIR:Path=lib/oonf \
++ -D INSTALL_INCLUDE_DIR:Path=include/oonf \
++ -D INSTALL_CMAKE_DIR:Path=lib/oonf \
++ -D CMAKE_PREFIX_PATH=$(STAGING_DIR)/usr
++
++define Package/oonf-git/template
++ SECTION:=net
++ CATEGORY:=Network
++ MAINTAINER:=Henning Rogge <hrogge@gmail.com>
++ SUBMENU:=OLSR.org network framework
++ URL:=http://www.olsr.org/
++endef
++
++define Package/oonf-dlep-radio
++ $(call Package/oonf-git/template)
++ TITLE:= Build DLEP Radio Agent
++ DEPENDS:=+librt +libnl-tiny +libuci +oonf-init-scripts
++ VERSION:=$(PKG_VERSION)
++endef
++
++Build/Compile=$(call Build/Compile/Default,dlep_radio_static)
++Build/Install=
++
++define Build/Install
++ $(INSTALL_BIN) -D $(PKG_BUILD_DIR)/$(MAKE_PATH)/dlep_radio_static $(PKG_INSTALL_DIR)/usr/sbin/dlep_radio;
++endef
++
++TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include -I${STAGING_DIR}/usr/include/libnl-tiny
++
++define Package/oonf-dlep-radio/install
++ $(INSTALL_BIN) -D $(PKG_BUILD_DIR)/dlep_radio_static $(1)/usr/sbin/dlep_radio
++ $(INSTALL_BIN) -D ./files/dlep_radio.init $(1)/etc/init.d/dlep_radio
++ $(INSTALL_BIN) -D ./files/dlep_radio.hotplug $(1)/etc/hotplug.d/iface/50-dlep_radio
++ $(INSTALL_DATA) -D ./files/dlep_radio.uci $(1)/etc/config/dlep_radio
++endef
++
++define Package/oonf-dlep-radio/conffiles
++/etc/config/dlep_radio
++endef
++
++$(eval $(call BuildPackage,oonf-dlep-radio))
+diff --git a/feeds/routing/oonf-dlep-radio/files/dlep_radio.hotplug b/feeds/routing/oonf-dlep-radio/files/dlep_radio.hotplug
+new file mode 100755
+index 0000000..b7146a4
+--- /dev/null
++++ b/feeds/routing/oonf-dlep-radio/files/dlep_radio.hotplug
+@@ -0,0 +1,5 @@
++#!/bin/sh
++
++DAEMON='dlep_radio'
++
++. /lib/functions/oonf_hotplug.sh
+diff --git a/feeds/routing/oonf-dlep-radio/files/dlep_radio.init b/feeds/routing/oonf-dlep-radio/files/dlep_radio.init
+new file mode 100755
+index 0000000..c660a21
+--- /dev/null
++++ b/feeds/routing/oonf-dlep-radio/files/dlep_radio.init
+@@ -0,0 +1,6 @@
++#!/bin/sh /etc/rc.common
++
++START=82
++DAEMON='dlep_radio'
++
++. /lib/functions/oonf_init.sh
+diff --git a/feeds/routing/oonf-dlep-radio/files/dlep_radio.uci b/feeds/routing/oonf-dlep-radio/files/dlep_radio.uci
+new file mode 100644
+index 0000000..2f1ac9b
+--- /dev/null
++++ b/feeds/routing/oonf-dlep-radio/files/dlep_radio.uci
+@@ -0,0 +1,24 @@
++config global
++ option 'failfast' 'no'
++ option 'pidfile' '/var/run/dlep_radio.pid'
++ option 'lockfile' '/var/lock/dlep_radio'
++
++config log
++ option 'syslog' 'true'
++ option 'stderr' 'true'
++# option 'file' '/var/log/dlep_radio.log'
++# option 'info' 'all'
++# option 'debug' 'all'
++
++config telnet
++# option 'port' '2009'
++
++config dlep_radio
++ list 'name' 'wlan0'
++ option 'datapath_if' 'br-lan'
++ option 'not_proxied' 'false'
++ option 'proxied' 'true'
++
++config nl80211_listener
++ option 'if' 'wlan0'
++ option 'interval' '1.0'
+diff --git a/feeds/routing/oonf-init-scripts/Makefile b/feeds/routing/oonf-init-scripts/Makefile
+new file mode 100644
+index 0000000..8bfbf6e
+--- /dev/null
++++ b/feeds/routing/oonf-init-scripts/Makefile
+@@ -0,0 +1,36 @@
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=oonf-init-scripts
++PKG_VERSION:=0.9.1-r3
++PKG_RELEASE:=1
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/oonf-init-scripts
++ SECTION:=net
++ CATEGORY:=Network
++ MAINTAINER:=Henning Rogge <hrogge@gmail.com>
++ SUBMENU:=OLSR.org network framework
++ URL:=http://www.olsr.org/
++ TITLE:= Common OONF startup scripts
++ VERSION:=$(PKG_VERSION)
++endef
++
++define Build/Prepare
++ mkdir -p $(PKG_BUILD_DIR)
++endef
++
++define Build/Configure
++endef
++
++define Build/Compile
++endef
++
++define Package/oonf-init-scripts/install
++ $(INSTALL_BIN) -D ./files/oonf_init.sh $(1)/lib/functions/oonf_init.sh
++ $(INSTALL_BIN) -D ./files/oonf_hotplug.sh $(1)/lib/functions/oonf_hotplug.sh
++endef
++
++$(eval $(call BuildPackage,oonf-init-scripts))
+diff --git a/feeds/routing/oonf-init-scripts/files/oonf_hotplug.sh b/feeds/routing/oonf-init-scripts/files/oonf_hotplug.sh
+new file mode 100755
+index 0000000..b230b94
+--- /dev/null
++++ b/feeds/routing/oonf-init-scripts/files/oonf_hotplug.sh
+@@ -0,0 +1,10 @@
++#!/bin/sh
++
++case "${ACTION}" in
++ ifup)
++ . /etc/rc.common /etc/init.d/${DAEMON} enabled && {
++ logger -t '${DAEMON}[hotplug]' -p daemon.info 'reloading configuration'
++ . /etc/rc.common /etc/init.d/${DAEMON} reload
++ }
++ ;;
++esac
+diff --git a/feeds/routing/oonf-init-scripts/files/oonf_init.sh b/feeds/routing/oonf-init-scripts/files/oonf_init.sh
+new file mode 100755
+index 0000000..8ab5b3b
+--- /dev/null
++++ b/feeds/routing/oonf-init-scripts/files/oonf_init.sh
+@@ -0,0 +1,120 @@
++#!/bin/sh
++
++. /usr/share/libubox/jshn.sh
++
++oonf_log()
++{
++ logger -s -t ${DAEMON} -p daemon.info "${1}"
++}
++
++oonf_get_layer3_device()
++{
++ local interface="${1}" # e.g. 'mywifi'
++ local status dev proto
++ local query="{ \"interface\" : \"${interface}\" }"
++
++ status="$( ubus -S call network.interface status "${query}" )" && {
++ json_load "${status}"
++ json_get_var 'dev' l3_device
++ json_get_var 'proto' proto
++ case "${proto}" in
++ pppoe)
++ # TODO: otherwise it segfaults
++ oonf_log "refusing to add '$interface', because of proto '${proto}'"
++ ;;
++ *)
++ echo "${dev}" # e.g. 'wlan0-1'
++ ;;
++ esac
++ }
++}
++
++oonf_add_devices_to_configuration()
++{
++ local i=0
++ local device_name= section= interface= single_interface=
++
++ # make a copy of configuration and
++ # add a 'name' (physical name) for all
++ # 'interface-names' (e.g. mywifi)
++ #
++ # olsrd2.@interface[2]=interface
++ # olsrd2.@interface[2].ifname='wan lan wlanadhoc wlanadhocRADIO1'
++
++ # /var is in ramdisc/tmpfs
++ uci export ${DAEMON} >"/var/run/${DAEMON}_dev"
++
++ while section="$( uci -q -c /etc/config get "${DAEMON}.@[${i}]" )"; do {
++ echo "section: ${section}"
++
++ interface="$( uci -q -c /etc/config get "${DAEMON}.@[${i}].ifname" )" || {
++ i=$(( i + 1 ))
++ continue
++ }
++
++ case "$( uci -q get "${DAEMON}.@[${i}].ignore" )" in
++ 1|on|true|enabled|yes)
++ oonf_log "removing/ignore section '$section'"
++ uci -q -c /var/run delete "${DAEMON}_dev.@[${j}]"
++ i=$(( i + 1 ))
++
++ continue
++ ;;
++ esac
++
++ for single_interface in ${interface}; do {
++ device_name="$( oonf_get_layer3_device "${single_interface}" )"
++
++ echo "Interface: ${single_interface} = ${device_name}"
++
++ if [ ! -z "${device_name}" ]
++ then
++ # add option 'name' for 'ifname' (e.g. 'mywifi')
++ uci -q -c /var/run add_list "${DAEMON}_dev.@[${i}].name=${device_name}"
++ fi
++ } done
++ i=$(( $i + 1 ))
++ } done
++
++ uci -q -c /var/run commit "${DAEMON}_dev"
++
++ oonf_log "wrote '/var/run/${DAEMON}_dev'"
++}
++
++oonf_reread_config()
++{
++ local pid
++ local pidfile="/var/run/${DAEMON}.pid"
++
++ if [ -e "${pidfile}" ]; then
++ read pid <"${pidfile}"
++ elif pidfile="$( uci -q get "${DAEMON}.@global[0].pidfile" )"; then
++ read pid <"${pidfile}"
++ fi
++
++ # if empty, ask kernel
++ pid="${pid:-$( pidof ${DAEMON} )}"
++
++ [ -n "${pid}" ] && kill -SIGHUP ${pid}
++}
++
++start()
++{
++ oonf_add_devices_to_configuration
++
++ # produce coredumps
++ ulimit -c unlimited
++
++ service_start /usr/sbin/${DAEMON} --set global.fork=true --load uci:///var/run/${DAEMON}_dev
++}
++
++stop()
++{
++ service_stop /usr/sbin/${DAEMON}
++}
++
++reload()
++{
++ oonf_add_devices_to_configuration
++ oonf_reread_config
++}
+diff --git a/feeds/routing/oonf-olsrd2/Makefile b/feeds/routing/oonf-olsrd2/Makefile
+new file mode 100644
+index 0000000..3cfd321
+--- /dev/null
++++ b/feeds/routing/oonf-olsrd2/Makefile
+@@ -0,0 +1,67 @@
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=oonf-olsrd2
++PKG_VERSION:=0.9.2
++PKG_REV:=d1780791bd449f578a37a2b3103682169d9a01a9
++PKG_RELEASE:=$(PKG_REV)
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://olsr.org/git/oonf.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++
++CMAKE_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++CMAKE_OPTIONS=-D OONF_NO_WERROR:Bool=true \
++ -D OONF_LOGGING_LEVEL:String=debug \
++ -D OONF_NO_TESTING:Bool=true \
++ -D UCI:Bool=true \
++ -D OONF_APP_DEFAULT_CFG_HANDLER:String=uci \
++ -D OONF_STATIC_PLUGINS:String="class;clock;duplicate_set;interface;layer2;packet_socket;rfc5444;socket;stream_socket;telnet;timer;viewer;os_clock;os_socket;os_interface;os_routing;os_system;nhdp;olsrv2;ff_dat_metric;neighbor_probing;nl80211_listener;link_config;layer2info;systeminfo;cfg_uciloader;cfg_compact;nhdpinfo;olsrv2info;netjsoninfo" \
++ -D OONF_LIB_GIT:String=v$(PKG_VERSION)-archive \
++ -D OONF_VERSION:String=$(PKG_VERSION) \
++ -D INSTALL_LIB_DIR:Path=lib/oonf \
++ -D INSTALL_INCLUDE_DIR:Path=include/oonf \
++ -D INSTALL_CMAKE_DIR:Path=lib/oonf \
++ -D CMAKE_PREFIX_PATH=$(STAGING_DIR)/usr
++
++define Package/oonf-git/template
++ SECTION:=net
++ CATEGORY:=Network
++ MAINTAINER:=Henning Rogge <hrogge@gmail.com>
++ SUBMENU:=OLSR.org network framework
++ URL:=http://www.olsr.org/
++endef
++
++define Package/oonf-olsrd2
++ $(call Package/oonf-git/template)
++ TITLE:= Build Olsrd V2 Routing Agent
++ DEPENDS:=+librt +libnl-tiny +libuci +oonf-init-scripts
++ VERSION:=$(PKG_VERSION)
++endef
++
++Build/Compile=$(call Build/Compile/Default,olsrd2_static)
++Build/Install=
++
++define Build/Install
++ $(INSTALL_BIN) -D $(PKG_BUILD_DIR)/$(MAKE_PATH)/olsrd2_static $(PKG_INSTALL_DIR)/usr/sbin/olsrd2;
++endef
++
++TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include -I${STAGING_DIR}/usr/include/libnl-tiny
++
++define Package/oonf-olsrd2/install
++ $(INSTALL_BIN) -D $(PKG_BUILD_DIR)/olsrd2_static $(1)/usr/sbin/olsrd2
++ $(INSTALL_BIN) -D ./files/olsrd2.init $(1)/etc/init.d/olsrd2
++ $(INSTALL_BIN) -D ./files/olsrd2.hotplug $(1)/etc/hotplug.d/iface/50-olsrd2
++ $(INSTALL_DATA) -D ./files/olsrd2.uci $(1)/etc/config/olsrd2
++endef
++
++define Package/oonf-olsrd2/conffiles
++/etc/config/olsrd2
++endef
++
++$(eval $(call BuildPackage,oonf-olsrd2))
+diff --git a/feeds/routing/oonf-olsrd2/files/olsrd2.hotplug b/feeds/routing/oonf-olsrd2/files/olsrd2.hotplug
+new file mode 100755
+index 0000000..3a277ce
+--- /dev/null
++++ b/feeds/routing/oonf-olsrd2/files/olsrd2.hotplug
+@@ -0,0 +1,5 @@
++#!/bin/sh
++
++DAEMON='olsrd2'
++
++. /lib/functions/oonf_hotplug.sh
+diff --git a/feeds/routing/oonf-olsrd2/files/olsrd2.init b/feeds/routing/oonf-olsrd2/files/olsrd2.init
+new file mode 100755
+index 0000000..debae98
+--- /dev/null
++++ b/feeds/routing/oonf-olsrd2/files/olsrd2.init
+@@ -0,0 +1,6 @@
++#!/bin/sh /etc/rc.common
++
++START=82
++DAEMON='olsrd2'
++
++. /lib/functions/oonf_init.sh
+diff --git a/feeds/routing/oonf-olsrd2/files/olsrd2.uci b/feeds/routing/oonf-olsrd2/files/olsrd2.uci
+new file mode 100644
+index 0000000..9df4c7e
+--- /dev/null
++++ b/feeds/routing/oonf-olsrd2/files/olsrd2.uci
+@@ -0,0 +1,40 @@
++config global
++ option 'failfast' 'no'
++ option 'pidfile' '/var/run/olsrd2.pid'
++ option 'lockfile' '/var/lock/olsrd2'
++
++config log
++ option 'syslog' 'true'
++ option 'stderr' 'true'
++# option 'file' '/var/log/olsrd2.log'
++# option 'info' 'all'
++# option 'debug' 'all'
++
++config telnet
++# option 'port' '2009'
++
++config olsrv2
++# list 'lan' '::/0'
++# list 'lan' '0.0.0.0/0'
++
++config interface
++ option 'ifname' 'loopback'
++
++config interface
++ list 'ifname' 'WIFI'
++ list 'ifname' 'wlanadhoc'
++ list 'ifname' 'wlanadhocRADIO1'
++
++config interface
++ list 'ifname' 'wan'
++ option 'ignore' '1'
++# option 'rx_bitrate' '100M'
++# option 'tx_bitrate' '100M'
++# option 'signal' '-20'
++
++config interface
++ list 'ifname' 'lan'
++ option 'ignore' '1'
++# option 'rx_bitrate' '1G'
++# option 'tx_bitrate' '1G'
++# option 'signal' '-10'
+diff --git a/feeds/routing/pimbd/Makefile b/feeds/routing/pimbd/Makefile
+new file mode 100644
+index 0000000..55aec74
+--- /dev/null
++++ b/feeds/routing/pimbd/Makefile
+@@ -0,0 +1,48 @@
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pimbd
++PKG_SOURCE_VERSION:=68f5fc803119e4b33a88b35c096f4d6ac28b6de5
++PKG_VERSION:=2015-08-18-$(PKG_SOURCE_VERSION)
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=https://github.com/Oryon/pimbd.git
++PKG_MAINTAINER:=Pierre Pfister <pierre.pfister@darou.fr>
++PKG_LICENSE:=Apache-2.0
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/cmake.mk
++
++# Spammy debug builds for now
++CMAKE_OPTIONS += -DL_LEVEL=7
++
++define Package/pimbd
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=PIM BIDIR daemon
++ URL:=https://github.com/Oryon/pimbd.git
++ DEPENDS+=+@IPV6
++ DEPENDS+=netifd
++endef
++
++define Package/pimbd/description
++This package provides a daemon which implements the Protocol Independent
++Multicast BIDIR routing protocol. Note that a routing protocol must be
++installed and running in order for PIM to function.
++endef
++
++define Package/pimbd/install
++ $(INSTALL_DIR) $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/pimbd $(1)/usr/sbin/pimbd
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/generic/pimbc.sh $(1)/usr/sbin/pimbc
++ ln -s pimbd $(1)/usr/sbin/pimb-ipc
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/pimbd.init $(1)/etc/init.d/pimbd
++ $(INSTALL_DIR) $(1)/etc/uci-defaults
++ $(INSTALL_BIN) files/firewall-uci.sh $(1)/etc/uci-defaults/99_pimbd_firewall
++endef
++
++$(eval $(call BuildPackage,pimbd))
+diff --git a/feeds/routing/pimbd/files/firewall-uci.sh b/feeds/routing/pimbd/files/firewall-uci.sh
+new file mode 100644
+index 0000000..5ee20b3
+--- /dev/null
++++ b/feeds/routing/pimbd/files/firewall-uci.sh
+@@ -0,0 +1,22 @@
++#!/bin/sh
++
++pim_rule () {
++uci -q batch <<-EOT
++ delete firewall.$1
++ set firewall.$1=rule
++ set firewall.$1.name='$2 multicast forward for $3'
++ set firewall.$1.src='*'
++ set firewall.$1.dest='*'
++ set firewall.$1.family='$2'
++ set firewall.$1.proto='udp'
++ set firewall.$1.dest_ip='$3'
++ set firewall.$1.target='ACCEPT'
++EOT
++}
++
++pim_rule pimbd4 ipv4 224.0.0.0/4
++pim_rule pimbd6 ipv6 ff00::/8
++uci commit firewall
++
++exit 0
++
+diff --git a/feeds/routing/pimbd/files/pimbd.init b/feeds/routing/pimbd/files/pimbd.init
+new file mode 100644
+index 0000000..20b27bd
+--- /dev/null
++++ b/feeds/routing/pimbd/files/pimbd.init
+@@ -0,0 +1,21 @@
++#!/bin/sh /etc/rc.common
++
++START=90
++STOP=10
++USE_PROCD=1
++
++start_service() {
++ . /lib/functions.sh
++ . /lib/functions/network.sh
++ config_load pimb
++
++ procd_open_instance
++ procd_set_param command /usr/sbin/pimbd
++ procd_append_param command -S
++ procd_append_param command -L 6
++
++ procd_set_param respawn
++ procd_close_instance
++}
++
++
+diff --git a/feeds/routing/quagga/Makefile b/feeds/routing/quagga/Makefile
+new file mode 100644
+index 0000000..67eedd6
+--- /dev/null
++++ b/feeds/routing/quagga/Makefile
+@@ -0,0 +1,305 @@
++#
++# Copyright (C) 2006-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=quagga
++PKG_VERSION:=0.99.22.4
++PKG_RELEASE:=2
++PKG_MD5SUM:=03ef24a448be47beba80efa2152f8a28
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=http://download.savannah.gnu.org/releases/quagga/
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_IPV6 \
++ CONFIG_PACKAGE_quagga-watchquagga \
++ CONFIG_PACKAGE_quagga-zebra \
++ CONFIG_PACKAGE_quagga-libzebra \
++ CONFIG_PACKAGE_quagga-libospf \
++ CONFIG_PACKAGE_quagga-bgpd \
++ CONFIG_PACKAGE_quagga-isisd \
++ CONFIG_PACKAGE_quagga-ospf6d \
++ CONFIG_PACKAGE_quagga-ripd \
++ CONFIG_PACKAGE_quagga-ripngd \
++ CONFIG_PACKAGE_quagga-babeld \
++ CONFIG_PACKAGE_quagga-vtysh
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_LICENSE:=GPL-2.0
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/quagga/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ DEPENDS:=quagga
++ TITLE:=The Quagga Software Routing Suite
++ URL:=http://www.quagga.net
++ MAINTAINER:=Vasilis Tsiligiannis <b_tsiligiannis@silverton.gr>
++endef
++
++define Package/quagga
++ $(call Package/quagga/Default)
++ DEPENDS:=+librt
++ MENU:=1
++endef
++
++define Package/quagga/description
++ A routing software package that provides TCP/IP based routing services
++ with routing protocols support such as RIPv1, RIPv2, RIPng, OSPFv2,
++ OSPFv3, BGP-4, and BGP-4+
++endef
++
++define Package/quagga-watchquagga
++ $(call Package/quagga/Default)
++ TITLE:=Quagga watchdog
++ DEPENDS+=+quagga-libzebra
++ DEFAULT:=y if PACKAGE_quagga
++endef
++
++define Package/quagga-zebra
++ $(call Package/quagga/Default)
++ TITLE:=Zebra daemon
++ DEPENDS+=+quagga-libzebra
++ DEFAULT:=y if PACKAGE_quagga
++endef
++
++define Package/quagga-libzebra
++ $(call Package/quagga/Default)
++ TITLE:=zebra library
++endef
++
++define Package/quagga-libospf
++ $(call Package/quagga/Default)
++ TITLE:=OSPF library
++endef
++
++define Package/quagga-bgpd
++ $(call Package/quagga/Default)
++ DEPENDS+=+quagga-libzebra
++ TITLE:=BGPv4, BGPv4+, BGPv4- routing engine
++endef
++
++define Package/quagga-isisd
++ $(call Package/quagga/Default)
++ DEPENDS+=+quagga-libzebra
++ TITLE:=IS-IS routing engine
++endef
++
++define Package/quagga-ospfd
++ $(call Package/quagga/Default)
++ DEPENDS+=+quagga-libospf +quagga-libzebra
++ TITLE:=OSPFv2 routing engine
++endef
++
++define Package/quagga-ospf6d
++ $(call Package/quagga/Default)
++ DEPENDS+=+quagga-libospf +quagga-libzebra @IPV6
++ TITLE:=OSPFv3 routing engine
++endef
++
++define Package/quagga-ripd
++ $(call Package/quagga/Default)
++ DEPENDS+=+quagga-libzebra
++ TITLE:=RIP routing engine
++endef
++
++define Package/quagga-ripngd
++ $(call Package/quagga/Default)
++ DEPENDS+=+quagga-libzebra @IPV6
++ TITLE:=RIPNG routing engine
++endef
++
++define Package/quagga-babeld
++ $(call Package/quagga/Default)
++ DEPENDS+=+quagga-libzebra @IPV6
++ TITLE:=Babel routing engine
++endef
++
++define Package/quagga-vtysh
++ $(call Package/quagga/Default)
++ DEPENDS+=+quagga-libzebra +libreadline +libncurses
++ TITLE:=integrated shell for Quagga routing software
++endef
++
++define Package/quagga-zebra/conffiles
++/etc/quagga/zebra.conf
++endef
++
++define Package/quagga-bgpd/conffiles
++/etc/quagga/bgpd.conf
++endef
++
++define Package/quagga-isisd/conffiles
++/etc/quagga/isisd.conf
++endef
++
++define Package/quagga-ospfd/conffiles
++/etc/quagga/ospfd.conf
++endef
++
++define Package/quagga-ospf6d/conffiles
++/etc/quagga/ospf6d.conf
++endef
++
++define Package/quagga-ripd/conffiles
++/etc/quagga/ripd.conf
++endef
++
++define Package/quagga-ripngd/conffiles
++/etc/quagga/ripngd.conf
++endef
++
++define Package/quagga-babeld/conffiles
++/etc/quagga/babeld.conf
++endef
++
++ifneq ($(SDK),)
++CONFIG_PACKAGE_quagga-libzebra:=m
++CONFIG_PACKAGE_quagga-libospf:=m
++CONFIG_PACKAGE_quagga-watchquagga:=m
++CONFIG_PACKAGE_quagga-zebra:=m
++CONFIG_PACKAGE_quagga-bgpd:=m
++CONFIG_PACKAGE_quagga-isisd:=m
++CONFIG_PACKAGE_quagga-ospf6d:=m
++CONFIG_PACKAGE_quagga-ripd:=m
++CONFIG_PACKAGE_quagga-ripngd:=m
++CONFIG_PACKAGE_quagga-babeld:=m
++CONFIG_PACKAGE_quagga-vtysh:=m
++endif
++
++CONFIGURE_ARGS+= \
++ --localstatedir=/var/run/quagga \
++ --sysconfdir=/etc/quagga/ \
++ --enable-shared \
++ --disable-static \
++ --enable-user=network \
++ --enable-group=network \
++ --enable-pie=no \
++ --enable-multipath=8 \
++ --disable-ospfclient \
++ --disable-capabilities \
++ --disable-doc \
++ $(call autoconf_bool,CONFIG_PACKAGE_quagga-libzebra,zebra) \
++ $(call autoconf_bool,CONFIG_PACKAGE_quagga-libospf,ospfd) \
++ $(call autoconf_bool,CONFIG_PACKAGE_quagga-bgpd,bgpd) \
++ $(call autoconf_bool,CONFIG_PACKAGE_quagga-isisd,isisd) \
++ $(call autoconf_bool,CONFIG_PACKAGE_quagga-ospf6d,ospf6d) \
++ $(call autoconf_bool,CONFIG_PACKAGE_quagga-ripd,ripd) \
++ $(call autoconf_bool,CONFIG_PACKAGE_quagga-ripngd,ripngd) \
++ $(call autoconf_bool,CONFIG_PACKAGE_quagga-babeld,babeld) \
++ $(call autoconf_bool,CONFIG_PACKAGE_quagga-vtysh,vtysh) \
++
++MAKE_FLAGS += \
++ CFLAGS="$(TARGET_CFLAGS) -std=gnu99"
++
++define Package/quagga/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) ./files/quagga $(1)/usr/sbin/quagga.init
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/quagga.init $(1)/etc/init.d/quagga
++endef
++
++define Package/quagga-watchquagga/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/watchquagga $(1)/usr/sbin/
++endef
++
++define Package/quagga-zebra/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/zebra $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/quagga
++ chmod 0750 $(1)/etc/quagga
++ $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/zebra.conf
++endef
++
++define Package/quagga-bgpd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/bgpd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/quagga
++ chmod 0750 $(1)/etc/quagga
++ $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/bgpd.conf
++endef
++
++define Package/quagga-isisd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/isisd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/quagga
++ chmod 0750 $(1)/etc/quagga
++ $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/isisd.conf
++endef
++
++define Package/quagga-ospfd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ospfd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/quagga
++ chmod 0750 $(1)/etc/quagga
++ $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/ospfd.conf
++endef
++
++define Package/quagga-ospf6d/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ospf6d $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/quagga
++ chmod 0750 $(1)/etc/quagga
++ $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/ospf6d.conf
++endef
++
++define Package/quagga-ripd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ripd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/quagga
++ chmod 0750 $(1)/etc/quagga
++ $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/ripd.conf
++endef
++
++define Package/quagga-ripngd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/ripngd $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/quagga
++ chmod 0750 $(1)/etc/quagga
++ $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/ripngd.conf
++endef
++
++define Package/quagga-babeld/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/babeld $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/etc/quagga
++ chmod 0750 $(1)/etc/quagga
++ $(INSTALL_CONF) ./files/quagga.conf $(1)/etc/quagga/babeld.conf
++endef
++
++define Package/quagga-vtysh/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/vtysh $(1)/usr/bin/
++endef
++
++define Package/quagga-libospf/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libospf.so.* $(1)/usr/lib/
++endef
++
++define Package/quagga-libzebra/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libzebra.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,quagga))
++$(eval $(call BuildPackage,quagga-libzebra))
++$(eval $(call BuildPackage,quagga-libospf))
++$(eval $(call BuildPackage,quagga-watchquagga))
++$(eval $(call BuildPackage,quagga-zebra))
++$(eval $(call BuildPackage,quagga-bgpd))
++$(eval $(call BuildPackage,quagga-isisd))
++$(eval $(call BuildPackage,quagga-ospfd))
++$(eval $(call BuildPackage,quagga-ospf6d))
++$(eval $(call BuildPackage,quagga-ripd))
++$(eval $(call BuildPackage,quagga-ripngd))
++$(eval $(call BuildPackage,quagga-babeld))
++$(eval $(call BuildPackage,quagga-vtysh))
+diff --git a/feeds/routing/quagga/files/quagga b/feeds/routing/quagga/files/quagga
+new file mode 100644
+index 0000000..b172090
+--- /dev/null
++++ b/feeds/routing/quagga/files/quagga
+@@ -0,0 +1,335 @@
++#!/bin/sh
++#
++# quagga Starts/stops quagga daemons and watchquagga.
++# Create a daemon.conf file to have that routing daemon
++# started/stopped automagically when using this script
++# without any daemon names as args.
++# If watchquagga is available, it will also be
++# started/stopped if the script is called without
++# any daemon names.
++#
++
++ME=$(basename $0)
++
++usage() {
++ echo "Usage: ${ME} {start|stop|restart} [daemon ...]"
++ exit 2
++}
++
++if [ -z "$1" ]
++then
++ usage
++else
++ COMMAND=$1
++fi
++shift
++ARG_DAEMONS=$*
++BINDIR=/usr/sbin
++CONFDIR=/etc/quagga
++STATEDIR=/var/run/quagga
++RUNUSER=network
++RUNGROUP=$RUNUSER
++DAEMONS="zebra ripd ripngd ospfd ospf6d bgpd"
++DAEMON_FLAGS=-d
++WATCHQUAGGA_FLAGS="-d -z -T 60 -R"
++WATCHQUAGGA_CMD="$0 watchrestart"
++if [ ${COMMAND} != "watchrestart" -a -x "${BINDIR}/watchquagga" ]
++then
++ DAEMONS="${DAEMONS} watchquagga"
++fi
++DAEMONS_STARTSEQ=${DAEMONS}
++
++reverse()
++{
++ local revlist r
++ revlist=
++ for r
++ do
++ revlist="$r $revlist"
++ done
++ echo $revlist
++}
++
++DAEMONS_STOPSEQ=$(reverse ${DAEMONS_STARTSEQ})
++
++#pidof() {
++# ps ax | awk 'match($5, "(^|/)'"$1"'$") > 0 { printf " %s", $1 }'
++#}
++
++quit() {
++ echo "${ME}: $1"
++ exit 0
++}
++
++die() {
++ echo "${ME}: $1"
++ exit 1
++}
++
++is_in() {
++ local i
++ for i in $2
++ do
++ [ "$1" = "$i" ] && return 0
++ done
++ return 1
++}
++
++select_subset() {
++ local unknown i j
++ unknown=
++ RESULT=
++ for i in $1
++ do
++ is_in $i "$2" || unknown="$unknown $i"
++ done
++ if [ -n "$unknown" ]
++ then
++ RESULT=$unknown
++ return 1
++ else
++ for j in $2
++ do
++ is_in $j "$1" && RESULT="$RESULT $j"
++ done
++ return 0
++ fi
++}
++
++# check command
++
++case ${COMMAND}
++in
++ start|stop|restart)
++ ;;
++ watchrestart)
++ if [ -n "$ARG_DAEMONS" ]
++ then
++ echo "${ME}: watchrestart mode is only for use by watchquagga"
++ exit 2
++ fi
++ ;;
++ *)
++ usage
++ ;;
++esac
++
++# select daemons to start
++
++case ${COMMAND}
++in
++ start|restart|watchrestart)
++ START_DAEMONS=
++ for d in ${DAEMONS_STARTSEQ}
++ do
++ [ -x "${BINDIR}/${d}" -a -f "${CONFDIR}/${d}.conf" ] \
++ && START_DAEMONS="${START_DAEMONS}${d} "
++ done
++ WATCHQUAGGA_DAEMONS=${START_DAEMONS}
++ if is_in watchquagga "${DAEMONS_STARTSEQ}"
++ then
++ START_DAEMONS="${START_DAEMONS} watchquagga"
++ fi
++ if [ -n "${ARG_DAEMONS}" ]
++ then
++ if select_subset "${ARG_DAEMONS}" "${DAEMONS}"
++ then
++ if select_subset "${ARG_DAEMONS}" "${START_DAEMONS}"
++ then
++ START_DAEMONS=${RESULT}
++ else
++ die "these daemons are not startable:${RESULT}."
++ fi
++ else
++ die "unknown daemons:${RESULT}; choose from: ${DAEMONS}."
++ fi
++ fi
++ ;;
++esac
++
++# select daemons to stop
++
++case ${COMMAND}
++in
++ stop|restart|watchrestart)
++ STOP_DAEMONS=${DAEMONS_STOPSEQ}
++ if [ -n "${ARG_DAEMONS}" ]
++ then
++ if select_subset "${ARG_DAEMONS}" "${STOP_DAEMONS}"
++ then
++ STOP_DAEMONS=${RESULT}
++ else
++ die "unknown daemons:${RESULT}; choose from: ${DAEMONS}."
++ fi
++ fi
++ stop_daemons=
++ for d in ${STOP_DAEMONS}
++ do
++ pidfile=${STATEDIR}/${d}.pid
++ if [ -f "${pidfile}" -o -n "$(pidof ${d})" ]
++ then
++ stop_daemons="${stop_daemons}${d} "
++ elif [ -n "${ARG_DAEMONS}" ]
++ then
++ echo "${ME}: found no ${d} process running."
++ fi
++ done
++ STOP_DAEMONS=${stop_daemons}
++ ;;
++esac
++
++# stop daemons
++
++for d in $STOP_DAEMONS
++do
++ echo -n "${ME}: Stopping ${d} ... "
++ pidfile=${STATEDIR}/${d}.pid
++ if [ -f "${pidfile}" ]
++ then
++ file_pid=$(cat ${pidfile})
++ if [ -z "${file_pid}" ]
++ then
++ echo -n "no pid file entry found ... "
++ fi
++ else
++ file_pid=
++ echo -n "no pid file found ... "
++ fi
++ proc_pid=$(pidof ${d})
++ if [ -z "${proc_pid}" ]
++ then
++ echo -n "found no ${d} process running ... "
++ else
++ count=0
++ notinpidfile=
++ for p in ${proc_pid}
++ do
++ count=$((${count}+1))
++ if kill ${p}
++ then
++ echo -n "killed ${p} ... "
++ else
++ echo -n "failed to kill ${p} ... "
++ fi
++ [ "${p}" = "${file_pid}" ] \
++ || notinpidfile="${notinpidfile} ${p}"
++ done
++ [ ${count} -le 1 ] \
++ || echo -n "WARNING: ${count} ${d} processes were found running ... "
++ for n in ${notinpidfile}
++ do
++ echo -n "WARNING: process ${n} was not in pid file ... "
++ done
++ fi
++ count=0
++ survivors=$(pidof ${d})
++ while [ -n "${survivors}" ]
++ do
++ sleep 1
++ count=$((${count}+1))
++ survivors=$(pidof ${d})
++ [ -z "${survivors}" -o ${count} -gt 5 ] && break
++ for p in ${survivors}
++ do
++ sleep 1
++ echo -n "${p} "
++ kill ${p}
++ done
++ done
++ survivors=$(pidof ${d})
++ [ -n "${survivors}" ] && \
++ if kill -KILL ${survivors}
++ then
++ echo -n "KILLed ${survivors} ... "
++ else
++ echo -n "failed to KILL ${survivors} ... "
++ fi
++ sleep 1
++ survivors=$(pidof ${d})
++ if [ -z "${survivors}" ]
++ then
++ echo -n "done."
++ if [ -f "${pidfile}" ]
++ then
++ rm -f ${pidfile} \
++ || echo -n " Failed to remove pidfile."
++ fi
++ else
++ echo -n "failed to stop ${survivors} - giving up."
++ if [ "${survivors}" != "${file_pid}" ]
++ then
++ if echo "${survivors}" > ${pidfile}
++ then
++ chown ${RUNUSER}:${RUNGROUP} ${pidfile}
++ echo -n " Wrote ${survivors} to pidfile."
++ else
++ echo -n " Failed to write ${survivors} to pidfile."
++ fi
++ fi
++ fi
++ echo
++done
++
++# start daemons
++
++if [ -n "$START_DAEMONS" ]
++then
++ [ -d ${CONFDIR} ] \
++ || quit "${ME}: no config directory ${CONFDIR} - exiting."
++ chown -R ${RUNUSER}:${RUNGROUP} ${CONFDIR}
++ [ -d ${STATEDIR} ] || mkdir -p ${STATEDIR} \
++ || die "${ME}: could not create state directory ${STATEDIR} - exiting."
++ chown -R ${RUNUSER}:${RUNGROUP} ${STATEDIR}
++
++ for d in $START_DAEMONS
++ do
++ echo -n "${ME}: Starting ${d} ... "
++ proc_pid=$(pidof ${d})
++ pidfile=${STATEDIR}/${d}.pid
++ file_pid=
++ if [ -f "${pidfile}" ]
++ then
++ file_pid=$(cat ${pidfile})
++ if [ -n "${file_pid}" ]
++ then
++ echo -n "found old pid file entry ${file_pid} ... "
++ fi
++ fi
++ if [ -n "${proc_pid}" ]
++ then
++ echo -n "found ${d} running (${proc_pid}) - skipping ${d}."
++ if [ "${proc_pid}" != "${file_pid}" ]
++ then
++ if echo "${proc_pid}" > ${pidfile}
++ then
++ chown ${RUNUSER}:${RUNGROUP} ${pidfile}
++ echo -n " Wrote ${proc_pid} to pidfile."
++ else
++ echo -n " Failed to write ${proc_pid} to pidfile."
++ fi
++ fi
++ elif rm -f "${pidfile}"
++ then
++ if [ "${d}" = "watchquagga" ]
++ then
++ "${BINDIR}/${d}" \
++ ${WATCHQUAGGA_FLAGS} \
++ "${WATCHQUAGGA_CMD}" \
++ ${WATCHQUAGGA_DAEMONS}
++ status=$?
++ else
++ "${BINDIR}/${d}" ${DAEMON_FLAGS}
++ status=$?
++ fi
++ if [ $status -eq 0 ]
++ then
++ echo -n "done."
++ else
++ echo -n "failed."
++ fi
++ else
++ echo -n " failed to remove pidfile."
++ fi
++ echo
++ done
++fi
+diff --git a/feeds/routing/quagga/files/quagga.conf b/feeds/routing/quagga/files/quagga.conf
+new file mode 100644
+index 0000000..fb7a54e
+--- /dev/null
++++ b/feeds/routing/quagga/files/quagga.conf
+@@ -0,0 +1,7 @@
++password zebra
++!
++access-list vty permit 127.0.0.0/8
++access-list vty deny any
++!
++line vty
++ access-class vty
+diff --git a/feeds/routing/quagga/files/quagga.init b/feeds/routing/quagga/files/quagga.init
+new file mode 100644
+index 0000000..21fbf2c
+--- /dev/null
++++ b/feeds/routing/quagga/files/quagga.init
+@@ -0,0 +1,11 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006 OpenWrt.org
++
++START=60
++start() {
++ /usr/sbin/quagga.init start
++}
++
++stop() {
++ /usr/sbin/quagga.init stop
++}
+diff --git a/feeds/routing/quagga/patches/110-vtysh-fix-build-against-readline-6.3.patch b/feeds/routing/quagga/patches/110-vtysh-fix-build-against-readline-6.3.patch
+new file mode 100644
+index 0000000..e8c499e
+--- /dev/null
++++ b/feeds/routing/quagga/patches/110-vtysh-fix-build-against-readline-6.3.patch
+@@ -0,0 +1,15 @@
++--- a/vtysh/vtysh.c
+++++ b/vtysh/vtysh.c
++@@ -2211,9 +2211,9 @@
++ vtysh_readline_init (void)
++ {
++ /* readline related settings. */
++- rl_bind_key ('?', (Function *) vtysh_rl_describe);
+++ rl_bind_key ('?', (rl_command_func_t *) vtysh_rl_describe);
++ rl_completion_entry_function = vtysh_completion_entry_function;
++- rl_attempted_completion_function = (CPPFunction *)new_completion;
+++ rl_attempted_completion_function = (rl_completion_func_t *) new_completion;
++ /* do not append space after completion. It will be appended
++ * in new_completion() function explicitly. */
++ rl_completion_append_character = '\0';
++
+diff --git a/feeds/routing/quagga/patches/120-quagga_manet.patch b/feeds/routing/quagga/patches/120-quagga_manet.patch
+new file mode 100644
+index 0000000..2411bd0
+--- /dev/null
++++ b/feeds/routing/quagga/patches/120-quagga_manet.patch
+@@ -0,0 +1,243 @@
++--- a/lib/log.c
+++++ b/lib/log.c
++@@ -925,13 +925,19 @@ proto_redistnum(int afi, const char *s)
++ return ZEBRA_ROUTE_STATIC;
++ else if (strncmp (s, "r", 1) == 0)
++ return ZEBRA_ROUTE_RIP;
++- else if (strncmp (s, "o", 1) == 0)
+++ else if (strncmp (s, "os", 2) == 0)
++ return ZEBRA_ROUTE_OSPF;
++ else if (strncmp (s, "i", 1) == 0)
++ return ZEBRA_ROUTE_ISIS;
++ else if (strncmp (s, "bg", 2) == 0)
++ return ZEBRA_ROUTE_BGP;
++- else if (strncmp (s, "ba", 2) == 0)
+++ else if (strncmp (s, "h", 1) == 0)
+++ return ZEBRA_ROUTE_HSLS;
+++ else if (strncmp (s, "ol", 2) == 0)
+++ return ZEBRA_ROUTE_OLSR;
+++ else if (strncmp (s, "bat", 3) == 0)
+++ return ZEBRA_ROUTE_BATMAN;
+++ else if (strncmp (s, "bab", 3) == 0)
++ return ZEBRA_ROUTE_BABEL;
++ }
++ if (afi == AFI_IP6)
++@@ -944,13 +950,19 @@ proto_redistnum(int afi, const char *s)
++ return ZEBRA_ROUTE_STATIC;
++ else if (strncmp (s, "r", 1) == 0)
++ return ZEBRA_ROUTE_RIPNG;
++- else if (strncmp (s, "o", 1) == 0)
+++ else if (strncmp (s, "os", 2) == 0)
++ return ZEBRA_ROUTE_OSPF6;
++ else if (strncmp (s, "i", 1) == 0)
++ return ZEBRA_ROUTE_ISIS;
++ else if (strncmp (s, "bg", 2) == 0)
++ return ZEBRA_ROUTE_BGP;
++- else if (strncmp (s, "ba", 2) == 0)
+++ else if (strncmp (s, "h", 1) == 0)
+++ return ZEBRA_ROUTE_HSLS;
+++ else if (strncmp (s, "ol", 2) == 0)
+++ return ZEBRA_ROUTE_OLSR;
+++ else if (strncmp (s, "bat", 3) == 0)
+++ return ZEBRA_ROUTE_BATMAN;
+++ else if (strncmp (s, "bab", 3) == 0)
++ return ZEBRA_ROUTE_BABEL;
++ }
++ return -1;
++--- a/lib/route_types.txt
+++++ b/lib/route_types.txt
++@@ -51,13 +51,9 @@ ZEBRA_ROUTE_OSPF, ospf, ospfd
++ ZEBRA_ROUTE_OSPF6, ospf6, ospf6d, 'O', 0, 1, "OSPFv6"
++ ZEBRA_ROUTE_ISIS, isis, isisd, 'I', 1, 1, "IS-IS"
++ ZEBRA_ROUTE_BGP, bgp, bgpd, 'B', 1, 1, "BGP"
++-# HSLS and OLSR both are AFI independent (so: 1, 1), however
++-# we want to disable for them for general Quagga distribution.
++-# This at least makes it trivial for users of these protocols
++-# to 'switch on' redist support (direct numeric entry remaining
++-# possible).
++-ZEBRA_ROUTE_HSLS, hsls, hslsd, 'H', 0, 0, "HSLS"
++-ZEBRA_ROUTE_OLSR, olsr, olsrd, 'o', 0, 0, "OLSR"
+++ZEBRA_ROUTE_HSLS, hsls, hslsd, 'H', 1, 1, "HSLS"
+++ZEBRA_ROUTE_OLSR, olsr, olsrd, 'o', 1, 1, "OLSR"
+++ZEBRA_ROUTE_BATMAN, batman, batmand,'b', 1, 1, "BATMAN"
++ ZEBRA_ROUTE_BABEL, babel, babeld, 'A', 1, 1, "Babel"
++
++ ## help strings
++@@ -72,5 +68,6 @@ ZEBRA_ROUTE_OSPF6, "Open Shortest Path
++ ZEBRA_ROUTE_ISIS, "Intermediate System to Intermediate System (IS-IS)"
++ ZEBRA_ROUTE_BGP, "Border Gateway Protocol (BGP)"
++ ZEBRA_ROUTE_HSLS, "Hazy-Sighted Link State Protocol (HSLS)"
++-ZEBRA_ROUTE_OLSR, "Optimised Link State Routing (OLSR)"
+++ZEBRA_ROUTE_OLSR, "Optimized Link State Routing (OLSR)"
+++ZEBRA_ROUTE_BATMAN, "Better Approach to Mobile Ad-Hoc Networking (BATMAN)"
++ ZEBRA_ROUTE_BABEL, "Babel routing protocol (Babel)"
++--- a/ripd/rip_zebra.c
+++++ b/ripd/rip_zebra.c
++@@ -206,9 +206,12 @@ static struct {
++ {ZEBRA_ROUTE_KERNEL, 1, "kernel"},
++ {ZEBRA_ROUTE_CONNECT, 1, "connected"},
++ {ZEBRA_ROUTE_STATIC, 1, "static"},
++- {ZEBRA_ROUTE_OSPF, 1, "ospf"},
+++ {ZEBRA_ROUTE_OSPF, 2, "ospf"},
++ {ZEBRA_ROUTE_BGP, 2, "bgp"},
++- {ZEBRA_ROUTE_BABEL, 2, "babel"},
+++ {ZEBRA_ROUTE_HSLS, 1, "hsls"},
+++ {ZEBRA_ROUTE_OLSR, 2, "olsr"},
+++ {ZEBRA_ROUTE_BATMAN, 3, "batman"},
+++ {ZEBRA_ROUTE_BABEL, 3, "babel"},
++ {0, 0, NULL}
++ };
++
++--- a/ripngd/ripng_zebra.c
+++++ b/ripngd/ripng_zebra.c
++@@ -216,9 +216,12 @@ static struct {
++ {ZEBRA_ROUTE_KERNEL, 1, "kernel"},
++ {ZEBRA_ROUTE_CONNECT, 1, "connected"},
++ {ZEBRA_ROUTE_STATIC, 1, "static"},
++- {ZEBRA_ROUTE_OSPF6, 1, "ospf6"},
+++ {ZEBRA_ROUTE_OSPF6, 2, "ospf6"},
++ {ZEBRA_ROUTE_BGP, 2, "bgp"},
++- {ZEBRA_ROUTE_BABEL, 2, "babel"},
+++ {ZEBRA_ROUTE_HSLS, 1, "hsls"},
+++ {ZEBRA_ROUTE_OLSR, 2, "olsr"},
+++ {ZEBRA_ROUTE_BATMAN, 3, "batman"},
+++ {ZEBRA_ROUTE_BABEL, 3, "babel"},
++ {0, 0, NULL}
++ };
++
++--- a/zebra/rt_netlink.c
+++++ b/zebra/rt_netlink.c
++@@ -1609,6 +1609,9 @@ netlink_route_multipath (int cmd, struct
++ addattr_l (&req.n, sizeof req, RTA_PREFSRC,
++ &nexthop->src.ipv4, bytelen);
++
+++ if (rib->type == ZEBRA_ROUTE_OLSR)
+++ req.r.rtm_scope = RT_SCOPE_LINK;
+++
++ if (IS_ZEBRA_DEBUG_KERNEL)
++ zlog_debug("netlink_route_multipath() (single hop): "
++ "nexthop via if %u", nexthop->ifindex);
++--- a/zebra/zebra_rib.c
+++++ b/zebra/zebra_rib.c
++@@ -68,6 +68,9 @@ static const struct
++ [ZEBRA_ROUTE_OSPF6] = {ZEBRA_ROUTE_OSPF6, 110},
++ [ZEBRA_ROUTE_ISIS] = {ZEBRA_ROUTE_ISIS, 115},
++ [ZEBRA_ROUTE_BGP] = {ZEBRA_ROUTE_BGP, 20 /* IBGP is 200. */},
+++ [ZEBRA_ROUTE_HSLS] = {ZEBRA_ROUTE_HSLS, 0},
+++ [ZEBRA_ROUTE_OLSR] = {ZEBRA_ROUTE_OLSR, 0},
+++ [ZEBRA_ROUTE_BATMAN] = {ZEBRA_ROUTE_BATMAN, 0},
++ [ZEBRA_ROUTE_BABEL] = {ZEBRA_ROUTE_BABEL, 95},
++ /* no entry/default: 150 */
++ };
++@@ -456,6 +459,18 @@ nexthop_active_ipv4 (struct rib *rib, st
++ }
++ return 0;
++ }
+++ else if (match->type == ZEBRA_ROUTE_OLSR)
+++ {
+++ for (newhop = match->nexthop; newhop; newhop = newhop->next)
+++ if (CHECK_FLAG (newhop->flags, NEXTHOP_FLAG_FIB)
+++ && newhop->type == NEXTHOP_TYPE_IFINDEX)
+++ {
+++ if (nexthop->type == NEXTHOP_TYPE_IPV4)
+++ nexthop->ifindex = newhop->ifindex;
+++ return 1;
+++ }
+++ return 0;
+++ }
++ else
++ {
++ return 0;
++@@ -560,6 +575,18 @@ nexthop_active_ipv6 (struct rib *rib, st
++ }
++ return 0;
++ }
+++ else if (match->type == ZEBRA_ROUTE_OLSR)
+++ {
+++ for (newhop = match->nexthop; newhop; newhop = newhop->next)
+++ if (CHECK_FLAG (newhop->flags, NEXTHOP_FLAG_FIB)
+++ && newhop->type == NEXTHOP_TYPE_IFINDEX)
+++ {
+++ if (nexthop->type == NEXTHOP_TYPE_IPV6)
+++ nexthop->ifindex = newhop->ifindex;
+++ return 1;
+++ }
+++ return 0;
+++ }
++ else
++ {
++ return 0;
++@@ -1376,6 +1403,8 @@ static const u_char meta_queue_map[ZEBRA
++ [ZEBRA_ROUTE_ISIS] = 2,
++ [ZEBRA_ROUTE_BGP] = 3,
++ [ZEBRA_ROUTE_HSLS] = 4,
+++ [ZEBRA_ROUTE_OLSR] = 4,
+++ [ZEBRA_ROUTE_BATMAN] = 4,
++ [ZEBRA_ROUTE_BABEL] = 2,
++ };
++
++--- a/zebra/zebra_snmp.c
+++++ b/zebra/zebra_snmp.c
++@@ -245,6 +245,12 @@ proto_trans(int type)
++ return 1; /* shouldn't happen */
++ case ZEBRA_ROUTE_BGP:
++ return 14; /* bgp */
+++ case ZEBRA_ROUTE_HSLS:
+++ return 1; /* other */
+++ case ZEBRA_ROUTE_OLSR:
+++ return 1; /* other */
+++ case ZEBRA_ROUTE_BATMAN:
+++ return 1; /* other */
++ default:
++ return 1; /* other */
++ }
++--- a/zebra/zebra_vty.c
+++++ b/zebra/zebra_vty.c
++@@ -558,7 +558,10 @@ vty_show_ip_route_detail (struct vty *vt
++ || rib->type == ZEBRA_ROUTE_OSPF
++ || rib->type == ZEBRA_ROUTE_BABEL
++ || rib->type == ZEBRA_ROUTE_ISIS
++- || rib->type == ZEBRA_ROUTE_BGP)
+++ || rib->type == ZEBRA_ROUTE_BGP
+++ || rib->type == ZEBRA_ROUTE_HSLS
+++ || rib->type == ZEBRA_ROUTE_OLSR
+++ || rib->type == ZEBRA_ROUTE_BATMAN)
++ {
++ time_t uptime;
++ struct tm *tm;
++@@ -784,7 +787,10 @@ vty_show_ip_route (struct vty *vty, stru
++ || rib->type == ZEBRA_ROUTE_OSPF
++ || rib->type == ZEBRA_ROUTE_BABEL
++ || rib->type == ZEBRA_ROUTE_ISIS
++- || rib->type == ZEBRA_ROUTE_BGP)
+++ || rib->type == ZEBRA_ROUTE_BGP
+++ || rib->type == ZEBRA_ROUTE_HSLS
+++ || rib->type == ZEBRA_ROUTE_OLSR
+++ || rib->type == ZEBRA_ROUTE_BATMAN)
++ {
++ time_t uptime;
++ struct tm *tm;
++@@ -1577,7 +1583,10 @@ vty_show_ipv6_route_detail (struct vty *
++ || rib->type == ZEBRA_ROUTE_OSPF6
++ || rib->type == ZEBRA_ROUTE_BABEL
++ || rib->type == ZEBRA_ROUTE_ISIS
++- || rib->type == ZEBRA_ROUTE_BGP)
+++ || rib->type == ZEBRA_ROUTE_BGP
+++ || rib->type == ZEBRA_ROUTE_HSLS
+++ || rib->type == ZEBRA_ROUTE_OLSR
+++ || rib->type == ZEBRA_ROUTE_BATMAN)
++ {
++ time_t uptime;
++ struct tm *tm;
++@@ -1757,7 +1766,10 @@ vty_show_ipv6_route (struct vty *vty, st
++ || rib->type == ZEBRA_ROUTE_OSPF6
++ || rib->type == ZEBRA_ROUTE_BABEL
++ || rib->type == ZEBRA_ROUTE_ISIS
++- || rib->type == ZEBRA_ROUTE_BGP)
+++ || rib->type == ZEBRA_ROUTE_BGP
+++ || rib->type == ZEBRA_ROUTE_HSLS
+++ || rib->type == ZEBRA_ROUTE_OLSR
+++ || rib->type == ZEBRA_ROUTE_BATMAN)
++ {
++ time_t uptime;
++ struct tm *tm;
+diff --git a/feeds/routing/quagga/patches/140-holdtimer-set.patch b/feeds/routing/quagga/patches/140-holdtimer-set.patch
+new file mode 100644
+index 0000000..b699775
+--- /dev/null
++++ b/feeds/routing/quagga/patches/140-holdtimer-set.patch
+@@ -0,0 +1,22 @@
++--- a/bgpd/bgp_network.c
+++++ b/bgpd/bgp_network.c
++@@ -193,8 +193,7 @@ bgp_accept (struct thread *thread)
++ peer->fd = bgp_sock;
++ peer->status = Active;
++ peer->local_id = peer1->local_id;
++- peer->v_holdtime = peer1->v_holdtime;
++- peer->v_keepalive = peer1->v_keepalive;
+++ peer->v_holdtime = BGP_LARGE_HOLDTIME;
++
++ /* Make peer's address string. */
++ sockunion2str (&su, buf, SU_ADDRSTRLEN);
++--- a/bgpd/bgpd.h
+++++ b/bgpd/bgpd.h
++@@ -732,6 +732,7 @@ struct bgp_nlri
++ /* BGP timers default value. */
++ #define BGP_INIT_START_TIMER 5
++ #define BGP_ERROR_START_TIMER 30
+++#define BGP_LARGE_HOLDTIME 240
++ #define BGP_DEFAULT_HOLDTIME 180
++ #define BGP_DEFAULT_KEEPALIVE 60
++ #define BGP_DEFAULT_ASORIGINATE 15
+diff --git a/feeds/routing/quagga/patches/150-no-cross-fs-link.patch b/feeds/routing/quagga/patches/150-no-cross-fs-link.patch
+new file mode 100644
+index 0000000..32c1208
+--- /dev/null
++++ b/feeds/routing/quagga/patches/150-no-cross-fs-link.patch
+@@ -0,0 +1,40 @@
++--- a/lib/command.c
+++++ b/lib/command.c
++@@ -2527,6 +2527,13 @@ DEFUN (config_write_file,
++ VTY_NEWLINE);
++ goto finished;
++ }
+++
+++#if 0
+++ /* This code fails on UNION MOUNTs and similar filesystems if the
+++ * config file is still on the RO layer. Hardlinks across layers
+++ * will not work and cause quagga to fail saving the configuration...
+++ * should use rename() to move files around...
+++ */
++ if (link (config_file, config_file_sav) != 0)
++ {
++ vty_out (vty, "Can't backup old configuration file %s.%s", config_file_sav,
++@@ -2540,7 +2547,23 @@ DEFUN (config_write_file,
++ VTY_NEWLINE);
++ goto finished;
++ }
+++#else
+++ /* And this is the code that hopefully does work */
+++ if (rename (config_file, config_file_sav) != 0)
+++ {
+++ vty_out (vty, "Can't backup old configuration file %s.%s", config_file_sav,
+++ VTY_NEWLINE);
+++ goto finished;
+++ }
+++ sync ();
+++#endif
+++
+++#if 0
+++ /* same here. Please no cross-filesystem hardlinks... */
++ if (link (config_file_tmp, config_file) != 0)
+++#else
+++ if (rename (config_file_tmp, config_file) != 0)
+++#endif
++ {
++ vty_out (vty, "Can't save configuration file %s.%s", config_file,
++ VTY_NEWLINE);
+diff --git a/feeds/routing/quagga/patches/170-use-supported-pagers.patch b/feeds/routing/quagga/patches/170-use-supported-pagers.patch
+new file mode 100644
+index 0000000..15595a7
+--- /dev/null
++++ b/feeds/routing/quagga/patches/170-use-supported-pagers.patch
+@@ -0,0 +1,29 @@
++--- a/vtysh/vtysh.c
+++++ b/vtysh/vtysh.c
++@@ -268,7 +268,7 @@ vtysh_pager_init (void)
++ if (pager_defined)
++ vtysh_pager_name = strdup (pager_defined);
++ else
++- vtysh_pager_name = strdup ("more");
+++ vtysh_pager_name = strdup ("cat");
++ }
++
++ /* Command execution over the vty interface. */
++@@ -1884,7 +1884,7 @@ DEFUN (vtysh_terminal_length,
++ {
++ int lines;
++ char *endptr = NULL;
++- char default_pager[10];
+++ char default_pager[12];
++
++ lines = strtol (argv[0], &endptr, 10);
++ if (lines < 0 || lines > 512 || *endptr != '\0')
++@@ -1901,7 +1901,7 @@ DEFUN (vtysh_terminal_length,
++
++ if (lines != 0)
++ {
++- snprintf(default_pager, 10, "more -%i", lines);
+++ snprintf(default_pager, 12, "head -n %i", lines);
++ vtysh_pager_name = strdup (default_pager);
++ }
++
+diff --git a/feeds/routing/smcroute/Makefile b/feeds/routing/smcroute/Makefile
+new file mode 100644
+index 0000000..1a5a202
+--- /dev/null
++++ b/feeds/routing/smcroute/Makefile
+@@ -0,0 +1,56 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=smcroute
++PKG_VERSION:=2.0.0
++PKG_RELEASE:=1
++PKG_LICENSE:=GPL-2.0+
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
++PKG_SOURCE_URL:=ftp://troglobit.com/smcroute/
++PKG_MD5SUM:=cbf478e52ab9ae411adca41b9d22f68a
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/smcroute
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Routing and Redirection
++ TITLE:=Static Multicast Routing Daemon
++ URL:=http://troglobit.com/smcroute.html
++ MAINTAINER:=Leonardo Brondani Schenkel <leonardo@schenkel.net>
++endef
++
++define Package/smcroute/description
++ SMCRoute is a command line tool to manipulate the multicast routes of the Linux kernel.
++endef
++
++ifeq ($(HOST_OS),FreeBSD)
++ TARGET_CFLAGS += -fno-builtin-log
++ TARGET_LDFLAGS += -fno-builtin-log
++endif
++
++define Build/Compile
++ $(MAKE) CC="$(TARGET_CC) $(TARGET_CFLAGS) $(TARGET_LDFLAGS)" -C $(PKG_BUILD_DIR) all
++endef
++
++define Package/smcroute/conffiles
++ /etc/smcroute.conf
++endef
++
++define Package/smcroute/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/etc/init.d/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/smcroute $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/mcsender $(1)/usr/bin/
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/smcroute.conf $(1)/etc
++ $(INSTALL_BIN) ./files/smcroute.init $(1)/etc/init.d/smcroute
++endef
++
++$(eval $(call BuildPackage,smcroute))
+diff --git a/feeds/routing/smcroute/files/smcroute.init b/feeds/routing/smcroute/files/smcroute.init
+new file mode 100644
+index 0000000..3e36272
+--- /dev/null
++++ b/feeds/routing/smcroute/files/smcroute.init
+@@ -0,0 +1,11 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006-2010 OpenWrt.org
++START=50
++
++start() {
++ smcroute -d
++}
++
++stop() {
++ smcroute -k
++}
+diff --git a/feeds/targets/LICENSE b/feeds/targets/LICENSE
+new file mode 100644
+index 0000000..d6a9326
+--- /dev/null
++++ b/feeds/targets/LICENSE
+@@ -0,0 +1,340 @@
++GNU GENERAL PUBLIC LICENSE
++ Version 2, June 1991
++
++ Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ Everyone is permitted to copy and distribute verbatim copies
++ of this license document, but changing it is not allowed.
++
++ Preamble
++
++ The licenses for most software are designed to take away your
++freedom to share and change it. By contrast, the GNU General Public
++License is intended to guarantee your freedom to share and change free
++software--to make sure the software is free for all its users. This
++General Public License applies to most of the Free Software
++Foundation's software and to any other program whose authors commit to
++using it. (Some other Free Software Foundation software is covered by
++the GNU Lesser General Public License instead.) You can apply it to
++your programs, too.
++
++ When we speak of free software, we are referring to freedom, not
++price. Our General Public Licenses are designed to make sure that you
++have the freedom to distribute copies of free software (and charge for
++this service if you wish), that you receive source code or can get it
++if you want it, that you can change the software or use pieces of it
++in new free programs; and that you know you can do these things.
++
++ To protect your rights, we need to make restrictions that forbid
++anyone to deny you these rights or to ask you to surrender the rights.
++These restrictions translate to certain responsibilities for you if you
++distribute copies of the software, or if you modify it.
++
++ For example, if you distribute copies of such a program, whether
++gratis or for a fee, you must give the recipients all the rights that
++you have. You must make sure that they, too, receive or can get the
++source code. And you must show them these terms so they know their
++rights.
++
++ We protect your rights with two steps: (1) copyright the software, and
++(2) offer you this license which gives you legal permission to copy,
++distribute and/or modify the software.
++
++ Also, for each author's protection and ours, we want to make certain
++that everyone understands that there is no warranty for this free
++software. If the software is modified by someone else and passed on, we
++want its recipients to know that what they have is not the original, so
++that any problems introduced by others will not reflect on the original
++authors' reputations.
++
++ Finally, any free program is threatened constantly by software
++patents. We wish to avoid the danger that redistributors of a free
++program will individually obtain patent licenses, in effect making the
++program proprietary. To prevent this, we have made it clear that any
++patent must be licensed for everyone's free use or not licensed at all.
++
++ The precise terms and conditions for copying, distribution and
++modification follow.
++
++ GNU GENERAL PUBLIC LICENSE
++ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
++
++ 0. This License applies to any program or other work which contains
++a notice placed by the copyright holder saying it may be distributed
++under the terms of this General Public License. The "Program", below,
++refers to any such program or work, and a "work based on the Program"
++means either the Program or any derivative work under copyright law:
++that is to say, a work containing the Program or a portion of it,
++either verbatim or with modifications and/or translated into another
++language. (Hereinafter, translation is included without limitation in
++the term "modification".) Each licensee is addressed as "you".
++
++Activities other than copying, distribution and modification are not
++covered by this License; they are outside its scope. The act of
++running the Program is not restricted, and the output from the Program
++is covered only if its contents constitute a work based on the
++Program (independent of having been made by running the Program).
++Whether that is true depends on what the Program does.
++
++ 1. You may copy and distribute verbatim copies of the Program's
++source code as you receive it, in any medium, provided that you
++conspicuously and appropriately publish on each copy an appropriate
++copyright notice and disclaimer of warranty; keep intact all the
++notices that refer to this License and to the absence of any warranty;
++and give any other recipients of the Program a copy of this License
++along with the Program.
++
++You may charge a fee for the physical act of transferring a copy, and
++you may at your option offer warranty protection in exchange for a fee.
++
++ 2. You may modify your copy or copies of the Program or any portion
++of it, thus forming a work based on the Program, and copy and
++distribute such modifications or work under the terms of Section 1
++above, provided that you also meet all of these conditions:
++
++ a) You must cause the modified files to carry prominent notices
++ stating that you changed the files and the date of any change.
++
++ b) You must cause any work that you distribute or publish, that in
++ whole or in part contains or is derived from the Program or any
++ part thereof, to be licensed as a whole at no charge to all third
++ parties under the terms of this License.
++
++ c) If the modified program normally reads commands interactively
++ when run, you must cause it, when started running for such
++ interactive use in the most ordinary way, to print or display an
++ announcement including an appropriate copyright notice and a
++ notice that there is no warranty (or else, saying that you provide
++ a warranty) and that users may redistribute the program under
++ these conditions, and telling the user how to view a copy of this
++ License. (Exception: if the Program itself is interactive but
++ does not normally print such an announcement, your work based on
++ the Program is not required to print an announcement.)
++
++These requirements apply to the modified work as a whole. If
++identifiable sections of that work are not derived from the Program,
++and can be reasonably considered independent and separate works in
++themselves, then this License, and its terms, do not apply to those
++sections when you distribute them as separate works. But when you
++distribute the same sections as part of a whole which is a work based
++on the Program, the distribution of the whole must be on the terms of
++this License, whose permissions for other licensees extend to the
++entire whole, and thus to each and every part regardless of who wrote it.
++
++Thus, it is not the intent of this section to claim rights or contest
++your rights to work written entirely by you; rather, the intent is to
++exercise the right to control the distribution of derivative or
++collective works based on the Program.
++
++In addition, mere aggregation of another work not based on the Program
++with the Program (or with a work based on the Program) on a volume of
++a storage or distribution medium does not bring the other work under
++the scope of this License.
++
++ 3. You may copy and distribute the Program (or a work based on it,
++under Section 2) in object code or executable form under the terms of
++Sections 1 and 2 above provided that you also do one of the following:
++
++ a) Accompany it with the complete corresponding machine-readable
++ source code, which must be distributed under the terms of Sections
++ 1 and 2 above on a medium customarily used for software interchange; or,
++
++ b) Accompany it with a written offer, valid for at least three
++ years, to give any third party, for a charge no more than your
++ cost of physically performing source distribution, a complete
++ machine-readable copy of the corresponding source code, to be
++ distributed under the terms of Sections 1 and 2 above on a medium
++ customarily used for software interchange; or,
++
++ c) Accompany it with the information you received as to the offer
++ to distribute corresponding source code. (This alternative is
++ allowed only for noncommercial distribution and only if you
++ received the program in object code or executable form with such
++ an offer, in accord with Subsection b above.)
++
++The source code for a work means the preferred form of the work for
++making modifications to it. For an executable work, complete source
++code means all the source code for all modules it contains, plus any
++associated interface definition files, plus the scripts used to
++control compilation and installation of the executable. However, as a
++special exception, the source code distributed need not include
++anything that is normally distributed (in either source or binary
++form) with the major components (compiler, kernel, and so on) of the
++operating system on which the executable runs, unless that component
++itself accompanies the executable.
++
++If distribution of executable or object code is made by offering
++access to copy from a designated place, then offering equivalent
++access to copy the source code from the same place counts as
++distribution of the source code, even though third parties are not
++compelled to copy the source along with the object code.
++
++ 4. You may not copy, modify, sublicense, or distribute the Program
++except as expressly provided under this License. Any attempt
++otherwise to copy, modify, sublicense or distribute the Program is
++void, and will automatically terminate your rights under this License.
++However, parties who have received copies, or rights, from you under
++this License will not have their licenses terminated so long as such
++parties remain in full compliance.
++
++ 5. You are not required to accept this License, since you have not
++signed it. However, nothing else grants you permission to modify or
++distribute the Program or its derivative works. These actions are
++prohibited by law if you do not accept this License. Therefore, by
++modifying or distributing the Program (or any work based on the
++Program), you indicate your acceptance of this License to do so, and
++all its terms and conditions for copying, distributing or modifying
++the Program or works based on it.
++
++ 6. Each time you redistribute the Program (or any work based on the
++Program), the recipient automatically receives a license from the
++original licensor to copy, distribute or modify the Program subject to
++these terms and conditions. You may not impose any further
++restrictions on the recipients' exercise of the rights granted herein.
++You are not responsible for enforcing compliance by third parties to
++this License.
++
++ 7. If, as a consequence of a court judgment or allegation of patent
++infringement or for any other reason (not limited to patent issues),
++conditions are imposed on you (whether by court order, agreement or
++otherwise) that contradict the conditions of this License, they do not
++excuse you from the conditions of this License. If you cannot
++distribute so as to satisfy simultaneously your obligations under this
++License and any other pertinent obligations, then as a consequence you
++may not distribute the Program at all. For example, if a patent
++license would not permit royalty-free redistribution of the Program by
++all those who receive copies directly or indirectly through you, then
++the only way you could satisfy both it and this License would be to
++refrain entirely from distribution of the Program.
++
++If any portion of this section is held invalid or unenforceable under
++any particular circumstance, the balance of the section is intended to
++apply and the section as a whole is intended to apply in other
++circumstances.
++
++It is not the purpose of this section to induce you to infringe any
++patents or other property right claims or to contest validity of any
++such claims; this section has the sole purpose of protecting the
++integrity of the free software distribution system, which is
++implemented by public license practices. Many people have made
++generous contributions to the wide range of software distributed
++through that system in reliance on consistent application of that
++system; it is up to the author/donor to decide if he or she is willing
++to distribute software through any other system and a licensee cannot
++impose that choice.
++
++This section is intended to make thoroughly clear what is believed to
++be a consequence of the rest of this License.
++
++ 8. If the distribution and/or use of the Program is restricted in
++certain countries either by patents or by copyrighted interfaces, the
++original copyright holder who places the Program under this License
++may add an explicit geographical distribution limitation excluding
++those countries, so that distribution is permitted only in or among
++countries not thus excluded. In such case, this License incorporates
++the limitation as if written in the body of this License.
++
++ 9. The Free Software Foundation may publish revised and/or new versions
++of the General Public License from time to time. Such new versions will
++be similar in spirit to the present version, but may differ in detail to
++address new problems or concerns.
++
++Each version is given a distinguishing version number. If the Program
++specifies a version number of this License which applies to it and "any
++later version", you have the option of following the terms and conditions
++either of that version or of any later version published by the Free
++Software Foundation. If the Program does not specify a version number of
++this License, you may choose any version ever published by the Free Software
++Foundation.
++
++ 10. If you wish to incorporate parts of the Program into other free
++programs whose distribution conditions are different, write to the author
++to ask for permission. For software which is copyrighted by the Free
++Software Foundation, write to the Free Software Foundation; we sometimes
++make exceptions for this. Our decision will be guided by the two goals
++of preserving the free status of all derivatives of our free software and
++of promoting the sharing and reuse of software generally.
++
++ NO WARRANTY
++
++ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
++FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
++OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
++PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
++OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
++TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
++PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
++REPAIR OR CORRECTION.
++
++ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
++REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
++INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
++OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
++TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
++YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
++PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
++POSSIBILITY OF SUCH DAMAGES.
++
++ END OF TERMS AND CONDITIONS
++
++ How to Apply These Terms to Your New Programs
++
++ If you develop a new program, and you want it to be of the greatest
++possible use to the public, the best way to achieve this is to make it
++free software which everyone can redistribute and change under these terms.
++
++ To do so, attach the following notices to the program. It is safest
++to attach them to the start of each source file to most effectively
++convey the exclusion of warranty; and each file should have at least
++the "copyright" line and a pointer to where the full notice is found.
++
++ {description}
++ Copyright (C) {year} {fullname}
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License along
++ with this program; if not, write to the Free Software Foundation, Inc.,
++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++
++Also add information on how to contact you by electronic and paper mail.
++
++If the program is interactive, make it output a short notice like this
++when it starts in an interactive mode:
++
++ Gnomovision version 69, Copyright (C) year name of author
++ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
++ This is free software, and you are welcome to redistribute it
++ under certain conditions; type `show c' for details.
++
++The hypothetical commands `show w' and `show c' should show the appropriate
++parts of the General Public License. Of course, the commands you use may
++be called something other than `show w' and `show c'; they could even be
++mouse-clicks or menu items--whatever suits your program.
++
++You should also get your employer (if you work as a programmer) or your
++school, if any, to sign a "copyright disclaimer" for the program, if
++necessary. Here is a sample; alter the names:
++
++ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
++ `Gnomovision' (which makes passes at compilers) written by James Hacker.
++
++ {signature of Ty Coon}, 1 April 1989
++ Ty Coon, President of Vice
++
++This General Public License does not permit incorporating your program into
++proprietary programs. If your program is a subroutine library, you may
++consider it more useful to permit linking proprietary applications with the
++library. If this is what you want to do, use the GNU Lesser General
++Public License instead of this License.
++
+diff --git a/feeds/targets/cns21xx/Makefile b/feeds/targets/cns21xx/Makefile
+new file mode 100644
+index 0000000..d33a83f
+--- /dev/null
++++ b/feeds/targets/cns21xx/Makefile
+@@ -0,0 +1,29 @@
++#
++# Copyright (C) 2010-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++ARCH:=arm
++BOARD:=cns21xx
++BOARDNAME:=Cavium Networks Econa CNS21xx
++FEATURES:=squashfs broken
++CPU_TYPE:=fa526
++
++KERNEL_PATCHVER:=3.10
++
++include $(INCLUDE_DIR)/target.mk
++
++DEFAULT_PACKAGES += \
++ kmod-leds-gpio kmod-input-core kmod-input-gpio-keys \
++ kmod-button-hotplug
++
++define Target/Description
++ Build firmware images for Cavium Networks CNS21XX based boards.
++endef
++
++KERNELNAME:=zImage uImage
++
++$(eval $(call BuildTarget))
+diff --git a/feeds/targets/cns21xx/base-files/etc/diag.sh b/feeds/targets/cns21xx/base-files/etc/diag.sh
+new file mode 100644
+index 0000000..d61f467
+--- /dev/null
++++ b/feeds/targets/cns21xx/base-files/etc/diag.sh
+@@ -0,0 +1,32 @@
++#!/bin/sh
++# Copyright (C) 2010-2013 OpenWrt.org
++
++. /lib/functions/leds.sh
++. /lib/cns21xx.sh
++
++get_status_led() {
++ case $(get_board_name) in
++ ns-k330)
++ status_led="ns-k330:red:link"
++ ;;
++ esac;
++}
++
++set_state() {
++ get_status_led
++
++ case "$1" in
++ preinit)
++ status_led_blink_preinit
++ ;;
++ failsafe)
++ status_led_blink_failsafe
++ ;;
++ preinit_regular)
++ status_led_blink_preinit_regular
++ ;;
++ done)
++ status_led_on
++ ;;
++ esac
++}
+diff --git a/feeds/targets/cns21xx/base-files/etc/uci-defaults/01_leds b/feeds/targets/cns21xx/base-files/etc/uci-defaults/01_leds
+new file mode 100644
+index 0000000..7d7e49f
+--- /dev/null
++++ b/feeds/targets/cns21xx/base-files/etc/uci-defaults/01_leds
+@@ -0,0 +1,21 @@
++#!/bin/sh
++#
++# Copyright (C) 2010 OpenWrt.org
++#
++
++. /lib/functions/uci-defaults.sh
++. /lib/cns21xx.sh
++
++board=$(get_board_name)
++
++case "$board" in
++"ns-k330")
++ ucidef_set_led_netdev "eth_orange" "ETH (orange)" "ns-k330:orange:eth" "eth0"
++ ucidef_set_led_usbdev "usb1" "USB1" "ns-k330:green:usb1" "1-1"
++ ucidef_set_led_usbdev "usb2" "USB2" "ns-k330:green:usb2" "1-2"
++ ;;
++esac
++
++ucidef_commit_leds
++
++exit 0
+diff --git a/feeds/targets/cns21xx/base-files/lib/cns21xx.sh b/feeds/targets/cns21xx/base-files/lib/cns21xx.sh
+new file mode 100755
+index 0000000..c10f6d3
+--- /dev/null
++++ b/feeds/targets/cns21xx/base-files/lib/cns21xx.sh
+@@ -0,0 +1,25 @@
++#!/bin/sh
++#
++# Copyright (C) 2010 OpenWrt.org
++#
++
++get_board_name() {
++ local hardware
++ local name
++
++ hardware=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /Hardware/ {print $2}' /proc/cpuinfo)
++
++ case "$hardware" in
++ *NSB3AST)
++ name="nsb3ast"
++ ;;
++ "NS-K330 NAS")
++ name="ns-k330"
++ ;;
++ *)
++ name="generic"
++ ;;
++ esac
++
++ echo $name
++}
+diff --git a/feeds/targets/cns21xx/base-files/lib/upgrade/platform.sh b/feeds/targets/cns21xx/base-files/lib/upgrade/platform.sh
+new file mode 100755
+index 0000000..fd9bd28
+--- /dev/null
++++ b/feeds/targets/cns21xx/base-files/lib/upgrade/platform.sh
+@@ -0,0 +1,45 @@
++#
++# Copyright (C) 2010 OpenWrt.org
++#
++
++. /lib/cns21xx.sh
++
++PART_NAME=firmware
++RAMFS_COPY_DATA=/lib/cns21xx.sh
++
++platform_check_image() {
++ local board=$(get_board_name)
++ local magic="$(get_magic_word "$1")"
++
++ [ "$#" -gt 1 ] && return 1
++
++ case "$board" in
++ nsb3ast)
++ [ "$magic" != "0b1c" ] && {
++ echo "Invalid image type."
++ return 1
++ }
++ return 0
++ ;;
++ ns-k330)
++ [ "$magic" != "0c1c" ] && {
++ echo "Invalid image type."
++ return 1
++ }
++ return 0
++ ;;
++ esac
++
++ echo "Sysupgrade is not yet supported on $board."
++ return 1
++}
++
++disable_watchdog() {
++ killall watchdog
++ ( ps | grep -v 'grep' | grep '/dev/watchdog' ) && {
++ echo 'Could not disable watchdog'
++ return 1
++ }
++}
++
++append sysupgrade_pre_upgrade disable_watchdog
+diff --git a/feeds/targets/cns21xx/cobalt/Makefile b/feeds/targets/cns21xx/cobalt/Makefile
+new file mode 100644
+index 0000000..e1441cd
+--- /dev/null
++++ b/feeds/targets/cns21xx/cobalt/Makefile
+@@ -0,0 +1,25 @@
++#
++# Copyright (C) 2009-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++ARCH:=mipsel
++BOARD:=cobalt
++BOARDNAME:=Cobalt Microservers
++FEATURES:=targz pci ext4 display
++CPU_TYPE := 5k
++CPU_CFLAGS_5k := -march=r5000
++MAINTAINER:=Florian Fainelli <florian@openwrt.org>
++
++KERNEL_PATCHVER:=3.18
++
++include $(INCLUDE_DIR)/target.mk
++
++define Target/Description
++ Build firmware images for Cobalt servers systems (Qube/Qube2/RaQ/RaQ2).
++endef
++
++$(eval $(call BuildTarget))
+diff --git a/feeds/targets/cns21xx/cobalt/base-files/etc/diag.sh b/feeds/targets/cns21xx/cobalt/base-files/etc/diag.sh
+new file mode 100644
+index 0000000..6084985
+--- /dev/null
++++ b/feeds/targets/cns21xx/cobalt/base-files/etc/diag.sh
+@@ -0,0 +1,17 @@
++#!/bin/sh
++# Copyright (C) 2009-2013 OpenWrt.org
++
++. /lib/functions/leds.sh
++
++status_led="qube::front"
++
++set_state() {
++ case "$1" in
++ preinit)
++ status_led_on
++ ;;
++ done)
++ status_led_off
++ ;;
++ esac
++}
+diff --git a/feeds/targets/cns21xx/cobalt/config-default b/feeds/targets/cns21xx/cobalt/config-default
+new file mode 100644
+index 0000000..3c5dbaf
+--- /dev/null
++++ b/feeds/targets/cns21xx/cobalt/config-default
+@@ -0,0 +1,191 @@
++# CONFIG_32BIT is not set
++CONFIG_64BIT=y
++CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
++CONFIG_ARCH_DISCARD_MEMBLOCK=y
++CONFIG_ARCH_DMA_ADDR_T_64BIT=y
++CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
++CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
++CONFIG_ARCH_HIBERNATION_POSSIBLE=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y
++CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
++CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y
++# CONFIG_ARPD is not set
++CONFIG_ATA=y
++CONFIG_BINFMT_ELF32=y
++# CONFIG_BLK_DEV_INITRD is not set
++CONFIG_BLK_DEV_LOOP=y
++CONFIG_BLK_DEV_SD=y
++CONFIG_BLOCK_COMPAT=y
++CONFIG_CEVT_GT641XX=y
++CONFIG_CEVT_R4K=y
++CONFIG_CLKBLD_I8253=y
++CONFIG_CLKEVT_I8253=y
++CONFIG_CLKSRC_I8253=y
++CONFIG_CLONE_BACKWARDS=y
++CONFIG_CMDLINE="console=ttyS0,115200"
++CONFIG_CMDLINE_BOOL=y
++# CONFIG_CMDLINE_OVERRIDE is not set
++CONFIG_COMPAT=y
++CONFIG_COMPAT_BRK=y
++CONFIG_COMPAT_NETLINK_MESSAGES=y
++CONFIG_CONSOLE_TRANSLATIONS=y
++CONFIG_CPU_GENERIC_DUMP_TLB=y
++CONFIG_CPU_HAS_SYNC=y
++CONFIG_CPU_LITTLE_ENDIAN=y
++CONFIG_CPU_NEVADA=y
++CONFIG_CPU_R4K_CACHE_TLB=y
++CONFIG_CPU_R4K_FPU=y
++CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
++CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
++CONFIG_CPU_SUPPORTS_HUGEPAGES=y
++CONFIG_CSRC_R4K=y
++CONFIG_DE2104X=y
++CONFIG_DE2104X_DSL=0
++# CONFIG_DE4X5 is not set
++CONFIG_DEVKMEM=y
++# CONFIG_DM9102 is not set
++CONFIG_DMA_NONCOHERENT=y
++CONFIG_DNOTIFY=y
++CONFIG_DUMMY_CONSOLE=y
++CONFIG_EARLY_PRINTK=y
++CONFIG_ENABLE_MUST_CHECK=y
++CONFIG_FS_POSIX_ACL=y
++CONFIG_GENERIC_ACL=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_IO=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_PCI_IOMAP=y
++CONFIG_GENERIC_SMP_IDLE_THREAD=y
++CONFIG_GPIO_DEVRES=y
++CONFIG_HAS_DMA=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAVE_64BIT_ALIGNED_ACCESS=y
++CONFIG_HAVE_ARCH_JUMP_LABEL=y
++CONFIG_HAVE_ARCH_KGDB=y
++CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
++# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
++CONFIG_HAVE_C_RECORDMCOUNT=y
++CONFIG_HAVE_DEBUG_KMEMLEAK=y
++CONFIG_HAVE_DMA_API_DEBUG=y
++CONFIG_HAVE_DMA_ATTRS=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_HAVE_GENERIC_HARDIRQS=y
++CONFIG_HAVE_IDE=y
++CONFIG_HAVE_MEMBLOCK=y
++CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
++CONFIG_HAVE_NET_DSA=y
++CONFIG_HAVE_OPROFILE=y
++CONFIG_HAVE_PERF_EVENTS=y
++# CONFIG_HIGH_RES_TIMERS is not set
++# CONFIG_HUGETLBFS is not set
++CONFIG_HW_CONSOLE=y
++CONFIG_HW_HAS_PCI=y
++CONFIG_HZ=250
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++CONFIG_HZ_PERIODIC=y
++CONFIG_I8253=y
++CONFIG_I8259=y
++CONFIG_INPUT=y
++# CONFIG_INPUT_COBALT_BTNS is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++# CONFIG_IP_MULTICAST is not set
++CONFIG_IRQ_CPU=y
++CONFIG_IRQ_FORCED_THREADING=y
++CONFIG_IRQ_GT641XX=y
++CONFIG_IRQ_WORK=y
++# CONFIG_JFFS2_FS is not set
++CONFIG_KEXEC=y
++CONFIG_LEDS_COBALT_QUBE=y
++CONFIG_LEDS_COBALT_RAQ=y
++# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
++# CONFIG_LEDS_TRIGGER_TIMER is not set
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++# CONFIG_MII is not set
++CONFIG_MIPS=y
++CONFIG_MIPS32_COMPAT=y
++CONFIG_MIPS32_N32=y
++CONFIG_MIPS32_O32=y
++CONFIG_MIPS_COBALT=y
++CONFIG_MIPS_EXTERNAL_TIMER=y
++# CONFIG_MIPS_HUGE_TLB_SUPPORT is not set
++CONFIG_MIPS_L1_CACHE_SHIFT=5
++# CONFIG_MIPS_MACHINE is not set
++CONFIG_MIPS_MT_DISABLED=y
++CONFIG_MODULES_USE_ELF_REL=y
++CONFIG_MODULES_USE_ELF_RELA=y
++# CONFIG_MTD_BLOCK is not set
++# CONFIG_MTD_BLOCK_RO is not set
++# CONFIG_MTD_CFI is not set
++# CONFIG_MTD_CFI_INTELEXT is not set
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++CONFIG_MTD_JEDECPROBE=y
++CONFIG_MTD_PHYSMAP=y
++CONFIG_NEED_DMA_MAP_STATE=y
++CONFIG_NEED_PER_CPU_KM=y
++CONFIG_NET_TULIP=y
++CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y
++CONFIG_PAGEFLAGS_EXTENDED=y
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_PATA_VIA=y
++CONFIG_PCI=y
++CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_GT64XXX_PCI0=y
++CONFIG_PERF_USE_VMALLOC=y
++CONFIG_PHYS_ADDR_T_64BIT=y
++# CONFIG_PREEMPT_RCU is not set
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_RAID_ATTRS=y
++# CONFIG_RCU_STALL_COMMON is not set
++CONFIG_RELAY=y
++CONFIG_RTC_CLASS=y
++CONFIG_RTC_INTF_DEV_UIE_EMUL=y
++CONFIG_SATA_PMP=y
++CONFIG_SCSI=y
++# CONFIG_SCSI_LOWLEVEL is not set
++# CONFIG_SCSI_MULTI_LUN is not set
++CONFIG_SECCOMP=y
++CONFIG_SERIAL_8250_NR_UARTS=4
++CONFIG_SERIAL_8250_RUNTIME_UARTS=4
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++CONFIG_SYSVIPC_COMPAT=y
++CONFIG_SYS_HAS_CPU_NEVADA=y
++CONFIG_SYS_HAS_EARLY_PRINTK=y
++CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
++CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y
++CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
++CONFIG_SYS_SUPPORTS_HUGETLBFS=y
++CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
++CONFIG_TICK_CPU_ACCOUNTING=y
++CONFIG_TMPFS_POSIX_ACL=y
++CONFIG_TULIP=y
++CONFIG_TULIP_MMIO=y
++CONFIG_TULIP_MWI=y
++CONFIG_TULIP_NAPI=y
++CONFIG_TULIP_NAPI_HW_MITIGATION=y
++CONFIG_UIDGID_CONVERTED=y
++# CONFIG_ULI526X is not set
++CONFIG_USB_ARCH_HAS_XHCI=y
++CONFIG_USB_SUPPORT=y
++# CONFIG_VGA_CONSOLE is not set
++# CONFIG_VLAN_8021Q is not set
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_VT=y
++CONFIG_VT_CONSOLE=y
++CONFIG_VT_HW_CONSOLE_BINDING=y
++# CONFIG_WATCHDOG is not set
++# CONFIG_WINBOND_840 is not set
++CONFIG_ZONE_DMA_FLAG=0
+diff --git a/feeds/targets/cns21xx/cobalt/image/Makefile b/feeds/targets/cns21xx/cobalt/image/Makefile
+new file mode 100644
+index 0000000..a690366
+--- /dev/null
++++ b/feeds/targets/cns21xx/cobalt/image/Makefile
+@@ -0,0 +1,23 @@
++#
++# Copyright (C) 2009-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/image.mk
++
++define Image/BuildKernel
++ cp $(KDIR)/vmlinux.elf $(BIN_DIR)/$(IMG_PREFIX)-vmlinux.elf
++endef
++
++define Image/Build/squashfs
++ $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
++endef
++
++define Image/Build
++ $(call Image/Build/$(1))
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-root.$(1) bs=128k conv=sync
++endef
++
++$(eval $(call BuildImage))
+diff --git a/feeds/targets/cns21xx/cobalt/modules.mk b/feeds/targets/cns21xx/cobalt/modules.mk
+new file mode 100644
+index 0000000..643109c
+--- /dev/null
++++ b/feeds/targets/cns21xx/cobalt/modules.mk
+@@ -0,0 +1,36 @@
++#
++# Copyright (C) 2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define KernelPackage/fb-cobalt
++ SUBMENU:=$(VIDEO_MENU)
++ TITLE:=Cobalt framebuffer support
++ DEPENDS:=@TARGET_cobalt +kmod-fb
++ KCONFIG:=CONFIG_FB_COBALT
++ FILES:=$(LINUX_DIR)/drivers/video/fbdev/cobalt_lcdfb.ko
++ AUTOLOAD:=$(call AutoLoad,50,cobalt_lcdfb)
++endef
++
++define KernelPackage/fb-cobalt/descriptione
++ Kernel module for the Cobalt Microservers framebuffer
++endef
++
++$(eval $(call KernelPackage,fb-cobalt))
++
++define KernelPackage/cobalt-btns
++ SUBMENU:=$(OTHER_MENU)
++ TITLE:=Cobalt buttons support
++ DEPENDS:=@TARGET_cobalt +kmod-input-evdev +kmod-input-polldev
++ KCONFIG:=CONFIG_INPUT_COBALT_BTNS
++ FILES:=$(LINUX_DIR)/drivers/input/misc/cobalt_btns.ko
++ AUTOLOAD:=$(call AutoLoad,62,cobalt_btns)
++endef
++
++define KernelPackage/cobalt-btns/description
++ Kernel module for the Cobalt Microservers buttons
++endef
++
++$(eval $(call KernelPackage,cobalt-btns))
+diff --git a/feeds/targets/cns21xx/config-3.10 b/feeds/targets/cns21xx/config-3.10
+new file mode 100644
+index 0000000..26b6086
+--- /dev/null
++++ b/feeds/targets/cns21xx/config-3.10
+@@ -0,0 +1,154 @@
++CONFIG_ALIGNMENT_TRAP=y
++CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
++CONFIG_ARCH_CNS21XX=y
++CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
++CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
++CONFIG_ARCH_NR_GPIO=0
++CONFIG_ARCH_REQUIRE_GPIOLIB=y
++# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
++# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
++CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
++CONFIG_ARM=y
++# CONFIG_ARM_CPU_SUSPEND is not set
++CONFIG_ARM_L1_CACHE_SHIFT=4
++CONFIG_ARM_L1_CACHE_SHIFT_4=y
++CONFIG_ARM_NR_BANKS=8
++# CONFIG_ARPD is not set
++CONFIG_ATAGS=y
++# CONFIG_CACHE_L2X0 is not set
++CONFIG_CC_OPTIMIZE_FOR_SIZE=y
++CONFIG_CLONE_BACKWARDS=y
++CONFIG_CMDLINE="console=ttyS0,38400 rootfstype=squashfs,jffs2 noinitrd"
++CONFIG_CMDLINE_FROM_BOOTLOADER=y
++CONFIG_CNS21XX_DEV_GEC=y
++CONFIG_CNS21XX_DEV_SPI_MASTER=y
++CONFIG_CNS21XX_DEV_USB=y
++CONFIG_CNS21XX_GEC=y
++CONFIG_CPU_32v4=y
++CONFIG_CPU_ABRT_EV4=y
++# CONFIG_CPU_BPREDICT_DISABLE is not set
++CONFIG_CPU_CACHE_FA=y
++CONFIG_CPU_CACHE_VIVT=y
++CONFIG_CPU_COPY_FA=y
++CONFIG_CPU_CP15=y
++CONFIG_CPU_CP15_MMU=y
++# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
++CONFIG_CPU_FA526=y
++# CONFIG_CPU_ICACHE_DISABLE is not set
++CONFIG_CPU_PABRT_LEGACY=y
++CONFIG_CPU_TLB_FA=y
++CONFIG_CPU_USE_DOMAINS=y
++CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S"
++# CONFIG_DEBUG_USER is not set
++CONFIG_DLCI_MAX=8
++CONFIG_DMADEVICES=y
++CONFIG_DNOTIFY=y
++CONFIG_EEPROM_AT25=y
++CONFIG_FA_WATCHDOG=y
++CONFIG_FRAME_POINTER=y
++CONFIG_GENERIC_ATOMIC64=y
++CONFIG_GENERIC_BUG=y
++CONFIG_GENERIC_IDLE_POLL_SETUP=y
++CONFIG_GENERIC_IO=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_PCI_IOMAP=y
++CONFIG_GENERIC_SMP_IDLE_THREAD=y
++CONFIG_GENERIC_STRNCPY_FROM_USER=y
++CONFIG_GENERIC_STRNLEN_USER=y
++CONFIG_GPIOLIB=y
++CONFIG_GPIO_DEVRES=y
++CONFIG_GPIO_SYSFS=y
++CONFIG_HARDIRQS_SW_RESEND=y
++CONFIG_HAS_DMA=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
++CONFIG_HAVE_ARCH_JUMP_LABEL=y
++CONFIG_HAVE_ARCH_KGDB=y
++CONFIG_HAVE_ARCH_PFN_VALID=y
++CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
++CONFIG_HAVE_ARCH_TRACEHOOK=y
++# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
++CONFIG_HAVE_BPF_JIT=y
++CONFIG_HAVE_CONTEXT_TRACKING=y
++CONFIG_HAVE_C_RECORDMCOUNT=y
++CONFIG_HAVE_DEBUG_KMEMLEAK=y
++CONFIG_HAVE_DMA_API_DEBUG=y
++CONFIG_HAVE_DMA_ATTRS=y
++CONFIG_HAVE_DMA_CONTIGUOUS=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_HAVE_GENERIC_HARDIRQS=y
++CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
++CONFIG_HAVE_KERNEL_GZIP=y
++CONFIG_HAVE_KERNEL_LZMA=y
++CONFIG_HAVE_KERNEL_LZO=y
++CONFIG_HAVE_KERNEL_XZ=y
++CONFIG_HAVE_LATENCYTOP_SUPPORT=y
++CONFIG_HAVE_MEMBLOCK=y
++CONFIG_HAVE_NET_DSA=y
++CONFIG_HAVE_OPROFILE=y
++CONFIG_HAVE_PERF_EVENTS=y
++CONFIG_HAVE_PROC_CPU=y
++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
++CONFIG_HAVE_UID16=y
++CONFIG_HWMON=y
++CONFIG_HW_RANDOM=y
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_PIMSM_V1=y
++CONFIG_IP_PIMSM_V2=y
++CONFIG_IRQ_WORK=y
++CONFIG_KTIME_SCALAR=y
++CONFIG_M25PXX_USE_FAST_READ=y
++CONFIG_MACH_NSB3AST=y
++CONFIG_MACH_NS_K330=y
++CONFIG_MDIO_BOARDINFO=y
++CONFIG_MODULES_USE_ELF_REL=y
++# CONFIG_MTD_CFI is not set
++CONFIG_MTD_M25P80=y
++CONFIG_NEED_DMA_MAP_STATE=y
++CONFIG_NEED_KUSER_HELPERS=y
++CONFIG_NEED_PER_CPU_KM=y
++CONFIG_OLD_SIGACTION=y
++CONFIG_OLD_SIGSUSPEND3=y
++CONFIG_PAGEFLAGS_EXTENDED=y
++CONFIG_PAGE_OFFSET=0xC0000000
++# CONFIG_PCI_SYSCALL is not set
++CONFIG_PERF_USE_VMALLOC=y
++CONFIG_PHYLIB=y
++CONFIG_PHYS_OFFSET=0x00000000
++CONFIG_PLAT_FA=y
++CONFIG_PLAT_FA_GPIO=y
++CONFIG_PLAT_FA_TIME=y
++# CONFIG_PREEMPT_RCU is not set
++# CONFIG_RCU_STALL_COMMON is not set
++# CONFIG_SCHED_HRTICK is not set
++# CONFIG_SCSI_MULTI_LUN is not set
++CONFIG_SERIO=y
++CONFIG_SERIO_LIBPS2=y
++CONFIG_SERIO_SERPORT=y
++CONFIG_SPI=y
++CONFIG_SPI_BITBANG=y
++CONFIG_SPI_CNS21XX=y
++CONFIG_SPI_DEBUG=y
++CONFIG_SPI_MASTER=y
++CONFIG_SPLIT_PTLOCK_CPUS=999999
++CONFIG_SYS_SUPPORTS_APM_EMULATION=y
++CONFIG_TICK_CPU_ACCOUNTING=y
++CONFIG_UID16=y
++CONFIG_UIDGID_CONVERTED=y
++CONFIG_UNCOMPRESS_INCLUDE="mach/uncompress.h"
++# CONFIG_USB_ARCH_HAS_XHCI is not set
++CONFIG_USB_SUPPORT=y
++CONFIG_VECTORS_BASE=0xffff0000
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_XZ_DEC_ARM=y
++CONFIG_XZ_DEC_BCJ=y
++CONFIG_ZBOOT_ROM_BSS=0x0
++CONFIG_ZBOOT_ROM_TEXT=0x0
++CONFIG_ZONE_DMA_FLAG=0
+diff --git a/feeds/targets/cns21xx/image/Makefile b/feeds/targets/cns21xx/image/Makefile
+new file mode 100644
+index 0000000..45dab98
+--- /dev/null
++++ b/feeds/targets/cns21xx/image/Makefile
+@@ -0,0 +1,120 @@
++#
++# Copyright (C) 2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++JFFS2_BLOCKSIZE:=64k
++
++include $(INCLUDE_DIR)/image.mk
++
++INITRAMFS_SUFFIX:=
++
++ifeq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
++ INITRAMFS_SUFFIX:=-initramfs
++endif
++
++define zimage_name
++$(IMG_PREFIX)-$(1)-zImage$(INITRAMFS_SUFFIX)
++endef
++
++define uimage_name
++$(IMG_PREFIX)-$(1)-uImage$(INITRAMFS_SUFFIX)
++endef
++
++define imgname
++$(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(patsubst jffs2-%,jffs2,$(patsubst squashfs-%,squashfs,$(1)))
++endef
++
++define rootfsname
++$(BIN_DIR)/$(IMG_PREFIX)-$(2)-root.$(patsubst jffs2-%,jffs2,$(patsubst squashfs-%,squashfs,$(1)))
++endef
++
++define build_squashfs
++ dd if=$(KDIR)/root.squashfs of=$(KDIR)/root.squashfs-$(1) bs=$(1) conv=sync
++ $(call add_jffs2_mark,$(KDIR)/root.squashfs-$(1))
++ dd if=$(KDIR)/root.squashfs-$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-root.squashfs-$(1) bs=$(1) conv=sync
++endef
++
++define prepare_zimage
++ echo -en "\x$(2)\x1c\xa0\xe3\x$(3)\x10\x81\xe3" > $(KDIR)/$(call zimage_name,$(1))
++ cat $(KDIR)/zImage >> $(KDIR)/$(call zimage_name,$(1))
++endef
++
++define prepare_uimage
++ $(call prepare_zimage,$(1),$(2),$(3))
++ mkimage -A arm -O linux -T kernel -a 0x100000 -e 0x100000 -C none \
++ -n 'OpenWrt Linux-$(LINUX_VERSION)' \
++ -d $(KDIR)/$(call zimage_name,$(1)) \
++ $(KDIR)/$(call uimage_name,$(1))
++endef
++
++define Image/Prepare
++ # NSB3AST : mach id 2917 (0xb65)
++ $(call prepare_zimage,nsb3ast,0b,65)
++ # NS-K330 : mach id 3108 (0xc24)
++ $(call prepare_uimage,ns-k330,0c,24)
++endef
++
++define Image/BuildKernel
++ cat $(KDIR)/$(call zimage_name,nsb3ast) > $(BIN_DIR)/$(call zimage_name,nsb3ast)
++ cat $(KDIR)/$(call zimage_name,ns-k330) > $(BIN_DIR)/$(call zimage_name,ns-k330)
++ cat $(KDIR)/$(call uimage_name,ns-k330) > $(BIN_DIR)/$(call uimage_name,ns-k330)
++endef
++
++define Image/Build/Generic
++ if [ `stat -c%s "$(KDIR)/$(call zimage_name,$(2))"` -gt 1048576 ]; then \
++ echo "Warning: $(KDIR)/$(call zimage_name,$(2)) is too big" >&2; \
++ else if [ `stat -c%s $(KDIR)/root.$(1)` -gt $(3) ]; then \
++ echo "Warning: of=$(BIN_DIR)/$(IMG_PREFIX)-root.$(1) is too big" >&2; \
++ else \
++ cat $(KDIR)/root.$(1) > $(call rootfsname,$(1),$(2)); \
++ ( \
++ dd if=$(KDIR)/$(call zimage_name,$(2)) bs=1024k conv=sync; \
++ dd if=$(BIN_DIR)/$(IMG_PREFIX)-root.$(1) \
++ ) > $(call imgname,$(1),$(2)).img; \
++ fi; fi
++endef
++
++define Image/Build/uImage
++ if [ `stat -c%s "$(KDIR)/$(call uimage_name,$(2))"` -gt 1048576 ]; then \
++ echo "Warning: $(KDIR)/$(call uimage_name,$(2)) is too big" >&2; \
++ else if [ `stat -c%s $(KDIR)/root.$(1)` -gt $(3) ]; then \
++ echo "Warning: of=$(BIN_DIR)/$(IMG_PREFIX)-root.$(1) is too big" >&2; \
++ else \
++ cat $(KDIR)/root.$(1) > $(call rootfsname,$(1),$(2)); \
++ ( \
++ dd if=$(KDIR)/$(call uimage_name,$(2)) bs=1024k conv=sync; \
++ dd if=$(BIN_DIR)/$(IMG_PREFIX)-root.$(1) \
++ ) > $(call imgname,$(1),$(2))-uImage.img; \
++ fi; fi
++endef
++
++define Image/Build/NSB3AST
++ $(call Image/Build/Generic,$(1),nsb3ast,7077888)
++endef
++
++define Image/Build/NSK330
++ $(call Image/Build/Generic,$(1),ns-k330,2686976)
++ $(call Image/Build/uImage,$(1),ns-k330,2686976)
++endef
++
++define Image/Build/squashfs
++ $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
++
++ $(call build_squashfs,64k)
++ $(call Image/Build/NSB3AST,squashfs-64k)
++ $(call Image/Build/NSK330,squashfs-64k)
++endef
++
++define Image/Build/jffs2-64k
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-root.$(1) bs=64k conv=sync
++endef
++
++define Image/Build
++ $(call Image/Build/$(1),$(1))
++endef
++
++$(eval $(call BuildImage))
+diff --git a/feeds/targets/cns21xx/modules.mk b/feeds/targets/cns21xx/modules.mk
+new file mode 100644
+index 0000000..9882ee8
+--- /dev/null
++++ b/feeds/targets/cns21xx/modules.mk
+@@ -0,0 +1,23 @@
++#
++# Copyright (C) 2103 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define KernelPackage/usb2-cns21xx
++ TITLE:=Support for the built-in EHCI controller of the CNS21xx SoCs
++ DEPENDS:=@TARGET_cns21xx +kmod-usb2
++ KCONFIG:=CONFIG_USB_EHCI_CNS21XX
++ FILES:=$(LINUX_DIR)/drivers/usb/host/ehci-cns21xx.ko
++ AUTOLOAD:=$(call AutoLoad,41,ehci-cns21xx,1)
++ $(call AddDepends/usb)
++endef
++
++define KernelPackage/usb2-cns21xx/description
++ Kernel support for the built-in EHCI controller of the CNS21xx SoCs.
++endef
++
++$(eval $(call KernelPackage,usb2-cns21xx))
++
++
+diff --git a/feeds/targets/cns21xx/patches-3.10/002-arm-debugll-printk.patch b/feeds/targets/cns21xx/patches-3.10/002-arm-debugll-printk.patch
+new file mode 100644
+index 0000000..0889be4
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/002-arm-debugll-printk.patch
+@@ -0,0 +1,24 @@
++--- a/kernel/printk.c
+++++ b/kernel/printk.c
++@@ -65,6 +65,10 @@ int console_printk[4] = {
++ DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */
++ };
++
+++#ifdef CONFIG_DEBUG_LL
+++extern void printascii(char *);
+++#endif /* CONFIG_DEBUG_LL */
+++
++ /*
++ * Low level drivers may need that to know if they can schedule in
++ * their unblank() callback or not. So let's export it.
++@@ -521,6 +525,10 @@ static ssize_t devkmsg_read(struct file
++ ts_usec = msg->ts_nsec;
++ do_div(ts_usec, 1000);
++
+++#ifdef CONFIG_DEBUG_LL
+++ printascii(printk_buf);
+++#endif
+++
++ /*
++ * If we couldn't merge continuation line fragments during the print,
++ * export the stored flags to allow an optional external merge of the
+diff --git a/feeds/targets/cns21xx/patches-3.10/003-arm-introduce-fa-platform.patch b/feeds/targets/cns21xx/patches-3.10/003-arm-introduce-fa-platform.patch
+new file mode 100644
+index 0000000..db0b080
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/003-arm-introduce-fa-platform.patch
+@@ -0,0 +1,47 @@
++--- a/arch/arm/Kconfig
+++++ b/arch/arm/Kconfig
++@@ -1028,10 +1028,15 @@ source "arch/arm/mach-w90x900/Kconfig"
++
++ source "arch/arm/mach-zynq/Kconfig"
++
+++source "arch/arm/plat-fa/Kconfig"
+++
++ # Definitions to make life easier
++ config ARCH_ACORN
++ bool
++
+++config PLAT_FA
+++ bool
+++
++ config PLAT_IOP
++ bool
++ select GENERIC_CLOCKEVENTS
++--- a/arch/arm/Makefile
+++++ b/arch/arm/Makefile
++@@ -205,6 +205,7 @@ machine-$(CONFIG_ARCH_SUNXI) += sunxi
++ plat-$(CONFIG_ARCH_OMAP) += omap
++ plat-$(CONFIG_ARCH_S3C64XX) += samsung
++ plat-$(CONFIG_PLAT_IOP) += iop
+++plat-$(CONFIG_PLAT_FA) += fa
++ plat-$(CONFIG_PLAT_ORION) += orion
++ plat-$(CONFIG_PLAT_PXA) += pxa
++ plat-$(CONFIG_PLAT_S3C24XX) += samsung
++--- /dev/null
+++++ b/arch/arm/plat-fa/Makefile
++@@ -0,0 +1,10 @@
+++#
+++# Makefile for the linux kernel.
+++#
+++
+++obj-y :=
+++
+++obj-m :=
+++obj-n :=
+++obj- :=
+++
++--- /dev/null
+++++ b/arch/arm/plat-fa/Kconfig
++@@ -0,0 +1,3 @@
+++if PLAT_FA
+++
+++endif
+diff --git a/feeds/targets/cns21xx/patches-3.10/004-arm-add-fa-time.patch b/feeds/targets/cns21xx/patches-3.10/004-arm-add-fa-time.patch
+new file mode 100644
+index 0000000..460e7cb
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/004-arm-add-fa-time.patch
+@@ -0,0 +1,143 @@
++--- /dev/null
+++++ b/arch/arm/plat-fa/include/plat/time.h
++@@ -0,0 +1,20 @@
+++/*
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This program is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License as published by
+++ * the Free Software Foundation; either version 2 of the License, or
+++ * (at your option) any later version.
+++ */
+++
+++#ifndef _FA_TIME_H
+++#define _FA_TIME_H
+++
+++#define FA_TIMER1 0
+++#define FA_TIMER2 1
+++#define FA_TIMER3 2
+++
+++int __init fa_timer_init(unsigned int mapbase, unsigned int irq,
+++ unsigned int timer, unsigned int freq);
+++
+++#endif /* _FA_TIME_H */
++--- /dev/null
+++++ b/arch/arm/plat-fa/time.c
++@@ -0,0 +1,97 @@
+++/*
+++ * Copyright (C) 2001-2006 Storlink, Corp.
+++ * Copyright (C) 2008-2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This program is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License as published by
+++ * the Free Software Foundation; either version 2 of the License, or
+++ * (at your option) any later version.
+++ */
+++
+++#include <linux/init.h>
+++#include <linux/interrupt.h>
+++#include <linux/irq.h>
+++#include <linux/io.h>
+++
+++#include <asm/mach/time.h>
+++#include <plat/time.h>
+++
+++/*
+++ * Register definitions for the timers
+++ */
+++#define TIMER_COUNT(_base, _tmr) ((_base) + 0x00 + (_tmr) * 0x10)
+++#define TIMER_LOAD(_base, _tmr) ((_base) + 0x04 + (_tmr) * 0x10)
+++#define TIMER_MATCH1(_base, _tmr) ((_base) + 0x08 + (_tmr) * 0x10)
+++#define TIMER_MATCH2(_base, _tmr) ((_base) + 0x0c + (_tmr) * 0x10)
+++
+++#define TIMER_CR(_base) ((_base) + 0x30)
+++#define TIMER_STATUS(_base) ((_base) + 0x34)
+++#define TIMER_MASK(_base) ((_base) + 0x38)
+++
+++#define TIMER_SIZE 0x3c
+++
+++#define TIMER_CR_ENABLE(x) (1 << ((x) * 3))
+++#define TIMER_CR_CLOCK(x) (1 << ((x) * 3 + 1))
+++#define TIMER_CR_INT(x) (1 << ((x) * 3 + 2))
+++#define TIMER_CR_DOWN(x) (1 << ((x) * 3 + 9))
+++
+++#define TIMER_MASK_MATCH1(x) (1 << ((x) * 3))
+++#define TIMER_MASK_MATCH2(x) (1 << ((x) * 3 + 1))
+++#define TIMER_MASK_OF(x) (1 << ((x) * 3 + 2))
+++
+++#define TIMER_MASK_ALL 0x7ff
+++
+++/*
+++ * IRQ handler for the timer
+++ */
+++static irqreturn_t fa_timer_interrupt(int irq, void *dev_id)
+++{
+++ timer_tick();
+++ return IRQ_HANDLED;
+++}
+++
+++static struct irqaction fa_timer_irq = {
+++ .name = "Timer Tick",
+++ .flags = IRQF_DISABLED | IRQF_TIMER,
+++ .handler = fa_timer_interrupt,
+++};
+++
+++int __init fa_timer_init(unsigned int mapbase, unsigned int irq,
+++ unsigned int timer, unsigned int freq)
+++{
+++ void __iomem *base;
+++
+++ base = ioremap(mapbase, TIMER_SIZE);
+++ if (!base)
+++ return -ENOMEM;
+++
+++ /* disable timers, clear status and mask all interrupts */
+++ __raw_writel(0, TIMER_CR(base));
+++ __raw_writel(0, TIMER_STATUS(base));
+++ __raw_writel(TIMER_MASK_ALL, TIMER_MASK(base));
+++
+++ /*
+++ * Make irqs happen for the system timer
+++ */
+++ setup_irq(irq, &fa_timer_irq);
+++
+++ /* Setup the timer */
+++ __raw_writel(freq / HZ, TIMER_COUNT(base, timer));
+++ __raw_writel(freq / HZ, TIMER_LOAD(base, timer));
+++ __raw_writel(0, TIMER_MATCH1(base, timer));
+++ __raw_writel(0, TIMER_MATCH2(base, timer));
+++
+++ /* Enable interrupt and start the timer */
+++ __raw_writel(TIMER_MASK_ALL & ~TIMER_MASK_OF(timer),
+++ TIMER_MASK(base));
+++
+++ __raw_writel(TIMER_CR_ENABLE(timer) |
+++ TIMER_CR_INT(timer) |
+++ TIMER_CR_DOWN(timer),
+++ TIMER_CR(base));
+++
+++ iounmap(base);
+++
+++ return 0;
+++}
++--- a/arch/arm/plat-fa/Kconfig
+++++ b/arch/arm/plat-fa/Kconfig
++@@ -1,3 +1,6 @@
++ if PLAT_FA
++
+++config PLAT_FA_TIME
+++ def_bool n
+++
++ endif
++--- a/arch/arm/plat-fa/Makefile
+++++ b/arch/arm/plat-fa/Makefile
++@@ -4,6 +4,8 @@
++
++ obj-y :=
++
+++obj-$(CONFIG_PLAT_FA_TIME) += time.o
+++
++ obj-m :=
++ obj-n :=
++ obj- :=
+diff --git a/feeds/targets/cns21xx/patches-3.10/005-arm-add-fa-gpio-driver.patch b/feeds/targets/cns21xx/patches-3.10/005-arm-add-fa-gpio-driver.patch
+new file mode 100644
+index 0000000..d7e8e88
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/005-arm-add-fa-gpio-driver.patch
+@@ -0,0 +1,343 @@
++--- /dev/null
+++++ b/arch/arm/plat-fa/gpio.c
++@@ -0,0 +1,283 @@
+++/*
+++ * Gpiochip and interrupt routines for Faraday FA526 based SoCs
+++ *
+++ * Copyright (C) 2008-2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
+++ * Copyright (C) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * Based on plat-mxc/gpio.c:
+++ * MXC GPIO supchip. (c) 2008 Daniel Mack <daniel@caiaq.de>
+++ * Copyright 2008 Juergen Beisert, kernel@pengutronix.de
+++ *
+++ * This program is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License as published by
+++ * the Free Software Foundation; either version 2 of the License, or
+++ * (at your option) any later version.
+++ */
+++
+++#include <linux/spinlock.h>
+++
+++#include <plat/gpio.h>
+++
+++#define GPIO_DATA_OUT 0x0
+++#define GPIO_DATA_IN 0x4
+++#define GPIO_DIR 0x8
+++#define GPIO_DATA_SET 0x10
+++#define GPIO_DATA_CLR 0x14
+++#define GPIO_PULL_EN 0x18
+++#define GPIO_PULL_TYPE 0x1C
+++#define GPIO_INT_EN 0x20
+++#define GPIO_INT_STAT 0x24
+++#define GPIO_INT_MASK 0x2C
+++#define GPIO_INT_CLR 0x30
+++#define GPIO_INT_TYPE 0x34
+++#define GPIO_INT_BOTH_EDGE 0x38
+++#define GPIO_INT_LEVEL 0x3C
+++#define GPIO_DEBOUNCE_EN 0x40
+++#define GPIO_DEBOUNCE_PRESCALE 0x44
+++
+++#define GPIO_REGS_SIZE 0x48
+++
+++static DEFINE_SPINLOCK(fa_gpio_lock);
+++
+++static inline struct fa_gpio_chip *to_fgc(struct gpio_chip *chip)
+++{
+++ return container_of(chip, struct fa_gpio_chip, gpio_chip);
+++}
+++
+++static void _fa_gpio_irq_setenable(struct irq_data *d, int enable)
+++{
+++ struct fa_gpio_chip *fgc = irq_get_chip_data(d->irq);
+++ void __iomem *base = fgc->mem_base;
+++ unsigned int gpio = d->irq - fgc->irq_base;
+++ unsigned int reg;
+++
+++ reg = __raw_readl(base + GPIO_INT_EN);
+++ reg = (reg & (~(1 << gpio))) | (!!enable << gpio);
+++ __raw_writel(reg, base + GPIO_INT_EN);
+++}
+++
+++static void fa_gpio_irq_ack(struct irq_data *d)
+++{
+++ struct fa_gpio_chip *fgc = irq_get_chip_data(d->irq);
+++ unsigned int gpio = d->irq - fgc->irq_base;
+++
+++ __raw_writel(1 << gpio, fgc->mem_base + GPIO_INT_CLR);
+++}
+++
+++static void fa_gpio_irq_mask(struct irq_data *d)
+++{
+++ _fa_gpio_irq_setenable(d, 0);
+++}
+++
+++static void fa_gpio_irq_unmask(struct irq_data *d)
+++{
+++ _fa_gpio_irq_setenable(d, 1);
+++}
+++
+++static int fa_gpio_irq_set_type(struct irq_data *d, unsigned int type)
+++{
+++ struct fa_gpio_chip *fgc = irq_get_chip_data(d->irq);
+++ void __iomem *base = fgc->mem_base;
+++ unsigned int gpio = d->irq - fgc->irq_base;
+++ unsigned int gpio_mask = 1 << gpio;
+++ unsigned int reg_both, reg_level, reg_type;
+++
+++ reg_type = __raw_readl(base + GPIO_INT_TYPE);
+++ reg_level = __raw_readl(base + GPIO_INT_LEVEL);
+++ reg_both = __raw_readl(base + GPIO_INT_BOTH_EDGE);
+++
+++ switch (type) {
+++ case IRQ_TYPE_EDGE_BOTH:
+++ reg_type &= ~gpio_mask;
+++ reg_both |= gpio_mask;
+++ break;
+++ case IRQ_TYPE_EDGE_RISING:
+++ reg_type &= ~gpio_mask;
+++ reg_both &= ~gpio_mask;
+++ reg_level &= ~gpio_mask;
+++ break;
+++ case IRQ_TYPE_EDGE_FALLING:
+++ reg_type &= ~gpio_mask;
+++ reg_both &= ~gpio_mask;
+++ reg_level |= gpio_mask;
+++ break;
+++ case IRQ_TYPE_LEVEL_HIGH:
+++ reg_type |= gpio_mask;
+++ reg_level &= ~gpio_mask;
+++ break;
+++ case IRQ_TYPE_LEVEL_LOW:
+++ reg_type |= gpio_mask;
+++ reg_level |= gpio_mask;
+++ break;
+++ default:
+++ return -EINVAL;
+++ }
+++
+++ __raw_writel(reg_type, base + GPIO_INT_TYPE);
+++ __raw_writel(reg_level, base + GPIO_INT_LEVEL);
+++ __raw_writel(reg_both, base + GPIO_INT_BOTH_EDGE);
+++
+++ fa_gpio_irq_ack(d);
+++
+++ return 0;
+++}
+++
+++static void fa_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
+++{
+++ struct fa_gpio_data *data = irq_get_handler_data(irq);
+++ unsigned int chip;
+++
+++ for (chip = 0; chip < data->nchips; chip++) {
+++ struct fa_gpio_chip *fgc = &data->chips[chip];
+++ unsigned int status;
+++ unsigned int i;
+++
+++ status = __raw_readl(fgc->mem_base + GPIO_INT_STAT);
+++ for (i = fgc->irq_base; status != 0; status >>= 1, i++) {
+++ if ((status & 1) == 0)
+++ continue;
+++
+++ BUG_ON(!(irq_desc[i].handle_irq));
+++ irq_desc[i].handle_irq(i, &irq_desc[i]);
+++ }
+++ }
+++}
+++
+++static struct irq_chip fa_gpio_irq_chip = {
+++ .name = "GPIO",
+++ .irq_ack = fa_gpio_irq_ack,
+++ .irq_mask = fa_gpio_irq_mask,
+++ .irq_unmask = fa_gpio_irq_unmask,
+++ .irq_set_type = fa_gpio_irq_set_type,
+++};
+++
+++static void _fa_gpio_set_direction(struct fa_gpio_chip *fgc, unsigned offset,
+++ int is_output)
+++{
+++ unsigned int reg;
+++
+++ reg = __raw_readl(fgc->mem_base + GPIO_DIR);
+++ if (is_output)
+++ reg |= 1 << offset;
+++ else
+++ reg &= ~(1 << offset);
+++ __raw_writel(reg, fgc->mem_base + GPIO_DIR);
+++}
+++
+++static void _fa_gpio_set(struct fa_gpio_chip *fgc, unsigned offset, int value)
+++{
+++ if (value)
+++ __raw_writel(1 << offset, fgc->mem_base + GPIO_DATA_SET);
+++ else
+++ __raw_writel(1 << offset, fgc->mem_base + GPIO_DATA_CLR);
+++}
+++
+++static void fa_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
+++{
+++ struct fa_gpio_chip *fgc = to_fgc(chip);
+++
+++ _fa_gpio_set(fgc, offset, value);
+++}
+++
+++static int fa_gpio_get(struct gpio_chip *chip, unsigned offset)
+++{
+++ struct fa_gpio_chip *fgc = to_fgc(chip);
+++
+++ return (__raw_readl(fgc->mem_base + GPIO_DATA_IN) >> offset) & 1;
+++}
+++
+++static int fa_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
+++{
+++ struct fa_gpio_chip *fgc = to_fgc(chip);
+++
+++ return fgc->irq_base + offset;
+++}
+++
+++static int fa_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
+++{
+++ struct fa_gpio_chip *fgc = to_fgc(chip);
+++ unsigned long flags;
+++
+++ spin_lock_irqsave(&fa_gpio_lock, flags);
+++
+++ _fa_gpio_set_direction(fgc, offset, 0);
+++
+++ spin_unlock_irqrestore(&fa_gpio_lock, flags);
+++
+++ return 0;
+++}
+++
+++static int fa_gpio_direction_output(struct gpio_chip *chip,
+++ unsigned offset,
+++ int value)
+++{
+++ struct fa_gpio_chip *fgc = to_fgc(chip);
+++ unsigned long flags;
+++
+++ spin_lock_irqsave(&fa_gpio_lock, flags);
+++
+++ _fa_gpio_set(fgc, offset, value);
+++ _fa_gpio_set_direction(fgc, offset, 1);
+++
+++ spin_unlock_irqrestore(&fa_gpio_lock, flags);
+++
+++ return 0;
+++}
+++
+++static int fa_gpio_init_chip(struct fa_gpio_chip *fgc)
+++{
+++ void __iomem *mem_base;
+++ unsigned int i;
+++ int err;
+++
+++ mem_base = ioremap(fgc->map_base, GPIO_REGS_SIZE);
+++ if (!mem_base)
+++ return -ENXIO;
+++
+++ fgc->mem_base = mem_base;
+++
+++ fgc->gpio_chip.direction_input = fa_gpio_direction_input;
+++ fgc->gpio_chip.direction_output = fa_gpio_direction_output;
+++ fgc->gpio_chip.get = fa_gpio_get;
+++ fgc->gpio_chip.set = fa_gpio_set;
+++ fgc->gpio_chip.to_irq = fa_gpio_to_irq;
+++
+++ /* disable, unmask and clear all interrupts */
+++ __raw_writel(0x0, mem_base + GPIO_INT_EN);
+++ __raw_writel(0x0, mem_base + GPIO_INT_MASK);
+++ __raw_writel(~0x0, mem_base + GPIO_INT_CLR);
+++
+++ for (i = fgc->irq_base;
+++ i < fgc->irq_base + fgc->gpio_chip.ngpio; i++) {
+++ irq_set_chip(i, &fa_gpio_irq_chip);
+++ irq_set_chip_data(i, fgc);
+++ irq_set_handler(i, handle_edge_irq);
+++ set_irq_flags(i, IRQF_VALID);
+++ }
+++
+++ err = gpiochip_add(&fgc->gpio_chip);
+++ if (err)
+++ goto unmap;
+++
+++ return 0;
+++
+++ unmap:
+++ iounmap(fgc->mem_base);
+++ return err;
+++}
+++
+++void __init fa_gpio_init(struct fa_gpio_data *data)
+++{
+++ unsigned int i;
+++
+++ for (i = 0; i < data->nchips; i++) {
+++ int err;
+++
+++ err = fa_gpio_init_chip(&data->chips[i]);
+++ if (WARN(err, "GPIO init failed\n"))
+++ return;
+++ }
+++
+++ irq_set_chained_handler(data->irq, fa_gpio_irq_handler);
+++ irq_set_handler_data(data->irq, data);
+++}
++--- /dev/null
+++++ b/arch/arm/plat-fa/include/plat/gpio.h
++@@ -0,0 +1,33 @@
+++/*
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#ifndef _FA_GPIO_H
+++#define _FA_GPIO_H
+++
+++#include <linux/init.h>
+++#include <linux/gpio.h>
+++#include <linux/irq.h>
+++#include <linux/io.h>
+++
+++struct fa_gpio_chip {
+++ struct gpio_chip gpio_chip;
+++ unsigned int map_base;
+++ unsigned int irq_base;
+++
+++ void __iomem *mem_base;
+++};
+++
+++struct fa_gpio_data {
+++ struct fa_gpio_chip *chips;
+++ unsigned int nchips;
+++ unsigned int irq;
+++};
+++
+++void __init fa_gpio_init(struct fa_gpio_data *data);
+++
+++#endif /* _FA_GPIO_H */
++--- a/arch/arm/plat-fa/Kconfig
+++++ b/arch/arm/plat-fa/Kconfig
++@@ -1,5 +1,8 @@
++ if PLAT_FA
++
+++config PLAT_FA_GPIO
+++ def_bool n
+++
++ config PLAT_FA_TIME
++ def_bool n
++
++--- a/arch/arm/plat-fa/Makefile
+++++ b/arch/arm/plat-fa/Makefile
++@@ -4,6 +4,7 @@
++
++ obj-y :=
++
+++obj-$(CONFIG_PLAT_FA_GPIO) += gpio.o
++ obj-$(CONFIG_PLAT_FA_TIME) += time.o
++
++ obj-m :=
+diff --git a/feeds/targets/cns21xx/patches-3.10/006-arm-add-fa-watchdog-driver.patch b/feeds/targets/cns21xx/patches-3.10/006-arm-add-fa-watchdog-driver.patch
+new file mode 100644
+index 0000000..2542794
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/006-arm-add-fa-watchdog-driver.patch
+@@ -0,0 +1,458 @@
++--- a/drivers/watchdog/Kconfig
+++++ b/drivers/watchdog/Kconfig
++@@ -391,6 +391,13 @@ config RETU_WATCHDOG
++ To compile this driver as a module, choose M here: the
++ module will be called retu_wdt.
++
+++config FA_WATCHDOG
+++ tristate "Faraday watchdog"
+++ depends on ARCH_GEMINI
+++ help
+++ Say Y here if you want support for the built-in watchdog timer
+++ found in some Faraday FA526 based SoCs.
+++
++ # AVR32 Architecture
++
++ config AT32AP700X_WDT
++--- a/drivers/watchdog/Makefile
+++++ b/drivers/watchdog/Makefile
++@@ -54,6 +54,7 @@ obj-$(CONFIG_TS72XX_WATCHDOG) += ts72xx_
++ obj-$(CONFIG_IMX2_WDT) += imx2_wdt.o
++ obj-$(CONFIG_UX500_WATCHDOG) += ux500_wdt.o
++ obj-$(CONFIG_RETU_WATCHDOG) += retu_wdt.o
+++obj-$(CONFIG_FA_WATCHDOG) += fa_wdt.o
++
++ # AVR32 Architecture
++ obj-$(CONFIG_AT32AP700X_WDT) += at32ap700x_wdt.o
++--- /dev/null
+++++ b/drivers/watchdog/fa_wdt.c
++@@ -0,0 +1,413 @@
+++/*
+++ * Watchdog driver for SoCs based on the Faraday FA526 core
+++ *
+++ * Copyright (C) 2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
+++ * Copyright (C) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This program is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License version 2 as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/kernel.h>
+++#include <linux/module.h>
+++#include <linux/init.h>
+++#include <linux/io.h>
+++#include <linux/fs.h>
+++#include <linux/notifier.h>
+++#include <linux/reboot.h>
+++#include <linux/uaccess.h>
+++#include <linux/miscdevice.h>
+++#include <linux/platform_device.h>
+++#include <linux/watchdog.h>
+++#include <linux/slab.h>
+++#include <linux/fa_wdt.h>
+++
+++#define FA_WDCOUNTER 0x0
+++#define FA_WDLOAD 0x4
+++#define FA_WDRESTART 0x8
+++
+++#define WDRESTART_MAGIC 0x5AB9
+++
+++#define FA_WDCR 0xC
+++
+++#define WDCR_CLOCK_5MHZ (1 << 4)
+++#define WDCR_SYS_RST (1 << 1)
+++#define WDCR_ENABLE (1 << 0)
+++
+++#define WDT_DEFAULT_TIMEOUT 13
+++
+++/* status bits */
+++#define WDT_ACTIVE 0
+++#define WDT_OK_TO_CLOSE 1
+++
+++static unsigned int timeout = WDT_DEFAULT_TIMEOUT;
+++static int nowayout = WATCHDOG_NOWAYOUT;
+++
+++static DEFINE_SPINLOCK(fa_wdt_lock);
+++
+++static struct platform_device *fa_wdt_dev;
+++
+++struct fa_wdt_struct {
+++ struct resource *res;
+++ struct device *dev;
+++ void __iomem *base;
+++ unsigned long status;
+++ unsigned int clock;
+++ unsigned int max_timeout;
+++};
+++
+++static const struct watchdog_info fa_wdt_info = {
+++ .identity = "Faraday watchdog",
+++ .options = WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING |
+++ WDIOF_SETTIMEOUT,
+++};
+++
+++/* Disable the watchdog. */
+++static void fa_wdt_stop(struct fa_wdt_struct *fa_wdt)
+++{
+++ spin_lock(&fa_wdt_lock);
+++
+++ __raw_writel(0, fa_wdt->base + FA_WDCR);
+++
+++ clear_bit(WDT_ACTIVE, &fa_wdt->status);
+++
+++ spin_unlock(&fa_wdt_lock);
+++}
+++
+++/* Service the watchdog */
+++static void fa_wdt_service(struct fa_wdt_struct *fa_wdt)
+++{
+++ __raw_writel(WDRESTART_MAGIC, fa_wdt->base + FA_WDRESTART);
+++}
+++
+++/* Enable and reset the watchdog. */
+++static void fa_wdt_start(struct fa_wdt_struct *fa_wdt)
+++{
+++ spin_lock(&fa_wdt_lock);
+++
+++ __raw_writel(timeout * fa_wdt->clock,
+++ fa_wdt->base + FA_WDLOAD);
+++
+++ fa_wdt_service(fa_wdt);
+++
+++ /* set clock before enabling */
+++ __raw_writel(WDCR_CLOCK_5MHZ | WDCR_SYS_RST,
+++ fa_wdt->base + FA_WDCR);
+++
+++ __raw_writel(WDCR_CLOCK_5MHZ | WDCR_SYS_RST | WDCR_ENABLE,
+++ fa_wdt->base + FA_WDCR);
+++
+++ set_bit(WDT_ACTIVE, &fa_wdt->status);
+++
+++ spin_unlock(&fa_wdt_lock);
+++}
+++
+++/* Watchdog device is opened, and watchdog starts running. */
+++static int fa_wdt_open(struct inode *inode, struct file *file)
+++{
+++ struct fa_wdt_struct *fa_wdt = platform_get_drvdata(fa_wdt_dev);
+++
+++ if (test_bit(WDT_ACTIVE, &fa_wdt->status))
+++ return -EBUSY;
+++
+++ file->private_data = fa_wdt;
+++
+++ fa_wdt_start(fa_wdt);
+++
+++ return nonseekable_open(inode, file);
+++}
+++
+++/* Close the watchdog device. */
+++static int fa_wdt_close(struct inode *inode, struct file *file)
+++{
+++ struct fa_wdt_struct *fa_wdt = file->private_data;
+++
+++ /* Disable the watchdog if possible */
+++ if (test_bit(WDT_OK_TO_CLOSE, &fa_wdt->status))
+++ fa_wdt_stop(fa_wdt);
+++ else
+++ dev_warn(fa_wdt->dev, "Device closed unexpectedly - timer will not stop\n");
+++
+++ return 0;
+++}
+++
+++/* Handle commands from user-space. */
+++static long fa_wdt_ioctl(struct file *file, unsigned int cmd,
+++ unsigned long arg)
+++{
+++ struct fa_wdt_struct *fa_wdt = file->private_data;
+++
+++ int value;
+++
+++ switch (cmd) {
+++ case WDIOC_KEEPALIVE:
+++ fa_wdt_service(fa_wdt);
+++ return 0;
+++
+++ case WDIOC_GETSUPPORT:
+++ return copy_to_user((struct watchdog_info *)arg, &fa_wdt_info,
+++ sizeof(fa_wdt_info)) ? -EFAULT : 0;
+++
+++ case WDIOC_SETTIMEOUT:
+++ if (get_user(value, (int *)arg))
+++ return -EFAULT;
+++
+++ if ((value < 1) || (value > fa_wdt->max_timeout))
+++ return -EINVAL;
+++
+++ timeout = value;
+++
+++ /* restart wdt to use new timeout */
+++ fa_wdt_stop(fa_wdt);
+++ fa_wdt_start(fa_wdt);
+++
+++ /* Fall through */
+++ case WDIOC_GETTIMEOUT:
+++ return put_user(timeout, (int *)arg);
+++
+++ case WDIOC_GETTIMELEFT:
+++ value = __raw_readl(fa_wdt->base + FA_WDCOUNTER);
+++ return put_user(value / fa_wdt->clock, (int *)arg);
+++
+++ default:
+++ return -ENOTTY;
+++ }
+++}
+++
+++/* Refresh the watchdog whenever device is written to. */
+++static ssize_t fa_wdt_write(struct file *file, const char *data,
+++ size_t len, loff_t *ppos)
+++{
+++ struct fa_wdt_struct *fa_wdt = file->private_data;
+++
+++ if (len) {
+++ if (!nowayout) {
+++ size_t i;
+++
+++ clear_bit(WDT_OK_TO_CLOSE, &fa_wdt->status);
+++ for (i = 0; i != len; i++) {
+++ char c;
+++
+++ if (get_user(c, data + i))
+++ return -EFAULT;
+++ if (c == 'V')
+++ set_bit(WDT_OK_TO_CLOSE,
+++ &fa_wdt->status);
+++ }
+++ }
+++ fa_wdt_service(fa_wdt);
+++ }
+++
+++ return len;
+++}
+++
+++static int fa_wdt_notify_sys(struct notifier_block *this,
+++ unsigned long code, void *unused)
+++{
+++ struct fa_wdt_struct *fa_wdt = platform_get_drvdata(fa_wdt_dev);
+++
+++ if (code == SYS_DOWN || code == SYS_HALT)
+++ fa_wdt_stop(fa_wdt);
+++
+++ return NOTIFY_DONE;
+++}
+++
+++static struct notifier_block fa_wdt_notifier = {
+++ .notifier_call = fa_wdt_notify_sys,
+++};
+++
+++static const struct file_operations fa_wdt_fops = {
+++ .owner = THIS_MODULE,
+++ .llseek = no_llseek,
+++ .unlocked_ioctl = fa_wdt_ioctl,
+++ .open = fa_wdt_open,
+++ .release = fa_wdt_close,
+++ .write = fa_wdt_write,
+++};
+++
+++static struct miscdevice fa_wdt_miscdev = {
+++ .minor = WATCHDOG_MINOR,
+++ .name = "watchdog",
+++ .fops = &fa_wdt_fops,
+++};
+++
+++static void fa_wdt_shutdown(struct platform_device *pdev)
+++{
+++ struct fa_wdt_struct *fa_wdt = platform_get_drvdata(pdev);
+++
+++ fa_wdt_stop(fa_wdt);
+++}
+++
+++static int fa_wdt_probe(struct platform_device *pdev)
+++{
+++ int ret;
+++ int res_size;
+++ struct resource *res;
+++ void __iomem *base;
+++ struct fa_wdt_struct *fa_wdt;
+++ struct fa_wdt_platform_data *pdata;
+++
+++ pdata = pdev->dev.platform_data;
+++ if (!pdata) {
+++ dev_err(&pdev->dev, "no platform data specified\n");
+++ return -EINVAL;
+++ }
+++
+++ if (!pdata->clock) {
+++ dev_err(&pdev->dev, "invalid clock value\n");
+++ return -EINVAL;
+++ }
+++
+++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+++ if (!res) {
+++ dev_err(&pdev->dev, "can't get device resources\n");
+++ return -ENODEV;
+++ }
+++
+++ res_size = resource_size(res);
+++ if (!request_mem_region(res->start, res_size, res->name)) {
+++ dev_err(&pdev->dev, "can't allocate %d bytes at %d address\n",
+++ res_size, res->start);
+++ return -ENOMEM;
+++ }
+++
+++ base = ioremap(res->start, res_size);
+++ if (!base) {
+++ dev_err(&pdev->dev, "ioremap failed\n");
+++ ret = -EIO;
+++ goto fail0;
+++ }
+++
+++ fa_wdt = kzalloc(sizeof(struct fa_wdt_struct), GFP_KERNEL);
+++ if (!fa_wdt) {
+++ dev_err(&pdev->dev, "can't allocate interface\n");
+++ ret = -ENOMEM;
+++ goto fail1;
+++ }
+++
+++ /* Setup fa_wdt driver structure */
+++ fa_wdt->base = base;
+++ fa_wdt->res = res;
+++ fa_wdt->dev = &pdev->dev;
+++ fa_wdt->clock = pdata->clock;
+++ fa_wdt->max_timeout = 0xffffffffU / pdata->clock;
+++
+++ /* Set up platform driver data */
+++ platform_set_drvdata(pdev, fa_wdt);
+++ fa_wdt_dev = pdev;
+++
+++ if (fa_wdt_miscdev.parent) {
+++ ret = -EBUSY;
+++ goto fail2;
+++ }
+++
+++ ret = register_reboot_notifier(&fa_wdt_notifier);
+++ if (ret)
+++ goto fail2;
+++
+++ fa_wdt_miscdev.parent = &pdev->dev;
+++
+++ ret = misc_register(&fa_wdt_miscdev);
+++ if (ret)
+++ goto fail3;
+++
+++ return 0;
+++
+++fail3:
+++ unregister_reboot_notifier(&fa_wdt_notifier);
+++fail2:
+++ platform_set_drvdata(pdev, NULL);
+++ kfree(fa_wdt);
+++fail1:
+++ iounmap(base);
+++fail0:
+++ release_mem_region(res->start, res_size);
+++
+++ return ret;
+++}
+++
+++static int fa_wdt_remove(struct platform_device *pdev)
+++{
+++ struct fa_wdt_struct *fa_wdt = platform_get_drvdata(pdev);
+++
+++ platform_set_drvdata(pdev, NULL);
+++ misc_deregister(&fa_wdt_miscdev);
+++ unregister_reboot_notifier(&fa_wdt_notifier);
+++ fa_wdt_dev = NULL;
+++ iounmap(fa_wdt->base);
+++ release_mem_region(fa_wdt->res->start, resource_size(fa_wdt->res));
+++
+++ kfree(fa_wdt);
+++
+++ return 0;
+++}
+++
+++#ifdef CONFIG_PM
+++static int fa_wdt_suspend(struct platform_device *pdev, pm_message_t message)
+++{
+++ struct fa_wdt_struct *fa_wdt = platform_get_drvdata(pdev);
+++ unsigned int reg;
+++
+++ reg = __raw_readw(fa_wdt->base + FA_WDCR);
+++ reg &= ~(WDCR_WDENABLE);
+++ __raw_writel(reg, fa_wdt->base + FA_WDCR);
+++
+++ return 0;
+++}
+++
+++static int fa_wdt_resume(struct platform_device *pdev)
+++{
+++ struct fa_wdt_struct *fa_wdt = platform_get_drvdata(pdev);
+++ unsigned int reg;
+++
+++ if (fa_wdt->status) {
+++ reg = __raw_readw(fa_wdt->base + FA_WDCR);
+++ reg |= WDCR_WDENABLE;
+++ __raw_writel(reg, fa_wdt->base + FA_WDCR);
+++ }
+++
+++ return 0;
+++}
+++#else
+++#define fa_wdt_suspend NULL
+++#define fa_wdt_resume NULL
+++#endif
+++
+++static struct platform_driver fa_wdt_driver = {
+++ .probe = fa_wdt_probe,
+++ .remove = fa_wdt_remove,
+++ .shutdown = fa_wdt_shutdown,
+++ .suspend = fa_wdt_suspend,
+++ .resume = fa_wdt_resume,
+++ .driver = {
+++ .name = "fa-wdt",
+++ .owner = THIS_MODULE,
+++ },
+++};
+++
+++static int __init fa_wdt_init(void)
+++{
+++ return platform_driver_probe(&fa_wdt_driver, fa_wdt_probe);
+++}
+++
+++static void __exit fa_wdt_exit(void)
+++{
+++ platform_driver_unregister(&fa_wdt_driver);
+++}
+++
+++module_init(fa_wdt_init);
+++module_exit(fa_wdt_exit);
+++
+++module_param(timeout, uint, 0);
+++MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds");
+++
+++module_param(nowayout, int, 0);
+++MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started");
+++
+++MODULE_AUTHOR("Paulius Zaleckas");
+++MODULE_AUTHOR("Gabor Juhos");
+++MODULE_DESCRIPTION("Watchdog driver for Faraday FA526 based SoCs");
+++MODULE_LICENSE("GPL v2");
+++MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
+++MODULE_ALIAS("platform:fa-wdt");
++--- /dev/null
+++++ b/include/linux/fa_wdt.h
++@@ -0,0 +1,13 @@
+++/*
+++ * Platform data definition for the Faraday watchdog driver
+++ */
+++
+++#ifndef _FA_WDT_H
+++#define _FA_WDT_H
+++
+++struct fa_wdt_platform_data {
+++ unsigned int clock;
+++};
+++
+++#endif /* _FA_WDT_H */
+++
+diff --git a/feeds/targets/cns21xx/patches-3.10/100-cns21xx-core.patch b/feeds/targets/cns21xx/patches-3.10/100-cns21xx-core.patch
+new file mode 100644
+index 0000000..e127c50
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/100-cns21xx-core.patch
+@@ -0,0 +1,2050 @@
++--- a/arch/arm/Kconfig
+++++ b/arch/arm/Kconfig
++@@ -206,6 +206,11 @@ config NEED_RET_TO_USER
++ config ARCH_MTD_XIP
++ bool
++
+++config ARM_L1_CACHE_SHIFT_4
+++ bool
+++ help
+++ Setting ARM L1 cache line size to 16 bytes.
+++
++ config VECTORS_BASE
++ hex
++ default 0xffff0000 if MMU || CPU_HIGH_VECTOR
++@@ -361,6 +366,15 @@ config ARCH_AT91
++ This enables support for systems based on Atmel
++ AT91RM9200 and AT91SAM9* processors.
++
+++config ARCH_CNS21XX
+++ bool "Cavium Networks CNS21xx family"
+++ select CPU_FA526
+++ select PLAT_FA
+++ select PLAT_FA_TIME
+++ select ARM_L1_CACHE_SHIFT_4
+++ help
+++ Support for Cavium Networks CNS21xx family.
+++
++ config ARCH_CLPS711X
++ bool "Cirrus Logic CLPS711x/EP721x/EP731x-based"
++ select ARCH_REQUIRE_GPIOLIB
++@@ -930,6 +944,8 @@ source "arch/arm/mach-davinci/Kconfig"
++
++ source "arch/arm/mach-dove/Kconfig"
++
+++source "arch/arm/mach-cns21xx/Kconfig"
+++
++ source "arch/arm/mach-ep93xx/Kconfig"
++
++ source "arch/arm/mach-footbridge/Kconfig"
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/Kconfig
++@@ -0,0 +1,6 @@
+++if ARCH_CNS21XX
+++
+++menu "Cavium Networks CNS21xx based machines"
+++endmenu
+++
+++endif
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/Makefile
++@@ -0,0 +1,10 @@
+++#
+++# Makefile for the linux kernel.
+++#
+++
+++# Object file lists.
+++
+++obj-y := core.o irq.o mm.o time.o idle.o
+++
+++# machine specific files
+++
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/Makefile.boot
++@@ -0,0 +1,3 @@
+++ zreladdr-y += 0x00008000
+++params_phys-y := 0x00000100
+++initrd_phys-y := 0x00C00000
++--- a/arch/arm/Makefile
+++++ b/arch/arm/Makefile
++@@ -146,6 +146,7 @@ machine-$(CONFIG_ARCH_AT91) += at91
++ machine-$(CONFIG_ARCH_BCM) += bcm
++ machine-$(CONFIG_ARCH_BCM2835) += bcm2835
++ machine-$(CONFIG_ARCH_CLPS711X) += clps711x
+++machine-$(CONFIG_ARCH_CNS21XX) += cns21xx
++ machine-$(CONFIG_ARCH_CNS3XXX) += cns3xxx
++ machine-$(CONFIG_ARCH_DAVINCI) += davinci
++ machine-$(CONFIG_ARCH_DOVE) += dove
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/common.h
++@@ -0,0 +1,20 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#ifndef _MACH_CNS21XX_COMMON_H
+++#define _MACH_CNS21XX_COMMON_H
+++
+++void cns21xx_restart(char mode, const char *cmd);
+++void cns21xx_map_io(void);
+++void cns21xx_init_irq(void);
+++void cns21xx_timer_init(void);
+++
+++extern struct sys_timer cns21xx_timer;
+++
+++#endif /* _MACH_CNS21XX_COMMON_H */
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/mm.c
++@@ -0,0 +1,170 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/mm.h>
+++#include <linux/init.h>
+++
+++#include <asm/mach/map.h>
+++
+++#include <mach/hardware.h>
+++#include <mach/cns21xx.h>
+++
+++#include "common.h"
+++
+++/*
+++ * Standard IO mapping
+++ */
+++static struct map_desc cns21xx_io_desc[] __initdata = {
+++ {
+++ .virtual = CNS21XX_FLASH_BANK0_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_FLASH_BANK0_BASE),
+++ .length = SZ_256M,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_IDE_DEVICE_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_IDE_DEVICE_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_GDMAC_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_GDMAC_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_NIC_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_NIC_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_SPI_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_SPI_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_PCM_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_PCM_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_I2C_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_I2C_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_I2S_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_I2S_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_DDRC_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_DDRC_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_SMC_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_SMC_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_IDE_CTRL_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_IDE_CTRL_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_MISC_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_MISC_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_CPM_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_CPM_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_UART0_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_UART0_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_UART1_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_UART1_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_TIMER_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_TIMER_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_WDT_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_WDT_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_RTC_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_RTC_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_GPIOA_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_GPIOA_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_GPIOB_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_GPIOB_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_PCI_CFGDATA_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_PCI_CFGDATA_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_PCI_CFGADDR_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_PCI_CFGADDR_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_OHCI_CONFIG_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_OHCI_CONFIG_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_OHCI_CTRL_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_OHCI_CTRL_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_EHCI_CONFIG_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_EHCI_CONFIG_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_EHCI_CTRL_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_EHCI_CTRL_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_USB_DEVICE_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_USB_DEVICE_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }, {
+++ .virtual = CNS21XX_INTC_BASE_VIRT,
+++ .pfn = __phys_to_pfn(CNS21XX_INTC_BASE),
+++ .length = SZ_4K,
+++ .type = MT_DEVICE
+++ }
+++};
+++
+++void __init cns21xx_map_io(void)
+++{
+++ iotable_init(cns21xx_io_desc, ARRAY_SIZE(cns21xx_io_desc));
+++}
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/hardware.h
++@@ -0,0 +1,20 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#ifndef _CNS21XX_HARDWARE_H
+++#define _CNS21XX_HARDWARE_H
+++
+++#ifndef __ASSEMBLY__
+++extern unsigned long cns21xx_get_pll_freq(void);
+++extern unsigned long cns21xx_get_cpu_freq(void);
+++extern unsigned long cns21xx_get_ahb_freq(void);
+++extern unsigned long cns21xx_get_apb_freq(void);
+++#endif
+++
+++#endif /* _CNS21XX_HARDWARE_H */
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/debug-macro.S
++@@ -0,0 +1,25 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <mach/cns21xx.h>
+++
+++/* TODO: make it configurable */
+++#define CNS21XX_DEBUG_UART_BASE CNS21XX_UART0_BASE
+++#define CNS21XX_DEBUG_UART_BASE_VIRT CNS21XX_UART0_BASE_VIRT
+++
+++ .macro addruart, rp, rv
+++ mov \rp, #(CNS21XX_DEBUG_UART_BASE) @ physical
+++ mov \rv, #(CNS21XX_DEBUG_UART_BASE_VIRT & 0xff000000) @virtual
+++ orr \rv, \rv, #(CNS21XX_DEBUG_UART_BASE_VIRT & 0x00ff0000)
+++ orr \rv, \rv, #(CNS21XX_DEBUG_UART_BASE_VIRT & 0x0000ff00)
+++ orr \rv, \rv, #(CNS21XX_DEBUG_UART_BASE_VIRT & 0x000000ff)
+++ .endm
+++
+++#define UART_SHIFT 2
+++#include <asm/hardware/debug-8250.S>
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/entry-macro.S
++@@ -0,0 +1,39 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <mach/cns21xx.h>
+++#include <mach/irqs.h>
+++
+++#define INTC_IRQ_STATUS 0x1c
+++
+++ .macro disable_fiq
+++ .endm
+++
+++ .macro get_irqnr_preamble, base, tmp
+++ .endm
+++
+++ .macro arch_ret_to_user, tmp1, tmp2
+++ .endm
+++
+++ .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
+++ ldr \base, =(CNS21XX_INTC_BASE_VIRT + INTC_IRQ_STATUS)
+++ ldr \irqstat, [\base]
+++ mov \irqnr, #0
+++9001:
+++ tst \irqstat, #1
+++ bne 9002f
+++ add \irqnr, \irqnr, #1
+++ mov \irqstat, \irqstat, lsr #1
+++ cmp \irqnr, #CNS21XX_NR_INTC_IRQS
+++ bcc 9001b
+++9002:
+++ .endm
+++
+++ .macro irq_prio_table
+++ .endm
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/io.h
++@@ -0,0 +1,18 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#ifndef _CNS21XX_IO_H
+++#define _CNS21XX_IO_H
+++
+++#define IO_SPACE_LIMIT 0xffffffff
+++
+++#define __io(p) __typesafe_io(p)
+++#define __mem_pci(a) (a)
+++
+++#endif /* _CNS21XX_IO_H */
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/irqs.h
++@@ -0,0 +1,53 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#ifndef _CNS21XX_IRQS_H
+++#define _CNS21XX_IRQS_H
+++
+++#define CNS21XX_IRQ_TIMER1 0
+++#define CNS21XX_IRQ_TIMER2 1
+++#define CNS21XX_IRQ_CPM 2
+++#define CNS21XX_IRQ_WDT 3
+++#define CNS21XX_IRQ_GPIO 4
+++#define CNS21XX_IRQ_PCI_INTA 5
+++#define CNS21XX_IRQ_PCI_INTB 6
+++#define CNS21XX_IRQ_PCI_BROKEN 7
+++#define CNS21XX_IRQ_AHB2PCI 8
+++#define CNS21XX_IRQ_UART0 9
+++#define CNS21XX_IRQ_UART1 10
+++#define CNS21XX_IRQ_GDMAC_TC 11
+++#define CNS21XX_IRQ_GDMAC_ERR 12
+++#define CNS21XX_IRQ_PCMCIA 13
+++#define CNS21XX_IRQ_RTC 14
+++#define CNS21XX_IRQ_PCM 15
+++#define CNS21XX_IRQ_USB_DEVICE 16
+++#define CNS21XX_IRQ_IDE 17
+++#define CNS21XX_IRQ_NIC_STATUS 18
+++#define CNS21XX_IRQ_NIC_TXTC 19
+++#define CNS21XX_IRQ_NIC_RXRC 20
+++#define CNS21XX_IRQ_NIC_TXQE 21
+++#define CNS21XX_IRQ_NIC_RXQF 22
+++#define CNS21XX_IRQ_OHCI 23
+++#define CNS21XX_IRQ_EHCI 24
+++#define CNS21XX_IRQ_I2S 25
+++#define CNS21XX_IRQ_SPI 26
+++#define CNS21XX_IRQ_I2C 27
+++#define CNS21XX_IRQ_USB_VBUS 28
+++#define CNS21XX_IRQ_EXT_29 29
+++#define CNS21XX_IRQ_EXT_30 30
+++#define CNS21XX_IRQ_HSDMAC 31
+++
+++#define CNS21XX_GPIO_IRQ_BASE 32
+++
+++#define CNS21XX_NR_INTC_IRQS 32
+++#define CNS21XX_NR_GPIO_IRQS 64
+++
+++#define NR_IRQS 96
+++
+++#endif /* _CNS21XX_IRQS_H */
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/timex.h
++@@ -0,0 +1,15 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#ifndef _CNS21XX_TIMEX_H
+++#define _CNS21XX_TIMEX_H
+++
+++#define CLOCK_TICK_RATE 43750000
+++
+++#endif /* _CNS21XX_TIMEX_H */
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/uncompress.h
++@@ -0,0 +1,40 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#ifndef _CNS21XX_UNCOMPRESS_H
+++#define _CNS21XX_UNCOMPRESS_H
+++
+++#define UART_BASE 0x78000000
+++
+++#define UART_REG(offs) (*((volatile unsigned int *)(UART_BASE + offs)))
+++
+++#define UART_THR UART_REG(0x00)
+++#define UART_LSR UART_REG(0x14)
+++#define THR_EMPTY (1 << 5)
+++
+++#define UART_THR_EMPTY() (((UART_LSR) & THR_EMPTY) == (THR_EMPTY))
+++
+++static void putc(int c)
+++{
+++ if (c != 0) {
+++ while (!UART_THR_EMPTY())
+++ barrier();
+++
+++ UART_THR = (int)(c & 0xFF);
+++ }
+++}
+++
+++static inline void flush(void)
+++{
+++}
+++
+++#define arch_decomp_setup()
+++#define arch_decomp_wdog()
+++
+++#endif /* _CNS21XX_UNCOMPRESS_H */
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/irq.c
++@@ -0,0 +1,177 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/init.h>
+++#include <linux/interrupt.h>
+++#include <linux/irq.h>
+++#include <linux/io.h>
+++#include <linux/ioport.h>
+++#include <linux/cpu.h>
+++
+++#include <asm/system_misc.h>
+++
+++#include <mach/cns21xx.h>
+++
+++#define INTC_INTERRUPT_RAW_STATUS_REG 0x000
+++#define INTC_EDGE_INTERRUPT_SOURCE_CLEAR_REG 0x004
+++#define INTC_INTERRUPT_MASK_REG 0x008
+++#define INTC_INTERRUPT_MASK_CLEAR_REG 0x00c
+++#define INTC_INTERRUPT_TRIGGER_MODE_REG 0x010
+++#define INTC_INTERRUPT_TRIGGER_LEVEL_REG 0x014
+++#define INTC_FIQ_SELECT_REG 0x018
+++#define INTC_IRQ_STATUS_REG 0x01c
+++#define INTC_FIQ_STATUS_REG 0x020
+++#define INTC_SOFTWARE_INTERRUPT_REG 0x024
+++#define INTC_SOFTWARE_INTERRUPT_CLEAR_REG 0x028
+++#define INTC_SOFTWARE_PRIORITY_MASK_REG 0x02c
+++#define INTC_POWER_MANAGEMENT_INTERRUPT_REG 0x034
+++
+++#define INTC_VECTOR_ADDRESS_REG(_x) ((_x) + 0x040)
+++#define INTC_PRIORITY_REG(_x) ((_x) + 0x0c0)
+++#define INTC_IRQ_VECTOR_ADDRESS_REG 0x140
+++#define INTC_VECTOR_INTERRUPT_ENABLE_REG 0x144
+++
+++#define INTC_SIZE 0x148
+++
+++static unsigned int cns21xx_irq_types[CNS21XX_NR_INTC_IRQS] = {
+++ [CNS21XX_IRQ_TIMER1] = IRQ_TYPE_EDGE_RISING,
+++ [CNS21XX_IRQ_TIMER2] = IRQ_TYPE_EDGE_RISING,
+++ [CNS21XX_IRQ_CPM] = IRQ_TYPE_EDGE_FALLING,
+++ [CNS21XX_IRQ_WDT] = IRQ_TYPE_EDGE_RISING,
+++ [CNS21XX_IRQ_GPIO] = IRQ_TYPE_NONE,
+++ [CNS21XX_IRQ_PCI_INTA] = IRQ_TYPE_LEVEL_LOW,
+++ [CNS21XX_IRQ_PCI_INTB] = IRQ_TYPE_LEVEL_LOW,
+++ [CNS21XX_IRQ_PCI_BROKEN] = IRQ_TYPE_LEVEL_HIGH,
+++ [CNS21XX_IRQ_AHB2PCI] = IRQ_TYPE_LEVEL_HIGH,
+++ [CNS21XX_IRQ_UART0] = IRQ_TYPE_LEVEL_HIGH,
+++ [CNS21XX_IRQ_UART1] = IRQ_TYPE_LEVEL_HIGH,
+++ [CNS21XX_IRQ_GDMAC_TC] = IRQ_TYPE_LEVEL_HIGH,
+++ [CNS21XX_IRQ_GDMAC_ERR] = IRQ_TYPE_LEVEL_HIGH,
+++ [CNS21XX_IRQ_PCMCIA] = IRQ_TYPE_NONE,
+++ [CNS21XX_IRQ_RTC] = IRQ_TYPE_LEVEL_HIGH,
+++ [CNS21XX_IRQ_PCM] = IRQ_TYPE_LEVEL_LOW,
+++ [CNS21XX_IRQ_USB_DEVICE] = IRQ_TYPE_LEVEL_LOW,
+++ [CNS21XX_IRQ_IDE] = IRQ_TYPE_LEVEL_HIGH,
+++ [CNS21XX_IRQ_NIC_STATUS] = IRQ_TYPE_LEVEL_HIGH,
+++ [CNS21XX_IRQ_NIC_TXTC] = IRQ_TYPE_EDGE_RISING,
+++ [CNS21XX_IRQ_NIC_RXRC] = IRQ_TYPE_EDGE_RISING,
+++ [CNS21XX_IRQ_NIC_TXQE] = IRQ_TYPE_EDGE_RISING,
+++ [CNS21XX_IRQ_NIC_RXQF] = IRQ_TYPE_EDGE_RISING,
+++ [CNS21XX_IRQ_OHCI] = IRQ_TYPE_LEVEL_LOW,
+++ [CNS21XX_IRQ_EHCI] = IRQ_TYPE_LEVEL_LOW,
+++ [CNS21XX_IRQ_I2S] = IRQ_TYPE_LEVEL_LOW,
+++ [CNS21XX_IRQ_SPI] = IRQ_TYPE_LEVEL_LOW,
+++ [CNS21XX_IRQ_I2C] = IRQ_TYPE_LEVEL_LOW,
+++ [CNS21XX_IRQ_USB_VBUS] = IRQ_TYPE_EDGE_RISING,
+++ [CNS21XX_IRQ_EXT_29] = IRQ_TYPE_NONE,
+++ [CNS21XX_IRQ_EXT_30] = IRQ_TYPE_NONE,
+++ [CNS21XX_IRQ_HSDMAC] = IRQ_TYPE_EDGE_RISING,
+++};
+++
+++static void __iomem *cns21xx_intc_base;
+++
+++static inline void cns21xx_intc_writel(u32 val, unsigned int reg)
+++{
+++ __raw_writel(val, cns21xx_intc_base + reg);
+++}
+++
+++static inline u32 cns21xx_intc_readl(unsigned int reg)
+++{
+++ return __raw_readl(cns21xx_intc_base + reg);
+++}
+++
+++static void cns21xx_irq_ack(struct irq_data *d)
+++{
+++ cns21xx_intc_writel(1 << d->irq, INTC_EDGE_INTERRUPT_SOURCE_CLEAR_REG);
+++}
+++
+++static void cns21xx_irq_mask(struct irq_data *d)
+++{
+++ cns21xx_intc_writel(1 << d->irq, INTC_INTERRUPT_MASK_REG);
+++}
+++
+++static void cns21xx_irq_unmask(struct irq_data *d)
+++{
+++ cns21xx_intc_writel(1 << d->irq, INTC_INTERRUPT_MASK_CLEAR_REG);
+++}
+++
+++static struct irq_chip cns21xx_irq_chip = {
+++ .name = "INTC",
+++ .irq_ack = cns21xx_irq_ack,
+++ .irq_mask = cns21xx_irq_mask,
+++ .irq_unmask = cns21xx_irq_unmask,
+++};
+++
+++static struct resource cns21xx_intc_resource = {
+++ .name = "INTC",
+++ .flags = IORESOURCE_MEM,
+++ .start = CNS21XX_INTC_BASE,
+++ .end = CNS21XX_INTC_BASE + INTC_SIZE - 1,
+++};
+++
+++void __init cns21xx_init_irq(void)
+++{
+++ unsigned int mode = 0;
+++ unsigned int level = 0;
+++ int i;
+++
+++ /*
+++ * Disable the idle handler by default since it is buggy
+++ * For more info see arch/arm/mach-gemini/idle.c
+++ */
+++ cpu_idle_poll_ctrl(true);
+++
+++ request_resource(&iomem_resource, &cns21xx_intc_resource);
+++ cns21xx_intc_base = ioremap(cns21xx_intc_resource.start, INTC_SIZE);
+++
+++ cns21xx_intc_writel(0xffffffff, INTC_INTERRUPT_MASK_REG);
+++ cns21xx_intc_writel(0xffffffff, INTC_EDGE_INTERRUPT_SOURCE_CLEAR_REG);
+++ cns21xx_intc_writel(0xffffffff, INTC_SOFTWARE_INTERRUPT_CLEAR_REG);
+++ cns21xx_intc_writel(0, INTC_SOFTWARE_PRIORITY_MASK_REG);
+++ cns21xx_intc_writel(0, INTC_FIQ_SELECT_REG);
+++ cns21xx_intc_writel(0, INTC_VECTOR_INTERRUPT_ENABLE_REG);
+++
+++ for (i = 0; i < ARRAY_SIZE(cns21xx_irq_types); i++) {
+++ irq_flow_handler_t handler;
+++
+++ switch (cns21xx_irq_types[i]) {
+++ case IRQ_TYPE_EDGE_RISING:
+++ handler = handle_edge_irq;
+++ mode |= (1 << i);
+++ break;
+++
+++ case IRQ_TYPE_EDGE_FALLING:
+++ handler = handle_edge_irq;
+++ mode |= (1 << i);
+++ level |= (1 << i);
+++ break;
+++
+++ case IRQ_TYPE_LEVEL_LOW:
+++ handler = handle_level_irq;
+++ level |= (1 << i);
+++ break;
+++
+++ case IRQ_TYPE_LEVEL_HIGH:
+++ case IRQ_TYPE_NONE:
+++ handler = handle_level_irq;
+++ break;
+++
+++ default:
+++ BUG();
+++ break;
+++ }
+++
+++ irq_set_chip(i, &cns21xx_irq_chip);
+++ irq_set_handler(i, handler);
+++ set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
+++ }
+++
+++ cns21xx_intc_writel(mode, INTC_INTERRUPT_TRIGGER_MODE_REG);
+++ cns21xx_intc_writel(level, INTC_INTERRUPT_TRIGGER_LEVEL_REG);
+++}
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/time.c
++@@ -0,0 +1,25 @@
+++/*
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/init.h>
+++#include <linux/irq.h>
+++
+++#include <asm/mach/time.h>
+++
+++#include <plat/time.h>
+++#include <mach/hardware.h>
+++#include <mach/cns21xx.h>
+++
+++#include "common.h"
+++
+++void __init cns21xx_timer_init(void)
+++{
+++ fa_timer_init(CNS21XX_TIMER_BASE, CNS21XX_IRQ_TIMER1, FA_TIMER1,
+++ cns21xx_get_apb_freq());
+++}
+++
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/cns21xx_powermgmt.h
++@@ -0,0 +1,591 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#ifndef _CNS21XX_POWERMGMT_H
+++#define _CNS21XX_POWERMGMT_H
+++
+++#define PWRMGT_MEM_MAP_VALUE(reg_offset) \
+++ (*((u32 volatile *)(CNS21XX_CPM_BASE_VIRT + reg_offset)))
+++
+++/*
+++ * define access macros
+++ */
+++#define PWRMGT_CLOCK_GATE_CONTROL0_REG PWRMGT_MEM_MAP_VALUE(0x00)
+++#define PWRMGT_CLOCK_GATE_CONTROL1_REG PWRMGT_MEM_MAP_VALUE(0x04)
+++#define PWRMGT_SOFTWARE_RESET_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x08)
+++#define PWRMGT_SYSTEM_CLOCK_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x0C)
+++#define PWRMGT_PLL_POWER_DOWN_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x10)
+++#define PWRMGT_CPU_INITIALIZATION_REG PWRMGT_MEM_MAP_VALUE(0x14)
+++#define PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x1C)
+++#define PWRMGT_USB_DEVICE_POWERMGT_REG PWRMGT_MEM_MAP_VALUE(0x20)
+++#define PWRMGT_REGULATOR_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x24)
+++#define PWRMGT_RTC_XTAL_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x28)
+++#define PWRMGT_PLL250_CONTROL_REG PWRMGT_MEM_MAP_VALUE(0x2C)
+++
+++
+++/*
+++ * define constants macros
+++ */
+++#define PWRMGT_GLOBAL_SOFTWARE_RESET_MASK_BIT_INDEX 0
+++#define PWRMGT_PCMCIA_SOFTWARE_RESET_BIT_INDEX 1
+++#define PWRMGT_IDE_SOFTWARE_RESET_BIT_INDEX 2
+++#define PWRMGT_VIC_SOFTWARE_RESET_BIT_INDEX 3
+++#define PWRMGT_DMA_SOFTWARE_RESET_BIT_INDEX 4
+++#define PWRMGT_NIC_SOFTWARE_RESET_BIT_INDEX 5
+++#define PWRMGT_USB_HOST_SOFTWARE_RESET_BIT_INDEX 6
+++#define PWRMGT_PCI_BRIDGE_SOFTWARE_RESET_BIT_INDEX 7
+++#define PWRMGT_P2S_SOFTWARE_RESET_BIT_INDEX 8
+++#define PWRMGT_UART0_SOFTWARE_RESET_BIT_INDEX 9
+++#define PWRMGT_UART1_SOFTWARE_RESET_BIT_INDEX 10
+++#define PWRMGT_TIMER_SOFTWARE_RESET_BIT_INDEX 11
+++#define PWRMGT_WDTIMER_SOFTWARE_RESET_BIT_INDEX 12
+++#define PWRMGT_GPIO_SOFTWARE_RESET_BIT_INDEX 13
+++#define PWRMGT_USB_DEVICE_SOFTWARE_RESET_BIT_INDEX 14
+++#define PWRMGT_FAST_ETHERNET_PHY_SOFTWARE_RESET_BIT_INDEX 15
+++#define PWRMGT_HSDMA_SOFTWARE_RESET_BIT_INDEX 16
+++
+++#define PWRMGT_PLL_FREQUENCY_175MHZ (0 << 0)
+++#define PWRMGT_PLL_FREQUENCY_200MHZ (1 << 0)
+++#define PWRMGT_PLL_FREQUENCY_225MHZ (2 << 0)
+++#define PWRMGT_PLL_FREQUENCY_250MHZ (3 << 0)
+++
+++#define PWRMGT_CPUCLK_DIVIDER_BY_1 (0 << 2)
+++#define PWRMGT_CPUCLK_DIVIDER_BY_2 (1 << 2)
+++#define PWRMGT_CPUCLK_DIVIDER_BY_3 (2 << 2)
+++#define PWRMGT_CPUCLK_DIVIDER_BY_4 (3 << 2)
+++
+++#define PWRMGT_HCLK_DIVIDER_BY_1 (0 << 4)
+++#define PWRMGT_HCLK_DIVIDER_BY_2 (1 << 4)
+++#define PWRMGT_HCLK_DIVIDER_BY_3 (2 << 4)
+++#define PWRMGT_HCLK_DIVIDER_BY_4 (3 << 4)
+++
+++#define PWRMGT_HCLK_SOURCE_FCLK (0 << 6)
+++#define PWRMGT_HCLK_SOURCE_125MHZ (1 << 6)
+++
+++#define PWRMGT_PCLK_DIVIDER_BY_1 (0 << 8)
+++#define PWRMGT_PCLK_DIVIDER_BY_2 (1 << 8)
+++#define PWRMGT_PCLK_DIVIDER_BY_3 (2 << 8)
+++#define PWRMGT_PCLK_DIVIDER_BY_4 (3 << 8)
+++
+++#define PWRMGT_PCICLK_DIVIDER_BY_1 (0 << 10)
+++#define PWRMGT_PCICLK_DIVIDER_BY_2 (1 << 10)
+++#define PWRMGT_PCICLK_DIVIDER_BY_3 (2 << 10)
+++#define PWRMGT_PCICLK_DIVIDER_BY_4 (3 << 10)
+++
+++
+++#define PWRMGT_PLLCLK_TO_CPUCLK_RATIO_BY_1 1
+++#define PWRMGT_PLLCLK_TO_CPUCLK_RATIO_BY_2 2
+++#define PWRMGT_PLLCLK_TO_CPUCLK_RATIO_BY_3 3
+++#define PWRMGT_PLLCLK_TO_CPUCLK_RATIO_BY_4 4
+++
+++#define PWRMGT_CPUCLK_TO_HCLK_RATIO_BY_1 1
+++#define PWRMGT_CPUCLK_TO_HCLK_RATIO_BY_2 2
+++#define PWRMGT_CPUCLK_TO_HCLK_RATIO_BY_3 3
+++#define PWRMGT_CPUCLK_TO_HCLK_RATIO_BY_4 4
+++
+++#define PWRMGT_HCLK_TO_PCLK_RATIO_BY_1 1
+++#define PWRMGT_HCLK_TO_PCLK_RATIO_BY_2 2
+++#define PWRMGT_HCLK_TO_PCLK_RATIO_BY_3 3
+++#define PWRMGT_HCLK_TO_PCLK_RATIO_BY_4 4
+++
+++/*
+++ * Macro defines for Clock Gate Control
+++ */
+++#define HAL_PWRMGT_DISABLE_DRAMC_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~(0x1); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_NIC_CLOCK() \
+++{ \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 0); \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x0F << 20); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 5); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_NIC_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~(0x0F << 20); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_PCI_BRIDGE_33M_CLOCK() \
+++{ \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 1); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 10); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x1 << 10); \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 28) | (0x1 << 30); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 7); \
+++}
+++
+++#define HAL_PWRMGT_ENABLE_PCI_BRIDGE_66M_CLOCK() \
+++{ \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 1); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 10); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x0 << 10); \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 28) | (0x1 << 30); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 7); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_PCI_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~((0x1 << 28) | (0x1 << 30)); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_USB_CLOCK() \
+++{ \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0xF << 1); \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 24); \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 28); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 6) | (0x1 << 14); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_USB_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~(0x1 << 24); \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 28); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_DMA_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 16); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 4); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_DMA_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~(0x1 << 16); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_IDE_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 8) | (0x1 << 9); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 2); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_IDE_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~((0x1 << 8) | (0x1 << 9)); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_UART0_CLOCK() \
+++{ \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~((0x1 << 1) | (0x1 << 2) | (0x1 << 5)); \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 12); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 9); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_UART0_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 12); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_UART1_CLOCK() \
+++{ \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~((0x1 << 1) | (0x1 << 2) | (0x1 << 5)); \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 13); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 10); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_UART1_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 13); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_PCMCIA_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 4) | (0x1 << 5); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_PCMCIA_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~((0x1 << 4) | (0x1 << 5)); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_GPIO_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 25); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_GPIO_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 25); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_WDTIMER_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 21) | (0x1 << 22); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_WDTIMER_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~((0x1 << 21) | (0x1 << 22)); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_RTC_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 23); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_RTC_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 23); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_TIMER_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 17) | (0x1 << 18) | (0x1 << 19); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_TIMER_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~((0x1 << 17) | (0x1 << 18) | (0x1 << 19)); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_I2C_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 1); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_I2C_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 1); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_I2S_CLOCK() \
+++{ \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~((0x1 << 5) | (0x1 << 6)); \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 1) | (0x1 << 10); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 8); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_I2S_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~((0x1 << 1) | (0x1 << 10)); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_PCM_CLOCK() \
+++{ \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 5); \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 1) | (0x1 << 6); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 8); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_PCM_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~((0x1 << 1) | (0x1 << 6)); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_SPI_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 0) | (0x1 << 1); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_SPI_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~((0x1 << 0) | (0x1 << 1)); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_VIC_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 12); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_VIC_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~(0x1 << 12); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_SMC_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG |= (0x1 << 4) | (0x1 << 5); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_SMC_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL0_REG &= ~((0x1 << 4) | (0x1 << 5)); \
+++}
+++
+++
+++#define HAL_PWRMGT_ENABLE_HSDMA_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG |= (0x1 << 29); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 16); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_HSDMA_CLOCK() \
+++{ \
+++ PWRMGT_CLOCK_GATE_CONTROL1_REG &= ~(0x1 << 29); \
+++}
+++
+++
+++
+++/*
+++ * Macro defines for Reset Control
+++ */
+++#define HAL_PWRMGT_GLOBAL_SOFTWARE_RESET() \
+++{ \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1); \
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG &= ~(0x1); \
+++}
+++
+++
+++/*
+++ * Macro defines for System Clock Control
+++ */
+++#define HAL_PWRMGT_SET_PLL_FREQUENCY_175MHZ() \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~0x3; \
+++}
+++
+++
+++#define HAL_PWRMGT_SET_PLL_FREQUENCY_200MHZ() \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~0x3; \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= 0x1; \
+++}
+++
+++
+++#define HAL_PWRMGT_SET_PLL_FREQUENCY_225MHZ() \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~0x3; \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= 0x2; \
+++}
+++
+++
+++#define HAL_PWRMGT_SET_PLL_FREQUENCY_250MHZ() \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~0x3; \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= 0x3; \
+++}
+++
+++
+++#define HAL_PWRMGT_CONFIG_PLLCLK_TO_CPUCLK_RATIO(ratio) \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 2); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (((ratio - 1) & 0x3) << 2); \
+++}
+++
+++
+++#define HAL_PWRMGT_CONFIG_CPUCLK_TO_HCLK_RATIO(ratio) \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 4); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (((ratio - 1) & 0x3) << 4); \
+++}
+++
+++
+++#define HAL_PWRMGT_HCLK_SOURCE_FCLK() \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x1 << 6); \
+++}
+++
+++
+++#define HAL_PWRMGT_HCLK_SOURCE_125MHZ() \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x1 << 6); \
+++}
+++
+++
+++#define HAL_PWRMGT_GIGA_NIC_CLOCK_SOURCE_HCLK() \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x1 << 7); \
+++}
+++
+++
+++#define HAL_PWRMGT_GIGA_NIC_CLOCK_SOURCE_62_5MHZ() \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x1 << 7); \
+++}
+++
+++
+++#define HAL_PWRMGT_CONFIG_HCLK_TO_PCLK_RATIO(ratio) \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 8); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (((ratio - 1) & 0x3) << 8); \
+++}
+++
+++
+++#define HAL_PWRMGT_I2S_CLOCK_SOURCE_8192000HZ() \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 12); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x0 << 12); \
+++}
+++
+++
+++#define HAL_PWRMGT_I2S_CLOCK_SOURCE_11289600HZ() \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 12); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x1 << 12); \
+++}
+++
+++
+++#define HAL_PWRMGT_I2S_CLOCK_SOURCE_12288000HZ() \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 12); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x2 << 12); \
+++}
+++
+++
+++#define HAL_PWRMGT_CONFIGURE_MDC_CLOCK_DIVIDER(divided_value) \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3 << 14); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= ((divided_value & 0x3) << 14); \
+++}
+++
+++
+++#define HAL_PWRMGT_CONFIGURE_CLOCK_OUT_PIN(pin_source_select, divided_value) \
+++{ \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG &= ~(0x3F << 16); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= ((pin_source_select & 0xF) << 16); \
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= ((divided_value & 0x3) << 20); \
+++}
+++
+++
+++/*
+++ * Macro defines for PLL Power Down Control
+++ */
+++#define HAL_PWRMGT_POWER_DOWN_SYSTEM_XTAL_PAD() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 7)
+++
+++#define HAL_PWRMGT_POWER_ON_SYSTEM_XTAL_PAD() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 7)
+++
+++
+++#define HAL_PWRMGT_POWER_DOWN_PLL_X5() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 0)
+++
+++#define HAL_PWRMGT_POWER_ON_PLL_X5() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 0)
+++
+++
+++#define HAL_PWRMGT_POWER_DOWN_PLL_X8() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 1)
+++
+++#define HAL_PWRMGT_POWER_ON_PLL_X8() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 1)
+++
+++
+++#define HAL_PWRMGT_POWER_DOWN_PLL_X3() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 2)
+++
+++#define HAL_PWRMGT_POWER_ON_PLL_X3() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 2)
+++
+++
+++#define HAL_PWRMGT_POWER_DOWN_USBH_PHY_PLL() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 3)
+++
+++#define HAL_PWRMGT_POWER_ON_USBH_PHY_PLL() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 3)
+++
+++
+++#define HAL_PWRMGT_POWER_DOWN_USBD_PHY_PLL() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 4)
+++
+++#define HAL_PWRMGT_POWER_ON_USBD_PHY_PLL() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 4)
+++
+++
+++#define HAL_PWRMGT_POWER_DOWN_PLL_X2250() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 5)
+++
+++#define HAL_PWRMGT_POWER_ON_PLL_X2250() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 5)
+++
+++
+++#define HAL_PWRMGT_POWER_DOWN_PLL_X7() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG |= (0x1 << 6)
+++
+++#define HAL_PWRMGT_POWER_ON_PLL_X7() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG &= ~(0x1 << 6)
+++
+++
+++#define HAL_PWRMGT_POWER_DOWN_ALL_PLL() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG = 0x7F;
+++
+++#define HAL_PWRMGT_POWER_ON_ALL_PLL() \
+++ PWRMGT_PLL_POWER_DOWN_CONTROL_REG = 0;
+++
+++
+++/*
+++ * Macro defines for Pad Drive Strength Control
+++ */
+++#define HAL_PWRMGT_SELECT_PAD_DRIVE_STRENGTH_PCMCIA_CARDBUS_MODE() \
+++{ \
+++ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG &= ~(0x3 << 0); \
+++}
+++
+++#define HAL_PWRMGT_SELECT_PAD_DRIVE_STRENGTH_PCI_MODE() \
+++{ \
+++ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG &= ~(0x3 << 0); \
+++ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG |= (0x1 << 0); \
+++}
+++
+++#define HAL_PWRMGT_SELECT_PAD_DRIVE_STRENGTH_MII_MODE() \
+++{ \
+++ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG |= (0x1 << 2); \
+++}
+++
+++#define HAL_PWRMGT_SELECT_PAD_DRIVE_STRENGTH_RGMII_MODE() \
+++{ \
+++ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG &= ~(0x1 << 2); \
+++}
+++
+++#define HAL_PWRMGT_ENABLE_MII_PAD_SIGNAL_NOT_BOUNDED() \
+++{ \
+++ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG |= (0x1 << 3); \
+++}
+++
+++#define HAL_PWRMGT_DISABLE_MII_PAD_SIGNAL_NOT_BOUNDED() \
+++{ \
+++ PWRMGT_PAD_DRIVE_STRENGTH_CONTROL_REG &= ~(0x1 << 3); \
+++}
+++
+++
+++/*
+++ * Macro defines for USB Device Power Management
+++ */
+++#define HAL_PWRMGT_REMOTE_WAKEUP_USB_HOST() \
+++{ \
+++ PWRMGT_USB_DEVICE_POWERMGT_REG |= (0x1 << 4); \
+++}
+++
+++#define HAL_PWRMGT_USB_DEVICE_PHY_CLOCK_SOURCE_EXTERNAL_12MHZ() \
+++{ \
+++ PWRMGT_USB_DEVICE_POWERMGT_REG &= ~(0x1 << 5); \
+++}
+++
+++#define HAL_PWRMGT_USB_DEVICE_PHY_CLOCK_SOURCE_INTERNAL_12MHZ() \
+++{ \
+++ PWRMGT_USB_DEVICE_POWERMGT_REG |= (0x1 << 5); \
+++}
+++
+++
+++/*
+++ * Macro defines for Regulator Control
+++ */
+++
+++#endif /* _CNS21XX_POWERMGMT_H */
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/cns21xx.h
++@@ -0,0 +1,88 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#ifndef _CNS21XX_H
+++#define _CNS21XX_H
+++
+++#define CNS21XX_FLASH_BANK0_BASE 0x10000000
+++#define CNS21XX_FLASH_BANK1_BASE 0x11000000
+++#define CNS21XX_FLASH_BANK2_BASE 0x12000000
+++#define CNS21XX_FLASH_BANK3_BASE 0x13000000
+++#define CNS21XX_PCMCIA_ATTR_BASE 0x14000000
+++#define CNS21XX_PCMCIA_MEM_BASE 0x15000000
+++#define CNS21XX_PCMCIA_IO_BASE 0x16000000
+++#define CNS21XX_IDE_DEVICE_BASE 0x18000000
+++#define CNS21XX_SDRAM_MEMORY_BASE 0x20000000
+++#define CNS21XX_GDMAC_BASE 0x60000000
+++#define CNS21XX_NIC_BASE 0x70000000
+++#define CNS21XX_SPI_BASE 0x71000000
+++#define CNS21XX_PCM_BASE 0x71000000
+++#define CNS21XX_I2C_BASE 0x71000000
+++#define CNS21XX_I2S_BASE 0x71000000
+++#define CNS21XX_DDRC_BASE 0x72000000
+++#define CNS21XX_SMC_BASE 0x73000000
+++#define CNS21XX_PCMCIA_CTRL_BASE 0x73000000
+++#define CNS21XX_IDE_CTRL_BASE 0x74000000
+++#define CNS21XX_MISC_BASE 0x76000000
+++#define CNS21XX_CPM_BASE 0x77000000
+++#define CNS21XX_UART0_BASE 0x78000000
+++#define CNS21XX_UART1_BASE 0x78800000
+++#define CNS21XX_TIMER_BASE 0x79000000
+++#define CNS21XX_WDT_BASE 0x7a000000
+++#define CNS21XX_RTC_BASE 0x7b000000
+++#define CNS21XX_GPIOA_BASE 0x7c000000
+++#define CNS21XX_GPIOB_BASE 0x7c800000
+++#define CNS21XX_PCI_CFGDATA_BASE 0xa0000000
+++#define CNS21XX_PCI_CFGADDR_BASE 0xa4000000
+++#define CNS21XX_PCI_IO_BASE 0xa8000000
+++#define CNS21XX_PCI_MEMORY_BASE 0xb0000000
+++#define CNS21XX_OHCI_CONFIG_BASE 0xc0000000
+++#define CNS21XX_OHCI_CTRL_BASE 0xc4000000
+++#define CNS21XX_EHCI_CONFIG_BASE 0xc8000000
+++#define CNS21XX_EHCI_CTRL_BASE 0xcc000000
+++#define CNS21XX_USB_DEVICE_BASE 0xd0000000
+++#define CNS21XX_INTC_BASE 0xfffff000
+++
+++#define CNS21XX_FLASH_BANK0_BASE_VIRT 0xe0000000
+++#define CNS21XX_FLASH_BANK1_BASE_VIRT 0xe2000000
+++#define CNS21XX_FLASH_BANK2_BASE_VIRT 0xe4000000
+++#define CNS21XX_FLASH_BANK3_BASE_VIRT 0xe8000000
+++#define CNS21XX_IDE_DEVICE_BASE_VIRT 0xfef00000
+++#define CNS21XX_GDMAC_BASE_VIRT 0xfef01000
+++#define CNS21XX_NIC_BASE_VIRT 0xfef02000
+++#define CNS21XX_SPI_BASE_VIRT 0xfef03000
+++#define CNS21XX_PCM_BASE_VIRT 0xfef04000
+++#define CNS21XX_I2C_BASE_VIRT 0xfef05000
+++#define CNS21XX_I2S_BASE_VIRT 0xfef06000
+++#define CNS21XX_DDRC_BASE_VIRT 0xfef07000
+++#define CNS21XX_SMC_BASE_VIRT 0xfef08000
+++#define CNS21XX_PCMCIA_CTRL_BASE_VIRT 0xfef09000
+++#define CNS21XX_IDE_CTRL_BASE_VIRT 0xfef0A000
+++#define CNS21XX_MISC_BASE_VIRT 0xfef0B000
+++#define CNS21XX_CPM_BASE_VIRT 0xfef0C000
+++#define CNS21XX_UART0_BASE_VIRT 0xfef0D000
+++#define CNS21XX_UART1_BASE_VIRT 0xfef0E000
+++#define CNS21XX_TIMER_BASE_VIRT 0xfef0F000
+++#define CNS21XX_WDT_BASE_VIRT 0xfef10000
+++#define CNS21XX_RTC_BASE_VIRT 0xfef11000
+++#define CNS21XX_GPIOA_BASE_VIRT 0xfef12000
+++#define CNS21XX_GPIOB_BASE_VIRT 0xfef13000
+++#define CNS21XX_PCI_CFGDATA_BASE_VIRT 0xfef14000
+++#define CNS21XX_PCI_CFGADDR_BASE_VIRT 0xfef15000
+++#define CNS21XX_OHCI_CONFIG_BASE_VIRT 0xfef16000
+++#define CNS21XX_OHCI_CTRL_BASE_VIRT 0xfef17000
+++#define CNS21XX_EHCI_CONFIG_BASE_VIRT 0xfef18000
+++#define CNS21XX_EHCI_CTRL_BASE_VIRT 0xfef19000
+++#define CNS21XX_USB_DEVICE_BASE_VIRT 0xfef1a000
+++#define CNS21XX_INTC_BASE_VIRT 0xfef1b000
+++
+++#define CNS21XX_PHYS_IO CNS21XX_UART0_BASE
+++#define CNS21XX_IO_PAGE_OFFSET ((CNS21XX_UART0_BASE_VIRT) >> 18) & 0xfffc
+++
+++#endif /* _CNS21XX_H */
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/core.c
++@@ -0,0 +1,85 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/kernel.h>
+++
+++#include <mach/hardware.h>
+++#include <mach/cns21xx.h>
+++#include <mach/cns21xx_powermgmt.h>
+++
+++static unsigned long cns21xx_pll_freq;
+++static unsigned long cns21xx_cpu_freq;
+++static unsigned long cns21xx_ahb_freq;
+++static unsigned long cns21xx_apb_freq;
+++
+++static void cns21xx_init_freq(void)
+++{
+++ static int freq_init_done;
+++ unsigned int t;
+++
+++ if (freq_init_done)
+++ return;
+++
+++ t = PWRMGT_SYSTEM_CLOCK_CONTROL_REG;
+++ switch (t & 0x3) {
+++ case 0x00:
+++ cns21xx_pll_freq = 175000000;
+++ break;
+++
+++ case 0x01:
+++ cns21xx_pll_freq = 200000000;
+++ break;
+++
+++ case 0x02:
+++ cns21xx_pll_freq = 225000000;
+++ break;
+++
+++ case 0x03:
+++ cns21xx_pll_freq = 250000000;
+++ break;
+++ }
+++
+++ cns21xx_cpu_freq = cns21xx_pll_freq / (((t >> 2) & 0x3) + 1);
+++ cns21xx_ahb_freq = cns21xx_cpu_freq / (((t >> 4) & 0x3) + 1);
+++ cns21xx_apb_freq = cns21xx_ahb_freq / (((t >> 8) & 0x3) + 1);
+++
+++ freq_init_done = 1;
+++}
+++
+++unsigned long cns21xx_get_pll_freq(void)
+++{
+++ cns21xx_init_freq();
+++ return cns21xx_pll_freq;
+++}
+++
+++unsigned long cns21xx_get_cpu_freq(void)
+++{
+++ cns21xx_init_freq();
+++ return cns21xx_cpu_freq;
+++}
+++
+++unsigned long cns21xx_get_ahb_freq(void)
+++{
+++ cns21xx_init_freq();
+++ return cns21xx_ahb_freq;
+++}
+++
+++unsigned long cns21xx_get_apb_freq(void)
+++{
+++ cns21xx_init_freq();
+++ return cns21xx_apb_freq;
+++}
+++
+++void cns21xx_restart(char mode, const char *cmd)
+++{
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |=
+++ (1UL << PWRMGT_GLOBAL_SOFTWARE_RESET_MASK_BIT_INDEX);
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG &=
+++ ~(1UL << PWRMGT_GLOBAL_SOFTWARE_RESET_MASK_BIT_INDEX);
+++}
++--- a/arch/arm/mm/Kconfig
+++++ b/arch/arm/mm/Kconfig
++@@ -903,6 +903,7 @@ config ARM_L1_CACHE_SHIFT_6
++ config ARM_L1_CACHE_SHIFT
++ int
++ default 6 if ARM_L1_CACHE_SHIFT_6
+++ default 4 if ARM_L1_CACHE_SHIFT_4
++ default 5
++
++ config ARM_DMA_MEM_BUFFERABLE
++--- a/arch/arm/mm/cache-fa.S
+++++ b/arch/arm/mm/cache-fa.S
++@@ -28,7 +28,7 @@
++ /*
++ * The total size of the data cache.
++ */
++-#ifdef CONFIG_ARCH_GEMINI
+++#if (defined(CONFIG_ARCH_GEMINI) || defined(CONFIG_ARCH_CNS21XX))
++ #define CACHE_DSIZE 8192
++ #else
++ #define CACHE_DSIZE 16384
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/cns21xx_misc.h
++@@ -0,0 +1,507 @@
+++/*******************************************************************************
+++ *
+++ * Copyright (c) 2008 Cavium Networks
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ *
+++ * This file is distributed in the hope that it will be useful,
+++ * but AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
+++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
+++ * NONINFRINGEMENT. See the GNU General Public License for more details.
+++ *
+++ * You should have received a copy of the GNU General Public License
+++ * along with this file; if not, write to the Free Software
+++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA or
+++ * visit http://www.gnu.org/licenses/.
+++ *
+++ * This file may also be available under a different license from Cavium.
+++ * Contact Cavium Networks for more information
+++ *
+++ ******************************************************************************/
+++
+++#ifndef _STAR_MISC_H_
+++#define _STAR_MISC_H_
+++
+++#include <mach/cns21xx.h>
+++
+++#define MISC_MEM_MAP_VALUE(reg_offset) \
+++ (*((u32 volatile *)(CNS21XX_MISC_BASE_VIRT + reg_offset)))
+++
+++/*
+++ * define access macros
+++ */
+++#define MISC_MEMORY_REMAP_REG MISC_MEM_MAP_VALUE(0x00)
+++#define MISC_CHIP_CONFIG_REG MISC_MEM_MAP_VALUE(0x04)
+++#define MISC_DEBUG_PROBE_DATA_REG MISC_MEM_MAP_VALUE(0x08)
+++#define MISC_DEBUG_PROBE_SELECTION_REG MISC_MEM_MAP_VALUE(0x0C)
+++#define MISC_PCI_CONTROL_BROKEN_MASK_REG MISC_MEM_MAP_VALUE(0x10)
+++#define MISC_PCI_BROKEN_STATUS_REG MISC_MEM_MAP_VALUE(0x14)
+++#define MISC_PCI_DEVICE_VENDOR_ID_REG MISC_MEM_MAP_VALUE(0x18)
+++#define MISC_USB_HOST_PHY_CONTROL_TEST_REG MISC_MEM_MAP_VALUE(0x1C)
+++#define MISC_GPIOA_PIN_ENABLE_REG MISC_MEM_MAP_VALUE(0x20)
+++#define MISC_GPIOB_PIN_ENABLE_REG MISC_MEM_MAP_VALUE(0x24)
+++#define MISC_GPIOA_RESISTOR_CONFIG_REG MISC_MEM_MAP_VALUE(0x28)
+++#define MISC_GPIOA_DRIVE_STRENGTH_CONFIG_REG MISC_MEM_MAP_VALUE(0x2C)
+++#define MISC_FAST_ETHERNET_PHY_CONFIG_REG MISC_MEM_MAP_VALUE(0x30)
+++#define MISC_SOFTWARE_TEST_1_REG MISC_MEM_MAP_VALUE(0x38)
+++#define MISC_SOFTWARE_TEST_2_REG MISC_MEM_MAP_VALUE(0x3C)
+++
+++#define MISC_E_FUSE_0_REG MISC_MEM_MAP_VALUE(0x60)
+++#define MISC_E_FUSE_1_REG MISC_MEM_MAP_VALUE(0x64)
+++
+++
+++/*
+++ * define constants macros
+++ */
+++#define MISC_PARALLEL_FLASH_BOOT 0
+++#define MISC_SPI_SERIAL_FLASH_BOOT 1
+++
+++#define MISC_LITTLE_ENDIAN 0
+++#define MISC_BIG_ENDIAN 1
+++
+++#define MISC_FARADAY_ICE 0
+++#define MISC_ARM_ICE 1
+++
+++#define MISC_EXT_INT29_PINS ((0x1 << 0))
+++#define MISC_EXT_INT30_PINS ((0x1 << 1))
+++#define MISC_EXT_INT31_PINS ((0x1 << 2))
+++#define MISC_I2C_PINS ((0x1 << 13) | (0x1 << 14))
+++#define MISC_I2S_PINS ((0x1 << 15) | (0x1 << 16) | (0x1 << 17))
+++#define MISC_I2SSD_PINS (1 << 15)
+++#define MISC_I2SWS_PINS (1 << 16)
+++#define MISC_I2SCLK_PINS (1 << 17)
+++#define MISC_PCM_PINS ((0x1 << 18) | (0x1 << 19) | (0x1 << 20) | (0x1 << 21))
+++#define MISC_PCMDR_PINS (1 << 18)
+++#define MISC_PCMDT_PINS (1 << 19)
+++#define MISC_PCMFS_PINS (1 << 20)
+++#define MISC_PCMCLK_PINS (1 << 21)
+++#define MISC_LED0_PINS ((0x1 << 22))
+++#define MISC_LED1_PINS ((0x1 << 23))
+++#define MISC_LED2_PINS ((0x1 << 24))
+++#define MISC_LED012_PINS ((0x1 << 22) | (0x1 << 23) | (0x1 << 24))
+++#define MISC_WDTIMER_RESET_PINS ((0x1 << 25))
+++#define MISC_SPIDR_PINS (0x1 << 26)
+++#define MISC_SPICLK_PINS (0x1 << 27)
+++#define MISC_SPICSN0_PINS (0x1 << 28)
+++#define MISC_SPICSN1_PINS (0x1 << 29)
+++#define MISC_SPICSN2_PINS (0x1 << 30)
+++#define MISC_SPICSN3_PINS (0x1 << 31)
+++#define MISC_SPI_PINS ((0x1 << 26) | (0x1 << 27) | (0x1 << 28) | (0x1 << 29) | (0x1 << 30) | (0x1 << 31))
+++#define MISC_MDC_MDIO_PINS ((0x1 << 0) | (0x1 << 1))
+++#define MISC_NIC_COL_PINS ((0x1 << 2))
+++#define MISC_IDE_PINS ((0xFF << 3))
+++#define MISC_SRAM_BANK1_PINS ((0x1 << 11) | (0x1 << 14))
+++#define MISC_SRAM_BANK2_PINS ((0x1 << 12) | (0x1 << 15))
+++#define MISC_SRAM_BANK3_PINS ((0x1 << 13) | (0x1 << 16))
+++#define MISC_PCMCIA_PINS ((0x1 << 17) | (0x1 << 18) | (0x1 << 19) | (0x1 << 20))
+++#define MISC_UART1_PINS ((0x1 << 21) | (0x1 << 22))
+++#define MISC_PCI_PINS (((u32)0x1FF << 23))
+++
+++#define MISC_UART0_ACT0_Pin (0x1 << 2)
+++#define MISC_UART1_ACT1_Pin (0x1 << 3)
+++
+++#define MISC_GPIOA_PIN_0 0
+++#define MISC_GPIOA_PIN_1 1
+++#define MISC_GPIOA_PIN_2 2
+++#define MISC_GPIOA_PIN_3 3
+++#define MISC_GPIOA_PIN_4 4
+++#define MISC_GPIOA_PIN_5 5
+++#define MISC_GPIOA_PIN_6 6
+++#define MISC_GPIOA_PIN_7 7
+++#define MISC_GPIOA_PIN_8 8
+++#define MISC_GPIOA_PIN_9 9
+++#define MISC_GPIOA_PIN_10 10
+++
+++#define MISC_GPIOA_75K_RESISTOR_PULL_DOWN 1
+++#define MISC_GPIOA_75K_RESISTOR_PULL_UP 2
+++#define MISC_GPIOA_75K_RESISTOR_PULL_KEEPER 3
+++
+++#define MISC_GPIOA_DRIVE_STRENGTH_4MA 0
+++#define MISC_GPIOA_DRIVE_STRENGTH_8MA 1
+++
+++
+++/*
+++ * macro declarations
+++ */
+++#define HAL_MISC_ENABLE_SPI_SERIAL_FLASH_BANK_ACCESS() \
+++{ \
+++ (MISC_CHIP_CONFIG_REG) |= (0x1 << 4); \
+++}
+++
+++#define HAL_MISC_DISABLE_SPI_SERIAL_FLASH_BANK_ACCESS() \
+++{ \
+++ (MISC_CHIP_CONFIG_REG) &= ~(0x1 << 4); \
+++}
+++
+++
+++/*
+++ * Macro defines for GPIOA and GPIOB Pin Enable Register
+++ */
+++#define HAL_MISC_ENABLE_EXT_INT29_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_EXT_INT29_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_EXT_INT29_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_EXT_INT29_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_EXT_INT30_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_EXT_INT30_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_EXT_INT30_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_EXT_INT30_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_I2C_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_I2C_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_I2C_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_I2C_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_I2S_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_I2S_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_I2S_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_I2S_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_I2SSD_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_I2SSD_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_I2SWS_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_I2SWS_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_I2SCLK_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_I2SCLK_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_PCM_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_PCM_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_PCM_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_PCM_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_PCMDR_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_PCMDR_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_PCMDT_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_PCMDT_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_PCMFS_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_PCMFS_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_PCMCLK_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_PCMCLK_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_LED0_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_LED0_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_LED0_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_LED0_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_LED1_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_LED1_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_LED1_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_LED1_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_LED2_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_LED2_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_LED2_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_LED2_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_LED012_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_LED012_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_LED012_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_LED012_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_WDTIMER_RESET_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_WDTIMER_RESET_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_WDTIMER_RESET_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_WDTIMER_RESET_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_SPI_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPI_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_SPIDR_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPIDR_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_SPICLK_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICLK_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_SPICSN0_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICSN0_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_SPICSN0_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICSN0_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_SPICSN1_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICSN1_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_SPICSN2_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICSN2_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_SPICSN3_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_SPICSN3_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_SPI_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPI_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_SPIDR_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPIDR_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_SPICLK_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPICLK_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_SPICSN0_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPICSN0_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_SPICSN1_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPICSN1_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_SPICSN2_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPICSN2_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_SPICSN3_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_SPICSN3_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_UART0_ACT0_PIN() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_UART0_ACT0_Pin); \
+++}
+++
+++#define HAL_MISC_DISABLE_UART0_ACT0_PIN() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_UART0_ACT0_Pin); \
+++}
+++
+++#define HAL_MISC_ENABLE_UART1_ACT1_PIN() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) |= (MISC_UART1_ACT1_Pin); \
+++}
+++
+++#define HAL_MISC_DISABLE_UART1_ACT1_PIN() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) &= ~(MISC_UART1_ACT1_Pin); \
+++}
+++
+++#define HAL_MISC_ENABLE_MDC_MDIO_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_MDC_MDIO_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_MDC_MDIO_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_MDC_MDIO_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_NIC_COL_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_NIC_COL_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_NIC_COL_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_NIC_COL_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_IDE_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_IDE_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_IDE_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_IDE_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_SRAM_BANK1_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_SRAM_BANK1_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_SRAM_BANK1_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_SRAM_BANK1_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_SRAM_BANK2_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_SRAM_BANK2_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_SRAM_BANK2_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_SRAM_BANK2_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_SRAM_BANK3_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_SRAM_BANK3_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_SRAM_BANK3_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_SRAM_BANK3_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_PCMCIA_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_PCMCIA_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_PCMCIA_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_PCMCIA_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_UART1_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_UART1_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_UART1_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_UART1_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_PCI_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) |= (MISC_PCI_PINS); \
+++}
+++
+++#define HAL_MISC_DISABLE_PCI_PINS() \
+++{ \
+++ (MISC_GPIOB_PIN_ENABLE_REG) &= ~(MISC_PCI_PINS); \
+++}
+++
+++#define HAL_MISC_ENABLE_ALL_SHARED_GPIO_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) = (0x0); \
+++ (MISC_GPIOB_PIN_ENABLE_REG) = (0x0); \
+++}
+++
+++#define HAL_MISC_DISABLE_ALL_SHARED_GPIO_PINS() \
+++{ \
+++ (MISC_GPIOA_PIN_ENABLE_REG) = (0xFFFFFFFF); \
+++ (MISC_GPIOB_PIN_ENABLE_REG) = (0xFFFFFFFF); \
+++}
+++
+++#define HAL_MISC_CONFIGURE_GPIOA_RESISTOR(pin_index, value) \
+++{ \
+++ (MISC_GPIOA_RESISTOR_CONFIG_REG) &= ~(0x3 << (2 * pin_index)); \
+++ (MISC_GPIOA_RESISTOR_CONFIG_REG) |= ((value & 0x3) << (2 * pin_index)); \
+++}
+++
+++#define HAL_MISC_CONFIGURE_GPIOA_DRIVE_STRENGTH(pin_index, value) \
+++{ \
+++ (MISC_GPIOA_DRIVE_STRENGTH_CONFIG_REG) &= ~(0x1 << pin_index); \
+++ (MISC_GPIOA_DRIVE_STRENGTH_CONFIG_REG) |= (value << pin_index); \
+++}
+++
+++#define HAL_MISC_SELECT_FAST_ETHERNET_PHY_LED_MODE0() \
+++{ \
+++ (MISC_FAST_ETHERNET_PHY_CONFIG_REG) = (0x0); \
+++}
+++
+++#define HAL_MISC_SELECT_FAST_ETHERNET_PHY_LED_MODE1() \
+++{ \
+++ (MISC_FAST_ETHERNET_PHY_CONFIG_REG) = (0x1); \
+++}
+++
+++#define HAL_MISC_SELECT_FAST_ETHERNET_PHY_LED_MODE2() \
+++{ \
+++ (MISC_FAST_ETHERNET_PHY_CONFIG_REG) = (0x2); \
+++}
+++
+++#define HAL_MISC_SELECT_FAST_ETHERNET_PHY_LED_MODE3() \
+++{ \
+++ (MISC_FAST_ETHERNET_PHY_CONFIG_REG) = (0x3); \
+++}
+++
+++
+++#endif // end of #ifndef _STAR_MISC_H_
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/idle.c
++@@ -0,0 +1,31 @@
+++/*
+++ * arch/arm/mach-cns21xx/idle.c
+++ */
+++
+++#include <linux/init.h>
+++#include <asm/system.h>
+++#include <asm/proc-fns.h>
+++
+++static void cns21xx_idle(void)
+++{
+++ /*
+++ * Because of broken hardware we have to enable interrupts or the CPU
+++ * will never wakeup... Acctualy it is not very good to enable
+++ * interrupts first since scheduler can miss a tick, but there is
+++ * no other way around this. Platforms that needs it for power saving
+++ * should enable it in init code, since by default it is
+++ * disabled.
+++ */
+++
+++ /* FIXME: Enabling interrupts here is racy! */
+++ local_irq_enable();
+++ cpu_do_idle();
+++}
+++
+++static int __init cns21xx_idle_init(void)
+++{
+++ arm_pm_idle = cns21xx_idle;
+++ return 0;
+++}
+++
+++arch_initcall(cns21xx_idle_init);
+diff --git a/feeds/targets/cns21xx/patches-3.10/101-cns21xx-serial-support.patch b/feeds/targets/cns21xx/patches-3.10/101-cns21xx-serial-support.patch
+new file mode 100644
+index 0000000..029059a
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/101-cns21xx-serial-support.patch
+@@ -0,0 +1,103 @@
++--- a/arch/arm/mach-cns21xx/common.h
+++++ b/arch/arm/mach-cns21xx/common.h
++@@ -17,4 +17,7 @@ void cns21xx_timer_init(void);
++
++ extern struct sys_timer cns21xx_timer;
++
+++int cns21xx_register_uart0(void);
+++int cns21xx_register_uart1(void);
+++
++ #endif /* _MACH_CNS21XX_COMMON_H */
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/devices.c
++@@ -0,0 +1,79 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/kernel.h>
+++#include <linux/init.h>
+++#include <linux/platform_device.h>
+++#include <linux/serial_8250.h>
+++
+++#include <mach/irqs.h>
+++#include <mach/hardware.h>
+++#include <mach/cns21xx.h>
+++#include <mach/cns21xx_misc.h>
+++
+++#define CNS21XX_UART_CLOCK 24000000
+++
+++#define CNS21XX_UART_FLAGS (UPF_SKIP_TEST | UPF_FIXED_TYPE | UPF_NO_TXEN_TEST)
+++
+++static struct plat_serial8250_port cns21xx_uart0_data[] = {
+++ {
+++ .mapbase = CNS21XX_UART0_BASE,
+++ .membase = (void *) CNS21XX_UART0_BASE_VIRT,
+++ .irq = CNS21XX_IRQ_UART0,
+++ .uartclk = CNS21XX_UART_CLOCK,
+++ .regshift = 2,
+++ .iotype = UPIO_MEM,
+++ .type = PORT_16550A,
+++ .flags = CNS21XX_UART_FLAGS,
+++ }, {
+++ /* terminating entry */
+++ },
+++};
+++
+++static struct platform_device cns21xx_uart0_device = {
+++ .name = "serial8250",
+++ .id = PLAT8250_DEV_PLATFORM,
+++ .dev = {
+++ .platform_data = cns21xx_uart0_data,
+++ },
+++};
+++
+++int __init cns21xx_register_uart0(void)
+++{
+++ return platform_device_register(&cns21xx_uart0_device);
+++}
+++
+++static struct plat_serial8250_port cns21xx_uart1_data[] = {
+++ {
+++ .mapbase = CNS21XX_UART1_BASE,
+++ .membase = (void *) CNS21XX_UART1_BASE_VIRT,
+++ .irq = CNS21XX_IRQ_UART1,
+++ .uartclk = CNS21XX_UART_CLOCK,
+++ .regshift = 2,
+++ .iotype = UPIO_MEM,
+++ .type = PORT_16550A,
+++ .flags = CNS21XX_UART_FLAGS,
+++ }, {
+++ /* terminating entry */
+++ },
+++};
+++
+++static struct platform_device cns21xx_uart1_device = {
+++ .name = "serial8250",
+++ .id = PLAT8250_DEV_PLATFORM1,
+++ .dev = {
+++ .platform_data = cns21xx_uart1_data,
+++ },
+++};
+++
+++int __init cns21xx_register_uart1(void)
+++{
+++ HAL_MISC_ENABLE_UART1_PINS();
+++ return platform_device_register(&cns21xx_uart1_device);
+++}
++--- a/arch/arm/mach-cns21xx/Makefile
+++++ b/arch/arm/mach-cns21xx/Makefile
++@@ -4,7 +4,7 @@
++
++ # Object file lists.
++
++-obj-y := core.o irq.o mm.o time.o idle.o
+++obj-y := core.o irq.o mm.o time.o idle.o devices.o
++
++ # machine specific files
++
+diff --git a/feeds/targets/cns21xx/patches-3.10/102-cns21xx-gpiolib-support.patch b/feeds/targets/cns21xx/patches-3.10/102-cns21xx-gpiolib-support.patch
+new file mode 100644
+index 0000000..21828fe
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/102-cns21xx-gpiolib-support.patch
+@@ -0,0 +1,85 @@
++--- a/arch/arm/Kconfig
+++++ b/arch/arm/Kconfig
++@@ -371,6 +371,8 @@ config ARCH_CNS21XX
++ select CPU_FA526
++ select PLAT_FA
++ select PLAT_FA_TIME
+++ select PLAT_FA_GPIO
+++ select ARCH_REQUIRE_GPIOLIB
++ select ARM_L1_CACHE_SHIFT_4
++ help
++ Support for Cavium Networks CNS21xx family.
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/gpio.c
++@@ -0,0 +1,45 @@
+++/*
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <plat/gpio.h>
+++
+++#include <mach/cns21xx.h>
+++#include <mach/irqs.h>
+++
+++static struct fa_gpio_chip cns21xx_gpio_chips[] = {
+++ {
+++ .gpio_chip = {
+++ .label = "GPIOA",
+++ .base = 0,
+++ .ngpio = 32,
+++ },
+++
+++ .map_base = CNS21XX_GPIOA_BASE,
+++ .irq_base = CNS21XX_GPIO_IRQ_BASE,
+++ }, {
+++ .gpio_chip = {
+++ .label = "GPIOB",
+++ .base = 32,
+++ .ngpio = 32,
+++ },
+++
+++ .map_base = CNS21XX_GPIOB_BASE,
+++ .irq_base = CNS21XX_GPIO_IRQ_BASE + 32,
+++ }
+++};
+++
+++static struct fa_gpio_data cns21xx_gpio_data = {
+++ .chips = cns21xx_gpio_chips,
+++ .nchips = ARRAY_SIZE(cns21xx_gpio_chips),
+++ .irq = CNS21XX_IRQ_GPIO,
+++};
+++
+++void __init cns21xx_gpio_init(void)
+++{
+++ fa_gpio_init(&cns21xx_gpio_data);
+++}
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/gpio.h
++@@ -0,0 +1,2 @@
+++/* empty */
+++
++--- a/arch/arm/mach-cns21xx/Makefile
+++++ b/arch/arm/mach-cns21xx/Makefile
++@@ -4,7 +4,7 @@
++
++ # Object file lists.
++
++-obj-y := core.o irq.o mm.o time.o idle.o devices.o
+++obj-y := core.o irq.o gpio.o mm.o time.o idle.o devices.o
++
++ # machine specific files
++
++--- a/arch/arm/mach-cns21xx/common.h
+++++ b/arch/arm/mach-cns21xx/common.h
++@@ -14,6 +14,7 @@ void cns21xx_restart(char mode, const ch
++ void cns21xx_map_io(void);
++ void cns21xx_init_irq(void);
++ void cns21xx_timer_init(void);
+++void cns21xx_gpio_init(void);
++
++ extern struct sys_timer cns21xx_timer;
++
+diff --git a/feeds/targets/cns21xx/patches-3.10/103-cns21xx-usb-ohci-support.patch b/feeds/targets/cns21xx/patches-3.10/103-cns21xx-usb-ohci-support.patch
+new file mode 100644
+index 0000000..ee81610
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/103-cns21xx-usb-ohci-support.patch
+@@ -0,0 +1,265 @@
++--- a/drivers/usb/host/ohci-hcd.c
+++++ b/drivers/usb/host/ohci-hcd.c
++@@ -697,6 +697,9 @@ retry:
++
++ periodic_reinit (ohci);
++
+++ if (ohci->flags & OHCI_QUIRK_INIT_FMINTERVAL)
+++ ohci_writel (ohci, ohci->fminterval, &ohci->regs->fminterval);
+++
++ /* some OHCI implementations are finicky about how they init.
++ * bogus values here mean not even enumeration could work.
++ */
++@@ -1191,6 +1194,11 @@ MODULE_LICENSE ("GPL");
++ #define PLATFORM_DRIVER ohci_hcd_tilegx_driver
++ #endif
++
+++#ifdef CONFIG_ARCH_CNS21XX
+++#include "ohci-cns21xx.c"
+++#define CNS21XX_PLATFORM_DRIVER ohci_cns21xx_driver
+++#endif
+++
++ #ifdef CONFIG_USB_OHCI_HCD_PLATFORM
++ #include "ohci-platform.c"
++ #define PLATFORM_DRIVER ohci_platform_driver
++@@ -1211,7 +1219,8 @@ MODULE_LICENSE ("GPL");
++ !defined(AT91_PLATFORM_DRIVER) && \
++ !defined(NXP_PLATFORM_DRIVER) && \
++ !defined(DAVINCI_PLATFORM_DRIVER) && \
++- !defined(SPEAR_PLATFORM_DRIVER)
+++ !defined(SPEAR_PLATFORM_DRIVER) && \
+++ !defined(CNS21XX_PLATFORM_DRIVER)
++ #error "missing bus glue for ohci-hcd"
++ #endif
++
++@@ -1331,9 +1340,19 @@ static int __init ohci_hcd_mod_init(void
++ goto error_spear;
++ #endif
++
+++#ifdef CNS21XX_PLATFORM_DRIVER
+++ retval = platform_driver_register(&CNS21XX_PLATFORM_DRIVER);
+++ if (retval < 0)
+++ goto error_cns21xx;
+++#endif
+++
++ return retval;
++
++ /* Error path */
+++#ifdef CNS21XX_PLATFORM_DRIVER
+++ platform_driver_unregister(&CNS21XX_PLATFORM_DRIVER);
+++ error_cns21xx:
+++#endif
++ #ifdef SPEAR_PLATFORM_DRIVER
++ platform_driver_unregister(&SPEAR_PLATFORM_DRIVER);
++ error_spear:
++@@ -1411,6 +1430,9 @@ module_init(ohci_hcd_mod_init);
++
++ static void __exit ohci_hcd_mod_exit(void)
++ {
+++#ifdef CNS21XX_PLATFORM_DRIVER
+++ platform_driver_unregister(&CNS21XX_PLATFORM_DRIVER);
+++#endif
++ #ifdef SPEAR_PLATFORM_DRIVER
++ platform_driver_unregister(&SPEAR_PLATFORM_DRIVER);
++ #endif
++--- /dev/null
+++++ b/drivers/usb/host/ohci-cns21xx.c
++@@ -0,0 +1,178 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/platform_device.h>
+++
+++#include <mach/cns21xx.h>
+++
+++#define DRIVER_NAME "cns21xx-ohci"
+++
+++static int cns21xx_ohci_start(struct usb_hcd *hcd)
+++{
+++ struct ohci_hcd *ohci = hcd_to_ohci(hcd);
+++ int ret;
+++
+++ ret = ohci_init(ohci);
+++ if (ret)
+++ return ret;
+++
+++ ret = ohci_run(ohci);
+++ if (ret) {
+++ ohci_err(ohci, "can't start %s",
+++ ohci_to_hcd(ohci)->self.bus_name);
+++ goto err;
+++ }
+++
+++ return 0;
+++
+++err:
+++ ohci_stop(hcd);
+++ return ret;
+++}
+++
+++static const struct hc_driver ohci_cns21xx_hc_driver = {
+++ .description = hcd_name,
+++ .product_desc = "cns21xx-ohci",
+++ .hcd_priv_size = sizeof(struct ohci_hcd),
+++
+++ /*
+++ * generic hardware linkage
+++ */
+++ .irq = ohci_irq,
+++ .flags = HCD_USB11 | HCD_MEMORY,
+++
+++ /*
+++ * basic lifecycle operations
+++ */
+++ .start = cns21xx_ohci_start,
+++ .stop = ohci_stop,
+++ .shutdown = ohci_shutdown,
+++
+++ /*
+++ * managing i/o requests and associated device resources
+++ */
+++ .urb_enqueue = ohci_urb_enqueue,
+++ .urb_dequeue = ohci_urb_dequeue,
+++ .endpoint_disable = ohci_endpoint_disable,
+++
+++ /*
+++ * scheduling support
+++ */
+++ .get_frame_number = ohci_get_frame,
+++
+++ /*
+++ * root hub support
+++ */
+++ .hub_status_data = ohci_hub_status_data,
+++ .hub_control = ohci_hub_control,
+++ .start_port_reset = ohci_start_port_reset,
+++};
+++
+++static void cns21xx_ohci_init_hc(void)
+++{
+++ void __iomem *base = (void __iomem *) CNS21XX_OHCI_CONFIG_BASE_VIRT;
+++
+++ __raw_writel(0x146, base + 0x04);
+++ __raw_writel(0x200, base + 0x44);
+++ msleep(100);
+++}
+++
+++static int ohci_cns21xx_probe(struct platform_device *pdev)
+++{
+++ struct usb_hcd *hcd;
+++ struct resource *res;
+++ struct ohci_hcd *ohci;
+++ int irq;
+++ int ret;
+++
+++ if (usb_disabled())
+++ return -ENODEV;
+++
+++ res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+++ if (!res) {
+++ dev_dbg(&pdev->dev, "no IRQ specified for %s\n",
+++ dev_name(&pdev->dev));
+++ return -ENODEV;
+++ }
+++ irq = res->start;
+++
+++ hcd = usb_create_hcd(&ohci_cns21xx_hc_driver, &pdev->dev,
+++ dev_name(&pdev->dev));
+++ if (!hcd)
+++ return -ENOMEM;
+++
+++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+++ if (!res) {
+++ dev_dbg(&pdev->dev, "no base address specified for %s\n",
+++ dev_name(&pdev->dev));
+++ ret = -ENODEV;
+++ goto err_put_hcd;
+++ }
+++ hcd->rsrc_start = res->start;
+++ hcd->rsrc_len = res->end - res->start + 1;
+++
+++ if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
+++ dev_dbg(&pdev->dev, "controller already in use\n");
+++ ret = -EBUSY;
+++ goto err_put_hcd;
+++ }
+++
+++ hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
+++ if (!hcd->regs) {
+++ dev_dbg(&pdev->dev, "error mapping memory\n");
+++ ret = -EFAULT;
+++ goto err_release_region;
+++ }
+++
+++ cns21xx_ohci_init_hc();
+++
+++ ohci = hcd_to_ohci(hcd);
+++ ohci->flags |= OHCI_QUIRK_INIT_FMINTERVAL;
+++ ohci_hcd_init(ohci);
+++
+++ ret = usb_add_hcd(hcd, irq, IRQF_DISABLED);
+++ if (ret)
+++ goto err_unmap;
+++
+++ platform_set_drvdata(pdev, hcd);
+++ return 0;
+++
+++err_unmap:
+++ iounmap(hcd->regs);
+++err_release_region:
+++ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
+++err_put_hcd:
+++ usb_put_hcd(hcd);
+++ return ret;
+++}
+++
+++static int ohci_cns21xx_remove(struct platform_device *pdev)
+++{
+++ struct usb_hcd *hcd = platform_get_drvdata(pdev);
+++
+++ usb_remove_hcd(hcd);
+++ iounmap(hcd->regs);
+++ release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
+++ usb_put_hcd(hcd);
+++ platform_set_drvdata(pdev, NULL);
+++
+++ return 0;
+++}
+++
+++static struct platform_driver ohci_cns21xx_driver = {
+++ .probe = ohci_cns21xx_probe,
+++ .remove = ohci_cns21xx_remove,
+++ .shutdown = usb_hcd_platform_shutdown,
+++ .driver = {
+++ .owner = THIS_MODULE,
+++ .name = DRIVER_NAME,
+++ },
+++};
+++
+++MODULE_ALIAS("platform:" DRIVER_NAME);
++--- a/drivers/usb/host/ohci.h
+++++ b/drivers/usb/host/ohci.h
++@@ -406,6 +406,7 @@ struct ohci_hcd {
++ #define OHCI_QUIRK_AMD_PLL 0x200 /* AMD PLL quirk*/
++ #define OHCI_QUIRK_AMD_PREFETCH 0x400 /* pre-fetch for ISO transfer */
++ #define OHCI_QUIRK_GLOBAL_SUSPEND 0x800 /* must suspend ports */
+++#define OHCI_QUIRK_INIT_FMINTERVAL 0x1000 /* fminterval must be initialized */
++
++ // there are also chip quirks/bugs in init logic
++
++--- a/arch/arm/Kconfig
+++++ b/arch/arm/Kconfig
++@@ -374,6 +374,7 @@ config ARCH_CNS21XX
++ select PLAT_FA_GPIO
++ select ARCH_REQUIRE_GPIOLIB
++ select ARM_L1_CACHE_SHIFT_4
+++ select USB_ARCH_HAS_OHCI
++ help
++ Support for Cavium Networks CNS21xx family.
++
+diff --git a/feeds/targets/cns21xx/patches-3.10/104-cns21xx-usb-ehci-support.patch b/feeds/targets/cns21xx/patches-3.10/104-cns21xx-usb-ehci-support.patch
+new file mode 100644
+index 0000000..6ccfa4d
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/104-cns21xx-usb-ehci-support.patch
+@@ -0,0 +1,170 @@
++--- /dev/null
+++++ b/drivers/usb/host/ehci-cns21xx.c
++@@ -0,0 +1,130 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2013 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/kernel.h>
+++#include <linux/module.h>
+++#include <linux/io.h>
+++#include <linux/platform_device.h>
+++#include <linux/irq.h>
+++#include <linux/usb.h>
+++#include <linux/usb/hcd.h>
+++
+++#include <mach/cns21xx.h>
+++
+++#include "ehci.h"
+++
+++#define DRIVER_NAME "cns21xx-ehci"
+++
+++static const char hcd_name[] = "ehci-cns21xx";
+++static struct hc_driver __read_mostly ehci_cns21xx_hc_driver;
+++
+++static void ehci_cns21xx_init_hc(void)
+++{
+++ void __iomem *base = (void __iomem *) CNS21XX_EHCI_CONFIG_BASE_VIRT;
+++
+++ __raw_writel(0x106, base + 0x04);
+++ __raw_writel((3 << 5) | 0x2000, base + 0x40);
+++ msleep(100);
+++}
+++
+++static int ehci_cns21xx_probe(struct platform_device *pdev)
+++{
+++ struct usb_hcd *hcd;
+++ struct ehci_hcd *ehci;
+++ struct resource *res;
+++ int irq;
+++ int ret;
+++
+++ irq = platform_get_irq(pdev, 0);
+++ if (irq < 0) {
+++ dev_dbg(&pdev->dev, "no IRQ specified for %s\n",
+++ dev_name(&pdev->dev));
+++ return -ENODEV;
+++ }
+++
+++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+++ if (!res) {
+++ dev_dbg(&pdev->dev, "no base address specified for %s\n",
+++ dev_name(&pdev->dev));
+++ return -EINVAL;
+++ }
+++
+++ hcd = usb_create_hcd(&ehci_cns21xx_hc_driver, &pdev->dev,
+++ dev_name(&pdev->dev));
+++ if (!hcd)
+++ return -ENOMEM;
+++
+++ hcd->rsrc_start = res->start;
+++ hcd->rsrc_len = res->end - res->start + 1;
+++
+++ hcd->regs = devm_ioremap_resource(&pdev->dev, res);
+++ if (IS_ERR(hcd->regs)) {
+++ ret = PTR_ERR(hcd->regs);
+++ goto err_put_hcd;
+++ }
+++
+++ ehci_cns21xx_init_hc();
+++
+++ ehci = hcd_to_ehci(hcd);
+++ ehci->caps = hcd->regs;
+++
+++ ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
+++ if (ret)
+++ goto err_put_hcd;
+++
+++ platform_set_drvdata(pdev, hcd);
+++
+++ return 0;
+++
+++err_put_hcd:
+++ usb_put_hcd(hcd);
+++
+++ return ret;
+++}
+++
+++static int ehci_cns21xx_remove(struct platform_device *pdev)
+++{
+++ struct usb_hcd *hcd = platform_get_drvdata(pdev);
+++
+++ usb_remove_hcd(hcd);
+++ usb_put_hcd(hcd);
+++
+++ return 0;
+++}
+++
+++static struct platform_driver ehci_cns21xx_driver = {
+++ .probe = ehci_cns21xx_probe,
+++ .remove = ehci_cns21xx_remove,
+++ .shutdown = usb_hcd_platform_shutdown,
+++ .driver = {
+++ .owner = THIS_MODULE,
+++ .name = DRIVER_NAME,
+++ },
+++};
+++
+++static int __init ehci_cns21xx_init(void)
+++{
+++ if (usb_disabled())
+++ return -ENODEV;
+++
+++ ehci_init_driver(&ehci_cns21xx_hc_driver, NULL);
+++
+++ return platform_driver_register(&ehci_cns21xx_driver);
+++}
+++module_init(ehci_cns21xx_init);
+++
+++static void __exit ehci_cns21xx_exit(void)
+++{
+++ platform_driver_unregister(&ehci_cns21xx_driver);
+++}
+++module_exit(ehci_cns21xx_exit);
+++
+++MODULE_DESCRIPTION("Cavium Networks CNS21xx built-in EHCI controller driver");
+++MODULE_ALIAS("platform:" DRIVER_NAME);
+++MODULE_LICENSE("GPL v2");
++--- a/arch/arm/Kconfig
+++++ b/arch/arm/Kconfig
++@@ -375,6 +375,7 @@ config ARCH_CNS21XX
++ select ARCH_REQUIRE_GPIOLIB
++ select ARM_L1_CACHE_SHIFT_4
++ select USB_ARCH_HAS_OHCI
+++ select USB_ARCH_HAS_EHCI
++ help
++ Support for Cavium Networks CNS21xx family.
++
++--- a/drivers/usb/host/Kconfig
+++++ b/drivers/usb/host/Kconfig
++@@ -249,6 +249,14 @@ config USB_W90X900_EHCI
++ ---help---
++ Enables support for the W90X900 USB controller
++
+++config USB_EHCI_CNS21XX
+++ tristate "EHCI support for the Cavium CNS21XX SoCs"
+++ depends on ARCH_CNS21XX
+++ default y
+++ help
+++ Enables support for the built-in EHCI controller of the
+++ Cavium CNS21xx SoCs.
+++
++ config USB_CNS3XXX_EHCI
++ bool "Cavium CNS3XXX EHCI Module (DEPRECATED)"
++ depends on ARCH_CNS3XXX
++--- a/drivers/usb/host/Makefile
+++++ b/drivers/usb/host/Makefile
++@@ -33,6 +33,7 @@ obj-$(CONFIG_USB_EHCI_HCD_SPEAR) += ehci
++ obj-$(CONFIG_USB_EHCI_S5P) += ehci-s5p.o
++ obj-$(CONFIG_USB_EHCI_HCD_AT91) += ehci-atmel.o
++ obj-$(CONFIG_USB_EHCI_MSM) += ehci-msm.o
+++obj-$(CONFIG_USB_EHCI_CNS21XX) += ehci-cns21xx.o
++
++ obj-$(CONFIG_USB_OXU210HP_HCD) += oxu210hp-hcd.o
++ obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o
+diff --git a/feeds/targets/cns21xx/patches-3.10/105-cns21xx-spi-driver.patch b/feeds/targets/cns21xx/patches-3.10/105-cns21xx-spi-driver.patch
+new file mode 100644
+index 0000000..28085c5
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/105-cns21xx-spi-driver.patch
+@@ -0,0 +1,578 @@
++--- a/include/linux/spi/spi.h
+++++ b/include/linux/spi/spi.h
++@@ -523,6 +523,8 @@ struct spi_transfer {
++ u16 delay_usecs;
++ u32 speed_hz;
++
+++ unsigned last_in_message_list;
+++
++ struct list_head transfer_list;
++ };
++
++--- a/drivers/spi/Kconfig
+++++ b/drivers/spi/Kconfig
++@@ -198,6 +198,14 @@ config SPI_GPIO_OLD
++
++ If unsure, say N.
++
+++config SPI_CNS21XX
+++ tristate "Cavium Netowrks CNS21xx SPI master (EXPERIMENTAL)"
+++ depends on ARCH_CNS21XX
+++ select SPI_BITBANG
+++ help
+++ This driver supports the buil-in SPI controller of the Cavium Networks
+++ CNS21xx SoCs.
+++
++ config SPI_IMX
++ tristate "Freescale i.MX SPI controllers"
++ depends on ARCH_MXC
++--- a/drivers/spi/Makefile
+++++ b/drivers/spi/Makefile
++@@ -21,6 +21,7 @@ obj-$(CONFIG_SPI_BFIN_SPORT) += spi-bfi
++ obj-$(CONFIG_SPI_BITBANG) += spi-bitbang.o
++ obj-$(CONFIG_SPI_BUTTERFLY) += spi-butterfly.o
++ obj-$(CONFIG_SPI_CLPS711X) += spi-clps711x.o
+++obj-$(CONFIG_SPI_CNS21XX) += spi-cns21xx.o
++ obj-$(CONFIG_SPI_COLDFIRE_QSPI) += spi-coldfire-qspi.o
++ obj-$(CONFIG_SPI_DAVINCI) += spi-davinci.o
++ obj-$(CONFIG_SPI_DESIGNWARE) += spi-dw.o
++--- a/drivers/spi/spi-bitbang.c
+++++ b/drivers/spi/spi-bitbang.c
++@@ -328,6 +328,13 @@ static void bitbang_work(struct work_str
++ */
++ if (!m->is_dma_mapped)
++ t->rx_dma = t->tx_dma = 0;
+++
+++ if (t->transfer_list.next == &m->transfers) {
+++ t->last_in_message_list = 1;
+++ } else {
+++ t->last_in_message_list = 0;
+++ }
+++
++ status = bitbang->txrx_bufs(spi, t);
++ }
++ if (status > 0)
++--- /dev/null
+++++ b/drivers/spi/spi-cns21xx.c
++@@ -0,0 +1,521 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/init.h>
+++#include <linux/module.h>
+++#include <linux/spinlock.h>
+++#include <linux/workqueue.h>
+++#include <linux/interrupt.h>
+++#include <linux/delay.h>
+++#include <linux/errno.h>
+++#include <linux/platform_device.h>
+++#include <linux/io.h>
+++#include <linux/spi/spi.h>
+++#include <linux/spi/spi_bitbang.h>
+++
+++#include <mach/hardware.h>
+++#include <mach/cns21xx.h>
+++
+++#define DRIVER_NAME "cns21xx-spi"
+++
+++#ifdef CONFIG_CNS21XX_SPI_DEBUG
+++#define DBG(fmt, args...) pr_info("[CNS21XX_SPI_DEBUG]" fmt, ## args)
+++#else
+++#define DBG(fmt, args...) do {} while (0)
+++#endif /* CNS21XX_SPI_DEBUG */
+++
+++#define SPI_REG_CFG 0x40
+++#define SPI_REG_STAT 0x44
+++#define SPI_REG_BIT_RATE 0x48
+++#define SPI_REG_TX_CTRL 0x4c
+++#define SPI_REG_TX_DATA 0x50
+++#define SPI_REG_RX_CTRL 0x54
+++#define SPI_REG_RX_DATA 0x58
+++#define SPI_REG_FIFO_TX_CFG 0x5c
+++#define SPI_REG_FIFO_TX_CTRL 0x60
+++#define SPI_REG_FIFO_RX_CFG 0x64
+++#define SPI_REG_INTR_STAT 0x68
+++#define SPI_REG_INTR_ENA 0x6c
+++
+++#define CFG_SPI_EN BIT(31)
+++#define CFG_SPI_CLKPOL BIT(14)
+++#define CFG_SPI_CLKPHA BIT(13)
+++#define CFG_SPI_MASTER_EN BIT(11)
+++#define CFG_SPI_CHAR_LEN_M 0x3
+++#define CFG_SPI_CHAR_LEN_8BITS 0
+++#define CFG_SPI_CHAR_LEN_16BITS 1
+++#define CFG_SPI_CHAR_LEN_24BITS 2
+++#define CFG_SPI_CHAR_LEN_32BITS 3
+++
+++#define STAT_SPI_BUSY_STA BIT(1)
+++
+++#define BIT_RATE_DIV_1 0
+++#define BIT_RATE_DIV_2 1
+++#define BIT_RATE_DIV_4 2
+++#define BIT_RATE_DIV_8 3
+++#define BIT_RATE_DIV_16 4
+++#define BIT_RATE_DIV_32 5
+++#define BIT_RATE_DIV_64 6
+++#define BIT_RATE_DIV_128 7
+++
+++#define TX_CTRL_SPI_TXDAT_EOF BIT(2)
+++#define TX_CTRL_SPI_TXCH_NUM_M 0x3
+++#define TX_CTRL_CLEAR_MASK (TX_CTRL_SPI_TXDAT_EOF | \
+++ TX_CTRL_SPI_TXCH_NUM_M)
+++
+++#define RX_CTRL_SPI_RXDAT_EOF BIT(2)
+++#define RX_CTRL_SPI_RXCH_NUM_M 0x3
+++
+++#define INTR_STAT_SPI_TXBF_UNRN_FG BIT(7)
+++#define INTR_STAT_SPI_RXBF_OVRN_FG BIT(6)
+++#define INTR_STAT_SPI_TXFF_UNRN_FG BIT(5)
+++#define INTR_STAT_SPI_RXFF_OVRN_FG BIT(4)
+++#define INTR_STAT_SPI_TXBUF_FG BIT(3)
+++#define INTR_STAT_SPI_RXBUF_FG BIT(2)
+++#define INTR_STAT_SPI_TXFF_FG BIT(1)
+++#define INTR_STAT_SPI_RXFF_FG BIT(0)
+++
+++#define INTR_STAT_CLEAR_MASK (INTR_STAT_SPI_TXBF_UNRN_FG | \
+++ INTR_STAT_SPI_RXBF_OVRN_FG | \
+++ INTR_STAT_SPI_TXFF_UNRN_FG | \
+++ INTR_STAT_SPI_RXFF_OVRN_FG)
+++
+++#define FIFO_TX_CFG_SPI_TXFF_THRED_M 0x3
+++#define FIFO_TX_CFG_SPI_TXFF_THRED_S 4
+++#define FIFO_TX_CFG_SPI_TXFF_THRED_2 0
+++#define FIFO_TX_CFG_SPI_TXFF_THRED_4 1
+++#define FIFO_TX_CFG_SPI_TXFF_THRED_6 0
+++#define FIFO_TX_CFG_SPI_TXFF_STATUS_M 0xf
+++
+++#define FIFO_RX_CFG_SPI_RXFF_THRED_M 0x3
+++#define FIFO_RX_CFG_SPI_RXFF_THRED_S 4
+++#define FIFO_RX_CFG_SPI_RXFF_THRED_2 0
+++#define FIFO_RX_CFG_SPI_RXFF_THRED_4 1
+++#define FIFO_RX_CFG_SPI_RXFF_THRED_6 0
+++#define FIFO_RX_CFG_SPI_RXFF_STATUS_M 0xf
+++
+++#define CNS21XX_SPI_NUM_BIT_RATES 8
+++
+++struct cns21xx_spi {
+++ struct spi_bitbang bitbang;
+++
+++ struct spi_master *master;
+++ struct device *dev;
+++ void __iomem *base;
+++ struct resource *region;
+++
+++ unsigned freq_max;
+++ unsigned freq_min;
+++
+++};
+++
+++static inline struct cns21xx_spi *to_hw(struct spi_device *spi)
+++{
+++ return spi_master_get_devdata(spi->master);
+++}
+++
+++static inline u32 cns21xx_spi_rr(struct cns21xx_spi *hw, unsigned int reg)
+++{
+++ return __raw_readl(hw->base + reg);
+++}
+++
+++static inline void cns21xx_spi_wr(struct cns21xx_spi *hw, u32 val,
+++ unsigned int reg)
+++{
+++ __raw_writel(val, hw->base + reg);
+++}
+++
+++#define CNS21XX_SPI_RETRY_COUNT 100
+++static inline int cns21xx_spi_wait(struct cns21xx_spi *hw, unsigned int reg,
+++ u32 mask, u32 val)
+++{
+++ int retry_cnt = 0;
+++
+++ do {
+++ if ((cns21xx_spi_rr(hw, reg) & mask) == val)
+++ break;
+++
+++ if (++retry_cnt > CNS21XX_SPI_RETRY_COUNT) {
+++ dev_err(hw->dev, "timeout waiting on register %02x\n",
+++ reg);
+++ return -EIO;
+++ }
+++ } while (1);
+++
+++ return 0;
+++}
+++
+++static int cns21xx_spi_txrx_word(struct cns21xx_spi *hw, u8 tx_channel,
+++ u8 tx_eof_flag, u32 tx_data, u32 *rx_data)
+++{
+++ unsigned int tx_ctrl;
+++ u8 rx_channel;
+++ u8 rx_eof_flag;
+++ int err = 0;
+++
+++ err = cns21xx_spi_wait(hw, SPI_REG_STAT, STAT_SPI_BUSY_STA, 0);
+++ if (err)
+++ return err;
+++
+++ err = cns21xx_spi_wait(hw, SPI_REG_INTR_STAT, INTR_STAT_SPI_TXBUF_FG,
+++ INTR_STAT_SPI_TXBUF_FG);
+++ if (err)
+++ return err;
+++
+++ tx_ctrl = cns21xx_spi_rr(hw, SPI_REG_TX_CTRL);
+++ tx_ctrl &= ~(TX_CTRL_CLEAR_MASK);
+++ tx_ctrl |= (tx_channel & TX_CTRL_SPI_TXCH_NUM_M);
+++ tx_ctrl |= (tx_eof_flag) ? TX_CTRL_SPI_TXDAT_EOF : 0;
+++ cns21xx_spi_wr(hw, tx_ctrl, SPI_REG_TX_CTRL);
+++
+++ cns21xx_spi_wr(hw, tx_data, SPI_REG_TX_DATA);
+++
+++ err = cns21xx_spi_wait(hw, SPI_REG_INTR_STAT, INTR_STAT_SPI_RXBUF_FG,
+++ INTR_STAT_SPI_RXBUF_FG);
+++ if (err)
+++ return err;
+++
+++ rx_channel = cns21xx_spi_rr(hw, SPI_REG_RX_CTRL) &
+++ RX_CTRL_SPI_RXCH_NUM_M;
+++
+++ rx_eof_flag = (cns21xx_spi_rr(hw, SPI_REG_RX_CTRL) &
+++ RX_CTRL_SPI_RXDAT_EOF) ? 1 : 0;
+++
+++ *rx_data = cns21xx_spi_rr(hw, SPI_REG_RX_DATA);
+++
+++ if ((tx_channel != rx_channel) || (tx_eof_flag != rx_eof_flag))
+++ return -EPROTO;
+++
+++ return 0;
+++}
+++
+++static void cns21xx_spi_chipselect(struct spi_device *spi, int value)
+++{
+++ struct cns21xx_spi *hw = to_hw(spi);
+++ unsigned int spi_config;
+++ unsigned int tx_ctrl;
+++
+++ switch (value) {
+++ case BITBANG_CS_INACTIVE:
+++ break;
+++
+++ case BITBANG_CS_ACTIVE:
+++ spi_config = cns21xx_spi_rr(hw, SPI_REG_CFG);
+++
+++ if (spi->mode & SPI_CPHA)
+++ spi_config |= CFG_SPI_CLKPHA;
+++ else
+++ spi_config &= ~CFG_SPI_CLKPHA;
+++
+++ if (spi->mode & SPI_CPOL)
+++ spi_config |= CFG_SPI_CLKPOL;
+++ else
+++ spi_config &= ~CFG_SPI_CLKPOL;
+++
+++ cns21xx_spi_wr(hw, spi_config, SPI_REG_CFG);
+++
+++ tx_ctrl = cns21xx_spi_rr(hw, SPI_REG_TX_CTRL);
+++ tx_ctrl &= ~(TX_CTRL_CLEAR_MASK);
+++ tx_ctrl |= (spi->chip_select & TX_CTRL_SPI_TXCH_NUM_M);
+++ cns21xx_spi_wr(hw, tx_ctrl, SPI_REG_TX_CTRL);
+++
+++ break;
+++ }
+++}
+++
+++static int cns21xx_spi_setup(struct spi_device *spi)
+++{
+++ struct cns21xx_spi *hw = to_hw(spi);
+++
+++ if (spi->bits_per_word != 8) {
+++ dev_err(&spi->dev, "%s: invalid bits_per_word=%u\n",
+++ __func__, spi->bits_per_word);
+++ return -EINVAL;
+++ }
+++
+++ if (spi->max_speed_hz == 0)
+++ spi->max_speed_hz = hw->freq_max;
+++
+++ if (spi->max_speed_hz > hw->freq_max ||
+++ spi->max_speed_hz < hw->freq_min) {
+++ dev_err(&spi->dev, "%s: max_speed_hz=%u out of range\n",
+++ __func__, spi->max_speed_hz);
+++ return -EINVAL;
+++ }
+++
+++ return 0;
+++}
+++
+++static int cns21xx_spi_setup_transfer(struct spi_device *spi,
+++ struct spi_transfer *t)
+++{
+++ struct cns21xx_spi *hw = to_hw(spi);
+++ u8 bits_per_word;
+++ u32 hz;
+++ int i;
+++
+++ bits_per_word = (t) ? t->bits_per_word : spi->bits_per_word;
+++ hz = t ? t->speed_hz : spi->max_speed_hz;
+++
+++ if (!bits_per_word)
+++ bits_per_word = spi->bits_per_word;
+++
+++ if (!hz)
+++ hz = spi->max_speed_hz;
+++
+++ if (bits_per_word != 8) {
+++ dev_err(&spi->dev, "%s: invalid bits_per_word=%u\n",
+++ __func__, bits_per_word);
+++ return -EINVAL;
+++ }
+++
+++ if (hz > spi->max_speed_hz || hz > hw->freq_max || hz < hw->freq_min) {
+++ dev_err(&spi->dev, "%s: max_speed_hz=%u out of range\n",
+++ __func__, hz);
+++ return -EINVAL;
+++ }
+++
+++ for (i = 0; i < CNS21XX_SPI_NUM_BIT_RATES; i++)
+++ if (spi->max_speed_hz > (cns21xx_get_apb_freq() >> i))
+++ break;
+++
+++ DBG("max_speed:%uHz, curr_speed:%luHz, rate_index=%d\n",
+++ spi->max_speed_hz, cns21xx_get_apb_freq() / (1 << i), i);
+++
+++ cns21xx_spi_wr(hw, i, SPI_REG_BIT_RATE);
+++
+++ return 0;
+++}
+++
+++static int cns21xx_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
+++{
+++ struct cns21xx_spi *hw = to_hw(spi);
+++ const unsigned char *tx_buf;
+++ unsigned char *rx_buf;
+++ u32 rx_data;
+++ int tx_eof;
+++ int err = 0;
+++ int i;
+++
+++ tx_buf = t->tx_buf;
+++ rx_buf = t->rx_buf;
+++ tx_eof = t->last_in_message_list;
+++
+++ DBG("txrx: tx %p, rx %p, len %d\n", tx_buf, rx_buf, t->len);
+++
+++ if (tx_buf) {
+++ for (i = 0; i < t->len; i++)
+++ DBG("tx_buf[%02d]: 0x%02x\n", i, tx_buf[i]);
+++
+++ for (i = 0; i < (t->len - 1); i++) {
+++ err = cns21xx_spi_txrx_word(hw, spi->chip_select, 0,
+++ tx_buf[i], &rx_data);
+++ if (err)
+++ goto done;
+++
+++ if (rx_buf) {
+++ rx_buf[i] = rx_data;
+++ DBG("rx_buf[%02d]:0x%02x\n", i, rx_buf[i]);
+++ }
+++ }
+++
+++ err = cns21xx_spi_txrx_word(hw, spi->chip_select, tx_eof,
+++ tx_buf[i], &rx_data);
+++ if (err)
+++ goto done;
+++
+++ if ((tx_eof) && rx_buf) {
+++ rx_buf[i] = rx_data;
+++ DBG("rx_buf[%02d]:0x%02x\n", i, rx_buf[i]);
+++ }
+++ } else if (rx_buf) {
+++ for (i = 0; i < (t->len - 1); i++) {
+++ err = cns21xx_spi_txrx_word(hw, spi->chip_select, 0,
+++ 0xff, &rx_data);
+++ if (err)
+++ goto done;
+++
+++ rx_buf[i] = rx_data;
+++ DBG("rx_buf[%02d]:0x%02x\n", i, rx_buf[i]);
+++ }
+++
+++ err = cns21xx_spi_txrx_word(hw, spi->chip_select, tx_eof,
+++ 0xff, &rx_data);
+++ if (err)
+++ goto done;
+++
+++ rx_buf[i] = rx_data;
+++ DBG("rx_buf[%02d]:0x%02x\n", i, rx_buf[i]);
+++ }
+++
+++ done:
+++ return (err) ? err : t->len;
+++}
+++
+++static void __init cns21xx_spi_hw_init(struct cns21xx_spi *hw)
+++{
+++ u32 t;
+++ u32 pclk;
+++
+++ /* Setup configuration register */
+++ cns21xx_spi_wr(hw, CFG_SPI_MASTER_EN, SPI_REG_CFG);
+++
+++ /* Set default clock to PCLK/2 */
+++ cns21xx_spi_wr(hw, BIT_RATE_DIV_2, SPI_REG_BIT_RATE);
+++
+++ /* Configure SPI's Tx channel */
+++ cns21xx_spi_wr(hw, 0, SPI_REG_TX_CTRL);
+++
+++ /* Configure Tx FIFO Threshold */
+++ t = cns21xx_spi_rr(hw, SPI_REG_FIFO_TX_CFG);
+++ t &= ~(FIFO_TX_CFG_SPI_TXFF_THRED_M << FIFO_TX_CFG_SPI_TXFF_THRED_S);
+++ t |= (FIFO_TX_CFG_SPI_TXFF_THRED_2 << FIFO_TX_CFG_SPI_TXFF_THRED_S);
+++ cns21xx_spi_wr(hw, t, SPI_REG_FIFO_TX_CFG);
+++
+++ /* Configure Rx FIFO Threshold */
+++ t = cns21xx_spi_rr(hw, SPI_REG_FIFO_RX_CFG);
+++ t &= ~(FIFO_RX_CFG_SPI_RXFF_THRED_M << FIFO_RX_CFG_SPI_RXFF_THRED_S);
+++ t |= (FIFO_RX_CFG_SPI_RXFF_THRED_2 << FIFO_RX_CFG_SPI_RXFF_THRED_S);
+++ cns21xx_spi_wr(hw, t, SPI_REG_FIFO_RX_CFG);
+++
+++ /* Disable interrupts, and clear interrupt status */
+++ cns21xx_spi_wr(hw, 0, SPI_REG_INTR_ENA);
+++ cns21xx_spi_wr(hw, INTR_STAT_CLEAR_MASK, SPI_REG_INTR_STAT);
+++
+++ (void) cns21xx_spi_rr(hw, SPI_REG_RX_DATA);
+++
+++ /* Enable SPI */
+++ t = cns21xx_spi_rr(hw, SPI_REG_CFG);
+++ t |= CFG_SPI_EN;
+++ cns21xx_spi_wr(hw, t, SPI_REG_CFG);
+++
+++ pclk = cns21xx_get_apb_freq();
+++ hw->freq_max = pclk;
+++ hw->freq_min = pclk / (1 << BIT_RATE_DIV_128);
+++}
+++
+++static int __init cns21xx_spi_probe(struct platform_device *pdev)
+++{
+++ struct cns21xx_spi *hw;
+++ struct spi_master *master;
+++ struct resource *res;
+++ int err = 0;
+++
+++ master = spi_alloc_master(&pdev->dev, sizeof(struct cns21xx_spi));
+++ if (!master) {
+++ dev_err(&pdev->dev, "No memory for spi_master\n");
+++ return -ENOMEM;
+++ }
+++
+++ hw = spi_master_get_devdata(master);
+++
+++ platform_set_drvdata(pdev, hw);
+++ hw->master = spi_master_get(master);
+++ hw->dev = &pdev->dev;
+++
+++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+++ if (!res) {
+++ dev_dbg(&pdev->dev, "no MEM resource found\n");
+++ err = -ENOENT;
+++ goto err_put_master;
+++ }
+++
+++ hw->region = request_mem_region(res->start, resource_size(res),
+++ dev_name(&pdev->dev));
+++ if (!hw->region) {
+++ dev_err(&pdev->dev, "unable to reserve iomem region\n");
+++ err = -ENXIO;
+++ goto err_put_master;
+++ }
+++
+++ hw->base = ioremap(res->start, resource_size(res));
+++ if (!hw->base) {
+++ dev_err(&pdev->dev, "ioremap failed\n");
+++ err = -ENOENT;
+++ goto err_release_region;
+++ }
+++
+++ cns21xx_spi_hw_init(hw);
+++
+++ master->bus_num = pdev->id;
+++ if (master->bus_num == -1)
+++ master->bus_num = 0;
+++
+++ master->num_chipselect = 4;
+++ master->setup = cns21xx_spi_setup;
+++
+++ hw->bitbang.master = hw->master;
+++ hw->bitbang.chipselect = cns21xx_spi_chipselect;
+++ hw->bitbang.txrx_bufs = cns21xx_spi_txrx;
+++ hw->bitbang.setup_transfer = cns21xx_spi_setup_transfer;
+++
+++ err = spi_bitbang_start(&hw->bitbang);
+++ if (err) {
+++ dev_err(hw->dev, "unable to register SPI master\n");
+++ goto err_unmap;
+++ }
+++
+++ dev_info(hw->dev, "iomem at %08x\n", res->start);
+++
+++ return 0;
+++
+++ err_unmap:
+++ iounmap(hw->base);
+++
+++ err_release_region:
+++ release_resource(hw->region);
+++ kfree(hw->region);
+++
+++ err_put_master:
+++ spi_master_put(hw->bitbang.master);
+++ platform_set_drvdata(pdev, NULL);
+++
+++ return err;
+++}
+++
+++static int cns21xx_spi_remove(struct platform_device *pdev)
+++{
+++ struct cns21xx_spi *hw = platform_get_drvdata(pdev);
+++
+++ spi_bitbang_stop(&hw->bitbang);
+++ iounmap(hw->base);
+++ release_resource(hw->region);
+++ kfree(hw->region);
+++ spi_master_put(hw->bitbang.master);
+++ platform_set_drvdata(pdev, NULL);
+++
+++ return 0;
+++}
+++
+++static struct platform_driver cns21xx_spi_driver = {
+++ .remove = cns21xx_spi_remove,
+++ .driver = {
+++ .name = DRIVER_NAME,
+++ .owner = THIS_MODULE,
+++ },
+++};
+++
+++static int __init cns21xx_spi_init(void)
+++{
+++ return platform_driver_probe(&cns21xx_spi_driver, cns21xx_spi_probe);
+++}
+++
+++static void __exit cns21xx_spi_exit(void)
+++{
+++ platform_driver_unregister(&cns21xx_spi_driver);
+++}
+++
+++module_init(cns21xx_spi_init);
+++module_exit(cns21xx_spi_exit);
+++
+++MODULE_DESCRIPTION("Cavium Networks CNS21xx SPI Controller driver");
+++MODULE_AUTHOR("STAR Semi Corp.");
+++MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
+++MODULE_LICENSE("GPL v2");
+++MODULE_ALIAS("platform:" DRIVER_NAME);
+diff --git a/feeds/targets/cns21xx/patches-3.10/106-cns21xx-gec-driver.patch b/feeds/targets/cns21xx/patches-3.10/106-cns21xx-gec-driver.patch
+new file mode 100644
+index 0000000..a48ba59
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/106-cns21xx-gec-driver.patch
+@@ -0,0 +1,2507 @@
++--- /dev/null
+++++ b/drivers/net/ethernet/cns21xx/cns21xx_gec_main.c
++@@ -0,0 +1,2464 @@
+++/*
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This driver has been derived from the ethernet driver of the
+++ * Star STR81xx SoC.
+++ * Copyright (c) 2008 Cavium Networks
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/module.h>
+++#include <linux/kernel.h>
+++#include <linux/bootmem.h>
+++#include <linux/sched.h>
+++#include <linux/types.h>
+++#include <linux/fcntl.h>
+++#include <linux/interrupt.h>
+++#include <linux/ptrace.h>
+++#include <linux/ioport.h>
+++#include <linux/in.h>
+++#include <linux/slab.h>
+++#include <linux/init.h>
+++#include <linux/bitops.h>
+++#include <linux/irq.h>
+++#include <linux/io.h>
+++#include <linux/pci.h>
+++#include <linux/errno.h>
+++#include <linux/delay.h>
+++#include <linux/netdevice.h>
+++#include <linux/etherdevice.h>
+++#include <linux/platform_device.h>
+++#include <linux/skbuff.h>
+++#include <linux/ip.h>
+++#include <linux/if_ether.h>
+++#include <linux/icmp.h>
+++#include <linux/udp.h>
+++#include <linux/tcp.h>
+++#include <linux/if_arp.h>
+++#include <net/arp.h>
+++
+++#include <mach/hardware.h>
+++#include <mach/cns21xx.h>
+++#include <mach/cns21xx_misc.h>
+++#include <mach/cns21xx_powermgmt.h>
+++#include <mach/cns21xx_gec_platform.h>
+++
+++#define DRIVER_NAME "cns21xx-gec"
+++
+++/* VSC8601 and WavePlus Phy are the same */
+++#define CNS21XX_GEC_PHY_ADDR 0
+++
+++#define CNS21XX_GEC_TX_HW_CHECKSUM
+++#define CNS21XX_GEC_RX_HW_CHECKSUM
+++
+++#define CNS21XX_PEND_INT_COUNT 16
+++#define CNS21XX_PEND_INT_TIME 5 /* 5 x 20 usecs */
+++
+++#define MAX_PACKET_LEN 1536
+++
+++#define CNS21XX_GEC_NUM_TXDS 48 /* FIXME: original 64 will cause UDP fail */
+++#define CNS21XX_GEC_NUM_RXDS 64
+++
+++struct cns21xx_gec_mib_info {
+++ u32 mib_rx_ok_pkt;
+++ u64 mib_rx_ok_byte;
+++ u32 mib_rx_runt;
+++ u32 mib_rx_over_size;
+++ u32 mib_rx_no_buffer_drop;
+++ u32 mib_rx_crc_err;
+++ u32 mib_rx_arl_drop;
+++ u32 mib_rx_myvid_drop;
+++ u32 mib_rx_csum_err;
+++ u32 mib_rx_pause_frame;
+++ u32 mib_tx_ok_pkt;
+++ u64 mib_tx_ok_byte;
+++ u32 mib_tx_pause_frame;
+++};
+++
+++/*
+++ * Network Driver, Receive/Send and Initial Buffer Function
+++ */
+++struct cns21xx_gec_txd {
+++ /* 1st 32Bits */
+++ u32 sdp;
+++
+++ /* 2nd 32Bits */
+++ u32 length:16;
+++ u32 reserved0:7;
+++ u32 tco:1;
+++ u32 uco:1;
+++ u32 ico:1;
+++ u32 insv:1;
+++ u32 intr:1;
+++ u32 ls:1;
+++ u32 fs:1;
+++ u32 eor:1;
+++ u32 cown:1;
+++
+++ /* 3rd 32Bits */
+++ u32 vid:12;
+++ u32 cfi:1;
+++ u32 pri:3;
+++ u32 epid:16;
+++
+++ /* 4th 32Bits */
+++ u32 reserved1;
+++} __packed;
+++
+++struct cns21xx_gec_rxd {
+++ /* 1st 32Bits */
+++ u32 sdp;
+++
+++ /* 2nd 32Bits */
+++ u32 length:16;
+++ u32 l4f:1;
+++ u32 ipf:1;
+++ u32 prot:2;
+++ u32 vted:1;
+++ u32 mymac:1;
+++ u32 hhit:1;
+++ u32 rmc:1;
+++ u32 crce:1;
+++ u32 osize:1;
+++ u32 reserved0:2;
+++ u32 ls:1;
+++ u32 fs:1;
+++ u32 eor:1;
+++ u32 cown:1;
+++
+++ /* 3rd 32Bits */
+++ u32 vid:12;
+++ u32 cfi:1;
+++ u32 pri:3;
+++ u32 epid:16;
+++
+++ /* 4th 32Bits */
+++ u32 reserved1;
+++} __packed;
+++
+++struct cns21xx_gec_ring {
+++ u32 desc_dma;
+++ void *desc_cpu;
+++ u32 curr;
+++ u32 dirty;
+++ u32 count;
+++ struct sk_buff **skbs;
+++};
+++
+++#define CNS21XX_GEC_NUM_VLANS 4
+++struct cns21xx_gec_vlan {
+++ u32 vid; /* 0~4095 */
+++ u32 control; /* ENABLE or DISABLE */
+++};
+++
+++/* store this information for the driver.. */
+++struct cns21xx_gec {
+++ struct napi_struct napi;
+++ struct net_device *netdev;
+++ struct device *parent;
+++ struct cns21xx_gec_ring txring;
+++ struct cns21xx_gec_ring rxring;
+++
+++ void __iomem *base;
+++ struct resource *mem_res;
+++ struct cns21xx_gec_plat_data *pdata;
+++ spinlock_t lock;
+++ spinlock_t tx_lock;
+++
+++ int status_irq;
+++ int rxrc_irq;
+++ int rxqf_irq;
+++ int txtc_irq;
+++ int txqe_irq;
+++ unsigned long rx_queue_full;
+++
+++ struct cns21xx_gec_vlan vlans[CNS21XX_GEC_NUM_VLANS];
+++
+++ struct timer_list internal_phy_timer;
+++ struct timer_list nic_timer;
+++ u8 phy_addr;
+++ u16 phy_id;
+++ struct cns21xx_gec_mib_info mib_info;
+++};
+++
+++#define GEC_REG_PHY_CTRL0 0x000
+++#define GEC_REG_PHY_CTRL1 0x004
+++#define GEC_REG_MAC_CFG 0x008
+++#define GEC_REG_FC_CFG 0x00c
+++#define GEC_REG_ARL_CFG 0x010
+++#define GEC_REG_MY_MAC_H 0x014
+++#define GEC_REG_MY_MAC_L 0x018
+++#define GEC_REG_HASH_CTRL 0x01c
+++#define GEC_REG_VLAN_CTRL 0x020
+++#define GEC_REG_VLAN_ID_0_1 0x024
+++#define GEC_REG_VLAN_ID_2_3 0x028
+++#define GEC_REG_DMA_CFG 0x030
+++#define GEC_REG_TX_DMA_CTRL 0x034
+++#define GEC_REG_RX_DMA_CTRL 0x038
+++#define GEC_REG_TX_DPTR 0x03c
+++#define GEC_REG_RX_DPTR 0x040
+++#define GEC_REG_TX_BASE_ADDR 0x044
+++#define GEC_REG_RX_BASE_ADDR 0x048
+++#define GEC_REG_DLY_INT_CFG 0x04c
+++#define GEC_REG_INT 0x050
+++#define GEC_REG_INT_MASK 0x054
+++#define GEC_REG_TEST0 0x058
+++#define GEC_REG_TEST1 0x05c
+++#define GEC_REG_EXTEND_CFG 0x060
+++
+++#define GEC_REG_RX_OK_PKT_CNTR 0x100
+++#define GEC_REG_RX_OK_BYTE_CNTR 0x104
+++#define GEC_REG_RX_RUNT_BYTE_CNTR 0x108
+++#define GEC_REG_RX_OSIZE_DROP_PKT_CNTR 0x10c
+++#define GEC_REG_RX_NO_BUF_DROP_PKT_CNTR 0x110
+++#define GEC_REG_RX_CRC_ERR_PKT_CNTR 0x114
+++#define GEC_REG_RX_ARL_DROP_PKT_CNTR 0x118
+++#define GEC_REG_MYVLANID_MISMATCH_DROP_PKT_CNTR 0x11c
+++#define GEC_REG_RX_CHKSUM_ERR_PKT_CNTR 0x120
+++#define GEC_REG_RX_PAUSE_FRAME_PKT_CNTR 0x124
+++#define GEC_REG_TX_OK_PKT_CNTR 0x128
+++#define GEC_REG_TX_OK_BYTE_CNTR 0x12c
+++#define GEC_REG_TX_COLLISION_CNTR 0x130
+++#define GEC_REG_TX_PAUSE_FRAME_CNTR 0x130
+++#define GEC_REG_TX_FIFO_UNDERRUN_RETX_CNTR 0x134
+++
+++#define GEC_INT_MIB_COUNTER_TH BIT(3)
+++#define GEC_INT_PORT_STATUS_CHG BIT(2)
+++
+++#define FE_PHY_LED_MODE (0x1 << 12)
+++
+++static void internal_phy_init_timer(struct cns21xx_gec *gec);
+++static void internal_phy_start_timer(struct cns21xx_gec *gec);
+++static void internal_phy_stop_timer(struct cns21xx_gec *gec);
+++
+++static void cns21xx_gec_phy_powerdown(struct cns21xx_gec *gec);
+++static void cns21xx_gec_phy_powerup(struct cns21xx_gec *gec);
+++
+++static inline u32 cns21xx_gec_rr(struct cns21xx_gec *gec, unsigned int reg)
+++{
+++ return __raw_readl(gec->base + reg);
+++}
+++
+++static inline void cns21xx_gec_wr(struct cns21xx_gec *gec, unsigned int reg,
+++ u32 val)
+++{
+++ __raw_writel(val, gec->base + reg);
+++}
+++
+++static void cns21xx_gec_timer_func(unsigned long data)
+++{
+++ struct cns21xx_gec *gec = (struct cns21xx_gec *) data;
+++ struct cns21xx_gec_ring *txring = &gec->txring;
+++ int i;
+++ int txsd_index;
+++ int txsd_current;
+++ int skb_free_count = 0;
+++ struct cns21xx_gec_txd *txd;
+++ unsigned long flags;
+++
+++ local_irq_save(flags);
+++ txsd_current = cns21xx_gec_rr(gec, GEC_REG_TX_DPTR);
+++ txsd_index = (txsd_current - (u32)txring->desc_dma) >> 4;
+++ if (txsd_index > txring->dirty) {
+++ skb_free_count = txsd_index - txring->dirty;
+++ } else if (txsd_index <= txring->dirty) {
+++ skb_free_count = txring->count + txsd_index -
+++ txring->dirty;
+++ }
+++ for (i = 0; i < skb_free_count; i++) {
+++ txd = ((struct cns21xx_gec_txd *) txring->desc_cpu) +
+++ txring->dirty;
+++
+++ if (txd->cown == 0)
+++ break;
+++
+++ if (txring->skbs[txring->dirty]) {
+++ dev_kfree_skb_any(txring->skbs[txring->dirty]);
+++ txring->skbs[txring->dirty] = NULL;
+++
+++ dma_unmap_single(gec->parent,
+++ txd->sdp,
+++ txd->length,
+++ DMA_TO_DEVICE);
+++ }
+++
+++ txring->dirty++;
+++ if (txring->dirty == txring->count)
+++ txring->dirty = 0;
+++ }
+++ local_irq_restore(flags);
+++}
+++
+++static void __init cns21xx_gec_timer_init(struct cns21xx_gec *gec)
+++{
+++ init_timer(&gec->nic_timer);
+++ gec->nic_timer.function = &cns21xx_gec_timer_func;
+++ gec->nic_timer.data = (unsigned long) gec;
+++}
+++
+++static void cns21xx_gec_timer_modify(struct cns21xx_gec *gec, unsigned int t)
+++{
+++ mod_timer(&gec->nic_timer, jiffies + t);
+++}
+++
+++static int cns21xx_gec_write_phy(struct cns21xx_gec *gec,
+++ u8 addr, u8 reg, u16 val)
+++{
+++ int i;
+++
+++ if (addr > 31 || reg > 31)
+++ return -EINVAL;
+++
+++ /* clear previous rw_ok status */
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL0, 0x1 << 15);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL0,
+++ addr | (reg << 8) | (val << 16) | (0x1 << 13));
+++
+++ for (i = 0; i < 10000; i++) {
+++ u32 status;
+++
+++ status = cns21xx_gec_rr(gec, GEC_REG_PHY_CTRL0);
+++ if (status & (0x1 << 15)) {
+++ /*
+++ * clear the rw_ok status,
+++ * and clear other bits value
+++ */
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL0, (0x1 << 15));
+++ return 0;
+++ }
+++ udelay(1000);
+++ }
+++
+++ dev_err(&gec->netdev->dev,
+++ "%s timed out, phy_addr:0x%x, phy_reg:0x%x, write_data:0x%x\n",
+++ __func__, addr, reg, val);
+++
+++ return -EIO;
+++}
+++
+++static int cns21xx_gec_read_phy(struct cns21xx_gec *gec,
+++ u8 addr, u8 reg, u16 *val)
+++{
+++ int i;
+++
+++ if (addr > 31 || reg > 31)
+++ return -EINVAL;
+++
+++ /* clear previous rw_ok status */
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL0, 0x1 << 15);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL0,
+++ addr | (reg << 8) | (0x1 << 14));
+++
+++ for (i = 0; i < 10000; i++) {
+++ u32 status;
+++
+++ status = cns21xx_gec_rr(gec, GEC_REG_PHY_CTRL0);
+++ if (status & (0x1 << 15)) {
+++ /*
+++ * clear the rw_ok status,
+++ * and clear other bits value
+++ */
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL0, (0x1 << 15));
+++ *val = (status >> 16) & 0xffff;
+++ return 0;
+++ }
+++ udelay(1000);
+++ }
+++
+++ dev_err(&gec->netdev->dev,
+++ "%s timed out, phy_addr:0x%x, phy_reg:0x%x\n",
+++ __func__, addr, reg);
+++
+++ *val = 0xffff;
+++ return -EIO;
+++}
+++
+++static void cns21xx_gec_dma_config(struct cns21xx_gec *gec)
+++{
+++ u32 dma_config = 0;
+++
+++ dma_config = cns21xx_gec_rr(gec, GEC_REG_DMA_CFG);
+++
+++ /* Config TX DMA */
+++ /* TX auto polling: 1 us */
+++ dma_config &= ~(0x3 << 6);
+++ /* TX auto polling :100us */
+++ dma_config |= (0x2 << 6);
+++ /* TX auto polling C-bit enable */
+++ dma_config |= (0x1 << 5);
+++ /* TX can transmit packets, No suspend */
+++ dma_config &= ~(0x1 << 4);
+++
+++ /* Config RX DMA */
+++ /* RX auto polling: 1 us */
+++ dma_config &= ~(0x3 << 2);
+++ /* RX auto polling :100us */
+++ dma_config |= (0x2 << 2);
+++ /* RX auto polling C-bit enable */
+++ dma_config |= (0x1 << 1);
+++ /* RX can receive packets, No suspend */
+++ dma_config &= ~0x1;
+++
+++ /* 4N+2(for Linux) */
+++ dma_config &= ~(0x1 << 16);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_DMA_CFG, dma_config);
+++}
+++
+++static void cns21xx_gec_mac_config(struct cns21xx_gec *gec)
+++{
+++ u32 mac_config;
+++
+++ mac_config = cns21xx_gec_rr(gec, GEC_REG_MAC_CFG);
+++
+++#ifdef CNS21XX_GEC_TX_HW_CHECKSUM
+++ /* Tx ChkSum offload On: TCP/UDP/IP */
+++ mac_config |= (0x1 << 26);
+++#else
+++ /* Tx ChkSum offload Off: TCP/UDP/IP */
+++ mac_config &= ~(0x1 << 26);
+++#endif
+++
+++#ifdef CNS21XX_GEC_RX_HW_CHECKSUM
+++ /* Rx ChkSum offload On: TCP/UDP/IP */
+++ mac_config |= (0x1 << 25);
+++#else
+++ /* Rx ChkSum offload Off: TCP/UDP/IP */
+++ mac_config &= ~(0x1 << 25);
+++#endif
+++
+++ /* Accept CSUM error pkt */
+++ mac_config |= (0x1 << 24);
+++ /* IST disable */
+++ mac_config &= ~(0x1 << 23);
+++ /* Strip vlan tag */
+++ mac_config |= (0x1 << 22);
+++ /* Accept CRC error pkt */
+++ mac_config |= (0x1 << 21);
+++ /* CRC strip */
+++ mac_config |= (0x1 << 20);
+++
+++ /* Discard oversize pkt */
+++ mac_config &= ~(0x1 << 18);
+++
+++ /* clear, set 1518 */
+++ mac_config &= ~(0x3 << 16);
+++
+++ /* 1536 */
+++ mac_config |= (0x2 << 16);
+++
+++ /* IPG */
+++ mac_config |= (0x1f << 10);
+++
+++ /* Do not skip 16 consecutive collisions pkt */
+++ /* allow to re-tx */
+++ mac_config |= (0x1 << 9);
+++ /* Fast retry */
+++ mac_config |= (0x1 << 8);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_MAC_CFG, mac_config);
+++}
+++
+++static void cns21xx_gec_fc_config(struct cns21xx_gec *gec)
+++{
+++ u32 fc_config;
+++
+++ fc_config = cns21xx_gec_rr(gec, GEC_REG_FC_CFG);
+++
+++ /* Send pause on frame threshold */
+++ /* Clear */
+++ fc_config &= ~(0xfff << 16);
+++ fc_config |= (0x360 << 16);
+++ /* Disable UC_PAUSE */
+++ fc_config &= ~(0x1 << 8);
+++ /* Enable Half Duplex backpressure */
+++ fc_config |= (0x1 << 7);
+++ /* Collision-based BP */
+++ fc_config &= ~(0x1 << 6);
+++ /* Disable max BP collision */
+++ fc_config &= ~(0x1 << 5);
+++ /* Clear */
+++ fc_config &= ~(0x1f);
+++ /* Set */
+++ fc_config |= (0xc);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_FC_CFG, fc_config);
+++}
+++
+++static void cns21xx_gec_internal_phy_config(struct cns21xx_gec *gec)
+++{
+++ u32 phy_ctrl1;
+++ u32 phy_addr;
+++
+++ dev_info(&gec->netdev->dev, "Internal PHY\n");
+++
+++ phy_addr = CNS21XX_GEC_PHY_ADDR;
+++ gec->phy_addr = phy_addr;
+++
+++ phy_ctrl1 = cns21xx_gec_rr(gec, GEC_REG_PHY_CTRL1);
+++
+++ /* set phy addr for auto-polling */
+++ phy_ctrl1 |= (phy_addr & 0x1f) << 24;
+++
+++ /* set internal phy mode */
+++ /* internel 10/100 phy */
+++ phy_ctrl1 |= 0x1 << 18;
+++
+++ /* MII */
+++ phy_ctrl1 &= ~(0x1 << 17);
+++
+++ /* MAC mode */
+++ phy_ctrl1 &= ~(0x1 << 16);
+++
+++ /* config PHY LED bit[13:12] */
+++ cns21xx_gec_read_phy(gec, phy_addr, 31, (u16 *)(&phy_ctrl1));
+++ /* clear LED control */
+++ phy_ctrl1 &= ~(0x3 << 12);
+++ phy_ctrl1 |= FE_PHY_LED_MODE;
+++ cns21xx_gec_write_phy(gec, phy_addr, 31, phy_ctrl1);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL1, phy_ctrl1);
+++}
+++
+++static void cns21xx_gec_vsc8601_phy_config(struct cns21xx_gec *gec)
+++{
+++ u32 phy_ctrl1;
+++ u32 phy_addr;
+++ u16 phy_data;
+++
+++ phy_addr = CNS21XX_GEC_PHY_ADDR;
+++ gec->phy_addr = phy_addr;
+++
+++ phy_ctrl1 = cns21xx_gec_rr(gec, GEC_REG_PHY_CTRL1);
+++
+++ /* phy addr for auto-polling */
+++ phy_ctrl1 |= phy_addr << 24;
+++
+++ /* set external phy mode */
+++ phy_ctrl1 &= ~(0x1 << 18);
+++
+++ /* set RGMII */
+++ phy_ctrl1 |= (0x1 << 17);
+++
+++ /* set MII interface */
+++ phy_ctrl1 &= ~(0x1 << 16);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL1, phy_ctrl1);
+++
+++ /* set phy addr for auto-polling */
+++ phy_ctrl1 |= phy_addr << 24;
+++
+++ /* set external phy mode */
+++ /* MII/RGMII interface */
+++ phy_ctrl1 &= ~(0x1 << 18);
+++
+++ /* RGMII */
+++ phy_ctrl1 |= (0x1 << 17);
+++
+++ /* MAC mode */
+++ phy_ctrl1 &= ~(0x1 << 16);
+++
+++ cns21xx_gec_read_phy(gec, phy_addr, 3, &phy_data);
+++ if ((phy_data & 0x000f) == 0x0000) {
+++ /* type A chip */
+++ u16 tmp16;
+++
+++ dev_info(&gec->netdev->dev, "VSC8601 Type A Chip\n");
+++ cns21xx_gec_write_phy(gec, phy_addr, 31, 0x52B5);
+++ cns21xx_gec_write_phy(gec, phy_addr, 16, 0xAF8A);
+++
+++ phy_data = 0x0;
+++ cns21xx_gec_read_phy(gec, phy_addr, 18, &tmp16);
+++ phy_data |= (tmp16 & ~0x0);
+++ cns21xx_gec_write_phy(gec, phy_addr, 18, phy_data);
+++
+++ phy_data = 0x0008;
+++ cns21xx_gec_read_phy(gec, phy_addr, 17, &tmp16);
+++ phy_data |= (tmp16 & ~0x000C);
+++ cns21xx_gec_write_phy(gec, phy_addr, 17, phy_data);
+++
+++ cns21xx_gec_write_phy(gec, phy_addr, 16, 0x8F8A);
+++ cns21xx_gec_write_phy(gec, phy_addr, 16, 0xAF86);
+++
+++ phy_data = 0x0008;
+++ cns21xx_gec_read_phy(gec, phy_addr, 18, &tmp16);
+++ phy_data |= (tmp16 & ~0x000C);
+++ cns21xx_gec_write_phy(gec, phy_addr, 18, phy_data);
+++
+++ phy_data = 0x0;
+++ cns21xx_gec_read_phy(gec, phy_addr, 17, &tmp16);
+++ phy_data |= (tmp16 & ~0x0);
+++ cns21xx_gec_write_phy(gec, phy_addr, 17, phy_data);
+++
+++ cns21xx_gec_write_phy(gec, phy_addr, 16, 0x8F8A);
+++
+++ cns21xx_gec_write_phy(gec, phy_addr, 16, 0xAF82);
+++
+++ phy_data = 0x0;
+++ cns21xx_gec_read_phy(gec, phy_addr, 18, &tmp16);
+++ phy_data |= (tmp16 & ~0x0);
+++ cns21xx_gec_write_phy(gec, phy_addr, 18, phy_data);
+++
+++ phy_data = 0x0100;
+++ cns21xx_gec_read_phy(gec, phy_addr, 17, &tmp16);
+++ phy_data |= (tmp16 & ~0x0180);
+++ cns21xx_gec_write_phy(gec, phy_addr, 17, phy_data);
+++
+++ cns21xx_gec_write_phy(gec, phy_addr, 16, 0x8F82);
+++
+++ cns21xx_gec_write_phy(gec, phy_addr, 31, 0x0);
+++
+++ /* Set port type: single port */
+++ cns21xx_gec_read_phy(gec, phy_addr, 9, &phy_data);
+++ phy_data &= ~(0x1 << 10);
+++ cns21xx_gec_write_phy(gec, phy_addr, 9, phy_data);
+++ } else if ((phy_data & 0x000f) == 0x0001) {
+++ /* type B chip */
+++ dev_info(&gec->netdev->dev, "VSC8601 Type B Chip\n");
+++
+++ cns21xx_gec_read_phy(gec, phy_addr, 23, &phy_data);
+++ phy_data |= (0x1 << 8); /* set RGMII timing skew */
+++ cns21xx_gec_write_phy(gec, phy_addr, 23, phy_data);
+++ }
+++
+++ /* change to extened registers */
+++ cns21xx_gec_write_phy(gec, phy_addr, 31, 0x0001);
+++
+++ cns21xx_gec_read_phy(gec, phy_addr, 28, &phy_data);
+++ phy_data &= ~(0x3 << 14); /* set RGMII TX timing skew */
+++ phy_data |= (0x3 << 14); /* 2.0ns */
+++ phy_data &= ~(0x3 << 12); /* set RGMII RX timing skew */
+++ phy_data |= (0x3 << 12); /* 2.0ns */
+++ cns21xx_gec_write_phy(gec, phy_addr, 28, phy_data);
+++
+++ /* change to normal registers */
+++ cns21xx_gec_write_phy(gec, phy_addr, 31, 0x0000);
+++
+++#if 0
+++ /* set TX and RX clock skew */
+++ cns21xx_gec_wr(gec, GEC_REG_TEST0, (0x2 << 2) | (0x2 << 0));
+++#endif
+++
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL1, phy_ctrl1);
+++}
+++
+++static void cns21xx_gec_ip101a_phy_config(struct cns21xx_gec *gec)
+++{
+++ u32 phy_ctrl1;
+++ u32 phy_addr;
+++
+++ dev_info(&gec->netdev->dev, "ICPlus IP101A\n");
+++
+++ phy_addr = 1;
+++ gec->phy_addr = phy_addr;
+++
+++ phy_ctrl1 = cns21xx_gec_rr(gec, GEC_REG_PHY_CTRL1);
+++
+++ /* set phy addr for auto-polling */
+++ phy_ctrl1 |= phy_addr << 24;
+++
+++ /* set external phy mode */
+++ /* MII/RGMII interface */
+++ phy_ctrl1 &= ~(0x1 << 18);
+++
+++ /* MII */
+++ phy_ctrl1 &= ~(0x1 << 17);
+++
+++ /* MAC mode */
+++ phy_ctrl1 &= ~(0x1 << 16);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL1, phy_ctrl1);
+++}
+++
+++static void cns21xx_gec_ip1001_phy_config(struct cns21xx_gec *gec)
+++{
+++ u32 phy_ctrl1;
+++ u32 phy_addr;
+++ u16 phy_data;
+++
+++ dev_info(&gec->netdev->dev, "ICPlus IP1001\n");
+++
+++ phy_addr = 1;
+++ gec->phy_addr = phy_addr;
+++
+++ phy_ctrl1 = cns21xx_gec_rr(gec, GEC_REG_PHY_CTRL1);
+++
+++ /* set phy addr for auto-polling */
+++ phy_ctrl1 |= phy_addr << 24;
+++
+++ /* set external phy mode */
+++ /* MII/RGMII interface */
+++ phy_ctrl1 &= ~(0x1 << 18);
+++
+++ /* RGMII */
+++ phy_ctrl1 |= (0x1 << 17);
+++
+++ /* MAC mode */
+++ phy_ctrl1 &= ~(0x1 << 16);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL1, phy_ctrl1);
+++ cns21xx_gec_read_phy(gec, phy_addr, 2, &phy_data);
+++
+++ /* set AN capability */
+++ cns21xx_gec_read_phy(gec, phy_addr, 4, &phy_data);
+++ /* clear existing values */
+++ phy_data &= ~(0xf << 5);
+++ /* 10Half */
+++ phy_data |= (0x1 << 5);
+++ /* 10Full */
+++ phy_data |= (0x1 << 6);
+++ /* 100Half */
+++ phy_data |= (0x1 << 7);
+++ /* 100Full */
+++ phy_data |= (0x1 << 8);
+++ /* FC on */
+++ phy_data |= (0x1 << 10);
+++ cns21xx_gec_write_phy(gec, phy_addr, 4, phy_data);
+++
+++ cns21xx_gec_read_phy(gec, phy_addr, 9, &phy_data);
+++ /* 1000Full on */
+++ phy_data |= (0x1 << 9);
+++ phy_data &= ~(0x1 << 10);
+++ phy_data |= (0x1 << 12);
+++ cns21xx_gec_write_phy(gec, phy_addr, 9, phy_data);
+++
+++ cns21xx_gec_read_phy(gec, phy_addr, 16, &phy_data);
+++ /* Smart function off */
+++ phy_data &= ~(0x1 << 11);
+++ /* TX delay */
+++ phy_data |= (0x1 << 0);
+++ /* RX delay */
+++ phy_data |= (0x1 << 1);
+++ cns21xx_gec_write_phy(gec, phy_addr, 16, phy_data);
+++
+++ cns21xx_gec_read_phy(gec, phy_addr, 16, &phy_data);
+++
+++#if 0
+++ cns21xx_gec_read_phy(gec, phy_addr, 20, &phy_data);
+++ phy_data &= ~(0x1<<2);
+++
+++ phy_data |= (0x1<<9);
+++ cns21xx_gec_write_phy(gec, phy_addr, 20, phy_data);
+++#endif
+++
+++ cns21xx_gec_read_phy(gec, phy_addr, 0, &phy_data);
+++ phy_data |= (0x1 << 9); /* re-AN */
+++ cns21xx_gec_write_phy(gec, phy_addr, 0, phy_data);
+++
+++ cns21xx_gec_read_phy(gec, phy_addr, 9, &phy_data);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL1, phy_ctrl1);
+++}
+++
+++static int cns21xx_gec_phy_config(struct cns21xx_gec *gec)
+++{
+++ u32 phy_ctrl1;
+++
+++ switch (gec->pdata->phy_type) {
+++ case CNS21XX_GEC_PHY_TYPE_INTERNAL:
+++ cns21xx_gec_internal_phy_config(gec);
+++ break;
+++
+++ case CNS21XX_GEC_PHY_TYPE_VSC8601:
+++ cns21xx_gec_vsc8601_phy_config(gec);
+++ break;
+++
+++ case CNS21XX_GEC_PHY_TYPE_IP101A:
+++ cns21xx_gec_ip101a_phy_config(gec);
+++ break;
+++
+++ case CNS21XX_GEC_PHY_TYPE_IP1001:
+++ cns21xx_gec_ip1001_phy_config(gec);
+++ break;
+++
+++ default:
+++ return -EINVAL;
+++ }
+++
+++ phy_ctrl1 = cns21xx_gec_rr(gec, GEC_REG_PHY_CTRL1);
+++
+++ /* AN On */
+++ phy_ctrl1 |= (0x1 << 8);
+++ if (!((phy_ctrl1 >> 8) & 0x1)) { /* AN disable */
+++ /* Force to FullDuplex mode */
+++ phy_ctrl1 &= ~(0x1 << 11); /* Half */
+++
+++ /* Force to 100Mbps mode */
+++ phy_ctrl1 &= ~(0x3 << 9); /* clear to 10M */
+++ phy_ctrl1 |= (0x1 << 9); /* set to 100M */
+++ }
+++
+++ /* Force TX FlowCtrl On,in 1000M */
+++ phy_ctrl1 |= (0x1 << 13);
+++
+++ /* Force TX FlowCtrl On, in 10/100M */
+++ phy_ctrl1 |= (0x1 << 12);
+++
+++ /* Enable MII auto polling */
+++ phy_ctrl1 &= ~(0x1 << 7);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_PHY_CTRL1, phy_ctrl1);
+++ cns21xx_gec_phy_powerdown(gec);
+++
+++ return 0;
+++}
+++
+++static void cns21xx_gec_vlan_config(struct cns21xx_gec *gec)
+++{
+++ /* setup VLAN entries */
+++ gec->vlans[0].vid = 2;
+++ gec->vlans[0].control = 0;
+++ gec->vlans[1].vid = 2;
+++ gec->vlans[1].control = 1;
+++ gec->vlans[2].vid = 1;
+++ gec->vlans[2].control = 1;
+++ gec->vlans[3].vid = 1;
+++ gec->vlans[3].control = 0;
+++
+++ cns21xx_gec_wr(gec, GEC_REG_VLAN_ID_0_1,
+++ (gec->vlans[0].vid & 0x0fff) |
+++ ((gec->vlans[1].vid & 0x0fff) << 16));
+++
+++ cns21xx_gec_wr(gec, GEC_REG_VLAN_ID_2_3,
+++ (gec->vlans[2].vid & 0x0fff) |
+++ ((gec->vlans[3].vid & 0x0fff) << 16));
+++
+++ cns21xx_gec_wr(gec, GEC_REG_VLAN_CTRL,
+++ (gec->vlans[0].control << 0) |
+++ (gec->vlans[1].control << 1) |
+++ (gec->vlans[2].control << 2) |
+++ (gec->vlans[3].control << 3));
+++}
+++
+++static int cns21xx_gec_arl_config(struct cns21xx_gec *gec)
+++{
+++ u32 arl_config;
+++
+++ arl_config = cns21xx_gec_rr(gec, GEC_REG_ARL_CFG);
+++
+++ /* Misc Mode ON */
+++ arl_config |= (0x1 << 4);
+++
+++ /* My MAC only enable */
+++ arl_config |= (0x1 << 3);
+++
+++ /* Learn SA On */
+++ arl_config &= ~(0x1 << 2);
+++
+++ /* Forward MC to CPU */
+++ arl_config &= ~(0x1 << 1);
+++
+++ /* Hash direct mode */
+++ arl_config &= ~(0x1);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_ARL_CFG, arl_config);
+++
+++ return 0;
+++}
+++
+++static void cns21xx_gec_phy_powerdown(struct cns21xx_gec *gec)
+++{
+++ u16 phy_data = 0;
+++
+++ cns21xx_gec_read_phy(gec, gec->phy_addr, 0, &phy_data);
+++ phy_data |= (0x1 << 11);
+++ cns21xx_gec_write_phy(gec, gec->phy_addr, 0, phy_data);
+++
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 15);
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG &= ~(0x1 << 15);
+++}
+++
+++static void cns21xx_gec_phy_powerup(struct cns21xx_gec *gec)
+++{
+++ u16 phy_data = 0;
+++
+++ cns21xx_gec_read_phy(gec, gec->phy_addr, 0, &phy_data);
+++ phy_data &= ~(0x1 << 11);
+++ cns21xx_gec_write_phy(gec, gec->phy_addr, 0, phy_data);
+++
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 15);
+++}
+++
+++static void cns21xx_gec_enable(struct cns21xx_gec *gec)
+++{
+++ /* start Rx DMA */
+++ cns21xx_gec_wr(gec, GEC_REG_RX_DMA_CTRL, 1);
+++
+++ cns21xx_gec_phy_powerup(gec);
+++ internal_phy_start_timer(gec);
+++}
+++
+++static void cns21xx_gec_shutdown(struct cns21xx_gec *gec)
+++{
+++ /* stop Rx and Tx DMA */
+++ cns21xx_gec_wr(gec, GEC_REG_RX_DMA_CTRL, 0);
+++ cns21xx_gec_wr(gec, GEC_REG_TX_DMA_CTRL, 0);
+++
+++ internal_phy_stop_timer(gec);
+++}
+++
+++static irqreturn_t cns21xx_gec_receive_isr(int irq, void *dev_id)
+++{
+++ struct cns21xx_gec *gec = dev_id;
+++
+++ if (!test_bit(NAPI_STATE_SCHED, &gec->napi.state)) {
+++ if (likely(napi_schedule_prep(&gec->napi)))
+++ __napi_schedule(&gec->napi);
+++ }
+++
+++ return IRQ_HANDLED;
+++}
+++
+++static int cns21xx_gec_install_receive_isr(struct cns21xx_gec *gec)
+++{
+++ int err;
+++
+++ err = request_irq(gec->rxrc_irq, cns21xx_gec_receive_isr,
+++ IRQF_SHARED, dev_name(&gec->netdev->dev), gec);
+++ if (err)
+++ dev_err(&gec->netdev->dev,
+++ "unable to get IRQ %d (err=%d)\n",
+++ gec->rxrc_irq, err);
+++
+++ return err;
+++}
+++
+++static void cns21xx_gec_uninstall_receive_isr(struct cns21xx_gec *gec)
+++{
+++ free_irq(gec->rxrc_irq, gec);
+++}
+++
+++static irqreturn_t cns21xx_gec_rxqf_isr(int irq, void *dev_id)
+++{
+++ struct cns21xx_gec *gec = dev_id;
+++
+++ /*
+++ * because in normal state, fsql only invoke once
+++ * and set_bit is atomic function, so don't mask it
+++ */
+++ set_bit(0, &gec->rx_queue_full);
+++ if (!test_bit(NAPI_STATE_SCHED, &gec->napi.state)) {
+++ if (likely(napi_schedule_prep(&gec->napi)))
+++ __napi_schedule(&gec->napi);
+++ }
+++
+++ return IRQ_HANDLED;
+++}
+++
+++static int cns21xx_gec_install_rxqf_isr(struct cns21xx_gec *gec)
+++{
+++ int err;
+++
+++ /* QUEUE full interrupt handler */
+++ err = request_irq(gec->rxqf_irq, cns21xx_gec_rxqf_isr,
+++ IRQF_SHARED, dev_name(&gec->netdev->dev), gec);
+++ if (err)
+++ dev_err(&gec->netdev->dev,
+++ "unable to get IRQ %d (err=%d)\n",
+++ gec->rxqf_irq, err);
+++
+++ return err;
+++}
+++
+++static void cns21xx_gec_uninstall_rxqf_isr(struct cns21xx_gec *gec)
+++{
+++ free_irq(gec->rxqf_irq, gec);
+++}
+++
+++static void cns21xx_gec_mib_reset(struct cns21xx_gec *gec)
+++{
+++ unsigned long flags;
+++
+++ local_irq_save(flags);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_RX_OK_PKT_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_RX_OK_BYTE_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_RX_RUNT_BYTE_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_RX_OSIZE_DROP_PKT_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_RX_NO_BUF_DROP_PKT_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_RX_CRC_ERR_PKT_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_RX_ARL_DROP_PKT_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_MYVLANID_MISMATCH_DROP_PKT_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_RX_CHKSUM_ERR_PKT_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_RX_PAUSE_FRAME_PKT_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_TX_OK_PKT_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_TX_OK_BYTE_CNTR);
+++ (void) cns21xx_gec_rr(gec, GEC_REG_TX_PAUSE_FRAME_CNTR);
+++ local_irq_restore(flags);
+++}
+++
+++static void cns21xx_gec_mib_read(struct cns21xx_gec *gec)
+++{
+++ unsigned long flags;
+++
+++ local_irq_save(flags);
+++ gec->mib_info.mib_rx_ok_pkt +=
+++ cns21xx_gec_rr(gec, GEC_REG_RX_OK_PKT_CNTR);
+++ gec->mib_info.mib_rx_ok_byte +=
+++ cns21xx_gec_rr(gec, GEC_REG_RX_OK_BYTE_CNTR);
+++ gec->mib_info.mib_rx_runt +=
+++ cns21xx_gec_rr(gec, GEC_REG_RX_RUNT_BYTE_CNTR);
+++ gec->mib_info.mib_rx_over_size +=
+++ cns21xx_gec_rr(gec, GEC_REG_RX_OSIZE_DROP_PKT_CNTR);
+++ gec->mib_info.mib_rx_no_buffer_drop +=
+++ cns21xx_gec_rr(gec, GEC_REG_RX_NO_BUF_DROP_PKT_CNTR);
+++ gec->mib_info.mib_rx_crc_err +=
+++ cns21xx_gec_rr(gec, GEC_REG_RX_CRC_ERR_PKT_CNTR);
+++ gec->mib_info.mib_rx_arl_drop +=
+++ cns21xx_gec_rr(gec, GEC_REG_RX_ARL_DROP_PKT_CNTR);
+++ gec->mib_info.mib_rx_myvid_drop +=
+++ cns21xx_gec_rr(gec, GEC_REG_MYVLANID_MISMATCH_DROP_PKT_CNTR);
+++ gec->mib_info.mib_rx_csum_err +=
+++ cns21xx_gec_rr(gec, GEC_REG_RX_CHKSUM_ERR_PKT_CNTR);
+++ gec->mib_info.mib_rx_pause_frame +=
+++ cns21xx_gec_rr(gec, GEC_REG_RX_PAUSE_FRAME_PKT_CNTR);
+++ gec->mib_info.mib_tx_ok_pkt +=
+++ cns21xx_gec_rr(gec, GEC_REG_TX_OK_PKT_CNTR);
+++ gec->mib_info.mib_tx_ok_byte +=
+++ cns21xx_gec_rr(gec, GEC_REG_TX_OK_BYTE_CNTR);
+++ gec->mib_info.mib_tx_pause_frame +=
+++ cns21xx_gec_rr(gec, GEC_REG_TX_PAUSE_FRAME_CNTR);
+++ local_irq_restore(flags);
+++}
+++
+++static const char *cns21xx_gec_speed_str(u32 phy_ctrl1)
+++{
+++ switch ((phy_ctrl1 >> 2) & 3) {
+++ case 0:
+++ return "10";
+++ case 1:
+++ return "100";
+++ case 2:
+++ return "1000";
+++ }
+++
+++ return "???";
+++}
+++
+++static irqreturn_t cns21xx_gec_status_isr(int irq, void *dev_id)
+++{
+++ struct cns21xx_gec *gec = dev_id;
+++ u32 int_status;
+++
+++ int_status = cns21xx_gec_rr(gec, GEC_REG_INT);
+++ cns21xx_gec_wr(gec, GEC_REG_INT, int_status);
+++
+++ /* flush write */
+++ (void) cns21xx_gec_rr(gec, GEC_REG_INT);
+++
+++ if (int_status & GEC_INT_MIB_COUNTER_TH)
+++ cns21xx_gec_mib_read(gec);
+++
+++ if (int_status & GEC_INT_PORT_STATUS_CHG) {
+++ u32 phy_ctrl1;
+++
+++ phy_ctrl1 = cns21xx_gec_rr(gec, GEC_REG_PHY_CTRL1);
+++ if (phy_ctrl1 & BIT(0)) {
+++ netif_carrier_on(gec->netdev);
+++ dev_info(&gec->netdev->dev,
+++ "link up (%sMbps/%s duplex)\n",
+++ cns21xx_gec_speed_str(phy_ctrl1),
+++ (phy_ctrl1 & BIT(4)) ? "Full" : "Half");
+++ } else {
+++ netif_carrier_off(gec->netdev);
+++ dev_info(&gec->netdev->dev, "link down\n");
+++ }
+++ }
+++
+++ return IRQ_HANDLED;
+++}
+++
+++static inline void cns21xx_gec_enable_interrupt(struct cns21xx_gec *gec,
+++ u32 mask)
+++{
+++ cns21xx_gec_wr(gec, GEC_REG_INT_MASK,
+++ cns21xx_gec_rr(gec, GEC_REG_INT_MASK) & ~mask);
+++}
+++
+++static int cns21xx_gec_install_status_isr(struct cns21xx_gec *gec)
+++{
+++ int err;
+++
+++ err = request_irq(gec->status_irq, cns21xx_gec_status_isr,
+++ IRQF_DISABLED, dev_name(&gec->netdev->dev), gec);
+++
+++ if (err) {
+++ dev_err(&gec->netdev->dev,
+++ "unable to get IRQ %d (err=%d)\n",
+++ gec->status_irq, err);
+++ return err;
+++ }
+++
+++ cns21xx_gec_enable_interrupt(gec, GEC_INT_MIB_COUNTER_TH |
+++ GEC_INT_PORT_STATUS_CHG);
+++
+++ return 0;
+++}
+++
+++static inline void cns21xx_gec_uninstall_status_isr(struct cns21xx_gec *gec)
+++{
+++ free_irq(gec->status_irq, gec);
+++}
+++
+++static void cns21xx_gec_uninstall_isr(struct cns21xx_gec *gec)
+++{
+++ cns21xx_gec_uninstall_rxqf_isr(gec);
+++ cns21xx_gec_uninstall_status_isr(gec);
+++ cns21xx_gec_uninstall_receive_isr(gec);
+++}
+++
+++static int cns21xx_gec_install_isr(struct cns21xx_gec *gec)
+++{
+++ int err;
+++
+++ /* setup delayed interrupts */
+++ cns21xx_gec_wr(gec, GEC_REG_DLY_INT_CFG,
+++ (1 << 16) |
+++ ((CNS21XX_PEND_INT_COUNT & 0xFF) << 8) |
+++ (CNS21XX_PEND_INT_TIME & 0xFF));
+++
+++ err = cns21xx_gec_install_receive_isr(gec);
+++ if (err)
+++ goto err_out;
+++
+++ err = cns21xx_gec_install_rxqf_isr(gec);
+++ if (err)
+++ goto err_uninstall_receive;
+++
+++ err = cns21xx_gec_install_status_isr(gec);
+++ if (err)
+++ goto err_uninstall_rxqf;
+++
+++ return 0;
+++
+++ err_uninstall_rxqf:
+++ cns21xx_gec_uninstall_rxqf_isr(gec);
+++ err_uninstall_receive:
+++ cns21xx_gec_uninstall_receive_isr(gec);
+++ err_out:
+++ return err;
+++}
+++
+++static int cns21xx_gec_lan_open(struct net_device *dev)
+++{
+++ struct cns21xx_gec *gec = netdev_priv(dev);
+++ int err;
+++
+++ dev_dbg(&gec->netdev->dev, "open\n");
+++
+++#ifdef MODULE
+++ MOD_INC_USE_COUNT;
+++#endif
+++
+++ napi_enable(&gec->napi);
+++ netif_start_queue(dev);
+++ err = cns21xx_gec_install_isr(gec);
+++ if (err)
+++ goto err;
+++
+++ cns21xx_gec_enable(gec);
+++
+++ return 0;
+++
+++ err:
+++ netif_stop_queue(dev);
+++ napi_disable(&gec->napi);
+++ return err;
+++}
+++
+++static void cns21xx_gec_timeout(struct net_device *dev)
+++{
+++ dev_dbg(&dev->dev, "timeout\n");
+++ netif_wake_queue(dev);
+++ dev->trans_start = jiffies;
+++}
+++
+++static int cns21xx_gec_close(struct net_device *dev)
+++{
+++ struct cns21xx_gec *gec = netdev_priv(dev);
+++
+++ cns21xx_gec_phy_powerdown(gec);
+++ cns21xx_gec_uninstall_isr(gec);
+++ napi_disable(&gec->napi);
+++ netif_stop_queue(dev);
+++ cns21xx_gec_shutdown(gec);
+++
+++#ifdef MODULE
+++ MOD_DEC_USE_COUNT;
+++#endif
+++
+++ return 0;
+++}
+++
+++static inline struct sk_buff *cns21xx_gec_alloc_skb(void)
+++{
+++ struct sk_buff *skb;
+++
+++ skb = dev_alloc_skb(MAX_PACKET_LEN + 2);
+++
+++ if (unlikely(!skb))
+++ return NULL;
+++
+++ /* Make buffer alignment 2 beyond a 16 byte boundary
+++ * this will result in a 16 byte aligned IP header after
+++ * the 14 byte MAC header is removed
+++ */
+++ skb_reserve(skb, 2); /* 16 bit alignment */
+++
+++ return skb;
+++}
+++
+++static inline int cns21xx_gec_tx_dma_size(struct cns21xx_gec *gec)
+++{
+++ return gec->txring.count * sizeof(struct cns21xx_gec_txd);
+++}
+++
+++static inline int cns21xx_gec_rx_dma_size(struct cns21xx_gec *gec)
+++{
+++ return gec->rxring.count * sizeof(struct cns21xx_gec_rxd);
+++}
+++
+++static void __init cns21xx_gec_buffer_free(struct cns21xx_gec *gec)
+++{
+++ struct cns21xx_gec_ring *txring = &gec->txring;
+++ struct cns21xx_gec_ring *rxring = &gec->rxring;
+++ int i;
+++
+++ if (rxring->desc_cpu) {
+++ for (i = 0; i < rxring->count; i++) {
+++ if (rxring->skbs[i])
+++ dev_kfree_skb(rxring->skbs[i]);
+++ }
+++
+++ dma_free_coherent(gec->parent, cns21xx_gec_rx_dma_size(gec),
+++ rxring->desc_cpu, rxring->desc_dma);
+++ memset((void *)&rxring, 0, cns21xx_gec_rx_dma_size(gec));
+++ }
+++
+++ if (txring->desc_cpu) {
+++ dma_free_coherent(gec->parent, cns21xx_gec_tx_dma_size(gec),
+++ txring->desc_cpu, txring->desc_dma);
+++ memset((void *)&txring, 0, cns21xx_gec_tx_dma_size(gec));
+++ }
+++
+++ kfree(txring->skbs);
+++ kfree(rxring->skbs);
+++}
+++
+++static int __init cns21xx_gec_buffer_alloc(struct cns21xx_gec *gec)
+++{
+++ struct cns21xx_gec_ring *txring = &gec->txring;
+++ struct cns21xx_gec_ring *rxring = &gec->rxring;
+++ struct cns21xx_gec_rxd *rxd;
+++ struct cns21xx_gec_txd *txd;
+++ struct sk_buff *skb;
+++ int err = -ENOMEM;
+++ int i;
+++
+++ rxring->skbs = kzalloc(rxring->count * sizeof(struct skb *),
+++ GFP_KERNEL);
+++
+++ if (rxring->skbs == NULL) {
+++ dev_err(&gec->netdev->dev,
+++ "%s allocation failed\n", "RX buffer");
+++ goto err_out;
+++ }
+++
+++ txring->skbs = kzalloc(txring->count * sizeof(struct skb *),
+++ GFP_KERNEL);
+++
+++ if (txring->skbs == NULL) {
+++ dev_err(&gec->netdev->dev,
+++ "%s allocation failed\n", "TX buffer");
+++ goto err_out;
+++ }
+++
+++ rxring->desc_cpu = dma_alloc_coherent(gec->parent,
+++ cns21xx_gec_rx_dma_size(gec),
+++ &rxring->desc_dma,
+++ GFP_KERNEL);
+++ if (!rxring->desc_cpu) {
+++ dev_err(&gec->netdev->dev,
+++ "%s allocation failed\n", "RX ring");
+++ goto err_out;
+++ }
+++
+++ txring->desc_cpu = dma_alloc_coherent(gec->parent,
+++ cns21xx_gec_tx_dma_size(gec),
+++ &txring->desc_dma,
+++ GFP_KERNEL);
+++ if (!txring->desc_cpu) {
+++ dev_err(&gec->netdev->dev,
+++ "%s allocation failed\n", "TX ring");
+++ goto err_out;
+++ }
+++
+++ /* Clean RX Memory */
+++ memset((void *)rxring->desc_cpu, 0, cns21xx_gec_rx_dma_size(gec));
+++ dev_dbg(&gec->netdev->dev,
+++ "rxring->desc_cpu=0x%08X rxring->desc_dma=0x%08X\n",
+++ (u32) rxring->desc_cpu,
+++ (u32) rxring->desc_dma);
+++
+++ /* Set cur_index Point to Zero */
+++ rxring->curr = 0;
+++ rxd = rxring->desc_cpu;
+++ for (i = 0; i < rxring->count; i++, rxd++) {
+++ if (i == (rxring->count - 1)) {
+++ /* End bit == 0; */
+++ rxd->eor = 1;
+++ }
+++ skb = cns21xx_gec_alloc_skb();
+++ if (!skb) {
+++ dev_err(&gec->netdev->dev,
+++ "%s allocation failed\n", "skb");
+++ goto err_out;
+++ }
+++
+++ /* Trans Packet from Virtual Memory to Physical Memory */
+++ rxring->skbs[i] = skb;
+++ rxd->sdp = dma_map_single(gec->parent,
+++ skb->data,
+++ MAX_PACKET_LEN,
+++ DMA_TO_DEVICE);
+++ rxd->length = MAX_PACKET_LEN;
+++ }
+++
+++ /* Clear TX Memory */
+++ memset((void *)txring->desc_cpu, 0, cns21xx_gec_tx_dma_size(gec));
+++ dev_dbg(&gec->netdev->dev,
+++ "txring->desc_cpu=0x%08X txring->desc_dma=0x%08X\n",
+++ (u32) txring->desc_cpu,
+++ (u32) txring->desc_dma);
+++
+++ /* Set cur_index Point to Zero */
+++ txring->curr = 0;
+++ txd = txring->desc_cpu;
+++ for (i = 0; i < txring->count; i++, txd++) {
+++ if (i == (txring->count - 1)) {
+++ /* End of Ring ==1 */
+++ txd->eor = 1;
+++ }
+++ /* TX Ring , Cown == 1 */
+++ txd->cown = 1;
+++
+++#ifdef CNS21XX_GEC_TX_HW_CHECKSUM
+++ /* Enable Checksum */
+++ txd->ico = 1;
+++ txd->uco = 1;
+++ txd->tco = 1;
+++#else
+++ txd->ico = 0;
+++ txd->uco = 0;
+++ txd->tco = 0;
+++#endif
+++ /* clear txring->skbs */
+++ txring->skbs[i] = NULL;
+++ }
+++
+++ return 0;
+++
+++err_out:
+++ cns21xx_gec_buffer_free(gec);
+++ return err;
+++}
+++
+++static int cns21xx_gec_get_rfd_buff(struct cns21xx_gec *gec, int index)
+++{
+++ struct cns21xx_gec_ring *rxring = &gec->rxring;
+++ struct cns21xx_gec_rxd *rxd;
+++ struct sk_buff *skb;
+++ unsigned char *data;
+++ int len;
+++
+++ /* TODO: get rxdesc ptr */
+++ rxd = ((struct cns21xx_gec_rxd *) rxring->desc_cpu) + index;
+++ skb = rxring->skbs[index];
+++
+++ len = rxd->length;
+++
+++ dma_unmap_single(gec->parent, rxd->sdp, len,
+++ DMA_FROM_DEVICE);
+++
+++ data = skb_put(skb, len);
+++
+++ skb->dev = gec->netdev;
+++
+++#ifdef CNS21XX_GEC_RX_HW_CHECKSUM
+++ if (rxd->ipf == 1 || rxd->l4f == 1) {
+++ if (rxd->prot != 0x11) {
+++ skb->ip_summed = CHECKSUM_NONE;
+++ } else {
+++ /* CheckSum Fail */
+++ skb->dev->stats.rx_errors++;
+++ goto freepacket;
+++ }
+++ } else {
+++ skb->ip_summed = CHECKSUM_UNNECESSARY;
+++ }
+++#else
+++ skb->ip_summed = CHECKSUM_NONE;
+++#endif
+++
+++ /* this line must, if no, packet will not send to network layer */
+++ skb->protocol = eth_type_trans(skb, skb->dev);
+++
+++ skb->dev->stats.rx_packets++;
+++ skb->dev->stats.rx_bytes += len;
+++ skb->dev->last_rx = jiffies;
+++
+++ /* if netif_rx any package, will let this driver core dump. */
+++ netif_receive_skb(skb);
+++
+++ return 0;
+++
+++freepacket:
+++ dev_kfree_skb_any(skb);
+++ return 0;
+++}
+++
+++static void cns21xx_gec_receive_packet(struct cns21xx_gec *gec,
+++ int mode, int *work_done, int work_to_do)
+++{
+++ struct cns21xx_gec_ring *rxring = &gec->rxring;
+++ int rxsd_index;
+++ u32 rxsd_current;
+++ struct cns21xx_gec_rxd *rxd;
+++ struct sk_buff *skb;
+++ int i, rxcount = 0;
+++
+++ rxd = ((struct cns21xx_gec_rxd *) rxring->desc_cpu) + rxring->curr;
+++ rxsd_current = cns21xx_gec_rr(gec, GEC_REG_RX_DPTR);
+++ rxsd_index = (rxsd_current - (u32)rxring->desc_dma) >> 4;
+++
+++ if (rxsd_index > rxring->curr) {
+++ rxcount = rxsd_index - rxring->curr;
+++ } else if (rxsd_index < rxring->curr) {
+++ rxcount = (rxring->count - rxring->curr) +
+++ rxsd_index;
+++ } else {
+++ if (rxd->cown == 0) {
+++ goto receive_packet_exit;
+++ } else {
+++ /* Queue Full */
+++ rxcount = rxring->count;
+++ }
+++ }
+++
+++ for (i = 0; i < rxcount; i++) {
+++ if (*work_done >= work_to_do)
+++ break;
+++
+++ ++(*work_done);
+++
+++ if (rxd->cown != 0) {
+++ /* Alloc New skb_buff */
+++ skb = cns21xx_gec_alloc_skb();
+++
+++ /* Check skb_buff */
+++ if (skb != NULL) {
+++ cns21xx_gec_get_rfd_buff(gec, rxring->curr);
+++ rxring->skbs[rxring->curr] = skb;
+++ rxd->sdp =
+++ dma_map_single(gec->parent,
+++ skb->data,
+++ MAX_PACKET_LEN,
+++ DMA_TO_DEVICE);
+++ rxd->length = MAX_PACKET_LEN;
+++
+++ /* set cbit to 0 for CPU Transfer */
+++ rxd->cown = 0;
+++ } else {
+++ /*
+++ * TODO: I will add dev->lp.stats->rx_dropped,
+++ * it will effect the performance
+++ */
+++ dev_warn(&gec->netdev->dev,
+++ "skb allocation failed, reuse the buffer\n");
+++
+++ /* set cbit to 0 for CPU Transfer */
+++ rxd->cown = 0;
+++ return;
+++ }
+++ } else {
+++#if 0
+++ dev_err(&gec->netdev->dev, "encounter COWN == 0 BUG\n");
+++#endif
+++ }
+++
+++ if (rxring->curr == (rxring->count - 1)) {
+++ rxring->curr = 0;
+++ rxd = rxring->desc_cpu;
+++ } else {
+++ rxring->curr++;
+++ rxd++;
+++ }
+++ }
+++
+++ receive_packet_exit:
+++ return;
+++}
+++
+++static int cns21xx_gec_poll(struct napi_struct *napi, int budget)
+++{
+++ struct cns21xx_gec *gec;
+++ int work_done = 0;
+++ int work_to_do = budget;
+++
+++ gec = container_of(napi, struct cns21xx_gec, napi);
+++ cns21xx_gec_receive_packet(gec, 0, &work_done, work_to_do);
+++
+++ budget -= work_done;
+++
+++ /* if no Tx and not enough Rx work done, exit the polling mode */
+++ if (work_done) {
+++ if (test_bit(0, &gec->rx_queue_full) == 1) {
+++ /* queue full */
+++ clear_bit(0, &gec->rx_queue_full);
+++ /* start Rx DMA */
+++ cns21xx_gec_wr(gec, GEC_REG_RX_DMA_CTRL, 1);
+++ return 1;
+++ }
+++ } else {
+++ napi_complete(&gec->napi);
+++#ifdef CONFIG_STAR_NIC_NAPI_MASK_IRQ
+++ enable_irq(gec->rxrc_irq);
+++#endif
+++ return 0;
+++ }
+++
+++ return work_done;
+++}
+++
+++static int cns21xx_gec_send_packet(struct sk_buff *skb, struct net_device *dev)
+++{
+++ struct cns21xx_gec *gec = netdev_priv(dev);
+++ struct cns21xx_gec_txd *txd;
+++ struct cns21xx_gec_ring *txring = &gec->txring;
+++ struct sk_buff *skb_free = NULL;
+++ unsigned long flags;
+++ unsigned int len;
+++
+++ if (skb_padto(skb, ETH_ZLEN))
+++ return NETDEV_TX_OK;
+++
+++ len = max_t(unsigned int, skb->len, ETH_ZLEN);
+++
+++ spin_lock_irqsave(&gec->tx_lock, flags);
+++
+++ txd = ((struct cns21xx_gec_txd *) txring->desc_cpu) + txring->curr;
+++ if (txd->cown == 0) {
+++ /* This TFD is busy */
+++ spin_unlock_irqrestore(&gec->tx_lock, flags);
+++ /* re-queue the skb */
+++ return NETDEV_TX_BUSY;
+++ }
+++
+++ if (txd->sdp != 0) {
+++ /* MUST TODO: Free skbuff */
+++ skb_free = txring->skbs[txring->curr];
+++
+++ dma_unmap_single(gec->parent,
+++ txd->sdp,
+++ txd->length,
+++ DMA_TO_DEVICE);
+++ txring->dirty = txring->curr + 1;
+++ if (txring->dirty == txring->count)
+++ txring->dirty = 0;
+++ }
+++
+++#ifdef CNS21XX_GEC_TX_HW_CHECKSUM
+++ if (skb->protocol == __constant_htons(ETH_P_IP)) {
+++ if (ip_hdr(skb)->protocol == IPPROTO_UDP) {
+++ txd->uco = 1;
+++ txd->tco = 0;
+++ } else if (ip_hdr(skb)->protocol == IPPROTO_TCP) {
+++ txd->uco = 0;
+++ txd->tco = 1;
+++ } else {
+++ txd->uco = 0;
+++ txd->tco = 0;
+++ }
+++ } else {
+++ txd->ico = 0;
+++ txd->uco = 0;
+++ txd->tco = 0;
+++ }
+++#endif /* CNS21XX_GEC_TX_HW_CHECKSUM */
+++
+++ txring->skbs[txring->curr] = skb;
+++
+++ txd->length = len;
+++ txd->sdp = dma_map_single(gec->parent, skb->data, len,
+++ DMA_TO_DEVICE);
+++
+++ txd->fs = 1;
+++ txd->ls = 1;
+++
+++ /* Wake interrupt */
+++ txd->intr = 0;
+++ txd->cown = 0;
+++
+++ mb();
+++
+++ /* Start Tx DMA */
+++ cns21xx_gec_wr(gec, GEC_REG_TX_DMA_CTRL, 1);
+++
+++ dev->stats.tx_packets++;
+++ dev->stats.tx_bytes += skb->len;
+++ dev->trans_start = jiffies;
+++
+++ txring->curr++;
+++ if (txring->curr == txring->count)
+++ txring->curr = 0;
+++
+++ spin_unlock_irqrestore(&gec->tx_lock, flags);
+++
+++ if (skb_free)
+++ dev_kfree_skb(skb_free);
+++
+++ cns21xx_gec_timer_modify(gec, 10);
+++
+++ return NETDEV_TX_OK;
+++}
+++
+++static void cns21xx_gec_set_mac_addr(struct cns21xx_gec *gec,
+++ const char *mac_addr)
+++{
+++ cns21xx_gec_wr(gec, GEC_REG_MY_MAC_H,
+++ (mac_addr[0] << 8) | mac_addr[1]);
+++
+++ cns21xx_gec_wr(gec, GEC_REG_MY_MAC_L,
+++ (mac_addr[2] << 24) | (mac_addr[3] << 16) |
+++ (mac_addr[4] << 8) | mac_addr[5]);
+++
+++ dev_dbg(&gec->netdev->dev, "MAC address: %pM", mac_addr);
+++}
+++
+++static int cns21xx_gec_set_lan_mac_addr(struct net_device *dev, void *addr)
+++{
+++ struct sockaddr *sock_addr = addr;
+++ struct cns21xx_gec *gec = netdev_priv(dev);
+++
+++ spin_lock_irq(&gec->lock);
+++ memcpy(dev->dev_addr, sock_addr->sa_data, 6);
+++ cns21xx_gec_set_mac_addr(gec, sock_addr->sa_data);
+++ spin_unlock_irq(&gec->lock);
+++
+++ return 0;
+++}
+++
+++static int __init cns21xx_gec_setup(struct cns21xx_gec *gec)
+++{
+++ int err;
+++
+++ /* set high */
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 15);
+++ /* set low */
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG &= ~(0x1 << 15);
+++ /* set high */
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 15);
+++ /* set NIC clock to 67.5MHz */
+++ PWRMGT_SYSTEM_CLOCK_CONTROL_REG |= (0x1 << 7);
+++
+++ /* enable NIC clock */
+++ HAL_PWRMGT_ENABLE_NIC_CLOCK();
+++#if 0
+++ cns21xx_gec_wr(gec, GEC_REG_MAC_CFG, 0x00527C00);
+++#endif
+++ udelay(100);
+++
+++ /* Configure GPIO for NIC MDC/MDIO pins */
+++ HAL_MISC_ENABLE_MDC_MDIO_PINS();
+++ HAL_MISC_ENABLE_NIC_COL_PINS();
+++
+++#if 0
+++ MISC_GPIOA_PIN_ENABLE_REG |= (0x7 << 22);
+++ MISC_FAST_ETHERNET_PHY_CONFIG_REG |= (FE_PHY_LED_MODE >> 12) & 0x3;
+++
+++ /* set high */
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 15);
+++ /* set low */
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG &= ~(0x1 << 15);
+++ /* set high */
+++ PWRMGT_SOFTWARE_RESET_CONTROL_REG |= (0x1 << 15);
+++#endif
+++
+++ /* disable all interrupt status sources */
+++ cns21xx_gec_wr(gec, GEC_REG_INT_MASK, ~(0));
+++ /* clear pending interrupts */
+++ cns21xx_gec_wr(gec, GEC_REG_INT, ~(0));
+++
+++ /* stop Rx and Tx DMA */
+++ cns21xx_gec_wr(gec, GEC_REG_TX_DMA_CTRL, 0);
+++ cns21xx_gec_wr(gec, GEC_REG_RX_DMA_CTRL, 0);
+++
+++ gec->txring.count = CNS21XX_GEC_NUM_TXDS;
+++ gec->rxring.count = CNS21XX_GEC_NUM_RXDS;
+++ err = cns21xx_gec_buffer_alloc(gec);
+++ if (err)
+++ return err;
+++
+++ cns21xx_gec_mac_config(gec);
+++ cns21xx_gec_fc_config(gec);
+++
+++ err = cns21xx_gec_phy_config(gec);
+++ if (err) {
+++ cns21xx_gec_buffer_free(gec);
+++ return err;
+++ }
+++
+++ cns21xx_gec_vlan_config(gec);
+++ cns21xx_gec_arl_config(gec);
+++ cns21xx_gec_set_mac_addr(gec, gec->netdev->dev_addr);
+++ cns21xx_gec_mib_reset(gec);
+++
+++ MISC_DEBUG_PROBE_SELECTION_REG = 0x00000125; /* 0x00000105 pb0_nic */
+++
+++ cns21xx_gec_wr(gec, GEC_REG_TX_DPTR, gec->txring.desc_dma);
+++ cns21xx_gec_wr(gec, GEC_REG_TX_BASE_ADDR, gec->txring.desc_dma);
+++ cns21xx_gec_wr(gec, GEC_REG_RX_DPTR, gec->rxring.desc_dma);
+++ cns21xx_gec_wr(gec, GEC_REG_RX_BASE_ADDR, gec->rxring.desc_dma);
+++
+++ cns21xx_gec_dma_config(gec);
+++ internal_phy_init_timer(gec);
+++ cns21xx_gec_timer_init(gec);
+++
+++ return 0;
+++}
+++
+++static const struct net_device_ops cns21xx_gec_netdev_ops = {
+++ .ndo_open = cns21xx_gec_lan_open,
+++ .ndo_stop = cns21xx_gec_close,
+++ .ndo_start_xmit = cns21xx_gec_send_packet,
+++ .ndo_set_mac_address = cns21xx_gec_set_lan_mac_addr,
+++ .ndo_tx_timeout = cns21xx_gec_timeout,
+++ .ndo_validate_addr = eth_validate_addr,
+++ .ndo_change_mtu = eth_change_mtu,
+++};
+++
+++static int __init cns21xx_gec_probe(struct platform_device *pdev)
+++{
+++ struct net_device *netdev;
+++ struct cns21xx_gec *gec;
+++ struct cns21xx_gec_plat_data *pdata;
+++ int err;
+++
+++ pdata = pdev->dev.platform_data;
+++ if (!pdata) {
+++ dev_dbg(&pdev->dev, "no platform data\n");
+++ err = -EINVAL;
+++ goto err_out;
+++ }
+++
+++ if (!pdata->mac_addr) {
+++ dev_dbg(&pdev->dev, "no mac address\n");
+++ err = -EINVAL;
+++ goto err_out;
+++ }
+++
+++ netdev = alloc_etherdev(sizeof(struct cns21xx_gec));
+++ if (!netdev) {
+++ err = -ENOMEM;
+++ goto err_out;
+++ }
+++
+++ SET_NETDEV_DEV(netdev, &pdev->dev);
+++
+++ gec = netdev_priv(netdev);
+++ gec->pdata = pdata;
+++ gec->parent = &pdev->dev;
+++
+++ gec->mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+++ if (!gec->mem_res) {
+++ dev_dbg(&pdev->dev, "no iomem resource\n");
+++ err = -EINVAL;
+++ goto err_free_netdev;
+++ }
+++
+++ gec->status_irq = platform_get_irq_byname(pdev,
+++ CNS21XX_GEC_STATUS_IRQ_NAME);
+++ if (gec->status_irq < 0) {
+++ dev_dbg(&pdev->dev, "%s irq not specified\n",
+++ CNS21XX_GEC_STATUS_IRQ_NAME);
+++ err = -EINVAL;
+++ goto err_free_netdev;
+++ }
+++
+++ gec->rxrc_irq = platform_get_irq_byname(pdev,
+++ CNS21XX_GEC_RXRC_IRQ_NAME);
+++ if (gec->rxrc_irq < 0) {
+++ dev_dbg(&pdev->dev, "%s irq not specified\n",
+++ CNS21XX_GEC_RXRC_IRQ_NAME);
+++ err = -EINVAL;
+++ goto err_free_netdev;
+++ }
+++
+++ gec->rxqf_irq = platform_get_irq_byname(pdev,
+++ CNS21XX_GEC_RXQF_IRQ_NAME);
+++ if (gec->rxqf_irq < 0) {
+++ dev_dbg(&pdev->dev, "%s irq not specified\n",
+++ CNS21XX_GEC_RXQF_IRQ_NAME);
+++ err = -EINVAL;
+++ goto err_free_netdev;
+++ }
+++
+++ gec->txtc_irq = platform_get_irq_byname(pdev,
+++ CNS21XX_GEC_TXTC_IRQ_NAME);
+++ if (gec->txtc_irq < 0) {
+++ dev_dbg(&pdev->dev, "%s irq not specified\n",
+++ CNS21XX_GEC_TXTC_IRQ_NAME);
+++ err = -EINVAL;
+++ goto err_free_netdev;
+++ }
+++
+++ gec->txqe_irq = platform_get_irq_byname(pdev,
+++ CNS21XX_GEC_TXQE_IRQ_NAME);
+++ if (gec->txqe_irq < 0) {
+++ dev_dbg(&pdev->dev, "%s irq not specified\n",
+++ CNS21XX_GEC_TXQE_IRQ_NAME);
+++ err = -EINVAL;
+++ goto err_free_netdev;
+++ }
+++
+++ if (!request_mem_region(gec->mem_res->start,
+++ resource_size(gec->mem_res), pdev->name)) {
+++ dev_err(&pdev->dev, "unable to request mem region\n");
+++ err = -EBUSY;
+++ goto err_free_netdev;
+++ }
+++
+++ gec->base = ioremap(gec->mem_res->start, resource_size(gec->mem_res));
+++ if (!gec->base) {
+++ dev_err(&pdev->dev, "ioremap failed \n");
+++ err = -ENXIO;
+++ goto err_release_mem;
+++ }
+++
+++ platform_set_drvdata(pdev, netdev);
+++
+++ spin_lock_init(&gec->lock);
+++ spin_lock_init(&gec->tx_lock);
+++
+++ netdev->base_addr = gec->mem_res->start;
+++ netdev->netdev_ops = &cns21xx_gec_netdev_ops;
+++#if defined(CNS21XX_GEC_TX_HW_CHECKSUM)
+++ netdev->features = NETIF_F_IP_CSUM;
+++#endif
+++ memcpy(netdev->dev_addr, pdata->mac_addr, 6);
+++ netif_napi_add(netdev, &gec->napi, cns21xx_gec_poll, 64);
+++
+++ gec->netdev = netdev;
+++ err = register_netdev(netdev);
+++ if (err)
+++ goto err_unmap;
+++
+++ err = cns21xx_gec_setup(gec);
+++ if (err)
+++ goto err_unregister_netdev;
+++
+++ return 0;
+++
+++ err_unregister_netdev:
+++ unregister_netdev(netdev);
+++ err_unmap:
+++ platform_set_drvdata(pdev, NULL);
+++ iounmap(gec->base);
+++ err_release_mem:
+++ release_mem_region(gec->mem_res->start, resource_size(gec->mem_res));
+++ err_free_netdev:
+++ free_netdev(netdev);
+++ err_out:
+++ return err;
+++}
+++
+++static int cns21xx_gec_remove(struct platform_device *pdev)
+++{
+++ struct net_device *netdev = platform_get_drvdata(pdev);
+++ struct cns21xx_gec *gec = netdev_priv(netdev);
+++
+++ unregister_netdev(netdev);
+++ platform_set_drvdata(pdev, NULL);
+++ iounmap(gec->base);
+++ release_mem_region(gec->mem_res->start, resource_size(gec->mem_res));
+++ free_netdev(netdev);
+++
+++ return 0;
+++}
+++
+++static struct platform_driver cns21xx_gec_driver = {
+++ .remove = cns21xx_gec_remove,
+++ .driver = {
+++ .name = "cns21xx-gec",
+++ .owner = THIS_MODULE,
+++ }
+++};
+++
+++static int __init cns21xx_gec_init(void)
+++{
+++ return platform_driver_probe(&cns21xx_gec_driver, cns21xx_gec_probe);
+++}
+++
+++static void __exit cns21xx_gec_exit(void)
+++{
+++ platform_driver_unregister(&cns21xx_gec_driver);
+++}
+++
+++module_init(cns21xx_gec_init);
+++module_exit(cns21xx_gec_exit);
+++
+++#define INTERNAL_PHY_PATCH_CHECKCNT 16
+++#define INTERNAL_PHY_PATCH_CHECK_PERIOD 1000 /* ms */
+++
+++static void (*phy_statemachine)(struct cns21xx_gec*, int, int, int);
+++
+++#define ETH3220_PHY_MON_PERIOD INTERNAL_PHY_PATCH_CHECK_PERIOD
+++
+++/* phy monitor state */
+++#define NUM_PHY 1
+++#define PHY_STATE_INIT 0
+++#define LINK_DOWN_POSITIVE 1
+++#define WAIT_LINK_UP_POSITIVE 2
+++#define LINK_UP_POSITIVE 3
+++#define WAIT_BYPASS_LINK_UP_POSITIVE 4
+++#define BYPASS_AND_LINK_UP_POSITIVE 5
+++#define LINK_UP_8101_POSITIVE 6
+++#define WAIT_8101_LINK_UP_POSITIVE 7
+++
+++#define PHY_STATE_LAST (WAIT_8101_LINK_UP_POSITIVE+1)
+++
+++/* time setting */
+++#define WAIT_BYPASS_LINK_UP_POSITIVE_TIMEOUT 5000 /* 5000 ms */
+++#define WAIT_BYPASS_LINK_UP_NEGATIVE_TIMEOUT 5000 /* 5000 ms */
+++#define LINK_DOWN_ABILITY_DETECT_TIMEOUT 5000 /* 5000 ms */
+++#define DETECT_8101_PERIOD 7000 /* 7000 ms */
+++#define WAIT_8101_LINK_UP_TIMEOUT 3000 /* 3000 ms */
+++
+++#define MAX_PHY_PORT 1
+++#define DEFAULT_AGC_TRAIN 16
+++#define MAX_AGC_TRAIN 16 /* train 16 times */
+++static int agc_train_num = DEFAULT_AGC_TRAIN;
+++u32 port_displaybuf[NUM_PHY][MAX_AGC_TRAIN + 1] = {
+++ {0}
+++};
+++
+++static int cuv[3][3] = {
+++ {1, 1, 4},
+++ {1, 1, 0},
+++ {1, 1, -4}
+++};
+++
+++static u32 link_status_old;
+++
+++struct eth3220_phy {
+++ u16 state;
+++ u16 linkdown_cnt;
+++ u32 state_time;
+++ u32 timer;
+++};
+++
+++#define DEBUG_PHY_STATE_TRANSITION 1
+++#if DEBUG_PHY_STATE_TRANSITION
+++/*
+++ * show state transition of debug phy port.
+++ * -1 for all ports
+++ * -2 for disable all ports
+++ * 0 - 4 for each port
+++ */
+++static int debug_phy_port = -2;
+++static char *phystate_name[] = {
+++ "init", /* PHY_STATE_INIT */
+++ "ldp", /* LINK_DOWN_POSITIVE */
+++ "wait_lup", /* WAIT_LINK_UP_POSITIVE */
+++ "lup", /* LINK_UP_POSITIVE */
+++ "wait_bp_lup", /* WAIT_BYPASS_LINK_UP_POSITIVE */
+++ "bp_lup", /* BYPASS_AND_LINK_UP_POSITIVE */
+++ "8101_lup", /* LINK_UP_8101_POSITIVE */
+++ "wait_8101_lup", /* WAIT_8101_LINK_UP_POSITIVE */
+++ "err",
+++};
+++#endif /* DEBUG_PHY_STATE_TRANSITION */
+++
+++static struct eth3220_phy phy[5] = {
+++ {PHY_STATE_INIT, 0, 0, 0},
+++ {PHY_STATE_INIT, 0, 0, 0},
+++ {PHY_STATE_INIT, 0, 0, 0},
+++ {PHY_STATE_INIT, 0, 0, 0},
+++ {PHY_STATE_INIT, 0, 0, 0}
+++};
+++
+++static u16 long_cable_global_reg[32] = {
+++ 0x0000, 0x19a0, 0x1d00, 0x0e80,
+++ 0x0f60, 0x07c0, 0x07e0, 0x03e0,
+++ 0x0000, 0x0000, 0x0000, 0x2000,
+++ 0x8250, 0x1700, 0x0000, 0x0000,
+++ 0x0000, 0x0000, 0x0000, 0x0000,
+++ 0x0000, 0x204b, 0x01c2, 0x0000,
+++ 0x0000, 0x0000, 0x0fff, 0x4100,
+++ 0x9319, 0x0021, 0x0034, 0x270a | FE_PHY_LED_MODE
+++};
+++
+++static u16 long_cable_local_reg[32] = {
+++ 0x3100, 0x786d, 0x01c1, 0xca51,
+++ 0x05e1, 0x45e1, 0x0003, 0x001c,
+++ 0x2000, 0x9828, 0xf3c4, 0x400c,
+++ 0xf8ff, 0x6940, 0xb906, 0x503c,
+++ 0x8000, 0x297a, 0x1010, 0x5010,
+++ 0x6ae1, 0x7c73, 0x783c, 0xfbdf,
+++ 0x2080, 0x3244, 0x1301, 0x1a80,
+++ 0x8e8f, 0x8000, 0x9c29, 0xa70a | FE_PHY_LED_MODE
+++};
+++
+++/*=============================================================*
+++ * eth3220ac_rt8101_phy_setting
+++ *=============================================================*/
+++static void eth3220ac_rt8101_phy_setting(struct cns21xx_gec *gec, int port)
+++{
+++ cns21xx_gec_write_phy(gec, port, 12, 0x18ff);
+++ cns21xx_gec_write_phy(gec, port, 18, 0x6400);
+++}
+++
+++static void eth3220ac_release_bpf(struct cns21xx_gec *gec, int port)
+++{
+++ cns21xx_gec_write_phy(gec, port, 18, 0x6210);
+++}
+++
+++static void eth3220ac_def_bpf(struct cns21xx_gec *gec, int port)
+++{
+++ cns21xx_gec_write_phy(gec, port, 18, 0x6bff);
+++}
+++
+++static void eth3220ac_def_linkdown_setting(struct cns21xx_gec *gec, int port)
+++{
+++ cns21xx_gec_write_phy(gec, port, 13, 0xe901);
+++ cns21xx_gec_write_phy(gec, port, 14, 0xa3c6);
+++}
+++
+++static void eth3220ac_def_linkup_setting(struct cns21xx_gec *gec, int port)
+++{
+++ cns21xx_gec_write_phy(gec, port, 13, 0x6901);
+++ cns21xx_gec_write_phy(gec, port, 14, 0xa286);
+++}
+++
+++/*=============================================================*
+++ * eth3220ac_link_agc:
+++ *=============================================================*/
+++static int eth3220ac_link_agc(struct cns21xx_gec *gec, int port, int speed)
+++{
+++ u16 reg;
+++ u32 agc_data = 0;
+++ u32 short_cable;
+++ int i, jj;
+++
+++ /* if speed = 100MHz, then continue */
+++ if (speed == 0)
+++ return 0;
+++
+++ short_cable = 0;
+++ jj = 0;
+++ for (i = 0; i < agc_train_num; i++) {
+++ cns21xx_gec_read_phy(gec, port, 15, &reg);
+++ reg &= 0x7f;
+++ if (reg <= 0x12) {
+++ short_cable = 1;
+++ jj++;
+++ agc_data += (u32)reg;
+++ }
+++ }
+++
+++ if (short_cable)
+++ agc_data = (agc_data / jj) + 4;
+++ else
+++ agc_data = (cuv[2][0] * agc_data) / cuv[2][1] /
+++ agc_train_num - 4;
+++
+++ /* Fix AGC */
+++ agc_data = 0xd0 | (agc_data << 9);
+++ cns21xx_gec_write_phy(gec, port, 15, agc_data);
+++ udelay(1000);
+++ cns21xx_gec_read_phy(gec, port, 15, &reg);
+++ reg &= ~(0x1 << 7);
+++ cns21xx_gec_write_phy(gec, port, 15, reg);
+++
+++ return 0;
+++}
+++
+++/*=============================================================*
+++ * eth3220ac_unlink_agc:
+++ *=============================================================*/
+++static void eth3220ac_unlink_agc(struct cns21xx_gec *gec, int port)
+++{
+++ /* start AGC adaptive */
+++ cns21xx_gec_write_phy(gec, port, 15, 0xa050);
+++}
+++
+++/*=============================================================*
+++ * eth3220ac_rt8100_check
+++ *=============================================================*/
+++static int eth3220ac_rt8100_check(struct cns21xx_gec *gec, int port)
+++{
+++ u16 reg, reg2;
+++
+++ /* Read reg27 (error register) */
+++ cns21xx_gec_read_phy(gec, port, 27, &reg);
+++ /* if error exists, set Bypass Filter enable */
+++ if ((reg & 0xfffc)) {
+++ cns21xx_gec_read_phy(gec, port, 15, &reg);
+++ cns21xx_gec_read_phy(gec, port, 27, &reg2);
+++ if ((reg2 & 0xfffc) && (((reg >> 9) & 0xff) < 0x1c)) {
+++ dev_err(&gec->netdev->dev, "8100 pos err\n");
+++
+++ /* Bypass agcgain disable */
+++ cns21xx_gec_write_phy(gec, port, 15, (reg & (~(0x1 << 7))));
+++
+++ /* repeat counts when reaching threshold error */
+++ cns21xx_gec_write_phy(gec, port, 13, 0x4940);
+++
+++ /*
+++ * Speed up AN speed and compensate threshold
+++ * phase error
+++ */
+++ cns21xx_gec_write_phy(gec, port, 14, 0xa306);
+++
+++ /* Bypass Filter enable */
+++ cns21xx_gec_read_phy(gec, port, 18, &reg2);
+++
+++ cns21xx_gec_write_phy(gec, port, 18, (reg | 0x400));
+++
+++ /* restart AN */
+++ cns21xx_gec_write_phy(gec, port, 0, 0x3300);
+++ return 1;
+++ }
+++ }
+++ return 0;
+++}
+++
+++
+++/*=============================================================*
+++ * eth3220ac_rt8100_linkdown
+++ *=============================================================*/
+++static void eth3220ac_rt8100_linkdown(struct cns21xx_gec *gec, int port)
+++{
+++ u16 reg;
+++
+++ /* Bypass Filter disable */
+++ cns21xx_gec_read_phy(gec, port, 18, &reg);
+++ cns21xx_gec_write_phy(gec, port, 18, (reg & (~(0x1 << 10))));
+++ eth3220ac_def_linkdown_setting(gec, port);
+++}
+++
+++static void eth3220ac_normal_phy_setting(struct cns21xx_gec *gec, int port)
+++{
+++ cns21xx_gec_write_phy(gec, port, 12, 0xd8ff);
+++ eth3220ac_def_bpf(gec, port);
+++}
+++
+++/*=============================================================*
+++ * wp3220ac_phystate
+++ *=============================================================*/
+++static void wp3220ac_phystate(struct cns21xx_gec *gec, int port, int link, int speed)
+++{
+++ int next_state;
+++ u16 reg, reg2;
+++
+++ phy[port].timer += ETH3220_PHY_MON_PERIOD;
+++
+++ if (link) {
+++ /* Link up state */
+++ switch (phy[port].state) {
+++ case LINK_UP_POSITIVE:
+++ next_state = eth3220ac_rt8100_check(gec, port) ?
+++ WAIT_BYPASS_LINK_UP_POSITIVE :
+++ LINK_UP_POSITIVE;
+++ break;
+++
+++ case PHY_STATE_INIT:
+++ case WAIT_LINK_UP_POSITIVE:
+++ case LINK_DOWN_POSITIVE:
+++ next_state = LINK_UP_POSITIVE;
+++ eth3220ac_def_linkup_setting(gec, port);
+++ eth3220ac_link_agc(gec, port, speed);
+++ eth3220ac_release_bpf(gec, port);
+++ break;
+++
+++ case WAIT_BYPASS_LINK_UP_POSITIVE:
+++ case BYPASS_AND_LINK_UP_POSITIVE:
+++ next_state = BYPASS_AND_LINK_UP_POSITIVE;
+++ break;
+++
+++ case WAIT_8101_LINK_UP_POSITIVE:
+++ next_state = LINK_UP_8101_POSITIVE;
+++ eth3220ac_link_agc(gec, port, speed);
+++ cns21xx_gec_write_phy(gec, port, 12, 0x98ff);
+++ break;
+++
+++ case LINK_UP_8101_POSITIVE:
+++ next_state = LINK_UP_8101_POSITIVE;
+++ break;
+++
+++ default:
+++ next_state = LINK_UP_POSITIVE;
+++ eth3220ac_def_linkup_setting(gec, port);
+++ eth3220ac_link_agc(gec, port, speed);
+++ }
+++ } else {
+++ /* Link down state */
+++ switch (phy[port].state) {
+++ case LINK_DOWN_POSITIVE:
+++ cns21xx_gec_read_phy(gec, port, 5, &reg);
+++ cns21xx_gec_read_phy(gec, port, 28, &reg2);
+++
+++ /* AN Link Partner Ability Register or NLP */
+++ if (reg || (reg2 & 0x100))
+++ next_state = WAIT_LINK_UP_POSITIVE;
+++ else
+++ next_state = LINK_DOWN_POSITIVE;
+++ break;
+++
+++ case WAIT_LINK_UP_POSITIVE:
+++ if (phy[port].state_time >
+++ LINK_DOWN_ABILITY_DETECT_TIMEOUT)
+++ next_state = LINK_DOWN_POSITIVE;
+++ else
+++ next_state = WAIT_LINK_UP_POSITIVE;
+++ break;
+++
+++ case WAIT_BYPASS_LINK_UP_POSITIVE:
+++ /* set timeout = 5 sec */
+++ if (phy[port].state_time >
+++ WAIT_BYPASS_LINK_UP_POSITIVE_TIMEOUT) {
+++ next_state = LINK_DOWN_POSITIVE;
+++
+++ /* Bypass Filter disable */
+++ eth3220ac_rt8100_linkdown(gec, port);
+++ eth3220ac_def_bpf(gec, port);
+++ } else {
+++ next_state = WAIT_BYPASS_LINK_UP_POSITIVE;
+++ }
+++ break;
+++
+++ case BYPASS_AND_LINK_UP_POSITIVE:
+++ next_state = LINK_DOWN_POSITIVE;
+++ eth3220ac_rt8100_linkdown(gec, port);
+++ eth3220ac_def_bpf(gec, port);
+++ break;
+++
+++ case WAIT_8101_LINK_UP_POSITIVE:
+++ if (phy[port].state_time > WAIT_8101_LINK_UP_TIMEOUT) {
+++ next_state = LINK_DOWN_POSITIVE;
+++ eth3220ac_normal_phy_setting(gec, port);
+++ eth3220ac_def_linkdown_setting(gec, port);
+++ } else {
+++ next_state = WAIT_8101_LINK_UP_POSITIVE;
+++ }
+++ break;
+++
+++ case LINK_UP_POSITIVE:
+++ eth3220ac_unlink_agc(gec, port);
+++ eth3220ac_def_linkdown_setting(gec, port);
+++ eth3220ac_def_bpf(gec, port);
+++ if (phy[port].timer > DETECT_8101_PERIOD) {
+++ next_state = LINK_DOWN_POSITIVE;
+++ phy[port].timer = 0;
+++ phy[port].linkdown_cnt = 1;
+++ } else {
+++ if (++phy[port].linkdown_cnt > 2) {
+++ next_state = WAIT_8101_LINK_UP_POSITIVE;
+++ eth3220ac_rt8101_phy_setting(gec, port);
+++ } else {
+++ next_state = LINK_DOWN_POSITIVE;
+++ }
+++ }
+++ break;
+++
+++ case LINK_UP_8101_POSITIVE:
+++ eth3220ac_normal_phy_setting(gec, port);
+++ /* fall down to phy normal state */
+++ case PHY_STATE_INIT:
+++ eth3220ac_def_linkdown_setting(gec, port);
+++ eth3220ac_unlink_agc(gec, port);
+++ default:
+++ next_state = LINK_DOWN_POSITIVE;
+++ }
+++ }
+++
+++ if (phy[port].state != next_state) {
+++ phy[port].state_time = 0;
+++#if DEBUG_PHY_STATE_TRANSITION
+++ if (debug_phy_port == -1 || port == debug_phy_port) {
+++ if ((phy[port].state < PHY_STATE_LAST) &&
+++ (next_state < PHY_STATE_LAST))
+++ dev_dbg(&gec->netdev->dev,
+++ "p%d: %s->%s, %d, %d\n",
+++ port, phystate_name[phy[port].state],
+++ phystate_name[next_state],
+++ phy[port].timer,
+++ phy[port].linkdown_cnt);
+++ else
+++ dev_dbg(&gec->netdev->dev,
+++ "p%d: %d->%d\n",
+++ port, phy[port].state, next_state);
+++ }
+++#endif /* DEBUG_PHY_STATE_TRANSITION */
+++ } else {
+++ phy[port].state_time += ETH3220_PHY_MON_PERIOD;
+++ }
+++ phy[port].state = next_state;
+++}
+++
+++/*=============================================================*
+++ * eth3220_phyinit:
+++ *=============================================================*/
+++static void eth3220ac_10m_agc(struct cns21xx_gec *gec)
+++{
+++ /* Force 10M AGC = 2c globally */
+++ cns21xx_gec_write_phy(gec, 0, 31, 0x2f1a);
+++ cns21xx_gec_write_phy(gec, 0, 12, 0x112c);
+++ cns21xx_gec_write_phy(gec, 0, 13, 0x2e21);
+++ cns21xx_gec_write_phy(gec, 0, 31, 0xaf1a);
+++}
+++
+++static void eth3220ac_dfe_init(struct cns21xx_gec *gec)
+++{
+++ int i;
+++
+++ cns21xx_gec_write_phy(gec, 0, 31, 0x2f1a);
+++ for (i = 0; i <= 7; i++)
+++ cns21xx_gec_write_phy(gec, 0, i, 0);
+++ cns21xx_gec_write_phy(gec, 0, 11, 0x0b50);
+++ cns21xx_gec_write_phy(gec, 0, 31, 0xaf1a);
+++}
+++
+++static void eth3220ac_phy_cdr_training_init(struct cns21xx_gec *gec)
+++{
+++ int i;
+++
+++ /* Force all port in 10M FD mode */
+++ for (i = 0; i < NUM_PHY; i++)
+++ cns21xx_gec_write_phy(gec, i, 0, 0x100);
+++
+++ /* Global setting */
+++ cns21xx_gec_write_phy(gec, 0, 31, 0x2f1a);
+++ cns21xx_gec_write_phy(gec, 0, 29, 0x5021);
+++ udelay(2000); /* 2ms, wait > 1 ms */
+++ cns21xx_gec_write_phy(gec, 0, 29, 0x4021);
+++ udelay(2000); /* 2ms, wait > 1 ms */
+++ cns21xx_gec_write_phy(gec, 0, 31, 0xaf1a);
+++
+++ /* Enable phy AN */
+++ for (i = 0; i < NUM_PHY; i++)
+++ cns21xx_gec_write_phy(gec, i, 0, 0x3100);
+++}
+++
+++static void eth3220_phyinit(struct cns21xx_gec *gec)
+++{
+++ eth3220ac_10m_agc(gec);
+++ eth3220ac_dfe_init(gec);
+++ eth3220ac_phy_cdr_training_init(gec);
+++}
+++
+++static void eth3220_phycfg(struct cns21xx_gec *gec, int phyaddr)
+++{
+++ eth3220ac_def_linkdown_setting(gec, phyaddr);
+++ eth3220ac_normal_phy_setting(gec, phyaddr);
+++ cns21xx_gec_write_phy(gec, phyaddr, 9, 0x7f);
+++}
+++
+++static void internal_phy_patch_check(struct cns21xx_gec *gec, int init)
+++{
+++ u32 short_cable_agc_detect_count;
+++ u32 link_status = 0, link_speed;
+++ u32 phy_addr = gec->phy_addr;
+++ u16 phy_data;
+++ u16 phy_data2;
+++ int i;
+++
+++ cns21xx_gec_read_phy(gec, phy_addr, 1, &phy_data);
+++ udelay(100);
+++ cns21xx_gec_read_phy(gec, phy_addr, 1, &phy_data2);
+++ if (((phy_data & 0x0004) != 0x0004) &&
+++ ((phy_data2 & 0x0004) != 0x0004)) {
+++ /* link down */
+++ short_cable_agc_detect_count = 0;
+++ for (i = 0; i < INTERNAL_PHY_PATCH_CHECKCNT; i++) {
+++ cns21xx_gec_read_phy(gec, phy_addr, 15, &phy_data);
+++ udelay(1000);
+++ if ((phy_data & 0x7F) <= 0x12) {
+++ /* short cable */
+++ short_cable_agc_detect_count++;
+++ break;
+++ }
+++ }
+++ if (short_cable_agc_detect_count) {
+++ u32 mac_cfg;
+++
+++ /* short cable */
+++ phy_statemachine = wp3220ac_phystate;
+++ eth3220_phyinit(gec);
+++ cns21xx_gec_read_phy(gec, phy_addr, 1, &phy_data);
+++ if (phy_data & 0x0040)
+++ link_status = 1;
+++
+++ mac_cfg = cns21xx_gec_rr(gec, GEC_REG_MAC_CFG);
+++ if ((mac_cfg & 0xC) == 0x4) /* 100Mbps */
+++ link_speed = 1;
+++ else
+++ link_speed = 0;
+++
+++ link_status_old = link_status;
+++ for (i = 0; i < MAX_PHY_PORT; link_status >>= 1, i++)
+++ eth3220_phycfg(gec, i);
+++ } else {
+++ /* long cable */
+++ /* set to global domain */
+++ cns21xx_gec_write_phy(gec, phy_addr, 31,
+++ 0x2f1a);
+++ for (i = 0; i < 32; i++)
+++ cns21xx_gec_write_phy(gec, phy_addr, i,
+++ long_cable_global_reg[i]);
+++
+++ /* set to local domain */
+++ cns21xx_gec_write_phy(gec, phy_addr, 31,
+++ 0xaf1a);
+++ for (i = 0; i < 32; i++)
+++ cns21xx_gec_write_phy(gec, phy_addr, i,
+++ long_cable_local_reg[i]);
+++ }
+++ }
+++}
+++
+++static void internal_phy_timer_func(unsigned long data)
+++{
+++ struct cns21xx_gec *gec = (struct cns21xx_gec *) data;
+++
+++ internal_phy_patch_check(gec, 0);
+++ mod_timer(&gec->internal_phy_timer,
+++ jiffies + INTERNAL_PHY_PATCH_CHECK_PERIOD / 10);
+++}
+++
+++static void internal_phy_init_timer(struct cns21xx_gec *gec)
+++{
+++ init_timer(&gec->internal_phy_timer);
+++ gec->internal_phy_timer.function = internal_phy_timer_func;
+++ gec->internal_phy_timer.data = (unsigned long) gec;
+++}
+++
+++static void internal_phy_start_timer(struct cns21xx_gec *gec)
+++{
+++ dev_dbg(&gec->netdev->dev, "starting patch check.\n");
+++
+++ internal_phy_patch_check(gec, 1);
+++ mod_timer(&gec->internal_phy_timer,
+++ jiffies + INTERNAL_PHY_PATCH_CHECK_PERIOD / 10);
+++}
+++
+++static void internal_phy_stop_timer(struct cns21xx_gec *gec)
+++{
+++ dev_dbg(&gec->netdev->dev, "stopping patch check.\n");
+++
+++ del_timer_sync(&gec->internal_phy_timer);
+++}
++--- /dev/null
+++++ b/drivers/net/ethernet/cns21xx/Kconfig
++@@ -0,0 +1,7 @@
+++config CNS21XX_GEC
+++ tristate "CNS21XX Gigabit Ethernet Controller support"
+++ depends on ARCH_CNS21XX
+++ help
+++ If you wish to compile a kernel for Cavium Networks CNS21XX
+++ with ethernet support, then you should always answer Y to this.
+++
++--- /dev/null
+++++ b/drivers/net/ethernet/cns21xx/Makefile
++@@ -0,0 +1,7 @@
+++#
+++# Makefile for the Cavium Networks CNS21XX ethernet driver
+++#
+++
+++cns21xx_gec-y += cns21xx_gec_main.o
+++
+++obj-$(CONFIG_CNS21XX_GEC) += cns21xx_gec.o
++--- a/drivers/net/ethernet/Kconfig
+++++ b/drivers/net/ethernet/Kconfig
++@@ -32,6 +32,7 @@ source "drivers/net/ethernet/calxeda/Kco
++ source "drivers/net/ethernet/chelsio/Kconfig"
++ source "drivers/net/ethernet/cirrus/Kconfig"
++ source "drivers/net/ethernet/cisco/Kconfig"
+++source "drivers/net/ethernet/cns21xx/Kconfig"
++ source "drivers/net/ethernet/davicom/Kconfig"
++
++ config DNET
++--- a/drivers/net/ethernet/Makefile
+++++ b/drivers/net/ethernet/Makefile
++@@ -18,6 +18,7 @@ obj-$(CONFIG_NET_CALXEDA_XGMAC) += calxe
++ obj-$(CONFIG_NET_VENDOR_CHELSIO) += chelsio/
++ obj-$(CONFIG_NET_VENDOR_CIRRUS) += cirrus/
++ obj-$(CONFIG_NET_VENDOR_CISCO) += cisco/
+++obj-$(CONFIG_CNS21XX_GEC) += cns21xx/
++ obj-$(CONFIG_DM9000) += davicom/
++ obj-$(CONFIG_DNET) += dnet.o
++ obj-$(CONFIG_NET_VENDOR_DEC) += dec/
+diff --git a/feeds/targets/cns21xx/patches-3.10/201-cns21xx-add-usb-devices.patch b/feeds/targets/cns21xx/patches-3.10/201-cns21xx-add-usb-devices.patch
+new file mode 100644
+index 0000000..f0ffa1e
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/201-cns21xx-add-usb-devices.patch
+@@ -0,0 +1,104 @@
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/dev-usb.c
++@@ -0,0 +1,71 @@
+++/*
+++ * Copyright (c) 2008 Cavium Networks
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/init.h>
+++#include <linux/irq.h>
+++#include <linux/dma-mapping.h>
+++#include <linux/platform_device.h>
+++
+++#include <mach/cns21xx.h>
+++
+++static u64 cns21xx_usb_dmamask = DMA_BIT_MASK(32);
+++
+++static struct resource cns21xx_ohci_resources[] = {
+++ [0] = {
+++ .start = CNS21XX_OHCI_CTRL_BASE,
+++ .end = CNS21XX_OHCI_CTRL_BASE + SZ_1M - 1,
+++ .flags = IORESOURCE_MEM,
+++ },
+++ [1] = {
+++ .start = CNS21XX_IRQ_OHCI,
+++ .end = CNS21XX_IRQ_OHCI,
+++ .flags = IORESOURCE_IRQ,
+++ },
+++};
+++
+++static struct platform_device cns21xx_ohci_device = {
+++ .name = "cns21xx-ohci",
+++ .id = -1,
+++ .dev = {
+++ .dma_mask = &cns21xx_usb_dmamask,
+++ .coherent_dma_mask = DMA_BIT_MASK(32),
+++ },
+++ .resource = cns21xx_ohci_resources,
+++ .num_resources = ARRAY_SIZE(cns21xx_ohci_resources),
+++};
+++
+++static struct resource cns21xx_ehci_resources[] = {
+++ [0] = {
+++ .start = CNS21XX_EHCI_CTRL_BASE,
+++ .end = CNS21XX_EHCI_CTRL_BASE + SZ_1M - 1,
+++ .flags = IORESOURCE_MEM,
+++ },
+++ [1] = {
+++ .start = CNS21XX_IRQ_EHCI,
+++ .end = CNS21XX_IRQ_EHCI,
+++ .flags = IORESOURCE_IRQ,
+++ },
+++};
+++
+++static struct platform_device cns21xx_ehci_device = {
+++ .name = "cns21xx-ehci",
+++ .id = -1,
+++ .dev = {
+++ .dma_mask = &cns21xx_usb_dmamask,
+++ .coherent_dma_mask = DMA_BIT_MASK(32),
+++ },
+++ .resource = cns21xx_ehci_resources,
+++ .num_resources = ARRAY_SIZE(cns21xx_ehci_resources),
+++};
+++
+++void __init cns21xx_register_usb(void)
+++{
+++ platform_device_register(&cns21xx_ehci_device);
+++ platform_device_register(&cns21xx_ohci_device);
+++}
++--- a/arch/arm/mach-cns21xx/Kconfig
+++++ b/arch/arm/mach-cns21xx/Kconfig
++@@ -3,4 +3,7 @@ if ARCH_CNS21XX
++ menu "Cavium Networks CNS21xx based machines"
++ endmenu
++
+++config CNS21XX_DEV_USB
+++ def_bool n
+++
++ endif
++--- a/arch/arm/mach-cns21xx/Makefile
+++++ b/arch/arm/mach-cns21xx/Makefile
++@@ -6,5 +6,8 @@
++
++ obj-y := core.o irq.o gpio.o mm.o time.o idle.o devices.o
++
+++# devices
+++obj-$(CONFIG_CNS21XX_DEV_USB) += dev-usb.o
+++
++ # machine specific files
++
++--- a/arch/arm/mach-cns21xx/common.h
+++++ b/arch/arm/mach-cns21xx/common.h
++@@ -20,5 +20,6 @@ extern struct sys_timer cns21xx_timer;
++
++ int cns21xx_register_uart0(void);
++ int cns21xx_register_uart1(void);
+++int cns21xx_register_usb(void);
++
++ #endif /* _MACH_CNS21XX_COMMON_H */
+diff --git a/feeds/targets/cns21xx/patches-3.10/202-cns21xx-add-watchdog-device.patch b/feeds/targets/cns21xx/patches-3.10/202-cns21xx-add-watchdog-device.patch
+new file mode 100644
+index 0000000..48c69ad
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/202-cns21xx-add-watchdog-device.patch
+@@ -0,0 +1,63 @@
++--- a/arch/arm/mach-cns21xx/common.h
+++++ b/arch/arm/mach-cns21xx/common.h
++@@ -21,5 +21,6 @@ extern struct sys_timer cns21xx_timer;
++ int cns21xx_register_uart0(void);
++ int cns21xx_register_uart1(void);
++ int cns21xx_register_usb(void);
+++int cns21xx_register_wdt(void);
++
++ #endif /* _MACH_CNS21XX_COMMON_H */
++--- a/arch/arm/mach-cns21xx/devices.c
+++++ b/arch/arm/mach-cns21xx/devices.c
++@@ -11,6 +11,7 @@
++ #include <linux/init.h>
++ #include <linux/platform_device.h>
++ #include <linux/serial_8250.h>
+++#include <linux/fa_wdt.h>
++
++ #include <mach/irqs.h>
++ #include <mach/hardware.h>
++@@ -77,3 +78,32 @@ int __init cns21xx_register_uart1(void)
++ HAL_MISC_ENABLE_UART1_PINS();
++ return platform_device_register(&cns21xx_uart1_device);
++ }
+++
+++static struct resource cns21xx_wdt_resources[] = {
+++ {
+++ .start = CNS21XX_WDT_BASE,
+++ .end = CNS21XX_WDT_BASE + SZ_4K - 1,
+++ .flags = IORESOURCE_MEM,
+++ },
+++};
+++
+++#define CNS21XX_WDT_CLOCK 10 /* 10 Hz */
+++
+++static struct fa_wdt_platform_data cns21xx_wdt_data = {
+++ .clock = CNS21XX_WDT_CLOCK,
+++};
+++
+++static struct platform_device cns21xx_wdt_device = {
+++ .name = "fa-wdt",
+++ .id = -1,
+++ .resource = cns21xx_wdt_resources,
+++ .num_resources = ARRAY_SIZE(cns21xx_wdt_resources),
+++ .dev = {
+++ .platform_data = &cns21xx_wdt_data,
+++ },
+++};
+++
+++int __init cns21xx_register_wdt(void)
+++{
+++ return platform_device_register(&cns21xx_wdt_device);
+++}
++--- a/drivers/watchdog/Kconfig
+++++ b/drivers/watchdog/Kconfig
++@@ -393,7 +393,7 @@ config RETU_WATCHDOG
++
++ config FA_WATCHDOG
++ tristate "Faraday watchdog"
++- depends on ARCH_GEMINI
+++ depends on ARCH_GEMINI || ARCH_CNS21XX
++ help
++ Say Y here if you want support for the built-in watchdog timer
++ found in some Faraday FA526 based SoCs.
+diff --git a/feeds/targets/cns21xx/patches-3.10/203-cns21xx-add-spi-master-device.patch b/feeds/targets/cns21xx/patches-3.10/203-cns21xx-add-spi-master-device.patch
+new file mode 100644
+index 0000000..3504a2c
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/203-cns21xx-add-spi-master-device.patch
+@@ -0,0 +1,117 @@
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/dev-spi-master.c
++@@ -0,0 +1,83 @@
+++/*
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/kernel.h>
+++#include <linux/init.h>
+++#include <linux/spi/spi.h>
+++#include <linux/dma-mapping.h>
+++#include <linux/platform_device.h>
+++
+++#include <mach/hardware.h>
+++#include <mach/cns21xx.h>
+++#include <mach/cns21xx_misc.h>
+++#include <mach/cns21xx_powermgmt.h>
+++#include <mach/irqs.h>
+++
+++#include "common.h"
+++
+++static u64 spi_dmamask = DMA_BIT_MASK(32);
+++static struct resource cns21xx_spi_resources[] = {
+++ [0] = {
+++ .start = CNS21XX_SPI_BASE,
+++ .end = CNS21XX_SPI_BASE + SZ_4K - 1,
+++ .flags = IORESOURCE_MEM,
+++ },
+++ [1] = {
+++ .start = CNS21XX_IRQ_SPI,
+++ .end = CNS21XX_IRQ_SPI,
+++ .flags = IORESOURCE_IRQ,
+++ },
+++};
+++
+++static struct platform_device cns21xx_spi_master_device = {
+++ .name = "cns21xx-spi",
+++ .id = -1,
+++ .dev = {
+++ .dma_mask = &spi_dmamask,
+++ .coherent_dma_mask = DMA_BIT_MASK(32),
+++ },
+++ .resource = cns21xx_spi_resources,
+++ .num_resources = ARRAY_SIZE(cns21xx_spi_resources),
+++};
+++
+++void __init cns21xx_register_spi_master(int id, struct spi_board_info *info,
+++ unsigned int n)
+++{
+++ unsigned int i;
+++
+++ /* Enable SPI pins */
+++ HAL_MISC_ENABLE_SPIDR_PINS();
+++ HAL_MISC_ENABLE_SPICLK_PINS();
+++ for (i = 0; i < n; i++) {
+++ switch (info[i].chip_select) {
+++ case 0:
+++ HAL_MISC_ENABLE_SPICSN0_PINS();
+++ break;
+++ case 1:
+++ HAL_MISC_ENABLE_SPICSN1_PINS();
+++ break;
+++ case 2:
+++ HAL_MISC_ENABLE_SPICSN2_PINS();
+++ break;
+++ case 3:
+++ HAL_MISC_ENABLE_SPICSN3_PINS();
+++ break;
+++ }
+++ }
+++
+++ /* Disable SPI serial flash access through 0x30000000 region */
+++ HAL_MISC_DISABLE_SPI_SERIAL_FLASH_BANK_ACCESS();
+++
+++ /* Enable SPI clock */
+++ HAL_PWRMGT_ENABLE_SPI_CLOCK();
+++
+++ cns21xx_spi_master_device.id = id;
+++
+++ spi_register_board_info(info, n);
+++ platform_device_register(&cns21xx_spi_master_device);
+++}
++--- a/arch/arm/mach-cns21xx/Kconfig
+++++ b/arch/arm/mach-cns21xx/Kconfig
++@@ -6,4 +6,7 @@ endmenu
++ config CNS21XX_DEV_USB
++ def_bool n
++
+++config CNS21XX_DEV_SPI_MASTER
+++ def_bool n
+++
++ endif
++--- a/arch/arm/mach-cns21xx/Makefile
+++++ b/arch/arm/mach-cns21xx/Makefile
++@@ -8,6 +8,7 @@ obj-y := core.o irq.o gpio.o mm.o time.
++
++ # devices
++ obj-$(CONFIG_CNS21XX_DEV_USB) += dev-usb.o
+++obj-$(CONFIG_CNS21XX_DEV_SPI_MASTER) += dev-spi-master.o
++
++ # machine specific files
++
++--- a/arch/arm/mach-cns21xx/common.h
+++++ b/arch/arm/mach-cns21xx/common.h
++@@ -23,4 +23,8 @@ int cns21xx_register_uart1(void);
++ int cns21xx_register_usb(void);
++ int cns21xx_register_wdt(void);
++
+++struct spi_board_info;
+++void __init cns21xx_register_spi_master(int id, struct spi_board_info *info,
+++ unsigned int n);
+++
++ #endif /* _MACH_CNS21XX_COMMON_H */
+diff --git a/feeds/targets/cns21xx/patches-3.10/204-cns21xx-add-gec-device.patch b/feeds/targets/cns21xx/patches-3.10/204-cns21xx-add-gec-device.patch
+new file mode 100644
+index 0000000..ef24d81
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/204-cns21xx-add-gec-device.patch
+@@ -0,0 +1,178 @@
++--- a/arch/arm/mach-cns21xx/Kconfig
+++++ b/arch/arm/mach-cns21xx/Kconfig
++@@ -3,6 +3,9 @@ if ARCH_CNS21XX
++ menu "Cavium Networks CNS21xx based machines"
++ endmenu
++
+++config CNS21XX_DEV_GEC
+++ def_bool n
+++
++ config CNS21XX_DEV_USB
++ def_bool n
++
++--- a/arch/arm/mach-cns21xx/Makefile
+++++ b/arch/arm/mach-cns21xx/Makefile
++@@ -7,6 +7,7 @@
++ obj-y := core.o irq.o gpio.o mm.o time.o idle.o devices.o
++
++ # devices
+++obj-$(CONFIG_CNS21XX_DEV_GEC) += dev-gec.o
++ obj-$(CONFIG_CNS21XX_DEV_USB) += dev-usb.o
++ obj-$(CONFIG_CNS21XX_DEV_SPI_MASTER) += dev-spi-master.o
++
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/dev-gec.c
++@@ -0,0 +1,98 @@
+++/*
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/init.h>
+++#include <linux/dma-mapping.h>
+++#include <linux/platform_device.h>
+++#include <linux/etherdevice.h>
+++
+++#include <asm/sizes.h>
+++#include <mach/cns21xx.h>
+++#include <mach/irqs.h>
+++
+++#include "dev-gec.h"
+++
+++static u8 cns21xx_ethaddr[ETH_ALEN];
+++struct cns21xx_gec_plat_data cns21xx_gec_data;
+++
+++static struct resource cns21xx_gec_resources[] = {
+++ {
+++ .start = CNS21XX_NIC_BASE,
+++ .end = CNS21XX_NIC_BASE + SZ_4K - 1,
+++ .flags = IORESOURCE_MEM,
+++ }, {
+++ .name = CNS21XX_GEC_STATUS_IRQ_NAME,
+++ .start = CNS21XX_IRQ_NIC_STATUS,
+++ .end = CNS21XX_IRQ_NIC_STATUS,
+++ .flags = IORESOURCE_IRQ,
+++ }, {
+++ .name = CNS21XX_GEC_RXRC_IRQ_NAME,
+++ .start = CNS21XX_IRQ_NIC_RXRC,
+++ .end = CNS21XX_IRQ_NIC_RXRC,
+++ .flags = IORESOURCE_IRQ,
+++ }, {
+++ .name = CNS21XX_GEC_RXQF_IRQ_NAME,
+++ .start = CNS21XX_IRQ_NIC_RXQF,
+++ .end = CNS21XX_IRQ_NIC_RXQF,
+++ .flags = IORESOURCE_IRQ,
+++ }, {
+++ .name = CNS21XX_GEC_TXTC_IRQ_NAME,
+++ .start = CNS21XX_IRQ_NIC_TXTC,
+++ .end = CNS21XX_IRQ_NIC_TXTC,
+++ .flags = IORESOURCE_IRQ,
+++ }, {
+++ .name = CNS21XX_GEC_TXQE_IRQ_NAME,
+++ .start = CNS21XX_IRQ_NIC_TXQE,
+++ .end = CNS21XX_IRQ_NIC_TXQE,
+++ .flags = IORESOURCE_IRQ,
+++ }
+++};
+++
+++static u64 cns21xx_gec_dmamask = DMA_BIT_MASK(32);
+++static struct platform_device cns21xx_gec_device = {
+++ .name = "cns21xx-gec",
+++ .id = -1,
+++ .resource = cns21xx_gec_resources,
+++ .num_resources = ARRAY_SIZE(cns21xx_gec_resources),
+++ .dev = {
+++ .dma_mask = &cns21xx_gec_dmamask,
+++ .coherent_dma_mask = DMA_BIT_MASK(32),
+++ .platform_data = &cns21xx_gec_data,
+++ },
+++};
+++
+++static int __init cns21xx_ethaddr_setup(char *str)
+++{
+++ int t;
+++
+++ t = sscanf(str, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
+++ &cns21xx_ethaddr[0], &cns21xx_ethaddr[1],
+++ &cns21xx_ethaddr[2], &cns21xx_ethaddr[3],
+++ &cns21xx_ethaddr[4], &cns21xx_ethaddr[5]);
+++
+++ if (t != ETH_ALEN)
+++ pr_err("cns21xx: failed to parse mac address \"%s\"\n", str);
+++
+++ return 1;
+++}
+++
+++__setup("ethaddr=", cns21xx_ethaddr_setup);
+++
+++__init int cns21xx_register_gec(void)
+++{
+++ if (cns21xx_gec_data.mac_addr == NULL)
+++ cns21xx_gec_data.mac_addr = cns21xx_ethaddr;
+++
+++ if (!is_valid_ether_addr(cns21xx_gec_data.mac_addr)) {
+++ random_ether_addr(cns21xx_gec_data.mac_addr);
+++ pr_debug("cns21xx: using random MAC address \"%s\"\n",
+++ cns21xx_gec_data.mac_addr);
+++ }
+++
+++ return platform_device_register(&cns21xx_gec_device);
+++}
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/dev-gec.h
++@@ -0,0 +1,18 @@
+++/*
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#ifndef _CNS21XX_DEV_GEC_H
+++#define _CNS21XX_DEV_GEC_H
+++
+++#include <mach/cns21xx_gec_platform.h>
+++
+++extern struct cns21xx_gec_plat_data cns21xx_gec_data;
+++
+++__init int cns21xx_register_gec(void);
+++
+++#endif /* _CNS21XX_DEV_GEC_H */
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/include/mach/cns21xx_gec_platform.h
++@@ -0,0 +1,31 @@
+++/*
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#ifndef _CNS21XX_GEC_PLATFORM_H
+++#define _CNS21XX_GEC_PLATFORM_H
+++
+++#define CNS21XX_GEC_STATUS_IRQ_NAME "status"
+++#define CNS21XX_GEC_RXRC_IRQ_NAME "rxrc"
+++#define CNS21XX_GEC_RXQF_IRQ_NAME "rxqf"
+++#define CNS21XX_GEC_TXTC_IRQ_NAME "txtc"
+++#define CNS21XX_GEC_TXQE_IRQ_NAME "txqe"
+++
+++enum cns21xx_gec_phy_type {
+++ CNS21XX_GEC_PHY_TYPE_INTERNAL = 0,
+++ CNS21XX_GEC_PHY_TYPE_VSC8601,
+++ CNS21XX_GEC_PHY_TYPE_IP101A,
+++ CNS21XX_GEC_PHY_TYPE_IP1001,
+++};
+++
+++struct cns21xx_gec_plat_data {
+++ u8 *mac_addr;
+++ enum cns21xx_gec_phy_type phy_type;
+++ u8 phy_addr;
+++};
+++
+++#endif /* _CNS21XX_GEC_PLATFORM_H */
+diff --git a/feeds/targets/cns21xx/patches-3.10/301-cns21xx-mach-ns-k330.patch b/feeds/targets/cns21xx/patches-3.10/301-cns21xx-mach-ns-k330.patch
+new file mode 100644
+index 0000000..60975c7
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/301-cns21xx-mach-ns-k330.patch
+@@ -0,0 +1,234 @@
++--- a/arch/arm/mach-cns21xx/Kconfig
+++++ b/arch/arm/mach-cns21xx/Kconfig
++@@ -1,6 +1,16 @@
++ if ARCH_CNS21XX
++
++ menu "Cavium Networks CNS21xx based machines"
+++
+++config MACH_NS_K330
+++ bool "NS-K330 NAS"
+++ select CNS21XX_DEV_GEC
+++ select CNS21XX_DEV_SPI_MASTER
+++ select CNS21XX_DEV_USB
+++ help
+++ Say Y here if you intend to run this kernel on the
+++ NS-K330 NAS board.
+++
++ endmenu
++
++ config CNS21XX_DEV_GEC
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/mach-ns-k330.c
++@@ -0,0 +1,204 @@
+++/*
+++ * NS-K330 NAS board support
+++ *
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/kernel.h>
+++#include <linux/init.h>
+++#include <linux/mtd/mtd.h>
+++#include <linux/mtd/map.h>
+++#include <linux/mtd/partitions.h>
+++#include <linux/spi/spi.h>
+++#include <linux/spi/flash.h>
+++#include <linux/platform_device.h>
+++#include <linux/gpio.h>
+++#include <linux/leds.h>
+++#include <linux/gpio_keys.h>
+++#include <linux/input.h>
+++
+++#include <asm/setup.h>
+++#include <asm/mach-types.h>
+++#include <asm/mach/arch.h>
+++#include <asm/mach/time.h>
+++#include <mach/hardware.h>
+++#include <mach/cns21xx.h>
+++#include <mach/cns21xx_misc.h>
+++
+++#include "common.h"
+++#include "dev-gec.h"
+++
+++#define NS_K330_GPIO_LED_LINK 1
+++#define NS_K330_GPIO_LED_USB1 16
+++#define NS_K330_GPIO_LED_USB2 17
+++#define NS_K330_GPIO_LED_ETH_GREEN 22
+++#define NS_K330_GPIO_LED_ETH_ORANGE 23
+++
+++#define NS_K330_GPIO_BTN_RESET 13
+++#define NS_K330_GPIO_BTN_USB1 14
+++#define NS_K330_GPIO_BTN_USB2 15
+++
+++static struct mtd_partition ns_k330_partitions[] = {
+++ {
+++ .name = "boot",
+++ .offset = 0x0,
+++ .size = 0x040000,
+++ .mask_flags = MTD_WRITEABLE,
+++ }, {
+++ .name = "config",
+++ .offset = 0x040000,
+++ .size = 0x020000,
+++ .mask_flags = MTD_WRITEABLE,
+++ }, {
+++ .name = "kernel",
+++ .offset = 0x060000,
+++ .size = 0x100000,
+++ }, {
+++ .name = "rootfs",
+++ .offset = 0x160000,
+++ .size = 0x290000,
+++ }, {
+++ .name = "firmware",
+++ .offset = 0x060000,
+++ .size = 0x390000,
+++ },
+++};
+++
+++static struct flash_platform_data ns_k330_flash_data = {
+++ .parts = ns_k330_partitions,
+++ .nr_parts = ARRAY_SIZE(ns_k330_partitions),
+++};
+++
+++static struct spi_board_info ns_k330_spi_board_info[] = {
+++ {
+++ .bus_num = 0,
+++ .chip_select = 0,
+++ .max_speed_hz = 25000000,
+++ .modalias = "m25p80",
+++ .platform_data = &ns_k330_flash_data,
+++ }
+++};
+++
+++static struct gpio_led ns_k330_gpio_leds[] = {
+++ {
+++ .name = "ns-k330:red:link",
+++ .gpio = NS_K330_GPIO_LED_LINK,
+++ .active_low = 1,
+++ }, {
+++ .name = "ns-k330:green:usb1",
+++ .gpio = NS_K330_GPIO_LED_USB1,
+++ .active_low = 1,
+++ }, {
+++ .name = "ns-k330:green:usb2",
+++ .gpio = NS_K330_GPIO_LED_USB2,
+++ .active_low = 1,
+++ }, {
+++ .name = "ns-k330:green:eth",
+++ .gpio = NS_K330_GPIO_LED_ETH_GREEN,
+++ .active_low = 1,
+++ }, {
+++ .name = "ns-k330:orange:eth",
+++ .gpio = NS_K330_GPIO_LED_ETH_ORANGE,
+++ .active_low = 1,
+++ }
+++};
+++
+++static struct gpio_led_platform_data ns_k330_gpio_leds_data = {
+++ .num_leds = ARRAY_SIZE(ns_k330_gpio_leds),
+++ .leds = ns_k330_gpio_leds,
+++};
+++
+++static struct platform_device ns_k330_gpio_leds_device = {
+++ .name = "leds-gpio",
+++ .id = -1,
+++ .dev.platform_data = &ns_k330_gpio_leds_data,
+++};
+++
+++static struct gpio_keys_button ns_k330_gpio_keys[] = {
+++ {
+++ .code = KEY_RESTART,
+++ .gpio = NS_K330_GPIO_BTN_RESET,
+++ .desc = "Reset Button",
+++ .active_low = 1,
+++ },
+++ {
+++ .code = BTN_0,
+++ .gpio = NS_K330_GPIO_BTN_USB1,
+++ .desc = "USB1 Button",
+++ .active_low = 1,
+++ },
+++ {
+++ .code = BTN_1,
+++ .gpio = NS_K330_GPIO_BTN_USB2,
+++ .desc = "USB2 Button",
+++ .active_low = 0,
+++ },
+++};
+++
+++static struct gpio_keys_platform_data ns_k330_gpio_keys_data = {
+++ .buttons = ns_k330_gpio_keys,
+++ .nbuttons = ARRAY_SIZE(ns_k330_gpio_keys),
+++};
+++
+++static struct platform_device ns_k330_gpio_keys_device = {
+++ .name = "gpio-keys",
+++ .id = -1,
+++ .num_resources = 0,
+++ .dev = {
+++ .platform_data = &ns_k330_gpio_keys_data,
+++ },
+++};
+++
+++static void __init ns_k330_fixup(struct tag *tags, char **cmdline,
+++ struct meminfo *mi)
+++{
+++ struct tag *t;
+++
+++ /* The board has 32MB of RAM mapped at 0. */
+++ mi->nr_banks = 1;
+++ mi->bank[0].start = 0;
+++ mi->bank[0].size = SZ_32M;
+++
+++ for (t = tags; t->hdr.size; t = tag_next(t)) {
+++ switch (t->hdr.tag) {
+++ case ATAG_CORE:
+++ if (t->u.core.rootdev == 255)
+++ t->u.core.rootdev = 0;
+++ break;
+++ }
+++ }
+++}
+++
+++static void __init ns_k330_init(void)
+++{
+++ cns21xx_gpio_init();
+++
+++ HAL_MISC_DISABLE_LED012_PINS();
+++ HAL_MISC_DISABLE_I2C_PINS();
+++ HAL_MISC_DISABLE_I2S_PINS();
+++
+++ cns21xx_register_uart0();
+++ cns21xx_register_wdt();
+++ cns21xx_register_usb();
+++ cns21xx_register_spi_master(-1, ns_k330_spi_board_info,
+++ ARRAY_SIZE(ns_k330_spi_board_info));
+++
+++ cns21xx_gec_data.phy_type = CNS21XX_GEC_PHY_TYPE_INTERNAL;
+++ cns21xx_register_gec();
+++
+++ platform_device_register(&ns_k330_gpio_leds_device);
+++ platform_device_register(&ns_k330_gpio_keys_device);
+++}
+++
+++MACHINE_START(NS_K330, "NS-K330 NAS")
+++ .fixup = ns_k330_fixup,
+++ .map_io = cns21xx_map_io,
+++ .init_irq = cns21xx_init_irq,
+++ .init_time = cns21xx_timer_init,
+++ .init_machine = ns_k330_init,
+++ .restart = cns21xx_restart,
+++MACHINE_END
++--- a/arch/arm/mach-cns21xx/Makefile
+++++ b/arch/arm/mach-cns21xx/Makefile
++@@ -12,4 +12,4 @@ obj-$(CONFIG_CNS21XX_DEV_USB) += dev-us
++ obj-$(CONFIG_CNS21XX_DEV_SPI_MASTER) += dev-spi-master.o
++
++ # machine specific files
++-
+++obj-$(CONFIG_MACH_NS_K330) += mach-ns-k330.o
+diff --git a/feeds/targets/cns21xx/patches-3.10/302-cns21xx-mach-nsb3ast.patch b/feeds/targets/cns21xx/patches-3.10/302-cns21xx-mach-nsb3ast.patch
+new file mode 100644
+index 0000000..467ad5e
+--- /dev/null
++++ b/feeds/targets/cns21xx/patches-3.10/302-cns21xx-mach-nsb3ast.patch
+@@ -0,0 +1,201 @@
++--- a/arch/arm/mach-cns21xx/Kconfig
+++++ b/arch/arm/mach-cns21xx/Kconfig
++@@ -2,6 +2,15 @@ if ARCH_CNS21XX
++
++ menu "Cavium Networks CNS21xx based machines"
++
+++config MACH_NSB3AST
+++ bool "AGESTAR NSB3AST support"
+++ select CNS21XX_DEV_GEC
+++ select CNS21XX_DEV_SPI_MASTER
+++ select CNS21XX_DEV_USB
+++ help
+++ Say Y here if you intend to run this kernel on the
+++ AGESTAR NSB3AST board.
+++
++ config MACH_NS_K330
++ bool "NS-K330 NAS"
++ select CNS21XX_DEV_GEC
++--- /dev/null
+++++ b/arch/arm/mach-cns21xx/mach-nsb3ast.c
++@@ -0,0 +1,173 @@
+++/*
+++ * AGESTAR NSB3AST board support
+++ *
+++ * Copyright (c) 2010-2012 Gabor Juhos <juhosg@openwrt.org>
+++ *
+++ * This file is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License, Version 2, as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/kernel.h>
+++#include <linux/init.h>
+++#include <linux/mtd/mtd.h>
+++#include <linux/mtd/map.h>
+++#include <linux/mtd/partitions.h>
+++#include <linux/spi/spi.h>
+++#include <linux/spi/flash.h>
+++#include <linux/platform_device.h>
+++#include <linux/gpio.h>
+++#include <linux/leds.h>
+++#include <linux/gpio_keys.h>
+++#include <linux/input.h>
+++
+++#include <asm/setup.h>
+++#include <asm/mach-types.h>
+++#include <asm/mach/arch.h>
+++#include <asm/mach/time.h>
+++#include <mach/hardware.h>
+++#include <mach/cns21xx.h>
+++#include <mach/cns21xx_misc.h>
+++
+++#include "common.h"
+++#include "dev-gec.h"
+++
+++static struct mtd_partition nsb3ast_partitions[] = {
+++ {
+++ .name = "armboot",
+++ .offset = 0x0,
+++ .size = 0x040000,
+++ .mask_flags = MTD_WRITEABLE,
+++ }, {
+++ .name = "kernel",
+++ .offset = 0x040000,
+++ .size = 0x100000,
+++ }, {
+++ .name = "rootfs",
+++ .offset = 0x140000,
+++ .size = 0x6c0000,
+++ }, {
+++ .name = "firmware",
+++ .offset = 0x040000,
+++ .size = 0x7c0000,
+++ }, {
+++ .name = "wholeflash",
+++ .offset = 0x0,
+++ .size = 0x800000,
+++ .mask_flags = MTD_WRITEABLE,
+++ },
+++};
+++
+++static struct flash_platform_data nsb3ast_flash_data = {
+++ .parts = nsb3ast_partitions,
+++ .nr_parts = ARRAY_SIZE(nsb3ast_partitions),
+++};
+++
+++static struct spi_board_info nsb3ast_spi_board_info[] = {
+++ {
+++ .bus_num = 0,
+++ .chip_select = 0,
+++ .max_speed_hz = 25000000,
+++ .modalias = "m25p80",
+++ .platform_data = &nsb3ast_flash_data,
+++ }
+++};
+++
+++static struct gpio_led nsb3ast_gpio_leds[] = {
+++ {
+++ .name = "nsb3ast:red:d1",
+++ .gpio = 15,
+++ .active_low = 1,
+++ }, {
+++ .name = "nsb3ast:amber:eth",
+++ .gpio = 22,
+++ .active_low = 1,
+++ }
+++};
+++
+++static struct gpio_led_platform_data nsb3ast_gpio_leds_data = {
+++ .num_leds = ARRAY_SIZE(nsb3ast_gpio_leds),
+++ .leds = nsb3ast_gpio_leds,
+++};
+++
+++static struct platform_device nsb3ast_gpio_leds_device = {
+++ .name = "leds-gpio",
+++ .id = -1,
+++ .dev.platform_data = &nsb3ast_gpio_leds_data,
+++};
+++
+++static struct gpio_keys_button nsb3ast_gpio_keys[] = {
+++ {
+++ .code = KEY_RESTART,
+++ .gpio = 0,
+++ .desc = "Reset Button",
+++ .active_low = 1,
+++ },
+++ {
+++ .code = BTN_0,
+++ .gpio = 2,
+++ .desc = "USB Button",
+++ .active_low = 0,
+++ },
+++};
+++
+++static struct gpio_keys_platform_data nsb3ast_gpio_keys_data = {
+++ .buttons = nsb3ast_gpio_keys,
+++ .nbuttons = ARRAY_SIZE(nsb3ast_gpio_keys),
+++};
+++
+++static struct platform_device nsb3ast_gpio_keys_device = {
+++ .name = "gpio-keys",
+++ .id = -1,
+++ .num_resources = 0,
+++ .dev = {
+++ .platform_data = &nsb3ast_gpio_keys_data,
+++ },
+++};
+++
+++static void __init nsb3ast_fixup(struct tag *tags, char **cmdline,
+++ struct meminfo *mi)
+++{
+++ struct tag *t;
+++
+++ /* The board has 32MB of RAM mapped at 0. */
+++ mi->nr_banks = 1;
+++ mi->bank[0].start = 0;
+++ mi->bank[0].size = SZ_32M;
+++
+++ for (t = tags; t->hdr.size; t = tag_next(t)) {
+++ switch (t->hdr.tag) {
+++ case ATAG_CORE:
+++ if (t->u.core.rootdev == 255)
+++ t->u.core.rootdev = 0;
+++ break;
+++ }
+++ }
+++}
+++
+++static void __init nsb3ast_init(void)
+++{
+++ cns21xx_gpio_init();
+++ cns21xx_register_uart0();
+++ cns21xx_register_uart1();
+++ cns21xx_register_wdt();
+++ cns21xx_register_usb();
+++ cns21xx_register_spi_master(-1, nsb3ast_spi_board_info,
+++ ARRAY_SIZE(nsb3ast_spi_board_info));
+++
+++ cns21xx_gec_data.phy_type = CNS21XX_GEC_PHY_TYPE_INTERNAL;
+++ cns21xx_register_gec();
+++
+++ HAL_MISC_DISABLE_LED012_PINS();
+++ platform_device_register(&nsb3ast_gpio_leds_device);
+++ platform_device_register(&nsb3ast_gpio_keys_device);
+++}
+++
+++MACHINE_START(NSB3AST, "AGESTAR NSB3AST")
+++ .fixup = nsb3ast_fixup,
+++ .map_io = cns21xx_map_io,
+++ .init_irq = cns21xx_init_irq,
+++ .init_time = cns21xx_timer_init,
+++ .init_machine = nsb3ast_init,
+++ .restart = cns21xx_restart,
+++MACHINE_END
++--- a/arch/arm/mach-cns21xx/Makefile
+++++ b/arch/arm/mach-cns21xx/Makefile
++@@ -13,3 +13,4 @@ obj-$(CONFIG_CNS21XX_DEV_SPI_MASTER) +=
++
++ # machine specific files
++ obj-$(CONFIG_MACH_NS_K330) += mach-ns-k330.o
+++obj-$(CONFIG_MACH_NSB3AST) += mach-nsb3ast.o
+diff --git a/feeds/targets/cns21xx/profiles/00-default.mk b/feeds/targets/cns21xx/profiles/00-default.mk
+new file mode 100644
+index 0000000..c2d26c7
+--- /dev/null
++++ b/feeds/targets/cns21xx/profiles/00-default.mk
+@@ -0,0 +1,18 @@
++#
++# Copyright (C) 2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Profile/Default
++ NAME:=Default Profile (all drivers)
++ PACKAGES:= \
++ kmod-usb-core kmod-usb-ohci kmod-usb2 kmod-usb2-cns21xx \
++ kmod-ledtrig-usbdev
++endef
++
++define Profile/Default/Description
++ Default package set compatible with most boards.
++endef
++$(eval $(call Profile,Default))
+diff --git a/feeds/targets/cns21xx/sibyte/Makefile b/feeds/targets/cns21xx/sibyte/Makefile
+new file mode 100644
+index 0000000..a98b170
+--- /dev/null
++++ b/feeds/targets/cns21xx/sibyte/Makefile
+@@ -0,0 +1,25 @@
++#
++# Copyright (C) 2006-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++ARCH:=mips
++BOARD:=sibyte
++BOARDNAME:=Broadcom/SiByte SB-1
++FEATURES:=fpu ramdisk broken
++CPU_TYPE:=sb1
++CPU_CFLAGS_sb1:=-march=sb1
++MAINTAINER:=Imre Kaloz <kaloz@openwrt.org>
++
++KERNEL_PATCHVER:=3.3
++
++include $(INCLUDE_DIR)/target.mk
++
++define Target/Description
++ Build firmware images for Broadcom/SiByte SB-1 boards
++endef
++
++$(eval $(call BuildTarget))
+diff --git a/feeds/targets/cns21xx/sibyte/base-files/etc/inittab b/feeds/targets/cns21xx/sibyte/base-files/etc/inittab
+new file mode 100644
+index 0000000..fa7937d
+--- /dev/null
++++ b/feeds/targets/cns21xx/sibyte/base-files/etc/inittab
+@@ -0,0 +1,4 @@
++# Copyright (C) 2006-2009 OpenWrt.org
++
++::sysinit:/etc/init.d/rcS
++duart0::askfirst:/bin/ash --login
+diff --git a/feeds/targets/cns21xx/sibyte/config-3.3 b/feeds/targets/cns21xx/sibyte/config-3.3
+new file mode 100644
+index 0000000..197165d
+--- /dev/null
++++ b/feeds/targets/cns21xx/sibyte/config-3.3
+@@ -0,0 +1,139 @@
++# CONFIG_32BIT is not set
++CONFIG_64BIT=y
++CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
++CONFIG_ARCH_DISCARD_MEMBLOCK=y
++CONFIG_ARCH_DMA_ADDR_T_64BIT=y
++CONFIG_ARCH_HIBERNATION_POSSIBLE=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++# CONFIG_ARPD is not set
++CONFIG_BINFMT_ELF32=y
++CONFIG_BLOCK_COMPAT=y
++CONFIG_BOOT_ELF32=y
++CONFIG_BROADCOM_PHY=y
++CONFIG_CEVT_SB1250=y
++CONFIG_CFE=y
++CONFIG_COMPAT=y
++CONFIG_COMPAT_NETLINK_MESSAGES=y
++CONFIG_CPU_BIG_ENDIAN=y
++CONFIG_CPU_HAS_PREFETCH=y
++CONFIG_CPU_HAS_SYNC=y
++# CONFIG_CPU_LITTLE_ENDIAN is not set
++CONFIG_CPU_SB1=y
++# CONFIG_CPU_SB1_PASS_2_112x is not set
++CONFIG_CPU_SB1_PASS_3=y
++CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
++CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y
++CONFIG_CPU_SUPPORTS_HIGHMEM=y
++CONFIG_CSRC_SB1250=y
++# CONFIG_CYCLADES is not set
++CONFIG_DECOMPRESS_LZMA=y
++CONFIG_DMA_COHERENT=y
++CONFIG_EARLY_PRINTK=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_PCI_IOMAP=y
++CONFIG_HAS_DMA=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAVE_ARCH_JUMP_LABEL=y
++CONFIG_HAVE_ARCH_KGDB=y
++CONFIG_HAVE_C_RECORDMCOUNT=y
++CONFIG_HAVE_DMA_API_DEBUG=y
++CONFIG_HAVE_DMA_ATTRS=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_HAVE_GENERIC_HARDIRQS=y
++CONFIG_HAVE_IDE=y
++CONFIG_HAVE_IRQ_WORK=y
++CONFIG_HAVE_MEMBLOCK=y
++CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
++CONFIG_HAVE_OPROFILE=y
++CONFIG_HAVE_PERF_EVENTS=y
++CONFIG_HAVE_SYSCALL_WRAPPERS=y
++CONFIG_HWMON=y
++CONFIG_HWMON_DEBUG_CHIP=y
++CONFIG_HW_HAS_PCI=y
++CONFIG_HZ=250
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++CONFIG_I2C_CHARDEV=y
++CONFIG_I2C_HELPER_AUTO=y
++CONFIG_I2C_SIBYTE=y
++CONFIG_INITRAMFS_ROOT_GID=0
++CONFIG_INITRAMFS_ROOT_UID=0
++CONFIG_INITRAMFS_SOURCE="../../root"
++# CONFIG_IP_ROUTE_VERBOSE is not set
++CONFIG_IRQ_CPU=y
++CONFIG_IRQ_FORCED_THREADING=y
++# CONFIG_ISI is not set
++CONFIG_LOG_BUF_SHIFT=15
++CONFIG_MDIO_BOARDINFO=y
++CONFIG_MIPS=y
++CONFIG_MIPS32_COMPAT=y
++# CONFIG_MIPS32_N32 is not set
++CONFIG_MIPS32_O32=y
++CONFIG_MIPS_L1_CACHE_SHIFT=5
++# CONFIG_MIPS_MACHINE is not set
++CONFIG_MIPS_MT_DISABLED=y
++# CONFIG_MOXA_INTELLIO is not set
++# CONFIG_MOXA_SMARTIO is not set
++CONFIG_MTD_PHYSMAP=y
++CONFIG_NEED_PER_CPU_KM=y
++CONFIG_NO_GENERIC_PCI_IOPORT_MAP=y
++# CONFIG_N_HDLC is not set
++CONFIG_PAGEFLAGS_EXTENDED=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PERF_USE_VMALLOC=y
++CONFIG_PHYLIB=y
++CONFIG_PHYS_ADDR_T_64BIT=y
++# CONFIG_PREEMPT_RCU is not set
++# CONFIG_ROCKETPORT is not set
++CONFIG_RTC_CLASS=y
++# CONFIG_RTC_DRV_CMOS is not set
++CONFIG_RTC_DRV_M41T80=y
++# CONFIG_RTC_DRV_M41T80_WDT is not set
++CONFIG_SB1250_MAC=y
++# CONFIG_SB1XXX_CORELIS is not set
++# CONFIG_SB1_CERR_STALL is not set
++# CONFIG_SB1_CEX_ALWAYS_FATAL is not set
++# CONFIG_SCSI_DMA is not set
++CONFIG_SENSORS_LM90=y
++# CONFIG_SERIAL_8250 is not set
++CONFIG_SERIAL_NONSTANDARD=y
++CONFIG_SERIAL_SB1250_DUART=y
++CONFIG_SERIAL_SB1250_DUART_CONSOLE=y
++CONFIG_SIBYTE_BCM1125H=y
++CONFIG_SIBYTE_BCM112X=y
++# CONFIG_SIBYTE_BUS_WATCHER is not set
++# CONFIG_SIBYTE_CFE_CONSOLE is not set
++# CONFIG_SIBYTE_DMA_PAGEOPS is not set
++CONFIG_SIBYTE_ENABLE_LDT_IF_PCI=y
++CONFIG_SIBYTE_HAS_LDT=y
++CONFIG_SIBYTE_HAS_ZBUS_PROFILING=y
++CONFIG_SIBYTE_RHONE=y
++CONFIG_SIBYTE_SB1xxx_SOC=y
++# CONFIG_SIBYTE_TBPROF is not set
++# CONFIG_STALDRV is not set
++CONFIG_SWAP_IO_SPACE=y
++# CONFIG_SYNCLINKMP is not set
++# CONFIG_SYNCLINK_GT is not set
++CONFIG_SYSVIPC_COMPAT=y
++CONFIG_SYS_HAS_CPU_SB1=y
++CONFIG_SYS_HAS_EARLY_PRINTK=y
++CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
++CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y
++CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
++CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
++CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
++# CONFIG_WATCHDOG is not set
++CONFIG_WEAK_ORDERING=y
++CONFIG_ZONE_DMA_FLAG=0
+diff --git a/feeds/targets/cns21xx/sibyte/image/Makefile b/feeds/targets/cns21xx/sibyte/image/Makefile
+new file mode 100644
+index 0000000..9a25ace
+--- /dev/null
++++ b/feeds/targets/cns21xx/sibyte/image/Makefile
+@@ -0,0 +1,38 @@
++#
++# Copyright (C) 2007-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/image.mk
++
++define Image/BuildKernel
++ cp $(LINUX_DIR)/vmlinux $(BIN_DIR)/$(IMG_PREFIX)-vmlinux
++# uImage
++ dd if=$(KDIR)/vmlinux of=$(KDIR)/$(IMG_PREFIX)-vmlinux bs=64k conv=sync
++ mkimage -A mips -O linux -T kernel -a 0x80100000 -C none -e \
++ 0x80100000 \
++ -n 'MIPS OpenWrt Linux-$(LINUX_VERSION)' \
++ -d $(KDIR)/$(IMG_PREFIX)-vmlinux $(BIN_DIR)/$(IMG_PREFIX)-uImage
++endef
++
++define Image/Build
++ $(call Image/Build/$(1),$(1))
++endef
++
++define Image/Build/jffs2-64k
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1).img bs=65536 conv=sync
++endef
++
++define Image/Build/jffs2-128k
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1).img bs=131072 conv=sync
++ $(call Image/Build/slug,$(1))
++endef
++
++define Image/Build/squashfs
++ $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1).img bs=131072 conv=sync
++endef
++
++$(eval $(call BuildImage))
+diff --git a/feeds/targets/cns21xx/sibyte/patches-3.3/101-rhone_physmap.patch b/feeds/targets/cns21xx/sibyte/patches-3.3/101-rhone_physmap.patch
+new file mode 100644
+index 0000000..fb91737
+--- /dev/null
++++ b/feeds/targets/cns21xx/sibyte/patches-3.3/101-rhone_physmap.patch
+@@ -0,0 +1,82 @@
++--- a/arch/mips/sibyte/swarm/platform.c
+++++ b/arch/mips/sibyte/swarm/platform.c
++@@ -5,6 +5,7 @@
++ #include <linux/platform_device.h>
++ #include <linux/ata_platform.h>
++
+++#include <asm/addrspace.h>
++ #include <asm/sibyte/board.h>
++ #include <asm/sibyte/sb1250_genbus.h>
++ #include <asm/sibyte/sb1250_regs.h>
++@@ -137,3 +138,71 @@ static int __init sb1250_device_init(voi
++ return ret;
++ }
++ device_initcall(sb1250_device_init);
+++
+++#ifdef CONFIG_SIBYTE_RHONE
+++
+++#include <linux/mtd/partitions.h>
+++#include <linux/mtd/physmap.h>
+++
+++/* The board has 16MB flash but CFE sets up only 2MB */
+++#define PHYS_TO_K1(a) CKSEG1ADDR(a)
+++#define BOOTROM_SIZE 0x100
+++
+++static void fixup_cs0_size(void)
+++{
+++ SBWRITECSR(((A_IO_EXT_CS_BASE(0)) + R_IO_EXT_MULT_SIZE), BOOTROM_SIZE);
+++}
+++
+++static struct mtd_partition flash_parts[] = {
+++ {
+++ .name = "cfe",
+++ .offset = 0x00000000,
+++ .size = 0x00200000,
+++ .mask_flags = MTD_WRITEABLE,
+++ },
+++ {
+++ .name = "os",
+++ .offset = 0x00200000,
+++ .size = 0x00d00000,
+++ },
+++ {
+++ .name = "environment",
+++ .offset = 0x00f00000,
+++ .size = 0x00100000,
+++ .mask_flags = MTD_WRITEABLE,
+++ },
+++};
+++
+++static struct physmap_flash_data flash_data = {
+++ .width = 1,
+++ .nr_parts = ARRAY_SIZE(flash_parts),
+++ .parts = flash_parts,
+++};
+++
+++static struct resource flash_resource = {
+++ .start = 0x1fc00000,
+++ .end = 0x20bfffff,
+++ .flags = IORESOURCE_MEM,
+++};
+++
+++static struct platform_device flash_device = {
+++ .name = "physmap-flash",
+++ .id = 0,
+++ .resource = &flash_resource,
+++ .num_resources = 1,
+++ .dev = {
+++ .platform_data = &flash_data,
+++ },
+++};
+++
+++static int __init flash_setup(void)
+++{
+++ fixup_cs0_size();
+++ platform_device_register(&flash_device);
+++
+++ return 0;
+++};
+++
+++device_initcall(flash_setup);
+++
+++#endif /* CONFIG_SIBYTE_RHONE */
+diff --git a/feeds/targets/cns21xx/sibyte/patches-3.3/103-m41t80_smbus.patch b/feeds/targets/cns21xx/sibyte/patches-3.3/103-m41t80_smbus.patch
+new file mode 100644
+index 0000000..667d07c
+--- /dev/null
++++ b/feeds/targets/cns21xx/sibyte/patches-3.3/103-m41t80_smbus.patch
+@@ -0,0 +1,367 @@
++--- a/drivers/rtc/rtc-m41t80.c
+++++ b/drivers/rtc/rtc-m41t80.c
++@@ -6,6 +6,7 @@
++ * Based on m41t00.c by Mark A. Greer <mgreer@mvista.com>
++ *
++ * 2006 (c) mycable GmbH
+++ * Copyright (c) 2008 Maciej W. Rozycki
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++@@ -38,6 +39,8 @@
++ #define M41T80_REG_DAY 5
++ #define M41T80_REG_MON 6
++ #define M41T80_REG_YEAR 7
+++#define M41T80_REG_CONTROL 8
+++#define M41T80_REG_WATCHDOG 9
++ #define M41T80_REG_ALARM_MON 0xa
++ #define M41T80_REG_ALARM_DAY 0xb
++ #define M41T80_REG_ALARM_HOUR 0xc
++@@ -66,7 +69,7 @@
++ #define M41T80_FEATURE_WD (1 << 3) /* Extra watchdog resolution */
++ #define M41T80_FEATURE_SQ_ALT (1 << 4) /* RSx bits are in reg 4 */
++
++-#define DRV_VERSION "0.05"
+++#define DRV_VERSION "0.06"
++
++ static DEFINE_MUTEX(m41t80_rtc_mutex);
++ static const struct i2c_device_id m41t80_id[] = {
++@@ -89,31 +92,88 @@ struct m41t80_data {
++ struct rtc_device *rtc;
++ };
++
++-static int m41t80_get_datetime(struct i2c_client *client,
++- struct rtc_time *tm)
+++
+++static int m41t80_write_block_data(struct i2c_client *client,
+++ u8 reg, u8 num, u8 *buf)
++ {
++- u8 buf[M41T80_DATETIME_REG_SIZE], dt_addr[1] = { M41T80_REG_SEC };
++- struct i2c_msg msgs[] = {
++- {
++- .addr = client->addr,
++- .flags = 0,
++- .len = 1,
++- .buf = dt_addr,
++- },
++- {
++- .addr = client->addr,
++- .flags = I2C_M_RD,
++- .len = M41T80_DATETIME_REG_SIZE - M41T80_REG_SEC,
++- .buf = buf + M41T80_REG_SEC,
++- },
++- };
+++ int i, rc;
++
++- if (i2c_transfer(client->adapter, msgs, 2) < 0) {
++- dev_err(&client->dev, "read error\n");
++- return -EIO;
+++ if (i2c_check_functionality(client->adapter,
+++ I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)) {
+++ i = i2c_smbus_write_i2c_block_data(client, reg, num, buf);
+++ } else {
+++ for (i = 0; i < num; i++) {
+++ rc = i2c_smbus_write_byte_data(client, reg + i,
+++ buf[i]);
+++ if (rc < 0) {
+++ i = rc;
+++ goto out;
+++ }
+++ }
++ }
+++out:
+++ return i;
+++}
+++
+++static int m41t80_read_block_data(struct i2c_client *client,
+++ u8 reg, u8 num, u8 *buf)
+++{
+++ int i, rc;
+++
+++ if (i2c_check_functionality(client->adapter,
+++ I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
+++ i = i2c_smbus_read_i2c_block_data(client, reg, num, buf);
+++ } else {
+++ for (i = 0; i < num; i++) {
+++ rc = i2c_smbus_read_byte_data(client, reg + i);
+++ if (rc < 0) {
+++ i = rc;
+++ goto out;
+++ }
+++ buf[i] = rc;
+++ }
+++ }
+++out:
+++ return i;
+++}
+++
+++static int m41t80_get_datetime(struct i2c_client *client, struct rtc_time *tm)
+++{
+++ u8 buf[M41T80_DATETIME_REG_SIZE];
+++ int loops = 2;
+++ int sec0, sec1;
+++
+++ /*
+++ * Time registers are latched by this chip if an I2C block
+++ * transfer is used, but with SMBus-style byte accesses
+++ * this is not the case, so check seconds for a wraparound.
+++ */
+++ do {
+++ if (m41t80_read_block_data(client, M41T80_REG_SEC,
+++ M41T80_DATETIME_REG_SIZE -
+++ M41T80_REG_SEC,
+++ buf + M41T80_REG_SEC) < 0) {
+++ dev_err(&client->dev, "read error\n");
+++ return -EIO;
+++ }
+++ if (i2c_check_functionality(client->adapter,
+++ I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
+++ sec1 = buf[M41T80_REG_SEC];
+++ break;
+++ }
+++
+++ sec0 = buf[M41T80_REG_SEC];
+++ sec1 = i2c_smbus_read_byte_data(client, M41T80_REG_SEC);
+++ if (sec1 < 0) {
+++ dev_err(&client->dev, "read error\n");
+++ return -EIO;
+++ }
+++
+++ sec0 = bcd2bin(sec0 & 0x7f);
+++ sec1 = bcd2bin(sec1 & 0x7f);
+++ } while (sec1 < sec0 && --loops);
++
++- tm->tm_sec = bcd2bin(buf[M41T80_REG_SEC] & 0x7f);
+++ tm->tm_sec = sec1;
++ tm->tm_min = bcd2bin(buf[M41T80_REG_MIN] & 0x7f);
++ tm->tm_hour = bcd2bin(buf[M41T80_REG_HOUR] & 0x3f);
++ tm->tm_mday = bcd2bin(buf[M41T80_REG_DAY] & 0x3f);
++@@ -128,39 +188,16 @@ static int m41t80_get_datetime(struct i2
++ /* Sets the given date and time to the real time clock. */
++ static int m41t80_set_datetime(struct i2c_client *client, struct rtc_time *tm)
++ {
++- u8 wbuf[1 + M41T80_DATETIME_REG_SIZE];
++- u8 *buf = &wbuf[1];
++- u8 dt_addr[1] = { M41T80_REG_SEC };
++- struct i2c_msg msgs_in[] = {
++- {
++- .addr = client->addr,
++- .flags = 0,
++- .len = 1,
++- .buf = dt_addr,
++- },
++- {
++- .addr = client->addr,
++- .flags = I2C_M_RD,
++- .len = M41T80_DATETIME_REG_SIZE - M41T80_REG_SEC,
++- .buf = buf + M41T80_REG_SEC,
++- },
++- };
++- struct i2c_msg msgs[] = {
++- {
++- .addr = client->addr,
++- .flags = 0,
++- .len = 1 + M41T80_DATETIME_REG_SIZE,
++- .buf = wbuf,
++- },
++- };
+++ u8 buf[M41T80_DATETIME_REG_SIZE];
++
++ /* Read current reg values into buf[1..7] */
++- if (i2c_transfer(client->adapter, msgs_in, 2) < 0) {
+++ if (m41t80_read_block_data(client, M41T80_REG_SEC,
+++ M41T80_DATETIME_REG_SIZE - M41T80_REG_SEC,
+++ buf + M41T80_REG_SEC) < 0) {
++ dev_err(&client->dev, "read error\n");
++ return -EIO;
++ }
++
++- wbuf[0] = 0; /* offset into rtc's regs */
++ /* Merge time-data and register flags into buf[0..7] */
++ buf[M41T80_REG_SSEC] = 0;
++ buf[M41T80_REG_SEC] =
++@@ -178,7 +215,8 @@ static int m41t80_set_datetime(struct i2
++ /* assume 20YY not 19YY */
++ buf[M41T80_REG_YEAR] = bin2bcd(tm->tm_year % 100);
++
++- if (i2c_transfer(client->adapter, msgs, 1) != 1) {
+++ if (m41t80_write_block_data(client, M41T80_REG_SSEC,
+++ M41T80_DATETIME_REG_SIZE, buf) < 0) {
++ dev_err(&client->dev, "write error\n");
++ return -EIO;
++ }
++@@ -238,34 +276,11 @@ err:
++ static int m41t80_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *t)
++ {
++ struct i2c_client *client = to_i2c_client(dev);
++- u8 wbuf[1 + M41T80_ALARM_REG_SIZE];
++- u8 *buf = &wbuf[1];
+++ u8 buf[M41T80_ALARM_REG_SIZE];
++ u8 *reg = buf - M41T80_REG_ALARM_MON;
++- u8 dt_addr[1] = { M41T80_REG_ALARM_MON };
++- struct i2c_msg msgs_in[] = {
++- {
++- .addr = client->addr,
++- .flags = 0,
++- .len = 1,
++- .buf = dt_addr,
++- },
++- {
++- .addr = client->addr,
++- .flags = I2C_M_RD,
++- .len = M41T80_ALARM_REG_SIZE,
++- .buf = buf,
++- },
++- };
++- struct i2c_msg msgs[] = {
++- {
++- .addr = client->addr,
++- .flags = 0,
++- .len = 1 + M41T80_ALARM_REG_SIZE,
++- .buf = wbuf,
++- },
++- };
++
++- if (i2c_transfer(client->adapter, msgs_in, 2) < 0) {
+++ if (m41t80_read_block_data(client, M41T80_REG_ALARM_MON,
+++ M41T80_ALARM_REG_SIZE, buf) < 0) {
++ dev_err(&client->dev, "read error\n");
++ return -EIO;
++ }
++@@ -275,7 +290,6 @@ static int m41t80_rtc_set_alarm(struct d
++ reg[M41T80_REG_ALARM_MIN] = 0;
++ reg[M41T80_REG_ALARM_SEC] = 0;
++
++- wbuf[0] = M41T80_REG_ALARM_MON; /* offset into rtc's regs */
++ reg[M41T80_REG_ALARM_SEC] |= t->time.tm_sec >= 0 ?
++ bin2bcd(t->time.tm_sec) : 0x80;
++ reg[M41T80_REG_ALARM_MIN] |= t->time.tm_min >= 0 ?
++@@ -289,7 +303,8 @@ static int m41t80_rtc_set_alarm(struct d
++ else
++ reg[M41T80_REG_ALARM_DAY] |= 0x40;
++
++- if (i2c_transfer(client->adapter, msgs, 1) != 1) {
+++ if (m41t80_write_block_data(client, M41T80_REG_ALARM_MON,
+++ M41T80_ALARM_REG_SIZE, buf) < 0) {
++ dev_err(&client->dev, "write error\n");
++ return -EIO;
++ }
++@@ -309,24 +324,10 @@ static int m41t80_rtc_read_alarm(struct
++ {
++ struct i2c_client *client = to_i2c_client(dev);
++ u8 buf[M41T80_ALARM_REG_SIZE + 1]; /* all alarm regs and flags */
++- u8 dt_addr[1] = { M41T80_REG_ALARM_MON };
++ u8 *reg = buf - M41T80_REG_ALARM_MON;
++- struct i2c_msg msgs[] = {
++- {
++- .addr = client->addr,
++- .flags = 0,
++- .len = 1,
++- .buf = dt_addr,
++- },
++- {
++- .addr = client->addr,
++- .flags = I2C_M_RD,
++- .len = M41T80_ALARM_REG_SIZE + 1,
++- .buf = buf,
++- },
++- };
++
++- if (i2c_transfer(client->adapter, msgs, 2) < 0) {
+++ if (m41t80_read_block_data(client, M41T80_REG_ALARM_MON,
+++ M41T80_ALARM_REG_SIZE + 1, buf) < 0) {
++ dev_err(&client->dev, "read error\n");
++ return -EIO;
++ }
++@@ -508,26 +509,16 @@ static int boot_flag;
++ */
++ static void wdt_ping(void)
++ {
++- unsigned char i2c_data[2];
++- struct i2c_msg msgs1[1] = {
++- {
++- .addr = save_client->addr,
++- .flags = 0,
++- .len = 2,
++- .buf = i2c_data,
++- },
++- };
++- struct m41t80_data *clientdata = i2c_get_clientdata(save_client);
+++ u8 wdt = 0x80; /* WDS = 1 (0x80) */
++
++- i2c_data[0] = 0x09; /* watchdog register */
+++ struct m41t80_data *clientdata = i2c_get_clientdata(save_client);
++
++ if (wdt_margin > 31)
++- i2c_data[1] = (wdt_margin & 0xFC) | 0x83; /* resolution = 4s */
+++ /* mulitplier = WD_TIMO / 4, resolution = 4s (0x3) */
+++ wdt |= (wdt_margin & 0xfc) | 0x3;
++ else
++- /*
++- * WDS = 1 (0x80), mulitplier = WD_TIMO, resolution = 1s (0x02)
++- */
++- i2c_data[1] = wdt_margin<<2 | 0x82;
+++ /* mulitplier = WD_TIMO, resolution = 1s (0x2) */
+++ wdt |= wdt_margin << 2 | 0x2;
++
++ /*
++ * M41T65 has three bits for watchdog resolution. Don't set bit 7, as
++@@ -536,7 +527,7 @@ static void wdt_ping(void)
++ if (clientdata->features & M41T80_FEATURE_WD)
++ i2c_data[1] &= ~M41T80_WATCHDOG_RB2;
++
++- i2c_transfer(save_client->adapter, msgs1, 1);
+++ i2c_smbus_write_byte_data(save_client, M41T80_REG_WATCHDOG, wdt);
++ }
++
++ /**
++@@ -546,36 +537,8 @@ static void wdt_ping(void)
++ */
++ static void wdt_disable(void)
++ {
++- unsigned char i2c_data[2], i2c_buf[0x10];
++- struct i2c_msg msgs0[2] = {
++- {
++- .addr = save_client->addr,
++- .flags = 0,
++- .len = 1,
++- .buf = i2c_data,
++- },
++- {
++- .addr = save_client->addr,
++- .flags = I2C_M_RD,
++- .len = 1,
++- .buf = i2c_buf,
++- },
++- };
++- struct i2c_msg msgs1[1] = {
++- {
++- .addr = save_client->addr,
++- .flags = 0,
++- .len = 2,
++- .buf = i2c_data,
++- },
++- };
++-
++- i2c_data[0] = 0x09;
++- i2c_transfer(save_client->adapter, msgs0, 2);
++-
++- i2c_data[0] = 0x09;
++- i2c_data[1] = 0x00;
++- i2c_transfer(save_client->adapter, msgs1, 1);
+++ i2c_smbus_read_byte_data(save_client, M41T80_REG_WATCHDOG);
+++ i2c_smbus_write_byte_data(save_client, M41T80_REG_WATCHDOG, 0);
++ }
++
++ /**
++@@ -777,8 +740,8 @@ static int m41t80_probe(struct i2c_clien
++ struct rtc_time tm;
++ struct m41t80_data *clientdata = NULL;
++
++- if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C
++- | I2C_FUNC_SMBUS_BYTE_DATA)) {
+++ if (!i2c_check_functionality(client->adapter,
+++ I2C_FUNC_SMBUS_BYTE_DATA)) {
++ rc = -ENODEV;
++ goto exit;
++ }
+diff --git a/feeds/targets/cns21xx/sibyte/patches-3.3/104-sibyte_rtc_cleanup.patch b/feeds/targets/cns21xx/sibyte/patches-3.3/104-sibyte_rtc_cleanup.patch
+new file mode 100644
+index 0000000..0483142
+--- /dev/null
++++ b/feeds/targets/cns21xx/sibyte/patches-3.3/104-sibyte_rtc_cleanup.patch
+@@ -0,0 +1,80 @@
++--- a/arch/mips/sibyte/swarm/setup.c
+++++ b/arch/mips/sibyte/swarm/setup.c
++@@ -56,14 +56,6 @@ extern void sb1250_setup(void);
++ #error invalid SiByte board configuration
++ #endif
++
++-extern int xicor_probe(void);
++-extern int xicor_set_time(unsigned long);
++-extern unsigned long xicor_get_time(void);
++-
++-extern int m41t81_probe(void);
++-extern int m41t81_set_time(unsigned long);
++-extern unsigned long m41t81_get_time(void);
++-
++ const char *get_system_type(void)
++ {
++ return "SiByte " SIBYTE_BOARD_NAME;
++@@ -79,49 +71,18 @@ int swarm_be_handler(struct pt_regs *reg
++ return (is_fixup ? MIPS_BE_FIXUP : MIPS_BE_FATAL);
++ }
++
++-enum swarm_rtc_type {
++- RTC_NONE,
++- RTC_XICOR,
++- RTC_M41T81,
++-};
++-
++-enum swarm_rtc_type swarm_rtc_type;
++-
++ void read_persistent_clock(struct timespec *ts)
++ {
++ unsigned long sec;
++
++- switch (swarm_rtc_type) {
++- case RTC_XICOR:
++- sec = xicor_get_time();
++- break;
++-
++- case RTC_M41T81:
++- sec = m41t81_get_time();
++- break;
++-
++- case RTC_NONE:
++- default:
++- sec = mktime(2000, 1, 1, 0, 0, 0);
++- break;
++- }
+++ sec = mktime(2000, 1, 1, 0, 0, 0);
++ ts->tv_sec = sec;
++ ts->tv_nsec = 0;
++ }
++
++ int rtc_mips_set_time(unsigned long sec)
++ {
++- switch (swarm_rtc_type) {
++- case RTC_XICOR:
++- return xicor_set_time(sec);
++-
++- case RTC_M41T81:
++- return m41t81_set_time(sec);
++-
++- case RTC_NONE:
++- default:
++ return -1;
++- }
++ }
++
++ void __init plat_mem_setup(void)
++@@ -138,11 +99,6 @@ void __init plat_mem_setup(void)
++
++ board_be_handler = swarm_be_handler;
++
++- if (xicor_probe())
++- swarm_rtc_type = RTC_XICOR;
++- if (m41t81_probe())
++- swarm_rtc_type = RTC_M41T81;
++-
++ #ifdef CONFIG_VT
++ screen_info = (struct screen_info) {
++ .orig_video_page = 52,
+diff --git a/feeds/targets/cns21xx/sibyte/patches-3.3/105-sibyte_hwmon.patch b/feeds/targets/cns21xx/sibyte/patches-3.3/105-sibyte_hwmon.patch
+new file mode 100644
+index 0000000..93dd423
+--- /dev/null
++++ b/feeds/targets/cns21xx/sibyte/patches-3.3/105-sibyte_hwmon.patch
+@@ -0,0 +1,23 @@
++--- a/arch/mips/sibyte/swarm/swarm-i2c.c
+++++ b/arch/mips/sibyte/swarm/swarm-i2c.c
++@@ -13,6 +13,11 @@
++ #include <linux/init.h>
++ #include <linux/kernel.h>
++
+++static struct i2c_board_info swarm_i2c_info0[] __initdata = {
+++ {
+++ I2C_BOARD_INFO("lm90", 0x2a),
+++ },
+++};
++
++ static struct i2c_board_info swarm_i2c_info1[] __initdata = {
++ {
++@@ -24,6 +29,8 @@ static int __init swarm_i2c_init(void)
++ {
++ int err;
++
+++ err = i2c_register_board_info(0, swarm_i2c_info0,
+++ ARRAY_SIZE(swarm_i2c_info0));
++ err = i2c_register_board_info(1, swarm_i2c_info1,
++ ARRAY_SIZE(swarm_i2c_info1));
++ if (err < 0)
+diff --git a/feeds/targets/cns21xx/sibyte/patches-3.3/106-no_module_reloc.patch b/feeds/targets/cns21xx/sibyte/patches-3.3/106-no_module_reloc.patch
+new file mode 100644
+index 0000000..8082c3d
+--- /dev/null
++++ b/feeds/targets/cns21xx/sibyte/patches-3.3/106-no_module_reloc.patch
+@@ -0,0 +1,370 @@
++--- a/arch/mips/Makefile
+++++ b/arch/mips/Makefile
++@@ -90,8 +90,8 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
++ cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
++ cflags-y += -msoft-float
++ LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
++-KBUILD_AFLAGS_MODULE += -mno-long-calls
++-KBUILD_CFLAGS_MODULE += -mno-long-calls
+++KBUILD_AFLAGS_MODULE += -mlong-calls
+++KBUILD_CFLAGS_MODULE += -mlong-calls
++
++ cflags-y += -ffreestanding
++
++--- a/arch/mips/include/asm/module.h
+++++ b/arch/mips/include/asm/module.h
++@@ -9,11 +9,6 @@ struct mod_arch_specific {
++ struct list_head dbe_list;
++ const struct exception_table_entry *dbe_start;
++ const struct exception_table_entry *dbe_end;
++-
++- void *phys_plt_tbl;
++- void *virt_plt_tbl;
++- unsigned int phys_plt_offset;
++- unsigned int virt_plt_offset;
++ };
++
++ typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */
++--- a/arch/mips/kernel/module.c
+++++ b/arch/mips/kernel/module.c
++@@ -44,117 +44,6 @@ static struct mips_hi16 *mips_hi16_list;
++ static LIST_HEAD(dbe_list);
++ static DEFINE_SPINLOCK(dbe_lock);
++
++-/*
++- * Get the potential max trampolines size required of the init and
++- * non-init sections. Only used if we cannot find enough contiguous
++- * physically mapped memory to put the module into.
++- */
++-static unsigned int
++-get_plt_size(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs,
++- const char *secstrings, unsigned int symindex, bool is_init)
++-{
++- unsigned long ret = 0;
++- unsigned int i, j;
++- Elf_Sym *syms;
++-
++- /* Everything marked ALLOC (this includes the exported symbols) */
++- for (i = 1; i < hdr->e_shnum; ++i) {
++- unsigned int info = sechdrs[i].sh_info;
++-
++- if (sechdrs[i].sh_type != SHT_REL
++- && sechdrs[i].sh_type != SHT_RELA)
++- continue;
++-
++- /* Not a valid relocation section? */
++- if (info >= hdr->e_shnum)
++- continue;
++-
++- /* Don't bother with non-allocated sections */
++- if (!(sechdrs[info].sh_flags & SHF_ALLOC))
++- continue;
++-
++- /* If it's called *.init*, and we're not init, we're
++- not interested */
++- if ((strstr(secstrings + sechdrs[i].sh_name, ".init") != 0)
++- != is_init)
++- continue;
++-
++- syms = (Elf_Sym *) sechdrs[symindex].sh_addr;
++- if (sechdrs[i].sh_type == SHT_REL) {
++- Elf_Mips_Rel *rel = (void *) sechdrs[i].sh_addr;
++- unsigned int size = sechdrs[i].sh_size / sizeof(*rel);
++-
++- for (j = 0; j < size; ++j) {
++- Elf_Sym *sym;
++-
++- if (ELF_MIPS_R_TYPE(rel[j]) != R_MIPS_26)
++- continue;
++-
++- sym = syms + ELF_MIPS_R_SYM(rel[j]);
++- if (!is_init && sym->st_shndx != SHN_UNDEF)
++- continue;
++-
++- ret += 4 * sizeof(int);
++- }
++- } else {
++- Elf_Mips_Rela *rela = (void *) sechdrs[i].sh_addr;
++- unsigned int size = sechdrs[i].sh_size / sizeof(*rela);
++-
++- for (j = 0; j < size; ++j) {
++- Elf_Sym *sym;
++-
++- if (ELF_MIPS_R_TYPE(rela[j]) != R_MIPS_26)
++- continue;
++-
++- sym = syms + ELF_MIPS_R_SYM(rela[j]);
++- if (!is_init && sym->st_shndx != SHN_UNDEF)
++- continue;
++-
++- ret += 4 * sizeof(int);
++- }
++- }
++- }
++-
++- return ret;
++-}
++-
++-#ifndef MODULE_START
++-static void *alloc_phys(unsigned long size)
++-{
++- unsigned order;
++- struct page *page;
++- struct page *p;
++-
++- size = PAGE_ALIGN(size);
++- order = get_order(size);
++-
++- page = alloc_pages(GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN |
++- __GFP_THISNODE, order);
++- if (!page)
++- return NULL;
++-
++- split_page(page, order);
++-
++- for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p)
++- __free_page(p);
++-
++- return page_address(page);
++-}
++-#endif
++-
++-static void free_phys(void *ptr, unsigned long size)
++-{
++- struct page *page;
++- struct page *end;
++-
++- page = virt_to_page(ptr);
++- end = page + (PAGE_ALIGN(size) >> PAGE_SHIFT);
++-
++- for (; page < end; ++page)
++- __free_page(page);
++-}
++-
++-
++ void *module_alloc(unsigned long size)
++ {
++ #ifdef MODULE_START
++@@ -162,99 +51,21 @@ void *module_alloc(unsigned long size)
++ GFP_KERNEL, PAGE_KERNEL, -1,
++ __builtin_return_address(0));
++ #else
++- void *ptr;
++-
++ if (size == 0)
++ return NULL;
++-
++- ptr = alloc_phys(size);
++-
++- /* If we failed to allocate physically contiguous memory,
++- * fall back to regular vmalloc. The module loader code will
++- * create jump tables to handle long jumps */
++- if (!ptr)
++- return vmalloc(size);
++-
++- return ptr;
++-#endif
++-}
++-
++-static inline bool is_phys_addr(void *ptr)
++-{
++-#ifdef CONFIG_64BIT
++- return (KSEGX((unsigned long)ptr) == CKSEG0);
++-#else
++- return (KSEGX(ptr) == KSEG0);
+++ return vmalloc(size);
++ #endif
++ }
++
++ /* Free memory returned from module_alloc */
++ void module_free(struct module *mod, void *module_region)
++ {
++- if (is_phys_addr(module_region)) {
++- if (mod->module_init == module_region)
++- free_phys(module_region, mod->init_size);
++- else if (mod->module_core == module_region)
++- free_phys(module_region, mod->core_size);
++- else
++- BUG();
++- } else {
++- vfree(module_region);
++- }
++-}
++-
++-static void *__module_alloc(int size, bool phys)
++-{
++- void *ptr;
++-
++- if (phys)
++- ptr = kmalloc(size, GFP_KERNEL);
++- else
++- ptr = vmalloc(size);
++- return ptr;
++-}
++-
++-static void __module_free(void *ptr)
++-{
++- if (is_phys_addr(ptr))
++- kfree(ptr);
++- else
++- vfree(ptr);
+++ vfree(module_region);
++ }
++
++ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
++ char *secstrings, struct module *mod)
++ {
++- unsigned int symindex = 0;
++- unsigned int core_size, init_size;
++- int i;
++-
++- for (i = 1; i < hdr->e_shnum; i++)
++- if (sechdrs[i].sh_type == SHT_SYMTAB)
++- symindex = i;
++-
++- core_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false);
++- init_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true);
++-
++- mod->arch.phys_plt_offset = 0;
++- mod->arch.virt_plt_offset = 0;
++- mod->arch.phys_plt_tbl = NULL;
++- mod->arch.virt_plt_tbl = NULL;
++-
++- if ((core_size + init_size) == 0)
++- return 0;
++-
++- mod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1);
++- if (!mod->arch.phys_plt_tbl)
++- return -ENOMEM;
++-
++- mod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0);
++- if (!mod->arch.virt_plt_tbl) {
++- __module_free(mod->arch.phys_plt_tbl);
++- mod->arch.phys_plt_tbl = NULL;
++- return -ENOMEM;
++- }
++-
++ return 0;
++ }
++
++@@ -277,36 +88,28 @@ static int apply_r_mips_32_rela(struct m
++ return 0;
++ }
++
++-static Elf_Addr add_plt_entry_to(unsigned *plt_offset,
++- void *start, Elf_Addr v)
+++static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
++ {
++- unsigned *tramp = start + *plt_offset;
++- *plt_offset += 4 * sizeof(int);
++-
++- /* adjust carry for addiu */
++- if (v & 0x00008000)
++- v += 0x10000;
++-
++- tramp[0] = 0x3c190000 | (v >> 16); /* lui t9, hi16 */
++- tramp[1] = 0x27390000 | (v & 0xffff); /* addiu t9, t9, lo16 */
++- tramp[2] = 0x03200008; /* jr t9 */
++- tramp[3] = 0x00000000; /* nop */
+++ if (v % 4) {
+++ pr_err("module %s: dangerous R_MIPS_26 REL relocation\n",
+++ me->name);
+++ return -ENOEXEC;
+++ }
++
++- return (Elf_Addr) tramp;
++-}
+++ if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
+++ printk(KERN_ERR
+++ "module %s: relocation overflow\n",
+++ me->name);
+++ return -ENOEXEC;
+++ }
++
++-static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v)
++-{
++- if (is_phys_addr(location))
++- return add_plt_entry_to(&me->arch.phys_plt_offset,
++- me->arch.phys_plt_tbl, v);
++- else
++- return add_plt_entry_to(&me->arch.virt_plt_offset,
++- me->arch.virt_plt_tbl, v);
+++ *location = (*location & ~0x03ffffff) |
+++ ((*location + (v >> 2)) & 0x03ffffff);
++
+++ return 0;
++ }
++
++-static int set_r_mips_26(struct module *me, u32 *location, u32 ofs, Elf_Addr v)
+++static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)
++ {
++ if (v % 4) {
++ pr_err("module %s: dangerous R_MIPS_26 RELArelocation\n",
++@@ -315,31 +118,17 @@ static int set_r_mips_26(struct module *
++ }
++
++ if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
++- v = add_plt_entry(me, location, v + (ofs << 2));
++- if (!v) {
++- printk(KERN_ERR
+++ printk(KERN_ERR
++ "module %s: relocation overflow\n",
++ me->name);
++- return -ENOEXEC;
++- }
++- ofs = 0;
+++ return -ENOEXEC;
++ }
++
++- *location = (*location & ~0x03ffffff) | ((ofs + (v >> 2)) & 0x03ffffff);
+++ *location = (*location & ~0x03ffffff) | ((v >> 2) & 0x03ffffff);
++
++ return 0;
++ }
++
++-static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
++-{
++- return set_r_mips_26(me, location, *location & 0x03ffffff, v);
++-}
++-
++-static int apply_r_mips_26_rela(struct module *me, u32 *location, Elf_Addr v)
++-{
++- return set_r_mips_26(me, location, 0, v);
++-}
++-
++ static int apply_r_mips_hi16_rel(struct module *me, u32 *location, Elf_Addr v)
++ {
++ struct mips_hi16 *n;
++@@ -607,32 +396,11 @@ int module_finalize(const Elf_Ehdr *hdr,
++ list_add(&me->arch.dbe_list, &dbe_list);
++ spin_unlock_irq(&dbe_lock);
++ }
++-
++- /* Get rid of the fixup trampoline if we're running the module
++- * from physically mapped address space */
++- if (me->arch.phys_plt_offset == 0) {
++- __module_free(me->arch.phys_plt_tbl);
++- me->arch.phys_plt_tbl = NULL;
++- }
++- if (me->arch.virt_plt_offset == 0) {
++- __module_free(me->arch.virt_plt_tbl);
++- me->arch.virt_plt_tbl = NULL;
++- }
++-
++ return 0;
++ }
++
++ void module_arch_cleanup(struct module *mod)
++ {
++- if (mod->arch.phys_plt_tbl) {
++- __module_free(mod->arch.phys_plt_tbl);
++- mod->arch.phys_plt_tbl = NULL;
++- }
++- if (mod->arch.virt_plt_tbl) {
++- __module_free(mod->arch.virt_plt_tbl);
++- mod->arch.virt_plt_tbl = NULL;
++- }
++-
++ spin_lock_irq(&dbe_lock);
++ list_del(&mod->arch.dbe_list);
++ spin_unlock_irq(&dbe_lock);
+diff --git a/feeds/targets/cns21xx/sparc/Makefile b/feeds/targets/cns21xx/sparc/Makefile
+new file mode 100644
+index 0000000..13a5a05
+--- /dev/null
++++ b/feeds/targets/cns21xx/sparc/Makefile
+@@ -0,0 +1,19 @@
++#
++# Copyright (C) 2010-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++ARCH:=sparc
++BOARD:=sparc
++BOARDNAME:=Sun UltraSPARC
++FEATURES+=fpu tgz ext4 squashfs broken
++
++KERNEL_PATCHVER:=3.10
++MAINTAINER:=Imre Kaloz <kaloz@openwrt.org>
++
++include $(INCLUDE_DIR)/target.mk
++
++$(eval $(call BuildTarget))
+diff --git a/feeds/targets/cns21xx/sparc/config-default b/feeds/targets/cns21xx/sparc/config-default
+new file mode 100644
+index 0000000..04c42dd
+--- /dev/null
++++ b/feeds/targets/cns21xx/sparc/config-default
+@@ -0,0 +1,200 @@
++CONFIG_64BIT=y
++CONFIG_ARCH_DEFCONFIG="arch/sparc/configs/sparc64_defconfig"
++CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
++CONFIG_ARCH_MAY_HAVE_PC_FDC=y
++CONFIG_ARCH_NO_VIRT_TO_BUS=y
++CONFIG_ARCH_SELECT_MEMORY_MODEL=y
++CONFIG_ARCH_SPARSEMEM_DEFAULT=y
++CONFIG_ARCH_SPARSEMEM_ENABLE=y
++CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
++CONFIG_ARCH_SUPPORTS_MSI=y
++CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
++# CONFIG_ARPD is not set
++CONFIG_ATA=y
++CONFIG_AUDIT_ARCH=y
++# CONFIG_BBC_I2C is not set
++CONFIG_BCMA_POSSIBLE=y
++CONFIG_BITS=64
++CONFIG_BLK_DEV_LOOP=y
++CONFIG_BLK_DEV_SD=y
++CONFIG_BLOCK_COMPAT=y
++# CONFIG_BRIDGE is not set
++CONFIG_CMDLINE="console=ttyS0 init=/etc/preinit"
++CONFIG_CMDLINE_BOOL=y
++CONFIG_COMPAT=y
++CONFIG_COMPAT_BINFMT_ELF=y
++CONFIG_COMPAT_BRK=y
++CONFIG_COMPAT_NETLINK_MESSAGES=y
++CONFIG_CONSOLE_TRANSLATIONS=y
++CONFIG_CPU_RMAP=y
++CONFIG_CRAMFS=y
++CONFIG_DEBUG_BUGVERBOSE=y
++# CONFIG_DEBUG_DCFLUSH is not set
++CONFIG_DECOMPRESS_LZMA=y
++# CONFIG_DISPLAY7SEG is not set
++CONFIG_DNOTIFY=y
++CONFIG_DUMMY_CONSOLE=y
++CONFIG_EARLYFB=y
++CONFIG_ELF_CORE=y
++CONFIG_ENABLE_MUST_CHECK=y
++# CONFIG_ENVCTRL is not set
++CONFIG_FB=y
++# CONFIG_FB_GRVGA is not set
++# CONFIG_FB_SBUS is not set
++# CONFIG_FB_WMT_GE_ROPS is not set
++# CONFIG_FB_XVR1000 is not set
++# CONFIG_FB_XVR2500 is not set
++# CONFIG_FB_XVR500 is not set
++CONFIG_FIRMWARE_IN_KERNEL=y
++# CONFIG_FONTS is not set
++# CONFIG_FONT_SUN12x22 is not set
++CONFIG_FONT_SUN8x16=y
++CONFIG_FRAMEBUFFER_CONSOLE=y
++CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
++# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
++CONFIG_FS_POSIX_ACL=y
++CONFIG_GENERIC_ACL=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_PCI_IOMAP=y
++# CONFIG_GRETH is not set
++CONFIG_HAPPYMEAL=y
++CONFIG_HAS_DMA=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAVE_ARCH_JUMP_LABEL=y
++CONFIG_HAVE_ARCH_KGDB=y
++CONFIG_HAVE_ARCH_TRACEHOOK=y
++CONFIG_HAVE_C_RECORDMCOUNT=y
++CONFIG_HAVE_DMA_API_DEBUG=y
++CONFIG_HAVE_DMA_ATTRS=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
++# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
++CONFIG_HAVE_GENERIC_HARDIRQS=y
++CONFIG_HAVE_IDE=y
++CONFIG_HAVE_IRQ_WORK=y
++CONFIG_HAVE_LATENCYTOP_SUPPORT=y
++CONFIG_HAVE_MEMBLOCK=y
++CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
++CONFIG_HAVE_MEMORY_PRESENT=y
++CONFIG_HAVE_OPROFILE=y
++CONFIG_HAVE_PERF_EVENTS=y
++CONFIG_HAVE_RCU_TABLE_FREE=y
++CONFIG_HAVE_SETUP_PER_CPU_AREA=y
++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
++CONFIG_HAVE_SYSCALL_WRAPPERS=y
++CONFIG_HID=m
++CONFIG_HID_SUPPORT=y
++# CONFIG_HUGETLBFS is not set
++CONFIG_HW_CONSOLE=y
++CONFIG_HZ=250
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_INPUT=y
++CONFIG_INPUT_EVDEV=y
++CONFIG_INPUT_POLLDEV=y
++# CONFIG_INPUT_SPARCSPKR is not set
++CONFIG_IOMMU_HELPER=y
++CONFIG_IRQ_PREFLOW_FASTEOI=y
++# CONFIG_LEDS_SUNFIRE is not set
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++# CONFIG_MTD is not set
++CONFIG_MUTEX_SPIN_ON_OWNER=y
++CONFIG_NEED_DMA_MAP_STATE=y
++CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
++CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
++CONFIG_NEED_SG_DMA_LENGTH=y
++CONFIG_NR_CPUS=4
++# CONFIG_NUMA is not set
++# CONFIG_OBP_FLASH is not set
++CONFIG_OF=y
++CONFIG_OF_DEVICE=y
++CONFIG_OF_NET=y
++CONFIG_OF_PCI=y
++CONFIG_OF_PROMTREE=y
++CONFIG_PAGEFLAGS_EXTENDED=y
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_PATA_CMD64X=y
++CONFIG_PCI=y
++CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PERF_USE_VMALLOC=y
++CONFIG_PHYS_ADDR_T_64BIT=y
++# CONFIG_PREEMPT_RCU is not set
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_RELAY=y
++CONFIG_RFS_ACCEL=y
++CONFIG_RPS=y
++CONFIG_RTC_CLASS=y
++CONFIG_RTC_DRV_BQ4802=y
++CONFIG_RTC_DRV_M48T59=y
++CONFIG_RTC_DRV_STARFIRE=y
++CONFIG_RTC_DRV_SUN4V=y
++CONFIG_RWSEM_XCHGADD_ALGORITHM=y
++CONFIG_SATA_PMP=y
++CONFIG_SBUS=y
++CONFIG_SBUSCHAR=y
++CONFIG_SCHED_HRTICK=y
++CONFIG_SCSI=y
++# CONFIG_SCSI_LOWLEVEL is not set
++# CONFIG_SCSI_MULTI_LUN is not set
++CONFIG_SECCOMP=y
++CONFIG_SERIAL_8250_NR_UARTS=4
++CONFIG_SERIAL_8250_RUNTIME_UARTS=4
++CONFIG_SERIAL_SUNCORE=y
++# CONFIG_SERIAL_SUNHV is not set
++CONFIG_SERIAL_SUNSAB=y
++CONFIG_SERIAL_SUNSAB_CONSOLE=y
++CONFIG_SERIAL_SUNSU=y
++CONFIG_SERIAL_SUNSU_CONSOLE=y
++# CONFIG_SERIAL_SUNZILOG is not set
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++CONFIG_SMP=y
++CONFIG_SPARC=y
++# CONFIG_SPARC32 is not set
++CONFIG_SPARC64=y
++# CONFIG_SPARC64_PAGE_SIZE_64KB is not set
++CONFIG_SPARC64_PAGE_SIZE_8KB=y
++CONFIG_SPARC64_PCI=y
++CONFIG_SPARC64_SMP=y
++CONFIG_SPARSEMEM=y
++CONFIG_SPARSEMEM_EXTREME=y
++CONFIG_SPARSEMEM_MANUAL=y
++CONFIG_SPARSEMEM_VMEMMAP=y
++CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
++CONFIG_STOP_MACHINE=y
++# CONFIG_SUNBMAC is not set
++# CONFIG_SUNLANCE is not set
++# CONFIG_SUNQE is not set
++# CONFIG_SUN_LDOMS is not set
++CONFIG_SUN_OPENPROMFS=y
++CONFIG_SUN_OPENPROMIO=y
++CONFIG_SUN_PARTITION=y
++CONFIG_SYSVIPC_COMPAT=y
++# CONFIG_TADPOLE_TS102_UCTRL is not set
++CONFIG_TMPFS_POSIX_ACL=y
++CONFIG_TREE_RCU=y
++CONFIG_UID16=y
++# CONFIG_US3_MC is not set
++CONFIG_USB_ARCH_HAS_XHCI=y
++CONFIG_USB_SUPPORT=y
++CONFIG_USE_GENERIC_SMP_HELPERS=y
++# CONFIG_VLAN_8021Q is not set
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_VT=y
++CONFIG_VT_CONSOLE=y
++CONFIG_VT_HW_CONSOLE_BINDING=y
++# CONFIG_WATCHDOG is not set
++CONFIG_XPS=y
++CONFIG_XZ_DEC=y
++CONFIG_ZONE_DMA_FLAG=0
+diff --git a/feeds/targets/cns21xx/sparc/image/Makefile b/feeds/targets/cns21xx/sparc/image/Makefile
+new file mode 100644
+index 0000000..e1f3aa0
+--- /dev/null
++++ b/feeds/targets/cns21xx/sparc/image/Makefile
+@@ -0,0 +1,29 @@
++#
++# Copyright (C) 2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/image.mk
++
++define Image/Prepare
++ cp $(LINUX_DIR)/arch/sparc/boot/zImage $(KDIR)/zImage
++endef
++
++define Image/BuildKernel
++ mkdir -p $(BIN_DIR)
++ cp $(KDIR)/zImage $(BIN_DIR)/$(IMG_PREFIX)-zImage
++# cp $(KDIR)/vmlinux.elf $(BIN_DIR)/$(IMG_PREFIX)-vmlinux.elf
++endef
++
++define Image/Build/squashfs
++ $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
++endef
++
++define Image/Build
++ $(call Image/Build/$(1))
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-root.$(1) bs=128k conv=sync
++endef
++
++$(eval $(call BuildImage))
+diff --git a/feeds/targets/ep93xx/Makefile b/feeds/targets/ep93xx/Makefile
+new file mode 100644
+index 0000000..3da7ca9
+--- /dev/null
++++ b/feeds/targets/ep93xx/Makefile
+@@ -0,0 +1,24 @@
++#
++# Copyright (C) 2009-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++ARCH:=arm
++BOARD:=ep93xx
++BOARDNAME:=Cirrus Logic EP93xx
++FEATURES:=squashfs ext4 targz usb display sound
++CPU_TYPE:=arm920t
++MAINTAINER:=Florian Fainelli <florian@openwrt.org>
++
++KERNEL_PATCHVER:=3.18
++
++DEVICE_TYPE:=developerboard
++
++include $(INCLUDE_DIR)/target.mk
++
++KERNELNAME:=uImage
++
++$(eval $(call BuildTarget))
+diff --git a/feeds/targets/ep93xx/base-files/etc/inittab b/feeds/targets/ep93xx/base-files/etc/inittab
+new file mode 100644
+index 0000000..9f7c0ae
+--- /dev/null
++++ b/feeds/targets/ep93xx/base-files/etc/inittab
+@@ -0,0 +1,5 @@
++::sysinit:/etc/init.d/rcS S boot
++::shutdown:/etc/init.d/rcS K shutdown
++tts/0::askfirst:/bin/ash --login
++ttyAM0::askfirst:/bin/ash --login
++tty1::askfirst:/bin/ash --login
+diff --git a/feeds/targets/ep93xx/base-files/lib/preinit/05_set_ether_mac_rdc b/feeds/targets/ep93xx/base-files/lib/preinit/05_set_ether_mac_rdc
+new file mode 100644
+index 0000000..9e5d09f
+--- /dev/null
++++ b/feeds/targets/ep93xx/base-files/lib/preinit/05_set_ether_mac_rdc
+@@ -0,0 +1,12 @@
++#!/bin/sh
++# Copyright (C) 2010 OpenWrt.org
++
++. /lib/functions.sh
++
++set_ether_mac() {
++ mac=$(sed -n 's/^Serial.* 000000/02/p' /proc/cpuinfo)
++ ifconfig eth0 hw ether $mac
++}
++
++boot_hook_add preinit_main set_ether_mac
++
+diff --git a/feeds/targets/ep93xx/config-3.18 b/feeds/targets/ep93xx/config-3.18
+new file mode 100644
+index 0000000..f8a6829
+--- /dev/null
++++ b/feeds/targets/ep93xx/config-3.18
+@@ -0,0 +1,219 @@
++CONFIG_ALIGNMENT_TRAP=y
++CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
++CONFIG_ARCH_EP93XX=y
++CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
++CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y
++CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
++CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
++CONFIG_ARCH_NR_GPIO=0
++CONFIG_ARCH_REQUIRE_GPIOLIB=y
++# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
++# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++CONFIG_ARCH_USES_GETTIMEOFFSET=y
++CONFIG_ARCH_USE_BUILTIN_BSWAP=y
++CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y
++CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
++CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
++CONFIG_ARM=y
++CONFIG_ARM_AMBA=y
++# CONFIG_ARM_CPU_SUSPEND is not set
++CONFIG_ARM_L1_CACHE_SHIFT=5
++CONFIG_ARM_NR_BANKS=16
++CONFIG_ARM_PATCH_PHYS_VIRT=y
++# CONFIG_ARM_SP805_WATCHDOG is not set
++CONFIG_ARM_THUMB=y
++CONFIG_ARM_VIC=y
++CONFIG_ARM_VIC_NR=2
++CONFIG_ATAGS=y
++# CONFIG_BLK_DEV_INITRD is not set
++# CONFIG_CACHE_L2X0 is not set
++CONFIG_CC_OPTIMIZE_FOR_SIZE=y
++CONFIG_CLKDEV_LOOKUP=y
++CONFIG_CLONE_BACKWARDS=y
++CONFIG_CMDLINE="console=ttyAM0,57600 init=/etc/preinit"
++CONFIG_CMDLINE_FROM_BOOTLOADER=y
++CONFIG_CONSOLE_TRANSLATIONS=y
++CONFIG_CPU_32v4T=y
++CONFIG_CPU_ABRT_EV4T=y
++CONFIG_CPU_ARM920T=y
++CONFIG_CPU_CACHE_V4WT=y
++CONFIG_CPU_CACHE_VIVT=y
++CONFIG_CPU_COPY_V4WB=y
++CONFIG_CPU_CP15=y
++CONFIG_CPU_CP15_MMU=y
++# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
++# CONFIG_CPU_ICACHE_DISABLE is not set
++CONFIG_CPU_PABRT_LEGACY=y
++CONFIG_CPU_TLB_V4WBI=y
++CONFIG_CPU_USE_DOMAINS=y
++CONFIG_CRC7=y
++CONFIG_CRC_ITU_T=y
++CONFIG_CRUNCH=y
++CONFIG_DEBUG_LL_INCLUDE="debug/pl01x.S"
++# CONFIG_DEBUG_UART_8250 is not set
++CONFIG_DEBUG_UART_PHYS=0x808c0000
++CONFIG_DEBUG_UART_PL01X=y
++CONFIG_DEBUG_UART_VIRT=0xfedc0000
++# CONFIG_DEBUG_USER is not set
++CONFIG_DUMMY_CONSOLE=y
++# CONFIG_ENABLE_WARN_DEPRECATED is not set
++CONFIG_EP93XX_ETH=y
++CONFIG_EP93XX_SDCE0_PHYS_OFFSET=y
++# CONFIG_EP93XX_SDCE1_PHYS_OFFSET is not set
++# CONFIG_EP93XX_SDCE2_PHYS_OFFSET is not set
++# CONFIG_EP93XX_SDCE3_ASYNC_PHYS_OFFSET is not set
++# CONFIG_EP93XX_SDCE3_SYNC_PHYS_OFFSET is not set
++CONFIG_EP93XX_SOC_COMMON=y
++CONFIG_EP93XX_WATCHDOG=y
++CONFIG_FRAME_POINTER=y
++CONFIG_GENERIC_ATOMIC64=y
++CONFIG_GENERIC_BUG=y
++CONFIG_GENERIC_IDLE_POLL_SETUP=y
++CONFIG_GENERIC_IO=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_PCI_IOMAP=y
++CONFIG_GENERIC_SCHED_CLOCK=y
++CONFIG_GENERIC_SMP_IDLE_THREAD=y
++CONFIG_GENERIC_STRNCPY_FROM_USER=y
++CONFIG_GENERIC_STRNLEN_USER=y
++CONFIG_GPIOLIB=y
++CONFIG_GPIO_DEVRES=y
++CONFIG_GPIO_EP93XX=y
++CONFIG_GPIO_GENERIC=y
++CONFIG_HARDIRQS_SW_RESEND=y
++CONFIG_HAS_DMA=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
++CONFIG_HAVE_ARCH_JUMP_LABEL=y
++CONFIG_HAVE_ARCH_KGDB=y
++CONFIG_HAVE_ARCH_PFN_VALID=y
++CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
++CONFIG_HAVE_ARCH_TRACEHOOK=y
++# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
++CONFIG_HAVE_BPF_JIT=y
++CONFIG_HAVE_CC_STACKPROTECTOR=y
++CONFIG_HAVE_CLK=y
++CONFIG_HAVE_CONTEXT_TRACKING=y
++CONFIG_HAVE_C_RECORDMCOUNT=y
++CONFIG_HAVE_DEBUG_KMEMLEAK=y
++CONFIG_HAVE_DMA_API_DEBUG=y
++CONFIG_HAVE_DMA_ATTRS=y
++CONFIG_HAVE_DMA_CONTIGUOUS=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
++CONFIG_HAVE_KERNEL_GZIP=y
++CONFIG_HAVE_KERNEL_LZ4=y
++CONFIG_HAVE_KERNEL_LZMA=y
++CONFIG_HAVE_KERNEL_LZO=y
++CONFIG_HAVE_KERNEL_XZ=y
++CONFIG_HAVE_LATENCYTOP_SUPPORT=y
++CONFIG_HAVE_MEMBLOCK=y
++CONFIG_HAVE_NET_DSA=y
++CONFIG_HAVE_OPROFILE=y
++CONFIG_HAVE_PERF_EVENTS=y
++CONFIG_HAVE_PERF_REGS=y
++CONFIG_HAVE_PERF_USER_STACK_DUMP=y
++CONFIG_HAVE_PROC_CPU=y
++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
++CONFIG_HAVE_UID16=y
++CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
++CONFIG_HW_CONSOLE=y
++CONFIG_HZ_FIXED=0
++CONFIG_I2C=y
++CONFIG_I2C_ALGOBIT=y
++CONFIG_I2C_BOARDINFO=y
++CONFIG_I2C_CHARDEV=y
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
++CONFIG_INPUT=y
++# CONFIG_INPUT_MISC is not set
++CONFIG_INPUT_TOUCHSCREEN=y
++CONFIG_IOMMU_HELPER=y
++CONFIG_IRQ_DOMAIN=y
++CONFIG_IRQ_FORCED_THREADING=y
++CONFIG_IRQ_WORK=y
++CONFIG_KTIME_SCALAR=y
++CONFIG_LEDS_GPIO_REGISTER=y
++CONFIG_LOG_BUF_SHIFT=16
++# CONFIG_MACH_EDB9302A is not set
++# CONFIG_MACH_EDB9307A is not set
++# CONFIG_MACH_EDB9315A is not set
++CONFIG_MACH_SIM_ONE=y
++# CONFIG_MACH_SNAPPER_CL15 is not set
++# CONFIG_MACH_VISION_EP9307 is not set
++CONFIG_MMC=y
++CONFIG_MMC_BLOCK=y
++CONFIG_MMC_SPI=y
++CONFIG_MODULES_USE_ELF_REL=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++CONFIG_MTD_CFI_ADV_OPTIONS=y
++# CONFIG_MTD_CFI_GEOMETRY is not set
++CONFIG_MTD_CFI_STAA=y
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++CONFIG_MTD_PHYSMAP=y
++CONFIG_MTD_RAM=y
++CONFIG_MULTI_IRQ_HANDLER=y
++CONFIG_NEED_DMA_MAP_STATE=y
++CONFIG_NEED_KUSER_HELPERS=y
++CONFIG_NEED_MACH_MEMORY_H=y
++CONFIG_NEED_PER_CPU_KM=y
++CONFIG_NO_BOOTMEM=y
++CONFIG_OLD_SIGACTION=y
++CONFIG_OLD_SIGSUSPEND3=y
++CONFIG_PAGEFLAGS_EXTENDED=y
++CONFIG_PAGE_OFFSET=0xC0000000
++# CONFIG_PCI_SYSCALL is not set
++CONFIG_PERF_USE_VMALLOC=y
++# CONFIG_PREEMPT_RCU is not set
++# CONFIG_RCU_STALL_COMMON is not set
++# CONFIG_SCHED_HRTICK is not set
++# CONFIG_SCSI_DMA is not set
++# CONFIG_SERIAL_8250 is not set
++CONFIG_SERIAL_AMBA_PL010=y
++CONFIG_SERIAL_AMBA_PL010_CONSOLE=y
++# CONFIG_SERIAL_AMBA_PL011 is not set
++CONFIG_SOC_BUS=y
++CONFIG_SPI=y
++CONFIG_SPI_BITBANG=y
++CONFIG_SPI_EP93XX=y
++CONFIG_SPI_MASTER=y
++CONFIG_SPLIT_PTLOCK_CPUS=999999
++CONFIG_SWIOTLB=y
++CONFIG_SYS_SUPPORTS_APM_EMULATION=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TICK_CPU_ACCOUNTING=y
++# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
++# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
++# CONFIG_TOUCHSCREEN_BU21013 is not set
++# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set
++# CONFIG_TOUCHSCREEN_DYNAPRO is not set
++# CONFIG_TOUCHSCREEN_EP93XX is not set
++# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
++# CONFIG_TOUCHSCREEN_MAX11801 is not set
++# CONFIG_TOUCHSCREEN_PIXCIR is not set
++# CONFIG_TOUCHSCREEN_ST1232 is not set
++# CONFIG_TOUCHSCREEN_TSC2005 is not set
++# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
++CONFIG_UID16=y
++CONFIG_UNCOMPRESS_INCLUDE="mach/uncompress.h"
++CONFIG_USB_SUPPORT=y
++CONFIG_VECTORS_BASE=0xffff0000
++CONFIG_VIDEO_OUTPUT_CONTROL=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_VT=y
++CONFIG_VT_CONSOLE=y
++# CONFIG_VT_HW_CONSOLE_BINDING is not set
++CONFIG_WATCHDOG_CORE=y
++CONFIG_XZ_DEC_ARM=y
++CONFIG_XZ_DEC_BCJ=y
++CONFIG_ZBOOT_ROM_BSS=0x0
++CONFIG_ZBOOT_ROM_TEXT=0x0
++CONFIG_ZONE_DMA_FLAG=0
+diff --git a/feeds/targets/ep93xx/image/Makefile b/feeds/targets/ep93xx/image/Makefile
+new file mode 100644
+index 0000000..0d5a289
+--- /dev/null
++++ b/feeds/targets/ep93xx/image/Makefile
+@@ -0,0 +1,41 @@
++#
++# Copyright (C) 2009-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/image.mk
++
++UIMAGE:=$(BIN_DIR)/$(IMG_PREFIX)-uImage
++fs_squash:=squashfs-only
++fs_all:=all
++fs_4k:=4k
++fs_64k:=64k
++fs_128k:=128k
++
++define Image/BuildKernel
++ cp $(KDIR)/uImage $(UIMAGE)
++ifeq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
++ cp $(KDIR)/uImage-initramfs $(UIMAGE)-initramfs
++endif
++endef
++
++define Image/Build/jffs2-64k
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1).img bs=64k conv=sync
++endef
++
++define Image/Build/jffs2-128k
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1).img bs=128k conv=sync
++endef
++
++define Image/Build/squashfs
++ $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1).img bs=128k conv=sync
++endef
++
++define Image/Build
++ $(call Image/Build/$(1),$(1))
++endef
++
++$(eval $(call BuildImage))
+diff --git a/feeds/targets/ep93xx/modules.mk b/feeds/targets/ep93xx/modules.mk
+new file mode 100644
+index 0000000..50c049d
+--- /dev/null
++++ b/feeds/targets/ep93xx/modules.mk
+@@ -0,0 +1,103 @@
++#
++# Copyright (C) 2011-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define KernelPackage/fb-ep93xx
++ SUBMENU:=$(VIDEO_MENU)
++ TITLE:=EP93xx framebuffer support
++ DEPENDS:=@TARGET_ep93xx +kmod-fb +kmod-fb-cfb-fillrect \
++ +kmod-fb-cfb-copyarea +kmod-fb-cfb-imgblt
++ KCONFIG:=CONFIG_FB_EP93XX
++ FILES:=$(LINUX_DIR)/drivers/video/ep93xx-fb.ko
++ AUTOLOAD:=$(call AutoLoad,51,ep93xx-fb)
++endef
++
++define KernelPackage/fb-ep93xx/description
++ EP93xx framebuffer support
++endef
++
++$(eval $(call KernelPackage,fb-ep93xx))
++
++define KernelPackage/input-keyboard-ep93xx
++ SUBMENU:=$(OTHER_MENU)
++ TITLE:=EP93xx Matrix Keypad support
++ DEPENDS:=@TARGET_ep93xx +kmod-input-matrixkmap
++ KCONFIG:= \
++ CONFIG_KEYBOARD_EP93XX \
++ CONFIG_INPUT_KEYBOARD=y
++ FILES:=$(LINUX_DIR)/drivers/input/keyboard/ep93xx_keypad.ko
++ AUTOLOAD:=$(call AutoLoad,62,ep93xx_keypad)
++ $(call AddDepends/input)
++endef
++
++define KernelPackage/input-keyboard-ep93xx/description
++ EP93xx Matrix Keypad support
++endef
++
++$(eval $(call KernelPackage,input-keyboard-ep93xx))
++
++define KernelPackage/sound-soc-ep93xx
++ SUBMENU:=$(SOUND_MENU)
++ TITLE:=EP93xx SoC sound support
++ DEPENDS:=@TARGET_ep93xx +kmod-sound-core +kmod-sound-soc-core
++ KCONFIG:=CONFIG_SND_EP93XX_SOC
++ FILES:=$(LINUX_DIR)/sound/soc/cirrus/snd-soc-ep93xx.ko
++ AUTOLOAD:=$(call AutoLoad,57,snd-soc-ep93xx)
++endef
++
++define KernelPackage/sound-soc-ep93xx/description
++ EP93xx SoC sound support
++endef
++
++$(eval $(call KernelPackage,sound-soc-ep93xx))
++
++# Must be loaded prior to sound-soc-ac97 because it exports
++# soc_ac97_ops
++define KernelPackage/sound-soc-ep93xx-ac97
++ SUBMENU:=$(SOUND_MENU)
++ TITLE:=EP93xx SoC AC97 support
++ DEPENDS:=@TARGET_ep93xx +kmod-sound-soc-core
++ KCONFIG:=CONFIG_SND_EP93XX_SOC_AC97
++ FILES:=$(LINUX_DIR)/sound/soc/cirrus/snd-soc-ep93xx-ac97.ko
++ AUTOLOAD:=$(call AutoLoad,56,snd-soc-ep93xx-ac97)
++endef
++
++define KernelPackage/sound-soc-ep93xx-ac97/description
++ EP93xx SoC AC97 support
++endef
++
++$(eval $(call KernelPackage,sound-soc-ep93xx-ac97))
++
++define KernelPackage/sound-soc-ep93xx-simone
++ SUBMENU:=$(SOUND_MENU)
++ TITLE:=Sim.One EP93xx Soc sound support
++ DEPENDS:=@TARGET_ep93xx +kmod-sound-soc-core
++ KCONFIG:=CONFIG_SND_EP93XX_SOC_SIMONE
++ FILES:=$(LINUX_DIR)/sound/soc/cirrus/snd-soc-simone.ko
++ AUTOLOAD:=$(call AutoLoad,59,snd-soc-ep93xx)
++endef
++
++define KernelPackage/sound-soc-ep93xx-simone/description
++ SimpleMachines Sim.One sound support
++endef
++
++$(eval $(call KernelPackage,sound-soc-ep93xx-simone))
++
++define KernelPackage/touchscreen-ep93xx
++ SUBMENU:=$(OTHER_MENU)
++ TITLE:=EP93xx input touchscreen support
++ DEPENDS:=@TARGET_ep93xx
++ KCONFIG:=CONFIG_TOUCHSCREEN_EP93XX
++ FILES:=$(LINUX_DIR)/drivers/input/touchscreen/ep93xx_ts.ko
++ AUTOLOAD:=$(call AutoLoad,51,ep93xx_ts)
++endef
++
++define KernelPackage/touchscreen-ep93xx/description
++ EP93xx SoC input touchscreen support
++endef
++
++$(eval $(call KernelPackage,touchscreen-ep93xx))
++
+diff --git a/feeds/targets/ep93xx/patches-3.18/001-ep93xx_cpuinfo.patch b/feeds/targets/ep93xx/patches-3.18/001-ep93xx_cpuinfo.patch
+new file mode 100644
+index 0000000..e9d87df
+--- /dev/null
++++ b/feeds/targets/ep93xx/patches-3.18/001-ep93xx_cpuinfo.patch
+@@ -0,0 +1,70 @@
++This patch puts the EP93xx chip revision and unique ID into /proc/cpuinfo.
++This is necessary to be able to set a unique MAC address for DHCP purposes
++by adding a line to /etc/network/interfaces:
++
++# Generate a unique locally-assigned MAC address from the CPU serial number
++pre-up ifconfig eth0 hw ether `sed -n 's/^Serial.* 000000/02/p' /proc/cpuinfo`
++
++It uses the chip revision reading code in the ep93xx-chip-revision patch.
++
++Really, this is wrong, since /proc/cpuinfo should report the revision and
++serial number of the ARM920T processor, while these are the rev and serial
++of the EP93xx SoC. In a future kernel (>2.6.34) there may be a new file
++/proc/socinfo for this information.
++
++ -martinwguy 14 May 2010
++
++--- a/arch/arm/kernel/setup.c
+++++ b/arch/arm/kernel/setup.c
++@@ -57,6 +57,12 @@
++ #include <asm/memblock.h>
++ #include <asm/virt.h>
++
+++#if defined(CONFIG_ARCH_EP93XX)
+++#include <asm/io.h>
+++#include <mach/platform.h>
+++#include <mach/ep93xx-regs.h>
+++#endif
+++
++ #include "atags.h"
++
++
++@@ -1087,9 +1093,16 @@ static int c_show(struct seq_file *m, vo
++ }
++
++ seq_printf(m, "Hardware\t: %s\n", machine_name);
+++#if defined(CONFIG_ARCH_EP93XX)
+++ seq_printf(m, "Revision\t: %04x\n",
+++ ep93xx_chip_revision());
+++ seq_printf(m, "Serial\t\t: %016x\n",
+++ *((unsigned int *)EP93XX_SECURITY_UNIQID));
+++#else
++ seq_printf(m, "Revision\t: %04x\n", system_rev);
++ seq_printf(m, "Serial\t\t: %08x%08x\n",
++ system_serial_high, system_serial_low);
+++#endif
++
++ return 0;
++ }
++--- a/arch/arm/mach-ep93xx/soc.h
+++++ b/arch/arm/mach-ep93xx/soc.h
++@@ -82,8 +82,6 @@
++ #define EP93XX_I2S_PHYS_BASE EP93XX_APB_PHYS(0x00020000)
++ #define EP93XX_I2S_BASE EP93XX_APB_IOMEM(0x00020000)
++
++-#define EP93XX_SECURITY_BASE EP93XX_APB_IOMEM(0x00030000)
++-
++ #define EP93XX_AAC_PHYS_BASE EP93XX_APB_PHYS(0x00080000)
++ #define EP93XX_AAC_BASE EP93XX_APB_IOMEM(0x00080000)
++
++--- a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h
+++++ b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h
++@@ -38,4 +38,8 @@
++ #define EP93XX_UART3_PHYS_BASE EP93XX_APB_PHYS(0x000e0000)
++ #define EP93XX_UART3_BASE EP93XX_APB_IOMEM(0x000e0000)
++
+++#define EP93XX_SECURITY_BASE EP93XX_APB_IOMEM(0x00030000)
+++#define EP93XX_SECURITY_REG(x) (EP93XX_SECURITY_BASE + (x))
+++#define EP93XX_SECURITY_UNIQID EP93XX_SECURITY_REG(0x2440)
+++
++ #endif
+diff --git a/feeds/targets/ep93xx/patches-3.18/003-ep93xx_touchscreen.patch b/feeds/targets/ep93xx/patches-3.18/003-ep93xx_touchscreen.patch
+new file mode 100644
+index 0000000..e1613a0
+--- /dev/null
++++ b/feeds/targets/ep93xx/patches-3.18/003-ep93xx_touchscreen.patch
+@@ -0,0 +1,1072 @@
++---
++ arch/arm/mach-ep93xx/include/mach/hardware.h | 1
++ arch/arm/mach-ep93xx/include/mach/regs_touch.h | 95 ++
++ drivers/input/touchscreen/Kconfig | 5
++ drivers/input/touchscreen/Makefile | 1
++ drivers/input/touchscreen/ep93xx_ts.c | 1117 +++++++++++++++++++++++++
++ drivers/input/touchscreen/ep93xx_ts.h | 53 +
++ 6 files changed, 1272 insertions(+)
++
++--- a/drivers/input/touchscreen/Kconfig
+++++ b/drivers/input/touchscreen/Kconfig
++@@ -282,6 +282,15 @@ config TOUCHSCREEN_EGALAX
++ To compile this driver as a module, choose M here: the
++ module will be called egalax_ts.
++
+++config TOUCHSCREEN_EP93XX
+++ tristate "EP93xx Touchscreen"
+++ depends on ARM && INPUT && ARCH_EP93XX
+++ help
+++ Say Y here to enable support for EP93xx touch screen.
+++
+++ To compile this driver as a module, choose M here:
+++ the module will be called ep93xx_ts.
+++
++ config TOUCHSCREEN_FUJITSU
++ tristate "Fujitsu serial touchscreen"
++ select SERIO
++--- a/drivers/input/touchscreen/Makefile
+++++ b/drivers/input/touchscreen/Makefile
++@@ -33,6 +33,7 @@ obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunz
++ obj-$(CONFIG_TOUCHSCREEN_EETI) += eeti_ts.o
++ obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o
++ obj-$(CONFIG_TOUCHSCREEN_EGALAX) += egalax_ts.o
+++obj-$(CONFIG_TOUCHSCREEN_EP93XX) += ep93xx_ts.o
++ obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o
++ obj-$(CONFIG_TOUCHSCREEN_ILI210X) += ili210x.o
++ obj-$(CONFIG_TOUCHSCREEN_INEXIO) += inexio.o
++--- /dev/null
+++++ b/drivers/input/touchscreen/ep93xx_ts.c
++@@ -0,0 +1,1022 @@
+++/*
+++ * linux/drivers/input/touchscreen/ep93xx_ts.c
+++ *
+++ * Copyright (C) 2003-2004 Cirrus Corp.
+++ *
+++ * This program is free software; you can redistribute it and/or modify
+++ * it under the terms of the GNU General Public License version 2 as
+++ * published by the Free Software Foundation.
+++ */
+++
+++#include <linux/module.h>
+++#include <linux/types.h>
+++#include <linux/delay.h>
+++#include <linux/wait.h>
+++#include <linux/fs.h>
+++#include <linux/sched.h>
+++#include <linux/poll.h>
+++#include <linux/miscdevice.h>
+++#include <linux/init.h>
+++#include <linux/compiler.h>
+++#include <linux/timer.h>
+++#include <linux/interrupt.h>
+++#include <linux/syscalls.h>
+++#include <linux/input.h>
+++#include <linux/semaphore.h>
+++#include <asm/irq.h>
+++#include <mach/hardware.h>
+++#include <asm/io.h>
+++#include "../../../arch/arm/mach-ep93xx/soc.h"
+++
+++/* This stuff should be in ep93xx-regs.h */
+++#define EP93XX_TOUCHSCREEN_REG(x) (EP93XX_TOUCHSCREEN_BASE + (x))
+++/* R/W touchscreen controller setup control register. */
+++#define EP93XX_TOUCHSCREEN_SETUP EP93XX_TOUCHSCREEN_REG(0x00)
+++/* R/W touchscreen controller max/min register. */
+++#define EP93XX_TOUCHSCREEN_XYMAXMIN EP93XX_TOUCHSCREEN_REG(0x04)
+++/* R touchscreen controller result register. */
+++#define EP93XX_TOUCHSCREEN_XYRESULT EP93XX_TOUCHSCREEN_REG(0x08)
+++/* LOCKED R/W touchscreen Switch Matrix control register. */
+++#define EP93XX_TOUCHSCREEN_DISCHARGE EP93XX_TOUCHSCREEN_REG(0x0C)
+++#define EP93XX_TOUCHSCREEN_XSAMPLE EP93XX_TOUCHSCREEN_REG(0x10)
+++#define EP93XX_TOUCHSCREEN_YSAMPLE EP93XX_TOUCHSCREEN_REG(0x14)
+++#define EP93XX_TOUCHSCREEN_DIRECT EP93XX_TOUCHSCREEN_REG(0x18)
+++#define EP93XX_TOUCHSCREEN_DETECT EP93XX_TOUCHSCREEN_REG(0x1C)
+++/* NA R/W touchscreen software lock register. */
+++#define EP93XX_TOUCHSCREEN_SWLOCK EP93XX_TOUCHSCREEN_REG(0x20)
+++/* R/W touchscreen setup control register #2. */
+++#define EP93XX_TOUCHSCREEN_SETUP2 EP93XX_TOUCHSCREEN_REG(0x24)
+++
+++/* These are duplicated in mach-ep93xx/core.c */
+++#define EP93XX_TIMER_REG(x) (EP93XX_TIMER_BASE + (x))
+++#define EP93XX_TIMER2_LOAD EP93XX_TIMER_REG(0x20)
+++#define EP93XX_TIMER2_VALUE EP93XX_TIMER_REG(0x24)
+++#define EP93XX_TIMER2_CONTROL EP93XX_TIMER_REG(0x28)
+++#define EP93XX_TIMER2_CLEAR EP93XX_TIMER_REG(0x2c)
+++
+++/*
+++ * Register bit definitions
+++ */
+++#define TSSETUP_SDLY_MASK 0x000003FF
+++#define TSSETUP_SDLY_SHIFT 0
+++#define TSSETUP_NSMP_4 0x00000000
+++#define TSSETUP_NSMP_8 0x00000400
+++#define TSSETUP_NSMP_16 0x00000800
+++#define TSSETUP_NSMP_32 0x00000C00
+++#define TSSETUP_NSMP_MASK 0x00000C00
+++#define TSSETUP_DEV_4 0x00000000
+++#define TSSETUP_DEV_8 0x00001000
+++#define TSSETUP_DEV_12 0x00002000
+++#define TSSETUP_DEV_16 0x00003000
+++#define TSSETUP_DEV_24 0x00004000
+++#define TSSETUP_DEV_32 0x00005000
+++#define TSSETUP_DEV_64 0x00006000
+++#define TSSETUP_DEV_128 0x00007000
+++#define TSSETUP_ENABLE 0x00008000
+++#define TSSETUP_DLY_MASK 0x03FF0000
+++#define TSSETUP_DLY_SHIFT 16
+++#define TSSETUP_TDTCT 0x80000000
+++
+++#define TSMAXMIN_XMIN_MASK 0x000000FF
+++#define TSMAXMIN_XMIN_SHIFT 0
+++#define TSMAXMIN_YMIN_MASK 0x0000FF00
+++#define TSMAXMIN_YMIN_SHIFT 8
+++#define TSMAXMIN_XMAX_MASK 0x00FF0000
+++#define TSMAXMIN_XMAX_SHIFT 16
+++#define TSMAXMIN_YMAX_MASK 0xFF000000
+++#define TSMAXMIN_YMAX_SHIFT 24
+++
+++#define TSXYRESULT_X_MASK 0x00000FFF
+++#define TSXYRESULT_X_SHIFT 0
+++#define TSXYRESULT_AD_MASK 0x0000FFFF
+++#define TSXYRESULT_AD_SHIFT 0
+++#define TSXYRESULT_Y_MASK 0x0FFF0000
+++#define TSXYRESULT_Y_SHIFT 16
+++#define TSXYRESULT_SDR 0x80000000
+++
+++#define TSX_SAMPLE_MASK 0x00003FFF
+++#define TSX_SAMPLE_SHIFT 0x00
+++#define TSY_SAMPLE_MASK 0x3FFF0000
+++#define TSY_SAMPLE_SHIFT 0x10
+++
+++#define TSSETUP2_TINT 0x00000001
+++#define TSSETUP2_NICOR 0x00000002
+++#define TSSETUP2_PINT 0x00000004
+++#define TSSETUP2_PENSTS 0x00000008
+++#define TSSETUP2_PINTEN 0x00000010
+++#define TSSETUP2_DEVINT 0x00000020
+++#define TSSETUP2_DINTEN 0x00000040
+++#define TSSETUP2_DTMEN 0x00000080
+++#define TSSETUP2_DISDEV 0x00000100
+++#define TSSETUP2_NSIGND 0x00000200
+++#define TSSETUP2_S28EN 0x00000400
+++#define TSSETUP2_RINTEN 0x00000800
+++
+++#define TSXYRESULT_SDR 0x80000000
+++
+++/*
+++ * These are used as trigger levels to know when we have pen up/down.
+++ * The rules:
+++ * 1. TS_HEAVY_INV_PRESSURE < TS_LIGHT_INV_PRESSURE because these
+++ * are Inverse pressure.
+++ * 2. Any touch lighter than TS_LIGHT_INV_PRESSURE is a pen up.
+++ * 3. Any touch heavier than TS_HEAVY_INV_PRESSURE is a pen down.
+++ */
+++#define TS_HEAVY_INV_PRESSURE 0xFE0 /* C00 */
+++#define TS_LIGHT_INV_PRESSURE 0xFFF /* e00 */
+++
+++/*
+++ * If the x, y, or inverse pressure changes more than these values
+++ * between two succeeding points, the point is not reported.
+++ */
+++#define TS_MAX_VALID_XY_CHANGE 0x300
+++#define TS_MAX_VALID_PRESSURE_CHANGE 0x100
+++
+++/*
+++ * This is the minimum Z1 Value that is valid.
+++ */
+++#define MIN_Z1_VALUE 0x50
+++
+++/*
+++ * Settling delay for taking each ADC measurement. Increase this
+++ * if ts is jittery.
+++ */
+++#define EP93XX_TS_ADC_DELAY_USEC 2000
+++
+++/*
+++ * Delay between TS points.
+++ */
+++#define EP93XX_TS_PER_POINT_DELAY_USEC 10000
+++
+++/*
+++ * A few more macros...
+++ */
+++#define TSSETUP_DEFAULT (TSSETUP_NSMP_32 | TSSETUP_DEV_64 | \
+++ ((128<<TSSETUP_SDLY_SHIFT) & TSSETUP_SDLY_MASK) | \
+++ ((128<<TSSETUP_DLY_SHIFT) & TSSETUP_DLY_MASK))
+++
+++#define TSSETUP2_DEFAULT (TSSETUP2_NSIGND)
+++
+++/*
+++ * For now, we use one of the minor numbers from the local/experimental
+++ * range.
+++ */
+++#define EP93XX_TS_MINOR 240
+++
+++/*
+++ * Static Declarations
+++ */
+++static unsigned int guiLastX, guiLastY;
+++static unsigned int guiLastInvPressure;
+++
+++struct TouchScreenSample
+++{
+++ int currentX;
+++ int currentY;
+++ int currentButton;
+++ int currentPressure;
+++ struct timeval currentTime;
+++};
+++
+++/*
+++ * This must match the structure in tslib.
+++ */
+++struct ts_sample {
+++ int x;
+++ int y;
+++ unsigned int pressure;
+++ struct timeval tv;
+++};
+++
+++static struct TouchScreenSample gSample;
+++static int bFreshTouchData;
+++static int bCurrentPenDown;
+++
+++static DECLARE_WAIT_QUEUE_HEAD(queue);
+++static DEFINE_SEMAPHORE(open_sem);
+++static DEFINE_SPINLOCK(event_buffer_lock);
+++static struct fasync_struct *ep93xx_fasync;
+++
+++/*
+++ * Typedef Declarations
+++ */
+++typedef enum {
+++ TS_MODE_UN_INITIALIZED,
+++ TS_MODE_HARDWARE_SCAN,
+++ TS_MODE_SOFT_SCAN
+++} ts_mode_t;
+++
+++static ts_mode_t gScanningMode;
+++
+++typedef enum{
+++ TS_STATE_STOPPED = 0,
+++ TS_STATE_Z1,
+++ TS_STATE_Z2,
+++ TS_STATE_Y,
+++ TS_STATE_X,
+++ TS_STATE_DONE
+++} ts_states_t;
+++
+++typedef struct
+++{
+++ unsigned int uiX;
+++ unsigned int uiY;
+++ unsigned int uiZ1;
+++ unsigned int uiZ2;
+++ ts_states_t state;
+++} ts_struct_t;
+++
+++static ts_struct_t sTouch;
+++
+++/*
+++ * From the spec, here's how to set up the touch screen's switch registers.
+++ */
+++typedef struct
+++{
+++ unsigned int uiDetect;
+++ unsigned int uiDischarge;
+++ unsigned int uiXSample;
+++ unsigned int uiYSample;
+++ unsigned int uiSwitchZ1;
+++ unsigned int uiSwitchZ2;
+++}SwitchStructType;
+++
+++/*
+++ * Here's the switch settings for a 4-wire touchscreen. See the spec
+++ * for how to handle a 4, 7, or 8-wire.
+++ */
+++const static SwitchStructType sSwitchSettings =
+++/* s28en=0 */
+++/* TSDetect TSDischarge TSXSample TSYSample SwitchZ1 SwitchZ2 */
+++ {0x00403604, 0x0007fe04, 0x00081604, 0x00104601, 0x00101601, 0x00101608};
+++
+++/*
+++ * Function declarations
+++ */
+++static void ep93xx_ts_set_direct(unsigned int uiADCSwitch);
+++static irqreturn_t ep93xx_ts_isr(int irq, void *dev_id);
+++static irqreturn_t ep93xx_timer2_isr(int irq, void *dev_id);
+++static void ee93xx_ts_evt_add(int button, int dX, int dY, int Pressure);
+++static ssize_t ep93xx_ts_read(struct file *filp, char *buf,
+++ size_t count, loff_t *l);
+++static unsigned int ep93xx_ts_poll(struct file *filp, poll_table *wait);
+++static int ep93xx_ts_open(struct inode *inode, struct file *filp);
+++static int ep93xx_ts_fasync(int fd, struct file *filp, int on);
+++static int ep93xx_ts_release(struct inode *inode, struct file *filp);
+++static ssize_t ep93xx_ts_write(struct file *file, const char *buffer,
+++ size_t count, loff_t *ppos);
+++static void ep93xx_ts_setup(void);
+++static void ep93xx_ts_shutdown(void);
+++int __init ep93xx_ts_init(void);
+++void __exit ep93xx_ts_exit(void);
+++static unsigned int CalculateInvPressure(void);
+++static unsigned int ADCGetData(unsigned int uiSamples, unsigned int uiMaxDiff);
+++static void TS_Soft_Scan_Mode(void);
+++static void TS_Hardware_Scan_Mode(void);
+++static void ProcessPointData(void);
+++static void Set_Timer2_uSec(unsigned int Delay_mSec);
+++static void Stop_Timer2(void);
+++
+++/*
+++ * ep93xx_ts_isr
+++ */
+++static irqreturn_t ep93xx_ts_isr(int irq, void *dev_id)
+++{
+++ /*
+++ * Note that we don't clear the interrupt here. The interrupt
+++ * gets cleared in TS_Soft_Scan_Mode when the TS ENABLE
+++ * bit is cleared.
+++ */
+++
+++ /*
+++ * Set the ts to manual polling mode and schedule a callback.
+++ * That way we can return from the isr in a reasonable amount of
+++ * time and process the touch in the callback after a brief delay.
+++ */
+++ TS_Soft_Scan_Mode();
+++
+++ return(IRQ_HANDLED);
+++}
+++
+++/*
+++ * Save the current ts 'event' in an atomic fashion.
+++ */
+++static void ee93xx_ts_evt_add(int buttons, int iX, int iY, int iPressure)
+++{
+++ /*
+++ * Note the event, but use spinlocks to keep it from getting
+++ * halfway read if we get interrupted.
+++ */
+++
+++ spin_lock(&event_buffer_lock);
+++
+++ gSample.currentX = iX;
+++ gSample.currentY = iY;
+++ gSample.currentButton = buttons;
+++ gSample.currentPressure = iPressure;
+++ bFreshTouchData = 1;
+++ do_gettimeofday(&gSample.currentTime);
+++
+++ spin_unlock(&event_buffer_lock);
+++
+++ kill_fasync(&ep93xx_fasync, SIGIO, POLL_IN);
+++ wake_up_interruptible(&queue);
+++}
+++
+++
+++static ssize_t ep93xx_ts_read(struct file *filp, char *buf, size_t count, loff_t *l)
+++{
+++ unsigned short data[3];
+++ struct ts_sample ts_data;
+++ int iReturn = -EFAULT;
+++
+++ if (!bFreshTouchData)
+++ {
+++ iReturn = 0;
+++ }
+++ else if (count == sizeof(data))
+++ {
+++ spin_lock_irq(&event_buffer_lock);
+++ bFreshTouchData = 0;
+++ data[0] = gSample.currentX;
+++ data[1] = gSample.currentY;
+++ data[2] = gSample.currentButton;
+++
+++ spin_unlock_irq(&event_buffer_lock);
+++
+++ if (copy_to_user(buf, data, sizeof data))
+++ return -EFAULT;
+++
+++ count -= sizeof(data);
+++
+++ /* return the # of bytes that got read */
+++ iReturn = sizeof(data) ;
+++ }
+++ else if (count == sizeof(struct ts_sample) )
+++ {
+++ spin_lock_irq(&event_buffer_lock);
+++ bFreshTouchData = 0;
+++ ts_data.x = gSample.currentX;
+++ ts_data.y = gSample.currentY;
+++ ts_data.pressure = gSample.currentPressure;
+++ ts_data.tv = gSample.currentTime;
+++ spin_unlock_irq(&event_buffer_lock);
+++
+++ if (copy_to_user(buf, &ts_data, sizeof(struct ts_sample)))
+++ {
+++ iReturn = -EFAULT;
+++ }
+++ else
+++ {
+++ count -= sizeof(ts_data);
+++ iReturn = sizeof(ts_data);
+++ }
+++ }
+++
+++ return iReturn;
+++}
+++
+++static unsigned int ep93xx_ts_poll(struct file *filp, poll_table *wait)
+++{
+++ poll_wait(filp, &queue, wait);
+++
+++ if (bFreshTouchData)
+++ {
+++ return POLLIN | POLLRDNORM;
+++ }
+++
+++ return 0;
+++}
+++
+++static int ep93xx_ts_open(struct inode *inode, struct file *filp)
+++{
+++ if (down_trylock(&open_sem))
+++ {
+++ return -EBUSY;
+++ }
+++
+++ ep93xx_ts_setup();
+++
+++ return 0;
+++}
+++
+++/*
+++ * Asynchronous I/O support.
+++ */
+++static int ep93xx_ts_fasync(int fd, struct file *filp, int on)
+++{
+++ int retval;
+++
+++ retval = fasync_helper(fd, filp, on, &ep93xx_fasync);
+++ if (retval < 0)
+++ {
+++ return retval;
+++ }
+++
+++ return 0;
+++}
+++
+++static int ep93xx_ts_release(struct inode *inode, struct file *filp)
+++{
+++ Stop_Timer2();
+++
+++ /*
+++ * Call our async I/O support to request that this file
+++ * cease to be used for async I/O.
+++ */
+++ ep93xx_ts_fasync(-1, filp, 0);
+++
+++ ep93xx_ts_shutdown();
+++
+++ up(&open_sem);
+++
+++ return 0;
+++}
+++
+++static ssize_t ep93xx_ts_write(struct file *file, const char *buffer, size_t count,
+++ loff_t *ppos)
+++{
+++ return -EINVAL;
+++}
+++
+++
+++static int ep93xx_ts_ioctl(struct inode *inode, struct file *file, uint command, ulong u)
+++{
+++ static const int version = EV_VERSION;
+++ static const u_int32_t bit =(1 << EV_ABS);
+++ static const u_int32_t absbit = (1 << ABS_X) | (1 << ABS_Y) | (1 << ABS_PRESSURE);
+++ int iReturn ;
+++ int i = 0;
+++
+++ switch(command)
+++ {
+++ case EVIOCGVERSION:
+++ i = copy_to_user((void __user *)u, (void *)version, sizeof(version));
+++ iReturn = i ? -EFAULT : 0;
+++ break;
+++
+++ case EVIOCGBIT(0,sizeof(u_int32_t) * 8) :
+++ i = copy_to_user((void __user *)u, (void *)bit, sizeof(bit));
+++ iReturn = i ? -EFAULT : 0;
+++ break;
+++
+++ case EVIOCGBIT(EV_ABS, sizeof(absbit) * 8):
+++ i = copy_to_user((void __user *)u, (void *)absbit, sizeof(absbit));
+++ iReturn = i ? -EFAULT : 0;
+++ break;
+++ default:
+++ iReturn = -1;
+++ break;
+++ }
+++
+++ return iReturn;
+++}
+++
+++static struct file_operations ep93xx_ts_fops = {
+++ owner: THIS_MODULE,
+++ read: ep93xx_ts_read,
+++ write: ep93xx_ts_write,
+++ poll: ep93xx_ts_poll,
+++ open: ep93xx_ts_open,
+++ unlocked_ioctl: ep93xx_ts_ioctl,
+++ release: ep93xx_ts_release,
+++ fasync: ep93xx_ts_fasync,
+++};
+++
+++static struct miscdevice ep93xx_ts_miscdev =
+++{
+++ EP93XX_TS_MINOR,
+++ "ep93xx_ts",
+++ &ep93xx_ts_fops
+++};
+++
+++void ep93xx_ts_setup(void)
+++{
+++ unsigned int uiKTDIV, uiTSXYMaxMin;
+++
+++ /*
+++ * Set the TSEN bit in KTDIV so that we are enabling the clock
+++ * for the touchscreen.
+++ */
+++ uiKTDIV = __raw_readl(EP93XX_SYSCON_KEYTCHCLKDIV);
+++ uiKTDIV |= EP93XX_SYSCON_KEYTCHCLKDIV_TSEN;
+++ ep93xx_syscon_swlocked_write(uiKTDIV, EP93XX_SYSCON_KEYTCHCLKDIV);
+++
+++ /*
+++ * Program the EP93XX_TOUCHSCREEN_SETUP and TSSetup2 registers.
+++ */
+++ __raw_writel(TSSETUP_DEFAULT, EP93XX_TOUCHSCREEN_SETUP);
+++ __raw_writel(TSSETUP2_DEFAULT, EP93XX_TOUCHSCREEN_SETUP2);
+++
+++ /*
+++ * Set the the touch settings.
+++ */
+++ __raw_writel(0xaa, EP93XX_TOUCHSCREEN_SWLOCK);
+++ __raw_writel(sSwitchSettings.uiDischarge, EP93XX_TOUCHSCREEN_DIRECT);
+++
+++ __raw_writel(0xaa, EP93XX_TOUCHSCREEN_SWLOCK);
+++ __raw_writel(sSwitchSettings.uiDischarge, EP93XX_TOUCHSCREEN_DISCHARGE);
+++
+++ __raw_writel(0xaa, EP93XX_TOUCHSCREEN_SWLOCK);
+++ __raw_writel(sSwitchSettings.uiSwitchZ1, EP93XX_TOUCHSCREEN_XSAMPLE);
+++
+++ __raw_writel(0xaa, EP93XX_TOUCHSCREEN_SWLOCK);
+++ __raw_writel(sSwitchSettings.uiSwitchZ2, EP93XX_TOUCHSCREEN_YSAMPLE);
+++
+++ __raw_writel(0xaa, EP93XX_TOUCHSCREEN_SWLOCK);
+++ __raw_writel(sSwitchSettings.uiDetect, EP93XX_TOUCHSCREEN_DETECT);
+++
+++ /*
+++ * X,YMin set to 0x40 = have to drag that many pixels for a new irq.
+++ * X,YMax set to 0x40 = 1024 pixels is the maximum movement within the
+++ * time scan limit.
+++ */
+++ uiTSXYMaxMin = (50 << TSMAXMIN_XMIN_SHIFT) & TSMAXMIN_XMIN_MASK;
+++ uiTSXYMaxMin |= (50 << TSMAXMIN_YMIN_SHIFT) & TSMAXMIN_YMIN_MASK;
+++ uiTSXYMaxMin |= (0xff << TSMAXMIN_XMAX_SHIFT) & TSMAXMIN_XMAX_MASK;
+++ uiTSXYMaxMin |= (0xff << TSMAXMIN_YMAX_SHIFT) & TSMAXMIN_YMAX_MASK;
+++ __raw_writel(uiTSXYMaxMin, EP93XX_TOUCHSCREEN_XYMAXMIN);
+++
+++ bCurrentPenDown = 0;
+++ bFreshTouchData = 0;
+++ guiLastX = 0;
+++ guiLastY = 0;
+++ guiLastInvPressure = 0xffffff;
+++
+++ /*
+++ * Enable the touch screen scanning engine.
+++ */
+++ TS_Hardware_Scan_Mode();
+++}
+++
+++/*
+++ * ep93xx_ts_shutdown
+++ *
+++ */
+++static void
+++ep93xx_ts_shutdown(void)
+++{
+++ unsigned int uiKTDIV;
+++
+++ sTouch.state = TS_STATE_STOPPED;
+++ Stop_Timer2();
+++
+++ /*
+++ * Disable the scanning engine.
+++ */
+++ __raw_writel(0, EP93XX_TOUCHSCREEN_SETUP);
+++ __raw_writel(0, EP93XX_TOUCHSCREEN_SETUP2);
+++
+++ /*
+++ * Clear the TSEN bit in KTDIV so that we are disabling the clock
+++ * for the touchscreen.
+++ */
+++ uiKTDIV = __raw_readl(EP93XX_SYSCON_KEYTCHCLKDIV);
+++ uiKTDIV &= ~EP93XX_SYSCON_KEYTCHCLKDIV_TSEN;
+++ ep93xx_syscon_swlocked_write(uiKTDIV, EP93XX_SYSCON_KEYTCHCLKDIV);
+++
+++} /* ep93xx_ts_shutdown */
+++
+++static irqreturn_t ep93xx_timer2_isr(int irq, void *dev_id)
+++{
+++ switch(sTouch.state)
+++ {
+++ case TS_STATE_STOPPED:
+++ TS_Hardware_Scan_Mode();
+++ break;
+++
+++ /*
+++ * Get the Z1 value for pressure measurement and set up
+++ * the switch register for getting the Z2 measurement.
+++ */
+++ case TS_STATE_Z1:
+++ Set_Timer2_uSec(EP93XX_TS_ADC_DELAY_USEC);
+++ sTouch.uiZ1 = ADCGetData(2, 200);
+++ ep93xx_ts_set_direct(sSwitchSettings.uiSwitchZ2);
+++ sTouch.state = TS_STATE_Z2;
+++ break;
+++
+++ /*
+++ * Get the Z2 value for pressure measurement and set up
+++ * the switch register for getting the Y measurement.
+++ */
+++ case TS_STATE_Z2:
+++ sTouch.uiZ2 = ADCGetData(2, 200);
+++ ep93xx_ts_set_direct(sSwitchSettings.uiYSample);
+++ sTouch.state = TS_STATE_Y;
+++ break;
+++
+++ /*
+++ * Get the Y value and set up the switch register for
+++ * getting the X measurement.
+++ */
+++ case TS_STATE_Y:
+++ sTouch.uiY = ADCGetData(4, 20);
+++ ep93xx_ts_set_direct(sSwitchSettings.uiXSample);
+++ sTouch.state = TS_STATE_X;
+++ break;
+++
+++ /*
+++ * Read the X value. This is the last of the 4 adc values
+++ * we need so we continue on to process the data.
+++ */
+++ case TS_STATE_X:
+++ Stop_Timer2();
+++
+++ sTouch.uiX = ADCGetData(4, 20);
+++
+++ __raw_writel(0xaa, EP93XX_TOUCHSCREEN_SWLOCK);
+++ __raw_writel(sSwitchSettings.uiDischarge, EP93XX_TOUCHSCREEN_DIRECT);
+++
+++ sTouch.state = TS_STATE_DONE;
+++
+++ /*
+++ * Process this set of ADC readings.
+++ */
+++ ProcessPointData();
+++
+++ break;
+++
+++ /*
+++ * Shouldn't get here. But if we do, we can recover...
+++ */
+++ case TS_STATE_DONE:
+++ TS_Hardware_Scan_Mode();
+++ break;
+++ }
+++
+++ /*
+++ * Clear the timer2 interrupt.
+++ */
+++ __raw_writel(1, EP93XX_TIMER2_CLEAR);
+++ return(IRQ_HANDLED);
+++}
+++
+++/*---------------------------------------------------------------------
+++ * ProcessPointData
+++ *
+++ * This routine processes the ADC data into usable point data and then
+++ * puts the driver into hw or sw scanning mode before returning.
+++ *
+++ * We calculate inverse pressure (lower number = more pressure) then
+++ * do a hystheresis with the two pressure values 'light' and 'heavy'.
+++ *
+++ * If we are above the light, we have pen up.
+++ * If we are below the heavy we have pen down.
+++ * As long as the pressure stays below the light, pen stays down.
+++ * When we get above the light again, pen goes back up.
+++ *
+++ */
+++static void ProcessPointData(void)
+++{
+++ int bValidPoint = 0;
+++ unsigned int uiXDiff, uiYDiff, uiInvPressureDiff;
+++ unsigned int uiInvPressure;
+++
+++ /*
+++ * Calculate the current pressure.
+++ */
+++ uiInvPressure = CalculateInvPressure();
+++
+++ /*
+++ * If pen pressure is so light that it is greater than the 'max' setting
+++ * then we consider this to be a pen up.
+++ */
+++ if (uiInvPressure >= TS_LIGHT_INV_PRESSURE)
+++ {
+++ bCurrentPenDown = 0;
+++ ee93xx_ts_evt_add(0, guiLastX, guiLastY, 0);
+++ TS_Hardware_Scan_Mode();
+++ return;
+++ }
+++
+++ /*
+++ * Hysteresis:
+++ * If the pen pressure is hard enough to be less than the 'min' OR
+++ * the pen is already down and is still less than the 'max'...
+++ */
+++ if ((uiInvPressure < TS_HEAVY_INV_PRESSURE) ||
+++ (bCurrentPenDown && (uiInvPressure < TS_LIGHT_INV_PRESSURE)))
+++ {
+++ if (bCurrentPenDown)
+++ {
+++ /*
+++ * If pen was previously down, check the difference between
+++ * the last sample and this one... if the difference between
+++ * samples is too great, ignore the sample.
+++ */
+++ uiXDiff = abs(guiLastX - sTouch.uiX);
+++ uiYDiff = abs(guiLastY - sTouch.uiY);
+++ uiInvPressureDiff = abs(guiLastInvPressure - uiInvPressure);
+++
+++ if (uiXDiff < TS_MAX_VALID_XY_CHANGE
+++ && uiYDiff < TS_MAX_VALID_XY_CHANGE
+++ && uiInvPressureDiff < TS_MAX_VALID_PRESSURE_CHANGE)
+++ {
+++ bValidPoint = 1;
+++ }
+++ }
+++ else
+++ {
+++ bValidPoint = 1;
+++ }
+++
+++ /*
+++ * If either the pen was put down or dragged make a note of it.
+++ */
+++ if (bValidPoint)
+++ {
+++ guiLastX = sTouch.uiX;
+++ guiLastY = sTouch.uiY;
+++ guiLastInvPressure = uiInvPressure;
+++ bCurrentPenDown = 1;
+++ ee93xx_ts_evt_add(1, sTouch.uiX, sTouch.uiY,
+++ 0x7000000 / uiInvPressure);
+++ }
+++
+++ TS_Soft_Scan_Mode();
+++ return;
+++ }
+++
+++ TS_Hardware_Scan_Mode();
+++}
+++
+++static void ep93xx_ts_set_direct(unsigned int uiADCSwitch)
+++{
+++ unsigned int uiResult;
+++
+++ /*
+++ * Set the switch settings in the direct register.
+++ */
+++ __raw_writel(0xaa, EP93XX_TOUCHSCREEN_SWLOCK);
+++ __raw_writel(uiADCSwitch, EP93XX_TOUCHSCREEN_DIRECT);
+++
+++ /*
+++ * Read and throw away the first sample.
+++ */
+++ do {
+++ uiResult = __raw_readl(EP93XX_TOUCHSCREEN_XYRESULT);
+++ } while (!(uiResult & TSXYRESULT_SDR));
+++
+++}
+++
+++static unsigned int ADCGetData(unsigned int uiSamples, unsigned int uiMaxDiff)
+++{
+++ unsigned int uiResult, uiValue, uiCount, uiLowest, uiHighest, uiSum, uiAve;
+++
+++ do
+++ {
+++ /*
+++ * Initialize our values.
+++ */
+++ uiLowest = 0xfffffff;
+++ uiHighest = 0;
+++ uiSum = 0;
+++
+++ for (uiCount = 0; uiCount < uiSamples; uiCount++)
+++ {
+++ /*
+++ * Read the touch screen four more times and average.
+++ */
+++ do {
+++ uiResult = __raw_readl(EP93XX_TOUCHSCREEN_XYRESULT);
+++ } while (!(uiResult & TSXYRESULT_SDR));
+++
+++ uiValue = (uiResult & TSXYRESULT_AD_MASK) >> TSXYRESULT_AD_SHIFT;
+++ uiValue = ((uiValue >> 4) + ((1 + TSXYRESULT_X_MASK)>>1)) & TSXYRESULT_X_MASK;
+++
+++ /*
+++ * Add up the values.
+++ */
+++ uiSum += uiValue;
+++
+++ /*
+++ * Get the lowest and highest values.
+++ */
+++ if (uiValue < uiLowest)
+++ {
+++ uiLowest = uiValue;
+++ }
+++ if (uiValue > uiHighest)
+++ {
+++ uiHighest = uiValue;
+++ }
+++ }
+++ } while ((uiHighest - uiLowest) > uiMaxDiff);
+++
+++ /*
+++ * Calculate the Average value.
+++ */
+++ uiAve = uiSum / uiSamples;
+++
+++ return uiAve;
+++}
+++
+++/*
+++ * CalculateInvPressure
+++ *
+++ * Is the Touch Valid. Touch is not valid if the X or Y value is not
+++ * in range and the pressure is not enough.
+++ *
+++ * Touch resistance can be measured by the following formula:
+++ *
+++ * Rx * X * Z2
+++ * Rtouch = --------- * (-- - 1)
+++ * 4096 Z1
+++ *
+++ * This is simplified in the ration of Rtouch to Rx. The lower the value, the
+++ * higher the pressure.
+++ *
+++ * Z2
+++ * InvPressure = X * (-- - 1)
+++ * Z1
+++ */
+++static unsigned int CalculateInvPressure(void)
+++{
+++ unsigned int uiInvPressure;
+++
+++ /*
+++ * Check to see if the point is valid.
+++ */
+++ if (sTouch.uiZ1 < MIN_Z1_VALUE)
+++ {
+++ uiInvPressure = 0x10000;
+++ }
+++
+++ /*
+++ * Can omit the pressure calculation if you need to get rid of the division.
+++ */
+++ else
+++ {
+++ uiInvPressure = ((sTouch.uiX * sTouch.uiZ2) / sTouch.uiZ1) - sTouch.uiX;
+++ }
+++
+++ return uiInvPressure;
+++}
+++
+++/*
+++ * TS_Hardware_Scan_Mode
+++ *
+++ * Enables the ep93xx ts scanning engine so that when the pen goes down
+++ * we will get an interrupt.
+++ */
+++static void TS_Hardware_Scan_Mode(void)
+++{
+++ unsigned int uiDevCfg;
+++
+++ /*
+++ * Disable the soft scanning engine.
+++ */
+++ sTouch.state = TS_STATE_STOPPED;
+++ Stop_Timer2();
+++
+++ /*
+++ * Clear the TIN (Touchscreen INactive) bit so we can go to
+++ * automatic scanning mode.
+++ */
+++ uiDevCfg = __raw_readl(EP93XX_SYSCON_DEVCFG);
+++ ep93xx_syscon_swlocked_write(uiDevCfg & ~EP93XX_SYSCON_DEVCFG_TIN,
+++ EP93XX_SYSCON_DEVCFG);
+++
+++ /*
+++ * Enable the touch screen scanning state machine by setting
+++ * the ENABLE bit.
+++ */
+++ __raw_writel(TSSETUP_DEFAULT | TSSETUP_ENABLE, EP93XX_TOUCHSCREEN_SETUP);
+++
+++ /*
+++ * Set the flag to show that we are in interrupt mode.
+++ */
+++ gScanningMode = TS_MODE_HARDWARE_SCAN;
+++
+++ /*
+++ * Initialize EP93XX_TOUCHSCREEN_SETUP2 register.
+++ */
+++ __raw_writel(TSSETUP2_DEFAULT, EP93XX_TOUCHSCREEN_SETUP2);
+++
+++}
+++
+++/*
+++ * TS_Soft_Scan_Mode
+++ *
+++ * Sets the touch screen to manual polling mode.
+++ */
+++static void TS_Soft_Scan_Mode(void)
+++{
+++ unsigned int uiDevCfg;
+++
+++ if (gScanningMode != TS_MODE_SOFT_SCAN)
+++ {
+++ /*
+++ * Disable the touch screen scanning state machine by clearing
+++ * the ENABLE bit.
+++ */
+++ __raw_writel(TSSETUP_DEFAULT, EP93XX_TOUCHSCREEN_SETUP);
+++
+++ /*
+++ * Set the TIN bit so we can do manual touchscreen polling.
+++ */
+++ uiDevCfg = __raw_readl(EP93XX_SYSCON_DEVCFG);
+++ ep93xx_syscon_swlocked_write(uiDevCfg | EP93XX_SYSCON_DEVCFG_TIN,
+++ EP93XX_SYSCON_DEVCFG);
+++ }
+++
+++ /*
+++ * Set the switch register up for the first ADC reading
+++ */
+++ ep93xx_ts_set_direct(sSwitchSettings.uiSwitchZ1);
+++
+++ /*
+++ * Initialize our software state machine to know which ADC
+++ * reading to take
+++ */
+++ sTouch.state = TS_STATE_Z1;
+++
+++ /*
+++ * Set the timer so after a mSec or two settling delay it will
+++ * take the first ADC reading.
+++ */
+++ Set_Timer2_uSec(EP93XX_TS_PER_POINT_DELAY_USEC);
+++
+++ /*
+++ * Note that we are in sw scanning mode not hw scanning mode.
+++ */
+++ gScanningMode = TS_MODE_SOFT_SCAN;
+++
+++}
+++
+++static void Set_Timer2_uSec(unsigned int uiDelay_uSec)
+++{
+++ unsigned int uiClockTicks;
+++
+++ /*
+++ * Stop timer 2
+++ */
+++ __raw_writel(0, EP93XX_TIMER2_CONTROL);
+++
+++ uiClockTicks = ((uiDelay_uSec * 508) + 999) / 1000;
+++ __raw_writel(uiClockTicks, EP93XX_TIMER2_LOAD);
+++ __raw_writel(uiClockTicks, EP93XX_TIMER2_VALUE);
+++
+++ /*
+++ * Set up Timer 2 for 508 kHz clock and periodic mode.
+++ */
+++ __raw_writel(0xC8, EP93XX_TIMER2_CONTROL);
+++
+++}
+++
+++static void Stop_Timer2(void)
+++{
+++ __raw_writel(0, EP93XX_TIMER2_CONTROL);
+++}
+++
+++/*
+++ * Initialization and exit routines
+++ */
+++int __init ep93xx_ts_init(void)
+++{
+++ int retval;
+++
+++ retval = request_irq(IRQ_EP93XX_TOUCH, ep93xx_ts_isr,
+++ IRQF_DISABLED, "ep93xx_ts", 0);
+++ if (retval)
+++ {
+++ printk(KERN_WARNING "ep93xx_ts: failed to get touchscreen IRQ\n");
+++ return retval;
+++ }
+++
+++ retval = request_irq(IRQ_EP93XX_TIMER2, ep93xx_timer2_isr,
+++ IRQF_DISABLED, "ep93xx_timer2", 0);
+++ if (retval)
+++ {
+++ printk(KERN_WARNING "ep93xx_ts: failed to get timer2 IRQ\n");
+++ free_irq(IRQ_EP93XX_TOUCH, 0);
+++ return retval;
+++ }
+++
+++ misc_register(&ep93xx_ts_miscdev);
+++
+++ sTouch.state = TS_STATE_STOPPED;
+++ gScanningMode = TS_MODE_UN_INITIALIZED;
+++
+++ printk(KERN_NOTICE "ep93xx touchscreen driver configured for 4-wire operation\n");
+++
+++ return 0;
+++}
+++
+++void __exit ep93xx_ts_exit(void)
+++{
+++ Stop_Timer2();
+++
+++ free_irq(IRQ_EP93XX_TOUCH, 0);
+++ free_irq(IRQ_EP93XX_TIMER2, 0);
+++
+++ misc_deregister(&ep93xx_ts_miscdev);
+++}
+++
+++module_init(ep93xx_ts_init);
+++module_exit(ep93xx_ts_exit);
+++
+++MODULE_DESCRIPTION("Cirrus EP93xx touchscreen driver");
+++MODULE_SUPPORTED_DEVICE("touchscreen/ep93xx");
+++MODULE_LICENSE("GPL");
++--- a/arch/arm/mach-ep93xx/core.c
+++++ b/arch/arm/mach-ep93xx/core.c
++@@ -211,6 +211,7 @@ void ep93xx_syscon_swlocked_write(unsign
++
++ spin_unlock_irqrestore(&syscon_swlock, flags);
++ }
+++EXPORT_SYMBOL(ep93xx_syscon_swlocked_write);
++
++ void ep93xx_devcfg_set_clear(unsigned int set_bits, unsigned int clear_bits)
++ {
+diff --git a/feeds/targets/ep93xx/patches-3.18/004-simone_add_mmc_spi.patch b/feeds/targets/ep93xx/patches-3.18/004-simone_add_mmc_spi.patch
+new file mode 100644
+index 0000000..3e6b0fa
+--- /dev/null
++++ b/feeds/targets/ep93xx/patches-3.18/004-simone_add_mmc_spi.patch
+@@ -0,0 +1,178 @@
++This enables the mmc-over-spi driver for the Sim.One board, based on Mika's
++patch, which used a GPIO for chip select in stead of the default SFRMOUT pin.
++I've modified it to use the usual SFRMOUT; if you've modified your Sim.One
++board to use a GPIO instead, uncomment and modify
++// #define MMC_CHIP_SELECT_GPIO EP93XX_GPIO_LINE_EGPIO15
++in the source file.
++ -martinwguy, 14 May 2010
++
++From: Mika Westerberg <mika.westerberg@iki.fi>
++Date: Wed, 28 Apr 2010 08:42:46 +0300
++Subject: [PATCH] ep93xx: simone: added board specific SPI support for MMC/SD cards
++
++This includes setting up EGPIOs 0 and 9 for card detection and chip select
++respectively.
++
++--- a/arch/arm/mach-ep93xx/simone.c
+++++ b/arch/arm/mach-ep93xx/simone.c
++@@ -20,10 +20,15 @@
++ #include <linux/platform_device.h>
++ #include <linux/i2c.h>
++ #include <linux/i2c-gpio.h>
+++#include <linux/gpio.h>
+++#include <linux/mmc/host.h>
+++#include <linux/spi/spi.h>
+++#include <linux/spi/mmc_spi.h>
++
++ #include <mach/hardware.h>
++ #include <linux/platform_data/video-ep93xx.h>
++ #include <mach/gpio-ep93xx.h>
+++#include <linux/platform_data/spi-ep93xx.h>
++
++ #include <asm/mach-types.h>
++ #include <asm/mach/arch.h>
++@@ -40,6 +45,135 @@ static struct ep93xxfb_mach_info __initd
++ .flags = EP93XXFB_USE_SDCSN0 | EP93XXFB_PCLK_FALLING,
++ };
++
+++/*
+++ * GPIO lines used for MMC card detection.
+++ */
+++#define MMC_CARD_DETECT_GPIO EP93XX_GPIO_LINE_EGPIO0
+++
+++/*
+++ * If you have hacked your Sim.One to use a GPIO as SD card chip select
+++ * (SD pin 1), uncomment the following line.
+++ * The example, EGPIO15, is on TP17 near the CPU.
+++ */
+++// #define MMC_CHIP_SELECT_GPIO EP93XX_GPIO_LINE_EGPIO15
+++
+++/*
+++ * MMC SPI chip select GPIO handling. If you are using SFRMOUT (SFRM1) signal,
+++ * you can leave these empty and pass NULL as .controller_data.
+++ */
+++
+++#ifdef MMC_CHIP_SELECT_GPIO
+++static int simone_mmc_spi_setup(struct spi_device *spi)
+++{
+++ unsigned int gpio = MMC_CHIP_SELECT_GPIO;
+++ int err;
+++
+++ err = gpio_request(gpio, spi->modalias);
+++ if (err)
+++ return err;
+++
+++ err = gpio_direction_output(gpio, 1);
+++ if (err) {
+++ gpio_free(gpio);
+++ return err;
+++ }
+++
+++ return 0;
+++}
+++
+++static void simone_mmc_spi_cleanup(struct spi_device *spi)
+++{
+++ unsigned int gpio = MMC_CHIP_SELECT_GPIO;
+++
+++ gpio_set_value(gpio, 1);
+++ gpio_direction_input(gpio);
+++ gpio_free(gpio);
+++}
+++
+++static void simone_mmc_spi_cs_control(struct spi_device *spi, int value)
+++{
+++ gpio_set_value(MMC_CHIP_SELECT_GPIO, value);
+++}
+++
+++static struct ep93xx_spi_chip_ops simone_mmc_spi_ops = {
+++ .setup = simone_mmc_spi_setup,
+++ .cleanup = simone_mmc_spi_cleanup,
+++ .cs_control = simone_mmc_spi_cs_control,
+++};
+++#endif
+++
+++/*
+++ * MMC card detection GPIO setup.
+++ */
+++static int simone_mmc_spi_init(struct device *dev,
+++ irqreturn_t (*irq_handler)(int, void *), void *mmc)
+++{
+++ unsigned int gpio = MMC_CARD_DETECT_GPIO;
+++ int irq, err;
+++
+++ err = gpio_request(gpio, dev_name(dev));
+++ if (err)
+++ return err;
+++
+++ err = gpio_direction_input(gpio);
+++ if (err)
+++ goto fail;
+++
+++ irq = gpio_to_irq(gpio);
+++ if (irq < 0)
+++ goto fail;
+++
+++ err = request_irq(irq, irq_handler, IRQF_TRIGGER_FALLING,
+++ "MMC card detect", mmc);
+++ if (err)
+++ goto fail;
+++
+++ printk(KERN_INFO "%s: using irq %d for MMC card detection\n",
+++ dev_name(dev), irq);
+++
+++ return 0;
+++fail:
+++ gpio_free(gpio);
+++ return err;
+++}
+++
+++static void simone_mmc_spi_exit(struct device *dev, void *mmc)
+++{
+++ unsigned int gpio = MMC_CARD_DETECT_GPIO;
+++
+++ free_irq(gpio_to_irq(gpio), mmc);
+++ gpio_free(gpio);
+++}
+++
+++static struct mmc_spi_platform_data simone_mmc_spi_data = {
+++ .init = simone_mmc_spi_init,
+++ .exit = simone_mmc_spi_exit,
+++ .detect_delay = 500,
+++ .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
+++};
+++
+++static struct spi_board_info simone_spi_devices[] __initdata = {
+++ {
+++ .modalias = "mmc_spi",
+++#ifdef MMC_CHIP_SELECT_GPIO
+++ .controller_data = &simone_mmc_spi_ops,
+++#endif
+++ .platform_data = &simone_mmc_spi_data,
+++ /*
+++ * We use 10 MHz even though the maximum is 3.7 MHz. The driver
+++ * will limit it automatically to max. frequency.
+++ */
+++ .max_speed_hz = 10 * 1000 * 1000,
+++ .bus_num = 0,
+++ .chip_select = 0,
+++ .mode = SPI_MODE_3,
+++ },
+++};
+++
+++static struct ep93xx_spi_info simone_spi_info __initdata = {
+++ .num_chipselect = ARRAY_SIZE(simone_spi_devices),
+++};
+++
++ static struct i2c_gpio_platform_data __initdata simone_i2c_gpio_data = {
++ .sda_pin = EP93XX_GPIO_LINE_EEDAT,
++ .sda_is_open_drain = 0,
++@@ -74,6 +208,8 @@ static void __init simone_init_machine(v
++ ep93xx_register_fb(&simone_fb_info);
++ ep93xx_register_i2c(&simone_i2c_gpio_data, simone_i2c_board_info,
++ ARRAY_SIZE(simone_i2c_board_info));
+++ ep93xx_register_spi(&simone_spi_info, simone_spi_devices,
+++ ARRAY_SIZE(simone_spi_devices));
++ simone_register_audio();
++ }
++
+diff --git a/feeds/targets/ep93xx/profiles/00-default.mk b/feeds/targets/ep93xx/profiles/00-default.mk
+new file mode 100644
+index 0000000..1c43dc6
+--- /dev/null
++++ b/feeds/targets/ep93xx/profiles/00-default.mk
+@@ -0,0 +1,17 @@
++#
++# Copyright (C) 2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Profile/Default
++ NAME:=Default Profile
++ PACKAGES:= \
++ kmod-usb-core kmod-usb-ohci
++endef
++
++define Profile/Default/Description
++ Default package set compatible with most EP93xx-based boards.
++endef
++$(eval $(call Profile,Default))
+diff --git a/feeds/targets/ep93xx/profiles/01-simone.mk b/feeds/targets/ep93xx/profiles/01-simone.mk
+new file mode 100644
+index 0000000..346e551
+--- /dev/null
++++ b/feeds/targets/ep93xx/profiles/01-simone.mk
+@@ -0,0 +1,23 @@
++#
++# Copyright (C) 2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define Profile/Simone
++ NAME:=Simplemachines Sim.One
++ PACKAGES:= \
++ kmod-input-core \
++ kmod-input-evdev \
++ kmod-input-keyboard-ep93xx \
++ kmod-sound-core \
++ kmod-sound-soc-ep93xx \
++ kmod-sound-soc-ep93xx-ac97 \
++ kmod-sound-soc-ep93xx-simone
++endef
++
++define Profile/Simone/Description
++ Package set compatible with the Simplemachines Sim.One board.
++endef
++$(eval $(call Profile,Simone))
+diff --git a/feeds/targets/iop32x/Makefile b/feeds/targets/iop32x/Makefile
+new file mode 100644
+index 0000000..1159c74
+--- /dev/null
++++ b/feeds/targets/iop32x/Makefile
+@@ -0,0 +1,21 @@
++#
++# Copyright (C) 2007-2011 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++ARCH:=arm
++BOARD:=iop32x
++BOARDNAME:=Intel IOP32x
++FEATURES:=squashfs broken
++MAINTAINER:=Imre Kaloz <kaloz@openwrt.org>
++
++KERNEL_PATCHVER:=3.3
++
++include $(INCLUDE_DIR)/target.mk
++
++KERNELNAME:=zImage
++
++$(eval $(call BuildTarget))
+diff --git a/feeds/targets/iop32x/base-files/etc/config/network b/feeds/targets/iop32x/base-files/etc/config/network
+new file mode 100644
+index 0000000..2c3ca87
+--- /dev/null
++++ b/feeds/targets/iop32x/base-files/etc/config/network
+@@ -0,0 +1,16 @@
++# Network configuration file
++
++config interface loopback
++ option ifname lo
++ option proto static
++ option ipaddr 127.0.0.1
++ option netmask 255.0.0.0
++
++config interface lan
++ option ifname eth0
++ option proto dhcp
++
++config interface lan6
++ option ifname @lan
++ option proto dhcpv6
++ option reqprefix no
+diff --git a/feeds/targets/iop32x/config-3.3 b/feeds/targets/iop32x/config-3.3
+new file mode 100644
+index 0000000..d38e059
+--- /dev/null
++++ b/feeds/targets/iop32x/config-3.3
+@@ -0,0 +1,133 @@
++CONFIG_ALIGNMENT_TRAP=y
++CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
++CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
++CONFIG_ARCH_IOP32X=y
++# CONFIG_ARCH_IQ31244 is not set
++# CONFIG_ARCH_IQ80321 is not set
++CONFIG_ARCH_NR_GPIO=0
++CONFIG_ARCH_REQUIRE_GPIOLIB=y
++# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
++# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++# CONFIG_ARCH_USES_GETTIMEOFFSET is not set
++CONFIG_ARM=y
++# CONFIG_ARM_CPU_SUSPEND is not set
++CONFIG_ARM_L1_CACHE_SHIFT=5
++CONFIG_ARM_NR_BANKS=8
++CONFIG_ARM_PATCH_PHYS_VIRT=y
++# CONFIG_ARM_THUMB is not set
++# CONFIG_ARPD is not set
++CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y
++# CONFIG_CACHE_L2X0 is not set
++CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200"
++CONFIG_CMDLINE_FROM_BOOTLOADER=y
++CONFIG_CPU_32v5=y
++CONFIG_CPU_ABRT_EV5T=y
++CONFIG_CPU_CACHE_VIVT=y
++CONFIG_CPU_CP15=y
++CONFIG_CPU_CP15_MMU=y
++CONFIG_CPU_HAS_PMU=y
++CONFIG_CPU_PABRT_LEGACY=y
++CONFIG_CPU_TLB_V4WBI=y
++CONFIG_CPU_USE_DOMAINS=y
++CONFIG_CPU_XSCALE=y
++# CONFIG_DEBUG_USER is not set
++CONFIG_DECOMPRESS_LZMA=y
++CONFIG_DLCI_MAX=8
++CONFIG_DMADEVICES=y
++CONFIG_DMA_ENGINE=y
++CONFIG_DNOTIFY=y
++# CONFIG_DSCC4 is not set
++CONFIG_E1000=y
++# CONFIG_FARSYNC is not set
++CONFIG_FRAME_POINTER=y
++CONFIG_GENERIC_ATOMIC64=y
++CONFIG_GENERIC_BUG=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++CONFIG_GENERIC_GPIO=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_PCI_IOMAP=y
++CONFIG_GPIOLIB=y
++CONFIG_HARDIRQS_SW_RESEND=y
++CONFIG_HAS_DMA=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAVE_AOUT=y
++CONFIG_HAVE_ARCH_KGDB=y
++CONFIG_HAVE_ARCH_PFN_VALID=y
++CONFIG_HAVE_C_RECORDMCOUNT=y
++CONFIG_HAVE_DMA_API_DEBUG=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_FUNCTION_TRACER=y
++CONFIG_HAVE_GENERIC_DMA_COHERENT=y
++CONFIG_HAVE_GENERIC_HARDIRQS=y
++CONFIG_HAVE_IDE=y
++CONFIG_HAVE_IRQ_WORK=y
++CONFIG_HAVE_KERNEL_GZIP=y
++CONFIG_HAVE_KERNEL_LZMA=y
++CONFIG_HAVE_KERNEL_LZO=y
++CONFIG_HAVE_KERNEL_XZ=y
++CONFIG_HAVE_LATENCYTOP_SUPPORT=y
++CONFIG_HAVE_MEMBLOCK=y
++CONFIG_HAVE_OPROFILE=y
++CONFIG_HAVE_PERF_EVENTS=y
++CONFIG_HAVE_PROC_CPU=y
++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
++CONFIG_HAVE_SCHED_CLOCK=y
++CONFIG_HAVE_SPARSE_IRQ=y
++CONFIG_HWMON=y
++CONFIG_HW_RANDOM=y
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++CONFIG_I2C_CHARDEV=y
++# CONFIG_I2C_IOP3XX is not set
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_INTEL_IOP_ADMA=y
++# CONFIG_IOP_WATCHDOG is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++CONFIG_IP_PIMSM_V1=y
++CONFIG_IP_PIMSM_V2=y
++# CONFIG_IWMMXT is not set
++CONFIG_KTIME_SCALAR=y
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++# CONFIG_MACH_EM7210 is not set
++# CONFIG_MACH_GLANTANK is not set
++CONFIG_MACH_N2100=y
++# CONFIG_MTD_CFI_AMDSTD is not set
++CONFIG_MTD_REDBOOT_PARTS=y
++CONFIG_NEED_DMA_MAP_STATE=y
++CONFIG_NEED_PER_CPU_KM=y
++CONFIG_NET_DMA=y
++CONFIG_PAGEFLAGS_EXTENDED=y
++CONFIG_PAGE_OFFSET=0xC0000000
++CONFIG_PCI=y
++CONFIG_PERF_USE_VMALLOC=y
++CONFIG_PLAT_IOP=y
++# CONFIG_PREEMPT_RCU is not set
++CONFIG_R8169=y
++CONFIG_RTC_CLASS=y
++CONFIG_RTC_DRV_PCF8563=y
++CONFIG_RTC_DRV_X1205=y
++# CONFIG_SCSI_MULTI_LUN is not set
++CONFIG_SPLIT_PTLOCK_CPUS=999999
++CONFIG_SYS_SUPPORTS_APM_EMULATION=y
++CONFIG_UID16=y
++CONFIG_USB_ARCH_HAS_XHCI=y
++# CONFIG_USB_EHCI_HCD_PLATFORM is not set
++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
++# CONFIG_USB_OHCI_HCD_PLATFORM is not set
++CONFIG_USB_SUPPORT=y
++CONFIG_VECTORS_BASE=0xffff0000
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_WAN=y
++CONFIG_XSCALE_PMU=y
++CONFIG_XZ_DEC_ARM=y
++CONFIG_XZ_DEC_BCJ=y
++CONFIG_ZBOOT_ROM_BSS=0x0
++CONFIG_ZBOOT_ROM_TEXT=0x0
++CONFIG_ZONE_DMA_FLAG=0
+diff --git a/feeds/targets/iop32x/image/Makefile b/feeds/targets/iop32x/image/Makefile
+new file mode 100644
+index 0000000..0df51ba
+--- /dev/null
++++ b/feeds/targets/iop32x/image/Makefile
+@@ -0,0 +1,37 @@
++#
++# Copyright (C) 2007-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/image.mk
++
++define Image/BuildKernel
++ cp $(KDIR)/zImage $(BIN_DIR)/$(IMG_PREFIX)-zImage
++#
++# XXX - FIXME
++#
++# BIN_DIR=$(BIN_DIR) IMG_PREFIX="$(IMG_PREFIX)" $(TOPDIR)/scripts/arm-magic.sh
++endef
++
++define Image/Build
++ $(call Image/Build/$(1),$(1))
++endef
++
++define Image/Build/jffs2-64k
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1).img bs=65536 conv=sync
++endef
++
++define Image/Build/jffs2-128k
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1).img bs=131072 conv=sync
++ $(call Image/Build/slug,$(1))
++endef
++
++define Image/Build/squashfs
++ $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
++ dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1).img bs=131072 conv=sync
++ $(call Image/Build/slug,$(1))
++endef
++
++$(eval $(call BuildImage))
+diff --git a/feeds/targets/iop32x/patches-3.3/001-ARM-Fix-missing-linux-types.h-inclusion-in-asm-hardw.patch b/feeds/targets/iop32x/patches-3.3/001-ARM-Fix-missing-linux-types.h-inclusion-in-asm-hardw.patch
+new file mode 100644
+index 0000000..a03eff7
+--- /dev/null
++++ b/feeds/targets/iop32x/patches-3.3/001-ARM-Fix-missing-linux-types.h-inclusion-in-asm-hardw.patch
+@@ -0,0 +1,33 @@
++From 15e9b9b9ed268fa91e52c44d621f3d0296162d15 Mon Sep 17 00:00:00 2001
++From: David Howells <dhowells@redhat.com>
++Date: Fri, 23 Mar 2012 15:37:34 +0000
++Subject: [PATCH] ARM: Fix missing linux/types.h #inclusion in asm/hardware/iop3xx.h
++
++arch/arm/include/asm/hardware/iop3xx.h needs to include linux/types.h to avoid
++the following errors:
++
++In file included from arch/arm/plat-iop/restart.c:10:0:
++/data/fs/linux-2.6-fscache/arch/arm/include/asm/hardware/iop3xx.h:239:1: error: unknown type name 'u32'
++/data/fs/linux-2.6-fscache/arch/arm/include/asm/hardware/iop3xx.h: In function 'read_tmr0':
++/data/fs/linux-2.6-fscache/arch/arm/include/asm/hardware/iop3xx.h:241:2: error: unknown type name 'u32'
++/data/fs/linux-2.6-fscache/arch/arm/include/asm/hardware/iop3xx.h: At top level:
++/data/fs/linux-2.6-fscache/arch/arm/include/asm/hardware/iop3xx.h:246:31: error: unknown type name 'u32'
++...
++
++Signed-off-by: David Howells <dhowells@redhat.com>
++---
++ arch/arm/include/asm/hardware/iop3xx.h | 3 +++
++ 1 files changed, 3 insertions(+), 0 deletions(-)
++
++--- a/arch/arm/include/asm/hardware/iop3xx.h
+++++ b/arch/arm/include/asm/hardware/iop3xx.h
++@@ -231,6 +231,9 @@ extern int iop3xx_get_init_atu(void);
++
++
++ #ifndef __ASSEMBLY__
+++
+++#include <linux/types.h>
+++
++ void iop3xx_map_io(void);
++ void iop_init_cp6_handler(void);
++ void iop_init_time(unsigned long tickrate);
+diff --git a/feeds/targets/iop32x/patches-3.3/002-Disintegrate-asm-system.h-for-ARM.patch b/feeds/targets/iop32x/patches-3.3/002-Disintegrate-asm-system.h-for-ARM.patch
+new file mode 100644
+index 0000000..b91e9a2
+--- /dev/null
++++ b/feeds/targets/iop32x/patches-3.3/002-Disintegrate-asm-system.h-for-ARM.patch
+@@ -0,0 +1,24 @@
++From 9f97da78bf018206fb623cd351d454af2f105fe0 Mon Sep 17 00:00:00 2001
++From: David Howells <dhowells@redhat.com>
++Date: Wed, 28 Mar 2012 18:30:01 +0100
++Subject: [PATCH] Disintegrate asm/system.h for ARM
++
++Disintegrate asm/system.h for ARM.
++
++Signed-off-by: David Howells <dhowells@redhat.com>
++cc: Russell King <linux@arm.linux.org.uk>
++cc: linux-arm-kernel@lists.infradead.org
++---
++ arch/arm/plat-iop/restart.c | 1 +
++ 1 files changed, 1 insertions(+), 0 deletions(-)
++
++--- a/arch/arm/plat-iop/restart.c
+++++ b/arch/arm/plat-iop/restart.c
++@@ -8,6 +8,7 @@
++ * published by the Free Software Foundation.
++ */
++ #include <asm/hardware/iop3xx.h>
+++#include <asm/system.h>
++ #include <mach/hardware.h>
++
++ void iop3xx_restart(char mode, const char *cmd)
+diff --git a/feeds/targets/iop32x/patches-3.3/003-plat-iop-fix-section-mismatch.patch b/feeds/targets/iop32x/patches-3.3/003-plat-iop-fix-section-mismatch.patch
+new file mode 100644
+index 0000000..ab8025d
+--- /dev/null
++++ b/feeds/targets/iop32x/patches-3.3/003-plat-iop-fix-section-mismatch.patch
+@@ -0,0 +1,11 @@
++--- a/arch/arm/plat-iop/pci.c
+++++ b/arch/arm/plat-iop/pci.c
++@@ -221,7 +221,7 @@ int iop3xx_pci_setup(int nr, struct pci_
++ return 1;
++ }
++
++-struct pci_bus *iop3xx_pci_scan_bus(int nr, struct pci_sys_data *sys)
+++struct pci_bus * __devinit iop3xx_pci_scan_bus(int nr, struct pci_sys_data *sys)
++ {
++ return pci_scan_root_bus(NULL, sys->busnr, &iop3xx_ops, sys,
++ &sys->resources);
+diff --git a/feeds/targets/mpc52xx/Makefile b/feeds/targets/mpc52xx/Makefile
+new file mode 100644
+index 0000000..29309ae
+--- /dev/null
++++ b/feeds/targets/mpc52xx/Makefile
+@@ -0,0 +1,25 @@
++#
++# Copyright (C) 2009-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++ARCH:=powerpc
++BOARD:=mpc52xx
++BOARDNAME:=Freescale MPC52xx
++CPU_TYPE:=603e
++FEATURES:=targz ext4
++
++KERNEL_PATCHVER:=3.18
++
++include $(INCLUDE_DIR)/target.mk
++
++define Target/Description
++ Build images for the Freescale MPC52xx based boards.
++endef
++
++KERNELNAME:=zImage
++
++$(eval $(call BuildTarget))
+diff --git a/feeds/targets/mpc52xx/base-files/etc/inittab b/feeds/targets/mpc52xx/base-files/etc/inittab
+new file mode 100644
+index 0000000..77dd6ca
+--- /dev/null
++++ b/feeds/targets/mpc52xx/base-files/etc/inittab
+@@ -0,0 +1,3 @@
++::sysinit:/etc/init.d/rcS S boot
++::shutdown:/etc/init.d/rcS K shutdown
++ttyPSC0::askfirst:/bin/ash --login
+diff --git a/feeds/targets/mpc52xx/config-3.18 b/feeds/targets/mpc52xx/config-3.18
+new file mode 100644
+index 0000000..b296443
+--- /dev/null
++++ b/feeds/targets/mpc52xx/config-3.18
+@@ -0,0 +1,302 @@
++# CONFIG_40x is not set
++# CONFIG_44x is not set
++CONFIG_6xx=y
++# CONFIG_ADVANCED_OPTIONS is not set
++# CONFIG_ALTIVEC is not set
++# CONFIG_AMIGAONE is not set
++CONFIG_AMIGA_PARTITION=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
++CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
++CONFIG_ARCH_HAS_ILOG2_U32=y
++CONFIG_ARCH_HAS_SG_CHAIN=y
++CONFIG_ARCH_HAS_WALK_MEMORY=y
++CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
++CONFIG_ARCH_HIBERNATION_POSSIBLE=y
++CONFIG_ARCH_MAY_HAVE_PC_FDC=y
++CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
++CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
++# CONFIG_ARCH_RANDOM is not set
++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
++CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
++CONFIG_ARCH_SUPPORTS_UPROBES=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++CONFIG_ARCH_USE_BUILTIN_BSWAP=y
++CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
++CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
++CONFIG_ATA=y
++CONFIG_AUDIT_ARCH=y
++CONFIG_BLK_DEV_SD=y
++# CONFIG_BOOTX_TEXT is not set
++CONFIG_BOUNCE=y
++CONFIG_CLKDEV_LOOKUP=y
++CONFIG_CLONE_BACKWARDS=y
++CONFIG_CMDLINE="console=ttyPSC0,115200"
++CONFIG_CMDLINE_BOOL=y
++CONFIG_COMMON_CLK=y
++CONFIG_COMPAT_BRK=y
++CONFIG_CPU_BIG_ENDIAN=y
++# CONFIG_CPU_LITTLE_ENDIAN is not set
++CONFIG_CRC16=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_BLKCIPHER2=y
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_CRC32C=y
++CONFIG_CRYPTO_DES=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_HASH2=y
++CONFIG_CRYPTO_HW=y
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_MANAGER2=y
++CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_RNG2=y
++# CONFIG_CRYPTO_SHA1_PPC is not set
++CONFIG_CRYPTO_WORKQUEUE=y
++CONFIG_DEFAULT_CFQ=y
++# CONFIG_DEFAULT_DEADLINE is not set
++CONFIG_DEFAULT_IOSCHED="cfq"
++# CONFIG_DEFAULT_UIMAGE is not set
++CONFIG_DEVKMEM=y
++CONFIG_DMADEVICES=y
++CONFIG_DMA_ENGINE=y
++CONFIG_DMA_OF=y
++CONFIG_DNOTIFY=y
++CONFIG_DTC=y
++# CONFIG_DW_DMAC_CORE is not set
++# CONFIG_DW_DMAC_PCI is not set
++# CONFIG_E200 is not set
++CONFIG_EARLY_PRINTK=y
++# CONFIG_EMBEDDED6xx is not set
++CONFIG_ENABLE_MUST_CHECK=y
++# CONFIG_EPAPR_BOOT is not set
++# CONFIG_EPOLL is not set
++CONFIG_EXT4_FS=y
++CONFIG_FEC_MPC52xx=y
++CONFIG_FEC_MPC52xx_MDIO=y
++CONFIG_FREEZER=y
++# CONFIG_FSL_ULI1575 is not set
++CONFIG_FS_MBCACHE=y
++CONFIG_FW_LOADER_USER_HELPER=y
++CONFIG_GENERIC_ATOMIC64=y
++CONFIG_GENERIC_BUG=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++# CONFIG_GENERIC_CSUM is not set
++CONFIG_GENERIC_IO=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
++CONFIG_GENERIC_ISA_DMA=y
++CONFIG_GENERIC_NVRAM=y
++CONFIG_GENERIC_PCI_IOMAP=y
++CONFIG_GENERIC_SMP_IDLE_THREAD=y
++CONFIG_GENERIC_STRNCPY_FROM_USER=y
++CONFIG_GENERIC_STRNLEN_USER=y
++# CONFIG_GENERIC_TBSYNC is not set
++CONFIG_GENERIC_TIME_VSYSCALL_OLD=y
++CONFIG_GEN_RTC=y
++# CONFIG_GEN_RTC_X is not set
++# CONFIG_GE_FPGA is not set
++CONFIG_GLOB=y
++CONFIG_GPIOLIB=y
++CONFIG_GPIO_DEVRES=y
++CONFIG_GPIO_MPC5200=y
++CONFIG_HAS_DMA=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT_MAP=y
++# CONFIG_HAS_RAPIDIO is not set
++# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
++CONFIG_HAVE_ARCH_AUDITSYSCALL=y
++CONFIG_HAVE_ARCH_JUMP_LABEL=y
++CONFIG_HAVE_ARCH_KGDB=y
++CONFIG_HAVE_ARCH_TRACEHOOK=y
++# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
++CONFIG_HAVE_CLK=y
++CONFIG_HAVE_CLK_PREPARE=y
++CONFIG_HAVE_DEBUG_KMEMLEAK=y
++CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
++CONFIG_HAVE_DMA_API_DEBUG=y
++CONFIG_HAVE_DMA_ATTRS=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_FUNCTION_TRACER=y
++# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
++CONFIG_HAVE_IDE=y
++CONFIG_HAVE_IOREMAP_PROT=y
++CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
++CONFIG_HAVE_LATENCYTOP_SUPPORT=y
++CONFIG_HAVE_MEMBLOCK=y
++CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
++CONFIG_HAVE_NET_DSA=y
++CONFIG_HAVE_OPROFILE=y
++CONFIG_HAVE_PERF_EVENTS=y
++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
++# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
++# CONFIG_HVC_RTAS is not set
++CONFIG_HZ=250
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++CONFIG_HZ_PERIODIC=y
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_IOMMU_HELPER is not set
++CONFIG_IOSCHED_CFQ=y
++# CONFIG_IPIC is not set
++# CONFIG_IP_ADVANCED_ROUTER is not set
++# CONFIG_IP_MROUTE is not set
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_BOOTP=y
++CONFIG_IP_PNP_DHCP=y
++# CONFIG_IP_PNP_RARP is not set
++CONFIG_IRQCHIP=y
++CONFIG_IRQ_DOMAIN=y
++CONFIG_IRQ_FORCED_THREADING=y
++CONFIG_IRQ_WORK=y
++CONFIG_ISA_DMA_API=y
++CONFIG_JBD2=y
++CONFIG_KERNEL_START=0xc0000000
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++CONFIG_LIBFDT=y
++CONFIG_LOWMEM_SIZE=0x30000000
++CONFIG_LXT_PHY=y
++CONFIG_MDIO_BOARDINFO=y
++CONFIG_MIGRATION=y
++# CONFIG_MMIO_NVRAM is not set
++CONFIG_MODULES_USE_ELF_RELA=y
++CONFIG_MPC5200_WDT=y
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_U3_HT_IRQS is not set
++# CONFIG_MPIC_WEIRD is not set
++# CONFIG_MTD is not set
++# CONFIG_NEED_DMA_MAP_STATE is not set
++# CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK is not set
++CONFIG_NEED_PER_CPU_KM=y
++CONFIG_NEED_SG_DMA_LENGTH=y
++# CONFIG_NEW_LEDS is not set
++# CONFIG_NONSTATIC_KERNEL is not set
++CONFIG_NR_IRQS=512
++CONFIG_OF=y
++CONFIG_OF_ADDRESS=y
++CONFIG_OF_ADDRESS_PCI=y
++CONFIG_OF_EARLY_FLATTREE=y
++CONFIG_OF_FLATTREE=y
++CONFIG_OF_GPIO=y
++CONFIG_OF_IRQ=y
++CONFIG_OF_MDIO=y
++CONFIG_OF_NET=y
++CONFIG_OF_PCI=y
++CONFIG_OF_PCI_IRQ=y
++CONFIG_OF_RESERVED_MEM=y
++CONFIG_OLD_SIGACTION=y
++CONFIG_OLD_SIGSUSPEND=y
++CONFIG_PAGEFLAGS_EXTENDED=y
++CONFIG_PAGE_OFFSET=0xc0000000
++CONFIG_PATA_MPC52xx=y
++CONFIG_PCI=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PHYLIB=y
++CONFIG_PHYSICAL_START=0x00000000
++CONFIG_PM=y
++CONFIG_PM_CLK=y
++# CONFIG_PM_DEBUG is not set
++CONFIG_PM_SLEEP=y
++CONFIG_PPC=y
++CONFIG_PPC32=y
++# CONFIG_PPC64 is not set
++# CONFIG_PPC_82xx is not set
++# CONFIG_PPC_83xx is not set
++# CONFIG_PPC_85xx is not set
++# CONFIG_PPC_86xx is not set
++# CONFIG_PPC_8xx is not set
++# CONFIG_PPC_970_NAP is not set
++CONFIG_PPC_BESTCOMM=y
++CONFIG_PPC_BESTCOMM_ATA=y
++CONFIG_PPC_BESTCOMM_FEC=y
++CONFIG_PPC_BOOK3S=y
++CONFIG_PPC_BOOK3S_32=y
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_PPC_CHRP is not set
++# CONFIG_PPC_COPRO_BASE is not set
++# CONFIG_PPC_DCR_MMIO is not set
++# CONFIG_PPC_DCR_NATIVE is not set
++# CONFIG_PPC_DOORBELL is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
++CONFIG_PPC_EFIKA=y
++# CONFIG_PPC_EPAPR_HV_PIC is not set
++CONFIG_PPC_FPU=y
++CONFIG_PPC_HAVE_PMU_SUPPORT=y
++# CONFIG_PPC_I8259 is not set
++# CONFIG_PPC_ICP_HV is not set
++# CONFIG_PPC_ICP_NATIVE is not set
++# CONFIG_PPC_ICS_RTAS is not set
++# CONFIG_PPC_INDIRECT_PCI is not set
++CONFIG_PPC_LIB_RHEAP=y
++# CONFIG_PPC_LITE5200 is not set
++# CONFIG_PPC_MEDIA5200 is not set
++# CONFIG_PPC_MM_SLICES is not set
++# CONFIG_PPC_MPC106 is not set
++# CONFIG_PPC_MPC512x is not set
++# CONFIG_PPC_MPC5200_BUGFIX is not set
++# CONFIG_PPC_MPC5200_LPBFIFO is not set
++# CONFIG_PPC_MPC5200_SIMPLE is not set
++CONFIG_PPC_MPC52xx=y
++CONFIG_PPC_NATIVE=y
++CONFIG_PPC_OF=y
++CONFIG_PPC_OF_BOOT_TRAMPOLINE=y
++# CONFIG_PPC_P7_NAP is not set
++CONFIG_PPC_PCI_CHOICE=y
++# CONFIG_PPC_PMAC is not set
++CONFIG_PPC_RTAS=y
++# CONFIG_PPC_RTAS_DAEMON is not set
++CONFIG_PPC_STD_MMU=y
++CONFIG_PPC_STD_MMU_32=y
++# CONFIG_PPC_UDBG_16550 is not set
++CONFIG_PPC_WERROR=y
++# CONFIG_PPC_XICS is not set
++# CONFIG_PQ2ADS is not set
++# CONFIG_PREEMPT_RCU is not set
++CONFIG_PROC_PAGE_MONITOR=y
++# CONFIG_RCU_STALL_COMMON is not set
++# CONFIG_RTAS_ERROR_LOGGING is not set
++CONFIG_RTAS_PROC=y
++CONFIG_RWSEM_XCHGADD_ALGORITHM=y
++CONFIG_SCHED_HRTICK=y
++CONFIG_SCSI=y
++CONFIG_SECCOMP=y
++# CONFIG_SERIAL_8250 is not set
++CONFIG_SERIAL_MPC52xx=y
++CONFIG_SERIAL_MPC52xx_CONSOLE=y
++CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
++# CONFIG_SLAB is not set
++CONFIG_SLUB=y
++CONFIG_SOCK_DIAG=y
++CONFIG_SPARSE_IRQ=y
++# CONFIG_SQUASHFS is not set
++# CONFIG_STRIP_ASM_SYMS is not set
++CONFIG_SUSPEND=y
++CONFIG_SUSPEND_FREEZER=y
++# CONFIG_SWIOTLB is not set
++CONFIG_SYSCTL_EXCEPTION_TRACE=y
++CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
++CONFIG_TASK_SIZE=0xc0000000
++# CONFIG_TAU is not set
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TICK_CPU_ACCOUNTING=y
++# CONFIG_UDBG_RTAS_CONSOLE is not set
++# CONFIG_USB_OHCI_LITTLE_ENDIAN is not set
++CONFIG_USB_SUPPORT=y
++# CONFIG_VLAN_8021Q is not set
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_WATCHDOG_NOWAYOUT=y
++# CONFIG_WATCHDOG_RTAS is not set
++CONFIG_WORD_SIZE=32
++CONFIG_XZ_DEC_BCJ=y
++CONFIG_XZ_DEC_POWERPC=y
+diff --git a/feeds/targets/mpc52xx/image/Makefile b/feeds/targets/mpc52xx/image/Makefile
+new file mode 100644
+index 0000000..fc7e9cd
+--- /dev/null
++++ b/feeds/targets/mpc52xx/image/Makefile
+@@ -0,0 +1,22 @@
++#
++# Copyright (C) 2009-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/image.mk
++
++define Image/BuildKernel
++ cp $(KDIR)/zImage $(BIN_DIR)/$(IMG_PREFIX)-zImage
++endef
++
++define Image/Build/ext2
++ cp $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-ext2.img
++endef
++
++define Image/Build
++ $(call Image/Build/$(1),$(1))
++endef
++
++$(eval $(call BuildImage))
+diff --git a/feeds/targets/mpc83xx/Makefile b/feeds/targets/mpc83xx/Makefile
+new file mode 100644
+index 0000000..d9069d1
+--- /dev/null
++++ b/feeds/targets/mpc83xx/Makefile
+@@ -0,0 +1,28 @@
++#
++# Copyright (C) 2007-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++ARCH:=powerpc
++BOARD:=mpc83xx
++BOARDNAME:=Freescale MPC83xx
++CPU_TYPE:=603e
++FEATURES:=squashfs targz
++MAINTAINER:=Imre Kaloz <kaloz@openwrt.org>
++
++KERNEL_PATCHVER:=3.18
++
++include $(INCLUDE_DIR)/target.mk
++
++DEFAULT_PACKAGES += kmod-via-velocity
++
++define Target/Description
++ Build firmware images for Freescale MPC83xx based boards (eg. RouterBoard 600).
++endef
++
++KERNELNAME:=uImage dtbImage.rb600 dtbImage.rb333
++
++$(eval $(call BuildTarget))
+diff --git a/feeds/targets/mpc83xx/base-files.mk b/feeds/targets/mpc83xx/base-files.mk
+new file mode 100644
+index 0000000..d6682bd
+--- /dev/null
++++ b/feeds/targets/mpc83xx/base-files.mk
+@@ -0,0 +1,5 @@
++define Package/base-files/install-target
++ rm -f $(1)/etc/config/network
++endef
++
++
+diff --git a/feeds/targets/mpc83xx/base-files/etc/inittab b/feeds/targets/mpc83xx/base-files/etc/inittab
+new file mode 100644
+index 0000000..67c36a6
+--- /dev/null
++++ b/feeds/targets/mpc83xx/base-files/etc/inittab
+@@ -0,0 +1,4 @@
++::sysinit:/etc/init.d/rcS S boot
++::shutdown:/etc/init.d/rcS K shutdown
++ttyS0::askfirst:/bin/ash --login
++ttyS1::askfirst:/bin/ash --login
+diff --git a/feeds/targets/mpc83xx/base-files/etc/uci-defaults/02_network b/feeds/targets/mpc83xx/base-files/etc/uci-defaults/02_network
+new file mode 100644
+index 0000000..a3467aa
+--- /dev/null
++++ b/feeds/targets/mpc83xx/base-files/etc/uci-defaults/02_network
+@@ -0,0 +1,29 @@
++#!/bin/sh
++#
++# Copyright (C) 2012 OpenWrt.org
++#
++
++[ -e /etc/config/network ] && exit 0
++
++touch /etc/config/network
++
++. /lib/functions/uci-defaults.sh
++. /lib/mpc83xx.sh
++
++ucidef_set_interface_loopback
++
++board=$(mpc83xx_board_name)
++
++case "$board" in
++rb333)
++ ucidef_set_interfaces_lan_wan "eth0 eth1" "eth2"
++ ;;
++
++*)
++ ucidef_set_interfaces_lan_wan "eth0" "eth1"
++ ;;
++esac
++
++uci commit network
++
++exit 0
+diff --git a/feeds/targets/mpc83xx/base-files/lib/mpc83xx.sh b/feeds/targets/mpc83xx/base-files/lib/mpc83xx.sh
+new file mode 100755
+index 0000000..ea8e346
+--- /dev/null
++++ b/feeds/targets/mpc83xx/base-files/lib/mpc83xx.sh
+@@ -0,0 +1,44 @@
++#!/bin/sh
++#
++# Copyright (C) 2012 OpenWrt.org
++#
++
++MPC83XX_BOARD_NAME=
++MPC83XX_MODEL=
++
++mpc83xx_board_detect() {
++ local model
++ local name
++
++ model=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /model/ {print $2}' /proc/cpuinfo)
++
++ case "$model" in
++ "RB333")
++ name="rb333"
++ model="MikroTik RouterBOARD 333"
++ ;;
++ "RB600")
++ name="rb600"
++ model="MikroTik RouterBOARD 600"
++ ;;
++ esac
++
++ [ -z "$name" ] && name="unknown"
++
++ [ -z "$MPC83XX_BOARD_NAME" ] && MPC83XX_BOARD_NAME="$name"
++ [ -z "$MPC83XX_MODEL" ] && MPC83XX_MODEL="$model"
++
++ [ -e "/tmp/sysinfo/" ] || mkdir -p "/tmp/sysinfo/"
++
++ echo "$MPC83XX_BOARD_NAME" > /tmp/sysinfo/board_name
++ echo "$MPC83XX_MODEL" > /tmp/sysinfo/model
++}
++
++mpc83xx_board_name() {
++ local name
++
++ [ -f /tmp/sysinfo/board_name ] && name=$(cat /tmp/sysinfo/board_name)
++ [ -z "$name" ] && name="unknown"
++
++ echo "$name"
++}
+diff --git a/feeds/targets/mpc83xx/base-files/lib/preinit/03_preinit_do_mpc83xx.sh b/feeds/targets/mpc83xx/base-files/lib/preinit/03_preinit_do_mpc83xx.sh
+new file mode 100644
+index 0000000..c67b1d4
+--- /dev/null
++++ b/feeds/targets/mpc83xx/base-files/lib/preinit/03_preinit_do_mpc83xx.sh
+@@ -0,0 +1,9 @@
++#!/bin/sh
++
++do_mpc83xx() {
++ . /lib/mpc83xx.sh
++
++ mpc83xx_board_detect
++}
++
++boot_hook_add preinit_main do_mpc83xx
+diff --git a/feeds/targets/mpc83xx/config-3.18 b/feeds/targets/mpc83xx/config-3.18
+new file mode 100644
+index 0000000..4842dc8
+--- /dev/null
++++ b/feeds/targets/mpc83xx/config-3.18
+@@ -0,0 +1,357 @@
++# CONFIG_40x is not set
++# CONFIG_44x is not set
++CONFIG_6xx=y
++CONFIG_8xxx_WDT=y
++# CONFIG_ADVANCED_OPTIONS is not set
++# CONFIG_ALTIVEC is not set
++# CONFIG_AMIGAONE is not set
++CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
++CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
++CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
++CONFIG_ARCH_HAS_ILOG2_U32=y
++CONFIG_ARCH_HAS_SG_CHAIN=y
++CONFIG_ARCH_HAS_WALK_MEMORY=y
++CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
++CONFIG_ARCH_HIBERNATION_POSSIBLE=y
++CONFIG_ARCH_MAY_HAVE_PC_FDC=y
++CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
++CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y
++# CONFIG_ARCH_RANDOM is not set
++CONFIG_ARCH_REQUIRE_GPIOLIB=y
++CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
++CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
++CONFIG_ARCH_SUPPORTS_UPROBES=y
++CONFIG_ARCH_SUSPEND_POSSIBLE=y
++CONFIG_ARCH_USE_BUILTIN_BSWAP=y
++CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
++CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
++# CONFIG_ASP834x is not set
++CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH=y
++CONFIG_ATA=y
++CONFIG_AUDIT_ARCH=y
++CONFIG_BLK_DEV_SD=y
++# CONFIG_BOOTX_TEXT is not set
++CONFIG_BOUNCE=y
++CONFIG_CC_OPTIMIZE_FOR_SIZE=y
++CONFIG_CLONE_BACKWARDS=y
++CONFIG_CMDLINE="console=ttyS0,115200 rootfstype=squashfs,yaffs2,jffs2"
++CONFIG_CMDLINE_BOOL=y
++CONFIG_COMPAT_BRK=y
++CONFIG_CPU_BIG_ENDIAN=y
++# CONFIG_CPU_LITTLE_ENDIAN is not set
++CONFIG_CRC_CCITT=y
++CONFIG_CRYPTO_AEAD=y
++CONFIG_CRYPTO_AEAD2=y
++CONFIG_CRYPTO_AUTHENC=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_BLKCIPHER2=y
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_CRC32C=y
++CONFIG_CRYPTO_DEV_TALITOS=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_HASH2=y
++CONFIG_CRYPTO_HW=y
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_MANAGER2=y
++CONFIG_CRYPTO_RNG2=y
++# CONFIG_CRYPTO_SHA1_PPC is not set
++CONFIG_CRYPTO_WORKQUEUE=y
++CONFIG_DEFAULT_CFQ=y
++# CONFIG_DEFAULT_DEADLINE is not set
++CONFIG_DEFAULT_IOSCHED="cfq"
++CONFIG_DEFAULT_UIMAGE=y
++CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
++CONFIG_DMADEVICES=y
++CONFIG_DMA_ENGINE=y
++CONFIG_DMA_OF=y
++CONFIG_DTC=y
++# CONFIG_DW_DMAC_CORE is not set
++# CONFIG_DW_DMAC_PCI is not set
++# CONFIG_E200 is not set
++CONFIG_EARLY_PRINTK=y
++# CONFIG_EMBEDDED6xx is not set
++# CONFIG_ENABLE_WARN_DEPRECATED is not set
++# CONFIG_EPAPR_BOOT is not set
++CONFIG_FIRMWARE_IN_KERNEL=y
++CONFIG_FIXED_PHY=y
++CONFIG_FSL_DMA=y
++CONFIG_FSL_EMB_PERFMON=y
++CONFIG_FSL_GTM=y
++CONFIG_FSL_LBC=y
++CONFIG_FSL_PCI=y
++CONFIG_FSL_PQ_MDIO=y
++CONFIG_FSL_SOC=y
++# CONFIG_FSL_ULI1575 is not set
++CONFIG_FS_POSIX_ACL=y
++CONFIG_FW_LOADER_USER_HELPER=y
++CONFIG_GENERIC_ATOMIC64=y
++CONFIG_GENERIC_BUG=y
++CONFIG_GENERIC_CLOCKEVENTS=y
++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
++CONFIG_GENERIC_CMOS_UPDATE=y
++# CONFIG_GENERIC_CSUM is not set
++CONFIG_GENERIC_IO=y
++CONFIG_GENERIC_IRQ_SHOW=y
++CONFIG_GENERIC_IRQ_SHOW_LEVEL=y
++CONFIG_GENERIC_ISA_DMA=y
++CONFIG_GENERIC_NVRAM=y
++CONFIG_GENERIC_PCI_IOMAP=y
++CONFIG_GENERIC_SMP_IDLE_THREAD=y
++CONFIG_GENERIC_STRNCPY_FROM_USER=y
++CONFIG_GENERIC_STRNLEN_USER=y
++# CONFIG_GENERIC_TBSYNC is not set
++CONFIG_GENERIC_TIME_VSYSCALL_OLD=y
++CONFIG_GEN_RTC=y
++# CONFIG_GEN_RTC_X is not set
++# CONFIG_GE_FPGA is not set
++CONFIG_GIANFAR=y
++CONFIG_GLOB=y
++CONFIG_GPIOLIB=y
++CONFIG_GPIO_DEVRES=y
++CONFIG_GPIO_MPC8XXX=y
++CONFIG_GPIO_SYSFS=y
++CONFIG_HAS_DMA=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT_MAP=y
++# CONFIG_HAS_RAPIDIO is not set
++# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
++CONFIG_HAVE_ARCH_AUDITSYSCALL=y
++CONFIG_HAVE_ARCH_JUMP_LABEL=y
++CONFIG_HAVE_ARCH_KGDB=y
++CONFIG_HAVE_ARCH_TRACEHOOK=y
++# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
++CONFIG_HAVE_DEBUG_KMEMLEAK=y
++CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
++CONFIG_HAVE_DMA_API_DEBUG=y
++CONFIG_HAVE_DMA_ATTRS=y
++CONFIG_HAVE_DYNAMIC_FTRACE=y
++CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
++CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
++CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
++CONFIG_HAVE_FUNCTION_TRACER=y
++# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
++CONFIG_HAVE_IDE=y
++CONFIG_HAVE_IOREMAP_PROT=y
++CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
++CONFIG_HAVE_LATENCYTOP_SUPPORT=y
++CONFIG_HAVE_MEMBLOCK=y
++CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
++CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
++CONFIG_HAVE_NET_DSA=y
++CONFIG_HAVE_OPROFILE=y
++CONFIG_HAVE_PERF_EVENTS=y
++CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
++# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
++CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
++CONFIG_HW_RANDOM=y
++CONFIG_HZ=250
++# CONFIG_HZ_100 is not set
++CONFIG_HZ_250=y
++CONFIG_HZ_PERIODIC=y
++CONFIG_INET_LRO=y
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_INPUT=y
++# CONFIG_INPUT_MISC is not set
++# CONFIG_IOMMU_HELPER is not set
++CONFIG_IOSCHED_CFQ=y
++CONFIG_IPIC=y
++CONFIG_IP_PIMSM_V1=y
++CONFIG_IP_PIMSM_V2=y
++CONFIG_IRQCHIP=y
++CONFIG_IRQ_DOMAIN=y
++CONFIG_IRQ_FORCED_THREADING=y
++CONFIG_IRQ_WORK=y
++CONFIG_ISA_DMA_API=y
++# CONFIG_ISDN is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++# CONFIG_JFFS2_LZMA is not set
++# CONFIG_JFFS2_SUMMARY is not set
++CONFIG_JFFS2_ZLIB=y
++CONFIG_KERNEL_START=0xc0000000
++# CONFIG_KMETER1 is not set
++# CONFIG_LBDAF is not set
++# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
++# CONFIG_LEDS_TRIGGER_NETDEV is not set
++# CONFIG_LEDS_TRIGGER_TIMER is not set
++CONFIG_LIBCRC32C=y
++CONFIG_LIBFDT=y
++CONFIG_LOG_BUF_SHIFT=15
++CONFIG_LOWMEM_SIZE=0x30000000
++# CONFIG_MATH_EMULATION is not set
++CONFIG_MDIO_BITBANG=y
++CONFIG_MDIO_BOARDINFO=y
++CONFIG_MDIO_GPIO=y
++# CONFIG_MMIO_NVRAM is not set
++CONFIG_MODULES_USE_ELF_RELA=y
++# CONFIG_MPC512X_DMA is not set
++CONFIG_MPC830x_RDB=y
++CONFIG_MPC831x_RDB=y
++CONFIG_MPC832x_MDS=y
++CONFIG_MPC832x_RDB=y
++CONFIG_MPC834x_ITX=y
++CONFIG_MPC834x_MDS=y
++CONFIG_MPC836x_MDS=y
++CONFIG_MPC836x_RDK=y
++CONFIG_MPC837x_MDS=y
++CONFIG_MPC837x_RDB=y
++# CONFIG_MPIC is not set
++# CONFIG_MPIC_U3_HT_IRQS is not set
++# CONFIG_MPIC_WEIRD is not set
++CONFIG_MTD_BLOCK2MTD=y
++# CONFIG_MTD_CFI_INTELEXT is not set
++CONFIG_MTD_NAND=y
++CONFIG_MTD_NAND_ECC=y
++CONFIG_MTD_NAND_FSL_ELBC=y
++CONFIG_MTD_NAND_FSL_UPM=y
++CONFIG_MTD_NAND_RB_PPC=y
++CONFIG_MTD_UBI=y
++CONFIG_MTD_UBI_BEB_LIMIT=20
++# CONFIG_MTD_UBI_BLOCK is not set
++# CONFIG_MTD_UBI_FASTMAP is not set
++# CONFIG_MTD_UBI_GLUEBI is not set
++CONFIG_MTD_UBI_WL_THRESHOLD=4096
++# CONFIG_NEED_DMA_MAP_STATE is not set
++# CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK is not set
++CONFIG_NEED_PER_CPU_KM=y
++CONFIG_NEED_SG_DMA_LENGTH=y
++CONFIG_NET_EMATCH=y
++# CONFIG_NONSTATIC_KERNEL is not set
++CONFIG_NR_IRQS=512
++CONFIG_OF=y
++CONFIG_OF_ADDRESS=y
++CONFIG_OF_ADDRESS_PCI=y
++CONFIG_OF_EARLY_FLATTREE=y
++CONFIG_OF_FLATTREE=y
++CONFIG_OF_GPIO=y
++CONFIG_OF_IRQ=y
++CONFIG_OF_MDIO=y
++CONFIG_OF_MTD=y
++CONFIG_OF_NET=y
++CONFIG_OF_PCI=y
++CONFIG_OF_PCI_IRQ=y
++CONFIG_OF_RESERVED_MEM=y
++CONFIG_OLD_SIGACTION=y
++CONFIG_OLD_SIGSUSPEND=y
++CONFIG_PAGEFLAGS_EXTENDED=y
++CONFIG_PAGE_OFFSET=0xc0000000
++# CONFIG_PARTITION_ADVANCED is not set
++CONFIG_PATA_RB_PPC=y
++CONFIG_PCI=y
++CONFIG_PCI_DISABLE_COMMON_QUIRKS=y
++CONFIG_PCI_DOMAINS=y
++CONFIG_PCI_MSI=y
++CONFIG_PHYLIB=y
++CONFIG_PHYSICAL_START=0x00000000
++CONFIG_PPC=y
++CONFIG_PPC32=y
++# CONFIG_PPC64 is not set
++# CONFIG_PPC_82xx is not set
++CONFIG_PPC_83xx=y
++# CONFIG_PPC_85xx is not set
++# CONFIG_PPC_86xx is not set
++# CONFIG_PPC_8xx is not set
++# CONFIG_PPC_970_NAP is not set
++CONFIG_PPC_BOOK3S=y
++CONFIG_PPC_BOOK3S_32=y
++# CONFIG_PPC_CELL is not set
++# CONFIG_PPC_CELL_NATIVE is not set
++# CONFIG_PPC_CHRP is not set
++# CONFIG_PPC_COPRO_BASE is not set
++# CONFIG_PPC_DCR_MMIO is not set
++# CONFIG_PPC_DCR_NATIVE is not set
++CONFIG_PPC_DISABLE_WERROR=y
++# CONFIG_PPC_DOORBELL is not set
++# CONFIG_PPC_EARLY_DEBUG is not set
++# CONFIG_PPC_EPAPR_HV_PIC is not set
++CONFIG_PPC_FPU=y
++CONFIG_PPC_HAVE_PMU_SUPPORT=y
++# CONFIG_PPC_I8259 is not set
++# CONFIG_PPC_ICP_HV is not set
++# CONFIG_PPC_ICP_NATIVE is not set
++# CONFIG_PPC_ICS_RTAS is not set
++CONFIG_PPC_INDIRECT_PCI=y
++CONFIG_PPC_LIB_RHEAP=y
++# CONFIG_PPC_MM_SLICES is not set
++# CONFIG_PPC_MPC106 is not set
++# CONFIG_PPC_MPC512x is not set
++# CONFIG_PPC_MPC52xx is not set
++CONFIG_PPC_MPC831x=y
++CONFIG_PPC_MPC832x=y
++CONFIG_PPC_MPC834x=y
++CONFIG_PPC_MPC837x=y
++CONFIG_PPC_MSI_BITMAP=y
++CONFIG_PPC_OF=y
++CONFIG_PPC_OF_BOOT_TRAMPOLINE=y
++# CONFIG_PPC_P7_NAP is not set
++CONFIG_PPC_PCI_CHOICE=y
++# CONFIG_PPC_PMAC is not set
++# CONFIG_PPC_RTAS is not set
++CONFIG_PPC_STD_MMU=y
++CONFIG_PPC_STD_MMU_32=y
++CONFIG_PPC_UDBG_16550=y
++# CONFIG_PPC_XICS is not set
++# CONFIG_PQ2ADS is not set
++# CONFIG_PREEMPT_RCU is not set
++CONFIG_PROC_PAGE_MONITOR=y
++# CONFIG_PTP_1588_CLOCK_GIANFAR is not set
++CONFIG_QE_GPIO=y
++CONFIG_QUICC_ENGINE=y
++CONFIG_RB_IOMAP=y
++CONFIG_RB_PPC=y
++# CONFIG_RCU_STALL_COMMON is not set
++CONFIG_RWSEM_XCHGADD_ALGORITHM=y
++# CONFIG_SBC834x is not set
++CONFIG_SCHED_HRTICK=y
++CONFIG_SCSI=y
++# CONFIG_SCSI_LOWLEVEL is not set
++# CONFIG_SCSI_PROC_FS is not set
++CONFIG_SERIAL_8250_FSL=y
++CONFIG_SERIAL_8250_PCI=y
++CONFIG_SERIAL_QE=y
++CONFIG_SERIO=y
++# CONFIG_SERIO_APBPS2 is not set
++CONFIG_SERIO_I8042=y
++CONFIG_SERIO_PCIPS2=y
++CONFIG_SERIO_RAW=y
++CONFIG_SERIO_SERPORT=y
++# CONFIG_SERIO_XILINX_XPS_PS2 is not set
++CONFIG_SIMPLE_GPIO=y
++# CONFIG_SLAB is not set
++CONFIG_SLOB=y
++CONFIG_SPARSE_IRQ=y
++CONFIG_SPI=y
++CONFIG_SPI_MASTER=y
++# CONFIG_SWAP is not set
++# CONFIG_SWIOTLB is not set
++CONFIG_SYSCTL_EXCEPTION_TRACE=y
++CONFIG_TASK_SIZE=0xc0000000
++# CONFIG_TAU is not set
++CONFIG_TICK_CPU_ACCOUNTING=y
++CONFIG_TMPFS_POSIX_ACL=y
++# CONFIG_UBIFS_FS is not set
++CONFIG_UCC=y
++CONFIG_UCC_FAST=y
++CONFIG_UCC_GETH=y
++CONFIG_UCC_SLOW=y
++# CONFIG_UCC_TDM is not set
++# CONFIG_UGETH_TX_ON_DEMAND is not set
++CONFIG_VIA_VELOCITY=y
++CONFIG_VITESSE_PHY=y
++CONFIG_VITESSE_PHY_8601_SKEW=y
++CONFIG_WATCHDOG_CORE=y
++CONFIG_WORD_SIZE=32
++CONFIG_XZ_DEC_BCJ=y
++CONFIG_XZ_DEC_POWERPC=y
++CONFIG_YAFFS_9BYTE_TAGS=y
++# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set
++CONFIG_YAFFS_AUTO_YAFFS2=y
++# CONFIG_YAFFS_DISABLE_BACKGROUND is not set
++# CONFIG_YAFFS_DISABLE_BLOCK_REFRESHING is not set
++CONFIG_YAFFS_DISABLE_TAGS_ECC=y
++# CONFIG_YAFFS_EMPTY_LOST_AND_FOUND is not set
++CONFIG_YAFFS_FS=y
++CONFIG_YAFFS_XATTR=y
++CONFIG_YAFFS_YAFFS1=y
++CONFIG_YAFFS_YAFFS2=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_ZLIB_INFLATE=y
+diff --git a/feeds/targets/mpc83xx/files/scripts/mkits.sh b/feeds/targets/mpc83xx/files/scripts/mkits.sh
+new file mode 100755
+index 0000000..3b02b69
+--- /dev/null
++++ b/feeds/targets/mpc83xx/files/scripts/mkits.sh
+@@ -0,0 +1,111 @@
++#!/bin/bash
++#
++# Licensed under the terms of the GNU GPL License version 2 or later.
++#
++# Author: Peter Tyser <ptyser@xes-inc.com>
++#
++# U-Boot firmware supports the booting of images in the Flattened Image
++# Tree (FIT) format. The FIT format uses a device tree structure to
++# describe a kernel image, device tree blob, ramdisk, etc. This script
++# creates an Image Tree Source (.its file) which can be passed to the
++# 'mkimage' utility to generate an Image Tree Blob (.itb file). The .itb
++# file can then be booted by U-Boot (or other bootloaders which support
++# FIT images). See doc/uImage.FIT/howto.txt in U-Boot source code for
++# additional information on FIT images.
++#
++
++usage() {
++ echo "Usage: `basename $0` -A arch -C comp -a addr -e entry" \
++ "-v version -k kernel [-d dtb] -o its_file"
++ echo -e "\t-A ==> set architecture to 'arch'"
++ echo -e "\t-C ==> set compression type 'comp'"
++ echo -e "\t-a ==> set load address to 'addr' (hex)"
++ echo -e "\t-e ==> set entry point to 'entry' (hex)"
++ echo -e "\t-v ==> set kernel version to 'version'"
++ echo -e "\t-k ==> include kernel image 'kernel'"
++ echo -e "\t-d ==> include Device Tree Blob 'dtb'"
++ echo -e "\t-o ==> create output file 'its_file'"
++ exit 1
++}
++
++while getopts ":A:C:a:d:e:k:o:v:" OPTION
++do
++ case $OPTION in
++ A ) ARCH=$OPTARG;;
++ C ) COMPRESS=$OPTARG;;
++ a ) LOAD_ADDR=$OPTARG;;
++ d ) DTB=$OPTARG;;
++ e ) ENTRY_ADDR=$OPTARG;;
++ k ) KERNEL=$OPTARG;;
++ o ) OUTPUT=$OPTARG;;
++ v ) VERSION=$OPTARG;;
++ * ) echo "Invalid option passed to '$0' (options:$@)"
++ usage;;
++ esac
++done
++
++# Make sure user entered all required parameters
++if [ -z "${ARCH}" ] || [ -z "${COMPRESS}" ] || [ -z "${LOAD_ADDR}" ] || \
++ [ -z "${ENTRY_ADDR}" ] || [ -z "${VERSION}" ] || [ -z "${KERNEL}" ] || \
++ [ -z "${OUTPUT}" ]; then
++ usage
++fi
++
++# Create a default, fully populated DTS file
++DATA="/dts-v1/;
++
++/ {
++ description = \"Linux kernel ${VERSION}\";
++ #address-cells = <1>;
++
++ images {
++ kernel@1 {
++ description = \"Linux Kernel ${VERSION}\";
++ data = /incbin/(\"${KERNEL}\");
++ type = \"kernel\";
++ arch = \"${ARCH}\";
++ os = \"linux\";
++ compression = \"${COMPRESS}\";
++ load = <${LOAD_ADDR}>;
++ entry = <${ENTRY_ADDR}>;
++ hash@1 {
++ algo = \"crc32\";
++ };
++ hash@2 {
++ algo = \"sha1\";
++ };
++ };
++
++ fdt@1 { /* start fdt */
++ description = \"Flattened Device Tree blob\";
++ data = /incbin/(\"${DTB}\");
++ type = \"flat_dt\";
++ arch = \"${ARCH}\";
++ compression = \"none\";
++ hash@1 {
++ algo = \"crc32\";
++ };
++ hash@2 {
++ algo = \"sha1\";
++ };
++ }; /* end fdt */
++ };
++
++ configurations {
++ default = \"config@1\";
++ config@1 {
++ description = \"Default Linux kernel\";
++ kernel = \"kernel@1\";
++ fdt = \"fdt@1\";
++ };
++ };
++};"
++
++# Conditionally strip fdt information out of tree
++if [ -z "${DTB}" ]; then
++ DATA=`echo "$DATA" | sed '/start fdt/,/end fdt/d'`
++ DATA=`echo "$DATA" | sed '/fdt/d'`
++fi
++
++# Write .its file to disk
++echo "$DATA" > ${OUTPUT}
+diff --git a/feeds/targets/mpc83xx/image/Makefile b/feeds/targets/mpc83xx/image/Makefile
+new file mode 100644
+index 0000000..8770390
+--- /dev/null
++++ b/feeds/targets/mpc83xx/image/Makefile
+@@ -0,0 +1,33 @@
++#
++# Copyright (C) 2009-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/image.mk
++
++
++define Image/Prepare
++ $(LINUX_DIR)/scripts/dtc/dtc -O dtb -R 4 -S 0x20000 $(DTS_DIR)/mpc8377_wlan.dts > $(BIN_DIR)/openwrt-mpc83xx-mpc8377_wlan.dtb
++endef
++
++define Image/BuildKernel
++ cp $(LINUX_DIR)/arch/powerpc/boot/dtbImage.rb600.elf $(BIN_DIR)/openwrt-$(BOARD)-rb600.elf
++ cp $(LINUX_DIR)/arch/powerpc/boot/dtbImage.rb333.elf $(BIN_DIR)/openwrt-$(BOARD)-rb333.elf
++ cp $(KDIR)/uImage $(BIN_DIR)/openwrt-$(BOARD)-uImage
++endef
++
++define Image/Build
++ $(call Image/Build/$(1),$(1))
++endef
++
++define Image/Build/squashfs
++ $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
++ ( \
++ dd if=$(LINUX_DIR)/arch/powerpc/boot/uImage bs=3072k conv=sync; \
++ dd if=$(KDIR)/root.$(1) bs=256k conv=sync; \
++ ) > $(BIN_DIR)/$(IMG_PREFIX)-mpc8377_wlan-$(1).img
++endef
++
++$(eval $(call BuildImage))
+diff --git a/feeds/targets/mpc83xx/modules.mk b/feeds/targets/mpc83xx/modules.mk
+new file mode 100644
+index 0000000..dd65d11
+--- /dev/null
++++ b/feeds/targets/mpc83xx/modules.mk
+@@ -0,0 +1,25 @@
++#
++# Copyright (C) 2012 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++define KernelPackage/ata-rbppc-cf
++ SUBMENU:=$(BLOCK_MENU)
++ TITLE:=RB600 Compact Flash support
++ DEPENDS:=@TARGET_mpc83xx
++ KCONFIG:= \
++ CONFIG_PATA_PLATFORM \
++ CONFIG_PATA_RB_PPC
++ FILES:=\
++ $(LINUX_DIR)/drivers/ata/pata_rbppc_cf.ko
++ AUTOLOAD:=$(call AutoLoad,41,pata_rbppc_cf,1)
++ $(call AddDepends/ata)
++endef
++
++define KernelPackage/ata-rbppc-cf/description
++ RB600 Compact Flash support.
++endef
++
++$(eval $(call KernelPackage,ata-rbppc-cf))
+diff --git a/feeds/targets/mpc83xx/patches-3.18/100-powerpc_create_fit_uImages.patch b/feeds/targets/mpc83xx/patches-3.18/100-powerpc_create_fit_uImages.patch
+new file mode 100644
+index 0000000..ef58f14
+--- /dev/null
++++ b/feeds/targets/mpc83xx/patches-3.18/100-powerpc_create_fit_uImages.patch
+@@ -0,0 +1,85 @@
++--- a/arch/powerpc/Makefile
+++++ b/arch/powerpc/Makefile
++@@ -240,7 +240,9 @@ all: zImage
++
++ # With make 3.82 we cannot mix normal and wildcard targets
++ BOOT_TARGETS1 := zImage zImage.initrd uImage
++-BOOT_TARGETS2 := zImage% dtbImage% treeImage.% cuImage.% simpleImage.% uImage.%
+++BOOT_TARGETS2 := uImage.fit.% zImage% dtbImage% treeImage.% cuImage.% \
+++ simpleImage.% uImage.%
+++
++
++ PHONY += $(BOOT_TARGETS1) $(BOOT_TARGETS2)
++
++@@ -273,6 +275,7 @@ define archhelp
++ @echo '* zImage - Build default images selected by kernel config'
++ @echo ' zImage.* - Compressed kernel image (arch/$(ARCH)/boot/zImage.*)'
++ @echo ' uImage - U-Boot native image format'
+++ @echo ' uImage.fit.<dt> - U-Boot Flattened Image Tree image format'
++ @echo ' cuImage.<dt> - Backwards compatible U-Boot image for older'
++ @echo ' versions which do not support device trees'
++ @echo ' dtbImage.<dt> - zImage with an embedded device tree blob'
++--- a/arch/powerpc/boot/.gitignore
+++++ b/arch/powerpc/boot/.gitignore
++@@ -14,6 +14,7 @@ kernel-vmlinux.strip.c
++ kernel-vmlinux.strip.gz
++ mktree
++ uImage
+++uImage.fit.*
++ cuImage.*
++ dtbImage.*
++ *.dtb
++--- a/arch/powerpc/boot/Makefile
+++++ b/arch/powerpc/boot/Makefile
++@@ -357,6 +357,9 @@ $(obj)/uImage.initrd.%: vmlinux $(obj)/%
++ $(obj)/uImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
++ $(call if_changed,wrap,uboot-$*,,$(obj)/$*.dtb)
++
+++$(obj)/uImage.fit.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+++ $(call if_changed,wrap,uboot.fit,,$(obj)/$*.dtb)
+++
++ $(obj)/cuImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits)
++ $(call if_changed,wrap,cuboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
++
++@@ -399,6 +402,7 @@ zInstall: $(CONFIGURE) $(addprefix $(obj
++
++ # anything not in $(targets)
++ clean-files += $(image-) $(initrd-) cuImage.* dtbImage.* treeImage.* \
+++ uImage.* \
++ zImage zImage.initrd zImage.chrp zImage.coff zImage.holly \
++ zImage.miboot zImage.pmac zImage.pseries \
++ zImage.maple simpleImage.* otheros.bld *.dtb
++--- a/arch/powerpc/boot/wrapper
+++++ b/arch/powerpc/boot/wrapper
++@@ -48,6 +48,9 @@ CROSS=
++ # mkimage wrapper script
++ MKIMAGE=$srctree/scripts/mkuboot.sh
++
+++# script to generate an .its file for uImage.fit.* images
+++MKITS=$srctree/scripts/mkits.sh
+++
++ # directory for object and other files used by this script
++ object=arch/powerpc/boot
++ objbin=$object
++@@ -365,6 +368,21 @@ uboot-obs600)
++ if [ -z "$cacheit" ]; then
++ rm -f "$vmz"
++ fi
+++ exit 0
+++ ;;
+++uboot.fit)
+++ rm -f "$ofile"
+++ ${MKITS} -A ppc -C gzip -a $membase -e $membase -v $version \
+++ -d "$srctree/$dtb" -k "$srctree/$vmz" -o "$object/uImage.its"
+++
+++ # mkimage calls dtc for FIT images so use kernel dtc if necessary
+++ export PATH=$PATH:$srctree/scripts/dtc
+++
+++ ${MKIMAGE} -f "$object/uImage.its" "$ofile"
+++ rm "$object/uImage.its"
+++ if [ -z "$cacheit" ]; then
+++ rm -f "$vmz"
+++ fi
++ exit 0
++ ;;
++ esac
+diff --git a/feeds/targets/mpc83xx/patches-3.18/101-mpc8377_wlan-dts-add-gpio-leds.patch b/feeds/targets/mpc83xx/patches-3.18/101-mpc8377_wlan-dts-add-gpio-leds.patch
+new file mode 100644
+index 0000000..b8f00ac
+--- /dev/null
++++ b/feeds/targets/mpc83xx/patches-3.18/101-mpc8377_wlan-dts-add-gpio-leds.patch
+@@ -0,0 +1,21 @@
++--- a/arch/powerpc/boot/dts/mpc8377_wlan.dts
+++++ b/arch/powerpc/boot/dts/mpc8377_wlan.dts
++@@ -460,4 +460,18 @@
++ 0 0x00800000>;
++ };
++ };
+++
+++ leds {
+++ compatible = "gpio-leds";
+++
+++ diag {
+++ gpios = <&gpio1 9 1>;
+++ default-state = "off";
+++ };
+++
+++ wireless {
+++ gpios = <&gpio1 10 1>;
+++ default-state = "off";
+++ };
+++ };
++ };
+diff --git a/feeds/targets/mpc83xx/patches-3.18/110-vitesse_8601.patch b/feeds/targets/mpc83xx/patches-3.18/110-vitesse_8601.patch
+new file mode 100644
+index 0000000..ce76219
+--- /dev/null
++++ b/feeds/targets/mpc83xx/patches-3.18/110-vitesse_8601.patch
+@@ -0,0 +1,88 @@
++--- a/drivers/net/phy/Kconfig
+++++ b/drivers/net/phy/Kconfig
++@@ -74,6 +74,12 @@ config VITESSE_PHY
++ ---help---
++ Currently supports the vsc8244
++
+++config VITESSE_PHY_8601_SKEW
+++ bool "Enable skew timing to vsc8601"
+++ depends on VITESSE_PHY
+++ ---help---
+++ Apply clock timing adjustments for vsc8601
+++
++ config SMSC_PHY
++ tristate "Drivers for SMSC PHYs"
++ ---help---
++--- a/drivers/net/phy/vitesse.c
+++++ b/drivers/net/phy/vitesse.c
++@@ -31,6 +31,11 @@
++ #define MII_VSC8244_EXTCON1_TX_SKEW 0x0800
++ #define MII_VSC8244_EXTCON1_RX_SKEW 0x0200
++
+++/* EXT_CON1 Register values for VSC8601 */
+++#define MII_VSC8601_EXTCON1_INIT 0x0000
+++#define MII_VSC8601_EXTCON1_SKEW 0x0100
+++#define MII_VSC8601_EXTCON1_ACTIPHY 0x0020
+++
++ /* Vitesse Interrupt Mask Register */
++ #define MII_VSC8244_IMASK 0x19
++ #define MII_VSC8244_IMASK_IEN 0x8000
++@@ -69,6 +74,7 @@
++ #define PHY_ID_VSC8662 0x00070660
++ #define PHY_ID_VSC8221 0x000fc550
++ #define PHY_ID_VSC8211 0x000fc4b0
+++#define PHY_ID_VSC8601 0x00070420
++
++ MODULE_DESCRIPTION("Vitesse PHY driver");
++ MODULE_AUTHOR("Kriston Carson");
++@@ -110,6 +116,30 @@ static int vsc824x_config_init(struct ph
++ return err;
++ }
++
+++static int vsc8601_config_init(struct phy_device *phydev)
+++{
+++ int err;
+++ int extcon;
+++
+++ err = phy_write(phydev, MII_VSC8244_AUX_CONSTAT,
+++ MII_VSC8244_AUXCONSTAT_INIT);
+++
+++ if (err < 0)
+++ return err;
+++
+++#ifdef CONFIG_VITESSE_PHY_8601_SKEW
+++ extcon = phy_read(phydev, MII_VSC8244_EXT_CON1);
+++ if (err < 0)
+++ return err;
+++
+++ extcon |= MII_VSC8601_EXTCON1_SKEW;
+++
+++ err = phy_write(phydev, MII_VSC8244_EXT_CON1, extcon);
+++#endif
+++
+++ return err;
+++}
+++
++ static int vsc824x_ack_interrupt(struct phy_device *phydev)
++ {
++ int err = 0;
++@@ -309,6 +339,19 @@ static struct phy_driver vsc82xx_driver[
++ .ack_interrupt = &vsc824x_ack_interrupt,
++ .config_intr = &vsc82xx_config_intr,
++ .driver = { .owner = THIS_MODULE,},
+++}, {
+++ /* Vitesse 8601 */
+++ .phy_id = PHY_ID_VSC8601,
+++ .name = "Vitesse VSC8601",
+++ .phy_id_mask = 0x000ffff8,
+++ .features = PHY_GBIT_FEATURES,
+++ .flags = PHY_HAS_INTERRUPT,
+++ .config_init = &vsc8601_config_init,
+++ .config_aneg = &genphy_config_aneg,
+++ .read_status = &genphy_read_status,
+++ .ack_interrupt = &vsc824x_ack_interrupt,
+++ .config_intr = &vsc82xx_config_intr,
+++ .driver = { .owner = THIS_MODULE,},
++ } };
++
++ static int __init vsc82xx_init(void)
+diff --git a/feeds/targets/mpc83xx/patches-3.18/111-etsec27_war.patch b/feeds/targets/mpc83xx/patches-3.18/111-etsec27_war.patch
+new file mode 100644
+index 0000000..0c4b3fd
+--- /dev/null
++++ b/feeds/targets/mpc83xx/patches-3.18/111-etsec27_war.patch
+@@ -0,0 +1,23 @@
++--- a/drivers/net/ethernet/freescale/gianfar.c
+++++ b/drivers/net/ethernet/freescale/gianfar.c
++@@ -1050,10 +1050,16 @@ static int gfar_probe(struct platform_de
++ udelay(2);
++
++ tempval = 0;
++- if (!priv->pause_aneg_en && priv->tx_pause_en)
++- tempval |= MACCFG1_TX_FLOW;
++- if (!priv->pause_aneg_en && priv->rx_pause_en)
++- tempval |= MACCFG1_RX_FLOW;
+++ /*
+++ * Do not enable flow control on chips earlier than rev 1.1,
+++ * because of the eTSEC27 erratum
+++ */
+++ if ((mfspr(SPRN_SVR) & 0xffff) >= 0x0011) {
+++ if (!priv->pause_aneg_en && priv->tx_pause_en)
+++ tempval |= MACCFG1_TX_FLOW;
+++ if (!priv->pause_aneg_en && priv->rx_pause_en)
+++ tempval |= MACCFG1_RX_FLOW;
+++ }
++ /* the soft reset bit is not self-resetting, so we need to
++ * clear it before resuming normal operation
++ */
+diff --git a/feeds/targets/mpc83xx/patches-3.18/120-ucc_tdm.patch b/feeds/targets/mpc83xx/patches-3.18/120-ucc_tdm.patch
+new file mode 100644
+index 0000000..7de1b18
+--- /dev/null
++++ b/feeds/targets/mpc83xx/patches-3.18/120-ucc_tdm.patch
+@@ -0,0 +1,1307 @@
++--- /dev/null
+++++ b/drivers/misc/ucc_tdm.h
++@@ -0,0 +1,221 @@
+++/*
+++ * drivers/misc/ucc_tdm.h
+++ *
+++ * UCC Based Linux TDM Driver
+++ * This driver is designed to support UCC based TDM for PowerPC processors.
+++ * This driver can interface with SLIC device to run VOIP kind of
+++ * applications.
+++ *
+++ * Author: Ashish Kalra & Poonam Aggrwal
+++ *
+++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
+++ *
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License as published by the
+++ * Free Software Foundation; either version 2 of the License, or (at your
+++ * option) any later version.
+++ */
+++
+++#ifndef TDM_H
+++#define TDM_H
+++
+++#define NUM_TS 8
+++#define ACTIVE_CH 8
+++
+++/* SAMPLE_DEPTH is the sample depth is the number of frames before
+++ * an interrupt. Must be a multiple of 4
+++ */
+++#define SAMPLE_DEPTH 80
+++
+++/* define the number of Rx interrupts to go by for initial stuttering */
+++#define STUTTER_INT_CNT 1
+++
+++/* BMRx Field Descriptions to specify tstate and rstate in UCC parameter RAM*/
+++#define EN_BUS_SNOOPING 0x20
+++#define BE_BO 0x10
+++
+++/* UPSMR Register for Transparent UCC controller Bit definitions*/
+++#define NBO 0x00000000 /* Normal Mode 1 bit of data per clock */
+++
+++/* SI Mode register bit definitions */
+++#define NORMAL_OPERATION 0x0000
+++#define AUTO_ECHO 0x0400
+++#define INTERNAL_LB 0x0800
+++#define CONTROL_LB 0x0c00
+++#define SIMODE_CRT (0x8000 >> 9)
+++#define SIMODE_SL (0x8000 >> 10)
+++#define SIMODE_CE (0x8000 >> 11)
+++#define SIMODE_FE (0x8000 >> 12)
+++#define SIMODE_GM (0x8000 >> 13)
+++#define SIMODE_TFSD(val) (val)
+++#define SIMODE_RFSD(val) ((val) << 8)
+++
+++#define SI_TDM_MODE_REGISTER_OFFSET 0
+++
+++#define R_CM 0x02000000
+++#define T_CM 0x02000000
+++
+++#define SET_RX_SI_RAM(n, val) \
+++ out_be16((u16 *)&qe_immr->sir.rx[(n)*2], (u16)(val))
+++
+++#define SET_TX_SI_RAM(n, val) \
+++ out_be16((u16 *)&qe_immr->sir.tx[(n)*2], (u16)(val))
+++
+++/* SI RAM entries */
+++#define SIR_LAST 0x0001
+++#define SIR_CNT(n) ((n) << 2)
+++#define SIR_BYTE 0x0002
+++#define SIR_BIT 0x0000
+++#define SIR_IDLE 0
+++#define SIR_UCC(uccx) (((uccx+9)) << 5)
+++
+++/* BRGC Register Bit definitions */
+++#define BRGC_RESET (0x1<<17)
+++#define BRGC_EN (0x1<<16)
+++#define BRGC_EXTC_QE (0x00<<14)
+++#define BRGC_EXTC_CLK3 (0x01<<14)
+++#define BRGC_EXTC_CLK5 (0x01<<15)
+++#define BRGC_EXTC_CLK9 (0x01<<14)
+++#define BRGC_EXTC_CLK11 (0x01<<14)
+++#define BRGC_EXTC_CLK13 (0x01<<14)
+++#define BRGC_EXTC_CLK15 (0x01<<15)
+++#define BRGC_ATB (0x1<<13)
+++#define BRGC_DIV16 (0x1)
+++
+++/* structure representing UCC transparent parameter RAM */
+++struct ucc_transparent_pram {
+++ __be16 riptr;
+++ __be16 tiptr;
+++ __be16 res0;
+++ __be16 mrblr;
+++ __be32 rstate;
+++ __be32 rbase;
+++ __be16 rbdstat;
+++ __be16 rbdlen;
+++ __be32 rdptr;
+++ __be32 tstate;
+++ __be32 tbase;
+++ __be16 tbdstat;
+++ __be16 tbdlen;
+++ __be32 tdptr;
+++ __be32 rbptr;
+++ __be32 tbptr;
+++ __be32 rcrc;
+++ __be32 res1;
+++ __be32 tcrc;
+++ __be32 res2;
+++ __be32 res3;
+++ __be32 c_mask;
+++ __be32 c_pres;
+++ __be16 disfc;
+++ __be16 crcec;
+++ __be32 res4[4];
+++ __be16 ts_tmp;
+++ __be16 tmp_mb;
+++};
+++
+++#define UCC_TRANSPARENT_PRAM_SIZE 0x100
+++
+++struct tdm_cfg {
+++ u8 com_pin; /* Common receive and transmit pins
+++ * 0 = separate pins
+++ * 1 = common pins
+++ */
+++
+++ u8 fr_sync_level; /* SLx bit Frame Sync Polarity
+++ * 0 = L1R/TSYNC active logic "1"
+++ * 1 = L1R/TSYNC active logic "0"
+++ */
+++
+++ u8 clk_edge; /* CEx bit Tx Rx Clock Edge
+++ * 0 = TX data on rising edge of clock
+++ * RX data on falling edge
+++ * 1 = TX data on falling edge of clock
+++ * RX data on rising edge
+++ */
+++
+++ u8 fr_sync_edge; /* FEx bit Frame sync edge
+++ * Determine when the sync pulses are sampled
+++ * 0 = Falling edge
+++ * 1 = Rising edge
+++ */
+++
+++ u8 rx_fr_sync_delay; /* TFSDx/RFSDx bits Frame Sync Delay
+++ * 00 = no bit delay
+++ * 01 = 1 bit delay
+++ * 10 = 2 bit delay
+++ * 11 = 3 bit delay
+++ */
+++
+++ u8 tx_fr_sync_delay; /* TFSDx/RFSDx bits Frame Sync Delay
+++ * 00 = no bit delay
+++ * 01 = 1 bit delay
+++ * 10 = 2 bit delay
+++ * 11 = 3 bit delay
+++ */
+++
+++ u8 active_num_ts; /* Number of active time slots in TDM
+++ * assume same active Rx/Tx time slots
+++ */
+++};
+++
+++struct ucc_tdm_info {
+++ struct ucc_fast_info uf_info;
+++ u32 ucc_busy;
+++};
+++
+++struct tdm_ctrl {
+++ u32 device_busy;
+++ struct device *device;
+++ struct ucc_fast_private *uf_private;
+++ struct ucc_tdm_info *ut_info;
+++ u32 tdm_port; /* port for this tdm:TDMA,TDMB,TDMC,TDMD */
+++ u32 si; /* serial interface: 0 or 1 */
+++ struct ucc_fast __iomem *uf_regs; /* UCC Fast registers */
+++ u16 rx_mask[8]; /* Active Receive channels LSB is ch0 */
+++ u16 tx_mask[8]; /* Active Transmit channels LSB is ch0 */
+++ /* Only channels less than the number of FRAME_SIZE are implemented */
+++ struct tdm_cfg cfg_ctrl; /* Signaling controls configuration */
+++ u8 *tdm_input_data; /* buffer used for Rx by the tdm */
+++ u8 *tdm_output_data; /* buffer used for Tx by the tdm */
+++
+++ dma_addr_t dma_input_addr; /* dma mapped buffer for TDM Rx */
+++ dma_addr_t dma_output_addr; /* dma mapped buffer for TDM Tx */
+++ u16 physical_num_ts; /* physical number of timeslots in the tdm
+++ frame */
+++ u32 phase_rx; /* cycles through 0, 1, 2 */
+++ u32 phase_tx; /* cycles through 0, 1, 2 */
+++ /*
+++ * the following two variables are for dealing with "stutter" problem
+++ * "stutter" period is about 20 frames or so, varies depending active
+++ * channel num depending on the sample depth, the code should let a
+++ * few Rx interrupts go by
+++ */
+++ u32 tdm_icnt;
+++ u32 tdm_flag;
+++ struct ucc_transparent_pram __iomem *ucc_pram;
+++ struct qe_bd __iomem *tx_bd;
+++ struct qe_bd __iomem *rx_bd;
+++ u32 ucc_pram_offset;
+++ u32 tx_bd_offset;
+++ u32 rx_bd_offset;
+++ u32 rx_ucode_buf_offset;
+++ u32 tx_ucode_buf_offset;
+++ bool leg_slic;
+++ wait_queue_head_t wakeup_event;
+++};
+++
+++struct tdm_client {
+++ u32 client_id;
+++ void (*tdm_read)(u32 client_id, short chn_id,
+++ short *pcm_buffer, short len);
+++ void (*tdm_write)(u32 client_id, short chn_id,
+++ short *pcm_buffer, short len);
+++ wait_queue_head_t *wakeup_event;
+++ };
+++
+++#define MAX_PHASE 1
+++#define NR_BUFS 2
+++#define EFF_ACTIVE_CH ACTIVE_CH / 2
+++
+++#endif
++--- /dev/null
+++++ b/drivers/misc/ucc_tdm.c
++@@ -0,0 +1,1017 @@
+++/*
+++ * drivers/misc/ucc_tdm.c
+++ *
+++ * UCC Based Linux TDM Driver
+++ * This driver is designed to support UCC based TDM for PowerPC processors.
+++ * This driver can interface with SLIC device to run VOIP kind of
+++ * applications.
+++ *
+++ * Author: Ashish Kalra & Poonam Aggrwal
+++ *
+++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
+++ *
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License as published by the
+++ * Free Software Foundation; either version 2 of the License, or (at your
+++ * option) any later version.
+++ */
+++
+++#include <generated/autoconf.h>
+++#include <linux/module.h>
+++#include <linux/sched.h>
+++#include <linux/kernel.h>
+++#include <linux/slab.h>
+++#include <linux/errno.h>
+++#include <linux/types.h>
+++#include <linux/interrupt.h>
+++#include <linux/time.h>
+++#include <linux/skbuff.h>
+++#include <linux/proc_fs.h>
+++#include <linux/delay.h>
+++#include <linux/dma-mapping.h>
+++#include <linux/string.h>
+++#include <linux/irq.h>
+++#include <linux/of_platform.h>
+++#include <linux/io.h>
+++#include <linux/wait.h>
+++#include <linux/timer.h>
+++
+++#include <asm/immap_qe.h>
+++#include <asm/qe.h>
+++#include <asm/ucc.h>
+++#include <asm/ucc_fast.h>
+++#include <asm/ucc_slow.h>
+++
+++#include "ucc_tdm.h"
+++#define DRV_DESC "Freescale QE UCC TDM Driver"
+++#define DRV_NAME "ucc_tdm"
+++
+++
+++/*
+++ * define the following #define if snooping or hardware-based cache coherency
+++ * is disabled on the UCC transparent controller.This flag enables
+++ * software-based cache-coherency support by explicitly flushing data cache
+++ * contents after setting up the TDM output buffer(s) and invalidating the
+++ * data cache contents before the TDM input buffer(s) are read.
+++ */
+++#undef UCC_CACHE_SNOOPING_DISABLED
+++
+++#define MAX_NUM_TDM_DEVICES 8
+++
+++static struct tdm_ctrl *tdm_ctrl[MAX_NUM_TDM_DEVICES];
+++
+++static int num_tdm_devices;
+++static int num_tdm_clients;
+++
+++static struct ucc_tdm_info utdm_primary_info = {
+++ .uf_info = {
+++ .tsa = 1,
+++ .cdp = 1,
+++ .cds = 1,
+++ .ctsp = 1,
+++ .ctss = 1,
+++ .revd = 1,
+++ .urfs = 0x128,
+++ .utfs = 0x128,
+++ .utfet = 0,
+++ .utftt = 0x128,
+++ .ufpt = 256,
+++ .ttx_trx = UCC_FAST_GUMR_TRANSPARENT_TTX_TRX_TRANSPARENT,
+++ .tenc = UCC_FAST_TX_ENCODING_NRZ,
+++ .renc = UCC_FAST_RX_ENCODING_NRZ,
+++ .tcrc = UCC_FAST_16_BIT_CRC,
+++ .synl = UCC_FAST_SYNC_LEN_NOT_USED,
+++ },
+++ .ucc_busy = 0,
+++};
+++
+++static struct ucc_tdm_info utdm_info[8];
+++
+++static void dump_siram(struct tdm_ctrl *tdm_c)
+++{
+++#ifdef DEBUG
+++ int i;
+++ u16 phy_num_ts;
+++
+++ phy_num_ts = tdm_c->physical_num_ts;
+++
+++ pr_debug("SI TxRAM dump\n");
+++ /* each slot entry in SI RAM is of 2 bytes */
+++ for (i = 0; i < phy_num_ts * 2; i++)
+++ pr_debug("%x ", in_8(&qe_immr->sir.tx[i]));
+++ pr_debug("\nSI RxRAM dump\n");
+++ for (i = 0; i < phy_num_ts * 2; i++)
+++ pr_debug("%x ", in_8(&qe_immr->sir.rx[i]));
+++ pr_debug("\n");
+++#endif
+++}
+++
+++static void dump_ucc(struct tdm_ctrl *tdm_c)
+++{
+++#ifdef DEBUG
+++ struct ucc_transparent_pram *ucc_pram;
+++
+++ ucc_pram = tdm_c->ucc_pram;
+++
+++ pr_debug("%s Dumping UCC Registers\n", __FUNCTION__);
+++ ucc_fast_dump_regs(tdm_c->uf_private);
+++ pr_debug("%s Dumping UCC Parameter RAM\n", __FUNCTION__);
+++ pr_debug("rbase = 0x%x\n", in_be32(&ucc_pram->rbase));
+++ pr_debug("rbptr = 0x%x\n", in_be32(&ucc_pram->rbptr));
+++ pr_debug("mrblr = 0x%x\n", in_be16(&ucc_pram->mrblr));
+++ pr_debug("rbdlen = 0x%x\n", in_be16(&ucc_pram->rbdlen));
+++ pr_debug("rbdstat = 0x%x\n", in_be16(&ucc_pram->rbdstat));
+++ pr_debug("rstate = 0x%x\n", in_be32(&ucc_pram->rstate));
+++ pr_debug("rdptr = 0x%x\n", in_be32(&ucc_pram->rdptr));
+++ pr_debug("tbase = 0x%x\n", in_be32(&ucc_pram->tbase));
+++ pr_debug("tbptr = 0x%x\n", in_be32(&ucc_pram->tbptr));
+++ pr_debug("tbdlen = 0x%x\n", in_be16(&ucc_pram->tbdlen));
+++ pr_debug("tbdstat = 0x%x\n", in_be16(&ucc_pram->tbdstat));
+++ pr_debug("tstate = 0x%x\n", in_be32(&ucc_pram->tstate));
+++ pr_debug("tdptr = 0x%x\n", in_be32(&ucc_pram->tdptr));
+++#endif
+++}
+++
+++/*
+++ * For use when a framing bit is not present
+++ * Program current-route SI ram
+++ * Set SIxRAM TDMx
+++ * Entries must be in units of 8.
+++ * SIR_UCC -> Channel Select
+++ * SIR_CNT -> Number of bits or bytes
+++ * SIR_BYTE -> Byte or Bit resolution
+++ * SIR_LAST -> Indicates last entry in SIxRAM
+++ * SIR_IDLE -> The Tx data pin is Tri-stated and the Rx data pin is
+++ * ignored
+++ */
+++static void set_siram(struct tdm_ctrl *tdm_c, enum comm_dir dir)
+++{
+++ const u16 *mask;
+++ u16 temp_mask = 1;
+++ u16 siram_code = 0;
+++ u32 i, j, k;
+++ u32 ucc;
+++ u32 phy_num_ts;
+++
+++ phy_num_ts = tdm_c->physical_num_ts;
+++ ucc = tdm_c->ut_info->uf_info.ucc_num;
+++
+++ if (dir == COMM_DIR_RX)
+++ mask = tdm_c->rx_mask;
+++ else
+++ mask = tdm_c->tx_mask;
+++ k = 0;
+++ j = 0;
+++ for (i = 0; i < phy_num_ts; i++) {
+++ if ((mask[k] & temp_mask) == temp_mask)
+++ siram_code = SIR_UCC(ucc) | SIR_CNT(0) | SIR_BYTE;
+++ else
+++ siram_code = SIR_IDLE | SIR_CNT(0) | SIR_BYTE;
+++ if (dir == COMM_DIR_RX)
+++ out_be16((u16 *)&qe_immr->sir.rx[i * 2], siram_code);
+++ else
+++ out_be16((u16 *)&qe_immr->sir.tx[i * 2], siram_code);
+++ temp_mask = temp_mask << 1;
+++ j++;
+++ if (j >= 16) {
+++ j = 0;
+++ temp_mask = 0x0001;
+++ k++;
+++ }
+++ }
+++ siram_code = siram_code | SIR_LAST;
+++
+++ if (dir == COMM_DIR_RX)
+++ out_be16((u16 *)&qe_immr->sir.rx[(phy_num_ts - 1) * 2],
+++ siram_code);
+++ else
+++ out_be16((u16 *)&qe_immr->sir.tx[(phy_num_ts - 1) * 2],
+++ siram_code);
+++}
+++
+++static void config_si(struct tdm_ctrl *tdm_c)
+++{
+++ u8 rxsyncdelay, txsyncdelay, tdm_port;
+++ u16 sixmr_val = 0;
+++ u32 tdma_mode_off;
+++ u16 *si1_tdm_mode_reg;
+++
+++ tdm_port = tdm_c->tdm_port;
+++
+++ set_siram(tdm_c, COMM_DIR_RX);
+++
+++ set_siram(tdm_c, COMM_DIR_TX);
+++
+++ rxsyncdelay = tdm_c->cfg_ctrl.rx_fr_sync_delay;
+++ txsyncdelay = tdm_c->cfg_ctrl.tx_fr_sync_delay;
+++ if (tdm_c->cfg_ctrl.com_pin)
+++ sixmr_val |= SIMODE_CRT;
+++ if (tdm_c->cfg_ctrl.fr_sync_level == 1)
+++ sixmr_val |= SIMODE_SL;
+++ if (tdm_c->cfg_ctrl.clk_edge == 1)
+++ sixmr_val |= SIMODE_CE;
+++ if (tdm_c->cfg_ctrl.fr_sync_edge == 1)
+++ sixmr_val |= SIMODE_FE;
+++ sixmr_val |= (SIMODE_TFSD(txsyncdelay) | SIMODE_RFSD(rxsyncdelay));
+++
+++ tdma_mode_off = SI_TDM_MODE_REGISTER_OFFSET * tdm_c->tdm_port;
+++
+++ si1_tdm_mode_reg = (u8 *)&qe_immr->si1 + tdma_mode_off;
+++ out_be16(si1_tdm_mode_reg, sixmr_val);
+++
+++ dump_siram(tdm_c);
+++}
+++
+++static int tdm_init(struct tdm_ctrl *tdm_c)
+++{
+++ u32 tdm_port, ucc, act_num_ts;
+++ int ret, i, err;
+++ u32 cecr_subblock;
+++ u32 pram_offset;
+++ u32 rxbdt_offset;
+++ u32 txbdt_offset;
+++ u32 rx_ucode_buf_offset, tx_ucode_buf_offset;
+++ u16 bd_status, bd_len;
+++ enum qe_clock clock;
+++ struct qe_bd __iomem *rx_bd, *tx_bd;
+++
+++ tdm_port = tdm_c->tdm_port;
+++ ucc = tdm_c->ut_info->uf_info.ucc_num;
+++ act_num_ts = tdm_c->cfg_ctrl.active_num_ts;
+++
+++ /*
+++ * TDM Tx and Rx CLKs = 2048 KHz.
+++ */
+++ if (strstr(tdm_c->ut_info->uf_info.tdm_tx_clk, "BRG")) {
+++ clock = qe_clock_source(tdm_c->ut_info->uf_info.tdm_tx_clk);
+++ err = qe_setbrg(clock, 2048000, 1);
+++ if (err < 0) {
+++ printk(KERN_ERR "%s: Failed to set %s\n", __FUNCTION__,
+++ tdm_c->ut_info->uf_info.tdm_tx_clk);
+++ return err;
+++ }
+++ }
+++ if (strstr(tdm_c->ut_info->uf_info.tdm_rx_clk, "BRG")) {
+++ clock = qe_clock_source(tdm_c->ut_info->uf_info.tdm_rx_clk);
+++ err = qe_setbrg(clock, 2048000, 1);
+++ if (err < 0) {
+++ printk(KERN_ERR "%s: Failed to set %s\n", __FUNCTION__,
+++ tdm_c->ut_info->uf_info.tdm_rx_clk);
+++ return err;
+++ }
+++ }
+++ /*
+++ * TDM FSyncs = 4 KHz.
+++ */
+++ if (strstr(tdm_c->ut_info->uf_info.tdm_tx_sync, "BRG")) {
+++ clock = qe_clock_source(tdm_c->ut_info->uf_info.tdm_tx_sync);
+++ err = qe_setbrg(clock, 4000, 1);
+++ if (err < 0) {
+++ printk(KERN_ERR "%s: Failed to set %s\n", __FUNCTION__,
+++ tdm_c->ut_info->uf_info.tdm_tx_sync);
+++ return err;
+++ }
+++ }
+++ if (strstr(tdm_c->ut_info->uf_info.tdm_rx_sync, "BRG")) {
+++ clock = qe_clock_source(tdm_c->ut_info->uf_info.tdm_rx_sync);
+++ err = qe_setbrg(clock, 4000, 1);
+++ if (err < 0) {
+++ printk(KERN_ERR "%s: Failed to set %s\n", __FUNCTION__,
+++ tdm_c->ut_info->uf_info.tdm_rx_sync);
+++ return err;
+++ }
+++ }
+++
+++ tdm_c->ut_info->uf_info.uccm_mask = (u32)
+++ ((UCC_TRANS_UCCE_RXB | UCC_TRANS_UCCE_BSY) << 16);
+++
+++ if (ucc_fast_init(&(tdm_c->ut_info->uf_info), &tdm_c->uf_private)) {
+++ printk(KERN_ERR "%s: Failed to init uccf\n", __FUNCTION__);
+++ return -ENOMEM;
+++ }
+++
+++ ucc_fast_disable(tdm_c->uf_private, COMM_DIR_RX | COMM_DIR_TX);
+++
+++ /* Write to QE CECR, UCCx channel to Stop Transmission */
+++ cecr_subblock = ucc_fast_get_qe_cr_subblock(ucc);
+++ qe_issue_cmd(QE_STOP_TX, cecr_subblock,
+++ (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
+++
+++ pram_offset = qe_muram_alloc(UCC_TRANSPARENT_PRAM_SIZE,
+++ ALIGNMENT_OF_UCC_SLOW_PRAM);
+++ if (IS_ERR_VALUE(pram_offset)) {
+++ printk(KERN_ERR "%s: Cannot allocate MURAM memory for"
+++ " transparent UCC\n", __FUNCTION__);
+++ ret = -ENOMEM;
+++ goto pram_alloc_error;
+++ }
+++
+++ cecr_subblock = ucc_fast_get_qe_cr_subblock(ucc);
+++ qe_issue_cmd(QE_ASSIGN_PAGE_TO_DEVICE, cecr_subblock,
+++ QE_CR_PROTOCOL_UNSPECIFIED, pram_offset);
+++
+++ tdm_c->ucc_pram = qe_muram_addr(pram_offset);
+++ tdm_c->ucc_pram_offset = pram_offset;
+++
+++ /*
+++ * zero-out pram, this will also ensure RSTATE, TSTATE are cleared, also
+++ * DISFC & CRCEC counters will be initialized.
+++ */
+++ memset(tdm_c->ucc_pram, 0, sizeof(struct ucc_transparent_pram));
+++
+++ /* rbase, tbase alignment is 8. */
+++ rxbdt_offset = qe_muram_alloc(NR_BUFS * sizeof(struct qe_bd),
+++ QE_ALIGNMENT_OF_BD);
+++ if (IS_ERR_VALUE(rxbdt_offset)) {
+++ printk(KERN_ERR "%s: Cannot allocate MURAM memory for RxBDs\n",
+++ __FUNCTION__);
+++ ret = -ENOMEM;
+++ goto rxbd_alloc_error;
+++ }
+++ txbdt_offset = qe_muram_alloc(NR_BUFS * sizeof(struct qe_bd),
+++ QE_ALIGNMENT_OF_BD);
+++ if (IS_ERR_VALUE(txbdt_offset)) {
+++ printk(KERN_ERR "%s: Cannot allocate MURAM memory for TxBDs\n",
+++ __FUNCTION__);
+++ ret = -ENOMEM;
+++ goto txbd_alloc_error;
+++ }
+++ tdm_c->tx_bd = qe_muram_addr(txbdt_offset);
+++ tdm_c->rx_bd = qe_muram_addr(rxbdt_offset);
+++
+++ tdm_c->tx_bd_offset = txbdt_offset;
+++ tdm_c->rx_bd_offset = rxbdt_offset;
+++
+++ rx_bd = tdm_c->rx_bd;
+++ tx_bd = tdm_c->tx_bd;
+++
+++ out_be32(&tdm_c->ucc_pram->rbase, (u32) immrbar_virt_to_phys(rx_bd));
+++ out_be32(&tdm_c->ucc_pram->tbase, (u32) immrbar_virt_to_phys(tx_bd));
+++
+++ for (i = 0; i < NR_BUFS - 1; i++) {
+++ bd_status = (u16) ((R_E | R_CM | R_I) >> 16);
+++ bd_len = 0;
+++ out_be16(&rx_bd->length, bd_len);
+++ out_be16(&rx_bd->status, bd_status);
+++ out_be32(&rx_bd->buf,
+++ tdm_c->dma_input_addr + i * SAMPLE_DEPTH * act_num_ts);
+++ rx_bd += 1;
+++
+++ bd_status = (u16) ((T_R | T_CM) >> 16);
+++ bd_len = SAMPLE_DEPTH * act_num_ts;
+++ out_be16(&tx_bd->length, bd_len);
+++ out_be16(&tx_bd->status, bd_status);
+++ out_be32(&tx_bd->buf,
+++ tdm_c->dma_output_addr + i * SAMPLE_DEPTH * act_num_ts);
+++ tx_bd += 1;
+++ }
+++
+++ bd_status = (u16) ((R_E | R_CM | R_I | R_W) >> 16);
+++ bd_len = 0;
+++ out_be16(&rx_bd->length, bd_len);
+++ out_be16(&rx_bd->status, bd_status);
+++ out_be32(&rx_bd->buf,
+++ tdm_c->dma_input_addr + i * SAMPLE_DEPTH * act_num_ts);
+++
+++ bd_status = (u16) ((T_R | T_CM | T_W) >> 16);
+++ bd_len = SAMPLE_DEPTH * act_num_ts;
+++ out_be16(&tx_bd->length, bd_len);
+++ out_be16(&tx_bd->status, bd_status);
+++ out_be32(&tx_bd->buf,
+++ tdm_c->dma_output_addr + i * SAMPLE_DEPTH * act_num_ts);
+++
+++ config_si(tdm_c);
+++
+++ setbits32(&qe_immr->ic.qimr, (0x80000000UL >> ucc));
+++
+++ rx_ucode_buf_offset = qe_muram_alloc(32, 32);
+++ if (IS_ERR_VALUE(rx_ucode_buf_offset)) {
+++ printk(KERN_ERR "%s: Cannot allocate MURAM mem for Rx"
+++ " ucode buf\n", __FUNCTION__);
+++ ret = -ENOMEM;
+++ goto rxucode_buf_alloc_error;
+++ }
+++
+++ tx_ucode_buf_offset = qe_muram_alloc(32, 32);
+++ if (IS_ERR_VALUE(tx_ucode_buf_offset)) {
+++ printk(KERN_ERR "%s: Cannot allocate MURAM mem for Tx"
+++ " ucode buf\n", __FUNCTION__);
+++ ret = -ENOMEM;
+++ goto txucode_buf_alloc_error;
+++ }
+++ out_be16(&tdm_c->ucc_pram->riptr, (u16) rx_ucode_buf_offset);
+++ out_be16(&tdm_c->ucc_pram->tiptr, (u16) tx_ucode_buf_offset);
+++
+++ tdm_c->rx_ucode_buf_offset = rx_ucode_buf_offset;
+++ tdm_c->tx_ucode_buf_offset = tx_ucode_buf_offset;
+++
+++ /*
+++ * set the receive buffer descriptor maximum size to be
+++ * SAMPLE_DEPTH * number of active RX channels
+++ */
+++ out_be16(&tdm_c->ucc_pram->mrblr, (u16) SAMPLE_DEPTH * act_num_ts);
+++
+++ /*
+++ * enable snooping and BE byte ordering on the UCC pram's
+++ * tstate & rstate registers.
+++ */
+++ out_be32(&tdm_c->ucc_pram->tstate, 0x30000000UL);
+++ out_be32(&tdm_c->ucc_pram->rstate, 0x30000000UL);
+++
+++ /*Put UCC transparent controller into serial interface mode. */
+++ out_be32(&tdm_c->uf_regs->upsmr, 0);
+++
+++ /* Reset TX and RX for UCCx */
+++ cecr_subblock = ucc_fast_get_qe_cr_subblock(ucc);
+++ qe_issue_cmd(QE_INIT_TX_RX, cecr_subblock,
+++ (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
+++
+++ return 0;
+++
+++txucode_buf_alloc_error:
+++ qe_muram_free(rx_ucode_buf_offset);
+++rxucode_buf_alloc_error:
+++ qe_muram_free(txbdt_offset);
+++txbd_alloc_error:
+++ qe_muram_free(rxbdt_offset);
+++rxbd_alloc_error:
+++ qe_muram_free(pram_offset);
+++pram_alloc_error:
+++ ucc_fast_free(tdm_c->uf_private);
+++ return ret;
+++}
+++
+++static void tdm_deinit(struct tdm_ctrl *tdm_c)
+++{
+++ qe_muram_free(tdm_c->rx_ucode_buf_offset);
+++ qe_muram_free(tdm_c->tx_ucode_buf_offset);
+++
+++ if (tdm_c->rx_bd_offset) {
+++ qe_muram_free(tdm_c->rx_bd_offset);
+++ tdm_c->rx_bd = NULL;
+++ tdm_c->rx_bd_offset = 0;
+++ }
+++ if (tdm_c->tx_bd_offset) {
+++ qe_muram_free(tdm_c->tx_bd_offset);
+++ tdm_c->tx_bd = NULL;
+++ tdm_c->tx_bd_offset = 0;
+++ }
+++ if (tdm_c->ucc_pram_offset) {
+++ qe_muram_free(tdm_c->ucc_pram_offset);
+++ tdm_c->ucc_pram = NULL;
+++ tdm_c->ucc_pram_offset = 0;
+++ }
+++}
+++
+++
+++static irqreturn_t tdm_isr(int irq, void *dev_id)
+++{
+++ u8 *input_tdm_buffer, *output_tdm_buffer;
+++ u32 txb, rxb;
+++ u32 ucc;
+++ register u32 ucce = 0;
+++ struct tdm_ctrl *tdm_c;
+++ tdm_c = (struct tdm_ctrl *)dev_id;
+++
+++ tdm_c->tdm_icnt++;
+++ ucc = tdm_c->ut_info->uf_info.ucc_num;
+++ input_tdm_buffer = tdm_c->tdm_input_data;
+++ output_tdm_buffer = tdm_c->tdm_output_data;
+++
+++ if (in_be32(tdm_c->uf_private->p_ucce) &
+++ (UCC_TRANS_UCCE_BSY << 16)) {
+++ out_be32(tdm_c->uf_private->p_ucce,
+++ (UCC_TRANS_UCCE_BSY << 16));
+++ pr_info("%s: From tdm isr busy interrupt\n",
+++ __FUNCTION__);
+++ dump_ucc(tdm_c);
+++
+++ return IRQ_HANDLED;
+++ }
+++
+++ if (tdm_c->tdm_flag == 1) {
+++ /* track phases for Rx/Tx */
+++ tdm_c->phase_rx += 1;
+++ if (tdm_c->phase_rx == MAX_PHASE)
+++ tdm_c->phase_rx = 0;
+++
+++ tdm_c->phase_tx += 1;
+++ if (tdm_c->phase_tx == MAX_PHASE)
+++ tdm_c->phase_tx = 0;
+++
+++#ifdef CONFIG_TDM_HW_LB_TSA_SLIC
+++ {
+++ u32 temp_rx, temp_tx, phase_tx, phase_rx;
+++ int i;
+++ phase_rx = tdm_c->phase_rx;
+++ phase_tx = tdm_c->phase_tx;
+++ if (phase_rx == 0)
+++ phase_rx = MAX_PHASE;
+++ else
+++ phase_rx -= 1;
+++ if (phase_tx == 0)
+++ phase_tx = MAX_PHASE;
+++ else
+++ phase_tx -= 1;
+++ temp_rx = phase_rx * SAMPLE_DEPTH * ACTIVE_CH;
+++ temp_tx = phase_tx * SAMPLE_DEPTH * ACTIVE_CH;
+++
+++ /*check if loopback received data on TS0 is correct. */
+++ pr_debug("%s: check if loopback received data on TS0"
+++ " is correct\n", __FUNCTION__);
+++ pr_debug("%d,%d ", phase_rx, phase_tx);
+++ for (i = 0; i < 8; i++)
+++ pr_debug("%1d,%1d ",
+++ input_tdm_buffer[temp_rx + i],
+++ output_tdm_buffer[temp_tx + i]);
+++ pr_debug("\n");
+++ }
+++#endif
+++
+++ /* schedule BH */
+++ wake_up_interruptible(&tdm_c->wakeup_event);
+++ } else {
+++ if (tdm_c->tdm_icnt == STUTTER_INT_CNT) {
+++ txb = in_be32(&tdm_c->ucc_pram->tbptr) -
+++ in_be32(&tdm_c->ucc_pram->tbase);
+++ rxb = in_be32(&tdm_c->ucc_pram->rbptr) -
+++ in_be32(&tdm_c->ucc_pram->rbase);
+++ tdm_c->phase_tx = txb / sizeof(struct qe_bd);
+++ tdm_c->phase_rx = rxb / sizeof(struct qe_bd);
+++
+++#ifdef CONFIG_TDM_HW_LB_TSA_SLIC
+++ tdm_c->phase_tx = tdm_c->phase_rx;
+++#endif
+++
+++ /* signal "stuttering" period is over */
+++ tdm_c->tdm_flag = 1;
+++
+++ pr_debug("%s: stuttering period is over\n",
+++ __FUNCTION__);
+++
+++ if (in_be32(tdm_c->uf_private->p_ucce) &
+++ (UCC_TRANS_UCCE_TXE << 16)) {
+++ u32 cecr_subblock;
+++ out_be32(tdm_c->uf_private->p_ucce,
+++ (UCC_TRANS_UCCE_TXE << 16));
+++ pr_debug("%s: From tdm isr txe interrupt\n",
+++ __FUNCTION__);
+++
+++ cecr_subblock =
+++ ucc_fast_get_qe_cr_subblock(ucc);
+++ qe_issue_cmd(QE_RESTART_TX, cecr_subblock,
+++ (u8) QE_CR_PROTOCOL_UNSPECIFIED,
+++ 0);
+++ }
+++ }
+++ }
+++
+++ ucce = (in_be32(tdm_c->uf_private->p_ucce)
+++ & in_be32(tdm_c->uf_private->p_uccm));
+++
+++ out_be32(tdm_c->uf_private->p_ucce, ucce);
+++
+++ return IRQ_HANDLED;
+++}
+++
+++static int tdm_start(struct tdm_ctrl *tdm_c)
+++{
+++ if (request_irq(tdm_c->ut_info->uf_info.irq, tdm_isr,
+++ 0, "tdm", tdm_c)) {
+++ printk(KERN_ERR "%s: request_irq for tdm_isr failed\n",
+++ __FUNCTION__);
+++ return -ENODEV;
+++ }
+++
+++ ucc_fast_enable(tdm_c->uf_private, COMM_DIR_RX | COMM_DIR_TX);
+++
+++ pr_info("%s 16-bit linear pcm mode active with"
+++ " slots 0 & 2\n", __FUNCTION__);
+++
+++ dump_siram(tdm_c);
+++ dump_ucc(tdm_c);
+++
+++ setbits8(&(qe_immr->si1.siglmr1_h), (0x1 << tdm_c->tdm_port));
+++ pr_info("%s UCC based TDM enabled\n", __FUNCTION__);
+++
+++ return 0;
+++}
+++
+++static void tdm_stop(struct tdm_ctrl *tdm_c)
+++{
+++ u32 port, si;
+++ u32 ucc;
+++ u32 cecr_subblock;
+++
+++ port = tdm_c->tdm_port;
+++ si = tdm_c->si;
+++ ucc = tdm_c->ut_info->uf_info.ucc_num;
+++ cecr_subblock = ucc_fast_get_qe_cr_subblock(ucc);
+++
+++ qe_issue_cmd(QE_GRACEFUL_STOP_TX, cecr_subblock,
+++ (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
+++ qe_issue_cmd(QE_CLOSE_RX_BD, cecr_subblock,
+++ (u8) QE_CR_PROTOCOL_UNSPECIFIED, 0);
+++
+++ clrbits8(&qe_immr->si1.siglmr1_h, (0x1 << port));
+++ ucc_fast_disable(tdm_c->uf_private, COMM_DIR_RX);
+++ ucc_fast_disable(tdm_c->uf_private, COMM_DIR_TX);
+++ free_irq(tdm_c->ut_info->uf_info.irq, tdm_c);
+++}
+++
+++
+++static void config_tdm(struct tdm_ctrl *tdm_c)
+++{
+++ u32 i, j, k;
+++
+++ j = 0;
+++ k = 0;
+++
+++ /* Set Mask Bits */
+++ for (i = 0; i < ACTIVE_CH; i++) {
+++ tdm_c->tx_mask[k] |= (1 << j);
+++ tdm_c->rx_mask[k] |= (1 << j);
+++ j++;
+++ if (j >= 16) {
+++ j = 0;
+++ k++;
+++ }
+++ }
+++ /* physical number of slots in a frame */
+++ tdm_c->physical_num_ts = NUM_TS;
+++
+++ /* common receive and transmit pins */
+++ tdm_c->cfg_ctrl.com_pin = 1;
+++
+++ /* L1R/TSYNC active logic "1" */
+++ tdm_c->cfg_ctrl.fr_sync_level = 0;
+++
+++ /*
+++ * TX data on rising edge of clock
+++ * RX data on falling edge
+++ */
+++ tdm_c->cfg_ctrl.clk_edge = 0;
+++
+++ /* Frame sync sampled on falling edge */
+++ tdm_c->cfg_ctrl.fr_sync_edge = 0;
+++
+++ /* no bit delay */
+++ tdm_c->cfg_ctrl.rx_fr_sync_delay = 0;
+++
+++ /* no bit delay */
+++ tdm_c->cfg_ctrl.tx_fr_sync_delay = 0;
+++
+++#ifndef CONFIG_TDM_HW_LB_TSA_SLIC
+++ if (tdm_c->leg_slic) {
+++ /* Need 1 bit delay for Legrity SLIC */
+++ tdm_c->cfg_ctrl.rx_fr_sync_delay = 1;
+++ tdm_c->cfg_ctrl.tx_fr_sync_delay = 1;
+++ pr_info("%s Delay for Legerity!\n", __FUNCTION__);
+++ }
+++#endif
+++
+++ tdm_c->cfg_ctrl.active_num_ts = ACTIVE_CH;
+++}
+++
+++static void tdm_read(u32 client_id, short chn_id, short *pcm_buffer,
+++ short len)
+++{
+++ int i;
+++ u32 phase_rx;
+++ /* point to where to start for the current phase data processing */
+++ u32 temp_rx;
+++
+++ struct tdm_ctrl *tdm_c = tdm_ctrl[client_id];
+++
+++ u16 *input_tdm_buffer =
+++ (u16 *)tdm_c->tdm_input_data;
+++
+++ phase_rx = tdm_c->phase_rx;
+++ if (phase_rx == 0)
+++ phase_rx = MAX_PHASE;
+++ else
+++ phase_rx -= 1;
+++
+++ temp_rx = phase_rx * SAMPLE_DEPTH * EFF_ACTIVE_CH;
+++
+++#ifdef UCC_CACHE_SNOOPING_DISABLED
+++ flush_dcache_range((size_t) &input_tdm_buffer[temp_rx],
+++ (size_t) &input_tdm_buffer[temp_rx +
+++ SAMPLE_DEPTH * ACTIVE_CH]);
+++#endif
+++ for (i = 0; i < len; i++)
+++ pcm_buffer[i] =
+++ input_tdm_buffer[i * EFF_ACTIVE_CH + temp_rx + chn_id];
+++
+++}
+++
+++static void tdm_write(u32 client_id, short chn_id, short *pcm_buffer,
+++ short len)
+++{
+++ int i;
+++ int phase_tx;
+++ u32 txb;
+++ /* point to where to start for the current phase data processing */
+++ int temp_tx;
+++ struct tdm_ctrl *tdm_c = tdm_ctrl[client_id];
+++
+++ u16 *output_tdm_buffer;
+++ output_tdm_buffer = (u16 *)tdm_c->tdm_output_data;
+++ txb = in_be32(&tdm_c->ucc_pram->tbptr) -
+++ in_be32(&tdm_c->ucc_pram->tbase);
+++ phase_tx = txb / sizeof(struct qe_bd);
+++
+++ if (phase_tx == 0)
+++ phase_tx = MAX_PHASE;
+++ else
+++ phase_tx -= 1;
+++
+++ temp_tx = phase_tx * SAMPLE_DEPTH * EFF_ACTIVE_CH;
+++
+++ for (i = 0; i < len; i++)
+++ output_tdm_buffer[i * EFF_ACTIVE_CH + temp_tx + chn_id] =
+++ pcm_buffer[i];
+++
+++#ifdef UCC_CACHE_SNOOPING_DISABLED
+++ flush_dcache_range((size_t) &output_tdm_buffer[temp_tx],
+++ (size_t) &output_tdm_buffer[temp_tx + SAMPLE_DEPTH *
+++ ACTIVE_CH]);
+++#endif
+++}
+++
+++
+++static int tdm_register_client(struct tdm_client *tdm_client)
+++{
+++ u32 i;
+++ if (num_tdm_clients == num_tdm_devices) {
+++ printk(KERN_ERR "all TDM devices busy\n");
+++ return -EBUSY;
+++ }
+++
+++ for (i = 0; i < num_tdm_devices; i++) {
+++ if (!tdm_ctrl[i]->device_busy) {
+++ tdm_ctrl[i]->device_busy = 1;
+++ break;
+++ }
+++ }
+++ num_tdm_clients++;
+++ tdm_client->client_id = i;
+++ tdm_client->tdm_read = tdm_read;
+++ tdm_client->tdm_write = tdm_write;
+++ tdm_client->wakeup_event =
+++ &(tdm_ctrl[i]->wakeup_event);
+++ return 0;
+++}
+++EXPORT_SYMBOL_GPL(tdm_register_client);
+++
+++static int tdm_deregister_client(struct tdm_client *tdm_client)
+++{
+++ num_tdm_clients--;
+++ tdm_ctrl[tdm_client->client_id]->device_busy = 0;
+++ return 0;
+++}
+++EXPORT_SYMBOL_GPL(tdm_deregister_client);
+++
+++static int ucc_tdm_probe(struct of_device *ofdev,
+++ const struct of_device_id *match)
+++{
+++ struct device_node *np = ofdev->node;
+++ struct resource res;
+++ const unsigned int *prop;
+++ u32 ucc_num, device_num, err, ret = 0;
+++ struct device_node *np_tmp;
+++ dma_addr_t physaddr;
+++ void *tdm_buff;
+++ struct ucc_tdm_info *ut_info;
+++
+++ prop = of_get_property(np, "device-id", NULL);
+++ if (prop == NULL) {
+++ printk(KERN_ERR "ucc_tdm: device-id missing\n");
+++ return -ENODEV;
+++ }
+++
+++ ucc_num = *prop - 1;
+++ if ((ucc_num < 0) || (ucc_num > 7))
+++ return -ENODEV;
+++
+++ ut_info = &utdm_info[ucc_num];
+++ if (ut_info->ucc_busy) {
+++ printk(KERN_ERR "ucc_tdm: UCC in use by another TDM driver"
+++ "instance\n");
+++ return -EBUSY;
+++ }
+++ if (num_tdm_devices == MAX_NUM_TDM_DEVICES) {
+++ printk(KERN_ERR "ucc_tdm: All TDM devices already"
+++ " initialized\n");
+++ return -ENODEV;
+++ }
+++
+++ ut_info->ucc_busy = 1;
+++ tdm_ctrl[num_tdm_devices++] =
+++ kzalloc(sizeof(struct tdm_ctrl), GFP_KERNEL);
+++ if (!tdm_ctrl[num_tdm_devices - 1]) {
+++ printk(KERN_ERR "ucc_tdm: no memory to allocate for"
+++ " tdm control structure\n");
+++ num_tdm_devices--;
+++ return -ENOMEM;
+++ }
+++ device_num = num_tdm_devices - 1;
+++
+++ tdm_ctrl[device_num]->device = &ofdev->dev;
+++ tdm_ctrl[device_num]->ut_info = ut_info;
+++
+++ tdm_ctrl[device_num]->ut_info->uf_info.ucc_num = ucc_num;
+++
+++ prop = of_get_property(np, "fsl,tdm-num", NULL);
+++ if (prop == NULL) {
+++ ret = -EINVAL;
+++ goto get_property_error;
+++ }
+++
+++ tdm_ctrl[device_num]->tdm_port = *prop - 1;
+++
+++ if (tdm_ctrl[device_num]->tdm_port > 3) {
+++ ret = -EINVAL;
+++ goto get_property_error;
+++ }
+++
+++ prop = of_get_property(np, "fsl,si-num", NULL);
+++ if (prop == NULL) {
+++ ret = -EINVAL;
+++ goto get_property_error;
+++ }
+++
+++ tdm_ctrl[device_num]->si = *prop - 1;
+++
+++ tdm_ctrl[device_num]->ut_info->uf_info.tdm_tx_clk =
+++ of_get_property(np, "fsl,tdm-tx-clk", NULL);
+++ if (tdm_ctrl[device_num]->ut_info->uf_info.tdm_tx_clk == NULL) {
+++ ret = -EINVAL;
+++ goto get_property_error;
+++ }
+++
+++ tdm_ctrl[device_num]->ut_info->uf_info.tdm_rx_clk =
+++ of_get_property(np, "fsl,tdm-rx-clk", NULL);
+++ if (tdm_ctrl[device_num]->ut_info->uf_info.tdm_rx_clk == NULL) {
+++ ret = -EINVAL;
+++ goto get_property_error;
+++ }
+++
+++ tdm_ctrl[device_num]->ut_info->uf_info.tdm_tx_sync =
+++ of_get_property(np, "fsl,tdm-tx-sync", NULL);
+++ if (tdm_ctrl[device_num]->ut_info->uf_info.tdm_tx_sync == NULL) {
+++ ret = -EINVAL;
+++ goto get_property_error;
+++ }
+++
+++ tdm_ctrl[device_num]->ut_info->uf_info.tdm_rx_sync =
+++ of_get_property(np, "fsl,tdm-rx-sync", NULL);
+++ if (tdm_ctrl[device_num]->ut_info->uf_info.tdm_rx_sync == NULL) {
+++ ret = -EINVAL;
+++ goto get_property_error;
+++ }
+++
+++ tdm_ctrl[device_num]->ut_info->uf_info.irq =
+++ irq_of_parse_and_map(np, 0);
+++ err = of_address_to_resource(np, 0, &res);
+++ if (err) {
+++ ret = -EINVAL;
+++ goto get_property_error;
+++ }
+++ tdm_ctrl[device_num]->ut_info->uf_info.regs = res.start;
+++ tdm_ctrl[device_num]->uf_regs = of_iomap(np, 0);
+++
+++ np_tmp = NULL;
+++ np_tmp = of_find_compatible_node(np_tmp, "slic", "legerity-slic");
+++ if (np_tmp != NULL) {
+++ tdm_ctrl[device_num]->leg_slic = 1;
+++ of_node_put(np_tmp);
+++ } else
+++ tdm_ctrl[device_num]->leg_slic = 0;
+++
+++ config_tdm(tdm_ctrl[device_num]);
+++
+++ tdm_buff = dma_alloc_coherent(NULL, 2 * NR_BUFS * SAMPLE_DEPTH *
+++ tdm_ctrl[device_num]->cfg_ctrl.active_num_ts,
+++ &physaddr, GFP_KERNEL);
+++ if (!tdm_buff) {
+++ printk(KERN_ERR "ucc-tdm: could not allocate buffer"
+++ "descriptors\n");
+++ ret = -ENOMEM;
+++ goto alloc_error;
+++ }
+++
+++ tdm_ctrl[device_num]->tdm_input_data = tdm_buff;
+++ tdm_ctrl[device_num]->dma_input_addr = physaddr;
+++
+++ tdm_ctrl[device_num]->tdm_output_data = tdm_buff + NR_BUFS *
+++ SAMPLE_DEPTH * tdm_ctrl[device_num]->cfg_ctrl.active_num_ts;
+++ tdm_ctrl[device_num]->dma_output_addr = physaddr + NR_BUFS *
+++ SAMPLE_DEPTH * tdm_ctrl[device_num]->cfg_ctrl.active_num_ts;
+++
+++ init_waitqueue_head(&(tdm_ctrl[device_num]->wakeup_event));
+++
+++ ret = tdm_init(tdm_ctrl[device_num]);
+++ if (ret != 0)
+++ goto tdm_init_error;
+++
+++ ret = tdm_start(tdm_ctrl[device_num]);
+++ if (ret != 0)
+++ goto tdm_start_error;
+++
+++ dev_set_drvdata(&(ofdev->dev), tdm_ctrl[device_num]);
+++
+++ pr_info("%s UCC based tdm module installed\n", __FUNCTION__);
+++ return 0;
+++
+++tdm_start_error:
+++ tdm_deinit(tdm_ctrl[device_num]);
+++tdm_init_error:
+++ dma_free_coherent(NULL, 2 * NR_BUFS * SAMPLE_DEPTH *
+++ tdm_ctrl[device_num]->cfg_ctrl.active_num_ts,
+++ tdm_ctrl[device_num]->tdm_input_data,
+++ tdm_ctrl[device_num]->dma_input_addr);
+++
+++alloc_error:
+++ irq_dispose_mapping(tdm_ctrl[device_num]->ut_info->uf_info.irq);
+++ iounmap(tdm_ctrl[device_num]->uf_regs);
+++
+++get_property_error:
+++ num_tdm_devices--;
+++ kfree(tdm_ctrl[device_num]);
+++ ut_info->ucc_busy = 0;
+++ return ret;
+++}
+++
+++static int ucc_tdm_remove(struct of_device *ofdev)
+++{
+++ struct tdm_ctrl *tdm_c;
+++ struct ucc_tdm_info *ut_info;
+++ u32 ucc_num;
+++
+++ tdm_c = dev_get_drvdata(&(ofdev->dev));
+++ dev_set_drvdata(&(ofdev->dev), NULL);
+++ ucc_num = tdm_c->ut_info->uf_info.ucc_num;
+++ ut_info = &utdm_info[ucc_num];
+++ tdm_stop(tdm_c);
+++ tdm_deinit(tdm_c);
+++
+++ ucc_fast_free(tdm_c->uf_private);
+++
+++ dma_free_coherent(NULL, 2 * NR_BUFS * SAMPLE_DEPTH *
+++ tdm_c->cfg_ctrl.active_num_ts,
+++ tdm_c->tdm_input_data,
+++ tdm_c->dma_input_addr);
+++
+++ irq_dispose_mapping(tdm_c->ut_info->uf_info.irq);
+++ iounmap(tdm_c->uf_regs);
+++
+++ num_tdm_devices--;
+++ kfree(tdm_c);
+++
+++ ut_info->ucc_busy = 0;
+++
+++ pr_info("%s UCC based tdm module uninstalled\n", __FUNCTION__);
+++ return 0;
+++}
+++
+++const struct of_device_id ucc_tdm_match[] = {
+++ { .type = "tdm", .compatible = "fsl,ucc-tdm", },
+++ {},
+++};
+++
+++MODULE_DEVICE_TABLE(of, ucc_tdm_match);
+++
+++static struct of_platform_driver ucc_tdm_driver = {
+++ .name = DRV_NAME,
+++ .match_table = ucc_tdm_match,
+++ .probe = ucc_tdm_probe,
+++ .remove = ucc_tdm_remove,
+++ .driver = {
+++ .name = DRV_NAME,
+++ .owner = THIS_MODULE,
+++ },
+++};
+++
+++static int __init ucc_tdm_init(void)
+++{
+++ u32 i;
+++
+++ pr_info("ucc_tdm: " DRV_DESC "\n");
+++ for (i = 0; i < 8; i++)
+++ memcpy(&(utdm_info[i]), &utdm_primary_info,
+++ sizeof(utdm_primary_info));
+++
+++ return of_register_platform_driver(&ucc_tdm_driver);
+++}
+++
+++static void __exit ucc_tdm_exit(void)
+++{
+++ of_unregister_platform_driver(&ucc_tdm_driver);
+++}
+++
+++module_init(ucc_tdm_init);
+++module_exit(ucc_tdm_exit);
+++MODULE_AUTHOR("Freescale Semiconductor, Inc");
+++MODULE_DESCRIPTION(DRV_DESC);
+++MODULE_LICENSE("GPL");
++--- a/drivers/misc/Makefile
+++++ b/drivers/misc/Makefile
++@@ -9,6 +9,7 @@ obj-$(CONFIG_AD525X_DPOT_SPI) += ad525x_
++ obj-$(CONFIG_INTEL_MID_PTI) += pti.o
++ obj-$(CONFIG_ATMEL_SSC) += atmel-ssc.o
++ obj-$(CONFIG_ATMEL_TCLIB) += atmel_tclib.o
+++obj-$(CONFIG_UCC_TDM) += ucc_tdm.o
++ obj-$(CONFIG_BMP085) += bmp085.o
++ obj-$(CONFIG_BMP085_I2C) += bmp085-i2c.o
++ obj-$(CONFIG_BMP085_SPI) += bmp085-spi.o
++--- a/drivers/misc/Kconfig
+++++ b/drivers/misc/Kconfig
++@@ -201,6 +201,20 @@ config ATMEL_SSC
++
++ If unsure, say N.
++
+++config UCC_TDM
+++ tristate "Freescale UCC TDM Driver"
+++ depends on QUICC_ENGINE && UCC_FAST
+++ default n
+++ help
+++ The TDM driver is for UCC based TDM devices for example, TDM device on
+++ MPC832x RDB. Select it to run PowerVoIP on MPC832x RDB board.
+++ The TDM driver can interface with SLIC kind of devices to transmit
+++ and receive TDM samples. The TDM driver receives Time Division
+++ multiplexed samples(for different channels) from the SLIC device,
+++ demutiplexes them and sends them to the upper layers. At the transmit
+++ end the TDM drivers receives samples for different channels, it
+++ multiplexes them and sends them to the SLIC device.
+++
++ config ENCLOSURE_SERVICES
++ tristate "Enclosure Services"
++ default n
++--- a/arch/powerpc/include/asm/ucc_fast.h
+++++ b/arch/powerpc/include/asm/ucc_fast.h
++@@ -150,6 +150,10 @@ struct ucc_fast_info {
++ enum ucc_fast_rx_decoding_method renc;
++ enum ucc_fast_transparent_tcrc tcrc;
++ enum ucc_fast_sync_len synl;
+++ char *tdm_rx_clk;
+++ char *tdm_tx_clk;
+++ char *tdm_rx_sync;
+++ char *tdm_tx_sync;
++ };
++
++ struct ucc_fast_private {
++--- a/arch/powerpc/include/asm/qe.h
+++++ b/arch/powerpc/include/asm/qe.h
++@@ -670,6 +670,14 @@ struct ucc_slow_pram {
++ #define UCC_GETH_UCCE_RXF1 0x00000002
++ #define UCC_GETH_UCCE_RXF0 0x00000001
++
+++/* Transparent UCC Event Register (UCCE) */
+++#define UCC_TRANS_UCCE_GRA 0x0080
+++#define UCC_TRANS_UCCE_TXE 0x0010
+++#define UCC_TRANS_UCCE_RXF 0x0008
+++#define UCC_TRANS_UCCE_BSY 0x0004
+++#define UCC_TRANS_UCCE_TXB 0x0002
+++#define UCC_TRANS_UCCE_RXB 0x0001
+++
++ /* UCC Protocol Specific Mode Register (UPSMR), when used for UART */
++ #define UCC_UART_UPSMR_FLC 0x8000
++ #define UCC_UART_UPSMR_SL 0x4000
+diff --git a/feeds/targets/mpc83xx/patches-3.18/200-powerpc-add-rbppc-support.patch b/feeds/targets/mpc83xx/patches-3.18/200-powerpc-add-rbppc-support.patch
+new file mode 100644
+index 0000000..379f89c
+--- /dev/null
++++ b/feeds/targets/mpc83xx/patches-3.18/200-powerpc-add-rbppc-support.patch
+@@ -0,0 +1,1318 @@
++--- a/arch/powerpc/boot/Makefile
+++++ b/arch/powerpc/boot/Makefile
++@@ -98,7 +98,8 @@ src-plat-$(CONFIG_44x) += treeboot-ebony
++ src-plat-$(CONFIG_8xx) += cuboot-8xx.c fixed-head.S ep88xc.c redboot-8xx.c
++ src-plat-$(CONFIG_PPC_MPC52xx) += cuboot-52xx.c
++ src-plat-$(CONFIG_PPC_82xx) += cuboot-pq2.c fixed-head.S ep8248e.c cuboot-824x.c
++-src-plat-$(CONFIG_PPC_83xx) += cuboot-83xx.c fixed-head.S redboot-83xx.c
+++src-plat-$(CONFIG_PPC_83xx) += cuboot-83xx.c fixed-head.S redboot-83xx.c \
+++ rb600.c rb333.c
++ src-plat-$(CONFIG_FSL_SOC_BOOKE) += cuboot-85xx.c cuboot-85xx-cpm2.c
++ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \
++ cuboot-c2k.c gamecube-head.S \
++@@ -279,6 +280,8 @@ image-$(CONFIG_MPC834x_ITX) += cuImage.
++ image-$(CONFIG_MPC834x_MDS) += cuImage.mpc834x_mds
++ image-$(CONFIG_MPC836x_MDS) += cuImage.mpc836x_mds
++ image-$(CONFIG_ASP834x) += dtbImage.asp834x-redboot
+++image-$(CONFIG_RB_PPC) += dtbImage.rb600 \
+++ dtbImage.rb333
++
++ # Board ports in arch/powerpc/platform/85xx/Kconfig
++ image-$(CONFIG_MPC8540_ADS) += cuImage.mpc8540ads
++--- /dev/null
+++++ b/arch/powerpc/boot/dts/rb600.dts
++@@ -0,0 +1,283 @@
+++/*
+++ * RouterBOARD 600 series Device Tree Source
+++ *
+++ * Copyright 2009 Michael Guntsche <mike@it-loops.com>
+++ *
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License as published by the
+++ * Free Software Foundation; either version 2 of the License, or (at your
+++ * option) any later version.
+++ */
+++
+++/dts-v1/;
+++
+++/ {
+++ model = "RB600";
+++ compatible = "MPC83xx";
+++ #address-cells = <1>;
+++ #size-cells = <1>;
+++
+++ aliases {
+++ ethernet0 = &enet0;
+++ ethernet1 = &enet1;
+++ pci0 = &pci0;
+++ };
+++
+++ chosen {
+++ bootargs = "console=ttyS0,115200 board=mpc8323 rootfstype=squashfs,yaffs2,jffs2 root=/dev/mtdblock1 boot=1";
+++ linux,stdout-path = "/soc8343@e0000000/serial@4500";
+++ };
+++
+++ cpus {
+++ #address-cells = <1>;
+++ #size-cells = <0>;
+++
+++ PowerPC,8343E@0 {
+++ device_type = "cpu";
+++ reg = <0x0>;
+++ d-cache-line-size = <0x20>;
+++ i-cache-line-size = <0x20>;
+++ d-cache-size = <0x8000>;
+++ i-cache-size = <0x8000>;
+++ timebase-frequency = <0x0000000>; // filled by the bootwrapper from the firmware blob
+++ clock-frequency = <0x00000000>; // filled by the bootwrapper from the firmware blob
+++ };
+++ };
+++
+++ memory {
+++ device_type = "memory";
+++ reg = <0x0 0x0000000>; // filled by the bootwrapper from the firmware blob
+++ };
+++
+++ cf@f9200000 {
+++ lb-timings = <0x5dc 0x3e8 0x1194 0x5dc 0x2af8>;
+++ interrupt-at-level = <0x0>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <0x16 0x8>;
+++ lbc_extra_divider = <0x1>;
+++ reg = <0xf9200000 0x200000>;
+++ device_type = "rb,cf";
+++ };
+++
+++ cf@f9000000 {
+++ lb-timings = <0x5dc 0x3e8 0x1194 0x5dc 0x2af8>;
+++ interrupt-at-level = <0x0>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <0x14 0x8>;
+++ lbc_extra_divider = <0x1>;
+++ reg = <0xf9000000 0x200000>;
+++ device_type = "rb,cf";
+++ };
+++
+++ flash {
+++ reg = <0xff800000 0x20000>;
+++ };
+++
+++ nnand {
+++ reg = <0xf0000000 0x1000>;
+++ };
+++
+++ nand {
+++ ale = <&gpio 0x6>;
+++ cle = <&gpio 0x5>;
+++ nce = <&gpio 0x4>;
+++ rdy = <&gpio 0x3>;
+++ reg = <0xf8000000 0x1000>;
+++ device_type = "rb,nand";
+++ };
+++
+++ fancon {
+++ interrupt-parent = <&ipic>;
+++ interrupts = <0x17 0x8>;
+++ sense = <&gpio 0x7>;
+++ fan_on = <&gpio 0x9>;
+++ };
+++
+++ pci0: pci@e0008500 {
+++ device_type = "pci";
+++ compatible = "fsl,mpc8349-pci";
+++ reg = <0xe0008500 0x100 0xe0008300 0x8>;
+++ #address-cells = <3>;
+++ #size-cells = <2>;
+++ #interrupt-cells = <1>;
+++ ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x20000000 0x1000000 0x0 0x0 0xd0000000 0x0 0x4000000>;
+++ bus-range = <0x0 0x0>;
+++ interrupt-map = <
+++ 0x5800 0x0 0x0 0x1 &ipic 0x15 0x8
+++ 0x6000 0x0 0x0 0x1 &ipic 0x30 0x8
+++ 0x6000 0x0 0x0 0x2 &ipic 0x11 0x8
+++ 0x6800 0x0 0x0 0x1 &ipic 0x11 0x8
+++ 0x6800 0x0 0x0 0x2 &ipic 0x12 0x8
+++ 0x7000 0x0 0x0 0x1 &ipic 0x12 0x8
+++ 0x7000 0x0 0x0 0x2 &ipic 0x13 0x8
+++ 0x7800 0x0 0x0 0x1 &ipic 0x13 0x8
+++ 0x7800 0x0 0x0 0x2 &ipic 0x30 0x8
+++ 0x8000 0x0 0x0 0x1 &ipic 0x30 0x8
+++ 0x8000 0x0 0x0 0x2 &ipic 0x12 0x8
+++ 0x8000 0x0 0x0 0x3 &ipic 0x11 0x8
+++ 0x8000 0x0 0x0 0x4 &ipic 0x13 0x8
+++ 0xa000 0x0 0x0 0x1 &ipic 0x30 0x8
+++ 0xa000 0x0 0x0 0x2 &ipic 0x11 0x8
+++ 0xa000 0x0 0x0 0x3 &ipic 0x12 0x8
+++ 0xa000 0x0 0x0 0x4 &ipic 0x13 0x8
+++ 0xa800 0x0 0x0 0x1 &ipic 0x11 0x8
+++ 0xa800 0x0 0x0 0x2 &ipic 0x12 0x8
+++ 0xa800 0x0 0x0 0x3 &ipic 0x13 0x8
+++ 0xa800 0x0 0x0 0x4 &ipic 0x30 0x8>;
+++ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
+++ interrupt-parent = <&ipic>;
+++ };
+++
+++ soc8343@e0000000 {
+++ #address-cells = <1>;
+++ #size-cells = <1>;
+++ device_type = "soc";
+++ compatible = "simple-bus";
+++ ranges = <0x0 0xe0000000 0x100000>;
+++ reg = <0xe0000000 0x200>;
+++ bus-frequency = <0x1>;
+++
+++ led {
+++ user_led = <0x400 0x8>;
+++ };
+++
+++ beeper {
+++ reg = <0x500 0x100>;
+++ };
+++
+++ gpio: gpio@0 {
+++ reg = <0xc08 0x4>;
+++ device-id = <0x0>;
+++ compatible = "gpio";
+++ device_type = "gpio";
+++ };
+++
+++ dma@82a8 {
+++ #address-cells = <1>;
+++ #size-cells = <1>;
+++ compatible = "fsl,mpc8349-dma", "fsl,elo-dma";
+++ reg = <0x82a8 4>;
+++ ranges = <0 0x8100 0x1a8>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <71 8>;
+++ cell-index = <0>;
+++ dma-channel@0 {
+++ compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel";
+++ reg = <0 0x80>;
+++ cell-index = <0>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <71 8>;
+++ };
+++ dma-channel@80 {
+++ compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel";
+++ reg = <0x80 0x80>;
+++ cell-index = <1>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <71 8>;
+++ };
+++ dma-channel@100 {
+++ compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel";
+++ reg = <0x100 0x80>;
+++ cell-index = <2>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <71 8>;
+++ };
+++ dma-channel@180 {
+++ compatible = "fsl,mpc8349-dma-channel", "fsl,elo-dma-channel";
+++ reg = <0x180 0x28>;
+++ cell-index = <3>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <71 8>;
+++ };
+++ };
+++
+++ enet0: ethernet@25000 {
+++ #address-cells = <1>;
+++ #size-cells = <1>;
+++ cell-index = <0>;
+++ phy-handle = <&phy0>;
+++ tbi-handle = <&tbi0>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <0x23 0x8 0x24 0x8 0x25 0x8>;
+++ local-mac-address = [00 00 00 00 00 00];
+++ reg = <0x25000 0x1000>;
+++ ranges = <0x0 0x25000 0x1000>;
+++ compatible = "gianfar";
+++ model = "TSEC";
+++ device_type = "network";
+++
+++ mdio@520 {
+++ #address-cells = <1>;
+++ #size-cells = <0>;
+++ compatible = "fsl,gianfar-tbi";
+++ reg = <0x520 0x20>;
+++
+++ tbi0: tbi-phy@11 {
+++ reg = <0x11>;
+++ device_type = "tbi-phy";
+++ };
+++ };
+++ };
+++
+++ enet1: ethernet@24000 {
+++ #address-cells = <1>;
+++ #size-cells = <1>;
+++ cell-index = <1>;
+++ phy-handle = <&phy1>;
+++ tbi-handle = <&tbi1>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <0x20 0x8 0x21 0x8 0x22 0x8>;
+++ local-mac-address = [00 00 00 00 00 00];
+++ reg = <0x24000 0x1000>;
+++ ranges = <0x0 0x24000 0x1000>;
+++ compatible = "gianfar";
+++ model = "TSEC";
+++ device_type = "network";
+++
+++ mdio@520 {
+++ #size-cells = <0x0>;
+++ #address-cells = <0x1>;
+++ reg = <0x520 0x20>;
+++ compatible = "fsl,gianfar-mdio";
+++
+++ phy0: ethernet-phy@0 {
+++ device_type = "ethernet-phy";
+++ reg = <0x0>;
+++ };
+++
+++ phy1: ethernet-phy@1 {
+++ device_type = "ethernet-phy";
+++ reg = <0x1>;
+++ };
+++
+++ tbi1: tbi-phy@11 {
+++ reg = <0x11>;
+++ device_type = "tbi-phy";
+++ };
+++ };
+++ };
+++
+++ ipic: pic@700 {
+++ interrupt-controller;
+++ #address-cells = <0>;
+++ #interrupt-cells = <2>;
+++ reg = <0x700 0x100>;
+++ device_type = "ipic";
+++ };
+++
+++ serial@4500 {
+++ interrupt-parent = <&ipic>;
+++ interrupts = <0x9 0x8>;
+++ clock-frequency = <0xfe4f840>;
+++ reg = <0x4500 0x100>;
+++ compatible = "ns16550";
+++ device_type = "serial";
+++ };
+++
+++ wdt@200 {
+++ reg = <0x200 0x100>;
+++ compatible = "mpc83xx_wdt";
+++ device_type = "watchdog";
+++ };
+++ };
+++};
++--- /dev/null
+++++ b/arch/powerpc/boot/rb600.c
++@@ -0,0 +1,70 @@
+++/*
+++ * The RouterBOARD platform -- for booting RB600(A) RouterBOARDs.
+++ *
+++ * Author: Michael Guntsche <mike@it-loops.com>
+++ *
+++ * Copyright (c) 2009 Michael Guntsche
+++ *
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License version 2 as published
+++ * by the Free Software Foundation.
+++ */
+++
+++#include "ops.h"
+++#include "types.h"
+++#include "io.h"
+++#include "stdio.h"
+++#include <libfdt.h>
+++
+++BSS_STACK(4*1024);
+++
+++u64 memsize64;
+++const void *fw_dtb;
+++
+++static void rb600_fixups(void)
+++{
+++ const u32 *reg, *timebase, *clock;
+++ int node, size;
+++
+++ dt_fixup_memory(0, memsize64);
+++
+++ /* Set the MAC addresses. */
+++ node = fdt_path_offset(fw_dtb, "/soc8343@e0000000/ethernet@24000");
+++ reg = fdt_getprop(fw_dtb, node, "mac-address", &size);
+++ dt_fixup_mac_address_by_alias("ethernet1", (const u8 *)reg);
+++
+++ node = fdt_path_offset(fw_dtb, "/soc8343@e0000000/ethernet@25000");
+++ reg = fdt_getprop(fw_dtb, node, "mac-address", &size);
+++ dt_fixup_mac_address_by_alias("ethernet0", (const u8 *)reg);
+++
+++ /* Find the CPU timebase and clock frequencies. */
+++ node = fdt_node_offset_by_prop_value(fw_dtb, -1, "device_type", "cpu", sizeof("cpu"));
+++ timebase = fdt_getprop(fw_dtb, node, "timebase-frequency", &size);
+++ clock = fdt_getprop(fw_dtb, node, "clock-frequency", &size);
+++ dt_fixup_cpu_clocks(*clock, *timebase, 0);
+++
+++}
+++
+++void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+++ unsigned long r6, unsigned long r7)
+++{
+++ const u32 *reg;
+++ int node, size;
+++
+++ fw_dtb = (const void *)r3;
+++
+++ /* Find the memory range. */
+++ node = fdt_node_offset_by_prop_value(fw_dtb, -1, "device_type", "memory", sizeof("memory"));
+++ reg = fdt_getprop(fw_dtb, node, "reg", &size);
+++ memsize64 = reg[1];
+++
+++ /* Now we have the memory size; initialize the heap. */
+++ simple_alloc_init(_end, memsize64 - (unsigned long)_end, 32, 64);
+++
+++ /* Prepare the device tree and find the console. */
+++ fdt_init(_dtb_start);
+++ serial_console_init();
+++
+++ /* Remaining fixups... */
+++ platform_ops.fixups = rb600_fixups;
+++}
++--- a/arch/powerpc/boot/wrapper
+++++ b/arch/powerpc/boot/wrapper
++@@ -238,7 +238,7 @@ ps3)
++ make_space=n
++ pie=
++ ;;
++-ep88xc|ep405|ep8248e)
+++ep88xc|ep405|ep8248e|rb600|rb333)
++ platformo="$object/fixed-head.o $object/$platform.o"
++ binary=y
++ ;;
++--- a/arch/powerpc/platforms/83xx/Kconfig
+++++ b/arch/powerpc/platforms/83xx/Kconfig
++@@ -38,6 +38,15 @@ config MPC832x_RDB
++ help
++ This option enables support for the MPC8323 RDB board.
++
+++config RB_PPC
+++ bool "MikroTik RouterBOARD 333/600 series"
+++ select DEFAULT_UIMAGE
+++ select QUICC_ENGINE
+++ select PPC_MPC832x
+++ select PPC_MPC834x
+++ help
+++ This option enables support for MikroTik RouterBOARD 333/600 series boards.
+++
++ config MPC834x_MDS
++ bool "Freescale MPC834x MDS"
++ select DEFAULT_UIMAGE
++--- /dev/null
+++++ b/arch/powerpc/boot/dts/rb333.dts
++@@ -0,0 +1,426 @@
+++
+++/*
+++ * RouterBOARD 333 series Device Tree Source
+++ *
+++ * Copyright 2010 Alexandros C. Couloumbis <alex@ozo.com>
+++ * Copyright 2009 Michael Guntsche <mike@it-loops.com>
+++ *
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License as published by the
+++ * Free Software Foundation; either version 2 of the License, or (at your
+++ * option) any later version.
+++ *
+++ * Warning (reg_format): "reg" property in /qe@e0100000/muram@10000/data-only@0 has invalid length (8 bytes) (#address-cells == 2, #size-cells == 1)
+++ * Warning (ranges_format): "ranges" property in /qe@e0100000/muram@10000 has invalid length (12 bytes) (parent #address-cells == 1, child #address-cells == 2, #size-cells == 1)
+++ * Warning (avoid_default_addr_size): Relying on default #address-cells value for /qe@e0100000/muram@10000/data-only@0
+++ * Warning (avoid_default_addr_size): Relying on default #size-cells value for /qe@e0100000/muram@10000/data-only@0
+++ * Warning (obsolete_chosen_interrupt_controller): /chosen has obsolete "interrupt-controller" property
+++ *
+++ */
+++
+++
+++/dts-v1/;
+++
+++/ {
+++ model = "RB333";
+++ compatible = "MPC83xx";
+++ #size-cells = <1>;
+++ #address-cells = <1>;
+++
+++ aliases {
+++ ethernet0 = &enet0;
+++ ethernet1 = &enet1;
+++ ethernet2 = &enet2;
+++ pci0 = &pci0;
+++ };
+++
+++ chosen {
+++ bootargs = "console=ttyS0,115200 board=mpc8323 rootfstype=squashfs,yaffs2,jffs2 root=/dev/mtdblock1 boot=1";
+++ // linux,platform = <0x8062>;
+++ // linux,initrd = <0x488000 0x0>;
+++ linux,stdout-path = "/soc8323@e0000000/serial@4500";
+++ // interrupt-controller = <&ipic>;
+++ };
+++
+++ cpus {
+++ #cpus = <1>;
+++ #size-cells = <0>;
+++ #address-cells = <1>;
+++
+++ PowerPC,8323E@0 {
+++ device_type = "cpu";
+++ reg = <0x0>;
+++ i-cache-size = <0x4000>;
+++ d-cache-size = <0x4000>;
+++ i-cache-line-size = <0x20>;
+++ d-cache-line-size = <0x20>;
+++ // clock-frequency = <0x13de3650>;
+++ // timebase-frequency = <0x1fc9f08>;
+++ timebase-frequency = <0x0000000>; // filled by the bootwrapper from the firmware blob
+++ clock-frequency = <0x00000000>; // filled by the bootwrapper from the firmware blob
+++ 32-bit;
+++ };
+++ };
+++
+++ memory {
+++ device_type = "memory";
+++ reg = <0x0 0x4000000>;
+++ // reg = <0x0 0x0000000>; // filled by the bootwrapper from the firmware blob
+++ };
+++
+++ flash {
+++ reg = <0xfe000000 0x20000>;
+++ };
+++
+++ nand {
+++ ale = <&gpio2 0x3>;
+++ cle = <&gpio2 0x2>;
+++ nce = <&gpio2 0x1>;
+++ rdy = <&gpio2 0x0>;
+++ reg = <0xf8000000 0x1000>;
+++ device_type = "rb,nand";
+++ };
+++
+++ nnand {
+++ reg = <0xf0000000 0x1000>;
+++ };
+++
+++ voltage {
+++ voltage_gpio = <&gpio3 0x11>;
+++ };
+++
+++ fancon {
+++ interrupt-parent = <&ipic>;
+++ interrupts = <0x14 0x8>;
+++ fan_on = <&gpio0 0x10>;
+++ };
+++
+++ soc8323@e0000000 {
+++ #address-cells = <1>;
+++ #size-cells = <1>;
+++ device_type = "soc";
+++ compatible = "simple-bus";
+++ ranges = <0x0 0xe0000000 0x00100000>;
+++ reg = <0xe0000000 0x00000200>;
+++ bus-frequency = <1>;
+++
+++ wdt@200 {
+++ device_type = "watchdog";
+++ compatible = "mpc83xx_wdt";
+++ reg = <0x200 0x100>;
+++ };
+++
+++ ipic:pic@700 {
+++ interrupt-controller;
+++ #address-cells = <0>;
+++ #interrupt-cells = <2>;
+++ reg = <0x700 0x100>;
+++ device_type = "ipic";
+++ };
+++
+++ par_io@1400 {
+++ num-ports = <4>;
+++ device_type = "par_io";
+++ reg = <0x1400 0x100>;
+++
+++ ucc2pio: ucc_pin@02 {
+++ pio-map = <
+++ /* port pin dir open_drain assignment has_irq */
+++ 3 4 3 0 2 0
+++ 3 5 1 0 2 0
+++ 0 18 1 0 1 0
+++ 0 19 1 0 1 0
+++ 0 20 1 0 1 0
+++ 0 21 1 0 1 0
+++ 0 30 1 0 1 0
+++ 3 6 2 0 1 0
+++ 0 29 2 0 1 0
+++ 0 31 2 0 1 0
+++ 0 22 2 0 1 0
+++ 0 23 2 0 1 0
+++ 0 24 2 0 1 0
+++ 0 25 2 0 1 0
+++ 0 28 2 0 1 0
+++ 0 26 2 0 1 0
+++ 3 31 2 0 1 0>;
+++ };
+++
+++ ucc3pio: ucc_pin@03 {
+++ pio-map = <
+++ /* port pin dir open_drain assignment has_irq */
+++ 1 0 1 0 1 0
+++ 1 1 1 0 1 0
+++ 1 2 1 0 1 0
+++ 1 3 1 0 1 0
+++ 1 12 1 0 1 0
+++ 3 24 2 0 1 0
+++ 1 11 2 0 1 0
+++ 1 13 2 0 1 0
+++ 1 4 2 0 1 0
+++ 1 5 2 0 1 0
+++ 1 6 2 0 1 0
+++ 1 7 2 0 1 0
+++ 1 10 2 0 1 0
+++ 1 8 2 0 1 0
+++ 3 29 2 0 1 0>;
+++ };
+++
+++ ucc4pio: ucc_pin@04 {
+++ pio-map = <
+++ /* port pin dir open_drain assignment has_irq */
+++ 1 18 1 0 1 0
+++ 1 19 1 0 1 0
+++ 1 20 1 0 1 0
+++ 1 21 1 0 1 0
+++ 1 30 1 0 1 0
+++ 3 20 2 0 1 0
+++ 1 30 2 0 1 0
+++ 1 31 2 0 1 0
+++ 1 22 2 0 1 0
+++ 1 23 2 0 1 0
+++ 1 24 2 0 1 0
+++ 1 25 2 0 1 0
+++ 1 28 2 0 1 0
+++ 1 26 2 0 1 0
+++ 3 21 2 0 1 0>;
+++ };
+++ };
+++
+++ serial0: serial@4500 {
+++ cell-index = <0>;
+++ device_type = "serial";
+++ compatible = "fsl,ns16550", "ns16550";
+++ reg = <0x4500 0x100>;
+++ clock-frequency = <0x7f27c20>;
+++ interrupts = <9 0x8>;
+++ interrupt-parent = <&ipic>;
+++ };
+++
+++ dma@82a8 {
+++ #address-cells = <1>;
+++ #size-cells = <1>;
+++ compatible = "fsl,mpc8323-dma", "fsl,elo-dma";
+++ reg = <0x82a8 4>;
+++ ranges = <0 0x8100 0x1a8>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <71 8>;
+++ cell-index = <0>;
+++ dma-channel@0 {
+++ compatible = "fsl,mpc8323-dma-channel", "fsl,elo-dma-channel";
+++ reg = <0 0x80>;
+++ cell-index = <0>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <71 8>;
+++ };
+++ dma-channel@80 {
+++ compatible = "fsl,mpc8323-dma-channel", "fsl,elo-dma-channel";
+++ reg = <0x80 0x80>;
+++ cell-index = <1>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <71 8>;
+++ };
+++ dma-channel@100 {
+++ compatible = "fsl,mpc8323-dma-channel", "fsl,elo-dma-channel";
+++ reg = <0x100 0x80>;
+++ cell-index = <2>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <71 8>;
+++ };
+++ dma-channel@180 {
+++ compatible = "fsl,mpc8323-dma-channel", "fsl,elo-dma-channel";
+++ reg = <0x180 0x28>;
+++ cell-index = <3>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <71 8>;
+++ };
+++ };
+++
+++ beeper {
+++ gpio = <&gpio3 0x12>;
+++ reg = <0x500 0x100>;
+++ interrupt-parent = <&ipic>;
+++ interrupts = <0x48 0x8>;
+++ };
+++
+++ gpio3: gpio@3 {
+++ reg = <0x144c 0x4>;
+++ device-id = <0x3>;
+++ compatible = "qe_gpio";
+++ device_type = "gpio";
+++ };
+++
+++ gpio2: gpio@2 {
+++ reg = <0x1434 0x4>;
+++ device-id = <0x2>;
+++ compatible = "qe_gpio";
+++ device_type = "gpio";
+++ };
+++
+++ gpio0: gpio@0 {
+++ reg = <0x1404 0x4>;
+++ device-id = <0x0>;
+++ compatible = "qe_gpio";
+++ device_type = "gpio";
+++ };
+++ };
+++
+++ pci0: pci@e0008500 {
+++ device_type = "pci";
+++ // compatible = "83xx";
+++ compatible = "fsl,mpc8349-pci";
+++ reg = <0xe0008500 0x100 0xe0008300 0x8>;
+++ #address-cells = <3>;
+++ #size-cells = <2>;
+++ #interrupt-cells = <1>;
+++ // clock-frequency = <0>;
+++ ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x20000000 0x1000000 0x0 0x0 0xd0000000 0x0 0x4000000>;
+++ bus-range = <0x0 0x0>;
+++ interrupt-map = <
+++ /* IDSEL 0x10 AD16 miniPCI slot 0 */
+++ 0x8000 0x0 0x0 0x1 &ipic 0x11 0x8
+++ 0x8000 0x0 0x0 0x2 &ipic 0x12 0x8
+++
+++ /* IDSEL 0x11 AD17 miniPCI slot 1 */
+++ 0x8800 0x0 0x0 0x1 &ipic 0x12 0x8
+++ 0x8800 0x0 0x0 0x2 &ipic 0x13 0x8
+++
+++ /* IDSEL 0x12 AD18 miniPCI slot 2 */
+++ 0x9000 0x0 0x0 0x1 &ipic 0x13 0x8
+++ 0x9000 0x0 0x0 0x2 &ipic 0x11 0x8>;
+++
+++ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
+++ interrupt-parent = <&ipic>;
+++ // interrupts = <66 0x8>;
+++ };
+++
+++ qe@e0100000 {
+++ reg = <0xe0100000 0x480>;
+++ ranges = <0x0 0xe0100000 0x100000>;
+++ model = "QE";
+++ device_type = "qe";
+++ compatible = "fsl,qe";
+++ #size-cells = <1>;
+++ #address-cells = <1>;
+++ brg-frequency = <0>;
+++ bus-frequency = <0>;
+++ // bus-frequency = <198000000>;
+++ fsl,qe-num-riscs = <1>;
+++ fsl,qe-num-snums = <28>;
+++
+++ qeic: qeic@80 {
+++ interrupt-controller;
+++ compatible = "fsl,qe-ic";
+++ big-endian;
+++ built-in;
+++ reg = <0x80 0x80>;
+++ #interrupt-cells = <1>;
+++ #address-cells = <0>;
+++ device_type = "qeic";
+++ interrupts = <0x20 0x8 0x21 0x8>;
+++ interrupt-parent = <&ipic>;
+++ };
+++
+++ mdio@2120 {
+++ compatible = "ucc_geth_phy";
+++ device_type = "mdio";
+++ reg = <0x3120 0x18>;
+++ #size-cells = <0>;
+++ #address-cells = <1>;
+++
+++ phy3: ethernet-phy@03 {
+++ // interface = <0x3>;
+++ device_type = "ethernet-phy";
+++ reg = <0x3>;
+++ };
+++
+++ phy2: ethernet-phy@02 {
+++ // interface = <0x3>;
+++ device_type = "ethernet-phy";
+++ reg = <0x2>;
+++ };
+++
+++ phy1: ethernet-phy@01 {
+++ // interface = <0x3>;
+++ device_type = "ethernet-phy";
+++ reg = <0x1>;
+++ };
+++ };
+++
+++ enet0: ucc@2200 {
+++ tx-clock = <0x1a>;
+++ rx-clock = <0x1f>;
+++ local-mac-address = [00 00 00 00 00 00];
+++ interrupt-parent = <&qeic>;
+++ interrupts = <0x22>;
+++ reg = <0x2200 0x200>;
+++ device-id = <0x3>;
+++ model = "UCC";
+++ compatible = "ucc_geth";
+++ device_type = "network";
+++ phy-handle = <&phy2>;
+++ pio-handle = <&ucc3pio>;
+++ };
+++
+++ enet1: ucc@3200 {
+++ tx-clock = <0x22>;
+++ rx-clock = <0x20>;
+++ local-mac-address = [00 00 00 00 00 00];
+++ interrupt-parent = <&qeic>;
+++ interrupts = <0x23>;
+++ reg = <0x3200 0x200>;
+++ device-id = <0x4>;
+++ model = "UCC";
+++ compatible = "ucc_geth";
+++ device_type = "network";
+++ phy-handle = <&phy3>;
+++ pio-handle = <&ucc4pio>;
+++ };
+++
+++ enet2: ucc@3000 {
+++ tx-clock = <0x18>;
+++ rx-clock = <0x17>;
+++ local-mac-address = [00 00 00 00 00 00];
+++ interrupt-parent = <&qeic>;
+++ interrupts = <0x21>;
+++ reg = <0x3000 0x200>;
+++ device-id = <0x2>;
+++ model = "UCC";
+++ compatible = "ucc_geth";
+++ device_type = "network";
+++ phy-handle = <&phy1>;
+++ pio-handle = <&ucc2pio>;
+++ };
+++
+++ spi@500 {
+++ mode = "cpu";
+++ interrupt-parent = <&qeic>;
+++ interrupts = <0x1>;
+++ reg = <0x500 0x40>;
+++ compatible = "fsl,spi";
+++ device_type = "spi";
+++ };
+++
+++ spi@4c0 {
+++ mode = "cpu";
+++ interrupt-parent = <&qeic>;
+++ interrupts = <0x2>;
+++ reg = <0x4c0 0x40>;
+++ compatible = "fsl,spi";
+++ device_type = "spi";
+++ };
+++
+++ muram@10000 {
+++ #address-cells = <1>;
+++ #size-cells = <1>;
+++ compatible = "fsl,qe-muram", "fsl,cpm-muram";
+++ ranges = <0x0 0x10000 0x4000>;
+++ device_type = "muram";
+++
+++ data-only@0 {
+++ compatible = "fsl,qe-muram-data",
+++ "fsl,cpm-muram-data";
+++ reg = <0x0 0x4000>;
+++ };
+++ };
+++ };
+++};
++--- /dev/null
+++++ b/arch/powerpc/boot/rb333.c
++@@ -0,0 +1,86 @@
+++/*
+++ * The RouterBOARD platform -- for booting RB333 RouterBOARDs.
+++ *
+++ * Author: Alexandros C. Couloumbis <alex@ozo.com>
+++ * Author: Michael Guntsche <mike@it-loops.com>
+++ *
+++ * Copyright (c) 2010 Alexandros C. Couloumbis
+++ * Copyright (c) 2009 Michael Guntsche
+++ *
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License version 2 as published
+++ * by the Free Software Foundation.
+++ */
+++
+++#include "ops.h"
+++#include "types.h"
+++#include "io.h"
+++#include "stdio.h"
+++#include <libfdt.h>
+++
+++BSS_STACK(4*1024);
+++
+++u64 memsize64;
+++const void *fw_dtb;
+++
+++static void rb333_fixups(void)
+++{
+++ const u32 *reg, *timebase, *clock;
+++ int node, size;
+++ void *chosen;
+++ const char* bootargs;
+++
+++ dt_fixup_memory(0, memsize64);
+++
+++ /* Find the CPU timebase and clock frequencies. */
+++ node = fdt_node_offset_by_prop_value(fw_dtb, -1, "device_type", "cpu", sizeof("cpu"));
+++ timebase = fdt_getprop(fw_dtb, node, "timebase-frequency", &size);
+++ clock = fdt_getprop(fw_dtb, node, "clock-frequency", &size);
+++ dt_fixup_cpu_clocks(*clock, *timebase, 0);
+++
+++ /* Set the MAC addresses. */
+++ node = fdt_path_offset(fw_dtb, "/qe@e0100000/ucc@2200");
+++ reg = fdt_getprop(fw_dtb, node, "mac-address", &size);
+++ dt_fixup_mac_address_by_alias("ethernet0", (const u8 *)reg);
+++
+++ node = fdt_path_offset(fw_dtb, "/qe@e0100000/ucc@3200");
+++ reg = fdt_getprop(fw_dtb, node, "mac-address", &size);
+++ dt_fixup_mac_address_by_alias("ethernet1", (const u8 *)reg);
+++
+++ node = fdt_path_offset(fw_dtb, "/qe@e0100000/ucc@3000");
+++ reg = fdt_getprop(fw_dtb, node, "mac-address", &size);
+++ dt_fixup_mac_address_by_alias("ethernet2", (const u8 *)reg);
+++
+++ /* Fixup chosen
+++ * The bootloader reads the kernelparm segment and adds the content to
+++ * bootargs. This is needed to specify root and other boot flags.
+++ */
+++ chosen = finddevice("/chosen");
+++ node = fdt_path_offset(fw_dtb, "/chosen");
+++ bootargs = fdt_getprop(fw_dtb, node, "bootargs", &size);
+++ setprop_str(chosen, "bootargs", bootargs);
+++}
+++
+++void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+++ unsigned long r6, unsigned long r7)
+++{
+++ const u32 *reg;
+++ int node, size;
+++
+++ fw_dtb = (const void *)r3;
+++
+++ /* Find the memory range. */
+++ node = fdt_node_offset_by_prop_value(fw_dtb, -1, "device_type", "memory", sizeof("memory"));
+++ reg = fdt_getprop(fw_dtb, node, "reg", &size);
+++ memsize64 = reg[1];
+++
+++ /* Now we have the memory size; initialize the heap. */
+++ simple_alloc_init(_end, memsize64 - (unsigned long)_end, 32, 64);
+++
+++ /* Prepare the device tree and find the console. */
+++ fdt_init(_dtb_start);
+++ serial_console_init();
+++
+++ /* Remaining fixups... */
+++ platform_ops.fixups = rb333_fixups;
+++}
++--- /dev/null
+++++ b/arch/powerpc/platforms/83xx/rbppc.c
++@@ -0,0 +1,388 @@
+++/*
+++ * Copyright (C) 2010 Alexandros C. Couloumbis <alex@ozo.com>
+++ * Copyright (C) 2008-2009 Noah Fontes <nfontes@transtruct.org>
+++ * Copyright (C) 2009 Michael Guntsche <mike@it-loops.com>
+++ * Copyright (C) Mikrotik 2007
+++ *
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License as published by the
+++ * Free Software Foundation; either version 2 of the License, or (at your
+++ * option) any later version.
+++ */
+++
+++#include <linux/delay.h>
+++#include <linux/root_dev.h>
+++#include <linux/initrd.h>
+++#include <linux/interrupt.h>
+++#include <linux/of_platform.h>
+++#include <linux/of_device.h>
+++#include <linux/of_platform.h>
+++#include <linux/pci.h>
+++#include <asm/time.h>
+++#include <asm/ipic.h>
+++#include <asm/udbg.h>
+++#include <asm/qe.h>
+++#include <asm/qe_ic.h>
+++#include <sysdev/fsl_soc.h>
+++#include <sysdev/fsl_pci.h>
+++#include "mpc83xx.h"
+++
+++#define SYSCTL 0x100
+++#define SICRL 0x014
+++
+++#define GTCFR2 0x04
+++#define GTMDR4 0x22
+++#define GTRFR4 0x26
+++#define GTCNR4 0x2e
+++#define GTVER4 0x36
+++#define GTPSR4 0x3e
+++
+++#define GTCFR_BCM 0x40
+++#define GTCFR_STP4 0x20
+++#define GTCFR_RST4 0x10
+++#define GTCFR_STP3 0x02
+++#define GTCFR_RST3 0x01
+++
+++#define GTMDR_ORI 0x10
+++#define GTMDR_FRR 0x08
+++#define GTMDR_ICLK16 0x04
+++
+++extern int par_io_data_set(u8 port, u8 pin, u8 val);
+++extern int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain,
+++ int assignment, int has_irq);
+++
+++static unsigned timer_freq;
+++static void *gtm;
+++
+++static int beeper_irq;
+++static unsigned beeper_gpio_pin[2];
+++
+++int rb333model = 0;
+++
+++irqreturn_t rbppc_timer_irq(int irq, void *ptr)
+++{
+++ static int toggle = 0;
+++
+++ par_io_data_set(beeper_gpio_pin[0], beeper_gpio_pin[1], toggle);
+++ toggle = !toggle;
+++
+++ /* ack interrupt */
+++ out_be16(gtm + GTVER4, 3);
+++
+++ return IRQ_HANDLED;
+++}
+++
+++void rbppc_beep(unsigned freq)
+++{
+++ unsigned gtmdr;
+++
+++ if (freq > 5000) freq = 5000;
+++
+++ if (!gtm)
+++ return;
+++ if (!freq) {
+++ out_8(gtm + GTCFR2, GTCFR_STP4 | GTCFR_STP3);
+++ return;
+++ }
+++
+++ out_8(gtm + GTCFR2, GTCFR_RST4 | GTCFR_STP3);
+++ out_be16(gtm + GTPSR4, 255);
+++ gtmdr = GTMDR_FRR | GTMDR_ICLK16;
+++ if (beeper_irq != NO_IRQ) gtmdr |= GTMDR_ORI;
+++ out_be16(gtm + GTMDR4, gtmdr);
+++ out_be16(gtm + GTVER4, 3);
+++
+++ out_be16(gtm + GTRFR4, timer_freq / 16 / 256 / freq / 2);
+++ out_be16(gtm + GTCNR4, 0);
+++}
+++EXPORT_SYMBOL(rbppc_beep);
+++
+++static void __init rbppc_setup_arch(void)
+++{
+++ struct device_node *np;
+++
+++ np = of_find_node_by_type(NULL, "cpu");
+++ if (np) {
+++ const unsigned *fp = of_get_property(np, "clock-frequency", NULL);
+++ loops_per_jiffy = fp ? *fp / HZ : 0;
+++
+++ of_node_put(np);
+++ }
+++
+++ np = of_find_node_by_name(NULL, "serial");
+++ if (np) {
+++ timer_freq =
+++ *(unsigned *) of_get_property(np, "clock-frequency", NULL);
+++ of_node_put(np);
+++ }
+++
+++#ifdef CONFIG_PCI
+++ np = of_find_node_by_type(NULL, "pci");
+++ if (np) {
+++ mpc83xx_add_bridge(np);
+++ }
+++#endif
+++
+++if (rb333model) {
+++
+++#ifdef CONFIG_QUICC_ENGINE
+++ qe_reset();
+++
+++ if ((np = of_find_node_by_name(NULL, "par_io")) != NULL) {
+++ par_io_init(np);
+++ of_node_put(np);
+++
+++ for (np = NULL; (np = of_find_node_by_name(np, "ucc")) != NULL;)
+++ par_io_of_config(np);
+++ }
+++#endif
+++
+++} /* RB333 */
+++
+++}
+++
+++void __init rbppc_init_IRQ(void)
+++{
+++ struct device_node *np;
+++
+++ np = of_find_node_by_type(NULL, "ipic");
+++ if (np) {
+++ ipic_init(np, 0);
+++ ipic_set_default_priority();
+++ of_node_put(np);
+++ }
+++
+++if (rb333model) {
+++
+++#ifdef CONFIG_QUICC_ENGINE
+++ np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic");
+++ if (!np) {
+++ np = of_find_node_by_type(NULL, "qeic");
+++ if (!np)
+++ return;
+++ }
+++ qe_ic_init(np, 0, qe_ic_cascade_low_ipic, qe_ic_cascade_high_ipic);
+++ of_node_put(np);
+++#endif /* CONFIG_QUICC_ENGINE */
+++
+++} /* RB333 */
+++
+++}
+++
+++static int __init rbppc_probe(void)
+++{
+++ char *model;
+++
+++ model = of_get_flat_dt_prop(of_get_flat_dt_root(), "model", NULL);
+++
+++ if (!model)
+++ return 0;
+++
+++ if (strcmp(model, "RB333") == 0) {
+++ rb333model = 1;
+++ return 1;
+++ }
+++
+++ if (strcmp(model, "RB600") == 0)
+++ return 1;
+++
+++ return 0;
+++}
+++
+++static void __init rbppc_beeper_init(struct device_node *beeper)
+++{
+++ struct resource res;
+++ struct device_node *gpio;
+++ const unsigned *pin;
+++ const unsigned *gpio_id;
+++
+++ if (of_address_to_resource(beeper, 0, &res)) {
+++ printk(KERN_ERR "rbppc_beeper_init(%s): Beeper error: No region specified\n", beeper->full_name);
+++ return;
+++ }
+++
+++ pin = of_get_property(beeper, "gpio", NULL);
+++ if (pin) {
+++ gpio = of_find_node_by_phandle(pin[0]);
+++
+++ if (!gpio) {
+++ printk(KERN_ERR "rbppc_beeper_init(%s): Beeper error: GPIO handle %x not found\n", beeper->full_name, pin[0]);
+++ return;
+++ }
+++
+++ gpio_id = of_get_property(gpio, "device-id", NULL);
+++ if (!gpio_id) {
+++ printk(KERN_ERR "rbppc_beeper_init(%s): Beeper error: No device-id specified in GPIO\n", beeper->full_name);
+++ return;
+++ }
+++
+++ beeper_gpio_pin[0] = *gpio_id;
+++ beeper_gpio_pin[1] = pin[1];
+++
+++ par_io_config_pin(*gpio_id, pin[1], 1, 0, 0, 0);
+++ } else {
+++ void *sysctl;
+++
+++ sysctl = ioremap_nocache(get_immrbase() + SYSCTL, 0x100);
+++ out_be32(sysctl + SICRL,
+++ in_be32(sysctl + SICRL) | (1 << (31 - 19)));
+++ iounmap(sysctl);
+++ }
+++
+++ gtm = ioremap_nocache(res.start, res.end - res.start + 1);
+++
+++ beeper_irq = irq_of_parse_and_map(beeper, 0);
+++ if (beeper_irq != NO_IRQ) {
+++ int e = request_irq(beeper_irq, rbppc_timer_irq, 0, "beeper", NULL);
+++ if (e) {
+++ printk(KERN_ERR "rbppc_beeper_init(%s): Request of beeper irq failed!\n", beeper->full_name);
+++ }
+++ }
+++}
+++
+++#define SBIT(x) (0x80000000 >> (x))
+++#define DBIT(x, y) ((y) << (32 - (((x % 16) + 1) * 2)))
+++
+++#define GPIO_DIR_RB333(x) ((x) + (0x1408 >> 2))
+++#define GPIO_DATA_RB333(x) ((x) + (0x1404 >> 2))
+++
+++#define SICRL_RB600(x) ((x) + (0x114 >> 2))
+++#define GPIO_DIR_RB600(x) ((x) + (0xc00 >> 2))
+++#define GPIO_DATA_RB600(x) ((x) + (0xc08 >> 2))
+++
+++static void rbppc_restart(char *cmd)
+++{
+++ __be32 __iomem *reg;
+++ unsigned rb_model;
+++ struct device_node *root;
+++ unsigned int size;
+++
+++ root = of_find_node_by_path("/");
+++ if (root) {
+++ const char *prop = (char *) of_get_property(root, "model", &size);
+++ rb_model = prop[sizeof("RB") - 1] - '0';
+++ of_node_put(root);
+++ switch (rb_model) {
+++ case 3:
+++ reg = ioremap(get_immrbase(), 0x2000);
+++ local_irq_disable();
+++ out_be32(GPIO_DIR_RB333(reg),
+++ (in_be32(GPIO_DIR_RB333(reg)) & ~DBIT(4, 3)) | DBIT(4, 1));
+++ out_be32(GPIO_DATA_RB333(reg), in_be32(GPIO_DATA_RB333(reg)) & ~SBIT(4));
+++ break;
+++ case 6:
+++ reg = ioremap(get_immrbase(), 0x1000);
+++ local_irq_disable();
+++ out_be32(SICRL_RB600(reg), in_be32(SICRL_RB600(reg)) & ~0x00800000);
+++ out_be32(GPIO_DIR_RB600(reg), in_be32(GPIO_DIR_RB600(reg)) | SBIT(2));
+++ out_be32(GPIO_DATA_RB600(reg), in_be32(GPIO_DATA_RB600(reg)) & ~SBIT(2));
+++ break;
+++ default:
+++ mpc83xx_restart(cmd);
+++ break;
+++ }
+++ }
+++ else mpc83xx_restart(cmd);
+++
+++ for (;;) ;
+++}
+++
+++static void rbppc_halt(void)
+++{
+++ while (1);
+++}
+++
+++static struct of_device_id rbppc_ids[] = {
+++ { .type = "soc", },
+++ { .compatible = "soc", },
+++ { .compatible = "simple-bus", },
+++ { .type = "qe", },
+++ { .compatible = "fsl,qe", },
+++ { .compatible = "gianfar", },
+++ { },
+++};
+++
+++static int __init rbppc_declare_of_platform_devices(void)
+++{
+++ struct device_node *np;
+++ unsigned idx;
+++
+++ of_platform_bus_probe(NULL, rbppc_ids, NULL);
+++
+++ np = of_find_node_by_type(NULL, "mdio");
+++ if (np) {
+++ unsigned len;
+++ unsigned *res;
+++ const unsigned *eres;
+++ struct device_node *ep;
+++
+++ ep = of_find_compatible_node(NULL, "network", "ucc_geth");
+++ if (ep) {
+++ eres = of_get_property(ep, "reg", &len);
+++ res = (unsigned *) of_get_property(np, "reg", &len);
+++ if (res && eres) {
+++ res[0] = eres[0] + 0x120;
+++ }
+++ }
+++ }
+++
+++ np = of_find_node_by_name(NULL, "nand");
+++ if (np) {
+++ of_platform_device_create(np, "nand", NULL);
+++ }
+++
+++ idx = 0;
+++ for_each_node_by_type(np, "rb,cf") {
+++ char dev_name[12];
+++ snprintf(dev_name, sizeof(dev_name), "cf.%u", idx);
+++ of_platform_device_create(np, dev_name, NULL);
+++ ++idx;
+++ }
+++
+++ np = of_find_node_by_name(NULL, "beeper");
+++ if (np) {
+++ rbppc_beeper_init(np);
+++ }
+++
+++ return 0;
+++}
+++machine_device_initcall(rb600, rbppc_declare_of_platform_devices);
+++
+++define_machine(rb600) {
+++ .name = "MikroTik RouterBOARD 333/600 series",
+++ .probe = rbppc_probe,
+++ .setup_arch = rbppc_setup_arch,
+++ .init_IRQ = rbppc_init_IRQ,
+++ .get_irq = ipic_get_irq,
+++ .restart = rbppc_restart,
+++ .halt = rbppc_halt,
+++ .time_init = mpc83xx_time_init,
+++ .calibrate_decr = generic_calibrate_decr,
+++};
+++
+++static void fixup_pcibridge(struct pci_dev *dev)
+++{
+++ if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
+++ /* let the kernel itself set right memory windows */
+++ pci_write_config_word(dev, PCI_MEMORY_BASE, 0);
+++ pci_write_config_word(dev, PCI_MEMORY_LIMIT, 0);
+++ pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, 0);
+++ pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, 0);
+++ pci_write_config_byte(dev, PCI_IO_BASE, 0);
+++ pci_write_config_byte(dev, PCI_IO_LIMIT, 4 << 4);
+++
+++ pci_write_config_byte(
+++ dev, PCI_COMMAND,
+++ PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | PCI_COMMAND_IO);
+++ pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 8);
+++ }
+++}
+++
+++
+++static void fixup_rb604(struct pci_dev *dev)
+++{
+++ pci_write_config_byte(dev, 0xC0, 0x01);
+++}
+++
+++DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, fixup_pcibridge)
+++DECLARE_PCI_FIXUP_HEADER(0x3388, 0x0021, fixup_rb604)
+diff --git a/feeds/targets/mpc83xx/patches-3.18/201-powerpc-add-rb_iomap.patch b/feeds/targets/mpc83xx/patches-3.18/201-powerpc-add-rb_iomap.patch
+new file mode 100644
+index 0000000..d0d3524
+--- /dev/null
++++ b/feeds/targets/mpc83xx/patches-3.18/201-powerpc-add-rb_iomap.patch
+@@ -0,0 +1,263 @@
++--- a/arch/powerpc/kernel/Makefile
+++++ b/arch/powerpc/kernel/Makefile
++@@ -119,9 +119,11 @@ obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o
++ obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
++ obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o
++
+++ifneq ($(CONFIG_RB_IOMAP),y)
++ ifneq ($(CONFIG_PPC_INDIRECT_PIO),y)
++ obj-y += iomap.o
++ endif
+++endif
++
++ obj64-$(CONFIG_PPC_TRANSACTIONAL_MEM) += tm.o
++
++--- a/arch/powerpc/platforms/83xx/Makefile
+++++ b/arch/powerpc/platforms/83xx/Makefile
++@@ -7,6 +7,7 @@ obj-$(CONFIG_MCU_MPC8349EMITX) += mcu_mp
++ obj-$(CONFIG_MPC830x_RDB) += mpc830x_rdb.o
++ obj-$(CONFIG_MPC831x_RDB) += mpc831x_rdb.o
++ obj-$(CONFIG_MPC832x_RDB) += mpc832x_rdb.o
+++obj-$(CONFIG_RB_PPC) += rbppc.o
++ obj-$(CONFIG_MPC834x_MDS) += mpc834x_mds.o
++ obj-$(CONFIG_MPC834x_ITX) += mpc834x_itx.o
++ obj-$(CONFIG_MPC836x_MDS) += mpc836x_mds.o
++--- a/arch/powerpc/platforms/Kconfig
+++++ b/arch/powerpc/platforms/Kconfig
++@@ -211,6 +211,10 @@ config PPC_INDIRECT_MMIO
++ config PPC_IO_WORKAROUNDS
++ bool
++
+++config RB_IOMAP
+++ bool
+++ default y if RB_PPC
+++
++ source "drivers/cpufreq/Kconfig"
++
++ menu "CPUIdle driver"
++--- a/arch/powerpc/sysdev/Makefile
+++++ b/arch/powerpc/sysdev/Makefile
++@@ -73,3 +73,6 @@ subdir-ccflags-$(CONFIG_PPC_WERROR) := -
++ obj-$(CONFIG_PPC_XICS) += xics/
++
++ obj-$(CONFIG_GE_FPGA) += ge/
+++
+++obj-$(CONFIG_RB_IOMAP) += rb_iomap.o
+++
++--- /dev/null
+++++ b/arch/powerpc/sysdev/rb_iomap.c
++@@ -0,0 +1,204 @@
+++#include <linux/init.h>
+++#include <linux/pci.h>
+++#include <linux/mm.h>
+++#include <asm/io.h>
+++
+++#define LOCALBUS_START 0x40000000
+++#define LOCALBUS_MASK 0x007fffff
+++#define LOCALBUS_REGMASK 0x001fffff
+++
+++static void __iomem *localbus_base;
+++
+++static inline int is_localbus(void __iomem *addr)
+++{
+++ return ((unsigned) addr & ~LOCALBUS_MASK) == LOCALBUS_START;
+++}
+++
+++static inline unsigned localbus_regoff(unsigned reg) {
+++ return (reg << 16) | (((reg ^ 8) & 8) << 17);
+++}
+++
+++static inline void __iomem *localbus_addr(void __iomem *addr)
+++{
+++ return localbus_base
+++ + ((unsigned) addr & LOCALBUS_MASK & ~LOCALBUS_REGMASK)
+++ + localbus_regoff((unsigned) addr & LOCALBUS_REGMASK);
+++}
+++
+++unsigned int ioread8(void __iomem *addr)
+++{
+++ if (is_localbus(addr))
+++ return in_be16(localbus_addr(addr)) >> 8;
+++ return readb(addr);
+++}
+++EXPORT_SYMBOL(ioread8);
+++
+++unsigned int ioread16(void __iomem *addr)
+++{
+++ if (is_localbus(addr))
+++ return le16_to_cpu(in_be16(localbus_addr(addr)));
+++ return readw(addr);
+++}
+++EXPORT_SYMBOL(ioread16);
+++
+++unsigned int ioread16be(void __iomem *addr)
+++{
+++ return in_be16(addr);
+++}
+++EXPORT_SYMBOL(ioread16be);
+++
+++unsigned int ioread32(void __iomem *addr)
+++{
+++ return readl(addr);
+++}
+++EXPORT_SYMBOL(ioread32);
+++
+++unsigned int ioread32be(void __iomem *addr)
+++{
+++ return in_be32(addr);
+++}
+++EXPORT_SYMBOL(ioread32be);
+++
+++void iowrite8(u8 val, void __iomem *addr)
+++{
+++ if (is_localbus(addr))
+++ out_be16(localbus_addr(addr), ((u16) val) << 8);
+++ else
+++ writeb(val, addr);
+++}
+++EXPORT_SYMBOL(iowrite8);
+++
+++void iowrite16(u16 val, void __iomem *addr)
+++{
+++ if (is_localbus(addr))
+++ out_be16(localbus_addr(addr), cpu_to_le16(val));
+++ else
+++ writew(val, addr);
+++}
+++EXPORT_SYMBOL(iowrite16);
+++
+++void iowrite16be(u16 val, void __iomem *addr)
+++{
+++ out_be16(addr, val);
+++}
+++EXPORT_SYMBOL(iowrite16be);
+++
+++void iowrite32(u32 val, void __iomem *addr)
+++{
+++ writel(val, addr);
+++}
+++EXPORT_SYMBOL(iowrite32);
+++
+++void iowrite32be(u32 val, void __iomem *addr)
+++{
+++ out_be32(addr, val);
+++}
+++EXPORT_SYMBOL(iowrite32be);
+++
+++void ioread8_rep(void __iomem *addr, void *dst, unsigned long count)
+++{
+++ if (is_localbus(addr)) {
+++ unsigned i;
+++ void *laddr = localbus_addr(addr);
+++ u8 *buf = dst;
+++
+++ for (i = 0; i < count; ++i) {
+++ *buf++ = in_be16(laddr) >> 8;
+++ }
+++ } else {
+++ _insb((u8 __iomem *) addr, dst, count);
+++ }
+++}
+++EXPORT_SYMBOL(ioread8_rep);
+++
+++void ioread16_rep(void __iomem *addr, void *dst, unsigned long count)
+++{
+++ if (is_localbus(addr)) {
+++ unsigned i;
+++ void *laddr = localbus_addr(addr);
+++ u16 *buf = dst;
+++
+++ for (i = 0; i < count; ++i) {
+++ *buf++ = in_be16(laddr);
+++ }
+++ } else {
+++ _insw_ns((u16 __iomem *) addr, dst, count);
+++ }
+++}
+++EXPORT_SYMBOL(ioread16_rep);
+++
+++void ioread32_rep(void __iomem *addr, void *dst, unsigned long count)
+++{
+++ _insl_ns((u32 __iomem *) addr, dst, count);
+++}
+++EXPORT_SYMBOL(ioread32_rep);
+++
+++void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count)
+++{
+++ if (is_localbus(addr)) {
+++ unsigned i;
+++ void *laddr = localbus_addr(addr);
+++ const u8 *buf = src;
+++
+++ for (i = 0; i < count; ++i) {
+++ out_be16(laddr, ((u16) *buf++) << 8);
+++ }
+++ } else {
+++ _outsb((u8 __iomem *) addr, src, count);
+++ }
+++}
+++EXPORT_SYMBOL(iowrite8_rep);
+++
+++void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count)
+++{
+++ if (is_localbus(addr)) {
+++ unsigned i;
+++ void *laddr = localbus_addr(addr);
+++ const u16 *buf = src;
+++
+++ for (i = 0; i < count; ++i) {
+++ out_be16(laddr, *buf++);
+++ }
+++ } else {
+++ _outsw_ns((u16 __iomem *) addr, src, count);
+++ }
+++}
+++EXPORT_SYMBOL(iowrite16_rep);
+++
+++void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count)
+++{
+++ _outsl_ns((u32 __iomem *) addr, src, count);
+++}
+++EXPORT_SYMBOL(iowrite32_rep);
+++
+++void __iomem *ioport_map(unsigned long port, unsigned int len)
+++{
+++ return (void __iomem *) (port + _IO_BASE);
+++}
+++EXPORT_SYMBOL(ioport_unmap);
+++
+++void ioport_unmap(void __iomem *addr)
+++{
+++ /* Nothing to do */
+++}
+++EXPORT_SYMBOL(ioport_map);
+++
+++void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
+++{
+++ /* Nothing to do */
+++}
+++EXPORT_SYMBOL(pci_iounmap);
+++
+++void __iomem *localbus_map(unsigned long addr, unsigned int len)
+++{
+++ if (!localbus_base)
+++ localbus_base = ioremap(addr & ~LOCALBUS_MASK,
+++ LOCALBUS_MASK + 1);
+++ return (void *) (LOCALBUS_START + (addr & LOCALBUS_MASK));
+++}
+++EXPORT_SYMBOL(localbus_map);
+++
+++void localbus_unmap(void __iomem *addr)
+++{
+++}
+++EXPORT_SYMBOL(localbus_unmap);
++--- a/arch/powerpc/platforms/83xx/Kconfig
+++++ b/arch/powerpc/platforms/83xx/Kconfig
++@@ -44,6 +44,7 @@ config RB_PPC
++ select QUICC_ENGINE
++ select PPC_MPC832x
++ select PPC_MPC834x
+++ select RB_IOMAP
++ help
++ This option enables support for MikroTik RouterBOARD 333/600 series boards.
++
+diff --git a/feeds/targets/mpc83xx/patches-3.18/202-ata-add-pata_rbppc_cf-driver.patch b/feeds/targets/mpc83xx/patches-3.18/202-ata-add-pata_rbppc_cf-driver.patch
+new file mode 100644
+index 0000000..b83c9c5
+--- /dev/null
++++ b/feeds/targets/mpc83xx/patches-3.18/202-ata-add-pata_rbppc_cf-driver.patch
+@@ -0,0 +1,729 @@
++--- a/drivers/ata/Kconfig
+++++ b/drivers/ata/Kconfig
++@@ -1019,5 +1019,12 @@ config PATA_LEGACY
++
++ If unsure, say N.
++
+++config PATA_RB_PPC
+++ tristate "MikroTik RB600 PATA support"
+++ depends on RB_PPC
+++ help
+++ This option enables support for PATA devices on MikroTik RouterBOARD
+++ 600 series boards.
+++
++ endif # ATA_SFF
++ endif # ATA
++--- a/drivers/ata/Makefile
+++++ b/drivers/ata/Makefile
++@@ -99,6 +99,7 @@ obj-$(CONFIG_PATA_PALMLD) += pata_palmld
++ obj-$(CONFIG_PATA_PLATFORM) += pata_platform.o
++ obj-$(CONFIG_PATA_OF_PLATFORM) += pata_of_platform.o
++ obj-$(CONFIG_PATA_RB532) += pata_rb532_cf.o
+++obj-$(CONFIG_PATA_RB_PPC) += pata_rbppc_cf.o
++ obj-$(CONFIG_PATA_RZ1000) += pata_rz1000.o
++ obj-$(CONFIG_PATA_SAMSUNG_CF) += pata_samsung_cf.o
++
++--- /dev/null
+++++ b/drivers/ata/pata_rbppc_cf.c
++@@ -0,0 +1,701 @@
+++/*
+++ * Copyright (C) 2008-2009 Noah Fontes <nfontes@transtruct.org>
+++ * Copyright (C) Mikrotik 2007
+++ *
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License as published by the
+++ * Free Software Foundation; either version 2 of the License, or (at your
+++ * option) any later version.
+++ */
+++
+++#include <linux/kernel.h>
+++#include <linux/module.h>
+++#include <linux/init.h>
+++#include <scsi/scsi_host.h>
+++#include <linux/libata.h>
+++#include <linux/of_platform.h>
+++#include <linux/ata_platform.h>
+++#include <linux/slab.h>
+++#include <linux/of_address.h>
+++#include <linux/of_irq.h>
+++
+++#define DEBUG_UPM 0
+++
+++#define DRV_NAME "pata_rbppc_cf"
+++#define DRV_VERSION "0.0.2"
+++
+++#define DEV2SEL_OFFSET 0x00100000
+++
+++#define IMMR_LBCFG_OFFSET 0x00005000
+++#define IMMR_LBCFG_SIZE 0x00001000
+++
+++#define LOCAL_BUS_MCMR 0x00000078
+++#define MxMR_OP_MASK 0x30000000
+++#define MxMR_OP_NORMAL 0x00000000
+++#define MxMR_OP_WRITE 0x10000000
+++#define MxMR_OP_READ 0x20000000
+++#define MxMR_OP_RUN 0x30000000
+++#define MxMR_LUPWAIT_LOW 0x08000000
+++#define MxMR_LUPWAIT_HIGH 0x00000000
+++#define MxMR_LUPWAIT_ENABLE 0x00040000
+++#define MxMR_RLF_MASK 0x0003c000
+++#define MxMR_RLF_SHIFT 14
+++#define MxMR_WLF_MASK 0x00003c00
+++#define MxMR_WLF_SHIFT 10
+++#define MxMR_MAD_MASK 0x0000003f
+++#define LOCAL_BUS_MDR 0x00000088
+++#define LOCAL_BUS_LCRR 0x000000D4
+++#define LCRR_CLKDIV_MASK 0x0000000f
+++
+++#define LOOP_SIZE 4
+++
+++#define UPM_READ_SINGLE_OFFSET 0x00
+++#define UPM_WRITE_SINGLE_OFFSET 0x18
+++#define UPM_DATA_SIZE 0x40
+++
+++#define LBT_CPUIN_MIN 0
+++#define LBT_CPUOUT_MIN 1
+++#define LBT_CPUOUT_MAX 2
+++#define LBT_EXTDEL_MIN 3
+++#define LBT_EXTDEL_MAX 4
+++#define LBT_SIZE 5
+++
+++/* UPM machine configuration bits */
+++#define N_BASE 0x00f00000
+++#define N_CS 0xf0000000
+++#define N_CS_H1 0xc0000000
+++#define N_CS_H2 0x30000000
+++#define N_WE 0x0f000000
+++#define N_WE_H1 0x0c000000
+++#define N_WE_H2 0x03000000
+++#define N_OE 0x00030000
+++#define N_OE_H1 0x00020000
+++#define N_OE_H2 0x00010000
+++#define WAEN 0x00001000
+++#define REDO_2 0x00000100
+++#define REDO_3 0x00000200
+++#define REDO_4 0x00000300
+++#define LOOP 0x00000080
+++#define NA 0x00000008
+++#define UTA 0x00000004
+++#define LAST 0x00000001
+++
+++#define REDO_VAL(mult) (REDO_2 * ((mult) - 1))
+++#define REDO_MAX_MULT 4
+++
+++#define READ_BASE (N_BASE | N_WE)
+++#define WRITE_BASE (N_BASE | N_OE)
+++#define EMPTY (N_BASE | N_CS | N_OE | N_WE | LAST)
+++
+++#define EOF_UPM_SETTINGS 0
+++#define ANOTHER_TIMING 1
+++
+++#define OA_CPUIN_MIN 0x01
+++#define OA_CPUOUT_MAX 0x02
+++#define OD_CPUOUT_MIN 0x04
+++#define OA_CPUOUT_DELTA 0x06
+++#define OA_EXTDEL_MAX 0x08
+++#define OD_EXTDEL_MIN 0x10
+++#define OA_EXTDEL_DELTA 0x18
+++#define O_MIN_CYCLE_TIME 0x20
+++#define O_MINUS_PREV 0x40
+++#define O_HALF_CYCLE 0x80
+++
+++extern void __iomem *localbus_map(unsigned long addr, unsigned int len);
+++extern void localbus_unmap(void __iomem *addr);
+++
+++struct rbppc_cf_info {
+++ unsigned lbcfg_addr;
+++ unsigned clk_time_ps;
+++ int cur_mode;
+++ u32 lb_timings[LBT_SIZE];
+++};
+++static struct rbppc_cf_info *rbinfo = NULL;
+++
+++struct upm_setting {
+++ unsigned value;
+++ unsigned ns[7];
+++ unsigned clk_minus;
+++ unsigned group_size;
+++ unsigned options;
+++};
+++
+++static const struct upm_setting cfUpmReadSingle[] = {
+++ { READ_BASE | N_OE,
+++ /* t1 - ADDR setup time */
+++ { 70, 50, 30, 30, 25, 15, 10 }, 0, 0, (OA_CPUOUT_DELTA |
+++ OA_EXTDEL_MAX) },
+++ { READ_BASE | N_OE_H1,
+++ { 0, 0, 0, 0, 0, 0, 0 }, 0, 0, O_HALF_CYCLE },
+++ { READ_BASE,
+++ /* t2 - OE0 time */
+++ { 290, 290, 290, 80, 70, 65, 55 }, 0, 2, (OA_CPUOUT_MAX |
+++ OA_CPUIN_MIN) },
+++ { READ_BASE | WAEN,
+++ { 1, 1, 1, 1, 1, 0, 0 }, 0, 0, 0 },
+++ { READ_BASE | UTA,
+++ { 1, 1, 1, 1, 1, 1, 1 }, 0, 0, 0 },
+++ { READ_BASE | N_OE,
+++ /* t9 - ADDR hold time */
+++ { 20, 15, 10, 10, 10, 10, 10 }, 0, 0, (OA_CPUOUT_DELTA |
+++ OD_EXTDEL_MIN) },
+++ { READ_BASE | N_OE | N_CS_H2,
+++ { 0, 0, 0, 0, 0, 0, 0 }, 0, 0, O_HALF_CYCLE },
+++ { READ_BASE | N_OE | N_CS,
+++ /* t6Z -IORD data tristate */
+++ { 30, 30, 30, 30, 30, 20, 20 }, 1, 1, O_MINUS_PREV },
+++ { ANOTHER_TIMING,
+++ /* t2i -IORD recovery time */
+++ { 0, 0, 0, 70, 25, 25, 20 }, 2, 0, 0 },
+++ { ANOTHER_TIMING,
+++ /* CS 0 -> 1 MAX */
+++ { 0, 0, 0, 0, 0, 0, 0 }, 1, 0, (OA_CPUOUT_DELTA |
+++ OA_EXTDEL_MAX) },
+++ { READ_BASE | N_OE | N_CS | LAST,
+++ { 1, 1, 1, 1, 1, 1, 1 }, 0, 0, 0 },
+++ { EOF_UPM_SETTINGS,
+++ /* min total cycle time - includes turnaround and ALE cycle */
+++ { 600, 383, 240, 180, 120, 100, 80 }, 2, 0, O_MIN_CYCLE_TIME },
+++};
+++
+++static const struct upm_setting cfUpmWriteSingle[] = {
+++ { WRITE_BASE | N_WE,
+++ /* t1 - ADDR setup time */
+++ { 70, 50, 30, 30, 25, 15, 10 }, 0, 0, (OA_CPUOUT_DELTA |
+++ OA_EXTDEL_MAX) },
+++ { WRITE_BASE | N_WE_H1,
+++ { 0, 0, 0, 0, 0, 0, 0 }, 0, 0, O_HALF_CYCLE },
+++ { WRITE_BASE,
+++ /* t2 - WE0 time */
+++ { 290, 290, 290, 80, 70, 65, 55 }, 0, 1, OA_CPUOUT_DELTA },
+++ { WRITE_BASE | WAEN,
+++ { 1, 1, 1, 1, 1, 0, 0 }, 0, 0, 0 },
+++ { WRITE_BASE | N_WE,
+++ /* t9 - ADDR hold time */
+++ { 20, 15, 10, 10, 10, 10, 10 }, 0, 0, (OA_CPUOUT_DELTA |
+++ OD_EXTDEL_MIN) },
+++ { WRITE_BASE | N_WE | N_CS_H2,
+++ { 0, 0, 0, 0, 0, 0, 0 }, 0, 0, O_HALF_CYCLE },
+++ { WRITE_BASE | N_WE | N_CS,
+++ /* t4 - DATA hold time */
+++ { 30, 20, 15, 10, 10, 10, 10 }, 0, 1, O_MINUS_PREV },
+++ { ANOTHER_TIMING,
+++ /* t2i -IOWR recovery time */
+++ { 0, 0, 0, 70, 25, 25, 20 }, 1, 0, 0 },
+++ { ANOTHER_TIMING,
+++ /* CS 0 -> 1 MAX */
+++ { 0, 0, 0, 0, 0, 0, 0 }, 0, 0, (OA_CPUOUT_DELTA |
+++ OA_EXTDEL_MAX) },
+++ { WRITE_BASE | N_WE | N_CS | UTA | LAST,
+++ { 1, 1, 1, 1, 1, 1, 1 }, 0, 0, 0 },
+++ /* min total cycle time - includes ALE cycle */
+++ { EOF_UPM_SETTINGS,
+++ { 600, 383, 240, 180, 120, 100, 80 }, 1, 0, O_MIN_CYCLE_TIME },
+++};
+++
+++static u8 rbppc_cf_check_status(struct ata_port *ap) {
+++ u8 val = ioread8(ap->ioaddr.status_addr);
+++ if (val == 0xF9)
+++ val = 0x7F;
+++ return val;
+++}
+++
+++static u8 rbppc_cf_check_altstatus(struct ata_port *ap) {
+++ u8 val = ioread8(ap->ioaddr.altstatus_addr);
+++ if (val == 0xF9)
+++ val = 0x7F;
+++ return val;
+++}
+++
+++static void rbppc_cf_dummy_noret(struct ata_port *ap) { }
+++static int rbppc_cf_dummy_ret0(struct ata_port *ap) { return 0; }
+++
+++static int ps2clk(int ps, unsigned clk_time_ps) {
+++ int psMaxOver;
+++ if (ps <= 0) return 0;
+++
+++ /* round down if <= 2% over clk border, but no more than 1/4 clk cycle */
+++ psMaxOver = ps * 2 / 100;
+++ if (4 * psMaxOver > clk_time_ps) {
+++ psMaxOver = clk_time_ps / 4;
+++ }
+++ return (ps + clk_time_ps - 1 - psMaxOver) / clk_time_ps;
+++}
+++
+++static int upm_gen_ps_table(const struct upm_setting *upm,
+++ int mode, struct rbppc_cf_info *info,
+++ int *psFinal) {
+++ int uidx;
+++ int lastUpmValIdx = 0;
+++ int group_start_idx = -1;
+++ int group_left_num = -1;
+++ int clk_time_ps = info->clk_time_ps;
+++
+++ for (uidx = 0; upm[uidx].value != EOF_UPM_SETTINGS; ++uidx) {
+++ const struct upm_setting *us = upm + uidx;
+++ unsigned opt = us->options;
+++ int ps = us->ns[mode] * 1000 - us->clk_minus * clk_time_ps;
+++
+++ if (opt & OA_CPUIN_MIN) ps += info->lb_timings[LBT_CPUIN_MIN];
+++ if (opt & OD_CPUOUT_MIN) ps -= info->lb_timings[LBT_CPUOUT_MIN];
+++ if (opt & OA_CPUOUT_MAX) ps += info->lb_timings[LBT_CPUOUT_MAX];
+++ if (opt & OD_EXTDEL_MIN) ps -= info->lb_timings[LBT_EXTDEL_MIN];
+++ if (opt & OA_EXTDEL_MAX) ps += info->lb_timings[LBT_EXTDEL_MAX];
+++
+++ if (us->value == ANOTHER_TIMING) {
+++ /* use longest timing from alternatives */
+++ if (psFinal[lastUpmValIdx] < ps) {
+++ psFinal[lastUpmValIdx] = ps;
+++ }
+++ ps = 0;
+++ }
+++ else {
+++ if (us->group_size) {
+++ group_start_idx = uidx;
+++ group_left_num = us->group_size;
+++ }
+++ else if (group_left_num > 0) {
+++ /* group time is divided on all group members */
+++ int clk = ps2clk(ps, clk_time_ps);
+++ psFinal[group_start_idx] -= clk * clk_time_ps;
+++ --group_left_num;
+++ }
+++ if ((opt & O_MINUS_PREV) && lastUpmValIdx > 0) {
+++ int clk = ps2clk(psFinal[lastUpmValIdx],
+++ clk_time_ps);
+++ ps -= clk * clk_time_ps;
+++ }
+++ lastUpmValIdx = uidx;
+++ }
+++ psFinal[uidx] = ps;
+++ }
+++ return uidx;
+++}
+++
+++static int free_half(int ps, int clk, int clk_time_ps) {
+++ if (clk < 2) return 0;
+++ return (clk * clk_time_ps - ps) * 2 >= clk_time_ps;
+++}
+++
+++static void upm_gen_clk_table(const struct upm_setting *upm,
+++ int mode, int clk_time_ps,
+++ int max_uidx, const int *psFinal, int *clkFinal) {
+++ int clk_cycle_time;
+++ int clk_total;
+++ int uidx;
+++
+++ /* convert picoseconds to clocks */
+++ clk_total = 0;
+++ for (uidx = 0; uidx < max_uidx; ++uidx) {
+++ int clk = ps2clk(psFinal[uidx], clk_time_ps);
+++ clkFinal[uidx] = clk;
+++ clk_total += clk;
+++ }
+++
+++ /* check possibility of half cycle usage */
+++ for (uidx = 1; uidx < max_uidx - 1; ++uidx) {
+++ if ((upm[uidx].options & O_HALF_CYCLE) &&
+++ free_half(psFinal[uidx - 1], clkFinal[uidx - 1],
+++ clk_time_ps) &&
+++ free_half(psFinal[uidx + 1], clkFinal[uidx + 1],
+++ clk_time_ps)) {
+++ ++clkFinal[uidx];
+++ --clkFinal[uidx - 1];
+++ --clkFinal[uidx + 1];
+++ }
+++ }
+++
+++ if ((upm[max_uidx].options & O_MIN_CYCLE_TIME) == 0) return;
+++
+++ /* check cycle time, adjust timings if needed */
+++ clk_cycle_time = (ps2clk(upm[max_uidx].ns[mode] * 1000, clk_time_ps) -
+++ upm[max_uidx].clk_minus);
+++ uidx = 0;
+++ while (clk_total < clk_cycle_time) {
+++ /* extend all timings in round-robin to match cycle time */
+++ if (clkFinal[uidx]) {
+++#if DEBUG_UPM
+++ printk(KERN_INFO "extending %u by 1 clk\n", uidx);
+++#endif
+++ ++clkFinal[uidx];
+++ ++clk_total;
+++ }
+++ ++uidx;
+++ if (uidx == max_uidx) uidx = 0;
+++ }
+++}
+++
+++static void add_data_val(unsigned val, int *clkLeft, int maxClk,
+++ unsigned *data, int *dataIdx) {
+++ if (*clkLeft == 0) return;
+++
+++ if (maxClk == 0 && *clkLeft >= LOOP_SIZE * 2) {
+++ int times;
+++ int times1;
+++ int times2;
+++
+++ times = *clkLeft / LOOP_SIZE;
+++ if (times > REDO_MAX_MULT * 2) times = REDO_MAX_MULT * 2;
+++ times1 = times / 2;
+++ times2 = times - times1;
+++
+++ val |= LOOP;
+++ data[*dataIdx] = val | REDO_VAL(times1);
+++ ++(*dataIdx);
+++ data[*dataIdx] = val | REDO_VAL(times2);
+++ ++(*dataIdx);
+++
+++ *clkLeft -= times * LOOP_SIZE;
+++ return;
+++ }
+++
+++ if (maxClk < 1 || maxClk > REDO_MAX_MULT) maxClk = REDO_MAX_MULT;
+++ if (*clkLeft < maxClk) maxClk = *clkLeft;
+++
+++ *clkLeft -= maxClk;
+++ val |= REDO_VAL(maxClk);
+++
+++ data[*dataIdx] = val;
+++ ++(*dataIdx);
+++}
+++
+++static int upm_gen_final_data(const struct upm_setting *upm,
+++ int max_uidx, int *clkFinal, unsigned *data) {
+++ int dataIdx;
+++ int uidx;
+++
+++ dataIdx = 0;
+++ for (uidx = 0; uidx < max_uidx; ++uidx) {
+++ int clk = clkFinal[uidx];
+++ while (clk > 0) {
+++ add_data_val(upm[uidx].value, &clk, 0,
+++ data, &dataIdx);
+++ }
+++ }
+++ return dataIdx;
+++}
+++
+++static int conv_upm_table(const struct upm_setting *upm,
+++ int mode, struct rbppc_cf_info *info,
+++ unsigned *data) {
+++#if DEBUG_UPM
+++ int uidx;
+++#endif
+++ int psFinal[32];
+++ int clkFinal[32];
+++ int max_uidx;
+++ int data_len;
+++
+++ max_uidx = upm_gen_ps_table(upm, mode, info, psFinal);
+++
+++ upm_gen_clk_table(upm, mode, info->clk_time_ps, max_uidx,
+++ psFinal, clkFinal);
+++
+++#if DEBUG_UPM
+++ /* dump out debug info */
+++ for (uidx = 0; uidx < max_uidx; ++uidx) {
+++ if (clkFinal[uidx]) {
+++ printk(KERN_INFO "idx %d val %08x clk %d ps %d\n",
+++ uidx, upm[uidx].value,
+++ clkFinal[uidx], psFinal[uidx]);
+++ }
+++ }
+++#endif
+++
+++ data_len = upm_gen_final_data(upm, max_uidx, clkFinal, data);
+++
+++#if DEBUG_UPM
+++ for (uidx = 0; uidx < data_len; ++uidx) {
+++ printk(KERN_INFO "cf UPM x result: idx %d val %08x\n",
+++ uidx, data[uidx]);
+++ }
+++#endif
+++ return 0;
+++}
+++
+++static int gen_upm_data(int mode, struct rbppc_cf_info *info, unsigned *data) {
+++ int i;
+++
+++ for (i = 0; i < UPM_DATA_SIZE; ++i) {
+++ data[i] = EMPTY;
+++ }
+++
+++ if (conv_upm_table(cfUpmReadSingle, mode, info, data + UPM_READ_SINGLE_OFFSET)) {
+++ return -1;
+++ }
+++ if (conv_upm_table(cfUpmWriteSingle, mode, info, data + UPM_WRITE_SINGLE_OFFSET)) {
+++ return -1;
+++ }
+++ return 0;
+++}
+++
+++static void rbppc_cf_program_upm(void *upmMemAddr, volatile void *lbcfg_mxmr, volatile void *lbcfg_mdr, const unsigned *upmData, unsigned offset, unsigned len) {
+++ unsigned i;
+++ unsigned mxmr;
+++
+++ mxmr = in_be32(lbcfg_mxmr);
+++ mxmr &= ~(MxMR_OP_MASK | MxMR_MAD_MASK);
+++ mxmr |= (MxMR_OP_WRITE | offset);
+++ out_be32(lbcfg_mxmr, mxmr);
+++ in_be32(lbcfg_mxmr); /* flush MxMR write */
+++
+++ for (i = 0; i < len; ++i) {
+++ int to;
+++ unsigned data = upmData[i + offset];
+++ out_be32(lbcfg_mdr, data);
+++ in_be32(lbcfg_mdr); /* flush MDR write */
+++
+++ iowrite8(1, upmMemAddr); /* dummy write to any CF addr */
+++
+++ /* wait for dummy write to complete */
+++ for (to = 10000; to >= 0; --to) {
+++ mxmr = in_be32(lbcfg_mxmr);
+++ if (((mxmr ^ (i + 1)) & MxMR_MAD_MASK) == 0) {
+++ break;
+++ }
+++ if (to == 0) {
+++ printk(KERN_ERR "rbppc_cf_program_upm: UPMx program error at 0x%x: Timeout\n", i);
+++ }
+++ }
+++ }
+++ mxmr &= ~(MxMR_OP_MASK | MxMR_RLF_MASK | MxMR_WLF_MASK);
+++ mxmr |= (MxMR_OP_NORMAL | (LOOP_SIZE << MxMR_RLF_SHIFT) | (LOOP_SIZE << MxMR_WLF_SHIFT));
+++ out_be32(lbcfg_mxmr, mxmr);
+++}
+++
+++static int rbppc_cf_update_piomode(struct ata_port *ap, int mode) {
+++ struct rbppc_cf_info *info = (struct rbppc_cf_info *)ap->host->private_data;
+++ void *lbcfgBase;
+++ unsigned upmData[UPM_DATA_SIZE];
+++
+++ if (gen_upm_data(mode, info, upmData)) {
+++ return -1;
+++ }
+++
+++ lbcfgBase = ioremap_nocache(info->lbcfg_addr, IMMR_LBCFG_SIZE);
+++
+++ rbppc_cf_program_upm(ap->ioaddr.cmd_addr, ((char *)lbcfgBase) + LOCAL_BUS_MCMR, ((char *)lbcfgBase) + LOCAL_BUS_MDR, upmData, 0, UPM_DATA_SIZE);
+++ iounmap(lbcfgBase);
+++ return 0;
+++}
+++
+++static void rbppc_cf_set_piomode(struct ata_port *ap, struct ata_device *adev)
+++{
+++ struct rbppc_cf_info *info = (struct rbppc_cf_info *)ap->host->private_data;
+++ int mode = adev->pio_mode - XFER_PIO_0;
+++
+++ DPRINTK("rbppc_cf_set_piomode: PIO %d\n", mode);
+++ if (mode < 0) mode = 0;
+++ if (mode > 6) mode = 6;
+++
+++ if (info->cur_mode < 0 || info->cur_mode > mode) {
+++ if (rbppc_cf_update_piomode(ap, mode) == 0) {
+++ printk(KERN_INFO "rbppc_cf_set_piomode: PIO mode changed to %d\n", mode);
+++ info->cur_mode = mode;
+++ }
+++ }
+++}
+++
+++static struct scsi_host_template rbppc_cf_sht = {
+++ ATA_BASE_SHT(DRV_NAME),
+++};
+++
+++static struct ata_port_operations rbppc_cf_port_ops = {
+++ .inherits = &ata_bmdma_port_ops,
+++
+++ .sff_check_status = rbppc_cf_check_status,
+++ .sff_check_altstatus = rbppc_cf_check_altstatus,
+++
+++ .set_piomode = rbppc_cf_set_piomode,
+++
+++ .port_start = rbppc_cf_dummy_ret0,
+++
+++ .sff_irq_clear = rbppc_cf_dummy_noret,
+++};
+++
+++static int rbppc_cf_init_info(struct platform_device *pdev, struct rbppc_cf_info *info) {
+++ struct device_node *np;
+++ struct resource res;
+++ const u32 *u32ptr;
+++ void *lbcfgBase;
+++ void *lbcfg_lcrr;
+++ unsigned lbc_clk_khz;
+++ unsigned lbc_extra_divider = 1;
+++ unsigned ccb_freq_hz;
+++ unsigned lb_div;
+++
+++ u32ptr = of_get_property(pdev->dev.of_node, "lbc_extra_divider", NULL);
+++ if (u32ptr && *u32ptr) {
+++ lbc_extra_divider = *u32ptr;
+++#if DEBUG_UPM
+++ printk(KERN_INFO "rbppc_cf_init_info: LBC extra divider %u\n",
+++ lbc_extra_divider);
+++#endif
+++ }
+++
+++ np = of_find_node_by_type(NULL, "serial");
+++ if (!np) {
+++ printk(KERN_ERR "rbppc_cf_init_info: No serial node found\n");
+++ return -1;
+++ }
+++ u32ptr = of_get_property(np, "clock-frequency", NULL);
+++ if (u32ptr == 0 || *u32ptr == 0) {
+++ printk(KERN_ERR "rbppc_cf_init_info: Serial does not have clock-frequency\n");
+++ of_node_put(np);
+++ return -1;
+++ }
+++ ccb_freq_hz = *u32ptr;
+++ of_node_put(np);
+++
+++ np = of_find_node_by_type(NULL, "soc");
+++ if (!np) {
+++ printk(KERN_ERR "rbppc_cf_init_info: No soc node found\n");
+++ return -1;
+++ }
+++ if (of_address_to_resource(np, 0, &res)) {
+++ printk(KERN_ERR "rbppc_cf_init_info: soc does not have resource\n");
+++ of_node_put(np);
+++ return -1;
+++ }
+++ info->lbcfg_addr = res.start + IMMR_LBCFG_OFFSET;
+++ of_node_put(np);
+++
+++ lbcfgBase = ioremap_nocache(info->lbcfg_addr, IMMR_LBCFG_SIZE);
+++ lbcfg_lcrr = ((char*)lbcfgBase) + LOCAL_BUS_LCRR;
+++ lb_div = (in_be32(lbcfg_lcrr) & LCRR_CLKDIV_MASK) * lbc_extra_divider;
+++ iounmap(lbcfgBase);
+++
+++ lbc_clk_khz = ccb_freq_hz / (1000 * lb_div);
+++ info->clk_time_ps = 1000000000 / lbc_clk_khz;
+++ printk(KERN_INFO "rbppc_cf_init_info: Using Local-Bus clock %u kHz %u ps\n",
+++ lbc_clk_khz, info->clk_time_ps);
+++
+++ u32ptr = of_get_property(pdev->dev.of_node, "lb-timings", NULL);
+++ if (u32ptr) {
+++ memcpy(info->lb_timings, u32ptr, LBT_SIZE * sizeof(*u32ptr));
+++#if DEBUG_UPM
+++ printk(KERN_INFO "rbppc_cf_init_info: Got LB timings <%u %u %u %u %u>\n",
+++ u32ptr[0], u32ptr[1], u32ptr[2], u32ptr[3], u32ptr[4]);
+++#endif
+++ }
+++ info->cur_mode = -1;
+++ return 0;
+++}
+++
+++static int rbppc_cf_probe(struct platform_device *pdev)
+++{
+++ struct ata_host *host;
+++ struct ata_port *ap;
+++ struct rbppc_cf_info *info = NULL;
+++ struct resource res;
+++ void *baddr;
+++ const u32 *u32ptr;
+++ int irq_level = 0;
+++ int err = -ENOMEM;
+++
+++ printk(KERN_INFO "rbppc_cf_probe: MikroTik RouterBOARD 600 series Compact Flash PATA driver, version " DRV_VERSION "\n");
+++
+++ if (rbinfo == NULL) {
+++ info = kmalloc(sizeof(*info), GFP_KERNEL);
+++ if (info == NULL) {
+++ printk(KERN_ERR "rbppc_cf_probe: Out of memory\n");
+++ goto err_info;
+++ }
+++ memset(info, 0, sizeof(*info));
+++
+++ if (rbppc_cf_init_info(pdev, info)) {
+++ goto err_info;
+++ }
+++ rbinfo = info;
+++ }
+++
+++ u32ptr = of_get_property(pdev->dev.of_node, "interrupt-at-level", NULL);
+++ if (u32ptr) {
+++ irq_level = *u32ptr;
+++ printk(KERN_INFO "rbppc_cf_probe: IRQ level %u\n", irq_level);
+++ }
+++
+++ if (of_address_to_resource(pdev->dev.of_node, 0, &res)) {
+++ printk(KERN_ERR "rbppc_cf_probe: No reg property found\n");
+++ goto err_info;
+++ }
+++
+++ host = ata_host_alloc(&pdev->dev, 1);
+++ if (!host)
+++ goto err_info;
+++
+++ baddr = localbus_map(res.start, res.end - res.start + 1);
+++ host->iomap = baddr;
+++ host->private_data = rbinfo;
+++
+++ ap = host->ports[0];
+++ ap->ops = &rbppc_cf_port_ops;
+++ ap->pio_mask = 0x7F; /* PIO modes 0-6 */
+++ ap->mwdma_mask = 0;
+++
+++ ap->ioaddr.cmd_addr = baddr;
+++ ata_sff_std_ports(&ap->ioaddr);
+++ ap->ioaddr.ctl_addr = ap->ioaddr.cmd_addr + 14;
+++ ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr;
+++ ap->ioaddr.bmdma_addr = 0;
+++
+++ err = ata_host_activate(
+++ host,
+++ irq_of_parse_and_map(pdev->dev.of_node, 0), ata_sff_interrupt,
+++ irq_level ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW,
+++ &rbppc_cf_sht);
+++ if (!err) return 0;
+++
+++ localbus_unmap(baddr);
+++err_info:
+++ if (info) {
+++ kfree(info);
+++ rbinfo = NULL;
+++ }
+++ return err;
+++}
+++
+++static int rbppc_cf_remove(struct platform_device *pdev)
+++{
+++ struct device *dev = &pdev->dev;
+++ struct ata_host *host = dev_get_drvdata(dev);
+++
+++ if (host == NULL) return -1;
+++
+++ ata_host_detach(host);
+++ return 0;
+++}
+++
+++static struct of_device_id rbppc_cf_ids[] = {
+++ { .name = "cf", },
+++ { },
+++};
+++
+++static struct platform_driver rbppc_cf_driver = {
+++ .probe = rbppc_cf_probe,
+++ .remove = rbppc_cf_remove,
+++ .driver = {
+++ .name = "rbppc-cf",
+++ .owner = THIS_MODULE,
+++ .of_match_table = rbppc_cf_ids,
+++ },
+++};
+++
+++static int __init rbppc_init(void)
+++{
+++ return platform_driver_register(&rbppc_cf_driver);
+++}
+++
+++static void __exit rbppc_exit(void)
+++{
+++ platform_driver_unregister(&rbppc_cf_driver);
+++}
+++
+++MODULE_AUTHOR("Mikrotikls SIA");
+++MODULE_AUTHOR("Noah Fontes");
+++MODULE_DESCRIPTION("MikroTik RouterBOARD 600 series Compact Flash PATA driver");
+++MODULE_LICENSE("GPL");
+++MODULE_VERSION(DRV_VERSION);
+++
+++module_init(rbppc_init);
+++module_exit(rbppc_exit);
+diff --git a/feeds/targets/mpc83xx/patches-3.18/203-mtd-add-rbppc_nand-driver.patch b/feeds/targets/mpc83xx/patches-3.18/203-mtd-add-rbppc_nand-driver.patch
+new file mode 100644
+index 0000000..2b4c0a8
+--- /dev/null
++++ b/feeds/targets/mpc83xx/patches-3.18/203-mtd-add-rbppc_nand-driver.patch
+@@ -0,0 +1,280 @@
++--- a/drivers/mtd/nand/Kconfig
+++++ b/drivers/mtd/nand/Kconfig
++@@ -408,6 +408,13 @@ config MTD_NAND_PLATFORM
++ devices. You will need to provide platform-specific functions
++ via platform_data.
++
+++config MTD_NAND_RB_PPC
+++ tristate "MikroTik RB333/600 NAND support"
+++ depends on RB_PPC
+++ help
+++ This option enables support for the NAND device on MikroTik
+++ RouterBOARD 333/600 series boards.
+++
++ config MTD_NAND_ORION
++ tristate "NAND Flash support for Marvell Orion SoC"
++ depends on PLAT_ORION
++--- a/drivers/mtd/nand/Makefile
+++++ b/drivers/mtd/nand/Makefile
++@@ -32,6 +32,7 @@ obj-$(CONFIG_MTD_NAND_CM_X270) += cmx27
++ obj-$(CONFIG_MTD_NAND_PXA3xx) += pxa3xx_nand.o
++ obj-$(CONFIG_MTD_NAND_TMIO) += tmio_nand.o
++ obj-$(CONFIG_MTD_NAND_PLATFORM) += plat_nand.o
+++obj-$(CONFIG_MTD_NAND_RB_PPC) += rbppc_nand.o
++ obj-$(CONFIG_MTD_NAND_PASEMI) += pasemi_nand.o
++ obj-$(CONFIG_MTD_NAND_ORION) += orion_nand.o
++ obj-$(CONFIG_MTD_NAND_FSL_ELBC) += fsl_elbc_nand.o
++--- /dev/null
+++++ b/drivers/mtd/nand/rbppc_nand.c
++@@ -0,0 +1,251 @@
+++/*
+++ * Copyright (C) 2008-2009 Noah Fontes <nfontes@transtruct.org>
+++ * Copyright (C) 2009 Michael Guntsche <mike@it-loops.com>
+++ * Copyright (C) Mikrotik 2007
+++ *
+++ * This program is free software; you can redistribute it and/or modify it
+++ * under the terms of the GNU General Public License as published by the
+++ * Free Software Foundation; either version 2 of the License, or (at your
+++ * option) any later version.
+++ */
+++
+++#include <linux/init.h>
+++#include <linux/module.h>
+++#include <linux/mtd/nand.h>
+++#include <linux/mtd/mtd.h>
+++#include <linux/mtd/partitions.h>
+++#include <linux/of_platform.h>
+++#include <linux/of_device.h>
+++#include <linux/slab.h>
+++#include <linux/delay.h>
+++#include <linux/of_address.h>
+++#include <asm/io.h>
+++
+++#define DRV_NAME "rbppc_nand"
+++#define DRV_VERSION "0.0.2"
+++
+++static struct mtd_info rmtd;
+++static struct nand_chip rnand;
+++
+++struct rbppc_nand_info {
+++ void *gpi;
+++ void *gpo;
+++ void *localbus;
+++
+++ unsigned gpio_rdy;
+++ unsigned gpio_nce;
+++ unsigned gpio_cle;
+++ unsigned gpio_ale;
+++ unsigned gpio_ctrls;
+++};
+++
+++/* We must use the OOB layout from yaffs 1 if we want this to be recognized
+++ * properly. Borrowed from the OpenWRT patches for the RB532.
+++ *
+++ * See <https://dev.openwrt.org/browser/trunk/target/linux/rb532/
+++ * patches-2.6.28/025-rb532_nand_fixup.patch> for more details.
+++ */
+++static struct nand_ecclayout rbppc_nand_oob_16 = {
+++ .eccbytes = 6,
+++ .eccpos = { 8, 9, 10, 13, 14, 15 },
+++ .oobavail = 9,
+++ .oobfree = { { 0, 4 }, { 6, 2 }, { 11, 2 }, { 4, 1 } }
+++};
+++
+++static struct mtd_partition rbppc_nand_partition_info[] = {
+++ {
+++ name: "kernel",
+++ offset: 0,
+++ size: 4 * 1024 * 1024,
+++ },
+++ {
+++ name: "rootfs",
+++ offset: MTDPART_OFS_NXTBLK,
+++ size: MTDPART_SIZ_FULL,
+++ },
+++};
+++
+++static int rbppc_nand_dev_ready(struct mtd_info *mtd) {
+++ struct nand_chip *chip = mtd->priv;
+++ struct rbppc_nand_info *priv = chip->priv;
+++
+++ return in_be32(priv->gpi) & priv->gpio_rdy;
+++}
+++
+++static void rbppc_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl) {
+++ struct nand_chip *chip = mtd->priv;
+++ struct rbppc_nand_info *priv = chip->priv;
+++
+++ if (ctrl & NAND_CTRL_CHANGE) {
+++ unsigned val = in_be32(priv->gpo);
+++ if (!(val & priv->gpio_nce)) {
+++ /* make sure Local Bus has done NAND operations */
+++ readb(priv->localbus);
+++ }
+++
+++ if (ctrl & NAND_CLE) {
+++ val |= priv->gpio_cle;
+++ } else {
+++ val &= ~priv->gpio_cle;
+++ }
+++ if (ctrl & NAND_ALE) {
+++ val |= priv->gpio_ale;
+++ } else {
+++ val &= ~priv->gpio_ale;
+++ }
+++ if (!(ctrl & NAND_NCE)) {
+++ val |= priv->gpio_nce;
+++ } else {
+++ val &= ~priv->gpio_nce;
+++ }
+++ out_be32(priv->gpo, val);
+++
+++ /* make sure GPIO output has changed */
+++ val ^= in_be32(priv->gpo);
+++ if (val & priv->gpio_ctrls) {
+++ printk(KERN_ERR "rbppc_nand_hwcontrol: NAND GPO change failed 0x%08x\n", val);
+++ }
+++ }
+++
+++ if (cmd != NAND_CMD_NONE) writeb(cmd, chip->IO_ADDR_W);
+++}
+++
+++static void rbppc_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
+++{
+++ struct nand_chip *chip = mtd->priv;
+++ memcpy(buf, chip->IO_ADDR_R, len);
+++}
+++
+++static unsigned init_ok = 0;
+++
+++static int rbppc_nand_probe(struct platform_device *pdev)
+++{
+++ struct device_node *gpio;
+++ struct device_node *nnand;
+++ struct resource res;
+++ struct rbppc_nand_info *info;
+++ void *baddr;
+++ const unsigned *rdy, *nce, *cle, *ale;
+++
+++ printk(KERN_INFO "rbppc_nand_probe: MikroTik RouterBOARD 333/600 series NAND driver, version " DRV_VERSION "\n");
+++
+++ info = kmalloc(sizeof(*info), GFP_KERNEL);
+++
+++ rdy = of_get_property(pdev->dev.of_node, "rdy", NULL);
+++ nce = of_get_property(pdev->dev.of_node, "nce", NULL);
+++ cle = of_get_property(pdev->dev.of_node, "cle", NULL);
+++ ale = of_get_property(pdev->dev.of_node, "ale", NULL);
+++
+++ if (!rdy || !nce || !cle || !ale) {
+++ printk(KERN_ERR "rbppc_nand_probe: GPIO properties are missing\n");
+++ goto err;
+++ }
+++ if (rdy[0] != nce[0] || rdy[0] != cle[0] || rdy[0] != ale[0]) {
+++ printk(KERN_ERR "rbppc_nand_probe: Different GPIOs are not supported\n");
+++ goto err;
+++ }
+++
+++ gpio = of_find_node_by_phandle(rdy[0]);
+++ if (!gpio) {
+++ printk(KERN_ERR "rbppc_nand_probe: No GPIO<%x> node found\n", *rdy);
+++ goto err;
+++ }
+++ if (of_address_to_resource(gpio, 0, &res)) {
+++ printk(KERN_ERR "rbppc_nand_probe: No reg property in GPIO found\n");
+++ goto err;
+++ }
+++ info->gpo = ioremap_nocache(res.start, res.end - res.start + 1);
+++
+++ if (!of_address_to_resource(gpio, 1, &res)) {
+++ info->gpi = ioremap_nocache(res.start, res.end - res.start + 1);
+++ } else {
+++ info->gpi = info->gpo;
+++ }
+++ of_node_put(gpio);
+++
+++ info->gpio_rdy = 1 << (31 - rdy[1]);
+++ info->gpio_nce = 1 << (31 - nce[1]);
+++ info->gpio_cle = 1 << (31 - cle[1]);
+++ info->gpio_ale = 1 << (31 - ale[1]);
+++ info->gpio_ctrls = info->gpio_nce | info->gpio_cle | info->gpio_ale;
+++
+++ nnand = of_find_node_by_name(NULL, "nnand");
+++ if (!nnand) {
+++ printk("rbppc_nand_probe: No nNAND found\n");
+++ goto err;
+++ }
+++ if (of_address_to_resource(nnand, 0, &res)) {
+++ printk("rbppc_nand_probe: No reg property in nNAND found\n");
+++ goto err;
+++ }
+++ of_node_put(nnand);
+++ info->localbus = ioremap_nocache(res.start, res.end - res.start + 1);
+++
+++ if (of_address_to_resource(pdev->dev.of_node, 0, &res)) {
+++ printk("rbppc_nand_probe: No reg property found\n");
+++ goto err;
+++ }
+++ baddr = ioremap_nocache(res.start, res.end - res.start + 1);
+++
+++ memset(&rnand, 0, sizeof(rnand));
+++ rnand.cmd_ctrl = rbppc_nand_cmd_ctrl;
+++ rnand.dev_ready = rbppc_nand_dev_ready;
+++ rnand.read_buf = rbppc_nand_read_buf;
+++ rnand.IO_ADDR_W = baddr;
+++ rnand.IO_ADDR_R = baddr;
+++ rnand.priv = info;
+++
+++ memset(&rmtd, 0, sizeof(rmtd));
+++ rnand.ecc.mode = NAND_ECC_SOFT;
+++ rnand.ecc.layout = &rbppc_nand_oob_16;
+++ rnand.chip_delay = 25;
+++ rmtd.priv = &rnand;
+++ rmtd.owner = THIS_MODULE;
+++
+++ if (nand_scan(&rmtd, 1) && nand_scan(&rmtd, 1) && nand_scan(&rmtd, 1) && nand_scan(&rmtd, 1)) {
+++ printk(KERN_ERR "rbppc_nand_probe: RouterBOARD NAND device not found\n");
+++ return -ENXIO;
+++ }
+++
+++ mtd_device_parse_register(&rmtd, NULL, 0, rbppc_nand_partition_info, 2);
+++ init_ok = 1;
+++ return 0;
+++
+++err:
+++ kfree(info);
+++ return -1;
+++}
+++
+++static struct of_device_id rbppc_nand_ids[] = {
+++ { .name = "nand", },
+++ { },
+++};
+++
+++static struct platform_driver rbppc_nand_driver = {
+++ .probe = rbppc_nand_probe,
+++ .driver = {
+++ .name = "rbppc-nand",
+++ .owner = THIS_MODULE,
+++ .of_match_table = rbppc_nand_ids,
+++ },
+++};
+++
+++static int __init rbppc_nand_init(void)
+++{
+++ return platform_driver_register(&rbppc_nand_driver);
+++}
+++
+++static void __exit rbppc_nand_exit(void)
+++{
+++ platform_driver_unregister(&rbppc_nand_driver);
+++}
+++
+++MODULE_AUTHOR("Mikrotikls SIA");
+++MODULE_AUTHOR("Noah Fontes");
+++MODULE_AUTHOR("Michael Guntsche");
+++MODULE_DESCRIPTION("MikroTik RouterBOARD 333/600 series NAND driver");
+++MODULE_LICENSE("GPL");
+++MODULE_VERSION(DRV_VERSION);
+++
+++module_init(rbppc_nand_init);
+++module_exit(rbppc_nand_exit);
+diff --git a/feeds/targets/mpc83xx/patches-3.18/300-mpc8377_wlan-dts-add-openwrt-hacks.patch b/feeds/targets/mpc83xx/patches-3.18/300-mpc8377_wlan-dts-add-openwrt-hacks.patch
+new file mode 100644
+index 0000000..2fda40a
+--- /dev/null
++++ b/feeds/targets/mpc83xx/patches-3.18/300-mpc8377_wlan-dts-add-openwrt-hacks.patch
+@@ -0,0 +1,23 @@
++--- a/arch/powerpc/boot/dts/mpc8377_wlan.dts
+++++ b/arch/powerpc/boot/dts/mpc8377_wlan.dts
++@@ -81,6 +81,11 @@
++ reg = <0x3a0000 0x3c60000>;
++ label = "rootfs";
++ };
+++
+++ partition1@a0000 {
+++ reg = <0xa0000 0x3f60000>;
+++ label = "firmware";
+++ };
++ };
++ };
++
++@@ -474,4 +479,8 @@
++ default-state = "off";
++ };
++ };
+++
+++ chosen {
+++ bootargs = "console=ttyS0,115200 rootfstype=squashfs noinitrd";
+++ };
++ };
+diff --git a/feeds/telephony/MAINTAINERS b/feeds/telephony/MAINTAINERS
+new file mode 100644
+index 0000000..15f6e09
+--- /dev/null
++++ b/feeds/telephony/MAINTAINERS
+@@ -0,0 +1,13 @@
++# _______ ________ __
++# | |.-----.-----.-----.| | | |.----.| |_
++# | - || _ | -__| || | | || _|| _|
++# |_______|| __|_____|__|__||________||__| |____|
++# |__| W I R E L E S S F R E E D O M
++#
++# People listed here are managing the OpenWrt telephony feed. Use
++# alphabetical order when updating the list.
++
++Daniel Golle <daniel@makrotopia.org>
++Jiri Slachta <slachta@cesnet.cz>
++Luka Perkov <luka@openwrt.org>
++Mazi Lo <openwrt.mazilo@recursor.net>
+diff --git a/feeds/telephony/README.md b/feeds/telephony/README.md
+new file mode 100644
+index 0000000..54fb978
+--- /dev/null
++++ b/feeds/telephony/README.md
+@@ -0,0 +1,23 @@
++# Telephony packages feed
++
++## Description
++
++This is an OpenWrt package feed containing community maintained telephony packages.
++
++## Usage
++
++To use these packages, add the following line to the feeds.conf
++in the OpenWrt buildroot:
++
++```
++src-git telephony https://github.com/openwrt/telephony.git
++```
++
++This feed should be included and enabled by default in the OpenWrt buildroot. To install all its package definitions, run:
++
++```
++./scripts/feeds update telephony
++./scripts/feeds install -a -p telephony
++```
++
++The telephony packages should now appear in menuconfig.
+diff --git a/feeds/telephony/libs/bcg729/Makefile b/feeds/telephony/libs/bcg729/Makefile
+new file mode 100644
+index 0000000..6a36c58
+--- /dev/null
++++ b/feeds/telephony/libs/bcg729/Makefile
+@@ -0,0 +1,62 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=bcg729
++PKG_VERSION:=1.0.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://download-mirror.savannah.gnu.org/releases/linphone/plugins/sources/
++PKG_MD5SUM:=5d0c160129c0850c43dd66c78efe429b
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_INSTALL:=1
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Alex Samorukov <samm@os2.kiev.ua>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/bcg729
++ SUBMENU:=Telephony
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Software G729A encoder and decoder library written in C
++ URL:=http://www.linphone.org/technical-corner/bcg729.html
++ DEPENDS:=@BUILD_PATENTED
++endef
++
++define Package/bcg729/description
++ Bcg729 is a software G729A encoder and decoder library written in C, developed
++ by Belledonne Communications, the company supporting the Linphone project.
++ It was written from scratch and is NOT a derivative work of ITU reference
++ source code in any kind.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) -R $(PKG_INSTALL_DIR)/usr/include/bcg729 $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libbcg729.{a,so*} $(1)/usr/lib/
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libbcg729.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/bcg729/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libbcg729.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,bcg729))
+diff --git a/feeds/telephony/libs/dahdi-linux/Makefile b/feeds/telephony/libs/dahdi-linux/Makefile
+new file mode 100644
+index 0000000..7ae57bd
+--- /dev/null
++++ b/feeds/telephony/libs/dahdi-linux/Makefile
+@@ -0,0 +1,120 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++include $(INCLUDE_DIR)/kernel.mk
++
++PKG_NAME:=dahdi-linux
++PKG_VERSION:=2.10.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.asterisk.org/pub/telephony/dahdi-linux/releases/
++PKG_MD5SUM:=0281de245f4fa056f765ae2a6e1f1a4b
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE
++PKG_MAINTAINER:=Vittorio Gambaletta <openwrt@vittgam.net>
++
++DAHDI_MODULES_EXTRA:=
++
++include $(INCLUDE_DIR)/package.mk
++
++define KernelPackage/dahdi
++ SUBMENU:=Voice over IP
++ TITLE:=DAHDI basic infrastructure
++ DEPENDS:=@USB_SUPPORT +kmod-lib-crc-ccitt
++ URL:=http://www.asterisk.org/
++ FILES:= $(PKG_BUILD_DIR)/drivers/dahdi/dahdi.$(LINUX_KMOD_SUFFIX)
++ AUTOLOAD:=$(call AutoProbe,dahdi)
++endef
++
++define KernelPackage/dahdi/description
++ This package contains DAHDI basic infrastructure.
++endef
++
++define KernelPackage/dahdi-echocan-oslec
++ SUBMENU:=Voice over IP
++ TITLE:=DAHDI OSLEC echo canceller support
++ DEPENDS:=kmod-dahdi +kmod-echo
++ URL:=http://www.asterisk.org/
++ FILES:=$(PKG_BUILD_DIR)/drivers/dahdi/dahdi_echocan_oslec.$(LINUX_KMOD_SUFFIX)
++ AUTOLOAD:=$(call AutoProbe,dahdi_echocan_oslec)
++endef
++
++define KernelPackage/dahdi-echocan-oslec/description
++ This package contains DAHDI OSLEC echo canceller support.
++endef
++
++define KernelPackage/dahdi-hfcs
++ SUBMENU:=Voice over IP
++ TITLE:=DAHDI driver for HFC-S PCI
++ DEPENDS:=@PCI_SUPPORT kmod-dahdi
++ URL:=http://sourceforge.net/projects/dahdi-hfcs/
++ FILES:= $(PKG_BUILD_DIR)/drivers/dahdi/hfcs/dahdi_hfcs.$(LINUX_KMOD_SUFFIX)
++ AUTOLOAD:=$(call AutoProbe,dahdi_hfcs)
++endef
++
++define KernelPackage/dahdi-hfcs/description
++ This package contains DAHDI driver for HFC-S based PCI BRI adapters.
++endef
++
++define KernelPackage/dahdi-dummy
++ SUBMENU:=Voice over IP
++ TITLE:=dummy DAHDI driver
++ DEPENDS:=kmod-dahdi
++ URL:=http://www.asterisk.org/
++ FILES:= $(PKG_BUILD_DIR)/drivers/dahdi/dahdi_dummy.$(LINUX_KMOD_SUFFIX)
++ AUTOLOAD:=$(call AutoProbe,dahdi_dummy)
++endef
++
++define KernelPackage/dahdi-dummy/description
++ This package contains the dummy DAHDI driver providing only DAHDI timing
++ without any real telephony hardware.
++endef
++
++
++define Build/Configure
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/Prepare
++ $(Build/Prepare/Default)
++ mkdir -p $(PKG_BUILD_DIR)/drivers/staging/echo/
++ $(CP) ./files/oslec.h $(PKG_BUILD_DIR)/drivers/staging/echo/
++endef
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ ARCH="$(LINUX_KARCH)" \
++ $(TARGET_CONFIGURE_OPTS) \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ KERNELVERSION="$(KERNEL)" \
++ KERNEL_VERSION="$(LINUX_VERSION)" \
++ KERNELDIR="$(LINUX_DIR)" \
++ KSRC:="$(LINUX_DIR)" \
++ KVERS:="$(LINUX_VERSION)" \
++ TOPDIR:="$(TOPDIR)" \
++ INCLUDE_DIR:="$(INCLUDE_DIR)" \
++ PWD:="$(PKG_BUILD_DIR)" \
++ MODULES_EXTRA:="$(DAHDI_MODULES_EXTRA)"
++endef
++
++define Build/InstallDev
++ mkdir -p $(1)/usr/include/dahdi
++ $(CP) $(PKG_BUILD_DIR)/include/dahdi/dahdi_config.h $(1)/usr/include/dahdi/
++ $(CP) $(PKG_BUILD_DIR)/include/dahdi/fasthdlc.h $(1)/usr/include/dahdi/
++ $(CP) $(PKG_BUILD_DIR)/include/dahdi/kernel.h $(1)/usr/include/dahdi/
++ $(CP) $(PKG_BUILD_DIR)/include/dahdi/user.h $(1)/usr/include/dahdi/
++ $(CP) $(PKG_BUILD_DIR)/include/dahdi/wctdm_user.h $(1)/usr/include/dahdi/
++endef
++
++$(eval $(call KernelPackage,dahdi))
++$(eval $(call KernelPackage,dahdi-echocan-oslec))
++$(eval $(call KernelPackage,dahdi-dummy))
++$(eval $(call KernelPackage,dahdi-hfcs))
+diff --git a/feeds/telephony/libs/dahdi-linux/files/oslec.h b/feeds/telephony/libs/dahdi-linux/files/oslec.h
+new file mode 100644
+index 0000000..f417536
+--- /dev/null
++++ b/feeds/telephony/libs/dahdi-linux/files/oslec.h
+@@ -0,0 +1,94 @@
++/*
++ * OSLEC - A line echo canceller. This code is being developed
++ * against and partially complies with G168. Using code from SpanDSP
++ *
++ * Written by Steve Underwood <steveu@coppice.org>
++ * and David Rowe <david_at_rowetel_dot_com>
++ *
++ * Copyright (C) 2001 Steve Underwood and 2007-2008 David Rowe
++ *
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2, as
++ * published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++#ifndef __OSLEC_H
++#define __OSLEC_H
++
++/* Mask bits for the adaption mode */
++#define ECHO_CAN_USE_ADAPTION 0x01
++#define ECHO_CAN_USE_NLP 0x02
++#define ECHO_CAN_USE_CNG 0x04
++#define ECHO_CAN_USE_CLIP 0x08
++#define ECHO_CAN_USE_TX_HPF 0x10
++#define ECHO_CAN_USE_RX_HPF 0x20
++#define ECHO_CAN_DISABLE 0x40
++
++/**
++ * oslec_state: G.168 echo canceller descriptor.
++ *
++ * This defines the working state for a line echo canceller.
++ */
++struct oslec_state;
++
++/**
++ * oslec_create - Create a voice echo canceller context.
++ * @len: The length of the canceller, in samples.
++ * @return: The new canceller context, or NULL if the canceller could not be
++ * created.
++ */
++struct oslec_state *oslec_create(int len, int adaption_mode);
++
++/**
++ * oslec_free - Free a voice echo canceller context.
++ * @ec: The echo canceller context.
++ */
++void oslec_free(struct oslec_state *ec);
++
++/**
++ * oslec_flush - Flush (reinitialise) a voice echo canceller context.
++ * @ec: The echo canceller context.
++ */
++void oslec_flush(struct oslec_state *ec);
++
++/**
++ * oslec_adaption_mode - set the adaption mode of a voice echo canceller context.
++ * @ec The echo canceller context.
++ * @adaption_mode: The mode.
++ */
++void oslec_adaption_mode(struct oslec_state *ec, int adaption_mode);
++
++void oslec_snapshot(struct oslec_state *ec);
++
++/**
++ * oslec_update: Process a sample through a voice echo canceller.
++ * @ec: The echo canceller context.
++ * @tx: The transmitted audio sample.
++ * @rx: The received audio sample.
++ *
++ * The return value is the clean (echo cancelled) received sample.
++ */
++int16_t oslec_update(struct oslec_state *ec, int16_t tx, int16_t rx);
++
++/**
++ * oslec_hpf_tx: Process to high pass filter the tx signal.
++ * @ec: The echo canceller context.
++ * @tx: The transmitted auio sample.
++ *
++ * The return value is the HP filtered transmit sample, send this to your D/A.
++ */
++int16_t oslec_hpf_tx(struct oslec_state *ec, int16_t tx);
++
++#endif /* __OSLEC_H */
+diff --git a/feeds/telephony/libs/dahdi-linux/patches/001-include-slab-h-in-oct612x-user-c.patch b/feeds/telephony/libs/dahdi-linux/patches/001-include-slab-h-in-oct612x-user-c.patch
+new file mode 100644
+index 0000000..4099cc0
+--- /dev/null
++++ b/feeds/telephony/libs/dahdi-linux/patches/001-include-slab-h-in-oct612x-user-c.patch
+@@ -0,0 +1,10 @@
++--- a/drivers/dahdi/oct612x/oct612x-user.c
+++++ b/drivers/dahdi/oct612x/oct612x-user.c
++@@ -22,6 +22,7 @@
++
++ #include <linux/kernel.h>
++ #include <linux/module.h>
+++#include <linux/slab.h>
++
++ #include <dahdi/kernel.h>
++
+diff --git a/feeds/telephony/libs/dahdi-linux/patches/003-fix-oslec-build.patch b/feeds/telephony/libs/dahdi-linux/patches/003-fix-oslec-build.patch
+new file mode 100644
+index 0000000..e052235
+--- /dev/null
++++ b/feeds/telephony/libs/dahdi-linux/patches/003-fix-oslec-build.patch
+@@ -0,0 +1,13 @@
++--- a/drivers/dahdi/Kbuild
+++++ b/drivers/dahdi/Kbuild
++@@ -61,9 +61,8 @@ obj-m += $(DAHDI_MODULES_EXTRA)
++ # If you want to build OSLEC, include the code in the standard location:
++ # drivers/staging/echo . The DAHDI OSLEC echo canceller will be built as
++ # well:
++-ifneq (,$(wildcard $(src)/../staging/echo/echo.c))
+++ifneq (,$(wildcard $(src)/../staging/echo/oslec.h))
++ obj-m += dahdi_echocan_oslec.o
++-obj-m += ../staging/echo/echo.o
++ endif
++
++ CFLAGS_MODULE += -I$(DAHDI_INCLUDE) -I$(src)
+diff --git a/feeds/telephony/libs/dahdi-linux/patches/050-re-enable-ztdummy.patch b/feeds/telephony/libs/dahdi-linux/patches/050-re-enable-ztdummy.patch
+new file mode 100644
+index 0000000..5db2dfe
+--- /dev/null
++++ b/feeds/telephony/libs/dahdi-linux/patches/050-re-enable-ztdummy.patch
+@@ -0,0 +1,9 @@
++--- a/drivers/dahdi/Kbuild
+++++ b/drivers/dahdi/Kbuild
++@@ -1,5 +1,5 @@
++ obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI) += dahdi.o
++-#obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_DUMMY) += dahdi_dummy.o
+++obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_DUMMY) += dahdi_dummy.o
++ obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_DYNAMIC) += dahdi_dynamic.o
++ obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_DYNAMIC_LOC) += dahdi_dynamic_loc.o
++ obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_DYNAMIC_ETH) += dahdi_dynamic_eth.o
+diff --git a/feeds/telephony/libs/dahdi-linux/patches/100-add-support-for-hfc-s-pci.patch b/feeds/telephony/libs/dahdi-linux/patches/100-add-support-for-hfc-s-pci.patch
+new file mode 100644
+index 0000000..b5535dd
+--- /dev/null
++++ b/feeds/telephony/libs/dahdi-linux/patches/100-add-support-for-hfc-s-pci.patch
+@@ -0,0 +1,2732 @@
++--- a/drivers/dahdi/Kbuild
+++++ b/drivers/dahdi/Kbuild
++@@ -13,6 +13,7 @@ obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_WCT
++ obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_WCTDM24XXP) += wctdm24xxp/
++ obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_WCTE12XP) += wcte12xp/
++ obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_WCTE13XP) += wcte13xp.o
+++obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_HFCS) += hfcs/
++
++ wcte13xp-objs := wcte13xp-base.o wcxb_spi.o wcxb.o wcxb_flash.o
++ CFLAGS_wcte13xp-base.o += -I$(src)/oct612x -I$(src)/oct612x/include -I$(src)/oct612x/octdeviceapi -I$(src)/oct612x/octdeviceapi/oct6100api
++--- a/drivers/dahdi/Kconfig
+++++ b/drivers/dahdi/Kconfig
++@@ -291,4 +291,14 @@ config DAHDI_WCTE11XP
++
++ If unsure, say Y.
++
+++config DAHDI_HFCS
+++ tristate "Support for various HFC-S PCI BRI adapters"
+++ depends on DAHDI && PCI
+++ default DAHDI
+++ ---help---
+++ To compile this driver as a module, choose M here: the
+++ module will be called dahdi_hfcs.
+++
+++ If unsure, say Y.
+++
++ source "drivers/dahdi/xpp/Kconfig"
++--- /dev/null
+++++ b/drivers/dahdi/hfcs/base.c
++@@ -0,0 +1,1742 @@
+++/*
+++ * dahdi_hfcs.c - Dahdi driver for HFC-S PCI A based ISDN BRI cards
+++ *
+++ * Dahdi rewrite in hardhdlc mode
+++ * Jose A. Deniz <odicha@hotmail.com>
+++ *
+++ * Copyright (C) 2011, Raoul Bönisch
+++ * Copyright (C) 2009, Jose A. Deniz
+++ * Copyright (C) 2006, headissue GmbH; Jens Wilke
+++ * Copyright (C) 2004 Daniele Orlandi
+++ * Copyright (C) 2002, 2003, 2004, Junghanns.NET GmbH
+++ *
+++ * Jens Wilke <jw_vzaphfc@headissue.com>
+++ *
+++ * Original author of this code is
+++ * Daniele "Vihai" Orlandi <daniele@orlandi.com>
+++ *
+++ * Major rewrite of the driver made by
+++ * Klaus-Peter Junghanns <kpj@junghanns.net>
+++ *
+++ * This program is free software and may be modified and
+++ * distributed under the terms of the GNU Public License.
+++ *
+++ * Please read the README file for important infos.
+++ */
+++
+++#include <linux/spinlock.h>
+++#include <linux/init.h>
+++#include <linux/pci.h>
+++#include <linux/interrupt.h>
+++#include <linux/module.h>
+++#include <linux/moduleparam.h>
+++#include <linux/version.h>
+++#include <linux/kernel.h>
+++#include <linux/delay.h>
+++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 32))
+++#include <linux/sched.h>
+++#endif
+++#include <linux/proc_fs.h>
+++#include <linux/if_arp.h>
+++
+++#include <dahdi/kernel.h>
+++
+++#include "dahdi_hfcs.h"
+++#include "fifo.h"
+++
+++#if CONFIG_PCI
+++
+++#define DAHDI_B1 0
+++#define DAHDI_B2 1
+++#define DAHDI_D 2
+++
+++#define D 0
+++#define B1 1
+++#define B2 2
+++
+++/*
+++ * Mode Te for all
+++ */
+++static int modes;
+++static int nt_modes[hfc_MAX_BOARDS];
+++static int nt_modes_count;
+++static int force_l1_up;
+++static struct proc_dir_entry *hfc_proc_dahdi_hfcs_dir;
+++
+++#define DEBUG
+++#ifdef DEBUG
+++int debug_level;
+++#endif
+++
+++#ifndef FALSE
+++#define FALSE 0
+++#endif
+++#ifndef TRUE
+++#define TRUE (!FALSE)
+++#endif
+++
+++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)
+++#define SET_PROC_DIRENTRY_OWNER(p) do { (p)->owner = THIS_MODULE; } while(0);
+++#else
+++#define SET_PROC_DIRENTRY_OWNER(p) do { } while(0);
+++#endif
+++
+++static DEFINE_PCI_DEVICE_TABLE(hfc_pci_ids) = {
+++ {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_2BD0,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B000,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B006,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B007,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B008,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B009,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00A,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00B,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00C,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B100,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_A1T,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_ANIGMA, PCI_DEVICE_ID_ANIGMA_MC145575,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_ZOLTRIX, PCI_DEVICE_ID_ZOLTRIX_2BD0,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_E,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_E,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_IOM2_A,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_DF_M_A,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {PCI_VENDOR_ID_SITECOM, PCI_DEVICE_ID_SITECOM_3069,
+++ PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+++ {0,}
+++};
+++
+++MODULE_DEVICE_TABLE(pci, hfc_pci_ids);
+++
+++static int __devinit hfc_probe(struct pci_dev *dev
+++ , const struct pci_device_id *ent);
+++static void __devexit hfc_remove(struct pci_dev *dev);
+++
+++static struct pci_driver hfc_driver = {
+++ .name = hfc_DRIVER_NAME,
+++ .id_table = hfc_pci_ids,
+++ .probe = hfc_probe,
+++ .remove = __devexit_p(hfc_remove),
+++};
+++
+++/******************************************
+++ * HW routines
+++ ******************************************/
+++
+++static void hfc_softreset(struct hfc_card *card)
+++{
+++ printk(KERN_INFO hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "resetting\n",
+++ card->cardnum);
+++
+++/*
+++ * Softreset procedure. Put it on, wait and off again
+++ */
+++ hfc_outb(card, hfc_CIRM, hfc_CIRM_RESET);
+++ udelay(6);
+++ hfc_outb(card, hfc_CIRM, 0);
+++
+++ set_current_state(TASK_UNINTERRUPTIBLE);
+++ schedule_timeout((hfc_RESET_DELAY * HZ) / 1000);
+++}
+++
+++static void hfc_resetCard(struct hfc_card *card)
+++{
+++ card->regs.m1 = 0;
+++ hfc_outb(card, hfc_INT_M1, card->regs.m1);
+++
+++ card->regs.m2 = 0;
+++ hfc_outb(card, hfc_INT_M2, card->regs.m2);
+++
+++ hfc_softreset(card);
+++
+++ card->regs.trm = 0;
+++ hfc_outb(card, hfc_TRM, card->regs.trm);
+++
+++ /*
+++ * Select the non-capacitive line mode for the S/T interface
+++ */
+++ card->regs.sctrl = hfc_SCTRL_NONE_CAP;
+++
+++ if (card->nt_mode) {
+++ /*
+++ * ST-Bit delay for NT-Mode
+++ */
+++ hfc_outb(card, hfc_CLKDEL, hfc_CLKDEL_NT);
+++
+++ card->regs.sctrl |= hfc_SCTRL_MODE_NT;
+++ } else {
+++ /*
+++ * ST-Bit delay for TE-Mode
+++ */
+++ hfc_outb(card, hfc_CLKDEL, hfc_CLKDEL_TE);
+++
+++ card->regs.sctrl |= hfc_SCTRL_MODE_TE;
+++ }
+++
+++ hfc_outb(card, hfc_SCTRL, card->regs.sctrl);
+++
+++ /*
+++ * S/T Auto awake
+++ */
+++ card->regs.sctrl_e = hfc_SCTRL_E_AUTO_AWAKE;
+++ hfc_outb(card, hfc_SCTRL_E, card->regs.sctrl_e);
+++
+++ /*
+++ * No B-channel enabled at startup
+++ */
+++ card->regs.sctrl_r = 0;
+++ hfc_outb(card, hfc_SCTRL_R, card->regs.sctrl_r);
+++
+++ /*
+++ * HFC Master Mode
+++ */
+++ hfc_outb(card, hfc_MST_MODE, hfc_MST_MODE_MASTER);
+++
+++ /*
+++ * Connect internal blocks
+++ */
+++ card->regs.connect =
+++ hfc_CONNECT_B1_HFC_from_ST |
+++ hfc_CONNECT_B1_ST_from_HFC |
+++ hfc_CONNECT_B1_GCI_from_HFC |
+++ hfc_CONNECT_B2_HFC_from_ST |
+++ hfc_CONNECT_B2_ST_from_HFC |
+++ hfc_CONNECT_B2_GCI_from_HFC;
+++ hfc_outb(card, hfc_CONNECT, card->regs.connect);
+++
+++ /*
+++ * All bchans are HDLC by default, not useful, actually
+++ * since mode is set during open()
+++ */
+++ hfc_outb(card, hfc_CTMT, 0);
+++
+++ /*
+++ * bit order
+++ */
+++ hfc_outb(card, hfc_CIRM, 0);
+++
+++ /*
+++ * Enable D-rx FIFO. At least one FIFO must be enabled (by specs)
+++ */
+++ card->regs.fifo_en = hfc_FIFOEN_DRX;
+++ hfc_outb(card, hfc_FIFO_EN, card->regs.fifo_en);
+++
+++ card->late_irqs = 0;
+++
+++ /*
+++ * Clear already pending ints
+++ */
+++ hfc_inb(card, hfc_INT_S1);
+++ hfc_inb(card, hfc_INT_S2);
+++
+++ /*
+++ * Enable IRQ output
+++ */
+++ card->regs.m1 = hfc_INTS_DREC | hfc_INTS_L1STATE | hfc_INTS_TIMER;
+++ hfc_outb(card, hfc_INT_M1, card->regs.m1);
+++
+++ card->regs.m2 = hfc_M2_IRQ_ENABLE;
+++ hfc_outb(card, hfc_INT_M2, card->regs.m2);
+++
+++ /*
+++ * Unlocks the states machine
+++ */
+++ hfc_outb(card, hfc_STATES, 0);
+++
+++ /*
+++ * There's no need to explicitly activate L1 now.
+++ * Activation is managed inside the interrupt routine.
+++ */
+++}
+++
+++static void hfc_update_fifo_state(struct hfc_card *card)
+++{
+++ /*
+++ * I'm not sure if irqsave is needed but there could be a race
+++ * condition since hfc_update_fifo_state could be called from
+++ * both the IRQ handler and the *_(open|close) functions
+++ */
+++
+++ unsigned long flags;
+++ spin_lock_irqsave(&card->chans[B1].lock, flags);
+++ if (!card->fifo_suspended &&
+++ (card->chans[B1].status == open_framed ||
+++ card->chans[B1].status == open_voice)) {
+++
+++ if (!(card->regs.fifo_en & hfc_FIFOEN_B1RX)) {
+++ card->regs.fifo_en |= hfc_FIFOEN_B1RX;
+++ hfc_clear_fifo_rx(&card->chans[B1].rx);
+++ }
+++
+++ if (!(card->regs.fifo_en & hfc_FIFOEN_B1TX)) {
+++ card->regs.fifo_en |= hfc_FIFOEN_B1TX;
+++ hfc_clear_fifo_tx(&card->chans[B1].tx);
+++ }
+++ } else {
+++ if (card->regs.fifo_en & hfc_FIFOEN_B1RX)
+++ card->regs.fifo_en &= ~hfc_FIFOEN_B1RX;
+++ if (card->regs.fifo_en & hfc_FIFOEN_B1TX)
+++ card->regs.fifo_en &= ~hfc_FIFOEN_B1TX;
+++ }
+++ spin_unlock_irqrestore(&card->chans[B1].lock, flags);
+++
+++ spin_lock_irqsave(&card->chans[B2].lock, flags);
+++ if (!card->fifo_suspended &&
+++ (card->chans[B2].status == open_framed ||
+++ card->chans[B2].status == open_voice ||
+++ card->chans[B2].status == sniff_aux)) {
+++
+++ if (!(card->regs.fifo_en & hfc_FIFOEN_B2RX)) {
+++ card->regs.fifo_en |= hfc_FIFOEN_B2RX;
+++ hfc_clear_fifo_rx(&card->chans[B2].rx);
+++ }
+++
+++ if (!(card->regs.fifo_en & hfc_FIFOEN_B2TX)) {
+++ card->regs.fifo_en |= hfc_FIFOEN_B2TX;
+++ hfc_clear_fifo_tx(&card->chans[B2].tx);
+++ }
+++ } else {
+++ if (card->regs.fifo_en & hfc_FIFOEN_B2RX)
+++ card->regs.fifo_en &= ~hfc_FIFOEN_B2RX;
+++ if (card->regs.fifo_en & hfc_FIFOEN_B2TX)
+++ card->regs.fifo_en &= ~hfc_FIFOEN_B2TX;
+++ }
+++ spin_unlock_irqrestore(&card->chans[B2].lock, flags);
+++
+++ spin_lock_irqsave(&card->chans[D].lock, flags);
+++ if (!card->fifo_suspended &&
+++ card->chans[D].status == open_framed) {
+++
+++ if (!(card->regs.fifo_en & hfc_FIFOEN_DTX)) {
+++ card->regs.fifo_en |= hfc_FIFOEN_DTX;
+++
+++ card->chans[D].tx.ugly_framebuf_size = 0;
+++ card->chans[D].tx.ugly_framebuf_off = 0;
+++ }
+++ } else {
+++ if (card->regs.fifo_en & hfc_FIFOEN_DTX)
+++ card->regs.fifo_en &= ~hfc_FIFOEN_DTX;
+++ }
+++ spin_unlock_irqrestore(&card->chans[D].lock, flags);
+++
+++ hfc_outb(card, hfc_FIFO_EN, card->regs.fifo_en);
+++}
+++
+++static inline void hfc_suspend_fifo(struct hfc_card *card)
+++{
+++ card->fifo_suspended = TRUE;
+++
+++ hfc_update_fifo_state(card);
+++
+++ /*
+++ * When L1 goes down D rx receives garbage; it is nice to
+++ * clear it to avoid a CRC error on reactivation
+++ * udelay is needed because the FIFO deactivation happens
+++ * in 250us
+++ */
+++ udelay(250);
+++ hfc_clear_fifo_rx(&card->chans[D].rx);
+++
+++#ifdef DEBUG
+++ if (debug_level >= 3) {
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "FIFOs suspended\n",
+++ card->cardnum);
+++ }
+++#endif
+++}
+++
+++static inline void hfc_resume_fifo(struct hfc_card *card)
+++{
+++ card->fifo_suspended = FALSE;
+++
+++ hfc_update_fifo_state(card);
+++
+++#ifdef DEBUG
+++ if (debug_level >= 3) {
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "FIFOs resumed\n",
+++ card->cardnum);
+++ }
+++#endif
+++}
+++
+++static void hfc_check_l1_up(struct hfc_card *card)
+++{
+++ if ((!card->nt_mode && card->l1_state != 7)
+++ || (card->nt_mode && card->l1_state != 3)) {
+++
+++ hfc_outb(card, hfc_STATES, hfc_STATES_DO_ACTION |
+++ hfc_STATES_ACTIVATE|
+++ hfc_STATES_NT_G2_G3);
+++
+++ /*
+++ * 0 because this is quite verbose when an inferface is unconnected, jaw
+++ */
+++#if 0
+++ if (debug_level >= 1) {
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "L1 is down, bringing up L1.\n",
+++ card->cardnum);
+++ }
+++#endif
+++ }
+++}
+++
+++
+++/*******************
+++ * Dahdi interface *
+++ *******************/
+++
+++static int hfc_dahdi_open(struct dahdi_chan *dahdi_chan)
+++{
+++ struct hfc_chan_duplex *chan = dahdi_chan->pvt;
+++ struct hfc_card *card = chan->card;
+++
+++ spin_lock(&chan->lock);
+++
+++ switch (chan->number) {
+++ case D:
+++ if (chan->status != free &&
+++ chan->status != open_framed) {
+++ spin_unlock(&chan->lock);
+++ return -EBUSY;
+++ }
+++ chan->status = open_framed;
+++ break;
+++
+++ case B1:
+++ case B2:
+++ if (chan->status != free) {
+++ spin_unlock(&chan->lock);
+++ return -EBUSY;
+++ }
+++ chan->status = open_voice;
+++ break;
+++ }
+++
+++ chan->open_by_dahdi = TRUE;
+++ try_module_get(THIS_MODULE);
+++ spin_unlock(&chan->lock);
+++
+++ switch (chan->number) {
+++ case D:
+++ break;
+++
+++ case B1:
+++ card->regs.m2 |= hfc_M2_PROC_TRANS;
+++ /*
+++ * Enable transparent mode
+++ */
+++ card->regs.ctmt |= hfc_CTMT_TRANSB1;
+++ /*
+++ * Reversed bit order
+++ */
+++ card->regs.cirm |= hfc_CIRM_B1_REV;
+++ /*
+++ * Enable transmission
+++ */
+++ card->regs.sctrl |= hfc_SCTRL_B1_ENA;
+++ /*
+++ * Enable reception
+++ */
+++ card->regs.sctrl_r |= hfc_SCTRL_R_B1_ENA;
+++ break;
+++
+++ case B2:
+++ card->regs.m2 |= hfc_M2_PROC_TRANS;
+++ card->regs.ctmt |= hfc_CTMT_TRANSB2;
+++ card->regs.cirm |= hfc_CIRM_B2_REV;
+++ card->regs.sctrl |= hfc_SCTRL_B2_ENA;
+++ card->regs.sctrl_r |= hfc_SCTRL_R_B2_ENA;
+++ break;
+++
+++ }
+++
+++ /*
+++ * If not already enabled, enable processing transition (8KHz)
+++ * interrupt
+++ */
+++ hfc_outb(card, hfc_INT_M2, card->regs.m2);
+++ hfc_outb(card, hfc_CTMT, card->regs.ctmt);
+++ hfc_outb(card, hfc_CIRM, card->regs.cirm);
+++ hfc_outb(card, hfc_SCTRL, card->regs.sctrl);
+++ hfc_outb(card, hfc_SCTRL_R, card->regs.sctrl_r);
+++
+++ hfc_update_fifo_state(card);
+++
+++ printk(KERN_INFO hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s opened as %s.\n",
+++ card->cardnum,
+++ chan->name,
+++ dahdi_chan->name);
+++
+++ return 0;
+++}
+++
+++static int hfc_dahdi_close(struct dahdi_chan *dahdi_chan)
+++{
+++ struct hfc_chan_duplex *chan = dahdi_chan->pvt;
+++ struct hfc_card *card = chan->card;
+++
+++ if (!card) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "hfc_dahdi_close called with NULL card\n");
+++ return -1;
+++ }
+++
+++ spin_lock(&chan->lock);
+++
+++ if (chan->status == free) {
+++ spin_unlock(&chan->lock);
+++ return -EINVAL;
+++ }
+++
+++ chan->status = free;
+++ chan->open_by_dahdi = FALSE;
+++
+++ spin_unlock(&chan->lock);
+++
+++ switch (chan->number) {
+++ case D:
+++ break;
+++
+++ case B1:
+++ card->regs.ctmt &= ~hfc_CTMT_TRANSB1;
+++ card->regs.cirm &= ~hfc_CIRM_B1_REV;
+++ card->regs.sctrl &= ~hfc_SCTRL_B1_ENA;
+++ card->regs.sctrl_r &= ~hfc_SCTRL_R_B1_ENA;
+++ break;
+++
+++ case B2:
+++ card->regs.ctmt &= ~hfc_CTMT_TRANSB2;
+++ card->regs.cirm &= ~hfc_CIRM_B2_REV;
+++ card->regs.sctrl &= ~hfc_SCTRL_B2_ENA;
+++ card->regs.sctrl_r &= ~hfc_SCTRL_R_B2_ENA;
+++ break;
+++ }
+++
+++ if (card->chans[B1].status == free &&
+++ card->chans[B2].status == free)
+++ card->regs.m2 &= ~hfc_M2_PROC_TRANS;
+++
+++ hfc_outb(card, hfc_INT_M2, card->regs.m2);
+++ hfc_outb(card, hfc_CTMT, card->regs.ctmt);
+++ hfc_outb(card, hfc_CIRM, card->regs.cirm);
+++ hfc_outb(card, hfc_SCTRL, card->regs.sctrl);
+++ hfc_outb(card, hfc_SCTRL_R, card->regs.sctrl_r);
+++
+++ hfc_update_fifo_state(card);
+++
+++ module_put(THIS_MODULE);
+++
+++ printk(KERN_INFO hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s closed as %s.\n",
+++ card->cardnum,
+++ chan->name,
+++ dahdi_chan->name);
+++
+++ return 0;
+++}
+++
+++static int hfc_dahdi_rbsbits(struct dahdi_chan *chan, int bits)
+++{
+++ return 0;
+++}
+++
+++static int hfc_dahdi_ioctl(struct dahdi_chan *chan,
+++ unsigned int cmd, unsigned long data)
+++{
+++ switch (cmd) {
+++
+++ default:
+++ return -ENOTTY;
+++ }
+++
+++ return 0;
+++}
+++
+++static void hfc_hdlc_hard_xmit(struct dahdi_chan *d_chan)
+++{
+++ struct hfc_chan_duplex *chan = d_chan->pvt;
+++ struct hfc_card *card = chan->card;
+++ struct dahdi_hfc *hfccard = card->dahdi_dev;
+++
+++ atomic_inc(&hfccard->hdlc_pending);
+++
+++}
+++
+++static int hfc_dahdi_startup(struct file *file, struct dahdi_span *span)
+++{
+++ struct dahdi_hfc *dahdi_hfcs = dahdi_hfc_from_span(span);
+++ struct hfc_card *hfctmp = dahdi_hfcs->card;
+++ int alreadyrunning;
+++
+++ if (!hfctmp) {
+++ printk(KERN_INFO hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "no card for span at startup!\n",
+++ hfctmp->cardnum);
+++ }
+++
+++ alreadyrunning = span->flags & DAHDI_FLAG_RUNNING;
+++
+++ if (!alreadyrunning)
+++ span->flags |= DAHDI_FLAG_RUNNING;
+++
+++ return 0;
+++}
+++
+++static int hfc_dahdi_shutdown(struct dahdi_span *span)
+++{
+++ return 0;
+++}
+++
+++static int hfc_dahdi_maint(struct dahdi_span *span, int cmd)
+++{
+++ return 0;
+++}
+++
+++static int hfc_dahdi_chanconfig(struct file *file, struct dahdi_chan *d_chan, int sigtype)
+++{
+++ struct hfc_chan_duplex *chan = d_chan->pvt;
+++ struct hfc_card *card = chan->card;
+++ struct dahdi_hfc *hfccard = card->dahdi_dev;
+++
+++ if ((sigtype == DAHDI_SIG_HARDHDLC) && (hfccard->sigchan == d_chan)) {
+++ hfccard->sigactive = 0;
+++ atomic_set(&hfccard->hdlc_pending, 0);
+++ }
+++
+++ return 0;
+++}
+++
+++static int hfc_dahdi_spanconfig(struct file *file, struct dahdi_span *span,
+++ struct dahdi_lineconfig *lc)
+++{
+++ span->lineconfig = lc->lineconfig;
+++
+++ return 0;
+++}
+++
+++static const struct dahdi_span_ops hfc_dahdi_span_ops = {
+++ .owner = THIS_MODULE,
+++ .chanconfig = hfc_dahdi_chanconfig,
+++ .spanconfig = hfc_dahdi_spanconfig,
+++ .startup = hfc_dahdi_startup,
+++ .shutdown = hfc_dahdi_shutdown,
+++ .maint = hfc_dahdi_maint,
+++ .rbsbits = hfc_dahdi_rbsbits,
+++ .open = hfc_dahdi_open,
+++ .close = hfc_dahdi_close,
+++ .ioctl = hfc_dahdi_ioctl,
+++ .hdlc_hard_xmit = hfc_hdlc_hard_xmit
+++};
+++
+++static int hfc_dahdi_initialize(struct dahdi_hfc *hfccard)
+++{
+++ struct hfc_card *hfctmp = hfccard->card;
+++ int i;
+++
+++ hfccard->ddev = dahdi_create_device();
+++ if (!hfccard->ddev)
+++ return -ENOMEM;
+++
+++ memset(&hfccard->span, 0x0, sizeof(struct dahdi_span));
+++
+++ /*
+++ * ZTHFC
+++ *
+++ * Cards' and channels' names shall contain "ZTHFC"
+++ * as the dahdi-tools look for this string to guess framing.
+++ * We don't want to modify dahdi-tools only in order to change this.
+++ *
+++ * So we choose for a span name: DAHDI HFC-S formerly known as ZTHFC. :-)
+++ */
+++
+++ sprintf(hfccard->span.name, "DAHDI_HFCS_FKA_ZTHFC%d", hfctmp->cardnum + 1);
+++ sprintf(hfccard->span.desc,
+++ "HFC-S PCI A ISDN card %d [%s] ",
+++ hfctmp->cardnum,
+++ hfctmp->nt_mode ? "NT" : "TE");
+++ hfccard->span.spantype = hfctmp->nt_mode ? SPANTYPE_DIGITAL_BRI_NT :
+++ SPANTYPE_DIGITAL_BRI_TE;
+++ hfccard->ddev->manufacturer = "Cologne Chips";
+++ hfccard->span.flags = 0;
+++ hfccard->span.ops = &hfc_dahdi_span_ops;
+++ hfccard->ddev->devicetype = kasprintf(GFP_KERNEL, "HFC-S PCI-A ISDN");
+++ hfccard->ddev->location = kasprintf(GFP_KERNEL, "PCI Bus %02d Slot %02d",
+++ hfctmp->pcidev->bus->number,
+++ PCI_SLOT(hfctmp->pcidev->devfn) + 1);
+++ hfccard->span.chans = hfccard->_chans;
+++ hfccard->span.channels = 3;
+++ for (i = 0; i < hfccard->span.channels; i++)
+++ hfccard->_chans[i] = &hfccard->chans[i];
+++ hfccard->span.deflaw = DAHDI_LAW_ALAW;
+++ hfccard->span.linecompat = DAHDI_CONFIG_AMI | DAHDI_CONFIG_CCS;
+++ hfccard->span.offset = 0;
+++
+++ for (i = 0; i < hfccard->span.channels; i++) {
+++ memset(&hfccard->chans[i], 0x0, sizeof(struct dahdi_chan));
+++
+++ sprintf(hfccard->chans[i].name,
+++ "DAHDI_HFCS_FKA_ZTHFC%d/%d/%d",
+++ hfctmp->cardnum + 1, 0, i + 1);
+++
+++ printk(KERN_INFO hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "registered %s\n",
+++ hfctmp->cardnum,
+++ hfccard->chans[i].name);
+++
+++ if (i == hfccard->span.channels - 1) {
+++ hfccard->chans[i].sigcap = DAHDI_SIG_HARDHDLC;
+++ hfccard->sigchan = &hfccard->chans[DAHDI_D];
+++ hfccard->sigactive = 0;
+++ atomic_set(&hfccard->hdlc_pending, 0);
+++ } else {
+++ hfccard->chans[i].sigcap =
+++ DAHDI_SIG_CLEAR | DAHDI_SIG_DACS;
+++ }
+++
+++ hfccard->chans[i].chanpos = i + 1;
+++ }
+++
+++ hfccard->chans[DAHDI_D].readchunk =
+++ hfctmp->chans[D].rx.dahdi_buffer;
+++
+++ hfccard->chans[DAHDI_D].writechunk =
+++ hfctmp->chans[D].tx.dahdi_buffer;
+++
+++ hfccard->chans[DAHDI_D].pvt = &hfctmp->chans[D];
+++
+++ hfccard->chans[DAHDI_B1].readchunk =
+++ hfctmp->chans[B1].rx.dahdi_buffer;
+++
+++ hfccard->chans[DAHDI_B1].writechunk =
+++ hfctmp->chans[B1].tx.dahdi_buffer;
+++
+++ hfccard->chans[DAHDI_B1].pvt = &hfctmp->chans[B1];
+++
+++ hfccard->chans[DAHDI_B2].readchunk =
+++ hfctmp->chans[B2].rx.dahdi_buffer;
+++
+++ hfccard->chans[DAHDI_B2].writechunk =
+++ hfctmp->chans[B2].tx.dahdi_buffer;
+++
+++ hfccard->chans[DAHDI_B2].pvt = &hfctmp->chans[B2];
+++
+++ list_add_tail(&hfccard->span.device_node, &hfccard->ddev->spans);
+++ if (dahdi_register_device(hfccard->ddev, &hfccard->card->pcidev->dev)) {
+++ printk(KERN_NOTICE "Unable to register device with DAHDI\n");
+++ return -1;
+++ }
+++
+++ return 0;
+++}
+++
+++static void hfc_dahdi_transmit(struct hfc_chan_simplex *chan)
+++{
+++ hfc_fifo_put(chan, chan->dahdi_buffer, DAHDI_CHUNKSIZE);
+++}
+++
+++static void hfc_dahdi_receive(struct hfc_chan_simplex *chan)
+++{
+++ hfc_fifo_get(chan, chan->dahdi_buffer, DAHDI_CHUNKSIZE);
+++}
+++
+++/******************************************
+++ * Interrupt Handler
+++ ******************************************/
+++
+++static void hfc_handle_timer_interrupt(struct hfc_card *card);
+++static void hfc_handle_state_interrupt(struct hfc_card *card);
+++static void hfc_handle_processing_interrupt(struct hfc_card *card);
+++static void hfc_frame_arrived(struct hfc_chan_duplex *chan);
+++static void hfc_handle_voice(struct hfc_card *card);
+++
+++#if (KERNEL_VERSION(2, 6, 24) < LINUX_VERSION_CODE)
+++static irqreturn_t hfc_interrupt(int irq, void *dev_id)
+++#else
+++static irqreturn_t hfc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+++#endif
+++{
+++ struct hfc_card *card = dev_id;
+++ unsigned long flags;
+++ u8 status, s1, s2;
+++
+++ if (!card) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "spurious interrupt (IRQ %d)\n",
+++ irq);
+++ return IRQ_NONE;
+++ }
+++
+++ spin_lock_irqsave(&card->lock, flags);
+++ status = hfc_inb(card, hfc_STATUS);
+++ if (!(status & hfc_STATUS_ANYINT)) {
+++ /*
+++ * maybe we are sharing the irq
+++ */
+++ spin_unlock_irqrestore(&card->lock, flags);
+++ return IRQ_NONE;
+++ }
+++
+++ /* We used to ingore the IRQ when the card was in processing
+++ * state but apparently there is no restriction to access the
+++ * card in such state:
+++ *
+++ * Joerg Ciesielski wrote:
+++ * > There is no restriction for the IRQ handler to access
+++ * > HFC-S PCI during processing phase. A IRQ latency of 375 us
+++ * > is also no problem since there are no interrupt sources in
+++ * > HFC-S PCI which must be handled very fast.
+++ * > Due to its deep fifos the IRQ latency can be several ms with
+++ * > out the risk of loosing data. Even the S/T state interrupts
+++ * > must not be handled with a latency less than <5ms.
+++ * >
+++ * > The processing phase only indicates that HFC-S PCI is
+++ * > processing the Fifos as PCI master so that data is read and
+++ * > written in the 32k memory window. But there is no restriction
+++ * > to access data in the memory window during this time.
+++ *
+++ * // if (status & hfc_STATUS_PCI_PROC) {
+++ * // return IRQ_HANDLED;
+++ * // }
+++ */
+++
+++ s1 = hfc_inb(card, hfc_INT_S1);
+++ s2 = hfc_inb(card, hfc_INT_S2);
+++
+++ if (s1 != 0) {
+++ if (s1 & hfc_INTS_TIMER) {
+++ /*
+++ * timer (bit 7)
+++ */
+++ hfc_handle_timer_interrupt(card);
+++ }
+++
+++ if (s1 & hfc_INTS_L1STATE) {
+++ /*
+++ * state machine (bit 6)
+++ */
+++ hfc_handle_state_interrupt(card);
+++ }
+++
+++ if (s1 & hfc_INTS_DREC) {
+++ /*
+++ * D chan RX (bit 5)
+++ */
+++ hfc_frame_arrived(&card->chans[D]);
+++ }
+++
+++ if (s1 & hfc_INTS_B1REC) {
+++ /*
+++ * B1 chan RX (bit 3)
+++ */
+++ hfc_frame_arrived(&card->chans[B1]);
+++ }
+++
+++ if (s1 & hfc_INTS_B2REC) {
+++ /*
+++ * B2 chan RX (bit 4)
+++ */
+++ hfc_frame_arrived(&card->chans[B2]);
+++ }
+++
+++ if (s1 & hfc_INTS_DTRANS) {
+++ /*
+++ * D chan TX (bit 2)
+++ */
+++ }
+++
+++ if (s1 & hfc_INTS_B1TRANS) {
+++ /*
+++ * B1 chan TX (bit 0)
+++ */
+++ }
+++
+++ if (s1 & hfc_INTS_B2TRANS) {
+++ /*
+++ * B2 chan TX (bit 1)
+++ */
+++ }
+++
+++ }
+++
+++ if (s2 != 0) {
+++ if (s2 & hfc_M2_PMESEL) {
+++ /*
+++ * kaboom irq (bit 7)
+++ *
+++ * CologneChip says:
+++ *
+++ * the meaning of this fatal error bit is that HFC-S
+++ * PCI as PCI master could not access the PCI bus
+++ * within 125us to finish its data processing. If this
+++ * happens only very seldom it does not cause big
+++ * problems but of course some B-channel or D-channel
+++ * data will be corrupted due to this event.
+++ *
+++ * Unfortunately this bit is only set once after the
+++ * problem occurs and can only be reseted by a
+++ * software reset. That means it is not easily
+++ * possible to check how often this fatal error
+++ * happens.
+++ *
+++ */
+++
+++ if (!card->sync_loss_reported) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "sync lost, pci performance too low!\n",
+++ card->cardnum);
+++
+++ card->sync_loss_reported = TRUE;
+++ }
+++ }
+++
+++ if (s2 & hfc_M2_GCI_MON_REC) {
+++ /*
+++ * RxR monitor channel (bit 2)
+++ */
+++ }
+++
+++ if (s2 & hfc_M2_GCI_I_CHG) {
+++ /*
+++ * GCI I-change (bit 1)
+++ */
+++ }
+++
+++ if (s2 & hfc_M2_PROC_TRANS) {
+++ /*
+++ * processing/non-processing transition (bit 0)
+++ */
+++ hfc_handle_processing_interrupt(card);
+++ }
+++
+++ }
+++
+++ spin_unlock_irqrestore(&card->lock, flags);
+++
+++ return IRQ_HANDLED;
+++}
+++
+++static void hfc_handle_timer_interrupt(struct hfc_card *card)
+++{
+++ if (card->ignore_first_timer_interrupt) {
+++ card->ignore_first_timer_interrupt = FALSE;
+++ return;
+++ }
+++
+++ if ((card->nt_mode && card->l1_state == 3) ||
+++ (!card->nt_mode && card->l1_state == 7)) {
+++
+++ card->regs.ctmt &= ~hfc_CTMT_TIMER_MASK;
+++ hfc_outb(card, hfc_CTMT, card->regs.ctmt);
+++
+++ hfc_resume_fifo(card);
+++ }
+++}
+++
+++static void hfc_handle_state_interrupt(struct hfc_card *card)
+++{
+++ u8 new_state = hfc_inb(card, hfc_STATES) & hfc_STATES_STATE_MASK;
+++
+++#ifdef DEBUG
+++ if (debug_level >= 1) {
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "layer 1 state = %c%d\n",
+++ card->cardnum,
+++ card->nt_mode ? 'G' : 'F',
+++ new_state);
+++ }
+++#endif
+++
+++ if (card->nt_mode) {
+++ /*
+++ * NT mode
+++ */
+++
+++ if (new_state == 3) {
+++ /*
+++ * fix to G3 state (see specs)
+++ */
+++ hfc_outb(card, hfc_STATES, hfc_STATES_LOAD_STATE | 3);
+++ }
+++
+++ if (new_state == 3 && card->l1_state != 3)
+++ hfc_resume_fifo(card);
+++
+++ if (new_state != 3 && card->l1_state == 3)
+++ hfc_suspend_fifo(card);
+++
+++ } else {
+++ if (new_state == 3) {
+++ /*
+++ * Keep L1 up... zaptel & libpri expects
+++ * a always up L1...
+++ * Enable only when using an unpatched libpri
+++ *
+++ * Are we still using unpatched libpri? Is this tested at runtime???
+++ * Does it only affect zaptel or DAHDI, too?
+++ */
+++
+++ if (force_l1_up) {
+++ hfc_outb(card, hfc_STATES,
+++ hfc_STATES_DO_ACTION |
+++ hfc_STATES_ACTIVATE|
+++ hfc_STATES_NT_G2_G3);
+++ }
+++ }
+++
+++ if (new_state == 7 && card->l1_state != 7) {
+++ /*
+++ * TE is now active, schedule FIFO activation after
+++ * some time, otherwise the first frames are lost
+++ */
+++
+++ card->regs.ctmt |= hfc_CTMT_TIMER_50 |
+++ hfc_CTMT_TIMER_CLEAR;
+++ hfc_outb(card, hfc_CTMT, card->regs.ctmt);
+++
+++ /*
+++ * Activating the timer firest an
+++ * interrupt immediately, we
+++ * obviously need to ignore it
+++ */
+++ card->ignore_first_timer_interrupt = TRUE;
+++ }
+++
+++ if (new_state != 7 && card->l1_state == 7) {
+++ /*
+++ * TE has become inactive, disable FIFO
+++ */
+++ hfc_suspend_fifo(card);
+++ }
+++ }
+++
+++ card->l1_state = new_state;
+++}
+++
+++static void hfc_handle_processing_interrupt(struct hfc_card *card)
+++{
+++ int available_bytes = 0;
+++
+++ /*
+++ * Synchronize with the first enabled channel
+++ */
+++ if (card->regs.fifo_en & hfc_FIFOEN_B1RX)
+++ available_bytes = hfc_fifo_used_rx(&card->chans[B1].rx);
+++ if (card->regs.fifo_en & hfc_FIFOEN_B2RX)
+++ available_bytes = hfc_fifo_used_rx(&card->chans[B2].rx);
+++ else
+++ available_bytes = -1;
+++
+++ if ((available_bytes == -1 && card->ticks == 8) ||
+++ available_bytes >= DAHDI_CHUNKSIZE + hfc_RX_FIFO_PRELOAD) {
+++ card->ticks = 0;
+++
+++ if (available_bytes > DAHDI_CHUNKSIZE*2 + hfc_RX_FIFO_PRELOAD) {
+++ card->late_irqs++;
+++ /*
+++ * we are out of sync, clear fifos, jaw
+++ */
+++ hfc_clear_fifo_rx(&card->chans[B1].rx);
+++ hfc_clear_fifo_tx(&card->chans[B1].tx);
+++ hfc_clear_fifo_rx(&card->chans[B2].rx);
+++ hfc_clear_fifo_tx(&card->chans[B2].tx);
+++
+++#ifdef DEBUG
+++ if (debug_level >= 4) {
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "late IRQ, %d bytes late\n",
+++ card->cardnum,
+++ available_bytes -
+++ (DAHDI_CHUNKSIZE +
+++ hfc_RX_FIFO_PRELOAD));
+++ }
+++#endif
+++ } else {
+++ hfc_handle_voice(card);
+++ }
+++ }
+++
+++ card->ticks++;
+++}
+++
+++
+++static void hfc_handle_voice(struct hfc_card *card)
+++{
+++ struct dahdi_hfc *hfccard = card->dahdi_dev;
+++ int frame_left, res;
+++ unsigned char buf[hfc_HDLC_BUF_LEN];
+++ unsigned int size = sizeof(buf) / sizeof(buf[0]);
+++
+++
+++ if (card->chans[B1].status != open_voice &&
+++ card->chans[B2].status != open_voice)
+++ return;
+++
+++ dahdi_transmit(&hfccard->span);
+++
+++ if (card->regs.fifo_en & hfc_FIFOEN_B1TX)
+++ hfc_dahdi_transmit(&card->chans[B1].tx);
+++ if (card->regs.fifo_en & hfc_FIFOEN_B2TX)
+++ hfc_dahdi_transmit(&card->chans[B2].tx);
+++
+++ /*
+++ * dahdi hdlc frame tx
+++ */
+++
+++ if (atomic_read(&hfccard->hdlc_pending)) {
+++ hfc_check_l1_up(card);
+++ res = dahdi_hdlc_getbuf(hfccard->sigchan, buf, &size);
+++ if (size > 0) {
+++ hfccard->sigactive = 1;
+++ memcpy(card->chans[D].tx.ugly_framebuf +
+++ card->chans[D].tx.ugly_framebuf_size,
+++ buf, size);
+++ card->chans[D].tx.ugly_framebuf_size += size;
+++ if (res != 0) {
+++ hfc_fifo_put_frame(&card->chans[D].tx,
+++ card->chans[D].tx.ugly_framebuf,
+++ card->chans[D].tx.ugly_framebuf_size);
+++ ++hfccard->frames_out;
+++ hfccard->sigactive = 0;
+++ card->chans[D].tx.ugly_framebuf_size
+++ = 0;
+++ atomic_dec(&hfccard->hdlc_pending);
+++ }
+++ }
+++ }
+++ /*
+++ * dahdi hdlc frame tx done
+++ */
+++
+++ if (card->regs.fifo_en & hfc_FIFOEN_B1RX)
+++ hfc_dahdi_receive(&card->chans[B1].rx);
+++ else
+++ memset(&card->chans[B1].rx.dahdi_buffer, 0x7f,
+++ sizeof(card->chans[B1].rx.dahdi_buffer));
+++
+++ if (card->regs.fifo_en & hfc_FIFOEN_B2RX)
+++ hfc_dahdi_receive(&card->chans[B2].rx);
+++ else
+++ memset(&card->chans[B2].rx.dahdi_buffer, 0x7f,
+++ sizeof(card->chans[B1].rx.dahdi_buffer));
+++
+++ /*
+++ * Echo cancellation
+++ */
+++ dahdi_ec_chunk(&hfccard->chans[DAHDI_B1],
+++ card->chans[B1].rx.dahdi_buffer,
+++ card->chans[B1].tx.dahdi_buffer);
+++ dahdi_ec_chunk(&hfccard->chans[DAHDI_B2],
+++ card->chans[B2].rx.dahdi_buffer,
+++ card->chans[B2].tx.dahdi_buffer);
+++
+++ /*
+++ * dahdi hdlc frame rx
+++ */
+++ if (hfc_fifo_has_frames(&card->chans[D].rx))
+++ hfc_frame_arrived(&card->chans[D]);
+++
+++ if (card->chans[D].rx.ugly_framebuf_size) {
+++ frame_left = card->chans[D].rx.ugly_framebuf_size -
+++ card->chans[D].rx.ugly_framebuf_off ;
+++ if (frame_left > hfc_HDLC_BUF_LEN) {
+++ dahdi_hdlc_putbuf(hfccard->sigchan,
+++ card->chans[D].rx.ugly_framebuf +
+++ card->chans[D].rx.ugly_framebuf_off,
+++ hfc_HDLC_BUF_LEN);
+++ card->chans[D].rx.ugly_framebuf_off +=
+++ hfc_HDLC_BUF_LEN;
+++ } else {
+++ dahdi_hdlc_putbuf(hfccard->sigchan,
+++ card->chans[D].rx.ugly_framebuf +
+++ card->chans[D].rx.ugly_framebuf_off,
+++ frame_left);
+++ dahdi_hdlc_finish(hfccard->sigchan);
+++ card->chans[D].rx.ugly_framebuf_size = 0;
+++ card->chans[D].rx.ugly_framebuf_off = 0;
+++ }
+++ }
+++ /*
+++ * dahdi hdlc frame rx done
+++ */
+++
+++ if (hfccard->span.flags & DAHDI_FLAG_RUNNING)
+++ dahdi_receive(&hfccard->span);
+++
+++}
+++
+++static void hfc_frame_arrived(struct hfc_chan_duplex *chan)
+++{
+++ struct hfc_card *card = chan->card;
+++ int antiloop = 16;
+++ struct sk_buff *skb;
+++
+++ while (hfc_fifo_has_frames(&chan->rx) && --antiloop) {
+++ int frame_size = hfc_fifo_get_frame_size(&chan->rx);
+++
+++ if (frame_size < 3) {
+++#ifdef DEBUG
+++ if (debug_level >= 2)
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "invalid frame received, "
+++ "just %d bytes\n",
+++ card->cardnum,
+++ chan->name,
+++ frame_size);
+++#endif
+++
+++ hfc_fifo_drop_frame(&chan->rx);
+++
+++
+++ continue;
+++ } else if (frame_size == 3) {
+++#ifdef DEBUG
+++ if (debug_level >= 2)
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "empty frame received\n",
+++ card->cardnum,
+++ chan->name);
+++#endif
+++
+++ hfc_fifo_drop_frame(&chan->rx);
+++
+++
+++ continue;
+++ }
+++
+++ if (chan->open_by_dahdi &&
+++ card->chans[D].rx.ugly_framebuf_size) {
+++
+++ /*
+++ * We have to wait for Dahdi to transmit the
+++ * frame... wait for next time
+++ */
+++
+++ break;
+++ }
+++
+++ skb = dev_alloc_skb(frame_size - 3);
+++
+++ if (!skb) {
+++ printk(KERN_ERR hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "cannot allocate skb: frame dropped\n",
+++ card->cardnum,
+++ chan->name);
+++
+++ hfc_fifo_drop_frame(&chan->rx);
+++
+++
+++ continue;
+++ }
+++
+++
+++ /*
+++ * HFC does the checksum
+++ */
+++#ifndef CHECKSUM_HW
+++ skb->ip_summed = CHECKSUM_COMPLETE;
+++#else
+++ skb->ip_summed = CHECKSUM_HW;
+++#endif
+++
+++ if (chan->open_by_dahdi) {
+++ card->chans[D].rx.ugly_framebuf_size = frame_size - 1;
+++
+++ if (hfc_fifo_get_frame(&card->chans[D].rx,
+++ card->chans[D].rx.ugly_framebuf,
+++ frame_size - 1) == -1) {
+++ dev_kfree_skb(skb);
+++ continue;
+++ }
+++
+++ memcpy(skb_put(skb, frame_size - 3),
+++ card->chans[D].rx.ugly_framebuf,
+++ frame_size - 3);
+++ } else {
+++ if (hfc_fifo_get_frame(&chan->rx,
+++ skb_put(skb, frame_size - 3),
+++ frame_size - 3) == -1) {
+++ dev_kfree_skb(skb);
+++ continue;
+++ }
+++ }
+++ }
+++
+++ if (!antiloop)
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "Infinite loop detected\n",
+++ card->cardnum);
+++}
+++
+++/******************************************
+++ * Module initialization and cleanup
+++ ******************************************/
+++
+++static int __devinit hfc_probe(struct pci_dev *pci_dev,
+++ const struct pci_device_id *ent)
+++{
+++ static int cardnum;
+++ int err;
+++ int i;
+++
+++ struct hfc_card *card = NULL;
+++ struct dahdi_hfc *dahdi_hfcs = NULL;
+++ card = kmalloc(sizeof(struct hfc_card), GFP_KERNEL);
+++ if (!card) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "unable to kmalloc!\n");
+++ err = -ENOMEM;
+++ goto err_alloc_hfccard;
+++ }
+++
+++ memset(card, 0x00, sizeof(struct hfc_card));
+++ card->cardnum = cardnum;
+++ card->pcidev = pci_dev;
+++ spin_lock_init(&card->lock);
+++
+++ pci_set_drvdata(pci_dev, card);
+++
+++ err = pci_enable_device(pci_dev);
+++ if (err)
+++ goto err_pci_enable_device;
+++
+++ err = pci_set_dma_mask(pci_dev, PCI_DMA_32BIT);
+++ if (err) {
+++ printk(KERN_ERR hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "No suitable DMA configuration available.\n",
+++ card->cardnum);
+++ goto err_pci_set_dma_mask;
+++ }
+++
+++ pci_write_config_word(pci_dev, PCI_COMMAND, PCI_COMMAND_MEMORY);
+++ err = pci_request_regions(pci_dev, hfc_DRIVER_NAME);
+++ if (err) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "cannot request I/O memory region\n",
+++ card->cardnum);
+++ goto err_pci_request_regions;
+++ }
+++
+++ pci_set_master(pci_dev);
+++
+++ if (!pci_dev->irq) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "no irq!\n",
+++ card->cardnum);
+++ err = -ENODEV;
+++ goto err_noirq;
+++ }
+++
+++ card->io_bus_mem = pci_resource_start(pci_dev, 1);
+++ if (!card->io_bus_mem) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "no iomem!\n",
+++ card->cardnum);
+++ err = -ENODEV;
+++ goto err_noiobase;
+++ }
+++
+++ card->io_mem = ioremap(card->io_bus_mem, hfc_PCI_MEM_SIZE);
+++ if (!(card->io_mem)) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "cannot ioremap I/O memory\n",
+++ card->cardnum);
+++ err = -ENODEV;
+++ goto err_ioremap;
+++ }
+++
+++ /*
+++ * pci_alloc_consistent guarantees alignment
+++ * (Documentation/DMA-mapping.txt)
+++ */
+++ card->fifo_mem = pci_alloc_consistent(pci_dev,
+++ hfc_FIFO_SIZE, &card->fifo_bus_mem);
+++ if (!card->fifo_mem) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "unable to allocate FIFO DMA memory!\n",
+++ card->cardnum);
+++ err = -ENOMEM;
+++ goto err_alloc_fifo;
+++ }
+++
+++ memset(card->fifo_mem, 0x00, hfc_FIFO_SIZE);
+++
+++ card->fifos = card->fifo_mem;
+++
+++ pci_write_config_dword(card->pcidev, hfc_PCI_MWBA, card->fifo_bus_mem);
+++
+++ err = request_irq(card->pcidev->irq, &hfc_interrupt,
+++
+++#if (KERNEL_VERSION(2, 6, 23) < LINUX_VERSION_CODE)
+++ IRQF_SHARED, hfc_DRIVER_NAME, card);
+++#else
+++ SA_SHIRQ, hfc_DRIVER_NAME, card);
+++#endif
+++
+++ if (err) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "unable to register irq\n",
+++ card->cardnum);
+++ goto err_request_irq;
+++ }
+++
+++ card->nt_mode = FALSE;
+++
+++ if (modes & (1 << card->cardnum))
+++ card->nt_mode = TRUE;
+++
+++ for (i = 0; i < nt_modes_count; i++) {
+++ if (nt_modes[i] == card->cardnum)
+++ card->nt_mode = TRUE;
+++ }
+++
+++ /*
+++ * D Channel
+++ */
+++ card->chans[D].card = card;
+++ card->chans[D].name = "D";
+++ card->chans[D].status = free;
+++ card->chans[D].number = D;
+++ spin_lock_init(&card->chans[D].lock);
+++
+++ card->chans[D].rx.chan = &card->chans[D];
+++ card->chans[D].rx.fifo_base = card->fifos + 0x4000;
+++ card->chans[D].rx.z_base = card->fifos + 0x4000;
+++ card->chans[D].rx.z1_base = card->fifos + 0x6080;
+++ card->chans[D].rx.z2_base = card->fifos + 0x6082;
+++ card->chans[D].rx.z_min = 0x0000;
+++ card->chans[D].rx.z_max = 0x01FF;
+++ card->chans[D].rx.f_min = 0x10;
+++ card->chans[D].rx.f_max = 0x1F;
+++ card->chans[D].rx.f1 = card->fifos + 0x60a0;
+++ card->chans[D].rx.f2 = card->fifos + 0x60a1;
+++ card->chans[D].rx.fifo_size = card->chans[D].rx.z_max
+++ - card->chans[D].rx.z_min + 1;
+++ card->chans[D].rx.f_num = card->chans[D].rx.f_max
+++ - card->chans[D].rx.f_min + 1;
+++
+++ card->chans[D].tx.chan = &card->chans[D];
+++ card->chans[D].tx.fifo_base = card->fifos + 0x0000;
+++ card->chans[D].tx.z_base = card->fifos + 0x0000;
+++ card->chans[D].tx.z1_base = card->fifos + 0x2080;
+++ card->chans[D].tx.z2_base = card->fifos + 0x2082;
+++ card->chans[D].tx.z_min = 0x0000;
+++ card->chans[D].tx.z_max = 0x01FF;
+++ card->chans[D].tx.f_min = 0x10;
+++ card->chans[D].tx.f_max = 0x1F;
+++ card->chans[D].tx.f1 = card->fifos + 0x20a0;
+++ card->chans[D].tx.f2 = card->fifos + 0x20a1;
+++ card->chans[D].tx.fifo_size = card->chans[D].tx.z_max -
+++ card->chans[D].tx.z_min + 1;
+++ card->chans[D].tx.f_num = card->chans[D].tx.f_max -
+++ card->chans[D].tx.f_min + 1;
+++
+++ /*
+++ * B1 Channel
+++ */
+++ card->chans[B1].card = card;
+++ card->chans[B1].name = "B1";
+++ card->chans[B1].status = free;
+++ card->chans[B1].number = B1;
+++ card->chans[B1].protocol = 0;
+++ spin_lock_init(&card->chans[B1].lock);
+++
+++ card->chans[B1].rx.chan = &card->chans[B1];
+++ card->chans[B1].rx.fifo_base = card->fifos + 0x4200;
+++ card->chans[B1].rx.z_base = card->fifos + 0x4000;
+++ card->chans[B1].rx.z1_base = card->fifos + 0x6000;
+++ card->chans[B1].rx.z2_base = card->fifos + 0x6002;
+++ card->chans[B1].rx.z_min = 0x0200;
+++ card->chans[B1].rx.z_max = 0x1FFF;
+++ card->chans[B1].rx.f_min = 0x00;
+++ card->chans[B1].rx.f_max = 0x1F;
+++ card->chans[B1].rx.f1 = card->fifos + 0x6080;
+++ card->chans[B1].rx.f2 = card->fifos + 0x6081;
+++ card->chans[B1].rx.fifo_size = card->chans[B1].rx.z_max -
+++ card->chans[B1].rx.z_min + 1;
+++ card->chans[B1].rx.f_num = card->chans[B1].rx.f_max -
+++ card->chans[B1].rx.f_min + 1;
+++
+++ card->chans[B1].tx.chan = &card->chans[B1];
+++ card->chans[B1].tx.fifo_base = card->fifos + 0x0200;
+++ card->chans[B1].tx.z_base = card->fifos + 0x0000;
+++ card->chans[B1].tx.z1_base = card->fifos + 0x2000;
+++ card->chans[B1].tx.z2_base = card->fifos + 0x2002;
+++ card->chans[B1].tx.z_min = 0x0200;
+++ card->chans[B1].tx.z_max = 0x1FFF;
+++ card->chans[B1].tx.f_min = 0x00;
+++ card->chans[B1].tx.f_max = 0x1F;
+++ card->chans[B1].tx.f1 = card->fifos + 0x2080;
+++ card->chans[B1].tx.f2 = card->fifos + 0x2081;
+++ card->chans[B1].tx.fifo_size = card->chans[B1].tx.z_max -
+++ card->chans[B1].tx.z_min + 1;
+++ card->chans[B1].tx.f_num = card->chans[B1].tx.f_max -
+++ card->chans[B1].tx.f_min + 1;
+++
+++ /*
+++ * B2 Channel
+++ */
+++ card->chans[B2].card = card;
+++ card->chans[B2].name = "B2";
+++ card->chans[B2].status = free;
+++ card->chans[B2].number = B2;
+++ card->chans[B2].protocol = 0;
+++ spin_lock_init(&card->chans[B2].lock);
+++
+++ card->chans[B2].rx.chan = &card->chans[B2];
+++ card->chans[B2].rx.fifo_base = card->fifos + 0x6200,
+++ card->chans[B2].rx.z_base = card->fifos + 0x6000;
+++ card->chans[B2].rx.z1_base = card->fifos + 0x6100;
+++ card->chans[B2].rx.z2_base = card->fifos + 0x6102;
+++ card->chans[B2].rx.z_min = 0x0200;
+++ card->chans[B2].rx.z_max = 0x1FFF;
+++ card->chans[B2].rx.f_min = 0x00;
+++ card->chans[B2].rx.f_max = 0x1F;
+++ card->chans[B2].rx.f1 = card->fifos + 0x6180;
+++ card->chans[B2].rx.f2 = card->fifos + 0x6181;
+++ card->chans[B2].rx.fifo_size = card->chans[B2].rx.z_max -
+++ card->chans[B2].rx.z_min + 1;
+++ card->chans[B2].rx.f_num = card->chans[B2].rx.f_max -
+++ card->chans[B2].rx.f_min + 1;
+++
+++ card->chans[B2].tx.chan = &card->chans[B2];
+++ card->chans[B2].tx.fifo_base = card->fifos + 0x2200;
+++ card->chans[B2].tx.z_base = card->fifos + 0x2000;
+++ card->chans[B2].tx.z1_base = card->fifos + 0x2100;
+++ card->chans[B2].tx.z2_base = card->fifos + 0x2102;
+++ card->chans[B2].tx.z_min = 0x0200;
+++ card->chans[B2].tx.z_max = 0x1FFF;
+++ card->chans[B2].tx.f_min = 0x00;
+++ card->chans[B2].tx.f_max = 0x1F;
+++ card->chans[B2].tx.f1 = card->fifos + 0x2180;
+++ card->chans[B2].tx.f2 = card->fifos + 0x2181;
+++ card->chans[B2].tx.fifo_size = card->chans[B2].tx.z_max -
+++ card->chans[B2].tx.z_min + 1;
+++ card->chans[B2].tx.f_num = card->chans[B2].tx.f_max -
+++ card->chans[B2].tx.f_min + 1;
+++
+++ /*
+++ * All done
+++ */
+++
+++ dahdi_hfcs = kmalloc(sizeof(struct dahdi_hfc), GFP_KERNEL);
+++ if (!dahdi_hfcs) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "unable to kmalloc!\n");
+++ goto err_request_irq;
+++ }
+++ memset(dahdi_hfcs, 0x0, sizeof(struct dahdi_hfc));
+++
+++ dahdi_hfcs->card = card;
+++ hfc_dahdi_initialize(dahdi_hfcs);
+++ card->dahdi_dev = dahdi_hfcs;
+++
+++ snprintf(card->proc_dir_name,
+++ sizeof(card->proc_dir_name),
+++ "%d", card->cardnum);
+++ card->proc_dir = proc_mkdir(card->proc_dir_name, hfc_proc_dahdi_hfcs_dir);
+++ SET_PROC_DIRENTRY_OWNER(card->proc_dir);
+++
+++ hfc_resetCard(card);
+++
+++ printk(KERN_INFO hfc_DRIVER_PREFIX
+++ "card %d configured for %s mode at mem %#lx (0x%p) IRQ %u\n",
+++ card->cardnum,
+++ card->nt_mode ? "NT" : "TE",
+++ card->io_bus_mem,
+++ card->io_mem,
+++ card->pcidev->irq);
+++
+++ cardnum++;
+++
+++ return 0;
+++
+++err_request_irq:
+++ pci_free_consistent(pci_dev, hfc_FIFO_SIZE,
+++ card->fifo_mem, card->fifo_bus_mem);
+++err_alloc_fifo:
+++ iounmap(card->io_mem);
+++err_ioremap:
+++err_noiobase:
+++err_noirq:
+++ pci_release_regions(pci_dev);
+++err_pci_request_regions:
+++err_pci_set_dma_mask:
+++err_pci_enable_device:
+++ kfree(card);
+++err_alloc_hfccard:
+++ return err;
+++}
+++
+++static void __devexit hfc_remove(struct pci_dev *pci_dev)
+++{
+++ struct hfc_card *card = pci_get_drvdata(pci_dev);
+++
+++
+++ printk(KERN_INFO hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "shutting down card at %p.\n",
+++ card->cardnum,
+++ card->io_mem);
+++
+++ if (!card) {
+++ return;
+++ }
+++
+++ hfc_softreset(card);
+++
+++ dahdi_unregister_device(card->dahdi_dev->ddev);
+++
+++
+++ /*
+++ * disable memio and bustmaster
+++ */
+++ pci_write_config_word(pci_dev, PCI_COMMAND, 0);
+++
+++/*
+++BUG: these proc entries just cause Call traces, so removed.
+++ remove_proc_entry("bufs", card->proc_dir);
+++ remove_proc_entry("fifos", card->proc_dir);
+++ remove_proc_entry("info", card->proc_dir);
+++*/
+++ remove_proc_entry(card->proc_dir_name, hfc_proc_dahdi_hfcs_dir);
+++
+++ free_irq(pci_dev->irq, card);
+++
+++ pci_free_consistent(pci_dev, hfc_FIFO_SIZE,
+++ card->fifo_mem, card->fifo_bus_mem);
+++
+++ iounmap(card->io_mem);
+++
+++ pci_release_regions(pci_dev);
+++
+++ pci_disable_device(pci_dev);
+++
+++ kfree(card);
+++}
+++
+++/******************************************
+++ * Module stuff
+++ ******************************************/
+++
+++static int __init hfc_init_module(void)
+++{
+++ int ret;
+++
+++ printk(KERN_INFO hfc_DRIVER_PREFIX
+++ hfc_DRIVER_STRING " loading\n");
+++#ifdef DEBUG
+++printk(KERN_INFO hfc_DRIVER_PREFIX "Check /var/log/kern-debug.log for debugging output level %d.", debug_level);
+++printk(KERN_DEBUG hfc_DRIVER_PREFIX "base.c is debugging.");
+++#endif
+++
+++#if (KERNEL_VERSION(2, 6, 26) <= LINUX_VERSION_CODE)
+++ hfc_proc_dahdi_hfcs_dir = proc_mkdir(hfc_DRIVER_NAME, NULL);
+++#else
+++ hfc_proc_dahdi_hfcs_dir = proc_mkdir(hfc_DRIVER_NAME, proc_root_driver);
+++#endif
+++
+++ ret = dahdi_pci_module(&hfc_driver);
+++ return ret;
+++}
+++
+++module_init(hfc_init_module);
+++
+++static void __exit hfc_module_exit(void)
+++{
+++ pci_unregister_driver(&hfc_driver);
+++
+++#if (KERNEL_VERSION(2, 6, 26) <= LINUX_VERSION_CODE)
+++ remove_proc_entry(hfc_DRIVER_NAME, NULL);
+++#else
+++ remove_proc_entry(hfc_DRIVER_NAME, proc_root_driver);
+++#endif
+++
+++ printk(KERN_INFO hfc_DRIVER_PREFIX
+++ hfc_DRIVER_STRING " unloaded\n");
+++}
+++
+++module_exit(hfc_module_exit);
+++
+++#endif
+++
+++MODULE_DESCRIPTION(hfc_DRIVER_DESCR);
+++MODULE_AUTHOR("Jens Wilke <jw_vzaphfc@headissue.com>, "
+++ "Daniele (Vihai) Orlandi <daniele@orlandi.com>, "
+++ "Jose A. Deniz <odicha@hotmail.com>");
+++MODULE_ALIAS("dahdi_hfcs");
+++#ifdef MODULE_LICENSE
+++MODULE_LICENSE("GPL");
+++#endif
+++
+++
+++module_param(modes, int, 0444);
+++
+++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 10)
+++module_param_array(nt_modes, int, &nt_modes_count, 0444);
+++#else
+++module_param_array(nt_modes, int, nt_modes_count, 0444);
+++#endif
+++
+++module_param(force_l1_up, int, 0444);
+++#ifdef DEBUG
+++module_param(debug_level, int, 0444);
+++#endif
+++
+++MODULE_PARM_DESC(modes, "[Deprecated] bit-mask to configure NT mode");
+++MODULE_PARM_DESC(nt_modes,
+++ "Comma-separated list of card IDs to configure in NT mode");
+++MODULE_PARM_DESC(force_l1_up, "Don't allow L1 to go down");
+++#ifdef DEBUG
+++MODULE_PARM_DESC(debug_level, "Debug verbosity level");
+++#endif
++--- /dev/null
+++++ b/drivers/dahdi/hfcs/dahdi_hfcs.h
++@@ -0,0 +1,419 @@
+++/*
+++ * dahdi_hfcs.h - Dahdi driver for HFC-S PCI A based ISDN BRI cards
+++ *
+++ * Dahdi port by Jose A. Deniz <odicha@hotmail.com>
+++ *
+++ * Copyright (C) 2009 Jose A. Deniz
+++ * Copyright (C) 2006 headissue GmbH; Jens Wilke
+++ * Copyright (C) 2004 Daniele Orlandi
+++ * Copyright (C) 2002, 2003, 2004, Junghanns.NET GmbH
+++ *
+++ * Jens Wilke <jw_vzaphfc@headissue.com>
+++ *
+++ * Orginal author of this code is
+++ * Daniele "Vihai" Orlandi <daniele@orlandi.com>
+++ *
+++ * Major rewrite of the driver made by
+++ * Klaus-Peter Junghanns <kpj@junghanns.net>
+++ *
+++ * This program is free software and may be modified and
+++ * distributed under the terms of the GNU Public License.
+++ *
+++ */
+++
+++#ifndef _HFC_ZAPHFC_H
+++#define _HFC_ZAPHFC_H
+++
+++#include <asm/io.h>
+++
+++#define hfc_DRIVER_NAME "dahdi_hfcs"
+++#define hfc_DRIVER_PREFIX hfc_DRIVER_NAME ": "
+++#define hfc_DRIVER_DESCR "HFC-S PCI A ISDN"
+++#define hfc_DRIVER_VERSION "1.42"
+++#define hfc_DRIVER_STRING hfc_DRIVER_DESCR " (V" hfc_DRIVER_VERSION ")"
+++
+++#define hfc_MAX_BOARDS 32
+++
+++#ifndef PCI_DMA_32BIT
+++#define PCI_DMA_32BIT 0x00000000ffffffffULL
+++#endif
+++
+++#ifndef PCI_VENDOR_ID_SITECOM
+++#define PCI_VENDOR_ID_SITECOM 0x182D
+++#endif
+++
+++#ifndef PCI_DEVICE_ID_SITECOM_3069
+++#define PCI_DEVICE_ID_SITECOM_3069 0x3069
+++#endif
+++
+++#define hfc_RESET_DELAY 20
+++
+++#define hfc_CLKDEL_TE 0x0f /* CLKDEL in TE mode */
+++#define hfc_CLKDEL_NT 0x6c /* CLKDEL in NT mode */
+++
+++/* PCI memory mapped I/O */
+++
+++#define hfc_PCI_MEM_SIZE 0x0100
+++#define hfc_PCI_MWBA 0x80
+++
+++/* GCI/IOM bus monitor registers */
+++
+++#define hfc_C_I 0x08
+++#define hfc_TRxR 0x0C
+++#define hfc_MON1_D 0x28
+++#define hfc_MON2_D 0x2C
+++
+++
+++/* GCI/IOM bus timeslot registers */
+++
+++#define hfc_B1_SSL 0x80
+++#define hfc_B2_SSL 0x84
+++#define hfc_AUX1_SSL 0x88
+++#define hfc_AUX2_SSL 0x8C
+++#define hfc_B1_RSL 0x90
+++#define hfc_B2_RSL 0x94
+++#define hfc_AUX1_RSL 0x98
+++#define hfc_AUX2_RSL 0x9C
+++
+++/* GCI/IOM bus data registers */
+++
+++#define hfc_B1_D 0xA0
+++#define hfc_B2_D 0xA4
+++#define hfc_AUX1_D 0xA8
+++#define hfc_AUX2_D 0xAC
+++
+++/* GCI/IOM bus configuration registers */
+++
+++#define hfc_MST_EMOD 0xB4
+++#define hfc_MST_MODE 0xB8
+++#define hfc_CONNECT 0xBC
+++
+++
+++/* Interrupt and status registers */
+++
+++#define hfc_FIFO_EN 0x44
+++#define hfc_TRM 0x48
+++#define hfc_B_MODE 0x4C
+++#define hfc_CHIP_ID 0x58
+++#define hfc_CIRM 0x60
+++#define hfc_CTMT 0x64
+++#define hfc_INT_M1 0x68
+++#define hfc_INT_M2 0x6C
+++#define hfc_INT_S1 0x78
+++#define hfc_INT_S2 0x7C
+++#define hfc_STATUS 0x70
+++
+++/* S/T section registers */
+++
+++#define hfc_STATES 0xC0
+++#define hfc_SCTRL 0xC4
+++#define hfc_SCTRL_E 0xC8
+++#define hfc_SCTRL_R 0xCC
+++#define hfc_SQ 0xD0
+++#define hfc_CLKDEL 0xDC
+++#define hfc_B1_REC 0xF0
+++#define hfc_B1_SEND 0xF0
+++#define hfc_B2_REC 0xF4
+++#define hfc_B2_SEND 0xF4
+++#define hfc_D_REC 0xF8
+++#define hfc_D_SEND 0xF8
+++#define hfc_E_REC 0xFC
+++
+++/* Bits and values in various HFC PCI registers */
+++
+++/* bits in status register (READ) */
+++#define hfc_STATUS_PCI_PROC 0x02
+++#define hfc_STATUS_NBUSY 0x04
+++#define hfc_STATUS_TIMER_ELAP 0x10
+++#define hfc_STATUS_STATINT 0x20
+++#define hfc_STATUS_FRAMEINT 0x40
+++#define hfc_STATUS_ANYINT 0x80
+++
+++/* bits in CTMT (Write) */
+++#define hfc_CTMT_TRANSB1 0x01
+++#define hfc_CTMT_TRANSB2 0x02
+++#define hfc_CTMT_TIMER_CLEAR 0x80
+++#define hfc_CTMT_TIMER_MASK 0x1C
+++#define hfc_CTMT_TIMER_3_125 (0x01 << 2)
+++#define hfc_CTMT_TIMER_6_25 (0x02 << 2)
+++#define hfc_CTMT_TIMER_12_5 (0x03 << 2)
+++#define hfc_CTMT_TIMER_25 (0x04 << 2)
+++#define hfc_CTMT_TIMER_50 (0x05 << 2)
+++#define hfc_CTMT_TIMER_400 (0x06 << 2)
+++#define hfc_CTMT_TIMER_800 (0x07 << 2)
+++#define hfc_CTMT_AUTO_TIMER 0x20
+++
+++/* bits in CIRM (Write) */
+++#define hfc_CIRM_AUX_MSK 0x07
+++#define hfc_CIRM_RESET 0x08
+++#define hfc_CIRM_B1_REV 0x40
+++#define hfc_CIRM_B2_REV 0x80
+++
+++/* bits in INT_M1 and INT_S1 */
+++#define hfc_INTS_B1TRANS 0x01
+++#define hfc_INTS_B2TRANS 0x02
+++#define hfc_INTS_DTRANS 0x04
+++#define hfc_INTS_B1REC 0x08
+++#define hfc_INTS_B2REC 0x10
+++#define hfc_INTS_DREC 0x20
+++#define hfc_INTS_L1STATE 0x40
+++#define hfc_INTS_TIMER 0x80
+++
+++/* bits in INT_M2 */
+++#define hfc_M2_PROC_TRANS 0x01
+++#define hfc_M2_GCI_I_CHG 0x02
+++#define hfc_M2_GCI_MON_REC 0x04
+++#define hfc_M2_IRQ_ENABLE 0x08
+++#define hfc_M2_PMESEL 0x80
+++
+++/* bits in STATES */
+++#define hfc_STATES_STATE_MASK 0x0F
+++#define hfc_STATES_LOAD_STATE 0x10
+++#define hfc_STATES_ACTIVATE 0x20
+++#define hfc_STATES_DO_ACTION 0x40
+++#define hfc_STATES_NT_G2_G3 0x80
+++
+++/* bits in HFCD_MST_MODE */
+++#define hfc_MST_MODE_MASTER 0x01
+++#define hfc_MST_MODE_SLAVE 0x00
+++/* remaining bits are for codecs control */
+++
+++/* bits in HFCD_SCTRL */
+++#define hfc_SCTRL_B1_ENA 0x01
+++#define hfc_SCTRL_B2_ENA 0x02
+++#define hfc_SCTRL_MODE_TE 0x00
+++#define hfc_SCTRL_MODE_NT 0x04
+++#define hfc_SCTRL_LOW_PRIO 0x08
+++#define hfc_SCTRL_SQ_ENA 0x10
+++#define hfc_SCTRL_TEST 0x20
+++#define hfc_SCTRL_NONE_CAP 0x40
+++#define hfc_SCTRL_PWR_DOWN 0x80
+++
+++/* bits in SCTRL_E */
+++#define hfc_SCTRL_E_AUTO_AWAKE 0x01
+++#define hfc_SCTRL_E_DBIT_1 0x04
+++#define hfc_SCTRL_E_IGNORE_COL 0x08
+++#define hfc_SCTRL_E_CHG_B1_B2 0x80
+++
+++/* bits in SCTRL_R */
+++#define hfc_SCTRL_R_B1_ENA 0x01
+++#define hfc_SCTRL_R_B2_ENA 0x02
+++
+++/* bits in FIFO_EN register */
+++#define hfc_FIFOEN_B1TX 0x01
+++#define hfc_FIFOEN_B1RX 0x02
+++#define hfc_FIFOEN_B2TX 0x04
+++#define hfc_FIFOEN_B2RX 0x08
+++#define hfc_FIFOEN_DTX 0x10
+++#define hfc_FIFOEN_DRX 0x20
+++
+++#define hfc_FIFOEN_B1 (hfc_FIFOEN_B1TX|hfc_FIFOEN_B1RX)
+++#define hfc_FIFOEN_B2 (hfc_FIFOEN_B2TX|hfc_FIFOEN_B2RX)
+++#define hfc_FIFOEN_D (hfc_FIFOEN_DTX|hfc_FIFOEN_DRX)
+++
+++/* bits in the CONNECT register */
+++#define hfc_CONNECT_B1_HFC_from_ST 0x00
+++#define hfc_CONNECT_B1_HFC_from_GCI 0x01
+++#define hfc_CONNECT_B1_ST_from_HFC 0x00
+++#define hfc_CONNECT_B1_ST_from_GCI 0x02
+++#define hfc_CONNECT_B1_GCI_from_HFC 0x00
+++#define hfc_CONNECT_B1_GCI_from_ST 0x04
+++
+++#define hfc_CONNECT_B2_HFC_from_ST 0x00
+++#define hfc_CONNECT_B2_HFC_from_GCI 0x08
+++#define hfc_CONNECT_B2_ST_from_HFC 0x00
+++#define hfc_CONNECT_B2_ST_from_GCI 0x10
+++#define hfc_CONNECT_B2_GCI_from_HFC 0x00
+++#define hfc_CONNECT_B2_GCI_from_ST 0x20
+++
+++/* bits in the TRM register */
+++#define hfc_TRM_TRANS_INT_00 0x00
+++#define hfc_TRM_TRANS_INT_01 0x01
+++#define hfc_TRM_TRANS_INT_10 0x02
+++#define hfc_TRM_TRANS_INT_11 0x04
+++#define hfc_TRM_ECHO 0x20
+++#define hfc_TRM_B1_PLUS_B2 0x40
+++#define hfc_TRM_IOM_TEST_LOOP 0x80
+++
+++/* bits in the __SSL and __RSL registers */
+++#define hfc_SRSL_STIO 0x40
+++#define hfc_SRSL_ENABLE 0x80
+++#define hfc_SRCL_SLOT_MASK 0x1f
+++
+++/* FIFO memory definitions */
+++
+++#define hfc_FIFO_SIZE 0x8000
+++
+++#define hfc_UGLY_FRAMEBUF 0x2000
+++
+++#define hfc_TX_FIFO_PRELOAD (DAHDI_CHUNKSIZE + 2)
+++#define hfc_RX_FIFO_PRELOAD 4
+++
+++/* HDLC STUFF */
+++#define hfc_HDLC_BUF_LEN 32
+++/* arbitrary, just the max # of byts we will send to DAHDI per call */
+++
+++
+++/* NOTE: FIFO pointers are not declared volatile because accesses to the
+++ * FIFOs are inherently safe.
+++ */
+++
+++#ifdef DEBUG
+++extern int debug_level;
+++#endif
+++
+++struct hfc_chan;
+++
+++struct hfc_chan_simplex {
+++ struct hfc_chan_duplex *chan;
+++
+++ u8 dahdi_buffer[DAHDI_CHUNKSIZE];
+++
+++ u8 ugly_framebuf[hfc_UGLY_FRAMEBUF];
+++ int ugly_framebuf_size;
+++ u16 ugly_framebuf_off;
+++
+++ void *z1_base, *z2_base;
+++ void *fifo_base;
+++ void *z_base;
+++ u16 z_min;
+++ u16 z_max;
+++ u16 fifo_size;
+++
+++ u8 *f1, *f2;
+++ u8 f_min;
+++ u8 f_max;
+++ u8 f_num;
+++
+++ unsigned long long frames;
+++ unsigned long long bytes;
+++ unsigned long long fifo_full;
+++ unsigned long long crc;
+++ unsigned long long fifo_underrun;
+++};
+++
+++enum hfc_chan_status {
+++ free,
+++ open_framed,
+++ open_voice,
+++ sniff_aux,
+++ loopback,
+++};
+++
+++struct hfc_chan_duplex {
+++ struct hfc_card *card;
+++
+++ char *name;
+++ int number;
+++
+++ enum hfc_chan_status status;
+++ int open_by_netdev;
+++ int open_by_dahdi;
+++
+++ unsigned short protocol;
+++
+++ spinlock_t lock;
+++
+++ struct hfc_chan_simplex rx;
+++ struct hfc_chan_simplex tx;
+++
+++};
+++
+++typedef struct hfc_card {
+++ int cardnum;
+++ struct pci_dev *pcidev;
+++ struct dahdi_hfc *dahdi_dev;
+++ struct proc_dir_entry *proc_dir;
+++ char proc_dir_name[32];
+++
+++ struct proc_dir_entry *proc_info;
+++ struct proc_dir_entry *proc_fifos;
+++ struct proc_dir_entry *proc_bufs;
+++
+++ unsigned long io_bus_mem;
+++ void __iomem *io_mem;
+++
+++ dma_addr_t fifo_bus_mem;
+++ void *fifo_mem;
+++ void *fifos;
+++
+++ int nt_mode;
+++ int sync_loss_reported;
+++ int late_irqs;
+++
+++ u8 l1_state;
+++ int fifo_suspended;
+++ int ignore_first_timer_interrupt;
+++
+++ struct {
+++ u8 m1;
+++ u8 m2;
+++ u8 fifo_en;
+++ u8 trm;
+++ u8 connect;
+++ u8 sctrl;
+++ u8 sctrl_r;
+++ u8 sctrl_e;
+++ u8 ctmt;
+++ u8 cirm;
+++ } regs;
+++
+++ struct hfc_chan_duplex chans[3];
+++ int echo_enabled;
+++
+++
+++
+++ int debug_event;
+++
+++ spinlock_t lock;
+++ unsigned int irq;
+++ unsigned int iomem;
+++ int ticks;
+++ int clicks;
+++ unsigned char *pci_io;
+++ void *fifomem; /* start of the shared mem */
+++
+++ unsigned int pcibus;
+++ unsigned int pcidevfn;
+++
+++ int drecinframe;
+++
+++ unsigned char cardno;
+++ struct hfc_card *next;
+++
+++} hfc_card;
+++
+++typedef struct dahdi_hfc {
+++ unsigned int usecount;
+++ struct dahdi_device *ddev;
+++ struct dahdi_span span;
+++ struct dahdi_chan chans[3];
+++ struct dahdi_chan *_chans[3];
+++ struct hfc_card *card;
+++
+++ /* pointer to the signalling channel for this span */
+++ struct dahdi_chan *sigchan;
+++ /* nonzero means we're in the middle of sending an HDLC frame */
+++ int sigactive;
+++ /* hdlc_hard_xmit() increments, hdlc_tx_frame() decrements */
+++ atomic_t hdlc_pending;
+++ int frames_out;
+++ int frames_in;
+++
+++} dahdi_hfc;
+++
+++static inline struct dahdi_hfc* dahdi_hfc_from_span(struct dahdi_span *span) {
+++ return container_of(span, struct dahdi_hfc, span);
+++}
+++
+++static inline u8 hfc_inb(struct hfc_card *card, int offset)
+++{
+++ return readb(card->io_mem + offset);
+++}
+++
+++static inline void hfc_outb(struct hfc_card *card, int offset, u8 value)
+++{
+++ writeb(value, card->io_mem + offset);
+++}
+++
+++#endif
++--- /dev/null
+++++ b/drivers/dahdi/hfcs/fifo.c
++@@ -0,0 +1,380 @@
+++/*
+++ * fifo.c - HFC FIFO management routines
+++ *
+++ * Copyright (C) 2006 headissue GmbH; Jens Wilke
+++ * Copyright (C) 2004 Daniele Orlandi
+++ * Copyright (C) 2002, 2003, 2004, Junghanns.NET GmbH
+++ *
+++ * Original author of this code is
+++ * Daniele "Vihai" Orlandi <daniele@orlandi.com>
+++ *
+++ * This program is free software and may be modified and
+++ * distributed under the terms of the GNU Public License.
+++ *
+++ */
+++
+++#define DEBUG
+++#ifdef DEBUG
+++extern int debug_level;
+++#endif
+++
+++#include <linux/kernel.h>
+++
+++#include <dahdi/kernel.h>
+++
+++#include "fifo.h"
+++
+++static void hfc_fifo_mem_read(struct hfc_chan_simplex *chan,
+++ int z_start,
+++ void *data, int size)
+++{
+++ int bytes_to_boundary = chan->z_max - z_start + 1;
+++ if (bytes_to_boundary >= size) {
+++ memcpy(data,
+++ chan->z_base + z_start,
+++ size);
+++ } else {
+++ /*
+++ * Buffer wrap
+++ */
+++ memcpy(data,
+++ chan->z_base + z_start,
+++ bytes_to_boundary);
+++
+++ memcpy(data + bytes_to_boundary,
+++ chan->fifo_base,
+++ size - bytes_to_boundary);
+++ }
+++}
+++
+++static void hfc_fifo_mem_write(struct hfc_chan_simplex *chan,
+++ void *data, int size)
+++{
+++ int bytes_to_boundary = chan->z_max - *Z1_F1(chan) + 1;
+++ if (bytes_to_boundary >= size) {
+++ memcpy(chan->z_base + *Z1_F1(chan),
+++ data,
+++ size);
+++ } else {
+++ /*
+++ * FIFO wrap
+++ */
+++
+++ memcpy(chan->z_base + *Z1_F1(chan),
+++ data,
+++ bytes_to_boundary);
+++
+++ memcpy(chan->fifo_base,
+++ data + bytes_to_boundary,
+++ size - bytes_to_boundary);
+++ }
+++}
+++
+++int hfc_fifo_get(struct hfc_chan_simplex *chan,
+++ void *data, int size)
+++{
+++ int available_bytes;
+++
+++ /*
+++ * Some useless statistic
+++ */
+++ chan->bytes += size;
+++
+++ available_bytes = hfc_fifo_used_rx(chan);
+++
+++ if (available_bytes < size && !chan->fifo_underrun++) {
+++ /*
+++ * print the warning only once
+++ */
+++ printk(KERN_WARNING hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "RX FIFO not enough (%d) bytes to receive!\n",
+++ chan->chan->card->cardnum,
+++ chan->chan->name,
+++ available_bytes);
+++ return -1;
+++ }
+++
+++ hfc_fifo_mem_read(chan, *Z2_F2(chan), data, size);
+++ *Z2_F2(chan) = Z_inc(chan, *Z2_F2(chan), size);
+++ return available_bytes - size;
+++}
+++
+++void hfc_fifo_put(struct hfc_chan_simplex *chan,
+++ void *data, int size)
+++{
+++ struct hfc_card *card = chan->chan->card;
+++ int used_bytes = hfc_fifo_used_tx(chan);
+++ int free_bytes = hfc_fifo_free_tx(chan);
+++
+++ if (!used_bytes && !chan->fifo_underrun++) {
+++ /*
+++ * print warning only once, to make timing not worse
+++ */
+++ printk(KERN_WARNING hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "TX FIFO has become empty\n",
+++ card->cardnum,
+++ chan->chan->name);
+++ }
+++ if (free_bytes < size) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "TX FIFO full!\n",
+++ chan->chan->card->cardnum,
+++ chan->chan->name);
+++ chan->fifo_full++;
+++ hfc_clear_fifo_tx(chan);
+++ }
+++
+++ hfc_fifo_mem_write(chan, data, size);
+++ chan->bytes += size;
+++ *Z1_F1(chan) = Z_inc(chan, *Z1_F1(chan), size);
+++}
+++
+++int hfc_fifo_get_frame(struct hfc_chan_simplex *chan, void *data, int max_size)
+++{
+++ int frame_size;
+++ u16 newz2 ;
+++
+++ if (*chan->f1 == *chan->f2) {
+++ /*
+++ * nothing received, strange uh?
+++ */
+++ printk(KERN_WARNING hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "get_frame called with no frame in FIFO.\n",
+++ chan->chan->card->cardnum,
+++ chan->chan->name);
+++
+++ return -1;
+++ }
+++
+++ /*
+++ * frame_size includes CRC+CRC+STAT
+++ */
+++ frame_size = hfc_fifo_get_frame_size(chan);
+++
+++#ifdef DEBUG
+++ if (debug_level == 3) {
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "RX len %2d: ",
+++ chan->chan->card->cardnum,
+++ chan->chan->name,
+++ frame_size);
+++ } else if (debug_level >= 4) {
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "RX (f1=%02x, f2=%02x, z1=%04x, z2=%04x) len %2d: ",
+++ chan->chan->card->cardnum,
+++ chan->chan->name,
+++ *chan->f1, *chan->f2, *Z1_F2(chan), *Z2_F2(chan),
+++ frame_size);
+++ }
+++
+++ if (debug_level >= 3) {
+++ int i;
+++ for (i = 0; i < frame_size; i++) {
+++ printk("%02x", hfc_fifo_u8(chan,
+++ Z_inc(chan, *Z2_F2(chan), i)));
+++ }
+++
+++ printk("\n");
+++ }
+++#endif
+++
+++ if (frame_size <= 0) {
+++#ifdef DEBUG
+++ if (debug_level >= 2) {
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "invalid (empty) frame received.\n",
+++ chan->chan->card->cardnum,
+++ chan->chan->name);
+++ }
+++#endif
+++
+++ hfc_fifo_drop_frame(chan);
+++ return -1;
+++ }
+++
+++ /*
+++ * STAT is not really received
+++ */
+++ chan->bytes += frame_size - 1;
+++
+++ /*
+++ * Calculate beginning of the next frame
+++ */
+++ newz2 = Z_inc(chan, *Z2_F2(chan), frame_size);
+++
+++ /*
+++ * We cannot use hfc_fifo_get because of different semantic of
+++ * "available bytes" and to avoid useless increment of Z2
+++ */
+++ hfc_fifo_mem_read(chan, *Z2_F2(chan), data,
+++ frame_size < max_size ? frame_size : max_size);
+++
+++ if (hfc_fifo_u8(chan, Z_inc(chan, *Z2_F2(chan),
+++ frame_size - 1)) != 0x00) {
+++ /*
+++ * CRC not ok, frame broken, skipping
+++ */
+++#ifdef DEBUG
+++ if (debug_level >= 2) {
+++ printk(KERN_WARNING hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "Received frame with wrong CRC\n",
+++ chan->chan->card->cardnum,
+++ chan->chan->name);
+++ }
+++#endif
+++
+++ chan->crc++;
+++
+++ hfc_fifo_drop_frame(chan);
+++ return -1;
+++ }
+++
+++ chan->frames++;
+++
+++ *chan->f2 = F_inc(chan, *chan->f2, 1);
+++
+++ /*
+++ * Set Z2 for the next frame we're going to receive
+++ */
+++ *Z2_F2(chan) = newz2;
+++
+++ return frame_size;
+++}
+++
+++void hfc_fifo_drop_frame(struct hfc_chan_simplex *chan)
+++{
+++ int available_bytes;
+++ u16 newz2;
+++
+++ if (*chan->f1 == *chan->f2) {
+++ /*
+++ * nothing received, strange eh?
+++ */
+++ printk(KERN_WARNING hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "skip_frame called with no frame in FIFO.\n",
+++ chan->chan->card->cardnum,
+++ chan->chan->name);
+++
+++ return;
+++ }
+++
+++ available_bytes = hfc_fifo_used_rx(chan) + 1;
+++
+++ /*
+++ * Calculate beginning of the next frame
+++ */
+++ newz2 = Z_inc(chan, *Z2_F2(chan), available_bytes);
+++
+++ *chan->f2 = F_inc(chan, *chan->f2, 1);
+++
+++ /*
+++ * Set Z2 for the next frame we're going to receive
+++ */
+++ *Z2_F2(chan) = newz2;
+++}
+++
+++void hfc_fifo_put_frame(struct hfc_chan_simplex *chan,
+++ void *data, int size)
+++{
+++ u16 newz1;
+++ int available_frames;
+++
+++#ifdef DEBUG
+++ if (debug_level == 3) {
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "TX len %2d: ",
+++ chan->chan->card->cardnum,
+++ chan->chan->name,
+++ size);
+++ } else if (debug_level >= 4) {
+++ printk(KERN_DEBUG hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "TX (f1=%02x, f2=%02x, z1=%04x, z2=%04x) len %2d: ",
+++ chan->chan->card->cardnum,
+++ chan->chan->name,
+++ *chan->f1, *chan->f2, *Z1_F1(chan), *Z2_F1(chan),
+++ size);
+++ }
+++
+++ if (debug_level >= 3) {
+++ int i;
+++ for (i = 0; i < size; i++)
+++ printk("%02x", ((u8 *)data)[i]);
+++
+++ printk("\n");
+++ }
+++#endif
+++
+++ available_frames = hfc_fifo_free_frames(chan);
+++
+++ if (available_frames >= chan->f_num) {
+++ printk(KERN_CRIT hfc_DRIVER_PREFIX
+++ "card %d: "
+++ "chan %s: "
+++ "TX FIFO total number of frames exceeded!\n",
+++ chan->chan->card->cardnum,
+++ chan->chan->name);
+++
+++ chan->fifo_full++;
+++
+++ return;
+++ }
+++
+++ hfc_fifo_put(chan, data, size);
+++
+++ newz1 = *Z1_F1(chan);
+++
+++ *chan->f1 = F_inc(chan, *chan->f1, 1);
+++
+++ *Z1_F1(chan) = newz1;
+++
+++ chan->frames++;
+++}
+++
+++void hfc_clear_fifo_rx(struct hfc_chan_simplex *chan)
+++{
+++ *chan->f2 = *chan->f1;
+++ *Z2_F2(chan) = *Z1_F2(chan);
+++}
+++
+++void hfc_clear_fifo_tx(struct hfc_chan_simplex *chan)
+++{
+++ *chan->f1 = *chan->f2;
+++ *Z1_F1(chan) = *Z2_F1(chan);
+++
+++ if (chan->chan->status == open_voice) {
+++ /*
+++ * Make sure that at least hfc_TX_FIFO_PRELOAD bytes are
+++ * present in the TX FIFOs
+++ * Create hfc_TX_FIFO_PRELOAD bytes of empty data
+++ * (0x7f is mute audio)
+++ */
+++ u8 empty_fifo[hfc_TX_FIFO_PRELOAD +
+++ DAHDI_CHUNKSIZE + hfc_RX_FIFO_PRELOAD];
+++ memset(empty_fifo, 0x7f, sizeof(empty_fifo));
+++
+++ hfc_fifo_put(chan, empty_fifo, sizeof(empty_fifo));
+++ }
+++}
+++
++--- /dev/null
+++++ b/drivers/dahdi/hfcs/fifo.h
++@@ -0,0 +1,139 @@
+++/*
+++ * fifo.h - Dahdi driver for HFC-S PCI A based ISDN BRI cards
+++ *
+++ * Copyright (C) 2004 Daniele Orlandi
+++ * Copyright (C) 2002, 2003, 2004, Junghanns.NET GmbH
+++ *
+++ * Daniele "Vihai" Orlandi <daniele@orlandi.com>
+++ *
+++ * Major rewrite of the driver made by
+++ * Klaus-Peter Junghanns <kpj@junghanns.net>
+++ *
+++ * This program is free software and may be modified and
+++ * distributed under the terms of the GNU Public License.
+++ *
+++ */
+++
+++#ifndef _HFC_FIFO_H
+++#define _HFC_FIFO_H
+++
+++#include "dahdi_hfcs.h"
+++
+++static inline u16 *Z1_F1(struct hfc_chan_simplex *chan)
+++{
+++ return chan->z1_base + (*chan->f1 * 4);
+++}
+++
+++static inline u16 *Z2_F1(struct hfc_chan_simplex *chan)
+++{
+++ return chan->z2_base + (*chan->f1 * 4);
+++}
+++
+++static inline u16 *Z1_F2(struct hfc_chan_simplex *chan)
+++{
+++ return chan->z1_base + (*chan->f2 * 4);
+++}
+++
+++static inline u16 *Z2_F2(struct hfc_chan_simplex *chan)
+++{
+++ return chan->z2_base + (*chan->f2 * 4);
+++}
+++
+++static inline u16 Z_inc(struct hfc_chan_simplex *chan, u16 z, u16 inc)
+++{
+++ /*
+++ * declared as u32 in order to manage overflows
+++ */
+++ u32 newz = z + inc;
+++ if (newz > chan->z_max)
+++ newz -= chan->fifo_size;
+++
+++ return newz;
+++}
+++
+++static inline u8 F_inc(struct hfc_chan_simplex *chan, u8 f, u8 inc)
+++{
+++ /*
+++ * declared as u16 in order to manage overflows
+++ */
+++ u16 newf = f + inc;
+++ if (newf > chan->f_max)
+++ newf -= chan->f_num;
+++
+++ return newf;
+++}
+++
+++static inline u16 hfc_fifo_used_rx(struct hfc_chan_simplex *chan)
+++{
+++ return (*Z1_F2(chan) - *Z2_F2(chan) +
+++ chan->fifo_size) % chan->fifo_size;
+++}
+++
+++static inline u16 hfc_fifo_get_frame_size(struct hfc_chan_simplex *chan)
+++{
+++ /*
+++ * This +1 is needed because in frame mode the available bytes are Z2-Z1+1
+++ * while in transparent mode I wouldn't consider the byte pointed by Z2 to
+++ * be available, otherwise, the FIFO would always contain one byte, even
+++ * when Z1==Z2
+++ */
+++
+++ return hfc_fifo_used_rx(chan) + 1;
+++}
+++
+++static inline u8 hfc_fifo_u8(struct hfc_chan_simplex *chan, u16 z)
+++{
+++ return *((u8 *)(chan->z_base + z));
+++}
+++
+++static inline u16 hfc_fifo_used_tx(struct hfc_chan_simplex *chan)
+++{
+++ return (*Z1_F1(chan) - *Z2_F1(chan) +
+++ chan->fifo_size) % chan->fifo_size;
+++}
+++
+++static inline u16 hfc_fifo_free_rx(struct hfc_chan_simplex *chan)
+++{
+++ u16 free_bytes = *Z2_F1(chan) - *Z1_F1(chan);
+++
+++ if (free_bytes > 0)
+++ return free_bytes;
+++ else
+++ return free_bytes + chan->fifo_size;
+++}
+++
+++static inline u16 hfc_fifo_free_tx(struct hfc_chan_simplex *chan)
+++{
+++ u16 free_bytes = *Z2_F1(chan) - *Z1_F1(chan);
+++
+++ if (free_bytes > 0)
+++ return free_bytes;
+++ else
+++ return free_bytes + chan->fifo_size;
+++}
+++
+++static inline int hfc_fifo_has_frames(struct hfc_chan_simplex *chan)
+++{
+++ return *chan->f1 != *chan->f2;
+++}
+++
+++static inline u8 hfc_fifo_used_frames(struct hfc_chan_simplex *chan)
+++{
+++ return (*chan->f1 - *chan->f2 + chan->f_num) % chan->f_num;
+++}
+++
+++static inline u8 hfc_fifo_free_frames(struct hfc_chan_simplex *chan)
+++{
+++ return (*chan->f2 - *chan->f1 + chan->f_num) % chan->f_num;
+++}
+++
+++int hfc_fifo_get(struct hfc_chan_simplex *chan, void *data, int size);
+++void hfc_fifo_put(struct hfc_chan_simplex *chan, void *data, int size);
+++void hfc_fifo_drop(struct hfc_chan_simplex *chan, int size);
+++int hfc_fifo_get_frame(struct hfc_chan_simplex *chan, void *data, int max_size);
+++void hfc_fifo_drop_frame(struct hfc_chan_simplex *chan);
+++void hfc_fifo_put_frame(struct hfc_chan_simplex *chan, void *data, int size);
+++void hfc_clear_fifo_rx(struct hfc_chan_simplex *chan);
+++void hfc_clear_fifo_tx(struct hfc_chan_simplex *chan);
+++
+++#endif
++--- /dev/null
+++++ b/drivers/dahdi/hfcs/Kbuild
++@@ -0,0 +1,10 @@
+++obj-m += dahdi_hfcs.o
+++
+++EXTRA_CFLAGS := -I$(src)/.. -Wno-undef
+++
+++dahdi_hfcs-objs := base.o fifo.o
+++
+++$(obj)/base.o: $(src)/dahdi_hfcs.h
+++$(obj)/fifo.o: $(src)/fifo.h
+++
+++
+diff --git a/feeds/telephony/libs/dahdi-tools/Makefile b/feeds/telephony/libs/dahdi-tools/Makefile
+new file mode 100644
+index 0000000..7dca319
+--- /dev/null
++++ b/feeds/telephony/libs/dahdi-tools/Makefile
+@@ -0,0 +1,97 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=dahdi-tools
++PKG_VERSION:=2.10.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.asterisk.org/pub/telephony/dahdi-tools/releases/
++PKG_MD5SUM:=6928cdf6f7710299ecbcacbac20d5c92
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=LICENSE
++PKG_MAINTAINER:=Vittorio Gambaletta <openwrt@vittgam.net>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/dahdi-cfg/Default
++ SECTION:=utils
++ CATEGORY:=Utilities
++ SUBMENU:=Telephony
++ DEPENDS=+kmod-dahdi
++endef
++
++define Package/dahdi-cfg
++ $(call Package/dahdi-cfg/Default)
++ DEPENDS+=+libpthread
++ TITLE:=DAHDI tools dahdi_cfg, dahdi_scan and fxotune
++endef
++
++define Package/dahdi-monitor
++ $(call Package/dahdi-cfg/Default)
++ TITLE:=DAHDI tools dahdi_monitor, dahdi_speed and dahdi_test
++endef
++
++define Package/dahdi-tools-libtonezone
++ $(call Package/dahdi-cfg/Default)
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=DAHDI tonezone library
++endef
++
++TARGET_CFLAGS += $(FPIC)
++EXTRA_CFLAGS:= $(TARGET_CPPFLAGS)
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ HOSTCC="$(HOSTCC)" \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ CFLAGS="$(TARGET_CFLAGS) -I. -DBUILDING_TONEZONE -I$(STAGING_DIR)/usr/include" \
++ KSRC="$(LINUX_DIR)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
++ DAHDI_INCLUDE="$(STAGING_DIR)/usr/include" \
++ CONFIGURE_SILENT="--silent" \
++ dahdi_cfg dahdi_monitor dahdi_scan dahdi_speed dahdi_test fxotune libs
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/libtonezone.so $(1)/usr/lib/
++ $(CP) $(PKG_BUILD_DIR)/libtonezone.a $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/include/dahdi
++ $(CP) $(PKG_BUILD_DIR)/tonezone.h $(1)/usr/include/dahdi/
++endef
++
++define Package/dahdi-cfg/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_BUILD_DIR)/dahdi_cfg $(1)/usr/sbin/
++ $(CP) $(PKG_BUILD_DIR)/dahdi_scan $(1)/usr/sbin/
++ $(CP) $(PKG_BUILD_DIR)/fxotune $(1)/usr/sbin/
++endef
++
++define Package/dahdi-monitor/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_BUILD_DIR)/dahdi_monitor $(1)/usr/sbin/
++ $(CP) $(PKG_BUILD_DIR)/dahdi_speed $(1)/usr/sbin/
++ $(CP) $(PKG_BUILD_DIR)/dahdi_test $(1)/usr/sbin/
++endef
++
++define Package/dahdi-tools-libtonezone/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_BUILD_DIR)/libtonezone.so $(1)/usr/lib/
++ cd $(1)/usr/lib/; ln -s libtonezone.so libtonezone.so.2.0
++endef
++
++$(eval $(call BuildPackage,dahdi-cfg))
++$(eval $(call BuildPackage,dahdi-monitor))
++$(eval $(call BuildPackage,dahdi-tools-libtonezone))
+diff --git a/feeds/telephony/libs/iksemel/Makefile b/feeds/telephony/libs/iksemel/Makefile
+new file mode 100644
+index 0000000..8a33e3e
+--- /dev/null
++++ b/feeds/telephony/libs/iksemel/Makefile
+@@ -0,0 +1,75 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=iksemel
++PKG_VERSION:=1.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://iksemel.googlecode.com/files/
++PKG_MD5SUM:=532e77181694f87ad5eb59435d11c1ca
++
++PKG_FIXUP:=autoreconf
++
++PKG_INSTALL:=1
++
++PKG_LICENSE:=LGPL-2.1
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libiksemel
++ SUBMENU:=Telephony
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Iksemel Jabber Library
++ URL:=http://code.google.com/p/iksemel/
++ DEPENDS:= +libgnutls +libtasn1 +libgcrypt +libgpg-error
++endef
++
++define Package/libiksemel/description
++Iksemel is an XML parser library mainly designed for Jabber applications.
++It provides SAX, DOM, and special Jabber stream APIs. Library is coded
++in ANSI C except the network code (which is POSIX compatible), thus
++highly portable.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++TARGET_LDFLAGS += \
++ -Wl,-rpath-link,$(STAGING_DIR)/usr/lib \
++ -lgnutls -lgcrypt -lgpg-error
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --enable-shared \
++ --enable-static \
++ --with-libgnutls-prefix="$(STAGING_DIR)/usr" \
++ , \
++ LIBS="$(TARGET_LDFLAGS)" \
++ )
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/iksemel.h $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libiksemel.{a,so*} $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/iksemel.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libiksemel/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libiksemel.so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libiksemel))
+diff --git a/feeds/telephony/libs/iksemel/patches/001-missing-macros.patch b/feeds/telephony/libs/iksemel/patches/001-missing-macros.patch
+new file mode 100644
+index 0000000..4563ac5
+--- /dev/null
++++ b/feeds/telephony/libs/iksemel/patches/001-missing-macros.patch
+@@ -0,0 +1,163 @@
++--- /dev/null
+++++ b/gnutls.m4
++@@ -0,0 +1,160 @@
+++dnl Autoconf macros for libgnutls
+++dnl $id$
+++
+++# Modified for LIBGNUTLS -- nmav
+++# Configure paths for LIBGCRYPT
+++# Shamelessly stolen from the one of XDELTA by Owen Taylor
+++# Werner Koch 99-12-09
+++
+++dnl AM_PATH_LIBGNUTLS([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
+++dnl Test for libgnutls, and define LIBGNUTLS_CFLAGS and LIBGNUTLS_LIBS
+++dnl
+++AC_DEFUN([AM_PATH_LIBGNUTLS],
+++[dnl
+++dnl Get the cflags and libraries from the libgnutls-config script
+++dnl
+++AC_ARG_WITH(libgnutls-prefix,
+++ [ --with-libgnutls-prefix=PFX Prefix where libgnutls is installed (optional)],
+++ libgnutls_config_prefix="$withval", libgnutls_config_prefix="")
+++
+++ if test x$libgnutls_config_prefix != x ; then
+++ if test x${LIBGNUTLS_CONFIG+set} != xset ; then
+++ LIBGNUTLS_CONFIG=$libgnutls_config_prefix/bin/libgnutls-config
+++ fi
+++ fi
+++
+++ AC_PATH_PROG(LIBGNUTLS_CONFIG, libgnutls-config, no)
+++ min_libgnutls_version=ifelse([$1], ,0.1.0,$1)
+++ AC_MSG_CHECKING(for libgnutls - version >= $min_libgnutls_version)
+++ no_libgnutls=""
+++ if test "$LIBGNUTLS_CONFIG" = "no" ; then
+++ no_libgnutls=yes
+++ else
+++ LIBGNUTLS_CFLAGS=`$LIBGNUTLS_CONFIG $libgnutls_config_args --cflags`
+++ LIBGNUTLS_LIBS=`$LIBGNUTLS_CONFIG $libgnutls_config_args --libs`
+++ libgnutls_config_version=`$LIBGNUTLS_CONFIG $libgnutls_config_args --version`
+++
+++
+++ ac_save_CFLAGS="$CFLAGS"
+++ ac_save_LIBS="$LIBS"
+++ CFLAGS="$CFLAGS $LIBGNUTLS_CFLAGS"
+++ LIBS="$LIBS $LIBGNUTLS_LIBS"
+++dnl
+++dnl Now check if the installed libgnutls is sufficiently new. Also sanity
+++dnl checks the results of libgnutls-config to some extent
+++dnl
+++ rm -f conf.libgnutlstest
+++ AC_TRY_RUN([
+++#include <stdio.h>
+++#include <stdlib.h>
+++#include <string.h>
+++#include <gnutls/gnutls.h>
+++
+++int
+++main ()
+++{
+++ system ("touch conf.libgnutlstest");
+++
+++ if( strcmp( gnutls_check_version(NULL), "$libgnutls_config_version" ) )
+++ {
+++ printf("\n*** 'libgnutls-config --version' returned %s, but LIBGNUTLS (%s)\n",
+++ "$libgnutls_config_version", gnutls_check_version(NULL) );
+++ printf("*** was found! If libgnutls-config was correct, then it is best\n");
+++ printf("*** to remove the old version of LIBGNUTLS. You may also be able to fix the error\n");
+++ printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+++ printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+++ printf("*** required on your system.\n");
+++ printf("*** If libgnutls-config was wrong, set the environment variable LIBGNUTLS_CONFIG\n");
+++ printf("*** to point to the correct copy of libgnutls-config, and remove the file config.cache\n");
+++ printf("*** before re-running configure\n");
+++ }
+++ else if ( strcmp(gnutls_check_version(NULL), LIBGNUTLS_VERSION ) )
+++ {
+++ printf("\n*** LIBGNUTLS header file (version %s) does not match\n", LIBGNUTLS_VERSION);
+++ printf("*** library (version %s)\n", gnutls_check_version(NULL) );
+++ }
+++ else
+++ {
+++ if ( gnutls_check_version( "$min_libgnutls_version" ) )
+++ {
+++ return 0;
+++ }
+++ else
+++ {
+++ printf("no\n*** An old version of LIBGNUTLS (%s) was found.\n",
+++ gnutls_check_version(NULL) );
+++ printf("*** You need a version of LIBGNUTLS newer than %s. The latest version of\n",
+++ "$min_libgnutls_version" );
+++ printf("*** LIBGNUTLS is always available from ftp://gnutls.hellug.gr/pub/gnutls.\n");
+++ printf("*** \n");
+++ printf("*** If you have already installed a sufficiently new version, this error\n");
+++ printf("*** probably means that the wrong copy of the libgnutls-config shell script is\n");
+++ printf("*** being found. The easiest way to fix this is to remove the old version\n");
+++ printf("*** of LIBGNUTLS, but you can also set the LIBGNUTLS_CONFIG environment to point to the\n");
+++ printf("*** correct copy of libgnutls-config. (In this case, you will have to\n");
+++ printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+++ printf("*** so that the correct libraries are found at run-time))\n");
+++ }
+++ }
+++ return 1;
+++}
+++],, no_libgnutls=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+++ CFLAGS="$ac_save_CFLAGS"
+++ LIBS="$ac_save_LIBS"
+++ fi
+++
+++ if test "x$no_libgnutls" = x ; then
+++ AC_MSG_RESULT(yes)
+++ ifelse([$2], , :, [$2])
+++ else
+++ if test -f conf.libgnutlstest ; then
+++ :
+++ else
+++ AC_MSG_RESULT(no)
+++ fi
+++ if test "$LIBGNUTLS_CONFIG" = "no" ; then
+++ echo "*** The libgnutls-config script installed by LIBGNUTLS could not be found"
+++ echo "*** If LIBGNUTLS was installed in PREFIX, make sure PREFIX/bin is in"
+++ echo "*** your path, or set the LIBGNUTLS_CONFIG environment variable to the"
+++ echo "*** full path to libgnutls-config."
+++ else
+++ if test -f conf.libgnutlstest ; then
+++ :
+++ else
+++ echo "*** Could not run libgnutls test program, checking why..."
+++ CFLAGS="$CFLAGS $LIBGNUTLS_CFLAGS"
+++ LIBS="$LIBS $LIBGNUTLS_LIBS"
+++ AC_TRY_LINK([
+++#include <stdio.h>
+++#include <stdlib.h>
+++#include <string.h>
+++#include <gnutls/gnutls.h>
+++], [ return !!gnutls_check_version(NULL); ],
+++ [ echo "*** The test program compiled, but did not run. This usually means"
+++ echo "*** that the run-time linker is not finding LIBGNUTLS or finding the wrong"
+++ echo "*** version of LIBGNUTLS. If it is not finding LIBGNUTLS, you'll need to set your"
+++ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+++ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+++ echo "*** is required on your system"
+++ echo "***"
+++ echo "*** If you have an old version installed, it is best to remove it, although"
+++ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+++ echo "***" ],
+++ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+++ echo "*** exact error that occured. This usually means LIBGNUTLS was incorrectly installed"
+++ echo "*** or that you have moved LIBGNUTLS since it was installed. In the latter case, you"
+++ echo "*** may want to edit the libgnutls-config script: $LIBGNUTLS_CONFIG" ])
+++ CFLAGS="$ac_save_CFLAGS"
+++ LIBS="$ac_save_LIBS"
+++ fi
+++ fi
+++ LIBGNUTLS_CFLAGS=""
+++ LIBGNUTLS_LIBS=""
+++ ifelse([$3], , :, [$3])
+++ fi
+++ rm -f conf.libgnutlstest
+++ AC_SUBST(LIBGNUTLS_CFLAGS)
+++ AC_SUBST(LIBGNUTLS_LIBS)
+++])
+++
+++dnl *-*wedit:notab*-* Please keep this as the last line.
+diff --git a/feeds/telephony/libs/iksemel/patches/002-use-of-newer-gnutls_priority_set_direct-api.patch b/feeds/telephony/libs/iksemel/patches/002-use-of-newer-gnutls_priority_set_direct-api.patch
+new file mode 100644
+index 0000000..8f91d10
+--- /dev/null
++++ b/feeds/telephony/libs/iksemel/patches/002-use-of-newer-gnutls_priority_set_direct-api.patch
+@@ -0,0 +1,65 @@
++From 6b213b593c5b499679506a8c169ff3f0f4d6a34f Mon Sep 17 00:00:00 2001
++From: John Papandriopoulos <jpap@users.noreply.github.com>
++Date: Thu, 20 Aug 2015 16:55:39 -0700
++Subject: [PATCH] Use of newer gnutls_priority_set_direct API
++
++---
++ configure.ac | 1 +
++ src/stream.c | 13 +++++++++++++
++ 2 files changed, 14 insertions(+)
++
++diff --git a/configure.ac b/configure.ac
++index 91e69e3..281a044 100644
++--- a/configure.ac
+++++ b/configure.ac
++@@ -46,6 +46,7 @@ AC_CHECK_FUNCS(getopt_long)
++ AC_CHECK_FUNCS(getaddrinfo)
++
++ AM_PATH_LIBGNUTLS(,AC_DEFINE(HAVE_GNUTLS,,"Use libgnutls"))
+++AM_PATH_LIBGNUTLS(,AC_CHECK_FUNCS(gnutls_priority_set_direct))
++
++ dnl Check -Wall flag of GCC
++ if test "x$GCC" = "xyes"; then
++diff --git a/src/stream.c b/src/stream.c
++index e8a1e8c..7d19a82 100644
++--- a/src/stream.c
+++++ b/src/stream.c
++@@ -63,11 +63,20 @@ tls_pull (iksparser *prs, char *buffer, size_t len)
++ static int
++ handshake (struct stream_data *data)
++ {
+++#if HAVE_GNUTLS_PRIORITY_SET_DIRECT
+++ const char *priorities =
+++ "NONE"
+++ ":+VERS-TLS1.0:+VERS-SSL3.0"
+++ ":+RSA"
+++ ":+3DES-CBC:+ARCFOUR-128"
+++ ":+SHA1:+SHA256:+SHA384:+MD5";
+++#else
++ const int protocol_priority[] = { GNUTLS_TLS1, GNUTLS_SSL3, 0 };
++ const int kx_priority[] = { GNUTLS_KX_RSA, 0 };
++ const int cipher_priority[] = { GNUTLS_CIPHER_3DES_CBC, GNUTLS_CIPHER_ARCFOUR, 0};
++ const int comp_priority[] = { GNUTLS_COMP_ZLIB, GNUTLS_COMP_NULL, 0 };
++ const int mac_priority[] = { GNUTLS_MAC_SHA, GNUTLS_MAC_MD5, 0 };
+++#endif
++ int ret;
++
++ if (gnutls_global_init () != 0)
++@@ -80,11 +89,15 @@ handshake (struct stream_data *data)
++ gnutls_certificate_free_credentials (data->cred);
++ return IKS_NOMEM;
++ }
+++#if HAVE_GNUTLS_PRIORITY_SET_DIRECT
+++ gnutls_priority_set_direct (data->sess, priorities, NULL);
+++#else
++ gnutls_protocol_set_priority (data->sess, protocol_priority);
++ gnutls_cipher_set_priority(data->sess, cipher_priority);
++ gnutls_compression_set_priority(data->sess, comp_priority);
++ gnutls_kx_set_priority(data->sess, kx_priority);
++ gnutls_mac_set_priority(data->sess, mac_priority);
+++#endif
++ gnutls_credentials_set (data->sess, GNUTLS_CRD_CERTIFICATE, data->cred);
++
++ gnutls_transport_set_push_function (data->sess, (gnutls_push_func) tls_push);
++--
++2.1.4
+diff --git a/feeds/telephony/libs/libosip2/Makefile b/feeds/telephony/libs/libosip2/Makefile
+new file mode 100644
+index 0000000..fe4066b
+--- /dev/null
++++ b/feeds/telephony/libs/libosip2/Makefile
+@@ -0,0 +1,73 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libosip2
++PKG_VERSION:=4.1.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@GNU/osip
++PKG_MD5SUM:=756423628683c07f817432f046a26516
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++PKG_LICENSE:=LGPL-2.1+
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libosip2
++ SUBMENU:=Telephony
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=GNU oSIP library
++ URL:=http://www.gnu.org/software/osip/
++ DEPENDS:=+librt
++endef
++
++define Package/libosip2/description
++ GNU oSIP library, a Session Initiation Protocol (SIP) implementation.
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-debug \
++ --disable-trace \
++ --disable-mpatrol \
++ --disable-gprof \
++ --disable-mt \
++ --enable-pthread \
++ --enable-semaphore \
++ --disable-sysv \
++ --disable-gperf \
++ --disable-test \
++ --disable-minisize
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/osip{,parser}2 $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libosip{,parser}2.{a,so*} $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libosip2.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libosip2/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libosip{,parser}2.so $(PKG_INSTALL_DIR)/usr/lib/libosip{,parser}2.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libosip2))
+diff --git a/feeds/telephony/libs/libosip2/patches/001-automake-compat.patch b/feeds/telephony/libs/libosip2/patches/001-automake-compat.patch
+new file mode 100644
+index 0000000..9c0bc11
+--- /dev/null
++++ b/feeds/telephony/libs/libosip2/patches/001-automake-compat.patch
+@@ -0,0 +1,8 @@
++--- a/Makefile.am
+++++ b/Makefile.am
++@@ -1,3 +1,5 @@
+++ACLOCAL_AMFLAGS = -I scripts
+++
++ EXTRA_DIST = README BUGS FEATURES HISTORY autogen.sh libosip2.pc.in
++
++ SUBDIRS = include src scripts help platform
+diff --git a/feeds/telephony/libs/libpri/Makefile b/feeds/telephony/libs/libpri/Makefile
+new file mode 100644
+index 0000000..becf8f9
+--- /dev/null
++++ b/feeds/telephony/libs/libpri/Makefile
+@@ -0,0 +1,54 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libpri
++PKG_VERSION:=1.4.15
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.asterisk.org/pub/telephony/libpri/
++PKG_MD5SUM:=206fbcf014ad85bf6613f169ca425e7f
++PKG_MAINTAINER:=Daniel Golle <daniel@makrotopia.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libpri
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=libpri Primary Rate ISDN implementation
++ URL:=http://www.asterisk.org/
++ DEPENDS:=+dahdi-tools-libtonezone
++endef
++
++define Package/libpri/description
++ libpri is a C implementation of the Primary Rate ISDN specification. It was
++ based on the Bellcore specification SR-NWT-002343 for National ISDN. As of
++ May 12, 2001, it has been tested work with NI-2, Nortel DMS-100, and
++ Lucent 5E Custom protocols on switches from Nortel and Lucent.
++endef
++
++define Build/Configure
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpri*.a $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpri*.so* $(1)/usr/lib/
++endef
++
++define Package/libpri/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libpri*.so.* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libpri))
+diff --git a/feeds/telephony/libs/libpri/patches/001-fix-include-signal-h-warning.patch b/feeds/telephony/libs/libpri/patches/001-fix-include-signal-h-warning.patch
+new file mode 100644
+index 0000000..23ba2b7
+--- /dev/null
++++ b/feeds/telephony/libs/libpri/patches/001-fix-include-signal-h-warning.patch
+@@ -0,0 +1,26 @@
++Index: libpri-1.4.15/pritest.c
++===================================================================
++--- libpri-1.4.15.orig/pritest.c
+++++ libpri-1.4.15/pritest.c
++@@ -41,7 +41,7 @@
++ #include <sys/ioctl.h>
++ #include <stdlib.h>
++ #include <unistd.h>
++-#include <sys/signal.h>
+++#include <signal.h>
++ #include <sys/select.h>
++ #include <sys/wait.h>
++ #include <sys/resource.h>
++Index: libpri-1.4.15/testprilib.c
++===================================================================
++--- libpri-1.4.15.orig/testprilib.c
+++++ libpri-1.4.15/testprilib.c
++@@ -41,7 +41,7 @@
++ #include <sys/ioctl.h>
++ #include <stdlib.h>
++ #include <unistd.h>
++-#include <sys/signal.h>
+++#include <signal.h>
++ #include <sys/select.h>
++ #include <sys/wait.h>
++ #include <sys/resource.h>
+diff --git a/feeds/telephony/libs/libsrtp/Makefile b/feeds/telephony/libs/libsrtp/Makefile
+new file mode 100644
+index 0000000..4d7d5a6
+--- /dev/null
++++ b/feeds/telephony/libs/libsrtp/Makefile
+@@ -0,0 +1,63 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++# Copyright (C) 2011 Victor Seva <linuxmaniac@torreviejawireless.org>
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=libsrtp
++PKG_VERSION:=1.4.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=srtp-$(PKG_VERSION).tgz
++PKG_SOURCE_URL:=@SF/srtp
++PKG_MD5SUM:=9b449edb011c934ca97009e7e0566d22
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/srtp
++PKG_INSTALL:=1
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=LICENSE
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS += $(FPIC)
++CONFIGURE_ARGS += --disable-stdout --enable-syslog
++
++define Package/libsrtp
++ SUBMENU:=Telephony
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Secure Real-time Transport Protocol (SRTP) library
++ URL:=http://sourceforge.net/projects/srtp
++endef
++
++define Package/libsrtp/description
++Open-source implementation of the Secure Real-time Transport
++Protocol (SRTP) originally authored by Cisco Systems, Inc.
++It is available under a BSD-style license.
++endef
++
++define Build/Install
++ $(MAKE) -C $(PKG_BUILD_DIR) DESTDIR=$(PKG_INSTALL_DIR) uninstall
++ $(call Build/Install/Default)
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/srtp $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsrtp.{a,so*} $(1)/usr/lib/
++endef
++
++
++define Package/libsrtp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libsrtp.so.* \
++ $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libsrtp))
+diff --git a/feeds/telephony/libs/libsrtp/patches/1003_fix_mips_namespace_collision.patch b/feeds/telephony/libs/libsrtp/patches/1003_fix_mips_namespace_collision.patch
+new file mode 100644
+index 0000000..534ea4b
+--- /dev/null
++++ b/feeds/telephony/libs/libsrtp/patches/1003_fix_mips_namespace_collision.patch
+@@ -0,0 +1,59 @@
++Description: Fix MIPS namespace collision
++Author: Thiemo Seufer <ths@networkno.de>
++Origin: vendor, http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=24;bug=439976
++Bug-Debian: http://bugs.debian.org/439976
++Last-Update: 2010-02-28
++--- a/test/srtp_driver.c
+++++ b/test/srtp_driver.c
++@@ -314,7 +314,7 @@ main (int argc, char *argv[]) {
++ if (do_codec_timing) {
++ srtp_policy_t policy;
++ int ignore;
++- double mips = mips_estimate(1000000000, &ignore);
+++ double mips_est = mips_estimate(1000000000, &ignore);
++
++ crypto_policy_set_rtp_default(&policy.rtp);
++ crypto_policy_set_rtcp_default(&policy.rtcp);
++@@ -323,33 +323,33 @@ main (int argc, char *argv[]) {
++ policy.key = test_key;
++ policy.next = NULL;
++
++- printf("mips estimate: %e\n", mips);
+++ printf("mips estimate: %e\n", mips_est);
++
++ printf("testing srtp processing time for voice codecs:\n");
++ printf("codec\t\tlength (octets)\t\tsrtp instructions/second\n");
++ printf("G.711\t\t%d\t\t\t%e\n", 80,
++- (double) mips * (80 * 8) /
+++ (double) mips_est * (80 * 8) /
++ srtp_bits_per_second(80, &policy) / .01 );
++ printf("G.711\t\t%d\t\t\t%e\n", 160,
++- (double) mips * (160 * 8) /
+++ (double) mips_est * (160 * 8) /
++ srtp_bits_per_second(160, &policy) / .02);
++ printf("G.726-32\t%d\t\t\t%e\n", 40,
++- (double) mips * (40 * 8) /
+++ (double) mips_est * (40 * 8) /
++ srtp_bits_per_second(40, &policy) / .01 );
++ printf("G.726-32\t%d\t\t\t%e\n", 80,
++- (double) mips * (80 * 8) /
+++ (double) mips_est * (80 * 8) /
++ srtp_bits_per_second(80, &policy) / .02);
++ printf("G.729\t\t%d\t\t\t%e\n", 10,
++- (double) mips * (10 * 8) /
+++ (double) mips_est * (10 * 8) /
++ srtp_bits_per_second(10, &policy) / .01 );
++ printf("G.729\t\t%d\t\t\t%e\n", 20,
++- (double) mips * (20 * 8) /
+++ (double) mips_est * (20 * 8) /
++ srtp_bits_per_second(20, &policy) / .02 );
++ printf("Wideband\t%d\t\t\t%e\n", 320,
++- (double) mips * (320 * 8) /
+++ (double) mips_est * (320 * 8) /
++ srtp_bits_per_second(320, &policy) / .01 );
++ printf("Wideband\t%d\t\t\t%e\n", 640,
++- (double) mips * (640 * 8) /
+++ (double) mips_est * (640 * 8) /
++ srtp_bits_per_second(640, &policy) / .02 );
++ }
++
+diff --git a/feeds/telephony/libs/libsrtp/patches/1005_fix_data_alignment.patch b/feeds/telephony/libs/libsrtp/patches/1005_fix_data_alignment.patch
+new file mode 100644
+index 0000000..4cb8889
+--- /dev/null
++++ b/feeds/telephony/libs/libsrtp/patches/1005_fix_data_alignment.patch
+@@ -0,0 +1,33 @@
++Description: Fix data alignment
++Author: "Martin Guy" <martinwguy@yahoo.it>
++Origin: vendor, http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=5;bug=470505
++Bug: http://sourceforge.net/tracker/index.php?func=detail&aid=1912057&group_id=38894&atid=423799
++Bug-Debian: http://bugs.debian.org/470505
++Last-Update: 2011-05-30
++--- a/test/srtp_driver.c
+++++ b/test/srtp_driver.c
++@@ -1129,7 +1129,6 @@ mips_estimate(int num_trials, int *ignor
++ * These packets were made with the default SRTP policy.
++ */
++
++-
++ err_status_t
++ srtp_validate() {
++ unsigned char test_key[30] = {
++@@ -1144,14 +1143,14 @@ srtp_validate() {
++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
++ 0xab, 0xab, 0xab, 0xab
++ };
++- uint8_t srtp_plaintext[38] = {
+++ uint8_t srtp_plaintext[38] __attribute__((aligned(4))) = {
++ 0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
++ 0xca, 0xfe, 0xba, 0xbe, 0xab, 0xab, 0xab, 0xab,
++ 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,
++ 0xab, 0xab, 0xab, 0xab, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
++ };
++- uint8_t srtp_ciphertext[38] = {
+++ uint8_t srtp_ciphertext[38] __attribute__((aligned(4))) = {
++ 0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,
++ 0xca, 0xfe, 0xba, 0xbe, 0x4e, 0x55, 0xdc, 0x4c,
++ 0xe7, 0x99, 0x78, 0xd8, 0x8c, 0xa4, 0xd2, 0x15,
+diff --git a/feeds/telephony/libs/libsrtp/patches/1007_update_Doxyfile.patch b/feeds/telephony/libs/libsrtp/patches/1007_update_Doxyfile.patch
+new file mode 100644
+index 0000000..8108d7d
+--- /dev/null
++++ b/feeds/telephony/libs/libsrtp/patches/1007_update_Doxyfile.patch
+@@ -0,0 +1,94 @@
++Description: Update Doxyfile and header template
++Author: Jonas Smedegaard <dr@jones.dk>
++Last-Update: 2010-02-28
++--- a/doc/Makefile.in
+++++ b/doc/Makefile.in
++@@ -25,6 +25,7 @@ libsrtpdoc:
++ echo "*** Sorry, can't build doc outside source dir"; exit 1; \
++ fi
++ sed 's/LIBSRTPVERSION/$(version)/' header.template > header.tex
+++ doxygen -u
++ doxygen
++ sed 's/\subsection/\section/' latex/index.tex > latex/index.tmp
++ mv latex/index.tmp latex/index.tex
++@@ -38,7 +39,7 @@ cryptodoc: clean
++ cp latex/refman.pdf crypto.pdf
++
++ clean:
++- rm -rf latex/ header.tex
+++ rm -rf latex/ header.tex Doxyfile.bak
++ for a in * ; do \
++ if [ -f "$$a~" ] ; then rm -f $$a~; fi; \
++ done;
++--- a/doc/header.template
+++++ b/doc/header.template
++@@ -6,28 +6,40 @@
++ %
++ \documentclass[letterpaper]{book}
++ \usepackage{makeidx}
++-\usepackage{fancyhdr}
++ \usepackage{graphicx}
++ \usepackage{multicol}
++ \usepackage{float}
+++\usepackage{listings}
+++\usepackage{color}
+++\usepackage{ifthen}
+++\usepackage[table]{xcolor}
++ \usepackage{textcomp}
++ \usepackage{alltt}
++-\usepackage{times}
++-\usepackage{graphicx}
++-\ifx\pdfoutput\undefined
++-\usepackage[ps2pdf,
+++\usepackage{ifpdf}
+++\ifpdf
+++\usepackage[pdftex,
++ pagebackref=true,
++ colorlinks=true,
++- linkcolor=blue
+++ linkcolor=blue,
+++ unicode
++ ]{hyperref}
++ \else
++-\usepackage[pdftex,
+++\usepackage[ps2pdf,
++ pagebackref=true,
++ colorlinks=true,
++- linkcolor=blue
+++ linkcolor=blue,
+++ unicode
++ ]{hyperref}
+++\usepackage{pspicture}
++ \fi
+++\usepackage[utf8]{inputenc}
+++\usepackage{mathptmx}
+++\usepackage[scaled=.90]{helvet}
+++\usepackage{courier}
+++\usepackage{sectsty}
+++\usepackage[titles]{tocloft}
++ \usepackage{doxygen}
+++\lstset{language=C++,inputencoding=utf8,basicstyle=\footnotesize,breaklines=true,breakatwhitespace=true,tabsize=3,numbers=left }
++ \makeindex
++ \setcounter{tocdepth}{1}
++ \renewcommand{\footrulewidth}{0.4pt}
++@@ -59,7 +71,9 @@
++ \selectfont
++
++
+++\renewcommand{\familydefault}{\sfdefault}
++ \begin{document}
+++\hypersetup{pageanchor=false}
++ \begin{titlepage}
++ \vspace*{4cm}
++ %\begin{center}
++@@ -107,9 +121,6 @@ This reference material in this documena
++ \clearemptydoublepage
++ \pagenumbering{roman}
++ \tableofcontents
++-%\clearemptydoublepage
++-
++ \clearemptydoublepage
++ \pagenumbering{arabic}
++-
++-
+++\hypersetup{pageanchor=true}
+diff --git a/feeds/telephony/libs/libsrtp/patches/1008_shared-lib.patch b/feeds/telephony/libs/libsrtp/patches/1008_shared-lib.patch
+new file mode 100644
+index 0000000..96a13ca
+--- /dev/null
++++ b/feeds/telephony/libs/libsrtp/patches/1008_shared-lib.patch
+@@ -0,0 +1,55 @@
++Description: Hack build routines to compile shared library
++Author: loki_val and solar
++Origin: http://sources.gentoo.org/viewcvs.py/gentoo-x86/net-libs/libsrtp/files/libsrtp-1.4.4-shared.patch
++Last-Update: 2010-03-19
++--- a/Makefile.in
+++++ b/Makefile.in
++@@ -15,7 +15,7 @@
++
++ .PHONY: all test build_table_apps
++
++-all: test
+++all: libsrtp.so test
++
++ runtest: build_table_apps test
++ @echo "running libsrtp test applications..."
++@@ -67,7 +67,7 @@ libdir = @libdir@
++ # implicit rules for object files and test apps
++
++ %.o: %.c
++- $(COMPILE) -c $< -o $@
+++ $(COMPILE) -fPIC -c $< -o $@
++
++ %$(EXE): %.c
++ $(COMPILE) $(LDFLAGS) $< -o $@ $(SRTPLIB) $(LIBS)
++@@ -105,6 +105,9 @@ libsrtp.a: $(srtpobj) $(cryptobj) $(gdoi
++ ar cr libsrtp.a $^
++ $(RANLIB) libsrtp.a
++
+++libsrtp.so: $(srtpobj) $(cryptobj) $(gdoi)
+++ $(CC) $(LDFLAGS) -shared -Wl,-soname,libsrtp.so.0 -o libsrtp.so.0.0 $^
+++
++ # libcryptomath.a contains general-purpose routines that are used to
++ # generate tables and verify cryptoalgorithm implementations - this
++ # library is not meant to be included in production code
++@@ -197,6 +200,11 @@ install:
++ cp include/*.h $(DESTDIR)$(includedir)/srtp
++ cp crypto/include/*.h $(DESTDIR)$(includedir)/srtp
++ if [ -f libsrtp.a ]; then cp libsrtp.a $(DESTDIR)$(libdir)/; fi
+++ if [ -f libsrtp.so.0.0 ]; then \
+++ cp libsrtp.so.0.0 $(DESTDIR)$(libdir)/; \
+++ ln -s libsrtp.so.0.0 $(DESTDIR)$(libdir)/libsrtp.so.0; \
+++ ln -s libsrtp.so.0.0 $(DESTDIR)$(libdir)/libsrtp.so; \
+++ fi
++
++ uninstall:
++ rm -rf $(DESTDIR)$(includedir)/srtp
++@@ -204,7 +212,7 @@ uninstall:
++
++ clean:
++ rm -rf $(cryptobj) $(srtpobj) $(cryptomath) TAGS \
++- libcryptomath.a libsrtp.a core *.core test/core
+++ libcryptomath.a libsrtp.a libsrtp.so.0.0 core *.core test/core
++ for a in * */* */*/*; do \
++ if [ -f "$$a~" ] ; then rm -f $$a~; fi; \
++ done;
+diff --git a/feeds/telephony/libs/ortp/Makefile b/feeds/telephony/libs/ortp/Makefile
+new file mode 100644
+index 0000000..29a7f52
+--- /dev/null
++++ b/feeds/telephony/libs/ortp/Makefile
+@@ -0,0 +1,80 @@
++#
++# Copyright (C) 2010-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=ortp
++PKG_VERSION:=0.23.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SAVANNAH/linphone/ortp/sources
++PKG_MD5SUM:=fb833cc7a66ec1a0c1b75016130e7e6d
++
++PKG_LICENSE:=LGPL-2.1
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Nicolas Thill <nico@openwrt.org>
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libortp
++ SUBMENU:=Telephony
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=Real-time Transport Protocol (RTP) library
++ URL:=http://www.linphone.org/technical-corner/ortp/overview
++ DEPENDS:= +libpthread +librt
++endef
++
++ifneq ($(CONFIG_avr32),)
++ TARGET_CFLAGS += -fsigned-char
++endif
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --enable-static \
++ --disable-debug \
++ --enable-ipv6 \
++ --enable-perf \
++ --disable-ssl-hmac \
++ --disable-tests \
++ --without-srtp \
++
++CONFIGURE_VARS += \
++ ac_cv_header_srtp_srtp_h=no \
++ ac_cv_lib_srtp_srtp_init=no \
++ ac_cv_path_DOXYGEN= \
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/include/ortp \
++ $(1)/usr/include/ \
++ )
++ $(INSTALL_DIR) $(1)/usr/lib
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/libortp.{a,so*} \
++ $(1)/usr/lib/ \
++ )
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/pkgconfig/ortp.pc \
++ $(1)/usr/lib/pkgconfig/ \
++ )
++endef
++
++define Package/libortp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ ( cd $(PKG_INSTALL_DIR); $(CP) \
++ ./usr/lib/libortp.so.* \
++ $(1)/usr/lib/ \
++ )
++endef
++
++$(eval $(call BuildPackage,libortp))
+diff --git a/feeds/telephony/libs/pjproject/Makefile b/feeds/telephony/libs/pjproject/Makefile
+new file mode 100644
+index 0000000..f02af26
+--- /dev/null
++++ b/feeds/telephony/libs/pjproject/Makefile
+@@ -0,0 +1,117 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++# Copyright (C) 2015 Cesnet, z.s.p.o.
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pjproject
++PKG_VERSION:=2.4
++PKG_RELEASE:=1
++
++PKG_SOURCE:=pjproject-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://www.pjsip.org/release/$(PKG_VERSION)/
++PKG_MD5SUM:=39629ca3fcedbdc7dbd8c5a707060095
++PKG_INSTALL:=1
++PKG_FIXUP:=autoreconf
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/pjproject/Default
++ SECTION:=lib
++ CATEGORY:=Libraries
++ SUBMENU:=Telephony
++ URL:=http://www.pjsip.org/
++ DEPENDS:=+libuuid +libstdcpp +libpthread
++endef
++
++define Package/pjproject/install/lib
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/$(2).so* $(1)/usr/lib/
++endef
++
++define PJSIPpackage
++ define Package/$(1)
++ $$(call Package/pjproject/Default)
++ TITLE:=$(1) library
++ DEPENDS+=$(3)
++ endef
++
++ define Package/$(1)/install
++$(call Package/pjproject/install/lib,$$(1),$2)
++ endef
++
++ $$(eval $$(call BuildPackage,$(1)))
++endef
++
++CONFIGURE_ARGS += \
++ --enable-shared \
++ --disable-floating-point \
++ --enable-g711-codec \
++ --disable-l16-codec \
++ --disable-g722-codec \
++ --disable-g7221-codec \
++ --disable-gsm-codec \
++ --disable-ilbc-coder \
++ --disable-ipp \
++ --disable-ssl \
++ --disable-oss \
++ --disable-sound \
++ --with-external-srtp="$(STAGING_DIR)/usr" \
++ --without-external-gsm \
++ --disable-small-filter \
++ --disable-large-filter \
++ --disable-speex-aec \
++ --disable-g711-codec \
++ --disable-l16-codec \
++ --disable-gsm-codec \
++ --disable-g722-codec \
++ --disable-g7221-codec \
++ --disable-speex-codec \
++ --disable-ilbc-codec \
++ --disable-resample-dll \
++ --disable-sdl \
++ --disable-ffmpeg \
++ --disable-v4l2
++
++TARGET_LDFLAGS+=-lc $(LIBGCC) -lm
++TARGET_CFLAGS+=$(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)
++
++define Build/Compile
++ $(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR)
++endef
++
++PJPROJECT_LIBS = \
++ libpj libpjlib-util libpjmedia-audiodev libpjmedia-codec \
++ libpjmedia-videodev libpjmedia libpjnath libpjsip-simple \
++ libpjsip-ua libpjsip libpjsua libpjsua2 libresample
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/{include,lib}
++
++ $(CP) -R $(PKG_INSTALL_DIR)/usr/include/* $(1)/usr/include/
++
++ $(foreach m,$(PJPROJECT_LIBS),$(CP) $(PKG_INSTALL_DIR)/usr/lib/$(m)* $(1)/usr/lib/;)
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libpjproject.pc $(1)/usr/lib/pkgconfig/
++endef
++
++$(eval $(call PJSIPpackage,libpj,libpj,+librt))
++$(eval $(call PJSIPpackage,libpjlib-util,libpjlib-util,+libpj +librt))
++$(eval $(call PJSIPpackage,libpjmedia,libpjmedia*,+libpj +libpjlib-util +libpjnath +libresample +librt +libspeex +libsrtp))
++$(eval $(call PJSIPpackage,libpjnath,libpjnath,+libpj +libpjlib-util +librt))
++$(eval $(call PJSIPpackage,libpjsip-simple,libpjsip-simple,+libpj +libpjlib-util +libpjsip +libresample +librt +libspeex +libsrtp))
++$(eval $(call PJSIPpackage,libpjsip-ua,libpjsip-ua,+libpj +libpjlib-util +libpjmedia +libpjsip-simple +libpjsip +libresample +librt +libspeex +libsrtp))
++$(eval $(call PJSIPpackage,libpjsip,libpjsip,+libpj +libpjlib-util +libresample +librt +libspeex +libsrtp))
++$(eval $(call PJSIPpackage,libpjsua,libpjsua,+libpj +libpjlib-util +libpjmedia +libpjnath +libpjsip-simple +libpjsip-ua +libpjsip +libresample +librt +libspeex +libsrtp))
++$(eval $(call PJSIPpackage,libpjsua2,libpjsua2,+libpj +libpjlib-util +libpjmedia +libpjnath +libpjsip-simple +libpjsip-ua +libpjsip +libresample +librt +libspeex +libsrtp +libpjsua))
++$(eval $(call PJSIPpackage,libresample,libresample,))
+diff --git a/feeds/telephony/libs/pjproject/patches/001-change_linker.patch b/feeds/telephony/libs/pjproject/patches/001-change_linker.patch
+new file mode 100644
+index 0000000..5fd1503
+--- /dev/null
++++ b/feeds/telephony/libs/pjproject/patches/001-change_linker.patch
+@@ -0,0 +1,11 @@
++--- a/build/cc-auto.mak.in
+++++ b/build/cc-auto.mak.in
++@@ -2,7 +2,7 @@ export CC = @CC@ -c
++ export CXX = @CXX@ -c
++ export AR = @AR@
++ export AR_FLAGS = @AR_FLAGS@
++-export LD = @LD@
+++export LD = @CXX@
++ export LDOUT = -o
++ export RANLIB = @RANLIB@
++
+diff --git a/feeds/telephony/libs/pjproject/patches/100-uclibc-linker-unrecognized-options.patch b/feeds/telephony/libs/pjproject/patches/100-uclibc-linker-unrecognized-options.patch
+new file mode 100644
+index 0000000..9930cef
+--- /dev/null
++++ b/feeds/telephony/libs/pjproject/patches/100-uclibc-linker-unrecognized-options.patch
+@@ -0,0 +1,11 @@
++--- a/build/rules.mak
+++++ b/build/rules.mak
++@@ -13,7 +13,7 @@ SHLIB = $($(APP)_SHLIB)
++ SONAME = $($(APP)_SONAME)
++
++ ifeq ($(SHLIB_SUFFIX),so)
++-SHLIB_OPT := -shared -Wl,-soname,$(SHLIB)
+++SHLIB_OPT := -shared
++ else ifeq ($(SHLIB_SUFFIX),dylib)
++ SHLIB_OPT := -dynamiclib -undefined dynamic_lookup -flat_namespace
++ else ifeq ($(SHLIB_SUFFIX),dll)
+diff --git a/feeds/telephony/libs/pjproject/patches/120-non-gnu-pthreads.patch b/feeds/telephony/libs/pjproject/patches/120-non-gnu-pthreads.patch
+new file mode 100644
+index 0000000..e01b542
+--- /dev/null
++++ b/feeds/telephony/libs/pjproject/patches/120-non-gnu-pthreads.patch
+@@ -0,0 +1,66 @@
++Index: pjproject-2.4/pjlib/src/pj/os_core_unix.c
++===================================================================
++--- pjproject-2.4.orig/pjlib/src/pj/os_core_unix.c
+++++ pjproject-2.4/pjlib/src/pj/os_core_unix.c
++@@ -1123,7 +1123,7 @@ static pj_status_t init_mutex(pj_mutex_t
++ return PJ_RETURN_OS_ERROR(rc);
++
++ if (type == PJ_MUTEX_SIMPLE) {
++-#if (defined(PJ_LINUX) && PJ_LINUX!=0) || \
+++#if (defined(PJ_LINUX) && PJ_LINUX!=0 && defined(__GLIBC__)) || \
++ defined(PJ_HAS_PTHREAD_MUTEXATTR_SETTYPE)
++ rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_FAST_NP);
++ #elif (defined(PJ_RTEMS) && PJ_RTEMS!=0) || \
++@@ -1133,7 +1133,7 @@ static pj_status_t init_mutex(pj_mutex_t
++ rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
++ #endif
++ } else {
++-#if (defined(PJ_LINUX) && PJ_LINUX!=0) || \
+++#if (defined(PJ_LINUX) && PJ_LINUX!=0 && defined(__GLIBC__)) || \
++ defined(PJ_HAS_PTHREAD_MUTEXATTR_SETTYPE)
++ rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
++ #elif (defined(PJ_RTEMS) && PJ_RTEMS!=0) || \
++Index: pjproject-2.4/pjsip-apps/src/samples/siprtp.c
++===================================================================
++--- pjproject-2.4.orig/pjsip-apps/src/samples/siprtp.c
+++++ pjproject-2.4/pjsip-apps/src/samples/siprtp.c
++@@ -1134,7 +1134,7 @@ static void boost_priority(void)
++ PJ_RETURN_OS_ERROR(rc));
++ return;
++ }
++- tp.__sched_priority = max_prio;
+++ tp.sched_priority = max_prio;
++
++ rc = sched_setscheduler(0, POLICY, &tp);
++ if (rc != 0) {
++@@ -1143,7 +1143,7 @@ static void boost_priority(void)
++ }
++
++ PJ_LOG(4, (THIS_FILE, "New process policy=%d, priority=%d",
++- policy, tp.__sched_priority));
+++ policy, tp.sched_priority));
++
++ /*
++ * Adjust thread scheduling algorithm and priority
++@@ -1156,10 +1156,10 @@ static void boost_priority(void)
++ }
++
++ PJ_LOG(4, (THIS_FILE, "Old thread policy=%d, priority=%d",
++- policy, tp.__sched_priority));
+++ policy, tp.sched_priority));
++
++ policy = POLICY;
++- tp.__sched_priority = max_prio;
+++ tp.sched_priority = max_prio;
++
++ rc = pthread_setschedparam(pthread_self(), policy, &tp);
++ if (rc != 0) {
++@@ -1169,7 +1169,7 @@ static void boost_priority(void)
++ }
++
++ PJ_LOG(4, (THIS_FILE, "New thread policy=%d, priority=%d",
++- policy, tp.__sched_priority));
+++ policy, tp.sched_priority));
++ }
++
++ #else
+diff --git a/feeds/telephony/libs/re/Makefile b/feeds/telephony/libs/re/Makefile
+new file mode 100644
+index 0000000..64e55aa
+--- /dev/null
++++ b/feeds/telephony/libs/re/Makefile
+@@ -0,0 +1,69 @@
++#
++# Copyright (C) 2010-2015 OpenWrt.org
++# Copyright (C) 2010 Alfred E. Heggestad
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=re
++PKG_VERSION:=0.4.13
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.creytiv.com/pub
++PKG_MD5SUM:=d5405878ca66c09d5e2e3b4e3d0c4c26
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=docs/COPYING
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libre
++ SUBMENU:=Telephony
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libopenssl +libpthread
++ TITLE:=Generic library for real-time communications with async IO support
++ URL:=http://www.creytiv.com/
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++ifneq ($(CONFIG_USE_GLIBC)$(CONFIG_USE_MUSL),)
++TARGET_CFLAGS += -D_GNU_SOURCE
++endif
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ HAVE_LIBRESOLV= \
++ CC="$(TARGET_CC)" \
++ EXTRA_CFLAGS="$(TARGET_CFLAGS) -DOPENWRT" \
++ EXTRA_LFLAGS="-lm" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ SYSROOT="$$$$($(FIND) $(TOOLCHAIN_DIR) -path '*/include/pthread.h' | sed -ne '1s#/include/pthread.h##p')" \
++ SYSROOT_ALT="$(STAGING_DIR)/usr" \
++ RELEASE=1 \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ OS=linux \
++ all install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/share/re
++ $(CP) $(PKG_BUILD_DIR)/mk/re.mk $(1)/usr/share/re/
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/re $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libre.{a,so} $(1)/usr/lib/
++endef
++
++define Package/libre/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libre.so $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libre))
+diff --git a/feeds/telephony/libs/rem/Makefile b/feeds/telephony/libs/rem/Makefile
+new file mode 100644
+index 0000000..5e013b8
+--- /dev/null
++++ b/feeds/telephony/libs/rem/Makefile
+@@ -0,0 +1,67 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++# Copyright (C) 2010 Alfred E. Heggestad
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=rem
++PKG_VERSION:=0.4.6
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.creytiv.com/pub
++PKG_MD5SUM:=888c3000aa002790cc7129fa72d39a58
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=docs/COPYING
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/librem
++ SUBMENU:=Telephony
++ SECTION:=libs
++ CATEGORY:=Libraries
++ DEPENDS:=+libre +libpthread
++ TITLE:=Audio and video processing media library
++ URL:=http://www.creytiv.com/
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ LIBRE_MK=$(STAGING_DIR)/usr/share/re/re.mk \
++ LIBRE_INC=$(STAGING_DIR)/usr/include/re \
++ LIBRE_SO=$(STAGING_DIR)/usr/lib \
++ CC="$(TARGET_CC)" \
++ EXTRA_CFLAGS="$(TARGET_CFLAGS) -DOPENWRT" \
++ EXTRA_LFLAGS="-lm" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ SYSROOT="$$$$($(FIND) $(TOOLCHAIN_DIR) -path '*/include/pthread.h' | sed -ne '1s#/include/pthread.h##p')" \
++ SYSROOT_ALT="$(STAGING_DIR)/usr" \
++ RELEASE=1 \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ OS=linux \
++ all install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/rem $(1)/usr/include/
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/librem.{a,so} $(1)/usr/lib/
++endef
++
++define Package/librem/install
++ rm -f $(BUILD_DIR)/$(PKG_NAME)
++ ln -sf $(PKG_NAME)-$(PKG_VERSION) $(BUILD_DIR)/$(PKG_NAME)
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/librem.so $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,librem))
+diff --git a/feeds/telephony/libs/rem/patches/100-no-pthread_rwlockattr_setkind_np-on-musl.patch b/feeds/telephony/libs/rem/patches/100-no-pthread_rwlockattr_setkind_np-on-musl.patch
+new file mode 100644
+index 0000000..43e6d32
+--- /dev/null
++++ b/feeds/telephony/libs/rem/patches/100-no-pthread_rwlockattr_setkind_np-on-musl.patch
+@@ -0,0 +1,13 @@
++Index: rem-0.4.6/src/vidmix/vidmix.c
++===================================================================
++--- rem-0.4.6.orig/src/vidmix/vidmix.c
+++++ rem-0.4.6/src/vidmix/vidmix.c
++@@ -343,7 +343,7 @@ int vidmix_alloc(struct vidmix **mixp)
++ return err;
++ }
++
++-#ifdef LINUX
+++#if defined(LINUX) && defined(__GLIBC__)
++ err = pthread_rwlockattr_setkind_np(&attr,
++ PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
++ if (err)
+diff --git a/feeds/telephony/libs/spandsp/Makefile b/feeds/telephony/libs/spandsp/Makefile
+new file mode 100644
+index 0000000..9971774
+--- /dev/null
++++ b/feeds/telephony/libs/spandsp/Makefile
+@@ -0,0 +1,60 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=spandsp
++PKG_VERSION:=0.0.6
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.soft-switch.org/downloads/spandsp/
++PKG_MD5SUM:=897d839516a6d4edb20397d4757a7ca3
++
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++PKG_FIXUP:=autoreconf
++
++PKG_LICENSE:=LGPL-2.1 GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/libspandsp
++ SUBMENU:=Telephony
++ SECTION:=libs
++ CATEGORY:=Libraries
++ TITLE:=spandsp library
++ DEPENDS:=+libtiff
++endef
++
++TARGET_CFLAGS += $(FPIC)
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libspandsp* $(1)/usr/lib/
++
++ $(INSTALL_DIR) $(1)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/spandsp.h $(1)/usr/include/
++
++ $(INSTALL_DIR) $(1)/usr/include/spandsp
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/spandsp/*.h $(1)/usr/include/spandsp/
++
++ $(INSTALL_DIR) $(1)/usr/include/spandsp/private
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/spandsp/private/*.h $(1)/usr/include/spandsp/private/
++
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/spandsp.pc $(1)/usr/lib/pkgconfig/
++endef
++
++define Package/libspandsp/install
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/libspandsp*so* $(1)/usr/lib/
++endef
++
++$(eval $(call BuildPackage,libspandsp))
+diff --git a/feeds/telephony/libs/spandsp/patches/100-compile-fixes.patch b/feeds/telephony/libs/spandsp/patches/100-compile-fixes.patch
+new file mode 100644
+index 0000000..59b85e6
+--- /dev/null
++++ b/feeds/telephony/libs/spandsp/patches/100-compile-fixes.patch
+@@ -0,0 +1,23 @@
++--- a/src/spandsp/fast_convert.h
+++++ b/src/spandsp/fast_convert.h
++@@ -195,7 +195,7 @@ extern "C"
++ {
++ return (long int) (x);
++ }
++-#elif defined(__ppc__) || defined(__powerpc__)
+++#elif defined(THISISNOTDEFINEDYADDAYADDA)
++ static __inline__ long int lfastrint(register double x)
++ {
++ int res[2];
++--- a/configure.ac
+++++ b/configure.ac
++@@ -152,9 +152,7 @@ AC_ARG_ENABLE(builtin_tiff,
++
++ AC_FUNC_ERROR_AT_LINE
++ AC_FUNC_VPRINTF
++-AC_FUNC_MALLOC
++ AC_FUNC_MEMCMP
++-AC_FUNC_REALLOC
++ AC_FUNC_SELECT_ARGTYPES
++
++ AX_C99_FUNC_LRINT
+diff --git a/feeds/telephony/net/asterisk-1.8.x/Makefile b/feeds/telephony/net/asterisk-1.8.x/Makefile
+new file mode 100644
+index 0000000..26854d0
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-1.8.x/Makefile
+@@ -0,0 +1,391 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++# Copyright (C) 2015 Cesnet, z.s.p.o.
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=asterisk18
++PKG_VERSION:=1.8.32.3
++PKG_RELEASE:=4
++
++PKG_SOURCE:=asterisk-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.asterisk.org/pub/telephony/asterisk/releases/
++PKG_MD5SUM:=f13f126e7730710223f2fbbc8832966f
++
++PKG_BUILD_DIR=$(BUILD_DIR)/asterisk-$(PKG_VERSION)
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING LICENSE
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/asterisk18/install/module
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/*$(2).so* $(1)/usr/lib/asterisk/modules/
++endef
++
++define Package/asterisk18/install/conffile
++ $(INSTALL_DIR) $(1)/etc/asterisk
++ $(CP) $(PKG_INSTALL_DIR)/etc/asterisk/*$(2)* $(1)/etc/asterisk/
++endef
++
++define Package/asterisk18/install/lib
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/$(2).so* $(1)/usr/lib/
++endef
++
++define Package/asterisk18/install/sbin
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/$(2) $(1)/usr/sbin/
++endef
++
++define Package/asterisk18/install/sounds
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/$(2) $(1)/usr/lib/asterisk/sounds/
++endef
++
++define BuildAsterisk18Module
++ define Package/asterisk18-$(1)
++ $$(call Package/asterisk18/Default)
++ TITLE:=$(2) support
++ DEPENDS:= asterisk18 $(patsubst +%,+PACKAGE_asterisk18-$(1):%,$(4))
++ endef
++
++ define Package/asterisk18-$(1)/conffiles
++$(5)
++ endef
++
++ define Package/asterisk18-$(1)/description
++This package provides support for '$(3)' in Asterisk.
++ endef
++
++ define Package/asterisk18-$(1)/install
++$(foreach c,$(6),$(call Package/asterisk18/install/conffile,$$(1),$(c));)
++$(foreach m,$(7),$(call Package/asterisk18/install/module,$$(1),$(m));)
++$(foreach s,$(8),$(call Package/asterisk18/install/sounds,$$(1),$(s));)
++$(foreach b,$(9),$(call Package/asterisk18/install/sbin,$$(1),$(b));)
++ endef
++
++ $$(eval $$(call BuildPackage,asterisk18-$(1)))
++endef
++
++define Package/asterisk18/Default
++ SUBMENU:=Telephony
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://www.asterisk.org/
++endef
++
++define Package/asterisk18/Default/description
++ Asterisk is a complete PBX in software. It provides all of the features
++ you would expect from a PBX and more. Asterisk does voice over IP in three
++ protocols, and can interoperate with almost all standards-based telephony
++ equipment using relatively inexpensive hardware.
++endef
++
++define Package/asterisk18
++$(call Package/asterisk18/Default)
++ TITLE:=Complete open source PBX, v1.8.x
++ MENU:=1
++ DEPENDS:=+libopenssl +libncurses +libpopt +libpthread +zlib @!TARGET_avr32
++endef
++
++define Package/asterisk18/description
++$(call Package/asterisk18/Default/description)
++endef
++
++define Package/asterisk18/conffiles
++/etc/asterisk/cel.conf
++/etc/asterisk/asterisk.conf
++/etc/asterisk/modules.conf
++/etc/asterisk/extensions.conf
++/etc/asterisk/sip.conf
++/etc/asterisk/sip_notify.conf
++/etc/asterisk/features.conf
++/etc/asterisk/indications.conf
++/etc/asterisk/logger.conf
++/etc/asterisk/manager.conf
++/etc/asterisk/rtp.conf
++/etc/init.d/asterisk
++endef
++
++AST_CFG_FILES:=\
++ asterisk.conf cel.conf ccss.conf extensions.conf features.conf indications.conf logger.conf manager.conf \
++ modules.conf sip.conf sip_notify.conf rtp.conf users.conf
++AST_EMB_MODULES:=\
++ app_dial app_echo app_macro app_playback codec_ulaw codec_gsm format_gsm format_pcm format_wav format_wav_gsm \
++ func_strings func_timeout func_callerid func_logic chan_sip pbx_config res_rtp_asterisk res_rtp_multicast
++
++define Package/asterisk18/install
++$(call Package/asterisk18/install/sbin,$(1),asterisk)
++$(foreach m,$(AST_CFG_FILES),$(call Package/asterisk18/install/conffile,$(1),$(m));)
++$(foreach m,$(AST_EMB_MODULES),$(call Package/asterisk18/install/module,$(1),$(m));)
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/asterisk.init $(1)/etc/init.d/asterisk
++endef
++
++define Package/asterisk18-sounds
++$(call Package/asterisk18/Default)
++ TITLE:=Sounds support
++ DEPENDS:=asterisk18
++endef
++
++define Package/asterisk18-sounds/description
++This package provides sound-files for Asterisk-1.8.x.
++endef
++
++define Package/asterisk18-sounds/install
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/* $(1)/usr/lib/asterisk/sounds/
++ rm -f $(1)/usr/lib/asterisk/sounds/vm-*
++ rm -f $(1)/usr/lib/asterisk/sounds/conf-*
++endef
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-chan-dahdi),)
++ CONFIGURE_ARGS+= \
++ --with-dahdi="$(STAGING_DIR)/usr" \
++ --with-pri="$(STAGING_DIR)/usr" \
++ --with-tonezone="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-dahdi \
++ --without-pri \
++ --without-tonezone
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-chan-gtalk),)
++ CONFIGURE_ARGS+= \
++ --with-iksemel="$(STAGING_DIR)/usr"
++ SITE_VARS+= \
++ ac_cv_lib_iksemel_iks_start_sasl=yes
++else
++ CONFIGURE_ARGS+= \
++ --without-iksemel
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-curl),)
++ CONFIGURE_ARGS+= \
++ --with-libcurl="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-libcurl
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-mysql),)
++ CONFIGURE_ARGS+= \
++ --with-mysqlclient="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-mysqlclient
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-pbx-lua),)
++ CONFIGURE_ARGS+= \
++ --with-lua="$(STAGING_DIR)/usr"
++ TARGET_LDFLAGS+=-ldl -lcrypt
++else
++ CONFIGURE_ARGS+= \
++ --without-lua
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-pgsql),)
++ CONFIGURE_ARGS+= \
++ --with-postgres="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-postgres
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-res-fax-spandsp),)
++ CONFIGURE_ARGS+= \
++ --with-spandsp="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-spandsp
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk18-res-srtp),)
++ CONFIGURE_ARGS+= \
++ --with-srtp="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-srtp
++endif
++
++EXTRA_CFLAGS+= $(TARGET_CPPFLAGS)
++EXTRA_LDFLAGS+= $(TARGET_LDFLAGS)
++CONFIGURE_ARGS+= \
++ --without-curses \
++ --with-gsm=internal \
++ --without-bluetooth \
++ --without-cap \
++ --without-gtk2 \
++ --without-isdnnet \
++ --without-misdn \
++ --without-nbs \
++ --with-ncurses="$(STAGING_DIR)/usr" \
++ --without-neon \
++ --without-neon29 \
++ --without-netsnmp \
++ --without-newt \
++ --without-ogg \
++ --without-osptk \
++ --with-popt="$(STAGING_DIR)/usr" \
++ --without-radius \
++ --without-sdl \
++ --without-suppserv \
++ --without-tds \
++ --without-termcap \
++ --without-tinfo \
++ --without-vorbis \
++ --without-vpb \
++ --with-z="$(STAGING_DIR)/usr" \
++ --with-sounds-cache="$(DL_DIR)" \
++ --disable-xmldoc
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ifneq ($(CONFIG_TARGET_lantiq),)
++ifneq ($(CONFIG_TARGET_lantiq_xrx200),y)
++ $(CP) ./src-lantiq/* $(PKG_BUILD_DIR)/
++endif
++endif
++endef
++
++define Build/Configure
++ $(call Build/Configure/Default,,$(SITE_VARS))
++endef
++
++define Build/Compile
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ include/asterisk/version.h \
++ include/asterisk/buildopts.h defaults.h \
++ makeopts.embed_rules
++ ASTCFLAGS="$(EXTRA_CFLAGS) -DLOW_MEMORY" \
++ ASTLDFLAGS="$(EXTRA_LDFLAGS)" \
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ ASTVARLIBDIR="/usr/lib/asterisk" \
++ ASTDATADIR="/usr/lib/asterisk" \
++ ASTKEYDIR="/usr/lib/asterisk" \
++ ASTDBDIR="/usr/lib/asterisk" \
++ NOISY_BUILD="1" \
++ DEBUG="" \
++ OPTIMIZE="" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install samples
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/asterisk-1.8/include/asterisk/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk/*.h $(1)/usr/include/asterisk-1.8/include/asterisk/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk.h $(1)/usr/include/asterisk-1.8/include/
++endef
++
++$(eval $(call BuildPackage,asterisk18))
++$(eval $(call BuildPackage,asterisk18-sounds))
++
++################################
++# AST modules
++# Params:
++# 1 - Package subname
++# 2 - Package title
++# 3 - Module description
++# 4 - Module dependencies
++# 5 - Full path to multiple conffiles
++# 6 - conf files
++# 7 - module files
++# 8 - sound files
++# 9 - binary files
++################################
++
++$(eval $(call BuildAsterisk18Module,app-alarmreceiver,Alarm receiver,Central Station Alarm receiver for Ademco Contact ID,,,,app_alarmreceiver,))
++$(eval $(call BuildAsterisk18Module,app-authenticate,Authenticate commands,Execute arbitrary authenticate commands,,,,app_authenticate,))
++$(eval $(call BuildAsterisk18Module,app-dahdiras,Execute an ISDN RAS,support for executing an ISDN RAS using DAHDI,+asterisk18-chan-dahdi,,,app_dahdiras,))
++$(eval $(call BuildAsterisk18Module,app-directed_pickup,Directed call pickup,support for directed call pickup,,,,app_directed_pickup,))
++$(eval $(call BuildAsterisk18Module,app-disa,Direct Inward System Access,Direct Inward System Access,,,,app_disa,))
++$(eval $(call BuildAsterisk18Module,app-exec,Exec application,support for application execution,,,,app_exec,))
++$(eval $(call BuildAsterisk18Module,app-chanisavail,Channel availability check,support for checking if a channel is available,,,,app_chanisavail,))
++$(eval $(call BuildAsterisk18Module,app-chanspy,Channel listen in,support for listening in on any channel,,,,app_chanspy,))
++$(eval $(call BuildAsterisk18Module,app-minivm,Minimal voicemail system,a voicemail system in small building blocks working together based on the Comedian Mail voicemail,,/etc/asterisk/extensions_minivm.conf /etc/asterisk/minivm.conf,extensions_minivm.conf minivm.conf,app_minivm,))
++$(eval $(call BuildAsterisk18Module,app-mixmonitor,Record a call and mix the audio,record a call and mix the audio during the recording,,,,app_mixmonitor,))
++$(eval $(call BuildAsterisk18Module,app-originate,Originate a call,originating an outbound call and connecting it to a specified extension or application,,,,app_originate,))
++$(eval $(call BuildAsterisk18Module,app-playtones,Playtones application,play a tone list,,,,app_playtones,))
++$(eval $(call BuildAsterisk18Module,app-read,Variable read,a trivial application to read a variable,,,,app_read,))
++$(eval $(call BuildAsterisk18Module,app-readexten,Extension to variable,a trivial application to read an extension into a variable,,,,app_readexten,))
++$(eval $(call BuildAsterisk18Module,app-record,Record sound file,to record a sound file,,,,app_record,))
++$(eval $(call BuildAsterisk18Module,app-sayunixtime,Say Unix time,an application to say Unix time,,,,app_sayunixtime,))
++$(eval $(call BuildAsterisk18Module,app-senddtmf,Send DTMF digits,Sends arbitrary DTMF digits,,,,app_senddtmf,))
++$(eval $(call BuildAsterisk18Module,app-setcallerid,Set callerid,Support for setting callerid,,,,app_setcallerid,))
++$(eval $(call BuildAsterisk18Module,app-sms,SMS,SMS support (ETSI ES 201 912 protocol 1),+libpopt +libstdcpp,,,app_sms,,smsq))
++$(eval $(call BuildAsterisk18Module,app-stack,Stack applications, stack applications Gosub Return etc., +asterisk18-res-agi,,,app_stack,))
++$(eval $(call BuildAsterisk18Module,app-system,System exec,support for executing system commands,,,,app_system,))
++$(eval $(call BuildAsterisk18Module,app-talkdetect,File playback with audio detect,for file playback with audio detect,,,,app_talkdetect,))
++$(eval $(call BuildAsterisk18Module,app-verbose,Verbose logging,Verbose logging application,,,,app_verbose,))
++$(eval $(call BuildAsterisk18Module,app-waituntil,Sleep,support sleeping until the given epoch,,,,app_waituntil,))
++$(eval $(call BuildAsterisk18Module,app-while,While loop,a while loop implementation,,,,app_while,))
++$(eval $(call BuildAsterisk18Module,cdr-csv,Provides CDR CSV,Call Detail Record with CSV support,,,,cdr_csv,))
++$(eval $(call BuildAsterisk18Module,cdr,Provides CDR,Call Detail Record,,/etc/asterisk/cdr.conf /etc/asterisk/cdr_custom.conf /etc/asterisk/cdr_manager.conf /etc/asterisk/cdr_syslog.conf,cdr cdr_custom cdr_manager cdr_syslog,app_cdr app_forkcdr cdr_custom cdr_manager cdr_syslog func_cdr,))
++$(eval $(call BuildAsterisk18Module,codec-a-mu,Alaw to ulaw translation,translation between alaw and ulaw codecs,,,,codec_a_mu,))
++$(eval $(call BuildAsterisk18Module,codec-alaw,Signed linear to alaw translation,translation between signed linear and alaw codecs,,,,codec_alaw,))
++$(eval $(call BuildAsterisk18Module,codec-dahdi,DAHDI codec,DAHDI native transcoding support,+asterisk18-chan-dahdi,,,codec_dahdi,))
++$(eval $(call BuildAsterisk18Module,codec-g722,G.722,a high bit rate 48/56/64Kbps ITU standard codec,,,,codec_g722,))
++$(eval $(call BuildAsterisk18Module,codec-g726,Signed linear to G.726 translation,translation between signed linear and ITU G.726-32kbps codecs,,,,codec_g726,))
++$(eval $(call BuildAsterisk18Module,curl,CURL,CURL support,+libcurl,,,func_curl res_curl,))
++$(eval $(call BuildAsterisk18Module,format-g726,G.726,support for headerless G.726 16/24/32/40kbps data format,,,,format_g726,))
++$(eval $(call BuildAsterisk18Module,format-g729,G.729,support for raw headerless G729 data,,,,format_g729,))
++$(eval $(call BuildAsterisk18Module,format-sln,Raw slinear format,support for raw slinear format,,,,format_sln,))
++$(eval $(call BuildAsterisk18Module,format-sln16,Raw slinear 16 format,support for raw slinear 16 format,,,,format_sln16,))
++$(eval $(call BuildAsterisk18Module,func-base64,base64 support,support of base64 function,,,,func_base64,))
++$(eval $(call BuildAsterisk18Module,func-blacklist,Blacklist on callerid,looking up the callerid number and see if it is blacklisted,,,,func_blacklist,))
++$(eval $(call BuildAsterisk18Module,func-cut,CUT function,CUT function,,,,func_cut,))
++$(eval $(call BuildAsterisk18Module,func-db,Database interaction,functions for interaction with the database,,,,func_db app_db,))
++$(eval $(call BuildAsterisk18Module,func-devstate,Blinky lights control,functions for manually controlled blinky lights,,,,func_devstate,))
++$(eval $(call BuildAsterisk18Module,func-enum,ENUM,ENUM,,/etc/asterisk/enum.conf,enum.conf,func_enum,))
++$(eval $(call BuildAsterisk18Module,func-env,Environment functions,Environment dialplan functions,,,,func_env,))
++$(eval $(call BuildAsterisk18Module,func-extstate,Hinted extension state,retrieving the state of a hinted extension for dialplan control,,,,func_extstate,))
++$(eval $(call BuildAsterisk18Module,func-global,Global variable,global variable dialplan functions,,,,func_global,))
++$(eval $(call BuildAsterisk18Module,func-groupcount,Group count,for counting number of channels in the specified group,,,,func_groupcount,))
++$(eval $(call BuildAsterisk18Module,func-channel,Channel info,Channel info dialplan function,,,,func_channel,))
++$(eval $(call BuildAsterisk18Module,func-math,Math functions,Math functions,,,,func_math,))
++$(eval $(call BuildAsterisk18Module,func-module,Simple module check function,Simple module check function,,,,func_module,))
++$(eval $(call BuildAsterisk18Module,func-shell,Shell,support for shell execution,,,,func_shell,))
++$(eval $(call BuildAsterisk18Module,func-uri,URI encoding and decoding,Encodes and decodes URI-safe strings,,,,func_uri,))
++$(eval $(call BuildAsterisk18Module,func-vmcount,vmcount dialplan,a vmcount dialplan function,,,,func_vmcount,))
++$(eval $(call BuildAsterisk18Module,chan-agent,Agents proxy channel,An implementation of agents proxy channel,,,,chan_agent,))
++$(eval $(call BuildAsterisk18Module,chan-dahdi,DAHDI channel,DAHDI channel support,+dahdi-tools-libtonezone +kmod-dahdi +libpri,/etc/asterisk/chan_dahdi.conf,chan_dahdi.conf,chan_dahdi,))
++$(eval $(call BuildAsterisk18Module,chan-gtalk,GTalk,An implementation of chan_gtalk and res_jabber for GTalk support,+libiksemel,/etc/asterisk/gtalk.conf /etc/asterisk/jabber.conf,gtalk.conf jabber.conf,chan_gtalk res_jabber,))
++$(eval $(call BuildAsterisk18Module,chan-iax2,IAX2 channel,An implementation of IAX2 channel,+asterisk18-res-timing-timerfd,/etc/asterisk/iax.conf /etc/asterisk/iaxprov.conf,iax.conf iaxprov.conf,chan_iax2,))
++$(eval $(call BuildAsterisk18Module,chan-lantiq,Lantiq TAPI channel,An implementation of Lantiq TAPI channel,@TARGET_lantiq @!TARGET_lantiq_xrx200 +kmod-ltq-vmmc,/etc/asterisk/lantiq.conf,lantiq.conf,chan_lantiq,))
++$(eval $(call BuildAsterisk18Module,chan-local,Local proxy channel,An implementation of local proxy channel,,,,chan_local,))
++$(eval $(call BuildAsterisk18Module,chan-mgcp,MGCP channel,the channel chan_mgcp,,/etc/asterisk/mgcp.conf,mgcp.conf,chan_mgcp,))
++$(eval $(call BuildAsterisk18Module,chan-ooh323,ooH323 channel,the channel chan_ooh323,,/etc/asterisk/ooh323.conf,ooh323.conf,chan_ooh323,))
++$(eval $(call BuildAsterisk18Module,chan-skinny,Skinny channel,the channel chan_skinny,,/etc/asterisk/skinny.conf,skinny.conf,chan_skinny,))
++$(eval $(call BuildAsterisk18Module,mysql,MySQL,MySQL support,+libmysqlclient,/etc/asterisk/res_config_mysql.conf,res_config_mysql.conf,res_config_mysql,))
++$(eval $(call BuildAsterisk18Module,odbc,ODBC,ODBC support,+libpthread +libc +unixodbc,/etc/asterisk/cdr_adaptive_odbc.conf /etc/asterisk/cdr_odbc.conf /etc/asterisk/cel_odbc.conf /etc/asterisk/func_odbc.conf /etc/asterisk/res_odbc.conf,cdr_adaptive_odbc cdr_odbc cel_odbc func_odbc res_odbc,cdr_adaptive_odbc cdr_odbc cel_odbc func_odbc res_config_odbc res_odbc,))
++$(eval $(call BuildAsterisk18Module,pbx-ael,Asterisk Extension Logic,support for symbolic Asterisk Extension Logic,,,extensions.ael,pbx_ael,))
++$(eval $(call BuildAsterisk18Module,pbx-dundi,Dundi,provides Dundi Lookup service for Asterisk,,/etc/asterisk/dundi.conf,dundi.conf,pbx_dundi,))
++$(eval $(call BuildAsterisk18Module,pbx-lua,Lua,provides Lua resources for Asterisk,+libpthread +libc +liblua,/etc/asterisk/extensions.lua,extensions.lua,pbx_lua,))
++$(eval $(call BuildAsterisk18Module,pbx-spool,Call Spool,Outgoing call spool support,,,,pbx_spool,))
++$(eval $(call BuildAsterisk18Module,pgsql,PostgreSQL,PostgreSQL support,+libpq,/etc/asterisk/cel_pgsql.conf /etc/asterisk/cdr_pgsql.conf /etc/asterisk/res_pgsql.conf,cel_pgsql.conf cdr_pgsql.conf res_pgsql.conf,cel_pgsql cdr_pgsql res_config_pgsql,))
++$(eval $(call BuildAsterisk18Module,res-ael-share,Shareable AEL code,support for shareable AEL code mainly between internal and external modules,,,,res_ael_share,))
++$(eval $(call BuildAsterisk18Module,res-agi,Asterisk Gateway Interface,support for the Asterisk Gateway Interface extension,,,,res_agi,))
++$(eval $(call BuildAsterisk18Module,res-clioriginate,Calls via CLI,Originate calls via the CLI,,,,res_clioriginate,))
++$(eval $(call BuildAsterisk18Module,res-crypto,Provides Crypto,Cryptographic Signature capability,,,,res_crypto,))
++$(eval $(call BuildAsterisk18Module,res-fax-spandsp,Spandsp T.38 and G.711,Spandsp T.38 and G.711 FAX Resource,+asterisk18-res-fax +libspandsp +libtiff,,,res_fax_spandsp,))
++$(eval $(call BuildAsterisk18Module,res-fax,FAX modules,Generic FAX resource for FAX technology resource modules,+asterisk18-res-timing-pthread,/etc/asterisk/res_fax.conf /etc/asterisk/udptl.conf,udptl.conf res_fax.conf,res_fax,))
++$(eval $(call BuildAsterisk18Module,res-monitor,Provides Monitor,Cryptographic Signature capability,,,,res_monitor,))
++$(eval $(call BuildAsterisk18Module,res-musiconhold,MOH,Music On Hold support,,/etc/asterisk/musiconhold.conf,musiconhold.conf,res_musiconhold,))
++$(eval $(call BuildAsterisk18Module,res-phoneprov,Phone Provisioning,Phone provisioning application for the asterisk internal http server,,/etc/asterisk/phoneprov.conf,phoneprov.conf,res_phoneprov,))
++$(eval $(call BuildAsterisk18Module,res-pktccops,Provide PacketCable COPS,simple client/server model for supporting policy control over QoS signaling protocols,,/etc/asterisk/res_pktccops.conf,res_pktccops.conf,res_pktccops,))
++$(eval $(call BuildAsterisk18Module,res-smdi,Provide SMDI,Simple Message Desk Interface capability,,/etc/asterisk/smdi.conf,smdi.conf,res_smdi,))
++$(eval $(call BuildAsterisk18Module,res-srtp,SRTP,Secure RTP,+libsrtp,,,res_srtp,))
++$(eval $(call BuildAsterisk18Module,res-timing-dahdi,DAHDI Timing Interface,,+asterisk18-chan-dahdi,,,res_timing_dahdi,))
++$(eval $(call BuildAsterisk18Module,res-timing-pthread,pthread Timing Interface,,,,,res_timing_pthread,))
++$(eval $(call BuildAsterisk18Module,res-timing-timerfd,Timerfd Timing Interface,,,,,res_timing_timerfd,))
++$(eval $(call BuildAsterisk18Module,voicemail,Voicemail,voicemail related modules,,/etc/asterisk/voicemail.conf,voicemail.conf,*voicemail res_adsi res_smdi,vm-*))
++
+diff --git a/feeds/telephony/net/asterisk-1.8.x/files/asterisk.default b/feeds/telephony/net/asterisk-1.8.x/files/asterisk.default
+new file mode 100644
+index 0000000..9d046c4
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-1.8.x/files/asterisk.default
+@@ -0,0 +1,4 @@
++## startup options for /etc/init.d/asterisk
++
++ENABLE_ASTERISK="yes"
++OPTIONS=""
+diff --git a/feeds/telephony/net/asterisk-1.8.x/files/asterisk.init b/feeds/telephony/net/asterisk-1.8.x/files/asterisk.init
+new file mode 100644
+index 0000000..cce8a09
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-1.8.x/files/asterisk.init
+@@ -0,0 +1,32 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=99
++APP=asterisk
++OPTIONS=
++DEST=
++BIN_FILE=$DEST/usr/sbin/$APP
++PID_FILE=$DEST/var/run/$APP/$APP.pid
++
++start() {
++ [ -d $DEST/var/run/asterisk ] || mkdir -p $DEST/var/run/asterisk
++ [ -d $DEST/var/log/asterisk ] || mkdir -p $DEST/var/log/asterisk
++ [ -d $DEST/var/spool/asterisk ] || mkdir -p $DEST/var/spool/asterisk
++ [ -d $DEST/var/lib ] || mkdir -p $DEST/var/lib
++ [ -h $DEST/var/lib/asterisk ] || ln -s /usr/lib/asterisk /var/lib/asterisk
++ [ -d $DEST/var/lib/asterisk/keys ] || mkdir -p $DEST/var/lib/asterisk/keys
++ [ -d $DEST/var/log/asterisk/cdr-csv/ ] || mkdir -p $DEST/var/log/asterisk/cdr-csv
++
++ SERVICE_PID_FILE="/var/run/asterisk/asterisk.pid" \
++ service_start $BIN_FILE $OPTIONS
++}
++
++stop() {
++ SERVICE_PID_FILE="/var/run/asterisk/asterisk.pid" \
++ service_stop $BIN_FILE
++}
++
++reload() {
++ SERVICE_PID_FILE="/var/run/asterisk/asterisk.pid" \
++ service_reload $BIN_FILE
++}
+diff --git a/feeds/telephony/net/asterisk-1.8.x/patches/030-GNU-GLOB-exts-only-on-glibc.patch b/feeds/telephony/net/asterisk-1.8.x/patches/030-GNU-GLOB-exts-only-on-glibc.patch
+new file mode 100644
+index 0000000..739a939
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-1.8.x/patches/030-GNU-GLOB-exts-only-on-glibc.patch
+@@ -0,0 +1,26 @@
++Index: asterisk-1.8.32.3/res/ael/ael.flex
++===================================================================
++--- asterisk-1.8.32.3.orig/res/ael/ael.flex
+++++ asterisk-1.8.32.3/res/ael/ael.flex
++@@ -595,7 +595,7 @@ includes { STORE_POS; return KW_INCLUDES
++ snprintf(fnamebuf2,sizeof(fnamebuf2), "%s/%s", (char *)ast_config_AST_CONFIG_DIR, fnamebuf);
++ ast_copy_string(fnamebuf,fnamebuf2,sizeof(fnamebuf));
++ }
++-#ifdef SOLARIS
+++#if !defined(HAVE_GLOB_NOMAGIC) || !defined(HAVE_GLOB_BRACE) || defined(DEBUG_NONGNU)
++ glob_ret = glob(fnamebuf, GLOB_NOCHECK, NULL, &globbuf);
++ #else
++ glob_ret = glob(fnamebuf, GLOB_NOMAGIC|GLOB_BRACE, NULL, &globbuf);
++Index: asterisk-1.8.32.3/res/ael/ael_lex.c
++===================================================================
++--- asterisk-1.8.32.3.orig/res/ael/ael_lex.c
+++++ asterisk-1.8.32.3/res/ael/ael_lex.c
++@@ -1966,7 +1966,7 @@ YY_RULE_SETUP
++ snprintf(fnamebuf2,sizeof(fnamebuf2), "%s/%s", (char *)ast_config_AST_CONFIG_DIR, fnamebuf);
++ ast_copy_string(fnamebuf,fnamebuf2,sizeof(fnamebuf));
++ }
++-#ifdef SOLARIS
+++#if !defined(HAVE_GLOB_NOMAGIC) || !defined(HAVE_GLOB_BRACE) || defined(DEBUG_NONGNU)
++ glob_ret = glob(fnamebuf, GLOB_NOCHECK, NULL, &globbuf);
++ #else
++ glob_ret = glob(fnamebuf, GLOB_NOMAGIC|GLOB_BRACE, NULL, &globbuf);
+diff --git a/feeds/telephony/net/asterisk-1.8.x/patches/100-build_tools-iconv.patch b/feeds/telephony/net/asterisk-1.8.x/patches/100-build_tools-iconv.patch
+new file mode 100644
+index 0000000..d3cad82
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-1.8.x/patches/100-build_tools-iconv.patch
+@@ -0,0 +1,11 @@
++--- a/build_tools/menuselect-deps.in
+++++ b/build_tools/menuselect-deps.in
++@@ -16,7 +16,7 @@ GTK2=@PBX_GTK2@
++ H323=@PBX_H323@
++ HOARD=@PBX_HOARD@
++ ICAL=@PBX_ICAL@
++-ICONV=@PBX_ICONV@
+++ICONV=0
++ IKSEMEL=@PBX_IKSEMEL@
++ IMAP_TK=@PBX_IMAP_TK@
++ IODBC=@PBX_IODBC@
+diff --git a/feeds/telephony/net/asterisk-1.8.x/patches/200-addons-defaultenable.patch b/feeds/telephony/net/asterisk-1.8.x/patches/200-addons-defaultenable.patch
+new file mode 100644
+index 0000000..65b9e79
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-1.8.x/patches/200-addons-defaultenable.patch
+@@ -0,0 +1,77 @@
++--- a/addons/app_mysql.c
+++++ b/addons/app_mysql.c
++@@ -25,7 +25,7 @@
++
++ /*** MODULEINFO
++ <depend>mysqlclient</depend>
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <support_level>deprecated</support_level>
++ <replacement>func_odbc</replacement>
++ ***/
++--- a/addons/app_saycountpl.c
+++++ b/addons/app_saycountpl.c
++@@ -21,7 +21,7 @@
++ */
++
++ /*** MODULEINFO
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <support_level>deprecated</support_level>
++ <replacement>say.conf</replacement>
++ ***/
++--- a/addons/cdr_mysql.c
+++++ b/addons/cdr_mysql.c
++@@ -35,7 +35,7 @@
++
++ /*** MODULEINFO
++ <depend>mysqlclient</depend>
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <support_level>deprecated</support_level>
++ <replacement>cdr_adaptive_odbc</replacement>
++ ***/
++--- a/addons/chan_mobile.c
+++++ b/addons/chan_mobile.c
++@@ -27,7 +27,7 @@
++
++ /*** MODULEINFO
++ <depend>bluetooth</depend>
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <support_level>extended</support_level>
++ ***/
++
++--- a/addons/chan_ooh323.c
+++++ b/addons/chan_ooh323.c
++@@ -18,7 +18,7 @@
++
++
++ /*** MODULEINFO
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <support_level>extended</support_level>
++ ***/
++
++--- a/addons/res_config_mysql.c
+++++ b/addons/res_config_mysql.c
++@@ -24,7 +24,7 @@
++
++ /*** MODULEINFO
++ <depend>mysqlclient</depend>
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <support_level>extended</support_level>
++ ***/
++
++--- a/res/res_pktccops.c
+++++ b/res/res_pktccops.c
++@@ -31,7 +31,7 @@
++ */
++
++ /*** MODULEINFO
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <support_level>extended</support_level>
++ ***/
++
+diff --git a/feeds/telephony/net/asterisk-1.8.x/patches/201-utils-defaultenable.patch b/feeds/telephony/net/asterisk-1.8.x/patches/201-utils-defaultenable.patch
+new file mode 100644
+index 0000000..dcc0aa7
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-1.8.x/patches/201-utils-defaultenable.patch
+@@ -0,0 +1,11 @@
++--- a/utils/utils.xml
+++++ b/utils/utils.xml
++@@ -33,7 +33,7 @@
++ <support_level>extended</support_level>
++ </member>
++ <member name="smsq">
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <depend>popt</depend>
++ <support_level>extended</support_level>
++ </member>
+diff --git a/feeds/telephony/net/asterisk-1.8.x/patches/500-nres.patch b/feeds/telephony/net/asterisk-1.8.x/patches/500-nres.patch
+new file mode 100644
+index 0000000..7f1a9a9
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-1.8.x/patches/500-nres.patch
+@@ -0,0 +1,11 @@
++--- a/configure
+++++ b/configure
++@@ -16902,8 +16902,6 @@ if ac_fn_c_try_link "$LINENO"; then :
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
++ $as_echo "yes" >&6; }
++
++-$as_echo "#define HAVE_RES_NINIT 1" >>confdefs.h
++-
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing res_9_ndestroy" >&5
++ $as_echo_n "checking for library containing res_9_ndestroy... " >&6; }
++ if ${ac_cv_search_res_9_ndestroy+:} false; then :
+diff --git a/feeds/telephony/net/asterisk-1.8.x/patches/900-revert-r416994.patch b/feeds/telephony/net/asterisk-1.8.x/patches/900-revert-r416994.patch
+new file mode 100644
+index 0000000..a1e30e6
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-1.8.x/patches/900-revert-r416994.patch
+@@ -0,0 +1,162 @@
++Index: asterisk-1.8.32.3/autoconf/ast_ext_tool_check.m4
++===================================================================
++--- asterisk-1.8.32.3.orig/autoconf/ast_ext_tool_check.m4
+++++ asterisk-1.8.32.3/autoconf/ast_ext_tool_check.m4
++@@ -5,37 +5,39 @@
++ # AST_EXT_TOOL_CHECK([package], [tool name], [--cflags], [--libs], [includes], [expression])
++ AC_DEFUN([AST_EXT_TOOL_CHECK],
++ [
++- if test "x${PBX_$1}" != "x1" -a "${USE_$1}" != "no"; then
++- PBX_$1=0
++- AC_PATH_TOOL(CONFIG_$1, $2, No, [${$1_DIR}/bin:$PATH])
++- if test ! "x${CONFIG_$1}" = xNo; then
++- if test x"$3" = x ; then A=--cflags ; else A="$3" ; fi
++- $1_INCLUDE=$(${CONFIG_$1} $A)
++- $1_INCLUDE=$(echo ${$1_INCLUDE} | $SED -e "s|-I|-I${$1_DIR}|g")
++-
++- if test x"$4" = x ; then A=--libs ; else A="$4" ; fi
++- $1_LIB=$(${CONFIG_$1} $A)
++- $1_LIB=$(echo ${$1_LIB} | $SED -e "s|-L|-L${$1_DIR}|g")
++-
++- if test x"$5" != x ; then
++- saved_cppflags="${CPPFLAGS}"
++- CPPFLAGS="${CPPFLAGS} ${$1_INCLUDE}"
+++ if test "x${PBX_$1}" != "x1" -a "${USE_$1}" != "no"; then
+++ PBX_$1=0
+++ AC_PATH_TOOL(CONFIG_$1, $2, No, [${$1_DIR}/bin:$PATH])
+++ if test ! "x${CONFIG_$1}" = xNo; then
+++ if test x"$3" = x ; then A=--cflags ; else A="$3" ; fi
+++ $1_INCLUDE=$(${CONFIG_$1} $A)
+++ if test x"$4" = x ; then A=--libs ; else A="$4" ; fi
+++ $1_LIB=$(${CONFIG_$1} $A)
+++ if test x"$5" != x ; then
+++ saved_cppflags="${CPPFLAGS}"
+++ if test "x${$1_DIR}" != "x"; then
+++ $1_INCLUDE="-I${$1_DIR}/include"
+++ fi
+++ CPPFLAGS="${CPPFLAGS} ${$1_INCLUDE}"
++
++- saved_libs="${LIBS}"
++- LIBS=${$1_LIB}
+++ saved_libs="${LIBS}"
+++ LIBS="${$1_LIB}"
++
++- AC_LINK_IFELSE(
++- [ AC_LANG_PROGRAM( [ $5 ], [ $6; ])],
++- [ PBX_$1=1 AC_DEFINE([HAVE_$1], 1,
++- [Define if your system has the $1 headers.])],
++- []
++- )
++- CPPFLAGS="${saved_cppflags}"
++- LIBS="${saved_libs}"
++- else
++- PBX_$1=1
++- AC_DEFINE([HAVE_$1], 1, [Define if your system has the $1 libraries.])
++- fi
++- fi
+++ AC_LINK_IFELSE(
+++ [ AC_LANG_PROGRAM( [ $5 ],
+++ [ $6; ]
+++ )],
+++ [ PBX_$1=1
+++ AC_DEFINE([HAVE_$1], 1, [Define if your system has the $1 headers.])
+++ ],
+++ []
+++ )
+++ CPPFLAGS="${saved_cppflags}"
+++ LIBS="${saved_libs}"
+++ else
+++ PBX_$1=1
+++ AC_DEFINE([HAVE_$1], 1, [Define if your system has the $1 libraries.])
+++ fi
++ fi
+++ fi
++ ])
++Index: asterisk-1.8.32.3/configure
++===================================================================
++--- asterisk-1.8.32.3.orig/configure
+++++ asterisk-1.8.32.3/configure
++@@ -12663,11 +12663,9 @@ fi
++ if test ! "x${CONFIG_LIBXML2}" = xNo; then
++ if test x"" = x ; then A=--cflags ; else A="" ; fi
++ LIBXML2_INCLUDE=$(${CONFIG_LIBXML2} $A)
++- LIBXML2_INCLUDE=$(echo ${LIBXML2_INCLUDE} | $SED -e "s|-I|-I${LIBXML2_DIR}|g")
++
++ if test x"" = x ; then A=--libs ; else A="" ; fi
++ LIBXML2_LIB=$(${CONFIG_LIBXML2} $A)
++- LIBXML2_LIB=$(echo ${LIBXML2_LIB} | $SED -e "s|-L|-L${LIBXML2_DIR}|g")
++
++ if test x"#include <libxml/tree.h>
++ #include <libxml/parser.h>" != x ; then
++@@ -21027,11 +21025,9 @@ fi
++ if test ! "x${CONFIG_MYSQLCLIENT}" = xNo; then
++ if test x"" = x ; then A=--cflags ; else A="" ; fi
++ MYSQLCLIENT_INCLUDE=$(${CONFIG_MYSQLCLIENT} $A)
++- MYSQLCLIENT_INCLUDE=$(echo ${MYSQLCLIENT_INCLUDE} | $SED -e "s|-I|-I${MYSQLCLIENT_DIR}|g")
++
++ if test x"" = x ; then A=--libs ; else A="" ; fi
++ MYSQLCLIENT_LIB=$(${CONFIG_MYSQLCLIENT} $A)
++- MYSQLCLIENT_LIB=$(echo ${MYSQLCLIENT_LIB} | $SED -e "s|-L|-L${MYSQLCLIENT_DIR}|g")
++
++ if test x"" != x ; then
++ saved_cppflags="${CPPFLAGS}"
++@@ -21281,11 +21277,9 @@ fi
++ if test ! "x${CONFIG_NEON}" = xNo; then
++ if test x"" = x ; then A=--cflags ; else A="" ; fi
++ NEON_INCLUDE=$(${CONFIG_NEON} $A)
++- NEON_INCLUDE=$(echo ${NEON_INCLUDE} | $SED -e "s|-I|-I${NEON_DIR}|g")
++
++ if test x"" = x ; then A=--libs ; else A="" ; fi
++ NEON_LIB=$(${CONFIG_NEON} $A)
++- NEON_LIB=$(echo ${NEON_LIB} | $SED -e "s|-L|-L${NEON_DIR}|g")
++
++ if test x"" != x ; then
++ saved_cppflags="${CPPFLAGS}"
++@@ -21430,11 +21424,9 @@ fi
++ if test ! "x${CONFIG_NEON29}" = xNo; then
++ if test x"" = x ; then A=--cflags ; else A="" ; fi
++ NEON29_INCLUDE=$(${CONFIG_NEON29} $A)
++- NEON29_INCLUDE=$(echo ${NEON29_INCLUDE} | $SED -e "s|-I|-I${NEON29_DIR}|g")
++
++ if test x"--libs" = x ; then A=--libs ; else A="--libs" ; fi
++ NEON29_LIB=$(${CONFIG_NEON29} $A)
++- NEON29_LIB=$(echo ${NEON29_LIB} | $SED -e "s|-L|-L${NEON29_DIR}|g")
++
++ if test x"#include <ne_auth.h>" != x ; then
++ saved_cppflags="${CPPFLAGS}"
++@@ -21581,11 +21573,9 @@ fi
++ if test ! "x${CONFIG_NETSNMP}" = xNo; then
++ if test x"" = x ; then A=--cflags ; else A="" ; fi
++ NETSNMP_INCLUDE=$(${CONFIG_NETSNMP} $A)
++- NETSNMP_INCLUDE=$(echo ${NETSNMP_INCLUDE} | $SED -e "s|-I|-I${NETSNMP_DIR}|g")
++
++ if test x"--agent-libs" = x ; then A=--libs ; else A="--agent-libs" ; fi
++ NETSNMP_LIB=$(${CONFIG_NETSNMP} $A)
++- NETSNMP_LIB=$(echo ${NETSNMP_LIB} | $SED -e "s|-L|-L${NETSNMP_DIR}|g")
++
++ if test x"#include <net-snmp/net-snmp-config.h>
++ #include <net-snmp/net-snmp-includes.h>
++@@ -28255,11 +28245,9 @@ fi
++ if test ! "x${CONFIG_GMIME}" = xNo; then
++ if test x"" = x ; then A=--cflags ; else A="" ; fi
++ GMIME_INCLUDE=$(${CONFIG_GMIME} $A)
++- GMIME_INCLUDE=$(echo ${GMIME_INCLUDE} | $SED -e "s|-I|-I${GMIME_DIR}|g")
++
++ if test x"" = x ; then A=--libs ; else A="" ; fi
++ GMIME_LIB=$(${CONFIG_GMIME} $A)
++- GMIME_LIB=$(echo ${GMIME_LIB} | $SED -e "s|-L|-L${GMIME_DIR}|g")
++
++ if test x"#include <gmime/gmime.h>" != x ; then
++ saved_cppflags="${CPPFLAGS}"
++@@ -29377,11 +29365,9 @@ fi
++ if test ! "x${CONFIG_SDL}" = xNo; then
++ if test x"" = x ; then A=--cflags ; else A="" ; fi
++ SDL_INCLUDE=$(${CONFIG_SDL} $A)
++- SDL_INCLUDE=$(echo ${SDL_INCLUDE} | $SED -e "s|-I|-I${SDL_DIR}|g")
++
++ if test x"" = x ; then A=--libs ; else A="" ; fi
++ SDL_LIB=$(${CONFIG_SDL} $A)
++- SDL_LIB=$(echo ${SDL_LIB} | $SED -e "s|-L|-L${SDL_DIR}|g")
++
++ if test x"" != x ; then
++ saved_cppflags="${CPPFLAGS}"
+diff --git a/feeds/telephony/net/asterisk-1.8.x/src-lantiq/channels/chan_lantiq.c b/feeds/telephony/net/asterisk-1.8.x/src-lantiq/channels/chan_lantiq.c
+new file mode 100644
+index 0000000..1537309
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-1.8.x/src-lantiq/channels/chan_lantiq.c
+@@ -0,0 +1,1680 @@
++/*
++ * Asterisk -- An open source telephony toolkit.
++ *
++ * Copyright (C) 2012, Luka Perkov
++ * Copyright (C) 2012, John Crispin
++ * Copyright (C) 2012, Andrej Vlašić
++ * Copyright (C) 2012, Kaspar Schleiser for T-Labs
++ * (Deutsche Telekom Innovation Laboratories)
++ * Copyright (C) 2012, Mirko Vogt for T-Labs
++ * (Deutsche Telekom Innovation Laboratories)
++ *
++ * Luka Perkov <openwrt@lukaperkov.net>
++ * John Crispin <blogic@openwrt.org>
++ * Andrej Vlašić <andrej.vlasic0@gmail.com>
++ * Kaspar Schleiser <kaspar@schleiser.de>
++ * Mirko Vogt <mirko@openwrt.org>
++ *
++ * See http://www.asterisk.org for more information about
++ * the Asterisk project. Please do not directly contact
++ * any of the maintainers of this project for assistance;
++ * the project provides a web site, mailing lists and IRC
++ * channels for your use.
++ *
++ * This program is free software, distributed under the terms of
++ * the GNU General Public License Version 2. See the LICENSE file
++ * at the top of the source tree.
++ */
++
++/*! \file
++ *
++ * \brief Asterisk channel line driver for Lantiq based TAPI boards
++ *
++ * \author Luka Perkov <openwrt@lukaperkov.net>
++ * \author John Crispin <blogic@openwrt.org>
++ * \author Andrej Vlašić <andrej.vlasic0@gmail.com>
++ * \author Kaspar Schleiser <kaspar@schleiser.de>
++ * \author Mirko Vogt <mirko@openwrt.org>
++ *
++ * \ingroup channel_drivers
++ */
++
++#include "asterisk.h"
++
++ASTERISK_FILE_VERSION(__FILE__, "$Revision: xxx $")
++
++#include <ctype.h>
++#include <sys/socket.h>
++#include <sys/time.h>
++#include <arpa/inet.h>
++#include <fcntl.h>
++#include <sys/ioctl.h>
++#include <sys/stat.h>
++#include <signal.h>
++#ifdef HAVE_LINUX_COMPILER_H
++#include <linux/compiler.h>
++#endif
++#include <linux/telephony.h>
++
++#include <asterisk/lock.h>
++#include <asterisk/channel.h>
++#include <asterisk/config.h>
++#include <asterisk/module.h>
++#include <asterisk/pbx.h>
++#include <asterisk/utils.h>
++#include <asterisk/callerid.h>
++#include <asterisk/causes.h>
++#include <asterisk/stringfields.h>
++#include <asterisk/musiconhold.h>
++#include <asterisk/sched.h>
++
++/* Lantiq TAPI includes */
++#include <drv_tapi/drv_tapi_io.h>
++#include <drv_vmmc/vmmc_io.h>
++
++#define RTP_HEADER_LEN 12
++
++#define TAPI_AUDIO_PORT_NUM_MAX 2
++#define TAPI_TONE_LOCALE_NONE 0
++#define TAPI_TONE_LOCALE_RINGING_CODE 26
++#define TAPI_TONE_LOCALE_BUSY_CODE 27
++#define TAPI_TONE_LOCALE_CONGESTION_CODE 27
++#define TAPI_TONE_LOCALE_DIAL_CODE 25
++#define TAPI_TONE_LOCALE_WAITING_CODE 37
++
++#define LANTIQ_CONTEXT_PREFIX "lantiq"
++
++static const char config[] = "lantiq.conf";
++
++static char firmware_filename[PATH_MAX] = "/lib/firmware/ifx_firmware.bin";
++static char bbd_filename[PATH_MAX] = "/lib/firmware/ifx_bbd_fxs.bin";
++static char base_path[PATH_MAX] = "/dev/vmmc";
++static int per_channel_context = 0;
++
++/*
++ * The private structures of the Phone Jack channels are linked for selecting
++ * outgoing channels.
++ */
++enum channel_state {
++ ONHOOK,
++ OFFHOOK,
++ DIALING,
++ INCALL,
++ CALL_ENDED,
++ RINGING,
++ UNKNOWN
++};
++
++static struct lantiq_pvt {
++ struct ast_channel *owner; /* Channel we belong to, possibly NULL */
++ int port_id; /* Port number of this object, 0..n */
++ int channel_state;
++ char context[AST_MAX_CONTEXT]; /* this port's dialplan context */
++ char ext[AST_MAX_EXTENSION+1]; /* the extension this port is connecting */
++ int dial_timer; /* timer handle for autodial timeout */
++ char dtmfbuf[AST_MAX_EXTENSION+1]; /* buffer holding dialed digits */
++ int dtmfbuf_len; /* lenght of dtmfbuf */
++ int rtp_timestamp; /* timestamp for RTP packets */
++ uint16_t rtp_seqno; /* Sequence nr for RTP packets */
++ uint32_t call_setup_start; /* Start of dialling in ms */
++ uint32_t call_setup_delay; /* time between ^ and 1st ring in ms */
++ uint16_t jb_size; /* Jitter buffer size */
++ uint32_t jb_underflow; /* Jitter buffer injected samples */
++ uint32_t jb_overflow; /* Jitter buffer dropped samples */
++ uint16_t jb_delay; /* Jitter buffer: playout delay */
++ uint16_t jb_invalid; /* Jitter buffer: Nr. of invalid packets */
++
++} *iflist = NULL;
++
++static struct lantiq_ctx {
++ int dev_fd;
++ int channels;
++ int ch_fd[TAPI_AUDIO_PORT_NUM_MAX];
++} dev_ctx;
++
++static int ast_digit_begin(struct ast_channel *ast, char digit);
++static int ast_digit_end(struct ast_channel *ast, char digit, unsigned int duration);
++static int ast_lantiq_call(struct ast_channel *ast, char *dest, int timeout);
++static int ast_lantiq_hangup(struct ast_channel *ast);
++static int ast_lantiq_answer(struct ast_channel *ast);
++static struct ast_frame *ast_lantiq_read(struct ast_channel *ast);
++static int ast_lantiq_write(struct ast_channel *ast, struct ast_frame *frame);
++static struct ast_frame *ast_lantiq_exception(struct ast_channel *ast);
++static int ast_lantiq_indicate(struct ast_channel *chan, int condition, const void *data, size_t datalen);
++static int ast_lantiq_fixup(struct ast_channel *old, struct ast_channel *new);
++static struct ast_channel *ast_lantiq_requester(const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause);
++static int acf_channel_read(struct ast_channel *chan, const char *funcname, char *args, char *buf, size_t buflen);
++static void lantiq_jb_get_stats(int c);
++
++static const struct ast_channel_tech lantiq_tech = {
++ .type = "TAPI",
++ .description = "Lantiq TAPI Telephony API Driver",
++ .capabilities = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR | AST_FORMAT_ULAW | AST_FORMAT_G729A,
++ .send_digit_begin = ast_digit_begin,
++ .send_digit_end = ast_digit_end,
++ .call = ast_lantiq_call,
++ .hangup = ast_lantiq_hangup,
++ .answer = ast_lantiq_answer,
++ .read = ast_lantiq_read,
++ .write = ast_lantiq_write,
++ .exception = ast_lantiq_exception,
++ .indicate = ast_lantiq_indicate,
++ .fixup = ast_lantiq_fixup,
++ .requester = ast_lantiq_requester,
++ .func_channel_read = acf_channel_read
++};
++
++/* Protect the interface list (of lantiq_pvt's) */
++AST_MUTEX_DEFINE_STATIC(iflock);
++
++/*
++ * Protect the monitoring thread, so only one process can kill or start it, and
++ * not when it's doing something critical.
++ */
++AST_MUTEX_DEFINE_STATIC(monlock);
++
++/* Boolean value whether the monitoring thread shall continue. */
++static unsigned int monitor;
++
++/* The scheduling thread */
++struct ast_sched_thread *sched_thread;
++
++/*
++ * This is the thread for the monitor which checks for input on the channels
++ * which are not currently in use.
++ */
++static pthread_t monitor_thread = AST_PTHREADT_NULL;
++
++
++#define WORDS_BIGENDIAN
++/* struct taken from some GPLed code by Mike Borella */
++typedef struct rtp_header
++{
++#if defined(WORDS_BIGENDIAN)
++ uint8_t version:2, padding:1, extension:1, csrc_count:4;
++#else
++ uint8_t csrc_count:4, extension:1, padding:1, version:2;
++#endif
++#if defined(WORDS_BIGENDIAN)
++ uint8_t marker:1, payload_type:7;
++#else
++ uint8_t payload_type:7, marker:1;
++#endif
++ uint16_t seqno;
++ uint32_t timestamp;
++ uint32_t ssrc;
++} rtp_header_t;
++
++static uint32_t now(void) {
++ struct timespec ts;
++ clock_gettime(CLOCK_MONOTONIC, &ts);
++
++ uint64_t tmp = ts.tv_sec*1000 + (ts.tv_nsec/1000000);
++ return (uint32_t) tmp;
++}
++
++static int lantiq_dev_open(const char *dev_path, const int32_t ch_num)
++{
++ char dev_name[PATH_MAX];
++ memset(dev_name, 0, sizeof(dev_name));
++ snprintf(dev_name, PATH_MAX, "%s%u%u", dev_path, 1, ch_num);
++ return open((const char*)dev_name, O_RDWR, 0644);
++}
++
++static void lantiq_ring(int c, int r, const char *cid)
++{
++ uint8_t status;
++
++ if (r) {
++ if (!cid) {
++ status = (uint8_t) ioctl(dev_ctx.ch_fd[c], IFX_TAPI_RING_START, 0);
++ } else {
++ IFX_TAPI_CID_MSG_t msg;
++ IFX_TAPI_CID_MSG_STRING_t cid_el;
++
++ memset(&msg, 0, sizeof(msg));
++ memset(&cid_el, 0, sizeof(cid_el));
++
++ cid_el.elementType = IFX_TAPI_CID_ST_CLI;
++ cid_el.len = strlen(cid);
++ strncpy((char*)cid_el.element, cid, (size_t)cid_el.len);
++
++ msg.txMode = IFX_TAPI_CID_HM_ONHOOK;
++ msg.messageType = IFX_TAPI_CID_MT_CSUP;
++ msg.message = (IFX_TAPI_CID_MSG_ELEMENT_t *)&cid_el;
++ msg.nMsgElements = 1;
++
++ status = (uint8_t) ioctl(dev_ctx.ch_fd[c], IFX_TAPI_CID_TX_SEQ_START, (IFX_int32_t) &msg);
++ }
++ } else {
++ status = (uint8_t) ioctl(dev_ctx.ch_fd[c], IFX_TAPI_RING_STOP, 0);
++ }
++
++ if (status) {
++ ast_log(LOG_ERROR, "%s ioctl failed\n",
++ (r ? "IFX_TAPI_RING_START" : "IFX_TAPI_RING_STOP"));
++ }
++}
++
++static int lantiq_play_tone(int c, int t)
++{
++ /* stop currently playing tone before starting new one */
++ if (t != TAPI_TONE_LOCALE_NONE) {
++ ioctl(dev_ctx.ch_fd[c], IFX_TAPI_TONE_LOCAL_PLAY, TAPI_TONE_LOCALE_NONE);
++ }
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_TONE_LOCAL_PLAY, t)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_TONE_LOCAL_PLAY ioctl failed\n");
++ return -1;
++ }
++
++ return 0;
++}
++
++static enum channel_state lantiq_get_hookstatus(int port)
++{
++ uint8_t status;
++
++ if (ioctl(dev_ctx.ch_fd[port], IFX_TAPI_LINE_HOOK_STATUS_GET, &status)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_LINE_HOOK_STATUS_GET ioctl failed\n");
++ return UNKNOWN;
++ }
++
++ if (status) {
++ return OFFHOOK;
++ } else {
++ return ONHOOK;
++ }
++}
++
++static int
++lantiq_dev_binary_buffer_create(const char *path, uint8_t **ppBuf, uint32_t *pBufSz)
++{
++ FILE *fd;
++ struct stat file_stat;
++ int32_t status = 0;
++
++ fd = fopen(path, "rb");
++ if (fd == NULL) {
++ ast_log(LOG_ERROR, "binary file %s open failed\n", path);
++ return -1;
++ }
++
++ if (stat(path, &file_stat)) {
++ ast_log(LOG_ERROR, "file %s statistics get failed\n", path);
++ return -1;
++ }
++
++ *ppBuf = malloc(file_stat.st_size);
++ if (*ppBuf == NULL) {
++ ast_log(LOG_ERROR, "binary file %s memory allocation failed\n", path);
++ status = -1;
++ goto on_exit;
++ }
++
++ if (fread (*ppBuf, sizeof(uint8_t), file_stat.st_size, fd) <= 0) {
++ ast_log(LOG_ERROR, "file %s read failed\n", path);
++ status = -1;
++ goto on_exit;
++ }
++
++ *pBufSz = file_stat.st_size;
++
++on_exit:
++ if (fd != NULL)
++ fclose(fd);
++
++ if (*ppBuf != NULL && status)
++ free(*ppBuf);
++
++ return status;
++}
++
++static int32_t lantiq_dev_firmware_download(int32_t fd, const char *path)
++{
++ uint8_t *firmware = NULL;
++ uint32_t size = 0;
++ VMMC_IO_INIT vmmc_io_init;
++
++ ast_log(LOG_DEBUG, "loading firmware: \"%s\".", path);
++
++ if (lantiq_dev_binary_buffer_create(path, &firmware, &size))
++ return -1;
++
++ memset(&vmmc_io_init, 0, sizeof(VMMC_IO_INIT));
++ vmmc_io_init.pPRAMfw = firmware;
++ vmmc_io_init.pram_size = size;
++
++ if (ioctl(fd, FIO_FW_DOWNLOAD, &vmmc_io_init)) {
++ ast_log(LOG_ERROR, "FIO_FW_DOWNLOAD ioctl failed\n");
++ return -1;
++ }
++
++ if (firmware != NULL)
++ free(firmware);
++
++ return 0;
++}
++
++static const char *state_string(enum channel_state s)
++{
++ switch (s) {
++ case ONHOOK: return "ONHOOK";
++ case OFFHOOK: return "OFFHOOK";
++ case DIALING: return "DIALING";
++ case INCALL: return "INCALL";
++ case CALL_ENDED: return "CALL_ENDED";
++ case RINGING: return "RINGING";
++ default: return "UNKNOWN";
++ }
++}
++
++static const char *control_string(int c)
++{
++ switch (c) {
++ case AST_CONTROL_HANGUP: return "Other end has hungup";
++ case AST_CONTROL_RING: return "Local ring";
++ case AST_CONTROL_RINGING: return "Remote end is ringing";
++ case AST_CONTROL_ANSWER: return "Remote end has answered";
++ case AST_CONTROL_BUSY: return "Remote end is busy";
++ case AST_CONTROL_TAKEOFFHOOK: return "Make it go off hook";
++ case AST_CONTROL_OFFHOOK: return "Line is off hook";
++ case AST_CONTROL_CONGESTION: return "Congestion (circuits busy)";
++ case AST_CONTROL_FLASH: return "Flash hook";
++ case AST_CONTROL_WINK: return "Wink";
++ case AST_CONTROL_OPTION: return "Set a low-level option";
++ case AST_CONTROL_RADIO_KEY: return "Key Radio";
++ case AST_CONTROL_RADIO_UNKEY: return "Un-Key Radio";
++ case AST_CONTROL_PROGRESS: return "Remote end is making Progress";
++ case AST_CONTROL_PROCEEDING: return "Remote end is proceeding";
++ case AST_CONTROL_HOLD: return "Hold";
++ case AST_CONTROL_UNHOLD: return "Unhold";
++ case AST_CONTROL_SRCUPDATE: return "Media Source Update";
++ case AST_CONTROL_CONNECTED_LINE: return "Connected Line";
++ case AST_CONTROL_REDIRECTING: return "Redirecting";
++ case AST_CONTROL_INCOMPLETE: return "Incomplete";
++ case -1: return "Stop tone";
++ default: return "Unknown";
++ }
++}
++
++static int ast_lantiq_indicate(struct ast_channel *chan, int condition, const void *data, size_t datalen)
++{
++ ast_verb(3, "phone indication \"%s\"\n", control_string(condition));
++
++ struct lantiq_pvt *pvt = chan->tech_pvt;
++
++ switch (condition) {
++ case -1:
++ {
++ lantiq_play_tone(pvt->port_id, TAPI_TONE_LOCALE_NONE);
++ return 0;
++ }
++ case AST_CONTROL_CONGESTION:
++ case AST_CONTROL_BUSY:
++ {
++ lantiq_play_tone(pvt->port_id, TAPI_TONE_LOCALE_BUSY_CODE);
++ return 0;
++ }
++ case AST_CONTROL_RINGING:
++ {
++ pvt->call_setup_delay = now() - pvt->call_setup_start;
++ lantiq_play_tone(pvt->port_id, TAPI_TONE_LOCALE_RINGING_CODE);
++ return 0;
++ }
++ default:
++ {
++ /* -1 lets asterisk generate the tone */
++ return -1;
++ }
++ }
++}
++
++static int ast_lantiq_fixup(struct ast_channel *old, struct ast_channel *new)
++{
++ ast_log(LOG_DEBUG, "entering... no code here...\n");
++ return 0;
++}
++
++static int ast_digit_begin(struct ast_channel *chan, char digit)
++{
++ /* TODO: Modify this callback to let Asterisk support controlling the length of DTMF */
++ ast_log(LOG_DEBUG, "entering... no code here...\n");
++ return 0;
++}
++
++static int ast_digit_end(struct ast_channel *ast, char digit, unsigned int duration)
++{
++ ast_log(LOG_DEBUG, "entering... no code here...\n");
++ return 0;
++}
++
++static int ast_lantiq_call(struct ast_channel *ast, char *dest, int timeout)
++{
++ /* lock to prevent simultaneous access with do_monitor thread processing */
++ ast_mutex_lock(&iflock);
++
++ struct lantiq_pvt *pvt = ast->tech_pvt;
++ ast_log(LOG_DEBUG, "state: %s\n", state_string(pvt->channel_state));
++
++ if (pvt->channel_state == ONHOOK) {
++ ast_log(LOG_DEBUG, "port %i is ringing\n", pvt->port_id);
++
++ char *cid = ast->connected.id.number.valid ? ast->connected.id.number.str : NULL;
++ ast_log(LOG_DEBUG, "port %i CID: %s\n", pvt->port_id, cid ? cid : "none");
++
++ lantiq_ring(pvt->port_id, 1, cid);
++ pvt->channel_state = RINGING;
++
++ ast_setstate(ast, AST_STATE_RINGING);
++ ast_queue_control(ast, AST_CONTROL_RINGING);
++ } else {
++ ast_log(LOG_DEBUG, "port %i is busy\n", pvt->port_id);
++ ast_setstate(ast, AST_STATE_BUSY);
++ ast_queue_control(ast, AST_CONTROL_BUSY);
++ }
++
++ ast_mutex_unlock(&iflock);
++
++ return 0;
++}
++
++static int ast_lantiq_hangup(struct ast_channel *ast)
++{
++ /* lock to prevent simultaneous access with do_monitor thread processing */
++ ast_mutex_lock(&iflock);
++
++ struct lantiq_pvt *pvt = ast->tech_pvt;
++ ast_log(LOG_DEBUG, "state: %s\n", state_string(pvt->channel_state));
++
++ if (ast->_state == AST_STATE_RINGING) {
++ // FIXME
++ ast_debug(1, "TAPI: ast_lantiq_hangup(): ast->_state == AST_STATE_RINGING\n");
++ }
++
++ switch (pvt->channel_state) {
++ case RINGING:
++ case ONHOOK:
++ lantiq_ring(pvt->port_id, 0, NULL);
++ pvt->channel_state = ONHOOK;
++ break;
++ default:
++ ast_log(LOG_DEBUG, "we were hung up, play busy tone\n");
++ pvt->channel_state = CALL_ENDED;
++ lantiq_play_tone(pvt->port_id, TAPI_TONE_LOCALE_BUSY_CODE);
++ }
++
++ lantiq_jb_get_stats(pvt->port_id);
++
++ ast_setstate(ast, AST_STATE_DOWN);
++ ast_module_unref(ast_module_info->self);
++ ast->tech_pvt = NULL;
++ pvt->owner = NULL;
++
++ ast_mutex_unlock(&iflock);
++
++ return 0;
++}
++
++static int ast_lantiq_answer(struct ast_channel *ast)
++{
++ ast_log(LOG_DEBUG, "entering... no code here...\n");
++ return 0;
++}
++
++static struct ast_frame * ast_lantiq_read(struct ast_channel *ast)
++{
++ ast_log(LOG_DEBUG, "entering... no code here...\n");
++ return NULL;
++}
++
++static int ast_lantiq_write(struct ast_channel *ast, struct ast_frame *frame)
++{
++ char buf[2048];
++ struct lantiq_pvt *pvt = ast->tech_pvt;
++ int ret = -1;
++ rtp_header_t *rtp_header = (rtp_header_t *) buf;
++
++ if(frame->frametype != AST_FRAME_VOICE) {
++ ast_log(LOG_DEBUG, "unhandled frame type\n");
++ return 0;
++ }
++
++ if (frame->datalen == 0) {
++ ast_log(LOG_DEBUG, "we've been prodded\n");
++ return 0;
++ }
++
++ memset(buf, 0, sizeof(rtp_header_t));
++ rtp_header->version = 2;
++ rtp_header->padding = 0;
++ rtp_header->extension = 0;
++ rtp_header->csrc_count = 0;
++ rtp_header->marker = 0;
++ rtp_header->timestamp = pvt->rtp_timestamp;
++ rtp_header->seqno = pvt->rtp_seqno++;
++ rtp_header->ssrc = 0;
++ rtp_header->payload_type = (uint8_t) frame->subclass.codec;
++
++ pvt->rtp_timestamp += 160;
++
++ memcpy(buf+RTP_HEADER_LEN, frame->data.ptr, frame->datalen);
++
++ ret = write(dev_ctx.ch_fd[pvt->port_id], buf, frame->datalen+RTP_HEADER_LEN);
++ if (ret <= 0) {
++ ast_debug(1, "TAPI: ast_lantiq_write(): error writing.\n");
++ return -1;
++ }
++
++#ifdef TODO_DEVEL_INFO
++ ast_debug(1, "ast_lantiq_write(): size: %i version: %i padding: %i extension: %i csrc_count: %i\n"
++ "marker: %i payload_type: %s seqno: %i timestamp: %i ssrc: %i\n",
++ (int)ret,
++ (int)rtp_header->version,
++ (int)rtp_header->padding,
++ (int)rtp_header->extension,
++ (int)rtp_header->csrc_count,
++ (int)rtp_header->marker,
++ ast_codec2str(rtp_header->payload_type),
++ (int)rtp_header->seqno,
++ (int)rtp_header->timestamp,
++ (int)rtp_header->ssrc);
++#endif
++
++ return 0;
++}
++
++static int acf_channel_read(struct ast_channel *chan, const char *funcname, char *args, char *buf, size_t buflen)
++{
++ struct lantiq_pvt *pvt;
++ int res = 0;
++
++ if (!chan || chan->tech != &lantiq_tech) {
++ ast_log(LOG_ERROR, "This function requires a valid Lantiq TAPI channel\n");
++ return -1;
++ }
++
++ ast_mutex_lock(&iflock);
++
++ pvt = (struct lantiq_pvt*) chan->tech_pvt;
++
++ if (!strcasecmp(args, "csd")) {
++ snprintf(buf, buflen, "%lu", (unsigned long int) pvt->call_setup_delay);
++ } else if (!strcasecmp(args, "jitter_stats")){
++ lantiq_jb_get_stats(pvt->port_id);
++ snprintf(buf, buflen, "jbBufSize=%u,jbUnderflow=%u,jbOverflow=%u,jbDelay=%u,jbInvalid=%u",
++ (uint32_t) pvt->jb_size,
++ (uint32_t) pvt->jb_underflow,
++ (uint32_t) pvt->jb_overflow,
++ (uint32_t) pvt->jb_delay,
++ (uint32_t) pvt->jb_invalid);
++ } else {
++ res = -1;
++ }
++
++ ast_mutex_unlock(&iflock);
++
++ return res;
++}
++
++
++static struct ast_frame * ast_lantiq_exception(struct ast_channel *ast)
++{
++ ast_log(LOG_DEBUG, "entering... no code here...\n");
++ return NULL;
++}
++
++static void lantiq_jb_get_stats(int c) {
++ struct lantiq_pvt *pvt = &iflist[c];
++
++ IFX_TAPI_JB_STATISTICS_t param;
++ memset (&param, 0, sizeof (param));
++ if (ioctl (dev_ctx.ch_fd[c], IFX_TAPI_JB_STATISTICS_GET, (IFX_int32_t) &param) != IFX_SUCCESS) {
++ ast_debug(1, "Error getting jitter buffer stats.\n");
++ } else {
++#if !defined (TAPI_VERSION3) && defined (TAPI_VERSION4)
++ ast_debug(1, "Jitter buffer stats: dev=%u, ch=%u, nType=%u, nBufSize=%u, nIsUnderflow=%u, nDsOverflow=%u, nPODelay=%u, nInvalid=%u",
++ (uint32_t) param.dev,
++ (uint32_t) param.ch,
++#else
++ ast_debug(1, "Jitter buffer stats: nType=%u, nBufSize=%u, nIsUnderflow=%u, nDsOverflow=%u, nPODelay=%u, nInvalid=%u",
++#endif
++ (uint32_t) param.nType,
++ (uint32_t) param.nBufSize,
++ (uint32_t) param.nIsUnderflow,
++ (uint32_t) param.nDsOverflow,
++ (uint32_t) param.nPODelay,
++ (uint32_t) param.nInvalid);
++
++ pvt->jb_size = param.nBufSize;
++ pvt->jb_underflow = param.nIsUnderflow;
++ pvt->jb_overflow = param.nDsOverflow;
++ pvt->jb_invalid = param.nInvalid;
++ pvt->jb_delay = param.nPODelay;
++ }
++}
++
++
++static int lantiq_standby(int c)
++{
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_LINE_FEED_SET, IFX_TAPI_LINE_FEED_STANDBY)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_LINE_FEED_SET ioctl failed\n");
++ return -1;
++ }
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_ENC_STOP, 0)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_ENC_STOP ioctl failed\n");
++ return -1;
++ }
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_DEC_STOP, 0)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_DEC_STOP ioctl failed\n");
++ return -1;
++ }
++
++ return lantiq_play_tone(c, TAPI_TONE_LOCALE_NONE);
++}
++
++static int lantiq_end_dialing(int c)
++{
++ ast_log(LOG_DEBUG, "TODO - DEBUG MSG\n");
++ struct lantiq_pvt *pvt = &iflist[c];
++
++ if (pvt->dial_timer) {
++ ast_sched_thread_del(sched_thread, pvt->dial_timer);
++ pvt->dial_timer = 0;
++ }
++
++ if(pvt->owner) {
++ ast_hangup(pvt->owner);
++ }
++
++ return 0;
++}
++
++static int lantiq_end_call(int c)
++{
++ ast_log(LOG_DEBUG, "TODO - DEBUG MSG\n");
++
++ struct lantiq_pvt *pvt = &iflist[c];
++
++ if(pvt->owner) {
++ lantiq_jb_get_stats(c);
++ ast_queue_hangup(pvt->owner);
++ }
++
++ return 0;
++}
++
++static struct ast_channel * lantiq_channel(int state, int c, char *ext, char *ctx)
++{
++ ast_log(LOG_DEBUG, "TODO - DEBUG MSG\n");
++
++ struct ast_channel *chan = NULL;
++
++ struct lantiq_pvt *pvt = &iflist[c];
++
++ chan = ast_channel_alloc(1, state, NULL, NULL, "", ext, ctx, 0, c, "TAPI/%s", "1");
++
++ chan->tech = &lantiq_tech;
++ chan->nativeformats = AST_FORMAT_ULAW;
++ chan->readformat = AST_FORMAT_ULAW;
++ chan->writeformat = AST_FORMAT_ULAW;
++ chan->tech_pvt = pvt;
++
++ pvt->owner = chan;
++
++ return chan;
++}
++
++static struct ast_channel * ast_lantiq_requester(const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause)
++{
++ ast_mutex_lock(&iflock);
++
++ char buf[BUFSIZ];
++ struct ast_channel *chan = NULL;
++ int port_id = -1;
++
++ ast_debug(1, "Asked to create a TAPI channel with formats: %s\n", ast_getformatname_multiple(buf, sizeof(buf), format));
++
++
++ /* check for correct data argument */
++ if (ast_strlen_zero(data)) {
++ ast_log(LOG_ERROR, "Unable to create channel with empty destination.\n");
++ *cause = AST_CAUSE_CHANNEL_UNACCEPTABLE;
++ return NULL;
++ }
++
++ /* get our port number */
++ port_id = atoi((char*) data);
++ if (port_id < 1 || port_id > dev_ctx.channels) {
++ ast_log(LOG_ERROR, "Unknown channel ID: \"%s\"\n", (char*) data);
++ *cause = AST_CAUSE_CHANNEL_UNACCEPTABLE;
++ return NULL;
++ }
++
++ /* on asterisk user's side, we're using port 1-2.
++ * Here in non normal human's world, we begin
++ * counting at 0.
++ */
++ port_id -= 1;
++
++ chan = lantiq_channel(AST_STATE_DOWN, port_id, NULL, NULL);
++
++ ast_mutex_unlock(&iflock);
++ return chan;
++}
++
++static int lantiq_dev_data_handler(int c)
++{
++ char buf[BUFSIZ];
++ struct ast_frame frame = {0};
++
++ int res = read(dev_ctx.ch_fd[c], buf, sizeof(buf));
++ if (res <= 0) ast_log(LOG_ERROR, "we got read error %i\n", res);
++
++ rtp_header_t *rtp = (rtp_header_t*) buf;
++
++ frame.src = "TAPI";
++ frame.frametype = AST_FRAME_VOICE;
++ frame.subclass.codec = rtp->payload_type;
++ frame.samples = res - RTP_HEADER_LEN;
++ frame.datalen = res - RTP_HEADER_LEN;
++ frame.data.ptr = buf + RTP_HEADER_LEN;
++
++ struct lantiq_pvt *pvt = (struct lantiq_pvt *) &iflist[c];
++ if (pvt->owner && (pvt->owner->_state == AST_STATE_UP)) {
++ if(!ast_channel_trylock(pvt->owner)) {
++ ast_queue_frame(pvt->owner, &frame);
++ ast_channel_unlock(pvt->owner);
++ }
++ }
++
++/* ast_debug(1, "lantiq_dev_data_handler(): size: %i version: %i padding: %i extension: %i csrc_count: %i \n"
++ "marker: %i payload_type: %s seqno: %i timestamp: %i ssrc: %i\n",
++ (int)res,
++ (int)rtp->version,
++ (int)rtp->padding,
++ (int)rtp->extension,
++ (int)rtp->csrc_count,
++ (int)rtp->marker,
++ ast_codec2str(rtp->payload_type),
++ (int)rtp->seqno,
++ (int)rtp->timestamp,
++ (int)rtp->ssrc);
++*/
++ return 0;
++}
++
++static int accept_call(int c)
++{
++ ast_log(LOG_DEBUG, "TODO - DEBUG MSG\n");
++
++ struct lantiq_pvt *pvt = &iflist[c];
++
++ if (pvt->owner) {
++ struct ast_channel *chan = pvt->owner;
++
++ switch (chan->_state) {
++ case AST_STATE_RINGING:
++ lantiq_play_tone(c, TAPI_TONE_LOCALE_NONE);
++ ast_queue_control(pvt->owner, AST_CONTROL_ANSWER);
++ pvt->channel_state = INCALL;
++ break;
++ default:
++ ast_log(LOG_WARNING, "entered unhandled state %s\n", ast_state2str(chan->_state));
++ }
++ }
++
++ return 0;
++}
++
++static int lantiq_dev_event_hook(int c, int state)
++{
++ ast_mutex_lock(&iflock);
++
++ ast_log(LOG_DEBUG, "on port %i detected event %s hook\n", c, state ? "on" : "off");
++
++ int ret = -1;
++ if (state) { /* going onhook */
++ switch (iflist[c].channel_state) {
++ case OFFHOOK:
++ ret = lantiq_standby(c);
++ break;
++ case DIALING:
++ ret = lantiq_end_dialing(c);
++ break;
++ case INCALL:
++ ret = lantiq_end_call(c);
++ break;
++ case CALL_ENDED:
++ ret = lantiq_standby(c); // TODO: are we sure for this ?
++ break;
++ default:
++ break;
++ }
++ iflist[c].channel_state = ONHOOK;
++ } else { /* going offhook */
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_LINE_FEED_SET, IFX_TAPI_LINE_FEED_ACTIVE)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_LINE_FEED_SET ioctl failed\n");
++ goto out;
++ }
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_ENC_START, 0)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_ENC_START ioctl failed\n");
++ goto out;
++ }
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_DEC_START, 0)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_DEC_START ioctl failed\n");
++ goto out;
++ }
++
++ switch (iflist[c].channel_state) {
++ case RINGING:
++ ret = accept_call(c);
++ break;
++ default:
++ iflist[c].channel_state = OFFHOOK;
++ lantiq_play_tone(c, TAPI_TONE_LOCALE_DIAL_CODE);
++ ret = 0;
++ break;
++ }
++
++ }
++
++out:
++ ast_mutex_unlock(&iflock);
++
++ return ret;
++}
++
++static void lantiq_reset_dtmfbuf(struct lantiq_pvt *pvt)
++{
++ pvt->dtmfbuf[0] = '\0';
++ pvt->dtmfbuf_len = 0;
++ pvt->ext[0] = '\0';
++}
++
++static void lantiq_dial(struct lantiq_pvt *pvt)
++{
++ struct ast_channel *chan = NULL;
++
++ ast_log(LOG_DEBUG, "user want's to dial %s.\n", pvt->dtmfbuf);
++
++ if (ast_exists_extension(NULL, pvt->context, pvt->dtmfbuf, 1, NULL)) {
++ ast_debug(1, "found extension %s, dialing\n", pvt->dtmfbuf);
++
++ strcpy(pvt->ext, pvt->dtmfbuf);
++
++ ast_verbose(VERBOSE_PREFIX_3 " extension exists, starting PBX %s\n", pvt->ext);
++
++ chan = lantiq_channel(AST_STATE_UP, pvt->port_id, pvt->ext+1, pvt->context);
++ chan->tech_pvt = pvt;
++ pvt->owner = chan;
++
++ strcpy(chan->exten, pvt->ext);
++ ast_setstate(chan, AST_STATE_RING);
++ pvt->channel_state = INCALL;
++
++ pvt->call_setup_start = now();
++
++ if (ast_pbx_start(chan)) {
++ ast_log(LOG_WARNING, " unable to start PBX on %s\n", chan->name);
++ ast_hangup(chan);
++ }
++ } else {
++ ast_log(LOG_DEBUG, "no extension found\n");
++ lantiq_play_tone(pvt->port_id, TAPI_TONE_LOCALE_BUSY_CODE);
++ pvt->channel_state = CALL_ENDED;
++ }
++
++ lantiq_reset_dtmfbuf(pvt);
++}
++
++static int lantiq_event_dial_timeout(const void* data)
++{
++ ast_debug(1, "TAPI: lantiq_event_dial_timeout()\n");
++
++ struct lantiq_pvt *pvt = (struct lantiq_pvt *) data;
++ pvt->dial_timer = 0;
++
++ if (! pvt->channel_state == ONHOOK) {
++ lantiq_dial(pvt);
++ } else {
++ ast_debug(1, "TAPI: lantiq_event_dial_timeout(): dial timeout in state ONHOOK.\n");
++ }
++
++ return 0;
++}
++
++static int lantiq_send_digit(int c, char digit)
++{
++ struct lantiq_pvt *pvt = &iflist[c];
++
++ struct ast_frame f = { .frametype = AST_FRAME_DTMF, .subclass.integer = digit };
++
++ if (pvt->owner) {
++ ast_log(LOG_DEBUG, "Port %i transmitting digit \"%c\"\n", c, digit);
++ return ast_queue_frame(pvt->owner, &f);
++ } else {
++ ast_debug(1, "Warning: lantiq_send_digit() without owner!\n");
++ return -1;
++ }
++}
++
++static void lantiq_dev_event_digit(int c, char digit)
++{
++ ast_mutex_lock(&iflock);
++
++ ast_log(LOG_DEBUG, "on port %i detected digit \"%c\"\n", c, digit);
++
++ struct lantiq_pvt *pvt = &iflist[c];
++
++ switch (pvt->channel_state) {
++ case INCALL:
++ {
++ lantiq_send_digit(c, digit);
++ break;
++ }
++ case OFFHOOK:
++ pvt->channel_state = DIALING;
++
++ lantiq_play_tone(c, TAPI_TONE_LOCALE_NONE);
++
++ /* fall through */
++ case DIALING:
++ if (digit == '#') {
++ if (pvt->dial_timer) {
++ ast_sched_thread_del(sched_thread, pvt->dial_timer);
++ pvt->dial_timer = 0;
++ }
++
++ lantiq_dial(pvt);
++ } else {
++ pvt->dtmfbuf[pvt->dtmfbuf_len] = digit;
++ pvt->dtmfbuf_len++;
++ pvt->dtmfbuf[pvt->dtmfbuf_len] = '\0';
++
++ /* setup autodial timer */
++ if (!pvt->dial_timer) {
++ ast_log(LOG_DEBUG, "setting new timer\n");
++ pvt->dial_timer = ast_sched_thread_add(sched_thread, 2000, lantiq_event_dial_timeout, (const void*) pvt);
++ } else {
++ ast_log(LOG_DEBUG, "replacing timer\n");
++ struct sched_context *sched = ast_sched_thread_get_context(sched_thread);
++ AST_SCHED_REPLACE(pvt->dial_timer, sched, 2000, lantiq_event_dial_timeout, (const void*) pvt);
++ }
++ }
++ break;
++ default:
++ ast_log(LOG_ERROR, "don't know what to do in unhandled state\n");
++ break;
++ }
++
++ ast_mutex_unlock(&iflock);
++ return;
++}
++
++static void lantiq_dev_event_handler(void)
++{
++ IFX_TAPI_EVENT_t event;
++ unsigned int i;
++
++ for (i = 0; i < dev_ctx.channels ; i++) {
++ ast_mutex_lock(&iflock);
++
++ memset (&event, 0, sizeof(event));
++ event.ch = i;
++ if (ioctl(dev_ctx.dev_fd, IFX_TAPI_EVENT_GET, &event)) {
++ ast_mutex_unlock(&iflock);
++ continue;
++ }
++ if (event.id == IFX_TAPI_EVENT_NONE) {
++ ast_mutex_unlock(&iflock);
++ continue;
++ }
++
++ ast_mutex_unlock(&iflock);
++
++ switch(event.id) {
++ case IFX_TAPI_EVENT_FXS_ONHOOK:
++ lantiq_dev_event_hook(i, 1);
++ break;
++ case IFX_TAPI_EVENT_FXS_OFFHOOK:
++ lantiq_dev_event_hook(i, 0);
++ break;
++ case IFX_TAPI_EVENT_DTMF_DIGIT:
++ lantiq_dev_event_digit(i, (char)event.data.dtmf.ascii);
++ break;
++ case IFX_TAPI_EVENT_PULSE_DIGIT:
++ if (event.data.pulse.digit == 0xB) {
++ lantiq_dev_event_digit(i, '0');
++ } else {
++ lantiq_dev_event_digit(i, '0' + (char)event.data.pulse.digit);
++ }
++ break;
++ case IFX_TAPI_EVENT_COD_DEC_CHG:
++ case IFX_TAPI_EVENT_TONE_GEN_END:
++ case IFX_TAPI_EVENT_CID_TX_SEQ_END:
++ break;
++ default:
++ ast_log(LOG_ERROR, "unknown TAPI event %08X\n", event.id);
++ break;
++ }
++ }
++}
++
++static void * lantiq_events_monitor(void *data)
++{
++ ast_verbose("TAPI thread started\n");
++
++ struct pollfd fds[3];
++
++ fds[0].fd = dev_ctx.dev_fd;
++ fds[0].events = POLLIN;
++ fds[1].fd = dev_ctx.ch_fd[0];
++ fds[1].events = POLLIN;
++ fds[2].fd = dev_ctx.ch_fd[1];
++ fds[2].events = POLLIN;
++
++ while (monitor) {
++ ast_mutex_lock(&monlock);
++
++ if (poll(fds, dev_ctx.channels + 1, 2000) <= 0) {
++ ast_mutex_unlock(&monlock);
++ continue;
++ }
++
++ if (fds[0].revents & POLLIN) {
++ lantiq_dev_event_handler();
++ }
++
++ ast_mutex_unlock(&monlock);
++
++ if ((fds[1].revents & POLLIN) && (lantiq_dev_data_handler(0))) {
++ ast_log(LOG_ERROR, "data handler 0 failed\n");
++ break;
++ }
++
++ if ((fds[2].revents & POLLIN) && (lantiq_dev_data_handler(1))) {
++ ast_log(LOG_ERROR, "data handler 1 failed\n");
++ break;
++ }
++ }
++
++ return NULL;
++}
++
++static int restart_monitor(void)
++{
++ /* If we're supposed to be stopped -- stay stopped */
++ if (monitor_thread == AST_PTHREADT_STOP)
++ return 0;
++
++ ast_mutex_lock(&monlock);
++
++ if (monitor_thread == pthread_self()) {
++ ast_mutex_unlock(&monlock);
++ ast_log(LOG_WARNING, "Cannot kill myself\n");
++ return -1;
++ }
++
++ if (monitor_thread != AST_PTHREADT_NULL) {
++ if (ast_mutex_lock(&iflock)) {
++ ast_mutex_unlock(&monlock);
++ ast_log(LOG_WARNING, "Unable to lock the interface list\n");
++ return -1;
++ }
++ monitor = 0;
++ while (pthread_kill(monitor_thread, SIGURG) == 0)
++ sched_yield();
++ pthread_join(monitor_thread, NULL);
++ ast_mutex_unlock(&iflock);
++ }
++
++ monitor = 1;
++ /* Start a new monitor */
++ if (ast_pthread_create_background(&monitor_thread, NULL, lantiq_events_monitor, NULL) < 0) {
++ ast_mutex_unlock(&monlock);
++ ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
++ return -1;
++ }
++
++ ast_mutex_unlock(&monlock);
++
++ return 0;
++}
++
++static void lantiq_cleanup(void)
++{
++ int c;
++
++ for (c = 0; c < dev_ctx.channels ; c++) {
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_LINE_FEED_SET, IFX_TAPI_LINE_FEED_STANDBY)) {
++ ast_log(LOG_WARNING, "IFX_TAPI_LINE_FEED_SET ioctl failed\n");
++ }
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_ENC_STOP, 0)) {
++ ast_log(LOG_WARNING, "IFX_TAPI_ENC_STOP ioctl failed\n");
++ }
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_DEC_STOP, 0)) {
++ ast_log(LOG_WARNING, "IFX_TAPI_DEC_STOP ioctl failed\n");
++ }
++ }
++
++ if (ioctl(dev_ctx.dev_fd, IFX_TAPI_DEV_STOP, 0)) {
++ ast_log(LOG_WARNING, "IFX_TAPI_DEV_STOP ioctl failed\n");
++ }
++
++ close(dev_ctx.dev_fd);
++}
++
++static int unload_module(void)
++{
++ int c;
++
++ ast_channel_unregister(&lantiq_tech);
++
++ if (!ast_mutex_lock(&iflock)) {
++ for (c = 0; c < dev_ctx.channels ; c++) {
++ if (iflist[c].owner)
++ ast_softhangup(iflist[c].owner, AST_SOFTHANGUP_APPUNLOAD);
++ }
++ ast_mutex_unlock(&iflock);
++ } else {
++ ast_log(LOG_WARNING, "Unable to lock the monitor\n");
++ return -1;
++ }
++
++ if (!ast_mutex_lock(&monlock)) {
++ if (monitor_thread > AST_PTHREADT_NULL) {
++ monitor = 0;
++ while (pthread_kill(monitor_thread, SIGURG) == 0)
++ sched_yield();
++ pthread_join(monitor_thread, NULL);
++ }
++ monitor_thread = AST_PTHREADT_STOP;
++ ast_mutex_unlock(&monlock);
++ } else {
++ ast_log(LOG_WARNING, "Unable to lock the monitor\n");
++ return -1;
++ }
++
++ return 0;
++}
++
++static struct lantiq_pvt *lantiq_init_pvt(struct lantiq_pvt *pvt)
++{
++ if (pvt) {
++ pvt->owner = NULL;
++ pvt->port_id = -1;
++ pvt->channel_state = UNKNOWN;
++ pvt->context[0] = '\0';
++ pvt->ext[0] = '\0';
++ pvt->dial_timer = 0;
++ pvt->dtmfbuf[0] = '\0';
++ pvt->dtmfbuf_len = 0;
++ pvt->call_setup_start = 0;
++ pvt->call_setup_delay = 0;
++ pvt->jb_size = 0;
++ pvt->jb_underflow = 0;
++ pvt->jb_overflow = 0;
++ pvt->jb_delay = 0;
++ pvt->jb_invalid = 0;
++ } else {
++ ast_log(LOG_ERROR, "unable to clear pvt structure\n");
++ }
++
++ return pvt;
++}
++
++static int lantiq_create_pvts(void)
++{
++ int i;
++
++ iflist = ast_calloc(1, sizeof(struct lantiq_pvt) * dev_ctx.channels);
++
++ if (iflist) {
++ for (i=0 ; i<dev_ctx.channels ; i++) {
++ lantiq_init_pvt(&iflist[i]);
++ iflist[i].port_id = i;
++ if (per_channel_context) {
++ snprintf(iflist[i].context, AST_MAX_CONTEXT, "%s%i", LANTIQ_CONTEXT_PREFIX, i+1);
++ ast_debug(1, "Context for channel %i: %s\n", i, iflist[i].context);
++ } else {
++ snprintf(iflist[i].context, AST_MAX_CONTEXT, "default");
++ }
++ }
++ return 0;
++ } else {
++ ast_log(LOG_ERROR, "unable to allocate memory\n");
++ return -1;
++ }
++}
++
++static int lantiq_setup_rtp(int c)
++{
++ /* Configure RTP payload type tables */
++ IFX_TAPI_PKT_RTP_PT_CFG_t rtpPTConf;
++
++ memset((char*)&rtpPTConf, '\0', sizeof(rtpPTConf));
++
++ rtpPTConf.nPTup[IFX_TAPI_COD_TYPE_MLAW] = AST_FORMAT_ULAW;
++ rtpPTConf.nPTup[IFX_TAPI_COD_TYPE_ALAW] = AST_FORMAT_ALAW;
++// rtpPTConf.nPTup[IFX_TAPI_COD_TYPE_G723_63] = AST_FORMAT_G723_1;
++// rtpPTConf.nPTup[IFX_TAPI_COD_TYPE_G723_53] = 4;
++// rtpPTConf.nPTup[IFX_TAPI_COD_TYPE_G729] = AST_FORMAT_G729A;
++// rtpPTConf.nPTup[IFX_TAPI_COD_TYPE_G722_64] = AST_FORMAT_G722;
++
++ rtpPTConf.nPTdown[IFX_TAPI_COD_TYPE_MLAW] = AST_FORMAT_ULAW;
++ rtpPTConf.nPTdown[IFX_TAPI_COD_TYPE_ALAW] = AST_FORMAT_ALAW;
++// rtpPTConf.nPTdown[IFX_TAPI_COD_TYPE_G723_63] = AST_FORMAT_G723_1;
++// rtpPTConf.nPTdown[IFX_TAPI_COD_TYPE_G723_53] = AST_FORMAT_G723_1;
++// rtpPTConf.nPTdown[IFX_TAPI_COD_TYPE_G729] = AST_FORMAT_G729A;
++// rtpPTConf.nPTdown[IFX_TAPI_COD_TYPE_G722_64] = AST_FORMAT_G722;
++
++ int ret;
++ if ((ret = ioctl(dev_ctx.ch_fd[c], IFX_TAPI_PKT_RTP_PT_CFG_SET, (IFX_int32_t) &rtpPTConf))) {
++ ast_log(LOG_ERROR, "IFX_TAPI_PKT_RTP_PT_CFG_SET failed: ret=%i\n", ret);
++ return -1;
++ }
++
++ return 0;
++}
++
++static int load_module(void)
++{
++ struct ast_config *cfg;
++ struct ast_variable *v;
++ int txgain = 0;
++ int rxgain = 0;
++ int wlec_type = 0;
++ int wlec_nlp = 0;
++ int wlec_nbfe = 0;
++ int wlec_nbne = 0;
++ int wlec_wbne = 0;
++ int jb_type = IFX_TAPI_JB_TYPE_ADAPTIVE;
++ int jb_pckadpt = IFX_TAPI_JB_PKT_ADAPT_VOICE;
++ int jb_localadpt = IFX_TAPI_JB_LOCAL_ADAPT_DEFAULT;
++ int jb_scaling = 0x10;
++ int jb_initialsize = 0x2d0;
++ int jb_minsize = 0x50;
++ int jb_maxsize = 0x5a0;
++ int cid_type = IFX_TAPI_CID_STD_TELCORDIA;
++ int vad_type = IFX_TAPI_ENC_VAD_NOVAD;
++ dev_ctx.channels = TAPI_AUDIO_PORT_NUM_MAX;
++ struct ast_flags config_flags = { 0 };
++
++ if (!(sched_thread = ast_sched_thread_create())) {
++ ast_log(LOG_ERROR, "Unable to create scheduler thread\n");
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ if ((cfg = ast_config_load(config, config_flags)) == CONFIG_STATUS_FILEINVALID) {
++ ast_log(LOG_ERROR, "Config file %s is in an invalid format. Aborting.\n", config);
++ return AST_MODULE_LOAD_DECLINE;
++ }
++
++ /* We *must* have a config file otherwise stop immediately */
++ if (!cfg) {
++ ast_log(LOG_ERROR, "Unable to load config %s\n", config);
++ return AST_MODULE_LOAD_DECLINE;
++ }
++
++ if (ast_mutex_lock(&iflock)) {
++ ast_log(LOG_ERROR, "Unable to lock interface list.\n");
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ for (v = ast_variable_browse(cfg, "interfaces"); v; v = v->next) {
++ if (!strcasecmp(v->name, "channels")) {
++ dev_ctx.channels = atoi(v->value);
++ if (!dev_ctx.channels) {
++ ast_log(LOG_ERROR, "Invalid value for channels in config %s\n", config);
++ ast_config_destroy(cfg);
++ return AST_MODULE_LOAD_DECLINE;
++ }
++ } else if (!strcasecmp(v->name, "firmwarefilename")) {
++ ast_copy_string(firmware_filename, v->value, sizeof(firmware_filename));
++ } else if (!strcasecmp(v->name, "bbdfilename")) {
++ ast_copy_string(bbd_filename, v->value, sizeof(bbd_filename));
++ } else if (!strcasecmp(v->name, "basepath")) {
++ ast_copy_string(base_path, v->value, sizeof(base_path));
++ } else if (!strcasecmp(v->name, "per_channel_context")) {
++ if (!strcasecmp(v->value, "on")) {
++ per_channel_context = 1;
++ } else if (!strcasecmp(v->value, "off")) {
++ per_channel_context = 0;
++ } else {
++ ast_log(LOG_ERROR, "Unknown per_channel_context value '%s'. Try 'on' or 'off'.\n", v->value);
++ ast_config_destroy(cfg);
++ return AST_MODULE_LOAD_DECLINE;
++ }
++ }
++ }
++
++ for (v = ast_variable_browse(cfg, "general"); v; v = v->next) {
++ if (!strcasecmp(v->name, "rxgain")) {
++ rxgain = atoi(v->value);
++ if (!rxgain) {
++ rxgain = 0;
++ ast_log(LOG_WARNING, "Invalid rxgain: %s, using default.\n", v->value);
++ }
++ } else if (!strcasecmp(v->name, "txgain")) {
++ txgain = atoi(v->value);
++ if (!txgain) {
++ txgain = 0;
++ ast_log(LOG_WARNING, "Invalid txgain: %s, using default.\n", v->value);
++ }
++ } else if (!strcasecmp(v->name, "echocancel")) {
++ if (!strcasecmp(v->value, "off")) {
++ wlec_type = IFX_TAPI_WLEC_TYPE_OFF;
++ } else if (!strcasecmp(v->value, "nlec")) {
++ wlec_type = IFX_TAPI_WLEC_TYPE_NE;
++ if (!strcasecmp(v->name, "echocancelfixedwindowsize")) {
++ wlec_nbne = atoi(v->value);
++ }
++ } else if (!strcasecmp(v->value, "wlec")) {
++ wlec_type = IFX_TAPI_WLEC_TYPE_NFE;
++ if (!strcasecmp(v->name, "echocancelnfemovingwindowsize")) {
++ wlec_nbfe = atoi(v->value);
++ } else if (!strcasecmp(v->name, "echocancelfixedwindowsize")) {
++ wlec_nbne = atoi(v->value);
++ } else if (!strcasecmp(v->name, "echocancelwidefixedwindowsize")) {
++ wlec_wbne = atoi(v->value);
++ }
++ } else if (!strcasecmp(v->value, "nees")) {
++ wlec_type = IFX_TAPI_WLEC_TYPE_NE_ES;
++ } else if (!strcasecmp(v->value, "nfees")) {
++ wlec_type = IFX_TAPI_WLEC_TYPE_NFE_ES;
++ } else if (!strcasecmp(v->value, "es")) {
++ wlec_type = IFX_TAPI_WLEC_TYPE_ES;
++ } else {
++ wlec_type = IFX_TAPI_WLEC_TYPE_OFF;
++ ast_log(LOG_ERROR, "Unknown echo cancellation type '%s'\n", v->value);
++ ast_config_destroy(cfg);
++ return AST_MODULE_LOAD_DECLINE;
++ }
++ } else if (!strcasecmp(v->name, "echocancelnlp")) {
++ if (!strcasecmp(v->value, "on")) {
++ wlec_nlp = IFX_TAPI_WLEC_NLP_ON;
++ } else if (!strcasecmp(v->value, "off")) {
++ wlec_nlp = IFX_TAPI_WLEC_NLP_OFF;
++ } else {
++ ast_log(LOG_ERROR, "Unknown echo cancellation nlp '%s'\n", v->value);
++ ast_config_destroy(cfg);
++ return AST_MODULE_LOAD_DECLINE;
++ }
++ } else if (!strcasecmp(v->name, "jitterbuffertype")) {
++ if (!strcasecmp(v->value, "fixed")) {
++ jb_type = IFX_TAPI_JB_TYPE_FIXED;
++ } else if (!strcasecmp(v->value, "adaptive")) {
++ jb_type = IFX_TAPI_JB_TYPE_ADAPTIVE;
++ jb_localadpt = IFX_TAPI_JB_LOCAL_ADAPT_DEFAULT;
++ if (!strcasecmp(v->name, "jitterbufferadaptation")) {
++ if (!strcasecmp(v->value, "on")) {
++ jb_localadpt = IFX_TAPI_JB_LOCAL_ADAPT_ON;
++ } else if (!strcasecmp(v->value, "off")) {
++ jb_localadpt = IFX_TAPI_JB_LOCAL_ADAPT_OFF;
++ }
++ } else if (!strcasecmp(v->name, "jitterbufferscalling")) {
++ jb_scaling = atoi(v->value);
++ } else if (!strcasecmp(v->name, "jitterbufferinitialsize")) {
++ jb_initialsize = atoi(v->value);
++ } else if (!strcasecmp(v->name, "jitterbufferminsize")) {
++ jb_minsize = atoi(v->value);
++ } else if (!strcasecmp(v->name, "jitterbuffermaxsize")) {
++ jb_maxsize = atoi(v->value);
++ }
++ } else {
++ ast_log(LOG_ERROR, "Unknown jitter buffer type '%s'\n", v->value);
++ ast_config_destroy(cfg);
++ return AST_MODULE_LOAD_DECLINE;
++ }
++ } else if (!strcasecmp(v->name, "jitterbufferpackettype")) {
++ if (!strcasecmp(v->value, "voice")) {
++ jb_pckadpt = IFX_TAPI_JB_PKT_ADAPT_VOICE;
++ } else if (!strcasecmp(v->value, "data")) {
++ jb_pckadpt = IFX_TAPI_JB_PKT_ADAPT_DATA;
++ } else if (!strcasecmp(v->value, "datanorep")) {
++ jb_pckadpt = IFX_TAPI_JB_PKT_ADAPT_DATA_NO_REP;
++ } else {
++ ast_log(LOG_ERROR, "Unknown jitter buffer packet adaptation type '%s'\n", v->value);
++ ast_config_destroy(cfg);
++ return AST_MODULE_LOAD_DECLINE;
++ }
++ } else if (!strcasecmp(v->name, "calleridtype")) {
++ ast_log(LOG_DEBUG, "Setting CID type to %s.\n", v->value);
++ if (!strcasecmp(v->value, "telecordia")) {
++ cid_type = IFX_TAPI_CID_STD_TELCORDIA;
++ } else if (!strcasecmp(v->value, "etsifsk")) {
++ cid_type = IFX_TAPI_CID_STD_ETSI_FSK;
++ } else if (!strcasecmp(v->value, "etsidtmf")) {
++ cid_type = IFX_TAPI_CID_STD_ETSI_DTMF;
++ } else if (!strcasecmp(v->value, "sin")) {
++ cid_type = IFX_TAPI_CID_STD_SIN;
++ } else if (!strcasecmp(v->value, "ntt")) {
++ cid_type = IFX_TAPI_CID_STD_NTT;
++ } else if (!strcasecmp(v->value, "kpndtmf")) {
++ cid_type = IFX_TAPI_CID_STD_KPN_DTMF;
++ } else if (!strcasecmp(v->value, "kpndtmffsk")) {
++ cid_type = IFX_TAPI_CID_STD_KPN_DTMF_FSK;
++ } else {
++ ast_log(LOG_ERROR, "Unknown caller id type '%s'\n", v->value);
++ ast_config_destroy(cfg);
++ return AST_MODULE_LOAD_DECLINE;
++ }
++ } else if (!strcasecmp(v->name, "voiceactivitydetection")) {
++ if (!strcasecmp(v->value, "on")) {
++ vad_type = IFX_TAPI_ENC_VAD_ON;
++ } else if (!strcasecmp(v->value, "g711")) {
++ vad_type = IFX_TAPI_ENC_VAD_G711;
++ } else if (!strcasecmp(v->value, "cng")) {
++ vad_type = IFX_TAPI_ENC_VAD_CNG_ONLY;
++ } else if (!strcasecmp(v->value, "sc")) {
++ vad_type = IFX_TAPI_ENC_VAD_SC_ONLY;
++ } else {
++ ast_log(LOG_ERROR, "Unknown voice activity detection value '%s'\n", v->value);
++ ast_config_destroy(cfg);
++ return AST_MODULE_LOAD_DECLINE;
++ }
++ }
++ }
++
++ lantiq_create_pvts();
++
++ ast_mutex_unlock(&iflock);
++
++ if (ast_channel_register(&lantiq_tech)) {
++ ast_log(LOG_ERROR, "Unable to register channel class 'Phone'\n");
++ ast_config_destroy(cfg);
++ unload_module();
++ return AST_MODULE_LOAD_FAILURE;
++ }
++ ast_config_destroy(cfg);
++
++ /* tapi */
++#ifdef TODO_TONES
++ IFX_TAPI_TONE_t tone;
++#endif
++ IFX_TAPI_DEV_START_CFG_t dev_start;
++ IFX_TAPI_MAP_DATA_t map_data;
++ IFX_TAPI_ENC_CFG_t enc_cfg;
++ IFX_TAPI_LINE_VOLUME_t line_vol;
++ IFX_TAPI_WLEC_CFG_t wlec_cfg;
++ IFX_TAPI_JB_CFG_t jb_cfg;
++ IFX_TAPI_CID_CFG_t cid_cfg;
++ uint8_t c;
++
++ /* open device */
++ dev_ctx.dev_fd = lantiq_dev_open(base_path, 0);
++
++ if (dev_ctx.dev_fd < 0) {
++ ast_log(LOG_ERROR, "lantiq tapi device open function failed\n");
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ for (c = 0; c < dev_ctx.channels ; c++) {
++ dev_ctx.ch_fd[c] = lantiq_dev_open(base_path, c + 1);
++
++ if (dev_ctx.ch_fd[c] < 0) {
++ ast_log(LOG_ERROR, "lantiq tapi channel %d open function failed\n", c);
++ return AST_MODULE_LOAD_FAILURE;
++ }
++ }
++
++ if (lantiq_dev_firmware_download(dev_ctx.dev_fd, firmware_filename)) {
++ ast_log(LOG_ERROR, "voice firmware download failed\n");
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ if (ioctl(dev_ctx.dev_fd, IFX_TAPI_DEV_STOP, 0)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_DEV_STOP ioctl failed\n");
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ memset(&dev_start, 0x0, sizeof(IFX_TAPI_DEV_START_CFG_t));
++ dev_start.nMode = IFX_TAPI_INIT_MODE_VOICE_CODER;
++
++ /* Start TAPI */
++ if (ioctl(dev_ctx.dev_fd, IFX_TAPI_DEV_START, &dev_start)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_DEV_START ioctl failed\n");
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ for (c = 0; c < dev_ctx.channels ; c++) {
++ /* tones */
++#ifdef TODO_TONES
++ memset(&tone, 0, sizeof(IFX_TAPI_TONE_t));
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_TONE_TABLE_CFG_SET, &tone)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_TONE_TABLE_CFG_SET %d failed\n", c);
++ return AST_MODULE_LOAD_FAILURE;
++ }
++#endif
++ /* ringing type */
++ IFX_TAPI_RING_CFG_t ringingType;
++ memset(&ringingType, 0, sizeof(IFX_TAPI_RING_CFG_t));
++ ringingType.nMode = IFX_TAPI_RING_CFG_MODE_INTERNAL_BALANCED;
++ ringingType.nSubmode = IFX_TAPI_RING_CFG_SUBMODE_DC_RNG_TRIP_FAST;
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_RING_CFG_SET, (IFX_int32_t) &ringingType)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_RING_CFG_SET failed\n");
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ /* ring cadence */
++ IFX_char_t data[15] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
++ 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00 };
++
++ IFX_TAPI_RING_CADENCE_t ringCadence;
++ memset(&ringCadence, 0, sizeof(IFX_TAPI_RING_CADENCE_t));
++ memcpy(&ringCadence.data, data, sizeof(data));
++ ringCadence.nr = sizeof(data) * 8;
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_RING_CADENCE_HR_SET, &ringCadence)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_RING_CADENCE_HR_SET failed\n");
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ /* perform mapping */
++ memset(&map_data, 0x0, sizeof(IFX_TAPI_MAP_DATA_t));
++ map_data.nDstCh = c;
++ map_data.nChType = IFX_TAPI_MAP_TYPE_PHONE;
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_MAP_DATA_ADD, &map_data)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_MAP_DATA_ADD %d failed\n", c);
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ /* set line feed */
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_LINE_FEED_SET, IFX_TAPI_LINE_FEED_STANDBY)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_LINE_FEED_SET %d failed\n", c);
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ /* Configure encoder */
++ memset(&enc_cfg, 0x0, sizeof(IFX_TAPI_ENC_CFG_t));
++ enc_cfg.nFrameLen = IFX_TAPI_COD_LENGTH_20;
++ enc_cfg.nEncType = IFX_TAPI_COD_TYPE_MLAW;
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_ENC_CFG_SET, &enc_cfg)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_ENC_CFG_SET %d failed\n", c);
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ /* set volume */
++ memset(&line_vol, 0, sizeof(line_vol));
++ line_vol.nGainRx = rxgain;
++ line_vol.nGainTx = txgain;
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_PHONE_VOLUME_SET, &line_vol)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_PHONE_VOLUME_SET %d failed\n", c);
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ /* Configure line echo canceller */
++ memset(&wlec_cfg, 0, sizeof(wlec_cfg));
++ wlec_cfg.nType = wlec_type;
++ wlec_cfg.bNlp = wlec_nlp;
++ wlec_cfg.nNBFEwindow = wlec_nbfe;
++ wlec_cfg.nNBNEwindow = wlec_nbne;
++ wlec_cfg.nWBNEwindow = wlec_wbne;
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_WLEC_PHONE_CFG_SET, &wlec_cfg)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_WLEC_PHONE_CFG_SET %d failed\n", c);
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ /* Configure jitter buffer */
++ memset(&jb_cfg, 0, sizeof(jb_cfg));
++ jb_cfg.nJbType = jb_type;
++ jb_cfg.nPckAdpt = jb_pckadpt;
++ jb_cfg.nLocalAdpt = jb_localadpt;
++ jb_cfg.nScaling = jb_scaling;
++ jb_cfg.nInitialSize = jb_initialsize;
++ jb_cfg.nMinSize = jb_minsize;
++ jb_cfg.nMaxSize = jb_maxsize;
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_JB_CFG_SET, &jb_cfg)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_JB_CFG_SET %d failed\n", c);
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ /* Configure Caller ID type */
++ memset(&cid_cfg, 0, sizeof(cid_cfg));
++ cid_cfg.nStandard = cid_type;
++
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_CID_CFG_SET, &cid_cfg)) {
++ ast_log(LOG_ERROR, "IIFX_TAPI_CID_CFG_SET %d failed\n", c);
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ /* Configure voice activity detection */
++ if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_ENC_VAD_CFG_SET, vad_type)) {
++ ast_log(LOG_ERROR, "IFX_TAPI_ENC_VAD_CFG_SET %d failed\n", c);
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ /* Setup TAPI <-> Asterisk codec type mapping */
++ if (lantiq_setup_rtp(c)) {
++ return AST_MODULE_LOAD_FAILURE;
++ }
++
++ /* Set initial hook status */
++ iflist[c].channel_state = lantiq_get_hookstatus(c);
++
++ if (iflist[c].channel_state == UNKNOWN) {
++ return AST_MODULE_LOAD_FAILURE;
++ }
++ }
++
++ /* make sure our device will be closed properly */
++ ast_register_atexit(lantiq_cleanup);
++
++ restart_monitor();
++ return AST_MODULE_LOAD_SUCCESS;
++}
++
++AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Lantiq TAPI Telephony API Support");
+diff --git a/feeds/telephony/net/asterisk-1.8.x/src-lantiq/configs/lantiq.conf.sample b/feeds/telephony/net/asterisk-1.8.x/src-lantiq/configs/lantiq.conf.sample
+new file mode 100644
+index 0000000..16ba174
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-1.8.x/src-lantiq/configs/lantiq.conf.sample
+@@ -0,0 +1,138 @@
++;
++; TAPI Telephony Interface
++;
++; Configuration file
++
++[interfaces]
++;
++; Number of FXS ports (default: 2)
++channels = 2
++;
++; Set tapi firmware file path
++;firmwarefilename = /lib/firmware/danube_firmware.bin
++;
++; Set tapi bbd file path
++;bbdfilename = /lib/firmware/danube_bbd_fxs.bin
++;
++; Set vmmc device path
++;basepath = /dev/vmmc
++;
++[general]
++;
++; Gain setting for the receive and transmit path.
++; The value is given in dB within the range (-24dB to +12dB), in 1 dB steps.
++;
++;rxgain = 1
++;txgain = 1
++;
++;
++;
++; Line echo cancller valid types:
++;
++; off LEC and echo suppressor turned off.
++; nlec LEC using fixed window; no echo suppressor.
++; wlec LEC using fixed and moving window; no echo suppressor.
++; nees LEC using fixed window and echo suppressor.
++; nfees LEC using fixed and moving window and echo suppressor.
++; es Echo suppressor
++;
++;echocancel = off
++;
++; If nlec or wlec is selected than size of the fixed window in narrowband (8 kHz) sampling mode
++; can be defined with:
++; A value of 0 defaults to: 16 ms if type is nlec or 8 ms if type is wlec:
++;
++;echocancelfixedwindowsize = 0
++;
++; If wlec is selected than size of the moving window in narrowband (8 kHz) sampling mode
++; can be defined with:
++; A value of 0 defaults to 8 ms.
++;
++;echocancelnfemovingwindowsize = 0
++;
++; If wlec is selected than size of the moving window in wideband (16 kHz) sampling mode
++; can be defined with:
++; A value of 0 defaults to 8 ms.
++;
++;echocancelwidefixedwindowsize = 0
++;
++; Activate or deactivate line echo cancller NLP (Non Linear Processor) if the LEC is active,
++; valid is on or off:
++;
++;echocancelnlp = off
++;
++;
++;
++; Jitter buffer valid types:
++;
++; fixed Fixed jitter buffer.
++; adaptive Adaptive jitter buffer.
++;
++;jitterbuffertype = fixed
++;
++; Jitter buffer packet adaptation valid types:
++;
++; voice Jitter buffer optimized for voice.
++; data Jitter buffer optimized for data.
++; datanorep Jitter buffer optimized for data but without doing packet repetition.
++;
++;jitterbufferpackettype = voice
++;
++; Following jitter buffer values can only be used with jitter buffer adaptive type:
++; Turns on or off jitter buffer adaptation:
++;
++;jitterbufferadaptation = off
++;
++; Scaling factor multiplied by 16; in adaptive jitter buffer mode, the target average playout delay is
++; equal to the estimated jitter multiplied by the scaling factor. The default value for the scaling factor
++; is about 1.4 (scaling=22), meaning that the target average playout delay is equal to the estimated
++; jitter. If less packets should be dropped because of jitter, the scaling factor has to be increased. An
++; increase in the scaling factor will eventually lead to an increased playout delay.
++; The supported range is 1 to 16 (16 up to 256).
++;
++;jitterbufferscalling = 1
++;
++; Initial size of the jitter buffer in time stamps of 125 us:
++;
++;jitterbufferinitialsize = 125
++;
++; Minimum size of the jitter buffer in time stamps of 125 us
++;
++;jitterbufferminsize = 125
++;
++; Maximum size of the jitter buffer in time stamps of 125 us
++;
++;jitterbuffermaxsize = 125
++;
++;
++;
++; Caller id valid standards:
++;
++; telecordia Bellcore/Telcordia GR-30-CORE; use Bell202 FSK coding of CID information. (default)
++; etsifsk ETSI 300-659-1/2/3 V1.3.1; use V.23 FSK coding to transmit CID information.
++; etsidtmf ETSI 300-659-1/2/3 V1.3.1; use DTMF transmission of CID information.
++; sin SIN 227 Issue 3.4; use V.23 FSK coding of CID information.
++; ntt NTT standard: TELEPHONE SERVICE INTERFACES, edition 5; use a modified V.23 FSK coding of
++; CID information.
++; kpndtmf KPN; use DTMF transmission of CID information.
++; kpndtmffsk KPN; use DTMF and FSK transmission of CID information.
++;
++;calleridtype = telecordia
++;
++;
++;
++; Voice activity detection:
++;
++; on Voice activity detection on; in this case also comfort noise and spectral
++; information (nicer noise) is switched on.
++; g711 Voice activity detection on with comfort noise generation,
++; but without spectral information.
++; cng Voice activity detection on with comfort noise generation, but without silence compression
++; sc Voice activity detection on with silence compression,
++; but without comfort noise generation.
++;
++;voiceactivitydetection = on
++;
++;
++;
++;
+diff --git a/feeds/telephony/net/asterisk-11.x-chan-dongle/Makefile b/feeds/telephony/net/asterisk-11.x-chan-dongle/Makefile
+new file mode 100644
+index 0000000..2d85a49
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x-chan-dongle/Makefile
+@@ -0,0 +1,78 @@
++#
++# Copyright (C) 2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=asterisk11-chan-dongle
++PKG_VERSION:=1.1r35
++PKG_REV:=28a46567a88cebdc365db6f294e682246fd2dd7b
++PKG_RELEASE:=6
++
++PKG_SOURCE_SUBDIR:=asterisk11-chan-dongle-$(PKG_VERSION)
++PKG_SOURCE:=$(PKG_SOURCE_SUBDIR).tar.gz
++PKG_SOURCE_URL:=https://github.com/jstasiak/asterisk-chan-dongle.git
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_VERSION:=$(PKG_REV)
++
++PKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
++
++PKG_FIXUP:=autoreconf
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYRIGHT.txt LICENSE.txt
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/asterisk11-chan-dongle
++ SUBMENU:=Telephony
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=https://code.google.com/p/asterisk-chan-dongle/
++ DEPENDS:= asterisk11 +libiconv-full +kmod-usb-acm +kmod-usb-serial +kmod-usb-serial-option +libusb-1.0 +usb-modeswitch
++ TITLE:=Huawei UMTS 3G dongle support
++endef
++
++define Package/asterisk11-chan-dongle/description
++ Asterisk channel driver for Huawei UMTS 3G dongle.
++endef
++
++MAKE_ARGS:= \
++ CC="$(TARGET_CC)" \
++ LD="$(TARGET_CC)" \
++ CFLAGS="$(TARGET_CFLAGS) -DASTERISK_VERSION_NUM=110000 -DLOW_MEMORY -D_GNU_SOURCE -D_XOPEN_SOURCE=600 $(TARGET_CPPFLAGS) -I$(STAGING_DIR)/usr/lib/libiconv-full/include -I$(STAGING_DIR)/usr/include/asterisk-11/include -DHAVE_CONFIG_H -I. -fPIC" \
++ LDFLAGS="$(TARGET_LDFLAGS) -L$(STAGING_DIR)/usr/lib/libiconv-full/lib -liconv" \
++ DESTDIR="$(PKG_INSTALL_DIR)/usr/lib/asterisk/modules"
++
++CONFIGURE_VARS += \
++ ac_cv_type_size_t=yes \
++ ac_cv_type_ssize_t=yes
++
++define Build/Configure
++ $(call Build/Configure/Default, \
++ --with-asterisk=$(STAGING_DIR)/usr/include/asterisk-11/include \
++ $(MAKE_ARGS) \
++ )
++endef
++
++define Build/Compile
++ mkdir -p $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules
++ $(MAKE) -C "$(PKG_BUILD_DIR)" $(MAKE_ARGS) all install
++endef
++
++define Package/asterisk11-chan-dongle/conffiles
++/etc/asterisk/dongle.conf
++endef
++
++define Package/asterisk11-chan-dongle/install
++ $(INSTALL_DIR) $(1)/etc/asterisk
++ $(INSTALL_DATA) $(PKG_BUILD_DIR)/etc/dongle.conf $(1)/etc/asterisk/
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_dongle.so $(1)/usr/lib/asterisk/modules/
++endef
++
++$(eval $(call BuildPackage,asterisk11-chan-dongle))
+diff --git a/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/001-add-send-ussd.patch b/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/001-add-send-ussd.patch
+new file mode 100644
+index 0000000..bc59bf9
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/001-add-send-ussd.patch
+@@ -0,0 +1,64 @@
++--- a/app.c
+++++ b/app.c
++@@ -114,7 +114,44 @@ static int app_send_sms_exec (attribute_
++ return !status;
++ }
++
+++static int app_send_ussd_exec (attribute_unused struct ast_channel* channel, const char* data)
+++{
+++ char* parse;
+++ const char* msg;
+++ int status;
+++ void * msgid;
++
+++ AST_DECLARE_APP_ARGS (args,
+++ AST_APP_ARG (device);
+++ AST_APP_ARG (ussd);
+++ );
+++
+++ if (ast_strlen_zero (data))
+++ {
+++ return -1;
+++ }
+++
+++ parse = ast_strdupa (data);
+++
+++ AST_STANDARD_APP_ARGS (args, parse);
+++
+++ if (ast_strlen_zero (args.device))
+++ {
+++ ast_log (LOG_ERROR, "NULL device for ussd -- USSD will not be sent\n");
+++ return -1;
+++ }
+++
+++ if (ast_strlen_zero (args.ussd))
+++ {
+++ ast_log (LOG_ERROR, "NULL ussd command -- USSD will not be sent\n");
+++ return -1;
+++ }
+++
+++ msg = send_ussd(args.device, args.ussd, &status, &msgid);
+++ if(!status)
+++ ast_log (LOG_ERROR, "[%s] %s with id %p\n", args.device, msg, msgid);
+++ return !status;
+++}
++
++ static const struct dongle_application
++ {
++@@ -144,7 +181,15 @@ static const struct dongle_application
++ " Message - text of the message\n"
++ " Validity - Validity period in minutes\n"
++ " Report - Boolean flag for report request\n"
++- }
+++ },
+++ {
+++ "DongleSendUSSD",
+++ app_send_ussd_exec,
+++ "DongleSendUSSD(Device,USSD)",
+++ "DongleSendUSSD(Device,USSD)\n"
+++ " Device - Id of device from dongle.conf\n"
+++ " USSD - ussd command\n"
+++ }
++ };
++
++ #if ASTERISK_VERSION_NUM >= 10800
+diff --git a/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/050-add-E1752-to-seven_bit_modems.patch b/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/050-add-E1752-to-seven_bit_modems.patch
+new file mode 100644
+index 0000000..a2c490c
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/050-add-E1752-to-seven_bit_modems.patch
+@@ -0,0 +1,19 @@
++From da5cd41e8554eaf1133f85282c253da2c74ff7eb Mon Sep 17 00:00:00 2001
++From: "bg_one@mail.ru" <bg111@users.noreply.github.com>
++Date: Fri, 6 Sep 2013 19:37:05 +0000
++Subject: [PATCH] added E1752 to seven_bit_modems
++
++---
++ at_response.c | 1 +
++ 1 files changed, 1 insertions(+), 0 deletion(-)
++
++--- a/at_response.c
+++++ b/at_response.c
++@@ -1590,6 +1590,7 @@ static int at_response_cgmm (struct pvt*
++ "E171",
++ "E153",
++ "E156B",
+++ "E1752",
++ };
++
++ ast_copy_string (pvt->model, str, sizeof (pvt->model));
+diff --git a/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/051-bump-package-revision.patch b/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/051-bump-package-revision.patch
+new file mode 100644
+index 0000000..3d85dd6
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/051-bump-package-revision.patch
+@@ -0,0 +1,20 @@
++From da5cd41e8554eaf1133f85282c253da2c74ff7eb Mon Sep 17 00:00:00 2001
++From: "bg_one@mail.ru" <bg111@users.noreply.github.com>
++Date: Fri, 6 Sep 2013 19:37:05 +0000
++Subject: [PATCH] added E1752 to seven_bit_modems
++
++---
++ configure.in | 2 +-
++ 1 files changed, 1 insertions(+), 1 deletion(-)
++
++--- a/configure.in
+++++ b/configure.in
++@@ -2,7 +2,7 @@ dnl init
++ dnl AC_REVISION($Revision: 1.30 $)
++ AC_PREREQ([2.60])
++ AC_INIT([chan_dongle],[1.1],[http://code.google.com/p/asterisk-chan-dongle/issues/list],[chan_dongle],[http://code.google.com/p/asterisk-chan-dongle])
++-PACKAGE_REVISION="34"
+++PACKAGE_REVISION="35"
++ AC_CANONICAL_TARGET
++ AM_INIT_AUTOMAKE
++ AC_CONFIG_HEADERS([config.h])
+diff --git a/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/100-fix-audio-on-big-endian-systems.patch b/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/100-fix-audio-on-big-endian-systems.patch
+new file mode 100644
+index 0000000..a6b1c07
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x-chan-dongle/patches/100-fix-audio-on-big-endian-systems.patch
+@@ -0,0 +1,46 @@
++--- a/channel.c
+++++ b/channel.c
++@@ -495,6 +495,19 @@ again:
++ }
++ }
++
+++// see https://github.com/openwrt/telephony/issues/7
+++static inline void change_audio_endianness_to_le(struct iovec *iov, int iovcnt)
+++{
+++#if __BYTE_ORDER == __LITTLE_ENDIAN
+++ return; // nothing to do
+++#else
+++ for(;iovcnt-->0;iov++)
+++ {
+++ ast_swapcopy_samples(iov->iov_base, iov->iov_base, iov->iov_len/2);
+++ }
+++#endif
+++}
+++
++ #/* */
++ static void timing_write (struct pvt* pvt)
++ {
++@@ -522,6 +535,7 @@ static void timing_write (struct pvt* pv
++ iovcnt = mixb_read_n_iov (&pvt->a_write_mixb, iov, FRAME_SIZE);
++ mixb_read_n_iov (&pvt->a_write_mixb, iov, FRAME_SIZE);
++ mixb_read_upd (&pvt->a_write_mixb, FRAME_SIZE);
+++ change_audio_endianness_to_le(iov, iovcnt);
++ }
++ else if (used > 0)
++ {
++@@ -535,6 +549,7 @@ static void timing_write (struct pvt* pv
++ iov[iovcnt].iov_base = silence_frame;
++ iov[iovcnt].iov_len = FRAME_SIZE - used;
++ iovcnt++;
+++ change_audio_endianness_to_le(iov, iovcnt);
++ }
++ else
++ {
++@@ -544,6 +559,7 @@ static void timing_write (struct pvt* pv
++ iov[0].iov_base = silence_frame;
++ iov[0].iov_len = FRAME_SIZE;
++ iovcnt = 1;
+++ // ignore endianness for zeros
++ // continue;
++ }
++
+diff --git a/feeds/telephony/net/asterisk-11.x/Makefile b/feeds/telephony/net/asterisk-11.x/Makefile
+new file mode 100644
+index 0000000..72d7905
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x/Makefile
+@@ -0,0 +1,453 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++# Copyright (C) 2015 Cesnet, z.s.p.o.
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=asterisk11
++PKG_VERSION:=11.20.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=asterisk-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.asterisk.org/pub/telephony/asterisk/releases/
++PKG_MD5SUM:=d15759b05862250073e2708394ad2f4c
++
++PKG_BUILD_DIR=$(BUILD_DIR)/asterisk-$(PKG_VERSION)
++PKG_BUILD_DEPENDS:=libxml2/host
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING LICENSE
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/asterisk11/install/module
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/*$(2).so* $(1)/usr/lib/asterisk/modules/
++endef
++
++define Package/asterisk11/install/conffile
++ $(INSTALL_DIR) $(1)/etc/asterisk
++ $(CP) $(PKG_INSTALL_DIR)/etc/asterisk/*$(2)* $(1)/etc/asterisk/
++endef
++
++define Package/asterisk11/install/lib
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/$(2).so* $(1)/usr/lib/
++endef
++
++define Package/asterisk11/install/sbin
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/$(2) $(1)/usr/sbin/
++endef
++
++define Package/asterisk11/install/sounds
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/$(2) $(1)/usr/lib/asterisk/sounds/
++endef
++
++define BuildAsterisk11Module
++ define Package/asterisk11-$(1)
++ $$(call Package/asterisk11/Default)
++ TITLE:=$(2) support
++ DEPENDS:= asterisk11 $(patsubst +%,+PACKAGE_asterisk11-$(1):%,$(4))
++ endef
++
++ define Package/asterisk11-$(1)/conffiles
++$(5)
++ endef
++
++ define Package/asterisk11-$(1)/description
++This package provides support for '$(3)' in Asterisk11.
++ endef
++
++ define Package/asterisk11-$(1)/install
++$(foreach c,$(6),$(call Package/asterisk11/install/conffile,$$(1),$(c));)
++$(foreach m,$(7),$(call Package/asterisk11/install/module,$$(1),$(m));)
++$(foreach s,$(8),$(call Package/asterisk11/install/sounds,$$(1),$(s));)
++$(foreach b,$(9),$(call Package/asterisk11/install/sbin,$$(1),$(b));)
++ endef
++
++ $$(eval $$(call BuildPackage,asterisk11-$(1)))
++endef
++
++define Package/asterisk11/Default
++ SUBMENU:=Telephony
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://www.asterisk.org/
++ MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++endef
++
++define Package/asterisk11/Default/description
++ Asterisk is a complete PBX in software. It provides all of the features
++ you would expect from a PBX and more. Asterisk does voice over IP in three
++ protocols, and can interoperate with almost all standards-based telephony
++ equipment using relatively inexpensive hardware.
++endef
++
++define Package/asterisk11
++$(call Package/asterisk11/Default)
++ TITLE:=Complete open source PBX, v$(PKG_VERSION)
++ MENU:=1
++ DEPENDS:=+libopenssl +libncurses +libpopt +libpthread +libsqlite3 +librt +libuuid +zlib @!TARGET_avr32
++endef
++
++define Package/asterisk11/description
++$(call Package/asterisk11/Default/description)
++endef
++
++define Package/asterisk11/conffiles
++/etc/asterisk/asterisk.conf
++/etc/asterisk/acl.conf
++/etc/asterisk/ccss.conf
++/etc/asterisk/modules.conf
++/etc/asterisk/extconfig.conf
++/etc/asterisk/extensions.conf
++/etc/asterisk/features.conf
++/etc/asterisk/indications.conf
++/etc/asterisk/logger.conf
++/etc/asterisk/manager.conf
++/etc/asterisk/modules.conf
++/etc/asterisk/res_config_sqlite3.conf
++/etc/asterisk/rtp.conf
++/etc/asterisk/sip.conf
++/etc/asterisk/sip_notify.conf
++/etc/asterisk/udptl.conf
++/etc/asterisk/users.conf
++/etc/init.d/asterisk
++endef
++
++AST_CFG_FILES:= \
++ asterisk.conf acl.conf ccss.conf extconfig.conf \
++ extensions.conf features.conf indications.conf \
++ logger.conf manager.conf modules.conf res_config_sqlite3.conf \
++ rtp.conf sip_notify.conf sip.conf udptl.conf users.conf
++AST_EMB_MODULES:=\
++ app_dial app_echo app_macro app_playback codec_ulaw format_pcm func_callerid \
++ func_logic func_strings func_timeout chan_sip chan_local pbx_config \
++ res_crypto res_http_websocket res_rtp_asterisk res_rtp_multicast
++
++define Package/asterisk11/install
++$(call Package/asterisk11/install/lib,$(1),libasteriskssl)
++$(call Package/asterisk11/install/sbin,$(1),asterisk)
++$(call Package/asterisk11/install/sbin,$(1),safe_asterisk)
++$(call Package/asterisk11/install/sbin,$(1),astgenkey)
++$(foreach m,$(AST_CFG_FILES),$(call Package/asterisk11/install/conffile,$(1),$(m));)
++$(foreach m,$(AST_EMB_MODULES),$(call Package/asterisk11/install/module,$(1),$(m));)
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/asterisk.init $(1)/etc/init.d/asterisk
++endef
++
++define Package/asterisk11-sounds
++$(call Package/asterisk11/Default)
++ TITLE:=Sounds support
++ DEPENDS:=asterisk11
++endef
++
++define Package/asterisk11-sounds/description
++This package provides sounds for Asterisk11.
++endef
++
++define Package/asterisk11-sounds/install
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/* $(1)/usr/lib/asterisk/sounds/
++ rm -f $(1)/usr/lib/asterisk/sounds/vm-*
++ rm -f $(1)/usr/lib/asterisk/sounds/conf-*
++endef
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk11-chan-dahdi),)
++ CONFIGURE_ARGS+= \
++ --with-dahdi="$(STAGING_DIR)/usr" \
++ --with-pri="$(STAGING_DIR)/usr" \
++ --with-tonezone="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-dahdi \
++ --without-pri \
++ --without-tonezone
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk11-curl),)
++ CONFIGURE_ARGS+= \
++ --with-libcurl="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-libcurl
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk11-mysql),)
++ CONFIGURE_VARS+= \
++ ac_cv_path_ac_pt_CONFIG_MYSQLCLIENT=$(STAGING_DIR)/usr/bin/mysql_config
++ CONFIGURE_ARGS+= \
++ --with-mysqlclient
++else
++ CONFIGURE_ARGS+= \
++ --without-mysqlclient
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk11-pbx-lua),)
++ CONFIGURE_ARGS+= \
++ --with-lua="$(STAGING_DIR)/usr"
++ TARGET_LDFLAGS+=-ldl -lcrypt
++else
++ CONFIGURE_ARGS+= \
++ --without-lua
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk11-pgsql),)
++ CONFIGURE_ARGS+= \
++ --with-postgres="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-postgres
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk11-res-fax-spandsp),)
++ CONFIGURE_ARGS+= \
++ --with-spandsp="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-spandsp
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk11-res-srtp),)
++ CONFIGURE_ARGS+= \
++ --with-srtp="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-srtp
++endif
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk11-res-xmpp),)
++ CONFIGURE_ARGS+= \
++ --with-iksemel="$(STAGING_DIR)/usr"
++ SITE_VARS+= \
++ ac_cv_lib_iksemel_iks_start_sasl=yes
++else
++ CONFIGURE_ARGS+= \
++ --without-iksemel
++endif
++
++EXTRA_CFLAGS+= $(TARGET_CPPFLAGS)
++EXTRA_LDFLAGS+= $(TARGET_LDFLAGS) -Wl,-rpath-link,$(STAGING_DIR)/usr/lib
++CONFIGURE_ARGS+= \
++ --build=$(GNU_HOST_NAME) \
++ --host=$(GNU_TARGET_NAME) \
++ --target=$(GNU_TARGET_NAME) \
++ --without-bluetooth \
++ --without-cap \
++ --without-curses \
++ --with-gsm=internal \
++ --without-gtk2 \
++ --with-ilbc=internal \
++ --without-isdnnet \
++ --without-libxml2 \
++ --without-misdn \
++ --without-nbs \
++ --with-ncurses="$(STAGING_DIR)/usr" \
++ --without-netsnmp \
++ --without-neon \
++ --without-neon29 \
++ --without-newt \
++ --without-ogg \
++ --without-osptk \
++ --with-popt="$(STAGING_DIR)/usr" \
++ --without-pwlib \
++ --without-radius \
++ --without-sdl \
++ --without-sqlite \
++ --with-sqlite3="$(STAGING_DIR)/usr" \
++ --without-suppserv \
++ --without-tds \
++ --without-termcap \
++ --without-tinfo \
++ --with-uuid="$(STAGING_DIR)/usr" \
++ --without-vorbis \
++ --without-vpb \
++ --with-z="$(STAGING_DIR)/usr" \
++ --with-sounds-cache="$(DL_DIR)" \
++ --disable-xmldoc
++
++CONFIGURE_VARS += \
++ ac_cv_path_ac_pt_CONFIG_LIBXML2=$(STAGING_DIR)/host/bin/xml2-config
++
++AST_MENUSELECT_OPTS = \
++ --without-newt \
++ --without-curses \
++ --with-ncurses="$(STAGING_DIR_HOST)/usr" \
++ --with-libxml2="$(STAGING_DIR_HOST)/usr"
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); \
++ ./bootstrap.sh; \
++ );
++ echo "export CFLAGS += $(FPIC) $(TARGET_CFLAGS) $(EXTRA_CFLAGS)"\
++ " $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)"\
++ > $(PKG_BUILD_DIR)/res/pjproject/user.mak;
++ echo "export LDLAGS += $(TARGET_LDFLAGS) $(EXTRA_LDFLAGS)"\
++ " -lc $(LIBGCC_S) -lm"\
++ >> $(PKG_BUILD_DIR)/res/pjproject/user.mak;
++ echo "export CXXFLAGS += $(FPIC) $(TARGET_CFLAGS) $(EXTRA_CFLAGS)"\
++ " $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)"\
++ >> $(PKG_BUILD_DIR)/res/pjproject/user.mak;
++ $(call Build/Configure/Default,,$(SITE_VARS))
++ (cd $(PKG_BUILD_DIR)/menuselect; \
++ ./configure \
++ $(HOST_CONFIGURE_ARGS) \
++ $(AST_MENUSELECT_OPTS) \
++ LDFLAGS="$(HOST_LDFLAGS) -lxml2" \
++ CFLAGS="$(HOST_CFLAGS) -I$(STAGING_DIR_HOST)/include/libxml2" \
++ );
++endef
++
++define Build/Compile
++ $(MAKE) -C "$(PKG_BUILD_DIR)/menuselect" \
++ CFLAGS="$(HOST_CFLAGS) -I$(STAGING_DIR_HOST)/include/libxml2" \
++ LDFLAGS="$(HOST_LDFLAGS) -lxml2"
++ $(MAKE) -C "$(PKG_BUILD_DIR)" include/asterisk/version.h \
++ include/asterisk/buildopts.h defaults.h \
++ makeopts.embed_rules
++ ASTCFLAGS="$(EXTRA_CFLAGS) -DLOW_MEMORY"
++ ASTLDFLAGS="$(EXTRA_LDFLAGS)"
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ ASTVARLIBDIR="/usr/lib/asterisk" \
++ ASTDATADIR="/usr/lib/asterisk" \
++ ASTKEYDIR="/usr/lib/asterisk" \
++ ASTDBDIR="/usr/lib/asterisk" \
++ NOISY_BUILD="yes" \
++ DEBUG="" \
++ OPTIMIZE="" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install samples
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/asterisk-11/include/asterisk/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk/*.h $(1)/usr/include/asterisk-11/include/asterisk/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk.h $(1)/usr/include/asterisk-11/include/
++endef
++
++$(eval $(call BuildPackage,asterisk11))
++$(eval $(call BuildPackage,asterisk11-sounds))
++
++################################
++# AST modules
++# Params:
++# 1 - Package subname
++# 2 - Package title
++# 3 - Module description
++# 4 - Module dependencies
++# 5 - Full path to multiple conffiles
++# 6 - conf files
++# 7 - module files
++# 8 - sound files
++# 9 - binary files
++################################
++
++$(eval $(call BuildAsterisk11Module,app-alarmreceiver,Alarm receiver,Central Station Alarm receiver for Ademco Contact ID,,,,app_alarmreceiver,))
++$(eval $(call BuildAsterisk11Module,app-authenticate,Authenticate commands,Execute arbitrary authenticate commands,,,,app_authenticate,))
++$(eval $(call BuildAsterisk11Module,app-confbridge,ConfBridge,Software bridge for multi-party audio conferencing,,/etc/asterisk/confbridge.conf,confbridge.conf,app_confbridge bridge_builtin_features bridge_multiplexed bridge_simple bridge_softmix chan_bridge,))
++$(eval $(call BuildAsterisk11Module,app-dahdiras,Execute an ISDN RAS,support for executing an ISDN RAS using DAHDI,+asterisk11-chan-dahdi,,,app_dahdiras,))
++$(eval $(call BuildAsterisk11Module,app-directory,Provide a directory of extensions,provides a directory of extensions,,,,app_directory,))
++$(eval $(call BuildAsterisk11Module,app-directed_pickup,Directed call pickup,support for directed call pickup,,,,app_directed_pickup,))
++$(eval $(call BuildAsterisk11Module,app-disa,Direct Inward System Access,Direct Inward System Access,,,,app_disa,))
++$(eval $(call BuildAsterisk11Module,app-exec,Exec application,support for application execution,,,,app_exec,))
++$(eval $(call BuildAsterisk11Module,app-chanisavail,Channel availability check,support for checking if a channel is available,,,,app_chanisavail,))
++$(eval $(call BuildAsterisk11Module,app-chanspy,Channel listen in,support for listening in on any channel,,,,app_chanspy,))
++$(eval $(call BuildAsterisk11Module,app-minivm,Minimal voicemail system,a voicemail system in small building blocks working together based on the Comedian Mail voicemail,,/etc/asterisk/extensions_minivm.conf /etc/asterisk/minivm.conf,extensions_minivm.conf minivm.conf,app_minivm,))
++$(eval $(call BuildAsterisk11Module,app-mixmonitor,Record a call and mix the audio,record a call and mix the audio during the recording,,,,app_mixmonitor,))
++$(eval $(call BuildAsterisk11Module,app-originate,Originate a call,originating an outbound call and connecting it to a specified extension or application,,,,app_originate,))
++$(eval $(call BuildAsterisk11Module,app-playtones,Playtones application,play a tone list,,,,app_playtones,))
++$(eval $(call BuildAsterisk11Module,app-read,Variable read,a trivial application to read a variable,,,,app_read,))
++$(eval $(call BuildAsterisk11Module,app-readexten,Extension to variable,a trivial application to read an extension into a variable,,,,app_readexten,))
++$(eval $(call BuildAsterisk11Module,app-record,Record sound file,to record a sound file,,,,app_record,))
++$(eval $(call BuildAsterisk11Module,app-sayunixtime,Say Unix time,an application to say Unix time,,,,app_sayunixtime,))
++$(eval $(call BuildAsterisk11Module,app-senddtmf,Send DTMF digits,Sends arbitrary DTMF digits,,,,app_senddtmf,))
++$(eval $(call BuildAsterisk11Module,app-sms,SMS,SMS support (ETSI ES 201 912 protocol 1),+libpopt +libstdcpp,,,app_sms,,smsq))
++$(eval $(call BuildAsterisk11Module,app-stack,Stack applications,Stack applications Gosub Return etc.,+asterisk11-res-agi,,,app_stack,))
++$(eval $(call BuildAsterisk11Module,app-system,System exec,support for executing system commands,,,,app_system,))
++$(eval $(call BuildAsterisk11Module,app-talkdetect,File playback with audio detect,for file playback with audio detect,,,,app_talkdetect,))
++$(eval $(call BuildAsterisk11Module,app-verbose,Verbose logging,Verbose logging application,,,,app_verbose,))
++$(eval $(call BuildAsterisk11Module,app-waituntil,Sleep,support sleeping until the given epoch,,,,app_waituntil,))
++$(eval $(call BuildAsterisk11Module,app-while,While loop,a while loop implementation,,,,app_while,))
++$(eval $(call BuildAsterisk11Module,cdr-csv,Provides CDR CSV,Call Detail Record with CSV support,,,,cdr_csv,))
++$(eval $(call BuildAsterisk11Module,cdr-sqlite3,Provides CDR SQLITE3,Call Detail Record with SQLITE3 support,libsqlite3,,,cdr_sqlite3_custom,))
++$(eval $(call BuildAsterisk11Module,cdr,Provides CDR,Call Detail Record,,/etc/asterisk/cdr.conf /etc/asterisk/cdr_custom.conf /etc/asterisk/cdr_manager.conf /etc/asterisk/cdr_syslog.conf,cdr cdr_custom cdr_manager cdr_syslog,app_cdr app_forkcdr cdr_custom cdr_manager cdr_syslog func_cdr,))
++$(eval $(call BuildAsterisk11Module,codec-a-mu,Alaw to ulaw translation,translation between alaw and ulaw codecs,,,,codec_a_mu,))
++$(eval $(call BuildAsterisk11Module,codec-adpcm,ADPCM text,ADPCM text ,,,,codec_adpcm,))
++$(eval $(call BuildAsterisk11Module,codec-alaw,Signed linear to alaw translation,translation between signed linear and alaw codecs,,,,codec_alaw,))
++$(eval $(call BuildAsterisk11Module,codec-dahdi,DAHDI codec,DAHDI native transcoding support,+asterisk11-chan-dahdi,,,codec_dahdi,))
++$(eval $(call BuildAsterisk11Module,codec-g722,G.722,a high bit rate 48/56/64Kbps ITU standard codec,,,,codec_g722,))
++$(eval $(call BuildAsterisk11Module,codec-g726,Signed linear to G.726 translation,translation between signed linear and ITU G.726-32kbps codecs,,,,codec_g726,))
++$(eval $(call BuildAsterisk11Module,codec-gsm,linear to GSM translation,translate between signed linear and GSM,,,,codec_gsm,))
++$(eval $(call BuildAsterisk11Module,codec-ilbc,linear to ILBC translation,translate between signed linear and ILBC,,,,codec_ilbc,))
++$(eval $(call BuildAsterisk11Module,codec-lpc10,Linear to LPC10 translation,translate between signed linear and LPC10,,,,codec_lpc10,))
++$(eval $(call BuildAsterisk11Module,codec-resample,resample sLinear audio,resample sLinear audio,,,,codec_resample,))
++$(eval $(call BuildAsterisk11Module,curl,CURL,CURL support,+libcurl,,,func_curl res_curl,))
++$(eval $(call BuildAsterisk11Module,format-g726,G.726,support for headerless G.726 16/24/32/40kbps data format,,,,format_g726,))
++$(eval $(call BuildAsterisk11Module,format-g729,G.729,support for raw headerless G729 data,,,,format_g729,))
++$(eval $(call BuildAsterisk11Module,format-gsm,GSM format,support for GSM format,,,,format_gsm,))
++$(eval $(call BuildAsterisk11Module,format-h263,H263 format,support for H264 format,,,,format_h263,))
++$(eval $(call BuildAsterisk11Module,format-h264,H264 format,support for H264 format,,,,format_h264,))
++$(eval $(call BuildAsterisk11Module,format-ilbc,ILBC format,support for ILBC format,,,,format_ilbc,))
++$(eval $(call BuildAsterisk11Module,format-sln,Raw slinear format,support for raw slinear format,,,,format_sln,))
++$(eval $(call BuildAsterisk11Module,format-vox,VOX format,support for ADPCM vox format,,,,format_vox,))
++$(eval $(call BuildAsterisk11Module,format-wav-gsm,WAV format (Proprietary GSM),support for proprietary Microsoft WAV format (Proprietary GSM),,,,format_wav_gsm,))
++$(eval $(call BuildAsterisk11Module,format-wav,WAV format (8000hz Signed Linear),support for proprietary Microsoft WAV format (8000hz Signed Linear),,,,format_wav,))
++$(eval $(call BuildAsterisk11Module,func-base64,base64 support,support of base64 function,,,,func_base64,))
++$(eval $(call BuildAsterisk11Module,func-blacklist,Blacklist on callerid,looking up the callerid number and see if it is blacklisted,,,,func_blacklist,))
++$(eval $(call BuildAsterisk11Module,func-cut,CUT function,CUT function,,,,func_cut,))
++$(eval $(call BuildAsterisk11Module,func-db,Database interaction,functions for interaction with the database,,,,func_db app_db,))
++$(eval $(call BuildAsterisk11Module,func-devstate,Blinky lights control,functions for manually controlled blinky lights,,,,func_devstate,))
++$(eval $(call BuildAsterisk11Module,func-enum,ENUM,ENUM,,/etc/asterisk/enum.conf,enum.conf,func_enum,))
++$(eval $(call BuildAsterisk11Module,func-env,Environment functions,Environment dialplan functions,,,,func_env,))
++$(eval $(call BuildAsterisk11Module,func-extstate,Hinted extension state,retrieving the state of a hinted extension for dialplan control,,,,func_extstate,))
++$(eval $(call BuildAsterisk11Module,func-global,Global variable,global variable dialplan functions,,,,func_global,))
++$(eval $(call BuildAsterisk11Module,func-groupcount,Group count,for counting number of channels in the specified group,,,,func_groupcount,))
++$(eval $(call BuildAsterisk11Module,func-channel,Channel info,Channel info dialplan function,,,,func_channel,))
++$(eval $(call BuildAsterisk11Module,func-math,Math functions,Math functions,,,,func_math,))
++$(eval $(call BuildAsterisk11Module,func-module,Simple module check function,Simple module check function,,,,func_module,))
++$(eval $(call BuildAsterisk11Module,func-shell,Shell,support for shell execution,,,,func_shell,))
++$(eval $(call BuildAsterisk11Module,func-uri,URI encoding and decoding,Encodes and decodes URI-safe strings,,,,func_uri,))
++$(eval $(call BuildAsterisk11Module,func-vmcount,vmcount dialplan,a vmcount dialplan function,,,,func_vmcount,))
++$(eval $(call BuildAsterisk11Module,func-realtime,realtime dialplan,the realtime dialplan function,,,,func_realtime,))
++$(eval $(call BuildAsterisk11Module,chan-agent,Agents proxy channel,an implementation of agents proxy channel,,,,chan_agent,))
++$(eval $(call BuildAsterisk11Module,chan-dahdi,DAHDI channel,DAHDI channel support,+dahdi-tools-libtonezone +kmod-dahdi +libpri,/etc/asterisk/chan_dahdi.conf,chan_dahdi.conf,chan_dahdi,))
++$(eval $(call BuildAsterisk11Module,chan-iax2,IAX2 channel,IAX support,+asterisk11-res-timing-timerfd,/etc/asterisk/iax.conf /etc/asterisk/iaxprov.conf,iax.conf iaxprov.conf,chan_iax2,))
++$(eval $(call BuildAsterisk11Module,chan-mgcp,MGCP channel,the channel chan_mgcp,,/etc/asterisk/mgcp.conf,mgcp.conf,chan_mgcp,))
++$(eval $(call BuildAsterisk11Module,chan-motif,Jingle channel,Motif Jingle Channel Driver,+asterisk11-res-xmpp,/etc/asterisk/motif.conf /etc/asterisk/jingle.conf,motif.conf jingle.conf,chan_motif,))
++$(eval $(call BuildAsterisk11Module,chan-ooh323,ooH323 channel,the channel chan_ooh323,,/etc/asterisk/ooh323.conf,ooh323.conf,chan_ooh323,))
++$(eval $(call BuildAsterisk11Module,chan-skinny,Skinny channel,the channel chan_skinny,,/etc/asterisk/skinny.conf,skinny.conf,chan_skinny,))
++$(eval $(call BuildAsterisk11Module,chan-unistim,Unistim channel,channel driver for the UNISTIM (Unified Networks IP Stimulus) protocol,,/etc/asterisk/unistim.conf,unistim.conf,chan_unistim,))
++$(eval $(call BuildAsterisk11Module,mysql,MySQL,MySQL support,+libmysqlclient,/etc/asterisk/res_config_mysql.conf,res_config_mysql.conf,res_config_mysql,))
++$(eval $(call BuildAsterisk11Module,odbc,ODBC,ODBC support,+libpthread +libc +unixodbc,/etc/asterisk/cdr_adaptive_odbc.conf /etc/asterisk/cdr_odbc.conf /etc/asterisk/cel_odbc.conf /etc/asterisk/func_odbc.conf /etc/asterisk/res_odbc.conf,cdr_adaptive_odbc cdr_odbc cel_odbc func_odbc res_odbc,cdr_adaptive_odbc cdr_odbc cel_odbc func_odbc res_config_odbc res_odbc,))
++$(eval $(call BuildAsterisk11Module,pbx-ael,Asterisk Extension Logic,support for symbolic Asterisk Extension Logic,,,extensions.ael,pbx_ael,))
++$(eval $(call BuildAsterisk11Module,pbx-dundi,Dundi,provides Dundi Lookup service for Asterisk,,/etc/asterisk/dundi.conf,dundi.conf,pbx_dundi,))
++$(eval $(call BuildAsterisk11Module,pbx-lua,Lua,provides Lua resources for Asterisk,+libpthread +libc +liblua,/etc/asterisk/extensions.lua,extensions.lua,pbx_lua,))
++$(eval $(call BuildAsterisk11Module,pbx-spool,Call Spool,outgoing call spool support,,,,pbx_spool,))
++$(eval $(call BuildAsterisk11Module,pbx-realtime,Realtime Switch,realtime switch support,,,,pbx_realtime,))
++$(eval $(call BuildAsterisk11Module,pgsql,PostgreSQL,PostgreSQL support,+libpq,/etc/asterisk/cel_pgsql.conf /etc/asterisk/cdr_pgsql.conf /etc/asterisk/res_pgsql.conf,cel_pgsql.conf cdr_pgsql.conf res_pgsql.conf,cel_pgsql cdr_pgsql res_config_pgsql,))
++$(eval $(call BuildAsterisk11Module,res-adsi,Provide ADSI,Analog Display Services Interface capability,,,,res_adsi,))
++$(eval $(call BuildAsterisk11Module,res-ael-share,Shareable AEL code,support for shareable AEL code mainly between internal and external modules,,,,res_ael_share,))
++$(eval $(call BuildAsterisk11Module,res-agi,Asterisk Gateway Interface,Support for the Asterisk Gateway Interface extension,,,,res_agi,))
++$(eval $(call BuildAsterisk11Module,res-calendar,Calendaring API,Calendaring support (ICal and Google Calendar),,/etc/asterisk/calendar.conf,calendar.conf,res_calendar,,))
++$(eval $(call BuildAsterisk11Module,res-clioriginate,Calls via CLI,Originate calls via the CLI,,,,res_clioriginate,))
++$(eval $(call BuildAsterisk11Module,res-fax-spandsp,Spandsp T.38 and G.711,Spandsp T.38 and G.711 FAX Resource,+asterisk11-res-fax +libspandsp +libtiff,,,res_fax_spandsp,))
++$(eval $(call BuildAsterisk11Module,res-fax,FAX modules,Generic FAX resource for FAX technology resource modules,+asterisk11-res-timing-pthread,/etc/asterisk/res_fax.conf /etc/asterisk/udptl.conf,udptl.conf res_fax.conf,res_fax,))
++$(eval $(call BuildAsterisk11Module,res-monitor,Provide Monitor,Cryptographic Signature capability,,,,res_monitor,))
++$(eval $(call BuildAsterisk11Module,res-musiconhold,MOH,Music On Hold support,,/etc/asterisk/musiconhold.conf,musiconhold.conf,res_musiconhold,))
++$(eval $(call BuildAsterisk11Module,res-phoneprov,Phone Provisioning,Phone provisioning application for the asterisk internal http server,,/etc/asterisk/phoneprov.conf,phoneprov.conf,res_phoneprov,))
++$(eval $(call BuildAsterisk11Module,res-pktccops,Provide PacketCable COPS,simple client/server model for supporting policy control over QoS signaling protocols,,/etc/asterisk/res_pktccops.conf,res_pktccops.conf,res_pktccops,))
++$(eval $(call BuildAsterisk11Module,res-smdi,Provide SMDI,Simple Message Desk Interface capability,,/etc/asterisk/smdi.conf,smdi.conf,res_smdi,))
++$(eval $(call BuildAsterisk11Module,res-srtp,SRTP,Secure RTP,+libsrtp,,,res_srtp,))
++$(eval $(call BuildAsterisk11Module,res-timing-dahdi,DAHDI Timing Interface,,+asterisk11-chan-dahdi,,,res_timing_dahdi,))
++$(eval $(call BuildAsterisk11Module,res-timing-pthread,pthread Timing Interface,,,,,res_timing_pthread,))
++$(eval $(call BuildAsterisk11Module,res-timing-timerfd,Timerfd Timing Interface,,,,,res_timing_timerfd,))
++$(eval $(call BuildAsterisk11Module,res-xmpp,XMPP client and component module,reference module for interfacting Asterisk directly as a client or component with XMPP server,+libiksemel +libopenssl,/etc/asterisk/xmpp.conf,xmpp.conf,res_xmpp,))
++$(eval $(call BuildAsterisk11Module,res-realtime,Realtime Interface,,,,,res_realtime,))
++$(eval $(call BuildAsterisk11Module,voicemail,Voicemail,voicemail related modules,+asterisk11-res-adsi +asterisk11-res-smdi,/etc/asterisk/voicemail.conf,voicemail.conf,*voicemail,vm-*))
+diff --git a/feeds/telephony/net/asterisk-11.x/files/asterisk.init b/feeds/telephony/net/asterisk-11.x/files/asterisk.init
+new file mode 100644
+index 0000000..269915b
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x/files/asterisk.init
+@@ -0,0 +1,32 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=99
++APP=asterisk
++OPTIONS=
++DEST=
++BIN_FILE=$DEST/usr/sbin/$APP
++PID_FILE=$DEST/var/run/$APP/$APP.pid
++
++start() {
++ [ -d $DEST/var/run/asterisk ] || mkdir -p $DEST/var/run/asterisk
++ [ -d $DEST/var/log/asterisk ] || mkdir -p $DEST/var/log/asterisk
++ [ -d $DEST/var/spool/asterisk ] || mkdir -p $DEST/var/spool/asterisk
++ [ -d $DEST/var/lib ] || mkdir -p $DEST/var/lib
++ [ -h $DEST/var/lib/asterisk ] || ln -s /usr/lib/asterisk /var/lib/asterisk
++ [ -d $DEST/var/lib/asterisk/keys ] || mkdir -p $DEST/var/lib/asterisk/keys
++ [ -d $DEST/var/log/asterisk/cdr-csv ] || mkdir -p $DEST/var/log/asterisk/cdr-csv
++
++ SERVICE_PID_FILE="/var/run/asterisk/asterisk.pid" \
++ service_start $BIN_FILE $OPTIONS
++}
++
++stop() {
++ SERVICE_PID_FILE="/var/run/asterisk/asterisk.pid" \
++ service_stop $BIN_FILE
++}
++
++reload() {
++ SERVICE_PID_FILE="/var/run/asterisk/asterisk.pid" \
++ service_reload $BIN_FILE
++}
+diff --git a/feeds/telephony/net/asterisk-11.x/patches/001-pjproject-change-configure-args.patch b/feeds/telephony/net/asterisk-11.x/patches/001-pjproject-change-configure-args.patch
+new file mode 100644
+index 0000000..335a6bd
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x/patches/001-pjproject-change-configure-args.patch
+@@ -0,0 +1,11 @@
++--- a/res/Makefile
+++++ b/res/Makefile
++@@ -78,7 +78,7 @@ distclean::
++ rm -f pjproject/build.mak
++
++ pjproject/build.mak: pjproject/aconfigure
++- (cd pjproject && CFLAGS="-fPIC" ./configure --build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM) --disable-floating-point --disable-sound --disable-oss --disable-speex-aec --disable-l16-codec --disable-gsm-codec --disable-g722-codec --disable-g7221-codec --disable-speex-codec --disable-ilbc-codec --disable-g711-codec)
+++ (cd pjproject && CFLAGS="-fPIC" ./configure --build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM) --disable-floating-point --disable-sound --disable-oss --disable-speex-aec --disable-l16-codec --disable-gsm-codec --disable-g722-codec --disable-g7221-codec --disable-speex-codec --disable-ilbc-codec --disable-g711-codec --disable-opencore-amrnb --disable-video --disable-sdl --disable-ffmpeg --disable-v4l2)
++
++ ifneq ($(findstring $(MAKECMDGOALS),all),)
++ -include pjproject/build.mak
+diff --git a/feeds/telephony/net/asterisk-11.x/patches/010-asterisk-configure-undef-res-ninit.patch b/feeds/telephony/net/asterisk-11.x/patches/010-asterisk-configure-undef-res-ninit.patch
+new file mode 100644
+index 0000000..b8a6337
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x/patches/010-asterisk-configure-undef-res-ninit.patch
+@@ -0,0 +1,10 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -1111,7 +1111,6 @@ AC_LINK_IFELSE(
++ #include <resolv.h>],
++ [int foo = res_ninit(NULL);])],
++ AC_MSG_RESULT(yes)
++- AC_DEFINE([HAVE_RES_NINIT], 1, [Define to 1 if your system has the re-entrant resolver functions.])
++ AC_SEARCH_LIBS(res_9_ndestroy, resolv)
++ AC_MSG_CHECKING(for res_ndestroy)
++ AC_LINK_IFELSE(
+diff --git a/feeds/telephony/net/asterisk-11.x/patches/020-asterisk-enable-default-modules.patch b/feeds/telephony/net/asterisk-11.x/patches/020-asterisk-enable-default-modules.patch
+new file mode 100644
+index 0000000..fe38642
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x/patches/020-asterisk-enable-default-modules.patch
+@@ -0,0 +1,44 @@
++--- a/addons/chan_mobile.c
+++++ b/addons/chan_mobile.c
++@@ -27,7 +27,7 @@
++
++ /*** MODULEINFO
++ <depend>bluetooth</depend>
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <support_level>extended</support_level>
++ ***/
++
++--- a/addons/res_config_mysql.c
+++++ b/addons/res_config_mysql.c
++@@ -24,7 +24,7 @@
++
++ /*** MODULEINFO
++ <depend>mysqlclient</depend>
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <support_level>extended</support_level>
++ ***/
++
++--- a/res/res_pktccops.c
+++++ b/res/res_pktccops.c
++@@ -31,7 +31,7 @@
++ */
++
++ /*** MODULEINFO
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <support_level>extended</support_level>
++ ***/
++
++--- a/addons/chan_ooh323.c
+++++ b/addons/chan_ooh323.c
++@@ -18,7 +18,7 @@
++
++
++ /*** MODULEINFO
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <support_level>extended</support_level>
++ ***/
++
+diff --git a/feeds/telephony/net/asterisk-11.x/patches/021-asterisk-utils-enable-default-modules.patch b/feeds/telephony/net/asterisk-11.x/patches/021-asterisk-utils-enable-default-modules.patch
+new file mode 100644
+index 0000000..7c11286
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x/patches/021-asterisk-utils-enable-default-modules.patch
+@@ -0,0 +1,11 @@
++--- a/utils/utils.xml
+++++ b/utils/utils.xml
++@@ -41,7 +41,7 @@
++ <support_level>extended</support_level>
++ </member>
++ <member name="smsq">
++- <defaultenabled>no</defaultenabled>
+++ <defaultenabled>yes</defaultenabled>
++ <depend>popt</depend>
++ <support_level>extended</support_level>
++ </member>
+diff --git a/feeds/telephony/net/asterisk-11.x/patches/030-GNU-GLOB-exts-only-on-glibc.patch b/feeds/telephony/net/asterisk-11.x/patches/030-GNU-GLOB-exts-only-on-glibc.patch
+new file mode 100644
+index 0000000..bf1ffdf
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x/patches/030-GNU-GLOB-exts-only-on-glibc.patch
+@@ -0,0 +1,22 @@
++--- a/res/ael/ael.flex
+++++ b/res/ael/ael.flex
++@@ -595,7 +595,7 @@ includes { STORE_POS; return KW_INCLUDES
++ snprintf(fnamebuf2,sizeof(fnamebuf2), "%s/%s", (char *)ast_config_AST_CONFIG_DIR, fnamebuf);
++ ast_copy_string(fnamebuf,fnamebuf2,sizeof(fnamebuf));
++ }
++-#ifdef SOLARIS
+++#if !defined(HAVE_GLOB_NOMAGIC) || !defined(HAVE_GLOB_BRACE) || defined(DEBUG_NONGNU)
++ glob_ret = glob(fnamebuf, GLOB_NOCHECK, NULL, &globbuf);
++ #else
++ glob_ret = glob(fnamebuf, GLOB_NOMAGIC|GLOB_BRACE, NULL, &globbuf);
++--- a/res/ael/ael_lex.c
+++++ b/res/ael/ael_lex.c
++@@ -1976,7 +1967,7 @@ YY_RULE_SETUP
++ snprintf(fnamebuf2,sizeof(fnamebuf2), "%s/%s", (char *)ast_config_AST_CONFIG_DIR, fnamebuf);
++ ast_copy_string(fnamebuf,fnamebuf2,sizeof(fnamebuf));
++ }
++-#ifdef SOLARIS
+++#if !defined(HAVE_GLOB_NOMAGIC) || !defined(HAVE_GLOB_BRACE) || defined(DEBUG_NONGNU)
++ glob_ret = glob(fnamebuf, GLOB_NOCHECK, NULL, &globbuf);
++ #else
++ glob_ret = glob(fnamebuf, GLOB_NOMAGIC|GLOB_BRACE, NULL, &globbuf);
+diff --git a/feeds/telephony/net/asterisk-11.x/patches/035-pjproject-non-gnu-mutex-type.patch b/feeds/telephony/net/asterisk-11.x/patches/035-pjproject-non-gnu-mutex-type.patch
+new file mode 100644
+index 0000000..7a70858
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-11.x/patches/035-pjproject-non-gnu-mutex-type.patch
+@@ -0,0 +1,26 @@
++Index: asterisk-11.18.0/res/pjproject/pjlib/src/pj/os_core_unix.c
++===================================================================
++--- asterisk-11.18.0.orig/res/pjproject/pjlib/src/pj/os_core_unix.c
+++++ asterisk-11.18.0/res/pjproject/pjlib/src/pj/os_core_unix.c
++@@ -1091,7 +1091,7 @@ static pj_status_t init_mutex(pj_mutex_t
++ return PJ_RETURN_OS_ERROR(rc);
++
++ if (type == PJ_MUTEX_SIMPLE) {
++-#if (defined(PJ_LINUX) && PJ_LINUX!=0) || \
+++#if (defined(PJ_LINUX) && PJ_LINUX!=0 && defined(__GLIBC__)) || \
++ defined(PJ_HAS_PTHREAD_MUTEXATTR_SETTYPE)
++ rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_FAST_NP);
++ #elif (defined(PJ_RTEMS) && PJ_RTEMS!=0) || \
++@@ -1101,10 +1101,10 @@ static pj_status_t init_mutex(pj_mutex_t
++ rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);
++ #endif
++ } else {
++-#if (defined(PJ_LINUX) && PJ_LINUX!=0) || \
+++#if (defined(PJ_LINUX) && PJ_LINUX!=0 && defined(__GLIBC__)) || \
++ defined(PJ_HAS_PTHREAD_MUTEXATTR_SETTYPE)
++ rc = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
++-#elif (defined(PJ_RTEMS) && PJ_RTEMS!=0) || \
+++#elif (defined(PJ_RTEMS) && PJ_RTEMS!=0 && defined(__GLIBC__)) || \
++ defined(PJ_PTHREAD_MUTEXATTR_T_HAS_RECURSIVE)
++ // Phil Torre <ptorre@zetron.com>:
++ // The RTEMS implementation of POSIX mutexes doesn't include
+diff --git a/feeds/telephony/net/asterisk-13.x/Makefile b/feeds/telephony/net/asterisk-13.x/Makefile
+new file mode 100644
+index 0000000..05a3583
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-13.x/Makefile
+@@ -0,0 +1,400 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++# Copyright (C) 2015 Cesnet, z.s.p.o.
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=asterisk13
++PKG_VERSION:=13.6.0
++PKG_RELEASE:=1
++
++PKG_SOURCE:=asterisk-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://downloads.asterisk.org/pub/telephony/asterisk/releases/
++PKG_MD5SUM:=66355aec4336c068f25e7df739786e72
++
++PKG_BUILD_DIR=$(BUILD_DIR)/asterisk-$(PKG_VERSION)
++PKG_BUILD_DEPENDS:=libxml2/host
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING LICENSE
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/asterisk13/install/module
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/*$(2).so* $(1)/usr/lib/asterisk/modules/
++endef
++
++define Package/asterisk13/install/conffile
++ $(INSTALL_DIR) $(1)/etc/asterisk
++ $(CP) $(PKG_INSTALL_DIR)/etc/asterisk/$(2) $(1)/etc/asterisk/
++endef
++
++define Package/asterisk13/install/lib
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/$(2).so* $(1)/usr/lib/
++endef
++
++define Package/asterisk13/install/sbin
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/$(2) $(1)/usr/sbin/
++endef
++
++define Package/asterisk13/install/sounds
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/$(2) $(1)/usr/lib/asterisk/sounds/
++endef
++
++define BuildAsterisk13Module
++ define Package/asterisk13-$(1)
++ $$(call Package/asterisk13/Default)
++ TITLE:=$(2) support
++ DEPENDS:= asterisk13 $(patsubst +%,+PACKAGE_asterisk13-$(1):%,$(4))
++ endef
++
++ define Package/asterisk13-$(1)/conffiles
++$(foreach c,$(5),/etc/asterisk/$(c))
++ endef
++
++ define Package/asterisk13-$(1)/description
++This package provides support for '$(3)' in Asterisk.
++ endef
++
++ define Package/asterisk13-$(1)/install
++$(foreach c,$(5),$(call Package/asterisk13/install/conffile,$$(1),$(c));)
++$(foreach m,$(6),$(call Package/asterisk13/install/module,$$(1),$(m));)
++$(foreach s,$(7),$(call Package/asterisk13/install/sounds,$$(1),$(s));)
++$(foreach b,$(8),$(call Package/asterisk13/install/sbin,$$(1),$(b));)
++ endef
++
++ $$(eval $$(call BuildPackage,asterisk13-$(1)))
++endef
++
++define Package/asterisk13/Default
++ SUBMENU:=Telephony
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://www.asterisk.org/
++endef
++
++define Package/asterisk13/Default/description
++ Asterisk is a complete PBX in software. It provides all of the features
++ you would expect from a PBX and more. Asterisk does voice over IP in three
++ protocols, and can interoperate with almost all standards-based telephony
++ equipment using relatively inexpensive hardware.
++endef
++
++define Package/asterisk13
++$(call Package/asterisk13/Default)
++ TITLE:=Complete open source PBX, v$(PKG_VERSION)
++ MENU:=1
++ DEPENDS:=+jansson +libncurses +libopenssl +libpopt +libsqlite3 +libstdcpp +libuuid +libxml2 +libxslt +zlib
++endef
++
++define Package/asterisk13/description
++$(call Package/asterisk13/Default/description)
++endef
++
++define Package/asterisk13/conffiles
++/etc/asterisk/asterisk.conf
++/etc/asterisk/acl.conf
++/etc/asterisk/ccss.conf
++/etc/asterisk/modules.conf
++/etc/asterisk/extconfig.conf
++/etc/asterisk/extensions.conf
++/etc/asterisk/features.conf
++/etc/asterisk/indications.conf
++/etc/asterisk/logger.conf
++/etc/asterisk/manager.conf
++/etc/asterisk/modules.conf
++/etc/asterisk/res_config_sqlite3.conf
++/etc/asterisk/rtp.conf
++/etc/asterisk/udptl.conf
++/etc/asterisk/users.conf
++/etc/default/asterisk
++/etc/init.d/asterisk
++endef
++
++AST_CFG_FILES:= \
++ asterisk.conf acl.conf ccss.conf extconfig.conf \
++ extensions.conf features.conf indications.conf \
++ logger.conf manager.conf modules.conf udptl.conf \
++ users.conf res_config_sqlite3.conf
++
++AST_EMB_MODULES:=\
++ app_dial app_echo app_macro app_playback \
++ func_callerid func_logic func_strings func_timeout \
++ pbx_config res_crypto
++
++define Package/asterisk13/install
++$(call Package/asterisk13/install/lib,$(1),libasteriskssl)
++$(call Package/asterisk13/install/sbin,$(1),asterisk)
++$(call Package/asterisk13/install/sbin,$(1),safe_asterisk)
++$(call Package/asterisk13/install/sbin,$(1),astgenkey)
++$(foreach m,$(AST_CFG_FILES),$(call Package/asterisk13/install/conffile,$(1),$(m));)
++$(foreach m,$(AST_EMB_MODULES),$(call Package/asterisk13/install/module,$(1),$(m));)
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/
++ $(INSTALL_DIR) $(1)/etc/default
++ $(INSTALL_DATA) ./files/asterisk.default $(1)/etc/default/asterisk
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/asterisk.init $(1)/etc/init.d/asterisk
++endef
++
++define Package/asterisk13-sounds
++$(call Package/asterisk13/Default)
++ TITLE:=Sounds support
++ DEPENDS:=asterisk13
++endef
++
++define Package/asterisk13-sounds/description
++This package provides the sound-files for Asterisk-13.
++endef
++
++define Package/asterisk13-sounds/install
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/sounds/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/asterisk/sounds/en/* $(1)/usr/lib/asterisk/sounds/
++ rm -f $(1)/usr/lib/asterisk/sounds/vm-*
++endef
++
++ifneq ($(SDK)$(CONFIG_PACKAGE_asterisk13-chan-dahdi),)
++ CONFIGURE_ARGS+= \
++ --with-dahdi="$(STAGING_DIR)/usr" \
++ --with-pri="$(STAGING_DIR)/usr" \
++ --with-tonezone="$(STAGING_DIR)/usr"
++else
++ CONFIGURE_ARGS+= \
++ --without-dahdi \
++ --without-pri \
++ --without-tonezone
++endif
++
++TARGET_LDFLAGS+= \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-pbx-lua),-ldl -lcrypt)
++
++EXTRA_CFLAGS+=$(TARGET_CPPFLAGS)
++EXTRA_LDFLAGS+=$(TARGET_LDFLAGS) -Wl,-rpath-link,$(STAGING_DIR)/usr/lib
++
++CONFIGURE_ARGS+= \
++ --without-execinfo \
++ --without-bluetooth \
++ --without-cap \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-curl),--with-libcurl="$(STAGING_DIR)/usr",--without-curl) \
++ --without-curses \
++ --with-gsm=internal \
++ --without-gtk2 \
++ --with-ilbc=internal \
++ --without-isdnnet \
++ --without-misdn \
++ --without-nbs \
++ --without-neon \
++ --without-neon29 \
++ --with-libxml2 \
++ --with-ncurses="$(STAGING_DIR)/usr" \
++ --without-netsnmp \
++ --without-newt \
++ --without-ogg \
++ --without-osptk \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-pbx-lua),--with-lua="$(STAGING_DIR)/usr",--without-lua) \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-pgsql),--with-postgres="$(STAGING_DIR)/usr",--without-postgres) \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-pjsip),--with-pjproject,--without-pjproject) \
++ --with-popt="$(STAGING_DIR)/usr" \
++ --without-pwlib \
++ --without-radius \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-res-fax-spandsp),--with-spandsp="$(STAGING_DIR)/usr",--without-spandsp) \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-res-xmpp),--with-iksemel="$(STAGING_DIR)/usr",--without-iksemel) \
++ --without-sdl \
++ --without-sqlite \
++ --with-sqlite3="$(STAGING_DIR)/usr" \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-res-srtp),--with-srtp="$(STAGING_DIR)/usr",--without-srtp) \
++ --without-suppserv \
++ --without-tds \
++ --without-termcap \
++ --without-tinfo \
++ --with-uuid="$(STAGING_DIR)/usr" \
++ --without-vorbis \
++ --without-vpb \
++ --with-z="$(STAGING_DIR)/usr" \
++ --with-sounds-cache="$(DL_DIR)" \
++ --enable-xmldoc
++
++CONFIGURE_VARS += \
++ ac_cv_path_ac_pt_CONFIG_LIBXML2=$(STAGING_DIR)/host/bin/xml2-config
++
++AST_MENUSELECT_OPTS = \
++ --without-newt \
++ --without-curses \
++ --with-ncurses="$(STAGING_DIR_HOST)/usr" \
++ --with-libxml2="$(STAGING_DIR_HOST)/usr"
++
++define Build/Configure
++ (cd $(PKG_BUILD_DIR); \
++ ./bootstrap.sh; \
++ );
++ $(call Build/Configure/Default,,$(SITE_VARS))
++ (cd $(PKG_BUILD_DIR)/menuselect; \
++ ./bootstrap.sh; \
++ ./configure \
++ $(HOST_CONFIGURE_ARGS) \
++ $(AST_MENUSELECT_OPTS) \
++ LDFLAGS="$(HOST_LDFLAGS) -lxml2" \
++ CFLAGS="$(HOST_CFLAGS) -I$(STAGING_DIR_HOST)/include/libxml2" \
++ );
++endef
++
++define Build/Compile
++ $(MAKE) -C "$(PKG_BUILD_DIR)/menuselect" \
++ CFLAGS="$(HOST_CFLAGS) -I$(STAGING_DIR_HOST)/include/libxml2" \
++ LDFLAGS="$(HOST_LDFLAGS) -lxml2"
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ include/asterisk/version.h \
++ include/asterisk/buildopts.h defaults.h \
++ makeopts.embed_rules
++ ASTCFLAGS="$(EXTRA_CFLAGS) -DLOW_MEMORY"
++ ASTLDFLAGS="$(EXTRA_LDFLAGS)"
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ ASTVARLIBDIR="/usr/lib/asterisk" \
++ ASTDATADIR="/usr/lib/asterisk" \
++ ASTKEYDIR="/usr/lib/asterisk" \
++ ASTDBDIR="/usr/lib/asterisk" \
++ NOISY_BUILD="yes" \
++ DEBUG="" \
++ OPTIMIZE="" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install samples
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(1)/usr/include/asterisk-13/include/asterisk/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk/*.h $(1)/usr/include/asterisk-13/include/asterisk/
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/asterisk.h $(1)/usr/include/asterisk-13/include/
++endef
++
++$(eval $(call BuildPackage,asterisk13))
++$(eval $(call BuildPackage,asterisk13-sounds))
++
++################################
++# AST modules
++# Params:
++# 1 - Package subname
++# 2 - Package title
++# 3 - Module description
++# 4 - Module dependencies
++# 5 - conf files
++# 6 - module files
++# 7 - sound files
++# 8 - binary files
++################################
++#$(eval $(call BuildAsterisk13Module,subname,title,module description,module dependencies,conf files,module files,sound files,binary files))
++
++$(eval $(call BuildAsterisk13Module,app-alarmreceiver,Alarm receiver,Central Station Alarm receiver for Ademco Contact ID,,,app_alarmreceiver,,))
++$(eval $(call BuildAsterisk13Module,app-authenticate,Authenticate commands,Execute arbitrary authenticate commands,,,app_authenticate,,))
++$(eval $(call BuildAsterisk13Module,app-chanisavail,Channel availability check,support for checking if a channel is available,,,app_chanisavail,,))
++$(eval $(call BuildAsterisk13Module,app-chanspy,Channel listen in,support for listening in on any channel,,,app_chanspy,,))
++$(eval $(call BuildAsterisk13Module,app-confbridge,ConfBridge,Software bridge for multi-party audio conferencing,+asterisk13-bridge-builtin-features +asterisk13-bridge-simple +asterisk13-bridge-softmix,confbridge.conf,app_confbridge,,))
++$(eval $(call BuildAsterisk13Module,app-dahdiras,Execute an ISDN RAS,support for executing an ISDN RAS using DAHDI,+asterisk13-chan-dahdi,,app_dahdiras,,))
++$(eval $(call BuildAsterisk13Module,app-directed_pickup,Directed call pickup,support for directed call pickup,,,app_directed_pickup,,))
++$(eval $(call BuildAsterisk13Module,app-disa,Direct Inward System Access,Direct Inward System Access,,,app_disa,,))
++$(eval $(call BuildAsterisk13Module,app-exec,Exec application,support for application execution,,,app_exec,,))
++$(eval $(call BuildAsterisk13Module,app-minivm,Minimal voicemail system,a voicemail system in small building blocks working together based on the Comedian Mail voicemail,,extensions_minivm.conf minivm.conf,app_minivm,,))
++$(eval $(call BuildAsterisk13Module,app-mixmonitor,Record a call and mix the audio,record a call and mix the audio during the recording,,,app_mixmonitor,,))
++$(eval $(call BuildAsterisk13Module,app-originate,Originate a call,originating an outbound call and connecting it to a specified extension or application,,,app_originate,,))
++$(eval $(call BuildAsterisk13Module,app-playtones,Playtones application,play a tone list,,,app_playtones,,))
++$(eval $(call BuildAsterisk13Module,app-read,Variable read,a trivial application to read a variable,,,app_read,,))
++$(eval $(call BuildAsterisk13Module,app-readexten,Extension to variable,a trivial application to read an extension into a variable,,,app_readexten,,))
++$(eval $(call BuildAsterisk13Module,app-record,Record sound file,to record a sound file,,,app_record,,))
++$(eval $(call BuildAsterisk13Module,app-sayunixtime,Say Unix time,an application to say Unix time,,,app_sayunixtime,,))
++$(eval $(call BuildAsterisk13Module,app-senddtmf,Send DTMF digits,Sends arbitrary DTMF digits,,,app_senddtmf,,))
++$(eval $(call BuildAsterisk13Module,app-sms,SMS,SMS support (ETSI ES 201 912 protocol 1),+libpopt +libstdcpp,,app_sms,,))
++$(eval $(call BuildAsterisk13Module,app-stack,Stack applications,Stack applications Gosub Return etc.,+asterisk13-res-agi,,app_stack,,))
++$(eval $(call BuildAsterisk13Module,app-system,System exec,support for executing system commands,,,app_system,,))
++$(eval $(call BuildAsterisk13Module,app-talkdetect,File playback with audio detect,for file playback with audio detect,,,app_talkdetect,,))
++$(eval $(call BuildAsterisk13Module,app-verbose,Verbose logging,Verbose logging application,,,app_verbose,,))
++$(eval $(call BuildAsterisk13Module,app-waituntil,Sleep,support sleeping until the given epoch,,,app_waituntil,,))
++$(eval $(call BuildAsterisk13Module,app-while,While loop,a while loop implementation,,,app_while,,))
++$(eval $(call BuildAsterisk13Module,bridge-builtin-features,Bridging features,built in bridging features,,,bridge_builtin_features))
++$(eval $(call BuildAsterisk13Module,bridge-builtin-interval-features,Built in bridging interval features,built in bridging interval features,,,bridge_builtin_interval_features))
++$(eval $(call BuildAsterisk13Module,bridge-holding,Bridging for storing channels in a bridge,bridging technology for storing channels in a bridge,,,bridge_holding))
++$(eval $(call BuildAsterisk13Module,bridge-native-rtp,Native RTP bridging technology module,native RTP bridging technology module,,,bridge_native_rtp))
++$(eval $(call BuildAsterisk13Module,bridge-simple,Simple two channel bridging module,simple two channel bridging module,,,bridge_simple))
++$(eval $(call BuildAsterisk13Module,bridge-softmix,Multi-party software based channel mixing,multi-party software based channel mixing,,,bridge_softmix))
++$(eval $(call BuildAsterisk13Module,cdr,Provides CDR,Call Detail Record,,cdr.conf cdr_custom.conf cdr_manager.conf cdr_syslog.conf,app_cdr app_forkcdr cdr_custom cdr_manager cdr_syslog func_cdr,,))
++$(eval $(call BuildAsterisk13Module,cdr-csv,Provides CDR CSV,Call Detail Record with CSV support,,,cdr_csv,,))
++$(eval $(call BuildAsterisk13Module,cdr-sqlite3,Provides CDR SQLITE3,Call Detail Record with SQLITE3 support,libsqlite3,,cdr_sqlite3_custom,,))
++$(eval $(call BuildAsterisk13Module,chan-dahdi,DAHDI channel,DAHDI channel support,+dahdi-tools-libtonezone +kmod-dahdi +libpri,chan_dahdi.conf,chan_dahdi,,))
++$(eval $(call BuildAsterisk13Module,chan-iax2,IAX2 channel,IAX support,+asterisk13-res-timing-timerfd,iax.conf iaxprov.conf,chan_iax2,,))
++$(eval $(call BuildAsterisk13Module,chan-sip,SIP channel,the channel chan_sip,+asterisk13-app-confbridge,sip.conf sip_notify.conf,chan_sip,,))
++$(eval $(call BuildAsterisk13Module,chan-skinny,Skinny channel,the channel chan_skinny,,skinny.conf,chan_skinny,,))
++$(eval $(call BuildAsterisk13Module,chan-unistim,Unistim channel,channel driver for the UNISTIM (Unified Networks IP Stimulus) protocol,,unistim.conf,chan_unistim,,))
++$(eval $(call BuildAsterisk13Module,codec-a-mu,Alaw to ulaw translation,translation between alaw and ulaw codecs,,,codec_a_mu,,))
++$(eval $(call BuildAsterisk13Module,codec-adpcm,ADPCM text,ADPCM text ,,,codec_adpcm,,))
++$(eval $(call BuildAsterisk13Module,codec-alaw,Signed linear to alaw translation,translation between signed linear and alaw codecs,,,codec_alaw,,))
++$(eval $(call BuildAsterisk13Module,codec-dahdi,DAHDI codec,DAHDI native transcoding support,+asterisk13-chan-dahdi,,codec_dahdi,,))
++$(eval $(call BuildAsterisk13Module,codec-g722,G.722,a high bit rate 48/56/64Kbps ITU standard codec,,,codec_g722,,))
++$(eval $(call BuildAsterisk13Module,codec-g726,Signed linear to G.726 translation,translation between signed linear and ITU G.726-32kbps codecs,,,codec_g726,,))
++$(eval $(call BuildAsterisk13Module,codec-gsm,linear to GSM translation,translate between signed linear and GSM,,,codec_gsm,,))
++$(eval $(call BuildAsterisk13Module,codec-ilbc,linear to ILBC translation,translate between signed linear and ILBC,,,codec_ilbc,,))
++$(eval $(call BuildAsterisk13Module,codec-lpc10,Linear to LPC10 translation,translate between signed linear and LPC10,,,codec_lpc10,,))
++$(eval $(call BuildAsterisk13Module,codec-resample,resample sLinear audio,resample sLinear audio,,,codec_resample,,))
++$(eval $(call BuildAsterisk13Module,codec-ulaw,Signed linear to ulaw translation,translation between signed linear and ulaw codecs,,,codec_ulaw,,))
++$(eval $(call BuildAsterisk13Module,curl,CURL,CURL support,+libcurl,,func_curl res_curl,,))
++$(eval $(call BuildAsterisk13Module,format-g726,G.726,support for headerless G.726 16/24/32/40kbps data format,,,format_g726,,))
++$(eval $(call BuildAsterisk13Module,format-g729,G.729,support for raw headerless G729 data,,,format_g729,,))
++$(eval $(call BuildAsterisk13Module,format-gsm,GSM format,support for GSM format,,,format_gsm,,))
++$(eval $(call BuildAsterisk13Module,format-h263,H263 format,support for H264 format,,,format_h263,,))
++$(eval $(call BuildAsterisk13Module,format-h264,H264 format,support for H264 format,,,format_h264,,))
++$(eval $(call BuildAsterisk13Module,format-ilbc,ILBC format,support for ILBC format,,,format_ilbc,,))
++$(eval $(call BuildAsterisk13Module,format-pcm,PCM format,support for PCM format,,,format_pcm,,))
++$(eval $(call BuildAsterisk13Module,format-sln,Raw slinear format,support for raw slinear format,,,format_sln,,))
++$(eval $(call BuildAsterisk13Module,format-vox,VOX format,support for ADPCM vox format,,,format_vox,,))
++$(eval $(call BuildAsterisk13Module,format-wav,WAV format (8000hz Signed Linear),support for proprietary Microsoft WAV format (8000hz Signed Linear),,,format_wav,,))
++$(eval $(call BuildAsterisk13Module,format-wav-gsm,WAV format (Proprietary GSM),support for proprietary Microsoft WAV format (Proprietary GSM),,,format_wav_gsm,,))
++$(eval $(call BuildAsterisk13Module,func-base64,base64 support,support of base64 function,,,func_base64,,))
++$(eval $(call BuildAsterisk13Module,func-blacklist,Blacklist on callerid,looking up the callerid number and see if it is blacklisted,,,func_blacklist,,))
++$(eval $(call BuildAsterisk13Module,func-channel,Channel info,Channel info dialplan function,,,func_channel,,))
++$(eval $(call BuildAsterisk13Module,func-cut,CUT function,CUT function,,,func_cut,,))
++$(eval $(call BuildAsterisk13Module,func-db,Database interaction,functions for interaction with the database,,,func_db app_db,))
++$(eval $(call BuildAsterisk13Module,func-devstate,Blinky lights control,functions for manually controlled blinky lights,,,func_devstate,,))
++$(eval $(call BuildAsterisk13Module,func-enum,ENUM,ENUM,,enum.conf,func_enum,))
++$(eval $(call BuildAsterisk13Module,func-env,Environment functions,Environment dialplan functions,,,func_env,))
++$(eval $(call BuildAsterisk13Module,func-extstate,Hinted extension state,retrieving the state of a hinted extension for dialplan control,,,func_extstate,,))
++$(eval $(call BuildAsterisk13Module,func-global,Global variable,global variable dialplan functions,,,func_global,,))
++$(eval $(call BuildAsterisk13Module,func-groupcount,Group count,for counting number of channels in the specified group,,,func_groupcount,,))
++$(eval $(call BuildAsterisk13Module,func-math,Math functions,Math functions,,,func_math,))
++$(eval $(call BuildAsterisk13Module,func-module,Simple module check function,Simple module check function,,,func_module,))
++$(eval $(call BuildAsterisk13Module,func-realtime,realtime,the realtime dialplan function,,,func_realtime,,))
++$(eval $(call BuildAsterisk13Module,func-shell,Shell,support for shell execution,,,func_shell,,))
++$(eval $(call BuildAsterisk13Module,func-uri,URI encoding and decoding,Encodes and decodes URI-safe strings,,,func_uri,,))
++$(eval $(call BuildAsterisk13Module,func-vmcount,vmcount dialplan,a vmcount dialplan function,,,func_vmcount,,))
++$(eval $(call BuildAsterisk13Module,odbc,ODBC,ODBC support,+libpthread +libc +unixodbc,cdr_adaptive_odbc.conf cdr_odbc.conf cel_odbc.conf func_odbc.conf res_odbc.conf,cdr_adaptive_odbc cdr_odbc cel_odbc func_odbc res_config_odbc res_odbc,,))
++$(eval $(call BuildAsterisk13Module,pbx-ael,Asterisk Extension Logic,support for symbolic Asterisk Extension Logic,,extensions.ael,pbx_ael,,))
++$(eval $(call BuildAsterisk13Module,pbx-dundi,Dundi,provides Dundi Lookup service for Asterisk,,dundi.conf,pbx_dundi,,))
++$(eval $(call BuildAsterisk13Module,pbx-realtime,Realtime Switch,realtime switch support,,,pbx_realtime,,))
++$(eval $(call BuildAsterisk13Module,pbx-spool,Call Spool,outgoing call spool support,,,pbx_spool,,))
++$(eval $(call BuildAsterisk13Module,pgsql,PostgreSQL,PostgreSQL support,+libpq,cel_pgsql.conf cdr_pgsql.conf res_pgsql.conf,cel_pgsql cdr_pgsql res_config_pgsql,,))
++$(eval $(call BuildAsterisk13Module,pjsip,pjsip channel,the channel pjsip,+asterisk13-res-sorcery +libpjsip +libpjmedia +libpjnath +libpjsip-simple +libpjsip-ua +libpjsua +libpjsua2,pjsip.conf pjsip_notify.conf,func_pjsip_endpoint chan_pjsip res_pjsip_acl res_pjsip_authenticator_digest res_pjsip_caller_id res_pjsip_dialog_info_body_generator res_pjsip_diversion res_pjsip_dtmf_info res_pjsip_endpoint_identifier_anonymous res_pjsip_endpoint_identifier_ip res_pjsip_endpoint_identifier_user res_pjsip_exten_state res_pjsip_header_funcs res_pjsip_log_forwarder res_pjsip_logger res_pjsip_messaging res_pjsip_multihomed res_pjsip_mwi_body_generator res_pjsip_mwi res_pjsip_nat res_pjsip_notify res_pjsip_one_touch_record_info res_pjsip_outbound_authenticator_digest res_pjsip_outbound_publish res_pjsip_outbound_registration res_pjsip_path res_pjsip_pidf_body_generator res_pjsip_pidf_digium_body_supplement res_pjsip_pidf_eyebeam_body_supplement res_pjsip_publish_asterisk res_pjsip_pubsub res_pjsip_refer res_pjsip_registrar_expire res_pjsip_registrar res_pjsip_rfc3326 res_pjsip_sdp_rtp res_pjsip_send_to_voicemail res_pjsip_session res_pjsip res_pjsip_transport_websocket res_pjsip_t38 res_pjsip_xpidf_body_generator,,))
++$(eval $(call BuildAsterisk13Module,res-adsi,Provide ADSI,Analog Display Services Interface capability,,,res_adsi,,))
++$(eval $(call BuildAsterisk13Module,res-ael-share,Shareable AEL code,support for shareable AEL code mainly between internal and external modules,,,res_ael_share,,))
++$(eval $(call BuildAsterisk13Module,res-agi,Asterisk Gateway Interface,Support for the Asterisk Gateway Interface extension,,,res_agi,,))
++$(eval $(call BuildAsterisk13Module,res-calendar,Calendaring API,Calendaring support (ICal and Google Calendar),,calendar.conf,res_calendar,,))
++$(eval $(call BuildAsterisk13Module,res-clioriginate,Calls via CLI,Originate calls via the CLI,,,res_clioriginate,,))
++$(eval $(call BuildAsterisk13Module,res-fax,FAX modules,Generic FAX resource for FAX technology resource modules,+asterisk13-res-timing-pthread,udptl.conf res_fax.conf,res_fax,,))
++$(eval $(call BuildAsterisk13Module,res-http-websocket,HTTP websocket support,,,,res_http_websocket,,))
++$(eval $(call BuildAsterisk13Module,res-monitor,Provide Monitor,Cryptographic Signature capability,,,res_monitor,,))
++$(eval $(call BuildAsterisk13Module,res-musiconhold,MOH,Music On Hold support,,musiconhold.conf,res_musiconhold,,))
++$(eval $(call BuildAsterisk13Module,res-parking,Phone Parking,Phone Parking application,,res_parking.conf,res_parking,,))
++$(eval $(call BuildAsterisk13Module,res-phoneprov,Phone Provisioning,Phone provisioning application for the asterisk internal http server,,phoneprov.conf,res_phoneprov,,))
++$(eval $(call BuildAsterisk13Module,res-realtime,Realtime,Realtime Interface,,,res_realtime,,))
++$(eval $(call BuildAsterisk13Module,res-rtp-asterisk,RTP stack,,+libpjsip +libpjmedia +libpjnath +libpjsip-simple +libpjsip-ua +libpjsua +libpjsua2,rtp.conf,res_rtp_asterisk,,))
++$(eval $(call BuildAsterisk13Module,res-rtp-multicast,RTP multicast engine,,,,res_rtp_multicast,,))
++$(eval $(call BuildAsterisk13Module,res-smdi,Provide SMDI,Simple Message Desk Interface capability,,smdi.conf,res_smdi,,))
++$(eval $(call BuildAsterisk13Module,res-sorcery,Sorcery data layer,,,,res_sorcery_astdb res_sorcery_config res_sorcery_memory res_sorcery_realtime,,))
++$(eval $(call BuildAsterisk13Module,res-srtp,SRTP Support,Secure RTP connection,+libsrtp,,res_srtp,,))
++$(eval $(call BuildAsterisk13Module,res-timing-dahdi,DAHDI Timing Interface,,+asterisk13-chan-dahdi,,res_timing_dahdi,,))
++$(eval $(call BuildAsterisk13Module,res-timing-pthread,pthread Timing Interface,,,,res_timing_pthread,,))
++$(eval $(call BuildAsterisk13Module,res-timing-timerfd,Timerfd Timing Interface,,,,res_timing_timerfd,,))
++$(eval $(call BuildAsterisk13Module,voicemail,Voicemail,voicemail related modules,+asterisk13-res-adsi +asterisk13-res-smdi,voicemail.conf,app_voicemail,vm-*,))
+diff --git a/feeds/telephony/net/asterisk-13.x/files/asterisk.default b/feeds/telephony/net/asterisk-13.x/files/asterisk.default
+new file mode 100644
+index 0000000..9d046c4
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-13.x/files/asterisk.default
+@@ -0,0 +1,4 @@
++## startup options for /etc/init.d/asterisk
++
++ENABLE_ASTERISK="yes"
++OPTIONS=""
+diff --git a/feeds/telephony/net/asterisk-13.x/files/asterisk.init b/feeds/telephony/net/asterisk-13.x/files/asterisk.init
+new file mode 100644
+index 0000000..78e8913
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-13.x/files/asterisk.init
+@@ -0,0 +1,34 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=99
++APP=asterisk
++OPTIONS=
++DEST=
++DEFAULT=$DEST/etc/default/$APP
++BIN_FILE=$DEST/usr/sbin/$APP
++PID_FILE=$DEST/var/run/$APP/$APP.pid
++
++start() {
++ [ -f $DEFAULT ] && . $DEFAULT
++ [ -d $DEST/var/run/asterisk ] || mkdir -p $DEST/var/run/asterisk
++ [ -d $DEST/var/log/asterisk ] || mkdir -p $DEST/var/log/asterisk
++ [ -d $DEST/var/spool/asterisk ] || mkdir -p $DEST/var/spool/asterisk
++ [ -d $DEST/var/lib ] || mkdir -p $DEST/var/lib
++ [ -h $DEST/var/lib/asterisk ] || ln -s /usr/lib/asterisk /var/lib/asterisk
++ [ -d $DEST/var/lib/asterisk/keys ] || mkdir -p $DEST/var/lib/asterisk/keys
++ [ -d $DEST/var/log/asterisk/cdr-csv ] || mkdir -p $DEST/var/log/asterisk/cdr-csv
++
++ SERVICE_PID_FILE="/var/run/asterisk/asterisk.pid" \
++ service_start $BIN_FILE $OPTIONS
++}
++
++stop() {
++ SERVICE_PID_FILE="/var/run/asterisk/asterisk.pid" \
++ service_stop $BIN_FILE
++}
++
++reload() {
++ SERVICE_PID_FILE="/var/run/asterisk/asterisk.pid" \
++ service_reload $BIN_FILE
++}
+diff --git a/feeds/telephony/net/asterisk-13.x/patches/001-disable-semaphores-check.patch b/feeds/telephony/net/asterisk-13.x/patches/001-disable-semaphores-check.patch
+new file mode 100644
+index 0000000..f946b56
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-13.x/patches/001-disable-semaphores-check.patch
+@@ -0,0 +1,22 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -900,19 +900,6 @@ AC_LINK_IFELSE(
++ ]
++ )
++
++-# Some platforms define sem_init(), but only support sem_open(). joyous.
++-AC_MSG_CHECKING(for working unnamed semaphores)
++-AC_RUN_IFELSE(
++- [AC_LANG_PROGRAM([#include <semaphore.h>],
++- [sem_t sem; return sem_init(&sem, 0, 0);])],
++- AC_MSG_RESULT(yes)
++- AC_DEFINE([HAS_WORKING_SEMAPHORE], 1, [Define to 1 if anonymous semaphores work.]),
++- AC_MSG_RESULT(no),
++- AC_MSG_RESULT(cross-compile)
++- AC_MSG_NOTICE([WARNING: result yes guessed because of cross compilation])
++- AC_DEFINE([HAS_WORKING_SEMAPHORE], 1, [Define to 1 if anonymous semaphores work.])
++-)
++-
++ LIBS="$save_LIBS"
++ CFLAGS="$save_CFLAGS"
++ if test "${ac_cv_pthread_rwlock_timedwrlock}" = "yes"; then
+diff --git a/feeds/telephony/net/asterisk-13.x/patches/002-undef-res-ninit.patch b/feeds/telephony/net/asterisk-13.x/patches/002-undef-res-ninit.patch
+new file mode 100644
+index 0000000..42b4cbc
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-13.x/patches/002-undef-res-ninit.patch
+@@ -0,0 +1,10 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -1170,7 +1170,6 @@ AC_LINK_IFELSE(
++ #include <resolv.h>],
++ [int foo = res_ninit(NULL);])],
++ AC_MSG_RESULT(yes)
++- AC_DEFINE([HAVE_RES_NINIT], 1, [Define to 1 if your system has the re-entrant resolver functions.])
++ AC_SEARCH_LIBS(res_9_ndestroy, resolv)
++ AC_MSG_CHECKING(for res_ndestroy)
++ AC_LINK_IFELSE(
+diff --git a/feeds/telephony/net/asterisk-13.x/patches/003-disable-ast-xml-docs.patch b/feeds/telephony/net/asterisk-13.x/patches/003-disable-ast-xml-docs.patch
+new file mode 100644
+index 0000000..12b3f73
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-13.x/patches/003-disable-ast-xml-docs.patch
+@@ -0,0 +1,13 @@
++--- a/include/asterisk/xml.h
+++++ b/include/asterisk/xml.h
++@@ -246,10 +246,5 @@ struct ast_xml_node *ast_xml_xpath_get_f
++ */
++ struct ast_xml_xpath_results *ast_xml_query(struct ast_xml_doc *doc, const char *xpath_str);
++
++-/* Features using ast_xml_ */
++-#ifdef HAVE_LIBXML2
++-#define AST_XML_DOCS
++-#endif
++-
++ #endif /* _ASTERISK_XML_H */
++
+diff --git a/feeds/telephony/net/asterisk-13.x/patches/004-ifdef-missing-execinfo.patch b/feeds/telephony/net/asterisk-13.x/patches/004-ifdef-missing-execinfo.patch
+new file mode 100644
+index 0000000..264eb41
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-13.x/patches/004-ifdef-missing-execinfo.patch
+@@ -0,0 +1,101 @@
++--- a/include/asterisk/lock.h
+++++ b/include/asterisk/lock.h
++@@ -51,9 +51,11 @@
++ #include <pthread.h>
++ #include <time.h>
++ #include <sys/param.h>
+++#ifndef __UCLIBC__
++ #ifdef HAVE_BKTR
++ #include <execinfo.h>
++ #endif
+++#endif
++
++ #ifndef HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK
++ #include "asterisk/time.h"
++@@ -86,11 +88,15 @@
++ #define __AST_RWLOCK_INIT_VALUE {0}
++ #endif /* HAVE_PTHREAD_RWLOCK_INITIALIZER */
++
+++#ifndef __UCLIBC__
++ #ifdef HAVE_BKTR
++ #define AST_LOCK_TRACK_INIT_VALUE { { NULL }, { 0 }, 0, { NULL }, { 0 }, {{{ 0 }}}, PTHREAD_MUTEX_INIT_VALUE }
++ #else
++ #define AST_LOCK_TRACK_INIT_VALUE { { NULL }, { 0 }, 0, { NULL }, { 0 }, PTHREAD_MUTEX_INIT_VALUE }
++ #endif
+++#else
+++#define AST_LOCK_TRACK_INIT_VALUE { { NULL }, { 0 }, 0, { NULL }, { 0 }, PTHREAD_MUTEX_INIT_VALUE }
+++#endif
++
++ #define AST_MUTEX_INIT_VALUE { PTHREAD_MUTEX_INIT_VALUE, NULL, 1 }
++ #define AST_MUTEX_INIT_VALUE_NOTRACKING { PTHREAD_MUTEX_INIT_VALUE, NULL, 0 }
++@@ -114,9 +120,11 @@ struct ast_lock_track {
++ int reentrancy;
++ const char *func[AST_MAX_REENTRANCY];
++ pthread_t thread[AST_MAX_REENTRANCY];
+++#ifndef __UCLIBC__
++ #ifdef HAVE_BKTR
++ struct ast_bt backtrace[AST_MAX_REENTRANCY];
++ #endif
+++#endif
++ pthread_mutex_t reentr_mutex;
++ };
++
++@@ -241,6 +249,7 @@ enum ast_lock_type {
++ * on the lock. ast_mark_lock_acquired() will mark it as held by this thread.
++ */
++ #if !defined(LOW_MEMORY)
+++#ifndef HAVE_BKTR
++ #ifdef HAVE_BKTR
++ void ast_store_lock_info(enum ast_lock_type type, const char *filename,
++ int line_num, const char *func, const char *lock_name, void *lock_addr, struct ast_bt *bt);
++@@ -248,14 +257,22 @@ void ast_store_lock_info(enum ast_lock_t
++ void ast_store_lock_info(enum ast_lock_type type, const char *filename,
++ int line_num, const char *func, const char *lock_name, void *lock_addr);
++ #endif /* HAVE_BKTR */
+++#else
+++void ast_store_lock_info(enum ast_lock_type type, const char *filename,
+++ int line_num, const char *func, const char *lock_name, void *lock_addr);
+++#endif
++
++ #else
++
+++#ifndef __UCLIBC__
++ #ifdef HAVE_BKTR
++ #define ast_store_lock_info(I,DONT,CARE,ABOUT,THE,PARAMETERS,BUD)
++ #else
++ #define ast_store_lock_info(I,DONT,CARE,ABOUT,THE,PARAMETERS)
++ #endif /* HAVE_BKTR */
+++#else
+++#define ast_store_lock_info(I,DONT,CARE,ABOUT,THE,PARAMETERS)
+++#endif
++ #endif /* !defined(LOW_MEMORY) */
++
++ /*!
++@@ -283,19 +300,27 @@ void ast_mark_lock_failed(void *lock_add
++ * be removed from the current thread's lock info struct.
++ */
++ #if !defined(LOW_MEMORY)
+++#ifndef __UCLIBC__
++ #ifdef HAVE_BKTR
++ void ast_remove_lock_info(void *lock_addr, struct ast_bt *bt);
++ #else
++ void ast_remove_lock_info(void *lock_addr);
++ #endif /* HAVE_BKTR */
+++#else
+++void ast_remove_lock_info(void *lock_addr);
+++#endif
++ void ast_suspend_lock_info(void *lock_addr);
++ void ast_restore_lock_info(void *lock_addr);
++ #else
+++#ifndef __UCLIBC
++ #ifdef HAVE_BKTR
++ #define ast_remove_lock_info(ignore,me)
++ #else
++ #define ast_remove_lock_info(ignore)
++ #endif /* HAVE_BKTR */
+++#else
+++#define ast_remove_lock_info(ignore)
+++#endif
++ #define ast_suspend_lock_info(ignore);
++ #define ast_restore_lock_info(ignore);
++ #endif /* !defined(LOW_MEMORY) */
+diff --git a/feeds/telephony/net/asterisk-13.x/patches/030-GNU-GLOB-exts-only-on-glibc.patch b/feeds/telephony/net/asterisk-13.x/patches/030-GNU-GLOB-exts-only-on-glibc.patch
+new file mode 100644
+index 0000000..78447a5
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-13.x/patches/030-GNU-GLOB-exts-only-on-glibc.patch
+@@ -0,0 +1,22 @@
++--- a/res/ael/ael.flex
+++++ b/res/ael/ael.flex
++@@ -595,7 +595,7 @@ includes { STORE_POS; return KW_INCLUDES
++ snprintf(fnamebuf2,sizeof(fnamebuf2), "%s/%s", (char *)ast_config_AST_CONFIG_DIR, fnamebuf);
++ ast_copy_string(fnamebuf,fnamebuf2,sizeof(fnamebuf));
++ }
++-#ifdef SOLARIS
+++#if !defined(HAVE_GLOB_NOMAGIC) || !defined(HAVE_GLOB_BRACE) || defined(DEBUG_NONGNU)
++ glob_ret = glob(fnamebuf, GLOB_NOCHECK, NULL, &globbuf);
++ #else
++ glob_ret = glob(fnamebuf, GLOB_NOMAGIC|GLOB_BRACE, NULL, &globbuf);
++--- a/res/ael/ael_lex.c
+++++ b/res/ael/ael_lex.c
++@@ -1976,7 +1976,7 @@ YY_RULE_SETUP
++ snprintf(fnamebuf2,sizeof(fnamebuf2), "%s/%s", (char *)ast_config_AST_CONFIG_DIR, fnamebuf);
++ ast_copy_string(fnamebuf,fnamebuf2,sizeof(fnamebuf));
++ }
++-#ifdef SOLARIS
+++#if !defined(HAVE_GLOB_NOMAGIC) || !defined(HAVE_GLOB_BRACE) || defined(DEBUG_NONGNU)
++ glob_ret = glob(fnamebuf, GLOB_NOCHECK, NULL, &globbuf);
++ #else
++ glob_ret = glob(fnamebuf, GLOB_NOMAGIC|GLOB_BRACE, NULL, &globbuf);
+diff --git a/feeds/telephony/net/asterisk-g72x/Makefile b/feeds/telephony/net/asterisk-g72x/Makefile
+new file mode 100644
+index 0000000..1422719
+--- /dev/null
++++ b/feeds/telephony/net/asterisk-g72x/Makefile
+@@ -0,0 +1,122 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=asterisk-g72x
++PKG_VERSION:=1.3
++PKG_RELEASE:=1
++
++PKG_SOURCE:=asterisk-g72x-$(PKG_VERSION).tar.bz2
++PKG_SOURCE_URL:=http://asterisk.hosting.lv/src/
++PKG_MD5SUM:=05825dfbe4959dc5c90b2f7b91e3d4e3
++
++PKG_BUILD_DIR=$(BUILD_DIR)/asterisk-g72x-$(PKG_VERSION)
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++
++PKG_LICENSE:=GPL-3.0
++PKG_LICENSE_FILES:=README.md
++PKG_MAINTAINER:=Alex Samorukov <samm@os2.kiev.ua>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/asterisk-g72x/Default
++ SUBMENU:=Telephony
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=G.729 codec for Asterisk open source PBX
++ URL:=http://asterisk.hosting.lv
++ DEPENDS:= +bcg729
++endef
++
++define Package/asterisk18-codec-g729
++$(call Package/asterisk-g72x/Default)
++ DEPENDS+= asterisk18
++ VARIANT:=asterisk18
++endef
++
++define Package/asterisk11-codec-g729
++$(call Package/asterisk-g72x/Default)
++ DEPENDS+= asterisk11
++ VARIANT:=asterisk11
++endef
++
++define Package/asterisk13-codec-g729
++$(call Package/asterisk-g72x/Default)
++ DEPENDS+= asterisk13
++ VARIANT:=asterisk13
++endef
++
++define Package/description/Default
++ Asterisk G.729 codec based on bcg729 implementation.
++endef
++
++Package/asterisk18-codec-g729/description = $(Package/description/Default)
++Package/asterisk11-codec-g729/description = $(Package/description/Default)
++Package/asterisk13-codec-g729/description = $(Package/description/Default)
++
++ifeq ($(BUILD_VARIANT),asterisk18)
++ MAKE_ARGS:= \
++ CC="$(TARGET_CC)" \
++ LD="$(TARGET_LD)" \
++ CFLAGS="$(TARGET_CFLAGS) -DASTERISK_VERSION_NUM=110000 -DLOW_MEMORY -D_XOPEN_SOURCE=600 $(TARGET_CPPFLAGS) -I$(STAGING_DIR)/usr/include/asterisk-1.8/include -DHAVE_CONFIG_H -I. -fPIC" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ DESTDIR="$(PKG_INSTALL_DIR)"
++
++ CONFIGURE_ARGS+=\
++ --with-asterisk-includes=$(STAGING_DIR)/usr/include/asterisk-1.8/include \
++ --with-asterisk18 \
++ --with-bcg729 \
++ --enable-shared \
++ $(MAKE_ARGS)
++endif
++
++ifeq ($(BUILD_VARIANT),asterisk11)
++ MAKE_ARGS:= \
++ CC="$(TARGET_CC)" \
++ LD="$(TARGET_LD)" \
++ CFLAGS="$(TARGET_CFLAGS) -DASTERISK_VERSION_NUM=110000 -DLOW_MEMORY -D_XOPEN_SOURCE=600 $(TARGET_CPPFLAGS) -I$(STAGING_DIR)/usr/include/asterisk-11/include -DHAVE_CONFIG_H -I. -fPIC" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ DESTDIR="$(PKG_INSTALL_DIR)"
++
++ CONFIGURE_ARGS+=\
++ --with-asterisk-includes=$(STAGING_DIR)/usr/include/asterisk-11/include \
++ --with-asterisk100 \
++ --with-bcg729 \
++ --enable-shared \
++ $(MAKE_ARGS)
++endif
++
++ifeq ($(BUILD_VARIANT),asterisk13)
++ MAKE_ARGS:= \
++ CC="$(TARGET_CC)" \
++ LD="$(TARGET_LD)" \
++ CFLAGS="$(TARGET_CFLAGS) -DASTERISK_VERSION_NUM=130000 -DLOW_MEMORY -D_XOPEN_SOURCE=600 $(TARGET_CPPFLAGS) -I$(STAGING_DIR)/usr/include/asterisk-13/include -DHAVE_CONFIG_H -I. -fPIC" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ DESTDIR="$(PKG_INSTALL_DIR)"
++
++ CONFIGURE_ARGS+=\
++ --with-asterisk-includes=$(STAGING_DIR)/usr/include/asterisk-13/include \
++ --with-asterisk130 \
++ --with-bcg729 \
++ --enable-shared \
++ $(MAKE_ARGS)
++endif
++
++define Package/Install/Default
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/codec_g729.so $(1)/usr/lib/asterisk/modules/
++endef
++
++Package/asterisk18-codec-g729/install = $(Package/Install/Default)
++Package/asterisk11-codec-g729/install = $(Package/Install/Default)
++Package/asterisk13-codec-g729/install = $(Package/Install/Default)
++
++$(eval $(call BuildPackage,asterisk18-codec-g729))
++$(eval $(call BuildPackage,asterisk11-codec-g729))
++$(eval $(call BuildPackage,asterisk13-codec-g729))
+diff --git a/feeds/telephony/net/baresip/Makefile b/feeds/telephony/net/baresip/Makefile
+new file mode 100644
+index 0000000..116c0a5
+--- /dev/null
++++ b/feeds/telephony/net/baresip/Makefile
+@@ -0,0 +1,158 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++# Copyright (C) 2010 Alfred E. Heggestad
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=baresip
++PKG_VERSION:=0.4.14
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.creytiv.com/pub/
++PKG_MD5SUM:=06e0aea9ba3dbbbe834285a8c7e7df83
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=docs/COPYING
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++baresip-mods:= \
++ alsa \
++ avcodec \
++ avformat \
++ cons \
++ evdev \
++ g711 \
++ g722 \
++ g726 \
++ oss \
++ speex \
++ speex-aec \
++ speex-pp \
++ stdio \
++ v4l \
++ v4l2 \
++
++PKG_CONFIG_DEPENDS:= \
++ $(patsubst %,CONFIG_PACKAGE_baresip-mod-%,$(baresip-mods)) \
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/baresip/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Telephony
++ URL:=http://www.creytiv.com/
++endef
++
++define Package/baresip
++$(call Package/baresip/Default)
++ TITLE:=Portable and modular SIP User-Agent with A/V support
++ DEPENDS:=+libre +librem +libpthread
++ MENU:=1
++endef
++
++baresip-mod-alsa := USE_ALSA
++baresip-mod-avcodec := USE_AVCODEC
++baresip-mod-avformat := USE_AVFORMAT
++baresip-mod-cons := USE_CONS
++baresip-mod-evdev := USE_EVDEV
++baresip-mod-g711 := USE_G711
++baresip-mod-g722 := USE_G722
++baresip-mod-g726 := USE_G726
++baresip-mod-oss := USE_OSS
++baresip-mod-speex := USE_SPEEX
++baresip-mod-speex-aec := USE_SPEEX_AEC
++baresip-mod-speex-pp := USE_SPEEX_PP
++baresip-mod-stdio := USE_STDIO
++baresip-mod-v4l := USE_V4L
++baresip-mod-v4l2 := USE_V4L2
++
++BARESIP_MOD_OPTIONS:= \
++ MOD_AUTODETECT= \
++ EXTRA_MODULES="dtmfio" \
++ $(foreach m,$(baresip-mods),$(baresip-mod-$(m))=$(if $(CONFIG_PACKAGE_baresip-mod-$(m)),1))
++
++TARGET_CFLAGS += $(FPIC) -D_GNU_SOURCE
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ LIBRE_MK="$(STAGING_DIR)/usr/share/re/re.mk" \
++ LIBRE_INC="$(STAGING_DIR)/usr/include/re" \
++ LIBRE_SO="$(STAGING_DIR)/usr/lib" \
++ LIBREM_PATH="../rem" \
++ CC="$(TARGET_CC)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ EXTRA_CFLAGS="$(TARGET_CFLAGS) -DOPENWRT" \
++ SYSROOT="$$$$($(FIND) $(TOOLCHAIN_DIR) -path '*/include/pthread.h' | sed -ne '1s#/include/pthread.h##p')" \
++ SYSROOT_ALT="$(STAGING_DIR)/usr" \
++ RELEASE=1 \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ OS="linux" \
++ $(BARESIP_MOD_OPTIONS) \
++ all install
++endef
++
++define Package/baresip/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/baresip $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/usr/lib/baresip/modules
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/baresip/modules/{account,auloop,contact,ice,menu,stun,turn}.so \
++ $(1)/usr/lib/baresip/modules/.
++ $(INSTALL_DIR) $(1)/usr/share/baresip
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/baresip/* $(1)/usr/share/baresip/.
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/baresip.init $(1)/etc/init.d/baresip
++endef
++
++##################
++# Baresip modules
++# 1. Name
++# 2. Title
++# 3. Files
++# 4. Dependencies
++##################
++
++define BuildPlugin
++
++ define Package/baresip-mod-$(1)
++ $$(call Package/baresip/Default)
++ TITLE:= baresip $(2) module
++ DEPENDS:= baresip $(4)
++ endef
++
++ define Package/baresip-mod-$(1)/install
++ [ -z "$(3)" ] || $(INSTALL_DIR) $$(1)/usr/lib/baresip/modules
++ for f in $(3); do \
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/baresip/modules/$$$$$$$${f}.so \
++ $$(1)/usr/lib/baresip/modules/ ; \
++ done
++ endef
++
++ $$(eval $$(call BuildPackage,baresip-mod-$(1)))
++endef
++
++$(eval $(call BuildPackage,baresip))
++
++$(eval $(call BuildPlugin,alsa,ALSA audio driver,alsa,+PACKAGE_baresip-mod-alsa:alsa-lib))
++$(eval $(call BuildPlugin,avcodec,FFmpeg video codecs,avcodec,+PACKAGE_baresip-mod-avcodec:libffmpeg-full))
++$(eval $(call BuildPlugin,avformat,FFmpeg video source,avformat,+PACKAGE_baresip-mod-avformat:libffmpeg-full))
++$(eval $(call BuildPlugin,cons,console UI,cons,))
++$(eval $(call BuildPlugin,evdev,input event device UI,evdev,))
++$(eval $(call BuildPlugin,g711,G.711 audio codec,g711,))
++$(eval $(call BuildPlugin,g722,G.722 audio codec,g722,+PACKAGE_baresip-mod-g722:libspandsp))
++$(eval $(call BuildPlugin,g726,G.726 audio codec,g726,+PACKAGE_baresip-mod-g726:libspandsp))
++$(eval $(call BuildPlugin,httpd,Webserver UI module,httpd,))
++$(eval $(call BuildPlugin,oss,OSS audio driver,oss,))
++$(eval $(call BuildPlugin,speex,Speex audio codec,speex,+PACKAGE_baresip-mod-speex:libspeex))
++$(eval $(call BuildPlugin,speex-aec,Speex Acoustic Echo Cancellation,speex_aec,+PACKAGE_baresip-mod-speex-aec:libspeex))
++$(eval $(call BuildPlugin,speex-pp,Speex Pre-processor,speex_pp,+PACKAGE_baresip-mod-speex-pp:libspeex))
++$(eval $(call BuildPlugin,stdio,standard I/O UI,stdio,))
++$(eval $(call BuildPlugin,v4l,Video4Linux video source,v4l,+PACKAGE_baresip-mod-v4l:libv4l))
++$(eval $(call BuildPlugin,v4l2,Video4Linux2 video source,v4l2,+PACKAGE_baresip-mod-v4l2:libv4l))
+diff --git a/feeds/telephony/net/baresip/files/baresip.init b/feeds/telephony/net/baresip/files/baresip.init
+new file mode 100644
+index 0000000..e398595
+--- /dev/null
++++ b/feeds/telephony/net/baresip/files/baresip.init
+@@ -0,0 +1,14 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2010-2011 OpenWrt.org
++# Copyright (C) 2010 Alfred E. Heggestad
++#
++
++START=92
++
++start() {
++ service_start /usr/bin/baresip -d
++}
++
++stop() {
++ service_stop /usr/bin/baresip
++}
+diff --git a/feeds/telephony/net/chan-sccp-b/Makefile b/feeds/telephony/net/chan-sccp-b/Makefile
+new file mode 100644
+index 0000000..b9c2f1a
+--- /dev/null
++++ b/feeds/telephony/net/chan-sccp-b/Makefile
+@@ -0,0 +1,117 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++# Copyright (C) 2015 Cesnet, z.s.p.o.
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=chan-sccp-b
++PKG_REV:=6139
++PKG_VERSION:=v4.2-r$(PKG_REV)
++PKG_RELEASE:=3
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://svn.code.sf.net/p/chan-sccp-b/code/branches/V4.2
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=$(PKG_REV)
++PKG_SOURCE_PROTO:=svn
++
++PKG_FIXUP:=autoreconf -fi
++
++PKG_LICENSE:=GPL-1.0
++PKG_LICENSE_FILES:=COPYING LICENSE
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/chan-sccp-b/Default
++ SUBMENU:=Telephony
++ SECTION:=net
++ CATEGORY:=Network
++ TITLE:=SCCP channel provider support
++ URL:=http://chan-sccp-b.sourceforge.net/
++ DEPENDS:= +libltdl
++endef
++
++define Package/asterisk18-chan-sccp-b
++$(call Package/chan-sccp-b/Default)
++ DEPENDS+= asterisk18
++ VARIANT:=asterisk18
++ CONFLICTS:=asterisk18-chan-skinny
++endef
++
++define Package/asterisk13-chan-sccp-b
++$(call Package/chan-sccp-b/Default)
++ DEPENDS+= asterisk13
++ VARIANT:=asterisk13
++ CONFLICTS:=asterisk13-chan-skinny
++endef
++
++define Package/asterisk11-chan-sccp-b
++$(call Package/chan-sccp-b/Default)
++ DEPENDS+= asterisk11
++ VARIANT:=asterisk11
++ CONFLICTS:=asterisk11-chan-skinny
++endef
++
++define Package/description/Default
++ SCCP channel provider for asterisk. It delivers extended functionality for SCCP phones over chan_skinny delivered
++ by asterisk by default.
++endef
++
++Package/asterisk18-chan-sccp-b/description = $(Package/description/Default)
++Package/asterisk11-chan-sccp-b/description = $(Package/description/Default)
++Package/asterisk13-chan-sccp-b/description = $(Package/description/Default)
++
++ifeq ($(BUILD_VARIANT),asterisk13)
++ CONFIGURE_ARGS += --with-asterisk=$(STAGING_DIR)/usr/include/asterisk-13
++endif
++
++ifeq ($(BUILD_VARIANT),asterisk11)
++ CONFIGURE_ARGS += --with-asterisk=$(STAGING_DIR)/usr/include/asterisk-11
++endif
++
++ifeq ($(BUILD_VARIANT),asterisk18)
++ CONFIGURE_ARGS += --with-asterisk=$(STAGING_DIR)/usr/include/asterisk-1.8
++endif
++
++define Package/conffiles/Default
++/etc/asterisk/sccp.conf
++/etc/asterisk/extconfig.conf.sccp_sample
++/etc/asterisk/res_config_sqlite3.conf.sccp_sample
++/etc/asterisk/sccp_sqlite3.sql
++/etc/asterisk/sccp.conf.realtime_sample
++endef
++
++Package/asterisk18-chan-sccp-b/conffiles = $(Package/conffiles/Default)
++Package/asterisk11-chan-sccp-b/conffiles = $(Package/conffiles/Default)
++Package/asterisk13-chan-sccp-b/conffiles = $(Package/conffiles/Default)
++
++define Build/Compile
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ CFLAGS="$(CFLAGS) -I$(PKG_BUILD_DIR)/src -DLOW_MEMORY" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all install
++endef
++
++define Package/Install/Default
++ $(INSTALL_DIR) $(1)/etc/asterisk
++ $(CP) ./files/sccp.conf $(1)/etc/asterisk/sccp.conf
++ $(INSTALL_DIR) $(1)/usr/lib/asterisk/modules
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/asterisk/modules/chan_sccp.so $(1)/usr/lib/asterisk/modules/
++ $(INSTALL_DATA) ./files/extconfig.conf.sccp_sample $(1)/etc/asterisk/extconfig.conf.sccp_sample
++ $(INSTALL_DATA) ./files/res_config_sqlite3.conf.sccp_sample $(1)/etc/asterisk/res_config_sqlite3.conf.sccp_sample
++ $(INSTALL_DATA) ./files/sccp_sqlite3.sql $(1)/etc/asterisk/sccp_sqlite3.sql
++ $(INSTALL_DATA) ./files/sccp.conf.realtime_sample $(1)/etc/asterisk/sccp.conf.realtime_sample
++endef
++
++Package/asterisk18-chan-sccp-b/install = $(Package/Install/Default)
++Package/asterisk11-chan-sccp-b/install = $(Package/Install/Default)
++Package/asterisk13-chan-sccp-b/install = $(Package/Install/Default)
++
++$(eval $(call BuildPackage,asterisk18-chan-sccp-b))
++$(eval $(call BuildPackage,asterisk11-chan-sccp-b))
++$(eval $(call BuildPackage,asterisk13-chan-sccp-b))
+diff --git a/feeds/telephony/net/chan-sccp-b/files/extconfig.conf.sccp_sample b/feeds/telephony/net/chan-sccp-b/files/extconfig.conf.sccp_sample
+new file mode 100644
+index 0000000..18b0e34
+--- /dev/null
++++ b/feeds/telephony/net/chan-sccp-b/files/extconfig.conf.sccp_sample
+@@ -0,0 +1,3 @@
++[settings]
++sccpdevice => sqlite3,asterisk,sccpdeviceconfig
++sccpline => sqlite3,asterisk,sccpline
+diff --git a/feeds/telephony/net/chan-sccp-b/files/res_config_sqlite3.conf.sccp_sample b/feeds/telephony/net/chan-sccp-b/files/res_config_sqlite3.conf.sccp_sample
+new file mode 100644
+index 0000000..a237d47
+--- /dev/null
++++ b/feeds/telephony/net/chan-sccp-b/files/res_config_sqlite3.conf.sccp_sample
+@@ -0,0 +1,5 @@
++[asterisk]
++dbfile => /usr/lib/asterisk/realtime.sqlite3
++debug=yes
++requirements=warn
++;batch=1000
+diff --git a/feeds/telephony/net/chan-sccp-b/files/sccp.conf b/feeds/telephony/net/chan-sccp-b/files/sccp.conf
+new file mode 100644
+index 0000000..abc57f9
+--- /dev/null
++++ b/feeds/telephony/net/chan-sccp-b/files/sccp.conf
+@@ -0,0 +1,108 @@
++[general]
++servername = Openwrt
++keepalive = 60
++debug = core
++context = default
++dateformat = D/M/Y
++bindaddr = ::
++port = 2000
++disallow = all
++allow = ulaw
++allow = alaw
++allow = gsm
++firstdigittimeout = 16
++digittimeout = 6
++autoanswer_ring_time = 1
++transfer_on_hangup = off
++musicclass = default
++language = en
++deny = 0.0.0.0/0.0.0.0
++permit = internal
++dndFeature = on
++echocancel = off
++silencesuppression = off
++
++hotline_enabled = yes
++hotline_context = default
++hotline_extension = 111
++
++[SEP001122334455]
++type = device
++description = Phone Number One
++devicetype = 7970
++#addon = 7915, 7915
++button = line, 111
++button = line, 113@01:shared
++button = speeddial,Phone 2 Line 1, 112, 112@hint
++deny = 0.0.0.0/0.0.0.0
++permit = internal
++disallow = all
++#allow = g722
++#allow = g729
++allow = ulaw
++allow = alaw
++allow = gsm
++directrtp = on
++
++[SEP00A1B2C3D4E5]
++type = device
++description = Phone Number Two
++devicetype = 7960
++button = line, 112
++button = line, 113@01:shared
++button = speeddial,Phone 1 Line 1, 111, 111@hint
++directrtp = on
++
++[111]
++id = 1000
++type = line
++pin = 1234
++context = default
++label = Phone 1 Line 1
++description = Line 111
++mailbox = 10111
++cid_name = Phone 1 CID
++cid_num = 111
++accountcode=79111
++callgroup=1
++pickupgroup=1
++context = default
++incominglimit = 2
++vmnum = 600
++trnsfvm = 1000
++
++[112]
++id = 1001
++type = line
++pin = 1234
++context = default
++label = Phone 2 Line 1
++description = Line 112
++mailbox = 10112
++cid_name = Phone 2 CID
++cid_num = 112
++accountcode=79112
++callgroup=1,2
++pickupgroup=1,2
++context = default
++incominglimit = 4
++vmnum = 600
++trnsfvm = 1000
++
++[113]
++id = 1002
++type = line
++pin = 5522
++context = default
++label = SharedLine 1
++description = Line 113
++mailbox = 10113
++cid_name = Shared
++cid_num = 113
++accountcode=79113
++incominglimit = 2
++callgroup=2
++pickupgroup=2
++vmnum = 600
++trnsfvm = 1000
++dnd = silent
+diff --git a/feeds/telephony/net/chan-sccp-b/files/sccp.conf.realtime_sample b/feeds/telephony/net/chan-sccp-b/files/sccp.conf.realtime_sample
+new file mode 100644
+index 0000000..cb65e85
+--- /dev/null
++++ b/feeds/telephony/net/chan-sccp-b/files/sccp.conf.realtime_sample
+@@ -0,0 +1,30 @@
++[general]
++servername = Openwrt
++keepalive = 60
++debug = core
++context = default
++dateformat = D/M/Y
++bindaddr = ::
++port = 2000
++disallow = all
++allow = ulaw
++allow = alaw
++allow = g729
++firstdigittimeout = 16
++digittimeout = 6
++autoanswer_ring_time = 1
++transfer_on_hangup = off
++musicclass = default
++language = en
++deny = 0.0.0.0/0.0.0.0
++permit = internal
++dndFeature = on
++echocancel = off
++silencesuppression = off
++
++hotline_enabled = yes
++hotline_context = default
++hotline_extension = 111
++
++devicetable = sccpdevice
++linetable = sccpline
+diff --git a/feeds/telephony/net/chan-sccp-b/files/sccp_sqlite3.sql b/feeds/telephony/net/chan-sccp-b/files/sccp_sqlite3.sql
+new file mode 100644
+index 0000000..60e2adb
+--- /dev/null
++++ b/feeds/telephony/net/chan-sccp-b/files/sccp_sqlite3.sql
+@@ -0,0 +1,123 @@
++/*
++ * this is for users how like to sepatet device and button configuration
++ * You have to change the table names to:
++ *
++ * sccpdevices -> sccpdeviceconfig
++ * sccplines -> sccpline
++*/
++
++PRAGMA auto_vacuum=2;
++--
++-- Table with line-configuration
++--
++CREATE TABLE sccpdevice (
++ type varchar(45) DEFAULT NULL,
++ addon varchar(45) DEFAULT NULL,
++ description varchar(45) DEFAULT NULL,
++ tzoffset varchar(5) DEFAULT NULL,
++ transfer varchar(5) DEFAULT 'on',
++ cfwdall varchar(5) DEFAULT 'on',
++ cfwdbusy varchar(5) DEFAULT 'on',
++ imageversion varchar(45) DEFAULT NULL,
++ deny varchar(45) DEFAULT NULL,
++ permit varchar(45) DEFAULT NULL,
++ dndFeature varchar(5) DEFAULT 'on',
++ directrtp varchar(3) DEFAULT 'off',
++ earlyrtp varchar(8) DEFAULT 'off',
++ mwilamp varchar(5) DEFAULT 'on',
++ mwioncall varchar(5) DEFAULT 'off',
++ pickupexten varchar(5) DEFAULT 'on',
++ pickupcontext varchar(100) DEFAULT '',
++ pickupmodeanswer varchar(5) DEFAULT 'on',
++ private varchar(5) DEFAULT 'off',
++ privacy varchar(100) DEFAULT 'full',
++ nat varchar(4) DEFAULT 'auto',
++ softkeyset varchar(100) DEFAULT '',
++ audio_tos varchar(11) DEFAULT NULL,
++ audio_cos varchar(1) DEFAULT NULL,
++ video_tos varchar(11) DEFAULT NULL,
++ video_cos varchar(1) DEFAULT NULL,
++ conf_allow varchar(3) DEFAULT 'on',
++ conf_play_general_announce varchar(3) DEFAULT 'on',
++ conf_play_part_announce varchar(3) DEFAULT 'on',
++ conf_mute_on_entry varchar(3) DEFAULT 'off',
++ conf_music_on_hold_class varchar(80) DEFAULT 'default',
++ conf_show_conflist varchar(3) DEFAULT 'on',
++ backgroundImage varchar(255) DEFAULT '',
++ ringtone varchar(255) DEFAULT '',
++ setvar varchar(100) DEFAULT NULL,
++ disallow varchar(255) DEFAULT NULL,
++ allow varchar(255) DEFAULT NULL,
++ name varchar(15) NOT NULL DEFAULT '',
++ PRIMARY KEY (name)
++);
++
++--
++-- Table with device-configuration
++--
++CREATE TABLE sccpline (
++ id varchar(4) DEFAULT NULL,
++ pin varchar(45) DEFAULT NULL,
++ label varchar(45) DEFAULT NULL,
++ description varchar(45) DEFAULT NULL,
++ context varchar(45) DEFAULT NULL,
++ incominglimit varchar(45) DEFAULT NULL,
++ transfer varchar(45) DEFAULT NULL,
++ mailbox varchar(45) DEFAULT NULL,
++ vmnum varchar(45) DEFAULT NULL,
++ cid_name varchar(45) DEFAULT NULL,
++ cid_num varchar(45) DEFAULT NULL,
++ trnsfvm varchar(45) DEFAULT NULL,
++ secondary_dialtone_digits varchar(45) DEFAULT NULL,
++ secondary_dialtone_tone varchar(45) DEFAULT NULL,
++ musicclass varchar(45) DEFAULT NULL,
++ language varchar(45) DEFAULT NULL,
++ accountcode varchar(45) DEFAULT NULL,
++ echocancel varchar(45) DEFAULT NULL,
++ silencesuppression varchar(45) DEFAULT NULL,
++ callgroup varchar(45) DEFAULT NULL,
++ pickupgroup varchar(45) DEFAULT NULL,
++ namedcallgroup varchar(45) DEFAULT NULL,
++ namedpickupgroup varchar(45) DEFAULT NULL,
++ dnd varchar(7) DEFAULT 'reject',
++ amaflags varchar(45) DEFAULT NULL,
++ defaultSubscriptionId_number varchar(5) DEFAULT NULL,
++ setvar varchar(50) DEFAULT NULL,
++ name varchar(45) NOT NULL DEFAULT '',
++ PRIMARY KEY (name)
++);
++
++CREATE TABLE buttontype (
++ type varchar(9) DEFAULT NULL,
++ PRIMARY KEY (type)
++);
++
++INSERT INTO buttontype (type) VALUES ('line');
++INSERT INTO buttontype (type) VALUES ('speeddial');
++INSERT INTO buttontype (type) VALUES ('service');
++INSERT INTO buttontype (type) VALUES ('feature');
++INSERT INTO buttontype (type) VALUES ('empty');
++--
++-- Table with button-configuration for device
++--
++CREATE TABLE buttonconfig (
++ device varchar(15) NOT NULL DEFAULT '',
++ instance tinyint(4) NOT NULL DEFAULT '0',
++ type varchar(9),
++ name varchar(36) DEFAULT NULL,
++ options varchar(100) DEFAULT NULL,
++ PRIMARY KEY (device,instance),
++ FOREIGN KEY (device) REFERENCES sccpdevice (device),
++ FOREIGN KEY (type) REFERENCES buttontype (type)
++);
++
++--
++-- View for merging device and button configuration
++--
++CREATE VIEW sccpdeviceconfig AS
++ SELECT sccpdevice.*,
++ group_concat(buttonconfig.type||","||buttonconfig.name||","||buttonconfig.options,";") as button
++ FROM buttonconfig, sccpdevice
++ WHERE buttonconfig.device=sccpdevice.name
++ GROUP BY sccpdevice.name
++ ORDER BY sccpdevice.name, buttonconfig.instance;
+diff --git a/feeds/telephony/net/freeswitch/Config.in b/feeds/telephony/net/freeswitch/Config.in
+new file mode 100644
+index 0000000..21a61ea
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/Config.in
+@@ -0,0 +1,250 @@
++menu "Configuration"
++ depends on PACKAGE_freeswitch
++
++ choice
++ depends on DEVEL
++ prompt "Git HEAD version to use"
++ default FS_WITH_DEFAULT_HEAD
++ help
++ The existing git HEAD is probably outdated. This option allows
++ OpenWRT to pull the latest git HEAD. Please ONLY enable this
++ option if you know what you are doing. It may and/or may not
++ be cleanly compiled and may require some intervension to create
++ new patches. If you take this route and come up with some patches,
++ please contemplate to contribute
++ or send in your patches.
++
++ config FS_WITH_DEFAULT_HEAD
++ bool "Default"
++ help
++ Since developers @FreeSWITCH are actively working to improve
++ FreeSWITCH, there is a chance the default git HEAD has long
++ been oudated.
++
++ config FS_WITH_LATEST_HEAD
++ bool "Latest"
++ help
++ Please use this option with cautious. It may and/or may not compile
++ out of the box and may and/or may not require some additional new
++ patches.
++
++ endchoice
++
++ choice
++ depends on FS_WITH_LATEST_HEAD
++ prompt "FS TARRED archive to use"
++ default FS_WITH_OPENWRT_SOURCE
++ help
++ Select which tarred to use: local or OpenWRT
++ local: FS tarred from local archive
++ OpenWRT: FS tarred download from source by OpenWRT
++
++ config FS_WITH_LOCAL_SOURCE
++ bool "local"
++ help
++ Use local tarred archive. This approach requires a manually checkout
++ source from FS git repository using 'git clone', then package the
++ source using tar with XZ compression. The tarred file should include
++ $(PKG_VERSION) as follows:
++ 1. "git clone git://git.freeswitch.org/freeswitch.git <dir>"
++ 2. Change to <dir>.
++ 3. "git checkout $(FS_DEFAULT_HEAD) && git submodule update"
++ 4. Back to parent <dir>.
++ 5. "tar -Jcf freeswitch_git-$(PKG_VERSION).tar.xz <dir>"
++ 6. Move the tarred file to OpenWRT download directory.
++
++ config FS_WITH_OPENWRT_SOURCE
++ bool "OpenWRT"
++ help
++ Use (download) tarred archive from OpenWRT.
++
++ endchoice
++
++ choice
++ prompt "Select database"
++ default FS_WITH_SQLITE3
++ help
++ Select which database library to use for libs/apr-util package.
++ Default is SQLite.
++
++ config FS_WITH_MYSQL
++ bool "MySQL"
++ help
++ Compile libs/apr-util with MySQL support.
++
++ config FS_WITH_POSTGRESQL
++ bool "PostgreSQL"
++ help
++ Compile libs/apr-util with PostgreSQL support.
++
++ config FS_WITH_SQLITE2
++ bool "SQLITE2"
++ help
++ Compile libs/apr-util with SQLITE2 support.
++
++ config FS_WITH_SQLITE3
++ bool "SQLITE3"
++ help
++ Compile libs/apr-util with SQLITE3 support.
++
++ endchoice
++
++ config FS_WITH_ALSA
++ bool "Enable ALSA for sound support"
++ default y
++ help
++ Compile with ALSA support.
++
++ config FS_WITH_VISIBILITY
++ bool "Enable API visibility support"
++ default y
++ help
++ Compile with API visibility support.
++
++ config FS_WITH_APR_CONFIG_SWITCHES
++ bool "Enable APR configuration switches"
++ default y
++ help
++ Enable some configure switches in libs/apr.
++
++ config FS_WITH_APR_IPV6
++ depends on FS_WITH_APR_CONFIG_SWITCHES
++ bool "Enable IPV6 support in APR"
++ default y
++ help
++ Compile libs/apr package with IPV6 support.
++
++ config FS_WITH_APR_SCTP
++ depends on FS_WITH_APR_CONFIG_SWITCHES
++ bool "Enable SCTP support in APR"
++ default y
++ help
++ Compile with SCTP (Stream Control Transfer Protocol)
++ support in lib APR.
++
++ config FS_WITH_APR_THREADS
++ depends on FS_WITH_APR_CONFIG_SWITCHES
++ bool "Enable threading support in APR"
++ default y
++ help
++ Compile with threads support in libs/apr.
++
++ config FS_WITH_BUILTIN_ZRTP
++ bool "Enable built-in ZRTP"
++ default y
++ help
++ Compile with ZRTP support.
++
++ config FS_WITH_OGG
++ bool "Enable ogg support in mod_celt"
++ default y
++ help
++ Enable this option to allow use of OGG in mod_celt.
++
++ config FS_WITH_CORE_LIBEDIT_SUPPORT
++ bool "Compile with libedit Support"
++ default n
++ help
++ Compile with libedit Support. ATM, libedit isn't
++ supported by OpenWRT.
++
++ config FS_WITH_FHS
++ bool "Follow the FHS when placing files and directories"
++ default y
++ help
++ Build FreeSWITCH to comply with FHS when placing
++ files and directories.
++
++ config FS_WITH_LZMA
++ bool "Enable liblzma usage in libtiff"
++ default y
++ help
++ Compile libs/tiff package with liblzma support. This option
++ requires LZMA2 compression package called liblzma.
++
++ config FS_WITH_ODBC
++ depends on PACKAGE_sqliteodbc
++ depends on PACKAGE_unixodbc_svn
++ bool "Compile with ODBC support (Requires unixodbc NOT YET AVAILABLE)"
++ default n
++ help
++ Enable ODBC support. Since both sqliteodbc and unixodbc
++ packages are not yet available on OpenWRT, ODBC support
++ should not be enabled.
++
++ config FS_WITH_OPENSSL
++ bool "Enable SSL support"
++ default y
++ help
++ Compile with SSL support.
++
++ config FS_WITH_OPT
++ bool "Enable optimization"
++ default y
++ help
++ Compile with optimization flag enabled. This
++ will add max optimising compiler flags
++
++ config FS_WITH_SILENT_RULES
++ bool "Enable with less verbose build output"
++ default n
++ help
++ Enable this option to produce a less verbose build output
++ (undo: "make V=1")
++
++ config FS_WITH_SRTP
++ bool "Enable SRTP"
++ default y
++ help
++ Compile with SRTP support.
++
++ config FS_WITH_SRTP_GENERIC_AESICM
++ depends on FS_WITH_SRTP
++ bool "Compile in changes for ISMAcryp"
++ default y
++ help
++ Compile in changes for ISMAcryp.
++
++ config FS_WITH_SRTP_KERNEL_LINUX
++ depends on FS_WITH_SRTP
++ bool "Build library to run in Linux kernel context"
++ default n
++ help
++ Build library to run in Linux kernel context.
++
++ config FS_WITH_SRTP_OPENSSL
++ depends on FS_WITH_SRTP
++ bool "Use OpenSSL crypto primitives to build SRTP"
++ default y
++ help
++ Use OpenSSL crypto primitives.
++
++ config FS_WITH_PYTHON
++ depends on PACKAGE_freeswitch-mod-python
++ bool "Enable to use system provided version of python"
++ default n
++ help
++ Enable to use system provided version of python.
++
++ config FS_WITH_STUN
++ bool "Enable stun module"
++ default y
++ help
++ Enable stun module.
++
++ config FS_WITH_ERLANG
++ depends on PACKAGE_freeswitch-mod-erlang-event
++ string
++ prompt "path to erlang installed directory"
++ default "$$(STAGING_DIR_HOST)/lib/erlang"
++ help
++ Specify the path to erlang libraries.
++
++# config FS_WITH_OGG_INCLUDES
++# string
++# prompt "OGG include HEADER path"
++# default "$$(STAGING_DIR)/usr/include"
++# help
++# Specify the include header path for OGG library.
++
++endmenu
+diff --git a/feeds/telephony/net/freeswitch/Makefile b/feeds/telephony/net/freeswitch/Makefile
+new file mode 100644
+index 0000000..1148884
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/Makefile
+@@ -0,0 +1,1101 @@
++#
++# Copyright (C) 2009-2013 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++#
++include $(TOPDIR)/rules.mk
++-include perlmod.mk
++
++
++PKG_NAME:=freeswitch
++PKG_SOURCE_PROTO:=git
++PKG_DISTNAME:=$(PKG_NAME)_$(PKG_SOURCE_PROTO)
++PKG_VERSION:=1.5.final
++
++
++#
++# The latest FS git hash in PKG_SOURCE_VERSION can be obtained from
++# http://fisheye.freeswitch.org
++#
++FS_WITH_DEFAULT_HEAD:=16d600c0350a79c2532c739dd1432f7ed318ea09
++PKG_SOURCE_URL:=https://$(PKG_NAME).org/stash/scm/fs/$(PKG_NAME).git
++PKG_SOURCE_VERSION:=$(if $(CONFIG_FS_WITH_LATEST_HEAD),$(shell git ls-remote $(PKG_SOURCE_URL) HEAD|cut -f1),$(FS_WITH_DEFAULT_HEAD))
++FS_WITH_DEFAULT_HEAD_SHORT:=$(shell echo $(FS_WITH_DEFAULT_HEAD)|cut -b -7)
++PKG_SOURCE_VERSION_SHORT:=$(shell echo $(PKG_SOURCE_VERSION)|cut -b -7)
++PKG_RELEASE:=$(PKG_SOURCE_VERSION_SHORT)
++PKG_SOURCE_SUBDIR:=$(PKG_DISTNAME)
++PKG_SOURCE:=$(PKG_SOURCE_SUBDIR)-$(if $(CONFIG_FS_WITH_LOCAL_SOURCE),$(FS_WITH_DEFAULT_HEAD_SHORT).tar.xz,$(PKG_SOURCE_VERSION_SHORT).tar.bz2)
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++
++
++PATCH_DIR=./patches/$(CONFIG_LIBC)
++
++
++PKG_FIXUP:=autoreconf
++PKG_BUILD_PARALLEL:=0
++
++PKG_LICENSE:=MPL-1.1
++PKG_LICENSE_FILES:=COPYING
++
++ifeq ($(CONFIG_DEVEL),y)
++ export QUILT=1
++endif
++
++
++PKG_BUILD_DEPENDS:= \
++ FS_WITH_CORE_LIBEDIT_SUPPORT:libedit \
++ FS_WITH_MYSQL:libmysqlclient \
++ FS_WITH_POSTGRESQL:libpq \
++ FS_WITH_SQLITE2:libsqlite2 \
++ FS_WITH_SQLITE3:libsqlite3 \
++ FS_WITH_APR_SCTP:sctp \
++
++
++TAR_OPTIONS+= --strip-components=1 -C $(PKG_BUILD_DIR)
++
++
++FS_MOD_AVAILABLE:= \
++ abstraction \
++ alsa \
++ amr \
++ amrwb \
++ av \
++ avmd \
++ basic \
++ bert \
++ blacklist \
++ bv \
++ callcenter \
++ cdr-csv \
++ cdr-mongodb \
++ cdr-pg-csv \
++ cdr-sqlite \
++ cepstral \
++ cidlookup \
++ cluechoo \
++ codec2 \
++ commands \
++ conference \
++ console \
++ curl \
++ cv \
++ dahdi-codec \
++ db \
++ dialplan-asterisk \
++ dialplan-directory \
++ dialplan-xml \
++ dingaling \
++ directory \
++ distributor \
++ dptools \
++ easyroute \
++ enum \
++ erlang-event \
++ esf \
++ esl \
++ event-multicast \
++ event-socket \
++ event-zmq \
++ expr \
++ fifo \
++ file-string \
++ flite \
++ format-cdr \
++ freetdm \
++ fsk \
++ fsv \
++ g723-1 \
++ g729 \
++ gsmopen \
++ h26x \
++ h323 \
++ hash \
++ hiredis \
++ html5 \
++ httapi \
++ http-cache \
++ ilbc \
++ isac \
++ java \
++ json-cdr \
++ kazoo \
++ lcr \
++ ldap \
++ local-stream \
++ logfile \
++ loopback \
++ lua \
++ managed \
++ memcache \
++ mongo \
++ mp4 \
++ mp4v \
++ native-file \
++ nibblebill \
++ opus \
++ oreka \
++ perl \
++ portaudio \
++ portaudio-stream \
++ posix-timer \
++ python \
++ radius-cdr \
++ rayo \
++ redis \
++ rss \
++ rtc \
++ rtmp \
++ sangoma-codec \
++ say-de \
++ say-en \
++ say-es \
++ say-fa \
++ say-fr \
++ say-hu \
++ say-it \
++ say-nl \
++ say-pt \
++ say-ru \
++ say-th \
++ say-zh \
++ shell-stream \
++ silk \
++ siren \
++ skel \
++ skinny \
++ skypopen \
++ smpp \
++ sms \
++ snapshot \
++ sndfile \
++ snmp \
++ snom \
++ sofia \
++ sonar \
++ spandsp \
++ spidermonkey \
++ spidermonkey-core-db \
++ spidermonkey-curl \
++ spidermonkey-odbc \
++ spidermonkey-socket \
++ spidermonkey-teletone \
++ spy \
++ ssml \
++ stress \
++ syslog \
++ timerfd \
++ tone-stream \
++ tts-commandline \
++ unimrcp \
++ valet-parking \
++ verto \
++ vmd \
++ voicemail \
++ voicemail-ivr \
++ vpx \
++ xml-cdr \
++ xml-curl \
++ xml-ldap \
++ xml-rpc \
++ xml-radius \
++ xml-scgi \
++ yaml \
++
++
++PKG_CONFIG_DEPENDS:= \
++ CONFIG_FS_WITH_ALSA \
++ CONFIG_FS_WITH_APR_CONFIG_SWITCHES \
++ CONFIG_FS_WITH_APR_IPV6 \
++ CONFIG_FS_WITH_APR_SCTP \
++ CONFIG_FS_WITH_APR_THREADS \
++ CONFIG_FS_WITH_BUILTIN_ZRTP \
++ CONFIG_FS_WITH_CORE_LIBEDIT_SUPPORT \
++ CONFIG_FS_WITH_DEFAULT_HEAD \
++ CONFIG_FS_WITH_ERLANG \
++ CONFIG_FS_WITH_FHS \
++ CONFIG_FS_WITH_FIXED_POINT \
++ CONFIG_FS_WITH_LATEST_HEAD \
++ CONFIG_FS_WITH_LOCAL_SOURCE \
++ CONFIG_FS_WITH_LZMA \
++ CONFIG_FS_WITH_MYSQL \
++ CONFIG_FS_WITH_ODBC \
++ CONFIG_FS_WITH_OGG \
++ CONFIG_FS_WITH_OPENSSL \
++ CONFIG_FS_WITH_OPENWRT_SOURCE \
++ CONFIG_FS_WITH_OPT \
++ CONFIG_FS_WITH_POSTGRESQL \
++ CONFIG_FS_WITH_PYTHON \
++ CONFIG_FS_WITH_SILENT_RULES \
++ CONFIG_FS_WITH_SQLITE2 \
++ CONFIG_FS_WITH_SQLITE3 \
++ CONFIG_FS_WITH_SRTP \
++ CONFIG_FS_WITH_SRTP_GENERIC_AESICM \
++ CONFIG_FS_WITH_SRTP_KERNEL_LINUX \
++ CONFIG_FS_WITH_SRTP_OPENSSL \
++ CONFIG_FS_WITH_STUN \
++ CONFIG_FS_WITH_VISIBILITY \
++ $(patsubst %,CONFIG_PACKAGE_$(PKG_NAME)-mod-%,$(FS_MOD_AVAILABLE)) \
++
++
++include $(INCLUDE_DIR)/package.mk
++include $(INCLUDE_DIR)/nls.mk
++
++
++ifneq ($(CONFIG_CCACHE),)
++TARGET_CC=$(TARGET_CC_NOCACHE)
++TARGET_CXX=$(TARGET_CXX_NOCACHE)
++endif
++
++
++ifneq ($(CONFIG_CCACHE),)
++TARGET_CC=$(TARGET_CC_NOCACHE)
++TARGET_CXX=$(TARGET_CXX_NOCACHE)
++endif
++
++
++define Package/$(PKG_NAME)/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Telephony
++ URL:=http://www.$(PKG_NAME).org/
++ MAINTAINER:=Mazi Lo <openwrt.mazilo@recursor.net>
++endef
++
++
++define Package/$(PKG_NAME)
++$(call Package/$(PKG_NAME)/Default)
++ MENU:=1
++ TITLE:=FreeSWITCH open source telephony platform ($(PKG_SOURCE_VERSION_SHORT))
++ DEPENDS:=+FS_WITH_CORE_LIBEDIT_SUPPORT:libedit +FS_WITH_OPENSSL:libopenssl +libcurl +libdb47 +libfreetype +libgdbm $(ICONV_DEPENDS) $(INTL_DEPENDS) +libjpeg +libncurses +libopenldap +libpcre +libpng +libpthread +librt +libspeex +libspeexdsp +FS_WITH_SQLITE2:libsqlite2 +FS_WITH_SQLITE3:libsqlite3 +FS_WITH_SRTP:libsrtp +SSP_SUPPORT:libssp +libstdcpp +libuuid +PACKAGE_$(PKG_NAME)-mod-perl:perl +libvpx
++endef
++
++
++define Package/$(PKG_NAME)/description
++ FreeSWITCH is an open source telephony platform designed to
++ facilitate the creation of voice and chat driven products
++ scaling from a soft-phone up to a soft-switch.
++endef
++
++
++define Package/$(PKG_NAME)/config
++ source "$(SOURCE)/Config.in"
++endef
++
++
++define Package/$(PKG_NAME)-mod-spandsp/config
++ config FS_WITH_FIXED_POINT
++ depends on PACKAGE_$(PKG_NAME)-mod-spandsp
++ bool "Enable fixed point support for spandsp (may degrade performance)"
++ default n
++ help
++ Compile spandsp package with a fixed point support. ONLY enabled this
++ option when necessary, i.e. CPU doesn't support floating computation.
++endef
++
++
++define Package/$(PKG_NAME)-example-config
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH example config (commented)
++ DEPENDS:= $(PKG_NAME)
++endef
++
++
++define Package/$(PKG_NAME)-example-config/description
++ The default configuration included with FreeSWITCH. It is not intended to be
++ a final product, and is thus moved to /usr/share/$(PKG_NAME)/examples/conf to
++ be an example of how FreeSWITCH can be configured.
++endef
++
++
++define Package/$(PKG_NAME)-config-upstream-defaults
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH upstream config
++ DEPENDS:= $(PKG_NAME)
++endef
++
++
++define Package/$(PKG_NAME)-config-upstream-defaults/description
++ The default configuration included with FreeSWITCH. It is not intended to be
++ a final product, and but is included for those who don't want to use the
++ OpenWRT configuration and/or want to try things as prepared by upstream.
++endef
++
++
++define Package/$(PKG_NAME)-config-minimal
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH minimal config
++ DEPENDS:= $(PKG_NAME)
++endef
++
++
++define Package/$(PKG_NAME)-config-minimal/description
++ A minimal configuration of FreeSWITCH for OpenWRT devices. Is what the UCI
++ configuration began with.
++endef
++
++
++define Package/$(PKG_NAME)-collection-upstream-defaults
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FS upstream def sample conf
++ DEPENDS:= $(PKG_NAME) \
++ +$(PKG_NAME)-config-upstream-defaults \
++ +$(PKG_NAME)-mod-callcenter \
++ +$(PKG_NAME)-mod-codec2 \
++ +$(PKG_NAME)-mod-commands \
++ +$(PKG_NAME)-mod-conference \
++ +$(PKG_NAME)-mod-curl \
++ +$(PKG_NAME)-mod-dialplan-xml \
++ +$(PKG_NAME)-mod-dingaling \
++ +$(PKG_NAME)-mod-dptools \
++ +$(PKG_NAME)-mod-event-socket \
++ +$(PKG_NAME)-mod-g723-1 \
++ +$(PKG_NAME)-mod-g729 \
++ +$(PKG_NAME)-mod-hash \
++ +$(PKG_NAME)-mod-http-cache \
++ +$(PKG_NAME)-mod-ilbc \
++ +$(PKG_NAME)-mod-local-stream \
++ +$(PKG_NAME)-mod-lua \
++ +$(PKG_NAME)-mod-native-file \
++ +$(PKG_NAME)-mod-say-en \
++ +$(PKG_NAME)-mod-sndfile \
++ +$(PKG_NAME)-mod-sofia \
++ +$(PKG_NAME)-mod-syslog \
++ +$(PKG_NAME)-mod-tone-stream \
++ +$(PKG_NAME)-mod-xml-curl \
++ +$(PKG_NAME)-mod-xml-rpc \
++ +$(PKG_NAME)-tools
++endef
++
++
++define Package/$(PKG_NAME)-collection-minimal
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH minimal package collection
++ DEFAULT:=y
++ DEPENDS:= $(PKG_NAME) \
++ +$(PKG_NAME)-config-minimal \
++ +$(PKG_NAME)-mod-codec2 \
++ +$(PKG_NAME)-mod-commands \
++ +$(PKG_NAME)-mod-dialplan-xml \
++ +$(PKG_NAME)-mod-dptools \
++ +$(PKG_NAME)-mod-event-socket \
++ +$(PKG_NAME)-mod-hash \
++ +$(PKG_NAME)-mod-local-stream \
++ +$(PKG_NAME)-mod-sndfile \
++ +$(PKG_NAME)-mod-sofia \
++ +$(PKG_NAME)-mod-syslog \
++ +$(PKG_NAME)-mod-tone-stream \
++ +$(PKG_NAME)-tools
++endef
++
++
++define Package/$(PKG_NAME)-sounds-en-08KHz
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH 8KHz english sounds
++ DEPENDS:= $(PKG_NAME)
++endef
++
++
++define Package/$(PKG_NAME)-sounds-en-16KHz
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH 16KHz english sounds
++ DEPENDS:= +$(PKG_NAME)-sounds-en-08KHz
++endef
++
++
++define Package/$(PKG_NAME)-sounds-en-32KHz
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH 32KHz english sounds
++ DEPENDS:= +$(PKG_NAME)-sounds-en-16KHz
++endef
++
++
++define Package/$(PKG_NAME)-sounds-en-48KHz
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH 48KHz english sounds
++ DEPENDS:= +$(PKG_NAME)-sounds-en-32KHz
++endef
++
++
++define Package/$(PKG_NAME)-sounds-moh-08KHz
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH 8KHz music-on-hold sounds
++ DEPENDS:= $(PKG_NAME)
++endef
++
++
++define Package/$(PKG_NAME)-sounds-moh-16KHz
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH 16KHz music-on-hold sounds
++ DEPENDS:= +$(PKG_NAME)-sounds-moh-08KHz
++endef
++
++
++define Package/$(PKG_NAME)-sounds-moh-32KHz
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH 32KHz music-on-hold sounds
++ DEPENDS:= +$(PKG_NAME)-sounds-moh-16KHz
++endef
++
++
++define Package/$(PKG_NAME)-sounds-moh-48KHz
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH 48KHz music-on-hold sounds
++ DEPENDS:= +$(PKG_NAME)-sounds-moh-32KHz
++endef
++
++
++define Package/$(PKG_NAME)-tools
++$(call Package/$(PKG_NAME)/Default)
++ TITLE:=FreeSWITCH control tools
++ DEPENDS:= $(PKG_NAME)
++endef
++
++
++define Download/files
++ define Download/$(1)
++ FILE:=$(2)
++ URL:=$(if $(4),$(4),http://files.$(PKG_NAME).org)/$(5)
++ MD5SUM:=$(3)
++ endef
++ define Prepare/$(1)
++ $(LN) $(DL_DIR)/$(2) $(PKG_BUILD_DIR)/$(6)
++ endef
++ $$(eval $$(call Download,$(1)))
++endef
++
++
++MAKE_INSTALL_TARGETS:=install
++
++
++ifneq ($(CONFIG_PACKAGE_$(PKG_NAME)-mod-curl),)
++ $(eval $(call Download/files,json-cdr,json-c-0.9.tar.gz,4653b3b9c568bb9c782178abfaac128d,,downloads/libs/,libs/))
++endif
++
++
++ifneq ($(CONFIG_PACKAGE_$(PKG_NAME)-mod-event-zmq),)
++ $(eval $(call Download/files,event-zmq,zeromq-2.1.9.tar.gz,94c5e0262a79c5f82bc0b178c1f8a33d,http://download.zeromq.org http://download.zeromq.org/historic,,libs/))
++endif
++
++
++ifneq ($(CONFIG_PACKAGE_$(PKG_NAME)-mod-mongo),)
++ $(eval $(call Download/files,mongo,mongo-c-driver-0.92.2.tar.gz,afab25a33abd3f1e0ba79c5a9da92651,,downloads/libs/,libs/))
++endif
++
++
++ifneq ($(CONFIG_PACKAGE_$(PKG_NAME)-sounds-en-08KHz),)
++ $(eval $(call Download/files,sounds-en-08KHz,$(PKG_NAME)-sounds-en-us-callie-8000-1.0.50.tar.gz,14cccba7b5c56f027fea391f1e0ee2d6,,,))
++ MAKE_INSTALL_TARGETS+= sounds-install
++endif
++
++
++ifneq ($(CONFIG_PACKAGE_$(PKG_NAME)-sounds-en-16KHz),)
++ $(eval $(call Download/files,sounds-en-16KHz,$(PKG_NAME)-sounds-en-us-callie-16000-1.0.50.tar.gz,261f42e310baa97cc4dcfdc51971aff8,,,))
++ MAKE_INSTALL_TARGETS+= hd-sounds-install
++endif
++
++
++ifneq ($(CONFIG_PACKAGE_$(PKG_NAME)-sounds-en-32KHz),)
++ $(eval $(call Download/files,sounds-en-32KHz,$(PKG_NAME)-sounds-en-us-callie-32000-1.0.50.tar.gz,f204512fadc49a3267ff4a5e899b77a5,,,))
++ MAKE_INSTALL_TARGETS+= uhd-sounds-install
++endif
++
++
++ifneq ($(CONFIG_PACKAGE_$(PKG_NAME)-sounds-en-48KHz),)
++ $(eval $(call Download/files,sounds-en-48KHz,$(PKG_NAME)-sounds-en-us-callie-48000-1.0.50.tar.gz,8622a77a5d6dcf5e47bdf30d6a33e27c,,,))
++ MAKE_INSTALL_TARGETS+= cd-sounds-install
++endif
++
++
++ifneq ($(CONFIG_PACKAGE_$(PKG_NAME)-sounds-moh-08KHz),)
++ $(eval $(call Download/files,sounds-moh-08KHz,$(PKG_NAME)-sounds-music-8000-1.0.50.tar.gz,c1f62dc26360f39f8eb442d5efd0a3aa,,,))
++ MAKE_INSTALL_TARGETS+= moh-install
++endif
++
++
++ifneq ($(CONFIG_PACKAGE_$(PKG_NAME)-sounds-moh-16KHz),)
++ $(eval $(call Download/files,sounds-moh-16KHz,$(PKG_NAME)-sounds-music-16000-1.0.50.tar.gz,d253e26baa85e0e2e727a1cb1cca898e,,,))
++ MAKE_INSTALL_TARGETS+= hd-moh-install
++endif
++
++
++ifneq ($(CONFIG_PACKAGE_$(PKG_NAME)-sounds-moh-32KHz),)
++ $(eval $(call Download/files,sounds-moh-32KHz,$(PKG_NAME)-sounds-music-32000-1.0.50.tar.gz,0e3ee69cb4ba2813ed0d3f7811332b63,,,))
++ MAKE_INSTALL_TARGETS+= uhd-moh-install
++endif
++
++
++ifneq ($(CONFIG_PACKAGE_$(PKG_NAME)-sounds-moh-48KHz),)
++ $(eval $(call Download/files,sounds-moh-48KHz,$(PKG_NAME)-sounds-music-48000-1.0.50.tar.gz,873a62df1ab3be4191eb2488156ec2c2,,,))
++ MAKE_INSTALL_TARGETS+= cd-moh-install
++endif
++
++
++#
++# XXX: -fgnu89-inline is not supported on all compiler versions, so only enable it on avr32 where it solves build issues
++#
++ifneq ($(CONFIG_avr32),)
++ TARGET_CFLAGS += -fgnu89-inline
++ TARGET_CXXFLAGS += -fgnu89-inline
++endif
++
++
++ifneq ($(CONFIG_USE_EGLIBC),)
++ ifeq ($(CONFIG_EGLIBC_OPTION_EGLIBC_UTMP),)
++ TARGET_CFLAGS += -DNO_GETLOGIN
++ endif
++endif
++
++
++ifeq ($(CONFIG_LIBC),musl)
++ TARGET_CFLAGS += -D_GNU_SOURCE
++endif
++#FS_TARGET_CFLAGS:= $(TARGET_CFLAGS) -DLUA_USE_LINUX $(FPIC) -std=gnu99 -Wno-format -Wno-unused-variable -Wno-unused-but-set-variable -Wno-implicit-function-declaration
++#FS_TARGET_CXXFLAGS:= $(TARGET_CXXFLAGS)
++#FS_TARGET_CPPFLAGS:= -I. -I./lua $(TARGET_CPPFLAGS) $(if $(CONFIG_PACKAGE_$(PKG_NAME)-mod-json-cdr),-Wno-error) -I`ls -d $(PKG_BUILD_DIR)/libs/*|grep tiff`/libtiff -I$(PKG_BUILD_DIR)/libs/spandsp/src
++
++
++#MAKE_FLAGS += \
++# OPT_FLAGS+="$(TARGET_CFLAGS)"
++
++
++#MAKE_VARS += \
++# AR="$(TOOLCHAIN_DIR)/bin/$(TARGET_CROSS)ar" \
++# CC="$(TOOLCHAIN_DIR)/bin/$(TARGET_CC)" \
++# CXX="$(TOOLCHAIN_DIR)/bin/$(TARGET_CXX)" \
++# RANLIB="$(TOOLCHAIN_DIR)/bin/$(TARGET_CROSS)ranlib" \
++# CC_FOR_BUILD="$(HOSTCC)" \
++
++
++CONFIGURE_ARGS+= \
++ --host=$(GNU_TARGET_NAME) \
++ --build=$(GNU_HOST_NAME) \
++ --prefix="/usr/share/$(PKG_NAME)" \
++ --bindir="/usr/bin" \
++ --libdir="/usr/lib" \
++ --srcdir="$(PKG_BUILD_DIR)" \
++ --sysconfdir="/etc" \
++ --with-modinstdir="/usr/lib/$(PKG_NAME)" \
++ --with-random="/dev/urandom" \
++ $(call autoconf_bool,CONFIG_FS_WITH_BUILTIN_ZRTP,zrtp) \
++ $(call autoconf_bool,CONFIG_FS_WITH_CORE_LIBEDIT_SUPPORT,core-libedit-support) \
++ $(call autoconf_bool,CONFIG_FS_WITH_FHS,fhs) \
++ $(call autoconf_bool,CONFIG_FS_WITH_APR_IPV6,ipv6) \
++ $(call autoconf_bool,CONFIG_FS_WITH_LZMA,lzma) \
++ $(call autoconf_bool,CONFIG_FS_WITH_ODBC,core-odbc-support) \
++ $(call autoconf_bool,CONFIG_FS_WITH_OPT,optimization) \
++ $(call autoconf_bool,CONFIG_FS_WITH_POSTGRESQL,core-pgsql-pkgconfig) \
++ $(call autoconf_bool,CONFIG_FS_WITH_POSTGRESQL,core-pgsql-support) \
++ $(call autoconf_bool,CONFIG_FS_WITH_SILENT_RULES,silent-rules) \
++ $(call autoconf_bool,CONFIG_FS_WITH_SRTP,srtp) \
++ $(call autoconf_bool,CONFIG_FS_WITH_SRTP_GENERIC_AESICM,generic-aesicm) \
++ $(call autoconf_bool,CONFIG_FS_WITH_SRTP_KERNEL_LINUX,kernel-linux) \
++ $(call autoconf_bool,CONFIG_FS_WITH_SRTP_OPENSSL,openssl) \
++ $(call autoconf_bool,CONFIG_FS_WITH_STUN,stun) \
++ $(call autoconf_bool,CONFIG_FS_WITH_APR_THREADS,threads) \
++ $(call autoconf_bool,CONFIG_FS_WITH_VISIBILITY,visibility) \
++ $(call autoconf_bool,CONFIG_PACKAGE_$(PKG_NAME)-mod-spandsp && CONFIG_FS_WITH_FIXED_POINT,fixed-point) \
++ $(call autoconf_bool,CONFIG_PACKAGE_$(PKG_NAME)-mod-spandsp,builtin-tiff) \
++ $(call autoconf_bool,CONFIG_PACKAGE_$(PKG_NAME)-mod-timerfd,timerfd-wrapper) \
++ $(if $(CONFIG_FS_WITH_ODBC),--with-odbc-lib="$(STAGING_DIR)/usr/lib") \
++ $(if $(CONFIG_FS_WITH_ODBC),--with-odbc="$(STAGING_DIR)/usr") \
++ $(if $(CONFIG_FS_WITH_OGG),--with-ogg="$(STAGING_DIR)/usr") \
++ $(if $(CONFIG_FS_WITH_OPENSSL),--with-openssl="pkg-config") \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-mod-erlang-event),--with-erlang="$(CONFIG_FS_WITH_ERLANG)",--without-erlang) \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-mod-java),--with-java="$(STAGING_DIR)/usr",--without-java) \
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-mod-python),--with-python="$(CONFIG_FS_WITH_PYTHON)",--without-python) \
++ $(if ($(CONFIG_PACKAGE_$(PKG_NAME)-mod-curl)|$(CONFIG_PACKAGE_$(PKG_NAME)-mod-xml-cdr)|$(CONFIG_PACKAGE_$(PKG_NAME)-mod-xml-curl)),--with-libcurl="$(STAGING_DIR)/usr",--without-libcurl) \
++ --with$(if $(CONFIG_FS_WITH_MYSQL),,out)-mysql \
++ --with$(if $(CONFIG_FS_WITH_POSTGRESQL),,out)-pgsql \
++ --with$(if $(CONFIG_FS_WITH_SQLITE2),,out)-sqlite2 \
++ --with$(if $(CONFIG_FS_WITH_SQLITE3),,out)-sqlite3 \
++
++
++ifeq ($(CONFIG_TARGET_ARCH_PACKAGES),"kirkwood")
++ CONFIGURE_ARGS+= --enable-arm5e-asm \
++
++endif
++
++
++#ifeq ($(CONFIG_LIBC),"uClibc")
++ifeq ($(CONFIG_ARCH),"mips")
++ CONFIGURE_VARS+= \
++ ac_cv_file_dbd_apr_dbd_mysql_c="no" \
++
++endif
++#endif
++
++
++#CONFIGURE_VARS+= \
++# config_TARGET_CC="$(TOOLCHAIN_DIR)/bin/$(TARGET_CC)" \
++# config_TARGET_CXX="$(TOOLCHAIN_DIR)/bin/$(TARGET_CXX)" \
++# config_TARGET_CFLAGS="$(FS_TARGET_CPPFLAGS) $(FS_TARGET_CFLAGS)" \
++# config_TARGET_CXXFLAGS="$(FS_TARGET_CPPFLAGS) $(FS_TARGET_CXXFLAGS)" \
++# config_TARGET_CPPFLAGS="$(FS_TARGET_CPPFLAGS)" \
++# config_TARGET_READLINE_INC="$(FS_TARGET_CPPFLAGS)" \
++# config_TARGET_READLINE_LIBS="-lreadline -lncurses" \
++# config_TARGET_LIBS="-lpthread -ldl" \
++# config_BUILD_CC="$(HOSTCC)" \
++# CC_FOR_BUILD="$(HOSTCC)" \
++# BUILDTOOL_CC="$(HOSTCC)" \
++# BUILDTOOL_CCLD="$(HOSTCC)" \
++# CC="$(TOOLCHAIN_DIR)/bin/$(TARGET_CC)" \
++# CXX="$(TOOLCHAIN_DIR)/bin/$(TARGET_CXX)" \
++# AR="$(TOOLCHAIN_DIR)/bin/$(TARGET_CROSS)ar" \
++# RANLIB="$(TOOLCHAIN_DIR)/bin/$(TARGET_CROSS)ranlib" \
++# CFLAGS="$(FS_TARGET_CPPFLAGS) $(FS_TARGET_CFLAGS)" \
++# CXXFLAGS="$(FS_TARGET_CPPFLAGS) $(FS_TARGET_CXXFLAGS)" \
++# CPPFLAGS="$(FS_TARGET_CPPFLAGS)" \
++# LDFLAGS="-L$(STAGING_DIR)/usr/lib/perl5/$(PERL_VERSION)/CORE -Wl,-rpath-link=\"$(STAGING_DIR)/usr/lib\" -Wl,-rpath-link=\"$(STAGING_DIR)/usr/lib$(if $(CONFIG_PACKAGE_$(PKG_NAME)-mod-perl),/perl5/$(PERL_VERSION)/CORE)\" -Wl,-rpath,/usr/lib -Wl,-rpath,/usr/lib$(if $(CONFIG_PACKAGE_$(PKG_NAME)-mod-perl),/perl5/$(PERL_VERSION)/CORE -lperl -lpthread -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc)" \
++# HOST_CC="/usr/bin/cc" \
++# HOST_CXX="/usr/bin/g++" \
++# CROSS_COMPILE="1" \
++# $(if $(CONFIG_FS_WITH_APR_SCTP),ac_cv_header_netinet_sctp_h="yes") \
++# ac_cv_file_dbd_apr_dbd_mysql_c="no" \
++
++
++define Build/Prepare
++ $(call Build/Prepare/Default)
++ $(call Prepare/event-zmq)
++ $(call Prepare/json-cdr)
++ $(call Prepare/mongo)
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-sounds-en-08KHz),$(call Prepare/sounds-en-08KHz))
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-sounds-en-16KHz),$(call Prepare/sounds-en-16KHz))
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-sounds-en-32KHz),$(call Prepare/sounds-en-32KHz))
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-sounds-en-48KHz),$(call Prepare/sounds-en-48KHz))
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-sounds-moh-08KHz),$(call Prepare/sounds-moh-08KHz))
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-sounds-moh-16KHz),$(call Prepare/sounds-moh-16KHz))
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-sounds-moh-32KHz),$(call Prepare/sounds-moh-32KHz))
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-sounds-moh-48KHz),$(call Prepare/sounds-moh-48KHz))
++ifeq ($(CONFIG_FS_WITH_LOCAL_SOURCE),y)
++ (cd $(PKG_BUILD_DIR); $(if $(CONFIG_FS_WITH_LATEST_HEAD),if $(QUILT_CMD) top > /dev/null 2>&1 && [ -f $(PKG_BUILD_DIR)/patches/series ]; then $(QUILT_CMD) pop -a; fi; git pull;) if $(QUILT_CMD) next > /dev/null 2>&1; then $(QUILT_CMD) push -a; fi)
++endif
++ (cd $(PKG_BUILD_DIR); $(AM_TOOL_PATHS) ./bootstrap.sh)
++endef
++
++
++define Build/Configure
++ $(foreach m,$(FS_MOD_AVAILABLE),
++ $(if $(CONFIG_PACKAGE_$(PKG_NAME)-mod-$(m)),
++ $(SED) 's|^[ #]*\([^#]*/mod_$(subst -,_,$(m))\)$$$$|\1|g' $(PKG_BUILD_DIR)/modules.conf
++ ,
++ $(SED) 's|^\([^#]*/mod_$(subst -,_,$(m))\)$$$$|#\1|g' $(PKG_BUILD_DIR)/modules.conf
++ )
++ )
++ $(call Build/Configure/Default)
++endef
++
++
++define Build/Compile
++ $(call Build/Compile/Default, \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ all $(MAKE_INSTALL_TARGETS) \
++ )
++ $(SED) 's|^\([ \t]*\)\(.*\)"mod_console"\(.*\)$$$$|\1<!-- \2"mod_console"\3 -->|' $(PKG_INSTALL_DIR)/etc/$(PKG_NAME)/autoload_configs/modules.conf.xml
++ $(SED) 's|^\([ \t]*\)<!-- *\(.*\)"mod_syslog"\(.*\) *-->\(.*\)$$$$|\1\2"mod_syslog"\3\4|' $(PKG_INSTALL_DIR)/etc/$(PKG_NAME)/autoload_configs/modules.conf.xml
++endef
++
++
++define Package/$(PKG_NAME)/install
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_DIR) $(1)/etc/default
++ $(INSTALL_DIR) $(1)/etc/$(PKG_NAME)
++ $(INSTALL_DIR) $(1)/etc/$(PKG_NAME)/scripts
++ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_DIR) $(1)/usr/lib
++ $(INSTALL_DIR) $(1)/usr/lib/pkgconfig
++ $(INSTALL_BIN) ./files/$(PKG_NAME).init $(1)/etc/init.d/$(PKG_NAME)
++ $(INSTALL_DATA) ./files/$(PKG_NAME).config $(1)/etc/config/$(PKG_NAME)
++ $(INSTALL_DATA) ./files/$(PKG_NAME).default $(1)/etc/default/$(PKG_NAME)
++ $(INSTALL_DATA) ./files/$(PKG_NAME).hotplug $(1)/etc/hotplug.d/iface/90-$(PKG_NAME)
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/$(PKG_NAME) $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/lib$(PKG_NAME)* $(1)/usr/lib/
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/$(PKG_NAME).pc $(1)/usr/lib/pkgconfig/
++ $(if $(1)/usr/lib/lib$(PKG_NAME).la,$(STAGING_DIR_HOST)/bin/sed -i -re 's|$(STAGING_DIR)||g;s|$(TOOLCHAIN_DIR)||g;s|$(TARGET_CROSS)|usr|g;s|$(REAL_GNU_TARGET_NAME)|usr|g;s|-L$(PKG_BUILD_DIR)(.*)libzrtp ||g;:a;s|((-[IL]/\S+\s).*)\2|\1|;ta' $(1)/usr/lib/lib$(PKG_NAME).la)
++endef
++
++
++define Package/$(PKG_NAME)-collection-upstream-defaults/install
++ $(INSTALL_DIR) $(1)/etc/$(PKG_NAME)
++endef
++
++
++define Package/$(PKG_NAME)-example-config/install
++ $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/examples/conf
++ $(CP) $(PKG_INSTALL_DIR)/etc/$(PKG_NAME)/* $(1)/usr/share/$(PKG_NAME)/examples/conf/
++endef
++
++
++define Package/$(PKG_NAME)-config-upstream-defaults/install
++ $(INSTALL_DIR) $(1)/etc/$(PKG_NAME)
++ $(CP) $(PKG_INSTALL_DIR)/etc/$(PKG_NAME) $(1)/etc
++endef
++
++
++define Package/$(PKG_NAME)-collection-minimal/install
++ $(INSTALL_DIR) $(1)/etc/$(PKG_NAME)
++endef
++
++
++define Package/$(PKG_NAME)-collection-uci-minimal/install
++ $(INSTALL_DIR) $(1)/etc/$(PKG_NAME)
++endef
++
++
++define Package/$(PKG_NAME)-config-minimal/install
++ $(INSTALL_DIR) $(1)/etc/$(PKG_NAME)/autoload_configs
++
++ #
++ # Copying dialplan directory jingle_profiles sip_profiles $(PKG_NAME).xml
++ # fur_elise.ttml mime.types tetris.ttml tones.conf vars.xml
++ #
++ $(foreach f,dialplan directory jingle_profiles sip_profiles $(PKG_NAME).xml fur_elise.ttml mime.types tetris.ttml vars.xml,$(if $(PKG_BUILD_DIR)/conf/vanilla/$(f),$(CP) $(PKG_BUILD_DIR)/conf/vanilla/$(f) $(1)/etc/$(PKG_NAME);))
++
++ #
++ # Copying acl ivr modules post_load_modules switch timezones
++ #
++ $(foreach f,acl ivr modules post_load_modules switch timezones,$(if $(PKG_BUILD_DIR)/conf/vanilla/autoload_configs/$(f).conf.xml,$(CP) $(PKG_BUILD_DIR)/conf/vanilla/autoload_configs/$(f).conf.xml $(1)/etc/$(PKG_NAME)/autoload_configs;))
++endef
++
++
++define Package/$(PKG_NAME)-sounds-en-08KHz/install
++ #
++ # sounds-en-8KHz
++ #
++ for dir in `(cd $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/en/us/callie;ls)`; \
++ do \
++ [ -d $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/8000 ] || $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/8000; \
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/8000/* $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/8000; \
++ done
++endef
++
++
++define Package/$(PKG_NAME)-sounds-en-16KHz/install
++ #
++ # sounds-en-16KHz
++ #
++ for dir in `(cd $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/en/us/callie;ls)`; \
++ do \
++ [ -d $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/16000 ] || $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/16000; \
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/16000/* $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/16000; \
++ done
++endef
++
++
++define Package/$(PKG_NAME)-sounds-en-32KHz/install
++ #
++ # sounds-en-32KHz
++ #
++ for dir in `(cd $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/en/us/callie;ls)`; \
++ do \
++ [ -d $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/32000 ] || $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/32000; \
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/32000/* $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/32000; \
++ done
++endef
++
++
++define Package/$(PKG_NAME)-sounds-en-48KHz/install
++ #
++ # sounds-en-48KHz
++ #
++ for dir in `(cd $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/en/us/callie;ls)`; \
++ do \
++ [ -d $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/48000 ] || $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/48000; \
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/48000/* $(1)/usr/share/$(PKG_NAME)/sounds/en/us/callie/$$$${dir}/48000; \
++ done
++endef
++
++
++define Package/$(PKG_NAME)-sounds-moh-08KHz/install
++ #
++ # sounds-moh-8KHz
++ #
++ [ -d $(1)/usr/share/$(PKG_NAME)/sounds/music/8000 ] || $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/sounds/music/8000;
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/music/8000 $(1)/usr/share/$(PKG_NAME)/sounds/music;
++endef
++
++
++define Package/$(PKG_NAME)-sounds-moh-16KHz/install
++ #
++ # sounds-moh-16KHz
++ #
++ [ -d $(1)/usr/share/$(PKG_NAME)/sounds/music/16000 ] || $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/sounds/music/16000;
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/music/16000 $(1)/usr/share/$(PKG_NAME)/sounds/music;
++endef
++
++
++define Package/$(PKG_NAME)-sounds-moh-32KHz/install
++ #
++ # sounds-moh-32KHz
++ #
++ [ -d $(1)/usr/share/$(PKG_NAME)/sounds/music/32000 ] || $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/sounds/music/32000;
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/music/32000 $(1)/usr/share/$(PKG_NAME)/sounds/music;
++endef
++
++
++define Package/$(PKG_NAME)-sounds-moh-48KHz/install
++ #
++ # sounds-moh-48KHz
++ #
++ [ -d $(1)/usr/share/$(PKG_NAME)/sounds/music/48000 ] || $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/sounds/music/48000;
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/$(PKG_NAME)/sounds/music/48000 $(1)/usr/share/$(PKG_NAME)/sounds/music;
++endef
++
++
++define Package/$(PKG_NAME)-tools/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/fs_cli $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/fs_encode $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/fs_ivrd $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/fsxs $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/gentls_cert $(1)/usr/bin/
++ $(CP) $(PKG_INSTALL_DIR)/usr/bin/tone2wav $(1)/usr/bin/
++ $(STAGING_DIR_HOST)/bin/sed -i -re 's|$(ICONV_LDFLAGS)||g;s|$(INTL_LDFLAGS)||g;s|$(PKG_BUILD_DIR)|/usr|g;s|$(STAGING_DIR)||g;s|$(STAGING_DIR_HOST)|/usr|g;s|$(TOOLCHAIN_DIR)||g;s|$(TARGET_CROSS)|usr|g;s|$(REAL_GNU_TARGET_NAME)|usr|g;:a;s|((-[IL]/\S+\s).*)[ ,\n]\1|\1|;ta' $(1)/usr/bin/fsxs
++endef
++
++
++# 1. Name
++# 2. Title
++# 3. Selection on module configuration file
++# 4. Files (module files include different names)
++# 5. Files (supporting files include different names)
++# 6. Inter module depends
++# 7. Extra depends
++#
++define BuildPlugin
++ define Package/$(PKG_NAME)-mod-$(1)
++ $$(call Package/$(PKG_NAME)/Default)
++ TITLE:= FS $(2) module
++ DEPENDS:= $(PKG_NAME) $(foreach m,$(6),+$(PKG_NAME)-mod-$(m)) $(7)
++ endef
++
++ define Package/$(PKG_NAME)-mod-$(1)/install
++ [ -z "mod_$(subst -,_,$(1))" ] || $(INSTALL_DIR) $$(1)/usr/lib/$(PKG_NAME)
++
++ for f in $$$$(realpath $$$$(wildcard $(PKG_INSTALL_DIR)/usr/lib/$(PKG_NAME)/mod_$(subst -,_,$(1)).*)) $$$$(wildcard $(PKG_INSTALL_DIR)/usr/lib/$(PKG_NAME)/$(4)_*); \
++ do \
++ $(CP) $$$$$$$${f} $$(1)/usr/lib/$(PKG_NAME)/; \
++ done
++
++ #
++ # mod_$(subst -,_,$(1)): $(5)
++ #
++ $(foreach f,$(5),[ -d $(dir $$(1)/usr/${f}) ] || $(INSTALL_DIR) $(dir $$(1)/usr/${f});$(CP) $$$$(wildcard $(PKG_INSTALL_DIR)/usr/${f}*) $(dir $$(1)/usr/${f});)
++
++ #
++ # mod_$(subst -,_,$(1)): Clean installed library control files from referencig to OpenWRT PATH.
++ #
++ $(STAGING_DIR_HOST)/bin/sed -i -re 's|$(STAGING_DIR)||g;s|$(TOOLCHAIN_DIR)||g;s|$(TARGET_CROSS)|usr|g;s|$(REAL_GNU_TARGET_NAME)|usr|g;s|-L$(PKG_BUILD_DIR)(.*)libzrtp ||g;s|-L$(PKG_BUILD_DIR)(.*)libtiff ||g;:a;s|((-[IL]/\S+\s).*)\2|\1|;ta' $(foreach l,`find $$(1)/usr/lib -name "*.la" -print`,$(l))
++
++ #
++ # 1. mod_$(subst -,_,$(1)) XML configuration files from: $$$$(patsubst $(PKG_BUILD_DIR)/%,%,$$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/conf/$(3)/autoload_configs/$(subst -,_,$(1)).conf.xml)))
++ #
++ $$$$(if $$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/conf/$(3)/autoload_configs/$(subst -,_,$(1)).conf.xml)),[ -d $$(1)/etc/$(PKG_NAME)/autoload_configs ] || $(INSTALL_DIR) $$(1)/etc/$(PKG_NAME)/autoload_configs;$(CP) $$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/conf/$(3)/autoload_configs/$(subst -,_,$(1)).conf.xml)) $$(1)/etc/$(PKG_NAME)/autoload_configs;$(SED) 's|/usr/local/lib|/usr/lib|g;s|/usr/local|/etc|g' $$(1)/etc/$(PKG_NAME)/autoload_configs/$(subst -,_,$(1)).conf.xml)
++
++ #
++ # 2. mod_$(subst -,_,$(1)) XML configuration files from: $$$$(patsubst $(PKG_BUILD_DIR)/%,%,$$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/$(3)/$(1)/*/$(subst -,_,$(1)).conf.xml)))
++ #
++ $$$$(if $$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/$(3)/$(1)/*/$(subst -,_,$(1)).conf.xml)),[ -d $$(1)/etc/$(PKG_NAME)/autoload_configs ] || $(INSTALL_DIR) $$(1)/etc/$(PKG_NAME)/autoload_configs;$(CP) $$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/$(3)/$(1)/*/$(subst -,_,$(1)).conf.xml)) $$(1)/etc/$(PKG_NAME)/autoload_configs;$(SED) 's|/usr/local/lib|/usr/lib|g;s|/usr/local|/etc|g' $$(1)/etc/$(PKG_NAME)/autoload_configs/$(subst -,_,$(1)).conf.xml)
++
++ #
++ # 3. mod_$(subst -,_,$(1)) XML configuration files from: $$$$(patsubst $(PKG_BUILD_DIR)/%,%,$$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/src/$(3)/*/mod_$(subst -,_,$(1))/conf/autoload_configs/$(subst -,_,$(1)).conf.xml)))
++ #
++ $$$$(if $$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/src/$(3)/*/mod_$(subst -,_,$(1))/conf/autoload_configs/$(subst -,_,$(1)).conf.xml)),[ -d $$(1)/etc/$(PKG_NAME)/autoload_configs ] || $(INSTALL_DIR) $$(1)/etc/$(PKG_NAME)/autoload_configs;$(CP) $$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/src/$(3)/*/mod_$(subst -,_,$(1))/conf/autoload_configs/$(subst -,_,$(1)).conf.xml)) $$(1)/etc/$(PKG_NAME)/autoload_configs;$(SED) 's|/usr/local/lib|/usr/lib|g;s|/usr/local|/etc|g' $$(1)/etc/$(PKG_NAME)/autoload_configs/$(subst -,_,$(1)).conf.xml)
++
++ #
++ # 4. mod_$(subst -,_,$(1)) XML configuration files from: $$$$(patsubst $(PKG_BUILD_DIR)/%,%,$$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/src/$(3)/*/mod_$(subst -,_,$(1))/conf*/$(subst -,_,$(1)).conf.xml)))
++ #
++ $$$$(if $$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/src/$(3)/*/mod_$(subst -,_,$(1))/conf*/$(subst -,_,$(1)).conf.xml)),[ -d $$(1)/etc/$(PKG_NAME)/autoload_configs ] || $(INSTALL_DIR) $$(1)/etc/$(PKG_NAME)/autoload_configs;$(CP) $$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/src/$(3)/*/mod_$(subst -,_,$(1))/conf*/$(subst -,_,$(1)).conf.xml)) $$(1)/etc/$(PKG_NAME)/autoload_configs;$(SED) 's|/usr/local/lib|/usr/lib|g;s|/usr/local|/etc|g' $$(1)/etc/$(PKG_NAME)/autoload_configs/$(subst -,_,$(1)).conf.xml)
++
++ #
++ # 5. mod_$(subst -,_,$(1)) XML configuration files from: $$$$(patsubst $(PKG_BUILD_DIR)/%,%,$$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/src/$(3)/*/mod_$(subst -,_,$(1))/$(subst -,_,$(1)).conf.xml)))
++ #
++ $$$$(if $$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/src/$(3)/*/mod_$(subst -,_,$(1))/$(subst -,_,$(1)).conf.xml)),[ -d $$(1)/etc/$(PKG_NAME)/autoload_configs ] || $(INSTALL_DIR) $$(1)/etc/$(PKG_NAME)/autoload_configs;$(CP) $$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/src/$(3)/*/mod_$(subst -,_,$(1))/$(subst -,_,$(1)).conf.xml)) $$(1)/etc/$(PKG_NAME)/autoload_configs;$(SED) 's|/usr/local/lib|/usr/lib|g;s|/usr/local|/etc|g' $$(1)/etc/$(PKG_NAME)/autoload_configs/$(subst -,_,$(1)).conf.xml)
++
++ #
++ # 6. Additional configuration files for mod_$(subst -,_,$(1)) from: $$$$(patsubst $(PKG_BUILD_DIR)/%,%,$$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/conf/$(3)/$(1)/*.$(1))))
++ #
++ $$$$(if $$$$(firstword $$$$(wildcard $(PKG_BUILD_DIR)/conf/$(3)/$(1)/*.$(1))),[ -d $$(1)/etc/$(PKG_NAME)/$(1) ] || $(INSTALL_DIR) $$(1)/etc/$(PKG_NAME)/$(1);$(CP) $(PKG_BUILD_DIR)/conf/$(3)/$(1) $$(1)/etc/$(PKG_NAME))
++ endef
++
++ define Package/$(PKG_NAME)-mod-$(1)/postinst
++#!/bin/sh
++sed -i -e 's|^\([ \t]*\)<!-- *\(.*\)"mod_$(subst -,_,$(1))"\(.*\) *-->\(.*\)$$$$|\1\2"mod_$(subst -,_,$(1))"\3\4|' $$$${IPKG_INSTROOT}/etc/$(PKG_NAME)/autoload_configs/modules.conf.xml
++ endef
++
++ define Package/$(PKG_NAME)-mod-$(1)/prerm
++#!/bin/sh
++sed -i -e 's|^\([ \t]*\)\(.*\)"mod_$(subst -,_,$(1))"\(.*\)$$$$|\1<!-- \2"mod_$(subst -,_,$(1))"\3 -->|' $$$${IPKG_INSTROOT}/etc/$(PKG_NAME)/autoload_configs/modules.conf.xml
++ endef
++
++ $$(eval $$(call BuildPackage,$(PKG_NAME)-mod-$(1)))
++endef
++
++
++$(eval $(call BuildPackage,$(PKG_NAME)))
++$(eval $(call BuildPackage,$(PKG_NAME)-collection-upstream-defaults))
++$(eval $(call BuildPackage,$(PKG_NAME)-collection-minimal))
++$(eval $(call BuildPackage,$(PKG_NAME)-sounds-en-08KHz))
++$(eval $(call BuildPackage,$(PKG_NAME)-sounds-en-16KHz))
++$(eval $(call BuildPackage,$(PKG_NAME)-sounds-en-32KHz))
++$(eval $(call BuildPackage,$(PKG_NAME)-sounds-en-48KHz))
++$(eval $(call BuildPackage,$(PKG_NAME)-sounds-moh-08KHz))
++$(eval $(call BuildPackage,$(PKG_NAME)-sounds-moh-16KHz))
++$(eval $(call BuildPackage,$(PKG_NAME)-sounds-moh-32KHz))
++$(eval $(call BuildPackage,$(PKG_NAME)-sounds-moh-48KHz))
++$(eval $(call BuildPackage,$(PKG_NAME)-tools))
++$(eval $(call BuildPackage,$(PKG_NAME)-example-config))
++$(eval $(call BuildPackage,$(PKG_NAME)-config-upstream-defaults))
++$(eval $(call BuildPackage,$(PKG_NAME)-config-minimal))
++
++
++#
++# $(eval $(call BuildPlugin,Name,Title,Selection on module Conf File,Files,Inter Depends,Extra Depends))
++#
++$(eval $(call BuildPlugin,abstraction,An Abstraction To API Call,vanilla,,,,))
++$(eval $(call BuildPlugin,alsa,Alsa Endpoint,vanilla,,,,+FS_WITH_ALSA:alsa-lib @FS_WITH_ALSA))
++$(eval $(call BuildPlugin,amr,Adaptive Multi-Rate On Bandwidth Codec,vanilla,,,,))
++$(eval $(call BuildPlugin,amrwb,Wide Band AMR,vanilla,,,,))
++$(eval $(call BuildPlugin,av,FS Video Codec / File Format,vanilla,,,,@BROKEN))
++$(eval $(call BuildPlugin,avmd,Advanced Voice Mail Detection,vanilla,,,,))
++$(eval $(call BuildPlugin,basic,BASIC,vanilla,,,,))
++$(eval $(call BuildPlugin,bert,Naive Bit Error Rate Tester,vanilla,,,,))
++$(eval $(call BuildPlugin,blacklist,Blacklist,vanilla,,,,))
++$(eval $(call BuildPlugin,bv,BroadVoice 16/32-bit Audio Codec,vanilla,,,,@BROKEN)) # Requires unsupported libbroadvoice
++$(eval $(call BuildPlugin,callcenter,Call Center,vanilla,,,,))
++$(eval $(call BuildPlugin,cdr-csv,CSV-CDR Handler,mod,,,,)) # ~/conf
++$(eval $(call BuildPlugin,cdr-mongodb,MongoDB CDR logger,vanilla,,,,))
++$(eval $(call BuildPlugin,cdr-pg-csv,PostgreSQL CDR Handler,vanilla,,,,+coreutils +FS_WITH_POSTGRESQL:libpq @FS_WITH_POSTGRESQL))
++$(eval $(call BuildPlugin,cdr-sqlite,SQLite3 CDR Handler,vanilla,,,,@FS_WITH_SQLITE3))
++$(eval $(call BuildPlugin,cepstral,Cepstral Interface,vanilla,,,,@BROKEN)) # needs <swift.h>
++$(eval $(call BuildPlugin,cidlookup,Data Query For CID->NAME Services,mod,,,,+libcurl)) # ~/conf
++$(eval $(call BuildPlugin,cluechoo,Framework Demo,vanilla,,,,))
++$(eval $(call BuildPlugin,codec2,CoDec 2,,,,,@BROKEN)) # Requires unsupported libcodec2
++$(eval $(call BuildPlugin,commands,API Commands,vanilla,,,,))
++$(eval $(call BuildPlugin,conference,Conference Room,vanilla,,,,))
++$(eval $(call BuildPlugin,console,Console Logger,vanilla,,,,))
++$(eval $(call BuildPlugin,curl,HTTP Request,vanilla,,,,+libcurl))
++$(eval $(call BuildPlugin,cv,Detect Video motion,vanilla,,,,@BROKEN))
++$(eval $(call BuildPlugin,dahdi-codec,DAHDI Codecs,vanilla,,,,))
++$(eval $(call BuildPlugin,db,Database Backend,vanilla,,,,+libdb47))
++$(eval $(call BuildPlugin,dialplan-asterisk,Asterisk Dialplan Parser,vanilla,,,,))
++$(eval $(call BuildPlugin,dialplan-directory,Dialplan Directory,vanilla,,,,))
++$(eval $(call BuildPlugin,dialplan-xml,Dialplan-XML Interface,vanilla,,,,))
++$(eval $(call BuildPlugin,dingaling,Jabber Interface,vanilla,,,,+libopenssl))
++$(eval $(call BuildPlugin,directory,Search By Name Directory IVR,vanilla,,,,))
++$(eval $(call BuildPlugin,distributor,Simple Robin-Round Load,vanilla,,,,))
++$(eval $(call BuildPlugin,dptools,Dialplan Tools,vanilla,,,,))
++$(eval $(call BuildPlugin,easyroute,Simple DID Routing,vanilla,,,,))
++$(eval $(call BuildPlugin,enum,ENUM Routing,,,,,+libldns))
++$(eval $(call BuildPlugin,erlang-event,Erlang Event Handler,vanilla,,,,+erlang))
++$(eval $(call BuildPlugin,esf,Extra SIP Functionality,vanilla,,,,))
++$(eval $(call BuildPlugin,esl,Allow to generate remote ESL commands,vanilla,,,,@BROKEN))
++$(eval $(call BuildPlugin,event-multicast,Multicast Event Handler,vanilla,,,,))
++$(eval $(call BuildPlugin,event-socket,Socket Event Handler,vanilla,,,,))
++$(eval $(call BuildPlugin,event-zmq,Socket Event Handler By Zero MQ,vanilla,,,,+libuuid))
++$(eval $(call BuildPlugin,expr,Expression Evaluation,vanilla,,,,))
++$(eval $(call BuildPlugin,fifo,FIFO,vanilla,,,,))
++$(eval $(call BuildPlugin,file-string,Streaming Multiple Sound Files Sequentially,vanilla,,,,@OBSOLETE)) # merged into dptools
++$(eval $(call BuildPlugin,flite,Festival TTS,vanilla,,,,+flite @BROKEN)) # flite is from old package and/or qi repo
++$(eval $(call BuildPlugin,format-cdr,XML CDR Module to files or curl,vanilla,,,,))
++$(eval $(call BuildPlugin,fsk,Bell-202 1200-Baud FSK Decoder,vanilla,,,,))
++$(eval $(call BuildPlugin,fsv,Video Player / Recorder,vanilla,,,,+libyuv @BROKEN)) # Requires unsupported libyuv.
++$(eval $(call BuildPlugin,g723-1,G.723.1 Codec,vanilla,,,,))
++$(eval $(call BuildPlugin,g729,G.729 Codec,vanilla,,,,))
++$(eval $(call BuildPlugin,gsmopen,GSM Modem compatible Endpoint,mod,,,alsa,+FS_WITH_ALSA:alsa-lib +FS_WITH_LZMA:liblzma @FS_WITH_ALSA @BROKEN)) # needs gsmlib
++$(eval $(call BuildPlugin,h26x,H26X Linear Codec,vanilla,,,,))
++$(eval $(call BuildPlugin,h323,H323 Endpoint,mod,,,,@BROKEN)) # Req. H323Plus v1.24.x or newer
++$(eval $(call BuildPlugin,hash,API For Manipulating A Hash Table,vanilla,,,,))
++$(eval $(call BuildPlugin,hiredis,Redis DB access,vanilla,,,,+hiredis @BROKEN))
++#$(eval $(call BuildPlugin,html5,HTML5 Endpoint Module,vanilla,,,,)) # defunct?
++$(eval $(call BuildPlugin,httapi,HT Telephony API and HTTP Caching,mod,,,,)) # ~/conf
++$(eval $(call BuildPlugin,http-cache,HTTP GET With Caching,mod,,,,+libcurl)) # ~/conf
++$(eval $(call BuildPlugin,ilbc,ILBC Codec,vanilla,,,,+libilbc @BROKEN)) # Requires unsupported libilbc.
++$(eval $(call BuildPlugin,isac,iSAC Codec,vanilla,,,,))
++$(eval $(call BuildPlugin,java,Java Language Interface,vanilla,,,,@BROKEN)) # needs java
++$(eval $(call BuildPlugin,json-cdr,JSon-CDR Interface,mod,,,,+libcurl))
++$(eval $(call BuildPlugin,kazoo,Socket Controlled Event Handler,vanilla,,,,+erlang))
++$(eval $(call BuildPlugin,ldap,LDAP interface,vanilla,,,,+libopenldap))
++$(eval $(call BuildPlugin,lcr,Least Cost Routing,vanilla,,,,))
++$(eval $(call BuildPlugin,local-stream,Multi-Channel On Same Stream,vanilla,,,,))
++$(eval $(call BuildPlugin,logfile,File Logger,vanilla,,,,))
++$(eval $(call BuildPlugin,loopback,Loopback to Dialplan Endpoint,vanilla,,,,))
++$(eval $(call BuildPlugin,lua,LUA Language Interface,vanilla,,,,+liblua))
++$(eval $(call BuildPlugin,managed,Media Switching Software Library,vanilla,,,,+glib2 @BROKEN)) # needs Mono
++$(eval $(call BuildPlugin,memcache,MemCached Interface,vanilla,,,,+libmemcached @BROKEN)) # Req host libmemcached
++$(eval $(call BuildPlugin,mongo,A Document-Oriented Database,vanilla,,,,@BROKEN))
++$(eval $(call BuildPlugin,mp4,MP4 File Format Support For Video,vanilla,,,,@BROKEN)) # needs host libmp4v2
++$(eval $(call BuildPlugin,mp4v,MP4 CoDec Support For Video,vanilla,,,,))
++$(eval $(call BuildPlugin,native-file,WAV Format Sound Player,vanilla,,,,))
++$(eval $(call BuildPlugin,nibblebill,Credit / Debit Billing,vanilla,,,,))
++$(eval $(call BuildPlugin,opus,Opus CoDec,vanilla,,,,+libopus))
++$(eval $(call BuildPlugin,oreka,Media Recording with Oreka,vanilla,,,,))
++$(eval $(call BuildPlugin,perl,Perl Language Interface,vanilla,,lib/perl5/$(PERL_VERSION)/$(PKG_NAME).la lib/perl5/$(PERL_VERSION)/$(PKG_NAME).pm lib/perl5/$(PERL_VERSION)/$(PKG_NAME).so,,+perl +libdb47 +libgdbm @BROKEN))
++$(eval $(call BuildPlugin,portaudio,Portaudio To Sound Card Interface,vanilla,,,alsa,+FS_WITH_ALSA:alsa-lib @FS_WITH_ALSA @BROKEN)) # needs portaudio
++$(eval $(call BuildPlugin,portaudio-stream,Portaudio Streaming Interface,vanilla,,,alsa,+FS_WITH_ALSA:alsa-lib @FS_WITH_ALSA @BROKEN)) # needs portaudio
++$(eval $(call BuildPlugin,posix-timer,POSIX Compliant Soft Timer,vanilla,,,,))
++$(eval $(call BuildPlugin,python,Python Language Interface,vanilla,,,,python @BROKEN))
++$(eval $(call BuildPlugin,radius-cdr,Radius-CDR interface,vanilla,,,,@BROKEN)) # fails in freeradius-client
++$(eval $(call BuildPlugin,rayo,Rayo server & node implementation,vanilla,,,,))
++$(eval $(call BuildPlugin,redis,Redis limit backend,vanilla,,,,))
++$(eval $(call BuildPlugin,rss,RRS Feeds via TTS,vanilla,,,,))
++$(eval $(call BuildPlugin,rtc,RTC endpoint,vanilla,,,,))
++$(eval $(call BuildPlugin,rtmp,RTMP Protocol Handler,vanilla,,,,))
++$(eval $(call BuildPlugin,sangoma-codec,Sangoma Codec,vanilla,,,,@BROKEN)) # Req. Sangoma CoDec source
++$(eval $(call BuildPlugin,say-de,German Say,vanilla,,,,))
++$(eval $(call BuildPlugin,say-en,English Say,vanilla,,,,))
++$(eval $(call BuildPlugin,say-es,Spanish Say,vanilla,,,,))
++$(eval $(call BuildPlugin,say-fa,Persian Say,vanilla,,,,))
++$(eval $(call BuildPlugin,say-fr,French Say,vanilla,,,,))
++$(eval $(call BuildPlugin,say-hu,Hungarian Say,vanilla,,,,))
++$(eval $(call BuildPlugin,say-it,Italian Say,vanilla,,,,))
++$(eval $(call BuildPlugin,say-nl,Dutch Say,vanilla,,,,))
++$(eval $(call BuildPlugin,say-pt,Portugeese Say,vanilla,,,,))
++$(eval $(call BuildPlugin,say-ru,Russian Say,vanilla,,,,))
++$(eval $(call BuildPlugin,say-th,Thai Say,vanilla,,,,))
++$(eval $(call BuildPlugin,say-zh,Chineese Say,vanilla,,,,))
++$(eval $(call BuildPlugin,shell-stream,Streaming Audio Through CLI,vanilla,,,,))
++$(eval $(call BuildPlugin,silk,Skype(TM) SILK Codec Module,vanilla,,,,+libsilk @BROKEN)) # Requires unsupported libsilk
++$(eval $(call BuildPlugin,siren,G.722.1 Codec,vanilla,,,,+libg7221 @BROKEN)) # Requires unsupported libg7221
++$(eval $(call BuildPlugin,skel,Template For New Module,vanilla,,,,))
++$(eval $(call BuildPlugin,skinny,Skinny Call Control Protocol (SCCP),vanilla,,,,))
++$(eval $(call BuildPlugin,skypopen,Skype Compatible Endpoint,mod,,,,@FEATURE_drawing-backend_libX11))
++$(eval $(call BuildPlugin,sms,SMS,vanilla,,,,))
++$(eval $(call BuildPlugin,smpp,smpp client and server implementation,vanilla,,,,@BROKEN))
++$(eval $(call BuildPlugin,snapshot,Record Audio Snapshot to File,vanilla,,,,))
++$(eval $(call BuildPlugin,sndfile,Multi-Format Sound File,vanilla,,,,+libsndfile))
++$(eval $(call BuildPlugin,snmp,SNMP AgentX Subagent,vanilla,,,,+libnetsnmp))
++$(eval $(call BuildPlugin,snom,SNOM specific features,vanilla,,,,))
++$(eval $(call BuildPlugin,sofia,SOFIA SIP,mod,,,,)) # ~/conf
++$(eval $(call BuildPlugin,sonar,Sonar Ping Timer,vanilla,,,,))
++$(eval $(call BuildPlugin,spandsp,Span DSP,mod,,,,+libjpeg +FS_WITH_LZMA:liblzma @FS_WITH_LZMA)) # ~/conf
++$(eval $(call BuildPlugin,spidermonkey,JavaScript,vanilla,,,,@BROKEN)) # fails in js
++$(eval $(call BuildPlugin,spidermonkey-core_db,JavaScript DB,vanilla,,,,@BROKEN))
++$(eval $(call BuildPlugin,spidermonkey-curl,JavaScript Curl,vanilla,,,,@BROKEN))
++$(eval $(call BuildPlugin,spidermonkey-odbc,JavaScript ODBC,vanilla,,,,@BROKEN))
++$(eval $(call BuildPlugin,spidermonkey-socket,JavaScript Socket,vanilla,,,,@BROKEN))
++$(eval $(call BuildPlugin,spidermonkey-teletone,JavaScript Teletone,vanilla,,,,@BROKEN))
++$(eval $(call BuildPlugin,spy,User Spy,vanilla,,,,))
++$(eval $(call BuildPlugin,ssml,SSML audio rendering format,mod,,,rayo,))
++$(eval $(call BuildPlugin,stress,Voice Stress Detection,vanilla,,,,))
++$(eval $(call BuildPlugin,syslog,SysLog logger,vanilla,,,,))
++$(eval $(call BuildPlugin,timerfd,Linux Kernel timerfd API,vanilla,,,,))
++$(eval $(call BuildPlugin,tone-stream,Tone Generation Stream,vanilla,,,,))
++$(eval $(call BuildPlugin,tts-commandline,ASR TTS Command Interface,vanilla,,,,))
++$(eval $(call BuildPlugin,unimrcp,UniMRCP (MRCP Client),vanilla,,,,@BROKEN))
++$(eval $(call BuildPlugin,valet-parking,Valet Parking Application,vanilla,,,,))
++$(eval $(call BuildPlugin,verto,HTML5 Verto interface,vanilla,,lib/perl5/$(PERL_VERSION)/MCAST.so lib/perl5/$(PERL_VERSION)/MCAST.la lib/perl5/$(PERL_VERSION)/MCAST.pm,perl rtc,+perl @BROKEN))
++$(eval $(call BuildPlugin,vmd,VoiceMail Beep Detection,vanilla,,,,))
++$(eval $(call BuildPlugin,voicemail,VoiceMail,vanilla,,,,))
++$(eval $(call BuildPlugin,voicemail-ivr,VoiceMail IVR,vanilla,,,,))
++$(eval $(call BuildPlugin,vpx,VP8/9 Video Codec with transcoding,vanilla,,,,+libvpx))
++$(eval $(call BuildPlugin,xml-cdr,XML-CDR Handler,vanilla,,,,+libcurl))
++$(eval $(call BuildPlugin,xml-curl,XML-Curl Gateway,vanilla,,,,+libcurl))
++$(eval $(call BuildPlugin,xml-ldap,LDAP-XML Gateway,vanilla,,,,+PACKAGE_$(PKG_NAME)-mod-ldap:libopenldap))
++$(eval $(call BuildPlugin,xml-rpc,XML-RPC Interface,vanilla,,,,))
++$(eval $(call BuildPlugin,xml-radius,Radius authentication and authorization,vanilla,,,,+freeradius-client @BROKEN)) # freeradius-client isn't yet supported by OpenWRT.
++$(eval $(call BuildPlugin,xml-scgi,SCGI XML Gateway,vanilla,,,,))
++$(eval $(call BuildPlugin,yaml,YAML language,vanilla,,,,+libyaml))
+diff --git a/feeds/telephony/net/freeswitch/files/freeswitch.config b/feeds/telephony/net/freeswitch/files/freeswitch.config
+new file mode 100644
+index 0000000..9b4ab84
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/files/freeswitch.config
+@@ -0,0 +1,11 @@
++
++config 'global' 'state'
++ option 'started' '0'
++
++config 'profile_top' 'internal_top'
++
++config 'profile_top' 'external_top'
++
++config 'external_gateway' 'external_example'
++
++
+diff --git a/feeds/telephony/net/freeswitch/files/freeswitch.default b/feeds/telephony/net/freeswitch/files/freeswitch.default
+new file mode 100644
+index 0000000..079c314
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/files/freeswitch.default
+@@ -0,0 +1,11 @@
++#FS_DIR="/opt"
++FS_DIR_ETC="$FS_DIR/etc/freeswitch"
++FS_DIR_MOD="$FS_DIR/usr/lib/freeswitch"
++FS_DIR_DB="$FS_DIR/tmp/freeswitch/db"
++FS_DIR_LOG="$FS_DIR/tmp/freeswitch/log"
++FS_DIR_SCRIPTS="$FS_DIR/usr/share/freeswitch/scripts"
++FS_DIR_HTDOCS="$FS_DIR/usr/share/freeswitch/htdocs"
++FS_DIR_RECORDINGS="/var/lib/freeswitch/recordings" # NOTE: must be changed in config as well
++FS_DIR_VM_STORAGE="/var/lib/freeswitch/storage" # NOTE: must be changed in config as well
++
++OPTIONS="-conf $FS_DIR_ETC -log $FS_DIR_LOG -db $FS_DIR_DB -mod $FS_DIR_MOD -htdocs $FS_DIR_HTDOCS -scripts $FS_DIR_SCRIPTS"
+diff --git a/feeds/telephony/net/freeswitch/files/freeswitch.hotplug b/feeds/telephony/net/freeswitch/files/freeswitch.hotplug
+new file mode 100644
+index 0000000..ef9656c
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/files/freeswitch.hotplug
+@@ -0,0 +1,65 @@
++#!/bin/sh
++
++. /lib/functions.sh
++LOAD_STATE=1
++
++if [ "$ACTION" = "ifup" ]; then
++ /etc/init.d/freeswitch enabled && {
++ local not_all_up="$(sh -c '
++ . /lib/functions.sh
++
++ LOAD_STATE=1
++ local if_is_down=0
++ local network_ignore=""
++
++ check_if_down () {
++ local cfg="$1"
++ local up
++ local proto
++ config_get_bool up "$1" up 0
++ config_get proto "$1" proto
++ if [ "$proto" != "none" ] && [ "$up" -ne 1 ]; then
++ local new_down=1
++ local oIFS="$IFS"
++ local ignore
++ IFS=" "
++ for ignore in $network_ignore; do
++ [ "$cfg" = "$ignore" ] && new_down=0
++ done
++ IFS="$oIFS"
++ [ "$new_down" = "1" ] && if_is_down=1
++ fi
++ }
++
++ append_ignore() {
++ local cfg="$1"
++ local network
++ config_get network "$1" network
++ append network_ignore "$network"
++ }
++
++ LOAD_STATE=1
++ config_load freeswitch
++ config_foreach append_ignore network_ignore
++ config_load network
++ config_foreach check_if_down interface
++
++ echo "$if_is_down"
++ ')"
++ [ "$not_all_up" = "0" ] && {
++ local started
++ {
++ mkdir -p /tmp/freeswitch
++ lock /tmp/freeswitch/.start.lck
++ config_load freeswitch
++ config_get started "state" started
++ [ "$started" != "1" ] && {
++ /etc/init.d/freeswitch start
++ uci_set_state freeswitch global state started 1
++ }
++ lock -u /tmp/freeswitch/.start.lck
++ } &
++ }
++ }
++fi
++
+diff --git a/feeds/telephony/net/freeswitch/files/freeswitch.init b/feeds/telephony/net/freeswitch/files/freeswitch.init
+new file mode 100644
+index 0000000..9329cfe
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/files/freeswitch.init
+@@ -0,0 +1,40 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2006 OpenWrt.org
++START=90
++
++DEFAULT=/etc/default/freeswitch
++OPTIONS=""
++
++#boot() {
++# # Do nothing on boot
++# exit 0
++#}
++
++start() {
++ [ -f $DEFAULT ] && . $DEFAULT
++ mkdir -p $FS_DIR_DB
++ mkdir -p $FS_DIR_LOG
++ mkdir -p $FS_DIR_RECORDINGS
++ mkdir -p $FS_DIR_VM_STORAGE
++ ulimit -s 240
++ $FS_DIR/usr/bin/freeswitch $OPTIONS -nc
++}
++
++stop() {
++ [ -f $DEFAULT ] && . $DEFAULT
++ $FS_DIR/usr/bin/freeswitch $OPTIONS -stop
++}
++
++restart() {
++ # stopping freeswitch is non-blocking, so we wait until freeswitch's
++ # event socket is down, and then wait an additional ten seconds so that
++ # freeswitch should be completely shutdown before we start it again
++ local retval
++ stop
++ fs_cli -x status >/dev/null 2>&1
++ retval=$?
++ while [ $retval -eq 0 ]; do sleep 1; fs_cli -x status >/dev/null 2>&1; retval=$?; done
++ sleep 10
++ start
++}
++
+diff --git a/feeds/telephony/net/freeswitch/patches/musl/build-config-erlang_m4.patch b/feeds/telephony/net/freeswitch/patches/musl/build-config-erlang_m4.patch
+new file mode 100644
+index 0000000..5d744f7
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/musl/build-config-erlang_m4.patch
+@@ -0,0 +1,97 @@
++--- a/build/config/erlang.m4
+++++ b/build/config/erlang.m4
++@@ -1,6 +1,6 @@
++ AC_DEFUN([CHECK_ERLANG], [
++ #
++-# Erlang checks for mod_erlang_event
+++# Erlang check
++ #
++ AC_ARG_WITH(
++ [erlang],
++@@ -20,22 +20,23 @@ then
++ if test ! -x "$with_erlang" ; then
++ AC_MSG_ERROR([Specified erlang does not exist or is not executable: $with_erlang])
++ fi
++- AC_MSG_RESULT([$with_erlang])
++- AC_SUBST([ERLANG], ["$with_erlang"])
+++ AC_MSG_RESULT(["$with_erlang/bin/erl"])
+++ AC_SUBST([ERL],["$with_erlang/bin/erl"])
++ else
++- AC_PATH_PROG([ERLANG], ["erl"], ["no"], ["$PATH:/usr/bin:/usr/local/bin"])
+++ AC_ERLANG_NEED_ERL(["$with_erlang/bin"])
++ fi
++
++- if test "$ERLANG" != "no" ; then
+++ if test "$ERL" != "no" ; then
++ AC_MSG_CHECKING([erlang version])
++- ERLANG_VER="`$ERLANG -version 2>&1 | cut -d' ' -f6`"
+++ ERLANG_VER="`$ERL -version 2>&1 | cut -d' ' -f6`"
++
++ if test -z "$ERLANG_VER" ; then
++ AC_MSG_ERROR([Unable to detect erlang version])
+++ else
+++ AC_MSG_RESULT([$ERLANG_VER])
++ fi
++- AC_MSG_RESULT([$ERLANG_VER])
++
++- ERLANG_LIBDIR=`$ERLANG -noshell -eval 'io:format("~n~s/lib~n", [[code:lib_dir("erl_interface")]]).' -s erlang halt | tail -n 1`
+++ ERLANG_LIBDIR=`$ERL -noshell -eval 'io:format("~n~s/lib~n", [[code:lib_dir("erl_interface")]]).' -s erlang halt | tail -n 1`
++ AC_MSG_CHECKING([erlang libdir])
++ if test -z "`echo $ERLANG_LIBDIR`" ; then
++ AC_MSG_ERROR([failed])
++@@ -43,9 +44,16 @@ then
++ ERLANG_LDFLAGS="-L$ERLANG_LIBDIR $ERLANG_LDFLAGS"
++ LIBS="-L$ERLANG_LIBDIR $LIBS"
++ fi
+++
+++ #
+++ # Don't use the above ERLANG_LDFLAGS
+++ #
+++ ERLANG_LIBDIR="${STAGING_DIR}/usr/lib"
+++ ERLANG_LDFLAGS="-L$ERLANG_LIBDIR"
+++ LIBS="-L$ERLANG_LIBDIR $LIBS"
++ AC_MSG_RESULT([$ERLANG_LIBDIR])
++
++- ERLANG_INCDIR=`$ERLANG -noshell -eval 'io:format("~n~s/include~n", [[code:lib_dir("erl_interface")]]).' -s erlang halt | tail -n 1`
+++ ERLANG_INCDIR=`$ERL -noshell -eval 'io:format("~n~s/include~n", [[code:lib_dir("erl_interface")]]).' -s erlang halt | tail -n 1`
++ AC_MSG_CHECKING([erlang incdir])
++ if test -z "`echo $ERLANG_INCDIR`" ; then
++ AC_MSG_ERROR([failed])
++@@ -59,10 +67,11 @@ then
++
++ ERLANG_LIB="ei"
++
++- # check liei
+++ # check libei
++ AC_CHECK_LIB([$ERLANG_LIB], [ei_encode_version], [has_libei="yes"], [has_libei="no"])
++ # maybe someday ei will actually expose this?
++- AC_CHECK_LIB([$ERLANG_LIB], [ei_link_unlink], [ERLANG_CFLAGS="$ERLANG_CFLAGS -DEI_LINK_UNLINK"])
+++ # until then, we comment it out
+++ #AC_CHECK_LIB([$ERLANG_LIB], [ei_link_unlink], [ERLANG_CFLAGS="$ERLANG_CFLAGS -DEI_LINK_UNLINK"])
++
++ if test "$has_libei" = "no" ; then
++ AS_IF([test "$with_erlang" = "try"],
++@@ -76,7 +85,7 @@ then
++ )
++ else
++ ERLANG_LDFLAGS="$ERLANG_LDFLAGS -lei"
++- AC_MSG_NOTICE([Your erlang seems OK, do not forget to enable mod_erlang_event in modules.conf])
+++ AC_MSG_NOTICE([Your erlang seems OK. You can now use ErLang in your codes.])
++ AC_SUBST([ERLANG_CFLAGS], [$ERLANG_CFLAGS])
++ AC_SUBST([ERLANG_LDFLAGS], [$ERLANG_LDFLAGS])
++ AM_CONDITIONAL([HAVE_ERLANG],[true])
++@@ -87,12 +96,12 @@ then
++
++ else
++ AS_IF([test "$with_erlang" = "try"],
++- [AC_MSG_WARN([Could not find erlang, mod_erlang_event will not build, use --with-erlang to specify the location])],
+++ [AC_MSG_WARN([Could not find erlang, codes depend on erlang will not build, use --with-erlang to specify the location])],
++ [AC_MSG_ERROR([Could not find erlang, use --with-erlang to specify the location])]
++ )
++ fi
++ else
++- AC_MSG_WARN([erlang support disabled, building mod_erlang_event will fail!])
+++ AC_MSG_WARN([erlang support disabled!])
++ fi
++
++ ])
+diff --git a/feeds/telephony/net/freeswitch/patches/musl/build-modules_conf_in.patch b/feeds/telephony/net/freeswitch/patches/musl/build-modules_conf_in.patch
+new file mode 100644
+index 0000000..9db0e8e
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/musl/build-modules_conf_in.patch
+@@ -0,0 +1,10 @@
++--- a/build/modules.conf.in
+++++ b/build/modules.conf.in
++@@ -38,6 +38,7 @@ applications/mod_httapi
++ #applications/mod_rad_auth
++ #applications/mod_redis
++ #applications/mod_rss
+++#applications/mod_skel
++ applications/mod_sms
++ #applications/mod_snapshot
++ #applications/mod_snom
+diff --git a/feeds/telephony/net/freeswitch/patches/musl/build-openwrt_rules.mk.patch b/feeds/telephony/net/freeswitch/patches/musl/build-openwrt_rules.mk.patch
+new file mode 100644
+index 0000000..31fb16f
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/musl/build-openwrt_rules.mk.patch
+@@ -0,0 +1,10 @@
++--- /dev/null
+++++ b/build/openwrt_rules.mk
++@@ -0,0 +1,7 @@
+++OPENWRT_DIR=$(shell (cd $(BASE)/../../..;pwd))
+++STAGING_PREFIX=$(OPENWRT_DIR)/staging_dir/host
+++STAGING_DIR=$(OPENWRT_DIR)/staging_dir/$(shell (cd $(BASE)/..;basename `pwd`))
+++ARCH="$(shell grep CONFIG_ARCH $(OPENWRT_DIR)/.config|cut -d= -d'"' -f2)"
+++GNU_TARGET_NAME=$(ARCH)-openwrt-linux
+++
+++include $(OPENWRT_DIR)/rules.mk
+diff --git a/feeds/telephony/net/freeswitch/patches/musl/configure_ac.patch b/feeds/telephony/net/freeswitch/patches/musl/configure_ac.patch
+new file mode 100644
+index 0000000..9bd513d
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/musl/configure_ac.patch
+@@ -0,0 +1,65 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -254,7 +254,7 @@ AX_COMPILER_VENDOR
++ if test "x${cross_compiling}" = "xyes"; then
++ CC_FOR_BUILD=${CC_FOR_BUILD-gcc}
++ case "$host" in
++- arm*-linux-gnueabi*|arm*-*-linux-gnueabi*)
+++ arm*-linux-gnueabi*|arm*-*-linux-*)
++ # spandsp modem
++ ac_cv_file__dev_ptmx=yes
++ # libjs
++@@ -273,7 +273,7 @@ if test "x${cross_compiling}" = "xyes";
++ export apr_cv_mutex_recursive=yes
++ export ac_cv_func_pthread_rwlock_init=yes
++ export apr_cv_type_rwlock_t=yes
++- export apr_cv_process_shared_works=yes
+++ export apr_cv_process_shared_works=no
++ export apr_cv_mutex_robust_shared=yes
++ ;;
++ esac
++@@ -405,9 +405,6 @@ elif test "x${ax_cv_c_compiler_vendor}"
++ elif test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then
++ APR_ADDTO(SWITCH_AM_CFLAGS, -fPIC)
++ APR_ADDTO(SWITCH_AM_CXXFLAGS, -fPIC)
++- if test "$ac_cv_gcc_supports_w_no_unused_result" = yes; then
++- APR_ADDTO(SWITCH_AM_CFLAGS, -Werror)
++- fi
++ if test "${enable_64}" = "yes"; then
++ case "$host" in
++ *darwin*)
++@@ -901,7 +898,6 @@ AC_CHECK_LIB(pthread, pthread_setschedpa
++
++ AC_CHECK_FUNC(socket, , AC_CHECK_LIB(socket, socket))
++
++-AC_CHECK_FILE(/dev/ptmx, [AC_DEFINE(HAVE_DEV_PTMX, 1, [Define if you have /dev/ptmx])])
++ AC_CHECK_LIB(util, openpty, [AC_DEFINE(HAVE_OPENPTY, 1, [Define if you have openpty()])])
++
++ AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[
++@@ -1474,14 +1470,14 @@ AM_CONDITIONAL([HAVE_MYSQL],[test "$foun
++ # perl checks
++ #
++
++-AC_CHECK_PROG(PERL,perl,[ac_cv_have_perl=yes],[ac_cv_have_perl=no])
+++AC_CHECK_PROG(PERL,[perl],[ac_cv_have_perl=yes],[ac_cv_have_perl=no],[${STAGING_DIR}/../host/usr/bin])
+++PERL=$as_dir/$ac_word$ac_exec_ext
++
++ # -a "x$ac_cv_have_EXTERN_h" != "xno"
++
++ if test "x$ac_cv_have_perl" != "xno"; then
++- PERL=perl
++- PERL_SITEDIR="`$PERL -MConfig -e 'print $Config{archlib}'`"
++- PERL_LIBDIR="-L`$PERL -MConfig -e 'print $Config{archlib}'`/CORE"
+++ PERL_SITEDIR="`$PERL -MConfig -e 'print $Config{archlibexp}'`"
+++ PERL_LIBDIR="-L`$PERL -MConfig -e 'print $Config{archlibexp}'`/CORE"
++ PERL_LIBS="`$PERL -MConfig -e 'print $Config{libs}'`"
++ PERL_CFLAGS="-w -DMULTIPLICITY `$PERL -MExtUtils::Embed -e ccopts | sed -e 's|-arch x86_64 -arch i386||'` -DEMBED_PERL"
++ PERL_LDFLAGS="`$PERL -MExtUtils::Embed -e ldopts| sed -e 's|-arch x86_64 -arch i386||'`"
++@@ -1498,6 +1494,7 @@ if test "x$ac_cv_have_perl" != "xno"; th
++ AC_CHECK_LIB([perl], [perl_alloc], ac_cv_use_libperl=yes, ac_cv_use_libperl=no)
++ LDFLAGS="$save_LDFLAGS"
++
+++ AC_SUBST(PERL)
++ AC_SUBST(PERL_SITEDIR)
++ AC_SUBST(PERL_LIBDIR)
++ AC_SUBST(PERL_LIBS)
+diff --git a/feeds/telephony/net/freeswitch/patches/musl/libs-apr-configure_ac.patch b/feeds/telephony/net/freeswitch/patches/musl/libs-apr-configure_ac.patch
+new file mode 100644
+index 0000000..c4667dd
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/musl/libs-apr-configure_ac.patch
+@@ -0,0 +1,15 @@
++--- a/libs/apr/configure.ac
+++++ b/libs/apr/configure.ac
++@@ -1956,7 +1956,11 @@ fi
++
++ APR_CHECK_TCP_NODELAY_INHERITED
++ APR_CHECK_O_NONBLOCK_INHERITED
++-APR_CHECK_TCP_NODELAY_WITH_CORK
+++
+++dnl Check TCP_NODELAY_WITH_CORK ONLY when NOT cross compiling
+++if test "$cross_compiling" != yes; then
+++ APR_CHECK_TCP_NODELAY_WITH_CORK
+++fi
++
++ # Look for a way of corking TCP...
++ APR_CHECK_DEFINE(TCP_CORK, netinet/tcp.h)
+diff --git a/feeds/telephony/net/freeswitch/patches/musl/libs-apr-util-configure_gnu.patch b/feeds/telephony/net/freeswitch/patches/musl/libs-apr-util-configure_gnu.patch
+new file mode 100644
+index 0000000..b933b3c
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/musl/libs-apr-util-configure_gnu.patch
+@@ -0,0 +1,8 @@
++--- a/libs/apr-util/configure.gnu
+++++ b/libs/apr-util/configure.gnu
++@@ -1,4 +1,4 @@
++ #! /bin/sh
++ srcpath=$(dirname $0 2>/dev/null ) || srcpath="."
++-$srcpath/configure "$@" --with-apr=../apr --disable-shared --with-pic --without-sqlite2 --without-sqlite3 --with-expat=builtin
+++$srcpath/configure "$@" --with-apr=../apr --disable-shared --with-expat=builtin
++
+diff --git a/feeds/telephony/net/freeswitch/patches/musl/libs-srtp-configure_ac.patch b/feeds/telephony/net/freeswitch/patches/musl/libs-srtp-configure_ac.patch
+new file mode 100644
+index 0000000..56c1691
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/musl/libs-srtp-configure_ac.patch
+@@ -0,0 +1,13 @@
++--- a/libs/srtp/configure.ac
+++++ b/libs/srtp/configure.ac
++@@ -130,10 +130,6 @@ if test "$enable_kernel_linux" = "yes";
++ fi
++ AC_MSG_RESULT($enable_kernel_linux)
++
++-dnl Check for /dev/urandom
++-AC_CHECK_FILE(/dev/urandom, DEV_URANDOM=/dev/urandom,
++- [AC_CHECK_FILE(/dev/random, DEV_URANDOM=/dev/random)])
++-
++ dnl Checks for header files.
++ AC_HEADER_STDC
++ AC_CHECK_HEADERS(stdlib.h)
+diff --git a/feeds/telephony/net/freeswitch/patches/uClibc/build-config-erlang_m4.patch b/feeds/telephony/net/freeswitch/patches/uClibc/build-config-erlang_m4.patch
+new file mode 100644
+index 0000000..5d744f7
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/uClibc/build-config-erlang_m4.patch
+@@ -0,0 +1,97 @@
++--- a/build/config/erlang.m4
+++++ b/build/config/erlang.m4
++@@ -1,6 +1,6 @@
++ AC_DEFUN([CHECK_ERLANG], [
++ #
++-# Erlang checks for mod_erlang_event
+++# Erlang check
++ #
++ AC_ARG_WITH(
++ [erlang],
++@@ -20,22 +20,23 @@ then
++ if test ! -x "$with_erlang" ; then
++ AC_MSG_ERROR([Specified erlang does not exist or is not executable: $with_erlang])
++ fi
++- AC_MSG_RESULT([$with_erlang])
++- AC_SUBST([ERLANG], ["$with_erlang"])
+++ AC_MSG_RESULT(["$with_erlang/bin/erl"])
+++ AC_SUBST([ERL],["$with_erlang/bin/erl"])
++ else
++- AC_PATH_PROG([ERLANG], ["erl"], ["no"], ["$PATH:/usr/bin:/usr/local/bin"])
+++ AC_ERLANG_NEED_ERL(["$with_erlang/bin"])
++ fi
++
++- if test "$ERLANG" != "no" ; then
+++ if test "$ERL" != "no" ; then
++ AC_MSG_CHECKING([erlang version])
++- ERLANG_VER="`$ERLANG -version 2>&1 | cut -d' ' -f6`"
+++ ERLANG_VER="`$ERL -version 2>&1 | cut -d' ' -f6`"
++
++ if test -z "$ERLANG_VER" ; then
++ AC_MSG_ERROR([Unable to detect erlang version])
+++ else
+++ AC_MSG_RESULT([$ERLANG_VER])
++ fi
++- AC_MSG_RESULT([$ERLANG_VER])
++
++- ERLANG_LIBDIR=`$ERLANG -noshell -eval 'io:format("~n~s/lib~n", [[code:lib_dir("erl_interface")]]).' -s erlang halt | tail -n 1`
+++ ERLANG_LIBDIR=`$ERL -noshell -eval 'io:format("~n~s/lib~n", [[code:lib_dir("erl_interface")]]).' -s erlang halt | tail -n 1`
++ AC_MSG_CHECKING([erlang libdir])
++ if test -z "`echo $ERLANG_LIBDIR`" ; then
++ AC_MSG_ERROR([failed])
++@@ -43,9 +44,16 @@ then
++ ERLANG_LDFLAGS="-L$ERLANG_LIBDIR $ERLANG_LDFLAGS"
++ LIBS="-L$ERLANG_LIBDIR $LIBS"
++ fi
+++
+++ #
+++ # Don't use the above ERLANG_LDFLAGS
+++ #
+++ ERLANG_LIBDIR="${STAGING_DIR}/usr/lib"
+++ ERLANG_LDFLAGS="-L$ERLANG_LIBDIR"
+++ LIBS="-L$ERLANG_LIBDIR $LIBS"
++ AC_MSG_RESULT([$ERLANG_LIBDIR])
++
++- ERLANG_INCDIR=`$ERLANG -noshell -eval 'io:format("~n~s/include~n", [[code:lib_dir("erl_interface")]]).' -s erlang halt | tail -n 1`
+++ ERLANG_INCDIR=`$ERL -noshell -eval 'io:format("~n~s/include~n", [[code:lib_dir("erl_interface")]]).' -s erlang halt | tail -n 1`
++ AC_MSG_CHECKING([erlang incdir])
++ if test -z "`echo $ERLANG_INCDIR`" ; then
++ AC_MSG_ERROR([failed])
++@@ -59,10 +67,11 @@ then
++
++ ERLANG_LIB="ei"
++
++- # check liei
+++ # check libei
++ AC_CHECK_LIB([$ERLANG_LIB], [ei_encode_version], [has_libei="yes"], [has_libei="no"])
++ # maybe someday ei will actually expose this?
++- AC_CHECK_LIB([$ERLANG_LIB], [ei_link_unlink], [ERLANG_CFLAGS="$ERLANG_CFLAGS -DEI_LINK_UNLINK"])
+++ # until then, we comment it out
+++ #AC_CHECK_LIB([$ERLANG_LIB], [ei_link_unlink], [ERLANG_CFLAGS="$ERLANG_CFLAGS -DEI_LINK_UNLINK"])
++
++ if test "$has_libei" = "no" ; then
++ AS_IF([test "$with_erlang" = "try"],
++@@ -76,7 +85,7 @@ then
++ )
++ else
++ ERLANG_LDFLAGS="$ERLANG_LDFLAGS -lei"
++- AC_MSG_NOTICE([Your erlang seems OK, do not forget to enable mod_erlang_event in modules.conf])
+++ AC_MSG_NOTICE([Your erlang seems OK. You can now use ErLang in your codes.])
++ AC_SUBST([ERLANG_CFLAGS], [$ERLANG_CFLAGS])
++ AC_SUBST([ERLANG_LDFLAGS], [$ERLANG_LDFLAGS])
++ AM_CONDITIONAL([HAVE_ERLANG],[true])
++@@ -87,12 +96,12 @@ then
++
++ else
++ AS_IF([test "$with_erlang" = "try"],
++- [AC_MSG_WARN([Could not find erlang, mod_erlang_event will not build, use --with-erlang to specify the location])],
+++ [AC_MSG_WARN([Could not find erlang, codes depend on erlang will not build, use --with-erlang to specify the location])],
++ [AC_MSG_ERROR([Could not find erlang, use --with-erlang to specify the location])]
++ )
++ fi
++ else
++- AC_MSG_WARN([erlang support disabled, building mod_erlang_event will fail!])
+++ AC_MSG_WARN([erlang support disabled!])
++ fi
++
++ ])
+diff --git a/feeds/telephony/net/freeswitch/patches/uClibc/build-modules_conf_in.patch b/feeds/telephony/net/freeswitch/patches/uClibc/build-modules_conf_in.patch
+new file mode 100644
+index 0000000..86aad26
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/uClibc/build-modules_conf_in.patch
+@@ -0,0 +1,10 @@
++--- a/build/modules.conf.in
+++++ b/build/modules.conf.in
++@@ -39,6 +39,7 @@ applications/mod_httapi
++ #applications/mod_rad_auth
++ #applications/mod_redis
++ #applications/mod_rss
+++#applications/mod_skel
++ applications/mod_sms
++ #applications/mod_snapshot
++ #applications/mod_snom
+diff --git a/feeds/telephony/net/freeswitch/patches/uClibc/build-openwrt_rules.mk.patch b/feeds/telephony/net/freeswitch/patches/uClibc/build-openwrt_rules.mk.patch
+new file mode 100644
+index 0000000..31fb16f
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/uClibc/build-openwrt_rules.mk.patch
+@@ -0,0 +1,10 @@
++--- /dev/null
+++++ b/build/openwrt_rules.mk
++@@ -0,0 +1,7 @@
+++OPENWRT_DIR=$(shell (cd $(BASE)/../../..;pwd))
+++STAGING_PREFIX=$(OPENWRT_DIR)/staging_dir/host
+++STAGING_DIR=$(OPENWRT_DIR)/staging_dir/$(shell (cd $(BASE)/..;basename `pwd`))
+++ARCH="$(shell grep CONFIG_ARCH $(OPENWRT_DIR)/.config|cut -d= -d'"' -f2)"
+++GNU_TARGET_NAME=$(ARCH)-openwrt-linux
+++
+++include $(OPENWRT_DIR)/rules.mk
+diff --git a/feeds/telephony/net/freeswitch/patches/uClibc/configure_ac.patch b/feeds/telephony/net/freeswitch/patches/uClibc/configure_ac.patch
+new file mode 100644
+index 0000000..477af6b
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/uClibc/configure_ac.patch
+@@ -0,0 +1,65 @@
++--- a/configure.ac
+++++ b/configure.ac
++@@ -254,7 +254,7 @@ AX_COMPILER_VENDOR
++ if test "x${cross_compiling}" = "xyes"; then
++ CC_FOR_BUILD=${CC_FOR_BUILD-gcc}
++ case "$host" in
++- arm*-linux-gnueabi*|arm*-*-linux-gnueabi*)
+++ arm*-linux-gnueabi*|arm*-*-linux-*)
++ # spandsp modem
++ ac_cv_file__dev_ptmx=yes
++ # libjs
++@@ -273,7 +273,7 @@ if test "x${cross_compiling}" = "xyes";
++ export apr_cv_mutex_recursive=yes
++ export ac_cv_func_pthread_rwlock_init=yes
++ export apr_cv_type_rwlock_t=yes
++- export apr_cv_process_shared_works=yes
+++ #export apr_cv_process_shared_works=no
++ export apr_cv_mutex_robust_shared=yes
++ ;;
++ esac
++@@ -405,9 +405,6 @@ elif test "x${ax_cv_c_compiler_vendor}"
++ elif test "x${ax_cv_c_compiler_vendor}" = "xgnu" ; then
++ APR_ADDTO(SWITCH_AM_CFLAGS, -fPIC)
++ APR_ADDTO(SWITCH_AM_CXXFLAGS, -fPIC)
++- if test "$ac_cv_gcc_supports_w_no_unused_result" = yes; then
++- APR_ADDTO(SWITCH_AM_CFLAGS, -Werror)
++- fi
++ if test "${enable_64}" = "yes"; then
++ case "$host" in
++ *darwin*)
++@@ -901,7 +898,6 @@ AC_CHECK_LIB(pthread, pthread_setschedpa
++
++ AC_CHECK_FUNC(socket, , AC_CHECK_LIB(socket, socket))
++
++-AC_CHECK_FILE(/dev/ptmx, [AC_DEFINE(HAVE_DEV_PTMX, 1, [Define if you have /dev/ptmx])])
++ AC_CHECK_LIB(util, openpty, [AC_DEFINE(HAVE_OPENPTY, 1, [Define if you have openpty()])])
++
++ AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[
++@@ -1478,14 +1474,14 @@ AM_CONDITIONAL([HAVE_MYSQL],[test "$foun
++ # perl checks
++ #
++
++-AC_CHECK_PROG(PERL,perl,[ac_cv_have_perl=yes],[ac_cv_have_perl=no])
+++AC_CHECK_PROG(PERL,[perl],[ac_cv_have_perl=yes],[ac_cv_have_perl=no],[${STAGING_DIR}/../host/usr/bin])
+++PERL=$as_dir/$ac_word$ac_exec_ext
++
++ # -a "x$ac_cv_have_EXTERN_h" != "xno"
++
++ if test "x$ac_cv_have_perl" != "xno"; then
++- PERL=perl
++- PERL_SITEDIR="`$PERL -MConfig -e 'print $Config{archlib}'`"
++- PERL_LIBDIR="-L`$PERL -MConfig -e 'print $Config{archlib}'`/CORE"
+++ PERL_SITEDIR="`$PERL -MConfig -e 'print $Config{archlibexp}'`"
+++ PERL_LIBDIR="-L`$PERL -MConfig -e 'print $Config{archlibexp}'`/CORE"
++ PERL_LIBS="`$PERL -MConfig -e 'print $Config{libs}'`"
++ PERL_CFLAGS="-w -DMULTIPLICITY `$PERL -MExtUtils::Embed -e ccopts | sed -e 's|-arch x86_64 -arch i386||'` -DEMBED_PERL"
++ PERL_LDFLAGS="`$PERL -MExtUtils::Embed -e ldopts| sed -e 's|-arch x86_64 -arch i386||'`"
++@@ -1502,6 +1498,7 @@ if test "x$ac_cv_have_perl" != "xno"; th
++ AC_CHECK_LIB([perl], [perl_alloc], ac_cv_use_libperl=yes, ac_cv_use_libperl=no)
++ LDFLAGS="$save_LDFLAGS"
++
+++ AC_SUBST(PERL)
++ AC_SUBST(PERL_SITEDIR)
++ AC_SUBST(PERL_LIBDIR)
++ AC_SUBST(PERL_LIBS)
+diff --git a/feeds/telephony/net/freeswitch/patches/uClibc/libs-apr-configure_ac.patch b/feeds/telephony/net/freeswitch/patches/uClibc/libs-apr-configure_ac.patch
+new file mode 100644
+index 0000000..7c0630f
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/uClibc/libs-apr-configure_ac.patch
+@@ -0,0 +1,55 @@
++--- a/libs/apr/configure.ac
+++++ b/libs/apr/configure.ac
++@@ -1624,38 +1624,7 @@ if test "$threads" = "1"; then
++ APR_CHECK_DEFINE(PTHREAD_PROCESS_SHARED, pthread.h)
++ AC_CHECK_FUNCS(pthread_mutexattr_setpshared)
++ AC_CHECK_LIB(pthread, pthread_setschedparam, [AC_DEFINE(HAVE_PTHREAD_SETSCHEDPARAM, 1, [Define if you have pthread_setschedparam()])])
++-
++- # Some systems have setpshared and define PROCESS_SHARED, but don't
++- # really support PROCESS_SHARED locks. So, we must validate that we
++- # can go through the steps without receiving some sort of system error.
++- # Linux and older versions of AIX have this problem.
++- APR_IFALLYES(header:pthread.h define:PTHREAD_PROCESS_SHARED func:pthread_mutexattr_setpshared, [
++- AC_CACHE_CHECK([for working PROCESS_SHARED locks], apr_cv_process_shared_works, [
++- AC_TRY_RUN([
++-#include <sys/types.h>
++-#include <pthread.h>
++- int main()
++- {
++- pthread_mutex_t mutex;
++- pthread_mutexattr_t attr;
++- if (pthread_mutexattr_init(&attr))
++- exit(1);
++- if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED))
++- exit(2);
++- if (pthread_mutex_init(&mutex, &attr))
++- exit(3);
++- if (pthread_mutexattr_destroy(&attr))
++- exit(4);
++- if (pthread_mutex_destroy(&mutex))
++- exit(5);
++- exit(0);
++- }], [apr_cv_process_shared_works=yes], [apr_cv_process_shared_works=no])])
++- # Override detection of pthread_mutexattr_setpshared
++- ac_cv_func_pthread_mutexattr_setpshared=$apr_cv_process_shared_works])
++-
++- if test "$ac_cv_func_pthread_mutexattr_setpshared" = "yes"; then
++- APR_CHECK_PTHREAD_ROBUST_SHARED_MUTEX
++- fi
+++ APR_CHECK_PTHREAD_ROBUST_SHARED_MUTEX
++ fi
++
++ # See which lock mechanisms we can support on this system.
++@@ -1956,7 +1925,11 @@ fi
++
++ APR_CHECK_TCP_NODELAY_INHERITED
++ APR_CHECK_O_NONBLOCK_INHERITED
++-APR_CHECK_TCP_NODELAY_WITH_CORK
+++
+++dnl Check TCP_NODELAY_WITH_CORK ONLY when NOT cross compiling
+++if test "$cross_compiling" != yes; then
+++ APR_CHECK_TCP_NODELAY_WITH_CORK
+++fi
++
++ # Look for a way of corking TCP...
++ APR_CHECK_DEFINE(TCP_CORK, netinet/tcp.h)
+diff --git a/feeds/telephony/net/freeswitch/patches/uClibc/libs-apr-util-configure_gnu.patch b/feeds/telephony/net/freeswitch/patches/uClibc/libs-apr-util-configure_gnu.patch
+new file mode 100644
+index 0000000..b933b3c
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/uClibc/libs-apr-util-configure_gnu.patch
+@@ -0,0 +1,8 @@
++--- a/libs/apr-util/configure.gnu
+++++ b/libs/apr-util/configure.gnu
++@@ -1,4 +1,4 @@
++ #! /bin/sh
++ srcpath=$(dirname $0 2>/dev/null ) || srcpath="."
++-$srcpath/configure "$@" --with-apr=../apr --disable-shared --with-pic --without-sqlite2 --without-sqlite3 --with-expat=builtin
+++$srcpath/configure "$@" --with-apr=../apr --disable-shared --with-expat=builtin
++
+diff --git a/feeds/telephony/net/freeswitch/patches/uClibc/libs-srtp-configure_ac.patch b/feeds/telephony/net/freeswitch/patches/uClibc/libs-srtp-configure_ac.patch
+new file mode 100644
+index 0000000..56c1691
+--- /dev/null
++++ b/feeds/telephony/net/freeswitch/patches/uClibc/libs-srtp-configure_ac.patch
+@@ -0,0 +1,13 @@
++--- a/libs/srtp/configure.ac
+++++ b/libs/srtp/configure.ac
++@@ -130,10 +130,6 @@ if test "$enable_kernel_linux" = "yes";
++ fi
++ AC_MSG_RESULT($enable_kernel_linux)
++
++-dnl Check for /dev/urandom
++-AC_CHECK_FILE(/dev/urandom, DEV_URANDOM=/dev/urandom,
++- [AC_CHECK_FILE(/dev/random, DEV_URANDOM=/dev/random)])
++-
++ dnl Checks for header files.
++ AC_HEADER_STDC
++ AC_CHECK_HEADERS(stdlib.h)
+diff --git a/feeds/telephony/net/kamailio-3.x/Makefile b/feeds/telephony/net/kamailio-3.x/Makefile
+new file mode 100644
+index 0000000..1020992
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-3.x/Makefile
+@@ -0,0 +1,245 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=kamailio3
++PKG_VERSION:=3.3.7
++PKG_RELEASE:=9
++
++PKG_SOURCE_URL:=http://www.kamailio.org/pub/kamailio/$(PKG_VERSION)/src/
++PKG_SOURCE:=kamailio-$(PKG_VERSION)$(PKG_VARIANT)_src.tar.gz
++PKG_MD5SUM:=519d1dfbddf7dbead3a020321582d471
++PKG_USE_MIPS16:=0
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++INCL_MODULES:=
++KAM_MODULES:=
++
++include $(INCLUDE_DIR)/nls.mk
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS += $(FPIC)
++PREBUILT_STAMP=$(STAGING_DIR)/stamp/.$(PKG_NAME)_prebuilt
++TAR_CMD:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components 1 $(TAR_OPTIONS)
++
++define Package/kamailio3/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Telephony
++ URL:=http://www.kamailio.org/
++ DEPENDS:=$(ICONV_DEPENDS) +libncurses +libpthread +libreadline
++endef
++
++define Package/kamailio3
++$(call Package/kamailio3/Default)
++ TITLE:=Mature and flexible open source SIP server, v$(PKG_VERSION)
++ MENU:=1
++endef
++
++define Package/kamailio3/conffiles
++/etc/default/kamailio
++/etc/kamailio/kamailio.cfg
++/etc/kamailio/dictionary.kamailio
++/etc/kamailio/kamctlrc
++endef
++
++define Package/kamailio3/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/kam{ailio,ctl,dbctl} $(1)/usr/sbin/
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/sercmd $(1)/usr/sbin/
++
++ $(INSTALL_DIR) $(1)/usr/lib/kamailio/modules{,_s,_k}
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/kamailio/lib*.so* $(1)/usr/lib/kamailio/
++
++ $(INSTALL_DIR) $(1)/etc/kamailio
++ $(CP) \
++ $(PKG_INSTALL_DIR)/etc/kamailio/{dictionary.kamailio,kamailio.cfg,kamctlrc} \
++ $(1)/etc/kamailio/
++
++ $(INSTALL_DIR) $(1)/etc/default
++ $(CP) \
++ ./files/kamailio.default \
++ $(1)/etc/default/kamailio
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) \
++ ./files/kamailio.init \
++ $(1)/etc/init.d/kamailio
++
++ $(INSTALL_DIR) $(1)/usr/lib/kamailio
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/kamailio/kamctl \
++ $(1)/usr/lib/kamailio/
++endef
++
++define Package/kamailio3/install/module
++ $(INSTALL_DIR) $(1)/usr/lib/kamailio/$(3)
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/kamailio/$(3)/*$(2).so* $(1)/usr/lib/kamailio/$(3)/
++endef
++
++define Package/kamailio3/install/dbfiles
++ $(INSTALL_DIR) $(1)/usr/share/kamailio/$(2)
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/kamailio/$(2)/* $(1)/usr/share/kamailio/$(2)/
++endef
++
++define BuildKamailio3Module
++ define Package/kamailio3-mod-$(subst _,-,$(1))
++ $$(call Package/kamailio3/Default)
++ TITLE:= kamailio3 $(2) module
++ DEPENDS:=kamailio3 $(4)
++ endef
++
++ define Package/kamailio3-mod-$(subst _,-,$(1))/description
++This package provides support for $(3) in Kamailio.
++ endef
++
++ define Package/kamailio3-mod-$(subst _,-,$(1))/install
++$(call Package/kamailio3/install/module,$$(1),$(1),$(5))
++$(foreach d,$(6),$(call Package/kamailio3/install/dbfiles,$$(1),$(d));)
++ endef
++
++ INCL_MODULES+=$(1)
++ KAM_MODULES+=kamailio3-mod-$(subst _,-,$(1))
++endef
++
++################################
++# Kamailio module parameters
++# Module params:
++# 1 - Name
++# 2 - Title
++# 3 - Description
++# 4 - Dependencies
++# 5 - Subdir
++# 6 - DB file directories
++################################
++
++$(eval $(call BuildKamailio3Module,acc,Accounting,,+kamailio3-mod-tm,modules_k))
++$(eval $(call BuildKamailio3Module,alias_db,Database-backend aliases,,+kamailio3-mod-db-sqlite,modules_k))
++$(eval $(call BuildKamailio3Module,auth,Authentication Framework,,,modules))
++$(eval $(call BuildKamailio3Module,auth_db,Database-backend authentication,,+kamailio3-mod-auth +kamailio3-mod-db-sqlite,modules_k))
++$(eval $(call BuildKamailio3Module,auth_diameter,Diameter-backend authentication,,+kamailio3-mod-sl,modules_k))
++$(eval $(call BuildKamailio3Module,avpops,AVP operation,,,modules))
++$(eval $(call BuildKamailio3Module,benchmark,Config benchmark,,,modules_k))
++$(eval $(call BuildKamailio3Module,cfgutils,Config utilities,,,modules_k))
++$(eval $(call BuildKamailio3Module,cfg_db,Load core and module parameters from database,,+kamailio3-mod-db-sqlite,modules))
++$(eval $(call BuildKamailio3Module,cfg_rpc,Update core and module parameters at runtime via RPC interface,,,modules))
++$(eval $(call BuildKamailio3Module,ctl,BINRPC transport interface,,,modules))
++$(eval $(call BuildKamailio3Module,db_flatstore,Fast writing-only text database-backed,,,modules))
++$(eval $(call BuildKamailio3Module,db_mysql,MySQL database-backend,,+libmysqlclient,modules,mysql))
++$(eval $(call BuildKamailio3Module,db_postgres,PostgreSQL Database-backend,,+libpq,modules,postgres))
++$(eval $(call BuildKamailio3Module,db_sqlite,Sqlite DB support,,+libsqlite3,modules_k,db_sqlite))
++$(eval $(call BuildKamailio3Module,db_text,Text database-backend,,,modules_k,dbtext/kamailio))
++$(eval $(call BuildKamailio3Module,db_unixodbc,UnixODBC Database-backend,,+unixodbc,modules_k))
++$(eval $(call BuildKamailio3Module,dialog,Dialog support,,+kamailio3-mod-rr +kamailio3-mod-tm,modules_k))
++$(eval $(call BuildKamailio3Module,dialplan,Dialplan management,,+libpcre,modules))
++$(eval $(call BuildKamailio3Module,dispatcher,Dispatcher,,,modules_s))
++$(eval $(call BuildKamailio3Module,diversion,Diversion header insertion,,,modules_s))
++$(eval $(call BuildKamailio3Module,domain,Multi-domain support,,,modules_k))
++$(eval $(call BuildKamailio3Module,domainpolicy,Domain policy,,,modules_k))
++$(eval $(call BuildKamailio3Module,drouting,Dynamic routing module,,,modules_k))
++$(eval $(call BuildKamailio3Module,enum,ENUM lookup,,,modules))
++$(eval $(call BuildKamailio3Module,exec,External exec,,,modules_k))
++$(eval $(call BuildKamailio3Module,group,Database-backend user-groups,,,modules_k))
++$(eval $(call BuildKamailio3Module,h350,H.350,,+kamailio3-mod-ldap +libopenldap,modules_k))
++$(eval $(call BuildKamailio3Module,htable,Hash Table,,,modules_k))
++$(eval $(call BuildKamailio3Module,imc,IM conferencing,,+kamailio3-mod-db-mysql +kamailio3-mod-tm,modules_k))
++$(eval $(call BuildKamailio3Module,ipops,IP and IPv6 operations module,,,modules))
++$(eval $(call BuildKamailio3Module,kex,Core extensions,,,modules_k))
++$(eval $(call BuildKamailio3Module,lcr,Least Cost Routing,,+kamailio3-mod-tm +libpcre,modules))
++$(eval $(call BuildKamailio3Module,ldap,LDAP connector,,+libopenldap,modules_k))
++$(eval $(call BuildKamailio3Module,maxfwd,Max-Forward processor,,,modules_k))
++$(eval $(call BuildKamailio3Module,mediaproxy,Automatic NAT traversal,,+kamailio3-mod-dialog,modules))
++$(eval $(call BuildKamailio3Module,mi_datagram,Datagram support for Management Interface,,,modules_k))
++$(eval $(call BuildKamailio3Module,mi_fifo,FIFO support for Management Interface,,,modules_k))
++$(eval $(call BuildKamailio3Module,mi_rpc,RPC support for Management Interface,,,modules))
++$(eval $(call BuildKamailio3Module,msilo,SIP message silo,,+kamailio3-mod-tm,modules_k))
++$(eval $(call BuildKamailio3Module,nat_traversal,NAT traversal,,+kamailio3-mod-dialog +kamailio3-mod-sl +kamailio3-mod-tm,modules_k))
++$(eval $(call BuildKamailio3Module,nathelper,NAT traversal helper,,+rtpproxy,modules_k))
++$(eval $(call BuildKamailio3Module,path,SIP path insertion,,+kamailio3-mod-rr,modules_k))
++$(eval $(call BuildKamailio3Module,pdt,Prefix-to-Domain translator,,,modules_k))
++$(eval $(call BuildKamailio3Module,permissions,Permissions control,,,modules_k))
++$(eval $(call BuildKamailio3Module,pike,Flood detector,,,modules_k))
++$(eval $(call BuildKamailio3Module,presence,Presence server,,+kamailio3-mod-sl +kamailio3-mod-tm +libxml2,modules_k))
++$(eval $(call BuildKamailio3Module,presence_dialoginfo,Dialog Event presence,,+kamailio3-mod-presence,modules_k))
++$(eval $(call BuildKamailio3Module,presence_mwi,Message Waiting Indication presence,,+kamailio3-mod-presence,modules_k))
++$(eval $(call BuildKamailio3Module,presence_xml,XCAP presence,,+kamailio3-mod-presence +kamailio3-mod-xcap-client,modules_k))
++$(eval $(call BuildKamailio3Module,pua,Presence User Agent,,+kamailio3-mod-tm +libxml2,modules_k))
++$(eval $(call BuildKamailio3Module,pua_bla,Bridged Line Appearence PUA,,+kamailio3-mod-presence +kamailio3-mod-pua +kamailio3-mod-usrloc,modules_k))
++$(eval $(call BuildKamailio3Module,pua_dialoginfo,Dialog Event PUA,,+kamailio3-mod-dialog +kamailio3-mod-pua,modules_k))
++$(eval $(call BuildKamailio3Module,pua_mi,PUA Management Interface,,+kamailio3-mod-pua,modules_k))
++$(eval $(call BuildKamailio3Module,pua_usrloc,PUA User Location,,+kamailio3-mod-pua +kamailio3-mod-usrloc,modules_k))
++$(eval $(call BuildKamailio3Module,pua_xmpp,PUA XMPP,,+kamailio3-mod-presence +kamailio3-mod-pua +kamailio3-mod-xmpp,modules_k))
++$(eval $(call BuildKamailio3Module,pv,Pseudo-Variables,,,modules_k))
++$(eval $(call BuildKamailio3Module,qos,QoS control,,+kamailio3-mod-dialog,modules_k))
++$(eval $(call BuildKamailio3Module,ratelimit,Traffic shapping,,,modules))
++$(eval $(call BuildKamailio3Module,regex,Regular Expression,,+libpcre,modules_k))
++$(eval $(call BuildKamailio3Module,registrar,SIP Registrar,,+kamailio3-mod-usrloc,modules_k))
++$(eval $(call BuildKamailio3Module,rls,Resource List Server,,+kamailio3-mod-presence +kamailio3-mod-pua +kamailio3-mod-tm +libxml2,modules_k))
++$(eval $(call BuildKamailio3Module,rr,Record-Route and Route,,,modules_k))
++$(eval $(call BuildKamailio3Module,rtimer,Routing Timer,,,modules_k))
++$(eval $(call BuildKamailio3Module,rtpproxy,RTP proxy,,+kamailio3-mod-tm,modules))
++$(eval $(call BuildKamailio3Module,sanity,SIP sanity checks,,+kamailio3-mod-sl,modules))
++$(eval $(call BuildKamailio3Module,sipcapture,SIP capture module,,,modules))
++$(eval $(call BuildKamailio3Module,siptrace,SIP trace,,,modules_k))
++$(eval $(call BuildKamailio3Module,siputils,SIP utilities,,+kamailio3-mod-sl,modules_k))
++$(eval $(call BuildKamailio3Module,sl,Stateless replier,,,modules))
++$(eval $(call BuildKamailio3Module,sms,SIP-to-SMS IM gateway,,+kamailio3-mod-tm,modules))
++$(eval $(call BuildKamailio3Module,speeddial,Per-user speed-dial controller,,,modules_k))
++$(eval $(call BuildKamailio3Module,sqlops,SQL operations,,,modules_k))
++$(eval $(call BuildKamailio3Module,statistics,Script statistics,,,modules_k))
++$(eval $(call BuildKamailio3Module,sst,SIP Session Timer,,+kamailio3-mod-dialog +kamailio3-mod-sl,modules_k))
++$(eval $(call BuildKamailio3Module,textops,Text operations,,,modules_k))
++$(eval $(call BuildKamailio3Module,tls,TLS operations,,+libopenssl,modules))
++$(eval $(call BuildKamailio3Module,tm,Transaction,,,modules))
++$(eval $(call BuildKamailio3Module,tmx,Transaction module extensions,,,modules_k))
++$(eval $(call BuildKamailio3Module,uac,User Agent Client,,+kamailio3-mod-tm,modules_k))
++$(eval $(call BuildKamailio3Module,uac_redirect,User Agent Client redirection,,+kamailio3-mod-tm,modules_k))
++$(eval $(call BuildKamailio3Module,uri_db,Database-backend SIP URI checking,,,modules_k))
++$(eval $(call BuildKamailio3Module,userblacklist,User blacklists,,,modules_k))
++$(eval $(call BuildKamailio3Module,usrloc,User location,,+libxml2,modules_k))
++$(eval $(call BuildKamailio3Module,utils,Misc utilities,,+libcurl +libxml2,modules))
++$(eval $(call BuildKamailio3Module,xcap_client,XCAP Client,,+libcurl,modules_k))
++$(eval $(call BuildKamailio3Module,xlog,Advanced logger,,,modules_k))
++$(eval $(call BuildKamailio3Module,xmlrpc,XML RPC module,,+libxml2,modules))
++$(eval $(call BuildKamailio3Module,xmpp,SIP-to-XMPP Gateway,,+kamailio3-mod-tm +libexpat +libxml2,modules_k))
++
++PKG_MAKE_ARGS:= \
++ prefix=/ \
++ cfg_dir=/etc/kamailio/ \
++ bin_dir=/usr/sbin/ \
++ data_dir=/usr/share/kamailio/ \
++ lib_dir=/usr/lib/kamailio/ \
++ modules_dir=/usr/lib/kamailio/ \
++ include_modules="$(INCL_MODULES)" \
++ cfg_target:=/etc/kamailio/ \
++ TLS_HOOKS=1 \
++ extra_defs="-DUSE_PTHREAD_MUTEX " \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LOCALBASE="$(STAGING_DIR)/usr" \
++ SYSBASE="$(STAGING_DIR)/usr" \
++ PCREDEFS:="$(TARGET_CPPFLAGS)" \
++ PCRELIBS:="$(TARGET_LDFLAGS)" \
++ CROSS_COMPILE=$(TARGET_CROSS) \
++ CC="$(TARGET_CC)" \
++ ARCH="$(ARCH)" \
++ DESTDIR=$(PKG_INSTALL_DIR) \
++ quiet=verbose
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) $(PKG_MAKE_ARGS) \
++ EXTRA_LIBS=-L$(STAGING_DIR)/usr/lib/ \
++ all
++ $(MAKE) -C $(PKG_BUILD_DIR) $(PKG_MAKE_ARGS) \
++ install
++endef
++
++$(eval $(call BuildPackage,kamailio3))
++$(foreach m,$(KAM_MODULES),$(eval $(call BuildPackage,$(m))))
+diff --git a/feeds/telephony/net/kamailio-3.x/files/kamailio.default b/feeds/telephony/net/kamailio-3.x/files/kamailio.default
+new file mode 100644
+index 0000000..1fc875d
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-3.x/files/kamailio.default
+@@ -0,0 +1,14 @@
++#
++# Kamailio startup options
++#
++
++# Set to yes to enable kamailio, once configured properly.
++#RUN_KAMAILIO=yes
++
++# Amount of shared and private memory to allocate
++# for the running Kamailio server (in Mb)
++#SHM_MEMORY=64
++#PKG_MEMORY=4
++
++# Config file
++#CFGFILE=/etc/kamailio/kamailio.cfg
+diff --git a/feeds/telephony/net/kamailio-3.x/files/kamailio.init b/feeds/telephony/net/kamailio-3.x/files/kamailio.init
+new file mode 100644
+index 0000000..38bba51
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-3.x/files/kamailio.init
+@@ -0,0 +1,38 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=99
++
++BINFILE=/usr/sbin/kamailio
++PIDFILE=/var/run/kamailio.pid
++DEFAULTS=/etc/default/kamailio
++CFGFILE=/etc/kamailio/kamailio.cfg
++SHM_MEMORY=8
++PKG_MEMORY=2
++RUN_KAMAILIO=no
++
++start() {
++ # Load startup options if available
++ if [ -f $DEFAULTS ]; then
++ . $DEFAULTS
++ fi
++
++ if [ "$RUN_KAMAILIO" != "yes" ]; then
++ echo "[WARNING] Kamailio not yet configured. Edit /etc/default/kamailio first."
++ else
++ start-stop-daemon -S -x $BINFILE -b -- -P $PIDFILE -f $CFGFILE -m $SHM_MEMORY -M $PKG_MEMORY
++ echo "[INFO] Kamailio has succesfully started."
++ fi
++}
++
++stop() {
++ start-stop-daemon -K -x $BINFILE -p $PIDFILE -q
++ rm -rf $PID_FILE
++}
++
++restart(){
++ echo "[INFO] Restarting kamailio. Waiting 5 seconds before start."
++ stop
++ sleep 5
++ start
++}
+diff --git a/feeds/telephony/net/kamailio-3.x/patches/050-fix-kamailio-utils.patch b/feeds/telephony/net/kamailio-3.x/patches/050-fix-kamailio-utils.patch
+new file mode 100644
+index 0000000..9edb793
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-3.x/patches/050-fix-kamailio-utils.patch
+@@ -0,0 +1,68 @@
++diff -rupN kamailio3-3.3.7/utils/kamctl/kamctl kamailio3-new/utils/kamctl/kamctl
++--- kamailio3-3.3.7/utils/kamctl/kamctl 2014-03-06 16:30:33.000000000 +0100
+++++ kamailio3-new/utils/kamctl/kamctl 2014-08-07 17:01:21.806954644 +0200
++@@ -1,4 +1,4 @@
++-#!/bin/bash
+++#!/bin/sh
++ #
++ # $Id$
++ #
++diff -rupN kamailio3-3.3.7/utils/kamctl/kamctlrc kamailio3-new/utils/kamctl/kamctlrc
++--- kamailio3-3.3.7/utils/kamctl/kamctlrc 2014-03-06 16:30:33.000000000 +0100
+++++ kamailio3-new/utils/kamctl/kamctlrc 2014-08-07 17:00:58.446953700 +0200
++@@ -142,3 +142,6 @@
++ ## Extra start options - default is: not set
++ # example: start Kamailio with 64MB share memory: STARTOPTIONS="-m 64"
++ # STARTOPTIONS=
+++
+++#Disable colour printing in terminal
+++NOHLPRINT=1
++diff -rupN kamailio3-3.3.7/utils/kamctl/kamdbctl kamailio3-new/utils/kamctl/kamdbctl
++--- kamailio3-3.3.7/utils/kamctl/kamdbctl 2014-03-06 16:30:33.000000000 +0100
+++++ kamailio3-new/utils/kamctl/kamdbctl 2014-08-07 17:01:15.494954389 +0200
++@@ -1,4 +1,4 @@
++-#!/bin/bash
+++#!/bin/sh
++ #
++ # $Id$
++ #
++diff -rupN kamailio3-3.3.7/utils/kamctl/kamdbctl.base kamailio3-new/utils/kamctl/kamdbctl.base
++--- kamailio3-3.3.7/utils/kamctl/kamdbctl.base 2014-03-06 16:30:33.000000000 +0100
+++++ kamailio3-new/utils/kamctl/kamdbctl.base 2014-08-07 16:59:44.870950728 +0200
++@@ -32,14 +32,14 @@ INSTALL_PRESENCE_TABLES=${INSTALL_PRESEN
++
++ # Used by dbtext and db_berkeley to define tables to be created, used by
++ # postgres to do the grants
++-STANDARD_TABLES=${STANDARD_TABLES:-version acc dbaliases domain domain_attrs grp
++- uri speed_dial lcr_gw lcr_rule lcr_rule_target pdt subscriber
++- location re_grp trusted address missed_calls usr_preferences
+++STANDARD_TABLES=${STANDARD_TABLES:-version acc dbaliases domain domain_attrs grp \
+++ uri speed_dial lcr_gw lcr_rule lcr_rule_target pdt subscriber \
+++ location re_grp trusted address missed_calls usr_preferences \
++ aliases silo dialog dialog_vars dispatcher dialplan}
++-EXTRA_TABLES=${EXTRA_TABLES:-imc_members imc_rooms cpl sip_trace domainpolicy
++- carrierroute carrier_name domain_name carrierfailureroute userblacklist
+++EXTRA_TABLES=${EXTRA_TABLES:-imc_members imc_rooms cpl sip_trace domainpolicy \
+++ carrierroute carrier_name domain_name carrierfailureroute userblacklist \
++ globalblacklist htable purplemap uacreg pl_pipes mtree mtrees}
++-PRESENCE_TABLES=${PRESENCE_TABLES:-presentity active_watchers watchers xcap
+++PRESENCE_TABLES=${PRESENCE_TABLES:-presentity active_watchers watchers xcap \
++ pua rls_presentity rls_watchers}
++
++ # SQL definitions
++@@ -62,11 +62,11 @@ GREP=${GREP:-grep}
++ SED=${SED:-sed}
++
++ # define what modules should be installed
++-STANDARD_MODULES=${STANDARD_MODULES:-standard acc lcr domain group permissions
++- registrar usrloc msilo alias_db uri_db
++- speeddial avpops auth_db pdt dialog dispatcher
+++STANDARD_MODULES=${STANDARD_MODULES:-standard acc lcr domain group permissions \
+++ registrar usrloc msilo alias_db uri_db \
+++ speeddial avpops auth_db pdt dialog dispatcher \
++ dialplan}
++-EXTRA_MODULES=${EXTRA_MODULES:-imc cpl siptrace domainpolicy carrierroute
+++EXTRA_MODULES=${EXTRA_MODULES:-imc cpl siptrace domainpolicy carrierroute \
++ userblacklist htable purple uac pipelimit mtree}
++
++ ############################################################
+diff --git a/feeds/telephony/net/kamailio-3.x/patches/100-cross_compile.patch b/feeds/telephony/net/kamailio-3.x/patches/100-cross_compile.patch
+new file mode 100644
+index 0000000..a4ee4d8
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-3.x/patches/100-cross_compile.patch
+@@ -0,0 +1,11 @@
++--- a/modules_s/ldap/Makefile
+++++ b/modules_s/ldap/Makefile
++@@ -14,7 +14,7 @@
++ # LD_SCOPE_CHILDREN defined
++ #DEFS += -DHAVE_SCOPE_CHILDREN
++
++-LIBS=-L$(LOCALBASE)/lib -L /usr/lib -lldap
+++LIBS=-L$(LOCALBASE)/lib -lldap
++
++ DEFS+=-DSER_MOD_INTERFACE
++
+diff --git a/feeds/telephony/net/kamailio-3.x/patches/110-include-sys-time-h-in-ld_session-h.patch b/feeds/telephony/net/kamailio-3.x/patches/110-include-sys-time-h-in-ld_session-h.patch
+new file mode 100644
+index 0000000..a4857cf
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-3.x/patches/110-include-sys-time-h-in-ld_session-h.patch
+@@ -0,0 +1,12 @@
++Index: kamailio3-3.3.7/modules_k/ldap/ld_session.h
++===================================================================
++--- kamailio3-3.3.7.orig/modules_k/ldap/ld_session.h
+++++ kamailio3-3.3.7/modules_k/ldap/ld_session.h
++@@ -33,6 +33,7 @@
++ #ifndef LD_SESSION_H
++ #define LD_SESSION_H
++
+++#include <sys/time.h>
++ #include <ldap.h>
++
++ #include "iniparser.h"
+diff --git a/feeds/telephony/net/kamailio-4.x/Makefile b/feeds/telephony/net/kamailio-4.x/Makefile
+new file mode 100644
+index 0000000..f02ec01
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-4.x/Makefile
+@@ -0,0 +1,254 @@
++#
++# Copyright (C) 2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=kamailio4
++PKG_VERSION:=4.3.0
++PKG_RELEASE:=2
++
++PKG_SOURCE_URL:=http://www.kamailio.org/pub/kamailio/$(PKG_VERSION)/src/
++PKG_SOURCE:=kamailio-$(PKG_VERSION)$(PKG_VARIANT)_src.tar.gz
++PKG_MD5SUM:=4a6bd2f70f14d94a4ed9a8e6b18f89d7
++PKG_USE_MIPS16:=0
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++include $(INCLUDE_DIR)/nls.mk
++include $(INCLUDE_DIR)/package.mk
++
++TARGET_CFLAGS += $(FPIC)
++PREBUILT_STAMP=$(STAGING_DIR)/stamp/.$(PKG_NAME)_prebuilt
++TAR_CMD:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components 1 $(TAR_OPTIONS)
++
++define Package/kamailio4/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Telephony
++ URL:=http://www.kamailio.org/
++ DEPENDS:=$(ICONV_DEPENDS) +libncurses +libpthread +libreadline +libxml2
++endef
++
++define Package/kamailio4
++$(call Package/kamailio4/Default)
++ TITLE:=Mature and flexible open source SIP server, v$(PKG_VERSION)
++ MENU:=1
++endef
++
++define Package/kamailio4/conffiles
++/etc/default/kamailio
++/etc/kamailio/kamailio.cfg
++/etc/kamailio/dictionary.kamailio
++/etc/kamailio/kamctlrc
++endef
++
++define Package/kamailio4/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/sbin/kam{ailio,cmd,ctl,dbctl} \
++ $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/lib/kamailio/modules
++ $(INSTALL_BIN) \
++ $(PKG_INSTALL_DIR)/usr/lib/kamailio/lib*.so* \
++ $(1)/usr/lib/kamailio/
++ $(INSTALL_DIR) $(1)/etc/kamailio
++ $(CP) \
++ $(PKG_BUILD_DIR)/etc/{dictionary.kamailio,kamailio.cfg,kamailio-basic.cfg} \
++ $(1)/etc/kamailio/
++ $(CP) \
++ $(PKG_BUILD_DIR)/utils/kamctl/kamctlrc \
++ $(1)/etc/kamailio/
++ $(INSTALL_DIR) $(1)/etc/default
++ $(CP) \
++ ./files/kamailio.default \
++ $(1)/etc/default/kamailio
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) \
++ ./files/kamailio.init \
++ $(1)/etc/init.d/kamailio
++ $(INSTALL_DIR) $(1)/usr/lib/kamailio
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/kamailio/kamctl \
++ $(1)/usr/lib/kamailio/
++endef
++
++define Package/kamailio4/install/dbfiles
++ $(INSTALL_DIR) $(1)/usr/share/kamailio/$(2)
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/kamailio/$(2)/* $(1)/usr/share/kamailio/$(2)/
++endef
++
++define Package/kamailio4/install/module
++ $(INSTALL_DIR) $(1)/usr/lib/kamailio/modules
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/kamailio/modules/$(2).so* $(1)/usr/lib/kamailio/modules/
++endef
++
++define BuildKamailio4Module
++ define Package/kamailio4-mod-$(subst _,-,$(1))
++ $$(call Package/kamailio4/Default)
++ TITLE:= kamailio4 $(2) module
++ DEPENDS:=kamailio4 $(4)
++ endef
++
++ define Package/kamailio4-mod-$(subst _,-,$(1))/install
++$(call Package/kamailio4/install/module,$$(1),$(1))
++$(foreach d,$(5),$(call Package/kamailio4/install/dbfiles,$$(1),$(d));)
++ endef
++
++ INCL_MODULES+=$(1)
++ KAM_MODULES+=kamailio4-mod-$(subst _,-,$(1))
++endef
++
++################################
++# Kamailio module parameters
++# Params:
++# 1 - Module name
++# 2 - Module title
++# 3 - Module description
++# 4 - Dependencies
++# 5 - Kamailio DB files
++################################
++
++$(eval $(call BuildKamailio4Module,acc,Accounting,,+kamailio4-mod-tm))
++$(eval $(call BuildKamailio4Module,alias_db,Database-backend aliases,,+kamailio4-mod-db-sqlite))
++$(eval $(call BuildKamailio4Module,auth,Authentication Framework,,))
++$(eval $(call BuildKamailio4Module,auth_db,Database-backend authentication,,+kamailio4-mod-auth +kamailio4-mod-db-sqlite))
++$(eval $(call BuildKamailio4Module,auth_diameter,Diameter-backend authentication,,+kamailio4-mod-sl))
++$(eval $(call BuildKamailio4Module,auth_xkeys,Shared-key authentication,,+kamailio4-mod-auth))
++$(eval $(call BuildKamailio4Module,avpops,AVP operation,,))
++$(eval $(call BuildKamailio4Module,benchmark,Config benchmark,,))
++$(eval $(call BuildKamailio4Module,cfgutils,Config utilities,,))
++$(eval $(call BuildKamailio4Module,cfg_db,Load core and module parameters from database,,+kamailio4-mod-db-sqlite))
++$(eval $(call BuildKamailio4Module,cfg_rpc,Update core and module parameters at runtime via RPC interface,,))
++$(eval $(call BuildKamailio4Module,cnxcc,Limit call duration,,+kamailio4-mod-dialog +libhiredis +libevent2))
++$(eval $(call BuildKamailio4Module,corex,Legacy functions,,))
++$(eval $(call BuildKamailio4Module,ctl,BINRPC transport interface,,))
++$(eval $(call BuildKamailio4Module,db_flatstore,Fast writing-only text database-backed,,))
++$(eval $(call BuildKamailio4Module,db_mysql,MySQL database-backend,,+libmysqlclient,mysql))
++$(eval $(call BuildKamailio4Module,db_postgres,PostgreSQL Database-backend,,+libpq,postgres))
++$(eval $(call BuildKamailio4Module,db_sqlite,Sqlite DB support,,+libsqlite3,db_sqlite))
++$(eval $(call BuildKamailio4Module,db_text,Text database-backend,,,dbtext/kamailio))
++$(eval $(call BuildKamailio4Module,db_unixodbc,UnixODBC Database-backend,,+unixodbc))
++$(eval $(call BuildKamailio4Module,debugger,Interactive config file debugger,,))
++$(eval $(call BuildKamailio4Module,dialog,Dialog support,,+kamailio4-mod-rr +kamailio4-mod-tm))
++$(eval $(call BuildKamailio4Module,dialog_ng,Dialog support,,+kamailio4-mod-rr +kamailio4-mod-tm))
++$(eval $(call BuildKamailio4Module,dialplan,Dialplan management,,))
++$(eval $(call BuildKamailio4Module,dispatcher,Dispatcher,,))
++$(eval $(call BuildKamailio4Module,diversion,Diversion header insertion,,))
++$(eval $(call BuildKamailio4Module,domain,Multi-domain support,,))
++$(eval $(call BuildKamailio4Module,domainpolicy,Domain policy,,))
++$(eval $(call BuildKamailio4Module,drouting,Dynamic routing module,,))
++$(eval $(call BuildKamailio4Module,enum,ENUM lookup,,))
++$(eval $(call BuildKamailio4Module,evapi,push event details via tcp,,+libev))
++$(eval $(call BuildKamailio4Module,exec,External exec,,))
++$(eval $(call BuildKamailio4Module,group,Database-backend user-groups,,))
++$(eval $(call BuildKamailio4Module,h350,H.350,,+kamailio4-mod-ldap +libopenldap))
++$(eval $(call BuildKamailio4Module,htable,Hash Table,,))
++$(eval $(call BuildKamailio4Module,imc,IM conferencing,,+kamailio4-mod-db-mysql +kamailio4-mod-tm))
++$(eval $(call BuildKamailio4Module,ipops,IP and IPv6 operations,,))
++$(eval $(call BuildKamailio4Module,jansson,Alternative access to JSON document attributes,,+jansson))
++$(eval $(call BuildKamailio4Module,janssonrpc-c,Alternative JSONRPC server,,+kamailio4-mod-jansson +libevent2))
++$(eval $(call BuildKamailio4Module,json,Access to JSON document attributes,,+libjson-c))
++$(eval $(call BuildKamailio4Module,jsonrpc-s,JSONRPC server over HTTP,,+kamailio4-mod-json +libevent2))
++$(eval $(call BuildKamailio4Module,kex,Core extensions,,))
++$(eval $(call BuildKamailio4Module,lcr,Least Cost Routing,,+kamailio4-mod-tm +libpcre))
++$(eval $(call BuildKamailio4Module,ldap,LDAP connector,,+libopenldap))
++$(eval $(call BuildKamailio4Module,maxfwd,Max-Forward processor,,))
++$(eval $(call BuildKamailio4Module,mediaproxy,Automatic NAT traversal,,+kamailio4-mod-dialog))
++$(eval $(call BuildKamailio4Module,mi_datagram,Datagram support for Management Interface,,))
++$(eval $(call BuildKamailio4Module,mi_fifo,FIFO support for Management Interface,,))
++$(eval $(call BuildKamailio4Module,mi_rpc,RPC support for Management Interface,,))
++$(eval $(call BuildKamailio4Module,msilo,SIP message silo,,+kamailio4-mod-tm))
++$(eval $(call BuildKamailio4Module,msrp,MSRP routing engine,,+kamailio4-mod-tls))
++$(eval $(call BuildKamailio4Module,nathelper,NAT helper,,+kamailio4-mod-usrloc))
++$(eval $(call BuildKamailio4Module,nat_traversal,NAT traversal,,+kamailio4-mod-dialog +kamailio4-mod-sl +kamailio4-mod-tm))
++$(eval $(call BuildKamailio4Module,nosip,non-sip package handling,,+kamailio4-mod-rr))
++$(eval $(call BuildKamailio4Module,path,SIP path insertion,,+kamailio4-mod-rr))
++$(eval $(call BuildKamailio4Module,pdt,Prefix-to-Domain translator,,))
++$(eval $(call BuildKamailio4Module,permissions,Permissions control,,))
++$(eval $(call BuildKamailio4Module,pike,Flood detector,,))
++$(eval $(call BuildKamailio4Module,presence,Presence server,,+kamailio4-mod-sl +kamailio4-mod-tm +libxml2))
++$(eval $(call BuildKamailio4Module,presence_dialoginfo,Dialog Event presence,,+kamailio4-mod-presence))
++$(eval $(call BuildKamailio4Module,presence_mwi,Message Waiting Indication presence,,+kamailio4-mod-presence))
++$(eval $(call BuildKamailio4Module,presence_xml,XCAP presence,,+kamailio4-mod-presence +kamailio4-mod-xcap-client))
++$(eval $(call BuildKamailio4Module,pua,Presence User Agent,,+kamailio4-mod-tm +libxml2))
++$(eval $(call BuildKamailio4Module,pua_bla,Bridged Line Appearence PUA,,+kamailio4-mod-presence +kamailio4-mod-pua +kamailio4-mod-usrloc))
++$(eval $(call BuildKamailio4Module,pua_dialoginfo,Dialog Event PUA,,+kamailio4-mod-dialog +kamailio4-mod-pua))
++$(eval $(call BuildKamailio4Module,pua_mi,PUA Management Interface,,+kamailio4-mod-pua))
++$(eval $(call BuildKamailio4Module,pua_usrloc,PUA User Location,,+kamailio4-mod-pua +kamailio4-mod-usrloc))
++$(eval $(call BuildKamailio4Module,pua_xmpp,PUA XMPP,,+kamailio4-mod-presence +kamailio4-mod-pua +kamailio4-mod-xmpp))
++$(eval $(call BuildKamailio4Module,pv,Pseudo-Variables,,))
++$(eval $(call BuildKamailio4Module,qos,QoS control,,+kamailio4-mod-dialog))
++$(eval $(call BuildKamailio4Module,ratelimit,Traffic shapping,,))
++$(eval $(call BuildKamailio4Module,regex,Regular Expression,,+libpcre))
++$(eval $(call BuildKamailio4Module,registrar,SIP Registrar,,+kamailio4-mod-usrloc))
++$(eval $(call BuildKamailio4Module,rls,Resource List Server,,+kamailio4-mod-presence +kamailio4-mod-pua +kamailio4-mod-tm +libxml2))
++$(eval $(call BuildKamailio4Module,rr,Record-Route and Route,,))
++$(eval $(call BuildKamailio4Module,rtimer,Routing Timer,,))
++$(eval $(call BuildKamailio4Module,rtpengine,RTP engine,,+kamailio4-mod-tm))
++$(eval $(call BuildKamailio4Module,rtpproxy,RTP proxy,,+kamailio4-mod-tm))
++$(eval $(call BuildKamailio4Module,sanity,SIP sanity checks,,+kamailio4-mod-sl))
++$(eval $(call BuildKamailio4Module,sctp,SCTP support,,+libsctp))
++$(eval $(call BuildKamailio4Module,sipcapture,SIP capture,,))
++$(eval $(call BuildKamailio4Module,siptrace,SIP trace,,))
++$(eval $(call BuildKamailio4Module,siputils,SIP utilities,,+kamailio4-mod-sl))
++$(eval $(call BuildKamailio4Module,sl,Stateless replier,,))
++$(eval $(call BuildKamailio4Module,sms,SIP-to-SMS IM gateway,,+kamailio4-mod-tm))
++$(eval $(call BuildKamailio4Module,speeddial,Per-user speed-dial controller,,))
++$(eval $(call BuildKamailio4Module,sqlops,SQL operations,,))
++$(eval $(call BuildKamailio4Module,statistics,Script statistics,,))
++$(eval $(call BuildKamailio4Module,stun,STUN server support,,))
++$(eval $(call BuildKamailio4Module,sst,SIP Session Timer,,+kamailio4-mod-dialog +kamailio4-mod-sl))
++$(eval $(call BuildKamailio4Module,tcpops,TCP options tweaking operations,,))
++$(eval $(call BuildKamailio4Module,textops,Text operations,,))
++$(eval $(call BuildKamailio4Module,tls,TLS operations,,+libopenssl))
++$(eval $(call BuildKamailio4Module,topoh,Topology hiding,,+kamailio4-mod-rr))
++$(eval $(call BuildKamailio4Module,tm,Transaction,,))
++$(eval $(call BuildKamailio4Module,tmx,Transaction module extensions,,))
++$(eval $(call BuildKamailio4Module,uac,User Agent Client,,+kamailio4-mod-tm))
++$(eval $(call BuildKamailio4Module,uac_redirect,User Agent Client redirection,,+kamailio4-mod-tm))
++$(eval $(call BuildKamailio4Module,uri_db,Database-backend SIP URI checking,,))
++$(eval $(call BuildKamailio4Module,userblacklist,User blacklists,,))
++$(eval $(call BuildKamailio4Module,usrloc,User location,,))
++$(eval $(call BuildKamailio4Module,utils,Misc utilities,,+libcurl +libxml2))
++$(eval $(call BuildKamailio4Module,uuid,UUID utilities,,+libuuid))
++$(eval $(call BuildKamailio4Module,xcap_client,XCAP Client,,+libcurl))
++$(eval $(call BuildKamailio4Module,xlog,Advanced logger,,))
++$(eval $(call BuildKamailio4Module,xmlrpc,XML RPC module,,+libxml2))
++$(eval $(call BuildKamailio4Module,xmpp,SIP-to-XMPP Gateway,,+kamailio4-mod-tm +libexpat))
++
++PKG_MAKE_ARGS:= \
++ prefix=/ \
++ cfg_dir=/etc/kamailio/ \
++ bin_dir=/usr/sbin/ \
++ data_dir=/usr/share/kamailio/ \
++ lib_dir=/usr/lib/kamailio/ \
++ modules_dir=/usr/lib/kamailio/ \
++ include_modules="$(INCL_MODULES)" \
++ cfg_target:=/etc/kamailio/ \
++ TLS_HOOKS=1 \
++ extra_defs="-DUSE_PTHREAD_MUTEX " \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ LOCALBASE="$(STAGING_DIR)/usr" \
++ SYSBASE="$(STAGING_DIR)/usr" \
++ PCREDEFS:="$(TARGET_CPPFLAGS)" \
++ PCRELIBS:="$(TARGET_LDFLAGS)" \
++ CROSS_COMPILE=$(TARGET_CROSS) \
++ CC="$(TARGET_CC)" \
++ ARCH="$(ARCH)" \
++ DESTDIR=$(PKG_INSTALL_DIR) \
++ EXTRA_LIBS="-L$(STAGING_DIR)/usr/lib/" \
++ quiet=verbose
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) $(PKG_MAKE_ARGS) all
++ $(MAKE) -C $(PKG_BUILD_DIR) $(PKG_MAKE_ARGS) install
++endef
++
++$(eval $(call BuildPackage,kamailio4))
++$(foreach m,$(KAM_MODULES),$(eval $(call BuildPackage,$(m))))
+diff --git a/feeds/telephony/net/kamailio-4.x/files/kamailio.default b/feeds/telephony/net/kamailio-4.x/files/kamailio.default
+new file mode 100644
+index 0000000..1fc875d
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-4.x/files/kamailio.default
+@@ -0,0 +1,14 @@
++#
++# Kamailio startup options
++#
++
++# Set to yes to enable kamailio, once configured properly.
++#RUN_KAMAILIO=yes
++
++# Amount of shared and private memory to allocate
++# for the running Kamailio server (in Mb)
++#SHM_MEMORY=64
++#PKG_MEMORY=4
++
++# Config file
++#CFGFILE=/etc/kamailio/kamailio.cfg
+diff --git a/feeds/telephony/net/kamailio-4.x/files/kamailio.init b/feeds/telephony/net/kamailio-4.x/files/kamailio.init
+new file mode 100644
+index 0000000..38bba51
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-4.x/files/kamailio.init
+@@ -0,0 +1,38 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 OpenWrt.org
++
++START=99
++
++BINFILE=/usr/sbin/kamailio
++PIDFILE=/var/run/kamailio.pid
++DEFAULTS=/etc/default/kamailio
++CFGFILE=/etc/kamailio/kamailio.cfg
++SHM_MEMORY=8
++PKG_MEMORY=2
++RUN_KAMAILIO=no
++
++start() {
++ # Load startup options if available
++ if [ -f $DEFAULTS ]; then
++ . $DEFAULTS
++ fi
++
++ if [ "$RUN_KAMAILIO" != "yes" ]; then
++ echo "[WARNING] Kamailio not yet configured. Edit /etc/default/kamailio first."
++ else
++ start-stop-daemon -S -x $BINFILE -b -- -P $PIDFILE -f $CFGFILE -m $SHM_MEMORY -M $PKG_MEMORY
++ echo "[INFO] Kamailio has succesfully started."
++ fi
++}
++
++stop() {
++ start-stop-daemon -K -x $BINFILE -p $PIDFILE -q
++ rm -rf $PID_FILE
++}
++
++restart(){
++ echo "[INFO] Restarting kamailio. Waiting 5 seconds before start."
++ stop
++ sleep 5
++ start
++}
+diff --git a/feeds/telephony/net/kamailio-4.x/patches/050-fix-kamailio-utils.patch b/feeds/telephony/net/kamailio-4.x/patches/050-fix-kamailio-utils.patch
+new file mode 100644
+index 0000000..68c9ddd
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-4.x/patches/050-fix-kamailio-utils.patch
+@@ -0,0 +1,78 @@
++--- a/utils/kamctl/kamctl
+++++ b/utils/kamctl/kamctl
++@@ -1,4 +1,4 @@
++-#!/bin/bash
+++#!/bin/sh
++ #
++ # control tool for maintaining Kamailio
++ #
++--- a/utils/kamctl/kamctlrc
+++++ b/utils/kamctl/kamctlrc
++@@ -147,3 +147,6 @@
++ ## Extra start options - default is: not set
++ # example: start Kamailio with 64MB share memory: STARTOPTIONS="-m 64"
++ # STARTOPTIONS=
+++
+++# Disable colour printing in terminal
+++NOHLPRINT=1
++--- a/utils/kamctl/kamdbctl
+++++ b/utils/kamctl/kamdbctl
++@@ -1,4 +1,4 @@
++-#!/bin/bash
+++#!/bin/sh
++ #
++ # control tool for maintaining Kamailio databases
++ #
++--- a/utils/kamctl/kamdbctl.base
+++++ b/utils/kamctl/kamdbctl.base
++@@ -33,18 +33,18 @@ INSTALL_DBUID_TABLES=${INSTALL_DBUID_TAB
++
++ # Used by dbtext and db_berkeley to define tables to be created, used by
++ # postgres to do the grants
++-STANDARD_TABLES=${STANDARD_TABLES:-version acc dbaliases domain domain_attrs
++- grp uri speed_dial lcr_gw lcr_rule lcr_rule_target pdt subscriber
++- location location_attrs re_grp trusted address missed_calls
++- usr_preferences aliases silo dialog dialog_vars dispatcher dialplan
+++STANDARD_TABLES=${STANDARD_TABLES:-version acc dbaliases domain domain_attrs \
+++ grp uri speed_dial lcr_gw lcr_rule lcr_rule_target pdt subscriber \
+++ location location_attrs re_grp trusted address missed_calls \
+++ usr_preferences aliases silo dialog dialog_vars dispatcher dialplan \
++ acc_cdrs}
++-EXTRA_TABLES=${EXTRA_TABLES:-imc_members imc_rooms cpl sip_trace domainpolicy
++- carrierroute carrier_name domain_name carrierfailureroute userblacklist
++- globalblacklist htable purplemap uacreg pl_pipes mtree mtrees
+++EXTRA_TABLES=${EXTRA_TABLES:-imc_members imc_rooms cpl sip_trace domainpolicy \
+++ carrierroute carrier_name domain_name carrierfailureroute userblacklist \
+++ globalblacklist htable purplemap uacreg pl_pipes mtree mtrees \
++ sca_subscriptions mohqcalls mohqueues rtpproxy}
++-PRESENCE_TABLES=${PRESENCE_TABLES:-presentity active_watchers watchers xcap
+++PRESENCE_TABLES=${PRESENCE_TABLES:-presentity active_watchers watchers xcap \
++ pua rls_presentity rls_watchers}
++-DBUID_TABLES=${UID_TABLES:-uid_credentials uid_domain uid_domain_attrs
+++DBUID_TABLES=${UID_TABLES:-uid_credentials uid_domain uid_domain_attrs \
++ uid_global_attrs uid_uri uid_uri_attrs uid_user_attrs}
++
++ # SQL definitions
++@@ -68,17 +68,17 @@ GREP=${GREP:-grep}
++ SED=${SED:-sed}
++
++ # define what modules should be installed
++-STANDARD_MODULES=${STANDARD_MODULES:-standard acc lcr domain group
++- permissions registrar usrloc msilo alias_db uri_db speeddial
+++STANDARD_MODULES=${STANDARD_MODULES:-standard acc lcr domain group \
+++ permissions registrar usrloc msilo alias_db uri_db speeddial \
++ avpops auth_db pdt dialog dispatcher dialplan}
++
++ PRESENCE_MODULES=${PRESENCE_MODULES:-presence rls}
++
++-EXTRA_MODULES=${EXTRA_MODULES:-imc cpl siptrace domainpolicy carrierroute
++- userblacklist htable purple uac pipelimit mtree sca mohqueue
+++EXTRA_MODULES=${EXTRA_MODULES:-imc cpl siptrace domainpolicy carrierroute \
+++ userblacklist htable purple uac pipelimit mtree sca mohqueue \
++ rtpproxy}
++
++-DBUID_MODULES=${UID_MODULES:-uid_auth_db uid_avp_db uid_domain uid_gflags
+++DBUID_MODULES=${UID_MODULES:-uid_auth_db uid_avp_db uid_domain uid_gflags \
++ uid_uri_db}
++
++ ############################################################
+diff --git a/feeds/telephony/net/kamailio-4.x/patches/110-include-sys-time-h-in-ld_session-h.patch b/feeds/telephony/net/kamailio-4.x/patches/110-include-sys-time-h-in-ld_session-h.patch
+new file mode 100644
+index 0000000..2dab8d1
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-4.x/patches/110-include-sys-time-h-in-ld_session-h.patch
+@@ -0,0 +1,10 @@
++--- a/modules/ldap/ld_session.h
+++++ b/modules/ldap/ld_session.h
++@@ -33,6 +33,7 @@
++ #ifndef LD_SESSION_H
++ #define LD_SESSION_H
++
+++#include <sys/time.h>
++ #include <ldap.h>
++
++ #include "iniparser.h"
+diff --git a/feeds/telephony/net/kamailio-4.x/patches/111-include-sys-time-h-in-kamcmd-c.patch b/feeds/telephony/net/kamailio-4.x/patches/111-include-sys-time-h-in-kamcmd-c.patch
+new file mode 100644
+index 0000000..4615889
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-4.x/patches/111-include-sys-time-h-in-kamcmd-c.patch
+@@ -0,0 +1,10 @@
++--- a/utils/kamcmd/kamcmd.c
+++++ b/utils/kamcmd/kamcmd.c
++@@ -43,6 +43,7 @@
++ #include <errno.h>
++ #include <ctype.h> /* isprint */
++ #include <sys/socket.h>
+++#include <sys/time.h> /* struct timeval */
++ #include <sys/un.h> /* unix sock*/
++ #include <netinet/in.h> /* udp sock */
++ #include <sys/uio.h> /* writev */
+diff --git a/feeds/telephony/net/kamailio-4.x/patches/120-libevent-libs.patch b/feeds/telephony/net/kamailio-4.x/patches/120-libevent-libs.patch
+new file mode 100644
+index 0000000..918d27b
+--- /dev/null
++++ b/feeds/telephony/net/kamailio-4.x/patches/120-libevent-libs.patch
+@@ -0,0 +1,25 @@
++Index: kamailio4-4.3.0/modules/cnxcc/Makefile
++===================================================================
++--- kamailio4-4.3.0.orig/modules/cnxcc/Makefile
+++++ kamailio4-4.3.0/modules/cnxcc/Makefile
++@@ -8,7 +8,7 @@ include ../../Makefile.defs
++ auto_gen=
++ NAME=cnxcc.so
++
++-LIBS=-lhiredis -levent
+++LIBS=-lhiredis -levent $(EXTRA_LIBS)
++ DEFS+=-DOPENSER_MOD_INTERFACE
++ SERLIBPATH=../../lib
++ SER_LIBS+=$(SERLIBPATH)/kmi/kmi
++Index: kamailio4-4.3.0/modules/janssonrpc-c/netstring.h
++===================================================================
++--- kamailio4-4.3.0.orig/modules/janssonrpc-c/netstring.h
+++++ kamailio4-4.3.0/modules/janssonrpc-c/netstring.h
++@@ -24,6 +24,7 @@
++ #define __NETSTRING_STREAM_H
++
++ #include <string.h>
+++#include <event2/buffer.h>
++ #include <event2/bufferevent.h>
++
++ typedef struct {
+diff --git a/feeds/telephony/net/miax/Makefile b/feeds/telephony/net/miax/Makefile
+new file mode 100644
+index 0000000..2f99f32
+--- /dev/null
++++ b/feeds/telephony/net/miax/Makefile
+@@ -0,0 +1,55 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=miax
++PKG_VERSION:=1.4
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/miax
++PKG_MD5SUM:=44f0d2ef46ee2697d890b7b96846adc7
++PKG_CHECK_FORMAT_SECURITY:=0
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING LICENSE
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/miax
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Telephony
++ DEPENDS:=+libpthread
++ TITLE:=A console iax (asterisk) client
++ URL:=http://www.eja.it/?l=en&n=miax
++endef
++
++define Package/miax/description
++ miax is a console iax (asterisk) client, it can work with
++ a soundcard as a normal voip phone, taking input/output from
++ keyboard or analog/gsm/isdn modem.
++endef
++
++define Build/Compile
++ $(MAKE) -C "$(PKG_BUILD_DIR)" \
++ CC="$(TARGET_CC)" \
++ OFLAGS="$(TARGET_CFLAGS)" \
++ CPPFLAGS="$(TARGET_CPPFLAGS)" \
++ LDFLAGS="$(TARGET_LDFLAGS)" \
++ all
++endef
++
++define Package/miax/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/miax $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,miax))
+diff --git a/feeds/telephony/net/miax/patches/001-cross.patch b/feeds/telephony/net/miax/patches/001-cross.patch
+new file mode 100644
+index 0000000..f47c110
+--- /dev/null
++++ b/feeds/telephony/net/miax/patches/001-cross.patch
+@@ -0,0 +1,24 @@
++diff -ruN miax-1.4-old/Makefile miax-1.4-new/Makefile
++--- miax-1.4-old/Makefile 2005-04-27 18:56:13.000000000 +0200
+++++ miax-1.4-new/Makefile 2005-11-30 01:07:21.000000000 +0100
++@@ -1,4 +1,5 @@
++-CFLAGS= -Iiax/ -Igsm/inc -DIAXC_IAX2 -DLIBIAX -g -DPOSIXSLEEP -DLINUX -O2
+++OFLAGS= -02 -g
+++CFLAGS= -Iiax/ -Igsm/inc $(CPPFLAGS) -DIAXC_IAX2 -DLIBIAX -DPOSIXSLEEP -DLINUX $(OFLAGS)
++ SYSLIBS=-lpthread -lm -lbluetooth
++
++
++@@ -32,11 +33,10 @@
++ miax.o
++
++ all: $(OBJS)
++- gcc $(OBJS) $(CFLAGS) $(SYSLIBS) -o miax
++- cp miax /bin/miax
+++ $(CC) $(OBJS) $(CFLAGS) $(LDFLAGS) $(SYSLIBS) -o miax
++
++ static: $(OBJS) bluetooth.o
++- gcc $(OBJS) $(CFLAGS) $(SYSLIBS) -static -o miax
+++ $(CC) $(OBJS) $(CFLAGS) $(LDFLAGS) $(SYSLIBS) -static -o miax
++
++ clean:
++ rm -f $(OBJS) miax
+diff --git a/feeds/telephony/net/miax/patches/002-remove-bluetooth-support.patch b/feeds/telephony/net/miax/patches/002-remove-bluetooth-support.patch
+new file mode 100644
+index 0000000..02532e0
+--- /dev/null
++++ b/feeds/telephony/net/miax/patches/002-remove-bluetooth-support.patch
+@@ -0,0 +1,465 @@
++--- a/bluetooth.c
+++++ b/bluetooth.c
++@@ -1,345 +0,0 @@
++-/*
++-* Miax
++-*
++-* Copyright (C) 2004 by Ubaldo Porcheddu <ubaldo@eja.it>
++-*
++-* This program is free software; you can redistribute it and/or modify
++-* it under the terms of the GNU General Public License as published by
++-* the Free Software Foundation; either version 2 of the License, or
++-* (at your option) any later version.
++-*
++-* This program is distributed in the hope that it will be useful,
++-* but WITHOUT ANY WARRANTY; without even the implied warranty of
++-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++-* General Public License for more details.
++-*
++-* You should have received a copy of the GNU General Public License
++-* along with this program; if not, write to the Free Software
++-* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++-*/
++-
++-#include <stdio.h>
++-#include <errno.h>
++-#include <fcntl.h>
++-#include <unistd.h>
++-#include <stdlib.h>
++-#include <signal.h>
++-#include <termios.h>
++-#include <sys/wait.h>
++-#include <sys/time.h>
++-#include <sys/ioctl.h>
++-#include <sys/socket.h>
++-#include <bluetooth/bluetooth.h>
++-#include <bluetooth/hci.h>
++-#include <bluetooth/hci_lib.h>
++-#include <bluetooth/sco.h>
++-#include <bluetooth/rfcomm.h>
++-#include "iaxclient_lib.h"
++-
++-#define RTP 320
++-#define AFRAME 48
++-
++-static int fd_audio, il=0, ol=0, audio=0, compression=0;
++-static char dev_audio[10], in[512], out[512];
++-static int fd_modem, call=0, callsetup=0, m_status=0;
++-static bdaddr_t src, dst;
++-static int btchannel=3;
++-static int init=0;
++-extern int debug;
++-
++-int bt_init(char *devs) {
++- int l;
++-
++- if (init == 0) {
++- l=strlen(devs);
++- str2ba(strtok(devs,"/"), &src);
++- str2ba(strtok(NULL,"/"), &dst);
++- if (l > 35) { btchannel=atoi(strtok(NULL,"/")); }
++- init=1;
++- }
++- return 0;
++- }
++-
++-
++-int rfcomm_connect(bdaddr_t *src, bdaddr_t *dst, int channel) {
++-
++- struct sockaddr_rc addr;
++- int s;
++-
++- if ((s = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM)) < 0) {
++- return -1;
++- }
++- memset(&addr, 0, sizeof(addr));
++- addr.rc_family = AF_BLUETOOTH;
++- bacpy(&addr.rc_bdaddr, src);
++- addr.rc_channel = 0;
++- if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
++- close(s);
++- return -1;
++- }
++- memset(&addr, 0, sizeof(addr));
++- addr.rc_family = AF_BLUETOOTH;
++- bacpy(&addr.rc_bdaddr, dst);
++- addr.rc_channel = channel;
++- if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0 ){
++- close(s);
++- return -1;
++- }
++-
++- return s;
++- }
++-
++-
++-int sco_connect(bdaddr_t *src, bdaddr_t *dst) {
++-
++- struct sockaddr_sco addr;
++- struct sco_conninfo conn;
++- struct sco_options opts;
++- int s, size;
++-
++- if ((s = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO)) < 0) {
++- return -1;
++- }
++- memset(&addr, 0, sizeof(addr));
++- addr.sco_family = AF_BLUETOOTH;
++- bacpy(&addr.sco_bdaddr, src);
++- if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
++- close(s);
++- return -1;
++- }
++- memset(&addr, 0, sizeof(addr));
++- addr.sco_family = AF_BLUETOOTH;
++- bacpy(&addr.sco_bdaddr, dst);
++- if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0 ){
++- close(s);
++- return -1;
++- }
++-
++- return s;
++- }
++-
++-
++-int bt_audio_init(char *dev, int enc) {
++-
++- compression=enc;
++- return bt_init(dev);
++- }
++-
++-
++-int bt_audio_open() {
++-
++- if ((fd_audio = sco_connect(&src, &dst)) < 0) {
++- perror("Can't connect SCO audio channel");
++- close(fd_modem);
++- return -1;
++- }
++- audio=1;
++- fprintf(stderr, "BT audio ready.\n");
++-
++- return fd_audio;
++- }
++-
++-
++-int bt_audio_close() {
++-
++- audio=-1;
++-
++- return close(fd_audio);
++- }
++-
++-
++-int bt_audio_out(struct iaxc_call *call, void *encoded) {
++-
++- char buf[512], data[RTP];
++- int i=0,n=0,x=0,y=0,z=0;
++-
++- if (audio == 0) { bt_audio_open(); }
++- if (audio == 1) {
++-
++- y=RTP+ol;
++- memmove(buf,out,ol);
++-
++- if (compression == 0) {
++- memmove(data,encoded,RTP);
++- }
++- else {
++- if (!call->gsmin) { call->gsmin = gsm_create(); }
++- gsm_decode(call->gsmin, encoded, data);
++- }
++-
++- for(i=ol;i<y;i++) {
++- buf[i]=data[z++];
++- }
++-
++- for (i=0;i<y;i++){
++- data[x++]=buf[i];
++- if (x==AFRAME) {
++- write(fd_audio,data,AFRAME);
++- x=0;
++- }
++- }
++- z=(y-x);
++- for (ol=0;ol<x;ol++) { out[ol]=buf[z++]; }
++- }
++-
++- return z;
++- }
++-
++-
++-int bt_audio_in(struct iaxc_call *call) {
++-
++- char buf[RTP+RTP], data[AFRAME], dtmf_c;
++- int i,x=0,y=0;
++- gsm_frame fo;
++-
++- if (audio == 1) {
++- y=il;
++- memmove(buf,in,il);
++-
++- while(y < RTP) {
++- read(fd_audio, data, AFRAME);
++- for (i=0;i<AFRAME;i++) {
++- if (y==RTP) { x=i; }
++- buf[y++]=data[i];
++- }
++- }
++- il=y-RTP;
++- for (i=0;i<il;i++) { in[i]=data[x++]; }
++- if ((dtmf_c=dtmf(buf)) > 0) {
++- if (debug > 4) { fprintf(stderr, "Miax: dtmf %c\n", dtmf_c); }
++- iax_send_dtmf(call->session,dtmf_c);
++- }
++-
++- if ( compression == 0) {
++- iax_send_voice(call->session, AST_FORMAT_SLINEAR, buf , RTP);
++- }
++- else {
++- if(!call->gsmout) { call->gsmout = gsm_create(); }
++- gsm_encode(call->gsmout, (short *) buf, (void *)&fo);
++- iax_send_voice(call->session, AST_FORMAT_GSM, (char *)&fo, sizeof(gsm_frame));
++- }
++- }
++-
++- return 1;
++- }
++-
++-
++-int bt_modem_init(char *dev) {
++-
++- char *buf,tmp[1024];
++- int n=0,z=-1;
++-
++- bt_init(dev);
++-
++- if ((fd_modem = rfcomm_connect(&src, &dst, btchannel)) < 0) {
++- perror("Can't connect RFCOMM channel");
++- return -1;
++- }
++-
++- bt_modem("ATZ\r",tmp);
++- bt_modem("ATE1\r",tmp);
++- bt_modem("AT+CIND=?\r",tmp);
++- buf=strtok(tmp,"(");
++- while( buf=strtok(NULL,"))") ) {
++- n++;
++- if (strstr(buf,"\"call\"")) { call=n; z++;}
++- if (strstr(buf,"\"callsetup\"")) { callsetup=n; z++; }
++- }
++-
++- z+=bt_modem("AT+CLIP=1\r",tmp);
++- z+=bt_modem("AT+CMER=3,0,0,1\r",tmp);
++- fprintf(stderr, "BT modem ready.\n");
++-
++- m_status=1;
++-
++- return fd_modem;
++- }
++-
++-int bt_modem_close() {
++-
++- char buf[256];
++- int l=0;
++-
++- if (m_status > 1) {
++- m_status=-1;
++- bt_modem("AT+CHUP\r",buf);
++- l=close(fd_modem);
++- }
++-
++- return l;
++- }
++-
++-
++-int bt_modem(char* send, char *receive) {
++-
++- int l=0;
++- fd_set rfds;
++- struct timeval tv;
++- int retval;
++-
++- FD_ZERO(&rfds);
++- FD_SET(fd_modem, &rfds);
++- tv.tv_sec = 1;
++- tv.tv_usec = 0;
++-
++- if (strlen(send)) { write(fd_modem,send,strlen(send)); }
++-
++- if (m_status >= 0) {
++- if (retval = select(fd_modem+1, &rfds, NULL, NULL, &tv) > 0) {
++- memset(receive,0,1024);
++- l=read(fd_modem,receive,1024);
++- if (debug > 3) { fprintf(stderr, "%s\n", receive); }
++- }
++- }
++-
++- return l;
++- }
++-
++-
++-int bt_modem_loop(int status, char *number) {
++-
++- char buf[1024], tmp[1024];
++-
++- if (m_status < 0) { return -1; }
++-
++- if (status == 130 && m_status != 3) {
++- bt_modem("ATA\r",tmp);
++- m_status=3;
++- status=0;
++- return 100;
++- }
++- if (status == 100 && m_status != 2) {
++- sprintf(buf,"ATDT%s;\r",number);
++- bt_modem(buf,tmp);
++- status=0;
++- m_status=2;
++- }
++-
++-
++- if (bt_modem("",buf)) {
++-
++- sprintf(tmp,"+CIEV: %d,0",callsetup);
++- if (strstr(buf,tmp) && m_status != 5) {
++- m_status=5;
++- return 130;
++- }
++-
++- sprintf(tmp,"+CIEV: %d,0",call);
++- if (strstr(buf,tmp)) { return -5; }
++-
++- if (strstr(buf,"+CLIP:") && m_status != 4) {
++- strcpy(tmp,strtok(buf,"\""));
++- strcpy(number,strtok(NULL,"\""));
++- m_status=4;
++- return 101;
++- }
++- if (strstr(buf,"ERROR")) { return 1; }
++- if (strstr(buf,"BUSY")) { return -2; }
++- if (strstr(buf,"NO DIALTONE")) { return -3; }
++- if (strstr(buf,"NO CARRIER")) { return -4; }
++- if (strstr(buf,"RING")) { return 2; }
++- if (strstr(buf,"OK")) { return 1; }
++- }
++-
++- return 0;
++- }
++--- a/Makefile
+++++ b/Makefile
++@@ -1,6 +1,6 @@
++ OFLAGS= -02 -g
++ CFLAGS= -Iiax/ -Igsm/inc $(CPPFLAGS) -DIAXC_IAX2 -DLIBIAX -DPOSIXSLEEP -DLINUX $(OFLAGS)
++-SYSLIBS=-lpthread -lm -lbluetooth
+++SYSLIBS=-lpthread -lm
++
++
++ OBJS=\
++@@ -28,14 +28,13 @@ OBJS=\
++ iax/iaxclient_lib.o \
++ dtmf.o \
++ oss.o \
++- bluetooth.o \
++ modem.o \
++ miax.o
++
++ all: $(OBJS)
++ $(CC) $(OBJS) $(CFLAGS) $(LDFLAGS) $(SYSLIBS) -o miax
++
++-static: $(OBJS) bluetooth.o
+++static: $(OBJS)
++ $(CC) $(OBJS) $(CFLAGS) $(LDFLAGS) $(SYSLIBS) -static -o miax
++
++ clean:
++--- a/miax.c
+++++ b/miax.c
++@@ -130,7 +130,6 @@ void usage() {
++ fprintf(stderr, " -a audio device\n");
++ fprintf(stderr, " -g gsm codec\n");
++ fprintf(stderr, " -m modem device\n");
++- fprintf(stderr, " -b bluetooth device\n");
++ fprintf(stderr, " -i modem init string\n");
++ fprintf(stderr, " -l log level\n");
++ fprintf(stderr, " -o log output\n");
++--- a/miax.h
+++++ b/miax.h
++@@ -23,55 +23,53 @@
++
++ int debug=0;
++ int status=0;
++-int bt; //bluetooth
+++int bt; //bluetooth
++ int m=0; //modem
++ char number[1024];
++
++-int audio_init(char *dev, int compression) {
++- (bt) ? bt_audio_init(dev, compression) : oss_audio_init(dev, compression);
+++int audio_init(char *dev, int compression) {
+++ oss_audio_init(dev, compression);
++ }
++
++-int audio_open() {
++- (bt) ? bt_audio_open() : oss_audio_open();
+++int audio_open() {
+++ oss_audio_open();
++ }
++
++-int audio_out(struct iaxc_call *call, void *encoded) {
++- (bt) ? bt_audio_out(call,encoded) : oss_audio_out(call,encoded) ;
+++int audio_out(struct iaxc_call *call, void *encoded) {
+++ oss_audio_out(call,encoded) ;
++ }
++
++-int audio_in(struct iaxc_call *call) {
++- (bt) ? bt_audio_in(call) : oss_audio_in(call) ;
+++int audio_in(struct iaxc_call *call) {
+++ oss_audio_in(call) ;
++ }
++
++-int audio_close () {
++- (bt) ? bt_audio_close() : oss_audio_close() ;
+++int audio_close () {
+++ oss_audio_close() ;
++ }
++
++-int modem_init(char *dev) {
++- (bt) ? bt_modem_init(dev) : tty_modem_init(dev) ;
+++int modem_init(char *dev) {
+++ tty_modem_init(dev) ;
++ }
++
++-int modem(char *val) {
+++int modem(char *val) {
++ char tmp[1024];
++-
++- (bt) ? bt_modem(val, tmp) : tty_modem(val, tmp) ;
+++
+++ tty_modem(val, tmp) ;
++ }
++
++-int modem_close() {
++- (bt) ? bt_modem_close() : tty_modem_close() ;
+++int modem_close() {
+++ tty_modem_close() ;
++ }
++
++-int modem_loop(int status, char *number) {
++- if (bt) { return bt_modem_loop(status, number); }
++- else { return tty_modem_loop(status, number); }
+++int modem_loop(int status, char *number) {
+++ return tty_modem_loop(status, number);
++ }
++
++ int miax_loop(int status, char *number) {
++- if (m > 0 && bt > 0) { return bt_modem_loop(status, number); }
++- if (m > 0 && bt == 0) { return tty_modem_loop(status, number); }
++- if (m == 0) {
+++ if (m > 0) { return tty_modem_loop(status, number); }
+++ if (m == 0) {
++ printf("\nMiax console.\t[h] to hangup or quit\n");
++- return console_loop(status, number);
+++ return console_loop(status, number);
++ }
++ }
++ #endif
+diff --git a/feeds/telephony/net/miax/patches/003-musl-fixes.patch b/feeds/telephony/net/miax/patches/003-musl-fixes.patch
+new file mode 100644
+index 0000000..86b1c30
+--- /dev/null
++++ b/feeds/telephony/net/miax/patches/003-musl-fixes.patch
+@@ -0,0 +1,142 @@
++--- a/iax/iax.c
+++++ b/iax/iax.c
++@@ -45,7 +45,6 @@
++
++ #ifndef MACOSX
++ #include <malloc.h>
++-#include <error.h>
++ #endif
++
++ #endif
++--- a/miax.c
+++++ b/miax.c
++@@ -31,26 +31,26 @@
++ #include "iaxclient_lib.h"
++ #include "miax.h"
++
++-FILE *stderr;
+++FILE *_stderr;
++
++ int miax_closeall(int n) {
++
++ int l;
++
++- if (debug > 5 ) { fprintf(stderr,"Miax: status: %d\nMiax: event: %d\n",status, n); }
+++ if (debug > 5 ) { fprintf(_stderr,"Miax: status: %d\nMiax: event: %d\n",status, n); }
++
++ if (status >= 0) {
++ status=-1;
++
++ if (n < 0) {
++ iaxc_dump_all_calls();
++- if (debug > 5 ) { fprintf(stderr,"Miax: call dumped.\n"); }
+++ if (debug > 5 ) { fprintf(_stderr,"Miax: call dumped.\n"); }
++ }
++ audio_close();
++- if (debug > 5 ) { fprintf(stderr,"Miax: audio closed.\n"); }
+++ if (debug > 5 ) { fprintf(_stderr,"Miax: audio closed.\n"); }
++ if (m > 0) {
++ modem_close();
++- if (debug > 5 ) { fprintf(stderr,"Miax: modem closed.\n"); }
+++ if (debug > 5 ) { fprintf(_stderr,"Miax: modem closed.\n"); }
++ }
++ }
++
++@@ -63,7 +63,7 @@ int miax_callback(struct iax_event *e, i
++ switch(e->etype) {
++ case 0: //IAX_EVENT_CONNECT
++ strcpy(number,e->ies.called_number);
++- fprintf(stderr, "Miax: %s is looking for %s\n", e->ies.calling_number, number);
+++ fprintf(_stderr, "Miax: %s is looking for %s\n", e->ies.calling_number, number);
++ status=100;
++ break;
++ case 2: //IAX_EVENT_HANGUP:
++@@ -105,7 +105,7 @@ int console_loop(int status, char *numbe
++ read(0,buf,sizeof(buf));
++ if (status == 100) { return 130; }
++ if (strstr(buf,"h")) {
++- fprintf(stderr, "Miax: hanging up.\n");
+++ fprintf(_stderr, "Miax: hanging up.\n");
++ return -1;
++ }
++ else {
++@@ -119,21 +119,21 @@ int console_loop(int status, char *numbe
++
++
++ void usage() {
++- fprintf(stderr, "Usage: miax [-hndupsragmbil]\n\n");
++- fprintf(stderr, " -h this help\n");
++- fprintf(stderr, " -n source number\n");
++- fprintf(stderr, " -d destination number\n");
++- fprintf(stderr, " -u username\n");
++- fprintf(stderr, " -p password\n");
++- fprintf(stderr, " -s server\n");
++- fprintf(stderr, " -r register\n");
++- fprintf(stderr, " -a audio device\n");
++- fprintf(stderr, " -g gsm codec\n");
++- fprintf(stderr, " -m modem device\n");
++- fprintf(stderr, " -i modem init string\n");
++- fprintf(stderr, " -l log level\n");
++- fprintf(stderr, " -o log output\n");
++- fprintf(stderr, "\nReport bugs to <ubaldo@eja.it>\n");
+++ fprintf(_stderr, "Usage: miax [-hndupsragmbil]\n\n");
+++ fprintf(_stderr, " -h this help\n");
+++ fprintf(_stderr, " -n source number\n");
+++ fprintf(_stderr, " -d destination number\n");
+++ fprintf(_stderr, " -u username\n");
+++ fprintf(_stderr, " -p password\n");
+++ fprintf(_stderr, " -s server\n");
+++ fprintf(_stderr, " -r register\n");
+++ fprintf(_stderr, " -a audio device\n");
+++ fprintf(_stderr, " -g gsm codec\n");
+++ fprintf(_stderr, " -m modem device\n");
+++ fprintf(_stderr, " -i modem init string\n");
+++ fprintf(_stderr, " -l log level\n");
+++ fprintf(_stderr, " -o log output\n");
+++ fprintf(_stderr, "\nReport bugs to <ubaldo@eja.it>\n");
++ exit(1);
++ }
++
++@@ -216,7 +216,7 @@ int main(int argc, char **argv) {
++
++ printf("miax@eja.it\n");
++
++- stderr=fopen(log_output,"w");
+++ _stderr=fopen(log_output,"w");
++
++ iaxc_initialize(1);
++
++@@ -233,13 +233,13 @@ int main(int argc, char **argv) {
++ if (r > 0) { iaxc_register(username,password,hostname); }
++
++ if ( audio_init(audio_dev, compression) < 0) {
++- fprintf(stderr,"Miax: cannot initialize audio device!\n");
+++ fprintf(_stderr,"Miax: cannot initialize audio device!\n");
++ return -1;
++ }
++
++ if (m > 0) {
++ if (modem_init(modem_dev) < 0) {
++- fprintf(stderr,"Miax: cannot initialize modem device!\n");
+++ fprintf(_stderr,"Miax: cannot initialize modem device!\n");
++ return -1;
++ }
++ if (m == 2) { sprintf(buf,"%s\r",modem_i); modem(buf); }
++@@ -252,7 +252,7 @@ int main(int argc, char **argv) {
++
++ iaxc_start_processing_thread();
++
++- fprintf(stderr, "Miax: ready.\n");
+++ fprintf(_stderr, "Miax: ready.\n");
++
++ while(status >= 0) {
++ n = miax_loop(status, number);
++@@ -271,7 +271,7 @@ int main(int argc, char **argv) {
++ break;
++ }
++ }
++- fprintf(stderr, "Miax: bye! :)\n\n");
+++ fprintf(_stderr, "Miax: bye! :)\n\n");
++
++ exit(0);
++ }
+diff --git a/feeds/telephony/net/pcapsipdump/Makefile b/feeds/telephony/net/pcapsipdump/Makefile
+new file mode 100644
+index 0000000..ca26bda
+--- /dev/null
++++ b/feeds/telephony/net/pcapsipdump/Makefile
+@@ -0,0 +1,53 @@
++#
++# Copyright (C) 2009-2010 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=pcapsipdump
++PKG_VERSION:=0.2
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/pcapsipdump
++PKG_MD5SUM:=2c04c54c3478f7cb94978d54538006d2
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=LICENSE
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/pcapsipdump
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Telephony
++ DEPENDS:=+libpcap $(CXX_DEPENDS)
++ TITLE:=SIP sessions dumping tool
++ URL:=http://sourceforge.net/projects/pcapsipdump/
++endef
++
++define Package/pcapsipdump/description
++ pcapsipdump is a tool for dumping SIP sessions (+RTP traffic, if available) to disk in a
++ fashion similar to "tcpdump -w" (format is exactly the same), but one file per sip session
++ (even if there is thousands of concurrect SIP sessions).
++endef
++
++TARGET_CC=$(TARGET_CXX)
++
++define Build/Compile
++ $(TARGET_CONFIGURE_OPTS) \
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ CPPFLAGS="$(TARGET_CXXFLAGS) -fno-rtti" \
++ LIBS="-lpcap"
++endef
++
++define Package/pcapsipdump/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/pcapsipdump $(1)/usr/bin/
++endef
++
++$(eval $(call BuildPackage,pcapsipdump))
+diff --git a/feeds/telephony/net/restund/Makefile b/feeds/telephony/net/restund/Makefile
+new file mode 100644
+index 0000000..ad20e85
+--- /dev/null
++++ b/feeds/telephony/net/restund/Makefile
+@@ -0,0 +1,117 @@
++#
++# Copyright (C) 2010-2014 OpenWrt.org
++# Copyright (C) 2010 Alfred E. Heggestad
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=restund
++PKG_VERSION:=0.4.11
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://www.creytiv.com/pub/
++PKG_MD5SUM:=e50e57aa96a19add97193b7765740456
++
++PKG_LICENSE:=BSD-3-Clause
++PKG_LICENSE_FILES:=docs/COPYING
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++restund-mods:= mysql
++
++PKG_CONFIG_DEPENDS:= $(patsubst %,CONFIG_PACKAGE_restund-mod-%,$(restund-mods))
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/restund/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Telephony
++ URL:=http://www.creytiv.com/
++endef
++
++define Package/restund
++$(call Package/restund/Default)
++ TITLE:=Modular STUN/TURN server
++ DEPENDS:=+libre +libpthread
++endef
++
++restund-mod-mysql := USE_MYSQL
++
++RESTUND_MOD_OPTIONS:= \
++ $(foreach m,$(restund-mods),$(restund-mod-$(m))=$(if $(CONFIG_PACKAGE_restund-mod-$(m)),1))
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ LIBRE_MK="$(STAGING_DIR)/usr/share/re/re.mk" \
++ LIBRE_INC="$(STAGING_DIR)/usr/include/re" \
++ LIBRE_SO="$(STAGING_DIR)/usr/lib" \
++ CC="$(TARGET_CC)" \
++ EXTRA_CFLAGS="$(TARGET_CFLAGS)" \
++ DESTDIR="$(PKG_INSTALL_DIR)" \
++ SYSROOT="$$$$($(FIND) $(TOOLCHAIN_DIR) -path '*/include/pthread.h' | sed -ne '1s#/include/pthread.h##p')" \
++ SYSROOT_ALT="$(STAGING_DIR)/usr" \
++ RELEASE=1 \
++ CROSS_COMPILE="$(TARGET_CROSS)" \
++ OS="linux" \
++ $(RESTUND_MOD_OPTIONS) \
++ all install
++endef
++
++define Package/restund/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(CP) $(PKG_INSTALL_DIR)/usr/sbin/restund $(1)/usr/sbin/
++ $(INSTALL_DIR) $(1)/usr/lib/restund/modules
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/restund/modules/auth.so \
++ $(PKG_INSTALL_DIR)/usr/lib/restund/modules/binding.so \
++ $(PKG_INSTALL_DIR)/usr/lib/restund/modules/stat.so \
++ $(PKG_INSTALL_DIR)/usr/lib/restund/modules/status.so \
++ $(PKG_INSTALL_DIR)/usr/lib/restund/modules/syslog.so \
++ $(PKG_INSTALL_DIR)/usr/lib/restund/modules/turn.so \
++ $(1)/usr/lib/restund/modules/
++ $(INSTALL_DIR) $(1)/etc
++ $(INSTALL_CONF) $(PKG_BUILD_DIR)/etc/restund.conf $(1)/etc/
++ $(SED) \
++ 's|^\(module_path\)\([ \t]\+\).*$$$$|\1\2/usr/lib/restund/modules|g' \
++ $(1)/etc/restund.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/restund.init $(1)/etc/init.d/restund
++endef
++
++define Package/restund/conffiles
++/etc/restund.conf
++endef
++
++#
++# 1. Name
++# 2. Title
++# 3. Files
++# 4. Depends
++#
++define BuildPlugin
++
++ define Package/restund-mod-$(1)
++ $$(call Package/restund/Default)
++ TITLE:= restund $(2) module
++ DEPENDS:= restund $(4)
++ endef
++
++ define Package/restund-mod-$(1)/install
++ [ -z "$(3)" ] || $(INSTALL_DIR) $$(1)/usr/lib/restund/modules
++ for f in $(3); do \
++ $(CP) \
++ $(PKG_INSTALL_DIR)/usr/lib/restund/modules/$$$$$$$${f}.so \
++ $$(1)/usr/lib/restund/modules/ ; \
++ done
++ endef
++
++ $$(eval $$(call BuildPackage,restund-mod-$(1)))
++endef
++
++$(eval $(call BuildPackage,restund))
++
++$(eval $(call BuildPlugin,mysql,MySQL database backend,mysql_ser,+PACKAGE_restund-mod-mysql:libmysqlclient))
+diff --git a/feeds/telephony/net/restund/files/restund.init b/feeds/telephony/net/restund/files/restund.init
+new file mode 100644
+index 0000000..d6360ff
+--- /dev/null
++++ b/feeds/telephony/net/restund/files/restund.init
+@@ -0,0 +1,15 @@
++#!/bin/sh /etc/rc.common
++#
++# Copyright (C) 2010-2011 OpenWrt.org
++# Copyright (C) 2010 Alfred E. Heggestad
++#
++
++START=60
++
++start() {
++ service_start /usr/sbin/restund
++}
++
++stop() {
++ service_stop /usr/sbin/restund
++}
+diff --git a/feeds/telephony/net/rtpproxy/Makefile b/feeds/telephony/net/rtpproxy/Makefile
+new file mode 100644
+index 0000000..7b4fe90
+--- /dev/null
++++ b/feeds/telephony/net/rtpproxy/Makefile
+@@ -0,0 +1,49 @@
++#
++# Copyright (C) 2014 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=rtpproxy
++PKG_VERSION:=2.0.0
++PKG_RELEASE:=1
++
++PKG_SOURCE_PROTO:=git
++PKG_SOURCE_URL:=git://github.com/sippy/rtpproxy.git
++PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
++PKG_SOURCE_VERSION:=d5926892630139bcbe55d1f3fa36764c881648bc
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
++
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
++PKG_CHECK_FORMAT_SECURITY:=0
++PKG_INSTALL:=1
++
++PKG_LICENSE:=BSD-2-Clause
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/rtpproxy
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Telephony
++ DEPENDS:=+libpthread +librt
++ TITLE:=RTP (Realtime Transport Protocol) proxy
++ URL:=http://www.rtpproxy.org/
++endef
++
++define Package/rtpproxy/install
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/rtpproxy $(1)/usr/bin/
++
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/rtpproxy.init $(1)/etc/init.d/rtpproxy
++
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_BIN) ./files/rtpproxy.config $(1)/etc/config/rtpproxy
++endef
++
++$(eval $(call BuildPackage,rtpproxy))
+diff --git a/feeds/telephony/net/rtpproxy/files/rtpproxy.config b/feeds/telephony/net/rtpproxy/files/rtpproxy.config
+new file mode 100644
+index 0000000..7087251
+--- /dev/null
++++ b/feeds/telephony/net/rtpproxy/files/rtpproxy.config
+@@ -0,0 +1,14 @@
++config rtpproxy global
++ option enabled 0 # 0 - disabled, 1 - enabled
++
++config instance 'site1'
++ option socket 'udp:127.0.0.1:7723' # socket
++ option ipaddr '127.0.0.1' # IPv4 address
++ option ip6addr '2001:0db8:0000:0000:0000:0000:1428:57ab' # IPv6 address
++ option user 'nobody' # userid to run rtpproxy instance from
++ option opts '' # additional options for rtpproxy instance
++
++config instance 'site2'
++ option socket 'udp:127.0.0.1:7724'
++ option ipaddr '192.168.1.1'
++
+diff --git a/feeds/telephony/net/rtpproxy/files/rtpproxy.init b/feeds/telephony/net/rtpproxy/files/rtpproxy.init
+new file mode 100644
+index 0000000..d1e2b37
+--- /dev/null
++++ b/feeds/telephony/net/rtpproxy/files/rtpproxy.init
+@@ -0,0 +1,70 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2014 CESNET, z.s.p.o
++
++START=99
++RTPPROXY_BIN="/usr/bin/rtpproxy"
++
++run_instance(){
++ local params="$1"
++
++ ${RTPPROXY_BIN} $1
++ echo "[INFO] rtpproxy instance $2 has started"
++}
++
++check_param(){
++ local param="$1"
++ local value="$2"
++ local default_value="$3"
++
++ if [ "$value" != "" ]; then
++ rtpproxy_options=$rtpproxy_options" $param $value"
++ else
++ if [ "$default_value" != "" ]; then
++ rtpproxy_options=$rtpproxy_options" $param $default_value"
++ fi
++ fi
++}
++
++check_special_param(){
++ local param="$1"
++
++ if [ "$param" != "" ]; then
++ rtpproxy_options=$rtpproxy_options" $param"
++ fi
++}
++
++handle_instance() {
++ local site="$1"
++ local socket opts ipaddr ip6addr rtpproxy_options
++
++ config_get socket "$site" socket
++ config_get opts "$site" opts
++ config_get ipaddr "$site" ipaddr
++ config_get ip6addr "$site" ip6addr
++ config_get user "$site" user
++
++ check_param "-s" "$socket"
++ check_param "-l" "$ipaddr"
++ check_param "-6" "$ip6addr"
++ check_param "-u" "$user" "nobody"
++ check_special_param "$opts"
++
++ run_instance "$rtpproxy_options" "$site"
++}
++
++start(){
++ config_load rtpproxy
++ local section="global"
++ config_get_bool enabled global enabled 0
++
++ if [ "$enabled" -eq 1 ]; then
++ config_foreach handle_instance instance
++ else
++ echo "[WARNING] rtpproxy not yet configured. Edit /etc/config/rtpproxy first."
++ fi
++}
++
++stop() {
++ killall rtpproxy
++}
++
+diff --git a/feeds/telephony/net/rtpproxy/patches/100-no-sysctl-on-musl.patch b/feeds/telephony/net/rtpproxy/patches/100-no-sysctl-on-musl.patch
+new file mode 100644
+index 0000000..f337733
+--- /dev/null
++++ b/feeds/telephony/net/rtpproxy/patches/100-no-sysctl-on-musl.patch
+@@ -0,0 +1,14 @@
++Index: rtpproxy-2.0.0/src/rtpp_util.c
++===================================================================
++--- rtpproxy-2.0.0.orig/src/rtpp_util.c
+++++ rtpproxy-2.0.0/src/rtpp_util.c
++@@ -28,7 +28,9 @@
++
++ #include <sys/time.h>
++ #include <sys/types.h>
+++#ifdef __GLIBC__
++ #include <sys/sysctl.h>
+++#endif
++ #include <sys/resource.h>
++ #include <errno.h>
++ #include <fcntl.h>
+diff --git a/feeds/telephony/net/rtpproxy/patches/101-include-endian-h.patch b/feeds/telephony/net/rtpproxy/patches/101-include-endian-h.patch
+new file mode 100644
+index 0000000..4a4b390
+--- /dev/null
++++ b/feeds/telephony/net/rtpproxy/patches/101-include-endian-h.patch
+@@ -0,0 +1,13 @@
++Index: rtpproxy-2.0.0/src/rtp.h
++===================================================================
++--- rtpproxy-2.0.0.orig/src/rtp.h
+++++ rtpproxy-2.0.0/src/rtp.h
++@@ -29,6 +29,8 @@
++ #ifndef _RTP_H_
++ #define _RTP_H_
++
+++#include <endian.h>
+++
++ /*
++ * RTP payload types
++ */
+diff --git a/feeds/telephony/net/rtpproxy/patches/102-don-t-build-rtpproxy_debug.patch b/feeds/telephony/net/rtpproxy/patches/102-don-t-build-rtpproxy_debug.patch
+new file mode 100644
+index 0000000..5d96054
+--- /dev/null
++++ b/feeds/telephony/net/rtpproxy/patches/102-don-t-build-rtpproxy_debug.patch
+@@ -0,0 +1,23 @@
++Index: rtpproxy-2.0.0/src/Makefile.am
++===================================================================
++--- rtpproxy-2.0.0.orig/src/Makefile.am
+++++ rtpproxy-2.0.0/src/Makefile.am
++@@ -1,4 +1,4 @@
++-bin_PROGRAMS=rtpproxy rtpproxy_debug
+++bin_PROGRAMS=rtpproxy
++ rtpproxy_SOURCES=main.c rtp.h rtp_server.c rtp_server.h \
++ rtpp_defines.h rtpp_log.h rtpp_record.c rtpp_record.h rtpp_session.h \
++ rtpp_util.c rtpp_util.h rtp.c rtp_resizer.c rtp_resizer.h rtpp_session.c \
++Index: rtpproxy-2.0.0/src/Makefile.in
++===================================================================
++--- rtpproxy-2.0.0.orig/src/Makefile.in
+++++ rtpproxy-2.0.0/src/Makefile.in
++@@ -78,7 +78,7 @@ PRE_UNINSTALL = :
++ POST_UNINSTALL = :
++ build_triplet = @build@
++ host_triplet = @host@
++-bin_PROGRAMS = rtpproxy$(EXEEXT) rtpproxy_debug$(EXEEXT)
+++bin_PROGRAMS = rtpproxy$(EXEEXT)
++ subdir = src
++ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
++ $(srcdir)/config.h.in $(top_srcdir)/depcomp
+diff --git a/feeds/telephony/net/sipp/Makefile b/feeds/telephony/net/sipp/Makefile
+new file mode 100644
+index 0000000..fe8e1e1
+--- /dev/null
++++ b/feeds/telephony/net/sipp/Makefile
+@@ -0,0 +1,71 @@
++#
++# Copyright (C) 2013-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=sipp
++PKG_VERSION:=3.3.990
++PKG_RELEASE:=2
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/sipp
++PKG_MD5SUM:=904fffbc277bafce28762ebb041b9620
++PKG_CHECK_FORMAT_SECURITY:=0
++
++PKG_LICENSE:=GPL-2.0+ BSD-3-Clause Zlib
++PKG_LICENSE_FILES:=LICENSE.txt
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/sipp
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Telephony
++ DEPENDS:= +libncurses +libpthread $(CXX_DEPENDS)
++ TITLE:=test tool / traffic generator for the SIP protocol
++ URL:=http://sipp.sourceforge.net/
++endef
++
++define Package/sipp/description
++ SIPp is a free Open Source test tool / traffic generator for the SIP
++ protocol. It includes a few basic SipStone user agent scenarios (UAC and
++ UAS) and establishes and releases multiple calls with the INVITE and BYE
++ methods.
++endef
++
++TAR_CMD:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components 1 $(TAR_OPTIONS)
++
++CONFIGURE_ARGS+= \
++ --build=$(GNU_HOST_NAME) \
++ --host=$(GNU_TARGET_NAME) \
++ --target=$(GNU_TARGET_NAME) \
++ --enable-epoll \
++ --without-gsl \
++ --without-pcap \
++ --with-rtpstream \
++ --without-sctp
++
++define Build/Compile
++ $(MAKE) -C $(PKG_BUILD_DIR) \
++ $(TARGET_CONFIGURE_OPTS) \
++ CC_linux="$(TARGET_CXX)" \
++ CPP_linux="$(TARGET_CXX)" \
++ CCLINK_linux="$(TARGET_CXX)" \
++ CFLAGS="$(TARGET_CFLAGS)" \
++ CPPFLAGS_linux="$(TARGET_CPPFLAGS) -fno-rtti" \
++ LFLAGS_linux="$(TARGET_LDFLAGS)" \
++ LIBS="-lncurses -ldl -lpthread -lm" \
++ all
++endef
++
++define Package/sipp/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/sipp $(1)/usr/sbin/
++endef
++
++$(eval $(call BuildPackage,sipp))
+diff --git a/feeds/telephony/net/sipp/patches/100-musl-compat.patch b/feeds/telephony/net/sipp/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..c5e945f
+--- /dev/null
++++ b/feeds/telephony/net/sipp/patches/100-musl-compat.patch
+@@ -0,0 +1,12 @@
++--- a/src/auth.c
+++++ b/src/auth.c
++@@ -22,9 +22,7 @@
++ * Frederique Aurouet
++ */
++
++-#if defined( __FreeBSD__) || defined(__DARWIN) || defined(__SUNOS)
++ #include <sys/types.h>
++-#endif
++ #include <stdlib.h>
++ #include <stdio.h>
++ #include <string.h>
+diff --git a/feeds/telephony/net/siproxd/Makefile b/feeds/telephony/net/siproxd/Makefile
+new file mode 100644
+index 0000000..a2d58a8
+--- /dev/null
++++ b/feeds/telephony/net/siproxd/Makefile
+@@ -0,0 +1,89 @@
++#
++# Copyright (C) 2014-2015 OpenWrt.org
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++PKG_NAME:=siproxd
++PKG_VERSION:=0.8.1
++PKG_RELEASE:=5
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=@SF/siproxd
++PKG_MD5SUM:=1a6f9d13aeb2d650375c9a346ac6cbaf
++
++PKG_FIXUP:=autoreconf
++PKG_INSTALL:=1
++PKG_BUILD_PARALLEL:=1
++
++PKG_LICENSE:=GPL-2.0+
++PKG_LICENSE_FILES:=COPYING
++
++include $(INCLUDE_DIR)/package.mk
++
++define Package/siproxd/Default
++ SECTION:=net
++ CATEGORY:=Network
++ SUBMENU:=Telephony
++ URL:=http://siproxd.sourceforge.net/
++endef
++
++define Package/siproxd
++ $(call Package/siproxd/Default)
++ DEPENDS:=+libltdl +libpthread +libosip2
++ TITLE:=SIP (Session Initiation Protocol) proxy
++ MENU:=1
++endef
++
++define Package/siproxd/description
++ Siproxd is a proxy/masquerading daemon for the SIP protocol.
++endef
++
++define Package/siproxd/conffiles
++/etc/config/siproxd
++endef
++
++CONFIGURE_ARGS+= \
++ --with-libosip-prefix="$(STAGING_DIR)/usr" \
++ --disable-doc
++
++MAKE_FLAGS+= \
++ SUBDIRS="src scripts contrib" \
++ LIBLTDL="$(STAGING_DIR)/usr/lib/libltdl.la" \
++
++define Package/siproxd/install
++ $(INSTALL_DIR) $(1)/usr/sbin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/siproxd $(1)/usr/sbin
++ $(INSTALL_DIR) $(1)/etc/config
++ $(INSTALL_CONF) ./files/siproxd.config $(1)/etc/config/siproxd
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/siproxd.init $(1)/etc/init.d/siproxd
++endef
++
++define BuildPlugin
++ define Package/siproxd-mod-$(1)
++ $$(call Package/siproxd/Default)
++ TITLE:= siproxd $(1) plugin
++ DEPENDS:=siproxd
++ endef
++
++ define Package/siproxd-mod-$(1)/install
++ $(INSTALL_DIR) $$(1)/usr/lib/siproxd
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/siproxd/plugin_$(1)*.so* $$(1)/usr/lib/siproxd
++ endef
++
++ $$(eval $$(call BuildPackage,siproxd-mod-$(1)))
++endef
++
++$(eval $(call BuildPackage,siproxd))
++$(eval $(call BuildPlugin,defaulttarget))
++$(eval $(call BuildPlugin,demo))
++$(eval $(call BuildPlugin,fix_bogus_via))
++$(eval $(call BuildPlugin,logcall))
++$(eval $(call BuildPlugin,prefix))
++$(eval $(call BuildPlugin,regex))
++$(eval $(call BuildPlugin,shortdial))
++$(eval $(call BuildPlugin,stun))
+diff --git a/feeds/telephony/net/siproxd/files/siproxd.config b/feeds/telephony/net/siproxd/files/siproxd.config
+new file mode 100644
+index 0000000..b65148c
+--- /dev/null
++++ b/feeds/telephony/net/siproxd/files/siproxd.config
+@@ -0,0 +1,3 @@
++config siproxd general
++ option if_inbound lan
++ option if_outbound wan
+diff --git a/feeds/telephony/net/siproxd/files/siproxd.init b/feeds/telephony/net/siproxd/files/siproxd.init
+new file mode 100644
+index 0000000..1ad6e0f
+--- /dev/null
++++ b/feeds/telephony/net/siproxd/files/siproxd.init
+@@ -0,0 +1,235 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2008 Alina Friedrichsen
++# Copyright (C) 2011 OpenWrt.org
++
++START=50
++
++SERVICE_USE_PID=1
++
++siproxd_bin="/usr/sbin/siproxd"
++siproxd_conf_dir="/var/etc"
++siproxd_conf_prefix="$siproxd_conf_dir/siproxd-"
++siproxd_registration_dir="/var/lib/siproxd"
++siproxd_pid_dir="/var/run/siproxd"
++
++deal_with_lists () {
++ echo "$2" = "$1" >> "$siproxd_conf_prefix$cfg"
++}
++
++start_instance() {
++ local cfg="$1"
++
++ config_get if_inbound "$cfg" if_inbound
++ config_get if_outbound "$cfg" if_outbound
++ config_get host_outbound "$cfg" host_outbound
++ config_get hosts_allow_reg "$cfg" hosts_allow_reg
++ config_get hosts_allow_sip "$cfg" hosts_allow_sip
++ config_get hosts_deny_sip "$cfg" hosts_deny_sip
++ config_get sip_listen_port "$cfg" sip_listen_port 5060
++ config_get_bool daemonize "$cfg" daemonize 1
++ config_get silence_log "$cfg" silence_log 4
++ config_get user "$cfg" user nobody
++ config_get chrootjail "$cfg" chrootjail
++ config_get registration_file "$cfg" registration_file "$siproxd_registration_dir/siproxd_registrations-$cfg"
++ config_get autosave_registrations "$cfg" autosave_registrations 300
++ config_get pid_file "$cfg" pid_file "$siproxd_pid_dir/siproxd-$cfg.pid"
++ config_get_bool rtp_proxy_enable "$cfg" rtp_proxy_enable 1
++ config_get rtp_port_low "$cfg" rtp_port_low 7070
++ config_get rtp_port_high "$cfg" rtp_port_high 7089
++ config_get rtp_timeout "$cfg" rtp_timeout 300
++ config_get rtp_dscp "$cfg" rtp_dscp 46
++ config_get sip_dscp "$cfg" sip_dscp 0
++ config_get rtp_input_dejitter "$cfg" rtp_input_dejitter 0
++ config_get rtp_output_dejitter "$cfg" rtp_output_dejitter 0
++ config_get tcp_timeout "$cfg" tcp_timeout 600
++ config_get tcp_connect_timeout "$cfg" tcp_connect_timeout 500
++ config_get tcp_keepalive "$cfg" tcp_keepalive 20
++ config_get default_expires "$cfg" default_expires 600
++ config_get proxy_auth_realm "$cfg" proxy_auth_realm
++ config_get proxy_auth_passwd "$cfg" proxy_auth_passwd
++ config_get proxy_auth_pwfile "$cfg" proxy_auth_pwfile
++ config_get debug_level "$cfg" debug_level 0x00000000
++ config_get debug_port "$cfg" debug_port 0
++ config_get mask_host "$cfg" mask_host
++ config_get masked_host "$cfg" masked_host
++ config_get ua_string "$cfg" ua_string Siproxd-UA
++ config_get use_rport "$cfg" use_rport 0
++ config_get outbound_proxy_host "$cfg" outbound_proxy_host
++ config_get outbound_proxy_port "$cfg" outbound_proxy_port
++ config_get outbound_domain_name "$cfg" outbound_domain_name
++ config_get outbound_domain_host "$cfg" outbound_domain_host
++ config_get outbound_domain_port "$cfg" outbound_domain_port
++
++ if [ -f "$siproxd_conf_prefix$cfg" ]; then
++ rm "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$if_inbound" ]; then
++ echo if_inbound = "$if_inbound" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$if_outbound" ]; then
++ echo if_outbound = "$if_outbound" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$host_outbound" ]; then
++ echo host_outbound = "$host_outbound" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$hosts_allow_reg" ]; then
++ echo hosts_allow_reg = "$hosts_allow_reg" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$hosts_allow_sip" ]; then
++ echo hosts_allow_sip = "$hosts_allow_sip" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$hosts_deny_sip" ]; then
++ echo hosts_deny_sip = "$hosts_deny_sip" >> "$siproxd_conf_prefix$cfg"
++ fi
++ echo sip_listen_port = "$sip_listen_port" >> "$siproxd_conf_prefix$cfg"
++ echo daemonize = "$daemonize" >> "$siproxd_conf_prefix$cfg"
++ echo silence_log = "$silence_log" >> "$siproxd_conf_prefix$cfg"
++ echo user = "$user" >> "$siproxd_conf_prefix$cfg"
++ if [ -n "$chrootjail" ]; then
++ if [ ! -d "$chrootjail" ]; then
++ mkdir -p "$chrootjail"
++ chmod 0755 "$chrootjail"
++ fi
++ echo chrootjail = "$chrootjail" >> "$siproxd_conf_prefix$cfg"
++ fi
++ echo registration_file = "$registration_file" >> "$siproxd_conf_prefix$cfg"
++ echo autosave_registrations = "$autosave_registrations" >> "$siproxd_conf_prefix$cfg"
++
++ echo pid_file = "$pid_file" >> "$siproxd_conf_prefix$cfg"
++ echo rtp_proxy_enable = "$rtp_proxy_enable" >> "$siproxd_conf_prefix$cfg"
++ echo rtp_port_low = "$rtp_port_low" >> "$siproxd_conf_prefix$cfg"
++ echo rtp_port_high = "$rtp_port_high" >> "$siproxd_conf_prefix$cfg"
++ echo rtp_timeout = "$rtp_timeout" >> "$siproxd_conf_prefix$cfg"
++ echo rtp_dscp = "$rtp_dscp" >> "$siproxd_conf_prefix$cfg"
++ echo sip_dscp = "$sip_dscp" >> "$siproxd_conf_prefix$cfg"
++ echo rtp_input_dejitter = "$rtp_input_dejitter" >> "$siproxd_conf_prefix$cfg"
++ echo rtp_output_dejitter = "$rtp_output_dejitter" >> "$siproxd_conf_prefix$cfg"
++ echo tcp_timeout = "$tcp_timeout" >> "$siproxd_conf_prefix$cfg"
++ echo tcp_connect_timeout = "$tcp_connect_timeout" >> "$siproxd_conf_prefix$cfg"
++ echo tcp_keepalive = "$tcp_keepalive" >> "$siproxd_conf_prefix$cfg"
++ echo default_expires = "$default_expires" >> "$siproxd_conf_prefix$cfg"
++ if [ -n "$proxy_auth_realm" ]; then
++ echo proxy_auth_realm = "$proxy_auth_realm" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$proxy_auth_passwd" ]; then
++ echo proxy_auth_passwd = "$proxy_auth_passwd" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$proxy_auth_pwfile" ]; then
++ echo proxy_auth_pwfile = "$proxy_auth_pwfile" >> "$siproxd_conf_prefix$cfg"
++ fi
++ echo debug_level = "$debug_level" >> "$siproxd_conf_prefix$cfg"
++ echo debug_port = "$debug_port" >> "$siproxd_conf_prefix$cfg"
++ if [ -n "$mask_host" ]; then
++ echo mask_host = "$mask_host" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$masked_host" ]; then
++ echo masked_host = "$masked_host" >> "$siproxd_conf_prefix$cfg"
++ fi
++ echo ua_string = "$ua_string" >> "$siproxd_conf_prefix$cfg"
++ echo use_rport = "$use_rport" >> "$siproxd_conf_prefix$cfg"
++ if [ -n "$outbound_proxy_host" ]; then
++ echo outbound_proxy_host = "$outbound_proxy_host" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$outbound_proxy_port" ]; then
++ echo outbound_proxy_port = "$outbound_proxy_port" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$outbound_domain_name" ]; then
++ echo outbound_domain_name = "$outbound_domain_name" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$outbound_domain_host" ]; then
++ echo outbound_domain_host = "$outbound_domain_host" >> "$siproxd_conf_prefix$cfg"
++ fi
++ if [ -n "$outbound_domain_port" ]; then
++ echo outbound_domain_port = "$outbound_domain_port" >> "$siproxd_conf_prefix$cfg"
++ fi
++
++ # handle plugins
++ config_get plugindir "$cfg" plugindir "/usr/lib/siproxd/"
++ echo plugindir = "$plugindir" >> "$siproxd_conf_prefix$cfg"
++
++ config_list_foreach "$cfg" 'load_plugin' deal_with_lists "load_plugin"
++
++ # plugin_demo.so
++ config_get plugin_demo_string "$cfg" plugin_demo_string
++ if [ -n "$plugin_demo_string" ]; then
++ echo plugin_demo_string = "$plugin_demo_string" >> "$siproxd_conf_prefix$cfg"
++ fi
++
++ # plugin_shortdial.so
++ config_get plugin_shortdial_akey "$cfg" plugin_shortdial_akey
++ if [ -n "$plugin_shortdial_akey" ]; then
++ echo plugin_shortdial_akey = "$plugin_shortdial_akey" >> "$siproxd_conf_prefix$cfg"
++ fi
++ config_list_foreach "$cfg" 'plugin_shortdial_entry' deal_with_lists "plugin_shortdial_entry"
++
++ # plugin_defaulttarget.so
++ config_get_bool plugin_defaulttarget_log "$cfg" plugin_defaulttarget_log
++ if [ -n "$plugin_defaulttarget_log" ]; then
++ echo plugin_defaulttarget_log = "$plugin_defaulttarget_log" >> "$siproxd_conf_prefix$cfg"
++ fi
++ config_get plugin_defaulttarget_target "$cfg" plugin_defaulttarget_target
++ if [ -n "$plugin_defaulttarget_target" ]; then
++ echo plugin_defaulttarget_target = "$plugin_defaulttarget_target" >> "$siproxd_conf_prefix$cfg"
++ fi
++
++ # plugin_fix_bogus_via.so
++ config_get plugin_fix_bogus_via_networks "$cfg" plugin_fix_bogus_via_networks
++ if [ -n "$plugin_fix_bogus_via_networks" ]; then
++ echo plugin_fix_bogus_via_networks = "$plugin_fix_bogus_via_networks" >> "$siproxd_conf_prefix$cfg"
++ fi
++
++ # plugin_stun.so
++ config_get plugin_stun_server "$cfg" plugin_stun_server
++ if [ -n "$plugin_stun_server" ]; then
++ echo plugin_stun_server = "$plugin_stun_server" >> "$siproxd_conf_prefix$cfg"
++ fi
++ config_get plugin_stun_port "$cfg" plugin_stun_port
++ if [ -n "$plugin_stun_port" ]; then
++ echo plugin_stun_port = "$plugin_stun_port" >> "$siproxd_conf_prefix$cfg"
++ fi
++ config_get plugin_stun_period "$cfg" plugin_stun_period
++ if [ -n "$plugin_stun_period" ]; then
++ echo plugin_stun_period = "$plugin_stun_period" >> "$siproxd_conf_prefix$cfg"
++ fi
++
++ # plugin_prefix.so
++ config_get plugin_prefix_akey "$cfg" plugin_prefix_akey
++ if [ -n "$plugin_prefix_akey" ]; then
++ echo plugin_prefix_akey = "$plugin_prefix_akey" >> "$siproxd_conf_prefix$cfg"
++ fi
++
++ # plugin_regex.so
++ config_list_foreach "$cfg" 'plugin_regex_desc' deal_with_lists "plugin_regex_desc"
++ config_list_foreach "$cfg" 'plugin_regex_pattern' deal_with_lists "plugin_regex_pattern"
++ config_list_foreach "$cfg" 'plugin_regex_replace' deal_with_lists "plugin_regex_replace"
++
++ SERVICE_PID_FILE="$pid_file" \
++ service_start $siproxd_bin --config "$siproxd_conf_prefix$cfg"
++}
++
++stop_instance() {
++ local cfg="$1"
++
++ config_get pid_file "$cfg" pid_file "$siproxd_pid_dir/siproxd-$cfg.pid"
++
++ SERVICE_PID_FILE="$pid_file" \
++ service_stop $siproxd_bin
++}
++
++start() {
++ mkdir -m 0755 -p "$siproxd_conf_dir"
++ mkdir -m 0755 -p "$siproxd_registration_dir"
++ [ -d "$siproxd_pid_dir" ] || {
++ mkdir -m 0755 -p "$siproxd_pid_dir"
++ chmod 0750 "$siproxd_pid_dir"
++ chown nobody:nogroup "$siproxd_pid_dir"
++ }
++
++ config_load 'siproxd'
++ config_foreach start_instance 'siproxd'
++}
++
++stop() {
++ config_load 'siproxd'
++ config_foreach stop_instance 'siproxd'
++}
+diff --git a/feeds/telephony/net/siproxd/patches/010-fix-bogus-libltdl-dependency.patch b/feeds/telephony/net/siproxd/patches/010-fix-bogus-libltdl-dependency.patch
+new file mode 100644
+index 0000000..20f3b6b
+--- /dev/null
++++ b/feeds/telephony/net/siproxd/patches/010-fix-bogus-libltdl-dependency.patch
+@@ -0,0 +1,26 @@
++--- a/src/Makefile.am
+++++ b/src/Makefile.am
++@@ -77,8 +77,8 @@ plugin_regex_la_LDFLAGS = -module -avoid
++ # else Cygwin goes beserk when building...)
++ #
++ sbin_PROGRAMS = siproxd
++-siproxd_LDFLAGS=-export-dynamic
++-siproxd_LDADD = $(LIBLTDL) $(DLOPENPLUGINS)
+++siproxd_LDFLAGS=-export-dynamic -lltdl
+++siproxd_LDADD = $(DLOPENPLUGINS)
++ siproxd_SOURCES = siproxd.c proxy.c register.c sock.c utils.c \
++ sip_utils.c sip_layer.c log.c readconf.c rtpproxy.c \
++ rtpproxy_relay.c accessctl.c route_processing.c \
++--- a/src/Makefile.in
+++++ b/src/Makefile.in
++@@ -326,8 +326,8 @@ plugin_prefix_la_LDFLAGS = -module -avoi
++ #
++ plugin_regex_la_SOURCES = plugin_regex.c
++ plugin_regex_la_LDFLAGS = -module -avoid-version -shrext '.so'
++-siproxd_LDFLAGS = -export-dynamic
++-siproxd_LDADD = $(LIBLTDL) $(DLOPENPLUGINS)
+++siproxd_LDFLAGS = -export-dynamic -lltdl
+++siproxd_LDADD = $(DLOPENPLUGINS)
++ siproxd_SOURCES = siproxd.c proxy.c register.c sock.c utils.c \
++ sip_utils.c sip_layer.c log.c readconf.c rtpproxy.c \
++ rtpproxy_relay.c accessctl.c route_processing.c \
+diff --git a/feeds/telephony/net/siproxd/patches/011-include-sys-time.patch b/feeds/telephony/net/siproxd/patches/011-include-sys-time.patch
+new file mode 100644
+index 0000000..81fabda
+--- /dev/null
++++ b/feeds/telephony/net/siproxd/patches/011-include-sys-time.patch
+@@ -0,0 +1,10 @@
++--- siproxd-0.8.1/src/dejitter.c
+++++ siproxd-0.8.1/src/dejitter.c
++@@ -24,6 +24,7 @@
++
++ #include <sys/types.h>
++ #include <sys/socket.h>
+++#include <sys/time.h>
++ #include <netinet/in.h>
++
++ #include <osipparser2/osip_parser.h>
+diff --git a/feeds/telephony/net/siproxd/patches/100-musl-compat.patch b/feeds/telephony/net/siproxd/patches/100-musl-compat.patch
+new file mode 100644
+index 0000000..5e0c1da
+--- /dev/null
++++ b/feeds/telephony/net/siproxd/patches/100-musl-compat.patch
+@@ -0,0 +1,31 @@
++--- a/src/resolve.c
+++++ b/src/resolve.c
++@@ -30,6 +30,7 @@
++
++ #include <resolv.h>
++ #include <string.h>
+++#include <sys/types.h>
++
++ #include "log.h"
++
++--- a/src/dejitter.c
+++++ b/src/dejitter.c
++@@ -21,6 +21,7 @@
++ #include "config.h"
++
++ #include <errno.h>
+++#include <string.h>
++
++ #include <sys/types.h>
++ #include <sys/socket.h>
++--- a/src/plugins.c
+++++ b/src/plugins.c
++@@ -20,6 +20,8 @@
++
++ #include "config.h"
++
+++#include <string.h>
+++
++ #include <sys/types.h>
++ #include <netinet/in.h>
++ #include <arpa/inet.h>
+diff --git a/feeds/telephony/net/yate/Makefile b/feeds/telephony/net/yate/Makefile
+new file mode 100644
+index 0000000..f3b5384
+--- /dev/null
++++ b/feeds/telephony/net/yate/Makefile
+@@ -0,0 +1,283 @@
++#
++# Copyright (C) 2006-2014 OpenWrt.org
++# Copyright (C) 2006-2011 SMBPhone
++#
++# This is free software, licensed under the GNU General Public License v2.
++# See /LICENSE for more information.
++#
++
++include $(TOPDIR)/rules.mk
++
++RELEASEVER:=5.5.0
++
++PKG_NAME:=yate
++PKG_VERSION:=$(RELEASEVER)-1
++PKG_RELEASE:=1
++
++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
++PKG_SOURCE_URL:=http://yate.null.ro/tarballs/yate5/
++PKG_MD5SUM:=c433b3df08a5993e16fadaac279e39a0
++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
++
++PKG_LICENSE:=GPL-2.0
++PKG_LICENSE_FILES:=COPYING
++PKG_MAINTAINER:=Jiri Slachta <slachta@cesnet.cz>
++
++PKG_FIXUP:=autoreconf
++
++PKG_INSTALL:=1
++
++include $(INCLUDE_DIR)/uclibc++.mk
++include $(INCLUDE_DIR)/package.mk
++
++define Package/$(PKG_NAME)/Default
++ SUBMENU:=Telephony
++ SECTION:=net
++ CATEGORY:=Network
++ URL:=http://yate.null.ro/
++endef
++
++define Package/$(PKG_NAME)
++ $(call Package/yate/Default)
++ DEPENDS:=+libpthread $(CXX_DEPENDS)
++ TITLE:=Yet Another Telephony Engine
++ MENU:=1
++endef
++
++define Package/$(PKG_NAME)/conffiles
++/etc/yate/yate.conf
++/etc/init.d/yate
++endef
++
++define Package/$(PKG_NAME)/Default/description
++ Is a next-generation telephony engine focused on the VoIP and PSTN. It does
++ SIP, H.323, IAX, PSTN, and more.
++endef
++
++define Package/$(PKG_NAME)-scripts-perl
++ $(call Package/yate/Default)
++ DEPENDS += $(PKG_NAME) $(PKG_NAME)-mod-extmodule +perl
++ TITLE:= Perl module for Yate
++endef
++
++define Package/$(PKG_NAME)-sounds
++ $(call Package/yate/Default)
++ DEPENDS += $(PKG_NAME)
++ TITLE := Sounds for Yate
++endef
++
++define Package/$(PKG_NAME)-collection-basic
++ $(call Package/yate/Default)
++ DEPENDS += $(PKG_NAME) \
++ +$(PKG_NAME)-sounds \
++ +$(PKG_NAME)-mod-dumbchan \
++ +$(PKG_NAME)-mod-regfile \
++ +$(PKG_NAME)-mod-regexroute \
++ +$(PKG_NAME)-mod-rmanager \
++ +$(PKG_NAME)-mod-tonegen \
++ +$(PKG_NAME)-mod-yrtpchan \
++ +$(PKG_NAME)-mod-ysipchan
++ TITLE := Basic Yate Server
++endef
++
++ifneq ($(CONFIG_USE_MUSL),)
++ LIBNSL:=
++else
++ LIBNSL:=-lnsl
++endif
++
++TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include $(if $(CONFIG_BIG_ENDIAN),-DBIGENDIAN,)
++
++CONFIGURE_ARGS+= \
++ --enable-strings \
++ --enable-poll \
++ --enable-inline \
++ --enable-atomics \
++ --disable-sse2 \
++ --disable-sctp \
++ --enable-resolver \
++ --enable-internalregex \
++ --disable-dahdi \
++ --disable-zaptel \
++ --disable-wpcard \
++ --disable-tdmcard \
++ --disable-wanpipe \
++ --enable-ilbc \
++ --enable-ilbc-webrtc \
++ --enable-isac-float \
++ --disable-isac-fixed \
++ --enable-rtti \
++ --with-libpq="$(STAGING_DIR)/usr" \
++ --with-mysql="$(STAGING_DIR)/usr" \
++ --without-wphwec \
++ --without-libgsm \
++ --with-libspeex="$(STAGING_DIR)/usr/include" \
++ --without-amrnb \
++ --with-spandsp="$(STAGING_DIR)/usr/include" \
++ --without-pwlib \
++ --without-openh323 \
++ --with-openssl \
++ --with-zlib="$(STAGING_DIR)/usr" \
++ --without-libqt4 \
++ --without-qtstatic \
++ --without-coredumper \
++ --without-doxygen \
++ --without-kdoc
++
++CONFIGURE_VARS+= \
++ LDFLAGS="$$$$LDFLAGS -nodefaultlibs" \
++ LIBS="-lc -luClibc++ -lpthread -lresolv -ldl -lm -lc $(LIBGCC_S) $(LIBNSL)"
++
++define Package/$(PKG_NAME)/install
++ $(INSTALL_DIR) $(1)/usr/lib
++
++ for yatelib in "" asn sig mgcp jabber script; do \
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/libyate$$$${yatelib}.so.$(RELEASEVER) $(1)/usr/lib ;\
++ $(LN) ./libyate$$$${yatelib}.so.$(RELEASEVER) $(1)/usr/lib/libyate$$$${yatelib}.so ;\
++ done
++
++ $(INSTALL_DIR) $(1)/usr/bin
++ $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/yate $(1)/usr/bin/
++ $(INSTALL_DIR) $(1)/etc/$(PKG_NAME)
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/yate/yate.conf $(1)/etc/$(PKG_NAME)/yate.conf
++ $(INSTALL_DIR) $(1)/etc/init.d
++ $(INSTALL_BIN) ./files/yate.init $(1)/etc/init.d/yate
++endef
++
++define Package/$(PKG_NAME)-scripts-perl/install
++ $(INSTALL_DIR) $(1)/usr/share/yate/scripts
++ $(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/yate/scripts/Yate.pm $(1)/usr/share/yate/scripts/
++endef
++
++define Package/$(PKG_NAME)-sounds/install
++ $(INSTALL_DIR) $(1)/usr/share/yate/sounds
++ $(CP) $(PKG_INSTALL_DIR)/usr/share/yate/sounds/ $(1)/usr/share/yate/
++endef
++
++define Package/$(PKG_NAME)-collection-basic/install
++endef
++
++define Build/InstallDev
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/include
++ $(CP) $(PKG_INSTALL_DIR)/usr/include/* $(STAGING_DIR)/usr/include/
++ $(INSTALL_DIR) $(STAGING_DIR)/usr/lib
++ $(CP) $(PKG_INSTALL_DIR)/usr/lib/* $(STAGING_DIR)/usr/lib/
++endef
++
++define BuildPlugin
++ define Package/$(PKG_NAME)-mod-$(1)
++ $(call Package/yate/Default)
++ DEPENDS:= $(PKG_NAME) $(4)
++ TITLE:=$(3)
++ endef
++
++ $(if $(PKG_BUILD_DIR)/conf.d/$(1).conf.sample,
++ define Package/$(PKG_NAME)-mod-$(1)/conffiles
++ /etc/yate/$(1).conf
++ endef
++ ,)
++
++ define Package/$(PKG_NAME)-mod-$(1)/description
++ $(3) module for $(PKG_NAME)
++ endef
++
++ define Package/$(PKG_NAME)-mod-$(1)/install
++ $$(INSTALL_DIR) $$(1)/usr/lib/yate/$(2)
++ $$(INSTALL_BIN) $$(PKG_INSTALL_DIR)/usr/lib/yate/$(2)/$(1).yate $$(1)/usr/lib/yate/$(2)/$(1).yate
++ if [ -f $$(PKG_INSTALL_DIR)/etc/yate/$(1).conf ]; then \
++ $$(INSTALL_DIR) $$(1)/etc/yate ;\
++ $$(INSTALL_DATA) $$(PKG_INSTALL_DIR)/etc/yate/$(1).conf $$(1)/etc/yate/ ;\
++ fi
++ $(if $(5),$(foreach extra_file,$(5),\
++ $(INSTALL_DIR) $$(1)$(dir $(extra_file)) ; \
++ $(CP) $(PKG_INSTALL_DIR)$(extra_file) $$(1)$(extra_file) ; \
++ ),)
++ endef
++
++ $$(eval $$(call BuildPackage,$(PKG_NAME)-mod-$(1)))
++endef
++
++$(eval $(call BuildPackage,$(PKG_NAME)))
++$(eval $(call BuildPackage,$(PKG_NAME)-collection-basic))
++$(eval $(call BuildPackage,$(PKG_NAME)-scripts-perl))
++$(eval $(call BuildPackage,$(PKG_NAME)-sounds))
++$(eval $(call BuildPlugin,accfile,server,SIP or H.323 client (from file),))
++$(eval $(call BuildPlugin,alsachan,client,ALSA Sound Channel,+alsa-lib))
++$(eval $(call BuildPlugin,amrnbcodec,,AMR-NB Codec,@BROKEN)) # Missing amr-nb library
++$(eval $(call BuildPlugin,analog,server,Analog (e.g. POTS) Channel,))
++$(eval $(call BuildPlugin,analogdetect,server,Analog Data Detector,))
++$(eval $(call BuildPlugin,analyzer,,Test Call Generator and AQ Analyzer,))
++$(eval $(call BuildPlugin,cache,server,CNAM and LNP memory caches,))
++$(eval $(call BuildPlugin,callcounters,server,Count Active Call Legs,))
++$(eval $(call BuildPlugin,callfork,,Call Forker,))
++$(eval $(call BuildPlugin,callgen,,Call Generator,))
++$(eval $(call BuildPlugin,ccongestion,server,Accept Status from Installed Engine Monitors,))
++$(eval $(call BuildPlugin,cdrbuild,,Call Detail Record Builder,))
++$(eval $(call BuildPlugin,cdrcombine,,Call Detail Records per call instead of per call leg,))
++$(eval $(call BuildPlugin,cdrfile,,Call Detail Record to File,))
++$(eval $(call BuildPlugin,ciscosm,server,SS7 Support,))
++$(eval $(call BuildPlugin,clustering,server,Clustering Server Support,))
++$(eval $(call BuildPlugin,conference,,Conference Room Mixer,))
++$(eval $(call BuildPlugin,cpuload,server,Monitor CPU load and Inform Yate,))
++$(eval $(call BuildPlugin,dbpbx,server,PBX IVR and Multi-routing from Database,))
++$(eval $(call BuildPlugin,dbwave,server,Wav Media for DB Storage,+$(PKG_NAME)-mod-wavefile))
++$(eval $(call BuildPlugin,dumbchan,,Dummy Channel,))
++$(eval $(call BuildPlugin,enumroute,,ENUM Routing,))
++$(eval $(call BuildPlugin,eventlogs,server,Write events and alarms to log files,))
++$(eval $(call BuildPlugin,extmodule,,External Module Handler,))
++$(eval $(call BuildPlugin,faxchan,,Spandsp Fax Channel,+libspandsp))
++$(eval $(call BuildPlugin,filetransfer,,File Transfer Driver,))
++$(eval $(call BuildPlugin,gvoice,,Google Voice support,))
++$(eval $(call BuildPlugin,heartbeat,server,Linux-HA compatible heartbeat,))
++$(eval $(call BuildPlugin,ilbccodec,,iLBC Codec,))
++$(eval $(call BuildPlugin,ilbcwebrtc,,iLBC Codec from the WebRTC project,))
++$(eval $(call BuildPlugin,isaccodec,,internet Speech Audio Codec,))
++$(eval $(call BuildPlugin,isupmangler,sig,ISUP parameter mangling in a STP,))
++$(eval $(call BuildPlugin,jabberclient,client,Jabber Client,))
++$(eval $(call BuildPlugin,jabberserver,jabber,Jabber Server,))
++$(eval $(call BuildPlugin,javascript,,Routing using the embedded Javascript language,))
++$(eval $(call BuildPlugin,jbfeatures,jabber,Jabber Server Features,))
++$(eval $(call BuildPlugin,lateroute,server,Last Chance Routing,))
++$(eval $(call BuildPlugin,mgcpca,server,Media Gateway Control Protocol Agent,))
++$(eval $(call BuildPlugin,mgcpgw,server,Media Gateway Control Protocol Gateway,))
++$(eval $(call BuildPlugin,moh,,On Hold (music) Generator,))
++$(eval $(call BuildPlugin,monitoring,server,Monitoring/gathering Information,))
++$(eval $(call BuildPlugin,mrcpspeech,server,MRCP v2 Voice/Tone Detector and Synthesizer,))
++$(eval $(call BuildPlugin,msgsniff,,Sample Message Sniffer,))
++$(eval $(call BuildPlugin,mux,,Data Multiplexor,))
++$(eval $(call BuildPlugin,mysqldb,server,MySQL Backend DB,+libmysqlclient-r))
++$(eval $(call BuildPlugin,openssl,,Encrypted transport (OpenSSL),+libopenssl))
++$(eval $(call BuildPlugin,osschan,client,OSS Sound Channel,))
++$(eval $(call BuildPlugin,park,server,Call Parking,))
++$(eval $(call BuildPlugin,pbx,,PBX Message Handlers,))
++$(eval $(call BuildPlugin,pbxassist,server,Full featured PBX and IVR,))
++$(eval $(call BuildPlugin,pgsqldb,server,PostgrestSQL Backend DB,+libpq))
++$(eval $(call BuildPlugin,presence,server,Presence,))
++$(eval $(call BuildPlugin,queues,server,Call Distribution and Queues from Database,))
++$(eval $(call BuildPlugin,queuesnotify,server,Notify when queued call status changes,))
++$(eval $(call BuildPlugin,regexroute,,Regular Expression Based Routing,))
++$(eval $(call BuildPlugin,regfile,server,Registration based on users in file,))
++$(eval $(call BuildPlugin,register,server,Call Detail Record to a database,))
++$(eval $(call BuildPlugin,rmanager,,Yate Remote Management,))
++$(eval $(call BuildPlugin,sigtransport,server,SIGTRAN (SS7 over IP) connection provider,))
++$(eval $(call BuildPlugin,sip_cnam_lnp,sip,Query CNAM and LNP databases using SIP INVITE,))
++$(eval $(call BuildPlugin,sipfeatures,server,SIP Features (SUBSCRIBE/NOTIFY),))
++$(eval $(call BuildPlugin,speexcodec,,Speex Codec,+libspeex))
++$(eval $(call BuildPlugin,subscription,server,Subcription handler and presence notifier,))
++$(eval $(call BuildPlugin,tdmcard,server,TDM Cards Signalling and Data Driver,@BROKEN)) # Missing TDM libraries
++$(eval $(call BuildPlugin,tonedetect,,Detectors for Various Tones,))
++$(eval $(call BuildPlugin,tonegen,,Tones Generator,))
++$(eval $(call BuildPlugin,users,server,Users,))
++$(eval $(call BuildPlugin,wavefile,,Wav file Record and Playback,))
++$(eval $(call BuildPlugin,wpcard,server,Wanpipe PRI cards Signalling and Data Driver,@BROKEN)) # Mising wanpipe and PRI libraries
++$(eval $(call BuildPlugin,yiaxchan,,IAX Channel,))
++$(eval $(call BuildPlugin,yjinglechan,,Jingle Channel,))
++$(eval $(call BuildPlugin,yradius,server,RADIUS Client,))
++$(eval $(call BuildPlugin,yrtpchan,,RTP Channel and Other Data Helper,))
++$(eval $(call BuildPlugin,ysigchan,server,SS7/ISDN Protocols - Yate Signalling Library,))
++$(eval $(call BuildPlugin,ysipchan,,SIP Channel,))
++$(eval $(call BuildPlugin,ysnmpagent,server,SNMP Protocol Agent,,/usr/share/yate/data/NULL-TEAM-MIB.txt /usr/share/yate/data/snmp_mib.conf /usr/share/yate/data/YATE-MIB.txt))
++$(eval $(call BuildPlugin,ysockschan,,SOCKS Channel,))
++$(eval $(call BuildPlugin,ystunchan,,STUN Support,))
++$(eval $(call BuildPlugin,zlibcompress,,Zlib Compression,+zlib))
++
+diff --git a/feeds/telephony/net/yate/files/yate.init b/feeds/telephony/net/yate/files/yate.init
+new file mode 100644
+index 0000000..4fe8c58
+--- /dev/null
++++ b/feeds/telephony/net/yate/files/yate.init
+@@ -0,0 +1,25 @@
++#!/bin/sh /etc/rc.common
++# Copyright (C) 2013 OpenWrt.org
++START=50
++
++SERVICE_USE_PID=1
++
++YATE_BINARY="/usr/bin/yate"
++YATE_LOG_FILE=""
++YATE_OPTIONS="-d -s -p /var/run/yate.pid"
++
++start() {
++ if [ -n "$YATE_LOG_FILE" ]; then
++ YATE_OPTIONS="$YATE_OPTIONS -r -l $YATE_LOG_FILE"
++ fi
++
++ service_start $YATE_BINARY $YATE_OPTIONS
++}
++
++stop() {
++ service_stop $YATE_BINARY
++}
++
++reload() {
++ service_reload $YATE_BINARY
++}
+diff --git a/feeds/telephony/net/yate/patches/100-non-gnu-mutex-type.patch b/feeds/telephony/net/yate/patches/100-non-gnu-mutex-type.patch
+new file mode 100644
+index 0000000..af5d8b2
+--- /dev/null
++++ b/feeds/telephony/net/yate/patches/100-non-gnu-mutex-type.patch
+@@ -0,0 +1,28 @@
++Index: yate/engine/Mutex.cpp
++===================================================================
++--- yate.orig/engine/Mutex.cpp
+++++ yate/engine/Mutex.cpp
++@@ -30,6 +30,10 @@ typedef HANDLE HSEMAPHORE;
++ #include <semaphore.h>
++ #include <time.h>
++
+++#ifndef PTHREAD_MUTEX_RECURSIVE_NP
+++#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
+++#endif
+++
++ #ifdef MUTEX_HACK
++ extern "C" {
++ #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
++Index: yate/configure.ac
++===================================================================
++--- yate.orig/configure.ac
+++++ yate/configure.ac
++@@ -257,7 +257,7 @@ AC_TRY_COMPILE([
++ #include <pthread.h>
++ ],[
++ pthread_mutexattr_t attr;
++-pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
+++pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE);
++ ],
++ have_mutex_settype="yes",
++ have_mutex_settype="no"
+diff --git a/feeds/telephony/net/yate/patches/110-no-libnsl.patch b/feeds/telephony/net/yate/patches/110-no-libnsl.patch
+new file mode 100644
+index 0000000..1a1660a
+--- /dev/null
++++ b/feeds/telephony/net/yate/patches/110-no-libnsl.patch
+@@ -0,0 +1,13 @@
++Index: yate/configure.ac
++===================================================================
++--- yate.orig/configure.ac
+++++ yate/configure.ac
++@@ -689,7 +689,7 @@ if [[ "x$local_lib" != "xlib" -a ! -d "$
++ fi
++ if [[ -f "$ac_cv_use_mysql/include/mysql/mysql.h" -a -d "$ac_cv_use_mysql/$local_lib/mysql" ]]; then
++ MYSQL_INC="-I$ac_cv_use_mysql/include/mysql"
++-MYSQL_LIB="-L$ac_cv_use_mysql/$local_lib/mysql -lmysqlclient_r -lpthread -lz -lcrypt -lnsl -lm"
+++MYSQL_LIB="-L$ac_cv_use_mysql/$local_lib/mysql -lmysqlclient_r -lpthread -lz -lcrypt -lm"
++ MYSQL_VER=`sed -n 's/^.*MYSQL_SERVER_VERSION[[^"]]*"\([[^"]]*\).*$/\1/p' "$ac_cv_use_mysql/include/mysql/mysql_version.h"`
++ HAVE_MYSQL=yes
++ fi